summaryrefslogtreecommitdiffstats
path: root/dom/media
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media')
-rw-r--r--dom/media/ADTSDecoder.cpp52
-rw-r--r--dom/media/ADTSDecoder.h30
-rw-r--r--dom/media/ADTSDemuxer.cpp845
-rw-r--r--dom/media/ADTSDemuxer.h139
-rw-r--r--dom/media/AbstractMediaDecoder.h145
-rw-r--r--dom/media/AccurateSeekTask.cpp470
-rw-r--r--dom/media/AccurateSeekTask.h88
-rw-r--r--dom/media/AudioBufferUtils.h166
-rw-r--r--dom/media/AudioCaptureStream.cpp169
-rw-r--r--dom/media/AudioCaptureStream.h44
-rw-r--r--dom/media/AudioChannelFormat.cpp18
-rw-r--r--dom/media/AudioChannelFormat.h248
-rw-r--r--dom/media/AudioCompactor.cpp73
-rw-r--r--dom/media/AudioCompactor.h138
-rw-r--r--dom/media/AudioConverter.cpp393
-rw-r--r--dom/media/AudioConverter.h240
-rw-r--r--dom/media/AudioMixer.h153
-rw-r--r--dom/media/AudioPacketizer.h196
-rw-r--r--dom/media/AudioSampleFormat.h259
-rw-r--r--dom/media/AudioSegment.cpp215
-rw-r--r--dom/media/AudioSegment.h429
-rw-r--r--dom/media/AudioStream.cpp707
-rw-r--r--dom/media/AudioStream.h308
-rw-r--r--dom/media/AudioStreamTrack.cpp20
-rw-r--r--dom/media/AudioStreamTrack.h47
-rw-r--r--dom/media/AudioTrack.cpp69
-rw-r--r--dom/media/AudioTrack.h48
-rw-r--r--dom/media/AudioTrackList.cpp41
-rw-r--r--dom/media/AudioTrackList.h40
-rw-r--r--dom/media/Benchmark.cpp332
-rw-r--r--dom/media/Benchmark.h113
-rw-r--r--dom/media/BufferMediaResource.h141
-rw-r--r--dom/media/CanvasCaptureMediaStream.cpp298
-rw-r--r--dom/media/CanvasCaptureMediaStream.h141
-rw-r--r--dom/media/CubebUtils.cpp386
-rw-r--r--dom/media/CubebUtils.h51
-rw-r--r--dom/media/DOMMediaStream.cpp1678
-rw-r--r--dom/media/DOMMediaStream.h868
-rw-r--r--dom/media/DecoderDoctorDiagnostics.cpp881
-rw-r--r--dom/media/DecoderDoctorDiagnostics.h137
-rw-r--r--dom/media/DecoderTraits.cpp532
-rw-r--r--dom/media/DecoderTraits.h68
-rw-r--r--dom/media/EncodedBufferCache.cpp91
-rw-r--r--dom/media/EncodedBufferCache.h63
-rw-r--r--dom/media/FileBlockCache.cpp365
-rw-r--r--dom/media/FileBlockCache.h184
-rw-r--r--dom/media/FrameStatistics.h143
-rw-r--r--dom/media/GetUserMediaRequest.cpp74
-rw-r--r--dom/media/GetUserMediaRequest.h52
-rw-r--r--dom/media/GraphDriver.cpp1217
-rw-r--r--dom/media/GraphDriver.h583
-rw-r--r--dom/media/IdpSandbox.jsm271
-rw-r--r--dom/media/Intervals.h758
-rw-r--r--dom/media/Latency.cpp223
-rw-r--r--dom/media/Latency.h99
-rw-r--r--dom/media/MP3Decoder.cpp50
-rw-r--r--dom/media/MP3Decoder.h29
-rw-r--r--dom/media/MP3Demuxer.cpp1342
-rw-r--r--dom/media/MP3Demuxer.h474
-rw-r--r--dom/media/MP3FrameParser.cpp591
-rw-r--r--dom/media/MP3FrameParser.h219
-rw-r--r--dom/media/MediaCache.cpp2472
-rw-r--r--dom/media/MediaCache.h519
-rw-r--r--dom/media/MediaContentType.cpp60
-rw-r--r--dom/media/MediaContentType.h60
-rw-r--r--dom/media/MediaData.cpp475
-rw-r--r--dom/media/MediaData.h677
-rw-r--r--dom/media/MediaDataDemuxer.h214
-rw-r--r--dom/media/MediaDecoder.cpp1803
-rw-r--r--dom/media/MediaDecoder.h861
-rw-r--r--dom/media/MediaDecoderOwner.h156
-rw-r--r--dom/media/MediaDecoderReader.cpp376
-rw-r--r--dom/media/MediaDecoderReader.h445
-rw-r--r--dom/media/MediaDecoderReaderWrapper.cpp422
-rw-r--r--dom/media/MediaDecoderReaderWrapper.h143
-rw-r--r--dom/media/MediaDecoderStateMachine.cpp3344
-rw-r--r--dom/media/MediaDecoderStateMachine.h860
-rw-r--r--dom/media/MediaDeviceInfo.cpp67
-rw-r--r--dom/media/MediaDeviceInfo.h57
-rw-r--r--dom/media/MediaDevices.cpp300
-rw-r--r--dom/media/MediaDevices.h79
-rw-r--r--dom/media/MediaEventSource.h618
-rw-r--r--dom/media/MediaFormatReader.cpp2372
-rw-r--r--dom/media/MediaFormatReader.h601
-rw-r--r--dom/media/MediaInfo.cpp190
-rw-r--r--dom/media/MediaInfo.h725
-rw-r--r--dom/media/MediaManager.cpp3667
-rw-r--r--dom/media/MediaManager.h341
-rw-r--r--dom/media/MediaMetadataManager.h104
-rw-r--r--dom/media/MediaPermissionGonk.cpp522
-rw-r--r--dom/media/MediaPermissionGonk.h39
-rw-r--r--dom/media/MediaPrefs.cpp79
-rw-r--r--dom/media/MediaPrefs.h205
-rw-r--r--dom/media/MediaQueue.h184
-rw-r--r--dom/media/MediaRecorder.cpp1535
-rw-r--r--dom/media/MediaRecorder.h171
-rw-r--r--dom/media/MediaResource.cpp1648
-rw-r--r--dom/media/MediaResource.h820
-rw-r--r--dom/media/MediaResourceCallback.h69
-rw-r--r--dom/media/MediaResult.h65
-rw-r--r--dom/media/MediaSegment.h508
-rw-r--r--dom/media/MediaShutdownManager.cpp166
-rw-r--r--dom/media/MediaShutdownManager.h90
-rw-r--r--dom/media/MediaStatistics.h82
-rw-r--r--dom/media/MediaStreamError.cpp87
-rw-r--r--dom/media/MediaStreamError.h99
-rw-r--r--dom/media/MediaStreamGraph.cpp4007
-rw-r--r--dom/media/MediaStreamGraph.h1407
-rw-r--r--dom/media/MediaStreamGraphImpl.h863
-rw-r--r--dom/media/MediaStreamListener.cpp116
-rw-r--r--dom/media/MediaStreamListener.h293
-rw-r--r--dom/media/MediaStreamTrack.cpp562
-rw-r--r--dom/media/MediaStreamTrack.h481
-rw-r--r--dom/media/MediaStreamVideoSink.cpp21
-rw-r--r--dom/media/MediaStreamVideoSink.h44
-rw-r--r--dom/media/MediaTimer.cpp184
-rw-r--r--dom/media/MediaTimer.h170
-rw-r--r--dom/media/MediaTrack.cpp51
-rw-r--r--dom/media/MediaTrack.h104
-rw-r--r--dom/media/MediaTrackList.cpp167
-rw-r--r--dom/media/MediaTrackList.h116
-rw-r--r--dom/media/NextFrameSeekTask.cpp342
-rw-r--r--dom/media/NextFrameSeekTask.h95
-rw-r--r--dom/media/PeerConnection.js1680
-rw-r--r--dom/media/PeerConnection.manifest23
-rw-r--r--dom/media/PeerConnectionIdp.jsm341
-rw-r--r--dom/media/PrincipalChangeObserver.h30
-rw-r--r--dom/media/QueueObject.cpp41
-rw-r--r--dom/media/QueueObject.h33
-rw-r--r--dom/media/RTCStatsReport.jsm28
-rw-r--r--dom/media/SeekJob.cpp56
-rw-r--r--dom/media/SeekJob.h38
-rw-r--r--dom/media/SeekTarget.h104
-rw-r--r--dom/media/SeekTask.cpp81
-rw-r--r--dom/media/SeekTask.h104
-rw-r--r--dom/media/SelfRef.h48
-rw-r--r--dom/media/SharedBuffer.h80
-rw-r--r--dom/media/SimpleImageBuffer.cpp53
-rw-r--r--dom/media/SimpleImageBuffer.h50
-rw-r--r--dom/media/StreamTracks.cpp117
-rw-r--r--dom/media/StreamTracks.h348
-rw-r--r--dom/media/TextTrack.cpp341
-rw-r--r--dom/media/TextTrack.h147
-rw-r--r--dom/media/TextTrackCue.cpp256
-rw-r--r--dom/media/TextTrackCue.h418
-rw-r--r--dom/media/TextTrackCueList.cpp173
-rw-r--r--dom/media/TextTrackCueList.h84
-rw-r--r--dom/media/TextTrackList.cpp236
-rw-r--r--dom/media/TextTrackList.h85
-rw-r--r--dom/media/TextTrackRegion.cpp65
-rw-r--r--dom/media/TextTrackRegion.h172
-rw-r--r--dom/media/ThreadPoolCOMListener.cpp30
-rw-r--r--dom/media/ThreadPoolCOMListener.h28
-rw-r--r--dom/media/TimeUnits.h310
-rw-r--r--dom/media/TrackUnionStream.cpp481
-rw-r--r--dom/media/TrackUnionStream.h94
-rw-r--r--dom/media/VideoFrameContainer.cpp359
-rw-r--r--dom/media/VideoFrameContainer.h147
-rw-r--r--dom/media/VideoLimits.h21
-rw-r--r--dom/media/VideoPlaybackQuality.cpp48
-rw-r--r--dom/media/VideoPlaybackQuality.h67
-rw-r--r--dom/media/VideoSegment.cpp121
-rw-r--r--dom/media/VideoSegment.h152
-rw-r--r--dom/media/VideoStreamTrack.cpp35
-rw-r--r--dom/media/VideoStreamTrack.h53
-rw-r--r--dom/media/VideoTrack.cpp103
-rw-r--r--dom/media/VideoTrack.h70
-rw-r--r--dom/media/VideoTrackList.cpp92
-rw-r--r--dom/media/VideoTrackList.h59
-rw-r--r--dom/media/VideoUtils.cpp526
-rw-r--r--dom/media/VideoUtils.h474
-rw-r--r--dom/media/VorbisUtils.h27
-rw-r--r--dom/media/WebMSample.h22783
-rw-r--r--dom/media/WebVTTListener.cpp191
-rw-r--r--dom/media/WebVTTListener.h64
-rw-r--r--dom/media/XiphExtradata.cpp80
-rw-r--r--dom/media/XiphExtradata.h28
-rw-r--r--dom/media/android/AndroidMediaDecoder.cpp25
-rw-r--r--dom/media/android/AndroidMediaDecoder.h28
-rw-r--r--dom/media/android/AndroidMediaPluginHost.cpp311
-rw-r--r--dom/media/android/AndroidMediaPluginHost.h41
-rw-r--r--dom/media/android/AndroidMediaReader.cpp449
-rw-r--r--dom/media/android/AndroidMediaReader.h75
-rw-r--r--dom/media/android/AndroidMediaResourceServer.cpp503
-rw-r--r--dom/media/android/AndroidMediaResourceServer.h96
-rw-r--r--dom/media/android/MPAPI.h165
-rw-r--r--dom/media/android/moz.build27
-rwxr-xr-xdom/media/benchmark/sample7
-rw-r--r--dom/media/bridge/IPeerConnection.idl71
-rw-r--r--dom/media/bridge/MediaModule.cpp57
-rw-r--r--dom/media/bridge/moz.build31
-rw-r--r--dom/media/directshow/AudioSinkFilter.cpp285
-rw-r--r--dom/media/directshow/AudioSinkFilter.h95
-rw-r--r--dom/media/directshow/AudioSinkInputPin.cpp195
-rw-r--r--dom/media/directshow/AudioSinkInputPin.h76
-rw-r--r--dom/media/directshow/DirectShowDecoder.cpp65
-rw-r--r--dom/media/directshow/DirectShowDecoder.h45
-rw-r--r--dom/media/directshow/DirectShowReader.cpp360
-rw-r--r--dom/media/directshow/DirectShowReader.h110
-rw-r--r--dom/media/directshow/DirectShowUtils.cpp369
-rw-r--r--dom/media/directshow/DirectShowUtils.h125
-rw-r--r--dom/media/directshow/SampleSink.cpp159
-rw-r--r--dom/media/directshow/SampleSink.h67
-rw-r--r--dom/media/directshow/SourceFilter.cpp683
-rw-r--r--dom/media/directshow/SourceFilter.h75
-rw-r--r--dom/media/directshow/moz.build41
-rw-r--r--dom/media/eme/CDMCaps.cpp170
-rw-r--r--dom/media/eme/CDMCaps.h113
-rw-r--r--dom/media/eme/CDMProxy.h279
-rw-r--r--dom/media/eme/DecryptorProxyCallback.h54
-rw-r--r--dom/media/eme/DetailedPromise.cpp105
-rw-r--r--dom/media/eme/DetailedPromise.h73
-rw-r--r--dom/media/eme/EMEUtils.cpp97
-rw-r--r--dom/media/eme/EMEUtils.h107
-rw-r--r--dom/media/eme/MediaEncryptedEvent.cpp129
-rw-r--r--dom/media/eme/MediaEncryptedEvent.h67
-rw-r--r--dom/media/eme/MediaKeyError.cpp39
-rw-r--r--dom/media/eme/MediaKeyError.h38
-rw-r--r--dom/media/eme/MediaKeyMessageEvent.cpp122
-rw-r--r--dom/media/eme/MediaKeyMessageEvent.h67
-rw-r--r--dom/media/eme/MediaKeySession.cpp674
-rw-r--r--dom/media/eme/MediaKeySession.h137
-rw-r--r--dom/media/eme/MediaKeyStatusMap.cpp121
-rw-r--r--dom/media/eme/MediaKeyStatusMap.h97
-rw-r--r--dom/media/eme/MediaKeySystemAccess.cpp1135
-rw-r--r--dom/media/eme/MediaKeySystemAccess.h81
-rw-r--r--dom/media/eme/MediaKeySystemAccessManager.cpp340
-rw-r--r--dom/media/eme/MediaKeySystemAccessManager.h83
-rw-r--r--dom/media/eme/MediaKeys.cpp593
-rw-r--r--dom/media/eme/MediaKeys.h168
-rw-r--r--dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.cpp140
-rw-r--r--dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.h69
-rw-r--r--dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp467
-rw-r--r--dom/media/eme/mediadrm/MediaDrmCDMProxy.h184
-rw-r--r--dom/media/eme/mediadrm/MediaDrmProxySupport.cpp284
-rw-r--r--dom/media/eme/mediadrm/MediaDrmProxySupport.h67
-rw-r--r--dom/media/eme/mediadrm/moz.build19
-rw-r--r--dom/media/eme/moz.build45
-rw-r--r--dom/media/encoder/ContainerWriter.h78
-rw-r--r--dom/media/encoder/EncodedFrameContainer.h109
-rw-r--r--dom/media/encoder/MediaEncoder.cpp404
-rw-r--r--dom/media/encoder/MediaEncoder.h258
-rw-r--r--dom/media/encoder/OpusTrackEncoder.cpp462
-rw-r--r--dom/media/encoder/OpusTrackEncoder.h91
-rw-r--r--dom/media/encoder/TrackEncoder.cpp342
-rw-r--r--dom/media/encoder/TrackEncoder.h364
-rw-r--r--dom/media/encoder/TrackMetadataBase.h76
-rw-r--r--dom/media/encoder/VP8TrackEncoder.cpp678
-rw-r--r--dom/media/encoder/VP8TrackEncoder.h99
-rw-r--r--dom/media/encoder/fmp4_muxer/AMRBox.cpp84
-rw-r--r--dom/media/encoder/fmp4_muxer/AMRBox.h50
-rw-r--r--dom/media/encoder/fmp4_muxer/AVCBox.cpp87
-rw-r--r--dom/media/encoder/fmp4_muxer/AVCBox.h59
-rw-r--r--dom/media/encoder/fmp4_muxer/EVRCBox.cpp84
-rw-r--r--dom/media/encoder/fmp4_muxer/EVRCBox.h50
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOControl.cpp415
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOControl.h250
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp1550
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOMediaBoxes.h781
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOMediaWriter.cpp234
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOMediaWriter.h108
-rw-r--r--dom/media/encoder/fmp4_muxer/ISOTrackMetadata.h131
-rw-r--r--dom/media/encoder/fmp4_muxer/MP4ESDS.cpp138
-rw-r--r--dom/media/encoder/fmp4_muxer/MP4ESDS.h87
-rw-r--r--dom/media/encoder/fmp4_muxer/MuxerOperation.h57
-rw-r--r--dom/media/encoder/fmp4_muxer/moz.build22
-rw-r--r--dom/media/encoder/moz.build56
-rw-r--r--dom/media/flac/FlacDecoder.cpp52
-rw-r--r--dom/media/flac/FlacDecoder.h30
-rw-r--r--dom/media/flac/FlacDemuxer.cpp1074
-rw-r--r--dom/media/flac/FlacDemuxer.h108
-rw-r--r--dom/media/flac/FlacFrameParser.cpp251
-rw-r--r--dom/media/flac/FlacFrameParser.h64
-rw-r--r--dom/media/flac/moz.build24
-rw-r--r--dom/media/fmp4/MP4Decoder.cpp307
-rw-r--r--dom/media/fmp4/MP4Decoder.h62
-rw-r--r--dom/media/fmp4/MP4Demuxer.cpp502
-rw-r--r--dom/media/fmp4/MP4Demuxer.h58
-rw-r--r--dom/media/fmp4/MP4Stream.cpp103
-rw-r--r--dom/media/fmp4/MP4Stream.h107
-rw-r--r--dom/media/fmp4/moz.build25
-rw-r--r--dom/media/gmp-plugin-openh264/fakeopenh264.info4
-rw-r--r--dom/media/gmp-plugin-openh264/fakeopenh264.voucher1
-rw-r--r--dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp429
-rw-r--r--dom/media/gmp-plugin-openh264/moz.build30
-rw-r--r--dom/media/gmp-plugin/fake.info5
-rw-r--r--dom/media/gmp-plugin/fake.voucher1
-rw-r--r--dom/media/gmp-plugin/gmp-fake.cpp98
-rw-r--r--dom/media/gmp-plugin/gmp-test-decryptor.cpp608
-rw-r--r--dom/media/gmp-plugin/gmp-test-decryptor.h102
-rw-r--r--dom/media/gmp-plugin/gmp-test-output-protection.h130
-rw-r--r--dom/media/gmp-plugin/gmp-test-storage.cpp233
-rw-r--r--dom/media/gmp-plugin/gmp-test-storage.h63
-rw-r--r--dom/media/gmp-plugin/moz.build32
-rw-r--r--dom/media/gmp/GMPAudioDecoderChild.cpp172
-rw-r--r--dom/media/gmp/GMPAudioDecoderChild.h51
-rw-r--r--dom/media/gmp/GMPAudioDecoderParent.cpp369
-rw-r--r--dom/media/gmp/GMPAudioDecoderParent.h72
-rw-r--r--dom/media/gmp/GMPAudioDecoderProxy.h48
-rw-r--r--dom/media/gmp/GMPAudioHost.cpp162
-rw-r--r--dom/media/gmp/GMPAudioHost.h71
-rw-r--r--dom/media/gmp/GMPCDMCallbackProxy.cpp251
-rw-r--r--dom/media/gmp/GMPCDMCallbackProxy.h72
-rw-r--r--dom/media/gmp/GMPCDMProxy.cpp799
-rw-r--r--dom/media/gmp/GMPCDMProxy.h266
-rw-r--r--dom/media/gmp/GMPCallbackBase.h21
-rw-r--r--dom/media/gmp/GMPChild.cpp646
-rw-r--r--dom/media/gmp/GMPChild.h99
-rw-r--r--dom/media/gmp/GMPContentChild.cpp320
-rw-r--r--dom/media/gmp/GMPContentChild.h58
-rw-r--r--dom/media/gmp/GMPContentParent.cpp298
-rw-r--r--dom/media/gmp/GMPContentParent.h103
-rw-r--r--dom/media/gmp/GMPCrashHelperHolder.h81
-rw-r--r--dom/media/gmp/GMPDecryptorChild.cpp403
-rw-r--r--dom/media/gmp/GMPDecryptorChild.h142
-rw-r--r--dom/media/gmp/GMPDecryptorParent.cpp508
-rw-r--r--dom/media/gmp/GMPDecryptorParent.h129
-rw-r--r--dom/media/gmp/GMPDecryptorProxy.h63
-rw-r--r--dom/media/gmp/GMPDiskStorage.cpp499
-rw-r--r--dom/media/gmp/GMPEncryptedBufferDataImpl.cpp132
-rw-r--r--dom/media/gmp/GMPEncryptedBufferDataImpl.h92
-rw-r--r--dom/media/gmp/GMPLoader.cpp222
-rw-r--r--dom/media/gmp/GMPLoader.h113
-rw-r--r--dom/media/gmp/GMPMemoryStorage.cpp95
-rw-r--r--dom/media/gmp/GMPMessageUtils.h253
-rw-r--r--dom/media/gmp/GMPParent.cpp1167
-rw-r--r--dom/media/gmp/GMPParent.h260
-rw-r--r--dom/media/gmp/GMPPlatform.cpp300
-rw-r--r--dom/media/gmp/GMPPlatform.h56
-rw-r--r--dom/media/gmp/GMPProcessChild.cpp82
-rw-r--r--dom/media/gmp/GMPProcessChild.h43
-rw-r--r--dom/media/gmp/GMPProcessParent.cpp118
-rw-r--r--dom/media/gmp/GMPProcessParent.h52
-rw-r--r--dom/media/gmp/GMPService.cpp568
-rw-r--r--dom/media/gmp/GMPService.h142
-rw-r--r--dom/media/gmp/GMPServiceChild.cpp478
-rw-r--r--dom/media/gmp/GMPServiceChild.h105
-rw-r--r--dom/media/gmp/GMPServiceParent.cpp2135
-rw-r--r--dom/media/gmp/GMPServiceParent.h279
-rw-r--r--dom/media/gmp/GMPSharedMemManager.cpp98
-rw-r--r--dom/media/gmp/GMPSharedMemManager.h82
-rw-r--r--dom/media/gmp/GMPStorage.h41
-rw-r--r--dom/media/gmp/GMPStorageChild.cpp380
-rw-r--r--dom/media/gmp/GMPStorageChild.h118
-rw-r--r--dom/media/gmp/GMPStorageParent.cpp220
-rw-r--r--dom/media/gmp/GMPStorageParent.h49
-rw-r--r--dom/media/gmp/GMPTimerChild.cpp67
-rw-r--r--dom/media/gmp/GMPTimerChild.h46
-rw-r--r--dom/media/gmp/GMPTimerParent.cpp123
-rw-r--r--dom/media/gmp/GMPTimerParent.h61
-rw-r--r--dom/media/gmp/GMPTypes.ipdlh86
-rw-r--r--dom/media/gmp/GMPUtils.cpp229
-rw-r--r--dom/media/gmp/GMPUtils.h89
-rw-r--r--dom/media/gmp/GMPVideoDecoderChild.cpp254
-rw-r--r--dom/media/gmp/GMPVideoDecoderChild.h75
-rw-r--r--dom/media/gmp/GMPVideoDecoderParent.cpp513
-rw-r--r--dom/media/gmp/GMPVideoDecoderParent.h104
-rw-r--r--dom/media/gmp/GMPVideoDecoderProxy.h56
-rw-r--r--dom/media/gmp/GMPVideoEncodedFrameImpl.cpp324
-rw-r--r--dom/media/gmp/GMPVideoEncodedFrameImpl.h122
-rw-r--r--dom/media/gmp/GMPVideoEncoderChild.cpp235
-rw-r--r--dom/media/gmp/GMPVideoEncoderChild.h75
-rw-r--r--dom/media/gmp/GMPVideoEncoderParent.cpp382
-rw-r--r--dom/media/gmp/GMPVideoEncoderParent.h93
-rw-r--r--dom/media/gmp/GMPVideoEncoderProxy.h56
-rw-r--r--dom/media/gmp/GMPVideoHost.cpp120
-rw-r--r--dom/media/gmp/GMPVideoHost.h57
-rw-r--r--dom/media/gmp/GMPVideoPlaneImpl.cpp225
-rw-r--r--dom/media/gmp/GMPVideoPlaneImpl.h66
-rw-r--r--dom/media/gmp/GMPVideoi420FrameImpl.cpp365
-rw-r--r--dom/media/gmp/GMPVideoi420FrameImpl.h84
-rw-r--r--dom/media/gmp/PGMP.ipdl44
-rw-r--r--dom/media/gmp/PGMPAudioDecoder.ipdl37
-rw-r--r--dom/media/gmp/PGMPContent.ipdl33
-rw-r--r--dom/media/gmp/PGMPDecryptor.ipdl92
-rw-r--r--dom/media/gmp/PGMPService.ipdl32
-rw-r--r--dom/media/gmp/PGMPStorage.ipdl36
-rw-r--r--dom/media/gmp/PGMPTimer.ipdl22
-rw-r--r--dom/media/gmp/PGMPVideoDecoder.ipdl50
-rw-r--r--dom/media/gmp/PGMPVideoEncoder.ipdl48
-rw-r--r--dom/media/gmp/README.txt1
-rw-r--r--dom/media/gmp/gmp-api/gmp-async-shutdown.h54
-rw-r--r--dom/media/gmp/gmp-api/gmp-audio-codec.h43
-rw-r--r--dom/media/gmp/gmp-api/gmp-audio-decode.h84
-rw-r--r--dom/media/gmp/gmp-api/gmp-audio-host.h32
-rw-r--r--dom/media/gmp/gmp-api/gmp-audio-samples.h74
-rw-r--r--dom/media/gmp/gmp-api/gmp-decryption.h459
-rw-r--r--dom/media/gmp/gmp-api/gmp-entrypoints.h75
-rw-r--r--dom/media/gmp/gmp-api/gmp-errors.h58
-rw-r--r--dom/media/gmp/gmp-api/gmp-platform.h118
-rw-r--r--dom/media/gmp/gmp-api/gmp-storage.h141
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-codec.h226
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-decode.h127
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-encode.h135
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-frame-encoded.h99
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-frame-i420.h132
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-frame.h51
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-host.h53
-rw-r--r--dom/media/gmp/gmp-api/gmp-video-plane.h94
-rw-r--r--dom/media/gmp/moz.build156
-rw-r--r--dom/media/gmp/mozIGeckoMediaPluginChromeService.idl51
-rw-r--r--dom/media/gmp/mozIGeckoMediaPluginService.idl169
-rw-r--r--dom/media/gmp/rlz/COPYING14
-rw-r--r--dom/media/gmp/rlz/GMPDeviceBinding.cpp209
-rw-r--r--dom/media/gmp/rlz/GMPDeviceBinding.h22
-rw-r--r--dom/media/gmp/rlz/README.mozilla6
-rw-r--r--dom/media/gmp/rlz/lib/assert.h14
-rw-r--r--dom/media/gmp/rlz/lib/machine_id.h19
-rw-r--r--dom/media/gmp/rlz/lib/string_utils.cc34
-rw-r--r--dom/media/gmp/rlz/lib/string_utils.h20
-rw-r--r--dom/media/gmp/rlz/mac/lib/machine_id_mac.cc320
-rw-r--r--dom/media/gmp/rlz/moz.build42
-rw-r--r--dom/media/gmp/rlz/sha256.c469
-rw-r--r--dom/media/gmp/rlz/sha256.h46
-rw-r--r--dom/media/gmp/rlz/win/lib/machine_id_win.cc134
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineAdapter.cpp168
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineAdapter.h59
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineDecryptor.cpp541
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineDecryptor.h134
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineFileIO.cpp97
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineFileIO.h46
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineUtils.cpp95
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineUtils.h69
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineVideoDecoder.cpp400
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineVideoDecoder.h80
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineVideoFrame.cpp126
-rw-r--r--dom/media/gmp/widevine-adapter/WidevineVideoFrame.h50
-rw-r--r--dom/media/gmp/widevine-adapter/content_decryption_module.h1199
-rw-r--r--dom/media/gmp/widevine-adapter/moz.build25
-rw-r--r--dom/media/gtest/Cargo.toml7
-rw-r--r--dom/media/gtest/GMPTestMonitor.h47
-rw-r--r--dom/media/gtest/MockMediaDecoderOwner.h54
-rw-r--r--dom/media/gtest/MockMediaResource.cpp116
-rw-r--r--dom/media/gtest/MockMediaResource.h83
-rw-r--r--dom/media/gtest/TestAudioBuffers.cpp57
-rw-r--r--dom/media/gtest/TestAudioCompactor.cpp145
-rw-r--r--dom/media/gtest/TestAudioMixer.cpp165
-rw-r--r--dom/media/gtest/TestAudioPacketizer.cpp167
-rw-r--r--dom/media/gtest/TestAudioSegment.cpp257
-rw-r--r--dom/media/gtest/TestGMPCrossOrigin.cpp1552
-rw-r--r--dom/media/gtest/TestGMPRemoveAndDelete.cpp491
-rw-r--r--dom/media/gtest/TestGMPUtils.cpp61
-rw-r--r--dom/media/gtest/TestIntervalSet.cpp821
-rw-r--r--dom/media/gtest/TestMP3Demuxer.cpp454
-rw-r--r--dom/media/gtest/TestMP4Demuxer.cpp463
-rw-r--r--dom/media/gtest/TestMP4Reader.cpp217
-rw-r--r--dom/media/gtest/TestMediaDataDecoder.cpp72
-rw-r--r--dom/media/gtest/TestMediaEventSource.cpp337
-rw-r--r--dom/media/gtest/TestMediaFormatReader.cpp248
-rw-r--r--dom/media/gtest/TestMozPromise.cpp257
-rw-r--r--dom/media/gtest/TestRust.cpp9
-rw-r--r--dom/media/gtest/TestTimeUnit.cpp22
-rw-r--r--dom/media/gtest/TestTrackEncoder.cpp94
-rw-r--r--dom/media/gtest/TestVPXDecoding.cpp103
-rw-r--r--dom/media/gtest/TestVideoSegment.cpp51
-rw-r--r--dom/media/gtest/TestVideoTrackEncoder.cpp351
-rw-r--r--dom/media/gtest/TestVideoUtils.cpp80
-rw-r--r--dom/media/gtest/TestWebMBuffered.cpp119
-rw-r--r--dom/media/gtest/TestWebMWriter.cpp376
-rw-r--r--dom/media/gtest/dash_dashinit.mp4bin0 -> 80388 bytes
-rw-r--r--dom/media/gtest/hello.rs6
-rw-r--r--dom/media/gtest/id3v2header.mp3bin0 -> 191302 bytes
-rw-r--r--dom/media/gtest/mediasource_test.mp4bin0 -> 209832 bytes
-rw-r--r--dom/media/gtest/moz.build80
-rw-r--r--dom/media/gtest/negative_duration.mp4bin0 -> 684 bytes
-rw-r--r--dom/media/gtest/noise.mp3bin0 -> 965257 bytes
-rw-r--r--dom/media/gtest/noise_vbr.mp3bin0 -> 583679 bytes
-rw-r--r--dom/media/gtest/short-zero-in-moov.mp4bin0 -> 13655 bytes
-rw-r--r--dom/media/gtest/short-zero-inband.movbin0 -> 93641 bytes
-rw-r--r--dom/media/gtest/small-shot-false-positive.mp3bin0 -> 6845 bytes
-rw-r--r--dom/media/gtest/small-shot.mp3bin0 -> 6825 bytes
-rw-r--r--dom/media/gtest/test.webmbin0 -> 2015 bytes
-rw-r--r--dom/media/gtest/test_case_1224361.vp8.ivfbin0 -> 1497 bytes
-rw-r--r--dom/media/gtest/test_case_1224363.vp8.ivfbin0 -> 1388 bytes
-rw-r--r--dom/media/gtest/test_case_1224369.vp8.ivfbin0 -> 204 bytes
-rw-r--r--dom/media/imagecapture/CaptureTask.cpp197
-rw-r--r--dom/media/imagecapture/CaptureTask.h91
-rw-r--r--dom/media/imagecapture/ImageCapture.cpp232
-rw-r--r--dom/media/imagecapture/ImageCapture.h94
-rw-r--r--dom/media/imagecapture/moz.build16
-rw-r--r--dom/media/ipc/MediaIPCUtils.h48
-rw-r--r--dom/media/ipc/PVideoDecoder.ipdl78
-rw-r--r--dom/media/ipc/PVideoDecoderManager.ipdl25
-rw-r--r--dom/media/ipc/RemoteVideoDecoder.cpp176
-rw-r--r--dom/media/ipc/RemoteVideoDecoder.h90
-rw-r--r--dom/media/ipc/VideoDecoderChild.cpp275
-rw-r--r--dom/media/ipc/VideoDecoderChild.h80
-rw-r--r--dom/media/ipc/VideoDecoderManagerChild.cpp267
-rw-r--r--dom/media/ipc/VideoDecoderManagerChild.h96
-rw-r--r--dom/media/ipc/VideoDecoderManagerParent.cpp238
-rw-r--r--dom/media/ipc/VideoDecoderManagerParent.h55
-rw-r--r--dom/media/ipc/VideoDecoderParent.cpp280
-rw-r--r--dom/media/ipc/VideoDecoderParent.h69
-rw-r--r--dom/media/ipc/moz.build31
-rw-r--r--dom/media/mediasink/AudioSink.h72
-rw-r--r--dom/media/mediasink/AudioSinkWrapper.cpp248
-rw-r--r--dom/media/mediasink/AudioSinkWrapper.h108
-rw-r--r--dom/media/mediasink/DecodedAudioDataSink.cpp561
-rw-r--r--dom/media/mediasink/DecodedAudioDataSink.h165
-rw-r--r--dom/media/mediasink/DecodedStream.cpp781
-rw-r--r--dom/media/mediasink/DecodedStream.h122
-rw-r--r--dom/media/mediasink/MediaSink.h133
-rw-r--r--dom/media/mediasink/OutputStreamManager.cpp134
-rw-r--r--dom/media/mediasink/OutputStreamManager.h80
-rw-r--r--dom/media/mediasink/VideoSink.cpp486
-rw-r--r--dom/media/mediasink/VideoSink.h160
-rw-r--r--dom/media/mediasink/moz.build18
-rw-r--r--dom/media/mediasource/AsyncEventRunner.h36
-rw-r--r--dom/media/mediasource/AutoTaskQueue.h59
-rw-r--r--dom/media/mediasource/ContainerParser.cpp716
-rw-r--r--dom/media/mediasource/ContainerParser.h90
-rw-r--r--dom/media/mediasource/MediaSource.cpp591
-rw-r--r--dom/media/mediasource/MediaSource.h157
-rw-r--r--dom/media/mediasource/MediaSourceDecoder.cpp361
-rw-r--r--dom/media/mediasource/MediaSourceDecoder.h96
-rw-r--r--dom/media/mediasource/MediaSourceDemuxer.cpp499
-rw-r--r--dom/media/mediasource/MediaSourceDemuxer.h145
-rw-r--r--dom/media/mediasource/MediaSourceResource.h109
-rw-r--r--dom/media/mediasource/MediaSourceUtils.cpp34
-rw-r--r--dom/media/mediasource/MediaSourceUtils.h19
-rw-r--r--dom/media/mediasource/ResourceQueue.cpp214
-rw-r--r--dom/media/mediasource/ResourceQueue.h86
-rw-r--r--dom/media/mediasource/SourceBuffer.cpp596
-rw-r--r--dom/media/mediasource/SourceBuffer.h189
-rw-r--r--dom/media/mediasource/SourceBufferAttributes.h157
-rw-r--r--dom/media/mediasource/SourceBufferList.cpp225
-rw-r--r--dom/media/mediasource/SourceBufferList.h106
-rw-r--r--dom/media/mediasource/SourceBufferResource.cpp185
-rw-r--r--dom/media/mediasource/SourceBufferResource.h161
-rw-r--r--dom/media/mediasource/SourceBufferTask.h111
-rw-r--r--dom/media/mediasource/TrackBuffersManager.cpp2505
-rw-r--r--dom/media/mediasource/TrackBuffersManager.h500
-rw-r--r--dom/media/mediasource/gtest/TestContainerParser.cpp92
-rw-r--r--dom/media/mediasource/gtest/moz.build16
-rw-r--r--dom/media/mediasource/moz.build49
-rw-r--r--dom/media/mediasource/test/aac20-48000-64000-1.m4sbin0 -> 24328 bytes
-rw-r--r--dom/media/mediasource/test/aac20-48000-64000-1.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/aac20-48000-64000-2.m4sbin0 -> 24132 bytes
-rw-r--r--dom/media/mediasource/test/aac20-48000-64000-2.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/aac20-48000-64000-init.mp4bin0 -> 1246 bytes
-rw-r--r--dom/media/mediasource/test/aac20-48000-64000-init.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/aac51-48000-128000-1.m4sbin0 -> 48979 bytes
-rw-r--r--dom/media/mediasource/test/aac51-48000-128000-1.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/aac51-48000-128000-2.m4sbin0 -> 47727 bytes
-rw-r--r--dom/media/mediasource/test/aac51-48000-128000-2.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/aac51-48000-128000-init.mp4bin0 -> 634 bytes
-rw-r--r--dom/media/mediasource/test/aac51-48000-128000-init.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop1.m4sbin0 -> 24424 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop1.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop10.m4sbin0 -> 18279 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop10.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop11.m4sbin0 -> 24607 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop11.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop12.m4sbin0 -> 22676 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop12.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop13.m4sbin0 -> 9847 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop13.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop2.m4sbin0 -> 22205 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop2.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop2s.mp4bin0 -> 48024 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop2s.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop3.m4sbin0 -> 24013 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop3.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop4.m4sbin0 -> 23112 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop4.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop5.m4sbin0 -> 18367 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop5.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop6.m4sbin0 -> 24455 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop6.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop7.m4sbin0 -> 22442 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop7.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop8.m4sbin0 -> 24356 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop8.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop9.m4sbin0 -> 23252 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop9.m4s^headers^1
-rwxr-xr-xdom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4sbin0 -> 66806 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s^headers^1
-rwxr-xr-xdom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4sbin0 -> 65292 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s^headers^1
-rwxr-xr-xdom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4bin0 -> 1410 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio1.m4sbin0 -> 694 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio1.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio10.m4sbin0 -> 879 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio10.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio11.m4sbin0 -> 208 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio11.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio2.m4sbin0 -> 750 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio2.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio3.m4sbin0 -> 724 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio3.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio4.m4sbin0 -> 806 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio4.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio5.m4sbin0 -> 822 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio5.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio6.m4sbin0 -> 833 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio6.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio7.m4sbin0 -> 888 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio7.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio8.m4sbin0 -> 829 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio8.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio9.m4sbin0 -> 778 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audio9.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4bin0 -> 825 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_dash.mpd48
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video1.m4sbin0 -> 23860 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video1.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video10.m4sbin0 -> 18109 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video10.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video11.m4sbin0 -> 23969 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video11.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video12.m4sbin0 -> 21937 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video12.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video13.m4sbin0 -> 16265 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video13.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video2.m4sbin0 -> 21595 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video2.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video3.m4sbin0 -> 23429 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video3.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video4.m4sbin0 -> 22446 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video4.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video5.m4sbin0 -> 18191 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video5.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video6.m4sbin0 -> 23773 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video6.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video7.m4sbin0 -> 21749 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video7.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video8.m4sbin0 -> 23608 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video8.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video9.m4sbin0 -> 22553 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_video9.m4s^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4bin0 -> 887 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/bipbop/bipbopinit.mp4bin0 -> 1395 bytes
-rw-r--r--dom/media/mediasource/test/bipbop/bipbopinit.mp4^headers^1
-rw-r--r--dom/media/mediasource/test/crashtests/1005366.html27
-rw-r--r--dom/media/mediasource/test/crashtests/1059035.html26
-rw-r--r--dom/media/mediasource/test/crashtests/926665.html26
-rw-r--r--dom/media/mediasource/test/crashtests/931388.html17
-rw-r--r--dom/media/mediasource/test/crashtests/crashtests.list4
-rw-r--r--dom/media/mediasource/test/mediasource.js130
-rw-r--r--dom/media/mediasource/test/mochitest.ini137
-rw-r--r--dom/media/mediasource/test/seek.webmbin0 -> 215529 bytes
-rw-r--r--dom/media/mediasource/test/seek.webm^headers^1
-rw-r--r--dom/media/mediasource/test/seek_lowres.webmbin0 -> 100749 bytes
-rw-r--r--dom/media/mediasource/test/seek_lowres.webm^headers^1
-rw-r--r--dom/media/mediasource/test/test_AudioChange_mp4.html72
-rw-r--r--dom/media/mediasource/test/test_AutoRevocation.html40
-rw-r--r--dom/media/mediasource/test/test_BufferedSeek.html63
-rw-r--r--dom/media/mediasource/test/test_BufferedSeek_mp4.html63
-rw-r--r--dom/media/mediasource/test/test_BufferingWait.html56
-rw-r--r--dom/media/mediasource/test/test_BufferingWait_mp4.html54
-rw-r--r--dom/media/mediasource/test/test_DrainOnMissingData_mp4.html60
-rw-r--r--dom/media/mediasource/test/test_DurationChange.html111
-rw-r--r--dom/media/mediasource/test/test_DurationUpdated.html57
-rw-r--r--dom/media/mediasource/test/test_DurationUpdated_mp4.html56
-rw-r--r--dom/media/mediasource/test/test_EndOfStream.html50
-rw-r--r--dom/media/mediasource/test/test_EndOfStream_mp4.html50
-rw-r--r--dom/media/mediasource/test/test_Eviction_mp4.html82
-rw-r--r--dom/media/mediasource/test/test_FrameSelection.html78
-rw-r--r--dom/media/mediasource/test/test_FrameSelection_mp4.html73
-rw-r--r--dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html47
-rw-r--r--dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek_mp4.html52
-rw-r--r--dom/media/mediasource/test/test_LiveSeekable.html80
-rw-r--r--dom/media/mediasource/test/test_LoadedDataFired_mp4.html68
-rw-r--r--dom/media/mediasource/test/test_LoadedMetadataFired.html37
-rw-r--r--dom/media/mediasource/test/test_LoadedMetadataFired_mp4.html37
-rw-r--r--dom/media/mediasource/test/test_MediaSource.html107
-rw-r--r--dom/media/mediasource/test/test_MediaSource_disabled.html32
-rw-r--r--dom/media/mediasource/test/test_MediaSource_memory_reporting.html51
-rw-r--r--dom/media/mediasource/test/test_MediaSource_mp4.html108
-rw-r--r--dom/media/mediasource/test/test_MultipleInitSegments.html53
-rw-r--r--dom/media/mediasource/test/test_MultipleInitSegments_mp4.html52
-rw-r--r--dom/media/mediasource/test/test_OnEvents.html65
-rw-r--r--dom/media/mediasource/test/test_PlayEvents.html165
-rw-r--r--dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html55
-rw-r--r--dom/media/mediasource/test/test_SeekNoData_mp4.html69
-rw-r--r--dom/media/mediasource/test/test_SeekToEnd_mp4.html57
-rw-r--r--dom/media/mediasource/test/test_SeekTwice_mp4.html54
-rw-r--r--dom/media/mediasource/test/test_SeekableAfterEndOfStream.html49
-rw-r--r--dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit.html50
-rw-r--r--dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit_mp4.html50
-rw-r--r--dom/media/mediasource/test/test_SeekableAfterEndOfStream_mp4.html49
-rw-r--r--dom/media/mediasource/test/test_SeekableBeforeEndOfStream.html38
-rw-r--r--dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html42
-rw-r--r--dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit_mp4.html44
-rw-r--r--dom/media/mediasource/test/test_SeekableBeforeEndOfStream_mp4.html38
-rw-r--r--dom/media/mediasource/test/test_SeekedEvent_mp4.html75
-rw-r--r--dom/media/mediasource/test/test_Sequence_mp4.html39
-rw-r--r--dom/media/mediasource/test/test_SetModeThrows.html34
-rw-r--r--dom/media/mediasource/test/test_SplitAppend.html47
-rw-r--r--dom/media/mediasource/test/test_SplitAppendDelay.html50
-rw-r--r--dom/media/mediasource/test/test_SplitAppendDelay_mp4.html51
-rw-r--r--dom/media/mediasource/test/test_SplitAppend_mp4.html48
-rw-r--r--dom/media/mediasource/test/test_Threshold_mp4.html84
-rw-r--r--dom/media/mediasource/test/test_TimestampOffset_mp4.html86
-rw-r--r--dom/media/mediasource/test/test_TruncatedDuration.html78
-rw-r--r--dom/media/mediasource/test/test_TruncatedDuration_mp4.html83
-rw-r--r--dom/media/mediasource/test/test_WaitingOnMissingData.html63
-rw-r--r--dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html53
-rw-r--r--dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html65
-rw-r--r--dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html56
-rw-r--r--dom/media/moz.build347
-rw-r--r--dom/media/nsIDOMNavigatorUserMedia.idl39
-rw-r--r--dom/media/nsIDocumentActivity.h29
-rw-r--r--dom/media/nsIMediaManager.idl29
-rw-r--r--dom/media/ogg/OggCodecState.cpp1839
-rw-r--r--dom/media/ogg/OggCodecState.h644
-rw-r--r--dom/media/ogg/OggCodecStore.cpp37
-rw-r--r--dom/media/ogg/OggCodecStore.h38
-rw-r--r--dom/media/ogg/OggDecoder.cpp79
-rw-r--r--dom/media/ogg/OggDecoder.h61
-rw-r--r--dom/media/ogg/OggDemuxer.cpp2194
-rw-r--r--dom/media/ogg/OggDemuxer.h387
-rw-r--r--dom/media/ogg/OggWriter.cpp214
-rw-r--r--dom/media/ogg/OggWriter.h52
-rw-r--r--dom/media/ogg/OpusParser.cpp185
-rw-r--r--dom/media/ogg/OpusParser.h48
-rw-r--r--dom/media/ogg/moz.build25
-rw-r--r--dom/media/platforms/MediaTelemetryConstants.h22
-rw-r--r--dom/media/platforms/PDMFactory.cpp482
-rw-r--r--dom/media/platforms/PDMFactory.h84
-rw-r--r--dom/media/platforms/PlatformDecoderModule.h309
-rw-r--r--dom/media/platforms/ReorderQueue.h29
-rw-r--r--dom/media/platforms/agnostic/AgnosticDecoderModule.cpp63
-rw-r--r--dom/media/platforms/agnostic/AgnosticDecoderModule.h34
-rw-r--r--dom/media/platforms/agnostic/BlankDecoderModule.cpp278
-rw-r--r--dom/media/platforms/agnostic/OpusDecoder.cpp356
-rw-r--r--dom/media/platforms/agnostic/OpusDecoder.h76
-rw-r--r--dom/media/platforms/agnostic/TheoraDecoder.cpp240
-rw-r--r--dom/media/platforms/agnostic/TheoraDecoder.h64
-rw-r--r--dom/media/platforms/agnostic/VPXDecoder.cpp253
-rw-r--r--dom/media/platforms/agnostic/VPXDecoder.h69
-rw-r--r--dom/media/platforms/agnostic/VorbisDecoder.cpp349
-rw-r--r--dom/media/platforms/agnostic/VorbisDecoder.h66
-rw-r--r--dom/media/platforms/agnostic/WAVDecoder.cpp158
-rw-r--r--dom/media/platforms/agnostic/WAVDecoder.h41
-rw-r--r--dom/media/platforms/agnostic/eme/EMEAudioDecoder.cpp44
-rw-r--r--dom/media/platforms/agnostic/eme/EMEAudioDecoder.h37
-rw-r--r--dom/media/platforms/agnostic/eme/EMEDecoderModule.cpp307
-rw-r--r--dom/media/platforms/agnostic/eme/EMEDecoderModule.h52
-rw-r--r--dom/media/platforms/agnostic/eme/EMEVideoDecoder.cpp68
-rw-r--r--dom/media/platforms/agnostic/eme/EMEVideoDecoder.h45
-rw-r--r--dom/media/platforms/agnostic/eme/SamplesWaitingForKey.cpp86
-rw-r--r--dom/media/platforms/agnostic/eme/SamplesWaitingForKey.h58
-rw-r--r--dom/media/platforms/agnostic/eme/moz.build23
-rw-r--r--dom/media/platforms/agnostic/gmp/GMPAudioDecoder.cpp306
-rw-r--r--dom/media/platforms/agnostic/gmp/GMPAudioDecoder.h112
-rw-r--r--dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp172
-rw-r--r--dom/media/platforms/agnostic/gmp/GMPDecoderModule.h57
-rw-r--r--dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp387
-rw-r--r--dom/media/platforms/agnostic/gmp/GMPVideoDecoder.h122
-rw-r--r--dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.cpp90
-rw-r--r--dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.h181
-rw-r--r--dom/media/platforms/agnostic/gmp/moz.build24
-rw-r--r--dom/media/platforms/android/AndroidDecoderModule.cpp227
-rw-r--r--dom/media/platforms/android/AndroidDecoderModule.h34
-rw-r--r--dom/media/platforms/android/MediaCodecDataDecoder.cpp698
-rw-r--r--dom/media/platforms/android/MediaCodecDataDecoder.h126
-rw-r--r--dom/media/platforms/android/RemoteDataDecoder.cpp489
-rw-r--r--dom/media/platforms/android/RemoteDataDecoder.h62
-rw-r--r--dom/media/platforms/apple/AppleATDecoder.cpp722
-rw-r--r--dom/media/platforms/apple/AppleATDecoder.h78
-rw-r--r--dom/media/platforms/apple/AppleCMFunctions.h12
-rw-r--r--dom/media/platforms/apple/AppleCMLinker.cpp104
-rw-r--r--dom/media/platforms/apple/AppleCMLinker.h46
-rw-r--r--dom/media/platforms/apple/AppleDecoderModule.cpp113
-rw-r--r--dom/media/platforms/apple/AppleDecoderModule.h48
-rw-r--r--dom/media/platforms/apple/AppleUtils.h98
-rw-r--r--dom/media/platforms/apple/AppleVTDecoder.cpp674
-rw-r--r--dom/media/platforms/apple/AppleVTDecoder.h126
-rw-r--r--dom/media/platforms/apple/AppleVTFunctions.h14
-rw-r--r--dom/media/platforms/apple/AppleVTLinker.cpp104
-rw-r--r--dom/media/platforms/apple/AppleVTLinker.h46
-rw-r--r--dom/media/platforms/apple/VideoToolbox/VideoToolbox.h94
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp233
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h44
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp204
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegDataDecoder.h72
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegDecoderModule.cpp13
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegDecoderModule.h86
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp178
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegLibWrapper.h94
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegLibs.h39
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegLog.h14
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp169
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h46
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp393
-rw-r--r--dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h127
-rw-r--r--dom/media/platforms/ffmpeg/README_mozilla11
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/COPYING.LGPLv2.1504
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avcodec.h5418
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avfft.h118
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vaapi.h189
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vdpau.h253
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/version.h210
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/attributes.h168
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avconfig.h7
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avutil.h343
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/buffer.h274
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/channel_layout.h223
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/common.h519
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/cpu.h117
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/dict.h198
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/error.h126
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/frame.h713
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/intfloat.h77
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/log.h359
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/macros.h50
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mathematics.h165
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mem.h406
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/pixfmt.h469
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/rational.h173
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/samplefmt.h271
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/version.h129
-rw-r--r--dom/media/platforms/ffmpeg/ffmpeg57/moz.build25
-rw-r--r--dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp113
-rw-r--r--dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.h31
-rw-r--r--dom/media/platforms/ffmpeg/ffvpx/moz.build45
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/COPYING.LGPLv2.1504
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/avcodec.h4761
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/avfft.h99
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/dxva2.h71
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/old_codec_ids.h398
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/opt.h34
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/vaapi.h167
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/vda.h144
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/vdpau.h88
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/version.h126
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavcodec/xvmc.h151
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/adler32.h43
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/aes.h57
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/attributes.h136
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/audio_fifo.h146
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/audioconvert.h130
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/avassert.h66
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/avconfig.h6
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/avstring.h175
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/avutil.h326
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/base64.h65
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/blowfish.h77
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/bprint.h169
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/bswap.h109
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/common.h398
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/cpu.h56
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/crc.h44
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/dict.h121
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/error.h81
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/eval.h113
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/fifo.h141
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/file.h52
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/imgutils.h138
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat.h73
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat_readwrite.h40
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/intreadwrite.h522
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/lfg.h62
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/log.h172
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/lzo.h77
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/mathematics.h122
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/md5.h46
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/mem.h136
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/old_pix_fmts.h171
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/opt.h591
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/parseutils.h124
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/pixdesc.h177
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/pixfmt.h198
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/random_seed.h44
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/rational.h144
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/samplefmt.h148
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/sha.h66
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/time.h41
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/timecode.h140
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/timestamp.h74
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/version.h132
-rw-r--r--dom/media/platforms/ffmpeg/libav53/include/libavutil/xtea.h62
-rw-r--r--dom/media/platforms/ffmpeg/libav53/moz.build23
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/COPYING.LGPLv2.1504
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/avcodec.h4658
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/avfft.h116
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/dxva2.h88
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/old_codec_ids.h366
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/vaapi.h173
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/vda.h217
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/vdpau.h94
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/version.h95
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavcodec/xvmc.h168
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/adler32.h43
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/aes.h67
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/attributes.h122
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/audio_fifo.h146
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/audioconvert.h6
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/avassert.h66
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/avconfig.h6
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/avstring.h191
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/avutil.h275
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/base64.h65
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/blowfish.h76
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/bswap.h109
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/channel_layout.h182
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/common.h406
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/cpu.h84
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/crc.h74
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/dict.h129
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/error.h83
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/eval.h113
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/fifo.h131
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/file.h54
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/imgutils.h138
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat.h77
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat_readwrite.h40
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/intreadwrite.h549
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/lfg.h62
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/log.h173
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/lzo.h66
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/mathematics.h111
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/md5.h51
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/mem.h183
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/old_pix_fmts.h128
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/opt.h516
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/parseutils.h124
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/pixdesc.h223
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/pixfmt.h268
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/random_seed.h44
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/rational.h155
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/samplefmt.h220
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/sha.h76
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/time.h39
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/version.h87
-rw-r--r--dom/media/platforms/ffmpeg/libav54/include/libavutil/xtea.h61
-rw-r--r--dom/media/platforms/ffmpeg/libav54/moz.build23
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/COPYING.LGPLv2.1504
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/avcodec.h4356
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/avfft.h118
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/dxva2.h88
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/vaapi.h173
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/vda.h142
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/vdpau.h189
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/version.h127
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavcodec/xvmc.h174
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/adler32.h43
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/aes.h67
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/attributes.h126
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/audio_fifo.h146
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/audioconvert.h6
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/avassert.h66
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/avconfig.h6
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/avstring.h226
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/avutil.h284
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/base64.h65
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/blowfish.h76
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/bswap.h111
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/buffer.h267
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/channel_layout.h186
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/common.h406
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/cpu.h87
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/crc.h74
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/dict.h146
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/downmix_info.h114
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/error.h82
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/eval.h113
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/fifo.h131
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/file.h54
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/frame.h552
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/hmac.h95
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/imgutils.h138
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/intfloat.h77
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/intreadwrite.h549
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/lfg.h62
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/log.h262
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/lzo.h66
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/macros.h48
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/mathematics.h111
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/md5.h51
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/mem.h265
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/old_pix_fmts.h134
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/opt.h516
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/parseutils.h124
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/pixdesc.h276
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/pixfmt.h283
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/random_seed.h44
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/rational.h155
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/samplefmt.h220
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/sha.h76
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/stereo3d.h147
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/time.h39
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/version.h116
-rw-r--r--dom/media/platforms/ffmpeg/libav55/include/libavutil/xtea.h61
-rw-r--r--dom/media/platforms/ffmpeg/libav55/moz.build25
-rw-r--r--dom/media/platforms/ffmpeg/moz.build22
-rw-r--r--dom/media/platforms/gonk/GonkAudioDecoderManager.cpp268
-rw-r--r--dom/media/platforms/gonk/GonkAudioDecoderManager.h59
-rw-r--r--dom/media/platforms/gonk/GonkDecoderModule.cpp63
-rw-r--r--dom/media/platforms/gonk/GonkDecoderModule.h37
-rw-r--r--dom/media/platforms/gonk/GonkMediaDataDecoder.cpp385
-rw-r--r--dom/media/platforms/gonk/GonkMediaDataDecoder.h214
-rw-r--r--dom/media/platforms/gonk/GonkVideoDecoderManager.cpp772
-rw-r--r--dom/media/platforms/gonk/GonkVideoDecoderManager.h149
-rw-r--r--dom/media/platforms/gonk/moz.build39
-rw-r--r--dom/media/platforms/moz.build92
-rw-r--r--dom/media/platforms/omx/GonkOmxPlatformLayer.cpp667
-rw-r--r--dom/media/platforms/omx/GonkOmxPlatformLayer.h205
-rw-r--r--dom/media/platforms/omx/OmxDataDecoder.cpp1038
-rw-r--r--dom/media/platforms/omx/OmxDataDecoder.h214
-rw-r--r--dom/media/platforms/omx/OmxDecoderModule.cpp45
-rw-r--r--dom/media/platforms/omx/OmxDecoderModule.h30
-rw-r--r--dom/media/platforms/omx/OmxPlatformLayer.cpp327
-rw-r--r--dom/media/platforms/omx/OmxPlatformLayer.h100
-rw-r--r--dom/media/platforms/omx/OmxPromiseLayer.cpp382
-rw-r--r--dom/media/platforms/omx/OmxPromiseLayer.h252
-rw-r--r--dom/media/platforms/omx/moz.build57
-rw-r--r--dom/media/platforms/wmf/DXVA2Manager.cpp955
-rw-r--r--dom/media/platforms/wmf/DXVA2Manager.h56
-rw-r--r--dom/media/platforms/wmf/MFTDecoder.cpp305
-rw-r--r--dom/media/platforms/wmf/MFTDecoder.h111
-rw-r--r--dom/media/platforms/wmf/WMF.h104
-rw-r--r--dom/media/platforms/wmf/WMFAudioMFTManager.cpp358
-rw-r--r--dom/media/platforms/wmf/WMFAudioMFTManager.h78
-rw-r--r--dom/media/platforms/wmf/WMFDecoderModule.cpp257
-rw-r--r--dom/media/platforms/wmf/WMFDecoderModule.h56
-rw-r--r--dom/media/platforms/wmf/WMFMediaDataDecoder.cpp227
-rw-r--r--dom/media/platforms/wmf/WMFMediaDataDecoder.h147
-rw-r--r--dom/media/platforms/wmf/WMFUtils.cpp311
-rw-r--r--dom/media/platforms/wmf/WMFUtils.h67
-rw-r--r--dom/media/platforms/wmf/WMFVideoMFTManager.cpp1016
-rw-r--r--dom/media/platforms/wmf/WMFVideoMFTManager.h125
-rw-r--r--dom/media/platforms/wmf/moz.build34
-rw-r--r--dom/media/platforms/wrappers/FuzzingWrapper.cpp328
-rw-r--r--dom/media/platforms/wrappers/FuzzingWrapper.h124
-rw-r--r--dom/media/platforms/wrappers/H264Converter.cpp311
-rw-r--r--dom/media/platforms/wrappers/H264Converter.h74
-rw-r--r--dom/media/standalone/moz.build46
-rw-r--r--dom/media/systemservices/CamerasChild.cpp724
-rw-r--r--dom/media/systemservices/CamerasChild.h250
-rw-r--r--dom/media/systemservices/CamerasParent.cpp1094
-rw-r--r--dom/media/systemservices/CamerasParent.h187
-rw-r--r--dom/media/systemservices/CamerasTypes.h38
-rw-r--r--dom/media/systemservices/DeviceChangeCallback.h61
-rw-r--r--dom/media/systemservices/LoadManager.cpp227
-rw-r--r--dom/media/systemservices/LoadManager.h111
-rw-r--r--dom/media/systemservices/LoadManagerFactory.cpp52
-rw-r--r--dom/media/systemservices/LoadManagerFactory.h18
-rw-r--r--dom/media/systemservices/LoadMonitor.cpp658
-rw-r--r--dom/media/systemservices/LoadMonitor.h61
-rw-r--r--dom/media/systemservices/MediaChild.cpp115
-rw-r--r--dom/media/systemservices/MediaChild.h55
-rw-r--r--dom/media/systemservices/MediaParent.cpp516
-rw-r--r--dom/media/systemservices/MediaParent.h77
-rw-r--r--dom/media/systemservices/MediaSystemResourceClient.cpp75
-rw-r--r--dom/media/systemservices/MediaSystemResourceClient.h94
-rw-r--r--dom/media/systemservices/MediaSystemResourceManager.cpp387
-rw-r--r--dom/media/systemservices/MediaSystemResourceManager.h82
-rw-r--r--dom/media/systemservices/MediaSystemResourceManagerChild.cpp53
-rw-r--r--dom/media/systemservices/MediaSystemResourceManagerChild.h66
-rw-r--r--dom/media/systemservices/MediaSystemResourceManagerParent.cpp77
-rw-r--r--dom/media/systemservices/MediaSystemResourceManagerParent.h57
-rw-r--r--dom/media/systemservices/MediaSystemResourceMessageUtils.h25
-rw-r--r--dom/media/systemservices/MediaSystemResourceService.cpp256
-rw-r--r--dom/media/systemservices/MediaSystemResourceService.h89
-rw-r--r--dom/media/systemservices/MediaSystemResourceTypes.h23
-rw-r--r--dom/media/systemservices/MediaTaskUtils.h50
-rw-r--r--dom/media/systemservices/MediaUtils.cpp15
-rw-r--r--dom/media/systemservices/MediaUtils.h373
-rw-r--r--dom/media/systemservices/OSXRunLoopSingleton.cpp44
-rw-r--r--dom/media/systemservices/OSXRunLoopSingleton.h25
-rw-r--r--dom/media/systemservices/OpenSLESProvider.cpp189
-rw-r--r--dom/media/systemservices/OpenSLESProvider.h68
-rw-r--r--dom/media/systemservices/PCameras.ipdl65
-rw-r--r--dom/media/systemservices/PMedia.ipdl51
-rw-r--r--dom/media/systemservices/PMediaSystemResourceManager.ipdl37
-rw-r--r--dom/media/systemservices/ShmemPool.cpp82
-rw-r--r--dom/media/systemservices/ShmemPool.h153
-rw-r--r--dom/media/systemservices/moz.build104
-rw-r--r--dom/media/test/16bit_wave_extrametadata.wavbin0 -> 97814 bytes
-rw-r--r--dom/media/test/16bit_wave_extrametadata.wav^headers^1
-rw-r--r--dom/media/test/320x240.ogvbin0 -> 28942 bytes
-rw-r--r--dom/media/test/320x240.ogv^headers^1
-rw-r--r--dom/media/test/448636.ogvbin0 -> 7799 bytes
-rw-r--r--dom/media/test/448636.ogv^headers^1
-rw-r--r--dom/media/test/A4.ogvbin0 -> 94372 bytes
-rw-r--r--dom/media/test/A4.ogv^headers^1
-rw-r--r--dom/media/test/VID_0001.oggbin0 -> 633435 bytes
-rw-r--r--dom/media/test/VID_0001.ogg^headers^1
-rw-r--r--dom/media/test/allowed.sjs56
-rw-r--r--dom/media/test/audio-gaps-short.oggbin0 -> 5233 bytes
-rw-r--r--dom/media/test/audio-gaps-short.ogg^headers^1
-rw-r--r--dom/media/test/audio-gaps.oggbin0 -> 12306 bytes
-rw-r--r--dom/media/test/audio-gaps.ogg^headers^1
-rw-r--r--dom/media/test/audio-overhang.oggbin0 -> 45463 bytes
-rw-r--r--dom/media/test/audio-overhang.ogg^headers^1
-rw-r--r--dom/media/test/audio.wavbin0 -> 1422 bytes
-rw-r--r--dom/media/test/audio.wav^headers^1
-rw-r--r--dom/media/test/background_video.js115
-rw-r--r--dom/media/test/bad-signature.vtt1
-rw-r--r--dom/media/test/badtags.oggbin0 -> 5033 bytes
-rw-r--r--dom/media/test/badtags.ogg^headers^1
-rw-r--r--dom/media/test/basic.vtt27
-rw-r--r--dom/media/test/beta-phrasebook.oggbin0 -> 47411 bytes
-rw-r--r--dom/media/test/beta-phrasebook.ogg^headers^1
-rw-r--r--dom/media/test/big-short.wavbin0 -> 12366 bytes
-rw-r--r--dom/media/test/big-short.wav^headers^1
-rw-r--r--dom/media/test/big.wavbin0 -> 102444 bytes
-rw-r--r--dom/media/test/big.wav^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-audio-key1.xml28
-rw-r--r--dom/media/test/bipbop-cenc-audio-key2.xml28
-rw-r--r--dom/media/test/bipbop-cenc-audio1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop-cenc-audio1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-audio2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop-cenc-audio2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-audio3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop-cenc-audio3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-audioinit.mp4bin0 -> 1000 bytes
-rw-r--r--dom/media/test/bipbop-cenc-audioinit.mp4^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-video-key1.xml28
-rw-r--r--dom/media/test/bipbop-cenc-video-key2.xml28
-rw-r--r--dom/media/test/bipbop-cenc-video1.m4sbin0 -> 25211 bytes
-rw-r--r--dom/media/test/bipbop-cenc-video1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-video2.m4sbin0 -> 22934 bytes
-rw-r--r--dom/media/test/bipbop-cenc-video2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop-cenc-videoinit.mp4bin0 -> 1058 bytes
-rw-r--r--dom/media/test/bipbop-cenc-videoinit.mp4^headers^1
-rwxr-xr-xdom/media/test/bipbop-cenc.sh29
-rw-r--r--dom/media/test/bipbop-frag-cenc.xml57
-rw-r--r--dom/media/test/bipbop-lateaudio.mp4bin0 -> 70404 bytes
-rw-r--r--dom/media/test/bipbop-lateaudio.mp4^headers^1
-rw-r--r--dom/media/test/bipbop-no-edts.mp4bin0 -> 285681 bytes
-rw-r--r--dom/media/test/bipbop.mp4bin0 -> 285765 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4sbin0 -> 37646 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4bin0 -> 1086 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4sbin0 -> 37646 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4bin0 -> 1086 bytes
-rw-r--r--dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_225w_175kbps.mp4bin0 -> 38713 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4bin0 -> 874 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4bin0 -> 874 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4sbin0 -> 25211 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4sbin0 -> 22938 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4bin0 -> 932 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4sbin0 -> 25211 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4sbin0 -> 22938 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4bin0 -> 932 bytes
-rw-r--r--dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300_215kbps.mp4bin0 -> 47795 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4sbin0 -> 25211 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4sbin0 -> 22938 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4bin0 -> 1094 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4sbin0 -> 25211 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4sbin0 -> 22938 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4bin0 -> 1094 bytes
-rw-r--r--dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_300wp_227kbps.mp4bin0 -> 48355 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4sbin0 -> 53149 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4bin0 -> 1088 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4sbin0 -> 53149 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4bin0 -> 1088 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-clearkey-audio.webmbin0 -> 7553 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webmbin0 -> 44671 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webmbin0 -> 46030 bytes
-rw-r--r--dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm^headers^1
-rw-r--r--dom/media/test/bipbop_360w_253kbps.mp4bin0 -> 54218 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4bin0 -> 874 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4bin0 -> 874 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4sbin0 -> 68025 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4sbin0 -> 66457 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4bin0 -> 932 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4sbin0 -> 68025 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4sbin0 -> 66457 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4bin0 -> 932 bytes
-rw-r--r--dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_624kbps.mp4bin0 -> 133264 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4bin0 -> 874 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4bin0 -> 874 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4sbin0 -> 101203 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4sbin0 -> 99366 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4bin0 -> 932 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4sbin0 -> 101203 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4sbin0 -> 99366 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4bin0 -> 932 bytes
-rw-r--r--dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480_959kbps.mp4bin0 -> 199351 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4sbin0 -> 101203 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4sbin0 -> 99366 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4bin0 -> 1094 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4sbin0 -> 101203 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4sbin0 -> 99366 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4bin0 -> 1094 bytes
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_1001kbps.mp4bin0 -> 199911 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4sbin0 -> 921 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4sbin0 -> 565 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4sbin0 -> 977 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4sbin0 -> 389 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4bin0 -> 1020 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4sbin0 -> 68025 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4sbin0 -> 66457 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4bin0 -> 1094 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4sbin0 -> 68025 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4sbin0 -> 66457 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4bin0 -> 1094 bytes
-rw-r--r--dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4^headers^1
-rw-r--r--dom/media/test/bipbop_480wp_663kbps.mp4bin0 -> 133824 bytes
-rw-r--r--dom/media/test/black100x100-aspect3to2.ogvbin0 -> 3428 bytes
-rw-r--r--dom/media/test/black100x100-aspect3to2.ogv^headers^1
-rw-r--r--dom/media/test/bogus.duh45
-rw-r--r--dom/media/test/bogus.ogv45
-rw-r--r--dom/media/test/bogus.ogv^headers^1
-rw-r--r--dom/media/test/bogus.wav45
-rw-r--r--dom/media/test/bogus.wav^headers^1
-rw-r--r--dom/media/test/bug1066943.webmbin0 -> 18442 bytes
-rw-r--r--dom/media/test/bug1066943.webm^headers^1
-rw-r--r--dom/media/test/bug1301226-odd.wavbin0 -> 244 bytes
-rw-r--r--dom/media/test/bug1301226-odd.wav^headers^1
-rw-r--r--dom/media/test/bug1301226.wavbin0 -> 240 bytes
-rw-r--r--dom/media/test/bug1301226.wav^headers^1
-rw-r--r--dom/media/test/bug461281.oggbin0 -> 16521 bytes
-rw-r--r--dom/media/test/bug461281.ogg^headers^1
-rw-r--r--dom/media/test/bug482461-theora.ogvbin0 -> 280904 bytes
-rw-r--r--dom/media/test/bug482461-theora.ogv^headers^1
-rw-r--r--dom/media/test/bug482461.ogvbin0 -> 305785 bytes
-rw-r--r--dom/media/test/bug482461.ogv^headers^1
-rw-r--r--dom/media/test/bug495129.ogvbin0 -> 122207 bytes
-rw-r--r--dom/media/test/bug495129.ogv^headers^1
-rw-r--r--dom/media/test/bug495794.oggbin0 -> 4837 bytes
-rw-r--r--dom/media/test/bug495794.ogg^headers^1
-rw-r--r--dom/media/test/bug498380.ogvbin0 -> 65535 bytes
-rw-r--r--dom/media/test/bug498380.ogv^headers^1
-rw-r--r--dom/media/test/bug498855-1.ogvbin0 -> 20480 bytes
-rw-r--r--dom/media/test/bug498855-1.ogv^headers^1
-rw-r--r--dom/media/test/bug498855-2.ogvbin0 -> 20480 bytes
-rw-r--r--dom/media/test/bug498855-2.ogv^headers^1
-rw-r--r--dom/media/test/bug498855-3.ogvbin0 -> 20480 bytes
-rw-r--r--dom/media/test/bug498855-3.ogv^headers^1
-rw-r--r--dom/media/test/bug499519.ogvbin0 -> 20480 bytes
-rw-r--r--dom/media/test/bug499519.ogv^headers^1
-rw-r--r--dom/media/test/bug500311.ogvbin0 -> 55834 bytes
-rw-r--r--dom/media/test/bug500311.ogv^headers^1
-rw-r--r--dom/media/test/bug501279.oggbin0 -> 2361 bytes
-rw-r--r--dom/media/test/bug501279.ogg^headers^1
-rw-r--r--dom/media/test/bug504613.ogvbin0 -> 35000 bytes
-rw-r--r--dom/media/test/bug504613.ogv^headers^1
-rw-r--r--dom/media/test/bug504644.ogvbin0 -> 131114 bytes
-rw-r--r--dom/media/test/bug504644.ogv^headers^1
-rw-r--r--dom/media/test/bug504843.ogvbin0 -> 65536 bytes
-rw-r--r--dom/media/test/bug504843.ogv^headers^1
-rw-r--r--dom/media/test/bug506094.ogvbin0 -> 8195 bytes
-rw-r--r--dom/media/test/bug506094.ogv^headers^1
-rw-r--r--dom/media/test/bug516323.indexed.ogvbin0 -> 162193 bytes
-rw-r--r--dom/media/test/bug516323.indexed.ogv^headers^1
-rw-r--r--dom/media/test/bug516323.ogvbin0 -> 161789 bytes
-rw-r--r--dom/media/test/bug516323.ogv^headers^1
-rw-r--r--dom/media/test/bug520493.oggbin0 -> 3901 bytes
-rw-r--r--dom/media/test/bug520493.ogg^headers^1
-rw-r--r--dom/media/test/bug520500.oggbin0 -> 21978 bytes
-rw-r--r--dom/media/test/bug520500.ogg^headers^1
-rw-r--r--dom/media/test/bug520908.ogvbin0 -> 28942 bytes
-rw-r--r--dom/media/test/bug520908.ogv^headers^1
-rw-r--r--dom/media/test/bug523816.ogvbin0 -> 40585 bytes
-rw-r--r--dom/media/test/bug523816.ogv^headers^1
-rw-r--r--dom/media/test/bug533822.oggbin0 -> 35010 bytes
-rw-r--r--dom/media/test/bug533822.ogg^headers^1
-rw-r--r--dom/media/test/bug556821.ogvbin0 -> 196608 bytes
-rw-r--r--dom/media/test/bug556821.ogv^headers^1
-rw-r--r--dom/media/test/bug557094.ogvbin0 -> 76966 bytes
-rw-r--r--dom/media/test/bug557094.ogv^headers^1
-rw-r--r--dom/media/test/bug580982.webmbin0 -> 215594 bytes
-rw-r--r--dom/media/test/bug580982.webm^headers^1
-rw-r--r--dom/media/test/bug603918.webmbin0 -> 103227 bytes
-rw-r--r--dom/media/test/bug603918.webm^headers^1
-rw-r--r--dom/media/test/bug604067.webmbin0 -> 103227 bytes
-rw-r--r--dom/media/test/bug604067.webm^headers^1
-rw-r--r--dom/media/test/bug883173.vtt16
-rw-r--r--dom/media/test/can_play_type_dash.js27
-rw-r--r--dom/media/test/can_play_type_ogg.js78
-rw-r--r--dom/media/test/can_play_type_wave.js29
-rw-r--r--dom/media/test/can_play_type_webm.js54
-rw-r--r--dom/media/test/cancellable_request.sjs154
-rw-r--r--dom/media/test/chain.oggbin0 -> 63610 bytes
-rw-r--r--dom/media/test/chain.ogg^headers^1
-rw-r--r--dom/media/test/chain.ogvbin0 -> 45463 bytes
-rw-r--r--dom/media/test/chain.ogv^headers^1
-rw-r--r--dom/media/test/chain.opusbin0 -> 50101 bytes
-rw-r--r--dom/media/test/chain.opus^headers^1
-rw-r--r--dom/media/test/chained-audio-video.oggbin0 -> 92552 bytes
-rw-r--r--dom/media/test/chained-audio-video.ogg^headers^1
-rw-r--r--dom/media/test/chained-video.ogvbin0 -> 57906 bytes
-rw-r--r--dom/media/test/chained-video.ogv^headers^1
-rw-r--r--dom/media/test/contentType.sjs77
-rw-r--r--dom/media/test/crashtests/0-timescale.html14
-rw-r--r--dom/media/test/crashtests/0-timescale.mp4bin0 -> 14718 bytes
-rw-r--r--dom/media/test/crashtests/1012609.html9
-rw-r--r--dom/media/test/crashtests/1015662.html4
-rw-r--r--dom/media/test/crashtests/1020205.html22
-rw-r--r--dom/media/test/crashtests/1028458.html23
-rw-r--r--dom/media/test/crashtests/1041466.html21
-rw-r--r--dom/media/test/crashtests/1045650.html18
-rw-r--r--dom/media/test/crashtests/1080986.html3
-rw-r--r--dom/media/test/crashtests/1080986.wavbin0 -> 592 bytes
-rw-r--r--dom/media/test/crashtests/1122218.html24
-rw-r--r--dom/media/test/crashtests/1127188.html3
-rw-r--r--dom/media/test/crashtests/1157994.html21
-rw-r--r--dom/media/test/crashtests/1158427.html21
-rw-r--r--dom/media/test/crashtests/1185176.html24
-rw-r--r--dom/media/test/crashtests/1185192.html18
-rw-r--r--dom/media/test/crashtests/1223670.html23
-rw-r--r--dom/media/test/crashtests/1228484.html13
-rw-r--r--dom/media/test/crashtests/1236639.html9
-rw-r--r--dom/media/test/crashtests/1236639.mp3bin0 -> 1080 bytes
-rw-r--r--dom/media/test/crashtests/1291702.html72
-rw-r--r--dom/media/test/crashtests/1304948.html33
-rw-r--r--dom/media/test/crashtests/1319486.html27
-rw-r--r--dom/media/test/crashtests/459439-1.html36
-rw-r--r--dom/media/test/crashtests/466607-1.html14
-rw-r--r--dom/media/test/crashtests/466945-1.html25
-rw-r--r--dom/media/test/crashtests/468763-1.html1
-rw-r--r--dom/media/test/crashtests/474744-1.html15
-rw-r--r--dom/media/test/crashtests/481136-1.html3
-rw-r--r--dom/media/test/crashtests/492286-1.xhtml1
-rw-r--r--dom/media/test/crashtests/493915-1.html18
-rw-r--r--dom/media/test/crashtests/495794-1.html8
-rw-r--r--dom/media/test/crashtests/495794-1.oggbin0 -> 4837 bytes
-rw-r--r--dom/media/test/crashtests/576612-1.html15
-rw-r--r--dom/media/test/crashtests/691096-1.html31
-rw-r--r--dom/media/test/crashtests/752784-1.html15
-rw-r--r--dom/media/test/crashtests/789075-1.html9
-rw-r--r--dom/media/test/crashtests/789075.webmbin0 -> 12294 bytes
-rw-r--r--dom/media/test/crashtests/795892-1.html23
-rw-r--r--dom/media/test/crashtests/844563.html5
-rw-r--r--dom/media/test/crashtests/846612.html8
-rw-r--r--dom/media/test/crashtests/852838.html11
-rw-r--r--dom/media/test/crashtests/865537-1.html13
-rw-r--r--dom/media/test/crashtests/868504.html14
-rw-r--r--dom/media/test/crashtests/874869.html15
-rw-r--r--dom/media/test/crashtests/874915.html24
-rw-r--r--dom/media/test/crashtests/874934.html23
-rw-r--r--dom/media/test/crashtests/874952.html11
-rw-r--r--dom/media/test/crashtests/875144.html81
-rw-r--r--dom/media/test/crashtests/875596.html12
-rw-r--r--dom/media/test/crashtests/875911.html3
-rw-r--r--dom/media/test/crashtests/876024-1.html5
-rw-r--r--dom/media/test/crashtests/876024-2.html17
-rw-r--r--dom/media/test/crashtests/876118.html16
-rw-r--r--dom/media/test/crashtests/876207.html30
-rw-r--r--dom/media/test/crashtests/876215.html14
-rw-r--r--dom/media/test/crashtests/876249.html27
-rw-r--r--dom/media/test/crashtests/876252.html23
-rw-r--r--dom/media/test/crashtests/876834.html4
-rw-r--r--dom/media/test/crashtests/877527.html37
-rw-r--r--dom/media/test/crashtests/877820.html4
-rw-r--r--dom/media/test/crashtests/878014.html31
-rw-r--r--dom/media/test/crashtests/878328.html5
-rw-r--r--dom/media/test/crashtests/878407.html11
-rw-r--r--dom/media/test/crashtests/878478.html30
-rw-r--r--dom/media/test/crashtests/880129.html9
-rw-r--r--dom/media/test/crashtests/880202.html33
-rw-r--r--dom/media/test/crashtests/880342-1.html208
-rw-r--r--dom/media/test/crashtests/880342-2.html8
-rw-r--r--dom/media/test/crashtests/880384.html8
-rw-r--r--dom/media/test/crashtests/880404.html6
-rw-r--r--dom/media/test/crashtests/880724.html13
-rw-r--r--dom/media/test/crashtests/881775.html25
-rw-r--r--dom/media/test/crashtests/882549.html13
-rw-r--r--dom/media/test/crashtests/882956.html15
-rw-r--r--dom/media/test/crashtests/884459.html12
-rw-r--r--dom/media/test/crashtests/889042.html4
-rw-r--r--dom/media/test/crashtests/894104.html20
-rw-r--r--dom/media/test/crashtests/907986-1.html17
-rw-r--r--dom/media/test/crashtests/907986-2.html17
-rw-r--r--dom/media/test/crashtests/907986-3.html17
-rw-r--r--dom/media/test/crashtests/907986-4.html15
-rw-r--r--dom/media/test/crashtests/910171-1.html17
-rw-r--r--dom/media/test/crashtests/920987.html6
-rw-r--r--dom/media/test/crashtests/925619-1.html14
-rw-r--r--dom/media/test/crashtests/925619-2.html15
-rw-r--r--dom/media/test/crashtests/926619.html24
-rw-r--r--dom/media/test/crashtests/933151.html16
-rw-r--r--dom/media/test/crashtests/933156.html23
-rw-r--r--dom/media/test/crashtests/944851.html17
-rw-r--r--dom/media/test/crashtests/952756.html19
-rw-r--r--dom/media/test/crashtests/966636.html45
-rw-r--r--dom/media/test/crashtests/986901.html16
-rw-r--r--dom/media/test/crashtests/990794.html22
-rw-r--r--dom/media/test/crashtests/995289.html9
-rw-r--r--dom/media/test/crashtests/analyser-channels-1.html16
-rw-r--r--dom/media/test/crashtests/audiocontext-double-suspend.html5
-rw-r--r--dom/media/test/crashtests/buffer-source-duration-1.html14
-rw-r--r--dom/media/test/crashtests/buffer-source-ended-1.html16
-rw-r--r--dom/media/test/crashtests/buffer-source-resampling-start-1.html16
-rw-r--r--dom/media/test/crashtests/cors.webmbin0 -> 215529 bytes
-rw-r--r--dom/media/test/crashtests/cors.webm^headers^1
-rw-r--r--dom/media/test/crashtests/crashtests.list103
-rw-r--r--dom/media/test/crashtests/disconnect-wrong-destination.html13
-rw-r--r--dom/media/test/crashtests/doppler-1.html23
-rw-r--r--dom/media/test/crashtests/media-element-source-seek-1.html27
-rw-r--r--dom/media/test/crashtests/offline-buffer-source-ended-1.html15
-rw-r--r--dom/media/test/crashtests/oscillator-ended-1.html15
-rw-r--r--dom/media/test/crashtests/oscillator-ended-2.html15
-rw-r--r--dom/media/test/crashtests/sound.oggbin0 -> 2603 bytes
-rw-r--r--dom/media/test/crashtests/video-crash.webmbin0 -> 58482 bytes
-rw-r--r--dom/media/test/crashtests/video-replay-after-audio-end.html43
-rw-r--r--dom/media/test/dash/dash-manifest-garbled-webm.mpd35
-rw-r--r--dom/media/test/dash/dash-manifest-garbled.mpd1
-rw-r--r--dom/media/test/dash/dash-manifest-sjs.mpd35
-rw-r--r--dom/media/test/dash/dash-manifest.mpd35
-rw-r--r--dom/media/test/dash/dash-webm-audio-128k.webmbin0 -> 41946 bytes
-rw-r--r--dom/media/test/dash/dash-webm-video-320x180.webmbin0 -> 35123 bytes
-rw-r--r--dom/media/test/dash/dash-webm-video-428x240.webmbin0 -> 50206 bytes
-rw-r--r--dom/media/test/dash/garbled.webm1
-rw-r--r--dom/media/test/dash_detect_stream_switch.sjs114
-rw-r--r--dom/media/test/detodos-recorder-test.opusbin0 -> 1507 bytes
-rw-r--r--dom/media/test/detodos-recorder-test.opus^headers^1
-rw-r--r--dom/media/test/detodos-short.opusbin0 -> 648 bytes
-rw-r--r--dom/media/test/detodos-short.opus^headers^1
-rw-r--r--dom/media/test/detodos-short.webmbin0 -> 1085 bytes
-rw-r--r--dom/media/test/detodos-short.webm^headers^1
-rw-r--r--dom/media/test/detodos.opusbin0 -> 6270 bytes
-rw-r--r--dom/media/test/detodos.opus^headers^1
-rw-r--r--dom/media/test/detodos.webmbin0 -> 11701 bytes
-rw-r--r--dom/media/test/detodos.webm^headers^1
-rw-r--r--dom/media/test/dirac.oggbin0 -> 106338 bytes
-rw-r--r--dom/media/test/dirac.ogg^headers^1
-rw-r--r--dom/media/test/dynamic_redirect.sjs67
-rw-r--r--dom/media/test/dynamic_resource.sjs48
-rw-r--r--dom/media/test/eme.js495
-rw-r--r--dom/media/test/external/MANIFEST.in4
-rw-r--r--dom/media/test/external/README.md5
-rw-r--r--dom/media/test/external/docs/Makefile216
-rw-r--r--dom/media/test/external/docs/conf.py297
-rw-r--r--dom/media/test/external/docs/external_media_harness.rst19
-rw-r--r--dom/media/test/external/docs/external_media_tests.media_tests.video_puppeteer.rst27
-rw-r--r--dom/media/test/external/docs/external_media_tests.media_tests.youtube_puppeteer.rst26
-rw-r--r--dom/media/test/external/docs/external_media_tests.rst26
-rw-r--r--dom/media/test/external/docs/index.rst33
-rw-r--r--dom/media/test/external/docs/make.bat263
-rw-r--r--dom/media/test/external/external_media_harness/__init__.py5
-rw-r--r--dom/media/test/external/external_media_harness/runtests.py103
-rw-r--r--dom/media/test/external/external_media_harness/testcase.py362
-rw-r--r--dom/media/test/external/external_media_tests/__init__.py10
-rw-r--r--dom/media/test/external/external_media_tests/manifest.ini1
-rw-r--r--dom/media/test/external/external_media_tests/media_utils/__init__.py0
-rw-r--r--dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py448
-rw-r--r--dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py496
-rw-r--r--dom/media/test/external/external_media_tests/playback/eme.ini1
-rw-r--r--dom/media/test/external/external_media_tests/playback/limiting_bandwidth.ini2
-rw-r--r--dom/media/test/external/external_media_tests/playback/manifest.ini1
-rw-r--r--dom/media/test/external/external_media_tests/playback/netflix_limiting_bandwidth.ini1
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_eme_playback.py18
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py24
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_full_playback.py25
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py17
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_shaka_playback.py42
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py15
-rw-r--r--dom/media/test/external/external_media_tests/playback/test_video_playback.py15
-rw-r--r--dom/media/test/external/external_media_tests/playback/youtube/manifest.ini1
-rw-r--r--dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py74
-rw-r--r--dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py46
-rw-r--r--dom/media/test/external/external_media_tests/resources/mozilla.html45
-rw-r--r--dom/media/test/external/external_media_tests/test_example.py21
-rw-r--r--dom/media/test/external/external_media_tests/urls/default.ini9
-rw-r--r--dom/media/test/external/external_media_tests/urls/netflix/default.ini8
-rw-r--r--dom/media/test/external/external_media_tests/urls/shaka-player/default.ini30
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/archive/crash_videos.ini25
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/archive/other_videos.ini19
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/archive/video_data.ini21
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/archive/youtube.ini38
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/long1-720.ini5
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/long2-crashes-720.ini39
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/long3-crashes-900.ini86
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/medium1-60.ini18
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/short1-10.ini13
-rw-r--r--dom/media/test/external/external_media_tests/urls/youtube/short2-crashes-15.ini17
-rw-r--r--dom/media/test/external/external_media_tests/utils.py68
-rw-r--r--dom/media/test/external/mach_commands.py74
-rw-r--r--dom/media/test/external/requirements-docs.txt5
-rw-r--r--dom/media/test/external/requirements.txt5
-rw-r--r--dom/media/test/external/setup.py42
-rw-r--r--dom/media/test/file_access_controls.html156
-rwxr-xr-xdom/media/test/flac-noheader-s16.flacbin0 -> 242826 bytes
-rw-r--r--dom/media/test/flac-noheader-s16.flac^headers^1
-rw-r--r--dom/media/test/flac-s24.flacbin0 -> 980951 bytes
-rw-r--r--dom/media/test/flac-s24.flac^headers^1
-rw-r--r--dom/media/test/fragment_noplay.js14
-rw-r--r--dom/media/test/fragment_play.js67
-rw-r--r--dom/media/test/gizmo-frag.mp4bin0 -> 152132 bytes
-rw-r--r--dom/media/test/gizmo-noaudio.mp4bin0 -> 342980 bytes
-rw-r--r--dom/media/test/gizmo-noaudio.mp4^headers^1
-rw-r--r--dom/media/test/gizmo-noaudio.webmbin0 -> 112663 bytes
-rw-r--r--dom/media/test/gizmo-noaudio.webm^headers^1
-rw-r--r--dom/media/test/gizmo-short.mp4bin0 -> 29905 bytes
-rw-r--r--dom/media/test/gizmo-short.mp4^headers^1
-rw-r--r--dom/media/test/gizmo.mp4bin0 -> 455255 bytes
-rw-r--r--dom/media/test/gizmo.mp4^headers^1
-rw-r--r--dom/media/test/gizmo.webmbin0 -> 159035 bytes
-rw-r--r--dom/media/test/gizmo.webm^headers^1
-rw-r--r--dom/media/test/graph_latency.py104
-rw-r--r--dom/media/test/huge-id3.mp3bin0 -> 141774 bytes
-rw-r--r--dom/media/test/huge-id3.mp3^headers^1
-rw-r--r--dom/media/test/id3tags.mp3bin0 -> 3530 bytes
-rw-r--r--dom/media/test/id3tags.mp3^headers^1
-rw-r--r--dom/media/test/invalid-cmap-s0c0.opusbin0 -> 6835 bytes
-rw-r--r--dom/media/test/invalid-cmap-s0c0.opus^headers^1
-rw-r--r--dom/media/test/invalid-cmap-s0c2.opusbin0 -> 6834 bytes
-rw-r--r--dom/media/test/invalid-cmap-s0c2.opus^headers^1
-rw-r--r--dom/media/test/invalid-cmap-s1c2.opusbin0 -> 6848 bytes
-rw-r--r--dom/media/test/invalid-cmap-s1c2.opus^headers^1
-rw-r--r--dom/media/test/invalid-cmap-short.opusbin0 -> 6854 bytes
-rw-r--r--dom/media/test/invalid-cmap-short.opus^headers^1
-rw-r--r--dom/media/test/invalid-discard_on_multi_blocks.webmbin0 -> 19636 bytes
-rw-r--r--dom/media/test/invalid-discard_on_multi_blocks.webm^headers^1
-rw-r--r--dom/media/test/invalid-excess_discard.webmbin0 -> 18442 bytes
-rw-r--r--dom/media/test/invalid-excess_discard.webm^headers^1
-rw-r--r--dom/media/test/invalid-excess_neg_discard.webmbin0 -> 18442 bytes
-rw-r--r--dom/media/test/invalid-excess_neg_discard.webm^headers^1
-rw-r--r--dom/media/test/invalid-m0c0.opusbin0 -> 2471 bytes
-rw-r--r--dom/media/test/invalid-m0c0.opus^headers^1
-rw-r--r--dom/media/test/invalid-m0c3.opusbin0 -> 2471 bytes
-rw-r--r--dom/media/test/invalid-m0c3.opus^headers^1
-rw-r--r--dom/media/test/invalid-m1c0.opusbin0 -> 6836 bytes
-rw-r--r--dom/media/test/invalid-m1c0.opus^headers^1
-rw-r--r--dom/media/test/invalid-m1c9.opusbin0 -> 6836 bytes
-rw-r--r--dom/media/test/invalid-m1c9.opus^headers^1
-rw-r--r--dom/media/test/invalid-m2c0.opusbin0 -> 2471 bytes
-rw-r--r--dom/media/test/invalid-m2c0.opus^headers^1
-rw-r--r--dom/media/test/invalid-m2c1.opusbin0 -> 2455 bytes
-rw-r--r--dom/media/test/invalid-m2c1.opus^headers^1
-rw-r--r--dom/media/test/invalid-neg_discard.webmbin0 -> 18442 bytes
-rw-r--r--dom/media/test/invalid-neg_discard.webm^headers^1
-rw-r--r--dom/media/test/invalid-preskip.webmbin0 -> 7251 bytes
-rw-r--r--dom/media/test/invalid-preskip.webm^headers^1
-rw-r--r--dom/media/test/long.vtt8001
-rw-r--r--dom/media/test/make-headers.sh18
-rw-r--r--dom/media/test/manifest.js1725
-rw-r--r--dom/media/test/mochitest.ini922
-rw-r--r--dom/media/test/multiple-bos-more-header-fileds.oggbin0 -> 27527 bytes
-rw-r--r--dom/media/test/multiple-bos-more-header-fileds.ogg^headers^1
-rw-r--r--dom/media/test/multiple-bos.oggbin0 -> 33045 bytes
-rw-r--r--dom/media/test/multiple-bos.ogg^headers^1
-rw-r--r--dom/media/test/no-cues.webmbin0 -> 220609 bytes
-rw-r--r--dom/media/test/no-cues.webm^headers^1
-rw-r--r--dom/media/test/notags.mp3bin0 -> 2506 bytes
-rw-r--r--dom/media/test/notags.mp3^headers^1
-rw-r--r--dom/media/test/owl-funnier-id3.mp3bin0 -> 69603 bytes
-rw-r--r--dom/media/test/owl-funnier-id3.mp3^headers^1
-rw-r--r--dom/media/test/owl-funny-id3.mp3bin0 -> 71696 bytes
-rw-r--r--dom/media/test/owl-funny-id3.mp3^headers^1
-rw-r--r--dom/media/test/owl-short.mp3bin0 -> 11016 bytes
-rw-r--r--dom/media/test/owl-short.mp3^headers^1
-rw-r--r--dom/media/test/owl.mp3bin0 -> 67430 bytes
-rw-r--r--dom/media/test/owl.mp3^headers^1
-rw-r--r--dom/media/test/parser.vtt6
-rw-r--r--dom/media/test/pixel_aspect_ratio.mp4bin0 -> 1806042 bytes
-rw-r--r--dom/media/test/r11025_msadpcm_c1.wavbin0 -> 5978 bytes
-rw-r--r--dom/media/test/r11025_msadpcm_c1.wav^headers^1
-rw-r--r--dom/media/test/r11025_s16_c1-short.wavbin0 -> 8270 bytes
-rw-r--r--dom/media/test/r11025_s16_c1-short.wav^headers^1
-rw-r--r--dom/media/test/r11025_s16_c1.wavbin0 -> 22094 bytes
-rw-r--r--dom/media/test/r11025_s16_c1.wav^headers^1
-rw-r--r--dom/media/test/r11025_s16_c1_trailing.wavbin0 -> 22095 bytes
-rw-r--r--dom/media/test/r11025_s16_c1_trailing.wav^headers^1
-rw-r--r--dom/media/test/r11025_u8_c1.wavbin0 -> 11069 bytes
-rw-r--r--dom/media/test/r11025_u8_c1.wav^headers^1
-rw-r--r--dom/media/test/r11025_u8_c1_trunc.wavbin0 -> 20000 bytes
-rw-r--r--dom/media/test/r11025_u8_c1_trunc.wav^headers^1
-rw-r--r--dom/media/test/r16000_u8_c1_list.wavbin0 -> 68318 bytes
-rw-r--r--dom/media/test/r16000_u8_c1_list.wav^headers^1
-rw-r--r--dom/media/test/reactivate_helper.html57
-rw-r--r--dom/media/test/red-46x48.mp4bin0 -> 1548 bytes
-rw-r--r--dom/media/test/red-46x48.mp4^headers^1
-rw-r--r--dom/media/test/red-48x46.mp4bin0 -> 1548 bytes
-rw-r--r--dom/media/test/red-48x46.mp4^headers^1
-rw-r--r--dom/media/test/redirect.sjs26
-rw-r--r--dom/media/test/referer.sjs45
-rw-r--r--dom/media/test/region.vtt5
-rw-r--r--dom/media/test/resolution-change.webmbin0 -> 7166 bytes
-rw-r--r--dom/media/test/resolution-change.webm^headers^1
-rw-r--r--dom/media/test/sample-fisbone-skeleton4.ogvbin0 -> 8747 bytes
-rw-r--r--dom/media/test/sample-fisbone-skeleton4.ogv^headers^1
-rw-r--r--dom/media/test/sample-fisbone-wrong-header.ogvbin0 -> 8703 bytes
-rw-r--r--dom/media/test/sample-fisbone-wrong-header.ogv^headers^1
-rw-r--r--dom/media/test/sample.3g2bin0 -> 28561 bytes
-rw-r--r--dom/media/test/sample.3gpbin0 -> 28561 bytes
-rw-r--r--dom/media/test/seek-short.ogvbin0 -> 79921 bytes
-rw-r--r--dom/media/test/seek-short.ogv^headers^1
-rw-r--r--dom/media/test/seek-short.webmbin0 -> 19267 bytes
-rw-r--r--dom/media/test/seek-short.webm^headers^1
-rw-r--r--dom/media/test/seek.ogvbin0 -> 285310 bytes
-rw-r--r--dom/media/test/seek.ogv^headers^1
-rw-r--r--dom/media/test/seek.webmbin0 -> 215529 bytes
-rw-r--r--dom/media/test/seek.webm^headers^1
-rw-r--r--dom/media/test/seek.yuvbin0 -> 1267408 bytes
-rw-r--r--dom/media/test/seekLies.sjs23
-rw-r--r--dom/media/test/seek_support.js55
-rw-r--r--dom/media/test/seek_with_sound.oggbin0 -> 299507 bytes
-rw-r--r--dom/media/test/seek_with_sound.ogg^headers^1
-rw-r--r--dom/media/test/sequential.vtt10
-rw-r--r--dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4bin0 -> 9261 bytes
-rw-r--r--dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4^headers^1
-rw-r--r--dom/media/test/short-cenc.mp4bin0 -> 14860 bytes
-rw-r--r--dom/media/test/short-cenc.xml37
-rw-r--r--dom/media/test/short-video.ogvbin0 -> 16049 bytes
-rw-r--r--dom/media/test/short-video.ogv^headers^1
-rw-r--r--dom/media/test/short.mp4bin0 -> 13651 bytes
-rw-r--r--dom/media/test/short.mp4^headers^1
-rw-r--r--dom/media/test/sine.webmbin0 -> 17510 bytes
-rw-r--r--dom/media/test/sine.webm^headers^1
-rw-r--r--dom/media/test/small-shot-mp3.mp4bin0 -> 7491 bytes
-rw-r--r--dom/media/test/small-shot-mp3.mp4^headers^1
-rw-r--r--dom/media/test/small-shot.flacbin0 -> 16430 bytes
-rw-r--r--dom/media/test/small-shot.m4abin0 -> 2710 bytes
-rw-r--r--dom/media/test/small-shot.mp3bin0 -> 6825 bytes
-rw-r--r--dom/media/test/small-shot.mp3^headers^1
-rw-r--r--dom/media/test/small-shot.oggbin0 -> 6416 bytes
-rw-r--r--dom/media/test/small-shot.ogg^headers^1
-rw-r--r--dom/media/test/sound.oggbin0 -> 2603 bytes
-rw-r--r--dom/media/test/sound.ogg^headers^1
-rw-r--r--dom/media/test/spacestorm-1000Hz-100ms.oggbin0 -> 3270 bytes
-rw-r--r--dom/media/test/spacestorm-1000Hz-100ms.ogg^headers^1
-rw-r--r--dom/media/test/split.webmbin0 -> 105755 bytes
-rw-r--r--dom/media/test/split.webm^headers^1
-rw-r--r--dom/media/test/street.mp4bin0 -> 1505751 bytes
-rw-r--r--dom/media/test/street.mp4^headers^1
-rw-r--r--dom/media/test/test-1-mono.opusbin0 -> 4086 bytes
-rw-r--r--dom/media/test/test-1-mono.opus^headers^1
-rw-r--r--dom/media/test/test-2-stereo.opusbin0 -> 24973 bytes
-rw-r--r--dom/media/test/test-2-stereo.opus^headers^1
-rw-r--r--dom/media/test/test-3-LCR.opusbin0 -> 39471 bytes
-rw-r--r--dom/media/test/test-3-LCR.opus^headers^1
-rw-r--r--dom/media/test/test-4-quad.opusbin0 -> 129906 bytes
-rw-r--r--dom/media/test/test-4-quad.opus^headers^1
-rw-r--r--dom/media/test/test-5-5.0.opusbin0 -> 164935 bytes
-rw-r--r--dom/media/test/test-5-5.0.opus^headers^1
-rw-r--r--dom/media/test/test-6-5.1.opusbin0 -> 288195 bytes
-rw-r--r--dom/media/test/test-6-5.1.opus^headers^1
-rw-r--r--dom/media/test/test-7-6.1.opusbin0 -> 401668 bytes
-rw-r--r--dom/media/test/test-7-6.1.opus^headers^1
-rw-r--r--dom/media/test/test-8-7.1.opusbin0 -> 543119 bytes
-rw-r--r--dom/media/test/test-8-7.1.opus^headers^1
-rw-r--r--dom/media/test/test_VideoPlaybackQuality.html64
-rw-r--r--dom/media/test/test_VideoPlaybackQuality_disabled.html37
-rw-r--r--dom/media/test/test_access_control.html52
-rw-r--r--dom/media/test/test_aspectratio_mp4.html52
-rw-r--r--dom/media/test/test_audio1.html33
-rw-r--r--dom/media/test/test_audio2.html33
-rw-r--r--dom/media/test/test_audioDocumentTitle.html56
-rw-r--r--dom/media/test/test_autoplay.html35
-rw-r--r--dom/media/test/test_autoplay_contentEditable.html67
-rw-r--r--dom/media/test/test_background_video_no_suspend_disabled.html36
-rw-r--r--dom/media/test/test_background_video_no_suspend_short_vid.html38
-rw-r--r--dom/media/test/test_background_video_suspend.html50
-rw-r--r--dom/media/test/test_background_video_suspend_ends.html39
-rw-r--r--dom/media/test/test_buffered.html119
-rw-r--r--dom/media/test/test_bug1018933.html50
-rw-r--r--dom/media/test/test_bug1113600.html50
-rw-r--r--dom/media/test/test_bug1242338.html66
-rw-r--r--dom/media/test/test_bug1242594.html46
-rw-r--r--dom/media/test/test_bug1248229.html34
-rw-r--r--dom/media/test/test_bug448534.html71
-rw-r--r--dom/media/test/test_bug463162.xhtml78
-rw-r--r--dom/media/test/test_bug465498.html83
-rw-r--r--dom/media/test/test_bug495145.html99
-rw-r--r--dom/media/test/test_bug495300.html63
-rw-r--r--dom/media/test/test_bug654550.html84
-rw-r--r--dom/media/test/test_bug686942.html72
-rw-r--r--dom/media/test/test_bug726904.html56
-rw-r--r--dom/media/test/test_bug874897.html68
-rw-r--r--dom/media/test/test_bug879717.html134
-rw-r--r--dom/media/test/test_bug883173.html59
-rw-r--r--dom/media/test/test_bug895091.html60
-rw-r--r--dom/media/test/test_bug895305.html41
-rw-r--r--dom/media/test/test_bug919265.html30
-rw-r--r--dom/media/test/test_bug957847.html30
-rw-r--r--dom/media/test/test_can_play_type.html40
-rw-r--r--dom/media/test/test_can_play_type_mpeg.html167
-rw-r--r--dom/media/test/test_can_play_type_no_ogg.html42
-rw-r--r--dom/media/test/test_can_play_type_ogg.html37
-rw-r--r--dom/media/test/test_can_play_type_wave.html30
-rw-r--r--dom/media/test/test_can_play_type_webm.html29
-rw-r--r--dom/media/test/test_chaining.html87
-rw-r--r--dom/media/test/test_clone_media_element.html54
-rw-r--r--dom/media/test/test_closing_connections.html58
-rw-r--r--dom/media/test/test_constants.html228
-rw-r--r--dom/media/test/test_controls.html33
-rw-r--r--dom/media/test/test_cueless_webm_seek-1.html136
-rw-r--r--dom/media/test/test_cueless_webm_seek-2.html126
-rw-r--r--dom/media/test/test_cueless_webm_seek-3.html122
-rw-r--r--dom/media/test/test_currentTime.html19
-rw-r--r--dom/media/test/test_decode_error.html66
-rw-r--r--dom/media/test/test_decoder_disable.html78
-rw-r--r--dom/media/test/test_defaultMuted.html54
-rw-r--r--dom/media/test/test_delay_load.html108
-rw-r--r--dom/media/test/test_eme_canvas_blocked.html58
-rw-r--r--dom/media/test/test_eme_detach_media_keys.html63
-rw-r--r--dom/media/test/test_eme_initDataTypes.html133
-rw-r--r--dom/media/test/test_eme_missing_pssh.html92
-rw-r--r--dom/media/test/test_eme_non_mse_fails.html103
-rw-r--r--dom/media/test/test_eme_playback.html188
-rw-r--r--dom/media/test/test_eme_requestKeySystemAccess.html484
-rw-r--r--dom/media/test/test_eme_request_notifications.html88
-rw-r--r--dom/media/test/test_eme_session_callable_value.html35
-rw-r--r--dom/media/test/test_eme_setMediaKeys_before_attach_MediaSource.html41
-rw-r--r--dom/media/test/test_eme_stream_capture_blocked_case1.html52
-rw-r--r--dom/media/test/test_eme_stream_capture_blocked_case2.html55
-rw-r--r--dom/media/test/test_eme_stream_capture_blocked_case3.html54
-rw-r--r--dom/media/test/test_eme_waitingforkey.html117
-rw-r--r--dom/media/test/test_empty_resource.html58
-rw-r--r--dom/media/test/test_error_in_video_document.html68
-rw-r--r--dom/media/test/test_error_on_404.html84
-rw-r--r--dom/media/test/test_fastSeek-forwards.html77
-rw-r--r--dom/media/test/test_fastSeek.html88
-rw-r--r--dom/media/test/test_fragment_noplay.html135
-rw-r--r--dom/media/test/test_fragment_play.html92
-rw-r--r--dom/media/test/test_gmp_playback.html40
-rw-r--r--dom/media/test/test_imagecapture.html156
-rw-r--r--dom/media/test/test_info_leak.html169
-rw-r--r--dom/media/test/test_invalid_reject.html58
-rw-r--r--dom/media/test/test_invalid_reject_play.html44
-rw-r--r--dom/media/test/test_invalid_seek.html32
-rw-r--r--dom/media/test/test_load.html226
-rw-r--r--dom/media/test/test_load_candidates.html84
-rw-r--r--dom/media/test/test_load_same_resource.html100
-rw-r--r--dom/media/test/test_load_source.html76
-rw-r--r--dom/media/test/test_loop.html61
-rw-r--r--dom/media/test/test_media_selection.html146
-rw-r--r--dom/media/test/test_media_sniffer.html67
-rw-r--r--dom/media/test/test_mediarecorder_avoid_recursion.html51
-rw-r--r--dom/media/test/test_mediarecorder_bitrate.html128
-rw-r--r--dom/media/test/test_mediarecorder_creation.html45
-rw-r--r--dom/media/test/test_mediarecorder_creation_fail.html66
-rw-r--r--dom/media/test/test_mediarecorder_getencodeddata.html67
-rw-r--r--dom/media/test/test_mediarecorder_principals.html119
-rw-r--r--dom/media/test/test_mediarecorder_record_4ch_audiocontext.html80
-rw-r--r--dom/media/test/test_mediarecorder_record_audiocontext.html66
-rw-r--r--dom/media/test/test_mediarecorder_record_audiocontext_mlk.html24
-rw-r--r--dom/media/test/test_mediarecorder_record_audionode.html126
-rw-r--r--dom/media/test/test_mediarecorder_record_canvas_captureStream.html73
-rw-r--r--dom/media/test/test_mediarecorder_record_changing_video_resolution.html69
-rw-r--r--dom/media/test/test_mediarecorder_record_getdata_afterstart.html79
-rw-r--r--dom/media/test/test_mediarecorder_record_gum_video_timeslice.html87
-rw-r--r--dom/media/test/test_mediarecorder_record_immediate_stop.html122
-rw-r--r--dom/media/test/test_mediarecorder_record_no_timeslice.html105
-rw-r--r--dom/media/test/test_mediarecorder_record_session.html75
-rw-r--r--dom/media/test/test_mediarecorder_record_startstopstart.html77
-rw-r--r--dom/media/test/test_mediarecorder_record_stopms.html47
-rw-r--r--dom/media/test/test_mediarecorder_record_timeslice.html104
-rw-r--r--dom/media/test/test_mediarecorder_reload_crash.html27
-rw-r--r--dom/media/test/test_mediarecorder_state_transition.html171
-rw-r--r--dom/media/test/test_mediarecorder_unsupported_src.html99
-rw-r--r--dom/media/test/test_mediarecorder_webm_support.html18
-rw-r--r--dom/media/test/test_mediatrack_consuming_mediaresource.html181
-rw-r--r--dom/media/test/test_mediatrack_consuming_mediastream.html155
-rw-r--r--dom/media/test/test_mediatrack_events.html133
-rw-r--r--dom/media/test/test_mediatrack_parsing_ogg.html72
-rw-r--r--dom/media/test/test_mediatrack_replay_from_end.html146
-rw-r--r--dom/media/test/test_metadata.html81
-rw-r--r--dom/media/test/test_mixed_principals.html94
-rw-r--r--dom/media/test/test_mozHasAudio.html42
-rw-r--r--dom/media/test/test_multiple_mediastreamtracks.html46
-rw-r--r--dom/media/test/test_networkState.html47
-rw-r--r--dom/media/test/test_new_audio.html49
-rw-r--r--dom/media/test/test_no_load_event.html53
-rw-r--r--dom/media/test/test_paused.html21
-rw-r--r--dom/media/test/test_paused_after_ended.html53
-rw-r--r--dom/media/test/test_play_events.html63
-rw-r--r--dom/media/test/test_play_events_2.html60
-rw-r--r--dom/media/test/test_play_twice.html95
-rw-r--r--dom/media/test/test_playback.html123
-rw-r--r--dom/media/test/test_playback_errors.html48
-rw-r--r--dom/media/test/test_playback_rate.html175
-rw-r--r--dom/media/test/test_playback_rate_playpause.html66
-rw-r--r--dom/media/test/test_playback_reactivate.html97
-rw-r--r--dom/media/test/test_played.html250
-rw-r--r--dom/media/test/test_preload_actions.html618
-rw-r--r--dom/media/test/test_preload_attribute.html44
-rw-r--r--dom/media/test/test_preload_suspend.html112
-rw-r--r--dom/media/test/test_preserve_playbackrate_after_ui_play.html60
-rw-r--r--dom/media/test/test_progress.html52
-rw-r--r--dom/media/test/test_reactivate.html64
-rw-r--r--dom/media/test/test_readyState.html51
-rw-r--r--dom/media/test/test_referer.html88
-rw-r--r--dom/media/test/test_replay_metadata.html120
-rw-r--r--dom/media/test/test_reset_events_async.html58
-rw-r--r--dom/media/test/test_reset_src.html98
-rw-r--r--dom/media/test/test_resolution_change.html52
-rw-r--r--dom/media/test/test_resume.html47
-rw-r--r--dom/media/test/test_seek-1.html84
-rw-r--r--dom/media/test/test_seek-10.html56
-rw-r--r--dom/media/test/test_seek-11.html76
-rw-r--r--dom/media/test/test_seek-12.html59
-rw-r--r--dom/media/test/test_seek-13.html72
-rw-r--r--dom/media/test/test_seek-2.html76
-rw-r--r--dom/media/test/test_seek-3.html70
-rw-r--r--dom/media/test/test_seek-4.html70
-rw-r--r--dom/media/test/test_seek-5.html69
-rw-r--r--dom/media/test/test_seek-6.html65
-rw-r--r--dom/media/test/test_seek-7.html60
-rw-r--r--dom/media/test/test_seek-8.html42
-rw-r--r--dom/media/test/test_seek-9.html41
-rw-r--r--dom/media/test/test_seekLies.html28
-rw-r--r--dom/media/test/test_seekToNextFrame.html87
-rw-r--r--dom/media/test/test_seek_negative.html77
-rw-r--r--dom/media/test/test_seek_nosrc.html58
-rw-r--r--dom/media/test/test_seek_out_of_range.html82
-rw-r--r--dom/media/test/test_seekable1.html66
-rw-r--r--dom/media/test/test_source.html92
-rw-r--r--dom/media/test/test_source_media.html71
-rw-r--r--dom/media/test/test_source_null.html30
-rw-r--r--dom/media/test/test_source_write.html40
-rw-r--r--dom/media/test/test_standalone.html61
-rw-r--r--dom/media/test/test_streams_autoplay.html46
-rw-r--r--dom/media/test/test_streams_capture_origin.html47
-rw-r--r--dom/media/test/test_streams_element_capture.html98
-rw-r--r--dom/media/test/test_streams_element_capture_createObjectURL.html71
-rw-r--r--dom/media/test/test_streams_element_capture_playback.html47
-rw-r--r--dom/media/test/test_streams_element_capture_reset.html134
-rw-r--r--dom/media/test/test_streams_gc.html44
-rw-r--r--dom/media/test/test_streams_individual_pause.html79
-rw-r--r--dom/media/test/test_streams_srcObject.html62
-rw-r--r--dom/media/test/test_streams_tracks.html54
-rw-r--r--dom/media/test/test_temporary_file_blob_video_plays.html73
-rw-r--r--dom/media/test/test_texttrack.html126
-rw-r--r--dom/media/test/test_texttrack_moz.html66
-rw-r--r--dom/media/test/test_texttrackcue.html269
-rw-r--r--dom/media/test/test_texttrackcue_moz.html34
-rw-r--r--dom/media/test/test_texttrackevents_video.html90
-rw-r--r--dom/media/test/test_texttracklist.html51
-rw-r--r--dom/media/test/test_texttracklist_moz.html34
-rw-r--r--dom/media/test/test_texttrackregion.html64
-rw-r--r--dom/media/test/test_timeupdate_small_files.html88
-rw-r--r--dom/media/test/test_trackelementevent.html69
-rw-r--r--dom/media/test/test_trackelementsrc.html53
-rw-r--r--dom/media/test/test_trackevent.html70
-rw-r--r--dom/media/test/test_unseekable.html101
-rw-r--r--dom/media/test/test_videoDocumentTitle.html57
-rw-r--r--dom/media/test/test_video_dimensions.html96
-rw-r--r--dom/media/test/test_video_in_audio_element.html68
-rw-r--r--dom/media/test/test_video_to_canvas.html68
-rw-r--r--dom/media/test/test_volume.html41
-rw-r--r--dom/media/test/test_vttparser.html44
-rw-r--r--dom/media/test/test_wav_ended1.html43
-rw-r--r--dom/media/test/test_wav_ended2.html62
-rw-r--r--dom/media/test/test_webvtt_empty_displaystate.html86
-rw-r--r--dom/media/test/test_webvtt_positionalign.html95
-rw-r--r--dom/media/test/variable-channel.oggbin0 -> 27749 bytes
-rw-r--r--dom/media/test/variable-channel.ogg^headers^1
-rw-r--r--dom/media/test/variable-channel.opusbin0 -> 46597 bytes
-rw-r--r--dom/media/test/variable-channel.opus^headers^1
-rw-r--r--dom/media/test/variable-preskip.opusbin0 -> 17660 bytes
-rw-r--r--dom/media/test/variable-preskip.opus^headers^1
-rw-r--r--dom/media/test/variable-samplerate.oggbin0 -> 22325 bytes
-rw-r--r--dom/media/test/variable-samplerate.ogg^headers^1
-rw-r--r--dom/media/test/variable-samplerate.opusbin0 -> 28111 bytes
-rw-r--r--dom/media/test/variable-samplerate.opus^headers^1
-rw-r--r--dom/media/test/vbr-head.mp3bin0 -> 4474 bytes
-rw-r--r--dom/media/test/vbr-head.mp3^headers^1
-rw-r--r--dom/media/test/vbr.mp3bin0 -> 300553 bytes
-rw-r--r--dom/media/test/vbr.mp3^headers^1
-rw-r--r--dom/media/test/video-overhang.oggbin0 -> 301831 bytes
-rw-r--r--dom/media/test/video-overhang.ogg^headers^1
-rw-r--r--dom/media/test/vp9-short.webmbin0 -> 3107 bytes
-rw-r--r--dom/media/test/vp9-short.webm^headers^1
-rw-r--r--dom/media/test/vp9.webmbin0 -> 97465 bytes
-rw-r--r--dom/media/test/vp9.webm^headers^1
-rw-r--r--dom/media/test/vp9cake-short.webmbin0 -> 25155 bytes
-rw-r--r--dom/media/test/vp9cake-short.webm^headers^1
-rw-r--r--dom/media/test/vp9cake.webmbin0 -> 141743 bytes
-rw-r--r--dom/media/test/vp9cake.webm^headers^1
-rw-r--r--dom/media/test/vttPositionAlign.vtt25
-rw-r--r--dom/media/test/wave_metadata.wavbin0 -> 42706 bytes
-rw-r--r--dom/media/test/wave_metadata.wav^headers^1
-rw-r--r--dom/media/test/wave_metadata_bad_len.wavbin0 -> 42706 bytes
-rw-r--r--dom/media/test/wave_metadata_bad_len.wav^headers^1
-rw-r--r--dom/media/test/wave_metadata_bad_no_null.wavbin0 -> 42706 bytes
-rw-r--r--dom/media/test/wave_metadata_bad_no_null.wav^headers^1
-rw-r--r--dom/media/test/wave_metadata_bad_utf8.wavbin0 -> 42704 bytes
-rw-r--r--dom/media/test/wave_metadata_bad_utf8.wav^headers^1
-rw-r--r--dom/media/test/wave_metadata_unknown_tag.wavbin0 -> 42706 bytes
-rw-r--r--dom/media/test/wave_metadata_unknown_tag.wav^headers^1
-rw-r--r--dom/media/test/wave_metadata_utf8.wavbin0 -> 42704 bytes
-rw-r--r--dom/media/test/wave_metadata_utf8.wav^headers^1
-rw-r--r--dom/media/test/wavedata_alaw.wavbin0 -> 11067 bytes
-rw-r--r--dom/media/test/wavedata_alaw.wav^headers^1
-rw-r--r--dom/media/test/wavedata_s16.wavbin0 -> 22062 bytes
-rw-r--r--dom/media/test/wavedata_s16.wav^headers^1
-rw-r--r--dom/media/test/wavedata_s24.wavbin0 -> 33071 bytes
-rw-r--r--dom/media/test/wavedata_s24.wav^headers^1
-rw-r--r--dom/media/test/wavedata_u8.wavbin0 -> 11037 bytes
-rw-r--r--dom/media/test/wavedata_u8.wav^headers^1
-rw-r--r--dom/media/test/wavedata_ulaw.wavbin0 -> 11067 bytes
-rw-r--r--dom/media/test/wavedata_ulaw.wav^headers^1
-rw-r--r--dom/media/tests/crashtests/780790.html16
-rw-r--r--dom/media/tests/crashtests/791270.html17
-rw-r--r--dom/media/tests/crashtests/791278.html20
-rw-r--r--dom/media/tests/crashtests/791330.html35
-rw-r--r--dom/media/tests/crashtests/799419.html32
-rw-r--r--dom/media/tests/crashtests/801227.html35
-rw-r--r--dom/media/tests/crashtests/802982.html27
-rw-r--r--dom/media/tests/crashtests/812785.html70
-rw-r--r--dom/media/tests/crashtests/822197.html28
-rw-r--r--dom/media/tests/crashtests/834100.html25
-rw-r--r--dom/media/tests/crashtests/836349.html20
-rw-r--r--dom/media/tests/crashtests/837324.html25
-rw-r--r--dom/media/tests/crashtests/855796.html66
-rw-r--r--dom/media/tests/crashtests/860143.html25
-rw-r--r--dom/media/tests/crashtests/861958.html24
-rw-r--r--dom/media/tests/crashtests/863929.html66
-rw-r--r--dom/media/tests/crashtests/crashtests.list16
-rw-r--r--dom/media/tests/mochitest/NetworkPreparationChromeScript.js62
-rw-r--r--dom/media/tests/mochitest/blacksilence.js121
-rw-r--r--dom/media/tests/mochitest/dataChannel.js191
-rw-r--r--dom/media/tests/mochitest/head.js970
-rw-r--r--dom/media/tests/mochitest/identity/identityPcTest.js53
-rw-r--r--dom/media/tests/mochitest/identity/idp-bad.js1
-rw-r--r--dom/media/tests/mochitest/identity/idp-min.js24
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-http-trick.js3
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-http-trick.js^headers^2
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-http.js3
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-http.js^headers^2
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-https-double.js3
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-https-double.js^headers^2
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js3
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js^headers^2
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-https.js3
-rw-r--r--dom/media/tests/mochitest/identity/idp-redirect-https.js^headers^2
-rw-r--r--dom/media/tests/mochitest/identity/idp.js110
-rw-r--r--dom/media/tests/mochitest/identity/idp.sjs18
-rw-r--r--dom/media/tests/mochitest/identity/login.html31
-rw-r--r--dom/media/tests/mochitest/identity/mochitest.ini42
-rw-r--r--dom/media/tests/mochitest/identity/test_fingerprints.html112
-rw-r--r--dom/media/tests/mochitest/identity/test_getIdentityAssertion.html96
-rw-r--r--dom/media/tests/mochitest/identity/test_idpproxy.html176
-rw-r--r--dom/media/tests/mochitest/identity/test_loginNeeded.html71
-rw-r--r--dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html31
-rw-r--r--dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html21
-rw-r--r--dom/media/tests/mochitest/identity/test_setIdentityProvider.html63
-rw-r--r--dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html55
-rw-r--r--dom/media/tests/mochitest/mediaStreamPlayback.js252
-rw-r--r--dom/media/tests/mochitest/mochitest.ini272
-rw-r--r--dom/media/tests/mochitest/network.js20
-rw-r--r--dom/media/tests/mochitest/nonTrickleIce.js71
-rw-r--r--dom/media/tests/mochitest/pc.js1878
-rw-r--r--dom/media/tests/mochitest/sdpUtils.js148
-rw-r--r--dom/media/tests/mochitest/steeplechase.ini11
-rw-r--r--dom/media/tests/mochitest/steeplechase_long/long.js217
-rw-r--r--dom/media/tests/mochitest/steeplechase_long/steeplechase_long.ini12
-rw-r--r--dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudioVideoCombined_long.html38
-rw-r--r--dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudio_long.html38
-rw-r--r--dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicVideo_long.html38
-rw-r--r--dom/media/tests/mochitest/templates.js525
-rw-r--r--dom/media/tests/mochitest/test_a_noOp.html32
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_basicAudio.html25
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html26
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html26
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html27
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html24
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_basicVideo.html25
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_bug1013809.html27
-rw-r--r--dom/media/tests/mochitest/test_dataChannel_noOffer.html32
-rw-r--r--dom/media/tests/mochitest/test_enumerateDevices.html134
-rw-r--r--dom/media/tests/mochitest/test_enumerateDevices_iframe.html23
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_active_autoplay.html61
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html169
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html110
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_audioCapture.html109
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicAudio.html27
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html87
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicTabshare.html70
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicVideo.html30
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html30
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html42
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html42
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_bug1223696.html52
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_callbacks.html35
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_constraints.html153
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_getTrackById.html50
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html39
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html39
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html117
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html185
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html130
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html251
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html171
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html170
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html38
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html25
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html26
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html26
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_scarySources.html66
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_spinEventLoop.html28
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html27
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html35
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html28
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html38
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html28
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html35
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_trackCloneCleanup.html30
-rw-r--r--dom/media/tests/mochitest/test_getUserMedia_trackEnded.html60
-rw-r--r--dom/media/tests/mochitest/test_ondevicechange.html80
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html54
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addDataChannel.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html45
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html103
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html42
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html42
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html80
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html59
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudio.html25
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html36
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html44
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html37
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html41
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html39
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html35
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html24
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html24
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html25
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html39
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html38
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicH264Video.html25
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html36
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicVideo.html23
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html36
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug1013809.html25
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug1042791.html36
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug1064223.html31
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug1227781.html33
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug822674.html27
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug825703.html162
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug827843.html70
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_bug834153.html37
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_callbacks.html92
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html60
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html114
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_capturedVideo.html87
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_certificates.html180
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_close.html147
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html79
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_constructedStream.html70
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_errorCallbacks.html59
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html42
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_iceFailure.html83
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_insertDTMF.html79
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html57
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_localRollback.html51
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html99
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html25
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html25
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html26
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html23
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html23
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html23
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html63
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_relayOnly.html61
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html69
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_remoteRollback.html55
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html39
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html42
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html39
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html42
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html35
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html85
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_replaceTrack.html177
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html46
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_restartIce.html41
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html98
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html74
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html43
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html44
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html43
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_scaleResolution.html85
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html33
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setParameters.html83
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html34
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html33
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html142
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html53
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_throwInCallbacks.html79
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_toJSON.html40
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_trackDisabling.html98
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html149
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html24
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html50
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html27
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html27
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html24
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html50
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html100
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html100
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html73
-rw-r--r--dom/media/tests/mochitest/test_peerConnection_webAudio.html43
-rw-r--r--dom/media/tests/mochitest/test_selftest.html38
-rw-r--r--dom/media/tests/mochitest/turnConfig.js16
-rw-r--r--dom/media/wave/WaveDecoder.cpp45
-rw-r--r--dom/media/wave/WaveDecoder.h26
-rw-r--r--dom/media/wave/WaveDemuxer.cpp898
-rw-r--r--dom/media/wave/WaveDemuxer.h262
-rw-r--r--dom/media/wave/moz.build20
-rw-r--r--dom/media/webaudio/AlignedTArray.h121
-rw-r--r--dom/media/webaudio/AlignmentUtils.h29
-rw-r--r--dom/media/webaudio/AnalyserNode.cpp387
-rw-r--r--dom/media/webaudio/AnalyserNode.h90
-rw-r--r--dom/media/webaudio/AudioBlock.cpp166
-rw-r--r--dom/media/webaudio/AudioBlock.h136
-rw-r--r--dom/media/webaudio/AudioBuffer.cpp421
-rw-r--r--dom/media/webaudio/AudioBuffer.h137
-rw-r--r--dom/media/webaudio/AudioBufferSourceNode.cpp853
-rw-r--r--dom/media/webaudio/AudioBufferSourceNode.h149
-rw-r--r--dom/media/webaudio/AudioContext.cpp1247
-rw-r--r--dom/media/webaudio/AudioContext.h382
-rw-r--r--dom/media/webaudio/AudioDestinationNode.cpp680
-rw-r--r--dom/media/webaudio/AudioDestinationNode.h115
-rw-r--r--dom/media/webaudio/AudioEventTimeline.cpp315
-rw-r--r--dom/media/webaudio/AudioEventTimeline.h474
-rw-r--r--dom/media/webaudio/AudioListener.cpp131
-rw-r--r--dom/media/webaudio/AudioListener.h133
-rw-r--r--dom/media/webaudio/AudioNode.cpp666
-rw-r--r--dom/media/webaudio/AudioNode.h294
-rw-r--r--dom/media/webaudio/AudioNodeEngine.cpp400
-rw-r--r--dom/media/webaudio/AudioNodeEngine.h410
-rw-r--r--dom/media/webaudio/AudioNodeEngineNEON.cpp318
-rw-r--r--dom/media/webaudio/AudioNodeEngineNEON.h49
-rw-r--r--dom/media/webaudio/AudioNodeEngineSSE2.cpp315
-rw-r--r--dom/media/webaudio/AudioNodeEngineSSE2.h45
-rw-r--r--dom/media/webaudio/AudioNodeExternalInputStream.cpp238
-rw-r--r--dom/media/webaudio/AudioNodeExternalInputStream.h45
-rw-r--r--dom/media/webaudio/AudioNodeStream.cpp783
-rw-r--r--dom/media/webaudio/AudioNodeStream.h239
-rw-r--r--dom/media/webaudio/AudioParam.cpp199
-rw-r--r--dom/media/webaudio/AudioParam.h246
-rw-r--r--dom/media/webaudio/AudioParamTimeline.h157
-rw-r--r--dom/media/webaudio/AudioProcessingEvent.cpp57
-rw-r--r--dom/media/webaudio/AudioProcessingEvent.h85
-rw-r--r--dom/media/webaudio/BiquadFilterNode.cpp355
-rw-r--r--dom/media/webaudio/BiquadFilterNode.h82
-rw-r--r--dom/media/webaudio/BufferDecoder.cpp77
-rw-r--r--dom/media/webaudio/BufferDecoder.h54
-rw-r--r--dom/media/webaudio/ChannelMergerNode.cpp90
-rw-r--r--dom/media/webaudio/ChannelMergerNode.h50
-rw-r--r--dom/media/webaudio/ChannelSplitterNode.cpp81
-rw-r--r--dom/media/webaudio/ChannelSplitterNode.h50
-rw-r--r--dom/media/webaudio/ConstantSourceNode.cpp286
-rw-r--r--dom/media/webaudio/ConstantSourceNode.h76
-rw-r--r--dom/media/webaudio/ConvolverNode.cpp295
-rw-r--r--dom/media/webaudio/ConvolverNode.h78
-rw-r--r--dom/media/webaudio/DelayBuffer.cpp263
-rw-r--r--dom/media/webaudio/DelayBuffer.h115
-rw-r--r--dom/media/webaudio/DelayNode.cpp234
-rw-r--r--dom/media/webaudio/DelayNode.h55
-rw-r--r--dom/media/webaudio/DynamicsCompressorNode.cpp237
-rw-r--r--dom/media/webaudio/DynamicsCompressorNode.h89
-rw-r--r--dom/media/webaudio/FFTBlock.cpp226
-rw-r--r--dom/media/webaudio/FFTBlock.h319
-rw-r--r--dom/media/webaudio/GainNode.cpp156
-rw-r--r--dom/media/webaudio/GainNode.h52
-rw-r--r--dom/media/webaudio/IIRFilterNode.cpp228
-rw-r--r--dom/media/webaudio/IIRFilterNode.h55
-rw-r--r--dom/media/webaudio/MediaBufferDecoder.cpp649
-rw-r--r--dom/media/webaudio/MediaBufferDecoder.h79
-rw-r--r--dom/media/webaudio/MediaElementAudioSourceNode.cpp40
-rw-r--r--dom/media/webaudio/MediaElementAudioSourceNode.h44
-rw-r--r--dom/media/webaudio/MediaStreamAudioDestinationNode.cpp142
-rw-r--r--dom/media/webaudio/MediaStreamAudioDestinationNode.h56
-rw-r--r--dom/media/webaudio/MediaStreamAudioSourceNode.cpp254
-rw-r--r--dom/media/webaudio/MediaStreamAudioSourceNode.h106
-rw-r--r--dom/media/webaudio/OfflineAudioCompletionEvent.cpp42
-rw-r--r--dom/media/webaudio/OfflineAudioCompletionEvent.h53
-rw-r--r--dom/media/webaudio/OscillatorNode.cpp580
-rw-r--r--dom/media/webaudio/OscillatorNode.h104
-rw-r--r--dom/media/webaudio/PannerNode.cpp786
-rw-r--r--dom/media/webaudio/PannerNode.h296
-rw-r--r--dom/media/webaudio/PanningUtils.h65
-rw-r--r--dom/media/webaudio/PeriodicWave.cpp74
-rw-r--r--dom/media/webaudio/PeriodicWave.h70
-rw-r--r--dom/media/webaudio/PlayingRefChangeHandler.h48
-rw-r--r--dom/media/webaudio/ReportDecodeResultTask.h43
-rw-r--r--dom/media/webaudio/ScriptProcessorNode.cpp573
-rw-r--r--dom/media/webaudio/ScriptProcessorNode.h147
-rw-r--r--dom/media/webaudio/StereoPannerNode.cpp211
-rw-r--r--dom/media/webaudio/StereoPannerNode.h70
-rw-r--r--dom/media/webaudio/ThreeDPoint.cpp49
-rw-r--r--dom/media/webaudio/ThreeDPoint.h89
-rw-r--r--dom/media/webaudio/WaveShaperNode.cpp392
-rw-r--r--dom/media/webaudio/WaveShaperNode.h72
-rw-r--r--dom/media/webaudio/WebAudioUtils.cpp151
-rw-r--r--dom/media/webaudio/WebAudioUtils.h238
-rw-r--r--dom/media/webaudio/blink/Biquad.cpp469
-rw-r--r--dom/media/webaudio/blink/Biquad.h108
-rw-r--r--dom/media/webaudio/blink/DenormalDisabler.h124
-rw-r--r--dom/media/webaudio/blink/DynamicsCompressor.cpp321
-rw-r--r--dom/media/webaudio/blink/DynamicsCompressor.h131
-rw-r--r--dom/media/webaudio/blink/DynamicsCompressorKernel.cpp491
-rw-r--r--dom/media/webaudio/blink/DynamicsCompressorKernel.h130
-rw-r--r--dom/media/webaudio/blink/FFTConvolver.cpp119
-rw-r--r--dom/media/webaudio/blink/FFTConvolver.h85
-rw-r--r--dom/media/webaudio/blink/HRTFDatabase.cpp130
-rw-r--r--dom/media/webaudio/blink/HRTFDatabase.h94
-rw-r--r--dom/media/webaudio/blink/HRTFDatabaseLoader.cpp223
-rw-r--r--dom/media/webaudio/blink/HRTFDatabaseLoader.h148
-rw-r--r--dom/media/webaudio/blink/HRTFElevation.cpp328
-rw-r--r--dom/media/webaudio/blink/HRTFElevation.h103
-rw-r--r--dom/media/webaudio/blink/HRTFKernel.cpp107
-rw-r--r--dom/media/webaudio/blink/HRTFKernel.h119
-rw-r--r--dom/media/webaudio/blink/HRTFPanner.cpp324
-rw-r--r--dom/media/webaudio/blink/HRTFPanner.h117
-rw-r--r--dom/media/webaudio/blink/IIRFilter.cpp166
-rw-r--r--dom/media/webaudio/blink/IIRFilter.h58
-rw-r--r--dom/media/webaudio/blink/IRC_Composite_C_R0195-incl.cpp449
-rw-r--r--dom/media/webaudio/blink/PeriodicWave.cpp358
-rw-r--r--dom/media/webaudio/blink/PeriodicWave.h118
-rw-r--r--dom/media/webaudio/blink/README24
-rw-r--r--dom/media/webaudio/blink/Reverb.cpp243
-rw-r--r--dom/media/webaudio/blink/Reverb.h78
-rw-r--r--dom/media/webaudio/blink/ReverbAccumulationBuffer.cpp114
-rw-r--r--dom/media/webaudio/blink/ReverbAccumulationBuffer.h73
-rw-r--r--dom/media/webaudio/blink/ReverbConvolver.cpp265
-rw-r--r--dom/media/webaudio/blink/ReverbConvolver.h90
-rw-r--r--dom/media/webaudio/blink/ReverbConvolverStage.cpp107
-rw-r--r--dom/media/webaudio/blink/ReverbConvolverStage.h79
-rw-r--r--dom/media/webaudio/blink/ReverbInputBuffer.cpp87
-rw-r--r--dom/media/webaudio/blink/ReverbInputBuffer.h71
-rw-r--r--dom/media/webaudio/blink/ZeroPole.cpp78
-rw-r--r--dom/media/webaudio/blink/ZeroPole.h66
-rw-r--r--dom/media/webaudio/blink/moz.build39
-rw-r--r--dom/media/webaudio/gtest/TestAudioEventTimeline.cpp450
-rw-r--r--dom/media/webaudio/gtest/moz.build15
-rw-r--r--dom/media/webaudio/moz.build142
-rw-r--r--dom/media/webaudio/test/audio-expected.wavbin0 -> 190764 bytes
-rw-r--r--dom/media/webaudio/test/audio-mono-expected-2.wavbin0 -> 103788 bytes
-rw-r--r--dom/media/webaudio/test/audio-mono-expected.wavbin0 -> 103788 bytes
-rw-r--r--dom/media/webaudio/test/audio-quad.wavbin0 -> 5128 bytes
-rw-r--r--dom/media/webaudio/test/audio.ogvbin0 -> 16049 bytes
-rw-r--r--dom/media/webaudio/test/audioBufferSourceNodeDetached_worker.js3
-rw-r--r--dom/media/webaudio/test/audiovideo.mp4bin0 -> 139713 bytes
-rw-r--r--dom/media/webaudio/test/blink/README9
-rw-r--r--dom/media/webaudio/test/blink/audio-testing.js192
-rw-r--r--dom/media/webaudio/test/blink/biquad-filters.js368
-rw-r--r--dom/media/webaudio/test/blink/biquad-testing.js153
-rw-r--r--dom/media/webaudio/test/blink/convolution-testing.js182
-rw-r--r--dom/media/webaudio/test/blink/mochitest.ini23
-rw-r--r--dom/media/webaudio/test/blink/panner-model-testing.js210
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html32
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeAutomation.html351
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeBandPass.html34
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeGetFrequencyResponse.html261
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeHighPass.html33
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeHighShelf.html33
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeLowPass.html34
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeLowShelf.html34
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeNotch.html33
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodePeaking.html34
-rw-r--r--dom/media/webaudio/test/blink/test_biquadFilterNodeTail.html76
-rw-r--r--dom/media/webaudio/test/blink/test_iirFilterNode.html467
-rw-r--r--dom/media/webaudio/test/blink/test_iirFilterNodeGetFrequencyResponse.html97
-rw-r--r--dom/media/webaudio/test/browser.ini1
-rw-r--r--dom/media/webaudio/test/browser_bug1181073.js40
-rw-r--r--dom/media/webaudio/test/corsServer.sjs25
-rw-r--r--dom/media/webaudio/test/invalid.txt1
-rw-r--r--dom/media/webaudio/test/layouttest-glue.js19
-rw-r--r--dom/media/webaudio/test/mochitest.ini212
-rw-r--r--dom/media/webaudio/test/noaudio.webmbin0 -> 105755 bytes
-rw-r--r--dom/media/webaudio/test/sine-440-10s.opusbin0 -> 94428 bytes
-rw-r--r--dom/media/webaudio/test/small-shot-expected.wavbin0 -> 53036 bytes
-rw-r--r--dom/media/webaudio/test/small-shot-mono-expected.wavbin0 -> 26540 bytes
-rw-r--r--dom/media/webaudio/test/small-shot.mp3bin0 -> 6825 bytes
-rw-r--r--dom/media/webaudio/test/small-shot.oggbin0 -> 6416 bytes
-rw-r--r--dom/media/webaudio/test/sweep-300-330-1sec.opusbin0 -> 8889 bytes
-rw-r--r--dom/media/webaudio/test/test_AudioBuffer.html105
-rw-r--r--dom/media/webaudio/test/test_AudioContext.html23
-rw-r--r--dom/media/webaudio/test/test_AudioContext_disabled.html56
-rw-r--r--dom/media/webaudio/test/test_AudioListener.html35
-rw-r--r--dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html59
-rw-r--r--dom/media/webaudio/test/test_AudioParamDevtoolsAPI.html49
-rw-r--r--dom/media/webaudio/test/test_OfflineAudioContext.html102
-rw-r--r--dom/media/webaudio/test/test_ScriptProcessorCollected1.html84
-rw-r--r--dom/media/webaudio/test/test_WebAudioMemoryReporting.html54
-rw-r--r--dom/media/webaudio/test/test_analyserNode.html103
-rw-r--r--dom/media/webaudio/test/test_analyserNodeOutput.html43
-rw-r--r--dom/media/webaudio/test/test_analyserNodePassThrough.html47
-rw-r--r--dom/media/webaudio/test/test_analyserNodeWithGain.html47
-rw-r--r--dom/media/webaudio/test/test_analyserScale.html59
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNode.html44
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html58
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeEnded.html36
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html47
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html45
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html52
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html44
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeNoStart.html33
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html31
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeOffset.html55
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodePassThrough.html45
-rw-r--r--dom/media/webaudio/test/test_audioBufferSourceNodeRate.html66
-rw-r--r--dom/media/webaudio/test/test_audioContextSuspendResumeClose.html410
-rw-r--r--dom/media/webaudio/test/test_audioDestinationNode.html26
-rw-r--r--dom/media/webaudio/test/test_audioParamChaining.html77
-rw-r--r--dom/media/webaudio/test/test_audioParamExponentialRamp.html54
-rw-r--r--dom/media/webaudio/test/test_audioParamGain.html61
-rw-r--r--dom/media/webaudio/test/test_audioParamLinearRamp.html54
-rw-r--r--dom/media/webaudio/test/test_audioParamSetCurveAtTime.html54
-rw-r--r--dom/media/webaudio/test/test_audioParamSetCurveAtTimeTwice.html68
-rw-r--r--dom/media/webaudio/test/test_audioParamSetCurveAtTimeZeroDuration.html57
-rw-r--r--dom/media/webaudio/test/test_audioParamSetTargetAtTime.html55
-rw-r--r--dom/media/webaudio/test/test_audioParamSetTargetAtTimeZeroTimeConstant.html55
-rw-r--r--dom/media/webaudio/test/test_audioParamSetValueAtTime.html52
-rw-r--r--dom/media/webaudio/test/test_audioParamTimelineDestinationOffset.html45
-rw-r--r--dom/media/webaudio/test/test_badConnect.html48
-rw-r--r--dom/media/webaudio/test/test_biquadFilterNode.html86
-rw-r--r--dom/media/webaudio/test/test_biquadFilterNodePassThrough.html47
-rw-r--r--dom/media/webaudio/test/test_biquadFilterNodeWithGain.html61
-rw-r--r--dom/media/webaudio/test/test_bug1027864.html74
-rw-r--r--dom/media/webaudio/test/test_bug1056032.html35
-rw-r--r--dom/media/webaudio/test/test_bug1113634.html54
-rw-r--r--dom/media/webaudio/test/test_bug1118372.html46
-rw-r--r--dom/media/webaudio/test/test_bug1255618.html41
-rw-r--r--dom/media/webaudio/test/test_bug1267579.html46
-rw-r--r--dom/media/webaudio/test/test_bug808374.html22
-rw-r--r--dom/media/webaudio/test/test_bug827541.html22
-rw-r--r--dom/media/webaudio/test/test_bug839753.html18
-rw-r--r--dom/media/webaudio/test/test_bug845960.html18
-rw-r--r--dom/media/webaudio/test/test_bug856771.html26
-rw-r--r--dom/media/webaudio/test/test_bug866570.html18
-rw-r--r--dom/media/webaudio/test/test_bug866737.html36
-rw-r--r--dom/media/webaudio/test/test_bug867089.html43
-rw-r--r--dom/media/webaudio/test/test_bug867104.html34
-rw-r--r--dom/media/webaudio/test/test_bug867174.html38
-rw-r--r--dom/media/webaudio/test/test_bug867203.html34
-rw-r--r--dom/media/webaudio/test/test_bug875221.html239
-rw-r--r--dom/media/webaudio/test/test_bug875402.html47
-rw-r--r--dom/media/webaudio/test/test_bug894150.html21
-rw-r--r--dom/media/webaudio/test/test_bug956489.html56
-rw-r--r--dom/media/webaudio/test/test_bug964376.html64
-rw-r--r--dom/media/webaudio/test/test_bug966247.html46
-rw-r--r--dom/media/webaudio/test/test_bug972678.html62
-rw-r--r--dom/media/webaudio/test/test_channelMergerNode.html57
-rw-r--r--dom/media/webaudio/test/test_channelMergerNodeWithVolume.html60
-rw-r--r--dom/media/webaudio/test/test_channelSplitterNode.html71
-rw-r--r--dom/media/webaudio/test/test_channelSplitterNodeWithVolume.html76
-rw-r--r--dom/media/webaudio/test/test_convolverNode.html32
-rw-r--r--dom/media/webaudio/test/test_convolverNodeChannelCount.html61
-rw-r--r--dom/media/webaudio/test/test_convolverNodeDelay.html72
-rw-r--r--dom/media/webaudio/test/test_convolverNodeFiniteInfluence.html44
-rw-r--r--dom/media/webaudio/test/test_convolverNodePassThrough.html48
-rw-r--r--dom/media/webaudio/test/test_convolverNodeWithGain.html62
-rw-r--r--dom/media/webaudio/test/test_convolverNode_mono_mono.html73
-rw-r--r--dom/media/webaudio/test/test_currentTime.html26
-rw-r--r--dom/media/webaudio/test/test_decodeAudioDataPromise.html62
-rw-r--r--dom/media/webaudio/test/test_decodeMultichannel.html58
-rw-r--r--dom/media/webaudio/test/test_decodeOpusTail.html28
-rw-r--r--dom/media/webaudio/test/test_delayNode.html74
-rw-r--r--dom/media/webaudio/test/test_delayNodeAtMax.html53
-rw-r--r--dom/media/webaudio/test/test_delayNodeChannelChanges.html98
-rw-r--r--dom/media/webaudio/test/test_delayNodeCycles.html157
-rw-r--r--dom/media/webaudio/test/test_delayNodePassThrough.html53
-rw-r--r--dom/media/webaudio/test/test_delayNodeSmallMaxDelay.html43
-rw-r--r--dom/media/webaudio/test/test_delayNodeTailIncrease.html71
-rw-r--r--dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html95
-rw-r--r--dom/media/webaudio/test/test_delayNodeTailWithGain.html72
-rw-r--r--dom/media/webaudio/test/test_delayNodeTailWithReconnect.html136
-rw-r--r--dom/media/webaudio/test/test_delayNodeWithGain.html54
-rw-r--r--dom/media/webaudio/test/test_disconnectAll.html51
-rw-r--r--dom/media/webaudio/test/test_disconnectAudioParam.html58
-rw-r--r--dom/media/webaudio/test/test_disconnectAudioParamFromOutput.html67
-rw-r--r--dom/media/webaudio/test/test_disconnectExceptions.html75
-rw-r--r--dom/media/webaudio/test/test_disconnectFromAudioNode.html55
-rw-r--r--dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutput.html59
-rw-r--r--dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutputAndInput.html57
-rw-r--r--dom/media/webaudio/test/test_disconnectFromAudioNodeMultipleConnection.html56
-rw-r--r--dom/media/webaudio/test/test_disconnectFromOutput.html54
-rw-r--r--dom/media/webaudio/test/test_dynamicsCompressorNode.html70
-rw-r--r--dom/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html47
-rw-r--r--dom/media/webaudio/test/test_dynamicsCompressorNodeWithGain.html51
-rw-r--r--dom/media/webaudio/test/test_gainNode.html57
-rw-r--r--dom/media/webaudio/test/test_gainNodeInLoop.html48
-rw-r--r--dom/media/webaudio/test/test_gainNodePassThrough.html49
-rw-r--r--dom/media/webaudio/test/test_iirFilterNodePassThrough.html47
-rw-r--r--dom/media/webaudio/test/test_maxChannelCount.html38
-rw-r--r--dom/media/webaudio/test/test_mediaDecoding.html367
-rw-r--r--dom/media/webaudio/test/test_mediaElementAudioSourceNode.html74
-rw-r--r--dom/media/webaudio/test/test_mediaElementAudioSourceNodeCrossOrigin.html94
-rw-r--r--dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html128
-rw-r--r--dom/media/webaudio/test/test_mediaElementAudioSourceNodePassThrough.html66
-rw-r--r--dom/media/webaudio/test/test_mediaElementAudioSourceNodeVideo.html70
-rw-r--r--dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html50
-rw-r--r--dom/media/webaudio/test/test_mediaStreamAudioSourceNode.html50
-rw-r--r--dom/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html57
-rw-r--r--dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html89
-rw-r--r--dom/media/webaudio/test/test_mediaStreamAudioSourceNodePassThrough.html55
-rw-r--r--dom/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html74
-rw-r--r--dom/media/webaudio/test/test_mixingRules.html401
-rw-r--r--dom/media/webaudio/test/test_mozaudiochannel.html151
-rw-r--r--dom/media/webaudio/test/test_nodeToParamConnection.html60
-rw-r--r--dom/media/webaudio/test/test_offlineDestinationChannelCountLess.html42
-rw-r--r--dom/media/webaudio/test/test_offlineDestinationChannelCountMore.html46
-rw-r--r--dom/media/webaudio/test/test_oscillatorNode.html60
-rw-r--r--dom/media/webaudio/test/test_oscillatorNode2.html53
-rw-r--r--dom/media/webaudio/test/test_oscillatorNodeNegativeFrequency.html50
-rw-r--r--dom/media/webaudio/test/test_oscillatorNodePassThrough.html43
-rw-r--r--dom/media/webaudio/test/test_oscillatorNodeStart.html38
-rw-r--r--dom/media/webaudio/test/test_oscillatorTypeChange.html58
-rw-r--r--dom/media/webaudio/test/test_pannerNode.html73
-rw-r--r--dom/media/webaudio/test/test_pannerNodeAbove.html50
-rw-r--r--dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html86
-rw-r--r--dom/media/webaudio/test/test_pannerNodeChannelCount.html52
-rw-r--r--dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html106
-rw-r--r--dom/media/webaudio/test/test_pannerNodePassThrough.html53
-rw-r--r--dom/media/webaudio/test/test_pannerNodeTail.html232
-rw-r--r--dom/media/webaudio/test/test_pannerNode_equalPower.html26
-rw-r--r--dom/media/webaudio/test/test_pannerNode_maxDistance.html64
-rw-r--r--dom/media/webaudio/test/test_periodicWave.html94
-rw-r--r--dom/media/webaudio/test/test_periodicWaveBandLimiting.html86
-rw-r--r--dom/media/webaudio/test/test_periodicWaveDisableNormalization.html100
-rw-r--r--dom/media/webaudio/test/test_scriptProcessorNode.html132
-rw-r--r--dom/media/webaudio/test/test_scriptProcessorNodeChannelCount.html80
-rw-r--r--dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html34
-rw-r--r--dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html103
-rw-r--r--dom/media/webaudio/test/test_scriptProcessorNodeZeroInputOutput.html39
-rw-r--r--dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html52
-rw-r--r--dom/media/webaudio/test/test_sequentialBufferSourceWithResampling.html72
-rw-r--r--dom/media/webaudio/test/test_singleSourceDest.html70
-rw-r--r--dom/media/webaudio/test/test_stereoPannerNode.html263
-rw-r--r--dom/media/webaudio/test/test_stereoPannerNodePassThrough.html47
-rw-r--r--dom/media/webaudio/test/test_stereoPanningWithGain.html49
-rw-r--r--dom/media/webaudio/test/test_waveDecoder.html69
-rw-r--r--dom/media/webaudio/test/test_waveShaper.html60
-rw-r--r--dom/media/webaudio/test/test_waveShaperGain.html73
-rw-r--r--dom/media/webaudio/test/test_waveShaperInvalidLengthCurve.html66
-rw-r--r--dom/media/webaudio/test/test_waveShaperNoCurve.html43
-rw-r--r--dom/media/webaudio/test/test_waveShaperPassThrough.html55
-rw-r--r--dom/media/webaudio/test/ting-44.1k-1ch.oggbin0 -> 8566 bytes
-rw-r--r--dom/media/webaudio/test/ting-44.1k-1ch.wavbin0 -> 61228 bytes
-rw-r--r--dom/media/webaudio/test/ting-44.1k-2ch.oggbin0 -> 10422 bytes
-rw-r--r--dom/media/webaudio/test/ting-44.1k-2ch.wavbin0 -> 122412 bytes
-rw-r--r--dom/media/webaudio/test/ting-48k-1ch.oggbin0 -> 8680 bytes
-rw-r--r--dom/media/webaudio/test/ting-48k-1ch.wavbin0 -> 66638 bytes
-rw-r--r--dom/media/webaudio/test/ting-48k-2ch.oggbin0 -> 10701 bytes
-rw-r--r--dom/media/webaudio/test/ting-48k-2ch.wavbin0 -> 133232 bytes
-rw-r--r--dom/media/webaudio/test/ting-dualchannel44.1.wavbin0 -> 122412 bytes
-rw-r--r--dom/media/webaudio/test/ting-dualchannel48.wavbin0 -> 122412 bytes
-rw-r--r--dom/media/webaudio/test/webaudio.js269
-rw-r--r--dom/media/webm/EbmlComposer.cpp236
-rw-r--r--dom/media/webm/EbmlComposer.h89
-rw-r--r--dom/media/webm/NesteggPacketHolder.h124
-rw-r--r--dom/media/webm/WebMBufferedParser.cpp514
-rw-r--r--dom/media/webm/WebMBufferedParser.h322
-rw-r--r--dom/media/webm/WebMDecoder.cpp99
-rw-r--r--dom/media/webm/WebMDecoder.h46
-rw-r--r--dom/media/webm/WebMDemuxer.cpp1155
-rw-r--r--dom/media/webm/WebMDemuxer.h292
-rw-r--r--dom/media/webm/WebMWriter.cpp87
-rw-r--r--dom/media/webm/WebMWriter.h75
-rw-r--r--dom/media/webm/moz.build31
-rw-r--r--dom/media/webrtc/AudioOutputObserver.h64
-rw-r--r--dom/media/webrtc/MediaEngine.h485
-rw-r--r--dom/media/webrtc/MediaEngineCameraVideoSource.cpp418
-rw-r--r--dom/media/webrtc/MediaEngineCameraVideoSource.h132
-rw-r--r--dom/media/webrtc/MediaEngineDefault.cpp568
-rw-r--r--dom/media/webrtc/MediaEngineDefault.h215
-rw-r--r--dom/media/webrtc/MediaEngineRemoteVideoSource.cpp509
-rw-r--r--dom/media/webrtc/MediaEngineRemoteVideoSource.h136
-rw-r--r--dom/media/webrtc/MediaEngineTabVideoSource.cpp395
-rw-r--r--dom/media/webrtc/MediaEngineTabVideoSource.h114
-rw-r--r--dom/media/webrtc/MediaEngineWebRTC.cpp431
-rw-r--r--dom/media/webrtc/MediaEngineWebRTC.h613
-rw-r--r--dom/media/webrtc/MediaEngineWebRTCAudio.cpp937
-rw-r--r--dom/media/webrtc/MediaTrackConstraints.cpp469
-rw-r--r--dom/media/webrtc/MediaTrackConstraints.h449
-rw-r--r--dom/media/webrtc/PWebrtcGlobal.ipdl33
-rw-r--r--dom/media/webrtc/PeerIdentity.cpp86
-rw-r--r--dom/media/webrtc/PeerIdentity.h81
-rw-r--r--dom/media/webrtc/RTCCertificate.cpp462
-rw-r--r--dom/media/webrtc/RTCCertificate.h98
-rw-r--r--dom/media/webrtc/RTCIdentityProviderRegistrar.cpp90
-rw-r--r--dom/media/webrtc/RTCIdentityProviderRegistrar.h59
-rw-r--r--dom/media/webrtc/WebrtcGlobal.h497
-rw-r--r--dom/media/webrtc/moz.build88
-rw-r--r--dom/media/webrtc/nsITabSource.idl20
-rw-r--r--dom/media/webspeech/moz.build9
-rw-r--r--dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.cpp357
-rw-r--r--dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.h85
-rw-r--r--dom/media/webspeech/recognition/SpeechGrammar.cpp81
-rw-r--r--dom/media/webspeech/recognition/SpeechGrammar.h59
-rw-r--r--dom/media/webspeech/recognition/SpeechGrammarList.cpp103
-rw-r--r--dom/media/webspeech/recognition/SpeechGrammarList.h63
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognition.cpp1087
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognition.h296
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognitionAlternative.cpp59
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognitionAlternative.h50
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognitionResult.cpp76
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognitionResult.h55
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognitionResultList.cpp71
-rw-r--r--dom/media/webspeech/recognition/SpeechRecognitionResultList.h53
-rw-r--r--dom/media/webspeech/recognition/SpeechStreamListener.cpp94
-rw-r--r--dom/media/webspeech/recognition/SpeechStreamListener.h46
-rw-r--r--dom/media/webspeech/recognition/endpointer.cc193
-rw-r--r--dom/media/webspeech/recognition/endpointer.h180
-rw-r--r--dom/media/webspeech/recognition/energy_endpointer.cc393
-rw-r--r--dom/media/webspeech/recognition/energy_endpointer.h180
-rw-r--r--dom/media/webspeech/recognition/energy_endpointer_params.cc77
-rw-r--r--dom/media/webspeech/recognition/energy_endpointer_params.h159
-rw-r--r--dom/media/webspeech/recognition/models/dict/en-US.dic133449
-rw-r--r--dom/media/webspeech/recognition/models/dict/en-US.dic.dmpbin0 -> 525661 bytes
-rw-r--r--dom/media/webspeech/recognition/models/en-US/README34
-rw-r--r--dom/media/webspeech/recognition/models/en-US/feat.params12
-rw-r--r--dom/media/webspeech/recognition/models/en-US/mdef137105
-rw-r--r--dom/media/webspeech/recognition/models/en-US/meansbin0 -> 838732 bytes
-rw-r--r--dom/media/webspeech/recognition/models/en-US/mixture_weightsbin0 -> 7873600 bytes
-rw-r--r--dom/media/webspeech/recognition/models/en-US/noisedict5
-rw-r--r--dom/media/webspeech/recognition/models/en-US/sendumpbin0 -> 1969024 bytes
-rw-r--r--dom/media/webspeech/recognition/models/en-US/transition_matricesbin0 -> 2080 bytes
-rw-r--r--dom/media/webspeech/recognition/models/en-US/variancesbin0 -> 838732 bytes
-rw-r--r--dom/media/webspeech/recognition/moz.build88
-rw-r--r--dom/media/webspeech/recognition/nsISpeechRecognitionService.idl43
-rw-r--r--dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.cpp119
-rw-r--r--dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.h38
-rw-r--r--dom/media/webspeech/recognition/test/head.js181
-rw-r--r--dom/media/webspeech/recognition/test/hello.oggbin0 -> 11328 bytes
-rw-r--r--dom/media/webspeech/recognition/test/hello.ogg^headers^1
-rw-r--r--dom/media/webspeech/recognition/test/mochitest.ini21
-rw-r--r--dom/media/webspeech/recognition/test/silence.oggbin0 -> 106941 bytes
-rw-r--r--dom/media/webspeech/recognition/test/silence.ogg^headers^1
-rw-r--r--dom/media/webspeech/recognition/test/test_abort.html71
-rw-r--r--dom/media/webspeech/recognition/test/test_audio_capture_error.html40
-rw-r--r--dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html100
-rw-r--r--dom/media/webspeech/recognition/test/test_nested_eventloop.html81
-rw-r--r--dom/media/webspeech/recognition/test/test_preference_enable.html43
-rw-r--r--dom/media/webspeech/recognition/test/test_recognition_service_error.html43
-rw-r--r--dom/media/webspeech/recognition/test/test_success_without_recognition_service.html43
-rw-r--r--dom/media/webspeech/recognition/test/test_timeout.html40
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesis.cpp333
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesis.h85
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp178
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesisUtterance.h124
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesisVoice.cpp94
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesisVoice.h60
-rw-r--r--dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerModule.cpp57
-rw-r--r--dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.h44
-rw-r--r--dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.mm499
-rw-r--r--dom/media/webspeech/synth/cocoa/moz.build12
-rw-r--r--dom/media/webspeech/synth/crashtests/1230428.html32
-rw-r--r--dom/media/webspeech/synth/crashtests/crashtests.list1
-rw-r--r--dom/media/webspeech/synth/ipc/PSpeechSynthesis.ipdl49
-rw-r--r--dom/media/webspeech/synth/ipc/PSpeechSynthesisRequest.ipdl46
-rw-r--r--dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp213
-rw-r--r--dom/media/webspeech/synth/ipc/SpeechSynthesisChild.h106
-rw-r--r--dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp234
-rw-r--r--dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h108
-rw-r--r--dom/media/webspeech/synth/moz.build70
-rw-r--r--dom/media/webspeech/synth/nsISpeechService.idl173
-rw-r--r--dom/media/webspeech/synth/nsISynthVoiceRegistry.idl77
-rw-r--r--dom/media/webspeech/synth/nsSpeechTask.cpp783
-rw-r--r--dom/media/webspeech/synth/nsSpeechTask.h139
-rw-r--r--dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp835
-rw-r--r--dom/media/webspeech/synth/nsSynthVoiceRegistry.h109
-rw-r--r--dom/media/webspeech/synth/pico/PicoModule.cpp58
-rw-r--r--dom/media/webspeech/synth/pico/moz.build13
-rw-r--r--dom/media/webspeech/synth/pico/nsPicoService.cpp761
-rw-r--r--dom/media/webspeech/synth/pico/nsPicoService.h93
-rw-r--r--dom/media/webspeech/synth/speechd/SpeechDispatcherModule.cpp56
-rw-r--r--dom/media/webspeech/synth/speechd/SpeechDispatcherService.cpp593
-rw-r--r--dom/media/webspeech/synth/speechd/SpeechDispatcherService.h67
-rw-r--r--dom/media/webspeech/synth/speechd/moz.build13
-rw-r--r--dom/media/webspeech/synth/test/FakeSynthModule.cpp55
-rw-r--r--dom/media/webspeech/synth/test/common.js91
-rw-r--r--dom/media/webspeech/synth/test/file_bfcache_frame.html28
-rw-r--r--dom/media/webspeech/synth/test/file_global_queue.html69
-rw-r--r--dom/media/webspeech/synth/test/file_global_queue_cancel.html88
-rw-r--r--dom/media/webspeech/synth/test/file_global_queue_pause.html131
-rw-r--r--dom/media/webspeech/synth/test/file_indirect_service_events.html102
-rw-r--r--dom/media/webspeech/synth/test/file_setup.html95
-rw-r--r--dom/media/webspeech/synth/test/file_speech_cancel.html100
-rw-r--r--dom/media/webspeech/synth/test/file_speech_error.html46
-rw-r--r--dom/media/webspeech/synth/test/file_speech_queue.html85
-rw-r--r--dom/media/webspeech/synth/test/file_speech_simple.html53
-rw-r--r--dom/media/webspeech/synth/test/mochitest.ini26
-rw-r--r--dom/media/webspeech/synth/test/nsFakeSynthServices.cpp401
-rw-r--r--dom/media/webspeech/synth/test/nsFakeSynthServices.h52
-rw-r--r--dom/media/webspeech/synth/test/startup/file_voiceschanged.html32
-rw-r--r--dom/media/webspeech/synth/test/startup/mochitest.ini7
-rw-r--r--dom/media/webspeech/synth/test/startup/test_voiceschanged.html32
-rw-r--r--dom/media/webspeech/synth/test/test_bfcache.html45
-rw-r--r--dom/media/webspeech/synth/test/test_global_queue.html35
-rw-r--r--dom/media/webspeech/synth/test/test_global_queue_cancel.html35
-rw-r--r--dom/media/webspeech/synth/test/test_global_queue_pause.html35
-rw-r--r--dom/media/webspeech/synth/test/test_indirect_service_events.html36
-rw-r--r--dom/media/webspeech/synth/test/test_setup.html32
-rw-r--r--dom/media/webspeech/synth/test/test_speech_cancel.html35
-rw-r--r--dom/media/webspeech/synth/test/test_speech_error.html35
-rw-r--r--dom/media/webspeech/synth/test/test_speech_queue.html37
-rw-r--r--dom/media/webspeech/synth/test/test_speech_simple.html34
-rw-r--r--dom/media/webspeech/synth/windows/SapiModule.cpp57
-rw-r--r--dom/media/webspeech/synth/windows/SapiService.cpp470
-rw-r--r--dom/media/webspeech/synth/windows/SapiService.h59
-rw-r--r--dom/media/webspeech/synth/windows/moz.build13
-rw-r--r--dom/media/webvtt/WebVTT.manifest3
-rw-r--r--dom/media/webvtt/WebVTTParserWrapper.js72
-rw-r--r--dom/media/webvtt/moz.build21
-rw-r--r--dom/media/webvtt/nsIWebVTTListener.idl37
-rw-r--r--dom/media/webvtt/nsIWebVTTParserWrapper.idl88
-rw-r--r--dom/media/webvtt/package.json6
-rw-r--r--dom/media/webvtt/update-webvtt.js55
-rw-r--r--dom/media/webvtt/vtt.jsm1528
2794 files changed, 631962 insertions, 0 deletions
diff --git a/dom/media/ADTSDecoder.cpp b/dom/media/ADTSDecoder.cpp
new file mode 100644
index 000000000..913fbf742
--- /dev/null
+++ b/dom/media/ADTSDecoder.cpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ADTSDecoder.h"
+#include "ADTSDemuxer.h"
+#include "MediaDecoderStateMachine.h"
+#include "MediaFormatReader.h"
+#include "PDMFactory.h"
+
+namespace mozilla {
+
+MediaDecoder*
+ADTSDecoder::Clone(MediaDecoderOwner* aOwner)
+{
+ if (!IsEnabled())
+ return nullptr;
+
+ return new ADTSDecoder(aOwner);
+}
+
+MediaDecoderStateMachine*
+ADTSDecoder::CreateStateMachine()
+{
+ RefPtr<MediaDecoderReader> reader =
+ new MediaFormatReader(this, new ADTSDemuxer(GetResource()));
+ return new MediaDecoderStateMachine(this, reader);
+}
+
+/* static */ bool
+ADTSDecoder::IsEnabled()
+{
+ RefPtr<PDMFactory> platform = new PDMFactory();
+ return platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/mp4a-latm"),
+ /* DecoderDoctorDiagnostics* */ nullptr);
+}
+
+/* static */ bool
+ADTSDecoder::CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs)
+{
+ if (aType.EqualsASCII("audio/aac") || aType.EqualsASCII("audio/aacp") ||
+ aType.EqualsASCII("audio/x-aac")) {
+ return IsEnabled() && (aCodecs.IsEmpty() || aCodecs.EqualsASCII("aac"));
+ }
+
+ return false;
+}
+
+} // namespace mozilla
diff --git a/dom/media/ADTSDecoder.h b/dom/media/ADTSDecoder.h
new file mode 100644
index 000000000..1c7bece12
--- /dev/null
+++ b/dom/media/ADTSDecoder.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ADTS_DECODER_H_
+#define ADTS_DECODER_H_
+
+#include "MediaDecoder.h"
+
+namespace mozilla {
+
+class ADTSDecoder : public MediaDecoder {
+public:
+ // MediaDecoder interface.
+ explicit ADTSDecoder(MediaDecoderOwner* aOwner) : MediaDecoder(aOwner) {}
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override;
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // Returns true if the ADTS backend is pref'ed on, and we're running on a
+ // platform that is likely to have decoders for the format.
+ static bool IsEnabled();
+ static bool CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs);
+};
+
+} // namespace mozilla
+
+#endif // !ADTS_DECODER_H_
diff --git a/dom/media/ADTSDemuxer.cpp b/dom/media/ADTSDemuxer.cpp
new file mode 100644
index 000000000..82075b65b
--- /dev/null
+++ b/dom/media/ADTSDemuxer.cpp
@@ -0,0 +1,845 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ADTSDemuxer.h"
+
+#include <inttypes.h>
+
+#include "nsAutoPtr.h"
+#include "VideoUtils.h"
+#include "TimeUnits.h"
+#include "prenv.h"
+
+#ifdef PR_LOGGING
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+#define ADTSLOG(msg, ...) \
+ MOZ_LOG(gMediaDemuxerLog, LogLevel::Debug, ("ADTSDemuxer " msg, ##__VA_ARGS__))
+#define ADTSLOGV(msg, ...) \
+ MOZ_LOG(gMediaDemuxerLog, LogLevel::Verbose, ("ADTSDemuxer " msg, ##__VA_ARGS__))
+#else
+#define ADTSLOG(msg, ...) do {} while (false)
+#define ADTSLOGV(msg, ...) do {} while (false)
+#endif
+
+namespace mozilla {
+namespace adts {
+
+// adts::FrameHeader - Holds the ADTS frame header and its parsing
+// state.
+//
+// ADTS Frame Structure
+//
+// 11111111 1111BCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP(QQQQQQQQ QQQQQQQQ)
+//
+// Header consists of 7 or 9 bytes(without or with CRC).
+// Letter Length(bits) Description
+// { sync } 12 syncword 0xFFF, all bits must be 1
+// B 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2
+// C 2 Layer: always 0
+// D 1 protection absent, Warning, set to 1 if there is no
+// CRC and 0 if there is CRC
+// E 2 profile, the MPEG-4 Audio Object Type minus 1
+// F 4 MPEG-4 Sampling Frequency Index (15 is forbidden)
+// H 3 MPEG-4 Channel Configuration (in the case of 0, the
+// channel configuration is sent via an in-band PCE)
+// M 13 frame length, this value must include 7 or 9 bytes of
+// header length: FrameLength =
+// (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
+// O 11 Buffer fullness
+// P 2 Number of AAC frames(RDBs) in ADTS frame minus 1, for
+// maximum compatibility always use 1 AAC frame per ADTS
+// frame
+// Q 16 CRC if protection absent is 0
+class FrameHeader {
+public:
+ uint32_t mFrameLength;
+ uint32_t mSampleRate;
+ uint32_t mSamples;
+ uint32_t mChannels;
+ uint8_t mObjectType;
+ uint8_t mSamplingIndex;
+ uint8_t mChannelConfig;
+ uint8_t mNumAACFrames;
+ bool mHaveCrc;
+
+ // Returns whether aPtr matches a valid ADTS header sync marker
+ static bool MatchesSync(const uint8_t* aPtr) {
+ return aPtr[0] == 0xFF && (aPtr[1] & 0xF6) == 0xF0;
+ }
+
+ FrameHeader() { Reset(); }
+
+ // Header size
+ size_t HeaderSize() const { return (mHaveCrc) ? 9 : 7; }
+
+ bool IsValid() const { return mFrameLength > 0; }
+
+ // Resets the state to allow for a new parsing session.
+ void Reset() { PodZero(this); }
+
+ // Returns whether the byte creates a valid sequence up to this point.
+ bool Parse(const uint8_t* aPtr) {
+ const uint8_t* p = aPtr;
+
+ if (!MatchesSync(p)) {
+ return false;
+ }
+
+ // AAC has 1024 samples per frame per channel.
+ mSamples = 1024;
+
+ mHaveCrc = !(p[1] & 0x01);
+ mObjectType = ((p[2] & 0xC0) >> 6) + 1;
+ mSamplingIndex = (p[2] & 0x3C) >> 2;
+ mChannelConfig = (p[2] & 0x01) << 2 | (p[3] & 0xC0) >> 6;
+ mFrameLength = (p[3] & 0x03) << 11 | (p[4] & 0xFF) << 3 | (p[5] & 0xE0) >> 5;
+ mNumAACFrames = (p[6] & 0x03) + 1;
+
+ static const int32_t SAMPLE_RATES[16] = {
+ 96000, 88200, 64000, 48000,
+ 44100, 32000, 24000, 22050,
+ 16000, 12000, 11025, 8000,
+ 7350
+ };
+ mSampleRate = SAMPLE_RATES[mSamplingIndex];
+
+ MOZ_ASSERT(mChannelConfig < 8);
+ mChannels = (mChannelConfig == 7) ? 8 : mChannelConfig;
+
+ return true;
+ }
+};
+
+
+// adts::Frame - Frame meta container used to parse and hold a frame
+// header and side info.
+class Frame {
+public:
+ Frame() : mOffset(0), mHeader() {}
+
+ int64_t Offset() const { return mOffset; }
+ size_t Length() const {
+ // TODO: If fields are zero'd when invalid, this check wouldn't be necessary.
+ if (!mHeader.IsValid()) {
+ return 0;
+ }
+
+ return mHeader.mFrameLength;
+ }
+
+ // Returns the offset to the start of frame's raw data.
+ int64_t PayloadOffset() const {
+ return mOffset + mHeader.HeaderSize();
+ }
+
+ // Returns the length of the frame's raw data (excluding the header) in bytes.
+ size_t PayloadLength() const {
+ // TODO: If fields are zero'd when invalid, this check wouldn't be necessary.
+ if (!mHeader.IsValid()) {
+ return 0;
+ }
+
+ return mHeader.mFrameLength - mHeader.HeaderSize();
+ }
+
+ // Returns the parsed frame header.
+ const FrameHeader& Header() const {
+ return mHeader;
+ }
+
+ bool IsValid() const {
+ return mHeader.IsValid();
+ }
+
+ // Resets the frame header and data.
+ void Reset() {
+ mHeader.Reset();
+ mOffset = 0;
+ }
+
+ // Returns whether the valid
+ bool Parse(int64_t aOffset, uint8_t* aStart, uint8_t* aEnd) {
+ MOZ_ASSERT(aStart && aEnd);
+
+ bool found = false;
+ uint8_t* ptr = aStart;
+ // Require at least 7 bytes of data at the end of the buffer for the minimum
+ // ADTS frame header.
+ while (ptr < aEnd - 7 && !found) {
+ found = mHeader.Parse(ptr);
+ ptr++;
+ }
+
+ mOffset = aOffset + (ptr - aStart) - 1;
+
+ return found;
+ }
+
+private:
+ // The offset to the start of the header.
+ int64_t mOffset;
+
+ // The currently parsed frame header.
+ FrameHeader mHeader;
+};
+
+
+class FrameParser {
+public:
+
+ // Returns the currently parsed frame. Reset via Reset or EndFrameSession.
+ const Frame& CurrentFrame() const { return mFrame; }
+
+
+ // Returns the first parsed frame. Reset via Reset.
+ const Frame& FirstFrame() const { return mFirstFrame; }
+
+ // Resets the parser. Don't use between frames as first frame data is reset.
+ void Reset() {
+ EndFrameSession();
+ mFirstFrame.Reset();
+ }
+
+ // Clear the last parsed frame to allow for next frame parsing, i.e.:
+ // - sets PrevFrame to CurrentFrame
+ // - resets the CurrentFrame
+ // - resets ID3Header if no valid header was parsed yet
+ void EndFrameSession() {
+ mFrame.Reset();
+ }
+
+ // Parses contents of given ByteReader for a valid frame header and returns true
+ // if one was found. After returning, the variable passed to 'aBytesToSkip' holds
+ // the amount of bytes to be skipped (if any) in order to jump across a large
+ // ID3v2 tag spanning multiple buffers.
+ bool Parse(int64_t aOffset, uint8_t* aStart, uint8_t* aEnd) {
+ const bool found = mFrame.Parse(aOffset, aStart, aEnd);
+
+ if (mFrame.Length() && !mFirstFrame.Length()) {
+ mFirstFrame = mFrame;
+ }
+
+ return found;
+ }
+
+private:
+ // We keep the first parsed frame around for static info access, the
+ // previously parsed frame for debugging and the currently parsed frame.
+ Frame mFirstFrame;
+ Frame mFrame;
+};
+
+
+// Return the AAC Profile Level Indication based upon sample rate and channels
+// Information based upon table 1.10 from ISO/IEC 14496-3:2005(E)
+static int8_t
+ProfileLevelIndication(const Frame& frame)
+{
+ const FrameHeader& header = frame.Header();
+ MOZ_ASSERT(header.IsValid());
+
+ if (!header.IsValid()) {
+ return 0;
+ }
+
+ const int channels = header.mChannels;
+ const int sampleRate = header.mSampleRate;
+
+ if (channels <= 2) {
+ if (sampleRate <= 24000) {
+ // AAC Profile L1
+ return 0x28;
+ }
+ else if (sampleRate <= 48000) {
+ // AAC Profile L2
+ return 0x29;
+ }
+ }
+ else if (channels <= 5) {
+ if (sampleRate <= 48000) {
+ // AAC Profile L4
+ return 0x2A;
+ }
+ else if (sampleRate <= 96000) {
+ // AAC Profile L5
+ return 0x2B;
+ }
+ }
+
+ // TODO: Should this be 0xFE for 'no audio profile specified'?
+ return 0;
+}
+
+
+// Initialize the AAC AudioSpecificConfig.
+// Only handles two-byte version for AAC-LC.
+static void
+InitAudioSpecificConfig(const Frame& frame,
+ MediaByteBuffer* aBuffer)
+{
+ const FrameHeader& header = frame.Header();
+ MOZ_ASSERT(header.IsValid());
+
+ int audioObjectType = header.mObjectType;
+ int samplingFrequencyIndex = header.mSamplingIndex;
+ int channelConfig = header.mChannelConfig;
+
+ uint8_t asc[2];
+ asc[0] = (audioObjectType & 0x1F) << 3 | (samplingFrequencyIndex & 0x0E) >> 1;
+ asc[1] = (samplingFrequencyIndex & 0x01) << 7 | (channelConfig & 0x0F) << 3;
+
+ aBuffer->AppendElements(asc, 2);
+}
+
+} // namespace adts
+
+// ADTSDemuxer
+
+ADTSDemuxer::ADTSDemuxer(MediaResource* aSource)
+ : mSource(aSource)
+{}
+
+bool
+ADTSDemuxer::InitInternal()
+{
+ if (!mTrackDemuxer) {
+ mTrackDemuxer = new ADTSTrackDemuxer(mSource);
+ }
+ return mTrackDemuxer->Init();
+}
+
+RefPtr<ADTSDemuxer::InitPromise>
+ADTSDemuxer::Init()
+{
+ if (!InitInternal()) {
+ ADTSLOG("Init() failure: waiting for data");
+
+ return InitPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ ADTSLOG("Init() successful");
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+bool
+ADTSDemuxer::HasTrackType(TrackInfo::TrackType aType) const
+{
+ return aType == TrackInfo::kAudioTrack;
+}
+
+uint32_t
+ADTSDemuxer::GetNumberTracks(TrackInfo::TrackType aType) const
+{
+ return (aType == TrackInfo::kAudioTrack) ? 1 : 0;
+}
+
+already_AddRefed<MediaTrackDemuxer>
+ADTSDemuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber)
+{
+ if (!mTrackDemuxer) {
+ return nullptr;
+ }
+
+ return RefPtr<ADTSTrackDemuxer>(mTrackDemuxer).forget();
+}
+
+bool
+ADTSDemuxer::IsSeekable() const
+{
+ int64_t length = mSource->GetLength();
+ if (length > -1)
+ return true;
+ return false;
+}
+
+
+// ADTSTrackDemuxer
+ADTSTrackDemuxer::ADTSTrackDemuxer(MediaResource* aSource)
+ : mSource(aSource)
+ , mParser(new adts::FrameParser())
+ , mOffset(0)
+ , mNumParsedFrames(0)
+ , mFrameIndex(0)
+ , mTotalFrameLen(0)
+ , mSamplesPerFrame(0)
+ , mSamplesPerSecond(0)
+ , mChannels(0)
+{
+ Reset();
+}
+
+ADTSTrackDemuxer::~ADTSTrackDemuxer()
+{
+ delete mParser;
+ mParser = nullptr;
+}
+
+bool
+ADTSTrackDemuxer::Init()
+{
+
+ FastSeek(media::TimeUnit());
+ // Read the first frame to fetch sample rate and other meta data.
+ RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame(true)));
+
+ ADTSLOG("Init StreamLength()=%" PRId64 " first-frame-found=%d",
+ StreamLength(), !!frame);
+
+ if (!frame) {
+ return false;
+ }
+
+ // Rewind back to the stream begin to avoid dropping the first frame.
+ FastSeek(media::TimeUnit());
+
+ if (!mInfo) {
+ mInfo = MakeUnique<AudioInfo>();
+ }
+
+ mInfo->mRate = mSamplesPerSecond;
+ mInfo->mChannels = mChannels;
+ mInfo->mBitDepth = 16;
+ mInfo->mDuration = Duration().ToMicroseconds();
+
+ // AAC Specific information
+ mInfo->mMimeType = "audio/mp4a-latm";
+
+ // Configure AAC codec-specific values.
+
+ // According to
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/dd742784%28v=vs.85%29.aspx,
+ // wAudioProfileLevelIndication, which is passed mInfo->mProfile, is
+ // a value from Table 1.12 -- audioProfileLevelIndication values, ISO/IEC 14496-3.
+ mInfo->mProfile = ProfileLevelIndication(mParser->FirstFrame());
+ // For AAC, mExtendedProfile contains the audioObjectType from Table
+ // 1.3 -- Audio Profile definition, ISO/IEC 14496-3. Eg. 2 == AAC LC
+ mInfo->mExtendedProfile = mParser->FirstFrame().Header().mObjectType;
+ InitAudioSpecificConfig(mParser->FirstFrame(), mInfo->mCodecSpecificConfig);
+
+ ADTSLOG("Init mInfo={mRate=%u mChannels=%u mBitDepth=%u mDuration=%" PRId64 "}",
+ mInfo->mRate, mInfo->mChannels, mInfo->mBitDepth, mInfo->mDuration);
+
+ return mSamplesPerSecond && mChannels;
+}
+
+UniquePtr<TrackInfo>
+ADTSTrackDemuxer::GetInfo() const
+{
+ return mInfo->Clone();
+}
+
+RefPtr<ADTSTrackDemuxer::SeekPromise>
+ADTSTrackDemuxer::Seek(media::TimeUnit aTime)
+{
+ // Efficiently seek to the position.
+ FastSeek(aTime);
+ // Correct seek position by scanning the next frames.
+ const media::TimeUnit seekTime = ScanUntil(aTime);
+
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+}
+
+media::TimeUnit
+ADTSTrackDemuxer::FastSeek(const media::TimeUnit& aTime)
+{
+ ADTSLOG("FastSeek(%" PRId64 ") avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64,
+ aTime.ToMicroseconds(), AverageFrameLength(), mNumParsedFrames,
+ mFrameIndex, mOffset);
+
+ const int64_t firstFrameOffset = mParser->FirstFrame().Offset();
+ if (!aTime.ToMicroseconds()) {
+ // Quick seek to the beginning of the stream.
+ mOffset = firstFrameOffset;
+ } else if (AverageFrameLength() > 0) {
+ mOffset = firstFrameOffset + FrameIndexFromTime(aTime) *
+ AverageFrameLength();
+ }
+
+ if (mOffset > firstFrameOffset && StreamLength() > 0) {
+ mOffset = std::min(StreamLength() - 1, mOffset);
+ }
+
+ mFrameIndex = FrameIndexFromOffset(mOffset);
+ mParser->EndFrameSession();
+
+ ADTSLOG("FastSeek End avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mFirstFrameOffset=%llu mOffset=%" PRIu64
+ " SL=%llu",
+ AverageFrameLength(), mNumParsedFrames, mFrameIndex,
+ firstFrameOffset, mOffset, StreamLength());
+
+ return Duration(mFrameIndex);
+}
+
+media::TimeUnit
+ADTSTrackDemuxer::ScanUntil(const media::TimeUnit& aTime)
+{
+ ADTSLOG("ScanUntil(%" PRId64 ") avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64,
+ aTime.ToMicroseconds(), AverageFrameLength(), mNumParsedFrames,
+ mFrameIndex, mOffset);
+
+ if (!aTime.ToMicroseconds()) {
+ return FastSeek(aTime);
+ }
+
+ if (Duration(mFrameIndex) > aTime) {
+ FastSeek(aTime);
+ }
+
+ while (SkipNextFrame(FindNextFrame()) && Duration(mFrameIndex + 1) < aTime) {
+ ADTSLOGV("ScanUntil* avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64 " Duration=%" PRId64,
+ AverageFrameLength(), mNumParsedFrames, mFrameIndex,
+ mOffset, Duration(mFrameIndex + 1).ToMicroseconds());
+ }
+
+ ADTSLOG("ScanUntil End avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64,
+ AverageFrameLength(), mNumParsedFrames, mFrameIndex, mOffset);
+
+ return Duration(mFrameIndex);
+}
+
+RefPtr<ADTSTrackDemuxer::SamplesPromise>
+ADTSTrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ ADTSLOGV("GetSamples(%d) Begin mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d "
+ "mSamplesPerSecond=%d mChannels=%d",
+ aNumSamples, mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ MOZ_ASSERT(aNumSamples);
+
+ RefPtr<SamplesHolder> frames = new SamplesHolder();
+
+ while (aNumSamples--) {
+ RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame()));
+ if (!frame)
+ break;
+
+ frames->mSamples.AppendElement(frame);
+ }
+
+ ADTSLOGV("GetSamples() End mSamples.Size()=%d aNumSamples=%d mOffset=%" PRIu64
+ " mNumParsedFrames=%" PRIu64 " mFrameIndex=%" PRId64
+ " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d "
+ "mChannels=%d",
+ frames->mSamples.Length(), aNumSamples, mOffset, mNumParsedFrames,
+ mFrameIndex, mTotalFrameLen, mSamplesPerFrame, mSamplesPerSecond,
+ mChannels);
+
+ if (frames->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ }
+
+ return SamplesPromise::CreateAndResolve(frames, __func__);
+}
+
+void
+ADTSTrackDemuxer::Reset()
+{
+ ADTSLOG("Reset()");
+ MOZ_ASSERT(mParser);
+ if (mParser) {
+ mParser->Reset();
+ }
+ FastSeek(media::TimeUnit());
+}
+
+RefPtr<ADTSTrackDemuxer::SkipAccessPointPromise>
+ADTSTrackDemuxer::SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold)
+{
+ // Will not be called for audio-only resources.
+ return SkipAccessPointPromise::CreateAndReject(
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
+}
+
+int64_t
+ADTSTrackDemuxer::GetResourceOffset() const
+{
+ return mOffset;
+}
+
+media::TimeIntervals
+ADTSTrackDemuxer::GetBuffered()
+{
+ media::TimeUnit duration = Duration();
+
+ if (duration <= media::TimeUnit()) {
+ return media::TimeIntervals();
+ }
+
+ AutoPinned<MediaResource> stream(mSource.GetResource());
+ return GetEstimatedBufferedTimeRanges(stream, duration.ToMicroseconds());
+}
+
+int64_t
+ADTSTrackDemuxer::StreamLength() const
+{
+ return mSource.GetLength();
+}
+
+media::TimeUnit
+ADTSTrackDemuxer::Duration() const
+{
+ if (!mNumParsedFrames) {
+ return media::TimeUnit::FromMicroseconds(-1);
+ }
+
+ const int64_t streamLen = StreamLength();
+ if (streamLen < 0) {
+ // Unknown length, we can't estimate duration.
+ return media::TimeUnit::FromMicroseconds(-1);
+ }
+ const int64_t firstFrameOffset = mParser->FirstFrame().Offset();
+ int64_t numFrames = (streamLen - firstFrameOffset) / AverageFrameLength();
+ return Duration(numFrames);
+}
+
+media::TimeUnit
+ADTSTrackDemuxer::Duration(int64_t aNumFrames) const
+{
+ if (!mSamplesPerSecond) {
+ return media::TimeUnit::FromMicroseconds(-1);
+ }
+
+ return FramesToTimeUnit(aNumFrames * mSamplesPerFrame, mSamplesPerSecond);
+}
+
+const adts::Frame&
+ADTSTrackDemuxer::FindNextFrame(bool findFirstFrame /*= false*/)
+{
+ static const int BUFFER_SIZE = 4096;
+ static const int MAX_SKIPPED_BYTES = 10 * BUFFER_SIZE;
+
+ ADTSLOGV("FindNext() Begin mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64
+ " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ uint8_t buffer[BUFFER_SIZE];
+ int32_t read = 0;
+
+ bool foundFrame = false;
+ int64_t frameHeaderOffset = mOffset;
+
+ // Prepare the parser for the next frame parsing session.
+ mParser->EndFrameSession();
+
+ // Check whether we've found a valid ADTS frame.
+ while (!foundFrame) {
+ if ((read = Read(buffer, frameHeaderOffset, BUFFER_SIZE)) == 0) {
+ ADTSLOG("FindNext() EOS without a frame");
+ break;
+ }
+
+ if (frameHeaderOffset - mOffset > MAX_SKIPPED_BYTES) {
+ ADTSLOG("FindNext() exceeded MAX_SKIPPED_BYTES without a frame");
+ break;
+ }
+
+ const adts::Frame& currentFrame = mParser->CurrentFrame();
+ foundFrame = mParser->Parse(frameHeaderOffset, buffer, buffer + read);
+ if (findFirstFrame && foundFrame) {
+ // Check for sync marker after the found frame, since it's
+ // possible to find sync marker in AAC data. If sync marker
+ // exists after the current frame then we've found a frame
+ // header.
+ int64_t nextFrameHeaderOffset = currentFrame.Offset() + currentFrame.Length();
+ int32_t read = Read(buffer, nextFrameHeaderOffset, 2);
+ if (read != 2 || !adts::FrameHeader::MatchesSync(buffer)) {
+ frameHeaderOffset = currentFrame.Offset() + 1;
+ mParser->Reset();
+ foundFrame = false;
+ continue;
+ }
+ }
+
+ if (foundFrame) {
+ break;
+ }
+
+ // Minimum header size is 7 bytes.
+ int64_t advance = read - 7;
+
+ // Check for offset overflow.
+ if (frameHeaderOffset + advance <= frameHeaderOffset) {
+ break;
+ }
+
+ frameHeaderOffset += advance;
+ }
+
+ if (!foundFrame || !mParser->CurrentFrame().Length()) {
+ ADTSLOG("FindNext() Exit foundFrame=%d mParser->CurrentFrame().Length()=%d ",
+ foundFrame, mParser->CurrentFrame().Length());
+ mParser->Reset();
+ return mParser->CurrentFrame();
+ }
+
+ ADTSLOGV("FindNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " frameHeaderOffset=%d"
+ " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d"
+ " mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, frameHeaderOffset,
+ mTotalFrameLen, mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ return mParser->CurrentFrame();
+}
+
+bool
+ADTSTrackDemuxer::SkipNextFrame(const adts::Frame& aFrame)
+{
+ if (!mNumParsedFrames || !aFrame.Length()) {
+ RefPtr<MediaRawData> frame(GetNextFrame(aFrame));
+ return frame;
+ }
+
+ UpdateState(aFrame);
+
+ ADTSLOGV("SkipNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64
+ " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ return true;
+}
+
+already_AddRefed<MediaRawData>
+ADTSTrackDemuxer::GetNextFrame(const adts::Frame& aFrame)
+{
+ ADTSLOG("GetNext() Begin({mOffset=%" PRId64 " HeaderSize()=%d Length()=%d})",
+ aFrame.Offset(), aFrame.Header().HeaderSize(), aFrame.PayloadLength());
+ if (!aFrame.IsValid())
+ return nullptr;
+
+ const int64_t offset = aFrame.PayloadOffset();
+ const uint32_t length = aFrame.PayloadLength();
+
+ RefPtr<MediaRawData> frame = new MediaRawData();
+ frame->mOffset = offset;
+
+ nsAutoPtr<MediaRawDataWriter> frameWriter(frame->CreateWriter());
+ if (!frameWriter->SetSize(length)) {
+ ADTSLOG("GetNext() Exit failed to allocated media buffer");
+ return nullptr;
+ }
+
+ const uint32_t read = Read(frameWriter->Data(), offset, length);
+ if (read != length) {
+ ADTSLOG("GetNext() Exit read=%u frame->Size()=%u", read, frame->Size());
+ return nullptr;
+ }
+
+ UpdateState(aFrame);
+
+ frame->mTime = Duration(mFrameIndex - 1).ToMicroseconds();
+ frame->mDuration = Duration(1).ToMicroseconds();
+ frame->mTimecode = frame->mTime;
+ frame->mKeyframe = true;
+
+ MOZ_ASSERT(frame->mTime >= 0);
+ MOZ_ASSERT(frame->mDuration > 0);
+
+ ADTSLOGV("GetNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64
+ " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ return frame.forget();
+}
+
+int64_t
+ADTSTrackDemuxer::FrameIndexFromOffset(int64_t aOffset) const
+{
+ int64_t frameIndex = 0;
+
+ if (AverageFrameLength() > 0) {
+ frameIndex = (aOffset - mParser->FirstFrame().Offset()) / AverageFrameLength();
+ }
+
+ ADTSLOGV("FrameIndexFromOffset(%" PRId64 ") -> %" PRId64, aOffset, frameIndex);
+ return std::max<int64_t>(0, frameIndex);
+}
+
+int64_t
+ADTSTrackDemuxer::FrameIndexFromTime(const media::TimeUnit& aTime) const
+{
+ int64_t frameIndex = 0;
+ if (mSamplesPerSecond > 0 && mSamplesPerFrame > 0) {
+ frameIndex = aTime.ToSeconds() * mSamplesPerSecond / mSamplesPerFrame - 1;
+ }
+
+ ADTSLOGV("FrameIndexFromOffset(%fs) -> %" PRId64, aTime.ToSeconds(), frameIndex);
+ return std::max<int64_t>(0, frameIndex);
+}
+
+void
+ADTSTrackDemuxer::UpdateState(const adts::Frame& aFrame)
+{
+ int32_t frameLength = aFrame.Length();
+ // Prevent overflow.
+ if (mTotalFrameLen + frameLength < mTotalFrameLen) {
+ // These variables have a linear dependency and are only used to derive the
+ // average frame length.
+ mTotalFrameLen /= 2;
+ mNumParsedFrames /= 2;
+ }
+
+ // Full frame parsed, move offset to its end.
+ mOffset = aFrame.Offset() + frameLength;
+ mTotalFrameLen += frameLength;
+
+ if (!mSamplesPerFrame) {
+ const adts::FrameHeader& header = aFrame.Header();
+ mSamplesPerFrame = header.mSamples;
+ mSamplesPerSecond = header.mSampleRate;
+ mChannels = header.mChannels;
+ }
+
+ ++mNumParsedFrames;
+ ++mFrameIndex;
+ MOZ_ASSERT(mFrameIndex > 0);
+}
+
+int32_t
+ADTSTrackDemuxer::Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize)
+{
+ ADTSLOGV("ADTSTrackDemuxer::Read(%p %" PRId64 " %d)", aBuffer, aOffset, aSize);
+
+ const int64_t streamLen = StreamLength();
+ if (mInfo && streamLen > 0) {
+ // Prevent blocking reads after successful initialization.
+ aSize = std::min<int64_t>(aSize, streamLen - aOffset);
+ }
+
+ uint32_t read = 0;
+ ADTSLOGV("ADTSTrackDemuxer::Read -> ReadAt(%d)", aSize);
+ const nsresult rv = mSource.ReadAt(aOffset, reinterpret_cast<char*>(aBuffer),
+ static_cast<uint32_t>(aSize), &read);
+ NS_ENSURE_SUCCESS(rv, 0);
+ return static_cast<int32_t>(read);
+}
+
+double
+ADTSTrackDemuxer::AverageFrameLength() const
+{
+ if (mNumParsedFrames) {
+ return static_cast<double>(mTotalFrameLen) / mNumParsedFrames;
+ }
+
+ return 0.0;
+}
+
+} // namespace mozilla
diff --git a/dom/media/ADTSDemuxer.h b/dom/media/ADTSDemuxer.h
new file mode 100644
index 000000000..feb65d01b
--- /dev/null
+++ b/dom/media/ADTSDemuxer.h
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ADTS_DEMUXER_H_
+#define ADTS_DEMUXER_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/Maybe.h"
+#include "MediaDataDemuxer.h"
+#include "MediaResource.h"
+#include "mp4_demuxer/ByteReader.h"
+
+namespace mozilla {
+
+namespace adts {
+class Frame;
+class FrameParser;
+}
+
+class ADTSTrackDemuxer;
+
+class ADTSDemuxer : public MediaDataDemuxer {
+public:
+ // MediaDataDemuxer interface.
+ explicit ADTSDemuxer(MediaResource* aSource);
+ RefPtr<InitPromise> Init() override;
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(
+ TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
+ bool IsSeekable() const override;
+
+private:
+ bool InitInternal();
+
+ RefPtr<MediaResource> mSource;
+ RefPtr<ADTSTrackDemuxer> mTrackDemuxer;
+};
+
+class ADTSTrackDemuxer : public MediaTrackDemuxer {
+public:
+ explicit ADTSTrackDemuxer(MediaResource* aSource);
+
+ // Initializes the track demuxer by reading the first frame for meta data.
+ // Returns initialization success state.
+ bool Init();
+
+ // Returns the total stream length if known, -1 otherwise.
+ int64_t StreamLength() const;
+
+ // Returns the estimated stream duration, or a 0-duration if unknown.
+ media::TimeUnit Duration() const;
+
+ // Returns the estimated duration up to the given frame number,
+ // or a 0-duration if unknown.
+ media::TimeUnit Duration(int64_t aNumFrames) const;
+
+ // MediaTrackDemuxer interface.
+ UniquePtr<TrackInfo> GetInfo() const override;
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+ void Reset() override;
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
+ media::TimeUnit aTimeThreshold) override;
+ int64_t GetResourceOffset() const override;
+ media::TimeIntervals GetBuffered() override;
+
+private:
+ // Destructor.
+ ~ADTSTrackDemuxer();
+
+ // Fast approximate seeking to given time.
+ media::TimeUnit FastSeek(const media::TimeUnit& aTime);
+
+ // Seeks by scanning the stream up to the given time for more accurate results.
+ media::TimeUnit ScanUntil(const media::TimeUnit& aTime);
+
+ // Finds the next valid frame and returns its byte range.
+ const adts::Frame& FindNextFrame(bool findFirstFrame = false);
+
+ // Skips the next frame given the provided byte range.
+ bool SkipNextFrame(const adts::Frame& aFrame);
+
+ // Returns the next ADTS frame, if available.
+ already_AddRefed<MediaRawData> GetNextFrame(const adts::Frame& aFrame);
+
+ // Updates post-read meta data.
+ void UpdateState(const adts::Frame& aFrame);
+
+ // Returns the frame index for the given offset.
+ int64_t FrameIndexFromOffset(int64_t aOffset) const;
+
+ // Returns the frame index for the given time.
+ int64_t FrameIndexFromTime(const media::TimeUnit& aTime) const;
+
+ // Reads aSize bytes into aBuffer from the source starting at aOffset.
+ // Returns the actual size read.
+ int32_t Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize);
+
+ // Returns the average frame length derived from the previously parsed frames.
+ double AverageFrameLength() const;
+
+ // The (hopefully) ADTS resource.
+ MediaResourceIndex mSource;
+
+ // ADTS frame parser used to detect frames and extract side info.
+ adts::FrameParser* mParser;
+
+ // Current byte offset in the source stream.
+ int64_t mOffset;
+
+ // Total parsed frames.
+ uint64_t mNumParsedFrames;
+
+ // Current frame index.
+ int64_t mFrameIndex;
+
+ // Sum of parsed frames' lengths in bytes.
+ uint64_t mTotalFrameLen;
+
+ // Samples per frame metric derived from frame headers or 0 if none available.
+ uint32_t mSamplesPerFrame;
+
+ // Samples per second metric derived from frame headers or 0 if none available.
+ uint32_t mSamplesPerSecond;
+
+ // Channel count derived from frame headers or 0 if none available.
+ uint32_t mChannels;
+
+ // Audio track config info.
+ UniquePtr<AudioInfo> mInfo;
+};
+
+} // mozilla
+
+#endif // !ADTS_DEMUXER_H_
diff --git a/dom/media/AbstractMediaDecoder.h b/dom/media/AbstractMediaDecoder.h
new file mode 100644
index 000000000..a0f04ec98
--- /dev/null
+++ b/dom/media/AbstractMediaDecoder.h
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AbstractMediaDecoder_h_
+#define AbstractMediaDecoder_h_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/StateMirroring.h"
+
+#include "FrameStatistics.h"
+#include "MediaEventSource.h"
+#include "MediaInfo.h"
+#include "nsISupports.h"
+#include "nsDataHashtable.h"
+#include "nsThreadUtils.h"
+
+class GMPCrashHelper;
+
+namespace mozilla
+{
+
+namespace layers
+{
+ class ImageContainer;
+ class KnowsCompositor;
+} // namespace layers
+class MediaResource;
+class ReentrantMonitor;
+class VideoFrameContainer;
+class MediaDecoderOwner;
+class CDMProxy;
+
+typedef nsDataHashtable<nsCStringHashKey, nsCString> MetadataTags;
+
+static inline bool IsCurrentThread(nsIThread* aThread) {
+ return NS_GetCurrentThread() == aThread;
+}
+
+/**
+ * The AbstractMediaDecoder class describes the public interface for a media decoder
+ * and is used by the MediaReader classes.
+ */
+class AbstractMediaDecoder : public nsIObserver
+{
+public:
+ // A special version of the above for the ogg decoder that is allowed to be
+ // called cross-thread.
+ virtual bool IsOggDecoderShutdown() { return false; }
+
+ // Get the current MediaResource being used. Its URI will be returned
+ // by currentSrc. Returns what was passed to Load(), if Load() has been called.
+ virtual MediaResource* GetResource() const = 0;
+
+ // Increments the parsed, decoded and dropped frame counters by the passed in
+ // counts.
+ // Can be called on any thread.
+ virtual void NotifyDecodedFrames(const FrameStatisticsData& aStats) = 0;
+
+ virtual AbstractCanonical<media::NullableTimeUnit>* CanonicalDurationOrNull() { return nullptr; };
+
+ // Return an event that will be notified when data arrives in MediaResource.
+ // MediaDecoderReader will register with this event to receive notifications
+ // in order to update buffer ranges.
+ // Return null if this decoder doesn't support the event.
+ virtual MediaEventSource<void>* DataArrivedEvent()
+ {
+ return nullptr;
+ }
+
+ // Returns an event that will be notified when the owning document changes state
+ // and we might have a new compositor. If this new compositor requires us to
+ // recreate our decoders, then we expect the existing decoderis to return an
+ // error independently of this.
+ virtual MediaEventSource<RefPtr<layers::KnowsCompositor>>* CompositorUpdatedEvent()
+ {
+ return nullptr;
+ }
+
+ // Notify the media decoder that a decryption key is required before emitting
+ // further output. This only needs to be overridden for decoders that expect
+ // encryption, such as the MediaSource decoder.
+ virtual void NotifyWaitingForKey() {}
+
+ // Return an event that will be notified when a decoder is waiting for a
+ // decryption key before it can return more output.
+ virtual MediaEventSource<void>* WaitingForKeyEvent()
+ {
+ return nullptr;
+ }
+
+protected:
+ virtual void UpdateEstimatedMediaDuration(int64_t aDuration) {};
+public:
+ void DispatchUpdateEstimatedMediaDuration(int64_t aDuration)
+ {
+ NS_DispatchToMainThread(NewRunnableMethod<int64_t>(this,
+ &AbstractMediaDecoder::UpdateEstimatedMediaDuration,
+ aDuration));
+ }
+
+ virtual VideoFrameContainer* GetVideoFrameContainer() = 0;
+ virtual mozilla::layers::ImageContainer* GetImageContainer() = 0;
+
+ // Returns the owner of this decoder or null when the decoder is shutting
+ // down. The owner should only be used on the main thread.
+ virtual MediaDecoderOwner* GetOwner() const = 0;
+
+ // Set by Reader if the current audio track can be offloaded
+ virtual void SetPlatformCanOffloadAudio(bool aCanOffloadAudio) {}
+
+ virtual already_AddRefed<GMPCrashHelper> GetCrashHelper() { return nullptr; }
+
+ // Stack based class to assist in notifying the frame statistics of
+ // parsed and decoded frames. Use inside video demux & decode functions
+ // to ensure all parsed and decoded frames are reported on all return paths.
+ class AutoNotifyDecoded {
+ public:
+ explicit AutoNotifyDecoded(AbstractMediaDecoder* aDecoder)
+ : mDecoder(aDecoder)
+ {}
+ ~AutoNotifyDecoded() {
+ if (mDecoder) {
+ mDecoder->NotifyDecodedFrames(mStats);
+ }
+ }
+
+ FrameStatisticsData mStats;
+
+ private:
+ AbstractMediaDecoder* mDecoder;
+ };
+
+ // Classes directly inheriting from AbstractMediaDecoder do not support
+ // Observe and it should never be called directly.
+ NS_IMETHOD Observe(nsISupports *aSubject, const char * aTopic, const char16_t * aData) override
+ { MOZ_CRASH("Forbidden method"); return NS_OK; }
+};
+
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/AccurateSeekTask.cpp b/dom/media/AccurateSeekTask.cpp
new file mode 100644
index 000000000..30eeb5904
--- /dev/null
+++ b/dom/media/AccurateSeekTask.cpp
@@ -0,0 +1,470 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AccurateSeekTask.h"
+#include "MediaDecoderReaderWrapper.h"
+#include "mozilla/AbstractThread.h"
+#include "mozilla/Assertions.h"
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+extern LazyLogModule gMediaSampleLog;
+
+// avoid redefined macro in unified build
+#undef FMT
+#undef DECODER_LOG
+#undef SAMPLE_LOG
+#undef DECODER_WARN
+
+#define FMT(x, ...) "[AccurateSeekTask] Decoder=%p " x, mDecoderID, ##__VA_ARGS__
+#define DECODER_LOG(...) MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, (FMT(__VA_ARGS__)))
+#define SAMPLE_LOG(...) MOZ_LOG(gMediaSampleLog, LogLevel::Debug, (FMT(__VA_ARGS__)))
+#define DECODER_WARN(...) NS_WARNING(nsPrintfCString(FMT(__VA_ARGS__)).get())
+
+AccurateSeekTask::AccurateSeekTask(const void* aDecoderID,
+ AbstractThread* aThread,
+ MediaDecoderReaderWrapper* aReader,
+ const SeekTarget& aTarget,
+ const MediaInfo& aInfo,
+ const media::TimeUnit& aEnd,
+ int64_t aCurrentMediaTime)
+ : SeekTask(aDecoderID, aThread, aReader, aTarget)
+ , mCurrentTimeBeforeSeek(media::TimeUnit::FromMicroseconds(aCurrentMediaTime))
+ , mAudioRate(aInfo.mAudio.mRate)
+ , mDoneAudioSeeking(!aInfo.HasAudio() || aTarget.IsVideoOnly())
+ , mDoneVideoSeeking(!aInfo.HasVideo())
+{
+ AssertOwnerThread();
+
+ // Bound the seek time to be inside the media range.
+ NS_ASSERTION(aEnd.ToMicroseconds() != -1, "Should know end time by now");
+ mTarget.SetTime(std::max(media::TimeUnit(), std::min(mTarget.GetTime(), aEnd)));
+
+ // Configure MediaDecoderReaderWrapper.
+ SetCallbacks();
+}
+
+AccurateSeekTask::~AccurateSeekTask()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsDiscarded);
+}
+
+void
+AccurateSeekTask::Discard()
+{
+ AssertOwnerThread();
+
+ // Disconnect MDSM.
+ RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+
+ // Disconnect MediaDecoderReaderWrapper.
+ mSeekRequest.DisconnectIfExists();
+ CancelCallbacks();
+
+ mIsDiscarded = true;
+}
+
+bool
+AccurateSeekTask::NeedToResetMDSM() const
+{
+ AssertOwnerThread();
+ return true;
+}
+
+RefPtr<AccurateSeekTask::SeekTaskPromise>
+AccurateSeekTask::Seek(const media::TimeUnit& aDuration)
+{
+ AssertOwnerThread();
+
+ // Do the seek.
+ mSeekRequest.Begin(mReader->Seek(mTarget, aDuration)
+ ->Then(OwnerThread(), __func__, this,
+ &AccurateSeekTask::OnSeekResolved, &AccurateSeekTask::OnSeekRejected));
+
+ return mSeekTaskPromise.Ensure(__func__);
+}
+
+void
+AccurateSeekTask::RequestAudioData()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mDoneAudioSeeking);
+ MOZ_ASSERT(!mReader->IsRequestingAudioData());
+ MOZ_ASSERT(!mReader->IsWaitingAudioData());
+ mReader->RequestAudioData();
+}
+
+void
+AccurateSeekTask::RequestVideoData()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mDoneVideoSeeking);
+ MOZ_ASSERT(!mReader->IsRequestingVideoData());
+ MOZ_ASSERT(!mReader->IsWaitingVideoData());
+ mReader->RequestVideoData(false, media::TimeUnit());
+}
+
+nsresult
+AccurateSeekTask::DropAudioUpToSeekTarget(MediaData* aSample)
+{
+ AssertOwnerThread();
+
+ RefPtr<AudioData> audio(aSample->As<AudioData>());
+ MOZ_ASSERT(audio && mTarget.IsAccurate());
+
+ CheckedInt64 sampleDuration = FramesToUsecs(audio->mFrames, mAudioRate);
+ if (!sampleDuration.isValid()) {
+ return NS_ERROR_DOM_MEDIA_OVERFLOW_ERR;
+ }
+
+ if (audio->mTime + sampleDuration.value() <= mTarget.GetTime().ToMicroseconds()) {
+ // Our seek target lies after the frames in this AudioData. Don't
+ // push it onto the audio queue, and keep decoding forwards.
+ return NS_OK;
+ }
+
+ if (audio->mTime > mTarget.GetTime().ToMicroseconds()) {
+ // The seek target doesn't lie in the audio block just after the last
+ // audio frames we've seen which were before the seek target. This
+ // could have been the first audio data we've seen after seek, i.e. the
+ // seek terminated after the seek target in the audio stream. Just
+ // abort the audio decode-to-target, the state machine will play
+ // silence to cover the gap. Typically this happens in poorly muxed
+ // files.
+ DECODER_WARN("Audio not synced after seek, maybe a poorly muxed file?");
+ mSeekedAudioData = audio;
+ mDoneAudioSeeking = true;
+ return NS_OK;
+ }
+
+ // The seek target lies somewhere in this AudioData's frames, strip off
+ // any frames which lie before the seek target, so we'll begin playback
+ // exactly at the seek target.
+ NS_ASSERTION(mTarget.GetTime().ToMicroseconds() >= audio->mTime,
+ "Target must at or be after data start.");
+ NS_ASSERTION(mTarget.GetTime().ToMicroseconds() < audio->mTime + sampleDuration.value(),
+ "Data must end after target.");
+
+ CheckedInt64 framesToPrune =
+ UsecsToFrames(mTarget.GetTime().ToMicroseconds() - audio->mTime, mAudioRate);
+ if (!framesToPrune.isValid()) {
+ return NS_ERROR_DOM_MEDIA_OVERFLOW_ERR;
+ }
+ if (framesToPrune.value() > audio->mFrames) {
+ // We've messed up somehow. Don't try to trim frames, the |frames|
+ // variable below will overflow.
+ DECODER_WARN("Can't prune more frames that we have!");
+ return NS_ERROR_FAILURE;
+ }
+ uint32_t frames = audio->mFrames - static_cast<uint32_t>(framesToPrune.value());
+ uint32_t channels = audio->mChannels;
+ AlignedAudioBuffer audioData(frames * channels);
+ if (!audioData) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+ memcpy(audioData.get(),
+ audio->mAudioData.get() + (framesToPrune.value() * channels),
+ frames * channels * sizeof(AudioDataValue));
+ CheckedInt64 duration = FramesToUsecs(frames, mAudioRate);
+ if (!duration.isValid()) {
+ return NS_ERROR_DOM_MEDIA_OVERFLOW_ERR;
+ }
+ RefPtr<AudioData> data(new AudioData(audio->mOffset,
+ mTarget.GetTime().ToMicroseconds(),
+ duration.value(),
+ frames,
+ Move(audioData),
+ channels,
+ audio->mRate));
+ MOZ_ASSERT(!mSeekedAudioData, "Should be the 1st sample after seeking");
+ mSeekedAudioData = data;
+ mDoneAudioSeeking = true;
+
+ return NS_OK;
+}
+
+nsresult
+AccurateSeekTask::DropVideoUpToSeekTarget(MediaData* aSample)
+{
+ AssertOwnerThread();
+
+ RefPtr<VideoData> video(aSample->As<VideoData>());
+ MOZ_ASSERT(video);
+ DECODER_LOG("DropVideoUpToSeekTarget() frame [%lld, %lld]",
+ video->mTime, video->GetEndTime());
+ const int64_t target = mTarget.GetTime().ToMicroseconds();
+
+ // If the frame end time is less than the seek target, we won't want
+ // to display this frame after the seek, so discard it.
+ if (target >= video->GetEndTime()) {
+ DECODER_LOG("DropVideoUpToSeekTarget() pop video frame [%lld, %lld] target=%lld",
+ video->mTime, video->GetEndTime(), target);
+ mFirstVideoFrameAfterSeek = video;
+ } else {
+ if (target >= video->mTime && video->GetEndTime() >= target) {
+ // The seek target lies inside this frame's time slice. Adjust the frame's
+ // start time to match the seek target. We do this by replacing the
+ // first frame with a shallow copy which has the new timestamp.
+ RefPtr<VideoData> temp = VideoData::ShallowCopyUpdateTimestamp(video.get(), target);
+ video = temp;
+ }
+ mFirstVideoFrameAfterSeek = nullptr;
+
+ DECODER_LOG("DropVideoUpToSeekTarget() found video frame [%lld, %lld] containing target=%lld",
+ video->mTime, video->GetEndTime(), target);
+
+ MOZ_ASSERT(!mSeekedVideoData, "Should be the 1st sample after seeking");
+ mSeekedVideoData = video;
+ mDoneVideoSeeking = true;
+ }
+
+ return NS_OK;
+}
+
+void
+AccurateSeekTask::MaybeFinishSeek()
+{
+ AssertOwnerThread();
+ if (mDoneAudioSeeking && mDoneVideoSeeking) {
+ Resolve(__func__); // Call to MDSM::SeekCompleted();
+ }
+}
+
+void
+AccurateSeekTask::OnSeekResolved(media::TimeUnit)
+{
+ AssertOwnerThread();
+
+ mSeekRequest.Complete();
+ // We must decode the first samples of active streams, so we can determine
+ // the new stream time. So dispatch tasks to do that.
+ if (!mDoneVideoSeeking) {
+ RequestVideoData();
+ }
+ if (!mDoneAudioSeeking) {
+ RequestAudioData();
+ }
+}
+
+void
+AccurateSeekTask::OnSeekRejected(nsresult aResult)
+{
+ AssertOwnerThread();
+
+ mSeekRequest.Complete();
+ MOZ_ASSERT(NS_FAILED(aResult), "Cancels should also disconnect mSeekRequest");
+ RejectIfExist(aResult, __func__);
+}
+
+void
+AccurateSeekTask::AdjustFastSeekIfNeeded(MediaData* aSample)
+{
+ AssertOwnerThread();
+ if (mTarget.IsFast() &&
+ mTarget.GetTime() > mCurrentTimeBeforeSeek &&
+ aSample->mTime < mCurrentTimeBeforeSeek.ToMicroseconds()) {
+ // We are doing a fastSeek, but we ended up *before* the previous
+ // playback position. This is surprising UX, so switch to an accurate
+ // seek and decode to the seek target. This is not conformant to the
+ // spec, fastSeek should always be fast, but until we get the time to
+ // change all Readers to seek to the keyframe after the currentTime
+ // in this case, we'll just decode forward. Bug 1026330.
+ mTarget.SetType(SeekTarget::Accurate);
+ }
+}
+
+void
+AccurateSeekTask::OnAudioDecoded(MediaData* aAudioSample)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ RefPtr<MediaData> audio(aAudioSample);
+ MOZ_ASSERT(audio);
+
+ // The MDSM::mDecodedAudioEndTime will be updated once the whole SeekTask is
+ // resolved.
+
+ SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", audio->mTime, audio->GetEndTime());
+
+ // Video-only seek doesn't reset audio decoder. There might be pending audio
+ // requests when AccurateSeekTask::Seek() begins. We will just store the data
+ // without checking |mDiscontinuity| or calling DropAudioUpToSeekTarget().
+ if (mTarget.IsVideoOnly()) {
+ mSeekedAudioData = audio.forget();
+ return;
+ }
+
+ AdjustFastSeekIfNeeded(audio);
+
+ if (mTarget.IsFast()) {
+ // Non-precise seek; we can stop the seek at the first sample.
+ mSeekedAudioData = audio;
+ mDoneAudioSeeking = true;
+ } else {
+ nsresult rv = DropAudioUpToSeekTarget(audio);
+ if (NS_FAILED(rv)) {
+ CancelCallbacks();
+ RejectIfExist(rv, __func__);
+ return;
+ }
+ }
+
+ if (!mDoneAudioSeeking) {
+ RequestAudioData();
+ return;
+ }
+ MaybeFinishSeek();
+}
+
+void
+AccurateSeekTask::OnNotDecoded(MediaData::Type aType,
+ const MediaResult& aError)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ SAMPLE_LOG("OnNotDecoded type=%d reason=%u", aType, aError.Code());
+
+ // Ignore pending requests from video-only seek.
+ if (aType == MediaData::AUDIO_DATA && mTarget.IsVideoOnly()) {
+ return;
+ }
+
+ // If the decoder is waiting for data, we tell it to call us back when the
+ // data arrives.
+ if (aError == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
+ mReader->WaitForData(aType);
+ return;
+ }
+
+ if (aError == NS_ERROR_DOM_MEDIA_CANCELED) {
+ if (aType == MediaData::AUDIO_DATA) {
+ RequestAudioData();
+ } else {
+ RequestVideoData();
+ }
+ return;
+ }
+
+ if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ if (aType == MediaData::AUDIO_DATA) {
+ mIsAudioQueueFinished = true;
+ mDoneAudioSeeking = true;
+ } else {
+ mIsVideoQueueFinished = true;
+ mDoneVideoSeeking = true;
+ if (mFirstVideoFrameAfterSeek) {
+ // Hit the end of stream. Move mFirstVideoFrameAfterSeek into
+ // mSeekedVideoData so we have something to display after seeking.
+ mSeekedVideoData = mFirstVideoFrameAfterSeek.forget();
+ }
+ }
+ MaybeFinishSeek();
+ return;
+ }
+
+ // This is a decode error, delegate to the generic error path.
+ CancelCallbacks();
+ RejectIfExist(aError, __func__);
+}
+
+void
+AccurateSeekTask::OnVideoDecoded(MediaData* aVideoSample)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ RefPtr<MediaData> video(aVideoSample);
+ MOZ_ASSERT(video);
+
+ // The MDSM::mDecodedVideoEndTime will be updated once the whole SeekTask is
+ // resolved.
+
+ SAMPLE_LOG("OnVideoDecoded [%lld,%lld]", video->mTime, video->GetEndTime());
+
+ AdjustFastSeekIfNeeded(video);
+
+ if (mTarget.IsFast()) {
+ // Non-precise seek. We can stop the seek at the first sample.
+ mSeekedVideoData = video;
+ mDoneVideoSeeking = true;
+ } else {
+ nsresult rv = DropVideoUpToSeekTarget(video.get());
+ if (NS_FAILED(rv)) {
+ CancelCallbacks();
+ RejectIfExist(rv, __func__);
+ return;
+ }
+ }
+
+ if (!mDoneVideoSeeking) {
+ RequestVideoData();
+ return;
+ }
+ MaybeFinishSeek();
+}
+
+void
+AccurateSeekTask::SetCallbacks()
+{
+ AssertOwnerThread();
+
+ RefPtr<AccurateSeekTask> self = this;
+ mAudioCallback = mReader->AudioCallback().Connect(
+ OwnerThread(), [self] (AudioCallbackData aData) {
+ if (aData.is<MediaData*>()) {
+ self->OnAudioDecoded(aData.as<MediaData*>());
+ } else {
+ self->OnNotDecoded(MediaData::AUDIO_DATA,
+ aData.as<MediaResult>());
+ }
+ });
+
+ mVideoCallback = mReader->VideoCallback().Connect(
+ OwnerThread(), [self] (VideoCallbackData aData) {
+ typedef Tuple<MediaData*, TimeStamp> Type;
+ if (aData.is<Type>()) {
+ self->OnVideoDecoded(Get<0>(aData.as<Type>()));
+ } else {
+ self->OnNotDecoded(MediaData::VIDEO_DATA,
+ aData.as<MediaResult>());
+ }
+ });
+
+ mAudioWaitCallback = mReader->AudioWaitCallback().Connect(
+ OwnerThread(), [self] (WaitCallbackData aData) {
+ // Ignore pending requests from video-only seek.
+ if (self->mTarget.IsVideoOnly()) {
+ return;
+ }
+ if (aData.is<MediaData::Type>()) {
+ self->RequestAudioData();
+ }
+ });
+
+ mVideoWaitCallback = mReader->VideoWaitCallback().Connect(
+ OwnerThread(), [self] (WaitCallbackData aData) {
+ if (aData.is<MediaData::Type>()) {
+ self->RequestVideoData();
+ }
+ });
+}
+
+void
+AccurateSeekTask::CancelCallbacks()
+{
+ AssertOwnerThread();
+ mAudioCallback.DisconnectIfExists();
+ mVideoCallback.DisconnectIfExists();
+ mAudioWaitCallback.DisconnectIfExists();
+ mVideoWaitCallback.DisconnectIfExists();
+}
+} // namespace mozilla
diff --git a/dom/media/AccurateSeekTask.h b/dom/media/AccurateSeekTask.h
new file mode 100644
index 000000000..e2e6771f1
--- /dev/null
+++ b/dom/media/AccurateSeekTask.h
@@ -0,0 +1,88 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ACCURATE_SEEK_TASK_H
+#define ACCURATE_SEEK_TASK_H
+
+#include "SeekTask.h"
+#include "MediaDecoderReader.h"
+#include "SeekJob.h"
+
+namespace mozilla {
+
+class AccurateSeekTask final : public SeekTask {
+public:
+ AccurateSeekTask(const void* aDecoderID,
+ AbstractThread* aThread,
+ MediaDecoderReaderWrapper* aReader,
+ const SeekTarget& aTarget,
+ const MediaInfo& aInfo,
+ const media::TimeUnit& aEnd,
+ int64_t aCurrentMediaTime);
+
+ void Discard() override;
+
+ RefPtr<SeekTaskPromise> Seek(const media::TimeUnit& aDuration) override;
+
+ bool NeedToResetMDSM() const override;
+
+private:
+ ~AccurateSeekTask();
+
+ void RequestVideoData();
+
+ void RequestAudioData();
+
+ nsresult DropAudioUpToSeekTarget(MediaData* aSample);
+
+ nsresult DropVideoUpToSeekTarget(MediaData* aSample);
+
+ void MaybeFinishSeek();
+
+ void OnSeekResolved(media::TimeUnit);
+
+ void OnSeekRejected(nsresult aResult);
+
+ void OnAudioDecoded(MediaData* aAudioSample);
+
+ void OnVideoDecoded(MediaData* aVideoSample);
+
+ void OnNotDecoded(MediaData::Type, const MediaResult&);
+
+ void SetCallbacks();
+
+ void CancelCallbacks();
+
+ void AdjustFastSeekIfNeeded(MediaData* aSample);
+
+ /*
+ * Internal state.
+ */
+ const media::TimeUnit mCurrentTimeBeforeSeek;
+ const uint32_t mAudioRate; // Audio sample rate.
+ bool mDoneAudioSeeking;
+ bool mDoneVideoSeeking;
+
+ // This temporarily stores the first frame we decode after we seek.
+ // This is so that if we hit end of stream while we're decoding to reach
+ // the seek target, we will still have a frame that we can display as the
+ // last frame in the media.
+ RefPtr<MediaData> mFirstVideoFrameAfterSeek;
+
+ /*
+ * Track the current seek promise made by the reader.
+ */
+ MozPromiseRequestHolder<MediaDecoderReader::SeekPromise> mSeekRequest;
+
+ MediaEventListener mAudioCallback;
+ MediaEventListener mVideoCallback;
+ MediaEventListener mAudioWaitCallback;
+ MediaEventListener mVideoWaitCallback;
+};
+
+} // namespace mozilla
+
+#endif /* ACCURATE_SEEK_TASK_H */
diff --git a/dom/media/AudioBufferUtils.h b/dom/media/AudioBufferUtils.h
new file mode 100644
index 000000000..6237294c9
--- /dev/null
+++ b/dom/media/AudioBufferUtils.h
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_SCRATCHBUFFER_H_
+#define MOZILLA_SCRATCHBUFFER_H_
+#include <mozilla/PodOperations.h>
+#include <algorithm>
+
+namespace mozilla {
+
+/**
+ * The classes in this file provide a interface that uses frames as a unit.
+ * However, they store their offsets in samples (because it's handy for pointer
+ * operations). Those functions can convert between the two units.
+ */
+static inline uint32_t FramesToSamples(uint32_t aChannels, uint32_t aFrames) {
+ return aFrames * aChannels;
+}
+
+static inline uint32_t SamplesToFrames(uint32_t aChannels, uint32_t aSamples) {
+ MOZ_ASSERT(!(aSamples % aChannels), "Frame alignment is wrong.");
+ return aSamples / aChannels;
+}
+
+/**
+ * Class that gets a buffer pointer from an audio callback and provides a safe
+ * interface to manipulate this buffer, and to ensure we are not missing frames
+ * by the end of the callback.
+ */
+template<typename T, uint32_t CHANNELS>
+class AudioCallbackBufferWrapper
+{
+public:
+ AudioCallbackBufferWrapper()
+ : mBuffer(nullptr),
+ mSamples(0),
+ mSampleWriteOffset(1)
+ {}
+ /**
+ * Set the buffer in this wrapper. This is to be called at the beginning of
+ * the callback.
+ */
+ void SetBuffer(T* aBuffer, uint32_t aFrames) {
+ MOZ_ASSERT(!mBuffer && !mSamples,
+ "SetBuffer called twice.");
+ mBuffer = aBuffer;
+ mSamples = FramesToSamples(CHANNELS, aFrames);
+ mSampleWriteOffset = 0;
+ }
+
+ /**
+ * Write some frames to the internal buffer. Free space in the buffer should
+ * be check prior to calling this.
+ */
+ void WriteFrames(T* aBuffer, uint32_t aFrames) {
+ MOZ_ASSERT(aFrames <= Available(),
+ "Writing more that we can in the audio buffer.");
+
+ PodCopy(mBuffer + mSampleWriteOffset, aBuffer, FramesToSamples(CHANNELS,
+ aFrames));
+ mSampleWriteOffset += FramesToSamples(CHANNELS, aFrames);
+ }
+
+ /**
+ * Number of frames that can be written to the buffer.
+ */
+ uint32_t Available() {
+ return SamplesToFrames(CHANNELS, mSamples - mSampleWriteOffset);
+ }
+
+ /**
+ * Check that the buffer is completly filled, and reset internal state so this
+ * instance can be reused.
+ */
+ void BufferFilled() {
+ // It's okay to have exactly zero samples here, it can happen we have an
+ // audio callback driver because of a hint on MSG creation, but the
+ // AudioOutputStream has not been created yet, or if all the streams have finished
+ // but we're still running.
+ // Note: it's also ok if we had data in the scratch buffer - and we usually do - and
+ // all the streams were ended (no mixer callback occured).
+ // XXX Remove this warning, or find a way to avoid it if the mixer callback
+ // isn't called.
+ NS_WARNING_ASSERTION(
+ Available() == 0 || mSampleWriteOffset == 0,
+ "Audio Buffer is not full by the end of the callback.");
+ // Make sure the data returned is always set and not random!
+ if (Available()) {
+ PodZero(mBuffer + mSampleWriteOffset, FramesToSamples(CHANNELS, Available()));
+ }
+ MOZ_ASSERT(mSamples, "Buffer not set.");
+ mSamples = 0;
+ mSampleWriteOffset = 0;
+ mBuffer = nullptr;
+ }
+
+private:
+ /* This is not an owned pointer, but the pointer passed to use via the audio
+ * callback. */
+ T* mBuffer;
+ /* The number of samples of this audio buffer. */
+ uint32_t mSamples;
+ /* The position at which new samples should be written. We want to return to
+ * the audio callback iff this is equal to mSamples. */
+ uint32_t mSampleWriteOffset;
+};
+
+/**
+ * This is a class that interfaces with the AudioCallbackBufferWrapper, and is
+ * responsible for storing the excess of data produced by the MediaStreamGraph
+ * because of different rounding constraints, to be used the next time the audio
+ * backend calls back.
+ */
+template<typename T, uint32_t BLOCK_SIZE, uint32_t CHANNELS>
+class SpillBuffer
+{
+public:
+ SpillBuffer()
+ : mPosition(0)
+ {
+ PodArrayZero(mBuffer);
+ }
+ /* Empty the spill buffer into the buffer of the audio callback. This returns
+ * the number of frames written. */
+ uint32_t Empty(AudioCallbackBufferWrapper<T, CHANNELS>& aBuffer) {
+ uint32_t framesToWrite = std::min(aBuffer.Available(),
+ SamplesToFrames(CHANNELS, mPosition));
+
+ aBuffer.WriteFrames(mBuffer, framesToWrite);
+
+ mPosition -= FramesToSamples(CHANNELS, framesToWrite);
+ // If we didn't empty the spill buffer for some reason, shift the remaining data down
+ if (mPosition > 0) {
+ PodMove(mBuffer, mBuffer + FramesToSamples(CHANNELS, framesToWrite),
+ mPosition);
+ }
+
+ return framesToWrite;
+ }
+ /* Fill the spill buffer from aInput, containing aFrames frames, return the
+ * number of frames written to the spill buffer */
+ uint32_t Fill(T* aInput, uint32_t aFrames) {
+ uint32_t framesToWrite = std::min(aFrames,
+ BLOCK_SIZE - SamplesToFrames(CHANNELS,
+ mPosition));
+
+ PodCopy(mBuffer + mPosition, aInput, FramesToSamples(CHANNELS,
+ framesToWrite));
+
+ mPosition += FramesToSamples(CHANNELS, framesToWrite);
+
+ return framesToWrite;
+ }
+private:
+ /* The spilled data. */
+ T mBuffer[BLOCK_SIZE * CHANNELS];
+ /* The current write position, in samples, in the buffer when filling, or the
+ * amount of buffer filled when emptying. */
+ uint32_t mPosition;
+};
+
+} // namespace mozilla
+
+#endif // MOZILLA_SCRATCHBUFFER_H_
diff --git a/dom/media/AudioCaptureStream.cpp b/dom/media/AudioCaptureStream.cpp
new file mode 100644
index 000000000..c381ac621
--- /dev/null
+++ b/dom/media/AudioCaptureStream.cpp
@@ -0,0 +1,169 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamGraphImpl.h"
+#include "MediaStreamListener.h"
+#include "mozilla/MathAlgorithms.h"
+#include "mozilla/Unused.h"
+
+#include "AudioSegment.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Attributes.h"
+#include "AudioCaptureStream.h"
+#include "ImageContainer.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioNodeExternalInputStream.h"
+#include "webaudio/MediaStreamAudioDestinationNode.h"
+#include <algorithm>
+#include "DOMMediaStream.h"
+
+using namespace mozilla::layers;
+using namespace mozilla::dom;
+using namespace mozilla::gfx;
+
+namespace mozilla
+{
+
+// We are mixing to mono until PeerConnection can accept stereo
+static const uint32_t MONO = 1;
+
+AudioCaptureStream::AudioCaptureStream(TrackID aTrackId)
+ : ProcessedMediaStream(), mTrackId(aTrackId), mStarted(false), mTrackCreated(false)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(AudioCaptureStream);
+ mMixer.AddCallback(this);
+}
+
+AudioCaptureStream::~AudioCaptureStream()
+{
+ MOZ_COUNT_DTOR(AudioCaptureStream);
+ mMixer.RemoveCallback(this);
+}
+
+void
+AudioCaptureStream::Start()
+{
+ class Message : public ControlMessage {
+ public:
+ explicit Message(AudioCaptureStream* aStream)
+ : ControlMessage(aStream), mStream(aStream) {}
+
+ virtual void Run()
+ {
+ mStream->mStarted = true;
+ }
+
+ protected:
+ AudioCaptureStream* mStream;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this));
+}
+
+void
+AudioCaptureStream::ProcessInput(GraphTime aFrom, GraphTime aTo,
+ uint32_t aFlags)
+{
+ if (!mStarted) {
+ return;
+ }
+
+ uint32_t inputCount = mInputs.Length();
+ StreamTracks::Track* track = EnsureTrack(mTrackId);
+ // Notify the DOM everything is in order.
+ if (!mTrackCreated) {
+ for (uint32_t i = 0; i < mListeners.Length(); i++) {
+ MediaStreamListener* l = mListeners[i];
+ AudioSegment tmp;
+ l->NotifyQueuedTrackChanges(
+ Graph(), mTrackId, 0, TrackEventCommand::TRACK_EVENT_CREATED, tmp);
+ l->NotifyFinishedTrackCreation(Graph());
+ }
+ mTrackCreated = true;
+ }
+
+ if (IsFinishedOnGraphThread()) {
+ return;
+ }
+
+ // If the captured stream is connected back to a object on the page (be it an
+ // HTMLMediaElement with a stream as source, or an AudioContext), a cycle
+ // situation occur. This can work if it's an AudioContext with at least one
+ // DelayNode, but the MSG will mute the whole cycle otherwise.
+ if (InMutedCycle() || inputCount == 0) {
+ track->Get<AudioSegment>()->AppendNullData(aTo - aFrom);
+ } else {
+ // We mix down all the tracks of all inputs, to a stereo track. Everything
+ // is {up,down}-mixed to stereo.
+ mMixer.StartMixing();
+ AudioSegment output;
+ for (uint32_t i = 0; i < inputCount; i++) {
+ MediaStream* s = mInputs[i]->GetSource();
+ StreamTracks::TrackIter track(s->GetStreamTracks(), MediaSegment::AUDIO);
+ if (track.IsEnded()) {
+ // No tracks for this input. Still we append data to trigger the mixer.
+ AudioSegment toMix;
+ toMix.AppendNullData(aTo - aFrom);
+ toMix.Mix(mMixer, MONO, Graph()->GraphRate());
+ }
+ for (; !track.IsEnded(); track.Next()) {
+ AudioSegment* inputSegment = track->Get<AudioSegment>();
+ StreamTime inputStart = s->GraphTimeToStreamTimeWithBlocking(aFrom);
+ StreamTime inputEnd = s->GraphTimeToStreamTimeWithBlocking(aTo);
+ AudioSegment toMix;
+ if (track->IsEnded() && inputSegment->GetDuration() <= inputStart) {
+ toMix.AppendNullData(aTo - aFrom);
+ } else {
+ toMix.AppendSlice(*inputSegment, inputStart, inputEnd);
+ // Care for streams blocked in the [aTo, aFrom] range.
+ if (inputEnd - inputStart < aTo - aFrom) {
+ toMix.AppendNullData((aTo - aFrom) - (inputEnd - inputStart));
+ }
+ }
+ toMix.Mix(mMixer, MONO, Graph()->GraphRate());
+ }
+ }
+ // This calls MixerCallback below
+ mMixer.FinishMixing();
+ }
+
+ // Regardless of the status of the input tracks, we go foward.
+ mTracks.AdvanceKnownTracksTime(GraphTimeToStreamTimeWithBlocking((aTo)));
+}
+
+void
+AudioCaptureStream::MixerCallback(AudioDataValue* aMixedBuffer,
+ AudioSampleFormat aFormat, uint32_t aChannels,
+ uint32_t aFrames, uint32_t aSampleRate)
+{
+ AutoTArray<nsTArray<AudioDataValue>, MONO> output;
+ AutoTArray<const AudioDataValue*, MONO> bufferPtrs;
+ output.SetLength(MONO);
+ bufferPtrs.SetLength(MONO);
+
+ uint32_t written = 0;
+ // We need to copy here, because the mixer will reuse the storage, we should
+ // not hold onto it. Buffers are in planar format.
+ for (uint32_t channel = 0; channel < aChannels; channel++) {
+ AudioDataValue* out = output[channel].AppendElements(aFrames);
+ PodCopy(out, aMixedBuffer + written, aFrames);
+ bufferPtrs[channel] = out;
+ written += aFrames;
+ }
+ AudioChunk chunk;
+ chunk.mBuffer = new mozilla::SharedChannelArrayBuffer<AudioDataValue>(&output);
+ chunk.mDuration = aFrames;
+ chunk.mBufferFormat = aFormat;
+ chunk.mVolume = 1.0f;
+ chunk.mChannelData.SetLength(MONO);
+ for (uint32_t channel = 0; channel < aChannels; channel++) {
+ chunk.mChannelData[channel] = bufferPtrs[channel];
+ }
+
+ // Now we have mixed data, simply append it to out track.
+ EnsureTrack(mTrackId)->Get<AudioSegment>()->AppendAndConsumeChunk(&chunk);
+}
+}
diff --git a/dom/media/AudioCaptureStream.h b/dom/media/AudioCaptureStream.h
new file mode 100644
index 000000000..61f0dfe1c
--- /dev/null
+++ b/dom/media/AudioCaptureStream.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUDIOCAPTURESTREAM_H_
+#define MOZILLA_AUDIOCAPTURESTREAM_H_
+
+#include "MediaStreamGraph.h"
+#include "AudioMixer.h"
+#include "StreamTracks.h"
+#include <algorithm>
+
+namespace mozilla
+{
+
+class DOMMediaStream;
+
+/**
+ * See MediaStreamGraph::CreateAudioCaptureStream.
+ */
+class AudioCaptureStream : public ProcessedMediaStream,
+ public MixerCallbackReceiver
+{
+public:
+ explicit AudioCaptureStream(TrackID aTrackId);
+ virtual ~AudioCaptureStream();
+
+ void Start();
+
+ void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) override;
+
+protected:
+ void MixerCallback(AudioDataValue* aMixedBuffer, AudioSampleFormat aFormat,
+ uint32_t aChannels, uint32_t aFrames,
+ uint32_t aSampleRate) override;
+ AudioMixer mMixer;
+ TrackID mTrackId;
+ bool mStarted;
+ bool mTrackCreated;
+};
+}
+
+#endif /* MOZILLA_AUDIOCAPTURESTREAM_H_ */
diff --git a/dom/media/AudioChannelFormat.cpp b/dom/media/AudioChannelFormat.cpp
new file mode 100644
index 000000000..2fd4dce8b
--- /dev/null
+++ b/dom/media/AudioChannelFormat.cpp
@@ -0,0 +1,18 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioChannelFormat.h"
+
+#include <algorithm>
+
+namespace mozilla {
+
+uint32_t
+GetAudioChannelsSuperset(uint32_t aChannels1, uint32_t aChannels2)
+{
+ return std::max(aChannels1, aChannels2);
+}
+
+} // namespace mozilla
diff --git a/dom/media/AudioChannelFormat.h b/dom/media/AudioChannelFormat.h
new file mode 100644
index 000000000..73bbe40b8
--- /dev/null
+++ b/dom/media/AudioChannelFormat.h
@@ -0,0 +1,248 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MOZILLA_AUDIOCHANNELFORMAT_H_
+#define MOZILLA_AUDIOCHANNELFORMAT_H_
+
+#include <stdint.h>
+
+#include "nsTArrayForwardDeclare.h"
+#include "AudioSampleFormat.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+/*
+ * This file provides utilities for upmixing and downmixing channels.
+ *
+ * The channel layouts, upmixing and downmixing are consistent with the
+ * Web Audio spec.
+ *
+ * Channel layouts for up to 6 channels:
+ * mono { M }
+ * stereo { L, R }
+ * { L, R, C }
+ * quad { L, R, SL, SR }
+ * { L, R, C, SL, SR }
+ * 5.1 { L, R, C, LFE, SL, SR }
+ *
+ * Only 1, 2, 4 and 6 are currently defined in Web Audio.
+ */
+
+enum {
+ SURROUND_L,
+ SURROUND_R,
+ SURROUND_C,
+ SURROUND_LFE,
+ SURROUND_SL,
+ SURROUND_SR
+};
+
+const uint32_t CUSTOM_CHANNEL_LAYOUTS = 6;
+
+// This is defined by some Windows SDK header.
+#undef IGNORE
+
+const int IGNORE = CUSTOM_CHANNEL_LAYOUTS;
+const float IGNORE_F = 0.0f;
+
+const int gMixingMatrixIndexByChannels[CUSTOM_CHANNEL_LAYOUTS - 1] =
+ { 0, 5, 9, 12, 14 };
+
+/**
+ * Return a channel count whose channel layout includes all the channels from
+ * aChannels1 and aChannels2.
+ */
+uint32_t
+GetAudioChannelsSuperset(uint32_t aChannels1, uint32_t aChannels2);
+
+/**
+ * DownMixMatrix represents a conversion matrix efficiently by exploiting the
+ * fact that each input channel contributes to at most one output channel,
+ * except possibly for the C input channel in layouts that have one. Also,
+ * every input channel is multiplied by the same coefficient for every output
+ * channel it contributes to.
+ */
+const float SQRT_ONE_HALF = 0.7071067811865476f;
+
+struct DownMixMatrix {
+ // Every input channel c is copied to output channel mInputDestination[c]
+ // after multiplying by mInputCoefficient[c].
+ uint8_t mInputDestination[CUSTOM_CHANNEL_LAYOUTS];
+ // If not IGNORE, then the C channel is copied to this output channel after
+ // multiplying by its coefficient.
+ uint8_t mCExtraDestination;
+ float mInputCoefficient[CUSTOM_CHANNEL_LAYOUTS];
+};
+
+static const DownMixMatrix
+gDownMixMatrices[CUSTOM_CHANNEL_LAYOUTS*(CUSTOM_CHANNEL_LAYOUTS - 1)/2] =
+{
+ // Downmixes to mono
+ { { 0, 0 }, IGNORE, { 0.5f, 0.5f } },
+ { { 0, IGNORE, IGNORE }, IGNORE, { 1.0f, IGNORE_F, IGNORE_F } },
+ { { 0, 0, 0, 0 }, IGNORE, { 0.25f, 0.25f, 0.25f, 0.25f } },
+ { { 0, IGNORE, IGNORE, IGNORE, IGNORE }, IGNORE, { 1.0f, IGNORE_F, IGNORE_F, IGNORE_F, IGNORE_F } },
+ { { 0, 0, 0, IGNORE, 0, 0 }, IGNORE, { SQRT_ONE_HALF, SQRT_ONE_HALF, 1.0f, IGNORE_F, 0.5f, 0.5f } },
+ // Downmixes to stereo
+ { { 0, 1, IGNORE }, IGNORE, { 1.0f, 1.0f, IGNORE_F } },
+ { { 0, 1, 0, 1 }, IGNORE, { 0.5f, 0.5f, 0.5f, 0.5f } },
+ { { 0, 1, IGNORE, IGNORE, IGNORE }, IGNORE, { 1.0f, 1.0f, IGNORE_F, IGNORE_F, IGNORE_F } },
+ { { 0, 1, 0, IGNORE, 0, 1 }, 1, { 1.0f, 1.0f, SQRT_ONE_HALF, IGNORE_F, SQRT_ONE_HALF, SQRT_ONE_HALF } },
+ // Downmixes to 3-channel
+ { { 0, 1, 2, IGNORE }, IGNORE, { 1.0f, 1.0f, 1.0f, IGNORE_F } },
+ { { 0, 1, 2, IGNORE, IGNORE }, IGNORE, { 1.0f, 1.0f, 1.0f, IGNORE_F, IGNORE_F } },
+ { { 0, 1, 2, IGNORE, IGNORE, IGNORE }, IGNORE, { 1.0f, 1.0f, 1.0f, IGNORE_F, IGNORE_F, IGNORE_F } },
+ // Downmixes to quad
+ { { 0, 1, 2, 3, IGNORE }, IGNORE, { 1.0f, 1.0f, 1.0f, 1.0f, IGNORE_F } },
+ { { 0, 1, 0, IGNORE, 2, 3 }, 1, { 1.0f, 1.0f, SQRT_ONE_HALF, IGNORE_F, 1.0f, 1.0f } },
+ // Downmixes to 5-channel
+ { { 0, 1, 2, 3, 4, IGNORE }, IGNORE, { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, IGNORE_F } }
+};
+
+/**
+ * Given an array of input channels, downmix to aOutputChannelCount, and copy
+ * the results to the channel buffers in aOutputChannels. Don't call this with
+ * input count <= output count.
+ */
+template<typename T>
+void AudioChannelsDownMix(const nsTArray<const T*>& aChannelArray,
+ T** aOutputChannels,
+ uint32_t aOutputChannelCount,
+ uint32_t aDuration)
+{
+ uint32_t inputChannelCount = aChannelArray.Length();
+ const T* const* inputChannels = aChannelArray.Elements();
+ NS_ASSERTION(inputChannelCount > aOutputChannelCount, "Nothing to do");
+
+ if (inputChannelCount > 6) {
+ // Just drop the unknown channels.
+ for (uint32_t o = 0; o < aOutputChannelCount; ++o) {
+ PodCopy(aOutputChannels[o], inputChannels[o], aDuration);
+ }
+ return;
+ }
+
+ // Ignore unknown channels, they're just dropped.
+ inputChannelCount = std::min<uint32_t>(6, inputChannelCount);
+
+ const DownMixMatrix& m = gDownMixMatrices[
+ gMixingMatrixIndexByChannels[aOutputChannelCount - 1] +
+ inputChannelCount - aOutputChannelCount - 1];
+
+ // This is slow, but general. We can define custom code for special
+ // cases later.
+ for (uint32_t s = 0; s < aDuration; ++s) {
+ // Reserve an extra junk channel at the end for the cases where we
+ // want an input channel to contribute to nothing
+ T outputChannels[CUSTOM_CHANNEL_LAYOUTS + 1] = {0};
+ for (uint32_t c = 0; c < inputChannelCount; ++c) {
+ outputChannels[m.mInputDestination[c]] +=
+ m.mInputCoefficient[c]*(static_cast<const T*>(inputChannels[c]))[s];
+ }
+ // Utilize the fact that in every layout, C is the third channel.
+ if (m.mCExtraDestination != IGNORE) {
+ outputChannels[m.mCExtraDestination] +=
+ m.mInputCoefficient[SURROUND_C]*(static_cast<const T*>(inputChannels[SURROUND_C]))[s];
+ }
+
+ for (uint32_t c = 0; c < aOutputChannelCount; ++c) {
+ aOutputChannels[c][s] = outputChannels[c];
+ }
+ }
+}
+
+/**
+ * UpMixMatrix represents a conversion matrix by exploiting the fact that
+ * each output channel comes from at most one input channel.
+ */
+struct UpMixMatrix {
+ uint8_t mInputDestination[CUSTOM_CHANNEL_LAYOUTS];
+};
+
+static const UpMixMatrix
+gUpMixMatrices[CUSTOM_CHANNEL_LAYOUTS*(CUSTOM_CHANNEL_LAYOUTS - 1)/2] =
+{
+ // Upmixes from mono
+ { { 0, 0 } },
+ { { 0, IGNORE, IGNORE } },
+ { { 0, 0, IGNORE, IGNORE } },
+ { { 0, IGNORE, IGNORE, IGNORE, IGNORE } },
+ { { IGNORE, IGNORE, 0, IGNORE, IGNORE, IGNORE } },
+ // Upmixes from stereo
+ { { 0, 1, IGNORE } },
+ { { 0, 1, IGNORE, IGNORE } },
+ { { 0, 1, IGNORE, IGNORE, IGNORE } },
+ { { 0, 1, IGNORE, IGNORE, IGNORE, IGNORE } },
+ // Upmixes from 3-channel
+ { { 0, 1, 2, IGNORE } },
+ { { 0, 1, 2, IGNORE, IGNORE } },
+ { { 0, 1, 2, IGNORE, IGNORE, IGNORE } },
+ // Upmixes from quad
+ { { 0, 1, 2, 3, IGNORE } },
+ { { 0, 1, IGNORE, IGNORE, 2, 3 } },
+ // Upmixes from 5-channel
+ { { 0, 1, 2, 3, 4, IGNORE } }
+};
+
+
+/**
+ * Given an array of input channel data, and an output channel count,
+ * replaces the array with an array of upmixed channels.
+ * This shuffles the array and may set some channel buffers to aZeroChannel.
+ * Don't call this with input count >= output count.
+ * This may return *more* channels than requested. In that case, downmixing
+ * is required to to get to aOutputChannelCount. (This is how we handle
+ * odd cases like 3 -> 4 upmixing.)
+ * If aChannelArray.Length() was the input to one of a series of
+ * GetAudioChannelsSuperset calls resulting in aOutputChannelCount,
+ * no downmixing will be required.
+ */
+template<typename T>
+void
+AudioChannelsUpMix(nsTArray<const T*>* aChannelArray,
+ uint32_t aOutputChannelCount,
+ const T* aZeroChannel)
+{
+ uint32_t inputChannelCount = aChannelArray->Length();
+ uint32_t outputChannelCount =
+ GetAudioChannelsSuperset(aOutputChannelCount, inputChannelCount);
+ NS_ASSERTION(outputChannelCount > inputChannelCount,
+ "No up-mix needed");
+ MOZ_ASSERT(inputChannelCount > 0, "Bad number of channels");
+ MOZ_ASSERT(outputChannelCount > 0, "Bad number of channels");
+
+ aChannelArray->SetLength(outputChannelCount);
+
+ if (inputChannelCount < CUSTOM_CHANNEL_LAYOUTS &&
+ outputChannelCount <= CUSTOM_CHANNEL_LAYOUTS) {
+ const UpMixMatrix& m = gUpMixMatrices[
+ gMixingMatrixIndexByChannels[inputChannelCount - 1] +
+ outputChannelCount - inputChannelCount - 1];
+
+ const T* outputChannels[CUSTOM_CHANNEL_LAYOUTS];
+
+ for (uint32_t i = 0; i < outputChannelCount; ++i) {
+ uint8_t channelIndex = m.mInputDestination[i];
+ if (channelIndex == IGNORE) {
+ outputChannels[i] = aZeroChannel;
+ } else {
+ outputChannels[i] = aChannelArray->ElementAt(channelIndex);
+ }
+ }
+ for (uint32_t i = 0; i < outputChannelCount; ++i) {
+ aChannelArray->ElementAt(i) = outputChannels[i];
+ }
+ return;
+ }
+
+ for (uint32_t i = inputChannelCount; i < outputChannelCount; ++i) {
+ aChannelArray->ElementAt(i) = aZeroChannel;
+ }
+}
+
+} // namespace mozilla
+
+#endif /* MOZILLA_AUDIOCHANNELFORMAT_H_ */
diff --git a/dom/media/AudioCompactor.cpp b/dom/media/AudioCompactor.cpp
new file mode 100644
index 000000000..6ffbc966f
--- /dev/null
+++ b/dom/media/AudioCompactor.cpp
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "AudioCompactor.h"
+#if defined(MOZ_MEMORY)
+# include "mozmemory.h"
+#endif
+
+namespace mozilla {
+
+static size_t
+MallocGoodSize(size_t aSize)
+{
+# if defined(MOZ_MEMORY)
+ return malloc_good_size(aSize);
+# else
+ return aSize;
+# endif
+}
+
+static size_t
+TooMuchSlop(size_t aSize, size_t aAllocSize, size_t aMaxSlop)
+{
+ // If the allocated size is less then our target size, then we
+ // are chunking. This means it will be completely filled with
+ // zero slop.
+ size_t slop = (aAllocSize > aSize) ? (aAllocSize - aSize) : 0;
+ return slop > aMaxSlop;
+}
+
+uint32_t
+AudioCompactor::GetChunkSamples(uint32_t aFrames, uint32_t aChannels,
+ size_t aMaxSlop)
+{
+ size_t size = AudioDataSize(aFrames, aChannels);
+ size_t chunkSize = MallocGoodSize(size);
+
+ // Reduce the chunk size until we meet our slop goal or the chunk
+ // approaches an unreasonably small size.
+ while (chunkSize > 64 && TooMuchSlop(size, chunkSize, aMaxSlop)) {
+ chunkSize = MallocGoodSize(chunkSize / 2);
+ }
+
+ // Calculate the number of samples based on expected malloc size
+ // in order to allow as many frames as possible to be packed.
+ return chunkSize / sizeof(AudioDataValue);
+}
+
+uint32_t
+AudioCompactor::NativeCopy::operator()(AudioDataValue *aBuffer,
+ uint32_t aSamples)
+{
+ NS_ASSERTION(aBuffer, "cannot copy to null buffer pointer");
+ NS_ASSERTION(aSamples, "cannot copy zero values");
+
+ size_t bufferBytes = aSamples * sizeof(AudioDataValue);
+ size_t maxBytes = std::min(bufferBytes, mSourceBytes - mNextByte);
+ uint32_t frames = maxBytes / BytesPerFrame(mChannels);
+ size_t bytes = frames * BytesPerFrame(mChannels);
+
+ NS_ASSERTION((mNextByte + bytes) <= mSourceBytes,
+ "tried to copy beyond source buffer");
+ NS_ASSERTION(bytes <= bufferBytes, "tried to copy beyond destination buffer");
+
+ memcpy(aBuffer, mSource + mNextByte, bytes);
+
+ mNextByte += bytes;
+ return frames;
+}
+
+} // namespace mozilla
diff --git a/dom/media/AudioCompactor.h b/dom/media/AudioCompactor.h
new file mode 100644
index 000000000..554f5b5f5
--- /dev/null
+++ b/dom/media/AudioCompactor.h
@@ -0,0 +1,138 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AudioCompactor_h)
+#define AudioCompactor_h
+
+#include "MediaQueue.h"
+#include "MediaData.h"
+#include "VideoUtils.h"
+
+namespace mozilla {
+
+class AudioCompactor
+{
+public:
+ explicit AudioCompactor(MediaQueue<AudioData>& aQueue)
+ : mQueue(aQueue)
+ {
+ // Determine padding size used by AlignedBuffer.
+ size_t paddedSize = AlignedAudioBuffer::AlignmentPaddingSize();
+ mSamplesPadding = paddedSize / sizeof(AudioDataValue);
+ if (mSamplesPadding * sizeof(AudioDataValue) < paddedSize) {
+ // Round up.
+ mSamplesPadding++;
+ }
+ }
+
+ // Push audio data into the underlying queue with minimal heap allocation
+ // slop. This method is responsible for allocating AudioDataValue[] buffers.
+ // The caller must provide a functor to copy the data into the buffers. The
+ // functor must provide the following signature:
+ //
+ // uint32_t operator()(AudioDataValue *aBuffer, uint32_t aSamples);
+ //
+ // The functor must copy as many complete frames as possible to the provided
+ // buffer given its length (in AudioDataValue elements). The number of frames
+ // copied must be returned. This copy functor must support being called
+ // multiple times in order to copy the audio data fully. The copy functor
+ // must copy full frames as partial frames will be ignored.
+ template<typename CopyFunc>
+ bool Push(int64_t aOffset, int64_t aTime, int32_t aSampleRate,
+ uint32_t aFrames, uint32_t aChannels, CopyFunc aCopyFunc)
+ {
+ // If we are losing more than a reasonable amount to padding, try to chunk
+ // the data.
+ size_t maxSlop = AudioDataSize(aFrames, aChannels) / MAX_SLOP_DIVISOR;
+
+ while (aFrames > 0) {
+ uint32_t samples = GetChunkSamples(aFrames, aChannels, maxSlop);
+ if (samples / aChannels > mSamplesPadding / aChannels + 1) {
+ samples -= mSamplesPadding;
+ }
+ AlignedAudioBuffer buffer(samples);
+ if (!buffer) {
+ return false;
+ }
+
+ // Copy audio data to buffer using caller-provided functor.
+ uint32_t framesCopied = aCopyFunc(buffer.get(), samples);
+
+ NS_ASSERTION(framesCopied <= aFrames, "functor copied too many frames");
+ buffer.SetLength(size_t(framesCopied) * aChannels);
+
+ CheckedInt64 duration = FramesToUsecs(framesCopied, aSampleRate);
+ if (!duration.isValid()) {
+ return false;
+ }
+
+ mQueue.Push(new AudioData(aOffset,
+ aTime,
+ duration.value(),
+ framesCopied,
+ Move(buffer),
+ aChannels,
+ aSampleRate));
+
+ // Remove the frames we just pushed into the queue and loop if there is
+ // more to be done.
+ aTime += duration.value();
+ aFrames -= framesCopied;
+
+ // NOTE: No need to update aOffset as its only an approximation anyway.
+ }
+
+ return true;
+ }
+
+ // Copy functor suitable for copying audio samples already in the
+ // AudioDataValue format/layout expected by AudioStream on this platform.
+ class NativeCopy
+ {
+ public:
+ NativeCopy(const uint8_t* aSource, size_t aSourceBytes,
+ uint32_t aChannels)
+ : mSource(aSource)
+ , mSourceBytes(aSourceBytes)
+ , mChannels(aChannels)
+ , mNextByte(0)
+ { }
+
+ uint32_t operator()(AudioDataValue *aBuffer, uint32_t aSamples);
+
+ private:
+ const uint8_t* const mSource;
+ const size_t mSourceBytes;
+ const uint32_t mChannels;
+ size_t mNextByte;
+ };
+
+ // Allow 12.5% slop before chunking kicks in. Public so that the gtest can
+ // access it.
+ static const size_t MAX_SLOP_DIVISOR = 8;
+
+private:
+ // Compute the number of AudioDataValue samples that will be fit the most
+ // frames while keeping heap allocation slop less than the given threshold.
+ static uint32_t
+ GetChunkSamples(uint32_t aFrames, uint32_t aChannels, size_t aMaxSlop);
+
+ static size_t BytesPerFrame(uint32_t aChannels)
+ {
+ return sizeof(AudioDataValue) * aChannels;
+ }
+
+ static size_t AudioDataSize(uint32_t aFrames, uint32_t aChannels)
+ {
+ return aFrames * BytesPerFrame(aChannels);
+ }
+
+ MediaQueue<AudioData> &mQueue;
+ size_t mSamplesPadding;
+};
+
+} // namespace mozilla
+
+#endif // AudioCompactor_h
diff --git a/dom/media/AudioConverter.cpp b/dom/media/AudioConverter.cpp
new file mode 100644
index 000000000..77ad46ec6
--- /dev/null
+++ b/dom/media/AudioConverter.cpp
@@ -0,0 +1,393 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioConverter.h"
+#include <string.h>
+#include <speex/speex_resampler.h>
+#include <cmath>
+
+/*
+ * Parts derived from MythTV AudioConvert Class
+ * Created by Jean-Yves Avenard.
+ *
+ * Copyright (C) Bubblestuff Pty Ltd 2013
+ * Copyright (C) foobum@gmail.com 2010
+ */
+
+namespace mozilla {
+
+AudioConverter::AudioConverter(const AudioConfig& aIn, const AudioConfig& aOut)
+ : mIn(aIn)
+ , mOut(aOut)
+ , mResampler(nullptr)
+{
+ MOZ_DIAGNOSTIC_ASSERT(aIn.Format() == aOut.Format() &&
+ aIn.Interleaved() == aOut.Interleaved(),
+ "No format or rate conversion is supported at this stage");
+ MOZ_DIAGNOSTIC_ASSERT(aOut.Channels() <= 2 ||
+ aIn.Channels() == aOut.Channels(),
+ "Only down/upmixing to mono or stereo is supported at this stage");
+ MOZ_DIAGNOSTIC_ASSERT(aOut.Interleaved(), "planar audio format not supported");
+ mIn.Layout().MappingTable(mOut.Layout(), mChannelOrderMap);
+ if (aIn.Rate() != aOut.Rate()) {
+ RecreateResampler();
+ }
+}
+
+AudioConverter::~AudioConverter()
+{
+ if (mResampler) {
+ speex_resampler_destroy(mResampler);
+ mResampler = nullptr;
+ }
+}
+
+bool
+AudioConverter::CanWorkInPlace() const
+{
+ bool needDownmix = mIn.Channels() > mOut.Channels();
+ bool needUpmix = mIn.Channels() < mOut.Channels();
+ bool canDownmixInPlace =
+ mIn.Channels() * AudioConfig::SampleSize(mIn.Format()) >=
+ mOut.Channels() * AudioConfig::SampleSize(mOut.Format());
+ bool needResample = mIn.Rate() != mOut.Rate();
+ bool canResampleInPlace = mIn.Rate() >= mOut.Rate();
+ // We should be able to work in place if 1s of audio input takes less space
+ // than 1s of audio output. However, as we downmix before resampling we can't
+ // perform any upsampling in place (e.g. if incoming rate >= outgoing rate)
+ return !needUpmix && (!needDownmix || canDownmixInPlace) &&
+ (!needResample || canResampleInPlace);
+}
+
+size_t
+AudioConverter::ProcessInternal(void* aOut, const void* aIn, size_t aFrames)
+{
+ if (mIn.Channels() > mOut.Channels()) {
+ return DownmixAudio(aOut, aIn, aFrames);
+ } else if (mIn.Channels() < mOut.Channels()) {
+ return UpmixAudio(aOut, aIn, aFrames);
+ } else if (mIn.Layout() != mOut.Layout() && CanReorderAudio()) {
+ ReOrderInterleavedChannels(aOut, aIn, aFrames);
+ } else if (aIn != aOut) {
+ memmove(aOut, aIn, FramesOutToBytes(aFrames));
+ }
+ return aFrames;
+}
+
+// Reorder interleaved channels.
+// Can work in place (e.g aOut == aIn).
+template <class AudioDataType>
+void
+_ReOrderInterleavedChannels(AudioDataType* aOut, const AudioDataType* aIn,
+ uint32_t aFrames, uint32_t aChannels,
+ const uint8_t* aChannelOrderMap)
+{
+ MOZ_DIAGNOSTIC_ASSERT(aChannels <= MAX_AUDIO_CHANNELS);
+ AudioDataType val[MAX_AUDIO_CHANNELS];
+ for (uint32_t i = 0; i < aFrames; i++) {
+ for (uint32_t j = 0; j < aChannels; j++) {
+ val[j] = aIn[aChannelOrderMap[j]];
+ }
+ for (uint32_t j = 0; j < aChannels; j++) {
+ aOut[j] = val[j];
+ }
+ aOut += aChannels;
+ aIn += aChannels;
+ }
+}
+
+void
+AudioConverter::ReOrderInterleavedChannels(void* aOut, const void* aIn,
+ size_t aFrames) const
+{
+ MOZ_DIAGNOSTIC_ASSERT(mIn.Channels() == mOut.Channels());
+
+ if (mOut.Channels() == 1 || mOut.Layout() == mIn.Layout()) {
+ // If channel count is 1, planar and non-planar formats are the same and
+ // there's nothing to reorder.
+ if (aOut != aIn) {
+ memmove(aOut, aIn, FramesOutToBytes(aFrames));
+ }
+ return;
+ }
+
+ uint32_t bits = AudioConfig::FormatToBits(mOut.Format());
+ switch (bits) {
+ case 8:
+ _ReOrderInterleavedChannels((uint8_t*)aOut, (const uint8_t*)aIn,
+ aFrames, mIn.Channels(), mChannelOrderMap);
+ break;
+ case 16:
+ _ReOrderInterleavedChannels((int16_t*)aOut,(const int16_t*)aIn,
+ aFrames, mIn.Channels(), mChannelOrderMap);
+ break;
+ default:
+ MOZ_DIAGNOSTIC_ASSERT(AudioConfig::SampleSize(mOut.Format()) == 4);
+ _ReOrderInterleavedChannels((int32_t*)aOut,(const int32_t*)aIn,
+ aFrames, mIn.Channels(), mChannelOrderMap);
+ break;
+ }
+}
+
+static inline int16_t clipTo15(int32_t aX)
+{
+ return aX < -32768 ? -32768 : aX <= 32767 ? aX : 32767;
+}
+
+size_t
+AudioConverter::DownmixAudio(void* aOut, const void* aIn, size_t aFrames) const
+{
+ MOZ_ASSERT(mIn.Format() == AudioConfig::FORMAT_S16 ||
+ mIn.Format() == AudioConfig::FORMAT_FLT);
+ MOZ_ASSERT(mIn.Channels() >= mOut.Channels());
+ MOZ_ASSERT(mIn.Layout() == AudioConfig::ChannelLayout(mIn.Channels()),
+ "Can only downmix input data in SMPTE layout");
+ MOZ_ASSERT(mOut.Layout() == AudioConfig::ChannelLayout(2) ||
+ mOut.Layout() == AudioConfig::ChannelLayout(1));
+
+ uint32_t channels = mIn.Channels();
+
+ if (channels == 1 && mOut.Channels() == 1) {
+ if (aOut != aIn) {
+ memmove(aOut, aIn, FramesOutToBytes(aFrames));
+ }
+ return aFrames;
+ }
+
+ if (channels > 2) {
+ if (mIn.Format() == AudioConfig::FORMAT_FLT) {
+ // Downmix matrix. Per-row normalization 1 for rows 3,4 and 2 for rows 5-8.
+ static const float dmatrix[6][8][2]= {
+ /*3*/{{0.5858f,0},{0,0.5858f},{0.4142f,0.4142f}},
+ /*4*/{{0.4226f,0},{0,0.4226f},{0.366f, 0.2114f},{0.2114f,0.366f}},
+ /*5*/{{0.6510f,0},{0,0.6510f},{0.4600f,0.4600f},{0.5636f,0.3254f},{0.3254f,0.5636f}},
+ /*6*/{{0.5290f,0},{0,0.5290f},{0.3741f,0.3741f},{0.3741f,0.3741f},{0.4582f,0.2645f},{0.2645f,0.4582f}},
+ /*7*/{{0.4553f,0},{0,0.4553f},{0.3220f,0.3220f},{0.3220f,0.3220f},{0.2788f,0.2788f},{0.3943f,0.2277f},{0.2277f,0.3943f}},
+ /*8*/{{0.3886f,0},{0,0.3886f},{0.2748f,0.2748f},{0.2748f,0.2748f},{0.3366f,0.1943f},{0.1943f,0.3366f},{0.3366f,0.1943f},{0.1943f,0.3366f}},
+ };
+ // Re-write the buffer with downmixed data
+ const float* in = static_cast<const float*>(aIn);
+ float* out = static_cast<float*>(aOut);
+ for (uint32_t i = 0; i < aFrames; i++) {
+ float sampL = 0.0;
+ float sampR = 0.0;
+ for (uint32_t j = 0; j < channels; j++) {
+ sampL += in[i*mIn.Channels()+j]*dmatrix[mIn.Channels()-3][j][0];
+ sampR += in[i*mIn.Channels()+j]*dmatrix[mIn.Channels()-3][j][1];
+ }
+ *out++ = sampL;
+ *out++ = sampR;
+ }
+ } else if (mIn.Format() == AudioConfig::FORMAT_S16) {
+ // Downmix matrix. Per-row normalization 1 for rows 3,4 and 2 for rows 5-8.
+ // Coefficients in Q14.
+ static const int16_t dmatrix[6][8][2]= {
+ /*3*/{{9598, 0},{0, 9598},{6786,6786}},
+ /*4*/{{6925, 0},{0, 6925},{5997,3462},{3462,5997}},
+ /*5*/{{10663,0},{0, 10663},{7540,7540},{9234,5331},{5331,9234}},
+ /*6*/{{8668, 0},{0, 8668},{6129,6129},{6129,6129},{7507,4335},{4335,7507}},
+ /*7*/{{7459, 0},{0, 7459},{5275,5275},{5275,5275},{4568,4568},{6460,3731},{3731,6460}},
+ /*8*/{{6368, 0},{0, 6368},{4502,4502},{4502,4502},{5514,3184},{3184,5514},{5514,3184},{3184,5514}}
+ };
+ // Re-write the buffer with downmixed data
+ const int16_t* in = static_cast<const int16_t*>(aIn);
+ int16_t* out = static_cast<int16_t*>(aOut);
+ for (uint32_t i = 0; i < aFrames; i++) {
+ int32_t sampL = 0;
+ int32_t sampR = 0;
+ for (uint32_t j = 0; j < channels; j++) {
+ sampL+=in[i*channels+j]*dmatrix[channels-3][j][0];
+ sampR+=in[i*channels+j]*dmatrix[channels-3][j][1];
+ }
+ *out++ = clipTo15((sampL + 8192)>>14);
+ *out++ = clipTo15((sampR + 8192)>>14);
+ }
+ } else {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Unsupported data type");
+ }
+
+ // If we are to continue downmixing to mono, start working on the output
+ // buffer.
+ aIn = aOut;
+ channels = 2;
+ }
+
+ if (mOut.Channels() == 1) {
+ if (mIn.Format() == AudioConfig::FORMAT_FLT) {
+ const float* in = static_cast<const float*>(aIn);
+ float* out = static_cast<float*>(aOut);
+ for (size_t fIdx = 0; fIdx < aFrames; ++fIdx) {
+ float sample = 0.0;
+ // The sample of the buffer would be interleaved.
+ sample = (in[fIdx*channels] + in[fIdx*channels + 1]) * 0.5;
+ *out++ = sample;
+ }
+ } else if (mIn.Format() == AudioConfig::FORMAT_S16) {
+ const int16_t* in = static_cast<const int16_t*>(aIn);
+ int16_t* out = static_cast<int16_t*>(aOut);
+ for (size_t fIdx = 0; fIdx < aFrames; ++fIdx) {
+ int32_t sample = 0.0;
+ // The sample of the buffer would be interleaved.
+ sample = (in[fIdx*channels] + in[fIdx*channels + 1]) * 0.5;
+ *out++ = sample;
+ }
+ } else {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Unsupported data type");
+ }
+ }
+ return aFrames;
+}
+
+size_t
+AudioConverter::ResampleAudio(void* aOut, const void* aIn, size_t aFrames)
+{
+ if (!mResampler) {
+ return 0;
+ }
+ uint32_t outframes = ResampleRecipientFrames(aFrames);
+ uint32_t inframes = aFrames;
+
+ int error;
+ if (mOut.Format() == AudioConfig::FORMAT_FLT) {
+ const float* in = reinterpret_cast<const float*>(aIn);
+ float* out = reinterpret_cast<float*>(aOut);
+ error =
+ speex_resampler_process_interleaved_float(mResampler, in, &inframes,
+ out, &outframes);
+ } else if (mOut.Format() == AudioConfig::FORMAT_S16) {
+ const int16_t* in = reinterpret_cast<const int16_t*>(aIn);
+ int16_t* out = reinterpret_cast<int16_t*>(aOut);
+ error =
+ speex_resampler_process_interleaved_int(mResampler, in, &inframes,
+ out, &outframes);
+ } else {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Unsupported data type");
+ error = RESAMPLER_ERR_ALLOC_FAILED;
+ }
+ MOZ_ASSERT(error == RESAMPLER_ERR_SUCCESS);
+ if (error != RESAMPLER_ERR_SUCCESS) {
+ speex_resampler_destroy(mResampler);
+ mResampler = nullptr;
+ return 0;
+ }
+ MOZ_ASSERT(inframes == aFrames, "Some frames will be dropped");
+ return outframes;
+}
+
+void
+AudioConverter::RecreateResampler()
+{
+ if (mResampler) {
+ speex_resampler_destroy(mResampler);
+ }
+ int error;
+ mResampler = speex_resampler_init(mOut.Channels(),
+ mIn.Rate(),
+ mOut.Rate(),
+ SPEEX_RESAMPLER_QUALITY_DEFAULT,
+ &error);
+
+ if (error == RESAMPLER_ERR_SUCCESS) {
+ speex_resampler_skip_zeros(mResampler);
+ } else {
+ NS_WARNING("Failed to initialize resampler.");
+ mResampler = nullptr;
+ }
+}
+
+size_t
+AudioConverter::DrainResampler(void* aOut)
+{
+ if (!mResampler) {
+ return 0;
+ }
+ int frames = speex_resampler_get_input_latency(mResampler);
+ AlignedByteBuffer buffer(FramesOutToBytes(frames));
+ if (!buffer) {
+ // OOM
+ return 0;
+ }
+ frames = ResampleAudio(aOut, buffer.Data(), frames);
+ // Tore down the resampler as it's easier than handling follow-up.
+ RecreateResampler();
+ return frames;
+}
+
+size_t
+AudioConverter::UpmixAudio(void* aOut, const void* aIn, size_t aFrames) const
+{
+ MOZ_ASSERT(mIn.Format() == AudioConfig::FORMAT_S16 ||
+ mIn.Format() == AudioConfig::FORMAT_FLT);
+ MOZ_ASSERT(mIn.Channels() < mOut.Channels());
+ MOZ_ASSERT(mIn.Channels() == 1, "Can only upmix mono for now");
+ MOZ_ASSERT(mOut.Channels() == 2, "Can only upmix to stereo for now");
+
+ if (mOut.Channels() != 2) {
+ return 0;
+ }
+
+ // Upmix mono to stereo.
+ // This is a very dumb mono to stereo upmixing, power levels are preserved
+ // following the calculation: left = right = -3dB*mono.
+ if (mIn.Format() == AudioConfig::FORMAT_FLT) {
+ const float m3db = std::sqrt(0.5); // -3dB = sqrt(1/2)
+ const float* in = static_cast<const float*>(aIn);
+ float* out = static_cast<float*>(aOut);
+ for (size_t fIdx = 0; fIdx < aFrames; ++fIdx) {
+ float sample = in[fIdx] * m3db;
+ // The samples of the buffer would be interleaved.
+ *out++ = sample;
+ *out++ = sample;
+ }
+ } else if (mIn.Format() == AudioConfig::FORMAT_S16) {
+ const int16_t* in = static_cast<const int16_t*>(aIn);
+ int16_t* out = static_cast<int16_t*>(aOut);
+ for (size_t fIdx = 0; fIdx < aFrames; ++fIdx) {
+ int16_t sample = ((int32_t)in[fIdx] * 11585) >> 14; // close enough to i*sqrt(0.5)
+ // The samples of the buffer would be interleaved.
+ *out++ = sample;
+ *out++ = sample;
+ }
+ } else {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Unsupported data type");
+ }
+
+ return aFrames;
+}
+
+size_t
+AudioConverter::ResampleRecipientFrames(size_t aFrames) const
+{
+ if (!aFrames && mIn.Rate() != mOut.Rate()) {
+ // The resampler will be drained, account for frames currently buffered
+ // in the resampler.
+ if (!mResampler) {
+ return 0;
+ }
+ return speex_resampler_get_output_latency(mResampler);
+ } else {
+ return (uint64_t)aFrames * mOut.Rate() / mIn.Rate() + 1;
+ }
+}
+
+size_t
+AudioConverter::FramesOutToSamples(size_t aFrames) const
+{
+ return aFrames * mOut.Channels();
+}
+
+size_t
+AudioConverter::SamplesInToFrames(size_t aSamples) const
+{
+ return aSamples / mIn.Channels();
+}
+
+size_t
+AudioConverter::FramesOutToBytes(size_t aFrames) const
+{
+ return FramesOutToSamples(aFrames) * AudioConfig::SampleSize(mOut.Format());
+}
+} // namespace mozilla
diff --git a/dom/media/AudioConverter.h b/dom/media/AudioConverter.h
new file mode 100644
index 000000000..2806813df
--- /dev/null
+++ b/dom/media/AudioConverter.h
@@ -0,0 +1,240 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(AudioConverter_h)
+#define AudioConverter_h
+
+#include "MediaInfo.h"
+
+// Forward declaration
+typedef struct SpeexResamplerState_ SpeexResamplerState;
+
+namespace mozilla {
+
+template <AudioConfig::SampleFormat T> struct AudioDataBufferTypeChooser;
+template <> struct AudioDataBufferTypeChooser<AudioConfig::FORMAT_U8>
+{ typedef uint8_t Type; };
+template <> struct AudioDataBufferTypeChooser<AudioConfig::FORMAT_S16>
+{ typedef int16_t Type; };
+template <> struct AudioDataBufferTypeChooser<AudioConfig::FORMAT_S24LSB>
+{ typedef int32_t Type; };
+template <> struct AudioDataBufferTypeChooser<AudioConfig::FORMAT_S24>
+{ typedef int32_t Type; };
+template <> struct AudioDataBufferTypeChooser<AudioConfig::FORMAT_S32>
+{ typedef int32_t Type; };
+template <> struct AudioDataBufferTypeChooser<AudioConfig::FORMAT_FLT>
+{ typedef float Type; };
+
+// 'Value' is the type used externally to deal with stored value.
+// AudioDataBuffer can perform conversion between different SampleFormat content.
+template <AudioConfig::SampleFormat Format, typename Value = typename AudioDataBufferTypeChooser<Format>::Type>
+class AudioDataBuffer
+{
+public:
+ AudioDataBuffer() {}
+ AudioDataBuffer(Value* aBuffer, size_t aLength)
+ : mBuffer(aBuffer, aLength)
+ {}
+ explicit AudioDataBuffer(const AudioDataBuffer& aOther)
+ : mBuffer(aOther.mBuffer)
+ {}
+ AudioDataBuffer(AudioDataBuffer&& aOther)
+ : mBuffer(Move(aOther.mBuffer))
+ {}
+ template <AudioConfig::SampleFormat OtherFormat, typename OtherValue>
+ explicit AudioDataBuffer(const AudioDataBuffer<OtherFormat, OtherValue>& other)
+ {
+ // TODO: Convert from different type, may use asm routines.
+ MOZ_CRASH("Conversion not implemented yet");
+ }
+
+ // A u8, s16 and float aligned buffer can only be treated as
+ // FORMAT_U8, FORMAT_S16 and FORMAT_FLT respectively.
+ // So allow them as copy and move constructors.
+ explicit AudioDataBuffer(const AlignedByteBuffer& aBuffer)
+ : mBuffer(aBuffer)
+ {
+ static_assert(Format == AudioConfig::FORMAT_U8,
+ "Conversion not implemented yet");
+ }
+ explicit AudioDataBuffer(const AlignedShortBuffer& aBuffer)
+ : mBuffer(aBuffer)
+ {
+ static_assert(Format == AudioConfig::FORMAT_S16,
+ "Conversion not implemented yet");
+ }
+ explicit AudioDataBuffer(const AlignedFloatBuffer& aBuffer)
+ : mBuffer(aBuffer)
+ {
+ static_assert(Format == AudioConfig::FORMAT_FLT,
+ "Conversion not implemented yet");
+ }
+ explicit AudioDataBuffer(AlignedByteBuffer&& aBuffer)
+ : mBuffer(Move(aBuffer))
+ {
+ static_assert(Format == AudioConfig::FORMAT_U8,
+ "Conversion not implemented yet");
+ }
+ explicit AudioDataBuffer(AlignedShortBuffer&& aBuffer)
+ : mBuffer(Move(aBuffer))
+ {
+ static_assert(Format == AudioConfig::FORMAT_S16,
+ "Conversion not implemented yet");
+ }
+ explicit AudioDataBuffer(AlignedFloatBuffer&& aBuffer)
+ : mBuffer(Move(aBuffer))
+ {
+ static_assert(Format == AudioConfig::FORMAT_FLT,
+ "Conversion not implemented yet");
+ }
+ AudioDataBuffer& operator=(AudioDataBuffer&& aOther)
+ {
+ mBuffer = Move(aOther.mBuffer);
+ return *this;
+ }
+ AudioDataBuffer& operator=(const AudioDataBuffer& aOther)
+ {
+ mBuffer = aOther.mBuffer;
+ return *this;
+ }
+
+ Value* Data() const { return mBuffer.Data(); }
+ size_t Length() const { return mBuffer.Length(); }
+ size_t Size() const { return mBuffer.Size(); }
+ AlignedBuffer<Value> Forget()
+ {
+ // Correct type -> Just give values as-is.
+ return Move(mBuffer);
+ }
+private:
+ AlignedBuffer<Value> mBuffer;
+};
+
+typedef AudioDataBuffer<AudioConfig::FORMAT_DEFAULT> AudioSampleBuffer;
+
+class AudioConverter {
+public:
+ AudioConverter(const AudioConfig& aIn, const AudioConfig& aOut);
+ ~AudioConverter();
+
+ // Convert the AudioDataBuffer.
+ // Conversion will be done in place if possible. Otherwise a new buffer will
+ // be returned.
+ // Providing an empty buffer and resampling is expected, the resampler
+ // will be drained.
+ template <AudioConfig::SampleFormat Format, typename Value>
+ AudioDataBuffer<Format, Value> Process(AudioDataBuffer<Format, Value>&& aBuffer)
+ {
+ MOZ_DIAGNOSTIC_ASSERT(mIn.Format() == mOut.Format() && mIn.Format() == Format);
+ AudioDataBuffer<Format, Value> buffer = Move(aBuffer);
+ if (CanWorkInPlace()) {
+ size_t frames = SamplesInToFrames(buffer.Length());
+ frames = ProcessInternal(buffer.Data(), buffer.Data(), frames);
+ if (frames && mIn.Rate() != mOut.Rate()) {
+ frames = ResampleAudio(buffer.Data(), buffer.Data(), frames);
+ }
+ AlignedBuffer<Value> temp = buffer.Forget();
+ temp.SetLength(FramesOutToSamples(frames));
+ return AudioDataBuffer<Format, Value>(Move(temp));;
+ }
+ return Process(buffer);
+ }
+
+ template <AudioConfig::SampleFormat Format, typename Value>
+ AudioDataBuffer<Format, Value> Process(const AudioDataBuffer<Format, Value>& aBuffer)
+ {
+ MOZ_DIAGNOSTIC_ASSERT(mIn.Format() == mOut.Format() && mIn.Format() == Format);
+ // Perform the downmixing / reordering in temporary buffer.
+ size_t frames = SamplesInToFrames(aBuffer.Length());
+ AlignedBuffer<Value> temp1;
+ if (!temp1.SetLength(FramesOutToSamples(frames))) {
+ return AudioDataBuffer<Format, Value>(Move(temp1));
+ }
+ frames = ProcessInternal(temp1.Data(), aBuffer.Data(), frames);
+ if (mIn.Rate() == mOut.Rate()) {
+ MOZ_ALWAYS_TRUE(temp1.SetLength(FramesOutToSamples(frames)));
+ return AudioDataBuffer<Format, Value>(Move(temp1));
+ }
+
+ // At this point, temp1 contains the buffer reordered and downmixed.
+ // If we are downsampling we can re-use it.
+ AlignedBuffer<Value>* outputBuffer = &temp1;
+ AlignedBuffer<Value> temp2;
+ if (!frames || mOut.Rate() > mIn.Rate()) {
+ // We are upsampling or about to drain, we can't work in place.
+ // Allocate another temporary buffer where the upsampling will occur.
+ if (!temp2.SetLength(FramesOutToSamples(ResampleRecipientFrames(frames)))) {
+ return AudioDataBuffer<Format, Value>(Move(temp2));
+ }
+ outputBuffer = &temp2;
+ }
+ if (!frames) {
+ frames = DrainResampler(outputBuffer->Data());
+ } else {
+ frames = ResampleAudio(outputBuffer->Data(), temp1.Data(), frames);
+ }
+ MOZ_ALWAYS_TRUE(outputBuffer->SetLength(FramesOutToSamples(frames)));
+ return AudioDataBuffer<Format, Value>(Move(*outputBuffer));
+ }
+
+ // Attempt to convert the AudioDataBuffer in place.
+ // Will return 0 if the conversion wasn't possible.
+ template <typename Value>
+ size_t Process(Value* aBuffer, size_t aFrames)
+ {
+ MOZ_DIAGNOSTIC_ASSERT(mIn.Format() == mOut.Format());
+ if (!CanWorkInPlace()) {
+ return 0;
+ }
+ size_t frames = ProcessInternal(aBuffer, aBuffer, aFrames);
+ if (frames && mIn.Rate() != mOut.Rate()) {
+ frames = ResampleAudio(aBuffer, aBuffer, aFrames);
+ }
+ return frames;
+ }
+
+ bool CanWorkInPlace() const;
+ bool CanReorderAudio() const
+ {
+ return mIn.Layout().MappingTable(mOut.Layout());
+ }
+
+ const AudioConfig& InputConfig() const { return mIn; }
+ const AudioConfig& OutputConfig() const { return mOut; }
+
+private:
+ const AudioConfig mIn;
+ const AudioConfig mOut;
+ uint8_t mChannelOrderMap[MAX_AUDIO_CHANNELS];
+ /**
+ * ProcessInternal
+ * Parameters:
+ * aOut : destination buffer where converted samples will be copied
+ * aIn : source buffer
+ * aSamples: number of frames in source buffer
+ *
+ * Return Value: number of frames converted or 0 if error
+ */
+ size_t ProcessInternal(void* aOut, const void* aIn, size_t aFrames);
+ void ReOrderInterleavedChannels(void* aOut, const void* aIn, size_t aFrames) const;
+ size_t DownmixAudio(void* aOut, const void* aIn, size_t aFrames) const;
+ size_t UpmixAudio(void* aOut, const void* aIn, size_t aFrames) const;
+
+ size_t FramesOutToSamples(size_t aFrames) const;
+ size_t SamplesInToFrames(size_t aSamples) const;
+ size_t FramesOutToBytes(size_t aFrames) const;
+
+ // Resampler context.
+ SpeexResamplerState* mResampler;
+ size_t ResampleAudio(void* aOut, const void* aIn, size_t aFrames);
+ size_t ResampleRecipientFrames(size_t aFrames) const;
+ void RecreateResampler();
+ size_t DrainResampler(void* aOut);
+};
+
+} // namespace mozilla
+
+#endif /* AudioConverter_h */
diff --git a/dom/media/AudioMixer.h b/dom/media/AudioMixer.h
new file mode 100644
index 000000000..c86aa3345
--- /dev/null
+++ b/dom/media/AudioMixer.h
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUDIOMIXER_H_
+#define MOZILLA_AUDIOMIXER_H_
+
+#include "AudioSampleFormat.h"
+#include "nsTArray.h"
+#include "mozilla/PodOperations.h"
+#include "mozilla/LinkedList.h"
+#include "AudioStream.h"
+
+namespace mozilla {
+
+struct MixerCallbackReceiver {
+ virtual void MixerCallback(AudioDataValue* aMixedBuffer,
+ AudioSampleFormat aFormat,
+ uint32_t aChannels,
+ uint32_t aFrames,
+ uint32_t aSampleRate) = 0;
+};
+/**
+ * This class mixes multiple streams of audio together to output a single audio
+ * stream.
+ *
+ * AudioMixer::Mix is to be called repeatedly with buffers that have the same
+ * length, sample rate, sample format and channel count. This class works with
+ * interleaved and plannar buffers, but the buffer mixed must be of the same
+ * type during a mixing cycle.
+ *
+ * When all the tracks have been mixed, calling FinishMixing will call back with
+ * a buffer containing the mixed audio data.
+ *
+ * This class is not thread safe.
+ */
+class AudioMixer
+{
+public:
+ AudioMixer()
+ : mFrames(0),
+ mChannels(0),
+ mSampleRate(0)
+ { }
+
+ ~AudioMixer()
+ {
+ MixerCallback* cb;
+ while ((cb = mCallbacks.popFirst())) {
+ delete cb;
+ }
+ }
+
+ void StartMixing()
+ {
+ mSampleRate = mChannels = mFrames = 0;
+ }
+
+ /* Get the data from the mixer. This is supposed to be called when all the
+ * tracks have been mixed in. The caller should not hold onto the data. */
+ void FinishMixing() {
+ MOZ_ASSERT(mChannels && mFrames && mSampleRate, "Mix not called for this cycle?");
+ for (MixerCallback* cb = mCallbacks.getFirst();
+ cb != nullptr; cb = cb->getNext()) {
+ cb->mReceiver->MixerCallback(mMixedAudio.Elements(),
+ AudioSampleTypeToFormat<AudioDataValue>::Format,
+ mChannels,
+ mFrames,
+ mSampleRate);
+ }
+ PodZero(mMixedAudio.Elements(), mMixedAudio.Length());
+ mSampleRate = mChannels = mFrames = 0;
+ }
+
+ /* Add a buffer to the mix. */
+ void Mix(AudioDataValue* aSamples,
+ uint32_t aChannels,
+ uint32_t aFrames,
+ uint32_t aSampleRate) {
+ if (!mFrames && !mChannels) {
+ mFrames = aFrames;
+ mChannels = aChannels;
+ mSampleRate = aSampleRate;
+ EnsureCapacityAndSilence();
+ }
+
+ MOZ_ASSERT(aFrames == mFrames);
+ MOZ_ASSERT(aChannels == mChannels);
+ MOZ_ASSERT(aSampleRate == mSampleRate);
+
+ for (uint32_t i = 0; i < aFrames * aChannels; i++) {
+ mMixedAudio[i] += aSamples[i];
+ }
+ }
+
+ void AddCallback(MixerCallbackReceiver* aReceiver) {
+ mCallbacks.insertBack(new MixerCallback(aReceiver));
+ }
+
+ bool FindCallback(MixerCallbackReceiver* aReceiver) {
+ for (MixerCallback* cb = mCallbacks.getFirst();
+ cb != nullptr; cb = cb->getNext()) {
+ if (cb->mReceiver == aReceiver) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool RemoveCallback(MixerCallbackReceiver* aReceiver) {
+ for (MixerCallback* cb = mCallbacks.getFirst();
+ cb != nullptr; cb = cb->getNext()) {
+ if (cb->mReceiver == aReceiver) {
+ cb->remove();
+ delete cb;
+ return true;
+ }
+ }
+ return false;
+ }
+private:
+ void EnsureCapacityAndSilence() {
+ if (mFrames * mChannels > mMixedAudio.Length()) {
+ mMixedAudio.SetLength(mFrames* mChannels);
+ }
+ PodZero(mMixedAudio.Elements(), mMixedAudio.Length());
+ }
+
+ class MixerCallback : public LinkedListElement<MixerCallback>
+ {
+ public:
+ explicit MixerCallback(MixerCallbackReceiver* aReceiver)
+ : mReceiver(aReceiver)
+ { }
+ MixerCallbackReceiver* mReceiver;
+ };
+
+ /* Function that is called when the mixing is done. */
+ LinkedList<MixerCallback> mCallbacks;
+ /* Number of frames for this mixing block. */
+ uint32_t mFrames;
+ /* Number of channels for this mixing block. */
+ uint32_t mChannels;
+ /* Sample rate the of the mixed data. */
+ uint32_t mSampleRate;
+ /* Buffer containing the mixed audio data. */
+ nsTArray<AudioDataValue> mMixedAudio;
+};
+
+} // namespace mozilla
+
+#endif // MOZILLA_AUDIOMIXER_H_
diff --git a/dom/media/AudioPacketizer.h b/dom/media/AudioPacketizer.h
new file mode 100644
index 000000000..b0452cdf0
--- /dev/null
+++ b/dom/media/AudioPacketizer.h
@@ -0,0 +1,196 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioPacketizer_h_
+#define AudioPacketizer_h_
+
+#include <mozilla/PodOperations.h>
+#include <mozilla/Assertions.h>
+#include <mozilla/UniquePtr.h>
+#include <AudioSampleFormat.h>
+
+// Enable this to warn when `Output` has been called but not enough data was
+// buffered.
+// #define LOG_PACKETIZER_UNDERRUN
+
+namespace mozilla {
+/**
+ * This class takes arbitrary input data, and returns packets of a specific
+ * size. In the process, it can convert audio samples from 16bit integers to
+ * float (or vice-versa).
+ *
+ * Input and output, as well as length units in the public interface are
+ * interleaved frames.
+ *
+ * Allocations of output buffer can be performed by this class. Buffers can
+ * simply be delete-d. This is because packets are intended to be sent off to
+ * non-gecko code using normal pointers/length pairs
+ *
+ * Alternatively, consumers can pass in a buffer in which the output is copied.
+ * The buffer needs to be large enough to store a packet worth of audio.
+ *
+ * The implementation uses a circular buffer using absolute virtual indices.
+ */
+template <typename InputType, typename OutputType>
+class AudioPacketizer
+{
+public:
+ AudioPacketizer(uint32_t aPacketSize, uint32_t aChannels)
+ : mPacketSize(aPacketSize)
+ , mChannels(aChannels)
+ , mReadIndex(0)
+ , mWriteIndex(0)
+ // Start off with a single packet
+ , mStorage(new InputType[aPacketSize * aChannels])
+ , mLength(aPacketSize * aChannels)
+ {
+ MOZ_ASSERT(aPacketSize > 0 && aChannels > 0,
+ "The packet size and the number of channel should be strictly positive");
+ }
+
+ void Input(const InputType* aFrames, uint32_t aFrameCount)
+ {
+ uint32_t inputSamples = aFrameCount * mChannels;
+ // Need to grow the storage. This should rarely happen, if at all, once the
+ // array has the right size.
+ if (inputSamples > EmptySlots()) {
+ // Calls to Input and Output are roughtly interleaved
+ // (Input,Output,Input,Output, etc.), or balanced
+ // (Input,Input,Input,Output,Output,Output), so we update the buffer to
+ // the exact right size in order to not waste space.
+ uint32_t newLength = AvailableSamples() + inputSamples;
+ uint32_t toCopy = AvailableSamples();
+ UniquePtr<InputType[]> oldStorage = mozilla::Move(mStorage);
+ mStorage = mozilla::MakeUnique<InputType[]>(newLength);
+ // Copy the old data at the beginning of the new storage.
+ if (WriteIndex() >= ReadIndex()) {
+ PodCopy(mStorage.get(),
+ oldStorage.get() + ReadIndex(),
+ AvailableSamples());
+ } else {
+ uint32_t firstPartLength = mLength - ReadIndex();
+ uint32_t secondPartLength = AvailableSamples() - firstPartLength;
+ PodCopy(mStorage.get(),
+ oldStorage.get() + ReadIndex(),
+ firstPartLength);
+ PodCopy(mStorage.get() + firstPartLength,
+ oldStorage.get(),
+ secondPartLength);
+ }
+ mWriteIndex = toCopy;
+ mReadIndex = 0;
+ mLength = newLength;
+ }
+
+ if (WriteIndex() + inputSamples <= mLength) {
+ PodCopy(mStorage.get() + WriteIndex(), aFrames, aFrameCount * mChannels);
+ } else {
+ uint32_t firstPartLength = mLength - WriteIndex();
+ uint32_t secondPartLength = inputSamples - firstPartLength;
+ PodCopy(mStorage.get() + WriteIndex(), aFrames, firstPartLength);
+ PodCopy(mStorage.get(), aFrames + firstPartLength, secondPartLength);
+ }
+
+ mWriteIndex += inputSamples;
+ }
+
+ OutputType* Output()
+ {
+ uint32_t samplesNeeded = mPacketSize * mChannels;
+ OutputType* out = new OutputType[samplesNeeded];
+
+ Output(out);
+
+ return out;
+ }
+
+ void Output(OutputType* aOutputBuffer)
+ {
+ uint32_t samplesNeeded = mPacketSize * mChannels;
+
+ // Under-run. Pad the end of the buffer with silence.
+ if (AvailableSamples() < samplesNeeded) {
+#ifdef LOG_PACKETIZER_UNDERRUN
+ char buf[256];
+ snprintf(buf, 256,
+ "AudioPacketizer %p underrun: available: %u, needed: %u\n",
+ this, AvailableSamples(), samplesNeeded);
+ NS_WARNING(buf);
+#endif
+ uint32_t zeros = samplesNeeded - AvailableSamples();
+ PodZero(aOutputBuffer + AvailableSamples(), zeros);
+ samplesNeeded -= zeros;
+ }
+ if (ReadIndex() + samplesNeeded <= mLength) {
+ ConvertAudioSamples<InputType,OutputType>(mStorage.get() + ReadIndex(),
+ aOutputBuffer,
+ samplesNeeded);
+ } else {
+ uint32_t firstPartLength = mLength - ReadIndex();
+ uint32_t secondPartLength = samplesNeeded - firstPartLength;
+ ConvertAudioSamples<InputType, OutputType>(mStorage.get() + ReadIndex(),
+ aOutputBuffer,
+ firstPartLength);
+ ConvertAudioSamples<InputType, OutputType>(mStorage.get(),
+ aOutputBuffer + firstPartLength,
+ secondPartLength);
+ }
+ mReadIndex += samplesNeeded;
+ }
+
+ uint32_t PacketsAvailable() const {
+ return AvailableSamples() / mChannels / mPacketSize;
+ }
+
+ bool Empty() const {
+ return mWriteIndex == mReadIndex;
+ }
+
+ bool Full() const {
+ return mWriteIndex - mReadIndex == mLength;
+ }
+
+ uint32_t PacketSize() const {
+ return mPacketSize;
+ }
+
+ uint32_t Channels() const {
+ return mChannels;
+ }
+
+private:
+ uint32_t ReadIndex() const {
+ return mReadIndex % mLength;
+ }
+
+ uint32_t WriteIndex() const {
+ return mWriteIndex % mLength;
+ }
+
+ uint32_t AvailableSamples() const {
+ return mWriteIndex - mReadIndex;
+ }
+
+ uint32_t EmptySlots() const {
+ return mLength - AvailableSamples();
+ }
+
+ // Size of one packet of audio, in frames
+ uint32_t mPacketSize;
+ // Number of channels of the stream flowing through this packetizer
+ uint32_t mChannels;
+ // Two virtual index into the buffer: the read position and the write
+ // position.
+ uint64_t mReadIndex;
+ uint64_t mWriteIndex;
+ // Storage for the samples
+ mozilla::UniquePtr<InputType[]> mStorage;
+ // Length of the buffer, in samples
+ uint32_t mLength;
+};
+
+} // mozilla
+
+#endif // AudioPacketizer_h_
diff --git a/dom/media/AudioSampleFormat.h b/dom/media/AudioSampleFormat.h
new file mode 100644
index 000000000..997180c65
--- /dev/null
+++ b/dom/media/AudioSampleFormat.h
@@ -0,0 +1,259 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MOZILLA_AUDIOSAMPLEFORMAT_H_
+#define MOZILLA_AUDIOSAMPLEFORMAT_H_
+
+#include "nsAlgorithm.h"
+#include <algorithm>
+
+namespace mozilla {
+
+/**
+ * Audio formats supported in MediaStreams and media elements.
+ *
+ * Only one of these is supported by AudioStream, and that is determined
+ * at compile time (roughly, FLOAT32 on desktops, S16 on mobile). Media decoders
+ * produce that format only; queued AudioData always uses that format.
+ */
+enum AudioSampleFormat
+{
+ // Native-endian signed 16-bit audio samples
+ AUDIO_FORMAT_S16,
+ // Signed 32-bit float samples
+ AUDIO_FORMAT_FLOAT32,
+ // Silence: format will be chosen later
+ AUDIO_FORMAT_SILENCE,
+ // The format used for output by AudioStream.
+#ifdef MOZ_SAMPLE_TYPE_S16
+ AUDIO_OUTPUT_FORMAT = AUDIO_FORMAT_S16
+#else
+ AUDIO_OUTPUT_FORMAT = AUDIO_FORMAT_FLOAT32
+#endif
+};
+
+enum {
+ MAX_AUDIO_SAMPLE_SIZE = sizeof(float)
+};
+
+template <AudioSampleFormat Format> class AudioSampleTraits;
+
+template <> class AudioSampleTraits<AUDIO_FORMAT_FLOAT32> {
+public:
+ typedef float Type;
+};
+template <> class AudioSampleTraits<AUDIO_FORMAT_S16> {
+public:
+ typedef int16_t Type;
+};
+
+typedef AudioSampleTraits<AUDIO_OUTPUT_FORMAT>::Type AudioDataValue;
+
+template<typename T> class AudioSampleTypeToFormat;
+
+template <> class AudioSampleTypeToFormat<float> {
+public:
+ static const AudioSampleFormat Format = AUDIO_FORMAT_FLOAT32;
+};
+
+template <> class AudioSampleTypeToFormat<short> {
+public:
+ static const AudioSampleFormat Format = AUDIO_FORMAT_S16;
+};
+
+// Single-sample conversion
+/*
+ * Use "2^N" conversion since it's simple, fast, "bit transparent", used by
+ * many other libraries and apparently behaves reasonably.
+ * http://blog.bjornroche.com/2009/12/int-float-int-its-jungle-out-there.html
+ * http://blog.bjornroche.com/2009/12/linearity-and-dynamic-range-in-int.html
+ */
+inline float
+AudioSampleToFloat(float aValue)
+{
+ return aValue;
+}
+inline float
+AudioSampleToFloat(int16_t aValue)
+{
+ return aValue/32768.0f;
+}
+inline float
+AudioSampleToFloat(int32_t aValue)
+{
+ return aValue/(float)(1U<<31);
+}
+
+template <typename T> T FloatToAudioSample(float aValue);
+
+template <> inline float
+FloatToAudioSample<float>(float aValue)
+{
+ return aValue;
+}
+template <> inline int16_t
+FloatToAudioSample<int16_t>(float aValue)
+{
+ float v = aValue*32768.0f;
+ float clamped = std::max(-32768.0f, std::min(32767.0f, v));
+ return int16_t(clamped);
+}
+
+template <typename T> T UInt8bitToAudioSample(uint8_t aValue);
+
+template <> inline float
+UInt8bitToAudioSample<float>(uint8_t aValue)
+{
+ return aValue * (static_cast<float>(2) / UINT8_MAX) - static_cast<float>(1);
+}
+template <> inline int16_t
+UInt8bitToAudioSample<int16_t>(uint8_t aValue)
+{
+ return (int16_t(aValue) << 8) + aValue + INT16_MIN;
+}
+
+template <typename T> T IntegerToAudioSample(int16_t aValue);
+
+template <> inline float
+IntegerToAudioSample<float>(int16_t aValue)
+{
+ return aValue / 32768.0f;
+}
+template <> inline int16_t
+IntegerToAudioSample<int16_t>(int16_t aValue)
+{
+ return aValue;
+}
+
+template <typename T> T Int24bitToAudioSample(int32_t aValue);
+
+template <> inline float
+Int24bitToAudioSample<float>(int32_t aValue)
+{
+ return aValue / static_cast<float>(1 << 23);
+}
+template <> inline int16_t
+Int24bitToAudioSample<int16_t>(int32_t aValue)
+{
+ return aValue / 256;
+}
+
+template<typename SrcT, typename DstT>
+inline void
+ConvertAudioSample(SrcT aIn, DstT& aOut);
+
+template<>
+inline void
+ConvertAudioSample(int16_t aIn, int16_t & aOut)
+{
+ aOut = aIn;
+}
+
+template<>
+inline void
+ConvertAudioSample(int16_t aIn, float& aOut)
+{
+ aOut = AudioSampleToFloat(aIn);
+}
+
+template<>
+inline void
+ConvertAudioSample(float aIn, float& aOut)
+{
+ aOut = aIn;
+}
+
+template<>
+inline void
+ConvertAudioSample(float aIn, int16_t& aOut)
+{
+ aOut = FloatToAudioSample<int16_t>(aIn);
+}
+
+// Sample buffer conversion
+
+template <typename From, typename To> inline void
+ConvertAudioSamples(const From* aFrom, To* aTo, int aCount)
+{
+ for (int i = 0; i < aCount; ++i) {
+ aTo[i] = FloatToAudioSample<To>(AudioSampleToFloat(aFrom[i]));
+ }
+}
+inline void
+ConvertAudioSamples(const int16_t* aFrom, int16_t* aTo, int aCount)
+{
+ memcpy(aTo, aFrom, sizeof(*aTo)*aCount);
+}
+inline void
+ConvertAudioSamples(const float* aFrom, float* aTo, int aCount)
+{
+ memcpy(aTo, aFrom, sizeof(*aTo)*aCount);
+}
+
+// Sample buffer conversion with scale
+
+template <typename From, typename To> inline void
+ConvertAudioSamplesWithScale(const From* aFrom, To* aTo, int aCount, float aScale)
+{
+ if (aScale == 1.0f) {
+ ConvertAudioSamples(aFrom, aTo, aCount);
+ return;
+ }
+ for (int i = 0; i < aCount; ++i) {
+ aTo[i] = FloatToAudioSample<To>(AudioSampleToFloat(aFrom[i])*aScale);
+ }
+}
+inline void
+ConvertAudioSamplesWithScale(const int16_t* aFrom, int16_t* aTo, int aCount, float aScale)
+{
+ if (aScale == 1.0f) {
+ ConvertAudioSamples(aFrom, aTo, aCount);
+ return;
+ }
+ if (0.0f <= aScale && aScale < 1.0f) {
+ int32_t scale = int32_t((1 << 16) * aScale);
+ for (int i = 0; i < aCount; ++i) {
+ aTo[i] = int16_t((int32_t(aFrom[i]) * scale) >> 16);
+ }
+ return;
+ }
+ for (int i = 0; i < aCount; ++i) {
+ aTo[i] = FloatToAudioSample<int16_t>(AudioSampleToFloat(aFrom[i])*aScale);
+ }
+}
+
+// In place audio sample scaling.
+inline void
+ScaleAudioSamples(float* aBuffer, int aCount, float aScale)
+{
+ for (int32_t i = 0; i < aCount; ++i) {
+ aBuffer[i] *= aScale;
+ }
+}
+
+inline void
+ScaleAudioSamples(short* aBuffer, int aCount, float aScale)
+{
+ int32_t volume = int32_t((1 << 16) * aScale);
+ for (int32_t i = 0; i < aCount; ++i) {
+ aBuffer[i] = short((int32_t(aBuffer[i]) * volume) >> 16);
+ }
+}
+
+inline const void*
+AddAudioSampleOffset(const void* aBase, AudioSampleFormat aFormat,
+ int32_t aOffset)
+{
+ static_assert(AUDIO_FORMAT_S16 == 0, "Bad constant");
+ static_assert(AUDIO_FORMAT_FLOAT32 == 1, "Bad constant");
+ NS_ASSERTION(aFormat == AUDIO_FORMAT_S16 || aFormat == AUDIO_FORMAT_FLOAT32,
+ "Unknown format");
+
+ return static_cast<const uint8_t*>(aBase) + (aFormat + 1)*2*aOffset;
+}
+
+} // namespace mozilla
+
+#endif /* MOZILLA_AUDIOSAMPLEFORMAT_H_ */
diff --git a/dom/media/AudioSegment.cpp b/dom/media/AudioSegment.cpp
new file mode 100644
index 000000000..b906f3462
--- /dev/null
+++ b/dom/media/AudioSegment.cpp
@@ -0,0 +1,215 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioSegment.h"
+
+#include "AudioMixer.h"
+#include "AudioChannelFormat.h"
+#include "Latency.h"
+#include <speex/speex_resampler.h>
+
+namespace mozilla {
+
+const uint8_t SilentChannel::gZeroChannel[MAX_AUDIO_SAMPLE_SIZE*SilentChannel::AUDIO_PROCESSING_FRAMES] = {0};
+
+template<>
+const float* SilentChannel::ZeroChannel<float>()
+{
+ return reinterpret_cast<const float*>(SilentChannel::gZeroChannel);
+}
+
+template<>
+const int16_t* SilentChannel::ZeroChannel<int16_t>()
+{
+ return reinterpret_cast<const int16_t*>(SilentChannel::gZeroChannel);
+}
+
+void
+AudioSegment::ApplyVolume(float aVolume)
+{
+ for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
+ ci->mVolume *= aVolume;
+ }
+}
+
+void AudioSegment::ResampleChunks(SpeexResamplerState* aResampler, uint32_t aInRate, uint32_t aOutRate)
+{
+ if (mChunks.IsEmpty()) {
+ return;
+ }
+
+ MOZ_ASSERT(aResampler || IsNull(), "We can only be here without a resampler if this segment is null.");
+
+ AudioSampleFormat format = AUDIO_FORMAT_SILENCE;
+ for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
+ if (ci->mBufferFormat != AUDIO_FORMAT_SILENCE) {
+ format = ci->mBufferFormat;
+ }
+ }
+
+ switch (format) {
+ // If the format is silence at this point, all the chunks are silent. The
+ // actual function we use does not matter, it's just a matter of changing
+ // the chunks duration.
+ case AUDIO_FORMAT_SILENCE:
+ case AUDIO_FORMAT_FLOAT32:
+ Resample<float>(aResampler, aInRate, aOutRate);
+ break;
+ case AUDIO_FORMAT_S16:
+ Resample<int16_t>(aResampler, aInRate, aOutRate);
+ break;
+ default:
+ MOZ_ASSERT(false);
+ break;
+ }
+}
+
+// This helps to to safely get a pointer to the position we want to start
+// writing a planar audio buffer, depending on the channel and the offset in the
+// buffer.
+static AudioDataValue*
+PointerForOffsetInChannel(AudioDataValue* aData, size_t aLengthSamples,
+ uint32_t aChannelCount, uint32_t aChannel,
+ uint32_t aOffsetSamples)
+{
+ size_t samplesPerChannel = aLengthSamples / aChannelCount;
+ size_t beginningOfChannel = samplesPerChannel * aChannel;
+ MOZ_ASSERT(aChannel * samplesPerChannel + aOffsetSamples < aLengthSamples,
+ "Offset request out of bounds.");
+ return aData + beginningOfChannel + aOffsetSamples;
+}
+
+void
+AudioSegment::Mix(AudioMixer& aMixer, uint32_t aOutputChannels,
+ uint32_t aSampleRate)
+{
+ AutoTArray<AudioDataValue, SilentChannel::AUDIO_PROCESSING_FRAMES* GUESS_AUDIO_CHANNELS>
+ buf;
+ AutoTArray<const AudioDataValue*, GUESS_AUDIO_CHANNELS> channelData;
+ uint32_t offsetSamples = 0;
+ uint32_t duration = GetDuration();
+
+ if (duration <= 0) {
+ MOZ_ASSERT(duration == 0);
+ return;
+ }
+
+ uint32_t outBufferLength = duration * aOutputChannels;
+ buf.SetLength(outBufferLength);
+
+ for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
+ AudioChunk& c = *ci;
+ uint32_t frames = c.mDuration;
+
+ // If the chunk is silent, simply write the right number of silence in the
+ // buffers.
+ if (c.mBufferFormat == AUDIO_FORMAT_SILENCE) {
+ for (uint32_t channel = 0; channel < aOutputChannels; channel++) {
+ AudioDataValue* ptr =
+ PointerForOffsetInChannel(buf.Elements(), outBufferLength,
+ aOutputChannels, channel, offsetSamples);
+ PodZero(ptr, frames);
+ }
+ } else {
+ // Othewise, we need to upmix or downmix appropriately, depending on the
+ // desired input and output channels.
+ channelData.SetLength(c.mChannelData.Length());
+ for (uint32_t i = 0; i < channelData.Length(); ++i) {
+ channelData[i] = static_cast<const AudioDataValue*>(c.mChannelData[i]);
+ }
+ if (channelData.Length() < aOutputChannels) {
+ // Up-mix.
+ AudioChannelsUpMix(&channelData, aOutputChannels, SilentChannel::ZeroChannel<AudioDataValue>());
+ for (uint32_t channel = 0; channel < aOutputChannels; channel++) {
+ AudioDataValue* ptr =
+ PointerForOffsetInChannel(buf.Elements(), outBufferLength,
+ aOutputChannels, channel, offsetSamples);
+ PodCopy(ptr, reinterpret_cast<const AudioDataValue*>(channelData[channel]),
+ frames);
+ }
+ MOZ_ASSERT(channelData.Length() == aOutputChannels);
+ } else if (channelData.Length() > aOutputChannels) {
+ // Down mix.
+ AutoTArray<AudioDataValue*, GUESS_AUDIO_CHANNELS> outChannelPtrs;
+ outChannelPtrs.SetLength(aOutputChannels);
+ uint32_t offsetSamples = 0;
+ for (uint32_t channel = 0; channel < aOutputChannels; channel++) {
+ outChannelPtrs[channel] =
+ PointerForOffsetInChannel(buf.Elements(), outBufferLength,
+ aOutputChannels, channel, offsetSamples);
+ }
+ AudioChannelsDownMix(channelData, outChannelPtrs.Elements(),
+ aOutputChannels, frames);
+ } else {
+ // The channel count is already what we want, just copy it over.
+ for (uint32_t channel = 0; channel < aOutputChannels; channel++) {
+ AudioDataValue* ptr =
+ PointerForOffsetInChannel(buf.Elements(), outBufferLength,
+ aOutputChannels, channel, offsetSamples);
+ PodCopy(ptr, reinterpret_cast<const AudioDataValue*>(channelData[channel]),
+ frames);
+ }
+ }
+ }
+ offsetSamples += frames;
+ }
+
+ if (offsetSamples) {
+ MOZ_ASSERT(offsetSamples == outBufferLength / aOutputChannels,
+ "We forgot to write some samples?");
+ aMixer.Mix(buf.Elements(), aOutputChannels, offsetSamples, aSampleRate);
+ }
+}
+
+void
+AudioSegment::WriteTo(uint64_t aID, AudioMixer& aMixer, uint32_t aOutputChannels, uint32_t aSampleRate)
+{
+ AutoTArray<AudioDataValue,SilentChannel::AUDIO_PROCESSING_FRAMES*GUESS_AUDIO_CHANNELS> buf;
+ // Offset in the buffer that will be written to the mixer, in samples.
+ uint32_t offset = 0;
+
+ if (GetDuration() <= 0) {
+ MOZ_ASSERT(GetDuration() == 0);
+ return;
+ }
+
+ uint32_t outBufferLength = GetDuration() * aOutputChannels;
+ buf.SetLength(outBufferLength);
+
+
+ for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
+ AudioChunk& c = *ci;
+
+ switch (c.mBufferFormat) {
+ case AUDIO_FORMAT_S16:
+ WriteChunk<int16_t>(c, aOutputChannels, buf.Elements() + offset);
+ break;
+ case AUDIO_FORMAT_FLOAT32:
+ WriteChunk<float>(c, aOutputChannels, buf.Elements() + offset);
+ break;
+ case AUDIO_FORMAT_SILENCE:
+ // The mixer is expecting interleaved data, so this is ok.
+ PodZero(buf.Elements() + offset, c.mDuration * aOutputChannels);
+ break;
+ default:
+ MOZ_ASSERT(false, "Not handled");
+ }
+
+ offset += c.mDuration * aOutputChannels;
+
+ if (!c.mTimeStamp.IsNull()) {
+ TimeStamp now = TimeStamp::Now();
+ // would be more efficient to c.mTimeStamp to ms on create time then pass here
+ LogTime(AsyncLatencyLogger::AudioMediaStreamTrack, aID,
+ (now - c.mTimeStamp).ToMilliseconds(), c.mTimeStamp);
+ }
+ }
+
+ if (offset) {
+ aMixer.Mix(buf.Elements(), aOutputChannels, offset / aOutputChannels, aSampleRate);
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/AudioSegment.h b/dom/media/AudioSegment.h
new file mode 100644
index 000000000..13f6c2e48
--- /dev/null
+++ b/dom/media/AudioSegment.h
@@ -0,0 +1,429 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUDIOSEGMENT_H_
+#define MOZILLA_AUDIOSEGMENT_H_
+
+#include "MediaSegment.h"
+#include "AudioSampleFormat.h"
+#include "AudioChannelFormat.h"
+#include "SharedBuffer.h"
+#include "WebAudioUtils.h"
+#ifdef MOZILLA_INTERNAL_API
+#include "mozilla/TimeStamp.h"
+#endif
+#include <float.h>
+
+namespace mozilla {
+
+template<typename T>
+class SharedChannelArrayBuffer : public ThreadSharedObject {
+public:
+ explicit SharedChannelArrayBuffer(nsTArray<nsTArray<T> >* aBuffers)
+ {
+ mBuffers.SwapElements(*aBuffers);
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = 0;
+ amount += mBuffers.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mBuffers.Length(); i++) {
+ amount += mBuffers[i].ShallowSizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ nsTArray<nsTArray<T> > mBuffers;
+};
+
+class AudioMixer;
+
+/**
+ * For auto-arrays etc, guess this as the common number of channels.
+ */
+const int GUESS_AUDIO_CHANNELS = 2;
+
+// We ensure that the graph advances in steps that are multiples of the Web
+// Audio block size
+const uint32_t WEBAUDIO_BLOCK_SIZE_BITS = 7;
+const uint32_t WEBAUDIO_BLOCK_SIZE = 1 << WEBAUDIO_BLOCK_SIZE_BITS;
+
+template <typename SrcT, typename DestT>
+static void
+InterleaveAndConvertBuffer(const SrcT* const* aSourceChannels,
+ uint32_t aLength, float aVolume,
+ uint32_t aChannels,
+ DestT* aOutput)
+{
+ DestT* output = aOutput;
+ for (size_t i = 0; i < aLength; ++i) {
+ for (size_t channel = 0; channel < aChannels; ++channel) {
+ float v = AudioSampleToFloat(aSourceChannels[channel][i])*aVolume;
+ *output = FloatToAudioSample<DestT>(v);
+ ++output;
+ }
+ }
+}
+
+template <typename SrcT, typename DestT>
+static void
+DeinterleaveAndConvertBuffer(const SrcT* aSourceBuffer,
+ uint32_t aFrames, uint32_t aChannels,
+ DestT** aOutput)
+{
+ for (size_t i = 0; i < aChannels; i++) {
+ size_t interleavedIndex = i;
+ for (size_t j = 0; j < aFrames; j++) {
+ ConvertAudioSample(aSourceBuffer[interleavedIndex],
+ aOutput[i][j]);
+ interleavedIndex += aChannels;
+ }
+ }
+}
+
+class SilentChannel
+{
+public:
+ static const int AUDIO_PROCESSING_FRAMES = 640; /* > 10ms of 48KHz audio */
+ static const uint8_t gZeroChannel[MAX_AUDIO_SAMPLE_SIZE*AUDIO_PROCESSING_FRAMES];
+ // We take advantage of the fact that zero in float and zero in int have the
+ // same all-zeros bit layout.
+ template<typename T>
+ static const T* ZeroChannel();
+};
+
+
+/**
+ * Given an array of input channels (aChannelData), downmix to aOutputChannels,
+ * interleave the channel data. A total of aOutputChannels*aDuration
+ * interleaved samples will be copied to a channel buffer in aOutput.
+ */
+template <typename SrcT, typename DestT>
+void
+DownmixAndInterleave(const nsTArray<const SrcT*>& aChannelData,
+ int32_t aDuration, float aVolume, uint32_t aOutputChannels,
+ DestT* aOutput)
+{
+
+ if (aChannelData.Length() == aOutputChannels) {
+ InterleaveAndConvertBuffer(aChannelData.Elements(),
+ aDuration, aVolume, aOutputChannels, aOutput);
+ } else {
+ AutoTArray<SrcT*,GUESS_AUDIO_CHANNELS> outputChannelData;
+ AutoTArray<SrcT, SilentChannel::AUDIO_PROCESSING_FRAMES * GUESS_AUDIO_CHANNELS> outputBuffers;
+ outputChannelData.SetLength(aOutputChannels);
+ outputBuffers.SetLength(aDuration * aOutputChannels);
+ for (uint32_t i = 0; i < aOutputChannels; i++) {
+ outputChannelData[i] = outputBuffers.Elements() + aDuration * i;
+ }
+ AudioChannelsDownMix(aChannelData,
+ outputChannelData.Elements(),
+ aOutputChannels,
+ aDuration);
+ InterleaveAndConvertBuffer(outputChannelData.Elements(),
+ aDuration, aVolume, aOutputChannels, aOutput);
+ }
+}
+
+/**
+ * An AudioChunk represents a multi-channel buffer of audio samples.
+ * It references an underlying ThreadSharedObject which manages the lifetime
+ * of the buffer. An AudioChunk maintains its own duration and channel data
+ * pointers so it can represent a subinterval of a buffer without copying.
+ * An AudioChunk can store its individual channels anywhere; it maintains
+ * separate pointers to each channel's buffer.
+ */
+struct AudioChunk {
+ typedef mozilla::AudioSampleFormat SampleFormat;
+
+ AudioChunk() : mPrincipalHandle(PRINCIPAL_HANDLE_NONE) {}
+
+ // Generic methods
+ void SliceTo(StreamTime aStart, StreamTime aEnd)
+ {
+ MOZ_ASSERT(aStart >= 0 && aStart < aEnd && aEnd <= mDuration,
+ "Slice out of bounds");
+ if (mBuffer) {
+ MOZ_ASSERT(aStart < INT32_MAX, "Can't slice beyond 32-bit sample lengths");
+ for (uint32_t channel = 0; channel < mChannelData.Length(); ++channel) {
+ mChannelData[channel] = AddAudioSampleOffset(mChannelData[channel],
+ mBufferFormat, int32_t(aStart));
+ }
+ }
+ mDuration = aEnd - aStart;
+ }
+ StreamTime GetDuration() const { return mDuration; }
+ bool CanCombineWithFollowing(const AudioChunk& aOther) const
+ {
+ if (aOther.mBuffer != mBuffer) {
+ return false;
+ }
+ if (mBuffer) {
+ NS_ASSERTION(aOther.mBufferFormat == mBufferFormat,
+ "Wrong metadata about buffer");
+ NS_ASSERTION(aOther.mChannelData.Length() == mChannelData.Length(),
+ "Mismatched channel count");
+ if (mDuration > INT32_MAX) {
+ return false;
+ }
+ for (uint32_t channel = 0; channel < mChannelData.Length(); ++channel) {
+ if (aOther.mChannelData[channel] != AddAudioSampleOffset(mChannelData[channel],
+ mBufferFormat, int32_t(mDuration))) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ bool IsNull() const { return mBuffer == nullptr; }
+ void SetNull(StreamTime aDuration)
+ {
+ mBuffer = nullptr;
+ mChannelData.Clear();
+ mDuration = aDuration;
+ mVolume = 1.0f;
+ mBufferFormat = AUDIO_FORMAT_SILENCE;
+ mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
+ }
+
+ size_t ChannelCount() const { return mChannelData.Length(); }
+
+ bool IsMuted() const { return mVolume == 0.0f; }
+
+ size_t SizeOfExcludingThisIfUnshared(MallocSizeOf aMallocSizeOf) const
+ {
+ return SizeOfExcludingThis(aMallocSizeOf, true);
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf, bool aUnshared) const
+ {
+ size_t amount = 0;
+
+ // Possibly owned:
+ // - mBuffer - Can hold data that is also in the decoded audio queue. If it
+ // is not shared, or unshared == false it gets counted.
+ if (mBuffer && (!aUnshared || !mBuffer->IsShared())) {
+ amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ // Memory in the array is owned by mBuffer.
+ amount += mChannelData.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ template<typename T>
+ const nsTArray<const T*>& ChannelData()
+ {
+ MOZ_ASSERT(AudioSampleTypeToFormat<T>::Format == mBufferFormat);
+ return *reinterpret_cast<nsTArray<const T*>*>(&mChannelData);
+ }
+
+ PrincipalHandle GetPrincipalHandle() const { return mPrincipalHandle; }
+
+ StreamTime mDuration; // in frames within the buffer
+ RefPtr<ThreadSharedObject> mBuffer; // the buffer object whose lifetime is managed; null means data is all zeroes
+ nsTArray<const void*> mChannelData; // one pointer per channel; empty if and only if mBuffer is null
+ float mVolume; // volume multiplier to apply (1.0f if mBuffer is nonnull)
+ SampleFormat mBufferFormat; // format of frames in mBuffer (only meaningful if mBuffer is nonnull)
+#ifdef MOZILLA_INTERNAL_API
+ mozilla::TimeStamp mTimeStamp; // time at which this has been fetched from the MediaEngine
+#endif
+ // principalHandle for the data in this chunk.
+ // This can be compared to an nsIPrincipal* when back on main thread.
+ PrincipalHandle mPrincipalHandle;
+};
+
+/**
+ * A list of audio samples consisting of a sequence of slices of SharedBuffers.
+ * The audio rate is determined by the track, not stored in this class.
+ */
+class AudioSegment : public MediaSegmentBase<AudioSegment, AudioChunk> {
+public:
+ typedef mozilla::AudioSampleFormat SampleFormat;
+
+ AudioSegment() : MediaSegmentBase<AudioSegment, AudioChunk>(AUDIO) {}
+
+ // Resample the whole segment in place.
+ template<typename T>
+ void Resample(SpeexResamplerState* aResampler, uint32_t aInRate, uint32_t aOutRate)
+ {
+ mDuration = 0;
+#ifdef DEBUG
+ uint32_t segmentChannelCount = ChannelCount();
+#endif
+
+ for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
+ AutoTArray<nsTArray<T>, GUESS_AUDIO_CHANNELS> output;
+ AutoTArray<const T*, GUESS_AUDIO_CHANNELS> bufferPtrs;
+ AudioChunk& c = *ci;
+ // If this chunk is null, don't bother resampling, just alter its duration
+ if (c.IsNull()) {
+ c.mDuration = (c.mDuration * aOutRate) / aInRate;
+ mDuration += c.mDuration;
+ continue;
+ }
+ uint32_t channels = c.mChannelData.Length();
+ MOZ_ASSERT(channels == segmentChannelCount);
+ output.SetLength(channels);
+ bufferPtrs.SetLength(channels);
+ uint32_t inFrames = c.mDuration;
+ // Round up to allocate; the last frame may not be used.
+ NS_ASSERTION((UINT32_MAX - aInRate + 1) / c.mDuration >= aOutRate,
+ "Dropping samples");
+ uint32_t outSize = (c.mDuration * aOutRate + aInRate - 1) / aInRate;
+ for (uint32_t i = 0; i < channels; i++) {
+ T* out = output[i].AppendElements(outSize);
+ uint32_t outFrames = outSize;
+
+ const T* in = static_cast<const T*>(c.mChannelData[i]);
+ dom::WebAudioUtils::SpeexResamplerProcess(aResampler, i,
+ in, &inFrames,
+ out, &outFrames);
+ MOZ_ASSERT(inFrames == c.mDuration);
+
+ bufferPtrs[i] = out;
+ output[i].SetLength(outFrames);
+ }
+ MOZ_ASSERT(channels > 0);
+ c.mDuration = output[0].Length();
+ c.mBuffer = new mozilla::SharedChannelArrayBuffer<T>(&output);
+ for (uint32_t i = 0; i < channels; i++) {
+ c.mChannelData[i] = bufferPtrs[i];
+ }
+ mDuration += c.mDuration;
+ }
+ }
+
+ void ResampleChunks(SpeexResamplerState* aResampler,
+ uint32_t aInRate,
+ uint32_t aOutRate);
+
+ void AppendFrames(already_AddRefed<ThreadSharedObject> aBuffer,
+ const nsTArray<const float*>& aChannelData,
+ int32_t aDuration, const PrincipalHandle& aPrincipalHandle)
+ {
+ AudioChunk* chunk = AppendChunk(aDuration);
+ chunk->mBuffer = aBuffer;
+ for (uint32_t channel = 0; channel < aChannelData.Length(); ++channel) {
+ chunk->mChannelData.AppendElement(aChannelData[channel]);
+ }
+ chunk->mVolume = 1.0f;
+ chunk->mBufferFormat = AUDIO_FORMAT_FLOAT32;
+#ifdef MOZILLA_INTERNAL_API
+ chunk->mTimeStamp = TimeStamp::Now();
+#endif
+ chunk->mPrincipalHandle = aPrincipalHandle;
+ }
+ void AppendFrames(already_AddRefed<ThreadSharedObject> aBuffer,
+ const nsTArray<const int16_t*>& aChannelData,
+ int32_t aDuration, const PrincipalHandle& aPrincipalHandle)
+ {
+ AudioChunk* chunk = AppendChunk(aDuration);
+ chunk->mBuffer = aBuffer;
+ for (uint32_t channel = 0; channel < aChannelData.Length(); ++channel) {
+ chunk->mChannelData.AppendElement(aChannelData[channel]);
+ }
+ chunk->mVolume = 1.0f;
+ chunk->mBufferFormat = AUDIO_FORMAT_S16;
+#ifdef MOZILLA_INTERNAL_API
+ chunk->mTimeStamp = TimeStamp::Now();
+#endif
+ chunk->mPrincipalHandle = aPrincipalHandle;
+ }
+ // Consumes aChunk, and returns a pointer to the persistent copy of aChunk
+ // in the segment.
+ AudioChunk* AppendAndConsumeChunk(AudioChunk* aChunk)
+ {
+ AudioChunk* chunk = AppendChunk(aChunk->mDuration);
+ chunk->mBuffer = aChunk->mBuffer.forget();
+ chunk->mChannelData.SwapElements(aChunk->mChannelData);
+ chunk->mVolume = aChunk->mVolume;
+ chunk->mBufferFormat = aChunk->mBufferFormat;
+#ifdef MOZILLA_INTERNAL_API
+ chunk->mTimeStamp = TimeStamp::Now();
+#endif
+ chunk->mPrincipalHandle = aChunk->mPrincipalHandle;
+ return chunk;
+ }
+ void ApplyVolume(float aVolume);
+ // Mix the segment into a mixer, interleaved. This is useful to output a
+ // segment to a system audio callback. It up or down mixes to aChannelCount
+ // channels.
+ void WriteTo(uint64_t aID, AudioMixer& aMixer, uint32_t aChannelCount,
+ uint32_t aSampleRate);
+ // Mix the segment into a mixer, keeping it planar, up or down mixing to
+ // aChannelCount channels.
+ void Mix(AudioMixer& aMixer, uint32_t aChannelCount, uint32_t aSampleRate);
+
+ int ChannelCount() {
+ NS_WARNING_ASSERTION(
+ !mChunks.IsEmpty(),
+ "Cannot query channel count on a AudioSegment with no chunks.");
+ // Find the first chunk that has non-zero channels. A chunk that hs zero
+ // channels is just silence and we can simply discard it.
+ for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
+ if (ci->ChannelCount()) {
+ return ci->ChannelCount();
+ }
+ }
+ return 0;
+ }
+
+ bool IsNull() const {
+ for (ChunkIterator ci(*const_cast<AudioSegment*>(this)); !ci.IsEnded();
+ ci.Next()) {
+ if (!ci->IsNull()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static Type StaticType() { return AUDIO; }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+};
+
+template<typename SrcT>
+void WriteChunk(AudioChunk& aChunk,
+ uint32_t aOutputChannels,
+ AudioDataValue* aOutputBuffer)
+{
+ AutoTArray<const SrcT*,GUESS_AUDIO_CHANNELS> channelData;
+
+ channelData = aChunk.ChannelData<SrcT>();
+
+ if (channelData.Length() < aOutputChannels) {
+ // Up-mix. Note that this might actually make channelData have more
+ // than aOutputChannels temporarily.
+ AudioChannelsUpMix(&channelData, aOutputChannels, SilentChannel::ZeroChannel<SrcT>());
+ }
+ if (channelData.Length() > aOutputChannels) {
+ // Down-mix.
+ DownmixAndInterleave(channelData, aChunk.mDuration,
+ aChunk.mVolume, aOutputChannels, aOutputBuffer);
+ } else {
+ InterleaveAndConvertBuffer(channelData.Elements(),
+ aChunk.mDuration, aChunk.mVolume,
+ aOutputChannels,
+ aOutputBuffer);
+ }
+}
+
+
+
+} // namespace mozilla
+
+#endif /* MOZILLA_AUDIOSEGMENT_H_ */
diff --git a/dom/media/AudioStream.cpp b/dom/media/AudioStream.cpp
new file mode 100644
index 000000000..82ae3ee86
--- /dev/null
+++ b/dom/media/AudioStream.cpp
@@ -0,0 +1,707 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include "mozilla/Logging.h"
+#include "prdtoa.h"
+#include "AudioStream.h"
+#include "VideoUtils.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/Sprintf.h"
+#include <algorithm>
+#include "mozilla/Telemetry.h"
+#include "CubebUtils.h"
+#include "nsPrintfCString.h"
+#include "gfxPrefs.h"
+#include "AudioConverter.h"
+
+namespace mozilla {
+
+#undef LOG
+#undef LOGW
+
+LazyLogModule gAudioStreamLog("AudioStream");
+// For simple logs
+#define LOG(x, ...) MOZ_LOG(gAudioStreamLog, mozilla::LogLevel::Debug, ("%p " x, this, ##__VA_ARGS__))
+#define LOGW(x, ...) MOZ_LOG(gAudioStreamLog, mozilla::LogLevel::Warning, ("%p " x, this, ##__VA_ARGS__))
+
+/**
+ * Keep a list of frames sent to the audio engine in each DataCallback along
+ * with the playback rate at the moment. Since the playback rate and number of
+ * underrun frames can vary in each callback. We need to keep the whole history
+ * in order to calculate the playback position of the audio engine correctly.
+ */
+class FrameHistory {
+ struct Chunk {
+ uint32_t servicedFrames;
+ uint32_t totalFrames;
+ uint32_t rate;
+ };
+
+ template <typename T>
+ static T FramesToUs(uint32_t frames, int rate) {
+ return static_cast<T>(frames) * USECS_PER_S / rate;
+ }
+public:
+ FrameHistory()
+ : mBaseOffset(0), mBasePosition(0) {}
+
+ void Append(uint32_t aServiced, uint32_t aUnderrun, uint32_t aRate) {
+ /* In most case where playback rate stays the same and we don't underrun
+ * frames, we are able to merge chunks to avoid lose of precision to add up
+ * in compressing chunks into |mBaseOffset| and |mBasePosition|.
+ */
+ if (!mChunks.IsEmpty()) {
+ Chunk& c = mChunks.LastElement();
+ // 2 chunks (c1 and c2) can be merged when rate is the same and
+ // adjacent frames are zero. That is, underrun frames in c1 are zero
+ // or serviced frames in c2 are zero.
+ if (c.rate == aRate &&
+ (c.servicedFrames == c.totalFrames ||
+ aServiced == 0)) {
+ c.servicedFrames += aServiced;
+ c.totalFrames += aServiced + aUnderrun;
+ return;
+ }
+ }
+ Chunk* p = mChunks.AppendElement();
+ p->servicedFrames = aServiced;
+ p->totalFrames = aServiced + aUnderrun;
+ p->rate = aRate;
+ }
+
+ /**
+ * @param frames The playback position in frames of the audio engine.
+ * @return The playback position in microseconds of the audio engine,
+ * adjusted by playback rate changes and underrun frames.
+ */
+ int64_t GetPosition(int64_t frames) {
+ // playback position should not go backward.
+ MOZ_ASSERT(frames >= mBaseOffset);
+ while (true) {
+ if (mChunks.IsEmpty()) {
+ return mBasePosition;
+ }
+ const Chunk& c = mChunks[0];
+ if (frames <= mBaseOffset + c.totalFrames) {
+ uint32_t delta = frames - mBaseOffset;
+ delta = std::min(delta, c.servicedFrames);
+ return static_cast<int64_t>(mBasePosition) +
+ FramesToUs<int64_t>(delta, c.rate);
+ }
+ // Since the playback position of the audio engine will not go backward,
+ // we are able to compress chunks so that |mChunks| won't grow unlimitedly.
+ // Note that we lose precision in converting integers into floats and
+ // inaccuracy will accumulate over time. However, for a 24hr long,
+ // sample rate = 44.1k file, the error will be less than 1 microsecond
+ // after playing 24 hours. So we are fine with that.
+ mBaseOffset += c.totalFrames;
+ mBasePosition += FramesToUs<double>(c.servicedFrames, c.rate);
+ mChunks.RemoveElementAt(0);
+ }
+ }
+private:
+ AutoTArray<Chunk, 7> mChunks;
+ int64_t mBaseOffset;
+ double mBasePosition;
+};
+
+AudioStream::AudioStream(DataSource& aSource)
+ : mMonitor("AudioStream")
+ , mChannels(0)
+ , mOutChannels(0)
+ , mTimeStretcher(nullptr)
+ , mDumpFile(nullptr)
+ , mState(INITIALIZED)
+ , mDataSource(aSource)
+{
+}
+
+AudioStream::~AudioStream()
+{
+ LOG("deleted, state %d", mState);
+ MOZ_ASSERT(mState == SHUTDOWN && !mCubebStream,
+ "Should've called Shutdown() before deleting an AudioStream");
+ if (mDumpFile) {
+ fclose(mDumpFile);
+ }
+ if (mTimeStretcher) {
+ soundtouch::destroySoundTouchObj(mTimeStretcher);
+ }
+}
+
+size_t
+AudioStream::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+
+ // Possibly add in the future:
+ // - mTimeStretcher
+ // - mCubebStream
+
+ return amount;
+}
+
+nsresult AudioStream::EnsureTimeStretcherInitializedUnlocked()
+{
+ mMonitor.AssertCurrentThreadOwns();
+ if (!mTimeStretcher) {
+ mTimeStretcher = soundtouch::createSoundTouchObj();
+ mTimeStretcher->setSampleRate(mAudioClock.GetInputRate());
+ mTimeStretcher->setChannels(mOutChannels);
+ mTimeStretcher->setPitch(1.0);
+ }
+ return NS_OK;
+}
+
+nsresult AudioStream::SetPlaybackRate(double aPlaybackRate)
+{
+ // MUST lock since the rate transposer is used from the cubeb callback,
+ // and rate changes can cause the buffer to be reallocated
+ MonitorAutoLock mon(mMonitor);
+
+ NS_ASSERTION(aPlaybackRate > 0.0,
+ "Can't handle negative or null playbackrate in the AudioStream.");
+ // Avoid instantiating the resampler if we are not changing the playback rate.
+ // GetPreservesPitch/SetPreservesPitch don't need locking before calling
+ if (aPlaybackRate == mAudioClock.GetPlaybackRate()) {
+ return NS_OK;
+ }
+
+ if (EnsureTimeStretcherInitializedUnlocked() != NS_OK) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mAudioClock.SetPlaybackRate(aPlaybackRate);
+
+ if (mAudioClock.GetPreservesPitch()) {
+ mTimeStretcher->setTempo(aPlaybackRate);
+ mTimeStretcher->setRate(1.0f);
+ } else {
+ mTimeStretcher->setTempo(1.0f);
+ mTimeStretcher->setRate(aPlaybackRate);
+ }
+ return NS_OK;
+}
+
+nsresult AudioStream::SetPreservesPitch(bool aPreservesPitch)
+{
+ // MUST lock since the rate transposer is used from the cubeb callback,
+ // and rate changes can cause the buffer to be reallocated
+ MonitorAutoLock mon(mMonitor);
+
+ // Avoid instantiating the timestretcher instance if not needed.
+ if (aPreservesPitch == mAudioClock.GetPreservesPitch()) {
+ return NS_OK;
+ }
+
+ if (EnsureTimeStretcherInitializedUnlocked() != NS_OK) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (aPreservesPitch == true) {
+ mTimeStretcher->setTempo(mAudioClock.GetPlaybackRate());
+ mTimeStretcher->setRate(1.0f);
+ } else {
+ mTimeStretcher->setTempo(1.0f);
+ mTimeStretcher->setRate(mAudioClock.GetPlaybackRate());
+ }
+
+ mAudioClock.SetPreservesPitch(aPreservesPitch);
+
+ return NS_OK;
+}
+
+static void SetUint16LE(uint8_t* aDest, uint16_t aValue)
+{
+ aDest[0] = aValue & 0xFF;
+ aDest[1] = aValue >> 8;
+}
+
+static void SetUint32LE(uint8_t* aDest, uint32_t aValue)
+{
+ SetUint16LE(aDest, aValue & 0xFFFF);
+ SetUint16LE(aDest + 2, aValue >> 16);
+}
+
+static FILE*
+OpenDumpFile(uint32_t aChannels, uint32_t aRate)
+{
+ /**
+ * When MOZ_DUMP_AUDIO is set in the environment (to anything),
+ * we'll drop a series of files in the current working directory named
+ * dumped-audio-<nnn>.wav, one per AudioStream created, containing
+ * the audio for the stream including any skips due to underruns.
+ */
+ static Atomic<int> gDumpedAudioCount(0);
+
+ if (!getenv("MOZ_DUMP_AUDIO"))
+ return nullptr;
+ char buf[100];
+ SprintfLiteral(buf, "dumped-audio-%d.wav", ++gDumpedAudioCount);
+ FILE* f = fopen(buf, "wb");
+ if (!f)
+ return nullptr;
+
+ uint8_t header[] = {
+ // RIFF header
+ 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45,
+ // fmt chunk. We always write 16-bit samples.
+ 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x00,
+ // data chunk
+ 0x64, 0x61, 0x74, 0x61, 0xFE, 0xFF, 0xFF, 0x7F
+ };
+ static const int CHANNEL_OFFSET = 22;
+ static const int SAMPLE_RATE_OFFSET = 24;
+ static const int BLOCK_ALIGN_OFFSET = 32;
+ SetUint16LE(header + CHANNEL_OFFSET, aChannels);
+ SetUint32LE(header + SAMPLE_RATE_OFFSET, aRate);
+ SetUint16LE(header + BLOCK_ALIGN_OFFSET, aChannels * 2);
+ fwrite(header, sizeof(header), 1, f);
+
+ return f;
+}
+
+template <typename T>
+typename EnableIf<IsSame<T, int16_t>::value, void>::Type
+WriteDumpFileHelper(T* aInput, size_t aSamples, FILE* aFile) {
+ fwrite(aInput, sizeof(T), aSamples, aFile);
+}
+
+template <typename T>
+typename EnableIf<IsSame<T, float>::value, void>::Type
+WriteDumpFileHelper(T* aInput, size_t aSamples, FILE* aFile) {
+ AutoTArray<uint8_t, 1024*2> buf;
+ buf.SetLength(aSamples*2);
+ uint8_t* output = buf.Elements();
+ for (uint32_t i = 0; i < aSamples; ++i) {
+ SetUint16LE(output + i*2, int16_t(aInput[i]*32767.0f));
+ }
+ fwrite(output, 2, aSamples, aFile);
+ fflush(aFile);
+}
+
+static void
+WriteDumpFile(FILE* aDumpFile, AudioStream* aStream, uint32_t aFrames,
+ void* aBuffer)
+{
+ if (!aDumpFile)
+ return;
+
+ uint32_t samples = aStream->GetOutChannels()*aFrames;
+
+ using SampleT = AudioSampleTraits<AUDIO_OUTPUT_FORMAT>::Type;
+ WriteDumpFileHelper(reinterpret_cast<SampleT*>(aBuffer), samples, aDumpFile);
+}
+
+template <AudioSampleFormat N>
+struct ToCubebFormat {
+ static const cubeb_sample_format value = CUBEB_SAMPLE_FLOAT32NE;
+};
+
+template <>
+struct ToCubebFormat<AUDIO_FORMAT_S16> {
+ static const cubeb_sample_format value = CUBEB_SAMPLE_S16NE;
+};
+
+template <typename Function, typename... Args>
+int AudioStream::InvokeCubeb(Function aFunction, Args&&... aArgs)
+{
+ MonitorAutoUnlock mon(mMonitor);
+ return aFunction(mCubebStream.get(), Forward<Args>(aArgs)...);
+}
+
+nsresult
+AudioStream::Init(uint32_t aNumChannels, uint32_t aRate,
+ const dom::AudioChannel aAudioChannel)
+{
+ auto startTime = TimeStamp::Now();
+
+ LOG("%s channels: %d, rate: %d", __FUNCTION__, aNumChannels, aRate);
+ mChannels = aNumChannels;
+ mOutChannels = aNumChannels;
+
+ mDumpFile = OpenDumpFile(aNumChannels, aRate);
+
+ cubeb_stream_params params;
+ params.rate = aRate;
+ params.channels = mOutChannels;
+#if defined(__ANDROID__)
+#if defined(MOZ_B2G)
+ params.stream_type = CubebUtils::ConvertChannelToCubebType(aAudioChannel);
+#else
+ params.stream_type = CUBEB_STREAM_TYPE_MUSIC;
+#endif
+
+ if (params.stream_type == CUBEB_STREAM_TYPE_MAX) {
+ return NS_ERROR_INVALID_ARG;
+ }
+#endif
+
+ params.format = ToCubebFormat<AUDIO_OUTPUT_FORMAT>::value;
+ mAudioClock.Init(aRate);
+
+ cubeb* cubebContext = CubebUtils::GetCubebContext();
+ if (!cubebContext) {
+ NS_WARNING("Can't get cubeb context!");
+ CubebUtils::ReportCubebStreamInitFailure(true);
+ return NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR;
+ }
+
+ return OpenCubeb(cubebContext, params, startTime, CubebUtils::GetFirstStream());
+}
+
+nsresult
+AudioStream::OpenCubeb(cubeb* aContext, cubeb_stream_params& aParams,
+ TimeStamp aStartTime, bool aIsFirst)
+{
+ MOZ_ASSERT(aContext);
+
+ cubeb_stream* stream = nullptr;
+ /* Convert from milliseconds to frames. */
+ uint32_t latency_frames =
+ CubebUtils::GetCubebPlaybackLatencyInMilliseconds() * aParams.rate / 1000;
+ if (cubeb_stream_init(aContext, &stream, "AudioStream",
+ nullptr, nullptr, nullptr, &aParams,
+ latency_frames,
+ DataCallback_S, StateCallback_S, this) == CUBEB_OK) {
+ mCubebStream.reset(stream);
+ CubebUtils::ReportCubebBackendUsed();
+ } else {
+ NS_WARNING(nsPrintfCString("AudioStream::OpenCubeb() %p failed to init cubeb", this).get());
+ CubebUtils::ReportCubebStreamInitFailure(aIsFirst);
+ return NS_ERROR_FAILURE;
+ }
+
+ TimeDuration timeDelta = TimeStamp::Now() - aStartTime;
+ LOG("creation time %sfirst: %u ms", aIsFirst ? "" : "not ",
+ (uint32_t) timeDelta.ToMilliseconds());
+ Telemetry::Accumulate(aIsFirst ? Telemetry::AUDIOSTREAM_FIRST_OPEN_MS :
+ Telemetry::AUDIOSTREAM_LATER_OPEN_MS, timeDelta.ToMilliseconds());
+
+ return NS_OK;
+}
+
+void
+AudioStream::SetVolume(double aVolume)
+{
+ MOZ_ASSERT(aVolume >= 0.0 && aVolume <= 1.0, "Invalid volume");
+
+ if (cubeb_stream_set_volume(mCubebStream.get(), aVolume * CubebUtils::GetVolumeScale()) != CUBEB_OK) {
+ NS_WARNING("Could not change volume on cubeb stream.");
+ }
+}
+
+void
+AudioStream::Start()
+{
+ MonitorAutoLock mon(mMonitor);
+ MOZ_ASSERT(mState == INITIALIZED);
+ mState = STARTED;
+ auto r = InvokeCubeb(cubeb_stream_start);
+ if (r != CUBEB_OK) {
+ mState = ERRORED;
+ }
+ LOG("started, state %s", mState == STARTED ? "STARTED" : mState == DRAINED ? "DRAINED" : "ERRORED");
+}
+
+void
+AudioStream::Pause()
+{
+ MonitorAutoLock mon(mMonitor);
+ MOZ_ASSERT(mState != INITIALIZED, "Must be Start()ed.");
+ MOZ_ASSERT(mState != STOPPED, "Already Pause()ed.");
+ MOZ_ASSERT(mState != SHUTDOWN, "Already Shutdown()ed.");
+
+ // Do nothing if we are already drained or errored.
+ if (mState == DRAINED || mState == ERRORED) {
+ return;
+ }
+
+ if (InvokeCubeb(cubeb_stream_stop) != CUBEB_OK) {
+ mState = ERRORED;
+ } else if (mState != DRAINED && mState != ERRORED) {
+ // Don't transition to other states if we are already
+ // drained or errored.
+ mState = STOPPED;
+ }
+}
+
+void
+AudioStream::Resume()
+{
+ MonitorAutoLock mon(mMonitor);
+ MOZ_ASSERT(mState != INITIALIZED, "Must be Start()ed.");
+ MOZ_ASSERT(mState != STARTED, "Already Start()ed.");
+ MOZ_ASSERT(mState != SHUTDOWN, "Already Shutdown()ed.");
+
+ // Do nothing if we are already drained or errored.
+ if (mState == DRAINED || mState == ERRORED) {
+ return;
+ }
+
+ if (InvokeCubeb(cubeb_stream_start) != CUBEB_OK) {
+ mState = ERRORED;
+ } else if (mState != DRAINED && mState != ERRORED) {
+ // Don't transition to other states if we are already
+ // drained or errored.
+ mState = STARTED;
+ }
+}
+
+void
+AudioStream::Shutdown()
+{
+ MonitorAutoLock mon(mMonitor);
+ LOG("Shutdown, state %d", mState);
+
+ if (mCubebStream) {
+ MonitorAutoUnlock mon(mMonitor);
+ // Force stop to put the cubeb stream in a stable state before deletion.
+ cubeb_stream_stop(mCubebStream.get());
+ // Must not try to shut down cubeb from within the lock! wasapi may still
+ // call our callback after Pause()/stop()!?! Bug 996162
+ mCubebStream.reset();
+ }
+
+ mState = SHUTDOWN;
+}
+
+int64_t
+AudioStream::GetPosition()
+{
+ MonitorAutoLock mon(mMonitor);
+ int64_t frames = GetPositionInFramesUnlocked();
+ return frames >= 0 ? mAudioClock.GetPosition(frames) : -1;
+}
+
+int64_t
+AudioStream::GetPositionInFrames()
+{
+ MonitorAutoLock mon(mMonitor);
+ int64_t frames = GetPositionInFramesUnlocked();
+ return frames >= 0 ? mAudioClock.GetPositionInFrames(frames) : -1;
+}
+
+int64_t
+AudioStream::GetPositionInFramesUnlocked()
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ if (mState == ERRORED) {
+ return -1;
+ }
+
+ uint64_t position = 0;
+ if (InvokeCubeb(cubeb_stream_get_position, &position) != CUBEB_OK) {
+ return -1;
+ }
+ return std::min<uint64_t>(position, INT64_MAX);
+}
+
+bool
+AudioStream::IsValidAudioFormat(Chunk* aChunk)
+{
+ if (aChunk->Rate() != mAudioClock.GetInputRate()) {
+ LOGW("mismatched sample %u, mInRate=%u", aChunk->Rate(), mAudioClock.GetInputRate());
+ return false;
+ }
+
+ if (aChunk->Channels() > 8) {
+ return false;
+ }
+
+ return true;
+}
+
+void
+AudioStream::GetUnprocessed(AudioBufferWriter& aWriter)
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ // Flush the timestretcher pipeline, if we were playing using a playback rate
+ // other than 1.0.
+ if (mTimeStretcher && mTimeStretcher->numSamples()) {
+ auto timeStretcher = mTimeStretcher;
+ aWriter.Write([timeStretcher] (AudioDataValue* aPtr, uint32_t aFrames) {
+ return timeStretcher->receiveSamples(aPtr, aFrames);
+ }, aWriter.Available());
+
+ // TODO: There might be still unprocessed samples in the stretcher.
+ // We should either remove or flush them so they won't be in the output
+ // next time we switch a playback rate other than 1.0.
+ NS_WARNING_ASSERTION(
+ mTimeStretcher->numUnprocessedSamples() == 0, "no samples");
+ }
+
+ while (aWriter.Available() > 0) {
+ UniquePtr<Chunk> c = mDataSource.PopFrames(aWriter.Available());
+ if (c->Frames() == 0) {
+ break;
+ }
+ MOZ_ASSERT(c->Frames() <= aWriter.Available());
+ if (IsValidAudioFormat(c.get())) {
+ aWriter.Write(c->Data(), c->Frames());
+ } else {
+ // Write silence if invalid format.
+ aWriter.WriteZeros(c->Frames());
+ }
+ }
+}
+
+void
+AudioStream::GetTimeStretched(AudioBufferWriter& aWriter)
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ // We need to call the non-locking version, because we already have the lock.
+ if (EnsureTimeStretcherInitializedUnlocked() != NS_OK) {
+ return;
+ }
+
+ uint32_t toPopFrames =
+ ceil(aWriter.Available() * mAudioClock.GetPlaybackRate());
+
+ while (mTimeStretcher->numSamples() < aWriter.Available()) {
+ UniquePtr<Chunk> c = mDataSource.PopFrames(toPopFrames);
+ if (c->Frames() == 0) {
+ break;
+ }
+ MOZ_ASSERT(c->Frames() <= toPopFrames);
+ if (IsValidAudioFormat(c.get())) {
+ mTimeStretcher->putSamples(c->Data(), c->Frames());
+ } else {
+ // Write silence if invalid format.
+ AutoTArray<AudioDataValue, 1000> buf;
+ buf.SetLength(mOutChannels * c->Frames());
+ memset(buf.Elements(), 0, buf.Length() * sizeof(AudioDataValue));
+ mTimeStretcher->putSamples(buf.Elements(), c->Frames());
+ }
+ }
+
+ auto timeStretcher = mTimeStretcher;
+ aWriter.Write([timeStretcher] (AudioDataValue* aPtr, uint32_t aFrames) {
+ return timeStretcher->receiveSamples(aPtr, aFrames);
+ }, aWriter.Available());
+}
+
+long
+AudioStream::DataCallback(void* aBuffer, long aFrames)
+{
+ MonitorAutoLock mon(mMonitor);
+ MOZ_ASSERT(mState != SHUTDOWN, "No data callback after shutdown");
+
+ auto writer = AudioBufferWriter(
+ reinterpret_cast<AudioDataValue*>(aBuffer), mOutChannels, aFrames);
+
+ if (!strcmp(cubeb_get_backend_id(CubebUtils::GetCubebContext()), "winmm")) {
+ // Don't consume audio data until Start() is called.
+ // Expected only with cubeb winmm backend.
+ if (mState == INITIALIZED) {
+ NS_WARNING("data callback fires before cubeb_stream_start() is called");
+ mAudioClock.UpdateFrameHistory(0, aFrames);
+ return writer.WriteZeros(aFrames);
+ }
+ } else {
+ MOZ_ASSERT(mState != INITIALIZED);
+ }
+
+ // NOTE: wasapi (others?) can call us back *after* stop()/Shutdown() (mState == SHUTDOWN)
+ // Bug 996162
+
+ if (mAudioClock.GetInputRate() == mAudioClock.GetOutputRate()) {
+ GetUnprocessed(writer);
+ } else {
+ GetTimeStretched(writer);
+ }
+
+ // Always send audible frames first, and silent frames later.
+ // Otherwise it will break the assumption of FrameHistory.
+ if (!mDataSource.Ended()) {
+ mAudioClock.UpdateFrameHistory(aFrames - writer.Available(), writer.Available());
+ if (writer.Available() > 0) {
+ LOGW("lost %d frames", writer.Available());
+ writer.WriteZeros(writer.Available());
+ }
+ } else {
+ // No more new data in the data source. Don't send silent frames so the
+ // cubeb stream can start draining.
+ mAudioClock.UpdateFrameHistory(aFrames - writer.Available(), 0);
+ }
+
+ WriteDumpFile(mDumpFile, this, aFrames, aBuffer);
+
+ return aFrames - writer.Available();
+}
+
+void
+AudioStream::StateCallback(cubeb_state aState)
+{
+ MonitorAutoLock mon(mMonitor);
+ MOZ_ASSERT(mState != SHUTDOWN, "No state callback after shutdown");
+ LOG("StateCallback, mState=%d cubeb_state=%d", mState, aState);
+ if (aState == CUBEB_STATE_DRAINED) {
+ mState = DRAINED;
+ mDataSource.Drained();
+ } else if (aState == CUBEB_STATE_ERROR) {
+ LOG("StateCallback() state %d cubeb error", mState);
+ mState = ERRORED;
+ }
+}
+
+AudioClock::AudioClock()
+: mOutRate(0),
+ mInRate(0),
+ mPreservesPitch(true),
+ mFrameHistory(new FrameHistory())
+{}
+
+void AudioClock::Init(uint32_t aRate)
+{
+ mOutRate = aRate;
+ mInRate = aRate;
+}
+
+void AudioClock::UpdateFrameHistory(uint32_t aServiced, uint32_t aUnderrun)
+{
+ mFrameHistory->Append(aServiced, aUnderrun, mOutRate);
+}
+
+int64_t AudioClock::GetPositionInFrames(int64_t aFrames) const
+{
+ CheckedInt64 v = UsecsToFrames(GetPosition(aFrames), mInRate);
+ return v.isValid() ? v.value() : -1;
+}
+
+int64_t AudioClock::GetPosition(int64_t frames) const
+{
+ return mFrameHistory->GetPosition(frames);
+}
+
+void AudioClock::SetPlaybackRate(double aPlaybackRate)
+{
+ mOutRate = static_cast<uint32_t>(mInRate / aPlaybackRate);
+}
+
+double AudioClock::GetPlaybackRate() const
+{
+ return static_cast<double>(mInRate) / mOutRate;
+}
+
+void AudioClock::SetPreservesPitch(bool aPreservesPitch)
+{
+ mPreservesPitch = aPreservesPitch;
+}
+
+bool AudioClock::GetPreservesPitch() const
+{
+ return mPreservesPitch;
+}
+
+} // namespace mozilla
diff --git a/dom/media/AudioStream.h b/dom/media/AudioStream.h
new file mode 100644
index 000000000..acc38b93d
--- /dev/null
+++ b/dom/media/AudioStream.h
@@ -0,0 +1,308 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AudioStream_h_)
+#define AudioStream_h_
+
+#include "AudioSampleFormat.h"
+#include "nsAutoPtr.h"
+#include "nsCOMPtr.h"
+#include "nsThreadUtils.h"
+#include "mozilla/dom/AudioChannelBinding.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/TimeStamp.h"
+#include "mozilla/UniquePtr.h"
+#include "CubebUtils.h"
+#include "soundtouch/SoundTouchFactory.h"
+
+namespace mozilla {
+
+struct CubebDestroyPolicy
+{
+ void operator()(cubeb_stream* aStream) const {
+ cubeb_stream_destroy(aStream);
+ }
+};
+
+class AudioStream;
+class FrameHistory;
+class AudioConfig;
+class AudioConverter;
+
+class AudioClock
+{
+public:
+ AudioClock();
+
+ // Initialize the clock with the current sampling rate.
+ // Need to be called before querying the clock.
+ void Init(uint32_t aRate);
+
+ // Update the number of samples that has been written in the audio backend.
+ // Called on the state machine thread.
+ void UpdateFrameHistory(uint32_t aServiced, uint32_t aUnderrun);
+
+ /**
+ * @param aFrames The playback position in frames of the audio engine.
+ * @return The playback position in frames of the stream,
+ * adjusted by playback rate changes and underrun frames.
+ */
+ int64_t GetPositionInFrames(int64_t aFrames) const;
+
+ /**
+ * @param frames The playback position in frames of the audio engine.
+ * @return The playback position in microseconds of the stream,
+ * adjusted by playback rate changes and underrun frames.
+ */
+ int64_t GetPosition(int64_t frames) const;
+
+ // Set the playback rate.
+ // Called on the audio thread.
+ void SetPlaybackRate(double aPlaybackRate);
+ // Get the current playback rate.
+ // Called on the audio thread.
+ double GetPlaybackRate() const;
+ // Set if we are preserving the pitch.
+ // Called on the audio thread.
+ void SetPreservesPitch(bool aPreservesPitch);
+ // Get the current pitch preservation state.
+ // Called on the audio thread.
+ bool GetPreservesPitch() const;
+
+ uint32_t GetInputRate() const { return mInRate; }
+ uint32_t GetOutputRate() const { return mOutRate; }
+
+private:
+ // Output rate in Hz (characteristic of the playback rate)
+ uint32_t mOutRate;
+ // Input rate in Hz (characteristic of the media being played)
+ uint32_t mInRate;
+ // True if the we are timestretching, false if we are resampling.
+ bool mPreservesPitch;
+ // The history of frames sent to the audio engine in each DataCallback.
+ const nsAutoPtr<FrameHistory> mFrameHistory;
+};
+
+/*
+ * A bookkeeping class to track the read/write position of an audio buffer.
+ */
+class AudioBufferCursor {
+public:
+ AudioBufferCursor(AudioDataValue* aPtr, uint32_t aChannels, uint32_t aFrames)
+ : mPtr(aPtr), mChannels(aChannels), mFrames(aFrames) {}
+
+ // Advance the cursor to account for frames that are consumed.
+ uint32_t Advance(uint32_t aFrames) {
+ MOZ_ASSERT(mFrames >= aFrames);
+ mFrames -= aFrames;
+ mPtr += mChannels * aFrames;
+ return aFrames;
+ }
+
+ // The number of frames available for read/write in this buffer.
+ uint32_t Available() const { return mFrames; }
+
+ // Return a pointer where read/write should begin.
+ AudioDataValue* Ptr() const { return mPtr; }
+
+protected:
+ AudioDataValue* mPtr;
+ const uint32_t mChannels;
+ uint32_t mFrames;
+};
+
+/*
+ * A helper class to encapsulate pointer arithmetic and provide means to modify
+ * the underlying audio buffer.
+ */
+class AudioBufferWriter : private AudioBufferCursor {
+public:
+ AudioBufferWriter(AudioDataValue* aPtr, uint32_t aChannels, uint32_t aFrames)
+ : AudioBufferCursor(aPtr, aChannels, aFrames) {}
+
+ uint32_t WriteZeros(uint32_t aFrames) {
+ memset(mPtr, 0, sizeof(AudioDataValue) * mChannels * aFrames);
+ return Advance(aFrames);
+ }
+
+ uint32_t Write(const AudioDataValue* aPtr, uint32_t aFrames) {
+ memcpy(mPtr, aPtr, sizeof(AudioDataValue) * mChannels * aFrames);
+ return Advance(aFrames);
+ }
+
+ // Provide a write fuction to update the audio buffer with the following
+ // signature: uint32_t(const AudioDataValue* aPtr, uint32_t aFrames)
+ // aPtr: Pointer to the audio buffer.
+ // aFrames: The number of frames available in the buffer.
+ // return: The number of frames actually written by the function.
+ template <typename Function>
+ uint32_t Write(const Function& aFunction, uint32_t aFrames) {
+ return Advance(aFunction(mPtr, aFrames));
+ }
+
+ using AudioBufferCursor::Available;
+};
+
+// Access to a single instance of this class must be synchronized by
+// callers, or made from a single thread. One exception is that access to
+// GetPosition, GetPositionInFrames, SetVolume, and Get{Rate,Channels},
+// SetMicrophoneActive is thread-safe without external synchronization.
+class AudioStream final
+{
+ virtual ~AudioStream();
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioStream)
+
+ class Chunk {
+ public:
+ // Return a pointer to the audio data.
+ virtual const AudioDataValue* Data() const = 0;
+ // Return the number of frames in this chunk.
+ virtual uint32_t Frames() const = 0;
+ // Return the number of audio channels.
+ virtual uint32_t Channels() const = 0;
+ // Return the sample rate of this chunk.
+ virtual uint32_t Rate() const = 0;
+ // Return a writable pointer for downmixing.
+ virtual AudioDataValue* GetWritable() const = 0;
+ virtual ~Chunk() {}
+ };
+
+ class DataSource {
+ public:
+ // Return a chunk which contains at most aFrames frames or zero if no
+ // frames in the source at all.
+ virtual UniquePtr<Chunk> PopFrames(uint32_t aFrames) = 0;
+ // Return true if no more data will be added to the source.
+ virtual bool Ended() const = 0;
+ // Notify that all data is drained by the AudioStream.
+ virtual void Drained() = 0;
+ protected:
+ virtual ~DataSource() {}
+ };
+
+ explicit AudioStream(DataSource& aSource);
+
+ // Initialize the audio stream. aNumChannels is the number of audio
+ // channels (1 for mono, 2 for stereo, etc) and aRate is the sample rate
+ // (22050Hz, 44100Hz, etc).
+ nsresult Init(uint32_t aNumChannels, uint32_t aRate,
+ const dom::AudioChannel aAudioStreamChannel);
+
+ // Closes the stream. All future use of the stream is an error.
+ void Shutdown();
+
+ void Reset();
+
+ // Set the current volume of the audio playback. This is a value from
+ // 0 (meaning muted) to 1 (meaning full volume). Thread-safe.
+ void SetVolume(double aVolume);
+
+ // Start the stream.
+ void Start();
+
+ // Pause audio playback.
+ void Pause();
+
+ // Resume audio playback.
+ void Resume();
+
+ // Return the position in microseconds of the audio frame being played by
+ // the audio hardware, compensated for playback rate change. Thread-safe.
+ int64_t GetPosition();
+
+ // Return the position, measured in audio frames played since the stream
+ // was opened, of the audio hardware. Thread-safe.
+ int64_t GetPositionInFrames();
+
+ static uint32_t GetPreferredRate()
+ {
+ return CubebUtils::PreferredSampleRate();
+ }
+
+ uint32_t GetOutChannels() { return mOutChannels; }
+
+ // Set playback rate as a multiple of the intrinsic playback rate. This is to
+ // be called only with aPlaybackRate > 0.0.
+ nsresult SetPlaybackRate(double aPlaybackRate);
+ // Switch between resampling (if false) and time stretching (if true, default).
+ nsresult SetPreservesPitch(bool aPreservesPitch);
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+
+protected:
+ friend class AudioClock;
+
+ // Return the position, measured in audio frames played since the stream was
+ // opened, of the audio hardware, not adjusted for the changes of playback
+ // rate or underrun frames.
+ // Caller must own the monitor.
+ int64_t GetPositionInFramesUnlocked();
+
+private:
+ nsresult OpenCubeb(cubeb* aContext, cubeb_stream_params& aParams,
+ TimeStamp aStartTime, bool aIsFirst);
+
+ static long DataCallback_S(cubeb_stream*, void* aThis,
+ const void* /* aInputBuffer */, void* aOutputBuffer,
+ long aFrames)
+ {
+ return static_cast<AudioStream*>(aThis)->DataCallback(aOutputBuffer, aFrames);
+ }
+
+ static void StateCallback_S(cubeb_stream*, void* aThis, cubeb_state aState)
+ {
+ static_cast<AudioStream*>(aThis)->StateCallback(aState);
+ }
+
+
+ long DataCallback(void* aBuffer, long aFrames);
+ void StateCallback(cubeb_state aState);
+
+ nsresult EnsureTimeStretcherInitializedUnlocked();
+
+ // Return true if audio frames are valid (correct sampling rate and valid
+ // channel count) otherwise false.
+ bool IsValidAudioFormat(Chunk* aChunk);
+
+ void GetUnprocessed(AudioBufferWriter& aWriter);
+ void GetTimeStretched(AudioBufferWriter& aWriter);
+
+ template <typename Function, typename... Args>
+ int InvokeCubeb(Function aFunction, Args&&... aArgs);
+
+ // The monitor is held to protect all access to member variables.
+ Monitor mMonitor;
+
+ uint32_t mChannels;
+ uint32_t mOutChannels;
+ AudioClock mAudioClock;
+ soundtouch::SoundTouch* mTimeStretcher;
+
+ // Output file for dumping audio
+ FILE* mDumpFile;
+
+ // Owning reference to a cubeb_stream.
+ UniquePtr<cubeb_stream, CubebDestroyPolicy> mCubebStream;
+
+ enum StreamState {
+ INITIALIZED, // Initialized, playback has not begun.
+ STARTED, // cubeb started.
+ STOPPED, // Stopped by a call to Pause().
+ DRAINED, // StateCallback has indicated that the drain is complete.
+ ERRORED, // Stream disabled due to an internal error.
+ SHUTDOWN // Shutdown has been called
+ };
+
+ StreamState mState;
+
+ DataSource& mDataSource;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/AudioStreamTrack.cpp b/dom/media/AudioStreamTrack.cpp
new file mode 100644
index 000000000..0008411af
--- /dev/null
+++ b/dom/media/AudioStreamTrack.cpp
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioStreamTrack.h"
+
+#include "mozilla/dom/AudioStreamTrackBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+JSObject*
+AudioStreamTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioStreamTrackBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/AudioStreamTrack.h b/dom/media/AudioStreamTrack.h
new file mode 100644
index 000000000..d120c6d86
--- /dev/null
+++ b/dom/media/AudioStreamTrack.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AUDIOSTREAMTRACK_H_
+#define AUDIOSTREAMTRACK_H_
+
+#include "MediaStreamTrack.h"
+#include "DOMMediaStream.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioStreamTrack : public MediaStreamTrack {
+public:
+ AudioStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
+ TrackID aInputTrackID,
+ MediaStreamTrackSource* aSource,
+ const MediaTrackConstraints& aConstraints = MediaTrackConstraints())
+ : MediaStreamTrack(aStream, aTrackID, aInputTrackID, aSource, aConstraints) {}
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioStreamTrack* AsAudioStreamTrack() override { return this; }
+
+ const AudioStreamTrack* AsAudioStreamTrack() const override { return this; }
+
+ // WebIDL
+ void GetKind(nsAString& aKind) override { aKind.AssignLiteral("audio"); }
+
+protected:
+ already_AddRefed<MediaStreamTrack> CloneInternal(DOMMediaStream* aOwningStream,
+ TrackID aTrackID) override
+ {
+ return do_AddRef(new AudioStreamTrack(aOwningStream,
+ aTrackID,
+ mInputTrackID,
+ mSource,
+ mConstraints));
+ }
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* AUDIOSTREAMTRACK_H_ */
diff --git a/dom/media/AudioTrack.cpp b/dom/media/AudioTrack.cpp
new file mode 100644
index 000000000..fe4408b10
--- /dev/null
+++ b/dom/media/AudioTrack.cpp
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/AudioTrack.h"
+#include "mozilla/dom/AudioTrackBinding.h"
+#include "mozilla/dom/AudioTrackList.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+
+namespace mozilla {
+namespace dom {
+
+AudioTrack::AudioTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ bool aEnabled)
+ : MediaTrack(aId, aKind, aLabel, aLanguage)
+ , mEnabled(aEnabled)
+{
+}
+
+JSObject*
+AudioTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioTrackBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+AudioTrack::SetEnabled(bool aEnabled)
+{
+ SetEnabledInternal(aEnabled, MediaTrack::DEFAULT);
+}
+
+void
+AudioTrack::SetEnabledInternal(bool aEnabled, int aFlags)
+{
+ if (aEnabled == mEnabled) {
+ return;
+ }
+ mEnabled = aEnabled;
+
+ // If this AudioTrack is no longer in its original AudioTrackList, then
+ // whether it is enabled or not has no effect on its original list.
+ if (!mList) {
+ return;
+ }
+
+ if (mEnabled) {
+ HTMLMediaElement* element = mList->GetMediaElement();
+ if (element) {
+ element->NotifyMediaTrackEnabled(this);
+ }
+ } else {
+ HTMLMediaElement* element = mList->GetMediaElement();
+ if (element) {
+ element->NotifyMediaTrackDisabled(this);
+ }
+ }
+
+ if (!(aFlags & MediaTrack::FIRE_NO_EVENTS)) {
+ mList->CreateAndDispatchChangeEvent();
+ }
+}
+
+} // namespace dom
+} //namespace mozilla
diff --git a/dom/media/AudioTrack.h b/dom/media/AudioTrack.h
new file mode 100644
index 000000000..4047c34f8
--- /dev/null
+++ b/dom/media/AudioTrack.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_AudioTrack_h
+#define mozilla_dom_AudioTrack_h
+
+#include "MediaTrack.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioTrack : public MediaTrack
+{
+public:
+ AudioTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ bool aEnabled);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioTrack* AsAudioTrack() override
+ {
+ return this;
+ }
+
+ void SetEnabledInternal(bool aEnabled, int aFlags) override;
+
+ // WebIDL
+ bool Enabled() const
+ {
+ return mEnabled;
+ }
+
+ void SetEnabled(bool aEnabled);
+
+private:
+ bool mEnabled;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_AudioTrack_h
diff --git a/dom/media/AudioTrackList.cpp b/dom/media/AudioTrackList.cpp
new file mode 100644
index 000000000..500a633f2
--- /dev/null
+++ b/dom/media/AudioTrackList.cpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/AudioTrack.h"
+#include "mozilla/dom/AudioTrackList.h"
+#include "mozilla/dom/AudioTrackListBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+JSObject*
+AudioTrackList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioTrackListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+AudioTrack*
+AudioTrackList::operator[](uint32_t aIndex)
+{
+ MediaTrack* track = MediaTrackList::operator[](aIndex);
+ return track->AsAudioTrack();
+}
+
+AudioTrack*
+AudioTrackList::IndexedGetter(uint32_t aIndex, bool& aFound)
+{
+ MediaTrack* track = MediaTrackList::IndexedGetter(aIndex, aFound);
+ return track ? track->AsAudioTrack() : nullptr;
+}
+
+AudioTrack*
+AudioTrackList::GetTrackById(const nsAString& aId)
+{
+ MediaTrack* track = MediaTrackList::GetTrackById(aId);
+ return track ? track->AsAudioTrack() : nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/AudioTrackList.h b/dom/media/AudioTrackList.h
new file mode 100644
index 000000000..a149a39c5
--- /dev/null
+++ b/dom/media/AudioTrackList.h
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_AudioTrackList_h
+#define mozilla_dom_AudioTrackList_h
+
+#include "MediaTrack.h"
+#include "MediaTrackList.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioTrack;
+
+class AudioTrackList : public MediaTrackList
+{
+public:
+ AudioTrackList(nsPIDOMWindowInner* aOwnerWindow, HTMLMediaElement* aMediaElement)
+ : MediaTrackList(aOwnerWindow, aMediaElement) {}
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioTrack* operator[](uint32_t aIndex);
+
+ // WebIDL
+ AudioTrack* IndexedGetter(uint32_t aIndex, bool& aFound);
+
+ AudioTrack* GetTrackById(const nsAString& aId);
+
+protected:
+ AudioTrackList* AsAudioTrackList() override { return this; }
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_AudioTrackList_h
diff --git a/dom/media/Benchmark.cpp b/dom/media/Benchmark.cpp
new file mode 100644
index 000000000..a4761f1b1
--- /dev/null
+++ b/dom/media/Benchmark.cpp
@@ -0,0 +1,332 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "Benchmark.h"
+#include "BufferMediaResource.h"
+#include "MediaData.h"
+#include "MediaPrefs.h"
+#include "PDMFactory.h"
+#include "WebMDemuxer.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/dom/ContentChild.h"
+
+#ifndef MOZ_WIDGET_ANDROID
+#include "WebMSample.h"
+#endif
+
+namespace mozilla {
+
+// Update this version number to force re-running the benchmark. Such as when
+// an improvement to FFVP9 or LIBVPX is deemed worthwhile.
+const uint32_t VP9Benchmark::sBenchmarkVersionID = 1;
+
+const char* VP9Benchmark::sBenchmarkFpsPref = "media.benchmark.vp9.fps";
+const char* VP9Benchmark::sBenchmarkFpsVersionCheck = "media.benchmark.vp9.versioncheck";
+bool VP9Benchmark::sHasRunTest = false;
+
+// static
+bool
+VP9Benchmark::IsVP9DecodeFast()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+#ifdef MOZ_WIDGET_ANDROID
+ return false;
+#else
+ bool hasPref = Preferences::HasUserValue(sBenchmarkFpsPref);
+ uint32_t hadRecentUpdate = Preferences::GetUint(sBenchmarkFpsVersionCheck, 0U);
+
+ if (!sHasRunTest && (!hasPref || hadRecentUpdate != sBenchmarkVersionID)) {
+ sHasRunTest = true;
+
+ RefPtr<WebMDemuxer> demuxer =
+ new WebMDemuxer(new BufferMediaResource(sWebMSample, sizeof(sWebMSample), nullptr,
+ NS_LITERAL_CSTRING("video/webm")));
+ RefPtr<Benchmark> estimiser =
+ new Benchmark(demuxer,
+ {
+ Preferences::GetInt("media.benchmark.frames", 300), // frames to measure
+ 1, // start benchmarking after decoding this frame.
+ 8, // loop after decoding that many frames.
+ TimeDuration::FromMilliseconds(
+ Preferences::GetUint("media.benchmark.timeout", 1000))
+ });
+ estimiser->Run()->Then(
+ AbstractThread::MainThread(), __func__,
+ [](uint32_t aDecodeFps) {
+ if (XRE_IsContentProcess()) {
+ dom::ContentChild* contentChild = dom::ContentChild::GetSingleton();
+ if (contentChild) {
+ contentChild->SendNotifyBenchmarkResult(NS_LITERAL_STRING("VP9"),
+ aDecodeFps);
+ }
+ } else {
+ Preferences::SetUint(sBenchmarkFpsPref, aDecodeFps);
+ Preferences::SetUint(sBenchmarkFpsVersionCheck, sBenchmarkVersionID);
+ }
+ Telemetry::Accumulate(Telemetry::ID::VIDEO_VP9_BENCHMARK_FPS, aDecodeFps);
+ },
+ []() { });
+ }
+
+ if (!hasPref) {
+ return false;
+ }
+
+ uint32_t decodeFps = Preferences::GetUint(sBenchmarkFpsPref);
+ uint32_t threshold =
+ Preferences::GetUint("media.benchmark.vp9.threshold", 150);
+
+ return decodeFps >= threshold;
+#endif
+}
+
+Benchmark::Benchmark(MediaDataDemuxer* aDemuxer, const Parameters& aParameters)
+ : QueueObject(AbstractThread::GetCurrent())
+ , mParameters(aParameters)
+ , mKeepAliveUntilComplete(this)
+ , mPlaybackState(this, aDemuxer)
+{
+ MOZ_COUNT_CTOR(Benchmark);
+ MOZ_ASSERT(Thread(), "Must be run in task queue");
+}
+
+Benchmark::~Benchmark()
+{
+ MOZ_COUNT_DTOR(Benchmark);
+}
+
+RefPtr<Benchmark::BenchmarkPromise>
+Benchmark::Run()
+{
+ MOZ_ASSERT(OnThread());
+
+ RefPtr<BenchmarkPromise> p = mPromise.Ensure(__func__);
+ RefPtr<Benchmark> self = this;
+ mPlaybackState.Dispatch(
+ NS_NewRunnableFunction([self]() { self->mPlaybackState.DemuxSamples(); }));
+ return p;
+}
+
+void
+Benchmark::ReturnResult(uint32_t aDecodeFps)
+{
+ MOZ_ASSERT(OnThread());
+
+ mPromise.ResolveIfExists(aDecodeFps, __func__);
+}
+
+void
+Benchmark::Dispose()
+{
+ MOZ_ASSERT(OnThread());
+
+ mKeepAliveUntilComplete = nullptr;
+ mPromise.RejectIfExists(false, __func__);
+}
+
+void
+Benchmark::Init()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ MediaPrefs::GetSingleton();
+}
+
+BenchmarkPlayback::BenchmarkPlayback(Benchmark* aMainThreadState,
+ MediaDataDemuxer* aDemuxer)
+ : QueueObject(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK)))
+ , mMainThreadState(aMainThreadState)
+ , mDecoderTaskQueue(new TaskQueue(GetMediaThreadPool(
+ MediaThreadType::PLATFORM_DECODER)))
+ , mDemuxer(aDemuxer)
+ , mSampleIndex(0)
+ , mFrameCount(0)
+ , mFinished(false)
+{
+ MOZ_ASSERT(static_cast<Benchmark*>(mMainThreadState)->OnThread());
+}
+
+void
+BenchmarkPlayback::DemuxSamples()
+{
+ MOZ_ASSERT(OnThread());
+
+ RefPtr<Benchmark> ref(mMainThreadState);
+ mDemuxer->Init()->Then(
+ Thread(), __func__,
+ [this, ref](nsresult aResult) {
+ MOZ_ASSERT(OnThread());
+ mTrackDemuxer =
+ mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ if (!mTrackDemuxer) {
+ MainThreadShutdown();
+ return;
+ }
+ DemuxNextSample();
+ },
+ [this, ref](const MediaResult& aError) { MainThreadShutdown(); });
+}
+
+void
+BenchmarkPlayback::DemuxNextSample()
+{
+ MOZ_ASSERT(OnThread());
+
+ RefPtr<Benchmark> ref(mMainThreadState);
+ RefPtr<MediaTrackDemuxer::SamplesPromise> promise = mTrackDemuxer->GetSamples();
+ promise->Then(
+ Thread(), __func__,
+ [this, ref](RefPtr<MediaTrackDemuxer::SamplesHolder> aHolder) {
+ mSamples.AppendElements(Move(aHolder->mSamples));
+ if (ref->mParameters.mStopAtFrame &&
+ mSamples.Length() == (size_t)ref->mParameters.mStopAtFrame.ref()) {
+ InitDecoder(Move(*mTrackDemuxer->GetInfo()));
+ } else {
+ Dispatch(NS_NewRunnableFunction([this, ref]() { DemuxNextSample(); }));
+ }
+ },
+ [this, ref](const MediaResult& aError) {
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ InitDecoder(Move(*mTrackDemuxer->GetInfo()));
+ break;
+ default:
+ MainThreadShutdown();
+ }
+ });
+}
+
+void
+BenchmarkPlayback::InitDecoder(TrackInfo&& aInfo)
+{
+ MOZ_ASSERT(OnThread());
+
+ RefPtr<PDMFactory> platform = new PDMFactory();
+ mDecoder = platform->CreateDecoder({ aInfo, mDecoderTaskQueue, reinterpret_cast<MediaDataDecoderCallback*>(this) });
+ if (!mDecoder) {
+ MainThreadShutdown();
+ return;
+ }
+ RefPtr<Benchmark> ref(mMainThreadState);
+ mDecoder->Init()->Then(
+ Thread(), __func__,
+ [this, ref](TrackInfo::TrackType aTrackType) {
+ InputExhausted();
+ },
+ [this, ref](MediaResult aError) {
+ MainThreadShutdown();
+ });
+}
+
+void
+BenchmarkPlayback::MainThreadShutdown()
+{
+ MOZ_ASSERT(OnThread());
+
+ if (mFinished) {
+ // Nothing more to do.
+ return;
+ }
+ mFinished = true;
+
+ if (mDecoder) {
+ mDecoder->Flush();
+ mDecoder->Shutdown();
+ mDecoder = nullptr;
+ }
+
+ mDecoderTaskQueue->BeginShutdown();
+ mDecoderTaskQueue->AwaitShutdownAndIdle();
+ mDecoderTaskQueue = nullptr;
+
+ if (mTrackDemuxer) {
+ mTrackDemuxer->Reset();
+ mTrackDemuxer->BreakCycles();
+ mTrackDemuxer = nullptr;
+ }
+
+ RefPtr<Benchmark> ref(mMainThreadState);
+ Thread()->AsTaskQueue()->BeginShutdown()->Then(
+ ref->Thread(), __func__,
+ [ref]() { ref->Dispose(); },
+ []() { MOZ_CRASH("not reached"); });
+}
+
+void
+BenchmarkPlayback::Output(MediaData* aData)
+{
+ RefPtr<Benchmark> ref(mMainThreadState);
+ Dispatch(NS_NewRunnableFunction([this, ref]() {
+ mFrameCount++;
+ if (mFrameCount == ref->mParameters.mStartupFrame) {
+ mDecodeStartTime = TimeStamp::Now();
+ }
+ int32_t frames = mFrameCount - ref->mParameters.mStartupFrame;
+ TimeDuration elapsedTime = TimeStamp::Now() - mDecodeStartTime;
+ if (!mFinished &&
+ (frames == ref->mParameters.mFramesToMeasure ||
+ elapsedTime >= ref->mParameters.mTimeout)) {
+ uint32_t decodeFps = frames / elapsedTime.ToSeconds();
+ MainThreadShutdown();
+ ref->Dispatch(NS_NewRunnableFunction([ref, decodeFps]() {
+ ref->ReturnResult(decodeFps);
+ }));
+ }
+ }));
+}
+
+void
+BenchmarkPlayback::Error(const MediaResult& aError)
+{
+ RefPtr<Benchmark> ref(mMainThreadState);
+ Dispatch(NS_NewRunnableFunction([this, ref]() { MainThreadShutdown(); }));
+}
+
+void
+BenchmarkPlayback::InputExhausted()
+{
+ RefPtr<Benchmark> ref(mMainThreadState);
+ Dispatch(NS_NewRunnableFunction([this, ref]() {
+ MOZ_ASSERT(OnThread());
+ if (mFinished || mSampleIndex >= mSamples.Length()) {
+ return;
+ }
+ mDecoder->Input(mSamples[mSampleIndex]);
+ mSampleIndex++;
+ if (mSampleIndex == mSamples.Length()) {
+ if (ref->mParameters.mStopAtFrame) {
+ mSampleIndex = 0;
+ } else {
+ mDecoder->Drain();
+ }
+ }
+ }));
+}
+
+void
+BenchmarkPlayback::DrainComplete()
+{
+ RefPtr<Benchmark> ref(mMainThreadState);
+ Dispatch(NS_NewRunnableFunction([this, ref]() {
+ int32_t frames = mFrameCount - ref->mParameters.mStartupFrame;
+ TimeDuration elapsedTime = TimeStamp::Now() - mDecodeStartTime;
+ uint32_t decodeFps = frames / elapsedTime.ToSeconds();
+ MainThreadShutdown();
+ ref->Dispatch(NS_NewRunnableFunction([ref, decodeFps]() {
+ ref->ReturnResult(decodeFps);
+ }));
+ }));
+}
+
+bool
+BenchmarkPlayback::OnReaderTaskQueue()
+{
+ return OnThread();
+}
+
+}
diff --git a/dom/media/Benchmark.h b/dom/media/Benchmark.h
new file mode 100644
index 000000000..bb14751f4
--- /dev/null
+++ b/dom/media/Benchmark.h
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_BENCHMARK_H
+#define MOZILLA_BENCHMARK_H
+
+#include "MediaDataDemuxer.h"
+#include "QueueObject.h"
+#include "PlatformDecoderModule.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/TaskQueue.h"
+#include "mozilla/TimeStamp.h"
+#include "nsCOMPtr.h"
+
+namespace mozilla {
+
+class TaskQueue;
+class Benchmark;
+
+class BenchmarkPlayback : public QueueObject, private MediaDataDecoderCallback
+{
+ friend class Benchmark;
+ explicit BenchmarkPlayback(Benchmark* aMainThreadState, MediaDataDemuxer* aDemuxer);
+ void DemuxSamples();
+ void DemuxNextSample();
+ void MainThreadShutdown();
+ void InitDecoder(TrackInfo&& aInfo);
+
+ // MediaDataDecoderCallback
+ // Those methods are called on the MediaDataDecoder's task queue.
+ void Output(MediaData* aData) override;
+ void Error(const MediaResult& aError) override;
+ void InputExhausted() override;
+ void DrainComplete() override;
+ bool OnReaderTaskQueue() override;
+
+ Atomic<Benchmark*> mMainThreadState;
+
+ RefPtr<TaskQueue> mDecoderTaskQueue;
+ RefPtr<MediaDataDecoder> mDecoder;
+
+ // Object only accessed on Thread()
+ RefPtr<MediaDataDemuxer> mDemuxer;
+ RefPtr<MediaTrackDemuxer> mTrackDemuxer;
+ nsTArray<RefPtr<MediaRawData>> mSamples;
+ size_t mSampleIndex;
+ TimeStamp mDecodeStartTime;
+ uint32_t mFrameCount;
+ bool mFinished;
+};
+
+// Init() must have been called at least once prior on the
+// main thread.
+class Benchmark : public QueueObject
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Benchmark)
+
+ struct Parameters
+ {
+ Parameters()
+ : mFramesToMeasure(-1)
+ , mStartupFrame(1)
+ , mTimeout(TimeDuration::Forever()) {}
+
+ Parameters(int32_t aFramesToMeasure,
+ uint32_t aStartupFrame,
+ int32_t aStopAtFrame,
+ const TimeDuration& aTimeout)
+ : mFramesToMeasure(aFramesToMeasure)
+ , mStartupFrame(aStartupFrame)
+ , mStopAtFrame(Some(aStopAtFrame))
+ , mTimeout(aTimeout) {}
+
+ const int32_t mFramesToMeasure;
+ const uint32_t mStartupFrame;
+ const Maybe<int32_t> mStopAtFrame;
+ const TimeDuration mTimeout;
+ };
+
+ typedef MozPromise<uint32_t, bool, /* IsExclusive = */ true> BenchmarkPromise;
+
+ explicit Benchmark(MediaDataDemuxer* aDemuxer, const Parameters& aParameters = Parameters());
+ RefPtr<BenchmarkPromise> Run();
+
+ static void Init();
+
+private:
+ friend class BenchmarkPlayback;
+ virtual ~Benchmark();
+ void ReturnResult(uint32_t aDecodeFps);
+ void Dispose();
+ const Parameters mParameters;
+ RefPtr<Benchmark> mKeepAliveUntilComplete;
+ BenchmarkPlayback mPlaybackState;
+ MozPromiseHolder<BenchmarkPromise> mPromise;
+};
+
+class VP9Benchmark
+{
+public:
+ static bool IsVP9DecodeFast();
+ static const char* sBenchmarkFpsPref;
+ static const char* sBenchmarkFpsVersionCheck;
+ static const uint32_t sBenchmarkVersionID;
+ static bool sHasRunTest;
+};
+}
+
+#endif
diff --git a/dom/media/BufferMediaResource.h b/dom/media/BufferMediaResource.h
new file mode 100644
index 000000000..5633ddf9c
--- /dev/null
+++ b/dom/media/BufferMediaResource.h
@@ -0,0 +1,141 @@
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(BufferMediaResource_h_)
+#define BufferMediaResource_h_
+
+#include "MediaResource.h"
+#include "nsISeekableStream.h"
+#include "nsIPrincipal.h"
+#include <algorithm>
+
+namespace mozilla {
+
+// A simple MediaResource based on an in memory buffer. This class accepts
+// the address and the length of the buffer, and simulates a read/seek API
+// on top of it. The Read implementation involves copying memory, which is
+// unfortunate, but the MediaResource interface mandates that.
+class BufferMediaResource : public MediaResource
+{
+public:
+ BufferMediaResource(const uint8_t* aBuffer,
+ uint32_t aLength,
+ nsIPrincipal* aPrincipal,
+ const nsACString& aContentType) :
+ mBuffer(aBuffer),
+ mLength(aLength),
+ mOffset(0),
+ mPrincipal(aPrincipal),
+ mContentType(aContentType)
+ {
+ MOZ_COUNT_CTOR(BufferMediaResource);
+ }
+
+protected:
+ virtual ~BufferMediaResource()
+ {
+ MOZ_COUNT_DTOR(BufferMediaResource);
+ }
+
+private:
+ nsresult Close() override { return NS_OK; }
+ void Suspend(bool aCloseImmediately) override {}
+ void Resume() override {}
+ // Get the current principal for the channel
+ already_AddRefed<nsIPrincipal> GetCurrentPrincipal() override
+ {
+ nsCOMPtr<nsIPrincipal> principal = mPrincipal;
+ return principal.forget();
+ }
+ bool CanClone() override { return false; }
+ already_AddRefed<MediaResource> CloneData(MediaResourceCallback*) override
+ {
+ return nullptr;
+ }
+
+ // These methods are called off the main thread.
+ // The mode is initially MODE_PLAYBACK.
+ void SetReadMode(MediaCacheStream::ReadMode aMode) override {}
+ void SetPlaybackRate(uint32_t aBytesPerSecond) override {}
+ nsresult ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes) override
+ {
+ if (aOffset < 0 || aOffset > mLength) {
+ return NS_ERROR_FAILURE;
+ }
+ *aBytes = std::min(mLength - static_cast<uint32_t>(aOffset), aCount);
+ memcpy(aBuffer, mBuffer + aOffset, *aBytes);
+ mOffset = aOffset + *aBytes;
+ return NS_OK;
+ }
+ int64_t Tell() override { return mOffset; }
+
+ void Pin() override {}
+ void Unpin() override {}
+ double GetDownloadRate(bool* aIsReliable) override { *aIsReliable = false; return 0.; }
+ int64_t GetLength() override { return mLength; }
+ int64_t GetNextCachedData(int64_t aOffset) override { return aOffset; }
+ int64_t GetCachedDataEnd(int64_t aOffset) override { return mLength; }
+ bool IsDataCachedToEndOfResource(int64_t aOffset) override { return true; }
+ bool IsSuspendedByCache() override { return false; }
+ bool IsSuspended() override { return false; }
+ nsresult ReadFromCache(char* aBuffer,
+ int64_t aOffset,
+ uint32_t aCount) override
+ {
+ if (aOffset < 0) {
+ return NS_ERROR_FAILURE;
+ }
+
+ uint32_t bytes = std::min(mLength - static_cast<uint32_t>(aOffset), aCount);
+ memcpy(aBuffer, mBuffer + aOffset, bytes);
+ return NS_OK;
+ }
+
+ nsresult Open(nsIStreamListener** aStreamListener) override
+ {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override
+ {
+ aRanges += MediaByteRange(0, int64_t(mLength));
+ return NS_OK;
+ }
+
+ bool IsTransportSeekable() override { return true; }
+
+ const nsCString& GetContentType() const override
+ {
+ return mContentType;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mBuffer
+ // - mPrincipal
+ size_t size = MediaResource::SizeOfExcludingThis(aMallocSizeOf);
+ size += mContentType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+
+ return size;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ const uint8_t * mBuffer;
+ uint32_t mLength;
+ uint32_t mOffset;
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ const nsCString mContentType;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/CanvasCaptureMediaStream.cpp b/dom/media/CanvasCaptureMediaStream.cpp
new file mode 100644
index 000000000..f40f01e21
--- /dev/null
+++ b/dom/media/CanvasCaptureMediaStream.cpp
@@ -0,0 +1,298 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "CanvasCaptureMediaStream.h"
+#include "DOMMediaStream.h"
+#include "gfxPlatform.h"
+#include "ImageContainer.h"
+#include "MediaStreamGraph.h"
+#include "mozilla/dom/CanvasCaptureMediaStreamBinding.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/Atomics.h"
+#include "nsContentUtils.h"
+
+using namespace mozilla::layers;
+using namespace mozilla::gfx;
+
+namespace mozilla {
+namespace dom {
+
+class OutputStreamDriver::StreamListener : public MediaStreamListener
+{
+public:
+ explicit StreamListener(OutputStreamDriver* aDriver,
+ TrackID aTrackId,
+ PrincipalHandle aPrincipalHandle,
+ SourceMediaStream* aSourceStream)
+ : mEnded(false)
+ , mSourceStream(aSourceStream)
+ , mTrackId(aTrackId)
+ , mPrincipalHandle(aPrincipalHandle)
+ , mMutex("CanvasCaptureMediaStream OutputStreamDriver::StreamListener")
+ , mImage(nullptr)
+ {
+ MOZ_ASSERT(mSourceStream);
+ }
+
+ void EndStream() {
+ mEnded = true;
+ }
+
+ void SetImage(const RefPtr<layers::Image>& aImage)
+ {
+ MutexAutoLock lock(mMutex);
+ mImage = aImage;
+ }
+
+ void NotifyPull(MediaStreamGraph* aGraph, StreamTime aDesiredTime) override
+ {
+ // Called on the MediaStreamGraph thread.
+ StreamTime delta = aDesiredTime - mSourceStream->GetEndOfAppendedData(mTrackId);
+ if (delta > 0) {
+ MutexAutoLock lock(mMutex);
+ MOZ_ASSERT(mSourceStream);
+
+ RefPtr<Image> image = mImage;
+ IntSize size = image ? image->GetSize() : IntSize(0, 0);
+ VideoSegment segment;
+ segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
+
+ mSourceStream->AppendToTrack(mTrackId, &segment);
+ }
+
+ if (mEnded) {
+ mSourceStream->EndAllTrackAndFinish();
+ }
+ }
+
+protected:
+ ~StreamListener() { }
+
+private:
+ Atomic<bool> mEnded;
+ const RefPtr<SourceMediaStream> mSourceStream;
+ const TrackID mTrackId;
+ const PrincipalHandle mPrincipalHandle;
+
+ Mutex mMutex;
+ // The below members are protected by mMutex.
+ RefPtr<layers::Image> mImage;
+};
+
+OutputStreamDriver::OutputStreamDriver(SourceMediaStream* aSourceStream,
+ const TrackID& aTrackId,
+ const PrincipalHandle& aPrincipalHandle)
+ : FrameCaptureListener()
+ , mSourceStream(aSourceStream)
+ , mStreamListener(new StreamListener(this, aTrackId, aPrincipalHandle,
+ aSourceStream))
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mSourceStream);
+ mSourceStream->AddListener(mStreamListener);
+ mSourceStream->AddTrack(aTrackId, 0, new VideoSegment());
+ mSourceStream->AdvanceKnownTracksTime(STREAM_TIME_MAX);
+ mSourceStream->SetPullEnabled(true);
+
+ // All CanvasCaptureMediaStreams shall at least get one frame.
+ mFrameCaptureRequested = true;
+}
+
+OutputStreamDriver::~OutputStreamDriver()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mStreamListener) {
+ // MediaStreamGraph will keep the listener alive until it can finish the
+ // stream on the next NotifyPull().
+ mStreamListener->EndStream();
+ }
+}
+
+void
+OutputStreamDriver::SetImage(const RefPtr<layers::Image>& aImage)
+{
+ if (mStreamListener) {
+ mStreamListener->SetImage(aImage);
+ }
+}
+
+// ----------------------------------------------------------------------
+
+class TimerDriver : public OutputStreamDriver
+{
+public:
+ explicit TimerDriver(SourceMediaStream* aSourceStream,
+ const double& aFPS,
+ const TrackID& aTrackId,
+ const PrincipalHandle& aPrincipalHandle)
+ : OutputStreamDriver(aSourceStream, aTrackId, aPrincipalHandle)
+ , mFPS(aFPS)
+ , mTimer(nullptr)
+ {
+ if (mFPS == 0.0) {
+ return;
+ }
+
+ mTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+ if (!mTimer) {
+ return;
+ }
+ mTimer->InitWithFuncCallback(&TimerTick, this, int(1000 / mFPS), nsITimer::TYPE_REPEATING_SLACK);
+ }
+
+ static void TimerTick(nsITimer* aTimer, void* aClosure)
+ {
+ MOZ_ASSERT(aClosure);
+ TimerDriver* driver = static_cast<TimerDriver*>(aClosure);
+
+ driver->RequestFrameCapture();
+ }
+
+ void NewFrame(already_AddRefed<Image> aImage) override
+ {
+ RefPtr<Image> image = aImage;
+
+ if (!mFrameCaptureRequested) {
+ return;
+ }
+
+ mFrameCaptureRequested = false;
+ SetImage(image.forget());
+ }
+
+ void Forget() override
+ {
+ if (mTimer) {
+ mTimer->Cancel();
+ mTimer = nullptr;
+ }
+ }
+
+protected:
+ virtual ~TimerDriver() {}
+
+private:
+ const double mFPS;
+ nsCOMPtr<nsITimer> mTimer;
+};
+
+// ----------------------------------------------------------------------
+
+class AutoDriver : public OutputStreamDriver
+{
+public:
+ explicit AutoDriver(SourceMediaStream* aSourceStream,
+ const TrackID& aTrackId,
+ const PrincipalHandle& aPrincipalHandle)
+ : OutputStreamDriver(aSourceStream, aTrackId, aPrincipalHandle) {}
+
+ void NewFrame(already_AddRefed<Image> aImage) override
+ {
+ // Don't reset `mFrameCaptureRequested` since AutoDriver shall always have
+ // `mFrameCaptureRequested` set to true.
+ // This also means we should accept every frame as NewFrame is called only
+ // after something changed.
+
+ RefPtr<Image> image = aImage;
+ SetImage(image.forget());
+ }
+
+protected:
+ virtual ~AutoDriver() {}
+};
+
+// ----------------------------------------------------------------------
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(CanvasCaptureMediaStream, DOMMediaStream,
+ mCanvas)
+
+NS_IMPL_ADDREF_INHERITED(CanvasCaptureMediaStream, DOMMediaStream)
+NS_IMPL_RELEASE_INHERITED(CanvasCaptureMediaStream, DOMMediaStream)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(CanvasCaptureMediaStream)
+NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream)
+
+CanvasCaptureMediaStream::CanvasCaptureMediaStream(nsPIDOMWindowInner* aWindow,
+ HTMLCanvasElement* aCanvas)
+ : DOMMediaStream(aWindow, nullptr)
+ , mCanvas(aCanvas)
+ , mOutputStreamDriver(nullptr)
+{
+}
+
+CanvasCaptureMediaStream::~CanvasCaptureMediaStream()
+{
+ if (mOutputStreamDriver) {
+ mOutputStreamDriver->Forget();
+ }
+}
+
+JSObject*
+CanvasCaptureMediaStream::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return dom::CanvasCaptureMediaStreamBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+CanvasCaptureMediaStream::RequestFrame()
+{
+ if (mOutputStreamDriver) {
+ mOutputStreamDriver->RequestFrameCapture();
+ }
+}
+
+nsresult
+CanvasCaptureMediaStream::Init(const dom::Optional<double>& aFPS,
+ const TrackID& aTrackId,
+ nsIPrincipal* aPrincipal)
+{
+ PrincipalHandle principalHandle = MakePrincipalHandle(aPrincipal);
+
+ if (!aFPS.WasPassed()) {
+ mOutputStreamDriver =
+ new AutoDriver(GetInputStream()->AsSourceStream(), aTrackId, principalHandle);
+ } else if (aFPS.Value() < 0) {
+ return NS_ERROR_ILLEGAL_VALUE;
+ } else {
+ // Cap frame rate to 60 FPS for sanity
+ double fps = std::min(60.0, aFPS.Value());
+ mOutputStreamDriver =
+ new TimerDriver(GetInputStream()->AsSourceStream(), fps, aTrackId, principalHandle);
+ }
+ return NS_OK;
+}
+
+already_AddRefed<CanvasCaptureMediaStream>
+CanvasCaptureMediaStream::CreateSourceStream(nsPIDOMWindowInner* aWindow,
+ HTMLCanvasElement* aCanvas)
+{
+ RefPtr<CanvasCaptureMediaStream> stream = new CanvasCaptureMediaStream(aWindow, aCanvas);
+ MediaStreamGraph* graph =
+ MediaStreamGraph::GetInstance(MediaStreamGraph::SYSTEM_THREAD_DRIVER,
+ AudioChannel::Normal);
+ stream->InitSourceStream(graph);
+ return stream.forget();
+}
+
+FrameCaptureListener*
+CanvasCaptureMediaStream::FrameCaptureListener()
+{
+ return mOutputStreamDriver;
+}
+
+void
+CanvasCaptureMediaStream::StopCapture()
+{
+ if (!mOutputStreamDriver) {
+ return;
+ }
+
+ mOutputStreamDriver->Forget();
+ mOutputStreamDriver = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/CanvasCaptureMediaStream.h b/dom/media/CanvasCaptureMediaStream.h
new file mode 100644
index 000000000..0790fa6dd
--- /dev/null
+++ b/dom/media/CanvasCaptureMediaStream.h
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_CanvasCaptureMediaStream_h_
+#define mozilla_dom_CanvasCaptureMediaStream_h_
+
+#include "DOMMediaStream.h"
+#include "mozilla/dom/HTMLCanvasElement.h"
+#include "StreamTracks.h"
+
+class nsIPrincipal;
+
+namespace mozilla {
+class DOMMediaStream;
+class MediaStreamListener;
+class SourceMediaStream;
+
+namespace layers {
+class Image;
+} // namespace layers
+
+namespace dom {
+class CanvasCaptureMediaStream;
+class HTMLCanvasElement;
+class OutputStreamFrameListener;
+
+/*
+ * The CanvasCaptureMediaStream is a MediaStream subclass that provides a video
+ * track containing frames from a canvas. See an architectural overview below.
+ *
+ * ----------------------------------------------------------------------------
+ * === Main Thread === __________________________
+ * | |
+ * | CanvasCaptureMediaStream |
+ * |__________________________|
+ * |
+ * | RequestFrame()
+ * v
+ * ________________________
+ * ________ FrameCaptureRequested? | |
+ * | | ------------------------> | OutputStreamDriver |
+ * | Canvas | SetFrameCapture() | (FrameCaptureListener) |
+ * |________| ------------------------> |________________________|
+ * |
+ * | SetImage()
+ * v
+ * ___________________
+ * | StreamListener |
+ * ---------------------------------------| (All image access |----------------
+ * === MediaStreamGraph Thread === | Mutex Guarded) |
+ * |___________________|
+ * ^ |
+ * NotifyPull() | | AppendToTrack()
+ * | v
+ * ___________________________
+ * | |
+ * | MSG / SourceMediaStream |
+ * |___________________________|
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+ * Base class for drivers of the output stream.
+ * It is up to each sub class to implement the NewFrame() callback of
+ * FrameCaptureListener.
+ */
+class OutputStreamDriver : public FrameCaptureListener
+{
+public:
+ OutputStreamDriver(SourceMediaStream* aSourceStream,
+ const TrackID& aTrackId,
+ const PrincipalHandle& aPrincipalHandle);
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(OutputStreamDriver);
+
+ /*
+ * Sub classes can SetImage() to update the image being appended to the
+ * output stream. It will be appended on the next NotifyPull from MSG.
+ */
+ void SetImage(const RefPtr<layers::Image>& aImage);
+
+ /*
+ * Makes sure any internal resources this driver is holding that may create
+ * reference cycles are released.
+ */
+ virtual void Forget() {}
+
+protected:
+ virtual ~OutputStreamDriver();
+ class StreamListener;
+
+private:
+ RefPtr<SourceMediaStream> mSourceStream;
+ RefPtr<StreamListener> mStreamListener;
+};
+
+class CanvasCaptureMediaStream : public DOMMediaStream
+{
+public:
+ CanvasCaptureMediaStream(nsPIDOMWindowInner* aWindow, HTMLCanvasElement* aCanvas);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(CanvasCaptureMediaStream, DOMMediaStream)
+
+ nsresult Init(const dom::Optional<double>& aFPS, const TrackID& aTrackId,
+ nsIPrincipal* aPrincipal);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // WebIDL
+ HTMLCanvasElement* Canvas() const { return mCanvas; }
+ void RequestFrame();
+
+ dom::FrameCaptureListener* FrameCaptureListener();
+
+ /**
+ * Stops capturing for this stream at mCanvas.
+ */
+ void StopCapture();
+
+ /**
+ * Create a CanvasCaptureMediaStream whose underlying stream is a SourceMediaStream.
+ */
+ static already_AddRefed<CanvasCaptureMediaStream>
+ CreateSourceStream(nsPIDOMWindowInner* aWindow,
+ HTMLCanvasElement* aCanvas);
+
+protected:
+ ~CanvasCaptureMediaStream();
+
+private:
+ RefPtr<HTMLCanvasElement> mCanvas;
+ RefPtr<OutputStreamDriver> mOutputStreamDriver;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* mozilla_dom_CanvasCaptureMediaStream_h_ */
diff --git a/dom/media/CubebUtils.cpp b/dom/media/CubebUtils.cpp
new file mode 100644
index 000000000..d1b4bae99
--- /dev/null
+++ b/dom/media/CubebUtils.cpp
@@ -0,0 +1,386 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <stdint.h>
+#include <algorithm>
+#include "nsIStringBundle.h"
+#include "nsDebug.h"
+#include "nsString.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StaticMutex.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/Logging.h"
+#include "nsThreadUtils.h"
+#include "CubebUtils.h"
+#include "nsAutoRef.h"
+#include "prdtoa.h"
+
+#define PREF_VOLUME_SCALE "media.volume_scale"
+#define PREF_CUBEB_LATENCY_PLAYBACK "media.cubeb_latency_playback_ms"
+#define PREF_CUBEB_LATENCY_MSG "media.cubeb_latency_msg_frames"
+
+namespace mozilla {
+
+namespace {
+
+LazyLogModule gCubebLog("cubeb");
+
+void CubebLogCallback(const char* aFmt, ...)
+{
+ char buffer[256];
+
+ va_list arglist;
+ va_start(arglist, aFmt);
+ VsprintfLiteral (buffer, aFmt, arglist);
+ MOZ_LOG(gCubebLog, LogLevel::Error, ("%s", buffer));
+ va_end(arglist);
+}
+
+// This mutex protects the variables below.
+StaticMutex sMutex;
+enum class CubebState {
+ Uninitialized = 0,
+ Initialized,
+ Shutdown
+} sCubebState = CubebState::Uninitialized;
+cubeb* sCubebContext;
+double sVolumeScale;
+uint32_t sCubebPlaybackLatencyInMilliseconds;
+uint32_t sCubebMSGLatencyInFrames;
+bool sCubebPlaybackLatencyPrefSet;
+bool sCubebMSGLatencyPrefSet;
+bool sAudioStreamInitEverSucceeded = false;
+StaticAutoPtr<char> sBrandName;
+
+const char kBrandBundleURL[] = "chrome://branding/locale/brand.properties";
+
+const char* AUDIOSTREAM_BACKEND_ID_STR[] = {
+ "jack",
+ "pulse",
+ "alsa",
+ "audiounit",
+ "audioqueue",
+ "wasapi",
+ "winmm",
+ "directsound",
+ "sndio",
+ "opensl",
+ "audiotrack",
+ "kai"
+};
+/* Index for failures to create an audio stream the first time. */
+const int CUBEB_BACKEND_INIT_FAILURE_FIRST =
+ ArrayLength(AUDIOSTREAM_BACKEND_ID_STR);
+/* Index for failures to create an audio stream after the first time */
+const int CUBEB_BACKEND_INIT_FAILURE_OTHER = CUBEB_BACKEND_INIT_FAILURE_FIRST + 1;
+/* Index for an unknown backend. */
+const int CUBEB_BACKEND_UNKNOWN = CUBEB_BACKEND_INIT_FAILURE_FIRST + 2;
+
+
+// Prefered samplerate, in Hz (characteristic of the hardware, mixer, platform,
+// and API used).
+//
+// sMutex protects *initialization* of this, which must be performed from each
+// thread before fetching, after which it is safe to fetch without holding the
+// mutex because it is only written once per process execution (by the first
+// initialization to complete). Since the init must have been called on a
+// given thread before fetching the value, it's guaranteed (via the mutex) that
+// sufficient memory barriers have occurred to ensure the correct value is
+// visible on the querying thread/CPU.
+uint32_t sPreferredSampleRate;
+
+} // namespace
+
+extern LazyLogModule gAudioStreamLog;
+
+static const uint32_t CUBEB_NORMAL_LATENCY_MS = 100;
+// Consevative default that can work on all platforms.
+static const uint32_t CUBEB_NORMAL_LATENCY_FRAMES = 1024;
+
+namespace CubebUtils {
+
+void PrefChanged(const char* aPref, void* aClosure)
+{
+ if (strcmp(aPref, PREF_VOLUME_SCALE) == 0) {
+ nsAdoptingString value = Preferences::GetString(aPref);
+ StaticMutexAutoLock lock(sMutex);
+ if (value.IsEmpty()) {
+ sVolumeScale = 1.0;
+ } else {
+ NS_ConvertUTF16toUTF8 utf8(value);
+ sVolumeScale = std::max<double>(0, PR_strtod(utf8.get(), nullptr));
+ }
+ } else if (strcmp(aPref, PREF_CUBEB_LATENCY_PLAYBACK) == 0) {
+ // Arbitrary default stream latency of 100ms. The higher this
+ // value, the longer stream volume changes will take to become
+ // audible.
+ sCubebPlaybackLatencyPrefSet = Preferences::HasUserValue(aPref);
+ uint32_t value = Preferences::GetUint(aPref, CUBEB_NORMAL_LATENCY_MS);
+ StaticMutexAutoLock lock(sMutex);
+ sCubebPlaybackLatencyInMilliseconds = std::min<uint32_t>(std::max<uint32_t>(value, 1), 1000);
+ } else if (strcmp(aPref, PREF_CUBEB_LATENCY_MSG) == 0) {
+ sCubebMSGLatencyPrefSet = Preferences::HasUserValue(aPref);
+ uint32_t value = Preferences::GetUint(aPref, CUBEB_NORMAL_LATENCY_FRAMES);
+ StaticMutexAutoLock lock(sMutex);
+ // 128 is the block size for the Web Audio API, which limits how low the
+ // latency can be here.
+ // We don't want to limit the upper limit too much, so that people can
+ // experiment.
+ sCubebMSGLatencyInFrames = std::min<uint32_t>(std::max<uint32_t>(value, 128), 1e6);
+ }
+}
+
+bool GetFirstStream()
+{
+ static bool sFirstStream = true;
+
+ StaticMutexAutoLock lock(sMutex);
+ bool result = sFirstStream;
+ sFirstStream = false;
+ return result;
+}
+
+double GetVolumeScale()
+{
+ StaticMutexAutoLock lock(sMutex);
+ return sVolumeScale;
+}
+
+cubeb* GetCubebContext()
+{
+ StaticMutexAutoLock lock(sMutex);
+ return GetCubebContextUnlocked();
+}
+
+bool InitPreferredSampleRate()
+{
+ StaticMutexAutoLock lock(sMutex);
+ if (sPreferredSampleRate != 0) {
+ return true;
+ }
+ cubeb* context = GetCubebContextUnlocked();
+ if (!context) {
+ return false;
+ }
+ if (cubeb_get_preferred_sample_rate(context,
+ &sPreferredSampleRate) != CUBEB_OK) {
+
+ return false;
+ }
+ MOZ_ASSERT(sPreferredSampleRate);
+ return true;
+}
+
+uint32_t PreferredSampleRate()
+{
+ if (!InitPreferredSampleRate()) {
+ return 44100;
+ }
+ MOZ_ASSERT(sPreferredSampleRate);
+ return sPreferredSampleRate;
+}
+
+void InitBrandName()
+{
+ if (sBrandName) {
+ return;
+ }
+ nsXPIDLString brandName;
+ nsCOMPtr<nsIStringBundleService> stringBundleService =
+ mozilla::services::GetStringBundleService();
+ if (stringBundleService) {
+ nsCOMPtr<nsIStringBundle> brandBundle;
+ nsresult rv = stringBundleService->CreateBundle(kBrandBundleURL,
+ getter_AddRefs(brandBundle));
+ if (NS_SUCCEEDED(rv)) {
+ rv = brandBundle->GetStringFromName(u"brandShortName",
+ getter_Copies(brandName));
+ NS_WARNING_ASSERTION(
+ NS_SUCCEEDED(rv), "Could not get the program name for a cubeb stream.");
+ }
+ }
+ /* cubeb expects a c-string. */
+ const char* ascii = NS_LossyConvertUTF16toASCII(brandName).get();
+ sBrandName = new char[brandName.Length() + 1];
+ PodCopy(sBrandName.get(), ascii, brandName.Length());
+ sBrandName[brandName.Length()] = 0;
+}
+
+cubeb* GetCubebContextUnlocked()
+{
+ sMutex.AssertCurrentThreadOwns();
+ if (sCubebState != CubebState::Uninitialized) {
+ // If we have already passed the initialization point (below), just return
+ // the current context, which may be null (e.g., after error or shutdown.)
+ return sCubebContext;
+ }
+
+ if (!sBrandName && NS_IsMainThread()) {
+ InitBrandName();
+ } else {
+ NS_WARNING_ASSERTION(
+ sBrandName, "Did not initialize sbrandName, and not on the main thread?");
+ }
+
+ int rv = cubeb_init(&sCubebContext, sBrandName);
+ NS_WARNING_ASSERTION(rv == CUBEB_OK, "Could not get a cubeb context.");
+ sCubebState = (rv == CUBEB_OK) ? CubebState::Initialized : CubebState::Uninitialized;
+
+ if (MOZ_LOG_TEST(gCubebLog, LogLevel::Verbose)) {
+ cubeb_set_log_callback(CUBEB_LOG_VERBOSE, CubebLogCallback);
+ } else if (MOZ_LOG_TEST(gCubebLog, LogLevel::Error)) {
+ cubeb_set_log_callback(CUBEB_LOG_NORMAL, CubebLogCallback);
+ }
+
+ return sCubebContext;
+}
+
+void ReportCubebBackendUsed()
+{
+ StaticMutexAutoLock lock(sMutex);
+
+ sAudioStreamInitEverSucceeded = true;
+
+ bool foundBackend = false;
+ for (uint32_t i = 0; i < ArrayLength(AUDIOSTREAM_BACKEND_ID_STR); i++) {
+ if (!strcmp(cubeb_get_backend_id(sCubebContext), AUDIOSTREAM_BACKEND_ID_STR[i])) {
+ Telemetry::Accumulate(Telemetry::AUDIOSTREAM_BACKEND_USED, i);
+ foundBackend = true;
+ }
+ }
+ if (!foundBackend) {
+ Telemetry::Accumulate(Telemetry::AUDIOSTREAM_BACKEND_USED,
+ CUBEB_BACKEND_UNKNOWN);
+ }
+}
+
+void ReportCubebStreamInitFailure(bool aIsFirst)
+{
+ StaticMutexAutoLock lock(sMutex);
+ if (!aIsFirst && !sAudioStreamInitEverSucceeded) {
+ // This machine has no audio hardware, or it's in really bad shape, don't
+ // send this info, since we want CUBEB_BACKEND_INIT_FAILURE_OTHER to detect
+ // failures to open multiple streams in a process over time.
+ return;
+ }
+ Telemetry::Accumulate(Telemetry::AUDIOSTREAM_BACKEND_USED,
+ aIsFirst ? CUBEB_BACKEND_INIT_FAILURE_FIRST
+ : CUBEB_BACKEND_INIT_FAILURE_OTHER);
+}
+
+uint32_t GetCubebPlaybackLatencyInMilliseconds()
+{
+ StaticMutexAutoLock lock(sMutex);
+ return sCubebPlaybackLatencyInMilliseconds;
+}
+
+bool CubebPlaybackLatencyPrefSet()
+{
+ StaticMutexAutoLock lock(sMutex);
+ return sCubebPlaybackLatencyPrefSet;
+}
+
+bool CubebMSGLatencyPrefSet()
+{
+ StaticMutexAutoLock lock(sMutex);
+ return sCubebMSGLatencyPrefSet;
+}
+
+Maybe<uint32_t> GetCubebMSGLatencyInFrames()
+{
+ StaticMutexAutoLock lock(sMutex);
+ if (!sCubebMSGLatencyPrefSet) {
+ return Maybe<uint32_t>();
+ }
+ MOZ_ASSERT(sCubebMSGLatencyInFrames > 0);
+ return Some(sCubebMSGLatencyInFrames);
+}
+
+void InitLibrary()
+{
+ PrefChanged(PREF_VOLUME_SCALE, nullptr);
+ Preferences::RegisterCallback(PrefChanged, PREF_VOLUME_SCALE);
+ PrefChanged(PREF_CUBEB_LATENCY_PLAYBACK, nullptr);
+ PrefChanged(PREF_CUBEB_LATENCY_MSG, nullptr);
+ Preferences::RegisterCallback(PrefChanged, PREF_CUBEB_LATENCY_PLAYBACK);
+ Preferences::RegisterCallback(PrefChanged, PREF_CUBEB_LATENCY_MSG);
+#ifndef MOZ_WIDGET_ANDROID
+ NS_DispatchToMainThread(NS_NewRunnableFunction(&InitBrandName));
+#endif
+}
+
+void ShutdownLibrary()
+{
+ Preferences::UnregisterCallback(PrefChanged, PREF_VOLUME_SCALE);
+ Preferences::UnregisterCallback(PrefChanged, PREF_CUBEB_LATENCY_PLAYBACK);
+ Preferences::UnregisterCallback(PrefChanged, PREF_CUBEB_LATENCY_MSG);
+
+ StaticMutexAutoLock lock(sMutex);
+ if (sCubebContext) {
+ cubeb_destroy(sCubebContext);
+ sCubebContext = nullptr;
+ }
+ sBrandName = nullptr;
+ // This will ensure we don't try to re-create a context.
+ sCubebState = CubebState::Shutdown;
+}
+
+uint32_t MaxNumberOfChannels()
+{
+ cubeb* cubebContext = GetCubebContext();
+ uint32_t maxNumberOfChannels;
+ if (cubebContext &&
+ cubeb_get_max_channel_count(cubebContext,
+ &maxNumberOfChannels) == CUBEB_OK) {
+ return maxNumberOfChannels;
+ }
+
+ return 0;
+}
+
+#if defined(__ANDROID__) && defined(MOZ_B2G)
+cubeb_stream_type ConvertChannelToCubebType(dom::AudioChannel aChannel)
+{
+ switch(aChannel) {
+ case dom::AudioChannel::Normal:
+ /* FALLTHROUGH */
+ case dom::AudioChannel::Content:
+ return CUBEB_STREAM_TYPE_MUSIC;
+ case dom::AudioChannel::Notification:
+ return CUBEB_STREAM_TYPE_NOTIFICATION;
+ case dom::AudioChannel::Alarm:
+ return CUBEB_STREAM_TYPE_ALARM;
+ case dom::AudioChannel::Telephony:
+ return CUBEB_STREAM_TYPE_VOICE_CALL;
+ case dom::AudioChannel::Ringer:
+ return CUBEB_STREAM_TYPE_RING;
+ case dom::AudioChannel::System:
+ return CUBEB_STREAM_TYPE_SYSTEM;
+ case dom::AudioChannel::Publicnotification:
+ return CUBEB_STREAM_TYPE_SYSTEM_ENFORCED;
+ default:
+ NS_ERROR("The value of AudioChannel is invalid");
+ return CUBEB_STREAM_TYPE_MAX;
+ }
+}
+#endif
+
+void GetCurrentBackend(nsAString& aBackend)
+{
+ cubeb* cubebContext = GetCubebContext();
+ if (cubebContext) {
+ const char* backend = cubeb_get_backend_id(cubebContext);
+ if (backend) {
+ aBackend.AssignASCII(backend);
+ return;
+ }
+ }
+ aBackend.AssignLiteral("unknown");
+}
+
+} // namespace CubebUtils
+} // namespace mozilla
diff --git a/dom/media/CubebUtils.h b/dom/media/CubebUtils.h
new file mode 100644
index 000000000..171c244b7
--- /dev/null
+++ b/dom/media/CubebUtils.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(CubebUtils_h_)
+#define CubebUtils_h_
+
+#include "cubeb/cubeb.h"
+#include "mozilla/dom/AudioChannelBinding.h"
+#include "mozilla/Maybe.h"
+
+namespace mozilla {
+namespace CubebUtils {
+
+typedef cubeb_devid AudioDeviceID;
+
+// Initialize Audio Library. Some Audio backends require initializing the
+// library before using it.
+void InitLibrary();
+
+// Shutdown Audio Library. Some Audio backends require shutting down the
+// library after using it.
+void ShutdownLibrary();
+
+// Returns the maximum number of channels supported by the audio hardware.
+uint32_t MaxNumberOfChannels();
+
+// Get the sample rate the hardware/mixer runs at. Thread safe.
+uint32_t PreferredSampleRate();
+
+void PrefChanged(const char* aPref, void* aClosure);
+double GetVolumeScale();
+bool GetFirstStream();
+cubeb* GetCubebContext();
+cubeb* GetCubebContextUnlocked();
+void ReportCubebStreamInitFailure(bool aIsFirstStream);
+void ReportCubebBackendUsed();
+uint32_t GetCubebPlaybackLatencyInMilliseconds();
+Maybe<uint32_t> GetCubebMSGLatencyInFrames();
+bool CubebLatencyPrefSet();
+#if defined(__ANDROID__) && defined(MOZ_B2G)
+cubeb_stream_type ConvertChannelToCubebType(dom::AudioChannel aChannel);
+#endif
+void GetCurrentBackend(nsAString& aBackend);
+
+} // namespace CubebUtils
+} // namespace mozilla
+
+#endif // CubebUtils_h_
diff --git a/dom/media/DOMMediaStream.cpp b/dom/media/DOMMediaStream.cpp
new file mode 100644
index 000000000..6794ee32f
--- /dev/null
+++ b/dom/media/DOMMediaStream.cpp
@@ -0,0 +1,1678 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DOMMediaStream.h"
+#include "nsContentUtils.h"
+#include "nsServiceManagerUtils.h"
+#include "nsIScriptError.h"
+#include "nsIUUIDGenerator.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/MediaStreamBinding.h"
+#include "mozilla/dom/MediaStreamTrackEvent.h"
+#include "mozilla/dom/LocalMediaStreamBinding.h"
+#include "mozilla/dom/AudioNode.h"
+#include "AudioChannelAgent.h"
+#include "mozilla/dom/AudioTrack.h"
+#include "mozilla/dom/AudioTrackList.h"
+#include "mozilla/dom/VideoTrack.h"
+#include "mozilla/dom/VideoTrackList.h"
+#include "mozilla/dom/HTMLCanvasElement.h"
+#include "mozilla/media/MediaUtils.h"
+#include "MediaStreamGraph.h"
+#include "AudioStreamTrack.h"
+#include "VideoStreamTrack.h"
+#include "Layers.h"
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with NS_DECL_NSIDOMMEDIASTREAM, containing
+// currentTime getter.
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+#ifdef LOG
+#undef LOG
+#endif
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with MediaStream::GetCurrentTime.
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+using namespace mozilla;
+using namespace mozilla::dom;
+using namespace mozilla::layers;
+using namespace mozilla::media;
+
+static LazyLogModule gMediaStreamLog("MediaStream");
+#define LOG(type, msg) MOZ_LOG(gMediaStreamLog, type, msg)
+
+const TrackID TRACK_VIDEO_PRIMARY = 1;
+
+static bool
+ContainsLiveTracks(nsTArray<RefPtr<DOMMediaStream::TrackPort>>& aTracks)
+{
+ for (auto& port : aTracks) {
+ if (port->GetTrack()->ReadyState() == MediaStreamTrackState::Live) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+DOMMediaStream::TrackPort::TrackPort(MediaInputPort* aInputPort,
+ MediaStreamTrack* aTrack,
+ const InputPortOwnership aOwnership)
+ : mInputPort(aInputPort)
+ , mTrack(aTrack)
+ , mOwnership(aOwnership)
+{
+ MOZ_ASSERT(mInputPort);
+ MOZ_ASSERT(mTrack);
+
+ MOZ_COUNT_CTOR(TrackPort);
+}
+
+DOMMediaStream::TrackPort::~TrackPort()
+{
+ MOZ_COUNT_DTOR(TrackPort);
+
+ if (mOwnership == InputPortOwnership::OWNED) {
+ DestroyInputPort();
+ }
+}
+
+void
+DOMMediaStream::TrackPort::DestroyInputPort()
+{
+ if (mInputPort) {
+ mInputPort->Destroy();
+ mInputPort = nullptr;
+ }
+}
+
+MediaStream*
+DOMMediaStream::TrackPort::GetSource() const
+{
+ return mInputPort ? mInputPort->GetSource() : nullptr;
+}
+
+TrackID
+DOMMediaStream::TrackPort::GetSourceTrackId() const
+{
+ return mInputPort ? mInputPort->GetSourceTrackId() : TRACK_INVALID;
+}
+
+already_AddRefed<Pledge<bool>>
+DOMMediaStream::TrackPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
+{
+ if (mInputPort) {
+ return mInputPort->BlockSourceTrackId(aTrackId, aBlockingMode);
+ }
+ RefPtr<Pledge<bool>> rejected = new Pledge<bool>();
+ rejected->Reject(NS_ERROR_FAILURE);
+ return rejected.forget();
+}
+
+NS_IMPL_CYCLE_COLLECTION(DOMMediaStream::TrackPort, mTrack)
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMMediaStream::TrackPort, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMMediaStream::TrackPort, Release)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaStreamTrackSourceGetter)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaStreamTrackSourceGetter)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamTrackSourceGetter)
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+NS_IMPL_CYCLE_COLLECTION_0(MediaStreamTrackSourceGetter)
+
+/**
+ * Listener registered on the Owned stream to detect added and ended owned
+ * tracks for keeping the list of MediaStreamTracks in sync with the tracks
+ * added and ended directly at the source.
+ */
+class DOMMediaStream::OwnedStreamListener : public MediaStreamListener {
+public:
+ explicit OwnedStreamListener(DOMMediaStream* aStream)
+ : mStream(aStream)
+ {}
+
+ void Forget() { mStream = nullptr; }
+
+ void DoNotifyTrackCreated(TrackID aTrackID, MediaSegment::Type aType,
+ MediaStream* aInputStream, TrackID aInputTrackID)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mStream) {
+ return;
+ }
+
+ MediaStreamTrack* track =
+ mStream->FindOwnedDOMTrack(aInputStream, aInputTrackID, aTrackID);
+
+ if (track) {
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Track %d from owned stream %p "
+ "bound to MediaStreamTrack %p.",
+ mStream, aTrackID, aInputStream, track));
+ return;
+ }
+
+ // Track had not been created on main thread before, create it now.
+ NS_WARNING_ASSERTION(
+ !mStream->mTracks.IsEmpty(),
+ "A new track was detected on the input stream; creating a corresponding "
+ "MediaStreamTrack. Initial tracks should be added manually to "
+ "immediately and synchronously be available to JS.");
+ RefPtr<MediaStreamTrackSource> source;
+ if (mStream->mTrackSourceGetter) {
+ source = mStream->mTrackSourceGetter->GetMediaStreamTrackSource(aTrackID);
+ }
+ if (!source) {
+ NS_ASSERTION(false, "Dynamic track created without an explicit TrackSource");
+ nsPIDOMWindowInner* window = mStream->GetParentObject();
+ nsIDocument* doc = window ? window->GetExtantDoc() : nullptr;
+ nsIPrincipal* principal = doc ? doc->NodePrincipal() : nullptr;
+ source = new BasicTrackSource(principal);
+ }
+
+ RefPtr<MediaStreamTrack> newTrack =
+ mStream->CreateDOMTrack(aTrackID, aType, source);
+ NS_DispatchToMainThread(NewRunnableMethod<RefPtr<MediaStreamTrack>>(
+ mStream, &DOMMediaStream::AddTrackInternal, newTrack));
+ }
+
+ void DoNotifyTrackEnded(MediaStream* aInputStream, TrackID aInputTrackID,
+ TrackID aTrackID)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mStream) {
+ return;
+ }
+
+ RefPtr<MediaStreamTrack> track =
+ mStream->FindOwnedDOMTrack(aInputStream, aInputTrackID, aTrackID);
+ NS_ASSERTION(track, "Owned MediaStreamTracks must be known by the DOMMediaStream");
+ if (track) {
+ LOG(LogLevel::Debug, ("DOMMediaStream %p MediaStreamTrack %p ended at the source. Marking it ended.",
+ mStream, track.get()));
+ NS_DispatchToMainThread(NewRunnableMethod(
+ track, &MediaStreamTrack::OverrideEnded));
+ }
+ }
+
+ void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset, TrackEventCommand aTrackEvents,
+ const MediaSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID) override
+ {
+ if (aTrackEvents & TrackEventCommand::TRACK_EVENT_CREATED) {
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod<TrackID, MediaSegment::Type, RefPtr<MediaStream>, TrackID>(
+ this, &OwnedStreamListener::DoNotifyTrackCreated,
+ aID, aQueuedMedia.GetType(), aInputStream, aInputTrackID);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(runnable.forget());
+ } else if (aTrackEvents & TrackEventCommand::TRACK_EVENT_ENDED) {
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod<RefPtr<MediaStream>, TrackID, TrackID>(
+ this, &OwnedStreamListener::DoNotifyTrackEnded,
+ aInputStream, aInputTrackID, aID);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(runnable.forget());
+ }
+ }
+
+private:
+ // These fields may only be accessed on the main thread
+ DOMMediaStream* mStream;
+};
+
+/**
+ * Listener registered on the Playback stream to detect when tracks end and when
+ * all new tracks this iteration have been created - for when several tracks are
+ * queued by the source and committed all at once.
+ */
+class DOMMediaStream::PlaybackStreamListener : public MediaStreamListener {
+public:
+ explicit PlaybackStreamListener(DOMMediaStream* aStream)
+ : mStream(aStream)
+ {}
+
+ void Forget()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mStream = nullptr;
+ }
+
+ void DoNotifyFinishedTrackCreation()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mStream) {
+ return;
+ }
+
+ // The owned stream listener adds its tracks after another main thread
+ // dispatch. We have to do the same to notify of created tracks to stay
+ // in sync. (Or NotifyTracksCreated is called before tracks are added).
+ NS_DispatchToMainThread(
+ NewRunnableMethod(mStream, &DOMMediaStream::NotifyTracksCreated));
+ }
+
+ void DoNotifyFinished()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mStream) {
+ return;
+ }
+
+ NS_DispatchToMainThread(NewRunnableMethod(
+ mStream, &DOMMediaStream::NotifyFinished));
+ }
+
+ // The methods below are called on the MediaStreamGraph thread.
+
+ void NotifyFinishedTrackCreation(MediaStreamGraph* aGraph) override
+ {
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &PlaybackStreamListener::DoNotifyFinishedTrackCreation);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(runnable.forget());
+ }
+
+
+ void NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event) override
+ {
+ if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(
+ NewRunnableMethod(this, &PlaybackStreamListener::DoNotifyFinished));
+ }
+ }
+
+private:
+ // These fields may only be accessed on the main thread
+ DOMMediaStream* mStream;
+};
+
+class DOMMediaStream::PlaybackTrackListener : public MediaStreamTrackConsumer
+{
+public:
+ explicit PlaybackTrackListener(DOMMediaStream* aStream) :
+ mStream(aStream) {}
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PlaybackTrackListener,
+ MediaStreamTrackConsumer)
+
+ void NotifyEnded(MediaStreamTrack* aTrack) override
+ {
+ if (!mStream) {
+ MOZ_ASSERT(false);
+ return;
+ }
+
+ if (!aTrack) {
+ MOZ_ASSERT(false);
+ return;
+ }
+
+ MOZ_ASSERT(mStream->HasTrack(*aTrack));
+ mStream->NotifyTrackRemoved(aTrack);
+ }
+
+protected:
+ virtual ~PlaybackTrackListener() {}
+
+ RefPtr<DOMMediaStream> mStream;
+};
+
+NS_IMPL_ADDREF_INHERITED(DOMMediaStream::PlaybackTrackListener,
+ MediaStreamTrackConsumer)
+NS_IMPL_RELEASE_INHERITED(DOMMediaStream::PlaybackTrackListener,
+ MediaStreamTrackConsumer)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMMediaStream::PlaybackTrackListener)
+NS_INTERFACE_MAP_END_INHERITING(MediaStreamTrackConsumer)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMMediaStream::PlaybackTrackListener,
+ MediaStreamTrackConsumer,
+ mStream)
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(DOMMediaStream)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DOMMediaStream,
+ DOMEventTargetHelper)
+ tmp->Destroy();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwnedTracks)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mTracks)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mConsumersToKeepAlive)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mTrackSourceGetter)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPlaybackTrackListener)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mVideoPrincipal)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DOMMediaStream,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwnedTracks)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTracks)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsumersToKeepAlive)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTrackSourceGetter)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPlaybackTrackListener)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVideoPrincipal)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_ADDREF_INHERITED(DOMMediaStream, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(DOMMediaStream, DOMEventTargetHelper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMMediaStream)
+ NS_INTERFACE_MAP_ENTRY(DOMMediaStream)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(DOMLocalMediaStream, DOMMediaStream)
+NS_IMPL_RELEASE_INHERITED(DOMLocalMediaStream, DOMMediaStream)
+
+NS_INTERFACE_MAP_BEGIN(DOMLocalMediaStream)
+ NS_INTERFACE_MAP_ENTRY(DOMLocalMediaStream)
+NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream)
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream,
+ mStreamNode)
+
+NS_IMPL_ADDREF_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
+NS_IMPL_RELEASE_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMAudioNodeMediaStream)
+NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream)
+
+DOMMediaStream::DOMMediaStream(nsPIDOMWindowInner* aWindow,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter)
+ : mLogicalStreamStartTime(0), mWindow(aWindow),
+ mInputStream(nullptr), mOwnedStream(nullptr), mPlaybackStream(nullptr),
+ mTracksPendingRemoval(0), mTrackSourceGetter(aTrackSourceGetter),
+ mPlaybackTrackListener(MakeAndAddRef<PlaybackTrackListener>(this)),
+ mTracksCreated(false), mNotifiedOfMediaStreamGraphShutdown(false),
+ mActive(false), mSetInactiveOnFinish(false)
+{
+ nsresult rv;
+ nsCOMPtr<nsIUUIDGenerator> uuidgen =
+ do_GetService("@mozilla.org/uuid-generator;1", &rv);
+
+ if (NS_SUCCEEDED(rv) && uuidgen) {
+ nsID uuid;
+ memset(&uuid, 0, sizeof(uuid));
+ rv = uuidgen->GenerateUUIDInPlace(&uuid);
+ if (NS_SUCCEEDED(rv)) {
+ char buffer[NSID_LENGTH];
+ uuid.ToProvidedString(buffer);
+ mID = NS_ConvertASCIItoUTF16(buffer);
+ }
+ }
+}
+
+DOMMediaStream::~DOMMediaStream()
+{
+ Destroy();
+}
+
+void
+DOMMediaStream::Destroy()
+{
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Being destroyed.", this));
+ if (mOwnedListener) {
+ mOwnedListener->Forget();
+ mOwnedListener = nullptr;
+ }
+ if (mPlaybackListener) {
+ mPlaybackListener->Forget();
+ mPlaybackListener = nullptr;
+ }
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ // We must remove ourselves from each track's principal change observer list
+ // before we die. CC may have cleared info->mTrack so guard against it.
+ MediaStreamTrack* track = info->GetTrack();
+ if (track) {
+ track->RemovePrincipalChangeObserver(this);
+ if (!track->Ended()) {
+ track->RemoveConsumer(mPlaybackTrackListener);
+ }
+ }
+ }
+ if (mPlaybackPort) {
+ mPlaybackPort->Destroy();
+ mPlaybackPort = nullptr;
+ }
+ if (mOwnedPort) {
+ mOwnedPort->Destroy();
+ mOwnedPort = nullptr;
+ }
+ if (mPlaybackStream) {
+ mPlaybackStream->UnregisterUser();
+ mPlaybackStream = nullptr;
+ }
+ if (mOwnedStream) {
+ mOwnedStream->UnregisterUser();
+ mOwnedStream = nullptr;
+ }
+ if (mInputStream) {
+ mInputStream->UnregisterUser();
+ mInputStream = nullptr;
+ }
+ mRunOnTracksAvailable.Clear();
+ mTrackListeners.Clear();
+}
+
+JSObject*
+DOMMediaStream::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return dom::MediaStreamBinding::Wrap(aCx, this, aGivenProto);
+}
+
+/* static */ already_AddRefed<DOMMediaStream>
+DOMMediaStream::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ Sequence<OwningNonNull<MediaStreamTrack>> emptyTrackSeq;
+ return Constructor(aGlobal, emptyTrackSeq, aRv);
+}
+
+/* static */ already_AddRefed<DOMMediaStream>
+DOMMediaStream::Constructor(const GlobalObject& aGlobal,
+ const DOMMediaStream& aStream,
+ ErrorResult& aRv)
+{
+ nsTArray<RefPtr<MediaStreamTrack>> tracks;
+ aStream.GetTracks(tracks);
+
+ Sequence<OwningNonNull<MediaStreamTrack>> nonNullTrackSeq;
+ if (!nonNullTrackSeq.SetLength(tracks.Length(), fallible)) {
+ MOZ_ASSERT(false);
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return nullptr;
+ }
+
+ for (size_t i = 0; i < tracks.Length(); ++i) {
+ nonNullTrackSeq[i] = tracks[i];
+ }
+
+ return Constructor(aGlobal, nonNullTrackSeq, aRv);
+}
+
+/* static */ already_AddRefed<DOMMediaStream>
+DOMMediaStream::Constructor(const GlobalObject& aGlobal,
+ const Sequence<OwningNonNull<MediaStreamTrack>>& aTracks,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> ownerWindow = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!ownerWindow) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ // Streams created from JS cannot have dynamically created tracks.
+ MediaStreamTrackSourceGetter* getter = nullptr;
+ RefPtr<DOMMediaStream> newStream = new DOMMediaStream(ownerWindow, getter);
+
+ for (MediaStreamTrack& track : aTracks) {
+ if (!newStream->GetPlaybackStream()) {
+ MOZ_RELEASE_ASSERT(track.Graph());
+ newStream->InitPlaybackStreamCommon(track.Graph());
+ }
+ newStream->AddTrack(track);
+ }
+
+ if (!newStream->GetPlaybackStream()) {
+ MOZ_ASSERT(aTracks.IsEmpty());
+ MediaStreamGraph* graph =
+ MediaStreamGraph::GetInstance(MediaStreamGraph::SYSTEM_THREAD_DRIVER,
+ AudioChannel::Normal);
+ newStream->InitPlaybackStreamCommon(graph);
+ }
+
+ return newStream.forget();
+}
+
+double
+DOMMediaStream::CurrentTime()
+{
+ if (!mPlaybackStream) {
+ return 0.0;
+ }
+ return mPlaybackStream->
+ StreamTimeToSeconds(mPlaybackStream->GetCurrentTime() - mLogicalStreamStartTime);
+}
+
+void
+DOMMediaStream::GetId(nsAString& aID) const
+{
+ aID = mID;
+}
+
+void
+DOMMediaStream::GetAudioTracks(nsTArray<RefPtr<AudioStreamTrack> >& aTracks) const
+{
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ AudioStreamTrack* t = info->GetTrack()->AsAudioStreamTrack();
+ if (t) {
+ aTracks.AppendElement(t);
+ }
+ }
+}
+
+void
+DOMMediaStream::GetVideoTracks(nsTArray<RefPtr<VideoStreamTrack> >& aTracks) const
+{
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ VideoStreamTrack* t = info->GetTrack()->AsVideoStreamTrack();
+ if (t) {
+ aTracks.AppendElement(t);
+ }
+ }
+}
+
+void
+DOMMediaStream::GetTracks(nsTArray<RefPtr<MediaStreamTrack> >& aTracks) const
+{
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ aTracks.AppendElement(info->GetTrack());
+ }
+}
+
+void
+DOMMediaStream::AddTrack(MediaStreamTrack& aTrack)
+{
+ MOZ_RELEASE_ASSERT(mPlaybackStream);
+
+ RefPtr<ProcessedMediaStream> dest = mPlaybackStream->AsProcessedStream();
+ MOZ_ASSERT(dest);
+ if (!dest) {
+ return;
+ }
+
+ LOG(LogLevel::Info, ("DOMMediaStream %p Adding track %p (from stream %p with ID %d)",
+ this, &aTrack, aTrack.mOwningStream.get(), aTrack.mTrackID));
+
+ if (mPlaybackStream->Graph() != aTrack.Graph()) {
+ NS_ASSERTION(false, "Cannot combine tracks from different MediaStreamGraphs");
+ LOG(LogLevel::Error, ("DOMMediaStream %p Own MSG %p != aTrack's MSG %p",
+ this, mPlaybackStream->Graph(), aTrack.Graph()));
+
+ nsAutoString trackId;
+ aTrack.GetId(trackId);
+ const char16_t* params[] = { trackId.get() };
+ nsCOMPtr<nsPIDOMWindowInner> pWindow = GetParentObject();
+ nsIDocument* document = pWindow ? pWindow->GetExtantDoc() : nullptr;
+ nsContentUtils::ReportToConsole(nsIScriptError::errorFlag,
+ NS_LITERAL_CSTRING("Media"),
+ document,
+ nsContentUtils::eDOM_PROPERTIES,
+ "MediaStreamAddTrackDifferentAudioChannel",
+ params, ArrayLength(params));
+ return;
+ }
+
+ if (HasTrack(aTrack)) {
+ LOG(LogLevel::Debug, ("DOMMediaStream %p already contains track %p", this, &aTrack));
+ return;
+ }
+
+ // Hook up the underlying track with our underlying playback stream.
+ RefPtr<MediaInputPort> inputPort =
+ GetPlaybackStream()->AllocateInputPort(aTrack.GetOwnedStream(),
+ aTrack.mTrackID);
+ RefPtr<TrackPort> trackPort =
+ new TrackPort(inputPort, &aTrack, TrackPort::InputPortOwnership::OWNED);
+ mTracks.AppendElement(trackPort.forget());
+ NotifyTrackAdded(&aTrack);
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Added track %p", this, &aTrack));
+}
+
+void
+DOMMediaStream::RemoveTrack(MediaStreamTrack& aTrack)
+{
+ LOG(LogLevel::Info, ("DOMMediaStream %p Removing track %p (from stream %p with ID %d)",
+ this, &aTrack, aTrack.mOwningStream.get(), aTrack.mTrackID));
+
+ RefPtr<TrackPort> toRemove = FindPlaybackTrackPort(aTrack);
+ if (!toRemove) {
+ LOG(LogLevel::Debug, ("DOMMediaStream %p does not contain track %p", this, &aTrack));
+ return;
+ }
+
+ DebugOnly<bool> removed = mTracks.RemoveElement(toRemove);
+ NS_ASSERTION(removed, "If there's a track port we should be able to remove it");
+
+ // If the track comes from a TRACK_ANY input port (i.e., mOwnedPort), we need
+ // to block it in the port. Doing this for a locked track is still OK as it
+ // will first block the track, then destroy the port. Both cause the track to
+ // end.
+ // If the track has already ended, it's input port might be gone, so in those
+ // cases blocking the underlying track should be avoided.
+ if (!aTrack.Ended()) {
+ BlockPlaybackTrack(toRemove);
+ NotifyTrackRemoved(&aTrack);
+ }
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Removed track %p", this, &aTrack));
+}
+
+class ClonedStreamSourceGetter :
+ public MediaStreamTrackSourceGetter
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ClonedStreamSourceGetter,
+ MediaStreamTrackSourceGetter)
+
+ explicit ClonedStreamSourceGetter(DOMMediaStream* aStream)
+ : mStream(aStream) {}
+
+ already_AddRefed<MediaStreamTrackSource>
+ GetMediaStreamTrackSource(TrackID aInputTrackID) override
+ {
+ MediaStreamTrack* sourceTrack =
+ mStream->FindOwnedDOMTrack(mStream->GetOwnedStream(), aInputTrackID);
+ MOZ_RELEASE_ASSERT(sourceTrack);
+
+ return do_AddRef(&sourceTrack->GetSource());
+ }
+
+protected:
+ virtual ~ClonedStreamSourceGetter() {}
+
+ RefPtr<DOMMediaStream> mStream;
+};
+
+NS_IMPL_ADDREF_INHERITED(ClonedStreamSourceGetter,
+ MediaStreamTrackSourceGetter)
+NS_IMPL_RELEASE_INHERITED(ClonedStreamSourceGetter,
+ MediaStreamTrackSourceGetter)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ClonedStreamSourceGetter)
+NS_INTERFACE_MAP_END_INHERITING(MediaStreamTrackSourceGetter)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(ClonedStreamSourceGetter,
+ MediaStreamTrackSourceGetter,
+ mStream)
+
+already_AddRefed<DOMMediaStream>
+DOMMediaStream::Clone()
+{
+ return CloneInternal(TrackForwardingOption::CURRENT);
+}
+
+already_AddRefed<DOMMediaStream>
+DOMMediaStream::CloneInternal(TrackForwardingOption aForwarding)
+{
+ RefPtr<DOMMediaStream> newStream =
+ new DOMMediaStream(GetParentObject(), new ClonedStreamSourceGetter(this));
+
+ LOG(LogLevel::Info, ("DOMMediaStream %p created clone %p, forwarding %s tracks",
+ this, newStream.get(),
+ aForwarding == TrackForwardingOption::ALL
+ ? "all" : "current"));
+
+ MOZ_RELEASE_ASSERT(mPlaybackStream);
+ MOZ_RELEASE_ASSERT(mPlaybackStream->Graph());
+ MediaStreamGraph* graph = mPlaybackStream->Graph();
+
+ // We initiate the owned and playback streams first, since we need to create
+ // all existing DOM tracks before we add the generic input port from
+ // mInputStream to mOwnedStream (see AllocateInputPort wrt. destination
+ // TrackID as to why).
+ newStream->InitOwnedStreamCommon(graph);
+ newStream->InitPlaybackStreamCommon(graph);
+
+ // Set up existing DOM tracks.
+ TrackID allocatedTrackID = 1;
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ MediaStreamTrack& track = *info->GetTrack();
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p forwarding external track %p to clone %p",
+ this, &track, newStream.get()));
+ RefPtr<MediaStreamTrack> trackClone =
+ newStream->CloneDOMTrack(track, allocatedTrackID++);
+ }
+
+ if (aForwarding == TrackForwardingOption::ALL) {
+ // Set up an input port from our input stream to the new DOM stream's owned
+ // stream, to allow for dynamically added tracks at the source to appear in
+ // the clone. The clone may treat mInputStream as its own mInputStream but
+ // ownership remains with us.
+ newStream->mInputStream = mInputStream;
+ if (mInputStream) {
+ // We have already set up track-locked input ports for all existing DOM
+ // tracks, so now we need to block those in the generic input port to
+ // avoid ending up with double instances of them.
+ nsTArray<TrackID> tracksToBlock;
+ for (const RefPtr<TrackPort>& info : mOwnedTracks) {
+ tracksToBlock.AppendElement(info->GetTrack()->mTrackID);
+ }
+
+ newStream->mInputStream->RegisterUser();
+ newStream->mOwnedPort =
+ newStream->mOwnedStream->AllocateInputPort(mInputStream,
+ TRACK_ANY, TRACK_ANY, 0, 0,
+ &tracksToBlock);
+ }
+ }
+
+ return newStream.forget();
+}
+
+bool
+DOMMediaStream::Active() const
+{
+ return mActive;
+}
+
+MediaStreamTrack*
+DOMMediaStream::GetTrackById(const nsAString& aId) const
+{
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ nsString id;
+ info->GetTrack()->GetId(id);
+ if (id == aId) {
+ return info->GetTrack();
+ }
+ }
+ return nullptr;
+}
+
+MediaStreamTrack*
+DOMMediaStream::GetOwnedTrackById(const nsAString& aId)
+{
+ for (const RefPtr<TrackPort>& info : mOwnedTracks) {
+ nsString id;
+ info->GetTrack()->GetId(id);
+ if (id == aId) {
+ return info->GetTrack();
+ }
+ }
+ return nullptr;
+}
+
+bool
+DOMMediaStream::HasTrack(const MediaStreamTrack& aTrack) const
+{
+ return !!FindPlaybackTrackPort(aTrack);
+}
+
+bool
+DOMMediaStream::OwnsTrack(const MediaStreamTrack& aTrack) const
+{
+ return !!FindOwnedTrackPort(aTrack);
+}
+
+bool
+DOMMediaStream::AddDirectListener(DirectMediaStreamListener* aListener)
+{
+ if (GetInputStream() && GetInputStream()->AsSourceStream()) {
+ GetInputStream()->AsSourceStream()->AddDirectListener(aListener);
+ return true; // application should ignore NotifyQueuedTrackData
+ }
+ return false;
+}
+
+void
+DOMMediaStream::RemoveDirectListener(DirectMediaStreamListener* aListener)
+{
+ if (GetInputStream() && GetInputStream()->AsSourceStream()) {
+ GetInputStream()->AsSourceStream()->RemoveDirectListener(aListener);
+ }
+}
+
+bool
+DOMMediaStream::IsFinished() const
+{
+ return !mPlaybackStream || mPlaybackStream->IsFinished();
+}
+
+void
+DOMMediaStream::SetInactiveOnFinish()
+{
+ mSetInactiveOnFinish = true;
+}
+
+void
+DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
+{
+ InitInputStreamCommon(aGraph->CreateSourceStream(), aGraph);
+ InitOwnedStreamCommon(aGraph);
+ InitPlaybackStreamCommon(aGraph);
+}
+
+void
+DOMMediaStream::InitTrackUnionStream(MediaStreamGraph* aGraph)
+{
+ InitInputStreamCommon(aGraph->CreateTrackUnionStream(), aGraph);
+ InitOwnedStreamCommon(aGraph);
+ InitPlaybackStreamCommon(aGraph);
+}
+
+void
+DOMMediaStream::InitAudioCaptureStream(nsIPrincipal* aPrincipal, MediaStreamGraph* aGraph)
+{
+ const TrackID AUDIO_TRACK = 1;
+
+ RefPtr<BasicTrackSource> audioCaptureSource =
+ new BasicTrackSource(aPrincipal, MediaSourceEnum::AudioCapture);
+
+ AudioCaptureStream* audioCaptureStream =
+ static_cast<AudioCaptureStream*>(aGraph->CreateAudioCaptureStream(AUDIO_TRACK));
+ InitInputStreamCommon(audioCaptureStream, aGraph);
+ InitOwnedStreamCommon(aGraph);
+ InitPlaybackStreamCommon(aGraph);
+ RefPtr<MediaStreamTrack> track =
+ CreateDOMTrack(AUDIO_TRACK, MediaSegment::AUDIO, audioCaptureSource);
+ AddTrackInternal(track);
+
+ audioCaptureStream->Start();
+}
+
+void
+DOMMediaStream::InitInputStreamCommon(MediaStream* aStream,
+ MediaStreamGraph* aGraph)
+{
+ MOZ_ASSERT(!mOwnedStream, "Input stream must be initialized before owned stream");
+
+ mInputStream = aStream;
+ mInputStream->RegisterUser();
+}
+
+void
+DOMMediaStream::InitOwnedStreamCommon(MediaStreamGraph* aGraph)
+{
+ MOZ_ASSERT(!mPlaybackStream, "Owned stream must be initialized before playback stream");
+
+ mOwnedStream = aGraph->CreateTrackUnionStream();
+ mOwnedStream->SetAutofinish(true);
+ mOwnedStream->RegisterUser();
+ if (mInputStream) {
+ mOwnedPort = mOwnedStream->AllocateInputPort(mInputStream);
+ }
+
+ // Setup track listeners
+ mOwnedListener = new OwnedStreamListener(this);
+ mOwnedStream->AddListener(mOwnedListener);
+}
+
+void
+DOMMediaStream::InitPlaybackStreamCommon(MediaStreamGraph* aGraph)
+{
+ mPlaybackStream = aGraph->CreateTrackUnionStream();
+ mPlaybackStream->SetAutofinish(true);
+ mPlaybackStream->RegisterUser();
+ if (mOwnedStream) {
+ mPlaybackPort = mPlaybackStream->AllocateInputPort(mOwnedStream);
+ }
+
+ mPlaybackListener = new PlaybackStreamListener(this);
+ mPlaybackStream->AddListener(mPlaybackListener);
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Initiated with mInputStream=%p, mOwnedStream=%p, mPlaybackStream=%p",
+ this, mInputStream, mOwnedStream, mPlaybackStream));
+}
+
+already_AddRefed<DOMMediaStream>
+DOMMediaStream::CreateSourceStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter)
+{
+ RefPtr<DOMMediaStream> stream = new DOMMediaStream(aWindow, aTrackSourceGetter);
+ stream->InitSourceStream(aGraph);
+ return stream.forget();
+}
+
+already_AddRefed<DOMMediaStream>
+DOMMediaStream::CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter)
+{
+ RefPtr<DOMMediaStream> stream = new DOMMediaStream(aWindow, aTrackSourceGetter);
+ stream->InitTrackUnionStream(aGraph);
+ return stream.forget();
+}
+
+already_AddRefed<DOMMediaStream>
+DOMMediaStream::CreateAudioCaptureStreamAsInput(nsPIDOMWindowInner* aWindow,
+ nsIPrincipal* aPrincipal,
+ MediaStreamGraph* aGraph)
+{
+ // Audio capture doesn't create tracks dynamically
+ MediaStreamTrackSourceGetter* getter = nullptr;
+ RefPtr<DOMMediaStream> stream = new DOMMediaStream(aWindow, getter);
+ stream->InitAudioCaptureStream(aPrincipal, aGraph);
+ return stream.forget();
+}
+
+void
+DOMMediaStream::PrincipalChanged(MediaStreamTrack* aTrack)
+{
+ MOZ_ASSERT(aTrack);
+ NS_ASSERTION(HasTrack(*aTrack), "Principal changed for an unknown track");
+ LOG(LogLevel::Info, ("DOMMediaStream %p Principal changed for track %p",
+ this, aTrack));
+ RecomputePrincipal();
+}
+
+void
+DOMMediaStream::RecomputePrincipal()
+{
+ nsCOMPtr<nsIPrincipal> previousPrincipal = mPrincipal.forget();
+ nsCOMPtr<nsIPrincipal> previousVideoPrincipal = mVideoPrincipal.forget();
+
+ if (mTracksPendingRemoval > 0) {
+ LOG(LogLevel::Info, ("DOMMediaStream %p RecomputePrincipal() Cannot "
+ "recompute stream principal with tracks pending "
+ "removal.", this));
+ return;
+ }
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Recomputing principal. "
+ "Old principal was %p.", this, previousPrincipal.get()));
+
+ // mPrincipal is recomputed based on all current tracks, and tracks that have
+ // not ended in our playback stream.
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ if (info->GetTrack()->Ended()) {
+ continue;
+ }
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Taking live track %p with "
+ "principal %p into account.", this,
+ info->GetTrack(), info->GetTrack()->GetPrincipal()));
+ nsContentUtils::CombineResourcePrincipals(&mPrincipal,
+ info->GetTrack()->GetPrincipal());
+ if (info->GetTrack()->AsVideoStreamTrack()) {
+ nsContentUtils::CombineResourcePrincipals(&mVideoPrincipal,
+ info->GetTrack()->GetPrincipal());
+ }
+ }
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p new principal is %p.",
+ this, mPrincipal.get()));
+
+ if (previousPrincipal != mPrincipal ||
+ previousVideoPrincipal != mVideoPrincipal) {
+ NotifyPrincipalChanged();
+ }
+}
+
+void
+DOMMediaStream::NotifyPrincipalChanged()
+{
+ if (!mPrincipal) {
+ // When all tracks are removed, mPrincipal will change to nullptr.
+ LOG(LogLevel::Info, ("DOMMediaStream %p Principal changed to nothing.",
+ this));
+ } else {
+ LOG(LogLevel::Info, ("DOMMediaStream %p Principal changed. Now: "
+ "null=%d, codebase=%d, expanded=%d, system=%d", this,
+ mPrincipal->GetIsNullPrincipal(),
+ mPrincipal->GetIsCodebasePrincipal(),
+ mPrincipal->GetIsExpandedPrincipal(),
+ mPrincipal->GetIsSystemPrincipal()));
+ }
+
+ for (uint32_t i = 0; i < mPrincipalChangeObservers.Length(); ++i) {
+ mPrincipalChangeObservers[i]->PrincipalChanged(this);
+ }
+}
+
+
+bool
+DOMMediaStream::AddPrincipalChangeObserver(
+ PrincipalChangeObserver<DOMMediaStream>* aObserver)
+{
+ return mPrincipalChangeObservers.AppendElement(aObserver) != nullptr;
+}
+
+bool
+DOMMediaStream::RemovePrincipalChangeObserver(
+ PrincipalChangeObserver<DOMMediaStream>* aObserver)
+{
+ return mPrincipalChangeObservers.RemoveElement(aObserver);
+}
+
+void
+DOMMediaStream::AddTrackInternal(MediaStreamTrack* aTrack)
+{
+ MOZ_ASSERT(aTrack->mOwningStream == this);
+ MOZ_ASSERT(FindOwnedDOMTrack(aTrack->GetInputStream(),
+ aTrack->mInputTrackID,
+ aTrack->mTrackID));
+ MOZ_ASSERT(!FindPlaybackDOMTrack(aTrack->GetOwnedStream(),
+ aTrack->mTrackID));
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Adding owned track %p", this, aTrack));
+
+ mTracks.AppendElement(
+ new TrackPort(mPlaybackPort, aTrack, TrackPort::InputPortOwnership::EXTERNAL));
+
+ NotifyTrackAdded(aTrack);
+
+ DispatchTrackEvent(NS_LITERAL_STRING("addtrack"), aTrack);
+}
+
+already_AddRefed<MediaStreamTrack>
+DOMMediaStream::CreateDOMTrack(TrackID aTrackID, MediaSegment::Type aType,
+ MediaStreamTrackSource* aSource,
+ const MediaTrackConstraints& aConstraints)
+{
+ MOZ_RELEASE_ASSERT(mInputStream);
+ MOZ_RELEASE_ASSERT(mOwnedStream);
+
+ MOZ_ASSERT(FindOwnedDOMTrack(GetInputStream(), aTrackID) == nullptr);
+
+ RefPtr<MediaStreamTrack> track;
+ switch (aType) {
+ case MediaSegment::AUDIO:
+ track = new AudioStreamTrack(this, aTrackID, aTrackID, aSource, aConstraints);
+ break;
+ case MediaSegment::VIDEO:
+ track = new VideoStreamTrack(this, aTrackID, aTrackID, aSource, aConstraints);
+ break;
+ default:
+ MOZ_CRASH("Unhandled track type");
+ }
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Created new track %p with ID %u",
+ this, track.get(), aTrackID));
+
+ mOwnedTracks.AppendElement(
+ new TrackPort(mOwnedPort, track, TrackPort::InputPortOwnership::EXTERNAL));
+
+ return track.forget();
+}
+
+already_AddRefed<MediaStreamTrack>
+DOMMediaStream::CloneDOMTrack(MediaStreamTrack& aTrack,
+ TrackID aCloneTrackID)
+{
+ MOZ_RELEASE_ASSERT(mOwnedStream);
+ MOZ_RELEASE_ASSERT(mPlaybackStream);
+ MOZ_RELEASE_ASSERT(IsTrackIDExplicit(aCloneTrackID));
+
+ TrackID inputTrackID = aTrack.mInputTrackID;
+ MediaStream* inputStream = aTrack.GetInputStream();
+
+ RefPtr<MediaStreamTrack> newTrack = aTrack.CloneInternal(this, aCloneTrackID);
+
+ newTrack->mOriginalTrack =
+ aTrack.mOriginalTrack ? aTrack.mOriginalTrack.get() : &aTrack;
+
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Created new track %p cloned from stream %p track %d",
+ this, newTrack.get(), inputStream, inputTrackID));
+
+ RefPtr<MediaInputPort> inputPort =
+ mOwnedStream->AllocateInputPort(inputStream, inputTrackID, aCloneTrackID);
+
+ mOwnedTracks.AppendElement(
+ new TrackPort(inputPort, newTrack, TrackPort::InputPortOwnership::OWNED));
+
+ mTracks.AppendElement(
+ new TrackPort(mPlaybackPort, newTrack, TrackPort::InputPortOwnership::EXTERNAL));
+
+ NotifyTrackAdded(newTrack);
+
+ newTrack->SetEnabled(aTrack.Enabled());
+ newTrack->SetReadyState(aTrack.ReadyState());
+
+ if (aTrack.Ended()) {
+ // For extra suspenders, make sure that we don't forward data by mistake
+ // to the clone when the original has already ended.
+ // We only block END_EXISTING to allow any pending clones to end.
+ RefPtr<Pledge<bool, nsresult>> blockingPledge =
+ inputPort->BlockSourceTrackId(inputTrackID,
+ BlockingMode::END_EXISTING);
+ Unused << blockingPledge;
+ }
+
+ return newTrack.forget();
+}
+
+static DOMMediaStream::TrackPort*
+FindTrackPortAmongTracks(const MediaStreamTrack& aTrack,
+ const nsTArray<RefPtr<DOMMediaStream::TrackPort>>& aTracks)
+{
+ for (const RefPtr<DOMMediaStream::TrackPort>& info : aTracks) {
+ if (info->GetTrack() == &aTrack) {
+ return info;
+ }
+ }
+ return nullptr;
+}
+
+MediaStreamTrack*
+DOMMediaStream::FindOwnedDOMTrack(MediaStream* aInputStream,
+ TrackID aInputTrackID,
+ TrackID aTrackID) const
+{
+ MOZ_RELEASE_ASSERT(mOwnedStream);
+
+ for (const RefPtr<TrackPort>& info : mOwnedTracks) {
+ if (info->GetInputPort() &&
+ info->GetInputPort()->GetSource() == aInputStream &&
+ info->GetTrack()->mInputTrackID == aInputTrackID &&
+ (aTrackID == TRACK_ANY || info->GetTrack()->mTrackID == aTrackID)) {
+ // This track is owned externally but in our playback stream.
+ return info->GetTrack();
+ }
+ }
+ return nullptr;
+}
+
+DOMMediaStream::TrackPort*
+DOMMediaStream::FindOwnedTrackPort(const MediaStreamTrack& aTrack) const
+{
+ return FindTrackPortAmongTracks(aTrack, mOwnedTracks);
+}
+
+
+MediaStreamTrack*
+DOMMediaStream::FindPlaybackDOMTrack(MediaStream* aInputStream, TrackID aInputTrackID) const
+{
+ if (!mPlaybackStream) {
+ // One would think we can assert mPlaybackStream here, but track clones have
+ // a dummy DOMMediaStream that doesn't have a playback stream, so we can't.
+ return nullptr;
+ }
+
+ for (const RefPtr<TrackPort>& info : mTracks) {
+ if (info->GetInputPort() == mPlaybackPort &&
+ aInputStream == mOwnedStream &&
+ info->GetTrack()->mInputTrackID == aInputTrackID) {
+ // This track is in our owned and playback streams.
+ return info->GetTrack();
+ }
+ if (info->GetInputPort() &&
+ info->GetInputPort()->GetSource() == aInputStream &&
+ info->GetSourceTrackId() == aInputTrackID) {
+ // This track is owned externally but in our playback stream.
+ MOZ_ASSERT(IsTrackIDExplicit(aInputTrackID));
+ return info->GetTrack();
+ }
+ }
+ return nullptr;
+}
+
+DOMMediaStream::TrackPort*
+DOMMediaStream::FindPlaybackTrackPort(const MediaStreamTrack& aTrack) const
+{
+ return FindTrackPortAmongTracks(aTrack, mTracks);
+}
+
+void
+DOMMediaStream::OnTracksAvailable(OnTracksAvailableCallback* aRunnable)
+{
+ if (mNotifiedOfMediaStreamGraphShutdown) {
+ // No more tracks will ever be added, so just delete the callback now.
+ delete aRunnable;
+ return;
+ }
+ mRunOnTracksAvailable.AppendElement(aRunnable);
+ CheckTracksAvailable();
+}
+
+void
+DOMMediaStream::NotifyTracksCreated()
+{
+ mTracksCreated = true;
+ CheckTracksAvailable();
+}
+
+void
+DOMMediaStream::NotifyFinished()
+{
+ if (!mSetInactiveOnFinish) {
+ return;
+ }
+
+ if (!mActive) {
+ // This can happen if the stream never became active.
+ return;
+ }
+
+ MOZ_ASSERT(!ContainsLiveTracks(mTracks));
+ mActive = false;
+ NotifyInactive();
+}
+
+void
+DOMMediaStream::NotifyActive()
+{
+ LOG(LogLevel::Info, ("DOMMediaStream %p NotifyActive(). ", this));
+
+ MOZ_ASSERT(mActive);
+ for (int32_t i = mTrackListeners.Length() - 1; i >= 0; --i) {
+ mTrackListeners[i]->NotifyActive();
+ }
+}
+
+void
+DOMMediaStream::NotifyInactive()
+{
+ LOG(LogLevel::Info, ("DOMMediaStream %p NotifyInactive(). ", this));
+
+ MOZ_ASSERT(!mActive);
+ for (int32_t i = mTrackListeners.Length() - 1; i >= 0; --i) {
+ mTrackListeners[i]->NotifyInactive();
+ }
+}
+
+void
+DOMMediaStream::CheckTracksAvailable()
+{
+ if (!mTracksCreated) {
+ return;
+ }
+ nsTArray<nsAutoPtr<OnTracksAvailableCallback> > callbacks;
+ callbacks.SwapElements(mRunOnTracksAvailable);
+
+ for (uint32_t i = 0; i < callbacks.Length(); ++i) {
+ callbacks[i]->NotifyTracksAvailable(this);
+ }
+}
+
+void
+DOMMediaStream::RegisterTrackListener(TrackListener* aListener)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (mNotifiedOfMediaStreamGraphShutdown) {
+ // No more tracks will ever be added, so just do nothing.
+ return;
+ }
+ mTrackListeners.AppendElement(aListener);
+}
+
+void
+DOMMediaStream::UnregisterTrackListener(TrackListener* aListener)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mTrackListeners.RemoveElement(aListener);
+}
+
+void
+DOMMediaStream::NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (mTracksPendingRemoval > 0) {
+ // If there are tracks pending removal we may not degrade the current
+ // principals until those tracks have been confirmed removed from the
+ // playback stream. Instead combine with the new track and the (potentially)
+ // degraded principal will be calculated when it's safe.
+ nsContentUtils::CombineResourcePrincipals(&mPrincipal,
+ aTrack->GetPrincipal());
+ LOG(LogLevel::Debug, ("DOMMediaStream %p saw a track get added. Combining "
+ "its principal %p into our while waiting for pending "
+ "tracks to be removed. New principal is %p.",
+ this, aTrack->GetPrincipal(), mPrincipal.get()));
+ if (aTrack->AsVideoStreamTrack()) {
+ nsContentUtils::CombineResourcePrincipals(&mVideoPrincipal,
+ aTrack->GetPrincipal());
+ }
+ } else {
+ LOG(LogLevel::Debug, ("DOMMediaStream %p saw a track get added. "
+ "Recomputing principal.", this));
+ RecomputePrincipal();
+ }
+
+ aTrack->AddPrincipalChangeObserver(this);
+ aTrack->AddConsumer(mPlaybackTrackListener);
+
+ for (int32_t i = mTrackListeners.Length() - 1; i >= 0; --i) {
+ mTrackListeners[i]->NotifyTrackAdded(aTrack);
+ }
+
+ if (mActive) {
+ return;
+ }
+
+ // Check if we became active.
+ if (ContainsLiveTracks(mTracks)) {
+ mActive = true;
+ NotifyActive();
+ }
+}
+
+void
+DOMMediaStream::NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ aTrack->RemoveConsumer(mPlaybackTrackListener);
+ aTrack->RemovePrincipalChangeObserver(this);
+
+ for (int32_t i = mTrackListeners.Length() - 1; i >= 0; --i) {
+ mTrackListeners[i]->NotifyTrackRemoved(aTrack);
+
+ }
+
+ // Don't call RecomputePrincipal here as the track may still exist in the
+ // playback stream in the MediaStreamGraph. It will instead be called when the
+ // track has been confirmed removed by the graph. See BlockPlaybackTrack().
+
+ if (!mActive) {
+ NS_ASSERTION(false, "Shouldn't remove a live track if already inactive");
+ return;
+ }
+
+ if (mSetInactiveOnFinish) {
+ // For compatibility with mozCaptureStream we in some cases do not go
+ // inactive until the playback stream finishes.
+ return;
+ }
+
+ // Check if we became inactive.
+ if (!ContainsLiveTracks(mTracks)) {
+ mActive = false;
+ NotifyInactive();
+ }
+}
+
+nsresult
+DOMMediaStream::DispatchTrackEvent(const nsAString& aName,
+ const RefPtr<MediaStreamTrack>& aTrack)
+{
+ MOZ_ASSERT(aName == NS_LITERAL_STRING("addtrack"),
+ "Only 'addtrack' is supported at this time");
+
+ MediaStreamTrackEventInit init;
+ init.mTrack = aTrack;
+
+ RefPtr<MediaStreamTrackEvent> event =
+ MediaStreamTrackEvent::Constructor(this, aName, init);
+
+ return DispatchTrustedEvent(event);
+}
+
+void
+DOMMediaStream::BlockPlaybackTrack(TrackPort* aTrack)
+{
+ MOZ_ASSERT(aTrack);
+ ++mTracksPendingRemoval;
+ RefPtr<Pledge<bool>> p =
+ aTrack->BlockSourceTrackId(aTrack->GetTrack()->mTrackID,
+ BlockingMode::CREATION);
+ RefPtr<DOMMediaStream> self = this;
+ p->Then([self] (const bool& aIgnore) { self->NotifyPlaybackTrackBlocked(); },
+ [] (const nsresult& aIgnore) { NS_ERROR("Could not remove track from MSG"); }
+ );
+}
+
+void
+DOMMediaStream::NotifyPlaybackTrackBlocked()
+{
+ MOZ_ASSERT(mTracksPendingRemoval > 0,
+ "A track reported finished blocking more times than we asked for");
+ if (--mTracksPendingRemoval == 0) {
+ // The MediaStreamGraph has reported a track was blocked and we are not
+ // waiting for any further tracks to get blocked. It is now safe to
+ // recompute the principal based on our main thread track set state.
+ LOG(LogLevel::Debug, ("DOMMediaStream %p saw all tracks pending removal "
+ "finish. Recomputing principal.", this));
+ RecomputePrincipal();
+ }
+}
+
+DOMLocalMediaStream::~DOMLocalMediaStream()
+{
+ if (mInputStream) {
+ // Make sure Listeners of this stream know it's going away
+ StopImpl();
+ }
+}
+
+JSObject*
+DOMLocalMediaStream::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return dom::LocalMediaStreamBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+DOMLocalMediaStream::Stop()
+{
+ LOG(LogLevel::Debug, ("DOMMediaStream %p Stop()", this));
+ nsCOMPtr<nsPIDOMWindowInner> pWindow = GetParentObject();
+ nsIDocument* document = pWindow ? pWindow->GetExtantDoc() : nullptr;
+ nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
+ NS_LITERAL_CSTRING("Media"),
+ document,
+ nsContentUtils::eDOM_PROPERTIES,
+ "MediaStreamStopDeprecatedWarning");
+
+ StopImpl();
+}
+
+void
+DOMLocalMediaStream::StopImpl()
+{
+ if (mInputStream && mInputStream->AsSourceStream()) {
+ mInputStream->AsSourceStream()->EndAllTrackAndFinish();
+ }
+}
+
+already_AddRefed<DOMLocalMediaStream>
+DOMLocalMediaStream::CreateSourceStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter)
+{
+ RefPtr<DOMLocalMediaStream> stream =
+ new DOMLocalMediaStream(aWindow, aTrackSourceGetter);
+ stream->InitSourceStream(aGraph);
+ return stream.forget();
+}
+
+already_AddRefed<DOMLocalMediaStream>
+DOMLocalMediaStream::CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter)
+{
+ RefPtr<DOMLocalMediaStream> stream =
+ new DOMLocalMediaStream(aWindow, aTrackSourceGetter);
+ stream->InitTrackUnionStream(aGraph);
+ return stream.forget();
+}
+
+DOMAudioNodeMediaStream::DOMAudioNodeMediaStream(nsPIDOMWindowInner* aWindow, AudioNode* aNode)
+ : DOMMediaStream(aWindow, nullptr),
+ mStreamNode(aNode)
+{
+}
+
+DOMAudioNodeMediaStream::~DOMAudioNodeMediaStream()
+{
+}
+
+already_AddRefed<DOMAudioNodeMediaStream>
+DOMAudioNodeMediaStream::CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWindow,
+ AudioNode* aNode,
+ MediaStreamGraph* aGraph)
+{
+ RefPtr<DOMAudioNodeMediaStream> stream = new DOMAudioNodeMediaStream(aWindow, aNode);
+ stream->InitTrackUnionStream(aGraph);
+ return stream.forget();
+}
+
+DOMHwMediaStream::DOMHwMediaStream(nsPIDOMWindowInner* aWindow)
+ : DOMLocalMediaStream(aWindow, nullptr)
+{
+#ifdef MOZ_WIDGET_GONK
+ if (!mWindow) {
+ NS_ERROR("Expected window here.");
+ mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
+ return;
+ }
+ nsIDocument* doc = mWindow->GetExtantDoc();
+ if (!doc) {
+ NS_ERROR("Expected document here.");
+ mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
+ return;
+ }
+ mPrincipalHandle = MakePrincipalHandle(doc->NodePrincipal());
+#endif
+}
+
+DOMHwMediaStream::~DOMHwMediaStream()
+{
+}
+
+already_AddRefed<DOMHwMediaStream>
+DOMHwMediaStream::CreateHwStream(nsPIDOMWindowInner* aWindow,
+ OverlayImage* aImage)
+{
+ RefPtr<DOMHwMediaStream> stream = new DOMHwMediaStream(aWindow);
+
+ MediaStreamGraph* graph =
+ MediaStreamGraph::GetInstance(MediaStreamGraph::SYSTEM_THREAD_DRIVER,
+ AudioChannel::Normal);
+ stream->InitSourceStream(graph);
+ stream->Init(stream->GetInputStream(), aImage);
+
+ return stream.forget();
+}
+
+void
+DOMHwMediaStream::Init(MediaStream* stream, OverlayImage* aImage)
+{
+ SourceMediaStream* srcStream = stream->AsSourceStream();
+
+#ifdef MOZ_WIDGET_GONK
+ if (aImage) {
+ mOverlayImage = aImage;
+ } else {
+ Data imageData;
+ imageData.mOverlayId = DEFAULT_IMAGE_ID;
+ imageData.mSize.width = DEFAULT_IMAGE_WIDTH;
+ imageData.mSize.height = DEFAULT_IMAGE_HEIGHT;
+
+ mOverlayImage = new OverlayImage();
+ mOverlayImage->SetData(imageData);
+ }
+#endif
+
+ if (srcStream) {
+ VideoSegment segment;
+#ifdef MOZ_WIDGET_GONK
+ const StreamTime delta = STREAM_TIME_MAX; // Because MediaStreamGraph will run out frames in non-autoplay mode,
+ // we must give it bigger frame length to cover this situation.
+
+ RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get());
+ mozilla::gfx::IntSize size = image->GetSize();
+
+ segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
+#endif
+ srcStream->AddTrack(TRACK_VIDEO_PRIMARY, 0, new VideoSegment());
+ srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment);
+ srcStream->AdvanceKnownTracksTime(STREAM_TIME_MAX);
+ }
+}
+
+int32_t
+DOMHwMediaStream::RequestOverlayId()
+{
+#ifdef MOZ_WIDGET_GONK
+ return mOverlayImage->GetOverlayId();
+#else
+ return -1;
+#endif
+}
+
+void
+DOMHwMediaStream::SetImageSize(uint32_t width, uint32_t height)
+{
+#ifdef MOZ_WIDGET_GONK
+ if (mOverlayImage->GetSidebandStream().IsValid()) {
+ OverlayImage::SidebandStreamData imgData;
+ imgData.mStream = mOverlayImage->GetSidebandStream();
+ imgData.mSize = IntSize(width, height);
+ mOverlayImage->SetData(imgData);
+ } else {
+ OverlayImage::Data imgData;
+ imgData.mOverlayId = mOverlayImage->GetOverlayId();
+ imgData.mSize = IntSize(width, height);
+ mOverlayImage->SetData(imgData);
+ }
+#endif
+
+ SourceMediaStream* srcStream = GetInputStream()->AsSourceStream();
+ StreamTracks::Track* track = srcStream->FindTrack(TRACK_VIDEO_PRIMARY);
+
+ if (!track || !track->GetSegment()) {
+ return;
+ }
+
+#ifdef MOZ_WIDGET_GONK
+ // Clear the old segment.
+ // Changing the existing content of segment is a Very BAD thing, and this way will
+ // confuse consumers of MediaStreams.
+ // It is only acceptable for DOMHwMediaStream
+ // because DOMHwMediaStream doesn't have consumers of TV streams currently.
+ track->GetSegment()->Clear();
+
+ // Change the image size.
+ const StreamTime delta = STREAM_TIME_MAX;
+ RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get());
+ mozilla::gfx::IntSize size = image->GetSize();
+ VideoSegment segment;
+
+ segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
+ srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment);
+#endif
+}
+
+void
+DOMHwMediaStream::SetOverlayImage(OverlayImage* aImage)
+{
+ if (!aImage) {
+ return;
+ }
+#ifdef MOZ_WIDGET_GONK
+ mOverlayImage = aImage;
+#endif
+
+ SourceMediaStream* srcStream = GetInputStream()->AsSourceStream();
+ StreamTracks::Track* track = srcStream->FindTrack(TRACK_VIDEO_PRIMARY);
+
+ if (!track || !track->GetSegment()) {
+ return;
+ }
+
+#ifdef MOZ_WIDGET_GONK
+ // Clear the old segment.
+ // Changing the existing content of segment is a Very BAD thing, and this way will
+ // confuse consumers of MediaStreams.
+ // It is only acceptable for DOMHwMediaStream
+ // because DOMHwMediaStream doesn't have consumers of TV streams currently.
+ track->GetSegment()->Clear();
+
+ // Change the image size.
+ const StreamTime delta = STREAM_TIME_MAX;
+ RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get());
+ mozilla::gfx::IntSize size = image->GetSize();
+ VideoSegment segment;
+
+ segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
+ srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment);
+#endif
+}
+
+void
+DOMHwMediaStream::SetOverlayId(int32_t aOverlayId)
+{
+#ifdef MOZ_WIDGET_GONK
+ OverlayImage::Data imgData;
+
+ imgData.mOverlayId = aOverlayId;
+ imgData.mSize = mOverlayImage->GetSize();
+
+ mOverlayImage->SetData(imgData);
+#endif
+}
diff --git a/dom/media/DOMMediaStream.h b/dom/media/DOMMediaStream.h
new file mode 100644
index 000000000..12f3529a8
--- /dev/null
+++ b/dom/media/DOMMediaStream.h
@@ -0,0 +1,868 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef NSDOMMEDIASTREAM_H_
+#define NSDOMMEDIASTREAM_H_
+
+#include "ImageContainer.h"
+
+#include "nsAutoPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "StreamTracks.h"
+#include "nsIDOMWindow.h"
+#include "nsIPrincipal.h"
+#include "MediaTrackConstraints.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "PrincipalChangeObserver.h"
+
+// X11 has a #define for CurrentTime. Unbelievable :-(.
+// See dom/media/webaudio/AudioContext.h for more fun!
+#ifdef CurrentTime
+#undef CurrentTime
+#endif
+
+namespace mozilla {
+
+class DOMHwMediaStream;
+class DOMLocalMediaStream;
+class DOMMediaStream;
+class MediaStream;
+class MediaInputPort;
+class DirectMediaStreamListener;
+class MediaStreamGraph;
+class ProcessedMediaStream;
+
+enum class BlockingMode;
+
+namespace dom {
+class AudioNode;
+class HTMLCanvasElement;
+class MediaStreamTrack;
+class MediaStreamTrackSource;
+class AudioStreamTrack;
+class VideoStreamTrack;
+class AudioTrack;
+class VideoTrack;
+class AudioTrackList;
+class VideoTrackList;
+class MediaTrackListListener;
+} // namespace dom
+
+namespace layers {
+class ImageContainer;
+class OverlayImage;
+} // namespace layers
+
+namespace media {
+template<typename V, typename E> class Pledge;
+} // namespace media
+
+#define NS_DOMMEDIASTREAM_IID \
+{ 0x8cb65468, 0x66c0, 0x444e, \
+ { 0x89, 0x9f, 0x89, 0x1d, 0x9e, 0xd2, 0xbe, 0x7c } }
+
+class OnTracksAvailableCallback {
+public:
+ virtual ~OnTracksAvailableCallback() {}
+ virtual void NotifyTracksAvailable(DOMMediaStream* aStream) = 0;
+};
+
+/**
+ * Interface through which a DOMMediaStream can query its producer for a
+ * MediaStreamTrackSource. This will be used whenever a track occurs in the
+ * DOMMediaStream's owned stream that has not yet been created on the main
+ * thread (see DOMMediaStream::CreateOwnDOMTrack).
+ */
+class MediaStreamTrackSourceGetter : public nsISupports
+{
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(MediaStreamTrackSourceGetter)
+
+public:
+ MediaStreamTrackSourceGetter()
+ {
+ MOZ_COUNT_CTOR(MediaStreamTrackSourceGetter);
+ }
+
+ virtual already_AddRefed<dom::MediaStreamTrackSource>
+ GetMediaStreamTrackSource(TrackID aInputTrackID) = 0;
+
+protected:
+ virtual ~MediaStreamTrackSourceGetter()
+ {
+ MOZ_COUNT_DTOR(MediaStreamTrackSourceGetter);
+ }
+};
+
+/**
+ * DOM wrapper for MediaStreams.
+ *
+ * To account for track operations such as clone(), addTrack() and
+ * removeTrack(), a DOMMediaStream wraps three internal (and chained)
+ * MediaStreams:
+ * 1. mInputStream
+ * - Controlled by the owner/source of the DOMMediaStream.
+ * It's a stream of the type indicated by
+ * - DOMMediaStream::CreateSourceStream/CreateTrackUnionStream. A source
+ * typically creates its DOMMediaStream, creates the MediaStreamTracks
+ * owned by said stream, then gets the internal input stream to which it
+ * feeds data for the previously created tracks.
+ * - When necessary it can create tracks on the internal stream only and
+ * their corresponding MediaStreamTracks will be asynchronously created.
+ * 2. mOwnedStream
+ * - A TrackUnionStream containing tracks owned by this stream.
+ * - The internal model of a MediaStreamTrack consists of its owning
+ * DOMMediaStream and the TrackID of the corresponding internal track in
+ * the owning DOMMediaStream's mOwnedStream.
+ * - The owned stream is different from the input stream since a cloned
+ * DOMMediaStream is also the owner of its (cloned) MediaStreamTracks.
+ * - Stopping an original track shall not stop its clone. This is
+ * solved by stopping it at the owned stream, while the clone's owned
+ * stream gets data directly from the original input stream.
+ * - A DOMMediaStream (original or clone) gets all tracks dynamically
+ * added by the source automatically forwarded by having a TRACK_ANY
+ * MediaInputPort set up from the owning DOMMediaStream's input stream
+ * to this DOMMediaStream's owned stream.
+ * 3. mPlaybackStream
+ * - A TrackUnionStream containing the tracks corresponding to the
+ * MediaStreamTracks currently in this DOMMediaStream (per getTracks()).
+ * - Similarly as for mOwnedStream, there's a TRACK_ANY MediaInputPort set
+ * up from the owned stream to the playback stream to allow tracks
+ * dynamically added by the source to be automatically forwarded to any
+ * audio or video sinks.
+ * - MediaStreamTracks added by addTrack() are set up with a MediaInputPort
+ * locked to their internal TrackID, from their owning DOMMediaStream's
+ * owned stream to this playback stream.
+ *
+ *
+ * A graphical representation of how tracks are connected in various cases as
+ * follows:
+ *
+ * addTrack()ed case:
+ * DOMStream A
+ * Input Owned Playback
+ * t1 ---------> t1 ------------> t1 <- MediaStreamTrack X
+ * (pointing to t1 in A)
+ * --------> t2 <- MediaStreamTrack Y
+ * / (pointing to t1 in B)
+ * DOMStream B /
+ * Input Owned / Playback
+ * t1 ---------> t1 ------------> t1 <- MediaStreamTrack Y
+ * (pointing to t1 in B)
+ *
+ * removeTrack()ed case:
+ * DOMStream A
+ * Input Owned Playback
+ * t1 ---------> t1 <- No tracks
+ *
+ *
+ * clone()d case:
+ * DOMStream A
+ * Input Owned Playback
+ * t1 ---------> t1 ------------> t1 <- MediaStreamTrack X
+ * \ (pointing to t1 in A)
+ * -----
+ * DOMStream B \
+ * Input \ Owned Playback
+ * -> t1 ------------> t1 <- MediaStreamTrack Y
+ * (pointing to t1 in B)
+ *
+ *
+ * addTrack()ed, removeTrack()ed and clone()d case:
+ *
+ * Here we have done the following:
+ * var A = someStreamWithTwoTracks;
+ * var B = someStreamWithOneTrack;
+ * var X = A.getTracks()[0];
+ * var Y = A.getTracks()[1];
+ * var Z = B.getTracks()[0];
+ * A.addTrack(Z);
+ * A.removeTrack(X);
+ * B.removeTrack(Z);
+ * var A' = A.clone();
+ *
+ * DOMStream A
+ * Input Owned Playback
+ * t1 ---------> t1 <- MediaStreamTrack X (removed)
+ * (pointing to t1 in A)
+ * t2 ---------> t2 ------------> t2 <- MediaStreamTrack Y
+ * \ (pointing to t2 in A)
+ * \ ------> t3 <- MediaStreamTrack Z
+ * \ / (pointing to t1 in B)
+ * DOMStream B \ /
+ * Input \ Owned / Playback
+ * t1 ---^-----> t1 --- <- MediaStreamTrack Z (removed)
+ * \ \ (pointing to t1 in B)
+ * \ \
+ * DOMStream A' \ \
+ * Input \ \ Owned Playback
+ * \ -> t1 ------------> t1 <- MediaStreamTrack Y'
+ * \ (pointing to t1 in A')
+ * ----> t2 ------------> t2 <- MediaStreamTrack Z'
+ * (pointing to t2 in A')
+ */
+class DOMMediaStream : public DOMEventTargetHelper,
+ public dom::PrincipalChangeObserver<dom::MediaStreamTrack>
+{
+ friend class DOMLocalMediaStream;
+ friend class dom::MediaStreamTrack;
+ typedef dom::MediaStreamTrack MediaStreamTrack;
+ typedef dom::AudioStreamTrack AudioStreamTrack;
+ typedef dom::VideoStreamTrack VideoStreamTrack;
+ typedef dom::MediaStreamTrackSource MediaStreamTrackSource;
+ typedef dom::AudioTrack AudioTrack;
+ typedef dom::VideoTrack VideoTrack;
+ typedef dom::AudioTrackList AudioTrackList;
+ typedef dom::VideoTrackList VideoTrackList;
+
+public:
+ typedef dom::MediaTrackConstraints MediaTrackConstraints;
+
+ class TrackListener {
+ public:
+ virtual ~TrackListener() {}
+
+ /**
+ * Called when the DOMMediaStream has a live track added, either by
+ * script (addTrack()) or the source creating one.
+ */
+ virtual void
+ NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack) {};
+
+ /**
+ * Called when the DOMMediaStream removes a live track from playback, either
+ * by script (removeTrack(), track.stop()) or the source ending it.
+ */
+ virtual void
+ NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack) {};
+
+ /**
+ * Called when the DOMMediaStream has become active.
+ */
+ virtual void
+ NotifyActive() {};
+
+ /**
+ * Called when the DOMMediaStream has become inactive.
+ */
+ virtual void
+ NotifyInactive() {};
+ };
+
+ /**
+ * TrackPort is a representation of a MediaStreamTrack-MediaInputPort pair
+ * that make up a link between the Owned stream and the Playback stream.
+ *
+ * Semantically, the track is the identifier/key and the port the value of this
+ * connection.
+ *
+ * The input port can be shared between several TrackPorts. This is the case
+ * for DOMMediaStream's mPlaybackPort which forwards all tracks in its
+ * mOwnedStream automatically.
+ *
+ * If the MediaStreamTrack is owned by another DOMMediaStream (called A) than
+ * the one owning the TrackPort (called B), the input port (locked to the
+ * MediaStreamTrack's TrackID) connects A's mOwnedStream to B's mPlaybackStream.
+ *
+ * A TrackPort may never leave the DOMMediaStream it was created in. Internal
+ * use only.
+ */
+ class TrackPort
+ {
+ public:
+ NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(TrackPort)
+ NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(TrackPort)
+
+ /**
+ * Indicates MediaInputPort ownership to the TrackPort.
+ *
+ * OWNED - Owned by the TrackPort itself. TrackPort must destroy the
+ * input port when it's destructed.
+ * EXTERNAL - Owned by another entity. It's the caller's responsibility to
+ * ensure the the MediaInputPort outlives the TrackPort.
+ */
+ enum class InputPortOwnership {
+ OWNED = 1,
+ EXTERNAL
+ };
+
+ TrackPort(MediaInputPort* aInputPort,
+ MediaStreamTrack* aTrack,
+ const InputPortOwnership aOwnership);
+
+ protected:
+ virtual ~TrackPort();
+
+ public:
+ void DestroyInputPort();
+
+ /**
+ * Returns the source stream of the input port.
+ */
+ MediaStream* GetSource() const;
+
+ /**
+ * Returns the track ID this track is locked to in the source stream of the
+ * input port.
+ */
+ TrackID GetSourceTrackId() const;
+
+ MediaInputPort* GetInputPort() const { return mInputPort; }
+ MediaStreamTrack* GetTrack() const { return mTrack; }
+
+ /**
+ * Blocks aTrackId from going into mInputPort unless the port has been
+ * destroyed. Returns a pledge that gets resolved when the MediaStreamGraph
+ * has applied the block in the playback stream.
+ */
+ already_AddRefed<media::Pledge<bool, nsresult>>
+ BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode);
+
+ private:
+ RefPtr<MediaInputPort> mInputPort;
+ RefPtr<MediaStreamTrack> mTrack;
+
+ // Defines if we've been given ownership of the input port or if it's owned
+ // externally. The owner is responsible for destroying the port.
+ const InputPortOwnership mOwnership;
+ };
+
+ DOMMediaStream(nsPIDOMWindowInner* aWindow,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper)
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DOMMediaStream,
+ DOMEventTargetHelper)
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_DOMMEDIASTREAM_IID)
+
+ nsPIDOMWindowInner* GetParentObject() const
+ {
+ return mWindow;
+ }
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // WebIDL
+
+ static already_AddRefed<DOMMediaStream>
+ Constructor(const dom::GlobalObject& aGlobal,
+ ErrorResult& aRv);
+
+ static already_AddRefed<DOMMediaStream>
+ Constructor(const dom::GlobalObject& aGlobal,
+ const DOMMediaStream& aStream,
+ ErrorResult& aRv);
+
+ static already_AddRefed<DOMMediaStream>
+ Constructor(const dom::GlobalObject& aGlobal,
+ const dom::Sequence<OwningNonNull<MediaStreamTrack>>& aTracks,
+ ErrorResult& aRv);
+
+ double CurrentTime();
+
+ void GetId(nsAString& aID) const;
+
+ void GetAudioTracks(nsTArray<RefPtr<AudioStreamTrack> >& aTracks) const;
+ void GetVideoTracks(nsTArray<RefPtr<VideoStreamTrack> >& aTracks) const;
+ void GetTracks(nsTArray<RefPtr<MediaStreamTrack> >& aTracks) const;
+ MediaStreamTrack* GetTrackById(const nsAString& aId) const;
+ void AddTrack(MediaStreamTrack& aTrack);
+ void RemoveTrack(MediaStreamTrack& aTrack);
+
+ /** Identical to CloneInternal(TrackForwardingOption::EXPLICIT) */
+ already_AddRefed<DOMMediaStream> Clone();
+
+ bool Active() const;
+
+ IMPL_EVENT_HANDLER(addtrack)
+
+ // NON-WebIDL
+
+ /**
+ * Option to provide to CloneInternal() of which tracks should be forwarded
+ * from the source stream (`this`) to the returned stream clone.
+ *
+ * CURRENT forwards the tracks currently in the source stream's track set.
+ * ALL forwards like EXPLICIT plus any and all future tracks originating
+ * from the same input stream as the source DOMMediaStream (`this`).
+ */
+ enum class TrackForwardingOption {
+ CURRENT,
+ ALL
+ };
+ already_AddRefed<DOMMediaStream> CloneInternal(TrackForwardingOption aForwarding);
+
+ MediaStreamTrack* GetOwnedTrackById(const nsAString& aId);
+
+ /**
+ * Returns true if this DOMMediaStream has aTrack in its mPlaybackStream.
+ */
+ bool HasTrack(const MediaStreamTrack& aTrack) const;
+
+ /**
+ * Returns true if this DOMMediaStream owns aTrack.
+ */
+ bool OwnsTrack(const MediaStreamTrack& aTrack) const;
+
+ /**
+ * Returns the corresponding MediaStreamTrack if it's in our mOwnedStream.
+ * aInputTrackID should match the track's TrackID in its input stream,
+ * and aTrackID the TrackID in mOwnedStream.
+ *
+ * When aTrackID is not supplied or set to TRACK_ANY, we return the first
+ * MediaStreamTrack that matches the given input track. Note that there may
+ * be multiple MediaStreamTracks matching the same input track, but that they
+ * in that case all share the same MediaStreamTrackSource.
+ */
+ MediaStreamTrack* FindOwnedDOMTrack(MediaStream* aInputStream,
+ TrackID aInputTrackID,
+ TrackID aTrackID = TRACK_ANY) const;
+
+ /**
+ * Returns the TrackPort connecting aTrack's input stream to mOwnedStream,
+ * or nullptr if aTrack is not owned by this DOMMediaStream.
+ */
+ TrackPort* FindOwnedTrackPort(const MediaStreamTrack& aTrack) const;
+
+ /**
+ * Returns the corresponding MediaStreamTrack if it's in our mPlaybackStream.
+ * aInputTrackID should match the track's TrackID in its owned stream.
+ */
+ MediaStreamTrack* FindPlaybackDOMTrack(MediaStream* aInputStream,
+ TrackID aInputTrackID) const;
+
+ /**
+ * Returns the TrackPort connecting mOwnedStream to mPlaybackStream for aTrack.
+ */
+ TrackPort* FindPlaybackTrackPort(const MediaStreamTrack& aTrack) const;
+
+ MediaStream* GetInputStream() const { return mInputStream; }
+ ProcessedMediaStream* GetOwnedStream() const { return mOwnedStream; }
+ ProcessedMediaStream* GetPlaybackStream() const { return mPlaybackStream; }
+
+ /**
+ * Allows a video element to identify this stream as a camera stream, which
+ * needs special treatment.
+ */
+ virtual MediaStream* GetCameraStream() const { return nullptr; }
+
+ /**
+ * Allows users to get access to media data without going through graph
+ * queuing. Returns a bool to let us know if direct data will be delivered.
+ */
+ bool AddDirectListener(DirectMediaStreamListener *aListener);
+ void RemoveDirectListener(DirectMediaStreamListener *aListener);
+
+ virtual DOMLocalMediaStream* AsDOMLocalMediaStream() { return nullptr; }
+ virtual DOMHwMediaStream* AsDOMHwMediaStream() { return nullptr; }
+
+ /**
+ * Legacy method that returns true when the playback stream has finished.
+ */
+ bool IsFinished() const;
+
+ /**
+ * Becomes inactive only when the playback stream has finished.
+ */
+ void SetInactiveOnFinish();
+
+ /**
+ * Returns a principal indicating who may access this stream. The stream contents
+ * can only be accessed by principals subsuming this principal.
+ */
+ nsIPrincipal* GetPrincipal() { return mPrincipal; }
+
+ /**
+ * Returns a principal indicating who may access video data of this stream.
+ * The video principal will be a combination of all live video tracks.
+ */
+ nsIPrincipal* GetVideoPrincipal() { return mVideoPrincipal; }
+
+ // From PrincipalChangeObserver<MediaStreamTrack>.
+ void PrincipalChanged(MediaStreamTrack* aTrack) override;
+
+ /**
+ * Add a PrincipalChangeObserver to this stream.
+ *
+ * Returns true if it was successfully added.
+ *
+ * Ownership of the PrincipalChangeObserver remains with the caller, and it's
+ * the caller's responsibility to remove the observer before it dies.
+ */
+ bool AddPrincipalChangeObserver(dom::PrincipalChangeObserver<DOMMediaStream>* aObserver);
+
+ /**
+ * Remove an added PrincipalChangeObserver from this stream.
+ *
+ * Returns true if it was successfully removed.
+ */
+ bool RemovePrincipalChangeObserver(dom::PrincipalChangeObserver<DOMMediaStream>* aObserver);
+
+ // Webrtc allows the remote side to name a stream whatever it wants, and we
+ // need to surface this to content.
+ void AssignId(const nsAString& aID) { mID = aID; }
+
+ /**
+ * Create a DOMMediaStream whose underlying input stream is a SourceMediaStream.
+ */
+ static already_AddRefed<DOMMediaStream> CreateSourceStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter = nullptr);
+
+ /**
+ * Create a DOMMediaStream whose underlying input stream is a TrackUnionStream.
+ */
+ static already_AddRefed<DOMMediaStream> CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter = nullptr);
+
+ /**
+ * Create an DOMMediaStream whose underlying input stream is an
+ * AudioCaptureStream.
+ */
+ static already_AddRefed<DOMMediaStream>
+ CreateAudioCaptureStreamAsInput(nsPIDOMWindowInner* aWindow,
+ nsIPrincipal* aPrincipal,
+ MediaStreamGraph* aGraph);
+
+ void SetLogicalStreamStartTime(StreamTime aTime)
+ {
+ mLogicalStreamStartTime = aTime;
+ }
+
+ /**
+ * Adds a MediaStreamTrack to mTracks and raises "addtrack".
+ *
+ * Note that "addtrack" is raised synchronously and only has an effect if
+ * this MediaStream is already exposed to script. For spec compliance this is
+ * to be called from an async task.
+ */
+ void AddTrackInternal(MediaStreamTrack* aTrack);
+
+ /**
+ * Called for each track in our owned stream to indicate to JS that we
+ * are carrying that track.
+ *
+ * Pre-creates a MediaStreamTrack and returns it.
+ * It is up to the caller to make sure it is added through AddTrackInternal.
+ */
+ already_AddRefed<MediaStreamTrack> CreateDOMTrack(TrackID aTrackID,
+ MediaSegment::Type aType,
+ MediaStreamTrackSource* aSource,
+ const MediaTrackConstraints& aConstraints = MediaTrackConstraints());
+
+ /**
+ * Creates a MediaStreamTrack cloned from aTrack, adds it to mTracks and
+ * returns it.
+ * aCloneTrackID is the TrackID the new track will get in mOwnedStream.
+ */
+ already_AddRefed<MediaStreamTrack> CloneDOMTrack(MediaStreamTrack& aTrack,
+ TrackID aCloneTrackID);
+
+ // When the initial set of tracks has been added, run
+ // aCallback->NotifyTracksAvailable.
+ // It is allowed to do anything, including run script.
+ // aCallback may run immediately during this call if tracks are already
+ // available!
+ // We only care about track additions, we'll fire the notification even if
+ // some of the tracks have been removed.
+ // Takes ownership of aCallback.
+ void OnTracksAvailable(OnTracksAvailableCallback* aCallback);
+
+ /**
+ * Add an nsISupports object that this stream will keep alive as long as
+ * the stream itself is alive.
+ */
+ void AddConsumerToKeepAlive(nsISupports* aConsumer)
+ {
+ mConsumersToKeepAlive.AppendElement(aConsumer);
+ }
+
+ // Registers a track listener to this MediaStream, for listening to changes
+ // to our track set. The caller must call UnregisterTrackListener before
+ // being destroyed, so we don't hold on to a dead pointer. Main thread only.
+ void RegisterTrackListener(TrackListener* aListener);
+
+ // Unregisters a track listener from this MediaStream. The caller must call
+ // UnregisterTrackListener before being destroyed, so we don't hold on to
+ // a dead pointer. Main thread only.
+ void UnregisterTrackListener(TrackListener* aListener);
+
+protected:
+ virtual ~DOMMediaStream();
+
+ void Destroy();
+ void InitSourceStream(MediaStreamGraph* aGraph);
+ void InitTrackUnionStream(MediaStreamGraph* aGraph);
+ void InitAudioCaptureStream(nsIPrincipal* aPrincipal, MediaStreamGraph* aGraph);
+
+ // Sets up aStream as mInputStream. A producer may append data to a
+ // SourceMediaStream input stream, or connect another stream to a
+ // TrackUnionStream input stream.
+ void InitInputStreamCommon(MediaStream* aStream, MediaStreamGraph* aGraph);
+
+ // Sets up a new TrackUnionStream as mOwnedStream and connects it to
+ // mInputStream with a TRACK_ANY MediaInputPort if available.
+ // If this DOMMediaStream should have an input stream (producing data),
+ // it has to be initiated before the owned stream.
+ void InitOwnedStreamCommon(MediaStreamGraph* aGraph);
+
+ // Sets up a new TrackUnionStream as mPlaybackStream and connects it to
+ // mOwnedStream with a TRACK_ANY MediaInputPort if available.
+ // If this DOMMediaStream should have an owned stream (producer or clone),
+ // it has to be initiated before the playback stream.
+ void InitPlaybackStreamCommon(MediaStreamGraph* aGraph);
+
+ void CheckTracksAvailable();
+
+ // Called when MediaStreamGraph has finished an iteration where tracks were
+ // created.
+ void NotifyTracksCreated();
+
+ // Called when our playback stream has finished in the MediaStreamGraph.
+ void NotifyFinished();
+
+ // Dispatches NotifyActive() to all registered track listeners.
+ void NotifyActive();
+
+ // Dispatches NotifyInactive() to all registered track listeners.
+ void NotifyInactive();
+
+ // Dispatches NotifyTrackAdded() to all registered track listeners.
+ void NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack);
+
+ // Dispatches NotifyTrackRemoved() to all registered track listeners.
+ void NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack);
+
+ // Dispatches "addtrack" or "removetrack".
+ nsresult DispatchTrackEvent(const nsAString& aName,
+ const RefPtr<MediaStreamTrack>& aTrack);
+
+ class OwnedStreamListener;
+ friend class OwnedStreamListener;
+
+ class PlaybackStreamListener;
+ friend class PlaybackStreamListener;
+
+ class PlaybackTrackListener;
+ friend class PlaybackTrackListener;
+
+ /**
+ * Block a track in our playback stream. Calls NotifyPlaybackTrackBlocked()
+ * after the MediaStreamGraph has applied the block and the track is no longer
+ * live.
+ */
+ void BlockPlaybackTrack(TrackPort* aTrack);
+
+ /**
+ * Called on main thread after MediaStreamGraph has applied a track block in
+ * our playback stream.
+ */
+ void NotifyPlaybackTrackBlocked();
+
+ // Recomputes the current principal of this stream based on the set of tracks
+ // it currently contains. PrincipalChangeObservers will be notified only if
+ // the principal changes.
+ void RecomputePrincipal();
+
+ // StreamTime at which the currentTime attribute would return 0.
+ StreamTime mLogicalStreamStartTime;
+
+ // We need this to track our parent object.
+ nsCOMPtr<nsPIDOMWindowInner> mWindow;
+
+ // MediaStreams are owned by the graph, but we tell them when to die,
+ // and they won't die until we let them.
+
+ // This stream contains tracks used as input by us. Cloning happens from this
+ // stream. Tracks may exist in these stream but not in |mOwnedStream| if they
+ // have been stopped.
+ MediaStream* mInputStream;
+
+ // This stream contains tracks owned by us (if we were created directly from
+ // source, or cloned from some other stream). Tracks map to |mOwnedTracks|.
+ ProcessedMediaStream* mOwnedStream;
+
+ // This stream contains tracks currently played by us, despite of owner.
+ // Tracks map to |mTracks|.
+ ProcessedMediaStream* mPlaybackStream;
+
+ // This port connects mInputStream to mOwnedStream. All tracks forwarded.
+ RefPtr<MediaInputPort> mOwnedPort;
+
+ // This port connects mOwnedStream to mPlaybackStream. All tracks not
+ // explicitly blocked due to removal are forwarded.
+ RefPtr<MediaInputPort> mPlaybackPort;
+
+ // MediaStreamTracks corresponding to tracks in our mOwnedStream.
+ AutoTArray<RefPtr<TrackPort>, 2> mOwnedTracks;
+
+ // MediaStreamTracks corresponding to tracks in our mPlaybackStream.
+ AutoTArray<RefPtr<TrackPort>, 2> mTracks;
+
+ // Number of MediaStreamTracks that have been removed on main thread but are
+ // waiting to be removed on MediaStreamGraph thread.
+ size_t mTracksPendingRemoval;
+
+ // The interface through which we can query the stream producer for
+ // track sources.
+ RefPtr<MediaStreamTrackSourceGetter> mTrackSourceGetter;
+
+ // Listener tracking changes to mOwnedStream. We use this to notify the
+ // MediaStreamTracks we own about state changes.
+ RefPtr<OwnedStreamListener> mOwnedListener;
+
+ // Listener tracking changes to mPlaybackStream. This drives state changes
+ // in this DOMMediaStream and notifications to mTrackListeners.
+ RefPtr<PlaybackStreamListener> mPlaybackListener;
+
+ // Listener tracking when live MediaStreamTracks in mTracks end.
+ RefPtr<PlaybackTrackListener> mPlaybackTrackListener;
+
+ nsTArray<nsAutoPtr<OnTracksAvailableCallback> > mRunOnTracksAvailable;
+
+ // Set to true after MediaStreamGraph has created tracks for mPlaybackStream.
+ bool mTracksCreated;
+
+ nsString mID;
+
+ // Keep these alive while the stream is alive.
+ nsTArray<nsCOMPtr<nsISupports>> mConsumersToKeepAlive;
+
+ bool mNotifiedOfMediaStreamGraphShutdown;
+
+ // The track listeners subscribe to changes in this stream's track set.
+ nsTArray<TrackListener*> mTrackListeners;
+
+ // True if this stream has live tracks.
+ bool mActive;
+
+ // True if this stream only sets mActive to false when its playback stream
+ // finishes. This is a hack to maintain legacy functionality for playing a
+ // HTMLMediaElement::MozCaptureStream(). See bug 1302379.
+ bool mSetInactiveOnFinish;
+
+private:
+ void NotifyPrincipalChanged();
+ // Principal identifying who may access the collected contents of this stream.
+ // If null, this stream can be used by anyone because it has no content yet.
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ // Video principal is used by video element as access is requested to its
+ // image data.
+ nsCOMPtr<nsIPrincipal> mVideoPrincipal;
+ nsTArray<dom::PrincipalChangeObserver<DOMMediaStream>*> mPrincipalChangeObservers;
+ CORSMode mCORSMode;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(DOMMediaStream,
+ NS_DOMMEDIASTREAM_IID)
+
+#define NS_DOMLOCALMEDIASTREAM_IID \
+{ 0xb1437260, 0xec61, 0x4dfa, \
+ { 0x92, 0x54, 0x04, 0x44, 0xe2, 0xb5, 0x94, 0x9c } }
+
+class DOMLocalMediaStream : public DOMMediaStream
+{
+public:
+ explicit DOMLocalMediaStream(nsPIDOMWindowInner* aWindow,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter)
+ : DOMMediaStream(aWindow, aTrackSourceGetter) {}
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_DOMLOCALMEDIASTREAM_IID)
+
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void Stop();
+
+ /**
+ * Create an nsDOMLocalMediaStream whose underlying stream is a SourceMediaStream.
+ */
+ static already_AddRefed<DOMLocalMediaStream>
+ CreateSourceStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter = nullptr);
+
+ /**
+ * Create an nsDOMLocalMediaStream whose underlying stream is a TrackUnionStream.
+ */
+ static already_AddRefed<DOMLocalMediaStream>
+ CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWindow,
+ MediaStreamGraph* aGraph,
+ MediaStreamTrackSourceGetter* aTrackSourceGetter = nullptr);
+
+protected:
+ virtual ~DOMLocalMediaStream();
+
+ void StopImpl();
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(DOMLocalMediaStream,
+ NS_DOMLOCALMEDIASTREAM_IID)
+
+class DOMAudioNodeMediaStream : public DOMMediaStream
+{
+ typedef dom::AudioNode AudioNode;
+public:
+ DOMAudioNodeMediaStream(nsPIDOMWindowInner* aWindow, AudioNode* aNode);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
+
+ /**
+ * Create a DOMAudioNodeMediaStream whose underlying stream is a TrackUnionStream.
+ */
+ static already_AddRefed<DOMAudioNodeMediaStream>
+ CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWindow,
+ AudioNode* aNode,
+ MediaStreamGraph* aGraph);
+
+protected:
+ ~DOMAudioNodeMediaStream();
+
+private:
+ // If this object wraps a stream owned by an AudioNode, we need to ensure that
+ // the node isn't cycle-collected too early.
+ RefPtr<AudioNode> mStreamNode;
+};
+
+class DOMHwMediaStream : public DOMLocalMediaStream
+{
+ typedef mozilla::gfx::IntSize IntSize;
+ typedef layers::OverlayImage OverlayImage;
+#ifdef MOZ_WIDGET_GONK
+ typedef layers::OverlayImage::Data Data;
+#endif
+
+public:
+ explicit DOMHwMediaStream(nsPIDOMWindowInner* aWindow);
+
+ static already_AddRefed<DOMHwMediaStream> CreateHwStream(nsPIDOMWindowInner* aWindow,
+ OverlayImage* aImage = nullptr);
+ virtual DOMHwMediaStream* AsDOMHwMediaStream() override { return this; }
+ int32_t RequestOverlayId();
+ void SetOverlayId(int32_t aOverlayId);
+ void SetImageSize(uint32_t width, uint32_t height);
+ void SetOverlayImage(OverlayImage* aImage);
+
+protected:
+ ~DOMHwMediaStream();
+
+private:
+ void Init(MediaStream* aStream, OverlayImage* aImage);
+
+#ifdef MOZ_WIDGET_GONK
+ const int DEFAULT_IMAGE_ID = 0x01;
+ const int DEFAULT_IMAGE_WIDTH = 400;
+ const int DEFAULT_IMAGE_HEIGHT = 300;
+ RefPtr<OverlayImage> mOverlayImage;
+ PrincipalHandle mPrincipalHandle;
+#endif
+};
+
+} // namespace mozilla
+
+#endif /* NSDOMMEDIASTREAM_H_ */
diff --git a/dom/media/DecoderDoctorDiagnostics.cpp b/dom/media/DecoderDoctorDiagnostics.cpp
new file mode 100644
index 000000000..91c2d8dfb
--- /dev/null
+++ b/dom/media/DecoderDoctorDiagnostics.cpp
@@ -0,0 +1,881 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DecoderDoctorDiagnostics.h"
+
+#include "mozilla/dom/DecoderDoctorNotificationBinding.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Preferences.h"
+#include "nsContentUtils.h"
+#include "nsGkAtoms.h"
+#include "nsIDocument.h"
+#include "nsIObserverService.h"
+#include "nsIScriptError.h"
+#include "nsITimer.h"
+#include "nsIWeakReference.h"
+#include "nsPluginHost.h"
+#include "nsPrintfCString.h"
+#include "VideoUtils.h"
+
+#if defined(MOZ_FFMPEG)
+#include "FFmpegRuntimeLinker.h"
+#endif
+
+#if defined(XP_WIN)
+#include "mozilla/WindowsVersion.h"
+#endif
+
+static mozilla::LazyLogModule sDecoderDoctorLog("DecoderDoctor");
+#define DD_LOG(level, arg, ...) MOZ_LOG(sDecoderDoctorLog, level, (arg, ##__VA_ARGS__))
+#define DD_DEBUG(arg, ...) DD_LOG(mozilla::LogLevel::Debug, arg, ##__VA_ARGS__)
+#define DD_INFO(arg, ...) DD_LOG(mozilla::LogLevel::Info, arg, ##__VA_ARGS__)
+#define DD_WARN(arg, ...) DD_LOG(mozilla::LogLevel::Warning, arg, ##__VA_ARGS__)
+
+namespace mozilla {
+
+struct NotificationAndReportStringId
+{
+ // Notification type, handled by browser-media.js.
+ dom::DecoderDoctorNotificationType mNotificationType;
+ // Console message id. Key in dom/locales/.../chrome/dom/dom.properties.
+ const char* mReportStringId;
+};
+
+// Class that collects a sequence of diagnostics from the same document over a
+// small period of time, in order to provide a synthesized analysis.
+//
+// Referenced by the document through a nsINode property, mTimer, and
+// inter-task captures.
+// When notified that the document is dead, or when the timer expires but
+// nothing new happened, StopWatching() will remove the document property and
+// timer (if present), so no more work will happen and the watcher will be
+// destroyed once all references are gone.
+class DecoderDoctorDocumentWatcher : public nsITimerCallback
+{
+public:
+ static already_AddRefed<DecoderDoctorDocumentWatcher>
+ RetrieveOrCreate(nsIDocument* aDocument);
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSITIMERCALLBACK
+
+ void AddDiagnostics(DecoderDoctorDiagnostics&& aDiagnostics,
+ const char* aCallSite);
+
+private:
+ explicit DecoderDoctorDocumentWatcher(nsIDocument* aDocument);
+ virtual ~DecoderDoctorDocumentWatcher();
+
+ // This will prevent further work from happening, watcher will deregister
+ // itself from document (if requested) and cancel any timer, and soon die.
+ void StopWatching(bool aRemoveProperty);
+
+ // Remove property from document; will call DestroyPropertyCallback.
+ void RemovePropertyFromDocument();
+ // Callback for property destructor, will be automatically called when the
+ // document (in aObject) is being destroyed.
+ static void DestroyPropertyCallback(void* aObject,
+ nsIAtom* aPropertyName,
+ void* aPropertyValue,
+ void* aData);
+
+ static const uint32_t sAnalysisPeriod_ms = 1000;
+ void EnsureTimerIsStarted();
+
+ void SynthesizeAnalysis();
+
+ // Raw pointer to an nsIDocument.
+ // Must be non-null during construction.
+ // Nulled when we want to stop watching, because either:
+ // 1. The document has been destroyed (notified through
+ // DestroyPropertyCallback).
+ // 2. We have not received new diagnostic information within a short time
+ // period, so we just stop watching.
+ // Once nulled, no more actual work will happen, and the watcher will be
+ // destroyed soon.
+ nsIDocument* mDocument;
+
+ struct Diagnostics
+ {
+ Diagnostics(DecoderDoctorDiagnostics&& aDiagnostics,
+ const char* aCallSite)
+ : mDecoderDoctorDiagnostics(Move(aDiagnostics))
+ , mCallSite(aCallSite)
+ {}
+ Diagnostics(const Diagnostics&) = delete;
+ Diagnostics(Diagnostics&& aOther)
+ : mDecoderDoctorDiagnostics(Move(aOther.mDecoderDoctorDiagnostics))
+ , mCallSite(Move(aOther.mCallSite))
+ {}
+
+ const DecoderDoctorDiagnostics mDecoderDoctorDiagnostics;
+ const nsCString mCallSite;
+ };
+ typedef nsTArray<Diagnostics> DiagnosticsSequence;
+ DiagnosticsSequence mDiagnosticsSequence;
+
+ nsCOMPtr<nsITimer> mTimer; // Keep timer alive until we run.
+ DiagnosticsSequence::size_type mDiagnosticsHandled = 0;
+};
+
+
+NS_IMPL_ISUPPORTS(DecoderDoctorDocumentWatcher, nsITimerCallback)
+
+// static
+already_AddRefed<DecoderDoctorDocumentWatcher>
+DecoderDoctorDocumentWatcher::RetrieveOrCreate(nsIDocument* aDocument)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aDocument);
+ RefPtr<DecoderDoctorDocumentWatcher> watcher =
+ static_cast<DecoderDoctorDocumentWatcher*>(
+ aDocument->GetProperty(nsGkAtoms::decoderDoctor));
+ if (!watcher) {
+ watcher = new DecoderDoctorDocumentWatcher(aDocument);
+ if (NS_WARN_IF(NS_FAILED(
+ aDocument->SetProperty(nsGkAtoms::decoderDoctor,
+ watcher.get(),
+ DestroyPropertyCallback,
+ /*transfer*/ false)))) {
+ DD_WARN("DecoderDoctorDocumentWatcher::RetrieveOrCreate(doc=%p) - Could not set property in document, will destroy new watcher[%p]",
+ aDocument, watcher.get());
+ return nullptr;
+ }
+ // Document owns watcher through this property.
+ // Released in DestroyPropertyCallback().
+ NS_ADDREF(watcher.get());
+ }
+ return watcher.forget();
+}
+
+DecoderDoctorDocumentWatcher::DecoderDoctorDocumentWatcher(nsIDocument* aDocument)
+ : mDocument(aDocument)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mDocument);
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p]::DecoderDoctorDocumentWatcher(doc=%p)",
+ this, mDocument);
+}
+
+DecoderDoctorDocumentWatcher::~DecoderDoctorDocumentWatcher()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p <- expect 0]::~DecoderDoctorDocumentWatcher()",
+ this, mDocument);
+ // mDocument should have been reset through StopWatching()!
+ MOZ_ASSERT(!mDocument);
+}
+
+void
+DecoderDoctorDocumentWatcher::RemovePropertyFromDocument()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DecoderDoctorDocumentWatcher* watcher =
+ static_cast<DecoderDoctorDocumentWatcher*>(
+ mDocument->GetProperty(nsGkAtoms::decoderDoctor));
+ if (!watcher) {
+ return;
+ }
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::RemovePropertyFromDocument()\n",
+ watcher, watcher->mDocument);
+ // This will remove the property and call our DestroyPropertyCallback.
+ mDocument->DeleteProperty(nsGkAtoms::decoderDoctor);
+}
+
+// Callback for property destructors. |aObject| is the object
+// the property is being removed for, |aPropertyName| is the property
+// being removed, |aPropertyValue| is the value of the property, and |aData|
+// is the opaque destructor data that was passed to SetProperty().
+// static
+void
+DecoderDoctorDocumentWatcher::DestroyPropertyCallback(void* aObject,
+ nsIAtom* aPropertyName,
+ void* aPropertyValue,
+ void*)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aPropertyName == nsGkAtoms::decoderDoctor);
+ DecoderDoctorDocumentWatcher* watcher =
+ static_cast<DecoderDoctorDocumentWatcher*>(aPropertyValue);
+ MOZ_ASSERT(watcher);
+#ifdef DEBUG
+ nsIDocument* document = static_cast<nsIDocument*>(aObject);
+ MOZ_ASSERT(watcher->mDocument == document);
+#endif
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::DestroyPropertyCallback()\n",
+ watcher, watcher->mDocument);
+ // 'false': StopWatching should not try and remove the property.
+ watcher->StopWatching(false);
+ NS_RELEASE(watcher);
+}
+
+void
+DecoderDoctorDocumentWatcher::StopWatching(bool aRemoveProperty)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // StopWatching() shouldn't be called twice.
+ MOZ_ASSERT(mDocument);
+
+ if (aRemoveProperty) {
+ RemovePropertyFromDocument();
+ }
+
+ // Forget document now, this will prevent more work from being started.
+ mDocument = nullptr;
+
+ if (mTimer) {
+ mTimer->Cancel();
+ mTimer = nullptr;
+ }
+}
+
+void
+DecoderDoctorDocumentWatcher::EnsureTimerIsStarted()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mTimer) {
+ mTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+ if (NS_WARN_IF(!mTimer)) {
+ return;
+ }
+ if (NS_WARN_IF(NS_FAILED(
+ mTimer->InitWithCallback(
+ this, sAnalysisPeriod_ms, nsITimer::TYPE_ONE_SHOT)))) {
+ mTimer = nullptr;
+ }
+ }
+}
+
+// Note: ReportStringIds are limited to alphanumeric only.
+static const NotificationAndReportStringId sMediaWidevineNoWMFNoSilverlight =
+ { dom::DecoderDoctorNotificationType::Platform_decoder_not_found,
+ "MediaWidevineNoWMFNoSilverlight" };
+static const NotificationAndReportStringId sMediaWMFNeeded =
+ { dom::DecoderDoctorNotificationType::Platform_decoder_not_found,
+ "MediaWMFNeeded" };
+static const NotificationAndReportStringId sMediaUnsupportedBeforeWindowsVista =
+ { dom::DecoderDoctorNotificationType::Platform_decoder_not_found,
+ "MediaUnsupportedBeforeWindowsVista" };
+static const NotificationAndReportStringId sMediaPlatformDecoderNotFound =
+ { dom::DecoderDoctorNotificationType::Platform_decoder_not_found,
+ "MediaPlatformDecoderNotFound" };
+static const NotificationAndReportStringId sMediaCannotPlayNoDecoders =
+ { dom::DecoderDoctorNotificationType::Cannot_play,
+ "MediaCannotPlayNoDecoders" };
+static const NotificationAndReportStringId sMediaNoDecoders =
+ { dom::DecoderDoctorNotificationType::Can_play_but_some_missing_decoders,
+ "MediaNoDecoders" };
+static const NotificationAndReportStringId sCannotInitializePulseAudio =
+ { dom::DecoderDoctorNotificationType::Cannot_initialize_pulseaudio,
+ "MediaCannotInitializePulseAudio" };
+static const NotificationAndReportStringId sUnsupportedLibavcodec =
+ { dom::DecoderDoctorNotificationType::Unsupported_libavcodec,
+ "MediaUnsupportedLibavcodec" };
+
+static const NotificationAndReportStringId*
+sAllNotificationsAndReportStringIds[] =
+{
+ &sMediaWidevineNoWMFNoSilverlight,
+ &sMediaWMFNeeded,
+ &sMediaUnsupportedBeforeWindowsVista,
+ &sMediaPlatformDecoderNotFound,
+ &sMediaCannotPlayNoDecoders,
+ &sMediaNoDecoders,
+ &sCannotInitializePulseAudio,
+ &sUnsupportedLibavcodec,
+};
+
+static void
+DispatchNotification(nsISupports* aSubject,
+ const NotificationAndReportStringId& aNotification,
+ bool aIsSolved,
+ const nsAString& aFormats)
+{
+ if (!aSubject) {
+ return;
+ }
+ dom::DecoderDoctorNotification data;
+ data.mType = aNotification.mNotificationType;
+ data.mIsSolved = aIsSolved;
+ data.mDecoderDoctorReportId.Assign(
+ NS_ConvertUTF8toUTF16(aNotification.mReportStringId));
+ if (!aFormats.IsEmpty()) {
+ data.mFormats.Construct(aFormats);
+ }
+ nsAutoString json;
+ data.ToJSON(json);
+ if (json.IsEmpty()) {
+ DD_WARN("DecoderDoctorDiagnostics/DispatchEvent() - Could not create json for dispatch");
+ // No point in dispatching this notification without data, the front-end
+ // wouldn't know what to display.
+ return;
+ }
+ DD_DEBUG("DecoderDoctorDiagnostics/DispatchEvent() %s", NS_ConvertUTF16toUTF8(json).get());
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ obs->NotifyObservers(aSubject, "decoder-doctor-notification", json.get());
+ }
+}
+
+static void
+ReportToConsole(nsIDocument* aDocument,
+ const char* aConsoleStringId,
+ const nsAString& aParams)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aDocument);
+
+ // 'params' will only be forwarded for non-empty strings.
+ const char16_t* params[1] = { aParams.Data() };
+ DD_DEBUG("DecoderDoctorDiagnostics.cpp:ReportToConsole(doc=%p) ReportToConsole - aMsg='%s' params[0]='%s'",
+ aDocument, aConsoleStringId,
+ aParams.IsEmpty() ? "<no params>" : NS_ConvertUTF16toUTF8(params[0]).get());
+ nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
+ NS_LITERAL_CSTRING("Media"),
+ aDocument,
+ nsContentUtils::eDOM_PROPERTIES,
+ aConsoleStringId,
+ aParams.IsEmpty() ? nullptr : params,
+ aParams.IsEmpty() ? 0 : 1);
+}
+
+static void
+ReportAnalysis(nsIDocument* aDocument,
+ const NotificationAndReportStringId& aNotification,
+ bool aIsSolved,
+ const nsAString& aParams)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!aDocument) {
+ return;
+ }
+
+ // Report non-solved issues to console.
+ if (!aIsSolved) {
+ ReportToConsole(aDocument, aNotification.mReportStringId, aParams);
+ }
+
+ // "media.decoder-doctor.notifications-allowed" controls which notifications
+ // may be dispatched to the front-end. It either contains:
+ // - '*' -> Allow everything.
+ // - Comma-separater list of ids -> Allow if aReportStringId (from
+ // dom.properties) is one of them.
+ // - Nothing (missing or empty) -> Disable everything.
+ nsAdoptingCString filter =
+ Preferences::GetCString("media.decoder-doctor.notifications-allowed");
+ filter.StripWhitespace();
+ if (filter.EqualsLiteral("*")
+ || StringListContains(filter, aNotification.mReportStringId)) {
+ DispatchNotification(
+ aDocument->GetInnerWindow(), aNotification, aIsSolved, aParams);
+ }
+}
+
+enum SilverlightPresence {
+ eNoSilverlight,
+ eSilverlightDisabled,
+ eSilverlightEnabled
+};
+static SilverlightPresence
+CheckSilverlight()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
+ if (!pluginHost) {
+ return eNoSilverlight;
+ }
+ nsTArray<nsCOMPtr<nsIInternalPluginTag>> plugins;
+ pluginHost->GetPlugins(plugins, /*aIncludeDisabled*/ true);
+ for (const auto& plugin : plugins) {
+ for (const auto& mime : plugin->MimeTypes()) {
+ if (mime.LowerCaseEqualsLiteral("application/x-silverlight")
+ || mime.LowerCaseEqualsLiteral("application/x-silverlight-2")) {
+ return plugin->IsEnabled() ? eSilverlightEnabled : eSilverlightDisabled;
+ }
+ }
+ }
+
+ return eNoSilverlight;
+}
+
+static nsString
+CleanItemForFormatsList(const nsAString& aItem)
+{
+ nsString item(aItem);
+ // Remove commas from item, as commas are used to separate items. It's fine
+ // to have a one-way mapping, it's only used for comparisons and in
+ // console display (where formats shouldn't contain commas in the first place)
+ item.ReplaceChar(',', ' ');
+ item.CompressWhitespace();
+ return item;
+}
+
+static void
+AppendToFormatsList(nsAString& aList, const nsAString& aItem)
+{
+ if (!aList.IsEmpty()) {
+ aList += NS_LITERAL_STRING(", ");
+ }
+ aList += CleanItemForFormatsList(aItem);
+}
+
+static bool
+FormatsListContains(const nsAString& aList, const nsAString& aItem)
+{
+ return StringListContains(aList, CleanItemForFormatsList(aItem));
+}
+
+void
+DecoderDoctorDocumentWatcher::SynthesizeAnalysis()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsAutoString playableFormats;
+ nsAutoString unplayableFormats;
+ // Subsets of unplayableFormats that require a specific platform decoder:
+#if defined(XP_WIN)
+ nsAutoString formatsRequiringWMF;
+#endif
+#if defined(MOZ_FFMPEG)
+ nsAutoString formatsRequiringFFMpeg;
+#endif
+ nsAutoString supportedKeySystems;
+ nsAutoString unsupportedKeySystems;
+ DecoderDoctorDiagnostics::KeySystemIssue lastKeySystemIssue =
+ DecoderDoctorDiagnostics::eUnset;
+
+ for (const auto& diag : mDiagnosticsSequence) {
+ switch (diag.mDecoderDoctorDiagnostics.Type()) {
+ case DecoderDoctorDiagnostics::eFormatSupportCheck:
+ if (diag.mDecoderDoctorDiagnostics.CanPlay()) {
+ AppendToFormatsList(playableFormats,
+ diag.mDecoderDoctorDiagnostics.Format());
+ } else {
+ AppendToFormatsList(unplayableFormats,
+ diag.mDecoderDoctorDiagnostics.Format());
+#if defined(XP_WIN)
+ if (diag.mDecoderDoctorDiagnostics.DidWMFFailToLoad()) {
+ AppendToFormatsList(formatsRequiringWMF,
+ diag.mDecoderDoctorDiagnostics.Format());
+ }
+#endif
+#if defined(MOZ_FFMPEG)
+ if (diag.mDecoderDoctorDiagnostics.DidFFmpegFailToLoad()) {
+ AppendToFormatsList(formatsRequiringFFMpeg,
+ diag.mDecoderDoctorDiagnostics.Format());
+ }
+#endif
+ }
+ break;
+ case DecoderDoctorDiagnostics::eMediaKeySystemAccessRequest:
+ if (diag.mDecoderDoctorDiagnostics.IsKeySystemSupported()) {
+ AppendToFormatsList(supportedKeySystems,
+ diag.mDecoderDoctorDiagnostics.KeySystem());
+ } else {
+ AppendToFormatsList(unsupportedKeySystems,
+ diag.mDecoderDoctorDiagnostics.KeySystem());
+ DecoderDoctorDiagnostics::KeySystemIssue issue =
+ diag.mDecoderDoctorDiagnostics.GetKeySystemIssue();
+ if (issue != DecoderDoctorDiagnostics::eUnset) {
+ lastKeySystemIssue = issue;
+ }
+ }
+ break;
+ case DecoderDoctorDiagnostics::eEvent:
+ MOZ_ASSERT_UNREACHABLE("Events shouldn't be stored for processing.");
+ break;
+ default:
+ MOZ_ASSERT(diag.mDecoderDoctorDiagnostics.Type()
+ == DecoderDoctorDiagnostics::eFormatSupportCheck
+ || diag.mDecoderDoctorDiagnostics.Type()
+ == DecoderDoctorDiagnostics::eMediaKeySystemAccessRequest);
+ break;
+ }
+ }
+
+ // Check if issues have been solved, by finding if some now-playable
+ // key systems or formats were previously recorded as having issues.
+ if (!supportedKeySystems.IsEmpty() || !playableFormats.IsEmpty()) {
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - supported key systems '%s', playable formats '%s'; See if they show issues have been solved...",
+ this, mDocument,
+ NS_ConvertUTF16toUTF8(supportedKeySystems).Data(),
+ NS_ConvertUTF16toUTF8(playableFormats).get());
+ const nsAString* workingFormatsArray[] =
+ { &supportedKeySystems, &playableFormats };
+ // For each type of notification, retrieve the pref that contains formats/
+ // key systems with issues.
+ for (const NotificationAndReportStringId* id :
+ sAllNotificationsAndReportStringIds) {
+ nsAutoCString formatsPref("media.decoder-doctor.");
+ formatsPref += id->mReportStringId;
+ formatsPref += ".formats";
+ nsAdoptingString formatsWithIssues =
+ Preferences::GetString(formatsPref.Data());
+ if (formatsWithIssues.IsEmpty()) {
+ continue;
+ }
+ // See if that list of formats-with-issues contains any formats that are
+ // now playable/supported.
+ bool solved = false;
+ for (const nsAString* workingFormats : workingFormatsArray) {
+ for (const auto& workingFormat : MakeStringListRange(*workingFormats)) {
+ if (FormatsListContains(formatsWithIssues, workingFormat)) {
+ // This now-working format used not to work -> Report solved issue.
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - %s solved ('%s' now works, it was in pref(%s)='%s')",
+ this, mDocument, id->mReportStringId,
+ NS_ConvertUTF16toUTF8(workingFormat).get(),
+ formatsPref.Data(),
+ NS_ConvertUTF16toUTF8(formatsWithIssues).get());
+ ReportAnalysis(mDocument, *id, true, workingFormat);
+ // This particular Notification&ReportId has been solved, no need
+ // to keep looking at other keysys/formats that might solve it too.
+ solved = true;
+ break;
+ }
+ }
+ if (solved) {
+ break;
+ }
+ }
+ if (!solved) {
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - %s not solved (pref(%s)='%s')",
+ this, mDocument, id->mReportStringId, formatsPref.Data(),
+ NS_ConvertUTF16toUTF8(formatsWithIssues).get());
+ }
+ }
+ }
+
+ // Look at Key System issues first, as they take precedence over format checks.
+ if (!unsupportedKeySystems.IsEmpty() && supportedKeySystems.IsEmpty()) {
+ // No supported key systems!
+ switch (lastKeySystemIssue) {
+ case DecoderDoctorDiagnostics::eWidevineWithNoWMF:
+ if (CheckSilverlight() != eSilverlightEnabled) {
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unsupported key systems: %s, widevine without WMF nor Silverlight",
+ this, mDocument, NS_ConvertUTF16toUTF8(unsupportedKeySystems).get());
+ ReportAnalysis(mDocument, sMediaWidevineNoWMFNoSilverlight,
+ false, unsupportedKeySystems);
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Next, check playability of requested formats.
+ if (!unplayableFormats.IsEmpty()) {
+ // Some requested formats cannot be played.
+ if (playableFormats.IsEmpty()) {
+ // No requested formats can be played. See if we can help the user, by
+ // going through expected decoders from most to least desirable.
+#if defined(XP_WIN)
+ if (!formatsRequiringWMF.IsEmpty()) {
+ if (IsVistaOrLater()) {
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media because WMF was not found",
+ this, mDocument, NS_ConvertUTF16toUTF8(formatsRequiringWMF).get());
+ ReportAnalysis(mDocument, sMediaWMFNeeded, false, formatsRequiringWMF);
+ } else {
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media before Windows Vista",
+ this, mDocument, NS_ConvertUTF16toUTF8(formatsRequiringWMF).get());
+ ReportAnalysis(mDocument, sMediaUnsupportedBeforeWindowsVista,
+ false, formatsRequiringWMF);
+ }
+ return;
+ }
+#endif
+#if defined(MOZ_FFMPEG)
+ if (!formatsRequiringFFMpeg.IsEmpty()) {
+ switch (FFmpegRuntimeLinker::LinkStatusCode()) {
+ case FFmpegRuntimeLinker::LinkStatus_INVALID_FFMPEG_CANDIDATE:
+ case FFmpegRuntimeLinker::LinkStatus_UNUSABLE_LIBAV57:
+ case FFmpegRuntimeLinker::LinkStatus_INVALID_LIBAV_CANDIDATE:
+ case FFmpegRuntimeLinker::LinkStatus_OBSOLETE_FFMPEG:
+ case FFmpegRuntimeLinker::LinkStatus_OBSOLETE_LIBAV:
+ case FFmpegRuntimeLinker::LinkStatus_INVALID_CANDIDATE:
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media because of unsupported %s (Reason: %s)",
+ this, mDocument,
+ NS_ConvertUTF16toUTF8(formatsRequiringFFMpeg).get(),
+ FFmpegRuntimeLinker::LinkStatusLibraryName(),
+ FFmpegRuntimeLinker::LinkStatusString());
+ ReportAnalysis(mDocument, sUnsupportedLibavcodec,
+ false, formatsRequiringFFMpeg);
+ return;
+ case FFmpegRuntimeLinker::LinkStatus_INIT:
+ MOZ_FALLTHROUGH_ASSERT("Unexpected LinkStatus_INIT");
+ case FFmpegRuntimeLinker::LinkStatus_SUCCEEDED:
+ MOZ_FALLTHROUGH_ASSERT("Unexpected LinkStatus_SUCCEEDED");
+ case FFmpegRuntimeLinker::LinkStatus_NOT_FOUND:
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media because platform decoder was not found (Reason: %s)",
+ this, mDocument,
+ NS_ConvertUTF16toUTF8(formatsRequiringFFMpeg).get(),
+ FFmpegRuntimeLinker::LinkStatusString());
+ ReportAnalysis(mDocument, sMediaPlatformDecoderNotFound,
+ false, formatsRequiringFFMpeg);
+ return;
+ }
+ }
+#endif
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - Cannot play media, unplayable formats: %s",
+ this, mDocument, NS_ConvertUTF16toUTF8(unplayableFormats).get());
+ ReportAnalysis(mDocument, sMediaCannotPlayNoDecoders,
+ false, unplayableFormats);
+ return;
+ }
+
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - Can play media, but no decoders for some requested formats: %s",
+ this, mDocument, NS_ConvertUTF16toUTF8(unplayableFormats).get());
+ if (Preferences::GetBool("media.decoder-doctor.verbose", false)) {
+ ReportAnalysis(mDocument, sMediaNoDecoders, false, unplayableFormats);
+ }
+ return;
+ }
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - Can play media, decoders available for all requested formats",
+ this, mDocument);
+}
+
+void
+DecoderDoctorDocumentWatcher::AddDiagnostics(DecoderDoctorDiagnostics&& aDiagnostics,
+ const char* aCallSite)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aDiagnostics.Type() != DecoderDoctorDiagnostics::eEvent);
+
+ if (!mDocument) {
+ return;
+ }
+
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::AddDiagnostics(DecoderDoctorDiagnostics{%s}, call site '%s')",
+ this, mDocument, aDiagnostics.GetDescription().Data(), aCallSite);
+ mDiagnosticsSequence.AppendElement(Diagnostics(Move(aDiagnostics), aCallSite));
+ EnsureTimerIsStarted();
+}
+
+NS_IMETHODIMP
+DecoderDoctorDocumentWatcher::Notify(nsITimer* timer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(timer == mTimer);
+
+ // Forget timer. (Assuming timer keeps itself and us alive during this call.)
+ mTimer = nullptr;
+
+ if (!mDocument) {
+ return NS_OK;
+ }
+
+ if (mDiagnosticsSequence.Length() > mDiagnosticsHandled) {
+ // We have new diagnostic data.
+ mDiagnosticsHandled = mDiagnosticsSequence.Length();
+
+ SynthesizeAnalysis();
+
+ // Restart timer, to redo analysis or stop watching this document,
+ // depending on whether anything new happens.
+ EnsureTimerIsStarted();
+ } else {
+ DD_DEBUG("DecoderDoctorDocumentWatcher[%p, doc=%p]::Notify() - No new diagnostics to analyze -> Stop watching",
+ this, mDocument);
+ // Stop watching this document, we don't expect more diagnostics for now.
+ // If more diagnostics come in, we'll treat them as another burst, separately.
+ // 'true' to remove the property from the document.
+ StopWatching(true);
+ }
+
+ return NS_OK;
+}
+
+
+void
+DecoderDoctorDiagnostics::StoreFormatDiagnostics(nsIDocument* aDocument,
+ const nsAString& aFormat,
+ bool aCanPlay,
+ const char* aCallSite)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Make sure we only store once.
+ MOZ_ASSERT(mDiagnosticsType == eUnsaved);
+ mDiagnosticsType = eFormatSupportCheck;
+
+ if (NS_WARN_IF(!aDocument)) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreFormatDiagnostics(nsIDocument* aDocument=nullptr, format='%s', can-play=%d, call site '%s')",
+ this, NS_ConvertUTF16toUTF8(aFormat).get(), aCanPlay, aCallSite);
+ return;
+ }
+ if (NS_WARN_IF(aFormat.IsEmpty())) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreFormatDiagnostics(nsIDocument* aDocument=%p, format=<empty>, can-play=%d, call site '%s')",
+ this, aDocument, aCanPlay, aCallSite);
+ return;
+ }
+
+ RefPtr<DecoderDoctorDocumentWatcher> watcher =
+ DecoderDoctorDocumentWatcher::RetrieveOrCreate(aDocument);
+
+ if (NS_WARN_IF(!watcher)) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreFormatDiagnostics(nsIDocument* aDocument=%p, format='%s', can-play=%d, call site '%s') - Could not create document watcher",
+ this, aDocument, NS_ConvertUTF16toUTF8(aFormat).get(), aCanPlay, aCallSite);
+ return;
+ }
+
+ mFormat = aFormat;
+ mCanPlay = aCanPlay;
+
+ // StoreDiagnostics should only be called once, after all data is available,
+ // so it is safe to Move() from this object.
+ watcher->AddDiagnostics(Move(*this), aCallSite);
+ // Even though it's moved-from, the type should stay set
+ // (Only used to ensure that we do store only once.)
+ MOZ_ASSERT(mDiagnosticsType == eFormatSupportCheck);
+}
+
+void
+DecoderDoctorDiagnostics::StoreMediaKeySystemAccess(nsIDocument* aDocument,
+ const nsAString& aKeySystem,
+ bool aIsSupported,
+ const char* aCallSite)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Make sure we only store once.
+ MOZ_ASSERT(mDiagnosticsType == eUnsaved);
+ mDiagnosticsType = eMediaKeySystemAccessRequest;
+
+ if (NS_WARN_IF(!aDocument)) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreMediaKeySystemAccess(nsIDocument* aDocument=nullptr, keysystem='%s', supported=%d, call site '%s')",
+ this, NS_ConvertUTF16toUTF8(aKeySystem).get(), aIsSupported, aCallSite);
+ return;
+ }
+ if (NS_WARN_IF(aKeySystem.IsEmpty())) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreMediaKeySystemAccess(nsIDocument* aDocument=%p, keysystem=<empty>, supported=%d, call site '%s')",
+ this, aDocument, aIsSupported, aCallSite);
+ return;
+ }
+
+ RefPtr<DecoderDoctorDocumentWatcher> watcher =
+ DecoderDoctorDocumentWatcher::RetrieveOrCreate(aDocument);
+
+ if (NS_WARN_IF(!watcher)) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreMediaKeySystemAccess(nsIDocument* aDocument=%p, keysystem='%s', supported=%d, call site '%s') - Could not create document watcher",
+ this, aDocument, NS_ConvertUTF16toUTF8(aKeySystem).get(), aIsSupported, aCallSite);
+ return;
+ }
+
+ mKeySystem = aKeySystem;
+ mIsKeySystemSupported = aIsSupported;
+
+ // StoreMediaKeySystemAccess should only be called once, after all data is
+ // available, so it is safe to Move() from this object.
+ watcher->AddDiagnostics(Move(*this), aCallSite);
+ // Even though it's moved-from, the type should stay set
+ // (Only used to ensure that we do store only once.)
+ MOZ_ASSERT(mDiagnosticsType == eMediaKeySystemAccessRequest);
+}
+
+void
+DecoderDoctorDiagnostics::StoreEvent(nsIDocument* aDocument,
+ const DecoderDoctorEvent& aEvent,
+ const char* aCallSite)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Make sure we only store once.
+ MOZ_ASSERT(mDiagnosticsType == eUnsaved);
+ mDiagnosticsType = eEvent;
+ mEvent = aEvent;
+
+ if (NS_WARN_IF(!aDocument)) {
+ DD_WARN("DecoderDoctorDiagnostics[%p]::StoreEvent(nsIDocument* aDocument=nullptr, aEvent=%s, call site '%s')",
+ this, GetDescription().get(), aCallSite);
+ return;
+ }
+
+ // Don't keep events for later processing, just handle them now.
+#ifdef MOZ_PULSEAUDIO
+ switch (aEvent.mDomain) {
+ case DecoderDoctorEvent::eAudioSinkStartup:
+ if (aEvent.mResult == NS_ERROR_DOM_MEDIA_CUBEB_INITIALIZATION_ERR) {
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::AddDiagnostics() - unable to initialize PulseAudio",
+ this, aDocument);
+ ReportAnalysis(aDocument, sCannotInitializePulseAudio,
+ false, NS_LITERAL_STRING("*"));
+ } else if (aEvent.mResult == NS_OK) {
+ DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::AddDiagnostics() - now able to initialize PulseAudio",
+ this, aDocument);
+ ReportAnalysis(aDocument, sCannotInitializePulseAudio,
+ true, NS_LITERAL_STRING("*"));
+ }
+ break;
+ }
+#endif // MOZ_PULSEAUDIO
+}
+
+static const char*
+EventDomainString(DecoderDoctorEvent::Domain aDomain)
+{
+ switch (aDomain) {
+ case DecoderDoctorEvent::eAudioSinkStartup:
+ return "audio-sink-startup";
+ }
+ return "?";
+}
+
+nsCString
+DecoderDoctorDiagnostics::GetDescription() const
+{
+ nsCString s;
+ switch (mDiagnosticsType) {
+ case eUnsaved:
+ s = "Unsaved diagnostics, cannot get accurate description";
+ break;
+ case eFormatSupportCheck:
+ s = "format='";
+ s += NS_ConvertUTF16toUTF8(mFormat).get();
+ s += mCanPlay ? "', can play" : "', cannot play";
+ if (mVideoNotSupported) {
+ s+= ", but video format not supported";
+ }
+ if (mAudioNotSupported) {
+ s+= ", but audio format not supported";
+ }
+ if (mWMFFailedToLoad) {
+ s += ", Windows platform decoder failed to load";
+ }
+ if (mFFmpegFailedToLoad) {
+ s += ", Linux platform decoder failed to load";
+ }
+ if (mGMPPDMFailedToStartup) {
+ s += ", GMP PDM failed to startup";
+ } else if (!mGMP.IsEmpty()) {
+ s += ", Using GMP '";
+ s += mGMP;
+ s += "'";
+ }
+ break;
+ case eMediaKeySystemAccessRequest:
+ s = "key system='";
+ s += NS_ConvertUTF16toUTF8(mKeySystem).get();
+ s += mIsKeySystemSupported ? "', supported" : "', not supported";
+ switch (mKeySystemIssue) {
+ case eUnset:
+ break;
+ case eWidevineWithNoWMF:
+ s += ", Widevine with no WMF";
+ break;
+ }
+ break;
+ case eEvent:
+ s = nsPrintfCString("event domain %s result=%u",
+ EventDomainString(mEvent.mDomain), mEvent.mResult);
+ break;
+ default:
+ MOZ_ASSERT_UNREACHABLE("Unexpected DiagnosticsType");
+ s = "?";
+ break;
+ }
+ return s;
+}
+
+} // namespace mozilla
diff --git a/dom/media/DecoderDoctorDiagnostics.h b/dom/media/DecoderDoctorDiagnostics.h
new file mode 100644
index 000000000..6ed04cfe3
--- /dev/null
+++ b/dom/media/DecoderDoctorDiagnostics.h
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DecoderDoctorDiagnostics_h_
+#define DecoderDoctorDiagnostics_h_
+
+#include "nsString.h"
+
+class nsIDocument;
+
+namespace mozilla {
+
+struct DecoderDoctorEvent {
+ enum Domain {
+ eAudioSinkStartup,
+ } mDomain;
+ nsresult mResult;
+};
+
+// DecoderDoctorDiagnostics class, used to gather data from PDMs/DecoderTraits,
+// and then notify the user about issues preventing (or worsening) playback.
+//
+// The expected usage is:
+// 1. Instantiate a DecoderDoctorDiagnostics in a function (close to the point
+// where a webpage is trying to know whether some MIME types can be played,
+// or trying to play a media file).
+// 2. Pass a pointer to the DecoderDoctorDiagnostics structure to one of the
+// CanPlayStatus/IsTypeSupported/(others?). During that call, some PDMs may
+// add relevant diagnostic information.
+// 3. Analyze the collected diagnostics, and optionally dispatch an event to the
+// UX, to notify the user about potential playback issues and how to resolve
+// them.
+//
+// This class' methods must be called from the main thread.
+
+class DecoderDoctorDiagnostics
+{
+public:
+ // Store the diagnostic information collected so far on a document for a
+ // given format. All diagnostics for a document will be analyzed together
+ // within a short timeframe.
+ // Should only be called once.
+ void StoreFormatDiagnostics(nsIDocument* aDocument,
+ const nsAString& aFormat,
+ bool aCanPlay,
+ const char* aCallSite);
+
+ void StoreMediaKeySystemAccess(nsIDocument* aDocument,
+ const nsAString& aKeySystem,
+ bool aIsSupported,
+ const char* aCallSite);
+
+ void StoreEvent(nsIDocument* aDocument,
+ const DecoderDoctorEvent& aEvent,
+ const char* aCallSite);
+
+ enum DiagnosticsType {
+ eUnsaved,
+ eFormatSupportCheck,
+ eMediaKeySystemAccessRequest,
+ eEvent
+ };
+ DiagnosticsType Type() const { return mDiagnosticsType; }
+
+ // Description string, for logging purposes; only call on stored diags.
+ nsCString GetDescription() const;
+
+ // Methods to record diagnostic information:
+
+ const nsAString& Format() const { return mFormat; }
+ bool CanPlay() const { return mCanPlay; }
+
+ void SetWMFFailedToLoad() { mWMFFailedToLoad = true; }
+ bool DidWMFFailToLoad() const { return mWMFFailedToLoad; }
+
+ void SetFFmpegFailedToLoad() { mFFmpegFailedToLoad = true; }
+ bool DidFFmpegFailToLoad() const { return mFFmpegFailedToLoad; }
+
+ void SetGMPPDMFailedToStartup() { mGMPPDMFailedToStartup = true; }
+ bool DidGMPPDMFailToStartup() const { return mGMPPDMFailedToStartup; }
+
+ void SetVideoNotSupported() { mVideoNotSupported = true; }
+ void SetAudioNotSupported() { mAudioNotSupported = true; }
+
+ void SetGMP(const nsACString& aGMP) { mGMP = aGMP; }
+ const nsACString& GMP() const { return mGMP; }
+
+ const nsAString& KeySystem() const { return mKeySystem; }
+ bool IsKeySystemSupported() const { return mIsKeySystemSupported; }
+ enum KeySystemIssue {
+ eUnset,
+ eWidevineWithNoWMF
+ };
+ void SetKeySystemIssue(KeySystemIssue aKeySystemIssue)
+ {
+ mKeySystemIssue = aKeySystemIssue;
+ }
+ KeySystemIssue GetKeySystemIssue() const
+ {
+ return mKeySystemIssue;
+ }
+
+ DecoderDoctorEvent event() const
+ {
+ return mEvent;
+ }
+
+private:
+ // Currently-known type of diagnostics. Set from one of the 'Store...' methods.
+ // This helps ensure diagnostics are only stored once,
+ // and makes it easy to know what information they contain.
+ DiagnosticsType mDiagnosticsType = eUnsaved;
+
+ nsString mFormat;
+ // True if there is at least one decoder that can play that format.
+ bool mCanPlay = false;
+
+ bool mWMFFailedToLoad = false;
+ bool mFFmpegFailedToLoad = false;
+ bool mGMPPDMFailedToStartup = false;
+ bool mVideoNotSupported = false;
+ bool mAudioNotSupported = false;
+ nsCString mGMP;
+
+ nsString mKeySystem;
+ bool mIsKeySystemSupported = false;
+ KeySystemIssue mKeySystemIssue = eUnset;
+
+ DecoderDoctorEvent mEvent;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/DecoderTraits.cpp b/dom/media/DecoderTraits.cpp
new file mode 100644
index 000000000..ddd35fe0d
--- /dev/null
+++ b/dom/media/DecoderTraits.cpp
@@ -0,0 +1,532 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DecoderTraits.h"
+#include "MediaContentType.h"
+#include "MediaDecoder.h"
+#include "nsCharSeparatedTokenizer.h"
+#include "nsMimeTypes.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/Telemetry.h"
+
+#include "OggDecoder.h"
+#include "OggDemuxer.h"
+
+#include "WebMDecoder.h"
+#include "WebMDemuxer.h"
+
+#ifdef MOZ_ANDROID_OMX
+#include "AndroidMediaDecoder.h"
+#include "AndroidMediaReader.h"
+#include "AndroidMediaPluginHost.h"
+#endif
+#ifdef MOZ_DIRECTSHOW
+#include "DirectShowDecoder.h"
+#include "DirectShowReader.h"
+#endif
+#ifdef MOZ_FMP4
+#include "MP4Decoder.h"
+#include "MP4Demuxer.h"
+#endif
+#include "MediaFormatReader.h"
+
+#include "MP3Decoder.h"
+#include "MP3Demuxer.h"
+
+#include "WaveDecoder.h"
+#include "WaveDemuxer.h"
+
+#include "ADTSDecoder.h"
+#include "ADTSDemuxer.h"
+
+#include "FlacDecoder.h"
+#include "FlacDemuxer.h"
+
+#include "nsPluginHost.h"
+#include "MediaPrefs.h"
+
+namespace mozilla
+{
+
+template <class String>
+static bool
+CodecListContains(char const *const * aCodecs, const String& aCodec)
+{
+ for (int32_t i = 0; aCodecs[i]; ++i) {
+ if (aCodec.EqualsASCII(aCodecs[i]))
+ return true;
+ }
+ return false;
+}
+
+static bool
+IsOggSupportedType(const nsACString& aType,
+ const nsAString& aCodecs = EmptyString())
+{
+ return OggDecoder::CanHandleMediaType(aType, aCodecs);
+}
+
+static bool
+IsOggTypeAndEnabled(const nsACString& aType)
+{
+ return IsOggSupportedType(aType);
+}
+
+static bool
+IsWebMSupportedType(const nsACString& aType,
+ const nsAString& aCodecs = EmptyString())
+{
+ return WebMDecoder::CanHandleMediaType(aType, aCodecs);
+}
+
+/* static */ bool
+DecoderTraits::IsWebMTypeAndEnabled(const nsACString& aType)
+{
+ return IsWebMSupportedType(aType);
+}
+
+/* static */ bool
+DecoderTraits::IsWebMAudioType(const nsACString& aType)
+{
+ return aType.EqualsASCII("audio/webm");
+}
+
+static char const *const gHttpLiveStreamingTypes[] = {
+ // For m3u8.
+ // https://tools.ietf.org/html/draft-pantos-http-live-streaming-19#section-10
+ "application/vnd.apple.mpegurl",
+ // Some sites serve these as the informal m3u type.
+ "application/x-mpegurl",
+ "audio/x-mpegurl",
+ nullptr
+};
+
+static bool
+IsHttpLiveStreamingType(const nsACString& aType)
+{
+ return CodecListContains(gHttpLiveStreamingTypes, aType);
+}
+
+#ifdef MOZ_ANDROID_OMX
+static bool
+IsAndroidMediaType(const nsACString& aType)
+{
+ if (!MediaDecoder::IsAndroidMediaPluginEnabled()) {
+ return false;
+ }
+
+ static const char* supportedTypes[] = {
+ "audio/mpeg", "audio/mp4", "video/mp4", "video/x-m4v", nullptr
+ };
+ return CodecListContains(supportedTypes, aType);
+}
+#endif
+
+#ifdef MOZ_DIRECTSHOW
+static bool
+IsDirectShowSupportedType(const nsACString& aType)
+{
+ return DirectShowDecoder::GetSupportedCodecs(aType, nullptr);
+}
+#endif
+
+#ifdef MOZ_FMP4
+static bool
+IsMP4SupportedType(const MediaContentType& aParsedType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ return MP4Decoder::CanHandleMediaType(aParsedType, aDiagnostics);
+}
+static bool
+IsMP4SupportedType(const nsACString& aType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ MediaContentType contentType{aType};
+ return IsMP4SupportedType(contentType, aDiagnostics);
+}
+#endif
+
+/* static */ bool
+DecoderTraits::IsMP4TypeAndEnabled(const nsACString& aType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+#ifdef MOZ_FMP4
+ return IsMP4SupportedType(aType, aDiagnostics);
+#else
+ return false;
+#endif
+}
+
+static bool
+IsMP3SupportedType(const nsACString& aType,
+ const nsAString& aCodecs = EmptyString())
+{
+ return MP3Decoder::CanHandleMediaType(aType, aCodecs);
+}
+
+static bool
+IsAACSupportedType(const nsACString& aType,
+ const nsAString& aCodecs = EmptyString())
+{
+ return ADTSDecoder::CanHandleMediaType(aType, aCodecs);
+}
+
+static bool
+IsWaveSupportedType(const nsACString& aType,
+ const nsAString& aCodecs = EmptyString())
+{
+ return WaveDecoder::CanHandleMediaType(aType, aCodecs);
+}
+
+static bool
+IsFlacSupportedType(const nsACString& aType,
+ const nsAString& aCodecs = EmptyString())
+{
+ return FlacDecoder::CanHandleMediaType(aType, aCodecs);
+}
+
+static
+CanPlayStatus
+CanHandleCodecsType(const MediaContentType& aType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ MOZ_ASSERT(aType.IsValid());
+ // We should have been given a codecs string, though it may be empty.
+ MOZ_ASSERT(aType.HaveCodecs());
+
+ char const* const* codecList = nullptr;
+ if (IsOggTypeAndEnabled(aType.GetMIMEType())) {
+ if (IsOggSupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
+ return CANPLAY_YES;
+ } else {
+ // We can only reach this position if a particular codec was requested,
+ // ogg is supported and working: the codec must be invalid.
+ return CANPLAY_NO;
+ }
+ }
+ if (IsWaveSupportedType(aType.GetMIMEType())) {
+ if (IsWaveSupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
+ return CANPLAY_YES;
+ } else {
+ // We can only reach this position if a particular codec was requested,
+ // ogg is supported and working: the codec must be invalid.
+ return CANPLAY_NO;
+ }
+ }
+#if !defined(MOZ_OMX_WEBM_DECODER)
+ if (DecoderTraits::IsWebMTypeAndEnabled(aType.GetMIMEType())) {
+ if (IsWebMSupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
+ return CANPLAY_YES;
+ } else {
+ // We can only reach this position if a particular codec was requested,
+ // webm is supported and working: the codec must be invalid.
+ return CANPLAY_NO;
+ }
+ }
+#endif
+#ifdef MOZ_FMP4
+ if (DecoderTraits::IsMP4TypeAndEnabled(aType.GetMIMEType(), aDiagnostics)) {
+ if (IsMP4SupportedType(aType, aDiagnostics)) {
+ return CANPLAY_YES;
+ } else {
+ // We can only reach this position if a particular codec was requested,
+ // fmp4 is supported and working: the codec must be invalid.
+ return CANPLAY_NO;
+ }
+ }
+#endif
+ if (IsMP3SupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
+ return CANPLAY_YES;
+ }
+ if (IsAACSupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
+ return CANPLAY_YES;
+ }
+ if (IsFlacSupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
+ return CANPLAY_YES;
+ }
+#ifdef MOZ_DIRECTSHOW
+ DirectShowDecoder::GetSupportedCodecs(aType.GetMIMEType(), &codecList);
+#endif
+#ifdef MOZ_ANDROID_OMX
+ if (MediaDecoder::IsAndroidMediaPluginEnabled()) {
+ EnsureAndroidMediaPluginHost()->FindDecoder(aType.GetMIMEType(), &codecList);
+ }
+#endif
+ if (!codecList) {
+ return CANPLAY_MAYBE;
+ }
+
+ // See http://www.rfc-editor.org/rfc/rfc4281.txt for the description
+ // of the 'codecs' parameter
+ nsCharSeparatedTokenizer tokenizer(aType.GetCodecs(), ',');
+ bool expectMoreTokens = false;
+ while (tokenizer.hasMoreTokens()) {
+ const nsSubstring& token = tokenizer.nextToken();
+
+ if (!CodecListContains(codecList, token)) {
+ // Totally unsupported codec
+ return CANPLAY_NO;
+ }
+ expectMoreTokens = tokenizer.separatorAfterCurrentToken();
+ }
+ if (expectMoreTokens) {
+ // Last codec name was empty
+ return CANPLAY_NO;
+ }
+
+ return CANPLAY_YES;
+}
+
+static
+CanPlayStatus
+CanHandleMediaType(const MediaContentType& aType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (IsHttpLiveStreamingType(aType.GetMIMEType())) {
+ Telemetry::Accumulate(Telemetry::MEDIA_HLS_CANPLAY_REQUESTED, true);
+ }
+
+ if (aType.HaveCodecs()) {
+ CanPlayStatus result = CanHandleCodecsType(aType, aDiagnostics);
+ if (result == CANPLAY_NO || result == CANPLAY_YES) {
+ return result;
+ }
+ }
+ if (IsOggTypeAndEnabled(aType.GetMIMEType())) {
+ return CANPLAY_MAYBE;
+ }
+ if (IsWaveSupportedType(aType.GetMIMEType())) {
+ return CANPLAY_MAYBE;
+ }
+ if (DecoderTraits::IsMP4TypeAndEnabled(aType.GetMIMEType(), aDiagnostics)) {
+ return CANPLAY_MAYBE;
+ }
+#if !defined(MOZ_OMX_WEBM_DECODER)
+ if (DecoderTraits::IsWebMTypeAndEnabled(aType.GetMIMEType())) {
+ return CANPLAY_MAYBE;
+ }
+#endif
+ if (IsMP3SupportedType(aType.GetMIMEType())) {
+ return CANPLAY_MAYBE;
+ }
+ if (IsAACSupportedType(aType.GetMIMEType())) {
+ return CANPLAY_MAYBE;
+ }
+ if (IsFlacSupportedType(aType.GetMIMEType())) {
+ return CANPLAY_MAYBE;
+ }
+#ifdef MOZ_DIRECTSHOW
+ if (DirectShowDecoder::GetSupportedCodecs(aType.GetMIMEType(), nullptr)) {
+ return CANPLAY_MAYBE;
+ }
+#endif
+#ifdef MOZ_ANDROID_OMX
+ if (MediaDecoder::IsAndroidMediaPluginEnabled() &&
+ EnsureAndroidMediaPluginHost()->FindDecoder(aType.GetMIMEType(), nullptr)) {
+ return CANPLAY_MAYBE;
+ }
+#endif
+ return CANPLAY_NO;
+}
+
+/* static */
+CanPlayStatus
+DecoderTraits::CanHandleContentType(const MediaContentType& aContentType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ if (!aContentType.IsValid()) {
+ return CANPLAY_NO;
+ }
+
+ return CanHandleMediaType(aContentType, aDiagnostics);
+}
+
+/* static */
+bool DecoderTraits::ShouldHandleMediaType(const char* aMIMEType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ if (IsWaveSupportedType(nsDependentCString(aMIMEType))) {
+ // We should not return true for Wave types, since there are some
+ // Wave codecs actually in use in the wild that we don't support, and
+ // we should allow those to be handled by plugins or helper apps.
+ // Furthermore people can play Wave files on most platforms by other
+ // means.
+ return false;
+ }
+
+ // If an external plugin which can handle quicktime video is available
+ // (and not disabled), prefer it over native playback as there several
+ // codecs found in the wild that we do not handle.
+ if (nsDependentCString(aMIMEType).EqualsASCII("video/quicktime")) {
+ RefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
+ if (pluginHost &&
+ pluginHost->HavePluginForType(nsDependentCString(aMIMEType))) {
+ return false;
+ }
+ }
+
+ MediaContentType parsed{nsDependentCString(aMIMEType)};
+ return CanHandleMediaType(parsed, aDiagnostics)
+ != CANPLAY_NO;
+}
+
+// Instantiates but does not initialize decoder.
+static
+already_AddRefed<MediaDecoder>
+InstantiateDecoder(const nsACString& aType,
+ MediaDecoderOwner* aOwner,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<MediaDecoder> decoder;
+
+#ifdef MOZ_FMP4
+ if (IsMP4SupportedType(aType, aDiagnostics)) {
+ decoder = new MP4Decoder(aOwner);
+ return decoder.forget();
+ }
+#endif
+ if (IsMP3SupportedType(aType)) {
+ decoder = new MP3Decoder(aOwner);
+ return decoder.forget();
+ }
+ if (IsAACSupportedType(aType)) {
+ decoder = new ADTSDecoder(aOwner);
+ return decoder.forget();
+ }
+ if (IsOggSupportedType(aType)) {
+ decoder = new OggDecoder(aOwner);
+ return decoder.forget();
+ }
+ if (IsWaveSupportedType(aType)) {
+ decoder = new WaveDecoder(aOwner);
+ return decoder.forget();
+ }
+ if (IsFlacSupportedType(aType)) {
+ decoder = new FlacDecoder(aOwner);
+ return decoder.forget();
+ }
+#ifdef MOZ_ANDROID_OMX
+ if (MediaDecoder::IsAndroidMediaPluginEnabled() &&
+ EnsureAndroidMediaPluginHost()->FindDecoder(aType, nullptr)) {
+ decoder = new AndroidMediaDecoder(aOwner, aType);
+ return decoder.forget();
+ }
+#endif
+
+ if (IsWebMSupportedType(aType)) {
+ decoder = new WebMDecoder(aOwner);
+ return decoder.forget();
+ }
+
+#ifdef MOZ_DIRECTSHOW
+ // Note: DirectShow should come before WMF, so that we prefer DirectShow's
+ // MP3 support over WMF's.
+ if (IsDirectShowSupportedType(aType)) {
+ decoder = new DirectShowDecoder(aOwner);
+ return decoder.forget();
+ }
+#endif
+
+ if (IsHttpLiveStreamingType(aType)) {
+ // We don't have an HLS decoder.
+ Telemetry::Accumulate(Telemetry::MEDIA_HLS_DECODER_SUCCESS, false);
+ }
+
+ return nullptr;
+}
+
+/* static */
+already_AddRefed<MediaDecoder>
+DecoderTraits::CreateDecoder(const nsACString& aType,
+ MediaDecoderOwner* aOwner,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return InstantiateDecoder(aType, aOwner, aDiagnostics);
+}
+
+/* static */
+MediaDecoderReader* DecoderTraits::CreateReader(const nsACString& aType, AbstractMediaDecoder* aDecoder)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaDecoderReader* decoderReader = nullptr;
+
+ if (!aDecoder) {
+ return decoderReader;
+ }
+#ifdef MOZ_FMP4
+ if (IsMP4SupportedType(aType, /* DecoderDoctorDiagnostics* */ nullptr)) {
+ decoderReader = new MediaFormatReader(aDecoder, new MP4Demuxer(aDecoder->GetResource()));
+ } else
+#endif
+ if (IsMP3SupportedType(aType)) {
+ decoderReader = new MediaFormatReader(aDecoder, new mp3::MP3Demuxer(aDecoder->GetResource()));
+ } else
+ if (IsAACSupportedType(aType)) {
+ decoderReader = new MediaFormatReader(aDecoder, new ADTSDemuxer(aDecoder->GetResource()));
+ } else
+ if (IsWaveSupportedType(aType)) {
+ decoderReader = new MediaFormatReader(aDecoder, new WAVDemuxer(aDecoder->GetResource()));
+ } else
+ if (IsFlacSupportedType(aType)) {
+ decoderReader = new MediaFormatReader(aDecoder, new FlacDemuxer(aDecoder->GetResource()));
+ } else
+ if (IsOggSupportedType(aType)) {
+ decoderReader = new MediaFormatReader(aDecoder, new OggDemuxer(aDecoder->GetResource()));
+ } else
+#ifdef MOZ_ANDROID_OMX
+ if (MediaDecoder::IsAndroidMediaPluginEnabled() &&
+ EnsureAndroidMediaPluginHost()->FindDecoder(aType, nullptr)) {
+ decoderReader = new AndroidMediaReader(aDecoder, aType);
+ } else
+#endif
+ if (IsWebMSupportedType(aType)) {
+ decoderReader =
+ new MediaFormatReader(aDecoder, new WebMDemuxer(aDecoder->GetResource()));
+ } else
+#ifdef MOZ_DIRECTSHOW
+ if (IsDirectShowSupportedType(aType)) {
+ decoderReader = new DirectShowReader(aDecoder);
+ } else
+#endif
+ if (false) {} // dummy if to take care of the dangling else
+
+ return decoderReader;
+}
+
+/* static */
+bool DecoderTraits::IsSupportedInVideoDocument(const nsACString& aType)
+{
+ // Forbid playing media in video documents if the user has opted
+ // not to, using either the legacy WMF specific pref, or the newer
+ // catch-all pref.
+ if (!Preferences::GetBool("media.windows-media-foundation.play-stand-alone", true) ||
+ !Preferences::GetBool("media.play-stand-alone", true)) {
+ return false;
+ }
+
+ return
+ IsOggSupportedType(aType) ||
+ IsWebMSupportedType(aType) ||
+#ifdef MOZ_ANDROID_OMX
+ (MediaDecoder::IsAndroidMediaPluginEnabled() && IsAndroidMediaType(aType)) ||
+#endif
+#ifdef MOZ_FMP4
+ IsMP4SupportedType(aType, /* DecoderDoctorDiagnostics* */ nullptr) ||
+#endif
+ IsMP3SupportedType(aType) ||
+ IsAACSupportedType(aType) ||
+ IsFlacSupportedType(aType) ||
+#ifdef MOZ_DIRECTSHOW
+ IsDirectShowSupportedType(aType) ||
+#endif
+ false;
+}
+
+} // namespace mozilla
diff --git a/dom/media/DecoderTraits.h b/dom/media/DecoderTraits.h
new file mode 100644
index 000000000..8e6d73d94
--- /dev/null
+++ b/dom/media/DecoderTraits.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DecoderTraits_h_
+#define DecoderTraits_h_
+
+#include "nsCOMPtr.h"
+
+class nsAString;
+class nsACString;
+
+namespace mozilla {
+
+class AbstractMediaDecoder;
+class DecoderDoctorDiagnostics;
+class MediaContentType;
+class MediaDecoder;
+class MediaDecoderOwner;
+class MediaDecoderReader;
+
+enum CanPlayStatus {
+ CANPLAY_NO,
+ CANPLAY_MAYBE,
+ CANPLAY_YES
+};
+
+class DecoderTraits {
+public:
+ // Returns the CanPlayStatus indicating if we can handle this content type.
+ static CanPlayStatus CanHandleContentType(const MediaContentType& aContentType,
+ DecoderDoctorDiagnostics* aDiagnostics);
+
+ // Returns true if we should handle this MIME type when it appears
+ // as an <object> or as a toplevel page. If, in practice, our support
+ // for the type is more limited than appears in the wild, we should return
+ // false here even if CanHandleMediaType would return true.
+ static bool ShouldHandleMediaType(const char* aMIMEType,
+ DecoderDoctorDiagnostics* aDiagnostics);
+
+ // Create a decoder for the given aType. Returns null if we
+ // were unable to create the decoder.
+ static already_AddRefed<MediaDecoder> CreateDecoder(const nsACString& aType,
+ MediaDecoderOwner* aOwner,
+ DecoderDoctorDiagnostics* aDiagnostics);
+
+ // Create a reader for thew given MIME type aType. Returns null
+ // if we were unable to create the reader.
+ static MediaDecoderReader* CreateReader(const nsACString& aType,
+ AbstractMediaDecoder* aDecoder);
+
+ // Returns true if MIME type aType is supported in video documents,
+ // or false otherwise. Not all platforms support all MIME types, and
+ // vice versa.
+ static bool IsSupportedInVideoDocument(const nsACString& aType);
+
+ static bool IsWebMTypeAndEnabled(const nsACString& aType);
+ static bool IsWebMAudioType(const nsACString& aType);
+ static bool IsMP4TypeAndEnabled(const nsACString& aType,
+ DecoderDoctorDiagnostics* aDiagnostics);
+};
+
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/EncodedBufferCache.cpp b/dom/media/EncodedBufferCache.cpp
new file mode 100644
index 000000000..3f1949029
--- /dev/null
+++ b/dom/media/EncodedBufferCache.cpp
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "EncodedBufferCache.h"
+#include "mozilla/dom/File.h"
+#include "nsAnonymousTemporaryFile.h"
+#include "prio.h"
+
+namespace mozilla {
+
+void
+EncodedBufferCache::AppendBuffer(nsTArray<uint8_t> & aBuf)
+{
+ MutexAutoLock lock(mMutex);
+ mDataSize += aBuf.Length();
+
+ mEncodedBuffers.AppendElement()->SwapElements(aBuf);
+
+ if (!mTempFileEnabled && mDataSize > mMaxMemoryStorage) {
+ nsresult rv;
+ PRFileDesc* tempFD = nullptr;
+ {
+ // Release the mMutex because there is a sync dispatch to mainthread in
+ // NS_OpenAnonymousTemporaryFile.
+ MutexAutoUnlock unlock(mMutex);
+ rv = NS_OpenAnonymousTemporaryFile(&tempFD);
+ }
+ if (!NS_FAILED(rv)) {
+ // Check the mDataSize again since we release the mMutex before.
+ if (mDataSize > mMaxMemoryStorage) {
+ mFD = tempFD;
+ mTempFileEnabled = true;
+ } else {
+ // Close the tempFD because the data had been taken during the
+ // MutexAutoUnlock.
+ PR_Close(tempFD);
+ }
+ }
+ }
+
+ if (mTempFileEnabled) {
+ // has created temporary file, write buffer in it
+ for (uint32_t i = 0; i < mEncodedBuffers.Length(); i++) {
+ int32_t amount = PR_Write(mFD, mEncodedBuffers.ElementAt(i).Elements(), mEncodedBuffers.ElementAt(i).Length());
+ if (amount < 0 || size_t(amount) < mEncodedBuffers.ElementAt(i).Length()) {
+ NS_WARNING("Failed to write media cache block!");
+ }
+ }
+ mEncodedBuffers.Clear();
+ }
+
+}
+
+already_AddRefed<dom::Blob>
+EncodedBufferCache::ExtractBlob(nsISupports* aParent,
+ const nsAString &aContentType)
+{
+ MutexAutoLock lock(mMutex);
+ RefPtr<dom::Blob> blob;
+ if (mTempFileEnabled) {
+ // generate new temporary file to write
+ blob = dom::Blob::CreateTemporaryBlob(aParent, mFD, 0, mDataSize,
+ aContentType);
+ // fallback to memory blob
+ mTempFileEnabled = false;
+ mDataSize = 0;
+ mFD = nullptr;
+ } else {
+ void* blobData = malloc(mDataSize);
+ NS_ASSERTION(blobData, "out of memory!!");
+
+ if (blobData) {
+ for (uint32_t i = 0, offset = 0; i < mEncodedBuffers.Length(); i++) {
+ memcpy((uint8_t*)blobData + offset, mEncodedBuffers.ElementAt(i).Elements(),
+ mEncodedBuffers.ElementAt(i).Length());
+ offset += mEncodedBuffers.ElementAt(i).Length();
+ }
+ blob = dom::Blob::CreateMemoryBlob(aParent, blobData, mDataSize,
+ aContentType);
+ mEncodedBuffers.Clear();
+ } else
+ return nullptr;
+ }
+ mDataSize = 0;
+ return blob.forget();
+}
+
+} // namespace mozilla
diff --git a/dom/media/EncodedBufferCache.h b/dom/media/EncodedBufferCache.h
new file mode 100644
index 000000000..3baaa05aa
--- /dev/null
+++ b/dom/media/EncodedBufferCache.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EncodedBufferCache_h_
+#define EncodedBufferCache_h_
+
+#include "nsCOMPtr.h"
+#include "nsTArray.h"
+#include "mozilla/Mutex.h"
+
+struct PRFileDesc;
+
+namespace mozilla {
+
+namespace dom {
+class Blob;
+} // namespace dom
+
+/**
+ * Data is moved into a temporary file when it grows beyond
+ * the maximal size passed in the Init function.
+ * The AppendBuffer and ExtractBlob methods are thread-safe and can be called on
+ * different threads at the same time.
+ */
+class EncodedBufferCache
+{
+public:
+ explicit EncodedBufferCache(uint32_t aMaxMemoryStorage)
+ : mFD(nullptr),
+ mMutex("EncodedBufferCache.Data.Mutex"),
+ mDataSize(0),
+ mMaxMemoryStorage(aMaxMemoryStorage),
+ mTempFileEnabled(false) { }
+ ~EncodedBufferCache()
+ {
+ }
+ // Append buffers in cache, check if the queue is too large then switch to write buffer to file system
+ // aBuf will append to mEncodedBuffers or temporary File, aBuf also be cleared
+ void AppendBuffer(nsTArray<uint8_t> & aBuf);
+ // Read all buffer from memory or file System, also Remove the temporary file or clean the buffers in memory.
+ already_AddRefed<dom::Blob> ExtractBlob(nsISupports* aParent, const nsAString &aContentType);
+
+private:
+ //array for storing the encoded data.
+ nsTArray<nsTArray<uint8_t> > mEncodedBuffers;
+ // File handle for the temporary file
+ PRFileDesc* mFD;
+ // Used to protect the mEncodedBuffer for avoiding AppendBuffer/Consume on different thread at the same time.
+ Mutex mMutex;
+ // the current buffer size can be read
+ uint64_t mDataSize;
+ // The maximal buffer allowed in memory
+ uint32_t mMaxMemoryStorage;
+ // indicate the buffer is stored on temporary file or not
+ bool mTempFileEnabled;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/FileBlockCache.cpp b/dom/media/FileBlockCache.cpp
new file mode 100644
index 000000000..ce6a34cce
--- /dev/null
+++ b/dom/media/FileBlockCache.cpp
@@ -0,0 +1,365 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/SharedThreadPool.h"
+#include "FileBlockCache.h"
+#include "VideoUtils.h"
+#include "prio.h"
+#include <algorithm>
+
+namespace mozilla {
+
+nsresult FileBlockCache::Open(PRFileDesc* aFD)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ NS_ENSURE_TRUE(aFD != nullptr, NS_ERROR_FAILURE);
+ {
+ MonitorAutoLock mon(mFileMonitor);
+ mFD = aFD;
+ }
+ {
+ MonitorAutoLock mon(mDataMonitor);
+ nsresult res = NS_NewThread(getter_AddRefs(mThread),
+ nullptr,
+ SharedThreadPool::kStackSize);
+ mIsOpen = NS_SUCCEEDED(res);
+ return res;
+ }
+}
+
+FileBlockCache::FileBlockCache()
+ : mFileMonitor("MediaCache.Writer.IO.Monitor"),
+ mFD(nullptr),
+ mFDCurrentPos(0),
+ mDataMonitor("MediaCache.Writer.Data.Monitor"),
+ mIsWriteScheduled(false),
+ mIsOpen(false)
+{
+ MOZ_COUNT_CTOR(FileBlockCache);
+}
+
+FileBlockCache::~FileBlockCache()
+{
+ NS_ASSERTION(!mIsOpen, "Should Close() FileBlockCache before destroying");
+ {
+ // Note, mThread will be shutdown by the time this runs, so we won't
+ // block while taking mFileMonitor.
+ MonitorAutoLock mon(mFileMonitor);
+ if (mFD) {
+ PRStatus prrc;
+ prrc = PR_Close(mFD);
+ if (prrc != PR_SUCCESS) {
+ NS_WARNING("PR_Close() failed.");
+ }
+ mFD = nullptr;
+ }
+ }
+ MOZ_COUNT_DTOR(FileBlockCache);
+}
+
+
+void FileBlockCache::Close()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ MonitorAutoLock mon(mDataMonitor);
+
+ mIsOpen = false;
+
+ if (mThread) {
+ // We must shut down the thread in another runnable. This is called
+ // while we're shutting down the media cache, and nsIThread::Shutdown()
+ // can cause events to run before it completes, which could end up
+ // opening more streams, while the media cache is shutting down and
+ // releasing memory etc! Also note we close mFD in the destructor so
+ // as to not disturb any IO that's currently running.
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ if (mainThread) {
+ nsCOMPtr<nsIRunnable> event = new ShutdownThreadEvent(mThread);
+ mainThread->Dispatch(event.forget(), NS_DISPATCH_NORMAL);
+ } else {
+ // we're on Mainthread already, *and* the event queues are already
+ // shut down, so no events should occur - certainly not creations of
+ // new streams.
+ mThread->Shutdown();
+ }
+ }
+}
+
+template<typename Container, typename Value>
+bool
+ContainerContains(const Container& aContainer, const Value& value)
+{
+ return std::find(aContainer.begin(), aContainer.end(), value)
+ != aContainer.end();
+}
+
+nsresult FileBlockCache::WriteBlock(uint32_t aBlockIndex, const uint8_t* aData)
+{
+ MonitorAutoLock mon(mDataMonitor);
+
+ if (!mIsOpen)
+ return NS_ERROR_FAILURE;
+
+ // Check if we've already got a pending write scheduled for this block.
+ mBlockChanges.EnsureLengthAtLeast(aBlockIndex + 1);
+ bool blockAlreadyHadPendingChange = mBlockChanges[aBlockIndex] != nullptr;
+ mBlockChanges[aBlockIndex] = new BlockChange(aData);
+
+ if (!blockAlreadyHadPendingChange || !ContainerContains(mChangeIndexList, aBlockIndex)) {
+ // We either didn't already have a pending change for this block, or we
+ // did but we didn't have an entry for it in mChangeIndexList (we're in the process
+ // of writing it and have removed the block's index out of mChangeIndexList
+ // in Run() but not finished writing the block to file yet). Add the blocks
+ // index to the end of mChangeIndexList to ensure the block is written as
+ // as soon as possible.
+ mChangeIndexList.push_back(aBlockIndex);
+ }
+ NS_ASSERTION(ContainerContains(mChangeIndexList, aBlockIndex), "Must have entry for new block");
+
+ EnsureWriteScheduled();
+
+ return NS_OK;
+}
+
+void FileBlockCache::EnsureWriteScheduled()
+{
+ mDataMonitor.AssertCurrentThreadOwns();
+
+ if (!mIsWriteScheduled) {
+ mThread->Dispatch(this, NS_DISPATCH_NORMAL);
+ mIsWriteScheduled = true;
+ }
+}
+
+nsresult FileBlockCache::Seek(int64_t aOffset)
+{
+ mFileMonitor.AssertCurrentThreadOwns();
+
+ if (mFDCurrentPos != aOffset) {
+ int64_t result = PR_Seek64(mFD, aOffset, PR_SEEK_SET);
+ if (result != aOffset) {
+ NS_WARNING("Failed to seek media cache file");
+ return NS_ERROR_FAILURE;
+ }
+ mFDCurrentPos = result;
+ }
+ return NS_OK;
+}
+
+nsresult FileBlockCache::ReadFromFile(int64_t aOffset,
+ uint8_t* aDest,
+ int32_t aBytesToRead,
+ int32_t& aBytesRead)
+{
+ mFileMonitor.AssertCurrentThreadOwns();
+
+ nsresult res = Seek(aOffset);
+ if (NS_FAILED(res)) return res;
+
+ aBytesRead = PR_Read(mFD, aDest, aBytesToRead);
+ if (aBytesRead <= 0)
+ return NS_ERROR_FAILURE;
+ mFDCurrentPos += aBytesRead;
+
+ return NS_OK;
+}
+
+nsresult FileBlockCache::WriteBlockToFile(int32_t aBlockIndex,
+ const uint8_t* aBlockData)
+{
+ mFileMonitor.AssertCurrentThreadOwns();
+
+ nsresult rv = Seek(BlockIndexToOffset(aBlockIndex));
+ if (NS_FAILED(rv)) return rv;
+
+ int32_t amount = PR_Write(mFD, aBlockData, BLOCK_SIZE);
+ if (amount < BLOCK_SIZE) {
+ NS_WARNING("Failed to write media cache block!");
+ return NS_ERROR_FAILURE;
+ }
+ mFDCurrentPos += BLOCK_SIZE;
+
+ return NS_OK;
+}
+
+nsresult FileBlockCache::MoveBlockInFile(int32_t aSourceBlockIndex,
+ int32_t aDestBlockIndex)
+{
+ mFileMonitor.AssertCurrentThreadOwns();
+
+ uint8_t buf[BLOCK_SIZE];
+ int32_t bytesRead = 0;
+ if (NS_FAILED(ReadFromFile(BlockIndexToOffset(aSourceBlockIndex),
+ buf,
+ BLOCK_SIZE,
+ bytesRead))) {
+ return NS_ERROR_FAILURE;
+ }
+ return WriteBlockToFile(aDestBlockIndex, buf);
+}
+
+nsresult FileBlockCache::Run()
+{
+ MonitorAutoLock mon(mDataMonitor);
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+ NS_ASSERTION(!mChangeIndexList.empty(), "Only dispatch when there's work to do");
+ NS_ASSERTION(mIsWriteScheduled, "Should report write running or scheduled.");
+
+ while (!mChangeIndexList.empty()) {
+ if (!mIsOpen) {
+ // We've been closed, abort, discarding unwritten changes.
+ mIsWriteScheduled = false;
+ return NS_ERROR_FAILURE;
+ }
+
+ // Process each pending change. We pop the index out of the change
+ // list, but leave the BlockChange in mBlockChanges until the change
+ // is written to file. This is so that any read which happens while
+ // we drop mDataMonitor to write will refer to the data's source in
+ // memory, rather than the not-yet up to date data written to file.
+ // This also ensures we will insert a new index into mChangeIndexList
+ // when this happens.
+
+ // Hold a reference to the change, in case another change
+ // overwrites the mBlockChanges entry for this block while we drop
+ // mDataMonitor to take mFileMonitor.
+ int32_t blockIndex = mChangeIndexList.front();
+ mChangeIndexList.pop_front();
+ RefPtr<BlockChange> change = mBlockChanges[blockIndex];
+ MOZ_ASSERT(change,
+ "Change index list should only contain entries for blocks "
+ "with changes");
+ {
+ MonitorAutoUnlock unlock(mDataMonitor);
+ MonitorAutoLock lock(mFileMonitor);
+ if (change->IsWrite()) {
+ WriteBlockToFile(blockIndex, change->mData.get());
+ } else if (change->IsMove()) {
+ MoveBlockInFile(change->mSourceBlockIndex, blockIndex);
+ }
+ }
+ // If a new change has not been made to the block while we dropped
+ // mDataMonitor, clear reference to the old change. Otherwise, the old
+ // reference has been cleared already.
+ if (mBlockChanges[blockIndex] == change) {
+ mBlockChanges[blockIndex] = nullptr;
+ }
+ }
+
+ mIsWriteScheduled = false;
+
+ return NS_OK;
+}
+
+nsresult FileBlockCache::Read(int64_t aOffset,
+ uint8_t* aData,
+ int32_t aLength,
+ int32_t* aBytes)
+{
+ MonitorAutoLock mon(mDataMonitor);
+
+ if (!mFD || (aOffset / BLOCK_SIZE) > INT32_MAX)
+ return NS_ERROR_FAILURE;
+
+ int32_t bytesToRead = aLength;
+ int64_t offset = aOffset;
+ uint8_t* dst = aData;
+ while (bytesToRead > 0) {
+ int32_t blockIndex = static_cast<int32_t>(offset / BLOCK_SIZE);
+ int32_t start = offset % BLOCK_SIZE;
+ int32_t amount = std::min(BLOCK_SIZE - start, bytesToRead);
+
+ // If the block is not yet written to file, we can just read from
+ // the memory buffer, otherwise we need to read from file.
+ int32_t bytesRead = 0;
+ RefPtr<BlockChange> change = mBlockChanges[blockIndex];
+ if (change && change->IsWrite()) {
+ // Block isn't yet written to file. Read from memory buffer.
+ const uint8_t* blockData = change->mData.get();
+ memcpy(dst, blockData + start, amount);
+ bytesRead = amount;
+ } else {
+ if (change && change->IsMove()) {
+ // The target block is the destination of a not-yet-completed move
+ // action, so read from the move's source block from file. Note we
+ // *don't* follow a chain of moves here, as a move's source index
+ // is resolved when MoveBlock() is called, and the move's source's
+ // block could be have itself been subject to a move (or write)
+ // which happened *after* this move was recorded.
+ blockIndex = mBlockChanges[blockIndex]->mSourceBlockIndex;
+ }
+ // Block has been written to file, either as the source block of a move,
+ // or as a stable (all changes made) block. Read the data directly
+ // from file.
+ nsresult res;
+ {
+ MonitorAutoUnlock unlock(mDataMonitor);
+ MonitorAutoLock lock(mFileMonitor);
+ res = ReadFromFile(BlockIndexToOffset(blockIndex) + start,
+ dst,
+ amount,
+ bytesRead);
+ }
+ NS_ENSURE_SUCCESS(res,res);
+ }
+ dst += bytesRead;
+ offset += bytesRead;
+ bytesToRead -= bytesRead;
+ }
+ *aBytes = aLength - bytesToRead;
+ return NS_OK;
+}
+
+nsresult FileBlockCache::MoveBlock(int32_t aSourceBlockIndex, int32_t aDestBlockIndex)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ MonitorAutoLock mon(mDataMonitor);
+
+ if (!mIsOpen)
+ return NS_ERROR_FAILURE;
+
+ mBlockChanges.EnsureLengthAtLeast(std::max(aSourceBlockIndex, aDestBlockIndex) + 1);
+
+ // The source block's contents may be the destination of another pending
+ // move, which in turn can be the destination of another pending move,
+ // etc. Resolve the final source block, so that if one of the blocks in
+ // the chain of moves is overwritten, we don't lose the reference to the
+ // contents of the destination block.
+ int32_t sourceIndex = aSourceBlockIndex;
+ BlockChange* sourceBlock = nullptr;
+ while ((sourceBlock = mBlockChanges[sourceIndex]) &&
+ sourceBlock->IsMove()) {
+ sourceIndex = sourceBlock->mSourceBlockIndex;
+ }
+
+ if (mBlockChanges[aDestBlockIndex] == nullptr ||
+ !ContainerContains(mChangeIndexList, aDestBlockIndex)) {
+ // Only add another entry to the change index list if we don't already
+ // have one for this block. We won't have an entry when either there's
+ // no pending change for this block, or if there is a pending change for
+ // this block and we're in the process of writing it (we've popped the
+ // block's index out of mChangeIndexList in Run() but not finished writing
+ // the block to file yet.
+ mChangeIndexList.push_back(aDestBlockIndex);
+ }
+
+ // If the source block hasn't yet been written to file then the dest block
+ // simply contains that same write. Resolve this as a write instead.
+ if (sourceBlock && sourceBlock->IsWrite()) {
+ mBlockChanges[aDestBlockIndex] = new BlockChange(sourceBlock->mData.get());
+ } else {
+ mBlockChanges[aDestBlockIndex] = new BlockChange(sourceIndex);
+ }
+
+ EnsureWriteScheduled();
+
+ NS_ASSERTION(ContainerContains(mChangeIndexList, aDestBlockIndex),
+ "Should have scheduled block for change");
+
+ return NS_OK;
+}
+
+} // End namespace mozilla.
diff --git a/dom/media/FileBlockCache.h b/dom/media/FileBlockCache.h
new file mode 100644
index 000000000..e23a5c70b
--- /dev/null
+++ b/dom/media/FileBlockCache.h
@@ -0,0 +1,184 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FILE_BLOCK_CACHE_H_
+#define FILE_BLOCK_CACHE_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/UniquePtr.h"
+#include "nsTArray.h"
+#include "MediaCache.h"
+#include "nsDeque.h"
+#include "nsThreadUtils.h"
+#include <deque>
+
+struct PRFileDesc;
+
+namespace mozilla {
+
+// Manages file I/O for the media cache. Data comes in over the network
+// via callbacks on the main thread, however we don't want to write the
+// incoming data to the media cache on the main thread, as this could block
+// causing UI jank.
+//
+// So FileBlockCache provides an abstraction for a temporary file accessible
+// as an array of blocks, which supports a block move operation, and
+// allows synchronous reading and writing from any thread, with writes being
+// buffered so as not to block.
+//
+// Writes and cache block moves (which require reading) are deferred to
+// their own non-main thread. This object also ensures that data which has
+// been scheduled to be written, but hasn't actually *been* written, is read
+// as if it had, i.e. pending writes are cached in readable memory until
+// they're flushed to file.
+//
+// To improve efficiency, writes can only be done at block granularity,
+// whereas reads can be done with byte granularity.
+//
+// Note it's also recommended not to read from the media cache from the main
+// thread to prevent jank.
+//
+// When WriteBlock() or MoveBlock() are called, data about how to complete
+// the block change is added to mBlockChanges, indexed by block index, and
+// the block index is appended to the mChangeIndexList. This enables
+// us to quickly tell if a block has been changed, and ensures we can perform
+// the changes in the correct order. An event is dispatched to perform the
+// changes listed in mBlockChanges to file. Read() checks mBlockChanges and
+// determines the current data to return, reading from file or from
+// mBlockChanges as necessary.
+class FileBlockCache : public Runnable {
+public:
+ enum {
+ BLOCK_SIZE = MediaCacheStream::BLOCK_SIZE
+ };
+
+ FileBlockCache();
+
+protected:
+ ~FileBlockCache();
+
+public:
+ // Assumes ownership of aFD.
+ nsresult Open(PRFileDesc* aFD);
+
+ // Closes writer, shuts down thread.
+ void Close();
+
+ // Can be called on any thread. This defers to a non-main thread.
+ nsresult WriteBlock(uint32_t aBlockIndex, const uint8_t* aData);
+
+ // Performs block writes and block moves on its own thread.
+ NS_IMETHOD Run() override;
+
+ // Synchronously reads data from file. May read from file or memory
+ // depending on whether written blocks have been flushed to file yet.
+ // Not recommended to be called from the main thread, as can cause jank.
+ nsresult Read(int64_t aOffset,
+ uint8_t* aData,
+ int32_t aLength,
+ int32_t* aBytes);
+
+ // Moves a block asynchronously. Can be called on any thread.
+ // This defers file I/O to a non-main thread.
+ nsresult MoveBlock(int32_t aSourceBlockIndex, int32_t aDestBlockIndex);
+
+ // Represents a change yet to be made to a block in the file. The change
+ // is either a write (and the data to be written is stored in this struct)
+ // or a move (and the index of the source block is stored instead).
+ struct BlockChange final {
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BlockChange)
+
+ // This block is waiting in memory to be written.
+ // Stores a copy of the block, so we can write it asynchronously.
+ explicit BlockChange(const uint8_t* aData)
+ : mSourceBlockIndex(-1)
+ {
+ mData = MakeUnique<uint8_t[]>(BLOCK_SIZE);
+ memcpy(mData.get(), aData, BLOCK_SIZE);
+ }
+
+ // This block's contents are located in another file
+ // block, i.e. this block has been moved.
+ explicit BlockChange(int32_t aSourceBlockIndex)
+ : mSourceBlockIndex(aSourceBlockIndex) {}
+
+ UniquePtr<uint8_t[]> mData;
+ const int32_t mSourceBlockIndex;
+
+ bool IsMove() const {
+ return mSourceBlockIndex != -1;
+ }
+ bool IsWrite() const {
+ return mSourceBlockIndex == -1 &&
+ mData.get() != nullptr;
+ }
+
+ private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~BlockChange()
+ {
+ }
+ };
+
+private:
+ int64_t BlockIndexToOffset(int32_t aBlockIndex) {
+ return static_cast<int64_t>(aBlockIndex) * BLOCK_SIZE;
+ }
+
+ // Monitor which controls access to mFD and mFDCurrentPos. Don't hold
+ // mDataMonitor while holding mFileMonitor! mFileMonitor must be owned
+ // while accessing any of the following data fields or methods.
+ Monitor mFileMonitor;
+ // Moves a block already committed to file.
+ nsresult MoveBlockInFile(int32_t aSourceBlockIndex,
+ int32_t aDestBlockIndex);
+ // Seeks file pointer.
+ nsresult Seek(int64_t aOffset);
+ // Reads data from file offset.
+ nsresult ReadFromFile(int64_t aOffset,
+ uint8_t* aDest,
+ int32_t aBytesToRead,
+ int32_t& aBytesRead);
+ nsresult WriteBlockToFile(int32_t aBlockIndex, const uint8_t* aBlockData);
+ // File descriptor we're writing to. This is created externally, but
+ // shutdown by us.
+ PRFileDesc* mFD;
+ // The current file offset in the file.
+ int64_t mFDCurrentPos;
+
+ // Monitor which controls access to all data in this class, except mFD
+ // and mFDCurrentPos. Don't hold mDataMonitor while holding mFileMonitor!
+ // mDataMonitor must be owned while accessing any of the following data
+ // fields or methods.
+ Monitor mDataMonitor;
+ // Ensures we either are running the event to preform IO, or an event
+ // has been dispatched to preform the IO.
+ // mDataMonitor must be owned while calling this.
+ void EnsureWriteScheduled();
+ // Array of block changes to made. If mBlockChanges[offset/BLOCK_SIZE] == nullptr,
+ // then the block has no pending changes to be written, but if
+ // mBlockChanges[offset/BLOCK_SIZE] != nullptr, then either there's a block
+ // cached in memory waiting to be written, or this block is the target of a
+ // block move.
+ nsTArray< RefPtr<BlockChange> > mBlockChanges;
+ // Thread upon which block writes and block moves are performed. This is
+ // created upon open, and shutdown (asynchronously) upon close (on the
+ // main thread).
+ nsCOMPtr<nsIThread> mThread;
+ // Queue of pending block indexes that need to be written or moved.
+ std::deque<int32_t> mChangeIndexList;
+ // True if we've dispatched an event to commit all pending block changes
+ // to file on mThread.
+ bool mIsWriteScheduled;
+ // True if the writer is ready to write data to file.
+ bool mIsOpen;
+};
+
+} // End namespace mozilla.
+
+#endif /* FILE_BLOCK_CACHE_H_ */
diff --git a/dom/media/FrameStatistics.h b/dom/media/FrameStatistics.h
new file mode 100644
index 000000000..e7d382629
--- /dev/null
+++ b/dom/media/FrameStatistics.h
@@ -0,0 +1,143 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FrameStatistics_h_
+#define FrameStatistics_h_
+
+#include "mozilla/ReentrantMonitor.h"
+
+namespace mozilla {
+
+struct FrameStatisticsData
+{
+ // Number of frames parsed and demuxed from media.
+ // Access protected by mReentrantMonitor.
+ uint64_t mParsedFrames = 0;
+
+ // Number of parsed frames which were actually decoded.
+ // Access protected by mReentrantMonitor.
+ uint64_t mDecodedFrames = 0;
+
+ // Number of decoded frames which were actually sent down the rendering
+ // pipeline to be painted ("presented"). Access protected by mReentrantMonitor.
+ uint64_t mPresentedFrames = 0;
+
+ // Number of frames that have been skipped because they have missed their
+ // composition deadline.
+ uint64_t mDroppedFrames = 0;
+
+ // Sum of all inter-keyframe segment durations, in microseconds.
+ // Dividing by count will give the average inter-keyframe time.
+ uint64_t mInterKeyframeSum_us = 0;
+ // Number of inter-keyframe segments summed so far.
+ size_t mInterKeyframeCount = 0;
+
+ // Maximum inter-keyframe segment duration, in microseconds.
+ uint64_t mInterKeyFrameMax_us = 0;
+
+ FrameStatisticsData() = default;
+ FrameStatisticsData(uint64_t aParsed, uint64_t aDecoded, uint64_t aDropped)
+ : mParsedFrames(aParsed)
+ , mDecodedFrames(aDecoded)
+ , mDroppedFrames(aDropped)
+ {}
+
+ void
+ Accumulate(const FrameStatisticsData& aStats)
+ {
+ mParsedFrames += aStats.mParsedFrames;
+ mDecodedFrames += aStats.mDecodedFrames;
+ mPresentedFrames += aStats.mPresentedFrames;
+ mDroppedFrames += aStats.mDroppedFrames;
+ mInterKeyframeSum_us += aStats.mInterKeyframeSum_us;
+ mInterKeyframeCount += aStats.mInterKeyframeCount;
+ // It doesn't make sense to add max numbers, instead keep the bigger one.
+ if (mInterKeyFrameMax_us < aStats.mInterKeyFrameMax_us) {
+ mInterKeyFrameMax_us = aStats.mInterKeyFrameMax_us;
+ }
+ }
+};
+
+// Frame decoding/painting related performance counters.
+// Threadsafe.
+class FrameStatistics
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FrameStatistics);
+
+ FrameStatistics()
+ : mReentrantMonitor("FrameStats")
+ {}
+
+ // Returns a copy of all frame statistics data.
+ // Can be called on any thread.
+ FrameStatisticsData GetFrameStatisticsData() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData;
+ }
+
+ // Returns number of frames which have been parsed from the media.
+ // Can be called on any thread.
+ uint64_t GetParsedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mParsedFrames;
+ }
+
+ // Returns the number of parsed frames which have been decoded.
+ // Can be called on any thread.
+ uint64_t GetDecodedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mDecodedFrames;
+ }
+
+ // Returns the number of decoded frames which have been sent to the rendering
+ // pipeline for painting ("presented").
+ // Can be called on any thread.
+ uint64_t GetPresentedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mPresentedFrames;
+ }
+
+ // Returns the number of frames that have been skipped because they have
+ // missed their composition deadline.
+ uint64_t GetDroppedFrames() const
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mFrameStatisticsData.mDroppedFrames;
+ }
+
+ // Increments the parsed and decoded frame counters by the passed in counts.
+ // Can be called on any thread.
+ void NotifyDecodedFrames(const FrameStatisticsData& aStats)
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mFrameStatisticsData.Accumulate(aStats);
+ }
+
+ // Increments the presented frame counters.
+ // Can be called on any thread.
+ void NotifyPresentedFrame()
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ ++mFrameStatisticsData.mPresentedFrames;
+ }
+
+private:
+ ~FrameStatistics() {}
+
+ // ReentrantMonitor to protect access of playback statistics.
+ mutable ReentrantMonitor mReentrantMonitor;
+
+ FrameStatisticsData mFrameStatisticsData;
+};
+
+} // namespace mozilla
+
+#endif // FrameStatistics_h_
diff --git a/dom/media/GetUserMediaRequest.cpp b/dom/media/GetUserMediaRequest.cpp
new file mode 100644
index 000000000..098f3e4bc
--- /dev/null
+++ b/dom/media/GetUserMediaRequest.cpp
@@ -0,0 +1,74 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "base/basictypes.h"
+#include "GetUserMediaRequest.h"
+#include "mozilla/dom/MediaStreamBinding.h"
+#include "mozilla/dom/GetUserMediaRequestBinding.h"
+#include "nsIScriptGlobalObject.h"
+#include "nsPIDOMWindow.h"
+
+namespace mozilla {
+namespace dom {
+
+GetUserMediaRequest::GetUserMediaRequest(
+ nsPIDOMWindowInner* aInnerWindow,
+ const nsAString& aCallID,
+ const MediaStreamConstraints& aConstraints,
+ bool aIsSecure)
+ : mInnerWindowID(aInnerWindow->WindowID())
+ , mOuterWindowID(aInnerWindow->GetOuterWindow()->WindowID())
+ , mCallID(aCallID)
+ , mConstraints(new MediaStreamConstraints(aConstraints))
+ , mIsSecure(aIsSecure)
+{
+}
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(GetUserMediaRequest)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(GetUserMediaRequest)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(GetUserMediaRequest)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(GetUserMediaRequest)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+JSObject*
+GetUserMediaRequest::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return GetUserMediaRequestBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports* GetUserMediaRequest::GetParentObject()
+{
+ return nullptr;
+}
+
+void GetUserMediaRequest::GetCallID(nsString& retval)
+{
+ retval = mCallID;
+}
+
+uint64_t GetUserMediaRequest::WindowID()
+{
+ return mOuterWindowID;
+}
+
+uint64_t GetUserMediaRequest::InnerWindowID()
+{
+ return mInnerWindowID;
+}
+
+bool GetUserMediaRequest::IsSecure()
+{
+ return mIsSecure;
+}
+
+void
+GetUserMediaRequest::GetConstraints(MediaStreamConstraints &result)
+{
+ result = *mConstraints;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/GetUserMediaRequest.h b/dom/media/GetUserMediaRequest.h
new file mode 100644
index 000000000..d4eee10f9
--- /dev/null
+++ b/dom/media/GetUserMediaRequest.h
@@ -0,0 +1,52 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GetUserMediaRequest_h__
+#define GetUserMediaRequest_h__
+
+#include "mozilla/ErrorResult.h"
+#include "nsISupportsImpl.h"
+#include "nsAutoPtr.h"
+#include "nsWrapperCache.h"
+#include "mozilla/dom/BindingUtils.h"
+#include "nsPIDOMWindow.h"
+
+namespace mozilla {
+namespace dom {
+
+struct MediaStreamConstraints;
+
+class GetUserMediaRequest : public nsISupports, public nsWrapperCache
+{
+public:
+ GetUserMediaRequest(nsPIDOMWindowInner* aInnerWindow,
+ const nsAString& aCallID,
+ const MediaStreamConstraints& aConstraints,
+ bool aIsSecure);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(GetUserMediaRequest)
+
+ JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) override;
+ nsISupports* GetParentObject();
+
+ uint64_t WindowID();
+ uint64_t InnerWindowID();
+ bool IsSecure();
+ void GetCallID(nsString& retval);
+ void GetConstraints(MediaStreamConstraints &result);
+
+private:
+ virtual ~GetUserMediaRequest() {}
+
+ uint64_t mInnerWindowID, mOuterWindowID;
+ const nsString mCallID;
+ nsAutoPtr<MediaStreamConstraints> mConstraints;
+ bool mIsSecure;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // GetUserMediaRequest_h__
diff --git a/dom/media/GraphDriver.cpp b/dom/media/GraphDriver.cpp
new file mode 100644
index 000000000..9b74bd58c
--- /dev/null
+++ b/dom/media/GraphDriver.cpp
@@ -0,0 +1,1217 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <MediaStreamGraphImpl.h>
+#include "mozilla/dom/AudioContext.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/Unused.h"
+#include "CubebUtils.h"
+
+#ifdef MOZ_WEBRTC
+#include "webrtc/MediaEngineWebRTC.h"
+#endif
+
+#ifdef XP_MACOSX
+#include <sys/sysctl.h>
+#endif
+
+extern mozilla::LazyLogModule gMediaStreamGraphLog;
+#define STREAM_LOG(type, msg) MOZ_LOG(gMediaStreamGraphLog, type, msg)
+
+// We don't use NSPR log here because we want this interleaved with adb logcat
+// on Android/B2G
+// #define ENABLE_LIFECYCLE_LOG
+#ifdef ENABLE_LIFECYCLE_LOG
+#ifdef ANDROID
+#include "android/log.h"
+#define LIFECYCLE_LOG(...) __android_log_print(ANDROID_LOG_INFO, "Gecko - MSG" , __VA_ARGS__); printf(__VA_ARGS__);printf("\n");
+#else
+#define LIFECYCLE_LOG(...) printf(__VA_ARGS__);printf("\n");
+#endif
+#else
+#define LIFECYCLE_LOG(...)
+#endif
+
+namespace mozilla {
+
+StaticRefPtr<nsIThreadPool> AsyncCubebTask::sThreadPool;
+
+struct AutoProfilerUnregisterThread
+{
+ // The empty ctor is used to silence a pre-4.8.0 GCC unused variable warning.
+ AutoProfilerUnregisterThread()
+ {
+ }
+
+ ~AutoProfilerUnregisterThread()
+ {
+ profiler_unregister_thread();
+ }
+};
+
+GraphDriver::GraphDriver(MediaStreamGraphImpl* aGraphImpl)
+ : mIterationStart(0),
+ mIterationEnd(0),
+ mGraphImpl(aGraphImpl),
+ mWaitState(WAITSTATE_RUNNING),
+ mCurrentTimeStamp(TimeStamp::Now()),
+ mPreviousDriver(nullptr),
+ mNextDriver(nullptr)
+{ }
+
+void GraphDriver::SetGraphTime(GraphDriver* aPreviousDriver,
+ GraphTime aLastSwitchNextIterationStart,
+ GraphTime aLastSwitchNextIterationEnd)
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ // We set mIterationEnd here, because the first thing a driver do when it
+ // does an iteration is to update graph times, so we are in fact setting
+ // mIterationStart of the next iteration by setting the end of the previous
+ // iteration.
+ mIterationStart = aLastSwitchNextIterationStart;
+ mIterationEnd = aLastSwitchNextIterationEnd;
+
+ MOZ_ASSERT(!PreviousDriver());
+ MOZ_ASSERT(aPreviousDriver);
+
+ STREAM_LOG(LogLevel::Debug, ("Setting previous driver: %p (%s)",
+ aPreviousDriver,
+ aPreviousDriver->AsAudioCallbackDriver()
+ ? "AudioCallbackDriver"
+ : "SystemClockDriver"));
+ SetPreviousDriver(aPreviousDriver);
+}
+
+void GraphDriver::SwitchAtNextIteration(GraphDriver* aNextDriver)
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ LIFECYCLE_LOG("Switching to new driver: %p (%s)",
+ aNextDriver, aNextDriver->AsAudioCallbackDriver() ?
+ "AudioCallbackDriver" : "SystemClockDriver");
+ if (mNextDriver &&
+ mNextDriver != GraphImpl()->CurrentDriver()) {
+ LIFECYCLE_LOG("Discarding previous next driver: %p (%s)",
+ mNextDriver.get(), mNextDriver->AsAudioCallbackDriver() ?
+ "AudioCallbackDriver" : "SystemClockDriver");
+ }
+ SetNextDriver(aNextDriver);
+}
+
+GraphTime
+GraphDriver::StateComputedTime() const
+{
+ return mGraphImpl->mStateComputedTime;
+}
+
+void GraphDriver::EnsureNextIteration()
+{
+ mGraphImpl->EnsureNextIteration();
+}
+
+void GraphDriver::Shutdown()
+{
+ if (AsAudioCallbackDriver()) {
+ LIFECYCLE_LOG("Releasing audio driver off main thread (GraphDriver::Shutdown).\n");
+ RefPtr<AsyncCubebTask> releaseEvent =
+ new AsyncCubebTask(AsAudioCallbackDriver(), AsyncCubebOperation::SHUTDOWN);
+ releaseEvent->Dispatch(NS_DISPATCH_SYNC);
+ } else {
+ Stop();
+ }
+}
+
+bool GraphDriver::Switching()
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ return mNextDriver || mPreviousDriver;
+}
+
+GraphDriver* GraphDriver::NextDriver()
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ return mNextDriver;
+}
+
+GraphDriver* GraphDriver::PreviousDriver()
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ return mPreviousDriver;
+}
+
+void GraphDriver::SetNextDriver(GraphDriver* aNextDriver)
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ mNextDriver = aNextDriver;
+}
+
+void GraphDriver::SetPreviousDriver(GraphDriver* aPreviousDriver)
+{
+ GraphImpl()->GetMonitor().AssertCurrentThreadOwns();
+ mPreviousDriver = aPreviousDriver;
+}
+
+ThreadedDriver::ThreadedDriver(MediaStreamGraphImpl* aGraphImpl)
+ : GraphDriver(aGraphImpl)
+{ }
+
+class MediaStreamGraphShutdownThreadRunnable : public Runnable {
+public:
+ explicit MediaStreamGraphShutdownThreadRunnable(already_AddRefed<nsIThread> aThread)
+ : mThread(aThread)
+ {
+ }
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mThread);
+
+ mThread->Shutdown();
+ mThread = nullptr;
+ return NS_OK;
+ }
+private:
+ nsCOMPtr<nsIThread> mThread;
+};
+
+ThreadedDriver::~ThreadedDriver()
+{
+ if (mThread) {
+ if (NS_IsMainThread()) {
+ mThread->Shutdown();
+ } else {
+ nsCOMPtr<nsIRunnable> event =
+ new MediaStreamGraphShutdownThreadRunnable(mThread.forget());
+ NS_DispatchToMainThread(event);
+ }
+ }
+}
+class MediaStreamGraphInitThreadRunnable : public Runnable {
+public:
+ explicit MediaStreamGraphInitThreadRunnable(ThreadedDriver* aDriver)
+ : mDriver(aDriver)
+ {
+ }
+ NS_IMETHOD Run() override
+ {
+ char aLocal;
+ STREAM_LOG(LogLevel::Debug, ("Starting system thread"));
+ profiler_register_thread("MediaStreamGraph", &aLocal);
+ LIFECYCLE_LOG("Starting a new system driver for graph %p\n",
+ mDriver->mGraphImpl);
+
+ RefPtr<GraphDriver> previousDriver;
+ {
+ MonitorAutoLock mon(mDriver->mGraphImpl->GetMonitor());
+ previousDriver = mDriver->PreviousDriver();
+ }
+ if (previousDriver) {
+ LIFECYCLE_LOG("%p releasing an AudioCallbackDriver(%p), for graph %p\n",
+ mDriver,
+ previousDriver,
+ mDriver->GraphImpl());
+ MOZ_ASSERT(!mDriver->AsAudioCallbackDriver());
+ RefPtr<AsyncCubebTask> releaseEvent =
+ new AsyncCubebTask(previousDriver->AsAudioCallbackDriver(), AsyncCubebOperation::SHUTDOWN);
+ releaseEvent->Dispatch();
+
+ MonitorAutoLock mon(mDriver->mGraphImpl->GetMonitor());
+ mDriver->SetPreviousDriver(nullptr);
+ } else {
+ MonitorAutoLock mon(mDriver->mGraphImpl->GetMonitor());
+ MOZ_ASSERT(mDriver->mGraphImpl->MessagesQueued() ||
+ mDriver->mGraphImpl->mForceShutDown, "Don't start a graph without messages queued.");
+ mDriver->mGraphImpl->SwapMessageQueues();
+ }
+
+ mDriver->RunThread();
+ return NS_OK;
+ }
+private:
+ RefPtr<ThreadedDriver> mDriver;
+};
+
+void
+ThreadedDriver::Start()
+{
+ LIFECYCLE_LOG("Starting thread for a SystemClockDriver %p\n", mGraphImpl);
+ Unused << NS_WARN_IF(mThread);
+ if (!mThread) { // Ensure we haven't already started it
+ nsCOMPtr<nsIRunnable> event = new MediaStreamGraphInitThreadRunnable(this);
+ // Note: mThread may be null during event->Run() if we pass to NewNamedThread! See AudioInitTask
+ nsresult rv = NS_NewNamedThread("MediaStreamGrph", getter_AddRefs(mThread));
+ if (NS_SUCCEEDED(rv)) {
+ mThread->Dispatch(event, NS_DISPATCH_NORMAL);
+ }
+ }
+}
+
+void
+ThreadedDriver::Resume()
+{
+ Start();
+}
+
+void
+ThreadedDriver::Revive()
+{
+ // Note: only called on MainThread, without monitor
+ // We know were weren't in a running state
+ STREAM_LOG(LogLevel::Debug, ("AudioCallbackDriver reviving."));
+ // If we were switching, switch now. Otherwise, tell thread to run the main
+ // loop again.
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ if (NextDriver()) {
+ NextDriver()->SetGraphTime(this, mIterationStart, mIterationEnd);
+ mGraphImpl->SetCurrentDriver(NextDriver());
+ NextDriver()->Start();
+ } else {
+ nsCOMPtr<nsIRunnable> event = new MediaStreamGraphInitThreadRunnable(this);
+ mThread->Dispatch(event, NS_DISPATCH_NORMAL);
+ }
+}
+
+void
+ThreadedDriver::RemoveCallback()
+{
+}
+
+void
+ThreadedDriver::Stop()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Must be called on main thread");
+ // mGraph's thread is not running so it's OK to do whatever here
+ STREAM_LOG(LogLevel::Debug, ("Stopping threads for MediaStreamGraph %p", this));
+
+ if (mThread) {
+ mThread->Shutdown();
+ mThread = nullptr;
+ }
+}
+
+SystemClockDriver::SystemClockDriver(MediaStreamGraphImpl* aGraphImpl)
+ : ThreadedDriver(aGraphImpl),
+ mInitialTimeStamp(TimeStamp::Now()),
+ mLastTimeStamp(TimeStamp::Now()),
+ mIsFallback(false)
+{}
+
+SystemClockDriver::~SystemClockDriver()
+{ }
+
+void
+SystemClockDriver::MarkAsFallback()
+{
+ mIsFallback = true;
+}
+
+bool
+SystemClockDriver::IsFallback()
+{
+ return mIsFallback;
+}
+
+void
+ThreadedDriver::RunThread()
+{
+ AutoProfilerUnregisterThread autoUnregister;
+
+ while (true) {
+ mIterationStart = IterationEnd();
+ mIterationEnd += GetIntervalForIteration();
+
+ GraphTime stateComputedTime = StateComputedTime();
+ if (stateComputedTime < mIterationEnd) {
+ STREAM_LOG(LogLevel::Warning, ("Media graph global underrun detected"));
+ mIterationEnd = stateComputedTime;
+ }
+
+ if (mIterationStart >= mIterationEnd) {
+ NS_ASSERTION(mIterationStart == mIterationEnd ,
+ "Time can't go backwards!");
+ // This could happen due to low clock resolution, maybe?
+ STREAM_LOG(LogLevel::Debug, ("Time did not advance"));
+ }
+
+ GraphTime nextStateComputedTime =
+ mGraphImpl->RoundUpToNextAudioBlock(
+ mIterationEnd + mGraphImpl->MillisecondsToMediaTime(AUDIO_TARGET_MS));
+ if (nextStateComputedTime < stateComputedTime) {
+ // A previous driver may have been processing further ahead of
+ // iterationEnd.
+ STREAM_LOG(LogLevel::Warning,
+ ("Prevent state from going backwards. interval[%ld; %ld] state[%ld; %ld]",
+ (long)mIterationStart, (long)mIterationEnd,
+ (long)stateComputedTime, (long)nextStateComputedTime));
+ nextStateComputedTime = stateComputedTime;
+ }
+ STREAM_LOG(LogLevel::Verbose,
+ ("interval[%ld; %ld] state[%ld; %ld]",
+ (long)mIterationStart, (long)mIterationEnd,
+ (long)stateComputedTime, (long)nextStateComputedTime));
+
+ bool stillProcessing = mGraphImpl->OneIteration(nextStateComputedTime);
+
+ if (!stillProcessing) {
+ // Enter shutdown mode. The stable-state handler will detect this
+ // and complete shutdown if the graph does not get restarted.
+ mGraphImpl->SignalMainThreadCleanup();
+ return;
+ }
+ MonitorAutoLock lock(GraphImpl()->GetMonitor());
+ if (NextDriver()) {
+ STREAM_LOG(LogLevel::Debug, ("Switching to AudioCallbackDriver"));
+ RemoveCallback();
+ NextDriver()->SetGraphTime(this, mIterationStart, mIterationEnd);
+ mGraphImpl->SetCurrentDriver(NextDriver());
+ NextDriver()->Start();
+ return;
+ }
+ }
+}
+
+MediaTime
+SystemClockDriver::GetIntervalForIteration()
+{
+ TimeStamp now = TimeStamp::Now();
+ MediaTime interval =
+ mGraphImpl->SecondsToMediaTime((now - mCurrentTimeStamp).ToSeconds());
+ mCurrentTimeStamp = now;
+
+ MOZ_LOG(gMediaStreamGraphLog, LogLevel::Verbose,
+ ("Updating current time to %f (real %f, StateComputedTime() %f)",
+ mGraphImpl->MediaTimeToSeconds(IterationEnd() + interval),
+ (now - mInitialTimeStamp).ToSeconds(),
+ mGraphImpl->MediaTimeToSeconds(StateComputedTime())));
+
+ return interval;
+}
+
+TimeStamp
+OfflineClockDriver::GetCurrentTimeStamp()
+{
+ MOZ_CRASH("This driver does not support getting the current timestamp.");
+ return TimeStamp();
+}
+
+void
+SystemClockDriver::WaitForNextIteration()
+{
+ mGraphImpl->GetMonitor().AssertCurrentThreadOwns();
+
+ PRIntervalTime timeout = PR_INTERVAL_NO_TIMEOUT;
+ TimeStamp now = TimeStamp::Now();
+
+ // This lets us avoid hitting the Atomic twice when we know we won't sleep
+ bool another = mGraphImpl->mNeedAnotherIteration; // atomic
+ if (!another) {
+ mGraphImpl->mGraphDriverAsleep = true; // atomic
+ mWaitState = WAITSTATE_WAITING_INDEFINITELY;
+ }
+ // NOTE: mNeedAnotherIteration while also atomic may have changed before
+ // we could set mGraphDriverAsleep, so we must re-test it.
+ // (EnsureNextIteration sets mNeedAnotherIteration, then tests
+ // mGraphDriverAsleep
+ if (another || mGraphImpl->mNeedAnotherIteration) { // atomic
+ int64_t timeoutMS = MEDIA_GRAPH_TARGET_PERIOD_MS -
+ int64_t((now - mCurrentTimeStamp).ToMilliseconds());
+ // Make sure timeoutMS doesn't overflow 32 bits by waking up at
+ // least once a minute, if we need to wake up at all
+ timeoutMS = std::max<int64_t>(0, std::min<int64_t>(timeoutMS, 60*1000));
+ timeout = PR_MillisecondsToInterval(uint32_t(timeoutMS));
+ STREAM_LOG(LogLevel::Verbose,
+ ("Waiting for next iteration; at %f, timeout=%f",
+ (now - mInitialTimeStamp).ToSeconds(), timeoutMS/1000.0));
+ if (mWaitState == WAITSTATE_WAITING_INDEFINITELY) {
+ mGraphImpl->mGraphDriverAsleep = false; // atomic
+ }
+ mWaitState = WAITSTATE_WAITING_FOR_NEXT_ITERATION;
+ }
+ if (timeout > 0) {
+ mGraphImpl->GetMonitor().Wait(timeout);
+ STREAM_LOG(LogLevel::Verbose, ("Resuming after timeout; at %f, elapsed=%f",
+ (TimeStamp::Now() - mInitialTimeStamp).ToSeconds(),
+ (TimeStamp::Now() - now).ToSeconds()));
+ }
+
+ if (mWaitState == WAITSTATE_WAITING_INDEFINITELY) {
+ mGraphImpl->mGraphDriverAsleep = false; // atomic
+ }
+ // Note: this can race against the EnsureNextIteration setting
+ // WAITSTATE_RUNNING and setting mGraphDriverAsleep to false, so you can
+ // have an iteration with WAITSTATE_WAKING_UP instead of RUNNING.
+ mWaitState = WAITSTATE_RUNNING;
+ mGraphImpl->mNeedAnotherIteration = false; // atomic
+}
+
+void SystemClockDriver::WakeUp()
+{
+ mGraphImpl->GetMonitor().AssertCurrentThreadOwns();
+ // Note: this can race against the thread setting WAITSTATE_RUNNING and
+ // setting mGraphDriverAsleep to false, so you can have an iteration
+ // with WAITSTATE_WAKING_UP instead of RUNNING.
+ mWaitState = WAITSTATE_WAKING_UP;
+ mGraphImpl->mGraphDriverAsleep = false; // atomic
+ mGraphImpl->GetMonitor().Notify();
+}
+
+OfflineClockDriver::OfflineClockDriver(MediaStreamGraphImpl* aGraphImpl, GraphTime aSlice)
+ : ThreadedDriver(aGraphImpl),
+ mSlice(aSlice)
+{
+
+}
+
+OfflineClockDriver::~OfflineClockDriver()
+{
+}
+
+MediaTime
+OfflineClockDriver::GetIntervalForIteration()
+{
+ return mGraphImpl->MillisecondsToMediaTime(mSlice);
+}
+
+void
+OfflineClockDriver::WaitForNextIteration()
+{
+ // No op: we want to go as fast as possible when we are offline
+}
+
+void
+OfflineClockDriver::WakeUp()
+{
+ MOZ_ASSERT(false, "An offline graph should not have to wake up.");
+}
+
+AsyncCubebTask::AsyncCubebTask(AudioCallbackDriver* aDriver, AsyncCubebOperation aOperation)
+ : mDriver(aDriver),
+ mOperation(aOperation),
+ mShutdownGrip(aDriver->GraphImpl())
+{
+ NS_WARNING_ASSERTION(mDriver->mAudioStream || aOperation == INIT,
+ "No audio stream!");
+}
+
+AsyncCubebTask::~AsyncCubebTask()
+{
+}
+
+/* static */
+nsresult
+AsyncCubebTask::EnsureThread()
+{
+ if (!sThreadPool) {
+ nsCOMPtr<nsIThreadPool> threadPool =
+ SharedThreadPool::Get(NS_LITERAL_CSTRING("CubebOperation"), 1);
+ sThreadPool = threadPool;
+ // Need to null this out before xpcom-shutdown-threads Observers run
+ // since we don't know the order that the shutdown-threads observers
+ // will run. ClearOnShutdown guarantees it runs first.
+ if (!NS_IsMainThread()) {
+ NS_DispatchToMainThread(NS_NewRunnableFunction([]() -> void {
+ ClearOnShutdown(&sThreadPool, ShutdownPhase::ShutdownThreads);
+ }));
+ } else {
+ ClearOnShutdown(&sThreadPool, ShutdownPhase::ShutdownThreads);
+ }
+
+ const uint32_t kIdleThreadTimeoutMs = 2000;
+
+ nsresult rv = sThreadPool->SetIdleThreadTimeout(PR_MillisecondsToInterval(kIdleThreadTimeoutMs));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+AsyncCubebTask::Run()
+{
+ MOZ_ASSERT(mDriver);
+
+ switch(mOperation) {
+ case AsyncCubebOperation::INIT: {
+ LIFECYCLE_LOG("AsyncCubebOperation::INIT driver=%p\n", mDriver.get());
+ mDriver->Init();
+ mDriver->CompleteAudioContextOperations(mOperation);
+ break;
+ }
+ case AsyncCubebOperation::SHUTDOWN: {
+ LIFECYCLE_LOG("AsyncCubebOperation::SHUTDOWN driver=%p\n", mDriver.get());
+ mDriver->Stop();
+
+ mDriver->CompleteAudioContextOperations(mOperation);
+
+ mDriver = nullptr;
+ mShutdownGrip = nullptr;
+ break;
+ }
+ default:
+ MOZ_CRASH("Operation not implemented.");
+ }
+
+ // The thread will kill itself after a bit
+ return NS_OK;
+}
+
+StreamAndPromiseForOperation::StreamAndPromiseForOperation(MediaStream* aStream,
+ void* aPromise,
+ dom::AudioContextOperation aOperation)
+ : mStream(aStream)
+ , mPromise(aPromise)
+ , mOperation(aOperation)
+{
+ // MOZ_ASSERT(aPromise);
+}
+
+AudioCallbackDriver::AudioCallbackDriver(MediaStreamGraphImpl* aGraphImpl)
+ : GraphDriver(aGraphImpl)
+ , mSampleRate(0)
+ , mInputChannels(1)
+ , mIterationDurationMS(MEDIA_GRAPH_TARGET_PERIOD_MS)
+ , mStarted(false)
+ , mAudioInput(nullptr)
+ , mAudioChannel(aGraphImpl->AudioChannel())
+ , mAddedMixer(false)
+ , mInCallback(false)
+ , mMicrophoneActive(false)
+ , mShouldFallbackIfError(false)
+ , mFromFallback(false)
+{
+ STREAM_LOG(LogLevel::Debug, ("AudioCallbackDriver ctor for graph %p", aGraphImpl));
+}
+
+AudioCallbackDriver::~AudioCallbackDriver()
+{
+ MOZ_ASSERT(mPromisesForOperation.IsEmpty());
+}
+
+bool IsMacbookOrMacbookAir()
+{
+#ifdef XP_MACOSX
+ size_t len = 0;
+ sysctlbyname("hw.model", NULL, &len, NULL, 0);
+ if (len) {
+ UniquePtr<char[]> model(new char[len]);
+ // This string can be
+ // MacBook%d,%d for a normal MacBook
+ // MacBookPro%d,%d for a MacBook Pro
+ // MacBookAir%d,%d for a Macbook Air
+ sysctlbyname("hw.model", model.get(), &len, NULL, 0);
+ char* substring = strstr(model.get(), "MacBook");
+ if (substring) {
+ const size_t offset = strlen("MacBook");
+ if (strncmp(model.get() + offset, "Air", len - offset) ||
+ isdigit(model[offset + 1])) {
+ return true;
+ }
+ }
+ return false;
+ }
+#endif
+ return false;
+}
+
+void
+AudioCallbackDriver::Init()
+{
+ cubeb* cubebContext = CubebUtils::GetCubebContext();
+ if (!cubebContext) {
+ NS_WARNING("Could not get cubeb context.");
+ if (!mFromFallback) {
+ CubebUtils::ReportCubebStreamInitFailure(true);
+ }
+ return;
+ }
+
+ cubeb_stream_params output;
+ cubeb_stream_params input;
+ uint32_t latency_frames;
+ bool firstStream = CubebUtils::GetFirstStream();
+
+ MOZ_ASSERT(!NS_IsMainThread(),
+ "This is blocking and should never run on the main thread.");
+
+ mSampleRate = output.rate = CubebUtils::PreferredSampleRate();
+
+#if defined(__ANDROID__)
+#if defined(MOZ_B2G)
+ output.stream_type = CubebUtils::ConvertChannelToCubebType(mAudioChannel);
+#else
+ output.stream_type = CUBEB_STREAM_TYPE_MUSIC;
+#endif
+ if (output.stream_type == CUBEB_STREAM_TYPE_MAX) {
+ NS_WARNING("Bad stream type");
+ return;
+ }
+#else
+ (void)mAudioChannel;
+#endif
+
+ output.channels = mGraphImpl->AudioChannelCount();
+ if (AUDIO_OUTPUT_FORMAT == AUDIO_FORMAT_S16) {
+ output.format = CUBEB_SAMPLE_S16NE;
+ } else {
+ output.format = CUBEB_SAMPLE_FLOAT32NE;
+ }
+
+ Maybe<uint32_t> latencyPref = CubebUtils::GetCubebMSGLatencyInFrames();
+ if (latencyPref) {
+ latency_frames = latencyPref.value();
+ } else {
+ if (cubeb_get_min_latency(cubebContext, output, &latency_frames) != CUBEB_OK) {
+ NS_WARNING("Could not get minimal latency from cubeb.");
+ }
+ }
+
+ // Macbook and MacBook air don't have enough CPU to run very low latency
+ // MediaStreamGraphs, cap the minimal latency to 512 frames int this case.
+ if (IsMacbookOrMacbookAir()) {
+ latency_frames = std::max((uint32_t) 512, latency_frames);
+ }
+
+
+ input = output;
+ input.channels = mInputChannels; // change to support optional stereo capture
+
+ cubeb_stream* stream = nullptr;
+ CubebUtils::AudioDeviceID input_id = nullptr, output_id = nullptr;
+ // We have to translate the deviceID values to cubeb devid's since those can be
+ // freed whenever enumerate is called.
+ {
+#ifdef MOZ_WEBRTC
+ StaticMutexAutoLock lock(AudioInputCubeb::Mutex());
+#endif
+ if ((!mGraphImpl->mInputWanted
+#ifdef MOZ_WEBRTC
+ || AudioInputCubeb::GetDeviceID(mGraphImpl->mInputDeviceID, input_id)
+#endif
+ ) &&
+ (mGraphImpl->mOutputDeviceID == -1 // pass nullptr for ID for default output
+#ifdef MOZ_WEBRTC
+ // XXX we should figure out how we would use a deviceID for output without webrtc.
+ // Currently we don't set this though, so it's ok
+ || AudioInputCubeb::GetDeviceID(mGraphImpl->mOutputDeviceID, output_id)
+#endif
+ ) &&
+ // XXX Only pass input input if we have an input listener. Always
+ // set up output because it's easier, and it will just get silence.
+ // XXX Add support for adding/removing an input listener later.
+ cubeb_stream_init(cubebContext, &stream,
+ "AudioCallbackDriver",
+ input_id,
+ mGraphImpl->mInputWanted ? &input : nullptr,
+ output_id,
+ mGraphImpl->mOutputWanted ? &output : nullptr, latency_frames,
+ DataCallback_s, StateCallback_s, this) == CUBEB_OK) {
+ mAudioStream.own(stream);
+ DebugOnly<int> rv = cubeb_stream_set_volume(mAudioStream, CubebUtils::GetVolumeScale());
+ NS_WARNING_ASSERTION(
+ rv == CUBEB_OK,
+ "Could not set the audio stream volume in GraphDriver.cpp");
+ CubebUtils::ReportCubebBackendUsed();
+ } else {
+#ifdef MOZ_WEBRTC
+ StaticMutexAutoUnlock unlock(AudioInputCubeb::Mutex());
+#endif
+ NS_WARNING("Could not create a cubeb stream for MediaStreamGraph, falling back to a SystemClockDriver");
+ // Only report failures when we're not coming from a driver that was
+ // created itself as a fallback driver because of a previous audio driver
+ // failure.
+ if (!mFromFallback) {
+ CubebUtils::ReportCubebStreamInitFailure(firstStream);
+ }
+ // Fall back to a driver using a normal thread. If needed,
+ // the graph will try to re-open an audio stream later.
+ MonitorAutoLock lock(GraphImpl()->GetMonitor());
+ SystemClockDriver* nextDriver = new SystemClockDriver(GraphImpl());
+ SetNextDriver(nextDriver);
+ nextDriver->MarkAsFallback();
+ nextDriver->SetGraphTime(this, mIterationStart, mIterationEnd);
+ // We're not using SwitchAtNextIteration here, because there
+ // won't be a next iteration if we don't restart things manually:
+ // the audio stream just signaled that it's in error state.
+ mGraphImpl->SetCurrentDriver(nextDriver);
+ nextDriver->Start();
+ return;
+ }
+ }
+ bool aec;
+ Unused << mGraphImpl->AudioTrackPresent(aec);
+ SetMicrophoneActive(aec);
+
+ cubeb_stream_register_device_changed_callback(mAudioStream,
+ AudioCallbackDriver::DeviceChangedCallback_s);
+
+ StartStream();
+
+ STREAM_LOG(LogLevel::Debug, ("AudioCallbackDriver started."));
+}
+
+
+void
+AudioCallbackDriver::Destroy()
+{
+ STREAM_LOG(LogLevel::Debug, ("AudioCallbackDriver destroyed."));
+ mAudioInput = nullptr;
+ mAudioStream.reset();
+}
+
+void
+AudioCallbackDriver::Resume()
+{
+ STREAM_LOG(LogLevel::Debug, ("Resuming audio threads for MediaStreamGraph %p", mGraphImpl));
+ if (cubeb_stream_start(mAudioStream) != CUBEB_OK) {
+ NS_WARNING("Could not start cubeb stream for MSG.");
+ }
+}
+
+void
+AudioCallbackDriver::Start()
+{
+ if (mPreviousDriver) {
+ if (mPreviousDriver->AsAudioCallbackDriver()) {
+ LIFECYCLE_LOG("Releasing audio driver off main thread.");
+ RefPtr<AsyncCubebTask> releaseEvent =
+ new AsyncCubebTask(mPreviousDriver->AsAudioCallbackDriver(),
+ AsyncCubebOperation::SHUTDOWN);
+ releaseEvent->Dispatch();
+ mPreviousDriver = nullptr;
+ } else {
+ LIFECYCLE_LOG("Dropping driver reference for SystemClockDriver.");
+ MOZ_ASSERT(mPreviousDriver->AsSystemClockDriver());
+ mFromFallback = mPreviousDriver->AsSystemClockDriver()->IsFallback();
+ mPreviousDriver = nullptr;
+ }
+ }
+
+ LIFECYCLE_LOG("Starting new audio driver off main thread, "
+ "to ensure it runs after previous shutdown.");
+ RefPtr<AsyncCubebTask> initEvent =
+ new AsyncCubebTask(AsAudioCallbackDriver(), AsyncCubebOperation::INIT);
+ initEvent->Dispatch();
+}
+
+void
+AudioCallbackDriver::StartStream()
+{
+ mShouldFallbackIfError = true;
+ if (cubeb_stream_start(mAudioStream) != CUBEB_OK) {
+ MOZ_CRASH("Could not start cubeb stream for MSG.");
+ }
+
+ {
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ mStarted = true;
+ mWaitState = WAITSTATE_RUNNING;
+ }
+}
+
+void
+AudioCallbackDriver::Stop()
+{
+ if (cubeb_stream_stop(mAudioStream) != CUBEB_OK) {
+ NS_WARNING("Could not stop cubeb stream for MSG.");
+ }
+}
+
+void
+AudioCallbackDriver::Revive()
+{
+ // Note: only called on MainThread, without monitor
+ // We know were weren't in a running state
+ STREAM_LOG(LogLevel::Debug, ("AudioCallbackDriver reviving."));
+ // If we were switching, switch now. Otherwise, start the audio thread again.
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ if (NextDriver()) {
+ RemoveCallback();
+ NextDriver()->SetGraphTime(this, mIterationStart, mIterationEnd);
+ mGraphImpl->SetCurrentDriver(NextDriver());
+ NextDriver()->Start();
+ } else {
+ STREAM_LOG(LogLevel::Debug, ("Starting audio threads for MediaStreamGraph %p from a new thread.", mGraphImpl));
+ RefPtr<AsyncCubebTask> initEvent =
+ new AsyncCubebTask(this, AsyncCubebOperation::INIT);
+ initEvent->Dispatch();
+ }
+}
+
+void
+AudioCallbackDriver::RemoveCallback()
+{
+ if (mAddedMixer) {
+ mGraphImpl->mMixer.RemoveCallback(this);
+ mAddedMixer = false;
+ }
+}
+
+void
+AudioCallbackDriver::WaitForNextIteration()
+{
+}
+
+void
+AudioCallbackDriver::WakeUp()
+{
+ mGraphImpl->GetMonitor().AssertCurrentThreadOwns();
+ mGraphImpl->GetMonitor().Notify();
+}
+
+/* static */ long
+AudioCallbackDriver::DataCallback_s(cubeb_stream* aStream,
+ void* aUser,
+ const void* aInputBuffer,
+ void* aOutputBuffer,
+ long aFrames)
+{
+ AudioCallbackDriver* driver = reinterpret_cast<AudioCallbackDriver*>(aUser);
+ return driver->DataCallback(static_cast<const AudioDataValue*>(aInputBuffer),
+ static_cast<AudioDataValue*>(aOutputBuffer), aFrames);
+}
+
+/* static */ void
+AudioCallbackDriver::StateCallback_s(cubeb_stream* aStream, void * aUser,
+ cubeb_state aState)
+{
+ AudioCallbackDriver* driver = reinterpret_cast<AudioCallbackDriver*>(aUser);
+ driver->StateCallback(aState);
+}
+
+/* static */ void
+AudioCallbackDriver::DeviceChangedCallback_s(void* aUser)
+{
+ AudioCallbackDriver* driver = reinterpret_cast<AudioCallbackDriver*>(aUser);
+ driver->DeviceChangedCallback();
+}
+
+bool AudioCallbackDriver::InCallback() {
+ return mInCallback;
+}
+
+AudioCallbackDriver::AutoInCallback::AutoInCallback(AudioCallbackDriver* aDriver)
+ : mDriver(aDriver)
+{
+ mDriver->mInCallback = true;
+}
+
+AudioCallbackDriver::AutoInCallback::~AutoInCallback() {
+ mDriver->mInCallback = false;
+}
+
+long
+AudioCallbackDriver::DataCallback(const AudioDataValue* aInputBuffer,
+ AudioDataValue* aOutputBuffer, long aFrames)
+{
+ bool stillProcessing;
+
+ // Don't add the callback until we're inited and ready
+ if (!mAddedMixer) {
+ mGraphImpl->mMixer.AddCallback(this);
+ mAddedMixer = true;
+ }
+
+#ifdef DEBUG
+ // DebugOnly<> doesn't work here... it forces an initialization that will cause
+ // mInCallback to be set back to false before we exit the statement. Do it by
+ // hand instead.
+ AutoInCallback aic(this);
+#endif
+
+ GraphTime stateComputedTime = StateComputedTime();
+ if (stateComputedTime == 0) {
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ // Because this function is called during cubeb_stream_init (to prefill the
+ // audio buffers), it can be that we don't have a message here (because this
+ // driver is the first one for this graph), and the graph would exit. Simply
+ // return here until we have messages.
+ if (!mGraphImpl->MessagesQueued()) {
+ PodZero(aOutputBuffer, aFrames * mGraphImpl->AudioChannelCount());
+ return aFrames;
+ }
+ mGraphImpl->SwapMessageQueues();
+ }
+
+ uint32_t durationMS = aFrames * 1000 / mSampleRate;
+
+ // For now, simply average the duration with the previous
+ // duration so there is some damping against sudden changes.
+ if (!mIterationDurationMS) {
+ mIterationDurationMS = durationMS;
+ } else {
+ mIterationDurationMS = (mIterationDurationMS*3) + durationMS;
+ mIterationDurationMS /= 4;
+ }
+
+ // Process mic data if any/needed
+ if (aInputBuffer) {
+ if (mAudioInput) { // for this specific input-only or full-duplex stream
+ mAudioInput->NotifyInputData(mGraphImpl, aInputBuffer,
+ static_cast<size_t>(aFrames),
+ mSampleRate, mInputChannels);
+ }
+ }
+
+ mBuffer.SetBuffer(aOutputBuffer, aFrames);
+ // fill part or all with leftover data from last iteration (since we
+ // align to Audio blocks)
+ mScratchBuffer.Empty(mBuffer);
+ // if we totally filled the buffer (and mScratchBuffer isn't empty),
+ // we don't need to run an iteration and if we do so we may overflow.
+ if (mBuffer.Available()) {
+
+ // State computed time is decided by the audio callback's buffer length. We
+ // compute the iteration start and end from there, trying to keep the amount
+ // of buffering in the graph constant.
+ GraphTime nextStateComputedTime =
+ mGraphImpl->RoundUpToNextAudioBlock(stateComputedTime + mBuffer.Available());
+
+ mIterationStart = mIterationEnd;
+ // inGraph is the number of audio frames there is between the state time and
+ // the current time, i.e. the maximum theoretical length of the interval we
+ // could use as [mIterationStart; mIterationEnd].
+ GraphTime inGraph = stateComputedTime - mIterationStart;
+ // We want the interval [mIterationStart; mIterationEnd] to be before the
+ // interval [stateComputedTime; nextStateComputedTime]. We also want
+ // the distance between these intervals to be roughly equivalent each time, to
+ // ensure there is no clock drift between current time and state time. Since
+ // we can't act on the state time because we have to fill the audio buffer, we
+ // reclock the current time against the state time, here.
+ mIterationEnd = mIterationStart + 0.8 * inGraph;
+
+ STREAM_LOG(LogLevel::Verbose, ("interval[%ld; %ld] state[%ld; %ld] (frames: %ld) (durationMS: %u) (duration ticks: %ld)\n",
+ (long)mIterationStart, (long)mIterationEnd,
+ (long)stateComputedTime, (long)nextStateComputedTime,
+ (long)aFrames, (uint32_t)durationMS,
+ (long)(nextStateComputedTime - stateComputedTime)));
+
+ mCurrentTimeStamp = TimeStamp::Now();
+
+ if (stateComputedTime < mIterationEnd) {
+ STREAM_LOG(LogLevel::Warning, ("Media graph global underrun detected"));
+ mIterationEnd = stateComputedTime;
+ }
+
+ stillProcessing = mGraphImpl->OneIteration(nextStateComputedTime);
+ } else {
+ STREAM_LOG(LogLevel::Verbose, ("DataCallback buffer filled entirely from scratch buffer, skipping iteration."));
+ stillProcessing = true;
+ }
+
+ mBuffer.BufferFilled();
+
+ // Callback any observers for the AEC speaker data. Note that one
+ // (maybe) of these will be full-duplex, the others will get their input
+ // data off separate cubeb callbacks. Take care with how stuff is
+ // removed/added to this list and TSAN issues, but input and output will
+ // use separate callback methods.
+ mGraphImpl->NotifyOutputData(aOutputBuffer, static_cast<size_t>(aFrames),
+ mSampleRate, ChannelCount);
+
+ if (!stillProcessing) {
+ // About to hand over control of the graph. Do not start a new driver if
+ // StateCallback() receives an error for this stream while the main thread
+ // or another driver has control of the graph.
+ mShouldFallbackIfError = false;
+ // Enter shutdown mode. The stable-state handler will detect this
+ // and complete shutdown if the graph does not get restarted.
+ mGraphImpl->SignalMainThreadCleanup();
+ return aFrames - 1;
+ }
+
+ bool switching = false;
+ {
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ switching = !!NextDriver();
+ }
+
+ if (switching) {
+ mShouldFallbackIfError = false;
+ // If the audio stream has not been started by the previous driver or
+ // the graph itself, keep it alive.
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ if (!IsStarted()) {
+ return aFrames;
+ }
+ STREAM_LOG(LogLevel::Debug, ("Switching to system driver."));
+ RemoveCallback();
+ NextDriver()->SetGraphTime(this, mIterationStart, mIterationEnd);
+ mGraphImpl->SetCurrentDriver(NextDriver());
+ NextDriver()->Start();
+ // Returning less than aFrames starts the draining and eventually stops the
+ // audio thread. This function will never get called again.
+ return aFrames - 1;
+ }
+
+ return aFrames;
+}
+
+void
+AudioCallbackDriver::StateCallback(cubeb_state aState)
+{
+ STREAM_LOG(LogLevel::Debug, ("AudioCallbackDriver State: %d", aState));
+ if (aState == CUBEB_STATE_ERROR && mShouldFallbackIfError) {
+ MonitorAutoLock lock(GraphImpl()->GetMonitor());
+ // Fall back to a driver using a normal thread. If needed,
+ // the graph will try to re-open an audio stream later.
+ SystemClockDriver* nextDriver = new SystemClockDriver(GraphImpl());
+ SetNextDriver(nextDriver);
+ RemoveCallback();
+ nextDriver->MarkAsFallback();
+ nextDriver->SetGraphTime(this, mIterationStart, mIterationEnd);
+ // We're not using SwitchAtNextIteration here, because there
+ // won't be a next iteration if we don't restart things manually:
+ // the audio stream just signaled that it's in error state.
+ mGraphImpl->SetCurrentDriver(nextDriver);
+ nextDriver->Start();
+ }
+}
+
+void
+AudioCallbackDriver::MixerCallback(AudioDataValue* aMixedBuffer,
+ AudioSampleFormat aFormat,
+ uint32_t aChannels,
+ uint32_t aFrames,
+ uint32_t aSampleRate)
+{
+ uint32_t toWrite = mBuffer.Available();
+
+ if (!mBuffer.Available()) {
+ NS_WARNING("DataCallback buffer full, expect frame drops.");
+ }
+
+ MOZ_ASSERT(mBuffer.Available() <= aFrames);
+
+ mBuffer.WriteFrames(aMixedBuffer, mBuffer.Available());
+ MOZ_ASSERT(mBuffer.Available() == 0, "Missing frames to fill audio callback's buffer.");
+
+ DebugOnly<uint32_t> written = mScratchBuffer.Fill(aMixedBuffer + toWrite * aChannels, aFrames - toWrite);
+ NS_WARNING_ASSERTION(written == aFrames - toWrite, "Dropping frames.");
+};
+
+void AudioCallbackDriver::PanOutputIfNeeded(bool aMicrophoneActive)
+{
+#ifdef XP_MACOSX
+ cubeb_device* out;
+ int rv;
+ char name[128];
+ size_t length = sizeof(name);
+
+ rv = sysctlbyname("hw.model", name, &length, NULL, 0);
+ if (rv) {
+ return;
+ }
+
+ if (!strncmp(name, "MacBookPro", 10)) {
+ if (cubeb_stream_get_current_device(mAudioStream, &out) == CUBEB_OK) {
+ // Check if we are currently outputing sound on external speakers.
+ if (!strcmp(out->output_name, "ispk")) {
+ // Pan everything to the right speaker.
+ if (aMicrophoneActive) {
+ if (cubeb_stream_set_panning(mAudioStream, 1.0) != CUBEB_OK) {
+ NS_WARNING("Could not pan audio output to the right.");
+ }
+ } else {
+ if (cubeb_stream_set_panning(mAudioStream, 0.0) != CUBEB_OK) {
+ NS_WARNING("Could not pan audio output to the center.");
+ }
+ }
+ } else {
+ if (cubeb_stream_set_panning(mAudioStream, 0.0) != CUBEB_OK) {
+ NS_WARNING("Could not pan audio output to the center.");
+ }
+ }
+ cubeb_stream_device_destroy(mAudioStream, out);
+ }
+ }
+#endif
+}
+
+void
+AudioCallbackDriver::DeviceChangedCallback() {
+ // Tell the audio engine the device has changed, it might want to reset some
+ // state.
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ if (mAudioInput) {
+ mAudioInput->DeviceChanged();
+ }
+#ifdef XP_MACOSX
+ PanOutputIfNeeded(mMicrophoneActive);
+#endif
+}
+
+void
+AudioCallbackDriver::SetMicrophoneActive(bool aActive)
+{
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+
+ mMicrophoneActive = aActive;
+
+#ifdef XP_MACOSX
+ PanOutputIfNeeded(mMicrophoneActive);
+#endif
+}
+
+uint32_t
+AudioCallbackDriver::IterationDuration()
+{
+ // The real fix would be to have an API in cubeb to give us the number. Short
+ // of that, we approximate it here. bug 1019507
+ return mIterationDurationMS;
+}
+
+bool
+AudioCallbackDriver::IsStarted() {
+ mGraphImpl->GetMonitor().AssertCurrentThreadOwns();
+ return mStarted;
+}
+
+void
+AudioCallbackDriver::EnqueueStreamAndPromiseForOperation(MediaStream* aStream,
+ void* aPromise,
+ dom::AudioContextOperation aOperation)
+{
+ MonitorAutoLock mon(mGraphImpl->GetMonitor());
+ mPromisesForOperation.AppendElement(StreamAndPromiseForOperation(aStream,
+ aPromise,
+ aOperation));
+}
+
+void AudioCallbackDriver::CompleteAudioContextOperations(AsyncCubebOperation aOperation)
+{
+ AutoTArray<StreamAndPromiseForOperation, 1> array;
+
+ // We can't lock for the whole function because AudioContextOperationCompleted
+ // will grab the monitor
+ {
+ MonitorAutoLock mon(GraphImpl()->GetMonitor());
+ array.SwapElements(mPromisesForOperation);
+ }
+
+ for (uint32_t i = 0; i < array.Length(); i++) {
+ StreamAndPromiseForOperation& s = array[i];
+ if ((aOperation == AsyncCubebOperation::INIT &&
+ s.mOperation == dom::AudioContextOperation::Resume) ||
+ (aOperation == AsyncCubebOperation::SHUTDOWN &&
+ s.mOperation != dom::AudioContextOperation::Resume)) {
+
+ GraphImpl()->AudioContextOperationCompleted(s.mStream,
+ s.mPromise,
+ s.mOperation);
+ array.RemoveElementAt(i);
+ i--;
+ }
+ }
+
+ if (!array.IsEmpty()) {
+ MonitorAutoLock mon(GraphImpl()->GetMonitor());
+ mPromisesForOperation.AppendElements(array);
+ }
+}
+
+
+} // namespace mozilla
diff --git a/dom/media/GraphDriver.h b/dom/media/GraphDriver.h
new file mode 100644
index 000000000..411e175d3
--- /dev/null
+++ b/dom/media/GraphDriver.h
@@ -0,0 +1,583 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GRAPHDRIVER_H_
+#define GRAPHDRIVER_H_
+
+#include "nsAutoRef.h"
+#include "AudioBufferUtils.h"
+#include "AudioMixer.h"
+#include "AudioSegment.h"
+#include "SelfRef.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/StaticPtr.h"
+
+struct cubeb_stream;
+
+template <>
+class nsAutoRefTraits<cubeb_stream> : public nsPointerRefTraits<cubeb_stream>
+{
+public:
+ static void Release(cubeb_stream* aStream) { cubeb_stream_destroy(aStream); }
+};
+
+namespace mozilla {
+
+/**
+ * Assume we can run an iteration of the MediaStreamGraph loop in this much time
+ * or less.
+ * We try to run the control loop at this rate.
+ */
+static const int MEDIA_GRAPH_TARGET_PERIOD_MS = 10;
+
+/**
+ * Assume that we might miss our scheduled wakeup of the MediaStreamGraph by
+ * this much.
+ */
+static const int SCHEDULE_SAFETY_MARGIN_MS = 10;
+
+/**
+ * Try have this much audio buffered in streams and queued to the hardware.
+ * The maximum delay to the end of the next control loop
+ * is 2*MEDIA_GRAPH_TARGET_PERIOD_MS + SCHEDULE_SAFETY_MARGIN_MS.
+ * There is no point in buffering more audio than this in a stream at any
+ * given time (until we add processing).
+ * This is not optimal yet.
+ */
+static const int AUDIO_TARGET_MS = 2*MEDIA_GRAPH_TARGET_PERIOD_MS +
+ SCHEDULE_SAFETY_MARGIN_MS;
+
+class MediaStreamGraphImpl;
+
+class AudioCallbackDriver;
+class OfflineClockDriver;
+class SystemClockDriver;
+
+/**
+ * A driver is responsible for the scheduling of the processing, the thread
+ * management, and give the different clocks to a MediaStreamGraph. This is an
+ * abstract base class. A MediaStreamGraph can be driven by an
+ * OfflineClockDriver, if the graph is offline, or a SystemClockDriver, if the
+ * graph is real time.
+ * A MediaStreamGraph holds an owning reference to its driver.
+ *
+ * The lifetime of drivers is a complicated affair. Here are the different
+ * scenarii that can happen:
+ *
+ * Starting a MediaStreamGraph with an AudioCallbackDriver
+ * - A new thread T is created, from the main thread.
+ * - On this thread T, cubeb is initialized if needed, and a cubeb_stream is
+ * created and started
+ * - The thread T posts a message to the main thread to terminate itself.
+ * - The graph runs off the audio thread
+ *
+ * Starting a MediaStreamGraph with a SystemClockDriver:
+ * - A new thread T is created from the main thread.
+ * - The graph runs off this thread.
+ *
+ * Switching from a SystemClockDriver to an AudioCallbackDriver:
+ * - A new AudioCallabackDriver is created and initialized on the graph thread
+ * - At the end of the MSG iteration, the SystemClockDriver transfers its timing
+ * info and a reference to itself to the AudioCallbackDriver. It then starts
+ * the AudioCallbackDriver.
+ * - When the AudioCallbackDriver starts, it checks if it has been switched from
+ * a SystemClockDriver, and if that is the case, sends a message to the main
+ * thread to shut the SystemClockDriver thread down.
+ * - The graph now runs off an audio callback
+ *
+ * Switching from an AudioCallbackDriver to a SystemClockDriver:
+ * - A new SystemClockDriver is created, and set as mNextDriver.
+ * - At the end of the MSG iteration, the AudioCallbackDriver transfers its
+ * timing info and a reference to itself to the SystemClockDriver. A new
+ * SystemClockDriver is started from the current audio thread.
+ * - When starting, the SystemClockDriver checks if it has been switched from an
+ * AudioCallbackDriver. If yes, it creates a new temporary thread to release
+ * the cubeb_streams. This temporary thread closes the cubeb_stream, and
+ * then dispatches a message to the main thread to be terminated.
+ * - The graph now runs off a normal thread.
+ *
+ * Two drivers cannot run at the same time for the same graph. The thread safety
+ * of the different attributes of drivers, and they access pattern is documented
+ * next to the members themselves.
+ *
+ */
+class GraphDriver
+{
+public:
+ explicit GraphDriver(MediaStreamGraphImpl* aGraphImpl);
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GraphDriver);
+ /* For real-time graphs, this waits until it's time to process more data. For
+ * offline graphs, this is a no-op. */
+ virtual void WaitForNextIteration() = 0;
+ /* Wakes up the graph if it is waiting. */
+ virtual void WakeUp() = 0;
+ virtual void Destroy() {}
+ /* Start the graph, init the driver, start the thread. */
+ virtual void Start() = 0;
+ /* Stop the graph, shutting down the thread. */
+ virtual void Stop() = 0;
+ /* Resume after a stop */
+ virtual void Resume() = 0;
+ /* Revive this driver, as more messages just arrived. */
+ virtual void Revive() = 0;
+ /* Remove Mixer callbacks when switching */
+ virtual void RemoveCallback() = 0;
+ /* Shutdown GraphDriver (synchronously) */
+ void Shutdown();
+ /* Rate at which the GraphDriver runs, in ms. This can either be user
+ * controlled (because we are using a {System,Offline}ClockDriver, and decide
+ * how often we want to wakeup/how much we want to process per iteration), or
+ * it can be indirectly set by the latency of the audio backend, and the
+ * number of buffers of this audio backend: say we have four buffers, and 40ms
+ * latency, we will get a callback approximately every 10ms. */
+ virtual uint32_t IterationDuration() = 0;
+
+ /* Return whether we are switching or not. */
+ bool Switching();
+
+ // Those are simply or setting the associated pointer, but assert that the
+ // lock is held.
+ GraphDriver* NextDriver();
+ GraphDriver* PreviousDriver();
+ void SetNextDriver(GraphDriver* aNextDriver);
+ void SetPreviousDriver(GraphDriver* aPreviousDriver);
+
+ /**
+ * If we are running a real time graph, get the current time stamp to schedule
+ * video frames. This has to be reimplemented by real time drivers.
+ */
+ virtual TimeStamp GetCurrentTimeStamp() {
+ return mCurrentTimeStamp;
+ }
+
+ GraphTime IterationEnd() {
+ return mIterationEnd;
+ }
+
+ virtual AudioCallbackDriver* AsAudioCallbackDriver() {
+ return nullptr;
+ }
+
+ virtual OfflineClockDriver* AsOfflineClockDriver() {
+ return nullptr;
+ }
+
+ virtual SystemClockDriver* AsSystemClockDriver() {
+ return nullptr;
+ }
+
+ /**
+ * Tell the driver it has to stop and return the current time of the graph, so
+ * another driver can start from the right point in time.
+ */
+ virtual void SwitchAtNextIteration(GraphDriver* aDriver);
+
+ /**
+ * Set the time for a graph, on a driver. This is used so a new driver just
+ * created can start at the right point in time.
+ */
+ void SetGraphTime(GraphDriver* aPreviousDriver,
+ GraphTime aLastSwitchNextIterationStart,
+ GraphTime aLastSwitchNextIterationEnd);
+ /**
+ * Call this to indicate that another iteration of the control loop is
+ * required on its regular schedule. The monitor must not be held.
+ * This function has to be idempotent.
+ */
+ void EnsureNextIteration();
+
+ /**
+ * Same thing, but not locked.
+ */
+ void EnsureNextIterationLocked();
+
+ MediaStreamGraphImpl* GraphImpl() {
+ return mGraphImpl;
+ }
+
+ virtual bool OnThread() = 0;
+
+protected:
+ GraphTime StateComputedTime() const;
+
+ // Time of the start of this graph iteration. This must be accessed while
+ // having the monitor.
+ GraphTime mIterationStart;
+ // Time of the end of this graph iteration. This must be accessed while having
+ // the monitor.
+ GraphTime mIterationEnd;
+ // The MediaStreamGraphImpl that owns this driver. This has a lifetime longer
+ // than the driver, and will never be null. Hence, it can be accesed without
+ // monitor.
+ MediaStreamGraphImpl* mGraphImpl;
+
+ // This enum specifies the wait state of the driver.
+ enum WaitState {
+ // RunThread() is running normally
+ WAITSTATE_RUNNING,
+ // RunThread() is paused waiting for its next iteration, which will
+ // happen soon
+ WAITSTATE_WAITING_FOR_NEXT_ITERATION,
+ // RunThread() is paused indefinitely waiting for something to change
+ WAITSTATE_WAITING_INDEFINITELY,
+ // Something has signaled RunThread() to wake up immediately,
+ // but it hasn't done so yet
+ WAITSTATE_WAKING_UP
+ };
+ // This must be access with the monitor.
+ WaitState mWaitState;
+
+ // This is used on the main thread (during initialization), and the graph
+ // thread. No monitor needed because we know the graph thread does not run
+ // during the initialization.
+ TimeStamp mCurrentTimeStamp;
+ // This is non-null only when this driver has recently switched from an other
+ // driver, and has not cleaned it up yet (for example because the audio stream
+ // is currently calling the callback during initialization).
+ //
+ // This is written to when changing driver, from the previous driver's thread,
+ // or a thread created for the occasion. This is read each time we need to
+ // check whether we're changing driver (in Switching()), from the graph
+ // thread.
+ // This must be accessed using the {Set,Get}PreviousDriver methods.
+ RefPtr<GraphDriver> mPreviousDriver;
+ // This is non-null only when this driver is going to switch to an other
+ // driver at the end of this iteration.
+ // This must be accessed using the {Set,Get}NextDriver methods.
+ RefPtr<GraphDriver> mNextDriver;
+ virtual ~GraphDriver()
+ { }
+};
+
+class MediaStreamGraphInitThreadRunnable;
+
+/**
+ * This class is a driver that manages its own thread.
+ */
+class ThreadedDriver : public GraphDriver
+{
+public:
+ explicit ThreadedDriver(MediaStreamGraphImpl* aGraphImpl);
+ virtual ~ThreadedDriver();
+ void Start() override;
+ void Stop() override;
+ void Resume() override;
+ void Revive() override;
+ void RemoveCallback() override;
+ /**
+ * Runs main control loop on the graph thread. Normally a single invocation
+ * of this runs for the entire lifetime of the graph thread.
+ */
+ void RunThread();
+ friend class MediaStreamGraphInitThreadRunnable;
+ uint32_t IterationDuration() override {
+ return MEDIA_GRAPH_TARGET_PERIOD_MS;
+ }
+
+ bool OnThread() override { return !mThread || NS_GetCurrentThread() == mThread; }
+
+ /* When the graph wakes up to do an iteration, implementations return the
+ * range of time that will be processed. This is called only once per
+ * iteration; it may determine the interval from state in a previous
+ * call. */
+ virtual MediaTime GetIntervalForIteration() = 0;
+protected:
+ nsCOMPtr<nsIThread> mThread;
+};
+
+/**
+ * A SystemClockDriver drives a MediaStreamGraph using a system clock, and waits
+ * using a monitor, between each iteration.
+ */
+class SystemClockDriver : public ThreadedDriver
+{
+public:
+ explicit SystemClockDriver(MediaStreamGraphImpl* aGraphImpl);
+ virtual ~SystemClockDriver();
+ MediaTime GetIntervalForIteration() override;
+ void WaitForNextIteration() override;
+ void WakeUp() override;
+ void MarkAsFallback();
+ bool IsFallback();
+ SystemClockDriver* AsSystemClockDriver() override {
+ return this;
+ }
+
+private:
+ // Those are only modified (after initialization) on the graph thread. The
+ // graph thread does not run during the initialization.
+ TimeStamp mInitialTimeStamp;
+ TimeStamp mLastTimeStamp;
+ // This is true if this SystemClockDriver runs the graph because we could not
+ // open an audio stream.
+ bool mIsFallback;
+};
+
+/**
+ * An OfflineClockDriver runs the graph as fast as possible, without waiting
+ * between iteration.
+ */
+class OfflineClockDriver : public ThreadedDriver
+{
+public:
+ OfflineClockDriver(MediaStreamGraphImpl* aGraphImpl, GraphTime aSlice);
+ virtual ~OfflineClockDriver();
+ MediaTime GetIntervalForIteration() override;
+ void WaitForNextIteration() override;
+ void WakeUp() override;
+ TimeStamp GetCurrentTimeStamp() override;
+ OfflineClockDriver* AsOfflineClockDriver() override {
+ return this;
+ }
+
+private:
+ // Time, in GraphTime, for each iteration
+ GraphTime mSlice;
+};
+
+struct StreamAndPromiseForOperation
+{
+ StreamAndPromiseForOperation(MediaStream* aStream,
+ void* aPromise,
+ dom::AudioContextOperation aOperation);
+ RefPtr<MediaStream> mStream;
+ void* mPromise;
+ dom::AudioContextOperation mOperation;
+};
+
+enum AsyncCubebOperation {
+ INIT,
+ SHUTDOWN
+};
+
+/**
+ * This is a graph driver that is based on callback functions called by the
+ * audio api. This ensures minimal audio latency, because it means there is no
+ * buffering happening: the audio is generated inside the callback.
+ *
+ * This design is less flexible than running our own thread:
+ * - We have no control over the thread:
+ * - It cannot block, and it has to run for a shorter amount of time than the
+ * buffer it is going to fill, or an under-run is going to occur (short burst
+ * of silence in the final audio output).
+ * - We can't know for sure when the callback function is going to be called
+ * (although we compute an estimation so we can schedule video frames)
+ * - Creating and shutting the thread down is a blocking operation, that can
+ * take _seconds_ in some cases (because IPC has to be set up, and
+ * sometimes hardware components are involved and need to be warmed up)
+ * - We have no control on how much audio we generate, we have to return exactly
+ * the number of frames asked for by the callback. Since for the Web Audio
+ * API, we have to do block processing at 128 frames per block, we need to
+ * keep a little spill buffer to store the extra frames.
+ */
+class AudioCallbackDriver : public GraphDriver,
+ public MixerCallbackReceiver
+{
+public:
+ explicit AudioCallbackDriver(MediaStreamGraphImpl* aGraphImpl);
+ virtual ~AudioCallbackDriver();
+
+ void Destroy() override;
+ void Start() override;
+ void Stop() override;
+ void Resume() override;
+ void Revive() override;
+ void RemoveCallback() override;
+ void WaitForNextIteration() override;
+ void WakeUp() override;
+
+ /* Static wrapper function cubeb calls back. */
+ static long DataCallback_s(cubeb_stream * aStream,
+ void * aUser,
+ const void * aInputBuffer,
+ void * aOutputBuffer,
+ long aFrames);
+ static void StateCallback_s(cubeb_stream* aStream, void * aUser,
+ cubeb_state aState);
+ static void DeviceChangedCallback_s(void * aUser);
+ /* This function is called by the underlying audio backend when a refill is
+ * needed. This is what drives the whole graph when it is used to output
+ * audio. If the return value is exactly aFrames, this function will get
+ * called again. If it is less than aFrames, the stream will go in draining
+ * mode, and this function will not be called again. */
+ long DataCallback(const AudioDataValue* aInputBuffer, AudioDataValue* aOutputBuffer, long aFrames);
+ /* This function is called by the underlying audio backend, but is only used
+ * for informational purposes at the moment. */
+ void StateCallback(cubeb_state aState);
+ /* This is an approximation of the number of millisecond there are between two
+ * iterations of the graph. */
+ uint32_t IterationDuration() override;
+
+ /* This function gets called when the graph has produced the audio frames for
+ * this iteration. */
+ void MixerCallback(AudioDataValue* aMixedBuffer,
+ AudioSampleFormat aFormat,
+ uint32_t aChannels,
+ uint32_t aFrames,
+ uint32_t aSampleRate) override;
+
+ // These are invoked on the MSG thread (we don't call this if not LIFECYCLE_RUNNING)
+ virtual void SetInputListener(AudioDataListener *aListener) {
+ MOZ_ASSERT(OnThread());
+ mAudioInput = aListener;
+ }
+ // XXX do we need the param? probably no
+ virtual void RemoveInputListener(AudioDataListener *aListener) {
+ MOZ_ASSERT(OnThread());
+ mAudioInput = nullptr;
+ }
+
+ AudioCallbackDriver* AsAudioCallbackDriver() override {
+ return this;
+ }
+
+ /* Enqueue a promise that is going to be resolved when a specific operation
+ * occurs on the cubeb stream. */
+ void EnqueueStreamAndPromiseForOperation(MediaStream* aStream,
+ void* aPromise,
+ dom::AudioContextOperation aOperation);
+
+ /**
+ * Whether the audio callback is processing. This is for asserting only.
+ */
+ bool InCallback();
+
+ bool OnThread() override { return !mStarted || InCallback(); }
+
+ /* Whether the underlying cubeb stream has been started. See comment for
+ * mStarted for details. */
+ bool IsStarted();
+
+ /* Tell the driver whether this process is using a microphone or not. This is
+ * thread safe. */
+ void SetMicrophoneActive(bool aActive);
+
+ void CompleteAudioContextOperations(AsyncCubebOperation aOperation);
+private:
+ /**
+ * On certain MacBookPro, the microphone is located near the left speaker.
+ * We need to pan the sound output to the right speaker if we are using the
+ * mic and the built-in speaker, or we will have terrible echo. */
+ void PanOutputIfNeeded(bool aMicrophoneActive);
+ /**
+ * This is called when the output device used by the cubeb stream changes. */
+ void DeviceChangedCallback();
+ /* Start the cubeb stream */
+ void StartStream();
+ friend class AsyncCubebTask;
+ void Init();
+ /* MediaStreamGraphs are always down/up mixed to stereo for now. */
+ static const uint32_t ChannelCount = 2;
+ /* The size of this buffer comes from the fact that some audio backends can
+ * call back with a number of frames lower than one block (128 frames), so we
+ * need to keep at most two block in the SpillBuffer, because we always round
+ * up to block boundaries during an iteration.
+ * This is only ever accessed on the audio callback thread. */
+ SpillBuffer<AudioDataValue, WEBAUDIO_BLOCK_SIZE * 2, ChannelCount> mScratchBuffer;
+ /* Wrapper to ensure we write exactly the number of frames we need in the
+ * audio buffer cubeb passes us. This is only ever accessed on the audio
+ * callback thread. */
+ AudioCallbackBufferWrapper<AudioDataValue, ChannelCount> mBuffer;
+ /* cubeb stream for this graph. This is guaranteed to be non-null after Init()
+ * has been called, and is synchronized internaly. */
+ nsAutoRef<cubeb_stream> mAudioStream;
+ /* The sample rate for the aforementionned cubeb stream. This is set on
+ * initialization and can be read safely afterwards. */
+ uint32_t mSampleRate;
+ /* The number of input channels from cubeb. Should be set before opening cubeb
+ * and then be static. */
+ uint32_t mInputChannels;
+ /* Approximation of the time between two callbacks. This is used to schedule
+ * video frames. This is in milliseconds. Only even used (after
+ * inizatialization) on the audio callback thread. */
+ uint32_t mIterationDurationMS;
+ /* cubeb_stream_init calls the audio callback to prefill the buffers. The
+ * previous driver has to be kept alive until the audio stream has been
+ * started, because it is responsible to call cubeb_stream_start, so we delay
+ * the cleanup of the previous driver until it has started the audio stream.
+ * Otherwise, there is a race where we kill the previous driver thread
+ * between cubeb_stream_init and cubeb_stream_start,
+ * and callbacks after the prefill never get called.
+ * This is written on the previous driver's thread (if switching) or main
+ * thread (if this driver is the first one).
+ * This is read on previous driver's thread (during callbacks from
+ * cubeb_stream_init) and the audio thread (when switching away from this
+ * driver back to a SystemClockDriver).
+ * This is synchronized by the Graph's monitor.
+ * */
+ bool mStarted;
+ /* Listener for mic input, if any. */
+ RefPtr<AudioDataListener> mAudioInput;
+
+ struct AutoInCallback
+ {
+ explicit AutoInCallback(AudioCallbackDriver* aDriver);
+ ~AutoInCallback();
+ AudioCallbackDriver* mDriver;
+ };
+
+ /* Thread for off-main-thread initialization and
+ * shutdown of the audio stream. */
+ nsCOMPtr<nsIThread> mInitShutdownThread;
+ /* This must be accessed with the graph monitor held. */
+ AutoTArray<StreamAndPromiseForOperation, 1> mPromisesForOperation;
+ /* This is set during initialization, and can be read safely afterwards. */
+ dom::AudioChannel mAudioChannel;
+ /* Used to queue us to add the mixer callback on first run. */
+ bool mAddedMixer;
+
+ /* This is atomic and is set by the audio callback thread. It can be read by
+ * any thread safely. */
+ Atomic<bool> mInCallback;
+ /**
+ * True if microphone is being used by this process. This is synchronized by
+ * the graph's monitor. */
+ bool mMicrophoneActive;
+ /* Indication of whether a fallback SystemClockDriver should be started if
+ * StateCallback() receives an error. No mutex need be held during access.
+ * The transition to true happens before cubeb_stream_start() is called.
+ * After transitioning to false on the last DataCallback(), the stream is
+ * not accessed from another thread until the graph thread either signals
+ * main thread cleanup or dispatches an event to switch to another
+ * driver. */
+ bool mShouldFallbackIfError;
+ /* True if this driver was created from a driver created because of a previous
+ * AudioCallbackDriver failure. */
+ bool mFromFallback;
+};
+
+class AsyncCubebTask : public Runnable
+{
+public:
+
+ AsyncCubebTask(AudioCallbackDriver* aDriver, AsyncCubebOperation aOperation);
+
+ nsresult Dispatch(uint32_t aFlags = NS_DISPATCH_NORMAL)
+ {
+ nsresult rv = EnsureThread();
+ if (!NS_FAILED(rv)) {
+ rv = sThreadPool->Dispatch(this, aFlags);
+ }
+ return rv;
+ }
+
+protected:
+ virtual ~AsyncCubebTask();
+
+private:
+ static nsresult EnsureThread();
+
+ NS_IMETHOD Run() override final;
+ static StaticRefPtr<nsIThreadPool> sThreadPool;
+ RefPtr<AudioCallbackDriver> mDriver;
+ AsyncCubebOperation mOperation;
+ RefPtr<MediaStreamGraphImpl> mShutdownGrip;
+};
+
+} // namespace mozilla
+
+#endif // GRAPHDRIVER_H_
diff --git a/dom/media/IdpSandbox.jsm b/dom/media/IdpSandbox.jsm
new file mode 100644
index 000000000..ada7efed7
--- /dev/null
+++ b/dom/media/IdpSandbox.jsm
@@ -0,0 +1,271 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+const {
+ classes: Cc,
+ interfaces: Ci,
+ utils: Cu,
+ results: Cr
+} = Components;
+
+Cu.import('resource://gre/modules/Services.jsm');
+Cu.import('resource://gre/modules/NetUtil.jsm');
+Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+
+/** This little class ensures that redirects maintain an https:// origin */
+function RedirectHttpsOnly() {}
+
+RedirectHttpsOnly.prototype = {
+ asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) {
+ if (newChannel.URI.scheme !== 'https') {
+ callback.onRedirectVerifyCallback(Cr.NS_ERROR_ABORT);
+ } else {
+ callback.onRedirectVerifyCallback(Cr.NS_OK);
+ }
+ },
+
+ getInterface: function(iid) {
+ return this.QueryInterface(iid);
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannelEventSink])
+};
+
+/** This class loads a resource into a single string. ResourceLoader.load() is
+ * the entry point. */
+function ResourceLoader(res, rej) {
+ this.resolve = res;
+ this.reject = rej;
+ this.data = '';
+}
+
+/** Loads the identified https:// URL. */
+ResourceLoader.load = function(uri, doc) {
+ return new Promise((resolve, reject) => {
+ let listener = new ResourceLoader(resolve, reject);
+ let ioChannel = NetUtil.newChannel({
+ uri: uri,
+ loadingNode: doc,
+ securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL,
+ contentPolicyType: Ci.nsIContentPolicy.TYPE_INTERNAL_SCRIPT
+ });
+
+ ioChannel.loadGroup = doc.documentLoadGroup.QueryInterface(Ci.nsILoadGroup);
+ ioChannel.notificationCallbacks = new RedirectHttpsOnly();
+ ioChannel.asyncOpen2(listener);
+ });
+};
+
+ResourceLoader.prototype = {
+ onDataAvailable: function(request, context, input, offset, count) {
+ let stream = Cc['@mozilla.org/scriptableinputstream;1']
+ .createInstance(Ci.nsIScriptableInputStream);
+ stream.init(input);
+ this.data += stream.read(count);
+ },
+
+ onStartRequest: function (request, context) {},
+
+ onStopRequest: function(request, context, status) {
+ if (Components.isSuccessCode(status)) {
+ var statusCode = request.QueryInterface(Ci.nsIHttpChannel).responseStatus;
+ if (statusCode === 200) {
+ this.resolve({ request: request, data: this.data });
+ } else {
+ this.reject(new Error('Non-200 response from server: ' + statusCode));
+ }
+ } else {
+ this.reject(new Error('Load failed: ' + status));
+ }
+ },
+
+ getInterface: function(iid) {
+ return this.QueryInterface(iid);
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener])
+};
+
+/**
+ * A simple implementation of the WorkerLocation interface.
+ */
+function createLocationFromURI(uri) {
+ return {
+ href: uri.spec,
+ protocol: uri.scheme + ':',
+ host: uri.host + ((uri.port >= 0) ?
+ (':' + uri.port) : ''),
+ port: uri.port,
+ hostname: uri.host,
+ pathname: uri.path.replace(/[#\?].*/, ''),
+ search: uri.path.replace(/^[^\?]*/, '').replace(/#.*/, ''),
+ hash: uri.hasRef ? ('#' + uri.ref) : '',
+ origin: uri.prePath,
+ toString: function() {
+ return uri.spec;
+ }
+ };
+}
+
+/**
+ * A javascript sandbox for running an IdP.
+ *
+ * @param domain (string) the domain of the IdP
+ * @param protocol (string?) the protocol of the IdP [default: 'default']
+ * @param win (obj) the current window
+ * @throws if the domain or protocol aren't valid
+ */
+function IdpSandbox(domain, protocol, win) {
+ this.source = IdpSandbox.createIdpUri(domain, protocol || "default");
+ this.active = null;
+ this.sandbox = null;
+ this.window = win;
+}
+
+IdpSandbox.checkDomain = function(domain) {
+ if (!domain || typeof domain !== 'string') {
+ throw new Error('Invalid domain for identity provider: ' +
+ 'must be a non-zero length string');
+ }
+};
+
+/**
+ * Checks that the IdP protocol is superficially sane. In particular, we don't
+ * want someone adding relative paths (e.g., '../../myuri'), which could be used
+ * to move outside of /.well-known/ and into space that they control.
+ */
+IdpSandbox.checkProtocol = function(protocol) {
+ let message = 'Invalid protocol for identity provider: ';
+ if (!protocol || typeof protocol !== 'string') {
+ throw new Error(message + 'must be a non-zero length string');
+ }
+ if (decodeURIComponent(protocol).match(/[\/\\]/)) {
+ throw new Error(message + "must not include '/' or '\\'");
+ }
+};
+
+/**
+ * Turns a domain and protocol into a URI. This does some aggressive checking
+ * to make sure that we aren't being fooled somehow. Throws on fooling.
+ */
+IdpSandbox.createIdpUri = function(domain, protocol) {
+ IdpSandbox.checkDomain(domain);
+ IdpSandbox.checkProtocol(protocol);
+
+ let message = 'Invalid IdP parameters: ';
+ try {
+ let wkIdp = 'https://' + domain + '/.well-known/idp-proxy/' + protocol;
+ let ioService = Components.classes['@mozilla.org/network/io-service;1']
+ .getService(Ci.nsIIOService);
+ let uri = ioService.newURI(wkIdp, null, null);
+
+ if (uri.hostPort !== domain) {
+ throw new Error(message + 'domain is invalid');
+ }
+ if (uri.path.indexOf('/.well-known/idp-proxy/') !== 0) {
+ throw new Error(message + 'must produce a /.well-known/idp-proxy/ URI');
+ }
+
+ return uri;
+ } catch (e if (typeof e.result !== 'undefined' &&
+ e.result === Cr.NS_ERROR_MALFORMED_URI)) {
+ throw new Error(message + 'must produce a valid URI');
+ }
+};
+
+IdpSandbox.prototype = {
+ isSame: function(domain, protocol) {
+ return this.source.spec === IdpSandbox.createIdpUri(domain, protocol).spec;
+ },
+
+ start: function() {
+ if (!this.active) {
+ this.active = ResourceLoader.load(this.source, this.window.document)
+ .then(result => this._createSandbox(result));
+ }
+ return this.active;
+ },
+
+ // Provides the sandbox with some useful facilities. Initially, this is only
+ // a minimal set; it is far easier to add more as the need arises, than to
+ // take them back if we discover a mistake.
+ _populateSandbox: function(uri) {
+ this.sandbox.location = Cu.cloneInto(createLocationFromURI(uri),
+ this.sandbox,
+ { cloneFunctions: true });
+ },
+
+ _createSandbox: function(result) {
+ let principal = Services.scriptSecurityManager
+ .getChannelResultPrincipal(result.request);
+
+ this.sandbox = Cu.Sandbox(principal, {
+ sandboxName: 'IdP-' + this.source.host,
+ wantComponents: false,
+ wantExportHelpers: false,
+ wantGlobalProperties: [
+ 'indexedDB', 'XMLHttpRequest', 'TextEncoder', 'TextDecoder',
+ 'URL', 'URLSearchParams', 'atob', 'btoa', 'Blob', 'crypto',
+ 'rtcIdentityProvider', 'fetch'
+ ]
+ });
+ let registrar = this.sandbox.rtcIdentityProvider;
+ if (!Cu.isXrayWrapper(registrar)) {
+ throw new Error('IdP setup failed');
+ }
+
+ // have to use the ultimate URI, not the starting one to avoid
+ // that origin stealing from the one that redirected to it
+ this._populateSandbox(result.request.URI);
+ try {
+ Cu.evalInSandbox(result.data, this.sandbox,
+ 'latest', result.request.URI.spec, 1);
+ } catch (e) {
+ // These can be passed straight on, because they are explicitly labelled
+ // as being IdP errors by the IdP and we drop line numbers as a result.
+ if (e.name === 'IdpError' || e.name === 'IdpLoginError') {
+ throw e;
+ }
+ this._logError(e);
+ throw new Error('Error in IdP, check console for details');
+ }
+
+ if (!registrar.hasIdp) {
+ throw new Error('IdP failed to call rtcIdentityProvider.register()');
+ }
+ return registrar;
+ },
+
+ // Capture all the details from the error and log them to the console. This
+ // can't rethrow anything else because that could leak information about the
+ // internal workings of the IdP across origins.
+ _logError: function(e) {
+ let winID = this.window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
+ let scriptError = Cc["@mozilla.org/scripterror;1"]
+ .createInstance(Ci.nsIScriptError);
+ scriptError.initWithWindowID(e.message, e.fileName, null,
+ e.lineNumber, e.columnNumber,
+ Ci.nsIScriptError.errorFlag,
+ "content javascript", winID);
+ let consoleService = Cc['@mozilla.org/consoleservice;1']
+ .getService(Ci.nsIConsoleService);
+ consoleService.logMessage(scriptError);
+ },
+
+ stop: function() {
+ if (this.sandbox) {
+ Cu.nukeSandbox(this.sandbox);
+ }
+ this.sandbox = null;
+ this.active = null;
+ },
+
+ toString: function() {
+ return this.source.spec;
+ }
+};
+
+this.EXPORTED_SYMBOLS = ['IdpSandbox'];
+this.IdpSandbox = IdpSandbox;
diff --git a/dom/media/Intervals.h b/dom/media/Intervals.h
new file mode 100644
index 000000000..4181d8954
--- /dev/null
+++ b/dom/media/Intervals.h
@@ -0,0 +1,758 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef INTERVALS_H
+#define INTERVALS_H
+
+#include <algorithm>
+#include "mozilla/TypeTraits.h"
+#include "nsTArray.h"
+
+// Specialization for nsTArray CopyChooser.
+namespace mozilla {
+namespace media {
+template<class T>
+class IntervalSet;
+} // namespace media
+} // namespace mozilla
+
+template<class E>
+struct nsTArray_CopyChooser<mozilla::media::IntervalSet<E>>
+{
+ typedef nsTArray_CopyWithConstructors<mozilla::media::IntervalSet<E>> Type;
+};
+
+namespace mozilla {
+namespace media {
+
+/* Interval defines an interval between two points. Unlike a traditional
+ interval [A,B] where A <= x <= B, the upper boundary B is exclusive: A <= x < B
+ (e.g [A,B[ or [A,B) depending on where you're living)
+ It provides basic interval arithmetic and fuzzy edges.
+ The type T must provides a default constructor and +, -, <, <= and ==
+ operators.
+ */
+template<typename T>
+class Interval
+{
+public:
+ typedef Interval<T> SelfType;
+
+ Interval()
+ : mStart(T())
+ , mEnd(T())
+ , mFuzz(T())
+ { }
+
+ template<typename StartArg, typename EndArg>
+ Interval(StartArg&& aStart, EndArg&& aEnd)
+ : mStart(Forward<StartArg>(aStart))
+ , mEnd(Forward<EndArg>(aEnd))
+ , mFuzz()
+ {
+ MOZ_ASSERT(aStart <= aEnd);
+ }
+
+ template<typename StartArg, typename EndArg, typename FuzzArg>
+ Interval(StartArg&& aStart, EndArg&& aEnd, FuzzArg&& aFuzz)
+ : mStart(Forward<StartArg>(aStart))
+ , mEnd(Forward<EndArg>(aEnd))
+ , mFuzz(Forward<FuzzArg>(aFuzz))
+ {
+ MOZ_ASSERT(aStart <= aEnd);
+ }
+
+ Interval(const SelfType& aOther)
+ : mStart(aOther.mStart)
+ , mEnd(aOther.mEnd)
+ , mFuzz(aOther.mFuzz)
+ { }
+
+ Interval(SelfType&& aOther)
+ : mStart(Move(aOther.mStart))
+ , mEnd(Move(aOther.mEnd))
+ , mFuzz(Move(aOther.mFuzz))
+ { }
+
+ SelfType& operator= (const SelfType& aOther)
+ {
+ mStart = aOther.mStart;
+ mEnd = aOther.mEnd;
+ mFuzz = aOther.mFuzz;
+ return *this;
+ }
+
+ SelfType& operator= (SelfType&& aOther)
+ {
+ MOZ_ASSERT(&aOther != this, "self-moves are prohibited");
+ this->~Interval();
+ new(this) Interval(Move(aOther));
+ return *this;
+ }
+
+ // Basic interval arithmetic operator definition.
+ SelfType operator+ (const SelfType& aOther) const
+ {
+ return SelfType(mStart + aOther.mStart,
+ mEnd + aOther.mEnd,
+ mFuzz + aOther.mFuzz);
+ }
+
+ // Basic interval arithmetic operator definition.
+ SelfType operator- (const SelfType& aOther) const
+ {
+ return SelfType(mStart - aOther.mEnd,
+ mEnd - aOther.mStart,
+ mFuzz + aOther.mFuzz);
+ }
+
+ bool operator== (const SelfType& aOther) const
+ {
+ return mStart == aOther.mStart && mEnd == aOther.mEnd;
+ }
+
+ bool operator!= (const SelfType& aOther) const
+ {
+ return !(*this == aOther);
+ }
+
+ bool Contains(const T& aX) const
+ {
+ return mStart - mFuzz <= aX && aX < mEnd + mFuzz;
+ }
+
+ bool ContainsStrict(const T& aX) const
+ {
+ return mStart <= aX && aX < mEnd;
+ }
+
+ bool ContainsWithStrictEnd(const T& aX) const
+ {
+ return mStart - mFuzz <= aX && aX < mEnd;
+ }
+
+ bool Contains(const SelfType& aOther) const
+ {
+ return (mStart - mFuzz <= aOther.mStart + aOther.mFuzz)
+ && (aOther.mEnd - aOther.mFuzz <= mEnd + mFuzz);
+ }
+
+ bool ContainsStrict(const SelfType& aOther) const
+ {
+ return mStart <= aOther.mStart && aOther.mEnd <= mEnd;
+ }
+
+ bool ContainsWithStrictEnd(const SelfType& aOther) const
+ {
+ return (mStart - mFuzz <= aOther.mStart + aOther.mFuzz)
+ && aOther.mEnd <= mEnd;
+ }
+
+ bool Intersects(const SelfType& aOther) const
+ {
+ return (mStart - mFuzz < aOther.mEnd + aOther.mFuzz)
+ && (aOther.mStart - aOther.mFuzz < mEnd + mFuzz);
+ }
+
+ bool IntersectsStrict(const SelfType& aOther) const
+ {
+ return mStart < aOther.mEnd && aOther.mStart < mEnd;
+ }
+
+ // Same as Intersects, but including the boundaries.
+ bool Touches(const SelfType& aOther) const
+ {
+ return (mStart - mFuzz <= aOther.mEnd + aOther.mFuzz)
+ && (aOther.mStart - aOther.mFuzz <= mEnd + mFuzz);
+ }
+
+ // Returns true if aOther is strictly to the right of this and contiguous.
+ // This operation isn't commutative.
+ bool Contiguous(const SelfType& aOther) const
+ {
+ return mEnd <= aOther.mStart && aOther.mStart - mEnd <= mFuzz + aOther.mFuzz;
+ }
+
+ bool RightOf(const SelfType& aOther) const
+ {
+ return aOther.mEnd - aOther.mFuzz <= mStart + mFuzz;
+ }
+
+ bool LeftOf(const SelfType& aOther) const
+ {
+ return mEnd - mFuzz <= aOther.mStart + aOther.mFuzz;
+ }
+
+ SelfType Span(const SelfType& aOther) const
+ {
+ if (IsEmpty()) {
+ return aOther;
+ }
+ SelfType result(*this);
+ if (aOther.mStart < mStart) {
+ result.mStart = aOther.mStart;
+ }
+ if (mEnd < aOther.mEnd) {
+ result.mEnd = aOther.mEnd;
+ }
+ if (mFuzz < aOther.mFuzz) {
+ result.mFuzz = aOther.mFuzz;
+ }
+ return result;
+ }
+
+ SelfType Intersection(const SelfType& aOther) const
+ {
+ const T& s = std::max(mStart, aOther.mStart);
+ const T& e = std::min(mEnd, aOther.mEnd);
+ const T& f = std::max(mFuzz, aOther.mFuzz);
+ if (s < e) {
+ return SelfType(s, e, f);
+ }
+ // Return an empty interval.
+ return SelfType();
+ }
+
+ T Length() const
+ {
+ return mEnd - mStart;
+ }
+
+ bool IsEmpty() const
+ {
+ return mStart == mEnd;
+ }
+
+ void SetFuzz(const T& aFuzz)
+ {
+ mFuzz = aFuzz;
+ }
+
+ // Returns true if the two intervals intersect with this being on the right
+ // of aOther
+ bool TouchesOnRight(const SelfType& aOther) const
+ {
+ return aOther.mStart <= mStart
+ && (mStart - mFuzz <= aOther.mEnd + aOther.mFuzz)
+ && (aOther.mStart - aOther.mFuzz <= mEnd + mFuzz);
+ }
+
+ T mStart;
+ T mEnd;
+ T mFuzz;
+
+private:
+};
+
+// An IntervalSet in a collection of Intervals. The IntervalSet is always
+// normalized.
+template<typename T>
+class IntervalSet
+{
+public:
+ typedef IntervalSet<T> SelfType;
+ typedef Interval<T> ElemType;
+ typedef AutoTArray<ElemType,4> ContainerType;
+ typedef typename ContainerType::index_type IndexType;
+
+ IntervalSet()
+ {
+ }
+ virtual ~IntervalSet()
+ {
+ }
+
+ IntervalSet(const SelfType& aOther)
+ : mIntervals(aOther.mIntervals)
+ {
+ }
+
+ IntervalSet(SelfType&& aOther)
+ {
+ mIntervals.AppendElements(Move(aOther.mIntervals));
+ }
+
+ explicit IntervalSet(const ElemType& aOther)
+ {
+ if (!aOther.IsEmpty()) {
+ mIntervals.AppendElement(aOther);
+ }
+ }
+
+ explicit IntervalSet(ElemType&& aOther)
+ {
+ if (!aOther.IsEmpty()) {
+ mIntervals.AppendElement(Move(aOther));
+ }
+ }
+
+ bool operator== (const SelfType& aOther) const
+ {
+ return mIntervals == aOther.mIntervals;
+ }
+
+ bool operator!= (const SelfType& aOther) const
+ {
+ return mIntervals != aOther.mIntervals;
+ }
+
+ SelfType& operator= (const SelfType& aOther)
+ {
+ mIntervals = aOther.mIntervals;
+ return *this;
+ }
+
+ SelfType& operator= (SelfType&& aOther)
+ {
+ MOZ_ASSERT(&aOther != this, "self-moves are prohibited");
+ this->~IntervalSet();
+ new(this) IntervalSet(Move(aOther));
+ return *this;
+ }
+
+ SelfType& operator= (const ElemType& aInterval)
+ {
+ mIntervals.Clear();
+ if (!aInterval.IsEmpty()) {
+ mIntervals.AppendElement(aInterval);
+ }
+ return *this;
+ }
+
+ SelfType& operator= (ElemType&& aInterval)
+ {
+ mIntervals.Clear();
+ if (!aInterval.IsEmpty()) {
+ mIntervals.AppendElement(Move(aInterval));
+ }
+ return *this;
+ }
+
+ SelfType& Add(const SelfType& aIntervals)
+ {
+ mIntervals.AppendElements(aIntervals.mIntervals);
+ Normalize();
+ return *this;
+ }
+
+ SelfType& Add(const ElemType& aInterval)
+ {
+ if (aInterval.IsEmpty()) {
+ return *this;
+ }
+ if (mIntervals.IsEmpty()) {
+ mIntervals.AppendElement(aInterval);
+ return *this;
+ }
+ ElemType& last = mIntervals.LastElement();
+ if (aInterval.TouchesOnRight(last)) {
+ last = last.Span(aInterval);
+ return *this;
+ }
+ // Most of our actual usage is adding an interval that will be outside the
+ // range. We can speed up normalization here.
+ if (aInterval.RightOf(last)) {
+ mIntervals.AppendElement(aInterval);
+ return *this;
+ }
+
+ ContainerType normalized;
+ ElemType current(aInterval);
+ IndexType i = 0;
+ for (; i < mIntervals.Length(); i++) {
+ ElemType& interval = mIntervals[i];
+ if (current.Touches(interval)) {
+ current = current.Span(interval);
+ } else if (current.LeftOf(interval)) {
+ break;
+ } else {
+ normalized.AppendElement(Move(interval));
+ }
+ }
+ normalized.AppendElement(Move(current));
+ for (; i < mIntervals.Length(); i++) {
+ normalized.AppendElement(Move(mIntervals[i]));
+ }
+ mIntervals.Clear();
+ mIntervals.AppendElements(Move(normalized));
+
+ return *this;
+ }
+
+ SelfType& operator+= (const SelfType& aIntervals)
+ {
+ Add(aIntervals);
+ return *this;
+ }
+
+ SelfType& operator+= (const ElemType& aInterval)
+ {
+ Add(aInterval);
+ return *this;
+ }
+
+ SelfType operator+ (const SelfType& aIntervals) const
+ {
+ SelfType intervals(*this);
+ intervals.Add(aIntervals);
+ return intervals;
+ }
+
+ SelfType operator+ (const ElemType& aInterval) const
+ {
+ SelfType intervals(*this);
+ intervals.Add(aInterval);
+ return intervals;
+ }
+
+ friend SelfType operator+ (const ElemType& aInterval,
+ const SelfType& aIntervals)
+ {
+ SelfType intervals;
+ intervals.Add(aInterval);
+ intervals.Add(aIntervals);
+ return intervals;
+ }
+
+ // Excludes an interval from an IntervalSet.
+ // This is done by inverting aInterval within the bounds of mIntervals
+ // and then doing the intersection.
+ SelfType& operator-= (const ElemType& aInterval)
+ {
+ if (aInterval.IsEmpty() || mIntervals.IsEmpty()) {
+ return *this;
+ }
+ T firstEnd = std::max(mIntervals[0].mStart, aInterval.mStart);
+ T secondStart = std::min(mIntervals.LastElement().mEnd, aInterval.mEnd);
+ ElemType startInterval(mIntervals[0].mStart, firstEnd);
+ ElemType endInterval(secondStart, mIntervals.LastElement().mEnd);
+ SelfType intervals(Move(startInterval));
+ intervals += Move(endInterval);
+ return Intersection(intervals);
+ }
+
+ SelfType& operator-= (const SelfType& aIntervals)
+ {
+ for (const auto& interval : aIntervals.mIntervals) {
+ *this -= interval;
+ }
+ return *this;
+ }
+
+ SelfType operator- (const SelfType& aInterval) const
+ {
+ SelfType intervals(*this);
+ intervals -= aInterval;
+ return intervals;
+ }
+
+ SelfType operator- (const ElemType& aInterval) const
+ {
+ SelfType intervals(*this);
+ intervals -= aInterval;
+ return intervals;
+ }
+
+ // Mutate this IntervalSet to be the union of this and aOther.
+ SelfType& Union(const SelfType& aOther)
+ {
+ Add(aOther);
+ return *this;
+ }
+
+ SelfType& Union(const ElemType& aInterval)
+ {
+ Add(aInterval);
+ return *this;
+ }
+
+ // Mutate this TimeRange to be the intersection of this and aOther.
+ SelfType& Intersection(const SelfType& aOther)
+ {
+ ContainerType intersection;
+
+ const ContainerType& other = aOther.mIntervals;
+ IndexType i = 0, j = 0;
+ for (; i < mIntervals.Length() && j < other.Length();) {
+ if (mIntervals[i].IntersectsStrict(other[j])) {
+ intersection.AppendElement(mIntervals[i].Intersection(other[j]));
+ }
+ if (mIntervals[i].mEnd < other[j].mEnd) {
+ i++;
+ } else {
+ j++;
+ }
+ }
+ mIntervals.Clear();
+ mIntervals.AppendElements(Move(intersection));
+ return *this;
+ }
+
+ SelfType& Intersection(const ElemType& aInterval)
+ {
+ SelfType intervals(aInterval);
+ return Intersection(intervals);
+ }
+
+ const ElemType& operator[] (IndexType aIndex) const
+ {
+ return mIntervals[aIndex];
+ }
+
+ // Returns the start boundary of the first interval. Or a default constructed
+ // T if IntervalSet is empty (and aExists if provided will be set to false).
+ T GetStart(bool* aExists = nullptr) const
+ {
+ bool exists = !mIntervals.IsEmpty();
+
+ if (aExists) {
+ *aExists = exists;
+ }
+
+ if (exists) {
+ return mIntervals[0].mStart;
+ } else {
+ return T();
+ }
+ }
+
+ // Returns the end boundary of the last interval. Or a default constructed T
+ // if IntervalSet is empty (and aExists if provided will be set to false).
+ T GetEnd(bool* aExists = nullptr) const
+ {
+ bool exists = !mIntervals.IsEmpty();
+ if (aExists) {
+ *aExists = exists;
+ }
+
+ if (exists) {
+ return mIntervals.LastElement().mEnd;
+ } else {
+ return T();
+ }
+ }
+
+ IndexType Length() const
+ {
+ return mIntervals.Length();
+ }
+
+ T Start(IndexType aIndex) const
+ {
+ return mIntervals[aIndex].mStart;
+ }
+
+ T Start(IndexType aIndex, bool& aExists) const
+ {
+ aExists = aIndex < mIntervals.Length();
+
+ if (aExists) {
+ return mIntervals[aIndex].mStart;
+ } else {
+ return T();
+ }
+ }
+
+ T End(IndexType aIndex) const
+ {
+ return mIntervals[aIndex].mEnd;
+ }
+
+ T End(IndexType aIndex, bool& aExists) const
+ {
+ aExists = aIndex < mIntervals.Length();
+
+ if (aExists) {
+ return mIntervals[aIndex].mEnd;
+ } else {
+ return T();
+ }
+ }
+
+ bool Contains(const ElemType& aInterval) const
+ {
+ for (const auto& interval : mIntervals) {
+ if (interval.Contains(aInterval)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool ContainsStrict(const ElemType& aInterval) const
+ {
+ for (const auto& interval : mIntervals) {
+ if (interval.ContainsStrict(aInterval)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Contains(const T& aX) const
+ {
+ for (const auto& interval : mIntervals)
+ {
+ if (interval.Contains(aX)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool ContainsStrict(const T& aX) const
+ {
+ for (const auto& interval : mIntervals) {
+ if (interval.ContainsStrict(aX)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool ContainsWithStrictEnd(const T& aX) const
+ {
+ for (const auto& interval : mIntervals) {
+ if (interval.ContainsWithStrictEnd(aX)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Shift all values by aOffset.
+ SelfType& Shift(const T& aOffset)
+ {
+ for (auto& interval : mIntervals) {
+ interval.mStart = interval.mStart + aOffset;
+ interval.mEnd = interval.mEnd + aOffset;
+ }
+ return *this;
+ }
+
+ void SetFuzz(const T& aFuzz)
+ {
+ for (auto& interval : mIntervals) {
+ interval.SetFuzz(aFuzz);
+ }
+ Normalize();
+ }
+
+ static const IndexType NoIndex = IndexType(-1);
+
+ IndexType Find(const T& aValue) const
+ {
+ for (IndexType i = 0; i < mIntervals.Length(); i++) {
+ if (mIntervals[i].Contains(aValue)) {
+ return i;
+ }
+ }
+ return NoIndex;
+ }
+
+ // Methods for range-based for loops.
+ typename ContainerType::iterator begin()
+ {
+ return mIntervals.begin();
+ }
+
+ typename ContainerType::const_iterator begin() const
+ {
+ return mIntervals.begin();
+ }
+
+ typename ContainerType::iterator end()
+ {
+ return mIntervals.end();
+ }
+
+ typename ContainerType::const_iterator end() const
+ {
+ return mIntervals.end();
+ }
+
+ ElemType& LastInterval()
+ {
+ MOZ_ASSERT(!mIntervals.IsEmpty());
+ return mIntervals.LastElement();
+ }
+
+ const ElemType& LastInterval() const
+ {
+ MOZ_ASSERT(!mIntervals.IsEmpty());
+ return mIntervals.LastElement();
+ }
+
+ void Clear()
+ {
+ mIntervals.Clear();
+ }
+
+protected:
+ ContainerType mIntervals;
+
+private:
+ void Normalize()
+ {
+ if (mIntervals.Length() >= 2) {
+ ContainerType normalized;
+
+ mIntervals.Sort(CompareIntervals());
+
+ // This merges the intervals.
+ ElemType current(mIntervals[0]);
+ for (IndexType i = 1; i < mIntervals.Length(); i++) {
+ ElemType& interval = mIntervals[i];
+ if (current.Touches(interval)) {
+ current = current.Span(interval);
+ } else {
+ normalized.AppendElement(Move(current));
+ current = Move(interval);
+ }
+ }
+ normalized.AppendElement(Move(current));
+
+ mIntervals.Clear();
+ mIntervals.AppendElements(Move(normalized));
+ }
+ }
+
+ struct CompareIntervals
+ {
+ bool Equals(const ElemType& aT1, const ElemType& aT2) const
+ {
+ return aT1.mStart == aT2.mStart && aT1.mEnd == aT2.mEnd;
+ }
+
+ bool LessThan(const ElemType& aT1, const ElemType& aT2) const {
+ return aT1.mStart - aT1.mFuzz < aT2.mStart + aT2.mFuzz;
+ }
+ };
+};
+
+ // clang doesn't allow for this to be defined inline of IntervalSet.
+template<typename T>
+IntervalSet<T> Union(const IntervalSet<T>& aIntervals1,
+ const IntervalSet<T>& aIntervals2)
+{
+ IntervalSet<T> intervals(aIntervals1);
+ intervals.Union(aIntervals2);
+ return intervals;
+}
+
+template<typename T>
+IntervalSet<T> Intersection(const IntervalSet<T>& aIntervals1,
+ const IntervalSet<T>& aIntervals2)
+{
+ IntervalSet<T> intersection(aIntervals1);
+ intersection.Intersection(aIntervals2);
+ return intersection;
+}
+
+} // namespace media
+} // namespace mozilla
+
+#endif // INTERVALS_H
diff --git a/dom/media/Latency.cpp b/dom/media/Latency.cpp
new file mode 100644
index 000000000..8d1bd46a4
--- /dev/null
+++ b/dom/media/Latency.cpp
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "Latency.h"
+#include "nsThreadUtils.h"
+#include "mozilla/Logging.h"
+#include <cmath>
+#include <algorithm>
+
+#include <mozilla/Services.h>
+#include <mozilla/StaticPtr.h>
+#include "nsContentUtils.h"
+
+using namespace mozilla;
+
+const char* LatencyLogIndex2Strings[] = {
+ "Audio MediaStreamTrack",
+ "Video MediaStreamTrack",
+ "Cubeb",
+ "AudioStream",
+ "NetEQ",
+ "AudioCapture Base",
+ "AudioCapture Samples",
+ "AudioTrackInsertion",
+ "MediaPipeline Audio Insertion",
+ "AudioTransmit",
+ "AudioReceive",
+ "MediaPipelineAudioPlayout",
+ "MediaStream Create",
+ "AudioStream Create",
+ "AudioSendRTP",
+ "AudioRecvRTP"
+};
+
+static StaticRefPtr<AsyncLatencyLogger> gAsyncLogger;
+
+LogModule*
+GetLatencyLog()
+{
+ static LazyLogModule sLog("MediaLatency");
+ return sLog;
+}
+
+class LogEvent : public Runnable
+{
+public:
+ LogEvent(AsyncLatencyLogger::LatencyLogIndex aIndex, uint64_t aID, int64_t aValue,
+ TimeStamp aTimeStamp) :
+ mIndex(aIndex),
+ mID(aID),
+ mValue(aValue),
+ mTimeStamp(aTimeStamp)
+ {}
+ LogEvent(AsyncLatencyLogger::LatencyLogIndex aIndex, uint64_t aID, int64_t aValue) :
+ mIndex(aIndex),
+ mID(aID),
+ mValue(aValue),
+ mTimeStamp(TimeStamp())
+ {}
+ ~LogEvent() {}
+
+ NS_IMETHOD Run() override {
+ AsyncLatencyLogger::Get(true)->WriteLog(mIndex, mID, mValue, mTimeStamp);
+ return NS_OK;
+ }
+
+protected:
+ AsyncLatencyLogger::LatencyLogIndex mIndex;
+ uint64_t mID;
+ int64_t mValue;
+ TimeStamp mTimeStamp;
+};
+
+void LogLatency(AsyncLatencyLogger::LatencyLogIndex aIndex, uint64_t aID, int64_t aValue)
+{
+ AsyncLatencyLogger::Get()->Log(aIndex, aID, aValue);
+}
+
+void LogTime(AsyncLatencyLogger::LatencyLogIndex aIndex, uint64_t aID, int64_t aValue)
+{
+ TimeStamp now = TimeStamp::Now();
+ AsyncLatencyLogger::Get()->Log(aIndex, aID, aValue, now);
+}
+
+void LogTime(AsyncLatencyLogger::LatencyLogIndex aIndex, uint64_t aID, int64_t aValue, TimeStamp &aTime)
+{
+ AsyncLatencyLogger::Get()->Log(aIndex, aID, aValue, aTime);
+}
+
+void LogTime(uint32_t aIndex, uint64_t aID, int64_t aValue)
+{
+ LogTime(static_cast<AsyncLatencyLogger::LatencyLogIndex>(aIndex), aID, aValue);
+}
+void LogTime(uint32_t aIndex, uint64_t aID, int64_t aValue, TimeStamp &aTime)
+{
+ LogTime(static_cast<AsyncLatencyLogger::LatencyLogIndex>(aIndex), aID, aValue, aTime);
+}
+void LogLatency(uint32_t aIndex, uint64_t aID, int64_t aValue)
+{
+ LogLatency(static_cast<AsyncLatencyLogger::LatencyLogIndex>(aIndex), aID, aValue);
+}
+
+/* static */
+void AsyncLatencyLogger::InitializeStatics()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Main thread only");
+
+ //Make sure that the underlying logger is allocated.
+ GetLatencyLog();
+ gAsyncLogger = new AsyncLatencyLogger();
+}
+
+/* static */
+void AsyncLatencyLogger::ShutdownLogger()
+{
+ gAsyncLogger = nullptr;
+}
+
+/* static */
+AsyncLatencyLogger* AsyncLatencyLogger::Get(bool aStartTimer)
+{
+ // Users don't generally null-check the result since we should live longer than they
+ MOZ_ASSERT(gAsyncLogger);
+
+ if (aStartTimer) {
+ gAsyncLogger->Init();
+ }
+ return gAsyncLogger;
+}
+
+NS_IMPL_ISUPPORTS(AsyncLatencyLogger, nsIObserver)
+
+AsyncLatencyLogger::AsyncLatencyLogger()
+ : mThread(nullptr),
+ mMutex("AsyncLatencyLogger")
+{
+ NS_ASSERTION(NS_IsMainThread(), "Main thread only");
+ nsContentUtils::RegisterShutdownObserver(this);
+}
+
+AsyncLatencyLogger::~AsyncLatencyLogger()
+{
+ AsyncLatencyLogger::Shutdown();
+}
+
+void AsyncLatencyLogger::Shutdown()
+{
+ nsContentUtils::UnregisterShutdownObserver(this);
+
+ MutexAutoLock lock(mMutex);
+ if (mThread) {
+ mThread->Shutdown();
+ }
+ mStart = TimeStamp(); // make sure we don't try to restart it for any reason
+}
+
+void AsyncLatencyLogger::Init()
+{
+ MutexAutoLock lock(mMutex);
+ if (mStart.IsNull()) {
+ nsresult rv = NS_NewNamedThread("Latency Logger", getter_AddRefs(mThread));
+ NS_ENSURE_SUCCESS_VOID(rv);
+ mStart = TimeStamp::Now();
+ }
+}
+
+void AsyncLatencyLogger::GetStartTime(TimeStamp &aStart)
+{
+ MutexAutoLock lock(mMutex);
+ aStart = mStart;
+}
+
+nsresult
+AsyncLatencyLogger::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) {
+ Shutdown();
+ }
+ return NS_OK;
+}
+
+// aID is a sub-identifier (in particular a specific MediaStramTrack)
+void AsyncLatencyLogger::WriteLog(LatencyLogIndex aIndex, uint64_t aID, int64_t aValue,
+ TimeStamp aTimeStamp)
+{
+ if (aTimeStamp.IsNull()) {
+ MOZ_LOG(GetLatencyLog(), LogLevel::Debug,
+ ("Latency: %s,%llu,%lld,%lld",
+ LatencyLogIndex2Strings[aIndex], aID, GetTimeStamp(), aValue));
+ } else {
+ MOZ_LOG(GetLatencyLog(), LogLevel::Debug,
+ ("Latency: %s,%llu,%lld,%lld,%lld",
+ LatencyLogIndex2Strings[aIndex], aID, GetTimeStamp(), aValue,
+ static_cast<int64_t>((aTimeStamp - gAsyncLogger->mStart).ToMilliseconds())));
+ }
+}
+
+int64_t AsyncLatencyLogger::GetTimeStamp()
+{
+ TimeDuration t = TimeStamp::Now() - mStart;
+ return t.ToMilliseconds();
+}
+
+void AsyncLatencyLogger::Log(LatencyLogIndex aIndex, uint64_t aID, int64_t aValue)
+{
+ TimeStamp null;
+ Log(aIndex, aID, aValue, null);
+}
+
+void AsyncLatencyLogger::Log(LatencyLogIndex aIndex, uint64_t aID, int64_t aValue, TimeStamp &aTime)
+{
+ if (MOZ_LOG_TEST(GetLatencyLog(), LogLevel::Debug)) {
+ nsCOMPtr<nsIRunnable> event = new LogEvent(aIndex, aID, aValue, aTime);
+ if (mThread) {
+ mThread->Dispatch(event, NS_DISPATCH_NORMAL);
+ }
+ }
+}
diff --git a/dom/media/Latency.h b/dom/media/Latency.h
new file mode 100644
index 000000000..b86ee7b54
--- /dev/null
+++ b/dom/media/Latency.h
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_LATENCY_H
+#define MOZILLA_LATENCY_H
+
+#include "mozilla/TimeStamp.h"
+#include "mozilla/Logging.h"
+#include "nsCOMPtr.h"
+#include "nsIThread.h"
+#include "mozilla/Monitor.h"
+#include "nsISupportsImpl.h"
+#include "nsIObserver.h"
+
+class AsyncLatencyLogger;
+
+mozilla::LogModule* GetLatencyLog();
+
+// This class is a singleton. It is refcounted.
+class AsyncLatencyLogger : public nsIObserver
+{
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+public:
+
+ enum LatencyLogIndex {
+ AudioMediaStreamTrack = 0,
+ VideoMediaStreamTrack,
+ Cubeb,
+ AudioStream,
+ NetEQ,
+ AudioCaptureBase, // base time for capturing an audio stream
+ AudioCapture, // records number of samples captured and the time
+ AudioTrackInsertion, // # of samples inserted into a mediastreamtrack and the time
+ MediaPipelineAudioInsertion, // Timestamp and time of timestamp
+ AudioTransmit, // Timestamp and socket send time
+ AudioReceive, // Timestamp and receive time
+ MediaPipelineAudioPlayout, // Timestamp and playout into MST time
+ MediaStreamCreate, // Source and TrackUnion streams
+ AudioStreamCreate, // TrackUnion stream and AudioStream
+ AudioSendRTP,
+ AudioRecvRTP,
+ _MAX_INDEX
+ };
+ // Log with a null timestamp
+ void Log(LatencyLogIndex index, uint64_t aID, int64_t aValue);
+ // Log with a timestamp
+ void Log(LatencyLogIndex index, uint64_t aID, int64_t aValue,
+ mozilla::TimeStamp &aTime);
+ // Write a log message to NSPR
+ void WriteLog(LatencyLogIndex index, uint64_t aID, int64_t aValue,
+ mozilla::TimeStamp timestamp);
+ // Get the base time used by the logger for delta calculations
+ void GetStartTime(mozilla::TimeStamp &aStart);
+
+ static AsyncLatencyLogger* Get(bool aStartTimer = false);
+ static void InitializeStatics();
+ // After this is called, the global log object may go away
+ static void ShutdownLogger();
+private:
+ AsyncLatencyLogger();
+ virtual ~AsyncLatencyLogger();
+ int64_t GetTimeStamp();
+ void Init();
+ // Shut down the thread associated with this, and make sure it doesn't
+ // start up again.
+ void Shutdown();
+ // The thread on which the IO happens
+ nsCOMPtr<nsIThread> mThread;
+ // This can be initialized on multiple threads, but is protected by a
+ // monitor. After the initialization phase, it is accessed on the log
+ // thread only.
+ mozilla::TimeStamp mStart;
+ // This monitor protects mStart and mMediaLatencyLog for the
+ // initialization sequence. It is initialized at layout startup, and
+ // destroyed at layout shutdown.
+ mozilla::Mutex mMutex;
+};
+
+// need uint32_t versions for access from webrtc/trunk code
+// Log without a time delta
+void LogLatency(AsyncLatencyLogger::LatencyLogIndex index, uint64_t aID, int64_t aValue);
+void LogLatency(uint32_t index, uint64_t aID, int64_t aValue);
+// Log TimeStamp::Now() (as delta)
+void LogTime(AsyncLatencyLogger::LatencyLogIndex index, uint64_t aID, int64_t aValue);
+void LogTime(uint32_t index, uint64_t aID, int64_t aValue);
+// Log the specified time (as delta)
+void LogTime(AsyncLatencyLogger::LatencyLogIndex index, uint64_t aID, int64_t aValue,
+ mozilla::TimeStamp &aTime);
+
+// For generating unique-ish ids for logged sources
+#define LATENCY_STREAM_ID(source, trackID) \
+ ((((uint64_t) (source)) & ~0x0F) | (trackID))
+
+#endif
diff --git a/dom/media/MP3Decoder.cpp b/dom/media/MP3Decoder.cpp
new file mode 100644
index 000000000..b71111e79
--- /dev/null
+++ b/dom/media/MP3Decoder.cpp
@@ -0,0 +1,50 @@
+
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MP3Decoder.h"
+#include "MediaDecoderStateMachine.h"
+#include "MediaFormatReader.h"
+#include "MP3Demuxer.h"
+#include "PDMFactory.h"
+
+namespace mozilla {
+
+MediaDecoder*
+MP3Decoder::Clone(MediaDecoderOwner* aOwner) {
+ if (!IsEnabled()) {
+ return nullptr;
+ }
+ return new MP3Decoder(aOwner);
+}
+
+MediaDecoderStateMachine*
+MP3Decoder::CreateStateMachine() {
+ RefPtr<MediaDecoderReader> reader =
+ new MediaFormatReader(this, new mp3::MP3Demuxer(GetResource()));
+ return new MediaDecoderStateMachine(this, reader);
+}
+
+/* static */
+bool
+MP3Decoder::IsEnabled() {
+ RefPtr<PDMFactory> platform = new PDMFactory();
+ return platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/mpeg"),
+ /* DecoderDoctorDiagnostics* */ nullptr);
+}
+
+/* static */
+bool MP3Decoder::CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs)
+{
+ if (aType.EqualsASCII("audio/mp3") || aType.EqualsASCII("audio/mpeg")) {
+ return IsEnabled() &&
+ (aCodecs.IsEmpty() || aCodecs.EqualsASCII("mp3"));
+ }
+ return false;
+}
+
+} // namespace mozilla
diff --git a/dom/media/MP3Decoder.h b/dom/media/MP3Decoder.h
new file mode 100644
index 000000000..887251065
--- /dev/null
+++ b/dom/media/MP3Decoder.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MP3Decoder_h_
+#define MP3Decoder_h_
+
+#include "MediaDecoder.h"
+
+namespace mozilla {
+
+class MP3Decoder : public MediaDecoder {
+public:
+ // MediaDecoder interface.
+ explicit MP3Decoder(MediaDecoderOwner* aOwner) : MediaDecoder(aOwner) {}
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override;
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // Returns true if the MP3 backend is preffed on, and we're running on a
+ // platform that is likely to have decoders for the format.
+ static bool IsEnabled();
+ static bool CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs);
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MP3Demuxer.cpp b/dom/media/MP3Demuxer.cpp
new file mode 100644
index 000000000..7d478a41b
--- /dev/null
+++ b/dom/media/MP3Demuxer.cpp
@@ -0,0 +1,1342 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MP3Demuxer.h"
+
+#include <inttypes.h>
+#include <algorithm>
+
+#include "mozilla/Assertions.h"
+#include "mozilla/EndianUtils.h"
+#include "nsAutoPtr.h"
+#include "VideoUtils.h"
+#include "TimeUnits.h"
+#include "prenv.h"
+
+#ifdef PR_LOGGING
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+#define MP3LOG(msg, ...) \
+ MOZ_LOG(gMediaDemuxerLog, LogLevel::Debug, ("MP3Demuxer " msg, ##__VA_ARGS__))
+#define MP3LOGV(msg, ...) \
+ MOZ_LOG(gMediaDemuxerLog, LogLevel::Verbose, ("MP3Demuxer " msg, ##__VA_ARGS__))
+#else
+#define MP3LOG(msg, ...)
+#define MP3LOGV(msg, ...)
+#endif
+
+using mozilla::media::TimeUnit;
+using mozilla::media::TimeInterval;
+using mozilla::media::TimeIntervals;
+using mp4_demuxer::ByteReader;
+
+namespace mozilla {
+namespace mp3 {
+
+// MP3Demuxer
+
+MP3Demuxer::MP3Demuxer(MediaResource* aSource)
+ : mSource(aSource)
+{}
+
+bool
+MP3Demuxer::InitInternal() {
+ if (!mTrackDemuxer) {
+ mTrackDemuxer = new MP3TrackDemuxer(mSource);
+ }
+ return mTrackDemuxer->Init();
+}
+
+RefPtr<MP3Demuxer::InitPromise>
+MP3Demuxer::Init() {
+ if (!InitInternal()) {
+ MP3LOG("MP3Demuxer::Init() failure: waiting for data");
+
+ return InitPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ MP3LOG("MP3Demuxer::Init() successful");
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+bool
+MP3Demuxer::HasTrackType(TrackInfo::TrackType aType) const {
+ return aType == TrackInfo::kAudioTrack;
+}
+
+uint32_t
+MP3Demuxer::GetNumberTracks(TrackInfo::TrackType aType) const {
+ return aType == TrackInfo::kAudioTrack ? 1u : 0u;
+}
+
+already_AddRefed<MediaTrackDemuxer>
+MP3Demuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber) {
+ if (!mTrackDemuxer) {
+ return nullptr;
+ }
+ return RefPtr<MP3TrackDemuxer>(mTrackDemuxer).forget();
+}
+
+bool
+MP3Demuxer::IsSeekable() const {
+ return true;
+}
+
+void
+MP3Demuxer::NotifyDataArrived() {
+ // TODO: bug 1169485.
+ NS_WARNING("Unimplemented function NotifyDataArrived");
+ MP3LOGV("NotifyDataArrived()");
+}
+
+void
+MP3Demuxer::NotifyDataRemoved() {
+ // TODO: bug 1169485.
+ NS_WARNING("Unimplemented function NotifyDataRemoved");
+ MP3LOGV("NotifyDataRemoved()");
+}
+
+
+// MP3TrackDemuxer
+
+MP3TrackDemuxer::MP3TrackDemuxer(MediaResource* aSource)
+ : mSource(aSource)
+ , mOffset(0)
+ , mFirstFrameOffset(0)
+ , mNumParsedFrames(0)
+ , mFrameIndex(0)
+ , mTotalFrameLen(0)
+ , mSamplesPerFrame(0)
+ , mSamplesPerSecond(0)
+ , mChannels(0)
+{
+ Reset();
+}
+
+bool
+MP3TrackDemuxer::Init() {
+ Reset();
+ FastSeek(TimeUnit());
+ // Read the first frame to fetch sample rate and other meta data.
+ RefPtr<MediaRawData> frame(GetNextFrame(FindFirstFrame()));
+
+ MP3LOG("Init StreamLength()=%" PRId64 " first-frame-found=%d",
+ StreamLength(), !!frame);
+
+ if (!frame) {
+ return false;
+ }
+
+ // Rewind back to the stream begin to avoid dropping the first frame.
+ FastSeek(TimeUnit());
+
+ if (!mInfo) {
+ mInfo = MakeUnique<AudioInfo>();
+ }
+
+ mInfo->mRate = mSamplesPerSecond;
+ mInfo->mChannels = mChannels;
+ mInfo->mBitDepth = 16;
+ mInfo->mMimeType = "audio/mpeg";
+ mInfo->mDuration = Duration().ToMicroseconds();
+
+ MP3LOG("Init mInfo={mRate=%d mChannels=%d mBitDepth=%d mDuration=%" PRId64 "}",
+ mInfo->mRate, mInfo->mChannels, mInfo->mBitDepth,
+ mInfo->mDuration);
+
+ return mSamplesPerSecond && mChannels;
+}
+
+media::TimeUnit
+MP3TrackDemuxer::SeekPosition() const {
+ TimeUnit pos = Duration(mFrameIndex);
+ if (Duration() > TimeUnit()) {
+ pos = std::min(Duration(), pos);
+ }
+ return pos;
+}
+
+const FrameParser::Frame&
+MP3TrackDemuxer::LastFrame() const {
+ return mParser.PrevFrame();
+}
+
+RefPtr<MediaRawData>
+MP3TrackDemuxer::DemuxSample() {
+ return GetNextFrame(FindNextFrame());
+}
+
+const ID3Parser::ID3Header&
+MP3TrackDemuxer::ID3Header() const {
+ return mParser.ID3Header();
+}
+
+const FrameParser::VBRHeader&
+MP3TrackDemuxer::VBRInfo() const {
+ return mParser.VBRInfo();
+}
+
+UniquePtr<TrackInfo>
+MP3TrackDemuxer::GetInfo() const {
+ return mInfo->Clone();
+}
+
+RefPtr<MP3TrackDemuxer::SeekPromise>
+MP3TrackDemuxer::Seek(TimeUnit aTime) {
+ // Efficiently seek to the position.
+ FastSeek(aTime);
+ // Correct seek position by scanning the next frames.
+ const TimeUnit seekTime = ScanUntil(aTime);
+
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+}
+
+TimeUnit
+MP3TrackDemuxer::FastSeek(const TimeUnit& aTime) {
+ MP3LOG("FastSeek(%" PRId64 ") avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64,
+ aTime.ToMicroseconds(), AverageFrameLength(), mNumParsedFrames,
+ mFrameIndex, mOffset);
+
+ const auto& vbr = mParser.VBRInfo();
+ if (!aTime.ToMicroseconds()) {
+ // Quick seek to the beginning of the stream.
+ mFrameIndex = 0;
+ } else if (vbr.IsTOCPresent() && Duration().ToMicroseconds() > 0) {
+ // Use TOC for more precise seeking.
+ const float durationFrac = static_cast<float>(aTime.ToMicroseconds()) /
+ Duration().ToMicroseconds();
+ mFrameIndex = FrameIndexFromOffset(vbr.Offset(durationFrac));
+ } else if (AverageFrameLength() > 0) {
+ mFrameIndex = FrameIndexFromTime(aTime);
+ }
+
+ mOffset = OffsetFromFrameIndex(mFrameIndex);
+
+ if (mOffset > mFirstFrameOffset && StreamLength() > 0) {
+ mOffset = std::min(StreamLength() - 1, mOffset);
+ }
+
+ mParser.EndFrameSession();
+
+ MP3LOG("FastSeek End TOC=%d avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mFirstFrameOffset=%llu mOffset=%" PRIu64
+ " SL=%llu NumBytes=%u",
+ vbr.IsTOCPresent(), AverageFrameLength(), mNumParsedFrames, mFrameIndex,
+ mFirstFrameOffset, mOffset, StreamLength(), vbr.NumBytes().valueOr(0));
+
+ return Duration(mFrameIndex);
+}
+
+TimeUnit
+MP3TrackDemuxer::ScanUntil(const TimeUnit& aTime) {
+ MP3LOG("ScanUntil(%" PRId64 ") avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64,
+ aTime.ToMicroseconds(), AverageFrameLength(), mNumParsedFrames,
+ mFrameIndex, mOffset);
+
+ if (!aTime.ToMicroseconds()) {
+ return FastSeek(aTime);
+ }
+
+ if (Duration(mFrameIndex) > aTime) {
+ FastSeek(aTime);
+ }
+
+ if (Duration(mFrameIndex + 1) > aTime) {
+ return SeekPosition();
+ }
+
+ MediaByteRange nextRange = FindNextFrame();
+ while (SkipNextFrame(nextRange) && Duration(mFrameIndex + 1) < aTime) {
+ nextRange = FindNextFrame();
+ MP3LOGV("ScanUntil* avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64 " Duration=%" PRId64,
+ AverageFrameLength(), mNumParsedFrames,
+ mFrameIndex, mOffset, Duration(mFrameIndex + 1).ToMicroseconds());
+ }
+
+ MP3LOG("ScanUntil End avgFrameLen=%f mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mOffset=%" PRIu64,
+ AverageFrameLength(), mNumParsedFrames, mFrameIndex, mOffset);
+
+ return SeekPosition();
+}
+
+RefPtr<MP3TrackDemuxer::SamplesPromise>
+MP3TrackDemuxer::GetSamples(int32_t aNumSamples) {
+ MP3LOGV("GetSamples(%d) Begin mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d "
+ "mSamplesPerSecond=%d mChannels=%d",
+ aNumSamples, mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ if (!aNumSamples) {
+ return SamplesPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ RefPtr<SamplesHolder> frames = new SamplesHolder();
+
+ while (aNumSamples--) {
+ RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame()));
+ if (!frame) {
+ break;
+ }
+
+ frames->mSamples.AppendElement(frame);
+ }
+
+ MP3LOGV("GetSamples() End mSamples.Size()=%d aNumSamples=%d mOffset=%" PRIu64
+ " mNumParsedFrames=%" PRIu64 " mFrameIndex=%" PRId64
+ " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d "
+ "mChannels=%d",
+ frames->mSamples.Length(), aNumSamples, mOffset, mNumParsedFrames,
+ mFrameIndex, mTotalFrameLen, mSamplesPerFrame, mSamplesPerSecond,
+ mChannels);
+
+ if (frames->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ }
+ return SamplesPromise::CreateAndResolve(frames, __func__);
+}
+
+void
+MP3TrackDemuxer::Reset() {
+ MP3LOG("Reset()");
+
+ FastSeek(TimeUnit());
+ mParser.Reset();
+}
+
+RefPtr<MP3TrackDemuxer::SkipAccessPointPromise>
+MP3TrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold) {
+ // Will not be called for audio-only resources.
+ return SkipAccessPointPromise::CreateAndReject(
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
+}
+
+int64_t
+MP3TrackDemuxer::GetResourceOffset() const {
+ return mOffset;
+}
+
+TimeIntervals
+MP3TrackDemuxer::GetBuffered() {
+ AutoPinned<MediaResource> stream(mSource.GetResource());
+ TimeIntervals buffered;
+
+ if (Duration() > TimeUnit() && stream->IsDataCachedToEndOfResource(0)) {
+ // Special case completely cached files. This also handles local files.
+ buffered += TimeInterval(TimeUnit(), Duration());
+ MP3LOGV("buffered = [[%" PRId64 ", %" PRId64 "]]",
+ TimeUnit().ToMicroseconds(), Duration().ToMicroseconds());
+ return buffered;
+ }
+
+ MediaByteRangeSet ranges;
+ nsresult rv = stream->GetCachedRanges(ranges);
+ NS_ENSURE_SUCCESS(rv, buffered);
+
+ for (const auto& range: ranges) {
+ if (range.IsEmpty()) {
+ continue;
+ }
+ TimeUnit start = Duration(FrameIndexFromOffset(range.mStart));
+ TimeUnit end = Duration(FrameIndexFromOffset(range.mEnd));
+ MP3LOGV("buffered += [%" PRId64 ", %" PRId64 "]",
+ start.ToMicroseconds(), end.ToMicroseconds());
+ buffered += TimeInterval(start, end);
+ }
+
+ return buffered;
+}
+
+int64_t
+MP3TrackDemuxer::StreamLength() const {
+ return mSource.GetLength();
+}
+
+TimeUnit
+MP3TrackDemuxer::Duration() const {
+ if (!mNumParsedFrames) {
+ return TimeUnit::FromMicroseconds(-1);
+ }
+
+ int64_t numFrames = 0;
+ const auto numAudioFrames = mParser.VBRInfo().NumAudioFrames();
+ if (mParser.VBRInfo().IsValid() && numAudioFrames.valueOr(0) + 1 > 1) {
+ // VBR headers don't include the VBR header frame.
+ numFrames = numAudioFrames.value() + 1;
+ } else {
+ const int64_t streamLen = StreamLength();
+ if (streamLen < 0) {
+ // Unknown length, we can't estimate duration.
+ return TimeUnit::FromMicroseconds(-1);
+ }
+ if (AverageFrameLength() > 0) {
+ numFrames = (streamLen - mFirstFrameOffset) / AverageFrameLength();
+ }
+ }
+ return Duration(numFrames);
+}
+
+TimeUnit
+MP3TrackDemuxer::Duration(int64_t aNumFrames) const {
+ if (!mSamplesPerSecond) {
+ return TimeUnit::FromMicroseconds(-1);
+ }
+
+ const double usPerFrame = USECS_PER_S * mSamplesPerFrame / mSamplesPerSecond;
+ return TimeUnit::FromMicroseconds(aNumFrames * usPerFrame);
+}
+
+MediaByteRange
+MP3TrackDemuxer::FindFirstFrame() {
+ static const int MIN_SUCCESSIVE_FRAMES = 4;
+
+ MediaByteRange candidateFrame = FindNextFrame();
+ int numSuccFrames = candidateFrame.Length() > 0;
+ MediaByteRange currentFrame = candidateFrame;
+ MP3LOGV("FindFirst() first candidate frame: mOffset=%" PRIu64 " Length()=%" PRIu64,
+ candidateFrame.mStart, candidateFrame.Length());
+
+ while (candidateFrame.Length() && numSuccFrames < MIN_SUCCESSIVE_FRAMES) {
+ mParser.EndFrameSession();
+ mOffset = currentFrame.mEnd;
+ const MediaByteRange prevFrame = currentFrame;
+
+ // FindNextFrame() here will only return frames consistent with our candidate frame.
+ currentFrame = FindNextFrame();
+ numSuccFrames += currentFrame.Length() > 0;
+ // Multiple successive false positives, which wouldn't be caught by the consistency
+ // checks alone, can be detected by wrong alignment (non-zero gap between frames).
+ const int64_t frameSeparation = currentFrame.mStart - prevFrame.mEnd;
+
+ if (!currentFrame.Length() || frameSeparation != 0) {
+ MP3LOGV("FindFirst() not enough successive frames detected, "
+ "rejecting candidate frame: successiveFrames=%d, last Length()=%" PRIu64
+ ", last frameSeparation=%" PRId64, numSuccFrames, currentFrame.Length(),
+ frameSeparation);
+
+ mParser.ResetFrameData();
+ mOffset = candidateFrame.mStart + 1;
+ candidateFrame = FindNextFrame();
+ numSuccFrames = candidateFrame.Length() > 0;
+ currentFrame = candidateFrame;
+ MP3LOGV("FindFirst() new candidate frame: mOffset=%" PRIu64 " Length()=%" PRIu64,
+ candidateFrame.mStart, candidateFrame.Length());
+ }
+ }
+
+ if (numSuccFrames >= MIN_SUCCESSIVE_FRAMES) {
+ MP3LOG("FindFirst() accepting candidate frame: "
+ "successiveFrames=%d", numSuccFrames);
+ } else {
+ MP3LOG("FindFirst() no suitable first frame found");
+ }
+ return candidateFrame;
+}
+
+static bool
+VerifyFrameConsistency(
+ const FrameParser::Frame& aFrame1, const FrameParser::Frame& aFrame2) {
+ const auto& h1 = aFrame1.Header();
+ const auto& h2 = aFrame2.Header();
+
+ return h1.IsValid() && h2.IsValid() &&
+ h1.Layer() == h2.Layer() &&
+ h1.SlotSize() == h2.SlotSize() &&
+ h1.SamplesPerFrame() == h2.SamplesPerFrame() &&
+ h1.Channels() == h2.Channels() &&
+ h1.SampleRate() == h2.SampleRate() &&
+ h1.RawVersion() == h2.RawVersion() &&
+ h1.RawProtection() == h2.RawProtection();
+}
+
+MediaByteRange
+MP3TrackDemuxer::FindNextFrame() {
+ static const int BUFFER_SIZE = 64;
+ static const int MAX_SKIPPED_BYTES = 1024 * BUFFER_SIZE;
+
+ MP3LOGV("FindNext() Begin mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64
+ " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ uint8_t buffer[BUFFER_SIZE];
+ int32_t read = 0;
+
+ bool foundFrame = false;
+ int64_t frameHeaderOffset = 0;
+
+ // Check whether we've found a valid MPEG frame.
+ while (!foundFrame) {
+ if ((!mParser.FirstFrame().Length() &&
+ mOffset - mParser.ID3Header().Size() > MAX_SKIPPED_BYTES) ||
+ (read = Read(buffer, mOffset, BUFFER_SIZE)) == 0) {
+ MP3LOG("FindNext() EOS or exceeded MAX_SKIPPED_BYTES without a frame");
+ // This is not a valid MPEG audio stream or we've reached EOS, give up.
+ break;
+ }
+
+ ByteReader reader(buffer, read);
+ uint32_t bytesToSkip = 0;
+ foundFrame = mParser.Parse(&reader, &bytesToSkip);
+ frameHeaderOffset = mOffset + reader.Offset() - FrameParser::FrameHeader::SIZE;
+
+ // If we've found neither an MPEG frame header nor an ID3v2 tag,
+ // the reader shouldn't have any bytes remaining.
+ MOZ_ASSERT(foundFrame || bytesToSkip || !reader.Remaining());
+
+ if (foundFrame && mParser.FirstFrame().Length() &&
+ !VerifyFrameConsistency(mParser.FirstFrame(), mParser.CurrentFrame())) {
+ // We've likely hit a false-positive, ignore it and proceed with the
+ // search for the next valid frame.
+ foundFrame = false;
+ mOffset = frameHeaderOffset + 1;
+ mParser.EndFrameSession();
+ } else {
+ // Advance mOffset by the amount of bytes read and if necessary,
+ // skip an ID3v2 tag which stretches beyond the current buffer.
+ NS_ENSURE_TRUE(mOffset + read + bytesToSkip > mOffset,
+ MediaByteRange(0, 0));
+ mOffset += read + bytesToSkip;
+ }
+ }
+
+ if (!foundFrame || !mParser.CurrentFrame().Length()) {
+ MP3LOG("FindNext() Exit foundFrame=%d mParser.CurrentFrame().Length()=%d ",
+ foundFrame, mParser.CurrentFrame().Length());
+ return { 0, 0 };
+ }
+
+ MP3LOGV("FindNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " frameHeaderOffset=%d"
+ " mTotalFrameLen=%" PRIu64 " mSamplesPerFrame=%d mSamplesPerSecond=%d"
+ " mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, frameHeaderOffset,
+ mTotalFrameLen, mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ return { frameHeaderOffset, frameHeaderOffset + mParser.CurrentFrame().Length() };
+}
+
+bool
+MP3TrackDemuxer::SkipNextFrame(const MediaByteRange& aRange) {
+ if (!mNumParsedFrames || !aRange.Length()) {
+ // We can't skip the first frame, since it could contain VBR headers.
+ RefPtr<MediaRawData> frame(GetNextFrame(aRange));
+ return frame;
+ }
+
+ UpdateState(aRange);
+
+ MP3LOGV("SkipNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64
+ " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ return true;
+}
+
+already_AddRefed<MediaRawData>
+MP3TrackDemuxer::GetNextFrame(const MediaByteRange& aRange) {
+ MP3LOG("GetNext() Begin({mStart=%" PRId64 " Length()=%" PRId64 "})",
+ aRange.mStart, aRange.Length());
+ if (!aRange.Length()) {
+ return nullptr;
+ }
+
+ RefPtr<MediaRawData> frame = new MediaRawData();
+ frame->mOffset = aRange.mStart;
+
+ nsAutoPtr<MediaRawDataWriter> frameWriter(frame->CreateWriter());
+ if (!frameWriter->SetSize(aRange.Length())) {
+ MP3LOG("GetNext() Exit failed to allocated media buffer");
+ return nullptr;
+ }
+
+ const uint32_t read = Read(frameWriter->Data(), frame->mOffset, frame->Size());
+
+ if (read != aRange.Length()) {
+ MP3LOG("GetNext() Exit read=%u frame->Size()=%u", read, frame->Size());
+ return nullptr;
+ }
+
+ UpdateState(aRange);
+
+ frame->mTime = Duration(mFrameIndex - 1).ToMicroseconds();
+ frame->mDuration = Duration(1).ToMicroseconds();
+ frame->mTimecode = frame->mTime;
+ frame->mKeyframe = true;
+
+ MOZ_ASSERT(frame->mTime >= 0);
+ MOZ_ASSERT(frame->mDuration > 0);
+
+ if (mNumParsedFrames == 1) {
+ // First frame parsed, let's read VBR info if available.
+ ByteReader reader(frame->Data(), frame->Size());
+ mParser.ParseVBRHeader(&reader);
+ mFirstFrameOffset = frame->mOffset;
+ }
+
+ MP3LOGV("GetNext() End mOffset=%" PRIu64 " mNumParsedFrames=%" PRIu64
+ " mFrameIndex=%" PRId64 " mTotalFrameLen=%" PRIu64
+ " mSamplesPerFrame=%d mSamplesPerSecond=%d mChannels=%d",
+ mOffset, mNumParsedFrames, mFrameIndex, mTotalFrameLen,
+ mSamplesPerFrame, mSamplesPerSecond, mChannels);
+
+ return frame.forget();
+}
+
+int64_t
+MP3TrackDemuxer::OffsetFromFrameIndex(int64_t aFrameIndex) const {
+ int64_t offset = 0;
+ const auto& vbr = mParser.VBRInfo();
+
+ if (vbr.IsComplete()) {
+ offset = mFirstFrameOffset + aFrameIndex * vbr.NumBytes().value() /
+ vbr.NumAudioFrames().value();
+ } else if (AverageFrameLength() > 0) {
+ offset = mFirstFrameOffset + aFrameIndex * AverageFrameLength();
+ }
+
+ MP3LOGV("OffsetFromFrameIndex(%" PRId64 ") -> %" PRId64, aFrameIndex, offset);
+ return std::max<int64_t>(mFirstFrameOffset, offset);
+}
+
+int64_t
+MP3TrackDemuxer::FrameIndexFromOffset(int64_t aOffset) const {
+ int64_t frameIndex = 0;
+ const auto& vbr = mParser.VBRInfo();
+
+ if (vbr.IsComplete()) {
+ frameIndex = static_cast<float>(aOffset - mFirstFrameOffset) /
+ vbr.NumBytes().value() * vbr.NumAudioFrames().value();
+ frameIndex = std::min<int64_t>(vbr.NumAudioFrames().value(), frameIndex);
+ } else if (AverageFrameLength() > 0) {
+ frameIndex = (aOffset - mFirstFrameOffset) / AverageFrameLength();
+ }
+
+ MP3LOGV("FrameIndexFromOffset(%" PRId64 ") -> %" PRId64, aOffset, frameIndex);
+ return std::max<int64_t>(0, frameIndex);
+}
+
+int64_t
+MP3TrackDemuxer::FrameIndexFromTime(const media::TimeUnit& aTime) const {
+ int64_t frameIndex = 0;
+ if (mSamplesPerSecond > 0 && mSamplesPerFrame > 0) {
+ frameIndex = aTime.ToSeconds() * mSamplesPerSecond / mSamplesPerFrame - 1;
+ }
+
+ MP3LOGV("FrameIndexFromOffset(%fs) -> %" PRId64, aTime.ToSeconds(), frameIndex);
+ return std::max<int64_t>(0, frameIndex);
+}
+
+void
+MP3TrackDemuxer::UpdateState(const MediaByteRange& aRange) {
+ // Prevent overflow.
+ if (mTotalFrameLen + aRange.Length() < mTotalFrameLen) {
+ // These variables have a linear dependency and are only used to derive the
+ // average frame length.
+ mTotalFrameLen /= 2;
+ mNumParsedFrames /= 2;
+ }
+
+ // Full frame parsed, move offset to its end.
+ mOffset = aRange.mEnd;
+
+ mTotalFrameLen += aRange.Length();
+
+ if (!mSamplesPerFrame) {
+ mSamplesPerFrame = mParser.CurrentFrame().Header().SamplesPerFrame();
+ mSamplesPerSecond = mParser.CurrentFrame().Header().SampleRate();
+ mChannels = mParser.CurrentFrame().Header().Channels();
+ }
+
+ ++mNumParsedFrames;
+ ++mFrameIndex;
+ MOZ_ASSERT(mFrameIndex > 0);
+
+ // Prepare the parser for the next frame parsing session.
+ mParser.EndFrameSession();
+}
+
+int32_t
+MP3TrackDemuxer::Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize) {
+ MP3LOGV("MP3TrackDemuxer::Read(%p %" PRId64 " %d)", aBuffer, aOffset, aSize);
+
+ const int64_t streamLen = StreamLength();
+ if (mInfo && streamLen > 0) {
+ // Prevent blocking reads after successful initialization.
+ aSize = std::min<int64_t>(aSize, streamLen - aOffset);
+ }
+
+ uint32_t read = 0;
+ MP3LOGV("MP3TrackDemuxer::Read -> ReadAt(%d)", aSize);
+ const nsresult rv = mSource.ReadAt(aOffset, reinterpret_cast<char*>(aBuffer),
+ static_cast<uint32_t>(aSize), &read);
+ NS_ENSURE_SUCCESS(rv, 0);
+ return static_cast<int32_t>(read);
+}
+
+double
+MP3TrackDemuxer::AverageFrameLength() const {
+ if (mNumParsedFrames) {
+ return static_cast<double>(mTotalFrameLen) / mNumParsedFrames;
+ }
+ const auto& vbr = mParser.VBRInfo();
+ if (vbr.IsComplete() && vbr.NumAudioFrames().value() + 1) {
+ return static_cast<double>(vbr.NumBytes().value()) /
+ (vbr.NumAudioFrames().value() + 1);
+ }
+ return 0.0;
+}
+
+// FrameParser
+
+namespace frame_header {
+// FrameHeader mRaw byte offsets.
+static const int SYNC1 = 0;
+static const int SYNC2_VERSION_LAYER_PROTECTION = 1;
+static const int BITRATE_SAMPLERATE_PADDING_PRIVATE = 2;
+static const int CHANNELMODE_MODEEXT_COPY_ORIG_EMPH = 3;
+} // namespace frame_header
+
+FrameParser::FrameParser()
+{
+}
+
+void
+FrameParser::Reset() {
+ mID3Parser.Reset();
+ mFrame.Reset();
+}
+
+void
+FrameParser::ResetFrameData() {
+ mFrame.Reset();
+ mFirstFrame.Reset();
+ mPrevFrame.Reset();
+}
+
+void
+FrameParser::EndFrameSession() {
+ if (!mID3Parser.Header().IsValid()) {
+ // Reset ID3 tags only if we have not parsed a valid ID3 header yet.
+ mID3Parser.Reset();
+ }
+ mPrevFrame = mFrame;
+ mFrame.Reset();
+}
+
+const FrameParser::Frame&
+FrameParser::CurrentFrame() const {
+ return mFrame;
+}
+
+const FrameParser::Frame&
+FrameParser::PrevFrame() const {
+ return mPrevFrame;
+}
+
+const FrameParser::Frame&
+FrameParser::FirstFrame() const {
+ return mFirstFrame;
+}
+
+const ID3Parser::ID3Header&
+FrameParser::ID3Header() const {
+ return mID3Parser.Header();
+}
+
+const FrameParser::VBRHeader&
+FrameParser::VBRInfo() const {
+ return mVBRHeader;
+}
+
+bool
+FrameParser::Parse(ByteReader* aReader, uint32_t* aBytesToSkip) {
+ MOZ_ASSERT(aReader && aBytesToSkip);
+ *aBytesToSkip = 0;
+
+ if (!mID3Parser.Header().Size() && !mFirstFrame.Length()) {
+ // No MP3 frames have been parsed yet, look for ID3v2 headers at file begin.
+ // ID3v1 tags may only be at file end.
+ // TODO: should we try to read ID3 tags at end of file/mid-stream, too?
+ const size_t prevReaderOffset = aReader->Offset();
+ const uint32_t tagSize = mID3Parser.Parse(aReader);
+ if (tagSize) {
+ // ID3 tag found, skip past it.
+ const uint32_t skipSize = tagSize - ID3Parser::ID3Header::SIZE;
+
+ if (skipSize > aReader->Remaining()) {
+ // Skipping across the ID3v2 tag would take us past the end of the buffer, therefore we
+ // return immediately and let the calling function handle skipping the rest of the tag.
+ MP3LOGV("ID3v2 tag detected, size=%d,"
+ " needing to skip %d bytes past the current buffer",
+ tagSize, skipSize - aReader->Remaining());
+ *aBytesToSkip = skipSize - aReader->Remaining();
+ return false;
+ }
+ MP3LOGV("ID3v2 tag detected, size=%d", tagSize);
+ aReader->Read(skipSize);
+ } else {
+ // No ID3v2 tag found, rewinding reader in order to search for a MPEG frame header.
+ aReader->Seek(prevReaderOffset);
+ }
+ }
+
+ while (aReader->CanRead8() && !mFrame.ParseNext(aReader->ReadU8())) { }
+
+ if (mFrame.Length()) {
+ // MP3 frame found.
+ if (!mFirstFrame.Length()) {
+ mFirstFrame = mFrame;
+ }
+ // Indicate success.
+ return true;
+ }
+ return false;
+}
+
+// FrameParser::Header
+
+FrameParser::FrameHeader::FrameHeader()
+{
+ Reset();
+}
+
+uint8_t
+FrameParser::FrameHeader::Sync1() const {
+ return mRaw[frame_header::SYNC1];
+}
+
+uint8_t
+FrameParser::FrameHeader::Sync2() const {
+ return 0x7 & mRaw[frame_header::SYNC2_VERSION_LAYER_PROTECTION] >> 5;
+}
+
+uint8_t
+FrameParser::FrameHeader::RawVersion() const {
+ return 0x3 & mRaw[frame_header::SYNC2_VERSION_LAYER_PROTECTION] >> 3;
+}
+
+uint8_t
+FrameParser::FrameHeader::RawLayer() const {
+ return 0x3 & mRaw[frame_header::SYNC2_VERSION_LAYER_PROTECTION] >> 1;
+}
+
+uint8_t
+FrameParser::FrameHeader::RawProtection() const {
+ return 0x1 & mRaw[frame_header::SYNC2_VERSION_LAYER_PROTECTION] >> 6;
+}
+
+uint8_t
+FrameParser::FrameHeader::RawBitrate() const {
+ return 0xF & mRaw[frame_header::BITRATE_SAMPLERATE_PADDING_PRIVATE] >> 4;
+}
+
+uint8_t
+FrameParser::FrameHeader::RawSampleRate() const {
+ return 0x3 & mRaw[frame_header::BITRATE_SAMPLERATE_PADDING_PRIVATE] >> 2;
+}
+
+uint8_t
+FrameParser::FrameHeader::Padding() const {
+ return 0x1 & mRaw[frame_header::BITRATE_SAMPLERATE_PADDING_PRIVATE] >> 1;
+}
+
+uint8_t
+FrameParser::FrameHeader::Private() const {
+ return 0x1 & mRaw[frame_header::BITRATE_SAMPLERATE_PADDING_PRIVATE];
+}
+
+uint8_t
+FrameParser::FrameHeader::RawChannelMode() const {
+ return 0x3 & mRaw[frame_header::CHANNELMODE_MODEEXT_COPY_ORIG_EMPH] >> 6;
+}
+
+int32_t
+FrameParser::FrameHeader::Layer() const {
+ static const uint8_t LAYERS[4] = { 0, 3, 2, 1 };
+
+ return LAYERS[RawLayer()];
+}
+
+int32_t
+FrameParser::FrameHeader::SampleRate() const {
+ // Sample rates - use [version][srate]
+ static const uint16_t SAMPLE_RATE[4][4] = {
+ { 11025, 12000, 8000, 0 }, // MPEG 2.5
+ { 0, 0, 0, 0 }, // Reserved
+ { 22050, 24000, 16000, 0 }, // MPEG 2
+ { 44100, 48000, 32000, 0 } // MPEG 1
+ };
+
+ return SAMPLE_RATE[RawVersion()][RawSampleRate()];
+}
+
+int32_t
+FrameParser::FrameHeader::Channels() const {
+ // 3 is single channel (mono), any other value is some variant of dual
+ // channel.
+ return RawChannelMode() == 3 ? 1 : 2;
+}
+
+int32_t
+FrameParser::FrameHeader::SamplesPerFrame() const {
+ // Samples per frame - use [version][layer]
+ static const uint16_t FRAME_SAMPLE[4][4] = {
+ // Layer 3 2 1 Version
+ { 0, 576, 1152, 384 }, // 2.5
+ { 0, 0, 0, 0 }, // Reserved
+ { 0, 576, 1152, 384 }, // 2
+ { 0, 1152, 1152, 384 } // 1
+ };
+
+ return FRAME_SAMPLE[RawVersion()][RawLayer()];
+}
+
+int32_t
+FrameParser::FrameHeader::Bitrate() const {
+ // Bitrates - use [version][layer][bitrate]
+ static const uint16_t BITRATE[4][4][16] = {
+ { // Version 2.5
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2
+ { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1
+ },
+ { // Reserved
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Invalid
+ },
+ { // Version 2
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2
+ { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1
+ },
+ { // Version 1
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved
+ { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, // Layer 3
+ { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // Layer 2
+ { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // Layer 1
+ }
+ };
+
+ return 1000 * BITRATE[RawVersion()][RawLayer()][RawBitrate()];
+}
+
+int32_t
+FrameParser::FrameHeader::SlotSize() const {
+ // Slot size (MPEG unit of measurement) - use [layer]
+ static const uint8_t SLOT_SIZE[4] = { 0, 1, 1, 4 }; // Rsvd, 3, 2, 1
+
+ return SLOT_SIZE[RawLayer()];
+}
+
+bool
+FrameParser::FrameHeader::ParseNext(uint8_t c) {
+ if (!Update(c)) {
+ Reset();
+ if (!Update(c)) {
+ Reset();
+ }
+ }
+ return IsValid();
+}
+
+bool
+FrameParser::FrameHeader::IsValid(int aPos) const {
+ if (aPos >= SIZE) {
+ return true;
+ }
+ if (aPos == frame_header::SYNC1) {
+ return Sync1() == 0xFF;
+ }
+ if (aPos == frame_header::SYNC2_VERSION_LAYER_PROTECTION) {
+ return Sync2() == 7 &&
+ RawVersion() != 1 &&
+ Layer() == 3;
+ }
+ if (aPos == frame_header::BITRATE_SAMPLERATE_PADDING_PRIVATE) {
+ return RawBitrate() != 0xF && RawBitrate() != 0 &&
+ RawSampleRate() != 3;
+ }
+ return true;
+}
+
+bool
+FrameParser::FrameHeader::IsValid() const {
+ return mPos >= SIZE;
+}
+
+void
+FrameParser::FrameHeader::Reset() {
+ mPos = 0;
+}
+
+bool
+FrameParser::FrameHeader::Update(uint8_t c) {
+ if (mPos < SIZE) {
+ mRaw[mPos] = c;
+ }
+ return IsValid(mPos++);
+}
+
+// FrameParser::VBRHeader
+
+namespace vbr_header {
+static const char* TYPE_STR[3] = {"NONE", "XING", "VBRI"};
+static const uint32_t TOC_SIZE = 100;
+} // namespace vbr_header
+
+FrameParser::VBRHeader::VBRHeader()
+ : mType(NONE)
+{
+}
+
+FrameParser::VBRHeader::VBRHeaderType
+FrameParser::VBRHeader::Type() const {
+ return mType;
+}
+
+const Maybe<uint32_t>&
+FrameParser::VBRHeader::NumAudioFrames() const {
+ return mNumAudioFrames;
+}
+
+const Maybe<uint32_t>&
+FrameParser::VBRHeader::NumBytes() const {
+ return mNumBytes;
+}
+
+const Maybe<uint32_t>&
+FrameParser::VBRHeader::Scale() const {
+ return mScale;
+}
+
+bool
+FrameParser::VBRHeader::IsTOCPresent() const {
+ return mTOC.size() == vbr_header::TOC_SIZE;
+}
+
+bool
+FrameParser::VBRHeader::IsValid() const {
+ return mType != NONE;
+}
+
+bool
+FrameParser::VBRHeader::IsComplete() const {
+ return IsValid() &&
+ mNumAudioFrames.valueOr(0) > 0 &&
+ mNumBytes.valueOr(0) > 0 &&
+ // We don't care about the scale for any computations here.
+ // mScale < 101 &&
+ true;
+}
+
+int64_t
+FrameParser::VBRHeader::Offset(float aDurationFac) const {
+ if (!IsTOCPresent()) {
+ return -1;
+ }
+
+ // Constrain the duration percentage to [0, 99].
+ const float durationPer = 100.0f * std::min(0.99f, std::max(0.0f, aDurationFac));
+ const size_t fullPer = durationPer;
+ const float rest = durationPer - fullPer;
+
+ MOZ_ASSERT(fullPer < mTOC.size());
+ int64_t offset = mTOC.at(fullPer);
+
+ if (rest > 0.0 && fullPer + 1 < mTOC.size()) {
+ offset += rest * (mTOC.at(fullPer + 1) - offset);
+ }
+
+ return offset;
+}
+
+bool
+FrameParser::VBRHeader::ParseXing(ByteReader* aReader) {
+ static const uint32_t XING_TAG = BigEndian::readUint32("Xing");
+ static const uint32_t INFO_TAG = BigEndian::readUint32("Info");
+
+ enum Flags {
+ NUM_FRAMES = 0x01,
+ NUM_BYTES = 0x02,
+ TOC = 0x04,
+ VBR_SCALE = 0x08
+ };
+
+ MOZ_ASSERT(aReader);
+ const size_t prevReaderOffset = aReader->Offset();
+
+ // We have to search for the Xing header as its position can change.
+ while (aReader->CanRead32() &&
+ aReader->PeekU32() != XING_TAG && aReader->PeekU32() != INFO_TAG) {
+ aReader->Read(1);
+ }
+
+ if (aReader->CanRead32()) {
+ // Skip across the VBR header ID tag.
+ aReader->ReadU32();
+ mType = XING;
+ }
+ uint32_t flags = 0;
+ if (aReader->CanRead32()) {
+ flags = aReader->ReadU32();
+ }
+ if (flags & NUM_FRAMES && aReader->CanRead32()) {
+ mNumAudioFrames = Some(aReader->ReadU32());
+ }
+ if (flags & NUM_BYTES && aReader->CanRead32()) {
+ mNumBytes = Some(aReader->ReadU32());
+ }
+ if (flags & TOC && aReader->Remaining() >= vbr_header::TOC_SIZE) {
+ if (!mNumBytes) {
+ // We don't have the stream size to calculate offsets, skip the TOC.
+ aReader->Read(vbr_header::TOC_SIZE);
+ } else {
+ mTOC.clear();
+ mTOC.reserve(vbr_header::TOC_SIZE);
+ for (size_t i = 0; i < vbr_header::TOC_SIZE; ++i) {
+ mTOC.push_back(1.0f / 256.0f * aReader->ReadU8() * mNumBytes.value());
+ }
+ }
+ }
+ if (flags & VBR_SCALE && aReader->CanRead32()) {
+ mScale = Some(aReader->ReadU32());
+ }
+
+ aReader->Seek(prevReaderOffset);
+ return mType == XING;
+}
+
+bool
+FrameParser::VBRHeader::ParseVBRI(ByteReader* aReader) {
+ static const uint32_t TAG = BigEndian::readUint32("VBRI");
+ static const uint32_t OFFSET = 32 + FrameParser::FrameHeader::SIZE;
+ static const uint32_t FRAME_COUNT_OFFSET = OFFSET + 14;
+ static const uint32_t MIN_FRAME_SIZE = OFFSET + 26;
+
+ MOZ_ASSERT(aReader);
+ // ParseVBRI assumes that the ByteReader offset points to the beginning of a frame,
+ // therefore as a simple check, we look for the presence of a frame sync at that position.
+ MOZ_ASSERT((aReader->PeekU16() & 0xFFE0) == 0xFFE0);
+ const size_t prevReaderOffset = aReader->Offset();
+
+ // VBRI have a fixed relative position, so let's check for it there.
+ if (aReader->Remaining() > MIN_FRAME_SIZE) {
+ aReader->Seek(prevReaderOffset + OFFSET);
+ if (aReader->ReadU32() == TAG) {
+ aReader->Seek(prevReaderOffset + FRAME_COUNT_OFFSET);
+ mNumAudioFrames = Some(aReader->ReadU32());
+ mType = VBRI;
+ aReader->Seek(prevReaderOffset);
+ return true;
+ }
+ }
+ aReader->Seek(prevReaderOffset);
+ return false;
+}
+
+bool
+FrameParser::VBRHeader::Parse(ByteReader* aReader) {
+ const bool rv = ParseVBRI(aReader) || ParseXing(aReader);
+ if (rv) {
+ MP3LOG("VBRHeader::Parse found valid VBR/CBR header: type=%s"
+ " NumAudioFrames=%u NumBytes=%u Scale=%u TOC-size=%u",
+ vbr_header::TYPE_STR[Type()], NumAudioFrames().valueOr(0),
+ NumBytes().valueOr(0), Scale().valueOr(0), mTOC.size());
+ }
+ return rv;
+}
+
+// FrameParser::Frame
+
+void
+FrameParser::Frame::Reset() {
+ mHeader.Reset();
+}
+
+int32_t
+FrameParser::Frame::Length() const {
+ if (!mHeader.IsValid() || !mHeader.SampleRate()) {
+ return 0;
+ }
+
+ const float bitsPerSample = mHeader.SamplesPerFrame() / 8.0f;
+ const int32_t frameLen = bitsPerSample * mHeader.Bitrate() /
+ mHeader.SampleRate() +
+ mHeader.Padding() * mHeader.SlotSize();
+ return frameLen;
+}
+
+bool
+FrameParser::Frame::ParseNext(uint8_t c) {
+ return mHeader.ParseNext(c);
+}
+
+const FrameParser::FrameHeader&
+FrameParser::Frame::Header() const {
+ return mHeader;
+}
+
+bool
+FrameParser::ParseVBRHeader(ByteReader* aReader) {
+ return mVBRHeader.Parse(aReader);
+}
+
+// ID3Parser
+
+// Constants
+namespace id3_header {
+static const int ID_LEN = 3;
+static const int VERSION_LEN = 2;
+static const int FLAGS_LEN = 1;
+static const int SIZE_LEN = 4;
+
+static const int ID_END = ID_LEN;
+static const int VERSION_END = ID_END + VERSION_LEN;
+static const int FLAGS_END = VERSION_END + FLAGS_LEN;
+static const int SIZE_END = FLAGS_END + SIZE_LEN;
+
+static const uint8_t ID[ID_LEN] = {'I', 'D', '3'};
+
+static const uint8_t MIN_MAJOR_VER = 2;
+static const uint8_t MAX_MAJOR_VER = 4;
+} // namespace id3_header
+
+uint32_t
+ID3Parser::Parse(ByteReader* aReader) {
+ MOZ_ASSERT(aReader);
+
+ while (aReader->CanRead8() && !mHeader.ParseNext(aReader->ReadU8())) { }
+
+ if (mHeader.IsValid()) {
+ // Header found, return total tag size.
+ return ID3Header::SIZE + Header().Size() + Header().FooterSize();
+ }
+ return 0;
+}
+
+void
+ID3Parser::Reset() {
+ mHeader.Reset();
+}
+
+const ID3Parser::ID3Header&
+ID3Parser::Header() const {
+ return mHeader;
+}
+
+// ID3Parser::Header
+
+ID3Parser::ID3Header::ID3Header()
+{
+ Reset();
+}
+
+void
+ID3Parser::ID3Header::Reset() {
+ mSize = 0;
+ mPos = 0;
+}
+
+uint8_t
+ID3Parser::ID3Header::MajorVersion() const {
+ return mRaw[id3_header::ID_END];
+}
+
+uint8_t
+ID3Parser::ID3Header::MinorVersion() const {
+ return mRaw[id3_header::ID_END + 1];
+}
+
+uint8_t
+ID3Parser::ID3Header::Flags() const {
+ return mRaw[id3_header::FLAGS_END - id3_header::FLAGS_LEN];
+}
+
+uint32_t
+ID3Parser::ID3Header::Size() const {
+ if (!IsValid()) {
+ return 0;
+ }
+ return mSize;
+}
+
+uint8_t
+ID3Parser::ID3Header::FooterSize() const {
+ if (Flags() & (1 << 4)) {
+ return SIZE;
+ }
+ return 0;
+}
+
+bool
+ID3Parser::ID3Header::ParseNext(uint8_t c) {
+ if (!Update(c)) {
+ Reset();
+ if (!Update(c)) {
+ Reset();
+ }
+ }
+ return IsValid();
+}
+
+bool
+ID3Parser::ID3Header::IsValid(int aPos) const {
+ if (aPos >= SIZE) {
+ return true;
+ }
+ const uint8_t c = mRaw[aPos];
+ switch (aPos) {
+ case 0: case 1: case 2:
+ // Expecting "ID3".
+ return id3_header::ID[aPos] == c;
+ case 3:
+ return MajorVersion() >= id3_header::MIN_MAJOR_VER &&
+ MajorVersion() <= id3_header::MAX_MAJOR_VER;
+ case 4:
+ return MinorVersion() < 0xFF;
+ case 5:
+ // Validate flags for supported versions, see bug 949036.
+ return ((0xFF >> MajorVersion()) & c) == 0;
+ case 6: case 7: case 8: case 9:
+ return c < 0x80;
+ }
+ return true;
+}
+
+bool
+ID3Parser::ID3Header::IsValid() const {
+ return mPos >= SIZE;
+}
+
+bool
+ID3Parser::ID3Header::Update(uint8_t c) {
+ if (mPos >= id3_header::SIZE_END - id3_header::SIZE_LEN &&
+ mPos < id3_header::SIZE_END) {
+ mSize <<= 7;
+ mSize |= c;
+ }
+ if (mPos < SIZE) {
+ mRaw[mPos] = c;
+ }
+ return IsValid(mPos++);
+}
+
+} // namespace mp3
+} // namespace mozilla
diff --git a/dom/media/MP3Demuxer.h b/dom/media/MP3Demuxer.h
new file mode 100644
index 000000000..03e67b0d9
--- /dev/null
+++ b/dom/media/MP3Demuxer.h
@@ -0,0 +1,474 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MP3_DEMUXER_H_
+#define MP3_DEMUXER_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/Maybe.h"
+#include "MediaDataDemuxer.h"
+#include "MediaResource.h"
+#include "mp4_demuxer/ByteReader.h"
+#include <vector>
+
+namespace mozilla {
+namespace mp3 {
+
+class MP3TrackDemuxer;
+
+class MP3Demuxer : public MediaDataDemuxer {
+public:
+ // MediaDataDemuxer interface.
+ explicit MP3Demuxer(MediaResource* aSource);
+ RefPtr<InitPromise> Init() override;
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(
+ TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
+ bool IsSeekable() const override;
+ void NotifyDataArrived() override;
+ void NotifyDataRemoved() override;
+
+private:
+ // Synchronous initialization.
+ bool InitInternal();
+
+ RefPtr<MediaResource> mSource;
+ RefPtr<MP3TrackDemuxer> mTrackDemuxer;
+};
+
+// ID3 header parser state machine used by FrameParser.
+// The header contains the following format (one byte per term):
+// 'I' 'D' '3' MajorVersion MinorVersion Flags Size1 Size2 Size3 Size4
+// For more details see http://id3.org/id3v2.3.0.
+class ID3Parser {
+public:
+ // Holds the ID3 header and its parsing state.
+ class ID3Header {
+ public:
+ // The header size is static, see class comment.
+ static const int SIZE = 10;
+
+ // Constructor.
+ ID3Header();
+
+ // Resets the state to allow for a new parsing session.
+ void Reset();
+
+ // The ID3 tags are versioned like this: ID3vMajorVersion.MinorVersion.
+ uint8_t MajorVersion() const;
+ uint8_t MinorVersion() const;
+
+ // The ID3 flags field.
+ uint8_t Flags() const;
+
+ // The derived size based on the provided size fields.
+ uint32_t Size() const;
+
+ // Returns the size of an ID3v2.4 footer if present and zero otherwise.
+ uint8_t FooterSize() const;
+
+ // Returns whether the parsed data is a valid ID3 header up to the given
+ // byte position.
+ bool IsValid(int aPos) const;
+
+ // Returns whether the parsed data is a complete and valid ID3 header.
+ bool IsValid() const;
+
+ // Parses the next provided byte.
+ // Returns whether the byte creates a valid sequence up to this point.
+ bool ParseNext(uint8_t c);
+
+ private:
+ // Updates the parser state machine with the provided next byte.
+ // Returns whether the provided byte is a valid next byte in the sequence.
+ bool Update(uint8_t c);
+
+ // The currently parsed byte sequence.
+ uint8_t mRaw[SIZE];
+
+ // The derived size as provided by the size fields.
+ // The header size fields holds a 4 byte sequence with each MSB set to 0,
+ // this bits need to be ignored when deriving the actual size.
+ uint32_t mSize;
+
+ // The current byte position in the parsed sequence. Reset via Reset and
+ // incremented via Update.
+ int mPos;
+ };
+
+ // Returns the parsed ID3 header. Note: check for validity.
+ const ID3Header& Header() const;
+
+ // Parses contents of given ByteReader for a valid ID3v2 header.
+ // Returns the total ID3v2 tag size if successful and zero otherwise.
+ uint32_t Parse(mp4_demuxer::ByteReader* aReader);
+
+ // Resets the state to allow for a new parsing session.
+ void Reset();
+
+private:
+ // The currently parsed ID3 header. Reset via Reset, updated via Parse.
+ ID3Header mHeader;
+};
+
+// MPEG audio frame parser.
+// The MPEG frame header has the following format (one bit per character):
+// 11111111 111VVLLC BBBBSSPR MMEETOHH
+// { sync } - 11 sync bits
+// VV - MPEG audio version ID (0->2.5, 1->reserved, 2->2, 3->1)
+// LL - Layer description (0->reserved, 1->III, 2->II, 3->I)
+// C - CRC protection bit (0->protected, 1->not protected)
+// BBBB - Bitrate index (see table in implementation)
+// SS - Sampling rate index (see table in implementation)
+// P - Padding bit (0->not padded, 1->padded by 1 slot size)
+// R - Private bit (ignored)
+// MM - Channel mode (0->stereo, 1->joint stereo, 2->dual channel,
+// 3->single channel)
+// EE - Mode extension for joint stereo (ignored)
+// T - Copyright (0->disabled, 1->enabled)
+// O - Original (0->copy, 1->original)
+// HH - Emphasis (0->none, 1->50/15 ms, 2->reserved, 3->CCIT J.17)
+class FrameParser {
+public:
+ // Holds the frame header and its parsing state.
+ class FrameHeader {
+ public:
+ // The header size is static, see class comments.
+ static const int SIZE = 4;
+
+ // Constructor.
+ FrameHeader();
+
+ // Raw field access, see class comments for details.
+ uint8_t Sync1() const;
+ uint8_t Sync2() const;
+ uint8_t RawVersion() const;
+ uint8_t RawLayer() const;
+ uint8_t RawProtection() const;
+ uint8_t RawBitrate() const;
+ uint8_t RawSampleRate() const;
+ uint8_t Padding() const;
+ uint8_t Private() const;
+ uint8_t RawChannelMode() const;
+
+ // Sampling rate frequency in Hz.
+ int32_t SampleRate() const;
+
+ // Number of audio channels.
+ int32_t Channels() const;
+
+ // Samples per frames, static depending on MPEG version and layer.
+ int32_t SamplesPerFrame() const;
+
+ // Slot size used for padding, static depending on MPEG layer.
+ int32_t SlotSize() const;
+
+ // Bitrate in kbps, can vary between frames.
+ int32_t Bitrate() const;
+
+ // MPEG layer (0->invalid, 1->I, 2->II, 3->III).
+ int32_t Layer() const;
+
+ // Returns whether the parsed data is a valid frame header up to the given
+ // byte position.
+ bool IsValid(const int aPos) const;
+
+ // Returns whether the parsed data is a complete and valid frame header.
+ bool IsValid() const;
+
+ // Resets the state to allow for a new parsing session.
+ void Reset();
+
+ // Parses the next provided byte.
+ // Returns whether the byte creates a valid sequence up to this point.
+ bool ParseNext(const uint8_t c);
+
+ private:
+ // Updates the parser state machine with the provided next byte.
+ // Returns whether the provided byte is a valid next byte in the sequence.
+ bool Update(const uint8_t c);
+
+ // The currently parsed byte sequence.
+ uint8_t mRaw[SIZE];
+
+ // The current byte position in the parsed sequence. Reset via Reset and
+ // incremented via Update.
+ int mPos;
+ };
+
+ // VBR frames may contain Xing or VBRI headers for additional info, we use
+ // this class to parse them and access this info.
+ class VBRHeader {
+ public:
+ // Synchronize with vbr_header TYPE_STR on change.
+ enum VBRHeaderType {
+ NONE = 0,
+ XING,
+ VBRI
+ };
+
+ // Constructor.
+ VBRHeader();
+
+ // Returns the parsed VBR header type, or NONE if no valid header found.
+ VBRHeaderType Type() const;
+
+ // Returns the total number of audio frames (excluding the VBR header frame)
+ // expected in the stream/file.
+ const Maybe<uint32_t>& NumAudioFrames() const;
+
+ // Returns the expected size of the stream.
+ const Maybe<uint32_t>& NumBytes() const;
+
+ // Returns the VBR scale factor (0: best quality, 100: lowest quality).
+ const Maybe<uint32_t>& Scale() const;
+
+ // Returns true iff Xing/Info TOC (table of contents) is present.
+ bool IsTOCPresent() const;
+
+ // Returns whether the header is valid (type XING or VBRI).
+ bool IsValid() const;
+
+ // Returns whether the header is valid and contains reasonable non-zero field values.
+ bool IsComplete() const;
+
+ // Returns the byte offset for the given duration percentage as a factor
+ // (0: begin, 1.0: end).
+ int64_t Offset(float aDurationFac) const;
+
+ // Parses contents of given ByteReader for a valid VBR header.
+ // The offset of the passed ByteReader needs to point to an MPEG frame begin,
+ // as a VBRI-style header is searched at a fixed offset relative to frame begin.
+ // Returns whether a valid VBR header was found in the range.
+ bool Parse(mp4_demuxer::ByteReader* aReader);
+
+ private:
+ // Parses contents of given ByteReader for a valid Xing header.
+ // The initial ByteReader offset will be preserved.
+ // Returns whether a valid Xing header was found in the range.
+ bool ParseXing(mp4_demuxer::ByteReader* aReader);
+
+ // Parses contents of given ByteReader for a valid VBRI header.
+ // The initial ByteReader offset will be preserved. It also needs to point
+ // to the beginning of a valid MPEG frame, as VBRI headers are searched
+ // at a fixed offset relative to frame begin.
+ // Returns whether a valid VBRI header was found in the range.
+ bool ParseVBRI(mp4_demuxer::ByteReader* aReader);
+
+ // The total number of frames expected as parsed from a VBR header.
+ Maybe<uint32_t> mNumAudioFrames;
+
+ // The total number of bytes expected in the stream.
+ Maybe<uint32_t> mNumBytes;
+
+ // The VBR scale factor.
+ Maybe<uint32_t> mScale;
+
+ // The TOC table mapping duration percentage to byte offset.
+ std::vector<int64_t> mTOC;
+
+ // The detected VBR header type.
+ VBRHeaderType mType;
+ };
+
+ // Frame meta container used to parse and hold a frame header and side info.
+ class Frame {
+ public:
+ // Returns the length of the frame excluding the header in bytes.
+ int32_t Length() const;
+
+ // Returns the parsed frame header.
+ const FrameHeader& Header() const;
+
+ // Resets the frame header and data.
+ void Reset();
+
+ // Parses the next provided byte.
+ // Returns whether the byte creates a valid sequence up to this point.
+ bool ParseNext(uint8_t c);
+
+ private:
+ // The currently parsed frame header.
+ FrameHeader mHeader;
+ };
+
+ // Constructor.
+ FrameParser();
+
+ // Returns the currently parsed frame. Reset via Reset or EndFrameSession.
+ const Frame& CurrentFrame() const;
+
+ // Returns the previously parsed frame. Reset via Reset.
+ const Frame& PrevFrame() const;
+
+ // Returns the first parsed frame. Reset via Reset.
+ const Frame& FirstFrame() const;
+
+ // Returns the parsed ID3 header. Note: check for validity.
+ const ID3Parser::ID3Header& ID3Header() const;
+
+ // Returns the parsed VBR header info. Note: check for validity by type.
+ const VBRHeader& VBRInfo() const;
+
+ // Resets the parser.
+ void Reset();
+
+ // Resets all frame data, but not the ID3Header.
+ // Don't use between frames as first frame data is reset.
+ void ResetFrameData();
+
+ // Clear the last parsed frame to allow for next frame parsing, i.e.:
+ // - sets PrevFrame to CurrentFrame
+ // - resets the CurrentFrame
+ // - resets ID3Header if no valid header was parsed yet
+ void EndFrameSession();
+
+ // Parses contents of given ByteReader for a valid frame header and returns true
+ // if one was found. After returning, the variable passed to 'aBytesToSkip' holds
+ // the amount of bytes to be skipped (if any) in order to jump across a large
+ // ID3v2 tag spanning multiple buffers.
+ bool Parse(mp4_demuxer::ByteReader* aReader, uint32_t* aBytesToSkip);
+
+ // Parses contents of given ByteReader for a valid VBR header.
+ // The offset of the passed ByteReader needs to point to an MPEG frame begin,
+ // as a VBRI-style header is searched at a fixed offset relative to frame begin.
+ // Returns whether a valid VBR header was found.
+ bool ParseVBRHeader(mp4_demuxer::ByteReader* aReader);
+
+private:
+ // ID3 header parser.
+ ID3Parser mID3Parser;
+
+ // VBR header parser.
+ VBRHeader mVBRHeader;
+
+ // We keep the first parsed frame around for static info access, the
+ // previously parsed frame for debugging and the currently parsed frame.
+ Frame mFirstFrame;
+ Frame mFrame;
+ Frame mPrevFrame;
+};
+
+// The MP3 demuxer used to extract MPEG frames and side information out of
+// MPEG streams.
+class MP3TrackDemuxer : public MediaTrackDemuxer {
+public:
+ // Constructor, expecting a valid media resource.
+ explicit MP3TrackDemuxer(MediaResource* aSource);
+
+ // Initializes the track demuxer by reading the first frame for meta data.
+ // Returns initialization success state.
+ bool Init();
+
+ // Returns the total stream length if known, -1 otherwise.
+ int64_t StreamLength() const;
+
+ // Returns the estimated stream duration, or a 0-duration if unknown.
+ media::TimeUnit Duration() const;
+
+ // Returns the estimated duration up to the given frame number,
+ // or a 0-duration if unknown.
+ media::TimeUnit Duration(int64_t aNumFrames) const;
+
+ // Returns the estimated current seek position time.
+ media::TimeUnit SeekPosition() const;
+
+ const FrameParser::Frame& LastFrame() const;
+ RefPtr<MediaRawData> DemuxSample();
+
+ const ID3Parser::ID3Header& ID3Header() const;
+ const FrameParser::VBRHeader& VBRInfo() const;
+
+ // MediaTrackDemuxer interface.
+ UniquePtr<TrackInfo> GetInfo() const override;
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+ void Reset() override;
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
+ media::TimeUnit aTimeThreshold) override;
+ int64_t GetResourceOffset() const override;
+ media::TimeIntervals GetBuffered() override;
+
+private:
+ // Destructor.
+ ~MP3TrackDemuxer() {}
+
+ // Fast approximate seeking to given time.
+ media::TimeUnit FastSeek(const media::TimeUnit& aTime);
+
+ // Seeks by scanning the stream up to the given time for more accurate results.
+ media::TimeUnit ScanUntil(const media::TimeUnit& aTime);
+
+ // Finds the first valid frame and returns its byte range if found
+ // or a null-byte range otherwise.
+ MediaByteRange FindFirstFrame();
+
+ // Finds the next valid frame and returns its byte range if found
+ // or a null-byte range otherwise.
+ MediaByteRange FindNextFrame();
+
+ // Skips the next frame given the provided byte range.
+ bool SkipNextFrame(const MediaByteRange& aRange);
+
+ // Returns the next MPEG frame, if available.
+ already_AddRefed<MediaRawData> GetNextFrame(const MediaByteRange& aRange);
+
+ // Updates post-read meta data.
+ void UpdateState(const MediaByteRange& aRange);
+
+ // Returns the estimated offset for the given frame index.
+ int64_t OffsetFromFrameIndex(int64_t aFrameIndex) const;
+
+ // Returns the estimated frame index for the given offset.
+ int64_t FrameIndexFromOffset(int64_t aOffset) const;
+
+ // Returns the estimated frame index for the given time.
+ int64_t FrameIndexFromTime(const media::TimeUnit& aTime) const;
+
+ // Reads aSize bytes into aBuffer from the source starting at aOffset.
+ // Returns the actual size read.
+ int32_t Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize);
+
+ // Returns the average frame length derived from the previously parsed frames.
+ double AverageFrameLength() const;
+
+ // The (hopefully) MPEG resource.
+ MediaResourceIndex mSource;
+
+ // MPEG frame parser used to detect frames and extract side info.
+ FrameParser mParser;
+
+ // Current byte offset in the source stream.
+ int64_t mOffset;
+
+ // Byte offset of the begin of the first frame, or 0 if none parsed yet.
+ int64_t mFirstFrameOffset;
+
+ // Total parsed frames.
+ uint64_t mNumParsedFrames;
+
+ // Current frame index.
+ int64_t mFrameIndex;
+
+ // Sum of parsed frames' lengths in bytes.
+ uint64_t mTotalFrameLen;
+
+ // Samples per frame metric derived from frame headers or 0 if none available.
+ int32_t mSamplesPerFrame;
+
+ // Samples per second metric derived from frame headers or 0 if none available.
+ int32_t mSamplesPerSecond;
+
+ // Channel count derived from frame headers or 0 if none available.
+ int32_t mChannels;
+
+ // Audio track config info.
+ UniquePtr<AudioInfo> mInfo;
+};
+
+} // namespace mp3
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MP3FrameParser.cpp b/dom/media/MP3FrameParser.cpp
new file mode 100644
index 000000000..242e3df00
--- /dev/null
+++ b/dom/media/MP3FrameParser.cpp
@@ -0,0 +1,591 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <algorithm>
+
+#include "nsMemory.h"
+#include "MP3FrameParser.h"
+#include "VideoUtils.h"
+
+
+#define FROM_BIG_ENDIAN(X) ((uint32_t)((uint8_t)(X)[0] << 24 | (uint8_t)(X)[1] << 16 | \
+ (uint8_t)(X)[2] << 8 | (uint8_t)(X)[3]))
+
+
+namespace mozilla {
+
+/*
+ * Following code taken from http://www.hydrogenaudio.org/forums/index.php?showtopic=85125
+ * with permission from the author, Nick Wallette <sirnickity@gmail.com>.
+ */
+
+/* BEGIN shameless copy and paste */
+
+// Bitrates - use [version][layer][bitrate]
+const uint16_t mpeg_bitrates[4][4][16] = {
+ { // Version 2.5
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2
+ { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1
+ },
+ { // Reserved
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Invalid
+ },
+ { // Version 2
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3
+ { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2
+ { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1
+ },
+ { // Version 1
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved
+ { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, // Layer 3
+ { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // Layer 2
+ { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // Layer 1
+ }
+};
+
+// Sample rates - use [version][srate]
+const uint16_t mpeg_srates[4][4] = {
+ { 11025, 12000, 8000, 0 }, // MPEG 2.5
+ { 0, 0, 0, 0 }, // Reserved
+ { 22050, 24000, 16000, 0 }, // MPEG 2
+ { 44100, 48000, 32000, 0 } // MPEG 1
+};
+
+// Samples per frame - use [version][layer]
+const uint16_t mpeg_frame_samples[4][4] = {
+// Rsvd 3 2 1 < Layer v Version
+ { 0, 576, 1152, 384 }, // 2.5
+ { 0, 0, 0, 0 }, // Reserved
+ { 0, 576, 1152, 384 }, // 2
+ { 0, 1152, 1152, 384 } // 1
+};
+
+// Slot size (MPEG unit of measurement) - use [layer]
+const uint8_t mpeg_slot_size[4] = { 0, 1, 1, 4 }; // Rsvd, 3, 2, 1
+
+uint16_t
+MP3Frame::CalculateLength()
+{
+ // Lookup real values of these fields
+ uint32_t bitrate = mpeg_bitrates[mVersion][mLayer][mBitrate] * 1000;
+ uint32_t samprate = mpeg_srates[mVersion][mSampleRate];
+ uint16_t samples = mpeg_frame_samples[mVersion][mLayer];
+ uint8_t slot_size = mpeg_slot_size[mLayer];
+
+ // In-between calculations
+ float bps = (float)samples / 8.0;
+ float fsize = ( (bps * (float)bitrate) / (float)samprate )
+ + ( (mPad) ? slot_size : 0 );
+
+ // Frame sizes are truncated integers
+ return (uint16_t)fsize;
+}
+
+/* END shameless copy and paste */
+
+
+/** MP3Parser methods **/
+
+MP3Parser::MP3Parser()
+ : mCurrentChar(0)
+{ }
+
+void
+MP3Parser::Reset()
+{
+ mCurrentChar = 0;
+}
+
+uint16_t
+MP3Parser::ParseFrameLength(uint8_t ch)
+{
+ mData.mRaw[mCurrentChar] = ch;
+
+ MP3Frame &frame = mData.mFrame;
+
+ // Validate MP3 header as we read. We can't mistake the start of an MP3 frame
+ // for the middle of another frame due to the sync byte at the beginning
+ // of the frame.
+
+ // The only valid position for an all-high byte is the sync byte at the
+ // beginning of the frame.
+ if (ch == 0xff) {
+ mCurrentChar = 0;
+ }
+
+ // Make sure the current byte is valid in context. If not, reset the parser.
+ if (mCurrentChar == 2) {
+ if (frame.mBitrate == 0x0f) {
+ goto fail;
+ }
+ } else if (mCurrentChar == 1) {
+ if (frame.mSync2 != 0x07
+ || frame.mVersion == 0x01
+ || frame.mLayer == 0x00) {
+ goto fail;
+ }
+ }
+
+ // The only valid character at the beginning of the header is 0xff. Fail if
+ // it's different.
+ if (mCurrentChar == 0 && frame.mSync1 != 0xff) {
+ // Couldn't find the sync byte. Fail.
+ return 0;
+ }
+
+ mCurrentChar++;
+ MOZ_ASSERT(mCurrentChar <= sizeof(MP3Frame));
+
+ // Don't have a full header yet.
+ if (mCurrentChar < sizeof(MP3Frame)) {
+ return 0;
+ }
+
+ // Woo, valid header. Return the length.
+ mCurrentChar = 0;
+ return frame.CalculateLength();
+
+fail:
+ Reset();
+ return 0;
+}
+
+uint32_t
+MP3Parser::GetSampleRate()
+{
+ MP3Frame &frame = mData.mFrame;
+ return mpeg_srates[frame.mVersion][frame.mSampleRate];
+}
+
+uint32_t
+MP3Parser::GetSamplesPerFrame()
+{
+ MP3Frame &frame = mData.mFrame;
+ return mpeg_frame_samples[frame.mVersion][frame.mLayer];
+}
+
+
+/** ID3Parser methods **/
+
+const char sID3Head[3] = { 'I', 'D', '3' };
+const uint32_t ID3_HEADER_LENGTH = 10;
+const uint32_t ID3_FOOTER_LENGTH = 10;
+const uint8_t ID3_FOOTER_PRESENT = 0x10;
+
+ID3Parser::ID3Parser()
+ : mCurrentChar(0)
+ , mVersion(0)
+ , mFlags(0)
+ , mHeaderLength(0)
+{ }
+
+void
+ID3Parser::Reset()
+{
+ mCurrentChar = mVersion = mFlags = mHeaderLength = 0;
+}
+
+bool
+ID3Parser::ParseChar(char ch)
+{
+ switch (mCurrentChar) {
+ // The first three bytes of an ID3v2 header must match the string "ID3".
+ case 0: case 1: case 2:
+ if (ch != sID3Head[mCurrentChar]) {
+ goto fail;
+ }
+ break;
+ // The fourth and fifth bytes give the version, between 2 and 4.
+ case 3:
+ if (ch < '\2' || ch > '\4') {
+ goto fail;
+ }
+ mVersion = uint8_t(ch);
+ break;
+ case 4:
+ if (ch != '\0') {
+ goto fail;
+ }
+ break;
+ // The sixth byte gives the flags; valid flags depend on the version.
+ case 5:
+ if ((ch & (0xff >> mVersion)) != '\0') {
+ goto fail;
+ }
+ mFlags = uint8_t(ch);
+ break;
+ // Bytes seven through ten give the sum of the byte length of the extended
+ // header, the padding and the frames after unsynchronisation.
+ // These bytes form a 28-bit integer, with the high bit of each byte unset.
+ case 6: case 7: case 8: case 9:
+ if (ch & 0x80) {
+ goto fail;
+ }
+ mHeaderLength <<= 7;
+ mHeaderLength |= ch;
+ if (mCurrentChar == 9) {
+ mHeaderLength += ID3_HEADER_LENGTH;
+ mHeaderLength += (mFlags & ID3_FOOTER_PRESENT) ? ID3_FOOTER_LENGTH : 0;
+ }
+ break;
+ default:
+ MOZ_CRASH("Header already fully parsed!");
+ }
+
+ mCurrentChar++;
+
+ return IsParsed();
+
+fail:
+ if (mCurrentChar) {
+ Reset();
+ return ParseChar(ch);
+ }
+ Reset();
+ return false;
+}
+
+bool
+ID3Parser::IsParsed() const
+{
+ return mCurrentChar >= ID3_HEADER_LENGTH;
+}
+
+uint32_t
+ID3Parser::GetHeaderLength() const
+{
+ MOZ_ASSERT(IsParsed(),
+ "Queried length of ID3 header before parsing finished.");
+ return mHeaderLength;
+}
+
+
+/** VBR header helper stuff **/
+
+// Helper function to find a VBR header in an MP3 frame.
+// Based on information from
+// http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
+
+const uint32_t VBRI_TAG = FROM_BIG_ENDIAN("VBRI");
+const uint32_t VBRI_OFFSET = 32 - sizeof(MP3Frame);
+const uint32_t VBRI_FRAME_COUNT_OFFSET = VBRI_OFFSET + 14;
+const uint32_t VBRI_MIN_FRAME_SIZE = VBRI_OFFSET + 26;
+
+const uint32_t XING_TAG = FROM_BIG_ENDIAN("Xing");
+enum XingFlags {
+ XING_HAS_NUM_FRAMES = 0x01,
+ XING_HAS_NUM_BYTES = 0x02,
+ XING_HAS_TOC = 0x04,
+ XING_HAS_VBR_SCALE = 0x08
+};
+
+static int64_t
+ParseXing(const char *aBuffer)
+{
+ uint32_t flags = FROM_BIG_ENDIAN(aBuffer + 4);
+
+ if (!(flags & XING_HAS_NUM_FRAMES)) {
+ NS_WARNING("VBR file without frame count. Duration estimation likely to "
+ "be totally wrong.");
+ return -1;
+ }
+
+ int64_t numFrames = -1;
+ if (flags & XING_HAS_NUM_FRAMES) {
+ numFrames = FROM_BIG_ENDIAN(aBuffer + 8);
+ }
+
+ return numFrames;
+}
+
+static int64_t
+FindNumVBRFrames(const nsCString& aFrame)
+{
+ const char *buffer = aFrame.get();
+ const char *bufferEnd = aFrame.get() + aFrame.Length();
+
+ // VBRI header is nice and well-defined; let's try to find that first.
+ if (aFrame.Length() > VBRI_MIN_FRAME_SIZE &&
+ FROM_BIG_ENDIAN(buffer + VBRI_OFFSET) == VBRI_TAG) {
+ return FROM_BIG_ENDIAN(buffer + VBRI_FRAME_COUNT_OFFSET);
+ }
+
+ // We have to search for the Xing header as its position can change.
+ for (; buffer + sizeof(XING_TAG) < bufferEnd; buffer++) {
+ if (FROM_BIG_ENDIAN(buffer) == XING_TAG) {
+ return ParseXing(buffer);
+ }
+ }
+
+ return -1;
+}
+
+
+/** MP3FrameParser methods **/
+
+// Some MP3's have large ID3v2 tags, up to 150KB, so we allow lots of
+// skipped bytes to be read, just in case, before we give up and assume
+// we're not parsing an MP3 stream.
+static const uint32_t MAX_SKIPPED_BYTES = 4096;
+
+enum {
+ MP3_HEADER_LENGTH = 4,
+};
+
+MP3FrameParser::MP3FrameParser(int64_t aLength)
+: mLock("MP3FrameParser.mLock"),
+ mTotalID3Size(0),
+ mTotalFrameSize(0),
+ mFrameCount(0),
+ mOffset(0),
+ mLength(aLength),
+ mMP3Offset(-1),
+ mSamplesPerSecond(0),
+ mFirstFrameEnd(-1),
+ mIsMP3(MAYBE_MP3)
+{ }
+
+nsresult MP3FrameParser::ParseBuffer(const uint8_t* aBuffer,
+ uint32_t aLength,
+ int64_t aStreamOffset,
+ uint32_t* aOutBytesRead)
+{
+ // Iterate forwards over the buffer, looking for ID3 tag, or MP3
+ // Frame headers.
+ const uint8_t *buffer = aBuffer;
+ const uint8_t *bufferEnd = aBuffer + aLength;
+
+ // If we haven't found any MP3 frame data yet, there might be ID3 headers
+ // we can skip over.
+ if (mMP3Offset < 0) {
+ for (const uint8_t *ch = buffer; ch < bufferEnd; ch++) {
+ if (mID3Parser.ParseChar(*ch)) {
+ // Found an ID3 header. We don't care about the body of the header, so
+ // just skip past.
+ buffer = ch + mID3Parser.GetHeaderLength() - (ID3_HEADER_LENGTH - 1);
+
+ if (buffer <= ch) {
+ return NS_ERROR_FAILURE;
+ }
+
+ ch = buffer;
+
+ mTotalID3Size += mID3Parser.GetHeaderLength();
+
+ // Yes, this is an MP3!
+ mIsMP3 = DEFINITELY_MP3;
+
+ mID3Parser.Reset();
+ }
+ }
+ }
+
+ // The first MP3 frame in a variable bitrate stream can contain metadata
+ // for duration estimation and seeking, so we buffer that first frame here.
+ if (aStreamOffset < mFirstFrameEnd) {
+ uint64_t copyLen = std::min((int64_t)aLength, mFirstFrameEnd - aStreamOffset);
+ mFirstFrame.Append((const char *)buffer, copyLen);
+ buffer += copyLen;
+ }
+
+ while (buffer < bufferEnd) {
+ uint16_t frameLen = mMP3Parser.ParseFrameLength(*buffer);
+
+ if (frameLen) {
+ // We've found an MP3 frame!
+ // This is the first frame (and the only one we'll bother parsing), so:
+ // * Mark this stream as MP3;
+ // * Store the offset at which the MP3 data started; and
+ // * Start buffering the frame, as it might contain handy metadata.
+
+ // We're now sure this is an MP3 stream.
+ mIsMP3 = DEFINITELY_MP3;
+
+ // We need to know these to convert the number of frames in the stream
+ // to the length of the stream in seconds.
+ mSamplesPerSecond = mMP3Parser.GetSampleRate();
+ mSamplesPerFrame = mMP3Parser.GetSamplesPerFrame();
+
+ // If the stream has a constant bitrate, we should only need the length
+ // of the first frame and the length (in bytes) of the stream to
+ // estimate the length (in seconds).
+ mTotalFrameSize += frameLen;
+ mFrameCount++;
+
+ // If |mMP3Offset| isn't set then this is the first MP3 frame we have
+ // seen in the stream, which is useful for duration estimation.
+ if (mMP3Offset > -1) {
+ uint16_t skip = frameLen - sizeof(MP3Frame);
+ buffer += skip ? skip : 1;
+ continue;
+ }
+
+ // Remember the offset of the MP3 stream.
+ // We're at the last byte of an MP3Frame, so MP3 data started
+ // sizeof(MP3Frame) - 1 bytes ago.
+ mMP3Offset = aStreamOffset
+ + (buffer - aBuffer)
+ - (sizeof(MP3Frame) - 1);
+
+ buffer++;
+
+ // If the stream has a variable bitrate, the first frame has metadata
+ // we need for duration estimation and seeking. Start buffering it so we
+ // can parse it later.
+ mFirstFrameEnd = mMP3Offset + frameLen;
+ uint64_t currOffset = buffer - aBuffer + aStreamOffset;
+ uint64_t copyLen = std::min(mFirstFrameEnd - currOffset,
+ (uint64_t)(bufferEnd - buffer));
+ mFirstFrame.Append((const char *)buffer, copyLen);
+
+ buffer += copyLen;
+
+ } else {
+ // Nothing to see here. Move along.
+ buffer++;
+ }
+ }
+
+ *aOutBytesRead = buffer - aBuffer;
+
+ if (mFirstFrameEnd > -1 && mFirstFrameEnd <= aStreamOffset + buffer - aBuffer) {
+ // We have our whole first frame. Try to find a VBR header.
+ mNumFrames = FindNumVBRFrames(mFirstFrame);
+ mFirstFrameEnd = -1;
+ }
+
+ return NS_OK;
+}
+
+void MP3FrameParser::Parse(const uint8_t* aBuffer, uint32_t aLength, uint64_t aOffset)
+{
+ MutexAutoLock mon(mLock);
+
+ if (HasExactDuration()) {
+ // We know the duration; nothing to do here.
+ return;
+ }
+
+ const uint8_t* buffer = aBuffer;
+ int32_t length = aLength;
+ uint64_t offset = aOffset;
+
+ // Got some data we have seen already. Skip forward to what we need.
+ if (aOffset < mOffset) {
+ buffer += mOffset - aOffset;
+ length -= mOffset - aOffset;
+ offset = mOffset;
+
+ if (length <= 0) {
+ return;
+ }
+ }
+
+ // If there is a discontinuity in the input stream, reset the state of the
+ // parsers so we don't get any partial headers.
+ if (mOffset < aOffset) {
+ if (!mID3Parser.IsParsed()) {
+ // Only reset this if it hasn't finished yet.
+ mID3Parser.Reset();
+ }
+
+ if (mFirstFrameEnd > -1) {
+ NS_WARNING("Discontinuity in input while buffering first frame.");
+ mFirstFrameEnd = -1;
+ }
+
+ mMP3Parser.Reset();
+ }
+
+ uint32_t bytesRead = 0;
+ if (NS_FAILED(ParseBuffer(buffer,
+ length,
+ offset,
+ &bytesRead))) {
+ return;
+ }
+
+ MOZ_ASSERT(length <= (int)bytesRead, "All bytes should have been consumed");
+
+ // Update next data offset
+ mOffset = offset + bytesRead;
+
+ // If we've parsed lots of data and we still have nothing, just give up.
+ // We don't count ID3 headers towards the skipped bytes count, as MP3 files
+ // can have massive ID3 sections.
+ if (!mID3Parser.IsParsed() && mMP3Offset < 0 &&
+ mOffset - mTotalID3Size > MAX_SKIPPED_BYTES) {
+ mIsMP3 = NOT_MP3;
+ }
+}
+
+int64_t MP3FrameParser::GetDuration()
+{
+ MutexAutoLock mon(mLock);
+
+ if (!ParsedHeaders() || !mSamplesPerSecond) {
+ // Not a single frame decoded yet.
+ return -1;
+ }
+
+ MOZ_ASSERT(mFrameCount > 0 && mTotalFrameSize > 0,
+ "Frame parser should have seen at least one MP3 frame of positive length.");
+
+ if (!mFrameCount || !mTotalFrameSize) {
+ // This should never happen.
+ return -1;
+ }
+
+ double frames;
+ if (mNumFrames < 0) {
+ // Estimate the number of frames in the stream based on the average frame
+ // size and the length of the MP3 file.
+ double frameSize = (double)mTotalFrameSize / mFrameCount;
+ frames = (double)(mLength - mMP3Offset) / frameSize;
+ } else {
+ // We know the exact number of frames from the VBR header.
+ frames = mNumFrames;
+ }
+
+ // The duration of each frame is constant over a given stream.
+ double usPerFrame = USECS_PER_S * mSamplesPerFrame / mSamplesPerSecond;
+
+ return frames * usPerFrame;
+}
+
+int64_t MP3FrameParser::GetMP3Offset()
+{
+ MutexAutoLock mon(mLock);
+ return mMP3Offset;
+}
+
+bool MP3FrameParser::ParsedHeaders()
+{
+ // We have seen both the beginning and the end of the first MP3 frame in the
+ // stream.
+ return mMP3Offset > -1 && mFirstFrameEnd < 0;
+}
+
+bool MP3FrameParser::HasExactDuration()
+{
+ return ParsedHeaders() && mNumFrames > -1;
+}
+
+bool MP3FrameParser::NeedsData()
+{
+ // If we don't know the duration exactly then either:
+ // - we're still waiting for a VBR header; or
+ // - we look at all frames to constantly update our duration estimate.
+ return IsMP3() && !HasExactDuration();
+}
+
+} // namespace mozilla
diff --git a/dom/media/MP3FrameParser.h b/dom/media/MP3FrameParser.h
new file mode 100644
index 000000000..d2ba791fd
--- /dev/null
+++ b/dom/media/MP3FrameParser.h
@@ -0,0 +1,219 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MP3FrameParser_h
+#define MP3FrameParser_h
+
+#include <stdint.h>
+
+#include "mozilla/Mutex.h"
+#include "nsString.h"
+#include "Intervals.h"
+
+namespace mozilla {
+
+// Simple parser to tell whether we've found an ID3 header and how long it is,
+// so that we can skip it.
+// XXX maybe actually parse this stuff?
+class ID3Parser
+{
+public:
+ ID3Parser();
+
+ void Reset();
+ bool ParseChar(char ch);
+ bool IsParsed() const;
+ uint32_t GetHeaderLength() const;
+
+private:
+ uint32_t mCurrentChar;
+ uint8_t mVersion;
+ uint8_t mFlags;
+ uint32_t mHeaderLength;
+};
+
+struct MP3Frame {
+ uint16_t mSync1 : 8; // Always all set
+ uint16_t mProtected : 1; // Ignored
+ uint16_t mLayer : 2;
+ uint16_t mVersion : 2;
+ uint16_t mSync2 : 3; // Always all set
+ uint16_t mPrivate : 1; // Ignored
+ uint16_t mPad : 1;
+ uint16_t mSampleRate : 2; // Index into mpeg_srates above
+ uint16_t mBitrate : 4; // Index into mpeg_bitrates above
+
+ uint16_t CalculateLength();
+};
+
+// Buffering parser for MP3 frames.
+class MP3Parser
+{
+public:
+ MP3Parser();
+
+ // Forget all data the parser has seen so far.
+ void Reset();
+
+ // Parse the given byte. If we have found a frame header, return the length of
+ // the frame.
+ uint16_t ParseFrameLength(uint8_t ch);
+
+ // Get the sample rate from the current header.
+ uint32_t GetSampleRate();
+
+ // Get the number of samples per frame.
+ uint32_t GetSamplesPerFrame();
+
+private:
+ uint32_t mCurrentChar;
+ union {
+ uint8_t mRaw[3];
+ MP3Frame mFrame;
+ } mData;
+};
+
+
+// A description of the MP3 format and its extensions is available at
+//
+// http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
+//
+// The data in MP3 streams is split into small frames, with each frame
+// containing a fixed number of samples. The duration of a frame depends
+// on the frame's bit rate and sample rate. Both values can vary among
+// frames, so it is necessary to examine each individual frame of an MP3
+// stream to calculate the stream's overall duration.
+//
+// The MP3 frame parser extracts information from an MP3 data stream. It
+// accepts a range of frames of an MP3 stream as input, and parses all
+// frames for their duration. Callers can query the stream's overall
+// duration from the parser.
+//
+// Call the methods NotifyDataArrived or Parse to add new data. If you added
+// information for a certain stream position, you cannot go back to previous
+// positions. The parser will simply ignore the input. If you skip stream
+// positions, the duration of the related MP3 frames will be estimated from
+// the stream's average.
+//
+// The method GetDuration returns calculated duration of the stream, including
+// estimates for skipped ranges.
+//
+// All public methods are thread-safe.
+
+class MP3FrameParser
+{
+public:
+ explicit MP3FrameParser(int64_t aLength=-1);
+
+ bool IsMP3() {
+ MutexAutoLock mon(mLock);
+ return mIsMP3 != NOT_MP3;
+ }
+
+ void Parse(const uint8_t* aBuffer, uint32_t aLength, uint64_t aStreamOffset);
+
+ // Returns the duration, in microseconds. If the entire stream has not
+ // been parsed yet, this is an estimate based on the bitrate of the
+ // frames parsed so far.
+ int64_t GetDuration();
+
+ // Returns the offset of the first MP3 frame in the stream, or -1 of
+ // no MP3 frame has been detected yet.
+ int64_t GetMP3Offset();
+
+ // Returns true if we've seen the whole first frame of the MP3 stream, and
+ // therefore can make an estimate on the stream duration.
+ // Otherwise, returns false.
+ bool ParsedHeaders();
+
+ // Returns true if we know the exact duration of the MP3 stream;
+ // false otherwise.
+ bool HasExactDuration();
+
+ // Returns true if the parser needs more data for duration estimation.
+ bool NeedsData();
+ // Assign the total lenght of this mp3 stream
+ void SetLength(int64_t aLength) {
+ MutexAutoLock mon(mLock);
+ mLength = aLength;
+ }
+private:
+
+ // Parses aBuffer, starting at offset 0. Returns the number of bytes
+ // parsed, relative to the start of the buffer. Note this may be
+ // greater than aLength if the headers in the buffer indicate that
+ // the frame or ID3 tag extends outside of aBuffer. Returns failure
+ // if too many non-MP3 bytes are parsed.
+ nsresult ParseBuffer(const uint8_t* aBuffer,
+ uint32_t aLength,
+ int64_t aStreamOffset,
+ uint32_t* aOutBytesRead);
+
+ // A low-contention lock for protecting the parser results
+ Mutex mLock;
+
+ // ID3 header parser. Keeps state between reads in case the header falls
+ // in between.
+ ID3Parser mID3Parser;
+
+ // MP3 frame header parser.
+ MP3Parser mMP3Parser;
+
+ // If we read |MAX_SKIPPED_BYTES| from the stream without finding any MP3
+ // frames, we give up and report |NOT_MP3|. Here we track the cumulative size
+ // of any ID3 headers we've seen so big ID3 sections aren't counted towards
+ // skipped bytes.
+ uint32_t mTotalID3Size;
+
+ // All fields below are protected by mLock
+
+ // We keep stats on the size of all the frames we've seen, as well as how many
+ // so that we can estimate the duration of the rest of the stream.
+ uint64_t mTotalFrameSize;
+ uint64_t mFrameCount;
+
+ // Offset of the last data parsed. This is the end offset of the last data
+ // block parsed, so it's the start offset we expect to get on the next
+ // call to Parse().
+ uint64_t mOffset;
+
+ // Total length of the stream in bytes.
+ int64_t mLength;
+
+ // Offset of first MP3 frame in the bitstream. Has value -1 until the
+ // first MP3 frame is found.
+ int64_t mMP3Offset;
+
+ // The exact number of frames in this stream, if we know it. -1 otherwise.
+ int64_t mNumFrames;
+
+ // Number of audio samples per second and per frame. Fixed through the whole
+ // file. If we know these variables as well as the number of frames in the
+ // file, we can get an exact duration for the stream.
+ uint16_t mSamplesPerSecond;
+ uint16_t mSamplesPerFrame;
+
+ // If the MP3 has a variable bitrate, then there *should* be metadata about
+ // the encoding in the first frame. We buffer the first frame here.
+ nsCString mFirstFrame;
+
+ // While we are reading the first frame, this is the stream offset of the
+ // last byte of that frame. -1 at all other times.
+ int64_t mFirstFrameEnd;
+
+ enum eIsMP3 {
+ MAYBE_MP3, // We're giving the stream the benefit of the doubt...
+ DEFINITELY_MP3, // We've hit at least one ID3 tag or MP3 frame.
+ NOT_MP3 // Not found any evidence of the stream being MP3.
+ };
+
+ eIsMP3 mIsMP3;
+
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaCache.cpp b/dom/media/MediaCache.cpp
new file mode 100644
index 000000000..37399f851
--- /dev/null
+++ b/dom/media/MediaCache.cpp
@@ -0,0 +1,2472 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ReentrantMonitor.h"
+
+#include "MediaCache.h"
+#include "prio.h"
+#include "nsContentUtils.h"
+#include "nsThreadUtils.h"
+#include "MediaResource.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Preferences.h"
+#include "FileBlockCache.h"
+#include "nsAnonymousTemporaryFile.h"
+#include "nsIObserverService.h"
+#include "nsISeekableStream.h"
+#include "nsIPrincipal.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/Services.h"
+#include <algorithm>
+
+namespace mozilla {
+
+LazyLogModule gMediaCacheLog("MediaCache");
+#define CACHE_LOG(type, msg) MOZ_LOG(gMediaCacheLog, type, msg)
+
+// Readahead blocks for non-seekable streams will be limited to this
+// fraction of the cache space. We don't normally evict such blocks
+// because replacing them requires a seek, but we need to make sure
+// they don't monopolize the cache.
+static const double NONSEEKABLE_READAHEAD_MAX = 0.5;
+
+// Data N seconds before the current playback position is given the same priority
+// as data REPLAY_PENALTY_FACTOR*N seconds ahead of the current playback
+// position. REPLAY_PENALTY_FACTOR is greater than 1 to reflect that
+// data in the past is less likely to be played again than data in the future.
+// We want to give data just behind the current playback position reasonably
+// high priority in case codecs need to retrieve that data (e.g. because
+// tracks haven't been muxed well or are being decoded at uneven rates).
+// 1/REPLAY_PENALTY_FACTOR as much data will be kept behind the
+// current playback position as will be kept ahead of the current playback
+// position.
+static const uint32_t REPLAY_PENALTY_FACTOR = 3;
+
+// When looking for a reusable block, scan forward this many blocks
+// from the desired "best" block location to look for free blocks,
+// before we resort to scanning the whole cache. The idea is to try to
+// store runs of stream blocks close-to-consecutively in the cache if we
+// can.
+static const uint32_t FREE_BLOCK_SCAN_LIMIT = 16;
+
+#ifdef DEBUG
+// Turn this on to do very expensive cache state validation
+// #define DEBUG_VERIFY_CACHE
+#endif
+
+// There is at most one media cache (although that could quite easily be
+// relaxed if we wanted to manage multiple caches with independent
+// size limits).
+static MediaCache* gMediaCache;
+
+class MediaCacheFlusher final : public nsIObserver,
+ public nsSupportsWeakReference
+{
+ MediaCacheFlusher() {}
+ ~MediaCacheFlusher();
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+ static void Init();
+};
+
+static MediaCacheFlusher* gMediaCacheFlusher;
+
+NS_IMPL_ISUPPORTS(MediaCacheFlusher, nsIObserver, nsISupportsWeakReference)
+
+MediaCacheFlusher::~MediaCacheFlusher()
+{
+ gMediaCacheFlusher = nullptr;
+}
+
+void MediaCacheFlusher::Init()
+{
+ if (gMediaCacheFlusher) {
+ return;
+ }
+
+ gMediaCacheFlusher = new MediaCacheFlusher();
+ NS_ADDREF(gMediaCacheFlusher);
+
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ if (observerService) {
+ observerService->AddObserver(gMediaCacheFlusher, "last-pb-context-exited", true);
+ observerService->AddObserver(gMediaCacheFlusher, "cacheservice:empty-cache", true);
+ }
+}
+
+class MediaCache {
+public:
+ friend class MediaCacheStream::BlockList;
+ typedef MediaCacheStream::BlockList BlockList;
+ static const int64_t BLOCK_SIZE = MediaCacheStream::BLOCK_SIZE;
+
+ MediaCache() : mNextResourceID(1),
+ mReentrantMonitor("MediaCache.mReentrantMonitor"),
+ mUpdateQueued(false)
+#ifdef DEBUG
+ , mInUpdate(false)
+#endif
+ {
+ MOZ_COUNT_CTOR(MediaCache);
+ }
+ ~MediaCache() {
+ NS_ASSERTION(mStreams.IsEmpty(), "Stream(s) still open!");
+ Truncate();
+ NS_ASSERTION(mIndex.Length() == 0, "Blocks leaked?");
+ if (mFileCache) {
+ mFileCache->Close();
+ mFileCache = nullptr;
+ }
+ MOZ_COUNT_DTOR(MediaCache);
+ }
+
+ // Main thread only. Creates the backing cache file. If this fails,
+ // then the cache is still in a semi-valid state; mFD will be null,
+ // so all I/O on the cache file will fail.
+ nsresult Init();
+ // Shut down the global cache if it's no longer needed. We shut down
+ // the cache as soon as there are no streams. This means that during
+ // normal operation we are likely to start up the cache and shut it down
+ // many times, but that's OK since starting it up is cheap and
+ // shutting it down cleans things up and releases disk space.
+ static void MaybeShutdown();
+
+ // Brutally flush the cache contents. Main thread only.
+ static void Flush();
+ void FlushInternal();
+
+ // Cache-file access methods. These are the lowest-level cache methods.
+ // mReentrantMonitor must be held; these can be called on any thread.
+ // This can return partial reads.
+ nsresult ReadCacheFile(int64_t aOffset, void* aData, int32_t aLength,
+ int32_t* aBytes);
+ // This will fail if all aLength bytes are not read
+ nsresult ReadCacheFileAllBytes(int64_t aOffset, void* aData, int32_t aLength);
+
+ int64_t AllocateResourceID()
+ {
+ mReentrantMonitor.AssertCurrentThreadIn();
+ return mNextResourceID++;
+ }
+
+ // mReentrantMonitor must be held, called on main thread.
+ // These methods are used by the stream to set up and tear down streams,
+ // and to handle reads and writes.
+ // Add aStream to the list of streams.
+ void OpenStream(MediaCacheStream* aStream);
+ // Remove aStream from the list of streams.
+ void ReleaseStream(MediaCacheStream* aStream);
+ // Free all blocks belonging to aStream.
+ void ReleaseStreamBlocks(MediaCacheStream* aStream);
+ // Find a cache entry for this data, and write the data into it
+ void AllocateAndWriteBlock(MediaCacheStream* aStream, const void* aData,
+ MediaCacheStream::ReadMode aMode);
+
+ // mReentrantMonitor must be held; can be called on any thread
+ // Notify the cache that a seek has been requested. Some blocks may
+ // need to change their class between PLAYED_BLOCK and READAHEAD_BLOCK.
+ // This does not trigger channel seeks directly, the next Update()
+ // will do that if necessary. The caller will call QueueUpdate().
+ void NoteSeek(MediaCacheStream* aStream, int64_t aOldOffset);
+ // Notify the cache that a block has been read from. This is used
+ // to update last-use times. The block may not actually have a
+ // cache entry yet since Read can read data from a stream's
+ // in-memory mPartialBlockBuffer while the block is only partly full,
+ // and thus hasn't yet been committed to the cache. The caller will
+ // call QueueUpdate().
+ void NoteBlockUsage(MediaCacheStream* aStream, int32_t aBlockIndex,
+ int64_t aStreamOffset,
+ MediaCacheStream::ReadMode aMode, TimeStamp aNow);
+ // Mark aStream as having the block, adding it as an owner.
+ void AddBlockOwnerAsReadahead(int32_t aBlockIndex, MediaCacheStream* aStream,
+ int32_t aStreamBlockIndex);
+
+ // This queues a call to Update() on the main thread.
+ void QueueUpdate();
+
+ // Notify all streams for the resource ID that the suspended status changed
+ // at the end of MediaCache::Update.
+ void QueueSuspendedStatusUpdate(int64_t aResourceID);
+
+ // Updates the cache state asynchronously on the main thread:
+ // -- try to trim the cache back to its desired size, if necessary
+ // -- suspend channels that are going to read data that's lower priority
+ // than anything currently cached
+ // -- resume channels that are going to read data that's higher priority
+ // than something currently cached
+ // -- seek channels that need to seek to a new location
+ void Update();
+
+#ifdef DEBUG_VERIFY_CACHE
+ // Verify invariants, especially block list invariants
+ void Verify();
+#else
+ void Verify() {}
+#endif
+
+ ReentrantMonitor& GetReentrantMonitor() { return mReentrantMonitor; }
+
+ /**
+ * An iterator that makes it easy to iterate through all streams that
+ * have a given resource ID and are not closed.
+ * Can be used on the main thread or while holding the media cache lock.
+ */
+ class ResourceStreamIterator {
+ public:
+ explicit ResourceStreamIterator(int64_t aResourceID) :
+ mResourceID(aResourceID), mNext(0) {}
+ MediaCacheStream* Next()
+ {
+ while (mNext < gMediaCache->mStreams.Length()) {
+ MediaCacheStream* stream = gMediaCache->mStreams[mNext];
+ ++mNext;
+ if (stream->GetResourceID() == mResourceID && !stream->IsClosed())
+ return stream;
+ }
+ return nullptr;
+ }
+ private:
+ int64_t mResourceID;
+ uint32_t mNext;
+ };
+
+protected:
+ // Find a free or reusable block and return its index. If there are no
+ // free blocks and no reusable blocks, add a new block to the cache
+ // and return it. Can return -1 on OOM.
+ int32_t FindBlockForIncomingData(TimeStamp aNow, MediaCacheStream* aStream);
+ // Find a reusable block --- a free block, if there is one, otherwise
+ // the reusable block with the latest predicted-next-use, or -1 if
+ // there aren't any freeable blocks. Only block indices less than
+ // aMaxSearchBlockIndex are considered. If aForStream is non-null,
+ // then aForStream and aForStreamBlock indicate what media data will
+ // be placed; FindReusableBlock will favour returning free blocks
+ // near other blocks for that point in the stream.
+ int32_t FindReusableBlock(TimeStamp aNow,
+ MediaCacheStream* aForStream,
+ int32_t aForStreamBlock,
+ int32_t aMaxSearchBlockIndex);
+ bool BlockIsReusable(int32_t aBlockIndex);
+ // Given a list of blocks sorted with the most reusable blocks at the
+ // end, find the last block whose stream is not pinned (if any)
+ // and whose cache entry index is less than aBlockIndexLimit
+ // and append it to aResult.
+ void AppendMostReusableBlock(BlockList* aBlockList,
+ nsTArray<uint32_t>* aResult,
+ int32_t aBlockIndexLimit);
+
+ enum BlockClass {
+ // block belongs to mMetadataBlockList because data has been consumed
+ // from it in "metadata mode" --- in particular blocks read during
+ // Ogg seeks go into this class. These blocks may have played data
+ // in them too.
+ METADATA_BLOCK,
+ // block belongs to mPlayedBlockList because its offset is
+ // less than the stream's current reader position
+ PLAYED_BLOCK,
+ // block belongs to the stream's mReadaheadBlockList because its
+ // offset is greater than or equal to the stream's current
+ // reader position
+ READAHEAD_BLOCK
+ };
+
+ struct BlockOwner {
+ constexpr BlockOwner() {}
+
+ // The stream that owns this block, or null if the block is free.
+ MediaCacheStream* mStream = nullptr;
+ // The block index in the stream. Valid only if mStream is non-null.
+ // Initialized to an insane value to highlight misuse.
+ uint32_t mStreamBlock = UINT32_MAX;
+ // Time at which this block was last used. Valid only if
+ // mClass is METADATA_BLOCK or PLAYED_BLOCK.
+ TimeStamp mLastUseTime;
+ BlockClass mClass = READAHEAD_BLOCK;
+ };
+
+ struct Block {
+ // Free blocks have an empty mOwners array
+ nsTArray<BlockOwner> mOwners;
+ };
+
+ // Get the BlockList that the block should belong to given its
+ // current owner
+ BlockList* GetListForBlock(BlockOwner* aBlock);
+ // Get the BlockOwner for the given block index and owning stream
+ // (returns null if the stream does not own the block)
+ BlockOwner* GetBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream);
+ // Returns true iff the block is free
+ bool IsBlockFree(int32_t aBlockIndex)
+ { return mIndex[aBlockIndex].mOwners.IsEmpty(); }
+ // Add the block to the free list and mark its streams as not having
+ // the block in cache
+ void FreeBlock(int32_t aBlock);
+ // Mark aStream as not having the block, removing it as an owner. If
+ // the block has no more owners it's added to the free list.
+ void RemoveBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream);
+ // Swap all metadata associated with the two blocks. The caller
+ // is responsible for swapping up any cache file state.
+ void SwapBlocks(int32_t aBlockIndex1, int32_t aBlockIndex2);
+ // Insert the block into the readahead block list for the stream
+ // at the right point in the list.
+ void InsertReadaheadBlock(BlockOwner* aBlockOwner, int32_t aBlockIndex);
+
+ // Guess the duration until block aBlock will be next used
+ TimeDuration PredictNextUse(TimeStamp aNow, int32_t aBlock);
+ // Guess the duration until the next incoming data on aStream will be used
+ TimeDuration PredictNextUseForIncomingData(MediaCacheStream* aStream);
+
+ // Truncate the file and index array if there are free blocks at the
+ // end
+ void Truncate();
+
+ // This member is main-thread only. It's used to allocate unique
+ // resource IDs to streams.
+ int64_t mNextResourceID;
+
+ // The monitor protects all the data members here. Also, off-main-thread
+ // readers that need to block will Wait() on this monitor. When new
+ // data becomes available in the cache, we NotifyAll() on this monitor.
+ ReentrantMonitor mReentrantMonitor;
+ // This is only written while on the main thread and the monitor is held.
+ // Thus, it can be safely read from the main thread or while holding the monitor.
+ nsTArray<MediaCacheStream*> mStreams;
+ // The Blocks describing the cache entries.
+ nsTArray<Block> mIndex;
+ // Writer which performs IO, asynchronously writing cache blocks.
+ RefPtr<FileBlockCache> mFileCache;
+ // The list of free blocks; they are not ordered.
+ BlockList mFreeBlocks;
+ // True if an event to run Update() has been queued but not processed
+ bool mUpdateQueued;
+#ifdef DEBUG
+ bool mInUpdate;
+#endif
+ // A list of resource IDs to notify about the change in suspended status.
+ nsTArray<int64_t> mSuspendedStatusToNotify;
+};
+
+NS_IMETHODIMP
+MediaCacheFlusher::Observe(nsISupports *aSubject, char const *aTopic, char16_t const *aData)
+{
+ if (strcmp(aTopic, "last-pb-context-exited") == 0) {
+ MediaCache::Flush();
+ }
+ if (strcmp(aTopic, "cacheservice:empty-cache") == 0) {
+ MediaCache::Flush();
+ }
+ return NS_OK;
+}
+
+MediaCacheStream::MediaCacheStream(ChannelMediaResource* aClient)
+ : mClient(aClient),
+ mInitialized(false),
+ mHasHadUpdate(false),
+ mClosed(false),
+ mDidNotifyDataEnded(false),
+ mResourceID(0),
+ mIsTransportSeekable(false),
+ mCacheSuspended(false),
+ mChannelEnded(false),
+ mChannelOffset(0),
+ mStreamLength(-1),
+ mStreamOffset(0),
+ mPlaybackBytesPerSecond(10000),
+ mPinCount(0),
+ mCurrentMode(MODE_PLAYBACK),
+ mMetadataInPartialBlockBuffer(false),
+ mPartialBlockBuffer(MakeUnique<int64_t[]>(BLOCK_SIZE/sizeof(int64_t)))
+{
+}
+
+size_t MediaCacheStream::SizeOfExcludingThis(
+ MallocSizeOf aMallocSizeOf) const
+{
+ // Looks like these are not owned:
+ // - mClient
+ // - mPrincipal
+ size_t size = mBlocks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ size += mReadaheadBlocks.SizeOfExcludingThis(aMallocSizeOf);
+ size += mMetadataBlocks.SizeOfExcludingThis(aMallocSizeOf);
+ size += mPlayedBlocks.SizeOfExcludingThis(aMallocSizeOf);
+ size += aMallocSizeOf(mPartialBlockBuffer.get());
+
+ return size;
+}
+
+size_t MediaCacheStream::BlockList::SizeOfExcludingThis(
+ MallocSizeOf aMallocSizeOf) const
+{
+ return mEntries.ShallowSizeOfExcludingThis(aMallocSizeOf);
+}
+
+void MediaCacheStream::BlockList::AddFirstBlock(int32_t aBlock)
+{
+ NS_ASSERTION(!mEntries.GetEntry(aBlock), "Block already in list");
+ Entry* entry = mEntries.PutEntry(aBlock);
+
+ if (mFirstBlock < 0) {
+ entry->mNextBlock = entry->mPrevBlock = aBlock;
+ } else {
+ entry->mNextBlock = mFirstBlock;
+ entry->mPrevBlock = mEntries.GetEntry(mFirstBlock)->mPrevBlock;
+ mEntries.GetEntry(entry->mNextBlock)->mPrevBlock = aBlock;
+ mEntries.GetEntry(entry->mPrevBlock)->mNextBlock = aBlock;
+ }
+ mFirstBlock = aBlock;
+ ++mCount;
+}
+
+void MediaCacheStream::BlockList::AddAfter(int32_t aBlock, int32_t aBefore)
+{
+ NS_ASSERTION(!mEntries.GetEntry(aBlock), "Block already in list");
+ Entry* entry = mEntries.PutEntry(aBlock);
+
+ Entry* addAfter = mEntries.GetEntry(aBefore);
+ NS_ASSERTION(addAfter, "aBefore not in list");
+
+ entry->mNextBlock = addAfter->mNextBlock;
+ entry->mPrevBlock = aBefore;
+ mEntries.GetEntry(entry->mNextBlock)->mPrevBlock = aBlock;
+ mEntries.GetEntry(entry->mPrevBlock)->mNextBlock = aBlock;
+ ++mCount;
+}
+
+void MediaCacheStream::BlockList::RemoveBlock(int32_t aBlock)
+{
+ Entry* entry = mEntries.GetEntry(aBlock);
+ NS_ASSERTION(entry, "Block not in list");
+
+ if (entry->mNextBlock == aBlock) {
+ NS_ASSERTION(entry->mPrevBlock == aBlock, "Linked list inconsistency");
+ NS_ASSERTION(mFirstBlock == aBlock, "Linked list inconsistency");
+ mFirstBlock = -1;
+ } else {
+ if (mFirstBlock == aBlock) {
+ mFirstBlock = entry->mNextBlock;
+ }
+ mEntries.GetEntry(entry->mNextBlock)->mPrevBlock = entry->mPrevBlock;
+ mEntries.GetEntry(entry->mPrevBlock)->mNextBlock = entry->mNextBlock;
+ }
+ mEntries.RemoveEntry(entry);
+ --mCount;
+}
+
+int32_t MediaCacheStream::BlockList::GetLastBlock() const
+{
+ if (mFirstBlock < 0)
+ return -1;
+ return mEntries.GetEntry(mFirstBlock)->mPrevBlock;
+}
+
+int32_t MediaCacheStream::BlockList::GetNextBlock(int32_t aBlock) const
+{
+ int32_t block = mEntries.GetEntry(aBlock)->mNextBlock;
+ if (block == mFirstBlock)
+ return -1;
+ return block;
+}
+
+int32_t MediaCacheStream::BlockList::GetPrevBlock(int32_t aBlock) const
+{
+ if (aBlock == mFirstBlock)
+ return -1;
+ return mEntries.GetEntry(aBlock)->mPrevBlock;
+}
+
+#ifdef DEBUG
+void MediaCacheStream::BlockList::Verify()
+{
+ int32_t count = 0;
+ if (mFirstBlock >= 0) {
+ int32_t block = mFirstBlock;
+ do {
+ Entry* entry = mEntries.GetEntry(block);
+ NS_ASSERTION(mEntries.GetEntry(entry->mNextBlock)->mPrevBlock == block,
+ "Bad prev link");
+ NS_ASSERTION(mEntries.GetEntry(entry->mPrevBlock)->mNextBlock == block,
+ "Bad next link");
+ block = entry->mNextBlock;
+ ++count;
+ } while (block != mFirstBlock);
+ }
+ NS_ASSERTION(count == mCount, "Bad count");
+}
+#endif
+
+static void UpdateSwappedBlockIndex(int32_t* aBlockIndex,
+ int32_t aBlock1Index, int32_t aBlock2Index)
+{
+ int32_t index = *aBlockIndex;
+ if (index == aBlock1Index) {
+ *aBlockIndex = aBlock2Index;
+ } else if (index == aBlock2Index) {
+ *aBlockIndex = aBlock1Index;
+ }
+}
+
+void
+MediaCacheStream::BlockList::NotifyBlockSwapped(int32_t aBlockIndex1,
+ int32_t aBlockIndex2)
+{
+ Entry* e1 = mEntries.GetEntry(aBlockIndex1);
+ Entry* e2 = mEntries.GetEntry(aBlockIndex2);
+ int32_t e1Prev = -1, e1Next = -1, e2Prev = -1, e2Next = -1;
+
+ // Fix mFirstBlock
+ UpdateSwappedBlockIndex(&mFirstBlock, aBlockIndex1, aBlockIndex2);
+
+ // Fix mNextBlock/mPrevBlock links. First capture previous/next links
+ // so we don't get confused due to aliasing.
+ if (e1) {
+ e1Prev = e1->mPrevBlock;
+ e1Next = e1->mNextBlock;
+ }
+ if (e2) {
+ e2Prev = e2->mPrevBlock;
+ e2Next = e2->mNextBlock;
+ }
+ // Update the entries.
+ if (e1) {
+ mEntries.GetEntry(e1Prev)->mNextBlock = aBlockIndex2;
+ mEntries.GetEntry(e1Next)->mPrevBlock = aBlockIndex2;
+ }
+ if (e2) {
+ mEntries.GetEntry(e2Prev)->mNextBlock = aBlockIndex1;
+ mEntries.GetEntry(e2Next)->mPrevBlock = aBlockIndex1;
+ }
+
+ // Fix hashtable keys. First remove stale entries.
+ if (e1) {
+ e1Prev = e1->mPrevBlock;
+ e1Next = e1->mNextBlock;
+ mEntries.RemoveEntry(aBlockIndex1);
+ // Refresh pointer after hashtable mutation.
+ e2 = mEntries.GetEntry(aBlockIndex2);
+ }
+ if (e2) {
+ e2Prev = e2->mPrevBlock;
+ e2Next = e2->mNextBlock;
+ mEntries.RemoveEntry(aBlockIndex2);
+ }
+ // Put new entries back.
+ if (e1) {
+ e1 = mEntries.PutEntry(aBlockIndex2);
+ e1->mNextBlock = e1Next;
+ e1->mPrevBlock = e1Prev;
+ }
+ if (e2) {
+ e2 = mEntries.PutEntry(aBlockIndex1);
+ e2->mNextBlock = e2Next;
+ e2->mPrevBlock = e2Prev;
+ }
+}
+
+nsresult
+MediaCache::Init()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ NS_ASSERTION(!mFileCache, "Cache file already open?");
+
+ PRFileDesc* fileDesc = nullptr;
+ nsresult rv = NS_OpenAnonymousTemporaryFile(&fileDesc);
+ NS_ENSURE_SUCCESS(rv,rv);
+
+ mFileCache = new FileBlockCache();
+ rv = mFileCache->Open(fileDesc);
+ NS_ENSURE_SUCCESS(rv,rv);
+
+ MediaCacheFlusher::Init();
+
+ return NS_OK;
+}
+
+void
+MediaCache::Flush()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ if (!gMediaCache)
+ return;
+
+ gMediaCache->FlushInternal();
+}
+
+void
+MediaCache::FlushInternal()
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ for (uint32_t blockIndex = 0; blockIndex < mIndex.Length(); ++blockIndex) {
+ FreeBlock(blockIndex);
+ }
+
+ // Truncate file, close it, and reopen
+ Truncate();
+ NS_ASSERTION(mIndex.Length() == 0, "Blocks leaked?");
+ if (mFileCache) {
+ mFileCache->Close();
+ mFileCache = nullptr;
+ }
+ Init();
+}
+
+void
+MediaCache::MaybeShutdown()
+{
+ NS_ASSERTION(NS_IsMainThread(),
+ "MediaCache::MaybeShutdown called on non-main thread");
+ if (!gMediaCache->mStreams.IsEmpty()) {
+ // Don't shut down yet, streams are still alive
+ return;
+ }
+
+ // Since we're on the main thread, no-one is going to add a new stream
+ // while we shut down.
+ // This function is static so we don't have to delete 'this'.
+ delete gMediaCache;
+ gMediaCache = nullptr;
+ NS_IF_RELEASE(gMediaCacheFlusher);
+}
+
+static void
+InitMediaCache()
+{
+ if (gMediaCache)
+ return;
+
+ gMediaCache = new MediaCache();
+ nsresult rv = gMediaCache->Init();
+ if (NS_FAILED(rv)) {
+ delete gMediaCache;
+ gMediaCache = nullptr;
+ }
+}
+
+nsresult
+MediaCache::ReadCacheFile(int64_t aOffset, void* aData, int32_t aLength,
+ int32_t* aBytes)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ if (!mFileCache)
+ return NS_ERROR_FAILURE;
+
+ return mFileCache->Read(aOffset, reinterpret_cast<uint8_t*>(aData), aLength, aBytes);
+}
+
+nsresult
+MediaCache::ReadCacheFileAllBytes(int64_t aOffset, void* aData, int32_t aLength)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ int64_t offset = aOffset;
+ int32_t count = aLength;
+ // Cast to char* so we can do byte-wise pointer arithmetic
+ char* data = static_cast<char*>(aData);
+ while (count > 0) {
+ int32_t bytes;
+ nsresult rv = ReadCacheFile(offset, data, count, &bytes);
+ if (NS_FAILED(rv))
+ return rv;
+ if (bytes == 0)
+ return NS_ERROR_FAILURE;
+ count -= bytes;
+ data += bytes;
+ offset += bytes;
+ }
+ return NS_OK;
+}
+
+static int32_t GetMaxBlocks()
+{
+ // We look up the cache size every time. This means dynamic changes
+ // to the pref are applied.
+ // Cache size is in KB
+ int32_t cacheSize = Preferences::GetInt("media.cache_size", 500*1024);
+ int64_t maxBlocks = static_cast<int64_t>(cacheSize)*1024/MediaCache::BLOCK_SIZE;
+ maxBlocks = std::max<int64_t>(maxBlocks, 1);
+ return int32_t(std::min<int64_t>(maxBlocks, INT32_MAX));
+}
+
+int32_t
+MediaCache::FindBlockForIncomingData(TimeStamp aNow,
+ MediaCacheStream* aStream)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ int32_t blockIndex = FindReusableBlock(aNow, aStream,
+ aStream->mChannelOffset/BLOCK_SIZE, INT32_MAX);
+
+ if (blockIndex < 0 || !IsBlockFree(blockIndex)) {
+ // The block returned is already allocated.
+ // Don't reuse it if a) there's room to expand the cache or
+ // b) the data we're going to store in the free block is not higher
+ // priority than the data already stored in the free block.
+ // The latter can lead us to go over the cache limit a bit.
+ if ((mIndex.Length() < uint32_t(GetMaxBlocks()) || blockIndex < 0 ||
+ PredictNextUseForIncomingData(aStream) >= PredictNextUse(aNow, blockIndex))) {
+ blockIndex = mIndex.Length();
+ if (!mIndex.AppendElement())
+ return -1;
+ mFreeBlocks.AddFirstBlock(blockIndex);
+ return blockIndex;
+ }
+ }
+
+ return blockIndex;
+}
+
+bool
+MediaCache::BlockIsReusable(int32_t aBlockIndex)
+{
+ Block* block = &mIndex[aBlockIndex];
+ for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
+ MediaCacheStream* stream = block->mOwners[i].mStream;
+ if (stream->mPinCount > 0 ||
+ stream->mStreamOffset/BLOCK_SIZE == block->mOwners[i].mStreamBlock) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void
+MediaCache::AppendMostReusableBlock(BlockList* aBlockList,
+ nsTArray<uint32_t>* aResult,
+ int32_t aBlockIndexLimit)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ int32_t blockIndex = aBlockList->GetLastBlock();
+ if (blockIndex < 0)
+ return;
+ do {
+ // Don't consider blocks for pinned streams, or blocks that are
+ // beyond the specified limit, or a block that contains a stream's
+ // current read position (such a block contains both played data
+ // and readahead data)
+ if (blockIndex < aBlockIndexLimit && BlockIsReusable(blockIndex)) {
+ aResult->AppendElement(blockIndex);
+ return;
+ }
+ blockIndex = aBlockList->GetPrevBlock(blockIndex);
+ } while (blockIndex >= 0);
+}
+
+int32_t
+MediaCache::FindReusableBlock(TimeStamp aNow,
+ MediaCacheStream* aForStream,
+ int32_t aForStreamBlock,
+ int32_t aMaxSearchBlockIndex)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ uint32_t length = std::min(uint32_t(aMaxSearchBlockIndex), uint32_t(mIndex.Length()));
+
+ if (aForStream && aForStreamBlock > 0 &&
+ uint32_t(aForStreamBlock) <= aForStream->mBlocks.Length()) {
+ int32_t prevCacheBlock = aForStream->mBlocks[aForStreamBlock - 1];
+ if (prevCacheBlock >= 0) {
+ uint32_t freeBlockScanEnd =
+ std::min(length, prevCacheBlock + FREE_BLOCK_SCAN_LIMIT);
+ for (uint32_t i = prevCacheBlock; i < freeBlockScanEnd; ++i) {
+ if (IsBlockFree(i))
+ return i;
+ }
+ }
+ }
+
+ if (!mFreeBlocks.IsEmpty()) {
+ int32_t blockIndex = mFreeBlocks.GetFirstBlock();
+ do {
+ if (blockIndex < aMaxSearchBlockIndex)
+ return blockIndex;
+ blockIndex = mFreeBlocks.GetNextBlock(blockIndex);
+ } while (blockIndex >= 0);
+ }
+
+ // Build a list of the blocks we should consider for the "latest
+ // predicted time of next use". We can exploit the fact that the block
+ // linked lists are ordered by increasing time of next use. This is
+ // actually the whole point of having the linked lists.
+ AutoTArray<uint32_t,8> candidates;
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaCacheStream* stream = mStreams[i];
+ if (stream->mPinCount > 0) {
+ // No point in even looking at this stream's blocks
+ continue;
+ }
+
+ AppendMostReusableBlock(&stream->mMetadataBlocks, &candidates, length);
+ AppendMostReusableBlock(&stream->mPlayedBlocks, &candidates, length);
+
+ // Don't consider readahead blocks in non-seekable streams. If we
+ // remove the block we won't be able to seek back to read it later.
+ if (stream->mIsTransportSeekable) {
+ AppendMostReusableBlock(&stream->mReadaheadBlocks, &candidates, length);
+ }
+ }
+
+ TimeDuration latestUse;
+ int32_t latestUseBlock = -1;
+ for (uint32_t i = 0; i < candidates.Length(); ++i) {
+ TimeDuration nextUse = PredictNextUse(aNow, candidates[i]);
+ if (nextUse > latestUse) {
+ latestUse = nextUse;
+ latestUseBlock = candidates[i];
+ }
+ }
+
+ return latestUseBlock;
+}
+
+MediaCache::BlockList*
+MediaCache::GetListForBlock(BlockOwner* aBlock)
+{
+ switch (aBlock->mClass) {
+ case METADATA_BLOCK:
+ NS_ASSERTION(aBlock->mStream, "Metadata block has no stream?");
+ return &aBlock->mStream->mMetadataBlocks;
+ case PLAYED_BLOCK:
+ NS_ASSERTION(aBlock->mStream, "Metadata block has no stream?");
+ return &aBlock->mStream->mPlayedBlocks;
+ case READAHEAD_BLOCK:
+ NS_ASSERTION(aBlock->mStream, "Readahead block has no stream?");
+ return &aBlock->mStream->mReadaheadBlocks;
+ default:
+ NS_ERROR("Invalid block class");
+ return nullptr;
+ }
+}
+
+MediaCache::BlockOwner*
+MediaCache::GetBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream)
+{
+ Block* block = &mIndex[aBlockIndex];
+ for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
+ if (block->mOwners[i].mStream == aStream)
+ return &block->mOwners[i];
+ }
+ return nullptr;
+}
+
+void
+MediaCache::SwapBlocks(int32_t aBlockIndex1, int32_t aBlockIndex2)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ Block* block1 = &mIndex[aBlockIndex1];
+ Block* block2 = &mIndex[aBlockIndex2];
+
+ block1->mOwners.SwapElements(block2->mOwners);
+
+ // Now all references to block1 have to be replaced with block2 and
+ // vice versa.
+ // First update stream references to blocks via mBlocks.
+ const Block* blocks[] = { block1, block2 };
+ int32_t blockIndices[] = { aBlockIndex1, aBlockIndex2 };
+ for (int32_t i = 0; i < 2; ++i) {
+ for (uint32_t j = 0; j < blocks[i]->mOwners.Length(); ++j) {
+ const BlockOwner* b = &blocks[i]->mOwners[j];
+ b->mStream->mBlocks[b->mStreamBlock] = blockIndices[i];
+ }
+ }
+
+ // Now update references to blocks in block lists.
+ mFreeBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
+
+ nsTHashtable<nsPtrHashKey<MediaCacheStream> > visitedStreams;
+
+ for (int32_t i = 0; i < 2; ++i) {
+ for (uint32_t j = 0; j < blocks[i]->mOwners.Length(); ++j) {
+ MediaCacheStream* stream = blocks[i]->mOwners[j].mStream;
+ // Make sure that we don't update the same stream twice --- that
+ // would result in swapping the block references back again!
+ if (visitedStreams.GetEntry(stream))
+ continue;
+ visitedStreams.PutEntry(stream);
+ stream->mReadaheadBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
+ stream->mPlayedBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
+ stream->mMetadataBlocks.NotifyBlockSwapped(aBlockIndex1, aBlockIndex2);
+ }
+ }
+
+ Verify();
+}
+
+void
+MediaCache::RemoveBlockOwner(int32_t aBlockIndex, MediaCacheStream* aStream)
+{
+ Block* block = &mIndex[aBlockIndex];
+ for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
+ BlockOwner* bo = &block->mOwners[i];
+ if (bo->mStream == aStream) {
+ GetListForBlock(bo)->RemoveBlock(aBlockIndex);
+ bo->mStream->mBlocks[bo->mStreamBlock] = -1;
+ block->mOwners.RemoveElementAt(i);
+ if (block->mOwners.IsEmpty()) {
+ mFreeBlocks.AddFirstBlock(aBlockIndex);
+ }
+ return;
+ }
+ }
+}
+
+void
+MediaCache::AddBlockOwnerAsReadahead(int32_t aBlockIndex,
+ MediaCacheStream* aStream,
+ int32_t aStreamBlockIndex)
+{
+ Block* block = &mIndex[aBlockIndex];
+ if (block->mOwners.IsEmpty()) {
+ mFreeBlocks.RemoveBlock(aBlockIndex);
+ }
+ BlockOwner* bo = block->mOwners.AppendElement();
+ bo->mStream = aStream;
+ bo->mStreamBlock = aStreamBlockIndex;
+ aStream->mBlocks[aStreamBlockIndex] = aBlockIndex;
+ bo->mClass = READAHEAD_BLOCK;
+ InsertReadaheadBlock(bo, aBlockIndex);
+}
+
+void
+MediaCache::FreeBlock(int32_t aBlock)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ Block* block = &mIndex[aBlock];
+ if (block->mOwners.IsEmpty()) {
+ // already free
+ return;
+ }
+
+ CACHE_LOG(LogLevel::Debug, ("Released block %d", aBlock));
+
+ for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
+ BlockOwner* bo = &block->mOwners[i];
+ GetListForBlock(bo)->RemoveBlock(aBlock);
+ bo->mStream->mBlocks[bo->mStreamBlock] = -1;
+ }
+ block->mOwners.Clear();
+ mFreeBlocks.AddFirstBlock(aBlock);
+ Verify();
+}
+
+TimeDuration
+MediaCache::PredictNextUse(TimeStamp aNow, int32_t aBlock)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+ NS_ASSERTION(!IsBlockFree(aBlock), "aBlock is free");
+
+ Block* block = &mIndex[aBlock];
+ // Blocks can be belong to multiple streams. The predicted next use
+ // time is the earliest time predicted by any of the streams.
+ TimeDuration result;
+ for (uint32_t i = 0; i < block->mOwners.Length(); ++i) {
+ BlockOwner* bo = &block->mOwners[i];
+ TimeDuration prediction;
+ switch (bo->mClass) {
+ case METADATA_BLOCK:
+ // This block should be managed in LRU mode. For metadata we predict
+ // that the time until the next use is the time since the last use.
+ prediction = aNow - bo->mLastUseTime;
+ break;
+ case PLAYED_BLOCK: {
+ // This block should be managed in LRU mode, and we should impose
+ // a "replay delay" to reflect the likelihood of replay happening
+ NS_ASSERTION(static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE <
+ bo->mStream->mStreamOffset,
+ "Played block after the current stream position?");
+ int64_t bytesBehind =
+ bo->mStream->mStreamOffset - static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE;
+ int64_t millisecondsBehind =
+ bytesBehind*1000/bo->mStream->mPlaybackBytesPerSecond;
+ prediction = TimeDuration::FromMilliseconds(
+ std::min<int64_t>(millisecondsBehind*REPLAY_PENALTY_FACTOR, INT32_MAX));
+ break;
+ }
+ case READAHEAD_BLOCK: {
+ int64_t bytesAhead =
+ static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE - bo->mStream->mStreamOffset;
+ NS_ASSERTION(bytesAhead >= 0,
+ "Readahead block before the current stream position?");
+ int64_t millisecondsAhead =
+ bytesAhead*1000/bo->mStream->mPlaybackBytesPerSecond;
+ prediction = TimeDuration::FromMilliseconds(
+ std::min<int64_t>(millisecondsAhead, INT32_MAX));
+ break;
+ }
+ default:
+ NS_ERROR("Invalid class for predicting next use");
+ return TimeDuration(0);
+ }
+ if (i == 0 || prediction < result) {
+ result = prediction;
+ }
+ }
+ return result;
+}
+
+TimeDuration
+MediaCache::PredictNextUseForIncomingData(MediaCacheStream* aStream)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ int64_t bytesAhead = aStream->mChannelOffset - aStream->mStreamOffset;
+ if (bytesAhead <= -BLOCK_SIZE) {
+ // Hmm, no idea when data behind us will be used. Guess 24 hours.
+ return TimeDuration::FromSeconds(24*60*60);
+ }
+ if (bytesAhead <= 0)
+ return TimeDuration(0);
+ int64_t millisecondsAhead = bytesAhead*1000/aStream->mPlaybackBytesPerSecond;
+ return TimeDuration::FromMilliseconds(
+ std::min<int64_t>(millisecondsAhead, INT32_MAX));
+}
+
+enum StreamAction { NONE, SEEK, SEEK_AND_RESUME, RESUME, SUSPEND };
+
+void
+MediaCache::Update()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ // The action to use for each stream. We store these so we can make
+ // decisions while holding the cache lock but implement those decisions
+ // without holding the cache lock, since we need to call out to
+ // stream, decoder and element code.
+ AutoTArray<StreamAction,10> actions;
+
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mUpdateQueued = false;
+#ifdef DEBUG
+ mInUpdate = true;
+#endif
+
+ int32_t maxBlocks = GetMaxBlocks();
+ TimeStamp now = TimeStamp::Now();
+
+ int32_t freeBlockCount = mFreeBlocks.GetCount();
+ TimeDuration latestPredictedUseForOverflow = 0;
+ if (mIndex.Length() > uint32_t(maxBlocks)) {
+ // Try to trim back the cache to its desired maximum size. The cache may
+ // have overflowed simply due to data being received when we have
+ // no blocks in the main part of the cache that are free or lower
+ // priority than the new data. The cache can also be overflowing because
+ // the media.cache_size preference was reduced.
+ // First, figure out what the least valuable block in the cache overflow
+ // is. We don't want to replace any blocks in the main part of the
+ // cache whose expected time of next use is earlier or equal to that.
+ // If we allow that, we can effectively end up discarding overflowing
+ // blocks (by moving an overflowing block to the main part of the cache,
+ // and then overwriting it with another overflowing block), and we try
+ // to avoid that since it requires HTTP seeks.
+ // We also use this loop to eliminate overflowing blocks from
+ // freeBlockCount.
+ for (int32_t blockIndex = mIndex.Length() - 1; blockIndex >= maxBlocks;
+ --blockIndex) {
+ if (IsBlockFree(blockIndex)) {
+ // Don't count overflowing free blocks in our free block count
+ --freeBlockCount;
+ continue;
+ }
+ TimeDuration predictedUse = PredictNextUse(now, blockIndex);
+ latestPredictedUseForOverflow = std::max(latestPredictedUseForOverflow, predictedUse);
+ }
+ } else {
+ freeBlockCount += maxBlocks - mIndex.Length();
+ }
+
+ // Now try to move overflowing blocks to the main part of the cache.
+ for (int32_t blockIndex = mIndex.Length() - 1; blockIndex >= maxBlocks;
+ --blockIndex) {
+ if (IsBlockFree(blockIndex))
+ continue;
+
+ Block* block = &mIndex[blockIndex];
+ // Try to relocate the block close to other blocks for the first stream.
+ // There is no point in trying to make it close to other blocks in
+ // *all* the streams it might belong to.
+ int32_t destinationBlockIndex =
+ FindReusableBlock(now, block->mOwners[0].mStream,
+ block->mOwners[0].mStreamBlock, maxBlocks);
+ if (destinationBlockIndex < 0) {
+ // Nowhere to place this overflow block. We won't be able to
+ // place any more overflow blocks.
+ break;
+ }
+
+ if (IsBlockFree(destinationBlockIndex) ||
+ PredictNextUse(now, destinationBlockIndex) > latestPredictedUseForOverflow) {
+ // Reuse blocks in the main part of the cache that are less useful than
+ // the least useful overflow blocks
+
+ nsresult rv = mFileCache->MoveBlock(blockIndex, destinationBlockIndex);
+
+ if (NS_SUCCEEDED(rv)) {
+ // We successfully copied the file data.
+ CACHE_LOG(LogLevel::Debug, ("Swapping blocks %d and %d (trimming cache)",
+ blockIndex, destinationBlockIndex));
+ // Swapping the block metadata here lets us maintain the
+ // correct positions in the linked lists
+ SwapBlocks(blockIndex, destinationBlockIndex);
+ //Free the overflowing block even if the copy failed.
+ CACHE_LOG(LogLevel::Debug, ("Released block %d (trimming cache)", blockIndex));
+ FreeBlock(blockIndex);
+ }
+ } else {
+ CACHE_LOG(LogLevel::Debug, ("Could not trim cache block %d (destination %d, predicted next use %f, latest predicted use for overflow %f",
+ blockIndex, destinationBlockIndex,
+ PredictNextUse(now, destinationBlockIndex).ToSeconds(),
+ latestPredictedUseForOverflow.ToSeconds()));
+ }
+ }
+ // Try chopping back the array of cache entries and the cache file.
+ Truncate();
+
+ // Count the blocks allocated for readahead of non-seekable streams
+ // (these blocks can't be freed but we don't want them to monopolize the
+ // cache)
+ int32_t nonSeekableReadaheadBlockCount = 0;
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaCacheStream* stream = mStreams[i];
+ if (!stream->mIsTransportSeekable) {
+ nonSeekableReadaheadBlockCount += stream->mReadaheadBlocks.GetCount();
+ }
+ }
+
+ // If freeBlockCount is zero, then compute the latest of
+ // the predicted next-uses for all blocks
+ TimeDuration latestNextUse;
+ if (freeBlockCount == 0) {
+ int32_t reusableBlock = FindReusableBlock(now, nullptr, 0, maxBlocks);
+ if (reusableBlock >= 0) {
+ latestNextUse = PredictNextUse(now, reusableBlock);
+ }
+ }
+
+ int32_t resumeThreshold = Preferences::GetInt("media.cache_resume_threshold", 10);
+ int32_t readaheadLimit = Preferences::GetInt("media.cache_readahead_limit", 30);
+
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ actions.AppendElement(NONE);
+
+ MediaCacheStream* stream = mStreams[i];
+ if (stream->mClosed) {
+ CACHE_LOG(LogLevel::Debug, ("Stream %p closed", stream));
+ continue;
+ }
+
+ // Figure out where we should be reading from. It's the first
+ // uncached byte after the current mStreamOffset.
+ int64_t dataOffset = stream->GetCachedDataEndInternal(stream->mStreamOffset);
+ MOZ_ASSERT(dataOffset >= 0);
+
+ // Compute where we'd actually seek to to read at readOffset
+ int64_t desiredOffset = dataOffset;
+ if (stream->mIsTransportSeekable) {
+ if (desiredOffset > stream->mChannelOffset &&
+ desiredOffset <= stream->mChannelOffset + SEEK_VS_READ_THRESHOLD) {
+ // Assume it's more efficient to just keep reading up to the
+ // desired position instead of trying to seek
+ desiredOffset = stream->mChannelOffset;
+ }
+ } else {
+ // We can't seek directly to the desired offset...
+ if (stream->mChannelOffset > desiredOffset) {
+ // Reading forward won't get us anywhere, we need to go backwards.
+ // Seek back to 0 (the client will reopen the stream) and then
+ // read forward.
+ NS_WARNING("Can't seek backwards, so seeking to 0");
+ desiredOffset = 0;
+ // Flush cached blocks out, since if this is a live stream
+ // the cached data may be completely different next time we
+ // read it. We have to assume that live streams don't
+ // advertise themselves as being seekable...
+ ReleaseStreamBlocks(stream);
+ } else {
+ // otherwise reading forward is looking good, so just stay where we
+ // are and don't trigger a channel seek!
+ desiredOffset = stream->mChannelOffset;
+ }
+ }
+
+ // Figure out if we should be reading data now or not. It's amazing
+ // how complex this is, but each decision is simple enough.
+ bool enableReading;
+ if (stream->mStreamLength >= 0 && dataOffset >= stream->mStreamLength) {
+ // We want data at the end of the stream, where there's nothing to
+ // read. We don't want to try to read if we're suspended, because that
+ // might create a new channel and seek unnecessarily (and incorrectly,
+ // since HTTP doesn't allow seeking to the actual EOF), and we don't want
+ // to suspend if we're not suspended and already reading at the end of
+ // the stream, since there just might be more data than the server
+ // advertised with Content-Length, and we may as well keep reading.
+ // But we don't want to seek to the end of the stream if we're not
+ // already there.
+ CACHE_LOG(LogLevel::Debug, ("Stream %p at end of stream", stream));
+ enableReading = !stream->mCacheSuspended &&
+ stream->mStreamLength == stream->mChannelOffset;
+ } else if (desiredOffset < stream->mStreamOffset) {
+ // We're reading to try to catch up to where the current stream
+ // reader wants to be. Better not stop.
+ CACHE_LOG(LogLevel::Debug, ("Stream %p catching up", stream));
+ enableReading = true;
+ } else if (desiredOffset < stream->mStreamOffset + BLOCK_SIZE) {
+ // The stream reader is waiting for us, or nearly so. Better feed it.
+ CACHE_LOG(LogLevel::Debug, ("Stream %p feeding reader", stream));
+ enableReading = true;
+ } else if (!stream->mIsTransportSeekable &&
+ nonSeekableReadaheadBlockCount >= maxBlocks*NONSEEKABLE_READAHEAD_MAX) {
+ // This stream is not seekable and there are already too many blocks
+ // being cached for readahead for nonseekable streams (which we can't
+ // free). So stop reading ahead now.
+ CACHE_LOG(LogLevel::Debug, ("Stream %p throttling non-seekable readahead", stream));
+ enableReading = false;
+ } else if (mIndex.Length() > uint32_t(maxBlocks)) {
+ // We're in the process of bringing the cache size back to the
+ // desired limit, so don't bring in more data yet
+ CACHE_LOG(LogLevel::Debug, ("Stream %p throttling to reduce cache size", stream));
+ enableReading = false;
+ } else {
+ TimeDuration predictedNewDataUse = PredictNextUseForIncomingData(stream);
+
+ if (stream->mCacheSuspended &&
+ predictedNewDataUse.ToSeconds() > resumeThreshold) {
+ // Don't need data for a while, so don't bother waking up the stream
+ CACHE_LOG(LogLevel::Debug, ("Stream %p avoiding wakeup since more data is not needed", stream));
+ enableReading = false;
+ } else if (predictedNewDataUse.ToSeconds() > readaheadLimit) {
+ // Don't read ahead more than this much
+ CACHE_LOG(LogLevel::Debug, ("Stream %p throttling to avoid reading ahead too far", stream));
+ enableReading = false;
+ } else if (freeBlockCount > 0) {
+ // Free blocks in the cache, so keep reading
+ CACHE_LOG(LogLevel::Debug, ("Stream %p reading since there are free blocks", stream));
+ enableReading = true;
+ } else if (latestNextUse <= TimeDuration(0)) {
+ // No reusable blocks, so can't read anything
+ CACHE_LOG(LogLevel::Debug, ("Stream %p throttling due to no reusable blocks", stream));
+ enableReading = false;
+ } else {
+ // Read ahead if the data we expect to read is more valuable than
+ // the least valuable block in the main part of the cache
+ CACHE_LOG(LogLevel::Debug, ("Stream %p predict next data in %f, current worst block is %f",
+ stream, predictedNewDataUse.ToSeconds(), latestNextUse.ToSeconds()));
+ enableReading = predictedNewDataUse < latestNextUse;
+ }
+ }
+
+ if (enableReading) {
+ for (uint32_t j = 0; j < i; ++j) {
+ MediaCacheStream* other = mStreams[j];
+ if (other->mResourceID == stream->mResourceID &&
+ !other->mClosed && !other->mClient->IsSuspended() &&
+ other->mChannelOffset/BLOCK_SIZE == desiredOffset/BLOCK_SIZE) {
+ // This block is already going to be read by the other stream.
+ // So don't try to read it from this stream as well.
+ enableReading = false;
+ CACHE_LOG(LogLevel::Debug, ("Stream %p waiting on same block (%lld) from stream %p",
+ stream, desiredOffset/BLOCK_SIZE, other));
+ break;
+ }
+ }
+ }
+
+ if (stream->mChannelOffset != desiredOffset && enableReading) {
+ // We need to seek now.
+ NS_ASSERTION(stream->mIsTransportSeekable || desiredOffset == 0,
+ "Trying to seek in a non-seekable stream!");
+ // Round seek offset down to the start of the block. This is essential
+ // because we don't want to think we have part of a block already
+ // in mPartialBlockBuffer.
+ stream->mChannelOffset = (desiredOffset/BLOCK_SIZE)*BLOCK_SIZE;
+ actions[i] = stream->mCacheSuspended ? SEEK_AND_RESUME : SEEK;
+ } else if (enableReading && stream->mCacheSuspended) {
+ actions[i] = RESUME;
+ } else if (!enableReading && !stream->mCacheSuspended) {
+ actions[i] = SUSPEND;
+ }
+ }
+#ifdef DEBUG
+ mInUpdate = false;
+#endif
+ }
+
+ // Update the channel state without holding our cache lock. While we're
+ // doing this, decoder threads may be running and seeking, reading or changing
+ // other cache state. That's OK, they'll trigger new Update events and we'll
+ // get back here and revise our decisions. The important thing here is that
+ // performing these actions only depends on mChannelOffset and
+ // the action, which can only be written by the main thread (i.e., this
+ // thread), so we don't have races here.
+
+ // First, update the mCacheSuspended/mCacheEnded flags so that they're all correct
+ // when we fire our CacheClient commands below. Those commands can rely on these flags
+ // being set correctly for all streams.
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaCacheStream* stream = mStreams[i];
+ switch (actions[i]) {
+ case SEEK:
+ case SEEK_AND_RESUME:
+ stream->mCacheSuspended = false;
+ stream->mChannelEnded = false;
+ break;
+ case RESUME:
+ stream->mCacheSuspended = false;
+ break;
+ case SUSPEND:
+ stream->mCacheSuspended = true;
+ break;
+ default:
+ break;
+ }
+ stream->mHasHadUpdate = true;
+ }
+
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaCacheStream* stream = mStreams[i];
+ nsresult rv;
+ switch (actions[i]) {
+ case SEEK:
+ case SEEK_AND_RESUME:
+ CACHE_LOG(LogLevel::Debug, ("Stream %p CacheSeek to %lld (resume=%d)", stream,
+ (long long)stream->mChannelOffset, actions[i] == SEEK_AND_RESUME));
+ rv = stream->mClient->CacheClientSeek(stream->mChannelOffset,
+ actions[i] == SEEK_AND_RESUME);
+ break;
+ case RESUME:
+ CACHE_LOG(LogLevel::Debug, ("Stream %p Resumed", stream));
+ rv = stream->mClient->CacheClientResume();
+ QueueSuspendedStatusUpdate(stream->mResourceID);
+ break;
+ case SUSPEND:
+ CACHE_LOG(LogLevel::Debug, ("Stream %p Suspended", stream));
+ rv = stream->mClient->CacheClientSuspend();
+ QueueSuspendedStatusUpdate(stream->mResourceID);
+ break;
+ default:
+ rv = NS_OK;
+ break;
+ }
+
+ if (NS_FAILED(rv)) {
+ // Close the streams that failed due to error. This will cause all
+ // client Read and Seek operations on those streams to fail. Blocked
+ // Reads will also be woken up.
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ stream->CloseInternal(mon);
+ }
+ }
+
+ // Notify streams about the suspended status changes.
+ for (uint32_t i = 0; i < mSuspendedStatusToNotify.Length(); ++i) {
+ MediaCache::ResourceStreamIterator iter(mSuspendedStatusToNotify[i]);
+ while (MediaCacheStream* stream = iter.Next()) {
+ stream->mClient->CacheClientNotifySuspendedStatusChanged();
+ }
+ }
+ mSuspendedStatusToNotify.Clear();
+}
+
+class UpdateEvent : public Runnable
+{
+public:
+ NS_IMETHOD Run() override
+ {
+ if (gMediaCache) {
+ gMediaCache->Update();
+ }
+ return NS_OK;
+ }
+};
+
+void
+MediaCache::QueueUpdate()
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ // Queuing an update while we're in an update raises a high risk of
+ // triggering endless events
+ NS_ASSERTION(!mInUpdate,
+ "Queuing an update while we're in an update");
+ if (mUpdateQueued)
+ return;
+ mUpdateQueued = true;
+ // XXX MediaCache does updates when decoders are still running at
+ // shutdown and get freed in the final cycle-collector cleanup. So
+ // don't leak a runnable in that case.
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ if (mainThread) {
+ nsCOMPtr<nsIRunnable> event = new UpdateEvent();
+ mainThread->Dispatch(event.forget(), NS_DISPATCH_NORMAL);
+ }
+}
+
+void
+MediaCache::QueueSuspendedStatusUpdate(int64_t aResourceID)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ if (!mSuspendedStatusToNotify.Contains(aResourceID)) {
+ mSuspendedStatusToNotify.AppendElement(aResourceID);
+ }
+}
+
+#ifdef DEBUG_VERIFY_CACHE
+void
+MediaCache::Verify()
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ mFreeBlocks.Verify();
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaCacheStream* stream = mStreams[i];
+ stream->mReadaheadBlocks.Verify();
+ stream->mPlayedBlocks.Verify();
+ stream->mMetadataBlocks.Verify();
+
+ // Verify that the readahead blocks are listed in stream block order
+ int32_t block = stream->mReadaheadBlocks.GetFirstBlock();
+ int32_t lastStreamBlock = -1;
+ while (block >= 0) {
+ uint32_t j = 0;
+ while (mIndex[block].mOwners[j].mStream != stream) {
+ ++j;
+ }
+ int32_t nextStreamBlock =
+ int32_t(mIndex[block].mOwners[j].mStreamBlock);
+ NS_ASSERTION(lastStreamBlock < nextStreamBlock,
+ "Blocks not increasing in readahead stream");
+ lastStreamBlock = nextStreamBlock;
+ block = stream->mReadaheadBlocks.GetNextBlock(block);
+ }
+ }
+}
+#endif
+
+void
+MediaCache::InsertReadaheadBlock(BlockOwner* aBlockOwner,
+ int32_t aBlockIndex)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ // Find the last block whose stream block is before aBlockIndex's
+ // stream block, and insert after it
+ MediaCacheStream* stream = aBlockOwner->mStream;
+ int32_t readaheadIndex = stream->mReadaheadBlocks.GetLastBlock();
+ while (readaheadIndex >= 0) {
+ BlockOwner* bo = GetBlockOwner(readaheadIndex, stream);
+ NS_ASSERTION(bo, "stream must own its blocks");
+ if (bo->mStreamBlock < aBlockOwner->mStreamBlock) {
+ stream->mReadaheadBlocks.AddAfter(aBlockIndex, readaheadIndex);
+ return;
+ }
+ NS_ASSERTION(bo->mStreamBlock > aBlockOwner->mStreamBlock,
+ "Duplicated blocks??");
+ readaheadIndex = stream->mReadaheadBlocks.GetPrevBlock(readaheadIndex);
+ }
+
+ stream->mReadaheadBlocks.AddFirstBlock(aBlockIndex);
+ Verify();
+}
+
+void
+MediaCache::AllocateAndWriteBlock(MediaCacheStream* aStream, const void* aData,
+ MediaCacheStream::ReadMode aMode)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ int32_t streamBlockIndex = aStream->mChannelOffset/BLOCK_SIZE;
+
+ // Remove all cached copies of this block
+ ResourceStreamIterator iter(aStream->mResourceID);
+ while (MediaCacheStream* stream = iter.Next()) {
+ while (streamBlockIndex >= int32_t(stream->mBlocks.Length())) {
+ stream->mBlocks.AppendElement(-1);
+ }
+ if (stream->mBlocks[streamBlockIndex] >= 0) {
+ // We no longer want to own this block
+ int32_t globalBlockIndex = stream->mBlocks[streamBlockIndex];
+ CACHE_LOG(LogLevel::Debug, ("Released block %d from stream %p block %d(%lld)",
+ globalBlockIndex, stream, streamBlockIndex, (long long)streamBlockIndex*BLOCK_SIZE));
+ RemoveBlockOwner(globalBlockIndex, stream);
+ }
+ }
+
+ // Extend the mBlocks array as necessary
+
+ TimeStamp now = TimeStamp::Now();
+ int32_t blockIndex = FindBlockForIncomingData(now, aStream);
+ if (blockIndex >= 0) {
+ FreeBlock(blockIndex);
+
+ Block* block = &mIndex[blockIndex];
+ CACHE_LOG(LogLevel::Debug, ("Allocated block %d to stream %p block %d(%lld)",
+ blockIndex, aStream, streamBlockIndex, (long long)streamBlockIndex*BLOCK_SIZE));
+
+ mFreeBlocks.RemoveBlock(blockIndex);
+
+ // Tell each stream using this resource about the new block.
+ ResourceStreamIterator iter(aStream->mResourceID);
+ while (MediaCacheStream* stream = iter.Next()) {
+ BlockOwner* bo = block->mOwners.AppendElement();
+ if (!bo)
+ return;
+
+ bo->mStream = stream;
+ bo->mStreamBlock = streamBlockIndex;
+ bo->mLastUseTime = now;
+ stream->mBlocks[streamBlockIndex] = blockIndex;
+ if (streamBlockIndex*BLOCK_SIZE < stream->mStreamOffset) {
+ bo->mClass = aMode == MediaCacheStream::MODE_PLAYBACK
+ ? PLAYED_BLOCK : METADATA_BLOCK;
+ // This must be the most-recently-used block, since we
+ // marked it as used now (which may be slightly bogus, but we'll
+ // treat it as used for simplicity).
+ GetListForBlock(bo)->AddFirstBlock(blockIndex);
+ Verify();
+ } else {
+ // This may not be the latest readahead block, although it usually
+ // will be. We may have to scan for the right place to insert
+ // the block in the list.
+ bo->mClass = READAHEAD_BLOCK;
+ InsertReadaheadBlock(bo, blockIndex);
+ }
+ }
+
+ nsresult rv = mFileCache->WriteBlock(blockIndex, reinterpret_cast<const uint8_t*>(aData));
+ if (NS_FAILED(rv)) {
+ CACHE_LOG(LogLevel::Debug, ("Released block %d from stream %p block %d(%lld)",
+ blockIndex, aStream, streamBlockIndex, (long long)streamBlockIndex*BLOCK_SIZE));
+ FreeBlock(blockIndex);
+ }
+ }
+
+ // Queue an Update since the cache state has changed (for example
+ // we might want to stop loading because the cache is full)
+ QueueUpdate();
+}
+
+void
+MediaCache::OpenStream(MediaCacheStream* aStream)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ CACHE_LOG(LogLevel::Debug, ("Stream %p opened", aStream));
+ mStreams.AppendElement(aStream);
+ aStream->mResourceID = AllocateResourceID();
+
+ // Queue an update since a new stream has been opened.
+ gMediaCache->QueueUpdate();
+}
+
+void
+MediaCache::ReleaseStream(MediaCacheStream* aStream)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ CACHE_LOG(LogLevel::Debug, ("Stream %p closed", aStream));
+ mStreams.RemoveElement(aStream);
+
+ // Update MediaCache again for |mStreams| is changed.
+ // We need to re-run Update() to ensure streams reading from the same resource
+ // as the removed stream get a chance to continue reading.
+ gMediaCache->QueueUpdate();
+}
+
+void
+MediaCache::ReleaseStreamBlocks(MediaCacheStream* aStream)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ // XXX scanning the entire stream doesn't seem great, if not much of it
+ // is cached, but the only easy alternative is to scan the entire cache
+ // which isn't better
+ uint32_t length = aStream->mBlocks.Length();
+ for (uint32_t i = 0; i < length; ++i) {
+ int32_t blockIndex = aStream->mBlocks[i];
+ if (blockIndex >= 0) {
+ CACHE_LOG(LogLevel::Debug, ("Released block %d from stream %p block %d(%lld)",
+ blockIndex, aStream, i, (long long)i*BLOCK_SIZE));
+ RemoveBlockOwner(blockIndex, aStream);
+ }
+ }
+}
+
+void
+MediaCache::Truncate()
+{
+ uint32_t end;
+ for (end = mIndex.Length(); end > 0; --end) {
+ if (!IsBlockFree(end - 1))
+ break;
+ mFreeBlocks.RemoveBlock(end - 1);
+ }
+
+ if (end < mIndex.Length()) {
+ mIndex.TruncateLength(end);
+ // XXX We could truncate the cache file here, but we don't seem
+ // to have a cross-platform API for doing that. At least when all
+ // streams are closed we shut down the cache, which erases the
+ // file at that point.
+ }
+}
+
+void
+MediaCache::NoteBlockUsage(MediaCacheStream* aStream, int32_t aBlockIndex,
+ int64_t aStreamOffset,
+ MediaCacheStream::ReadMode aMode, TimeStamp aNow)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ if (aBlockIndex < 0) {
+ // this block is not in the cache yet
+ return;
+ }
+
+ BlockOwner* bo = GetBlockOwner(aBlockIndex, aStream);
+ if (!bo) {
+ // this block is not in the cache yet
+ return;
+ }
+
+ // The following check has to be <= because the stream offset has
+ // not yet been updated for the data read from this block
+ NS_ASSERTION(bo->mStreamBlock*BLOCK_SIZE <= aStreamOffset,
+ "Using a block that's behind the read position?");
+
+ GetListForBlock(bo)->RemoveBlock(aBlockIndex);
+ bo->mClass =
+ (aMode == MediaCacheStream::MODE_METADATA || bo->mClass == METADATA_BLOCK)
+ ? METADATA_BLOCK : PLAYED_BLOCK;
+ // Since this is just being used now, it can definitely be at the front
+ // of mMetadataBlocks or mPlayedBlocks
+ GetListForBlock(bo)->AddFirstBlock(aBlockIndex);
+ bo->mLastUseTime = aNow;
+ Verify();
+}
+
+void
+MediaCache::NoteSeek(MediaCacheStream* aStream, int64_t aOldOffset)
+{
+ mReentrantMonitor.AssertCurrentThreadIn();
+
+ if (aOldOffset < aStream->mStreamOffset) {
+ // We seeked forward. Convert blocks from readahead to played.
+ // Any readahead block that intersects the seeked-over range must
+ // be converted.
+ int32_t blockIndex = aOldOffset/BLOCK_SIZE;
+ int32_t endIndex =
+ std::min<int64_t>((aStream->mStreamOffset + BLOCK_SIZE - 1)/BLOCK_SIZE,
+ aStream->mBlocks.Length());
+ TimeStamp now = TimeStamp::Now();
+ while (blockIndex < endIndex) {
+ int32_t cacheBlockIndex = aStream->mBlocks[blockIndex];
+ if (cacheBlockIndex >= 0) {
+ // Marking the block used may not be exactly what we want but
+ // it's simple
+ NoteBlockUsage(aStream, cacheBlockIndex, aStream->mStreamOffset,
+ MediaCacheStream::MODE_PLAYBACK, now);
+ }
+ ++blockIndex;
+ }
+ } else {
+ // We seeked backward. Convert from played to readahead.
+ // Any played block that is entirely after the start of the seeked-over
+ // range must be converted.
+ int32_t blockIndex =
+ (aStream->mStreamOffset + BLOCK_SIZE - 1)/BLOCK_SIZE;
+ int32_t endIndex =
+ std::min<int64_t>((aOldOffset + BLOCK_SIZE - 1)/BLOCK_SIZE,
+ aStream->mBlocks.Length());
+ while (blockIndex < endIndex) {
+ MOZ_ASSERT(endIndex > 0);
+ int32_t cacheBlockIndex = aStream->mBlocks[endIndex - 1];
+ if (cacheBlockIndex >= 0) {
+ BlockOwner* bo = GetBlockOwner(cacheBlockIndex, aStream);
+ NS_ASSERTION(bo, "Stream doesn't own its blocks?");
+ if (bo->mClass == PLAYED_BLOCK) {
+ aStream->mPlayedBlocks.RemoveBlock(cacheBlockIndex);
+ bo->mClass = READAHEAD_BLOCK;
+ // Adding this as the first block is sure to be OK since
+ // this must currently be the earliest readahead block
+ // (that's why we're proceeding backwards from the end of
+ // the seeked range to the start)
+ aStream->mReadaheadBlocks.AddFirstBlock(cacheBlockIndex);
+ Verify();
+ }
+ }
+ --endIndex;
+ }
+ }
+}
+
+void
+MediaCacheStream::NotifyDataLength(int64_t aLength)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ mStreamLength = aLength;
+}
+
+void
+MediaCacheStream::NotifyDataStarted(int64_t aOffset)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ NS_WARNING_ASSERTION(aOffset == mChannelOffset,
+ "Server is giving us unexpected offset");
+ MOZ_ASSERT(aOffset >= 0);
+ mChannelOffset = aOffset;
+ if (mStreamLength >= 0) {
+ // If we started reading at a certain offset, then for sure
+ // the stream is at least that long.
+ mStreamLength = std::max(mStreamLength, mChannelOffset);
+ }
+}
+
+bool
+MediaCacheStream::UpdatePrincipal(nsIPrincipal* aPrincipal)
+{
+ return nsContentUtils::CombineResourcePrincipals(&mPrincipal, aPrincipal);
+}
+
+void
+MediaCacheStream::NotifyDataReceived(int64_t aSize, const char* aData,
+ nsIPrincipal* aPrincipal)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ // Update principals before putting the data in the cache. This is important,
+ // we want to make sure all principals are updated before any consumer
+ // can see the new data.
+ // We do this without holding the cache monitor, in case the client wants
+ // to do something that takes a lock.
+ {
+ MediaCache::ResourceStreamIterator iter(mResourceID);
+ while (MediaCacheStream* stream = iter.Next()) {
+ if (stream->UpdatePrincipal(aPrincipal)) {
+ stream->mClient->CacheClientNotifyPrincipalChanged();
+ }
+ }
+ }
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ int64_t size = aSize;
+ const char* data = aData;
+
+ CACHE_LOG(LogLevel::Debug, ("Stream %p DataReceived at %lld count=%lld",
+ this, (long long)mChannelOffset, (long long)aSize));
+
+ // We process the data one block (or part of a block) at a time
+ while (size > 0) {
+ uint32_t blockIndex = mChannelOffset/BLOCK_SIZE;
+ int32_t blockOffset = int32_t(mChannelOffset - blockIndex*BLOCK_SIZE);
+ int32_t chunkSize = std::min<int64_t>(BLOCK_SIZE - blockOffset, size);
+
+ // This gets set to something non-null if we have a whole block
+ // of data to write to the cache
+ const char* blockDataToStore = nullptr;
+ ReadMode mode = MODE_PLAYBACK;
+ if (blockOffset == 0 && chunkSize == BLOCK_SIZE) {
+ // We received a whole block, so avoid a useless copy through
+ // mPartialBlockBuffer
+ blockDataToStore = data;
+ } else {
+ if (blockOffset == 0) {
+ // We've just started filling this buffer so now is a good time
+ // to clear this flag.
+ mMetadataInPartialBlockBuffer = false;
+ }
+ memcpy(reinterpret_cast<char*>(mPartialBlockBuffer.get()) + blockOffset,
+ data, chunkSize);
+
+ if (blockOffset + chunkSize == BLOCK_SIZE) {
+ // We completed a block, so lets write it out.
+ blockDataToStore = reinterpret_cast<char*>(mPartialBlockBuffer.get());
+ if (mMetadataInPartialBlockBuffer) {
+ mode = MODE_METADATA;
+ }
+ }
+ }
+
+ if (blockDataToStore) {
+ gMediaCache->AllocateAndWriteBlock(this, blockDataToStore, mode);
+ }
+
+ mChannelOffset += chunkSize;
+ size -= chunkSize;
+ data += chunkSize;
+ }
+
+ MediaCache::ResourceStreamIterator iter(mResourceID);
+ while (MediaCacheStream* stream = iter.Next()) {
+ if (stream->mStreamLength >= 0) {
+ // The stream is at least as long as what we've read
+ stream->mStreamLength = std::max(stream->mStreamLength, mChannelOffset);
+ }
+ stream->mClient->CacheClientNotifyDataReceived();
+ }
+
+ // Notify in case there's a waiting reader
+ // XXX it would be fairly easy to optimize things a lot more to
+ // avoid waking up reader threads unnecessarily
+ mon.NotifyAll();
+}
+
+void
+MediaCacheStream::FlushPartialBlockInternal(bool aNotifyAll,
+ ReentrantMonitorAutoEnter& aReentrantMonitor)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ int32_t blockOffset = int32_t(mChannelOffset%BLOCK_SIZE);
+ if (blockOffset > 0) {
+ CACHE_LOG(LogLevel::Debug,
+ ("Stream %p writing partial block: [%d] bytes; "
+ "mStreamOffset [%lld] mChannelOffset[%lld] mStreamLength [%lld] "
+ "notifying: [%s]",
+ this, blockOffset, mStreamOffset, mChannelOffset, mStreamLength,
+ aNotifyAll ? "yes" : "no"));
+
+ // Write back the partial block
+ memset(reinterpret_cast<char*>(mPartialBlockBuffer.get()) + blockOffset, 0,
+ BLOCK_SIZE - blockOffset);
+ gMediaCache->AllocateAndWriteBlock(this, mPartialBlockBuffer.get(),
+ mMetadataInPartialBlockBuffer ? MODE_METADATA : MODE_PLAYBACK);
+ }
+
+ // |mChannelOffset == 0| means download ends with no bytes received.
+ // We should also wake up those readers who are waiting for data
+ // that will never come.
+ if ((blockOffset > 0 || mChannelOffset == 0) && aNotifyAll) {
+ // Wake up readers who may be waiting for this data
+ aReentrantMonitor.NotifyAll();
+ }
+}
+
+void
+MediaCacheStream::FlushPartialBlock()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+
+ // Write the current partial block to memory.
+ // Note: This writes a full block, so if data is not at the end of the
+ // stream, the decoder must subsequently choose correct start and end offsets
+ // for reading/seeking.
+ FlushPartialBlockInternal(false, mon);
+
+ gMediaCache->QueueUpdate();
+}
+
+void
+MediaCacheStream::NotifyDataEnded(nsresult aStatus)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+
+ if (NS_FAILED(aStatus)) {
+ // Disconnect from other streams sharing our resource, since they
+ // should continue trying to load. Our load might have been deliberately
+ // canceled and that shouldn't affect other streams.
+ mResourceID = gMediaCache->AllocateResourceID();
+ }
+
+ // It is prudent to update channel/cache status before calling
+ // CacheClientNotifyDataEnded() which will read |mChannelEnded|.
+ FlushPartialBlockInternal(true, mon);
+ mChannelEnded = true;
+ gMediaCache->QueueUpdate();
+
+ MediaCache::ResourceStreamIterator iter(mResourceID);
+ while (MediaCacheStream* stream = iter.Next()) {
+ if (NS_SUCCEEDED(aStatus)) {
+ // We read the whole stream, so remember the true length
+ stream->mStreamLength = mChannelOffset;
+ }
+ if (!stream->mDidNotifyDataEnded) {
+ stream->mDidNotifyDataEnded = true;
+ stream->mNotifyDataEndedStatus = aStatus;
+ stream->mClient->CacheClientNotifyDataEnded(aStatus);
+ }
+ }
+}
+
+void
+MediaCacheStream::NotifyChannelRecreated()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ mChannelEnded = false;
+ mDidNotifyDataEnded = false;
+}
+
+MediaCacheStream::~MediaCacheStream()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ NS_ASSERTION(!mPinCount, "Unbalanced Pin");
+
+ if (gMediaCache) {
+ NS_ASSERTION(mClosed, "Stream was not closed");
+ gMediaCache->ReleaseStream(this);
+ MediaCache::MaybeShutdown();
+ }
+}
+
+void
+MediaCacheStream::SetTransportSeekable(bool aIsTransportSeekable)
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ NS_ASSERTION(mIsTransportSeekable || aIsTransportSeekable ||
+ mChannelOffset == 0, "channel offset must be zero when we become non-seekable");
+ mIsTransportSeekable = aIsTransportSeekable;
+ // Queue an Update since we may change our strategy for dealing
+ // with this stream
+ gMediaCache->QueueUpdate();
+}
+
+bool
+MediaCacheStream::IsTransportSeekable()
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ return mIsTransportSeekable;
+}
+
+bool
+MediaCacheStream::AreAllStreamsForResourceSuspended()
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ MediaCache::ResourceStreamIterator iter(mResourceID);
+ // Look for a stream that's able to read the data we need
+ int64_t dataOffset = -1;
+ while (MediaCacheStream* stream = iter.Next()) {
+ if (stream->mCacheSuspended || stream->mChannelEnded || stream->mClosed) {
+ continue;
+ }
+ if (dataOffset < 0) {
+ dataOffset = GetCachedDataEndInternal(mStreamOffset);
+ }
+ // Ignore streams that are reading beyond the data we need
+ if (stream->mChannelOffset > dataOffset) {
+ continue;
+ }
+ return false;
+ }
+
+ return true;
+}
+
+void
+MediaCacheStream::Close()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ if (!mInitialized)
+ return;
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ CloseInternal(mon);
+ // Queue an Update since we may have created more free space. Don't do
+ // it from CloseInternal since that gets called by Update() itself
+ // sometimes, and we try to not to queue updates from Update().
+ gMediaCache->QueueUpdate();
+}
+
+void
+MediaCacheStream::EnsureCacheUpdate()
+{
+ if (mHasHadUpdate)
+ return;
+ gMediaCache->Update();
+}
+
+void
+MediaCacheStream::CloseInternal(ReentrantMonitorAutoEnter& aReentrantMonitor)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ if (mClosed)
+ return;
+ mClosed = true;
+ // Closing a stream will change the return value of
+ // MediaCacheStream::AreAllStreamsForResourceSuspended as well as
+ // ChannelMediaResource::IsSuspendedByCache. Let's notify it.
+ gMediaCache->QueueSuspendedStatusUpdate(mResourceID);
+ gMediaCache->ReleaseStreamBlocks(this);
+ // Wake up any blocked readers
+ aReentrantMonitor.NotifyAll();
+}
+
+void
+MediaCacheStream::Pin()
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ ++mPinCount;
+ // Queue an Update since we may no longer want to read more into the
+ // cache, if this stream's block have become non-evictable
+ gMediaCache->QueueUpdate();
+}
+
+void
+MediaCacheStream::Unpin()
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ NS_ASSERTION(mPinCount > 0, "Unbalanced Unpin");
+ --mPinCount;
+ // Queue an Update since we may be able to read more into the
+ // cache, if this stream's block have become evictable
+ gMediaCache->QueueUpdate();
+}
+
+int64_t
+MediaCacheStream::GetLength()
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ return mStreamLength;
+}
+
+int64_t
+MediaCacheStream::GetNextCachedData(int64_t aOffset)
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ return GetNextCachedDataInternal(aOffset);
+}
+
+int64_t
+MediaCacheStream::GetCachedDataEnd(int64_t aOffset)
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ return GetCachedDataEndInternal(aOffset);
+}
+
+bool
+MediaCacheStream::IsDataCachedToEndOfStream(int64_t aOffset)
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ if (mStreamLength < 0)
+ return false;
+ return GetCachedDataEndInternal(aOffset) >= mStreamLength;
+}
+
+int64_t
+MediaCacheStream::GetCachedDataEndInternal(int64_t aOffset)
+{
+ gMediaCache->GetReentrantMonitor().AssertCurrentThreadIn();
+ uint32_t startBlockIndex = aOffset/BLOCK_SIZE;
+ uint32_t blockIndex = startBlockIndex;
+ while (blockIndex < mBlocks.Length() && mBlocks[blockIndex] != -1) {
+ ++blockIndex;
+ }
+ int64_t result = blockIndex*BLOCK_SIZE;
+ if (blockIndex == mChannelOffset/BLOCK_SIZE) {
+ // The block containing mChannelOffset may be partially read but not
+ // yet committed to the main cache
+ result = mChannelOffset;
+ }
+ if (mStreamLength >= 0) {
+ // The last block in the cache may only be partially valid, so limit
+ // the cached range to the stream length
+ result = std::min(result, mStreamLength);
+ }
+ return std::max(result, aOffset);
+}
+
+int64_t
+MediaCacheStream::GetNextCachedDataInternal(int64_t aOffset)
+{
+ gMediaCache->GetReentrantMonitor().AssertCurrentThreadIn();
+ if (aOffset == mStreamLength)
+ return -1;
+
+ uint32_t startBlockIndex = aOffset/BLOCK_SIZE;
+ uint32_t channelBlockIndex = mChannelOffset/BLOCK_SIZE;
+
+ if (startBlockIndex == channelBlockIndex &&
+ aOffset < mChannelOffset) {
+ // The block containing mChannelOffset is partially read, but not
+ // yet committed to the main cache. aOffset lies in the partially
+ // read portion, thus it is effectively cached.
+ return aOffset;
+ }
+
+ if (startBlockIndex >= mBlocks.Length())
+ return -1;
+
+ // Is the current block cached?
+ if (mBlocks[startBlockIndex] != -1)
+ return aOffset;
+
+ // Count the number of uncached blocks
+ bool hasPartialBlock = (mChannelOffset % BLOCK_SIZE) != 0;
+ uint32_t blockIndex = startBlockIndex + 1;
+ while (true) {
+ if ((hasPartialBlock && blockIndex == channelBlockIndex) ||
+ (blockIndex < mBlocks.Length() && mBlocks[blockIndex] != -1)) {
+ // We at the incoming channel block, which has has data in it,
+ // or are we at a cached block. Return index of block start.
+ return blockIndex * BLOCK_SIZE;
+ }
+
+ // No more cached blocks?
+ if (blockIndex >= mBlocks.Length())
+ return -1;
+
+ ++blockIndex;
+ }
+
+ NS_NOTREACHED("Should return in loop");
+ return -1;
+}
+
+void
+MediaCacheStream::SetReadMode(ReadMode aMode)
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ if (aMode == mCurrentMode)
+ return;
+ mCurrentMode = aMode;
+ gMediaCache->QueueUpdate();
+}
+
+void
+MediaCacheStream::SetPlaybackRate(uint32_t aBytesPerSecond)
+{
+ NS_ASSERTION(aBytesPerSecond > 0, "Zero playback rate not allowed");
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ if (aBytesPerSecond == mPlaybackBytesPerSecond)
+ return;
+ mPlaybackBytesPerSecond = aBytesPerSecond;
+ gMediaCache->QueueUpdate();
+}
+
+nsresult
+MediaCacheStream::Seek(int32_t aWhence, int64_t aOffset)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ if (mClosed)
+ return NS_ERROR_FAILURE;
+
+ int64_t oldOffset = mStreamOffset;
+ int64_t newOffset = mStreamOffset;
+ switch (aWhence) {
+ case PR_SEEK_END:
+ if (mStreamLength < 0)
+ return NS_ERROR_FAILURE;
+ newOffset = mStreamLength + aOffset;
+ break;
+ case PR_SEEK_CUR:
+ newOffset += aOffset;
+ break;
+ case PR_SEEK_SET:
+ newOffset = aOffset;
+ break;
+ default:
+ NS_ERROR("Unknown whence");
+ return NS_ERROR_FAILURE;
+ }
+
+ if (newOffset < 0)
+ return NS_ERROR_FAILURE;
+ mStreamOffset = newOffset;
+
+ CACHE_LOG(LogLevel::Debug, ("Stream %p Seek to %lld", this, (long long)mStreamOffset));
+ gMediaCache->NoteSeek(this, oldOffset);
+
+ gMediaCache->QueueUpdate();
+ return NS_OK;
+}
+
+int64_t
+MediaCacheStream::Tell()
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ return mStreamOffset;
+}
+
+nsresult
+MediaCacheStream::Read(char* aBuffer, uint32_t aCount, uint32_t* aBytes)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ if (mClosed)
+ return NS_ERROR_FAILURE;
+
+ // Cache the offset in case it is changed again when we are waiting for the
+ // monitor to be notified to avoid reading at the wrong position.
+ auto streamOffset = mStreamOffset;
+
+ uint32_t count = 0;
+ // Read one block (or part of a block) at a time
+ while (count < aCount) {
+ uint32_t streamBlock = uint32_t(streamOffset/BLOCK_SIZE);
+ uint32_t offsetInStreamBlock = uint32_t(streamOffset - streamBlock*BLOCK_SIZE);
+ int64_t size = std::min<int64_t>(aCount - count, BLOCK_SIZE - offsetInStreamBlock);
+
+ if (mStreamLength >= 0) {
+ // Don't try to read beyond the end of the stream
+ int64_t bytesRemaining = mStreamLength - streamOffset;
+ if (bytesRemaining <= 0) {
+ // Get out of here and return NS_OK
+ break;
+ }
+ size = std::min(size, bytesRemaining);
+ // Clamp size until 64-bit file size issues are fixed.
+ size = std::min(size, int64_t(INT32_MAX));
+ }
+
+ int32_t cacheBlock = streamBlock < mBlocks.Length() ? mBlocks[streamBlock] : -1;
+ if (cacheBlock < 0) {
+ // We don't have a complete cached block here.
+
+ if (count > 0) {
+ // Some data has been read, so return what we've got instead of
+ // blocking or trying to find a stream with a partial block.
+ break;
+ }
+
+ // See if the data is available in the partial cache block of any
+ // stream reading this resource. We need to do this in case there is
+ // another stream with this resource that has all the data to the end of
+ // the stream but the data doesn't end on a block boundary.
+ MediaCacheStream* streamWithPartialBlock = nullptr;
+ MediaCache::ResourceStreamIterator iter(mResourceID);
+ while (MediaCacheStream* stream = iter.Next()) {
+ if (uint32_t(stream->mChannelOffset/BLOCK_SIZE) == streamBlock &&
+ streamOffset < stream->mChannelOffset) {
+ streamWithPartialBlock = stream;
+ break;
+ }
+ }
+ if (streamWithPartialBlock) {
+ // We can just use the data in mPartialBlockBuffer. In fact we should
+ // use it rather than waiting for the block to fill and land in
+ // the cache.
+ int64_t bytes = std::min<int64_t>(size, streamWithPartialBlock->mChannelOffset - streamOffset);
+ // Clamp bytes until 64-bit file size issues are fixed.
+ bytes = std::min(bytes, int64_t(INT32_MAX));
+ MOZ_ASSERT(bytes >= 0 && bytes <= aCount, "Bytes out of range.");
+ memcpy(aBuffer,
+ reinterpret_cast<char*>(streamWithPartialBlock->mPartialBlockBuffer.get()) + offsetInStreamBlock, bytes);
+ if (mCurrentMode == MODE_METADATA) {
+ streamWithPartialBlock->mMetadataInPartialBlockBuffer = true;
+ }
+ streamOffset += bytes;
+ count = bytes;
+ break;
+ }
+
+ // No data has been read yet, so block
+ mon.Wait();
+ if (mClosed) {
+ // We may have successfully read some data, but let's just throw
+ // that out.
+ return NS_ERROR_FAILURE;
+ }
+ continue;
+ }
+
+ gMediaCache->NoteBlockUsage(this, cacheBlock, streamOffset, mCurrentMode, TimeStamp::Now());
+
+ int64_t offset = cacheBlock*BLOCK_SIZE + offsetInStreamBlock;
+ int32_t bytes;
+ MOZ_ASSERT(size >= 0 && size <= INT32_MAX, "Size out of range.");
+ nsresult rv = gMediaCache->ReadCacheFile(offset, aBuffer + count, int32_t(size), &bytes);
+ if (NS_FAILED(rv)) {
+ if (count == 0)
+ return rv;
+ // If we did successfully read some data, may as well return it
+ break;
+ }
+ streamOffset += bytes;
+ count += bytes;
+ }
+
+ if (count > 0) {
+ // Some data was read, so queue an update since block priorities may
+ // have changed
+ gMediaCache->QueueUpdate();
+ }
+ CACHE_LOG(LogLevel::Debug, ("Stream %p Read at %lld count=%d", this, streamOffset-count, count));
+ *aBytes = count;
+ mStreamOffset = streamOffset;
+ return NS_OK;
+}
+
+nsresult
+MediaCacheStream::ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ nsresult rv = Seek(nsISeekableStream::NS_SEEK_SET, aOffset);
+ if (NS_FAILED(rv)) return rv;
+ return Read(aBuffer, aCount, aBytes);
+}
+
+nsresult
+MediaCacheStream::ReadFromCache(char* aBuffer, int64_t aOffset, int64_t aCount)
+{
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+ if (mClosed)
+ return NS_ERROR_FAILURE;
+
+ // Read one block (or part of a block) at a time
+ uint32_t count = 0;
+ int64_t streamOffset = aOffset;
+ while (count < aCount) {
+ uint32_t streamBlock = uint32_t(streamOffset/BLOCK_SIZE);
+ uint32_t offsetInStreamBlock =
+ uint32_t(streamOffset - streamBlock*BLOCK_SIZE);
+ int64_t size = std::min<int64_t>(aCount - count, BLOCK_SIZE - offsetInStreamBlock);
+
+ if (mStreamLength >= 0) {
+ // Don't try to read beyond the end of the stream
+ int64_t bytesRemaining = mStreamLength - streamOffset;
+ if (bytesRemaining <= 0) {
+ return NS_ERROR_FAILURE;
+ }
+ size = std::min(size, bytesRemaining);
+ // Clamp size until 64-bit file size issues are fixed.
+ size = std::min(size, int64_t(INT32_MAX));
+ }
+
+ int32_t bytes;
+ uint32_t channelBlock = uint32_t(mChannelOffset/BLOCK_SIZE);
+ int32_t cacheBlock = streamBlock < mBlocks.Length() ? mBlocks[streamBlock] : -1;
+ if (channelBlock == streamBlock && streamOffset < mChannelOffset) {
+ // We can just use the data in mPartialBlockBuffer. In fact we should
+ // use it rather than waiting for the block to fill and land in
+ // the cache.
+ // Clamp bytes until 64-bit file size issues are fixed.
+ int64_t toCopy = std::min<int64_t>(size, mChannelOffset - streamOffset);
+ bytes = std::min(toCopy, int64_t(INT32_MAX));
+ MOZ_ASSERT(bytes >= 0 && bytes <= toCopy, "Bytes out of range.");
+ memcpy(aBuffer + count,
+ reinterpret_cast<char*>(mPartialBlockBuffer.get()) + offsetInStreamBlock, bytes);
+ } else {
+ if (cacheBlock < 0) {
+ // We expect all blocks to be cached! Fail!
+ return NS_ERROR_FAILURE;
+ }
+ int64_t offset = cacheBlock*BLOCK_SIZE + offsetInStreamBlock;
+ MOZ_ASSERT(size >= 0 && size <= INT32_MAX, "Size out of range.");
+ nsresult rv = gMediaCache->ReadCacheFile(offset, aBuffer + count, int32_t(size), &bytes);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ }
+ streamOffset += bytes;
+ count += bytes;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+MediaCacheStream::Init()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ if (mInitialized)
+ return NS_OK;
+
+ InitMediaCache();
+ if (!gMediaCache)
+ return NS_ERROR_FAILURE;
+ gMediaCache->OpenStream(this);
+ mInitialized = true;
+ return NS_OK;
+}
+
+nsresult
+MediaCacheStream::InitAsClone(MediaCacheStream* aOriginal)
+{
+ if (!aOriginal->IsAvailableForSharing())
+ return NS_ERROR_FAILURE;
+
+ if (mInitialized)
+ return NS_OK;
+
+ nsresult rv = Init();
+ if (NS_FAILED(rv))
+ return rv;
+ mResourceID = aOriginal->mResourceID;
+
+ // Grab cache blocks from aOriginal as readahead blocks for our stream
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+
+ mPrincipal = aOriginal->mPrincipal;
+ mStreamLength = aOriginal->mStreamLength;
+ mIsTransportSeekable = aOriginal->mIsTransportSeekable;
+
+ // Cloned streams are initially suspended, since there is no channel open
+ // initially for a clone.
+ mCacheSuspended = true;
+ mChannelEnded = true;
+
+ if (aOriginal->mDidNotifyDataEnded) {
+ mNotifyDataEndedStatus = aOriginal->mNotifyDataEndedStatus;
+ mDidNotifyDataEnded = true;
+ mClient->CacheClientNotifyDataEnded(mNotifyDataEndedStatus);
+ }
+
+ for (uint32_t i = 0; i < aOriginal->mBlocks.Length(); ++i) {
+ int32_t cacheBlockIndex = aOriginal->mBlocks[i];
+ if (cacheBlockIndex < 0)
+ continue;
+
+ while (i >= mBlocks.Length()) {
+ mBlocks.AppendElement(-1);
+ }
+ // Every block is a readahead block for the clone because the clone's initial
+ // stream offset is zero
+ gMediaCache->AddBlockOwnerAsReadahead(cacheBlockIndex, this, i);
+ }
+
+ return NS_OK;
+}
+
+nsresult MediaCacheStream::GetCachedRanges(MediaByteRangeSet& aRanges)
+{
+ // Take the monitor, so that the cached data ranges can't grow while we're
+ // trying to loop over them.
+ ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
+
+ // We must be pinned while running this, otherwise the cached data ranges may
+ // shrink while we're trying to loop over them.
+ NS_ASSERTION(mPinCount > 0, "Must be pinned");
+
+ int64_t startOffset = GetNextCachedDataInternal(0);
+ while (startOffset >= 0) {
+ int64_t endOffset = GetCachedDataEndInternal(startOffset);
+ NS_ASSERTION(startOffset < endOffset, "Buffered range must end after its start");
+ // Bytes [startOffset..endOffset] are cached.
+ aRanges += MediaByteRange(startOffset, endOffset);
+ startOffset = GetNextCachedDataInternal(endOffset);
+ NS_ASSERTION(startOffset == -1 || startOffset > endOffset,
+ "Must have advanced to start of next range, or hit end of stream");
+ }
+ return NS_OK;
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/MediaCache.h b/dom/media/MediaCache.h
new file mode 100644
index 000000000..68a82f1ca
--- /dev/null
+++ b/dom/media/MediaCache.h
@@ -0,0 +1,519 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaCache_h_
+#define MediaCache_h_
+
+#include "nsTArray.h"
+#include "nsCOMPtr.h"
+#include "nsHashKeys.h"
+#include "nsTHashtable.h"
+#include "Intervals.h"
+#include "mozilla/UniquePtr.h"
+
+class nsIPrincipal;
+
+namespace mozilla {
+// defined in MediaResource.h
+class ChannelMediaResource;
+typedef media::IntervalSet<int64_t> MediaByteRangeSet;
+class MediaResource;
+class ReentrantMonitorAutoEnter;
+
+/**
+ * Media applications want fast, "on demand" random access to media data,
+ * for pausing, seeking, etc. But we are primarily interested
+ * in transporting media data using HTTP over the Internet, which has
+ * high latency to open a connection, requires a new connection for every
+ * seek, may not even support seeking on some connections (especially
+ * live streams), and uses a push model --- data comes from the server
+ * and you don't have much control over the rate. Also, transferring data
+ * over the Internet can be slow and/or unpredictable, so we want to read
+ * ahead to buffer and cache as much data as possible.
+ *
+ * The job of the media cache is to resolve this impedance mismatch.
+ * The media cache reads data from Necko channels into file-backed storage,
+ * and offers a random-access file-like API to the stream data
+ * (MediaCacheStream). Along the way it solves several problems:
+ * -- The cache intelligently reads ahead to prefetch data that may be
+ * needed in the future
+ * -- The size of the cache is bounded so that we don't fill up
+ * storage with read-ahead data
+ * -- Cache replacement is managed globally so that the most valuable
+ * data (across all streams) is retained
+ * -- The cache can suspend Necko channels temporarily when their data is
+ * not wanted (yet)
+ * -- The cache translates file-like seek requests to HTTP seeks,
+ * including optimizations like not triggering a new seek if it would
+ * be faster to just keep reading until we reach the seek point. The
+ * "seek to EOF" idiom to determine file size is also handled efficiently
+ * (seeking to EOF and then seeking back to the previous offset does not
+ * trigger any Necko activity)
+ * -- The cache also handles the case where the server does not support
+ * seeking
+ * -- Necko can only send data to the main thread, but MediaCacheStream
+ * can distribute data to any thread
+ * -- The cache exposes APIs so clients can detect what data is
+ * currently held
+ *
+ * Note that although HTTP is the most important transport and we only
+ * support transport-level seeking via HTTP byte-ranges, the media cache
+ * works with any kind of Necko channels and provides random access to
+ * cached data even for, e.g., FTP streams.
+ *
+ * The media cache is not persistent. It does not currently allow
+ * data from one load to be used by other loads, either within the same
+ * browser session or across browser sessions. The media cache file
+ * is marked "delete on close" so it will automatically disappear in the
+ * event of a browser crash or shutdown.
+ *
+ * The media cache is block-based. Streams are divided into blocks of a
+ * fixed size (currently 4K) and we cache blocks. A single cache contains
+ * blocks for all streams.
+ *
+ * The cache size is controlled by the media.cache_size preference
+ * (which is in KB). The default size is 500MB.
+ *
+ * The replacement policy predicts a "time of next use" for each block
+ * in the cache. When we need to free a block, the block with the latest
+ * "time of next use" will be evicted. Blocks are divided into
+ * different classes, each class having its own predictor:
+ * FREE_BLOCK: these blocks are effectively infinitely far in the future;
+ * a free block will always be chosen for replacement before other classes
+ * of blocks.
+ * METADATA_BLOCK: these are blocks that contain data that has been read
+ * by the decoder in "metadata mode", e.g. while the decoder is searching
+ * the stream during a seek operation. These blocks are managed with an
+ * LRU policy; the "time of next use" is predicted to be as far in the
+ * future as the last use was in the past.
+ * PLAYED_BLOCK: these are blocks that have not been read in "metadata
+ * mode", and contain data behind the current decoder read point. (They
+ * may not actually have been read by the decoder, if the decoder seeked
+ * forward.) These blocks are managed with an LRU policy except that we add
+ * REPLAY_DELAY seconds of penalty to their predicted "time of next use",
+ * to reflect the uncertainty about whether replay will actually happen
+ * or not.
+ * READAHEAD_BLOCK: these are blocks that have not been read in
+ * "metadata mode" and that are entirely ahead of the current decoder
+ * read point. (They may actually have been read by the decoder in the
+ * past if the decoder has since seeked backward.) We predict the
+ * time of next use for these blocks by assuming steady playback and
+ * dividing the number of bytes between the block and the current decoder
+ * read point by the decoder's estimate of its playback rate in bytes
+ * per second. This ensures that the blocks farthest ahead are considered
+ * least valuable.
+ * For efficient prediction of the "latest time of next use", we maintain
+ * linked lists of blocks in each class, ordering blocks by time of
+ * next use. READAHEAD_BLOCKS have one linked list per stream, since their
+ * time of next use depends on stream parameters, but the other lists
+ * are global.
+ *
+ * A block containing a current decoder read point can contain data
+ * both behind and ahead of the read point. It will be classified as a
+ * PLAYED_BLOCK but we will give it special treatment so it is never
+ * evicted --- it actually contains the highest-priority readahead data
+ * as well as played data.
+ *
+ * "Time of next use" estimates are also used for flow control. When
+ * reading ahead we can predict the time of next use for the data that
+ * will be read. If the predicted time of next use is later then the
+ * prediction for all currently cached blocks, and the cache is full, then
+ * we should suspend reading from the Necko channel.
+ *
+ * Unfortunately suspending the Necko channel can't immediately stop the
+ * flow of data from the server. First our desire to suspend has to be
+ * transmitted to the server (in practice, Necko stops reading from the
+ * socket, which causes the kernel to shrink its advertised TCP receive
+ * window size to zero). Then the server can stop sending the data, but
+ * we will receive data roughly corresponding to the product of the link
+ * bandwidth multiplied by the round-trip latency. We deal with this by
+ * letting the cache overflow temporarily and then trimming it back by
+ * moving overflowing blocks back into the body of the cache, replacing
+ * less valuable blocks as they become available. We try to avoid simply
+ * discarding overflowing readahead data.
+ *
+ * All changes to the actual contents of the cache happen on the main
+ * thread, since that's where Necko's notifications happen.
+ *
+ * The media cache maintains at most one Necko channel for each stream.
+ * (In the future it might be advantageous to relax this, e.g. so that a
+ * seek to near the end of the file can happen without disturbing
+ * the loading of data from the beginning of the file.) The Necko channel
+ * is managed through ChannelMediaResource; MediaCache does not
+ * depend on Necko directly.
+ *
+ * Every time something changes that might affect whether we want to
+ * read from a Necko channel, or whether we want to seek on the Necko
+ * channel --- such as data arriving or data being consumed by the
+ * decoder --- we asynchronously trigger MediaCache::Update on the main
+ * thread. That method implements most cache policy. It evaluates for
+ * each stream whether we want to suspend or resume the stream and what
+ * offset we should seek to, if any. It is also responsible for trimming
+ * back the cache size to its desired limit by moving overflowing blocks
+ * into the main part of the cache.
+ *
+ * Streams can be opened in non-seekable mode. In non-seekable mode,
+ * the cache will only call ChannelMediaResource::CacheClientSeek with
+ * a 0 offset. The cache tries hard not to discard readahead data
+ * for non-seekable streams, since that could trigger a potentially
+ * disastrous re-read of the entire stream. It's up to cache clients
+ * to try to avoid requesting seeks on such streams.
+ *
+ * MediaCache has a single internal monitor for all synchronization.
+ * This is treated as the lowest level monitor in the media code. So,
+ * we must not acquire any MediaDecoder locks or MediaResource locks
+ * while holding the MediaCache lock. But it's OK to hold those locks
+ * and then get the MediaCache lock.
+ *
+ * MediaCache associates a principal with each stream. CacheClientSeek
+ * can trigger new HTTP requests; due to redirects to other domains,
+ * each HTTP load can return data with a different principal. This
+ * principal must be passed to NotifyDataReceived, and MediaCache
+ * will detect when different principals are associated with data in the
+ * same stream, and replace them with a null principal.
+ */
+class MediaCache;
+
+/**
+ * If the cache fails to initialize then Init will fail, so nonstatic
+ * methods of this class can assume gMediaCache is non-null.
+ *
+ * This class can be directly embedded as a value.
+ */
+class MediaCacheStream {
+public:
+ // This needs to be a power of two
+ static const int64_t BLOCK_SIZE = 32768;
+
+ enum ReadMode {
+ MODE_METADATA,
+ MODE_PLAYBACK
+ };
+
+ // aClient provides the underlying transport that cache will use to read
+ // data for this stream.
+ explicit MediaCacheStream(ChannelMediaResource* aClient);
+ ~MediaCacheStream();
+
+ // Set up this stream with the cache. Can fail on OOM. One
+ // of InitAsClone or Init must be called before any other method on
+ // this class. Does nothing if already initialized.
+ nsresult Init();
+
+ // Set up this stream with the cache, assuming it's for the same data
+ // as the aOriginal stream. Can fail on OOM. Exactly one
+ // of InitAsClone or Init must be called before any other method on
+ // this class. Does nothing if already initialized.
+ nsresult InitAsClone(MediaCacheStream* aOriginal);
+
+ // These are called on the main thread.
+ // Tell us whether the stream is seekable or not. Non-seekable streams
+ // will always pass 0 for aOffset to CacheClientSeek. This should only
+ // be called while the stream is at channel offset 0. Seekability can
+ // change during the lifetime of the MediaCacheStream --- every time
+ // we do an HTTP load the seekability may be different (and sometimes
+ // is, in practice, due to the effects of caching proxies).
+ void SetTransportSeekable(bool aIsTransportSeekable);
+ // This must be called (and return) before the ChannelMediaResource
+ // used to create this MediaCacheStream is deleted.
+ void Close();
+ // This returns true when the stream has been closed
+ bool IsClosed() const { return mClosed; }
+ // Returns true when this stream is can be shared by a new resource load
+ bool IsAvailableForSharing() const
+ {
+ return !mClosed &&
+ (!mDidNotifyDataEnded || NS_SUCCEEDED(mNotifyDataEndedStatus));
+ }
+ // Get the principal for this stream. Anything accessing the contents of
+ // this stream must have a principal that subsumes this principal.
+ nsIPrincipal* GetCurrentPrincipal() { return mPrincipal; }
+ // Ensure a global media cache update has run with this stream present.
+ // This ensures the cache has had a chance to suspend or unsuspend this stream.
+ // Called only on main thread. This can change the state of streams, fire
+ // notifications, etc.
+ void EnsureCacheUpdate();
+
+ // These callbacks are called on the main thread by the client
+ // when data has been received via the channel.
+ // Tells the cache what the server said the data length is going to be.
+ // The actual data length may be greater (we receive more data than
+ // specified) or smaller (the stream ends before we reach the given
+ // length), because servers can lie. The server's reported data length
+ // *and* the actual data length can even vary over time because a
+ // misbehaving server may feed us a different stream after each seek
+ // operation. So this is really just a hint. The cache may however
+ // stop reading (suspend the channel) when it thinks we've read all the
+ // data available based on an incorrect reported length. Seeks relative
+ // EOF also depend on the reported length if we haven't managed to
+ // read the whole stream yet.
+ void NotifyDataLength(int64_t aLength);
+ // Notifies the cache that a load has begun. We pass the offset
+ // because in some cases the offset might not be what the cache
+ // requested. In particular we might unexpectedly start providing
+ // data at offset 0. This need not be called if the offset is the
+ // offset that the cache requested in
+ // ChannelMediaResource::CacheClientSeek. This can be called at any
+ // time by the client, not just after a CacheClientSeek.
+ void NotifyDataStarted(int64_t aOffset);
+ // Notifies the cache that data has been received. The stream already
+ // knows the offset because data is received in sequence and
+ // the starting offset is known via NotifyDataStarted or because
+ // the cache requested the offset in
+ // ChannelMediaResource::CacheClientSeek, or because it defaulted to 0.
+ // We pass in the principal that was used to load this data.
+ void NotifyDataReceived(int64_t aSize, const char* aData,
+ nsIPrincipal* aPrincipal);
+ // Notifies the cache that the current bytes should be written to disk.
+ // Called on the main thread.
+ void FlushPartialBlock();
+ // Notifies the cache that the channel has closed with the given status.
+ void NotifyDataEnded(nsresult aStatus);
+
+ // Notifies the stream that the channel is reopened. The stream should
+ // reset variables such as |mDidNotifyDataEnded|.
+ void NotifyChannelRecreated();
+
+ // These methods can be called on any thread.
+ // Cached blocks associated with this stream will not be evicted
+ // while the stream is pinned.
+ void Pin();
+ void Unpin();
+ // See comments above for NotifyDataLength about how the length
+ // can vary over time. Returns -1 if no length is known. Returns the
+ // reported length if we haven't got any better information. If
+ // the stream ended normally we return the length we actually got.
+ // If we've successfully read data beyond the originally reported length,
+ // we return the end of the data we've read.
+ int64_t GetLength();
+ // Returns the unique resource ID. Call only on the main thread or while
+ // holding the media cache lock.
+ int64_t GetResourceID() { return mResourceID; }
+ // Returns the end of the bytes starting at the given offset
+ // which are in cache.
+ int64_t GetCachedDataEnd(int64_t aOffset);
+ // Returns the offset of the first byte of cached data at or after aOffset,
+ // or -1 if there is no such cached data.
+ int64_t GetNextCachedData(int64_t aOffset);
+ // Fills aRanges with the ByteRanges representing the data which is currently
+ // cached. Locks the media cache while running, to prevent any ranges
+ // growing. The stream should be pinned while this runs and while its results
+ // are used, to ensure no data is evicted.
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges);
+
+ // Reads from buffered data only. Will fail if not all data to be read is
+ // in the cache. Will not mark blocks as read. Can be called from the main
+ // thread. It's the caller's responsibility to wrap the call in a pin/unpin,
+ // and also to check that the range they want is cached before calling this.
+ nsresult ReadFromCache(char* aBuffer,
+ int64_t aOffset,
+ int64_t aCount);
+
+ // IsDataCachedToEndOfStream returns true if all the data from
+ // aOffset to the end of the stream (the server-reported end, if the
+ // real end is not known) is in cache. If we know nothing about the
+ // end of the stream, this returns false.
+ bool IsDataCachedToEndOfStream(int64_t aOffset);
+ // The mode is initially MODE_PLAYBACK.
+ void SetReadMode(ReadMode aMode);
+ // This is the client's estimate of the playback rate assuming
+ // the media plays continuously. The cache can't guess this itself
+ // because it doesn't know when the decoder was paused, buffering, etc.
+ // Do not pass zero.
+ void SetPlaybackRate(uint32_t aBytesPerSecond);
+ // Returns the last set value of SetTransportSeekable.
+ bool IsTransportSeekable();
+
+ // Returns true when all streams for this resource are suspended or their
+ // channel has ended.
+ bool AreAllStreamsForResourceSuspended();
+
+ // These methods must be called on a different thread from the main
+ // thread. They should always be called on the same thread for a given
+ // stream.
+ // This can fail when aWhence is NS_SEEK_END and no stream length
+ // is known.
+ nsresult Seek(int32_t aWhence, int64_t aOffset);
+ int64_t Tell();
+ // *aBytes gets the number of bytes that were actually read. This can
+ // be less than aCount. If the first byte of data is not in the cache,
+ // this will block until the data is available or the stream is
+ // closed, otherwise it won't block.
+ nsresult Read(char* aBuffer, uint32_t aCount, uint32_t* aBytes);
+ // Seeks to aOffset in the stream then performs a Read operation. See
+ // 'Read' for argument and return details.
+ nsresult ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes);
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
+
+private:
+ friend class MediaCache;
+
+ /**
+ * A doubly-linked list of blocks. Add/Remove/Get methods are all
+ * constant time. We declare this here so that a stream can contain a
+ * BlockList of its read-ahead blocks. Blocks are referred to by index
+ * into the MediaCache::mIndex array.
+ *
+ * Blocks can belong to more than one list at the same time, because
+ * the next/prev pointers are not stored in the block.
+ */
+ class BlockList {
+ public:
+ BlockList() : mFirstBlock(-1), mCount(0) {}
+ ~BlockList() {
+ NS_ASSERTION(mFirstBlock == -1 && mCount == 0,
+ "Destroying non-empty block list");
+ }
+ void AddFirstBlock(int32_t aBlock);
+ void AddAfter(int32_t aBlock, int32_t aBefore);
+ void RemoveBlock(int32_t aBlock);
+ // Returns the first block in the list, or -1 if empty
+ int32_t GetFirstBlock() const { return mFirstBlock; }
+ // Returns the last block in the list, or -1 if empty
+ int32_t GetLastBlock() const;
+ // Returns the next block in the list after aBlock or -1 if
+ // aBlock is the last block
+ int32_t GetNextBlock(int32_t aBlock) const;
+ // Returns the previous block in the list before aBlock or -1 if
+ // aBlock is the first block
+ int32_t GetPrevBlock(int32_t aBlock) const;
+ bool IsEmpty() const { return mFirstBlock < 0; }
+ int32_t GetCount() const { return mCount; }
+ // The contents of aBlockIndex1 and aBlockIndex2 have been swapped
+ void NotifyBlockSwapped(int32_t aBlockIndex1, int32_t aBlockIndex2);
+#ifdef DEBUG
+ // Verify linked-list invariants
+ void Verify();
+#else
+ void Verify() {}
+#endif
+
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ private:
+ struct Entry : public nsUint32HashKey {
+ explicit Entry(KeyTypePointer aKey) : nsUint32HashKey(aKey) { }
+ Entry(const Entry& toCopy) : nsUint32HashKey(&toCopy.GetKey()),
+ mNextBlock(toCopy.mNextBlock), mPrevBlock(toCopy.mPrevBlock) {}
+
+ int32_t mNextBlock;
+ int32_t mPrevBlock;
+ };
+ nsTHashtable<Entry> mEntries;
+
+ // The index of the first block in the list, or -1 if the list is empty.
+ int32_t mFirstBlock;
+ // The number of blocks in the list.
+ int32_t mCount;
+ };
+
+ // Returns the end of the bytes starting at the given offset
+ // which are in cache.
+ // This method assumes that the cache monitor is held and can be called on
+ // any thread.
+ int64_t GetCachedDataEndInternal(int64_t aOffset);
+ // Returns the offset of the first byte of cached data at or after aOffset,
+ // or -1 if there is no such cached data.
+ // This method assumes that the cache monitor is held and can be called on
+ // any thread.
+ int64_t GetNextCachedDataInternal(int64_t aOffset);
+ // Writes |mPartialBlock| to disk.
+ // Used by |NotifyDataEnded| and |FlushPartialBlock|.
+ // If |aNotifyAll| is true, this function will wake up readers who may be
+ // waiting on the media cache monitor. Called on the main thread only.
+ void FlushPartialBlockInternal(bool aNotify, ReentrantMonitorAutoEnter& aReentrantMonitor);
+ // A helper function to do the work of closing the stream. Assumes
+ // that the cache monitor is held. Main thread only.
+ // aReentrantMonitor is the nsAutoReentrantMonitor wrapper holding the cache monitor.
+ // This is used to NotifyAll to wake up threads that might be
+ // blocked on reading from this stream.
+ void CloseInternal(ReentrantMonitorAutoEnter& aReentrantMonitor);
+ // Update mPrincipal given that data has been received from aPrincipal
+ bool UpdatePrincipal(nsIPrincipal* aPrincipal);
+
+ // These fields are main-thread-only.
+ ChannelMediaResource* mClient;
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ // Set to true when Init or InitAsClone has been called
+ bool mInitialized;
+ // Set to true when MediaCache::Update() has finished while this stream
+ // was present.
+ bool mHasHadUpdate;
+ // Set to true when the stream has been closed either explicitly or
+ // due to an internal cache error
+ bool mClosed;
+ // True if CacheClientNotifyDataEnded has been called for this stream.
+ bool mDidNotifyDataEnded;
+
+ // The following fields must be written holding the cache's monitor and
+ // only on the main thread, thus can be read either on the main thread
+ // or while holding the cache's monitor.
+
+ // This is a unique ID representing the resource we're loading.
+ // All streams with the same mResourceID are loading the same
+ // underlying resource and should share data.
+ int64_t mResourceID;
+ // The last reported seekability state for the underlying channel
+ bool mIsTransportSeekable;
+ // True if the cache has suspended our channel because the cache is
+ // full and the priority of the data that would be received is lower
+ // than the priority of the data already in the cache
+ bool mCacheSuspended;
+ // True if the channel ended and we haven't seeked it again.
+ bool mChannelEnded;
+ // The offset where the next data from the channel will arrive
+ int64_t mChannelOffset;
+ // The reported or discovered length of the data, or -1 if nothing is
+ // known
+ int64_t mStreamLength;
+
+ // The following fields are protected by the cache's monitor can can be written
+ // by any thread.
+
+ // The offset where the reader is positioned in the stream
+ int64_t mStreamOffset;
+ // For each block in the stream data, maps to the cache entry for the
+ // block, or -1 if the block is not cached.
+ nsTArray<int32_t> mBlocks;
+ // The list of read-ahead blocks, ordered by stream offset; the first
+ // block is the earliest in the stream (so the last block will be the
+ // least valuable).
+ BlockList mReadaheadBlocks;
+ // The list of metadata blocks; the first block is the most recently used
+ BlockList mMetadataBlocks;
+ // The list of played-back blocks; the first block is the most recently used
+ BlockList mPlayedBlocks;
+ // The last reported estimate of the decoder's playback rate
+ uint32_t mPlaybackBytesPerSecond;
+ // The number of times this stream has been Pinned without a
+ // corresponding Unpin
+ uint32_t mPinCount;
+ // The status used when we did CacheClientNotifyDataEnded. Only valid
+ // when mDidNotifyDataEnded is true.
+ nsresult mNotifyDataEndedStatus;
+ // The last reported read mode
+ ReadMode mCurrentMode;
+ // True if some data in mPartialBlockBuffer has been read as metadata
+ bool mMetadataInPartialBlockBuffer;
+
+ // The following field is protected by the cache's monitor but are
+ // only written on the main thread.
+
+ // Data received for the block containing mChannelOffset. Data needs
+ // to wait here so we can write back a complete block. The first
+ // mChannelOffset%BLOCK_SIZE bytes have been filled in with good data,
+ // the rest are garbage.
+ // Use int64_t so that the data is well-aligned.
+ // Heap allocate this buffer since the exact power-of-2 will cause allocation
+ // slop when combined with the rest of the object members.
+ UniquePtr<int64_t[]> mPartialBlockBuffer;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaContentType.cpp b/dom/media/MediaContentType.cpp
new file mode 100644
index 000000000..840ab9eb8
--- /dev/null
+++ b/dom/media/MediaContentType.cpp
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaContentType.h"
+
+#include "nsContentTypeParser.h"
+
+namespace mozilla {
+
+MediaContentType::MediaContentType(const nsAString& aType)
+{
+ Populate(aType);
+}
+
+MediaContentType::MediaContentType(const nsACString& aType)
+{
+ NS_ConvertUTF8toUTF16 typeUTF16(aType);
+ Populate(typeUTF16);
+}
+
+static int32_t
+GetParameterAsNumber(const nsContentTypeParser& aParser,
+ const char* aParameter,
+ const int32_t aErrorReturn)
+{
+ nsAutoString parameterString;
+ nsresult rv = aParser.GetParameter(aParameter, parameterString);
+ if (NS_FAILED_impl(rv)) {
+ return aErrorReturn;
+ }
+ int32_t number = parameterString.ToInteger(&rv);
+ if (MOZ_UNLIKELY(NS_FAILED_impl(rv))) {
+ return aErrorReturn;
+ }
+ return number;
+}
+
+void
+MediaContentType::Populate(const nsAString& aType)
+{
+ nsContentTypeParser parser(aType);
+ nsAutoString mime;
+ nsresult rv = parser.GetType(mime);
+ if (NS_SUCCEEDED(rv)) {
+ mMIMEType = NS_ConvertUTF16toUTF8(mime);
+ }
+
+ rv = parser.GetParameter("codecs", mCodecs);
+ mHaveCodecs = NS_SUCCEEDED(rv);
+
+ mWidth = GetParameterAsNumber(parser, "width", -1);
+ mHeight = GetParameterAsNumber(parser, "height", -1);
+ mFramerate = GetParameterAsNumber(parser, "framerate", -1);
+ mBitrate = GetParameterAsNumber(parser, "bitrate", -1);
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaContentType.h b/dom/media/MediaContentType.h
new file mode 100644
index 000000000..67078757a
--- /dev/null
+++ b/dom/media/MediaContentType.h
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaContentType_h_
+#define MediaContentType_h_
+
+#include "mozilla/Maybe.h"
+#include "nsString.h"
+
+namespace mozilla {
+
+// Structure containing pre-parsed content type parameters, e.g.:
+// MIME type, optional codecs, etc.
+class MediaContentType
+{
+public:
+ // Parse UTF16 string to extract parameters.
+ explicit MediaContentType(const nsAString& aType);
+ // Parse UTF8 string to extract parameters.
+ explicit MediaContentType(const nsACString& aType);
+
+ bool IsValid() const { return !GetMIMEType().IsEmpty(); }
+
+ // MIME type. Empty if construction arguments could not be parsed.
+ const nsACString& GetMIMEType() const { return mMIMEType; }
+
+ // Was there an explicit 'codecs' parameter provided?
+ bool HaveCodecs() const { return mHaveCodecs; }
+ // Codecs. May be empty if not provided or explicitly provided as empty.
+ const nsAString& GetCodecs() const { return mCodecs; }
+
+ // Sizes and rates.
+ Maybe<int32_t> GetWidth() const { return GetMaybeNumber(mWidth); }
+ Maybe<int32_t> GetHeight() const { return GetMaybeNumber(mHeight); }
+ Maybe<int32_t> GetFramerate() const { return GetMaybeNumber(mFramerate); }
+ Maybe<int32_t> GetBitrate() const { return GetMaybeNumber(mBitrate); }
+
+private:
+ void Populate(const nsAString& aType);
+
+ Maybe<int32_t> GetMaybeNumber(int32_t aNumber) const
+ {
+ return (aNumber < 0) ? Maybe<int32_t>(Nothing()) : Some(int32_t(aNumber));
+ }
+
+ nsCString mMIMEType; // UTF8 MIME type. Empty if parsing failed.
+ bool mHaveCodecs; // If false, mCodecs must be empty.
+ nsString mCodecs;
+ int32_t mWidth; // -1 if not provided.
+ int32_t mHeight; // -1 if not provided.
+ int32_t mFramerate; // -1 if not provided.
+ int32_t mBitrate; // -1 if not provided.
+};
+
+} // namespace mozilla
+
+#endif // MediaContentType_h_
diff --git a/dom/media/MediaData.cpp b/dom/media/MediaData.cpp
new file mode 100644
index 000000000..0439a7473
--- /dev/null
+++ b/dom/media/MediaData.cpp
@@ -0,0 +1,475 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaData.h"
+#include "MediaInfo.h"
+#include "VideoUtils.h"
+#include "ImageContainer.h"
+
+#ifdef MOZ_WIDGET_GONK
+#include <cutils/properties.h>
+#endif
+#include <stdint.h>
+
+namespace mozilla {
+
+using namespace mozilla::gfx;
+using layers::ImageContainer;
+using layers::PlanarYCbCrImage;
+using layers::PlanarYCbCrData;
+
+const char* AudioData::sTypeName = "audio";
+const char* VideoData::sTypeName = "video";
+
+void
+AudioData::EnsureAudioBuffer()
+{
+ if (mAudioBuffer)
+ return;
+ mAudioBuffer = SharedBuffer::Create(mFrames*mChannels*sizeof(AudioDataValue));
+
+ AudioDataValue* data = static_cast<AudioDataValue*>(mAudioBuffer->Data());
+ for (uint32_t i = 0; i < mFrames; ++i) {
+ for (uint32_t j = 0; j < mChannels; ++j) {
+ data[j*mFrames + i] = mAudioData[i*mChannels + j];
+ }
+ }
+}
+
+size_t
+AudioData::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t size =
+ aMallocSizeOf(this) + mAudioData.SizeOfExcludingThis(aMallocSizeOf);
+ if (mAudioBuffer) {
+ size += mAudioBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return size;
+}
+
+bool
+AudioData::IsAudible() const
+{
+ if (!mAudioData) {
+ return false;
+ }
+
+ for (uint32_t frame = 0; frame < mFrames; ++frame) {
+ for (uint32_t channel = 0; channel < mChannels; ++channel) {
+ if (mAudioData[frame * mChannels + channel] != 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/* static */
+already_AddRefed<AudioData>
+AudioData::TransferAndUpdateTimestampAndDuration(AudioData* aOther,
+ int64_t aTimestamp,
+ int64_t aDuration)
+{
+ NS_ENSURE_TRUE(aOther, nullptr);
+ RefPtr<AudioData> v = new AudioData(aOther->mOffset,
+ aTimestamp,
+ aDuration,
+ aOther->mFrames,
+ Move(aOther->mAudioData),
+ aOther->mChannels,
+ aOther->mRate);
+ return v.forget();
+}
+
+static bool
+ValidatePlane(const VideoData::YCbCrBuffer::Plane& aPlane)
+{
+ return aPlane.mWidth <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aPlane.mHeight <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aPlane.mWidth * aPlane.mHeight < MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT &&
+ aPlane.mStride > 0;
+}
+
+#ifdef MOZ_WIDGET_GONK
+static bool
+IsYV12Format(const VideoData::YCbCrBuffer::Plane& aYPlane,
+ const VideoData::YCbCrBuffer::Plane& aCbPlane,
+ const VideoData::YCbCrBuffer::Plane& aCrPlane)
+{
+ return
+ aYPlane.mWidth % 2 == 0 &&
+ aYPlane.mHeight % 2 == 0 &&
+ aYPlane.mWidth / 2 == aCbPlane.mWidth &&
+ aYPlane.mHeight / 2 == aCbPlane.mHeight &&
+ aCbPlane.mWidth == aCrPlane.mWidth &&
+ aCbPlane.mHeight == aCrPlane.mHeight;
+}
+
+static bool
+IsInEmulator()
+{
+ char propQemu[PROPERTY_VALUE_MAX];
+ property_get("ro.kernel.qemu", propQemu, "");
+ return !strncmp(propQemu, "1", 1);
+}
+
+#endif
+
+VideoData::VideoData(int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ bool aKeyframe,
+ int64_t aTimecode,
+ IntSize aDisplay,
+ layers::ImageContainer::FrameID aFrameID)
+ : MediaData(VIDEO_DATA, aOffset, aTime, aDuration, 1)
+ , mDisplay(aDisplay)
+ , mFrameID(aFrameID)
+ , mSentToCompositor(false)
+{
+ NS_ASSERTION(mDuration >= 0, "Frame must have non-negative duration.");
+ mKeyframe = aKeyframe;
+ mTimecode = aTimecode;
+}
+
+VideoData::~VideoData()
+{
+}
+
+size_t
+VideoData::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t size = aMallocSizeOf(this);
+
+ // Currently only PLANAR_YCBCR has a well defined function for determining
+ // it's size, so reporting is limited to that type.
+ if (mImage && mImage->GetFormat() == ImageFormat::PLANAR_YCBCR) {
+ const mozilla::layers::PlanarYCbCrImage* img =
+ static_cast<const mozilla::layers::PlanarYCbCrImage*>(mImage.get());
+ size += img->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return size;
+}
+
+/* static */
+already_AddRefed<VideoData>
+VideoData::ShallowCopyUpdateDuration(const VideoData* aOther,
+ int64_t aDuration)
+{
+ RefPtr<VideoData> v = new VideoData(aOther->mOffset,
+ aOther->mTime,
+ aDuration,
+ aOther->mKeyframe,
+ aOther->mTimecode,
+ aOther->mDisplay,
+ aOther->mFrameID);
+ v->mImage = aOther->mImage;
+ return v.forget();
+}
+
+/* static */
+already_AddRefed<VideoData>
+VideoData::ShallowCopyUpdateTimestamp(const VideoData* aOther,
+ int64_t aTimestamp)
+{
+ NS_ENSURE_TRUE(aOther, nullptr);
+ RefPtr<VideoData> v = new VideoData(aOther->mOffset,
+ aTimestamp,
+ aOther->GetEndTime() - aTimestamp,
+ aOther->mKeyframe,
+ aOther->mTimecode,
+ aOther->mDisplay,
+ aOther->mFrameID);
+ v->mImage = aOther->mImage;
+ return v.forget();
+}
+
+/* static */
+already_AddRefed<VideoData>
+VideoData::ShallowCopyUpdateTimestampAndDuration(const VideoData* aOther,
+ int64_t aTimestamp,
+ int64_t aDuration)
+{
+ NS_ENSURE_TRUE(aOther, nullptr);
+ RefPtr<VideoData> v = new VideoData(aOther->mOffset,
+ aTimestamp,
+ aDuration,
+ aOther->mKeyframe,
+ aOther->mTimecode,
+ aOther->mDisplay,
+ aOther->mFrameID);
+ v->mImage = aOther->mImage;
+ return v.forget();
+}
+
+/* static */
+bool VideoData::SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
+ const VideoInfo& aInfo,
+ const YCbCrBuffer &aBuffer,
+ const IntRect& aPicture,
+ bool aCopyData)
+{
+ if (!aVideoImage) {
+ return false;
+ }
+ const YCbCrBuffer::Plane &Y = aBuffer.mPlanes[0];
+ const YCbCrBuffer::Plane &Cb = aBuffer.mPlanes[1];
+ const YCbCrBuffer::Plane &Cr = aBuffer.mPlanes[2];
+
+ PlanarYCbCrData data;
+ data.mYChannel = Y.mData + Y.mOffset;
+ data.mYSize = IntSize(Y.mWidth, Y.mHeight);
+ data.mYStride = Y.mStride;
+ data.mYSkip = Y.mSkip;
+ data.mCbChannel = Cb.mData + Cb.mOffset;
+ data.mCrChannel = Cr.mData + Cr.mOffset;
+ data.mCbCrSize = IntSize(Cb.mWidth, Cb.mHeight);
+ data.mCbCrStride = Cb.mStride;
+ data.mCbSkip = Cb.mSkip;
+ data.mCrSkip = Cr.mSkip;
+ data.mPicX = aPicture.x;
+ data.mPicY = aPicture.y;
+ data.mPicSize = aPicture.Size();
+ data.mStereoMode = aInfo.mStereoMode;
+ data.mYUVColorSpace = aBuffer.mYUVColorSpace;
+
+ aVideoImage->SetDelayedConversion(true);
+ if (aCopyData) {
+ return aVideoImage->CopyData(data);
+ } else {
+ return aVideoImage->AdoptData(data);
+ }
+}
+
+/* static */
+already_AddRefed<VideoData>
+VideoData::CreateAndCopyData(const VideoInfo& aInfo,
+ ImageContainer* aContainer,
+ int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ const YCbCrBuffer& aBuffer,
+ bool aKeyframe,
+ int64_t aTimecode,
+ const IntRect& aPicture)
+{
+ if (!aContainer) {
+ // Create a dummy VideoData with no image. This gives us something to
+ // send to media streams if necessary.
+ RefPtr<VideoData> v(new VideoData(aOffset,
+ aTime,
+ aDuration,
+ aKeyframe,
+ aTimecode,
+ aInfo.mDisplay,
+ 0));
+ return v.forget();
+ }
+
+ // The following situation should never happen unless there is a bug
+ // in the decoder
+ if (aBuffer.mPlanes[1].mWidth != aBuffer.mPlanes[2].mWidth ||
+ aBuffer.mPlanes[1].mHeight != aBuffer.mPlanes[2].mHeight) {
+ NS_ERROR("C planes with different sizes");
+ return nullptr;
+ }
+
+ // The following situations could be triggered by invalid input
+ if (aPicture.width <= 0 || aPicture.height <= 0) {
+ // In debug mode, makes the error more noticeable
+ MOZ_ASSERT(false, "Empty picture rect");
+ return nullptr;
+ }
+ if (!ValidatePlane(aBuffer.mPlanes[0]) || !ValidatePlane(aBuffer.mPlanes[1]) ||
+ !ValidatePlane(aBuffer.mPlanes[2])) {
+ NS_WARNING("Invalid plane size");
+ return nullptr;
+ }
+
+ // Ensure the picture size specified in the headers can be extracted out of
+ // the frame we've been supplied without indexing out of bounds.
+ CheckedUint32 xLimit = aPicture.x + CheckedUint32(aPicture.width);
+ CheckedUint32 yLimit = aPicture.y + CheckedUint32(aPicture.height);
+ if (!xLimit.isValid() || xLimit.value() > aBuffer.mPlanes[0].mStride ||
+ !yLimit.isValid() || yLimit.value() > aBuffer.mPlanes[0].mHeight)
+ {
+ // The specified picture dimensions can't be contained inside the video
+ // frame, we'll stomp memory if we try to copy it. Fail.
+ NS_WARNING("Overflowing picture rect");
+ return nullptr;
+ }
+
+ RefPtr<VideoData> v(new VideoData(aOffset,
+ aTime,
+ aDuration,
+ aKeyframe,
+ aTimecode,
+ aInfo.mDisplay,
+ 0));
+#ifdef MOZ_WIDGET_GONK
+ const YCbCrBuffer::Plane &Y = aBuffer.mPlanes[0];
+ const YCbCrBuffer::Plane &Cb = aBuffer.mPlanes[1];
+ const YCbCrBuffer::Plane &Cr = aBuffer.mPlanes[2];
+#endif
+
+ // Currently our decoder only knows how to output to ImageFormat::PLANAR_YCBCR
+ // format.
+#ifdef MOZ_WIDGET_GONK
+ if (IsYV12Format(Y, Cb, Cr) && !IsInEmulator()) {
+ v->mImage = new layers::GrallocImage();
+ }
+#endif
+ if (!v->mImage) {
+ v->mImage = aContainer->CreatePlanarYCbCrImage();
+ }
+
+ if (!v->mImage) {
+ return nullptr;
+ }
+ NS_ASSERTION(v->mImage->GetFormat() == ImageFormat::PLANAR_YCBCR ||
+ v->mImage->GetFormat() == ImageFormat::GRALLOC_PLANAR_YCBCR,
+ "Wrong format?");
+ PlanarYCbCrImage* videoImage = v->mImage->AsPlanarYCbCrImage();
+ MOZ_ASSERT(videoImage);
+
+ if (!VideoData::SetVideoDataToImage(videoImage, aInfo, aBuffer, aPicture,
+ true /* aCopyData */)) {
+ return nullptr;
+ }
+
+#ifdef MOZ_WIDGET_GONK
+ if (!videoImage->IsValid() && IsYV12Format(Y, Cb, Cr)) {
+ // Failed to allocate gralloc. Try fallback.
+ v->mImage = aContainer->CreatePlanarYCbCrImage();
+ if (!v->mImage) {
+ return nullptr;
+ }
+ videoImage = v->mImage->AsPlanarYCbCrImage();
+ if (!VideoData::SetVideoDataToImage(videoImage, aInfo, aBuffer, aPicture,
+ true /* aCopyData */)) {
+ return nullptr;
+ }
+ }
+#endif
+ return v.forget();
+}
+
+/* static */
+already_AddRefed<VideoData>
+VideoData::CreateFromImage(const VideoInfo& aInfo,
+ int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ const RefPtr<Image>& aImage,
+ bool aKeyframe,
+ int64_t aTimecode,
+ const IntRect& aPicture)
+{
+ RefPtr<VideoData> v(new VideoData(aOffset,
+ aTime,
+ aDuration,
+ aKeyframe,
+ aTimecode,
+ aInfo.mDisplay,
+ 0));
+ v->mImage = aImage;
+ return v.forget();
+}
+
+MediaRawData::MediaRawData()
+ : MediaData(RAW_DATA, 0)
+ , mCrypto(mCryptoInternal)
+{
+}
+
+MediaRawData::MediaRawData(const uint8_t* aData, size_t aSize)
+ : MediaData(RAW_DATA, 0)
+ , mCrypto(mCryptoInternal)
+ , mBuffer(aData, aSize)
+{
+}
+
+already_AddRefed<MediaRawData>
+MediaRawData::Clone() const
+{
+ RefPtr<MediaRawData> s = new MediaRawData;
+ s->mTimecode = mTimecode;
+ s->mTime = mTime;
+ s->mDuration = mDuration;
+ s->mOffset = mOffset;
+ s->mKeyframe = mKeyframe;
+ s->mExtraData = mExtraData;
+ s->mCryptoInternal = mCryptoInternal;
+ s->mTrackInfo = mTrackInfo;
+ s->mEOS = mEOS;
+ if (!s->mBuffer.Append(mBuffer.Data(), mBuffer.Length())) {
+ return nullptr;
+ }
+ return s.forget();
+}
+
+MediaRawData::~MediaRawData()
+{
+}
+
+size_t
+MediaRawData::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t size = aMallocSizeOf(this);
+ size += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
+ return size;
+}
+
+MediaRawDataWriter*
+MediaRawData::CreateWriter()
+{
+ return new MediaRawDataWriter(this);
+}
+
+MediaRawDataWriter::MediaRawDataWriter(MediaRawData* aMediaRawData)
+ : mCrypto(aMediaRawData->mCryptoInternal)
+ , mTarget(aMediaRawData)
+{
+}
+
+bool
+MediaRawDataWriter::SetSize(size_t aSize)
+{
+ return mTarget->mBuffer.SetLength(aSize);
+}
+
+bool
+MediaRawDataWriter::Prepend(const uint8_t* aData, size_t aSize)
+{
+ return mTarget->mBuffer.Prepend(aData, aSize);
+}
+
+bool
+MediaRawDataWriter::Replace(const uint8_t* aData, size_t aSize)
+{
+ return mTarget->mBuffer.Replace(aData, aSize);
+}
+
+void
+MediaRawDataWriter::Clear()
+{
+ mTarget->mBuffer.Clear();
+}
+
+uint8_t*
+MediaRawDataWriter::Data()
+{
+ return mTarget->mBuffer.Data();
+}
+
+size_t
+MediaRawDataWriter::Size()
+{
+ return mTarget->Size();
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaData.h b/dom/media/MediaData.h
new file mode 100644
index 000000000..a79aac6ed
--- /dev/null
+++ b/dom/media/MediaData.h
@@ -0,0 +1,677 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(MediaData_h)
+#define MediaData_h
+
+#include "AudioSampleFormat.h"
+#include "ImageTypes.h"
+#include "nsSize.h"
+#include "mozilla/gfx/Rect.h"
+#include "nsRect.h"
+#include "nsIMemoryReporter.h"
+#include "SharedBuffer.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/UniquePtrExtensions.h"
+#include "nsTArray.h"
+#include "mozilla/CheckedInt.h"
+#include "mozilla/PodOperations.h"
+
+namespace mozilla {
+
+namespace layers {
+class Image;
+class ImageContainer;
+} // namespace layers
+
+class MediaByteBuffer;
+class SharedTrackInfo;
+
+// AlignedBuffer:
+// Memory allocations are fallibles. Methods return a boolean indicating if
+// memory allocations were successful. Return values should always be checked.
+// AlignedBuffer::mData will be nullptr if no memory has been allocated or if
+// an error occurred during construction.
+// Existing data is only ever modified if new memory allocation has succeeded
+// and preserved if not.
+//
+// The memory referenced by mData will always be Alignment bytes aligned and the
+// underlying buffer will always have a size such that Alignment bytes blocks
+// can be used to read the content, regardless of the mSize value. Buffer is
+// zeroed on creation, elements are not individually constructed.
+// An Alignment value of 0 means that the data isn't aligned.
+//
+// Type must be trivially copyable.
+//
+// AlignedBuffer can typically be used in place of UniquePtr<Type[]> however
+// care must be taken as all memory allocations are fallible.
+// Example:
+// auto buffer = MakeUniqueFallible<float[]>(samples)
+// becomes: AlignedFloatBuffer buffer(samples)
+//
+// auto buffer = MakeUnique<float[]>(samples)
+// becomes:
+// AlignedFloatBuffer buffer(samples);
+// if (!buffer) { return NS_ERROR_OUT_OF_MEMORY; }
+
+template <typename Type, int Alignment = 32>
+class AlignedBuffer
+{
+public:
+ AlignedBuffer()
+ : mData(nullptr)
+ , mLength(0)
+ , mBuffer(nullptr)
+ , mCapacity(0)
+ {}
+
+ explicit AlignedBuffer(size_t aLength)
+ : mData(nullptr)
+ , mLength(0)
+ , mBuffer(nullptr)
+ , mCapacity(0)
+ {
+ if (EnsureCapacity(aLength)) {
+ mLength = aLength;
+ }
+ }
+
+ AlignedBuffer(const Type* aData, size_t aLength)
+ : AlignedBuffer(aLength)
+ {
+ if (!mData) {
+ return;
+ }
+ PodCopy(mData, aData, aLength);
+ }
+
+ AlignedBuffer(const AlignedBuffer& aOther)
+ : AlignedBuffer(aOther.Data(), aOther.Length())
+ {}
+
+ AlignedBuffer(AlignedBuffer&& aOther)
+ : mData(aOther.mData)
+ , mLength(aOther.mLength)
+ , mBuffer(Move(aOther.mBuffer))
+ , mCapacity(aOther.mCapacity)
+ {
+ aOther.mData = nullptr;
+ aOther.mLength = 0;
+ aOther.mCapacity = 0;
+ }
+
+ AlignedBuffer& operator=(AlignedBuffer&& aOther)
+ {
+ this->~AlignedBuffer();
+ new (this) AlignedBuffer(Move(aOther));
+ return *this;
+ }
+
+ Type* Data() const { return mData; }
+ size_t Length() const { return mLength; }
+ size_t Size() const { return mLength * sizeof(Type); }
+ Type& operator[](size_t aIndex)
+ {
+ MOZ_ASSERT(aIndex < mLength);
+ return mData[aIndex];
+ }
+ const Type& operator[](size_t aIndex) const
+ {
+ MOZ_ASSERT(aIndex < mLength);
+ return mData[aIndex];
+ }
+ // Set length of buffer, allocating memory as required.
+ // If length is increased, new buffer area is filled with 0.
+ bool SetLength(size_t aLength)
+ {
+ if (aLength > mLength && !EnsureCapacity(aLength)) {
+ return false;
+ }
+ mLength = aLength;
+ return true;
+ }
+ // Add aData at the beginning of buffer.
+ bool Prepend(const Type* aData, size_t aLength)
+ {
+ if (!EnsureCapacity(aLength + mLength)) {
+ return false;
+ }
+
+ // Shift the data to the right by aLength to leave room for the new data.
+ PodMove(mData + aLength, mData, mLength);
+ PodCopy(mData, aData, aLength);
+
+ mLength += aLength;
+ return true;
+ }
+ // Add aData at the end of buffer.
+ bool Append(const Type* aData, size_t aLength)
+ {
+ if (!EnsureCapacity(aLength + mLength)) {
+ return false;
+ }
+
+ PodCopy(mData + mLength, aData, aLength);
+
+ mLength += aLength;
+ return true;
+ }
+ // Replace current content with aData.
+ bool Replace(const Type* aData, size_t aLength)
+ {
+ // If aLength is smaller than our current length, we leave the buffer as is,
+ // only adjusting the reported length.
+ if (!EnsureCapacity(aLength)) {
+ return false;
+ }
+
+ PodCopy(mData, aData, aLength);
+ mLength = aLength;
+ return true;
+ }
+ // Clear the memory buffer. Will set target mData and mLength to 0.
+ void Clear()
+ {
+ mLength = 0;
+ mData = nullptr;
+ }
+
+ // Methods for reporting memory.
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t size = aMallocSizeOf(this);
+ size += aMallocSizeOf(mBuffer.get());
+ return size;
+ }
+ // AlignedBuffer is typically allocated on the stack. As such, you likely
+ // want to use SizeOfExcludingThis
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(mBuffer.get());
+ }
+ size_t ComputedSizeOfExcludingThis() const
+ {
+ return mCapacity;
+ }
+
+ // For backward compatibility with UniquePtr<Type[]>
+ Type* get() const { return mData; }
+ explicit operator bool() const { return mData != nullptr; }
+
+ // Size in bytes of extra space allocated for padding.
+ static size_t AlignmentPaddingSize()
+ {
+ return AlignmentOffset() * 2;
+ }
+
+private:
+ static size_t AlignmentOffset()
+ {
+ return Alignment ? Alignment - 1 : 0;
+ }
+
+ // Ensure that the backend buffer can hold aLength data. Will update mData.
+ // Will enforce that the start of allocated data is always Alignment bytes
+ // aligned and that it has sufficient end padding to allow for Alignment bytes
+ // block read as required by some data decoders.
+ // Returns false if memory couldn't be allocated.
+ bool EnsureCapacity(size_t aLength)
+ {
+ if (!aLength) {
+ // No need to allocate a buffer yet.
+ return true;
+ }
+ const CheckedInt<size_t> sizeNeeded =
+ CheckedInt<size_t>(aLength) * sizeof(Type) + AlignmentPaddingSize();
+
+ if (!sizeNeeded.isValid() || sizeNeeded.value() >= INT32_MAX) {
+ // overflow or over an acceptable size.
+ return false;
+ }
+ if (mData && mCapacity >= sizeNeeded.value()) {
+ return true;
+ }
+ auto newBuffer = MakeUniqueFallible<uint8_t[]>(sizeNeeded.value());
+ if (!newBuffer) {
+ return false;
+ }
+
+ // Find alignment address.
+ const uintptr_t alignmask = AlignmentOffset();
+ Type* newData = reinterpret_cast<Type*>(
+ (reinterpret_cast<uintptr_t>(newBuffer.get()) + alignmask) & ~alignmask);
+ MOZ_ASSERT(uintptr_t(newData) % (AlignmentOffset()+1) == 0);
+
+ MOZ_ASSERT(!mLength || mData);
+
+ PodZero(newData + mLength, aLength - mLength);
+ if (mLength) {
+ PodCopy(newData, mData, mLength);
+ }
+
+ mBuffer = Move(newBuffer);
+ mCapacity = sizeNeeded.value();
+ mData = newData;
+
+ return true;
+ }
+ Type* mData;
+ size_t mLength;
+ UniquePtr<uint8_t[]> mBuffer;
+ size_t mCapacity;
+};
+
+typedef AlignedBuffer<uint8_t> AlignedByteBuffer;
+typedef AlignedBuffer<float> AlignedFloatBuffer;
+typedef AlignedBuffer<int16_t> AlignedShortBuffer;
+typedef AlignedBuffer<AudioDataValue> AlignedAudioBuffer;
+
+// Container that holds media samples.
+class MediaData {
+public:
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaData)
+
+ enum Type {
+ AUDIO_DATA = 0,
+ VIDEO_DATA,
+ RAW_DATA,
+ NULL_DATA
+ };
+
+ MediaData(Type aType,
+ int64_t aOffset,
+ int64_t aTimestamp,
+ int64_t aDuration,
+ uint32_t aFrames)
+ : mType(aType)
+ , mOffset(aOffset)
+ , mTime(aTimestamp)
+ , mTimecode(aTimestamp)
+ , mDuration(aDuration)
+ , mFrames(aFrames)
+ , mKeyframe(false)
+ {}
+
+ // Type of contained data.
+ const Type mType;
+
+ // Approximate byte offset where this data was demuxed from its media.
+ int64_t mOffset;
+
+ // Start time of sample, in microseconds.
+ int64_t mTime;
+
+ // Codec specific internal time code. For Ogg based codecs this is the
+ // granulepos.
+ int64_t mTimecode;
+
+ // Duration of sample, in microseconds.
+ int64_t mDuration;
+
+ // Amount of frames for contained data.
+ const uint32_t mFrames;
+
+ bool mKeyframe;
+
+ int64_t GetEndTime() const { return mTime + mDuration; }
+
+ bool AdjustForStartTime(int64_t aStartTime)
+ {
+ mTime = mTime - aStartTime;
+ return mTime >= 0;
+ }
+
+ template <typename ReturnType>
+ const ReturnType* As() const
+ {
+ MOZ_ASSERT(this->mType == ReturnType::sType);
+ return static_cast<const ReturnType*>(this);
+ }
+
+ template <typename ReturnType>
+ ReturnType* As()
+ {
+ MOZ_ASSERT(this->mType == ReturnType::sType);
+ return static_cast<ReturnType*>(this);
+ }
+
+protected:
+ MediaData(Type aType, uint32_t aFrames)
+ : mType(aType)
+ , mOffset(0)
+ , mTime(0)
+ , mTimecode(0)
+ , mDuration(0)
+ , mFrames(aFrames)
+ , mKeyframe(false)
+ {}
+
+ virtual ~MediaData() {}
+
+};
+
+// NullData is for decoder generating a sample which doesn't need to be
+// rendered.
+class NullData : public MediaData {
+public:
+ NullData(int64_t aOffset, int64_t aTime, int64_t aDuration)
+ : MediaData(NULL_DATA, aOffset, aTime, aDuration, 0)
+ {}
+
+ static const Type sType = NULL_DATA;
+};
+
+// Holds chunk a decoded audio frames.
+class AudioData : public MediaData {
+public:
+
+ AudioData(int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ uint32_t aFrames,
+ AlignedAudioBuffer&& aData,
+ uint32_t aChannels,
+ uint32_t aRate)
+ : MediaData(sType, aOffset, aTime, aDuration, aFrames)
+ , mChannels(aChannels)
+ , mRate(aRate)
+ , mAudioData(Move(aData)) {}
+
+ static const Type sType = AUDIO_DATA;
+ static const char* sTypeName;
+
+ // Creates a new AudioData identical to aOther, but with a different
+ // specified timestamp and duration. All data from aOther is copied
+ // into the new AudioData but the audio data which is transferred.
+ // After such call, the original aOther is unusable.
+ static already_AddRefed<AudioData>
+ TransferAndUpdateTimestampAndDuration(AudioData* aOther,
+ int64_t aTimestamp,
+ int64_t aDuration);
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+
+ // If mAudioBuffer is null, creates it from mAudioData.
+ void EnsureAudioBuffer();
+
+ // To check whether mAudioData has audible signal, it's used to distinguish
+ // the audiable data and silent data.
+ bool IsAudible() const;
+
+ const uint32_t mChannels;
+ const uint32_t mRate;
+ // At least one of mAudioBuffer/mAudioData must be non-null.
+ // mChannels channels, each with mFrames frames
+ RefPtr<SharedBuffer> mAudioBuffer;
+ // mFrames frames, each with mChannels values
+ AlignedAudioBuffer mAudioData;
+
+protected:
+ ~AudioData() {}
+};
+
+namespace layers {
+class TextureClient;
+class PlanarYCbCrImage;
+} // namespace layers
+
+class VideoInfo;
+
+// Holds a decoded video frame, in YCbCr format. These are queued in the reader.
+class VideoData : public MediaData {
+public:
+ typedef gfx::IntRect IntRect;
+ typedef gfx::IntSize IntSize;
+ typedef layers::ImageContainer ImageContainer;
+ typedef layers::Image Image;
+ typedef layers::PlanarYCbCrImage PlanarYCbCrImage;
+
+ static const Type sType = VIDEO_DATA;
+ static const char* sTypeName;
+
+ // YCbCr data obtained from decoding the video. The index's are:
+ // 0 = Y
+ // 1 = Cb
+ // 2 = Cr
+ struct YCbCrBuffer {
+ struct Plane {
+ uint8_t* mData;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mStride;
+ uint32_t mOffset;
+ uint32_t mSkip;
+ };
+
+ Plane mPlanes[3];
+ YUVColorSpace mYUVColorSpace = YUVColorSpace::BT601;
+ };
+
+ // Constructs a VideoData object. If aImage is nullptr, creates a new Image
+ // holding a copy of the YCbCr data passed in aBuffer. If aImage is not
+ // nullptr, it's stored as the underlying video image and aBuffer is assumed
+ // to point to memory within aImage so no copy is made. aTimecode is a codec
+ // specific number representing the timestamp of the frame of video data.
+ // Returns nsnull if an error occurs. This may indicate that memory couldn't
+ // be allocated to create the VideoData object, or it may indicate some
+ // problem with the input data (e.g. negative stride).
+
+
+ // Creates a new VideoData containing a deep copy of aBuffer. May use aContainer
+ // to allocate an Image to hold the copied data.
+ static already_AddRefed<VideoData> CreateAndCopyData(const VideoInfo& aInfo,
+ ImageContainer* aContainer,
+ int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ const YCbCrBuffer &aBuffer,
+ bool aKeyframe,
+ int64_t aTimecode,
+ const IntRect& aPicture);
+
+ static already_AddRefed<VideoData> CreateAndCopyIntoTextureClient(const VideoInfo& aInfo,
+ int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ layers::TextureClient* aBuffer,
+ bool aKeyframe,
+ int64_t aTimecode,
+ const IntRect& aPicture);
+
+ static already_AddRefed<VideoData> CreateFromImage(const VideoInfo& aInfo,
+ int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ const RefPtr<Image>& aImage,
+ bool aKeyframe,
+ int64_t aTimecode,
+ const IntRect& aPicture);
+
+ // Creates a new VideoData identical to aOther, but with a different
+ // specified duration. All data from aOther is copied into the new
+ // VideoData. The new VideoData's mImage field holds a reference to
+ // aOther's mImage, i.e. the Image is not copied. This function is useful
+ // in reader backends that can't determine the duration of a VideoData
+ // until the next frame is decoded, i.e. it's a way to change the const
+ // duration field on a VideoData.
+ static already_AddRefed<VideoData> ShallowCopyUpdateDuration(const VideoData* aOther,
+ int64_t aDuration);
+
+ // Creates a new VideoData identical to aOther, but with a different
+ // specified timestamp. All data from aOther is copied into the new
+ // VideoData, as ShallowCopyUpdateDuration() does.
+ static already_AddRefed<VideoData> ShallowCopyUpdateTimestamp(const VideoData* aOther,
+ int64_t aTimestamp);
+
+ // Creates a new VideoData identical to aOther, but with a different
+ // specified timestamp and duration. All data from aOther is copied
+ // into the new VideoData, as ShallowCopyUpdateDuration() does.
+ static already_AddRefed<VideoData>
+ ShallowCopyUpdateTimestampAndDuration(const VideoData* aOther, int64_t aTimestamp,
+ int64_t aDuration);
+
+ // Initialize PlanarYCbCrImage. Only When aCopyData is true,
+ // video data is copied to PlanarYCbCrImage.
+ static bool SetVideoDataToImage(PlanarYCbCrImage* aVideoImage,
+ const VideoInfo& aInfo,
+ const YCbCrBuffer &aBuffer,
+ const IntRect& aPicture,
+ bool aCopyData);
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+
+ // Dimensions at which to display the video frame. The picture region
+ // will be scaled to this size. This is should be the picture region's
+ // dimensions scaled with respect to its aspect ratio.
+ const IntSize mDisplay;
+
+ // This frame's image.
+ RefPtr<Image> mImage;
+
+ int32_t mFrameID;
+
+ bool mSentToCompositor;
+
+ VideoData(int64_t aOffset,
+ int64_t aTime,
+ int64_t aDuration,
+ bool aKeyframe,
+ int64_t aTimecode,
+ IntSize aDisplay,
+ uint32_t aFrameID);
+
+protected:
+ ~VideoData();
+};
+
+class CryptoTrack
+{
+public:
+ CryptoTrack() : mValid(false), mMode(0), mIVSize(0) {}
+ bool mValid;
+ int32_t mMode;
+ int32_t mIVSize;
+ nsTArray<uint8_t> mKeyId;
+};
+
+class CryptoSample : public CryptoTrack
+{
+public:
+ nsTArray<uint16_t> mPlainSizes;
+ nsTArray<uint32_t> mEncryptedSizes;
+ nsTArray<uint8_t> mIV;
+ nsTArray<nsCString> mSessionIds;
+};
+
+// MediaRawData is a MediaData container used to store demuxed, still compressed
+// samples.
+// Use MediaRawData::CreateWriter() to obtain a MediaRawDataWriter object that
+// provides methods to modify and manipulate the data.
+// Memory allocations are fallible. Methods return a boolean indicating if
+// memory allocations were successful. Return values should always be checked.
+// MediaRawData::mData will be nullptr if no memory has been allocated or if
+// an error occurred during construction.
+// Existing data is only ever modified if new memory allocation has succeeded
+// and preserved if not.
+//
+// The memory referenced by mData will always be 32 bytes aligned and the
+// underlying buffer will always have a size such that 32 bytes blocks can be
+// used to read the content, regardless of the mSize value. Buffer is zeroed
+// on creation.
+//
+// Typical usage: create new MediaRawData; create the associated
+// MediaRawDataWriter, call SetSize() to allocate memory, write to mData,
+// up to mSize bytes.
+
+class MediaRawData;
+
+class MediaRawDataWriter
+{
+public:
+ // Pointer to data or null if not-yet allocated
+ uint8_t* Data();
+ // Writeable size of buffer.
+ size_t Size();
+ // Writeable reference to MediaRawData::mCryptoInternal
+ CryptoSample& mCrypto;
+
+ // Data manipulation methods. mData and mSize may be updated accordingly.
+
+ // Set size of buffer, allocating memory as required.
+ // If size is increased, new buffer area is filled with 0.
+ bool SetSize(size_t aSize);
+ // Add aData at the beginning of buffer.
+ bool Prepend(const uint8_t* aData, size_t aSize);
+ // Replace current content with aData.
+ bool Replace(const uint8_t* aData, size_t aSize);
+ // Clear the memory buffer. Will set target mData and mSize to 0.
+ void Clear();
+
+private:
+ friend class MediaRawData;
+ explicit MediaRawDataWriter(MediaRawData* aMediaRawData);
+ bool EnsureSize(size_t aSize);
+ MediaRawData* mTarget;
+};
+
+class MediaRawData : public MediaData {
+public:
+ MediaRawData();
+ MediaRawData(const uint8_t* aData, size_t mSize);
+
+ // Pointer to data or null if not-yet allocated
+ const uint8_t* Data() const { return mBuffer.Data(); }
+ // Size of buffer.
+ size_t Size() const { return mBuffer.Length(); }
+ size_t ComputedSizeOfIncludingThis() const
+ {
+ return sizeof(*this) + mBuffer.ComputedSizeOfExcludingThis();
+ }
+
+ const CryptoSample& mCrypto;
+ RefPtr<MediaByteBuffer> mExtraData;
+
+ // Used by the Vorbis decoder and Ogg demuxer.
+ // Indicates that this is the last packet of the stream.
+ bool mEOS = false;
+
+ // Indicate to the audio decoder that mDiscardPadding frames should be
+ // trimmed.
+ uint32_t mDiscardPadding = 0;
+
+ RefPtr<SharedTrackInfo> mTrackInfo;
+
+ // Return a deep copy or nullptr if out of memory.
+ virtual already_AddRefed<MediaRawData> Clone() const;
+ // Create a MediaRawDataWriter for this MediaRawData. The caller must
+ // delete the writer once done. The writer is not thread-safe.
+ virtual MediaRawDataWriter* CreateWriter();
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+
+protected:
+ ~MediaRawData();
+
+private:
+ friend class MediaRawDataWriter;
+ AlignedByteBuffer mBuffer;
+ CryptoSample mCryptoInternal;
+ MediaRawData(const MediaRawData&); // Not implemented
+};
+
+ // MediaByteBuffer is a ref counted infallible TArray.
+class MediaByteBuffer : public nsTArray<uint8_t> {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaByteBuffer);
+ MediaByteBuffer() = default;
+ explicit MediaByteBuffer(size_t aCapacity) : nsTArray<uint8_t>(aCapacity) {}
+
+private:
+ ~MediaByteBuffer() {}
+};
+
+} // namespace mozilla
+
+#endif // MediaData_h
diff --git a/dom/media/MediaDataDemuxer.h b/dom/media/MediaDataDemuxer.h
new file mode 100644
index 000000000..cf2b265d5
--- /dev/null
+++ b/dom/media/MediaDataDemuxer.h
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaDataDemuxer_h)
+#define MediaDataDemuxer_h
+
+#include "mozilla/MozPromise.h"
+#include "mozilla/UniquePtr.h"
+
+#include "MediaData.h"
+#include "MediaInfo.h"
+#include "MediaResult.h"
+#include "TimeUnits.h"
+#include "nsISupportsImpl.h"
+#include "mozilla/RefPtr.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+class MediaTrackDemuxer;
+class TrackMetadataHolder;
+
+// Allows reading the media data: to retrieve the metadata and demux samples.
+// MediaDataDemuxer isn't designed to be thread safe.
+// When used by the MediaFormatDecoder, care is taken to ensure that the demuxer
+// will never be called from more than one thread at once.
+class MediaDataDemuxer
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDataDemuxer)
+
+ typedef MozPromise<nsresult, MediaResult, /* IsExclusive = */ true> InitPromise;
+
+ // Initializes the demuxer. Other methods cannot be called unless
+ // initialization has completed and succeeded.
+ // Typically a demuxer will wait to parse the metadata before resolving the
+ // promise. The promise must not be resolved until sufficient data is
+ // supplied. For example, an incomplete metadata would cause the promise to be
+ // rejected should no more data be coming, while the demuxer would wait
+ // otherwise.
+ virtual RefPtr<InitPromise> Init() = 0;
+
+ // Returns true if a aType track type is available.
+ virtual bool HasTrackType(TrackInfo::TrackType aType) const = 0;
+
+ // Returns the number of tracks of aType type available. A value of
+ // 0 indicates that no such type is available.
+ virtual uint32_t GetNumberTracks(TrackInfo::TrackType aType) const = 0;
+
+ // Returns the MediaTrackDemuxer associated with aTrackNumber aType track.
+ // aTrackNumber is not to be confused with the Track ID.
+ // aTrackNumber must be constrained between 0 and GetNumberTracks(aType) - 1
+ // The actual Track ID is to be retrieved by calling
+ // MediaTrackDemuxer::TrackInfo.
+ virtual already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(TrackInfo::TrackType aType,
+ uint32_t aTrackNumber) = 0;
+
+ // Returns true if the underlying resource allows seeking.
+ virtual bool IsSeekable() const = 0;
+
+ // Returns true if the underlying resource can only seek within buffered
+ // ranges.
+ virtual bool IsSeekableOnlyInBufferedRanges() const { return false; }
+
+ // Returns the media's crypto information, or nullptr if media isn't
+ // encrypted.
+ virtual UniquePtr<EncryptionInfo> GetCrypto()
+ {
+ return nullptr;
+ }
+
+ // Notifies the demuxer that the underlying resource has received more data
+ // since the demuxer was initialized.
+ // The demuxer can use this mechanism to inform all track demuxers that new
+ // data is available and to refresh its buffered range.
+ virtual void NotifyDataArrived() { }
+
+ // Notifies the demuxer that the underlying resource has had data removed
+ // since the demuxer was initialized.
+ // The demuxer can use this mechanism to inform all track demuxers to update
+ // its buffered range.
+ // This will be called should the demuxer be used with MediaSourceResource.
+ virtual void NotifyDataRemoved() { }
+
+ // Indicate to MediaFormatReader if it should compute the start time
+ // of the demuxed data. If true (default) the first sample returned will be
+ // used as reference time base.
+ virtual bool ShouldComputeStartTime() const { return true; }
+
+protected:
+ virtual ~MediaDataDemuxer()
+ {
+ }
+};
+
+class MediaTrackDemuxer
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaTrackDemuxer)
+
+ class SamplesHolder {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SamplesHolder)
+ nsTArray<RefPtr<MediaRawData>> mSamples;
+ private:
+ ~SamplesHolder() {}
+ };
+
+ class SkipFailureHolder {
+ public:
+ SkipFailureHolder(const MediaResult& aFailure, uint32_t aSkipped)
+ : mFailure(aFailure)
+ , mSkipped(aSkipped)
+ {}
+ MediaResult mFailure;
+ uint32_t mSkipped;
+ };
+
+ typedef MozPromise<media::TimeUnit, MediaResult, /* IsExclusive = */ true> SeekPromise;
+ typedef MozPromise<RefPtr<SamplesHolder>, MediaResult, /* IsExclusive = */ true> SamplesPromise;
+ typedef MozPromise<uint32_t, SkipFailureHolder, /* IsExclusive = */ true> SkipAccessPointPromise;
+
+ // Returns the TrackInfo (a.k.a Track Description) for this track.
+ // The TrackInfo returned will be:
+ // TrackInfo::kVideoTrack -> VideoInfo.
+ // TrackInfo::kAudioTrack -> AudioInfo.
+ // respectively.
+ virtual UniquePtr<TrackInfo> GetInfo() const = 0;
+
+ // Seeks to aTime. Upon success, SeekPromise will be resolved with the
+ // actual time seeked to. Typically the random access point time
+ virtual RefPtr<SeekPromise> Seek(media::TimeUnit aTime) = 0;
+
+ // Returns the next aNumSamples sample(s) available.
+ // If only a lesser amount of samples is available, only those will be
+ // returned.
+ // A aNumSamples value of -1 indicates to return all remaining samples.
+ // A video sample is typically made of a single video frame while an audio
+ // sample will contains multiple audio frames.
+ virtual RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) = 0;
+
+ // Returns true if a call to GetSamples() may block while waiting on the
+ // underlying resource to return the data.
+ // This is used by the MediaFormatReader to determine if buffering heuristics
+ // should be used.
+ virtual bool GetSamplesMayBlock() const
+ {
+ return true;
+ }
+
+ // Cancel all pending actions (Seek, GetSamples) and reset current state
+ // All pending promises are to be rejected with CANCEL.
+ // The next call to GetSamples would return the first sample available in the
+ // track.
+ virtual void Reset() = 0;
+
+ // Returns timestamp of next random access point or an error if the demuxer
+ // can't report this.
+ virtual nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime)
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ // Returns timestamp of previous random access point or an error if the
+ // demuxer can't report this.
+ virtual nsresult GetPreviousRandomAccessPoint(media::TimeUnit* aTime)
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ // Skip frames until the next Random Access Point located after
+ // aTimeThreshold.
+ // The first frame returned by the next call to GetSamples() will be the
+ // first random access point found after aTimeThreshold.
+ // Upon success, returns the number of frames skipped.
+ virtual RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) = 0;
+
+ // Gets the resource's offset used for the last Seek() or GetSample().
+ // A negative value indicates that this functionality isn't supported.
+ virtual int64_t GetResourceOffset() const
+ {
+ return -1;
+ }
+
+ virtual TrackInfo::TrackType GetType() const
+ {
+ return GetInfo()->GetType();
+ }
+
+ virtual media::TimeIntervals GetBuffered() = 0;
+
+ // By default, it is assumed that the entire resource can be evicted once
+ // all samples have been demuxed.
+ virtual int64_t GetEvictionOffset(const media::TimeUnit& aTime)
+ {
+ return INT64_MAX;
+ }
+
+ // If the MediaTrackDemuxer and MediaDataDemuxer hold cross references.
+ // BreakCycles must be overridden.
+ virtual void BreakCycles()
+ {
+ }
+
+protected:
+ virtual ~MediaTrackDemuxer() {}
+};
+
+} // namespace mozilla
+
+#endif // MediaDataDemuxer_h
diff --git a/dom/media/MediaDecoder.cpp b/dom/media/MediaDecoder.cpp
new file mode 100644
index 000000000..ab39886ba
--- /dev/null
+++ b/dom/media/MediaDecoder.cpp
@@ -0,0 +1,1803 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaDecoder.h"
+#include "mozilla/FloatingPoint.h"
+#include "mozilla/MathAlgorithms.h"
+#include <limits>
+#include "nsIObserver.h"
+#include "nsTArray.h"
+#include "VideoUtils.h"
+#include "MediaDecoderStateMachine.h"
+#include "ImageContainer.h"
+#include "MediaResource.h"
+#include "VideoFrameContainer.h"
+#include "nsError.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StaticPtr.h"
+#include "nsIMemoryReporter.h"
+#include "nsComponentManagerUtils.h"
+#include <algorithm>
+#include "MediaShutdownManager.h"
+#include "AudioChannelService.h"
+#include "mozilla/dom/AudioTrack.h"
+#include "mozilla/dom/AudioTrackList.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/dom/VideoTrack.h"
+#include "mozilla/dom/VideoTrackList.h"
+#include "nsPrintfCString.h"
+#include "mozilla/Telemetry.h"
+#include "GMPService.h"
+#include "Layers.h"
+#include "mozilla/layers/ShadowLayers.h"
+
+#ifdef MOZ_ANDROID_OMX
+#include "AndroidBridge.h"
+#endif
+
+using namespace mozilla::dom;
+using namespace mozilla::layers;
+using namespace mozilla::media;
+
+namespace mozilla {
+
+// The amount of instability we tollerate in calls to
+// MediaDecoder::UpdateEstimatedMediaDuration(); changes of duration
+// less than this are ignored, as they're assumed to be the result of
+// instability in the duration estimation.
+static const uint64_t ESTIMATED_DURATION_FUZZ_FACTOR_USECS = USECS_PER_S / 2;
+
+// avoid redefined macro in unified build
+#undef DECODER_LOG
+#undef DUMP_LOG
+
+LazyLogModule gMediaDecoderLog("MediaDecoder");
+#define DECODER_LOG(x, ...) \
+ MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, ("Decoder=%p " x, this, ##__VA_ARGS__))
+
+#define DUMP_LOG(x, ...) \
+ NS_DebugBreak(NS_DEBUG_WARNING, nsPrintfCString("Decoder=%p " x, this, ##__VA_ARGS__).get(), nullptr, nullptr, -1)
+
+static const char*
+ToPlayStateStr(MediaDecoder::PlayState aState)
+{
+ switch (aState) {
+ case MediaDecoder::PLAY_STATE_START: return "START";
+ case MediaDecoder::PLAY_STATE_LOADING: return "LOADING";
+ case MediaDecoder::PLAY_STATE_PAUSED: return "PAUSED";
+ case MediaDecoder::PLAY_STATE_PLAYING: return "PLAYING";
+ case MediaDecoder::PLAY_STATE_ENDED: return "ENDED";
+ case MediaDecoder::PLAY_STATE_SHUTDOWN: return "SHUTDOWN";
+ default: MOZ_ASSERT_UNREACHABLE("Invalid playState.");
+ }
+ return "UNKNOWN";
+}
+
+class MediaMemoryTracker : public nsIMemoryReporter
+{
+ virtual ~MediaMemoryTracker();
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIMEMORYREPORTER
+
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf);
+
+ MediaMemoryTracker();
+ void InitMemoryReporter();
+
+ static StaticRefPtr<MediaMemoryTracker> sUniqueInstance;
+
+ static MediaMemoryTracker* UniqueInstance() {
+ if (!sUniqueInstance) {
+ sUniqueInstance = new MediaMemoryTracker();
+ sUniqueInstance->InitMemoryReporter();
+ }
+ return sUniqueInstance;
+ }
+
+ typedef nsTArray<MediaDecoder*> DecodersArray;
+ static DecodersArray& Decoders() {
+ return UniqueInstance()->mDecoders;
+ }
+
+ DecodersArray mDecoders;
+
+public:
+ static void AddMediaDecoder(MediaDecoder* aDecoder)
+ {
+ Decoders().AppendElement(aDecoder);
+ }
+
+ static void RemoveMediaDecoder(MediaDecoder* aDecoder)
+ {
+ DecodersArray& decoders = Decoders();
+ decoders.RemoveElement(aDecoder);
+ if (decoders.IsEmpty()) {
+ sUniqueInstance = nullptr;
+ }
+ }
+};
+
+StaticRefPtr<MediaMemoryTracker> MediaMemoryTracker::sUniqueInstance;
+
+#if defined(PR_LOGGING)
+LazyLogModule gMediaTimerLog("MediaTimer");
+LazyLogModule gMediaSampleLog("MediaSample");
+#endif
+
+void
+MediaDecoder::InitStatics()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Eagerly init gMediaDecoderLog to work around bug 1415441.
+ MOZ_LOG(gMediaDecoderLog, LogLevel::Info, ("MediaDecoder::InitStatics"));
+}
+
+NS_IMPL_ISUPPORTS(MediaMemoryTracker, nsIMemoryReporter)
+
+NS_IMPL_ISUPPORTS0(MediaDecoder)
+
+
+void
+MediaDecoder::ResourceCallback::Connect(MediaDecoder* aDecoder)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mDecoder = aDecoder;
+ mTimer = do_CreateInstance("@mozilla.org/timer;1");
+}
+
+void
+MediaDecoder::ResourceCallback::Disconnect()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mDecoder = nullptr;
+ mTimer->Cancel();
+ mTimer = nullptr;
+}
+
+MediaDecoderOwner*
+MediaDecoder::ResourceCallback::GetMediaOwner() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mDecoder ? mDecoder->mOwner : nullptr;
+}
+
+void
+MediaDecoder::ResourceCallback::SetInfinite(bool aInfinite)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoder) {
+ mDecoder->SetInfinite(aInfinite);
+ }
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyNetworkError()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoder) {
+ mDecoder->NetworkError();
+ }
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyDecodeError()
+{
+ RefPtr<ResourceCallback> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ if (self->mDecoder) {
+ self->mDecoder->DecodeError(NS_ERROR_DOM_MEDIA_FATAL_ERR);
+ }
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+}
+
+/* static */ void
+MediaDecoder::ResourceCallback::TimerCallback(nsITimer* aTimer, void* aClosure)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ ResourceCallback* thiz = static_cast<ResourceCallback*>(aClosure);
+ MOZ_ASSERT(thiz->mDecoder);
+ thiz->mDecoder->NotifyDataArrived();
+ thiz->mTimerArmed = false;
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyDataArrived()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!mDecoder || mTimerArmed) {
+ return;
+ }
+ // In situations where these notifications come from stochastic network
+ // activity, we can save significant computation by throttling the
+ // calls to MediaDecoder::NotifyDataArrived() which will update the buffer
+ // ranges of the reader.
+ mTimerArmed = true;
+ mTimer->InitWithFuncCallback(
+ TimerCallback, this, sDelay, nsITimer::TYPE_ONE_SHOT);
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyBytesDownloaded()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoder) {
+ mDecoder->NotifyBytesDownloaded();
+ }
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyDataEnded(nsresult aStatus)
+{
+ RefPtr<ResourceCallback> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ if (!self->mDecoder) {
+ return;
+ }
+ self->mDecoder->NotifyDownloadEnded(aStatus);
+ if (NS_SUCCEEDED(aStatus)) {
+ HTMLMediaElement* element = self->GetMediaOwner()->GetMediaElement();
+ if (element) {
+ element->DownloadSuspended();
+ }
+ // NotifySuspendedStatusChanged will tell the element that download
+ // has been suspended "by the cache", which is true since we never
+ // download anything. The element can then transition to HAVE_ENOUGH_DATA.
+ self->mDecoder->NotifySuspendedStatusChanged();
+ }
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyPrincipalChanged()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoder) {
+ mDecoder->NotifyPrincipalChanged();
+ }
+}
+
+void
+MediaDecoder::ResourceCallback::NotifySuspendedStatusChanged()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoder) {
+ mDecoder->NotifySuspendedStatusChanged();
+ }
+}
+
+void
+MediaDecoder::ResourceCallback::NotifyBytesConsumed(int64_t aBytes,
+ int64_t aOffset)
+{
+ RefPtr<ResourceCallback> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ if (self->mDecoder) {
+ self->mDecoder->NotifyBytesConsumed(aBytes, aOffset);
+ }
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+}
+
+void
+MediaDecoder::NotifyOwnerActivityChanged(bool aIsVisible)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ SetElementVisibility(aIsVisible);
+
+ MediaDecoderOwner* owner = GetOwner();
+ NS_ENSURE_TRUE_VOID(owner);
+
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ NS_ENSURE_TRUE_VOID(element);
+
+ RefPtr<LayerManager> layerManager =
+ nsContentUtils::LayerManagerForDocument(element->OwnerDoc());
+ NS_ENSURE_TRUE_VOID(layerManager);
+
+ RefPtr<KnowsCompositor> knowsCompositor = layerManager->AsShadowForwarder();
+ mCompositorUpdatedEvent.Notify(knowsCompositor);
+}
+
+void
+MediaDecoder::Pause()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ if (mPlayState == PLAY_STATE_LOADING || IsEnded()) {
+ mNextState = PLAY_STATE_PAUSED;
+ return;
+ }
+ ChangeState(PLAY_STATE_PAUSED);
+}
+
+void
+MediaDecoder::SetVolume(double aVolume)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mVolume = aVolume;
+}
+
+void
+MediaDecoder::AddOutputStream(ProcessedMediaStream* aStream,
+ bool aFinishWhenEnded)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mDecoderStateMachine, "Must be called after Load().");
+ mDecoderStateMachine->AddOutputStream(aStream, aFinishWhenEnded);
+}
+
+void
+MediaDecoder::RemoveOutputStream(MediaStream* aStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mDecoderStateMachine, "Must be called after Load().");
+ mDecoderStateMachine->RemoveOutputStream(aStream);
+}
+
+double
+MediaDecoder::GetDuration()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mDuration;
+}
+
+AbstractCanonical<media::NullableTimeUnit>*
+MediaDecoder::CanonicalDurationOrNull()
+{
+ MOZ_ASSERT(mDecoderStateMachine);
+ return mDecoderStateMachine->CanonicalDuration();
+}
+
+void
+MediaDecoder::SetInfinite(bool aInfinite)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mInfiniteStream = aInfinite;
+ DurationChanged();
+}
+
+bool
+MediaDecoder::IsInfinite() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mInfiniteStream;
+}
+
+#define INIT_MIRROR(name, val) \
+ name(AbstractThread::MainThread(), val, "MediaDecoder::" #name " (Mirror)")
+#define INIT_CANONICAL(name, val) \
+ name(AbstractThread::MainThread(), val, "MediaDecoder::" #name " (Canonical)")
+
+MediaDecoder::MediaDecoder(MediaDecoderOwner* aOwner)
+ : mWatchManager(this, AbstractThread::MainThread())
+ , mLogicalPosition(0.0)
+ , mDuration(std::numeric_limits<double>::quiet_NaN())
+ , mResourceCallback(new ResourceCallback())
+ , mCDMProxyPromise(mCDMProxyPromiseHolder.Ensure(__func__))
+ , mIgnoreProgressData(false)
+ , mInfiniteStream(false)
+ , mOwner(aOwner)
+ , mFrameStats(new FrameStatistics())
+ , mVideoFrameContainer(aOwner->GetVideoFrameContainer())
+ , mPlaybackStatistics(new MediaChannelStatistics())
+ , mPinnedForSeek(false)
+ , mMinimizePreroll(false)
+ , mMediaTracksConstructed(false)
+ , mFiredMetadataLoaded(false)
+ , mElementVisible(!aOwner->IsHidden())
+ , mForcedHidden(false)
+ , INIT_MIRROR(mStateMachineIsShutdown, true)
+ , INIT_MIRROR(mBuffered, TimeIntervals())
+ , INIT_MIRROR(mNextFrameStatus, MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE)
+ , INIT_MIRROR(mCurrentPosition, 0)
+ , INIT_MIRROR(mStateMachineDuration, NullableTimeUnit())
+ , INIT_MIRROR(mPlaybackPosition, 0)
+ , INIT_MIRROR(mIsAudioDataAudible, false)
+ , INIT_CANONICAL(mVolume, 0.0)
+ , INIT_CANONICAL(mPreservesPitch, true)
+ , INIT_CANONICAL(mEstimatedDuration, NullableTimeUnit())
+ , INIT_CANONICAL(mExplicitDuration, Maybe<double>())
+ , INIT_CANONICAL(mPlayState, PLAY_STATE_LOADING)
+ , INIT_CANONICAL(mNextState, PLAY_STATE_PAUSED)
+ , INIT_CANONICAL(mLogicallySeeking, false)
+ , INIT_CANONICAL(mSameOriginMedia, false)
+ , INIT_CANONICAL(mMediaPrincipalHandle, PRINCIPAL_HANDLE_NONE)
+ , INIT_CANONICAL(mPlaybackBytesPerSecond, 0.0)
+ , INIT_CANONICAL(mPlaybackRateReliable, true)
+ , INIT_CANONICAL(mDecoderPosition, 0)
+ , INIT_CANONICAL(mIsVisible, !aOwner->IsHidden())
+ , mTelemetryReported(false)
+{
+ MOZ_COUNT_CTOR(MediaDecoder);
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaMemoryTracker::AddMediaDecoder(this);
+
+ mAudioChannel = AudioChannelService::GetDefaultAudioChannel();
+ mResourceCallback->Connect(this);
+
+ //
+ // Initialize watchers.
+ //
+
+ // mDuration
+ mWatchManager.Watch(mStateMachineDuration, &MediaDecoder::DurationChanged);
+
+ // mStateMachineIsShutdown
+ mWatchManager.Watch(mStateMachineIsShutdown, &MediaDecoder::ShutdownBitChanged);
+
+ // readyState
+ mWatchManager.Watch(mPlayState, &MediaDecoder::UpdateReadyState);
+ mWatchManager.Watch(mNextFrameStatus, &MediaDecoder::UpdateReadyState);
+ // ReadyState computation depends on MediaDecoder::CanPlayThrough, which
+ // depends on the download rate.
+ mWatchManager.Watch(mBuffered, &MediaDecoder::UpdateReadyState);
+
+ // mLogicalPosition
+ mWatchManager.Watch(mCurrentPosition, &MediaDecoder::UpdateLogicalPosition);
+ mWatchManager.Watch(mPlayState, &MediaDecoder::UpdateLogicalPosition);
+ mWatchManager.Watch(mLogicallySeeking, &MediaDecoder::UpdateLogicalPosition);
+
+ // mIgnoreProgressData
+ mWatchManager.Watch(mLogicallySeeking, &MediaDecoder::SeekingChanged);
+
+ mWatchManager.Watch(mIsAudioDataAudible, &MediaDecoder::NotifyAudibleStateChanged);
+
+ MediaShutdownManager::InitStatics();
+}
+
+#undef INIT_MIRROR
+#undef INIT_CANONICAL
+
+void
+MediaDecoder::Shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ // Unwatch all watch targets to prevent further notifications.
+ mWatchManager.Shutdown();
+
+ mResourceCallback->Disconnect();
+
+ mCDMProxyPromiseHolder.RejectIfExists(true, __func__);
+
+ DiscardOngoingSeekIfExists();
+
+ // This changes the decoder state to SHUTDOWN and does other things
+ // necessary to unblock the state machine thread if it's blocked, so
+ // the asynchronous shutdown in nsDestroyStateMachine won't deadlock.
+ if (mDecoderStateMachine) {
+ mTimedMetadataListener.Disconnect();
+ mMetadataLoadedListener.Disconnect();
+ mFirstFrameLoadedListener.Disconnect();
+ mOnPlaybackEvent.Disconnect();
+ mOnPlaybackErrorEvent.Disconnect();
+ mOnDecoderDoctorEvent.Disconnect();
+ mOnMediaNotSeekable.Disconnect();
+
+ mDecoderStateMachine->BeginShutdown()
+ ->Then(AbstractThread::MainThread(), __func__, this,
+ &MediaDecoder::FinishShutdown,
+ &MediaDecoder::FinishShutdown);
+ } else {
+ // Ensure we always unregister asynchronously in order not to disrupt
+ // the hashtable iterating in MediaShutdownManager::Shutdown().
+ RefPtr<MediaDecoder> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self] () {
+ self->mVideoFrameContainer = nullptr;
+ MediaShutdownManager::Instance().Unregister(self);
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+ }
+
+ // Force any outstanding seek and byterange requests to complete
+ // to prevent shutdown from deadlocking.
+ if (mResource) {
+ mResource->Close();
+ }
+
+ ChangeState(PLAY_STATE_SHUTDOWN);
+ mOwner = nullptr;
+}
+
+void
+MediaDecoder::NotifyXPCOMShutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (auto owner = GetOwner()) {
+ owner->NotifyXPCOMShutdown();
+ }
+ MOZ_DIAGNOSTIC_ASSERT(IsShutdown());
+
+ // Don't cause grief to release builds by ensuring Shutdown()
+ // is always called during shutdown phase.
+ if (!IsShutdown()) {
+ Shutdown();
+ }
+}
+
+MediaDecoder::~MediaDecoder()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaMemoryTracker::RemoveMediaDecoder(this);
+ UnpinForSeek();
+ MOZ_COUNT_DTOR(MediaDecoder);
+}
+
+void
+MediaDecoder::OnPlaybackEvent(MediaEventType aEvent)
+{
+ switch (aEvent) {
+ case MediaEventType::PlaybackStarted:
+ mPlaybackStatistics->Start();
+ break;
+ case MediaEventType::PlaybackStopped:
+ mPlaybackStatistics->Stop();
+ ComputePlaybackRate();
+ break;
+ case MediaEventType::PlaybackEnded:
+ PlaybackEnded();
+ break;
+ case MediaEventType::SeekStarted:
+ SeekingStarted();
+ break;
+ case MediaEventType::Invalidate:
+ Invalidate();
+ break;
+ case MediaEventType::EnterVideoSuspend:
+ mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("mozentervideosuspend"));
+ break;
+ case MediaEventType::ExitVideoSuspend:
+ mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("mozexitvideosuspend"));
+ break;
+ }
+}
+
+void
+MediaDecoder::OnPlaybackErrorEvent(const MediaResult& aError)
+{
+ DecodeError(aError);
+}
+
+void
+MediaDecoder::OnDecoderDoctorEvent(DecoderDoctorEvent aEvent)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // OnDecoderDoctorEvent is disconnected at shutdown time.
+ MOZ_ASSERT(!IsShutdown());
+ HTMLMediaElement* element = mOwner->GetMediaElement();
+ if (!element) {
+ return;
+ }
+ nsIDocument* doc = element->OwnerDoc();
+ if (!doc) {
+ return;
+ }
+ DecoderDoctorDiagnostics diags;
+ diags.StoreEvent(doc, aEvent, __func__);
+}
+
+void
+MediaDecoder::FinishShutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mDecoderStateMachine->BreakCycles();
+ SetStateMachine(nullptr);
+ mVideoFrameContainer = nullptr;
+ MediaShutdownManager::Instance().Unregister(this);
+}
+
+MediaResourceCallback*
+MediaDecoder::GetResourceCallback() const
+{
+ return mResourceCallback;
+}
+
+nsresult
+MediaDecoder::OpenResource(nsIStreamListener** aStreamListener)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (aStreamListener) {
+ *aStreamListener = nullptr;
+ }
+ return mResource->Open(aStreamListener);
+}
+
+nsresult
+MediaDecoder::Load(nsIStreamListener** aStreamListener)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mResource, "Can't load without a MediaResource");
+
+ nsresult rv = MediaShutdownManager::Instance().Register(this);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = OpenResource(aStreamListener);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ SetStateMachine(CreateStateMachine());
+ NS_ENSURE_TRUE(GetStateMachine(), NS_ERROR_FAILURE);
+
+ return InitializeStateMachine();
+}
+
+nsresult
+MediaDecoder::InitializeStateMachine()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ASSERTION(mDecoderStateMachine, "Cannot initialize null state machine!");
+
+ nsresult rv = mDecoderStateMachine->Init(this);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // If some parameters got set before the state machine got created,
+ // set them now
+ SetStateMachineParameters();
+
+ return NS_OK;
+}
+
+void
+MediaDecoder::SetStateMachineParameters()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mMinimizePreroll) {
+ mDecoderStateMachine->DispatchMinimizePrerollUntilPlaybackStarts();
+ }
+ if (mPlaybackRate != 1 && mPlaybackRate != 0) {
+ mDecoderStateMachine->DispatchSetPlaybackRate(mPlaybackRate);
+ }
+ mTimedMetadataListener = mDecoderStateMachine->TimedMetadataEvent().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::OnMetadataUpdate);
+ mMetadataLoadedListener = mDecoderStateMachine->MetadataLoadedEvent().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::MetadataLoaded);
+ mFirstFrameLoadedListener = mDecoderStateMachine->FirstFrameLoadedEvent().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::FirstFrameLoaded);
+
+ mOnPlaybackEvent = mDecoderStateMachine->OnPlaybackEvent().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::OnPlaybackEvent);
+ mOnPlaybackErrorEvent = mDecoderStateMachine->OnPlaybackErrorEvent().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::OnPlaybackErrorEvent);
+ mOnDecoderDoctorEvent = mDecoderStateMachine->OnDecoderDoctorEvent().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::OnDecoderDoctorEvent);
+ mOnMediaNotSeekable = mDecoderStateMachine->OnMediaNotSeekable().Connect(
+ AbstractThread::MainThread(), this, &MediaDecoder::OnMediaNotSeekable);
+}
+
+void
+MediaDecoder::SetMinimizePrerollUntilPlaybackStarts()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DECODER_LOG("SetMinimizePrerollUntilPlaybackStarts()");
+ mMinimizePreroll = true;
+
+ // This needs to be called before we init the state machine, otherwise it will
+ // have no effect.
+ MOZ_DIAGNOSTIC_ASSERT(!mDecoderStateMachine);
+}
+
+nsresult
+MediaDecoder::Play()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ NS_ASSERTION(mDecoderStateMachine != nullptr, "Should have state machine.");
+ if (mPlaybackRate == 0) {
+ return NS_OK;
+ }
+
+ if (IsEnded()) {
+ return Seek(0, SeekTarget::PrevSyncPoint);
+ } else if (mPlayState == PLAY_STATE_LOADING) {
+ mNextState = PLAY_STATE_PLAYING;
+ return NS_OK;
+ }
+
+ ChangeState(PLAY_STATE_PLAYING);
+ return NS_OK;
+}
+
+nsresult
+MediaDecoder::Seek(double aTime, SeekTarget::Type aSeekType, dom::Promise* aPromise /*=nullptr*/)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ MOZ_ASSERT(aTime >= 0.0, "Cannot seek to a negative value.");
+
+ int64_t timeUsecs = TimeUnit::FromSeconds(aTime).ToMicroseconds();
+
+ mLogicalPosition = aTime;
+
+ mLogicallySeeking = true;
+ SeekTarget target = SeekTarget(timeUsecs, aSeekType);
+ CallSeek(target, aPromise);
+
+ if (mPlayState == PLAY_STATE_ENDED) {
+ PinForSeek();
+ ChangeState(mOwner->GetPaused() ? PLAY_STATE_PAUSED : PLAY_STATE_PLAYING);
+ }
+ return NS_OK;
+}
+
+void
+MediaDecoder::AsyncResolveSeekDOMPromiseIfExists()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mSeekDOMPromise) {
+ RefPtr<dom::Promise> promise = mSeekDOMPromise;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ promise->MaybeResolveWithUndefined();
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+ mSeekDOMPromise = nullptr;
+ }
+}
+
+void
+MediaDecoder::AsyncRejectSeekDOMPromiseIfExists()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mSeekDOMPromise) {
+ RefPtr<dom::Promise> promise = mSeekDOMPromise;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR);
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+ mSeekDOMPromise = nullptr;
+ }
+}
+
+void
+MediaDecoder::DiscardOngoingSeekIfExists()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSeekRequest.DisconnectIfExists();
+ AsyncRejectSeekDOMPromiseIfExists();
+}
+
+void
+MediaDecoder::CallSeek(const SeekTarget& aTarget, dom::Promise* aPromise)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DiscardOngoingSeekIfExists();
+
+ mSeekDOMPromise = aPromise;
+ mSeekRequest.Begin(
+ mDecoderStateMachine->InvokeSeek(aTarget)
+ ->Then(AbstractThread::MainThread(), __func__, this,
+ &MediaDecoder::OnSeekResolved, &MediaDecoder::OnSeekRejected));
+}
+
+double
+MediaDecoder::GetCurrentTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mLogicalPosition;
+}
+
+already_AddRefed<nsIPrincipal>
+MediaDecoder::GetCurrentPrincipal()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mResource ? mResource->GetCurrentPrincipal() : nullptr;
+}
+
+void
+MediaDecoder::OnMetadataUpdate(TimedMetadata&& aMetadata)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RemoveMediaTracks();
+ MetadataLoaded(nsAutoPtr<MediaInfo>(new MediaInfo(*aMetadata.mInfo)),
+ Move(aMetadata.mTags),
+ MediaDecoderEventVisibility::Observable);
+ FirstFrameLoaded(Move(aMetadata.mInfo),
+ MediaDecoderEventVisibility::Observable);
+}
+
+void
+MediaDecoder::MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
+ nsAutoPtr<MetadataTags> aTags,
+ MediaDecoderEventVisibility aEventVisibility)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ DECODER_LOG("MetadataLoaded, channels=%u rate=%u hasAudio=%d hasVideo=%d",
+ aInfo->mAudio.mChannels, aInfo->mAudio.mRate,
+ aInfo->HasAudio(), aInfo->HasVideo());
+
+ mMediaSeekable = aInfo->mMediaSeekable;
+ mMediaSeekableOnlyInBufferedRanges = aInfo->mMediaSeekableOnlyInBufferedRanges;
+ mInfo = aInfo.forget();
+ ConstructMediaTracks();
+
+ // Make sure the element and the frame (if any) are told about
+ // our new size.
+ if (aEventVisibility != MediaDecoderEventVisibility::Suppressed) {
+ mFiredMetadataLoaded = true;
+ mOwner->MetadataLoaded(mInfo, nsAutoPtr<const MetadataTags>(aTags.forget()));
+ }
+ // Invalidate() will end up calling mOwner->UpdateMediaSize with the last
+ // dimensions retrieved from the video frame container. The video frame
+ // container contains more up to date dimensions than aInfo.
+ // So we call Invalidate() after calling mOwner->MetadataLoaded to ensure
+ // the media element has the latest dimensions.
+ Invalidate();
+
+ EnsureTelemetryReported();
+}
+
+void
+MediaDecoder::EnsureTelemetryReported()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (mTelemetryReported || !mInfo) {
+ // Note: sometimes we get multiple MetadataLoaded calls (for example
+ // for chained ogg). So we ensure we don't report duplicate results for
+ // these resources.
+ return;
+ }
+
+ nsTArray<nsCString> codecs;
+ if (mInfo->HasAudio() && !mInfo->mAudio.GetAsAudioInfo()->mMimeType.IsEmpty()) {
+ codecs.AppendElement(mInfo->mAudio.GetAsAudioInfo()->mMimeType);
+ }
+ if (mInfo->HasVideo() && !mInfo->mVideo.GetAsVideoInfo()->mMimeType.IsEmpty()) {
+ codecs.AppendElement(mInfo->mVideo.GetAsVideoInfo()->mMimeType);
+ }
+ if (codecs.IsEmpty()) {
+ if (mResource->GetContentType().IsEmpty()) {
+ NS_WARNING("Somehow the resource's content type is empty");
+ return;
+ }
+ codecs.AppendElement(nsPrintfCString("resource; %s", mResource->GetContentType().get()));
+ }
+ for (const nsCString& codec : codecs) {
+ DECODER_LOG("Telemetry MEDIA_CODEC_USED= '%s'", codec.get());
+ Telemetry::Accumulate(Telemetry::ID::MEDIA_CODEC_USED, codec);
+ }
+
+ mTelemetryReported = true;
+}
+
+const char*
+MediaDecoder::PlayStateStr()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return ToPlayStateStr(mPlayState);
+}
+
+void
+MediaDecoder::FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo,
+ MediaDecoderEventVisibility aEventVisibility)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ DECODER_LOG("FirstFrameLoaded, channels=%u rate=%u hasAudio=%d hasVideo=%d mPlayState=%s",
+ aInfo->mAudio.mChannels, aInfo->mAudio.mRate,
+ aInfo->HasAudio(), aInfo->HasVideo(), PlayStateStr());
+
+ mInfo = aInfo.forget();
+
+ Invalidate();
+
+ // This can run cache callbacks.
+ mResource->EnsureCacheUpToDate();
+
+ // The element can run javascript via events
+ // before reaching here, so only change the
+ // state if we're still set to the original
+ // loading state.
+ if (mPlayState == PLAY_STATE_LOADING) {
+ ChangeState(mNextState);
+ }
+
+ // Run NotifySuspendedStatusChanged now to give us a chance to notice
+ // that autoplay should run.
+ NotifySuspendedStatusChanged();
+
+ // mOwner->FirstFrameLoaded() might call us back. Put it at the bottom of
+ // this function to avoid unexpected shutdown from reentrant calls.
+ if (aEventVisibility != MediaDecoderEventVisibility::Suppressed) {
+ mOwner->FirstFrameLoaded();
+ }
+}
+
+void
+MediaDecoder::NetworkError()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mOwner->NetworkError();
+}
+
+void
+MediaDecoder::DecodeError(const MediaResult& aError)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mOwner->DecodeError(aError);
+}
+
+void
+MediaDecoder::UpdateSameOriginStatus(bool aSameOrigin)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSameOriginMedia = aSameOrigin;
+}
+
+bool
+MediaDecoder::IsSeeking() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mLogicallySeeking;
+}
+
+bool
+MediaDecoder::OwnerHasError() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ return mOwner->HasError();
+}
+
+class MediaElementGMPCrashHelper : public GMPCrashHelper
+{
+public:
+ explicit MediaElementGMPCrashHelper(HTMLMediaElement* aElement)
+ : mElement(aElement)
+ {
+ MOZ_ASSERT(NS_IsMainThread()); // WeakPtr isn't thread safe.
+ }
+ already_AddRefed<nsPIDOMWindowInner> GetPluginCrashedEventTarget() override
+ {
+ MOZ_ASSERT(NS_IsMainThread()); // WeakPtr isn't thread safe.
+ if (!mElement) {
+ return nullptr;
+ }
+ return do_AddRef(mElement->OwnerDoc()->GetInnerWindow());
+ }
+private:
+ WeakPtr<HTMLMediaElement> mElement;
+};
+
+already_AddRefed<GMPCrashHelper>
+MediaDecoder::GetCrashHelper()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mOwner->GetMediaElement() ?
+ MakeAndAddRef<MediaElementGMPCrashHelper>(mOwner->GetMediaElement()) : nullptr;
+}
+
+bool
+MediaDecoder::IsEnded() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mPlayState == PLAY_STATE_ENDED;
+}
+
+bool
+MediaDecoder::IsShutdown() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mPlayState == PLAY_STATE_SHUTDOWN;
+}
+
+void
+MediaDecoder::PlaybackEnded()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ if (mLogicallySeeking || mPlayState == PLAY_STATE_LOADING) {
+ return;
+ }
+
+ ChangeState(PLAY_STATE_ENDED);
+ InvalidateWithFlags(VideoFrameContainer::INVALIDATE_FORCE);
+ mOwner->PlaybackEnded();
+
+ // This must be called after |mOwner->PlaybackEnded()| call above, in order
+ // to fire the required durationchange.
+ if (IsInfinite()) {
+ SetInfinite(false);
+ }
+}
+
+MediaStatistics
+MediaDecoder::GetStatistics()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mResource);
+
+ MediaStatistics result;
+ result.mDownloadRate = mResource->GetDownloadRate(&result.mDownloadRateReliable);
+ result.mDownloadPosition = mResource->GetCachedDataEnd(mDecoderPosition);
+ result.mTotalBytes = mResource->GetLength();
+ result.mPlaybackRate = mPlaybackBytesPerSecond;
+ result.mPlaybackRateReliable = mPlaybackRateReliable;
+ result.mDecoderPosition = mDecoderPosition;
+ result.mPlaybackPosition = mPlaybackPosition;
+ return result;
+}
+
+void
+MediaDecoder::ComputePlaybackRate()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mResource);
+
+ int64_t length = mResource->GetLength();
+ if (!IsNaN(mDuration) && !mozilla::IsInfinite<double>(mDuration) && length >= 0) {
+ mPlaybackRateReliable = true;
+ mPlaybackBytesPerSecond = length / mDuration;
+ return;
+ }
+
+ bool reliable = false;
+ mPlaybackBytesPerSecond = mPlaybackStatistics->GetRateAtLastStop(&reliable);
+ mPlaybackRateReliable = reliable;
+}
+
+void
+MediaDecoder::UpdatePlaybackRate()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mResource);
+
+ ComputePlaybackRate();
+ uint32_t rate = mPlaybackBytesPerSecond;
+
+ if (mPlaybackRateReliable) {
+ // Avoid passing a zero rate
+ rate = std::max(rate, 1u);
+ } else {
+ // Set a minimum rate of 10,000 bytes per second ... sometimes we just
+ // don't have good data
+ rate = std::max(rate, 10000u);
+ }
+
+ mResource->SetPlaybackRate(rate);
+}
+
+void
+MediaDecoder::NotifySuspendedStatusChanged()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ if (mResource) {
+ bool suspended = mResource->IsSuspendedByCache();
+ mOwner->NotifySuspendedByCache(suspended);
+ }
+}
+
+void
+MediaDecoder::NotifyBytesDownloaded()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ UpdatePlaybackRate();
+ mOwner->DownloadProgressed();
+}
+
+void
+MediaDecoder::NotifyDownloadEnded(nsresult aStatus)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ DECODER_LOG("NotifyDownloadEnded, status=%x", aStatus);
+
+ if (aStatus == NS_BINDING_ABORTED) {
+ // Download has been cancelled by user.
+ mOwner->LoadAborted();
+ return;
+ }
+
+ UpdatePlaybackRate();
+
+ if (NS_SUCCEEDED(aStatus)) {
+ // A final progress event will be fired by the MediaResource calling
+ // DownloadSuspended on the element.
+ // Also NotifySuspendedStatusChanged() will be called to update readyState
+ // if download ended with success.
+ } else if (aStatus != NS_BASE_STREAM_CLOSED) {
+ NetworkError();
+ }
+}
+
+void
+MediaDecoder::NotifyPrincipalChanged()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ nsCOMPtr<nsIPrincipal> newPrincipal = GetCurrentPrincipal();
+ mMediaPrincipalHandle = MakePrincipalHandle(newPrincipal);
+ mOwner->NotifyDecoderPrincipalChanged();
+}
+
+void
+MediaDecoder::NotifyBytesConsumed(int64_t aBytes, int64_t aOffset)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ if (mIgnoreProgressData) {
+ return;
+ }
+
+ MOZ_ASSERT(mDecoderStateMachine);
+ if (aOffset >= mDecoderPosition) {
+ mPlaybackStatistics->AddBytes(aBytes);
+ }
+ mDecoderPosition = aOffset + aBytes;
+}
+
+void
+MediaDecoder::OnSeekResolved(SeekResolveValue aVal)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mSeekRequest.Complete();
+
+ bool fireEnded = false;
+ {
+ // An additional seek was requested while the current seek was
+ // in operation.
+ UnpinForSeek();
+ fireEnded = aVal.mAtEnd;
+ if (aVal.mAtEnd) {
+ ChangeState(PLAY_STATE_ENDED);
+ }
+ mLogicallySeeking = false;
+ }
+
+ // Ensure logical position is updated after seek.
+ UpdateLogicalPositionInternal();
+
+ mOwner->SeekCompleted();
+ AsyncResolveSeekDOMPromiseIfExists();
+ if (fireEnded) {
+ mOwner->PlaybackEnded();
+ }
+}
+
+void
+MediaDecoder::OnSeekRejected()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSeekRequest.Complete();
+ mLogicallySeeking = false;
+ AsyncRejectSeekDOMPromiseIfExists();
+}
+
+void
+MediaDecoder::SeekingStarted()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mOwner->SeekStarted();
+}
+
+void
+MediaDecoder::ChangeState(PlayState aState)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown(), "SHUTDOWN is the final state.");
+
+ if (mNextState == aState) {
+ mNextState = PLAY_STATE_PAUSED;
+ }
+
+ DECODER_LOG("ChangeState %s => %s", PlayStateStr(), ToPlayStateStr(aState));
+ mPlayState = aState;
+
+ if (mPlayState == PLAY_STATE_PLAYING) {
+ ConstructMediaTracks();
+ } else if (IsEnded()) {
+ RemoveMediaTracks();
+ }
+}
+
+void
+MediaDecoder::UpdateLogicalPositionInternal()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ double currentPosition = static_cast<double>(CurrentPosition()) / static_cast<double>(USECS_PER_S);
+ if (mPlayState == PLAY_STATE_ENDED) {
+ currentPosition = std::max(currentPosition, mDuration);
+ }
+ bool logicalPositionChanged = mLogicalPosition != currentPosition;
+ mLogicalPosition = currentPosition;
+
+ // Invalidate the frame so any video data is displayed.
+ // Do this before the timeupdate event so that if that
+ // event runs JavaScript that queries the media size, the
+ // frame has reflowed and the size updated beforehand.
+ Invalidate();
+
+ if (logicalPositionChanged) {
+ FireTimeUpdate();
+ }
+}
+
+void
+MediaDecoder::DurationChanged()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ double oldDuration = mDuration;
+ if (IsInfinite()) {
+ mDuration = std::numeric_limits<double>::infinity();
+ } else if (mExplicitDuration.Ref().isSome()) {
+ mDuration = mExplicitDuration.Ref().ref();
+ } else if (mStateMachineDuration.Ref().isSome()) {
+ mDuration = mStateMachineDuration.Ref().ref().ToSeconds();
+ }
+
+ if (mDuration == oldDuration || IsNaN(mDuration)) {
+ return;
+ }
+
+ DECODER_LOG("Duration changed to %f", mDuration);
+
+ // Duration has changed so we should recompute playback rate
+ UpdatePlaybackRate();
+
+ // See https://www.w3.org/Bugs/Public/show_bug.cgi?id=28822 for a discussion
+ // of whether we should fire durationchange on explicit infinity.
+ if (mFiredMetadataLoaded &&
+ (!mozilla::IsInfinite<double>(mDuration) || mExplicitDuration.Ref().isSome())) {
+ mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("durationchange"));
+ }
+
+ if (CurrentPosition() > TimeUnit::FromSeconds(mDuration).ToMicroseconds()) {
+ Seek(mDuration, SeekTarget::Accurate);
+ }
+}
+
+void
+MediaDecoder::SetElementVisibility(bool aIsVisible)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mElementVisible = aIsVisible;
+ mIsVisible = !mForcedHidden && mElementVisible;
+}
+
+void
+MediaDecoder::SetForcedHidden(bool aForcedHidden)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mForcedHidden = aForcedHidden;
+ SetElementVisibility(mElementVisible);
+}
+
+void
+MediaDecoder::UpdateEstimatedMediaDuration(int64_t aDuration)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (mPlayState <= PLAY_STATE_LOADING) {
+ return;
+ }
+
+ // The duration is only changed if its significantly different than the
+ // the current estimate, as the incoming duration is an estimate and so
+ // often is unstable as more data is read and the estimate is updated.
+ // Can result in a durationchangeevent. aDuration is in microseconds.
+ if (mEstimatedDuration.Ref().isSome() &&
+ mozilla::Abs(mEstimatedDuration.Ref().ref().ToMicroseconds() - aDuration) < ESTIMATED_DURATION_FUZZ_FACTOR_USECS) {
+ return;
+ }
+
+ mEstimatedDuration = Some(TimeUnit::FromMicroseconds(aDuration));
+}
+
+bool
+MediaDecoder::IsTransportSeekable()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return GetResource()->IsTransportSeekable();
+}
+
+bool
+MediaDecoder::IsMediaSeekable()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE(GetStateMachine(), false);
+ return mMediaSeekable;
+}
+
+media::TimeIntervals
+MediaDecoder::GetSeekable()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (IsNaN(GetDuration())) {
+ // We do not have a duration yet, we can't determine the seekable range.
+ return TimeIntervals();
+ }
+
+ // We can seek in buffered range if the media is seekable. Also, we can seek
+ // in unbuffered ranges if the transport level is seekable (local file or the
+ // server supports range requests, etc.) or in cue-less WebMs
+ if (mMediaSeekableOnlyInBufferedRanges) {
+ return GetBuffered();
+ } else if (!IsMediaSeekable()) {
+ return media::TimeIntervals();
+ } else if (!IsTransportSeekable()) {
+ return GetBuffered();
+ } else {
+ return media::TimeIntervals(
+ media::TimeInterval(media::TimeUnit::FromMicroseconds(0),
+ IsInfinite() ?
+ media::TimeUnit::FromInfinity() :
+ media::TimeUnit::FromSeconds(GetDuration())));
+ }
+}
+
+void
+MediaDecoder::SetFragmentEndTime(double aTime)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoderStateMachine) {
+ mDecoderStateMachine->DispatchSetFragmentEndTime(static_cast<int64_t>(aTime * USECS_PER_S));
+ }
+}
+
+void
+MediaDecoder::Suspend()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mResource) {
+ mResource->Suspend(true);
+ }
+}
+
+void
+MediaDecoder::Resume()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mResource) {
+ mResource->Resume();
+ }
+}
+
+void
+MediaDecoder::SetLoadInBackground(bool aLoadInBackground)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mResource) {
+ mResource->SetLoadInBackground(aLoadInBackground);
+ }
+}
+
+void
+MediaDecoder::SetPlaybackRate(double aPlaybackRate)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ double oldRate = mPlaybackRate;
+ mPlaybackRate = aPlaybackRate;
+ if (aPlaybackRate == 0) {
+ Pause();
+ return;
+ }
+
+
+ if (oldRate == 0 && !mOwner->GetPaused()) {
+ // PlaybackRate is no longer null.
+ // Restart the playback if the media was playing.
+ Play();
+ }
+
+ if (mDecoderStateMachine) {
+ mDecoderStateMachine->DispatchSetPlaybackRate(aPlaybackRate);
+ }
+}
+
+void
+MediaDecoder::SetPreservesPitch(bool aPreservesPitch)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mPreservesPitch = aPreservesPitch;
+}
+
+void
+MediaDecoder::ConnectMirrors(MediaDecoderStateMachine* aObject)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aObject);
+ mStateMachineDuration.Connect(aObject->CanonicalDuration());
+ mBuffered.Connect(aObject->CanonicalBuffered());
+ mStateMachineIsShutdown.Connect(aObject->CanonicalIsShutdown());
+ mNextFrameStatus.Connect(aObject->CanonicalNextFrameStatus());
+ mCurrentPosition.Connect(aObject->CanonicalCurrentPosition());
+ mPlaybackPosition.Connect(aObject->CanonicalPlaybackOffset());
+ mIsAudioDataAudible.Connect(aObject->CanonicalIsAudioDataAudible());
+}
+
+void
+MediaDecoder::DisconnectMirrors()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mStateMachineDuration.DisconnectIfConnected();
+ mBuffered.DisconnectIfConnected();
+ mStateMachineIsShutdown.DisconnectIfConnected();
+ mNextFrameStatus.DisconnectIfConnected();
+ mCurrentPosition.DisconnectIfConnected();
+ mPlaybackPosition.DisconnectIfConnected();
+ mIsAudioDataAudible.DisconnectIfConnected();
+}
+
+void
+MediaDecoder::SetStateMachine(MediaDecoderStateMachine* aStateMachine)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT_IF(aStateMachine, !mDecoderStateMachine);
+ mDecoderStateMachine = aStateMachine;
+ if (aStateMachine) {
+ ConnectMirrors(aStateMachine);
+ } else {
+ DisconnectMirrors();
+ }
+}
+
+ImageContainer*
+MediaDecoder::GetImageContainer()
+{
+ return mVideoFrameContainer ? mVideoFrameContainer->GetImageContainer() : nullptr;
+}
+
+void
+MediaDecoder::InvalidateWithFlags(uint32_t aFlags)
+{
+ if (mVideoFrameContainer) {
+ mVideoFrameContainer->InvalidateWithFlags(aFlags);
+ }
+}
+
+void
+MediaDecoder::Invalidate()
+{
+ if (mVideoFrameContainer) {
+ mVideoFrameContainer->Invalidate();
+ }
+}
+
+// Constructs the time ranges representing what segments of the media
+// are buffered and playable.
+media::TimeIntervals
+MediaDecoder::GetBuffered() {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mBuffered.Ref();
+}
+
+size_t
+MediaDecoder::SizeOfVideoQueue() {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoderStateMachine) {
+ return mDecoderStateMachine->SizeOfVideoQueue();
+ }
+ return 0;
+}
+
+size_t
+MediaDecoder::SizeOfAudioQueue() {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mDecoderStateMachine) {
+ return mDecoderStateMachine->SizeOfAudioQueue();
+ }
+ return 0;
+}
+
+void MediaDecoder::AddSizeOfResources(ResourceSizes* aSizes) {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (GetResource()) {
+ aSizes->mByteSize += GetResource()->SizeOfIncludingThis(aSizes->mMallocSizeOf);
+ }
+}
+
+void
+MediaDecoder::NotifyDataArrived() {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mDataArrivedEvent.Notify();
+}
+
+// Provide access to the state machine object
+MediaDecoderStateMachine*
+MediaDecoder::GetStateMachine() const {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mDecoderStateMachine;
+}
+
+void
+MediaDecoder::FireTimeUpdate()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mOwner->FireTimeUpdate(true);
+}
+
+void
+MediaDecoder::PinForSeek()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaResource* resource = GetResource();
+ if (!resource || mPinnedForSeek) {
+ return;
+ }
+ mPinnedForSeek = true;
+ resource->Pin();
+}
+
+void
+MediaDecoder::UnpinForSeek()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaResource* resource = GetResource();
+ if (!resource || !mPinnedForSeek) {
+ return;
+ }
+ mPinnedForSeek = false;
+ resource->Unpin();
+}
+
+bool
+MediaDecoder::CanPlayThrough()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE(mDecoderStateMachine, false);
+ return GetStatistics().CanPlayThrough();
+}
+
+RefPtr<MediaDecoder::CDMProxyPromise>
+MediaDecoder::RequestCDMProxy() const
+{
+ return mCDMProxyPromise;
+}
+
+void
+MediaDecoder::SetCDMProxy(CDMProxy* aProxy)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aProxy);
+
+ mCDMProxyPromiseHolder.ResolveIfExists(aProxy, __func__);
+}
+
+bool
+MediaDecoder::IsOpusEnabled()
+{
+ return Preferences::GetBool("media.opus.enabled");
+}
+
+bool
+MediaDecoder::IsOggEnabled()
+{
+ return Preferences::GetBool("media.ogg.enabled");
+}
+
+bool
+MediaDecoder::IsWaveEnabled()
+{
+ return Preferences::GetBool("media.wave.enabled");
+}
+
+bool
+MediaDecoder::IsWebMEnabled()
+{
+ return Preferences::GetBool("media.webm.enabled");
+}
+
+#ifdef MOZ_ANDROID_OMX
+bool
+MediaDecoder::IsAndroidMediaPluginEnabled()
+{
+ return AndroidBridge::Bridge() &&
+ AndroidBridge::Bridge()->GetAPIVersion() < 16 &&
+ Preferences::GetBool("media.plugins.enabled");
+}
+#endif
+
+NS_IMETHODIMP
+MediaMemoryTracker::CollectReports(nsIHandleReportCallback* aHandleReport,
+ nsISupports* aData, bool aAnonymize)
+{
+ int64_t video = 0, audio = 0;
+
+ // NB: When resourceSizes' ref count goes to 0 the promise will report the
+ // resources memory and finish the asynchronous memory report.
+ RefPtr<MediaDecoder::ResourceSizes> resourceSizes =
+ new MediaDecoder::ResourceSizes(MediaMemoryTracker::MallocSizeOf);
+
+ nsCOMPtr<nsIHandleReportCallback> handleReport = aHandleReport;
+ nsCOMPtr<nsISupports> data = aData;
+
+ resourceSizes->Promise()->Then(
+ AbstractThread::MainThread(), __func__,
+ [handleReport, data] (size_t size) {
+ handleReport->Callback(
+ EmptyCString(), NS_LITERAL_CSTRING("explicit/media/resources"),
+ KIND_HEAP, UNITS_BYTES, size,
+ NS_LITERAL_CSTRING("Memory used by media resources including "
+ "streaming buffers, caches, etc."),
+ data);
+
+ nsCOMPtr<nsIMemoryReporterManager> imgr =
+ do_GetService("@mozilla.org/memory-reporter-manager;1");
+
+ if (imgr) {
+ imgr->EndReport();
+ }
+ },
+ [] (size_t) { /* unused reject function */ });
+
+ DecodersArray& decoders = Decoders();
+ for (size_t i = 0; i < decoders.Length(); ++i) {
+ MediaDecoder* decoder = decoders[i];
+ video += decoder->SizeOfVideoQueue();
+ audio += decoder->SizeOfAudioQueue();
+ decoder->AddSizeOfResources(resourceSizes);
+ }
+
+ MOZ_COLLECT_REPORT(
+ "explicit/media/decoded/video", KIND_HEAP, UNITS_BYTES, video,
+ "Memory used by decoded video frames.");
+
+ MOZ_COLLECT_REPORT(
+ "explicit/media/decoded/audio", KIND_HEAP, UNITS_BYTES, audio,
+ "Memory used by decoded audio chunks.");
+
+ return NS_OK;
+}
+
+MediaDecoderOwner*
+MediaDecoder::GetOwner() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // mOwner is valid until shutdown.
+ return mOwner;
+}
+
+void
+MediaDecoder::ConstructMediaTracks()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ if (mMediaTracksConstructed || !mInfo) {
+ return;
+ }
+
+ HTMLMediaElement* element = mOwner->GetMediaElement();
+ if (!element) {
+ return;
+ }
+
+ mMediaTracksConstructed = true;
+
+ AudioTrackList* audioList = element->AudioTracks();
+ if (audioList && mInfo->HasAudio()) {
+ const TrackInfo& info = mInfo->mAudio;
+ RefPtr<AudioTrack> track = MediaTrackList::CreateAudioTrack(
+ info.mId, info.mKind, info.mLabel, info.mLanguage, info.mEnabled);
+
+ audioList->AddTrack(track);
+ }
+
+ VideoTrackList* videoList = element->VideoTracks();
+ if (videoList && mInfo->HasVideo()) {
+ const TrackInfo& info = mInfo->mVideo;
+ RefPtr<VideoTrack> track = MediaTrackList::CreateVideoTrack(
+ info.mId, info.mKind, info.mLabel, info.mLanguage);
+
+ videoList->AddTrack(track);
+ track->SetEnabledInternal(info.mEnabled, MediaTrack::FIRE_NO_EVENTS);
+ }
+}
+
+void
+MediaDecoder::RemoveMediaTracks()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+
+ HTMLMediaElement* element = mOwner->GetMediaElement();
+ if (!element) {
+ return;
+ }
+
+ AudioTrackList* audioList = element->AudioTracks();
+ if (audioList) {
+ audioList->RemoveTracks();
+ }
+
+ VideoTrackList* videoList = element->VideoTracks();
+ if (videoList) {
+ videoList->RemoveTracks();
+ }
+
+ mMediaTracksConstructed = false;
+}
+
+MediaDecoderOwner::NextFrameStatus
+MediaDecoder::NextFrameBufferedStatus()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Next frame hasn't been decoded yet.
+ // Use the buffered range to consider if we have the next frame available.
+ media::TimeUnit currentPosition =
+ media::TimeUnit::FromMicroseconds(CurrentPosition());
+ media::TimeInterval interval(currentPosition,
+ currentPosition + media::TimeUnit::FromMicroseconds(DEFAULT_NEXT_FRAME_AVAILABLE_BUFFERED));
+ return GetBuffered().Contains(interval)
+ ? MediaDecoderOwner::NEXT_FRAME_AVAILABLE
+ : MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
+}
+
+void
+MediaDecoder::DumpDebugInfo()
+{
+ MOZ_ASSERT(!IsShutdown());
+ DUMP_LOG("metadata: channels=%u rate=%u hasAudio=%d hasVideo=%d, "
+ "state: mPlayState=%s mdsm=%p",
+ mInfo ? mInfo->mAudio.mChannels : 0, mInfo ? mInfo->mAudio.mRate : 0,
+ mInfo ? mInfo->HasAudio() : 0, mInfo ? mInfo->HasVideo() : 0,
+ PlayStateStr(), GetStateMachine());
+
+ nsString str;
+ GetMozDebugReaderData(str);
+ if (!str.IsEmpty()) {
+ DUMP_LOG("reader data:\n%s", NS_ConvertUTF16toUTF8(str).get());
+ }
+
+ if (GetStateMachine()) {
+ GetStateMachine()->DumpDebugInfo();
+ }
+}
+
+void
+MediaDecoder::NotifyAudibleStateChanged()
+{
+ MOZ_ASSERT(!IsShutdown());
+ mOwner->SetAudibleState(mIsAudioDataAudible);
+}
+
+MediaMemoryTracker::MediaMemoryTracker()
+{
+}
+
+void
+MediaMemoryTracker::InitMemoryReporter()
+{
+ RegisterWeakAsyncMemoryReporter(this);
+}
+
+MediaMemoryTracker::~MediaMemoryTracker()
+{
+ UnregisterWeakMemoryReporter(this);
+}
+
+} // namespace mozilla
+
+// avoid redefined macro in unified build
+#undef DECODER_LOG
diff --git a/dom/media/MediaDecoder.h b/dom/media/MediaDecoder.h
new file mode 100644
index 000000000..825bbbd2c
--- /dev/null
+++ b/dom/media/MediaDecoder.h
@@ -0,0 +1,861 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaDecoder_h_)
+#define MediaDecoder_h_
+
+#include "mozilla/Atomics.h"
+#include "mozilla/CDMProxy.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/StateMirroring.h"
+#include "mozilla/StateWatching.h"
+
+#include "mozilla/dom/AudioChannelBinding.h"
+
+#include "necko-config.h"
+#include "nsAutoPtr.h"
+#include "nsCOMPtr.h"
+#include "nsIObserver.h"
+#include "nsISupports.h"
+#include "nsITimer.h"
+
+#include "AbstractMediaDecoder.h"
+#include "DecoderDoctorDiagnostics.h"
+#include "MediaDecoderOwner.h"
+#include "MediaEventSource.h"
+#include "MediaMetadataManager.h"
+#include "MediaResource.h"
+#include "MediaResourceCallback.h"
+#include "MediaStatistics.h"
+#include "MediaStreamGraph.h"
+#include "TimeUnits.h"
+#include "SeekTarget.h"
+
+class nsIStreamListener;
+class nsIPrincipal;
+
+namespace mozilla {
+
+namespace dom {
+class Promise;
+}
+
+class VideoFrameContainer;
+class MediaDecoderStateMachine;
+
+enum class MediaEventType : int8_t;
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with MediaDecoder::GetCurrentTime implementation.
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+class MediaDecoder : public AbstractMediaDecoder
+{
+public:
+ struct SeekResolveValue {
+ bool mAtEnd;
+ };
+
+ // Used to register with MediaResource to receive notifications which will
+ // be forwarded to MediaDecoder.
+ class ResourceCallback : public MediaResourceCallback {
+ // Throttle calls to MediaDecoder::NotifyDataArrived()
+ // to be at most once per 500ms.
+ static const uint32_t sDelay = 500;
+
+ public:
+ // Start to receive notifications from ResourceCallback.
+ void Connect(MediaDecoder* aDecoder);
+ // Called upon shutdown to stop receiving notifications.
+ void Disconnect();
+
+ private:
+ /* MediaResourceCallback functions */
+ MediaDecoderOwner* GetMediaOwner() const override;
+ void SetInfinite(bool aInfinite) override;
+ void NotifyNetworkError() override;
+ void NotifyDecodeError() override;
+ void NotifyDataArrived() override;
+ void NotifyBytesDownloaded() override;
+ void NotifyDataEnded(nsresult aStatus) override;
+ void NotifyPrincipalChanged() override;
+ void NotifySuspendedStatusChanged() override;
+ void NotifyBytesConsumed(int64_t aBytes, int64_t aOffset) override;
+
+ static void TimerCallback(nsITimer* aTimer, void* aClosure);
+
+ // The decoder to send notifications. Main-thread only.
+ MediaDecoder* mDecoder = nullptr;
+ nsCOMPtr<nsITimer> mTimer;
+ bool mTimerArmed = false;
+ };
+
+ typedef MozPromise<SeekResolveValue, bool /* aIgnored */, /* IsExclusive = */ true> SeekPromise;
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // Enumeration for the valid play states (see mPlayState)
+ enum PlayState {
+ PLAY_STATE_START,
+ PLAY_STATE_LOADING,
+ PLAY_STATE_PAUSED,
+ PLAY_STATE_PLAYING,
+ PLAY_STATE_ENDED,
+ PLAY_STATE_SHUTDOWN
+ };
+
+ // Must be called exactly once, on the main thread, during startup.
+ static void InitStatics();
+
+ explicit MediaDecoder(MediaDecoderOwner* aOwner);
+
+ // Return a callback object used to register with MediaResource to receive
+ // notifications.
+ MediaResourceCallback* GetResourceCallback() const;
+
+ // Create a new decoder of the same type as this one.
+ // Subclasses must implement this.
+ virtual MediaDecoder* Clone(MediaDecoderOwner* aOwner) = 0;
+ // Create a new state machine to run this decoder.
+ // Subclasses must implement this.
+ virtual MediaDecoderStateMachine* CreateStateMachine() = 0;
+
+ // Cleanup internal data structures. Must be called on the main
+ // thread by the owning object before that object disposes of this object.
+ virtual void Shutdown();
+
+ // Notified by the shutdown manager that XPCOM shutdown has begun.
+ // The decoder should notify its owner to drop the reference to the decoder
+ // to prevent further calls into the decoder.
+ void NotifyXPCOMShutdown();
+
+ // Start downloading the media. Decode the downloaded data up to the
+ // point of the first frame of data.
+ // This is called at most once per decoder, after Init().
+ virtual nsresult Load(nsIStreamListener** aListener);
+
+ // Called in |Load| to open mResource.
+ nsresult OpenResource(nsIStreamListener** aStreamListener);
+
+ // Called if the media file encounters a network error.
+ void NetworkError();
+
+ // Get the current MediaResource being used. Its URI will be returned
+ // by currentSrc. Returns what was passed to Load(), if Load() has been called.
+ // Note: The MediaResource is refcounted, but it outlives the MediaDecoder,
+ // so it's OK to use the reference returned by this function without
+ // refcounting, *unless* you need to store and use the reference after the
+ // MediaDecoder has been destroyed. You might need to do this if you're
+ // wrapping the MediaResource in some kind of byte stream interface to be
+ // passed to a platform decoder.
+ MediaResource* GetResource() const final override
+ {
+ return mResource;
+ }
+ void SetResource(MediaResource* aResource)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mResource = aResource;
+ }
+
+ // Return the principal of the current URI being played or downloaded.
+ virtual already_AddRefed<nsIPrincipal> GetCurrentPrincipal();
+
+ // Return the time position in the video stream being
+ // played measured in seconds.
+ virtual double GetCurrentTime();
+
+ // Seek to the time position in (seconds) from the start of the video.
+ // If aDoFastSeek is true, we'll seek to the sync point/keyframe preceeding
+ // the seek target.
+ virtual nsresult Seek(double aTime, SeekTarget::Type aSeekType,
+ dom::Promise* aPromise = nullptr);
+
+ // Initialize state machine and schedule it.
+ nsresult InitializeStateMachine();
+
+ // Start playback of a video. 'Load' must have previously been
+ // called.
+ virtual nsresult Play();
+
+ // Notify activity of the decoder owner is changed.
+ virtual void NotifyOwnerActivityChanged(bool aIsVisible);
+
+ // Pause video playback.
+ virtual void Pause();
+ // Adjust the speed of the playback, optionally with pitch correction,
+ virtual void SetVolume(double aVolume);
+
+ virtual void SetPlaybackRate(double aPlaybackRate);
+ void SetPreservesPitch(bool aPreservesPitch);
+
+ // Directs the decoder to not preroll extra samples until the media is
+ // played. This reduces the memory overhead of media elements that may
+ // not be played. Note that seeking also doesn't cause us start prerolling.
+ void SetMinimizePrerollUntilPlaybackStarts();
+
+ // All MediaStream-related data is protected by mReentrantMonitor.
+ // We have at most one DecodedStreamData per MediaDecoder. Its stream
+ // is used as the input for each ProcessedMediaStream created by calls to
+ // captureStream(UntilEnded). Seeking creates a new source stream, as does
+ // replaying after the input as ended. In the latter case, the new source is
+ // not connected to streams created by captureStreamUntilEnded.
+
+ // Add an output stream. All decoder output will be sent to the stream.
+ // The stream is initially blocked. The decoder is responsible for unblocking
+ // it while it is playing back.
+ virtual void AddOutputStream(ProcessedMediaStream* aStream, bool aFinishWhenEnded);
+ // Remove an output stream added with AddOutputStream.
+ virtual void RemoveOutputStream(MediaStream* aStream);
+
+ // Return the duration of the video in seconds.
+ virtual double GetDuration();
+
+ // Return true if the stream is infinite (see SetInfinite).
+ bool IsInfinite() const;
+
+ // Called by MediaResource when some data has been received.
+ // Call on the main thread only.
+ virtual void NotifyBytesDownloaded();
+
+ // Called as data arrives on the stream and is read into the cache. Called
+ // on the main thread only.
+ void NotifyDataArrived();
+
+ // Return true if we are currently seeking in the media resource.
+ // Call on the main thread only.
+ bool IsSeeking() const;
+
+ // Return true if the decoder has reached the end of playback.
+ bool IsEnded() const;
+
+ // Return true if the MediaDecoderOwner's error attribute is not null.
+ // Must be called before Shutdown().
+ bool OwnerHasError() const;
+
+ already_AddRefed<GMPCrashHelper> GetCrashHelper() override;
+
+protected:
+ // Updates the media duration. This is called while the media is being
+ // played, calls before the media has reached loaded metadata are ignored.
+ // The duration is assumed to be an estimate, and so a degree of
+ // instability is expected; if the incoming duration is not significantly
+ // different from the existing duration, the change request is ignored.
+ // If the incoming duration is significantly different, the duration is
+ // changed, this causes a durationchanged event to fire to the media
+ // element.
+ void UpdateEstimatedMediaDuration(int64_t aDuration) override;
+
+public:
+ // Returns true if this media supports random seeking. False for example with
+ // chained ogg files.
+ bool IsMediaSeekable();
+ // Returns true if seeking is supported on a transport level (e.g. the server
+ // supports range requests, we are playing a file, etc.).
+ bool IsTransportSeekable();
+
+ // Return the time ranges that can be seeked into.
+ virtual media::TimeIntervals GetSeekable();
+
+ // Set the end time of the media resource. When playback reaches
+ // this point the media pauses. aTime is in seconds.
+ virtual void SetFragmentEndTime(double aTime);
+
+ // Invalidate the frame.
+ void Invalidate();
+ void InvalidateWithFlags(uint32_t aFlags);
+
+ // Suspend any media downloads that are in progress. Called by the
+ // media element when it is sent to the bfcache, or when we need
+ // to throttle the download. Call on the main thread only. This can
+ // be called multiple times, there's an internal "suspend count".
+ virtual void Suspend();
+
+ // Resume any media downloads that have been suspended. Called by the
+ // media element when it is restored from the bfcache, or when we need
+ // to stop throttling the download. Call on the main thread only.
+ // The download will only actually resume once as many Resume calls
+ // have been made as Suspend calls.
+ virtual void Resume();
+
+ // Moves any existing channel loads into or out of background. Background
+ // loads don't block the load event. This is called when we stop or restart
+ // delaying the load event. This also determines whether any new loads
+ // initiated (for example to seek) will be in the background. This calls
+ // SetLoadInBackground() on mResource.
+ void SetLoadInBackground(bool aLoadInBackground);
+
+ MediaDecoderStateMachine* GetStateMachine() const;
+ void SetStateMachine(MediaDecoderStateMachine* aStateMachine);
+
+ // Constructs the time ranges representing what segments of the media
+ // are buffered and playable.
+ virtual media::TimeIntervals GetBuffered();
+
+ // Returns the size, in bytes, of the heap memory used by the currently
+ // queued decoded video and audio data.
+ size_t SizeOfVideoQueue();
+ size_t SizeOfAudioQueue();
+
+ // Helper struct for accumulating resource sizes that need to be measured
+ // asynchronously. Once all references are dropped the callback will be
+ // invoked.
+ struct ResourceSizes
+ {
+ typedef MozPromise<size_t, size_t, true> SizeOfPromise;
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ResourceSizes)
+ explicit ResourceSizes(MallocSizeOf aMallocSizeOf)
+ : mMallocSizeOf(aMallocSizeOf)
+ , mByteSize(0)
+ , mCallback()
+ {
+ }
+
+ mozilla::MallocSizeOf mMallocSizeOf;
+ mozilla::Atomic<size_t> mByteSize;
+
+ RefPtr<SizeOfPromise> Promise()
+ {
+ return mCallback.Ensure(__func__);
+ }
+
+private:
+ ~ResourceSizes()
+ {
+ mCallback.ResolveIfExists(mByteSize, __func__);
+ }
+
+ MozPromiseHolder<SizeOfPromise> mCallback;
+ };
+
+ virtual void AddSizeOfResources(ResourceSizes* aSizes);
+
+ VideoFrameContainer* GetVideoFrameContainer() final override
+ {
+ return mVideoFrameContainer;
+ }
+ layers::ImageContainer* GetImageContainer() override;
+
+ // Fire timeupdate events if needed according to the time constraints
+ // outlined in the specification.
+ void FireTimeUpdate();
+
+ // Something has changed that could affect the computed playback rate,
+ // so recompute it. The monitor must be held.
+ virtual void UpdatePlaybackRate();
+
+ // The actual playback rate computation. The monitor must be held.
+ void ComputePlaybackRate();
+
+ // Returns true if we can play the entire media through without stopping
+ // to buffer, given the current download and playback rates.
+ virtual bool CanPlayThrough();
+
+ void SetAudioChannel(dom::AudioChannel aChannel) { mAudioChannel = aChannel; }
+ dom::AudioChannel GetAudioChannel() { return mAudioChannel; }
+
+ // Called from HTMLMediaElement when owner document activity changes
+ virtual void SetElementVisibility(bool aIsVisible);
+
+ // Force override the visible state to hidden.
+ // Called from HTMLMediaElement when testing of video decode suspend from mochitests.
+ void SetForcedHidden(bool aForcedHidden);
+
+ /******
+ * The following methods must only be called on the main
+ * thread.
+ ******/
+
+ // Change to a new play state. This updates the mState variable and
+ // notifies any thread blocking on this object's monitor of the
+ // change. Call on the main thread only.
+ virtual void ChangeState(PlayState aState);
+
+ // Called from MetadataLoaded(). Creates audio tracks and adds them to its
+ // owner's audio track list, and implies to video tracks respectively.
+ // Call on the main thread only.
+ void ConstructMediaTracks();
+
+ // Removes all audio tracks and video tracks that are previously added into
+ // the track list. Call on the main thread only.
+ void RemoveMediaTracks();
+
+ // Called when the video has completed playing.
+ // Call on the main thread only.
+ void PlaybackEnded();
+
+ void OnSeekRejected();
+ void OnSeekResolved(SeekResolveValue aVal);
+
+ void SeekingChanged()
+ {
+ // Stop updating the bytes downloaded for progress notifications when
+ // seeking to prevent wild changes to the progress notification.
+ MOZ_ASSERT(NS_IsMainThread());
+ mIgnoreProgressData = mLogicallySeeking;
+ }
+
+ // Seeking has started. Inform the element on the main thread.
+ void SeekingStarted();
+
+ void UpdateLogicalPositionInternal();
+ void UpdateLogicalPosition()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ // Per spec, offical position remains stable during pause and seek.
+ if (mPlayState == PLAY_STATE_PAUSED || IsSeeking()) {
+ return;
+ }
+ UpdateLogicalPositionInternal();
+ }
+
+ // Find the end of the cached data starting at the current decoder
+ // position.
+ int64_t GetDownloadPosition();
+
+ // Notifies the element that decoding has failed.
+ void DecodeError(const MediaResult& aError);
+
+ // Indicate whether the media is same-origin with the element.
+ void UpdateSameOriginStatus(bool aSameOrigin);
+
+ MediaDecoderOwner* GetOwner() const override;
+
+ typedef MozPromise<RefPtr<CDMProxy>, bool /* aIgnored */, /* IsExclusive = */ true> CDMProxyPromise;
+
+ // Resolved when a CDMProxy is available and the capabilities are known or
+ // rejected when this decoder is about to shut down.
+ RefPtr<CDMProxyPromise> RequestCDMProxy() const;
+
+ void SetCDMProxy(CDMProxy* aProxy);
+
+ void EnsureTelemetryReported();
+
+ static bool IsOggEnabled();
+ static bool IsOpusEnabled();
+ static bool IsWaveEnabled();
+ static bool IsWebMEnabled();
+
+#ifdef MOZ_ANDROID_OMX
+ static bool IsAndroidMediaPluginEnabled();
+#endif
+
+#ifdef MOZ_WMF
+ static bool IsWMFEnabled();
+#endif
+
+ // Return statistics. This is used for progress events and other things.
+ // This can be called from any thread. It's only a snapshot of the
+ // current state, since other threads might be changing the state
+ // at any time.
+ MediaStatistics GetStatistics();
+
+ // Return the frame decode/paint related statistics.
+ FrameStatistics& GetFrameStatistics() { return *mFrameStats; }
+
+ // Increments the parsed and decoded frame counters by the passed in counts.
+ // Can be called on any thread.
+ virtual void NotifyDecodedFrames(const FrameStatisticsData& aStats) override
+ {
+ GetFrameStatistics().NotifyDecodedFrames(aStats);
+ }
+
+ void UpdateReadyState()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ mOwner->UpdateReadyState();
+ }
+
+ virtual MediaDecoderOwner::NextFrameStatus NextFrameStatus() { return mNextFrameStatus; }
+ virtual MediaDecoderOwner::NextFrameStatus NextFrameBufferedStatus();
+
+ // Returns a string describing the state of the media player internal
+ // data. Used for debugging purposes.
+ virtual void GetMozDebugReaderData(nsAString& aString) {}
+
+ virtual void DumpDebugInfo();
+
+protected:
+ virtual ~MediaDecoder();
+
+ // Called when the first audio and/or video from the media file has been loaded
+ // by the state machine. Call on the main thread only.
+ virtual void FirstFrameLoaded(nsAutoPtr<MediaInfo> aInfo,
+ MediaDecoderEventVisibility aEventVisibility);
+
+ void SetStateMachineParameters();
+
+ bool IsShutdown() const;
+
+ // Called by the state machine to notify the decoder that the duration
+ // has changed.
+ void DurationChanged();
+
+ // State-watching manager.
+ WatchManager<MediaDecoder> mWatchManager;
+
+ // Used by the ogg decoder to watch mStateMachineIsShutdown.
+ virtual void ShutdownBitChanged() {}
+
+ double ExplicitDuration() { return mExplicitDuration.Ref().ref(); }
+
+ void SetExplicitDuration(double aValue)
+ {
+ MOZ_ASSERT(!IsShutdown());
+ mExplicitDuration.Set(Some(aValue));
+
+ // We Invoke DurationChanged explicitly, rather than using a watcher, so
+ // that it takes effect immediately, rather than at the end of the current task.
+ DurationChanged();
+ }
+
+ /******
+ * The following members should be accessed with the decoder lock held.
+ ******/
+
+ // The logical playback position of the media resource in units of
+ // seconds. This corresponds to the "official position" in HTML5. Note that
+ // we need to store this as a double, rather than an int64_t (like
+ // mCurrentPosition), so that |v.currentTime = foo; v.currentTime == foo|
+ // returns true without being affected by rounding errors.
+ double mLogicalPosition;
+
+ // The current playback position of the underlying playback infrastructure.
+ // This corresponds to the "current position" in HTML5.
+ // We allow omx subclasses to substitute an alternative current position for
+ // usage with the audio offload player.
+ virtual int64_t CurrentPosition() { return mCurrentPosition; }
+
+ // Official duration of the media resource as observed by script.
+ double mDuration;
+
+ /******
+ * The following member variables can be accessed from any thread.
+ ******/
+
+ // Media data resource.
+ RefPtr<MediaResource> mResource;
+
+ // Amount of buffered data ahead of current time required to consider that
+ // the next frame is available.
+ // An arbitrary value of 250ms is used.
+ static const int DEFAULT_NEXT_FRAME_AVAILABLE_BUFFERED = 250000;
+
+private:
+ // Called when the metadata from the media file has been loaded by the
+ // state machine. Call on the main thread only.
+ void MetadataLoaded(nsAutoPtr<MediaInfo> aInfo,
+ nsAutoPtr<MetadataTags> aTags,
+ MediaDecoderEventVisibility aEventVisibility);
+
+ MediaEventSource<void>*
+ DataArrivedEvent() override { return &mDataArrivedEvent; }
+
+ MediaEventSource<RefPtr<layers::KnowsCompositor>>*
+ CompositorUpdatedEvent() override { return &mCompositorUpdatedEvent; }
+
+ void OnPlaybackEvent(MediaEventType aEvent);
+ void OnPlaybackErrorEvent(const MediaResult& aError);
+
+ void OnDecoderDoctorEvent(DecoderDoctorEvent aEvent);
+
+ void OnMediaNotSeekable()
+ {
+ mMediaSeekable = false;
+ }
+
+ void FinishShutdown();
+
+ void ConnectMirrors(MediaDecoderStateMachine* aObject);
+ void DisconnectMirrors();
+
+ MediaEventProducer<void> mDataArrivedEvent;
+ MediaEventProducer<RefPtr<layers::KnowsCompositor>> mCompositorUpdatedEvent;
+
+ // The state machine object for handling the decoding. It is safe to
+ // call methods of this object from other threads. Its internal data
+ // is synchronised on a monitor. The lifetime of this object is
+ // after mPlayState is LOADING and before mPlayState is SHUTDOWN. It
+ // is safe to access it during this period.
+ //
+ // Explicitly prievate to force access via accessors.
+ RefPtr<MediaDecoderStateMachine> mDecoderStateMachine;
+
+ RefPtr<ResourceCallback> mResourceCallback;
+
+ MozPromiseHolder<CDMProxyPromise> mCDMProxyPromiseHolder;
+ RefPtr<CDMProxyPromise> mCDMProxyPromise;
+
+protected:
+ // The promise resolving/rejection is queued as a "micro-task" which will be
+ // handled immediately after the current JS task and before any pending JS
+ // tasks.
+ // At the time we are going to resolve/reject a promise, the "seeking" event
+ // task should already be queued but might yet be processed, so we queue one
+ // more task to file the promise resolving/rejection micro-tasks
+ // asynchronously to make sure that the micro-tasks are processed after the
+ // "seeking" event task.
+ void AsyncResolveSeekDOMPromiseIfExists();
+ void AsyncRejectSeekDOMPromiseIfExists();
+ void DiscardOngoingSeekIfExists();
+ virtual void CallSeek(const SeekTarget& aTarget, dom::Promise* aPromise);
+
+ MozPromiseRequestHolder<SeekPromise> mSeekRequest;
+ RefPtr<dom::Promise> mSeekDOMPromise;
+
+ // True when seeking or otherwise moving the play position around in
+ // such a manner that progress event data is inaccurate. This is set
+ // during seek and duration operations to prevent the progress indicator
+ // from jumping around. Read/Write on the main thread only.
+ bool mIgnoreProgressData;
+
+ // True if the stream is infinite (e.g. a webradio).
+ bool mInfiniteStream;
+
+ // Ensures our media stream has been pinned.
+ void PinForSeek();
+
+ // Ensures our media stream has been unpinned.
+ void UnpinForSeek();
+
+ const char* PlayStateStr();
+
+ void OnMetadataUpdate(TimedMetadata&& aMetadata);
+
+ // This should only ever be accessed from the main thread.
+ // It is set in the constructor and cleared in Shutdown when the element goes
+ // away. The decoder does not add a reference the element.
+ MediaDecoderOwner* mOwner;
+
+ // Counters related to decode and presentation of frames.
+ const RefPtr<FrameStatistics> mFrameStats;
+
+ RefPtr<VideoFrameContainer> mVideoFrameContainer;
+
+ // Data needed to estimate playback data rate. The timeline used for
+ // this estimate is "decode time" (where the "current time" is the
+ // time of the last decoded video frame).
+ RefPtr<MediaChannelStatistics> mPlaybackStatistics;
+
+ // True when our media stream has been pinned. We pin the stream
+ // while seeking.
+ bool mPinnedForSeek;
+
+ // Be assigned from media element during the initialization and pass to
+ // AudioStream Class.
+ dom::AudioChannel mAudioChannel;
+
+ // True if the decoder has been directed to minimize its preroll before
+ // playback starts. After the first time playback starts, we don't attempt
+ // to minimize preroll, as we assume the user is likely to keep playing,
+ // or play the media again.
+ bool mMinimizePreroll;
+
+ // True if audio tracks and video tracks are constructed and added into the
+ // track list, false if all tracks are removed from the track list.
+ bool mMediaTracksConstructed;
+
+ // True if we've already fired metadataloaded.
+ bool mFiredMetadataLoaded;
+
+ // True if the media is seekable (i.e. supports random access).
+ bool mMediaSeekable = true;
+
+ // True if the media is only seekable within its buffered ranges
+ // like WebMs with no cues.
+ bool mMediaSeekableOnlyInBufferedRanges = false;
+
+ // Stores media info, including info of audio tracks and video tracks, should
+ // only be accessed from main thread.
+ nsAutoPtr<MediaInfo> mInfo;
+
+ // Tracks the visiblity status from HTMLMediaElement
+ bool mElementVisible;
+
+ // If true, forces the decoder to be considered hidden.
+ bool mForcedHidden;
+
+ // A listener to receive metadata updates from MDSM.
+ MediaEventListener mTimedMetadataListener;
+
+ MediaEventListener mMetadataLoadedListener;
+ MediaEventListener mFirstFrameLoadedListener;
+
+ MediaEventListener mOnPlaybackEvent;
+ MediaEventListener mOnPlaybackErrorEvent;
+ MediaEventListener mOnDecoderDoctorEvent;
+ MediaEventListener mOnMediaNotSeekable;
+
+protected:
+ // Whether the state machine is shut down.
+ Mirror<bool> mStateMachineIsShutdown;
+
+ // Buffered range, mirrored from the reader.
+ Mirror<media::TimeIntervals> mBuffered;
+
+ // NextFrameStatus, mirrored from the state machine.
+ Mirror<MediaDecoderOwner::NextFrameStatus> mNextFrameStatus;
+
+ // NB: Don't use mCurrentPosition directly, but rather CurrentPosition().
+ Mirror<int64_t> mCurrentPosition;
+
+ // Duration of the media resource according to the state machine.
+ Mirror<media::NullableTimeUnit> mStateMachineDuration;
+
+ // Current playback position in the stream. This is (approximately)
+ // where we're up to playing back the stream. This is not adjusted
+ // during decoder seek operations, but it's updated at the end when we
+ // start playing back again.
+ Mirror<int64_t> mPlaybackPosition;
+
+ // Used to distinguish whether the audio is producing sound.
+ Mirror<bool> mIsAudioDataAudible;
+
+ // Volume of playback. 0.0 = muted. 1.0 = full volume.
+ Canonical<double> mVolume;
+
+ // PlaybackRate and pitch preservation status we should start at.
+ double mPlaybackRate = 1;
+
+ Canonical<bool> mPreservesPitch;
+
+ // Media duration according to the demuxer's current estimate.
+ // Note that it's quite bizarre for this to live on the main thread - it would
+ // make much more sense for this to be owned by the demuxer's task queue. But
+ // currently this is only every changed in NotifyDataArrived, which runs on
+ // the main thread. That will need to be cleaned up at some point.
+ Canonical<media::NullableTimeUnit> mEstimatedDuration;
+
+ // Media duration set explicitly by JS. At present, this is only ever present
+ // for MSE.
+ Canonical<Maybe<double>> mExplicitDuration;
+
+ // Set to one of the valid play states.
+ // This can only be changed on the main thread while holding the decoder
+ // monitor. Thus, it can be safely read while holding the decoder monitor
+ // OR on the main thread.
+ Canonical<PlayState> mPlayState;
+
+ // This can only be changed on the main thread while holding the decoder
+ // monitor. Thus, it can be safely read while holding the decoder monitor
+ // OR on the main thread.
+ Canonical<PlayState> mNextState;
+
+ // True if the decoder is seeking.
+ Canonical<bool> mLogicallySeeking;
+
+ // True if the media is same-origin with the element. Data can only be
+ // passed to MediaStreams when this is true.
+ Canonical<bool> mSameOriginMedia;
+
+ // An identifier for the principal of the media. Used to track when
+ // main-thread induced principal changes get reflected on MSG thread.
+ Canonical<PrincipalHandle> mMediaPrincipalHandle;
+
+ // Estimate of the current playback rate (bytes/second).
+ Canonical<double> mPlaybackBytesPerSecond;
+
+ // True if mPlaybackBytesPerSecond is a reliable estimate.
+ Canonical<bool> mPlaybackRateReliable;
+
+ // Current decoding position in the stream. This is where the decoder
+ // is up to consuming the stream. This is not adjusted during decoder
+ // seek operations, but it's updated at the end when we start playing
+ // back again.
+ Canonical<int64_t> mDecoderPosition;
+
+ // True if the decoder is visible.
+ Canonical<bool> mIsVisible;
+
+public:
+ AbstractCanonical<media::NullableTimeUnit>* CanonicalDurationOrNull() override;
+ AbstractCanonical<double>* CanonicalVolume() {
+ return &mVolume;
+ }
+ AbstractCanonical<bool>* CanonicalPreservesPitch() {
+ return &mPreservesPitch;
+ }
+ AbstractCanonical<media::NullableTimeUnit>* CanonicalEstimatedDuration() {
+ return &mEstimatedDuration;
+ }
+ AbstractCanonical<Maybe<double>>* CanonicalExplicitDuration() {
+ return &mExplicitDuration;
+ }
+ AbstractCanonical<PlayState>* CanonicalPlayState() {
+ return &mPlayState;
+ }
+ AbstractCanonical<PlayState>* CanonicalNextPlayState() {
+ return &mNextState;
+ }
+ AbstractCanonical<bool>* CanonicalLogicallySeeking() {
+ return &mLogicallySeeking;
+ }
+ AbstractCanonical<bool>* CanonicalSameOriginMedia() {
+ return &mSameOriginMedia;
+ }
+ AbstractCanonical<PrincipalHandle>* CanonicalMediaPrincipalHandle() {
+ return &mMediaPrincipalHandle;
+ }
+ AbstractCanonical<double>* CanonicalPlaybackBytesPerSecond() {
+ return &mPlaybackBytesPerSecond;
+ }
+ AbstractCanonical<bool>* CanonicalPlaybackRateReliable() {
+ return &mPlaybackRateReliable;
+ }
+ AbstractCanonical<int64_t>* CanonicalDecoderPosition() {
+ return &mDecoderPosition;
+ }
+ AbstractCanonical<bool>* CanonicalIsVisible() {
+ return &mIsVisible;
+ }
+
+private:
+ // Notify owner when the audible state changed
+ void NotifyAudibleStateChanged();
+
+ /* Functions called by ResourceCallback */
+
+ // A media stream is assumed to be infinite if the metadata doesn't
+ // contain the duration, and range requests are not supported, and
+ // no headers give a hint of a possible duration (Content-Length,
+ // Content-Duration, and variants), and we cannot seek in the media
+ // stream to determine the duration.
+ //
+ // When the media stream ends, we can know the duration, thus the stream is
+ // no longer considered to be infinite.
+ void SetInfinite(bool aInfinite);
+
+ // Called by MediaResource when the principal of the resource has
+ // changed. Called on main thread only.
+ void NotifyPrincipalChanged();
+
+ // Called by MediaResource when the "cache suspended" status changes.
+ // If MediaResource::IsSuspendedByCache returns true, then the decoder
+ // should stop buffering or otherwise waiting for download progress and
+ // start consuming data, if possible, because the cache is full.
+ void NotifySuspendedStatusChanged();
+
+ // Called by the MediaResource to keep track of the number of bytes read
+ // from the resource. Called on the main by an event runner dispatched
+ // by the MediaResource read functions.
+ void NotifyBytesConsumed(int64_t aBytes, int64_t aOffset);
+
+ // Called by nsChannelToPipeListener or MediaResource when the
+ // download has ended. Called on the main thread only. aStatus is
+ // the result from OnStopRequest.
+ void NotifyDownloadEnded(nsresult aStatus);
+
+ bool mTelemetryReported;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaDecoderOwner.h b/dom/media/MediaDecoderOwner.h
new file mode 100644
index 000000000..f884686fb
--- /dev/null
+++ b/dom/media/MediaDecoderOwner.h
@@ -0,0 +1,156 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MediaDecoderOwner_h_
+#define MediaDecoderOwner_h_
+#include "AbstractMediaDecoder.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+
+class VideoFrameContainer;
+class MediaResult;
+
+namespace dom {
+class HTMLMediaElement;
+} // namespace dom
+
+class MediaDecoderOwner
+{
+public:
+ // Called by the media decoder to indicate that the download is progressing.
+ virtual void DownloadProgressed() = 0;
+
+ // Dispatch an asynchronous event to the decoder owner
+ virtual nsresult DispatchAsyncEvent(const nsAString& aName) = 0;
+
+ // Triggers a recomputation of readyState.
+ virtual void UpdateReadyState() = 0;
+
+ /**
+ * Fires a timeupdate event. If aPeriodic is true, the event will only
+ * be fired if we've not fired a timeupdate event (for any reason) in the
+ * last 250ms, as required by the spec when the current time is periodically
+ * increasing during playback.
+ */
+ virtual void FireTimeUpdate(bool aPeriodic) = 0;
+
+ // Get the HTMLMediaElement object if the decoder is being used from an
+ // HTML media element, and null otherwise.
+ virtual dom::HTMLMediaElement* GetMediaElement()
+ {
+ return nullptr;
+ }
+
+ // Return true if decoding should be paused
+ virtual bool GetPaused() = 0;
+
+ // Called by the video decoder object, on the main thread,
+ // when it has read the metadata containing video dimensions,
+ // etc.
+ // Must take ownership of MetadataTags aTags argument.
+ virtual void MetadataLoaded(const MediaInfo* aInfo,
+ nsAutoPtr<const MetadataTags> aTags) = 0;
+
+ // Called by the decoder object, on the main thread,
+ // when it has read the first frame of the video or audio.
+ virtual void FirstFrameLoaded() = 0;
+
+ // Called by the decoder object, on the main thread,
+ // when the resource has a network error during loading.
+ // The decoder owner should call Shutdown() on the decoder and drop the
+ // reference to the decoder to prevent further calls into the decoder.
+ virtual void NetworkError() = 0;
+
+ // Called by the decoder object, on the main thread, when the
+ // resource has a decode error during metadata loading or decoding.
+ // The decoder owner should call Shutdown() on the decoder and drop the
+ // reference to the decoder to prevent further calls into the decoder.
+ virtual void DecodeError(const MediaResult& aError) = 0;
+
+ // Return true if media element error attribute is not null.
+ virtual bool HasError() const = 0;
+
+ // Called by the video decoder object, on the main thread, when the
+ // resource load has been cancelled.
+ virtual void LoadAborted() = 0;
+
+ // Called by the video decoder object, on the main thread,
+ // when the video playback has ended.
+ virtual void PlaybackEnded() = 0;
+
+ // Called by the video decoder object, on the main thread,
+ // when the resource has started seeking.
+ virtual void SeekStarted() = 0;
+
+ // Called by the video decoder object, on the main thread,
+ // when the resource has completed seeking.
+ virtual void SeekCompleted() = 0;
+
+ // Called by the media stream, on the main thread, when the download
+ // has been suspended by the cache or because the element itself
+ // asked the decoder to suspend the download.
+ virtual void DownloadSuspended() = 0;
+
+ // Called by the media stream, on the main thread, when the download
+ // has been resumed by the cache or because the element itself
+ // asked the decoder to resumed the download.
+ // If aForceNetworkLoading is True, ignore the fact that the download has
+ // previously finished. We are downloading the middle of the media after
+ // having downloaded the end, we need to notify the element a download in
+ // ongoing.
+ virtual void DownloadResumed(bool aForceNetworkLoading = false) = 0;
+
+ // Called by the media decoder to indicate whether the media cache has
+ // suspended the channel.
+ virtual void NotifySuspendedByCache(bool aIsSuspended) = 0;
+
+ // called to notify that the principal of the decoder's media resource has changed.
+ virtual void NotifyDecoderPrincipalChanged() = 0;
+
+ // The status of the next frame which might be available from the decoder
+ enum NextFrameStatus {
+ // The next frame of audio/video is available
+ NEXT_FRAME_AVAILABLE,
+ // The next frame of audio/video is unavailable because the decoder
+ // is paused while it buffers up data
+ NEXT_FRAME_UNAVAILABLE_BUFFERING,
+ // The next frame of audio/video is unavailable for the decoder is seeking.
+ NEXT_FRAME_UNAVAILABLE_SEEKING,
+ // The next frame of audio/video is unavailable for some other reasons
+ NEXT_FRAME_UNAVAILABLE,
+ // Sentinel value
+ NEXT_FRAME_UNINITIALIZED
+ };
+
+ // Check if the decoder owner is active.
+ virtual bool IsActive() const = 0;
+
+ // Check if the decoder owner is hidden.
+ virtual bool IsHidden() const = 0;
+
+ // Called by the media decoder and the video frame to get the
+ // ImageContainer containing the video data.
+ virtual VideoFrameContainer* GetVideoFrameContainer() = 0;
+
+ // Called by media decoder when the audible state changed
+ virtual void SetAudibleState(bool aAudible) = 0;
+
+ // Notified by the decoder that XPCOM shutdown has begun.
+ // The decoder owner should call Shutdown() on the decoder and drop the
+ // reference to the decoder to prevent further calls into the decoder.
+ virtual void NotifyXPCOMShutdown() = 0;
+
+ // Dispatches a "encrypted" event to the HTMLMediaElement, with the
+ // provided init data. Actual dispatch may be delayed until HAVE_METADATA.
+ // Main thread only.
+ virtual void DispatchEncrypted(const nsTArray<uint8_t>& aInitData,
+ const nsAString& aInitDataType) = 0;
+};
+
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/MediaDecoderReader.cpp b/dom/media/MediaDecoderReader.cpp
new file mode 100644
index 000000000..b6cdf9080
--- /dev/null
+++ b/dom/media/MediaDecoderReader.cpp
@@ -0,0 +1,376 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaDecoderReader.h"
+#include "AbstractMediaDecoder.h"
+#include "MediaResource.h"
+#include "VideoUtils.h"
+#include "ImageContainer.h"
+#include "MediaPrefs.h"
+
+#include "nsPrintfCString.h"
+#include "mozilla/mozalloc.h"
+#include "mozilla/Mutex.h"
+#include <stdint.h>
+#include <algorithm>
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+// Un-comment to enable logging of seek bisections.
+//#define SEEK_LOGGING
+
+extern LazyLogModule gMediaDecoderLog;
+
+// avoid redefined macro in unified build
+#undef FMT
+#undef DECODER_LOG
+#undef DECODER_WARN
+
+#define FMT(x, ...) "Decoder=%p " x, mDecoder, ##__VA_ARGS__
+#define DECODER_LOG(...) MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, (FMT(__VA_ARGS__)))
+#define DECODER_WARN(...) NS_WARNING(nsPrintfCString(FMT(__VA_ARGS__)).get())
+
+class VideoQueueMemoryFunctor : public nsDequeFunctor {
+public:
+ VideoQueueMemoryFunctor() : mSize(0) {}
+
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf);
+
+ virtual void* operator()(void* aObject) {
+ const VideoData* v = static_cast<const VideoData*>(aObject);
+ mSize += v->SizeOfIncludingThis(MallocSizeOf);
+ return nullptr;
+ }
+
+ size_t mSize;
+};
+
+
+class AudioQueueMemoryFunctor : public nsDequeFunctor {
+public:
+ AudioQueueMemoryFunctor() : mSize(0) {}
+
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf);
+
+ virtual void* operator()(void* aObject) {
+ const AudioData* audioData = static_cast<const AudioData*>(aObject);
+ mSize += audioData->SizeOfIncludingThis(MallocSizeOf);
+ return nullptr;
+ }
+
+ size_t mSize;
+};
+
+MediaDecoderReader::MediaDecoderReader(AbstractMediaDecoder* aDecoder)
+ : mAudioCompactor(mAudioQueue)
+ , mDecoder(aDecoder)
+ , mTaskQueue(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK),
+ /* aSupportsTailDispatch = */ true))
+ , mWatchManager(this, mTaskQueue)
+ , mBuffered(mTaskQueue, TimeIntervals(), "MediaDecoderReader::mBuffered (Canonical)")
+ , mDuration(mTaskQueue, NullableTimeUnit(), "MediaDecoderReader::mDuration (Mirror)")
+ , mIgnoreAudioOutputFormat(false)
+ , mHitAudioDecodeError(false)
+ , mShutdown(false)
+{
+ MOZ_COUNT_CTOR(MediaDecoderReader);
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+nsresult
+MediaDecoderReader::Init()
+{
+ if (mDecoder && mDecoder->DataArrivedEvent()) {
+ mDataArrivedListener = mDecoder->DataArrivedEvent()->Connect(
+ mTaskQueue, this, &MediaDecoderReader::NotifyDataArrived);
+ }
+ // Dispatch initialization that needs to happen on that task queue.
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &MediaDecoderReader::InitializationTask));
+ return InitInternal();
+}
+
+void
+MediaDecoderReader::InitializationTask()
+{
+ if (!mDecoder) {
+ return;
+ }
+ if (mDecoder->CanonicalDurationOrNull()) {
+ mDuration.Connect(mDecoder->CanonicalDurationOrNull());
+ }
+
+ // Initialize watchers.
+ mWatchManager.Watch(mDuration, &MediaDecoderReader::UpdateBuffered);
+}
+
+MediaDecoderReader::~MediaDecoderReader()
+{
+ MOZ_ASSERT(mShutdown);
+ MOZ_COUNT_DTOR(MediaDecoderReader);
+}
+
+size_t MediaDecoderReader::SizeOfVideoQueueInBytes() const
+{
+ VideoQueueMemoryFunctor functor;
+ mVideoQueue.LockedForEach(functor);
+ return functor.mSize;
+}
+
+size_t MediaDecoderReader::SizeOfAudioQueueInBytes() const
+{
+ AudioQueueMemoryFunctor functor;
+ mAudioQueue.LockedForEach(functor);
+ return functor.mSize;
+}
+
+size_t MediaDecoderReader::SizeOfVideoQueueInFrames()
+{
+ return mVideoQueue.GetSize();
+}
+
+size_t MediaDecoderReader::SizeOfAudioQueueInFrames()
+{
+ return mAudioQueue.GetSize();
+}
+
+nsresult MediaDecoderReader::ResetDecode(TrackSet aTracks)
+{
+ if (aTracks.contains(TrackInfo::kVideoTrack)) {
+ VideoQueue().Reset();
+ mBaseVideoPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+
+ if (aTracks.contains(TrackInfo::kAudioTrack)) {
+ AudioQueue().Reset();
+ mBaseAudioPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+
+ return NS_OK;
+}
+
+RefPtr<MediaDecoderReader::MediaDataPromise>
+MediaDecoderReader::DecodeToFirstVideoData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ typedef MediaDecoderReader::MediaDataPromise PromiseType;
+ RefPtr<PromiseType::Private> p = new PromiseType::Private(__func__);
+ RefPtr<MediaDecoderReader> self = this;
+ InvokeUntil([self] () -> bool {
+ MOZ_ASSERT(self->OnTaskQueue());
+ NS_ENSURE_TRUE(!self->mShutdown, false);
+ bool skip = false;
+ if (!self->DecodeVideoFrame(skip, 0)) {
+ self->VideoQueue().Finish();
+ return !!self->VideoQueue().PeekFront();
+ }
+ return true;
+ }, [self] () -> bool {
+ MOZ_ASSERT(self->OnTaskQueue());
+ return self->VideoQueue().GetSize();
+ })->Then(OwnerThread(), __func__, [self, p] () {
+ p->Resolve(self->VideoQueue().PeekFront(), __func__);
+ }, [p] () {
+ // We don't have a way to differentiate EOS, error, and shutdown here. :-(
+ p->Reject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ });
+
+ return p.forget();
+}
+
+void
+MediaDecoderReader::UpdateBuffered()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ NS_ENSURE_TRUE_VOID(!mShutdown);
+ mBuffered = GetBuffered();
+}
+
+void
+MediaDecoderReader::VisibilityChanged()
+{}
+
+media::TimeIntervals
+MediaDecoderReader::GetBuffered()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (!HaveStartTime()) {
+ return media::TimeIntervals();
+ }
+ AutoPinned<MediaResource> stream(mDecoder->GetResource());
+
+ if (!mDuration.Ref().isSome()) {
+ return TimeIntervals();
+ }
+
+ return GetEstimatedBufferedTimeRanges(stream, mDuration.Ref().ref().ToMicroseconds());
+}
+
+RefPtr<MediaDecoderReader::MetadataPromise>
+MediaDecoderReader::AsyncReadMetadata()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ DECODER_LOG("MediaDecoderReader::AsyncReadMetadata");
+
+ // Attempt to read the metadata.
+ RefPtr<MetadataHolder> metadata = new MetadataHolder();
+ nsresult rv = ReadMetadata(&metadata->mInfo, getter_Transfers(metadata->mTags));
+ metadata->mInfo.AssertValid();
+
+ // We're not waiting for anything. If we didn't get the metadata, that's an
+ // error.
+ if (NS_FAILED(rv) || !metadata->mInfo.HasValidMedia()) {
+ DECODER_WARN("ReadMetadata failed, rv=%x HasValidMedia=%d", rv, metadata->mInfo.HasValidMedia());
+ return MetadataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ // Success!
+ return MetadataPromise::CreateAndResolve(metadata, __func__);
+}
+
+class ReRequestVideoWithSkipTask : public Runnable
+{
+public:
+ ReRequestVideoWithSkipTask(MediaDecoderReader* aReader,
+ int64_t aTimeThreshold)
+ : mReader(aReader)
+ , mTimeThreshold(aTimeThreshold)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(mReader->OnTaskQueue());
+
+ // Make sure ResetDecode hasn't been called in the mean time.
+ if (!mReader->mBaseVideoPromise.IsEmpty()) {
+ mReader->RequestVideoData(/* aSkip = */ true, mTimeThreshold);
+ }
+
+ return NS_OK;
+ }
+
+private:
+ RefPtr<MediaDecoderReader> mReader;
+ const int64_t mTimeThreshold;
+};
+
+class ReRequestAudioTask : public Runnable
+{
+public:
+ explicit ReRequestAudioTask(MediaDecoderReader* aReader)
+ : mReader(aReader)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(mReader->OnTaskQueue());
+
+ // Make sure ResetDecode hasn't been called in the mean time.
+ if (!mReader->mBaseAudioPromise.IsEmpty()) {
+ mReader->RequestAudioData();
+ }
+
+ return NS_OK;
+ }
+
+private:
+ RefPtr<MediaDecoderReader> mReader;
+};
+
+RefPtr<MediaDecoderReader::MediaDataPromise>
+MediaDecoderReader::RequestVideoData(bool aSkipToNextKeyframe,
+ int64_t aTimeThreshold)
+{
+ RefPtr<MediaDataPromise> p = mBaseVideoPromise.Ensure(__func__);
+ bool skip = aSkipToNextKeyframe;
+ while (VideoQueue().GetSize() == 0 &&
+ !VideoQueue().IsFinished()) {
+ if (!DecodeVideoFrame(skip, aTimeThreshold)) {
+ VideoQueue().Finish();
+ } else if (skip) {
+ // We still need to decode more data in order to skip to the next
+ // keyframe. Post another task to the decode task queue to decode
+ // again. We don't just decode straight in a loop here, as that
+ // would hog the decode task queue.
+ RefPtr<nsIRunnable> task(new ReRequestVideoWithSkipTask(this, aTimeThreshold));
+ mTaskQueue->Dispatch(task.forget());
+ return p;
+ }
+ }
+ if (VideoQueue().GetSize() > 0) {
+ RefPtr<VideoData> v = VideoQueue().PopFront();
+ mBaseVideoPromise.Resolve(v, __func__);
+ } else if (VideoQueue().IsFinished()) {
+ mBaseVideoPromise.Reject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ } else {
+ MOZ_ASSERT(false, "Dropping this promise on the floor");
+ }
+
+ return p;
+}
+
+RefPtr<MediaDecoderReader::MediaDataPromise>
+MediaDecoderReader::RequestAudioData()
+{
+ RefPtr<MediaDataPromise> p = mBaseAudioPromise.Ensure(__func__);
+ while (AudioQueue().GetSize() == 0 &&
+ !AudioQueue().IsFinished()) {
+ if (!DecodeAudioData()) {
+ AudioQueue().Finish();
+ break;
+ }
+ // AudioQueue size is still zero, post a task to try again. Don't spin
+ // waiting in this while loop since it somehow prevents audio EOS from
+ // coming in gstreamer 1.x when there is still video buffer waiting to be
+ // consumed. (|mVideoSinkBufferCount| > 0)
+ if (AudioQueue().GetSize() == 0) {
+ RefPtr<nsIRunnable> task(new ReRequestAudioTask(this));
+ mTaskQueue->Dispatch(task.forget());
+ return p;
+ }
+ }
+ if (AudioQueue().GetSize() > 0) {
+ RefPtr<AudioData> a = AudioQueue().PopFront();
+ mBaseAudioPromise.Resolve(a, __func__);
+ } else if (AudioQueue().IsFinished()) {
+ mBaseAudioPromise.Reject(mHitAudioDecodeError
+ ? NS_ERROR_DOM_MEDIA_FATAL_ERR
+ : NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ mHitAudioDecodeError = false;
+ } else {
+ MOZ_ASSERT(false, "Dropping this promise on the floor");
+ }
+
+ return p;
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderReader::Shutdown()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mShutdown = true;
+
+ mBaseAudioPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ mBaseVideoPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+
+ mDataArrivedListener.DisconnectIfExists();
+
+ ReleaseResources();
+ mDuration.DisconnectIfConnected();
+ mBuffered.DisconnectAll();
+
+ // Shut down the watch manager before shutting down our task queue.
+ mWatchManager.Shutdown();
+
+ mDecoder = nullptr;
+
+ return mTaskQueue->BeginShutdown();
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaDecoderReader.h b/dom/media/MediaDecoderReader.h
new file mode 100644
index 000000000..8a6997826
--- /dev/null
+++ b/dom/media/MediaDecoderReader.h
@@ -0,0 +1,445 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(MediaDecoderReader_h_)
+#define MediaDecoderReader_h_
+
+#include "mozilla/EnumSet.h"
+#include "mozilla/MozPromise.h"
+#include "nsAutoPtr.h"
+
+#include "AbstractMediaDecoder.h"
+#include "MediaInfo.h"
+#include "MediaData.h"
+#include "MediaResult.h"
+#include "MediaMetadataManager.h"
+#include "MediaQueue.h"
+#include "MediaTimer.h"
+#include "AudioCompactor.h"
+#include "Intervals.h"
+#include "TimeUnits.h"
+#include "SeekTarget.h"
+
+namespace mozilla {
+
+class CDMProxy;
+class MediaDecoderReader;
+
+struct WaitForDataRejectValue
+{
+ enum Reason {
+ SHUTDOWN,
+ CANCELED
+ };
+
+ WaitForDataRejectValue(MediaData::Type aType, Reason aReason)
+ :mType(aType), mReason(aReason) {}
+ MediaData::Type mType;
+ Reason mReason;
+};
+
+class MetadataHolder
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MetadataHolder)
+ MediaInfo mInfo;
+ nsAutoPtr<MetadataTags> mTags;
+
+private:
+ virtual ~MetadataHolder() {}
+};
+
+// Encapsulates the decoding and reading of media data. Reading can either
+// synchronous and done on the calling "decode" thread, or asynchronous and
+// performed on a background thread, with the result being returned by
+// callback. Never hold the decoder monitor when calling into this class.
+// Unless otherwise specified, methods and fields of this class can only
+// be accessed on the decode task queue.
+class MediaDecoderReader {
+ friend class ReRequestVideoWithSkipTask;
+ friend class ReRequestAudioTask;
+
+ static const bool IsExclusive = true;
+
+public:
+ using TrackSet = EnumSet<TrackInfo::TrackType>;
+
+ using MetadataPromise =
+ MozPromise<RefPtr<MetadataHolder>, MediaResult, IsExclusive>;
+ using MediaDataPromise =
+ MozPromise<RefPtr<MediaData>, MediaResult, IsExclusive>;
+ using SeekPromise = MozPromise<media::TimeUnit, nsresult, IsExclusive>;
+
+ // Note that, conceptually, WaitForData makes sense in a non-exclusive sense.
+ // But in the current architecture it's only ever used exclusively (by MDSM),
+ // so we mark it that way to verify our assumptions. If you have a use-case
+ // for multiple WaitForData consumers, feel free to flip the exclusivity here.
+ using WaitForDataPromise =
+ MozPromise<MediaData::Type, WaitForDataRejectValue, IsExclusive>;
+
+ using BufferedUpdatePromise = MozPromise<bool, bool, IsExclusive>;
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderReader)
+
+ // The caller must ensure that Shutdown() is called before aDecoder is
+ // destroyed.
+ explicit MediaDecoderReader(AbstractMediaDecoder* aDecoder);
+
+ // Initializes the reader, returns NS_OK on success, or NS_ERROR_FAILURE
+ // on failure.
+ nsresult Init();
+
+ // Called by MDSM in dormant state to release resources allocated by this
+ // reader. The reader can resume decoding by calling Seek() to a specific
+ // position.
+ virtual void ReleaseResources() {}
+
+ // Destroys the decoding state. The reader cannot be made usable again.
+ // This is different from ReleaseMediaResources() as it is irreversable,
+ // whereas ReleaseMediaResources() is. Must be called on the decode
+ // thread.
+ virtual RefPtr<ShutdownPromise> Shutdown();
+
+ virtual bool OnTaskQueue() const
+ {
+ return OwnerThread()->IsCurrentThreadIn();
+ }
+
+ // Resets all state related to decoding, emptying all buffers etc.
+ // Cancels all pending Request*Data() request callbacks, rejects any
+ // outstanding seek promises, and flushes the decode pipeline. The
+ // decoder must not call any of the callbacks for outstanding
+ // Request*Data() calls after this is called. Calls to Request*Data()
+ // made after this should be processed as usual.
+ //
+ // Normally this call preceedes a Seek() call, or shutdown.
+ //
+ // The first samples of every stream produced after a ResetDecode() call
+ // *must* be marked as "discontinuities". If it's not, seeking work won't
+ // properly!
+ //
+ // aParam is a set of TrackInfo::TrackType enums specifying which
+ // queues need to be reset, defaulting to both audio and video tracks.
+ virtual nsresult ResetDecode(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
+ TrackInfo::kVideoTrack));
+
+ // Requests one audio sample from the reader.
+ //
+ // The decode should be performed asynchronously, and the promise should
+ // be resolved when it is complete. Don't hold the decoder
+ // monitor while calling this, as the implementation may try to wait
+ // on something that needs the monitor and deadlock.
+ virtual RefPtr<MediaDataPromise> RequestAudioData();
+
+ // Requests one video sample from the reader.
+ //
+ // Don't hold the decoder monitor while calling this, as the implementation
+ // may try to wait on something that needs the monitor and deadlock.
+ // If aSkipToKeyframe is true, the decode should skip ahead to the
+ // the next keyframe at or after aTimeThreshold microseconds.
+ virtual RefPtr<MediaDataPromise>
+ RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold);
+
+ // By default, the state machine polls the reader once per second when it's
+ // in buffering mode. Some readers support a promise-based mechanism by which
+ // they notify the state machine when the data arrives.
+ virtual bool IsWaitForDataSupported() const { return false; }
+
+ virtual RefPtr<WaitForDataPromise> WaitForData(MediaData::Type aType)
+ {
+ MOZ_CRASH();
+ }
+
+ // By default, the reader return the decoded data. Some readers support
+ // retuning demuxed data.
+ virtual bool IsDemuxOnlySupported() const { return false; }
+
+ // Configure the reader to return demuxed or decoded data
+ // upon calls to Request{Audio,Video}Data.
+ virtual void SetDemuxOnly(bool /*aDemuxedOnly*/) {}
+
+ // The default implementation of AsyncReadMetadata is implemented in terms of
+ // synchronous ReadMetadata() calls. Implementations may also
+ // override AsyncReadMetadata to create a more proper async implementation.
+ virtual RefPtr<MetadataPromise> AsyncReadMetadata();
+
+ // Fills aInfo with the latest cached data required to present the media,
+ // ReadUpdatedMetadata will always be called once ReadMetadata has succeeded.
+ virtual void ReadUpdatedMetadata(MediaInfo* aInfo) {}
+
+ // Moves the decode head to aTime microseconds. aEndTime denotes the end
+ // time of the media in usecs. This is only needed for OggReader, and should
+ // probably be removed somehow.
+ virtual RefPtr<SeekPromise> Seek(SeekTarget aTarget, int64_t aEndTime) = 0;
+
+ // Called to move the reader into idle state. When the reader is
+ // created it is assumed to be active (i.e. not idle). When the media
+ // element is paused and we don't need to decode any more data, the state
+ // machine calls SetIdle() to inform the reader that its decoder won't be
+ // needed for a while. The reader can use these notifications to enter
+ // a low power state when the decoder isn't needed, if desired.
+ // This is most useful on mobile.
+ // Note: DecodeVideoFrame, DecodeAudioData, ReadMetadata and Seek should
+ // activate the decoder if necessary. The state machine only needs to know
+ // when to call SetIdle().
+ virtual void SetIdle() {}
+
+ virtual void SetCDMProxy(CDMProxy* aProxy) {}
+
+ // Tell the reader that the data decoded are not for direct playback, so it
+ // can accept more files, in particular those which have more channels than
+ // available in the audio output.
+ void SetIgnoreAudioOutputFormat()
+ {
+ mIgnoreAudioOutputFormat = true;
+ }
+
+ // MediaSourceReader opts out of the start-time-guessing mechanism.
+ virtual bool ForceZeroStartTime() const { return false; }
+
+ // The MediaDecoderStateMachine uses various heuristics that assume that
+ // raw media data is arriving sequentially from a network channel. This
+ // makes sense in the <video src="foo"> case, but not for more advanced use
+ // cases like MSE.
+ virtual bool UseBufferingHeuristics() const { return true; }
+
+ // Returns the number of bytes of memory allocated by structures/frames in
+ // the video queue.
+ size_t SizeOfVideoQueueInBytes() const;
+
+ // Returns the number of bytes of memory allocated by structures/frames in
+ // the audio queue.
+ size_t SizeOfAudioQueueInBytes() const;
+
+ virtual size_t SizeOfVideoQueueInFrames();
+ virtual size_t SizeOfAudioQueueInFrames();
+
+ void NotifyDataArrived()
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ NS_ENSURE_TRUE_VOID(!mShutdown);
+ NotifyDataArrivedInternal();
+ UpdateBuffered();
+ }
+
+ // Update the buffered ranges and upon doing so return a promise
+ // to indicate success. Overrides may need to do extra work to ensure
+ // buffered is up to date.
+ virtual RefPtr<BufferedUpdatePromise> UpdateBufferedWithPromise()
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ UpdateBuffered();
+ return BufferedUpdatePromise::CreateAndResolve(true, __func__);
+ }
+
+ virtual MediaQueue<AudioData>& AudioQueue() { return mAudioQueue; }
+ virtual MediaQueue<VideoData>& VideoQueue() { return mVideoQueue; }
+
+ AbstractCanonical<media::TimeIntervals>* CanonicalBuffered()
+ {
+ return &mBuffered;
+ }
+
+ void DispatchSetStartTime(int64_t aStartTime)
+ {
+ RefPtr<MediaDecoderReader> self = this;
+ nsCOMPtr<nsIRunnable> r =
+ NS_NewRunnableFunction([self, aStartTime] () -> void
+ {
+ MOZ_ASSERT(self->OnTaskQueue());
+ MOZ_ASSERT(!self->HaveStartTime());
+ self->mStartTime.emplace(aStartTime);
+ self->UpdateBuffered();
+ });
+ OwnerThread()->Dispatch(r.forget());
+ }
+
+ TaskQueue* OwnerThread() const
+ {
+ return mTaskQueue;
+ }
+
+ // Returns true if the reader implements RequestAudioData()
+ // and RequestVideoData() asynchronously, rather than using the
+ // implementation in this class to adapt the old synchronous to
+ // the newer async model.
+ virtual bool IsAsync() const { return false; }
+
+ // Returns true if this decoder reader uses hardware accelerated video
+ // decoding.
+ virtual bool VideoIsHardwareAccelerated() const { return false; }
+
+ TimedMetadataEventSource& TimedMetadataEvent()
+ {
+ return mTimedMetadataEvent;
+ }
+
+ // Notified by the OggReader during playback when chained ogg is detected.
+ MediaEventSource<void>& OnMediaNotSeekable() { return mOnMediaNotSeekable; }
+
+ TimedMetadataEventProducer& TimedMetadataProducer()
+ {
+ return mTimedMetadataEvent;
+ }
+
+ MediaEventProducer<void>& MediaNotSeekableProducer()
+ {
+ return mOnMediaNotSeekable;
+ }
+
+ // Switch the video decoder to BlankDecoderModule. It might takes effective
+ // since a few samples later depends on how much demuxed samples are already
+ // queued in the original video decoder.
+ virtual void SetVideoBlankDecode(bool aIsBlankDecode) {}
+
+protected:
+ virtual ~MediaDecoderReader();
+
+ // Populates aBuffered with the time ranges which are buffered. This may only
+ // be called on the decode task queue, and should only be used internally by
+ // UpdateBuffered - mBuffered (or mirrors of it) should be used for everything
+ // else.
+ //
+ // This base implementation in MediaDecoderReader estimates the time ranges
+ // buffered by interpolating the cached byte ranges with the duration
+ // of the media. Reader subclasses should override this method if they
+ // can quickly calculate the buffered ranges more accurately.
+ //
+ // The primary advantage of this implementation in the reader base class
+ // is that it's a fast approximation, which does not perform any I/O.
+ //
+ // The OggReader relies on this base implementation not performing I/O,
+ // since in FirefoxOS we can't do I/O on the main thread, where this is
+ // called.
+ virtual media::TimeIntervals GetBuffered();
+
+ RefPtr<MediaDataPromise> DecodeToFirstVideoData();
+
+ bool HaveStartTime()
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ return mStartTime.isSome();
+ }
+
+ int64_t StartTime() { MOZ_ASSERT(HaveStartTime()); return mStartTime.ref(); }
+
+ // Queue of audio frames. This queue is threadsafe, and is accessed from
+ // the audio, decoder, state machine, and main threads.
+ MediaQueue<AudioData> mAudioQueue;
+
+ // Queue of video frames. This queue is threadsafe, and is accessed from
+ // the decoder, state machine, and main threads.
+ MediaQueue<VideoData> mVideoQueue;
+
+ // An adapter to the audio queue which first copies data to buffers with
+ // minimal allocation slop and then pushes them to the queue. This is
+ // useful for decoders working with formats that give awkward numbers of
+ // frames such as mp3.
+ AudioCompactor mAudioCompactor;
+
+ // Reference to the owning decoder object.
+ AbstractMediaDecoder* mDecoder;
+
+ // Decode task queue.
+ RefPtr<TaskQueue> mTaskQueue;
+
+ // State-watching manager.
+ WatchManager<MediaDecoderReader> mWatchManager;
+
+ // Buffered range.
+ Canonical<media::TimeIntervals> mBuffered;
+
+ // Stores presentation info required for playback.
+ MediaInfo mInfo;
+
+ // Duration, mirrored from the state machine task queue.
+ Mirror<media::NullableTimeUnit> mDuration;
+
+ // Whether we should accept media that we know we can't play
+ // directly, because they have a number of channel higher than
+ // what we support.
+ bool mIgnoreAudioOutputFormat;
+
+ // The start time of the media, in microseconds. This is the presentation
+ // time of the first frame decoded from the media. This is initialized to -1,
+ // and then set to a value >= by MediaDecoderStateMachine::SetStartTime(),
+ // after which point it never changes (though SetStartTime may be called
+ // multiple times with the same value).
+ //
+ // This is an ugly breach of abstractions - it's currently necessary for the
+ // readers to return the correct value of GetBuffered. We should refactor
+ // things such that all GetBuffered calls go through the MDSM, which would
+ // offset the range accordingly.
+ Maybe<int64_t> mStartTime;
+
+ // This is a quick-and-dirty way for DecodeAudioData implementations to
+ // communicate the presence of a decoding error to RequestAudioData. We should
+ // replace this with a promise-y mechanism as we make this stuff properly
+ // async.
+ bool mHitAudioDecodeError;
+ bool mShutdown;
+
+ // Used to send TimedMetadata to the listener.
+ TimedMetadataEventProducer mTimedMetadataEvent;
+
+ // Notify if this media is not seekable.
+ MediaEventProducer<void> mOnMediaNotSeekable;
+
+private:
+ virtual nsresult InitInternal() { return NS_OK; }
+
+ // Does any spinup that needs to happen on this task queue. This runs on a
+ // different thread than Init, and there should not be ordering dependencies
+ // between the two (even though in practice, Init will always run first right
+ // now thanks to the tail dispatcher).
+ void InitializationTask();
+
+ // Read header data for all bitstreams in the file. Fills aInfo with
+ // the data required to present the media, and optionally fills *aTags
+ // with tag metadata from the file.
+ // Returns NS_OK on success, or NS_ERROR_FAILURE on failure.
+ virtual nsresult ReadMetadata(MediaInfo* aInfo, MetadataTags** aTags)
+ {
+ MOZ_CRASH();
+ }
+
+ // Recomputes mBuffered.
+ virtual void UpdateBuffered();
+
+ virtual void VisibilityChanged();
+
+ virtual void NotifyDataArrivedInternal() {}
+
+ // Overrides of this function should decodes an unspecified amount of
+ // audio data, enqueuing the audio data in mAudioQueue. Returns true
+ // when there's more audio to decode, false if the audio is finished,
+ // end of file has been reached, or an un-recoverable read error has
+ // occured. This function blocks until the decode is complete.
+ virtual bool DecodeAudioData()
+ {
+ return false;
+ }
+
+ // Overrides of this function should read and decodes one video frame.
+ // Packets with a timestamp less than aTimeThreshold will be decoded
+ // (unless they're not keyframes and aKeyframeSkip is true), but will
+ // not be added to the queue. This function blocks until the decode
+ // is complete.
+ virtual bool DecodeVideoFrame(bool &aKeyframeSkip, int64_t aTimeThreshold)
+ {
+ return false;
+ }
+
+ // Promises used only for the base-class (sync->async adapter) implementation
+ // of Request{Audio,Video}Data.
+ MozPromiseHolder<MediaDataPromise> mBaseAudioPromise;
+ MozPromiseHolder<MediaDataPromise> mBaseVideoPromise;
+
+ MediaEventListener mDataArrivedListener;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaDecoderReaderWrapper.cpp b/dom/media/MediaDecoderReaderWrapper.cpp
new file mode 100644
index 000000000..455e86f43
--- /dev/null
+++ b/dom/media/MediaDecoderReaderWrapper.cpp
@@ -0,0 +1,422 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/MozPromise.h"
+#include "MediaDecoderReaderWrapper.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+
+#undef LOG
+#define LOG(...) \
+ MOZ_LOG(gMediaDecoderLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+// StartTimeRendezvous is a helper class that quarantines the first sample
+// until it gets a sample from both channels, such that we can be guaranteed
+// to know the start time by the time On{Audio,Video}Decoded is called on MDSM.
+class StartTimeRendezvous {
+ typedef MediaDecoderReader::MediaDataPromise MediaDataPromise;
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(StartTimeRendezvous);
+
+public:
+ StartTimeRendezvous(AbstractThread* aOwnerThread,
+ bool aHasAudio,
+ bool aHasVideo,
+ bool aForceZeroStartTime)
+ : mOwnerThread(aOwnerThread)
+ {
+ if (aForceZeroStartTime) {
+ mAudioStartTime.emplace(0);
+ mVideoStartTime.emplace(0);
+ return;
+ }
+ if (!aHasAudio) {
+ mAudioStartTime.emplace(INT64_MAX);
+ }
+ if (!aHasVideo) {
+ mVideoStartTime.emplace(INT64_MAX);
+ }
+ }
+
+ void Destroy()
+ {
+ mAudioStartTime = Some(mAudioStartTime.refOr(INT64_MAX));
+ mVideoStartTime = Some(mVideoStartTime.refOr(INT64_MAX));
+ mHaveStartTimePromise.RejectIfExists(false, __func__);
+ }
+
+ RefPtr<HaveStartTimePromise> AwaitStartTime()
+ {
+ if (HaveStartTime()) {
+ return HaveStartTimePromise::CreateAndResolve(true, __func__);
+ }
+ return mHaveStartTimePromise.Ensure(__func__);
+ }
+
+ template<MediaData::Type SampleType>
+ RefPtr<MediaDataPromise>
+ ProcessFirstSample(MediaData* aData)
+ {
+ typedef typename MediaDataPromise::Private PromisePrivate;
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+
+ MaybeSetChannelStartTime<SampleType>(aData->mTime);
+
+ RefPtr<PromisePrivate> p = new PromisePrivate(__func__);
+ RefPtr<MediaData> data = aData;
+ RefPtr<StartTimeRendezvous> self = this;
+ AwaitStartTime()->Then(
+ mOwnerThread, __func__,
+ [p, data, self] () {
+ MOZ_ASSERT(self->mOwnerThread->IsCurrentThreadIn());
+ p->Resolve(data, __func__);
+ },
+ [p] () {
+ p->Reject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ });
+
+ return p.forget();
+ }
+
+ template<MediaData::Type SampleType>
+ void FirstSampleRejected(const MediaResult& aError)
+ {
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ LOG("StartTimeRendezvous=%p SampleType(%d) Has no samples.",
+ this, SampleType);
+ MaybeSetChannelStartTime<SampleType>(INT64_MAX);
+ } else if (aError != NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
+ mHaveStartTimePromise.RejectIfExists(false, __func__);
+ }
+ }
+
+ bool HaveStartTime() const
+ {
+ return mAudioStartTime.isSome() && mVideoStartTime.isSome();
+ }
+
+ int64_t StartTime() const
+ {
+ int64_t time = std::min(mAudioStartTime.ref(), mVideoStartTime.ref());
+ return time == INT64_MAX ? 0 : time;
+ }
+
+private:
+ ~StartTimeRendezvous() {}
+
+ template<MediaData::Type SampleType>
+ void MaybeSetChannelStartTime(int64_t aStartTime)
+ {
+ if (ChannelStartTime(SampleType).isSome()) {
+ // If we're initialized with aForceZeroStartTime=true, the channel start
+ // times are already set.
+ return;
+ }
+
+ LOG("StartTimeRendezvous=%p Setting SampleType(%d) start time to %lld",
+ this, SampleType, aStartTime);
+
+ ChannelStartTime(SampleType).emplace(aStartTime);
+ if (HaveStartTime()) {
+ mHaveStartTimePromise.ResolveIfExists(true, __func__);
+ }
+ }
+
+ Maybe<int64_t>& ChannelStartTime(MediaData::Type aType)
+ {
+ return aType == MediaData::AUDIO_DATA ? mAudioStartTime : mVideoStartTime;
+ }
+
+ MozPromiseHolder<HaveStartTimePromise> mHaveStartTimePromise;
+ RefPtr<AbstractThread> mOwnerThread;
+ Maybe<int64_t> mAudioStartTime;
+ Maybe<int64_t> mVideoStartTime;
+};
+
+MediaDecoderReaderWrapper::MediaDecoderReaderWrapper(AbstractThread* aOwnerThread,
+ MediaDecoderReader* aReader)
+ : mForceZeroStartTime(aReader->ForceZeroStartTime())
+ , mOwnerThread(aOwnerThread)
+ , mReader(aReader)
+{}
+
+MediaDecoderReaderWrapper::~MediaDecoderReaderWrapper()
+{}
+
+media::TimeUnit
+MediaDecoderReaderWrapper::StartTime() const
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ MOZ_ASSERT(!mShutdown);
+ return media::TimeUnit::FromMicroseconds(mStartTimeRendezvous->StartTime());
+}
+
+RefPtr<MediaDecoderReaderWrapper::MetadataPromise>
+MediaDecoderReaderWrapper::ReadMetadata()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ MOZ_ASSERT(!mShutdown);
+ return InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::AsyncReadMetadata)
+ ->Then(mOwnerThread, __func__, this,
+ &MediaDecoderReaderWrapper::OnMetadataRead,
+ &MediaDecoderReaderWrapper::OnMetadataNotRead)
+ ->CompletionPromise();
+}
+
+RefPtr<HaveStartTimePromise>
+MediaDecoderReaderWrapper::AwaitStartTime()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ MOZ_ASSERT(!mShutdown);
+ return mStartTimeRendezvous->AwaitStartTime();
+}
+
+void
+MediaDecoderReaderWrapper::RequestAudioData()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ MOZ_ASSERT(!mShutdown);
+
+ auto p = InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::RequestAudioData);
+
+ if (!mStartTimeRendezvous->HaveStartTime()) {
+ p = p->Then(mOwnerThread, __func__, mStartTimeRendezvous.get(),
+ &StartTimeRendezvous::ProcessFirstSample<MediaData::AUDIO_DATA>,
+ &StartTimeRendezvous::FirstSampleRejected<MediaData::AUDIO_DATA>)
+ ->CompletionPromise();
+ }
+
+ RefPtr<MediaDecoderReaderWrapper> self = this;
+ mAudioDataRequest.Begin(p->Then(mOwnerThread, __func__,
+ [self] (MediaData* aAudioSample) {
+ self->mAudioDataRequest.Complete();
+ aAudioSample->AdjustForStartTime(self->StartTime().ToMicroseconds());
+ self->mAudioCallback.Notify(AsVariant(aAudioSample));
+ },
+ [self] (const MediaResult& aError) {
+ self->mAudioDataRequest.Complete();
+ self->mAudioCallback.Notify(AsVariant(aError));
+ }));
+}
+
+void
+MediaDecoderReaderWrapper::RequestVideoData(bool aSkipToNextKeyframe,
+ media::TimeUnit aTimeThreshold)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ MOZ_ASSERT(!mShutdown);
+
+ // Time the video decode and send this value back to callbacks who accept
+ // a TimeStamp as its second parameter.
+ TimeStamp videoDecodeStartTime = TimeStamp::Now();
+
+ if (aTimeThreshold.ToMicroseconds() > 0 &&
+ mStartTimeRendezvous->HaveStartTime()) {
+ aTimeThreshold += StartTime();
+ }
+
+ auto p = InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::RequestVideoData,
+ aSkipToNextKeyframe, aTimeThreshold.ToMicroseconds());
+
+ if (!mStartTimeRendezvous->HaveStartTime()) {
+ p = p->Then(mOwnerThread, __func__, mStartTimeRendezvous.get(),
+ &StartTimeRendezvous::ProcessFirstSample<MediaData::VIDEO_DATA>,
+ &StartTimeRendezvous::FirstSampleRejected<MediaData::VIDEO_DATA>)
+ ->CompletionPromise();
+ }
+
+ RefPtr<MediaDecoderReaderWrapper> self = this;
+ mVideoDataRequest.Begin(p->Then(mOwnerThread, __func__,
+ [self, videoDecodeStartTime] (MediaData* aVideoSample) {
+ self->mVideoDataRequest.Complete();
+ aVideoSample->AdjustForStartTime(self->StartTime().ToMicroseconds());
+ self->mVideoCallback.Notify(AsVariant(MakeTuple(aVideoSample, videoDecodeStartTime)));
+ },
+ [self] (const MediaResult& aError) {
+ self->mVideoDataRequest.Complete();
+ self->mVideoCallback.Notify(AsVariant(aError));
+ }));
+}
+
+bool
+MediaDecoderReaderWrapper::IsRequestingAudioData() const
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return mAudioDataRequest.Exists();
+}
+
+bool
+MediaDecoderReaderWrapper::IsRequestingVideoData() const
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return mVideoDataRequest.Exists();
+}
+
+bool
+MediaDecoderReaderWrapper::IsWaitingAudioData() const
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return mAudioWaitRequest.Exists();
+}
+
+bool
+MediaDecoderReaderWrapper::IsWaitingVideoData() const
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return mVideoWaitRequest.Exists();
+}
+
+RefPtr<MediaDecoderReader::SeekPromise>
+MediaDecoderReaderWrapper::Seek(SeekTarget aTarget, media::TimeUnit aEndTime)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ aTarget.SetTime(aTarget.GetTime() + StartTime());
+ return InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::Seek, aTarget,
+ aEndTime.ToMicroseconds());
+}
+
+void
+MediaDecoderReaderWrapper::WaitForData(MediaData::Type aType)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+
+ auto p = InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::WaitForData, aType);
+
+ RefPtr<MediaDecoderReaderWrapper> self = this;
+ WaitRequestRef(aType).Begin(p->Then(mOwnerThread, __func__,
+ [self] (MediaData::Type aType) {
+ self->WaitRequestRef(aType).Complete();
+ self->WaitCallbackRef(aType).Notify(AsVariant(aType));
+ },
+ [self, aType] (WaitForDataRejectValue aRejection) {
+ self->WaitRequestRef(aType).Complete();
+ self->WaitCallbackRef(aType).Notify(AsVariant(aRejection));
+ }));
+}
+
+MediaCallbackExc<WaitCallbackData>&
+MediaDecoderReaderWrapper::WaitCallbackRef(MediaData::Type aType)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return aType == MediaData::AUDIO_DATA ? mAudioWaitCallback : mVideoWaitCallback;
+}
+
+MozPromiseRequestHolder<MediaDecoderReader::WaitForDataPromise>&
+MediaDecoderReaderWrapper::WaitRequestRef(MediaData::Type aType)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return aType == MediaData::AUDIO_DATA ? mAudioWaitRequest : mVideoWaitRequest;
+}
+
+RefPtr<MediaDecoderReaderWrapper::BufferedUpdatePromise>
+MediaDecoderReaderWrapper::UpdateBufferedWithPromise()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ return InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::UpdateBufferedWithPromise);
+}
+
+void
+MediaDecoderReaderWrapper::ReleaseResources()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ nsCOMPtr<nsIRunnable> r =
+ NewRunnableMethod(mReader, &MediaDecoderReader::ReleaseResources);
+ mReader->OwnerThread()->Dispatch(r.forget());
+}
+
+void
+MediaDecoderReaderWrapper::SetIdle()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ nsCOMPtr<nsIRunnable> r =
+ NewRunnableMethod(mReader, &MediaDecoderReader::SetIdle);
+ mReader->OwnerThread()->Dispatch(r.forget());
+}
+
+void
+MediaDecoderReaderWrapper::ResetDecode(TrackSet aTracks)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+
+ if (aTracks.contains(TrackInfo::kAudioTrack)) {
+ mAudioDataRequest.DisconnectIfExists();
+ mAudioWaitRequest.DisconnectIfExists();
+ }
+
+ if (aTracks.contains(TrackInfo::kVideoTrack)) {
+ mVideoDataRequest.DisconnectIfExists();
+ mVideoWaitRequest.DisconnectIfExists();
+ }
+
+ nsCOMPtr<nsIRunnable> r =
+ NewRunnableMethod<TrackSet>(mReader,
+ &MediaDecoderReader::ResetDecode,
+ aTracks);
+ mReader->OwnerThread()->Dispatch(r.forget());
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderReaderWrapper::Shutdown()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ MOZ_ASSERT(!mAudioDataRequest.Exists());
+ MOZ_ASSERT(!mVideoDataRequest.Exists());
+
+ mShutdown = true;
+ if (mStartTimeRendezvous) {
+ mStartTimeRendezvous->Destroy();
+ mStartTimeRendezvous = nullptr;
+ }
+ return InvokeAsync(mReader->OwnerThread(), mReader.get(), __func__,
+ &MediaDecoderReader::Shutdown);
+}
+
+void
+MediaDecoderReaderWrapper::OnMetadataRead(MetadataHolder* aMetadata)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ if (mShutdown) {
+ return;
+ }
+ // Set up the start time rendezvous if it doesn't already exist (which is
+ // generally the case, unless we're coming out of dormant mode).
+ if (!mStartTimeRendezvous) {
+ mStartTimeRendezvous = new StartTimeRendezvous(
+ mOwnerThread, aMetadata->mInfo.HasAudio(),
+ aMetadata->mInfo.HasVideo(), mForceZeroStartTime);
+
+ RefPtr<MediaDecoderReaderWrapper> self = this;
+ mStartTimeRendezvous->AwaitStartTime()->Then(
+ mOwnerThread, __func__,
+ [self] () {
+ NS_ENSURE_TRUE_VOID(!self->mShutdown);
+ self->mReader->DispatchSetStartTime(self->StartTime().ToMicroseconds());
+ },
+ [] () {
+ NS_WARNING("Setting start time on reader failed");
+ });
+ }
+}
+
+void
+MediaDecoderReaderWrapper::SetVideoBlankDecode(bool aIsBlankDecode)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ nsCOMPtr<nsIRunnable> r =
+ NewRunnableMethod<bool>(mReader, &MediaDecoderReader::SetVideoBlankDecode,
+ aIsBlankDecode);
+ mReader->OwnerThread()->Dispatch(r.forget());
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaDecoderReaderWrapper.h b/dom/media/MediaDecoderReaderWrapper.h
new file mode 100644
index 000000000..92001ca33
--- /dev/null
+++ b/dom/media/MediaDecoderReaderWrapper.h
@@ -0,0 +1,143 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaDecoderReaderWrapper_h_
+#define MediaDecoderReaderWrapper_h_
+
+#include "mozilla/AbstractThread.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/Variant.h"
+#include "nsISupportsImpl.h"
+
+#include "MediaDecoderReader.h"
+#include "MediaEventSource.h"
+
+namespace mozilla {
+
+class StartTimeRendezvous;
+
+typedef MozPromise<bool, bool, /* isExclusive = */ false> HaveStartTimePromise;
+
+typedef Variant<MediaData*, MediaResult> AudioCallbackData;
+typedef Variant<Tuple<MediaData*, TimeStamp>, MediaResult> VideoCallbackData;
+typedef Variant<MediaData::Type, WaitForDataRejectValue> WaitCallbackData;
+
+/**
+ * A wrapper around MediaDecoderReader to offset the timestamps of Audio/Video
+ * samples by the start time to ensure MDSM can always assume zero start time.
+ * It also adjusts the seek target passed to Seek() to ensure correct seek time
+ * is passed to the underlying reader.
+ */
+class MediaDecoderReaderWrapper {
+ typedef MediaDecoderReader::MetadataPromise MetadataPromise;
+ typedef MediaDecoderReader::MediaDataPromise MediaDataPromise;
+ typedef MediaDecoderReader::SeekPromise SeekPromise;
+ typedef MediaDecoderReader::WaitForDataPromise WaitForDataPromise;
+ typedef MediaDecoderReader::BufferedUpdatePromise BufferedUpdatePromise;
+ typedef MediaDecoderReader::TrackSet TrackSet;
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderReaderWrapper);
+
+private:
+ MediaCallbackExc<AudioCallbackData> mAudioCallback;
+ MediaCallbackExc<VideoCallbackData> mVideoCallback;
+ MediaCallbackExc<WaitCallbackData> mAudioWaitCallback;
+ MediaCallbackExc<WaitCallbackData> mVideoWaitCallback;
+
+public:
+ MediaDecoderReaderWrapper(AbstractThread* aOwnerThread,
+ MediaDecoderReader* aReader);
+
+ media::TimeUnit StartTime() const;
+ RefPtr<MetadataPromise> ReadMetadata();
+ RefPtr<HaveStartTimePromise> AwaitStartTime();
+
+ decltype(mAudioCallback)& AudioCallback() { return mAudioCallback; }
+ decltype(mVideoCallback)& VideoCallback() { return mVideoCallback; }
+ decltype(mAudioWaitCallback)& AudioWaitCallback() { return mAudioWaitCallback; }
+ decltype(mVideoWaitCallback)& VideoWaitCallback() { return mVideoWaitCallback; }
+
+ // NOTE: please set callbacks before requesting audio/video data!
+ void RequestAudioData();
+ void RequestVideoData(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold);
+
+ // NOTE: please set callbacks before invoking WaitForData()!
+ void WaitForData(MediaData::Type aType);
+
+ bool IsRequestingAudioData() const;
+ bool IsRequestingVideoData() const;
+ bool IsWaitingAudioData() const;
+ bool IsWaitingVideoData() const;
+
+ RefPtr<SeekPromise> Seek(SeekTarget aTarget, media::TimeUnit aEndTime);
+ RefPtr<BufferedUpdatePromise> UpdateBufferedWithPromise();
+ RefPtr<ShutdownPromise> Shutdown();
+
+ void ReleaseResources();
+ void SetIdle();
+ void ResetDecode(TrackSet aTracks);
+
+ nsresult Init() { return mReader->Init(); }
+ bool IsWaitForDataSupported() const { return mReader->IsWaitForDataSupported(); }
+ bool IsAsync() const { return mReader->IsAsync(); }
+ bool UseBufferingHeuristics() const { return mReader->UseBufferingHeuristics(); }
+ bool ForceZeroStartTime() const { return mReader->ForceZeroStartTime(); }
+
+ bool VideoIsHardwareAccelerated() const {
+ return mReader->VideoIsHardwareAccelerated();
+ }
+ TimedMetadataEventSource& TimedMetadataEvent() {
+ return mReader->TimedMetadataEvent();
+ }
+ MediaEventSource<void>& OnMediaNotSeekable() {
+ return mReader->OnMediaNotSeekable();
+ }
+ size_t SizeOfVideoQueueInBytes() const {
+ return mReader->SizeOfVideoQueueInBytes();
+ }
+ size_t SizeOfAudioQueueInBytes() const {
+ return mReader->SizeOfAudioQueueInBytes();
+ }
+ size_t SizeOfAudioQueueInFrames() const {
+ return mReader->SizeOfAudioQueueInFrames();
+ }
+ size_t SizeOfVideoQueueInFrames() const {
+ return mReader->SizeOfVideoQueueInFrames();
+ }
+ void ReadUpdatedMetadata(MediaInfo* aInfo) {
+ mReader->ReadUpdatedMetadata(aInfo);
+ }
+ AbstractCanonical<media::TimeIntervals>* CanonicalBuffered() {
+ return mReader->CanonicalBuffered();
+ }
+
+ void SetCDMProxy(CDMProxy* aProxy) { mReader->SetCDMProxy(aProxy); }
+
+ void SetVideoBlankDecode(bool aIsBlankDecode);
+
+private:
+ ~MediaDecoderReaderWrapper();
+
+ void OnMetadataRead(MetadataHolder* aMetadata);
+ void OnMetadataNotRead() {}
+ MediaCallbackExc<WaitCallbackData>& WaitCallbackRef(MediaData::Type aType);
+ MozPromiseRequestHolder<WaitForDataPromise>& WaitRequestRef(MediaData::Type aType);
+
+ const bool mForceZeroStartTime;
+ const RefPtr<AbstractThread> mOwnerThread;
+ const RefPtr<MediaDecoderReader> mReader;
+
+ bool mShutdown = false;
+ RefPtr<StartTimeRendezvous> mStartTimeRendezvous;
+
+ MozPromiseRequestHolder<MediaDataPromise> mAudioDataRequest;
+ MozPromiseRequestHolder<MediaDataPromise> mVideoDataRequest;
+ MozPromiseRequestHolder<WaitForDataPromise> mAudioWaitRequest;
+ MozPromiseRequestHolder<WaitForDataPromise> mVideoWaitRequest;
+};
+
+} // namespace mozilla
+
+#endif // MediaDecoderReaderWrapper_h_
diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp
new file mode 100644
index 000000000..f13e59b6c
--- /dev/null
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -0,0 +1,3344 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifdef XP_WIN
+// Include Windows headers required for enabling high precision timers.
+#include "windows.h"
+#include "mmsystem.h"
+#endif
+
+#include <algorithm>
+#include <stdint.h>
+
+#include "gfx2DGlue.h"
+
+#include "mediasink/AudioSinkWrapper.h"
+#include "mediasink/DecodedAudioDataSink.h"
+#include "mediasink/DecodedStream.h"
+#include "mediasink/OutputStreamManager.h"
+#include "mediasink/VideoSink.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/Logging.h"
+#include "mozilla/mozalloc.h"
+#include "mozilla/MathAlgorithms.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/TaskQueue.h"
+
+#include "nsComponentManagerUtils.h"
+#include "nsContentUtils.h"
+#include "nsIEventTarget.h"
+#include "nsITimer.h"
+#include "nsPrintfCString.h"
+#include "nsTArray.h"
+#include "nsDeque.h"
+#include "prenv.h"
+
+#include "AccurateSeekTask.h"
+#include "AudioSegment.h"
+#include "DOMMediaStream.h"
+#include "ImageContainer.h"
+#include "MediaDecoder.h"
+#include "MediaDecoderReader.h"
+#include "MediaDecoderReaderWrapper.h"
+#include "MediaDecoderStateMachine.h"
+#include "MediaShutdownManager.h"
+#include "MediaPrefs.h"
+#include "MediaTimer.h"
+#include "NextFrameSeekTask.h"
+#include "TimeUnits.h"
+#include "VideoSegment.h"
+#include "VideoUtils.h"
+#include "gfxPrefs.h"
+
+namespace mozilla {
+
+using namespace mozilla::dom;
+using namespace mozilla::layers;
+using namespace mozilla::media;
+
+#define NS_DispatchToMainThread(...) CompileError_UseAbstractThreadDispatchInstead
+
+// avoid redefined macro in unified build
+#undef FMT
+#undef DECODER_LOG
+#undef VERBOSE_LOG
+#undef SAMPLE_LOG
+#undef DECODER_WARN
+#undef DUMP_LOG
+#undef SFMT
+#undef SLOG
+#undef SWARN
+#undef SDUMP
+
+#define FMT(x, ...) "Decoder=%p " x, mDecoderID, ##__VA_ARGS__
+#define DECODER_LOG(x, ...) MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, (FMT(x, ##__VA_ARGS__)))
+#define VERBOSE_LOG(x, ...) MOZ_LOG(gMediaDecoderLog, LogLevel::Verbose, (FMT(x, ##__VA_ARGS__)))
+#define SAMPLE_LOG(x, ...) MOZ_LOG(gMediaSampleLog, LogLevel::Debug, (FMT(x, ##__VA_ARGS__)))
+#define DECODER_WARN(x, ...) NS_WARNING(nsPrintfCString(FMT(x, ##__VA_ARGS__)).get())
+#define DUMP_LOG(x, ...) NS_DebugBreak(NS_DEBUG_WARNING, nsPrintfCString(FMT(x, ##__VA_ARGS__)).get(), nullptr, nullptr, -1)
+
+// Used by StateObject and its sub-classes
+#define SFMT(x, ...) "Decoder=%p state=%s " x, mMaster->mDecoderID, ToStateStr(GetState()), ##__VA_ARGS__
+#define SLOG(x, ...) MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, (SFMT(x, ##__VA_ARGS__)))
+#define SWARN(x, ...) NS_WARNING(nsPrintfCString(SFMT(x, ##__VA_ARGS__)).get())
+#define SDUMP(x, ...) NS_DebugBreak(NS_DEBUG_WARNING, nsPrintfCString(SFMT(x, ##__VA_ARGS__)).get(), nullptr, nullptr, -1)
+
+// Certain constants get stored as member variables and then adjusted by various
+// scale factors on a per-decoder basis. We want to make sure to avoid using these
+// constants directly, so we put them in a namespace.
+namespace detail {
+
+// If audio queue has less than this many usecs of decoded audio, we won't risk
+// trying to decode the video, we'll skip decoding video up to the next
+// keyframe. We may increase this value for an individual decoder if we
+// encounter video frames which take a long time to decode.
+static const uint32_t LOW_AUDIO_USECS = 300000;
+
+// If more than this many usecs of decoded audio is queued, we'll hold off
+// decoding more audio. If we increase the low audio threshold (see
+// LOW_AUDIO_USECS above) we'll also increase this value to ensure it's not
+// less than the low audio threshold.
+static const int64_t AMPLE_AUDIO_USECS = 2000000;
+
+} // namespace detail
+
+// If we have fewer than LOW_VIDEO_FRAMES decoded frames, and
+// we're not "prerolling video", we'll skip the video up to the next keyframe
+// which is at or after the current playback position.
+static const uint32_t LOW_VIDEO_FRAMES = 2;
+
+// Threshold in usecs that used to check if we are low on decoded video.
+// If the last video frame's end time |mDecodedVideoEndTime| is more than
+// |LOW_VIDEO_THRESHOLD_USECS*mPlaybackRate| after the current clock in
+// Advanceframe(), the video decode is lagging, and we skip to next keyframe.
+static const int32_t LOW_VIDEO_THRESHOLD_USECS = 60000;
+
+// Arbitrary "frame duration" when playing only audio.
+static const int AUDIO_DURATION_USECS = 40000;
+
+// If we increase our "low audio threshold" (see LOW_AUDIO_USECS above), we
+// use this as a factor in all our calculations. Increasing this will cause
+// us to be more likely to increase our low audio threshold, and to
+// increase it by more.
+static const int THRESHOLD_FACTOR = 2;
+
+namespace detail {
+
+// If we have less than this much undecoded data available, we'll consider
+// ourselves to be running low on undecoded data. We determine how much
+// undecoded data we have remaining using the reader's GetBuffered()
+// implementation.
+static const int64_t LOW_DATA_THRESHOLD_USECS = 5000000;
+
+// LOW_DATA_THRESHOLD_USECS needs to be greater than AMPLE_AUDIO_USECS, otherwise
+// the skip-to-keyframe logic can activate when we're running low on data.
+static_assert(LOW_DATA_THRESHOLD_USECS > AMPLE_AUDIO_USECS,
+ "LOW_DATA_THRESHOLD_USECS is too small");
+
+} // namespace detail
+
+// Amount of excess usecs of data to add in to the "should we buffer" calculation.
+static const uint32_t EXHAUSTED_DATA_MARGIN_USECS = 100000;
+
+static int64_t DurationToUsecs(TimeDuration aDuration) {
+ return static_cast<int64_t>(aDuration.ToSeconds() * USECS_PER_S);
+}
+
+static const uint32_t MIN_VIDEO_QUEUE_SIZE = 3;
+static const uint32_t MAX_VIDEO_QUEUE_SIZE = 10;
+#ifdef MOZ_APPLEMEDIA
+static const uint32_t HW_VIDEO_QUEUE_SIZE = 10;
+#else
+static const uint32_t HW_VIDEO_QUEUE_SIZE = 3;
+#endif
+static const uint32_t VIDEO_QUEUE_SEND_TO_COMPOSITOR_SIZE = 9999;
+
+static uint32_t sVideoQueueDefaultSize = MAX_VIDEO_QUEUE_SIZE;
+static uint32_t sVideoQueueHWAccelSize = HW_VIDEO_QUEUE_SIZE;
+static uint32_t sVideoQueueSendToCompositorSize = VIDEO_QUEUE_SEND_TO_COMPOSITOR_SIZE;
+
+static void InitVideoQueuePrefs() {
+ MOZ_ASSERT(NS_IsMainThread());
+ static bool sPrefInit = false;
+ if (!sPrefInit) {
+ sPrefInit = true;
+ sVideoQueueDefaultSize = Preferences::GetUint(
+ "media.video-queue.default-size", MAX_VIDEO_QUEUE_SIZE);
+ sVideoQueueHWAccelSize = Preferences::GetUint(
+ "media.video-queue.hw-accel-size", HW_VIDEO_QUEUE_SIZE);
+ sVideoQueueSendToCompositorSize = Preferences::GetUint(
+ "media.video-queue.send-to-compositor-size", VIDEO_QUEUE_SEND_TO_COMPOSITOR_SIZE);
+ }
+}
+
+// Delay, in milliseconds, that tabs needs to be in background before video
+// decoding is suspended.
+static TimeDuration
+SuspendBackgroundVideoDelay()
+{
+ return TimeDuration::FromMilliseconds(
+ MediaPrefs::MDSMSuspendBackgroundVideoDelay());
+}
+
+class MediaDecoderStateMachine::StateObject
+{
+public:
+ virtual ~StateObject() {}
+ virtual void Exit() {}; // Exit action.
+ virtual void Step() {} // Perform a 'cycle' of this state object.
+ virtual State GetState() const = 0;
+
+ // Event handlers for various events.
+ virtual void HandleCDMProxyReady() {}
+ virtual void HandleAudioDecoded(MediaData* aAudio) {}
+ virtual void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) {}
+ virtual void HandleEndOfStream() {}
+ virtual void HandleWaitingForData() {}
+ virtual void HandleAudioCaptured() {}
+
+ virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
+
+ virtual RefPtr<ShutdownPromise> HandleShutdown();
+
+ virtual void HandleVideoSuspendTimeout() = 0;
+
+ virtual void HandleResumeVideoDecoding();
+
+ virtual void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) {}
+
+ virtual void DumpDebugInfo() {}
+
+private:
+ template <class S, typename R, typename... As>
+ auto ReturnTypeHelper(R(S::*)(As...)) -> R;
+
+protected:
+ enum class EventVisibility : int8_t
+ {
+ Observable,
+ Suppressed
+ };
+
+ using Master = MediaDecoderStateMachine;
+ explicit StateObject(Master* aPtr) : mMaster(aPtr) {}
+ TaskQueue* OwnerThread() const { return mMaster->mTaskQueue; }
+ MediaResource* Resource() const { return mMaster->mResource; }
+ MediaDecoderReaderWrapper* Reader() const { return mMaster->mReader; }
+ const MediaInfo& Info() const { return mMaster->Info(); }
+ bool IsExpectingMoreData() const
+ {
+ // We are expecting more data if either the resource states so, or if we
+ // have a waiting promise pending (such as with non-MSE EME).
+ return Resource()->IsExpectingMoreData() ||
+ (Reader()->IsWaitForDataSupported() &&
+ (Reader()->IsWaitingAudioData() || Reader()->IsWaitingVideoData()));
+ }
+
+ // Note this function will delete the current state object.
+ // Don't access members to avoid UAF after this call.
+ template <class S, typename... Ts>
+ auto SetState(Ts... aArgs)
+ -> decltype(ReturnTypeHelper(&S::Enter))
+ {
+ // keep mMaster in a local object because mMaster will become invalid after
+ // the current state object is deleted.
+ auto master = mMaster;
+
+ auto s = new S(master);
+
+ MOZ_ASSERT(master->mState != s->GetState() ||
+ master->mState == DECODER_STATE_SEEKING);
+
+ SLOG("change state to: %s", ToStateStr(s->GetState()));
+
+ Exit();
+
+ master->mState = s->GetState();
+ master->mStateObj.reset(s);
+ return s->Enter(Move(aArgs)...);
+ }
+
+ // Take a raw pointer in order not to change the life cycle of MDSM.
+ // It is guaranteed to be valid by MDSM.
+ Master* mMaster;
+};
+
+/**
+ * Purpose: decode metadata like duration and dimensions of the media resource.
+ *
+ * Transition to other states when decoding metadata is done:
+ * SHUTDOWN if failing to decode metadata.
+ * WAIT_FOR_CDM if the media is encrypted and CDM is not available.
+ * DECODING_FIRSTFRAME otherwise.
+ */
+class MediaDecoderStateMachine::DecodeMetadataState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit DecodeMetadataState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter()
+ {
+ MOZ_ASSERT(!mMaster->mVideoDecodeSuspended);
+ MOZ_ASSERT(!mMetadataRequest.Exists());
+ SLOG("Dispatching AsyncReadMetadata");
+
+ // Set mode to METADATA since we are about to read metadata.
+ Resource()->SetReadMode(MediaCacheStream::MODE_METADATA);
+
+ // We disconnect mMetadataRequest in Exit() so it is fine to capture
+ // a raw pointer here.
+ mMetadataRequest.Begin(Reader()->ReadMetadata()
+ ->Then(OwnerThread(), __func__,
+ [this] (MetadataHolder* aMetadata) {
+ OnMetadataRead(aMetadata);
+ },
+ [this] (const MediaResult& aError) {
+ OnMetadataNotRead(aError);
+ }));
+ }
+
+ void Exit() override
+ {
+ mMetadataRequest.DisconnectIfExists();
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_DECODING_METADATA;
+ }
+
+ RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Can't seek while decoding metadata.");
+ return MediaDecoder::SeekPromise::CreateAndReject(true, __func__);
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ // Do nothing since no decoders are created yet.
+ }
+
+ void HandleResumeVideoDecoding() override
+ {
+ // We never suspend video decoding in this state.
+ MOZ_ASSERT(false, "Shouldn't have suspended video decoding.");
+ }
+
+private:
+ void OnMetadataRead(MetadataHolder* aMetadata);
+
+ void OnMetadataNotRead(const MediaResult& aError)
+ {
+ mMetadataRequest.Complete();
+ SWARN("Decode metadata failed, shutting down decoder");
+ mMaster->DecodeError(aError);
+ }
+
+ MozPromiseRequestHolder<MediaDecoderReader::MetadataPromise> mMetadataRequest;
+};
+
+/**
+ * Purpose: wait for the CDM to start decoding.
+ *
+ * Transition to other states when CDM is ready:
+ * DECODING_FIRSTFRAME otherwise.
+ */
+class MediaDecoderStateMachine::WaitForCDMState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit WaitForCDMState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter()
+ {
+ MOZ_ASSERT(!mMaster->mVideoDecodeSuspended);
+ }
+
+ void Exit() override
+ {
+ // mPendingSeek is either moved in HandleCDMProxyReady() or should be
+ // rejected here before transition to SHUTDOWN.
+ mPendingSeek.RejectIfExists(__func__);
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_WAIT_FOR_CDM;
+ }
+
+ void HandleCDMProxyReady() override;
+
+ RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
+ {
+ SLOG("Not Enough Data to seek at this stage, queuing seek");
+ mPendingSeek.RejectIfExists(__func__);
+ mPendingSeek.mTarget = aTarget;
+ return mPendingSeek.mPromise.Ensure(__func__);
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ // Do nothing since no decoders are created yet.
+ }
+
+ void HandleResumeVideoDecoding() override
+ {
+ // We never suspend video decoding in this state.
+ MOZ_ASSERT(false, "Shouldn't have suspended video decoding.");
+ }
+
+private:
+ SeekJob mPendingSeek;
+};
+
+/**
+ * Purpose: release decoder resources to save memory and hardware resources.
+ *
+ * Transition to:
+ * SEEKING if any seek request or play state changes to PLAYING.
+ */
+class MediaDecoderStateMachine::DormantState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit DormantState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter()
+ {
+ if (mMaster->IsPlaying()) {
+ mMaster->StopPlayback();
+ }
+
+ // Calculate the position to seek to when exiting dormant.
+ auto t = mMaster->mMediaSink->IsStarted()
+ ? mMaster->GetClock()
+ : mMaster->GetMediaTime();
+ mPendingSeek.mTarget = SeekTarget(t, SeekTarget::Accurate);
+ // SeekJob asserts |mTarget.IsValid() == !mPromise.IsEmpty()| so we
+ // need to create the promise even it is not used at all.
+ RefPtr<MediaDecoder::SeekPromise> x = mPendingSeek.mPromise.Ensure(__func__);
+
+ mMaster->Reset();
+ mMaster->mReader->ReleaseResources();
+ }
+
+ void Exit() override
+ {
+ // mPendingSeek is either moved when exiting dormant or
+ // should be rejected here before transition to SHUTDOWN.
+ mPendingSeek.RejectIfExists(__func__);
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_DORMANT;
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ // Do nothing since we've released decoders in Enter().
+ }
+
+ void HandleResumeVideoDecoding() override
+ {
+ // Do nothing since we won't resume decoding until exiting dormant.
+ }
+
+ void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) override;
+
+private:
+ SeekJob mPendingSeek;
+};
+
+/**
+ * Purpose: decode the 1st audio and video frames to fire the 'loadeddata' event.
+ *
+ * Transition to:
+ * SHUTDOWN if any decode error.
+ * SEEKING if any pending seek and seek is possible.
+ * DECODING when the 'loadeddata' event is fired.
+ */
+class MediaDecoderStateMachine::DecodingFirstFrameState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit DecodingFirstFrameState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter(SeekJob aPendingSeek);
+
+ void Exit() override
+ {
+ // mPendingSeek is either moved before transition to SEEKING,
+ // or should be rejected here before transition to SHUTDOWN.
+ mPendingSeek.RejectIfExists(__func__);
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_DECODING_FIRSTFRAME;
+ }
+
+ void HandleAudioDecoded(MediaData* aAudio) override
+ {
+ mMaster->Push(aAudio, MediaData::AUDIO_DATA);
+ MaybeFinishDecodeFirstFrame();
+ }
+
+ void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
+ {
+ mMaster->Push(aVideo, MediaData::VIDEO_DATA);
+ MaybeFinishDecodeFirstFrame();
+ }
+
+ void HandleEndOfStream() override
+ {
+ MaybeFinishDecodeFirstFrame();
+ }
+
+ RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
+
+ void HandleVideoSuspendTimeout() override
+ {
+ // Do nothing for we need to decode the 1st video frame to get the dimensions.
+ }
+
+ void HandleResumeVideoDecoding() override
+ {
+ // We never suspend video decoding in this state.
+ MOZ_ASSERT(false, "Shouldn't have suspended video decoding.");
+ }
+
+private:
+ // Notify FirstFrameLoaded if having decoded first frames and
+ // transition to SEEKING if there is any pending seek, or DECODING otherwise.
+ void MaybeFinishDecodeFirstFrame();
+
+ SeekJob mPendingSeek;
+};
+
+/**
+ * Purpose: decode audio/video data for playback.
+ *
+ * Transition to:
+ * DORMANT if playback is paused for a while.
+ * SEEKING if any seek request.
+ * SHUTDOWN if any decode error.
+ * BUFFERING if playback can't continue due to lack of decoded data.
+ * COMPLETED when having decoded all audio/video data.
+ */
+class MediaDecoderStateMachine::DecodingState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit DecodingState(Master* aPtr)
+ : StateObject(aPtr)
+ , mDormantTimer(OwnerThread())
+ {
+ }
+
+ void Enter();
+
+ void Exit() override
+ {
+ if (!mDecodeStartTime.IsNull()) {
+ TimeDuration decodeDuration = TimeStamp::Now() - mDecodeStartTime;
+ SLOG("Exiting DECODING, decoded for %.3lfs", decodeDuration.ToSeconds());
+ }
+ mDormantTimer.Reset();
+ }
+
+ void Step() override
+ {
+ if (mMaster->mPlayState != MediaDecoder::PLAY_STATE_PLAYING &&
+ mMaster->IsPlaying()) {
+ // We're playing, but the element/decoder is in paused state. Stop
+ // playing!
+ mMaster->StopPlayback();
+ }
+
+ // Start playback if necessary so that the clock can be properly queried.
+ if (!mIsPrerolling) {
+ mMaster->MaybeStartPlayback();
+ }
+
+ mMaster->UpdatePlaybackPositionPeriodically();
+
+ MOZ_ASSERT(!mMaster->IsPlaying() ||
+ mMaster->IsStateMachineScheduled(),
+ "Must have timer scheduled");
+
+ MaybeStartBuffering();
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_DECODING;
+ }
+
+ void HandleAudioDecoded(MediaData* aAudio) override
+ {
+ mMaster->Push(aAudio, MediaData::AUDIO_DATA);
+ MaybeStopPrerolling();
+ }
+
+ void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
+ {
+ mMaster->Push(aVideo, MediaData::VIDEO_DATA);
+ MaybeStopPrerolling();
+ CheckSlowDecoding(aDecodeStart);
+ }
+
+ void HandleEndOfStream() override;
+
+ void HandleWaitingForData() override
+ {
+ MaybeStopPrerolling();
+ }
+
+ void HandleAudioCaptured() override
+ {
+ MaybeStopPrerolling();
+ // MediaSink is changed. Schedule Step() to check if we can start playback.
+ mMaster->ScheduleStateMachine();
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ if (mMaster->HasVideo()) {
+ mMaster->mVideoDecodeSuspended = true;
+ mMaster->mOnPlaybackEvent.Notify(MediaEventType::EnterVideoSuspend);
+ Reader()->SetVideoBlankDecode(true);
+ }
+ }
+
+ void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) override
+ {
+ if (aPlayState == MediaDecoder::PLAY_STATE_PLAYING) {
+ // Schedule Step() to check if we can start playback.
+ mMaster->ScheduleStateMachine();
+ }
+
+ if (aPlayState == MediaDecoder::PLAY_STATE_PAUSED) {
+ StartDormantTimer();
+ } else {
+ mDormantTimer.Reset();
+ }
+ }
+
+ void DumpDebugInfo() override
+ {
+ SDUMP("mIsPrerolling=%d", mIsPrerolling);
+ }
+
+private:
+ void MaybeStartBuffering();
+
+ void CheckSlowDecoding(TimeStamp aDecodeStart)
+ {
+ // For non async readers, if the requested video sample was slow to
+ // arrive, increase the amount of audio we buffer to ensure that we
+ // don't run out of audio. This is unnecessary for async readers,
+ // since they decode audio and video on different threads so they
+ // are unlikely to run out of decoded audio.
+ if (Reader()->IsAsync()) {
+ return;
+ }
+
+ TimeDuration decodeTime = TimeStamp::Now() - aDecodeStart;
+ int64_t adjustedTime = THRESHOLD_FACTOR * DurationToUsecs(decodeTime);
+ if (adjustedTime > mMaster->mLowAudioThresholdUsecs &&
+ !mMaster->HasLowBufferedData())
+ {
+ mMaster->mLowAudioThresholdUsecs =
+ std::min(adjustedTime, mMaster->mAmpleAudioThresholdUsecs);
+
+ mMaster->mAmpleAudioThresholdUsecs =
+ std::max(THRESHOLD_FACTOR * mMaster->mLowAudioThresholdUsecs,
+ mMaster->mAmpleAudioThresholdUsecs);
+
+ SLOG("Slow video decode, set "
+ "mLowAudioThresholdUsecs=%lld "
+ "mAmpleAudioThresholdUsecs=%lld",
+ mMaster->mLowAudioThresholdUsecs,
+ mMaster->mAmpleAudioThresholdUsecs);
+ }
+ }
+
+ bool DonePrerollingAudio()
+ {
+ return !mMaster->IsAudioDecoding() ||
+ mMaster->GetDecodedAudioDuration() >=
+ mMaster->AudioPrerollUsecs() * mMaster->mPlaybackRate;
+ }
+
+ bool DonePrerollingVideo()
+ {
+ return !mMaster->IsVideoDecoding() ||
+ static_cast<uint32_t>(mMaster->VideoQueue().GetSize()) >=
+ mMaster->VideoPrerollFrames() * mMaster->mPlaybackRate + 1;
+ }
+
+ void MaybeStopPrerolling()
+ {
+ if (mIsPrerolling &&
+ (DonePrerollingAudio() || Reader()->IsWaitingAudioData()) &&
+ (DonePrerollingVideo() || Reader()->IsWaitingVideoData())) {
+ mIsPrerolling = false;
+ // Check if we can start playback.
+ mMaster->ScheduleStateMachine();
+ }
+ }
+
+ void EnterDormant()
+ {
+ SetState<DormantState>();
+ }
+
+ void StartDormantTimer()
+ {
+ if (!mMaster->mMediaSeekable) {
+ // Don't enter dormant if the media is not seekable because we need to
+ // seek when exiting dormant.
+ return;
+ }
+
+ auto timeout = MediaPrefs::DormantOnPauseTimeout();
+ if (timeout < 0) {
+ // Disabled when timeout is negative.
+ return;
+ } else if (timeout == 0) {
+ // Enter dormant immediately without scheduling a timer.
+ EnterDormant();
+ return;
+ }
+
+ TimeStamp target = TimeStamp::Now() +
+ TimeDuration::FromMilliseconds(timeout);
+
+ mDormantTimer.Ensure(target,
+ [this] () {
+ mDormantTimer.CompleteRequest();
+ EnterDormant();
+ }, [this] () {
+ mDormantTimer.CompleteRequest();
+ });
+ }
+
+ // Time at which we started decoding.
+ TimeStamp mDecodeStartTime;
+
+ // When we start decoding (either for the first time, or after a pause)
+ // we may be low on decoded data. We don't want our "low data" logic to
+ // kick in and decide that we're low on decoded data because the download
+ // can't keep up with the decode, and cause us to pause playback. So we
+ // have a "preroll" stage, where we ignore the results of our "low data"
+ // logic during the first few frames of our decode. This occurs during
+ // playback.
+ bool mIsPrerolling = true;
+
+ // Fired when playback is paused for a while to enter dormant.
+ DelayedScheduler mDormantTimer;
+};
+
+/**
+ * Purpose: seek to a particular new playback position.
+ *
+ * Transition to:
+ * SEEKING if any new seek request.
+ * SHUTDOWN if seek failed.
+ * COMPLETED if the new playback position is the end of the media resource.
+ * DECODING otherwise.
+ */
+class MediaDecoderStateMachine::SeekingState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit SeekingState(Master* aPtr) : StateObject(aPtr) {}
+
+ RefPtr<MediaDecoder::SeekPromise> Enter(SeekJob aSeekJob,
+ EventVisibility aVisibility)
+ {
+ mSeekJob = Move(aSeekJob);
+ mVisibility = aVisibility;
+
+ // Always switch off the blank decoder otherwise we might become visible
+ // in the middle of seeking and won't have a valid video frame to show
+ // when seek is done.
+ if (mMaster->mVideoDecodeSuspended) {
+ mMaster->mVideoDecodeSuspended = false;
+ mMaster->mOnPlaybackEvent.Notify(MediaEventType::ExitVideoSuspend);
+ Reader()->SetVideoBlankDecode(false);
+ }
+
+ // SeekTask will register its callbacks to MediaDecoderReaderWrapper.
+ mMaster->CancelMediaDecoderReaderWrapperCallback();
+
+ // Create a new SeekTask instance for the incoming seek task.
+ if (mSeekJob.mTarget.IsAccurate() ||
+ mSeekJob.mTarget.IsFast()) {
+ mSeekTask = new AccurateSeekTask(
+ mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
+ Info(), mMaster->Duration(), mMaster->GetMediaTime());
+ } else if (mSeekJob.mTarget.IsNextFrame()) {
+ mSeekTask = new NextFrameSeekTask(
+ mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
+ Info(), mMaster->Duration(),mMaster->GetMediaTime(),
+ mMaster->AudioQueue(), mMaster->VideoQueue());
+ } else {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Cannot handle this seek task.");
+ }
+
+ // Don't stop playback for a video-only seek since audio is playing.
+ if (!mSeekJob.mTarget.IsVideoOnly()) {
+ mMaster->StopPlayback();
+ }
+
+ // mSeekJob.mTarget.mTime might be different from
+ // mSeekTask->GetSeekTarget().mTime because the seek task might clamp the
+ // seek target to [0, duration]. We want to update the playback position to
+ // the clamped value.
+ mMaster->UpdatePlaybackPositionInternal(
+ mSeekTask->GetSeekTarget().GetTime().ToMicroseconds());
+
+ if (mVisibility == EventVisibility::Observable) {
+ mMaster->mOnPlaybackEvent.Notify(MediaEventType::SeekStarted);
+ // We want dormant actions to be transparent to the user.
+ // So we only notify the change when the seek request is from the user.
+ mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING);
+ }
+
+ // Reset our state machine and decoding pipeline before seeking.
+ if (mSeekTask->NeedToResetMDSM()) {
+ if (mSeekJob.mTarget.IsVideoOnly()) {
+ mMaster->Reset(TrackInfo::kVideoTrack);
+ } else {
+ mMaster->Reset();
+ }
+ }
+
+ // Do the seek.
+ mSeekTaskRequest.Begin(mSeekTask->Seek(mMaster->Duration())
+ ->Then(OwnerThread(), __func__,
+ [this] (const SeekTaskResolveValue& aValue) {
+ OnSeekTaskResolved(aValue);
+ },
+ [this] (const SeekTaskRejectValue& aValue) {
+ OnSeekTaskRejected(aValue);
+ }));
+
+ return mSeekJob.mPromise.Ensure(__func__);
+ }
+
+ void Exit() override
+ {
+ mSeekTaskRequest.DisconnectIfExists();
+ mSeekJob.RejectIfExists(__func__);
+ mSeekTask->Discard();
+
+ // Reset the MediaDecoderReaderWrapper's callbask.
+ mMaster->SetMediaDecoderReaderWrapperCallback();
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_SEEKING;
+ }
+
+ void HandleAudioDecoded(MediaData* aAudio) override
+ {
+ MOZ_ASSERT(false);
+ }
+
+ void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
+ {
+ MOZ_ASSERT(false);
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ // Do nothing since we want a valid video frame to show when seek is done.
+ }
+
+ void HandleResumeVideoDecoding() override
+ {
+ // We set mVideoDecodeSuspended to false in Enter().
+ MOZ_ASSERT(false, "Shouldn't have suspended video decoding.");
+ }
+
+private:
+ void OnSeekTaskResolved(const SeekTaskResolveValue& aValue)
+ {
+ mSeekTaskRequest.Complete();
+
+ if (aValue.mSeekedAudioData) {
+ mMaster->Push(aValue.mSeekedAudioData, MediaData::AUDIO_DATA);
+ mMaster->mDecodedAudioEndTime = std::max(
+ aValue.mSeekedAudioData->GetEndTime(), mMaster->mDecodedAudioEndTime);
+ }
+
+ if (aValue.mSeekedVideoData) {
+ mMaster->Push(aValue.mSeekedVideoData, MediaData::VIDEO_DATA);
+ mMaster->mDecodedVideoEndTime = std::max(
+ aValue.mSeekedVideoData->GetEndTime(), mMaster->mDecodedVideoEndTime);
+ }
+
+ if (aValue.mIsAudioQueueFinished) {
+ mMaster->AudioQueue().Finish();
+ }
+
+ if (aValue.mIsVideoQueueFinished) {
+ mMaster->VideoQueue().Finish();
+ }
+
+ SeekCompleted();
+ }
+
+ void OnSeekTaskRejected(const SeekTaskRejectValue& aValue)
+ {
+ mSeekTaskRequest.Complete();
+
+ if (aValue.mError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ mMaster->AudioQueue().Finish();
+ mMaster->VideoQueue().Finish();
+ SeekCompleted();
+ return;
+ }
+
+ if (aValue.mIsAudioQueueFinished) {
+ mMaster->AudioQueue().Finish();
+ }
+
+ if (aValue.mIsVideoQueueFinished) {
+ mMaster->VideoQueue().Finish();
+ }
+
+ mMaster->DecodeError(aValue.mError);
+ }
+
+ void SeekCompleted();
+
+ SeekJob mSeekJob;
+ EventVisibility mVisibility = EventVisibility::Observable;
+ MozPromiseRequestHolder<SeekTask::SeekTaskPromise> mSeekTaskRequest;
+ RefPtr<SeekTask> mSeekTask;
+};
+
+/**
+ * Purpose: stop playback until enough data is decoded to continue playback.
+ *
+ * Transition to:
+ * SEEKING if any seek request.
+ * SHUTDOWN if any decode error.
+ * COMPLETED when having decoded all audio/video data.
+ * DECODING when having decoded enough data to continue playback.
+ */
+class MediaDecoderStateMachine::BufferingState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit BufferingState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter()
+ {
+ if (mMaster->IsPlaying()) {
+ mMaster->StopPlayback();
+ }
+
+ mBufferingStart = TimeStamp::Now();
+
+ MediaStatistics stats = mMaster->GetStatistics();
+ SLOG("Playback rate: %.1lfKB/s%s download rate: %.1lfKB/s%s",
+ stats.mPlaybackRate/1024, stats.mPlaybackRateReliable ? "" : " (unreliable)",
+ stats.mDownloadRate/1024, stats.mDownloadRateReliable ? "" : " (unreliable)");
+
+ mMaster->ScheduleStateMachineIn(USECS_PER_S);
+
+ mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING);
+ }
+
+ void Step() override;
+
+ State GetState() const override
+ {
+ return DECODER_STATE_BUFFERING;
+ }
+
+ void HandleAudioDecoded(MediaData* aAudio) override
+ {
+ // This might be the sample we need to exit buffering.
+ // Schedule Step() to check it.
+ mMaster->Push(aAudio, MediaData::AUDIO_DATA);
+ mMaster->ScheduleStateMachine();
+ }
+
+ void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
+ {
+ // This might be the sample we need to exit buffering.
+ // Schedule Step() to check it.
+ mMaster->Push(aVideo, MediaData::VIDEO_DATA);
+ mMaster->ScheduleStateMachine();
+ }
+
+ void HandleEndOfStream() override;
+
+ void HandleVideoSuspendTimeout() override
+ {
+ if (mMaster->HasVideo()) {
+ mMaster->mVideoDecodeSuspended = true;
+ mMaster->mOnPlaybackEvent.Notify(MediaEventType::EnterVideoSuspend);
+ Reader()->SetVideoBlankDecode(true);
+ }
+ }
+
+private:
+ TimeStamp mBufferingStart;
+
+ // The maximum number of second we spend buffering when we are short on
+ // unbuffered data.
+ const uint32_t mBufferingWait = 15;
+};
+
+/**
+ * Purpose: play all the decoded data and fire the 'ended' event.
+ *
+ * Transition to:
+ * SEEKING if any seek request.
+ */
+class MediaDecoderStateMachine::CompletedState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit CompletedState(Master* aPtr) : StateObject(aPtr) {}
+
+ void Enter()
+ {
+ // We've decoded all samples. We don't need decoders anymore.
+ Reader()->ReleaseResources();
+
+ bool hasNextFrame = (!mMaster->HasAudio() || !mMaster->mAudioCompleted)
+ && (!mMaster->HasVideo() || !mMaster->mVideoCompleted);
+
+ mMaster->UpdateNextFrameStatus(hasNextFrame
+ ? MediaDecoderOwner::NEXT_FRAME_AVAILABLE
+ : MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE);
+
+ mMaster->ScheduleStateMachine();
+ }
+
+ void Exit() override
+ {
+ mSentPlaybackEndedEvent = false;
+ }
+
+ void Step() override
+ {
+ if (mMaster->mPlayState != MediaDecoder::PLAY_STATE_PLAYING &&
+ mMaster->IsPlaying()) {
+ mMaster->StopPlayback();
+ }
+
+ // Play the remaining media. We want to run AdvanceFrame() at least
+ // once to ensure the current playback position is advanced to the
+ // end of the media, and so that we update the readyState.
+ if ((mMaster->HasVideo() && !mMaster->mVideoCompleted) ||
+ (mMaster->HasAudio() && !mMaster->mAudioCompleted)) {
+ // Start playback if necessary to play the remaining media.
+ mMaster->MaybeStartPlayback();
+ mMaster->UpdatePlaybackPositionPeriodically();
+ MOZ_ASSERT(!mMaster->IsPlaying() ||
+ mMaster->IsStateMachineScheduled(),
+ "Must have timer scheduled");
+ return;
+ }
+
+ // StopPlayback in order to reset the IsPlaying() state so audio
+ // is restarted correctly.
+ mMaster->StopPlayback();
+
+ if (mMaster->mPlayState == MediaDecoder::PLAY_STATE_PLAYING &&
+ !mSentPlaybackEndedEvent) {
+ int64_t clockTime = std::max(mMaster->AudioEndTime(), mMaster->VideoEndTime());
+ clockTime = std::max(int64_t(0), std::max(clockTime, mMaster->Duration().ToMicroseconds()));
+ mMaster->UpdatePlaybackPosition(clockTime);
+
+ // Ensure readyState is updated before firing the 'ended' event.
+ mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE);
+
+ mMaster->mOnPlaybackEvent.Notify(MediaEventType::PlaybackEnded);
+
+ mSentPlaybackEndedEvent = true;
+
+ // MediaSink::GetEndTime() must be called before stopping playback.
+ mMaster->StopMediaSink();
+ }
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_COMPLETED;
+ }
+
+ void HandleAudioCaptured() override
+ {
+ // MediaSink is changed. Schedule Step() to check if we can start playback.
+ mMaster->ScheduleStateMachine();
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ // Do nothing since no decoding is going on.
+ }
+
+ void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) override
+ {
+ if (aPlayState == MediaDecoder::PLAY_STATE_PLAYING) {
+ // Schedule Step() to check if we can start playback.
+ mMaster->ScheduleStateMachine();
+ }
+ }
+
+private:
+ bool mSentPlaybackEndedEvent = false;
+};
+
+/**
+ * Purpose: release all resources allocated by MDSM.
+ *
+ * Transition to:
+ * None since this is the final state.
+ *
+ * Transition from:
+ * Any states other than SHUTDOWN.
+ */
+class MediaDecoderStateMachine::ShutdownState
+ : public MediaDecoderStateMachine::StateObject
+{
+public:
+ explicit ShutdownState(Master* aPtr) : StateObject(aPtr) {}
+
+ RefPtr<ShutdownPromise> Enter();
+
+ void Exit() override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Shouldn't escape the SHUTDOWN state.");
+ }
+
+ State GetState() const override
+ {
+ return DECODER_STATE_SHUTDOWN;
+ }
+
+ RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Can't seek in shutdown state.");
+ return MediaDecoder::SeekPromise::CreateAndReject(true, __func__);
+ }
+
+ RefPtr<ShutdownPromise> HandleShutdown() override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
+ return nullptr;
+ }
+
+ void HandleVideoSuspendTimeout() override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
+ }
+
+ void HandleResumeVideoDecoding() override
+ {
+ MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
+ }
+};
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+StateObject::HandleSeek(SeekTarget aTarget)
+{
+ SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+ SeekJob seekJob;
+ seekJob.mTarget = aTarget;
+ return SetState<SeekingState>(Move(seekJob), EventVisibility::Observable);
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::
+StateObject::HandleShutdown()
+{
+ return SetState<ShutdownState>();
+}
+
+static void
+ReportRecoveryTelemetry(const TimeStamp& aRecoveryStart,
+ const MediaInfo& aMediaInfo,
+ bool aIsHardwareAccelerated)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!aMediaInfo.HasVideo()) {
+ return;
+ }
+
+ // Keyed by audio+video or video alone, hardware acceleration,
+ // and by a resolution range.
+ nsCString key(aMediaInfo.HasAudio() ? "AV" : "V");
+ key.AppendASCII(aIsHardwareAccelerated ? "(hw)," : ",");
+ static const struct { int32_t mH; const char* mRes; } sResolutions[] = {
+ { 240, "0-240" },
+ { 480, "241-480" },
+ { 720, "481-720" },
+ { 1080, "721-1080" },
+ { 2160, "1081-2160" }
+ };
+ const char* resolution = "2161+";
+ int32_t height = aMediaInfo.mVideo.mImage.height;
+ for (const auto& res : sResolutions) {
+ if (height <= res.mH) {
+ resolution = res.mRes;
+ break;
+ }
+ }
+ key.AppendASCII(resolution);
+
+ TimeDuration duration = TimeStamp::Now() - aRecoveryStart;
+ double duration_ms = duration.ToMilliseconds();
+ Telemetry::Accumulate(Telemetry::VIDEO_SUSPEND_RECOVERY_TIME_MS,
+ key,
+ uint32_t(duration_ms + 0.5));
+ Telemetry::Accumulate(Telemetry::VIDEO_SUSPEND_RECOVERY_TIME_MS,
+ NS_LITERAL_CSTRING("All"),
+ uint32_t(duration_ms + 0.5));
+}
+
+void
+MediaDecoderStateMachine::
+StateObject::HandleResumeVideoDecoding()
+{
+ MOZ_ASSERT(mMaster->mVideoDecodeSuspended);
+
+ // Start counting recovery time from right now.
+ TimeStamp start = TimeStamp::Now();
+
+ // Local reference to mInfo, so that it will be copied in the lambda below.
+ auto& info = Info();
+ bool hw = Reader()->VideoIsHardwareAccelerated();
+
+ // Start video-only seek to the current time.
+ SeekJob seekJob;
+
+ const SeekTarget::Type type = mMaster->HasAudio()
+ ? SeekTarget::Type::Accurate
+ : SeekTarget::Type::PrevSyncPoint;
+
+ seekJob.mTarget = SeekTarget(mMaster->GetMediaTime(),
+ type,
+ true /* aVideoOnly */);
+
+ SetState<SeekingState>(Move(seekJob), EventVisibility::Suppressed)->Then(
+ AbstractThread::MainThread(), __func__,
+ [start, info, hw](){ ReportRecoveryTelemetry(start, info, hw); },
+ [](){});
+}
+
+void
+MediaDecoderStateMachine::
+DecodeMetadataState::OnMetadataRead(MetadataHolder* aMetadata)
+{
+ mMetadataRequest.Complete();
+
+ // Set mode to PLAYBACK after reading metadata.
+ Resource()->SetReadMode(MediaCacheStream::MODE_PLAYBACK);
+
+ mMaster->mInfo = Some(aMetadata->mInfo);
+ mMaster->mMetadataTags = aMetadata->mTags.forget();
+ mMaster->mMediaSeekable = Info().mMediaSeekable;
+ mMaster->mMediaSeekableOnlyInBufferedRanges = Info().mMediaSeekableOnlyInBufferedRanges;
+
+ if (Info().mMetadataDuration.isSome()) {
+ mMaster->RecomputeDuration();
+ } else if (Info().mUnadjustedMetadataEndTime.isSome()) {
+ RefPtr<Master> master = mMaster;
+ Reader()->AwaitStartTime()->Then(OwnerThread(), __func__,
+ [master] () {
+ NS_ENSURE_TRUE_VOID(!master->IsShutdown());
+ auto& info = master->mInfo.ref();
+ TimeUnit unadjusted = info.mUnadjustedMetadataEndTime.ref();
+ TimeUnit adjustment = master->mReader->StartTime();
+ info.mMetadataDuration.emplace(unadjusted - adjustment);
+ master->RecomputeDuration();
+ }, [master, this] () {
+ SWARN("Adjusting metadata end time failed");
+ }
+ );
+ }
+
+ if (mMaster->HasVideo()) {
+ SLOG("Video decode isAsync=%d HWAccel=%d videoQueueSize=%d",
+ Reader()->IsAsync(),
+ Reader()->VideoIsHardwareAccelerated(),
+ mMaster->GetAmpleVideoFrames());
+ }
+
+ // In general, we wait until we know the duration before notifying the decoder.
+ // However, we notify unconditionally in this case without waiting for the start
+ // time, since the caller might be waiting on metadataloaded to be fired before
+ // feeding in the CDM, which we need to decode the first frame (and
+ // thus get the metadata). We could fix this if we could compute the start
+ // time by demuxing without necessaring decoding.
+ bool waitingForCDM = Info().IsEncrypted() && !mMaster->mCDMProxy;
+
+ mMaster->mNotifyMetadataBeforeFirstFrame =
+ mMaster->mDuration.Ref().isSome() || waitingForCDM;
+
+ if (mMaster->mNotifyMetadataBeforeFirstFrame) {
+ mMaster->EnqueueLoadedMetadataEvent();
+ }
+
+ if (waitingForCDM) {
+ // Metadata parsing was successful but we're still waiting for CDM caps
+ // to become available so that we can build the correct decryptor/decoder.
+ SetState<WaitForCDMState>();
+ } else {
+ SetState<DecodingFirstFrameState>(SeekJob{});
+ }
+}
+
+void
+MediaDecoderStateMachine::
+DormantState::HandlePlayStateChanged(MediaDecoder::PlayState aPlayState)
+{
+ if (aPlayState == MediaDecoder::PLAY_STATE_PLAYING) {
+ // Exit dormant when the user wants to play.
+ MOZ_ASSERT(!Info().IsEncrypted() || mMaster->mCDMProxy);
+ MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
+ SetState<SeekingState>(Move(mPendingSeek), EventVisibility::Suppressed);
+ }
+}
+
+void
+MediaDecoderStateMachine::
+WaitForCDMState::HandleCDMProxyReady()
+{
+ SetState<DecodingFirstFrameState>(Move(mPendingSeek));
+}
+
+void
+MediaDecoderStateMachine::
+DecodingFirstFrameState::Enter(SeekJob aPendingSeek)
+{
+ // Handle pending seek.
+ if (aPendingSeek.Exists() &&
+ (mMaster->mSentFirstFrameLoadedEvent ||
+ Reader()->ForceZeroStartTime())) {
+ SetState<SeekingState>(Move(aPendingSeek), EventVisibility::Observable);
+ return;
+ }
+
+ // Transition to DECODING if we've decoded first frames.
+ if (mMaster->mSentFirstFrameLoadedEvent) {
+ SetState<DecodingState>();
+ return;
+ }
+
+ MOZ_ASSERT(!mMaster->mVideoDecodeSuspended);
+
+ mPendingSeek = Move(aPendingSeek);
+
+ // Dispatch tasks to decode first frames.
+ mMaster->DispatchDecodeTasksIfNeeded();
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+DecodingFirstFrameState::HandleSeek(SeekTarget aTarget)
+{
+ // Should've transitioned to DECODING in Enter()
+ // if mSentFirstFrameLoadedEvent is true.
+ MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
+
+ if (!Reader()->ForceZeroStartTime()) {
+ SLOG("Not Enough Data to seek at this stage, queuing seek");
+ mPendingSeek.RejectIfExists(__func__);
+ mPendingSeek.mTarget = aTarget;
+ return mPendingSeek.mPromise.Ensure(__func__);
+ }
+
+ // Since ForceZeroStartTime() is true, we should've transitioned to SEEKING
+ // in Enter() if there is any pending seek.
+ MOZ_ASSERT(!mPendingSeek.Exists());
+
+ return StateObject::HandleSeek(aTarget);
+}
+
+void
+MediaDecoderStateMachine::
+DecodingFirstFrameState::MaybeFinishDecodeFirstFrame()
+{
+ MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
+
+ if ((mMaster->IsAudioDecoding() && mMaster->AudioQueue().GetSize() == 0) ||
+ (mMaster->IsVideoDecoding() && mMaster->VideoQueue().GetSize() == 0)) {
+ return;
+ }
+
+ mMaster->FinishDecodeFirstFrame();
+
+ if (mPendingSeek.Exists()) {
+ SetState<SeekingState>(Move(mPendingSeek), EventVisibility::Observable);
+ } else {
+ SetState<DecodingState>();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::Enter()
+{
+ MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
+
+ if (!mMaster->mIsVisible &&
+ !mMaster->mVideoDecodeSuspendTimer.IsScheduled() &&
+ !mMaster->mVideoDecodeSuspended) {
+ // If we are not visible and the timer is not schedule, it means the timer
+ // has timed out and we should suspend video decoding now if necessary.
+ HandleVideoSuspendTimeout();
+ }
+
+ if (mMaster->CheckIfDecodeComplete()) {
+ SetState<CompletedState>();
+ return;
+ }
+
+ mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_AVAILABLE);
+
+ mDecodeStartTime = TimeStamp::Now();
+
+ MaybeStopPrerolling();
+
+ // Ensure that we've got tasks enqueued to decode data if we need to.
+ mMaster->DispatchDecodeTasksIfNeeded();
+
+ mMaster->ScheduleStateMachine();
+
+ // Will enter dormant when playback is paused for a while.
+ if (mMaster->mPlayState == MediaDecoder::PLAY_STATE_PAUSED) {
+ StartDormantTimer();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::HandleEndOfStream()
+{
+ if (mMaster->CheckIfDecodeComplete()) {
+ SetState<CompletedState>();
+ } else {
+ MaybeStopPrerolling();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::MaybeStartBuffering()
+{
+ // Buffering makes senses only after decoding first frames.
+ MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
+
+ // Don't enter buffering when MediaDecoder is not playing.
+ if (mMaster->mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
+ return;
+ }
+
+ // Don't enter buffering while prerolling so that the decoder has a chance to
+ // enqueue some decoded data before we give up and start buffering.
+ if (!mMaster->IsPlaying()) {
+ return;
+ }
+
+ bool shouldBuffer;
+ if (Reader()->UseBufferingHeuristics()) {
+ shouldBuffer = IsExpectingMoreData() &&
+ mMaster->HasLowDecodedData() &&
+ mMaster->HasLowBufferedData();
+ } else {
+ MOZ_ASSERT(Reader()->IsWaitForDataSupported());
+ shouldBuffer =
+ (mMaster->OutOfDecodedAudio() && Reader()->IsWaitingAudioData()) ||
+ (mMaster->OutOfDecodedVideo() && Reader()->IsWaitingVideoData());
+ }
+ if (shouldBuffer) {
+ SetState<BufferingState>();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+SeekingState::SeekCompleted()
+{
+ int64_t seekTime = mSeekTask->GetSeekTarget().GetTime().ToMicroseconds();
+ int64_t newCurrentTime = seekTime;
+
+ // Setup timestamp state.
+ RefPtr<MediaData> video = mMaster->VideoQueue().PeekFront();
+ if (seekTime == mMaster->Duration().ToMicroseconds()) {
+ newCurrentTime = seekTime;
+ } else if (mMaster->HasAudio()) {
+ RefPtr<MediaData> audio = mMaster->AudioQueue().PeekFront();
+ // Though we adjust the newCurrentTime in audio-based, and supplemented
+ // by video. For better UX, should NOT bind the slide position to
+ // the first audio data timestamp directly.
+ // While seeking to a position where there's only either audio or video, or
+ // seeking to a position lies before audio or video, we need to check if
+ // seekTime is bounded in suitable duration. See Bug 1112438.
+ int64_t audioStart = audio ? audio->mTime : seekTime;
+ // We only pin the seek time to the video start time if the video frame
+ // contains the seek time.
+ if (video && video->mTime <= seekTime && video->GetEndTime() > seekTime) {
+ newCurrentTime = std::min(audioStart, video->mTime);
+ } else {
+ newCurrentTime = audioStart;
+ }
+ } else {
+ newCurrentTime = video ? video->mTime : seekTime;
+ }
+
+ // Change state to DECODING or COMPLETED now.
+ bool isLiveStream = Resource()->IsLiveStream();
+ State nextState;
+ if (newCurrentTime == mMaster->Duration().ToMicroseconds() && !isLiveStream) {
+ // Seeked to end of media, move to COMPLETED state. Note we don't do
+ // this when playing a live stream, since the end of media will advance
+ // once we download more data!
+ // Explicitly set our state so we don't decode further, and so
+ // we report playback ended to the media element.
+ nextState = DECODER_STATE_COMPLETED;
+ } else {
+ nextState = DECODER_STATE_DECODING;
+ }
+
+ // We want to resolve the seek request prior finishing the first frame
+ // to ensure that the seeked event is fired prior loadeded.
+ mSeekJob.Resolve(nextState == DECODER_STATE_COMPLETED, __func__);
+
+ // Notify FirstFrameLoaded now if we haven't since we've decoded some data
+ // for readyState to transition to HAVE_CURRENT_DATA and fire 'loadeddata'.
+ if (!mMaster->mSentFirstFrameLoadedEvent) {
+ // Only MSE can start seeking before finishing decoding first frames.
+ MOZ_ASSERT(Reader()->ForceZeroStartTime());
+ mMaster->FinishDecodeFirstFrame();
+ }
+
+ // Ensure timestamps are up to date.
+ if (!mSeekJob.mTarget.IsVideoOnly()) {
+ // Don't update playback position for video-only seek.
+ // Otherwise we might have |newCurrentTime > mMediaSink->GetPosition()|
+ // and fail the assertion in GetClock() since we didn't stop MediaSink.
+ mMaster->UpdatePlaybackPositionInternal(newCurrentTime);
+ }
+
+ // Try to decode another frame to detect if we're at the end...
+ SLOG("Seek completed, mCurrentPosition=%lld", mMaster->mCurrentPosition.Ref());
+
+ if (video) {
+ mMaster->mMediaSink->Redraw(Info().mVideo);
+ mMaster->mOnPlaybackEvent.Notify(MediaEventType::Invalidate);
+ }
+
+ if (nextState == DECODER_STATE_COMPLETED) {
+ SetState<CompletedState>();
+ } else {
+ SetState<DecodingState>();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+BufferingState::Step()
+{
+ TimeStamp now = TimeStamp::Now();
+ MOZ_ASSERT(!mBufferingStart.IsNull(), "Must know buffering start time.");
+
+ // With buffering heuristics we will remain in the buffering state if
+ // we've not decoded enough data to begin playback, or if we've not
+ // downloaded a reasonable amount of data inside our buffering time.
+ if (Reader()->UseBufferingHeuristics()) {
+ TimeDuration elapsed = now - mBufferingStart;
+ bool isLiveStream = Resource()->IsLiveStream();
+ if ((isLiveStream || !mMaster->CanPlayThrough()) &&
+ elapsed < TimeDuration::FromSeconds(mBufferingWait * mMaster->mPlaybackRate) &&
+ mMaster->HasLowBufferedData(mBufferingWait * USECS_PER_S) &&
+ IsExpectingMoreData()) {
+ SLOG("Buffering: wait %ds, timeout in %.3lfs",
+ mBufferingWait, mBufferingWait - elapsed.ToSeconds());
+ mMaster->ScheduleStateMachineIn(USECS_PER_S);
+ return;
+ }
+ } else if (mMaster->OutOfDecodedAudio() || mMaster->OutOfDecodedVideo()) {
+ MOZ_ASSERT(Reader()->IsWaitForDataSupported(),
+ "Don't yet have a strategy for non-heuristic + non-WaitForData");
+ mMaster->DispatchDecodeTasksIfNeeded();
+ MOZ_ASSERT(mMaster->mMinimizePreroll ||
+ !mMaster->OutOfDecodedAudio() ||
+ Reader()->IsRequestingAudioData() ||
+ Reader()->IsWaitingAudioData());
+ MOZ_ASSERT(mMaster->mMinimizePreroll ||
+ !mMaster->OutOfDecodedVideo() ||
+ Reader()->IsRequestingVideoData() ||
+ Reader()->IsWaitingVideoData());
+ SLOG("In buffering mode, waiting to be notified: outOfAudio: %d, "
+ "mAudioStatus: %s, outOfVideo: %d, mVideoStatus: %s",
+ mMaster->OutOfDecodedAudio(), mMaster->AudioRequestStatus(),
+ mMaster->OutOfDecodedVideo(), mMaster->VideoRequestStatus());
+ return;
+ }
+
+ SLOG("Buffered for %.3lfs", (now - mBufferingStart).ToSeconds());
+ SetState<DecodingState>();
+}
+
+void
+MediaDecoderStateMachine::
+BufferingState::HandleEndOfStream()
+{
+ if (mMaster->CheckIfDecodeComplete()) {
+ SetState<CompletedState>();
+ } else {
+ // Check if we can exit buffering.
+ mMaster->ScheduleStateMachine();
+ }
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::
+ShutdownState::Enter()
+{
+ auto master = mMaster;
+
+ master->mIsShutdown = true;
+ master->mDelayedScheduler.Reset();
+ master->mBufferedUpdateRequest.DisconnectIfExists();
+
+ // Shutdown happens while decode timer is active, we need to disconnect and
+ // dispose of the timer.
+ master->mVideoDecodeSuspendTimer.Reset();
+
+ master->mCDMProxyPromise.DisconnectIfExists();
+
+ if (master->IsPlaying()) {
+ master->StopPlayback();
+ }
+
+ // To break the cycle-reference between MediaDecoderReaderWrapper and MDSM.
+ master->CancelMediaDecoderReaderWrapperCallback();
+
+ master->Reset();
+
+ master->mMediaSink->Shutdown();
+
+ // Prevent dangling pointers by disconnecting the listeners.
+ master->mAudioQueueListener.Disconnect();
+ master->mVideoQueueListener.Disconnect();
+ master->mMetadataManager.Disconnect();
+ master->mOnMediaNotSeekable.Disconnect();
+
+ // Disconnect canonicals and mirrors before shutting down our task queue.
+ master->mBuffered.DisconnectIfConnected();
+ master->mEstimatedDuration.DisconnectIfConnected();
+ master->mExplicitDuration.DisconnectIfConnected();
+ master->mPlayState.DisconnectIfConnected();
+ master->mNextPlayState.DisconnectIfConnected();
+ master->mVolume.DisconnectIfConnected();
+ master->mPreservesPitch.DisconnectIfConnected();
+ master->mSameOriginMedia.DisconnectIfConnected();
+ master->mMediaPrincipalHandle.DisconnectIfConnected();
+ master->mPlaybackBytesPerSecond.DisconnectIfConnected();
+ master->mPlaybackRateReliable.DisconnectIfConnected();
+ master->mDecoderPosition.DisconnectIfConnected();
+ master->mIsVisible.DisconnectIfConnected();
+
+ master->mDuration.DisconnectAll();
+ master->mIsShutdown.DisconnectAll();
+ master->mNextFrameStatus.DisconnectAll();
+ master->mCurrentPosition.DisconnectAll();
+ master->mPlaybackOffset.DisconnectAll();
+ master->mIsAudioDataAudible.DisconnectAll();
+
+ // Shut down the watch manager to stop further notifications.
+ master->mWatchManager.Shutdown();
+
+ return Reader()->Shutdown()
+ ->Then(OwnerThread(), __func__, master,
+ &MediaDecoderStateMachine::FinishShutdown,
+ &MediaDecoderStateMachine::FinishShutdown)
+ ->CompletionPromise();
+}
+
+#define INIT_WATCHABLE(name, val) \
+ name(val, "MediaDecoderStateMachine::" #name)
+#define INIT_MIRROR(name, val) \
+ name(mTaskQueue, val, "MediaDecoderStateMachine::" #name " (Mirror)")
+#define INIT_CANONICAL(name, val) \
+ name(mTaskQueue, val, "MediaDecoderStateMachine::" #name " (Canonical)")
+
+MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
+ MediaDecoderReader* aReader) :
+ mDecoderID(aDecoder),
+ mFrameStats(&aDecoder->GetFrameStatistics()),
+ mVideoFrameContainer(aDecoder->GetVideoFrameContainer()),
+ mAudioChannel(aDecoder->GetAudioChannel()),
+ mTaskQueue(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK),
+ /* aSupportsTailDispatch = */ true)),
+ mWatchManager(this, mTaskQueue),
+ mDispatchedStateMachine(false),
+ mDelayedScheduler(mTaskQueue),
+ mCurrentFrameID(0),
+ INIT_WATCHABLE(mObservedDuration, TimeUnit()),
+ mFragmentEndTime(-1),
+ mReader(new MediaDecoderReaderWrapper(mTaskQueue, aReader)),
+ mDecodedAudioEndTime(0),
+ mDecodedVideoEndTime(0),
+ mPlaybackRate(1.0),
+ mLowAudioThresholdUsecs(detail::LOW_AUDIO_USECS),
+ mAmpleAudioThresholdUsecs(detail::AMPLE_AUDIO_USECS),
+ mAudioCaptured(false),
+ mNotifyMetadataBeforeFirstFrame(false),
+ mMinimizePreroll(false),
+ mSentLoadedMetadataEvent(false),
+ mSentFirstFrameLoadedEvent(false),
+ mVideoDecodeSuspended(false),
+ mVideoDecodeSuspendTimer(mTaskQueue),
+ mOutputStreamManager(new OutputStreamManager()),
+ mResource(aDecoder->GetResource()),
+ mAudioOffloading(false),
+ INIT_MIRROR(mBuffered, TimeIntervals()),
+ INIT_MIRROR(mEstimatedDuration, NullableTimeUnit()),
+ INIT_MIRROR(mExplicitDuration, Maybe<double>()),
+ INIT_MIRROR(mPlayState, MediaDecoder::PLAY_STATE_LOADING),
+ INIT_MIRROR(mNextPlayState, MediaDecoder::PLAY_STATE_PAUSED),
+ INIT_MIRROR(mVolume, 1.0),
+ INIT_MIRROR(mPreservesPitch, true),
+ INIT_MIRROR(mSameOriginMedia, false),
+ INIT_MIRROR(mMediaPrincipalHandle, PRINCIPAL_HANDLE_NONE),
+ INIT_MIRROR(mPlaybackBytesPerSecond, 0.0),
+ INIT_MIRROR(mPlaybackRateReliable, true),
+ INIT_MIRROR(mDecoderPosition, 0),
+ INIT_MIRROR(mIsVisible, true),
+ INIT_CANONICAL(mDuration, NullableTimeUnit()),
+ INIT_CANONICAL(mIsShutdown, false),
+ INIT_CANONICAL(mNextFrameStatus, MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE),
+ INIT_CANONICAL(mCurrentPosition, 0),
+ INIT_CANONICAL(mPlaybackOffset, 0),
+ INIT_CANONICAL(mIsAudioDataAudible, false)
+{
+ MOZ_COUNT_CTOR(MediaDecoderStateMachine);
+ NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
+
+ InitVideoQueuePrefs();
+
+#ifdef XP_WIN
+ // Ensure high precision timers are enabled on Windows, otherwise the state
+ // machine isn't woken up at reliable intervals to set the next frame,
+ // and we drop frames while painting. Note that multiple calls to this
+ // function per-process is OK, provided each call is matched by a corresponding
+ // timeEndPeriod() call.
+ timeBeginPeriod(1);
+#endif
+}
+
+#undef INIT_WATCHABLE
+#undef INIT_MIRROR
+#undef INIT_CANONICAL
+
+MediaDecoderStateMachine::~MediaDecoderStateMachine()
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Should be on main thread.");
+ MOZ_COUNT_DTOR(MediaDecoderStateMachine);
+
+#ifdef XP_WIN
+ timeEndPeriod(1);
+#endif
+}
+
+void
+MediaDecoderStateMachine::InitializationTask(MediaDecoder* aDecoder)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ // Connect mirrors.
+ mBuffered.Connect(mReader->CanonicalBuffered());
+ mEstimatedDuration.Connect(aDecoder->CanonicalEstimatedDuration());
+ mExplicitDuration.Connect(aDecoder->CanonicalExplicitDuration());
+ mPlayState.Connect(aDecoder->CanonicalPlayState());
+ mNextPlayState.Connect(aDecoder->CanonicalNextPlayState());
+ mVolume.Connect(aDecoder->CanonicalVolume());
+ mPreservesPitch.Connect(aDecoder->CanonicalPreservesPitch());
+ mSameOriginMedia.Connect(aDecoder->CanonicalSameOriginMedia());
+ mMediaPrincipalHandle.Connect(aDecoder->CanonicalMediaPrincipalHandle());
+ mPlaybackBytesPerSecond.Connect(aDecoder->CanonicalPlaybackBytesPerSecond());
+ mPlaybackRateReliable.Connect(aDecoder->CanonicalPlaybackRateReliable());
+ mDecoderPosition.Connect(aDecoder->CanonicalDecoderPosition());
+
+ // Initialize watchers.
+ mWatchManager.Watch(mBuffered, &MediaDecoderStateMachine::BufferedRangeUpdated);
+ mWatchManager.Watch(mVolume, &MediaDecoderStateMachine::VolumeChanged);
+ mWatchManager.Watch(mPreservesPitch, &MediaDecoderStateMachine::PreservesPitchChanged);
+ mWatchManager.Watch(mEstimatedDuration, &MediaDecoderStateMachine::RecomputeDuration);
+ mWatchManager.Watch(mExplicitDuration, &MediaDecoderStateMachine::RecomputeDuration);
+ mWatchManager.Watch(mObservedDuration, &MediaDecoderStateMachine::RecomputeDuration);
+ mWatchManager.Watch(mPlayState, &MediaDecoderStateMachine::PlayStateChanged);
+
+ if (MediaPrefs::MDSMSuspendBackgroundVideoEnabled()) {
+ mIsVisible.Connect(aDecoder->CanonicalIsVisible());
+ mWatchManager.Watch(mIsVisible, &MediaDecoderStateMachine::VisibilityChanged);
+ }
+
+ // Configure MediaDecoderReaderWrapper.
+ SetMediaDecoderReaderWrapperCallback();
+}
+
+void
+MediaDecoderStateMachine::AudioAudibleChanged(bool aAudible)
+{
+ mIsAudioDataAudible = aAudible;
+}
+
+media::MediaSink*
+MediaDecoderStateMachine::CreateAudioSink()
+{
+ RefPtr<MediaDecoderStateMachine> self = this;
+ auto audioSinkCreator = [self] () {
+ MOZ_ASSERT(self->OnTaskQueue());
+ DecodedAudioDataSink* audioSink = new DecodedAudioDataSink(
+ self->mTaskQueue, self->mAudioQueue, self->GetMediaTime(),
+ self->Info().mAudio, self->mAudioChannel);
+
+ self->mAudibleListener = audioSink->AudibleEvent().Connect(
+ self->mTaskQueue, self.get(), &MediaDecoderStateMachine::AudioAudibleChanged);
+ return audioSink;
+ };
+ return new AudioSinkWrapper(mTaskQueue, audioSinkCreator);
+}
+
+already_AddRefed<media::MediaSink>
+MediaDecoderStateMachine::CreateMediaSink(bool aAudioCaptured)
+{
+ RefPtr<media::MediaSink> audioSink = aAudioCaptured
+ ? new DecodedStream(mTaskQueue, mAudioQueue, mVideoQueue,
+ mOutputStreamManager, mSameOriginMedia.Ref(),
+ mMediaPrincipalHandle.Ref())
+ : CreateAudioSink();
+
+ RefPtr<media::MediaSink> mediaSink =
+ new VideoSink(mTaskQueue, audioSink, mVideoQueue,
+ mVideoFrameContainer, *mFrameStats,
+ sVideoQueueSendToCompositorSize);
+ return mediaSink.forget();
+}
+
+int64_t
+MediaDecoderStateMachine::GetDecodedAudioDuration()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mMediaSink->IsStarted()) {
+ // mDecodedAudioEndTime might be smaller than GetClock() when there is
+ // overlap between 2 adjacent audio samples or when we are playing
+ // a chained ogg file.
+ return std::max<int64_t>(mDecodedAudioEndTime - GetClock(), 0);
+ }
+ // MediaSink not started. All audio samples are in the queue.
+ return AudioQueue().Duration();
+}
+
+bool MediaDecoderStateMachine::HaveEnoughDecodedAudio()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ int64_t ampleAudioUSecs = mAmpleAudioThresholdUsecs * mPlaybackRate;
+ if (AudioQueue().GetSize() == 0 ||
+ GetDecodedAudioDuration() < ampleAudioUSecs) {
+ return false;
+ }
+
+ // MDSM will ensure buffering level is high enough for playback speed at 1x
+ // at which the DecodedStream is playing.
+ return true;
+}
+
+bool MediaDecoderStateMachine::HaveEnoughDecodedVideo()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (VideoQueue().GetSize() == 0) {
+ return false;
+ }
+
+ if (VideoQueue().GetSize() - 1 < GetAmpleVideoFrames() * mPlaybackRate) {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+MediaDecoderStateMachine::NeedToDecodeVideo()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ SAMPLE_LOG("NeedToDecodeVideo() isDec=%d minPrl=%d enufVid=%d",
+ IsVideoDecoding(), mMinimizePreroll, HaveEnoughDecodedVideo());
+ return IsVideoDecoding() &&
+ mState != DECODER_STATE_SEEKING &&
+ ((!mSentFirstFrameLoadedEvent && VideoQueue().GetSize() == 0) ||
+ (!mMinimizePreroll && !HaveEnoughDecodedVideo()));
+}
+
+bool
+MediaDecoderStateMachine::NeedToSkipToNextKeyframe()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ // Don't skip when we're still decoding first frames.
+ if (!mSentFirstFrameLoadedEvent) {
+ return false;
+ }
+ MOZ_ASSERT(mState == DECODER_STATE_DECODING ||
+ mState == DECODER_STATE_BUFFERING ||
+ mState == DECODER_STATE_SEEKING);
+
+ // Since GetClock() can only be called after starting MediaSink, we return
+ // false quickly if it is not started because we won't fall behind playback
+ // when not consuming media data.
+ if (!mMediaSink->IsStarted()) {
+ return false;
+ }
+
+ // We are in seeking or buffering states, don't skip frame.
+ if (!IsVideoDecoding() || mState == DECODER_STATE_BUFFERING ||
+ mState == DECODER_STATE_SEEKING) {
+ return false;
+ }
+
+ // Don't skip frame for video-only decoded stream because the clock time of
+ // the stream relies on the video frame.
+ if (mAudioCaptured && !HasAudio()) {
+ return false;
+ }
+
+ // We'll skip the video decode to the next keyframe if we're low on
+ // audio, or if we're low on video, provided we're not running low on
+ // data to decode. If we're running low on downloaded data to decode,
+ // we won't start keyframe skipping, as we'll be pausing playback to buffer
+ // soon anyway and we'll want to be able to display frames immediately
+ // after buffering finishes. We ignore the low audio calculations for
+ // readers that are async, as since their audio decode runs on a different
+ // task queue it should never run low and skipping won't help their decode.
+ bool isLowOnDecodedAudio = !mReader->IsAsync() &&
+ IsAudioDecoding() &&
+ (GetDecodedAudioDuration() <
+ mLowAudioThresholdUsecs * mPlaybackRate);
+ bool isLowOnDecodedVideo = (GetClock() - mDecodedVideoEndTime) * mPlaybackRate >
+ LOW_VIDEO_THRESHOLD_USECS;
+ bool lowBuffered = HasLowBufferedData();
+
+ if ((isLowOnDecodedAudio || isLowOnDecodedVideo) && !lowBuffered) {
+ DECODER_LOG("Skipping video decode to the next keyframe lowAudio=%d lowVideo=%d lowUndecoded=%d async=%d",
+ isLowOnDecodedAudio, isLowOnDecodedVideo, lowBuffered, mReader->IsAsync());
+ return true;
+ }
+
+ return false;
+}
+
+bool
+MediaDecoderStateMachine::NeedToDecodeAudio()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ SAMPLE_LOG("NeedToDecodeAudio() isDec=%d minPrl=%d enufAud=%d",
+ IsAudioDecoding(), mMinimizePreroll, HaveEnoughDecodedAudio());
+
+ return IsAudioDecoding() &&
+ mState != DECODER_STATE_SEEKING &&
+ ((!mSentFirstFrameLoadedEvent && AudioQueue().GetSize() == 0) ||
+ (!mMinimizePreroll && !HaveEnoughDecodedAudio()));
+}
+
+void
+MediaDecoderStateMachine::OnAudioDecoded(MediaData* aAudio)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(aAudio);
+
+ // audio->GetEndTime() is not always mono-increasing in chained ogg.
+ mDecodedAudioEndTime = std::max(aAudio->GetEndTime(), mDecodedAudioEndTime);
+
+ SAMPLE_LOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
+
+ mStateObj->HandleAudioDecoded(aAudio);
+}
+
+void
+MediaDecoderStateMachine::Push(MediaData* aSample, MediaData::Type aSampleType)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(aSample);
+
+ if (aSample->mType == MediaData::AUDIO_DATA) {
+ // TODO: Send aSample to MSG and recalculate readystate before pushing,
+ // otherwise AdvanceFrame may pop the sample before we have a chance
+ // to reach playing.
+ AudioQueue().Push(aSample);
+ } else if (aSample->mType == MediaData::VIDEO_DATA) {
+ // TODO: Send aSample to MSG and recalculate readystate before pushing,
+ // otherwise AdvanceFrame may pop the sample before we have a chance
+ // to reach playing.
+ aSample->As<VideoData>()->mFrameID = ++mCurrentFrameID;
+ VideoQueue().Push(aSample);
+ } else {
+ // TODO: Handle MediaRawData, determine which queue should be pushed.
+ }
+ DispatchDecodeTasksIfNeeded();
+}
+
+void
+MediaDecoderStateMachine::OnAudioPopped(const RefPtr<MediaData>& aSample)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ mPlaybackOffset = std::max(mPlaybackOffset.Ref(), aSample->mOffset);
+ DispatchAudioDecodeTaskIfNeeded();
+}
+
+void
+MediaDecoderStateMachine::OnVideoPopped(const RefPtr<MediaData>& aSample)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mPlaybackOffset = std::max(mPlaybackOffset.Ref(), aSample->mOffset);
+ DispatchVideoDecodeTaskIfNeeded();
+}
+
+void
+MediaDecoderStateMachine::OnNotDecoded(MediaData::Type aType,
+ const MediaResult& aError)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
+
+ SAMPLE_LOG("OnNotDecoded (aType=%u, aError=%u)", aType, aError.Code());
+ bool isAudio = aType == MediaData::AUDIO_DATA;
+ MOZ_ASSERT_IF(!isAudio, aType == MediaData::VIDEO_DATA);
+
+ if (IsShutdown()) {
+ // Already shutdown;
+ return;
+ }
+
+ // If the decoder is waiting for data, we tell it to call us back when the
+ // data arrives.
+ if (aError == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
+ MOZ_ASSERT(mReader->IsWaitForDataSupported(),
+ "Readers that send WAITING_FOR_DATA need to implement WaitForData");
+ mReader->WaitForData(aType);
+ mStateObj->HandleWaitingForData();
+ return;
+ }
+
+ if (aError == NS_ERROR_DOM_MEDIA_CANCELED) {
+ if (isAudio) {
+ EnsureAudioDecodeTaskQueued();
+ } else {
+ EnsureVideoDecodeTaskQueued();
+ }
+ return;
+ }
+
+ // If this is a decode error, delegate to the generic error path.
+ if (aError != NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ DecodeError(aError);
+ return;
+ }
+
+ // This is an EOS. Finish off the queue, and then handle things based on our
+ // state.
+ if (isAudio) {
+ AudioQueue().Finish();
+ } else {
+ VideoQueue().Finish();
+ }
+
+ mStateObj->HandleEndOfStream();
+}
+
+void
+MediaDecoderStateMachine::OnVideoDecoded(MediaData* aVideo,
+ TimeStamp aDecodeStartTime)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(aVideo);
+
+ // Handle abnormal or negative timestamps.
+ mDecodedVideoEndTime = std::max(mDecodedVideoEndTime, aVideo->GetEndTime());
+
+ SAMPLE_LOG("OnVideoDecoded [%lld,%lld]", aVideo->mTime, aVideo->GetEndTime());
+
+ mStateObj->HandleVideoDecoded(aVideo, aDecodeStartTime);
+}
+
+bool
+MediaDecoderStateMachine::IsAudioDecoding()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return HasAudio() && !AudioQueue().IsFinished();
+}
+
+bool
+MediaDecoderStateMachine::IsVideoDecoding()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return HasVideo() && !VideoQueue().IsFinished();
+}
+
+bool
+MediaDecoderStateMachine::CheckIfDecodeComplete()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ // DecodeComplete is possible only after decoding first frames.
+ MOZ_ASSERT(mSentFirstFrameLoadedEvent);
+ MOZ_ASSERT(mState == DECODER_STATE_DECODING ||
+ mState == DECODER_STATE_BUFFERING);
+ return !IsVideoDecoding() && !IsAudioDecoding();
+}
+
+bool MediaDecoderStateMachine::IsPlaying() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return mMediaSink->IsPlaying();
+}
+
+void MediaDecoderStateMachine::SetMediaNotSeekable()
+{
+ mMediaSeekable = false;
+}
+
+void
+MediaDecoderStateMachine::OnAudioCallback(AudioCallbackData aData)
+{
+ if (aData.is<MediaData*>()) {
+ OnAudioDecoded(aData.as<MediaData*>());
+ } else {
+ OnNotDecoded(MediaData::AUDIO_DATA, aData.as<MediaResult>());
+ }
+}
+
+void
+MediaDecoderStateMachine::OnVideoCallback(VideoCallbackData aData)
+{
+ typedef Tuple<MediaData*, TimeStamp> Type;
+ if (aData.is<Type>()) {
+ auto&& v = aData.as<Type>();
+ OnVideoDecoded(Get<0>(v), Get<1>(v));
+ } else {
+ OnNotDecoded(MediaData::VIDEO_DATA, aData.as<MediaResult>());
+ }
+}
+
+void
+MediaDecoderStateMachine::OnAudioWaitCallback(WaitCallbackData aData)
+{
+ if (aData.is<MediaData::Type>()) {
+ EnsureAudioDecodeTaskQueued();
+ }
+}
+
+void
+MediaDecoderStateMachine::OnVideoWaitCallback(WaitCallbackData aData)
+{
+ if (aData.is<MediaData::Type>()) {
+ EnsureVideoDecodeTaskQueued();
+ }
+}
+
+nsresult MediaDecoderStateMachine::Init(MediaDecoder* aDecoder)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // Dispatch initialization that needs to happen on that task queue.
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod<RefPtr<MediaDecoder>>(
+ this, &MediaDecoderStateMachine::InitializationTask, aDecoder);
+ mTaskQueue->Dispatch(r.forget());
+
+ mAudioQueueListener = AudioQueue().PopEvent().Connect(
+ mTaskQueue, this, &MediaDecoderStateMachine::OnAudioPopped);
+ mVideoQueueListener = VideoQueue().PopEvent().Connect(
+ mTaskQueue, this, &MediaDecoderStateMachine::OnVideoPopped);
+
+ mMetadataManager.Connect(mReader->TimedMetadataEvent(), OwnerThread());
+
+ mOnMediaNotSeekable = mReader->OnMediaNotSeekable().Connect(
+ OwnerThread(), this, &MediaDecoderStateMachine::SetMediaNotSeekable);
+
+ mMediaSink = CreateMediaSink(mAudioCaptured);
+
+ mCDMProxyPromise.Begin(aDecoder->RequestCDMProxy()->Then(
+ OwnerThread(), __func__, this,
+ &MediaDecoderStateMachine::OnCDMProxyReady,
+ &MediaDecoderStateMachine::OnCDMProxyNotReady));
+
+ nsresult rv = mReader->Init();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ RefPtr<MediaDecoderStateMachine> self = this;
+ OwnerThread()->Dispatch(NS_NewRunnableFunction([self] () {
+ MOZ_ASSERT(self->mState == DECODER_STATE_DECODING_METADATA);
+ MOZ_ASSERT(!self->mStateObj);
+ auto s = new DecodeMetadataState(self);
+ self->mStateObj.reset(s);
+ s->Enter();
+ }));
+
+ return NS_OK;
+}
+
+void
+MediaDecoderStateMachine::SetMediaDecoderReaderWrapperCallback()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ // The use of raw pointer references is safe because the lifecycle of a
+ // MediaDecoderStateMachine guarantees that the callbacks are disconnected
+ // before the MediaDecoderStateMachine is destroyed.
+ mAudioCallback = mReader->AudioCallback().Connect(
+ mTaskQueue, this, &MediaDecoderStateMachine::OnAudioCallback);
+
+ mVideoCallback = mReader->VideoCallback().Connect(
+ mTaskQueue, this, &MediaDecoderStateMachine::OnVideoCallback);
+
+ mAudioWaitCallback = mReader->AudioWaitCallback().Connect(
+ mTaskQueue, this, &MediaDecoderStateMachine::OnAudioWaitCallback);
+
+ mVideoWaitCallback = mReader->VideoWaitCallback().Connect(
+ mTaskQueue, this, &MediaDecoderStateMachine::OnVideoWaitCallback);
+}
+
+void
+MediaDecoderStateMachine::CancelMediaDecoderReaderWrapperCallback()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mAudioCallback.Disconnect();
+ mVideoCallback.Disconnect();
+ mAudioWaitCallback.Disconnect();
+ mVideoWaitCallback.Disconnect();
+}
+
+void MediaDecoderStateMachine::StopPlayback()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ DECODER_LOG("StopPlayback()");
+
+ mOnPlaybackEvent.Notify(MediaEventType::PlaybackStopped);
+
+ if (IsPlaying()) {
+ mMediaSink->SetPlaying(false);
+ MOZ_ASSERT(!IsPlaying());
+ }
+
+ DispatchDecodeTasksIfNeeded();
+}
+
+void MediaDecoderStateMachine::MaybeStartPlayback()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ // Should try to start playback only after decoding first frames.
+ MOZ_ASSERT(mSentFirstFrameLoadedEvent);
+ MOZ_ASSERT(mState == DECODER_STATE_DECODING ||
+ mState == DECODER_STATE_COMPLETED);
+
+ if (IsPlaying()) {
+ // Logging this case is really spammy - don't do it.
+ return;
+ }
+
+ bool playStatePermits = mPlayState == MediaDecoder::PLAY_STATE_PLAYING;
+ if (!playStatePermits || mAudioOffloading) {
+ DECODER_LOG("Not starting playback [playStatePermits: %d, "
+ "mAudioOffloading: %d]",
+ playStatePermits, mAudioOffloading);
+ return;
+ }
+
+ DECODER_LOG("MaybeStartPlayback() starting playback");
+ mOnPlaybackEvent.Notify(MediaEventType::PlaybackStarted);
+ StartMediaSink();
+
+ if (!IsPlaying()) {
+ mMediaSink->SetPlaying(true);
+ MOZ_ASSERT(IsPlaying());
+ }
+
+ DispatchDecodeTasksIfNeeded();
+}
+
+void MediaDecoderStateMachine::UpdatePlaybackPositionInternal(int64_t aTime)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ SAMPLE_LOG("UpdatePlaybackPositionInternal(%lld)", aTime);
+
+ mCurrentPosition = aTime;
+ NS_ASSERTION(mCurrentPosition >= 0, "CurrentTime should be positive!");
+ mObservedDuration = std::max(mObservedDuration.Ref(),
+ TimeUnit::FromMicroseconds(mCurrentPosition.Ref()));
+}
+
+void MediaDecoderStateMachine::UpdatePlaybackPosition(int64_t aTime)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ UpdatePlaybackPositionInternal(aTime);
+
+ bool fragmentEnded = mFragmentEndTime >= 0 && GetMediaTime() >= mFragmentEndTime;
+ mMetadataManager.DispatchMetadataIfNeeded(TimeUnit::FromMicroseconds(aTime));
+
+ if (fragmentEnded) {
+ StopPlayback();
+ }
+}
+
+/* static */ const char*
+MediaDecoderStateMachine::ToStateStr(State aState)
+{
+ switch (aState) {
+ case DECODER_STATE_DECODING_METADATA: return "DECODING_METADATA";
+ case DECODER_STATE_WAIT_FOR_CDM: return "WAIT_FOR_CDM";
+ case DECODER_STATE_DORMANT: return "DORMANT";
+ case DECODER_STATE_DECODING_FIRSTFRAME: return "DECODING_FIRSTFRAME";
+ case DECODER_STATE_DECODING: return "DECODING";
+ case DECODER_STATE_SEEKING: return "SEEKING";
+ case DECODER_STATE_BUFFERING: return "BUFFERING";
+ case DECODER_STATE_COMPLETED: return "COMPLETED";
+ case DECODER_STATE_SHUTDOWN: return "SHUTDOWN";
+ default: MOZ_ASSERT_UNREACHABLE("Invalid state.");
+ }
+ return "UNKNOWN";
+}
+
+const char*
+MediaDecoderStateMachine::ToStateStr()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return ToStateStr(mState);
+}
+
+void MediaDecoderStateMachine::VolumeChanged()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mMediaSink->SetVolume(mVolume);
+}
+
+void MediaDecoderStateMachine::RecomputeDuration()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ TimeUnit duration;
+ if (mExplicitDuration.Ref().isSome()) {
+ double d = mExplicitDuration.Ref().ref();
+ if (IsNaN(d)) {
+ // We have an explicit duration (which means that we shouldn't look at
+ // any other duration sources), but the duration isn't ready yet.
+ return;
+ }
+ // We don't fire duration changed for this case because it should have
+ // already been fired on the main thread when the explicit duration was set.
+ duration = TimeUnit::FromSeconds(d);
+ } else if (mEstimatedDuration.Ref().isSome()) {
+ duration = mEstimatedDuration.Ref().ref();
+ } else if (Info().mMetadataDuration.isSome()) {
+ duration = Info().mMetadataDuration.ref();
+ } else {
+ return;
+ }
+
+ // Only adjust the duration when an explicit duration isn't set (MSE).
+ // The duration is always exactly known with MSE and there's no need to adjust
+ // it based on what may have been seen in the past; in particular as this data
+ // may no longer exist such as when the mediasource duration was reduced.
+ if (mExplicitDuration.Ref().isNothing() &&
+ duration < mObservedDuration.Ref()) {
+ duration = mObservedDuration;
+ }
+
+ MOZ_ASSERT(duration.ToMicroseconds() >= 0);
+ mDuration = Some(duration);
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::Shutdown()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return mStateObj->HandleShutdown();
+}
+
+void MediaDecoderStateMachine::PlayStateChanged()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
+ mVideoDecodeSuspendTimer.Reset();
+ } else if (mMinimizePreroll) {
+ // Once we start playing, we don't want to minimize our prerolling, as we
+ // assume the user is likely to want to keep playing in future. This needs to
+ // happen before we invoke StartDecoding().
+ mMinimizePreroll = false;
+ DispatchDecodeTasksIfNeeded();
+ }
+
+ mStateObj->HandlePlayStateChanged(mPlayState);
+}
+
+void MediaDecoderStateMachine::VisibilityChanged()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ DECODER_LOG("VisibilityChanged: mIsVisible=%d, mVideoDecodeSuspended=%c",
+ mIsVisible.Ref(), mVideoDecodeSuspended ? 'T' : 'F');
+
+ // Start timer to trigger suspended decoding state when going invisible.
+ if (!mIsVisible) {
+ TimeStamp target = TimeStamp::Now() + SuspendBackgroundVideoDelay();
+
+ RefPtr<MediaDecoderStateMachine> self = this;
+ mVideoDecodeSuspendTimer.Ensure(target,
+ [=]() { self->OnSuspendTimerResolved(); },
+ [=]() { self->OnSuspendTimerRejected(); });
+ return;
+ }
+
+ // Resuming from suspended decoding
+
+ // If suspend timer exists, destroy it.
+ mVideoDecodeSuspendTimer.Reset();
+
+ if (mVideoDecodeSuspended) {
+ mStateObj->HandleResumeVideoDecoding();
+ }
+}
+
+void MediaDecoderStateMachine::BufferedRangeUpdated()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ // While playing an unseekable stream of unknown duration, mObservedDuration
+ // is updated (in AdvanceFrame()) as we play. But if data is being downloaded
+ // faster than played, mObserved won't reflect the end of playable data
+ // since we haven't played the frame at the end of buffered data. So update
+ // mObservedDuration here as new data is downloaded to prevent such a lag.
+ if (!mBuffered.Ref().IsInvalid()) {
+ bool exists;
+ media::TimeUnit end{mBuffered.Ref().GetEnd(&exists)};
+ if (exists) {
+ mObservedDuration = std::max(mObservedDuration.Ref(), end);
+ }
+ }
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::Seek(SeekTarget aTarget)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (IsShutdown()) {
+ return MediaDecoder::SeekPromise::CreateAndReject(/* aIgnored = */ true, __func__);
+ }
+
+ // We need to be able to seek in some way
+ if (!mMediaSeekable && !mMediaSeekableOnlyInBufferedRanges) {
+ DECODER_WARN("Seek() function should not be called on a non-seekable state machine");
+ return MediaDecoder::SeekPromise::CreateAndReject(/* aIgnored = */ true, __func__);
+ }
+
+ if (aTarget.IsNextFrame() && !HasVideo()) {
+ DECODER_WARN("Ignore a NextFrameSeekTask on a media file without video track.");
+ return MediaDecoder::SeekPromise::CreateAndReject(/* aIgnored = */ true, __func__);
+ }
+
+ MOZ_ASSERT(mDuration.Ref().isSome(), "We should have got duration already");
+
+ return mStateObj->HandleSeek(aTarget);
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::InvokeSeek(SeekTarget aTarget)
+{
+ return InvokeAsync(OwnerThread(), this, __func__,
+ &MediaDecoderStateMachine::Seek, aTarget);
+}
+
+void MediaDecoderStateMachine::StopMediaSink()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mMediaSink->IsStarted()) {
+ DECODER_LOG("Stop MediaSink");
+ mAudibleListener.DisconnectIfExists();
+
+ mMediaSink->Stop();
+ mMediaSinkAudioPromise.DisconnectIfExists();
+ mMediaSinkVideoPromise.DisconnectIfExists();
+ }
+}
+
+void
+MediaDecoderStateMachine::DispatchDecodeTasksIfNeeded()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (mState != DECODER_STATE_DECODING &&
+ mState != DECODER_STATE_DECODING_FIRSTFRAME &&
+ mState != DECODER_STATE_BUFFERING &&
+ mState != DECODER_STATE_SEEKING) {
+ return;
+ }
+
+ // NeedToDecodeAudio() can go from false to true while we hold the
+ // monitor, but it can't go from true to false. This can happen because
+ // NeedToDecodeAudio() takes into account the amount of decoded audio
+ // that's been written to the AudioStream but not played yet. So if we
+ // were calling NeedToDecodeAudio() twice and we thread-context switch
+ // between the calls, audio can play, which can affect the return value
+ // of NeedToDecodeAudio() giving inconsistent results. So we cache the
+ // value returned by NeedToDecodeAudio(), and make decisions
+ // based on the cached value. If NeedToDecodeAudio() has
+ // returned false, and then subsequently returns true and we're not
+ // playing, it will probably be OK since we don't need to consume data
+ // anyway.
+
+ const bool needToDecodeAudio = NeedToDecodeAudio();
+ const bool needToDecodeVideo = NeedToDecodeVideo();
+
+ // If we're in completed state, we should not need to decode anything else.
+ MOZ_ASSERT(mState != DECODER_STATE_COMPLETED ||
+ (!needToDecodeAudio && !needToDecodeVideo));
+
+ bool needIdle = !IsLogicallyPlaying() &&
+ mState != DECODER_STATE_SEEKING &&
+ !needToDecodeAudio &&
+ !needToDecodeVideo &&
+ !IsPlaying();
+
+ SAMPLE_LOG("DispatchDecodeTasksIfNeeded needAudio=%d audioStatus=%s needVideo=%d videoStatus=%s needIdle=%d",
+ needToDecodeAudio, AudioRequestStatus(),
+ needToDecodeVideo, VideoRequestStatus(),
+ needIdle);
+
+ if (needToDecodeAudio) {
+ EnsureAudioDecodeTaskQueued();
+ }
+ if (needToDecodeVideo) {
+ EnsureVideoDecodeTaskQueued();
+ }
+
+ if (needIdle) {
+ DECODER_LOG("Dispatching SetIdle() audioQueue=%lld videoQueue=%lld",
+ GetDecodedAudioDuration(),
+ VideoQueue().Duration());
+ mReader->SetIdle();
+ }
+}
+
+void
+MediaDecoderStateMachine::DispatchAudioDecodeTaskIfNeeded()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (!IsShutdown() && NeedToDecodeAudio()) {
+ EnsureAudioDecodeTaskQueued();
+ }
+}
+
+void
+MediaDecoderStateMachine::EnsureAudioDecodeTaskQueued()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
+
+ SAMPLE_LOG("EnsureAudioDecodeTaskQueued isDecoding=%d status=%s",
+ IsAudioDecoding(), AudioRequestStatus());
+
+ if (mState != DECODER_STATE_DECODING &&
+ mState != DECODER_STATE_DECODING_FIRSTFRAME &&
+ mState != DECODER_STATE_BUFFERING) {
+ return;
+ }
+
+ if (!IsAudioDecoding() ||
+ mReader->IsRequestingAudioData() ||
+ mReader->IsWaitingAudioData()) {
+ return;
+ }
+
+ RequestAudioData();
+}
+
+void
+MediaDecoderStateMachine::RequestAudioData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
+
+ SAMPLE_LOG("Queueing audio task - queued=%i, decoder-queued=%o",
+ AudioQueue().GetSize(), mReader->SizeOfAudioQueueInFrames());
+
+ mReader->RequestAudioData();
+}
+
+void
+MediaDecoderStateMachine::DispatchVideoDecodeTaskIfNeeded()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (!IsShutdown() && NeedToDecodeVideo()) {
+ EnsureVideoDecodeTaskQueued();
+ }
+}
+
+void
+MediaDecoderStateMachine::EnsureVideoDecodeTaskQueued()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
+
+ SAMPLE_LOG("EnsureVideoDecodeTaskQueued isDecoding=%d status=%s",
+ IsVideoDecoding(), VideoRequestStatus());
+
+ if (mState != DECODER_STATE_DECODING &&
+ mState != DECODER_STATE_DECODING_FIRSTFRAME &&
+ mState != DECODER_STATE_BUFFERING) {
+ return;
+ }
+
+ if (!IsVideoDecoding() ||
+ mReader->IsRequestingVideoData() ||
+ mReader->IsWaitingVideoData()) {
+ return;
+ }
+
+ RequestVideoData();
+}
+
+void
+MediaDecoderStateMachine::RequestVideoData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
+
+ bool skipToNextKeyFrame = NeedToSkipToNextKeyframe();
+
+ media::TimeUnit currentTime = media::TimeUnit::FromMicroseconds(GetMediaTime());
+
+ SAMPLE_LOG("Queueing video task - queued=%i, decoder-queued=%o, skip=%i, time=%lld",
+ VideoQueue().GetSize(), mReader->SizeOfVideoQueueInFrames(), skipToNextKeyFrame,
+ currentTime.ToMicroseconds());
+
+ // MediaDecoderReaderWrapper::RequestVideoData() records the decoding start
+ // time and sent it back to MDSM::OnVideoDecoded() so that if the decoding is
+ // slow, we can increase our low audio threshold to reduce the chance of an
+ // audio underrun while we're waiting for a video decode to complete.
+ mReader->RequestVideoData(skipToNextKeyFrame, currentTime);
+}
+
+void
+MediaDecoderStateMachine::StartMediaSink()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (!mMediaSink->IsStarted()) {
+ mAudioCompleted = false;
+ mMediaSink->Start(GetMediaTime(), Info());
+
+ auto videoPromise = mMediaSink->OnEnded(TrackInfo::kVideoTrack);
+ auto audioPromise = mMediaSink->OnEnded(TrackInfo::kAudioTrack);
+
+ if (audioPromise) {
+ mMediaSinkAudioPromise.Begin(audioPromise->Then(
+ OwnerThread(), __func__, this,
+ &MediaDecoderStateMachine::OnMediaSinkAudioComplete,
+ &MediaDecoderStateMachine::OnMediaSinkAudioError));
+ }
+ if (videoPromise) {
+ mMediaSinkVideoPromise.Begin(videoPromise->Then(
+ OwnerThread(), __func__, this,
+ &MediaDecoderStateMachine::OnMediaSinkVideoComplete,
+ &MediaDecoderStateMachine::OnMediaSinkVideoError));
+ }
+ }
+}
+
+bool
+MediaDecoderStateMachine::HasLowDecodedAudio()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return IsAudioDecoding() &&
+ GetDecodedAudioDuration() < EXHAUSTED_DATA_MARGIN_USECS * mPlaybackRate;
+}
+
+bool
+MediaDecoderStateMachine::HasLowDecodedVideo()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return IsVideoDecoding() &&
+ VideoQueue().GetSize() < LOW_VIDEO_FRAMES * mPlaybackRate;
+}
+
+bool
+MediaDecoderStateMachine::HasLowDecodedData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mReader->UseBufferingHeuristics());
+ return HasLowDecodedAudio() || HasLowDecodedVideo();
+}
+
+bool MediaDecoderStateMachine::OutOfDecodedAudio()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return IsAudioDecoding() && !AudioQueue().IsFinished() &&
+ AudioQueue().GetSize() == 0 &&
+ !mMediaSink->HasUnplayedFrames(TrackInfo::kAudioTrack);
+}
+
+bool MediaDecoderStateMachine::HasLowBufferedData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return HasLowBufferedData(detail::LOW_DATA_THRESHOLD_USECS);
+}
+
+bool MediaDecoderStateMachine::HasLowBufferedData(int64_t aUsecs)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState >= DECODER_STATE_DECODING,
+ "Must have loaded first frame for mBuffered to be valid");
+
+ // If we don't have a duration, mBuffered is probably not going to have
+ // a useful buffered range. Return false here so that we don't get stuck in
+ // buffering mode for live streams.
+ if (Duration().IsInfinite()) {
+ return false;
+ }
+
+ if (mBuffered.Ref().IsInvalid()) {
+ return false;
+ }
+
+ // We are never low in decoded data when we don't have audio/video or have
+ // decoded all audio/video samples.
+ int64_t endOfDecodedVideoData =
+ (HasVideo() && !VideoQueue().IsFinished())
+ ? mDecodedVideoEndTime
+ : INT64_MAX;
+ int64_t endOfDecodedAudioData =
+ (HasAudio() && !AudioQueue().IsFinished())
+ ? mDecodedAudioEndTime
+ : INT64_MAX;
+
+ int64_t endOfDecodedData = std::min(endOfDecodedVideoData, endOfDecodedAudioData);
+ if (Duration().ToMicroseconds() < endOfDecodedData) {
+ // Our duration is not up to date. No point buffering.
+ return false;
+ }
+
+ if (endOfDecodedData == INT64_MAX) {
+ // Have decoded all samples. No point buffering.
+ return false;
+ }
+
+ int64_t start = endOfDecodedData;
+ int64_t end = std::min(GetMediaTime() + aUsecs, Duration().ToMicroseconds());
+ if (start >= end) {
+ // Duration of decoded samples is greater than our threshold.
+ return false;
+ }
+ media::TimeInterval interval(media::TimeUnit::FromMicroseconds(start),
+ media::TimeUnit::FromMicroseconds(end));
+ return !mBuffered.Ref().Contains(interval);
+}
+
+void
+MediaDecoderStateMachine::DecodeError(const MediaResult& aError)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(!IsShutdown());
+ DECODER_WARN("Decode error");
+ // Notify the decode error and MediaDecoder will shut down MDSM.
+ mOnPlaybackErrorEvent.Notify(aError);
+}
+
+void
+MediaDecoderStateMachine::EnqueueLoadedMetadataEvent()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MediaDecoderEventVisibility visibility =
+ mSentLoadedMetadataEvent ? MediaDecoderEventVisibility::Suppressed
+ : MediaDecoderEventVisibility::Observable;
+ mMetadataLoadedEvent.Notify(nsAutoPtr<MediaInfo>(new MediaInfo(Info())),
+ Move(mMetadataTags),
+ visibility);
+ mSentLoadedMetadataEvent = true;
+}
+
+void
+MediaDecoderStateMachine::EnqueueFirstFrameLoadedEvent()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ // Track value of mSentFirstFrameLoadedEvent from before updating it
+ bool firstFrameBeenLoaded = mSentFirstFrameLoadedEvent;
+ mSentFirstFrameLoadedEvent = true;
+ RefPtr<MediaDecoderStateMachine> self = this;
+ mBufferedUpdateRequest.Begin(
+ mReader->UpdateBufferedWithPromise()
+ ->Then(OwnerThread(),
+ __func__,
+ // Resolve
+ [self, firstFrameBeenLoaded]() {
+ self->mBufferedUpdateRequest.Complete();
+ MediaDecoderEventVisibility visibility =
+ firstFrameBeenLoaded ? MediaDecoderEventVisibility::Suppressed
+ : MediaDecoderEventVisibility::Observable;
+ self->mFirstFrameLoadedEvent.Notify(
+ nsAutoPtr<MediaInfo>(new MediaInfo(self->Info())), visibility);
+ },
+ // Reject
+ []() { MOZ_CRASH("Should not reach"); }));
+}
+
+void
+MediaDecoderStateMachine::FinishDecodeFirstFrame()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(!mSentFirstFrameLoadedEvent);
+ DECODER_LOG("FinishDecodeFirstFrame");
+
+ mMediaSink->Redraw(Info().mVideo);
+
+ // If we don't know the duration by this point, we assume infinity, per spec.
+ if (mDuration.Ref().isNothing()) {
+ mDuration = Some(TimeUnit::FromInfinity());
+ }
+
+ DECODER_LOG("Media duration %lld, "
+ "transportSeekable=%d, mediaSeekable=%d",
+ Duration().ToMicroseconds(), mResource->IsTransportSeekable(), mMediaSeekable);
+
+ // Get potentially updated metadata
+ mReader->ReadUpdatedMetadata(mInfo.ptr());
+
+ if (!mNotifyMetadataBeforeFirstFrame) {
+ // If we didn't have duration and/or start time before, we should now.
+ EnqueueLoadedMetadataEvent();
+ }
+
+ EnqueueFirstFrameLoadedEvent();
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::BeginShutdown()
+{
+ return InvokeAsync(OwnerThread(), this, __func__,
+ &MediaDecoderStateMachine::Shutdown);
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::FinishShutdown()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mState == DECODER_STATE_SHUTDOWN,
+ "How did we escape from the shutdown state?");
+ DECODER_LOG("Shutting down state machine task queue");
+ return OwnerThread()->BeginShutdown();
+}
+
+void
+MediaDecoderStateMachine::RunStateMachine()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ mDelayedScheduler.Reset(); // Must happen on state machine task queue.
+ mDispatchedStateMachine = false;
+ mStateObj->Step();
+}
+
+void
+MediaDecoderStateMachine::Reset(TrackSet aTracks)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ DECODER_LOG("MediaDecoderStateMachine::Reset");
+
+ // We should be resetting because we're seeking, shutting down, or entering
+ // dormant state. We could also be in the process of going dormant, and have
+ // just switched to exiting dormant before we finished entering dormant,
+ // hence the DECODING_NONE case below.
+ MOZ_ASSERT(IsShutdown() ||
+ mState == DECODER_STATE_SEEKING ||
+ mState == DECODER_STATE_DORMANT);
+
+ // Assert that aTracks specifies to reset the video track because we
+ // don't currently support resetting just the audio track.
+ MOZ_ASSERT(aTracks.contains(TrackInfo::kVideoTrack));
+
+ if (aTracks.contains(TrackInfo::kAudioTrack) &&
+ aTracks.contains(TrackInfo::kVideoTrack)) {
+ // Stop the audio thread. Otherwise, MediaSink might be accessing AudioQueue
+ // outside of the decoder monitor while we are clearing the queue and causes
+ // crash for no samples to be popped.
+ StopMediaSink();
+ }
+
+ if (aTracks.contains(TrackInfo::kVideoTrack)) {
+ mDecodedVideoEndTime = 0;
+ mVideoCompleted = false;
+ VideoQueue().Reset();
+ }
+
+ if (aTracks.contains(TrackInfo::kAudioTrack)) {
+ mDecodedAudioEndTime = 0;
+ mAudioCompleted = false;
+ AudioQueue().Reset();
+ }
+
+ mPlaybackOffset = 0;
+
+ mReader->ResetDecode(aTracks);
+}
+
+int64_t
+MediaDecoderStateMachine::GetClock(TimeStamp* aTimeStamp) const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ int64_t clockTime = mMediaSink->GetPosition(aTimeStamp);
+ NS_ASSERTION(GetMediaTime() <= clockTime, "Clock should go forwards.");
+ return clockTime;
+}
+
+void
+MediaDecoderStateMachine::UpdatePlaybackPositionPeriodically()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (!IsPlaying()) {
+ return;
+ }
+
+ // Cap the current time to the larger of the audio and video end time.
+ // This ensures that if we're running off the system clock, we don't
+ // advance the clock to after the media end time.
+ if (VideoEndTime() != -1 || AudioEndTime() != -1) {
+
+ const int64_t clockTime = GetClock();
+ // Skip frames up to the frame at the playback position, and figure out
+ // the time remaining until it's time to display the next frame and drop
+ // the current frame.
+ NS_ASSERTION(clockTime >= 0, "Should have positive clock time.");
+
+ // These will be non -1 if we've displayed a video frame, or played an audio frame.
+ int64_t t = std::min(clockTime, std::max(VideoEndTime(), AudioEndTime()));
+ // FIXME: Bug 1091422 - chained ogg files hit this assertion.
+ //MOZ_ASSERT(t >= GetMediaTime());
+ if (t > GetMediaTime()) {
+ UpdatePlaybackPosition(t);
+ }
+ }
+ // Note we have to update playback position before releasing the monitor.
+ // Otherwise, MediaDecoder::AddOutputStream could kick in when we are outside
+ // the monitor and get a staled value from GetCurrentTimeUs() which hits the
+ // assertion in GetClock().
+
+ int64_t delay = std::max<int64_t>(1, AUDIO_DURATION_USECS / mPlaybackRate);
+ ScheduleStateMachineIn(delay);
+}
+
+/* static */ const char*
+MediaDecoderStateMachine::ToStr(NextFrameStatus aStatus)
+{
+ switch (aStatus) {
+ case MediaDecoderOwner::NEXT_FRAME_AVAILABLE: return "NEXT_FRAME_AVAILABLE";
+ case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE: return "NEXT_FRAME_UNAVAILABLE";
+ case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING: return "NEXT_FRAME_UNAVAILABLE_BUFFERING";
+ case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING: return "NEXT_FRAME_UNAVAILABLE_SEEKING";
+ case MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED: return "NEXT_FRAME_UNINITIALIZED";
+ }
+ return "UNKNOWN";
+}
+
+void
+MediaDecoderStateMachine::UpdateNextFrameStatus(NextFrameStatus aStatus)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (aStatus != mNextFrameStatus) {
+ DECODER_LOG("Changed mNextFrameStatus to %s", ToStr(aStatus));
+ mNextFrameStatus = aStatus;
+ }
+}
+
+bool
+MediaDecoderStateMachine::CanPlayThrough()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return GetStatistics().CanPlayThrough();
+}
+
+MediaStatistics
+MediaDecoderStateMachine::GetStatistics()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MediaStatistics result;
+ result.mDownloadRate = mResource->GetDownloadRate(&result.mDownloadRateReliable);
+ result.mDownloadPosition = mResource->GetCachedDataEnd(mDecoderPosition);
+ result.mTotalBytes = mResource->GetLength();
+ result.mPlaybackRate = mPlaybackBytesPerSecond;
+ result.mPlaybackRateReliable = mPlaybackRateReliable;
+ result.mDecoderPosition = mDecoderPosition;
+ result.mPlaybackPosition = mPlaybackOffset;
+ return result;
+}
+
+void
+MediaDecoderStateMachine::ScheduleStateMachine()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mDispatchedStateMachine) {
+ return;
+ }
+ mDispatchedStateMachine = true;
+
+ OwnerThread()->Dispatch(NewRunnableMethod(this, &MediaDecoderStateMachine::RunStateMachine));
+}
+
+void
+MediaDecoderStateMachine::ScheduleStateMachineIn(int64_t aMicroseconds)
+{
+ MOZ_ASSERT(OnTaskQueue()); // mDelayedScheduler.Ensure() may Disconnect()
+ // the promise, which must happen on the state
+ // machine task queue.
+ MOZ_ASSERT(aMicroseconds > 0);
+ if (mDispatchedStateMachine) {
+ return;
+ }
+
+ TimeStamp now = TimeStamp::Now();
+ TimeStamp target = now + TimeDuration::FromMicroseconds(aMicroseconds);
+
+ // It is OK to capture 'this' without causing UAF because the callback
+ // always happens before shutdown.
+ RefPtr<MediaDecoderStateMachine> self = this;
+ mDelayedScheduler.Ensure(target, [self] () {
+ self->mDelayedScheduler.CompleteRequest();
+ self->RunStateMachine();
+ }, [] () {
+ MOZ_DIAGNOSTIC_ASSERT(false);
+ });
+}
+
+bool MediaDecoderStateMachine::OnTaskQueue() const
+{
+ return OwnerThread()->IsCurrentThreadIn();
+}
+
+bool MediaDecoderStateMachine::IsStateMachineScheduled() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return mDispatchedStateMachine || mDelayedScheduler.IsScheduled();
+}
+
+void
+MediaDecoderStateMachine::SetPlaybackRate(double aPlaybackRate)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(aPlaybackRate != 0, "Should be handled by MediaDecoder::Pause()");
+
+ mPlaybackRate = aPlaybackRate;
+ mMediaSink->SetPlaybackRate(mPlaybackRate);
+
+ // Schedule next cycle to check if we can stop prerolling.
+ ScheduleStateMachine();
+}
+
+void MediaDecoderStateMachine::PreservesPitchChanged()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mMediaSink->SetPreservesPitch(mPreservesPitch);
+}
+
+bool
+MediaDecoderStateMachine::IsShutdown() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return mIsShutdown;
+}
+
+int64_t
+MediaDecoderStateMachine::AudioEndTime() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mMediaSink->IsStarted()) {
+ return mMediaSink->GetEndTime(TrackInfo::kAudioTrack);
+ }
+ MOZ_ASSERT(!HasAudio());
+ return -1;
+}
+
+int64_t
+MediaDecoderStateMachine::VideoEndTime() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mMediaSink->IsStarted()) {
+ return mMediaSink->GetEndTime(TrackInfo::kVideoTrack);
+ }
+ return -1;
+}
+
+void
+MediaDecoderStateMachine::OnMediaSinkVideoComplete()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(HasVideo());
+ VERBOSE_LOG("[%s]", __func__);
+
+ mMediaSinkVideoPromise.Complete();
+ mVideoCompleted = true;
+ ScheduleStateMachine();
+}
+
+void
+MediaDecoderStateMachine::OnMediaSinkVideoError()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(HasVideo());
+ VERBOSE_LOG("[%s]", __func__);
+
+ mMediaSinkVideoPromise.Complete();
+ mVideoCompleted = true;
+ if (HasAudio()) {
+ return;
+ }
+ DecodeError(MediaResult(NS_ERROR_DOM_MEDIA_MEDIASINK_ERR, __func__));
+}
+
+void MediaDecoderStateMachine::OnMediaSinkAudioComplete()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(HasAudio());
+ VERBOSE_LOG("[%s]", __func__);
+
+ mMediaSinkAudioPromise.Complete();
+ mAudioCompleted = true;
+ // To notify PlaybackEnded as soon as possible.
+ ScheduleStateMachine();
+
+ // Report OK to Decoder Doctor (to know if issue may have been resolved).
+ mOnDecoderDoctorEvent.Notify(
+ DecoderDoctorEvent{DecoderDoctorEvent::eAudioSinkStartup, NS_OK});
+}
+
+void MediaDecoderStateMachine::OnMediaSinkAudioError(nsresult aResult)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(HasAudio());
+ VERBOSE_LOG("[%s]", __func__);
+
+ mMediaSinkAudioPromise.Complete();
+ mAudioCompleted = true;
+
+ // Result should never be NS_OK in this *error* handler. Report to Dec-Doc.
+ MOZ_ASSERT(NS_FAILED(aResult));
+ mOnDecoderDoctorEvent.Notify(
+ DecoderDoctorEvent{DecoderDoctorEvent::eAudioSinkStartup, aResult});
+
+ // Make the best effort to continue playback when there is video.
+ if (HasVideo()) {
+ return;
+ }
+
+ // Otherwise notify media decoder/element about this error for it makes
+ // no sense to play an audio-only file without sound output.
+ DecodeError(MediaResult(NS_ERROR_DOM_MEDIA_MEDIASINK_ERR, __func__));
+}
+
+void
+MediaDecoderStateMachine::OnCDMProxyReady(RefPtr<CDMProxy> aProxy)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mCDMProxyPromise.Complete();
+ mCDMProxy = aProxy;
+ mReader->SetCDMProxy(aProxy);
+ mStateObj->HandleCDMProxyReady();
+}
+
+void
+MediaDecoderStateMachine::OnCDMProxyNotReady()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mCDMProxyPromise.Complete();
+}
+
+void
+MediaDecoderStateMachine::SetAudioCaptured(bool aCaptured)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (aCaptured == mAudioCaptured) {
+ return;
+ }
+
+ // Rest these flags so they are consistent with the status of the sink.
+ // TODO: Move these flags into MediaSink to improve cohesion so we don't need
+ // to reset these flags when switching MediaSinks.
+ mAudioCompleted = false;
+ mVideoCompleted = false;
+
+ // Backup current playback parameters.
+ MediaSink::PlaybackParams params = mMediaSink->GetPlaybackParams();
+
+ // Stop and shut down the existing sink.
+ StopMediaSink();
+ mMediaSink->Shutdown();
+
+ // Create a new sink according to whether audio is captured.
+ mMediaSink = CreateMediaSink(aCaptured);
+
+ // Restore playback parameters.
+ mMediaSink->SetPlaybackParams(params);
+
+ mAudioCaptured = aCaptured;
+
+ // Don't buffer as much when audio is captured because we don't need to worry
+ // about high latency audio devices.
+ mAmpleAudioThresholdUsecs = mAudioCaptured ?
+ detail::AMPLE_AUDIO_USECS / 2 :
+ detail::AMPLE_AUDIO_USECS;
+
+ mStateObj->HandleAudioCaptured();
+}
+
+uint32_t MediaDecoderStateMachine::GetAmpleVideoFrames() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return (mReader->IsAsync() && mReader->VideoIsHardwareAccelerated())
+ ? std::max<uint32_t>(sVideoQueueHWAccelSize, MIN_VIDEO_QUEUE_SIZE)
+ : std::max<uint32_t>(sVideoQueueDefaultSize, MIN_VIDEO_QUEUE_SIZE);
+}
+
+void
+MediaDecoderStateMachine::DumpDebugInfo()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // It is fine to capture a raw pointer here because MediaDecoder only call
+ // this function before shutdown begins.
+ RefPtr<MediaDecoderStateMachine> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([this, self] () {
+ mMediaSink->DumpDebugInfo();
+ mStateObj->DumpDebugInfo();
+ DUMP_LOG(
+ "GetMediaTime=%lld GetClock=%lld mMediaSink=%p "
+ "mState=%s mPlayState=%d mSentFirstFrameLoadedEvent=%d IsPlaying=%d "
+ "mAudioStatus=%s mVideoStatus=%s mDecodedAudioEndTime=%lld mDecodedVideoEndTime=%lld "
+ "mAudioCompleted=%d mVideoCompleted=%d",
+ GetMediaTime(), mMediaSink->IsStarted() ? GetClock() : -1, mMediaSink.get(),
+ ToStateStr(), mPlayState.Ref(), mSentFirstFrameLoadedEvent, IsPlaying(),
+ AudioRequestStatus(), VideoRequestStatus(), mDecodedAudioEndTime, mDecodedVideoEndTime,
+ mAudioCompleted, mVideoCompleted);
+ });
+
+ // Since the task is run asynchronously, it is possible other tasks get first
+ // and change the object states before we print them. Therefore we want to
+ // dispatch this task immediately without waiting for the tail dispatching
+ // phase so object states are less likely to change before being printed.
+ OwnerThread()->Dispatch(r.forget(),
+ AbstractThread::AssertDispatchSuccess, AbstractThread::TailDispatch);
+}
+
+void MediaDecoderStateMachine::AddOutputStream(ProcessedMediaStream* aStream,
+ bool aFinishWhenEnded)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DECODER_LOG("AddOutputStream aStream=%p!", aStream);
+ mOutputStreamManager->Add(aStream, aFinishWhenEnded);
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod<bool>(
+ this, &MediaDecoderStateMachine::SetAudioCaptured, true);
+ OwnerThread()->Dispatch(r.forget());
+}
+
+void MediaDecoderStateMachine::RemoveOutputStream(MediaStream* aStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DECODER_LOG("RemoveOutputStream=%p!", aStream);
+ mOutputStreamManager->Remove(aStream);
+ if (mOutputStreamManager->IsEmpty()) {
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod<bool>(
+ this, &MediaDecoderStateMachine::SetAudioCaptured, false);
+ OwnerThread()->Dispatch(r.forget());
+ }
+}
+
+size_t
+MediaDecoderStateMachine::SizeOfVideoQueue() const
+{
+ return mReader->SizeOfVideoQueueInBytes();
+}
+
+size_t
+MediaDecoderStateMachine::SizeOfAudioQueue() const
+{
+ return mReader->SizeOfAudioQueueInBytes();
+}
+
+AbstractCanonical<media::TimeIntervals>*
+MediaDecoderStateMachine::CanonicalBuffered() const
+{
+ return mReader->CanonicalBuffered();
+}
+
+MediaEventSource<void>&
+MediaDecoderStateMachine::OnMediaNotSeekable() const
+{
+ return mReader->OnMediaNotSeekable();
+}
+
+const char*
+MediaDecoderStateMachine::AudioRequestStatus() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mReader->IsRequestingAudioData()) {
+ MOZ_DIAGNOSTIC_ASSERT(!mReader->IsWaitingAudioData());
+ return "pending";
+ } else if (mReader->IsWaitingAudioData()) {
+ return "waiting";
+ }
+ return "idle";
+}
+
+const char*
+MediaDecoderStateMachine::VideoRequestStatus() const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mReader->IsRequestingVideoData()) {
+ MOZ_DIAGNOSTIC_ASSERT(!mReader->IsWaitingVideoData());
+ return "pending";
+ } else if (mReader->IsWaitingVideoData()) {
+ return "waiting";
+ }
+ return "idle";
+}
+
+void
+MediaDecoderStateMachine::OnSuspendTimerResolved()
+{
+ DECODER_LOG("OnSuspendTimerResolved");
+ mVideoDecodeSuspendTimer.CompleteRequest();
+ mStateObj->HandleVideoSuspendTimeout();
+}
+
+void
+MediaDecoderStateMachine::OnSuspendTimerRejected()
+{
+ DECODER_LOG("OnSuspendTimerRejected");
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(!mVideoDecodeSuspended);
+ mVideoDecodeSuspendTimer.CompleteRequest();
+}
+
+} // namespace mozilla
+
+#undef NS_DispatchToMainThread
diff --git a/dom/media/MediaDecoderStateMachine.h b/dom/media/MediaDecoderStateMachine.h
new file mode 100644
index 000000000..a61fe13d2
--- /dev/null
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -0,0 +1,860 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+/*
+
+Each media element for a media file has one thread called the "audio thread".
+
+The audio thread writes the decoded audio data to the audio
+hardware. This is done in a separate thread to ensure that the
+audio hardware gets a constant stream of data without
+interruption due to decoding or display. At some point
+AudioStream will be refactored to have a callback interface
+where it asks for data and this thread will no longer be
+needed.
+
+The element/state machine also has a TaskQueue which runs in a
+SharedThreadPool that is shared with all other elements/decoders. The state
+machine dispatches tasks to this to call into the MediaDecoderReader to
+request decoded audio or video data. The Reader will callback with decoded
+sampled when it has them available, and the state machine places the decoded
+samples into its queues for the consuming threads to pull from.
+
+The MediaDecoderReader can choose to decode asynchronously, or synchronously
+and return requested samples synchronously inside it's Request*Data()
+functions via callback. Asynchronous decoding is preferred, and should be
+used for any new readers.
+
+Synchronisation of state between the thread is done via a monitor owned
+by MediaDecoder.
+
+The lifetime of the audio thread is controlled by the state machine when
+it runs on the shared state machine thread. When playback needs to occur
+the audio thread is created and an event dispatched to run it. The audio
+thread exits when audio playback is completed or no longer required.
+
+A/V synchronisation is handled by the state machine. It examines the audio
+playback time and compares this to the next frame in the queue of video
+frames. If it is time to play the video frame it is then displayed, otherwise
+it schedules the state machine to run again at the time of the next frame.
+
+Frame skipping is done in the following ways:
+
+ 1) The state machine will skip all frames in the video queue whose
+ display time is less than the current audio time. This ensures
+ the correct frame for the current time is always displayed.
+
+ 2) The decode tasks will stop decoding interframes and read to the
+ next keyframe if it determines that decoding the remaining
+ interframes will cause playback issues. It detects this by:
+ a) If the amount of audio data in the audio queue drops
+ below a threshold whereby audio may start to skip.
+ b) If the video queue drops below a threshold where it
+ will be decoding video data that won't be displayed due
+ to the decode thread dropping the frame immediately.
+ TODO: In future we should only do this when the Reader is decoding
+ synchronously.
+
+When hardware accelerated graphics is not available, YCbCr conversion
+is done on the decode task queue when video frames are decoded.
+
+The decode task queue pushes decoded audio and videos frames into two
+separate queues - one for audio and one for video. These are kept
+separate to make it easy to constantly feed audio data to the audio
+hardware while allowing frame skipping of video data. These queues are
+threadsafe, and neither the decode, audio, or state machine should
+be able to monopolize them, and cause starvation of the other threads.
+
+Both queues are bounded by a maximum size. When this size is reached
+the decode tasks will no longer request video or audio depending on the
+queue that has reached the threshold. If both queues are full, no more
+decode tasks will be dispatched to the decode task queue, so other
+decoders will have an opportunity to run.
+
+During playback the audio thread will be idle (via a Wait() on the
+monitor) if the audio queue is empty. Otherwise it constantly pops
+audio data off the queue and plays it with a blocking write to the audio
+hardware (via AudioStream).
+
+*/
+#if !defined(MediaDecoderStateMachine_h__)
+#define MediaDecoderStateMachine_h__
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/StateMirroring.h"
+
+#include "nsAutoPtr.h"
+#include "nsThreadUtils.h"
+#include "MediaDecoder.h"
+#include "MediaDecoderReader.h"
+#include "MediaDecoderOwner.h"
+#include "MediaEventSource.h"
+#include "MediaMetadataManager.h"
+#include "MediaStatistics.h"
+#include "MediaTimer.h"
+#include "ImageContainer.h"
+#include "SeekJob.h"
+#include "SeekTask.h"
+#include "MediaDecoderReaderWrapper.h"
+
+namespace mozilla {
+
+namespace media {
+class MediaSink;
+}
+
+class AudioSegment;
+class DecodedStream;
+class MediaDecoderReaderWrapper;
+class OutputStreamManager;
+class TaskQueue;
+
+extern LazyLogModule gMediaDecoderLog;
+extern LazyLogModule gMediaSampleLog;
+
+enum class MediaEventType : int8_t {
+ PlaybackStarted,
+ PlaybackStopped,
+ PlaybackEnded,
+ SeekStarted,
+ Invalidate,
+ EnterVideoSuspend,
+ ExitVideoSuspend
+};
+
+/*
+ The state machine class. This manages the decoding and seeking in the
+ MediaDecoderReader on the decode task queue, and A/V sync on the shared
+ state machine thread, and controls the audio "push" thread.
+
+ All internal state is synchronised via the decoder monitor. State changes
+ are propagated by scheduling the state machine to run another cycle on the
+ shared state machine thread.
+
+ See MediaDecoder.h for more details.
+*/
+class MediaDecoderStateMachine
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderStateMachine)
+
+ using TrackSet = MediaDecoderReader::TrackSet;
+
+public:
+ typedef MediaDecoderOwner::NextFrameStatus NextFrameStatus;
+ typedef mozilla::layers::ImageContainer::FrameID FrameID;
+ MediaDecoderStateMachine(MediaDecoder* aDecoder,
+ MediaDecoderReader* aReader);
+
+ nsresult Init(MediaDecoder* aDecoder);
+
+ void SetMediaDecoderReaderWrapperCallback();
+ void CancelMediaDecoderReaderWrapperCallback();
+
+ // Enumeration for the valid decoding states
+ enum State {
+ DECODER_STATE_DECODING_METADATA,
+ DECODER_STATE_WAIT_FOR_CDM,
+ DECODER_STATE_DORMANT,
+ DECODER_STATE_DECODING_FIRSTFRAME,
+ DECODER_STATE_DECODING,
+ DECODER_STATE_SEEKING,
+ DECODER_STATE_BUFFERING,
+ DECODER_STATE_COMPLETED,
+ DECODER_STATE_SHUTDOWN
+ };
+
+ void DumpDebugInfo();
+
+ void AddOutputStream(ProcessedMediaStream* aStream, bool aFinishWhenEnded);
+ // Remove an output stream added with AddOutputStream.
+ void RemoveOutputStream(MediaStream* aStream);
+
+ // Seeks to the decoder to aTarget asynchronously.
+ RefPtr<MediaDecoder::SeekPromise> InvokeSeek(SeekTarget aTarget);
+
+ void DispatchSetPlaybackRate(double aPlaybackRate)
+ {
+ OwnerThread()->DispatchStateChange(NewRunnableMethod<double>(
+ this, &MediaDecoderStateMachine::SetPlaybackRate, aPlaybackRate));
+ }
+
+ RefPtr<ShutdownPromise> BeginShutdown();
+
+ // Notifies the state machine that should minimize the number of samples
+ // decoded we preroll, until playback starts. The first time playback starts
+ // the state machine is free to return to prerolling normally. Note
+ // "prerolling" in this context refers to when we decode and buffer decoded
+ // samples in advance of when they're needed for playback.
+ void DispatchMinimizePrerollUntilPlaybackStarts()
+ {
+ RefPtr<MediaDecoderStateMachine> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self] () -> void
+ {
+ MOZ_ASSERT(self->OnTaskQueue());
+ self->mMinimizePreroll = true;
+
+ // Make sure that this arrives before playback starts, otherwise this won't
+ // have the intended effect.
+ MOZ_DIAGNOSTIC_ASSERT(self->mPlayState == MediaDecoder::PLAY_STATE_LOADING);
+ });
+ OwnerThread()->Dispatch(r.forget());
+ }
+
+ // Set the media fragment end time. aEndTime is in microseconds.
+ void DispatchSetFragmentEndTime(int64_t aEndTime)
+ {
+ RefPtr<MediaDecoderStateMachine> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self, aEndTime] () {
+ self->mFragmentEndTime = aEndTime;
+ });
+ OwnerThread()->Dispatch(r.forget());
+ }
+
+ void DispatchAudioOffloading(bool aAudioOffloading)
+ {
+ RefPtr<MediaDecoderStateMachine> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ if (self->mAudioOffloading != aAudioOffloading) {
+ self->mAudioOffloading = aAudioOffloading;
+ self->ScheduleStateMachine();
+ }
+ });
+ OwnerThread()->Dispatch(r.forget());
+ }
+
+ // Drop reference to mResource. Only called during shutdown dance.
+ void BreakCycles() {
+ MOZ_ASSERT(NS_IsMainThread());
+ mResource = nullptr;
+ }
+
+ TimedMetadataEventSource& TimedMetadataEvent() {
+ return mMetadataManager.TimedMetadataEvent();
+ }
+
+ MediaEventSource<void>& OnMediaNotSeekable() const;
+
+ MediaEventSourceExc<nsAutoPtr<MediaInfo>,
+ nsAutoPtr<MetadataTags>,
+ MediaDecoderEventVisibility>&
+ MetadataLoadedEvent() { return mMetadataLoadedEvent; }
+
+ MediaEventSourceExc<nsAutoPtr<MediaInfo>,
+ MediaDecoderEventVisibility>&
+ FirstFrameLoadedEvent() { return mFirstFrameLoadedEvent; }
+
+ MediaEventSource<MediaEventType>&
+ OnPlaybackEvent() { return mOnPlaybackEvent; }
+ MediaEventSource<MediaResult>&
+ OnPlaybackErrorEvent() { return mOnPlaybackErrorEvent; }
+
+ MediaEventSource<DecoderDoctorEvent>&
+ OnDecoderDoctorEvent() { return mOnDecoderDoctorEvent; }
+
+ size_t SizeOfVideoQueue() const;
+
+ size_t SizeOfAudioQueue() const;
+
+private:
+ class StateObject;
+ class DecodeMetadataState;
+ class WaitForCDMState;
+ class DormantState;
+ class DecodingFirstFrameState;
+ class DecodingState;
+ class SeekingState;
+ class BufferingState;
+ class CompletedState;
+ class ShutdownState;
+
+ static const char* ToStateStr(State aState);
+ static const char* ToStr(NextFrameStatus aStatus);
+ const char* ToStateStr();
+
+ // Functions used by assertions to ensure we're calling things
+ // on the appropriate threads.
+ bool OnTaskQueue() const;
+
+ // Initialization that needs to happen on the task queue. This is the first
+ // task that gets run on the task queue, and is dispatched from the MDSM
+ // constructor immediately after the task queue is created.
+ void InitializationTask(MediaDecoder* aDecoder);
+
+ void SetAudioCaptured(bool aCaptured);
+
+ RefPtr<MediaDecoder::SeekPromise> Seek(SeekTarget aTarget);
+
+ RefPtr<ShutdownPromise> Shutdown();
+
+ RefPtr<ShutdownPromise> FinishShutdown();
+
+ // Update the playback position. This can result in a timeupdate event
+ // and an invalidate of the frame being dispatched asynchronously if
+ // there is no such event currently queued.
+ // Only called on the decoder thread. Must be called with
+ // the decode monitor held.
+ void UpdatePlaybackPosition(int64_t aTime);
+
+ bool CanPlayThrough();
+
+ MediaStatistics GetStatistics();
+
+ bool HasAudio() const { return mInfo.ref().HasAudio(); }
+ bool HasVideo() const { return mInfo.ref().HasVideo(); }
+ const MediaInfo& Info() const { return mInfo.ref(); }
+
+ // Returns the state machine task queue.
+ TaskQueue* OwnerThread() const { return mTaskQueue; }
+
+ // Schedules the shared state machine thread to run the state machine.
+ void ScheduleStateMachine();
+
+ // Invokes ScheduleStateMachine to run in |aMicroseconds| microseconds,
+ // unless it's already scheduled to run earlier, in which case the
+ // request is discarded.
+ void ScheduleStateMachineIn(int64_t aMicroseconds);
+
+ bool HaveEnoughDecodedAudio();
+ bool HaveEnoughDecodedVideo();
+
+ // True if shutdown process has begun.
+ bool IsShutdown() const;
+
+ // Returns true if we're currently playing. The decoder monitor must
+ // be held.
+ bool IsPlaying() const;
+
+ // TODO: Those callback function may receive demuxed-only data.
+ // Need to figure out a suitable API name for this case.
+ void OnAudioDecoded(MediaData* aAudio);
+ void OnVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStartTime);
+ void OnNotDecoded(MediaData::Type aType, const MediaResult& aError);
+
+ // Resets all state related to decoding and playback, emptying all buffers
+ // and aborting all pending operations on the decode task queue.
+ void Reset(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
+ TrackInfo::kVideoTrack));
+ // Sets mMediaSeekable to false.
+ void SetMediaNotSeekable();
+
+ void OnAudioCallback(AudioCallbackData aData);
+ void OnVideoCallback(VideoCallbackData aData);
+ void OnAudioWaitCallback(WaitCallbackData aData);
+ void OnVideoWaitCallback(WaitCallbackData aData);
+
+protected:
+ virtual ~MediaDecoderStateMachine();
+
+ void BufferedRangeUpdated();
+
+ void ReaderSuspendedChanged();
+
+ // Inserts MediaData* samples into their respective MediaQueues.
+ // aSample must not be null.
+
+ void Push(MediaData* aSample, MediaData::Type aSampleType);
+
+ void OnAudioPopped(const RefPtr<MediaData>& aSample);
+ void OnVideoPopped(const RefPtr<MediaData>& aSample);
+
+ void AudioAudibleChanged(bool aAudible);
+
+ void VolumeChanged();
+ void SetPlaybackRate(double aPlaybackRate);
+ void PreservesPitchChanged();
+
+ MediaQueue<MediaData>& AudioQueue() { return mAudioQueue; }
+ MediaQueue<MediaData>& VideoQueue() { return mVideoQueue; }
+
+ // True if our buffers of decoded audio are not full, and we should
+ // decode more.
+ bool NeedToDecodeAudio();
+
+ // True if our buffers of decoded video are not full, and we should
+ // decode more.
+ bool NeedToDecodeVideo();
+
+ // True if we are low in decoded audio/video data.
+ // May not be invoked when mReader->UseBufferingHeuristics() is false.
+ bool HasLowDecodedData();
+
+ bool HasLowDecodedAudio();
+
+ bool HasLowDecodedVideo();
+
+ bool OutOfDecodedAudio();
+
+ bool OutOfDecodedVideo()
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ return IsVideoDecoding() && VideoQueue().GetSize() <= 1;
+ }
+
+
+ // Returns true if we're running low on buffered data.
+ bool HasLowBufferedData();
+
+ // Returns true if we have less than aUsecs of buffered data available.
+ bool HasLowBufferedData(int64_t aUsecs);
+
+ void UpdateNextFrameStatus(NextFrameStatus aStatus);
+
+ // Return the current time, either the audio clock if available (if the media
+ // has audio, and the playback is possible), or a clock for the video.
+ // Called on the state machine thread.
+ // If aTimeStamp is non-null, set *aTimeStamp to the TimeStamp corresponding
+ // to the returned stream time.
+ int64_t GetClock(TimeStamp* aTimeStamp = nullptr) const;
+
+ void SetStartTime(int64_t aStartTimeUsecs);
+
+ // Update only the state machine's current playback position (and duration,
+ // if unknown). Does not update the playback position on the decoder or
+ // media element -- use UpdatePlaybackPosition for that. Called on the state
+ // machine thread, caller must hold the decoder lock.
+ void UpdatePlaybackPositionInternal(int64_t aTime);
+
+ // Update playback position and trigger next update by default time period.
+ // Called on the state machine thread.
+ void UpdatePlaybackPositionPeriodically();
+
+ media::MediaSink* CreateAudioSink();
+
+ // Always create mediasink which contains an AudioSink or StreamSink inside.
+ already_AddRefed<media::MediaSink> CreateMediaSink(bool aAudioCaptured);
+
+ // Stops the media sink and shut it down.
+ // The decoder monitor must be held with exactly one lock count.
+ // Called on the state machine thread.
+ void StopMediaSink();
+
+ // Create and start the media sink.
+ // The decoder monitor must be held with exactly one lock count.
+ // Called on the state machine thread.
+ void StartMediaSink();
+
+ // Notification method invoked when mPlayState changes.
+ void PlayStateChanged();
+
+ // Notification method invoked when mIsVisible changes.
+ void VisibilityChanged();
+
+ // Sets internal state which causes playback of media to pause.
+ // The decoder monitor must be held.
+ void StopPlayback();
+
+ // If the conditions are right, sets internal state which causes playback
+ // of media to begin or resume.
+ // Must be called with the decode monitor held.
+ void MaybeStartPlayback();
+
+ // Moves the decoder into the shutdown state, and dispatches an error
+ // event to the media element. This begins shutting down the decoder.
+ // The decoder monitor must be held. This is only called on the
+ // decode thread.
+ void DecodeError(const MediaResult& aError);
+
+ // Dispatches a LoadedMetadataEvent.
+ // This is threadsafe and can be called on any thread.
+ // The decoder monitor must be held.
+ void EnqueueLoadedMetadataEvent();
+
+ void EnqueueFirstFrameLoadedEvent();
+
+ void DispatchAudioDecodeTaskIfNeeded();
+ void DispatchVideoDecodeTaskIfNeeded();
+
+ // Dispatch a task to decode audio if there is not.
+ void EnsureAudioDecodeTaskQueued();
+
+ // Dispatch a task to decode video if there is not.
+ void EnsureVideoDecodeTaskQueued();
+
+ // Start a task to decode audio.
+ // The decoder monitor must be held.
+ void RequestAudioData();
+
+ // Start a task to decode video.
+ // The decoder monitor must be held.
+ void RequestVideoData();
+
+ // Re-evaluates the state and determines whether we need to dispatch
+ // events to run the decode, or if not whether we should set the reader
+ // to idle mode. This is threadsafe, and can be called from any thread.
+ // The decoder monitor must be held.
+ void DispatchDecodeTasksIfNeeded();
+
+ // Returns the "media time". This is the absolute time which the media
+ // playback has reached. i.e. this returns values in the range
+ // [mStartTime, mEndTime], and mStartTime will not be 0 if the media does
+ // not start at 0. Note this is different than the "current playback position",
+ // which is in the range [0,duration].
+ int64_t GetMediaTime() const {
+ MOZ_ASSERT(OnTaskQueue());
+ return mCurrentPosition;
+ }
+
+ // Returns an upper bound on the number of microseconds of audio that is
+ // decoded and playable. This is the sum of the number of usecs of audio which
+ // is decoded and in the reader's audio queue, and the usecs of unplayed audio
+ // which has been pushed to the audio hardware for playback. Note that after
+ // calling this, the audio hardware may play some of the audio pushed to
+ // hardware, so this can only be used as a upper bound. The decoder monitor
+ // must be held when calling this. Called on the decode thread.
+ int64_t GetDecodedAudioDuration();
+
+ void FinishDecodeFirstFrame();
+
+ // Queries our state to see whether the decode has finished for all streams.
+ bool CheckIfDecodeComplete();
+
+ // Performs one "cycle" of the state machine.
+ void RunStateMachine();
+
+ bool IsStateMachineScheduled() const;
+
+ // These return true if the respective stream's decode has not yet reached
+ // the end of stream.
+ bool IsAudioDecoding();
+ bool IsVideoDecoding();
+
+private:
+ // Resolved by the MediaSink to signal that all audio/video outstanding
+ // work is complete and identify which part(a/v) of the sink is shutting down.
+ void OnMediaSinkAudioComplete();
+ void OnMediaSinkVideoComplete();
+
+ // Rejected by the MediaSink to signal errors for audio/video.
+ void OnMediaSinkAudioError(nsresult aResult);
+ void OnMediaSinkVideoError();
+
+ // Return true if the video decoder's decode speed can not catch up the
+ // play time.
+ bool NeedToSkipToNextKeyframe();
+
+ void* const mDecoderID;
+ const RefPtr<FrameStatistics> mFrameStats;
+ const RefPtr<VideoFrameContainer> mVideoFrameContainer;
+ const dom::AudioChannel mAudioChannel;
+
+ // Task queue for running the state machine.
+ RefPtr<TaskQueue> mTaskQueue;
+
+ // State-watching manager.
+ WatchManager<MediaDecoderStateMachine> mWatchManager;
+
+ // True if we've dispatched a task to run the state machine but the task has
+ // yet to run.
+ bool mDispatchedStateMachine;
+
+ // Used to dispatch another round schedule with specific target time.
+ DelayedScheduler mDelayedScheduler;
+
+ // Queue of audio frames. This queue is threadsafe, and is accessed from
+ // the audio, decoder, state machine, and main threads.
+ MediaQueue<MediaData> mAudioQueue;
+ // Queue of video frames. This queue is threadsafe, and is accessed from
+ // the decoder, state machine, and main threads.
+ MediaQueue<MediaData> mVideoQueue;
+
+ State mState = DECODER_STATE_DECODING_METADATA;
+
+ UniquePtr<StateObject> mStateObj;
+
+ media::TimeUnit Duration() const { MOZ_ASSERT(OnTaskQueue()); return mDuration.Ref().ref(); }
+
+ // Recomputes the canonical duration from various sources.
+ void RecomputeDuration();
+
+
+ // FrameID which increments every time a frame is pushed to our queue.
+ FrameID mCurrentFrameID;
+
+ // The highest timestamp that our position has reached. Monotonically
+ // increasing.
+ Watchable<media::TimeUnit> mObservedDuration;
+
+ // Returns true if we're logically playing, that is, if the Play() has
+ // been called and Pause() has not or we have not yet reached the end
+ // of media. This is irrespective of the seeking state; if the owner
+ // calls Play() and then Seek(), we still count as logically playing.
+ // The decoder monitor must be held.
+ bool IsLogicallyPlaying()
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ return mPlayState == MediaDecoder::PLAY_STATE_PLAYING ||
+ mNextPlayState == MediaDecoder::PLAY_STATE_PLAYING;
+ }
+
+ // Media Fragment end time in microseconds. Access controlled by decoder monitor.
+ int64_t mFragmentEndTime;
+
+ // The media sink resource. Used on the state machine thread.
+ RefPtr<media::MediaSink> mMediaSink;
+
+ const RefPtr<MediaDecoderReaderWrapper> mReader;
+
+ // The end time of the last audio frame that's been pushed onto the media sink
+ // in microseconds. This will approximately be the end time
+ // of the audio stream, unless another frame is pushed to the hardware.
+ int64_t AudioEndTime() const;
+
+ // The end time of the last rendered video frame that's been sent to
+ // compositor.
+ int64_t VideoEndTime() const;
+
+ // The end time of the last decoded audio frame. This signifies the end of
+ // decoded audio data. Used to check if we are low in decoded data.
+ int64_t mDecodedAudioEndTime;
+
+ // The end time of the last decoded video frame. Used to check if we are low
+ // on decoded video data.
+ int64_t mDecodedVideoEndTime;
+
+ // Playback rate. 1.0 : normal speed, 0.5 : two times slower.
+ double mPlaybackRate;
+
+ // If we've got more than this number of decoded video frames waiting in
+ // the video queue, we will not decode any more video frames until some have
+ // been consumed by the play state machine thread.
+ // Must hold monitor.
+ uint32_t GetAmpleVideoFrames() const;
+
+ // Low audio threshold. If we've decoded less than this much audio we
+ // consider our audio decode "behind", and we may skip video decoding
+ // in order to allow our audio decoding to catch up. We favour audio
+ // decoding over video. We increase this threshold if we're slow to
+ // decode video frames, in order to reduce the chance of audio underruns.
+ // Note that we don't ever reset this threshold, it only ever grows as
+ // we detect that the decode can't keep up with rendering.
+ int64_t mLowAudioThresholdUsecs;
+
+ // Our "ample" audio threshold. Once we've this much audio decoded, we
+ // pause decoding. If we increase mLowAudioThresholdUsecs, we'll also
+ // increase this too appropriately (we don't want mLowAudioThresholdUsecs
+ // to be greater than ampleAudioThreshold, else we'd stop decoding!).
+ // Note that we don't ever reset this threshold, it only ever grows as
+ // we detect that the decode can't keep up with rendering.
+ int64_t mAmpleAudioThresholdUsecs;
+
+ // At the start of decoding we want to "preroll" the decode until we've
+ // got a few frames decoded before we consider whether decode is falling
+ // behind. Otherwise our "we're falling behind" logic will trigger
+ // unnecessarily if we start playing as soon as the first sample is
+ // decoded. These two fields store how many video frames and audio
+ // samples we must consume before are considered to be finished prerolling.
+ uint32_t AudioPrerollUsecs() const
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ return mAmpleAudioThresholdUsecs / 2;
+ }
+
+ uint32_t VideoPrerollFrames() const
+ {
+ MOZ_ASSERT(OnTaskQueue());
+ return GetAmpleVideoFrames() / 2;
+ }
+
+ // Only one of a given pair of ({Audio,Video}DataPromise, WaitForDataPromise)
+ // should exist at any given moment.
+
+ MediaEventListener mAudioCallback;
+ MediaEventListener mVideoCallback;
+ MediaEventListener mAudioWaitCallback;
+ MediaEventListener mVideoWaitCallback;
+
+ const char* AudioRequestStatus() const;
+ const char* VideoRequestStatus() const;
+
+ void OnSuspendTimerResolved();
+ void OnSuspendTimerRejected();
+
+ // True if we shouldn't play our audio (but still write it to any capturing
+ // streams). When this is true, the audio thread will never start again after
+ // it has stopped.
+ bool mAudioCaptured;
+
+ // True if all audio frames are already rendered.
+ bool mAudioCompleted = false;
+
+ // True if all video frames are already rendered.
+ bool mVideoCompleted = false;
+
+ // Flag whether we notify metadata before decoding the first frame or after.
+ //
+ // Note that the odd semantics here are designed to replicate the current
+ // behavior where we notify the decoder each time we come out of dormant, but
+ // send suppressed event visibility for those cases. This code can probably be
+ // simplified.
+ bool mNotifyMetadataBeforeFirstFrame;
+
+ // True if we should not decode/preroll unnecessary samples, unless we're
+ // played. "Prerolling" in this context refers to when we decode and
+ // buffer decoded samples in advance of when they're needed for playback.
+ // This flag is set for preload=metadata media, and means we won't
+ // decode more than the first video frame and first block of audio samples
+ // for that media when we startup, or after a seek. When Play() is called,
+ // we reset this flag, as we assume the user is playing the media, so
+ // prerolling is appropriate then. This flag is used to reduce the overhead
+ // of prerolling samples for media elements that may not play, both
+ // memory and CPU overhead.
+ bool mMinimizePreroll;
+
+ // Stores presentation info required for playback.
+ Maybe<MediaInfo> mInfo;
+
+ nsAutoPtr<MetadataTags> mMetadataTags;
+
+ mozilla::MediaMetadataManager mMetadataManager;
+
+ // Track our request to update the buffered ranges
+ MozPromiseRequestHolder<MediaDecoderReader::BufferedUpdatePromise> mBufferedUpdateRequest;
+
+ // True if we are back from DECODER_STATE_DORMANT state and
+ // LoadedMetadataEvent was already sent.
+ bool mSentLoadedMetadataEvent;
+
+ // True if we've decoded first frames (thus having the start time) and
+ // notified the FirstFrameLoaded event. Note we can't initiate seek until the
+ // start time is known which happens when the first frames are decoded or we
+ // are playing an MSE stream (the start time is always assumed 0).
+ bool mSentFirstFrameLoadedEvent;
+
+ // True if video decoding is suspended.
+ bool mVideoDecodeSuspended;
+
+ // True if the media is seekable (i.e. supports random access).
+ bool mMediaSeekable = true;
+
+ // True if the media is seekable only in buffered ranges.
+ bool mMediaSeekableOnlyInBufferedRanges = false;
+
+ // Track enabling video decode suspension via timer
+ DelayedScheduler mVideoDecodeSuspendTimer;
+
+ // Data about MediaStreams that are being fed by the decoder.
+ const RefPtr<OutputStreamManager> mOutputStreamManager;
+
+ // Media data resource from the decoder.
+ RefPtr<MediaResource> mResource;
+
+ // Track the complete & error for audio/video separately
+ MozPromiseRequestHolder<GenericPromise> mMediaSinkAudioPromise;
+ MozPromiseRequestHolder<GenericPromise> mMediaSinkVideoPromise;
+
+ MediaEventListener mAudioQueueListener;
+ MediaEventListener mVideoQueueListener;
+ MediaEventListener mAudibleListener;
+ MediaEventListener mOnMediaNotSeekable;
+
+ MediaEventProducerExc<nsAutoPtr<MediaInfo>,
+ nsAutoPtr<MetadataTags>,
+ MediaDecoderEventVisibility> mMetadataLoadedEvent;
+ MediaEventProducerExc<nsAutoPtr<MediaInfo>,
+ MediaDecoderEventVisibility> mFirstFrameLoadedEvent;
+
+ MediaEventProducer<MediaEventType> mOnPlaybackEvent;
+ MediaEventProducer<MediaResult> mOnPlaybackErrorEvent;
+
+ MediaEventProducer<DecoderDoctorEvent> mOnDecoderDoctorEvent;
+
+ // True if audio is offloading.
+ // Playback will not start when audio is offloading.
+ bool mAudioOffloading;
+
+ void OnCDMProxyReady(RefPtr<CDMProxy> aProxy);
+ void OnCDMProxyNotReady();
+ RefPtr<CDMProxy> mCDMProxy;
+ MozPromiseRequestHolder<MediaDecoder::CDMProxyPromise> mCDMProxyPromise;
+
+private:
+ // The buffered range. Mirrored from the decoder thread.
+ Mirror<media::TimeIntervals> mBuffered;
+
+ // The duration according to the demuxer's current estimate, mirrored from the main thread.
+ Mirror<media::NullableTimeUnit> mEstimatedDuration;
+
+ // The duration explicitly set by JS, mirrored from the main thread.
+ Mirror<Maybe<double>> mExplicitDuration;
+
+ // The current play state and next play state, mirrored from the main thread.
+ Mirror<MediaDecoder::PlayState> mPlayState;
+ Mirror<MediaDecoder::PlayState> mNextPlayState;
+
+ // Volume of playback. 0.0 = muted. 1.0 = full volume.
+ Mirror<double> mVolume;
+
+ // Pitch preservation for the playback rate.
+ Mirror<bool> mPreservesPitch;
+
+ // True if the media is same-origin with the element. Data can only be
+ // passed to MediaStreams when this is true.
+ Mirror<bool> mSameOriginMedia;
+
+ // An identifier for the principal of the media. Used to track when
+ // main-thread induced principal changes get reflected on MSG thread.
+ Mirror<PrincipalHandle> mMediaPrincipalHandle;
+
+ // Estimate of the current playback rate (bytes/second).
+ Mirror<double> mPlaybackBytesPerSecond;
+
+ // True if mPlaybackBytesPerSecond is a reliable estimate.
+ Mirror<bool> mPlaybackRateReliable;
+
+ // Current decoding position in the stream.
+ Mirror<int64_t> mDecoderPosition;
+
+ // IsVisible, mirrored from the media decoder.
+ Mirror<bool> mIsVisible;
+
+ // Duration of the media. This is guaranteed to be non-null after we finish
+ // decoding the first frame.
+ Canonical<media::NullableTimeUnit> mDuration;
+
+ // Whether we're currently in or transitioning to shutdown state.
+ Canonical<bool> mIsShutdown;
+
+ // The status of our next frame. Mirrored on the main thread and used to
+ // compute ready state.
+ Canonical<NextFrameStatus> mNextFrameStatus;
+
+ // The time of the current frame in microseconds, corresponding to the "current
+ // playback position" in HTML5. This is referenced from 0, which is the initial
+ // playback position.
+ Canonical<int64_t> mCurrentPosition;
+
+ // Current playback position in the stream in bytes.
+ Canonical<int64_t> mPlaybackOffset;
+
+ // Used to distinguish whether the audio is producing sound.
+ Canonical<bool> mIsAudioDataAudible;
+
+public:
+ AbstractCanonical<media::TimeIntervals>* CanonicalBuffered() const;
+
+ AbstractCanonical<media::NullableTimeUnit>* CanonicalDuration() {
+ return &mDuration;
+ }
+ AbstractCanonical<bool>* CanonicalIsShutdown() {
+ return &mIsShutdown;
+ }
+ AbstractCanonical<NextFrameStatus>* CanonicalNextFrameStatus() {
+ return &mNextFrameStatus;
+ }
+ AbstractCanonical<int64_t>* CanonicalCurrentPosition() {
+ return &mCurrentPosition;
+ }
+ AbstractCanonical<int64_t>* CanonicalPlaybackOffset() {
+ return &mPlaybackOffset;
+ }
+ AbstractCanonical<bool>* CanonicalIsAudioDataAudible() {
+ return &mIsAudioDataAudible;
+ }
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaDeviceInfo.cpp b/dom/media/MediaDeviceInfo.cpp
new file mode 100644
index 000000000..327d82029
--- /dev/null
+++ b/dom/media/MediaDeviceInfo.cpp
@@ -0,0 +1,67 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaDeviceInfo.h"
+#include "mozilla/dom/MediaStreamBinding.h"
+#include "mozilla/MediaManager.h"
+#include "nsIScriptGlobalObject.h"
+
+namespace mozilla {
+namespace dom {
+
+MediaDeviceInfo::MediaDeviceInfo(const nsAString& aDeviceId,
+ MediaDeviceKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aGroupId)
+ : mKind(aKind)
+ , mDeviceId(aDeviceId)
+ , mLabel(aLabel)
+ , mGroupId(aGroupId) {}
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(MediaDeviceInfo)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaDeviceInfo)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaDeviceInfo)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaDeviceInfo)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+JSObject*
+MediaDeviceInfo::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaDeviceInfoBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports* MediaDeviceInfo::GetParentObject()
+{
+ return nullptr;
+}
+
+void MediaDeviceInfo::GetDeviceId(nsString& retval)
+{
+ retval = mDeviceId;
+}
+
+MediaDeviceKind
+MediaDeviceInfo::Kind()
+{
+ return mKind;
+}
+
+void MediaDeviceInfo::GetGroupId(nsString& retval)
+{
+ retval = mGroupId;
+}
+
+void MediaDeviceInfo::GetLabel(nsString& retval)
+{
+ retval = mLabel;
+}
+
+MediaDeviceKind Kind();
+void GetLabel(nsString& retval);
+void GetGroupId(nsString& retval);
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaDeviceInfo.h b/dom/media/MediaDeviceInfo.h
new file mode 100644
index 000000000..c1a5a6001
--- /dev/null
+++ b/dom/media/MediaDeviceInfo.h
@@ -0,0 +1,57 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaDeviceInfo_h
+#define mozilla_dom_MediaDeviceInfo_h
+
+#include "mozilla/ErrorResult.h"
+#include "nsISupportsImpl.h"
+#include "mozilla/dom/BindingUtils.h"
+#include "MediaDeviceInfoBinding.h"
+#include "nsPIDOMWindow.h"
+
+namespace mozilla {
+namespace dom {
+
+#define MOZILLA_DOM_MEDIADEVICEINFO_IMPLEMENTATION_IID \
+{0x25091870, 0x84d6, 0x4acf, {0xaf, 0x97, 0x6e, 0xd5, 0x5b, 0xe0, 0x47, 0xb2}}
+
+class MediaDeviceInfo final : public nsISupports, public nsWrapperCache
+{
+public:
+ explicit MediaDeviceInfo(const nsAString& aDeviceId,
+ MediaDeviceKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aGroupId = nsString());
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MediaDeviceInfo)
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIADEVICEINFO_IMPLEMENTATION_IID)
+
+ JSObject*
+ WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) override;
+
+ nsISupports* GetParentObject();
+
+ void GetDeviceId(nsString& retval);
+ MediaDeviceKind Kind();
+ void GetLabel(nsString& retval);
+ void GetGroupId(nsString& retval);
+
+private:
+ MediaDeviceKind mKind;
+ nsString mDeviceId;
+ nsString mLabel;
+ nsString mGroupId;
+
+ virtual ~MediaDeviceInfo() {}
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(MediaDeviceInfo,
+ MOZILLA_DOM_MEDIADEVICEINFO_IMPLEMENTATION_IID)
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaDeviceInfo_h
diff --git a/dom/media/MediaDevices.cpp b/dom/media/MediaDevices.cpp
new file mode 100644
index 000000000..197cfa220
--- /dev/null
+++ b/dom/media/MediaDevices.cpp
@@ -0,0 +1,300 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaDevices.h"
+#include "mozilla/dom/MediaStreamBinding.h"
+#include "mozilla/dom/MediaDeviceInfo.h"
+#include "mozilla/dom/MediaDevicesBinding.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/MediaManager.h"
+#include "MediaTrackConstraints.h"
+#include "nsIEventTarget.h"
+#include "nsIScriptGlobalObject.h"
+#include "nsIPermissionManager.h"
+#include "nsPIDOMWindow.h"
+#include "nsQueryObject.h"
+
+#define DEVICECHANGE_HOLD_TIME_IN_MS 1000
+
+namespace mozilla {
+namespace dom {
+
+class FuzzTimerCallBack final : public nsITimerCallback
+{
+ ~FuzzTimerCallBack() {}
+
+public:
+ explicit FuzzTimerCallBack(MediaDevices* aMediaDevices) : mMediaDevices(aMediaDevices) {}
+
+ NS_DECL_ISUPPORTS
+
+ NS_IMETHOD Notify(nsITimer* aTimer) final
+ {
+ mMediaDevices->DispatchTrustedEvent(NS_LITERAL_STRING("devicechange"));
+ return NS_OK;
+ }
+
+private:
+ nsCOMPtr<MediaDevices> mMediaDevices;
+};
+
+NS_IMPL_ISUPPORTS(FuzzTimerCallBack, nsITimerCallback)
+
+class MediaDevices::GumResolver : public nsIDOMGetUserMediaSuccessCallback
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ explicit GumResolver(Promise* aPromise) : mPromise(aPromise) {}
+
+ NS_IMETHOD
+ OnSuccess(nsISupports* aStream) override
+ {
+ RefPtr<DOMMediaStream> stream = do_QueryObject(aStream);
+ if (!stream) {
+ return NS_ERROR_FAILURE;
+ }
+ mPromise->MaybeResolve(stream);
+ return NS_OK;
+ }
+
+private:
+ virtual ~GumResolver() {}
+ RefPtr<Promise> mPromise;
+};
+
+class MediaDevices::EnumDevResolver : public nsIGetUserMediaDevicesSuccessCallback
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ EnumDevResolver(Promise* aPromise, uint64_t aWindowId)
+ : mPromise(aPromise), mWindowId(aWindowId) {}
+
+ NS_IMETHOD
+ OnSuccess(nsIVariant* aDevices) override
+ {
+ // Cribbed from MediaPermissionGonk.cpp
+
+ // Create array for nsIMediaDevice
+ nsTArray<nsCOMPtr<nsIMediaDevice>> devices;
+ // Contain the fumes
+ {
+ uint16_t vtype;
+ nsresult rv = aDevices->GetDataType(&vtype);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (vtype != nsIDataType::VTYPE_EMPTY_ARRAY) {
+ nsIID elementIID;
+ uint16_t elementType;
+ void* rawArray;
+ uint32_t arrayLen;
+ rv = aDevices->GetAsArray(&elementType, &elementIID, &arrayLen, &rawArray);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (elementType != nsIDataType::VTYPE_INTERFACE) {
+ free(rawArray);
+ return NS_ERROR_FAILURE;
+ }
+
+ nsISupports **supportsArray = reinterpret_cast<nsISupports **>(rawArray);
+ for (uint32_t i = 0; i < arrayLen; ++i) {
+ nsCOMPtr<nsIMediaDevice> device(do_QueryInterface(supportsArray[i]));
+ devices.AppendElement(device);
+ NS_IF_RELEASE(supportsArray[i]); // explicitly decrease refcount for rawptr
+ }
+ free(rawArray); // explicitly free memory from nsIVariant::GetAsArray
+ }
+ }
+ nsTArray<RefPtr<MediaDeviceInfo>> infos;
+ for (auto& device : devices) {
+ nsString type;
+ device->GetType(type);
+ bool isVideo = type.EqualsLiteral("video");
+ bool isAudio = type.EqualsLiteral("audio");
+ if (isVideo || isAudio) {
+ MediaDeviceKind kind = isVideo ?
+ MediaDeviceKind::Videoinput : MediaDeviceKind::Audioinput;
+ nsString id;
+ nsString name;
+ device->GetId(id);
+ // Include name only if page currently has a gUM stream active or
+ // persistent permissions (audio or video) have been granted
+ if (MediaManager::Get()->IsActivelyCapturingOrHasAPermission(mWindowId) ||
+ Preferences::GetBool("media.navigator.permission.disabled", false)) {
+ device->GetName(name);
+ }
+ RefPtr<MediaDeviceInfo> info = new MediaDeviceInfo(id, kind, name);
+ infos.AppendElement(info);
+ }
+ }
+ mPromise->MaybeResolve(infos);
+ return NS_OK;
+ }
+
+private:
+ virtual ~EnumDevResolver() {}
+ RefPtr<Promise> mPromise;
+ uint64_t mWindowId;
+};
+
+class MediaDevices::GumRejecter : public nsIDOMGetUserMediaErrorCallback
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ explicit GumRejecter(Promise* aPromise) : mPromise(aPromise) {}
+
+ NS_IMETHOD
+ OnError(nsISupports* aError) override
+ {
+ RefPtr<MediaStreamError> error = do_QueryObject(aError);
+ if (!error) {
+ return NS_ERROR_FAILURE;
+ }
+ mPromise->MaybeReject(error);
+ return NS_OK;
+ }
+
+private:
+ virtual ~GumRejecter() {}
+ RefPtr<Promise> mPromise;
+};
+
+MediaDevices::~MediaDevices()
+{
+ MediaManager* mediamanager = MediaManager::GetIfExists();
+ if (mediamanager) {
+ mediamanager->RemoveDeviceChangeCallback(this);
+ }
+}
+
+NS_IMPL_ISUPPORTS(MediaDevices::GumResolver, nsIDOMGetUserMediaSuccessCallback)
+NS_IMPL_ISUPPORTS(MediaDevices::EnumDevResolver, nsIGetUserMediaDevicesSuccessCallback)
+NS_IMPL_ISUPPORTS(MediaDevices::GumRejecter, nsIDOMGetUserMediaErrorCallback)
+
+already_AddRefed<Promise>
+MediaDevices::GetUserMedia(const MediaStreamConstraints& aConstraints,
+ ErrorResult &aRv)
+{
+ nsPIDOMWindowInner* window = GetOwner();
+ nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(window);
+ RefPtr<Promise> p = Promise::Create(go, aRv);
+ NS_ENSURE_TRUE(!aRv.Failed(), nullptr);
+
+ RefPtr<GumResolver> resolver = new GumResolver(p);
+ RefPtr<GumRejecter> rejecter = new GumRejecter(p);
+
+ aRv = MediaManager::Get()->GetUserMedia(window, aConstraints,
+ resolver, rejecter);
+ return p.forget();
+}
+
+already_AddRefed<Promise>
+MediaDevices::EnumerateDevices(ErrorResult &aRv)
+{
+ nsPIDOMWindowInner* window = GetOwner();
+ nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(window);
+ RefPtr<Promise> p = Promise::Create(go, aRv);
+ NS_ENSURE_TRUE(!aRv.Failed(), nullptr);
+
+ RefPtr<EnumDevResolver> resolver = new EnumDevResolver(p, window->WindowID());
+ RefPtr<GumRejecter> rejecter = new GumRejecter(p);
+
+ aRv = MediaManager::Get()->EnumerateDevices(window, resolver, rejecter);
+ return p.forget();
+}
+
+NS_IMPL_ADDREF_INHERITED(MediaDevices, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaDevices, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN(MediaDevices)
+ NS_INTERFACE_MAP_ENTRY(MediaDevices)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+void
+MediaDevices::OnDeviceChange()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsresult rv = CheckInnerWindowCorrectness();
+ if (NS_FAILED(rv)) {
+ MOZ_ASSERT(false);
+ return;
+ }
+
+ if (!(MediaManager::Get()->IsActivelyCapturingOrHasAPermission(GetOwner()->WindowID()) ||
+ Preferences::GetBool("media.navigator.permission.disabled", false))) {
+ return;
+ }
+
+ if (!mFuzzTimer)
+ {
+ mFuzzTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+ }
+
+ if (!mFuzzTimer) {
+ MOZ_ASSERT(false);
+ return;
+ }
+
+ mFuzzTimer->Cancel();
+ RefPtr<FuzzTimerCallBack> cb = new FuzzTimerCallBack(this);
+ mFuzzTimer->InitWithCallback(cb, DEVICECHANGE_HOLD_TIME_IN_MS, nsITimer::TYPE_ONE_SHOT);
+}
+
+mozilla::dom::EventHandlerNonNull*
+MediaDevices::GetOndevicechange()
+{
+ if (NS_IsMainThread()) {
+ return GetEventHandler(nsGkAtoms::ondevicechange, EmptyString());
+ }
+ return GetEventHandler(nullptr, NS_LITERAL_STRING("devicechange"));
+}
+
+void
+MediaDevices::SetOndevicechange(mozilla::dom::EventHandlerNonNull* aCallback)
+{
+ if (NS_IsMainThread()) {
+ SetEventHandler(nsGkAtoms::ondevicechange, EmptyString(), aCallback);
+ } else {
+ SetEventHandler(nullptr, NS_LITERAL_STRING("devicechange"), aCallback);
+ }
+
+ MediaManager::Get()->AddDeviceChangeCallback(this);
+}
+
+nsresult
+MediaDevices::AddEventListener(const nsAString& aType,
+ nsIDOMEventListener* aListener,
+ bool aUseCapture, bool aWantsUntrusted,
+ uint8_t optional_argc)
+{
+ MediaManager::Get()->AddDeviceChangeCallback(this);
+
+ return mozilla::DOMEventTargetHelper::AddEventListener(aType, aListener,
+ aUseCapture,
+ aWantsUntrusted,
+ optional_argc);
+}
+
+void
+MediaDevices::AddEventListener(const nsAString& aType,
+ dom::EventListener* aListener,
+ const dom::AddEventListenerOptionsOrBoolean& aOptions,
+ const dom::Nullable<bool>& aWantsUntrusted,
+ ErrorResult& aRv)
+{
+ MediaManager::Get()->AddDeviceChangeCallback(this);
+
+ return mozilla::DOMEventTargetHelper::AddEventListener(aType, aListener,
+ aOptions,
+ aWantsUntrusted,
+ aRv);
+}
+
+JSObject*
+MediaDevices::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaDevicesBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaDevices.h b/dom/media/MediaDevices.h
new file mode 100644
index 000000000..b0984d9d7
--- /dev/null
+++ b/dom/media/MediaDevices.h
@@ -0,0 +1,79 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaDevices_h
+#define mozilla_dom_MediaDevices_h
+
+#include "mozilla/ErrorResult.h"
+#include "nsISupportsImpl.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/BindingUtils.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/media/DeviceChangeCallback.h"
+
+namespace mozilla {
+namespace dom {
+
+class Promise;
+struct MediaStreamConstraints;
+struct MediaTrackSupportedConstraints;
+
+#define MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID \
+{ 0x2f784d8a, 0x7485, 0x4280, \
+ { 0x9a, 0x36, 0x74, 0xa4, 0xd6, 0x71, 0xa6, 0xc8 } }
+
+class MediaDevices final : public DOMEventTargetHelper
+ ,public DeviceChangeCallback
+{
+public:
+ explicit MediaDevices(nsPIDOMWindowInner* aWindow) :
+ DOMEventTargetHelper(aWindow) {}
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID)
+
+ JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // No code needed, as MediaTrackSupportedConstraints members default to true.
+ void GetSupportedConstraints(MediaTrackSupportedConstraints& aResult) {};
+
+ already_AddRefed<Promise>
+ GetUserMedia(const MediaStreamConstraints& aConstraints, ErrorResult &aRv);
+
+ already_AddRefed<Promise>
+ EnumerateDevices(ErrorResult &aRv);
+
+ virtual void OnDeviceChange() override;
+
+ mozilla::dom::EventHandlerNonNull* GetOndevicechange();
+
+ void SetOndevicechange(mozilla::dom::EventHandlerNonNull* aCallback);
+
+ NS_IMETHOD AddEventListener(const nsAString& aType,
+ nsIDOMEventListener* aListener,
+ bool aUseCapture, bool aWantsUntrusted,
+ uint8_t optional_argc) override;
+
+ virtual void AddEventListener(const nsAString& aType,
+ dom::EventListener* aListener,
+ const dom::AddEventListenerOptionsOrBoolean& aOptions,
+ const dom::Nullable<bool>& aWantsUntrusted,
+ ErrorResult& aRv) override;
+
+private:
+ class GumResolver;
+ class EnumDevResolver;
+ class GumRejecter;
+
+ virtual ~MediaDevices();
+ nsCOMPtr<nsITimer> mFuzzTimer;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(MediaDevices,
+ MOZILLA_DOM_MEDIADEVICES_IMPLEMENTATION_IID)
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaDevices_h
diff --git a/dom/media/MediaEventSource.h b/dom/media/MediaEventSource.h
new file mode 100644
index 000000000..eb0451e49
--- /dev/null
+++ b/dom/media/MediaEventSource.h
@@ -0,0 +1,618 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaEventSource_h_
+#define MediaEventSource_h_
+
+#include "mozilla/AbstractThread.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/IndexSequence.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/Tuple.h"
+#include "mozilla/TypeTraits.h"
+#include "mozilla/UniquePtr.h"
+
+#include "nsISupportsImpl.h"
+#include "nsTArray.h"
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+
+/**
+ * A thread-safe tool to communicate "revocation" across threads. It is used to
+ * disconnect a listener from the event source to prevent future notifications
+ * from coming. Revoke() can be called on any thread. However, it is recommended
+ * to be called on the target thread to avoid race condition.
+ *
+ * RevocableToken is not exposed to the client code directly.
+ * Use MediaEventListener below to do the job.
+ */
+class RevocableToken {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RevocableToken);
+
+public:
+ RevocableToken() : mRevoked(false) {}
+
+ void Revoke() {
+ mRevoked = true;
+ }
+
+ bool IsRevoked() const {
+ return mRevoked;
+ }
+
+private:
+ ~RevocableToken() {}
+ Atomic<bool> mRevoked;
+};
+
+enum class ListenerPolicy : int8_t {
+ // Allow at most one listener. Move will be used when possible
+ // to pass the event data to save copy.
+ Exclusive,
+ // Allow multiple listeners. Event data will always be copied when passed
+ // to the listeners.
+ NonExclusive
+};
+
+enum class DispatchPolicy : int8_t {
+ Sync, // Events are passed synchronously to the listeners.
+ Async // Events are passed asynchronously to the listeners.
+};
+
+namespace detail {
+
+/**
+ * Define how an event type is passed internally in MediaEventSource and to the
+ * listeners. Specialized for the void type to pass a dummy bool instead.
+ */
+template <typename T>
+struct EventTypeTraits {
+ typedef T ArgType;
+};
+
+template <>
+struct EventTypeTraits<void> {
+ typedef bool ArgType;
+};
+
+/**
+ * Test if a method function or lambda accepts one or more arguments.
+ */
+template <typename T>
+class TakeArgsHelper {
+ template <typename C> static FalseType test(void(C::*)(), int);
+ template <typename C> static FalseType test(void(C::*)() const, int);
+ template <typename C> static FalseType test(void(C::*)() volatile, int);
+ template <typename C> static FalseType test(void(C::*)() const volatile, int);
+ template <typename F> static FalseType test(F&&, decltype(DeclVal<F>()(), 0));
+ static TrueType test(...);
+public:
+ typedef decltype(test(DeclVal<T>(), 0)) Type;
+};
+
+template <typename T>
+struct TakeArgs : public TakeArgsHelper<T>::Type {};
+
+template <DispatchPolicy Dp, typename T> struct EventTarget;
+
+template <>
+struct EventTarget<DispatchPolicy::Async, nsIEventTarget> {
+ static void
+ Dispatch(nsIEventTarget* aTarget, already_AddRefed<nsIRunnable> aTask) {
+ aTarget->Dispatch(Move(aTask), NS_DISPATCH_NORMAL);
+ }
+};
+
+template <>
+struct EventTarget<DispatchPolicy::Async, AbstractThread> {
+ static void
+ Dispatch(AbstractThread* aTarget, already_AddRefed<nsIRunnable> aTask) {
+ aTarget->Dispatch(Move(aTask), AbstractThread::DontAssertDispatchSuccess);
+ }
+};
+
+template <>
+struct EventTarget<DispatchPolicy::Sync, nsIEventTarget> {
+ static bool IsOnCurrentThread(nsIEventTarget* aTarget) {
+ bool current = false;
+ auto rv = aTarget->IsOnCurrentThread(&current);
+ return NS_SUCCEEDED(rv) && current;
+ }
+ static void
+ Dispatch(nsIEventTarget* aTarget, already_AddRefed<nsIRunnable> aTask) {
+ MOZ_ASSERT(IsOnCurrentThread(aTarget));
+ nsCOMPtr<nsIRunnable> r = aTask;
+ r->Run();
+ }
+};
+
+template <>
+struct EventTarget<DispatchPolicy::Sync, AbstractThread> {
+ static void
+ Dispatch(AbstractThread* aTarget, already_AddRefed<nsIRunnable> aTask) {
+ MOZ_ASSERT(aTarget->IsCurrentThreadIn());
+ nsCOMPtr<nsIRunnable> r = aTask;
+ r->Run();
+ }
+};
+
+/**
+ * Encapsulate a raw pointer to be captured by a lambda without causing
+ * static-analysis errors.
+ */
+template <typename T>
+class RawPtr {
+public:
+ explicit RawPtr(T* aPtr) : mPtr(aPtr) {}
+ T* get() const { return mPtr; }
+private:
+ T* const mPtr;
+};
+
+/**
+ * A helper class to pass event data to the listeners. Optimized to save
+ * copy when Move is possible or |Function| takes no arguments.
+ */
+template<DispatchPolicy Dp, typename Target, typename Function>
+class ListenerHelper {
+ // Define our custom runnable to minimize copy of the event data.
+ // NS_NewRunnableFunction will result in 2 copies of the event data.
+ // One is captured by the lambda and the other is the copy of the lambda.
+ template <typename... Ts>
+ class R : public Runnable {
+ public:
+ template <typename... Us>
+ R(RevocableToken* aToken, const Function& aFunction, Us&&... aEvents)
+ : mToken(aToken)
+ , mFunction(aFunction)
+ , mEvents(Forward<Us>(aEvents)...) {}
+
+ template <typename... Vs, size_t... Is>
+ void Invoke(Tuple<Vs...>& aEvents, IndexSequence<Is...>) {
+ // Enable move whenever possible since mEvent won't be used anymore.
+ mFunction(Move(Get<Is>(aEvents))...);
+ }
+
+ NS_IMETHOD Run() override {
+ // Don't call the listener if it is disconnected.
+ if (!mToken->IsRevoked()) {
+ Invoke(mEvents, typename IndexSequenceFor<Ts...>::Type());
+ }
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<RevocableToken> mToken;
+ Function mFunction;
+
+ template <typename T>
+ using ArgType = typename RemoveCV<typename RemoveReference<T>::Type>::Type;
+ Tuple<ArgType<Ts>...> mEvents;
+ };
+
+public:
+ ListenerHelper(RevocableToken* aToken, Target* aTarget, const Function& aFunc)
+ : mToken(aToken), mTarget(aTarget), mFunction(aFunc) {}
+
+ // |F| takes one or more arguments.
+ template <typename F, typename... Ts>
+ typename EnableIf<TakeArgs<F>::value, void>::Type
+ DispatchHelper(const F& aFunc, Ts&&... aEvents) {
+ nsCOMPtr<nsIRunnable> r =
+ new R<Ts...>(mToken, aFunc, Forward<Ts>(aEvents)...);
+ EventTarget<Dp, Target>::Dispatch(mTarget.get(), r.forget());
+ }
+
+ // |F| takes no arguments. Don't bother passing aEvent.
+ template <typename F, typename... Ts>
+ typename EnableIf<!TakeArgs<F>::value, void>::Type
+ DispatchHelper(const F& aFunc, Ts&&...) {
+ const RefPtr<RevocableToken>& token = mToken;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ // Don't call the listener if it is disconnected.
+ if (!token->IsRevoked()) {
+ aFunc();
+ }
+ });
+ EventTarget<Dp, Target>::Dispatch(mTarget.get(), r.forget());
+ }
+
+ template <typename... Ts>
+ void Dispatch(Ts&&... aEvents) {
+ DispatchHelper(mFunction, Forward<Ts>(aEvents)...);
+ }
+
+private:
+ RefPtr<RevocableToken> mToken;
+ const RefPtr<Target> mTarget;
+ Function mFunction;
+};
+
+/**
+ * Define whether an event data should be copied or moved to the listeners.
+ *
+ * @Copy Data will always be copied. Each listener gets a copy.
+ * @Move Data will always be moved.
+ */
+enum class EventPassMode : int8_t {
+ Copy,
+ Move
+};
+
+class ListenerBase {
+public:
+ ListenerBase() : mToken(new RevocableToken()) {}
+ ~ListenerBase() {
+ MOZ_ASSERT(Token()->IsRevoked(), "Must disconnect the listener.");
+ }
+ RevocableToken* Token() const {
+ return mToken;
+ }
+private:
+ const RefPtr<RevocableToken> mToken;
+};
+
+/**
+ * Stored by MediaEventSource to send notifications to the listener.
+ * Since virtual methods can not be templated, this class is specialized
+ * to provide different Dispatch() overloads depending on EventPassMode.
+ */
+template <EventPassMode Mode, typename... As>
+class Listener : public ListenerBase {
+public:
+ virtual ~Listener() {}
+ virtual void Dispatch(const As&... aEvents) = 0;
+};
+
+template <typename... As>
+class Listener<EventPassMode::Move, As...> : public ListenerBase {
+public:
+ virtual ~Listener() {}
+ virtual void Dispatch(As... aEvents) = 0;
+};
+
+/**
+ * Store the registered target thread and function so it knows where and to
+ * whom to send the event data.
+ */
+template <DispatchPolicy Dp, typename Target,
+ typename Function, EventPassMode, typename... As>
+class ListenerImpl : public Listener<EventPassMode::Copy, As...> {
+public:
+ ListenerImpl(Target* aTarget, const Function& aFunction)
+ : mHelper(ListenerBase::Token(), aTarget, aFunction) {}
+ void Dispatch(const As&... aEvents) override {
+ mHelper.Dispatch(aEvents...);
+ }
+private:
+ ListenerHelper<Dp, Target, Function> mHelper;
+};
+
+template <DispatchPolicy Dp, typename Target, typename Function, typename... As>
+class ListenerImpl<Dp, Target, Function, EventPassMode::Move, As...>
+ : public Listener<EventPassMode::Move, As...> {
+public:
+ ListenerImpl(Target* aTarget, const Function& aFunction)
+ : mHelper(ListenerBase::Token(), aTarget, aFunction) {}
+ void Dispatch(As... aEvents) override {
+ mHelper.Dispatch(Move(aEvents)...);
+ }
+private:
+ ListenerHelper<Dp, Target, Function> mHelper;
+};
+
+/**
+ * Select EventPassMode based on ListenerPolicy.
+ *
+ * @Copy Selected when ListenerPolicy is NonExclusive because each listener
+ * must get a copy.
+ *
+ * @Move Selected when ListenerPolicy is Exclusive. All types passed to
+ * MediaEventProducer::Notify() must be movable.
+ */
+template <ListenerPolicy Lp>
+struct PassModePicker {
+ static const EventPassMode Value =
+ Lp == ListenerPolicy::NonExclusive ?
+ EventPassMode::Copy : EventPassMode::Move;
+};
+
+/**
+ * Return true if any type is a reference type.
+ */
+template <typename Head, typename... Tails>
+struct IsAnyReference {
+ static const bool value = IsReference<Head>::value ||
+ IsAnyReference<Tails...>::value;
+};
+
+template <typename T>
+struct IsAnyReference<T> {
+ static const bool value = IsReference<T>::value;
+};
+
+} // namespace detail
+
+template <DispatchPolicy, ListenerPolicy, typename... Ts>
+class MediaEventSourceImpl;
+
+/**
+ * Not thread-safe since this is not meant to be shared and therefore only
+ * move constructor is provided. Used to hold the result of
+ * MediaEventSource<T>::Connect() and call Disconnect() to disconnect the
+ * listener from an event source.
+ */
+class MediaEventListener {
+ template <DispatchPolicy, ListenerPolicy, typename... Ts>
+ friend class MediaEventSourceImpl;
+
+public:
+ MediaEventListener() {}
+
+ MediaEventListener(MediaEventListener&& aOther)
+ : mToken(Move(aOther.mToken)) {}
+
+ MediaEventListener& operator=(MediaEventListener&& aOther) {
+ MOZ_ASSERT(!mToken, "Must disconnect the listener.");
+ mToken = Move(aOther.mToken);
+ return *this;
+ }
+
+ ~MediaEventListener() {
+ MOZ_ASSERT(!mToken, "Must disconnect the listener.");
+ }
+
+ void Disconnect() {
+ mToken->Revoke();
+ mToken = nullptr;
+ }
+
+ void DisconnectIfExists() {
+ if (mToken) {
+ Disconnect();
+ }
+ }
+
+private:
+ // Avoid exposing RevocableToken directly to the client code so that
+ // listeners can be disconnected in a controlled manner.
+ explicit MediaEventListener(RevocableToken* aToken) : mToken(aToken) {}
+ RefPtr<RevocableToken> mToken;
+};
+
+/**
+ * A generic and thread-safe class to implement the observer pattern.
+ */
+template <DispatchPolicy Dp, ListenerPolicy Lp, typename... Es>
+class MediaEventSourceImpl {
+ static_assert(!detail::IsAnyReference<Es...>::value,
+ "Ref-type not supported!");
+
+ template <typename T>
+ using ArgType = typename detail::EventTypeTraits<T>::ArgType;
+
+ static const detail::EventPassMode PassMode =
+ detail::PassModePicker<Lp>::Value;
+
+ typedef detail::Listener<PassMode, ArgType<Es>...> Listener;
+
+ template<typename Target, typename Func>
+ using ListenerImpl =
+ detail::ListenerImpl<Dp, Target, Func, PassMode, ArgType<Es>...>;
+
+ template <typename Method>
+ using TakeArgs = detail::TakeArgs<Method>;
+
+ void PruneListeners() {
+ int32_t last = static_cast<int32_t>(mListeners.Length()) - 1;
+ for (int32_t i = last; i >= 0; --i) {
+ if (mListeners[i]->Token()->IsRevoked()) {
+ mListeners.RemoveElementAt(i);
+ }
+ }
+ }
+
+ template<typename Target, typename Function>
+ MediaEventListener
+ ConnectInternal(Target* aTarget, const Function& aFunction) {
+ MutexAutoLock lock(mMutex);
+ PruneListeners();
+ MOZ_ASSERT(Lp == ListenerPolicy::NonExclusive || mListeners.IsEmpty());
+ auto l = mListeners.AppendElement();
+ l->reset(new ListenerImpl<Target, Function>(aTarget, aFunction));
+ return MediaEventListener((*l)->Token());
+ }
+
+ // |Method| takes one or more arguments.
+ template <typename Target, typename This, typename Method>
+ typename EnableIf<TakeArgs<Method>::value, MediaEventListener>::Type
+ ConnectInternal(Target* aTarget, This* aThis, Method aMethod) {
+ detail::RawPtr<This> thiz(aThis);
+ auto f = [=] (ArgType<Es>&&... aEvents) {
+ (thiz.get()->*aMethod)(Move(aEvents)...);
+ };
+ return ConnectInternal(aTarget, f);
+ }
+
+ // |Method| takes no arguments. Don't bother passing the event data.
+ template <typename Target, typename This, typename Method>
+ typename EnableIf<!TakeArgs<Method>::value, MediaEventListener>::Type
+ ConnectInternal(Target* aTarget, This* aThis, Method aMethod) {
+ detail::RawPtr<This> thiz(aThis);
+ auto f = [=] () {
+ (thiz.get()->*aMethod)();
+ };
+ return ConnectInternal(aTarget, f);
+ }
+
+public:
+ /**
+ * Register a function to receive notifications from the event source.
+ *
+ * @param aTarget The target thread on which the function will run.
+ * @param aFunction A function to be called on the target thread. The function
+ * parameter must be convertible from |EventType|.
+ * @return An object used to disconnect from the event source.
+ */
+ template<typename Function>
+ MediaEventListener
+ Connect(AbstractThread* aTarget, const Function& aFunction) {
+ return ConnectInternal(aTarget, aFunction);
+ }
+
+ template<typename Function>
+ MediaEventListener
+ Connect(nsIEventTarget* aTarget, const Function& aFunction) {
+ return ConnectInternal(aTarget, aFunction);
+ }
+
+ /**
+ * As above.
+ *
+ * Note we deliberately keep a weak reference to |aThis| in order not to
+ * change its lifetime. This is because notifications are dispatched
+ * asynchronously and removing a listener doesn't always break the reference
+ * cycle for the pending event could still hold a reference to |aThis|.
+ *
+ * The caller must call MediaEventListener::Disconnect() to avoid dangling
+ * pointers.
+ */
+ template <typename This, typename Method>
+ MediaEventListener
+ Connect(AbstractThread* aTarget, This* aThis, Method aMethod) {
+ return ConnectInternal(aTarget, aThis, aMethod);
+ }
+
+ template <typename This, typename Method>
+ MediaEventListener
+ Connect(nsIEventTarget* aTarget, This* aThis, Method aMethod) {
+ return ConnectInternal(aTarget, aThis, aMethod);
+ }
+
+protected:
+ MediaEventSourceImpl() : mMutex("MediaEventSourceImpl::mMutex") {}
+
+ template <DispatchPolicy P, typename... Ts>
+ typename EnableIf<P == DispatchPolicy::Async, void>::Type
+ NotifyInternal(IntegralConstant<DispatchPolicy, P>, Ts&&... aEvents) {
+ MutexAutoLock lock(mMutex);
+ int32_t last = static_cast<int32_t>(mListeners.Length()) - 1;
+ for (int32_t i = last; i >= 0; --i) {
+ auto&& l = mListeners[i];
+ // Remove disconnected listeners.
+ // It is not optimal but is simple and works well.
+ if (l->Token()->IsRevoked()) {
+ mListeners.RemoveElementAt(i);
+ continue;
+ }
+ l->Dispatch(Forward<Ts>(aEvents)...);
+ }
+ }
+
+ template <DispatchPolicy P, typename... Ts>
+ typename EnableIf<P == DispatchPolicy::Sync, void>::Type
+ NotifyInternal(IntegralConstant<DispatchPolicy, P>, Ts&&... aEvents) {
+ // Move |mListeners| to a new container before iteration to prevent
+ // |mListeners| from being disrupted if the listener calls Connect() to
+ // modify |mListeners| in the callback function.
+ nsTArray<UniquePtr<Listener>> listeners;
+ listeners.SwapElements(mListeners);
+ for (auto&& l : listeners) {
+ l->Dispatch(Forward<Ts>(aEvents)...);
+ }
+ PruneListeners();
+ // Move remaining listeners back to |mListeners|.
+ for (auto&& l : listeners) {
+ if (!l->Token()->IsRevoked()) {
+ mListeners.AppendElement(Move(l));
+ }
+ }
+ // Perform sanity checks.
+ MOZ_ASSERT(Lp == ListenerPolicy::NonExclusive || mListeners.Length() <= 1);
+ }
+
+ template <typename... Ts>
+ void Notify(Ts&&... aEvents) {
+ NotifyInternal(IntegralConstant<DispatchPolicy, Dp>(),
+ Forward<Ts>(aEvents)...);
+ }
+
+private:
+ Mutex mMutex;
+ nsTArray<UniquePtr<Listener>> mListeners;
+};
+
+template <typename... Es>
+using MediaEventSource =
+ MediaEventSourceImpl<DispatchPolicy::Async,
+ ListenerPolicy::NonExclusive, Es...>;
+
+template <typename... Es>
+using MediaEventSourceExc =
+ MediaEventSourceImpl<DispatchPolicy::Async, ListenerPolicy::Exclusive, Es...>;
+
+/**
+ * A class to separate the interface of event subject (MediaEventSource)
+ * and event publisher. Mostly used as a member variable to publish events
+ * to the listeners.
+ */
+template <typename... Es>
+class MediaEventProducer : public MediaEventSource<Es...> {
+public:
+ using MediaEventSource<Es...>::Notify;
+};
+
+/**
+ * Specialization for void type. A dummy bool is passed to NotifyInternal
+ * since there is no way to pass a void value.
+ */
+template <>
+class MediaEventProducer<void> : public MediaEventSource<void> {
+public:
+ void Notify() {
+ MediaEventSource<void>::Notify(false /* dummy */);
+ }
+};
+
+/**
+ * A producer allowing at most one listener.
+ */
+template <typename... Es>
+class MediaEventProducerExc : public MediaEventSourceExc<Es...> {
+public:
+ using MediaEventSourceExc<Es...>::Notify;
+};
+
+/**
+ * Events are passed directly to the callback function of the listeners without
+ * dispatching. Note this class is not thread-safe. Both Connect() and Notify()
+ * must be called on the same thread.
+ */
+template <typename... Es>
+class MediaCallback
+ : public MediaEventSourceImpl<DispatchPolicy::Sync,
+ ListenerPolicy::NonExclusive, Es...> {
+public:
+ using MediaEventSourceImpl<DispatchPolicy::Sync,
+ ListenerPolicy::NonExclusive, Es...>::Notify;
+};
+
+/**
+ * A special version of MediaCallback which allows at most one listener.
+ */
+template <typename... Es>
+class MediaCallbackExc
+ : public MediaEventSourceImpl<DispatchPolicy::Sync,
+ ListenerPolicy::Exclusive, Es...> {
+public:
+ using MediaEventSourceImpl<DispatchPolicy::Sync,
+ ListenerPolicy::Exclusive, Es...>::Notify;
+};
+
+} // namespace mozilla
+
+#endif //MediaEventSource_h_
diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp
new file mode 100644
index 000000000..2093803ad
--- /dev/null
+++ b/dom/media/MediaFormatReader.cpp
@@ -0,0 +1,2372 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/CDMProxy.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/Telemetry.h"
+#include "nsContentUtils.h"
+#include "nsPrintfCString.h"
+#include "nsSize.h"
+#include "Layers.h"
+#include "MediaData.h"
+#include "MediaInfo.h"
+#include "MediaFormatReader.h"
+#include "MediaPrefs.h"
+#include "MediaResource.h"
+#include "mozilla/SharedThreadPool.h"
+#include "VideoUtils.h"
+#include "VideoFrameContainer.h"
+#include "mozilla/layers/ShadowLayers.h"
+
+#include <algorithm>
+#include <queue>
+
+using namespace mozilla::media;
+
+using mozilla::layers::Image;
+using mozilla::layers::LayerManager;
+using mozilla::layers::LayersBackend;
+
+static mozilla::LazyLogModule sFormatDecoderLog("MediaFormatReader");
+mozilla::LazyLogModule gMediaDemuxerLog("MediaDemuxer");
+
+#define LOG(arg, ...) MOZ_LOG(sFormatDecoderLog, mozilla::LogLevel::Debug, ("MediaFormatReader(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define LOGV(arg, ...) MOZ_LOG(sFormatDecoderLog, mozilla::LogLevel::Verbose, ("MediaFormatReader(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+/**
+ * This is a singleton which controls the number of decoders that can be
+ * created concurrently. Before calling PDMFactory::CreateDecoder(), Alloc()
+ * must be called to get a token object as a permission to create a decoder.
+ * The token should stay alive until Shutdown() is called on the decoder.
+ * The destructor of the token will restore the decoder count so it is available
+ * for next calls of Alloc().
+ */
+class DecoderAllocPolicy
+{
+ using TrackType = TrackInfo::TrackType;
+
+public:
+ class Token
+ {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Token)
+ protected:
+ virtual ~Token() {}
+ };
+
+ using Promise = MozPromise<RefPtr<Token>, bool, true>;
+
+ // Acquire a token for decoder creation. Thread-safe.
+ auto Alloc() -> RefPtr<Promise>;
+
+ // Called by ClearOnShutdown() to delete the singleton.
+ void operator=(decltype(nullptr));
+
+ // Get the singleton for the given track type. Thread-safe.
+ static DecoderAllocPolicy& Instance(TrackType aTrack);
+
+private:
+ class AutoDeallocToken;
+ using PromisePrivate = Promise::Private;
+ explicit DecoderAllocPolicy(TrackType aTrack);
+ ~DecoderAllocPolicy();
+ // Called by the destructor of TokenImpl to restore the decoder limit.
+ void Dealloc();
+ // Decrement the decoder limit and resolve a promise if available.
+ void ResolvePromise(ReentrantMonitorAutoEnter& aProofOfLock);
+
+ // Protect access to Instance().
+ static StaticMutex sMutex;
+
+ ReentrantMonitor mMonitor;
+ // The number of decoders available for creation.
+ int mDecoderLimit;
+ // Track type.
+ const TrackType mTrack;
+ // Requests to acquire tokens.
+ std::queue<RefPtr<PromisePrivate>> mPromises;
+};
+
+StaticMutex DecoderAllocPolicy::sMutex;
+
+class DecoderAllocPolicy::AutoDeallocToken : public Token
+{
+public:
+ explicit AutoDeallocToken(TrackType aTrack)
+ : mTrack(aTrack)
+ {}
+
+private:
+ ~AutoDeallocToken()
+ {
+ DecoderAllocPolicy::Instance(mTrack).Dealloc();
+ }
+
+ const TrackType mTrack;
+};
+
+DecoderAllocPolicy::DecoderAllocPolicy(TrackType aTrack)
+ : mMonitor("DecoderAllocPolicy::mMonitor")
+ , mDecoderLimit(MediaPrefs::MediaDecoderLimit())
+ , mTrack(aTrack)
+{
+ AbstractThread::MainThread()->Dispatch(NS_NewRunnableFunction([this] () {
+ ClearOnShutdown(this, ShutdownPhase::ShutdownThreads);
+ }));
+}
+
+DecoderAllocPolicy::~DecoderAllocPolicy()
+{
+ while (!mPromises.empty()) {
+ RefPtr<PromisePrivate> p = mPromises.front().forget();
+ mPromises.pop();
+ p->Reject(true, __func__);
+ }
+}
+
+DecoderAllocPolicy&
+DecoderAllocPolicy::Instance(TrackType aTrack)
+{
+ StaticMutexAutoLock lock(sMutex);
+ if (aTrack == TrackType::kAudioTrack) {
+ static auto sAudioPolicy = new DecoderAllocPolicy(TrackType::kAudioTrack);
+ return *sAudioPolicy;
+ } else {
+ static auto sVideoPolicy = new DecoderAllocPolicy(TrackType::kVideoTrack);
+ return *sVideoPolicy;
+ }
+}
+
+auto
+DecoderAllocPolicy::Alloc() -> RefPtr<Promise>
+{
+ // No decoder limit set.
+ if (mDecoderLimit < 0) {
+ return Promise::CreateAndResolve(new Token(), __func__);
+ }
+
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ RefPtr<PromisePrivate> p = new PromisePrivate(__func__);
+ mPromises.push(p);
+ ResolvePromise(mon);
+ return p.forget();
+}
+
+void
+DecoderAllocPolicy::Dealloc()
+{
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ ++mDecoderLimit;
+ ResolvePromise(mon);
+}
+
+void
+DecoderAllocPolicy::ResolvePromise(ReentrantMonitorAutoEnter& aProofOfLock)
+{
+ MOZ_ASSERT(mDecoderLimit >= 0);
+
+ if (mDecoderLimit > 0 && !mPromises.empty()) {
+ --mDecoderLimit;
+ RefPtr<PromisePrivate> p = mPromises.front().forget();
+ mPromises.pop();
+ p->Resolve(new AutoDeallocToken(mTrack), __func__);
+ }
+}
+
+void
+DecoderAllocPolicy::operator=(std::nullptr_t)
+{
+ delete this;
+}
+
+class MediaFormatReader::DecoderFactory
+{
+ using InitPromise = MediaDataDecoder::InitPromise;
+ using TokenPromise = DecoderAllocPolicy::Promise;
+ using Token = DecoderAllocPolicy::Token;
+
+public:
+ explicit DecoderFactory(MediaFormatReader* aOwner) : mOwner(aOwner) {}
+ void CreateDecoder(TrackType aTrack);
+
+private:
+ class Wrapper;
+
+ enum class Stage : int8_t
+ {
+ None,
+ WaitForToken,
+ CreateDecoder,
+ WaitForInit
+ };
+
+ struct Data
+ {
+ Stage mStage = Stage::None;
+ RefPtr<Token> mToken;
+ RefPtr<MediaDataDecoder> mDecoder;
+ MozPromiseRequestHolder<TokenPromise> mTokenPromise;
+ MozPromiseRequestHolder<InitPromise> mInitPromise;
+ ~Data()
+ {
+ mTokenPromise.DisconnectIfExists();
+ mInitPromise.DisconnectIfExists();
+ if (mDecoder) {
+ mDecoder->Flush();
+ mDecoder->Shutdown();
+ }
+ }
+ } mAudio, mVideo;
+
+ void RunStage(TrackType aTrack);
+ MediaResult DoCreateDecoder(TrackType aTrack);
+ void DoInitDecoder(TrackType aTrack);
+
+ MediaFormatReader* const mOwner; // guaranteed to be valid by the owner.
+};
+
+void
+MediaFormatReader::DecoderFactory::CreateDecoder(TrackType aTrack)
+{
+ MOZ_ASSERT(aTrack == TrackInfo::kAudioTrack ||
+ aTrack == TrackInfo::kVideoTrack);
+ RunStage(aTrack);
+}
+
+class MediaFormatReader::DecoderFactory::Wrapper : public MediaDataDecoder
+{
+ using Token = DecoderAllocPolicy::Token;
+
+public:
+ Wrapper(already_AddRefed<MediaDataDecoder> aDecoder,
+ already_AddRefed<Token> aToken)
+ : mDecoder(aDecoder), mToken(aToken) {}
+
+ RefPtr<InitPromise> Init() override { return mDecoder->Init(); }
+ void Input(MediaRawData* aSample) override { mDecoder->Input(aSample); }
+ void Flush() override { mDecoder->Flush(); }
+ void Drain() override { mDecoder->Drain(); }
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override
+ {
+ return mDecoder->IsHardwareAccelerated(aFailureReason);
+ }
+ const char* GetDescriptionName() const override
+ {
+ return mDecoder->GetDescriptionName();
+ }
+ void SetSeekThreshold(const media::TimeUnit& aTime) override
+ {
+ mDecoder->SetSeekThreshold(aTime);
+ }
+ void Shutdown() override
+ {
+ mDecoder->Shutdown();
+ mDecoder = nullptr;
+ mToken = nullptr;
+ }
+
+private:
+ RefPtr<MediaDataDecoder> mDecoder;
+ RefPtr<Token> mToken;
+};
+
+void
+MediaFormatReader::DecoderFactory::RunStage(TrackType aTrack)
+{
+ auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
+
+ switch (data.mStage) {
+ case Stage::None: {
+ MOZ_ASSERT(!data.mToken);
+ data.mTokenPromise.Begin(DecoderAllocPolicy::Instance(aTrack).Alloc()->Then(
+ mOwner->OwnerThread(), __func__,
+ [this, &data, aTrack] (Token* aToken) {
+ data.mTokenPromise.Complete();
+ data.mToken = aToken;
+ data.mStage = Stage::CreateDecoder;
+ RunStage(aTrack);
+ },
+ [&data] () {
+ data.mTokenPromise.Complete();
+ data.mStage = Stage::None;
+ }));
+ data.mStage = Stage::WaitForToken;
+ break;
+ }
+
+ case Stage::WaitForToken: {
+ MOZ_ASSERT(!data.mToken);
+ MOZ_ASSERT(data.mTokenPromise.Exists());
+ break;
+ }
+
+ case Stage::CreateDecoder: {
+ MOZ_ASSERT(data.mToken);
+ MOZ_ASSERT(!data.mDecoder);
+ MOZ_ASSERT(!data.mInitPromise.Exists());
+
+ MediaResult rv = DoCreateDecoder(aTrack);
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Error constructing decoders");
+ data.mToken = nullptr;
+ data.mStage = Stage::None;
+ mOwner->NotifyError(aTrack, rv);
+ return;
+ }
+
+ data.mDecoder = new Wrapper(data.mDecoder.forget(), data.mToken.forget());
+ DoInitDecoder(aTrack);
+ data.mStage = Stage::WaitForInit;
+ break;
+ }
+
+ case Stage::WaitForInit: {
+ MOZ_ASSERT(data.mDecoder);
+ MOZ_ASSERT(data.mInitPromise.Exists());
+ break;
+ }
+ }
+}
+
+MediaResult
+MediaFormatReader::DecoderFactory::DoCreateDecoder(TrackType aTrack)
+{
+ auto& ownerData = mOwner->GetDecoderData(aTrack);
+ auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
+
+ auto decoderCreatingError = "error creating audio decoder";
+ MediaResult result = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, decoderCreatingError);
+
+ if (!mOwner->mPlatform) {
+ mOwner->mPlatform = new PDMFactory();
+ if (mOwner->IsEncrypted()) {
+ MOZ_ASSERT(mOwner->mCDMProxy);
+ mOwner->mPlatform->SetCDMProxy(mOwner->mCDMProxy);
+ }
+ }
+
+ switch (aTrack) {
+ case TrackInfo::kAudioTrack: {
+ data.mDecoder = mOwner->mPlatform->CreateDecoder({
+ ownerData.mInfo
+ ? *ownerData.mInfo->GetAsAudioInfo()
+ : *ownerData.mOriginalInfo->GetAsAudioInfo(),
+ ownerData.mTaskQueue,
+ ownerData.mCallback.get(),
+ mOwner->mCrashHelper,
+ ownerData.mIsBlankDecode,
+ &result
+ });
+ break;
+ }
+
+ case TrackType::kVideoTrack: {
+ // Decoders use the layers backend to decide if they can use hardware decoding,
+ // so specify LAYERS_NONE if we want to forcibly disable it.
+ data.mDecoder = mOwner->mPlatform->CreateDecoder({
+ ownerData.mInfo
+ ? *ownerData.mInfo->GetAsVideoInfo()
+ : *ownerData.mOriginalInfo->GetAsVideoInfo(),
+ ownerData.mTaskQueue,
+ ownerData.mCallback.get(),
+ mOwner->mKnowsCompositor,
+ mOwner->GetImageContainer(),
+ mOwner->mCrashHelper,
+ ownerData.mIsBlankDecode,
+ &result
+ });
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ if (data.mDecoder) {
+ result = MediaResult(NS_OK);
+ return result;
+ }
+
+ ownerData.mDescription = decoderCreatingError;
+ return result;
+}
+
+void
+MediaFormatReader::DecoderFactory::DoInitDecoder(TrackType aTrack)
+{
+ auto& ownerData = mOwner->GetDecoderData(aTrack);
+ auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
+
+ data.mInitPromise.Begin(data.mDecoder->Init()->Then(
+ mOwner->OwnerThread(), __func__,
+ [this, &data, &ownerData] (TrackType aTrack) {
+ data.mInitPromise.Complete();
+ data.mStage = Stage::None;
+ MonitorAutoLock mon(ownerData.mMonitor);
+ ownerData.mDecoder = data.mDecoder.forget();
+ ownerData.mDescription = ownerData.mDecoder->GetDescriptionName();
+ mOwner->SetVideoDecodeThreshold();
+ mOwner->ScheduleUpdate(aTrack);
+ },
+ [this, &data, aTrack] (MediaResult aError) {
+ data.mInitPromise.Complete();
+ data.mStage = Stage::None;
+ data.mDecoder->Shutdown();
+ data.mDecoder = nullptr;
+ mOwner->NotifyError(aTrack, aError);
+ }));
+}
+
+static const char*
+TrackTypeToStr(TrackInfo::TrackType aTrack)
+{
+ MOZ_ASSERT(aTrack == TrackInfo::kAudioTrack ||
+ aTrack == TrackInfo::kVideoTrack ||
+ aTrack == TrackInfo::kTextTrack);
+ switch (aTrack) {
+ case TrackInfo::kAudioTrack:
+ return "Audio";
+ case TrackInfo::kVideoTrack:
+ return "Video";
+ case TrackInfo::kTextTrack:
+ return "Text";
+ default:
+ return "Unknown";
+ }
+}
+
+MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder,
+ MediaDataDemuxer* aDemuxer,
+ VideoFrameContainer* aVideoFrameContainer)
+ : MediaDecoderReader(aDecoder)
+ , mAudio(this, MediaData::AUDIO_DATA,
+ Preferences::GetUint("media.audio-max-decode-error", 3))
+ , mVideo(this, MediaData::VIDEO_DATA,
+ Preferences::GetUint("media.video-max-decode-error", 2))
+ , mDemuxer(aDemuxer)
+ , mDemuxerInitDone(false)
+ , mLastReportedNumDecodedFrames(0)
+ , mPreviousDecodedKeyframeTime_us(sNoPreviousDecodedKeyframe)
+ , mInitDone(false)
+ , mTrackDemuxersMayBlock(false)
+ , mDemuxOnly(false)
+ , mSeekScheduled(false)
+ , mVideoFrameContainer(aVideoFrameContainer)
+ , mDecoderFactory(new DecoderFactory(this))
+{
+ MOZ_ASSERT(aDemuxer);
+ MOZ_COUNT_CTOR(MediaFormatReader);
+
+ if (aDecoder && aDecoder->CompositorUpdatedEvent()) {
+ mCompositorUpdatedListener =
+ aDecoder->CompositorUpdatedEvent()->Connect(
+ mTaskQueue, this, &MediaFormatReader::NotifyCompositorUpdated);
+ }
+}
+
+MediaFormatReader::~MediaFormatReader()
+{
+ MOZ_COUNT_DTOR(MediaFormatReader);
+}
+
+RefPtr<ShutdownPromise>
+MediaFormatReader::Shutdown()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ mDecoderFactory = nullptr;
+ mDemuxerInitRequest.DisconnectIfExists();
+ mMetadataPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ mSeekPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ mSkipRequest.DisconnectIfExists();
+
+ if (mAudio.mDecoder) {
+ Reset(TrackInfo::kAudioTrack);
+ if (mAudio.HasPromise()) {
+ mAudio.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+ mAudio.ShutdownDecoder();
+ }
+ if (mAudio.mTrackDemuxer) {
+ mAudio.ResetDemuxer();
+ mAudio.mTrackDemuxer->BreakCycles();
+ mAudio.mTrackDemuxer = nullptr;
+ }
+ if (mAudio.mTaskQueue) {
+ mAudio.mTaskQueue->BeginShutdown();
+ mAudio.mTaskQueue->AwaitShutdownAndIdle();
+ mAudio.mTaskQueue = nullptr;
+ }
+ MOZ_ASSERT(!mAudio.HasPromise());
+
+ if (mVideo.mDecoder) {
+ Reset(TrackInfo::kVideoTrack);
+ if (mVideo.HasPromise()) {
+ mVideo.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+ mVideo.ShutdownDecoder();
+ }
+ if (mVideo.mTrackDemuxer) {
+ mVideo.ResetDemuxer();
+ mVideo.mTrackDemuxer->BreakCycles();
+ mVideo.mTrackDemuxer = nullptr;
+ }
+ if (mVideo.mTaskQueue) {
+ mVideo.mTaskQueue->BeginShutdown();
+ mVideo.mTaskQueue->AwaitShutdownAndIdle();
+ mVideo.mTaskQueue = nullptr;
+ }
+ MOZ_ASSERT(!mVideo.HasPromise());
+
+ mDemuxer = nullptr;
+ mPlatform = nullptr;
+ mVideoFrameContainer = nullptr;
+
+ mCompositorUpdatedListener.DisconnectIfExists();
+
+ return MediaDecoderReader::Shutdown();
+}
+
+void
+MediaFormatReader::InitLayersBackendType()
+{
+ // Extract the layer manager backend type so that platform decoders
+ // can determine whether it's worthwhile using hardware accelerated
+ // video decoding.
+ if (!mDecoder) {
+ return;
+ }
+ MediaDecoderOwner* owner = mDecoder->GetOwner();
+ if (!owner) {
+ NS_WARNING("MediaFormatReader without a decoder owner, can't get HWAccel");
+ return;
+ }
+
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ NS_ENSURE_TRUE_VOID(element);
+
+ RefPtr<LayerManager> layerManager =
+ nsContentUtils::LayerManagerForDocument(element->OwnerDoc());
+ NS_ENSURE_TRUE_VOID(layerManager);
+
+ mKnowsCompositor = layerManager->AsShadowForwarder();
+}
+
+nsresult
+MediaFormatReader::InitInternal()
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread.");
+
+ InitLayersBackendType();
+
+ mAudio.mTaskQueue =
+ new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
+ mVideo.mTaskQueue =
+ new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
+
+ // Note: GMPCrashHelper must be created on main thread, as it may use
+ // weak references, which aren't threadsafe.
+ mCrashHelper = mDecoder->GetCrashHelper();
+
+ return NS_OK;
+}
+
+class DispatchKeyNeededEvent : public Runnable {
+public:
+ DispatchKeyNeededEvent(AbstractMediaDecoder* aDecoder,
+ nsTArray<uint8_t>& aInitData,
+ const nsString& aInitDataType)
+ : mDecoder(aDecoder)
+ , mInitData(aInitData)
+ , mInitDataType(aInitDataType)
+ {
+ }
+ NS_IMETHOD Run() override {
+ // Note: Null check the owner, as the decoder could have been shutdown
+ // since this event was dispatched.
+ MediaDecoderOwner* owner = mDecoder->GetOwner();
+ if (owner) {
+ owner->DispatchEncrypted(mInitData, mInitDataType);
+ }
+ mDecoder = nullptr;
+ return NS_OK;
+ }
+private:
+ RefPtr<AbstractMediaDecoder> mDecoder;
+ nsTArray<uint8_t> mInitData;
+ nsString mInitDataType;
+};
+
+void
+MediaFormatReader::SetCDMProxy(CDMProxy* aProxy)
+{
+ RefPtr<CDMProxy> proxy = aProxy;
+ RefPtr<MediaFormatReader> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ MOZ_ASSERT(self->OnTaskQueue());
+ self->mCDMProxy = proxy;
+ });
+ OwnerThread()->Dispatch(r.forget());
+}
+
+bool
+MediaFormatReader::IsWaitingOnCDMResource() {
+ MOZ_ASSERT(OnTaskQueue());
+ return IsEncrypted() && !mCDMProxy;
+}
+
+RefPtr<MediaDecoderReader::MetadataPromise>
+MediaFormatReader::AsyncReadMetadata()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ MOZ_DIAGNOSTIC_ASSERT(mMetadataPromise.IsEmpty());
+
+ if (mInitDone) {
+ // We are returning from dormant.
+ RefPtr<MetadataHolder> metadata = new MetadataHolder();
+ metadata->mInfo = mInfo;
+ metadata->mTags = nullptr;
+ return MetadataPromise::CreateAndResolve(metadata, __func__);
+ }
+
+ RefPtr<MetadataPromise> p = mMetadataPromise.Ensure(__func__);
+
+ mDemuxerInitRequest.Begin(mDemuxer->Init()
+ ->Then(OwnerThread(), __func__, this,
+ &MediaFormatReader::OnDemuxerInitDone,
+ &MediaFormatReader::OnDemuxerInitFailed));
+ return p;
+}
+
+void
+MediaFormatReader::OnDemuxerInitDone(nsresult)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mDemuxerInitRequest.Complete();
+
+ mDemuxerInitDone = true;
+
+ UniquePtr<MetadataTags> tags(MakeUnique<MetadataTags>());
+
+ RefPtr<PDMFactory> platform;
+ if (!IsWaitingOnCDMResource()) {
+ platform = new PDMFactory();
+ }
+
+ // To decode, we need valid video and a place to put it.
+ bool videoActive = !!mDemuxer->GetNumberTracks(TrackInfo::kVideoTrack) &&
+ GetImageContainer();
+
+ if (videoActive) {
+ // We currently only handle the first video track.
+ mVideo.mTrackDemuxer = mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ if (!mVideo.mTrackDemuxer) {
+ mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ return;
+ }
+
+ UniquePtr<TrackInfo> videoInfo = mVideo.mTrackDemuxer->GetInfo();
+ videoActive = videoInfo && videoInfo->IsValid();
+ if (videoActive) {
+ if (platform && !platform->SupportsMimeType(videoInfo->mMimeType, nullptr)) {
+ // We have no decoder for this track. Error.
+ mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ return;
+ }
+ mInfo.mVideo = *videoInfo->GetAsVideoInfo();
+ for (const MetadataTag& tag : videoInfo->mTags) {
+ tags->Put(tag.mKey, tag.mValue);
+ }
+ mVideo.mOriginalInfo = Move(videoInfo);
+ mVideo.mCallback = new DecoderCallback(this, TrackInfo::kVideoTrack);
+ mVideo.mTimeRanges = mVideo.mTrackDemuxer->GetBuffered();
+ mTrackDemuxersMayBlock |= mVideo.mTrackDemuxer->GetSamplesMayBlock();
+ } else {
+ mVideo.mTrackDemuxer->BreakCycles();
+ mVideo.mTrackDemuxer = nullptr;
+ }
+ }
+
+ bool audioActive = !!mDemuxer->GetNumberTracks(TrackInfo::kAudioTrack);
+ if (audioActive) {
+ mAudio.mTrackDemuxer = mDemuxer->GetTrackDemuxer(TrackInfo::kAudioTrack, 0);
+ if (!mAudio.mTrackDemuxer) {
+ mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ return;
+ }
+
+ UniquePtr<TrackInfo> audioInfo = mAudio.mTrackDemuxer->GetInfo();
+ // We actively ignore audio tracks that we know we can't play.
+ audioActive = audioInfo && audioInfo->IsValid() &&
+ (!platform ||
+ platform->SupportsMimeType(audioInfo->mMimeType, nullptr));
+
+ if (audioActive) {
+ mInfo.mAudio = *audioInfo->GetAsAudioInfo();
+ for (const MetadataTag& tag : audioInfo->mTags) {
+ tags->Put(tag.mKey, tag.mValue);
+ }
+ mAudio.mOriginalInfo = Move(audioInfo);
+ mAudio.mCallback = new DecoderCallback(this, TrackInfo::kAudioTrack);
+ mAudio.mTimeRanges = mAudio.mTrackDemuxer->GetBuffered();
+ mTrackDemuxersMayBlock |= mAudio.mTrackDemuxer->GetSamplesMayBlock();
+ } else {
+ mAudio.mTrackDemuxer->BreakCycles();
+ mAudio.mTrackDemuxer = nullptr;
+ }
+ }
+
+ UniquePtr<EncryptionInfo> crypto = mDemuxer->GetCrypto();
+ if (mDecoder && crypto && crypto->IsEncrypted()) {
+ // Try and dispatch 'encrypted'. Won't go if ready state still HAVE_NOTHING.
+ for (uint32_t i = 0; i < crypto->mInitDatas.Length(); i++) {
+ NS_DispatchToMainThread(
+ new DispatchKeyNeededEvent(mDecoder, crypto->mInitDatas[i].mInitData, crypto->mInitDatas[i].mType));
+ }
+ mInfo.mCrypto = *crypto;
+ }
+
+ int64_t videoDuration = HasVideo() ? mInfo.mVideo.mDuration : 0;
+ int64_t audioDuration = HasAudio() ? mInfo.mAudio.mDuration : 0;
+
+ int64_t duration = std::max(videoDuration, audioDuration);
+ if (duration != -1) {
+ mInfo.mMetadataDuration = Some(TimeUnit::FromMicroseconds(duration));
+ }
+
+ mInfo.mMediaSeekable = mDemuxer->IsSeekable();
+ mInfo.mMediaSeekableOnlyInBufferedRanges =
+ mDemuxer->IsSeekableOnlyInBufferedRanges();
+
+ if (!videoActive && !audioActive) {
+ mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ return;
+ }
+
+ mInitDone = true;
+ RefPtr<MetadataHolder> metadata = new MetadataHolder();
+ metadata->mInfo = mInfo;
+ metadata->mTags = tags->Count() ? tags.release() : nullptr;
+ mMetadataPromise.Resolve(metadata, __func__);
+}
+
+bool
+MediaFormatReader::IsEncrypted() const
+{
+ return (HasAudio() && mInfo.mAudio.mCrypto.mValid) ||
+ (HasVideo() && mInfo.mVideo.mCrypto.mValid);
+}
+
+void
+MediaFormatReader::OnDemuxerInitFailed(const MediaResult& aError)
+{
+ mDemuxerInitRequest.Complete();
+ mMetadataPromise.Reject(aError, __func__);
+}
+
+void
+MediaFormatReader::ReadUpdatedMetadata(MediaInfo* aInfo)
+{
+ *aInfo = mInfo;
+}
+
+MediaFormatReader::DecoderData&
+MediaFormatReader::GetDecoderData(TrackType aTrack)
+{
+ MOZ_ASSERT(aTrack == TrackInfo::kAudioTrack ||
+ aTrack == TrackInfo::kVideoTrack);
+ if (aTrack == TrackInfo::kAudioTrack) {
+ return mAudio;
+ }
+ return mVideo;
+}
+
+bool
+MediaFormatReader::ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold)
+{
+ MOZ_ASSERT(HasVideo());
+ media::TimeUnit nextKeyframe;
+ nsresult rv = mVideo.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe);
+ if (NS_FAILED(rv)) {
+ return aSkipToNextKeyframe;
+ }
+ return (nextKeyframe < aTimeThreshold ||
+ (mVideo.mTimeThreshold &&
+ mVideo.mTimeThreshold.ref().EndTime() < aTimeThreshold)) &&
+ nextKeyframe.ToMicroseconds() >= 0 && !nextKeyframe.IsInfinite();
+}
+
+RefPtr<MediaDecoderReader::MediaDataPromise>
+MediaFormatReader::RequestVideoData(bool aSkipToNextKeyframe,
+ int64_t aTimeThreshold)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(mSeekPromise.IsEmpty(), "No sample requests allowed while seeking");
+ MOZ_DIAGNOSTIC_ASSERT(!mVideo.HasPromise(), "No duplicate sample requests");
+ MOZ_DIAGNOSTIC_ASSERT(!mVideo.mSeekRequest.Exists() ||
+ mVideo.mTimeThreshold.isSome());
+ MOZ_DIAGNOSTIC_ASSERT(!IsSeeking(), "called mid-seek");
+ LOGV("RequestVideoData(%d, %lld)", aSkipToNextKeyframe, aTimeThreshold);
+
+ if (!HasVideo()) {
+ LOG("called with no video track");
+ return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (IsSeeking()) {
+ LOG("called mid-seek. Rejecting.");
+ return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+
+ if (mShutdown) {
+ NS_WARNING("RequestVideoData on shutdown MediaFormatReader!");
+ return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+
+ media::TimeUnit timeThreshold{media::TimeUnit::FromMicroseconds(aTimeThreshold)};
+ // Ensure we have no pending seek going as ShouldSkip could return out of date
+ // information.
+ if (!mVideo.HasInternalSeekPending() &&
+ ShouldSkip(aSkipToNextKeyframe, timeThreshold)) {
+ RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__);
+ SkipVideoDemuxToNextKeyFrame(timeThreshold);
+ return p;
+ }
+
+ RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__);
+ ScheduleUpdate(TrackInfo::kVideoTrack);
+
+ return p;
+}
+
+void
+MediaFormatReader::OnDemuxFailed(TrackType aTrack, const MediaResult& aError)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOG("Failed to demux %s, failure:%u",
+ aTrack == TrackType::kVideoTrack ? "video" : "audio", aError.Code());
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mDemuxRequest.Complete();
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ if (!decoder.mWaitingForData) {
+ decoder.mNeedDraining = true;
+ }
+ NotifyEndOfStream(aTrack);
+ break;
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+ if (!decoder.mWaitingForData) {
+ decoder.mNeedDraining = true;
+ }
+ NotifyWaitingForData(aTrack);
+ break;
+ case NS_ERROR_DOM_MEDIA_CANCELED:
+ if (decoder.HasPromise()) {
+ decoder.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+ break;
+ default:
+ NotifyError(aTrack, aError);
+ break;
+ }
+}
+
+void
+MediaFormatReader::DoDemuxVideo()
+{
+ mVideo.mDemuxRequest.Begin(mVideo.mTrackDemuxer->GetSamples(1)
+ ->Then(OwnerThread(), __func__, this,
+ &MediaFormatReader::OnVideoDemuxCompleted,
+ &MediaFormatReader::OnVideoDemuxFailed));
+}
+
+void
+MediaFormatReader::OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
+{
+ LOGV("%d video samples demuxed (sid:%d)",
+ aSamples->mSamples.Length(),
+ aSamples->mSamples[0]->mTrackInfo ? aSamples->mSamples[0]->mTrackInfo->GetID() : 0);
+ mVideo.mDemuxRequest.Complete();
+ mVideo.mQueuedSamples.AppendElements(aSamples->mSamples);
+ ScheduleUpdate(TrackInfo::kVideoTrack);
+}
+
+RefPtr<MediaDecoderReader::MediaDataPromise>
+MediaFormatReader::RequestAudioData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(!mAudio.HasPromise(), "No duplicate sample requests");
+ MOZ_DIAGNOSTIC_ASSERT(IsVideoSeeking() || mSeekPromise.IsEmpty(),
+ "No sample requests allowed while seeking");
+ MOZ_DIAGNOSTIC_ASSERT(IsVideoSeeking() ||
+ !mAudio.mSeekRequest.Exists() ||
+ mAudio.mTimeThreshold.isSome());
+ MOZ_DIAGNOSTIC_ASSERT(IsVideoSeeking() || !IsSeeking(), "called mid-seek");
+ LOGV("");
+
+ if (!HasAudio()) {
+ LOG("called with no audio track");
+ return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (IsSeeking()) {
+ LOG("called mid-seek. Rejecting.");
+ return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+
+ if (mShutdown) {
+ NS_WARNING("RequestAudioData on shutdown MediaFormatReader!");
+ return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+
+ RefPtr<MediaDataPromise> p = mAudio.EnsurePromise(__func__);
+ ScheduleUpdate(TrackInfo::kAudioTrack);
+
+ return p;
+}
+
+void
+MediaFormatReader::DoDemuxAudio()
+{
+ mAudio.mDemuxRequest.Begin(mAudio.mTrackDemuxer->GetSamples(1)
+ ->Then(OwnerThread(), __func__, this,
+ &MediaFormatReader::OnAudioDemuxCompleted,
+ &MediaFormatReader::OnAudioDemuxFailed));
+}
+
+void
+MediaFormatReader::OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
+{
+ LOGV("%d audio samples demuxed (sid:%d)",
+ aSamples->mSamples.Length(),
+ aSamples->mSamples[0]->mTrackInfo ? aSamples->mSamples[0]->mTrackInfo->GetID() : 0);
+ mAudio.mDemuxRequest.Complete();
+ mAudio.mQueuedSamples.AppendElements(aSamples->mSamples);
+ ScheduleUpdate(TrackInfo::kAudioTrack);
+}
+
+void
+MediaFormatReader::NotifyNewOutput(TrackType aTrack, MediaData* aSample)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOGV("Received new %s sample time:%lld duration:%lld",
+ TrackTypeToStr(aTrack), aSample->mTime, aSample->mDuration);
+ auto& decoder = GetDecoderData(aTrack);
+ if (!decoder.mOutputRequested) {
+ LOG("MediaFormatReader produced output while flushing, discarding.");
+ return;
+ }
+ decoder.mOutput.AppendElement(aSample);
+ decoder.mNumSamplesOutput++;
+ decoder.mNumOfConsecutiveError = 0;
+ ScheduleUpdate(aTrack);
+}
+
+void
+MediaFormatReader::NotifyInputExhausted(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOGV("Decoder has requested more %s data", TrackTypeToStr(aTrack));
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mDecodePending = false;
+ ScheduleUpdate(aTrack);
+}
+
+void
+MediaFormatReader::NotifyDrainComplete(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ LOG("%s", TrackTypeToStr(aTrack));
+ if (!decoder.mOutputRequested) {
+ LOG("MediaFormatReader called DrainComplete() before flushing, ignoring.");
+ return;
+ }
+ decoder.mDrainComplete = true;
+ ScheduleUpdate(aTrack);
+}
+
+void
+MediaFormatReader::NotifyError(TrackType aTrack, const MediaResult& aError)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ NS_WARNING(aError.Description().get());
+ LOGV("%s Decoding error", TrackTypeToStr(aTrack));
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mError = decoder.HasFatalError() ? decoder.mError : Some(aError);
+ ScheduleUpdate(aTrack);
+}
+
+void
+MediaFormatReader::NotifyWaitingForData(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mWaitingForData = true;
+ if (decoder.mTimeThreshold) {
+ decoder.mTimeThreshold.ref().mWaiting = true;
+ }
+ ScheduleUpdate(aTrack);
+}
+
+void
+MediaFormatReader::NotifyWaitingForKey(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ if (mDecoder) {
+ mDecoder->NotifyWaitingForKey();
+ }
+ if (!decoder.mDecodePending) {
+ LOGV("WaitingForKey received while no pending decode. Ignoring");
+ }
+ decoder.mWaitingForKey = true;
+ ScheduleUpdate(aTrack);
+}
+
+void
+MediaFormatReader::NotifyEndOfStream(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mDemuxEOS = true;
+ ScheduleUpdate(aTrack);
+}
+
+bool
+MediaFormatReader::NeedInput(DecoderData& aDecoder)
+{
+ // To account for H.264 streams which may require a longer
+ // run of input than we input, decoders fire an "input exhausted" callback.
+ // The decoder will not be fed a new raw sample until InputExhausted
+ // has been called.
+ return
+ (aDecoder.HasPromise() || aDecoder.mTimeThreshold.isSome()) &&
+ !aDecoder.HasPendingDrain() &&
+ !aDecoder.HasFatalError() &&
+ !aDecoder.mDemuxRequest.Exists() &&
+ !aDecoder.mOutput.Length() &&
+ !aDecoder.HasInternalSeekPending() &&
+ !aDecoder.mDecodePending;
+}
+
+void
+MediaFormatReader::ScheduleUpdate(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (mShutdown) {
+ return;
+ }
+ auto& decoder = GetDecoderData(aTrack);
+ if (decoder.mUpdateScheduled) {
+ return;
+ }
+ LOGV("SchedulingUpdate(%s)", TrackTypeToStr(aTrack));
+ decoder.mUpdateScheduled = true;
+ RefPtr<nsIRunnable> task(
+ NewRunnableMethod<TrackType>(this, &MediaFormatReader::Update, aTrack));
+ OwnerThread()->Dispatch(task.forget());
+}
+
+bool
+MediaFormatReader::UpdateReceivedNewData(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+
+ if (!decoder.mReceivedNewData) {
+ return false;
+ }
+
+ // Update our cached TimeRange.
+ decoder.mTimeRanges = decoder.mTrackDemuxer->GetBuffered();
+
+ // We do not want to clear mWaitingForData while there are pending
+ // demuxing or seeking operations that could affect the value of this flag.
+ // This is in order to ensure that we will retry once they complete as we may
+ // now have new data that could potentially allow those operations to
+ // successfully complete if tried again.
+ if (decoder.mSeekRequest.Exists()) {
+ // Nothing more to do until this operation complete.
+ return true;
+ }
+
+ if (aTrack == TrackType::kVideoTrack && mSkipRequest.Exists()) {
+ LOGV("Skipping in progress, nothing more to do");
+ return true;
+ }
+
+ if (decoder.mDemuxRequest.Exists()) {
+ // We may have pending operations to process, so we want to continue
+ // after UpdateReceivedNewData returns.
+ return false;
+ }
+
+ if (decoder.HasPendingDrain()) {
+ // We do not want to clear mWaitingForData or mDemuxEOS while
+ // a drain is in progress in order to properly complete the operation.
+ return false;
+ }
+
+ bool hasLastEnd;
+ media::TimeUnit lastEnd = decoder.mTimeRanges.GetEnd(&hasLastEnd);
+ if (hasLastEnd) {
+ if (decoder.mLastTimeRangesEnd && decoder.mLastTimeRangesEnd.ref() < lastEnd) {
+ // New data was added after our previous end, we can clear the EOS flag.
+ decoder.mDemuxEOS = false;
+ }
+ decoder.mLastTimeRangesEnd = Some(lastEnd);
+ }
+
+ decoder.mReceivedNewData = false;
+ if (decoder.mTimeThreshold) {
+ decoder.mTimeThreshold.ref().mWaiting = false;
+ }
+ decoder.mWaitingForData = false;
+
+ if (decoder.HasFatalError()) {
+ return false;
+ }
+
+ if (!mSeekPromise.IsEmpty() &&
+ (!IsVideoSeeking() || aTrack == TrackInfo::kVideoTrack)) {
+ MOZ_ASSERT(!decoder.HasPromise());
+ MOZ_DIAGNOSTIC_ASSERT((IsVideoSeeking() || !mAudio.mTimeThreshold) &&
+ !mVideo.mTimeThreshold,
+ "InternalSeek must have been aborted when Seek was first called");
+ MOZ_DIAGNOSTIC_ASSERT((IsVideoSeeking() || !mAudio.HasWaitingPromise()) &&
+ !mVideo.HasWaitingPromise(),
+ "Waiting promises must have been rejected when Seek was first called");
+ if (mVideo.mSeekRequest.Exists() ||
+ (!IsVideoSeeking() && mAudio.mSeekRequest.Exists())) {
+ // Already waiting for a seek to complete. Nothing more to do.
+ return true;
+ }
+ LOG("Attempting Seek");
+ ScheduleSeek();
+ return true;
+ }
+ if (decoder.HasInternalSeekPending() || decoder.HasWaitingPromise()) {
+ if (decoder.HasInternalSeekPending()) {
+ LOG("Attempting Internal Seek");
+ InternalSeek(aTrack, decoder.mTimeThreshold.ref());
+ }
+ if (decoder.HasWaitingPromise() && !decoder.IsWaiting()) {
+ MOZ_ASSERT(!decoder.HasPromise());
+ LOG("We have new data. Resolving WaitingPromise");
+ decoder.mWaitingPromise.Resolve(decoder.mType, __func__);
+ }
+ return true;
+ }
+ return false;
+}
+
+void
+MediaFormatReader::RequestDemuxSamples(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ MOZ_ASSERT(!decoder.mDemuxRequest.Exists());
+
+ if (!decoder.mQueuedSamples.IsEmpty()) {
+ // No need to demux new samples.
+ return;
+ }
+
+ if (decoder.mDemuxEOS) {
+ // Nothing left to demux.
+ // We do not want to attempt to demux while in waiting for data mode
+ // as it would retrigger an unecessary drain.
+ return;
+ }
+
+ LOGV("Requesting extra demux %s", TrackTypeToStr(aTrack));
+ if (aTrack == TrackInfo::kVideoTrack) {
+ DoDemuxVideo();
+ } else {
+ DoDemuxAudio();
+ }
+}
+
+void
+MediaFormatReader::DecodeDemuxedSamples(TrackType aTrack,
+ MediaRawData* aSample)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mDecoder->Input(aSample);
+ decoder.mDecodePending = true;
+}
+
+void
+MediaFormatReader::HandleDemuxedSamples(TrackType aTrack,
+ AbstractMediaDecoder::AutoNotifyDecoded& aA)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ auto& decoder = GetDecoderData(aTrack);
+
+ if (decoder.mQueuedSamples.IsEmpty()) {
+ return;
+ }
+
+ if (!decoder.mDecoder) {
+ mDecoderFactory->CreateDecoder(aTrack);
+ return;
+ }
+
+ if (!ForceZeroStartTime() && decoder.mFirstDemuxedSampleTime.isNothing()) {
+ decoder.mFirstDemuxedSampleTime.emplace(
+ media::TimeUnit::FromMicroseconds(decoder.mQueuedSamples[0]->mTime));
+ }
+
+ LOGV("Giving %s input to decoder", TrackTypeToStr(aTrack));
+
+ // Decode all our demuxed frames.
+ bool samplesPending = false;
+ while (decoder.mQueuedSamples.Length()) {
+ RefPtr<MediaRawData> sample = decoder.mQueuedSamples[0];
+ RefPtr<SharedTrackInfo> info = sample->mTrackInfo;
+
+ if (info && decoder.mLastStreamSourceID != info->GetID()) {
+ if (samplesPending) {
+ // Let existing samples complete their decoding. We'll resume later.
+ return;
+ }
+
+ if (decoder.mNextStreamSourceID.isNothing() ||
+ decoder.mNextStreamSourceID.ref() != info->GetID()) {
+ LOG("%s stream id has changed from:%d to:%d, draining decoder.",
+ TrackTypeToStr(aTrack), decoder.mLastStreamSourceID,
+ info->GetID());
+ decoder.mNeedDraining = true;
+ decoder.mNextStreamSourceID = Some(info->GetID());
+ ScheduleUpdate(aTrack);
+ return;
+ }
+
+ LOG("%s stream id has changed from:%d to:%d, recreating decoder.",
+ TrackTypeToStr(aTrack), decoder.mLastStreamSourceID,
+ info->GetID());
+ decoder.mLastStreamSourceID = info->GetID();
+ decoder.mNextStreamSourceID.reset();
+ // Reset will clear our array of queued samples. So make a copy now.
+ nsTArray<RefPtr<MediaRawData>> samples{decoder.mQueuedSamples};
+ Reset(aTrack);
+ decoder.ShutdownDecoder();
+ decoder.mInfo = info;
+ if (sample->mKeyframe) {
+ decoder.mQueuedSamples.AppendElements(Move(samples));
+ ScheduleUpdate(aTrack);
+ } else {
+ TimeInterval time =
+ TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
+ TimeUnit::FromMicroseconds(sample->GetEndTime()));
+ InternalSeekTarget seekTarget =
+ decoder.mTimeThreshold.refOr(InternalSeekTarget(time, false));
+ LOG("Stream change occurred on a non-keyframe. Seeking to:%lld",
+ sample->mTime);
+ InternalSeek(aTrack, seekTarget);
+ }
+ return;
+ }
+
+ LOGV("Input:%lld (dts:%lld kf:%d)",
+ sample->mTime, sample->mTimecode, sample->mKeyframe);
+ decoder.mOutputRequested = true;
+ decoder.mNumSamplesInput++;
+ decoder.mSizeOfQueue++;
+ if (aTrack == TrackInfo::kVideoTrack) {
+ aA.mStats.mParsedFrames++;
+ }
+
+ if (mDemuxOnly) {
+ ReturnOutput(sample, aTrack);
+ } else {
+ DecodeDemuxedSamples(aTrack, sample);
+ }
+
+ decoder.mQueuedSamples.RemoveElementAt(0);
+ if (mDemuxOnly) {
+ // If demuxed-only case, ReturnOutput will resolve with one demuxed data.
+ // Then we should stop doing the iteration.
+ return;
+ }
+ samplesPending = true;
+ }
+}
+
+void
+MediaFormatReader::InternalSeek(TrackType aTrack, const InternalSeekTarget& aTarget)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOG("%s internal seek to %f",
+ TrackTypeToStr(aTrack), aTarget.Time().ToSeconds());
+
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.Flush();
+ decoder.ResetDemuxer();
+ decoder.mTimeThreshold = Some(aTarget);
+ RefPtr<MediaFormatReader> self = this;
+ decoder.mSeekRequest.Begin(decoder.mTrackDemuxer->Seek(decoder.mTimeThreshold.ref().Time())
+ ->Then(OwnerThread(), __func__,
+ [self, aTrack] (media::TimeUnit aTime) {
+ auto& decoder = self->GetDecoderData(aTrack);
+ decoder.mSeekRequest.Complete();
+ MOZ_ASSERT(decoder.mTimeThreshold,
+ "Seek promise must be disconnected when timethreshold is reset");
+ decoder.mTimeThreshold.ref().mHasSeeked = true;
+ self->SetVideoDecodeThreshold();
+ self->ScheduleUpdate(aTrack);
+ },
+ [self, aTrack] (const MediaResult& aError) {
+ auto& decoder = self->GetDecoderData(aTrack);
+ decoder.mSeekRequest.Complete();
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+ self->NotifyWaitingForData(aTrack);
+ break;
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ decoder.mTimeThreshold.reset();
+ self->NotifyEndOfStream(aTrack);
+ break;
+ case NS_ERROR_DOM_MEDIA_CANCELED:
+ decoder.mTimeThreshold.reset();
+ break;
+ default:
+ decoder.mTimeThreshold.reset();
+ self->NotifyError(aTrack, aError);
+ break;
+ }
+ }));
+}
+
+void
+MediaFormatReader::DrainDecoder(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ auto& decoder = GetDecoderData(aTrack);
+ if (!decoder.mNeedDraining || decoder.mDraining) {
+ return;
+ }
+ decoder.mNeedDraining = false;
+ // mOutputRequest must be set, otherwise NotifyDrainComplete()
+ // may reject the drain if a Flush recently occurred.
+ decoder.mOutputRequested = true;
+ if (!decoder.mDecoder ||
+ decoder.mNumSamplesInput == decoder.mNumSamplesOutput) {
+ // No frames to drain.
+ NotifyDrainComplete(aTrack);
+ return;
+ }
+ decoder.mDecoder->Drain();
+ decoder.mDraining = true;
+ LOG("Requesting %s decoder to drain", TrackTypeToStr(aTrack));
+}
+
+void
+MediaFormatReader::Update(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (mShutdown) {
+ return;
+ }
+
+ LOGV("Processing update for %s", TrackTypeToStr(aTrack));
+
+ bool needOutput = false;
+ auto& decoder = GetDecoderData(aTrack);
+ decoder.mUpdateScheduled = false;
+
+ if (!mInitDone) {
+ return;
+ }
+
+ if (aTrack == TrackType::kVideoTrack && mSkipRequest.Exists()) {
+ LOGV("Skipping in progress, nothing more to do");
+ return;
+ }
+
+ if (decoder.HasWaitingPromise() && decoder.mDrainComplete) {
+ // This situation will occur when a change of stream ID occurred during
+ // internal seeking following a gap encountered in the data, a drain was
+ // requested and has now completed. We need to complete the draining process
+ // so that the new data can be processed.
+ // We can complete the draining operation now as we have no pending
+ // operation when a waiting promise is pending.
+ decoder.mDrainComplete = false;
+ decoder.mDraining = false;
+ }
+
+ if (UpdateReceivedNewData(aTrack)) {
+ LOGV("Nothing more to do");
+ return;
+ }
+
+ if (decoder.mSeekRequest.Exists()) {
+ LOGV("Seeking hasn't completed, nothing more to do");
+ return;
+ }
+
+ MOZ_DIAGNOSTIC_ASSERT(!decoder.HasInternalSeekPending() ||
+ (!decoder.mOutput.Length() &&
+ !decoder.mQueuedSamples.Length()),
+ "No frames can be demuxed or decoded while an internal seek is pending");
+
+ // Record number of frames decoded and parsed. Automatically update the
+ // stats counters using the AutoNotifyDecoded stack-based class.
+ AbstractMediaDecoder::AutoNotifyDecoded a(mDecoder);
+
+ // Drop any frames found prior our internal seek target.
+ while (decoder.mTimeThreshold && decoder.mOutput.Length()) {
+ RefPtr<MediaData>& output = decoder.mOutput[0];
+ InternalSeekTarget target = decoder.mTimeThreshold.ref();
+ media::TimeUnit time = media::TimeUnit::FromMicroseconds(output->mTime);
+ if (time >= target.Time()) {
+ // We have reached our internal seek target.
+ decoder.mTimeThreshold.reset();
+ // We might have dropped some keyframes.
+ mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
+ }
+ if (time < target.Time() || (target.mDropTarget && target.Contains(time))) {
+ LOGV("Internal Seeking: Dropping %s frame time:%f wanted:%f (kf:%d)",
+ TrackTypeToStr(aTrack),
+ media::TimeUnit::FromMicroseconds(output->mTime).ToSeconds(),
+ target.Time().ToSeconds(),
+ output->mKeyframe);
+ decoder.mOutput.RemoveElementAt(0);
+ decoder.mSizeOfQueue -= 1;
+ }
+ }
+
+ while (decoder.mOutput.Length() && decoder.mOutput[0]->mType == MediaData::NULL_DATA) {
+ LOGV("Dropping null data. Time: %lld", decoder.mOutput[0]->mTime);
+ decoder.mOutput.RemoveElementAt(0);
+ decoder.mSizeOfQueue -= 1;
+ }
+
+ if (decoder.HasPromise()) {
+ needOutput = true;
+ if (decoder.mOutput.Length()) {
+ RefPtr<MediaData> output = decoder.mOutput[0];
+ decoder.mOutput.RemoveElementAt(0);
+ decoder.mSizeOfQueue -= 1;
+ decoder.mLastSampleTime =
+ Some(TimeInterval(TimeUnit::FromMicroseconds(output->mTime),
+ TimeUnit::FromMicroseconds(output->GetEndTime())));
+ decoder.mNumSamplesOutputTotal++;
+ ReturnOutput(output, aTrack);
+ // We have a decoded sample ready to be returned.
+ if (aTrack == TrackType::kVideoTrack) {
+ uint64_t delta =
+ decoder.mNumSamplesOutputTotal - mLastReportedNumDecodedFrames;
+ a.mStats.mDecodedFrames = static_cast<uint32_t>(delta);
+ mLastReportedNumDecodedFrames = decoder.mNumSamplesOutputTotal;
+ if (output->mKeyframe) {
+ if (mPreviousDecodedKeyframeTime_us < output->mTime) {
+ // There is a previous keyframe -> Record inter-keyframe stats.
+ uint64_t segment_us = output->mTime - mPreviousDecodedKeyframeTime_us;
+ a.mStats.mInterKeyframeSum_us += segment_us;
+ a.mStats.mInterKeyframeCount += 1;
+ if (a.mStats.mInterKeyFrameMax_us < segment_us) {
+ a.mStats.mInterKeyFrameMax_us = segment_us;
+ }
+ }
+ mPreviousDecodedKeyframeTime_us = output->mTime;
+ }
+ nsCString error;
+ mVideo.mIsHardwareAccelerated =
+ mVideo.mDecoder && mVideo.mDecoder->IsHardwareAccelerated(error);
+ }
+ } else if (decoder.HasFatalError()) {
+ LOG("Rejecting %s promise: DECODE_ERROR", TrackTypeToStr(aTrack));
+ decoder.RejectPromise(decoder.mError.ref(), __func__);
+ return;
+ } else if (decoder.mDrainComplete) {
+ bool wasDraining = decoder.mDraining;
+ decoder.mDrainComplete = false;
+ decoder.mDraining = false;
+ if (decoder.mDemuxEOS) {
+ LOG("Rejecting %s promise: EOS", TrackTypeToStr(aTrack));
+ decoder.RejectPromise(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ } else if (decoder.mWaitingForData) {
+ if (wasDraining && decoder.mLastSampleTime &&
+ !decoder.mNextStreamSourceID) {
+ // We have completed draining the decoder following WaitingForData.
+ // Set up the internal seek machinery to be able to resume from the
+ // last sample decoded.
+ LOG("Seeking to last sample time: %lld",
+ decoder.mLastSampleTime.ref().mStart.ToMicroseconds());
+ InternalSeek(aTrack, InternalSeekTarget(decoder.mLastSampleTime.ref(), true));
+ }
+ if (!decoder.mReceivedNewData) {
+ LOG("Rejecting %s promise: WAITING_FOR_DATA", TrackTypeToStr(aTrack));
+ decoder.RejectPromise(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
+ }
+ }
+ // Now that draining has completed, we check if we have received
+ // new data again as the result may now be different from the earlier
+ // run.
+ if (UpdateReceivedNewData(aTrack) || decoder.mSeekRequest.Exists()) {
+ LOGV("Nothing more to do");
+ return;
+ }
+ } else if (decoder.mDemuxEOS && !decoder.mNeedDraining &&
+ !decoder.HasPendingDrain() && decoder.mQueuedSamples.IsEmpty()) {
+ // It is possible to transition from WAITING_FOR_DATA directly to EOS
+ // state during the internal seek; in which case no draining would occur.
+ // There is no more samples left to be decoded and we are already in
+ // EOS state. We can immediately reject the data promise.
+ LOG("Rejecting %s promise: EOS", TrackTypeToStr(aTrack));
+ decoder.RejectPromise(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ } else if (decoder.mWaitingForKey) {
+ LOG("Rejecting %s promise: WAITING_FOR_DATA due to waiting for key",
+ TrackTypeToStr(aTrack));
+ decoder.RejectPromise(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
+ }
+ }
+
+ if (decoder.mNeedDraining) {
+ DrainDecoder(aTrack);
+ return;
+ }
+
+ if (decoder.mError && !decoder.HasFatalError()) {
+ decoder.mDecodePending = false;
+ bool needsNewDecoder = decoder.mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER;
+ if (!needsNewDecoder && ++decoder.mNumOfConsecutiveError > decoder.mMaxConsecutiveError) {
+ NotifyError(aTrack, decoder.mError.ref());
+ return;
+ }
+ decoder.mError.reset();
+ LOG("%s decoded error count %d", TrackTypeToStr(aTrack),
+ decoder.mNumOfConsecutiveError);
+ media::TimeUnit nextKeyframe;
+ if (aTrack == TrackType::kVideoTrack && !decoder.HasInternalSeekPending() &&
+ NS_SUCCEEDED(decoder.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe))) {
+ if (needsNewDecoder) {
+ decoder.ShutdownDecoder();
+ }
+ SkipVideoDemuxToNextKeyFrame(decoder.mLastSampleTime.refOr(TimeInterval()).Length());
+ return;
+ } else if (aTrack == TrackType::kAudioTrack) {
+ decoder.Flush();
+ }
+ }
+
+ bool needInput = NeedInput(decoder);
+
+ LOGV("Update(%s) ni=%d no=%d ie=%d, in:%llu out:%llu qs=%u pending:%u waiting:%d promise:%d wfk:%d sid:%u",
+ TrackTypeToStr(aTrack), needInput, needOutput, decoder.mDecodePending,
+ decoder.mNumSamplesInput, decoder.mNumSamplesOutput,
+ uint32_t(size_t(decoder.mSizeOfQueue)), uint32_t(decoder.mOutput.Length()),
+ decoder.mWaitingForData, decoder.HasPromise(),
+ decoder.mWaitingForKey, decoder.mLastStreamSourceID);
+
+ if ((decoder.mWaitingForData &&
+ (!decoder.mTimeThreshold || decoder.mTimeThreshold.ref().mWaiting)) ||
+ (decoder.mWaitingForKey && decoder.mDecodePending)) {
+ // Nothing more we can do at present.
+ LOGV("Still waiting for data or key.");
+ return;
+ }
+
+ if (decoder.mWaitingForKey) {
+ decoder.mWaitingForKey = false;
+ if (decoder.HasWaitingPromise() && !decoder.IsWaiting()) {
+ LOGV("No longer waiting for key. Resolving waiting promise");
+ decoder.mWaitingPromise.Resolve(decoder.mType, __func__);
+ return;
+ }
+ }
+
+ if (!needInput) {
+ LOGV("No need for additional input (pending:%u)",
+ uint32_t(decoder.mOutput.Length()));
+ return;
+ }
+
+ // Demux samples if we don't have some.
+ RequestDemuxSamples(aTrack);
+
+ HandleDemuxedSamples(aTrack, a);
+}
+
+void
+MediaFormatReader::ReturnOutput(MediaData* aData, TrackType aTrack)
+{
+ MOZ_ASSERT(GetDecoderData(aTrack).HasPromise());
+ MOZ_DIAGNOSTIC_ASSERT(aData->mType != MediaData::NULL_DATA);
+ LOG("Resolved data promise for %s [%lld, %lld]", TrackTypeToStr(aTrack),
+ aData->mTime, aData->GetEndTime());
+
+ if (aTrack == TrackInfo::kAudioTrack) {
+ if (aData->mType != MediaData::RAW_DATA) {
+ AudioData* audioData = static_cast<AudioData*>(aData);
+
+ if (audioData->mChannels != mInfo.mAudio.mChannels ||
+ audioData->mRate != mInfo.mAudio.mRate) {
+ LOG("change of audio format (rate:%d->%d). "
+ "This is an unsupported configuration",
+ mInfo.mAudio.mRate, audioData->mRate);
+ mInfo.mAudio.mRate = audioData->mRate;
+ mInfo.mAudio.mChannels = audioData->mChannels;
+ }
+ }
+ mAudio.ResolvePromise(aData, __func__);
+ } else if (aTrack == TrackInfo::kVideoTrack) {
+ if (aData->mType != MediaData::RAW_DATA) {
+ VideoData* videoData = static_cast<VideoData*>(aData);
+
+ if (videoData->mDisplay != mInfo.mVideo.mDisplay) {
+ LOG("change of video display size (%dx%d->%dx%d)",
+ mInfo.mVideo.mDisplay.width, mInfo.mVideo.mDisplay.height,
+ videoData->mDisplay.width, videoData->mDisplay.height);
+ mInfo.mVideo.mDisplay = videoData->mDisplay;
+ }
+ }
+ mVideo.ResolvePromise(aData, __func__);
+ }
+}
+
+size_t
+MediaFormatReader::SizeOfVideoQueueInFrames()
+{
+ return SizeOfQueue(TrackInfo::kVideoTrack);
+}
+
+size_t
+MediaFormatReader::SizeOfAudioQueueInFrames()
+{
+ return SizeOfQueue(TrackInfo::kAudioTrack);
+}
+
+size_t
+MediaFormatReader::SizeOfQueue(TrackType aTrack)
+{
+ auto& decoder = GetDecoderData(aTrack);
+ return decoder.mSizeOfQueue;
+}
+
+RefPtr<MediaDecoderReader::WaitForDataPromise>
+MediaFormatReader::WaitForData(MediaData::Type aType)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ TrackType trackType = aType == MediaData::VIDEO_DATA ?
+ TrackType::kVideoTrack : TrackType::kAudioTrack;
+ auto& decoder = GetDecoderData(trackType);
+ if (!decoder.IsWaiting()) {
+ // We aren't waiting for anything.
+ return WaitForDataPromise::CreateAndResolve(decoder.mType, __func__);
+ }
+ RefPtr<WaitForDataPromise> p = decoder.mWaitingPromise.Ensure(__func__);
+ ScheduleUpdate(trackType);
+ return p;
+}
+
+nsresult
+MediaFormatReader::ResetDecode(TrackSet aTracks)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOGV("");
+
+ mSeekPromise.RejectIfExists(NS_OK, __func__);
+ mSkipRequest.DisconnectIfExists();
+
+ // Do the same for any data wait promises.
+ if (aTracks.contains(TrackInfo::kAudioTrack)) {
+ mAudio.mWaitingPromise.RejectIfExists(
+ WaitForDataRejectValue(MediaData::AUDIO_DATA,
+ WaitForDataRejectValue::CANCELED), __func__);
+ }
+
+ if (aTracks.contains(TrackInfo::kVideoTrack)) {
+ mVideo.mWaitingPromise.RejectIfExists(
+ WaitForDataRejectValue(MediaData::VIDEO_DATA,
+ WaitForDataRejectValue::CANCELED), __func__);
+ }
+
+ // Reset miscellaneous seeking state.
+ mPendingSeekTime.reset();
+
+ if (HasVideo() && aTracks.contains(TrackInfo::kVideoTrack)) {
+ mVideo.ResetDemuxer();
+ Reset(TrackInfo::kVideoTrack);
+ if (mVideo.HasPromise()) {
+ mVideo.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+ }
+
+ if (HasAudio() && aTracks.contains(TrackInfo::kAudioTrack)) {
+ mAudio.ResetDemuxer();
+ Reset(TrackInfo::kAudioTrack);
+ if (mAudio.HasPromise()) {
+ mAudio.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+ }
+
+ return MediaDecoderReader::ResetDecode(aTracks);
+}
+
+void
+MediaFormatReader::Output(TrackType aTrack, MediaData* aSample)
+{
+ if (!aSample) {
+ NS_WARNING("MediaFormatReader::Output() passed a null sample");
+ Error(aTrack, MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, __func__));
+ return;
+ }
+
+ LOGV("Decoded %s sample time=%lld timecode=%lld kf=%d dur=%lld",
+ TrackTypeToStr(aTrack), aSample->mTime, aSample->mTimecode,
+ aSample->mKeyframe, aSample->mDuration);
+
+ RefPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackType, MediaData*>(
+ this, &MediaFormatReader::NotifyNewOutput, aTrack, aSample);
+ OwnerThread()->Dispatch(task.forget());
+}
+
+void
+MediaFormatReader::DrainComplete(TrackType aTrack)
+{
+ RefPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackType>(
+ this, &MediaFormatReader::NotifyDrainComplete, aTrack);
+ OwnerThread()->Dispatch(task.forget());
+}
+
+void
+MediaFormatReader::InputExhausted(TrackType aTrack)
+{
+ RefPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackType>(
+ this, &MediaFormatReader::NotifyInputExhausted, aTrack);
+ OwnerThread()->Dispatch(task.forget());
+}
+
+void
+MediaFormatReader::Error(TrackType aTrack, const MediaResult& aError)
+{
+ RefPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackType, MediaResult>(
+ this, &MediaFormatReader::NotifyError, aTrack, aError);
+ OwnerThread()->Dispatch(task.forget());
+}
+
+void
+MediaFormatReader::WaitingForKey(TrackType aTrack)
+{
+ RefPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackType>(
+ this, &MediaFormatReader::NotifyWaitingForKey, aTrack);
+ OwnerThread()->Dispatch(task.forget());
+}
+
+void
+MediaFormatReader::Reset(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOG("Reset(%s) BEGIN", TrackTypeToStr(aTrack));
+
+ auto& decoder = GetDecoderData(aTrack);
+
+ decoder.ResetState();
+ decoder.Flush();
+
+ LOG("Reset(%s) END", TrackTypeToStr(aTrack));
+}
+
+void
+MediaFormatReader::DropDecodedSamples(TrackType aTrack)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+ size_t lengthDecodedQueue = decoder.mOutput.Length();
+ if (lengthDecodedQueue && decoder.mTimeThreshold.isSome()) {
+ TimeUnit time =
+ TimeUnit::FromMicroseconds(decoder.mOutput.LastElement()->mTime);
+ if (time >= decoder.mTimeThreshold.ref().Time()) {
+ // We would have reached our internal seek target.
+ decoder.mTimeThreshold.reset();
+ }
+ }
+ decoder.mOutput.Clear();
+ decoder.mSizeOfQueue -= lengthDecodedQueue;
+ if (aTrack == TrackInfo::kVideoTrack && mDecoder) {
+ mDecoder->NotifyDecodedFrames({ 0, 0, lengthDecodedQueue });
+ }
+}
+
+void
+MediaFormatReader::SkipVideoDemuxToNextKeyFrame(media::TimeUnit aTimeThreshold)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOG("Skipping up to %lld", aTimeThreshold.ToMicroseconds());
+
+ // We've reached SkipVideoDemuxToNextKeyFrame when our decoding is late.
+ // As such we can drop all already decoded samples and discard all pending
+ // samples.
+ // TODO: Ideally we should set mOutputRequested to false so that all pending
+ // frames are dropped too. However, we can't do such thing as the code assumes
+ // that the decoder just got flushed. Once bug 1257107 land, we could set the
+ // decoder threshold to the value of currentTime.
+ DropDecodedSamples(TrackInfo::kVideoTrack);
+
+ mSkipRequest.Begin(mVideo.mTrackDemuxer->SkipToNextRandomAccessPoint(aTimeThreshold)
+ ->Then(OwnerThread(), __func__, this,
+ &MediaFormatReader::OnVideoSkipCompleted,
+ &MediaFormatReader::OnVideoSkipFailed));
+ return;
+}
+
+void
+MediaFormatReader::VideoSkipReset(uint32_t aSkipped)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ // Some frames may have been output by the decoder since we initiated the
+ // videoskip process and we know they would be late.
+ DropDecodedSamples(TrackInfo::kVideoTrack);
+ // Report the pending frames as dropped.
+ if (mDecoder) {
+ mDecoder->NotifyDecodedFrames({ 0, 0, SizeOfVideoQueueInFrames() });
+ }
+
+ // Cancel any pending demux request and pending demuxed samples.
+ mVideo.mDemuxRequest.DisconnectIfExists();
+ Reset(TrackType::kVideoTrack);
+
+ if (mDecoder) {
+ mDecoder->NotifyDecodedFrames({ aSkipped, 0, aSkipped });
+ }
+
+ mVideo.mNumSamplesSkippedTotal += aSkipped;
+}
+
+void
+MediaFormatReader::OnVideoSkipCompleted(uint32_t aSkipped)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOG("Skipping succeeded, skipped %u frames", aSkipped);
+ mSkipRequest.Complete();
+
+ VideoSkipReset(aSkipped);
+
+ ScheduleUpdate(TrackInfo::kVideoTrack);
+}
+
+void
+MediaFormatReader::OnVideoSkipFailed(MediaTrackDemuxer::SkipFailureHolder aFailure)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOG("Skipping failed, skipped %u frames", aFailure.mSkipped);
+ mSkipRequest.Complete();
+
+ switch (aFailure.mFailure.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+ // Some frames may have been output by the decoder since we initiated the
+ // videoskip process and we know they would be late.
+ DropDecodedSamples(TrackInfo::kVideoTrack);
+ // We can't complete the skip operation, will just service a video frame
+ // normally.
+ ScheduleUpdate(TrackInfo::kVideoTrack);
+ break;
+ case NS_ERROR_DOM_MEDIA_CANCELED:
+ if (mVideo.HasPromise()) {
+ mVideo.RejectPromise(aFailure.mFailure, __func__);
+ }
+ break;
+ default:
+ NotifyError(TrackType::kVideoTrack, aFailure.mFailure);
+ break;
+ }
+}
+
+RefPtr<MediaDecoderReader::SeekPromise>
+MediaFormatReader::Seek(SeekTarget aTarget, int64_t aUnused)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ LOG("aTarget=(%lld)", aTarget.GetTime().ToMicroseconds());
+
+ MOZ_DIAGNOSTIC_ASSERT(mSeekPromise.IsEmpty());
+ MOZ_DIAGNOSTIC_ASSERT(!mVideo.HasPromise());
+ MOZ_DIAGNOSTIC_ASSERT(aTarget.IsVideoOnly() || !mAudio.HasPromise());
+ MOZ_DIAGNOSTIC_ASSERT(mPendingSeekTime.isNothing());
+ MOZ_DIAGNOSTIC_ASSERT(mVideo.mTimeThreshold.isNothing());
+ MOZ_DIAGNOSTIC_ASSERT(aTarget.IsVideoOnly() || mAudio.mTimeThreshold.isNothing());
+
+ if (!mInfo.mMediaSeekable && !mInfo.mMediaSeekableOnlyInBufferedRanges) {
+ LOG("Seek() END (Unseekable)");
+ return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ if (mShutdown) {
+ return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ SetSeekTarget(Move(aTarget));
+
+ RefPtr<SeekPromise> p = mSeekPromise.Ensure(__func__);
+
+ ScheduleSeek();
+
+ return p;
+}
+
+void
+MediaFormatReader::SetSeekTarget(const SeekTarget& aTarget)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ SeekTarget target = aTarget;
+
+ // Transform the seek target time to the demuxer timeline.
+ if (!ForceZeroStartTime()) {
+ target.SetTime(aTarget.GetTime() - TimeUnit::FromMicroseconds(StartTime())
+ + DemuxStartTime());
+ }
+
+ mOriginalSeekTarget = target;
+ mFallbackSeekTime = mPendingSeekTime = Some(target.GetTime());
+}
+
+TimeUnit
+MediaFormatReader::DemuxStartTime()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(!ForceZeroStartTime());
+ MOZ_ASSERT(HasAudio() || HasVideo());
+
+ const TimeUnit startTime =
+ std::min(mAudio.mFirstDemuxedSampleTime.refOr(TimeUnit::FromInfinity()),
+ mVideo.mFirstDemuxedSampleTime.refOr(TimeUnit::FromInfinity()));
+
+ return startTime.IsInfinite() ? TimeUnit::FromMicroseconds(0) : startTime;
+}
+
+void
+MediaFormatReader::ScheduleSeek()
+{
+ if (mSeekScheduled) {
+ return;
+ }
+ mSeekScheduled = true;
+ OwnerThread()->Dispatch(NewRunnableMethod(this, &MediaFormatReader::AttemptSeek));
+}
+
+void
+MediaFormatReader::AttemptSeek()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ mSeekScheduled = false;
+
+ if (mPendingSeekTime.isNothing()) {
+ return;
+ }
+
+ if (HasVideo()) {
+ mVideo.ResetDemuxer();
+ mVideo.ResetState();
+ }
+
+ // Don't reset the audio demuxer not state when seeking video only
+ // as it will cause the audio to seek back to the beginning
+ // resulting in out-of-sync audio from video.
+ if (HasAudio() && !mOriginalSeekTarget.IsVideoOnly()) {
+ mAudio.ResetDemuxer();
+ mAudio.ResetState();
+ }
+
+ if (HasVideo()) {
+ DoVideoSeek();
+ } else if (HasAudio()) {
+ DoAudioSeek();
+ } else {
+ MOZ_CRASH();
+ }
+}
+
+void
+MediaFormatReader::OnSeekFailed(TrackType aTrack, const MediaResult& aError)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOGV("%s failure:%u", TrackTypeToStr(aTrack), aError.Code());
+ if (aTrack == TrackType::kVideoTrack) {
+ mVideo.mSeekRequest.Complete();
+ } else {
+ mAudio.mSeekRequest.Complete();
+ }
+
+ if (aError == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
+ if (HasVideo() && aTrack == TrackType::kAudioTrack &&
+ mFallbackSeekTime.isSome() &&
+ mPendingSeekTime.ref() != mFallbackSeekTime.ref()) {
+ // We have failed to seek audio where video seeked to earlier.
+ // Attempt to seek instead to the closest point that we know we have in
+ // order to limit A/V sync discrepency.
+
+ // Ensure we have the most up to date buffered ranges.
+ UpdateReceivedNewData(TrackType::kAudioTrack);
+ Maybe<media::TimeUnit> nextSeekTime;
+ // Find closest buffered time found after video seeked time.
+ for (const auto& timeRange : mAudio.mTimeRanges) {
+ if (timeRange.mStart >= mPendingSeekTime.ref()) {
+ nextSeekTime.emplace(timeRange.mStart);
+ break;
+ }
+ }
+ if (nextSeekTime.isNothing() ||
+ nextSeekTime.ref() > mFallbackSeekTime.ref()) {
+ nextSeekTime = Some(mFallbackSeekTime.ref());
+ LOG("Unable to seek audio to video seek time. A/V sync may be broken");
+ } else {
+ mFallbackSeekTime.reset();
+ }
+ mPendingSeekTime = nextSeekTime;
+ DoAudioSeek();
+ return;
+ }
+ NotifyWaitingForData(aTrack);
+ return;
+ }
+ MOZ_ASSERT(!mVideo.mSeekRequest.Exists() && !mAudio.mSeekRequest.Exists());
+ mPendingSeekTime.reset();
+ mSeekPromise.Reject(aError, __func__);
+}
+
+void
+MediaFormatReader::DoVideoSeek()
+{
+ MOZ_ASSERT(mPendingSeekTime.isSome());
+ LOGV("Seeking video to %lld", mPendingSeekTime.ref().ToMicroseconds());
+ media::TimeUnit seekTime = mPendingSeekTime.ref();
+ mVideo.mSeekRequest.Begin(mVideo.mTrackDemuxer->Seek(seekTime)
+ ->Then(OwnerThread(), __func__, this,
+ &MediaFormatReader::OnVideoSeekCompleted,
+ &MediaFormatReader::OnVideoSeekFailed));
+}
+
+void
+MediaFormatReader::OnVideoSeekCompleted(media::TimeUnit aTime)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOGV("Video seeked to %lld", aTime.ToMicroseconds());
+ mVideo.mSeekRequest.Complete();
+
+ mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
+
+ SetVideoDecodeThreshold();
+
+ if (HasAudio() && !mOriginalSeekTarget.IsVideoOnly()) {
+ MOZ_ASSERT(mPendingSeekTime.isSome());
+ if (mOriginalSeekTarget.IsFast()) {
+ // We are performing a fast seek. We need to seek audio to where the
+ // video seeked to, to ensure proper A/V sync once playback resume.
+ mPendingSeekTime = Some(aTime);
+ }
+ DoAudioSeek();
+ } else {
+ mPendingSeekTime.reset();
+ mSeekPromise.Resolve(aTime, __func__);
+ }
+}
+
+void
+MediaFormatReader::OnVideoSeekFailed(const MediaResult& aError)
+{
+ mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
+ OnSeekFailed(TrackType::kVideoTrack, aError);
+}
+
+void
+MediaFormatReader::SetVideoDecodeThreshold()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (!HasVideo() || !mVideo.mDecoder) {
+ return;
+ }
+
+ if (!mVideo.mTimeThreshold && !IsSeeking()) {
+ return;
+ }
+
+ TimeUnit threshold;
+ if (mVideo.mTimeThreshold) {
+ // For internalSeek.
+ threshold = mVideo.mTimeThreshold.ref().Time();
+ } else if (IsSeeking()) {
+ // If IsSeeking() is true, then video seek must have completed already.
+ TimeUnit keyframe;
+ if (NS_FAILED(mVideo.mTrackDemuxer->GetNextRandomAccessPoint(&keyframe))) {
+ return;
+ }
+
+ // If the key frame is invalid/infinite, it means the target position is
+ // closing to end of stream. We don't want to skip any frame at this point.
+ if (!keyframe.IsValid() || keyframe.IsInfinite()) {
+ return;
+ }
+ threshold = mOriginalSeekTarget.GetTime();
+ } else {
+ return;
+ }
+
+ LOG("Set seek threshold to %lld", threshold.ToMicroseconds());
+ mVideo.mDecoder->SetSeekThreshold(threshold);
+}
+
+void
+MediaFormatReader::DoAudioSeek()
+{
+ MOZ_ASSERT(mPendingSeekTime.isSome());
+ LOGV("Seeking audio to %lld", mPendingSeekTime.ref().ToMicroseconds());
+ media::TimeUnit seekTime = mPendingSeekTime.ref();
+ mAudio.mSeekRequest.Begin(mAudio.mTrackDemuxer->Seek(seekTime)
+ ->Then(OwnerThread(), __func__, this,
+ &MediaFormatReader::OnAudioSeekCompleted,
+ &MediaFormatReader::OnAudioSeekFailed));
+}
+
+void
+MediaFormatReader::OnAudioSeekCompleted(media::TimeUnit aTime)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ LOGV("Audio seeked to %lld", aTime.ToMicroseconds());
+ mAudio.mSeekRequest.Complete();
+ mPendingSeekTime.reset();
+ mSeekPromise.Resolve(aTime, __func__);
+}
+
+void
+MediaFormatReader::OnAudioSeekFailed(const MediaResult& aError)
+{
+ OnSeekFailed(TrackType::kAudioTrack, aError);
+}
+
+media::TimeIntervals
+MediaFormatReader::GetBuffered()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ media::TimeIntervals videoti;
+ media::TimeIntervals audioti;
+ media::TimeIntervals intervals;
+
+ if (!mInitDone) {
+ return intervals;
+ }
+ int64_t startTime = 0;
+ if (!ForceZeroStartTime()) {
+ if (!HaveStartTime()) {
+ return intervals;
+ }
+ startTime = StartTime();
+ }
+ // Ensure we have up to date buffered time range.
+ if (HasVideo()) {
+ UpdateReceivedNewData(TrackType::kVideoTrack);
+ }
+ if (HasAudio()) {
+ UpdateReceivedNewData(TrackType::kAudioTrack);
+ }
+ if (HasVideo()) {
+ videoti = mVideo.mTimeRanges;
+ }
+ if (HasAudio()) {
+ audioti = mAudio.mTimeRanges;
+ }
+ if (HasAudio() && HasVideo()) {
+ intervals = media::Intersection(Move(videoti), Move(audioti));
+ } else if (HasAudio()) {
+ intervals = Move(audioti);
+ } else if (HasVideo()) {
+ intervals = Move(videoti);
+ }
+
+ if (!intervals.Length() ||
+ intervals.GetStart() == media::TimeUnit::FromMicroseconds(0)) {
+ // IntervalSet already starts at 0 or is empty, nothing to shift.
+ return intervals;
+ }
+ return intervals.Shift(media::TimeUnit::FromMicroseconds(-startTime));
+}
+
+// For the MediaFormatReader override we need to force an update to the
+// buffered ranges, so we call NotifyDataArrive
+RefPtr<MediaDecoderReader::BufferedUpdatePromise>
+MediaFormatReader::UpdateBufferedWithPromise() {
+ MOZ_ASSERT(OnTaskQueue());
+ // Call NotifyDataArrive to force a recalculation of the buffered
+ // ranges. UpdateBuffered alone will not force a recalculation, so we
+ // use NotifyDataArrived which sets flags to force this recalculation.
+ // See MediaFormatReader::UpdateReceivedNewData for an example of where
+ // the new data flag is used.
+ NotifyDataArrived();
+ return BufferedUpdatePromise::CreateAndResolve(true, __func__);
+}
+
+void MediaFormatReader::ReleaseResources()
+{
+ mVideo.ShutdownDecoder();
+ mAudio.ShutdownDecoder();
+}
+
+bool
+MediaFormatReader::VideoIsHardwareAccelerated() const
+{
+ return mVideo.mIsHardwareAccelerated;
+}
+
+void
+MediaFormatReader::NotifyDemuxer()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (mShutdown || !mDemuxer ||
+ (!mDemuxerInitDone && !mDemuxerInitRequest.Exists())) {
+ return;
+ }
+
+ LOGV("");
+
+ mDemuxer->NotifyDataArrived();
+
+ if (!mInitDone) {
+ return;
+ }
+ if (HasVideo()) {
+ mVideo.mReceivedNewData = true;
+ ScheduleUpdate(TrackType::kVideoTrack);
+ }
+ if (HasAudio()) {
+ mAudio.mReceivedNewData = true;
+ ScheduleUpdate(TrackType::kAudioTrack);
+ }
+}
+
+void
+MediaFormatReader::NotifyDataArrivedInternal()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ NotifyDemuxer();
+}
+
+bool
+MediaFormatReader::ForceZeroStartTime() const
+{
+ return !mDemuxer->ShouldComputeStartTime();
+}
+
+layers::ImageContainer*
+MediaFormatReader::GetImageContainer()
+{
+ return mVideoFrameContainer
+ ? mVideoFrameContainer->GetImageContainer() : nullptr;
+}
+
+void
+MediaFormatReader::GetMozDebugReaderData(nsAString& aString)
+{
+ nsAutoCString result;
+ const char* audioName = "unavailable";
+ const char* videoName = audioName;
+
+ if (HasAudio()) {
+ MonitorAutoLock mon(mAudio.mMonitor);
+ audioName = mAudio.mDescription;
+ }
+ if (HasVideo()) {
+ MonitorAutoLock mon(mVideo.mMonitor);
+ videoName = mVideo.mDescription;
+ }
+
+ result += nsPrintfCString("audio decoder: %s\n", audioName);
+ result += nsPrintfCString("audio frames decoded: %lld\n",
+ mAudio.mNumSamplesOutputTotal);
+ if (HasAudio()) {
+ result += nsPrintfCString("audio state: ni=%d no=%d ie=%d demuxr:%d demuxq:%d tt:%f tths:%d in:%llu out:%llu qs=%u pending:%u waiting:%d wfk:%d sid:%u\n",
+ NeedInput(mAudio), mAudio.HasPromise(),
+ mAudio.mDecodePending,
+ mAudio.mDemuxRequest.Exists(),
+ int(mAudio.mQueuedSamples.Length()),
+ mAudio.mTimeThreshold
+ ? mAudio.mTimeThreshold.ref().Time().ToSeconds()
+ : -1.0,
+ mAudio.mTimeThreshold
+ ? mAudio.mTimeThreshold.ref().mHasSeeked
+ : -1,
+ mAudio.mNumSamplesInput, mAudio.mNumSamplesOutput,
+ unsigned(size_t(mAudio.mSizeOfQueue)),
+ unsigned(mAudio.mOutput.Length()),
+ mAudio.mWaitingForData, mAudio.mWaitingForKey,
+ mAudio.mLastStreamSourceID);
+ }
+ result += nsPrintfCString("video decoder: %s\n", videoName);
+ result += nsPrintfCString("hardware video decoding: %s\n",
+ VideoIsHardwareAccelerated() ? "enabled" : "disabled");
+ result += nsPrintfCString("video frames decoded: %lld (skipped:%lld)\n",
+ mVideo.mNumSamplesOutputTotal,
+ mVideo.mNumSamplesSkippedTotal);
+ if (HasVideo()) {
+ result += nsPrintfCString("video state: ni=%d no=%d ie=%d demuxr:%d demuxq:%d tt:%f tths:%d in:%llu out:%llu qs=%u pending:%u waiting:%d wfk:%d, sid:%u\n",
+ NeedInput(mVideo), mVideo.HasPromise(),
+ mVideo.mDecodePending,
+ mVideo.mDemuxRequest.Exists(),
+ int(mVideo.mQueuedSamples.Length()),
+ mVideo.mTimeThreshold
+ ? mVideo.mTimeThreshold.ref().Time().ToSeconds()
+ : -1.0,
+ mVideo.mTimeThreshold
+ ? mVideo.mTimeThreshold.ref().mHasSeeked
+ : -1,
+ mVideo.mNumSamplesInput, mVideo.mNumSamplesOutput,
+ unsigned(size_t(mVideo.mSizeOfQueue)),
+ unsigned(mVideo.mOutput.Length()),
+ mVideo.mWaitingForData, mVideo.mWaitingForKey,
+ mVideo.mLastStreamSourceID);
+ }
+ aString += NS_ConvertUTF8toUTF16(result);
+}
+
+void
+MediaFormatReader::SetVideoBlankDecode(bool aIsBlankDecode)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return SetBlankDecode(TrackType::kVideoTrack, aIsBlankDecode);
+}
+
+void
+MediaFormatReader::SetBlankDecode(TrackType aTrack, bool aIsBlankDecode)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& decoder = GetDecoderData(aTrack);
+
+ LOG("%s, decoder.mIsBlankDecode = %d => aIsBlankDecode = %d",
+ TrackTypeToStr(aTrack), decoder.mIsBlankDecode, aIsBlankDecode);
+
+ if (decoder.mIsBlankDecode == aIsBlankDecode) {
+ return;
+ }
+
+ decoder.mIsBlankDecode = aIsBlankDecode;
+ decoder.Flush();
+ decoder.ShutdownDecoder();
+ ScheduleUpdate(TrackInfo::kVideoTrack);
+
+ return;
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaFormatReader.h b/dom/media/MediaFormatReader.h
new file mode 100644
index 000000000..4d05ca201
--- /dev/null
+++ b/dom/media/MediaFormatReader.h
@@ -0,0 +1,601 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaFormatReader_h_)
+#define MediaFormatReader_h_
+
+#include "mozilla/Atomics.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/TaskQueue.h"
+#include "mozilla/Monitor.h"
+
+#include "MediaEventSource.h"
+#include "MediaDataDemuxer.h"
+#include "MediaDecoderReader.h"
+#include "nsAutoPtr.h"
+#include "PDMFactory.h"
+
+namespace mozilla {
+
+class CDMProxy;
+
+class MediaFormatReader final : public MediaDecoderReader
+{
+ typedef TrackInfo::TrackType TrackType;
+
+public:
+ MediaFormatReader(AbstractMediaDecoder* aDecoder,
+ MediaDataDemuxer* aDemuxer,
+ VideoFrameContainer* aVideoFrameContainer = nullptr);
+
+ virtual ~MediaFormatReader();
+
+ size_t SizeOfVideoQueueInFrames() override;
+ size_t SizeOfAudioQueueInFrames() override;
+
+ RefPtr<MediaDataPromise>
+ RequestVideoData(bool aSkipToNextKeyframe, int64_t aTimeThreshold) override;
+
+ RefPtr<MediaDataPromise> RequestAudioData() override;
+
+ RefPtr<MetadataPromise> AsyncReadMetadata() override;
+
+ void ReadUpdatedMetadata(MediaInfo* aInfo) override;
+
+ RefPtr<SeekPromise>
+ Seek(SeekTarget aTarget, int64_t aUnused) override;
+
+protected:
+ void NotifyDataArrivedInternal() override;
+
+public:
+ media::TimeIntervals GetBuffered() override;
+
+ RefPtr<BufferedUpdatePromise> UpdateBufferedWithPromise() override;
+
+ bool ForceZeroStartTime() const override;
+
+ // For Media Resource Management
+ void ReleaseResources() override;
+
+ nsresult ResetDecode(TrackSet aTracks) override;
+
+ RefPtr<ShutdownPromise> Shutdown() override;
+
+ bool IsAsync() const override { return true; }
+
+ bool VideoIsHardwareAccelerated() const override;
+
+ bool IsWaitForDataSupported() const override { return true; }
+ RefPtr<WaitForDataPromise> WaitForData(MediaData::Type aType) override;
+
+ // MediaFormatReader supports demuxed-only mode.
+ bool IsDemuxOnlySupported() const override { return true; }
+
+ void SetDemuxOnly(bool aDemuxedOnly) override
+ {
+ if (OnTaskQueue()) {
+ mDemuxOnly = aDemuxedOnly;
+ return;
+ }
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod<bool>(
+ this, &MediaDecoderReader::SetDemuxOnly, aDemuxedOnly);
+ OwnerThread()->Dispatch(r.forget());
+ }
+
+ bool UseBufferingHeuristics() const override
+ {
+ return mTrackDemuxersMayBlock;
+ }
+
+ void SetCDMProxy(CDMProxy* aProxy) override;
+
+ // Returns a string describing the state of the decoder data.
+ // Used for debugging purposes.
+ void GetMozDebugReaderData(nsAString& aString);
+
+ void SetVideoBlankDecode(bool aIsBlankDecode) override;
+
+private:
+ nsresult InitInternal() override;
+
+ bool HasVideo() const { return mVideo.mTrackDemuxer; }
+ bool HasAudio() const { return mAudio.mTrackDemuxer; }
+
+ bool IsWaitingOnCDMResource();
+
+ bool InitDemuxer();
+ // Notify the demuxer that new data has been received.
+ // The next queued task calling GetBuffered() is guaranteed to have up to date
+ // buffered ranges.
+ void NotifyDemuxer();
+ void ReturnOutput(MediaData* aData, TrackType aTrack);
+
+ // Enqueues a task to call Update(aTrack) on the decoder task queue.
+ // Lock for corresponding track must be held.
+ void ScheduleUpdate(TrackType aTrack);
+ void Update(TrackType aTrack);
+ // Handle actions should more data be received.
+ // Returns true if no more action is required.
+ bool UpdateReceivedNewData(TrackType aTrack);
+ // Called when new samples need to be demuxed.
+ void RequestDemuxSamples(TrackType aTrack);
+ // Handle demuxed samples by the input behavior.
+ void HandleDemuxedSamples(TrackType aTrack,
+ AbstractMediaDecoder::AutoNotifyDecoded& aA);
+ // Decode any pending already demuxed samples.
+ void DecodeDemuxedSamples(TrackType aTrack,
+ MediaRawData* aSample);
+
+ struct InternalSeekTarget {
+ InternalSeekTarget(const media::TimeInterval& aTime, bool aDropTarget)
+ : mTime(aTime)
+ , mDropTarget(aDropTarget)
+ , mWaiting(false)
+ , mHasSeeked(false)
+ {}
+
+ media::TimeUnit Time() const { return mTime.mStart; }
+ media::TimeUnit EndTime() const { return mTime.mEnd; }
+ bool Contains(const media::TimeUnit& aTime) const
+ {
+ return mTime.Contains(aTime);
+ }
+
+ media::TimeInterval mTime;
+ bool mDropTarget;
+ bool mWaiting;
+ bool mHasSeeked;
+ };
+
+ // Perform an internal seek to aTime. If aDropTarget is true then
+ // the first sample past the target will be dropped.
+ void InternalSeek(TrackType aTrack, const InternalSeekTarget& aTarget);
+
+ // Drain the current decoder.
+ void DrainDecoder(TrackType aTrack);
+ void NotifyNewOutput(TrackType aTrack, MediaData* aSample);
+ void NotifyInputExhausted(TrackType aTrack);
+ void NotifyDrainComplete(TrackType aTrack);
+ void NotifyError(TrackType aTrack, const MediaResult& aError);
+ void NotifyWaitingForData(TrackType aTrack);
+ void NotifyWaitingForKey(TrackType aTrack);
+ void NotifyEndOfStream(TrackType aTrack);
+
+ void ExtractCryptoInitData(nsTArray<uint8_t>& aInitData);
+
+ // Initializes mLayersBackendType if possible.
+ void InitLayersBackendType();
+
+ // DecoderCallback proxies the MediaDataDecoderCallback calls to these
+ // functions.
+ void Output(TrackType aType, MediaData* aSample);
+ void InputExhausted(TrackType aTrack);
+ void Error(TrackType aTrack, const MediaResult& aError);
+ void Reset(TrackType aTrack);
+ void DrainComplete(TrackType aTrack);
+ void DropDecodedSamples(TrackType aTrack);
+ void WaitingForKey(TrackType aTrack);
+
+ bool ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold);
+
+ void SetVideoDecodeThreshold();
+
+ size_t SizeOfQueue(TrackType aTrack);
+
+ RefPtr<PDMFactory> mPlatform;
+
+ class DecoderCallback : public MediaDataDecoderCallback {
+ public:
+ DecoderCallback(MediaFormatReader* aReader, TrackType aType)
+ : mReader(aReader)
+ , mType(aType)
+ {
+ }
+ void Output(MediaData* aSample) override {
+ mReader->Output(mType, aSample);
+ }
+ void InputExhausted() override {
+ mReader->InputExhausted(mType);
+ }
+ void Error(const MediaResult& aError) override {
+ mReader->Error(mType, aError);
+ }
+ void DrainComplete() override {
+ mReader->DrainComplete(mType);
+ }
+ void ReleaseMediaResources() override {
+ mReader->ReleaseResources();
+ }
+ bool OnReaderTaskQueue() override {
+ return mReader->OnTaskQueue();
+ }
+ void WaitingForKey() override {
+ mReader->WaitingForKey(mType);
+ }
+
+ private:
+ MediaFormatReader* mReader;
+ TrackType mType;
+ };
+
+ struct DecoderData {
+ DecoderData(MediaFormatReader* aOwner,
+ MediaData::Type aType,
+ uint32_t aNumOfMaxError)
+ : mOwner(aOwner)
+ , mType(aType)
+ , mMonitor("DecoderData")
+ , mDescription("shutdown")
+ , mUpdateScheduled(false)
+ , mDemuxEOS(false)
+ , mWaitingForData(false)
+ , mWaitingForKey(false)
+ , mReceivedNewData(false)
+ , mOutputRequested(false)
+ , mDecodePending(false)
+ , mNeedDraining(false)
+ , mDraining(false)
+ , mDrainComplete(false)
+ , mNumOfConsecutiveError(0)
+ , mMaxConsecutiveError(aNumOfMaxError)
+ , mNumSamplesInput(0)
+ , mNumSamplesOutput(0)
+ , mNumSamplesOutputTotal(0)
+ , mNumSamplesSkippedTotal(0)
+ , mSizeOfQueue(0)
+ , mIsHardwareAccelerated(false)
+ , mLastStreamSourceID(UINT32_MAX)
+ , mIsBlankDecode(false)
+ {}
+
+ MediaFormatReader* mOwner;
+ // Disambiguate Audio vs Video.
+ MediaData::Type mType;
+ RefPtr<MediaTrackDemuxer> mTrackDemuxer;
+ // TaskQueue on which decoder can choose to decode.
+ // Only non-null up until the decoder is created.
+ RefPtr<TaskQueue> mTaskQueue;
+ // Callback that receives output and error notifications from the decoder.
+ nsAutoPtr<DecoderCallback> mCallback;
+
+ // Monitor protecting mDescription and mDecoder.
+ Monitor mMonitor;
+ // The platform decoder.
+ RefPtr<MediaDataDecoder> mDecoder;
+ const char* mDescription;
+ void ShutdownDecoder()
+ {
+ MonitorAutoLock mon(mMonitor);
+ if (mDecoder) {
+ mDecoder->Shutdown();
+ }
+ mDescription = "shutdown";
+ mDecoder = nullptr;
+ }
+
+ // Only accessed from reader's task queue.
+ bool mUpdateScheduled;
+ bool mDemuxEOS;
+ bool mWaitingForData;
+ bool mWaitingForKey;
+ bool mReceivedNewData;
+
+ // Pending seek.
+ MozPromiseRequestHolder<MediaTrackDemuxer::SeekPromise> mSeekRequest;
+
+ // Queued demux samples waiting to be decoded.
+ nsTArray<RefPtr<MediaRawData>> mQueuedSamples;
+ MozPromiseRequestHolder<MediaTrackDemuxer::SamplesPromise> mDemuxRequest;
+ // A WaitingPromise is pending if the demuxer is waiting for data or
+ // if the decoder is waiting for a key.
+ MozPromiseHolder<WaitForDataPromise> mWaitingPromise;
+ bool HasWaitingPromise() const
+ {
+ MOZ_ASSERT(mOwner->OnTaskQueue());
+ return !mWaitingPromise.IsEmpty();
+ }
+ bool IsWaiting() const
+ {
+ MOZ_ASSERT(mOwner->OnTaskQueue());
+ return mWaitingForData || mWaitingForKey;
+ }
+
+ // MediaDataDecoder handler's variables.
+ bool mOutputRequested;
+ // Set to true once the MediaDataDecoder has been fed a compressed sample.
+ // No more samples will be passed to the decoder while true.
+ // mDecodePending is reset when:
+ // 1- The decoder calls InputExhausted
+ // 2- The decoder is Flushed or Reset.
+ bool mDecodePending;
+ bool mNeedDraining;
+ bool mDraining;
+ bool mDrainComplete;
+
+ bool HasPendingDrain() const
+ {
+ return mDraining || mDrainComplete;
+ }
+
+ uint32_t mNumOfConsecutiveError;
+ uint32_t mMaxConsecutiveError;
+
+ Maybe<MediaResult> mError;
+ bool HasFatalError() const
+ {
+ if (!mError.isSome()) {
+ return false;
+ }
+ if (mError.ref() == NS_ERROR_DOM_MEDIA_DECODE_ERR) {
+ // Allow decode errors to be non-fatal, but give up
+ // if we have too many.
+ return mNumOfConsecutiveError > mMaxConsecutiveError;
+ } else if (mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER) {
+ // If the caller asked for a new decoder we shouldn't treat
+ // it as fatal.
+ return false;
+ } else {
+ // All other error types are fatal
+ return true;
+ }
+ }
+
+ // If set, all decoded samples prior mTimeThreshold will be dropped.
+ // Used for internal seeking when a change of stream is detected or when
+ // encountering data discontinuity.
+ Maybe<InternalSeekTarget> mTimeThreshold;
+ // Time of last sample returned.
+ Maybe<media::TimeInterval> mLastSampleTime;
+
+ // Decoded samples returned my mDecoder awaiting being returned to
+ // state machine upon request.
+ nsTArray<RefPtr<MediaData>> mOutput;
+ uint64_t mNumSamplesInput;
+ uint64_t mNumSamplesOutput;
+ uint64_t mNumSamplesOutputTotal;
+ uint64_t mNumSamplesSkippedTotal;
+
+ // These get overridden in the templated concrete class.
+ // Indicate if we have a pending promise for decoded frame.
+ // Rejecting the promise will stop the reader from decoding ahead.
+ virtual bool HasPromise() const = 0;
+ virtual RefPtr<MediaDataPromise> EnsurePromise(const char* aMethodName) = 0;
+ virtual void ResolvePromise(MediaData* aData, const char* aMethodName) = 0;
+ virtual void RejectPromise(const MediaResult& aError,
+ const char* aMethodName) = 0;
+
+ // Clear track demuxer related data.
+ void ResetDemuxer()
+ {
+ mDemuxRequest.DisconnectIfExists();
+ mSeekRequest.DisconnectIfExists();
+ mTrackDemuxer->Reset();
+ mQueuedSamples.Clear();
+ }
+
+ // Flush the decoder if present and reset decoding related data.
+ // Decoding will be suspended until mInputRequested is set again.
+ // Following a flush, the decoder is ready to accept any new data.
+ void Flush()
+ {
+ if (mDecoder) {
+ mDecoder->Flush();
+ }
+ mOutputRequested = false;
+ mDecodePending = false;
+ mOutput.Clear();
+ mNumSamplesInput = 0;
+ mNumSamplesOutput = 0;
+ mSizeOfQueue = 0;
+ mDraining = false;
+ mDrainComplete = false;
+ }
+
+ // Reset the state of the DecoderData, clearing all queued frames
+ // (pending demuxed and decoded).
+ // Decoding will be suspended until mInputRequested is set again.
+ // The track demuxer is *not* reset.
+ void ResetState()
+ {
+ MOZ_ASSERT(mOwner->OnTaskQueue());
+ mDemuxEOS = false;
+ mWaitingForData = false;
+ mWaitingForKey = false;
+ mQueuedSamples.Clear();
+ mOutputRequested = false;
+ mNeedDraining = false;
+ mDecodePending = false;
+ mDraining = false;
+ mDrainComplete = false;
+ mTimeThreshold.reset();
+ mLastSampleTime.reset();
+ mOutput.Clear();
+ mNumSamplesInput = 0;
+ mNumSamplesOutput = 0;
+ mSizeOfQueue = 0;
+ mNextStreamSourceID.reset();
+ if (!HasFatalError()) {
+ mError.reset();
+ }
+ }
+
+ bool HasInternalSeekPending() const
+ {
+ return mTimeThreshold && !mTimeThreshold.ref().mHasSeeked;
+ }
+
+ // Used by the MDSM for logging purposes.
+ Atomic<size_t> mSizeOfQueue;
+ // Used by the MDSM to determine if video decoding is hardware accelerated.
+ // This value is updated after a frame is successfully decoded.
+ Atomic<bool> mIsHardwareAccelerated;
+ // Sample format monitoring.
+ uint32_t mLastStreamSourceID;
+ Maybe<uint32_t> mNextStreamSourceID;
+ media::TimeIntervals mTimeRanges;
+ Maybe<media::TimeUnit> mLastTimeRangesEnd;
+ // TrackInfo as first discovered during ReadMetadata.
+ UniquePtr<TrackInfo> mOriginalInfo;
+ RefPtr<SharedTrackInfo> mInfo;
+ Maybe<media::TimeUnit> mFirstDemuxedSampleTime;
+ // Use BlankDecoderModule or not.
+ bool mIsBlankDecode;
+
+ };
+
+ class DecoderDataWithPromise : public DecoderData {
+ public:
+ DecoderDataWithPromise(MediaFormatReader* aOwner,
+ MediaData::Type aType,
+ uint32_t aNumOfMaxError)
+ : DecoderData(aOwner, aType, aNumOfMaxError)
+ , mHasPromise(false)
+
+ {}
+
+ bool HasPromise() const override
+ {
+ return mHasPromise;
+ }
+
+ RefPtr<MediaDataPromise> EnsurePromise(const char* aMethodName) override
+ {
+ MOZ_ASSERT(mOwner->OnTaskQueue());
+ mHasPromise = true;
+ return mPromise.Ensure(aMethodName);
+ }
+
+ void ResolvePromise(MediaData* aData, const char* aMethodName) override
+ {
+ MOZ_ASSERT(mOwner->OnTaskQueue());
+ mPromise.Resolve(aData, aMethodName);
+ mHasPromise = false;
+ }
+
+ void RejectPromise(const MediaResult& aError,
+ const char* aMethodName) override
+ {
+ MOZ_ASSERT(mOwner->OnTaskQueue());
+ mPromise.Reject(aError, aMethodName);
+ mHasPromise = false;
+ }
+
+ private:
+ MozPromiseHolder<MediaDataPromise> mPromise;
+ Atomic<bool> mHasPromise;
+ };
+
+ DecoderDataWithPromise mAudio;
+ DecoderDataWithPromise mVideo;
+
+ // Returns true when the decoder for this track needs input.
+ bool NeedInput(DecoderData& aDecoder);
+
+ DecoderData& GetDecoderData(TrackType aTrack);
+
+ // Demuxer objects.
+ RefPtr<MediaDataDemuxer> mDemuxer;
+ bool mDemuxerInitDone;
+ void OnDemuxerInitDone(nsresult);
+ void OnDemuxerInitFailed(const MediaResult& aError);
+ MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest;
+ void OnDemuxFailed(TrackType aTrack, const MediaResult& aError);
+
+ void DoDemuxVideo();
+ void OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
+ void OnVideoDemuxFailed(const MediaResult& aError)
+ {
+ OnDemuxFailed(TrackType::kVideoTrack, aError);
+ }
+
+ void DoDemuxAudio();
+ void OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
+ void OnAudioDemuxFailed(const MediaResult& aError)
+ {
+ OnDemuxFailed(TrackType::kAudioTrack, aError);
+ }
+
+ void SkipVideoDemuxToNextKeyFrame(media::TimeUnit aTimeThreshold);
+ MozPromiseRequestHolder<MediaTrackDemuxer::SkipAccessPointPromise> mSkipRequest;
+ void VideoSkipReset(uint32_t aSkipped);
+ void OnVideoSkipCompleted(uint32_t aSkipped);
+ void OnVideoSkipFailed(MediaTrackDemuxer::SkipFailureHolder aFailure);
+
+ // The last number of decoded output frames that we've reported to
+ // MediaDecoder::NotifyDecoded(). We diff the number of output video
+ // frames every time that DecodeVideoData() is called, and report the
+ // delta there.
+ uint64_t mLastReportedNumDecodedFrames;
+
+ // Timestamp of the previous decoded keyframe, in microseconds.
+ int64_t mPreviousDecodedKeyframeTime_us;
+ // Default mLastDecodedKeyframeTime_us value, must be bigger than anything.
+ static const int64_t sNoPreviousDecodedKeyframe = INT64_MAX;
+
+ RefPtr<layers::KnowsCompositor> mKnowsCompositor;
+
+ // Metadata objects
+ // True if we've read the streams' metadata.
+ bool mInitDone;
+ MozPromiseHolder<MetadataPromise> mMetadataPromise;
+ bool IsEncrypted() const;
+
+ // Set to true if any of our track buffers may be blocking.
+ bool mTrackDemuxersMayBlock;
+
+ // Set the demuxed-only flag.
+ Atomic<bool> mDemuxOnly;
+
+ // Seeking objects.
+ void SetSeekTarget(const SeekTarget& aTarget);
+ media::TimeUnit DemuxStartTime();
+ bool IsSeeking() const { return mPendingSeekTime.isSome(); }
+ bool IsVideoSeeking() const
+ {
+ return IsSeeking() && mOriginalSeekTarget.IsVideoOnly();
+ }
+ void ScheduleSeek();
+ void AttemptSeek();
+ void OnSeekFailed(TrackType aTrack, const MediaResult& aError);
+ void DoVideoSeek();
+ void OnVideoSeekCompleted(media::TimeUnit aTime);
+ void OnVideoSeekFailed(const MediaResult& aError);
+ bool mSeekScheduled;
+
+ void NotifyCompositorUpdated(RefPtr<layers::KnowsCompositor> aKnowsCompositor)
+ {
+ mKnowsCompositor = aKnowsCompositor;
+ }
+
+ void DoAudioSeek();
+ void OnAudioSeekCompleted(media::TimeUnit aTime);
+ void OnAudioSeekFailed(const MediaResult& aError);
+ // The SeekTarget that was last given to Seek()
+ SeekTarget mOriginalSeekTarget;
+ // Temporary seek information while we wait for the data
+ Maybe<media::TimeUnit> mFallbackSeekTime;
+ Maybe<media::TimeUnit> mPendingSeekTime;
+ MozPromiseHolder<SeekPromise> mSeekPromise;
+
+ RefPtr<VideoFrameContainer> mVideoFrameContainer;
+ layers::ImageContainer* GetImageContainer();
+
+ RefPtr<CDMProxy> mCDMProxy;
+
+ RefPtr<GMPCrashHelper> mCrashHelper;
+
+ void SetBlankDecode(TrackType aTrack, bool aIsBlankDecode);
+
+ class DecoderFactory;
+ UniquePtr<DecoderFactory> mDecoderFactory;
+
+ MediaEventListener mCompositorUpdatedListener;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaInfo.cpp b/dom/media/MediaInfo.cpp
new file mode 100644
index 000000000..3d9e9dca2
--- /dev/null
+++ b/dom/media/MediaInfo.cpp
@@ -0,0 +1,190 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaInfo.h"
+
+namespace mozilla {
+
+typedef AudioConfig::ChannelLayout ChannelLayout;
+
+/**
+ * AudioConfig::ChannelLayout
+ */
+
+/*
+ SMPTE channel layout (also known as wave order)
+ DUAL-MONO L R
+ DUAL-MONO-LFE L R LFE
+ MONO M
+ MONO-LFE M LFE
+ STEREO L R
+ STEREO-LFE L R LFE
+ 3F L R C
+ 3F-LFE L R C LFE
+ 2F1 L R S
+ 2F1-LFE L R LFE S
+ 3F1 L R C S
+ 3F1-LFE L R C LFE S
+ 2F2 L R LS RS
+ 2F2-LFE L R LFE LS RS
+ 3F2 L R C LS RS
+ 3F2-LFE L R C LFE LS RS
+ 3F3R-LFE L R C LFE BC LS RS
+ 3F4-LFE L R C LFE Rls Rrs LS RS
+*/
+
+void
+AudioConfig::ChannelLayout::UpdateChannelMap()
+{
+ mChannelMap = 0;
+ mValid = mChannels.Length() <= MAX_AUDIO_CHANNELS;
+ for (size_t i = 0; i < mChannels.Length() && i <= MAX_AUDIO_CHANNELS; i++) {
+ uint32_t mask = 1 << mChannels[i];
+ if (mChannels[i] == CHANNEL_INVALID || (mChannelMap & mask)) {
+ mValid = false;
+ }
+ mChannelMap |= mask;
+ }
+}
+
+/* static */ const AudioConfig::Channel*
+AudioConfig::ChannelLayout::SMPTEDefault(uint32_t aChannels) const
+{
+ switch (aChannels) {
+ case 1: // MONO
+ {
+ static const Channel config[] = { CHANNEL_MONO };
+ return config;
+ }
+ case 2: // STEREO
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT };
+ return config;
+ }
+ case 3: // 3F
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT, CHANNEL_CENTER };
+ return config;
+ }
+ case 4: // 2F2
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT, CHANNEL_LS, CHANNEL_RS };
+ return config;
+ }
+ case 5: // 3F2
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT, CHANNEL_CENTER, CHANNEL_LS, CHANNEL_RS };
+ return config;
+ }
+ case 6: // 3F2-LFE
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT, CHANNEL_CENTER, CHANNEL_LFE, CHANNEL_LS, CHANNEL_RS };
+ return config;
+ }
+ case 7: // 3F3R-LFE
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT, CHANNEL_CENTER, CHANNEL_LFE, CHANNEL_RCENTER, CHANNEL_LS, CHANNEL_RS };
+ return config;
+ }
+ case 8: // 3F4-LFE
+ {
+ static const Channel config[] = { CHANNEL_LEFT, CHANNEL_RIGHT, CHANNEL_CENTER, CHANNEL_LFE, CHANNEL_RLS, CHANNEL_RRS, CHANNEL_LS, CHANNEL_RS };
+ return config;
+ }
+ default:
+ return nullptr;
+ }
+}
+
+bool
+AudioConfig::ChannelLayout::MappingTable(const ChannelLayout& aOther,
+ uint8_t* aMap) const
+{
+ if (!IsValid() || !aOther.IsValid() ||
+ Map() != aOther.Map()) {
+ return false;
+ }
+ if (!aMap) {
+ return true;
+ }
+ for (uint32_t i = 0; i < Count(); i++) {
+ for (uint32_t j = 0; j < Count(); j++) {
+ if (aOther[j] == mChannels[i]) {
+ aMap[j] = i;
+ break;
+ }
+ }
+ }
+ return true;
+}
+
+/**
+ * AudioConfig::ChannelConfig
+ */
+
+/* static */ const char*
+AudioConfig::FormatToString(AudioConfig::SampleFormat aFormat)
+{
+ switch (aFormat) {
+ case FORMAT_U8: return "unsigned 8 bit";
+ case FORMAT_S16: return "signed 16 bit";
+ case FORMAT_S24: return "signed 24 bit MSB";
+ case FORMAT_S24LSB: return "signed 24 bit LSB";
+ case FORMAT_S32: return "signed 32 bit";
+ case FORMAT_FLT: return "32 bit floating point";
+ case FORMAT_NONE: return "none";
+ default: return "unknown";
+ }
+}
+/* static */ uint32_t
+AudioConfig::SampleSize(AudioConfig::SampleFormat aFormat)
+{
+ switch (aFormat) {
+ case FORMAT_U8: return 1;
+ case FORMAT_S16: return 2;
+ case FORMAT_S24: MOZ_FALLTHROUGH;
+ case FORMAT_S24LSB: MOZ_FALLTHROUGH;
+ case FORMAT_S32: MOZ_FALLTHROUGH;
+ case FORMAT_FLT: return 4;
+ case FORMAT_NONE:
+ default: return 0;
+ }
+}
+
+/* static */ uint32_t
+AudioConfig::FormatToBits(AudioConfig::SampleFormat aFormat)
+{
+ switch (aFormat) {
+ case FORMAT_U8: return 8;
+ case FORMAT_S16: return 16;
+ case FORMAT_S24LSB: MOZ_FALLTHROUGH;
+ case FORMAT_S24: return 24;
+ case FORMAT_S32: MOZ_FALLTHROUGH;
+ case FORMAT_FLT: return 32;
+ case FORMAT_NONE: MOZ_FALLTHROUGH;
+ default: return 0;
+ }
+}
+
+AudioConfig::AudioConfig(const ChannelLayout& aChannelLayout, uint32_t aRate,
+ AudioConfig::SampleFormat aFormat, bool aInterleaved)
+ : mChannelLayout(aChannelLayout)
+ , mChannels(aChannelLayout.Count())
+ , mRate(aRate)
+ , mFormat(aFormat)
+ , mInterleaved(aInterleaved)
+{}
+
+AudioConfig::AudioConfig(uint32_t aChannels, uint32_t aRate,
+ AudioConfig::SampleFormat aFormat, bool aInterleaved)
+ : mChannelLayout(aChannels)
+ , mChannels(aChannels)
+ , mRate(aRate)
+ , mFormat(aFormat)
+ , mInterleaved(aInterleaved)
+{}
+
+} // namespace mozilla
diff --git a/dom/media/MediaInfo.h b/dom/media/MediaInfo.h
new file mode 100644
index 000000000..b263b9099
--- /dev/null
+++ b/dom/media/MediaInfo.h
@@ -0,0 +1,725 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(MediaInfo_h)
+#define MediaInfo_h
+
+#include "mozilla/UniquePtr.h"
+#include "nsRect.h"
+#include "mozilla/RefPtr.h"
+#include "nsSize.h"
+#include "nsString.h"
+#include "nsTArray.h"
+#include "ImageTypes.h"
+#include "MediaData.h"
+#include "StreamTracks.h" // for TrackID
+#include "TimeUnits.h"
+
+namespace mozilla {
+
+class AudioInfo;
+class VideoInfo;
+class TextInfo;
+
+class MetadataTag {
+public:
+ MetadataTag(const nsACString& aKey,
+ const nsACString& aValue)
+ : mKey(aKey)
+ , mValue(aValue)
+ {}
+ nsCString mKey;
+ nsCString mValue;
+};
+
+ // Maximum channel number we can currently handle (7.1)
+#define MAX_AUDIO_CHANNELS 8
+
+class TrackInfo {
+public:
+ enum TrackType {
+ kUndefinedTrack,
+ kAudioTrack,
+ kVideoTrack,
+ kTextTrack
+ };
+ TrackInfo(TrackType aType,
+ const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ bool aEnabled,
+ TrackID aTrackId)
+ : mId(aId)
+ , mKind(aKind)
+ , mLabel(aLabel)
+ , mLanguage(aLanguage)
+ , mEnabled(aEnabled)
+ , mTrackId(aTrackId)
+ , mDuration(0)
+ , mMediaTime(0)
+ , mIsRenderedExternally(false)
+ , mType(aType)
+ {
+ MOZ_COUNT_CTOR(TrackInfo);
+ }
+
+ // Only used for backward compatibility. Do not use in new code.
+ void Init(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ bool aEnabled)
+ {
+ mId = aId;
+ mKind = aKind;
+ mLabel = aLabel;
+ mLanguage = aLanguage;
+ mEnabled = aEnabled;
+ }
+
+ // Fields common with MediaTrack object.
+ nsString mId;
+ nsString mKind;
+ nsString mLabel;
+ nsString mLanguage;
+ bool mEnabled;
+
+ TrackID mTrackId;
+
+ nsCString mMimeType;
+ int64_t mDuration;
+ int64_t mMediaTime;
+ CryptoTrack mCrypto;
+
+ nsTArray<MetadataTag> mTags;
+
+ // True if the track is gonna be (decrypted)/decoded and
+ // rendered directly by non-gecko components.
+ bool mIsRenderedExternally;
+
+ virtual AudioInfo* GetAsAudioInfo()
+ {
+ return nullptr;
+ }
+ virtual VideoInfo* GetAsVideoInfo()
+ {
+ return nullptr;
+ }
+ virtual TextInfo* GetAsTextInfo()
+ {
+ return nullptr;
+ }
+ virtual const AudioInfo* GetAsAudioInfo() const
+ {
+ return nullptr;
+ }
+ virtual const VideoInfo* GetAsVideoInfo() const
+ {
+ return nullptr;
+ }
+ virtual const TextInfo* GetAsTextInfo() const
+ {
+ return nullptr;
+ }
+
+ bool IsAudio() const
+ {
+ return !!GetAsAudioInfo();
+ }
+ bool IsVideo() const
+ {
+ return !!GetAsVideoInfo();
+ }
+ bool IsText() const
+ {
+ return !!GetAsTextInfo();
+ }
+ TrackType GetType() const
+ {
+ return mType;
+ }
+
+ bool virtual IsValid() const = 0;
+
+ virtual UniquePtr<TrackInfo> Clone() const = 0;
+
+ virtual ~TrackInfo()
+ {
+ MOZ_COUNT_DTOR(TrackInfo);
+ }
+
+protected:
+ TrackInfo(const TrackInfo& aOther)
+ {
+ mId = aOther.mId;
+ mKind = aOther.mKind;
+ mLabel = aOther.mLabel;
+ mLanguage = aOther.mLanguage;
+ mEnabled = aOther.mEnabled;
+ mTrackId = aOther.mTrackId;
+ mMimeType = aOther.mMimeType;
+ mDuration = aOther.mDuration;
+ mMediaTime = aOther.mMediaTime;
+ mCrypto = aOther.mCrypto;
+ mIsRenderedExternally = aOther.mIsRenderedExternally;
+ mType = aOther.mType;
+ mTags = aOther.mTags;
+ MOZ_COUNT_CTOR(TrackInfo);
+ }
+
+private:
+ TrackType mType;
+};
+
+// Stores info relevant to presenting media frames.
+class VideoInfo : public TrackInfo {
+public:
+ enum Rotation {
+ kDegree_0 = 0,
+ kDegree_90 = 90,
+ kDegree_180 = 180,
+ kDegree_270 = 270,
+ };
+ VideoInfo()
+ : VideoInfo(-1, -1)
+ {
+ }
+
+ explicit VideoInfo(int32_t aWidth, int32_t aHeight)
+ : VideoInfo(nsIntSize(aWidth, aHeight))
+ {
+ }
+
+ explicit VideoInfo(const nsIntSize& aSize)
+ : TrackInfo(kVideoTrack, NS_LITERAL_STRING("2"), NS_LITERAL_STRING("main"),
+ EmptyString(), EmptyString(), true, 2)
+ , mDisplay(aSize)
+ , mStereoMode(StereoMode::MONO)
+ , mImage(aSize)
+ , mCodecSpecificConfig(new MediaByteBuffer)
+ , mExtraData(new MediaByteBuffer)
+ , mRotation(kDegree_0)
+ , mImageRect(nsIntRect(nsIntPoint(), aSize))
+ {
+ }
+
+ VideoInfo(const VideoInfo& aOther)
+ : TrackInfo(aOther)
+ , mDisplay(aOther.mDisplay)
+ , mStereoMode(aOther.mStereoMode)
+ , mImage(aOther.mImage)
+ , mCodecSpecificConfig(aOther.mCodecSpecificConfig)
+ , mExtraData(aOther.mExtraData)
+ , mRotation(aOther.mRotation)
+ , mImageRect(aOther.mImageRect)
+ {
+ }
+
+ bool IsValid() const override
+ {
+ return mDisplay.width > 0 && mDisplay.height > 0;
+ }
+
+ VideoInfo* GetAsVideoInfo() override
+ {
+ return this;
+ }
+
+ const VideoInfo* GetAsVideoInfo() const override
+ {
+ return this;
+ }
+
+ UniquePtr<TrackInfo> Clone() const override
+ {
+ return MakeUnique<VideoInfo>(*this);
+ }
+
+ nsIntRect ImageRect() const
+ {
+ if (mImageRect.width < 0 || mImageRect.height < 0) {
+ return nsIntRect(0, 0, mImage.width, mImage.height);
+ }
+ return mImageRect;
+ }
+
+ void SetImageRect(const nsIntRect& aRect)
+ {
+ mImageRect = aRect;
+ }
+
+ // Returned the crop rectangle scaled to aWidth/aHeight size relative to
+ // mImage size.
+ // If aWidth and aHeight are identical to the original mImage.width/mImage.height
+ // then the scaling ratio will be 1.
+ // This is used for when the frame size is different from what the container
+ // reports. This is legal in WebM, and we will preserve the ratio of the crop
+ // rectangle as it was reported relative to the picture size reported by the
+ // container.
+ nsIntRect ScaledImageRect(int64_t aWidth, int64_t aHeight) const
+ {
+ if ((aWidth == mImage.width && aHeight == mImage.height) ||
+ !mImage.width || !mImage.height) {
+ return ImageRect();
+ }
+ nsIntRect imageRect = ImageRect();
+ imageRect.x = (imageRect.x * aWidth) / mImage.width;
+ imageRect.y = (imageRect.y * aHeight) / mImage.height;
+ imageRect.width = (aWidth * imageRect.width) / mImage.width;
+ imageRect.height = (aHeight * imageRect.height) / mImage.height;
+ return imageRect;
+ }
+
+ Rotation ToSupportedRotation(int32_t aDegree)
+ {
+ switch (aDegree) {
+ case 90:
+ return kDegree_90;
+ case 180:
+ return kDegree_180;
+ case 270:
+ return kDegree_270;
+ default:
+ NS_WARNING_ASSERTION(aDegree == 0, "Invalid rotation degree, ignored");
+ return kDegree_0;
+ }
+ }
+
+ // Size in pixels at which the video is rendered. This is after it has
+ // been scaled by its aspect ratio.
+ nsIntSize mDisplay;
+
+ // Indicates the frame layout for single track stereo videos.
+ StereoMode mStereoMode;
+
+ // Size of the decoded video's image.
+ nsIntSize mImage;
+
+ RefPtr<MediaByteBuffer> mCodecSpecificConfig;
+ RefPtr<MediaByteBuffer> mExtraData;
+
+ // Describing how many degrees video frames should be rotated in clock-wise to
+ // get correct view.
+ Rotation mRotation;
+
+private:
+ // mImage may be cropped; currently only used with the WebM container.
+ // A negative width or height indicate that no cropping is to occur.
+ nsIntRect mImageRect;
+};
+
+class AudioInfo : public TrackInfo {
+public:
+ AudioInfo()
+ : TrackInfo(kAudioTrack, NS_LITERAL_STRING("1"), NS_LITERAL_STRING("main"),
+ EmptyString(), EmptyString(), true, 1)
+ , mRate(0)
+ , mChannels(0)
+ , mBitDepth(0)
+ , mProfile(0)
+ , mExtendedProfile(0)
+ , mCodecSpecificConfig(new MediaByteBuffer)
+ , mExtraData(new MediaByteBuffer)
+ {
+ }
+
+ AudioInfo(const AudioInfo& aOther)
+ : TrackInfo(aOther)
+ , mRate(aOther.mRate)
+ , mChannels(aOther.mChannels)
+ , mBitDepth(aOther.mBitDepth)
+ , mProfile(aOther.mProfile)
+ , mExtendedProfile(aOther.mExtendedProfile)
+ , mCodecSpecificConfig(aOther.mCodecSpecificConfig)
+ , mExtraData(aOther.mExtraData)
+ {
+ }
+
+ static const uint32_t MAX_RATE = 640000;
+
+ bool IsValid() const override
+ {
+ return mChannels > 0 && mChannels <= MAX_AUDIO_CHANNELS
+ && mRate > 0 && mRate <= MAX_RATE;
+ }
+
+ AudioInfo* GetAsAudioInfo() override
+ {
+ return this;
+ }
+
+ const AudioInfo* GetAsAudioInfo() const override
+ {
+ return this;
+ }
+
+ UniquePtr<TrackInfo> Clone() const override
+ {
+ return MakeUnique<AudioInfo>(*this);
+ }
+
+ // Sample rate.
+ uint32_t mRate;
+
+ // Number of audio channels.
+ uint32_t mChannels;
+
+ // Bits per sample.
+ uint32_t mBitDepth;
+
+ // Codec profile.
+ int8_t mProfile;
+
+ // Extended codec profile.
+ int8_t mExtendedProfile;
+
+ RefPtr<MediaByteBuffer> mCodecSpecificConfig;
+ RefPtr<MediaByteBuffer> mExtraData;
+
+};
+
+class EncryptionInfo {
+public:
+ EncryptionInfo()
+ : mEncrypted(false)
+ {
+ }
+
+ struct InitData {
+ template<typename AInitDatas>
+ InitData(const nsAString& aType, AInitDatas&& aInitData)
+ : mType(aType)
+ , mInitData(Forward<AInitDatas>(aInitData))
+ {
+ }
+
+ // Encryption type to be passed to JS. Usually `cenc'.
+ nsString mType;
+
+ // Encryption data.
+ nsTArray<uint8_t> mInitData;
+ };
+ typedef nsTArray<InitData> InitDatas;
+
+ // True if the stream has encryption metadata
+ bool IsEncrypted() const
+ {
+ return mEncrypted;
+ }
+
+ template<typename AInitDatas>
+ void AddInitData(const nsAString& aType, AInitDatas&& aInitData)
+ {
+ mInitDatas.AppendElement(InitData(aType, Forward<AInitDatas>(aInitData)));
+ mEncrypted = true;
+ }
+
+ void AddInitData(const EncryptionInfo& aInfo)
+ {
+ mInitDatas.AppendElements(aInfo.mInitDatas);
+ mEncrypted = !!mInitDatas.Length();
+ }
+
+ // One 'InitData' per encrypted buffer.
+ InitDatas mInitDatas;
+private:
+ bool mEncrypted;
+};
+
+class MediaInfo {
+public:
+ bool HasVideo() const
+ {
+ return mVideo.IsValid();
+ }
+
+ void EnableVideo()
+ {
+ if (HasVideo()) {
+ return;
+ }
+ // Set dummy values so that HasVideo() will return true;
+ // See VideoInfo::IsValid()
+ mVideo.mDisplay = nsIntSize(1, 1);
+ }
+
+ bool HasAudio() const
+ {
+ return mAudio.IsValid();
+ }
+
+ void EnableAudio()
+ {
+ if (HasAudio()) {
+ return;
+ }
+ // Set dummy values so that HasAudio() will return true;
+ // See AudioInfo::IsValid()
+ mAudio.mChannels = 2;
+ mAudio.mRate = 44100;
+ }
+
+ bool IsEncrypted() const
+ {
+ return (HasAudio() && mAudio.mCrypto.mValid) ||
+ (HasVideo() && mVideo.mCrypto.mValid);
+ }
+
+ bool HasValidMedia() const
+ {
+ return HasVideo() || HasAudio();
+ }
+
+ void AssertValid() const
+ {
+ NS_ASSERTION(!HasAudio() || mAudio.mTrackId != TRACK_INVALID,
+ "Audio track ID must be valid");
+ NS_ASSERTION(!HasVideo() || mVideo.mTrackId != TRACK_INVALID,
+ "Audio track ID must be valid");
+ NS_ASSERTION(!HasAudio() || !HasVideo() ||
+ mAudio.mTrackId != mVideo.mTrackId,
+ "Duplicate track IDs");
+ }
+
+ // TODO: Store VideoInfo and AudioIndo in arrays to support multi-tracks.
+ VideoInfo mVideo;
+ AudioInfo mAudio;
+
+ // If the metadata includes a duration, we store it here.
+ media::NullableTimeUnit mMetadataDuration;
+
+ // The Ogg reader tries to kinda-sorta compute the duration by seeking to the
+ // end and determining the timestamp of the last frame. This isn't useful as
+ // a duration until we know the start time, so we need to track it separately.
+ media::NullableTimeUnit mUnadjustedMetadataEndTime;
+
+ // True if the media is seekable (i.e. supports random access).
+ bool mMediaSeekable = true;
+
+ // True if the media is only seekable within its buffered ranges.
+ bool mMediaSeekableOnlyInBufferedRanges = false;
+
+ EncryptionInfo mCrypto;
+};
+
+class SharedTrackInfo {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SharedTrackInfo)
+public:
+ SharedTrackInfo(const TrackInfo& aOriginal, uint32_t aStreamID)
+ : mInfo(aOriginal.Clone())
+ , mStreamSourceID(aStreamID)
+ , mMimeType(mInfo->mMimeType)
+ {
+ }
+
+ uint32_t GetID() const
+ {
+ return mStreamSourceID;
+ }
+
+ const TrackInfo* operator*() const
+ {
+ return mInfo.get();
+ }
+
+ const TrackInfo* operator->() const
+ {
+ MOZ_ASSERT(mInfo.get(), "dereferencing a UniquePtr containing nullptr");
+ return mInfo.get();
+ }
+
+ const AudioInfo* GetAsAudioInfo() const
+ {
+ return mInfo ? mInfo->GetAsAudioInfo() : nullptr;
+ }
+
+ const VideoInfo* GetAsVideoInfo() const
+ {
+ return mInfo ? mInfo->GetAsVideoInfo() : nullptr;
+ }
+
+ const TextInfo* GetAsTextInfo() const
+ {
+ return mInfo ? mInfo->GetAsTextInfo() : nullptr;
+ }
+
+private:
+ ~SharedTrackInfo() {};
+ UniquePtr<TrackInfo> mInfo;
+ // A unique ID, guaranteed to change when changing streams.
+ uint32_t mStreamSourceID;
+
+public:
+ const nsCString& mMimeType;
+};
+
+class AudioConfig {
+public:
+ enum Channel {
+ CHANNEL_INVALID = -1,
+ CHANNEL_MONO = 0,
+ CHANNEL_LEFT,
+ CHANNEL_RIGHT,
+ CHANNEL_CENTER,
+ CHANNEL_LS,
+ CHANNEL_RS,
+ CHANNEL_RLS,
+ CHANNEL_RCENTER,
+ CHANNEL_RRS,
+ CHANNEL_LFE,
+ };
+
+ class ChannelLayout {
+ public:
+ ChannelLayout()
+ : mChannelMap(0)
+ , mValid(false)
+ {}
+ explicit ChannelLayout(uint32_t aChannels)
+ : ChannelLayout(aChannels, SMPTEDefault(aChannels))
+ {}
+ ChannelLayout(uint32_t aChannels, const Channel* aConfig)
+ : ChannelLayout()
+ {
+ if (!aConfig) {
+ mValid = false;
+ return;
+ }
+ mChannels.AppendElements(aConfig, aChannels);
+ UpdateChannelMap();
+ }
+ bool operator==(const ChannelLayout& aOther) const
+ {
+ return mChannels == aOther.mChannels;
+ }
+ bool operator!=(const ChannelLayout& aOther) const
+ {
+ return mChannels != aOther.mChannels;
+ }
+ const Channel& operator[](uint32_t aIndex) const
+ {
+ return mChannels[aIndex];
+ }
+ uint32_t Count() const
+ {
+ return mChannels.Length();
+ }
+ uint32_t Map() const
+ {
+ return mChannelMap;
+ }
+ // Calculate the mapping table from the current layout to aOther such that
+ // one can easily go from one layout to the other by doing:
+ // out[channel] = in[map[channel]].
+ // Returns true if the reordering is possible or false otherwise.
+ // If true, then aMap, if set, will be updated to contain the mapping table
+ // allowing conversion from the current layout to aOther.
+ // If aMap is nullptr, then MappingTable can be used to simply determine if
+ // the current layout can be easily reordered to aOther.
+ // aMap must be an array of size MAX_AUDIO_CHANNELS.
+ bool MappingTable(const ChannelLayout& aOther, uint8_t* aMap = nullptr) const;
+ bool IsValid() const {
+ return mValid;
+ }
+ bool HasChannel(Channel aChannel) const
+ {
+ return mChannelMap & (1 << aChannel);
+ }
+ private:
+ void UpdateChannelMap();
+ const Channel* SMPTEDefault(uint32_t aChannels) const;
+ AutoTArray<Channel, MAX_AUDIO_CHANNELS> mChannels;
+ uint32_t mChannelMap;
+ bool mValid;
+ };
+
+ enum SampleFormat {
+ FORMAT_NONE = 0,
+ FORMAT_U8,
+ FORMAT_S16,
+ FORMAT_S24LSB,
+ FORMAT_S24,
+ FORMAT_S32,
+ FORMAT_FLT,
+#if defined(MOZ_SAMPLE_TYPE_FLOAT32)
+ FORMAT_DEFAULT = FORMAT_FLT
+#elif defined(MOZ_SAMPLE_TYPE_S16)
+ FORMAT_DEFAULT = FORMAT_S16
+#else
+#error "Not supported audio type"
+#endif
+ };
+
+ AudioConfig(const ChannelLayout& aChannelLayout, uint32_t aRate,
+ AudioConfig::SampleFormat aFormat = FORMAT_DEFAULT,
+ bool aInterleaved = true);
+ // Will create a channel configuration from default SMPTE ordering.
+ AudioConfig(uint32_t aChannels, uint32_t aRate,
+ AudioConfig::SampleFormat aFormat = FORMAT_DEFAULT,
+ bool aInterleaved = true);
+
+ const ChannelLayout& Layout() const
+ {
+ return mChannelLayout;
+ }
+ uint32_t Channels() const
+ {
+ if (!mChannelLayout.IsValid()) {
+ return mChannels;
+ }
+ return mChannelLayout.Count();
+ }
+ uint32_t Rate() const
+ {
+ return mRate;
+ }
+ SampleFormat Format() const
+ {
+ return mFormat;
+ }
+ bool Interleaved() const
+ {
+ return mInterleaved;
+ }
+ bool operator==(const AudioConfig& aOther) const
+ {
+ return mChannelLayout == aOther.mChannelLayout &&
+ mRate == aOther.mRate && mFormat == aOther.mFormat &&
+ mInterleaved == aOther.mInterleaved;
+ }
+ bool operator!=(const AudioConfig& aOther) const
+ {
+ return !(*this == aOther);
+ }
+
+ bool IsValid() const
+ {
+ return mChannelLayout.IsValid() && Format() != FORMAT_NONE && Rate() > 0;
+ }
+
+ static const char* FormatToString(SampleFormat aFormat);
+ static uint32_t SampleSize(SampleFormat aFormat);
+ static uint32_t FormatToBits(SampleFormat aFormat);
+
+private:
+ // Channels configuration.
+ ChannelLayout mChannelLayout;
+
+ // Channel count.
+ uint32_t mChannels;
+
+ // Sample rate.
+ uint32_t mRate;
+
+ // Sample format.
+ SampleFormat mFormat;
+
+ bool mInterleaved;
+};
+
+} // namespace mozilla
+
+#endif // MediaInfo_h
diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp
new file mode 100644
index 000000000..96e2c23e0
--- /dev/null
+++ b/dom/media/MediaManager.cpp
@@ -0,0 +1,3667 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaManager.h"
+
+#include "MediaStreamGraph.h"
+#include "mozilla/dom/MediaStreamTrack.h"
+#include "GetUserMediaRequest.h"
+#include "MediaStreamListener.h"
+#include "nsArray.h"
+#include "nsContentUtils.h"
+#include "nsHashPropertyBag.h"
+#ifdef MOZ_WIDGET_GONK
+#include "nsIAudioManager.h"
+#endif
+#include "nsIEventTarget.h"
+#include "nsIUUIDGenerator.h"
+#include "nsIScriptGlobalObject.h"
+#include "nsIPermissionManager.h"
+#include "nsIPopupWindowManager.h"
+#include "nsIDocShell.h"
+#include "nsIDocument.h"
+#include "nsISupportsPrimitives.h"
+#include "nsIInterfaceRequestorUtils.h"
+#include "nsIIDNService.h"
+#include "nsNetCID.h"
+#include "nsNetUtil.h"
+#include "nsPrincipal.h"
+#include "nsICryptoHash.h"
+#include "nsICryptoHMAC.h"
+#include "nsIKeyModule.h"
+#include "nsAppDirectoryServiceDefs.h"
+#include "nsIInputStream.h"
+#include "nsILineInputStream.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/Types.h"
+#include "mozilla/PeerIdentity.h"
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/dom/File.h"
+#include "mozilla/dom/MediaStreamBinding.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/GetUserMediaRequestBinding.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/dom/MediaDevices.h"
+#include "mozilla/Base64.h"
+#include "mozilla/ipc/BackgroundChild.h"
+#include "mozilla/media/MediaChild.h"
+#include "mozilla/media/MediaTaskUtils.h"
+#include "MediaTrackConstraints.h"
+#include "VideoUtils.h"
+#include "Latency.h"
+#include "nsProxyRelease.h"
+#include "nsNullPrincipal.h"
+#include "nsVariant.h"
+
+// For snprintf
+#include "mozilla/Sprintf.h"
+
+#include "nsJSUtils.h"
+#include "nsGlobalWindow.h"
+#include "nsIUUIDGenerator.h"
+#include "nspr.h"
+#include "nss.h"
+#include "pk11pub.h"
+
+/* Using WebRTC backend on Desktops (Mac, Windows, Linux), otherwise default */
+#include "MediaEngineDefault.h"
+#if defined(MOZ_WEBRTC)
+#include "MediaEngineWebRTC.h"
+#include "browser_logging/WebRtcLog.h"
+#endif
+
+#ifdef MOZ_B2G
+#include "MediaPermissionGonk.h"
+#endif
+
+#if defined (XP_WIN)
+#include "mozilla/WindowsVersion.h"
+#include <winsock2.h>
+#include <iphlpapi.h>
+#include <tchar.h>
+#endif
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with MediaStream::GetCurrentTime.
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+// XXX Workaround for bug 986974 to maintain the existing broken semantics
+template<>
+struct nsIMediaDevice::COMTypeInfo<mozilla::VideoDevice, void> {
+ static const nsIID kIID;
+};
+const nsIID nsIMediaDevice::COMTypeInfo<mozilla::VideoDevice, void>::kIID = NS_IMEDIADEVICE_IID;
+template<>
+struct nsIMediaDevice::COMTypeInfo<mozilla::AudioDevice, void> {
+ static const nsIID kIID;
+};
+const nsIID nsIMediaDevice::COMTypeInfo<mozilla::AudioDevice, void>::kIID = NS_IMEDIADEVICE_IID;
+
+namespace {
+already_AddRefed<nsIAsyncShutdownClient> GetShutdownPhase() {
+ nsCOMPtr<nsIAsyncShutdownService> svc = mozilla::services::GetAsyncShutdown();
+ MOZ_RELEASE_ASSERT(svc);
+
+ nsCOMPtr<nsIAsyncShutdownClient> shutdownPhase;
+ nsresult rv = svc->GetProfileBeforeChange(getter_AddRefs(shutdownPhase));
+ if (!shutdownPhase) {
+ // We are probably in a content process. We need to do cleanup at
+ // XPCOM shutdown in leakchecking builds.
+ rv = svc->GetXpcomWillShutdown(getter_AddRefs(shutdownPhase));
+ }
+ MOZ_RELEASE_ASSERT(shutdownPhase);
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ return shutdownPhase.forget();
+}
+}
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+LogModule*
+GetMediaManagerLog()
+{
+ static LazyLogModule sLog("MediaManager");
+ return sLog;
+}
+#define LOG(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Debug, msg)
+
+using dom::BasicTrackSource;
+using dom::ConstrainDOMStringParameters;
+using dom::File;
+using dom::GetUserMediaRequest;
+using dom::MediaSourceEnum;
+using dom::MediaStreamConstraints;
+using dom::MediaStreamError;
+using dom::MediaStreamTrack;
+using dom::MediaStreamTrackSource;
+using dom::MediaTrackConstraints;
+using dom::MediaTrackConstraintSet;
+using dom::OwningBooleanOrMediaTrackConstraints;
+using dom::OwningStringOrStringSequence;
+using dom::OwningStringOrStringSequenceOrConstrainDOMStringParameters;
+using dom::Promise;
+using dom::Sequence;
+using media::NewRunnableFrom;
+using media::NewTaskFrom;
+using media::Pledge;
+using media::Refcountable;
+
+static Atomic<bool> sInShutdown;
+
+static bool
+HostIsHttps(nsIURI &docURI)
+{
+ bool isHttps;
+ nsresult rv = docURI.SchemeIs("https", &isHttps);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ return isHttps;
+}
+
+/**
+ * This class is an implementation of MediaStreamListener. This is used
+ * to Start() and Stop() the underlying MediaEngineSource when MediaStreams
+ * are assigned and deassigned in content.
+ */
+class GetUserMediaCallbackMediaStreamListener : public MediaStreamListener
+{
+public:
+ // Create in an inactive state
+ GetUserMediaCallbackMediaStreamListener(base::Thread *aThread,
+ uint64_t aWindowID,
+ const PrincipalHandle& aPrincipalHandle)
+ : mMediaThread(aThread)
+ , mMainThreadCheck(nullptr)
+ , mWindowID(aWindowID)
+ , mPrincipalHandle(aPrincipalHandle)
+ , mStopped(false)
+ , mFinished(false)
+ , mRemoved(false)
+ , mAudioStopped(false)
+ , mAudioStopPending(false)
+ , mVideoStopped(false)
+ , mVideoStopPending(false)
+ , mChromeNotificationTaskPosted(false)
+ {}
+
+ ~GetUserMediaCallbackMediaStreamListener()
+ {
+ Unused << mMediaThread;
+ // It's OK to release mStream on any thread; they have thread-safe
+ // refcounts.
+ }
+
+ void Activate(already_AddRefed<SourceMediaStream> aStream,
+ AudioDevice* aAudioDevice,
+ VideoDevice* aVideoDevice)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mMainThreadCheck = PR_GetCurrentThread();
+ mStream = aStream;
+ mAudioDevice = aAudioDevice;
+ mVideoDevice = aVideoDevice;
+
+ mStream->AddListener(this);
+ }
+
+ MediaStream *Stream() // Can be used to test if Activate was called
+ {
+ return mStream;
+ }
+ SourceMediaStream *GetSourceStream()
+ {
+ NS_ASSERTION(mStream,"Getting stream from never-activated GUMCMSListener");
+ if (!mStream) {
+ return nullptr;
+ }
+ return mStream->AsSourceStream();
+ }
+
+ void StopSharing();
+
+ void StopTrack(TrackID aID);
+
+ void NotifyChromeOfTrackStops();
+
+ typedef media::Pledge<bool, dom::MediaStreamError*> PledgeVoid;
+
+ already_AddRefed<PledgeVoid>
+ ApplyConstraintsToTrack(nsPIDOMWindowInner* aWindow,
+ TrackID aID,
+ const dom::MediaTrackConstraints& aConstraints);
+
+ // mVideo/AudioDevice are set by Activate(), so we assume they're capturing
+ // if set and represent a real capture device.
+ bool CapturingVideo()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mVideoDevice && !mStopped &&
+ !mVideoDevice->GetSource()->IsAvailable() &&
+ mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Camera &&
+ (!mVideoDevice->GetSource()->IsFake() ||
+ Preferences::GetBool("media.navigator.permission.fake"));
+ }
+ bool CapturingAudio()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mAudioDevice && !mStopped &&
+ !mAudioDevice->GetSource()->IsAvailable() &&
+ (!mAudioDevice->GetSource()->IsFake() ||
+ Preferences::GetBool("media.navigator.permission.fake"));
+ }
+ bool CapturingScreen()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mVideoDevice && !mStopped &&
+ !mVideoDevice->GetSource()->IsAvailable() &&
+ mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Screen;
+ }
+ bool CapturingWindow()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mVideoDevice && !mStopped &&
+ !mVideoDevice->GetSource()->IsAvailable() &&
+ mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Window;
+ }
+ bool CapturingApplication()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mVideoDevice && !mStopped &&
+ !mVideoDevice->GetSource()->IsAvailable() &&
+ mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Application;
+ }
+ bool CapturingBrowser()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mVideoDevice && !mStopped &&
+ mVideoDevice->GetSource()->IsAvailable() &&
+ mVideoDevice->GetMediaSource() == dom::MediaSourceEnum::Browser;
+ }
+
+ void GetSettings(dom::MediaTrackSettings& aOutSettings, TrackID aTrackID)
+ {
+ switch (aTrackID) {
+ case kVideoTrack:
+ if (mVideoDevice) {
+ mVideoDevice->GetSource()->GetSettings(aOutSettings);
+ }
+ break;
+
+ case kAudioTrack:
+ if (mAudioDevice) {
+ mAudioDevice->GetSource()->GetSettings(aOutSettings);
+ }
+ break;
+ }
+ }
+
+ // implement in .cpp to avoid circular dependency with MediaOperationTask
+ // Can be invoked from EITHER MainThread or MSG thread
+ void Stop();
+
+ void
+ AudioConfig(bool aEchoOn, uint32_t aEcho,
+ bool aAgcOn, uint32_t aAGC,
+ bool aNoiseOn, uint32_t aNoise,
+ int32_t aPlayoutDelay);
+
+ void
+ Remove()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ // allow calling even if inactive (!mStream) for easier cleanup
+ // Caller holds strong reference to us, so no death grip required
+ if (mStream && !mRemoved) {
+ MM_LOG(("Listener removed on purpose, mFinished = %d", (int) mFinished));
+ mRemoved = true; // RemoveListener is async, avoid races
+ // If it's destroyed, don't call - listener will be removed and we'll be notified!
+ if (!mStream->IsDestroyed()) {
+ mStream->RemoveListener(this);
+ }
+ }
+ }
+
+ // Proxy NotifyPull() to sources
+ void
+ NotifyPull(MediaStreamGraph* aGraph, StreamTime aDesiredTime) override
+ {
+ // Currently audio sources ignore NotifyPull, but they could
+ // watch it especially for fake audio.
+ if (mAudioDevice) {
+ mAudioDevice->GetSource()->NotifyPull(aGraph, mStream, kAudioTrack,
+ aDesiredTime, mPrincipalHandle);
+ }
+ if (mVideoDevice) {
+ mVideoDevice->GetSource()->NotifyPull(aGraph, mStream, kVideoTrack,
+ aDesiredTime, mPrincipalHandle);
+ }
+ }
+
+ void
+ NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent aEvent) override
+ {
+ nsresult rv;
+ nsCOMPtr<nsIThread> thread;
+
+ switch (aEvent) {
+ case MediaStreamGraphEvent::EVENT_FINISHED:
+ rv = NS_GetMainThread(getter_AddRefs(thread));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ NS_ASSERTION(false, "Mainthread not available; running on current thread");
+ // Ensure this really *was* MainThread (NS_GetCurrentThread won't work)
+ MOZ_RELEASE_ASSERT(mMainThreadCheck == PR_GetCurrentThread());
+ NotifyFinished();
+ return;
+ }
+ thread->Dispatch(NewRunnableMethod(this, &GetUserMediaCallbackMediaStreamListener::NotifyFinished),
+ NS_DISPATCH_NORMAL);
+ break;
+ case MediaStreamGraphEvent::EVENT_REMOVED:
+ rv = NS_GetMainThread(getter_AddRefs(thread));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ NS_ASSERTION(false, "Mainthread not available; running on current thread");
+ // Ensure this really *was* MainThread (NS_GetCurrentThread won't work)
+ MOZ_RELEASE_ASSERT(mMainThreadCheck == PR_GetCurrentThread());
+ NotifyRemoved();
+ return;
+ }
+ thread->Dispatch(NewRunnableMethod(this, &GetUserMediaCallbackMediaStreamListener::NotifyRemoved),
+ NS_DISPATCH_NORMAL);
+ break;
+ case MediaStreamGraphEvent::EVENT_HAS_DIRECT_LISTENERS:
+ NotifyDirectListeners(aGraph, true);
+ break;
+ case MediaStreamGraphEvent::EVENT_HAS_NO_DIRECT_LISTENERS:
+ NotifyDirectListeners(aGraph, false);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void
+ NotifyFinished();
+
+ void
+ NotifyRemoved();
+
+ void
+ NotifyDirectListeners(MediaStreamGraph* aGraph, bool aHasListeners);
+
+ PrincipalHandle GetPrincipalHandle() const { return mPrincipalHandle; }
+
+private:
+ // Set at construction
+ base::Thread* mMediaThread;
+ // never ever indirect off this; just for assertions
+ PRThread* mMainThreadCheck;
+
+ uint64_t mWindowID;
+ const PrincipalHandle mPrincipalHandle;
+
+ // true after this listener has sent MEDIA_STOP. MainThread only.
+ bool mStopped;
+
+ // true after the stream this listener is listening to has finished in the
+ // MediaStreamGraph. MainThread only.
+ bool mFinished;
+
+ // true after this listener has been removed from its MediaStream.
+ // MainThread only.
+ bool mRemoved;
+
+ // true if we have sent MEDIA_STOP or MEDIA_STOP_TRACK for mAudioDevice.
+ // MainThread only.
+ bool mAudioStopped;
+
+ // true if we have scheduled MEDIA_STOP or MEDIA_STOP_TRACK for mAudioDevice.
+ // MainThread only.
+ bool mAudioStopPending;
+
+ // true if we have sent MEDIA_STOP or MEDIA_STOP_TRACK for mVideoDevice.
+ // MainThread only.
+ bool mVideoStopped;
+
+ // true if we have scheduled MEDIA_STOP or MEDIA_STOP_TRACK for mVideoDevice.
+ // MainThread only.
+ bool mVideoStopPending;
+
+ // true if we have scheduled a task to notify chrome in the next stable state.
+ // The task will reset this to false. MainThread only.
+ bool mChromeNotificationTaskPosted;
+
+ // Set at Activate on MainThread
+
+ // Accessed from MediaStreamGraph thread, MediaManager thread, and MainThread
+ // No locking needed as they're only addrefed except on the MediaManager thread
+ RefPtr<AudioDevice> mAudioDevice; // threadsafe refcnt
+ RefPtr<VideoDevice> mVideoDevice; // threadsafe refcnt
+ RefPtr<SourceMediaStream> mStream; // threadsafe refcnt
+};
+
+// Generic class for running long media operations like Start off the main
+// thread, and then (because nsDOMMediaStreams aren't threadsafe),
+// ProxyReleases mStream since it's cycle collected.
+class MediaOperationTask : public Runnable
+{
+public:
+ // so we can send Stop without AddRef()ing from the MSG thread
+ MediaOperationTask(MediaOperation aType,
+ GetUserMediaCallbackMediaStreamListener* aListener,
+ DOMMediaStream* aStream,
+ OnTracksAvailableCallback* aOnTracksAvailableCallback,
+ AudioDevice* aAudioDevice,
+ VideoDevice* aVideoDevice,
+ bool aBool,
+ uint64_t aWindowID,
+ already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError,
+ const dom::MediaTrackConstraints& aConstraints = dom::MediaTrackConstraints())
+ : mType(aType)
+ , mStream(aStream)
+ , mOnTracksAvailableCallback(aOnTracksAvailableCallback)
+ , mAudioDevice(aAudioDevice)
+ , mVideoDevice(aVideoDevice)
+ , mListener(aListener)
+ , mBool(aBool)
+ , mWindowID(aWindowID)
+ , mOnFailure(aError)
+ , mConstraints(aConstraints)
+ {}
+
+ ~MediaOperationTask()
+ {
+ // MediaStreams can be released on any thread.
+ }
+
+ void
+ ReturnCallbackError(nsresult rv, const char* errorLog);
+
+ NS_IMETHOD
+ Run() override
+ {
+ SourceMediaStream *source = mListener->GetSourceStream();
+ // No locking between these is required as all the callbacks for the
+ // same MediaStream will occur on the same thread.
+ if (!source) // means the stream was never Activated()
+ return NS_OK;
+
+ switch (mType) {
+ case MEDIA_START:
+ {
+ NS_ASSERTION(!NS_IsMainThread(), "Never call on main thread");
+ nsresult rv;
+
+ if (mAudioDevice) {
+ rv = mAudioDevice->GetSource()->Start(source, kAudioTrack,
+ mListener->GetPrincipalHandle());
+ if (NS_FAILED(rv)) {
+ ReturnCallbackError(rv, "Starting audio failed");
+ return NS_OK;
+ }
+ }
+ if (mVideoDevice) {
+ rv = mVideoDevice->GetSource()->Start(source, kVideoTrack,
+ mListener->GetPrincipalHandle());
+ if (NS_FAILED(rv)) {
+ ReturnCallbackError(rv, "Starting video failed");
+ return NS_OK;
+ }
+ }
+ // Start() queued the tracks to be added synchronously to avoid races
+ source->FinishAddTracks();
+
+ source->SetPullEnabled(true);
+ source->AdvanceKnownTracksTime(STREAM_TIME_MAX);
+
+ MM_LOG(("started all sources"));
+ // Forward mOnTracksAvailableCallback to GetUserMediaNotificationEvent,
+ // because mOnTracksAvailableCallback needs to be added to mStream
+ // on the main thread.
+ nsIRunnable *event =
+ new GetUserMediaNotificationEvent(GetUserMediaNotificationEvent::STARTING,
+ mStream.forget(),
+ mOnTracksAvailableCallback.forget(),
+ mAudioDevice != nullptr,
+ mVideoDevice != nullptr,
+ mWindowID, mOnFailure.forget());
+ // event must always be released on mainthread due to the JS callbacks
+ // in the TracksAvailableCallback
+ NS_DispatchToMainThread(event);
+ }
+ break;
+
+ case MEDIA_STOP:
+ case MEDIA_STOP_TRACK:
+ {
+ NS_ASSERTION(!NS_IsMainThread(), "Never call on main thread");
+ if (mAudioDevice) {
+ mAudioDevice->GetSource()->Stop(source, kAudioTrack);
+ mAudioDevice->Deallocate();
+ }
+ if (mVideoDevice) {
+ mVideoDevice->GetSource()->Stop(source, kVideoTrack);
+ mVideoDevice->Deallocate();
+ }
+ if (mType == MEDIA_STOP) {
+ source->EndAllTrackAndFinish();
+ }
+
+ nsIRunnable *event =
+ new GetUserMediaNotificationEvent(mListener,
+ mType == MEDIA_STOP ?
+ GetUserMediaNotificationEvent::STOPPING :
+ GetUserMediaNotificationEvent::STOPPED_TRACK,
+ mAudioDevice != nullptr,
+ mVideoDevice != nullptr,
+ mWindowID);
+ // event must always be released on mainthread due to the JS callbacks
+ // in the TracksAvailableCallback
+ NS_DispatchToMainThread(event);
+ }
+ break;
+
+ case MEDIA_DIRECT_LISTENERS:
+ {
+ NS_ASSERTION(!NS_IsMainThread(), "Never call on main thread");
+ if (mVideoDevice) {
+ mVideoDevice->GetSource()->SetDirectListeners(mBool);
+ }
+ }
+ break;
+
+ default:
+ MOZ_ASSERT(false,"invalid MediaManager operation");
+ break;
+ }
+
+ return NS_OK;
+ }
+
+private:
+ MediaOperation mType;
+ RefPtr<DOMMediaStream> mStream;
+ nsAutoPtr<OnTracksAvailableCallback> mOnTracksAvailableCallback;
+ RefPtr<AudioDevice> mAudioDevice; // threadsafe
+ RefPtr<VideoDevice> mVideoDevice; // threadsafe
+ RefPtr<GetUserMediaCallbackMediaStreamListener> mListener; // threadsafe
+ bool mBool;
+ uint64_t mWindowID;
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> mOnFailure;
+ dom::MediaTrackConstraints mConstraints;
+};
+
+/**
+ * Send an error back to content.
+ * Do this only on the main thread. The onSuccess callback is also passed here
+ * so it can be released correctly.
+ */
+template<class SuccessCallbackType>
+class ErrorCallbackRunnable : public Runnable
+{
+public:
+ ErrorCallbackRunnable(
+ nsCOMPtr<SuccessCallbackType>& aOnSuccess,
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback>& aOnFailure,
+ MediaMgrError& aError,
+ uint64_t aWindowID)
+ : mError(&aError)
+ , mWindowID(aWindowID)
+ , mManager(MediaManager::GetInstance())
+ {
+ mOnSuccess.swap(aOnSuccess);
+ mOnFailure.swap(aOnFailure);
+ }
+
+ NS_IMETHOD
+ Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsCOMPtr<SuccessCallbackType> onSuccess = mOnSuccess.forget();
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure = mOnFailure.forget();
+
+ // Only run if the window is still active.
+ if (!(mManager->IsWindowStillActive(mWindowID))) {
+ return NS_OK;
+ }
+ // This is safe since we're on main-thread, and the windowlist can only
+ // be invalidated from the main-thread (see OnNavigation)
+ if (auto* window = nsGlobalWindow::GetInnerWindowWithId(mWindowID)) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(window->AsInner(), *mError);
+ onFailure->OnError(error);
+ }
+ return NS_OK;
+ }
+private:
+ ~ErrorCallbackRunnable()
+ {
+ MOZ_ASSERT(!mOnSuccess && !mOnFailure);
+ }
+
+ nsCOMPtr<SuccessCallbackType> mOnSuccess;
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> mOnFailure;
+ RefPtr<MediaMgrError> mError;
+ uint64_t mWindowID;
+ RefPtr<MediaManager> mManager; // get ref to this when creating the runnable
+};
+
+// Handle removing GetUserMediaCallbackMediaStreamListener from main thread
+class GetUserMediaListenerRemove: public Runnable
+{
+public:
+ GetUserMediaListenerRemove(uint64_t aWindowID,
+ GetUserMediaCallbackMediaStreamListener *aListener)
+ : mWindowID(aWindowID)
+ , mListener(aListener) {}
+
+ NS_IMETHOD
+ Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<MediaManager> manager(MediaManager::GetInstance());
+ manager->RemoveFromWindowList(mWindowID, mListener);
+ return NS_OK;
+ }
+
+protected:
+ uint64_t mWindowID;
+ RefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
+};
+
+/**
+ * nsIMediaDevice implementation.
+ */
+NS_IMPL_ISUPPORTS(MediaDevice, nsIMediaDevice)
+
+MediaDevice::MediaDevice(MediaEngineSource* aSource, bool aIsVideo)
+ : mScary(aSource->GetScary())
+ , mMediaSource(aSource->GetMediaSource())
+ , mSource(aSource)
+ , mIsVideo(aIsVideo)
+{
+ mSource->GetName(mName);
+ nsCString id;
+ mSource->GetUUID(id);
+ CopyUTF8toUTF16(id, mID);
+}
+
+VideoDevice::VideoDevice(MediaEngineVideoSource* aSource)
+ : MediaDevice(aSource, true)
+{}
+
+/**
+ * Helper functions that implement the constraints algorithm from
+ * http://dev.w3.org/2011/webrtc/editor/getusermedia.html#methods-5
+ */
+
+bool
+MediaDevice::StringsContain(const OwningStringOrStringSequence& aStrings,
+ nsString aN)
+{
+ return aStrings.IsString() ? aStrings.GetAsString() == aN
+ : aStrings.GetAsStringSequence().Contains(aN);
+}
+
+/* static */ uint32_t
+MediaDevice::FitnessDistance(nsString aN,
+ const ConstrainDOMStringParameters& aParams)
+{
+ if (aParams.mExact.WasPassed() && !StringsContain(aParams.mExact.Value(), aN)) {
+ return UINT32_MAX;
+ }
+ if (aParams.mIdeal.WasPassed() && !StringsContain(aParams.mIdeal.Value(), aN)) {
+ return 1;
+ }
+ return 0;
+}
+
+// Binding code doesn't templatize well...
+
+/* static */ uint32_t
+MediaDevice::FitnessDistance(nsString aN,
+ const OwningStringOrStringSequenceOrConstrainDOMStringParameters& aConstraint)
+{
+ if (aConstraint.IsString()) {
+ ConstrainDOMStringParameters params;
+ params.mIdeal.Construct();
+ params.mIdeal.Value().SetAsString() = aConstraint.GetAsString();
+ return FitnessDistance(aN, params);
+ } else if (aConstraint.IsStringSequence()) {
+ ConstrainDOMStringParameters params;
+ params.mIdeal.Construct();
+ params.mIdeal.Value().SetAsStringSequence() = aConstraint.GetAsStringSequence();
+ return FitnessDistance(aN, params);
+ } else {
+ return FitnessDistance(aN, aConstraint.GetAsConstrainDOMStringParameters());
+ }
+}
+
+uint32_t
+MediaDevice::GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ bool aIsChrome)
+{
+ nsString mediaSource;
+ GetMediaSource(mediaSource);
+
+ // This code is reused for audio, where the mediaSource constraint does
+ // not currently have a function, but because it defaults to "camera" in
+ // webidl, we ignore it for audio here.
+ if (!mediaSource.EqualsASCII("microphone")) {
+ for (const auto& constraint : aConstraintSets) {
+ if (constraint->mMediaSource.mIdeal.find(mediaSource) ==
+ constraint->mMediaSource.mIdeal.end()) {
+ return UINT32_MAX;
+ }
+ }
+ }
+ // Forward request to underlying object to interrogate per-mode capabilities.
+ // Pass in device's origin-specific id for deviceId constraint comparison.
+ nsString id;
+ if (aIsChrome) {
+ GetRawId(id);
+ } else {
+ GetId(id);
+ }
+ return mSource->GetBestFitnessDistance(aConstraintSets, id);
+}
+
+AudioDevice::AudioDevice(MediaEngineAudioSource* aSource)
+ : MediaDevice(aSource, false)
+{
+ mMediaSource = aSource->GetMediaSource();
+}
+
+NS_IMETHODIMP
+MediaDevice::GetName(nsAString& aName)
+{
+ aName.Assign(mName);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaDevice::GetType(nsAString& aType)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+VideoDevice::GetType(nsAString& aType)
+{
+ aType.AssignLiteral(u"video");
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+AudioDevice::GetType(nsAString& aType)
+{
+ aType.AssignLiteral(u"audio");
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaDevice::GetId(nsAString& aID)
+{
+ aID.Assign(mID);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaDevice::GetRawId(nsAString& aID)
+{
+ aID.Assign(mRawID);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaDevice::GetScary(bool* aScary)
+{
+ *aScary = mScary;
+ return NS_OK;
+}
+
+void
+MediaDevice::SetId(const nsAString& aID)
+{
+ mID.Assign(aID);
+}
+
+void
+MediaDevice::SetRawId(const nsAString& aID)
+{
+ mRawID.Assign(aID);
+}
+
+NS_IMETHODIMP
+MediaDevice::GetMediaSource(nsAString& aMediaSource)
+{
+ if (mMediaSource == MediaSourceEnum::Microphone) {
+ aMediaSource.Assign(NS_LITERAL_STRING("microphone"));
+ } else if (mMediaSource == MediaSourceEnum::AudioCapture) {
+ aMediaSource.Assign(NS_LITERAL_STRING("audioCapture"));
+ } else if (mMediaSource == MediaSourceEnum::Window) { // this will go away
+ aMediaSource.Assign(NS_LITERAL_STRING("window"));
+ } else { // all the rest are shared
+ aMediaSource.Assign(NS_ConvertUTF8toUTF16(
+ dom::MediaSourceEnumValues::strings[uint32_t(mMediaSource)].value));
+ }
+ return NS_OK;
+}
+
+VideoDevice::Source*
+VideoDevice::GetSource()
+{
+ return static_cast<Source*>(&*mSource);
+}
+
+AudioDevice::Source*
+AudioDevice::GetSource()
+{
+ return static_cast<Source*>(&*mSource);
+}
+
+nsresult MediaDevice::Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsACString& aOrigin,
+ const char** aOutBadConstraint) {
+ return GetSource()->Allocate(aConstraints, aPrefs, mID, aOrigin,
+ getter_AddRefs(mAllocationHandle),
+ aOutBadConstraint);
+}
+
+nsresult MediaDevice::Restart(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const char** aOutBadConstraint) {
+ return GetSource()->Restart(mAllocationHandle, aConstraints, aPrefs, mID,
+ aOutBadConstraint);
+}
+
+nsresult MediaDevice::Deallocate() {
+ return GetSource()->Deallocate(mAllocationHandle);
+}
+
+void
+MediaOperationTask::ReturnCallbackError(nsresult rv, const char* errorLog)
+{
+ MM_LOG(("%s , rv=%d", errorLog, rv));
+ NS_DispatchToMainThread(do_AddRef(new ReleaseMediaOperationResource(mStream.forget(),
+ mOnTracksAvailableCallback.forget())));
+ nsString log;
+
+ log.AssignASCII(errorLog);
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> onSuccess;
+ RefPtr<MediaMgrError> error = new MediaMgrError(
+ NS_LITERAL_STRING("InternalError"), log);
+ NS_DispatchToMainThread(do_AddRef(
+ new ErrorCallbackRunnable<nsIDOMGetUserMediaSuccessCallback>(onSuccess,
+ mOnFailure,
+ *error,
+ mWindowID)));
+}
+
+static bool
+IsOn(const OwningBooleanOrMediaTrackConstraints &aUnion) {
+ return !aUnion.IsBoolean() || aUnion.GetAsBoolean();
+}
+
+static const MediaTrackConstraints&
+GetInvariant(const OwningBooleanOrMediaTrackConstraints &aUnion) {
+ static const MediaTrackConstraints empty;
+ return aUnion.IsMediaTrackConstraints() ?
+ aUnion.GetAsMediaTrackConstraints() : empty;
+}
+
+/**
+ * This class is only needed since fake tracks are added dynamically.
+ * Instead of refactoring to add them explicitly we let the DOMMediaStream
+ * query us for the source as they become available.
+ * Since they are used only for testing the API surface, we make them very
+ * simple.
+ */
+class FakeTrackSourceGetter : public MediaStreamTrackSourceGetter
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(FakeTrackSourceGetter,
+ MediaStreamTrackSourceGetter)
+
+ explicit FakeTrackSourceGetter(nsIPrincipal* aPrincipal)
+ : mPrincipal(aPrincipal) {}
+
+ already_AddRefed<dom::MediaStreamTrackSource>
+ GetMediaStreamTrackSource(TrackID aInputTrackID) override
+ {
+ NS_ASSERTION(kAudioTrack != aInputTrackID,
+ "Only fake tracks should appear dynamically");
+ NS_ASSERTION(kVideoTrack != aInputTrackID,
+ "Only fake tracks should appear dynamically");
+ return do_AddRef(new BasicTrackSource(mPrincipal));
+ }
+
+protected:
+ virtual ~FakeTrackSourceGetter() {}
+
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+};
+
+NS_IMPL_ADDREF_INHERITED(FakeTrackSourceGetter, MediaStreamTrackSourceGetter)
+NS_IMPL_RELEASE_INHERITED(FakeTrackSourceGetter, MediaStreamTrackSourceGetter)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FakeTrackSourceGetter)
+NS_INTERFACE_MAP_END_INHERITING(MediaStreamTrackSourceGetter)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(FakeTrackSourceGetter,
+ MediaStreamTrackSourceGetter,
+ mPrincipal)
+
+/**
+ * Creates a MediaStream, attaches a listener and fires off a success callback
+ * to the DOM with the stream. We also pass in the error callback so it can
+ * be released correctly.
+ *
+ * All of this must be done on the main thread!
+ *
+ * Note that the various GetUserMedia Runnable classes currently allow for
+ * two streams. If we ever need to support getting more than two streams
+ * at once, we could convert everything to nsTArray<RefPtr<blah> >'s,
+ * though that would complicate the constructors some. Currently the
+ * GetUserMedia spec does not allow for more than 2 streams to be obtained in
+ * one call, to simplify handling of constraints.
+ */
+class GetUserMediaStreamRunnable : public Runnable
+{
+public:
+ GetUserMediaStreamRunnable(
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback>& aOnSuccess,
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback>& aOnFailure,
+ uint64_t aWindowID,
+ GetUserMediaCallbackMediaStreamListener* aListener,
+ const nsCString& aOrigin,
+ const MediaStreamConstraints& aConstraints,
+ AudioDevice* aAudioDevice,
+ VideoDevice* aVideoDevice,
+ PeerIdentity* aPeerIdentity)
+ : mConstraints(aConstraints)
+ , mAudioDevice(aAudioDevice)
+ , mVideoDevice(aVideoDevice)
+ , mWindowID(aWindowID)
+ , mListener(aListener)
+ , mOrigin(aOrigin)
+ , mPeerIdentity(aPeerIdentity)
+ , mManager(MediaManager::GetInstance())
+ {
+ mOnSuccess.swap(aOnSuccess);
+ mOnFailure.swap(aOnFailure);
+ }
+
+ ~GetUserMediaStreamRunnable() {}
+
+ class TracksAvailableCallback : public OnTracksAvailableCallback
+ {
+ public:
+ TracksAvailableCallback(MediaManager* aManager,
+ nsIDOMGetUserMediaSuccessCallback* aSuccess,
+ uint64_t aWindowID,
+ DOMMediaStream* aStream)
+ : mWindowID(aWindowID), mOnSuccess(aSuccess), mManager(aManager),
+ mStream(aStream) {}
+ void NotifyTracksAvailable(DOMMediaStream* aStream) override
+ {
+ // We're in the main thread, so no worries here.
+ if (!(mManager->IsWindowStillActive(mWindowID))) {
+ return;
+ }
+
+ // Start currentTime from the point where this stream was successfully
+ // returned.
+ aStream->SetLogicalStreamStartTime(aStream->GetPlaybackStream()->GetCurrentTime());
+
+ // This is safe since we're on main-thread, and the windowlist can only
+ // be invalidated from the main-thread (see OnNavigation)
+ LOG(("Returning success for getUserMedia()"));
+ mOnSuccess->OnSuccess(aStream);
+ }
+ uint64_t mWindowID;
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> mOnSuccess;
+ RefPtr<MediaManager> mManager;
+ // Keep the DOMMediaStream alive until the NotifyTracksAvailable callback
+ // has fired, otherwise we might immediately destroy the DOMMediaStream and
+ // shut down the underlying MediaStream prematurely.
+ // This creates a cycle which is broken when NotifyTracksAvailable
+ // is fired (which will happen unless the browser shuts down,
+ // since we only add this callback when we've successfully appended
+ // the desired tracks in the MediaStreamGraph) or when
+ // DOMMediaStream::NotifyMediaStreamGraphShutdown is called.
+ RefPtr<DOMMediaStream> mStream;
+ };
+
+ NS_IMETHOD
+ Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ auto* globalWindow = nsGlobalWindow::GetInnerWindowWithId(mWindowID);
+ nsPIDOMWindowInner* window = globalWindow ? globalWindow->AsInner() : nullptr;
+
+ // We're on main-thread, and the windowlist can only
+ // be invalidated from the main-thread (see OnNavigation)
+ StreamListeners* listeners = mManager->GetWindowListeners(mWindowID);
+ if (!listeners || !window || !window->GetExtantDoc()) {
+ // This window is no longer live. mListener has already been removed
+ return NS_OK;
+ }
+
+ MediaStreamGraph::GraphDriverType graphDriverType =
+ mAudioDevice ? MediaStreamGraph::AUDIO_THREAD_DRIVER
+ : MediaStreamGraph::SYSTEM_THREAD_DRIVER;
+ MediaStreamGraph* msg =
+ MediaStreamGraph::GetInstance(graphDriverType,
+ dom::AudioChannel::Normal);
+
+ RefPtr<DOMMediaStream> domStream;
+ RefPtr<SourceMediaStream> stream;
+ // AudioCapture is a special case, here, in the sense that we're not really
+ // using the audio source and the SourceMediaStream, which acts as
+ // placeholders. We re-route a number of stream internaly in the MSG and mix
+ // them down instead.
+ if (mAudioDevice &&
+ mAudioDevice->GetMediaSource() == MediaSourceEnum::AudioCapture) {
+ // It should be possible to pipe the capture stream to anything. CORS is
+ // not a problem here, we got explicit user content.
+ nsCOMPtr<nsIPrincipal> principal = window->GetExtantDoc()->NodePrincipal();
+ domStream =
+ DOMMediaStream::CreateAudioCaptureStreamAsInput(window, principal, msg);
+
+ stream = msg->CreateSourceStream(); // Placeholder
+ msg->RegisterCaptureStreamForWindow(
+ mWindowID, domStream->GetInputStream()->AsProcessedStream());
+ window->SetAudioCapture(true);
+ } else {
+ class LocalTrackSource : public MediaStreamTrackSource
+ {
+ public:
+ LocalTrackSource(nsIPrincipal* aPrincipal,
+ const nsString& aLabel,
+ GetUserMediaCallbackMediaStreamListener* aListener,
+ const MediaSourceEnum aSource,
+ const TrackID aTrackID,
+ const PeerIdentity* aPeerIdentity)
+ : MediaStreamTrackSource(aPrincipal, aLabel), mListener(aListener),
+ mSource(aSource), mTrackID(aTrackID), mPeerIdentity(aPeerIdentity) {}
+
+ MediaSourceEnum GetMediaSource() const override
+ {
+ return mSource;
+ }
+
+ const PeerIdentity* GetPeerIdentity() const override
+ {
+ return mPeerIdentity;
+ }
+
+ already_AddRefed<PledgeVoid>
+ ApplyConstraints(nsPIDOMWindowInner* aWindow,
+ const MediaTrackConstraints& aConstraints) override
+ {
+ if (sInShutdown || !mListener) {
+ // Track has been stopped, or we are in shutdown. In either case
+ // there's no observable outcome, so pretend we succeeded.
+ RefPtr<PledgeVoid> p = new PledgeVoid();
+ p->Resolve(false);
+ return p.forget();
+ }
+ return mListener->ApplyConstraintsToTrack(aWindow, mTrackID, aConstraints);
+ }
+
+ void
+ GetSettings(dom::MediaTrackSettings& aOutSettings) override
+ {
+ if (mListener) {
+ mListener->GetSettings(aOutSettings, mTrackID);
+ }
+ }
+
+ void Stop() override
+ {
+ if (mListener) {
+ mListener->StopTrack(mTrackID);
+ mListener = nullptr;
+ }
+ }
+
+ protected:
+ ~LocalTrackSource() {}
+
+ RefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
+ const MediaSourceEnum mSource;
+ const TrackID mTrackID;
+ const RefPtr<const PeerIdentity> mPeerIdentity;
+ };
+
+ nsCOMPtr<nsIPrincipal> principal;
+ if (mPeerIdentity) {
+ principal = nsNullPrincipal::CreateWithInheritedAttributes(window->GetExtantDoc()->NodePrincipal());
+ } else {
+ principal = window->GetExtantDoc()->NodePrincipal();
+ }
+
+ // Normal case, connect the source stream to the track union stream to
+ // avoid us blocking. Pass a simple TrackSourceGetter for potential
+ // fake tracks. Apart from them gUM never adds tracks dynamically.
+ domStream =
+ DOMLocalMediaStream::CreateSourceStreamAsInput(window, msg,
+ new FakeTrackSourceGetter(principal));
+
+ if (mAudioDevice) {
+ nsString audioDeviceName;
+ mAudioDevice->GetName(audioDeviceName);
+ const MediaSourceEnum source =
+ mAudioDevice->GetSource()->GetMediaSource();
+ RefPtr<MediaStreamTrackSource> audioSource =
+ new LocalTrackSource(principal, audioDeviceName, mListener, source,
+ kAudioTrack, mPeerIdentity);
+ MOZ_ASSERT(IsOn(mConstraints.mAudio));
+ RefPtr<MediaStreamTrack> track =
+ domStream->CreateDOMTrack(kAudioTrack, MediaSegment::AUDIO, audioSource,
+ GetInvariant(mConstraints.mAudio));
+ domStream->AddTrackInternal(track);
+ }
+ if (mVideoDevice) {
+ nsString videoDeviceName;
+ mVideoDevice->GetName(videoDeviceName);
+ const MediaSourceEnum source =
+ mVideoDevice->GetSource()->GetMediaSource();
+ RefPtr<MediaStreamTrackSource> videoSource =
+ new LocalTrackSource(principal, videoDeviceName, mListener, source,
+ kVideoTrack, mPeerIdentity);
+ MOZ_ASSERT(IsOn(mConstraints.mVideo));
+ RefPtr<MediaStreamTrack> track =
+ domStream->CreateDOMTrack(kVideoTrack, MediaSegment::VIDEO, videoSource,
+ GetInvariant(mConstraints.mVideo));
+ domStream->AddTrackInternal(track);
+ }
+ stream = domStream->GetInputStream()->AsSourceStream();
+ }
+
+ if (!domStream || sInShutdown) {
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure = mOnFailure.forget();
+ LOG(("Returning error for getUserMedia() - no stream"));
+
+ if (auto* window = nsGlobalWindow::GetInnerWindowWithId(mWindowID)) {
+ RefPtr<MediaStreamError> error = new MediaStreamError(window->AsInner(),
+ NS_LITERAL_STRING("InternalError"),
+ sInShutdown ? NS_LITERAL_STRING("In shutdown") :
+ NS_LITERAL_STRING("No stream."));
+ onFailure->OnError(error);
+ }
+ return NS_OK;
+ }
+
+ // The listener was added at the beginning in an inactive state.
+ // Activate our listener. We'll call Start() on the source when get a callback
+ // that the MediaStream has started consuming. The listener is freed
+ // when the page is invalidated (on navigation or close).
+ MOZ_ASSERT(stream);
+ mListener->Activate(stream.forget(), mAudioDevice, mVideoDevice);
+
+ // Note: includes JS callbacks; must be released on MainThread
+ TracksAvailableCallback* tracksAvailableCallback =
+ new TracksAvailableCallback(mManager, mOnSuccess, mWindowID, domStream);
+
+ // Dispatch to the media thread to ask it to start the sources,
+ // because that can take a while.
+ // Pass ownership of domStream to the MediaOperationTask
+ // to ensure it's kept alive until the MediaOperationTask runs (at least).
+ RefPtr<Runnable> mediaOperation =
+ new MediaOperationTask(MEDIA_START, mListener, domStream,
+ tracksAvailableCallback,
+ mAudioDevice, mVideoDevice,
+ false, mWindowID, mOnFailure.forget());
+ MediaManager::PostTask(mediaOperation.forget());
+ // We won't need mOnFailure now.
+ mOnFailure = nullptr;
+
+ if (!MediaManager::IsPrivateBrowsing(window)) {
+ // Call GetOriginKey again, this time w/persist = true, to promote
+ // deviceIds to persistent, in case they're not already. Fire'n'forget.
+ RefPtr<Pledge<nsCString>> p = media::GetOriginKey(mOrigin, false, true);
+ }
+ return NS_OK;
+ }
+
+private:
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> mOnSuccess;
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> mOnFailure;
+ MediaStreamConstraints mConstraints;
+ RefPtr<AudioDevice> mAudioDevice;
+ RefPtr<VideoDevice> mVideoDevice;
+ uint64_t mWindowID;
+ RefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
+ nsCString mOrigin;
+ RefPtr<PeerIdentity> mPeerIdentity;
+ RefPtr<MediaManager> mManager; // get ref to this when creating the runnable
+};
+
+// Source getter returning full list
+
+template<class DeviceType>
+static void
+GetSources(MediaEngine *engine, MediaSourceEnum aSrcType,
+ void (MediaEngine::* aEnumerate)(MediaSourceEnum,
+ nsTArray<RefPtr<typename DeviceType::Source> >*),
+ nsTArray<RefPtr<DeviceType>>& aResult,
+ const char* media_device_name = nullptr)
+{
+ nsTArray<RefPtr<typename DeviceType::Source>> sources;
+
+ (engine->*aEnumerate)(aSrcType, &sources);
+ /**
+ * We're allowing multiple tabs to access the same camera for parity
+ * with Chrome. See bug 811757 for some of the issues surrounding
+ * this decision. To disallow, we'd filter by IsAvailable() as we used
+ * to.
+ */
+ if (media_device_name && *media_device_name) {
+ for (auto& source : sources) {
+ nsString deviceName;
+ source->GetName(deviceName);
+ if (deviceName.EqualsASCII(media_device_name)) {
+ aResult.AppendElement(new DeviceType(source));
+ break;
+ }
+ }
+ } else {
+ for (auto& source : sources) {
+ aResult.AppendElement(new DeviceType(source));
+ }
+ }
+}
+
+// TODO: Remove once upgraded to GCC 4.8+ on linux. Bogus error on static func:
+// error: 'this' was not captured for this lambda function
+
+static auto& MediaManager_GetInstance = MediaManager::GetInstance;
+static auto& MediaManager_ToJSArray = MediaManager::ToJSArray;
+static auto& MediaManager_AnonymizeDevices = MediaManager::AnonymizeDevices;
+
+already_AddRefed<MediaManager::PledgeChar>
+MediaManager::SelectSettings(
+ MediaStreamConstraints& aConstraints,
+ bool aIsChrome,
+ RefPtr<Refcountable<UniquePtr<SourceSet>>>& aSources)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<PledgeChar> p = new PledgeChar();
+ uint32_t id = mOutstandingCharPledges.Append(*p);
+
+ // Algorithm accesses device capabilities code and must run on media thread.
+ // Modifies passed-in aSources.
+
+ MediaManager::PostTask(NewTaskFrom([id, aConstraints,
+ aSources, aIsChrome]() mutable {
+ auto& sources = **aSources;
+
+ // Since the advanced part of the constraints algorithm needs to know when
+ // a candidate set is overconstrained (zero members), we must split up the
+ // list into videos and audios, and put it back together again at the end.
+
+ nsTArray<RefPtr<VideoDevice>> videos;
+ nsTArray<RefPtr<AudioDevice>> audios;
+
+ for (auto& source : sources) {
+ if (source->mIsVideo) {
+ RefPtr<VideoDevice> video = static_cast<VideoDevice*>(source.get());
+ videos.AppendElement(video);
+ } else {
+ RefPtr<AudioDevice> audio = static_cast<AudioDevice*>(source.get());
+ audios.AppendElement(audio);
+ }
+ }
+ sources.Clear();
+ const char* badConstraint = nullptr;
+ bool needVideo = IsOn(aConstraints.mVideo);
+ bool needAudio = IsOn(aConstraints.mAudio);
+
+ if (needVideo && videos.Length()) {
+ badConstraint = MediaConstraintsHelper::SelectSettings(
+ NormalizedConstraints(GetInvariant(aConstraints.mVideo)), videos,
+ aIsChrome);
+ }
+ if (!badConstraint && needAudio && audios.Length()) {
+ badConstraint = MediaConstraintsHelper::SelectSettings(
+ NormalizedConstraints(GetInvariant(aConstraints.mAudio)), audios,
+ aIsChrome);
+ }
+ if (!badConstraint &&
+ !needVideo == !videos.Length() &&
+ !needAudio == !audios.Length()) {
+ for (auto& video : videos) {
+ sources.AppendElement(video);
+ }
+ for (auto& audio : audios) {
+ sources.AppendElement(audio);
+ }
+ }
+ NS_DispatchToMainThread(NewRunnableFrom([id, badConstraint]() mutable {
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ RefPtr<PledgeChar> p = mgr->mOutstandingCharPledges.Remove(id);
+ if (p) {
+ p->Resolve(badConstraint);
+ }
+ return NS_OK;
+ }));
+ }));
+ return p.forget();
+}
+
+/**
+ * Runs on a seperate thread and is responsible for enumerating devices.
+ * Depending on whether a picture or stream was asked for, either
+ * ProcessGetUserMedia is called, and the results are sent back to the DOM.
+ *
+ * Do not run this on the main thread. The success and error callbacks *MUST*
+ * be dispatched on the main thread!
+ */
+class GetUserMediaTask : public Runnable
+{
+public:
+ GetUserMediaTask(
+ const MediaStreamConstraints& aConstraints,
+ already_AddRefed<nsIDOMGetUserMediaSuccessCallback> aOnSuccess,
+ already_AddRefed<nsIDOMGetUserMediaErrorCallback> aOnFailure,
+ uint64_t aWindowID, GetUserMediaCallbackMediaStreamListener *aListener,
+ MediaEnginePrefs &aPrefs,
+ const nsCString& aOrigin,
+ bool aIsChrome,
+ MediaManager::SourceSet* aSourceSet)
+ : mConstraints(aConstraints)
+ , mOnSuccess(aOnSuccess)
+ , mOnFailure(aOnFailure)
+ , mWindowID(aWindowID)
+ , mListener(aListener)
+ , mPrefs(aPrefs)
+ , mOrigin(aOrigin)
+ , mIsChrome(aIsChrome)
+ , mDeviceChosen(false)
+ , mSourceSet(aSourceSet)
+ , mManager(MediaManager::GetInstance())
+ {}
+
+ ~GetUserMediaTask() {
+ }
+
+ void
+ Fail(const nsAString& aName,
+ const nsAString& aMessage = EmptyString(),
+ const nsAString& aConstraint = EmptyString()) {
+ RefPtr<MediaMgrError> error = new MediaMgrError(aName, aMessage, aConstraint);
+ RefPtr<ErrorCallbackRunnable<nsIDOMGetUserMediaSuccessCallback>> runnable =
+ new ErrorCallbackRunnable<nsIDOMGetUserMediaSuccessCallback>(mOnSuccess,
+ mOnFailure,
+ *error,
+ mWindowID);
+ // These should be empty now
+ MOZ_ASSERT(!mOnSuccess);
+ MOZ_ASSERT(!mOnFailure);
+
+ NS_DispatchToMainThread(runnable.forget());
+ // Do after ErrorCallbackRunnable Run()s, as it checks active window list
+ NS_DispatchToMainThread(do_AddRef(new GetUserMediaListenerRemove(mWindowID, mListener)));
+ }
+
+ NS_IMETHOD
+ Run() override
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ MOZ_ASSERT(mOnSuccess);
+ MOZ_ASSERT(mOnFailure);
+ MOZ_ASSERT(mDeviceChosen);
+
+ // Allocate a video or audio device and return a MediaStream via
+ // a GetUserMediaStreamRunnable.
+
+ nsresult rv;
+ const char* errorMsg = nullptr;
+ const char* badConstraint = nullptr;
+
+ if (mAudioDevice) {
+ auto& constraints = GetInvariant(mConstraints.mAudio);
+ rv = mAudioDevice->Allocate(constraints, mPrefs, mOrigin, &badConstraint);
+ if (NS_FAILED(rv)) {
+ errorMsg = "Failed to allocate audiosource";
+ if (rv == NS_ERROR_NOT_AVAILABLE && !badConstraint) {
+ nsTArray<RefPtr<AudioDevice>> audios;
+ audios.AppendElement(mAudioDevice);
+ badConstraint = MediaConstraintsHelper::SelectSettings(
+ NormalizedConstraints(constraints), audios, mIsChrome);
+ }
+ }
+ }
+ if (!errorMsg && mVideoDevice) {
+ auto& constraints = GetInvariant(mConstraints.mVideo);
+ rv = mVideoDevice->Allocate(constraints, mPrefs, mOrigin, &badConstraint);
+ if (NS_FAILED(rv)) {
+ errorMsg = "Failed to allocate videosource";
+ if (rv == NS_ERROR_NOT_AVAILABLE && !badConstraint) {
+ nsTArray<RefPtr<VideoDevice>> videos;
+ videos.AppendElement(mVideoDevice);
+ badConstraint = MediaConstraintsHelper::SelectSettings(
+ NormalizedConstraints(constraints), videos, mIsChrome);
+ }
+ if (mAudioDevice) {
+ mAudioDevice->Deallocate();
+ }
+ }
+ }
+ if (errorMsg) {
+ LOG(("%s %d", errorMsg, rv));
+ if (badConstraint) {
+ Fail(NS_LITERAL_STRING("OverconstrainedError"),
+ NS_LITERAL_STRING(""),
+ NS_ConvertUTF8toUTF16(badConstraint));
+ } else {
+ Fail(NS_LITERAL_STRING("NotReadableError"),
+ NS_ConvertUTF8toUTF16(errorMsg));
+ }
+ return NS_OK;
+ }
+ PeerIdentity* peerIdentity = nullptr;
+ if (!mConstraints.mPeerIdentity.IsEmpty()) {
+ peerIdentity = new PeerIdentity(mConstraints.mPeerIdentity);
+ }
+
+ NS_DispatchToMainThread(do_AddRef(
+ new GetUserMediaStreamRunnable(mOnSuccess, mOnFailure, mWindowID,
+ mListener, mOrigin,
+ mConstraints, mAudioDevice, mVideoDevice,
+ peerIdentity)));
+ MOZ_ASSERT(!mOnSuccess);
+ MOZ_ASSERT(!mOnFailure);
+ return NS_OK;
+ }
+
+ nsresult
+ Denied(const nsAString& aName,
+ const nsAString& aMessage = EmptyString())
+ {
+ MOZ_ASSERT(mOnSuccess);
+ MOZ_ASSERT(mOnFailure);
+
+ // We add a disabled listener to the StreamListeners array until accepted
+ // If this was the only active MediaStream, remove the window from the list.
+ if (NS_IsMainThread()) {
+ // This is safe since we're on main-thread, and the window can only
+ // be invalidated from the main-thread (see OnNavigation)
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> onSuccess = mOnSuccess.forget();
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure = mOnFailure.forget();
+
+ if (auto* window = nsGlobalWindow::GetInnerWindowWithId(mWindowID)) {
+ RefPtr<MediaStreamError> error = new MediaStreamError(window->AsInner(),
+ aName, aMessage);
+ onFailure->OnError(error);
+ }
+ // Should happen *after* error runs for consistency, but may not matter
+ RefPtr<MediaManager> manager(MediaManager::GetInstance());
+ manager->RemoveFromWindowList(mWindowID, mListener);
+ } else {
+ // This will re-check the window being alive on main-thread
+ // and remove the listener on MainThread as well
+ Fail(aName, aMessage);
+ }
+
+ MOZ_ASSERT(!mOnSuccess);
+ MOZ_ASSERT(!mOnFailure);
+
+ return NS_OK;
+ }
+
+ nsresult
+ SetContraints(const MediaStreamConstraints& aConstraints)
+ {
+ mConstraints = aConstraints;
+ return NS_OK;
+ }
+
+ const MediaStreamConstraints&
+ GetConstraints()
+ {
+ return mConstraints;
+ }
+
+ nsresult
+ SetAudioDevice(AudioDevice* aAudioDevice)
+ {
+ mAudioDevice = aAudioDevice;
+ mDeviceChosen = true;
+ return NS_OK;
+ }
+
+ nsresult
+ SetVideoDevice(VideoDevice* aVideoDevice)
+ {
+ mVideoDevice = aVideoDevice;
+ mDeviceChosen = true;
+ return NS_OK;
+ }
+
+private:
+ MediaStreamConstraints mConstraints;
+
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> mOnSuccess;
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> mOnFailure;
+ uint64_t mWindowID;
+ RefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
+ RefPtr<AudioDevice> mAudioDevice;
+ RefPtr<VideoDevice> mVideoDevice;
+ MediaEnginePrefs mPrefs;
+ nsCString mOrigin;
+ bool mIsChrome;
+
+ bool mDeviceChosen;
+public:
+ nsAutoPtr<MediaManager::SourceSet> mSourceSet;
+private:
+ RefPtr<MediaManager> mManager; // get ref to this when creating the runnable
+};
+
+#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
+class GetUserMediaRunnableWrapper : public Runnable
+{
+public:
+ // This object must take ownership of task
+ GetUserMediaRunnableWrapper(GetUserMediaTask* task) :
+ mTask(task) {
+ }
+
+ ~GetUserMediaRunnableWrapper() {
+ }
+
+ NS_IMETHOD Run() override {
+ mTask->Run();
+ return NS_OK;
+ }
+
+private:
+ nsAutoPtr<GetUserMediaTask> mTask;
+};
+#endif
+
+/**
+ * EnumerateRawDevices - Enumerate a list of audio & video devices that
+ * satisfy passed-in constraints. List contains raw id's.
+ */
+
+already_AddRefed<MediaManager::PledgeSourceSet>
+MediaManager::EnumerateRawDevices(uint64_t aWindowId,
+ MediaSourceEnum aVideoType,
+ MediaSourceEnum aAudioType,
+ bool aFake)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aVideoType != MediaSourceEnum::Other ||
+ aAudioType != MediaSourceEnum::Other);
+ RefPtr<PledgeSourceSet> p = new PledgeSourceSet();
+ uint32_t id = mOutstandingPledges.Append(*p);
+
+ nsAdoptingCString audioLoopDev, videoLoopDev;
+ if (!aFake) {
+ // Fake stream not requested. The entire device stack is available.
+ // Loop in loopback devices if they are set, and their respective type is
+ // requested. This is currently used for automated media tests only.
+ if (aVideoType == MediaSourceEnum::Camera) {
+ videoLoopDev = Preferences::GetCString("media.video_loopback_dev");
+ }
+ if (aAudioType == MediaSourceEnum::Microphone) {
+ audioLoopDev = Preferences::GetCString("media.audio_loopback_dev");
+ }
+ }
+
+ MediaManager::PostTask(NewTaskFrom([id, aWindowId, audioLoopDev,
+ videoLoopDev, aVideoType,
+ aAudioType, aFake]() mutable {
+ // Only enumerate what's asked for, and only fake cams and mics.
+ bool hasVideo = aVideoType != MediaSourceEnum::Other;
+ bool hasAudio = aAudioType != MediaSourceEnum::Other;
+ bool fakeCams = aFake && aVideoType == MediaSourceEnum::Camera;
+ bool fakeMics = aFake && aAudioType == MediaSourceEnum::Microphone;
+
+ RefPtr<MediaEngine> fakeBackend, realBackend;
+ if (fakeCams || fakeMics) {
+ fakeBackend = new MediaEngineDefault();
+ }
+ if ((!fakeCams && hasVideo) || (!fakeMics && hasAudio)) {
+ RefPtr<MediaManager> manager = MediaManager_GetInstance();
+ realBackend = manager->GetBackend(aWindowId);
+ }
+
+ auto result = MakeUnique<SourceSet>();
+
+ if (hasVideo) {
+ nsTArray<RefPtr<VideoDevice>> videos;
+ GetSources(fakeCams? fakeBackend : realBackend, aVideoType,
+ &MediaEngine::EnumerateVideoDevices, videos, videoLoopDev);
+ for (auto& source : videos) {
+ result->AppendElement(source);
+ }
+ }
+ if (hasAudio) {
+ nsTArray<RefPtr<AudioDevice>> audios;
+ GetSources(fakeMics? fakeBackend : realBackend, aAudioType,
+ &MediaEngine::EnumerateAudioDevices, audios, audioLoopDev);
+ for (auto& source : audios) {
+ result->AppendElement(source);
+ }
+ }
+ SourceSet* handoff = result.release();
+ NS_DispatchToMainThread(NewRunnableFrom([id, handoff]() mutable {
+ UniquePtr<SourceSet> result(handoff); // grab result
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ if (!mgr) {
+ return NS_OK;
+ }
+ RefPtr<PledgeSourceSet> p = mgr->mOutstandingPledges.Remove(id);
+ if (p) {
+ p->Resolve(result.release());
+ }
+ return NS_OK;
+ }));
+ }));
+ return p.forget();
+}
+
+MediaManager::MediaManager()
+ : mMediaThread(nullptr)
+ , mBackend(nullptr) {
+ mPrefs.mFreq = 1000; // 1KHz test tone
+ mPrefs.mWidth = 0; // adaptive default
+ mPrefs.mHeight = 0; // adaptive default
+ mPrefs.mFPS = MediaEngine::DEFAULT_VIDEO_FPS;
+ mPrefs.mMinFPS = MediaEngine::DEFAULT_VIDEO_MIN_FPS;
+ mPrefs.mAecOn = false;
+ mPrefs.mAgcOn = false;
+ mPrefs.mNoiseOn = false;
+ mPrefs.mExtendedFilter = true;
+ mPrefs.mDelayAgnostic = true;
+ mPrefs.mFakeDeviceChangeEventOn = false;
+#ifdef MOZ_WEBRTC
+ mPrefs.mAec = webrtc::kEcUnchanged;
+ mPrefs.mAgc = webrtc::kAgcUnchanged;
+ mPrefs.mNoise = webrtc::kNsUnchanged;
+#else
+ mPrefs.mAec = 0;
+ mPrefs.mAgc = 0;
+ mPrefs.mNoise = 0;
+#endif
+ mPrefs.mPlayoutDelay = 0;
+ mPrefs.mFullDuplex = false;
+ nsresult rv;
+ nsCOMPtr<nsIPrefService> prefs = do_GetService("@mozilla.org/preferences-service;1", &rv);
+ if (NS_SUCCEEDED(rv)) {
+ nsCOMPtr<nsIPrefBranch> branch = do_QueryInterface(prefs);
+ if (branch) {
+ GetPrefs(branch, nullptr);
+ }
+ }
+ LOG(("%s: default prefs: %dx%d @%dfps (min %d), %dHz test tones, aec: %s,"
+ "agc: %s, noise: %s, aec level: %d, agc level: %d, noise level: %d,"
+ "playout delay: %d, %sfull_duplex, extended aec %s, delay_agnostic %s",
+ __FUNCTION__, mPrefs.mWidth, mPrefs.mHeight,
+ mPrefs.mFPS, mPrefs.mMinFPS, mPrefs.mFreq, mPrefs.mAecOn ? "on" : "off",
+ mPrefs.mAgcOn ? "on": "off", mPrefs.mNoiseOn ? "on": "off", mPrefs.mAec,
+ mPrefs.mAgc, mPrefs.mNoise, mPrefs.mPlayoutDelay, mPrefs.mFullDuplex ? "" : "not ",
+ mPrefs.mExtendedFilter ? "on" : "off", mPrefs.mDelayAgnostic ? "on" : "off"));
+}
+
+NS_IMPL_ISUPPORTS(MediaManager, nsIMediaManagerService, nsIObserver)
+
+/* static */ StaticRefPtr<MediaManager> MediaManager::sSingleton;
+
+#ifdef DEBUG
+/* static */ bool
+MediaManager::IsInMediaThread()
+{
+ return sSingleton?
+ (sSingleton->mMediaThread->thread_id() == PlatformThread::CurrentId()) :
+ false;
+}
+#endif
+
+// NOTE: never Dispatch(....,NS_DISPATCH_SYNC) to the MediaManager
+// thread from the MainThread, as we NS_DISPATCH_SYNC to MainThread
+// from MediaManager thread.
+
+// Guaranteed never to return nullptr.
+/* static */ MediaManager*
+MediaManager::Get() {
+ if (!sSingleton) {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ static int timesCreated = 0;
+ timesCreated++;
+ MOZ_RELEASE_ASSERT(timesCreated == 1);
+
+ sSingleton = new MediaManager();
+
+ sSingleton->mMediaThread = new base::Thread("MediaManager");
+ base::Thread::Options options;
+#if defined(_WIN32)
+ options.message_loop_type = MessageLoop::TYPE_MOZILLA_NONMAINUITHREAD;
+#else
+ options.message_loop_type = MessageLoop::TYPE_MOZILLA_NONMAINTHREAD;
+#endif
+ if (!sSingleton->mMediaThread->StartWithOptions(options)) {
+ MOZ_CRASH();
+ }
+
+ LOG(("New Media thread for gum"));
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ obs->AddObserver(sSingleton, "last-pb-context-exited", false);
+ obs->AddObserver(sSingleton, "getUserMedia:privileged:allow", false);
+ obs->AddObserver(sSingleton, "getUserMedia:response:allow", false);
+ obs->AddObserver(sSingleton, "getUserMedia:response:deny", false);
+ obs->AddObserver(sSingleton, "getUserMedia:revoke", false);
+ obs->AddObserver(sSingleton, "phone-state-changed", false);
+ }
+ // else MediaManager won't work properly and will leak (see bug 837874)
+ nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
+ if (prefs) {
+ prefs->AddObserver("media.navigator.video.default_width", sSingleton, false);
+ prefs->AddObserver("media.navigator.video.default_height", sSingleton, false);
+ prefs->AddObserver("media.navigator.video.default_fps", sSingleton, false);
+ prefs->AddObserver("media.navigator.video.default_minfps", sSingleton, false);
+ prefs->AddObserver("media.navigator.audio.fake_frequency", sSingleton, false);
+ prefs->AddObserver("media.navigator.audio.full_duplex", sSingleton, false);
+#ifdef MOZ_WEBRTC
+ prefs->AddObserver("media.getusermedia.aec_enabled", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.aec", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.agc_enabled", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.agc", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.noise_enabled", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.noise", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.playout_delay", sSingleton, false);
+ prefs->AddObserver("media.ondevicechange.fakeDeviceChangeEvent.enabled", sSingleton, false);
+#endif
+ }
+
+ // Prepare async shutdown
+
+ nsCOMPtr<nsIAsyncShutdownClient> shutdownPhase = GetShutdownPhase();
+
+ class Blocker : public media::ShutdownBlocker
+ {
+ public:
+ Blocker()
+ : media::ShutdownBlocker(NS_LITERAL_STRING(
+ "Media shutdown: blocking on media thread")) {}
+
+ NS_IMETHOD BlockShutdown(nsIAsyncShutdownClient*) override
+ {
+ MOZ_RELEASE_ASSERT(MediaManager::GetIfExists());
+ MediaManager::GetIfExists()->Shutdown();
+ return NS_OK;
+ }
+ };
+
+ sSingleton->mShutdownBlocker = new Blocker();
+ nsresult rv = shutdownPhase->AddBlocker(sSingleton->mShutdownBlocker,
+ NS_LITERAL_STRING(__FILE__),
+ __LINE__,
+ NS_LITERAL_STRING("Media shutdown"));
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+#ifdef MOZ_B2G
+ // Init MediaPermissionManager before sending out any permission requests.
+ (void) MediaPermissionManager::GetInstance();
+#endif //MOZ_B2G
+ }
+ return sSingleton;
+}
+
+/* static */ MediaManager*
+MediaManager::GetIfExists() {
+ return sSingleton;
+}
+
+/* static */ already_AddRefed<MediaManager>
+MediaManager::GetInstance()
+{
+ // so we can have non-refcounted getters
+ RefPtr<MediaManager> service = MediaManager::Get();
+ return service.forget();
+}
+
+media::Parent<media::NonE10s>*
+MediaManager::GetNonE10sParent()
+{
+ if (!mNonE10sParent) {
+ mNonE10sParent = new media::Parent<media::NonE10s>();
+ }
+ return mNonE10sParent;
+}
+
+/* static */ void
+MediaManager::StartupInit()
+{
+#ifdef WIN32
+ if (IsVistaOrLater() && !IsWin8OrLater()) {
+ // Bug 1107702 - Older Windows fail in GetAdaptersInfo (and others) if the
+ // first(?) call occurs after the process size is over 2GB (kb/2588507).
+ // Attempt to 'prime' the pump by making a call at startup.
+ unsigned long out_buf_len = sizeof(IP_ADAPTER_INFO);
+ PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *) moz_xmalloc(out_buf_len);
+ if (GetAdaptersInfo(pAdapterInfo, &out_buf_len) == ERROR_BUFFER_OVERFLOW) {
+ free(pAdapterInfo);
+ pAdapterInfo = (IP_ADAPTER_INFO *) moz_xmalloc(out_buf_len);
+ GetAdaptersInfo(pAdapterInfo, &out_buf_len);
+ }
+ if (pAdapterInfo) {
+ free(pAdapterInfo);
+ }
+ }
+#endif
+}
+
+/* static */
+void
+MediaManager::PostTask(already_AddRefed<Runnable> task)
+{
+ if (sInShutdown) {
+ // Can't safely delete task here since it may have items with specific
+ // thread-release requirements.
+ // XXXkhuey well then who is supposed to delete it?! We don't signal
+ // that we failed ...
+ MOZ_CRASH();
+ return;
+ }
+ NS_ASSERTION(Get(), "MediaManager singleton?");
+ NS_ASSERTION(Get()->mMediaThread, "No thread yet");
+ Get()->mMediaThread->message_loop()->PostTask(Move(task));
+}
+
+/* static */ nsresult
+MediaManager::NotifyRecordingStatusChange(nsPIDOMWindowInner* aWindow,
+ const nsString& aMsg,
+ const bool& aIsAudio,
+ const bool& aIsVideo)
+{
+ NS_ENSURE_ARG(aWindow);
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (!obs) {
+ NS_WARNING("Could not get the Observer service for GetUserMedia recording notification.");
+ return NS_ERROR_FAILURE;
+ }
+
+ RefPtr<nsHashPropertyBag> props = new nsHashPropertyBag();
+ props->SetPropertyAsBool(NS_LITERAL_STRING("isAudio"), aIsAudio);
+ props->SetPropertyAsBool(NS_LITERAL_STRING("isVideo"), aIsVideo);
+
+ bool isApp = false;
+ nsString requestURL;
+
+ if (nsCOMPtr<nsIDocShell> docShell = aWindow->GetDocShell()) {
+ isApp = docShell->GetIsApp();
+ if (isApp) {
+ nsresult rv = docShell->GetAppManifestURL(requestURL);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ }
+
+ if (!isApp) {
+ nsCString pageURL;
+ nsCOMPtr<nsIURI> docURI = aWindow->GetDocumentURI();
+ NS_ENSURE_TRUE(docURI, NS_ERROR_FAILURE);
+
+ nsresult rv = docURI->GetSpec(pageURL);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ requestURL = NS_ConvertUTF8toUTF16(pageURL);
+ }
+
+ props->SetPropertyAsBool(NS_LITERAL_STRING("isApp"), isApp);
+ props->SetPropertyAsAString(NS_LITERAL_STRING("requestURL"), requestURL);
+
+ obs->NotifyObservers(static_cast<nsIPropertyBag2*>(props),
+ "recording-device-events",
+ aMsg.get());
+
+ // Forward recording events to parent process.
+ // The events are gathered in chrome process and used for recording indicator
+ if (!XRE_IsParentProcess()) {
+ Unused <<
+ dom::ContentChild::GetSingleton()->SendRecordingDeviceEvents(aMsg,
+ requestURL,
+ aIsAudio,
+ aIsVideo);
+ }
+
+ return NS_OK;
+}
+
+bool MediaManager::IsPrivateBrowsing(nsPIDOMWindowInner* window)
+{
+ nsCOMPtr<nsIDocument> doc = window->GetDoc();
+ nsCOMPtr<nsILoadContext> loadContext = doc->GetLoadContext();
+ return loadContext && loadContext->UsePrivateBrowsing();
+}
+
+int MediaManager::AddDeviceChangeCallback(DeviceChangeCallback* aCallback)
+{
+ bool fakeDeviceChangeEventOn = mPrefs.mFakeDeviceChangeEventOn;
+ MediaManager::PostTask(NewTaskFrom([fakeDeviceChangeEventOn]() {
+ RefPtr<MediaManager> manager = MediaManager_GetInstance();
+ manager->GetBackend(0)->AddDeviceChangeCallback(manager);
+ if (fakeDeviceChangeEventOn)
+ manager->GetBackend(0)->SetFakeDeviceChangeEvents();
+ }));
+
+ return DeviceChangeCallback::AddDeviceChangeCallback(aCallback);
+}
+
+void MediaManager::OnDeviceChange() {
+ RefPtr<MediaManager> self(this);
+ NS_DispatchToMainThread(media::NewRunnableFrom([self,this]() mutable {
+ MOZ_ASSERT(NS_IsMainThread());
+ DeviceChangeCallback::OnDeviceChange();
+ return NS_OK;
+ }));
+}
+
+nsresult MediaManager::GenerateUUID(nsAString& aResult)
+{
+ nsresult rv;
+ nsCOMPtr<nsIUUIDGenerator> uuidgen =
+ do_GetService("@mozilla.org/uuid-generator;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Generate a call ID.
+ nsID id;
+ rv = uuidgen->GenerateUUIDInPlace(&id);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ char buffer[NSID_LENGTH];
+ id.ToProvidedString(buffer);
+ aResult.Assign(NS_ConvertUTF8toUTF16(buffer));
+ return NS_OK;
+}
+
+enum class GetUserMediaSecurityState {
+ Other = 0,
+ HTTPS = 1,
+ File = 2,
+ App = 3,
+ Localhost = 4,
+ Loop = 5,
+ Privileged = 6
+};
+
+/**
+ * The entry point for this file. A call from Navigator::mozGetUserMedia
+ * will end up here. MediaManager is a singleton that is responsible
+ * for handling all incoming getUserMedia calls from every window.
+ */
+nsresult
+MediaManager::GetUserMedia(nsPIDOMWindowInner* aWindow,
+ const MediaStreamConstraints& aConstraintsPassedIn,
+ nsIDOMGetUserMediaSuccessCallback* aOnSuccess,
+ nsIDOMGetUserMediaErrorCallback* aOnFailure)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aWindow);
+ MOZ_ASSERT(aOnFailure);
+ MOZ_ASSERT(aOnSuccess);
+ nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> onSuccess(aOnSuccess);
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure(aOnFailure);
+ uint64_t windowID = aWindow->WindowID();
+
+ MediaStreamConstraints c(aConstraintsPassedIn); // use a modifiable copy
+
+ // Do all the validation we can while we're sync (to return an
+ // already-rejected promise on failure).
+
+ if (!IsOn(c.mVideo) && !IsOn(c.mAudio)) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("NotSupportedError"),
+ NS_LITERAL_STRING("audio and/or video is required"));
+ onFailure->OnError(error);
+ return NS_OK;
+ }
+ if (sInShutdown) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("AbortError"),
+ NS_LITERAL_STRING("In shutdown"));
+ onFailure->OnError(error);
+ return NS_OK;
+ }
+
+ // Determine permissions early (while we still have a stack).
+
+ nsIURI* docURI = aWindow->GetDocumentURI();
+ if (!docURI) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ bool isChrome = nsContentUtils::IsCallerChrome();
+ bool privileged = isChrome ||
+ Preferences::GetBool("media.navigator.permission.disabled", false);
+ bool isHTTPS = false;
+ docURI->SchemeIs("https", &isHTTPS);
+ nsCString host;
+ nsresult rv = docURI->GetHost(host);
+ // Test for some other schemes that ServiceWorker recognizes
+ bool isFile;
+ docURI->SchemeIs("file", &isFile);
+ bool isApp;
+ docURI->SchemeIs("app", &isApp);
+ // Same localhost check as ServiceWorkers uses
+ // (see IsOriginPotentiallyTrustworthy())
+ bool isLocalhost = NS_SUCCEEDED(rv) &&
+ (host.LowerCaseEqualsLiteral("localhost") ||
+ host.LowerCaseEqualsLiteral("127.0.0.1") ||
+ host.LowerCaseEqualsLiteral("::1"));
+
+ // Record telemetry about whether the source of the call was secure, i.e.,
+ // privileged or HTTPS. We may handle other cases
+if (privileged) {
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_SECURE_ORIGIN,
+ (uint32_t) GetUserMediaSecurityState::Privileged);
+ } else if (isHTTPS) {
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_SECURE_ORIGIN,
+ (uint32_t) GetUserMediaSecurityState::HTTPS);
+ } else if (isFile) {
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_SECURE_ORIGIN,
+ (uint32_t) GetUserMediaSecurityState::File);
+ } else if (isApp) {
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_SECURE_ORIGIN,
+ (uint32_t) GetUserMediaSecurityState::App);
+ } else if (isLocalhost) {
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_SECURE_ORIGIN,
+ (uint32_t) GetUserMediaSecurityState::Localhost);
+ } else {
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_SECURE_ORIGIN,
+ (uint32_t) GetUserMediaSecurityState::Other);
+ }
+
+ nsCString origin;
+ rv = nsPrincipal::GetOriginForURI(docURI, origin);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ if (!Preferences::GetBool("media.navigator.video.enabled", true)) {
+ c.mVideo.SetAsBoolean() = false;
+ }
+
+ MediaSourceEnum videoType = MediaSourceEnum::Other; // none
+ MediaSourceEnum audioType = MediaSourceEnum::Other; // none
+
+ if (c.mVideo.IsMediaTrackConstraints()) {
+ auto& vc = c.mVideo.GetAsMediaTrackConstraints();
+ videoType = StringToEnum(dom::MediaSourceEnumValues::strings,
+ vc.mMediaSource,
+ MediaSourceEnum::Other);
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_TYPE,
+ (uint32_t) videoType);
+ switch (videoType) {
+ case MediaSourceEnum::Camera:
+ break;
+
+ case MediaSourceEnum::Browser:
+ // If no window id is passed in then default to the caller's window.
+ // Functional defaults are helpful in tests, but also a natural outcome
+ // of the constraints API's limited semantics for requiring input.
+ if (!vc.mBrowserWindow.WasPassed()) {
+ nsPIDOMWindowOuter* outer = aWindow->GetOuterWindow();
+ vc.mBrowserWindow.Construct(outer->WindowID());
+ }
+ MOZ_FALLTHROUGH;
+ case MediaSourceEnum::Screen:
+ case MediaSourceEnum::Application:
+ case MediaSourceEnum::Window:
+ // Deny screensharing request if support is disabled, or
+ // the requesting document is not from a host on the whitelist, or
+ // we're on WinXP until proved that it works
+ if (!Preferences::GetBool(((videoType == MediaSourceEnum::Browser)?
+ "media.getusermedia.browser.enabled" :
+ "media.getusermedia.screensharing.enabled"),
+ false) ||
+#if defined(XP_WIN)
+ (
+ // Allow tab sharing for all platforms including XP
+ (videoType != MediaSourceEnum::Browser) &&
+ !Preferences::GetBool("media.getusermedia.screensharing.allow_on_old_platforms",
+ false) && !IsVistaOrLater()) ||
+#endif
+ (!privileged && !HostIsHttps(*docURI))) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("NotAllowedError"));
+ onFailure->OnError(error);
+ return NS_OK;
+ }
+ break;
+
+ case MediaSourceEnum::Microphone:
+ case MediaSourceEnum::Other:
+ default: {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("OverconstrainedError"),
+ NS_LITERAL_STRING(""),
+ NS_LITERAL_STRING("mediaSource"));
+ onFailure->OnError(error);
+ return NS_OK;
+ }
+ }
+
+ if (vc.mAdvanced.WasPassed() && videoType != MediaSourceEnum::Camera) {
+ // iterate through advanced, forcing all unset mediaSources to match "root"
+ const char *unset = EnumToASCII(dom::MediaSourceEnumValues::strings,
+ MediaSourceEnum::Camera);
+ for (MediaTrackConstraintSet& cs : vc.mAdvanced.Value()) {
+ if (cs.mMediaSource.EqualsASCII(unset)) {
+ cs.mMediaSource = vc.mMediaSource;
+ }
+ }
+ }
+ if (!privileged) {
+ // only allow privileged content to set the window id
+ if (vc.mBrowserWindow.WasPassed()) {
+ vc.mBrowserWindow.Value() = -1;
+ }
+ if (vc.mAdvanced.WasPassed()) {
+ for (MediaTrackConstraintSet& cs : vc.mAdvanced.Value()) {
+ if (cs.mBrowserWindow.WasPassed()) {
+ cs.mBrowserWindow.Value() = -1;
+ }
+ }
+ }
+ }
+ } else if (IsOn(c.mVideo)) {
+ videoType = MediaSourceEnum::Camera;
+ }
+
+ if (c.mAudio.IsMediaTrackConstraints()) {
+ auto& ac = c.mAudio.GetAsMediaTrackConstraints();
+ audioType = StringToEnum(dom::MediaSourceEnumValues::strings,
+ ac.mMediaSource,
+ MediaSourceEnum::Other);
+ // Work around WebIDL default since spec uses same dictionary w/audio & video.
+ if (audioType == MediaSourceEnum::Camera) {
+ audioType = MediaSourceEnum::Microphone;
+ ac.mMediaSource.AssignASCII(EnumToASCII(dom::MediaSourceEnumValues::strings,
+ audioType));
+ }
+ Telemetry::Accumulate(Telemetry::WEBRTC_GET_USER_MEDIA_TYPE,
+ (uint32_t) audioType);
+
+ switch (audioType) {
+ case MediaSourceEnum::Microphone:
+ break;
+
+ case MediaSourceEnum::AudioCapture:
+ // Only enable AudioCapture if the pref is enabled. If it's not, we can
+ // deny right away.
+ if (!Preferences::GetBool("media.getusermedia.audiocapture.enabled")) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("NotAllowedError"));
+ onFailure->OnError(error);
+ return NS_OK;
+ }
+ break;
+
+ case MediaSourceEnum::Other:
+ default: {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("OverconstrainedError"),
+ NS_LITERAL_STRING(""),
+ NS_LITERAL_STRING("mediaSource"));
+ onFailure->OnError(error);
+ return NS_OK;
+ }
+ }
+ if (ac.mAdvanced.WasPassed()) {
+ // iterate through advanced, forcing all unset mediaSources to match "root"
+ const char *unset = EnumToASCII(dom::MediaSourceEnumValues::strings,
+ MediaSourceEnum::Camera);
+ for (MediaTrackConstraintSet& cs : ac.mAdvanced.Value()) {
+ if (cs.mMediaSource.EqualsASCII(unset)) {
+ cs.mMediaSource = ac.mMediaSource;
+ }
+ }
+ }
+ } else if (IsOn(c.mAudio)) {
+ audioType = MediaSourceEnum::Microphone;
+ }
+
+ StreamListeners* listeners = AddWindowID(windowID);
+
+ // Create a disabled listener to act as a placeholder
+ nsIPrincipal* principal = aWindow->GetExtantDoc()->NodePrincipal();
+ RefPtr<GetUserMediaCallbackMediaStreamListener> listener =
+ new GetUserMediaCallbackMediaStreamListener(mMediaThread, windowID,
+ MakePrincipalHandle(principal));
+
+ // No need for locking because we always do this in the main thread.
+ listeners->AppendElement(listener);
+
+ if (!privileged) {
+ // Check if this site has had persistent permissions denied.
+ nsCOMPtr<nsIPermissionManager> permManager =
+ do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ uint32_t audioPerm = nsIPermissionManager::UNKNOWN_ACTION;
+ if (IsOn(c.mAudio)) {
+ rv = permManager->TestExactPermissionFromPrincipal(
+ principal, "microphone", &audioPerm);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ uint32_t videoPerm = nsIPermissionManager::UNKNOWN_ACTION;
+ if (IsOn(c.mVideo)) {
+ rv = permManager->TestExactPermissionFromPrincipal(
+ principal, "camera", &videoPerm);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ if ((!IsOn(c.mAudio) && !IsOn(c.mVideo)) ||
+ (IsOn(c.mAudio) && audioPerm == nsIPermissionManager::DENY_ACTION) ||
+ (IsOn(c.mVideo) && videoPerm == nsIPermissionManager::DENY_ACTION)) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(aWindow, NS_LITERAL_STRING("NotAllowedError"));
+ onFailure->OnError(error);
+ RemoveFromWindowList(windowID, listener);
+ return NS_OK;
+ }
+ }
+
+ // Get list of all devices, with origin-specific device ids.
+
+ MediaEnginePrefs prefs = mPrefs;
+
+ nsString callID;
+ rv = GenerateUUID(callID);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ bool fake = c.mFake.WasPassed()? c.mFake.Value() :
+ Preferences::GetBool("media.navigator.streams.fake");
+
+ bool askPermission =
+ (!privileged || Preferences::GetBool("media.navigator.permission.force")) &&
+ (!fake || Preferences::GetBool("media.navigator.permission.fake"));
+
+ RefPtr<MediaManager> self = this;
+ RefPtr<PledgeSourceSet> p = EnumerateDevicesImpl(windowID, videoType,
+ audioType, fake);
+ p->Then([self, onSuccess, onFailure, windowID, c, listener, askPermission,
+ prefs, isHTTPS, callID, origin, isChrome](SourceSet*& aDevices) mutable {
+
+ RefPtr<Refcountable<UniquePtr<SourceSet>>> devices(
+ new Refcountable<UniquePtr<SourceSet>>(aDevices)); // grab result
+
+ // Ensure that our windowID is still good.
+ if (!nsGlobalWindow::GetInnerWindowWithId(windowID)) {
+ return;
+ }
+
+ // Apply any constraints. This modifies the passed-in list.
+ RefPtr<PledgeChar> p2 = self->SelectSettings(c, isChrome, devices);
+
+ p2->Then([self, onSuccess, onFailure, windowID, c,
+ listener, askPermission, prefs, isHTTPS, callID,
+ origin, isChrome, devices](const char*& badConstraint) mutable {
+
+ // Ensure that the captured 'this' pointer and our windowID are still good.
+ auto* globalWindow = nsGlobalWindow::GetInnerWindowWithId(windowID);
+ RefPtr<nsPIDOMWindowInner> window = globalWindow ? globalWindow->AsInner()
+ : nullptr;
+ if (!MediaManager::Exists() || !window) {
+ return;
+ }
+
+ if (badConstraint) {
+ nsString constraint;
+ constraint.AssignASCII(badConstraint);
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(window,
+ NS_LITERAL_STRING("OverconstrainedError"),
+ NS_LITERAL_STRING(""),
+ constraint);
+ onFailure->OnError(error);
+ return;
+ }
+ if (!(*devices)->Length()) {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(window, NS_LITERAL_STRING("NotFoundError"));
+ onFailure->OnError(error);
+ return;
+ }
+
+ nsCOMPtr<nsIMutableArray> devicesCopy = nsArray::Create(); // before we give up devices below
+ if (!askPermission) {
+ for (auto& device : **devices) {
+ nsresult rv = devicesCopy->AppendElement(device, /*weak =*/ false);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+ }
+ }
+
+ // Pass callbacks and MediaStreamListener along to GetUserMediaTask.
+ RefPtr<GetUserMediaTask> task (new GetUserMediaTask(c, onSuccess.forget(),
+ onFailure.forget(),
+ windowID, listener,
+ prefs, origin,
+ isChrome,
+ devices->release()));
+ // Store the task w/callbacks.
+ self->mActiveCallbacks.Put(callID, task.forget());
+
+ // Add a WindowID cross-reference so OnNavigation can tear things down
+ nsTArray<nsString>* array;
+ if (!self->mCallIds.Get(windowID, &array)) {
+ array = new nsTArray<nsString>();
+ self->mCallIds.Put(windowID, array);
+ }
+ array->AppendElement(callID);
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (!askPermission) {
+ obs->NotifyObservers(devicesCopy, "getUserMedia:privileged:allow",
+ callID.BeginReading());
+ } else {
+ RefPtr<GetUserMediaRequest> req =
+ new GetUserMediaRequest(window, callID, c, isHTTPS);
+ obs->NotifyObservers(req, "getUserMedia:request", nullptr);
+ }
+
+#ifdef MOZ_WEBRTC
+ EnableWebRtcLog();
+#endif
+ }, [onFailure](MediaStreamError*& reason) mutable {
+ onFailure->OnError(reason);
+ });
+ }, [onFailure](MediaStreamError*& reason) mutable {
+ onFailure->OnError(reason);
+ });
+ return NS_OK;
+}
+
+/* static */ void
+MediaManager::AnonymizeDevices(SourceSet& aDevices, const nsACString& aOriginKey)
+{
+ if (!aOriginKey.IsEmpty()) {
+ for (auto& device : aDevices) {
+ nsString id;
+ device->GetId(id);
+ device->SetRawId(id);
+ AnonymizeId(id, aOriginKey);
+ device->SetId(id);
+ }
+ }
+}
+
+/* static */ nsresult
+MediaManager::AnonymizeId(nsAString& aId, const nsACString& aOriginKey)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsresult rv;
+ nsCOMPtr<nsIKeyObjectFactory> factory =
+ do_GetService("@mozilla.org/security/keyobjectfactory;1", &rv);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ nsCString rawKey;
+ rv = Base64Decode(aOriginKey, rawKey);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ nsCOMPtr<nsIKeyObject> key;
+ rv = factory->KeyFromString(nsIKeyObject::HMAC, rawKey, getter_AddRefs(key));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ nsCOMPtr<nsICryptoHMAC> hasher =
+ do_CreateInstance(NS_CRYPTO_HMAC_CONTRACTID, &rv);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ rv = hasher->Init(nsICryptoHMAC::SHA256, key);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ NS_ConvertUTF16toUTF8 id(aId);
+ rv = hasher->Update(reinterpret_cast<const uint8_t*> (id.get()), id.Length());
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ nsCString mac;
+ rv = hasher->Finish(true, mac);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ aId = NS_ConvertUTF8toUTF16(mac);
+ return NS_OK;
+}
+
+/* static */
+already_AddRefed<nsIWritableVariant>
+MediaManager::ToJSArray(SourceSet& aDevices)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<nsVariantCC> var = new nsVariantCC();
+ size_t len = aDevices.Length();
+ if (len) {
+ nsTArray<nsIMediaDevice*> tmp(len);
+ for (auto& device : aDevices) {
+ tmp.AppendElement(device);
+ }
+ auto* elements = static_cast<const void*>(tmp.Elements());
+ nsresult rv = var->SetAsArray(nsIDataType::VTYPE_INTERFACE,
+ &NS_GET_IID(nsIMediaDevice), len,
+ const_cast<void*>(elements));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return nullptr;
+ }
+ } else {
+ var->SetAsEmptyArray(); // because SetAsArray() fails on zero length arrays.
+ }
+ return var.forget();
+}
+
+already_AddRefed<MediaManager::PledgeSourceSet>
+MediaManager::EnumerateDevicesImpl(uint64_t aWindowId,
+ MediaSourceEnum aVideoType,
+ MediaSourceEnum aAudioType,
+ bool aFake)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsPIDOMWindowInner* window =
+ nsGlobalWindow::GetInnerWindowWithId(aWindowId)->AsInner();
+
+ // This function returns a pledge, a promise-like object with the future result
+ RefPtr<PledgeSourceSet> pledge = new PledgeSourceSet();
+ uint32_t id = mOutstandingPledges.Append(*pledge);
+
+ // To get a device list anonymized for a particular origin, we must:
+ // 1. Get an origin-key (for either regular or private browsing)
+ // 2. Get the raw devices list
+ // 3. Anonymize the raw list with the origin-key.
+
+ bool privateBrowsing = IsPrivateBrowsing(window);
+ nsCString origin;
+ nsPrincipal::GetOriginForURI(window->GetDocumentURI(), origin);
+
+ bool persist = IsActivelyCapturingOrHasAPermission(aWindowId);
+
+ // GetOriginKey is an async API that returns a pledge (a promise-like
+ // pattern). We use .Then() to pass in a lambda to run back on this same
+ // thread later once GetOriginKey resolves. Needed variables are "captured"
+ // (passed by value) safely into the lambda.
+
+ RefPtr<Pledge<nsCString>> p = media::GetOriginKey(origin, privateBrowsing,
+ persist);
+ p->Then([id, aWindowId, aVideoType, aAudioType,
+ aFake](const nsCString& aOriginKey) mutable {
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+
+ RefPtr<PledgeSourceSet> p = mgr->EnumerateRawDevices(aWindowId, aVideoType,
+ aAudioType, aFake);
+ p->Then([id, aWindowId, aOriginKey](SourceSet*& aDevices) mutable {
+ UniquePtr<SourceSet> devices(aDevices); // secondary result
+
+ // Only run if window is still on our active list.
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ if (!mgr) {
+ return NS_OK;
+ }
+ RefPtr<PledgeSourceSet> p = mgr->mOutstandingPledges.Remove(id);
+ if (!p || !mgr->IsWindowStillActive(aWindowId)) {
+ return NS_OK;
+ }
+ MediaManager_AnonymizeDevices(*devices, aOriginKey);
+ p->Resolve(devices.release());
+ return NS_OK;
+ });
+ });
+ return pledge.forget();
+}
+
+nsresult
+MediaManager::EnumerateDevices(nsPIDOMWindowInner* aWindow,
+ nsIGetUserMediaDevicesSuccessCallback* aOnSuccess,
+ nsIDOMGetUserMediaErrorCallback* aOnFailure)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE(!sInShutdown, NS_ERROR_FAILURE);
+ nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> onSuccess(aOnSuccess);
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure(aOnFailure);
+ uint64_t windowId = aWindow->WindowID();
+
+ StreamListeners* listeners = AddWindowID(windowId);
+
+ nsIPrincipal* principal = aWindow->GetExtantDoc()->NodePrincipal();
+
+ // Create a disabled listener to act as a placeholder
+ RefPtr<GetUserMediaCallbackMediaStreamListener> listener =
+ new GetUserMediaCallbackMediaStreamListener(mMediaThread, windowId,
+ MakePrincipalHandle(principal));
+
+ // No need for locking because we always do this in the main thread.
+ listeners->AppendElement(listener);
+
+ bool fake = Preferences::GetBool("media.navigator.streams.fake");
+
+ RefPtr<PledgeSourceSet> p = EnumerateDevicesImpl(windowId,
+ MediaSourceEnum::Camera,
+ MediaSourceEnum::Microphone,
+ fake);
+ p->Then([onSuccess, windowId, listener](SourceSet*& aDevices) mutable {
+ UniquePtr<SourceSet> devices(aDevices); // grab result
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ mgr->RemoveFromWindowList(windowId, listener);
+ nsCOMPtr<nsIWritableVariant> array = MediaManager_ToJSArray(*devices);
+ onSuccess->OnSuccess(array);
+ }, [onFailure, windowId, listener](MediaStreamError*& reason) mutable {
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ mgr->RemoveFromWindowList(windowId, listener);
+ onFailure->OnError(reason);
+ });
+ return NS_OK;
+}
+
+/*
+ * GetUserMediaDevices - called by the UI-part of getUserMedia from chrome JS.
+ */
+
+nsresult
+MediaManager::GetUserMediaDevices(nsPIDOMWindowInner* aWindow,
+ const MediaStreamConstraints& aConstraints,
+ nsIGetUserMediaDevicesSuccessCallback* aOnSuccess,
+ nsIDOMGetUserMediaErrorCallback* aOnFailure,
+ uint64_t aWindowId,
+ const nsAString& aCallID)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> onSuccess(aOnSuccess);
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onFailure(aOnFailure);
+ if (!aWindowId) {
+ aWindowId = aWindow->WindowID();
+ }
+
+ // Ignore passed-in constraints, instead locate + return already-constrained list.
+
+ nsTArray<nsString>* callIDs;
+ if (!mCallIds.Get(aWindowId, &callIDs)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ for (auto& callID : *callIDs) {
+ RefPtr<GetUserMediaTask> task;
+ if (!aCallID.Length() || aCallID == callID) {
+ if (mActiveCallbacks.Get(callID, getter_AddRefs(task))) {
+ nsCOMPtr<nsIWritableVariant> array = MediaManager_ToJSArray(*task->mSourceSet);
+ onSuccess->OnSuccess(array);
+ return NS_OK;
+ }
+ }
+ }
+ return NS_ERROR_UNEXPECTED;
+}
+
+MediaEngine*
+MediaManager::GetBackend(uint64_t aWindowId)
+{
+ MOZ_ASSERT(MediaManager::IsInMediaThread());
+ // Plugin backends as appropriate. The default engine also currently
+ // includes picture support for Android.
+ // This IS called off main-thread.
+ if (!mBackend) {
+ MOZ_RELEASE_ASSERT(!sInShutdown); // we should never create a new backend in shutdown
+#if defined(MOZ_WEBRTC)
+ mBackend = new MediaEngineWebRTC(mPrefs);
+#else
+ mBackend = new MediaEngineDefault();
+#endif
+ }
+ return mBackend;
+}
+
+static void
+StopSharingCallback(MediaManager *aThis,
+ uint64_t aWindowID,
+ StreamListeners *aListeners,
+ void *aData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (aListeners) {
+ auto length = aListeners->Length();
+ for (size_t i = 0; i < length; ++i) {
+ GetUserMediaCallbackMediaStreamListener *listener = aListeners->ElementAt(i);
+
+ if (listener->Stream()) { // aka HasBeenActivate()ed
+ listener->Stop();
+ }
+ listener->Remove();
+ listener->StopSharing();
+ }
+ aListeners->Clear();
+ aThis->RemoveWindowID(aWindowID);
+ }
+}
+
+
+void
+MediaManager::OnNavigation(uint64_t aWindowID)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ LOG(("OnNavigation for %llu", aWindowID));
+
+ // Stop the streams for this window. The runnables check this value before
+ // making a call to content.
+
+ nsTArray<nsString>* callIDs;
+ if (mCallIds.Get(aWindowID, &callIDs)) {
+ for (auto& callID : *callIDs) {
+ mActiveCallbacks.Remove(callID);
+ }
+ mCallIds.Remove(aWindowID);
+ }
+
+ // This is safe since we're on main-thread, and the windowlist can only
+ // be added to from the main-thread
+ auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowID);
+ if (window) {
+ IterateWindowListeners(window->AsInner(), StopSharingCallback, nullptr);
+ } else {
+ RemoveWindowID(aWindowID);
+ }
+
+ RemoveMediaDevicesCallback(aWindowID);
+}
+
+void
+MediaManager::RemoveMediaDevicesCallback(uint64_t aWindowID)
+{
+ MutexAutoLock lock(mCallbackMutex);
+ for (DeviceChangeCallback* observer : mDeviceChangeCallbackList)
+ {
+ dom::MediaDevices* mediadevices = static_cast<dom::MediaDevices *>(observer);
+ MOZ_ASSERT(mediadevices);
+ if (mediadevices) {
+ nsPIDOMWindowInner* window = mediadevices->GetOwner();
+ MOZ_ASSERT(window);
+ if (window && window->WindowID() == aWindowID) {
+ DeviceChangeCallback::RemoveDeviceChangeCallbackLocked(observer);
+ return;
+ }
+ }
+ }
+}
+
+StreamListeners*
+MediaManager::AddWindowID(uint64_t aWindowId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Store the WindowID in a hash table and mark as active. The entry is removed
+ // when this window is closed or navigated away from.
+ // This is safe since we're on main-thread, and the windowlist can only
+ // be invalidated from the main-thread (see OnNavigation)
+ StreamListeners* listeners = GetActiveWindows()->Get(aWindowId);
+ if (!listeners) {
+ listeners = new StreamListeners;
+ GetActiveWindows()->Put(aWindowId, listeners);
+ }
+ return listeners;
+}
+
+void
+MediaManager::RemoveWindowID(uint64_t aWindowId)
+{
+ mActiveWindows.Remove(aWindowId);
+
+ // get outer windowID
+ auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowId);
+ if (!window) {
+ LOG(("No inner window for %llu", aWindowId));
+ return;
+ }
+
+ nsPIDOMWindowOuter* outer = window->AsInner()->GetOuterWindow();
+ if (!outer) {
+ LOG(("No outer window for inner %llu", aWindowId));
+ return;
+ }
+
+ uint64_t outerID = outer->WindowID();
+
+ // Notify the UI that this window no longer has gUM active
+ char windowBuffer[32];
+ SprintfLiteral(windowBuffer, "%" PRIu64, outerID);
+ nsString data = NS_ConvertUTF8toUTF16(windowBuffer);
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->NotifyObservers(nullptr, "recording-window-ended", data.get());
+ LOG(("Sent recording-window-ended for window %llu (outer %llu)",
+ aWindowId, outerID));
+}
+
+void
+MediaManager::RemoveFromWindowList(uint64_t aWindowID,
+ GetUserMediaCallbackMediaStreamListener *aListener)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // This is defined as safe on an inactive GUMCMSListener
+ aListener->Remove(); // really queues the remove
+
+ StreamListeners* listeners = GetWindowListeners(aWindowID);
+ if (!listeners) {
+ return;
+ }
+ listeners->RemoveElement(aListener);
+ if (listeners->Length() == 0) {
+ RemoveWindowID(aWindowID);
+ // listeners has been deleted here
+ }
+}
+
+void
+MediaManager::GetPref(nsIPrefBranch *aBranch, const char *aPref,
+ const char *aData, int32_t *aVal)
+{
+ int32_t temp;
+ if (aData == nullptr || strcmp(aPref,aData) == 0) {
+ if (NS_SUCCEEDED(aBranch->GetIntPref(aPref, &temp))) {
+ *aVal = temp;
+ }
+ }
+}
+
+void
+MediaManager::GetPrefBool(nsIPrefBranch *aBranch, const char *aPref,
+ const char *aData, bool *aVal)
+{
+ bool temp;
+ if (aData == nullptr || strcmp(aPref,aData) == 0) {
+ if (NS_SUCCEEDED(aBranch->GetBoolPref(aPref, &temp))) {
+ *aVal = temp;
+ }
+ }
+}
+
+void
+MediaManager::GetPrefs(nsIPrefBranch *aBranch, const char *aData)
+{
+ GetPref(aBranch, "media.navigator.video.default_width", aData, &mPrefs.mWidth);
+ GetPref(aBranch, "media.navigator.video.default_height", aData, &mPrefs.mHeight);
+ GetPref(aBranch, "media.navigator.video.default_fps", aData, &mPrefs.mFPS);
+ GetPref(aBranch, "media.navigator.video.default_minfps", aData, &mPrefs.mMinFPS);
+ GetPref(aBranch, "media.navigator.audio.fake_frequency", aData, &mPrefs.mFreq);
+#ifdef MOZ_WEBRTC
+ GetPrefBool(aBranch, "media.getusermedia.aec_enabled", aData, &mPrefs.mAecOn);
+ GetPrefBool(aBranch, "media.getusermedia.agc_enabled", aData, &mPrefs.mAgcOn);
+ GetPrefBool(aBranch, "media.getusermedia.noise_enabled", aData, &mPrefs.mNoiseOn);
+ GetPref(aBranch, "media.getusermedia.aec", aData, &mPrefs.mAec);
+ GetPref(aBranch, "media.getusermedia.agc", aData, &mPrefs.mAgc);
+ GetPref(aBranch, "media.getusermedia.noise", aData, &mPrefs.mNoise);
+ GetPref(aBranch, "media.getusermedia.playout_delay", aData, &mPrefs.mPlayoutDelay);
+ GetPrefBool(aBranch, "media.getusermedia.aec_extended_filter", aData, &mPrefs.mExtendedFilter);
+ GetPrefBool(aBranch, "media.getusermedia.aec_aec_delay_agnostic", aData, &mPrefs.mDelayAgnostic);
+ GetPrefBool(aBranch, "media.ondevicechange.fakeDeviceChangeEvent.enabled", aData, &mPrefs.mFakeDeviceChangeEventOn);
+#endif
+ GetPrefBool(aBranch, "media.navigator.audio.full_duplex", aData, &mPrefs.mFullDuplex);
+}
+
+void
+MediaManager::Shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (sInShutdown) {
+ return;
+ }
+ sInShutdown = true;
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+
+ obs->RemoveObserver(this, "last-pb-context-exited");
+ obs->RemoveObserver(this, "getUserMedia:privileged:allow");
+ obs->RemoveObserver(this, "getUserMedia:response:allow");
+ obs->RemoveObserver(this, "getUserMedia:response:deny");
+ obs->RemoveObserver(this, "getUserMedia:revoke");
+
+ nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
+ if (prefs) {
+ prefs->RemoveObserver("media.navigator.video.default_width", this);
+ prefs->RemoveObserver("media.navigator.video.default_height", this);
+ prefs->RemoveObserver("media.navigator.video.default_fps", this);
+ prefs->RemoveObserver("media.navigator.video.default_minfps", this);
+ prefs->RemoveObserver("media.navigator.audio.fake_frequency", this);
+#ifdef MOZ_WEBRTC
+ prefs->RemoveObserver("media.getusermedia.aec_enabled", this);
+ prefs->RemoveObserver("media.getusermedia.aec", this);
+ prefs->RemoveObserver("media.getusermedia.agc_enabled", this);
+ prefs->RemoveObserver("media.getusermedia.agc", this);
+ prefs->RemoveObserver("media.getusermedia.noise_enabled", this);
+ prefs->RemoveObserver("media.getusermedia.noise", this);
+ prefs->RemoveObserver("media.getusermedia.playout_delay", this);
+ prefs->RemoveObserver("media.ondevicechange.fakeDeviceChangeEvent.enabled", this);
+#endif
+ prefs->RemoveObserver("media.navigator.audio.full_duplex", this);
+ }
+
+ // Close off any remaining active windows.
+ GetActiveWindows()->Clear();
+ mActiveCallbacks.Clear();
+ mCallIds.Clear();
+#ifdef MOZ_WEBRTC
+ StopWebRtcLog();
+#endif
+
+ // Because mMediaThread is not an nsThread, we must dispatch to it so it can
+ // clean up BackgroundChild. Continue stopping thread once this is done.
+
+ class ShutdownTask : public Runnable
+ {
+ public:
+ ShutdownTask(MediaManager* aManager,
+ already_AddRefed<Runnable> aReply)
+ : mManager(aManager)
+ , mReply(aReply) {}
+ private:
+ NS_IMETHOD
+ Run() override
+ {
+ LOG(("MediaManager Thread Shutdown"));
+ MOZ_ASSERT(MediaManager::IsInMediaThread());
+ // Must shutdown backend on MediaManager thread, since that's where we started it from!
+ {
+ if (mManager->mBackend) {
+ mManager->mBackend->Shutdown(); // ok to invoke multiple times
+ mManager->mBackend->RemoveDeviceChangeCallback(mManager);
+ }
+ }
+ mozilla::ipc::BackgroundChild::CloseForCurrentThread();
+ // must explicitly do this before dispatching the reply, since the reply may kill us with Stop()
+ mManager->mBackend = nullptr; // last reference, will invoke Shutdown() again
+
+ if (NS_FAILED(NS_DispatchToMainThread(mReply.forget()))) {
+ LOG(("Will leak thread: DispatchToMainthread of reply runnable failed in MediaManager shutdown"));
+ }
+
+ return NS_OK;
+ }
+ RefPtr<MediaManager> mManager;
+ RefPtr<Runnable> mReply;
+ };
+
+ // Post ShutdownTask to execute on mMediaThread and pass in a lambda
+ // callback to be executed back on this thread once it is done.
+ //
+ // The lambda callback "captures" the 'this' pointer for member access.
+ // This is safe since this is guaranteed to be here since sSingleton isn't
+ // cleared until the lambda function clears it.
+
+ // note that this == sSingleton
+ MOZ_ASSERT(this == sSingleton);
+ RefPtr<MediaManager> that = this;
+
+ // Release the backend (and call Shutdown()) from within the MediaManager thread
+ // Don't use MediaManager::PostTask() because we're sInShutdown=true here!
+ RefPtr<ShutdownTask> shutdown = new ShutdownTask(this,
+ media::NewRunnableFrom([this, that]() mutable {
+ LOG(("MediaManager shutdown lambda running, releasing MediaManager singleton and thread"));
+ if (mMediaThread) {
+ mMediaThread->Stop();
+ }
+
+ // Remove async shutdown blocker
+
+ nsCOMPtr<nsIAsyncShutdownClient> shutdownPhase = GetShutdownPhase();
+ shutdownPhase->RemoveBlocker(sSingleton->mShutdownBlocker);
+
+ // we hold a ref to 'that' which is the same as sSingleton
+ sSingleton = nullptr;
+
+ return NS_OK;
+ }));
+ mMediaThread->message_loop()->PostTask(shutdown.forget());
+}
+
+nsresult
+MediaManager::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
+ nsCOMPtr<nsIPrefBranch> branch( do_QueryInterface(aSubject) );
+ if (branch) {
+ GetPrefs(branch,NS_ConvertUTF16toUTF8(aData).get());
+ LOG(("%s: %dx%d @%dfps (min %d)", __FUNCTION__,
+ mPrefs.mWidth, mPrefs.mHeight, mPrefs.mFPS, mPrefs.mMinFPS));
+ }
+ } else if (!strcmp(aTopic, "last-pb-context-exited")) {
+ // Clear memory of private-browsing-specific deviceIds. Fire and forget.
+ media::SanitizeOriginKeys(0, true);
+ return NS_OK;
+ } else if (!strcmp(aTopic, "getUserMedia:privileged:allow") ||
+ !strcmp(aTopic, "getUserMedia:response:allow")) {
+ nsString key(aData);
+ RefPtr<GetUserMediaTask> task;
+ mActiveCallbacks.Remove(key, getter_AddRefs(task));
+ if (!task) {
+ return NS_OK;
+ }
+
+ if (aSubject) {
+ // A particular device or devices were chosen by the user.
+ // NOTE: does not allow setting a device to null; assumes nullptr
+ nsCOMPtr<nsIArray> array(do_QueryInterface(aSubject));
+ MOZ_ASSERT(array);
+ uint32_t len = 0;
+ array->GetLength(&len);
+ bool videoFound = false, audioFound = false;
+ for (uint32_t i = 0; i < len; i++) {
+ nsCOMPtr<nsIMediaDevice> device;
+ array->QueryElementAt(i, NS_GET_IID(nsIMediaDevice),
+ getter_AddRefs(device));
+ MOZ_ASSERT(device); // shouldn't be returning anything else...
+ if (device) {
+ nsString type;
+ device->GetType(type);
+ if (type.EqualsLiteral("video")) {
+ if (!videoFound) {
+ task->SetVideoDevice(static_cast<VideoDevice*>(device.get()));
+ videoFound = true;
+ }
+ } else if (type.EqualsLiteral("audio")) {
+ if (!audioFound) {
+ task->SetAudioDevice(static_cast<AudioDevice*>(device.get()));
+ audioFound = true;
+ }
+ } else {
+ NS_WARNING("Unknown device type in getUserMedia");
+ }
+ }
+ }
+ bool needVideo = IsOn(task->GetConstraints().mVideo);
+ bool needAudio = IsOn(task->GetConstraints().mAudio);
+ MOZ_ASSERT(needVideo || needAudio);
+
+ if ((needVideo && !videoFound) || (needAudio && !audioFound)) {
+ task->Denied(NS_LITERAL_STRING("NotAllowedError"));
+ return NS_OK;
+ }
+ }
+
+ if (sInShutdown) {
+ return task->Denied(NS_LITERAL_STRING("In shutdown"));
+ }
+ // Reuse the same thread to save memory.
+ MediaManager::PostTask(task.forget());
+ return NS_OK;
+
+ } else if (!strcmp(aTopic, "getUserMedia:response:deny")) {
+ nsString errorMessage(NS_LITERAL_STRING("NotAllowedError"));
+
+ if (aSubject) {
+ nsCOMPtr<nsISupportsString> msg(do_QueryInterface(aSubject));
+ MOZ_ASSERT(msg);
+ msg->GetData(errorMessage);
+ if (errorMessage.IsEmpty())
+ errorMessage.AssignLiteral(u"InternalError");
+ }
+
+ nsString key(aData);
+ RefPtr<GetUserMediaTask> task;
+ mActiveCallbacks.Remove(key, getter_AddRefs(task));
+ if (task) {
+ task->Denied(errorMessage);
+ }
+ return NS_OK;
+
+ } else if (!strcmp(aTopic, "getUserMedia:revoke")) {
+ nsresult rv;
+ // may be windowid or screen:windowid
+ nsDependentString data(aData);
+ if (Substring(data, 0, strlen("screen:")).EqualsLiteral("screen:")) {
+ uint64_t windowID = PromiseFlatString(Substring(data, strlen("screen:"))).ToInteger64(&rv);
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ if (NS_SUCCEEDED(rv)) {
+ LOG(("Revoking Screen/windowCapture access for window %llu", windowID));
+ StopScreensharing(windowID);
+ }
+ } else {
+ uint64_t windowID = nsString(aData).ToInteger64(&rv);
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ if (NS_SUCCEEDED(rv)) {
+ LOG(("Revoking MediaCapture access for window %llu", windowID));
+ OnNavigation(windowID);
+ }
+ }
+ return NS_OK;
+ }
+#ifdef MOZ_WIDGET_GONK
+ else if (!strcmp(aTopic, "phone-state-changed")) {
+ nsString state(aData);
+ nsresult rv;
+ uint32_t phoneState = state.ToInteger(&rv);
+
+ if (NS_SUCCEEDED(rv) && phoneState == nsIAudioManager::PHONE_STATE_IN_CALL) {
+ StopMediaStreams();
+ }
+ return NS_OK;
+ }
+#endif
+
+ return NS_OK;
+}
+
+nsresult
+MediaManager::GetActiveMediaCaptureWindows(nsIArray** aArray)
+{
+ MOZ_ASSERT(aArray);
+
+ nsCOMPtr<nsIMutableArray> array = nsArray::Create();
+
+ for (auto iter = mActiveWindows.Iter(); !iter.Done(); iter.Next()) {
+ const uint64_t& id = iter.Key();
+ StreamListeners* listeners = iter.UserData();
+
+ nsPIDOMWindowInner* window =
+ nsGlobalWindow::GetInnerWindowWithId(id)->AsInner();
+ MOZ_ASSERT(window);
+ // XXXkhuey ...
+ if (!window) {
+ continue;
+ }
+ // mActiveWindows contains both windows that have requested device
+ // access and windows that are currently capturing media. We want
+ // to return only the latter. See bug 975177.
+ bool capturing = false;
+ if (listeners) {
+ uint32_t length = listeners->Length();
+ for (uint32_t i = 0; i < length; ++i) {
+ RefPtr<GetUserMediaCallbackMediaStreamListener> listener =
+ listeners->ElementAt(i);
+ if (listener->CapturingVideo() || listener->CapturingAudio() ||
+ listener->CapturingScreen() || listener->CapturingWindow() ||
+ listener->CapturingApplication()) {
+ capturing = true;
+ break;
+ }
+ }
+ }
+ if (capturing) {
+ array->AppendElement(window, /*weak =*/ false);
+ }
+ }
+
+ array.forget(aArray);
+ return NS_OK;
+}
+
+// XXX flags might be better...
+struct CaptureWindowStateData {
+ bool *mVideo;
+ bool *mAudio;
+ bool *mScreenShare;
+ bool *mWindowShare;
+ bool *mAppShare;
+ bool *mBrowserShare;
+};
+
+static void
+CaptureWindowStateCallback(MediaManager *aThis,
+ uint64_t aWindowID,
+ StreamListeners *aListeners,
+ void *aData)
+{
+ struct CaptureWindowStateData *data = (struct CaptureWindowStateData *) aData;
+
+ if (aListeners) {
+ auto length = aListeners->Length();
+ for (size_t i = 0; i < length; ++i) {
+ GetUserMediaCallbackMediaStreamListener *listener = aListeners->ElementAt(i);
+
+ if (listener->CapturingVideo()) {
+ *data->mVideo = true;
+ }
+ if (listener->CapturingAudio()) {
+ *data->mAudio = true;
+ }
+ if (listener->CapturingScreen()) {
+ *data->mScreenShare = true;
+ }
+ if (listener->CapturingWindow()) {
+ *data->mWindowShare = true;
+ }
+ if (listener->CapturingApplication()) {
+ *data->mAppShare = true;
+ }
+ if (listener->CapturingBrowser()) {
+ *data->mBrowserShare = true;
+ }
+ }
+ }
+}
+
+
+NS_IMETHODIMP
+MediaManager::MediaCaptureWindowState(nsIDOMWindow* aWindow, bool* aVideo,
+ bool* aAudio, bool *aScreenShare,
+ bool* aWindowShare, bool *aAppShare,
+ bool *aBrowserShare)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ struct CaptureWindowStateData data;
+ data.mVideo = aVideo;
+ data.mAudio = aAudio;
+ data.mScreenShare = aScreenShare;
+ data.mWindowShare = aWindowShare;
+ data.mAppShare = aAppShare;
+ data.mBrowserShare = aBrowserShare;
+
+ *aVideo = false;
+ *aAudio = false;
+ *aScreenShare = false;
+ *aWindowShare = false;
+ *aAppShare = false;
+ *aBrowserShare = false;
+
+ nsCOMPtr<nsPIDOMWindowInner> piWin = do_QueryInterface(aWindow);
+ if (piWin) {
+ IterateWindowListeners(piWin, CaptureWindowStateCallback, &data);
+ }
+#ifdef DEBUG
+ LOG(("%s: window %lld capturing %s %s %s %s %s %s", __FUNCTION__, piWin ? piWin->WindowID() : -1,
+ *aVideo ? "video" : "", *aAudio ? "audio" : "",
+ *aScreenShare ? "screenshare" : "", *aWindowShare ? "windowshare" : "",
+ *aAppShare ? "appshare" : "", *aBrowserShare ? "browsershare" : ""));
+#endif
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaManager::SanitizeDeviceIds(int64_t aSinceWhen)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ LOG(("%s: sinceWhen = %llu", __FUNCTION__, aSinceWhen));
+
+ media::SanitizeOriginKeys(aSinceWhen, false); // we fire and forget
+ return NS_OK;
+}
+
+static void
+StopScreensharingCallback(MediaManager *aThis,
+ uint64_t aWindowID,
+ StreamListeners *aListeners,
+ void *aData)
+{
+ if (aListeners) {
+ auto length = aListeners->Length();
+ for (size_t i = 0; i < length; ++i) {
+ aListeners->ElementAt(i)->StopSharing();
+ }
+ }
+}
+
+void
+MediaManager::StopScreensharing(uint64_t aWindowID)
+{
+ // We need to stop window/screensharing for all streams in all innerwindows that
+ // correspond to that outerwindow.
+
+ auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowID);
+ if (!window) {
+ return;
+ }
+ IterateWindowListeners(window->AsInner(), &StopScreensharingCallback, nullptr);
+}
+
+// lets us do all sorts of things to the listeners
+void
+MediaManager::IterateWindowListeners(nsPIDOMWindowInner* aWindow,
+ WindowListenerCallback aCallback,
+ void *aData)
+{
+ // Iterate the docshell tree to find all the child windows, and for each
+ // invoke the callback
+ if (aWindow) {
+ uint64_t windowID = aWindow->WindowID();
+ StreamListeners* listeners = GetActiveWindows()->Get(windowID);
+ // pass listeners so it can modify/delete the list
+ (*aCallback)(this, windowID, listeners, aData);
+
+ // iterate any children of *this* window (iframes, etc)
+ nsCOMPtr<nsIDocShell> docShell = aWindow->GetDocShell();
+ if (docShell) {
+ int32_t i, count;
+ docShell->GetChildCount(&count);
+ for (i = 0; i < count; ++i) {
+ nsCOMPtr<nsIDocShellTreeItem> item;
+ docShell->GetChildAt(i, getter_AddRefs(item));
+ nsCOMPtr<nsPIDOMWindowOuter> winOuter = item ? item->GetWindow() : nullptr;
+
+ if (winOuter) {
+ IterateWindowListeners(winOuter->GetCurrentInnerWindow(),
+ aCallback, aData);
+ }
+ }
+ }
+ }
+}
+
+
+void
+MediaManager::StopMediaStreams()
+{
+ nsCOMPtr<nsIArray> array;
+ GetActiveMediaCaptureWindows(getter_AddRefs(array));
+ uint32_t len;
+ array->GetLength(&len);
+ for (uint32_t i = 0; i < len; i++) {
+ nsCOMPtr<nsPIDOMWindowInner> win;
+ array->QueryElementAt(i, NS_GET_IID(nsPIDOMWindowInner),
+ getter_AddRefs(win));
+ if (win) {
+ OnNavigation(win->WindowID());
+ }
+ }
+}
+
+bool
+MediaManager::IsActivelyCapturingOrHasAPermission(uint64_t aWindowId)
+{
+ // Does page currently have a gUM stream active?
+
+ nsCOMPtr<nsIArray> array;
+ GetActiveMediaCaptureWindows(getter_AddRefs(array));
+ uint32_t len;
+ array->GetLength(&len);
+ for (uint32_t i = 0; i < len; i++) {
+ nsCOMPtr<nsPIDOMWindowInner> win;
+ array->QueryElementAt(i, NS_GET_IID(nsPIDOMWindowInner),
+ getter_AddRefs(win));
+ if (win && win->WindowID() == aWindowId) {
+ return true;
+ }
+ }
+
+ // Or are persistent permissions (audio or video) granted?
+
+ auto* window = nsGlobalWindow::GetInnerWindowWithId(aWindowId);
+ if (NS_WARN_IF(!window)) {
+ return false;
+ }
+ // Check if this site has persistent permissions.
+ nsresult rv;
+ nsCOMPtr<nsIPermissionManager> mgr =
+ do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false; // no permission manager no permissions!
+ }
+
+ uint32_t audio = nsIPermissionManager::UNKNOWN_ACTION;
+ uint32_t video = nsIPermissionManager::UNKNOWN_ACTION;
+ {
+ auto* principal = window->GetExtantDoc()->NodePrincipal();
+ rv = mgr->TestExactPermissionFromPrincipal(principal, "microphone", &audio);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ rv = mgr->TestExactPermissionFromPrincipal(principal, "camera", &video);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ }
+ return audio == nsIPermissionManager::ALLOW_ACTION ||
+ video == nsIPermissionManager::ALLOW_ACTION;
+}
+
+void
+GetUserMediaCallbackMediaStreamListener::Stop()
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread");
+ if (mStopped) {
+ return;
+ }
+
+ // We can't take a chance on blocking here, so proxy this to another
+ // thread.
+ // Pass a ref to us (which is threadsafe) so it can query us for the
+ // source stream info.
+ RefPtr<MediaOperationTask> mediaOperation =
+ new MediaOperationTask(MEDIA_STOP,
+ this, nullptr, nullptr,
+ !mAudioStopped ? mAudioDevice.get() : nullptr,
+ !mVideoStopped ? mVideoDevice.get() : nullptr,
+ false, mWindowID, nullptr);
+ MediaManager::PostTask(mediaOperation.forget());
+ mStopped = mAudioStopped = mVideoStopped = true;
+}
+
+// Doesn't kill audio
+void
+GetUserMediaCallbackMediaStreamListener::StopSharing()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mVideoDevice &&
+ (mVideoDevice->GetMediaSource() == MediaSourceEnum::Screen ||
+ mVideoDevice->GetMediaSource() == MediaSourceEnum::Application ||
+ mVideoDevice->GetMediaSource() == MediaSourceEnum::Window)) {
+ // We want to stop the whole stream if there's no audio;
+ // just the video track if we have both.
+ // StopTrack figures this out for us.
+ StopTrack(kVideoTrack);
+ } else if (mAudioDevice &&
+ mAudioDevice->GetMediaSource() == MediaSourceEnum::AudioCapture) {
+ nsCOMPtr<nsPIDOMWindowInner> window = nsGlobalWindow::GetInnerWindowWithId(mWindowID)->AsInner();
+ MOZ_ASSERT(window);
+ window->SetAudioCapture(false);
+ MediaStreamGraph* graph =
+ MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER,
+ dom::AudioChannel::Normal);
+ graph->UnregisterCaptureStreamForWindow(mWindowID);
+ mStream->Destroy();
+ }
+}
+
+// ApplyConstraints for track
+
+auto
+GetUserMediaCallbackMediaStreamListener::ApplyConstraintsToTrack(
+ nsPIDOMWindowInner* aWindow,
+ TrackID aTrackID,
+ const MediaTrackConstraints& aConstraints) -> already_AddRefed<PledgeVoid>
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<PledgeVoid> p = new PledgeVoid();
+
+ // XXX to support multiple tracks of a type in a stream, this should key off
+ // the TrackID and not just the type
+ RefPtr<AudioDevice> audioDevice =
+ aTrackID == kAudioTrack ? mAudioDevice.get() : nullptr;
+ RefPtr<VideoDevice> videoDevice =
+ aTrackID == kVideoTrack ? mVideoDevice.get() : nullptr;
+
+ if (mStopped || (!audioDevice && !videoDevice))
+ {
+ LOG(("gUM track %d applyConstraints, but we don't have type %s",
+ aTrackID, aTrackID == kAudioTrack ? "audio" : "video"));
+ p->Resolve(false);
+ return p.forget();
+ }
+
+ RefPtr<MediaManager> mgr = MediaManager::GetInstance();
+ uint32_t id = mgr->mOutstandingVoidPledges.Append(*p);
+ uint64_t windowId = aWindow->WindowID();
+ bool isChrome = nsContentUtils::IsCallerChrome();
+
+ MediaManager::PostTask(NewTaskFrom([id, windowId,
+ audioDevice, videoDevice,
+ aConstraints, isChrome]() mutable {
+ MOZ_ASSERT(MediaManager::IsInMediaThread());
+ RefPtr<MediaManager> mgr = MediaManager::GetInstance();
+ const char* badConstraint = nullptr;
+ nsresult rv = NS_OK;
+
+ if (audioDevice) {
+ rv = audioDevice->Restart(aConstraints, mgr->mPrefs, &badConstraint);
+ if (rv == NS_ERROR_NOT_AVAILABLE && !badConstraint) {
+ nsTArray<RefPtr<AudioDevice>> audios;
+ audios.AppendElement(audioDevice);
+ badConstraint = MediaConstraintsHelper::SelectSettings(
+ NormalizedConstraints(aConstraints), audios, isChrome);
+ }
+ } else {
+ rv = videoDevice->Restart(aConstraints, mgr->mPrefs, &badConstraint);
+ if (rv == NS_ERROR_NOT_AVAILABLE && !badConstraint) {
+ nsTArray<RefPtr<VideoDevice>> videos;
+ videos.AppendElement(videoDevice);
+ badConstraint = MediaConstraintsHelper::SelectSettings(
+ NormalizedConstraints(aConstraints), videos, isChrome);
+ }
+ }
+ NS_DispatchToMainThread(NewRunnableFrom([id, windowId, rv,
+ badConstraint]() mutable {
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<MediaManager> mgr = MediaManager_GetInstance();
+ if (!mgr) {
+ return NS_OK;
+ }
+ RefPtr<PledgeVoid> p = mgr->mOutstandingVoidPledges.Remove(id);
+ if (p) {
+ if (NS_SUCCEEDED(rv)) {
+ p->Resolve(false);
+ } else {
+ auto* window = nsGlobalWindow::GetInnerWindowWithId(windowId);
+ if (window) {
+ if (badConstraint) {
+ nsString constraint;
+ constraint.AssignASCII(badConstraint);
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(window->AsInner(),
+ NS_LITERAL_STRING("OverconstrainedError"),
+ NS_LITERAL_STRING(""),
+ constraint);
+ p->Reject(error);
+ } else {
+ RefPtr<MediaStreamError> error =
+ new MediaStreamError(window->AsInner(),
+ NS_LITERAL_STRING("InternalError"));
+ p->Reject(error);
+ }
+ }
+ }
+ }
+ return NS_OK;
+ }));
+ }));
+ return p.forget();
+}
+
+// Stop backend for track
+
+void
+GetUserMediaCallbackMediaStreamListener::StopTrack(TrackID aTrackID)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aTrackID == kAudioTrack || aTrackID == kVideoTrack);
+
+ // XXX to support multiple tracks of a type in a stream, this should key off
+ // the TrackID and not just hard coded values.
+
+ bool stopAudio = aTrackID == kAudioTrack;
+ bool stopVideo = aTrackID == kVideoTrack;
+
+ if (mStopped ||
+ (stopAudio && (mAudioStopped || !mAudioDevice)) ||
+ (stopVideo && (mVideoStopped || !mVideoDevice)))
+ {
+ LOG(("Can't stop gUM track %d (%s), exists=%d, stopped=%d",
+ aTrackID,
+ stopAudio ? "audio" : "video",
+ stopAudio ? !!mAudioDevice : !!mVideoDevice,
+ stopAudio ? mAudioStopped : mVideoStopped));
+ return;
+ }
+
+ if ((stopAudio || mAudioStopped || !mAudioDevice) &&
+ (stopVideo || mVideoStopped || !mVideoDevice)) {
+ Stop();
+ return;
+ }
+
+ // We wait until stable state before notifying chrome so chrome only does one
+ // update if more tracks are stopped in this event loop.
+
+ mAudioStopPending |= stopAudio;
+ mVideoStopPending |= stopVideo;
+
+ if (mChromeNotificationTaskPosted) {
+ return;
+ }
+
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &GetUserMediaCallbackMediaStreamListener::NotifyChromeOfTrackStops);
+ nsContentUtils::RunInStableState(runnable.forget());
+ mChromeNotificationTaskPosted = true;
+}
+
+void
+GetUserMediaCallbackMediaStreamListener::NotifyChromeOfTrackStops()
+{
+ MOZ_ASSERT(mChromeNotificationTaskPosted);
+ mChromeNotificationTaskPosted = false;
+
+ // We make sure these are always reset.
+ bool stopAudio = mAudioStopPending;
+ bool stopVideo = mVideoStopPending;
+ mAudioStopPending = false;
+ mVideoStopPending = false;
+
+ if (mStopped) {
+ // The entire capture was stopped while we were waiting for stable state.
+ return;
+ }
+
+ MOZ_ASSERT(stopAudio || stopVideo);
+ MOZ_ASSERT(!stopAudio || !mAudioStopped,
+ "If there's a pending stop for audio, audio must not have been stopped");
+ MOZ_ASSERT(!stopAudio || mAudioDevice,
+ "If there's a pending stop for audio, there must be an audio device");
+ MOZ_ASSERT(!stopVideo || !mVideoStopped,
+ "If there's a pending stop for video, video must not have been stopped");
+ MOZ_ASSERT(!stopVideo || mVideoDevice,
+ "If there's a pending stop for video, there must be a video device");
+
+ if ((stopAudio || mAudioStopped || !mAudioDevice) &&
+ (stopVideo || mVideoStopped || !mVideoDevice)) {
+ // All tracks stopped.
+ Stop();
+ return;
+ }
+
+ mAudioStopped |= stopAudio;
+ mVideoStopped |= stopVideo;
+
+ RefPtr<MediaOperationTask> mediaOperation =
+ new MediaOperationTask(MEDIA_STOP_TRACK,
+ this, nullptr, nullptr,
+ stopAudio ? mAudioDevice.get() : nullptr,
+ stopVideo ? mVideoDevice.get() : nullptr,
+ false , mWindowID, nullptr);
+ MediaManager::PostTask(mediaOperation.forget());
+}
+
+void
+GetUserMediaCallbackMediaStreamListener::NotifyFinished()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mFinished = true;
+ Stop(); // we know it's been activated
+
+ RefPtr<MediaManager> manager(MediaManager::GetIfExists());
+ if (manager) {
+ manager->RemoveFromWindowList(mWindowID, this);
+ } else {
+ NS_WARNING("Late NotifyFinished after MediaManager shutdown");
+ }
+}
+
+// Called from the MediaStreamGraph thread
+void
+GetUserMediaCallbackMediaStreamListener::NotifyDirectListeners(MediaStreamGraph* aGraph,
+ bool aHasListeners)
+{
+ RefPtr<MediaOperationTask> mediaOperation =
+ new MediaOperationTask(MEDIA_DIRECT_LISTENERS,
+ this, nullptr, nullptr,
+ mAudioDevice, mVideoDevice,
+ aHasListeners, mWindowID, nullptr);
+ MediaManager::PostTask(mediaOperation.forget());
+}
+
+// this can be in response to our own RemoveListener() (via ::Remove()), or
+// because the DOM GC'd the DOMLocalMediaStream/etc we're attached to.
+void
+GetUserMediaCallbackMediaStreamListener::NotifyRemoved()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MM_LOG(("Listener removed by DOM Destroy(), mFinished = %d", (int) mFinished));
+ mRemoved = true;
+
+ if (!mFinished) {
+ NotifyFinished();
+ }
+}
+
+GetUserMediaNotificationEvent::GetUserMediaNotificationEvent(
+ GetUserMediaCallbackMediaStreamListener* aListener,
+ GetUserMediaStatus aStatus,
+ bool aIsAudio, bool aIsVideo, uint64_t aWindowID)
+: mListener(aListener) , mStatus(aStatus) , mIsAudio(aIsAudio)
+, mIsVideo(aIsVideo), mWindowID(aWindowID) {}
+
+GetUserMediaNotificationEvent::GetUserMediaNotificationEvent(
+ GetUserMediaStatus aStatus,
+ already_AddRefed<DOMMediaStream> aStream,
+ OnTracksAvailableCallback* aOnTracksAvailableCallback,
+ bool aIsAudio, bool aIsVideo, uint64_t aWindowID,
+ already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError)
+: mStream(aStream), mOnTracksAvailableCallback(aOnTracksAvailableCallback),
+ mStatus(aStatus), mIsAudio(aIsAudio), mIsVideo(aIsVideo), mWindowID(aWindowID),
+ mOnFailure(aError) {}
+GetUserMediaNotificationEvent::~GetUserMediaNotificationEvent()
+{
+}
+
+NS_IMETHODIMP
+GetUserMediaNotificationEvent::Run()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Make sure mStream is cleared and our reference to the DOMMediaStream
+ // is dropped on the main thread, no matter what happens in this method.
+ // Otherwise this object might be destroyed off the main thread,
+ // releasing DOMMediaStream off the main thread, which is not allowed.
+ RefPtr<DOMMediaStream> stream = mStream.forget();
+
+ nsString msg;
+ switch (mStatus) {
+ case STARTING:
+ msg = NS_LITERAL_STRING("starting");
+ stream->OnTracksAvailable(mOnTracksAvailableCallback.forget());
+ break;
+ case STOPPING:
+ case STOPPED_TRACK:
+ msg = NS_LITERAL_STRING("shutdown");
+ break;
+ }
+
+ RefPtr<nsGlobalWindow> window = nsGlobalWindow::GetInnerWindowWithId(mWindowID);
+ NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
+
+ return MediaManager::NotifyRecordingStatusChange(window->AsInner(), msg, mIsAudio, mIsVideo);
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaManager.h b/dom/media/MediaManager.h
new file mode 100644
index 000000000..1255f6c90
--- /dev/null
+++ b/dom/media/MediaManager.h
@@ -0,0 +1,341 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIAMANAGER_H
+#define MOZILLA_MEDIAMANAGER_H
+
+#include "MediaEngine.h"
+#include "mozilla/media/DeviceChangeCallback.h"
+#include "mozilla/Services.h"
+#include "mozilla/Unused.h"
+#include "nsAutoPtr.h"
+#include "nsIMediaManager.h"
+
+#include "nsHashKeys.h"
+#include "nsGlobalWindow.h"
+#include "nsClassHashtable.h"
+#include "nsRefPtrHashtable.h"
+#include "nsIObserver.h"
+#include "nsIPrefService.h"
+#include "nsIPrefBranch.h"
+
+#include "nsPIDOMWindow.h"
+#include "nsIDOMNavigatorUserMedia.h"
+#include "nsXULAppAPI.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/dom/MediaStreamBinding.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/MediaStreamError.h"
+#include "mozilla/media/MediaChild.h"
+#include "mozilla/media/MediaParent.h"
+#include "mozilla/Logging.h"
+#include "mozilla/UniquePtr.h"
+#include "DOMMediaStream.h"
+
+#ifdef MOZ_WEBRTC
+#include "mtransport/runnable_utils.h"
+#endif
+
+// Note, these suck in Windows headers, unfortunately.
+#include "base/thread.h"
+#include "base/task.h"
+
+namespace mozilla {
+namespace dom {
+struct MediaStreamConstraints;
+struct MediaTrackConstraints;
+struct MediaTrackConstraintSet;
+} // namespace dom
+
+class MediaManager;
+class GetUserMediaCallbackMediaStreamListener;
+class GetUserMediaTask;
+
+extern LogModule* GetMediaManagerLog();
+#define MM_LOG(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Debug, msg)
+
+class MediaDevice : public nsIMediaDevice
+{
+public:
+ typedef MediaEngineSource Source;
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIMEDIADEVICE
+
+ void SetId(const nsAString& aID);
+ void SetRawId(const nsAString& aID);
+ virtual uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ bool aIsChrome);
+ virtual Source* GetSource() = 0;
+ nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsACString& aOrigin,
+ const char** aOutBadConstraint);
+ nsresult Restart(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const char** aOutBadConstraint);
+ nsresult Deallocate();
+protected:
+ virtual ~MediaDevice() {}
+ explicit MediaDevice(MediaEngineSource* aSource, bool aIsVideo);
+
+ static uint32_t FitnessDistance(nsString aN,
+ const dom::OwningStringOrStringSequenceOrConstrainDOMStringParameters& aConstraint);
+private:
+ static bool StringsContain(const dom::OwningStringOrStringSequence& aStrings,
+ nsString aN);
+ static uint32_t FitnessDistance(nsString aN,
+ const dom::ConstrainDOMStringParameters& aParams);
+protected:
+ nsString mName;
+ nsString mID;
+ nsString mRawID;
+ bool mScary;
+ dom::MediaSourceEnum mMediaSource;
+ RefPtr<MediaEngineSource> mSource;
+ RefPtr<MediaEngineSource::AllocationHandle> mAllocationHandle;
+public:
+ dom::MediaSourceEnum GetMediaSource() {
+ return mMediaSource;
+ }
+ bool mIsVideo;
+};
+
+class VideoDevice : public MediaDevice
+{
+public:
+ typedef MediaEngineVideoSource Source;
+
+ explicit VideoDevice(Source* aSource);
+ NS_IMETHOD GetType(nsAString& aType) override;
+ Source* GetSource() override;
+};
+
+class AudioDevice : public MediaDevice
+{
+public:
+ typedef MediaEngineAudioSource Source;
+
+ explicit AudioDevice(Source* aSource);
+ NS_IMETHOD GetType(nsAString& aType) override;
+ Source* GetSource() override;
+};
+
+class GetUserMediaNotificationEvent: public Runnable
+{
+ public:
+ enum GetUserMediaStatus {
+ STARTING,
+ STOPPING,
+ STOPPED_TRACK,
+ };
+ GetUserMediaNotificationEvent(GetUserMediaCallbackMediaStreamListener* aListener,
+ GetUserMediaStatus aStatus,
+ bool aIsAudio, bool aIsVideo, uint64_t aWindowID);
+
+ GetUserMediaNotificationEvent(GetUserMediaStatus aStatus,
+ already_AddRefed<DOMMediaStream> aStream,
+ OnTracksAvailableCallback* aOnTracksAvailableCallback,
+ bool aIsAudio, bool aIsVideo, uint64_t aWindowID,
+ already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError);
+ virtual ~GetUserMediaNotificationEvent();
+
+ NS_IMETHOD Run() override;
+
+ protected:
+ RefPtr<GetUserMediaCallbackMediaStreamListener> mListener; // threadsafe
+ RefPtr<DOMMediaStream> mStream;
+ nsAutoPtr<OnTracksAvailableCallback> mOnTracksAvailableCallback;
+ GetUserMediaStatus mStatus;
+ bool mIsAudio;
+ bool mIsVideo;
+ uint64_t mWindowID;
+ RefPtr<nsIDOMGetUserMediaErrorCallback> mOnFailure;
+};
+
+typedef enum {
+ MEDIA_START,
+ MEDIA_STOP,
+ MEDIA_STOP_TRACK,
+ MEDIA_DIRECT_LISTENERS,
+} MediaOperation;
+
+class ReleaseMediaOperationResource : public Runnable
+{
+public:
+ ReleaseMediaOperationResource(already_AddRefed<DOMMediaStream> aStream,
+ OnTracksAvailableCallback* aOnTracksAvailableCallback):
+ mStream(aStream),
+ mOnTracksAvailableCallback(aOnTracksAvailableCallback) {}
+ NS_IMETHOD Run() override {return NS_OK;}
+private:
+ RefPtr<DOMMediaStream> mStream;
+ nsAutoPtr<OnTracksAvailableCallback> mOnTracksAvailableCallback;
+};
+
+typedef nsTArray<RefPtr<GetUserMediaCallbackMediaStreamListener> > StreamListeners;
+typedef nsClassHashtable<nsUint64HashKey, StreamListeners> WindowTable;
+
+// we could add MediaManager if needed
+typedef void (*WindowListenerCallback)(MediaManager *aThis,
+ uint64_t aWindowID,
+ StreamListeners *aListeners,
+ void *aData);
+
+class MediaManager final : public nsIMediaManagerService,
+ public nsIObserver
+ ,public DeviceChangeCallback
+{
+ friend GetUserMediaCallbackMediaStreamListener;
+public:
+ static already_AddRefed<MediaManager> GetInstance();
+
+ // NOTE: never Dispatch(....,NS_DISPATCH_SYNC) to the MediaManager
+ // thread from the MainThread, as we NS_DISPATCH_SYNC to MainThread
+ // from MediaManager thread.
+ static MediaManager* Get();
+ static MediaManager* GetIfExists();
+ static void StartupInit();
+ static void PostTask(already_AddRefed<Runnable> task);
+#ifdef DEBUG
+ static bool IsInMediaThread();
+#endif
+
+ static bool Exists()
+ {
+ return !!sSingleton;
+ }
+
+ static nsresult NotifyRecordingStatusChange(nsPIDOMWindowInner* aWindow,
+ const nsString& aMsg,
+ const bool& aIsAudio,
+ const bool& aIsVideo);
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+ NS_DECL_NSIMEDIAMANAGERSERVICE
+
+ media::Parent<media::NonE10s>* GetNonE10sParent();
+ MediaEngine* GetBackend(uint64_t aWindowId = 0);
+ StreamListeners *GetWindowListeners(uint64_t aWindowId) {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mActiveWindows.Get(aWindowId);
+ }
+ void RemoveWindowID(uint64_t aWindowId);
+ bool IsWindowStillActive(uint64_t aWindowId) {
+ return !!GetWindowListeners(aWindowId);
+ }
+ // Note: also calls aListener->Remove(), even if inactive
+ void RemoveFromWindowList(uint64_t aWindowID,
+ GetUserMediaCallbackMediaStreamListener *aListener);
+
+ nsresult GetUserMedia(
+ nsPIDOMWindowInner* aWindow,
+ const dom::MediaStreamConstraints& aConstraints,
+ nsIDOMGetUserMediaSuccessCallback* onSuccess,
+ nsIDOMGetUserMediaErrorCallback* onError);
+
+ nsresult GetUserMediaDevices(nsPIDOMWindowInner* aWindow,
+ const dom::MediaStreamConstraints& aConstraints,
+ nsIGetUserMediaDevicesSuccessCallback* onSuccess,
+ nsIDOMGetUserMediaErrorCallback* onError,
+ uint64_t aInnerWindowID = 0,
+ const nsAString& aCallID = nsString());
+
+ nsresult EnumerateDevices(nsPIDOMWindowInner* aWindow,
+ nsIGetUserMediaDevicesSuccessCallback* aOnSuccess,
+ nsIDOMGetUserMediaErrorCallback* aOnFailure);
+
+ nsresult EnumerateDevices(nsPIDOMWindowInner* aWindow, dom::Promise& aPromise);
+ void OnNavigation(uint64_t aWindowID);
+ bool IsActivelyCapturingOrHasAPermission(uint64_t aWindowId);
+
+ MediaEnginePrefs mPrefs;
+
+ typedef nsTArray<RefPtr<MediaDevice>> SourceSet;
+ static bool IsPrivateBrowsing(nsPIDOMWindowInner* window);
+
+ virtual int AddDeviceChangeCallback(DeviceChangeCallback* aCallback) override;
+ virtual void OnDeviceChange() override;
+private:
+ typedef media::Pledge<SourceSet*, dom::MediaStreamError*> PledgeSourceSet;
+ typedef media::Pledge<const char*, dom::MediaStreamError*> PledgeChar;
+ typedef media::Pledge<bool, dom::MediaStreamError*> PledgeVoid;
+
+ static nsresult GenerateUUID(nsAString& aResult);
+ static nsresult AnonymizeId(nsAString& aId, const nsACString& aOriginKey);
+public: // TODO: make private once we upgrade to GCC 4.8+ on linux.
+ static void AnonymizeDevices(SourceSet& aDevices, const nsACString& aOriginKey);
+ static already_AddRefed<nsIWritableVariant> ToJSArray(SourceSet& aDevices);
+private:
+ already_AddRefed<PledgeSourceSet>
+ EnumerateRawDevices(uint64_t aWindowId,
+ dom::MediaSourceEnum aVideoType,
+ dom::MediaSourceEnum aAudioType,
+ bool aFake);
+ already_AddRefed<PledgeSourceSet>
+ EnumerateDevicesImpl(uint64_t aWindowId,
+ dom::MediaSourceEnum aVideoSrcType,
+ dom::MediaSourceEnum aAudioSrcType,
+ bool aFake = false);
+ already_AddRefed<PledgeChar>
+ SelectSettings(
+ dom::MediaStreamConstraints& aConstraints,
+ bool aIsChrome,
+ RefPtr<media::Refcountable<UniquePtr<SourceSet>>>& aSources);
+
+ StreamListeners* AddWindowID(uint64_t aWindowId);
+ WindowTable *GetActiveWindows() {
+ MOZ_ASSERT(NS_IsMainThread());
+ return &mActiveWindows;
+ }
+
+ void GetPref(nsIPrefBranch *aBranch, const char *aPref,
+ const char *aData, int32_t *aVal);
+ void GetPrefBool(nsIPrefBranch *aBranch, const char *aPref,
+ const char *aData, bool *aVal);
+ void GetPrefs(nsIPrefBranch *aBranch, const char *aData);
+
+ // Make private because we want only one instance of this class
+ MediaManager();
+
+ ~MediaManager() {}
+ void Shutdown();
+
+ void StopScreensharing(uint64_t aWindowID);
+ void IterateWindowListeners(nsPIDOMWindowInner *aWindow,
+ WindowListenerCallback aCallback,
+ void *aData);
+
+ void StopMediaStreams();
+ void RemoveMediaDevicesCallback(uint64_t aWindowID);
+
+ // ONLY access from MainThread so we don't need to lock
+ WindowTable mActiveWindows;
+ nsRefPtrHashtable<nsStringHashKey, GetUserMediaTask> mActiveCallbacks;
+ nsClassHashtable<nsUint64HashKey, nsTArray<nsString>> mCallIds;
+
+ // Always exists
+ nsAutoPtr<base::Thread> mMediaThread;
+ nsCOMPtr<nsIAsyncShutdownBlocker> mShutdownBlocker;
+
+ // ONLY accessed from MediaManagerThread
+ RefPtr<MediaEngine> mBackend;
+
+ static StaticRefPtr<MediaManager> sSingleton;
+
+ media::CoatCheck<PledgeSourceSet> mOutstandingPledges;
+ media::CoatCheck<PledgeChar> mOutstandingCharPledges;
+ media::CoatCheck<PledgeVoid> mOutstandingVoidPledges;
+public:
+ media::CoatCheck<media::Pledge<nsCString>> mGetOriginKeyPledges;
+ RefPtr<media::Parent<media::NonE10s>> mNonE10sParent;
+};
+
+} // namespace mozilla
+
+#endif // MOZILLA_MEDIAMANAGER_H
diff --git a/dom/media/MediaMetadataManager.h b/dom/media/MediaMetadataManager.h
new file mode 100644
index 000000000..f875353a6
--- /dev/null
+++ b/dom/media/MediaMetadataManager.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaMetadataManager_h__)
+#define MediaMetadataManager_h__
+
+#include "mozilla/AbstractThread.h"
+#include "mozilla/LinkedList.h"
+
+#include "nsAutoPtr.h"
+#include "AbstractMediaDecoder.h"
+#include "MediaEventSource.h"
+#include "TimeUnits.h"
+#include "VideoUtils.h"
+
+namespace mozilla {
+
+class TimedMetadata;
+typedef MediaEventProducerExc<TimedMetadata> TimedMetadataEventProducer;
+typedef MediaEventSourceExc<TimedMetadata> TimedMetadataEventSource;
+
+// A struct that contains the metadata of a media, and the time at which those
+// metadata should start to be reported.
+class TimedMetadata : public LinkedListElement<TimedMetadata> {
+public:
+ TimedMetadata(const media::TimeUnit& aPublishTime,
+ nsAutoPtr<MetadataTags>&& aTags,
+ nsAutoPtr<MediaInfo>&& aInfo)
+ : mPublishTime(aPublishTime)
+ , mTags(Move(aTags))
+ , mInfo(Move(aInfo)) {}
+
+ // Define our move constructor because we don't want to move the members of
+ // LinkedListElement to change the list.
+ TimedMetadata(TimedMetadata&& aOther)
+ : mPublishTime(aOther.mPublishTime)
+ , mTags(Move(aOther.mTags))
+ , mInfo(Move(aOther.mInfo)) {}
+
+ // The time, in microseconds, at which those metadata should be available.
+ media::TimeUnit mPublishTime;
+ // The metadata. The ownership is transfered to the element when dispatching to
+ // the main threads.
+ nsAutoPtr<MetadataTags> mTags;
+ // The media info, including the info of audio tracks and video tracks.
+ // The ownership is transfered to MediaDecoder when dispatching to the
+ // main thread.
+ nsAutoPtr<MediaInfo> mInfo;
+};
+
+// This class encapsulate the logic to give the metadata from the reader to
+// the content, at the right time.
+class MediaMetadataManager {
+public:
+ ~MediaMetadataManager() {
+ TimedMetadata* element;
+ while((element = mMetadataQueue.popFirst()) != nullptr) {
+ delete element;
+ }
+ }
+
+ // Connect to an event source to receive TimedMetadata events.
+ void Connect(TimedMetadataEventSource& aEvent, AbstractThread* aThread) {
+ mListener = aEvent.Connect(
+ aThread, this, &MediaMetadataManager::OnMetadataQueued);
+ }
+
+ // Stop receiving TimedMetadata events.
+ void Disconnect() {
+ mListener.Disconnect();
+ }
+
+ // Return an event source through which we will send TimedMetadata events
+ // when playback position reaches the publish time.
+ TimedMetadataEventSource& TimedMetadataEvent() {
+ return mTimedMetadataEvent;
+ }
+
+ void DispatchMetadataIfNeeded(const media::TimeUnit& aCurrentTime) {
+ TimedMetadata* metadata = mMetadataQueue.getFirst();
+ while (metadata && aCurrentTime >= metadata->mPublishTime) {
+ // Our listener will figure out what to do with TimedMetadata.
+ mTimedMetadataEvent.Notify(Move(*metadata));
+ delete mMetadataQueue.popFirst();
+ metadata = mMetadataQueue.getFirst();
+ }
+ }
+
+protected:
+ void OnMetadataQueued(TimedMetadata&& aMetadata) {
+ mMetadataQueue.insertBack(new TimedMetadata(Move(aMetadata)));
+ }
+
+ LinkedList<TimedMetadata> mMetadataQueue;
+ MediaEventListener mListener;
+ TimedMetadataEventProducer mTimedMetadataEvent;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaPermissionGonk.cpp b/dom/media/MediaPermissionGonk.cpp
new file mode 100644
index 000000000..2a9cbf331
--- /dev/null
+++ b/dom/media/MediaPermissionGonk.cpp
@@ -0,0 +1,522 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaManager.h"
+#include "MediaPermissionGonk.h"
+
+#include "nsArray.h"
+#include "nsCOMPtr.h"
+#include "nsIContentPermissionPrompt.h"
+#include "nsIDocument.h"
+#include "nsIDOMNavigatorUserMedia.h"
+#include "nsIStringEnumerator.h"
+#include "nsJSUtils.h"
+#include "nsQueryObject.h"
+#include "nsPIDOMWindow.h"
+#include "nsTArray.h"
+#include "GetUserMediaRequest.h"
+#include "mozilla/dom/PBrowserChild.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/MediaStreamError.h"
+#include "nsISupportsPrimitives.h"
+#include "nsServiceManagerUtils.h"
+#include "nsArrayUtils.h"
+#include "nsContentPermissionHelper.h"
+#include "mozilla/dom/PermissionMessageUtils.h"
+
+#define AUDIO_PERMISSION_NAME "audio-capture"
+#define VIDEO_PERMISSION_NAME "video-capture"
+
+using namespace mozilla::dom;
+
+namespace mozilla {
+
+static MediaPermissionManager *gMediaPermMgr = nullptr;
+
+static void
+CreateDeviceNameList(nsTArray<nsCOMPtr<nsIMediaDevice> > &aDevices,
+ nsTArray<nsString> &aDeviceNameList)
+{
+ for (uint32_t i = 0; i < aDevices.Length(); ++i) {
+ nsString name;
+ nsresult rv = aDevices[i]->GetName(name);
+ NS_ENSURE_SUCCESS_VOID(rv);
+ aDeviceNameList.AppendElement(name);
+ }
+}
+
+static already_AddRefed<nsIMediaDevice>
+FindDeviceByName(nsTArray<nsCOMPtr<nsIMediaDevice> > &aDevices,
+ const nsAString &aDeviceName)
+{
+ for (uint32_t i = 0; i < aDevices.Length(); ++i) {
+ nsCOMPtr<nsIMediaDevice> device = aDevices[i];
+ nsString deviceName;
+ device->GetName(deviceName);
+ if (deviceName.Equals(aDeviceName)) {
+ return device.forget();
+ }
+ }
+
+ return nullptr;
+}
+
+// Helper function for notifying permission granted
+static nsresult
+NotifyPermissionAllow(const nsAString &aCallID, nsTArray<nsCOMPtr<nsIMediaDevice> > &aDevices)
+{
+ nsresult rv;
+ nsCOMPtr<nsIMutableArray> array = nsArray::Create();
+
+ for (uint32_t i = 0; i < aDevices.Length(); ++i) {
+ rv = array->AppendElement(aDevices.ElementAt(i), /*weak =*/ false);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ NS_ENSURE_TRUE(obs, NS_ERROR_FAILURE);
+
+ return obs->NotifyObservers(array, "getUserMedia:response:allow",
+ aCallID.BeginReading());
+}
+
+// Helper function for notifying permision denial or error
+static nsresult
+NotifyPermissionDeny(const nsAString &aCallID, const nsAString &aErrorMsg)
+{
+ nsresult rv;
+ nsCOMPtr<nsISupportsString> supportsString =
+ do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = supportsString->SetData(aErrorMsg);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ NS_ENSURE_TRUE(obs, NS_ERROR_FAILURE);
+
+ return obs->NotifyObservers(supportsString, "getUserMedia:response:deny",
+ aCallID.BeginReading());
+}
+
+namespace {
+
+/**
+ * MediaPermissionRequest will send a prompt ipdl request to b2g process according
+ * to its owned type.
+ */
+class MediaPermissionRequest : public nsIContentPermissionRequest
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSICONTENTPERMISSIONREQUEST
+
+ MediaPermissionRequest(RefPtr<dom::GetUserMediaRequest> &aRequest,
+ nsTArray<nsCOMPtr<nsIMediaDevice> > &aDevices);
+
+ already_AddRefed<nsPIDOMWindowInner> GetOwner();
+
+protected:
+ virtual ~MediaPermissionRequest() {}
+
+private:
+ nsresult DoAllow(const nsString &audioDevice, const nsString &videoDevice);
+
+ bool mAudio; // Request for audio permission
+ bool mVideo; // Request for video permission
+ RefPtr<dom::GetUserMediaRequest> mRequest;
+ nsTArray<nsCOMPtr<nsIMediaDevice> > mAudioDevices; // candidate audio devices
+ nsTArray<nsCOMPtr<nsIMediaDevice> > mVideoDevices; // candidate video devices
+ nsCOMPtr<nsIContentPermissionRequester> mRequester;
+};
+
+// MediaPermissionRequest
+NS_IMPL_ISUPPORTS(MediaPermissionRequest, nsIContentPermissionRequest)
+
+MediaPermissionRequest::MediaPermissionRequest(RefPtr<dom::GetUserMediaRequest> &aRequest,
+ nsTArray<nsCOMPtr<nsIMediaDevice> > &aDevices)
+ : mRequest(aRequest)
+{
+ dom::MediaStreamConstraints constraints;
+ mRequest->GetConstraints(constraints);
+
+ mAudio = !constraints.mAudio.IsBoolean() || constraints.mAudio.GetAsBoolean();
+ mVideo = !constraints.mVideo.IsBoolean() || constraints.mVideo.GetAsBoolean();
+
+ for (uint32_t i = 0; i < aDevices.Length(); ++i) {
+ nsCOMPtr<nsIMediaDevice> device(aDevices[i]);
+ nsAutoString deviceType;
+ device->GetType(deviceType);
+ if (mAudio && deviceType.EqualsLiteral("audio")) {
+ mAudioDevices.AppendElement(device);
+ }
+ if (mVideo && deviceType.EqualsLiteral("video")) {
+ mVideoDevices.AppendElement(device);
+ }
+ }
+
+ nsCOMPtr<nsPIDOMWindowInner> window = GetOwner();
+ mRequester = new nsContentPermissionRequester(window);
+}
+
+// nsIContentPermissionRequest methods
+NS_IMETHODIMP
+MediaPermissionRequest::GetTypes(nsIArray** aTypes)
+{
+ nsCOMPtr<nsIMutableArray> types = do_CreateInstance(NS_ARRAY_CONTRACTID);
+ //XXX append device list
+ if (mAudio) {
+ nsTArray<nsString> audioDeviceNames;
+ CreateDeviceNameList(mAudioDevices, audioDeviceNames);
+ nsCOMPtr<nsISupports> AudioType =
+ new ContentPermissionType(NS_LITERAL_CSTRING(AUDIO_PERMISSION_NAME),
+ NS_LITERAL_CSTRING("unused"),
+ audioDeviceNames);
+ types->AppendElement(AudioType, false);
+ }
+ if (mVideo) {
+ nsTArray<nsString> videoDeviceNames;
+ CreateDeviceNameList(mVideoDevices, videoDeviceNames);
+ nsCOMPtr<nsISupports> VideoType =
+ new ContentPermissionType(NS_LITERAL_CSTRING(VIDEO_PERMISSION_NAME),
+ NS_LITERAL_CSTRING("unused"),
+ videoDeviceNames);
+ types->AppendElement(VideoType, false);
+ }
+ NS_IF_ADDREF(*aTypes = types);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaPermissionRequest::GetPrincipal(nsIPrincipal **aRequestingPrincipal)
+{
+ NS_ENSURE_ARG_POINTER(aRequestingPrincipal);
+
+ nsCOMPtr<nsPIDOMWindowInner> window =
+ nsGlobalWindow::GetInnerWindowWithId(mRequest->InnerWindowID())->AsInner();
+ NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
+
+ nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
+ NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
+
+ NS_ADDREF(*aRequestingPrincipal = doc->NodePrincipal());
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaPermissionRequest::GetWindow(mozIDOMWindow** aRequestingWindow)
+{
+ NS_ENSURE_ARG_POINTER(aRequestingWindow);
+ nsCOMPtr<nsPIDOMWindowInner> window =
+ nsGlobalWindow::GetInnerWindowWithId(mRequest->InnerWindowID())->AsInner();
+ window.forget(aRequestingWindow);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaPermissionRequest::GetElement(nsIDOMElement** aRequestingElement)
+{
+ NS_ENSURE_ARG_POINTER(aRequestingElement);
+ *aRequestingElement = nullptr;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaPermissionRequest::Cancel()
+{
+ nsString callID;
+ mRequest->GetCallID(callID);
+ NotifyPermissionDeny(callID, NS_LITERAL_STRING("SecurityError"));
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaPermissionRequest::Allow(JS::HandleValue aChoices)
+{
+ // check if JS object
+ if (!aChoices.isObject()) {
+ MOZ_ASSERT(false, "Not a correct format of PermissionChoice");
+ return NS_ERROR_INVALID_ARG;
+ }
+ // iterate through audio-capture and video-capture
+ AutoJSAPI jsapi;
+ if (!jsapi.Init(&aChoices.toObject())) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ JSContext* cx = jsapi.cx();
+ JS::Rooted<JSObject*> obj(cx, &aChoices.toObject());
+ JS::Rooted<JS::Value> v(cx);
+
+ // get selected audio device name
+ nsString audioDevice;
+ if (mAudio) {
+ if (!JS_GetProperty(cx, obj, AUDIO_PERMISSION_NAME, &v) || !v.isString()) {
+ return NS_ERROR_FAILURE;
+ }
+ nsAutoJSString deviceName;
+ if (!deviceName.init(cx, v)) {
+ MOZ_ASSERT(false, "Couldn't initialize string from aChoices");
+ return NS_ERROR_FAILURE;
+ }
+ audioDevice = deviceName;
+ }
+
+ // get selected video device name
+ nsString videoDevice;
+ if (mVideo) {
+ if (!JS_GetProperty(cx, obj, VIDEO_PERMISSION_NAME, &v) || !v.isString()) {
+ return NS_ERROR_FAILURE;
+ }
+ nsAutoJSString deviceName;
+ if (!deviceName.init(cx, v)) {
+ MOZ_ASSERT(false, "Couldn't initialize string from aChoices");
+ return NS_ERROR_FAILURE;
+ }
+ videoDevice = deviceName;
+ }
+
+ return DoAllow(audioDevice, videoDevice);
+}
+
+NS_IMETHODIMP
+MediaPermissionRequest::GetRequester(nsIContentPermissionRequester** aRequester)
+{
+ NS_ENSURE_ARG_POINTER(aRequester);
+
+ nsCOMPtr<nsIContentPermissionRequester> requester = mRequester;
+ requester.forget(aRequester);
+ return NS_OK;
+}
+
+nsresult
+MediaPermissionRequest::DoAllow(const nsString &audioDevice,
+ const nsString &videoDevice)
+{
+ nsTArray<nsCOMPtr<nsIMediaDevice> > selectedDevices;
+ if (mAudio) {
+ nsCOMPtr<nsIMediaDevice> device =
+ FindDeviceByName(mAudioDevices, audioDevice);
+ if (device) {
+ selectedDevices.AppendElement(device);
+ }
+ }
+
+ if (mVideo) {
+ nsCOMPtr<nsIMediaDevice> device =
+ FindDeviceByName(mVideoDevices, videoDevice);
+ if (device) {
+ selectedDevices.AppendElement(device);
+ }
+ }
+
+ nsString callID;
+ mRequest->GetCallID(callID);
+ return NotifyPermissionAllow(callID, selectedDevices);
+}
+
+already_AddRefed<nsPIDOMWindowInner>
+MediaPermissionRequest::GetOwner()
+{
+ nsCOMPtr<nsPIDOMWindowInner> window =
+ nsGlobalWindow::GetInnerWindowWithId(mRequest->InnerWindowID())->AsInner();
+ return window.forget();
+}
+
+// Success callback for MediaManager::GetUserMediaDevices().
+class MediaDeviceSuccessCallback: public nsIGetUserMediaDevicesSuccessCallback
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIGETUSERMEDIADEVICESSUCCESSCALLBACK
+
+ explicit MediaDeviceSuccessCallback(RefPtr<dom::GetUserMediaRequest> &aRequest)
+ : mRequest(aRequest) {}
+
+protected:
+ virtual ~MediaDeviceSuccessCallback() {}
+
+private:
+ nsresult DoPrompt(RefPtr<MediaPermissionRequest> &req);
+ RefPtr<dom::GetUserMediaRequest> mRequest;
+};
+
+NS_IMPL_ISUPPORTS(MediaDeviceSuccessCallback, nsIGetUserMediaDevicesSuccessCallback)
+
+// nsIGetUserMediaDevicesSuccessCallback method
+NS_IMETHODIMP
+MediaDeviceSuccessCallback::OnSuccess(nsIVariant* aDevices)
+{
+ nsIID elementIID;
+ uint16_t elementType;
+ void* rawArray;
+ uint32_t arrayLen;
+
+ nsresult rv;
+ rv = aDevices->GetAsArray(&elementType, &elementIID, &arrayLen, &rawArray);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (elementType != nsIDataType::VTYPE_INTERFACE) {
+ free(rawArray);
+ return NS_ERROR_FAILURE;
+ }
+
+ // Create array for nsIMediaDevice
+ nsTArray<nsCOMPtr<nsIMediaDevice> > devices;
+
+ nsISupports **supportsArray = reinterpret_cast<nsISupports **>(rawArray);
+ for (uint32_t i = 0; i < arrayLen; ++i) {
+ nsCOMPtr<nsIMediaDevice> device(do_QueryInterface(supportsArray[i]));
+ devices.AppendElement(device);
+ NS_IF_RELEASE(supportsArray[i]); // explicitly decrease reference count for raw pointer
+ }
+ free(rawArray); // explicitly free for the memory from nsIVariant::GetAsArray
+
+ // Send MediaPermissionRequest
+ RefPtr<MediaPermissionRequest> req = new MediaPermissionRequest(mRequest, devices);
+ rv = DoPrompt(req);
+
+ NS_ENSURE_SUCCESS(rv, rv);
+ return NS_OK;
+}
+
+// Trigger permission prompt UI
+nsresult
+MediaDeviceSuccessCallback::DoPrompt(RefPtr<MediaPermissionRequest> &req)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window(req->GetOwner());
+ return dom::nsContentPermissionUtils::AskPermission(req, window);
+}
+
+// Error callback for MediaManager::GetUserMediaDevices()
+class MediaDeviceErrorCallback: public nsIDOMGetUserMediaErrorCallback
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIDOMGETUSERMEDIAERRORCALLBACK
+
+ explicit MediaDeviceErrorCallback(const nsAString &aCallID)
+ : mCallID(aCallID) {}
+
+protected:
+ virtual ~MediaDeviceErrorCallback() {}
+
+private:
+ const nsString mCallID;
+};
+
+NS_IMPL_ISUPPORTS(MediaDeviceErrorCallback, nsIDOMGetUserMediaErrorCallback)
+
+// nsIDOMGetUserMediaErrorCallback method
+NS_IMETHODIMP
+MediaDeviceErrorCallback::OnError(nsISupports* aError)
+{
+ RefPtr<MediaStreamError> error = do_QueryObject(aError);
+ if (!error) {
+ return NS_ERROR_NO_INTERFACE;
+ }
+
+ nsString name;
+ error->GetName(name);
+ return NotifyPermissionDeny(mCallID, name);
+}
+
+} // namespace anonymous
+
+// MediaPermissionManager
+NS_IMPL_ISUPPORTS(MediaPermissionManager, nsIObserver)
+
+MediaPermissionManager*
+MediaPermissionManager::GetInstance()
+{
+ if (!gMediaPermMgr) {
+ gMediaPermMgr = new MediaPermissionManager();
+ }
+
+ return gMediaPermMgr;
+}
+
+MediaPermissionManager::MediaPermissionManager()
+{
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ obs->AddObserver(this, "getUserMedia:request", false);
+ obs->AddObserver(this, "xpcom-shutdown", false);
+ }
+}
+
+MediaPermissionManager::~MediaPermissionManager()
+{
+ this->Deinit();
+}
+
+nsresult
+MediaPermissionManager::Deinit()
+{
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ obs->RemoveObserver(this, "getUserMedia:request");
+ obs->RemoveObserver(this, "xpcom-shutdown");
+ }
+ return NS_OK;
+}
+
+// nsIObserver method
+NS_IMETHODIMP
+MediaPermissionManager::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ nsresult rv;
+ if (!strcmp(aTopic, "getUserMedia:request")) {
+ RefPtr<dom::GetUserMediaRequest> req =
+ static_cast<dom::GetUserMediaRequest*>(aSubject);
+ rv = HandleRequest(req);
+
+ if (NS_FAILED(rv)) {
+ nsString callID;
+ req->GetCallID(callID);
+ NotifyPermissionDeny(callID, NS_LITERAL_STRING("unable to enumerate media device"));
+ }
+ } else if (!strcmp(aTopic, "xpcom-shutdown")) {
+ rv = this->Deinit();
+ } else {
+ // not reachable
+ rv = NS_ERROR_FAILURE;
+ }
+ return rv;
+}
+
+// Handle GetUserMediaRequest, query available media device first.
+nsresult
+MediaPermissionManager::HandleRequest(RefPtr<dom::GetUserMediaRequest> &req)
+{
+ nsString callID;
+ req->GetCallID(callID);
+ uint64_t innerWindowID = req->InnerWindowID();
+
+ nsCOMPtr<nsPIDOMWindowInner> innerWindow =
+ nsGlobalWindow::GetInnerWindowWithId(innerWindowID)->AsInner();
+ if (!innerWindow) {
+ MOZ_ASSERT(false, "No inner window");
+ return NS_ERROR_FAILURE;
+ }
+
+ nsCOMPtr<nsIGetUserMediaDevicesSuccessCallback> onSuccess =
+ new MediaDeviceSuccessCallback(req);
+ nsCOMPtr<nsIDOMGetUserMediaErrorCallback> onError =
+ new MediaDeviceErrorCallback(callID);
+
+ dom::MediaStreamConstraints constraints;
+ req->GetConstraints(constraints);
+
+ RefPtr<MediaManager> MediaMgr = MediaManager::GetInstance();
+ nsresult rv = MediaMgr->GetUserMediaDevices(innerWindow, constraints,
+ onSuccess, onError,
+ innerWindowID, callID);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaPermissionGonk.h b/dom/media/MediaPermissionGonk.h
new file mode 100644
index 000000000..0a2fac056
--- /dev/null
+++ b/dom/media/MediaPermissionGonk.h
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DOM_MEDIA_MEDIAPERMISSIONGONK_H
+#define DOM_MEDIA_MEDIAPERMISSIONGONK_H
+
+#include "nsError.h"
+#include "nsIObserver.h"
+#include "nsISupportsImpl.h"
+#include "GetUserMediaRequest.h"
+
+namespace mozilla {
+
+/**
+ * The observer to create the MediaPermissionMgr. This is the entry point of
+ * permission request on b2g.
+ */
+class MediaPermissionManager : public nsIObserver
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+ static MediaPermissionManager* GetInstance();
+
+protected:
+ virtual ~MediaPermissionManager();
+
+private:
+ MediaPermissionManager();
+ nsresult Deinit();
+ nsresult HandleRequest(RefPtr<dom::GetUserMediaRequest> &req);
+};
+
+} // namespace mozilla
+
+#endif // DOM_MEDIA_MEDIAPERMISSIONGONK_H
+
diff --git a/dom/media/MediaPrefs.cpp b/dom/media/MediaPrefs.cpp
new file mode 100644
index 000000000..522870b4e
--- /dev/null
+++ b/dom/media/MediaPrefs.cpp
@@ -0,0 +1,79 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaPrefs.h"
+
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StaticPtr.h"
+#include "MainThreadUtils.h"
+
+namespace mozilla {
+
+StaticAutoPtr<MediaPrefs> MediaPrefs::sInstance;
+
+MediaPrefs&
+MediaPrefs::GetSingleton()
+{
+ if (!sInstance) {
+ sInstance = new MediaPrefs;
+ ClearOnShutdown(&sInstance);
+ }
+ MOZ_ASSERT(SingletonExists());
+ return *sInstance;
+}
+
+bool
+MediaPrefs::SingletonExists()
+{
+ return sInstance != nullptr;
+}
+
+MediaPrefs::MediaPrefs()
+{
+ MediaPrefs::AssertMainThread();
+}
+
+void MediaPrefs::AssertMainThread()
+{
+ MOZ_ASSERT(NS_IsMainThread(), "this code must be run on the main thread");
+}
+
+void MediaPrefs::PrefAddVarCache(bool* aVariable,
+ const char* aPref,
+ bool aDefault)
+{
+ Preferences::AddBoolVarCache(aVariable, aPref, aDefault);
+}
+
+void MediaPrefs::PrefAddVarCache(int32_t* aVariable,
+ const char* aPref,
+ int32_t aDefault)
+{
+ Preferences::AddIntVarCache(aVariable, aPref, aDefault);
+}
+
+void MediaPrefs::PrefAddVarCache(uint32_t* aVariable,
+ const char* aPref,
+ uint32_t aDefault)
+{
+ Preferences::AddUintVarCache(aVariable, aPref, aDefault);
+}
+
+void MediaPrefs::PrefAddVarCache(float* aVariable,
+ const char* aPref,
+ float aDefault)
+{
+ Preferences::AddFloatVarCache(aVariable, aPref, aDefault);
+}
+
+void MediaPrefs::PrefAddVarCache(AtomicUint32* aVariable,
+ const char* aPref,
+ uint32_t aDefault)
+{
+ Preferences::AddAtomicUintVarCache(aVariable, aPref, aDefault);
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaPrefs.h b/dom/media/MediaPrefs.h
new file mode 100644
index 000000000..62b8fc47b
--- /dev/null
+++ b/dom/media/MediaPrefs.h
@@ -0,0 +1,205 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIA_PREFS_H
+#define MEDIA_PREFS_H
+
+#ifdef MOZ_WIDGET_ANDROID
+#include "AndroidBridge.h"
+#endif
+
+#include "mozilla/Atomics.h"
+
+// First time MediaPrefs::GetSingleton() needs to be called on the main thread,
+// before any of the methods accessing the values are used, but after
+// the Preferences system has been initialized.
+
+// The static methods to access the preference value are safe to call
+// from any thread after that first call.
+
+// To register a preference, you need to add a line in this file using
+// the DECL_MEDIA_PREF macro.
+//
+// For example this line in the .h:
+// DECL_MEDIA_PREF("media.resampling.enabled",AudioSinkResampling,bool,false);
+// means that you can call
+// const bool& var = MediaPrefs::AudioSinkResampling();
+// from any thread, you will get the most up to date preference value of
+// "media.resampling.enabled". If the value is not set, the default would be
+// false.
+
+#define DECL_MEDIA_PREF(Pref, Name, Type, Default) \
+public: \
+static const Type& Name() { MOZ_ASSERT(SingletonExists()); return GetSingleton().mPref##Name.mValue; } \
+private: \
+static const char* Get##Name##PrefName() { return Pref; } \
+static StripAtomic<Type> Get##Name##PrefDefault() { return Default; } \
+PrefTemplate<Type, Get##Name##PrefDefault, Get##Name##PrefName> mPref##Name
+
+// Custom Definitions.
+#define GMP_DEFAULT_ASYNC_SHUTDOWN_TIMEOUT 3000
+#define SUSPEND_BACKGROUND_VIDEO_DELAY_MS 10000
+#define TEST_PREFERENCE_FAKE_RECOGNITION_SERVICE "media.webspeech.test.fake_recognition_service"
+
+namespace mozilla {
+
+template<class T> class StaticAutoPtr;
+
+class MediaPrefs final
+{
+ typedef Atomic<uint32_t, Relaxed> AtomicUint32;
+
+ template <typename T>
+ struct StripAtomicImpl {
+ typedef T Type;
+ };
+
+ template <typename T, MemoryOrdering Order>
+ struct StripAtomicImpl<Atomic<T, Order>> {
+ typedef T Type;
+ };
+
+ template <typename T>
+ using StripAtomic = typename StripAtomicImpl<T>::Type;
+
+private:
+ // Since we cannot use const char*, use a function that returns it.
+ template <class T, StripAtomic<T> Default(), const char* Pref()>
+ class PrefTemplate
+ {
+ public:
+ PrefTemplate()
+ : mValue(Default())
+ {
+ Register(Pref());
+ }
+ T mValue;
+ private:
+ void Register(const char* aPreference)
+ {
+ AssertMainThread();
+ PrefAddVarCache(&mValue, aPreference, mValue);
+ }
+ };
+
+ // This is where DECL_MEDIA_PREF for each of the preferences should go.
+
+ // AudioSink
+ DECL_MEDIA_PREF("accessibility.monoaudio.enable", MonoAudio, bool, false);
+ DECL_MEDIA_PREF("media.resampling.enabled", AudioSinkResampling, bool, false);
+ DECL_MEDIA_PREF("media.resampling.rate", AudioSinkResampleRate, uint32_t, 48000);
+ DECL_MEDIA_PREF("media.forcestereo.enabled", AudioSinkForceStereo, bool, true);
+
+ // VideoSink
+ DECL_MEDIA_PREF("media.ruin-av-sync.enabled", RuinAvSync, bool, false);
+
+ // Encrypted Media Extensions
+ DECL_MEDIA_PREF("media.clearkey.persistent-license.enabled", ClearKeyPersistentLicenseEnabled, bool, false);
+
+ // PlatformDecoderModule
+ DECL_MEDIA_PREF("media.apple.forcevda", AppleForceVDA, bool, false);
+ DECL_MEDIA_PREF("media.gmp.insecure.allow", GMPAllowInsecure, bool, false);
+ DECL_MEDIA_PREF("media.gmp.async-shutdown-timeout", GMPAsyncShutdownTimeout, uint32_t, GMP_DEFAULT_ASYNC_SHUTDOWN_TIMEOUT);
+ DECL_MEDIA_PREF("media.eme.enabled", EMEEnabled, bool, false);
+ DECL_MEDIA_PREF("media.use-blank-decoder", PDMUseBlankDecoder, bool, false);
+ DECL_MEDIA_PREF("media.gpu-process-decoder", PDMUseGPUDecoder, bool, false);
+#ifdef MOZ_GONK_MEDIACODEC
+ DECL_MEDIA_PREF("media.gonk.enabled", PDMGonkDecoderEnabled, bool, true);
+#endif
+#ifdef MOZ_WIDGET_ANDROID
+ DECL_MEDIA_PREF("media.android-media-codec.enabled", PDMAndroidMediaCodecEnabled, bool, false);
+ DECL_MEDIA_PREF("media.android-media-codec.preferred", PDMAndroidMediaCodecPreferred, bool, false);
+ DECL_MEDIA_PREF("media.android-remote-codec.enabled", PDMAndroidRemoteCodecEnabled, bool, false);
+#endif
+#ifdef MOZ_FFMPEG
+ DECL_MEDIA_PREF("media.ffmpeg.enabled", PDMFFmpegEnabled, bool, true);
+ DECL_MEDIA_PREF("media.libavcodec.allow-obsolete", LibavcodecAllowObsolete, bool, false);
+#endif
+#ifdef MOZ_FFVPX
+ DECL_MEDIA_PREF("media.ffvpx.enabled", PDMFFVPXEnabled, bool, true);
+#endif
+#ifdef XP_WIN
+ DECL_MEDIA_PREF("media.wmf.enabled", PDMWMFEnabled, bool, true);
+ DECL_MEDIA_PREF("media.wmf.skip-blacklist", PDMWMFSkipBlacklist, bool, false);
+ DECL_MEDIA_PREF("media.decoder-doctor.wmf-disabled-is-failure", DecoderDoctorWMFDisabledIsFailure, bool, false);
+ DECL_MEDIA_PREF("media.wmf.vp9.enabled", PDMWMFVP9DecoderEnabled, bool, true);
+ DECL_MEDIA_PREF("media.wmf.decoder.thread-count", PDMWMFThreadCount, int32_t, -1);
+#endif
+ DECL_MEDIA_PREF("media.decoder.fuzzing.enabled", PDMFuzzingEnabled, bool, false);
+ DECL_MEDIA_PREF("media.decoder.fuzzing.video-output-minimum-interval-ms", PDMFuzzingInterval, uint32_t, 0);
+ DECL_MEDIA_PREF("media.decoder.fuzzing.dont-delay-inputexhausted", PDMFuzzingDelayInputExhausted, bool, true);
+ DECL_MEDIA_PREF("media.gmp.decoder.enabled", PDMGMPEnabled, bool, true);
+ DECL_MEDIA_PREF("media.gmp.decoder.aac", GMPAACPreferred, uint32_t, 0);
+ DECL_MEDIA_PREF("media.gmp.decoder.h264", GMPH264Preferred, uint32_t, 0);
+
+ // MediaDecoderStateMachine
+ DECL_MEDIA_PREF("media.suspend-bkgnd-video.enabled", MDSMSuspendBackgroundVideoEnabled, bool, false);
+ DECL_MEDIA_PREF("media.suspend-bkgnd-video.delay-ms", MDSMSuspendBackgroundVideoDelay, AtomicUint32, SUSPEND_BACKGROUND_VIDEO_DELAY_MS);
+ DECL_MEDIA_PREF("media.dormant-on-pause-timeout-ms", DormantOnPauseTimeout, int32_t, 5000);
+
+ // WebSpeech
+ DECL_MEDIA_PREF("media.webspeech.synth.force_global_queue", WebSpeechForceGlobal, bool, false);
+ DECL_MEDIA_PREF("media.webspeech.test.enable", WebSpeechTestEnabled, bool, false);
+ DECL_MEDIA_PREF("media.webspeech.test.fake_fsm_events", WebSpeechFakeFSMEvents, bool, false);
+ DECL_MEDIA_PREF(TEST_PREFERENCE_FAKE_RECOGNITION_SERVICE, WebSpeechFakeRecognitionService, bool, false);
+ DECL_MEDIA_PREF("media.webspeech.recognition.enable", WebSpeechRecognitionEnabled, bool, false);
+ DECL_MEDIA_PREF("media.webspeech.recognition.force_enable", WebSpeechRecognitionForceEnabled, bool, false);
+
+ DECL_MEDIA_PREF("media.num-decode-threads", MediaThreadPoolDefaultCount, uint32_t, 4);
+ DECL_MEDIA_PREF("media.decoder.limit", MediaDecoderLimit, int32_t, MediaDecoderLimitDefault());
+
+ // Ogg
+ DECL_MEDIA_PREF("media.ogg.enabled", OggEnabled, bool, true);
+ // Flac
+ DECL_MEDIA_PREF("media.ogg.flac.enabled", FlacInOgg, bool, false);
+ DECL_MEDIA_PREF("media.flac.enabled", FlacEnabled, bool, true);
+
+#if defined(MOZ_RUST_MP4PARSE) && !defined(RELEASE_OR_BETA)
+ DECL_MEDIA_PREF("media.rust.test_mode", RustTestMode, bool, false);
+#endif
+
+public:
+ // Manage the singleton:
+ static MediaPrefs& GetSingleton();
+ static bool SingletonExists();
+
+private:
+ template<class T> friend class StaticAutoPtr;
+ static StaticAutoPtr<MediaPrefs> sInstance;
+
+ // Default value functions
+ static int32_t MediaDecoderLimitDefault()
+ {
+#ifdef MOZ_WIDGET_ANDROID
+ if (AndroidBridge::Bridge() &&
+ AndroidBridge::Bridge()->GetAPIVersion() < 18) {
+ // Older Android versions have broken support for multiple simultaneous
+ // decoders, see bug 1278574.
+ return 1;
+ }
+#endif
+ // Otherwise, set no decoder limit.
+ return -1;
+ }
+
+ // Creating these to avoid having to include Preferences.h in the .h
+ static void PrefAddVarCache(bool*, const char*, bool);
+ static void PrefAddVarCache(int32_t*, const char*, int32_t);
+ static void PrefAddVarCache(uint32_t*, const char*, uint32_t);
+ static void PrefAddVarCache(float*, const char*, float);
+ static void PrefAddVarCache(AtomicUint32*, const char*, uint32_t);
+
+ static void AssertMainThread();
+
+ MediaPrefs();
+ MediaPrefs(const MediaPrefs&) = delete;
+ MediaPrefs& operator=(const MediaPrefs&) = delete;
+};
+
+#undef DECL_MEDIA_PREF /* Don't need it outside of this file */
+
+} // namespace mozilla
+
+#endif /* MEDIA_PREFS_H */
diff --git a/dom/media/MediaQueue.h b/dom/media/MediaQueue.h
new file mode 100644
index 000000000..ecbf1c7f5
--- /dev/null
+++ b/dom/media/MediaQueue.h
@@ -0,0 +1,184 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(MediaQueue_h_)
+#define MediaQueue_h_
+
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/TaskQueue.h"
+
+#include "nsDeque.h"
+#include "MediaEventSource.h"
+
+namespace mozilla {
+
+// Thread and type safe wrapper around nsDeque.
+template <class T>
+class MediaQueueDeallocator : public nsDequeFunctor {
+ virtual void* operator() (void* aObject) {
+ RefPtr<T> releaseMe = dont_AddRef(static_cast<T*>(aObject));
+ return nullptr;
+ }
+};
+
+template <class T>
+class MediaQueue : private nsDeque {
+public:
+ MediaQueue()
+ : nsDeque(new MediaQueueDeallocator<T>()),
+ mReentrantMonitor("mediaqueue"),
+ mEndOfStream(false)
+ {}
+
+ ~MediaQueue() {
+ Reset();
+ }
+
+ inline size_t GetSize() const {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return nsDeque::GetSize();
+ }
+
+ inline void Push(T* aItem) {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MOZ_ASSERT(aItem);
+ NS_ADDREF(aItem);
+ MOZ_ASSERT(aItem->GetEndTime() >= aItem->mTime);
+ nsDeque::Push(aItem);
+ mPushEvent.Notify(RefPtr<T>(aItem));
+ }
+
+ inline void PushFront(T* aItem) {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MOZ_ASSERT(aItem);
+ NS_ADDREF(aItem);
+ nsDeque::PushFront(aItem);
+ }
+
+ inline already_AddRefed<T> PopFront() {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ RefPtr<T> rv = dont_AddRef(static_cast<T*>(nsDeque::PopFront()));
+ if (rv) {
+ mPopEvent.Notify(rv);
+ }
+ return rv.forget();
+ }
+
+ inline RefPtr<T> Peek() const {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return static_cast<T*>(nsDeque::Peek());
+ }
+
+ inline RefPtr<T> PeekFront() const {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return static_cast<T*>(nsDeque::PeekFront());
+ }
+
+ void Reset() {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ while (GetSize() > 0) {
+ RefPtr<T> x = dont_AddRef(static_cast<T*>(nsDeque::PopFront()));
+ }
+ mEndOfStream = false;
+ }
+
+ bool AtEndOfStream() const {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return GetSize() == 0 && mEndOfStream;
+ }
+
+ // Returns true if the media queue has had its last item added to it.
+ // This happens when the media stream has been completely decoded. Note this
+ // does not mean that the corresponding stream has finished playback.
+ bool IsFinished() const {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ return mEndOfStream;
+ }
+
+ // Informs the media queue that it won't be receiving any more items.
+ void Finish() {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mEndOfStream = true;
+ mFinishEvent.Notify();
+ }
+
+ // Returns the approximate number of microseconds of items in the queue.
+ int64_t Duration() {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ if (GetSize() == 0) {
+ return 0;
+ }
+ T* last = static_cast<T*>(nsDeque::Peek());
+ T* first = static_cast<T*>(nsDeque::PeekFront());
+ return last->GetEndTime() - first->mTime;
+ }
+
+ void LockedForEach(nsDequeFunctor& aFunctor) const {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ ForEach(aFunctor);
+ }
+
+ // Extracts elements from the queue into aResult, in order.
+ // Elements whose start time is before aTime are ignored.
+ void GetElementsAfter(int64_t aTime, nsTArray<RefPtr<T>>* aResult) {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ if (GetSize() == 0)
+ return;
+ size_t i;
+ for (i = GetSize() - 1; i > 0; --i) {
+ T* v = static_cast<T*>(ObjectAt(i));
+ if (v->GetEndTime() < aTime)
+ break;
+ }
+ // Elements less than i have a end time before aTime. It's also possible
+ // that the element at i has a end time before aTime, but that's OK.
+ for (; i < GetSize(); ++i) {
+ RefPtr<T> elem = static_cast<T*>(ObjectAt(static_cast<size_t>(i)));
+ aResult->AppendElement(elem);
+ }
+ }
+
+ void GetFirstElements(uint32_t aMaxElements, nsTArray<RefPtr<T>>* aResult) {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ for (size_t i = 0; i < aMaxElements && i < GetSize(); ++i) {
+ *aResult->AppendElement() = static_cast<T*>(ObjectAt(i));
+ }
+ }
+
+ uint32_t FrameCount() {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ uint32_t frames = 0;
+ for (size_t i = 0; i < GetSize(); ++i) {
+ T* v = static_cast<T*>(ObjectAt(i));
+ frames += v->mFrames;
+ }
+ return frames;
+ }
+
+ MediaEventSource<RefPtr<T>>& PopEvent() {
+ return mPopEvent;
+ }
+
+ MediaEventSource<RefPtr<T>>& PushEvent() {
+ return mPushEvent;
+ }
+
+ MediaEventSource<void>& FinishEvent() {
+ return mFinishEvent;
+ }
+
+private:
+ mutable ReentrantMonitor mReentrantMonitor;
+ MediaEventProducer<RefPtr<T>> mPopEvent;
+ MediaEventProducer<RefPtr<T>> mPushEvent;
+ MediaEventProducer<void> mFinishEvent;
+ // True when we've decoded the last frame of data in the
+ // bitstream for which we're queueing frame data.
+ bool mEndOfStream;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaRecorder.cpp b/dom/media/MediaRecorder.cpp
new file mode 100644
index 000000000..e2d72b112
--- /dev/null
+++ b/dom/media/MediaRecorder.cpp
@@ -0,0 +1,1535 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaRecorder.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "DOMMediaStream.h"
+#include "EncodedBufferCache.h"
+#include "MediaDecoder.h"
+#include "MediaEncoder.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/dom/AudioStreamTrack.h"
+#include "mozilla/dom/BlobEvent.h"
+#include "mozilla/dom/File.h"
+#include "mozilla/dom/RecordErrorEvent.h"
+#include "mozilla/dom/VideoStreamTrack.h"
+#include "nsAutoPtr.h"
+#include "nsContentUtils.h"
+#include "nsError.h"
+#include "nsIDocument.h"
+#include "nsIPermissionManager.h"
+#include "nsIPrincipal.h"
+#include "nsIScriptError.h"
+#include "nsMimeTypes.h"
+#include "nsProxyRelease.h"
+#include "nsTArray.h"
+#include "GeckoProfiler.h"
+#include "nsContentTypeParser.h"
+#include "nsCharSeparatedTokenizer.h"
+
+#ifdef LOG
+#undef LOG
+#endif
+
+mozilla::LazyLogModule gMediaRecorderLog("MediaRecorder");
+#define LOG(type, msg) MOZ_LOG(gMediaRecorderLog, type, msg)
+
+namespace mozilla {
+
+namespace dom {
+
+/**
++ * MediaRecorderReporter measures memory being used by the Media Recorder.
++ *
++ * It is a singleton reporter and the single class object lives as long as at
++ * least one Recorder is registered. In MediaRecorder, the reporter is unregistered
++ * when it is destroyed.
++ */
+class MediaRecorderReporter final : public nsIMemoryReporter
+{
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ MediaRecorderReporter() {};
+ static MediaRecorderReporter* UniqueInstance();
+ void InitMemoryReporter();
+
+ static void AddMediaRecorder(MediaRecorder *aRecorder)
+ {
+ GetRecorders().AppendElement(aRecorder);
+ }
+
+ static void RemoveMediaRecorder(MediaRecorder *aRecorder)
+ {
+ RecordersArray& recorders = GetRecorders();
+ recorders.RemoveElement(aRecorder);
+ if (recorders.IsEmpty()) {
+ sUniqueInstance = nullptr;
+ }
+ }
+
+ NS_IMETHOD
+ CollectReports(nsIHandleReportCallback* aHandleReport,
+ nsISupports* aData, bool aAnonymize) override
+ {
+ int64_t amount = 0;
+ RecordersArray& recorders = GetRecorders();
+ for (size_t i = 0; i < recorders.Length(); ++i) {
+ amount += recorders[i]->SizeOfExcludingThis(MallocSizeOf);
+ }
+
+ MOZ_COLLECT_REPORT(
+ "explicit/media/recorder", KIND_HEAP, UNITS_BYTES, amount,
+ "Memory used by media recorder.");
+
+ return NS_OK;
+ }
+
+private:
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf)
+ virtual ~MediaRecorderReporter();
+ static StaticRefPtr<MediaRecorderReporter> sUniqueInstance;
+ typedef nsTArray<MediaRecorder*> RecordersArray;
+ static RecordersArray& GetRecorders()
+ {
+ return UniqueInstance()->mRecorders;
+ }
+ RecordersArray mRecorders;
+};
+NS_IMPL_ISUPPORTS(MediaRecorderReporter, nsIMemoryReporter);
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaRecorder)
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaRecorder,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMStream)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAudioNode)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaRecorder,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mDOMStream)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mAudioNode)
+ tmp->UnRegisterActivityObserver();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaRecorder)
+ NS_INTERFACE_MAP_ENTRY(nsIDocumentActivity)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(MediaRecorder, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaRecorder, DOMEventTargetHelper)
+
+/**
+ * Session is an object to represent a single recording event.
+ * In original design, all recording context is stored in MediaRecorder, which causes
+ * a problem if someone calls MediaRecoder::Stop and MedaiRecorder::Start quickly.
+ * To prevent blocking main thread, media encoding is executed in a second thread,
+ * named as Read Thread. For the same reason, we do not wait Read Thread shutdown in
+ * MediaRecorder::Stop. If someone call MediaRecoder::Start before Read Thread shutdown,
+ * the same recording context in MediaRecoder might be access by two Reading Threads,
+ * which cause a problem.
+ * In the new design, we put recording context into Session object, including Read
+ * Thread. Each Session has its own recording context and Read Thread, problem is been
+ * resolved.
+ *
+ * Life cycle of a Session object.
+ * 1) Initialization Stage (in main thread)
+ * Setup media streams in MSG, and bind MediaEncoder with Source Stream when mStream is available.
+ * Resource allocation, such as encoded data cache buffer and MediaEncoder.
+ * Create read thread.
+ * Automatically switch to Extract stage in the end of this stage.
+ * 2) Extract Stage (in Read Thread)
+ * Pull encoded A/V frames from MediaEncoder, dispatch to OnDataAvailable handler.
+ * Unless a client calls Session::Stop, Session object keeps stay in this stage.
+ * 3) Destroy Stage (in main thread)
+ * Switch from Extract stage to Destroy stage by calling Session::Stop.
+ * Release session resource and remove associated streams from MSG.
+ *
+ * Lifetime of MediaRecorder and Session objects.
+ * 1) MediaRecorder creates a Session in MediaRecorder::Start function and holds
+ * a reference to Session. Then the Session registers itself to
+ * ShutdownObserver and also holds a reference to MediaRecorder.
+ * Therefore, the reference dependency in gecko is:
+ * ShutdownObserver -> Session <-> MediaRecorder, note that there is a cycle
+ * reference between Session and MediaRecorder.
+ * 2) A Session is destroyed in DestroyRunnable after MediaRecorder::Stop being called
+ * _and_ all encoded media data been passed to OnDataAvailable handler.
+ * 3) MediaRecorder::Stop is called by user or the document is going to
+ * inactive or invisible.
+ */
+class MediaRecorder::Session: public nsIObserver,
+ public PrincipalChangeObserver<MediaStreamTrack>,
+ public DOMMediaStream::TrackListener
+{
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // Main thread task.
+ // Create a blob event and send back to client.
+ class PushBlobRunnable : public Runnable
+ {
+ public:
+ explicit PushBlobRunnable(Session* aSession)
+ : mSession(aSession)
+ { }
+
+ NS_IMETHOD Run() override
+ {
+ LOG(LogLevel::Debug, ("Session.PushBlobRunnable s=(%p)", mSession.get()));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ RefPtr<MediaRecorder> recorder = mSession->mRecorder;
+ if (!recorder) {
+ return NS_OK;
+ }
+
+ nsresult rv = recorder->CreateAndDispatchBlobEvent(mSession->GetEncodedData());
+ if (NS_FAILED(rv)) {
+ recorder->NotifyError(rv);
+ }
+
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<Session> mSession;
+ };
+
+ // Notify encoder error, run in main thread task. (Bug 1095381)
+ class EncoderErrorNotifierRunnable : public Runnable
+ {
+ public:
+ explicit EncoderErrorNotifierRunnable(Session* aSession)
+ : mSession(aSession)
+ { }
+
+ NS_IMETHOD Run() override
+ {
+ LOG(LogLevel::Debug, ("Session.ErrorNotifyRunnable s=(%p)", mSession.get()));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ RefPtr<MediaRecorder> recorder = mSession->mRecorder;
+ if (!recorder) {
+ return NS_OK;
+ }
+
+ if (mSession->IsEncoderError()) {
+ recorder->NotifyError(NS_ERROR_UNEXPECTED);
+ }
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<Session> mSession;
+ };
+
+ // Fire start event and set mimeType, run in main thread task.
+ class DispatchStartEventRunnable : public Runnable
+ {
+ public:
+ DispatchStartEventRunnable(Session* aSession, const nsAString & aEventName)
+ : mSession(aSession)
+ , mEventName(aEventName)
+ { }
+
+ NS_IMETHOD Run() override
+ {
+ LOG(LogLevel::Debug, ("Session.DispatchStartEventRunnable s=(%p)", mSession.get()));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ NS_ENSURE_TRUE(mSession->mRecorder, NS_OK);
+ RefPtr<MediaRecorder> recorder = mSession->mRecorder;
+
+ recorder->SetMimeType(mSession->mMimeType);
+ recorder->DispatchSimpleEvent(mEventName);
+
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<Session> mSession;
+ nsString mEventName;
+ };
+
+ // Record thread task and it run in Media Encoder thread.
+ // Fetch encoded Audio/Video data from MediaEncoder.
+ class ExtractRunnable : public Runnable
+ {
+ public:
+ explicit ExtractRunnable(Session* aSession)
+ : mSession(aSession) {}
+
+ ~ExtractRunnable()
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_GetCurrentThread() == mSession->mReadThread);
+
+ LOG(LogLevel::Debug, ("Session.ExtractRunnable shutdown = %d", mSession->mEncoder->IsShutdown()));
+ if (!mSession->mEncoder->IsShutdown()) {
+ mSession->Extract(false);
+ if (NS_FAILED(NS_DispatchToCurrentThread(this))) {
+ NS_WARNING("Failed to dispatch ExtractRunnable to encoder thread");
+ }
+ } else {
+ // Flush out remaining encoded data.
+ mSession->Extract(true);
+ if (mSession->mIsRegisterProfiler)
+ profiler_unregister_thread();
+ if (NS_FAILED(NS_DispatchToMainThread(
+ new DestroyRunnable(mSession.forget())))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread DestroyRunnable failed");
+ }
+ }
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<Session> mSession;
+ };
+
+ // For Ensure recorder has tracks to record.
+ class TracksAvailableCallback : public OnTracksAvailableCallback
+ {
+ public:
+ explicit TracksAvailableCallback(Session *aSession, TrackRate aTrackRate)
+ : mSession(aSession)
+ , mTrackRate(aTrackRate) {}
+
+ virtual void NotifyTracksAvailable(DOMMediaStream* aStream)
+ {
+ if (mSession->mStopIssued) {
+ return;
+ }
+
+ MOZ_RELEASE_ASSERT(aStream);
+ mSession->MediaStreamReady(*aStream);
+
+ uint8_t trackTypes = 0;
+ nsTArray<RefPtr<mozilla::dom::AudioStreamTrack>> audioTracks;
+ aStream->GetAudioTracks(audioTracks);
+ if (!audioTracks.IsEmpty()) {
+ trackTypes |= ContainerWriter::CREATE_AUDIO_TRACK;
+ mSession->ConnectMediaStreamTrack(*audioTracks[0]);
+ }
+
+ nsTArray<RefPtr<mozilla::dom::VideoStreamTrack>> videoTracks;
+ aStream->GetVideoTracks(videoTracks);
+ if (!videoTracks.IsEmpty()) {
+ trackTypes |= ContainerWriter::CREATE_VIDEO_TRACK;
+ mSession->ConnectMediaStreamTrack(*videoTracks[0]);
+ }
+
+ if (audioTracks.Length() > 1 ||
+ videoTracks.Length() > 1) {
+ // When MediaRecorder supports multiple tracks, we should set up a single
+ // MediaInputPort from the input stream, and let main thread check
+ // track principals async later.
+ nsPIDOMWindowInner* window = mSession->mRecorder->GetParentObject();
+ nsIDocument* document = window ? window->GetExtantDoc() : nullptr;
+ nsContentUtils::ReportToConsole(nsIScriptError::errorFlag,
+ NS_LITERAL_CSTRING("Media"),
+ document,
+ nsContentUtils::eDOM_PROPERTIES,
+ "MediaRecorderMultiTracksNotSupported");
+ mSession->DoSessionEndTask(NS_ERROR_ABORT);
+ return;
+ }
+
+ NS_ASSERTION(trackTypes != 0, "TracksAvailableCallback without any tracks available");
+
+ // Check that we may access the tracks' content.
+ if (!mSession->MediaStreamTracksPrincipalSubsumes()) {
+ LOG(LogLevel::Warning, ("Session.NotifyTracksAvailable MediaStreamTracks principal check failed"));
+ mSession->DoSessionEndTask(NS_ERROR_DOM_SECURITY_ERR);
+ return;
+ }
+
+ LOG(LogLevel::Debug, ("Session.NotifyTracksAvailable track type = (%d)", trackTypes));
+ mSession->InitEncoder(trackTypes, mTrackRate);
+ }
+ private:
+ RefPtr<Session> mSession;
+ TrackRate mTrackRate;
+ };
+ // Main thread task.
+ // To delete RecordingSession object.
+ class DestroyRunnable : public Runnable
+ {
+ public:
+ explicit DestroyRunnable(Session* aSession)
+ : mSession(aSession) {}
+
+ explicit DestroyRunnable(already_AddRefed<Session> aSession)
+ : mSession(aSession) {}
+
+ NS_IMETHOD Run() override
+ {
+ LOG(LogLevel::Debug, ("Session.DestroyRunnable session refcnt = (%d) stopIssued %d s=(%p)",
+ (int)mSession->mRefCnt, mSession->mStopIssued, mSession.get()));
+ MOZ_ASSERT(NS_IsMainThread() && mSession);
+ RefPtr<MediaRecorder> recorder = mSession->mRecorder;
+ if (!recorder) {
+ return NS_OK;
+ }
+ // SourceMediaStream is ended, and send out TRACK_EVENT_END notification.
+ // Read Thread will be terminate soon.
+ // We need to switch MediaRecorder to "Stop" state first to make sure
+ // MediaRecorder is not associated with this Session anymore, then, it's
+ // safe to delete this Session.
+ // Also avoid to run if this session already call stop before
+ if (!mSession->mStopIssued) {
+ ErrorResult result;
+ mSession->mStopIssued = true;
+ recorder->Stop(result);
+ if (NS_FAILED(NS_DispatchToMainThread(new DestroyRunnable(mSession.forget())))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread failed");
+ }
+ return NS_OK;
+ }
+
+ // Dispatch stop event and clear MIME type.
+ mSession->mMimeType = NS_LITERAL_STRING("");
+ recorder->SetMimeType(mSession->mMimeType);
+ recorder->DispatchSimpleEvent(NS_LITERAL_STRING("stop"));
+ mSession->BreakCycle();
+ return NS_OK;
+ }
+
+ private:
+ // Call mSession::Release automatically while DestroyRunnable be destroy.
+ RefPtr<Session> mSession;
+ };
+
+ friend class EncoderErrorNotifierRunnable;
+ friend class PushBlobRunnable;
+ friend class ExtractRunnable;
+ friend class DestroyRunnable;
+ friend class TracksAvailableCallback;
+
+public:
+ Session(MediaRecorder* aRecorder, int32_t aTimeSlice)
+ : mRecorder(aRecorder)
+ , mTimeSlice(aTimeSlice)
+ , mStopIssued(false)
+ , mIsStartEventFired(false)
+ , mIsRegisterProfiler(false)
+ , mNeedSessionEndTask(true)
+ , mSelectedVideoTrackID(TRACK_NONE)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(MediaRecorder::Session);
+
+ uint32_t maxMem = Preferences::GetUint("media.recorder.max_memory",
+ MAX_ALLOW_MEMORY_BUFFER);
+ mEncodedBufferCache = new EncodedBufferCache(maxMem);
+ mLastBlobTimeStamp = TimeStamp::Now();
+ }
+
+ void PrincipalChanged(MediaStreamTrack* aTrack) override
+ {
+ NS_ASSERTION(mMediaStreamTracks.Contains(aTrack),
+ "Principal changed for unrecorded track");
+ if (!MediaStreamTracksPrincipalSubsumes()) {
+ DoSessionEndTask(NS_ERROR_DOM_SECURITY_ERR);
+ }
+ }
+
+ void NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack) override
+ {
+ LOG(LogLevel::Warning, ("Session.NotifyTrackAdded %p Raising error due to track set change", this));
+ DoSessionEndTask(NS_ERROR_ABORT);
+ }
+
+ void NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack) override
+ {
+ // Handle possible early removal of direct video listener
+ if (mEncoder) {
+ RefPtr<VideoStreamTrack> videoTrack = aTrack->AsVideoStreamTrack();
+ if (videoTrack) {
+ videoTrack->RemoveDirectListener(mEncoder->GetVideoSink());
+ }
+ }
+
+ RefPtr<MediaInputPort> foundInputPort;
+ for (RefPtr<MediaInputPort> inputPort : mInputPorts) {
+ if (aTrack->IsForwardedThrough(inputPort)) {
+ foundInputPort = inputPort;
+ break;
+ }
+ }
+
+ if (foundInputPort) {
+ // A recorded track was removed or ended. End it in the recording.
+ // Don't raise an error.
+ foundInputPort->Destroy();
+ DebugOnly<bool> removed = mInputPorts.RemoveElement(foundInputPort);
+ MOZ_ASSERT(removed);
+ return;
+ }
+
+ LOG(LogLevel::Warning, ("Session.NotifyTrackRemoved %p Raising error due to track set change", this));
+ DoSessionEndTask(NS_ERROR_ABORT);
+ }
+
+ void Start()
+ {
+ LOG(LogLevel::Debug, ("Session.Start %p", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // Create a Track Union Stream
+ MediaStreamGraph* gm = mRecorder->GetSourceMediaStream()->Graph();
+ TrackRate trackRate = gm->GraphRate();
+ mTrackUnionStream = gm->CreateTrackUnionStream();
+ MOZ_ASSERT(mTrackUnionStream, "CreateTrackUnionStream failed");
+
+ mTrackUnionStream->SetAutofinish(true);
+
+ DOMMediaStream* domStream = mRecorder->Stream();
+ if (domStream) {
+ // Get the available tracks from the DOMMediaStream.
+ // The callback will report back tracks that we have to connect to
+ // mTrackUnionStream and listen to principal changes on.
+ TracksAvailableCallback* tracksAvailableCallback = new TracksAvailableCallback(this, trackRate);
+ domStream->OnTracksAvailable(tracksAvailableCallback);
+ } else {
+ // Check that we may access the audio node's content.
+ if (!AudioNodePrincipalSubsumes()) {
+ LOG(LogLevel::Warning, ("Session.Start AudioNode principal check failed"));
+ DoSessionEndTask(NS_ERROR_DOM_SECURITY_ERR);
+ return;
+ }
+ // Bind this Track Union Stream with Source Media.
+ RefPtr<MediaInputPort> inputPort =
+ mTrackUnionStream->AllocateInputPort(mRecorder->GetSourceMediaStream());
+ mInputPorts.AppendElement(inputPort.forget());
+ MOZ_ASSERT(mInputPorts[mInputPorts.Length()-1]);
+
+ // Web Audio node has only audio.
+ InitEncoder(ContainerWriter::CREATE_AUDIO_TRACK, trackRate);
+ }
+ }
+
+ void Stop()
+ {
+ LOG(LogLevel::Debug, ("Session.Stop %p", this));
+ MOZ_ASSERT(NS_IsMainThread());
+ mStopIssued = true;
+ CleanupStreams();
+ if (mNeedSessionEndTask) {
+ LOG(LogLevel::Debug, ("Session.Stop mNeedSessionEndTask %p", this));
+ // End the Session directly if there is no ExtractRunnable.
+ DoSessionEndTask(NS_OK);
+ }
+ // If we don't do this, the Session will be purged only when the navigator exit
+ // by the ShutdownObserver and the memory and number of threads will quickly
+ // grows with each couple stop/start.
+ nsContentUtils::UnregisterShutdownObserver(this);
+ }
+
+ nsresult Pause()
+ {
+ LOG(LogLevel::Debug, ("Session.Pause"));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ NS_ENSURE_TRUE(mTrackUnionStream, NS_ERROR_FAILURE);
+ mTrackUnionStream->Suspend();
+ if (mEncoder) {
+ mEncoder->Suspend();
+ }
+
+ return NS_OK;
+ }
+
+ nsresult Resume()
+ {
+ LOG(LogLevel::Debug, ("Session.Resume"));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ NS_ENSURE_TRUE(mTrackUnionStream, NS_ERROR_FAILURE);
+ if (mEncoder) {
+ mEncoder->Resume();
+ }
+ mTrackUnionStream->Resume();
+
+ return NS_OK;
+ }
+
+ nsresult RequestData()
+ {
+ LOG(LogLevel::Debug, ("Session.RequestData"));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (NS_FAILED(NS_DispatchToMainThread(new EncoderErrorNotifierRunnable(this))) ||
+ NS_FAILED(NS_DispatchToMainThread(new PushBlobRunnable(this)))) {
+ MOZ_ASSERT(false, "RequestData NS_DispatchToMainThread failed");
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+ }
+
+ already_AddRefed<nsIDOMBlob> GetEncodedData()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mEncodedBufferCache->ExtractBlob(mRecorder->GetParentObject(),
+ mMimeType);
+ }
+
+ bool IsEncoderError()
+ {
+ if (mEncoder && mEncoder->HasError()) {
+ return true;
+ }
+ return false;
+ }
+
+ size_t
+ SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+ {
+ return (mEncoder ? mEncoder->SizeOfExcludingThis(aMallocSizeOf) : 0);
+ }
+
+
+private:
+ // Only DestroyRunnable is allowed to delete Session object.
+ virtual ~Session()
+ {
+ MOZ_COUNT_DTOR(MediaRecorder::Session);
+ LOG(LogLevel::Debug, ("Session.~Session (%p)", this));
+ CleanupStreams();
+ if (mReadThread) {
+ mReadThread->Shutdown();
+ mReadThread = nullptr;
+ // Inside the if() so that if we delete after xpcom-shutdown's Observe(), we
+ // won't try to remove it after the observer service is shut down.
+ // Unregistering for safety in case Stop() was never called
+ nsContentUtils::UnregisterShutdownObserver(this);
+ }
+ }
+ // Pull encoded media data from MediaEncoder and put into EncodedBufferCache.
+ // Destroy this session object in the end of this function.
+ // If the bool aForceFlush is true, we will force to dispatch a
+ // PushBlobRunnable to main thread.
+ void Extract(bool aForceFlush)
+ {
+ MOZ_ASSERT(NS_GetCurrentThread() == mReadThread);
+ LOG(LogLevel::Debug, ("Session.Extract %p", this));
+
+ if (!mIsRegisterProfiler) {
+ char aLocal;
+ profiler_register_thread("Media_Encoder", &aLocal);
+ mIsRegisterProfiler = true;
+ }
+
+ PROFILER_LABEL("MediaRecorder", "Session Extract",
+ js::ProfileEntry::Category::OTHER);
+
+ // Pull encoded media data from MediaEncoder
+ nsTArray<nsTArray<uint8_t> > encodedBuf;
+ mEncoder->GetEncodedData(&encodedBuf, mMimeType);
+
+ // Append pulled data into cache buffer.
+ for (uint32_t i = 0; i < encodedBuf.Length(); i++) {
+ if (!encodedBuf[i].IsEmpty()) {
+ mEncodedBufferCache->AppendBuffer(encodedBuf[i]);
+ // Fire the start event when encoded data is available.
+ if (!mIsStartEventFired) {
+ NS_DispatchToMainThread(
+ new DispatchStartEventRunnable(this, NS_LITERAL_STRING("start")));
+ mIsStartEventFired = true;
+ }
+ }
+ }
+
+ // Whether push encoded data back to onDataAvailable automatically or we
+ // need a flush.
+ bool pushBlob = false;
+ if ((mTimeSlice > 0) &&
+ ((TimeStamp::Now()-mLastBlobTimeStamp).ToMilliseconds() > mTimeSlice)) {
+ pushBlob = true;
+ }
+ if (pushBlob || aForceFlush) {
+ // Fire the start event before the blob.
+ if (!mIsStartEventFired) {
+ NS_DispatchToMainThread(
+ new DispatchStartEventRunnable(this, NS_LITERAL_STRING("start")));
+ mIsStartEventFired = true;
+ }
+ if (NS_FAILED(NS_DispatchToMainThread(new EncoderErrorNotifierRunnable(this)))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread EncoderErrorNotifierRunnable failed");
+ }
+ if (NS_FAILED(NS_DispatchToMainThread(new PushBlobRunnable(this)))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread PushBlobRunnable failed");
+ } else {
+ mLastBlobTimeStamp = TimeStamp::Now();
+ }
+ }
+ }
+
+ void MediaStreamReady(DOMMediaStream& aStream) {
+ mMediaStream = &aStream;
+ aStream.RegisterTrackListener(this);
+ }
+
+ void ConnectMediaStreamTrack(MediaStreamTrack& aTrack)
+ {
+ mMediaStreamTracks.AppendElement(&aTrack);
+ aTrack.AddPrincipalChangeObserver(this);
+ RefPtr<MediaInputPort> inputPort =
+ aTrack.ForwardTrackContentsTo(mTrackUnionStream);
+ MOZ_ASSERT(inputPort);
+ mInputPorts.AppendElement(inputPort.forget());
+ MOZ_ASSERT(mInputPorts[mInputPorts.Length()-1]);
+ }
+
+ bool PrincipalSubsumes(nsIPrincipal* aPrincipal)
+ {
+ if (!mRecorder->GetOwner())
+ return false;
+ nsCOMPtr<nsIDocument> doc = mRecorder->GetOwner()->GetExtantDoc();
+ if (!doc) {
+ return false;
+ }
+ if (!aPrincipal) {
+ return false;
+ }
+ bool subsumes;
+ if (NS_FAILED(doc->NodePrincipal()->Subsumes(aPrincipal, &subsumes))) {
+ return false;
+ }
+ return subsumes;
+ }
+
+ bool MediaStreamTracksPrincipalSubsumes()
+ {
+ MOZ_ASSERT(mRecorder->mDOMStream);
+ nsCOMPtr<nsIPrincipal> principal = nullptr;
+ for (RefPtr<MediaStreamTrack>& track : mMediaStreamTracks) {
+ nsContentUtils::CombineResourcePrincipals(&principal, track->GetPrincipal());
+ }
+ return PrincipalSubsumes(principal);
+ }
+
+ bool AudioNodePrincipalSubsumes()
+ {
+ MOZ_ASSERT(mRecorder->mAudioNode != nullptr);
+ nsIDocument* doc = mRecorder->mAudioNode->GetOwner()
+ ? mRecorder->mAudioNode->GetOwner()->GetExtantDoc()
+ : nullptr;
+ nsCOMPtr<nsIPrincipal> principal = doc ? doc->NodePrincipal() : nullptr;
+ return PrincipalSubsumes(principal);
+ }
+
+ bool CheckPermission(const char* aType)
+ {
+ if (!mRecorder || !mRecorder->GetOwner()) {
+ return false;
+ }
+
+ nsCOMPtr<nsIDocument> doc = mRecorder->GetOwner()->GetExtantDoc();
+ if (!doc) {
+ return false;
+ }
+
+ // Certified applications can always assign AUDIO_3GPP
+ if (doc->NodePrincipal()->GetAppStatus() ==
+ nsIPrincipal::APP_STATUS_CERTIFIED) {
+ return true;
+ }
+
+ nsCOMPtr<nsIPermissionManager> pm =
+ do_GetService(NS_PERMISSIONMANAGER_CONTRACTID);
+
+ if (!pm) {
+ return false;
+ }
+
+ uint32_t perm = nsIPermissionManager::DENY_ACTION;
+ pm->TestExactPermissionFromPrincipal(doc->NodePrincipal(), aType, &perm);
+ return perm == nsIPermissionManager::ALLOW_ACTION;
+ }
+
+ void InitEncoder(uint8_t aTrackTypes, TrackRate aTrackRate)
+ {
+ LOG(LogLevel::Debug, ("Session.InitEncoder %p", this));
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mRecorder) {
+ LOG(LogLevel::Debug, ("Session.InitEncoder failure, mRecorder is null %p", this));
+ return;
+ }
+ // Allocate encoder and bind with union stream.
+ // At this stage, the API doesn't allow UA to choose the output mimeType format.
+
+ // Make sure the application has permission to assign AUDIO_3GPP
+ if (mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP) && CheckPermission("audio-capture:3gpp")) {
+ mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(AUDIO_3GPP),
+ mRecorder->GetAudioBitrate(),
+ mRecorder->GetVideoBitrate(),
+ mRecorder->GetBitrate(),
+ aTrackTypes, aTrackRate);
+ } else if (mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP2) && CheckPermission("audio-capture:3gpp2")) {
+ mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(AUDIO_3GPP2),
+ mRecorder->GetAudioBitrate(),
+ mRecorder->GetVideoBitrate(),
+ mRecorder->GetBitrate(),
+ aTrackTypes, aTrackRate);
+ } else {
+ mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(""),
+ mRecorder->GetAudioBitrate(),
+ mRecorder->GetVideoBitrate(),
+ mRecorder->GetBitrate(),
+ aTrackTypes, aTrackRate);
+ }
+
+ if (!mEncoder) {
+ LOG(LogLevel::Debug, ("Session.InitEncoder !mEncoder %p", this));
+ DoSessionEndTask(NS_ERROR_ABORT);
+ return;
+ }
+
+ // Media stream is ready but UA issues a stop method follow by start method.
+ // The Session::stop would clean the mTrackUnionStream. If the AfterTracksAdded
+ // comes after stop command, this function would crash.
+ if (!mTrackUnionStream) {
+ LOG(LogLevel::Debug, ("Session.InitEncoder !mTrackUnionStream %p", this));
+ DoSessionEndTask(NS_OK);
+ return;
+ }
+ mTrackUnionStream->AddListener(mEncoder.get());
+
+ nsTArray<RefPtr<mozilla::dom::VideoStreamTrack>> videoTracks;
+ DOMMediaStream* domStream = mRecorder->Stream();
+ if (domStream) {
+ domStream->GetVideoTracks(videoTracks);
+ if (!videoTracks.IsEmpty()) {
+ // Right now, the MediaRecorder hasn't dealt with multiple video track
+ // issues. So we just bind with the first video track. Bug 1276928 is
+ // the following.
+ videoTracks[0]->AddDirectListener(mEncoder->GetVideoSink());
+ }
+ }
+
+ // Try to use direct listeners if possible
+ if (domStream && domStream->GetInputStream()) {
+ mInputStream = domStream->GetInputStream()->AsSourceStream();
+ if (mInputStream) {
+ mInputStream->AddDirectListener(mEncoder.get());
+ mEncoder->SetDirectConnect(true);
+ }
+ }
+
+ // Create a thread to read encode media data from MediaEncoder.
+ if (!mReadThread) {
+ nsresult rv = NS_NewNamedThread("Media_Encoder", getter_AddRefs(mReadThread));
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Debug, ("Session.InitEncoder !mReadThread %p", this));
+ DoSessionEndTask(rv);
+ return;
+ }
+ }
+
+ // In case source media stream does not notify track end, receive
+ // shutdown notification and stop Read Thread.
+ nsContentUtils::RegisterShutdownObserver(this);
+
+ nsCOMPtr<nsIRunnable> event = new ExtractRunnable(this);
+ if (NS_FAILED(mReadThread->Dispatch(event, NS_DISPATCH_NORMAL))) {
+ NS_WARNING("Failed to dispatch ExtractRunnable at beginning");
+ LOG(LogLevel::Debug, ("Session.InitEncoder !ReadThread->Dispatch %p", this));
+ DoSessionEndTask(NS_ERROR_ABORT);
+ }
+ // Set mNeedSessionEndTask to false because the
+ // ExtractRunnable/DestroyRunnable will take the response to
+ // end the session.
+ mNeedSessionEndTask = false;
+ }
+ // application should get blob and onstop event
+ void DoSessionEndTask(nsresult rv)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ CleanupStreams();
+ NS_DispatchToMainThread(
+ new DispatchStartEventRunnable(this, NS_LITERAL_STRING("start")));
+
+ if (NS_FAILED(rv)) {
+ NS_DispatchToMainThread(NewRunnableMethod<nsresult>(mRecorder,
+ &MediaRecorder::NotifyError, rv));
+ }
+ if (NS_FAILED(NS_DispatchToMainThread(new EncoderErrorNotifierRunnable(this)))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread EncoderErrorNotifierRunnable failed");
+ }
+ if (rv != NS_ERROR_DOM_SECURITY_ERR) {
+ // Don't push a blob if there was a security error.
+ if (NS_FAILED(NS_DispatchToMainThread(new PushBlobRunnable(this)))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread PushBlobRunnable failed");
+ }
+ }
+ if (NS_FAILED(NS_DispatchToMainThread(new DestroyRunnable(this)))) {
+ MOZ_ASSERT(false, "NS_DispatchToMainThread DestroyRunnable failed");
+ }
+ mNeedSessionEndTask = false;
+ }
+ void CleanupStreams()
+ {
+ if (mInputStream) {
+ if (mEncoder) {
+ mInputStream->RemoveDirectListener(mEncoder.get());
+ }
+ mInputStream = nullptr;
+ }
+ for (RefPtr<MediaInputPort>& inputPort : mInputPorts) {
+ MOZ_ASSERT(inputPort);
+ inputPort->Destroy();
+ }
+ mInputPorts.Clear();
+
+ if (mTrackUnionStream) {
+ if (mEncoder) {
+ nsTArray<RefPtr<mozilla::dom::VideoStreamTrack>> videoTracks;
+ DOMMediaStream* domStream = mRecorder->Stream();
+ if (domStream) {
+ domStream->GetVideoTracks(videoTracks);
+ if (!videoTracks.IsEmpty()) {
+ videoTracks[0]->RemoveDirectListener(mEncoder->GetVideoSink());
+ }
+ }
+ }
+
+ // Sometimes the MediaEncoder might be initialized fail and go to
+ // |CleanupStreams|. So the mEncoder might be a nullptr in this case.
+ if (mEncoder && mSelectedVideoTrackID != TRACK_NONE) {
+ mTrackUnionStream->RemoveVideoOutput(mEncoder->GetVideoSink(), mSelectedVideoTrackID);
+ }
+ if (mEncoder) {
+ mTrackUnionStream->RemoveListener(mEncoder.get());
+ }
+ mTrackUnionStream->Destroy();
+ mTrackUnionStream = nullptr;
+ }
+
+ if (mMediaStream) {
+ mMediaStream->UnregisterTrackListener(this);
+ mMediaStream = nullptr;
+ }
+
+ for (RefPtr<MediaStreamTrack>& track : mMediaStreamTracks) {
+ track->RemovePrincipalChangeObserver(this);
+ }
+ mMediaStreamTracks.Clear();
+ }
+
+ NS_IMETHOD Observe(nsISupports *aSubject, const char *aTopic, const char16_t *aData) override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ LOG(LogLevel::Debug, ("Session.Observe XPCOM_SHUTDOWN %p", this));
+ if (strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) {
+ // Force stop Session to terminate Read Thread.
+ mEncoder->Cancel();
+ if (mReadThread) {
+ mReadThread->Shutdown();
+ mReadThread = nullptr;
+ }
+ nsContentUtils::UnregisterShutdownObserver(this);
+ BreakCycle();
+ Stop();
+ }
+
+ return NS_OK;
+ }
+
+ // Break the cycle reference between Session and MediaRecorder.
+ void BreakCycle()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mRecorder) {
+ mRecorder->RemoveSession(this);
+ mRecorder = nullptr;
+ }
+ }
+
+private:
+ // Hold reference to MediaRecoder that ensure MediaRecorder is alive
+ // if there is an active session. Access ONLY on main thread.
+ RefPtr<MediaRecorder> mRecorder;
+
+ // Receive track data from source and dispatch to Encoder.
+ // Pause/ Resume controller.
+ RefPtr<ProcessedMediaStream> mTrackUnionStream;
+ RefPtr<SourceMediaStream> mInputStream;
+ nsTArray<RefPtr<MediaInputPort>> mInputPorts;
+
+ // Stream currently recorded.
+ RefPtr<DOMMediaStream> mMediaStream;
+
+ // Tracks currently recorded. This should be a subset of mMediaStream's track
+ // set.
+ nsTArray<RefPtr<MediaStreamTrack>> mMediaStreamTracks;
+
+ // Runnable thread for read data from MediaEncode.
+ nsCOMPtr<nsIThread> mReadThread;
+ // MediaEncoder pipeline.
+ RefPtr<MediaEncoder> mEncoder;
+ // A buffer to cache encoded meda data.
+ nsAutoPtr<EncodedBufferCache> mEncodedBufferCache;
+ // Current session mimeType
+ nsString mMimeType;
+ // Timestamp of the last fired dataavailable event.
+ TimeStamp mLastBlobTimeStamp;
+ // The interval of passing encoded data from EncodedBufferCache to onDataAvailable
+ // handler. "mTimeSlice < 0" means Session object does not push encoded data to
+ // onDataAvailable, instead, it passive wait the client side pull encoded data
+ // by calling requestData API.
+ const int32_t mTimeSlice;
+ // Indicate this session's stop has been called.
+ bool mStopIssued;
+ // Indicate the session had fire start event. Encoding thread only.
+ bool mIsStartEventFired;
+ // The register flag for "Media_Encoder" thread to profiler
+ bool mIsRegisterProfiler;
+ // False if the InitEncoder called successfully, ensure the
+ // ExtractRunnable/DestroyRunnable will end the session.
+ // Main thread only.
+ bool mNeedSessionEndTask;
+ TrackID mSelectedVideoTrackID;
+};
+
+NS_IMPL_ISUPPORTS(MediaRecorder::Session, nsIObserver)
+
+MediaRecorder::~MediaRecorder()
+{
+ if (mPipeStream != nullptr) {
+ mInputPort->Destroy();
+ mPipeStream->Destroy();
+ }
+ LOG(LogLevel::Debug, ("~MediaRecorder (%p)", this));
+ UnRegisterActivityObserver();
+}
+
+MediaRecorder::MediaRecorder(DOMMediaStream& aSourceMediaStream,
+ nsPIDOMWindowInner* aOwnerWindow)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mState(RecordingState::Inactive)
+{
+ MOZ_ASSERT(aOwnerWindow);
+ MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
+ mDOMStream = &aSourceMediaStream;
+
+ RegisterActivityObserver();
+}
+
+MediaRecorder::MediaRecorder(AudioNode& aSrcAudioNode,
+ uint32_t aSrcOutput,
+ nsPIDOMWindowInner* aOwnerWindow)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mState(RecordingState::Inactive)
+{
+ MOZ_ASSERT(aOwnerWindow);
+ MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
+
+ // Only AudioNodeStream of kind EXTERNAL_STREAM stores output audio data in
+ // the track (see AudioNodeStream::AdvanceOutputSegment()). That means track
+ // union stream in recorder session won't be able to copy data from the
+ // stream of non-destination node. Create a pipe stream in this case.
+ if (aSrcAudioNode.NumberOfOutputs() > 0) {
+ AudioContext* ctx = aSrcAudioNode.Context();
+ AudioNodeEngine* engine = new AudioNodeEngine(nullptr);
+ AudioNodeStream::Flags flags =
+ AudioNodeStream::EXTERNAL_OUTPUT |
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED;
+ mPipeStream = AudioNodeStream::Create(ctx, engine, flags, ctx->Graph());
+ AudioNodeStream* ns = aSrcAudioNode.GetStream();
+ if (ns) {
+ mInputPort =
+ mPipeStream->AllocateInputPort(aSrcAudioNode.GetStream(),
+ TRACK_ANY, TRACK_ANY,
+ 0, aSrcOutput);
+ }
+ }
+ mAudioNode = &aSrcAudioNode;
+
+ RegisterActivityObserver();
+}
+
+void
+MediaRecorder::RegisterActivityObserver()
+{
+ if (nsPIDOMWindowInner* window = GetOwner()) {
+ mDocument = window->GetExtantDoc();
+ if (mDocument) {
+ mDocument->RegisterActivityObserver(
+ NS_ISUPPORTS_CAST(nsIDocumentActivity*, this));
+ }
+ }
+}
+
+void
+MediaRecorder::UnRegisterActivityObserver()
+{
+ if (mDocument) {
+ mDocument->UnregisterActivityObserver(
+ NS_ISUPPORTS_CAST(nsIDocumentActivity*, this));
+ }
+}
+
+void
+MediaRecorder::SetMimeType(const nsString &aMimeType)
+{
+ mMimeType = aMimeType;
+}
+
+void
+MediaRecorder::GetMimeType(nsString &aMimeType)
+{
+ aMimeType = mMimeType;
+}
+
+void
+MediaRecorder::Start(const Optional<int32_t>& aTimeSlice, ErrorResult& aResult)
+{
+ LOG(LogLevel::Debug, ("MediaRecorder.Start %p", this));
+ if (mState != RecordingState::Inactive) {
+ aResult.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (GetSourceMediaStream()->IsFinished() || GetSourceMediaStream()->IsDestroyed()) {
+ aResult.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ nsTArray<RefPtr<MediaStreamTrack>> tracks;
+ if (mDOMStream) {
+ mDOMStream->GetTracks(tracks);
+ }
+ if (!tracks.IsEmpty()) {
+ // If there are tracks already available that we're not allowed
+ // to record, we should throw a security error.
+ bool subsumes = false;
+ nsPIDOMWindowInner* window;
+ nsIDocument* doc;
+ if (!(window = GetOwner()) ||
+ !(doc = window->GetExtantDoc()) ||
+ NS_FAILED(doc->NodePrincipal()->Subsumes(
+ mDOMStream->GetPrincipal(), &subsumes)) ||
+ !subsumes) {
+ aResult.Throw(NS_ERROR_DOM_SECURITY_ERR);
+ return;
+ }
+ }
+
+ int32_t timeSlice = 0;
+ if (aTimeSlice.WasPassed()) {
+ if (aTimeSlice.Value() < 0) {
+ aResult.Throw(NS_ERROR_INVALID_ARG);
+ return;
+ }
+
+ timeSlice = aTimeSlice.Value();
+ }
+ MediaRecorderReporter::AddMediaRecorder(this);
+ mState = RecordingState::Recording;
+ // Start a session.
+ mSessions.AppendElement();
+ mSessions.LastElement() = new Session(this, timeSlice);
+ mSessions.LastElement()->Start();
+}
+
+void
+MediaRecorder::Stop(ErrorResult& aResult)
+{
+ LOG(LogLevel::Debug, ("MediaRecorder.Stop %p", this));
+ MediaRecorderReporter::RemoveMediaRecorder(this);
+ if (mState == RecordingState::Inactive) {
+ aResult.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ mState = RecordingState::Inactive;
+ MOZ_ASSERT(mSessions.Length() > 0);
+ mSessions.LastElement()->Stop();
+}
+
+void
+MediaRecorder::Pause(ErrorResult& aResult)
+{
+ LOG(LogLevel::Debug, ("MediaRecorder.Pause"));
+ if (mState != RecordingState::Recording) {
+ aResult.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ MOZ_ASSERT(mSessions.Length() > 0);
+ nsresult rv = mSessions.LastElement()->Pause();
+ if (NS_FAILED(rv)) {
+ NotifyError(rv);
+ return;
+ }
+ mState = RecordingState::Paused;
+}
+
+void
+MediaRecorder::Resume(ErrorResult& aResult)
+{
+ LOG(LogLevel::Debug, ("MediaRecorder.Resume"));
+ if (mState != RecordingState::Paused) {
+ aResult.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ MOZ_ASSERT(mSessions.Length() > 0);
+ nsresult rv = mSessions.LastElement()->Resume();
+ if (NS_FAILED(rv)) {
+ NotifyError(rv);
+ return;
+ }
+ mState = RecordingState::Recording;
+}
+
+void
+MediaRecorder::RequestData(ErrorResult& aResult)
+{
+ if (mState != RecordingState::Recording) {
+ aResult.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ MOZ_ASSERT(mSessions.Length() > 0);
+ nsresult rv = mSessions.LastElement()->RequestData();
+ if (NS_FAILED(rv)) {
+ NotifyError(rv);
+ }
+}
+
+JSObject*
+MediaRecorder::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaRecorderBinding::Wrap(aCx, this, aGivenProto);
+}
+
+/* static */ already_AddRefed<MediaRecorder>
+MediaRecorder::Constructor(const GlobalObject& aGlobal,
+ DOMMediaStream& aStream,
+ const MediaRecorderOptions& aInitDict,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> ownerWindow = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!ownerWindow) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ if (!IsTypeSupported(aInitDict.mMimeType)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ RefPtr<MediaRecorder> object = new MediaRecorder(aStream, ownerWindow);
+ object->SetOptions(aInitDict);
+ return object.forget();
+}
+
+/* static */ already_AddRefed<MediaRecorder>
+MediaRecorder::Constructor(const GlobalObject& aGlobal,
+ AudioNode& aSrcAudioNode,
+ uint32_t aSrcOutput,
+ const MediaRecorderOptions& aInitDict,
+ ErrorResult& aRv)
+{
+ // Allow recording from audio node only when pref is on.
+ if (!Preferences::GetBool("media.recorder.audio_node.enabled", false)) {
+ // Pretending that this constructor is not defined.
+ NS_NAMED_LITERAL_STRING(argStr, "Argument 1 of MediaRecorder.constructor");
+ NS_NAMED_LITERAL_STRING(typeStr, "MediaStream");
+ aRv.ThrowTypeError<MSG_DOES_NOT_IMPLEMENT_INTERFACE>(argStr, typeStr);
+ return nullptr;
+ }
+
+ nsCOMPtr<nsPIDOMWindowInner> ownerWindow = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!ownerWindow) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ // aSrcOutput doesn't matter to destination node because it has no output.
+ if (aSrcAudioNode.NumberOfOutputs() > 0 &&
+ aSrcOutput >= aSrcAudioNode.NumberOfOutputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ if (!IsTypeSupported(aInitDict.mMimeType)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ RefPtr<MediaRecorder> object = new MediaRecorder(aSrcAudioNode,
+ aSrcOutput,
+ ownerWindow);
+ object->SetOptions(aInitDict);
+ return object.forget();
+}
+
+void
+MediaRecorder::SetOptions(const MediaRecorderOptions& aInitDict)
+{
+ SetMimeType(aInitDict.mMimeType);
+ mAudioBitsPerSecond = aInitDict.mAudioBitsPerSecond.WasPassed() ?
+ aInitDict.mAudioBitsPerSecond.Value() : 0;
+ mVideoBitsPerSecond = aInitDict.mVideoBitsPerSecond.WasPassed() ?
+ aInitDict.mVideoBitsPerSecond.Value() : 0;
+ mBitsPerSecond = aInitDict.mBitsPerSecond.WasPassed() ?
+ aInitDict.mBitsPerSecond.Value() : 0;
+ // We're not handling dynamic changes yet. Eventually we'll handle
+ // setting audio, video and/or total -- and anything that isn't set,
+ // we'll derive. Calculated versions require querying bitrates after
+ // the encoder is Init()ed. This happens only after data is
+ // available and thus requires dynamic changes.
+ //
+ // Until dynamic changes are supported, I prefer to be safe and err
+ // slightly high
+ if (aInitDict.mBitsPerSecond.WasPassed() && !aInitDict.mVideoBitsPerSecond.WasPassed()) {
+ mVideoBitsPerSecond = mBitsPerSecond;
+ }
+}
+
+static char const *const gWebMAudioEncoderCodecs[2] = {
+ "opus",
+ // no VP9 yet
+ nullptr,
+};
+static char const *const gWebMVideoEncoderCodecs[4] = {
+ "opus",
+ "vp8",
+ "vp8.0",
+ // no VP9 yet
+ nullptr,
+};
+static char const *const gOggAudioEncoderCodecs[2] = {
+ "opus",
+ // we could support vorbis here too, but don't
+ nullptr,
+};
+
+template <class String>
+static bool
+CodecListContains(char const *const * aCodecs, const String& aCodec)
+{
+ for (int32_t i = 0; aCodecs[i]; ++i) {
+ if (aCodec.EqualsASCII(aCodecs[i]))
+ return true;
+ }
+ return false;
+}
+
+/* static */
+bool
+MediaRecorder::IsTypeSupported(GlobalObject& aGlobal, const nsAString& aMIMEType)
+{
+ return IsTypeSupported(aMIMEType);
+}
+
+/* static */
+bool
+MediaRecorder::IsTypeSupported(const nsAString& aMIMEType)
+{
+ char const* const* codeclist = nullptr;
+
+ if (aMIMEType.IsEmpty()) {
+ return true;
+ }
+
+ nsContentTypeParser parser(aMIMEType);
+ nsAutoString mimeType;
+ nsresult rv = parser.GetType(mimeType);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ // effectively a 'switch (mimeType) {'
+ if (mimeType.EqualsLiteral(AUDIO_OGG)) {
+ if (MediaDecoder::IsOggEnabled() && MediaDecoder::IsOpusEnabled()) {
+ codeclist = gOggAudioEncoderCodecs;
+ }
+ }
+#ifdef MOZ_WEBM_ENCODER
+ else if (mimeType.EqualsLiteral(VIDEO_WEBM) &&
+ MediaEncoder::IsWebMEncoderEnabled()) {
+ codeclist = gWebMVideoEncoderCodecs;
+ }
+#endif
+
+ // codecs don't matter if we don't support the container
+ if (!codeclist) {
+ return false;
+ }
+ // now filter on codecs, and if needed rescind support
+ nsAutoString codecstring;
+ rv = parser.GetParameter("codecs", codecstring);
+
+ nsTArray<nsString> codecs;
+ if (!ParseCodecsString(codecstring, codecs)) {
+ return false;
+ }
+ for (const nsString& codec : codecs) {
+ if (!CodecListContains(codeclist, codec)) {
+ // Totally unsupported codec
+ return false;
+ }
+ }
+
+ return true;
+}
+
+nsresult
+MediaRecorder::CreateAndDispatchBlobEvent(already_AddRefed<nsIDOMBlob>&& aBlob)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Not running on main thread");
+
+ BlobEventInit init;
+ init.mBubbles = false;
+ init.mCancelable = false;
+
+ nsCOMPtr<nsIDOMBlob> blob = aBlob;
+ init.mData = static_cast<Blob*>(blob.get());
+
+ RefPtr<BlobEvent> event =
+ BlobEvent::Constructor(this,
+ NS_LITERAL_STRING("dataavailable"),
+ init);
+ event->SetTrusted(true);
+ return DispatchDOMEvent(nullptr, event, nullptr, nullptr);
+}
+
+void
+MediaRecorder::DispatchSimpleEvent(const nsAString & aStr)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Not running on main thread");
+ nsresult rv = CheckInnerWindowCorrectness();
+ if (NS_FAILED(rv)) {
+ return;
+ }
+
+ RefPtr<Event> event = NS_NewDOMEvent(this, nullptr, nullptr);
+ event->InitEvent(aStr, false, false);
+ event->SetTrusted(true);
+
+ rv = DispatchDOMEvent(nullptr, event, nullptr, nullptr);
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Failed to dispatch the event!!!");
+ return;
+ }
+}
+
+void
+MediaRecorder::NotifyError(nsresult aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Not running on main thread");
+ nsresult rv = CheckInnerWindowCorrectness();
+ if (NS_FAILED(rv)) {
+ return;
+ }
+ nsString errorMsg;
+ switch (aRv) {
+ case NS_ERROR_DOM_SECURITY_ERR:
+ errorMsg = NS_LITERAL_STRING("SecurityError");
+ break;
+ case NS_ERROR_OUT_OF_MEMORY:
+ errorMsg = NS_LITERAL_STRING("OutOfMemoryError");
+ break;
+ default:
+ errorMsg = NS_LITERAL_STRING("GenericError");
+ }
+
+ RecordErrorEventInit init;
+ init.mBubbles = false;
+ init.mCancelable = false;
+ init.mName = errorMsg;
+
+ RefPtr<RecordErrorEvent> event =
+ RecordErrorEvent::Constructor(this, NS_LITERAL_STRING("error"), init);
+ event->SetTrusted(true);
+
+ rv = DispatchDOMEvent(nullptr, event, nullptr, nullptr);
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Failed to dispatch the error event!!!");
+ return;
+ }
+ return;
+}
+
+void
+MediaRecorder::RemoveSession(Session* aSession)
+{
+ LOG(LogLevel::Debug, ("MediaRecorder.RemoveSession (%p)", aSession));
+ mSessions.RemoveElement(aSession);
+}
+
+void
+MediaRecorder::NotifyOwnerDocumentActivityChanged()
+{
+ nsPIDOMWindowInner* window = GetOwner();
+ NS_ENSURE_TRUE_VOID(window);
+ nsIDocument* doc = window->GetExtantDoc();
+ NS_ENSURE_TRUE_VOID(doc);
+
+ LOG(LogLevel::Debug, ("MediaRecorder %p document IsActive %d isVisible %d\n",
+ this, doc->IsActive(), doc->IsVisible()));
+ if (!doc->IsActive() || !doc->IsVisible()) {
+ // Stop the session.
+ ErrorResult result;
+ Stop(result);
+ result.SuppressException();
+ }
+}
+
+MediaStream*
+MediaRecorder::GetSourceMediaStream()
+{
+ if (mDOMStream != nullptr) {
+ return mDOMStream->GetPlaybackStream();
+ }
+ MOZ_ASSERT(mAudioNode != nullptr);
+ return mPipeStream ? mPipeStream.get() : mAudioNode->GetStream();
+}
+
+size_t
+MediaRecorder::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 42;
+ for (size_t i = 0; i < mSessions.Length(); ++i) {
+ amount += mSessions[i]->SizeOfExcludingThis(aMallocSizeOf);
+ }
+ return amount;
+}
+
+StaticRefPtr<MediaRecorderReporter> MediaRecorderReporter::sUniqueInstance;
+
+MediaRecorderReporter* MediaRecorderReporter::UniqueInstance()
+{
+ if (!sUniqueInstance) {
+ sUniqueInstance = new MediaRecorderReporter();
+ sUniqueInstance->InitMemoryReporter();
+ }
+ return sUniqueInstance;
+ }
+
+void MediaRecorderReporter::InitMemoryReporter()
+{
+ RegisterWeakMemoryReporter(this);
+}
+
+MediaRecorderReporter::~MediaRecorderReporter()
+{
+ UnregisterWeakMemoryReporter(this);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaRecorder.h b/dom/media/MediaRecorder.h
new file mode 100644
index 000000000..0edc7ca58
--- /dev/null
+++ b/dom/media/MediaRecorder.h
@@ -0,0 +1,171 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaRecorder_h
+#define MediaRecorder_h
+
+#include "mozilla/dom/MediaRecorderBinding.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/MemoryReporting.h"
+#include "nsIDocumentActivity.h"
+
+// Max size for allowing queue encoded data in memory
+#define MAX_ALLOW_MEMORY_BUFFER 1024000
+namespace mozilla {
+
+class AudioNodeStream;
+class DOMMediaStream;
+class ErrorResult;
+class MediaInputPort;
+struct MediaRecorderOptions;
+class MediaStream;
+class GlobalObject;
+
+namespace dom {
+
+class AudioNode;
+
+/**
+ * Implementation of https://dvcs.w3.org/hg/dap/raw-file/default/media-stream-capture/MediaRecorder.html
+ * The MediaRecorder accepts a mediaStream as input source passed from UA. When recorder starts,
+ * a MediaEncoder will be created and accept the mediaStream as input source.
+ * Encoder will get the raw data by track data changes, encode it by selected MIME Type, then store the encoded in EncodedBufferCache object.
+ * The encoded data will be extracted on every timeslice passed from Start function call or by RequestData function.
+ * Thread model:
+ * When the recorder starts, it creates a "Media Encoder" thread to read data from MediaEncoder object and store buffer in EncodedBufferCache object.
+ * Also extract the encoded data and create blobs on every timeslice passed from start function or RequestData function called by UA.
+ */
+
+class MediaRecorder final : public DOMEventTargetHelper,
+ public nsIDocumentActivity
+{
+ class Session;
+
+public:
+ MediaRecorder(DOMMediaStream& aSourceMediaStream,
+ nsPIDOMWindowInner* aOwnerWindow);
+ MediaRecorder(AudioNode& aSrcAudioNode, uint32_t aSrcOutput,
+ nsPIDOMWindowInner* aOwnerWindow);
+
+ // nsWrapperCache
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ nsPIDOMWindowInner* GetParentObject() { return GetOwner(); }
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaRecorder,
+ DOMEventTargetHelper)
+
+ // WebIDL
+ // Start recording. If timeSlice has been provided, mediaRecorder will
+ // raise a dataavailable event containing the Blob of collected data on every timeSlice milliseconds.
+ // If timeSlice isn't provided, UA should call the RequestData to obtain the Blob data, also set the mTimeSlice to zero.
+ void Start(const Optional<int32_t>& timeSlice, ErrorResult & aResult);
+ // Stop the recording activiy. Including stop the Media Encoder thread, un-hook the mediaStreamListener to encoder.
+ void Stop(ErrorResult& aResult);
+ // Pause the mTrackUnionStream
+ void Pause(ErrorResult& aResult);
+
+ void Resume(ErrorResult& aResult);
+ // Extract encoded data Blob from EncodedBufferCache.
+ void RequestData(ErrorResult& aResult);
+ // Return the The DOMMediaStream passed from UA.
+ DOMMediaStream* Stream() const { return mDOMStream; }
+ // The current state of the MediaRecorder object.
+ RecordingState State() const { return mState; }
+ // Return the current encoding MIME type selected by the MediaEncoder.
+ void GetMimeType(nsString &aMimeType);
+
+ static bool IsTypeSupported(GlobalObject& aGlobal, const nsAString& aType);
+ static bool IsTypeSupported(const nsAString& aType);
+
+ // Construct a recorder with a DOM media stream object as its source.
+ static already_AddRefed<MediaRecorder>
+ Constructor(const GlobalObject& aGlobal,
+ DOMMediaStream& aStream,
+ const MediaRecorderOptions& aInitDict,
+ ErrorResult& aRv);
+ // Construct a recorder with a Web Audio destination node as its source.
+ static already_AddRefed<MediaRecorder>
+ Constructor(const GlobalObject& aGlobal,
+ AudioNode& aSrcAudioNode,
+ uint32_t aSrcOutput,
+ const MediaRecorderOptions& aInitDict,
+ ErrorResult& aRv);
+
+ /*
+ * Measure the size of the buffer, and memory occupied by mAudioEncoder
+ * and mVideoEncoder
+ */
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+ // EventHandler
+ IMPL_EVENT_HANDLER(dataavailable)
+ IMPL_EVENT_HANDLER(error)
+ IMPL_EVENT_HANDLER(start)
+ IMPL_EVENT_HANDLER(stop)
+ IMPL_EVENT_HANDLER(warning)
+
+ NS_DECL_NSIDOCUMENTACTIVITY
+
+ uint32_t GetAudioBitrate() { return mAudioBitsPerSecond; }
+ uint32_t GetVideoBitrate() { return mVideoBitsPerSecond; }
+ uint32_t GetBitrate() { return mBitsPerSecond; }
+protected:
+ virtual ~MediaRecorder();
+
+ MediaRecorder& operator = (const MediaRecorder& x) = delete;
+ // Create dataavailable event with Blob data and it runs in main thread
+ nsresult CreateAndDispatchBlobEvent(already_AddRefed<nsIDOMBlob>&& aBlob);
+ // Creating a simple event to notify UA simple event.
+ void DispatchSimpleEvent(const nsAString & aStr);
+ // Creating a error event with message.
+ void NotifyError(nsresult aRv);
+ // Set encoded MIME type.
+ void SetMimeType(const nsString &aMimeType);
+ void SetOptions(const MediaRecorderOptions& aInitDict);
+
+ MediaRecorder(const MediaRecorder& x) = delete; // prevent bad usage
+ // Remove session pointer.
+ void RemoveSession(Session* aSession);
+ // Functions for Session to query input source info.
+ MediaStream* GetSourceMediaStream();
+ // DOM wrapper for source media stream. Will be null when input is audio node.
+ RefPtr<DOMMediaStream> mDOMStream;
+ // Source audio node. Will be null when input is a media stream.
+ RefPtr<AudioNode> mAudioNode;
+ // Pipe stream connecting non-destination source node and session track union
+ // stream of recorder. Will be null when input is media stream or destination
+ // node.
+ RefPtr<AudioNodeStream> mPipeStream;
+ // Connect source node to the pipe stream.
+ RefPtr<MediaInputPort> mInputPort;
+
+ // The current state of the MediaRecorder object.
+ RecordingState mState;
+ // Hold the sessions reference and clean it when the DestroyRunnable for a
+ // session is running.
+ nsTArray<RefPtr<Session> > mSessions;
+
+ nsCOMPtr<nsIDocument> mDocument;
+
+ // It specifies the container format as well as the audio and video capture formats.
+ nsString mMimeType;
+
+ uint32_t mAudioBitsPerSecond;
+ uint32_t mVideoBitsPerSecond;
+ uint32_t mBitsPerSecond;
+private:
+ // Register MediaRecorder into Document to listen the activity changes.
+ void RegisterActivityObserver();
+ void UnRegisterActivityObserver();
+
+ bool CheckPermission(const nsString &aType);
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaResource.cpp b/dom/media/MediaResource.cpp
new file mode 100644
index 000000000..d36783be7
--- /dev/null
+++ b/dom/media/MediaResource.cpp
@@ -0,0 +1,1648 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/DebugOnly.h"
+
+#include "MediaResource.h"
+#include "MediaResourceCallback.h"
+
+#include "mozilla/Mutex.h"
+#include "nsDebug.h"
+#include "nsNetUtil.h"
+#include "nsThreadUtils.h"
+#include "nsIFile.h"
+#include "nsIFileChannel.h"
+#include "nsIFileStreams.h"
+#include "nsIHttpChannel.h"
+#include "nsISeekableStream.h"
+#include "nsIInputStream.h"
+#include "nsIRequestObserver.h"
+#include "nsIStreamListener.h"
+#include "nsIScriptSecurityManager.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "nsError.h"
+#include "nsICachingChannel.h"
+#include "nsIAsyncVerifyRedirectCallback.h"
+#include "nsContentUtils.h"
+#include "nsHostObjectProtocolHandler.h"
+#include <algorithm>
+#include "nsProxyRelease.h"
+#include "nsIContentPolicy.h"
+
+using mozilla::media::TimeUnit;
+
+mozilla::LazyLogModule gMediaResourceLog("MediaResource");
+#define RESOURCE_LOG(msg, ...) MOZ_LOG(gMediaResourceLog, mozilla::LogLevel::Debug, \
+ (msg, ##__VA_ARGS__))
+// Debug logging macro with object pointer and class name.
+#define CMLOG(msg, ...) \
+ RESOURCE_LOG("%p [ChannelMediaResource]: " msg, this, ##__VA_ARGS__)
+
+static const uint32_t HTTP_OK_CODE = 200;
+static const uint32_t HTTP_PARTIAL_RESPONSE_CODE = 206;
+
+namespace mozilla {
+
+void
+MediaResource::Destroy()
+{
+ // Ensures we only delete the MediaResource on the main thread.
+ if (NS_IsMainThread()) {
+ delete this;
+ return;
+ }
+ MOZ_ALWAYS_SUCCEEDS(
+ NS_DispatchToMainThread(NewNonOwningRunnableMethod(this, &MediaResource::Destroy)));
+}
+
+NS_IMPL_ADDREF(MediaResource)
+NS_IMPL_RELEASE_WITH_DESTROY(MediaResource, Destroy())
+NS_IMPL_QUERY_INTERFACE0(MediaResource)
+
+ChannelMediaResource::ChannelMediaResource(MediaResourceCallback* aCallback,
+ nsIChannel* aChannel,
+ nsIURI* aURI,
+ const nsACString& aContentType)
+ : BaseMediaResource(aCallback, aChannel, aURI, aContentType),
+ mOffset(0),
+ mReopenOnError(false),
+ mIgnoreClose(false),
+ mCacheStream(this),
+ mLock("ChannelMediaResource.mLock"),
+ mIgnoreResume(false),
+ mSuspendAgent(mChannel)
+{
+}
+
+ChannelMediaResource::~ChannelMediaResource()
+{
+ if (mListener) {
+ // Kill its reference to us since we're going away
+ mListener->Revoke();
+ }
+}
+
+// ChannelMediaResource::Listener just observes the channel and
+// forwards notifications to the ChannelMediaResource. We use multiple
+// listener objects so that when we open a new stream for a seek we can
+// disconnect the old listener from the ChannelMediaResource and hook up
+// a new listener, so notifications from the old channel are discarded
+// and don't confuse us.
+NS_IMPL_ISUPPORTS(ChannelMediaResource::Listener,
+ nsIRequestObserver, nsIStreamListener, nsIChannelEventSink,
+ nsIInterfaceRequestor)
+
+nsresult
+ChannelMediaResource::Listener::OnStartRequest(nsIRequest* aRequest,
+ nsISupports* aContext)
+{
+ if (!mResource)
+ return NS_OK;
+ return mResource->OnStartRequest(aRequest);
+}
+
+nsresult
+ChannelMediaResource::Listener::OnStopRequest(nsIRequest* aRequest,
+ nsISupports* aContext,
+ nsresult aStatus)
+{
+ if (!mResource)
+ return NS_OK;
+ return mResource->OnStopRequest(aRequest, aStatus);
+}
+
+nsresult
+ChannelMediaResource::Listener::OnDataAvailable(nsIRequest* aRequest,
+ nsISupports* aContext,
+ nsIInputStream* aStream,
+ uint64_t aOffset,
+ uint32_t aCount)
+{
+ if (!mResource)
+ return NS_OK;
+ return mResource->OnDataAvailable(aRequest, aStream, aCount);
+}
+
+nsresult
+ChannelMediaResource::Listener::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
+ nsIChannel* aNewChannel,
+ uint32_t aFlags,
+ nsIAsyncVerifyRedirectCallback* cb)
+{
+ nsresult rv = NS_OK;
+ if (mResource)
+ rv = mResource->OnChannelRedirect(aOldChannel, aNewChannel, aFlags);
+
+ if (NS_FAILED(rv))
+ return rv;
+
+ cb->OnRedirectVerifyCallback(NS_OK);
+ return NS_OK;
+}
+
+nsresult
+ChannelMediaResource::Listener::GetInterface(const nsIID & aIID, void **aResult)
+{
+ return QueryInterface(aIID, aResult);
+}
+
+nsresult
+ChannelMediaResource::OnStartRequest(nsIRequest* aRequest)
+{
+ NS_ASSERTION(mChannel.get() == aRequest, "Wrong channel!");
+
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ NS_ENSURE_TRUE(owner, NS_ERROR_FAILURE);
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ NS_ENSURE_TRUE(element, NS_ERROR_FAILURE);
+ nsresult status;
+ nsresult rv = aRequest->GetStatus(&status);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (status == NS_BINDING_ABORTED) {
+ // Request was aborted before we had a chance to receive any data, or
+ // even an OnStartRequest(). Close the channel. This is important, as
+ // we don't want to mess up our state, as if we're cloned that would
+ // cause the clone to copy incorrect metadata (like whether we're
+ // infinite for example).
+ CloseChannel();
+ return status;
+ }
+
+ if (element->ShouldCheckAllowOrigin()) {
+ // If the request was cancelled by nsCORSListenerProxy due to failing
+ // the CORS security check, send an error through to the media element.
+ if (status == NS_ERROR_DOM_BAD_URI) {
+ mCallback->NotifyNetworkError();
+ return NS_ERROR_DOM_BAD_URI;
+ }
+ }
+
+ nsCOMPtr<nsIHttpChannel> hc = do_QueryInterface(aRequest);
+ bool seekable = false;
+ if (hc) {
+ uint32_t responseStatus = 0;
+ hc->GetResponseStatus(&responseStatus);
+ bool succeeded = false;
+ hc->GetRequestSucceeded(&succeeded);
+
+ if (!succeeded && NS_SUCCEEDED(status)) {
+ // HTTP-level error (e.g. 4xx); treat this as a fatal network-level error.
+ // We might get this on a seek.
+ // (Note that lower-level errors indicated by NS_FAILED(status) are
+ // handled in OnStopRequest.)
+ // A 416 error should treated as EOF here... it's possible
+ // that we don't get Content-Length, we read N bytes, then we
+ // suspend and resume, the resume reopens the channel and we seek to
+ // offset N, but there are no more bytes, so we get a 416
+ // "Requested Range Not Satisfiable".
+ if (responseStatus == HTTP_REQUESTED_RANGE_NOT_SATISFIABLE_CODE) {
+ // OnStopRequest will not be fired, so we need to do some of its
+ // work here.
+ mCacheStream.NotifyDataEnded(status);
+ } else {
+ mCallback->NotifyNetworkError();
+ }
+
+ // This disconnects our listener so we don't get any more data. We
+ // certainly don't want an error page to end up in our cache!
+ CloseChannel();
+ return NS_OK;
+ }
+
+ nsAutoCString ranges;
+ hc->GetResponseHeader(NS_LITERAL_CSTRING("Accept-Ranges"),
+ ranges);
+ bool acceptsRanges = ranges.EqualsLiteral("bytes");
+ // True if this channel will not return an unbounded amount of data
+ bool dataIsBounded = false;
+
+ int64_t contentLength = -1;
+ hc->GetContentLength(&contentLength);
+ if (contentLength >= 0 &&
+ (responseStatus == HTTP_OK_CODE ||
+ responseStatus == HTTP_PARTIAL_RESPONSE_CODE)) {
+ // "OK" status means Content-Length is for the whole resource.
+ // Since that's bounded, we know we have a finite-length resource.
+ dataIsBounded = true;
+ }
+
+ // Assume Range requests have a bounded upper limit unless the
+ // Content-Range header tells us otherwise.
+ bool boundedSeekLimit = true;
+ // Check response code for byte-range requests (seeking, chunk requests).
+ if (responseStatus == HTTP_PARTIAL_RESPONSE_CODE) {
+ // Parse Content-Range header.
+ int64_t rangeStart = 0;
+ int64_t rangeEnd = 0;
+ int64_t rangeTotal = 0;
+ rv = ParseContentRangeHeader(hc, rangeStart, rangeEnd, rangeTotal);
+
+ // We received 'Content-Range', so the server accepts range requests.
+ bool gotRangeHeader = NS_SUCCEEDED(rv);
+
+ if (gotRangeHeader) {
+ // We received 'Content-Range', so the server accepts range requests.
+ // Notify media cache about the length and start offset of data received.
+ // Note: If aRangeTotal == -1, then the total bytes is unknown at this stage.
+ // For now, tell the decoder that the stream is infinite.
+ if (rangeTotal == -1) {
+ boundedSeekLimit = false;
+ } else {
+ contentLength = std::max(contentLength, rangeTotal);
+ }
+ // Give some warnings if the ranges are unexpected.
+ // XXX These could be error conditions.
+ NS_WARNING_ASSERTION(
+ mOffset == rangeStart,
+ "response range start does not match current offset");
+ mOffset = rangeStart;
+ mCacheStream.NotifyDataStarted(rangeStart);
+ }
+ acceptsRanges = gotRangeHeader;
+ } else if (mOffset > 0 && responseStatus == HTTP_OK_CODE) {
+ // If we get an OK response but we were seeking, or requesting a byte
+ // range, then we have to assume that seeking doesn't work. We also need
+ // to tell the cache that it's getting data for the start of the stream.
+ mCacheStream.NotifyDataStarted(0);
+ mOffset = 0;
+
+ // The server claimed it supported range requests. It lied.
+ acceptsRanges = false;
+ }
+ if (mOffset == 0 && contentLength >= 0 &&
+ (responseStatus == HTTP_OK_CODE ||
+ responseStatus == HTTP_PARTIAL_RESPONSE_CODE)) {
+ mCacheStream.NotifyDataLength(contentLength);
+ }
+ // XXX we probably should examine the Content-Range header in case
+ // the server gave us a range which is not quite what we asked for
+
+ // If we get an HTTP_OK_CODE response to our byte range request,
+ // and the server isn't sending Accept-Ranges:bytes then we don't
+ // support seeking.
+ seekable = acceptsRanges;
+ if (seekable && boundedSeekLimit) {
+ // If range requests are supported, and we did not see an unbounded
+ // upper range limit, we assume the resource is bounded.
+ dataIsBounded = true;
+ }
+
+ mCallback->SetInfinite(!dataIsBounded);
+ }
+ mCacheStream.SetTransportSeekable(seekable);
+
+ {
+ MutexAutoLock lock(mLock);
+ mChannelStatistics->Start();
+ }
+
+ mReopenOnError = false;
+ mIgnoreClose = false;
+
+ mSuspendAgent.UpdateSuspendedStatusIfNeeded();
+
+ // Fires an initial progress event.
+ owner->DownloadProgressed();
+
+ return NS_OK;
+}
+
+bool
+ChannelMediaResource::IsTransportSeekable()
+{
+ return mCacheStream.IsTransportSeekable();
+}
+
+nsresult
+ChannelMediaResource::ParseContentRangeHeader(nsIHttpChannel * aHttpChan,
+ int64_t& aRangeStart,
+ int64_t& aRangeEnd,
+ int64_t& aRangeTotal)
+{
+ NS_ENSURE_ARG(aHttpChan);
+
+ nsAutoCString rangeStr;
+ nsresult rv = aHttpChan->GetResponseHeader(NS_LITERAL_CSTRING("Content-Range"),
+ rangeStr);
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_FALSE(rangeStr.IsEmpty(), NS_ERROR_ILLEGAL_VALUE);
+
+ // Parse the range header: e.g. Content-Range: bytes 7000-7999/8000.
+ int32_t spacePos = rangeStr.Find(NS_LITERAL_CSTRING(" "));
+ int32_t dashPos = rangeStr.Find(NS_LITERAL_CSTRING("-"), true, spacePos);
+ int32_t slashPos = rangeStr.Find(NS_LITERAL_CSTRING("/"), true, dashPos);
+
+ nsAutoCString aRangeStartText;
+ rangeStr.Mid(aRangeStartText, spacePos+1, dashPos-(spacePos+1));
+ aRangeStart = aRangeStartText.ToInteger64(&rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_TRUE(0 <= aRangeStart, NS_ERROR_ILLEGAL_VALUE);
+
+ nsAutoCString aRangeEndText;
+ rangeStr.Mid(aRangeEndText, dashPos+1, slashPos-(dashPos+1));
+ aRangeEnd = aRangeEndText.ToInteger64(&rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+ NS_ENSURE_TRUE(aRangeStart < aRangeEnd, NS_ERROR_ILLEGAL_VALUE);
+
+ nsAutoCString aRangeTotalText;
+ rangeStr.Right(aRangeTotalText, rangeStr.Length()-(slashPos+1));
+ if (aRangeTotalText[0] == '*') {
+ aRangeTotal = -1;
+ } else {
+ aRangeTotal = aRangeTotalText.ToInteger64(&rv);
+ NS_ENSURE_TRUE(aRangeEnd < aRangeTotal, NS_ERROR_ILLEGAL_VALUE);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ CMLOG("Received bytes [%lld] to [%lld] of [%lld] for decoder[%p]",
+ aRangeStart, aRangeEnd, aRangeTotal, mCallback.get());
+
+ return NS_OK;
+}
+
+nsresult
+ChannelMediaResource::OnStopRequest(nsIRequest* aRequest, nsresult aStatus)
+{
+ NS_ASSERTION(mChannel.get() == aRequest, "Wrong channel!");
+ NS_ASSERTION(!mSuspendAgent.IsSuspended(),
+ "How can OnStopRequest fire while we're suspended?");
+
+ {
+ MutexAutoLock lock(mLock);
+ mChannelStatistics->Stop();
+ }
+
+ // Note that aStatus might have succeeded --- this might be a normal close
+ // --- even in situations where the server cut us off because we were
+ // suspended. So we need to "reopen on error" in that case too. The only
+ // cases where we don't need to reopen are when *we* closed the stream.
+ // But don't reopen if we need to seek and we don't think we can... that would
+ // cause us to just re-read the stream, which would be really bad.
+ if (mReopenOnError &&
+ aStatus != NS_ERROR_PARSED_DATA_CACHED && aStatus != NS_BINDING_ABORTED &&
+ (mOffset == 0 || mCacheStream.IsTransportSeekable())) {
+ // If the stream did close normally, then if the server is seekable we'll
+ // just seek to the end of the resource and get an HTTP 416 error because
+ // there's nothing there, so this isn't bad.
+ nsresult rv = CacheClientSeek(mOffset, false);
+ if (NS_SUCCEEDED(rv))
+ return rv;
+ // If the reopen/reseek fails, just fall through and treat this
+ // error as fatal.
+ }
+
+ if (!mIgnoreClose) {
+ mCacheStream.NotifyDataEnded(aStatus);
+
+ // Move this request back into the foreground. This is necessary for
+ // requests owned by video documents to ensure the load group fires
+ // OnStopRequest when restoring from session history.
+ nsLoadFlags loadFlags;
+ DebugOnly<nsresult> rv = mChannel->GetLoadFlags(&loadFlags);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "GetLoadFlags() failed!");
+
+ if (loadFlags & nsIRequest::LOAD_BACKGROUND) {
+ ModifyLoadFlags(loadFlags & ~nsIRequest::LOAD_BACKGROUND);
+ }
+ }
+
+ return NS_OK;
+}
+
+nsresult
+ChannelMediaResource::OnChannelRedirect(nsIChannel* aOld, nsIChannel* aNew,
+ uint32_t aFlags)
+{
+ mChannel = aNew;
+ mSuspendAgent.NotifyChannelOpened(mChannel);
+ return SetupChannelHeaders();
+}
+
+struct CopySegmentClosure {
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ ChannelMediaResource* mResource;
+};
+
+nsresult
+ChannelMediaResource::CopySegmentToCache(nsIInputStream *aInStream,
+ void *aClosure,
+ const char *aFromSegment,
+ uint32_t aToOffset,
+ uint32_t aCount,
+ uint32_t *aWriteCount)
+{
+ CopySegmentClosure* closure = static_cast<CopySegmentClosure*>(aClosure);
+
+ closure->mResource->mCallback->NotifyDataArrived();
+
+ // Keep track of where we're up to.
+ RESOURCE_LOG("%p [ChannelMediaResource]: CopySegmentToCache at mOffset [%lld] add "
+ "[%d] bytes for decoder[%p]",
+ closure->mResource, closure->mResource->mOffset, aCount,
+ closure->mResource->mCallback.get());
+ closure->mResource->mOffset += aCount;
+
+ closure->mResource->mCacheStream.NotifyDataReceived(aCount, aFromSegment,
+ closure->mPrincipal);
+ *aWriteCount = aCount;
+ return NS_OK;
+}
+
+nsresult
+ChannelMediaResource::OnDataAvailable(nsIRequest* aRequest,
+ nsIInputStream* aStream,
+ uint32_t aCount)
+{
+ NS_ASSERTION(mChannel.get() == aRequest, "Wrong channel!");
+
+ {
+ MutexAutoLock lock(mLock);
+ mChannelStatistics->AddBytes(aCount);
+ }
+
+ CopySegmentClosure closure;
+ nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager();
+ if (secMan && mChannel) {
+ secMan->GetChannelResultPrincipal(mChannel, getter_AddRefs(closure.mPrincipal));
+ }
+ closure.mResource = this;
+
+ uint32_t count = aCount;
+ while (count > 0) {
+ uint32_t read;
+ nsresult rv = aStream->ReadSegments(CopySegmentToCache, &closure, count,
+ &read);
+ if (NS_FAILED(rv))
+ return rv;
+ NS_ASSERTION(read > 0, "Read 0 bytes while data was available?");
+ count -= read;
+ }
+
+ return NS_OK;
+}
+
+nsresult ChannelMediaResource::Open(nsIStreamListener **aStreamListener)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ if (!mChannelStatistics) {
+ mChannelStatistics = new MediaChannelStatistics();
+ }
+
+ nsresult rv = mCacheStream.Init();
+ if (NS_FAILED(rv))
+ return rv;
+ NS_ASSERTION(mOffset == 0, "Who set mOffset already?");
+
+ if (!mChannel) {
+ // When we're a clone, the decoder might ask us to Open even though
+ // we haven't established an mChannel (because we might not need one)
+ NS_ASSERTION(!aStreamListener,
+ "Should have already been given a channel if we're to return a stream listener");
+ return NS_OK;
+ }
+
+ return OpenChannel(aStreamListener);
+}
+
+nsresult ChannelMediaResource::OpenChannel(nsIStreamListener** aStreamListener)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ NS_ENSURE_TRUE(mChannel, NS_ERROR_NULL_POINTER);
+ NS_ASSERTION(!mListener, "Listener should have been removed by now");
+
+ if (aStreamListener) {
+ *aStreamListener = nullptr;
+ }
+
+ // Set the content length, if it's available as an HTTP header.
+ // This ensures that MediaResource wrapping objects for platform libraries
+ // that expect to know the length of a resource can get it before
+ // OnStartRequest() fires.
+ nsCOMPtr<nsIHttpChannel> hc = do_QueryInterface(mChannel);
+ if (hc) {
+ int64_t cl = -1;
+ if (NS_SUCCEEDED(hc->GetContentLength(&cl)) && cl != -1) {
+ mCacheStream.NotifyDataLength(cl);
+ }
+ }
+
+ mListener = new Listener(this);
+ if (aStreamListener) {
+ *aStreamListener = mListener;
+ NS_ADDREF(*aStreamListener);
+ } else {
+ nsresult rv = mChannel->SetNotificationCallbacks(mListener.get());
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = SetupChannelHeaders();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = mChannel->AsyncOpen2(mListener);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Tell the media element that we are fetching data from a channel.
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ NS_ENSURE_TRUE(owner, NS_ERROR_FAILURE);
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ element->DownloadResumed(true);
+ }
+
+ return NS_OK;
+}
+
+nsresult ChannelMediaResource::SetupChannelHeaders()
+{
+ // Always use a byte range request even if we're reading from the start
+ // of the resource.
+ // This enables us to detect if the stream supports byte range
+ // requests, and therefore seeking, early.
+ nsCOMPtr<nsIHttpChannel> hc = do_QueryInterface(mChannel);
+ if (hc) {
+ // Use |mOffset| if seeking in a complete file download.
+ nsAutoCString rangeString("bytes=");
+ rangeString.AppendInt(mOffset);
+ rangeString.Append('-');
+ nsresult rv = hc->SetRequestHeader(NS_LITERAL_CSTRING("Range"), rangeString, false);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Send Accept header for video and audio types only (Bug 489071)
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ NS_ENSURE_TRUE(owner, NS_ERROR_FAILURE);
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ NS_ENSURE_TRUE(element, NS_ERROR_FAILURE);
+ element->SetRequestHeaders(hc);
+ } else {
+ NS_ASSERTION(mOffset == 0, "Don't know how to seek on this channel type");
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+nsresult ChannelMediaResource::Close()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ mCacheStream.Close();
+ CloseChannel();
+ return NS_OK;
+}
+
+already_AddRefed<nsIPrincipal> ChannelMediaResource::GetCurrentPrincipal()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ nsCOMPtr<nsIPrincipal> principal = mCacheStream.GetCurrentPrincipal();
+ return principal.forget();
+}
+
+bool ChannelMediaResource::CanClone()
+{
+ return mCacheStream.IsAvailableForSharing();
+}
+
+already_AddRefed<MediaResource> ChannelMediaResource::CloneData(MediaResourceCallback* aCallback)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+ NS_ASSERTION(mCacheStream.IsAvailableForSharing(), "Stream can't be cloned");
+
+ RefPtr<ChannelMediaResource> resource =
+ new ChannelMediaResource(aCallback,
+ nullptr,
+ mURI,
+ GetContentType());
+ if (resource) {
+ // Initially the clone is treated as suspended by the cache, because
+ // we don't have a channel. If the cache needs to read data from the clone
+ // it will call CacheClientResume (or CacheClientSeek with aResume true)
+ // which will recreate the channel. This way, if all of the media data
+ // is already in the cache we don't create an unnecessary HTTP channel
+ // and perform a useless HTTP transaction.
+ resource->mSuspendAgent.Suspend();
+ resource->mCacheStream.InitAsClone(&mCacheStream);
+ resource->mChannelStatistics = new MediaChannelStatistics(mChannelStatistics);
+ resource->mChannelStatistics->Stop();
+ }
+ return resource.forget();
+}
+
+void ChannelMediaResource::CloseChannel()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ {
+ MutexAutoLock lock(mLock);
+ mChannelStatistics->Stop();
+ }
+
+ if (mListener) {
+ mListener->Revoke();
+ mListener = nullptr;
+ }
+
+ if (mChannel) {
+ mSuspendAgent.NotifyChannelClosing();
+ // The status we use here won't be passed to the decoder, since
+ // we've already revoked the listener. It can however be passed
+ // to nsDocumentViewer::LoadComplete if our channel is the one
+ // that kicked off creation of a video document. We don't want that
+ // document load to think there was an error.
+ // NS_ERROR_PARSED_DATA_CACHED is the best thing we have for that
+ // at the moment.
+ mChannel->Cancel(NS_ERROR_PARSED_DATA_CACHED);
+ mChannel = nullptr;
+ }
+}
+
+nsresult ChannelMediaResource::ReadFromCache(char* aBuffer,
+ int64_t aOffset,
+ uint32_t aCount)
+{
+ return mCacheStream.ReadFromCache(aBuffer, aOffset, aCount);
+}
+
+nsresult ChannelMediaResource::ReadAt(int64_t aOffset,
+ char* aBuffer,
+ uint32_t aCount,
+ uint32_t* aBytes)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ nsresult rv = mCacheStream.ReadAt(aOffset, aBuffer, aCount, aBytes);
+ if (NS_SUCCEEDED(rv)) {
+ DispatchBytesConsumed(*aBytes, aOffset);
+ }
+ return rv;
+}
+
+already_AddRefed<MediaByteBuffer>
+ChannelMediaResource::MediaReadAt(int64_t aOffset, uint32_t aCount)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ RefPtr<MediaByteBuffer> bytes = new MediaByteBuffer();
+ bool ok = bytes->SetLength(aCount, fallible);
+ NS_ENSURE_TRUE(ok, nullptr);
+ char* curr = reinterpret_cast<char*>(bytes->Elements());
+ const char* start = curr;
+ while (aCount > 0) {
+ uint32_t bytesRead;
+ nsresult rv = mCacheStream.ReadAt(aOffset, curr, aCount, &bytesRead);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ if (!bytesRead) {
+ break;
+ }
+ aOffset += bytesRead;
+ aCount -= bytesRead;
+ curr += bytesRead;
+ }
+ bytes->SetLength(curr - start);
+ return bytes.forget();
+}
+
+int64_t ChannelMediaResource::Tell()
+{
+ return mCacheStream.Tell();
+}
+
+nsresult ChannelMediaResource::GetCachedRanges(MediaByteRangeSet& aRanges)
+{
+ return mCacheStream.GetCachedRanges(aRanges);
+}
+
+void ChannelMediaResource::Suspend(bool aCloseImmediately)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ if (!owner) {
+ // Shutting down; do nothing.
+ return;
+ }
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ if (!element) {
+ // Shutting down; do nothing.
+ return;
+ }
+
+ if (mChannel && aCloseImmediately && mCacheStream.IsTransportSeekable()) {
+ // Kill off our channel right now, but don't tell anyone about it.
+ mIgnoreClose = true;
+ CloseChannel();
+ element->DownloadSuspended();
+ }
+
+ if (mSuspendAgent.Suspend()) {
+ if (mChannel) {
+ {
+ MutexAutoLock lock(mLock);
+ mChannelStatistics->Stop();
+ }
+ element->DownloadSuspended();
+ }
+ }
+}
+
+void ChannelMediaResource::Resume()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ if (!owner) {
+ // Shutting down; do nothing.
+ return;
+ }
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ if (!element) {
+ // Shutting down; do nothing.
+ return;
+ }
+
+ if (mSuspendAgent.Resume()) {
+ if (mChannel) {
+ // Just wake up our existing channel
+ {
+ MutexAutoLock lock(mLock);
+ mChannelStatistics->Start();
+ }
+ // if an error occurs after Resume, assume it's because the server
+ // timed out the connection and we should reopen it.
+ mReopenOnError = true;
+ element->DownloadResumed();
+ } else {
+ int64_t totalLength = mCacheStream.GetLength();
+ // If mOffset is at the end of the stream, then we shouldn't try to
+ // seek to it. The seek will fail and be wasted anyway. We can leave
+ // the channel dead; if the media cache wants to read some other data
+ // in the future, it will call CacheClientSeek itself which will reopen the
+ // channel.
+ if (totalLength < 0 || mOffset < totalLength) {
+ // There is (or may be) data to read at mOffset, so start reading it.
+ // Need to recreate the channel.
+ CacheClientSeek(mOffset, false);
+ element->DownloadResumed();
+ } else {
+ // The channel remains dead. Do not notify DownloadResumed() which
+ // will leave the media element in NETWORK_LOADING state.
+ }
+ }
+ }
+}
+
+nsresult
+ChannelMediaResource::RecreateChannel()
+{
+ nsLoadFlags loadFlags =
+ nsICachingChannel::LOAD_BYPASS_LOCAL_CACHE_IF_BUSY |
+ nsIChannel::LOAD_CLASSIFY_URI |
+ (mLoadInBackground ? nsIRequest::LOAD_BACKGROUND : 0);
+
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ if (!owner) {
+ // The decoder is being shut down, so don't bother opening a new channel
+ return NS_OK;
+ }
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ if (!element) {
+ // The decoder is being shut down, so don't bother opening a new channel
+ return NS_OK;
+ }
+ nsCOMPtr<nsILoadGroup> loadGroup = element->GetDocumentLoadGroup();
+ NS_ENSURE_TRUE(loadGroup, NS_ERROR_NULL_POINTER);
+
+ nsSecurityFlags securityFlags = element->ShouldCheckAllowOrigin()
+ ? nsILoadInfo::SEC_REQUIRE_CORS_DATA_INHERITS
+ : nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS;
+
+ MOZ_ASSERT(element->IsAnyOfHTMLElements(nsGkAtoms::audio, nsGkAtoms::video));
+ nsContentPolicyType contentPolicyType = element->IsHTMLElement(nsGkAtoms::audio) ?
+ nsIContentPolicy::TYPE_INTERNAL_AUDIO : nsIContentPolicy::TYPE_INTERNAL_VIDEO;
+
+ nsresult rv = NS_NewChannel(getter_AddRefs(mChannel),
+ mURI,
+ element,
+ securityFlags,
+ contentPolicyType,
+ loadGroup,
+ nullptr, // aCallbacks
+ loadFlags);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // We have cached the Content-Type, which should not change. Give a hint to
+ // the channel to avoid a sniffing failure, which would be expected because we
+ // are probably seeking in the middle of the bitstream, and sniffing relies
+ // on the presence of a magic number at the beginning of the stream.
+ NS_ASSERTION(!GetContentType().IsEmpty(),
+ "When recreating a channel, we should know the Content-Type.");
+ mChannel->SetContentType(GetContentType());
+ mSuspendAgent.NotifyChannelOpened(mChannel);
+
+ // Tell the cache to reset the download status when the channel is reopened.
+ mCacheStream.NotifyChannelRecreated();
+
+ return rv;
+}
+
+void
+ChannelMediaResource::DoNotifyDataReceived()
+{
+ mDataReceivedEvent.Revoke();
+ mCallback->NotifyBytesDownloaded();
+}
+
+void
+ChannelMediaResource::CacheClientNotifyDataReceived()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+ // NOTE: this can be called with the media cache lock held, so don't
+ // block or do anything which might try to acquire a lock!
+
+ if (mDataReceivedEvent.IsPending())
+ return;
+
+ mDataReceivedEvent =
+ NewNonOwningRunnableMethod(this, &ChannelMediaResource::DoNotifyDataReceived);
+ NS_DispatchToMainThread(mDataReceivedEvent.get());
+}
+
+void
+ChannelMediaResource::CacheClientNotifyDataEnded(nsresult aStatus)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mCallback->NotifyDataEnded(aStatus);
+}
+
+void
+ChannelMediaResource::CacheClientNotifyPrincipalChanged()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+
+ mCallback->NotifyPrincipalChanged();
+}
+
+void
+ChannelMediaResource::CacheClientNotifySuspendedStatusChanged()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+ mCallback->NotifySuspendedStatusChanged();
+}
+
+nsresult
+ChannelMediaResource::CacheClientSeek(int64_t aOffset, bool aResume)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Don't call on non-main thread");
+
+ CMLOG("CacheClientSeek requested for aOffset [%lld] for decoder [%p]",
+ aOffset, mCallback.get());
+
+ CloseChannel();
+
+ mOffset = aOffset;
+
+ // Don't report close of the channel because the channel is not closed for
+ // download ended, but for internal changes in the read position.
+ mIgnoreClose = true;
+
+ if (aResume) {
+ mSuspendAgent.Resume();
+ }
+
+ // Don't create a new channel if we are still suspended. The channel will
+ // be recreated when we are resumed.
+ if (mSuspendAgent.IsSuspended()) {
+ return NS_OK;
+ }
+
+ nsresult rv = RecreateChannel();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return OpenChannel(nullptr);
+}
+
+void
+ChannelMediaResource::FlushCache()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
+
+ // Ensure that data in the cache's partial block is written to disk.
+ mCacheStream.FlushPartialBlock();
+}
+
+void
+ChannelMediaResource::NotifyLastByteRange()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
+
+ // Tell media cache that the last data has been downloaded.
+ // Note: subsequent seeks will require re-opening the channel etc.
+ mCacheStream.NotifyDataEnded(NS_OK);
+
+}
+
+nsresult
+ChannelMediaResource::CacheClientSuspend()
+{
+ Suspend(false);
+ return NS_OK;
+}
+
+nsresult
+ChannelMediaResource::CacheClientResume()
+{
+ Resume();
+ return NS_OK;
+}
+
+int64_t
+ChannelMediaResource::GetNextCachedData(int64_t aOffset)
+{
+ return mCacheStream.GetNextCachedData(aOffset);
+}
+
+int64_t
+ChannelMediaResource::GetCachedDataEnd(int64_t aOffset)
+{
+ return mCacheStream.GetCachedDataEnd(aOffset);
+}
+
+bool
+ChannelMediaResource::IsDataCachedToEndOfResource(int64_t aOffset)
+{
+ return mCacheStream.IsDataCachedToEndOfStream(aOffset);
+}
+
+void
+ChannelMediaResource::EnsureCacheUpToDate()
+{
+ mCacheStream.EnsureCacheUpdate();
+}
+
+bool
+ChannelMediaResource::IsSuspendedByCache()
+{
+ return mCacheStream.AreAllStreamsForResourceSuspended();
+}
+
+bool
+ChannelMediaResource::IsSuspended()
+{
+ return mSuspendAgent.IsSuspended();
+}
+
+void
+ChannelMediaResource::SetReadMode(MediaCacheStream::ReadMode aMode)
+{
+ mCacheStream.SetReadMode(aMode);
+}
+
+void
+ChannelMediaResource::SetPlaybackRate(uint32_t aBytesPerSecond)
+{
+ mCacheStream.SetPlaybackRate(aBytesPerSecond);
+}
+
+void
+ChannelMediaResource::Pin()
+{
+ mCacheStream.Pin();
+}
+
+void
+ChannelMediaResource::Unpin()
+{
+ mCacheStream.Unpin();
+}
+
+double
+ChannelMediaResource::GetDownloadRate(bool* aIsReliable)
+{
+ MutexAutoLock lock(mLock);
+ return mChannelStatistics->GetRate(aIsReliable);
+}
+
+int64_t
+ChannelMediaResource::GetLength()
+{
+ return mCacheStream.GetLength();
+}
+
+// ChannelSuspendAgent
+
+bool
+ChannelSuspendAgent::Suspend()
+{
+ SuspendInternal();
+ return (++mSuspendCount == 1);
+}
+
+void
+ChannelSuspendAgent::SuspendInternal()
+{
+ if (mChannel) {
+ bool isPending = false;
+ nsresult rv = mChannel->IsPending(&isPending);
+ if (NS_SUCCEEDED(rv) && isPending && !mIsChannelSuspended) {
+ mChannel->Suspend();
+ mIsChannelSuspended = true;
+ }
+ }
+}
+
+bool
+ChannelSuspendAgent::Resume()
+{
+ MOZ_ASSERT(IsSuspended(), "Resume without suspend!");
+ --mSuspendCount;
+
+ if (mSuspendCount == 0) {
+ if (mChannel && mIsChannelSuspended) {
+ mChannel->Resume();
+ mIsChannelSuspended = false;
+ }
+ return true;
+ }
+ return false;
+}
+
+void
+ChannelSuspendAgent::UpdateSuspendedStatusIfNeeded()
+{
+ if (!mIsChannelSuspended && IsSuspended()) {
+ SuspendInternal();
+ }
+}
+
+void
+ChannelSuspendAgent::NotifyChannelOpened(nsIChannel* aChannel)
+{
+ MOZ_ASSERT(aChannel);
+ mChannel = aChannel;
+}
+
+void
+ChannelSuspendAgent::NotifyChannelClosing()
+{
+ MOZ_ASSERT(mChannel);
+ // Before close the channel, it need to be resumed to make sure its internal
+ // state is correct. Besides, We need to suspend the channel after recreating.
+ if (mIsChannelSuspended) {
+ mChannel->Resume();
+ mIsChannelSuspended = false;
+ }
+ mChannel = nullptr;
+}
+
+bool
+ChannelSuspendAgent::IsSuspended()
+{
+ return (mSuspendCount > 0);
+}
+
+// FileMediaResource
+
+class FileMediaResource : public BaseMediaResource
+{
+public:
+ FileMediaResource(MediaResourceCallback* aCallback,
+ nsIChannel* aChannel,
+ nsIURI* aURI,
+ const nsACString& aContentType) :
+ BaseMediaResource(aCallback, aChannel, aURI, aContentType),
+ mSize(-1),
+ mLock("FileMediaResource.mLock"),
+ mSizeInitialized(false)
+ {
+ }
+ ~FileMediaResource()
+ {
+ }
+
+ // Main thread
+ nsresult Open(nsIStreamListener** aStreamListener) override;
+ nsresult Close() override;
+ void Suspend(bool aCloseImmediately) override {}
+ void Resume() override {}
+ already_AddRefed<nsIPrincipal> GetCurrentPrincipal() override;
+ bool CanClone() override;
+ already_AddRefed<MediaResource> CloneData(MediaResourceCallback* aCallback) override;
+ nsresult ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount) override;
+
+ // These methods are called off the main thread.
+
+ // Other thread
+ void SetReadMode(MediaCacheStream::ReadMode aMode) override {}
+ void SetPlaybackRate(uint32_t aBytesPerSecond) override {}
+ nsresult ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes) override;
+ already_AddRefed<MediaByteBuffer> MediaReadAt(int64_t aOffset, uint32_t aCount) override;
+ int64_t Tell() override;
+
+ // Any thread
+ void Pin() override {}
+ void Unpin() override {}
+ double GetDownloadRate(bool* aIsReliable) override
+ {
+ // The data's all already here
+ *aIsReliable = true;
+ return 100*1024*1024; // arbitray, use 100MB/s
+ }
+ int64_t GetLength() override {
+ MutexAutoLock lock(mLock);
+
+ EnsureSizeInitialized();
+ return mSizeInitialized ? mSize : 0;
+ }
+ int64_t GetNextCachedData(int64_t aOffset) override
+ {
+ MutexAutoLock lock(mLock);
+
+ EnsureSizeInitialized();
+ return (aOffset < mSize) ? aOffset : -1;
+ }
+ int64_t GetCachedDataEnd(int64_t aOffset) override {
+ MutexAutoLock lock(mLock);
+
+ EnsureSizeInitialized();
+ return std::max(aOffset, mSize);
+ }
+ bool IsDataCachedToEndOfResource(int64_t aOffset) override { return true; }
+ bool IsSuspendedByCache() override { return true; }
+ bool IsSuspended() override { return true; }
+ bool IsTransportSeekable() override { return true; }
+
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override;
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Might be useful to track in the future:
+ // - mInput
+ return BaseMediaResource::SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+protected:
+ // These Unsafe variants of Read and Seek perform their operations
+ // without acquiring mLock. The caller must obtain the lock before
+ // calling. The implmentation of Read, Seek and ReadAt obtains the
+ // lock before calling these Unsafe variants to read or seek.
+ nsresult UnsafeRead(char* aBuffer, uint32_t aCount, uint32_t* aBytes);
+ nsresult UnsafeSeek(int32_t aWhence, int64_t aOffset);
+private:
+ // Ensures mSize is initialized, if it can be.
+ // mLock must be held when this is called, and mInput must be non-null.
+ void EnsureSizeInitialized();
+ already_AddRefed<MediaByteBuffer> UnsafeMediaReadAt(
+ int64_t aOffset, uint32_t aCount);
+
+ // The file size, or -1 if not known. Immutable after Open().
+ // Can be used from any thread.
+ int64_t mSize;
+
+ // This lock handles synchronisation between calls to Close() and
+ // the Read, Seek, etc calls. Close must not be called while a
+ // Read or Seek is in progress since it resets various internal
+ // values to null.
+ // This lock protects mSeekable, mInput, mSize, and mSizeInitialized.
+ Mutex mLock;
+
+ // Seekable stream interface to file. This can be used from any
+ // thread.
+ nsCOMPtr<nsISeekableStream> mSeekable;
+
+ // Input stream for the media data. This can be used from any
+ // thread.
+ nsCOMPtr<nsIInputStream> mInput;
+
+ // Whether we've attempted to initialize mSize. Note that mSize can be -1
+ // when mSizeInitialized is true if we tried and failed to get the size
+ // of the file.
+ bool mSizeInitialized;
+};
+
+void FileMediaResource::EnsureSizeInitialized()
+{
+ mLock.AssertCurrentThreadOwns();
+ NS_ASSERTION(mInput, "Must have file input stream");
+ if (mSizeInitialized) {
+ return;
+ }
+ mSizeInitialized = true;
+ // Get the file size and inform the decoder.
+ uint64_t size;
+ nsresult res = mInput->Available(&size);
+ if (NS_SUCCEEDED(res) && size <= INT64_MAX) {
+ mSize = (int64_t)size;
+ mCallback->NotifyDataEnded(NS_OK);
+ }
+}
+
+nsresult FileMediaResource::GetCachedRanges(MediaByteRangeSet& aRanges)
+{
+ MutexAutoLock lock(mLock);
+
+ EnsureSizeInitialized();
+ if (mSize == -1) {
+ return NS_ERROR_FAILURE;
+ }
+ aRanges += MediaByteRange(0, mSize);
+ return NS_OK;
+}
+
+nsresult FileMediaResource::Open(nsIStreamListener** aStreamListener)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ if (aStreamListener) {
+ *aStreamListener = nullptr;
+ }
+
+ nsresult rv = NS_OK;
+ if (aStreamListener) {
+ // The channel is already open. We need a synchronous stream that
+ // implements nsISeekableStream, so we have to find the underlying
+ // file and reopen it
+ nsCOMPtr<nsIFileChannel> fc(do_QueryInterface(mChannel));
+ if (fc) {
+ nsCOMPtr<nsIFile> file;
+ rv = fc->GetFile(getter_AddRefs(file));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = NS_NewLocalFileInputStream(
+ getter_AddRefs(mInput), file, -1, -1, nsIFileInputStream::SHARE_DELETE);
+ } else if (IsBlobURI(mURI)) {
+ rv = NS_GetStreamForBlobURI(mURI, getter_AddRefs(mInput));
+ }
+ } else {
+ rv = mChannel->Open2(getter_AddRefs(mInput));
+ }
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ mSeekable = do_QueryInterface(mInput);
+ if (!mSeekable) {
+ // XXX The file may just be a .url or similar
+ // shortcut that points to a Web site. We need to fix this by
+ // doing an async open and waiting until we locate the real resource,
+ // then using that (if it's still a file!).
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult FileMediaResource::Close()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ // Since mChennel is only accessed by main thread, there is no necessary to
+ // take the lock.
+ if (mChannel) {
+ mChannel->Cancel(NS_ERROR_PARSED_DATA_CACHED);
+ mChannel = nullptr;
+ }
+
+ return NS_OK;
+}
+
+already_AddRefed<nsIPrincipal> FileMediaResource::GetCurrentPrincipal()
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ nsCOMPtr<nsIPrincipal> principal;
+ nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager();
+ if (!secMan || !mChannel)
+ return nullptr;
+ secMan->GetChannelResultPrincipal(mChannel, getter_AddRefs(principal));
+ return principal.forget();
+}
+
+bool FileMediaResource::CanClone()
+{
+ return true;
+}
+
+already_AddRefed<MediaResource> FileMediaResource::CloneData(MediaResourceCallback* aCallback)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
+
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ if (!owner) {
+ // The decoder is being shut down, so we can't clone
+ return nullptr;
+ }
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ if (!element) {
+ // The decoder is being shut down, so we can't clone
+ return nullptr;
+ }
+ nsCOMPtr<nsILoadGroup> loadGroup = element->GetDocumentLoadGroup();
+ NS_ENSURE_TRUE(loadGroup, nullptr);
+
+ MOZ_ASSERT(element->IsAnyOfHTMLElements(nsGkAtoms::audio, nsGkAtoms::video));
+ nsContentPolicyType contentPolicyType = element->IsHTMLElement(nsGkAtoms::audio) ?
+ nsIContentPolicy::TYPE_INTERNAL_AUDIO : nsIContentPolicy::TYPE_INTERNAL_VIDEO;
+
+ nsLoadFlags loadFlags = nsIRequest::LOAD_NORMAL | nsIChannel::LOAD_CLASSIFY_URI;
+
+ nsCOMPtr<nsIChannel> channel;
+ nsresult rv =
+ NS_NewChannel(getter_AddRefs(channel),
+ mURI,
+ element,
+ nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_INHERITS,
+ contentPolicyType,
+ loadGroup,
+ nullptr, // aCallbacks
+ loadFlags);
+
+ if (NS_FAILED(rv))
+ return nullptr;
+
+ RefPtr<MediaResource> resource(new FileMediaResource(aCallback, channel, mURI, GetContentType()));
+ return resource.forget();
+}
+
+nsresult FileMediaResource::ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount)
+{
+ MutexAutoLock lock(mLock);
+
+ EnsureSizeInitialized();
+ if (!aCount) {
+ return NS_OK;
+ }
+ int64_t offset = 0;
+ nsresult res = mSeekable->Tell(&offset);
+ NS_ENSURE_SUCCESS(res,res);
+ res = mSeekable->Seek(nsISeekableStream::NS_SEEK_SET, aOffset);
+ NS_ENSURE_SUCCESS(res,res);
+ uint32_t bytesRead = 0;
+ do {
+ uint32_t x = 0;
+ uint32_t bytesToRead = aCount - bytesRead;
+ res = mInput->Read(aBuffer, bytesToRead, &x);
+ bytesRead += x;
+ if (!x) {
+ res = NS_ERROR_FAILURE;
+ }
+ } while (bytesRead != aCount && res == NS_OK);
+
+ // Reset read head to original position so we don't disturb any other
+ // reading thread.
+ nsresult seekres = mSeekable->Seek(nsISeekableStream::NS_SEEK_SET, offset);
+
+ // If a read failed in the loop above, we want to return its failure code.
+ NS_ENSURE_SUCCESS(res,res);
+
+ // Else we succeed if the reset-seek succeeds.
+ return seekres;
+}
+
+nsresult FileMediaResource::UnsafeRead(char* aBuffer, uint32_t aCount, uint32_t* aBytes)
+{
+ EnsureSizeInitialized();
+ return mInput->Read(aBuffer, aCount, aBytes);
+}
+
+nsresult FileMediaResource::ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ nsresult rv;
+ {
+ MutexAutoLock lock(mLock);
+ rv = UnsafeSeek(nsISeekableStream::NS_SEEK_SET, aOffset);
+ if (NS_FAILED(rv)) return rv;
+ rv = UnsafeRead(aBuffer, aCount, aBytes);
+ }
+ if (NS_SUCCEEDED(rv)) {
+ DispatchBytesConsumed(*aBytes, aOffset);
+ }
+ return rv;
+}
+
+already_AddRefed<MediaByteBuffer>
+FileMediaResource::MediaReadAt(int64_t aOffset, uint32_t aCount)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ MutexAutoLock lock(mLock);
+ return UnsafeMediaReadAt(aOffset, aCount);
+}
+
+already_AddRefed<MediaByteBuffer>
+FileMediaResource::UnsafeMediaReadAt(int64_t aOffset, uint32_t aCount)
+{
+ RefPtr<MediaByteBuffer> bytes = new MediaByteBuffer();
+ bool ok = bytes->SetLength(aCount, fallible);
+ NS_ENSURE_TRUE(ok, nullptr);
+ nsresult rv = UnsafeSeek(nsISeekableStream::NS_SEEK_SET, aOffset);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ char* curr = reinterpret_cast<char*>(bytes->Elements());
+ const char* start = curr;
+ while (aCount > 0) {
+ uint32_t bytesRead;
+ rv = UnsafeRead(curr, aCount, &bytesRead);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ if (!bytesRead) {
+ break;
+ }
+ aCount -= bytesRead;
+ curr += bytesRead;
+ }
+ bytes->SetLength(curr - start);
+ return bytes.forget();
+}
+
+nsresult FileMediaResource::UnsafeSeek(int32_t aWhence, int64_t aOffset)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ if (!mSeekable)
+ return NS_ERROR_FAILURE;
+ EnsureSizeInitialized();
+ return mSeekable->Seek(aWhence, aOffset);
+}
+
+int64_t FileMediaResource::Tell()
+{
+ MutexAutoLock lock(mLock);
+ EnsureSizeInitialized();
+
+ int64_t offset = 0;
+ // Return mSize as offset (end of stream) in case of error
+ if (!mSeekable || NS_FAILED(mSeekable->Tell(&offset)))
+ return mSize;
+ return offset;
+}
+
+already_AddRefed<MediaResource>
+MediaResource::Create(MediaResourceCallback* aCallback, nsIChannel* aChannel)
+{
+ NS_ASSERTION(NS_IsMainThread(),
+ "MediaResource::Open called on non-main thread");
+
+ // If the channel was redirected, we want the post-redirect URI;
+ // but if the URI scheme was expanded, say from chrome: to jar:file:,
+ // we want the original URI.
+ nsCOMPtr<nsIURI> uri;
+ nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+
+ nsAutoCString contentType;
+ aChannel->GetContentType(contentType);
+
+ nsCOMPtr<nsIFileChannel> fc = do_QueryInterface(aChannel);
+ RefPtr<MediaResource> resource;
+ if (fc || IsBlobURI(uri)) {
+ resource = new FileMediaResource(aCallback, aChannel, uri, contentType);
+ } else {
+ resource = new ChannelMediaResource(aCallback, aChannel, uri, contentType);
+ }
+ return resource.forget();
+}
+
+void BaseMediaResource::SetLoadInBackground(bool aLoadInBackground) {
+ if (aLoadInBackground == mLoadInBackground) {
+ return;
+ }
+ mLoadInBackground = aLoadInBackground;
+ if (!mChannel) {
+ // No channel, resource is probably already loaded.
+ return;
+ }
+
+ MediaDecoderOwner* owner = mCallback->GetMediaOwner();
+ if (!owner) {
+ NS_WARNING("Null owner in MediaResource::SetLoadInBackground()");
+ return;
+ }
+ dom::HTMLMediaElement* element = owner->GetMediaElement();
+ if (!element) {
+ NS_WARNING("Null element in MediaResource::SetLoadInBackground()");
+ return;
+ }
+
+ bool isPending = false;
+ if (NS_SUCCEEDED(mChannel->IsPending(&isPending)) &&
+ isPending) {
+ nsLoadFlags loadFlags;
+ DebugOnly<nsresult> rv = mChannel->GetLoadFlags(&loadFlags);
+ NS_ASSERTION(NS_SUCCEEDED(rv), "GetLoadFlags() failed!");
+
+ if (aLoadInBackground) {
+ loadFlags |= nsIRequest::LOAD_BACKGROUND;
+ } else {
+ loadFlags &= ~nsIRequest::LOAD_BACKGROUND;
+ }
+ ModifyLoadFlags(loadFlags);
+ }
+}
+
+void BaseMediaResource::ModifyLoadFlags(nsLoadFlags aFlags)
+{
+ nsCOMPtr<nsILoadGroup> loadGroup;
+ nsresult rv = mChannel->GetLoadGroup(getter_AddRefs(loadGroup));
+ MOZ_ASSERT(NS_SUCCEEDED(rv), "GetLoadGroup() failed!");
+
+ nsresult status;
+ mChannel->GetStatus(&status);
+
+ bool inLoadGroup = false;
+ if (loadGroup) {
+ rv = loadGroup->RemoveRequest(mChannel, nullptr, status);
+ if (NS_SUCCEEDED(rv)) {
+ inLoadGroup = true;
+ }
+ }
+
+ rv = mChannel->SetLoadFlags(aFlags);
+ MOZ_ASSERT(NS_SUCCEEDED(rv), "SetLoadFlags() failed!");
+
+ if (inLoadGroup) {
+ rv = loadGroup->AddRequest(mChannel, nullptr);
+ MOZ_ASSERT(NS_SUCCEEDED(rv), "AddRequest() failed!");
+ }
+}
+
+void BaseMediaResource::DispatchBytesConsumed(int64_t aNumBytes, int64_t aOffset)
+{
+ if (aNumBytes <= 0) {
+ return;
+ }
+ mCallback->NotifyBytesConsumed(aNumBytes, aOffset);
+}
+
+nsresult
+MediaResourceIndex::Read(char* aBuffer, uint32_t aCount, uint32_t* aBytes)
+{
+ NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
+
+ // We purposefuly don't check that we may attempt to read past
+ // mResource->GetLength() as the resource's length may change over time.
+
+ nsresult rv = ReadAt(mOffset, aBuffer, aCount, aBytes);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ mOffset += *aBytes;
+ return NS_OK;
+}
+
+nsresult
+MediaResourceIndex::ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes) const
+{
+ *aBytes = 0;
+ while (aCount > 0) {
+ uint32_t bytesRead = 0;
+ nsresult rv = mResource->ReadAt(aOffset, aBuffer, aCount, &bytesRead);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!bytesRead) {
+ break;
+ }
+ *aBytes += bytesRead;
+ aOffset += bytesRead;
+ aBuffer += bytesRead;
+ aCount -= bytesRead;
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaResourceIndex::Seek(int32_t aWhence, int64_t aOffset)
+{
+ switch (aWhence) {
+ case SEEK_SET:
+ break;
+ case SEEK_CUR:
+ aOffset += mOffset;
+ break;
+ case SEEK_END:
+ {
+ int64_t length = mResource->GetLength();
+ if (length == -1 || length - aOffset < 0) {
+ return NS_ERROR_FAILURE;
+ }
+ aOffset = mResource->GetLength() - aOffset;
+ }
+ break;
+ default:
+ return NS_ERROR_FAILURE;
+ }
+
+ mOffset = aOffset;
+
+ return NS_OK;
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/MediaResource.h b/dom/media/MediaResource.h
new file mode 100644
index 000000000..7d2f153aa
--- /dev/null
+++ b/dom/media/MediaResource.h
@@ -0,0 +1,820 @@
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaResource_h_)
+#define MediaResource_h_
+
+#include "mozilla/Mutex.h"
+#include "nsIChannel.h"
+#include "nsIURI.h"
+#include "nsISeekableStream.h"
+#include "nsIStreamingProtocolController.h"
+#include "nsIStreamListener.h"
+#include "nsIChannelEventSink.h"
+#include "nsIInterfaceRequestor.h"
+#include "Intervals.h"
+#include "MediaCache.h"
+#include "MediaData.h"
+#include "MediaResourceCallback.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/TimeStamp.h"
+#include "nsThreadUtils.h"
+#include <algorithm>
+
+// For HTTP seeking, if number of bytes needing to be
+// seeked forward is less than this value then a read is
+// done rather than a byte range request.
+//
+// If we assume a 100Mbit connection, and assume reissuing an HTTP seek causes
+// a delay of 200ms, then in that 200ms we could have simply read ahead 2MB. So
+// setting SEEK_VS_READ_THRESHOLD to 1MB sounds reasonable.
+static const int64_t SEEK_VS_READ_THRESHOLD = 1 * 1024 * 1024;
+
+static const uint32_t HTTP_REQUESTED_RANGE_NOT_SATISFIABLE_CODE = 416;
+
+// Number of bytes we have accumulated before we assume the connection download
+// rate can be reliably calculated. 57 Segments at IW=3 allows slow start to
+// reach a CWND of 30 (See bug 831998)
+static const int64_t RELIABLE_DATA_THRESHOLD = 57 * 1460;
+
+class nsIHttpChannel;
+class nsIPrincipal;
+
+namespace mozilla {
+
+class MediaChannelStatistics;
+
+/**
+ * This class is useful for estimating rates of data passing through
+ * some channel. The idea is that activity on the channel "starts"
+ * and "stops" over time. At certain times data passes through the
+ * channel (usually while the channel is active; data passing through
+ * an inactive channel is ignored). The GetRate() function computes
+ * an estimate of the "current rate" of the channel, which is some
+ * kind of average of the data passing through over the time the
+ * channel is active.
+ *
+ * All methods take "now" as a parameter so the user of this class can
+ * control the timeline used.
+ */
+class MediaChannelStatistics {
+public:
+ MediaChannelStatistics()
+ : mAccumulatedBytes(0)
+ , mIsStarted(false)
+ {
+ Reset();
+ }
+
+ explicit MediaChannelStatistics(MediaChannelStatistics * aCopyFrom)
+ {
+ MOZ_ASSERT(aCopyFrom);
+ mAccumulatedBytes = aCopyFrom->mAccumulatedBytes;
+ mAccumulatedTime = aCopyFrom->mAccumulatedTime;
+ mLastStartTime = aCopyFrom->mLastStartTime;
+ mIsStarted = aCopyFrom->mIsStarted;
+ }
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaChannelStatistics)
+
+ void Reset() {
+ mLastStartTime = TimeStamp();
+ mAccumulatedTime = TimeDuration(0);
+ mAccumulatedBytes = 0;
+ mIsStarted = false;
+ }
+ void Start() {
+ if (mIsStarted)
+ return;
+ mLastStartTime = TimeStamp::Now();
+ mIsStarted = true;
+ }
+ void Stop() {
+ if (!mIsStarted)
+ return;
+ mAccumulatedTime += TimeStamp::Now() - mLastStartTime;
+ mIsStarted = false;
+ }
+ void AddBytes(int64_t aBytes) {
+ if (!mIsStarted) {
+ // ignore this data, it may be related to seeking or some other
+ // operation we don't care about
+ return;
+ }
+ mAccumulatedBytes += aBytes;
+ }
+ double GetRateAtLastStop(bool* aReliable) {
+ double seconds = mAccumulatedTime.ToSeconds();
+ *aReliable = (seconds >= 1.0) ||
+ (mAccumulatedBytes >= RELIABLE_DATA_THRESHOLD);
+ if (seconds <= 0.0)
+ return 0.0;
+ return static_cast<double>(mAccumulatedBytes)/seconds;
+ }
+ double GetRate(bool* aReliable) {
+ TimeDuration time = mAccumulatedTime;
+ if (mIsStarted) {
+ time += TimeStamp::Now() - mLastStartTime;
+ }
+ double seconds = time.ToSeconds();
+ *aReliable = (seconds >= 3.0) ||
+ (mAccumulatedBytes >= RELIABLE_DATA_THRESHOLD);
+ if (seconds <= 0.0)
+ return 0.0;
+ return static_cast<double>(mAccumulatedBytes)/seconds;
+ }
+private:
+ ~MediaChannelStatistics() {}
+ int64_t mAccumulatedBytes;
+ TimeDuration mAccumulatedTime;
+ TimeStamp mLastStartTime;
+ bool mIsStarted;
+};
+
+// Represents a section of contiguous media, with a start and end offset.
+// Used to denote ranges of data which are cached.
+
+typedef media::Interval<int64_t> MediaByteRange;
+typedef media::IntervalSet<int64_t> MediaByteRangeSet;
+
+/**
+ * Provides a thread-safe, seek/read interface to resources
+ * loaded from a URI. Uses MediaCache to cache data received over
+ * Necko's async channel API, thus resolving the mismatch between clients
+ * that need efficient random access to the data and protocols that do not
+ * support efficient random access, such as HTTP.
+ *
+ * Instances of this class must be created on the main thread.
+ * Most methods must be called on the main thread only. Read, Seek and
+ * Tell must only be called on non-main threads. In the case of the Ogg
+ * Decoder they are called on the Decode thread for example. You must
+ * ensure that no threads are calling these methods once Close is called.
+ *
+ * Instances of this class are reference counted. Use nsRefPtr for
+ * managing the lifetime of instances of this class.
+ *
+ * The generic implementation of this class is ChannelMediaResource, which can
+ * handle any URI for which Necko supports AsyncOpen.
+ * The 'file:' protocol can be implemented efficiently with direct random
+ * access, so the FileMediaResource implementation class bypasses the cache.
+ * MediaResource::Create automatically chooses the best implementation class.
+ */
+class MediaResource : public nsISupports
+{
+public:
+ // Our refcounting is threadsafe, and when our refcount drops to zero
+ // we dispatch an event to the main thread to delete the MediaResource.
+ // Note that this means it's safe for references to this object to be
+ // released on a non main thread, but the destructor will always run on
+ // the main thread.
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // The following can be called on the main thread only:
+ // Get the URI
+ virtual nsIURI* URI() const { return nullptr; }
+ // Close the resource, stop any listeners, channels, etc.
+ // Cancels any currently blocking Read request and forces that request to
+ // return an error.
+ virtual nsresult Close() = 0;
+ // Suspend any downloads that are in progress.
+ // If aCloseImmediately is set, resources should be released immediately
+ // since we don't expect to resume again any time soon. Otherwise we
+ // may resume again soon so resources should be held for a little
+ // while.
+ virtual void Suspend(bool aCloseImmediately) = 0;
+ // Resume any downloads that have been suspended.
+ virtual void Resume() = 0;
+ // Get the current principal for the channel
+ virtual already_AddRefed<nsIPrincipal> GetCurrentPrincipal() = 0;
+ // If this returns false, then we shouldn't try to clone this MediaResource
+ // because its underlying resources are not suitable for reuse (e.g.
+ // because the underlying connection has been lost, or this resource
+ // just can't be safely cloned). If this returns true, CloneData could
+ // still fail. If this returns false, CloneData should not be called.
+ virtual bool CanClone() { return false; }
+ // Create a new stream of the same type that refers to the same URI
+ // with a new channel. Any cached data associated with the original
+ // stream should be accessible in the new stream too.
+ virtual already_AddRefed<MediaResource> CloneData(MediaResourceCallback* aCallback) = 0;
+ // Set statistics to be recorded to the object passed in.
+ virtual void RecordStatisticsTo(MediaChannelStatistics *aStatistics) { }
+
+ // These methods are called off the main thread.
+ // The mode is initially MODE_PLAYBACK.
+ virtual void SetReadMode(MediaCacheStream::ReadMode aMode) = 0;
+ // This is the client's estimate of the playback rate assuming
+ // the media plays continuously. The cache can't guess this itself
+ // because it doesn't know when the decoder was paused, buffering, etc.
+ virtual void SetPlaybackRate(uint32_t aBytesPerSecond) = 0;
+ // Read up to aCount bytes from the stream. The read starts at
+ // aOffset in the stream, seeking to that location initially if
+ // it is not the current stream offset. The remaining arguments,
+ // results and requirements are the same as per the Read method.
+ virtual nsresult ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes) = 0;
+ // This method returns nullptr if anything fails.
+ // Otherwise, it returns an owned buffer.
+ // MediaReadAt may return fewer bytes than requested if end of stream is
+ // encountered. There is no need to call it again to get more data.
+ virtual already_AddRefed<MediaByteBuffer> MediaReadAt(int64_t aOffset, uint32_t aCount)
+ {
+ RefPtr<MediaByteBuffer> bytes = new MediaByteBuffer();
+ bool ok = bytes->SetLength(aCount, fallible);
+ NS_ENSURE_TRUE(ok, nullptr);
+ char* curr = reinterpret_cast<char*>(bytes->Elements());
+ const char* start = curr;
+ while (aCount > 0) {
+ uint32_t bytesRead;
+ nsresult rv = ReadAt(aOffset, curr, aCount, &bytesRead);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+ if (!bytesRead) {
+ break;
+ }
+ aOffset += bytesRead;
+ aCount -= bytesRead;
+ curr += bytesRead;
+ }
+ bytes->SetLength(curr - start);
+ return bytes.forget();
+ }
+
+ // Report the current offset in bytes from the start of the stream.
+ // This is used to approximate where we currently are in the playback of a
+ // media.
+ // A call to ReadAt will update this position.
+ virtual int64_t Tell() = 0;
+ // Moves any existing channel loads into or out of background. Background
+ // loads don't block the load event. This also determines whether or not any
+ // new loads initiated (for example to seek) will be in the background.
+ virtual void SetLoadInBackground(bool aLoadInBackground) {}
+ // Ensures that the value returned by IsSuspendedByCache below is up to date
+ // (i.e. the cache has examined this stream at least once).
+ virtual void EnsureCacheUpToDate() {}
+
+ // These can be called on any thread.
+ // Cached blocks associated with this stream will not be evicted
+ // while the stream is pinned.
+ virtual void Pin() = 0;
+ virtual void Unpin() = 0;
+ // Get the estimated download rate in bytes per second (assuming no
+ // pausing of the channel is requested by Gecko).
+ // *aIsReliable is set to true if we think the estimate is useful.
+ virtual double GetDownloadRate(bool* aIsReliable) = 0;
+ // Get the length of the stream in bytes. Returns -1 if not known.
+ // This can change over time; after a seek operation, a misbehaving
+ // server may give us a resource of a different length to what it had
+ // reported previously --- or it may just lie in its Content-Length
+ // header and give us more or less data than it reported. We will adjust
+ // the result of GetLength to reflect the data that's actually arriving.
+ virtual int64_t GetLength() = 0;
+ // Returns the offset of the first byte of cached data at or after aOffset,
+ // or -1 if there is no such cached data.
+ virtual int64_t GetNextCachedData(int64_t aOffset) = 0;
+ // Returns the end of the bytes starting at the given offset
+ // which are in cache.
+ virtual int64_t GetCachedDataEnd(int64_t aOffset) = 0;
+ // Returns true if all the data from aOffset to the end of the stream
+ // is in cache. If the end of the stream is not known, we return false.
+ virtual bool IsDataCachedToEndOfResource(int64_t aOffset) = 0;
+ // Returns true if we are expecting any more data to arrive
+ // sometime in the not-too-distant future, either from the network or from
+ // an appendBuffer call on a MediaSource element.
+ virtual bool IsExpectingMoreData()
+ {
+ // MediaDecoder::mDecoderPosition is roughly the same as Tell() which
+ // returns a position updated by latest Read() or ReadAt().
+ return !IsDataCachedToEndOfResource(Tell()) && !IsSuspended();
+ }
+ // Returns true if this stream is suspended by the cache because the
+ // cache is full. If true then the decoder should try to start consuming
+ // data, otherwise we may not be able to make progress.
+ // MediaDecoder::NotifySuspendedStatusChanged is called when this
+ // changes.
+ // For resources using the media cache, this returns true only when all
+ // streams for the same resource are all suspended.
+ virtual bool IsSuspendedByCache() = 0;
+ // Returns true if this stream has been suspended.
+ virtual bool IsSuspended() = 0;
+ // Reads only data which is cached in the media cache. If you try to read
+ // any data which overlaps uncached data, or if aCount bytes otherwise can't
+ // be read, this function will return failure. This function be called from
+ // any thread, and it is the only read operation which is safe to call on
+ // the main thread, since it's guaranteed to be non blocking.
+ virtual nsresult ReadFromCache(char* aBuffer,
+ int64_t aOffset,
+ uint32_t aCount) = 0;
+ // Returns true if the resource can be seeked to unbuffered ranges, i.e.
+ // for an HTTP network stream this returns true if HTTP1.1 Byte Range
+ // requests are supported by the connection/server.
+ virtual bool IsTransportSeekable() = 0;
+
+ /**
+ * Create a resource, reading data from the channel. Call on main thread only.
+ * The caller must follow up by calling resource->Open().
+ */
+ static already_AddRefed<MediaResource> Create(MediaResourceCallback* aCallback, nsIChannel* aChannel);
+
+ /**
+ * Open the stream. This creates a stream listener and returns it in
+ * aStreamListener; this listener needs to be notified of incoming data.
+ */
+ virtual nsresult Open(nsIStreamListener** aStreamListener) = 0;
+
+ /**
+ * Fills aRanges with MediaByteRanges representing the data which is cached
+ * in the media cache. Stream should be pinned during call and while
+ * aRanges is being used.
+ */
+ virtual nsresult GetCachedRanges(MediaByteRangeSet& aRanges) = 0;
+
+ // Ensure that the media cache writes any data held in its partial block.
+ // Called on the main thread only.
+ virtual void FlushCache() { }
+
+ // Notify that the last data byte range was loaded.
+ virtual void NotifyLastByteRange() { }
+
+ // Returns the content type of the resource. This is copied from the
+ // nsIChannel when the MediaResource is created. Safe to call from
+ // any thread.
+ virtual const nsCString& GetContentType() const = 0;
+
+ // Return true if the stream is a live stream
+ virtual bool IsRealTime() {
+ return false;
+ }
+
+ // Returns true if the resource is a live stream.
+ virtual bool IsLiveStream()
+ {
+ return GetLength() == -1;
+ }
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const {
+ return 0;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ const nsCString& GetContentURL() const { return EmptyCString(); }
+
+protected:
+ virtual ~MediaResource() {};
+
+private:
+ void Destroy();
+};
+
+class BaseMediaResource : public MediaResource {
+public:
+ nsIURI* URI() const override { return mURI; }
+ void SetLoadInBackground(bool aLoadInBackground) override;
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Might be useful to track in the future:
+ // - mChannel
+ // - mURI (possibly owned, looks like just a ref from mChannel)
+ // Not owned:
+ // - mCallback
+ size_t size = MediaResource::SizeOfExcludingThis(aMallocSizeOf);
+ size += mContentType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+
+ return size;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ // Returns the url of the resource. Safe to call from any thread?
+ const nsCString& GetContentURL() const
+ {
+ return mContentURL;
+ }
+
+protected:
+ BaseMediaResource(MediaResourceCallback* aCallback,
+ nsIChannel* aChannel,
+ nsIURI* aURI,
+ const nsACString& aContentType) :
+ mCallback(aCallback),
+ mChannel(aChannel),
+ mURI(aURI),
+ mContentType(aContentType),
+ mLoadInBackground(false)
+ {
+ MOZ_COUNT_CTOR(BaseMediaResource);
+ NS_ASSERTION(!mContentType.IsEmpty(), "Must know content type");
+ mURI->GetSpec(mContentURL);
+ }
+ virtual ~BaseMediaResource()
+ {
+ MOZ_COUNT_DTOR(BaseMediaResource);
+ }
+
+ const nsCString& GetContentType() const override
+ {
+ return mContentType;
+ }
+
+ // Set the request's load flags to aFlags. If the request is part of a
+ // load group, the request is removed from the group, the flags are set, and
+ // then the request is added back to the load group.
+ void ModifyLoadFlags(nsLoadFlags aFlags);
+
+ // Dispatches an event to call MediaDecoder::NotifyBytesConsumed(aNumBytes, aOffset)
+ // on the main thread. This is called automatically after every read.
+ void DispatchBytesConsumed(int64_t aNumBytes, int64_t aOffset);
+
+ RefPtr<MediaResourceCallback> mCallback;
+
+ // Channel used to download the media data. Must be accessed
+ // from the main thread only.
+ nsCOMPtr<nsIChannel> mChannel;
+
+ // URI in case the stream needs to be re-opened. Access from
+ // main thread only.
+ nsCOMPtr<nsIURI> mURI;
+
+ // Content-Type of the channel. This is copied from the nsIChannel when the
+ // MediaResource is created. This is constant, so accessing from any thread
+ // is safe.
+ const nsCString mContentType;
+
+ // Copy of the url of the channel resource.
+ nsCString mContentURL;
+
+ // True if SetLoadInBackground() has been called with
+ // aLoadInBackground = true, i.e. when the document load event is not
+ // blocked by this resource, and all channel loads will be in the
+ // background.
+ bool mLoadInBackground;
+};
+
+
+/**
+ * This class is responsible for managing the suspend count and report suspend
+ * status of channel.
+ **/
+class ChannelSuspendAgent {
+public:
+ explicit ChannelSuspendAgent(nsIChannel* aChannel)
+ : mChannel(aChannel),
+ mSuspendCount(0),
+ mIsChannelSuspended(false)
+ {}
+
+ // True when the channel has been suspended or needs to be suspended.
+ bool IsSuspended();
+
+ // Return true when the channel is logically suspended, i.e. the suspend
+ // count goes from 0 to 1.
+ bool Suspend();
+
+ // Return true only when the suspend count is equal to zero.
+ bool Resume();
+
+ // Call after opening channel, set channel and check whether the channel
+ // needs to be suspended.
+ void NotifyChannelOpened(nsIChannel* aChannel);
+
+ // Call before closing channel, reset the channel internal status if needed.
+ void NotifyChannelClosing();
+
+ // Check whether we need to suspend the channel.
+ void UpdateSuspendedStatusIfNeeded();
+private:
+ // Only suspends channel but not changes the suspend count.
+ void SuspendInternal();
+
+ nsIChannel* mChannel;
+ Atomic<uint32_t> mSuspendCount;
+ bool mIsChannelSuspended;
+};
+
+/**
+ * This is the MediaResource implementation that wraps Necko channels.
+ * Much of its functionality is actually delegated to MediaCache via
+ * an underlying MediaCacheStream.
+ *
+ * All synchronization is performed by MediaCacheStream; all off-main-
+ * thread operations are delegated directly to that object.
+ */
+class ChannelMediaResource : public BaseMediaResource
+{
+public:
+ ChannelMediaResource(MediaResourceCallback* aDecoder,
+ nsIChannel* aChannel,
+ nsIURI* aURI,
+ const nsACString& aContentType);
+ ~ChannelMediaResource();
+
+ // These are called on the main thread by MediaCache. These must
+ // not block or grab locks, because the media cache is holding its lock.
+ // Notify that data is available from the cache. This can happen even
+ // if this stream didn't read any data, since another stream might have
+ // received data for the same resource.
+ void CacheClientNotifyDataReceived();
+ // Notify that we reached the end of the stream. This can happen even
+ // if this stream didn't read any data, since another stream might have
+ // received data for the same resource.
+ void CacheClientNotifyDataEnded(nsresult aStatus);
+ // Notify that the principal for the cached resource changed.
+ void CacheClientNotifyPrincipalChanged();
+ // Notify the decoder that the cache suspended status changed.
+ void CacheClientNotifySuspendedStatusChanged();
+
+ // These are called on the main thread by MediaCache. These shouldn't block,
+ // but they may grab locks --- the media cache is not holding its lock
+ // when these are called.
+ // Start a new load at the given aOffset. The old load is cancelled
+ // and no more data from the old load will be notified via
+ // MediaCacheStream::NotifyDataReceived/Ended.
+ // This can fail.
+ nsresult CacheClientSeek(int64_t aOffset, bool aResume);
+ // Suspend the current load since data is currently not wanted
+ nsresult CacheClientSuspend();
+ // Resume the current load since data is wanted again
+ nsresult CacheClientResume();
+
+ // Ensure that the media cache writes any data held in its partial block.
+ // Called on the main thread.
+ void FlushCache() override;
+
+ // Notify that the last data byte range was loaded.
+ void NotifyLastByteRange() override;
+
+ // Main thread
+ nsresult Open(nsIStreamListener** aStreamListener) override;
+ nsresult Close() override;
+ void Suspend(bool aCloseImmediately) override;
+ void Resume() override;
+ already_AddRefed<nsIPrincipal> GetCurrentPrincipal() override;
+ // Return true if the stream has been closed.
+ bool IsClosed() const { return mCacheStream.IsClosed(); }
+ bool CanClone() override;
+ already_AddRefed<MediaResource> CloneData(MediaResourceCallback* aDecoder) override;
+ // Set statistics to be recorded to the object passed in. If not called,
+ // |ChannelMediaResource| will create it's own statistics objects in |Open|.
+ void RecordStatisticsTo(MediaChannelStatistics *aStatistics) override {
+ NS_ASSERTION(aStatistics, "Statistics param cannot be null!");
+ MutexAutoLock lock(mLock);
+ if (!mChannelStatistics) {
+ mChannelStatistics = aStatistics;
+ }
+ }
+ nsresult ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount) override;
+ void EnsureCacheUpToDate() override;
+
+ // Other thread
+ void SetReadMode(MediaCacheStream::ReadMode aMode) override;
+ void SetPlaybackRate(uint32_t aBytesPerSecond) override;
+ nsresult ReadAt(int64_t offset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes) override;
+ already_AddRefed<MediaByteBuffer> MediaReadAt(int64_t aOffset, uint32_t aCount) override;
+ int64_t Tell() override;
+
+ // Any thread
+ void Pin() override;
+ void Unpin() override;
+ double GetDownloadRate(bool* aIsReliable) override;
+ int64_t GetLength() override;
+ int64_t GetNextCachedData(int64_t aOffset) override;
+ int64_t GetCachedDataEnd(int64_t aOffset) override;
+ bool IsDataCachedToEndOfResource(int64_t aOffset) override;
+ bool IsSuspendedByCache() override;
+ bool IsSuspended() override;
+ bool IsTransportSeekable() override;
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override {
+ // Might be useful to track in the future:
+ // - mListener (seems minor)
+ // - mChannelStatistics (seems minor)
+ // owned if RecordStatisticsTo is not called
+ // - mDataReceivedEvent (seems minor)
+ size_t size = BaseMediaResource::SizeOfExcludingThis(aMallocSizeOf);
+ size += mCacheStream.SizeOfExcludingThis(aMallocSizeOf);
+
+ return size;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ class Listener final : public nsIStreamListener,
+ public nsIInterfaceRequestor,
+ public nsIChannelEventSink
+ {
+ ~Listener() {}
+ public:
+ explicit Listener(ChannelMediaResource* aResource) : mResource(aResource) {}
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIREQUESTOBSERVER
+ NS_DECL_NSISTREAMLISTENER
+ NS_DECL_NSICHANNELEVENTSINK
+ NS_DECL_NSIINTERFACEREQUESTOR
+
+ void Revoke() { mResource = nullptr; }
+
+ private:
+ RefPtr<ChannelMediaResource> mResource;
+ };
+ friend class Listener;
+
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override;
+
+protected:
+ // These are called on the main thread by Listener.
+ nsresult OnStartRequest(nsIRequest* aRequest);
+ nsresult OnStopRequest(nsIRequest* aRequest, nsresult aStatus);
+ nsresult OnDataAvailable(nsIRequest* aRequest,
+ nsIInputStream* aStream,
+ uint32_t aCount);
+ nsresult OnChannelRedirect(nsIChannel* aOld, nsIChannel* aNew, uint32_t aFlags);
+
+ // Opens the channel, using an HTTP byte range request to start at mOffset
+ // if possible. Main thread only.
+ nsresult OpenChannel(nsIStreamListener** aStreamListener);
+ nsresult RecreateChannel();
+ // Add headers to HTTP request. Main thread only.
+ nsresult SetupChannelHeaders();
+ // Closes the channel. Main thread only.
+ void CloseChannel();
+
+ // Parses 'Content-Range' header and returns results via parameters.
+ // Returns error if header is not available, values are not parse-able or
+ // values are out of range.
+ nsresult ParseContentRangeHeader(nsIHttpChannel * aHttpChan,
+ int64_t& aRangeStart,
+ int64_t& aRangeEnd,
+ int64_t& aRangeTotal);
+
+ void DoNotifyDataReceived();
+
+ static nsresult CopySegmentToCache(nsIInputStream *aInStream,
+ void *aClosure,
+ const char *aFromSegment,
+ uint32_t aToOffset,
+ uint32_t aCount,
+ uint32_t *aWriteCount);
+
+ // Main thread access only
+ int64_t mOffset;
+ RefPtr<Listener> mListener;
+ // A data received event for the decoder that has been dispatched but has
+ // not yet been processed.
+ nsRevocableEventPtr<nsRunnableMethod<ChannelMediaResource, void, false> > mDataReceivedEvent;
+ // When this flag is set, if we get a network error we should silently
+ // reopen the stream.
+ bool mReopenOnError;
+ // When this flag is set, we should not report the next close of the
+ // channel.
+ bool mIgnoreClose;
+
+ // Any thread access
+ MediaCacheStream mCacheStream;
+
+ // This lock protects mChannelStatistics
+ Mutex mLock;
+ RefPtr<MediaChannelStatistics> mChannelStatistics;
+
+ // True if we couldn't suspend the stream and we therefore don't want
+ // to resume later. This is usually due to the channel not being in the
+ // isPending state at the time of the suspend request.
+ bool mIgnoreResume;
+
+ ChannelSuspendAgent mSuspendAgent;
+};
+
+/**
+ * RAII class that handles pinning and unpinning for MediaResource and derived.
+ * This should be used when making calculations that involve potentially-cached
+ * MediaResource data, so that the state of the world can't change out from under
+ * us.
+ */
+template<class T>
+class MOZ_RAII AutoPinned {
+ public:
+ explicit AutoPinned(T* aResource MOZ_GUARD_OBJECT_NOTIFIER_PARAM) : mResource(aResource) {
+ MOZ_GUARD_OBJECT_NOTIFIER_INIT;
+ MOZ_ASSERT(mResource);
+ mResource->Pin();
+ }
+
+ ~AutoPinned() {
+ mResource->Unpin();
+ }
+
+ operator T*() const { return mResource; }
+ T* operator->() const MOZ_NO_ADDREF_RELEASE_ON_RETURN { return mResource; }
+
+private:
+ T* mResource;
+ MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
+};
+
+/*
+ * MediaResourceIndex provides a way to access MediaResource objects.
+ * Read, Seek and Tell must only be called on non-main threads.
+ * In the case of the Ogg Decoder they are called on the Decode thread for
+ * example. You must ensure that no threads are calling these methods once
+ * the MediaResource has been Closed.
+ */
+
+class MediaResourceIndex
+{
+public:
+ explicit MediaResourceIndex(MediaResource* aResource)
+ : mResource(aResource)
+ , mOffset(0)
+ {}
+
+ // Read up to aCount bytes from the stream. The buffer must have
+ // enough room for at least aCount bytes. Stores the number of
+ // actual bytes read in aBytes (0 on end of file).
+ // May read less than aCount bytes if the number of
+ // available bytes is less than aCount. Always check *aBytes after
+ // read, and call again if necessary.
+ nsresult Read(char* aBuffer, uint32_t aCount, uint32_t* aBytes);
+ // Seek to the given bytes offset in the stream. aWhence can be
+ // one of:
+ // NS_SEEK_SET
+ // NS_SEEK_CUR
+ // NS_SEEK_END
+ //
+ // In the Http strategy case the cancel will cause the http
+ // channel's listener to close the pipe, forcing an i/o error on any
+ // blocked read. This will allow the decode thread to complete the
+ // event.
+ //
+ // In the case of a seek in progress, the byte range request creates
+ // a new listener. This is done on the main thread via seek
+ // synchronously dispatching an event. This avoids the issue of us
+ // closing the listener but an outstanding byte range request
+ // creating a new one. They run on the same thread so no explicit
+ // synchronisation is required. The byte range request checks for
+ // the cancel flag and does not create a new channel or listener if
+ // we are cancelling.
+ //
+ // The default strategy does not do any seeking - the only issue is
+ // a blocked read which it handles by causing the listener to close
+ // the pipe, as per the http case.
+ //
+ // The file strategy doesn't block for any great length of time so
+ // is fine for a no-op cancel.
+ nsresult Seek(int32_t aWhence, int64_t aOffset);
+ // Report the current offset in bytes from the start of the stream.
+ int64_t Tell() const { return mOffset; }
+
+ // Return the underlying MediaResource.
+ MediaResource* GetResource() const { return mResource; }
+
+ // Read up to aCount bytes from the stream. The read starts at
+ // aOffset in the stream, seeking to that location initially if
+ // it is not the current stream offset.
+ // Unlike MediaResource::ReadAt, ReadAt only returns fewer bytes than
+ // requested if end of stream or an error is encountered. There is no need to
+ // call it again to get more data.
+ // *aBytes will contain the number of bytes copied, even if an error occurred.
+ // ReadAt doesn't have an impact on the offset returned by Tell().
+ nsresult ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes) const;
+
+ // Convenience methods, directly calling the MediaResource method of the same
+ // name.
+ // Those functions do not update the MediaResource offset as returned
+ // by Tell().
+
+ // This method returns nullptr if anything fails.
+ // Otherwise, it returns an owned buffer.
+ // MediaReadAt may return fewer bytes than requested if end of stream is
+ // encountered. There is no need to call it again to get more data.
+ already_AddRefed<MediaByteBuffer> MediaReadAt(int64_t aOffset, uint32_t aCount) const
+ {
+ return mResource->MediaReadAt(aOffset, aCount);
+ }
+ // Get the length of the stream in bytes. Returns -1 if not known.
+ // This can change over time; after a seek operation, a misbehaving
+ // server may give us a resource of a different length to what it had
+ // reported previously --- or it may just lie in its Content-Length
+ // header and give us more or less data than it reported. We will adjust
+ // the result of GetLength to reflect the data that's actually arriving.
+ int64_t GetLength() const { return mResource->GetLength(); }
+
+private:
+ RefPtr<MediaResource> mResource;
+ int64_t mOffset;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaResourceCallback.h b/dom/media/MediaResourceCallback.h
new file mode 100644
index 000000000..9c126f400
--- /dev/null
+++ b/dom/media/MediaResourceCallback.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaResourceCallback_h_
+#define MediaResourceCallback_h_
+
+#include "nsError.h"
+#include "nsISupportsImpl.h"
+
+namespace mozilla {
+
+class MediaDecoderOwner;
+class MediaResource;
+
+/**
+ * A callback used by MediaResource (sub-classes like FileMediaResource,
+ * RtspMediaResource, and ChannelMediaResource) to notify various events.
+ * Currently this is implemented by MediaDecoder only.
+ *
+ * Since this class has no pure virtual function, it is convenient to write
+ * gtests for the readers without using a mock MediaResource when you don't
+ * care about the events notified by the MediaResource.
+ */
+class MediaResourceCallback {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaResourceCallback);
+
+ // Returns a weak reference to the media decoder owner.
+ virtual MediaDecoderOwner* GetMediaOwner() const { return nullptr; }
+
+ // Notify is duration is known to this MediaResource.
+ virtual void SetInfinite(bool aInfinite) {}
+
+ // Notify that a network error is encountered.
+ virtual void NotifyNetworkError() {}
+
+ // Notify that decoding has failed.
+ virtual void NotifyDecodeError() {}
+
+ // Notify that data arrives on the stream and is read into the cache.
+ virtual void NotifyDataArrived() {}
+
+ // Notify that MediaResource has received some data.
+ virtual void NotifyBytesDownloaded() {}
+
+ // Notify download is ended.
+ // NOTE: this can be called with the media cache lock held, so don't
+ // block or do anything which might try to acquire a lock!
+ virtual void NotifyDataEnded(nsresult aStatus) {}
+
+ // Notify that the principal of MediaResource has changed.
+ virtual void NotifyPrincipalChanged() {}
+
+ // Notify that the "cache suspended" status of MediaResource changes.
+ virtual void NotifySuspendedStatusChanged() {}
+
+ // Notify the number of bytes read from the resource.
+ virtual void NotifyBytesConsumed(int64_t aBytes, int64_t aOffset) {}
+
+protected:
+ virtual ~MediaResourceCallback() {}
+};
+
+} // namespace mozilla
+
+#endif //MediaResourceCallback_h_
diff --git a/dom/media/MediaResult.h b/dom/media/MediaResult.h
new file mode 100644
index 000000000..c1e0af64c
--- /dev/null
+++ b/dom/media/MediaResult.h
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaResult_h_
+#define MediaResult_h_
+
+#include "nsError.h"
+#include "nsPrintfCString.h"
+
+// MediaResult can be used interchangeably with nsresult.
+// It allows to store extra information such as where the error occurred.
+// While nsresult is typically passed by value; due to its potential size, using
+// MediaResult const references is recommended.
+namespace mozilla {
+
+class MediaResult
+{
+public:
+ MOZ_IMPLICIT MediaResult(nsresult aResult)
+ : mCode(aResult)
+ {
+ }
+ MediaResult(nsresult aResult, const nsACString& aMessage)
+ : mCode(aResult)
+ , mMessage(aMessage)
+ {
+ }
+ MediaResult(nsresult aResult, const char* aMessage)
+ : mCode(aResult)
+ , mMessage(aMessage)
+ {
+ }
+ MediaResult(const MediaResult& aOther) = default;
+ MediaResult(MediaResult&& aOther) = default;
+ MediaResult& operator=(const MediaResult& aOther) = default;
+ MediaResult& operator=(MediaResult&& aOther) = default;
+
+ nsresult Code() const { return mCode; }
+ const nsCString& Message() const { return mMessage; }
+
+ // Interoperations with nsresult.
+ bool operator==(nsresult aResult) const { return aResult == mCode; }
+ bool operator!=(nsresult aResult) const { return aResult != mCode; }
+ operator nsresult () const { return mCode; }
+
+ nsCString Description() const
+ {
+ if (NS_SUCCEEDED(mCode)) {
+ return nsCString();
+ }
+ return nsPrintfCString("0x%08x: %s", mCode, mMessage.get());
+ }
+
+private:
+ nsresult mCode;
+ nsCString mMessage;
+};
+
+#define RESULT_DETAIL(arg, ...) nsPrintfCString("%s: " arg, __func__, ##__VA_ARGS__)
+
+} // namespace mozilla
+#endif // MediaResult_h_ \ No newline at end of file
diff --git a/dom/media/MediaSegment.h b/dom/media/MediaSegment.h
new file mode 100644
index 000000000..5c4805b30
--- /dev/null
+++ b/dom/media/MediaSegment.h
@@ -0,0 +1,508 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASEGMENT_H_
+#define MOZILLA_MEDIASEGMENT_H_
+
+#include "nsTArray.h"
+#include "nsIPrincipal.h"
+#include "nsProxyRelease.h"
+#ifdef MOZILLA_INTERNAL_API
+#include "mozilla/TimeStamp.h"
+#endif
+#include <algorithm>
+#include "Latency.h"
+
+namespace mozilla {
+
+/**
+ * Track or graph rate in Hz. Maximum 1 << TRACK_RATE_MAX_BITS Hz. This
+ * maximum avoids overflow in conversions between track rates and conversions
+ * from seconds.
+ */
+typedef int32_t TrackRate;
+const int64_t TRACK_RATE_MAX_BITS = 20;
+const TrackRate TRACK_RATE_MAX = 1 << TRACK_RATE_MAX_BITS;
+
+/**
+ * A number of ticks at a rate determined by some underlying track (e.g.
+ * audio sample rate). We want to make sure that multiplying TrackTicks by
+ * a TrackRate doesn't overflow, so we set its max accordingly.
+ * StreamTime should be used instead when we're working with MediaStreamGraph's
+ * rate, but TrackTicks can be used outside MediaStreams when we have data
+ * at a different rate.
+ */
+typedef int64_t TrackTicks;
+const int64_t TRACK_TICKS_MAX = INT64_MAX >> TRACK_RATE_MAX_BITS;
+
+/**
+ * We represent media times in 64-bit audio frame counts or ticks.
+ * All tracks in a MediaStreamGraph have the same rate.
+ */
+typedef int64_t MediaTime;
+const int64_t MEDIA_TIME_MAX = TRACK_TICKS_MAX;
+
+/**
+ * Media time relative to the start of a StreamTracks.
+ */
+typedef MediaTime StreamTime;
+const StreamTime STREAM_TIME_MAX = MEDIA_TIME_MAX;
+
+/**
+ * Media time relative to the start of the graph timeline.
+ */
+typedef MediaTime GraphTime;
+const GraphTime GRAPH_TIME_MAX = MEDIA_TIME_MAX;
+
+/**
+ * We pass the principal through the MediaStreamGraph by wrapping it in a thread
+ * safe nsMainThreadPtrHandle, since it cannot be used directly off the main
+ * thread. We can compare two PrincipalHandles to each other on any thread, but
+ * they can only be created and converted back to nsIPrincipal* on main thread.
+ */
+typedef nsMainThreadPtrHandle<nsIPrincipal> PrincipalHandle;
+
+inline PrincipalHandle MakePrincipalHandle(nsIPrincipal* aPrincipal)
+{
+ RefPtr<nsMainThreadPtrHolder<nsIPrincipal>> holder =
+ new nsMainThreadPtrHolder<nsIPrincipal>(aPrincipal);
+ return PrincipalHandle(holder);
+}
+
+#define PRINCIPAL_HANDLE_NONE nullptr
+
+inline nsIPrincipal* GetPrincipalFromHandle(PrincipalHandle& aPrincipalHandle)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return aPrincipalHandle.get();
+}
+
+inline bool PrincipalHandleMatches(PrincipalHandle& aPrincipalHandle,
+ nsIPrincipal* aOther)
+{
+ if (!aOther) {
+ return false;
+ }
+
+ nsIPrincipal* principal = GetPrincipalFromHandle(aPrincipalHandle);
+ if (!principal) {
+ return false;
+ }
+
+ bool result;
+ if (NS_FAILED(principal->Equals(aOther, &result))) {
+ NS_ERROR("Principal check failed");
+ return false;
+ }
+
+ return result;
+}
+
+/**
+ * A MediaSegment is a chunk of media data sequential in time. Different
+ * types of data have different subclasses of MediaSegment, all inheriting
+ * from MediaSegmentBase.
+ * All MediaSegment data is timed using StreamTime. The actual tick rate
+ * is defined on a per-track basis. For some track types, this can be
+ * a fixed constant for all tracks of that type (e.g. 1MHz for video).
+ *
+ * Each media segment defines a concept of "null media data" (e.g. silence
+ * for audio or "no video frame" for video), which can be efficiently
+ * represented. This is used for padding.
+ */
+class MediaSegment {
+public:
+ virtual ~MediaSegment()
+ {
+ MOZ_COUNT_DTOR(MediaSegment);
+ }
+
+ enum Type {
+ AUDIO,
+ VIDEO,
+ TYPE_COUNT
+ };
+
+ /**
+ * Gets the total duration of the segment.
+ */
+ StreamTime GetDuration() const { return mDuration; }
+ Type GetType() const { return mType; }
+
+ /**
+ * Gets the last principal id that was appended to this segment.
+ */
+ PrincipalHandle GetLastPrincipalHandle() const { return mLastPrincipalHandle; }
+ /**
+ * Called by the MediaStreamGraph as it appends a chunk with a different
+ * principal id than the current one.
+ */
+ void SetLastPrincipalHandle(PrincipalHandle aLastPrincipalHandle)
+ {
+ mLastPrincipalHandle = aLastPrincipalHandle;
+ }
+
+ /**
+ * Create a MediaSegment of the same type.
+ */
+ virtual MediaSegment* CreateEmptyClone() const = 0;
+ /**
+ * Moves contents of aSource to the end of this segment.
+ */
+ virtual void AppendFrom(MediaSegment* aSource) = 0;
+ /**
+ * Append a slice of aSource to this segment.
+ */
+ virtual void AppendSlice(const MediaSegment& aSource,
+ StreamTime aStart, StreamTime aEnd) = 0;
+ /**
+ * Replace all contents up to aDuration with null data.
+ */
+ virtual void ForgetUpTo(StreamTime aDuration) = 0;
+ /**
+ * Forget all data buffered after a given point
+ */
+ virtual void FlushAfter(StreamTime aNewEnd) = 0;
+ /**
+ * Insert aDuration of null data at the start of the segment.
+ */
+ virtual void InsertNullDataAtStart(StreamTime aDuration) = 0;
+ /**
+ * Insert aDuration of null data at the end of the segment.
+ */
+ virtual void AppendNullData(StreamTime aDuration) = 0;
+ /**
+ * Replace contents with disabled (silence/black) data of the same duration
+ */
+ virtual void ReplaceWithDisabled() = 0;
+ /**
+ * Replace contents with null data of the same duration
+ */
+ virtual void ReplaceWithNull() = 0;
+ /**
+ * Remove all contents, setting duration to 0.
+ */
+ virtual void Clear() = 0;
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return 0;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+protected:
+ explicit MediaSegment(Type aType)
+ : mDuration(0), mType(aType), mLastPrincipalHandle(PRINCIPAL_HANDLE_NONE)
+ {
+ MOZ_COUNT_CTOR(MediaSegment);
+ }
+
+ StreamTime mDuration; // total of mDurations of all chunks
+ Type mType;
+
+ // The latest principal handle that the MediaStreamGraph has processed for
+ // this segment.
+ PrincipalHandle mLastPrincipalHandle;
+};
+
+/**
+ * C is the implementation class subclassed from MediaSegmentBase.
+ * C must contain a Chunk class.
+ */
+template <class C, class Chunk> class MediaSegmentBase : public MediaSegment {
+public:
+ MediaSegment* CreateEmptyClone() const override
+ {
+ return new C();
+ }
+ void AppendFrom(MediaSegment* aSource) override
+ {
+ NS_ASSERTION(aSource->GetType() == C::StaticType(), "Wrong type");
+ AppendFromInternal(static_cast<C*>(aSource));
+ }
+ void AppendFrom(C* aSource)
+ {
+ AppendFromInternal(aSource);
+ }
+ void AppendSlice(const MediaSegment& aSource,
+ StreamTime aStart, StreamTime aEnd) override
+ {
+ NS_ASSERTION(aSource.GetType() == C::StaticType(), "Wrong type");
+ AppendSliceInternal(static_cast<const C&>(aSource), aStart, aEnd);
+ }
+ void AppendSlice(const C& aOther, StreamTime aStart, StreamTime aEnd)
+ {
+ AppendSliceInternal(aOther, aStart, aEnd);
+ }
+ /**
+ * Replace the first aDuration ticks with null media data, because the data
+ * will not be required again.
+ */
+ void ForgetUpTo(StreamTime aDuration) override
+ {
+ if (mChunks.IsEmpty() || aDuration <= 0) {
+ return;
+ }
+ if (mChunks[0].IsNull()) {
+ StreamTime extraToForget = std::min(aDuration, mDuration) - mChunks[0].GetDuration();
+ if (extraToForget > 0) {
+ RemoveLeading(extraToForget, 1);
+ mChunks[0].mDuration += extraToForget;
+ mDuration += extraToForget;
+ }
+ return;
+ }
+ RemoveLeading(aDuration, 0);
+ mChunks.InsertElementAt(0)->SetNull(aDuration);
+ mDuration += aDuration;
+ }
+ void FlushAfter(StreamTime aNewEnd) override
+ {
+ if (mChunks.IsEmpty()) {
+ return;
+ }
+
+ if (mChunks[0].IsNull()) {
+ StreamTime extraToKeep = aNewEnd - mChunks[0].GetDuration();
+ if (extraToKeep < 0) {
+ // reduce the size of the Null, get rid of everthing else
+ mChunks[0].SetNull(aNewEnd);
+ extraToKeep = 0;
+ }
+ RemoveTrailing(extraToKeep, 1);
+ } else {
+ if (aNewEnd > mDuration) {
+ NS_ASSERTION(aNewEnd <= mDuration, "can't add data in FlushAfter");
+ return;
+ }
+ RemoveTrailing(aNewEnd, 0);
+ }
+ mDuration = aNewEnd;
+ }
+ void InsertNullDataAtStart(StreamTime aDuration) override
+ {
+ if (aDuration <= 0) {
+ return;
+ }
+ if (!mChunks.IsEmpty() && mChunks[0].IsNull()) {
+ mChunks[0].mDuration += aDuration;
+ } else {
+ mChunks.InsertElementAt(0)->SetNull(aDuration);
+ }
+#ifdef MOZILLA_INTERNAL_API
+ mChunks[0].mTimeStamp = mozilla::TimeStamp::Now();
+#endif
+ mDuration += aDuration;
+ }
+ void AppendNullData(StreamTime aDuration) override
+ {
+ if (aDuration <= 0) {
+ return;
+ }
+ if (!mChunks.IsEmpty() && mChunks[mChunks.Length() - 1].IsNull()) {
+ mChunks[mChunks.Length() - 1].mDuration += aDuration;
+ } else {
+ mChunks.AppendElement()->SetNull(aDuration);
+ }
+ mDuration += aDuration;
+ }
+ void ReplaceWithDisabled() override
+ {
+ if (GetType() != AUDIO) {
+ MOZ_CRASH("Disabling unknown segment type");
+ }
+ ReplaceWithNull();
+ }
+ void ReplaceWithNull() override
+ {
+ StreamTime duration = GetDuration();
+ Clear();
+ AppendNullData(duration);
+ }
+ void Clear() override
+ {
+ mDuration = 0;
+ mChunks.Clear();
+ }
+
+ class ChunkIterator {
+ public:
+ explicit ChunkIterator(MediaSegmentBase<C, Chunk>& aSegment)
+ : mSegment(aSegment), mIndex(0) {}
+ bool IsEnded() { return mIndex >= mSegment.mChunks.Length(); }
+ void Next() { ++mIndex; }
+ Chunk& operator*() { return mSegment.mChunks[mIndex]; }
+ Chunk* operator->() { return &mSegment.mChunks[mIndex]; }
+ private:
+ MediaSegmentBase<C, Chunk>& mSegment;
+ uint32_t mIndex;
+ };
+ class ConstChunkIterator {
+ public:
+ explicit ConstChunkIterator(const MediaSegmentBase<C, Chunk>& aSegment)
+ : mSegment(aSegment), mIndex(0) {}
+ bool IsEnded() { return mIndex >= mSegment.mChunks.Length(); }
+ void Next() { ++mIndex; }
+ const Chunk& operator*() { return mSegment.mChunks[mIndex]; }
+ const Chunk* operator->() { return &mSegment.mChunks[mIndex]; }
+ private:
+ const MediaSegmentBase<C, Chunk>& mSegment;
+ uint32_t mIndex;
+ };
+
+ Chunk* FindChunkContaining(StreamTime aOffset, StreamTime* aStart = nullptr)
+ {
+ if (aOffset < 0) {
+ return nullptr;
+ }
+ StreamTime offset = 0;
+ for (uint32_t i = 0; i < mChunks.Length(); ++i) {
+ Chunk& c = mChunks[i];
+ StreamTime nextOffset = offset + c.GetDuration();
+ if (aOffset < nextOffset) {
+ if (aStart) {
+ *aStart = offset;
+ }
+ return &c;
+ }
+ offset = nextOffset;
+ }
+ return nullptr;
+ }
+
+ void RemoveLeading(StreamTime aDuration)
+ {
+ RemoveLeading(aDuration, 0);
+ }
+
+#ifdef MOZILLA_INTERNAL_API
+ void GetStartTime(TimeStamp &aTime) {
+ aTime = mChunks[0].mTimeStamp;
+ }
+#endif
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = mChunks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mChunks.Length(); i++) {
+ amount += mChunks[i].SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+ }
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ Chunk* GetLastChunk()
+ {
+ if (mChunks.IsEmpty()) {
+ return nullptr;
+ }
+ return &mChunks[mChunks.Length() - 1];
+ }
+
+protected:
+ explicit MediaSegmentBase(Type aType) : MediaSegment(aType) {}
+
+ /**
+ * Appends the contents of aSource to this segment, clearing aSource.
+ */
+ void AppendFromInternal(MediaSegmentBase<C, Chunk>* aSource)
+ {
+ MOZ_ASSERT(aSource->mDuration >= 0);
+ mDuration += aSource->mDuration;
+ aSource->mDuration = 0;
+ if (!mChunks.IsEmpty() && !aSource->mChunks.IsEmpty() &&
+ mChunks[mChunks.Length() - 1].CanCombineWithFollowing(aSource->mChunks[0])) {
+ mChunks[mChunks.Length() - 1].mDuration += aSource->mChunks[0].mDuration;
+ aSource->mChunks.RemoveElementAt(0);
+ }
+ mChunks.AppendElements(Move(aSource->mChunks));
+ }
+
+ void AppendSliceInternal(const MediaSegmentBase<C, Chunk>& aSource,
+ StreamTime aStart, StreamTime aEnd)
+ {
+ MOZ_ASSERT(aStart <= aEnd, "Endpoints inverted");
+ NS_ASSERTION(aStart >= 0 && aEnd <= aSource.mDuration, "Slice out of range");
+ mDuration += aEnd - aStart;
+ StreamTime offset = 0;
+ for (uint32_t i = 0; i < aSource.mChunks.Length() && offset < aEnd; ++i) {
+ const Chunk& c = aSource.mChunks[i];
+ StreamTime start = std::max(aStart, offset);
+ StreamTime nextOffset = offset + c.GetDuration();
+ StreamTime end = std::min(aEnd, nextOffset);
+ if (start < end) {
+ mChunks.AppendElement(c)->SliceTo(start - offset, end - offset);
+ }
+ offset = nextOffset;
+ }
+ }
+
+ Chunk* AppendChunk(StreamTime aDuration)
+ {
+ MOZ_ASSERT(aDuration >= 0);
+ Chunk* c = mChunks.AppendElement();
+ c->mDuration = aDuration;
+ mDuration += aDuration;
+ return c;
+ }
+
+ void RemoveLeading(StreamTime aDuration, uint32_t aStartIndex)
+ {
+ NS_ASSERTION(aDuration >= 0, "Can't remove negative duration");
+ StreamTime t = aDuration;
+ uint32_t chunksToRemove = 0;
+ for (uint32_t i = aStartIndex; i < mChunks.Length() && t > 0; ++i) {
+ Chunk* c = &mChunks[i];
+ if (c->GetDuration() > t) {
+ c->SliceTo(t, c->GetDuration());
+ t = 0;
+ break;
+ }
+ t -= c->GetDuration();
+ chunksToRemove = i + 1 - aStartIndex;
+ }
+ mChunks.RemoveElementsAt(aStartIndex, chunksToRemove);
+ mDuration -= aDuration - t;
+ }
+
+ void RemoveTrailing(StreamTime aKeep, uint32_t aStartIndex)
+ {
+ NS_ASSERTION(aKeep >= 0, "Can't keep negative duration");
+ StreamTime t = aKeep;
+ uint32_t i;
+ for (i = aStartIndex; i < mChunks.Length(); ++i) {
+ Chunk* c = &mChunks[i];
+ if (c->GetDuration() > t) {
+ c->SliceTo(0, t);
+ break;
+ }
+ t -= c->GetDuration();
+ if (t == 0) {
+ break;
+ }
+ }
+ if (i+1 < mChunks.Length()) {
+ mChunks.RemoveElementsAt(i+1, mChunks.Length() - (i+1));
+ }
+ // Caller must adjust mDuration
+ }
+
+ nsTArray<Chunk> mChunks;
+#ifdef MOZILLA_INTERNAL_API
+ mozilla::TimeStamp mTimeStamp;
+#endif
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_MEDIASEGMENT_H_ */
diff --git a/dom/media/MediaShutdownManager.cpp b/dom/media/MediaShutdownManager.cpp
new file mode 100644
index 000000000..089cd96a6
--- /dev/null
+++ b/dom/media/MediaShutdownManager.cpp
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/Logging.h"
+#include "mozilla/StaticPtr.h"
+#include "nsContentUtils.h"
+
+#include "MediaDecoder.h"
+#include "MediaShutdownManager.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+#define DECODER_LOG(type, msg) MOZ_LOG(gMediaDecoderLog, type, msg)
+
+NS_IMPL_ISUPPORTS(MediaShutdownManager, nsIAsyncShutdownBlocker)
+
+MediaShutdownManager::MediaShutdownManager()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(MediaShutdownManager);
+}
+
+MediaShutdownManager::~MediaShutdownManager()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_DTOR(MediaShutdownManager);
+}
+
+// Note that we don't use ClearOnShutdown() on this StaticRefPtr, as that
+// may interfere with our shutdown listener.
+StaticRefPtr<MediaShutdownManager> MediaShutdownManager::sInstance;
+
+MediaShutdownManager&
+MediaShutdownManager::Instance()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_DIAGNOSTIC_ASSERT(sInstance);
+ return *sInstance;
+}
+
+static nsCOMPtr<nsIAsyncShutdownClient>
+GetShutdownBarrier()
+{
+ nsCOMPtr<nsIAsyncShutdownService> svc = services::GetAsyncShutdown();
+ MOZ_RELEASE_ASSERT(svc);
+
+ nsCOMPtr<nsIAsyncShutdownClient> barrier;
+ nsresult rv = svc->GetProfileBeforeChange(getter_AddRefs(barrier));
+ if (!barrier) {
+ // We are probably in a content process. We need to do cleanup at
+ // XPCOM shutdown in leakchecking builds.
+ rv = svc->GetXpcomWillShutdown(getter_AddRefs(barrier));
+ }
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ MOZ_RELEASE_ASSERT(barrier);
+ return barrier.forget();
+}
+
+void
+MediaShutdownManager::InitStatics()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ static bool sInitDone = false;
+ if (sInitDone) {
+ return;
+ }
+
+ sInitDone = true;
+ sInstance = new MediaShutdownManager();
+
+ nsresult rv = GetShutdownBarrier()->AddBlocker(
+ sInstance, NS_LITERAL_STRING(__FILE__), __LINE__,
+ NS_LITERAL_STRING("MediaShutdownManager shutdown"));
+ if (NS_FAILED(rv)) {
+ MOZ_CRASH_UNSAFE_PRINTF("Failed to add shutdown blocker! rv=%x", uint32_t(rv));
+ }
+}
+
+void
+MediaShutdownManager::RemoveBlocker()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mIsDoingXPCOMShutDown);
+ MOZ_ASSERT(mDecoders.Count() == 0);
+ GetShutdownBarrier()->RemoveBlocker(this);
+ // Clear our singleton reference. This will probably delete
+ // this instance, so don't deref |this| clearing sInstance.
+ sInstance = nullptr;
+ DECODER_LOG(LogLevel::Debug, ("MediaShutdownManager::BlockShutdown() end."));
+}
+
+nsresult
+MediaShutdownManager::Register(MediaDecoder* aDecoder)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mIsDoingXPCOMShutDown) {
+ return NS_ERROR_ABORT;
+ }
+ // Don't call Register() after you've Unregistered() all the decoders,
+ // that's not going to work.
+ MOZ_ASSERT(!mDecoders.Contains(aDecoder));
+ mDecoders.PutEntry(aDecoder);
+ MOZ_ASSERT(mDecoders.Contains(aDecoder));
+ MOZ_ASSERT(mDecoders.Count() > 0);
+ return NS_OK;
+}
+
+void
+MediaShutdownManager::Unregister(MediaDecoder* aDecoder)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!mDecoders.Contains(aDecoder)) {
+ return;
+ }
+ mDecoders.RemoveEntry(aDecoder);
+ if (mIsDoingXPCOMShutDown && mDecoders.Count() == 0) {
+ RemoveBlocker();
+ }
+}
+
+NS_IMETHODIMP
+MediaShutdownManager::GetName(nsAString& aName)
+{
+ aName = NS_LITERAL_STRING("MediaShutdownManager: shutdown");
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaShutdownManager::GetState(nsIPropertyBag**)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaShutdownManager::BlockShutdown(nsIAsyncShutdownClient*)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(sInstance);
+
+ DECODER_LOG(LogLevel::Debug, ("MediaShutdownManager::BlockShutdown() start..."));
+
+ // Set this flag to ensure no Register() is allowed when Shutdown() begins.
+ mIsDoingXPCOMShutDown = true;
+
+ auto oldCount = mDecoders.Count();
+ if (oldCount == 0) {
+ RemoveBlocker();
+ return NS_OK;
+ }
+
+ // Iterate over the decoders and shut them down.
+ for (auto iter = mDecoders.Iter(); !iter.Done(); iter.Next()) {
+ iter.Get()->GetKey()->NotifyXPCOMShutdown();
+ // Check MediaDecoder::Shutdown doesn't call Unregister() synchronously in
+ // order not to corrupt our hashtable traversal.
+ MOZ_ASSERT(mDecoders.Count() == oldCount);
+ }
+
+ return NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaShutdownManager.h b/dom/media/MediaShutdownManager.h
new file mode 100644
index 000000000..071e93229
--- /dev/null
+++ b/dom/media/MediaShutdownManager.h
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaShutdownManager_h_)
+#define MediaShutdownManager_h_
+
+#include "mozilla/Monitor.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/StaticPtr.h"
+#include "nsCOMPtr.h"
+#include "nsIAsyncShutdown.h"
+#include "nsIThread.h"
+#include "nsHashKeys.h"
+#include "nsTHashtable.h"
+
+namespace mozilla {
+
+class MediaDecoder;
+
+// The MediaShutdownManager manages shutting down the MediaDecoder
+// infrastructure in response to an xpcom-shutdown notification.
+// This happens when Gecko is shutting down in the middle of operation.
+// This is tricky, as there are a number of moving parts that must
+// be shutdown in a particular order. The MediaShutdownManager
+// encapsulates all these dependencies to ensure that no shutdown
+// order dependencies leak out of the MediaDecoder stack.
+// The MediaShutdownManager is a singleton.
+//
+// The MediaShutdownManager ensures that the MediaDecoder stack
+// is shutdown before exiting xpcom-shutdown stage by registering
+// itself with nsIAsyncShutdownService to receive notification
+// when the stage of shutdown has started and then calls Shutdown()
+// on every MediaDecoder. Shutdown will not proceed until all
+// MediaDecoders finish shutdown and MediaShutdownManager unregisters
+// itself from the async shutdown service.
+//
+// Note that calling the Unregister() functions may result in the singleton
+// being deleted, so don't store references to the singleton, always use the
+// singleton by derefing the referenced returned by
+// MediaShutdownManager::Instance(), which ensures that the singleton is
+// created when needed.
+// i.e. like this:
+// MediaShutdownManager::Instance()::Unregister(someDecoder);
+// MediaShutdownManager::Instance()::Register(someOtherDecoder);
+// Not like this:
+// MediaShutdownManager& instance = MediaShutdownManager::Instance();
+// instance.Unregister(someDecoder); // Warning! May delete instance!
+// instance.Register(someOtherDecoder); // BAD! instance may be dangling!
+class MediaShutdownManager : public nsIAsyncShutdownBlocker {
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIASYNCSHUTDOWNBLOCKER
+
+ static void InitStatics();
+
+ // The MediaShutdownManager is a singleton, access its instance with
+ // this accessor.
+ static MediaShutdownManager& Instance();
+
+ // Notifies the MediaShutdownManager that it needs to track the shutdown
+ // of this MediaDecoder.
+ nsresult Register(MediaDecoder* aDecoder);
+
+ // Notifies the MediaShutdownManager that a MediaDecoder that it was
+ // tracking has shutdown, and it no longer needs to be shutdown in the
+ // xpcom-shutdown listener.
+ void Unregister(MediaDecoder* aDecoder);
+
+private:
+
+ MediaShutdownManager();
+ virtual ~MediaShutdownManager();
+ void RemoveBlocker();
+
+ static StaticRefPtr<MediaShutdownManager> sInstance;
+
+ // References to the MediaDecoder. The decoders unregister themselves
+ // in their Shutdown() method, so we'll drop the reference naturally when
+ // we're shutting down (in the non xpcom-shutdown case).
+ nsTHashtable<nsRefPtrHashKey<MediaDecoder>> mDecoders;
+
+ bool mIsDoingXPCOMShutDown = false;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaStatistics.h b/dom/media/MediaStatistics.h
new file mode 100644
index 000000000..c67c7e2bd
--- /dev/null
+++ b/dom/media/MediaStatistics.h
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaStatistics_h_
+#define MediaStatistics_h_
+
+namespace mozilla {
+
+struct MediaStatistics {
+ // Estimate of the current playback rate (bytes/second).
+ double mPlaybackRate;
+ // Estimate of the current download rate (bytes/second). This
+ // ignores time that the channel was paused by Gecko.
+ double mDownloadRate;
+ // Total length of media stream in bytes; -1 if not known
+ int64_t mTotalBytes;
+ // Current position of the download, in bytes. This is the offset of
+ // the first uncached byte after the decoder position.
+ int64_t mDownloadPosition;
+ // Current position of decoding, in bytes (how much of the stream
+ // has been consumed)
+ int64_t mDecoderPosition;
+ // Current position of playback, in bytes
+ int64_t mPlaybackPosition;
+ // If false, then mDownloadRate cannot be considered a reliable
+ // estimate (probably because the download has only been running
+ // a short time).
+ bool mDownloadRateReliable;
+ // If false, then mPlaybackRate cannot be considered a reliable
+ // estimate (probably because playback has only been running
+ // a short time).
+ bool mPlaybackRateReliable;
+
+ bool CanPlayThrough()
+ {
+ // Number of estimated seconds worth of data we need to have buffered
+ // ahead of the current playback position before we allow the media decoder
+ // to report that it can play through the entire media without the decode
+ // catching up with the download. Having this margin make the
+ // CanPlayThrough() calculation more stable in the case of
+ // fluctuating bitrates.
+ static const int64_t CAN_PLAY_THROUGH_MARGIN = 1;
+
+ if ((mTotalBytes < 0 && mDownloadRateReliable) ||
+ (mTotalBytes >= 0 && mTotalBytes == mDownloadPosition)) {
+ return true;
+ }
+
+ if (!mDownloadRateReliable || !mPlaybackRateReliable) {
+ return false;
+ }
+
+ int64_t bytesToDownload = mTotalBytes - mDownloadPosition;
+ int64_t bytesToPlayback = mTotalBytes - mPlaybackPosition;
+ double timeToDownload = bytesToDownload / mDownloadRate;
+ double timeToPlay = bytesToPlayback / mPlaybackRate;
+
+ if (timeToDownload > timeToPlay) {
+ // Estimated time to download is greater than the estimated time to play.
+ // We probably can't play through without having to stop to buffer.
+ return false;
+ }
+
+ // Estimated time to download is less than the estimated time to play.
+ // We can probably play through without having to buffer, but ensure that
+ // we've got a reasonable amount of data buffered after the current
+ // playback position, so that if the bitrate of the media fluctuates, or if
+ // our download rate or decode rate estimation is otherwise inaccurate,
+ // we don't suddenly discover that we need to buffer. This is particularly
+ // required near the start of the media, when not much data is downloaded.
+ int64_t readAheadMargin =
+ static_cast<int64_t>(mPlaybackRate * CAN_PLAY_THROUGH_MARGIN);
+ return mDownloadPosition > mPlaybackPosition + readAheadMargin;
+ }
+};
+
+} // namespace mozilla
+
+#endif // MediaStatistics_h_
diff --git a/dom/media/MediaStreamError.cpp b/dom/media/MediaStreamError.cpp
new file mode 100644
index 000000000..aa08e7a89
--- /dev/null
+++ b/dom/media/MediaStreamError.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamError.h"
+#include "mozilla/dom/MediaStreamErrorBinding.h"
+#include "nsContentUtils.h"
+
+namespace mozilla {
+
+BaseMediaMgrError::BaseMediaMgrError(const nsAString& aName,
+ const nsAString& aMessage,
+ const nsAString& aConstraint)
+ : mName(aName)
+ , mMessage(aMessage)
+ , mConstraint(aConstraint)
+{
+ if (mMessage.IsEmpty()) {
+ if (mName.EqualsLiteral("NotFoundError")) {
+ mMessage.AssignLiteral("The object can not be found here.");
+ } else if (mName.EqualsLiteral("NotAllowedError")) {
+ mMessage.AssignLiteral("The request is not allowed by the user agent "
+ "or the platform in the current context.");
+ } else if (mName.EqualsLiteral("SecurityError")) {
+ mMessage.AssignLiteral("The operation is insecure.");
+ } else if (mName.EqualsLiteral("NotReadableError")) {
+ mMessage.AssignLiteral("The I/O read operation failed.");
+ } else if (mName.EqualsLiteral("InternalError")) {
+ mMessage.AssignLiteral("Internal error.");
+ } else if (mName.EqualsLiteral("NotSupportedError")) {
+ mMessage.AssignLiteral("The operation is not supported.");
+ } else if (mName.EqualsLiteral("OverconstrainedError")) {
+ mMessage.AssignLiteral("Constraints could be not satisfied.");
+ }
+ }
+}
+
+
+NS_IMPL_ISUPPORTS0(MediaMgrError)
+
+namespace dom {
+
+MediaStreamError::MediaStreamError(
+ nsPIDOMWindowInner* aParent,
+ const nsAString& aName,
+ const nsAString& aMessage,
+ const nsAString& aConstraint)
+ : BaseMediaMgrError(aName, aMessage, aConstraint)
+ , mParent(aParent) {}
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(MediaStreamError, mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaStreamError)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaStreamError)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamError)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+ NS_INTERFACE_MAP_ENTRY(MediaStreamError)
+NS_INTERFACE_MAP_END
+
+JSObject*
+MediaStreamError::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaStreamErrorBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+MediaStreamError::GetName(nsAString& aName) const
+{
+ aName = mName;
+}
+
+void
+MediaStreamError::GetMessage(nsAString& aMessage) const
+{
+ aMessage = mMessage;
+}
+
+void
+MediaStreamError::GetConstraint(nsAString& aConstraint) const
+{
+ aConstraint = mConstraint;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaStreamError.h b/dom/media/MediaStreamError.h
new file mode 100644
index 000000000..53dd66674
--- /dev/null
+++ b/dom/media/MediaStreamError.h
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaStreamError_h
+#define mozilla_dom_MediaStreamError_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "nsWrapperCache.h"
+#include "js/TypeDecls.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/RefPtr.h"
+
+#if defined(XP_WIN) && defined(GetMessage)
+#undef GetMessage
+#endif
+
+namespace mozilla {
+namespace dom {
+
+#define MOZILLA_DOM_MEDIASTREAMERROR_IMPLEMENTATION_IID \
+{ 0x95fa29aa, 0x0cc2, 0x4698, \
+ { 0x9d, 0xa9, 0xf2, 0xeb, 0x03, 0x91, 0x0b, 0xd1 } }
+
+class MediaStreamError;
+} // namespace dom
+
+class BaseMediaMgrError
+{
+ friend class dom::MediaStreamError;
+protected:
+ BaseMediaMgrError(const nsAString& aName,
+ const nsAString& aMessage,
+ const nsAString& aConstraint);
+ const nsString mName;
+ nsString mMessage;
+ const nsString mConstraint;
+};
+
+class MediaMgrError final : public nsISupports,
+ public BaseMediaMgrError
+{
+public:
+ explicit MediaMgrError(const nsAString& aName,
+ const nsAString& aMessage = EmptyString(),
+ const nsAString& aConstraint = EmptyString())
+ : BaseMediaMgrError(aName, aMessage, aConstraint) {}
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+private:
+ ~MediaMgrError() {}
+};
+
+namespace dom {
+class MediaStreamError final : public nsISupports,
+ public BaseMediaMgrError,
+ public nsWrapperCache
+{
+public:
+ MediaStreamError(nsPIDOMWindowInner* aParent,
+ const nsAString& aName,
+ const nsAString& aMessage = EmptyString(),
+ const nsAString& aConstraint = EmptyString());
+
+ MediaStreamError(nsPIDOMWindowInner* aParent,
+ const BaseMediaMgrError& aOther)
+ : BaseMediaMgrError(aOther.mName, aOther.mMessage, aOther.mConstraint)
+ , mParent(aParent) {}
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MediaStreamError)
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIASTREAMERROR_IMPLEMENTATION_IID)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ nsPIDOMWindowInner* GetParentObject() const
+ {
+ return mParent;
+ }
+ void GetName(nsAString& aName) const;
+ void GetMessage(nsAString& aMessage) const;
+ void GetConstraint(nsAString& aConstraint) const;
+
+private:
+ virtual ~MediaStreamError() {}
+
+ RefPtr<nsPIDOMWindowInner> mParent;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(MediaStreamError,
+ MOZILLA_DOM_MEDIASTREAMERROR_IMPLEMENTATION_IID)
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaStreamGraph.cpp b/dom/media/MediaStreamGraph.cpp
new file mode 100644
index 000000000..94cafa029
--- /dev/null
+++ b/dom/media/MediaStreamGraph.cpp
@@ -0,0 +1,4007 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamGraphImpl.h"
+#include "mozilla/MathAlgorithms.h"
+#include "mozilla/Unused.h"
+
+#include "AudioSegment.h"
+#include "VideoSegment.h"
+#include "nsContentUtils.h"
+#include "nsIObserver.h"
+#include "nsPrintfCString.h"
+#include "nsServiceManagerUtils.h"
+#include "prerror.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Attributes.h"
+#include "TrackUnionStream.h"
+#include "ImageContainer.h"
+#include "AudioCaptureStream.h"
+#include "AudioChannelService.h"
+#include "AudioNodeStream.h"
+#include "AudioNodeExternalInputStream.h"
+#include "MediaStreamListener.h"
+#include "MediaStreamVideoSink.h"
+#include "mozilla/dom/AudioContextBinding.h"
+#include "mozilla/media/MediaUtils.h"
+#include <algorithm>
+#include "GeckoProfiler.h"
+#include "VideoFrameContainer.h"
+#include "mozilla/Unused.h"
+#include "mozilla/media/MediaUtils.h"
+#ifdef MOZ_WEBRTC
+#include "AudioOutputObserver.h"
+#endif
+#include "mtransport/runnable_utils.h"
+
+#include "webaudio/blink/HRTFDatabaseLoader.h"
+
+using namespace mozilla::layers;
+using namespace mozilla::dom;
+using namespace mozilla::gfx;
+using namespace mozilla::media;
+
+namespace mozilla {
+
+LazyLogModule gMediaStreamGraphLog("MediaStreamGraph");
+#define STREAM_LOG(type, msg) MOZ_LOG(gMediaStreamGraphLog, type, msg)
+
+// #define ENABLE_LIFECYCLE_LOG
+
+// We don't use NSPR log here because we want this interleaved with adb logcat
+// on Android/B2G
+#ifdef ENABLE_LIFECYCLE_LOG
+# ifdef ANDROID
+# include "android/log.h"
+# define LIFECYCLE_LOG(...) __android_log_print(ANDROID_LOG_INFO, "Gecko - MSG", ## __VA_ARGS__); printf(__VA_ARGS__);printf("\n");
+# else
+# define LIFECYCLE_LOG(...) printf(__VA_ARGS__);printf("\n");
+# endif
+#else
+# define LIFECYCLE_LOG(...)
+#endif
+
+enum SourceMediaStream::TrackCommands : uint32_t {
+ TRACK_CREATE = TrackEventCommand::TRACK_EVENT_CREATED,
+ TRACK_END = TrackEventCommand::TRACK_EVENT_ENDED,
+ TRACK_UNUSED = TrackEventCommand::TRACK_EVENT_UNUSED,
+};
+
+/**
+ * A hash table containing the graph instances, one per AudioChannel.
+ */
+static nsDataHashtable<nsUint32HashKey, MediaStreamGraphImpl*> gGraphs;
+
+MediaStreamGraphImpl::~MediaStreamGraphImpl()
+{
+ NS_ASSERTION(IsEmpty(),
+ "All streams should have been destroyed by messages from the main thread");
+ STREAM_LOG(LogLevel::Debug, ("MediaStreamGraph %p destroyed", this));
+ LIFECYCLE_LOG("MediaStreamGraphImpl::~MediaStreamGraphImpl\n");
+}
+
+void
+MediaStreamGraphImpl::FinishStream(MediaStream* aStream)
+{
+ if (aStream->mFinished)
+ return;
+ STREAM_LOG(LogLevel::Debug, ("MediaStream %p will finish", aStream));
+#ifdef DEBUG
+ for (StreamTracks::TrackIter track(aStream->mTracks);
+ !track.IsEnded(); track.Next()) {
+ if (!track->IsEnded()) {
+ STREAM_LOG(LogLevel::Error,
+ ("MediaStream %p will finish, but track %d has not ended.",
+ aStream, track->GetID()));
+ NS_ASSERTION(false, "Finished stream cannot contain live track");
+ }
+ }
+#endif
+ aStream->mFinished = true;
+ aStream->mTracks.AdvanceKnownTracksTime(STREAM_TIME_MAX);
+
+ SetStreamOrderDirty();
+}
+
+void
+MediaStreamGraphImpl::AddStreamGraphThread(MediaStream* aStream)
+{
+ aStream->mTracksStartTime = mProcessedTime;
+
+ if (aStream->AsSourceStream()) {
+ SourceMediaStream* source = aStream->AsSourceStream();
+ TimeStamp currentTimeStamp = CurrentDriver()->GetCurrentTimeStamp();
+ TimeStamp processedTimeStamp = currentTimeStamp +
+ TimeDuration::FromSeconds(MediaTimeToSeconds(mProcessedTime - IterationEnd()));
+ source->SetStreamTracksStartTimeStamp(processedTimeStamp);
+ }
+
+ if (aStream->IsSuspended()) {
+ mSuspendedStreams.AppendElement(aStream);
+ STREAM_LOG(LogLevel::Debug, ("Adding media stream %p to the graph, in the suspended stream array", aStream));
+ } else {
+ mStreams.AppendElement(aStream);
+ STREAM_LOG(LogLevel::Debug, ("Adding media stream %p to graph %p, count %lu", aStream, this, mStreams.Length()));
+ LIFECYCLE_LOG("Adding media stream %p to graph %p, count %lu", aStream, this, mStreams.Length());
+ }
+
+ SetStreamOrderDirty();
+}
+
+void
+MediaStreamGraphImpl::RemoveStreamGraphThread(MediaStream* aStream)
+{
+ // Remove references in mStreamUpdates before we allow aStream to die.
+ // Pending updates are not needed (since the main thread has already given
+ // up the stream) so we will just drop them.
+ {
+ MonitorAutoLock lock(mMonitor);
+ for (uint32_t i = 0; i < mStreamUpdates.Length(); ++i) {
+ if (mStreamUpdates[i].mStream == aStream) {
+ mStreamUpdates[i].mStream = nullptr;
+ }
+ }
+ }
+
+ // Ensure that mFirstCycleBreaker and mMixer are updated when necessary.
+ SetStreamOrderDirty();
+
+ if (aStream->IsSuspended()) {
+ mSuspendedStreams.RemoveElement(aStream);
+ } else {
+ mStreams.RemoveElement(aStream);
+ }
+
+ STREAM_LOG(LogLevel::Debug, ("Removed media stream %p from graph %p, count %lu",
+ aStream, this, mStreams.Length()));
+ LIFECYCLE_LOG("Removed media stream %p from graph %p, count %lu",
+ aStream, this, mStreams.Length());
+
+ NS_RELEASE(aStream); // probably destroying it
+}
+
+void
+MediaStreamGraphImpl::ExtractPendingInput(SourceMediaStream* aStream,
+ GraphTime aDesiredUpToTime,
+ bool* aEnsureNextIteration)
+{
+ bool finished;
+ {
+ MutexAutoLock lock(aStream->mMutex);
+ if (aStream->mPullEnabled && !aStream->mFinished &&
+ !aStream->mListeners.IsEmpty()) {
+ // Compute how much stream time we'll need assuming we don't block
+ // the stream at all.
+ StreamTime t = aStream->GraphTimeToStreamTime(aDesiredUpToTime);
+ STREAM_LOG(LogLevel::Verbose, ("Calling NotifyPull aStream=%p t=%f current end=%f", aStream,
+ MediaTimeToSeconds(t),
+ MediaTimeToSeconds(aStream->mTracks.GetEnd())));
+ if (t > aStream->mTracks.GetEnd()) {
+ *aEnsureNextIteration = true;
+#ifdef DEBUG
+ if (aStream->mListeners.Length() == 0) {
+ STREAM_LOG(LogLevel::Error, ("No listeners in NotifyPull aStream=%p desired=%f current end=%f",
+ aStream, MediaTimeToSeconds(t),
+ MediaTimeToSeconds(aStream->mTracks.GetEnd())));
+ aStream->DumpTrackInfo();
+ }
+#endif
+ for (uint32_t j = 0; j < aStream->mListeners.Length(); ++j) {
+ MediaStreamListener* l = aStream->mListeners[j];
+ {
+ MutexAutoUnlock unlock(aStream->mMutex);
+ l->NotifyPull(this, t);
+ }
+ }
+ }
+ }
+ finished = aStream->mUpdateFinished;
+ bool shouldNotifyTrackCreated = false;
+ for (int32_t i = aStream->mUpdateTracks.Length() - 1; i >= 0; --i) {
+ SourceMediaStream::TrackData* data = &aStream->mUpdateTracks[i];
+ aStream->ApplyTrackDisabling(data->mID, data->mData);
+ // Dealing with NotifyQueuedTrackChanges and NotifyQueuedAudioData part.
+
+ // The logic is different from the manipulating of aStream->mTracks part.
+ // So it is not combined with the manipulating of aStream->mTracks part.
+ StreamTime offset = (data->mCommands & SourceMediaStream::TRACK_CREATE)
+ ? data->mStart : aStream->mTracks.FindTrack(data->mID)->GetSegment()->GetDuration();
+
+ // Audio case.
+ if (data->mData->GetType() == MediaSegment::AUDIO) {
+ if (data->mCommands) {
+ MOZ_ASSERT(!(data->mCommands & SourceMediaStream::TRACK_UNUSED));
+ for (MediaStreamListener* l : aStream->mListeners) {
+ if (data->mCommands & SourceMediaStream::TRACK_END) {
+ l->NotifyQueuedAudioData(this, data->mID,
+ offset, *(static_cast<AudioSegment*>(data->mData.get())));
+ }
+ l->NotifyQueuedTrackChanges(this, data->mID,
+ offset, static_cast<TrackEventCommand>(data->mCommands), *data->mData);
+ if (data->mCommands & SourceMediaStream::TRACK_CREATE) {
+ l->NotifyQueuedAudioData(this, data->mID,
+ offset, *(static_cast<AudioSegment*>(data->mData.get())));
+ }
+ }
+ } else {
+ for (MediaStreamListener* l : aStream->mListeners) {
+ l->NotifyQueuedAudioData(this, data->mID,
+ offset, *(static_cast<AudioSegment*>(data->mData.get())));
+ }
+ }
+ }
+
+ // Video case.
+ if (data->mData->GetType() == MediaSegment::VIDEO) {
+ if (data->mCommands) {
+ MOZ_ASSERT(!(data->mCommands & SourceMediaStream::TRACK_UNUSED));
+ for (MediaStreamListener* l : aStream->mListeners) {
+ l->NotifyQueuedTrackChanges(this, data->mID,
+ offset, static_cast<TrackEventCommand>(data->mCommands), *data->mData);
+ }
+ }
+ }
+
+ for (TrackBound<MediaStreamTrackListener>& b : aStream->mTrackListeners) {
+ if (b.mTrackID != data->mID) {
+ continue;
+ }
+ b.mListener->NotifyQueuedChanges(this, offset, *data->mData);
+ if (data->mCommands & SourceMediaStream::TRACK_END) {
+ b.mListener->NotifyEnded();
+ }
+ }
+ if (data->mCommands & SourceMediaStream::TRACK_CREATE) {
+ MediaSegment* segment = data->mData.forget();
+ STREAM_LOG(LogLevel::Debug, ("SourceMediaStream %p creating track %d, start %lld, initial end %lld",
+ aStream, data->mID, int64_t(data->mStart),
+ int64_t(segment->GetDuration())));
+
+ data->mEndOfFlushedData += segment->GetDuration();
+ aStream->mTracks.AddTrack(data->mID, data->mStart, segment);
+ // The track has taken ownership of data->mData, so let's replace
+ // data->mData with an empty clone.
+ data->mData = segment->CreateEmptyClone();
+ data->mCommands &= ~SourceMediaStream::TRACK_CREATE;
+ shouldNotifyTrackCreated = true;
+ } else if (data->mData->GetDuration() > 0) {
+ MediaSegment* dest = aStream->mTracks.FindTrack(data->mID)->GetSegment();
+ STREAM_LOG(LogLevel::Verbose, ("SourceMediaStream %p track %d, advancing end from %lld to %lld",
+ aStream, data->mID,
+ int64_t(dest->GetDuration()),
+ int64_t(dest->GetDuration() + data->mData->GetDuration())));
+ data->mEndOfFlushedData += data->mData->GetDuration();
+ dest->AppendFrom(data->mData);
+ }
+ if (data->mCommands & SourceMediaStream::TRACK_END) {
+ aStream->mTracks.FindTrack(data->mID)->SetEnded();
+ aStream->mUpdateTracks.RemoveElementAt(i);
+ }
+ }
+ if (shouldNotifyTrackCreated) {
+ for (MediaStreamListener* l : aStream->mListeners) {
+ l->NotifyFinishedTrackCreation(this);
+ }
+ }
+ if (!aStream->mFinished) {
+ aStream->mTracks.AdvanceKnownTracksTime(aStream->mUpdateKnownTracksTime);
+ }
+ }
+ if (aStream->mTracks.GetEnd() > 0) {
+ aStream->mHasCurrentData = true;
+ }
+ if (finished) {
+ FinishStream(aStream);
+ }
+}
+
+StreamTime
+MediaStreamGraphImpl::GraphTimeToStreamTimeWithBlocking(MediaStream* aStream,
+ GraphTime aTime)
+{
+ MOZ_ASSERT(aTime <= mStateComputedTime,
+ "Don't ask about times where we haven't made blocking decisions yet");
+ return std::max<StreamTime>(0,
+ std::min(aTime, aStream->mStartBlocking) - aStream->mTracksStartTime);
+}
+
+GraphTime
+MediaStreamGraphImpl::IterationEnd() const
+{
+ return CurrentDriver()->IterationEnd();
+}
+
+void
+MediaStreamGraphImpl::UpdateCurrentTimeForStreams(GraphTime aPrevCurrentTime)
+{
+ for (MediaStream* stream : AllStreams()) {
+ bool isAnyBlocked = stream->mStartBlocking < mStateComputedTime;
+ bool isAnyUnblocked = stream->mStartBlocking > aPrevCurrentTime;
+
+ // Calculate blocked time and fire Blocked/Unblocked events
+ GraphTime blockedTime = mStateComputedTime - stream->mStartBlocking;
+ NS_ASSERTION(blockedTime >= 0, "Error in blocking time");
+ stream->AdvanceTimeVaryingValuesToCurrentTime(mStateComputedTime,
+ blockedTime);
+ STREAM_LOG(LogLevel::Verbose,
+ ("MediaStream %p bufferStartTime=%f blockedTime=%f", stream,
+ MediaTimeToSeconds(stream->mTracksStartTime),
+ MediaTimeToSeconds(blockedTime)));
+ stream->mStartBlocking = mStateComputedTime;
+
+ if (isAnyUnblocked && stream->mNotifiedBlocked) {
+ for (uint32_t j = 0; j < stream->mListeners.Length(); ++j) {
+ MediaStreamListener* l = stream->mListeners[j];
+ l->NotifyBlockingChanged(this, MediaStreamListener::UNBLOCKED);
+ }
+ stream->mNotifiedBlocked = false;
+ }
+ if (isAnyBlocked && !stream->mNotifiedBlocked) {
+ for (uint32_t j = 0; j < stream->mListeners.Length(); ++j) {
+ MediaStreamListener* l = stream->mListeners[j];
+ l->NotifyBlockingChanged(this, MediaStreamListener::BLOCKED);
+ }
+ stream->mNotifiedBlocked = true;
+ }
+
+ if (isAnyUnblocked) {
+ NS_ASSERTION(!stream->mNotifiedFinished,
+ "Shouldn't have already notified of finish *and* have output!");
+ for (uint32_t j = 0; j < stream->mListeners.Length(); ++j) {
+ MediaStreamListener* l = stream->mListeners[j];
+ l->NotifyOutput(this, mProcessedTime);
+ }
+ }
+
+ // The stream is fully finished when all of its track data has been played
+ // out.
+ if (stream->mFinished && !stream->mNotifiedFinished &&
+ mProcessedTime >=
+ stream->StreamTimeToGraphTime(stream->GetStreamTracks().GetAllTracksEnd())) {
+ stream->mNotifiedFinished = true;
+ SetStreamOrderDirty();
+ for (uint32_t j = 0; j < stream->mListeners.Length(); ++j) {
+ MediaStreamListener* l = stream->mListeners[j];
+ l->NotifyEvent(this, MediaStreamGraphEvent::EVENT_FINISHED);
+ }
+ }
+ }
+}
+
+template<typename C, typename Chunk>
+void
+MediaStreamGraphImpl::ProcessChunkMetadataForInterval(MediaStream* aStream,
+ TrackID aTrackID,
+ C& aSegment,
+ StreamTime aStart,
+ StreamTime aEnd)
+{
+ MOZ_ASSERT(aStream);
+ MOZ_ASSERT(IsTrackIDExplicit(aTrackID));
+
+ StreamTime offset = 0;
+ for (typename C::ConstChunkIterator chunk(aSegment);
+ !chunk.IsEnded(); chunk.Next()) {
+ if (offset >= aEnd) {
+ break;
+ }
+ offset += chunk->GetDuration();
+ if (chunk->IsNull() || offset < aStart) {
+ continue;
+ }
+ PrincipalHandle principalHandle = chunk->GetPrincipalHandle();
+ if (principalHandle != aSegment.GetLastPrincipalHandle()) {
+ aSegment.SetLastPrincipalHandle(principalHandle);
+ STREAM_LOG(LogLevel::Debug, ("MediaStream %p track %d, principalHandle "
+ "changed in %sChunk with duration %lld",
+ aStream, aTrackID,
+ aSegment.GetType() == MediaSegment::AUDIO
+ ? "Audio" : "Video",
+ (long long) chunk->GetDuration()));
+ for (const TrackBound<MediaStreamTrackListener>& listener : aStream->mTrackListeners) {
+ if (listener.mTrackID == aTrackID) {
+ listener.mListener->NotifyPrincipalHandleChanged(this, principalHandle);
+ }
+ }
+ }
+ }
+}
+
+void
+MediaStreamGraphImpl::ProcessChunkMetadata(GraphTime aPrevCurrentTime)
+{
+ for (MediaStream* stream : AllStreams()) {
+ StreamTime iterationStart = stream->GraphTimeToStreamTime(aPrevCurrentTime);
+ StreamTime iterationEnd = stream->GraphTimeToStreamTime(mProcessedTime);
+ for (StreamTracks::TrackIter tracks(stream->mTracks);
+ !tracks.IsEnded(); tracks.Next()) {
+ MediaSegment* segment = tracks->GetSegment();
+ if (!segment) {
+ continue;
+ }
+ if (tracks->GetType() == MediaSegment::AUDIO) {
+ AudioSegment* audio = static_cast<AudioSegment*>(segment);
+ ProcessChunkMetadataForInterval<AudioSegment, AudioChunk>(
+ stream, tracks->GetID(), *audio, iterationStart, iterationEnd);
+ } else if (tracks->GetType() == MediaSegment::VIDEO) {
+ VideoSegment* video = static_cast<VideoSegment*>(segment);
+ ProcessChunkMetadataForInterval<VideoSegment, VideoChunk>(
+ stream, tracks->GetID(), *video, iterationStart, iterationEnd);
+ } else {
+ MOZ_CRASH("Unknown track type");
+ }
+ }
+ }
+}
+
+GraphTime
+MediaStreamGraphImpl::WillUnderrun(MediaStream* aStream,
+ GraphTime aEndBlockingDecisions)
+{
+ // Finished streams can't underrun. ProcessedMediaStreams also can't cause
+ // underrun currently, since we'll always be able to produce data for them
+ // unless they block on some other stream.
+ if (aStream->mFinished || aStream->AsProcessedStream()) {
+ return aEndBlockingDecisions;
+ }
+ // This stream isn't finished or suspended. We don't need to call
+ // StreamTimeToGraphTime since an underrun is the only thing that can block
+ // it.
+ GraphTime bufferEnd = aStream->GetTracksEnd() + aStream->mTracksStartTime;
+#ifdef DEBUG
+ if (bufferEnd < mProcessedTime) {
+ STREAM_LOG(LogLevel::Error, ("MediaStream %p underrun, "
+ "bufferEnd %f < mProcessedTime %f (%lld < %lld), Streamtime %lld",
+ aStream, MediaTimeToSeconds(bufferEnd), MediaTimeToSeconds(mProcessedTime),
+ bufferEnd, mProcessedTime, aStream->GetTracksEnd()));
+ aStream->DumpTrackInfo();
+ NS_ASSERTION(bufferEnd >= mProcessedTime, "Buffer underran");
+ }
+#endif
+ return std::min(bufferEnd, aEndBlockingDecisions);
+}
+
+namespace {
+ // Value of mCycleMarker for unvisited streams in cycle detection.
+ const uint32_t NOT_VISITED = UINT32_MAX;
+ // Value of mCycleMarker for ordered streams in muted cycles.
+ const uint32_t IN_MUTED_CYCLE = 1;
+} // namespace
+
+bool
+MediaStreamGraphImpl::AudioTrackPresent(bool& aNeedsAEC)
+{
+ AssertOnGraphThreadOrNotRunning();
+
+ bool audioTrackPresent = false;
+ for (uint32_t i = 0; i < mStreams.Length() && audioTrackPresent == false; ++i) {
+ MediaStream* stream = mStreams[i];
+ SourceMediaStream* source = stream->AsSourceStream();
+#ifdef MOZ_WEBRTC
+ if (source && source->NeedsMixing()) {
+ aNeedsAEC = true;
+ }
+#endif
+ // If this is a AudioNodeStream, force a AudioCallbackDriver.
+ if (stream->AsAudioNodeStream()) {
+ audioTrackPresent = true;
+ } else {
+ for (StreamTracks::TrackIter tracks(stream->GetStreamTracks(), MediaSegment::AUDIO);
+ !tracks.IsEnded(); tracks.Next()) {
+ audioTrackPresent = true;
+ }
+ }
+ if (source) {
+ audioTrackPresent = source->HasPendingAudioTrack();
+ }
+ }
+
+ // XXX For some reason, there are race conditions when starting an audio input where
+ // we find no active audio tracks. In any case, if we have an active audio input we
+ // should not allow a switch back to a SystemClockDriver
+ if (!audioTrackPresent && mInputDeviceUsers.Count() != 0) {
+ NS_WARNING("No audio tracks, but full-duplex audio is enabled!!!!!");
+ audioTrackPresent = true;
+#ifdef MOZ_WEBRTC
+ aNeedsAEC = true;
+#endif
+ }
+
+ return audioTrackPresent;
+}
+
+void
+MediaStreamGraphImpl::UpdateStreamOrder()
+{
+ bool shouldAEC = false;
+ bool audioTrackPresent = AudioTrackPresent(shouldAEC);
+
+ // Note that this looks for any audio streams, input or output, and switches to a
+ // SystemClockDriver if there are none. However, if another is already pending, let that
+ // switch happen.
+
+ if (!audioTrackPresent && mRealtime &&
+ CurrentDriver()->AsAudioCallbackDriver()) {
+ MonitorAutoLock mon(mMonitor);
+ if (CurrentDriver()->AsAudioCallbackDriver()->IsStarted() &&
+ !(CurrentDriver()->Switching())) {
+ if (mLifecycleState == LIFECYCLE_RUNNING) {
+ SystemClockDriver* driver = new SystemClockDriver(this);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ }
+ }
+ }
+
+ bool switching = false;
+ {
+ MonitorAutoLock mon(mMonitor);
+ switching = CurrentDriver()->Switching();
+ }
+
+ if (audioTrackPresent && mRealtime &&
+ !CurrentDriver()->AsAudioCallbackDriver() &&
+ !switching) {
+ MonitorAutoLock mon(mMonitor);
+ if (mLifecycleState == LIFECYCLE_RUNNING) {
+ AudioCallbackDriver* driver = new AudioCallbackDriver(this);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ }
+ }
+
+#ifdef MOZ_WEBRTC
+ // Whenever we change AEC state, notify the current driver, which also
+ // will sample the state when the driver inits
+ if (shouldAEC && !mFarendObserverRef && gFarendObserver) {
+ mFarendObserverRef = gFarendObserver;
+ mMixer.AddCallback(mFarendObserverRef);
+ if (CurrentDriver()->AsAudioCallbackDriver()) {
+ CurrentDriver()->AsAudioCallbackDriver()->SetMicrophoneActive(true);
+ }
+ } else if (!shouldAEC && mFarendObserverRef){
+ if (mMixer.FindCallback(mFarendObserverRef)) {
+ mMixer.RemoveCallback(mFarendObserverRef);
+ mFarendObserverRef = nullptr;
+ if (CurrentDriver()->AsAudioCallbackDriver()) {
+ CurrentDriver()->AsAudioCallbackDriver()->SetMicrophoneActive(false);
+ }
+ }
+ }
+#endif
+
+ if (!mStreamOrderDirty) {
+ return;
+ }
+
+ mStreamOrderDirty = false;
+
+ // The algorithm for finding cycles is based on Tim Leslie's iterative
+ // implementation [1][2] of Pearce's variant [3] of Tarjan's strongly
+ // connected components (SCC) algorithm. There are variations (a) to
+ // distinguish whether streams in SCCs of size 1 are in a cycle and (b) to
+ // re-run the algorithm over SCCs with breaks at DelayNodes.
+ //
+ // [1] http://www.timl.id.au/?p=327
+ // [2] https://github.com/scipy/scipy/blob/e2c502fca/scipy/sparse/csgraph/_traversal.pyx#L582
+ // [3] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.1707
+ //
+ // There are two stacks. One for the depth-first search (DFS),
+ mozilla::LinkedList<MediaStream> dfsStack;
+ // and another for streams popped from the DFS stack, but still being
+ // considered as part of SCCs involving streams on the stack.
+ mozilla::LinkedList<MediaStream> sccStack;
+
+ // An index into mStreams for the next stream found with no unsatisfied
+ // upstream dependencies.
+ uint32_t orderedStreamCount = 0;
+
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaStream* s = mStreams[i];
+ ProcessedMediaStream* ps = s->AsProcessedStream();
+ if (ps) {
+ // The dfsStack initially contains a list of all processed streams in
+ // unchanged order.
+ dfsStack.insertBack(s);
+ ps->mCycleMarker = NOT_VISITED;
+ } else {
+ // SourceMediaStreams have no inputs and so can be ordered now.
+ mStreams[orderedStreamCount] = s;
+ ++orderedStreamCount;
+ }
+ }
+
+ // mNextStackMarker corresponds to "index" in Tarjan's algorithm. It is a
+ // counter to label mCycleMarker on the next visited stream in the DFS
+ // uniquely in the set of visited streams that are still being considered.
+ //
+ // In this implementation, the counter descends so that the values are
+ // strictly greater than the values that mCycleMarker takes when the stream
+ // has been ordered (0 or IN_MUTED_CYCLE).
+ //
+ // Each new stream labelled, as the DFS searches upstream, receives a value
+ // less than those used for all other streams being considered.
+ uint32_t nextStackMarker = NOT_VISITED - 1;
+ // Reset list of DelayNodes in cycles stored at the tail of mStreams.
+ mFirstCycleBreaker = mStreams.Length();
+
+ // Rearrange dfsStack order as required to DFS upstream and pop streams
+ // in processing order to place in mStreams.
+ while (auto ps = static_cast<ProcessedMediaStream*>(dfsStack.getFirst())) {
+ const auto& inputs = ps->mInputs;
+ MOZ_ASSERT(ps->AsProcessedStream());
+ if (ps->mCycleMarker == NOT_VISITED) {
+ // Record the position on the visited stack, so that any searches
+ // finding this stream again know how much of the stack is in the cycle.
+ ps->mCycleMarker = nextStackMarker;
+ --nextStackMarker;
+ // Not-visited input streams should be processed first.
+ // SourceMediaStreams have already been ordered.
+ for (uint32_t i = inputs.Length(); i--; ) {
+ if (inputs[i]->mSource->IsSuspended()) {
+ continue;
+ }
+ auto input = inputs[i]->mSource->AsProcessedStream();
+ if (input && input->mCycleMarker == NOT_VISITED) {
+ // It can be that this stream has an input which is from a suspended
+ // AudioContext.
+ if (input->isInList()) {
+ input->remove();
+ dfsStack.insertFront(input);
+ }
+ }
+ }
+ continue;
+ }
+
+ // Returning from DFS. Pop from dfsStack.
+ ps->remove();
+
+ // cycleStackMarker keeps track of the highest marker value on any
+ // upstream stream, if any, found receiving input, directly or indirectly,
+ // from the visited stack (and so from |ps|, making a cycle). In a
+ // variation from Tarjan's SCC algorithm, this does not include |ps|
+ // unless it is part of the cycle.
+ uint32_t cycleStackMarker = 0;
+ for (uint32_t i = inputs.Length(); i--; ) {
+ if (inputs[i]->mSource->IsSuspended()) {
+ continue;
+ }
+ auto input = inputs[i]->mSource->AsProcessedStream();
+ if (input) {
+ cycleStackMarker = std::max(cycleStackMarker, input->mCycleMarker);
+ }
+ }
+
+ if (cycleStackMarker <= IN_MUTED_CYCLE) {
+ // All inputs have been ordered and their stack markers have been removed.
+ // This stream is not part of a cycle. It can be processed next.
+ ps->mCycleMarker = 0;
+ mStreams[orderedStreamCount] = ps;
+ ++orderedStreamCount;
+ continue;
+ }
+
+ // A cycle has been found. Record this stream for ordering when all
+ // streams in this SCC have been popped from the DFS stack.
+ sccStack.insertFront(ps);
+
+ if (cycleStackMarker > ps->mCycleMarker) {
+ // Cycles have been found that involve streams that remain on the stack.
+ // Leave mCycleMarker indicating the most downstream (last) stream on
+ // the stack known to be part of this SCC. In this way, any searches on
+ // other paths that find |ps| will know (without having to traverse from
+ // this stream again) that they are part of this SCC (i.e. part of an
+ // intersecting cycle).
+ ps->mCycleMarker = cycleStackMarker;
+ continue;
+ }
+
+ // |ps| is the root of an SCC involving no other streams on dfsStack, the
+ // complete SCC has been recorded, and streams in this SCC are part of at
+ // least one cycle.
+ MOZ_ASSERT(cycleStackMarker == ps->mCycleMarker);
+ // If there are DelayNodes in this SCC, then they may break the cycles.
+ bool haveDelayNode = false;
+ auto next = sccStack.getFirst();
+ // Streams in this SCC are identified by mCycleMarker <= cycleStackMarker.
+ // (There may be other streams later in sccStack from other incompletely
+ // searched SCCs, involving streams still on dfsStack.)
+ //
+ // DelayNodes in cycles must behave differently from those not in cycles,
+ // so all DelayNodes in the SCC must be identified.
+ while (next && static_cast<ProcessedMediaStream*>(next)->
+ mCycleMarker <= cycleStackMarker) {
+ auto ns = next->AsAudioNodeStream();
+ // Get next before perhaps removing from list below.
+ next = next->getNext();
+ if (ns && ns->Engine()->AsDelayNodeEngine()) {
+ haveDelayNode = true;
+ // DelayNodes break cycles by producing their output in a
+ // preprocessing phase; they do not need to be ordered before their
+ // consumers. Order them at the tail of mStreams so that they can be
+ // handled specially. Do so now, so that DFS ignores them.
+ ns->remove();
+ ns->mCycleMarker = 0;
+ --mFirstCycleBreaker;
+ mStreams[mFirstCycleBreaker] = ns;
+ }
+ }
+ auto after_scc = next;
+ while ((next = sccStack.getFirst()) != after_scc) {
+ next->remove();
+ auto removed = static_cast<ProcessedMediaStream*>(next);
+ if (haveDelayNode) {
+ // Return streams to the DFS stack again (to order and detect cycles
+ // without delayNodes). Any of these streams that are still inputs
+ // for streams on the visited stack must be returned to the front of
+ // the stack to be ordered before their dependents. We know that none
+ // of these streams need input from streams on the visited stack, so
+ // they can all be searched and ordered before the current stack head
+ // is popped.
+ removed->mCycleMarker = NOT_VISITED;
+ dfsStack.insertFront(removed);
+ } else {
+ // Streams in cycles without any DelayNodes must be muted, and so do
+ // not need input and can be ordered now. They must be ordered before
+ // their consumers so that their muted output is available.
+ removed->mCycleMarker = IN_MUTED_CYCLE;
+ mStreams[orderedStreamCount] = removed;
+ ++orderedStreamCount;
+ }
+ }
+ }
+
+ MOZ_ASSERT(orderedStreamCount == mFirstCycleBreaker);
+}
+
+void
+MediaStreamGraphImpl::NotifyHasCurrentData(MediaStream* aStream)
+{
+ if (!aStream->mNotifiedHasCurrentData && aStream->mHasCurrentData) {
+ for (uint32_t j = 0; j < aStream->mListeners.Length(); ++j) {
+ MediaStreamListener* l = aStream->mListeners[j];
+ l->NotifyHasCurrentData(this);
+ }
+ aStream->mNotifiedHasCurrentData = true;
+ }
+}
+
+void
+MediaStreamGraphImpl::CreateOrDestroyAudioStreams(MediaStream* aStream)
+{
+ MOZ_ASSERT(mRealtime, "Should only attempt to create audio streams in real-time mode");
+
+ if (aStream->mAudioOutputs.IsEmpty()) {
+ aStream->mAudioOutputStreams.Clear();
+ return;
+ }
+
+ if (!aStream->GetStreamTracks().GetAndResetTracksDirty() &&
+ !aStream->mAudioOutputStreams.IsEmpty()) {
+ return;
+ }
+
+ STREAM_LOG(LogLevel::Debug, ("Updating AudioOutputStreams for MediaStream %p", aStream));
+
+ AutoTArray<bool,2> audioOutputStreamsFound;
+ for (uint32_t i = 0; i < aStream->mAudioOutputStreams.Length(); ++i) {
+ audioOutputStreamsFound.AppendElement(false);
+ }
+
+ for (StreamTracks::TrackIter tracks(aStream->GetStreamTracks(), MediaSegment::AUDIO);
+ !tracks.IsEnded(); tracks.Next()) {
+ uint32_t i;
+ for (i = 0; i < audioOutputStreamsFound.Length(); ++i) {
+ if (aStream->mAudioOutputStreams[i].mTrackID == tracks->GetID()) {
+ break;
+ }
+ }
+ if (i < audioOutputStreamsFound.Length()) {
+ audioOutputStreamsFound[i] = true;
+ } else {
+ MediaStream::AudioOutputStream* audioOutputStream =
+ aStream->mAudioOutputStreams.AppendElement();
+ audioOutputStream->mAudioPlaybackStartTime = mProcessedTime;
+ audioOutputStream->mBlockedAudioTime = 0;
+ audioOutputStream->mLastTickWritten = 0;
+ audioOutputStream->mTrackID = tracks->GetID();
+
+ bool switching = false;
+
+ {
+ MonitorAutoLock lock(mMonitor);
+ switching = CurrentDriver()->Switching();
+ }
+
+ if (!CurrentDriver()->AsAudioCallbackDriver() &&
+ !switching) {
+ MonitorAutoLock mon(mMonitor);
+ if (mLifecycleState == LIFECYCLE_RUNNING) {
+ AudioCallbackDriver* driver = new AudioCallbackDriver(this);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ }
+ }
+ }
+ }
+
+ for (int32_t i = audioOutputStreamsFound.Length() - 1; i >= 0; --i) {
+ if (!audioOutputStreamsFound[i]) {
+ aStream->mAudioOutputStreams.RemoveElementAt(i);
+ }
+ }
+}
+
+StreamTime
+MediaStreamGraphImpl::PlayAudio(MediaStream* aStream)
+{
+ MOZ_ASSERT(mRealtime, "Should only attempt to play audio in realtime mode");
+
+ float volume = 0.0f;
+ for (uint32_t i = 0; i < aStream->mAudioOutputs.Length(); ++i) {
+ volume += aStream->mAudioOutputs[i].mVolume;
+ }
+
+ StreamTime ticksWritten = 0;
+
+ for (uint32_t i = 0; i < aStream->mAudioOutputStreams.Length(); ++i) {
+ ticksWritten = 0;
+
+ MediaStream::AudioOutputStream& audioOutput = aStream->mAudioOutputStreams[i];
+ StreamTracks::Track* track = aStream->mTracks.FindTrack(audioOutput.mTrackID);
+ AudioSegment* audio = track->Get<AudioSegment>();
+ AudioSegment output;
+
+ StreamTime offset = aStream->GraphTimeToStreamTime(mProcessedTime);
+
+ // We don't update aStream->mTracksStartTime here to account for time spent
+ // blocked. Instead, we'll update it in UpdateCurrentTimeForStreams after
+ // the blocked period has completed. But we do need to make sure we play
+ // from the right offsets in the stream buffer, even if we've already
+ // written silence for some amount of blocked time after the current time.
+ GraphTime t = mProcessedTime;
+ while (t < mStateComputedTime) {
+ bool blocked = t >= aStream->mStartBlocking;
+ GraphTime end = blocked ? mStateComputedTime : aStream->mStartBlocking;
+ NS_ASSERTION(end <= mStateComputedTime, "mStartBlocking is wrong!");
+
+ // Check how many ticks of sound we can provide if we are blocked some
+ // time in the middle of this cycle.
+ StreamTime toWrite = end - t;
+
+ if (blocked) {
+ output.InsertNullDataAtStart(toWrite);
+ ticksWritten += toWrite;
+ STREAM_LOG(LogLevel::Verbose, ("MediaStream %p writing %ld blocking-silence samples for %f to %f (%ld to %ld)\n",
+ aStream, toWrite, MediaTimeToSeconds(t), MediaTimeToSeconds(end),
+ offset, offset + toWrite));
+ } else {
+ StreamTime endTicksNeeded = offset + toWrite;
+ StreamTime endTicksAvailable = audio->GetDuration();
+
+ if (endTicksNeeded <= endTicksAvailable) {
+ STREAM_LOG(LogLevel::Verbose,
+ ("MediaStream %p writing %ld samples for %f to %f "
+ "(samples %ld to %ld)\n",
+ aStream, toWrite, MediaTimeToSeconds(t),
+ MediaTimeToSeconds(end), offset, endTicksNeeded));
+ output.AppendSlice(*audio, offset, endTicksNeeded);
+ ticksWritten += toWrite;
+ offset = endTicksNeeded;
+ } else {
+ // MOZ_ASSERT(track->IsEnded(), "Not enough data, and track not ended.");
+ // If we are at the end of the track, maybe write the remaining
+ // samples, and pad with/output silence.
+ if (endTicksNeeded > endTicksAvailable &&
+ offset < endTicksAvailable) {
+ output.AppendSlice(*audio, offset, endTicksAvailable);
+ STREAM_LOG(LogLevel::Verbose,
+ ("MediaStream %p writing %ld samples for %f to %f "
+ "(samples %ld to %ld)\n",
+ aStream, toWrite, MediaTimeToSeconds(t),
+ MediaTimeToSeconds(end), offset, endTicksNeeded));
+ uint32_t available = endTicksAvailable - offset;
+ ticksWritten += available;
+ toWrite -= available;
+ offset = endTicksAvailable;
+ }
+ output.AppendNullData(toWrite);
+ STREAM_LOG(LogLevel::Verbose,
+ ("MediaStream %p writing %ld padding slsamples for %f to "
+ "%f (samples %ld to %ld)\n",
+ aStream, toWrite, MediaTimeToSeconds(t),
+ MediaTimeToSeconds(end), offset, endTicksNeeded));
+ ticksWritten += toWrite;
+ }
+ output.ApplyVolume(volume);
+ }
+ t = end;
+ }
+ audioOutput.mLastTickWritten = offset;
+
+ // Need unique id for stream & track - and we want it to match the inserter
+ output.WriteTo(LATENCY_STREAM_ID(aStream, track->GetID()),
+ mMixer, AudioChannelCount(),
+ mSampleRate);
+ }
+ return ticksWritten;
+}
+
+void
+MediaStreamGraphImpl::OpenAudioInputImpl(int aID,
+ AudioDataListener *aListener)
+{
+ // Bug 1238038 Need support for multiple mics at once
+ if (mInputDeviceUsers.Count() > 0 &&
+ !mInputDeviceUsers.Get(aListener, nullptr)) {
+ NS_ASSERTION(false, "Input from multiple mics not yet supported; bug 1238038");
+ // Need to support separate input-only AudioCallback drivers; they'll
+ // call us back on "other" threads. We will need to echo-cancel them, though.
+ return;
+ }
+ mInputWanted = true;
+
+ // Add to count of users for this ID.
+ // XXX Since we can't rely on IDs staying valid (ugh), use the listener as
+ // a stand-in for the ID. Fix as part of support for multiple-captures
+ // (Bug 1238038)
+ uint32_t count = 0;
+ mInputDeviceUsers.Get(aListener, &count); // ok if this fails
+ count++;
+ mInputDeviceUsers.Put(aListener, count); // creates a new entry in the hash if needed
+
+ if (count == 1) { // first open for this listener
+ // aID is a cubeb_devid, and we assume that opaque ptr is valid until
+ // we close cubeb.
+ mInputDeviceID = aID;
+ mAudioInputs.AppendElement(aListener); // always monitor speaker data
+
+ // Switch Drivers since we're adding input (to input-only or full-duplex)
+ MonitorAutoLock mon(mMonitor);
+ if (mLifecycleState == LIFECYCLE_RUNNING) {
+ AudioCallbackDriver* driver = new AudioCallbackDriver(this);
+ STREAM_LOG(LogLevel::Debug, ("OpenAudioInput: starting new AudioCallbackDriver(input) %p", driver));
+ LIFECYCLE_LOG("OpenAudioInput: starting new AudioCallbackDriver(input) %p", driver);
+ driver->SetInputListener(aListener);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ } else {
+ STREAM_LOG(LogLevel::Error, ("OpenAudioInput in shutdown!"));
+ LIFECYCLE_LOG("OpenAudioInput in shutdown!");
+ NS_ASSERTION(false, "Can't open cubeb inputs in shutdown");
+ }
+ }
+}
+
+nsresult
+MediaStreamGraphImpl::OpenAudioInput(int aID,
+ AudioDataListener *aListener)
+{
+ // So, so, so annoying. Can't AppendMessage except on Mainthread
+ if (!NS_IsMainThread()) {
+ NS_DispatchToMainThread(WrapRunnable(this,
+ &MediaStreamGraphImpl::OpenAudioInput,
+ aID, RefPtr<AudioDataListener>(aListener)));
+ return NS_OK;
+ }
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStreamGraphImpl *aGraph, int aID,
+ AudioDataListener *aListener) :
+ ControlMessage(nullptr), mGraph(aGraph), mID(aID), mListener(aListener) {}
+ virtual void Run()
+ {
+ mGraph->OpenAudioInputImpl(mID, mListener);
+ }
+ MediaStreamGraphImpl *mGraph;
+ int mID;
+ RefPtr<AudioDataListener> mListener;
+ };
+ // XXX Check not destroyed!
+ this->AppendMessage(MakeUnique<Message>(this, aID, aListener));
+ return NS_OK;
+}
+
+void
+MediaStreamGraphImpl::CloseAudioInputImpl(AudioDataListener *aListener)
+{
+ uint32_t count;
+ DebugOnly<bool> result = mInputDeviceUsers.Get(aListener, &count);
+ MOZ_ASSERT(result);
+ if (--count > 0) {
+ mInputDeviceUsers.Put(aListener, count);
+ return; // still in use
+ }
+ mInputDeviceUsers.Remove(aListener);
+ mInputDeviceID = -1;
+ mInputWanted = false;
+ AudioCallbackDriver *driver = CurrentDriver()->AsAudioCallbackDriver();
+ if (driver) {
+ driver->RemoveInputListener(aListener);
+ }
+ mAudioInputs.RemoveElement(aListener);
+
+ // Switch Drivers since we're adding or removing an input (to nothing/system or output only)
+ bool shouldAEC = false;
+ bool audioTrackPresent = AudioTrackPresent(shouldAEC);
+
+ MonitorAutoLock mon(mMonitor);
+ if (mLifecycleState == LIFECYCLE_RUNNING) {
+ GraphDriver* driver;
+ if (audioTrackPresent) {
+ // We still have audio output
+ STREAM_LOG(LogLevel::Debug, ("CloseInput: output present (AudioCallback)"));
+
+ driver = new AudioCallbackDriver(this);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ } else if (CurrentDriver()->AsAudioCallbackDriver()) {
+ STREAM_LOG(LogLevel::Debug, ("CloseInput: no output present (SystemClockCallback)"));
+
+ driver = new SystemClockDriver(this);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ } // else SystemClockDriver->SystemClockDriver, no switch
+ }
+}
+
+void
+MediaStreamGraphImpl::CloseAudioInput(AudioDataListener *aListener)
+{
+ // So, so, so annoying. Can't AppendMessage except on Mainthread
+ if (!NS_IsMainThread()) {
+ NS_DispatchToMainThread(WrapRunnable(this,
+ &MediaStreamGraphImpl::CloseAudioInput,
+ RefPtr<AudioDataListener>(aListener)));
+ return;
+ }
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStreamGraphImpl *aGraph, AudioDataListener *aListener) :
+ ControlMessage(nullptr), mGraph(aGraph), mListener(aListener) {}
+ virtual void Run()
+ {
+ mGraph->CloseAudioInputImpl(mListener);
+ }
+ MediaStreamGraphImpl *mGraph;
+ RefPtr<AudioDataListener> mListener;
+ };
+ this->AppendMessage(MakeUnique<Message>(this, aListener));
+}
+
+
+// All AudioInput listeners get the same speaker data (at least for now).
+void
+MediaStreamGraph::NotifyOutputData(AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels)
+{
+ for (auto& listener : mAudioInputs) {
+ listener->NotifyOutputData(this, aBuffer, aFrames, aRate, aChannels);
+ }
+}
+
+void
+MediaStreamGraph::AssertOnGraphThreadOrNotRunning() const
+{
+ // either we're on the right thread (and calling CurrentDriver() is safe),
+ // or we're going to assert anyways, so don't cross-check CurrentDriver
+#ifdef DEBUG
+ MediaStreamGraphImpl const * graph =
+ static_cast<MediaStreamGraphImpl const *>(this);
+ // if all the safety checks fail, assert we own the monitor
+ if (!graph->mDriver->OnThread()) {
+ if (!(graph->mDetectedNotRunning &&
+ graph->mLifecycleState > MediaStreamGraphImpl::LIFECYCLE_RUNNING &&
+ NS_IsMainThread())) {
+ graph->mMonitor.AssertCurrentThreadOwns();
+ }
+ }
+#endif
+}
+
+bool
+MediaStreamGraphImpl::ShouldUpdateMainThread()
+{
+ if (mRealtime) {
+ return true;
+ }
+
+ TimeStamp now = TimeStamp::Now();
+ if ((now - mLastMainThreadUpdate).ToMilliseconds() > CurrentDriver()->IterationDuration()) {
+ mLastMainThreadUpdate = now;
+ return true;
+ }
+ return false;
+}
+
+void
+MediaStreamGraphImpl::PrepareUpdatesToMainThreadState(bool aFinalUpdate)
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ // We don't want to frequently update the main thread about timing update
+ // when we are not running in realtime.
+ if (aFinalUpdate || ShouldUpdateMainThread()) {
+ // Strip updates that will be obsoleted below, so as to keep the length of
+ // mStreamUpdates sane.
+ size_t keptUpdateCount = 0;
+ for (size_t i = 0; i < mStreamUpdates.Length(); ++i) {
+ MediaStream* stream = mStreamUpdates[i].mStream;
+ // RemoveStreamGraphThread() clears mStream in updates for
+ // streams that are removed from the graph.
+ MOZ_ASSERT(!stream || stream->GraphImpl() == this);
+ if (!stream || stream->MainThreadNeedsUpdates()) {
+ // Discard this update as it has either been cleared when the stream
+ // was destroyed or there will be a newer update below.
+ continue;
+ }
+ if (keptUpdateCount != i) {
+ mStreamUpdates[keptUpdateCount] = Move(mStreamUpdates[i]);
+ MOZ_ASSERT(!mStreamUpdates[i].mStream);
+ }
+ ++keptUpdateCount;
+ }
+ mStreamUpdates.TruncateLength(keptUpdateCount);
+
+ mStreamUpdates.SetCapacity(mStreamUpdates.Length() + mStreams.Length() +
+ mSuspendedStreams.Length());
+ for (MediaStream* stream : AllStreams()) {
+ if (!stream->MainThreadNeedsUpdates()) {
+ continue;
+ }
+ StreamUpdate* update = mStreamUpdates.AppendElement();
+ update->mStream = stream;
+ // No blocking to worry about here, since we've passed
+ // UpdateCurrentTimeForStreams.
+ update->mNextMainThreadCurrentTime =
+ stream->GraphTimeToStreamTime(mProcessedTime);
+ update->mNextMainThreadFinished = stream->mNotifiedFinished;
+ }
+ if (!mPendingUpdateRunnables.IsEmpty()) {
+ mUpdateRunnables.AppendElements(Move(mPendingUpdateRunnables));
+ }
+ }
+
+ // If this is the final update, then a stable state event will soon be
+ // posted just before this thread finishes, and so there is no need to also
+ // post here.
+ if (!aFinalUpdate &&
+ // Don't send the message to the main thread if it's not going to have
+ // any work to do.
+ !(mUpdateRunnables.IsEmpty() && mStreamUpdates.IsEmpty())) {
+ EnsureStableStateEventPosted();
+ }
+}
+
+GraphTime
+MediaStreamGraphImpl::RoundUpToNextAudioBlock(GraphTime aTime)
+{
+ StreamTime ticks = aTime;
+ uint64_t block = ticks >> WEBAUDIO_BLOCK_SIZE_BITS;
+ uint64_t nextBlock = block + 1;
+ StreamTime nextTicks = nextBlock << WEBAUDIO_BLOCK_SIZE_BITS;
+ return nextTicks;
+}
+
+void
+MediaStreamGraphImpl::ProduceDataForStreamsBlockByBlock(uint32_t aStreamIndex,
+ TrackRate aSampleRate)
+{
+ MOZ_ASSERT(aStreamIndex <= mFirstCycleBreaker,
+ "Cycle breaker is not AudioNodeStream?");
+ GraphTime t = mProcessedTime;
+ while (t < mStateComputedTime) {
+ GraphTime next = RoundUpToNextAudioBlock(t);
+ for (uint32_t i = mFirstCycleBreaker; i < mStreams.Length(); ++i) {
+ auto ns = static_cast<AudioNodeStream*>(mStreams[i]);
+ MOZ_ASSERT(ns->AsAudioNodeStream());
+ ns->ProduceOutputBeforeInput(t);
+ }
+ for (uint32_t i = aStreamIndex; i < mStreams.Length(); ++i) {
+ ProcessedMediaStream* ps = mStreams[i]->AsProcessedStream();
+ if (ps) {
+ ps->ProcessInput(t, next,
+ (next == mStateComputedTime) ? ProcessedMediaStream::ALLOW_FINISH : 0);
+ }
+ }
+ t = next;
+ }
+ NS_ASSERTION(t == mStateComputedTime,
+ "Something went wrong with rounding to block boundaries");
+}
+
+bool
+MediaStreamGraphImpl::AllFinishedStreamsNotified()
+{
+ for (MediaStream* stream : AllStreams()) {
+ if (stream->mFinished && !stream->mNotifiedFinished) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void
+MediaStreamGraphImpl::RunMessageAfterProcessing(UniquePtr<ControlMessage> aMessage)
+{
+ MOZ_ASSERT(CurrentDriver()->OnThread());
+
+ if (mFrontMessageQueue.IsEmpty()) {
+ mFrontMessageQueue.AppendElement();
+ }
+
+ // Only one block is used for messages from the graph thread.
+ MOZ_ASSERT(mFrontMessageQueue.Length() == 1);
+ mFrontMessageQueue[0].mMessages.AppendElement(Move(aMessage));
+}
+
+void
+MediaStreamGraphImpl::RunMessagesInQueue()
+{
+ // Calculate independent action times for each batch of messages (each
+ // batch corresponding to an event loop task). This isolates the performance
+ // of different scripts to some extent.
+ for (uint32_t i = 0; i < mFrontMessageQueue.Length(); ++i) {
+ nsTArray<UniquePtr<ControlMessage>>& messages = mFrontMessageQueue[i].mMessages;
+
+ for (uint32_t j = 0; j < messages.Length(); ++j) {
+ messages[j]->Run();
+ }
+ }
+ mFrontMessageQueue.Clear();
+}
+
+void
+MediaStreamGraphImpl::UpdateGraph(GraphTime aEndBlockingDecisions)
+{
+ MOZ_ASSERT(aEndBlockingDecisions >= mProcessedTime);
+ // The next state computed time can be the same as the previous: it
+ // means the driver would be have been blocking indefinitly, but the graph has
+ // been woken up right after having been to sleep.
+ MOZ_ASSERT(aEndBlockingDecisions >= mStateComputedTime);
+
+ UpdateStreamOrder();
+
+ bool ensureNextIteration = false;
+
+ // Grab pending stream input and compute blocking time
+ for (MediaStream* stream : mStreams) {
+ if (SourceMediaStream* is = stream->AsSourceStream()) {
+ ExtractPendingInput(is, aEndBlockingDecisions, &ensureNextIteration);
+ }
+
+ if (stream->mFinished) {
+ // The stream's not suspended, and since it's finished, underruns won't
+ // stop it playing out. So there's no blocking other than what we impose
+ // here.
+ GraphTime endTime = stream->GetStreamTracks().GetAllTracksEnd() +
+ stream->mTracksStartTime;
+ if (endTime <= mStateComputedTime) {
+ STREAM_LOG(LogLevel::Verbose, ("MediaStream %p is blocked due to being finished", stream));
+ stream->mStartBlocking = mStateComputedTime;
+ } else {
+ STREAM_LOG(LogLevel::Verbose, ("MediaStream %p is finished, but not blocked yet (end at %f, with blocking at %f)",
+ stream, MediaTimeToSeconds(stream->GetTracksEnd()),
+ MediaTimeToSeconds(endTime)));
+ // Data can't be added to a finished stream, so underruns are irrelevant.
+ stream->mStartBlocking = std::min(endTime, aEndBlockingDecisions);
+ }
+ } else {
+ stream->mStartBlocking = WillUnderrun(stream, aEndBlockingDecisions);
+ }
+ }
+
+ for (MediaStream* stream : mSuspendedStreams) {
+ stream->mStartBlocking = mStateComputedTime;
+ }
+
+ // The loop is woken up so soon that IterationEnd() barely advances and we
+ // end up having aEndBlockingDecision == mStateComputedTime.
+ // Since stream blocking is computed in the interval of
+ // [mStateComputedTime, aEndBlockingDecision), it won't be computed at all.
+ // We should ensure next iteration so that pending blocking changes will be
+ // computed in next loop.
+ if (ensureNextIteration ||
+ aEndBlockingDecisions == mStateComputedTime) {
+ EnsureNextIteration();
+ }
+}
+
+void
+MediaStreamGraphImpl::Process()
+{
+ // Play stream contents.
+ bool allBlockedForever = true;
+ // True when we've done ProcessInput for all processed streams.
+ bool doneAllProducing = false;
+ // This is the number of frame that are written to the AudioStreams, for
+ // this cycle.
+ StreamTime ticksPlayed = 0;
+
+ mMixer.StartMixing();
+
+ // Figure out what each stream wants to do
+ for (uint32_t i = 0; i < mStreams.Length(); ++i) {
+ MediaStream* stream = mStreams[i];
+ if (!doneAllProducing) {
+ ProcessedMediaStream* ps = stream->AsProcessedStream();
+ if (ps) {
+ AudioNodeStream* n = stream->AsAudioNodeStream();
+ if (n) {
+#ifdef DEBUG
+ // Verify that the sampling rate for all of the following streams is the same
+ for (uint32_t j = i + 1; j < mStreams.Length(); ++j) {
+ AudioNodeStream* nextStream = mStreams[j]->AsAudioNodeStream();
+ if (nextStream) {
+ MOZ_ASSERT(n->SampleRate() == nextStream->SampleRate(),
+ "All AudioNodeStreams in the graph must have the same sampling rate");
+ }
+ }
+#endif
+ // Since an AudioNodeStream is present, go ahead and
+ // produce audio block by block for all the rest of the streams.
+ ProduceDataForStreamsBlockByBlock(i, n->SampleRate());
+ doneAllProducing = true;
+ } else {
+ ps->ProcessInput(mProcessedTime, mStateComputedTime,
+ ProcessedMediaStream::ALLOW_FINISH);
+ NS_ASSERTION(stream->mTracks.GetEnd() >=
+ GraphTimeToStreamTimeWithBlocking(stream, mStateComputedTime),
+ "Stream did not produce enough data");
+ }
+ }
+ }
+ NotifyHasCurrentData(stream);
+ // Only playback audio and video in real-time mode
+ if (mRealtime) {
+ CreateOrDestroyAudioStreams(stream);
+ if (CurrentDriver()->AsAudioCallbackDriver()) {
+ StreamTime ticksPlayedForThisStream = PlayAudio(stream);
+ if (!ticksPlayed) {
+ ticksPlayed = ticksPlayedForThisStream;
+ } else {
+ MOZ_ASSERT(!ticksPlayedForThisStream || ticksPlayedForThisStream == ticksPlayed,
+ "Each stream should have the same number of frame.");
+ }
+ }
+ }
+ if (stream->mStartBlocking > mProcessedTime) {
+ allBlockedForever = false;
+ }
+ }
+
+ if (CurrentDriver()->AsAudioCallbackDriver() && ticksPlayed) {
+ mMixer.FinishMixing();
+ }
+
+ if (!allBlockedForever) {
+ EnsureNextIteration();
+ }
+}
+
+bool
+MediaStreamGraphImpl::UpdateMainThreadState()
+{
+ MonitorAutoLock lock(mMonitor);
+ bool finalUpdate = mForceShutDown ||
+ (mProcessedTime >= mEndTime && AllFinishedStreamsNotified()) ||
+ (IsEmpty() && mBackMessageQueue.IsEmpty());
+ PrepareUpdatesToMainThreadState(finalUpdate);
+ if (finalUpdate) {
+ // Enter shutdown mode when this iteration is completed.
+ // No need to Destroy streams here. The main-thread owner of each
+ // stream is responsible for calling Destroy on them.
+ return false;
+ }
+
+ CurrentDriver()->WaitForNextIteration();
+
+ SwapMessageQueues();
+ return true;
+}
+
+bool
+MediaStreamGraphImpl::OneIteration(GraphTime aStateEnd)
+{
+ // Process graph message from the main thread for this iteration.
+ RunMessagesInQueue();
+
+ UpdateStreamOrder();
+
+ GraphTime stateEnd = std::min(aStateEnd, mEndTime);
+
+ UpdateGraph(stateEnd);
+
+ mStateComputedTime = stateEnd;
+
+ Process();
+
+ GraphTime oldProcessedTime = mProcessedTime;
+ mProcessedTime = stateEnd;
+
+ UpdateCurrentTimeForStreams(oldProcessedTime);
+
+ ProcessChunkMetadata(oldProcessedTime);
+
+ // Process graph messages queued from RunMessageAfterProcessing() on this
+ // thread during the iteration.
+ RunMessagesInQueue();
+
+ return UpdateMainThreadState();
+}
+
+void
+MediaStreamGraphImpl::ApplyStreamUpdate(StreamUpdate* aUpdate)
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ MediaStream* stream = aUpdate->mStream;
+ if (!stream)
+ return;
+ stream->mMainThreadCurrentTime = aUpdate->mNextMainThreadCurrentTime;
+ stream->mMainThreadFinished = aUpdate->mNextMainThreadFinished;
+
+ if (stream->ShouldNotifyStreamFinished()) {
+ stream->NotifyMainThreadListeners();
+ }
+}
+
+void
+MediaStreamGraphImpl::ForceShutDown(ShutdownTicket* aShutdownTicket)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Must be called on main thread");
+ STREAM_LOG(LogLevel::Debug, ("MediaStreamGraph %p ForceShutdown", this));
+
+ MonitorAutoLock lock(mMonitor);
+ if (aShutdownTicket) {
+ MOZ_ASSERT(!mForceShutdownTicket);
+ // Avoid waiting forever for a graph to shut down
+ // synchronously. Reports are that some 3rd-party audio drivers
+ // occasionally hang in shutdown (both for us and Chrome).
+ mShutdownTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+ if (!mShutdownTimer) {
+ return;
+ }
+ mShutdownTimer->InitWithCallback(this,
+ MediaStreamGraph::AUDIO_CALLBACK_DRIVER_SHUTDOWN_TIMEOUT,
+ nsITimer::TYPE_ONE_SHOT);
+ }
+ mForceShutDown = true;
+ mForceShutdownTicket = aShutdownTicket;
+ if (mLifecycleState == LIFECYCLE_THREAD_NOT_STARTED) {
+ // We *could* have just sent this a message to start up, so don't
+ // yank the rug out from under it. Tell it to startup and let it
+ // shut down.
+ RefPtr<GraphDriver> driver = CurrentDriver();
+ MonitorAutoUnlock unlock(mMonitor);
+ driver->Start();
+ }
+ EnsureNextIterationLocked();
+}
+
+NS_IMETHODIMP
+MediaStreamGraphImpl::Notify(nsITimer* aTimer)
+{
+ MonitorAutoLock lock(mMonitor);
+ NS_ASSERTION(!mForceShutdownTicket, "MediaStreamGraph took too long to shut down!");
+ // Sigh, graph took too long to shut down. Stop blocking system
+ // shutdown and hope all is well.
+ mForceShutdownTicket = nullptr;
+ return NS_OK;
+}
+
+
+/* static */ StaticRefPtr<nsIAsyncShutdownBlocker> gMediaStreamGraphShutdownBlocker;
+
+namespace {
+
+class MediaStreamGraphShutDownRunnable : public Runnable {
+public:
+ explicit MediaStreamGraphShutDownRunnable(MediaStreamGraphImpl* aGraph)
+ : mGraph(aGraph)
+ {}
+ NS_IMETHOD Run()
+ {
+ NS_ASSERTION(mGraph->mDetectedNotRunning,
+ "We should know the graph thread control loop isn't running!");
+
+ LIFECYCLE_LOG("Shutting down graph %p", mGraph.get());
+
+ // We've asserted the graph isn't running. Use mDriver instead of CurrentDriver
+ // to avoid thread-safety checks
+#if 0 // AudioCallbackDrivers are released asynchronously anyways
+ // XXX a better test would be have setting mDetectedNotRunning make sure
+ // any current callback has finished and block future ones -- or just
+ // handle it all in Shutdown()!
+ if (mGraph->mDriver->AsAudioCallbackDriver()) {
+ MOZ_ASSERT(!mGraph->mDriver->AsAudioCallbackDriver()->InCallback());
+ }
+#endif
+
+ mGraph->mDriver->Shutdown(); // This will wait until it's shutdown since
+ // we'll start tearing down the graph after this
+
+ // Safe to access these without the monitor since the graph isn't running.
+ // We may be one of several graphs. Drop ticket to eventually unblock shutdown.
+ if (mGraph->mShutdownTimer && !mGraph->mForceShutdownTicket) {
+ MOZ_ASSERT(false,
+ "AudioCallbackDriver took too long to shut down and we let shutdown"
+ " continue - freezing and leaking");
+
+ // The timer fired, so we may be deeper in shutdown now. Block any further
+ // teardown and just leak, for safety.
+ return NS_OK;
+ }
+ mGraph->mForceShutdownTicket = nullptr;
+
+ // We can't block past the final LIFECYCLE_WAITING_FOR_STREAM_DESTRUCTION
+ // stage, since completion of that stage requires all streams to be freed,
+ // which requires shutdown to proceed.
+
+ // mGraph's thread is not running so it's OK to do whatever here
+ if (mGraph->IsEmpty()) {
+ // mGraph is no longer needed, so delete it.
+ mGraph->Destroy();
+ } else {
+ // The graph is not empty. We must be in a forced shutdown, or a
+ // non-realtime graph that has finished processing. Some later
+ // AppendMessage will detect that the manager has been emptied, and
+ // delete it.
+ NS_ASSERTION(mGraph->mForceShutDown || !mGraph->mRealtime,
+ "Not in forced shutdown?");
+ for (MediaStream* stream : mGraph->AllStreams()) {
+ // Clean up all MediaSegments since we cannot release Images too
+ // late during shutdown.
+ if (SourceMediaStream* source = stream->AsSourceStream()) {
+ // Finishing a SourceStream prevents new data from being appended.
+ source->Finish();
+ }
+ stream->GetStreamTracks().Clear();
+ }
+
+ mGraph->mLifecycleState =
+ MediaStreamGraphImpl::LIFECYCLE_WAITING_FOR_STREAM_DESTRUCTION;
+ }
+ return NS_OK;
+ }
+private:
+ RefPtr<MediaStreamGraphImpl> mGraph;
+};
+
+class MediaStreamGraphStableStateRunnable : public Runnable {
+public:
+ explicit MediaStreamGraphStableStateRunnable(MediaStreamGraphImpl* aGraph,
+ bool aSourceIsMSG)
+ : mGraph(aGraph)
+ , mSourceIsMSG(aSourceIsMSG)
+ {
+ }
+ NS_IMETHOD Run() override
+ {
+ if (mGraph) {
+ mGraph->RunInStableState(mSourceIsMSG);
+ }
+ return NS_OK;
+ }
+private:
+ RefPtr<MediaStreamGraphImpl> mGraph;
+ bool mSourceIsMSG;
+};
+
+/*
+ * Control messages forwarded from main thread to graph manager thread
+ */
+class CreateMessage : public ControlMessage {
+public:
+ explicit CreateMessage(MediaStream* aStream) : ControlMessage(aStream) {}
+ void Run() override
+ {
+ mStream->GraphImpl()->AddStreamGraphThread(mStream);
+ }
+ void RunDuringShutdown() override
+ {
+ // Make sure to run this message during shutdown too, to make sure
+ // that we balance the number of streams registered with the graph
+ // as they're destroyed during shutdown.
+ Run();
+ }
+};
+
+} // namespace
+
+void
+MediaStreamGraphImpl::RunInStableState(bool aSourceIsMSG)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Must be called on main thread");
+
+ nsTArray<nsCOMPtr<nsIRunnable> > runnables;
+ // When we're doing a forced shutdown, pending control messages may be
+ // run on the main thread via RunDuringShutdown. Those messages must
+ // run without the graph monitor being held. So, we collect them here.
+ nsTArray<UniquePtr<ControlMessage>> controlMessagesToRunDuringShutdown;
+
+ {
+ MonitorAutoLock lock(mMonitor);
+ if (aSourceIsMSG) {
+ MOZ_ASSERT(mPostedRunInStableStateEvent);
+ mPostedRunInStableStateEvent = false;
+ }
+
+#ifdef ENABLE_LIFECYCLE_LOG
+ // This should be kept in sync with the LifecycleState enum in
+ // MediaStreamGraphImpl.h
+ const char * LifecycleState_str[] = {
+ "LIFECYCLE_THREAD_NOT_STARTED",
+ "LIFECYCLE_RUNNING",
+ "LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP",
+ "LIFECYCLE_WAITING_FOR_THREAD_SHUTDOWN",
+ "LIFECYCLE_WAITING_FOR_STREAM_DESTRUCTION"
+ };
+
+ if (mLifecycleState != LIFECYCLE_RUNNING) {
+ LIFECYCLE_LOG("Running %p in stable state. Current state: %s\n",
+ this, LifecycleState_str[mLifecycleState]);
+ }
+#endif
+
+ runnables.SwapElements(mUpdateRunnables);
+ for (uint32_t i = 0; i < mStreamUpdates.Length(); ++i) {
+ StreamUpdate* update = &mStreamUpdates[i];
+ if (update->mStream) {
+ ApplyStreamUpdate(update);
+ }
+ }
+ mStreamUpdates.Clear();
+
+ if (mCurrentTaskMessageQueue.IsEmpty()) {
+ if (mLifecycleState == LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP && IsEmpty()) {
+ // Complete shutdown. First, ensure that this graph is no longer used.
+ // A new graph graph will be created if one is needed.
+ // Asynchronously clean up old graph. We don't want to do this
+ // synchronously because it spins the event loop waiting for threads
+ // to shut down, and we don't want to do that in a stable state handler.
+ mLifecycleState = LIFECYCLE_WAITING_FOR_THREAD_SHUTDOWN;
+ LIFECYCLE_LOG("Sending MediaStreamGraphShutDownRunnable %p", this);
+ nsCOMPtr<nsIRunnable> event = new MediaStreamGraphShutDownRunnable(this );
+ NS_DispatchToMainThread(event.forget());
+
+ LIFECYCLE_LOG("Disconnecting MediaStreamGraph %p", this);
+ MediaStreamGraphImpl* graph;
+ if (gGraphs.Get(uint32_t(mAudioChannel), &graph) && graph == this) {
+ // null out gGraph if that's the graph being shut down
+ gGraphs.Remove(uint32_t(mAudioChannel));
+ }
+ }
+ } else {
+ if (mLifecycleState <= LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP) {
+ MessageBlock* block = mBackMessageQueue.AppendElement();
+ block->mMessages.SwapElements(mCurrentTaskMessageQueue);
+ EnsureNextIterationLocked();
+ }
+
+ // If the MediaStreamGraph has more messages going to it, try to revive
+ // it to process those messages. Don't do this if we're in a forced
+ // shutdown or it's a non-realtime graph that has already terminated
+ // processing.
+ if (mLifecycleState == LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP &&
+ mRealtime && !mForceShutDown) {
+ mLifecycleState = LIFECYCLE_RUNNING;
+ // Revive the MediaStreamGraph since we have more messages going to it.
+ // Note that we need to put messages into its queue before reviving it,
+ // or it might exit immediately.
+ {
+ LIFECYCLE_LOG("Reviving a graph (%p) ! %s\n",
+ this, CurrentDriver()->AsAudioCallbackDriver() ? "AudioDriver" :
+ "SystemDriver");
+ RefPtr<GraphDriver> driver = CurrentDriver();
+ MonitorAutoUnlock unlock(mMonitor);
+ driver->Revive();
+ }
+ }
+ }
+
+ // Don't start the thread for a non-realtime graph until it has been
+ // explicitly started by StartNonRealtimeProcessing.
+ if (mLifecycleState == LIFECYCLE_THREAD_NOT_STARTED &&
+ (mRealtime || mNonRealtimeProcessing)) {
+ mLifecycleState = LIFECYCLE_RUNNING;
+ // Start the thread now. We couldn't start it earlier because
+ // the graph might exit immediately on finding it has no streams. The
+ // first message for a new graph must create a stream.
+ {
+ // We should exit the monitor for now, because starting a stream might
+ // take locks, and we don't want to deadlock.
+ LIFECYCLE_LOG("Starting a graph (%p) ! %s\n",
+ this,
+ CurrentDriver()->AsAudioCallbackDriver() ? "AudioDriver" :
+ "SystemDriver");
+ RefPtr<GraphDriver> driver = CurrentDriver();
+ MonitorAutoUnlock unlock(mMonitor);
+ driver->Start();
+ }
+ }
+
+ if ((mForceShutDown || !mRealtime) &&
+ mLifecycleState == LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP) {
+ // Defer calls to RunDuringShutdown() to happen while mMonitor is not held.
+ for (uint32_t i = 0; i < mBackMessageQueue.Length(); ++i) {
+ MessageBlock& mb = mBackMessageQueue[i];
+ controlMessagesToRunDuringShutdown.AppendElements(Move(mb.mMessages));
+ }
+ mBackMessageQueue.Clear();
+ MOZ_ASSERT(mCurrentTaskMessageQueue.IsEmpty());
+ // Stop MediaStreamGraph threads. Do not clear gGraph since
+ // we have outstanding DOM objects that may need it.
+ mLifecycleState = LIFECYCLE_WAITING_FOR_THREAD_SHUTDOWN;
+ nsCOMPtr<nsIRunnable> event = new MediaStreamGraphShutDownRunnable(this);
+ NS_DispatchToMainThread(event.forget());
+ }
+
+ mDetectedNotRunning = mLifecycleState > LIFECYCLE_RUNNING;
+ }
+
+ // Make sure we get a new current time in the next event loop task
+ if (!aSourceIsMSG) {
+ MOZ_ASSERT(mPostedRunInStableState);
+ mPostedRunInStableState = false;
+ }
+
+ for (uint32_t i = 0; i < controlMessagesToRunDuringShutdown.Length(); ++i) {
+ controlMessagesToRunDuringShutdown[i]->RunDuringShutdown();
+ }
+
+#ifdef DEBUG
+ mCanRunMessagesSynchronously = mDetectedNotRunning &&
+ mLifecycleState >= LIFECYCLE_WAITING_FOR_THREAD_SHUTDOWN;
+#endif
+
+ for (uint32_t i = 0; i < runnables.Length(); ++i) {
+ runnables[i]->Run();
+ // "Direct" tail dispatcher are supposed to run immediately following the
+ // execution of the current task. So the meta-tasking that we do here in
+ // RunInStableState() breaks that abstraction a bit unless we handle it here.
+ //
+ // This is particularly important because we can end up with a "stream
+ // ended" notification immediately following a "stream available" notification,
+ // and we need to make sure that the watcher responding to "stream available"
+ // has a chance to run before the second notification starts tearing things
+ // down.
+ AbstractThread::MainThread()->TailDispatcher().DrainDirectTasks();
+ }
+}
+
+
+void
+MediaStreamGraphImpl::EnsureRunInStableState()
+{
+ NS_ASSERTION(NS_IsMainThread(), "main thread only");
+
+ if (mPostedRunInStableState)
+ return;
+ mPostedRunInStableState = true;
+ nsCOMPtr<nsIRunnable> event = new MediaStreamGraphStableStateRunnable(this, false);
+ nsContentUtils::RunInStableState(event.forget());
+}
+
+void
+MediaStreamGraphImpl::EnsureStableStateEventPosted()
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ if (mPostedRunInStableStateEvent)
+ return;
+ mPostedRunInStableStateEvent = true;
+ nsCOMPtr<nsIRunnable> event = new MediaStreamGraphStableStateRunnable(this, true);
+ NS_DispatchToMainThread(event.forget());
+}
+
+void
+MediaStreamGraphImpl::SignalMainThreadCleanup()
+{
+ MOZ_ASSERT(mDriver->OnThread());
+
+ MonitorAutoLock lock(mMonitor);
+ STREAM_LOG(LogLevel::Debug, ("MediaStreamGraph %p waiting for main thread cleanup", this));
+ mLifecycleState =
+ MediaStreamGraphImpl::LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP;
+ EnsureStableStateEventPosted();
+}
+
+void
+MediaStreamGraphImpl::AppendMessage(UniquePtr<ControlMessage> aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "main thread only");
+ MOZ_ASSERT(!aMessage->GetStream() ||
+ !aMessage->GetStream()->IsDestroyed(),
+ "Stream already destroyed");
+
+ if (mDetectedNotRunning &&
+ mLifecycleState > LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP) {
+ // The graph control loop is not running and main thread cleanup has
+ // happened. From now on we can't append messages to mCurrentTaskMessageQueue,
+ // because that will never be processed again, so just RunDuringShutdown
+ // this message.
+ // This should only happen during forced shutdown, or after a non-realtime
+ // graph has finished processing.
+#ifdef DEBUG
+ MOZ_ASSERT(mCanRunMessagesSynchronously);
+ mCanRunMessagesSynchronously = false;
+#endif
+ aMessage->RunDuringShutdown();
+#ifdef DEBUG
+ mCanRunMessagesSynchronously = true;
+#endif
+ if (IsEmpty() &&
+ mLifecycleState >= LIFECYCLE_WAITING_FOR_STREAM_DESTRUCTION) {
+
+ MediaStreamGraphImpl* graph;
+ if (gGraphs.Get(uint32_t(mAudioChannel), &graph) && graph == this) {
+ gGraphs.Remove(uint32_t(mAudioChannel));
+ }
+
+ Destroy();
+ }
+ return;
+ }
+
+ mCurrentTaskMessageQueue.AppendElement(Move(aMessage));
+ EnsureRunInStableState();
+}
+
+MediaStream::MediaStream()
+ : mTracksStartTime(0)
+ , mStartBlocking(GRAPH_TIME_MAX)
+ , mSuspendedCount(0)
+ , mFinished(false)
+ , mNotifiedFinished(false)
+ , mNotifiedBlocked(false)
+ , mHasCurrentData(false)
+ , mNotifiedHasCurrentData(false)
+ , mMainThreadCurrentTime(0)
+ , mMainThreadFinished(false)
+ , mFinishedNotificationSent(false)
+ , mMainThreadDestroyed(false)
+ , mNrOfMainThreadUsers(0)
+ , mGraph(nullptr)
+ , mAudioChannelType(dom::AudioChannel::Normal)
+{
+ MOZ_COUNT_CTOR(MediaStream);
+}
+
+MediaStream::~MediaStream()
+{
+ MOZ_COUNT_DTOR(MediaStream);
+ NS_ASSERTION(mMainThreadDestroyed, "Should have been destroyed already");
+ NS_ASSERTION(mMainThreadListeners.IsEmpty(),
+ "All main thread listeners should have been removed");
+}
+
+size_t
+MediaStream::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+
+ // Not owned:
+ // - mGraph - Not reported here
+ // - mConsumers - elements
+ // Future:
+ // - mVideoOutputs - elements
+ // - mLastPlayedVideoFrame
+ // - mListeners - elements
+ // - mAudioOutputStream - elements
+
+ amount += mTracks.SizeOfExcludingThis(aMallocSizeOf);
+ amount += mAudioOutputs.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mVideoOutputs.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mListeners.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mMainThreadListeners.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mDisabledTracks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mConsumers.ShallowSizeOfExcludingThis(aMallocSizeOf);
+
+ return amount;
+}
+
+size_t
+MediaStream::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+MediaStreamGraphImpl*
+MediaStream::GraphImpl()
+{
+ return mGraph;
+}
+
+MediaStreamGraph*
+MediaStream::Graph()
+{
+ return mGraph;
+}
+
+void
+MediaStream::SetGraphImpl(MediaStreamGraphImpl* aGraph)
+{
+ MOZ_ASSERT(!mGraph, "Should only be called once");
+ mGraph = aGraph;
+ mAudioChannelType = aGraph->AudioChannel();
+ mTracks.InitGraphRate(aGraph->GraphRate());
+}
+
+void
+MediaStream::SetGraphImpl(MediaStreamGraph* aGraph)
+{
+ MediaStreamGraphImpl* graph = static_cast<MediaStreamGraphImpl*>(aGraph);
+ SetGraphImpl(graph);
+}
+
+StreamTime
+MediaStream::GraphTimeToStreamTime(GraphTime aTime)
+{
+ NS_ASSERTION(mStartBlocking == GraphImpl()->mStateComputedTime ||
+ aTime <= mStartBlocking,
+ "Incorrectly ignoring blocking!");
+ return aTime - mTracksStartTime;
+}
+
+GraphTime
+MediaStream::StreamTimeToGraphTime(StreamTime aTime)
+{
+ NS_ASSERTION(mStartBlocking == GraphImpl()->mStateComputedTime ||
+ aTime + mTracksStartTime <= mStartBlocking,
+ "Incorrectly ignoring blocking!");
+ return aTime + mTracksStartTime;
+}
+
+StreamTime
+MediaStream::GraphTimeToStreamTimeWithBlocking(GraphTime aTime)
+{
+ return GraphImpl()->GraphTimeToStreamTimeWithBlocking(this, aTime);
+}
+
+void
+MediaStream::FinishOnGraphThread()
+{
+ GraphImpl()->FinishStream(this);
+}
+
+StreamTracks::Track*
+MediaStream::FindTrack(TrackID aID)
+{
+ return mTracks.FindTrack(aID);
+}
+
+StreamTracks::Track*
+MediaStream::EnsureTrack(TrackID aTrackId)
+{
+ StreamTracks::Track* track = mTracks.FindTrack(aTrackId);
+ if (!track) {
+ nsAutoPtr<MediaSegment> segment(new AudioSegment());
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ l->NotifyQueuedTrackChanges(Graph(), aTrackId, 0,
+ TrackEventCommand::TRACK_EVENT_CREATED,
+ *segment);
+ // TODO If we ever need to ensure several tracks at once, we will have to
+ // change this.
+ l->NotifyFinishedTrackCreation(Graph());
+ }
+ track = &mTracks.AddTrack(aTrackId, 0, segment.forget());
+ }
+ return track;
+}
+
+void
+MediaStream::RemoveAllListenersImpl()
+{
+ for (int32_t i = mListeners.Length() - 1; i >= 0; --i) {
+ RefPtr<MediaStreamListener> listener = mListeners[i].forget();
+ listener->NotifyEvent(GraphImpl(), MediaStreamGraphEvent::EVENT_REMOVED);
+ }
+ mListeners.Clear();
+}
+
+void
+MediaStream::DestroyImpl()
+{
+ for (int32_t i = mConsumers.Length() - 1; i >= 0; --i) {
+ mConsumers[i]->Disconnect();
+ }
+ mGraph = nullptr;
+}
+
+void
+MediaStream::Destroy()
+{
+ NS_ASSERTION(mNrOfMainThreadUsers == 0,
+ "Do not mix Destroy() and RegisterUser()/UnregisterUser()");
+ // Keep this stream alive until we leave this method
+ RefPtr<MediaStream> kungFuDeathGrip = this;
+
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaStream* aStream) : ControlMessage(aStream) {}
+ void Run() override
+ {
+ mStream->RemoveAllListenersImpl();
+ auto graph = mStream->GraphImpl();
+ mStream->DestroyImpl();
+ graph->RemoveStreamGraphThread(mStream);
+ }
+ void RunDuringShutdown() override
+ { Run(); }
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this));
+ // Message::RunDuringShutdown may have removed this stream from the graph,
+ // but our kungFuDeathGrip above will have kept this stream alive if
+ // necessary.
+ mMainThreadDestroyed = true;
+}
+
+void
+MediaStream::RegisterUser()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ ++mNrOfMainThreadUsers;
+}
+
+void
+MediaStream::UnregisterUser()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ --mNrOfMainThreadUsers;
+ NS_ASSERTION(mNrOfMainThreadUsers >= 0, "Double-removal of main thread user");
+ NS_ASSERTION(!IsDestroyed(), "Do not mix Destroy() and RegisterUser()/UnregisterUser()");
+ if (mNrOfMainThreadUsers == 0) {
+ Destroy();
+ }
+}
+
+void
+MediaStream::AddAudioOutput(void* aKey)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, void* aKey) : ControlMessage(aStream), mKey(aKey) {}
+ void Run() override
+ {
+ mStream->AddAudioOutputImpl(mKey);
+ }
+ void* mKey;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aKey));
+}
+
+void
+MediaStream::SetAudioOutputVolumeImpl(void* aKey, float aVolume)
+{
+ for (uint32_t i = 0; i < mAudioOutputs.Length(); ++i) {
+ if (mAudioOutputs[i].mKey == aKey) {
+ mAudioOutputs[i].mVolume = aVolume;
+ return;
+ }
+ }
+ NS_ERROR("Audio output key not found");
+}
+
+void
+MediaStream::SetAudioOutputVolume(void* aKey, float aVolume)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, void* aKey, float aVolume) :
+ ControlMessage(aStream), mKey(aKey), mVolume(aVolume) {}
+ void Run() override
+ {
+ mStream->SetAudioOutputVolumeImpl(mKey, mVolume);
+ }
+ void* mKey;
+ float mVolume;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aKey, aVolume));
+}
+
+void
+MediaStream::AddAudioOutputImpl(void* aKey)
+{
+ STREAM_LOG(LogLevel::Info, ("MediaStream %p Adding AudioOutput for key %p",
+ this, aKey));
+ mAudioOutputs.AppendElement(AudioOutput(aKey));
+}
+
+void
+MediaStream::RemoveAudioOutputImpl(void* aKey)
+{
+ STREAM_LOG(LogLevel::Info, ("MediaStream %p Removing AudioOutput for key %p",
+ this, aKey));
+ for (uint32_t i = 0; i < mAudioOutputs.Length(); ++i) {
+ if (mAudioOutputs[i].mKey == aKey) {
+ mAudioOutputs.RemoveElementAt(i);
+ return;
+ }
+ }
+ NS_ERROR("Audio output key not found");
+}
+
+void
+MediaStream::RemoveAudioOutput(void* aKey)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, void* aKey) :
+ ControlMessage(aStream), mKey(aKey) {}
+ void Run() override
+ {
+ mStream->RemoveAudioOutputImpl(mKey);
+ }
+ void* mKey;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aKey));
+}
+
+void
+MediaStream::AddVideoOutputImpl(already_AddRefed<MediaStreamVideoSink> aSink,
+ TrackID aID)
+{
+ RefPtr<MediaStreamVideoSink> sink = aSink;
+ STREAM_LOG(LogLevel::Info, ("MediaStream %p Adding MediaStreamVideoSink %p as output",
+ this, sink.get()));
+ MOZ_ASSERT(aID != TRACK_NONE);
+ for (auto entry : mVideoOutputs) {
+ if (entry.mListener == sink &&
+ (entry.mTrackID == TRACK_ANY || entry.mTrackID == aID)) {
+ return;
+ }
+ }
+ TrackBound<MediaStreamVideoSink>* l = mVideoOutputs.AppendElement();
+ l->mListener = sink;
+ l->mTrackID = aID;
+
+ AddDirectTrackListenerImpl(sink.forget(), aID);
+}
+
+void
+MediaStream::RemoveVideoOutputImpl(MediaStreamVideoSink* aSink,
+ TrackID aID)
+{
+ STREAM_LOG(LogLevel::Info, ("MediaStream %p Removing MediaStreamVideoSink %p as output",
+ this, aSink));
+ MOZ_ASSERT(aID != TRACK_NONE);
+
+ // Ensure that any frames currently queued for playback by the compositor
+ // are removed.
+ aSink->ClearFrames();
+ for (size_t i = 0; i < mVideoOutputs.Length(); ++i) {
+ if (mVideoOutputs[i].mListener == aSink &&
+ (mVideoOutputs[i].mTrackID == TRACK_ANY ||
+ mVideoOutputs[i].mTrackID == aID)) {
+ mVideoOutputs.RemoveElementAt(i);
+ }
+ }
+
+ RemoveDirectTrackListenerImpl(aSink, aID);
+}
+
+void
+MediaStream::AddVideoOutput(MediaStreamVideoSink* aSink, TrackID aID)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, MediaStreamVideoSink* aSink, TrackID aID) :
+ ControlMessage(aStream), mSink(aSink), mID(aID) {}
+ void Run() override
+ {
+ mStream->AddVideoOutputImpl(mSink.forget(), mID);
+ }
+ RefPtr<MediaStreamVideoSink> mSink;
+ TrackID mID;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aSink, aID));
+}
+
+void
+MediaStream::RemoveVideoOutput(MediaStreamVideoSink* aSink, TrackID aID)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, MediaStreamVideoSink* aSink, TrackID aID) :
+ ControlMessage(aStream), mSink(aSink), mID(aID) {}
+ void Run() override
+ {
+ mStream->RemoveVideoOutputImpl(mSink, mID);
+ }
+ RefPtr<MediaStreamVideoSink> mSink;
+ TrackID mID;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aSink, aID));
+}
+
+void
+MediaStream::Suspend()
+{
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaStream* aStream) :
+ ControlMessage(aStream) {}
+ void Run() override
+ {
+ mStream->GraphImpl()->IncrementSuspendCount(mStream);
+ }
+ };
+
+ // This can happen if this method has been called asynchronously, and the
+ // stream has been destroyed since then.
+ if (mMainThreadDestroyed) {
+ return;
+ }
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this));
+}
+
+void
+MediaStream::Resume()
+{
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaStream* aStream) :
+ ControlMessage(aStream) {}
+ void Run() override
+ {
+ mStream->GraphImpl()->DecrementSuspendCount(mStream);
+ }
+ };
+
+ // This can happen if this method has been called asynchronously, and the
+ // stream has been destroyed since then.
+ if (mMainThreadDestroyed) {
+ return;
+ }
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this));
+}
+
+void
+MediaStream::AddListenerImpl(already_AddRefed<MediaStreamListener> aListener)
+{
+ MediaStreamListener* listener = *mListeners.AppendElement() = aListener;
+ listener->NotifyBlockingChanged(GraphImpl(),
+ mNotifiedBlocked ? MediaStreamListener::BLOCKED : MediaStreamListener::UNBLOCKED);
+
+ for (StreamTracks::TrackIter it(mTracks); !it.IsEnded(); it.Next()) {
+ MediaStream* inputStream = nullptr;
+ TrackID inputTrackID = TRACK_INVALID;
+ if (ProcessedMediaStream* ps = AsProcessedStream()) {
+ // The only ProcessedMediaStream where we should have listeners is
+ // TrackUnionStream - it's what's used as owned stream in DOMMediaStream,
+ // the only main-thread exposed stream type.
+ // TrackUnionStream guarantees that each of its tracks has an input track.
+ // Other types do not implement GetInputStreamFor() and will return null.
+ inputStream = ps->GetInputStreamFor(it->GetID());
+ MOZ_ASSERT(inputStream);
+ inputTrackID = ps->GetInputTrackIDFor(it->GetID());
+ MOZ_ASSERT(IsTrackIDExplicit(inputTrackID));
+ }
+
+ uint32_t flags = TrackEventCommand::TRACK_EVENT_CREATED;
+ if (it->IsEnded()) {
+ flags |= TrackEventCommand::TRACK_EVENT_ENDED;
+ }
+ nsAutoPtr<MediaSegment> segment(it->GetSegment()->CreateEmptyClone());
+ listener->NotifyQueuedTrackChanges(Graph(), it->GetID(), it->GetEnd(),
+ static_cast<TrackEventCommand>(flags), *segment,
+ inputStream, inputTrackID);
+ }
+ if (mNotifiedFinished) {
+ listener->NotifyEvent(GraphImpl(), MediaStreamGraphEvent::EVENT_FINISHED);
+ }
+ if (mNotifiedHasCurrentData) {
+ listener->NotifyHasCurrentData(GraphImpl());
+ }
+}
+
+void
+MediaStream::AddListener(MediaStreamListener* aListener)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, MediaStreamListener* aListener) :
+ ControlMessage(aStream), mListener(aListener) {}
+ void Run() override
+ {
+ mStream->AddListenerImpl(mListener.forget());
+ }
+ RefPtr<MediaStreamListener> mListener;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aListener));
+}
+
+void
+MediaStream::RemoveListenerImpl(MediaStreamListener* aListener)
+{
+ // wouldn't need this if we could do it in the opposite order
+ RefPtr<MediaStreamListener> listener(aListener);
+ mListeners.RemoveElement(aListener);
+ listener->NotifyEvent(GraphImpl(), MediaStreamGraphEvent::EVENT_REMOVED);
+}
+
+void
+MediaStream::RemoveListener(MediaStreamListener* aListener)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, MediaStreamListener* aListener) :
+ ControlMessage(aStream), mListener(aListener) {}
+ void Run() override
+ {
+ mStream->RemoveListenerImpl(mListener);
+ }
+ RefPtr<MediaStreamListener> mListener;
+ };
+ // If the stream is destroyed the Listeners have or will be
+ // removed.
+ if (!IsDestroyed()) {
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aListener));
+ }
+}
+
+void
+MediaStream::AddTrackListenerImpl(already_AddRefed<MediaStreamTrackListener> aListener,
+ TrackID aTrackID)
+{
+ TrackBound<MediaStreamTrackListener>* l = mTrackListeners.AppendElement();
+ l->mListener = aListener;
+ l->mTrackID = aTrackID;
+
+ StreamTracks::Track* track = FindTrack(aTrackID);
+ if (!track) {
+ return;
+ }
+ PrincipalHandle lastPrincipalHandle =
+ track->GetSegment()->GetLastPrincipalHandle();
+ l->mListener->NotifyPrincipalHandleChanged(Graph(), lastPrincipalHandle);
+}
+
+void
+MediaStream::AddTrackListener(MediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, MediaStreamTrackListener* aListener,
+ TrackID aTrackID) :
+ ControlMessage(aStream), mListener(aListener), mTrackID(aTrackID) {}
+ virtual void Run()
+ {
+ mStream->AddTrackListenerImpl(mListener.forget(), mTrackID);
+ }
+ RefPtr<MediaStreamTrackListener> mListener;
+ TrackID mTrackID;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aListener, aTrackID));
+}
+
+void
+MediaStream::RemoveTrackListenerImpl(MediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ for (size_t i = 0; i < mTrackListeners.Length(); ++i) {
+ if (mTrackListeners[i].mListener == aListener &&
+ mTrackListeners[i].mTrackID == aTrackID) {
+ mTrackListeners[i].mListener->NotifyRemoved();
+ mTrackListeners.RemoveElementAt(i);
+ return;
+ }
+ }
+}
+
+void
+MediaStream::RemoveTrackListener(MediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, MediaStreamTrackListener* aListener,
+ TrackID aTrackID) :
+ ControlMessage(aStream), mListener(aListener), mTrackID(aTrackID) {}
+ virtual void Run()
+ {
+ mStream->RemoveTrackListenerImpl(mListener, mTrackID);
+ }
+ RefPtr<MediaStreamTrackListener> mListener;
+ TrackID mTrackID;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aListener, aTrackID));
+}
+
+void
+MediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
+ TrackID aTrackID)
+{
+ // Base implementation, for streams that don't support direct track listeners.
+ RefPtr<DirectMediaStreamTrackListener> listener = aListener;
+ listener->NotifyDirectListenerInstalled(
+ DirectMediaStreamTrackListener::InstallationResult::STREAM_NOT_SUPPORTED);
+}
+
+void
+MediaStream::AddDirectTrackListener(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID) :
+ ControlMessage(aStream), mListener(aListener), mTrackID(aTrackID) {}
+ virtual void Run()
+ {
+ mStream->AddDirectTrackListenerImpl(mListener.forget(), mTrackID);
+ }
+ RefPtr<DirectMediaStreamTrackListener> mListener;
+ TrackID mTrackID;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aListener, aTrackID));
+}
+
+void
+MediaStream::RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ // Base implementation, the listener was never added so nothing to do.
+ RefPtr<DirectMediaStreamTrackListener> listener = aListener;
+}
+
+void
+MediaStream::RemoveDirectTrackListener(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID) :
+ ControlMessage(aStream), mListener(aListener), mTrackID(aTrackID) {}
+ virtual void Run()
+ {
+ mStream->RemoveDirectTrackListenerImpl(mListener, mTrackID);
+ }
+ RefPtr<DirectMediaStreamTrackListener> mListener;
+ TrackID mTrackID;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aListener, aTrackID));
+}
+
+void
+MediaStream::RunAfterPendingUpdates(already_AddRefed<nsIRunnable> aRunnable)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaStreamGraphImpl* graph = GraphImpl();
+ nsCOMPtr<nsIRunnable> runnable(aRunnable);
+
+ // Special case when a non-realtime graph has not started, to ensure the
+ // runnable will run in finite time.
+ if (!(graph->mRealtime || graph->mNonRealtimeProcessing)) {
+ runnable->Run();
+ return;
+ }
+
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaStream* aStream,
+ already_AddRefed<nsIRunnable> aRunnable)
+ : ControlMessage(aStream)
+ , mRunnable(aRunnable) {}
+ void Run() override
+ {
+ mStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(mRunnable.forget());
+ }
+ void RunDuringShutdown() override
+ {
+ // Don't run mRunnable now as it may call AppendMessage() which would
+ // assume that there are no remaining controlMessagesToRunDuringShutdown.
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_DispatchToCurrentThread(mRunnable);
+ }
+ private:
+ nsCOMPtr<nsIRunnable> mRunnable;
+ };
+
+ graph->AppendMessage(MakeUnique<Message>(this, runnable.forget()));
+}
+
+void
+MediaStream::SetTrackEnabledImpl(TrackID aTrackID, DisabledTrackMode aMode)
+{
+ if (aMode == DisabledTrackMode::ENABLED) {
+ for (int32_t i = mDisabledTracks.Length() - 1; i >= 0; --i) {
+ if (aTrackID == mDisabledTracks[i].mTrackID) {
+ mDisabledTracks.RemoveElementAt(i);
+ return;
+ }
+ }
+ } else {
+ for (const DisabledTrack& t : mDisabledTracks) {
+ if (aTrackID == t.mTrackID) {
+ NS_ERROR("Changing disabled track mode for a track is not allowed");
+ return;
+ }
+ }
+ mDisabledTracks.AppendElement(Move(DisabledTrack(aTrackID, aMode)));
+ }
+}
+
+DisabledTrackMode
+MediaStream::GetDisabledTrackMode(TrackID aTrackID)
+{
+ for (const DisabledTrack& t : mDisabledTracks) {
+ if (t.mTrackID == aTrackID) {
+ return t.mMode;
+ }
+ }
+ return DisabledTrackMode::ENABLED;
+}
+
+void
+MediaStream::SetTrackEnabled(TrackID aTrackID, DisabledTrackMode aMode)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(MediaStream* aStream, TrackID aTrackID, DisabledTrackMode aMode) :
+ ControlMessage(aStream),
+ mTrackID(aTrackID),
+ mMode(aMode) {}
+ void Run() override
+ {
+ mStream->SetTrackEnabledImpl(mTrackID, mMode);
+ }
+ TrackID mTrackID;
+ DisabledTrackMode mMode;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aTrackID, aMode));
+}
+
+void
+MediaStream::ApplyTrackDisabling(TrackID aTrackID, MediaSegment* aSegment, MediaSegment* aRawSegment)
+{
+ DisabledTrackMode mode = GetDisabledTrackMode(aTrackID);
+ if (mode == DisabledTrackMode::ENABLED) {
+ return;
+ }
+ if (mode == DisabledTrackMode::SILENCE_BLACK) {
+ aSegment->ReplaceWithDisabled();
+ if (aRawSegment) {
+ aRawSegment->ReplaceWithDisabled();
+ }
+ } else if (mode == DisabledTrackMode::SILENCE_FREEZE) {
+ aSegment->ReplaceWithNull();
+ if (aRawSegment) {
+ aRawSegment->ReplaceWithNull();
+ }
+ } else {
+ MOZ_CRASH("Unsupported mode");
+ }
+}
+
+void
+MediaStream::AddMainThreadListener(MainThreadMediaStreamListener* aListener)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aListener);
+ MOZ_ASSERT(!mMainThreadListeners.Contains(aListener));
+
+ mMainThreadListeners.AppendElement(aListener);
+
+ // If it is not yet time to send the notification, then finish here.
+ if (!mFinishedNotificationSent) {
+ return;
+ }
+
+ class NotifyRunnable final : public Runnable
+ {
+ public:
+ explicit NotifyRunnable(MediaStream* aStream)
+ : mStream(aStream)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mStream->NotifyMainThreadListeners();
+ return NS_OK;
+ }
+
+ private:
+ ~NotifyRunnable() {}
+
+ RefPtr<MediaStream> mStream;
+ };
+
+ nsCOMPtr<nsIRunnable> runnable = new NotifyRunnable(this);
+ Unused << NS_WARN_IF(NS_FAILED(NS_DispatchToMainThread(runnable.forget())));
+}
+
+SourceMediaStream::SourceMediaStream() :
+ MediaStream(),
+ mMutex("mozilla::media::SourceMediaStream"),
+ mUpdateKnownTracksTime(0),
+ mPullEnabled(false),
+ mUpdateFinished(false),
+ mNeedsMixing(false)
+{
+}
+
+nsresult
+SourceMediaStream::OpenAudioInput(int aID,
+ AudioDataListener *aListener)
+{
+ if (GraphImpl()) {
+ mInputListener = aListener;
+ return GraphImpl()->OpenAudioInput(aID, aListener);
+ }
+ return NS_ERROR_FAILURE;
+}
+
+void
+SourceMediaStream::CloseAudioInput()
+{
+ // Destroy() may have run already and cleared this
+ if (GraphImpl() && mInputListener) {
+ GraphImpl()->CloseAudioInput(mInputListener);
+ }
+ mInputListener = nullptr;
+}
+
+void
+SourceMediaStream::DestroyImpl()
+{
+ CloseAudioInput();
+
+ GraphImpl()->AssertOnGraphThreadOrNotRunning();
+ for (int32_t i = mConsumers.Length() - 1; i >= 0; --i) {
+ // Disconnect before we come under mMutex's lock since it can call back
+ // through RemoveDirectTrackListenerImpl() and deadlock.
+ mConsumers[i]->Disconnect();
+ }
+
+ // Hold mMutex while mGraph is reset so that other threads holding mMutex
+ // can null-check know that the graph will not destroyed.
+ MutexAutoLock lock(mMutex);
+ MediaStream::DestroyImpl();
+}
+
+void
+SourceMediaStream::SetPullEnabled(bool aEnabled)
+{
+ MutexAutoLock lock(mMutex);
+ mPullEnabled = aEnabled;
+ if (mPullEnabled && GraphImpl()) {
+ GraphImpl()->EnsureNextIteration();
+ }
+}
+
+void
+SourceMediaStream::AddTrackInternal(TrackID aID, TrackRate aRate, StreamTime aStart,
+ MediaSegment* aSegment, uint32_t aFlags)
+{
+ MutexAutoLock lock(mMutex);
+ nsTArray<TrackData> *track_data = (aFlags & ADDTRACK_QUEUED) ?
+ &mPendingTracks : &mUpdateTracks;
+ TrackData* data = track_data->AppendElement();
+ LIFECYCLE_LOG("AddTrackInternal: %lu/%lu", mPendingTracks.Length(), mUpdateTracks.Length());
+ data->mID = aID;
+ data->mInputRate = aRate;
+ data->mResamplerChannelCount = 0;
+ data->mStart = aStart;
+ data->mEndOfFlushedData = aStart;
+ data->mCommands = TRACK_CREATE;
+ data->mData = aSegment;
+ ResampleAudioToGraphSampleRate(data, aSegment);
+ if (!(aFlags & ADDTRACK_QUEUED) && GraphImpl()) {
+ GraphImpl()->EnsureNextIteration();
+ }
+}
+
+void
+SourceMediaStream::AddAudioTrack(TrackID aID, TrackRate aRate, StreamTime aStart,
+ AudioSegment* aSegment, uint32_t aFlags)
+{
+ AddTrackInternal(aID, aRate, aStart, aSegment, aFlags);
+}
+
+void
+SourceMediaStream::FinishAddTracks()
+{
+ MutexAutoLock lock(mMutex);
+ mUpdateTracks.AppendElements(Move(mPendingTracks));
+ LIFECYCLE_LOG("FinishAddTracks: %lu/%lu", mPendingTracks.Length(), mUpdateTracks.Length());
+ if (GraphImpl()) {
+ GraphImpl()->EnsureNextIteration();
+ }
+}
+
+void
+SourceMediaStream::ResampleAudioToGraphSampleRate(TrackData* aTrackData, MediaSegment* aSegment)
+{
+ if (aSegment->GetType() != MediaSegment::AUDIO ||
+ aTrackData->mInputRate == GraphImpl()->GraphRate()) {
+ return;
+ }
+ AudioSegment* segment = static_cast<AudioSegment*>(aSegment);
+ int channels = segment->ChannelCount();
+
+ // If this segment is just silence, we delay instanciating the resampler. We
+ // also need to recreate the resampler if the channel count changes.
+ if (channels && aTrackData->mResamplerChannelCount != channels) {
+ SpeexResamplerState* state = speex_resampler_init(channels,
+ aTrackData->mInputRate,
+ GraphImpl()->GraphRate(),
+ SPEEX_RESAMPLER_QUALITY_MIN,
+ nullptr);
+ if (!state) {
+ return;
+ }
+ aTrackData->mResampler.own(state);
+ aTrackData->mResamplerChannelCount = channels;
+ }
+ segment->ResampleChunks(aTrackData->mResampler, aTrackData->mInputRate, GraphImpl()->GraphRate());
+}
+
+void
+SourceMediaStream::AdvanceTimeVaryingValuesToCurrentTime(GraphTime aCurrentTime,
+ GraphTime aBlockedTime)
+{
+ MutexAutoLock lock(mMutex);
+ mTracksStartTime += aBlockedTime;
+ mStreamTracksStartTimeStamp += TimeDuration::FromSeconds(GraphImpl()->MediaTimeToSeconds(aBlockedTime));
+ mTracks.ForgetUpTo(aCurrentTime - mTracksStartTime);
+}
+
+bool
+SourceMediaStream::AppendToTrack(TrackID aID, MediaSegment* aSegment, MediaSegment *aRawSegment)
+{
+ MutexAutoLock lock(mMutex);
+ // ::EndAllTrackAndFinished() can end these before the sources notice
+ bool appended = false;
+ auto graph = GraphImpl();
+ if (!mFinished && graph) {
+ TrackData *track = FindDataForTrack(aID);
+ if (track) {
+ // Data goes into mData, and on the next iteration of the MSG moves
+ // into the track's segment after NotifyQueuedTrackChanges(). This adds
+ // 0-10ms of delay before data gets to direct listeners.
+ // Indirect listeners (via subsequent TrackUnion nodes) are synced to
+ // playout time, and so can be delayed by buffering.
+
+ // Apply track disabling before notifying any consumers directly
+ // or inserting into the graph
+ ApplyTrackDisabling(aID, aSegment, aRawSegment);
+
+ ResampleAudioToGraphSampleRate(track, aSegment);
+
+ // Must notify first, since AppendFrom() will empty out aSegment
+ NotifyDirectConsumers(track, aRawSegment ? aRawSegment : aSegment);
+ track->mData->AppendFrom(aSegment); // note: aSegment is now dead
+ appended = true;
+ GraphImpl()->EnsureNextIteration();
+ } else {
+ aSegment->Clear();
+ }
+ }
+ return appended;
+}
+
+void
+SourceMediaStream::NotifyDirectConsumers(TrackData *aTrack,
+ MediaSegment *aSegment)
+{
+ mMutex.AssertCurrentThreadOwns();
+ MOZ_ASSERT(aTrack);
+
+ for (uint32_t j = 0; j < mDirectListeners.Length(); ++j) {
+ DirectMediaStreamListener* l = mDirectListeners[j];
+ StreamTime offset = 0; // FIX! need a separate StreamTime.... or the end of the internal buffer
+ l->NotifyRealtimeData(static_cast<MediaStreamGraph*>(GraphImpl()), aTrack->mID,
+ offset, aTrack->mCommands, *aSegment);
+ }
+
+ for (const TrackBound<DirectMediaStreamTrackListener>& source
+ : mDirectTrackListeners) {
+ if (aTrack->mID != source.mTrackID) {
+ continue;
+ }
+ StreamTime offset = 0; // FIX! need a separate StreamTime.... or the end of the internal buffer
+ source.mListener->NotifyRealtimeTrackDataAndApplyTrackDisabling(Graph(), offset, *aSegment);
+ }
+}
+
+// These handle notifying all the listeners of an event
+void
+SourceMediaStream::NotifyListenersEventImpl(MediaStreamGraphEvent aEvent)
+{
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ l->NotifyEvent(GraphImpl(), aEvent);
+ }
+}
+
+void
+SourceMediaStream::NotifyListenersEvent(MediaStreamGraphEvent aNewEvent)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(SourceMediaStream* aStream, MediaStreamGraphEvent aEvent) :
+ ControlMessage(aStream), mEvent(aEvent) {}
+ void Run() override
+ {
+ mStream->AsSourceStream()->NotifyListenersEventImpl(mEvent);
+ }
+ MediaStreamGraphEvent mEvent;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aNewEvent));
+}
+
+void
+SourceMediaStream::AddDirectListener(DirectMediaStreamListener* aListener)
+{
+ bool wasEmpty;
+ {
+ MutexAutoLock lock(mMutex);
+ wasEmpty = mDirectListeners.IsEmpty();
+ mDirectListeners.AppendElement(aListener);
+ }
+
+ if (wasEmpty) {
+ // Async
+ NotifyListenersEvent(MediaStreamGraphEvent::EVENT_HAS_DIRECT_LISTENERS);
+ }
+}
+
+void
+SourceMediaStream::RemoveDirectListener(DirectMediaStreamListener* aListener)
+{
+ bool isEmpty;
+ {
+ MutexAutoLock lock(mMutex);
+ mDirectListeners.RemoveElement(aListener);
+ isEmpty = mDirectListeners.IsEmpty();
+ }
+
+ if (isEmpty) {
+ // Async
+ NotifyListenersEvent(MediaStreamGraphEvent::EVENT_HAS_NO_DIRECT_LISTENERS);
+ }
+}
+
+void
+SourceMediaStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
+ TrackID aTrackID)
+{
+ MOZ_ASSERT(IsTrackIDExplicit(aTrackID));
+ TrackData* data;
+ bool found = false;
+ bool isAudio = false;
+ bool isVideo = false;
+ RefPtr<DirectMediaStreamTrackListener> listener = aListener;
+ STREAM_LOG(LogLevel::Debug, ("Adding direct track listener %p bound to track %d to source stream %p",
+ listener.get(), aTrackID, this));
+
+ {
+ MutexAutoLock lock(mMutex);
+ data = FindDataForTrack(aTrackID);
+ found = !!data;
+ if (found) {
+ isAudio = data->mData->GetType() == MediaSegment::AUDIO;
+ isVideo = data->mData->GetType() == MediaSegment::VIDEO;
+ }
+
+ // The track might be removed from mUpdateTrack but still exist in
+ // mTracks.
+ auto streamTrack = FindTrack(aTrackID);
+ bool foundTrack = !!streamTrack;
+ if (foundTrack) {
+ MediaStreamVideoSink* videoSink = listener->AsMediaStreamVideoSink();
+ // Re-send missed VideoSegment to new added MediaStreamVideoSink.
+ if (streamTrack->GetType() == MediaSegment::VIDEO && videoSink) {
+ VideoSegment videoSegment;
+ if (mTracks.GetForgottenDuration() < streamTrack->GetSegment()->GetDuration()) {
+ videoSegment.AppendSlice(*streamTrack->GetSegment(),
+ mTracks.GetForgottenDuration(),
+ streamTrack->GetSegment()->GetDuration());
+ } else {
+ VideoSegment* streamTrackSegment = static_cast<VideoSegment*>(streamTrack->GetSegment());
+ VideoChunk* lastChunk = streamTrackSegment->GetLastChunk();
+ if (lastChunk) {
+ StreamTime startTime = streamTrackSegment->GetDuration() - lastChunk->GetDuration();
+ videoSegment.AppendSlice(*streamTrackSegment,
+ startTime,
+ streamTrackSegment->GetDuration());
+ }
+ }
+ if (found) {
+ videoSegment.AppendSlice(*data->mData, 0, data->mData->GetDuration());
+ }
+ videoSink->SetCurrentFrames(videoSegment);
+ }
+ }
+
+ if (found && (isAudio || isVideo)) {
+ for (auto entry : mDirectTrackListeners) {
+ if (entry.mListener == listener &&
+ (entry.mTrackID == TRACK_ANY || entry.mTrackID == aTrackID)) {
+ listener->NotifyDirectListenerInstalled(
+ DirectMediaStreamTrackListener::InstallationResult::ALREADY_EXISTS);
+ return;
+ }
+ }
+
+ TrackBound<DirectMediaStreamTrackListener>* sourceListener =
+ mDirectTrackListeners.AppendElement();
+ sourceListener->mListener = listener;
+ sourceListener->mTrackID = aTrackID;
+ }
+ }
+ if (!found) {
+ STREAM_LOG(LogLevel::Warning, ("Couldn't find source track for direct track listener %p",
+ listener.get()));
+ listener->NotifyDirectListenerInstalled(
+ DirectMediaStreamTrackListener::InstallationResult::TRACK_NOT_FOUND_AT_SOURCE);
+ return;
+ }
+ if (!isAudio && !isVideo) {
+ STREAM_LOG(LogLevel::Warning, ("Source track for direct track listener %p is unknown",
+ listener.get()));
+ // It is not a video or audio track.
+ MOZ_ASSERT(true);
+ return;
+ }
+ STREAM_LOG(LogLevel::Debug, ("Added direct track listener %p", listener.get()));
+ listener->NotifyDirectListenerInstalled(
+ DirectMediaStreamTrackListener::InstallationResult::SUCCESS);
+}
+
+void
+SourceMediaStream::RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ MutexAutoLock lock(mMutex);
+ for (int32_t i = mDirectTrackListeners.Length() - 1; i >= 0; --i) {
+ const TrackBound<DirectMediaStreamTrackListener>& source =
+ mDirectTrackListeners[i];
+ if (source.mListener == aListener && source.mTrackID == aTrackID) {
+ aListener->NotifyDirectListenerUninstalled();
+ mDirectTrackListeners.RemoveElementAt(i);
+ }
+ }
+}
+
+StreamTime
+SourceMediaStream::GetEndOfAppendedData(TrackID aID)
+{
+ MutexAutoLock lock(mMutex);
+ TrackData *track = FindDataForTrack(aID);
+ if (track) {
+ return track->mEndOfFlushedData + track->mData->GetDuration();
+ }
+ NS_ERROR("Track not found");
+ return 0;
+}
+
+void
+SourceMediaStream::EndTrack(TrackID aID)
+{
+ MutexAutoLock lock(mMutex);
+ TrackData *track = FindDataForTrack(aID);
+ if (track) {
+ track->mCommands |= TrackEventCommand::TRACK_EVENT_ENDED;
+ }
+ if (auto graph = GraphImpl()) {
+ graph->EnsureNextIteration();
+ }
+}
+
+void
+SourceMediaStream::AdvanceKnownTracksTime(StreamTime aKnownTime)
+{
+ MutexAutoLock lock(mMutex);
+ MOZ_ASSERT(aKnownTime >= mUpdateKnownTracksTime);
+ mUpdateKnownTracksTime = aKnownTime;
+ if (auto graph = GraphImpl()) {
+ graph->EnsureNextIteration();
+ }
+}
+
+void
+SourceMediaStream::FinishWithLockHeld()
+{
+ mMutex.AssertCurrentThreadOwns();
+ mUpdateFinished = true;
+ if (auto graph = GraphImpl()) {
+ graph->EnsureNextIteration();
+ }
+}
+
+void
+SourceMediaStream::SetTrackEnabledImpl(TrackID aTrackID, DisabledTrackMode aMode)
+{
+ {
+ MutexAutoLock lock(mMutex);
+ for (TrackBound<DirectMediaStreamTrackListener>& l: mDirectTrackListeners) {
+ if (l.mTrackID != aTrackID) {
+ continue;
+ }
+ DisabledTrackMode oldMode = GetDisabledTrackMode(aTrackID);
+ bool oldEnabled = oldMode == DisabledTrackMode::ENABLED;
+ if (!oldEnabled && aMode == DisabledTrackMode::ENABLED) {
+ STREAM_LOG(LogLevel::Debug, ("SourceMediaStream %p track %d setting "
+ "direct listener enabled",
+ this, aTrackID));
+ l.mListener->DecreaseDisabled(oldMode);
+ } else if (oldEnabled && aMode != DisabledTrackMode::ENABLED) {
+ STREAM_LOG(LogLevel::Debug, ("SourceMediaStream %p track %d setting "
+ "direct listener disabled",
+ this, aTrackID));
+ l.mListener->IncreaseDisabled(aMode);
+ }
+ }
+ }
+ MediaStream::SetTrackEnabledImpl(aTrackID, aMode);
+}
+
+void
+SourceMediaStream::EndAllTrackAndFinish()
+{
+ MutexAutoLock lock(mMutex);
+ for (uint32_t i = 0; i < mUpdateTracks.Length(); ++i) {
+ SourceMediaStream::TrackData* data = &mUpdateTracks[i];
+ data->mCommands |= TrackEventCommand::TRACK_EVENT_ENDED;
+ }
+ mPendingTracks.Clear();
+ FinishWithLockHeld();
+ // we will call NotifyEvent() to let GetUserMedia know
+}
+
+SourceMediaStream::~SourceMediaStream()
+{
+}
+
+void
+SourceMediaStream::RegisterForAudioMixing()
+{
+ MutexAutoLock lock(mMutex);
+ mNeedsMixing = true;
+}
+
+bool
+SourceMediaStream::NeedsMixing()
+{
+ MutexAutoLock lock(mMutex);
+ return mNeedsMixing;
+}
+
+bool
+SourceMediaStream::HasPendingAudioTrack()
+{
+ MutexAutoLock lock(mMutex);
+ bool audioTrackPresent = false;
+
+ for (auto& data : mPendingTracks) {
+ if (data.mData->GetType() == MediaSegment::AUDIO) {
+ audioTrackPresent = true;
+ break;
+ }
+ }
+
+ return audioTrackPresent;
+}
+
+void
+MediaInputPort::Init()
+{
+ STREAM_LOG(LogLevel::Debug, ("Adding MediaInputPort %p (from %p to %p) to the graph",
+ this, mSource, mDest));
+ mSource->AddConsumer(this);
+ mDest->AddInput(this);
+ // mPortCount decremented via MediaInputPort::Destroy's message
+ ++mDest->GraphImpl()->mPortCount;
+}
+
+void
+MediaInputPort::Disconnect()
+{
+ GraphImpl()->AssertOnGraphThreadOrNotRunning();
+ NS_ASSERTION(!mSource == !mDest,
+ "mSource must either both be null or both non-null");
+ if (!mSource)
+ return;
+
+ mSource->RemoveConsumer(this);
+ mDest->RemoveInput(this);
+ mSource = nullptr;
+ mDest = nullptr;
+
+ GraphImpl()->SetStreamOrderDirty();
+}
+
+MediaInputPort::InputInterval
+MediaInputPort::GetNextInputInterval(GraphTime aTime)
+{
+ InputInterval result = { GRAPH_TIME_MAX, GRAPH_TIME_MAX, false };
+ if (aTime >= mDest->mStartBlocking) {
+ return result;
+ }
+ result.mStart = aTime;
+ result.mEnd = mDest->mStartBlocking;
+ result.mInputIsBlocked = aTime >= mSource->mStartBlocking;
+ if (!result.mInputIsBlocked) {
+ result.mEnd = std::min(result.mEnd, mSource->mStartBlocking);
+ }
+ return result;
+}
+
+void
+MediaInputPort::Destroy()
+{
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaInputPort* aPort)
+ : ControlMessage(nullptr), mPort(aPort) {}
+ void Run() override
+ {
+ mPort->Disconnect();
+ --mPort->GraphImpl()->mPortCount;
+ mPort->SetGraphImpl(nullptr);
+ NS_RELEASE(mPort);
+ }
+ void RunDuringShutdown() override
+ {
+ Run();
+ }
+ MediaInputPort* mPort;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this));
+}
+
+MediaStreamGraphImpl*
+MediaInputPort::GraphImpl()
+{
+ return mGraph;
+}
+
+MediaStreamGraph*
+MediaInputPort::Graph()
+{
+ return mGraph;
+}
+
+void
+MediaInputPort::SetGraphImpl(MediaStreamGraphImpl* aGraph)
+{
+ MOZ_ASSERT(!mGraph || !aGraph, "Should only be set once");
+ mGraph = aGraph;
+}
+
+void
+MediaInputPort::BlockSourceTrackIdImpl(TrackID aTrackId, BlockingMode aBlockingMode)
+{
+ mBlockedTracks.AppendElement(Pair<TrackID, BlockingMode>(aTrackId, aBlockingMode));
+}
+
+already_AddRefed<Pledge<bool>>
+MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
+{
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaInputPort* aPort,
+ TrackID aTrackId,
+ BlockingMode aBlockingMode,
+ already_AddRefed<nsIRunnable> aRunnable)
+ : ControlMessage(aPort->GetDestination()),
+ mPort(aPort), mTrackId(aTrackId), mBlockingMode(aBlockingMode),
+ mRunnable(aRunnable) {}
+ void Run() override
+ {
+ mPort->BlockSourceTrackIdImpl(mTrackId, mBlockingMode);
+ if (mRunnable) {
+ mStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(mRunnable.forget());
+ }
+ }
+ void RunDuringShutdown() override
+ {
+ Run();
+ }
+ RefPtr<MediaInputPort> mPort;
+ TrackID mTrackId;
+ BlockingMode mBlockingMode;
+ nsCOMPtr<nsIRunnable> mRunnable;
+ };
+
+ MOZ_ASSERT(IsTrackIDExplicit(aTrackId),
+ "Only explicit TrackID is allowed");
+
+ RefPtr<Pledge<bool>> pledge = new Pledge<bool>();
+ nsCOMPtr<nsIRunnable> runnable = NewRunnableFrom([pledge]() {
+ MOZ_ASSERT(NS_IsMainThread());
+ pledge->Resolve(true);
+ return NS_OK;
+ });
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aTrackId, aBlockingMode, runnable.forget()));
+ return pledge.forget();
+}
+
+already_AddRefed<MediaInputPort>
+ProcessedMediaStream::AllocateInputPort(MediaStream* aStream, TrackID aTrackID,
+ TrackID aDestTrackID,
+ uint16_t aInputNumber, uint16_t aOutputNumber,
+ nsTArray<TrackID>* aBlockedTracks)
+{
+ // This method creates two references to the MediaInputPort: one for
+ // the main thread, and one for the MediaStreamGraph.
+ class Message : public ControlMessage {
+ public:
+ explicit Message(MediaInputPort* aPort)
+ : ControlMessage(aPort->GetDestination()),
+ mPort(aPort) {}
+ void Run() override
+ {
+ mPort->Init();
+ // The graph holds its reference implicitly
+ mPort->GraphImpl()->SetStreamOrderDirty();
+ Unused << mPort.forget();
+ }
+ void RunDuringShutdown() override
+ {
+ Run();
+ }
+ RefPtr<MediaInputPort> mPort;
+ };
+
+ MOZ_ASSERT(aStream->GraphImpl() == GraphImpl());
+ MOZ_ASSERT(aTrackID == TRACK_ANY || IsTrackIDExplicit(aTrackID),
+ "Only TRACK_ANY and explicit ID are allowed for source track");
+ MOZ_ASSERT(aDestTrackID == TRACK_ANY || IsTrackIDExplicit(aDestTrackID),
+ "Only TRACK_ANY and explicit ID are allowed for destination track");
+ MOZ_ASSERT(aTrackID != TRACK_ANY || aDestTrackID == TRACK_ANY,
+ "Generic MediaInputPort cannot produce a single destination track");
+ RefPtr<MediaInputPort> port =
+ new MediaInputPort(aStream, aTrackID, this, aDestTrackID,
+ aInputNumber, aOutputNumber);
+ if (aBlockedTracks) {
+ for (TrackID trackID : *aBlockedTracks) {
+ port->BlockSourceTrackIdImpl(trackID, BlockingMode::CREATION);
+ }
+ }
+ port->SetGraphImpl(GraphImpl());
+ GraphImpl()->AppendMessage(MakeUnique<Message>(port));
+ return port.forget();
+}
+
+void
+ProcessedMediaStream::Finish()
+{
+ class Message : public ControlMessage {
+ public:
+ explicit Message(ProcessedMediaStream* aStream)
+ : ControlMessage(aStream) {}
+ void Run() override
+ {
+ mStream->GraphImpl()->FinishStream(mStream);
+ }
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this));
+}
+
+void
+ProcessedMediaStream::SetAutofinish(bool aAutofinish)
+{
+ class Message : public ControlMessage {
+ public:
+ Message(ProcessedMediaStream* aStream, bool aAutofinish)
+ : ControlMessage(aStream), mAutofinish(aAutofinish) {}
+ void Run() override
+ {
+ static_cast<ProcessedMediaStream*>(mStream)->SetAutofinishImpl(mAutofinish);
+ }
+ bool mAutofinish;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aAutofinish));
+}
+
+void
+ProcessedMediaStream::DestroyImpl()
+{
+ for (int32_t i = mInputs.Length() - 1; i >= 0; --i) {
+ mInputs[i]->Disconnect();
+ }
+ MediaStream::DestroyImpl();
+ // The stream order is only important if there are connections, in which
+ // case MediaInputPort::Disconnect() called SetStreamOrderDirty().
+ // MediaStreamGraphImpl::RemoveStreamGraphThread() will also call
+ // SetStreamOrderDirty(), for other reasons.
+}
+
+MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
+ TrackRate aSampleRate,
+ dom::AudioChannel aChannel)
+ : MediaStreamGraph(aSampleRate)
+ , mPortCount(0)
+ , mInputWanted(false)
+ , mInputDeviceID(-1)
+ , mOutputWanted(true)
+ , mOutputDeviceID(-1)
+ , mNeedAnotherIteration(false)
+ , mGraphDriverAsleep(false)
+ , mMonitor("MediaStreamGraphImpl")
+ , mLifecycleState(LIFECYCLE_THREAD_NOT_STARTED)
+ , mEndTime(GRAPH_TIME_MAX)
+ , mForceShutDown(false)
+ , mPostedRunInStableStateEvent(false)
+ , mDetectedNotRunning(false)
+ , mPostedRunInStableState(false)
+ , mRealtime(aDriverRequested != OFFLINE_THREAD_DRIVER)
+ , mNonRealtimeProcessing(false)
+ , mStreamOrderDirty(false)
+ , mLatencyLog(AsyncLatencyLogger::Get())
+#ifdef MOZ_WEBRTC
+ , mFarendObserverRef(nullptr)
+#endif
+ , mSelfRef(this)
+#ifdef DEBUG
+ , mCanRunMessagesSynchronously(false)
+#endif
+ , mAudioChannel(aChannel)
+{
+ if (mRealtime) {
+ if (aDriverRequested == AUDIO_THREAD_DRIVER) {
+ AudioCallbackDriver* driver = new AudioCallbackDriver(this);
+ mDriver = driver;
+ } else {
+ mDriver = new SystemClockDriver(this);
+ }
+ } else {
+ mDriver = new OfflineClockDriver(this, MEDIA_GRAPH_TARGET_PERIOD_MS);
+ }
+
+ mLastMainThreadUpdate = TimeStamp::Now();
+
+ RegisterWeakAsyncMemoryReporter(this);
+}
+
+void
+MediaStreamGraphImpl::Destroy()
+{
+ // First unregister from memory reporting.
+ UnregisterWeakMemoryReporter(this);
+
+ // Clear the self reference which will destroy this instance.
+ mSelfRef = nullptr;
+}
+
+MediaStreamGraph*
+MediaStreamGraph::GetInstance(MediaStreamGraph::GraphDriverType aGraphDriverRequested,
+ dom::AudioChannel aChannel)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Main thread only");
+
+ uint32_t channel = static_cast<uint32_t>(aChannel);
+ MediaStreamGraphImpl* graph = nullptr;
+
+ if (!gGraphs.Get(channel, &graph)) {
+ if (!gMediaStreamGraphShutdownBlocker) {
+
+ class Blocker : public media::ShutdownBlocker
+ {
+ public:
+ Blocker()
+ : media::ShutdownBlocker(NS_LITERAL_STRING(
+ "MediaStreamGraph shutdown: blocking on msg thread"))
+ {}
+
+ NS_IMETHOD
+ BlockShutdown(nsIAsyncShutdownClient* aProfileBeforeChange) override
+ {
+ // Distribute the global async shutdown blocker in a ticket. If there
+ // are zero graphs then shutdown is unblocked when we go out of scope.
+ RefPtr<MediaStreamGraphImpl::ShutdownTicket> ticket =
+ new MediaStreamGraphImpl::ShutdownTicket(gMediaStreamGraphShutdownBlocker.get());
+ gMediaStreamGraphShutdownBlocker = nullptr;
+
+ for (auto iter = gGraphs.Iter(); !iter.Done(); iter.Next()) {
+ iter.UserData()->ForceShutDown(ticket);
+ }
+ return NS_OK;
+ }
+ };
+
+ gMediaStreamGraphShutdownBlocker = new Blocker();
+ nsCOMPtr<nsIAsyncShutdownClient> barrier = MediaStreamGraphImpl::GetShutdownBarrier();
+ nsresult rv = barrier->
+ AddBlocker(gMediaStreamGraphShutdownBlocker,
+ NS_LITERAL_STRING(__FILE__), __LINE__,
+ NS_LITERAL_STRING("MediaStreamGraph shutdown"));
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ }
+
+ graph = new MediaStreamGraphImpl(aGraphDriverRequested,
+ CubebUtils::PreferredSampleRate(),
+ aChannel);
+
+ gGraphs.Put(channel, graph);
+
+ STREAM_LOG(LogLevel::Debug,
+ ("Starting up MediaStreamGraph %p for channel %s",
+ graph, AudioChannelValues::strings[channel].value));
+ }
+
+ return graph;
+}
+
+MediaStreamGraph*
+MediaStreamGraph::CreateNonRealtimeInstance(TrackRate aSampleRate)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Main thread only");
+
+ MediaStreamGraphImpl* graph =
+ new MediaStreamGraphImpl(OFFLINE_THREAD_DRIVER,
+ aSampleRate,
+ AudioChannel::Normal);
+
+ STREAM_LOG(LogLevel::Debug, ("Starting up Offline MediaStreamGraph %p", graph));
+
+ return graph;
+}
+
+void
+MediaStreamGraph::DestroyNonRealtimeInstance(MediaStreamGraph* aGraph)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Main thread only");
+ MOZ_ASSERT(aGraph->IsNonRealtime(), "Should not destroy the global graph here");
+
+ MediaStreamGraphImpl* graph = static_cast<MediaStreamGraphImpl*>(aGraph);
+
+ if (!graph->mNonRealtimeProcessing) {
+ // Start the graph, but don't produce anything
+ graph->StartNonRealtimeProcessing(0);
+ }
+ graph->ForceShutDown(nullptr);
+}
+
+NS_IMPL_ISUPPORTS(MediaStreamGraphImpl, nsIMemoryReporter, nsITimerCallback)
+
+NS_IMETHODIMP
+MediaStreamGraphImpl::CollectReports(nsIHandleReportCallback* aHandleReport,
+ nsISupports* aData, bool aAnonymize)
+{
+ if (mLifecycleState >= LIFECYCLE_WAITING_FOR_THREAD_SHUTDOWN) {
+ // Shutting down, nothing to report.
+ FinishCollectReports(aHandleReport, aData, nsTArray<AudioNodeSizes>());
+ return NS_OK;
+ }
+
+ class Message final : public ControlMessage {
+ public:
+ Message(MediaStreamGraphImpl *aGraph,
+ nsIHandleReportCallback* aHandleReport,
+ nsISupports *aHandlerData)
+ : ControlMessage(nullptr)
+ , mGraph(aGraph)
+ , mHandleReport(aHandleReport)
+ , mHandlerData(aHandlerData) {}
+ void Run() override
+ {
+ mGraph->CollectSizesForMemoryReport(mHandleReport.forget(),
+ mHandlerData.forget());
+ }
+ void RunDuringShutdown() override
+ {
+ // Run this message during shutdown too, so that endReports is called.
+ Run();
+ }
+ MediaStreamGraphImpl *mGraph;
+ // nsMemoryReporterManager keeps the callback and data alive only if it
+ // does not time out.
+ nsCOMPtr<nsIHandleReportCallback> mHandleReport;
+ nsCOMPtr<nsISupports> mHandlerData;
+ };
+
+ // When a non-realtime graph has not started, there is no thread yet, so
+ // collect sizes on this thread.
+ if (!(mRealtime || mNonRealtimeProcessing)) {
+ CollectSizesForMemoryReport(do_AddRef(aHandleReport), do_AddRef(aData));
+ return NS_OK;
+ }
+
+ AppendMessage(MakeUnique<Message>(this, aHandleReport, aData));
+
+ return NS_OK;
+}
+
+void
+MediaStreamGraphImpl::CollectSizesForMemoryReport(
+ already_AddRefed<nsIHandleReportCallback> aHandleReport,
+ already_AddRefed<nsISupports> aHandlerData)
+{
+ class FinishCollectRunnable final : public Runnable
+ {
+ public:
+ explicit FinishCollectRunnable(
+ already_AddRefed<nsIHandleReportCallback> aHandleReport,
+ already_AddRefed<nsISupports> aHandlerData)
+ : mHandleReport(aHandleReport)
+ , mHandlerData(aHandlerData)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ MediaStreamGraphImpl::FinishCollectReports(mHandleReport, mHandlerData,
+ Move(mAudioStreamSizes));
+ return NS_OK;
+ }
+
+ nsTArray<AudioNodeSizes> mAudioStreamSizes;
+
+ private:
+ ~FinishCollectRunnable() {}
+
+ // Avoiding nsCOMPtr because NSCAP_ASSERT_NO_QUERY_NEEDED in its
+ // constructor modifies the ref-count, which cannot be done off main
+ // thread.
+ RefPtr<nsIHandleReportCallback> mHandleReport;
+ RefPtr<nsISupports> mHandlerData;
+ };
+
+ RefPtr<FinishCollectRunnable> runnable =
+ new FinishCollectRunnable(Move(aHandleReport), Move(aHandlerData));
+
+ auto audioStreamSizes = &runnable->mAudioStreamSizes;
+
+ for (MediaStream* s : AllStreams()) {
+ AudioNodeStream* stream = s->AsAudioNodeStream();
+ if (stream) {
+ AudioNodeSizes* usage = audioStreamSizes->AppendElement();
+ stream->SizeOfAudioNodesIncludingThis(MallocSizeOf, *usage);
+ }
+ }
+
+ NS_DispatchToMainThread(runnable.forget());
+}
+
+void
+MediaStreamGraphImpl::
+FinishCollectReports(nsIHandleReportCallback* aHandleReport, nsISupports* aData,
+ const nsTArray<AudioNodeSizes>& aAudioStreamSizes)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsCOMPtr<nsIMemoryReporterManager> manager =
+ do_GetService("@mozilla.org/memory-reporter-manager;1");
+
+ if (!manager)
+ return;
+
+#define REPORT(_path, _amount, _desc) \
+ aHandleReport->Callback(EmptyCString(), _path, KIND_HEAP, UNITS_BYTES, \
+ _amount, NS_LITERAL_CSTRING(_desc), aData);
+
+ for (size_t i = 0; i < aAudioStreamSizes.Length(); i++) {
+ const AudioNodeSizes& usage = aAudioStreamSizes[i];
+ const char* const nodeType =
+ usage.mNodeType ? usage.mNodeType : "<unknown>";
+
+ nsPrintfCString enginePath("explicit/webaudio/audio-node/%s/engine-objects",
+ nodeType);
+ REPORT(enginePath, usage.mEngine,
+ "Memory used by AudioNode engine objects (Web Audio).");
+
+ nsPrintfCString streamPath("explicit/webaudio/audio-node/%s/stream-objects",
+ nodeType);
+ REPORT(streamPath, usage.mStream,
+ "Memory used by AudioNode stream objects (Web Audio).");
+
+ }
+
+ size_t hrtfLoaders = WebCore::HRTFDatabaseLoader::sizeOfLoaders(MallocSizeOf);
+ if (hrtfLoaders) {
+ REPORT(NS_LITERAL_CSTRING(
+ "explicit/webaudio/audio-node/PannerNode/hrtf-databases"),
+ hrtfLoaders,
+ "Memory used by PannerNode databases (Web Audio).");
+ }
+
+#undef REPORT
+
+ manager->EndReport();
+}
+
+SourceMediaStream*
+MediaStreamGraph::CreateSourceStream()
+{
+ SourceMediaStream* stream = new SourceMediaStream();
+ AddStream(stream);
+ return stream;
+}
+
+ProcessedMediaStream*
+MediaStreamGraph::CreateTrackUnionStream()
+{
+ TrackUnionStream* stream = new TrackUnionStream();
+ AddStream(stream);
+ return stream;
+}
+
+ProcessedMediaStream*
+MediaStreamGraph::CreateAudioCaptureStream(TrackID aTrackId)
+{
+ AudioCaptureStream* stream = new AudioCaptureStream(aTrackId);
+ AddStream(stream);
+ return stream;
+}
+
+void
+MediaStreamGraph::AddStream(MediaStream* aStream)
+{
+ NS_ADDREF(aStream);
+ MediaStreamGraphImpl* graph = static_cast<MediaStreamGraphImpl*>(this);
+ aStream->SetGraphImpl(graph);
+ graph->AppendMessage(MakeUnique<CreateMessage>(aStream));
+}
+
+class GraphStartedRunnable final : public Runnable
+{
+public:
+ GraphStartedRunnable(AudioNodeStream* aStream, MediaStreamGraph* aGraph)
+ : mStream(aStream)
+ , mGraph(aGraph)
+ { }
+
+ NS_IMETHOD Run() override {
+ mGraph->NotifyWhenGraphStarted(mStream);
+ return NS_OK;
+ }
+
+private:
+ RefPtr<AudioNodeStream> mStream;
+ MediaStreamGraph* mGraph;
+};
+
+void
+MediaStreamGraph::NotifyWhenGraphStarted(AudioNodeStream* aStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ class GraphStartedNotificationControlMessage : public ControlMessage
+ {
+ public:
+ explicit GraphStartedNotificationControlMessage(AudioNodeStream* aStream)
+ : ControlMessage(aStream)
+ {
+ }
+ void Run() override
+ {
+ // This runs on the graph thread, so when this runs, and the current
+ // driver is an AudioCallbackDriver, we know the audio hardware is
+ // started. If not, we are going to switch soon, keep reposting this
+ // ControlMessage.
+ MediaStreamGraphImpl* graphImpl = mStream->GraphImpl();
+ if (graphImpl->CurrentDriver()->AsAudioCallbackDriver()) {
+ nsCOMPtr<nsIRunnable> event = new dom::StateChangeTask(
+ mStream->AsAudioNodeStream(), nullptr, AudioContextState::Running);
+ NS_DispatchToMainThread(event.forget());
+ } else {
+ nsCOMPtr<nsIRunnable> event = new GraphStartedRunnable(
+ mStream->AsAudioNodeStream(), mStream->Graph());
+ NS_DispatchToMainThread(event.forget());
+ }
+ }
+ void RunDuringShutdown() override
+ {
+ }
+ };
+
+ if (!aStream->IsDestroyed()) {
+ MediaStreamGraphImpl* graphImpl = static_cast<MediaStreamGraphImpl*>(this);
+ graphImpl->AppendMessage(MakeUnique<GraphStartedNotificationControlMessage>(aStream));
+ }
+}
+
+void
+MediaStreamGraphImpl::IncrementSuspendCount(MediaStream* aStream)
+{
+ if (!aStream->IsSuspended()) {
+ MOZ_ASSERT(mStreams.Contains(aStream));
+ mStreams.RemoveElement(aStream);
+ mSuspendedStreams.AppendElement(aStream);
+ SetStreamOrderDirty();
+ }
+ aStream->IncrementSuspendCount();
+}
+
+void
+MediaStreamGraphImpl::DecrementSuspendCount(MediaStream* aStream)
+{
+ bool wasSuspended = aStream->IsSuspended();
+ aStream->DecrementSuspendCount();
+ if (wasSuspended && !aStream->IsSuspended()) {
+ MOZ_ASSERT(mSuspendedStreams.Contains(aStream));
+ mSuspendedStreams.RemoveElement(aStream);
+ mStreams.AppendElement(aStream);
+ ProcessedMediaStream* ps = aStream->AsProcessedStream();
+ if (ps) {
+ ps->mCycleMarker = NOT_VISITED;
+ }
+ SetStreamOrderDirty();
+ }
+}
+
+void
+MediaStreamGraphImpl::SuspendOrResumeStreams(AudioContextOperation aAudioContextOperation,
+ const nsTArray<MediaStream*>& aStreamSet)
+{
+ // For our purpose, Suspend and Close are equivalent: we want to remove the
+ // streams from the set of streams that are going to be processed.
+ for (MediaStream* stream : aStreamSet) {
+ if (aAudioContextOperation == AudioContextOperation::Resume) {
+ DecrementSuspendCount(stream);
+ } else {
+ IncrementSuspendCount(stream);
+ }
+ }
+ STREAM_LOG(LogLevel::Debug, ("Moving streams between suspended and running"
+ "state: mStreams: %d, mSuspendedStreams: %d\n", mStreams.Length(),
+ mSuspendedStreams.Length()));
+#ifdef DEBUG
+ // The intersection of the two arrays should be null.
+ for (uint32_t i = 0; i < mStreams.Length(); i++) {
+ for (uint32_t j = 0; j < mSuspendedStreams.Length(); j++) {
+ MOZ_ASSERT(
+ mStreams[i] != mSuspendedStreams[j],
+ "The suspended stream set and running stream set are not disjoint.");
+ }
+ }
+#endif
+}
+
+void
+MediaStreamGraphImpl::AudioContextOperationCompleted(MediaStream* aStream,
+ void* aPromise,
+ AudioContextOperation aOperation)
+{
+ // This can be called from the thread created to do cubeb operation, or the
+ // MSG thread. The pointers passed back here are refcounted, so are still
+ // alive.
+ MonitorAutoLock lock(mMonitor);
+
+ AudioContextState state;
+ switch (aOperation) {
+ case AudioContextOperation::Suspend:
+ state = AudioContextState::Suspended;
+ break;
+ case AudioContextOperation::Resume:
+ state = AudioContextState::Running;
+ break;
+ case AudioContextOperation::Close:
+ state = AudioContextState::Closed;
+ break;
+ default: MOZ_CRASH("Not handled.");
+ }
+
+ nsCOMPtr<nsIRunnable> event = new dom::StateChangeTask(
+ aStream->AsAudioNodeStream(), aPromise, state);
+ NS_DispatchToMainThread(event.forget());
+}
+
+void
+MediaStreamGraphImpl::ApplyAudioContextOperationImpl(
+ MediaStream* aDestinationStream, const nsTArray<MediaStream*>& aStreams,
+ AudioContextOperation aOperation, void* aPromise)
+{
+ MOZ_ASSERT(CurrentDriver()->OnThread());
+
+ SuspendOrResumeStreams(aOperation, aStreams);
+
+ bool switching = false;
+ GraphDriver* nextDriver = nullptr;
+ {
+ MonitorAutoLock lock(mMonitor);
+ switching = CurrentDriver()->Switching();
+ if (switching) {
+ nextDriver = CurrentDriver()->NextDriver();
+ }
+ }
+
+ // If we have suspended the last AudioContext, and we don't have other
+ // streams that have audio, this graph will automatically switch to a
+ // SystemCallbackDriver, because it can't find a MediaStream that has an audio
+ // track. When resuming, force switching to an AudioCallbackDriver (if we're
+ // not already switching). It would have happened at the next iteration
+ // anyways, but doing this now save some time.
+ if (aOperation == AudioContextOperation::Resume) {
+ if (!CurrentDriver()->AsAudioCallbackDriver()) {
+ AudioCallbackDriver* driver;
+ if (switching) {
+ MOZ_ASSERT(nextDriver->AsAudioCallbackDriver());
+ driver = nextDriver->AsAudioCallbackDriver();
+ } else {
+ driver = new AudioCallbackDriver(this);
+ MonitorAutoLock lock(mMonitor);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ }
+ driver->EnqueueStreamAndPromiseForOperation(aDestinationStream,
+ aPromise, aOperation);
+ } else {
+ // We are resuming a context, but we are already using an
+ // AudioCallbackDriver, we can resolve the promise now.
+ AudioContextOperationCompleted(aDestinationStream, aPromise, aOperation);
+ }
+ }
+ // Close, suspend: check if we are going to switch to a
+ // SystemAudioCallbackDriver, and pass the promise to the AudioCallbackDriver
+ // if that's the case, so it can notify the content.
+ // This is the same logic as in UpdateStreamOrder, but it's simpler to have it
+ // here as well so we don't have to store the Promise(s) on the Graph.
+ if (aOperation != AudioContextOperation::Resume) {
+ bool shouldAEC = false;
+ bool audioTrackPresent = AudioTrackPresent(shouldAEC);
+
+ if (!audioTrackPresent && CurrentDriver()->AsAudioCallbackDriver()) {
+ CurrentDriver()->AsAudioCallbackDriver()->
+ EnqueueStreamAndPromiseForOperation(aDestinationStream, aPromise,
+ aOperation);
+
+ SystemClockDriver* driver;
+ if (nextDriver) {
+ MOZ_ASSERT(!nextDriver->AsAudioCallbackDriver());
+ } else {
+ driver = new SystemClockDriver(this);
+ MonitorAutoLock lock(mMonitor);
+ CurrentDriver()->SwitchAtNextIteration(driver);
+ }
+ // We are closing or suspending an AudioContext, but we just got resumed.
+ // Queue the operation on the next driver so that the ordering is
+ // preserved.
+ } else if (!audioTrackPresent && switching) {
+ MOZ_ASSERT(nextDriver->AsAudioCallbackDriver());
+ nextDriver->AsAudioCallbackDriver()->
+ EnqueueStreamAndPromiseForOperation(aDestinationStream, aPromise,
+ aOperation);
+ } else {
+ // We are closing or suspending an AudioContext, but something else is
+ // using the audio stream, we can resolve the promise now.
+ AudioContextOperationCompleted(aDestinationStream, aPromise, aOperation);
+ }
+ }
+}
+
+void
+MediaStreamGraph::ApplyAudioContextOperation(MediaStream* aDestinationStream,
+ const nsTArray<MediaStream*>& aStreams,
+ AudioContextOperation aOperation,
+ void* aPromise)
+{
+ class AudioContextOperationControlMessage : public ControlMessage
+ {
+ public:
+ AudioContextOperationControlMessage(MediaStream* aDestinationStream,
+ const nsTArray<MediaStream*>& aStreams,
+ AudioContextOperation aOperation,
+ void* aPromise)
+ : ControlMessage(aDestinationStream)
+ , mStreams(aStreams)
+ , mAudioContextOperation(aOperation)
+ , mPromise(aPromise)
+ {
+ }
+ void Run() override
+ {
+ mStream->GraphImpl()->ApplyAudioContextOperationImpl(mStream,
+ mStreams, mAudioContextOperation, mPromise);
+ }
+ void RunDuringShutdown() override
+ {
+ MOZ_ASSERT(false, "We should be reviving the graph?");
+ }
+
+ private:
+ // We don't need strong references here for the same reason ControlMessage
+ // doesn't.
+ nsTArray<MediaStream*> mStreams;
+ AudioContextOperation mAudioContextOperation;
+ void* mPromise;
+ };
+
+ MediaStreamGraphImpl* graphImpl = static_cast<MediaStreamGraphImpl*>(this);
+ graphImpl->AppendMessage(
+ MakeUnique<AudioContextOperationControlMessage>(aDestinationStream, aStreams,
+ aOperation, aPromise));
+}
+
+bool
+MediaStreamGraph::IsNonRealtime() const
+{
+ const MediaStreamGraphImpl* impl = static_cast<const MediaStreamGraphImpl*>(this);
+ MediaStreamGraphImpl* graph;
+
+ return !gGraphs.Get(uint32_t(impl->AudioChannel()), &graph) || graph != impl;
+}
+
+void
+MediaStreamGraph::StartNonRealtimeProcessing(uint32_t aTicksToProcess)
+{
+ NS_ASSERTION(NS_IsMainThread(), "main thread only");
+
+ MediaStreamGraphImpl* graph = static_cast<MediaStreamGraphImpl*>(this);
+ NS_ASSERTION(!graph->mRealtime, "non-realtime only");
+
+ if (graph->mNonRealtimeProcessing)
+ return;
+
+ graph->mEndTime =
+ graph->RoundUpToNextAudioBlock(graph->mStateComputedTime +
+ aTicksToProcess - 1);
+ graph->mNonRealtimeProcessing = true;
+ graph->EnsureRunInStableState();
+}
+
+void
+ProcessedMediaStream::AddInput(MediaInputPort* aPort)
+{
+ mInputs.AppendElement(aPort);
+ GraphImpl()->SetStreamOrderDirty();
+}
+
+void
+MediaStreamGraph::RegisterCaptureStreamForWindow(
+ uint64_t aWindowId, ProcessedMediaStream* aCaptureStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaStreamGraphImpl* graphImpl = static_cast<MediaStreamGraphImpl*>(this);
+ graphImpl->RegisterCaptureStreamForWindow(aWindowId, aCaptureStream);
+}
+
+void
+MediaStreamGraphImpl::RegisterCaptureStreamForWindow(
+ uint64_t aWindowId, ProcessedMediaStream* aCaptureStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ WindowAndStream winAndStream;
+ winAndStream.mWindowId = aWindowId;
+ winAndStream.mCaptureStreamSink = aCaptureStream;
+ mWindowCaptureStreams.AppendElement(winAndStream);
+}
+
+void
+MediaStreamGraph::UnregisterCaptureStreamForWindow(uint64_t aWindowId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MediaStreamGraphImpl* graphImpl = static_cast<MediaStreamGraphImpl*>(this);
+ graphImpl->UnregisterCaptureStreamForWindow(aWindowId);
+}
+
+void
+MediaStreamGraphImpl::UnregisterCaptureStreamForWindow(uint64_t aWindowId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ for (int32_t i = mWindowCaptureStreams.Length() - 1; i >= 0; i--) {
+ if (mWindowCaptureStreams[i].mWindowId == aWindowId) {
+ mWindowCaptureStreams.RemoveElementAt(i);
+ }
+ }
+}
+
+already_AddRefed<MediaInputPort>
+MediaStreamGraph::ConnectToCaptureStream(uint64_t aWindowId,
+ MediaStream* aMediaStream)
+{
+ return aMediaStream->GraphImpl()->ConnectToCaptureStream(aWindowId,
+ aMediaStream);
+}
+
+already_AddRefed<MediaInputPort>
+MediaStreamGraphImpl::ConnectToCaptureStream(uint64_t aWindowId,
+ MediaStream* aMediaStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ for (uint32_t i = 0; i < mWindowCaptureStreams.Length(); i++) {
+ if (mWindowCaptureStreams[i].mWindowId == aWindowId) {
+ ProcessedMediaStream* sink = mWindowCaptureStreams[i].mCaptureStreamSink;
+ return sink->AllocateInputPort(aMediaStream);
+ }
+ }
+ return nullptr;
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaStreamGraph.h b/dom/media/MediaStreamGraph.h
new file mode 100644
index 000000000..a6d77880a
--- /dev/null
+++ b/dom/media/MediaStreamGraph.h
@@ -0,0 +1,1407 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASTREAMGRAPH_H_
+#define MOZILLA_MEDIASTREAMGRAPH_H_
+
+#include "mozilla/LinkedList.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/TaskQueue.h"
+
+#include "mozilla/dom/AudioChannelBinding.h"
+
+#include "AudioStream.h"
+#include "nsTArray.h"
+#include "nsIRunnable.h"
+#include "VideoSegment.h"
+#include "StreamTracks.h"
+#include "MainThreadUtils.h"
+#include "StreamTracks.h"
+#include "nsAutoPtr.h"
+#include "nsAutoRef.h"
+#include <speex/speex_resampler.h>
+
+class nsIRunnable;
+
+template <>
+class nsAutoRefTraits<SpeexResamplerState> : public nsPointerRefTraits<SpeexResamplerState>
+{
+ public:
+ static void Release(SpeexResamplerState* aState) { speex_resampler_destroy(aState); }
+};
+
+namespace mozilla {
+
+extern LazyLogModule gMediaStreamGraphLog;
+
+namespace dom {
+ enum class AudioContextOperation;
+}
+
+namespace media {
+ template<typename V, typename E> class Pledge;
+}
+
+/*
+ * MediaStreamGraph is a framework for synchronized audio/video processing
+ * and playback. It is designed to be used by other browser components such as
+ * HTML media elements, media capture APIs, real-time media streaming APIs,
+ * multitrack media APIs, and advanced audio APIs.
+ *
+ * The MediaStreamGraph uses a dedicated thread to process media --- the media
+ * graph thread. This ensures that we can process media through the graph
+ * without blocking on main-thread activity. The media graph is only modified
+ * on the media graph thread, to ensure graph changes can be processed without
+ * interfering with media processing. All interaction with the media graph
+ * thread is done with message passing.
+ *
+ * APIs that modify the graph or its properties are described as "control APIs".
+ * These APIs are asynchronous; they queue graph changes internally and
+ * those changes are processed all-at-once by the MediaStreamGraph. The
+ * MediaStreamGraph monitors the main thread event loop via nsIAppShell::RunInStableState
+ * to ensure that graph changes from a single event loop task are always
+ * processed all together. Control APIs should only be used on the main thread,
+ * currently; we may be able to relax that later.
+ *
+ * To allow precise synchronization of times in the control API, the
+ * MediaStreamGraph maintains a "media timeline". Control APIs that take or
+ * return times use that timeline. Those times never advance during
+ * an event loop task. This time is returned by MediaStreamGraph::GetCurrentTime().
+ *
+ * Media decoding, audio processing and media playback use thread-safe APIs to
+ * the media graph to ensure they can continue while the main thread is blocked.
+ *
+ * When the graph is changed, we may need to throw out buffered data and
+ * reprocess it. This is triggered automatically by the MediaStreamGraph.
+ */
+
+class AudioNodeEngine;
+class AudioNodeExternalInputStream;
+class AudioNodeStream;
+class MediaInputPort;
+class MediaStream;
+class MediaStreamGraph;
+class MediaStreamGraphImpl;
+class ProcessedMediaStream;
+class SourceMediaStream;
+
+class AudioDataListenerInterface {
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~AudioDataListenerInterface() {}
+
+public:
+ /* These are for cubeb audio input & output streams: */
+ /**
+ * Output data to speakers, for use as the "far-end" data for echo
+ * cancellation. This is not guaranteed to be in any particular size
+ * chunks.
+ */
+ virtual void NotifyOutputData(MediaStreamGraph* aGraph,
+ AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) = 0;
+ /**
+ * Input data from a microphone (or other audio source. This is not
+ * guaranteed to be in any particular size chunks.
+ */
+ virtual void NotifyInputData(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) = 0;
+
+ /**
+ * Called when the underlying audio device has changed.
+ */
+ virtual void DeviceChanged() = 0;
+};
+
+class AudioDataListener : public AudioDataListenerInterface {
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~AudioDataListener() {}
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioDataListener)
+};
+
+/**
+ * This is a base class for main-thread listener callbacks.
+ * This callback is invoked on the main thread when the main-thread-visible
+ * state of a stream has changed.
+ *
+ * These methods are called with the media graph monitor held, so
+ * reentry into general media graph methods is not possible.
+ * You should do something non-blocking and non-reentrant (e.g. dispatch an
+ * event) and return. DispatchFromMainThreadAfterNextStreamStateUpdate
+ * would be a good choice.
+ * The listener is allowed to synchronously remove itself from the stream, but
+ * not add or remove any other listeners.
+ */
+class MainThreadMediaStreamListener {
+public:
+ virtual void NotifyMainThreadStreamFinished() = 0;
+};
+
+/**
+ * Helper struct used to keep track of memory usage by AudioNodes.
+ */
+struct AudioNodeSizes
+{
+ AudioNodeSizes() : mStream(0), mEngine(0), mNodeType() {}
+ size_t mStream;
+ size_t mEngine;
+ const char* mNodeType;
+};
+
+class AudioNodeEngine;
+class AudioNodeExternalInputStream;
+class AudioNodeStream;
+class AudioSegment;
+class DirectMediaStreamListener;
+class DirectMediaStreamTrackListener;
+class MediaInputPort;
+class MediaStreamGraphImpl;
+class MediaStreamListener;
+class MediaStreamTrackListener;
+class MediaStreamVideoSink;
+class ProcessedMediaStream;
+class SourceMediaStream;
+class TrackUnionStream;
+
+enum MediaStreamGraphEvent : uint32_t;
+enum TrackEventCommand : uint32_t;
+
+/**
+ * Helper struct for binding a track listener to a specific TrackID.
+ */
+template<typename Listener>
+struct TrackBound
+{
+ RefPtr<Listener> mListener;
+ TrackID mTrackID;
+};
+
+/**
+ * Describes how a track should be disabled.
+ *
+ * ENABLED Not disabled.
+ * SILENCE_BLACK Audio data is turned into silence, video frames are made black.
+ * SILENCE_FREEZE Audio data is turned into silence, video freezes at last frame.
+ */
+enum class DisabledTrackMode
+{
+ ENABLED, SILENCE_BLACK, SILENCE_FREEZE
+};
+struct DisabledTrack {
+ DisabledTrack(TrackID aTrackID, DisabledTrackMode aMode)
+ : mTrackID(aTrackID), mMode(aMode) {}
+ TrackID mTrackID;
+ DisabledTrackMode mMode;
+};
+
+/**
+ * A stream of synchronized audio and video data. All (not blocked) streams
+ * progress at the same rate --- "real time". Streams cannot seek. The only
+ * operation readers can perform on a stream is to read the next data.
+ *
+ * Consumers of a stream can be reading from it at different offsets, but that
+ * should only happen due to the order in which consumers are being run.
+ * Those offsets must not diverge in the long term, otherwise we would require
+ * unbounded buffering.
+ *
+ * Streams can be in a "blocked" state. While blocked, a stream does not
+ * produce data. A stream can be explicitly blocked via the control API,
+ * or implicitly blocked by whatever's generating it (e.g. an underrun in the
+ * source resource), or implicitly blocked because something consuming it
+ * blocks, or implicitly because it has finished.
+ *
+ * A stream can be in a "finished" state. "Finished" streams are permanently
+ * blocked.
+ *
+ * Transitions into and out of the "blocked" and "finished" states are managed
+ * by the MediaStreamGraph on the media graph thread.
+ *
+ * We buffer media data ahead of the consumers' reading offsets. It is possible
+ * to have buffered data but still be blocked.
+ *
+ * Any stream can have its audio and video playing when requested. The media
+ * stream graph plays audio by constructing audio output streams as necessary.
+ * Video is played by setting video frames into an MediaStreamVideoSink at the right
+ * time. To ensure video plays in sync with audio, make sure that the same
+ * stream is playing both the audio and video.
+ *
+ * The data in a stream is managed by StreamTracks. It consists of a set of
+ * tracks of various types that can start and end over time.
+ *
+ * Streams are explicitly managed. The client creates them via
+ * MediaStreamGraph::CreateInput/ProcessedMediaStream, and releases them by calling
+ * Destroy() when no longer needed (actual destruction will be deferred).
+ * The actual object is owned by the MediaStreamGraph. The basic idea is that
+ * main thread objects will keep Streams alive as long as necessary (using the
+ * cycle collector to clean up whenever needed).
+ *
+ * We make them refcounted only so that stream-related messages with MediaStream*
+ * pointers can be sent to the main thread safely.
+ *
+ * The lifetimes of MediaStreams are controlled from the main thread.
+ * For MediaStreams exposed to the DOM, the lifetime is controlled by the DOM
+ * wrapper; the DOM wrappers own their associated MediaStreams. When a DOM
+ * wrapper is destroyed, it sends a Destroy message for the associated
+ * MediaStream and clears its reference (the last main-thread reference to
+ * the object). When the Destroy message is processed on the graph manager
+ * thread we immediately release the affected objects (disentangling them
+ * from other objects as necessary).
+ *
+ * This could cause problems for media processing if a MediaStream is
+ * destroyed while a downstream MediaStream is still using it. Therefore
+ * the DOM wrappers must keep upstream MediaStreams alive as long as they
+ * could be being used in the media graph.
+ *
+ * At any time, however, a set of MediaStream wrappers could be
+ * collected via cycle collection. Destroy messages will be sent
+ * for those objects in arbitrary order and the MediaStreamGraph has to be able
+ * to handle this.
+ */
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with MediaStream::GetCurrentTime.
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+class MediaStream : public mozilla::LinkedListElement<MediaStream>
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStream)
+
+ MediaStream();
+
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~MediaStream();
+
+public:
+ /**
+ * Returns the graph that owns this stream.
+ */
+ MediaStreamGraphImpl* GraphImpl();
+ MediaStreamGraph* Graph();
+ /**
+ * Sets the graph that owns this stream. Should only be called once.
+ */
+ void SetGraphImpl(MediaStreamGraphImpl* aGraph);
+ void SetGraphImpl(MediaStreamGraph* aGraph);
+
+ /**
+ * Returns sample rate of the graph.
+ */
+ TrackRate GraphRate() { return mTracks.GraphRate(); }
+
+ // Control API.
+ // Since a stream can be played multiple ways, we need to combine independent
+ // volume settings. The aKey parameter is used to keep volume settings
+ // separate. Since the stream is always playing the same contents, only
+ // a single audio output stream is used; the volumes are combined.
+ // Currently only the first enabled audio track is played.
+ // XXX change this so all enabled audio tracks are mixed and played.
+ virtual void AddAudioOutput(void* aKey);
+ virtual void SetAudioOutputVolume(void* aKey, float aVolume);
+ virtual void RemoveAudioOutput(void* aKey);
+ // Since a stream can be played multiple ways, we need to be able to
+ // play to multiple MediaStreamVideoSinks.
+ // Only the first enabled video track is played.
+ virtual void AddVideoOutput(MediaStreamVideoSink* aSink,
+ TrackID aID = TRACK_ANY);
+ virtual void RemoveVideoOutput(MediaStreamVideoSink* aSink,
+ TrackID aID = TRACK_ANY);
+ // Explicitly suspend. Useful for example if a media element is pausing
+ // and we need to stop its stream emitting its buffered data. As soon as the
+ // Suspend message reaches the graph, the stream stops processing. It
+ // ignores its inputs and produces silence/no video until Resumed. Its
+ // current time does not advance.
+ virtual void Suspend();
+ virtual void Resume();
+ // Events will be dispatched by calling methods of aListener.
+ virtual void AddListener(MediaStreamListener* aListener);
+ virtual void RemoveListener(MediaStreamListener* aListener);
+ virtual void AddTrackListener(MediaStreamTrackListener* aListener,
+ TrackID aTrackID);
+ virtual void RemoveTrackListener(MediaStreamTrackListener* aListener,
+ TrackID aTrackID);
+
+ /**
+ * Adds aListener to the source stream of track aTrackID in this stream.
+ * When the MediaStreamGraph processes the added listener, it will traverse
+ * the graph and add it to the track's source stream (remapping the TrackID
+ * along the way).
+ * Note that the listener will be notified on the MediaStreamGraph thread
+ * with whether the installation of it at the source was successful or not.
+ */
+ virtual void AddDirectTrackListener(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID);
+
+ /**
+ * Removes aListener from the source stream of track aTrackID in this stream.
+ * Note that the listener has already been removed if the link between the
+ * source of track aTrackID and this stream has been broken (and made track
+ * aTrackID end). The caller doesn't have to care about this, removing when
+ * the source cannot be found, or when the listener had already been removed
+ * does nothing.
+ */
+ virtual void RemoveDirectTrackListener(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID);
+
+ // A disabled track has video replaced by black, and audio replaced by
+ // silence.
+ void SetTrackEnabled(TrackID aTrackID, DisabledTrackMode aMode);
+
+ // Finish event will be notified by calling methods of aListener. It is the
+ // responsibility of the caller to remove aListener before it is destroyed.
+ void AddMainThreadListener(MainThreadMediaStreamListener* aListener);
+ // It's safe to call this even if aListener is not currently a listener;
+ // the call will be ignored.
+ void RemoveMainThreadListener(MainThreadMediaStreamListener* aListener)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aListener);
+ mMainThreadListeners.RemoveElement(aListener);
+ }
+
+ /**
+ * Ensure a runnable will run on the main thread after running all pending
+ * updates that were sent from the graph thread or will be sent before the
+ * graph thread receives the next graph update.
+ *
+ * If the graph has been shut down or destroyed, then the runnable will be
+ * dispatched to the event queue immediately. If the graph is non-realtime
+ * and has not started, then the runnable will be run
+ * synchronously/immediately. (There are no pending updates in these
+ * situations.)
+ *
+ * Main thread only.
+ */
+ void RunAfterPendingUpdates(already_AddRefed<nsIRunnable> aRunnable);
+
+ // Signal that the client is done with this MediaStream. It will be deleted
+ // later. Do not mix usage of Destroy() with RegisterUser()/UnregisterUser().
+ // That will cause the MediaStream to be destroyed twice, which will cause
+ // some assertions to fail.
+ virtual void Destroy();
+ // Signal that a client is using this MediaStream. Useful to not have to
+ // explicitly manage ownership (responsibility to Destroy()) when there are
+ // multiple clients using a MediaStream.
+ void RegisterUser();
+ // Signal that a client no longer needs this MediaStream. When the number of
+ // clients using this MediaStream reaches 0, it will be destroyed.
+ void UnregisterUser();
+
+ // Returns the main-thread's view of how much data has been processed by
+ // this stream.
+ StreamTime GetCurrentTime()
+ {
+ NS_ASSERTION(NS_IsMainThread(), "Call only on main thread");
+ return mMainThreadCurrentTime;
+ }
+ // Return the main thread's view of whether this stream has finished.
+ bool IsFinished()
+ {
+ NS_ASSERTION(NS_IsMainThread(), "Call only on main thread");
+ return mMainThreadFinished;
+ }
+
+ bool IsDestroyed()
+ {
+ NS_ASSERTION(NS_IsMainThread(), "Call only on main thread");
+ return mMainThreadDestroyed;
+ }
+
+ friend class MediaStreamGraphImpl;
+ friend class MediaInputPort;
+ friend class AudioNodeExternalInputStream;
+
+ virtual SourceMediaStream* AsSourceStream() { return nullptr; }
+ virtual ProcessedMediaStream* AsProcessedStream() { return nullptr; }
+ virtual AudioNodeStream* AsAudioNodeStream() { return nullptr; }
+ virtual TrackUnionStream* AsTrackUnionStream() { return nullptr; }
+
+ // These Impl methods perform the core functionality of the control methods
+ // above, on the media graph thread.
+ /**
+ * Stop all stream activity and disconnect it from all inputs and outputs.
+ * This must be idempotent.
+ */
+ virtual void DestroyImpl();
+ StreamTime GetTracksEnd() { return mTracks.GetEnd(); }
+#ifdef DEBUG
+ void DumpTrackInfo() { return mTracks.DumpTrackInfo(); }
+#endif
+ void SetAudioOutputVolumeImpl(void* aKey, float aVolume);
+ void AddAudioOutputImpl(void* aKey);
+ // Returns true if this stream has an audio output.
+ bool HasAudioOutput()
+ {
+ return !mAudioOutputs.IsEmpty();
+ }
+ void RemoveAudioOutputImpl(void* aKey);
+ void AddVideoOutputImpl(already_AddRefed<MediaStreamVideoSink> aSink,
+ TrackID aID);
+ void RemoveVideoOutputImpl(MediaStreamVideoSink* aSink, TrackID aID);
+ void AddListenerImpl(already_AddRefed<MediaStreamListener> aListener);
+ void RemoveListenerImpl(MediaStreamListener* aListener);
+ void RemoveAllListenersImpl();
+ virtual void AddTrackListenerImpl(already_AddRefed<MediaStreamTrackListener> aListener,
+ TrackID aTrackID);
+ virtual void RemoveTrackListenerImpl(MediaStreamTrackListener* aListener,
+ TrackID aTrackID);
+ virtual void AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
+ TrackID aTrackID);
+ virtual void RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID);
+ virtual void SetTrackEnabledImpl(TrackID aTrackID, DisabledTrackMode aMode);
+ DisabledTrackMode GetDisabledTrackMode(TrackID aTrackID);
+
+ void AddConsumer(MediaInputPort* aPort)
+ {
+ mConsumers.AppendElement(aPort);
+ }
+ void RemoveConsumer(MediaInputPort* aPort)
+ {
+ mConsumers.RemoveElement(aPort);
+ }
+ uint32_t ConsumerCount()
+ {
+ return mConsumers.Length();
+ }
+ StreamTracks& GetStreamTracks() { return mTracks; }
+ GraphTime GetStreamTracksStartTime() { return mTracksStartTime; }
+
+ double StreamTimeToSeconds(StreamTime aTime)
+ {
+ NS_ASSERTION(0 <= aTime && aTime <= STREAM_TIME_MAX, "Bad time");
+ return static_cast<double>(aTime)/mTracks.GraphRate();
+ }
+ int64_t StreamTimeToMicroseconds(StreamTime aTime)
+ {
+ NS_ASSERTION(0 <= aTime && aTime <= STREAM_TIME_MAX, "Bad time");
+ return (aTime*1000000)/mTracks.GraphRate();
+ }
+ StreamTime SecondsToNearestStreamTime(double aSeconds)
+ {
+ NS_ASSERTION(0 <= aSeconds && aSeconds <= TRACK_TICKS_MAX/TRACK_RATE_MAX,
+ "Bad seconds");
+ return mTracks.GraphRate() * aSeconds + 0.5;
+ }
+ StreamTime MicrosecondsToStreamTimeRoundDown(int64_t aMicroseconds) {
+ return (aMicroseconds*mTracks.GraphRate())/1000000;
+ }
+
+ TrackTicks TimeToTicksRoundUp(TrackRate aRate, StreamTime aTime)
+ {
+ return RateConvertTicksRoundUp(aRate, mTracks.GraphRate(), aTime);
+ }
+ StreamTime TicksToTimeRoundDown(TrackRate aRate, TrackTicks aTicks)
+ {
+ return RateConvertTicksRoundDown(mTracks.GraphRate(), aRate, aTicks);
+ }
+ /**
+ * Convert graph time to stream time. aTime must be <= mStateComputedTime
+ * to ensure we know exactly how much time this stream will be blocked during
+ * the interval.
+ */
+ StreamTime GraphTimeToStreamTimeWithBlocking(GraphTime aTime);
+ /**
+ * Convert graph time to stream time. This assumes there is no blocking time
+ * to take account of, which is always true except between a stream
+ * having its blocking time calculated in UpdateGraph and its blocking time
+ * taken account of in UpdateCurrentTimeForStreams.
+ */
+ StreamTime GraphTimeToStreamTime(GraphTime aTime);
+ /**
+ * Convert stream time to graph time. This assumes there is no blocking time
+ * to take account of, which is always true except between a stream
+ * having its blocking time calculated in UpdateGraph and its blocking time
+ * taken account of in UpdateCurrentTimeForStreams.
+ */
+ GraphTime StreamTimeToGraphTime(StreamTime aTime);
+
+ bool IsFinishedOnGraphThread() { return mFinished; }
+ void FinishOnGraphThread();
+
+ bool HasCurrentData() { return mHasCurrentData; }
+
+ /**
+ * Find track by track id.
+ */
+ StreamTracks::Track* FindTrack(TrackID aID);
+
+ StreamTracks::Track* EnsureTrack(TrackID aTrack);
+
+ virtual void ApplyTrackDisabling(TrackID aTrackID, MediaSegment* aSegment, MediaSegment* aRawSegment = nullptr);
+
+ // Return true if the main thread needs to observe updates from this stream.
+ virtual bool MainThreadNeedsUpdates() const
+ {
+ return true;
+ }
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+
+ void SetAudioChannelType(dom::AudioChannel aType) { mAudioChannelType = aType; }
+ dom::AudioChannel AudioChannelType() const { return mAudioChannelType; }
+
+ bool IsSuspended() { return mSuspendedCount > 0; }
+ void IncrementSuspendCount() { ++mSuspendedCount; }
+ void DecrementSuspendCount()
+ {
+ NS_ASSERTION(mSuspendedCount > 0, "Suspend count underrun");
+ --mSuspendedCount;
+ }
+
+protected:
+ // |AdvanceTimeVaryingValuesToCurrentTime| will be override in SourceMediaStream.
+ virtual void AdvanceTimeVaryingValuesToCurrentTime(GraphTime aCurrentTime,
+ GraphTime aBlockedTime)
+ {
+ mTracksStartTime += aBlockedTime;
+ mTracks.ForgetUpTo(aCurrentTime - mTracksStartTime);
+ }
+
+ void NotifyMainThreadListeners()
+ {
+ NS_ASSERTION(NS_IsMainThread(), "Call only on main thread");
+
+ for (int32_t i = mMainThreadListeners.Length() - 1; i >= 0; --i) {
+ mMainThreadListeners[i]->NotifyMainThreadStreamFinished();
+ }
+ mMainThreadListeners.Clear();
+ }
+
+ bool ShouldNotifyStreamFinished()
+ {
+ NS_ASSERTION(NS_IsMainThread(), "Call only on main thread");
+ if (!mMainThreadFinished || mFinishedNotificationSent) {
+ return false;
+ }
+
+ mFinishedNotificationSent = true;
+ return true;
+ }
+
+ // This state is all initialized on the main thread but
+ // otherwise modified only on the media graph thread.
+
+ // Buffered data. The start of the buffer corresponds to mTracksStartTime.
+ // Conceptually the buffer contains everything this stream has ever played,
+ // but we forget some prefix of the buffered data to bound the space usage.
+ StreamTracks mTracks;
+ // The time when the buffered data could be considered to have started playing.
+ // This increases over time to account for time the stream was blocked before
+ // mCurrentTime.
+ GraphTime mTracksStartTime;
+
+ // Client-set volume of this stream
+ struct AudioOutput {
+ explicit AudioOutput(void* aKey) : mKey(aKey), mVolume(1.0f) {}
+ void* mKey;
+ float mVolume;
+ };
+ nsTArray<AudioOutput> mAudioOutputs;
+ nsTArray<TrackBound<MediaStreamVideoSink>> mVideoOutputs;
+ // We record the last played video frame to avoid playing the frame again
+ // with a different frame id.
+ VideoFrame mLastPlayedVideoFrame;
+ nsTArray<RefPtr<MediaStreamListener> > mListeners;
+ nsTArray<TrackBound<MediaStreamTrackListener>> mTrackListeners;
+ nsTArray<MainThreadMediaStreamListener*> mMainThreadListeners;
+ // List of disabled TrackIDs and their associated disabled mode.
+ // They can either by disabled by frames being replaced by black, or by
+ // retaining the previous frame.
+ nsTArray<DisabledTrack> mDisabledTracks;
+
+ // GraphTime at which this stream starts blocking.
+ // This is only valid up to mStateComputedTime. The stream is considered to
+ // have not been blocked before mCurrentTime (its mTracksStartTime is increased
+ // as necessary to account for that time instead).
+ GraphTime mStartBlocking;
+
+ // MediaInputPorts to which this is connected
+ nsTArray<MediaInputPort*> mConsumers;
+
+ // Where audio output is going. There is one AudioOutputStream per
+ // audio track.
+ struct AudioOutputStream
+ {
+ // When we started audio playback for this track.
+ // Add mStream->GetPosition() to find the current audio playback position.
+ GraphTime mAudioPlaybackStartTime;
+ // Amount of time that we've wanted to play silence because of the stream
+ // blocking.
+ MediaTime mBlockedAudioTime;
+ // Last tick written to the audio output.
+ StreamTime mLastTickWritten;
+ TrackID mTrackID;
+ };
+ nsTArray<AudioOutputStream> mAudioOutputStreams;
+
+ /**
+ * Number of outstanding suspend operations on this stream. Stream is
+ * suspended when this is > 0.
+ */
+ int32_t mSuspendedCount;
+
+ /**
+ * When true, this means the stream will be finished once all
+ * buffered data has been consumed.
+ */
+ bool mFinished;
+ /**
+ * When true, mFinished is true and we've played all the data in this stream
+ * and fired NotifyFinished notifications.
+ */
+ bool mNotifiedFinished;
+ /**
+ * When true, the last NotifyBlockingChanged delivered to the listeners
+ * indicated that the stream is blocked.
+ */
+ bool mNotifiedBlocked;
+ /**
+ * True if some data can be present by this stream if/when it's unblocked.
+ * Set by the stream itself on the MediaStreamGraph thread. Only changes
+ * from false to true once a stream has data, since we won't
+ * unblock it until there's more data.
+ */
+ bool mHasCurrentData;
+ /**
+ * True if mHasCurrentData is true and we've notified listeners.
+ */
+ bool mNotifiedHasCurrentData;
+
+ // Main-thread views of state
+ StreamTime mMainThreadCurrentTime;
+ bool mMainThreadFinished;
+ bool mFinishedNotificationSent;
+ bool mMainThreadDestroyed;
+ int mNrOfMainThreadUsers;
+
+ // Our media stream graph. null if destroyed on the graph thread.
+ MediaStreamGraphImpl* mGraph;
+
+ dom::AudioChannel mAudioChannelType;
+};
+
+/**
+ * This is a stream into which a decoder can write audio and video.
+ *
+ * Audio and video can be written on any thread, but you probably want to
+ * always write from the same thread to avoid unexpected interleavings.
+ */
+class SourceMediaStream : public MediaStream
+{
+public:
+ explicit SourceMediaStream();
+
+ SourceMediaStream* AsSourceStream() override { return this; }
+
+ // Media graph thread only
+
+ // Users of audio inputs go through the stream so it can track when the
+ // last stream referencing an input goes away, so it can close the cubeb
+ // input. Also note: callable on any thread (though it bounces through
+ // MainThread to set the command if needed).
+ nsresult OpenAudioInput(int aID,
+ AudioDataListener *aListener);
+ // Note: also implied when Destroy() happens
+ void CloseAudioInput();
+
+ void DestroyImpl() override;
+
+ // Call these on any thread.
+ /**
+ * Enable or disable pulling. When pulling is enabled, NotifyPull
+ * gets called on MediaStreamListeners for this stream during the
+ * MediaStreamGraph control loop. Pulling is initially disabled.
+ * Due to unavoidable race conditions, after a call to SetPullEnabled(false)
+ * it is still possible for a NotifyPull to occur.
+ */
+ void SetPullEnabled(bool aEnabled);
+
+ /**
+ * These add/remove DirectListeners, which allow bypassing the graph and any
+ * synchronization delays for e.g. PeerConnection, which wants the data ASAP
+ * and lets the far-end handle sync and playout timing.
+ */
+ void NotifyListenersEventImpl(MediaStreamGraphEvent aEvent);
+ void NotifyListenersEvent(MediaStreamGraphEvent aEvent);
+ void AddDirectListener(DirectMediaStreamListener* aListener);
+ void RemoveDirectListener(DirectMediaStreamListener* aListener);
+
+ enum {
+ ADDTRACK_QUEUED = 0x01 // Queue track add until FinishAddTracks()
+ };
+ /**
+ * Add a new track to the stream starting at the given base time (which
+ * must be greater than or equal to the last time passed to
+ * AdvanceKnownTracksTime). Takes ownership of aSegment. aSegment should
+ * contain data starting after aStart.
+ */
+ void AddTrack(TrackID aID, StreamTime aStart, MediaSegment* aSegment,
+ uint32_t aFlags = 0)
+ {
+ AddTrackInternal(aID, GraphRate(), aStart, aSegment, aFlags);
+ }
+
+ /**
+ * Like AddTrack, but resamples audio from aRate to the graph rate.
+ */
+ void AddAudioTrack(TrackID aID, TrackRate aRate, StreamTime aStart,
+ AudioSegment* aSegment, uint32_t aFlags = 0);
+
+ /**
+ * Call after a series of AddTrack or AddAudioTrack calls to implement
+ * any pending track adds.
+ */
+ void FinishAddTracks();
+
+ /**
+ * Append media data to a track. Ownership of aSegment remains with the caller,
+ * but aSegment is emptied.
+ * Returns false if the data was not appended because no such track exists
+ * or the stream was already finished.
+ */
+ bool AppendToTrack(TrackID aID, MediaSegment* aSegment, MediaSegment *aRawSegment = nullptr);
+ /**
+ * Get the stream time of the end of the data that has been appended so far.
+ * Can be called from any thread but won't be useful if it can race with
+ * an AppendToTrack call, so should probably just be called from the thread
+ * that also calls AppendToTrack.
+ */
+ StreamTime GetEndOfAppendedData(TrackID aID);
+ /**
+ * Indicate that a track has ended. Do not do any more API calls
+ * affecting this track.
+ * Ignored if the track does not exist.
+ */
+ void EndTrack(TrackID aID);
+ /**
+ * Indicate that no tracks will be added starting before time aKnownTime.
+ * aKnownTime must be >= its value at the last call to AdvanceKnownTracksTime.
+ */
+ void AdvanceKnownTracksTime(StreamTime aKnownTime);
+ /**
+ * Indicate that this stream should enter the "finished" state. All tracks
+ * must have been ended via EndTrack. The finish time of the stream is
+ * when all tracks have ended.
+ */
+ void FinishWithLockHeld();
+ void Finish()
+ {
+ MutexAutoLock lock(mMutex);
+ FinishWithLockHeld();
+ }
+
+ // Overriding allows us to hold the mMutex lock while changing the track enable status
+ void SetTrackEnabledImpl(TrackID aTrackID, DisabledTrackMode aMode) override;
+
+ // Overriding allows us to ensure mMutex is locked while changing the track enable status
+ void
+ ApplyTrackDisabling(TrackID aTrackID, MediaSegment* aSegment,
+ MediaSegment* aRawSegment = nullptr) override {
+ mMutex.AssertCurrentThreadOwns();
+ MediaStream::ApplyTrackDisabling(aTrackID, aSegment, aRawSegment);
+ }
+
+ /**
+ * End all tracks and Finish() this stream. Used to voluntarily revoke access
+ * to a LocalMediaStream.
+ */
+ void EndAllTrackAndFinish();
+
+ void RegisterForAudioMixing();
+
+ /**
+ * Returns true if this SourceMediaStream contains at least one audio track
+ * that is in pending state.
+ * This is thread safe, and takes the SourceMediaStream mutex.
+ */
+ bool HasPendingAudioTrack();
+
+ TimeStamp GetStreamTracksStrartTimeStamp() {
+ MutexAutoLock lock(mMutex);
+ return mStreamTracksStartTimeStamp;
+ }
+
+ // XXX need a Reset API
+
+ friend class MediaStreamGraphImpl;
+
+protected:
+ enum TrackCommands : uint32_t;
+
+ virtual ~SourceMediaStream();
+
+ /**
+ * Data for each track that hasn't ended.
+ */
+ struct TrackData {
+ TrackID mID;
+ // Sample rate of the input data.
+ TrackRate mInputRate;
+ // Resampler if the rate of the input track does not match the
+ // MediaStreamGraph's.
+ nsAutoRef<SpeexResamplerState> mResampler;
+ int mResamplerChannelCount;
+ StreamTime mStart;
+ // End-time of data already flushed to the track (excluding mData)
+ StreamTime mEndOfFlushedData;
+ // Each time the track updates are flushed to the media graph thread,
+ // the segment buffer is emptied.
+ nsAutoPtr<MediaSegment> mData;
+ // Each time the track updates are flushed to the media graph thread,
+ // this is cleared.
+ uint32_t mCommands;
+ };
+
+ bool NeedsMixing();
+
+ void ResampleAudioToGraphSampleRate(TrackData* aTrackData, MediaSegment* aSegment);
+
+ void AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
+ TrackID aTrackID) override;
+ void RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID) override;
+
+ void AddTrackInternal(TrackID aID, TrackRate aRate,
+ StreamTime aStart, MediaSegment* aSegment,
+ uint32_t aFlags);
+
+ TrackData* FindDataForTrack(TrackID aID)
+ {
+ mMutex.AssertCurrentThreadOwns();
+ for (uint32_t i = 0; i < mUpdateTracks.Length(); ++i) {
+ if (mUpdateTracks[i].mID == aID) {
+ return &mUpdateTracks[i];
+ }
+ }
+ return nullptr;
+ }
+
+ /**
+ * Notify direct consumers of new data to one of the stream tracks.
+ * The data doesn't have to be resampled (though it may be). This is called
+ * from AppendToTrack on the thread providing the data, and will call
+ * the Listeners on this thread.
+ */
+ void NotifyDirectConsumers(TrackData *aTrack,
+ MediaSegment *aSegment);
+
+ virtual void
+ AdvanceTimeVaryingValuesToCurrentTime(GraphTime aCurrentTime,
+ GraphTime aBlockedTime) override;
+ void SetStreamTracksStartTimeStamp(const TimeStamp& aTimeStamp)
+ {
+ MutexAutoLock lock(mMutex);
+ mStreamTracksStartTimeStamp = aTimeStamp;
+ }
+
+ // Only accessed on the MSG thread. Used so to ask the MSGImpl to usecount
+ // users of a specific input.
+ // XXX Should really be a CubebUtils::AudioDeviceID, but they aren't
+ // copyable (opaque pointers)
+ RefPtr<AudioDataListener> mInputListener;
+
+ // This must be acquired *before* MediaStreamGraphImpl's lock, if they are
+ // held together.
+ Mutex mMutex;
+ // protected by mMutex
+ StreamTime mUpdateKnownTracksTime;
+ // This time stamp will be updated in adding and blocked SourceMediaStream,
+ // |AddStreamGraphThread| and |AdvanceTimeVaryingValuesToCurrentTime| in
+ // particularly.
+ TimeStamp mStreamTracksStartTimeStamp;
+ nsTArray<TrackData> mUpdateTracks;
+ nsTArray<TrackData> mPendingTracks;
+ nsTArray<RefPtr<DirectMediaStreamListener>> mDirectListeners;
+ nsTArray<TrackBound<DirectMediaStreamTrackListener>> mDirectTrackListeners;
+ bool mPullEnabled;
+ bool mUpdateFinished;
+ bool mNeedsMixing;
+};
+
+/**
+ * The blocking mode decides how a track should be blocked in a MediaInputPort.
+ */
+enum class BlockingMode
+{
+ /**
+ * BlockingMode CREATION blocks the source track from being created
+ * in the destination. It'll end if it already exists.
+ */
+ CREATION,
+ /**
+ * BlockingMode END_EXISTING allows a track to be created in the destination
+ * but will end it before any data has been passed through.
+ */
+ END_EXISTING,
+};
+
+/**
+ * Represents a connection between a ProcessedMediaStream and one of its
+ * input streams.
+ * We make these refcounted so that stream-related messages with MediaInputPort*
+ * pointers can be sent to the main thread safely.
+ *
+ * A port can be locked to a specific track in the source stream, in which case
+ * only this track will be forwarded to the destination stream. TRACK_ANY
+ * can used to signal that all tracks shall be forwarded.
+ *
+ * When a port is locked to a specific track in the source stream, it may also
+ * indicate a TrackID to map this source track to in the destination stream
+ * by setting aDestTrack to an explicit ID. When we do this, we must know
+ * that this TrackID in the destination stream is available. We assert during
+ * processing that the ID is available and that there are no generic input
+ * ports already attached to the destination stream.
+ * Note that this is currently only handled by TrackUnionStreams.
+ *
+ * When a port's source or destination stream dies, the stream's DestroyImpl
+ * calls MediaInputPort::Disconnect to disconnect the port from
+ * the source and destination streams.
+ *
+ * The lifetimes of MediaInputPort are controlled from the main thread.
+ * The media graph adds a reference to the port. When a MediaInputPort is no
+ * longer needed, main-thread code sends a Destroy message for the port and
+ * clears its reference (the last main-thread reference to the object). When
+ * the Destroy message is processed on the graph manager thread we disconnect
+ * the port and drop the graph's reference, destroying the object.
+ */
+class MediaInputPort final
+{
+private:
+ // Do not call this constructor directly. Instead call aDest->AllocateInputPort.
+ MediaInputPort(MediaStream* aSource, TrackID& aSourceTrack,
+ ProcessedMediaStream* aDest, TrackID& aDestTrack,
+ uint16_t aInputNumber, uint16_t aOutputNumber)
+ : mSource(aSource)
+ , mSourceTrack(aSourceTrack)
+ , mDest(aDest)
+ , mDestTrack(aDestTrack)
+ , mInputNumber(aInputNumber)
+ , mOutputNumber(aOutputNumber)
+ , mGraph(nullptr)
+ {
+ MOZ_COUNT_CTOR(MediaInputPort);
+ }
+
+ // Private destructor, to discourage deletion outside of Release():
+ ~MediaInputPort()
+ {
+ MOZ_COUNT_DTOR(MediaInputPort);
+ }
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaInputPort)
+
+ // Called on graph manager thread
+ // Do not call these from outside MediaStreamGraph.cpp!
+ void Init();
+ // Called during message processing to trigger removal of this stream.
+ void Disconnect();
+
+ // Control API
+ /**
+ * Disconnects and destroys the port. The caller must not reference this
+ * object again.
+ */
+ void Destroy();
+
+ // Any thread
+ MediaStream* GetSource() { return mSource; }
+ TrackID GetSourceTrackId() { return mSourceTrack; }
+ ProcessedMediaStream* GetDestination() { return mDest; }
+ TrackID GetDestinationTrackId() { return mDestTrack; }
+
+ /**
+ * Block aTrackId in the source stream from being passed through the port.
+ * Consumers will interpret this track as ended.
+ * Returns a pledge that resolves on the main thread after the track block has
+ * been applied by the MSG.
+ */
+ already_AddRefed<media::Pledge<bool, nsresult>> BlockSourceTrackId(TrackID aTrackId,
+ BlockingMode aBlockingMode);
+private:
+ void BlockSourceTrackIdImpl(TrackID aTrackId, BlockingMode aBlockingMode);
+
+public:
+ // Returns true if aTrackId has not been blocked for any reason and this port
+ // has not been locked to another track.
+ bool PassTrackThrough(TrackID aTrackId) {
+ bool blocked = false;
+ for (auto pair : mBlockedTracks) {
+ if (pair.first() == aTrackId &&
+ (pair.second() == BlockingMode::CREATION ||
+ pair.second() == BlockingMode::END_EXISTING)) {
+ blocked = true;
+ break;
+ }
+ }
+ return !blocked && (mSourceTrack == TRACK_ANY || mSourceTrack == aTrackId);
+ }
+
+ // Returns true if aTrackId has not been blocked for track creation and this
+ // port has not been locked to another track.
+ bool AllowCreationOf(TrackID aTrackId) {
+ bool blocked = false;
+ for (auto pair : mBlockedTracks) {
+ if (pair.first() == aTrackId &&
+ pair.second() == BlockingMode::CREATION) {
+ blocked = true;
+ break;
+ }
+ }
+ return !blocked && (mSourceTrack == TRACK_ANY || mSourceTrack == aTrackId);
+ }
+
+ uint16_t InputNumber() const { return mInputNumber; }
+ uint16_t OutputNumber() const { return mOutputNumber; }
+
+ // Call on graph manager thread
+ struct InputInterval {
+ GraphTime mStart;
+ GraphTime mEnd;
+ bool mInputIsBlocked;
+ };
+ // Find the next time interval starting at or after aTime during which
+ // mDest is not blocked and mSource's blocking status does not change.
+ InputInterval GetNextInputInterval(GraphTime aTime);
+
+ /**
+ * Returns the graph that owns this port.
+ */
+ MediaStreamGraphImpl* GraphImpl();
+ MediaStreamGraph* Graph();
+ /**
+ * Sets the graph that owns this stream. Should only be called once.
+ */
+ void SetGraphImpl(MediaStreamGraphImpl* aGraph);
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = 0;
+
+ // Not owned:
+ // - mSource
+ // - mDest
+ // - mGraph
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ friend class MediaStreamGraphImpl;
+ friend class MediaStream;
+ friend class ProcessedMediaStream;
+ // Never modified after Init()
+ MediaStream* mSource;
+ TrackID mSourceTrack;
+ ProcessedMediaStream* mDest;
+ TrackID mDestTrack;
+ // The input and output numbers are optional, and are currently only used by
+ // Web Audio.
+ const uint16_t mInputNumber;
+ const uint16_t mOutputNumber;
+
+ typedef Pair<TrackID, BlockingMode> BlockedTrack;
+ nsTArray<BlockedTrack> mBlockedTracks;
+
+ // Our media stream graph
+ MediaStreamGraphImpl* mGraph;
+};
+
+/**
+ * This stream processes zero or more input streams in parallel to produce
+ * its output. The details of how the output is produced are handled by
+ * subclasses overriding the ProcessInput method.
+ */
+class ProcessedMediaStream : public MediaStream
+{
+public:
+ explicit ProcessedMediaStream()
+ : MediaStream(), mAutofinish(false), mCycleMarker(0)
+ {}
+
+ // Control API.
+ /**
+ * Allocates a new input port attached to source aStream.
+ * This stream can be removed by calling MediaInputPort::Remove().
+ *
+ * The input port is tied to aTrackID in the source stream.
+ * aTrackID can be set to TRACK_ANY to automatically forward all tracks from
+ * aStream.
+ *
+ * If aTrackID is an explicit ID, aDestTrackID can also be made explicit
+ * to ensure that the track is assigned this ID in the destination stream.
+ * To avoid intermittent TrackID collisions the destination stream may not
+ * have any existing generic input ports (with TRACK_ANY source track) when
+ * you allocate an input port with a destination TrackID.
+ *
+ * To end a track in the destination stream forwarded with TRACK_ANY,
+ * it can be blocked in the input port through MediaInputPort::BlockTrackId().
+ *
+ * Tracks in aBlockedTracks will be blocked in the input port initially. This
+ * ensures that they don't get created by the MSG-thread before we can
+ * BlockTrackId() on the main thread.
+ */
+ already_AddRefed<MediaInputPort>
+ AllocateInputPort(MediaStream* aStream,
+ TrackID aTrackID = TRACK_ANY,
+ TrackID aDestTrackID = TRACK_ANY,
+ uint16_t aInputNumber = 0,
+ uint16_t aOutputNumber = 0,
+ nsTArray<TrackID>* aBlockedTracks = nullptr);
+ /**
+ * Force this stream into the finished state.
+ */
+ void Finish();
+ /**
+ * Set the autofinish flag on this stream (defaults to false). When this flag
+ * is set, and all input streams are in the finished state (including if there
+ * are no input streams), this stream automatically enters the finished state.
+ */
+ void SetAutofinish(bool aAutofinish);
+
+ ProcessedMediaStream* AsProcessedStream() override { return this; }
+
+ friend class MediaStreamGraphImpl;
+
+ // Do not call these from outside MediaStreamGraph.cpp!
+ virtual void AddInput(MediaInputPort* aPort);
+ virtual void RemoveInput(MediaInputPort* aPort)
+ {
+ mInputs.RemoveElement(aPort);
+ }
+ bool HasInputPort(MediaInputPort* aPort)
+ {
+ return mInputs.Contains(aPort);
+ }
+ uint32_t InputPortCount()
+ {
+ return mInputs.Length();
+ }
+ virtual MediaStream* GetInputStreamFor(TrackID aTrackID) { return nullptr; }
+ virtual TrackID GetInputTrackIDFor(TrackID aTrackID) { return TRACK_NONE; }
+ void DestroyImpl() override;
+ /**
+ * This gets called after we've computed the blocking states for all
+ * streams (mBlocked is up to date up to mStateComputedTime).
+ * Also, we've produced output for all streams up to this one. If this stream
+ * is not in a cycle, then all its source streams have produced data.
+ * Generate output from aFrom to aTo.
+ * This will be called on streams that have finished. Most stream types should
+ * just return immediately if IsFinishedOnGraphThread(), but some may wish to
+ * update internal state (see AudioNodeStream).
+ * ProcessInput is allowed to call FinishOnGraphThread only if ALLOW_FINISH
+ * is in aFlags. (This flag will be set when aTo >= mStateComputedTime, i.e.
+ * when we've producing the last block of data we need to produce.) Otherwise
+ * we can get into a situation where we've determined the stream should not
+ * block before mStateComputedTime, but the stream finishes before
+ * mStateComputedTime, violating the invariant that finished streams are blocked.
+ */
+ enum {
+ ALLOW_FINISH = 0x01
+ };
+ virtual void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) = 0;
+ void SetAutofinishImpl(bool aAutofinish) { mAutofinish = aAutofinish; }
+
+ // Only valid after MediaStreamGraphImpl::UpdateStreamOrder() has run.
+ // A DelayNode is considered to break a cycle and so this will not return
+ // true for echo loops, only for muted cycles.
+ bool InMutedCycle() const { return mCycleMarker; }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = MediaStream::SizeOfExcludingThis(aMallocSizeOf);
+ // Not owned:
+ // - mInputs elements
+ amount += mInputs.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+protected:
+ // This state is all accessed only on the media graph thread.
+
+ // The list of all inputs that are currently enabled or waiting to be enabled.
+ nsTArray<MediaInputPort*> mInputs;
+ bool mAutofinish;
+ // After UpdateStreamOrder(), mCycleMarker is either 0 or 1 to indicate
+ // whether this stream is in a muted cycle. During ordering it can contain
+ // other marker values - see MediaStreamGraphImpl::UpdateStreamOrder().
+ uint32_t mCycleMarker;
+};
+
+/**
+ * There can be multiple MediaStreamGraph per process: one per AudioChannel.
+ * Additionaly, each OfflineAudioContext object creates its own MediaStreamGraph
+ * object too..
+ */
+class MediaStreamGraph
+{
+public:
+
+ // We ensure that the graph current time advances in multiples of
+ // IdealAudioBlockSize()/AudioStream::PreferredSampleRate(). A stream that
+ // never blocks and has a track with the ideal audio rate will produce audio
+ // in multiples of the block size.
+
+ // Initializing an graph that outputs audio can be quite long on some
+ // platforms. Code that want to output audio at some point can express the
+ // fact that they will need an audio stream at some point by passing
+ // AUDIO_THREAD_DRIVER when getting an instance of MediaStreamGraph, so that
+ // the graph starts with the right driver.
+ enum GraphDriverType {
+ AUDIO_THREAD_DRIVER,
+ SYSTEM_THREAD_DRIVER,
+ OFFLINE_THREAD_DRIVER
+ };
+ static const uint32_t AUDIO_CALLBACK_DRIVER_SHUTDOWN_TIMEOUT = 20*1000;
+
+ // Main thread only
+ static MediaStreamGraph* GetInstance(GraphDriverType aGraphDriverRequested,
+ dom::AudioChannel aChannel);
+ static MediaStreamGraph* CreateNonRealtimeInstance(TrackRate aSampleRate);
+ // Idempotent
+ static void DestroyNonRealtimeInstance(MediaStreamGraph* aGraph);
+
+ virtual nsresult OpenAudioInput(int aID,
+ AudioDataListener *aListener) {
+ return NS_ERROR_FAILURE;
+ }
+ virtual void CloseAudioInput(AudioDataListener *aListener) {}
+
+ // Control API.
+ /**
+ * Create a stream that a media decoder (or some other source of
+ * media data, such as a camera) can write to.
+ */
+ SourceMediaStream* CreateSourceStream();
+ /**
+ * Create a stream that will form the union of the tracks of its input
+ * streams.
+ * A TrackUnionStream contains all the tracks of all its input streams.
+ * Adding a new input stream makes that stream's tracks immediately appear as new
+ * tracks starting at the time the input stream was added.
+ * Removing an input stream makes the output tracks corresponding to the
+ * removed tracks immediately end.
+ * For each added track, the track ID of the output track is the track ID
+ * of the input track or one plus the maximum ID of all previously added
+ * tracks, whichever is greater.
+ * TODO at some point we will probably need to add API to select
+ * particular tracks of each input stream.
+ */
+ ProcessedMediaStream* CreateTrackUnionStream();
+ /**
+ * Create a stream that will mix all its audio input.
+ */
+ ProcessedMediaStream* CreateAudioCaptureStream(TrackID aTrackId);
+
+ /**
+ * Add a new stream to the graph. Main thread.
+ */
+ void AddStream(MediaStream* aStream);
+
+ /* From the main thread, ask the MSG to send back an event when the graph
+ * thread is running, and audio is being processed. */
+ void NotifyWhenGraphStarted(AudioNodeStream* aNodeStream);
+ /* From the main thread, suspend, resume or close an AudioContext.
+ * aStreams are the streams of all the AudioNodes of the AudioContext that
+ * need to be suspended or resumed. This can be empty if this is a second
+ * consecutive suspend call and all the nodes are already suspended.
+ *
+ * This can possibly pause the graph thread, releasing system resources, if
+ * all streams have been suspended/closed.
+ *
+ * When the operation is complete, aPromise is resolved.
+ */
+ void ApplyAudioContextOperation(MediaStream* aDestinationStream,
+ const nsTArray<MediaStream*>& aStreams,
+ dom::AudioContextOperation aState,
+ void* aPromise);
+
+ bool IsNonRealtime() const;
+ /**
+ * Start processing non-realtime for a specific number of ticks.
+ */
+ void StartNonRealtimeProcessing(uint32_t aTicksToProcess);
+
+ /**
+ * Media graph thread only.
+ * Dispatches a runnable that will run on the main thread after all
+ * main-thread stream state has been next updated.
+ * Should only be called during MediaStreamListener callbacks or during
+ * ProcessedMediaStream::ProcessInput().
+ */
+ virtual void DispatchToMainThreadAfterStreamStateUpdate(already_AddRefed<nsIRunnable> aRunnable)
+ {
+ AssertOnGraphThreadOrNotRunning();
+ *mPendingUpdateRunnables.AppendElement() = aRunnable;
+ }
+
+ /**
+ * Returns graph sample rate in Hz.
+ */
+ TrackRate GraphRate() const { return mSampleRate; }
+
+ void RegisterCaptureStreamForWindow(uint64_t aWindowId,
+ ProcessedMediaStream* aCaptureStream);
+ void UnregisterCaptureStreamForWindow(uint64_t aWindowId);
+ already_AddRefed<MediaInputPort> ConnectToCaptureStream(
+ uint64_t aWindowId, MediaStream* aMediaStream);
+
+ /**
+ * Data going to the speakers from the GraphDriver's DataCallback
+ * to notify any listeners (for echo cancellation).
+ */
+ void NotifyOutputData(AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels);
+
+ void AssertOnGraphThreadOrNotRunning() const;
+
+protected:
+ explicit MediaStreamGraph(TrackRate aSampleRate)
+ : mSampleRate(aSampleRate)
+ {
+ MOZ_COUNT_CTOR(MediaStreamGraph);
+ }
+ virtual ~MediaStreamGraph()
+ {
+ MOZ_COUNT_DTOR(MediaStreamGraph);
+ }
+
+ // Media graph thread only
+ nsTArray<nsCOMPtr<nsIRunnable> > mPendingUpdateRunnables;
+
+ /**
+ * Sample rate at which this graph runs. For real time graphs, this is
+ * the rate of the audio mixer. For offline graphs, this is the rate specified
+ * at construction.
+ */
+ TrackRate mSampleRate;
+
+ /**
+ * CloseAudioInput is async, so hold a reference here.
+ */
+ nsTArray<RefPtr<AudioDataListener>> mAudioInputs;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_MEDIASTREAMGRAPH_H_ */
diff --git a/dom/media/MediaStreamGraphImpl.h b/dom/media/MediaStreamGraphImpl.h
new file mode 100644
index 000000000..c71975493
--- /dev/null
+++ b/dom/media/MediaStreamGraphImpl.h
@@ -0,0 +1,863 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASTREAMGRAPHIMPL_H_
+#define MOZILLA_MEDIASTREAMGRAPHIMPL_H_
+
+#include "MediaStreamGraph.h"
+
+#include "nsDataHashtable.h"
+
+#include "nsITimer.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/TimeStamp.h"
+#include "nsIMemoryReporter.h"
+#include "nsIThread.h"
+#include "nsIRunnable.h"
+#include "nsIAsyncShutdown.h"
+#include "Latency.h"
+#include "mozilla/Services.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/WeakPtr.h"
+#include "GraphDriver.h"
+#include "AudioMixer.h"
+
+namespace mozilla {
+
+template <typename T>
+class LinkedList;
+#ifdef MOZ_WEBRTC
+class AudioOutputObserver;
+#endif
+
+/**
+ * A per-stream update message passed from the media graph thread to the
+ * main thread.
+ */
+struct StreamUpdate
+{
+ RefPtr<MediaStream> mStream;
+ StreamTime mNextMainThreadCurrentTime;
+ bool mNextMainThreadFinished;
+};
+
+/**
+ * This represents a message run on the graph thread to modify stream or graph
+ * state. These are passed from main thread to graph thread through
+ * AppendMessage(), or scheduled on the graph thread with
+ * RunMessageAfterProcessing(). A ControlMessage
+ * always has a weak reference to a particular affected stream.
+ */
+class ControlMessage
+{
+public:
+ explicit ControlMessage(MediaStream* aStream) : mStream(aStream)
+ {
+ MOZ_COUNT_CTOR(ControlMessage);
+ }
+ // All these run on the graph thread
+ virtual ~ControlMessage()
+ {
+ MOZ_COUNT_DTOR(ControlMessage);
+ }
+ // Do the action of this message on the MediaStreamGraph thread. Any actions
+ // affecting graph processing should take effect at mProcessedTime.
+ // All stream data for times < mProcessedTime has already been
+ // computed.
+ virtual void Run() = 0;
+ // RunDuringShutdown() is only relevant to messages generated on the main
+ // thread (for AppendMessage()).
+ // When we're shutting down the application, most messages are ignored but
+ // some cleanup messages should still be processed (on the main thread).
+ // This must not add new control messages to the graph.
+ virtual void RunDuringShutdown() {}
+ MediaStream* GetStream() { return mStream; }
+
+protected:
+ // We do not hold a reference to mStream. The graph will be holding
+ // a reference to the stream until the Destroy message is processed. The
+ // last message referencing a stream is the Destroy message for that stream.
+ MediaStream* mStream;
+};
+
+class MessageBlock
+{
+public:
+ nsTArray<UniquePtr<ControlMessage>> mMessages;
+};
+
+/**
+ * The implementation of a media stream graph. This class is private to this
+ * file. It's not in the anonymous namespace because MediaStream needs to
+ * be able to friend it.
+ *
+ * There can be multiple MediaStreamGraph per process: one per AudioChannel.
+ * Additionaly, each OfflineAudioContext object creates its own MediaStreamGraph
+ * object too.
+ */
+class MediaStreamGraphImpl : public MediaStreamGraph,
+ public nsIMemoryReporter,
+ public nsITimerCallback
+{
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIMEMORYREPORTER
+ NS_DECL_NSITIMERCALLBACK
+
+ /**
+ * Use aGraphDriverRequested with SYSTEM_THREAD_DRIVER or AUDIO_THREAD_DRIVER
+ * to create a MediaStreamGraph which provides support for real-time audio
+ * and/or video. Set it to OFFLINE_THREAD_DRIVER in order to create a
+ * non-realtime instance which just churns through its inputs and produces
+ * output. Those objects currently only support audio, and are used to
+ * implement OfflineAudioContext. They do not support MediaStream inputs.
+ */
+ explicit MediaStreamGraphImpl(GraphDriverType aGraphDriverRequested,
+ TrackRate aSampleRate,
+ dom::AudioChannel aChannel);
+
+ /**
+ * Unregisters memory reporting and deletes this instance. This should be
+ * called instead of calling the destructor directly.
+ */
+ void Destroy();
+
+ // Main thread only.
+ /**
+ * This runs every time we need to sync state from the media graph thread
+ * to the main thread while the main thread is not in the middle
+ * of a script. It runs during a "stable state" (per HTML5) or during
+ * an event posted to the main thread.
+ * The boolean affects which boolean controlling runnable dispatch is cleared
+ */
+ void RunInStableState(bool aSourceIsMSG);
+ /**
+ * Ensure a runnable to run RunInStableState is posted to the appshell to
+ * run at the next stable state (per HTML5).
+ * See EnsureStableStateEventPosted.
+ */
+ void EnsureRunInStableState();
+ /**
+ * Called to apply a StreamUpdate to its stream.
+ */
+ void ApplyStreamUpdate(StreamUpdate* aUpdate);
+ /**
+ * Append a ControlMessage to the message queue. This queue is drained
+ * during RunInStableState; the messages will run on the graph thread.
+ */
+ void AppendMessage(UniquePtr<ControlMessage> aMessage);
+
+ // Shutdown helpers.
+
+ static already_AddRefed<nsIAsyncShutdownClient>
+ GetShutdownBarrier()
+ {
+ nsCOMPtr<nsIAsyncShutdownService> svc = services::GetAsyncShutdown();
+ MOZ_RELEASE_ASSERT(svc);
+
+ nsCOMPtr<nsIAsyncShutdownClient> barrier;
+ nsresult rv = svc->GetProfileBeforeChange(getter_AddRefs(barrier));
+ if (!barrier) {
+ // We are probably in a content process. We need to do cleanup at
+ // XPCOM shutdown in leakchecking builds.
+ rv = svc->GetXpcomWillShutdown(getter_AddRefs(barrier));
+ }
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ MOZ_RELEASE_ASSERT(barrier);
+ return barrier.forget();
+ }
+
+ class ShutdownTicket final
+ {
+ public:
+ explicit ShutdownTicket(nsIAsyncShutdownBlocker* aBlocker) : mBlocker(aBlocker) {}
+ NS_INLINE_DECL_REFCOUNTING(ShutdownTicket)
+ private:
+ ~ShutdownTicket()
+ {
+ nsCOMPtr<nsIAsyncShutdownClient> barrier = GetShutdownBarrier();
+ barrier->RemoveBlocker(mBlocker);
+ }
+
+ nsCOMPtr<nsIAsyncShutdownBlocker> mBlocker;
+ };
+
+ /**
+ * Make this MediaStreamGraph enter forced-shutdown state. This state
+ * will be noticed by the media graph thread, which will shut down all streams
+ * and other state controlled by the media graph thread.
+ * This is called during application shutdown.
+ */
+ void ForceShutDown(ShutdownTicket* aShutdownTicket);
+
+ /**
+ * Called before the thread runs.
+ */
+ void Init();
+
+ /**
+ * Respond to CollectReports with sizes collected on the graph thread.
+ */
+ static void
+ FinishCollectReports(nsIHandleReportCallback* aHandleReport,
+ nsISupports* aData,
+ const nsTArray<AudioNodeSizes>& aAudioStreamSizes);
+
+ // The following methods run on the graph thread (or possibly the main thread
+ // if mLifecycleState > LIFECYCLE_RUNNING)
+ void CollectSizesForMemoryReport(
+ already_AddRefed<nsIHandleReportCallback> aHandleReport,
+ already_AddRefed<nsISupports> aHandlerData);
+
+ /**
+ * Returns true if this MediaStreamGraph should keep running
+ */
+ bool UpdateMainThreadState();
+
+ /**
+ * Returns true if this MediaStreamGraph should keep running
+ */
+ bool OneIteration(GraphTime aStateEnd);
+
+ /**
+ * Called from the driver, when the graph thread is about to stop, to tell
+ * the main thread to attempt to begin cleanup. The main thread may either
+ * shutdown or revive the graph depending on whether it receives new
+ * messages.
+ */
+ void SignalMainThreadCleanup();
+
+ bool Running() const
+ {
+ mMonitor.AssertCurrentThreadOwns();
+ return mLifecycleState == LIFECYCLE_RUNNING;
+ }
+
+ /* This is the end of the current iteration, that is, the current time of the
+ * graph. */
+ GraphTime IterationEnd() const;
+
+ /**
+ * Ensure there is an event posted to the main thread to run RunInStableState.
+ * mMonitor must be held.
+ * See EnsureRunInStableState
+ */
+ void EnsureStableStateEventPosted();
+ /**
+ * Generate messages to the main thread to update it for all state changes.
+ * mMonitor must be held.
+ */
+ void PrepareUpdatesToMainThreadState(bool aFinalUpdate);
+ /**
+ * Returns false if there is any stream that has finished but not yet finished
+ * playing out.
+ */
+ bool AllFinishedStreamsNotified();
+ /**
+ * If we are rendering in non-realtime mode, we don't want to send messages to
+ * the main thread at each iteration for performance reasons. We instead
+ * notify the main thread at the same rate
+ */
+ bool ShouldUpdateMainThread();
+ // The following methods are the various stages of RunThread processing.
+ /**
+ * Advance all stream state to mStateComputedTime.
+ */
+ void UpdateCurrentTimeForStreams(GraphTime aPrevCurrentTime);
+ /**
+ * Process chunks for all streams and raise events for properties that have
+ * changed, such as principalId.
+ */
+ void ProcessChunkMetadata(GraphTime aPrevCurrentTime);
+ /**
+ * Process chunks for the given stream and interval, and raise events for
+ * properties that have changed, such as principalId.
+ */
+ template<typename C, typename Chunk>
+ void ProcessChunkMetadataForInterval(MediaStream* aStream,
+ TrackID aTrackID,
+ C& aSegment,
+ StreamTime aStart,
+ StreamTime aEnd);
+ /**
+ * Process graph messages in mFrontMessageQueue.
+ */
+ void RunMessagesInQueue();
+ /**
+ * Update stream processing order and recompute stream blocking until
+ * aEndBlockingDecisions.
+ */
+ void UpdateGraph(GraphTime aEndBlockingDecisions);
+
+ void SwapMessageQueues()
+ {
+ MOZ_ASSERT(CurrentDriver()->OnThread());
+ MOZ_ASSERT(mFrontMessageQueue.IsEmpty());
+ mMonitor.AssertCurrentThreadOwns();
+ mFrontMessageQueue.SwapElements(mBackMessageQueue);
+ }
+ /**
+ * Do all the processing and play the audio and video, from
+ * mProcessedTime to mStateComputedTime.
+ */
+ void Process();
+ /**
+ * Extract any state updates pending in aStream, and apply them.
+ */
+ void ExtractPendingInput(SourceMediaStream* aStream,
+ GraphTime aDesiredUpToTime,
+ bool* aEnsureNextIteration);
+
+ /**
+ * For use during ProcessedMediaStream::ProcessInput() or
+ * MediaStreamListener callbacks, when graph state cannot be changed.
+ * Schedules |aMessage| to run after processing, at a time when graph state
+ * can be changed. Graph thread.
+ */
+ void RunMessageAfterProcessing(UniquePtr<ControlMessage> aMessage);
+
+ /**
+ * Called when a suspend/resume/close operation has been completed, on the
+ * graph thread.
+ */
+ void AudioContextOperationCompleted(MediaStream* aStream,
+ void* aPromise,
+ dom::AudioContextOperation aOperation);
+
+ /**
+ * Apply and AudioContext operation (suspend/resume/closed), on the graph
+ * thread.
+ */
+ void ApplyAudioContextOperationImpl(MediaStream* aDestinationStream,
+ const nsTArray<MediaStream*>& aStreams,
+ dom::AudioContextOperation aOperation,
+ void* aPromise);
+
+ /**
+ * Increment suspend count on aStream and move it to mSuspendedStreams if
+ * necessary.
+ */
+ void IncrementSuspendCount(MediaStream* aStream);
+ /**
+ * Increment suspend count on aStream and move it to mStreams if
+ * necessary.
+ */
+ void DecrementSuspendCount(MediaStream* aStream);
+
+ /*
+ * Move streams from the mStreams to mSuspendedStream if suspending/closing an
+ * AudioContext, or the inverse when resuming an AudioContext.
+ */
+ void SuspendOrResumeStreams(dom::AudioContextOperation aAudioContextOperation,
+ const nsTArray<MediaStream*>& aStreamSet);
+
+ /**
+ * Determine if we have any audio tracks, or are about to add any audiotracks.
+ * Also checks if we'll need the AEC running (i.e. microphone input tracks)
+ */
+ bool AudioTrackPresent(bool& aNeedsAEC);
+
+ /**
+ * Sort mStreams so that every stream not in a cycle is after any streams
+ * it depends on, and every stream in a cycle is marked as being in a cycle.
+ * Also sets mIsConsumed on every stream.
+ */
+ void UpdateStreamOrder();
+
+ /**
+ * Returns smallest value of t such that t is a multiple of
+ * WEBAUDIO_BLOCK_SIZE and t > aTime.
+ */
+ GraphTime RoundUpToNextAudioBlock(GraphTime aTime);
+ /**
+ * Produce data for all streams >= aStreamIndex for the current time interval.
+ * Advances block by block, each iteration producing data for all streams
+ * for a single block.
+ * This is called whenever we have an AudioNodeStream in the graph.
+ */
+ void ProduceDataForStreamsBlockByBlock(uint32_t aStreamIndex,
+ TrackRate aSampleRate);
+ /**
+ * If aStream will underrun between aTime, and aEndBlockingDecisions, returns
+ * the time at which the underrun will start. Otherwise return
+ * aEndBlockingDecisions.
+ */
+ GraphTime WillUnderrun(MediaStream* aStream, GraphTime aEndBlockingDecisions);
+
+ /**
+ * Given a graph time aTime, convert it to a stream time taking into
+ * account the time during which aStream is scheduled to be blocked.
+ */
+ StreamTime GraphTimeToStreamTimeWithBlocking(MediaStream* aStream, GraphTime aTime);
+
+ /**
+ * Call NotifyHaveCurrentData on aStream's listeners.
+ */
+ void NotifyHasCurrentData(MediaStream* aStream);
+ /**
+ * If aStream needs an audio stream but doesn't have one, create it.
+ * If aStream doesn't need an audio stream but has one, destroy it.
+ */
+ void CreateOrDestroyAudioStreams(MediaStream* aStream);
+ /**
+ * Queue audio (mix of stream audio and silence for blocked intervals)
+ * to the audio output stream. Returns the number of frames played.
+ */
+ StreamTime PlayAudio(MediaStream* aStream);
+ /**
+ * No more data will be forthcoming for aStream. The stream will end
+ * at the current buffer end point. The StreamTracks's tracks must be
+ * explicitly set to finished by the caller.
+ */
+ void OpenAudioInputImpl(int aID,
+ AudioDataListener *aListener);
+ virtual nsresult OpenAudioInput(int aID,
+ AudioDataListener *aListener) override;
+ void CloseAudioInputImpl(AudioDataListener *aListener);
+ virtual void CloseAudioInput(AudioDataListener *aListener) override;
+
+ void FinishStream(MediaStream* aStream);
+ /**
+ * Compute how much stream data we would like to buffer for aStream.
+ */
+ StreamTime GetDesiredBufferEnd(MediaStream* aStream);
+ /**
+ * Returns true when there are no active streams.
+ */
+ bool IsEmpty() const
+ {
+ return mStreams.IsEmpty() && mSuspendedStreams.IsEmpty() && mPortCount == 0;
+ }
+
+ /**
+ * Add aStream to the graph and initializes its graph-specific state.
+ */
+ void AddStreamGraphThread(MediaStream* aStream);
+ /**
+ * Remove aStream from the graph. Ensures that pending messages about the
+ * stream back to the main thread are flushed.
+ */
+ void RemoveStreamGraphThread(MediaStream* aStream);
+ /**
+ * Remove aPort from the graph and release it.
+ */
+ void DestroyPort(MediaInputPort* aPort);
+ /**
+ * Mark the media stream order as dirty.
+ */
+ void SetStreamOrderDirty()
+ {
+ mStreamOrderDirty = true;
+ }
+
+ // Always stereo for now.
+ uint32_t AudioChannelCount() const { return 2; }
+
+ double MediaTimeToSeconds(GraphTime aTime) const
+ {
+ NS_ASSERTION(aTime > -STREAM_TIME_MAX && aTime <= STREAM_TIME_MAX,
+ "Bad time");
+ return static_cast<double>(aTime)/GraphRate();
+ }
+
+ GraphTime SecondsToMediaTime(double aS) const
+ {
+ NS_ASSERTION(0 <= aS && aS <= TRACK_TICKS_MAX/TRACK_RATE_MAX,
+ "Bad seconds");
+ return GraphRate() * aS;
+ }
+
+ GraphTime MillisecondsToMediaTime(int32_t aMS) const
+ {
+ return RateConvertTicksRoundDown(GraphRate(), 1000, aMS);
+ }
+
+ /**
+ * Signal to the graph that the thread has paused indefinitly,
+ * or resumed.
+ */
+ void PausedIndefinitly();
+ void ResumedFromPaused();
+
+ /**
+ * Not safe to call off the MediaStreamGraph thread unless monitor is held!
+ */
+ GraphDriver* CurrentDriver() const
+ {
+ AssertOnGraphThreadOrNotRunning();
+ return mDriver;
+ }
+
+ bool RemoveMixerCallback(MixerCallbackReceiver* aReceiver)
+ {
+ return mMixer.RemoveCallback(aReceiver);
+ }
+
+ /**
+ * Effectively set the new driver, while we are switching.
+ * It is only safe to call this at the very end of an iteration, when there
+ * has been a SwitchAtNextIteration call during the iteration. The driver
+ * should return and pass the control to the new driver shortly after.
+ * We can also switch from Revive() (on MainThread), in which case the
+ * monitor is held
+ */
+ void SetCurrentDriver(GraphDriver* aDriver)
+ {
+ AssertOnGraphThreadOrNotRunning();
+ mDriver = aDriver;
+ }
+
+ Monitor& GetMonitor()
+ {
+ return mMonitor;
+ }
+
+ void EnsureNextIteration()
+ {
+ mNeedAnotherIteration = true; // atomic
+ // Note: GraphDriver must ensure that there's no race on setting
+ // mNeedAnotherIteration and mGraphDriverAsleep -- see WaitForNextIteration()
+ if (mGraphDriverAsleep) { // atomic
+ MonitorAutoLock mon(mMonitor);
+ CurrentDriver()->WakeUp(); // Might not be the same driver; might have woken already
+ }
+ }
+
+ void EnsureNextIterationLocked()
+ {
+ mNeedAnotherIteration = true; // atomic
+ if (mGraphDriverAsleep) { // atomic
+ CurrentDriver()->WakeUp(); // Might not be the same driver; might have woken already
+ }
+ }
+
+ // Capture Stream API. This allows to get a mixed-down output for a window.
+ void RegisterCaptureStreamForWindow(uint64_t aWindowId,
+ ProcessedMediaStream* aCaptureStream);
+ void UnregisterCaptureStreamForWindow(uint64_t aWindowId);
+ already_AddRefed<MediaInputPort>
+ ConnectToCaptureStream(uint64_t aWindowId, MediaStream* aMediaStream);
+
+ class StreamSet {
+ public:
+ class iterator {
+ public:
+ explicit iterator(MediaStreamGraphImpl& aGraph)
+ : mGraph(&aGraph), mArrayNum(-1), mArrayIndex(0)
+ {
+ ++(*this);
+ }
+ iterator() : mGraph(nullptr), mArrayNum(2), mArrayIndex(0) {}
+ MediaStream* operator*()
+ {
+ return Array()->ElementAt(mArrayIndex);
+ }
+ iterator operator++()
+ {
+ ++mArrayIndex;
+ while (mArrayNum < 2 &&
+ (mArrayNum < 0 || mArrayIndex >= Array()->Length())) {
+ ++mArrayNum;
+ mArrayIndex = 0;
+ }
+ return *this;
+ }
+ bool operator==(const iterator& aOther) const
+ {
+ return mArrayNum == aOther.mArrayNum && mArrayIndex == aOther.mArrayIndex;
+ }
+ bool operator!=(const iterator& aOther) const
+ {
+ return !(*this == aOther);
+ }
+ private:
+ nsTArray<MediaStream*>* Array()
+ {
+ return mArrayNum == 0 ? &mGraph->mStreams : &mGraph->mSuspendedStreams;
+ }
+ MediaStreamGraphImpl* mGraph;
+ int mArrayNum;
+ uint32_t mArrayIndex;
+ };
+
+ explicit StreamSet(MediaStreamGraphImpl& aGraph) : mGraph(aGraph) {}
+ iterator begin() { return iterator(mGraph); }
+ iterator end() { return iterator(); }
+ private:
+ MediaStreamGraphImpl& mGraph;
+ };
+ StreamSet AllStreams() { return StreamSet(*this); }
+
+ // Data members
+ //
+ /**
+ * Graphs own owning references to their driver, until shutdown. When a driver
+ * switch occur, previous driver is either deleted, or it's ownership is
+ * passed to a event that will take care of the asynchronous cleanup, as
+ * audio stream can take some time to shut down.
+ */
+ RefPtr<GraphDriver> mDriver;
+
+ // The following state is managed on the graph thread only, unless
+ // mLifecycleState > LIFECYCLE_RUNNING in which case the graph thread
+ // is not running and this state can be used from the main thread.
+
+ /**
+ * The graph keeps a reference to each stream.
+ * References are maintained manually to simplify reordering without
+ * unnecessary thread-safe refcount changes.
+ */
+ nsTArray<MediaStream*> mStreams;
+ /**
+ * This stores MediaStreams that are part of suspended AudioContexts.
+ * mStreams and mSuspendStream are disjoint sets: a stream is either suspended
+ * or not suspended. Suspended streams are not ordered in UpdateStreamOrder,
+ * and are therefore not doing any processing.
+ */
+ nsTArray<MediaStream*> mSuspendedStreams;
+ /**
+ * Suspended AudioContext IDs
+ */
+ nsTHashtable<nsUint64HashKey> mSuspendedContexts;
+ /**
+ * Streams from mFirstCycleBreaker to the end of mStreams produce output
+ * before they receive input. They correspond to DelayNodes that are in
+ * cycles.
+ */
+ uint32_t mFirstCycleBreaker;
+ /**
+ * Blocking decisions have been computed up to this time.
+ * Between each iteration, this is the same as mProcessedTime.
+ */
+ GraphTime mStateComputedTime = 0;
+ /**
+ * All stream contents have been computed up to this time.
+ * The next batch of updates from the main thread will be processed
+ * at this time. This is behind mStateComputedTime during processing.
+ */
+ GraphTime mProcessedTime = 0;
+ /**
+ * Date of the last time we updated the main thread with the graph state.
+ */
+ TimeStamp mLastMainThreadUpdate;
+ /**
+ * Number of active MediaInputPorts
+ */
+ int32_t mPortCount;
+
+ /**
+ * Devices to use for cubeb input & output, or NULL for no input (void*),
+ * and boolean to control if we want input/output
+ */
+ bool mInputWanted;
+ int mInputDeviceID;
+ bool mOutputWanted;
+ int mOutputDeviceID;
+ // Maps AudioDataListeners to a usecount of streams using the listener
+ // so we can know when it's no longer in use.
+ nsDataHashtable<nsPtrHashKey<AudioDataListener>, uint32_t> mInputDeviceUsers;
+
+ // True if the graph needs another iteration after the current iteration.
+ Atomic<bool> mNeedAnotherIteration;
+ // GraphDriver may need a WakeUp() if something changes
+ Atomic<bool> mGraphDriverAsleep;
+
+ // mMonitor guards the data below.
+ // MediaStreamGraph normally does its work without holding mMonitor, so it is
+ // not safe to just grab mMonitor from some thread and start monkeying with
+ // the graph. Instead, communicate with the graph thread using provided
+ // mechanisms such as the ControlMessage queue.
+ Monitor mMonitor;
+
+ // Data guarded by mMonitor (must always be accessed with mMonitor held,
+ // regardless of the value of mLifecycleState).
+
+ /**
+ * State to copy to main thread
+ */
+ nsTArray<StreamUpdate> mStreamUpdates;
+ /**
+ * Runnables to run after the next update to main thread state.
+ */
+ nsTArray<nsCOMPtr<nsIRunnable> > mUpdateRunnables;
+ /**
+ * A list of batches of messages to process. Each batch is processed
+ * as an atomic unit.
+ */
+ /*
+ * Message queue processed by the MSG thread during an iteration.
+ * Accessed on graph thread only.
+ */
+ nsTArray<MessageBlock> mFrontMessageQueue;
+ /*
+ * Message queue in which the main thread appends messages.
+ * Access guarded by mMonitor.
+ */
+ nsTArray<MessageBlock> mBackMessageQueue;
+
+ /* True if there will messages to process if we swap the message queues. */
+ bool MessagesQueued() const
+ {
+ mMonitor.AssertCurrentThreadOwns();
+ return !mBackMessageQueue.IsEmpty();
+ }
+ /**
+ * This enum specifies where this graph is in its lifecycle. This is used
+ * to control shutdown.
+ * Shutdown is tricky because it can happen in two different ways:
+ * 1) Shutdown due to inactivity. RunThread() detects that it has no
+ * pending messages and no streams, and exits. The next RunInStableState()
+ * checks if there are new pending messages from the main thread (true only
+ * if new stream creation raced with shutdown); if there are, it revives
+ * RunThread(), otherwise it commits to shutting down the graph. New stream
+ * creation after this point will create a new graph. An async event is
+ * dispatched to Shutdown() the graph's threads and then delete the graph
+ * object.
+ * 2) Forced shutdown at application shutdown, or completion of a
+ * non-realtime graph. A flag is set, RunThread() detects the flag and
+ * exits, the next RunInStableState() detects the flag, and dispatches the
+ * async event to Shutdown() the graph's threads. However the graph object
+ * is not deleted. New messages for the graph are processed synchronously on
+ * the main thread if necessary. When the last stream is destroyed, the
+ * graph object is deleted.
+ *
+ * This should be kept in sync with the LifecycleState_str array in
+ * MediaStreamGraph.cpp
+ */
+ enum LifecycleState
+ {
+ // The graph thread hasn't started yet.
+ LIFECYCLE_THREAD_NOT_STARTED,
+ // RunThread() is running normally.
+ LIFECYCLE_RUNNING,
+ // In the following states, the graph thread is not running so
+ // all "graph thread only" state in this class can be used safely
+ // on the main thread.
+ // RunThread() has exited and we're waiting for the next
+ // RunInStableState(), at which point we can clean up the main-thread
+ // side of the graph.
+ LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP,
+ // RunInStableState() posted a ShutdownRunnable, and we're waiting for it
+ // to shut down the graph thread(s).
+ LIFECYCLE_WAITING_FOR_THREAD_SHUTDOWN,
+ // Graph threads have shut down but we're waiting for remaining streams
+ // to be destroyed. Only happens during application shutdown and on
+ // completed non-realtime graphs, since normally we'd only shut down a
+ // realtime graph when it has no streams.
+ LIFECYCLE_WAITING_FOR_STREAM_DESTRUCTION
+ };
+ /**
+ * Modified only in mMonitor. Transitions to
+ * LIFECYCLE_WAITING_FOR_MAIN_THREAD_CLEANUP occur on the graph thread at
+ * the end of an iteration. All other transitions occur on the main thread.
+ */
+ LifecycleState mLifecycleState;
+ /**
+ * The graph should stop processing at or after this time.
+ */
+ GraphTime mEndTime;
+
+ /**
+ * True when we need to do a forced shutdown during application shutdown.
+ */
+ bool mForceShutDown;
+
+ /**
+ * Drop this reference during shutdown to unblock shutdown.
+ **/
+ RefPtr<ShutdownTicket> mForceShutdownTicket;
+
+ /**
+ * True when we have posted an event to the main thread to run
+ * RunInStableState() and the event hasn't run yet.
+ */
+ bool mPostedRunInStableStateEvent;
+
+ // Main thread only
+
+ /**
+ * Messages posted by the current event loop task. These are forwarded to
+ * the media graph thread during RunInStableState. We can't forward them
+ * immediately because we want all messages between stable states to be
+ * processed as an atomic batch.
+ */
+ nsTArray<UniquePtr<ControlMessage>> mCurrentTaskMessageQueue;
+ /**
+ * True when RunInStableState has determined that mLifecycleState is >
+ * LIFECYCLE_RUNNING. Since only the main thread can reset mLifecycleState to
+ * LIFECYCLE_RUNNING, this can be relied on to not change unexpectedly.
+ */
+ bool mDetectedNotRunning;
+ /**
+ * True when a stable state runner has been posted to the appshell to run
+ * RunInStableState at the next stable state.
+ */
+ bool mPostedRunInStableState;
+ /**
+ * True when processing real-time audio/video. False when processing non-realtime
+ * audio.
+ */
+ bool mRealtime;
+ /**
+ * True when a non-realtime MediaStreamGraph has started to process input. This
+ * value is only accessed on the main thread.
+ */
+ bool mNonRealtimeProcessing;
+ /**
+ * True when a change has happened which requires us to recompute the stream
+ * blocking order.
+ */
+ bool mStreamOrderDirty;
+ /**
+ * Hold a ref to the Latency logger
+ */
+ RefPtr<AsyncLatencyLogger> mLatencyLog;
+ AudioMixer mMixer;
+#ifdef MOZ_WEBRTC
+ RefPtr<AudioOutputObserver> mFarendObserverRef;
+#endif
+
+ dom::AudioChannel AudioChannel() const { return mAudioChannel; }
+
+ // used to limit graph shutdown time
+ nsCOMPtr<nsITimer> mShutdownTimer;
+
+private:
+ virtual ~MediaStreamGraphImpl();
+
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf)
+
+ /**
+ * This class uses manual memory management, and all pointers to it are raw
+ * pointers. However, in order for it to implement nsIMemoryReporter, it needs
+ * to implement nsISupports and so be ref-counted. So it maintains a single
+ * nsRefPtr to itself, giving it a ref-count of 1 during its entire lifetime,
+ * and Destroy() nulls this self-reference in order to trigger self-deletion.
+ */
+ RefPtr<MediaStreamGraphImpl> mSelfRef;
+
+ struct WindowAndStream
+ {
+ uint64_t mWindowId;
+ RefPtr<ProcessedMediaStream> mCaptureStreamSink;
+ };
+ /**
+ * Stream for window audio capture.
+ */
+ nsTArray<WindowAndStream> mWindowCaptureStreams;
+
+#ifdef DEBUG
+ /**
+ * Used to assert when AppendMessage() runs ControlMessages synchronously.
+ */
+ bool mCanRunMessagesSynchronously;
+#endif
+
+ dom::AudioChannel mAudioChannel;
+};
+
+} // namespace mozilla
+
+#endif /* MEDIASTREAMGRAPHIMPL_H_ */
diff --git a/dom/media/MediaStreamListener.cpp b/dom/media/MediaStreamListener.cpp
new file mode 100644
index 000000000..d9fbb6e29
--- /dev/null
+++ b/dom/media/MediaStreamListener.cpp
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamListener.h"
+
+#include "AudioSegment.h"
+#include "VideoSegment.h"
+#include "StreamTracks.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#define LOG(type, msg) MOZ_LOG(gMediaStreamGraphLog, type, msg)
+
+void
+DirectMediaStreamTrackListener::MirrorAndDisableSegment(AudioSegment& aFrom,
+ AudioSegment& aTo)
+{
+ aTo.Clear();
+ aTo.AppendNullData(aFrom.GetDuration());
+}
+
+void
+DirectMediaStreamTrackListener::MirrorAndDisableSegment(VideoSegment& aFrom,
+ VideoSegment& aTo,
+ DisabledTrackMode aMode)
+{
+ aTo.Clear();
+ if (aMode == DisabledTrackMode::SILENCE_BLACK) {
+ for (VideoSegment::ChunkIterator it(aFrom); !it.IsEnded(); it.Next()) {
+ aTo.AppendFrame(do_AddRef(it->mFrame.GetImage()),
+ it->GetDuration(),
+ it->mFrame.GetIntrinsicSize(),
+ it->GetPrincipalHandle(),
+ true);
+ }
+ } else if (aMode == DisabledTrackMode::SILENCE_FREEZE) {
+ aTo.AppendNullData(aFrom.GetDuration());
+ }
+}
+
+void
+DirectMediaStreamTrackListener::NotifyRealtimeTrackDataAndApplyTrackDisabling(MediaStreamGraph* aGraph,
+ StreamTime aTrackOffset,
+ MediaSegment& aMedia)
+{
+ if (mDisabledFreezeCount == 0 && mDisabledBlackCount == 0) {
+ NotifyRealtimeTrackData(aGraph, aTrackOffset, aMedia);
+ return;
+ }
+
+ DisabledTrackMode mode = mDisabledBlackCount > 0
+ ? DisabledTrackMode::SILENCE_BLACK
+ : DisabledTrackMode::SILENCE_FREEZE;
+ if (!mMedia) {
+ mMedia = aMedia.CreateEmptyClone();
+ }
+ if (aMedia.GetType() == MediaSegment::AUDIO) {
+ MirrorAndDisableSegment(static_cast<AudioSegment&>(aMedia),
+ static_cast<AudioSegment&>(*mMedia));
+ } else if (aMedia.GetType() == MediaSegment::VIDEO) {
+ MirrorAndDisableSegment(static_cast<VideoSegment&>(aMedia),
+ static_cast<VideoSegment&>(*mMedia),
+ mode);
+ } else {
+ MOZ_CRASH("Unsupported media type");
+ }
+ NotifyRealtimeTrackData(aGraph, aTrackOffset, *mMedia);
+}
+
+void
+DirectMediaStreamTrackListener::IncreaseDisabled(DisabledTrackMode aMode)
+{
+ if (aMode == DisabledTrackMode::SILENCE_FREEZE) {
+ ++mDisabledFreezeCount;
+ } else if (aMode == DisabledTrackMode::SILENCE_BLACK) {
+ ++mDisabledBlackCount;
+ } else {
+ MOZ_ASSERT(false, "Unknown disabled mode");
+ }
+
+ LOG(LogLevel::Debug, ("DirectMediaStreamTrackListener %p increased disabled "
+ "mode %s. Current counts are: freeze=%d, black=%d",
+ this,
+ aMode == DisabledTrackMode::SILENCE_FREEZE ? "freeze" : "black",
+ int32_t(mDisabledFreezeCount),
+ int32_t(mDisabledBlackCount)));
+}
+
+void
+DirectMediaStreamTrackListener::DecreaseDisabled(DisabledTrackMode aMode)
+{
+ if (aMode == DisabledTrackMode::SILENCE_FREEZE) {
+ --mDisabledFreezeCount;
+ MOZ_ASSERT(mDisabledFreezeCount >= 0, "Double decrease");
+ } else if (aMode == DisabledTrackMode::SILENCE_BLACK) {
+ --mDisabledBlackCount;
+ MOZ_ASSERT(mDisabledBlackCount >= 0, "Double decrease");
+ } else {
+ MOZ_ASSERT(false, "Unknown disabled mode");
+ }
+
+ LOG(LogLevel::Debug, ("DirectMediaStreamTrackListener %p decreased disabled "
+ "mode %s. Current counts are: freeze=%d, black=%d",
+ this,
+ aMode == DisabledTrackMode::SILENCE_FREEZE ? "freeze" : "black",
+ int32_t(mDisabledFreezeCount),
+ int32_t(mDisabledBlackCount)));
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaStreamListener.h b/dom/media/MediaStreamListener.h
new file mode 100644
index 000000000..2b6be85cf
--- /dev/null
+++ b/dom/media/MediaStreamListener.h
@@ -0,0 +1,293 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASTREAMLISTENER_h_
+#define MOZILLA_MEDIASTREAMLISTENER_h_
+
+#include "StreamTracks.h"
+
+namespace mozilla {
+
+class AudioSegment;
+class MediaStream;
+class MediaStreamGraph;
+class MediaStreamVideoSink;
+class VideoSegment;
+
+enum MediaStreamGraphEvent : uint32_t {
+ EVENT_FINISHED,
+ EVENT_REMOVED,
+ EVENT_HAS_DIRECT_LISTENERS, // transition from no direct listeners
+ EVENT_HAS_NO_DIRECT_LISTENERS, // transition to no direct listeners
+};
+
+// maskable flags, not a simple enumerated value
+enum TrackEventCommand : uint32_t {
+ TRACK_EVENT_NONE = 0x00,
+ TRACK_EVENT_CREATED = 0x01,
+ TRACK_EVENT_ENDED = 0x02,
+ TRACK_EVENT_UNUSED = ~(TRACK_EVENT_ENDED | TRACK_EVENT_CREATED),
+};
+
+/**
+ * This is a base class for media graph thread listener callbacks.
+ * Override methods to be notified of audio or video data or changes in stream
+ * state.
+ *
+ * This can be used by stream recorders or network connections that receive
+ * stream input. It could also be used for debugging.
+ *
+ * All notification methods are called from the media graph thread. Overriders
+ * of these methods are responsible for all synchronization. Beware!
+ * These methods are called without the media graph monitor held, so
+ * reentry into media graph methods is possible, although very much discouraged!
+ * You should do something non-blocking and non-reentrant (e.g. dispatch an
+ * event to some thread) and return.
+ * The listener is not allowed to add/remove any listeners from the stream.
+ *
+ * When a listener is first attached, we guarantee to send a NotifyBlockingChanged
+ * callback to notify of the initial blocking state. Also, if a listener is
+ * attached to a stream that has already finished, we'll call NotifyFinished.
+ */
+class MediaStreamListener {
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~MediaStreamListener() {}
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStreamListener)
+
+ /**
+ * When a SourceMediaStream has pulling enabled, and the MediaStreamGraph
+ * control loop is ready to pull, this gets called. A NotifyPull implementation
+ * is allowed to call the SourceMediaStream methods that alter track
+ * data. It is not allowed to make other MediaStream API calls, including
+ * calls to add or remove MediaStreamListeners. It is not allowed to block
+ * for any length of time.
+ * aDesiredTime is the stream time we would like to get data up to. Data
+ * beyond this point will not be played until NotifyPull runs again, so there's
+ * not much point in providing it. Note that if the stream is blocked for
+ * some reason, then data before aDesiredTime may not be played immediately.
+ */
+ virtual void NotifyPull(MediaStreamGraph* aGraph, StreamTime aDesiredTime) {}
+
+ enum Blocking {
+ BLOCKED,
+ UNBLOCKED
+ };
+ /**
+ * Notify that the blocking status of the stream changed. The initial state
+ * is assumed to be BLOCKED.
+ */
+ virtual void NotifyBlockingChanged(MediaStreamGraph* aGraph, Blocking aBlocked) {}
+
+ /**
+ * Notify that the stream has data in each track
+ * for the stream's current time. Once this state becomes true, it will
+ * always be true since we block stream time from progressing to times where
+ * there isn't data in each track.
+ */
+ virtual void NotifyHasCurrentData(MediaStreamGraph* aGraph) {}
+
+ /**
+ * Notify that the stream output is advancing. aCurrentTime is the graph's
+ * current time. MediaStream::GraphTimeToStreamTime can be used to get the
+ * stream time.
+ */
+ virtual void NotifyOutput(MediaStreamGraph* aGraph, GraphTime aCurrentTime) {}
+
+ /**
+ * Notify that an event has occurred on the Stream
+ */
+ virtual void NotifyEvent(MediaStreamGraph* aGraph, MediaStreamGraphEvent aEvent) {}
+
+ /**
+ * Notify that changes to one of the stream tracks have been queued.
+ * aTrackEvents can be any combination of TRACK_EVENT_CREATED and
+ * TRACK_EVENT_ENDED. aQueuedMedia is the data being added to the track
+ * at aTrackOffset (relative to the start of the stream).
+ * aInputStream and aInputTrackID will be set if the changes originated
+ * from an input stream's track. In practice they will only be used for
+ * ProcessedMediaStreams.
+ */
+ virtual void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ TrackEventCommand aTrackEvents,
+ const MediaSegment& aQueuedMedia,
+ MediaStream* aInputStream = nullptr,
+ TrackID aInputTrackID = TRACK_INVALID) {}
+
+ /**
+ * Notify queued audio data. Only audio data need to be queued. The video data
+ * will be notified by MediaStreamVideoSink::SetCurrentFrame.
+ */
+ virtual void NotifyQueuedAudioData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ const AudioSegment& aQueuedMedia,
+ MediaStream* aInputStream = nullptr,
+ TrackID aInputTrackID = TRACK_INVALID) {}
+
+ /**
+ * Notify that all new tracks this iteration have been created.
+ * This is to ensure that tracks added atomically to MediaStreamGraph
+ * are also notified of atomically to MediaStreamListeners.
+ */
+ virtual void NotifyFinishedTrackCreation(MediaStreamGraph* aGraph) {}
+};
+
+/**
+ * This is a base class for media graph thread listener callbacks locked to
+ * specific tracks. Override methods to be notified of audio or video data or
+ * changes in track state.
+ *
+ * All notification methods are called from the media graph thread. Overriders
+ * of these methods are responsible for all synchronization. Beware!
+ * These methods are called without the media graph monitor held, so
+ * reentry into media graph methods is possible, although very much discouraged!
+ * You should do something non-blocking and non-reentrant (e.g. dispatch an
+ * event to some thread) and return.
+ * The listener is not allowed to add/remove any listeners from the parent
+ * stream.
+ *
+ * If a listener is attached to a track that has already ended, we guarantee
+ * to call NotifyEnded.
+ */
+class MediaStreamTrackListener
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStreamTrackListener)
+
+public:
+ virtual void NotifyQueuedChanges(MediaStreamGraph* aGraph,
+ StreamTime aTrackOffset,
+ const MediaSegment& aQueuedMedia) {}
+
+ virtual void NotifyPrincipalHandleChanged(MediaStreamGraph* aGraph,
+ const PrincipalHandle& aNewPrincipalHandle) {}
+
+ virtual void NotifyEnded() {}
+
+ virtual void NotifyRemoved() {}
+
+protected:
+ virtual ~MediaStreamTrackListener() {}
+};
+
+
+/**
+ * This is a base class for media graph thread listener direct callbacks
+ * from within AppendToTrack(). Note that your regular listener will
+ * still get NotifyQueuedTrackChanges() callbacks from the MSG thread, so
+ * you must be careful to ignore them if AddDirectListener was successful.
+ */
+class DirectMediaStreamListener : public MediaStreamListener
+{
+public:
+ virtual ~DirectMediaStreamListener() {}
+
+ /*
+ * This will be called on any DirectMediaStreamListener added to a
+ * a SourceMediaStream when AppendToTrack() is called. The MediaSegment
+ * will be the RawSegment (unresampled) if available in AppendToTrack().
+ * Note that NotifyQueuedTrackChanges() calls will also still occur.
+ */
+ virtual void NotifyRealtimeData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aMedia) {}
+};
+
+/**
+ * This is a base class for media graph thread listener direct callbacks from
+ * within AppendToTrack(). It is bound to a certain track and can only be
+ * installed on audio tracks. Once added to a track on any stream in the graph,
+ * the graph will try to install it at that track's source of media data.
+ *
+ * This works for TrackUnionStreams, which will forward the listener to the
+ * track's input track if it exists, or wait for it to be created before
+ * forwarding if it doesn't.
+ * Once it reaches a SourceMediaStream, it can be successfully installed.
+ * Other types of streams will fail installation since they are not supported.
+ *
+ * Note that this listener and others for the same track will still get
+ * NotifyQueuedChanges() callbacks from the MSG tread, so you must be careful
+ * to ignore them if this listener was successfully installed.
+ */
+class DirectMediaStreamTrackListener : public MediaStreamTrackListener
+{
+ friend class SourceMediaStream;
+ friend class TrackUnionStream;
+
+public:
+ /*
+ * This will be called on any DirectMediaStreamTrackListener added to a
+ * SourceMediaStream when AppendToTrack() is called for the listener's bound
+ * track, using the thread of the AppendToTrack() caller. The MediaSegment
+ * will be the RawSegment (unresampled) if available in AppendToTrack().
+ * If the track is enabled at the source but has been disabled in one of the
+ * streams in between the source and where it was originally added, aMedia
+ * will be a disabled version of the one passed to AppendToTrack() as well.
+ * Note that NotifyQueuedTrackChanges() calls will also still occur.
+ */
+ virtual void NotifyRealtimeTrackData(MediaStreamGraph* aGraph,
+ StreamTime aTrackOffset,
+ const MediaSegment& aMedia) {}
+
+ /**
+ * When a direct listener is processed for installation by the
+ * MediaStreamGraph it will be notified with whether the installation was
+ * successful or not. The results of this installation are the following:
+ * TRACK_NOT_FOUND_AT_SOURCE
+ * We found the source stream of media data for this track, but the track
+ * didn't exist. This should only happen if you try to install the listener
+ * directly to a SourceMediaStream that doesn't contain the given TrackID.
+ * STREAM_NOT_SUPPORTED
+ * While looking for the data source of this track, we found a MediaStream
+ * that is not a SourceMediaStream or a TrackUnionStream.
+ * ALREADY_EXIST
+ * This DirectMediaStreamTrackListener already exists in the
+ * SourceMediaStream.
+ * SUCCESS
+ * Installation was successful and this listener will start receiving
+ * NotifyRealtimeData on the next AppendToTrack().
+ */
+ enum class InstallationResult {
+ TRACK_NOT_FOUND_AT_SOURCE,
+ TRACK_TYPE_NOT_SUPPORTED,
+ STREAM_NOT_SUPPORTED,
+ ALREADY_EXISTS,
+ SUCCESS
+ };
+ virtual void NotifyDirectListenerInstalled(InstallationResult aResult) {}
+ virtual void NotifyDirectListenerUninstalled() {}
+
+ virtual MediaStreamVideoSink* AsMediaStreamVideoSink() { return nullptr; }
+
+protected:
+ virtual ~DirectMediaStreamTrackListener() {}
+
+ void MirrorAndDisableSegment(AudioSegment& aFrom, AudioSegment& aTo);
+ void MirrorAndDisableSegment(VideoSegment& aFrom,
+ VideoSegment& aTo,
+ DisabledTrackMode aMode);
+ void NotifyRealtimeTrackDataAndApplyTrackDisabling(MediaStreamGraph* aGraph,
+ StreamTime aTrackOffset,
+ MediaSegment& aMedia);
+
+ void IncreaseDisabled(DisabledTrackMode aMode);
+ void DecreaseDisabled(DisabledTrackMode aMode);
+
+ // Matches the number of disabled streams to which this listener is attached.
+ // The number of streams are those between the stream the listener was added
+ // and the SourceMediaStream that is the input of the data.
+ Atomic<int32_t> mDisabledFreezeCount;
+ Atomic<int32_t> mDisabledBlackCount;
+
+ nsAutoPtr<MediaSegment> mMedia;
+};
+
+} // namespace mozilla
+
+#endif // MOZILLA_MEDIASTREAMLISTENER_h_
diff --git a/dom/media/MediaStreamTrack.cpp b/dom/media/MediaStreamTrack.cpp
new file mode 100644
index 000000000..8ccdeb90c
--- /dev/null
+++ b/dom/media/MediaStreamTrack.cpp
@@ -0,0 +1,562 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamTrack.h"
+
+#include "DOMMediaStream.h"
+#include "MediaStreamGraph.h"
+#include "nsIUUIDGenerator.h"
+#include "nsServiceManagerUtils.h"
+#include "MediaStreamListener.h"
+#include "systemservices/MediaUtils.h"
+
+#include "mozilla/dom/Promise.h"
+
+#ifdef LOG
+#undef LOG
+#endif
+
+static mozilla::LazyLogModule gMediaStreamTrackLog("MediaStreamTrack");
+#define LOG(type, msg) MOZ_LOG(gMediaStreamTrackLog, type, msg)
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaStreamTrackSource)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaStreamTrackSource)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamTrackSource)
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaStreamTrackSource)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaStreamTrackSource)
+ tmp->Destroy();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaStreamTrackSource)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+auto
+MediaStreamTrackSource::ApplyConstraints(
+ nsPIDOMWindowInner* aWindow,
+ const dom::MediaTrackConstraints& aConstraints) -> already_AddRefed<PledgeVoid>
+{
+ RefPtr<PledgeVoid> p = new PledgeVoid();
+ p->Reject(new MediaStreamError(aWindow,
+ NS_LITERAL_STRING("OverconstrainedError"),
+ NS_LITERAL_STRING("")));
+ return p.forget();
+}
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaStreamTrackConsumer)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaStreamTrackConsumer)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamTrackConsumer)
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTION_0(MediaStreamTrackConsumer)
+
+/**
+ * PrincipalHandleListener monitors changes in PrincipalHandle of the media flowing
+ * through the MediaStreamGraph.
+ *
+ * When the main thread principal for a MediaStreamTrack changes, its principal
+ * will be set to the combination of the previous principal and the new one.
+ *
+ * As a PrincipalHandle change later happens on the MediaStreamGraph thread, we will
+ * be notified. If the latest principal on main thread matches the PrincipalHandle
+ * we just saw on MSG thread, we will set the track's principal to the new one.
+ *
+ * We know at this point that the old principal has been flushed out and data
+ * under it cannot leak to consumers.
+ *
+ * In case of multiple changes to the main thread state, the track's principal
+ * will be a combination of its old principal and all the new ones until the
+ * latest main thread principal matches the PrincipalHandle on the MSG thread.
+ */
+class MediaStreamTrack::PrincipalHandleListener : public MediaStreamTrackListener
+{
+public:
+ explicit PrincipalHandleListener(MediaStreamTrack* aTrack)
+ : mTrack(aTrack) {}
+
+ void Forget()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mTrack = nullptr;
+ }
+
+ void DoNotifyPrincipalHandleChanged(const PrincipalHandle& aNewPrincipalHandle)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mTrack) {
+ return;
+ }
+
+ mTrack->NotifyPrincipalHandleChanged(aNewPrincipalHandle);
+ }
+
+ void NotifyPrincipalHandleChanged(MediaStreamGraph* aGraph,
+ const PrincipalHandle& aNewPrincipalHandle) override
+ {
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod<StoreCopyPassByConstLRef<PrincipalHandle>>(
+ this, &PrincipalHandleListener::DoNotifyPrincipalHandleChanged, aNewPrincipalHandle);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(runnable.forget());
+ }
+
+protected:
+ // These fields may only be accessed on the main thread
+ MediaStreamTrack* mTrack;
+};
+
+MediaStreamTrack::MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
+ TrackID aInputTrackID,
+ MediaStreamTrackSource* aSource,
+ const MediaTrackConstraints& aConstraints)
+ : mOwningStream(aStream), mTrackID(aTrackID),
+ mInputTrackID(aInputTrackID), mSource(aSource),
+ mPrincipal(aSource->GetPrincipal()),
+ mReadyState(MediaStreamTrackState::Live),
+ mEnabled(true), mConstraints(aConstraints)
+{
+
+ GetSource().RegisterSink(this);
+
+ mPrincipalHandleListener = new PrincipalHandleListener(this);
+ AddListener(mPrincipalHandleListener);
+
+ nsresult rv;
+ nsCOMPtr<nsIUUIDGenerator> uuidgen =
+ do_GetService("@mozilla.org/uuid-generator;1", &rv);
+
+ nsID uuid;
+ memset(&uuid, 0, sizeof(uuid));
+ if (uuidgen) {
+ uuidgen->GenerateUUIDInPlace(&uuid);
+ }
+
+ char chars[NSID_LENGTH];
+ uuid.ToProvidedString(chars);
+ mID = NS_ConvertASCIItoUTF16(chars);
+}
+
+MediaStreamTrack::~MediaStreamTrack()
+{
+ Destroy();
+}
+
+void
+MediaStreamTrack::Destroy()
+{
+ if (mSource) {
+ mSource->UnregisterSink(this);
+ }
+ if (mPrincipalHandleListener) {
+ if (GetOwnedStream()) {
+ RemoveListener(mPrincipalHandleListener);
+ }
+ mPrincipalHandleListener->Forget();
+ mPrincipalHandleListener = nullptr;
+ }
+ for (auto l : mTrackListeners) {
+ RemoveListener(l);
+ }
+ for (auto l : mDirectTrackListeners) {
+ RemoveDirectListener(l);
+ }
+}
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaStreamTrack)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaStreamTrack,
+ DOMEventTargetHelper)
+ tmp->Destroy();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mConsumers)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mOwningStream)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mSource)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mOriginalTrack)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrincipal)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPendingPrincipal)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaStreamTrack,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConsumers)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwningStream)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSource)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOriginalTrack)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrincipal)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPendingPrincipal)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_ADDREF_INHERITED(MediaStreamTrack, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaStreamTrack, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamTrack)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+nsPIDOMWindowInner*
+MediaStreamTrack::GetParentObject() const
+{
+ MOZ_RELEASE_ASSERT(mOwningStream);
+ return mOwningStream->GetParentObject();
+}
+
+void
+MediaStreamTrack::GetId(nsAString& aID) const
+{
+ aID = mID;
+}
+
+void
+MediaStreamTrack::SetEnabled(bool aEnabled)
+{
+ LOG(LogLevel::Info, ("MediaStreamTrack %p %s",
+ this, aEnabled ? "Enabled" : "Disabled"));
+
+ mEnabled = aEnabled;
+ GetOwnedStream()->SetTrackEnabled(mTrackID, mEnabled ? DisabledTrackMode::ENABLED
+ : DisabledTrackMode::SILENCE_BLACK);
+}
+
+void
+MediaStreamTrack::Stop()
+{
+ LOG(LogLevel::Info, ("MediaStreamTrack %p Stop()", this));
+
+ if (Ended()) {
+ LOG(LogLevel::Warning, ("MediaStreamTrack %p Already ended", this));
+ return;
+ }
+
+ if (!mSource) {
+ MOZ_ASSERT(false);
+ return;
+ }
+
+ mSource->UnregisterSink(this);
+
+ MOZ_ASSERT(mOwningStream, "Every MediaStreamTrack needs an owning DOMMediaStream");
+ DOMMediaStream::TrackPort* port = mOwningStream->FindOwnedTrackPort(*this);
+ MOZ_ASSERT(port, "A MediaStreamTrack must exist in its owning DOMMediaStream");
+ RefPtr<Pledge<bool>> p = port->BlockSourceTrackId(mInputTrackID, BlockingMode::CREATION);
+ Unused << p;
+
+ mReadyState = MediaStreamTrackState::Ended;
+
+ NotifyEnded();
+}
+
+void
+MediaStreamTrack::GetConstraints(dom::MediaTrackConstraints& aResult)
+{
+ aResult = mConstraints;
+}
+
+void
+MediaStreamTrack::GetSettings(dom::MediaTrackSettings& aResult)
+{
+ GetSource().GetSettings(aResult);
+}
+
+already_AddRefed<Promise>
+MediaStreamTrack::ApplyConstraints(const MediaTrackConstraints& aConstraints,
+ ErrorResult &aRv)
+{
+ if (MOZ_LOG_TEST(gMediaStreamTrackLog, LogLevel::Info)) {
+ nsString str;
+ aConstraints.ToJSON(str);
+
+ LOG(LogLevel::Info, ("MediaStreamTrack %p ApplyConstraints() with "
+ "constraints %s", this, NS_ConvertUTF16toUTF8(str).get()));
+ }
+
+ typedef media::Pledge<bool, MediaStreamError*> PledgeVoid;
+
+ nsPIDOMWindowInner* window = mOwningStream->GetParentObject();
+
+ nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(window);
+ RefPtr<Promise> promise = Promise::Create(go, aRv);
+
+ // Forward constraints to the source.
+ //
+ // After GetSource().ApplyConstraints succeeds (after it's been to media-thread
+ // and back), and no sooner, do we set mConstraints to the newly applied values.
+
+ // Keep a reference to this, to make sure it's still here when we get back.
+ RefPtr<MediaStreamTrack> that = this;
+ RefPtr<PledgeVoid> p = GetSource().ApplyConstraints(window, aConstraints);
+ p->Then([this, that, promise, aConstraints](bool& aDummy) mutable {
+ mConstraints = aConstraints;
+ promise->MaybeResolve(false);
+ }, [promise](MediaStreamError*& reason) mutable {
+ promise->MaybeReject(reason);
+ });
+ return promise.forget();
+}
+
+MediaStreamGraph*
+MediaStreamTrack::Graph()
+{
+ return GetOwnedStream()->Graph();
+}
+
+MediaStreamGraphImpl*
+MediaStreamTrack::GraphImpl()
+{
+ return GetOwnedStream()->GraphImpl();
+}
+
+void
+MediaStreamTrack::SetPrincipal(nsIPrincipal* aPrincipal)
+{
+ if (aPrincipal == mPrincipal) {
+ return;
+ }
+ mPrincipal = aPrincipal;
+
+ LOG(LogLevel::Info, ("MediaStreamTrack %p principal changed to %p. Now: "
+ "null=%d, codebase=%d, expanded=%d, system=%d",
+ this, mPrincipal.get(),
+ mPrincipal->GetIsNullPrincipal(),
+ mPrincipal->GetIsCodebasePrincipal(),
+ mPrincipal->GetIsExpandedPrincipal(),
+ mPrincipal->GetIsSystemPrincipal()));
+ for (PrincipalChangeObserver<MediaStreamTrack>* observer
+ : mPrincipalChangeObservers) {
+ observer->PrincipalChanged(this);
+ }
+}
+
+void
+MediaStreamTrack::PrincipalChanged()
+{
+ mPendingPrincipal = GetSource().GetPrincipal();
+ nsCOMPtr<nsIPrincipal> newPrincipal = mPrincipal;
+ LOG(LogLevel::Info, ("MediaStreamTrack %p Principal changed on main thread "
+ "to %p (pending). Combining with existing principal %p.",
+ this, mPendingPrincipal.get(), mPrincipal.get()));
+ if (nsContentUtils::CombineResourcePrincipals(&newPrincipal,
+ mPendingPrincipal)) {
+ SetPrincipal(newPrincipal);
+ }
+}
+
+void
+MediaStreamTrack::NotifyPrincipalHandleChanged(const PrincipalHandle& aNewPrincipalHandle)
+{
+ PrincipalHandle handle(aNewPrincipalHandle);
+ LOG(LogLevel::Info, ("MediaStreamTrack %p principalHandle changed on "
+ "MediaStreamGraph thread to %p. Current principal: %p, "
+ "pending: %p",
+ this, GetPrincipalFromHandle(handle),
+ mPrincipal.get(), mPendingPrincipal.get()));
+ if (PrincipalHandleMatches(handle, mPendingPrincipal)) {
+ SetPrincipal(mPendingPrincipal);
+ mPendingPrincipal = nullptr;
+ }
+}
+
+void
+MediaStreamTrack::NotifyEnded()
+{
+ MOZ_ASSERT(mReadyState == MediaStreamTrackState::Ended);
+
+ for (int32_t i = mConsumers.Length() - 1; i >= 0; --i) {
+ // Loop backwards by index in case the consumer removes itself in the
+ // callback.
+ mConsumers[i]->NotifyEnded(this);
+ }
+}
+
+bool
+MediaStreamTrack::AddPrincipalChangeObserver(
+ PrincipalChangeObserver<MediaStreamTrack>* aObserver)
+{
+ return mPrincipalChangeObservers.AppendElement(aObserver) != nullptr;
+}
+
+bool
+MediaStreamTrack::RemovePrincipalChangeObserver(
+ PrincipalChangeObserver<MediaStreamTrack>* aObserver)
+{
+ return mPrincipalChangeObservers.RemoveElement(aObserver);
+}
+
+void
+MediaStreamTrack::AddConsumer(MediaStreamTrackConsumer* aConsumer)
+{
+ MOZ_ASSERT(!mConsumers.Contains(aConsumer));
+ mConsumers.AppendElement(aConsumer);
+}
+
+void
+MediaStreamTrack::RemoveConsumer(MediaStreamTrackConsumer* aConsumer)
+{
+ mConsumers.RemoveElement(aConsumer);
+}
+
+already_AddRefed<MediaStreamTrack>
+MediaStreamTrack::Clone()
+{
+ // MediaStreamTracks are currently governed by streams, so we need a dummy
+ // DOMMediaStream to own our track clone. The dummy will never see any
+ // dynamically created tracks (no input stream) so no need for a SourceGetter.
+ RefPtr<DOMMediaStream> newStream =
+ new DOMMediaStream(mOwningStream->GetParentObject(), nullptr);
+
+ MediaStreamGraph* graph = Graph();
+ newStream->InitOwnedStreamCommon(graph);
+ newStream->InitPlaybackStreamCommon(graph);
+
+ return newStream->CloneDOMTrack(*this, mTrackID);
+}
+
+void
+MediaStreamTrack::SetReadyState(MediaStreamTrackState aState)
+{
+ MOZ_ASSERT(!(mReadyState == MediaStreamTrackState::Ended &&
+ aState == MediaStreamTrackState::Live),
+ "We don't support overriding the ready state from ended to live");
+
+ if (mReadyState == MediaStreamTrackState::Live &&
+ aState == MediaStreamTrackState::Ended &&
+ mSource) {
+ mSource->UnregisterSink(this);
+ }
+
+ mReadyState = aState;
+}
+
+void
+MediaStreamTrack::OverrideEnded()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (Ended()) {
+ return;
+ }
+
+ LOG(LogLevel::Info, ("MediaStreamTrack %p ended", this));
+
+ if (!mSource) {
+ MOZ_ASSERT(false);
+ return;
+ }
+
+ mSource->UnregisterSink(this);
+
+ mReadyState = MediaStreamTrackState::Ended;
+
+ NotifyEnded();
+
+ DispatchTrustedEvent(NS_LITERAL_STRING("ended"));
+}
+
+DOMMediaStream*
+MediaStreamTrack::GetInputDOMStream()
+{
+ MediaStreamTrack* originalTrack =
+ mOriginalTrack ? mOriginalTrack.get() : this;
+ MOZ_RELEASE_ASSERT(originalTrack->mOwningStream);
+ return originalTrack->mOwningStream;
+}
+
+MediaStream*
+MediaStreamTrack::GetInputStream()
+{
+ DOMMediaStream* inputDOMStream = GetInputDOMStream();
+ MOZ_RELEASE_ASSERT(inputDOMStream->GetInputStream());
+ return inputDOMStream->GetInputStream();
+}
+
+ProcessedMediaStream*
+MediaStreamTrack::GetOwnedStream()
+{
+ if (!mOwningStream)
+ {
+ return nullptr;
+ }
+
+ return mOwningStream->GetOwnedStream();
+}
+
+void
+MediaStreamTrack::AddListener(MediaStreamTrackListener* aListener)
+{
+ LOG(LogLevel::Debug, ("MediaStreamTrack %p adding listener %p",
+ this, aListener));
+ MOZ_ASSERT(GetOwnedStream());
+
+ GetOwnedStream()->AddTrackListener(aListener, mTrackID);
+ mTrackListeners.AppendElement(aListener);
+}
+
+void
+MediaStreamTrack::RemoveListener(MediaStreamTrackListener* aListener)
+{
+ LOG(LogLevel::Debug, ("MediaStreamTrack %p removing listener %p",
+ this, aListener));
+
+ if (GetOwnedStream()) {
+ GetOwnedStream()->RemoveTrackListener(aListener, mTrackID);
+ mTrackListeners.RemoveElement(aListener);
+ }
+}
+
+void
+MediaStreamTrack::AddDirectListener(DirectMediaStreamTrackListener *aListener)
+{
+ LOG(LogLevel::Debug, ("MediaStreamTrack %p (%s) adding direct listener %p to "
+ "stream %p, track %d",
+ this, AsAudioStreamTrack() ? "audio" : "video",
+ aListener, GetOwnedStream(), mTrackID));
+ MOZ_ASSERT(GetOwnedStream());
+
+ GetOwnedStream()->AddDirectTrackListener(aListener, mTrackID);
+ mDirectTrackListeners.AppendElement(aListener);
+}
+
+void
+MediaStreamTrack::RemoveDirectListener(DirectMediaStreamTrackListener *aListener)
+{
+ LOG(LogLevel::Debug, ("MediaStreamTrack %p removing direct listener %p from stream %p",
+ this, aListener, GetOwnedStream()));
+
+ if (GetOwnedStream()) {
+ GetOwnedStream()->RemoveDirectTrackListener(aListener, mTrackID);
+ mDirectTrackListeners.RemoveElement(aListener);
+ }
+}
+
+already_AddRefed<MediaInputPort>
+MediaStreamTrack::ForwardTrackContentsTo(ProcessedMediaStream* aStream,
+ TrackID aDestinationTrackID)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_RELEASE_ASSERT(aStream);
+ RefPtr<MediaInputPort> port =
+ aStream->AllocateInputPort(GetOwnedStream(), mTrackID, aDestinationTrackID);
+ return port.forget();
+}
+
+bool
+MediaStreamTrack::IsForwardedThrough(MediaInputPort* aPort)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aPort);
+ if (!aPort) {
+ return false;
+ }
+ return aPort->GetSource() == GetOwnedStream() &&
+ aPort->PassTrackThrough(mTrackID);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaStreamTrack.h b/dom/media/MediaStreamTrack.h
new file mode 100644
index 000000000..bf092e4b2
--- /dev/null
+++ b/dom/media/MediaStreamTrack.h
@@ -0,0 +1,481 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIASTREAMTRACK_H_
+#define MEDIASTREAMTRACK_H_
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "nsError.h"
+#include "nsID.h"
+#include "nsIPrincipal.h"
+#include "StreamTracks.h"
+#include "MediaTrackConstraints.h"
+#include "mozilla/CORSMode.h"
+#include "PrincipalChangeObserver.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/MediaTrackSettingsBinding.h"
+#include "mozilla/media/MediaUtils.h"
+
+namespace mozilla {
+
+class DOMMediaStream;
+class MediaEnginePhotoCallback;
+class MediaInputPort;
+class MediaStream;
+class MediaStreamGraph;
+class MediaStreamGraphImpl;
+class MediaStreamTrackListener;
+class DirectMediaStreamTrackListener;
+class PeerConnectionImpl;
+class PeerConnectionMedia;
+class PeerIdentity;
+class ProcessedMediaStream;
+class RemoteSourceStreamInfo;
+class SourceStreamInfo;
+
+namespace dom {
+
+class AudioStreamTrack;
+class VideoStreamTrack;
+class MediaStreamError;
+
+/**
+ * Common interface through which a MediaStreamTrack can communicate with its
+ * producer on the main thread.
+ *
+ * Kept alive by a strong ref in all MediaStreamTracks (original and clones)
+ * sharing this source.
+ */
+class MediaStreamTrackSource : public nsISupports
+{
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(MediaStreamTrackSource)
+
+public:
+ class Sink
+ {
+ public:
+ virtual void PrincipalChanged() = 0;
+ };
+
+ MediaStreamTrackSource(nsIPrincipal* aPrincipal,
+ const nsString& aLabel)
+ : mPrincipal(aPrincipal),
+ mLabel(aLabel),
+ mStopped(false)
+ {
+ MOZ_COUNT_CTOR(MediaStreamTrackSource);
+ }
+
+ /**
+ * Use to clean up any resources that have to be cleaned before the
+ * destructor is called. It is often too late in the destructor because
+ * of garbage collection having removed the members already.
+ */
+ virtual void Destroy() {}
+
+ /**
+ * Gets the source's MediaSourceEnum for usage by PeerConnections.
+ */
+ virtual MediaSourceEnum GetMediaSource() const = 0;
+
+ /**
+ * Get this TrackSource's principal.
+ */
+ nsIPrincipal* GetPrincipal() const { return mPrincipal; }
+
+ /**
+ * Get the source's current CORSMode. If not applicable CORS_NONE is returned.
+ * The sink will be notified of changes to our CORSMode through
+ * PrincipalChanged().
+ */
+ virtual CORSMode GetCORSMode() const { return CORS_NONE; }
+
+ /**
+ * This is used in WebRTC. A peerIdentity constrained MediaStreamTrack cannot
+ * be sent across the network to anything other than a peer with the provided
+ * identity. If this is set, then GetPrincipal() should return an instance of
+ * nsNullPrincipal.
+ *
+ * A track's PeerIdentity is immutable and will not change during the track's
+ * lifetime.
+ */
+ virtual const PeerIdentity* GetPeerIdentity() const { return nullptr; }
+
+ /**
+ * MediaStreamTrack::GetLabel (see spec) calls through to here.
+ */
+ void GetLabel(nsAString& aLabel) { aLabel.Assign(mLabel); }
+
+ /**
+ * Forwards a photo request to backends that support it. Other backends return
+ * NS_ERROR_NOT_IMPLEMENTED to indicate that a MediaStreamGraph-based fallback
+ * should be used.
+ */
+ virtual nsresult TakePhoto(MediaEnginePhotoCallback*) const { return NS_ERROR_NOT_IMPLEMENTED; }
+
+ typedef media::Pledge<bool, dom::MediaStreamError*> PledgeVoid;
+
+ /**
+ * We provide a fallback solution to ApplyConstraints() here.
+ * Sources that support ApplyConstraints() will have to override it.
+ */
+ virtual already_AddRefed<PledgeVoid>
+ ApplyConstraints(nsPIDOMWindowInner* aWindow,
+ const dom::MediaTrackConstraints& aConstraints);
+
+ /**
+ * Same for GetSettings (no-op).
+ */
+ virtual void
+ GetSettings(dom::MediaTrackSettings& aResult) {};
+
+ /**
+ * Called by the source interface when all registered sinks have unregistered.
+ */
+ virtual void Stop() = 0;
+
+ /**
+ * Called by each MediaStreamTrack clone on initialization.
+ */
+ void RegisterSink(Sink* aSink)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mStopped) {
+ return;
+ }
+ mSinks.AppendElement(aSink);
+ }
+
+ /**
+ * Called by each MediaStreamTrack clone on Stop() if supported by the
+ * source (us) or destruction.
+ */
+ void UnregisterSink(Sink* aSink)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mSinks.RemoveElement(aSink) && mSinks.IsEmpty()) {
+ MOZ_ASSERT(!mStopped);
+ Stop();
+ mStopped = true;
+ }
+ }
+
+protected:
+ virtual ~MediaStreamTrackSource()
+ {
+ MOZ_COUNT_DTOR(MediaStreamTrackSource);
+ }
+
+ /**
+ * Called by a sub class when the principal has changed.
+ * Notifies all sinks.
+ */
+ void PrincipalChanged()
+ {
+ for (Sink* sink : mSinks) {
+ sink->PrincipalChanged();
+ }
+ }
+
+ // Principal identifying who may access the contents of this source.
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+
+ // Currently registered sinks.
+ nsTArray<Sink*> mSinks;
+
+ // The label of the track we are the source of per the MediaStreamTrack spec.
+ const nsString mLabel;
+
+ // True if all MediaStreamTrack users have unregistered from this source and
+ // Stop() has been called.
+ bool mStopped;
+};
+
+/**
+ * Basic implementation of MediaStreamTrackSource that doesn't forward Stop().
+ */
+class BasicTrackSource : public MediaStreamTrackSource
+{
+public:
+ explicit BasicTrackSource(nsIPrincipal* aPrincipal,
+ const MediaSourceEnum aMediaSource =
+ MediaSourceEnum::Other)
+ : MediaStreamTrackSource(aPrincipal, nsString())
+ , mMediaSource(aMediaSource)
+ {}
+
+ MediaSourceEnum GetMediaSource() const override { return mMediaSource; }
+
+ void Stop() override {}
+
+protected:
+ ~BasicTrackSource() {}
+
+ const MediaSourceEnum mMediaSource;
+};
+
+/**
+ * Base class that consumers of a MediaStreamTrack can use to get notifications
+ * about state changes in the track.
+ */
+class MediaStreamTrackConsumer : public nsISupports
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(MediaStreamTrackConsumer)
+
+ /**
+ * Called when the track's readyState transitions to "ended".
+ * Unlike the "ended" event exposed to script this is called for any reason,
+ * including MediaStreamTrack::Stop().
+ */
+ virtual void NotifyEnded(MediaStreamTrack* aTrack) {};
+
+protected:
+ virtual ~MediaStreamTrackConsumer() {}
+};
+
+/**
+ * Class representing a track in a DOMMediaStream.
+ */
+class MediaStreamTrack : public DOMEventTargetHelper,
+ public MediaStreamTrackSource::Sink
+{
+ // DOMMediaStream owns MediaStreamTrack instances, and requires access to
+ // some internal state, e.g., GetInputStream(), GetOwnedStream().
+ friend class mozilla::DOMMediaStream;
+
+ // PeerConnection and friends need to know our owning DOMStream and track id.
+ friend class mozilla::PeerConnectionImpl;
+ friend class mozilla::PeerConnectionMedia;
+ friend class mozilla::SourceStreamInfo;
+ friend class mozilla::RemoteSourceStreamInfo;
+
+ class PrincipalHandleListener;
+
+public:
+ /**
+ * aTrackID is the MediaStreamGraph track ID for the track in the
+ * MediaStream owned by aStream.
+ */
+ MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
+ TrackID aInputTrackID,
+ MediaStreamTrackSource* aSource,
+ const MediaTrackConstraints& aConstraints = MediaTrackConstraints());
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamTrack,
+ DOMEventTargetHelper)
+
+ nsPIDOMWindowInner* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override = 0;
+
+ virtual AudioStreamTrack* AsAudioStreamTrack() { return nullptr; }
+ virtual VideoStreamTrack* AsVideoStreamTrack() { return nullptr; }
+
+ virtual const AudioStreamTrack* AsAudioStreamTrack() const { return nullptr; }
+ virtual const VideoStreamTrack* AsVideoStreamTrack() const { return nullptr; }
+
+ // WebIDL
+ virtual void GetKind(nsAString& aKind) = 0;
+ void GetId(nsAString& aID) const;
+ void GetLabel(nsAString& aLabel) { GetSource().GetLabel(aLabel); }
+ bool Enabled() { return mEnabled; }
+ void SetEnabled(bool aEnabled);
+ void Stop();
+ void GetConstraints(dom::MediaTrackConstraints& aResult);
+ void GetSettings(dom::MediaTrackSettings& aResult);
+
+ already_AddRefed<Promise>
+ ApplyConstraints(const dom::MediaTrackConstraints& aConstraints, ErrorResult &aRv);
+ already_AddRefed<MediaStreamTrack> Clone();
+ MediaStreamTrackState ReadyState() { return mReadyState; }
+
+ IMPL_EVENT_HANDLER(ended)
+
+ /**
+ * Convenience (and legacy) method for when ready state is "ended".
+ */
+ bool Ended() const { return mReadyState == MediaStreamTrackState::Ended; }
+
+ /**
+ * Forces the ready state to a particular value, for instance when we're
+ * cloning an already ended track.
+ */
+ void SetReadyState(MediaStreamTrackState aState);
+
+ /**
+ * Notified by the MediaStreamGraph, through our owning MediaStream on the
+ * main thread.
+ *
+ * Note that this sets the track to ended and raises the "ended" event
+ * synchronously.
+ */
+ void OverrideEnded();
+
+ /**
+ * Get this track's principal.
+ */
+ nsIPrincipal* GetPrincipal() const { return mPrincipal; }
+
+ /**
+ * Called by the PrincipalHandleListener when this track's PrincipalHandle changes on
+ * the MediaStreamGraph thread. When the PrincipalHandle matches the pending
+ * principal we know that the principal change has propagated to consumers.
+ */
+ void NotifyPrincipalHandleChanged(const PrincipalHandle& aPrincipalHandle);
+
+ /**
+ * Called when this track's readyState transitions to "ended".
+ * Notifies all MediaStreamTrackConsumers that this track ended.
+ */
+ void NotifyEnded();
+
+ /**
+ * Get this track's CORS mode.
+ */
+ CORSMode GetCORSMode() const { return GetSource().GetCORSMode(); }
+
+ /**
+ * Get this track's PeerIdentity.
+ */
+ const PeerIdentity* GetPeerIdentity() const { return GetSource().GetPeerIdentity(); }
+
+ MediaStreamGraph* Graph();
+ MediaStreamGraphImpl* GraphImpl();
+
+ MediaStreamTrackSource& GetSource() const
+ {
+ MOZ_RELEASE_ASSERT(mSource, "The track source is only removed on destruction");
+ return *mSource;
+ }
+
+ // Webrtc allows the remote side to name tracks whatever it wants, and we
+ // need to surface this to content.
+ void AssignId(const nsAString& aID) { mID = aID; }
+
+ // Implementation of MediaStreamTrackSource::Sink
+ void PrincipalChanged() override;
+
+ /**
+ * Add a PrincipalChangeObserver to this track.
+ *
+ * Returns true if it was successfully added.
+ *
+ * Ownership of the PrincipalChangeObserver remains with the caller, and it's
+ * the caller's responsibility to remove the observer before it dies.
+ */
+ bool AddPrincipalChangeObserver(PrincipalChangeObserver<MediaStreamTrack>* aObserver);
+
+ /**
+ * Remove an added PrincipalChangeObserver from this track.
+ *
+ * Returns true if it was successfully removed.
+ */
+ bool RemovePrincipalChangeObserver(PrincipalChangeObserver<MediaStreamTrack>* aObserver);
+
+ /**
+ * Add a MediaStreamTrackConsumer to this track.
+ *
+ * Adding the same consumer multiple times is prohibited.
+ */
+ void AddConsumer(MediaStreamTrackConsumer* aConsumer);
+
+ /**
+ * Remove an added MediaStreamTrackConsumer from this track.
+ */
+ void RemoveConsumer(MediaStreamTrackConsumer* aConsumer);
+
+ /**
+ * Adds a MediaStreamTrackListener to the MediaStreamGraph representation of
+ * this track.
+ */
+ void AddListener(MediaStreamTrackListener* aListener);
+
+ /**
+ * Removes a MediaStreamTrackListener from the MediaStreamGraph representation
+ * of this track.
+ */
+ void RemoveListener(MediaStreamTrackListener* aListener);
+
+ /**
+ * Attempts to add a direct track listener to this track.
+ * Callers must listen to the NotifyInstalled event to know if installing
+ * the listener succeeded (tracks originating from SourceMediaStreams) or
+ * failed (e.g., WebAudio originated tracks).
+ */
+ void AddDirectListener(DirectMediaStreamTrackListener *aListener);
+ void RemoveDirectListener(DirectMediaStreamTrackListener *aListener);
+
+ /**
+ * Sets up a MediaInputPort from the underlying track that this
+ * MediaStreamTrack represents, to aStream, and returns it.
+ */
+ already_AddRefed<MediaInputPort> ForwardTrackContentsTo(ProcessedMediaStream* aStream,
+ TrackID aDestinationTrackID = TRACK_ANY);
+
+ /**
+ * Returns true if this track is connected to aPort and forwarded to aPort's
+ * output stream.
+ */
+ bool IsForwardedThrough(MediaInputPort* aPort);
+
+ void SetMediaStreamSizeListener(DirectMediaStreamTrackListener* aListener);
+
+protected:
+ virtual ~MediaStreamTrack();
+
+ void Destroy();
+
+ // Returns the original DOMMediaStream's underlying input stream.
+ MediaStream* GetInputStream();
+
+ // Returns the owning DOMMediaStream's underlying owned stream.
+ ProcessedMediaStream* GetOwnedStream();
+
+ // Returns the original DOMMediaStream. If this track is a clone,
+ // the original track's owning DOMMediaStream is returned.
+ DOMMediaStream* GetInputDOMStream();
+
+ /**
+ * Sets the principal and notifies PrincipalChangeObservers if it changes.
+ */
+ void SetPrincipal(nsIPrincipal* aPrincipal);
+
+ /**
+ * Creates a new MediaStreamTrack with the same type, input track ID and
+ * source as this MediaStreamTrack.
+ * aTrackID is the TrackID the new track will have in its owned stream.
+ */
+ virtual already_AddRefed<MediaStreamTrack> CloneInternal(DOMMediaStream* aOwningStream,
+ TrackID aTrackID) = 0;
+
+ nsTArray<PrincipalChangeObserver<MediaStreamTrack>*> mPrincipalChangeObservers;
+
+ nsTArray<RefPtr<MediaStreamTrackConsumer>> mConsumers;
+
+ RefPtr<DOMMediaStream> mOwningStream;
+ TrackID mTrackID;
+ TrackID mInputTrackID;
+ RefPtr<MediaStreamTrackSource> mSource;
+ RefPtr<MediaStreamTrack> mOriginalTrack;
+ nsCOMPtr<nsIPrincipal> mPrincipal;
+ nsCOMPtr<nsIPrincipal> mPendingPrincipal;
+ RefPtr<PrincipalHandleListener> mPrincipalHandleListener;
+ // Keep tracking MediaStreamTrackListener and DirectMediaStreamTrackListener,
+ // so we can remove them in |Destory|.
+ nsTArray<RefPtr<MediaStreamTrackListener>> mTrackListeners;
+ nsTArray<RefPtr<DirectMediaStreamTrackListener>> mDirectTrackListeners;
+ nsString mID;
+ MediaStreamTrackState mReadyState;
+ bool mEnabled;
+ dom::MediaTrackConstraints mConstraints;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* MEDIASTREAMTRACK_H_ */
diff --git a/dom/media/MediaStreamVideoSink.cpp b/dom/media/MediaStreamVideoSink.cpp
new file mode 100644
index 000000000..40f2f517e
--- /dev/null
+++ b/dom/media/MediaStreamVideoSink.cpp
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamVideoSink.h"
+
+#include "VideoSegment.h"
+
+namespace mozilla {
+void
+MediaStreamVideoSink::NotifyRealtimeTrackData(MediaStreamGraph* aGraph,
+ StreamTime aTrackOffset,
+ const MediaSegment& aMedia)
+{
+ if (aMedia.GetType() == MediaSegment::VIDEO) {
+ SetCurrentFrames(static_cast<const VideoSegment&>(aMedia));
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaStreamVideoSink.h b/dom/media/MediaStreamVideoSink.h
new file mode 100644
index 000000000..0a4fd9b53
--- /dev/null
+++ b/dom/media/MediaStreamVideoSink.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIASTREAMVIDEOSINK_H_
+#define MEDIASTREAMVIDEOSINK_H_
+
+#include "mozilla/Pair.h"
+
+#include "gfxPoint.h"
+#include "MediaStreamListener.h"
+
+namespace mozilla {
+
+class VideoFrameContainer;
+
+/**
+ * Base class of MediaStreamVideoSink family. This is the output of MediaStream.
+ */
+class MediaStreamVideoSink : public DirectMediaStreamTrackListener {
+public:
+ // Method of DirectMediaStreamTrackListener.
+ void NotifyRealtimeTrackData(MediaStreamGraph* aGraph,
+ StreamTime aTrackOffset,
+ const MediaSegment& aMedia) override;
+
+ // Call on any thread
+ virtual void SetCurrentFrames(const VideoSegment& aSegment) = 0;
+ virtual void ClearFrames() = 0;
+
+ virtual VideoFrameContainer* AsVideoFrameContainer() { return nullptr; }
+ virtual void Invalidate() {}
+
+ virtual MediaStreamVideoSink* AsMediaStreamVideoSink() override { return this; }
+
+protected:
+ virtual ~MediaStreamVideoSink() {};
+};
+
+} // namespace mozilla
+
+#endif /* MEDIASTREAMVIDEOSINK_H_ */
diff --git a/dom/media/MediaTimer.cpp b/dom/media/MediaTimer.cpp
new file mode 100644
index 000000000..1420d6aca
--- /dev/null
+++ b/dom/media/MediaTimer.cpp
@@ -0,0 +1,184 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaTimer.h"
+
+#include <math.h>
+
+#include "nsComponentManagerUtils.h"
+#include "nsThreadUtils.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/SharedThreadPool.h"
+
+namespace mozilla {
+
+NS_IMPL_ADDREF(MediaTimer)
+NS_IMPL_RELEASE_WITH_DESTROY(MediaTimer, DispatchDestroy())
+
+MediaTimer::MediaTimer()
+ : mMonitor("MediaTimer Monitor")
+ , mTimer(do_CreateInstance("@mozilla.org/timer;1"))
+ , mCreationTimeStamp(TimeStamp::Now())
+ , mUpdateScheduled(false)
+{
+ TIMER_LOG("MediaTimer::MediaTimer");
+
+ // Use the SharedThreadPool to create an nsIThreadPool with a maximum of one
+ // thread, which is equivalent to an nsIThread for our purposes.
+ RefPtr<SharedThreadPool> threadPool(
+ SharedThreadPool::Get(NS_LITERAL_CSTRING("MediaTimer"), 1));
+ mThread = threadPool.get();
+ mTimer->SetTarget(mThread);
+}
+
+void
+MediaTimer::DispatchDestroy()
+{
+ // Hold a strong reference to the thread so that it doesn't get deleted in
+ // Destroy(), which may run completely before the stack if Dispatch() begins
+ // to unwind.
+ nsCOMPtr<nsIEventTarget> thread = mThread;
+ nsresult rv = thread->Dispatch(NewNonOwningRunnableMethod(this, &MediaTimer::Destroy),
+ NS_DISPATCH_NORMAL);
+ MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+ (void) rv;
+}
+
+void
+MediaTimer::Destroy()
+{
+ MOZ_ASSERT(OnMediaTimerThread());
+ TIMER_LOG("MediaTimer::Destroy");
+
+ // Reject any outstanding entries. There's no need to acquire the monitor
+ // here, because we're on the timer thread and all other references to us
+ // must be gone.
+ while (!mEntries.empty()) {
+ mEntries.top().mPromise->Reject(false, __func__);
+ mEntries.pop();
+ }
+
+ // Cancel the timer if necessary.
+ CancelTimerIfArmed();
+
+ delete this;
+}
+
+bool
+MediaTimer::OnMediaTimerThread()
+{
+ bool rv = false;
+ mThread->IsOnCurrentThread(&rv);
+ return rv;
+}
+
+RefPtr<MediaTimerPromise>
+MediaTimer::WaitUntil(const TimeStamp& aTimeStamp, const char* aCallSite)
+{
+ MonitorAutoLock mon(mMonitor);
+ TIMER_LOG("MediaTimer::WaitUntil %lld", RelativeMicroseconds(aTimeStamp));
+ Entry e(aTimeStamp, aCallSite);
+ RefPtr<MediaTimerPromise> p = e.mPromise.get();
+ mEntries.push(e);
+ ScheduleUpdate();
+ return p;
+}
+
+void
+MediaTimer::ScheduleUpdate()
+{
+ mMonitor.AssertCurrentThreadOwns();
+ if (mUpdateScheduled) {
+ return;
+ }
+ mUpdateScheduled = true;
+
+ nsresult rv = mThread->Dispatch(NewRunnableMethod(this, &MediaTimer::Update),
+ NS_DISPATCH_NORMAL);
+ MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+ (void) rv;
+}
+
+void
+MediaTimer::Update()
+{
+ MonitorAutoLock mon(mMonitor);
+ UpdateLocked();
+}
+
+void
+MediaTimer::UpdateLocked()
+{
+ MOZ_ASSERT(OnMediaTimerThread());
+ mMonitor.AssertCurrentThreadOwns();
+ mUpdateScheduled = false;
+
+ TIMER_LOG("MediaTimer::UpdateLocked");
+
+ // Resolve all the promises whose time is up.
+ TimeStamp now = TimeStamp::Now();
+ while (!mEntries.empty() && mEntries.top().mTimeStamp <= now) {
+ mEntries.top().mPromise->Resolve(true, __func__);
+ DebugOnly<TimeStamp> poppedTimeStamp = mEntries.top().mTimeStamp;
+ mEntries.pop();
+ MOZ_ASSERT_IF(!mEntries.empty(), *&poppedTimeStamp <= mEntries.top().mTimeStamp);
+ }
+
+ // If we've got no more entries, cancel any pending timer and bail out.
+ if (mEntries.empty()) {
+ CancelTimerIfArmed();
+ return;
+ }
+
+ // We've got more entries - (re)arm the timer for the soonest one.
+ if (!TimerIsArmed() || mEntries.top().mTimeStamp < mCurrentTimerTarget) {
+ CancelTimerIfArmed();
+ ArmTimer(mEntries.top().mTimeStamp, now);
+ }
+}
+
+/*
+ * We use a callback function, rather than a callback method, to ensure that
+ * the nsITimer does not artifically keep the refcount of the MediaTimer above
+ * zero. When the MediaTimer is destroyed, it safely cancels the nsITimer so that
+ * we never fire against a dangling closure.
+ */
+
+/* static */ void
+MediaTimer::TimerCallback(nsITimer* aTimer, void* aClosure)
+{
+ static_cast<MediaTimer*>(aClosure)->TimerFired();
+}
+
+void
+MediaTimer::TimerFired()
+{
+ MonitorAutoLock mon(mMonitor);
+ MOZ_ASSERT(OnMediaTimerThread());
+ mCurrentTimerTarget = TimeStamp();
+ UpdateLocked();
+}
+
+void
+MediaTimer::ArmTimer(const TimeStamp& aTarget, const TimeStamp& aNow)
+{
+ MOZ_DIAGNOSTIC_ASSERT(!TimerIsArmed());
+ MOZ_DIAGNOSTIC_ASSERT(aTarget > aNow);
+
+ // XPCOM timer resolution is in milliseconds. It's important to never resolve
+ // a timer when mTarget might compare < now (even if very close), so round up.
+ unsigned long delay = std::ceil((aTarget - aNow).ToMilliseconds());
+ TIMER_LOG("MediaTimer::ArmTimer delay=%lu", delay);
+ mCurrentTimerTarget = aTarget;
+ nsresult rv = mTimer->InitWithNamedFuncCallback(&TimerCallback, this, delay,
+ nsITimer::TYPE_ONE_SHOT,
+ "MediaTimer::TimerCallback");
+ MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
+ (void) rv;
+}
+
+} // namespace mozilla
diff --git a/dom/media/MediaTimer.h b/dom/media/MediaTimer.h
new file mode 100644
index 000000000..3d6269936
--- /dev/null
+++ b/dom/media/MediaTimer.h
@@ -0,0 +1,170 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaTimer_h_)
+#define MediaTimer_h_
+
+#include "mozilla/Monitor.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/TimeStamp.h"
+
+#include <queue>
+
+#include "nsITimer.h"
+#include "mozilla/RefPtr.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaTimerLog;
+
+#define TIMER_LOG(x, ...) \
+ MOZ_ASSERT(gMediaTimerLog); \
+ MOZ_LOG(gMediaTimerLog, LogLevel::Debug, ("[MediaTimer=%p relative_t=%lld]" x, this, \
+ RelativeMicroseconds(TimeStamp::Now()), ##__VA_ARGS__))
+
+// This promise type is only exclusive because so far there isn't a reason for
+// it not to be. Feel free to change that.
+typedef MozPromise<bool, bool, /* IsExclusive = */ true> MediaTimerPromise;
+
+// Timers only know how to fire at a given thread, which creates an impedence
+// mismatch with code that operates with TaskQueues. This class solves
+// that mismatch with a dedicated (but shared) thread and a nice MozPromise-y
+// interface.
+class MediaTimer
+{
+public:
+ MediaTimer();
+
+ // We use a release with a custom Destroy().
+ NS_IMETHOD_(MozExternalRefCountType) AddRef(void);
+ NS_IMETHOD_(MozExternalRefCountType) Release(void);
+
+ RefPtr<MediaTimerPromise> WaitUntil(const TimeStamp& aTimeStamp, const char* aCallSite);
+
+private:
+ virtual ~MediaTimer() { MOZ_ASSERT(OnMediaTimerThread()); }
+
+ void DispatchDestroy(); // Invoked by Release on an arbitrary thread.
+ void Destroy(); // Runs on the timer thread.
+
+ bool OnMediaTimerThread();
+ void ScheduleUpdate();
+ void Update();
+ void UpdateLocked();
+
+ static void TimerCallback(nsITimer* aTimer, void* aClosure);
+ void TimerFired();
+ void ArmTimer(const TimeStamp& aTarget, const TimeStamp& aNow);
+
+ bool TimerIsArmed()
+ {
+ return !mCurrentTimerTarget.IsNull();
+ }
+
+ void CancelTimerIfArmed()
+ {
+ MOZ_ASSERT(OnMediaTimerThread());
+ if (TimerIsArmed()) {
+ TIMER_LOG("MediaTimer::CancelTimerIfArmed canceling timer");
+ mTimer->Cancel();
+ mCurrentTimerTarget = TimeStamp();
+ }
+ }
+
+
+ struct Entry
+ {
+ TimeStamp mTimeStamp;
+ RefPtr<MediaTimerPromise::Private> mPromise;
+
+ explicit Entry(const TimeStamp& aTimeStamp, const char* aCallSite)
+ : mTimeStamp(aTimeStamp)
+ , mPromise(new MediaTimerPromise::Private(aCallSite))
+ {}
+
+ // Define a < overload that reverses ordering because std::priority_queue
+ // provides access to the largest element, and we want the smallest
+ // (i.e. the soonest).
+ bool operator<(const Entry& aOther) const
+ {
+ return mTimeStamp > aOther.mTimeStamp;
+ }
+ };
+
+ ThreadSafeAutoRefCnt mRefCnt;
+ NS_DECL_OWNINGTHREAD
+ nsCOMPtr<nsIEventTarget> mThread;
+ std::priority_queue<Entry> mEntries;
+ Monitor mMonitor;
+ nsCOMPtr<nsITimer> mTimer;
+ TimeStamp mCurrentTimerTarget;
+
+ // Timestamps only have relative meaning, so we need a base timestamp for
+ // logging purposes.
+ TimeStamp mCreationTimeStamp;
+ int64_t RelativeMicroseconds(const TimeStamp& aTimeStamp)
+ {
+ return (int64_t) (aTimeStamp - mCreationTimeStamp).ToMicroseconds();
+ }
+
+ bool mUpdateScheduled;
+};
+
+// Class for managing delayed dispatches on target thread.
+class DelayedScheduler {
+public:
+ explicit DelayedScheduler(AbstractThread* aTargetThread)
+ : mTargetThread(aTargetThread), mMediaTimer(new MediaTimer())
+ {
+ MOZ_ASSERT(mTargetThread);
+ }
+
+ bool IsScheduled() const { return !mTarget.IsNull(); }
+
+ void Reset()
+ {
+ MOZ_ASSERT(mTargetThread->IsCurrentThreadIn(),
+ "Must be on target thread to disconnect");
+ if (IsScheduled()) {
+ mRequest.Disconnect();
+ mTarget = TimeStamp();
+ }
+ }
+
+ template <typename ResolveFunc, typename RejectFunc>
+ void Ensure(mozilla::TimeStamp& aTarget,
+ ResolveFunc&& aResolver,
+ RejectFunc&& aRejector)
+ {
+ MOZ_ASSERT(mTargetThread->IsCurrentThreadIn());
+ if (IsScheduled() && mTarget <= aTarget) {
+ return;
+ }
+ Reset();
+ mTarget = aTarget;
+ mRequest.Begin(mMediaTimer->WaitUntil(mTarget, __func__)->Then(
+ mTargetThread, __func__,
+ Forward<ResolveFunc>(aResolver),
+ Forward<RejectFunc>(aRejector)));
+ }
+
+ void CompleteRequest()
+ {
+ MOZ_ASSERT(mTargetThread->IsCurrentThreadIn());
+ mRequest.Complete();
+ mTarget = TimeStamp();
+ }
+
+private:
+ RefPtr<AbstractThread> mTargetThread;
+ RefPtr<MediaTimer> mMediaTimer;
+ MozPromiseRequestHolder<mozilla::MediaTimerPromise> mRequest;
+ TimeStamp mTarget;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/MediaTrack.cpp b/dom/media/MediaTrack.cpp
new file mode 100644
index 000000000..6ec1a2cf0
--- /dev/null
+++ b/dom/media/MediaTrack.cpp
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaTrack.h"
+#include "AudioTrack.h"
+#include "MediaTrackList.h"
+#include "VideoTrack.h"
+
+namespace mozilla {
+namespace dom {
+
+MediaTrack::MediaTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage)
+ : DOMEventTargetHelper()
+ , mId(aId)
+ , mKind(aKind)
+ , mLabel(aLabel)
+ , mLanguage(aLanguage)
+{
+}
+
+MediaTrack::~MediaTrack()
+{
+}
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaTrack, DOMEventTargetHelper, mList)
+
+NS_IMPL_ADDREF_INHERITED(MediaTrack, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaTrack, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaTrack)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+void
+MediaTrack::SetTrackList(MediaTrackList* aList)
+{
+ mList = aList;
+}
+
+void
+MediaTrack::Init(nsPIDOMWindowInner* aOwnerWindow)
+{
+ BindToOwner(aOwnerWindow);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaTrack.h b/dom/media/MediaTrack.h
new file mode 100644
index 000000000..adc7ab7a6
--- /dev/null
+++ b/dom/media/MediaTrack.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaTrack_h
+#define mozilla_dom_MediaTrack_h
+
+#include "mozilla/DOMEventTargetHelper.h"
+
+namespace mozilla {
+namespace dom {
+
+class MediaTrackList;
+class VideoTrack;
+class AudioTrack;
+
+/**
+ * Base class of AudioTrack and VideoTrack. The AudioTrack and VideoTrack
+ * objects represent specific tracks of a media resource. Each track has aspects
+ * of an identifier, category, label, and language, even if a track is removed
+ * from its corresponding track list, those aspects do not change.
+ *
+ * When fetching the media resource, an audio/video track is created if the
+ * media resource is found to have an audio/video track. When the UA has learned
+ * that an audio/video track has ended, this audio/video track will be removed
+ * from its corresponding track list.
+ *
+ * Although AudioTrack and VideoTrack are not EventTargets, TextTrack is, and
+ * TextTrack inherits from MediaTrack as well (or is going to).
+ */
+class MediaTrack : public DOMEventTargetHelper
+{
+public:
+ MediaTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaTrack, DOMEventTargetHelper)
+
+ enum {
+ DEFAULT = 0,
+ FIRE_NO_EVENTS = 1 << 0,
+ };
+ // The default behavior of enabling an audio track or selecting a video track
+ // fires a change event and notifies its media resource about the changes.
+ // It should not fire any events when fetching media resource.
+ virtual void SetEnabledInternal(bool aEnabled, int aFlags) = 0;
+
+ virtual AudioTrack* AsAudioTrack()
+ {
+ return nullptr;
+ }
+
+ virtual VideoTrack* AsVideoTrack()
+ {
+ return nullptr;
+ }
+
+ const nsString& GetId() const
+ {
+ return mId;
+ }
+
+ // WebIDL
+ void GetId(nsAString& aId) const
+ {
+ aId = mId;
+ }
+ void GetKind(nsAString& aKind) const
+ {
+ aKind = mKind;
+ }
+ void GetLabel(nsAString& aLabel) const
+ {
+ aLabel = mLabel;
+ }
+ void GetLanguage(nsAString& aLanguage) const
+ {
+ aLanguage = mLanguage;
+ }
+
+ friend class MediaTrackList;
+
+protected:
+ virtual ~MediaTrack();
+
+ void SetTrackList(MediaTrackList* aList);
+ void Init(nsPIDOMWindowInner* aOwnerWindow);
+
+ RefPtr<MediaTrackList> mList;
+ nsString mId;
+ nsString mKind;
+ nsString mLabel;
+ nsString mLanguage;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaTrack_h
diff --git a/dom/media/MediaTrackList.cpp b/dom/media/MediaTrackList.cpp
new file mode 100644
index 000000000..f2c98694d
--- /dev/null
+++ b/dom/media/MediaTrackList.cpp
@@ -0,0 +1,167 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaTrack.h"
+#include "MediaTrackList.h"
+#include "mozilla/AsyncEventDispatcher.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/AudioTrack.h"
+#include "mozilla/dom/VideoStreamTrack.h"
+#include "mozilla/dom/VideoTrack.h"
+#include "mozilla/dom/TrackEvent.h"
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+MediaTrackList::MediaTrackList(nsPIDOMWindowInner* aOwnerWindow,
+ HTMLMediaElement* aMediaElement)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mMediaElement(aMediaElement)
+{
+}
+
+MediaTrackList::~MediaTrackList()
+{
+}
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaTrackList,
+ DOMEventTargetHelper,
+ mTracks,
+ mMediaElement)
+
+NS_IMPL_ADDREF_INHERITED(MediaTrackList, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaTrackList, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaTrackList)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+MediaTrack*
+MediaTrackList::operator[](uint32_t aIndex)
+{
+ return mTracks.ElementAt(aIndex);
+}
+
+MediaTrack*
+MediaTrackList::IndexedGetter(uint32_t aIndex, bool& aFound)
+{
+ aFound = aIndex < mTracks.Length();
+ if (!aFound) {
+ return nullptr;
+ }
+ return mTracks[aIndex];
+}
+
+MediaTrack*
+MediaTrackList::GetTrackById(const nsAString& aId)
+{
+ for (uint32_t i = 0; i < mTracks.Length(); ++i) {
+ if (aId.Equals(mTracks[i]->GetId())) {
+ return mTracks[i];
+ }
+ }
+ return nullptr;
+}
+
+void
+MediaTrackList::AddTrack(MediaTrack* aTrack)
+{
+ mTracks.AppendElement(aTrack);
+ aTrack->Init(GetOwner());
+ aTrack->SetTrackList(this);
+ CreateAndDispatchTrackEventRunner(aTrack, NS_LITERAL_STRING("addtrack"));
+
+ if ((!aTrack->AsAudioTrack() || !aTrack->AsAudioTrack()->Enabled()) &&
+ (!aTrack->AsVideoTrack() || !aTrack->AsVideoTrack()->Selected())) {
+ // Track not enabled, no need to notify media element.
+ return;
+ }
+
+ if (HTMLMediaElement* element = GetMediaElement()) {
+ element->NotifyMediaTrackEnabled(aTrack);
+ }
+}
+
+void
+MediaTrackList::RemoveTrack(const RefPtr<MediaTrack>& aTrack)
+{
+ mTracks.RemoveElement(aTrack);
+ aTrack->SetEnabledInternal(false, MediaTrack::FIRE_NO_EVENTS);
+ aTrack->SetTrackList(nullptr);
+ CreateAndDispatchTrackEventRunner(aTrack, NS_LITERAL_STRING("removetrack"));
+}
+
+void
+MediaTrackList::RemoveTracks()
+{
+ while (!mTracks.IsEmpty()) {
+ RefPtr<MediaTrack> track = mTracks.LastElement();
+ RemoveTrack(track);
+ }
+}
+
+already_AddRefed<AudioTrack>
+MediaTrackList::CreateAudioTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ bool aEnabled)
+{
+ RefPtr<AudioTrack> track = new AudioTrack(aId, aKind, aLabel, aLanguage,
+ aEnabled);
+ return track.forget();
+}
+
+already_AddRefed<VideoTrack>
+MediaTrackList::CreateVideoTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ VideoStreamTrack* aVideoTrack)
+{
+ RefPtr<VideoTrack> track = new VideoTrack(aId, aKind, aLabel, aLanguage, aVideoTrack);
+ return track.forget();
+}
+
+void
+MediaTrackList::EmptyTracks()
+{
+ for (uint32_t i = 0; i < mTracks.Length(); ++i) {
+ mTracks[i]->SetEnabledInternal(false, MediaTrack::FIRE_NO_EVENTS);
+ mTracks[i]->SetTrackList(nullptr);
+ }
+ mTracks.Clear();
+}
+
+void
+MediaTrackList::CreateAndDispatchChangeEvent()
+{
+ RefPtr<AsyncEventDispatcher> asyncDispatcher =
+ new AsyncEventDispatcher(this, NS_LITERAL_STRING("change"), false);
+ asyncDispatcher->PostDOMEvent();
+}
+
+void
+MediaTrackList::CreateAndDispatchTrackEventRunner(MediaTrack* aTrack,
+ const nsAString& aEventName)
+{
+ TrackEventInit eventInit;
+
+ if (aTrack->AsAudioTrack()) {
+ eventInit.mTrack.SetValue().SetAsAudioTrack() = aTrack->AsAudioTrack();
+ } else if (aTrack->AsVideoTrack()) {
+ eventInit.mTrack.SetValue().SetAsVideoTrack() = aTrack->AsVideoTrack();
+ }
+
+ RefPtr<TrackEvent> event =
+ TrackEvent::Constructor(this, aEventName, eventInit);
+
+ RefPtr<AsyncEventDispatcher> asyncDispatcher =
+ new AsyncEventDispatcher(this, event);
+ asyncDispatcher->PostDOMEvent();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/MediaTrackList.h b/dom/media/MediaTrackList.h
new file mode 100644
index 000000000..a78f6c1fe
--- /dev/null
+++ b/dom/media/MediaTrackList.h
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaTrackList_h
+#define mozilla_dom_MediaTrackList_h
+
+#include "mozilla/DOMEventTargetHelper.h"
+
+namespace mozilla {
+class DOMMediaStream;
+
+namespace dom {
+
+class HTMLMediaElement;
+class MediaTrack;
+class AudioTrackList;
+class VideoTrackList;
+class AudioTrack;
+class VideoTrack;
+class VideoStreamTrack;
+
+/**
+ * Base class of AudioTrackList and VideoTrackList. The AudioTrackList and
+ * VideoTrackList objects represent a dynamic list of zero or more audio and
+ * video tracks respectively.
+ *
+ * When a media element is to forget its media-resource-specific tracks, its
+ * audio track list and video track list will be emptied.
+ */
+class MediaTrackList : public DOMEventTargetHelper
+{
+public:
+ MediaTrackList(nsPIDOMWindowInner* aOwnerWindow, HTMLMediaElement* aMediaElement);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaTrackList, DOMEventTargetHelper)
+
+ using DOMEventTargetHelper::DispatchTrustedEvent;
+
+ // The return value is non-null, assert an error if aIndex is out of bound
+ // for array mTracks.
+ MediaTrack* operator[](uint32_t aIndex);
+
+ void AddTrack(MediaTrack* aTrack);
+
+ // In remove track case, the VideoTrackList::mSelectedIndex should be updated
+ // due to mTracks changed. No need to take care this in add track case.
+ virtual void RemoveTrack(const RefPtr<MediaTrack>& aTrack);
+
+ void RemoveTracks();
+
+ static already_AddRefed<AudioTrack>
+ CreateAudioTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ bool aEnabled);
+
+ // For the case of src of HTMLMediaElement is non-MediaStream, leave the
+ // aVideoTrack as default(nullptr).
+ static already_AddRefed<VideoTrack>
+ CreateVideoTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ VideoStreamTrack* aVideoTrack = nullptr);
+
+ virtual void EmptyTracks();
+
+ void CreateAndDispatchChangeEvent();
+
+ // WebIDL
+ MediaTrack* IndexedGetter(uint32_t aIndex, bool& aFound);
+
+ MediaTrack* GetTrackById(const nsAString& aId);
+
+ bool IsEmpty() const
+ {
+ return mTracks.IsEmpty();
+ }
+
+ uint32_t Length() const
+ {
+ return mTracks.Length();
+ }
+
+ IMPL_EVENT_HANDLER(change)
+ IMPL_EVENT_HANDLER(addtrack)
+ IMPL_EVENT_HANDLER(removetrack)
+
+ friend class AudioTrack;
+ friend class VideoTrack;
+
+protected:
+ virtual ~MediaTrackList();
+
+ void CreateAndDispatchTrackEventRunner(MediaTrack* aTrack,
+ const nsAString& aEventName);
+
+ virtual AudioTrackList* AsAudioTrackList() { return nullptr; }
+
+ virtual VideoTrackList* AsVideoTrackList() { return nullptr; }
+
+ HTMLMediaElement* GetMediaElement() { return mMediaElement; }
+
+ nsTArray<RefPtr<MediaTrack>> mTracks;
+ RefPtr<HTMLMediaElement> mMediaElement;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaTrackList_h
diff --git a/dom/media/NextFrameSeekTask.cpp b/dom/media/NextFrameSeekTask.cpp
new file mode 100644
index 000000000..2a7e90bf1
--- /dev/null
+++ b/dom/media/NextFrameSeekTask.cpp
@@ -0,0 +1,342 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "NextFrameSeekTask.h"
+#include "MediaDecoderReaderWrapper.h"
+#include "mozilla/AbstractThread.h"
+#include "mozilla/Assertions.h"
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaSampleLog;
+
+#define SAMPLE_LOG(x, ...) MOZ_LOG(gMediaSampleLog, LogLevel::Debug, \
+ ("[NextFrameSeekTask] Decoder=%p " x, mDecoderID, ##__VA_ARGS__))
+
+namespace media {
+
+NextFrameSeekTask::NextFrameSeekTask(const void* aDecoderID,
+ AbstractThread* aThread,
+ MediaDecoderReaderWrapper* aReader,
+ const SeekTarget& aTarget,
+ const MediaInfo& aInfo,
+ const media::TimeUnit& aDuration,
+ int64_t aCurrentTime,
+ MediaQueue<MediaData>& aAudioQueue,
+ MediaQueue<MediaData>& aVideoQueue)
+ : SeekTask(aDecoderID, aThread, aReader, aTarget)
+ , mAudioQueue(aAudioQueue)
+ , mVideoQueue(aVideoQueue)
+ , mCurrentTime(aCurrentTime)
+ , mDuration(aDuration)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(aInfo.HasVideo());
+
+ // Configure MediaDecoderReaderWrapper.
+ SetCallbacks();
+}
+
+NextFrameSeekTask::~NextFrameSeekTask()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsDiscarded);
+}
+
+void
+NextFrameSeekTask::Discard()
+{
+ AssertOwnerThread();
+
+ // Disconnect MDSM.
+ RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+
+ // Disconnect MediaDecoderReader.
+ CancelCallbacks();
+
+ mIsDiscarded = true;
+}
+
+bool
+NextFrameSeekTask::NeedToResetMDSM() const
+{
+ AssertOwnerThread();
+ return false;
+}
+
+/*
+ * Remove samples from the queue until aCompare() returns false.
+ * aCompare A function object with the signature bool(int64_t) which returns
+ * true for samples that should be removed.
+ */
+template <typename Function> static void
+DiscardFrames(MediaQueue<MediaData>& aQueue, const Function& aCompare)
+{
+ while(aQueue.GetSize() > 0) {
+ if (aCompare(aQueue.PeekFront()->mTime)) {
+ RefPtr<MediaData> releaseMe = aQueue.PopFront();
+ continue;
+ }
+ break;
+ }
+}
+
+RefPtr<NextFrameSeekTask::SeekTaskPromise>
+NextFrameSeekTask::Seek(const media::TimeUnit&)
+{
+ AssertOwnerThread();
+
+ auto currentTime = mCurrentTime;
+ DiscardFrames(mVideoQueue, [currentTime] (int64_t aSampleTime) {
+ return aSampleTime <= currentTime;
+ });
+
+ RefPtr<SeekTaskPromise> promise = mSeekTaskPromise.Ensure(__func__);
+ if (!IsVideoRequestPending() && NeedMoreVideo()) {
+ RequestVideoData();
+ }
+ MaybeFinishSeek(); // Might resolve mSeekTaskPromise and modify audio queue.
+ return promise;
+}
+
+void
+NextFrameSeekTask::RequestVideoData()
+{
+ AssertOwnerThread();
+ mReader->RequestVideoData(false, media::TimeUnit());
+}
+
+bool
+NextFrameSeekTask::NeedMoreVideo() const
+{
+ AssertOwnerThread();
+ // Need to request video when we have none and video queue is not finished.
+ return mVideoQueue.GetSize() == 0 &&
+ !mSeekedVideoData &&
+ !mVideoQueue.IsFinished() &&
+ !mIsVideoQueueFinished;
+}
+
+bool
+NextFrameSeekTask::IsVideoRequestPending() const
+{
+ AssertOwnerThread();
+ return mReader->IsRequestingVideoData() || mReader->IsWaitingVideoData();
+}
+
+bool
+NextFrameSeekTask::IsAudioSeekComplete() const
+{
+ AssertOwnerThread();
+ // Don't finish seek until there are no pending requests. Otherwise, we might
+ // lose audio samples for the promise is resolved asynchronously.
+ return !mReader->IsRequestingAudioData() && !mReader->IsWaitingAudioData();
+}
+
+bool
+NextFrameSeekTask::IsVideoSeekComplete() const
+{
+ AssertOwnerThread();
+ // Don't finish seek until there are no pending requests. Otherwise, we might
+ // lose video samples for the promise is resolved asynchronously.
+ return !IsVideoRequestPending() && !NeedMoreVideo();
+}
+
+void
+NextFrameSeekTask::MaybeFinishSeek()
+{
+ AssertOwnerThread();
+ if (IsAudioSeekComplete() && IsVideoSeekComplete()) {
+ UpdateSeekTargetTime();
+
+ auto time = mTarget.GetTime().ToMicroseconds();
+ DiscardFrames(mAudioQueue, [time] (int64_t aSampleTime) {
+ return aSampleTime < time;
+ });
+
+ Resolve(__func__); // Call to MDSM::SeekCompleted();
+ }
+}
+
+void
+NextFrameSeekTask::OnAudioDecoded(MediaData* aAudioSample)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(aAudioSample);
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ // The MDSM::mDecodedAudioEndTime will be updated once the whole SeekTask is
+ // resolved.
+
+ SAMPLE_LOG("OnAudioDecoded [%lld,%lld]",
+ aAudioSample->mTime,
+ aAudioSample->GetEndTime());
+
+ // We accept any audio data here.
+ mSeekedAudioData = aAudioSample;
+
+ MaybeFinishSeek();
+}
+
+void
+NextFrameSeekTask::OnAudioNotDecoded(const MediaResult& aError)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ SAMPLE_LOG("OnAudioNotDecoded (aError=%u)", aError.Code());
+
+ // We don't really handle audio deocde error here. Let MDSM to trigger further
+ // audio decoding tasks if it needs to play audio, and MDSM will then receive
+ // the decoding state from MediaDecoderReader.
+
+ MaybeFinishSeek();
+}
+
+void
+NextFrameSeekTask::OnVideoDecoded(MediaData* aVideoSample)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(aVideoSample);
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ // The MDSM::mDecodedVideoEndTime will be updated once the whole SeekTask is
+ // resolved.
+
+ SAMPLE_LOG("OnVideoDecoded [%lld,%lld]",
+ aVideoSample->mTime,
+ aVideoSample->GetEndTime());
+
+ if (aVideoSample->mTime > mCurrentTime) {
+ mSeekedVideoData = aVideoSample;
+ }
+
+ if (NeedMoreVideo()) {
+ RequestVideoData();
+ return;
+ }
+
+ MaybeFinishSeek();
+}
+
+void
+NextFrameSeekTask::OnVideoNotDecoded(const MediaResult& aError)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
+
+ SAMPLE_LOG("OnVideoNotDecoded (aError=%u)", aError.Code());
+
+ if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ mIsVideoQueueFinished = true;
+ }
+
+ // Video seek not finished.
+ if (NeedMoreVideo()) {
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+ mReader->WaitForData(MediaData::VIDEO_DATA);
+ break;
+ case NS_ERROR_DOM_MEDIA_CANCELED:
+ RequestVideoData();
+ break;
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ MOZ_ASSERT(false, "Shouldn't want more data for ended video.");
+ break;
+ default:
+ // We might lose the audio sample after canceling the callbacks.
+ // However it doesn't really matter because MDSM is gonna shut down
+ // when seek fails.
+ CancelCallbacks();
+ // Reject the promise since we can't finish video seek anyway.
+ RejectIfExist(aError, __func__);
+ break;
+ }
+ return;
+ }
+
+ MaybeFinishSeek();
+}
+
+void
+NextFrameSeekTask::SetCallbacks()
+{
+ AssertOwnerThread();
+
+ // Register dummy callbcak for audio decoding since we don't need to handle
+ // the decoded audio samples.
+ RefPtr<NextFrameSeekTask> self = this;
+ mAudioCallback = mReader->AudioCallback().Connect(
+ OwnerThread(), [self] (AudioCallbackData aData) {
+ if (aData.is<MediaData*>()) {
+ self->OnAudioDecoded(aData.as<MediaData*>());
+ } else {
+ self->OnAudioNotDecoded(aData.as<MediaResult>());
+ }
+ });
+
+ mVideoCallback = mReader->VideoCallback().Connect(
+ OwnerThread(), [self] (VideoCallbackData aData) {
+ typedef Tuple<MediaData*, TimeStamp> Type;
+ if (aData.is<Type>()) {
+ self->OnVideoDecoded(Get<0>(aData.as<Type>()));
+ } else {
+ self->OnVideoNotDecoded(aData.as<MediaResult>());
+ }
+ });
+
+ mAudioWaitCallback = mReader->AudioWaitCallback().Connect(
+ OwnerThread(), [self] (WaitCallbackData aData) {
+ // We don't make an audio decode request here, instead, let MDSM to
+ // trigger further audio decode tasks if MDSM itself needs to play audio.
+ self->MaybeFinishSeek();
+ });
+
+ mVideoWaitCallback = mReader->VideoWaitCallback().Connect(
+ OwnerThread(), [self] (WaitCallbackData aData) {
+ if (self->NeedMoreVideo()) {
+ if (aData.is<MediaData::Type>()) {
+ self->RequestVideoData();
+ } else {
+ // Reject if we can't finish video seeking.
+ self->CancelCallbacks();
+ self->RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ }
+ return;
+ }
+ self->MaybeFinishSeek();
+ });
+}
+
+void
+NextFrameSeekTask::CancelCallbacks()
+{
+ AssertOwnerThread();
+ mAudioCallback.DisconnectIfExists();
+ mVideoCallback.DisconnectIfExists();
+ mAudioWaitCallback.DisconnectIfExists();
+ mVideoWaitCallback.DisconnectIfExists();
+}
+
+void
+NextFrameSeekTask::UpdateSeekTargetTime()
+{
+ AssertOwnerThread();
+
+ RefPtr<MediaData> data = mVideoQueue.PeekFront();
+ if (data) {
+ mTarget.SetTime(TimeUnit::FromMicroseconds(data->mTime));
+ } else if (mSeekedVideoData) {
+ mTarget.SetTime(TimeUnit::FromMicroseconds(mSeekedVideoData->mTime));
+ } else if (mIsVideoQueueFinished || mVideoQueue.AtEndOfStream()) {
+ mTarget.SetTime(mDuration);
+ } else {
+ MOZ_ASSERT(false, "No data!");
+ }
+}
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/NextFrameSeekTask.h b/dom/media/NextFrameSeekTask.h
new file mode 100644
index 000000000..debd58c66
--- /dev/null
+++ b/dom/media/NextFrameSeekTask.h
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef NEXTFRAME_SEEK_TASK_H
+#define NEXTFRAME_SEEK_TASK_H
+
+#include "SeekTask.h"
+#include "MediaDecoderReader.h"
+
+namespace mozilla {
+namespace media {
+
+/*
+ * While invoking a NextFrameSeekTask, we don't know the seek target time, what
+ * we know is the media's currant position. We use the media's currant position
+ * to find out what the next frame is, by traversing through the video queue or
+ * asking the decoder to decode more video frames. Once we confirm the next
+ * frame, we then know the target time of the NextFrameSeekTask and we update it
+ * so that the MDSM will be able to update the media element's position.
+ */
+
+class NextFrameSeekTask final : public SeekTask {
+public:
+ NextFrameSeekTask(const void* aDecoderID,
+ AbstractThread* aThread,
+ MediaDecoderReaderWrapper* aReader,
+ const SeekTarget& aTarget,
+ const MediaInfo& aInfo,
+ const media::TimeUnit& aDuration,
+ int64_t aCurrentTime,
+ MediaQueue<MediaData>& aAudioQueue,
+ MediaQueue<MediaData>& aVideoQueue);
+
+ void Discard() override;
+
+ RefPtr<SeekTaskPromise> Seek(const media::TimeUnit& aDuration) override;
+
+ bool NeedToResetMDSM() const override;
+
+private:
+ ~NextFrameSeekTask();
+
+ void RequestVideoData();
+
+ bool NeedMoreVideo() const;
+
+ bool IsVideoRequestPending() const;
+
+ bool IsAudioSeekComplete() const;
+
+ bool IsVideoSeekComplete() const;
+
+ void MaybeFinishSeek();
+
+ void OnAudioDecoded(MediaData* aAudioSample);
+
+ void OnAudioNotDecoded(const MediaResult& aError);
+
+ void OnVideoDecoded(MediaData* aVideoSample);
+
+ void OnVideoNotDecoded(const MediaResult& aError);
+
+ void SetCallbacks();
+
+ void CancelCallbacks();
+
+ // Update the seek target's time before resolving this seek task, the updated
+ // time will be used in the MDSM::SeekCompleted() to update the MDSM's position.
+ void UpdateSeekTargetTime();
+
+ /*
+ * Data shared with MDSM.
+ */
+ MediaQueue<MediaData>& mAudioQueue;
+ MediaQueue<MediaData>& mVideoQueue;
+
+ /*
+ * Internal state.
+ */
+ const int64_t mCurrentTime;
+ media::TimeUnit mDuration;
+
+ MediaEventListener mAudioCallback;
+ MediaEventListener mVideoCallback;
+ MediaEventListener mAudioWaitCallback;
+ MediaEventListener mVideoWaitCallback;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif /* NEXTFRAME_SEEK_TASK_H */
diff --git a/dom/media/PeerConnection.js b/dom/media/PeerConnection.js
new file mode 100644
index 000000000..98b8debbe
--- /dev/null
+++ b/dom/media/PeerConnection.js
@@ -0,0 +1,1680 @@
+/* jshint moz:true, browser:true */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "PeerConnectionIdp",
+ "resource://gre/modules/media/PeerConnectionIdp.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "convertToRTCStatsReport",
+ "resource://gre/modules/media/RTCStatsReport.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
+ "resource://gre/modules/AppConstants.jsm");
+
+const PC_CONTRACT = "@mozilla.org/dom/peerconnection;1";
+const PC_OBS_CONTRACT = "@mozilla.org/dom/peerconnectionobserver;1";
+const PC_ICE_CONTRACT = "@mozilla.org/dom/rtcicecandidate;1";
+const PC_SESSION_CONTRACT = "@mozilla.org/dom/rtcsessiondescription;1";
+const PC_MANAGER_CONTRACT = "@mozilla.org/dom/peerconnectionmanager;1";
+const PC_STATS_CONTRACT = "@mozilla.org/dom/rtcstatsreport;1";
+const PC_STATIC_CONTRACT = "@mozilla.org/dom/peerconnectionstatic;1";
+const PC_SENDER_CONTRACT = "@mozilla.org/dom/rtpsender;1";
+const PC_RECEIVER_CONTRACT = "@mozilla.org/dom/rtpreceiver;1";
+const PC_COREQUEST_CONTRACT = "@mozilla.org/dom/createofferrequest;1";
+const PC_DTMF_SENDER_CONTRACT = "@mozilla.org/dom/rtcdtmfsender;1";
+
+const PC_CID = Components.ID("{bdc2e533-b308-4708-ac8e-a8bfade6d851}");
+const PC_OBS_CID = Components.ID("{d1748d4c-7f6a-4dc5-add6-d55b7678537e}");
+const PC_ICE_CID = Components.ID("{02b9970c-433d-4cc2-923d-f7028ac66073}");
+const PC_SESSION_CID = Components.ID("{1775081b-b62d-4954-8ffe-a067bbf508a7}");
+const PC_MANAGER_CID = Components.ID("{7293e901-2be3-4c02-b4bd-cbef6fc24f78}");
+const PC_STATS_CID = Components.ID("{7fe6e18b-0da3-4056-bf3b-440ef3809e06}");
+const PC_STATIC_CID = Components.ID("{0fb47c47-a205-4583-a9fc-cbadf8c95880}");
+const PC_SENDER_CID = Components.ID("{4fff5d46-d827-4cd4-a970-8fd53977440e}");
+const PC_RECEIVER_CID = Components.ID("{d974b814-8fde-411c-8c45-b86791b81030}");
+const PC_COREQUEST_CID = Components.ID("{74b2122d-65a8-4824-aa9e-3d664cb75dc2}");
+const PC_DTMF_SENDER_CID = Components.ID("{3610C242-654E-11E6-8EC0-6D1BE389A607}");
+
+// Global list of PeerConnection objects, so they can be cleaned up when
+// a page is torn down. (Maps inner window ID to an array of PC objects).
+function GlobalPCList() {
+ this._list = {};
+ this._networkdown = false; // XXX Need to query current state somehow
+ this._lifecycleobservers = {};
+ this._nextId = 1;
+ Services.obs.addObserver(this, "inner-window-destroyed", true);
+ Services.obs.addObserver(this, "profile-change-net-teardown", true);
+ Services.obs.addObserver(this, "network:offline-about-to-go-offline", true);
+ Services.obs.addObserver(this, "network:offline-status-changed", true);
+ Services.obs.addObserver(this, "gmp-plugin-crash", true);
+ Services.obs.addObserver(this, "PeerConnection:response:allow", true);
+ Services.obs.addObserver(this, "PeerConnection:response:deny", true);
+ if (Cc["@mozilla.org/childprocessmessagemanager;1"]) {
+ let mm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
+ mm.addMessageListener("gmp-plugin-crash", this);
+ }
+}
+GlobalPCList.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
+ Ci.nsIMessageListener,
+ Ci.nsISupportsWeakReference,
+ Ci.IPeerConnectionManager]),
+ classID: PC_MANAGER_CID,
+ _xpcom_factory: {
+ createInstance: function(outer, iid) {
+ if (outer) {
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+ }
+ return _globalPCList.QueryInterface(iid);
+ }
+ },
+
+ notifyLifecycleObservers: function(pc, type) {
+ for (var key of Object.keys(this._lifecycleobservers)) {
+ this._lifecycleobservers[key](pc, pc._winID, type);
+ }
+ },
+
+ addPC: function(pc) {
+ let winID = pc._winID;
+ if (this._list[winID]) {
+ this._list[winID].push(Cu.getWeakReference(pc));
+ } else {
+ this._list[winID] = [Cu.getWeakReference(pc)];
+ }
+ pc._globalPCListId = this._nextId++;
+ this.removeNullRefs(winID);
+ },
+
+ findPC: function(globalPCListId) {
+ for (let winId in this._list) {
+ if (this._list.hasOwnProperty(winId)) {
+ for (let pcref of this._list[winId]) {
+ let pc = pcref.get();
+ if (pc && pc._globalPCListId == globalPCListId) {
+ return pc;
+ }
+ }
+ }
+ }
+ },
+
+ removeNullRefs: function(winID) {
+ if (this._list[winID] === undefined) {
+ return;
+ }
+ this._list[winID] = this._list[winID].filter(
+ function (e,i,a) { return e.get() !== null; });
+
+ if (this._list[winID].length === 0) {
+ delete this._list[winID];
+ }
+ },
+
+ hasActivePeerConnection: function(winID) {
+ this.removeNullRefs(winID);
+ return this._list[winID] ? true : false;
+ },
+
+ handleGMPCrash: function(data) {
+ let broadcastPluginCrash = function(list, winID, pluginID, pluginName) {
+ if (list.hasOwnProperty(winID)) {
+ list[winID].forEach(function(pcref) {
+ let pc = pcref.get();
+ if (pc) {
+ pc._pc.pluginCrash(pluginID, pluginName);
+ }
+ });
+ }
+ };
+
+ // a plugin crashed; if it's associated with any of our PCs, fire an
+ // event to the DOM window
+ for (let winId in this._list) {
+ broadcastPluginCrash(this._list, winId, data.pluginID, data.pluginName);
+ }
+ },
+
+ receiveMessage: function(message) {
+ if (message.name == "gmp-plugin-crash") {
+ this.handleGMPCrash(message.data);
+ }
+ },
+
+ observe: function(subject, topic, data) {
+ let cleanupPcRef = function(pcref) {
+ let pc = pcref.get();
+ if (pc) {
+ pc._pc.close();
+ delete pc._observer;
+ pc._pc = null;
+ }
+ };
+
+ let cleanupWinId = function(list, winID) {
+ if (list.hasOwnProperty(winID)) {
+ list[winID].forEach(cleanupPcRef);
+ delete list[winID];
+ }
+ };
+
+ if (topic == "inner-window-destroyed") {
+ let winID = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
+ cleanupWinId(this._list, winID);
+
+ if (this._lifecycleobservers.hasOwnProperty(winID)) {
+ delete this._lifecycleobservers[winID];
+ }
+ } else if (topic == "profile-change-net-teardown" ||
+ topic == "network:offline-about-to-go-offline") {
+ // Delete all peerconnections on shutdown - mostly synchronously (we
+ // need them to be done deleting transports and streams before we
+ // return)! All socket operations must be queued to STS thread
+ // before we return to here.
+ // Also kill them if "Work Offline" is selected - more can be created
+ // while offline, but attempts to connect them should fail.
+ for (let winId in this._list) {
+ cleanupWinId(this._list, winId);
+ }
+ this._networkdown = true;
+ }
+ else if (topic == "network:offline-status-changed") {
+ if (data == "offline") {
+ // this._list shold be empty here
+ this._networkdown = true;
+ } else if (data == "online") {
+ this._networkdown = false;
+ }
+ } else if (topic == "gmp-plugin-crash") {
+ if (subject instanceof Ci.nsIWritablePropertyBag2) {
+ let pluginID = subject.getPropertyAsUint32("pluginID");
+ let pluginName = subject.getPropertyAsAString("pluginName");
+ let data = { pluginID, pluginName };
+ this.handleGMPCrash(data);
+ }
+ } else if (topic == "PeerConnection:response:allow" ||
+ topic == "PeerConnection:response:deny") {
+ var pc = this.findPC(data);
+ if (pc) {
+ if (topic == "PeerConnection:response:allow") {
+ pc._settlePermission.allow();
+ } else {
+ let err = new pc._win.DOMException("The request is not allowed by " +
+ "the user agent or the platform in the current context.",
+ "NotAllowedError");
+ pc._settlePermission.deny(err);
+ }
+ }
+ }
+ },
+
+ _registerPeerConnectionLifecycleCallback: function(winID, cb) {
+ this._lifecycleobservers[winID] = cb;
+ },
+};
+var _globalPCList = new GlobalPCList();
+
+function RTCIceCandidate() {
+ this.candidate = this.sdpMid = this.sdpMLineIndex = null;
+}
+RTCIceCandidate.prototype = {
+ classDescription: "RTCIceCandidate",
+ classID: PC_ICE_CID,
+ contractID: PC_ICE_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+
+ init: function(win) { this._win = win; },
+
+ __init: function(dict) {
+ this.candidate = dict.candidate;
+ this.sdpMid = dict.sdpMid;
+ this.sdpMLineIndex = ("sdpMLineIndex" in dict)? dict.sdpMLineIndex : null;
+ }
+};
+
+function RTCSessionDescription() {
+ this.type = this.sdp = null;
+}
+RTCSessionDescription.prototype = {
+ classDescription: "RTCSessionDescription",
+ classID: PC_SESSION_CID,
+ contractID: PC_SESSION_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+
+ init: function(win) { this._win = win; },
+
+ __init: function(dict) {
+ this.type = dict.type;
+ this.sdp = dict.sdp;
+ }
+};
+
+function RTCStatsReport(win, dict) {
+ this._win = win;
+ this._pcid = dict.pcid;
+ this._report = convertToRTCStatsReport(dict);
+}
+RTCStatsReport.prototype = {
+ classDescription: "RTCStatsReport",
+ classID: PC_STATS_CID,
+ contractID: PC_STATS_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),
+
+ setInternal: function(aKey, aObj) {
+ return this.__DOM_IMPL__.__set(aKey, aObj);
+ },
+
+ // TODO: Remove legacy API eventually
+ //
+ // Since maplike is recent, we still also make the stats available as legacy
+ // enumerable read-only properties directly on our content-facing object.
+ // Must be called after our webidl sandwich is made.
+
+ makeStatsPublic: function(warnNullable) {
+ let legacyProps = {};
+ for (let key in this._report) {
+ let value = Cu.cloneInto(this._report[key], this._win);
+ this.setInternal(key, value);
+
+ legacyProps[key] = {
+ enumerable: true, configurable: false,
+ get: Cu.exportFunction(function() {
+ if (warnNullable.warn) {
+ warnNullable.warn();
+ warnNullable.warn = null;
+ }
+ return value;
+ }, this.__DOM_IMPL__.wrappedJSObject)
+ };
+ }
+ Object.defineProperties(this.__DOM_IMPL__.wrappedJSObject, legacyProps);
+ },
+
+ get mozPcid() { return this._pcid; }
+};
+
+function RTCPeerConnection() {
+ this._senders = [];
+ this._receivers = [];
+
+ this._pc = null;
+ this._observer = null;
+ this._closed = false;
+
+ this._onCreateOfferSuccess = null;
+ this._onCreateOfferFailure = null;
+ this._onCreateAnswerSuccess = null;
+ this._onCreateAnswerFailure = null;
+ this._onGetStatsSuccess = null;
+ this._onGetStatsFailure = null;
+ this._onReplaceTrackSender = null;
+ this._onReplaceTrackWithTrack = null;
+ this._onReplaceTrackSuccess = null;
+ this._onReplaceTrackFailure = null;
+
+ this._localType = null;
+ this._remoteType = null;
+ // http://rtcweb-wg.github.io/jsep/#rfc.section.4.1.9
+ // canTrickle == null means unknown; when a remote description is received it
+ // is set to true or false based on the presence of the "trickle" ice-option
+ this._canTrickle = null;
+
+ // States
+ this._iceGatheringState = this._iceConnectionState = "new";
+}
+RTCPeerConnection.prototype = {
+ classDescription: "RTCPeerConnection",
+ classID: PC_CID,
+ contractID: PC_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+ init: function(win) { this._win = win; },
+
+ __init: function(rtcConfig) {
+ this._winID = this._win.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
+ // TODO: Update this code once we support pc.setConfiguration, to track
+ // setting from content independently from pref (Bug 1181768).
+ if (rtcConfig.iceTransportPolicy == "all" &&
+ Services.prefs.getBoolPref("media.peerconnection.ice.relay_only")) {
+ rtcConfig.iceTransportPolicy = "relay";
+ }
+ this._config = Object.assign({}, rtcConfig);
+
+ if (!rtcConfig.iceServers ||
+ !Services.prefs.getBoolPref("media.peerconnection.use_document_iceservers")) {
+ try {
+ rtcConfig.iceServers =
+ JSON.parse(Services.prefs.getCharPref("media.peerconnection.default_iceservers") || "[]");
+ } catch (e) {
+ this.logWarning(
+ "Ignoring invalid media.peerconnection.default_iceservers in about:config");
+ rtcConfig.iceServers = [];
+ }
+ try {
+ this._mustValidateRTCConfiguration(rtcConfig,
+ "Ignoring invalid media.peerconnection.default_iceservers in about:config");
+ } catch (e) {
+ this.logWarning(e.message);
+ rtcConfig.iceServers = [];
+ }
+ } else {
+ // This gets executed in the typical case when iceServers
+ // are passed in through the web page.
+ this._mustValidateRTCConfiguration(rtcConfig,
+ "RTCPeerConnection constructor passed invalid RTCConfiguration");
+ }
+ var principal = Cu.getWebIDLCallerPrincipal();
+ this._isChrome = Services.scriptSecurityManager.isSystemPrincipal(principal);
+
+ if (_globalPCList._networkdown) {
+ throw new this._win.DOMException(
+ "Can't create RTCPeerConnections when the network is down",
+ "InvalidStateError");
+ }
+
+ this.makeGetterSetterEH("ontrack");
+ this.makeLegacyGetterSetterEH("onaddstream", "Use peerConnection.ontrack instead.");
+ this.makeLegacyGetterSetterEH("onaddtrack", "Use peerConnection.ontrack instead.");
+ this.makeGetterSetterEH("onicecandidate");
+ this.makeGetterSetterEH("onnegotiationneeded");
+ this.makeGetterSetterEH("onsignalingstatechange");
+ this.makeGetterSetterEH("onremovestream");
+ this.makeGetterSetterEH("ondatachannel");
+ this.makeGetterSetterEH("oniceconnectionstatechange");
+ this.makeGetterSetterEH("onidentityresult");
+ this.makeGetterSetterEH("onpeeridentity");
+ this.makeGetterSetterEH("onidpassertionerror");
+ this.makeGetterSetterEH("onidpvalidationerror");
+
+ this._pc = new this._win.PeerConnectionImpl();
+ this._operationsChain = this._win.Promise.resolve();
+
+ this.__DOM_IMPL__._innerObject = this;
+ this._observer = new this._win.PeerConnectionObserver(this.__DOM_IMPL__);
+
+ var location = "" + this._win.location;
+
+ // Warn just once per PeerConnection about deprecated getStats usage.
+ this._warnDeprecatedStatsAccessNullable = { warn: () =>
+ this.logWarning("non-maplike pc.getStats access is deprecated! " +
+ "See http://w3c.github.io/webrtc-pc/#example for usage.") };
+
+ // Add a reference to the PeerConnection to global list (before init).
+ _globalPCList.addPC(this);
+
+ this._impl.initialize(this._observer, this._win, rtcConfig,
+ Services.tm.currentThread);
+ this._initCertificate(rtcConfig.certificates);
+ this._initIdp();
+ _globalPCList.notifyLifecycleObservers(this, "initialized");
+ },
+
+ get _impl() {
+ if (!this._pc) {
+ throw new this._win.DOMException(
+ "RTCPeerConnection is gone (did you enter Offline mode?)",
+ "InvalidStateError");
+ }
+ return this._pc;
+ },
+
+ getConfiguration: function() {
+ return this._config;
+ },
+
+ _initCertificate: function(certificates) {
+ let certPromise;
+ if (certificates && certificates.length > 0) {
+ if (certificates.length > 1) {
+ throw new this._win.DOMException(
+ "RTCPeerConnection does not currently support multiple certificates",
+ "NotSupportedError");
+ }
+ let cert = certificates.find(c => c.expires > Date.now());
+ if (!cert) {
+ throw new this._win.DOMException(
+ "Unable to create RTCPeerConnection with an expired certificate",
+ "InvalidParameterError");
+ }
+ certPromise = Promise.resolve(cert);
+ } else {
+ certPromise = this._win.RTCPeerConnection.generateCertificate({
+ name: "ECDSA", namedCurve: "P-256"
+ });
+ }
+ this._certificateReady = certPromise
+ .then(cert => this._impl.certificate = cert);
+ },
+
+ _initIdp: function() {
+ this._peerIdentity = new this._win.Promise((resolve, reject) => {
+ this._resolvePeerIdentity = resolve;
+ this._rejectPeerIdentity = reject;
+ });
+ this._lastIdentityValidation = this._win.Promise.resolve();
+
+ let prefName = "media.peerconnection.identity.timeout";
+ let idpTimeout = Services.prefs.getIntPref(prefName);
+ this._localIdp = new PeerConnectionIdp(this._win, idpTimeout);
+ this._remoteIdp = new PeerConnectionIdp(this._win, idpTimeout);
+ },
+
+ // Add a function to the internal operations chain.
+
+ _chain: function(func) {
+ this._checkClosed(); // out here DOMException line-numbers work.
+ let p = this._operationsChain.then(() => {
+ // Don't _checkClosed() inside the chain, because it throws, and spec
+ // behavior as of this writing is to NOT reject outstanding promises on
+ // close. This is what happens most of the time anyways, as the c++ code
+ // stops calling us once closed, hanging the chain. However, c++ may
+ // already have queued tasks on us, so if we're one of those then sit back.
+ if (!this._closed) {
+ return func();
+ }
+ });
+ // don't propagate errors in the operations chain (this is a fork of p).
+ this._operationsChain = p.catch(() => {});
+ return p;
+ },
+
+ // This wrapper helps implement legacy callbacks in a manner that produces
+ // correct line-numbers in errors, provided that methods validate their inputs
+ // before putting themselves on the pc's operations chain.
+ //
+ // It also serves as guard against settling promises past close().
+
+ _legacyCatchAndCloseGuard: function(onSuccess, onError, func) {
+ if (!onSuccess) {
+ return func().then(v => (this._closed ? new Promise(() => {}) : v),
+ e => (this._closed ? new Promise(() => {}) : Promise.reject(e)));
+ }
+ try {
+ return func().then(this._wrapLegacyCallback(onSuccess),
+ this._wrapLegacyCallback(onError));
+ } catch (e) {
+ this._wrapLegacyCallback(onError)(e);
+ return this._win.Promise.resolve(); // avoid webidl TypeError
+ }
+ },
+
+ _wrapLegacyCallback: function(func) {
+ return result => {
+ try {
+ func && func(result);
+ } catch (e) {
+ this.logErrorAndCallOnError(e);
+ }
+ };
+ },
+
+ /**
+ * An RTCConfiguration may look like this:
+ *
+ * { "iceServers": [ { urls: "stun:stun.example.org", },
+ * { url: "stun:stun.example.org", }, // deprecated version
+ * { urls: ["turn:turn1.x.org", "turn:turn2.x.org"],
+ * username:"jib", credential:"mypass"} ] }
+ *
+ * This function normalizes the structure of the input for rtcConfig.iceServers for us,
+ * so we test well-formed stun/turn urls before passing along to C++.
+ * msg - Error message to detail which array-entry failed, if any.
+ */
+ _mustValidateRTCConfiguration: function(rtcConfig, msg) {
+
+ // Normalize iceServers input
+ rtcConfig.iceServers.forEach(server => {
+ if (typeof server.urls === "string") {
+ server.urls = [server.urls];
+ } else if (!server.urls && server.url) {
+ // TODO: Remove support for legacy iceServer.url eventually (Bug 1116766)
+ server.urls = [server.url];
+ this.logWarning("RTCIceServer.url is deprecated! Use urls instead.");
+ }
+ });
+
+ let ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService);
+
+ let nicerNewURI = uriStr => {
+ try {
+ return ios.newURI(uriStr, null, null);
+ } catch (e if (e.result == Cr.NS_ERROR_MALFORMED_URI)) {
+ throw new this._win.DOMException(msg + " - malformed URI: " + uriStr,
+ "SyntaxError");
+ }
+ };
+
+ rtcConfig.iceServers.forEach(server => {
+ if (!server.urls) {
+ throw new this._win.DOMException(msg + " - missing urls", "InvalidAccessError");
+ }
+ server.urls.forEach(urlStr => {
+ let url = nicerNewURI(urlStr);
+ if (url.scheme in { turn:1, turns:1 }) {
+ if (server.username == undefined) {
+ throw new this._win.DOMException(msg + " - missing username: " + urlStr,
+ "InvalidAccessError");
+ }
+ if (server.credential == undefined) {
+ throw new this._win.DOMException(msg + " - missing credential: " + urlStr,
+ "InvalidAccessError");
+ }
+ if (server.credentialType != "password") {
+ this.logWarning("RTCConfiguration TURN credentialType \""+
+ server.credentialType +
+ "\" is not yet implemented. Treating as password."+
+ " https://bugzil.la/1247616");
+ }
+ }
+ else if (!(url.scheme in { stun:1, stuns:1 })) {
+ throw new this._win.DOMException(msg + " - improper scheme: " + url.scheme,
+ "SyntaxError");
+ }
+ if (url.scheme in { stuns:1, turns:1 }) {
+ this.logWarning(url.scheme.toUpperCase() + " is not yet supported.");
+ }
+ });
+ });
+ },
+
+ // Ideally, this should be of the form _checkState(state),
+ // where the state is taken from an enumeration containing
+ // the valid peer connection states defined in the WebRTC
+ // spec. See Bug 831756.
+ _checkClosed: function() {
+ if (this._closed) {
+ throw new this._win.DOMException("Peer connection is closed",
+ "InvalidStateError");
+ }
+ },
+
+ dispatchEvent: function(event) {
+ // PC can close while events are firing if there is an async dispatch
+ // in c++ land. But let through "closed" signaling and ice connection events.
+ if (!this._closed || this._inClose) {
+ this.__DOM_IMPL__.dispatchEvent(event);
+ }
+ },
+
+ // Log error message to web console and window.onerror, if present.
+ logErrorAndCallOnError: function(e) {
+ this.logMsg(e.message, e.fileName, e.lineNumber, Ci.nsIScriptError.exceptionFlag);
+
+ // Safely call onerror directly if present (necessary for testing)
+ try {
+ if (typeof this._win.onerror === "function") {
+ this._win.onerror(e.message, e.fileName, e.lineNumber);
+ }
+ } catch(e) {
+ // If onerror itself throws, service it.
+ try {
+ this.logMsg(e.message, e.fileName, e.lineNumber, Ci.nsIScriptError.errorFlag);
+ } catch(e) {}
+ }
+ },
+
+ logError: function(msg) {
+ this.logStackMsg(msg, Ci.nsIScriptError.errorFlag);
+ },
+
+ logWarning: function(msg) {
+ this.logStackMsg(msg, Ci.nsIScriptError.warningFlag);
+ },
+
+ logStackMsg: function(msg, flag) {
+ let err = this._win.Error();
+ this.logMsg(msg, err.fileName, err.lineNumber, flag);
+ },
+
+ logMsg: function(msg, file, line, flag) {
+ let scriptErrorClass = Cc["@mozilla.org/scripterror;1"];
+ let scriptError = scriptErrorClass.createInstance(Ci.nsIScriptError);
+ scriptError.initWithWindowID(msg, file, null, line, 0, flag,
+ "content javascript", this._winID);
+ let console = Cc["@mozilla.org/consoleservice;1"].
+ getService(Ci.nsIConsoleService);
+ console.logMessage(scriptError);
+ },
+
+ getEH: function(type) {
+ return this.__DOM_IMPL__.getEventHandler(type);
+ },
+
+ setEH: function(type, handler) {
+ this.__DOM_IMPL__.setEventHandler(type, handler);
+ },
+
+ makeGetterSetterEH: function(name) {
+ Object.defineProperty(this, name,
+ {
+ get:function() { return this.getEH(name); },
+ set:function(h) { return this.setEH(name, h); }
+ });
+ },
+
+ makeLegacyGetterSetterEH: function(name, msg) {
+ Object.defineProperty(this, name,
+ {
+ get:function() { return this.getEH(name); },
+ set:function(h) {
+ this.logWarning(name + " is deprecated! " + msg);
+ return this.setEH(name, h);
+ }
+ });
+ },
+
+ _addIdentityAssertion: function(sdpPromise, origin) {
+ if (!this._localIdp.enabled) {
+ return sdpPromise;
+ }
+ return Promise.all([
+ this._certificateReady
+ .then(() => this._localIdp.getIdentityAssertion(this._impl.fingerprint,
+ origin)),
+ sdpPromise
+ ]).then(([,sdp]) => this._localIdp.addIdentityAttribute(sdp));
+ },
+
+ createOffer: function(optionsOrOnSuccess, onError, options) {
+ // This entry-point handles both new and legacy call sig. Decipher which one
+ let onSuccess;
+ if (typeof optionsOrOnSuccess == "function") {
+ onSuccess = optionsOrOnSuccess;
+ } else {
+ options = optionsOrOnSuccess;
+ }
+ return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
+ // TODO: Remove error on constraint-like RTCOptions next cycle (1197021).
+ // Note that webidl bindings make o.mandatory implicit but not o.optional.
+ function convertLegacyOptions(o) {
+ // Detect (mandatory OR optional) AND no other top-level members.
+ let lcy = ((o.mandatory && Object.keys(o.mandatory).length) || o.optional) &&
+ Object.keys(o).length == (o.mandatory? 1 : 0) + (o.optional? 1 : 0);
+ if (!lcy) {
+ return false;
+ }
+ let old = o.mandatory || {};
+ if (o.mandatory) {
+ delete o.mandatory;
+ }
+ if (o.optional) {
+ o.optional.forEach(one => {
+ // The old spec had optional as an array of objects w/1 attribute each.
+ // Assumes our JS-webidl bindings only populate passed-in properties.
+ let key = Object.keys(one)[0];
+ if (key && old[key] === undefined) {
+ old[key] = one[key];
+ }
+ });
+ delete o.optional;
+ }
+ o.offerToReceiveAudio = old.OfferToReceiveAudio;
+ o.offerToReceiveVideo = old.OfferToReceiveVideo;
+ o.mozDontOfferDataChannel = old.MozDontOfferDataChannel;
+ o.mozBundleOnly = old.MozBundleOnly;
+ Object.keys(o).forEach(k => {
+ if (o[k] === undefined) {
+ delete o[k];
+ }
+ });
+ return true;
+ }
+
+ if (options && convertLegacyOptions(options)) {
+ this.logError(
+ "Mandatory/optional in createOffer options no longer works! Use " +
+ JSON.stringify(options) + " instead (note the case difference)!");
+ options = {};
+ }
+
+ let origin = Cu.getWebIDLCallerPrincipal().origin;
+ return this._chain(() => {
+ let p = Promise.all([this.getPermission(), this._certificateReady])
+ .then(() => new this._win.Promise((resolve, reject) => {
+ this._onCreateOfferSuccess = resolve;
+ this._onCreateOfferFailure = reject;
+ this._impl.createOffer(options);
+ }));
+ p = this._addIdentityAssertion(p, origin);
+ return p.then(
+ sdp => new this._win.RTCSessionDescription({ type: "offer", sdp: sdp }));
+ });
+ });
+ },
+
+ createAnswer: function(optionsOrOnSuccess, onError) {
+ // This entry-point handles both new and legacy call sig. Decipher which one
+ let onSuccess, options;
+ if (typeof optionsOrOnSuccess == "function") {
+ onSuccess = optionsOrOnSuccess;
+ } else {
+ options = optionsOrOnSuccess;
+ }
+ return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
+ let origin = Cu.getWebIDLCallerPrincipal().origin;
+ return this._chain(() => {
+ let p = Promise.all([this.getPermission(), this._certificateReady])
+ .then(() => new this._win.Promise((resolve, reject) => {
+ // We give up line-numbers in errors by doing this here, but do all
+ // state-checks inside the chain, to support the legacy feature that
+ // callers don't have to wait for setRemoteDescription to finish.
+ if (!this.remoteDescription) {
+ throw new this._win.DOMException("setRemoteDescription not called",
+ "InvalidStateError");
+ }
+ if (this.remoteDescription.type != "offer") {
+ throw new this._win.DOMException("No outstanding offer",
+ "InvalidStateError");
+ }
+ this._onCreateAnswerSuccess = resolve;
+ this._onCreateAnswerFailure = reject;
+ this._impl.createAnswer();
+ }));
+ p = this._addIdentityAssertion(p, origin);
+ return p.then(sdp => {
+ return new this._win.RTCSessionDescription({ type: "answer", sdp: sdp });
+ });
+ });
+ });
+ },
+
+ getPermission: function() {
+ if (this._havePermission) {
+ return this._havePermission;
+ }
+ if (this._isChrome ||
+ AppConstants.MOZ_B2G ||
+ Services.prefs.getBoolPref("media.navigator.permission.disabled")) {
+ return this._havePermission = Promise.resolve();
+ }
+ return this._havePermission = new Promise((resolve, reject) => {
+ this._settlePermission = { allow: resolve, deny: reject };
+ let outerId = this._win.QueryInterface(Ci.nsIInterfaceRequestor).
+ getInterface(Ci.nsIDOMWindowUtils).outerWindowID;
+
+ let chrome = new CreateOfferRequest(outerId, this._winID,
+ this._globalPCListId, false);
+ let request = this._win.CreateOfferRequest._create(this._win, chrome);
+ Services.obs.notifyObservers(request, "PeerConnection:request", null);
+ });
+ },
+
+ setLocalDescription: function(desc, onSuccess, onError) {
+ return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
+ this._localType = desc.type;
+
+ let type;
+ switch (desc.type) {
+ case "offer":
+ type = Ci.IPeerConnection.kActionOffer;
+ break;
+ case "answer":
+ type = Ci.IPeerConnection.kActionAnswer;
+ break;
+ case "pranswer":
+ throw new this._win.DOMException("pranswer not yet implemented",
+ "NotSupportedError");
+ case "rollback":
+ type = Ci.IPeerConnection.kActionRollback;
+ break;
+ default:
+ throw new this._win.DOMException(
+ "Invalid type " + desc.type + " provided to setLocalDescription",
+ "InvalidParameterError");
+ }
+
+ if (desc.type !== "rollback" && !desc.sdp) {
+ throw new this._win.DOMException(
+ "Empty or null SDP provided to setLocalDescription",
+ "InvalidParameterError");
+ }
+
+ return this._chain(() => this.getPermission()
+ .then(() => new this._win.Promise((resolve, reject) => {
+ this._onSetLocalDescriptionSuccess = resolve;
+ this._onSetLocalDescriptionFailure = reject;
+ this._impl.setLocalDescription(type, desc.sdp);
+ })));
+ });
+ },
+
+ _validateIdentity: function(sdp, origin) {
+ let expectedIdentity;
+
+ // Only run a single identity verification at a time. We have to do this to
+ // avoid problems with the fact that identity validation doesn't block the
+ // resolution of setRemoteDescription().
+ let validation = this._lastIdentityValidation
+ .then(() => this._remoteIdp.verifyIdentityFromSDP(sdp, origin))
+ .then(msg => {
+ expectedIdentity = this._impl.peerIdentity;
+ // If this pc has an identity already, then the identity in sdp must match
+ if (expectedIdentity && (!msg || msg.identity !== expectedIdentity)) {
+ this.close();
+ throw new this._win.DOMException(
+ "Peer Identity mismatch, expected: " + expectedIdentity,
+ "IncompatibleSessionDescriptionError");
+ }
+ if (msg) {
+ // Set new identity and generate an event.
+ this._impl.peerIdentity = msg.identity;
+ this._resolvePeerIdentity(Cu.cloneInto({
+ idp: this._remoteIdp.provider,
+ name: msg.identity
+ }, this._win));
+ }
+ })
+ .catch(e => {
+ this._rejectPeerIdentity(e);
+ // If we don't expect a specific peer identity, failure to get a valid
+ // peer identity is not a terminal state, so replace the promise to
+ // allow another attempt.
+ if (!this._impl.peerIdentity) {
+ this._peerIdentity = new this._win.Promise((resolve, reject) => {
+ this._resolvePeerIdentity = resolve;
+ this._rejectPeerIdentity = reject;
+ });
+ }
+ throw e;
+ });
+ this._lastIdentityValidation = validation.catch(() => {});
+
+ // Only wait for IdP validation if we need identity matching
+ return expectedIdentity ? validation : this._win.Promise.resolve();
+ },
+
+ setRemoteDescription: function(desc, onSuccess, onError) {
+ return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
+ this._remoteType = desc.type;
+
+ let type;
+ switch (desc.type) {
+ case "offer":
+ type = Ci.IPeerConnection.kActionOffer;
+ break;
+ case "answer":
+ type = Ci.IPeerConnection.kActionAnswer;
+ break;
+ case "pranswer":
+ throw new this._win.DOMException("pranswer not yet implemented",
+ "NotSupportedError");
+ case "rollback":
+ type = Ci.IPeerConnection.kActionRollback;
+ break;
+ default:
+ throw new this._win.DOMException(
+ "Invalid type " + desc.type + " provided to setRemoteDescription",
+ "InvalidParameterError");
+ }
+
+ if (!desc.sdp && desc.type !== "rollback") {
+ throw new this._win.DOMException(
+ "Empty or null SDP provided to setRemoteDescription",
+ "InvalidParameterError");
+ }
+
+ // Get caller's origin before hitting the promise chain
+ let origin = Cu.getWebIDLCallerPrincipal().origin;
+
+ return this._chain(() => {
+ let setRem = this.getPermission()
+ .then(() => new this._win.Promise((resolve, reject) => {
+ this._onSetRemoteDescriptionSuccess = resolve;
+ this._onSetRemoteDescriptionFailure = reject;
+ this._impl.setRemoteDescription(type, desc.sdp);
+ })).then(() => { this._updateCanTrickle(); });
+
+ if (desc.type === "rollback") {
+ return setRem;
+ }
+
+ // Do setRemoteDescription and identity validation in parallel
+ let validId = this._validateIdentity(desc.sdp, origin);
+ return this._win.Promise.all([setRem, validId])
+ .then(() => {}); // must return undefined
+ });
+ });
+ },
+
+ setIdentityProvider: function(provider, protocol, username) {
+ this._checkClosed();
+ this._localIdp.setIdentityProvider(provider, protocol, username);
+ },
+
+ getIdentityAssertion: function() {
+ let origin = Cu.getWebIDLCallerPrincipal().origin;
+ return this._chain(
+ () => this._certificateReady.then(
+ () => this._localIdp.getIdentityAssertion(this._impl.fingerprint, origin)
+ )
+ );
+ },
+
+ get canTrickleIceCandidates() {
+ return this._canTrickle;
+ },
+
+ _updateCanTrickle: function() {
+ let containsTrickle = section => {
+ let lines = section.toLowerCase().split(/(?:\r\n?|\n)/);
+ return lines.some(line => {
+ let prefix = "a=ice-options:";
+ if (line.substring(0, prefix.length) !== prefix) {
+ return false;
+ }
+ let tokens = line.substring(prefix.length).split(" ");
+ return tokens.some(x => x === "trickle");
+ });
+ };
+
+ let desc = null;
+ try {
+ // The getter for remoteDescription can throw if the pc is closed.
+ desc = this.remoteDescription;
+ } catch (e) {}
+ if (!desc) {
+ this._canTrickle = null;
+ return;
+ }
+
+ let sections = desc.sdp.split(/(?:\r\n?|\n)m=/);
+ let topSection = sections.shift();
+ this._canTrickle =
+ containsTrickle(topSection) || sections.every(containsTrickle);
+ },
+
+
+ addIceCandidate: function(c, onSuccess, onError) {
+ return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
+ if (!c.candidate && !c.sdpMLineIndex) {
+ throw new this._win.DOMException("Invalid candidate passed to addIceCandidate!",
+ "InvalidParameterError");
+ }
+ return this._chain(() => new this._win.Promise((resolve, reject) => {
+ this._onAddIceCandidateSuccess = resolve;
+ this._onAddIceCandidateError = reject;
+ this._impl.addIceCandidate(c.candidate, c.sdpMid || "", c.sdpMLineIndex);
+ }));
+ });
+ },
+
+ addStream: function(stream) {
+ stream.getTracks().forEach(track => this.addTrack(track, stream));
+ },
+
+ getStreamById: function(id) {
+ throw new this._win.DOMException("getStreamById not yet implemented",
+ "NotSupportedError");
+ },
+
+ addTrack: function(track, stream) {
+ if (stream.currentTime === undefined) {
+ throw new this._win.DOMException("invalid stream.", "InvalidParameterError");
+ }
+ this._checkClosed();
+ this._senders.forEach(sender => {
+ if (sender.track == track) {
+ throw new this._win.DOMException("already added.",
+ "InvalidParameterError");
+ }
+ });
+ this._impl.addTrack(track, stream);
+ let sender = this._win.RTCRtpSender._create(this._win,
+ new RTCRtpSender(this, track,
+ stream));
+ this._senders.push(sender);
+ return sender;
+ },
+
+ removeTrack: function(sender) {
+ this._checkClosed();
+ var i = this._senders.indexOf(sender);
+ if (i >= 0) {
+ this._senders.splice(i, 1);
+ this._impl.removeTrack(sender.track); // fires negotiation needed
+ }
+ },
+
+ _insertDTMF: function(sender, tones, duration, interToneGap) {
+ return this._impl.insertDTMF(sender.__DOM_IMPL__, tones, duration, interToneGap);
+ },
+
+ _getDTMFToneBuffer: function(sender) {
+ return this._impl.getDTMFToneBuffer(sender.__DOM_IMPL__);
+ },
+
+ _replaceTrack: function(sender, withTrack) {
+ // TODO: Do a (sender._stream.getTracks().indexOf(track) < 0) check
+ // on both track args someday.
+ //
+ // The proposed API will be that both tracks must already be in the same
+ // stream. However, since our MediaStreams currently are limited to one
+ // track per type, we allow replacement with an outside track not already
+ // in the same stream.
+ //
+ // Since a track may be replaced more than once, the track being replaced
+ // may not be in the stream either, so we check neither arg right now.
+
+ return new this._win.Promise((resolve, reject) => {
+ this._onReplaceTrackSender = sender;
+ this._onReplaceTrackWithTrack = withTrack;
+ this._onReplaceTrackSuccess = resolve;
+ this._onReplaceTrackFailure = reject;
+ this._impl.replaceTrack(sender.track, withTrack);
+ });
+ },
+
+ _setParameters: function(sender, parameters) {
+ if (!Services.prefs.getBoolPref("media.peerconnection.simulcast")) {
+ return;
+ }
+ // validate parameters input
+ var encodings = parameters.encodings || [];
+
+ encodings.reduce((uniqueRids, encoding) => {
+ if (encoding.scaleResolutionDownBy < 1.0) {
+ throw new this._win.RangeError("scaleResolutionDownBy must be >= 1.0");
+ }
+ if (!encoding.rid && encodings.length > 1) {
+ throw new this._win.DOMException("Missing rid", "TypeError");
+ }
+ if (uniqueRids[encoding.rid]) {
+ throw new this._win.DOMException("Duplicate rid", "TypeError");
+ }
+ uniqueRids[encoding.rid] = true;
+ return uniqueRids;
+ }, {});
+
+ this._impl.setParameters(sender.track, parameters);
+ },
+
+ _getParameters: function(sender) {
+ if (!Services.prefs.getBoolPref("media.peerconnection.simulcast")) {
+ return;
+ }
+ return this._impl.getParameters(sender.track);
+ },
+
+ close: function() {
+ if (this._closed) {
+ return;
+ }
+ this._closed = true;
+ this._inClose = true;
+ this.changeIceConnectionState("closed");
+ this._localIdp.close();
+ this._remoteIdp.close();
+ this._impl.close();
+ this._inClose = false;
+ },
+
+ getLocalStreams: function() {
+ this._checkClosed();
+ return this._impl.getLocalStreams();
+ },
+
+ getRemoteStreams: function() {
+ this._checkClosed();
+ return this._impl.getRemoteStreams();
+ },
+
+ getSenders: function() {
+ return this._senders;
+ },
+
+ getReceivers: function() {
+ return this._receivers;
+ },
+
+ mozSelectSsrc: function(receiver, ssrcIndex) {
+ this._impl.selectSsrc(receiver.track, ssrcIndex);
+ },
+
+ get localDescription() {
+ this._checkClosed();
+ let sdp = this._impl.localDescription;
+ if (sdp.length == 0) {
+ return null;
+ }
+
+ return new this._win.RTCSessionDescription({ type: this._localType,
+ sdp: sdp });
+ },
+
+ get remoteDescription() {
+ this._checkClosed();
+ let sdp = this._impl.remoteDescription;
+ if (sdp.length == 0) {
+ return null;
+ }
+ return new this._win.RTCSessionDescription({ type: this._remoteType,
+ sdp: sdp });
+ },
+
+ get peerIdentity() { return this._peerIdentity; },
+ get idpLoginUrl() { return this._localIdp.idpLoginUrl; },
+ get id() { return this._impl.id; },
+ set id(s) { this._impl.id = s; },
+ get iceGatheringState() { return this._iceGatheringState; },
+ get iceConnectionState() { return this._iceConnectionState; },
+
+ get signalingState() {
+ // checking for our local pc closed indication
+ // before invoking the pc methods.
+ if (this._closed) {
+ return "closed";
+ }
+ return {
+ "SignalingInvalid": "",
+ "SignalingStable": "stable",
+ "SignalingHaveLocalOffer": "have-local-offer",
+ "SignalingHaveRemoteOffer": "have-remote-offer",
+ "SignalingHaveLocalPranswer": "have-local-pranswer",
+ "SignalingHaveRemotePranswer": "have-remote-pranswer",
+ "SignalingClosed": "closed"
+ }[this._impl.signalingState];
+ },
+
+ changeIceGatheringState: function(state) {
+ this._iceGatheringState = state;
+ _globalPCList.notifyLifecycleObservers(this, "icegatheringstatechange");
+ },
+
+ changeIceConnectionState: function(state) {
+ this._iceConnectionState = state;
+ _globalPCList.notifyLifecycleObservers(this, "iceconnectionstatechange");
+ this.dispatchEvent(new this._win.Event("iceconnectionstatechange"));
+ },
+
+ getStats: function(selector, onSuccess, onError) {
+ return this._legacyCatchAndCloseGuard(onSuccess, onError, () => {
+ return this._chain(() => new this._win.Promise((resolve, reject) => {
+ this._onGetStatsSuccess = resolve;
+ this._onGetStatsFailure = reject;
+ this._impl.getStats(selector);
+ }));
+ });
+ },
+
+ createDataChannel: function(label, dict) {
+ this._checkClosed();
+ if (dict == undefined) {
+ dict = {};
+ }
+ if (dict.maxRetransmitNum != undefined) {
+ dict.maxRetransmits = dict.maxRetransmitNum;
+ this.logWarning("Deprecated RTCDataChannelInit dictionary entry maxRetransmitNum used!");
+ }
+ if (dict.outOfOrderAllowed != undefined) {
+ dict.ordered = !dict.outOfOrderAllowed; // the meaning is swapped with
+ // the name change
+ this.logWarning("Deprecated RTCDataChannelInit dictionary entry outOfOrderAllowed used!");
+ }
+
+ if (dict.preset != undefined) {
+ dict.negotiated = dict.preset;
+ this.logWarning("Deprecated RTCDataChannelInit dictionary entry preset used!");
+ }
+ if (dict.stream != undefined) {
+ dict.id = dict.stream;
+ this.logWarning("Deprecated RTCDataChannelInit dictionary entry stream used!");
+ }
+
+ if (dict.maxRetransmitTime !== null && dict.maxRetransmits !== null) {
+ throw new this._win.DOMException(
+ "Both maxRetransmitTime and maxRetransmits cannot be provided",
+ "InvalidParameterError");
+ }
+ let protocol;
+ if (dict.protocol == undefined) {
+ protocol = "";
+ } else {
+ protocol = dict.protocol;
+ }
+
+ // Must determine the type where we still know if entries are undefined.
+ let type;
+ if (dict.maxRetransmitTime != undefined) {
+ type = Ci.IPeerConnection.kDataChannelPartialReliableTimed;
+ } else if (dict.maxRetransmits != undefined) {
+ type = Ci.IPeerConnection.kDataChannelPartialReliableRexmit;
+ } else {
+ type = Ci.IPeerConnection.kDataChannelReliable;
+ }
+
+ // Synchronous since it doesn't block.
+ let channel = this._impl.createDataChannel(
+ label, protocol, type, !dict.ordered, dict.maxRetransmitTime,
+ dict.maxRetransmits, dict.negotiated ? true : false,
+ dict.id != undefined ? dict.id : 0xFFFF
+ );
+ return channel;
+ }
+};
+
+// This is a separate object because we don't want to expose it to DOM.
+function PeerConnectionObserver() {
+ this._dompc = null;
+}
+PeerConnectionObserver.prototype = {
+ classDescription: "PeerConnectionObserver",
+ classID: PC_OBS_CID,
+ contractID: PC_OBS_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+ init: function(win) { this._win = win; },
+
+ __init: function(dompc) {
+ this._dompc = dompc._innerObject;
+ },
+
+ newError: function(message, code) {
+ // These strings must match those defined in the WebRTC spec.
+ const reasonName = [
+ "",
+ "InternalError",
+ "InvalidCandidateError",
+ "InvalidParameterError",
+ "InvalidStateError",
+ "InvalidSessionDescriptionError",
+ "IncompatibleSessionDescriptionError",
+ "InternalError",
+ "IncompatibleMediaStreamTrackError",
+ "InternalError"
+ ];
+ let name = reasonName[Math.min(code, reasonName.length - 1)];
+ return new this._dompc._win.DOMException(message, name);
+ },
+
+ dispatchEvent: function(event) {
+ this._dompc.dispatchEvent(event);
+ },
+
+ onCreateOfferSuccess: function(sdp) {
+ this._dompc._onCreateOfferSuccess(sdp);
+ },
+
+ onCreateOfferError: function(code, message) {
+ this._dompc._onCreateOfferFailure(this.newError(message, code));
+ },
+
+ onCreateAnswerSuccess: function(sdp) {
+ this._dompc._onCreateAnswerSuccess(sdp);
+ },
+
+ onCreateAnswerError: function(code, message) {
+ this._dompc._onCreateAnswerFailure(this.newError(message, code));
+ },
+
+ onSetLocalDescriptionSuccess: function() {
+ this._dompc._onSetLocalDescriptionSuccess();
+ },
+
+ onSetRemoteDescriptionSuccess: function() {
+ this._dompc._onSetRemoteDescriptionSuccess();
+ },
+
+ onSetLocalDescriptionError: function(code, message) {
+ this._localType = null;
+ this._dompc._onSetLocalDescriptionFailure(this.newError(message, code));
+ },
+
+ onSetRemoteDescriptionError: function(code, message) {
+ this._remoteType = null;
+ this._dompc._onSetRemoteDescriptionFailure(this.newError(message, code));
+ },
+
+ onAddIceCandidateSuccess: function() {
+ this._dompc._onAddIceCandidateSuccess();
+ },
+
+ onAddIceCandidateError: function(code, message) {
+ this._dompc._onAddIceCandidateError(this.newError(message, code));
+ },
+
+ onIceCandidate: function(level, mid, candidate) {
+ if (candidate == "") {
+ this.foundIceCandidate(null);
+ } else {
+ this.foundIceCandidate(new this._dompc._win.RTCIceCandidate(
+ {
+ candidate: candidate,
+ sdpMid: mid,
+ sdpMLineIndex: level
+ }
+ ));
+ }
+ },
+
+ onNegotiationNeeded: function() {
+ this.dispatchEvent(new this._win.Event("negotiationneeded"));
+ },
+
+
+ // This method is primarily responsible for updating iceConnectionState.
+ // This state is defined in the WebRTC specification as follows:
+ //
+ // iceConnectionState:
+ // -------------------
+ // new The ICE Agent is gathering addresses and/or waiting for
+ // remote candidates to be supplied.
+ //
+ // checking The ICE Agent has received remote candidates on at least
+ // one component, and is checking candidate pairs but has not
+ // yet found a connection. In addition to checking, it may
+ // also still be gathering.
+ //
+ // connected The ICE Agent has found a usable connection for all
+ // components but is still checking other candidate pairs to
+ // see if there is a better connection. It may also still be
+ // gathering.
+ //
+ // completed The ICE Agent has finished gathering and checking and found
+ // a connection for all components. Open issue: it is not
+ // clear how the non controlling ICE side knows it is in the
+ // state.
+ //
+ // failed The ICE Agent is finished checking all candidate pairs and
+ // failed to find a connection for at least one component.
+ // Connections may have been found for some components.
+ //
+ // disconnected Liveness checks have failed for one or more components.
+ // This is more aggressive than failed, and may trigger
+ // intermittently (and resolve itself without action) on a
+ // flaky network.
+ //
+ // closed The ICE Agent has shut down and is no longer responding to
+ // STUN requests.
+
+ handleIceConnectionStateChange: function(iceConnectionState) {
+ let pc = this._dompc;
+ if (pc.iceConnectionState === 'new') {
+ var checking_histogram = Services.telemetry.getHistogramById("WEBRTC_ICE_CHECKING_RATE");
+ if (iceConnectionState === 'checking') {
+ checking_histogram.add(true);
+ } else if (iceConnectionState === 'failed') {
+ checking_histogram.add(false);
+ }
+ } else if (pc.iceConnectionState === 'checking') {
+ var success_histogram = Services.telemetry.getHistogramById("WEBRTC_ICE_SUCCESS_RATE");
+ if (iceConnectionState === 'completed' ||
+ iceConnectionState === 'connected') {
+ success_histogram.add(true);
+ } else if (iceConnectionState === 'failed') {
+ success_histogram.add(false);
+ }
+ }
+
+ if (iceConnectionState === 'failed') {
+ pc.logError("ICE failed, see about:webrtc for more details");
+ }
+
+ pc.changeIceConnectionState(iceConnectionState);
+ },
+
+ // This method is responsible for updating iceGatheringState. This
+ // state is defined in the WebRTC specification as follows:
+ //
+ // iceGatheringState:
+ // ------------------
+ // new The object was just created, and no networking has occurred
+ // yet.
+ //
+ // gathering The ICE engine is in the process of gathering candidates for
+ // this RTCPeerConnection.
+ //
+ // complete The ICE engine has completed gathering. Events such as adding
+ // a new interface or a new TURN server will cause the state to
+ // go back to gathering.
+ //
+ handleIceGatheringStateChange: function(gatheringState) {
+ this._dompc.changeIceGatheringState(gatheringState);
+ },
+
+ onStateChange: function(state) {
+ switch (state) {
+ case "SignalingState":
+ this.dispatchEvent(new this._win.Event("signalingstatechange"));
+ break;
+
+ case "IceConnectionState":
+ this.handleIceConnectionStateChange(this._dompc._pc.iceConnectionState);
+ break;
+
+ case "IceGatheringState":
+ this.handleIceGatheringStateChange(this._dompc._pc.iceGatheringState);
+ break;
+
+ case "SdpState":
+ // No-op
+ break;
+
+ case "ReadyState":
+ // No-op
+ break;
+
+ case "SipccState":
+ // No-op
+ break;
+
+ default:
+ this._dompc.logWarning("Unhandled state type: " + state);
+ break;
+ }
+ },
+
+ onGetStatsSuccess: function(dict) {
+ let pc = this._dompc;
+ let chromeobj = new RTCStatsReport(pc._win, dict);
+ let webidlobj = pc._win.RTCStatsReport._create(pc._win, chromeobj);
+ chromeobj.makeStatsPublic(pc._warnDeprecatedStatsAccessNullable);
+ pc._onGetStatsSuccess(webidlobj);
+ },
+
+ onGetStatsError: function(code, message) {
+ this._dompc._onGetStatsFailure(this.newError(message, code));
+ },
+
+ onAddStream: function(stream) {
+ let ev = new this._dompc._win.MediaStreamEvent("addstream",
+ { stream: stream });
+ this.dispatchEvent(ev);
+ },
+
+ onRemoveStream: function(stream) {
+ this.dispatchEvent(new this._dompc._win.MediaStreamEvent("removestream",
+ { stream: stream }));
+ },
+
+ onAddTrack: function(track, streams) {
+ let pc = this._dompc;
+ let receiver = pc._win.RTCRtpReceiver._create(pc._win,
+ new RTCRtpReceiver(this,
+ track));
+ pc._receivers.push(receiver);
+ let ev = new pc._win.RTCTrackEvent("track",
+ { receiver: receiver,
+ track: track,
+ streams: streams });
+ this.dispatchEvent(ev);
+
+ // Fire legacy event as well for a little bit.
+ ev = new pc._win.MediaStreamTrackEvent("addtrack", { track: track });
+ this.dispatchEvent(ev);
+ },
+
+ onRemoveTrack: function(track) {
+ let pc = this._dompc;
+ let i = pc._receivers.findIndex(receiver => receiver.track == track);
+ if (i >= 0) {
+ pc._receivers.splice(i, 1);
+ }
+ },
+
+ onReplaceTrackSuccess: function() {
+ var pc = this._dompc;
+ pc._onReplaceTrackSender.track = pc._onReplaceTrackWithTrack;
+ pc._onReplaceTrackWithTrack = null;
+ pc._onReplaceTrackSender = null;
+ pc._onReplaceTrackSuccess();
+ },
+
+ onReplaceTrackError: function(code, message) {
+ var pc = this._dompc;
+ pc._onReplaceTrackWithTrack = null;
+ pc._onReplaceTrackSender = null;
+ pc._onReplaceTrackFailure(this.newError(message, code));
+ },
+
+ foundIceCandidate: function(cand) {
+ this.dispatchEvent(new this._dompc._win.RTCPeerConnectionIceEvent("icecandidate",
+ { candidate: cand } ));
+ },
+
+ notifyDataChannel: function(channel) {
+ this.dispatchEvent(new this._dompc._win.RTCDataChannelEvent("datachannel",
+ { channel: channel }));
+ },
+
+ onDTMFToneChange: function(trackId, tone) {
+ var pc = this._dompc;
+ var sender = pc._senders.find(sender => sender.track.id == trackId)
+ sender.dtmf.dispatchEvent(new pc._win.RTCDTMFToneChangeEvent("tonechange",
+ { tone: tone }));
+ }
+};
+
+function RTCPeerConnectionStatic() {
+}
+RTCPeerConnectionStatic.prototype = {
+ classDescription: "RTCPeerConnectionStatic",
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports,
+ Ci.nsIDOMGlobalPropertyInitializer]),
+
+ classID: PC_STATIC_CID,
+ contractID: PC_STATIC_CONTRACT,
+
+ init: function(win) {
+ this._winID = win.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
+ },
+
+ registerPeerConnectionLifecycleCallback: function(cb) {
+ _globalPCList._registerPeerConnectionLifecycleCallback(this._winID, cb);
+ },
+};
+
+function RTCDTMFSender(sender) {
+ this._sender = sender;
+}
+RTCDTMFSender.prototype = {
+ classDescription: "RTCDTMFSender",
+ classID: PC_DTMF_SENDER_CID,
+ contractID: PC_DTMF_SENDER_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),
+
+ get toneBuffer() {
+ return this._sender._pc._getDTMFToneBuffer(this._sender);
+ },
+
+ get ontonechange() {
+ return this.__DOM_IMPL__.getEventHandler("ontonechange");
+ },
+
+ set ontonechange(handler) {
+ this.__DOM_IMPL__.setEventHandler("ontonechange", handler);
+ },
+
+ insertDTMF: function(tones, duration, interToneGap) {
+ this._sender._pc._checkClosed();
+
+ if (this._sender._pc._senders.indexOf(this._sender.__DOM_IMPL__) == -1) {
+ throw new this._sender._pc._win.DOMException("RTCRtpSender is stopped",
+ "InvalidStateError");
+ }
+
+ duration = Math.max(40, Math.min(duration, 6000));
+ if (interToneGap < 30) interToneGap = 30;
+
+ tones = tones.toUpperCase();
+
+ if (tones.match(/[^0-9A-D#*,]/)) {
+ throw new this._sender._pc._win.DOMException("Invalid DTMF characters",
+ "InvalidCharacterError");
+ }
+
+ this._sender._pc._insertDTMF(this._sender, tones, duration, interToneGap);
+ },
+};
+
+function RTCRtpSender(pc, track, stream) {
+ this._pc = pc;
+ this.track = track;
+ this._stream = stream;
+ this.dtmf = pc._win.RTCDTMFSender._create(pc._win, new RTCDTMFSender(this));
+}
+RTCRtpSender.prototype = {
+ classDescription: "RTCRtpSender",
+ classID: PC_SENDER_CID,
+ contractID: PC_SENDER_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),
+
+ replaceTrack: function(withTrack) {
+ return this._pc._chain(() => this._pc._replaceTrack(this, withTrack));
+ },
+
+ setParameters: function(parameters) {
+ return this._pc._win.Promise.resolve()
+ .then(() => this._pc._setParameters(this, parameters));
+ },
+
+ getParameters: function() {
+ return this._pc._getParameters(this);
+ }
+};
+
+function RTCRtpReceiver(pc, track) {
+ this._pc = pc;
+ this.track = track;
+}
+RTCRtpReceiver.prototype = {
+ classDescription: "RTCRtpReceiver",
+ classID: PC_RECEIVER_CID,
+ contractID: PC_RECEIVER_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),
+};
+
+function CreateOfferRequest(windowID, innerWindowID, callID, isSecure) {
+ this.windowID = windowID;
+ this.innerWindowID = innerWindowID;
+ this.callID = callID;
+ this.isSecure = isSecure;
+}
+CreateOfferRequest.prototype = {
+ classDescription: "CreateOfferRequest",
+ classID: PC_COREQUEST_CID,
+ contractID: PC_COREQUEST_CONTRACT,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory(
+ [GlobalPCList,
+ RTCDTMFSender,
+ RTCIceCandidate,
+ RTCSessionDescription,
+ RTCPeerConnection,
+ RTCPeerConnectionStatic,
+ RTCRtpReceiver,
+ RTCRtpSender,
+ RTCStatsReport,
+ PeerConnectionObserver,
+ CreateOfferRequest]
+);
diff --git a/dom/media/PeerConnection.manifest b/dom/media/PeerConnection.manifest
new file mode 100644
index 000000000..8edd721ac
--- /dev/null
+++ b/dom/media/PeerConnection.manifest
@@ -0,0 +1,23 @@
+component {bdc2e533-b308-4708-ac8e-a8bfade6d851} PeerConnection.js
+component {d1748d4c-7f6a-4dc5-add6-d55b7678537e} PeerConnection.js
+component {02b9970c-433d-4cc2-923d-f7028ac66073} PeerConnection.js
+component {1775081b-b62d-4954-8ffe-a067bbf508a7} PeerConnection.js
+component {7293e901-2be3-4c02-b4bd-cbef6fc24f78} PeerConnection.js
+component {7fe6e18b-0da3-4056-bf3b-440ef3809e06} PeerConnection.js
+component {0fb47c47-a205-4583-a9fc-cbadf8c95880} PeerConnection.js
+component {4fff5d46-d827-4cd4-a970-8fd53977440e} PeerConnection.js
+component {d974b814-8fde-411c-8c45-b86791b81030} PeerConnection.js
+component {74b2122d-65a8-4824-aa9e-3d664cb75dc2} PeerConnection.js
+component {3610C242-654E-11E6-8EC0-6D1BE389A607} PeerConnection.js
+
+contract @mozilla.org/dom/peerconnection;1 {bdc2e533-b308-4708-ac8e-a8bfade6d851}
+contract @mozilla.org/dom/peerconnectionobserver;1 {d1748d4c-7f6a-4dc5-add6-d55b7678537e}
+contract @mozilla.org/dom/rtcdtmfsender;1 {3610C242-654E-11E6-8EC0-6D1BE389A607}
+contract @mozilla.org/dom/rtcicecandidate;1 {02b9970c-433d-4cc2-923d-f7028ac66073}
+contract @mozilla.org/dom/rtcsessiondescription;1 {1775081b-b62d-4954-8ffe-a067bbf508a7}
+contract @mozilla.org/dom/peerconnectionmanager;1 {7293e901-2be3-4c02-b4bd-cbef6fc24f78}
+contract @mozilla.org/dom/rtcstatsreport;1 {7fe6e18b-0da3-4056-bf3b-440ef3809e06}
+contract @mozilla.org/dom/peerconnectionstatic;1 {0fb47c47-a205-4583-a9fc-cbadf8c95880}
+contract @mozilla.org/dom/rtpsender;1 {4fff5d46-d827-4cd4-a970-8fd53977440e}
+contract @mozilla.org/dom/rtpreceiver;1 {d974b814-8fde-411c-8c45-b86791b81030}
+contract @mozilla.org/dom/createofferrequest;1 {74b2122d-65a8-4824-aa9e-3d664cb75dc2}
diff --git a/dom/media/PeerConnectionIdp.jsm b/dom/media/PeerConnectionIdp.jsm
new file mode 100644
index 000000000..d1578d1b7
--- /dev/null
+++ b/dom/media/PeerConnectionIdp.jsm
@@ -0,0 +1,341 @@
+/* jshint moz:true, browser:true */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+this.EXPORTED_SYMBOLS = ['PeerConnectionIdp'];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import('resource://gre/modules/Services.jsm');
+Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+XPCOMUtils.defineLazyModuleGetter(this, 'IdpSandbox',
+ 'resource://gre/modules/media/IdpSandbox.jsm');
+
+/**
+ * Creates an IdP helper.
+ *
+ * @param win (object) the window we are working for
+ * @param timeout (int) the timeout in milliseconds
+ */
+function PeerConnectionIdp(win, timeout) {
+ this._win = win;
+ this._timeout = timeout || 5000;
+
+ this.provider = null;
+ this._resetAssertion();
+}
+
+(function() {
+ PeerConnectionIdp._mLinePattern = new RegExp('^m=', 'm');
+ // attributes are funny, the 'a' is case sensitive, the name isn't
+ let pattern = '^a=[iI][dD][eE][nN][tT][iI][tT][yY]:(\\S+)';
+ PeerConnectionIdp._identityPattern = new RegExp(pattern, 'm');
+ pattern = '^a=[fF][iI][nN][gG][eE][rR][pP][rR][iI][nN][tT]:(\\S+) (\\S+)';
+ PeerConnectionIdp._fingerprintPattern = new RegExp(pattern, 'm');
+})();
+
+PeerConnectionIdp.prototype = {
+ get enabled() {
+ return !!this._idp;
+ },
+
+ _resetAssertion: function() {
+ this.assertion = null;
+ this.idpLoginUrl = null;
+ },
+
+ setIdentityProvider: function(provider, protocol, username) {
+ this._resetAssertion();
+ this.provider = provider;
+ this.protocol = protocol || 'default';
+ this.username = username;
+ if (this._idp) {
+ if (this._idp.isSame(provider, protocol)) {
+ return; // noop
+ }
+ this._idp.stop();
+ }
+ this._idp = new IdpSandbox(provider, protocol, this._win);
+ },
+
+ // start the IdP and do some error fixup
+ start: function() {
+ return this._idp.start()
+ .catch(e => {
+ throw new this._win.DOMException(e.message, 'IdpError');
+ });
+ },
+
+ close: function() {
+ this._resetAssertion();
+ this.provider = null;
+ this.protocol = null;
+ if (this._idp) {
+ this._idp.stop();
+ this._idp = null;
+ }
+ },
+
+ _getFingerprintsFromSdp: function(sdp) {
+ let fingerprints = {};
+ let m = sdp.match(PeerConnectionIdp._fingerprintPattern);
+ while (m) {
+ fingerprints[m[0]] = { algorithm: m[1], digest: m[2] };
+ sdp = sdp.substring(m.index + m[0].length);
+ m = sdp.match(PeerConnectionIdp._fingerprintPattern);
+ }
+
+ return Object.keys(fingerprints).map(k => fingerprints[k]);
+ },
+
+ _isValidAssertion: function(assertion) {
+ return assertion && assertion.idp &&
+ typeof assertion.idp.domain === 'string' &&
+ (!assertion.idp.protocol ||
+ typeof assertion.idp.protocol === 'string') &&
+ typeof assertion.assertion === 'string';
+ },
+
+ _getIdentityFromSdp: function(sdp) {
+ // a=identity is session level
+ let idMatch;
+ let mLineMatch = sdp.match(PeerConnectionIdp._mLinePattern);
+ if (mLineMatch) {
+ let sessionLevel = sdp.substring(0, mLineMatch.index);
+ idMatch = sessionLevel.match(PeerConnectionIdp._identityPattern);
+ }
+ if (!idMatch) {
+ return; // undefined === no identity
+ }
+
+ let assertion;
+ try {
+ assertion = JSON.parse(atob(idMatch[1]));
+ } catch (e) {
+ throw new this._win.DOMException('invalid identity assertion: ' + e,
+ 'InvalidSessionDescriptionError');
+ }
+ if (!this._isValidAssertion(assertion)) {
+ throw new this._win.DOMException('assertion missing idp/idp.domain/assertion',
+ 'InvalidSessionDescriptionError');
+ }
+ return assertion;
+ },
+
+ /**
+ * Verifies the a=identity line the given SDP contains, if any.
+ * If the verification succeeds callback is called with the message from the
+ * IdP proxy as parameter, else (verification failed OR no a=identity line in
+ * SDP at all) null is passed to callback.
+ *
+ * Note that this only verifies that the SDP is coherent. We still rely on
+ * the fact that the RTCPeerConnection won't connect to a peer if the
+ * fingerprint of the certificate they offer doesn't appear in the SDP.
+ */
+ verifyIdentityFromSDP: function(sdp, origin) {
+ let identity = this._getIdentityFromSdp(sdp);
+ let fingerprints = this._getFingerprintsFromSdp(sdp);
+ if (!identity || fingerprints.length <= 0) {
+ return this._win.Promise.resolve(); // undefined result = no identity
+ }
+
+ this.setIdentityProvider(identity.idp.domain, identity.idp.protocol);
+ return this._verifyIdentity(identity.assertion, fingerprints, origin);
+ },
+
+ /**
+ * Checks that the name in the identity provided by the IdP is OK.
+ *
+ * @param name (string) the name to validate
+ * @throws if the name isn't valid
+ */
+ _validateName: function(name) {
+ let error = msg => {
+ throw new this._win.DOMException('assertion name error: ' + msg,
+ 'IdpError');
+ };
+
+ if (typeof name !== 'string') {
+ error('name not a string');
+ }
+ let atIdx = name.indexOf('@');
+ if (atIdx <= 0) {
+ error('missing authority in name from IdP');
+ }
+
+ // no third party assertions... for now
+ let tail = name.substring(atIdx + 1);
+
+ // strip the port number, if present
+ let provider = this.provider;
+ let providerPortIdx = provider.indexOf(':');
+ if (providerPortIdx > 0) {
+ provider = provider.substring(0, providerPortIdx);
+ }
+ let idnService = Components.classes['@mozilla.org/network/idn-service;1']
+ .getService(Components.interfaces.nsIIDNService);
+ if (idnService.convertUTF8toACE(tail) !==
+ idnService.convertUTF8toACE(provider)) {
+ error('name "' + name +
+ '" doesn\'t match IdP: "' + this.provider + '"');
+ }
+ },
+
+ /**
+ * Check the validation response. We are very defensive here when handling
+ * the message from the IdP proxy. That way, broken IdPs aren't likely to
+ * cause catastrophic damage.
+ */
+ _checkValidation: function(validation, sdpFingerprints) {
+ let error = msg => {
+ throw new this._win.DOMException('IdP validation error: ' + msg,
+ 'IdpError');
+ };
+
+ if (!this.provider) {
+ error('IdP closed');
+ }
+
+ if (typeof validation !== 'object' ||
+ typeof validation.contents !== 'string' ||
+ typeof validation.identity !== 'string') {
+ error('no payload in validation response');
+ }
+
+ let fingerprints;
+ try {
+ fingerprints = JSON.parse(validation.contents).fingerprint;
+ } catch (e) {
+ error('invalid JSON');
+ }
+
+ let isFingerprint = f =>
+ (typeof f.digest === 'string') &&
+ (typeof f.algorithm === 'string');
+ if (!Array.isArray(fingerprints) || !fingerprints.every(isFingerprint)) {
+ error('fingerprints must be an array of objects' +
+ ' with digest and algorithm attributes');
+ }
+
+ // everything in `innerSet` is found in `outerSet`
+ let isSubsetOf = (outerSet, innerSet, comparator) => {
+ return innerSet.every(i => {
+ return outerSet.some(o => comparator(i, o));
+ });
+ };
+ let compareFingerprints = (a, b) => {
+ return (a.digest === b.digest) && (a.algorithm === b.algorithm);
+ };
+ if (!isSubsetOf(fingerprints, sdpFingerprints, compareFingerprints)) {
+ error('the fingerprints must be covered by the assertion');
+ }
+ this._validateName(validation.identity);
+ return validation;
+ },
+
+ /**
+ * Asks the IdP proxy to verify an identity assertion.
+ */
+ _verifyIdentity: function(assertion, fingerprints, origin) {
+ let p = this.start()
+ .then(idp => this._wrapCrossCompartmentPromise(
+ idp.validateAssertion(assertion, origin)))
+ .then(validation => this._checkValidation(validation, fingerprints));
+
+ return this._applyTimeout(p);
+ },
+
+ /**
+ * Enriches the given SDP with an `a=identity` line. getIdentityAssertion()
+ * must have already run successfully, otherwise this does nothing to the sdp.
+ */
+ addIdentityAttribute: function(sdp) {
+ if (!this.assertion) {
+ return sdp;
+ }
+
+ // yes, we assume that this matches; if it doesn't something is *wrong*
+ let match = sdp.match(PeerConnectionIdp._mLinePattern);
+ return sdp.substring(0, match.index) +
+ 'a=identity:' + this.assertion + '\r\n' +
+ sdp.substring(match.index);
+ },
+
+ /**
+ * Asks the IdP proxy for an identity assertion. Don't call this unless you
+ * have checked .enabled, or you really like exceptions. Also, don't call
+ * this when another call is still running, because it's not certain which
+ * call will finish first and the final state will be similarly uncertain.
+ */
+ getIdentityAssertion: function(fingerprint, origin) {
+ if (!this.enabled) {
+ throw new this._win.DOMException(
+ 'no IdP set, call setIdentityProvider() to set one', 'InvalidStateError');
+ }
+
+ let [algorithm, digest] = fingerprint.split(' ', 2);
+ let content = {
+ fingerprint: [{
+ algorithm: algorithm,
+ digest: digest
+ }]
+ };
+
+ this._resetAssertion();
+ let p = this.start()
+ .then(idp => this._wrapCrossCompartmentPromise(
+ idp.generateAssertion(JSON.stringify(content),
+ origin, this.username)))
+ .then(assertion => {
+ if (!this._isValidAssertion(assertion)) {
+ throw new this._win.DOMException('IdP generated invalid assertion',
+ 'IdpError');
+ }
+ // save the base64+JSON assertion, since that is all that is used
+ this.assertion = btoa(JSON.stringify(assertion));
+ return this.assertion;
+ });
+
+ return this._applyTimeout(p);
+ },
+
+ /**
+ * Promises generated by the sandbox need to be very carefully treated so that
+ * they can chain into promises in the `this._win` compartment. Results need
+ * to be cloned across; errors need to be converted.
+ */
+ _wrapCrossCompartmentPromise: function(sandboxPromise) {
+ return new this._win.Promise((resolve, reject) => {
+ sandboxPromise.then(
+ result => resolve(Cu.cloneInto(result, this._win)),
+ e => {
+ let message = '' + (e.message || JSON.stringify(e) || 'IdP error');
+ if (e.name === 'IdpLoginError') {
+ if (typeof e.loginUrl === 'string') {
+ this.idpLoginUrl = e.loginUrl;
+ }
+ reject(new this._win.DOMException(message, 'IdpLoginError'));
+ } else {
+ reject(new this._win.DOMException(message, 'IdpError'));
+ }
+ });
+ });
+ },
+
+ /**
+ * Wraps a promise, adding a timeout guard on it so that it can't take longer
+ * than the specified time. Returns a promise that rejects if the timeout
+ * elapses before `p` resolves.
+ */
+ _applyTimeout: function(p) {
+ let timeout = new this._win.Promise(
+ r => this._win.setTimeout(r, this._timeout))
+ .then(() => {
+ throw new this._win.DOMException('IdP timed out', 'IdpError');
+ });
+ return this._win.Promise.race([ timeout, p ]);
+ }
+};
+
+this.PeerConnectionIdp = PeerConnectionIdp;
diff --git a/dom/media/PrincipalChangeObserver.h b/dom/media/PrincipalChangeObserver.h
new file mode 100644
index 000000000..2597813c5
--- /dev/null
+++ b/dom/media/PrincipalChangeObserver.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_PRINCIPALCHANGEOBSERVER_H_
+#define MOZILLA_PRINCIPALCHANGEOBSERVER_H_
+
+namespace mozilla {
+namespace dom {
+
+/**
+ * A PrincipalChangeObserver for any type, but originating from DOMMediaStream,
+ * then expanded to MediaStreamTrack.
+ *
+ * Used to learn about dynamic changes to an object's principal.
+ * Operations relating to these observers must be confined to the main thread.
+ */
+template<typename T>
+class PrincipalChangeObserver
+{
+public:
+ virtual void PrincipalChanged(T* aArg) = 0;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* MOZILLA_PRINCIPALCHANGEOBSERVER_H_ */
diff --git a/dom/media/QueueObject.cpp b/dom/media/QueueObject.cpp
new file mode 100644
index 000000000..53dffad07
--- /dev/null
+++ b/dom/media/QueueObject.cpp
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "QueueObject.h"
+#include "mozilla/AbstractThread.h"
+#include "mozilla/TaskQueue.h"
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+
+QueueObject::QueueObject(RefPtr<AbstractThread> aThread) : mThread(aThread) {}
+
+QueueObject::~QueueObject() {}
+
+void
+QueueObject::Dispatch(nsIRunnable* aRunnable)
+{
+ Dispatch(do_AddRef(aRunnable));
+}
+
+void
+QueueObject::Dispatch(already_AddRefed<nsIRunnable> aRunnable)
+{
+ mThread->Dispatch(Move(aRunnable));
+}
+
+bool
+QueueObject::OnThread()
+{
+ return mThread->IsCurrentThreadIn();
+}
+
+AbstractThread*
+QueueObject::Thread()
+{
+ return mThread;
+}
+}
diff --git a/dom/media/QueueObject.h b/dom/media/QueueObject.h
new file mode 100644
index 000000000..7d0184f0c
--- /dev/null
+++ b/dom/media/QueueObject.h
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_QUEUE_OBJECT_H
+#define MOZILLA_QUEUE_OBJECT_H
+
+#include "mozilla/RefPtr.h"
+#include "nsIRunnable.h"
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+
+class AbstractThread;
+
+class QueueObject
+{
+public:
+ explicit QueueObject(RefPtr<AbstractThread> aThread);
+ ~QueueObject();
+ void Dispatch(nsIRunnable* aRunnable);
+ void Dispatch(already_AddRefed<nsIRunnable> aRunnable);
+ bool OnThread();
+ AbstractThread* Thread();
+
+private:
+ RefPtr<AbstractThread> mThread;
+};
+}
+
+#endif
diff --git a/dom/media/RTCStatsReport.jsm b/dom/media/RTCStatsReport.jsm
new file mode 100644
index 000000000..4612f3a54
--- /dev/null
+++ b/dom/media/RTCStatsReport.jsm
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = ["convertToRTCStatsReport"];
+
+function convertToRTCStatsReport(dict) {
+ function appendStats(stats, report) {
+ stats.forEach(function(stat) {
+ report[stat.id] = stat;
+ });
+ }
+ let report = {};
+ appendStats(dict.inboundRTPStreamStats, report);
+ appendStats(dict.outboundRTPStreamStats, report);
+ appendStats(dict.mediaStreamTrackStats, report);
+ appendStats(dict.mediaStreamStats, report);
+ appendStats(dict.transportStats, report);
+ appendStats(dict.iceComponentStats, report);
+ appendStats(dict.iceCandidatePairStats, report);
+ appendStats(dict.iceCandidateStats, report);
+ appendStats(dict.codecStats, report);
+ return report;
+}
+
+this.convertToRTCStatsReport = convertToRTCStatsReport;
diff --git a/dom/media/SeekJob.cpp b/dom/media/SeekJob.cpp
new file mode 100644
index 000000000..abacffea1
--- /dev/null
+++ b/dom/media/SeekJob.cpp
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SeekJob.h"
+
+namespace mozilla {
+
+SeekJob::SeekJob()
+{
+}
+
+SeekJob::SeekJob(SeekJob&& aOther) : mTarget(aOther.mTarget)
+{
+ aOther.mTarget.Reset();
+ mPromise = Move(aOther.mPromise);
+}
+
+SeekJob::~SeekJob()
+{
+ MOZ_DIAGNOSTIC_ASSERT(!mTarget.IsValid());
+ MOZ_DIAGNOSTIC_ASSERT(mPromise.IsEmpty());
+}
+
+SeekJob& SeekJob::operator=(SeekJob&& aOther)
+{
+ MOZ_DIAGNOSTIC_ASSERT(!Exists());
+ mTarget = aOther.mTarget;
+ aOther.mTarget.Reset();
+ mPromise = Move(aOther.mPromise);
+ return *this;
+}
+
+bool SeekJob::Exists() const
+{
+ MOZ_ASSERT(mTarget.IsValid() == !mPromise.IsEmpty());
+ return mTarget.IsValid();
+}
+
+void SeekJob::Resolve(bool aAtEnd, const char* aCallSite)
+{
+ MediaDecoder::SeekResolveValue val;
+ val.mAtEnd = aAtEnd;
+ mPromise.Resolve(val, aCallSite);
+ mTarget.Reset();
+}
+
+void SeekJob::RejectIfExists(const char* aCallSite)
+{
+ mTarget.Reset();
+ mPromise.RejectIfExists(true, aCallSite);
+}
+
+} // namespace mozilla
diff --git a/dom/media/SeekJob.h b/dom/media/SeekJob.h
new file mode 100644
index 000000000..de158591a
--- /dev/null
+++ b/dom/media/SeekJob.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef SEEK_JOB_H
+#define SEEK_JOB_H
+
+#include "mozilla/MozPromise.h"
+#include "MediaDecoder.h"
+#include "MediaDecoderReader.h"
+#include "SeekTarget.h"
+
+namespace mozilla {
+
+struct SeekJob {
+ SeekJob();
+
+ SeekJob(SeekJob&& aOther);
+
+ SeekJob& operator=(SeekJob&& aOther);
+
+ bool Exists() const;
+
+ void Resolve(bool aAtEnd, const char* aCallSite);
+
+ void RejectIfExists(const char* aCallSite);
+
+ ~SeekJob();
+
+ SeekTarget mTarget;
+ MozPromiseHolder<MediaDecoder::SeekPromise> mPromise;
+};
+
+} // namespace mozilla
+
+#endif /* SEEK_JOB_H */
diff --git a/dom/media/SeekTarget.h b/dom/media/SeekTarget.h
new file mode 100644
index 000000000..cb5cfd630
--- /dev/null
+++ b/dom/media/SeekTarget.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef SEEK_TARGET_H
+#define SEEK_TARGET_H
+
+#include "TimeUnits.h"
+
+namespace mozilla {
+
+enum class MediaDecoderEventVisibility : int8_t {
+ Observable,
+ Suppressed
+};
+
+// Stores the seek target; the time to seek to, and whether an Accurate,
+// "Fast" (nearest keyframe), or "Video Only" (no audio seek) seek was
+// requested.
+struct SeekTarget {
+ enum Type {
+ Invalid,
+ PrevSyncPoint,
+ Accurate,
+ NextFrame,
+ };
+ SeekTarget()
+ : mTime(media::TimeUnit::Invalid())
+ , mType(SeekTarget::Invalid)
+ , mVideoOnly(false)
+ {
+ }
+ SeekTarget(int64_t aTimeUsecs,
+ Type aType,
+ bool aVideoOnly = false)
+ : mTime(media::TimeUnit::FromMicroseconds(aTimeUsecs))
+ , mType(aType)
+ , mVideoOnly(aVideoOnly)
+ {
+ }
+ SeekTarget(const media::TimeUnit& aTime,
+ Type aType,
+ bool aVideoOnly = false)
+ : mTime(aTime)
+ , mType(aType)
+ , mVideoOnly(aVideoOnly)
+ {
+ }
+ SeekTarget(const SeekTarget& aOther)
+ : mTime(aOther.mTime)
+ , mType(aOther.mType)
+ , mVideoOnly(aOther.mVideoOnly)
+ {
+ }
+ bool IsValid() const {
+ return mType != SeekTarget::Invalid;
+ }
+ void Reset() {
+ mTime = media::TimeUnit::Invalid();
+ mType = SeekTarget::Invalid;
+ mVideoOnly = false;
+ }
+ media::TimeUnit GetTime() const {
+ NS_ASSERTION(mTime.IsValid(), "Invalid SeekTarget");
+ return mTime;
+ }
+ void SetTime(const media::TimeUnit& aTime) {
+ NS_ASSERTION(aTime.IsValid(), "Invalid SeekTarget destination");
+ mTime = aTime;
+ }
+ void SetType(Type aType) {
+ mType = aType;
+ }
+ void SetVideoOnly(bool aVideoOnly) {
+ mVideoOnly = aVideoOnly;
+ }
+ bool IsFast() const {
+ return mType == SeekTarget::Type::PrevSyncPoint;
+ }
+ bool IsAccurate() const {
+ return mType == SeekTarget::Type::Accurate;
+ }
+ bool IsNextFrame() const {
+ return mType == SeekTarget::Type::NextFrame;
+ }
+ bool IsVideoOnly() const {
+ return mVideoOnly;
+ }
+
+private:
+ // Seek target time.
+ media::TimeUnit mTime;
+ // Whether we should seek "Fast", or "Accurate".
+ // "Fast" seeks to the seek point preceding mTime, whereas
+ // "Accurate" seeks as close as possible to mTime.
+ Type mType;
+ bool mVideoOnly;
+};
+
+} // namespace mozilla
+
+#endif /* SEEK_TARGET_H */
diff --git a/dom/media/SeekTask.cpp b/dom/media/SeekTask.cpp
new file mode 100644
index 000000000..ee93033da
--- /dev/null
+++ b/dom/media/SeekTask.cpp
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SeekTask.h"
+#include "MediaDecoderReaderWrapper.h"
+#include "mozilla/AbstractThread.h"
+
+namespace mozilla {
+
+SeekTask::SeekTask(const void* aDecoderID,
+ AbstractThread* aThread,
+ MediaDecoderReaderWrapper* aReader,
+ const SeekTarget& aTarget)
+ : mDecoderID(aDecoderID)
+ , mOwnerThread(aThread)
+ , mReader(aReader)
+ , mTarget(aTarget)
+ , mIsDiscarded(false)
+ , mIsAudioQueueFinished(false)
+ , mIsVideoQueueFinished(false)
+{
+ AssertOwnerThread();
+}
+
+SeekTask::~SeekTask()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsDiscarded);
+}
+
+void
+SeekTask::Resolve(const char* aCallSite)
+{
+ AssertOwnerThread();
+
+ SeekTaskResolveValue val;
+ val.mSeekedAudioData = mSeekedAudioData;
+ val.mSeekedVideoData = mSeekedVideoData;
+ val.mIsAudioQueueFinished = mIsAudioQueueFinished;
+ val.mIsVideoQueueFinished = mIsVideoQueueFinished;
+
+ mSeekTaskPromise.Resolve(val, aCallSite);
+}
+
+void
+SeekTask::RejectIfExist(const MediaResult& aError, const char* aCallSite)
+{
+ AssertOwnerThread();
+
+ SeekTaskRejectValue val;
+ val.mIsAudioQueueFinished = mIsAudioQueueFinished;
+ val.mIsVideoQueueFinished = mIsVideoQueueFinished;
+ val.mError = aError;
+
+ mSeekTaskPromise.RejectIfExists(val, aCallSite);
+}
+
+void
+SeekTask::AssertOwnerThread() const
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+}
+
+AbstractThread*
+SeekTask::OwnerThread() const
+{
+ AssertOwnerThread();
+ return mOwnerThread;
+}
+
+const SeekTarget&
+SeekTask::GetSeekTarget()
+{
+ AssertOwnerThread();
+ return mTarget;
+}
+
+} // namespace mozilla
diff --git a/dom/media/SeekTask.h b/dom/media/SeekTask.h
new file mode 100644
index 000000000..e93e4bae3
--- /dev/null
+++ b/dom/media/SeekTask.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef SEEK_TASK_H
+#define SEEK_TASK_H
+
+#include "mozilla/MozPromise.h"
+#include "MediaResult.h"
+#include "SeekTarget.h"
+
+namespace mozilla {
+
+class AbstractThread;
+class MediaData;
+class MediaDecoderReaderWrapper;
+
+namespace media {
+class TimeUnit;
+}
+
+struct SeekTaskResolveValue
+{
+ RefPtr<MediaData> mSeekedAudioData;
+ RefPtr<MediaData> mSeekedVideoData;
+ bool mIsAudioQueueFinished;
+ bool mIsVideoQueueFinished;
+};
+
+struct SeekTaskRejectValue
+{
+ SeekTaskRejectValue()
+ : mIsAudioQueueFinished(false)
+ , mIsVideoQueueFinished(false)
+ , mError(NS_ERROR_DOM_MEDIA_FATAL_ERR)
+ {
+ }
+ bool mIsAudioQueueFinished;
+ bool mIsVideoQueueFinished;
+ MediaResult mError;
+};
+
+class SeekTask {
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SeekTask)
+
+public:
+ static const bool IsExclusive = true;
+
+ using SeekTaskPromise =
+ MozPromise<SeekTaskResolveValue, SeekTaskRejectValue, IsExclusive>;
+
+ virtual void Discard() = 0;
+
+ virtual RefPtr<SeekTaskPromise> Seek(const media::TimeUnit& aDuration) = 0;
+
+ virtual bool NeedToResetMDSM() const = 0;
+
+ const SeekTarget& GetSeekTarget();
+
+protected:
+ SeekTask(const void* aDecoderID,
+ AbstractThread* aThread,
+ MediaDecoderReaderWrapper* aReader,
+ const SeekTarget& aTarget);
+
+ virtual ~SeekTask();
+
+ void Resolve(const char* aCallSite);
+
+ void RejectIfExist(const MediaResult& aError, const char* aCallSite);
+
+ void AssertOwnerThread() const;
+
+ AbstractThread* OwnerThread() const;
+
+ /*
+ * Data shared with MDSM.
+ */
+ const void* mDecoderID; // For logging.
+ const RefPtr<AbstractThread> mOwnerThread;
+ const RefPtr<MediaDecoderReaderWrapper> mReader;
+
+ /*
+ * Internal state.
+ */
+ SeekTarget mTarget;
+ MozPromiseHolder<SeekTaskPromise> mSeekTaskPromise;
+ bool mIsDiscarded;
+
+ /*
+ * Information which are going to be returned to MDSM.
+ */
+ RefPtr<MediaData> mSeekedAudioData;
+ RefPtr<MediaData> mSeekedVideoData;
+ bool mIsAudioQueueFinished;
+ bool mIsVideoQueueFinished;
+};
+
+} // namespace mozilla
+
+#endif /* SEEK_TASK_H */
diff --git a/dom/media/SelfRef.h b/dom/media/SelfRef.h
new file mode 100644
index 000000000..ca9d0b749
--- /dev/null
+++ b/dom/media/SelfRef.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef SELF_REF_H
+#define SELF_REF_H
+
+#include "mozilla/Attributes.h"
+
+namespace mozilla {
+
+template<class T>
+class SelfReference {
+public:
+ SelfReference() : mHeld(false) {}
+ ~SelfReference()
+ {
+ NS_ASSERTION(!mHeld, "Forgot to drop the self reference?");
+ }
+
+ void Take(T* t)
+ {
+ if (!mHeld) {
+ mHeld = true;
+ t->AddRef();
+ }
+ }
+ void Drop(T* t)
+ {
+ if (mHeld) {
+ mHeld = false;
+ t->Release();
+ }
+ }
+
+ MOZ_IMPLICIT operator bool() const { return mHeld; }
+
+ SelfReference(const SelfReference& aOther) = delete;
+ void operator=(const SelfReference& aOther) = delete;
+private:
+ bool mHeld;
+};
+
+} // namespace mozilla
+
+#endif // SELF_REF_H
diff --git a/dom/media/SharedBuffer.h b/dom/media/SharedBuffer.h
new file mode 100644
index 000000000..dac31d8c8
--- /dev/null
+++ b/dom/media/SharedBuffer.h
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_SHAREDBUFFER_H_
+#define MOZILLA_SHAREDBUFFER_H_
+
+#include "mozilla/CheckedInt.h"
+#include "mozilla/mozalloc.h"
+#include "nsCOMPtr.h"
+
+namespace mozilla {
+
+class AudioBlockBuffer;
+
+/**
+ * Base class for objects with a thread-safe refcount and a virtual
+ * destructor.
+ */
+class ThreadSharedObject {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ThreadSharedObject)
+
+ bool IsShared() { return mRefCnt.get() > 1; }
+
+ virtual AudioBlockBuffer* AsAudioBlockBuffer() { return nullptr; };
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return 0;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~ThreadSharedObject() {}
+};
+
+/**
+ * Heap-allocated chunk of arbitrary data with threadsafe refcounting.
+ * Typically you would allocate one of these, fill it in, and then treat it as
+ * immutable while it's shared.
+ * This only guarantees 4-byte alignment of the data. For alignment we simply
+ * assume that the memory from malloc is at least 4-byte aligned and the
+ * refcount's size is large enough that SharedBuffer's size is divisible by 4.
+ */
+class SharedBuffer : public ThreadSharedObject {
+public:
+ void* Data() { return this + 1; }
+
+ static already_AddRefed<SharedBuffer> Create(size_t aSize)
+ {
+ CheckedInt<size_t> size = sizeof(SharedBuffer);
+ size += aSize;
+ if (!size.isValid()) {
+ MOZ_CRASH();
+ }
+ void* m = moz_xmalloc(size.value());
+ RefPtr<SharedBuffer> p = new (m) SharedBuffer();
+ NS_ASSERTION((reinterpret_cast<char*>(p.get() + 1) - reinterpret_cast<char*>(p.get())) % 4 == 0,
+ "SharedBuffers should be at least 4-byte aligned");
+ return p.forget();
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ SharedBuffer() {}
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_SHAREDBUFFER_H_ */
diff --git a/dom/media/SimpleImageBuffer.cpp b/dom/media/SimpleImageBuffer.cpp
new file mode 100644
index 000000000..e9b1ce22f
--- /dev/null
+++ b/dom/media/SimpleImageBuffer.cpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:set ts=4 sw=4 sts=4 ci et: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SimpleImageBuffer.h"
+#include "mozilla/NullPtr.h"
+
+namespace mozilla {
+
+void
+SimpleImageBuffer::SetImage(const unsigned char* frame, unsigned int size, int width, int height)
+{
+ mWidth = width;
+ mHeight = height;
+ if (!mBuffer || (size > mBufferSize)) {
+ if (mBuffer) {
+ delete[] mBuffer;
+ mBuffer = nullptr;
+ }
+ mBufferSize = size;
+ if (size > 0) {
+ mBuffer = new unsigned char[size];
+ }
+ }
+
+ if (mBuffer) {
+ if (frame && (size > 0)) {
+ memcpy((void *)mBuffer, (const void*)frame, size);
+ }
+ mSize = size;
+ }
+}
+
+void
+SimpleImageBuffer::Copy(const SimpleImageBuffer* aImage)
+{
+ if (aImage) {
+ SetImage(aImage->mBuffer, aImage->mSize, aImage->mWidth, aImage->mHeight);
+ }
+}
+
+const unsigned char*
+SimpleImageBuffer::GetImage(unsigned int* size) const
+{
+ if (size) {
+ *size = mSize;
+ }
+ return mBuffer;
+}
+
+} // namespace mozilla
diff --git a/dom/media/SimpleImageBuffer.h b/dom/media/SimpleImageBuffer.h
new file mode 100644
index 000000000..ef0e2753c
--- /dev/null
+++ b/dom/media/SimpleImageBuffer.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:set ts=4 sw=4 sts=4 ci et: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef simple_image_buffer_h
+#define simple_image_buffer_h
+
+#include "mozilla/NullPtr.h"
+#include "nsISupportsImpl.h"
+
+namespace mozilla {
+
+class SimpleImageBuffer {
+NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SimpleImageBuffer)
+public:
+ SimpleImageBuffer() : mBuffer(nullptr), mBufferSize(0), mSize(0), mWidth(0), mHeight(0) {}
+ void SetImage(const unsigned char* frame, unsigned int size, int width, int height);
+ void Copy(const SimpleImageBuffer* aImage);
+ const unsigned char* GetImage(unsigned int* size) const;
+ void GetWidthAndHeight(int* width, int* height) const
+ {
+ if (width) {
+ *width = mWidth;
+ }
+ if (height) {
+ *height = mHeight;
+ }
+ }
+
+protected:
+ ~SimpleImageBuffer()
+ {
+ delete[] mBuffer;
+ }
+ const unsigned char* mBuffer;
+ unsigned int mBufferSize;
+ unsigned int mSize;
+ int mWidth;
+ int mHeight;
+
+private:
+ SimpleImageBuffer(const SimpleImageBuffer& aImage);
+ SimpleImageBuffer& operator=(const SimpleImageBuffer& aImage);
+};
+
+} // namespace mozilla
+
+#endif // simple_image_buffer_h
diff --git a/dom/media/StreamTracks.cpp b/dom/media/StreamTracks.cpp
new file mode 100644
index 000000000..b05d14a12
--- /dev/null
+++ b/dom/media/StreamTracks.cpp
@@ -0,0 +1,117 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "StreamTracks.h"
+#include "mozilla/Logging.h"
+#include <algorithm>
+
+namespace mozilla {
+
+extern LazyLogModule gMediaStreamGraphLog;
+#define STREAM_LOG(type, msg) MOZ_LOG(gMediaStreamGraphLog, type, msg)
+
+#ifdef DEBUG
+void
+StreamTracks::DumpTrackInfo() const
+{
+ STREAM_LOG(LogLevel::Info, ("DumpTracks: mTracksKnownTime %lld", mTracksKnownTime));
+ for (uint32_t i = 0; i < mTracks.Length(); ++i) {
+ Track* track = mTracks[i];
+ if (track->IsEnded()) {
+ STREAM_LOG(LogLevel::Info, ("Track[%d] %d: ended", i, track->GetID()));
+ } else {
+ STREAM_LOG(LogLevel::Info, ("Track[%d] %d: %lld", i, track->GetID(),
+ track->GetEnd()));
+ }
+ }
+}
+#endif
+
+StreamTime
+StreamTracks::GetEnd() const
+{
+ StreamTime t = mTracksKnownTime;
+ for (uint32_t i = 0; i < mTracks.Length(); ++i) {
+ Track* track = mTracks[i];
+ if (!track->IsEnded()) {
+ t = std::min(t, track->GetEnd());
+ }
+ }
+ return t;
+}
+
+StreamTime
+StreamTracks::GetAllTracksEnd() const
+{
+ if (mTracksKnownTime < STREAM_TIME_MAX) {
+ // A track might be added.
+ return STREAM_TIME_MAX;
+ }
+ StreamTime t = 0;
+ for (uint32_t i = 0; i < mTracks.Length(); ++i) {
+ Track* track = mTracks[i];
+ if (!track->IsEnded()) {
+ return STREAM_TIME_MAX;
+ }
+ t = std::max(t, track->GetEnd());
+ }
+ return t;
+}
+
+StreamTracks::Track*
+StreamTracks::FindTrack(TrackID aID)
+{
+ if (aID == TRACK_NONE || mTracks.IsEmpty()) {
+ return nullptr;
+ }
+
+ // The tracks are sorted by ID. We can use a binary search.
+
+ uint32_t left = 0, right = mTracks.Length() - 1;
+ while (left <= right) {
+ uint32_t middle = (left + right) / 2;
+ if (mTracks[middle]->GetID() == aID) {
+ return mTracks[middle];
+ }
+
+ if (mTracks[middle]->GetID() > aID) {
+ if (middle == 0) {
+ break;
+ }
+
+ right = middle - 1;
+ } else {
+ left = middle + 1;
+ }
+ }
+
+ return nullptr;
+}
+
+void
+StreamTracks::ForgetUpTo(StreamTime aTime)
+{
+ // Only prune if there is a reasonable chunk (50ms @ 48kHz) to forget, so we
+ // don't spend too much time pruning segments.
+ const StreamTime minChunkSize = 2400;
+ if (aTime < mForgottenTime + minChunkSize) {
+ return;
+ }
+ mForgottenTime = aTime;
+
+ for (uint32_t i = 0; i < mTracks.Length(); ++i) {
+ Track* track = mTracks[i];
+ StreamTime forgetTo = std::min(track->GetEnd() - 1, aTime);
+ track->ForgetUpTo(forgetTo);
+ }
+}
+
+void
+StreamTracks::Clear()
+{
+ mTracks.Clear();
+}
+
+} // namespace mozilla
diff --git a/dom/media/StreamTracks.h b/dom/media/StreamTracks.h
new file mode 100644
index 000000000..0152c3bae
--- /dev/null
+++ b/dom/media/StreamTracks.h
@@ -0,0 +1,348 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_STREAMTRACKS_H_
+#define MOZILLA_STREAMTRACKS_H_
+
+#include "MediaSegment.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+
+/**
+ * Unique ID for track within a StreamTracks. Tracks from different
+ * StreamTrackss may have the same ID; this matters when appending StreamTrackss,
+ * since tracks with the same ID are matched. Only IDs greater than 0 are allowed.
+ */
+typedef int32_t TrackID;
+const TrackID TRACK_NONE = 0;
+const TrackID TRACK_INVALID = -1;
+const TrackID TRACK_ANY = -2;
+
+inline bool IsTrackIDExplicit(const TrackID& aId) {
+ return aId > TRACK_NONE;
+}
+
+inline TrackTicks RateConvertTicksRoundDown(TrackRate aOutRate,
+ TrackRate aInRate,
+ TrackTicks aTicks)
+{
+ NS_ASSERTION(0 < aOutRate && aOutRate <= TRACK_RATE_MAX, "Bad out rate");
+ NS_ASSERTION(0 < aInRate && aInRate <= TRACK_RATE_MAX, "Bad in rate");
+ NS_ASSERTION(0 <= aTicks && aTicks <= TRACK_TICKS_MAX, "Bad ticks");
+ return (aTicks * aOutRate) / aInRate;
+}
+inline TrackTicks RateConvertTicksRoundUp(TrackRate aOutRate,
+ TrackRate aInRate, TrackTicks aTicks)
+{
+ NS_ASSERTION(0 < aOutRate && aOutRate <= TRACK_RATE_MAX, "Bad out rate");
+ NS_ASSERTION(0 < aInRate && aInRate <= TRACK_RATE_MAX, "Bad in rate");
+ NS_ASSERTION(0 <= aTicks && aTicks <= TRACK_TICKS_MAX, "Bad ticks");
+ return (aTicks * aOutRate + aInRate - 1) / aInRate;
+}
+
+/**
+ * This object contains the decoded data for a stream's tracks.
+ * A StreamTracks can be appended to. Logically a StreamTracks only gets longer,
+ * but we also have the ability to "forget" data before a certain time that
+ * we know won't be used again. (We prune a whole number of seconds internally.)
+ *
+ * StreamTrackss should only be used from one thread at a time.
+ *
+ * A StreamTracks has a set of tracks that can be of arbitrary types ---
+ * the data for each track is a MediaSegment. The set of tracks can vary
+ * over the timeline of the StreamTracks.
+ */
+class StreamTracks
+{
+public:
+ /**
+ * Every track has a start time --- when it started in the StreamTracks.
+ * It has an end flag; when false, no end point is known; when true,
+ * the track ends when the data we have for the track runs out.
+ * Tracks have a unique ID assigned at creation. This allows us to identify
+ * the same track across StreamTrackss. A StreamTracks should never have
+ * two tracks with the same ID (even if they don't overlap in time).
+ * TODO Tracks can also be enabled and disabled over time.
+ * Takes ownership of aSegment.
+ */
+ class Track final
+ {
+ Track(TrackID aID, StreamTime aStart, MediaSegment* aSegment)
+ : mStart(aStart),
+ mSegment(aSegment),
+ mID(aID),
+ mEnded(false)
+ {
+ MOZ_COUNT_CTOR(Track);
+
+ NS_ASSERTION(aID > TRACK_NONE, "Bad track ID");
+ NS_ASSERTION(0 <= aStart && aStart <= aSegment->GetDuration(), "Bad start position");
+ }
+
+ public:
+ ~Track()
+ {
+ MOZ_COUNT_DTOR(Track);
+ }
+
+ template <class T> T* Get() const
+ {
+ if (mSegment->GetType() == T::StaticType()) {
+ return static_cast<T*>(mSegment.get());
+ }
+ return nullptr;
+ }
+
+ MediaSegment* GetSegment() const { return mSegment; }
+ TrackID GetID() const { return mID; }
+ bool IsEnded() const { return mEnded; }
+ StreamTime GetStart() const { return mStart; }
+ StreamTime GetEnd() const { return mSegment->GetDuration(); }
+ MediaSegment::Type GetType() const { return mSegment->GetType(); }
+
+ void SetEnded() { mEnded = true; }
+ void AppendFrom(Track* aTrack)
+ {
+ NS_ASSERTION(!mEnded, "Can't append to ended track");
+ NS_ASSERTION(aTrack->mID == mID, "IDs must match");
+ NS_ASSERTION(aTrack->mStart == 0, "Source track must start at zero");
+ NS_ASSERTION(aTrack->mSegment->GetType() == GetType(), "Track types must match");
+
+ mSegment->AppendFrom(aTrack->mSegment);
+ mEnded = aTrack->mEnded;
+ }
+ MediaSegment* RemoveSegment()
+ {
+ return mSegment.forget();
+ }
+ void ForgetUpTo(StreamTime aTime)
+ {
+ mSegment->ForgetUpTo(aTime);
+ }
+ void FlushAfter(StreamTime aNewEnd)
+ {
+ // Forget everything after a given endpoint
+ // a specified amount
+ mSegment->FlushAfter(aNewEnd);
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = aMallocSizeOf(this);
+ if (mSegment) {
+ amount += mSegment->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+ }
+
+ private:
+ friend class StreamTracks;
+
+ // Start offset is in ticks at rate mRate
+ StreamTime mStart;
+ // The segment data starts at the start of the owning StreamTracks, i.e.,
+ // there's mStart silence/no video at the beginning.
+ nsAutoPtr<MediaSegment> mSegment;
+ // Unique ID
+ TrackID mID;
+ // True when the track ends with the data in mSegment
+ bool mEnded;
+ };
+
+ class MOZ_STACK_CLASS CompareTracksByID final
+ {
+ public:
+ bool Equals(Track* aA, Track* aB) const {
+ return aA->GetID() == aB->GetID();
+ }
+ bool LessThan(Track* aA, Track* aB) const {
+ return aA->GetID() < aB->GetID();
+ }
+ };
+
+ StreamTracks()
+ : mGraphRate(0)
+ , mTracksKnownTime(0)
+ , mForgottenTime(0)
+ , mTracksDirty(false)
+#ifdef DEBUG
+ , mGraphRateIsSet(false)
+#endif
+ {
+ MOZ_COUNT_CTOR(StreamTracks);
+ }
+ ~StreamTracks()
+ {
+ MOZ_COUNT_DTOR(StreamTracks);
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = 0;
+ amount += mTracks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mTracks.Length(); i++) {
+ amount += mTracks[i]->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+ }
+
+ /**
+ * Initialize the graph rate for use in calculating StreamTimes from track
+ * ticks. Called when a MediaStream's graph pointer is initialized.
+ */
+ void InitGraphRate(TrackRate aGraphRate)
+ {
+ mGraphRate = aGraphRate;
+#if DEBUG
+ MOZ_ASSERT(!mGraphRateIsSet);
+ mGraphRateIsSet = true;
+#endif
+ }
+
+ TrackRate GraphRate() const
+ {
+ MOZ_ASSERT(mGraphRateIsSet);
+ return mGraphRate;
+ }
+
+ /**
+ * Takes ownership of aSegment. Don't do this while iterating, or while
+ * holding a Track reference.
+ * aSegment must have aStart worth of null data.
+ */
+ Track& AddTrack(TrackID aID, StreamTime aStart, MediaSegment* aSegment)
+ {
+ NS_ASSERTION(!FindTrack(aID), "Track with this ID already exists");
+
+ Track* track = new Track(aID, aStart, aSegment);
+ mTracks.InsertElementSorted(track, CompareTracksByID());
+ mTracksDirty = true;
+
+ if (mTracksKnownTime == STREAM_TIME_MAX) {
+ // There exists code like
+ // http://mxr.mozilla.org/mozilla-central/source/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp?rev=96b197deb91e&mark=1292-1297#1292
+ NS_WARNING("Adding track to StreamTracks that should have no more tracks");
+ } else {
+ NS_ASSERTION(mTracksKnownTime <= aStart, "Start time too early");
+ }
+ return *track;
+ }
+
+ void AdvanceKnownTracksTime(StreamTime aKnownTime)
+ {
+ NS_ASSERTION(aKnownTime >= mTracksKnownTime, "Can't move tracks-known time earlier");
+ mTracksKnownTime = aKnownTime;
+ }
+
+ /**
+ * The end time for the StreamTracks is the latest time for which we have
+ * data for all tracks that haven't ended by that time.
+ */
+ StreamTime GetEnd() const;
+
+ /**
+ * Returns the earliest time >= 0 at which all tracks have ended
+ * and all their data has been played out and no new tracks can be added,
+ * or STREAM_TIME_MAX if there is no such time.
+ */
+ StreamTime GetAllTracksEnd() const;
+
+#ifdef DEBUG
+ void DumpTrackInfo() const;
+#endif
+
+ Track* FindTrack(TrackID aID);
+
+ class MOZ_STACK_CLASS TrackIter final
+ {
+ public:
+ /**
+ * Iterate through the tracks of aBuffer in order of ID.
+ */
+ explicit TrackIter(const StreamTracks& aBuffer) :
+ mBuffer(&aBuffer.mTracks), mIndex(0), mMatchType(false) {}
+ /**
+ * Iterate through the tracks of aBuffer with type aType, in order of ID.
+ */
+ TrackIter(const StreamTracks& aBuffer, MediaSegment::Type aType) :
+ mBuffer(&aBuffer.mTracks), mIndex(0), mType(aType), mMatchType(true) { FindMatch(); }
+ bool IsEnded() { return mIndex >= mBuffer->Length(); }
+ void Next()
+ {
+ ++mIndex;
+ FindMatch();
+ }
+ Track* get() { return mBuffer->ElementAt(mIndex); }
+ Track& operator*() { return *mBuffer->ElementAt(mIndex); }
+ Track* operator->() { return mBuffer->ElementAt(mIndex); }
+ private:
+ void FindMatch()
+ {
+ if (!mMatchType)
+ return;
+ while (mIndex < mBuffer->Length() &&
+ mBuffer->ElementAt(mIndex)->GetType() != mType) {
+ ++mIndex;
+ }
+ }
+
+ const nsTArray<nsAutoPtr<Track> >* mBuffer;
+ uint32_t mIndex;
+ MediaSegment::Type mType;
+ bool mMatchType;
+ };
+ friend class TrackIter;
+
+ /**
+ * Forget stream data before aTime; they will no longer be needed.
+ * Also can forget entire tracks that have ended at or before aTime.
+ * Can't be used to forget beyond GetEnd().
+ */
+ void ForgetUpTo(StreamTime aTime);
+ /**
+ * Clears out all Tracks and the data they are holding.
+ * MediaStreamGraph calls this during forced shutdown.
+ */
+ void Clear();
+ /**
+ * Returns the latest time passed to ForgetUpTo.
+ */
+ StreamTime GetForgottenDuration()
+ {
+ return mForgottenTime;
+ }
+
+ bool GetAndResetTracksDirty()
+ {
+ if (!mTracksDirty) {
+ return false;
+ }
+
+ mTracksDirty = false;
+ return true;
+ }
+
+protected:
+ TrackRate mGraphRate; // StreamTime per second
+ // Any new tracks added will start at or after this time. In other words, the track
+ // list is complete and correct for all times less than this time.
+ StreamTime mTracksKnownTime;
+ StreamTime mForgottenTime;
+
+private:
+ // All known tracks for this StreamTracks
+ nsTArray<nsAutoPtr<Track>> mTracks;
+ bool mTracksDirty;
+
+#ifdef DEBUG
+ bool mGraphRateIsSet;
+#endif
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_STREAMTRACKS_H_ */
+
diff --git a/dom/media/TextTrack.cpp b/dom/media/TextTrack.cpp
new file mode 100644
index 000000000..0adff1920
--- /dev/null
+++ b/dom/media/TextTrack.cpp
@@ -0,0 +1,341 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/AsyncEventDispatcher.h"
+#include "mozilla/dom/TextTrack.h"
+#include "mozilla/dom/TextTrackBinding.h"
+#include "mozilla/dom/TextTrackList.h"
+#include "mozilla/dom/TextTrackCue.h"
+#include "mozilla/dom/TextTrackCueList.h"
+#include "mozilla/dom/TextTrackRegion.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/HTMLTrackElement.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrack,
+ DOMEventTargetHelper,
+ mCueList,
+ mActiveCueList,
+ mTextTrackList,
+ mTrackElement)
+
+NS_IMPL_ADDREF_INHERITED(TextTrack, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(TextTrack, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrack)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+TextTrack::TextTrack(nsPIDOMWindowInner* aOwnerWindow,
+ TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mKind(aKind)
+ , mLabel(aLabel)
+ , mLanguage(aLanguage)
+ , mMode(aMode)
+ , mReadyState(aReadyState)
+ , mTextTrackSource(aTextTrackSource)
+{
+ SetDefaultSettings();
+}
+
+TextTrack::TextTrack(nsPIDOMWindowInner* aOwnerWindow,
+ TextTrackList* aTextTrackList,
+ TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mTextTrackList(aTextTrackList)
+ , mKind(aKind)
+ , mLabel(aLabel)
+ , mLanguage(aLanguage)
+ , mMode(aMode)
+ , mReadyState(aReadyState)
+ , mTextTrackSource(aTextTrackSource)
+{
+ SetDefaultSettings();
+}
+
+TextTrack::~TextTrack()
+{
+}
+
+void
+TextTrack::SetDefaultSettings()
+{
+ nsPIDOMWindowInner* ownerWindow = GetOwner();
+ mCueList = new TextTrackCueList(ownerWindow);
+ mActiveCueList = new TextTrackCueList(ownerWindow);
+ mCuePos = 0;
+ mDirty = false;
+}
+
+JSObject*
+TextTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TextTrackBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+TextTrack::SetMode(TextTrackMode aValue)
+{
+ if (mMode != aValue) {
+ mMode = aValue;
+ if (aValue == TextTrackMode::Disabled) {
+ // Remove all the cues in MediaElement.
+ if (mTextTrackList) {
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (mediaElement) {
+ for (size_t i = 0; i < mCueList->Length(); ++i) {
+ mediaElement->NotifyCueRemoved(*(*mCueList)[i]);
+ }
+ }
+ }
+ SetCuesInactive();
+ } else {
+ // Add all the cues into MediaElement.
+ if (mTextTrackList) {
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (mediaElement) {
+ for (size_t i = 0; i < mCueList->Length(); ++i) {
+ mediaElement->NotifyCueAdded(*(*mCueList)[i]);
+ }
+ }
+ }
+ }
+ if (mTextTrackList) {
+ mTextTrackList->CreateAndDispatchChangeEvent();
+ }
+ // Ensure the TimeMarchesOn is called in case that the mCueList
+ // is empty.
+ NotifyCueUpdated(nullptr);
+ }
+}
+
+void
+TextTrack::GetId(nsAString& aId) const
+{
+ // If the track has a track element then its id should be the same as the
+ // track element's id.
+ if (mTrackElement) {
+ mTrackElement->GetAttribute(NS_LITERAL_STRING("id"), aId);
+ }
+}
+
+void
+TextTrack::AddCue(TextTrackCue& aCue)
+{
+ TextTrack* oldTextTrack = aCue.GetTrack();
+ if (oldTextTrack) {
+ ErrorResult dummy;
+ oldTextTrack->RemoveCue(aCue, dummy);
+ }
+ mCueList->AddCue(aCue);
+ aCue.SetTrack(this);
+ if (mTextTrackList) {
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (mediaElement && (mMode != TextTrackMode::Disabled)) {
+ mediaElement->NotifyCueAdded(aCue);
+ }
+ }
+ SetDirty();
+}
+
+void
+TextTrack::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv)
+{
+ // Bug1304948, check the aCue belongs to the TextTrack.
+ mCueList->RemoveCue(aCue, aRv);
+ if (aRv.Failed()) {
+ return;
+ }
+ aCue.SetActive(false);
+ aCue.SetTrack(nullptr);
+ if (mTextTrackList) {
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (mediaElement) {
+ mediaElement->NotifyCueRemoved(aCue);
+ }
+ }
+ SetDirty();
+}
+
+void
+TextTrack::SetCuesDirty()
+{
+ for (uint32_t i = 0; i < mCueList->Length(); i++) {
+ ((*mCueList)[i])->Reset();
+ }
+}
+
+void
+TextTrack::UpdateActiveCueList()
+{
+ if (!mTextTrackList) {
+ return;
+ }
+
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (!mediaElement) {
+ return;
+ }
+
+ // If we are dirty, i.e. an event happened that may cause the sorted mCueList
+ // to have changed like a seek or an insert for a cue, than we need to rebuild
+ // the active cue list from scratch.
+ if (mDirty) {
+ mCuePos = 0;
+ mDirty = false;
+ mActiveCueList->RemoveAll();
+ }
+
+ double playbackTime = mediaElement->CurrentTime();
+ // Remove all the cues from the active cue list whose end times now occur
+ // earlier then the current playback time.
+ for (uint32_t i = mActiveCueList->Length(); i > 0; i--) {
+ if ((*mActiveCueList)[i - 1]->EndTime() < playbackTime) {
+ mActiveCueList->RemoveCueAt(i - 1);
+ }
+ }
+ // Add all the cues, starting from the position of the last cue that was
+ // added, that have valid start and end times for the current playback time.
+ // We can stop iterating safely once we encounter a cue that does not have
+ // a valid start time as the cue list is sorted.
+ for (; mCuePos < mCueList->Length() &&
+ (*mCueList)[mCuePos]->StartTime() <= playbackTime; mCuePos++) {
+ if ((*mCueList)[mCuePos]->EndTime() >= playbackTime) {
+ mActiveCueList->AddCue(*(*mCueList)[mCuePos]);
+ }
+ }
+}
+
+TextTrackCueList*
+TextTrack::GetActiveCues() {
+ if (mMode != TextTrackMode::Disabled) {
+ return mActiveCueList;
+ }
+ return nullptr;
+}
+
+void
+TextTrack::GetActiveCueArray(nsTArray<RefPtr<TextTrackCue> >& aCues)
+{
+ if (mMode != TextTrackMode::Disabled) {
+ mActiveCueList->GetArray(aCues);
+ }
+}
+
+TextTrackReadyState
+TextTrack::ReadyState() const
+{
+ return mReadyState;
+}
+
+void
+TextTrack::SetReadyState(uint32_t aReadyState)
+{
+ if (aReadyState <= TextTrackReadyState::FailedToLoad) {
+ SetReadyState(static_cast<TextTrackReadyState>(aReadyState));
+ }
+}
+
+void
+TextTrack::SetReadyState(TextTrackReadyState aState)
+{
+ mReadyState = aState;
+
+ if (!mTextTrackList) {
+ return;
+ }
+
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (mediaElement && (mReadyState == TextTrackReadyState::Loaded||
+ mReadyState == TextTrackReadyState::FailedToLoad)) {
+ mediaElement->RemoveTextTrack(this, true);
+ }
+}
+
+TextTrackList*
+TextTrack::GetTextTrackList()
+{
+ return mTextTrackList;
+}
+
+void
+TextTrack::SetTextTrackList(TextTrackList* aTextTrackList)
+{
+ mTextTrackList = aTextTrackList;
+}
+
+HTMLTrackElement*
+TextTrack::GetTrackElement() {
+ return mTrackElement;
+}
+
+void
+TextTrack::SetTrackElement(HTMLTrackElement* aTrackElement) {
+ mTrackElement = aTrackElement;
+}
+
+void
+TextTrack::SetCuesInactive()
+{
+ mCueList->SetCuesInactive();
+}
+
+void
+TextTrack::NotifyCueUpdated(TextTrackCue *aCue)
+{
+ mCueList->NotifyCueUpdated(aCue);
+ if (mTextTrackList) {
+ HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement();
+ if (mediaElement) {
+ mediaElement->NotifyCueUpdated(aCue);
+ }
+ }
+ SetDirty();
+}
+
+void
+TextTrack::GetLabel(nsAString& aLabel) const
+{
+ if (mTrackElement) {
+ mTrackElement->GetLabel(aLabel);
+ } else {
+ aLabel = mLabel;
+ }
+}
+void
+TextTrack::GetLanguage(nsAString& aLanguage) const
+{
+ if (mTrackElement) {
+ mTrackElement->GetSrclang(aLanguage);
+ } else {
+ aLanguage = mLanguage;
+ }
+}
+
+void
+TextTrack::DispatchAsyncTrustedEvent(const nsString& aEventName)
+{
+ RefPtr<TextTrack> self = this;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([self, aEventName]() {
+ self->DispatchTrustedEvent(aEventName);
+ })
+ );
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/TextTrack.h b/dom/media/TextTrack.h
new file mode 100644
index 000000000..06b24da5d
--- /dev/null
+++ b/dom/media/TextTrack.h
@@ -0,0 +1,147 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TextTrack_h
+#define mozilla_dom_TextTrack_h
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/TextTrackBinding.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsString.h"
+
+namespace mozilla {
+namespace dom {
+
+class TextTrackList;
+class TextTrackCue;
+class TextTrackCueList;
+class HTMLTrackElement;
+
+enum TextTrackSource {
+ Track,
+ AddTextTrack,
+ MediaResourceSpecific
+};
+
+// Constants for numeric readyState property values.
+enum TextTrackReadyState {
+ NotLoaded = 0U,
+ Loading = 1U,
+ Loaded = 2U,
+ FailedToLoad = 3U
+};
+
+class TextTrack final : public DOMEventTargetHelper
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrack, DOMEventTargetHelper)
+
+ TextTrack(nsPIDOMWindowInner* aOwnerWindow,
+ TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource);
+ TextTrack(nsPIDOMWindowInner* aOwnerWindow,
+ TextTrackList* aTextTrackList,
+ TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource);
+
+ void SetDefaultSettings();
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ TextTrackKind Kind() const
+ {
+ return mKind;
+ }
+ void GetLabel(nsAString& aLabel) const;
+ void GetLanguage(nsAString& aLanguage) const;
+ void GetInBandMetadataTrackDispatchType(nsAString& aType) const
+ {
+ aType = mType;
+ }
+ void GetId(nsAString& aId) const;
+
+ TextTrackMode Mode() const
+ {
+ return mMode;
+ }
+ void SetMode(TextTrackMode aValue);
+
+ TextTrackCueList* GetCues() const
+ {
+ if (mMode == TextTrackMode::Disabled) {
+ return nullptr;
+ }
+ return mCueList;
+ }
+
+ TextTrackCueList* GetActiveCues();
+ void UpdateActiveCueList();
+ void GetActiveCueArray(nsTArray<RefPtr<TextTrackCue> >& aCues);
+
+ TextTrackReadyState ReadyState() const;
+ void SetReadyState(TextTrackReadyState aState);
+ void SetReadyState(uint32_t aReadyState);
+
+ void AddCue(TextTrackCue& aCue);
+ void RemoveCue(TextTrackCue& aCue, ErrorResult& aRv);
+ void SetDirty() { mDirty = true; }
+ void SetCuesDirty();
+
+ TextTrackList* GetTextTrackList();
+ void SetTextTrackList(TextTrackList* aTextTrackList);
+
+ IMPL_EVENT_HANDLER(cuechange)
+
+ HTMLTrackElement* GetTrackElement();
+ void SetTrackElement(HTMLTrackElement* aTrackElement);
+
+ TextTrackSource GetTextTrackSource() {
+ return mTextTrackSource;
+ }
+
+ void SetCuesInactive();
+
+ void NotifyCueUpdated(TextTrackCue *aCue);
+
+ void DispatchAsyncTrustedEvent(const nsString& aEventName);
+
+private:
+ ~TextTrack();
+
+ RefPtr<TextTrackList> mTextTrackList;
+
+ TextTrackKind mKind;
+ nsString mLabel;
+ nsString mLanguage;
+ nsString mType;
+ TextTrackMode mMode;
+
+ RefPtr<TextTrackCueList> mCueList;
+ RefPtr<TextTrackCueList> mActiveCueList;
+ RefPtr<HTMLTrackElement> mTrackElement;
+
+ uint32_t mCuePos;
+ TextTrackReadyState mReadyState;
+ bool mDirty;
+
+ // An enum that represents where the track was sourced from.
+ TextTrackSource mTextTrackSource;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TextTrack_h
diff --git a/dom/media/TextTrackCue.cpp b/dom/media/TextTrackCue.cpp
new file mode 100644
index 000000000..5ca70f84e
--- /dev/null
+++ b/dom/media/TextTrackCue.cpp
@@ -0,0 +1,256 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/HTMLTrackElement.h"
+#include "mozilla/dom/TextTrackCue.h"
+#include "mozilla/dom/TextTrackList.h"
+#include "mozilla/dom/TextTrackRegion.h"
+#include "nsComponentManagerUtils.h"
+#include "mozilla/ClearOnShutdown.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackCue,
+ DOMEventTargetHelper,
+ mDocument,
+ mTrack,
+ mTrackElement,
+ mDisplayState,
+ mRegion)
+
+NS_IMPL_ADDREF_INHERITED(TextTrackCue, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(TextTrackCue, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackCue)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+StaticRefPtr<nsIWebVTTParserWrapper> TextTrackCue::sParserWrapper;
+
+// Set cue setting defaults based on step 19 & seq.
+// in http://dev.w3.org/html5/webvtt/#parsing
+void
+TextTrackCue::SetDefaultCueSettings()
+{
+ mPositionIsAutoKeyword = true;
+ mPositionAlign = PositionAlignSetting::Center;
+ mSize = 100.0;
+ mPauseOnExit = false;
+ mSnapToLines = true;
+ mLineIsAutoKeyword = true;
+ mAlign = AlignSetting::Center;
+ mLineAlign = LineAlignSetting::Start;
+ mVertical = DirectionSetting::_empty;
+ mActive = false;
+}
+
+TextTrackCue::TextTrackCue(nsPIDOMWindowInner* aOwnerWindow,
+ double aStartTime,
+ double aEndTime,
+ const nsAString& aText,
+ ErrorResult& aRv)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mText(aText)
+ , mStartTime(aStartTime)
+ , mEndTime(aEndTime)
+ , mReset(false, "TextTrackCue::mReset")
+ , mHaveStartedWatcher(false)
+ , mWatchManager(this, AbstractThread::MainThread())
+{
+ SetDefaultCueSettings();
+ MOZ_ASSERT(aOwnerWindow);
+ if (NS_FAILED(StashDocument())) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ }
+}
+
+TextTrackCue::TextTrackCue(nsPIDOMWindowInner* aOwnerWindow,
+ double aStartTime,
+ double aEndTime,
+ const nsAString& aText,
+ HTMLTrackElement* aTrackElement,
+ ErrorResult& aRv)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mText(aText)
+ , mStartTime(aStartTime)
+ , mEndTime(aEndTime)
+ , mTrackElement(aTrackElement)
+ , mReset(false, "TextTrackCue::mReset")
+ , mHaveStartedWatcher(false)
+ , mWatchManager(this, AbstractThread::MainThread())
+{
+ SetDefaultCueSettings();
+ MOZ_ASSERT(aOwnerWindow);
+ if (NS_FAILED(StashDocument())) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ }
+}
+
+TextTrackCue::~TextTrackCue()
+{
+}
+
+/** Save a reference to our creating document so we don't have to
+ * keep getting it from our window.
+ */
+nsresult
+TextTrackCue::StashDocument()
+{
+ nsPIDOMWindowInner* window = GetOwner();
+ if (!window) {
+ return NS_ERROR_NO_INTERFACE;
+ }
+ mDocument = window->GetDoc();
+ if (!mDocument) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ return NS_OK;
+}
+
+already_AddRefed<DocumentFragment>
+TextTrackCue::GetCueAsHTML()
+{
+ // mDocument may be null during cycle collector shutdown.
+ // See bug 941701.
+ if (!mDocument) {
+ return nullptr;
+ }
+
+ if (!sParserWrapper) {
+ nsresult rv;
+ nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
+ do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv);
+ if (NS_FAILED(rv)) {
+ return mDocument->CreateDocumentFragment();
+ }
+ sParserWrapper = parserWrapper;
+ ClearOnShutdown(&sParserWrapper);
+ }
+
+ nsPIDOMWindowInner* window = mDocument->GetInnerWindow();
+ if (!window) {
+ return mDocument->CreateDocumentFragment();
+ }
+
+ nsCOMPtr<nsIDOMHTMLElement> div;
+ sParserWrapper->ConvertCueToDOMTree(window, this,
+ getter_AddRefs(div));
+ if (!div) {
+ return mDocument->CreateDocumentFragment();
+ }
+ RefPtr<DocumentFragment> docFrag = mDocument->CreateDocumentFragment();
+ nsCOMPtr<nsIDOMNode> throwAway;
+ docFrag->AppendChild(div, getter_AddRefs(throwAway));
+
+ return docFrag.forget();
+}
+
+void
+TextTrackCue::SetTrackElement(HTMLTrackElement* aTrackElement)
+{
+ mTrackElement = aTrackElement;
+}
+
+JSObject*
+TextTrackCue::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return VTTCueBinding::Wrap(aCx, this, aGivenProto);
+}
+
+TextTrackRegion*
+TextTrackCue::GetRegion()
+{
+ return mRegion;
+}
+
+void
+TextTrackCue::SetRegion(TextTrackRegion* aRegion)
+{
+ if (mRegion == aRegion) {
+ return;
+ }
+ mRegion = aRegion;
+ mReset = true;
+}
+
+double
+TextTrackCue::ComputedLine()
+{
+ // See spec https://w3c.github.io/webvtt/#cue-computed-line
+ if (!mLineIsAutoKeyword && !mSnapToLines &&
+ (mLine < 0.0 || mLine > 100.0)) {
+ return 100.0;
+ } else if (!mLineIsAutoKeyword) {
+ return mLine;
+ } else if (mLineIsAutoKeyword && !mSnapToLines) {
+ return 100.0;
+ } else if (!mTrack ||
+ !mTrack->GetTextTrackList() ||
+ !mTrack->GetTextTrackList()->GetMediaElement()) {
+ return -1.0;
+ }
+
+ RefPtr<TextTrackList> trackList = mTrack->GetTextTrackList();
+ bool dummy;
+ uint32_t showingTracksNum = 0;
+ for (uint32_t idx = 0; idx < trackList->Length(); idx++) {
+ RefPtr<TextTrack> track = trackList->IndexedGetter(idx, dummy);
+ if (track->Mode() == TextTrackMode::Showing) {
+ showingTracksNum++;
+ }
+
+ if (mTrack == track) {
+ break;
+ }
+ }
+
+ return (-1.0) * showingTracksNum;
+}
+
+double
+TextTrackCue::ComputedPosition()
+{
+ // See spec https://w3c.github.io/webvtt/#cue-computed-position
+ if (!mPositionIsAutoKeyword) {
+ return mPosition;
+ } else if (mAlign == AlignSetting::Left) {
+ return 0.0;
+ } else if (mAlign == AlignSetting::Right) {
+ return 100.0;
+ }
+ return 50.0;
+}
+
+PositionAlignSetting
+TextTrackCue::ComputedPositionAlign()
+{
+ // See spec https://w3c.github.io/webvtt/#cue-computed-position-alignment
+ if (mPositionAlign != PositionAlignSetting::Auto) {
+ return mPositionAlign;
+ } else if (mAlign == AlignSetting::Left) {
+ return PositionAlignSetting::Line_left;
+ } else if (mAlign == AlignSetting::Right) {
+ return PositionAlignSetting::Line_right;
+ }
+ return PositionAlignSetting::Center;
+}
+
+void
+TextTrackCue::NotifyDisplayStatesChanged()
+{
+ if (!mReset) {
+ return;
+ }
+
+ if (!mTrack ||
+ !mTrack->GetTextTrackList() ||
+ !mTrack->GetTextTrackList()->GetMediaElement()) {
+ return;
+ }
+
+ mTrack->GetTextTrackList()->GetMediaElement()->NotifyCueDisplayStatesChanged();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/TextTrackCue.h b/dom/media/TextTrackCue.h
new file mode 100644
index 000000000..9c19c70b1
--- /dev/null
+++ b/dom/media/TextTrackCue.h
@@ -0,0 +1,418 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TextTrackCue_h
+#define mozilla_dom_TextTrackCue_h
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/DocumentFragment.h"
+#include "mozilla/dom/VTTCueBinding.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsIWebVTTParserWrapper.h"
+#include "mozilla/StaticPtr.h"
+#include "nsIDocument.h"
+#include "mozilla/dom/HTMLDivElement.h"
+#include "mozilla/dom/TextTrack.h"
+#include "mozilla/StateWatching.h"
+
+namespace mozilla {
+namespace dom {
+
+class HTMLTrackElement;
+class TextTrackRegion;
+
+class TextTrackCue final : public DOMEventTargetHelper
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackCue, DOMEventTargetHelper)
+
+ // TextTrackCue WebIDL
+ // See bug 868509 about splitting out the WebVTT-specific interfaces.
+ static already_AddRefed<TextTrackCue>
+ Constructor(GlobalObject& aGlobal,
+ double aStartTime,
+ double aEndTime,
+ const nsAString& aText,
+ ErrorResult& aRv)
+ {
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ RefPtr<TextTrackCue> ttcue = new TextTrackCue(window, aStartTime,
+ aEndTime, aText, aRv);
+ return ttcue.forget();
+ }
+ TextTrackCue(nsPIDOMWindowInner* aGlobal, double aStartTime, double aEndTime,
+ const nsAString& aText, ErrorResult& aRv);
+
+ TextTrackCue(nsPIDOMWindowInner* aGlobal, double aStartTime, double aEndTime,
+ const nsAString& aText, HTMLTrackElement* aTrackElement,
+ ErrorResult& aRv);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ TextTrack* GetTrack() const
+ {
+ return mTrack;
+ }
+
+ void GetId(nsAString& aId) const
+ {
+ aId = mId;
+ }
+
+ void SetId(const nsAString& aId)
+ {
+ if (mId == aId) {
+ return;
+ }
+
+ mId = aId;
+ }
+
+ double StartTime() const
+ {
+ return mStartTime;
+ }
+
+ void SetStartTime(double aStartTime)
+ {
+ if (mStartTime == aStartTime) {
+ return;
+ }
+
+ mStartTime = aStartTime;
+ mReset = true;
+ NotifyCueUpdated(this);
+ }
+
+ double EndTime() const
+ {
+ return mEndTime;
+ }
+
+ void SetEndTime(double aEndTime)
+ {
+ if (mEndTime == aEndTime) {
+ return;
+ }
+
+ mEndTime = aEndTime;
+ mReset = true;
+ NotifyCueUpdated(this);
+ }
+
+ bool PauseOnExit()
+ {
+ return mPauseOnExit;
+ }
+
+ void SetPauseOnExit(bool aPauseOnExit)
+ {
+ if (mPauseOnExit == aPauseOnExit) {
+ return;
+ }
+
+ mPauseOnExit = aPauseOnExit;
+ NotifyCueUpdated(nullptr);
+ }
+
+ TextTrackRegion* GetRegion();
+ void SetRegion(TextTrackRegion* aRegion);
+
+ DirectionSetting Vertical() const
+ {
+ return mVertical;
+ }
+
+ void SetVertical(const DirectionSetting& aVertical)
+ {
+ if (mVertical == aVertical) {
+ return;
+ }
+
+ mReset = true;
+ mVertical = aVertical;
+ }
+
+ bool SnapToLines()
+ {
+ return mSnapToLines;
+ }
+
+ void SetSnapToLines(bool aSnapToLines)
+ {
+ if (mSnapToLines == aSnapToLines) {
+ return;
+ }
+
+ mReset = true;
+ mSnapToLines = aSnapToLines;
+ }
+
+ void GetLine(OwningDoubleOrAutoKeyword& aLine) const
+ {
+ if (mLineIsAutoKeyword) {
+ aLine.SetAsAutoKeyword() = AutoKeyword::Auto;
+ return;
+ }
+ aLine.SetAsDouble() = mLine;
+ }
+
+ void SetLine(const DoubleOrAutoKeyword& aLine)
+ {
+ if (aLine.IsDouble() &&
+ (mLineIsAutoKeyword || (aLine.GetAsDouble() != mLine))) {
+ mLineIsAutoKeyword = false;
+ mLine = aLine.GetAsDouble();
+ mReset = true;
+ return;
+ }
+ if (aLine.IsAutoKeyword() && !mLineIsAutoKeyword) {
+ mLineIsAutoKeyword = true;
+ mReset = true;
+ }
+ }
+
+ LineAlignSetting LineAlign() const
+ {
+ return mLineAlign;
+ }
+
+ void SetLineAlign(LineAlignSetting& aLineAlign, ErrorResult& aRv)
+ {
+ if (mLineAlign == aLineAlign) {
+ return;
+ }
+
+ mReset = true;
+ mLineAlign = aLineAlign;
+ }
+
+ void GetPosition(OwningDoubleOrAutoKeyword& aPosition) const
+ {
+ if (mPositionIsAutoKeyword) {
+ aPosition.SetAsAutoKeyword() = AutoKeyword::Auto;
+ return;
+ }
+ aPosition.SetAsDouble() = mPosition;
+ }
+
+ void SetPosition(const DoubleOrAutoKeyword& aPosition, ErrorResult& aRv)
+ {
+ if (!aPosition.IsAutoKeyword() &&
+ (aPosition.GetAsDouble() > 100.0 || aPosition.GetAsDouble() < 0.0)){
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ if (aPosition.IsDouble() &&
+ (mPositionIsAutoKeyword || (aPosition.GetAsDouble() != mPosition))) {
+ mPositionIsAutoKeyword = false;
+ mPosition = aPosition.GetAsDouble();
+ mReset = true;
+ return;
+ }
+
+ if (aPosition.IsAutoKeyword() && !mPositionIsAutoKeyword) {
+ mPositionIsAutoKeyword = true;
+ mReset = true;
+ }
+ }
+
+ PositionAlignSetting PositionAlign() const
+ {
+ return mPositionAlign;
+ }
+
+ void SetPositionAlign(PositionAlignSetting aPositionAlign, ErrorResult& aRv)
+ {
+ if (mPositionAlign == aPositionAlign) {
+ return;
+ }
+
+ mReset = true;
+ mPositionAlign = aPositionAlign;
+ }
+
+ double Size() const
+ {
+ return mSize;
+ }
+
+ void SetSize(double aSize, ErrorResult& aRv)
+ {
+ if (mSize == aSize) {
+ return;
+ }
+
+ if (aSize < 0.0 || aSize > 100.0) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ mReset = true;
+ mSize = aSize;
+ }
+
+ AlignSetting Align() const
+ {
+ return mAlign;
+ }
+
+ void SetAlign(AlignSetting& aAlign)
+ {
+ if (mAlign == aAlign) {
+ return;
+ }
+
+ mReset = true;
+ mAlign = aAlign;
+ }
+
+ void GetText(nsAString& aText) const
+ {
+ aText = mText;
+ }
+
+ void SetText(const nsAString& aText)
+ {
+ if (mText == aText) {
+ return;
+ }
+
+ mReset = true;
+ mText = aText;
+ }
+
+ IMPL_EVENT_HANDLER(enter)
+ IMPL_EVENT_HANDLER(exit)
+
+ HTMLDivElement* GetDisplayState()
+ {
+ return static_cast<HTMLDivElement*>(mDisplayState.get());
+ }
+
+ void SetDisplayState(HTMLDivElement* aDisplayState)
+ {
+ mDisplayState = aDisplayState;
+ mReset = false;
+ }
+
+ void Reset()
+ {
+ mReset = true;
+ }
+
+ bool HasBeenReset()
+ {
+ return mReset;
+ }
+
+ double ComputedLine();
+ double ComputedPosition();
+ PositionAlignSetting ComputedPositionAlign();
+
+ // Helper functions for implementation.
+ const nsAString& Id() const
+ {
+ return mId;
+ }
+
+ void SetTrack(TextTrack* aTextTrack)
+ {
+ mTrack = aTextTrack;
+ if (!mHaveStartedWatcher && aTextTrack) {
+ mHaveStartedWatcher = true;
+ mWatchManager.Watch(mReset, &TextTrackCue::NotifyDisplayStatesChanged);
+ } else if (mHaveStartedWatcher && !aTextTrack) {
+ mHaveStartedWatcher = false;
+ mWatchManager.Unwatch(mReset, &TextTrackCue::NotifyDisplayStatesChanged);
+ }
+ }
+
+ /**
+ * Produces a tree of anonymous content based on the tree of the processed
+ * cue text.
+ *
+ * Returns a DocumentFragment that is the head of the tree of anonymous
+ * content.
+ */
+ already_AddRefed<DocumentFragment> GetCueAsHTML();
+
+ void SetTrackElement(HTMLTrackElement* aTrackElement);
+
+ void SetActive(bool aActive)
+ {
+ if (mActive == aActive) {
+ return;
+ }
+
+ mActive = aActive;
+ mDisplayState = mActive ? mDisplayState : nullptr;
+ }
+
+ bool GetActive()
+ {
+ return mActive;
+ }
+
+private:
+ ~TextTrackCue();
+
+ void NotifyCueUpdated(TextTrackCue* aCue)
+ {
+ if (mTrack) {
+ mTrack->NotifyCueUpdated(aCue);
+ }
+ }
+
+ void NotifyDisplayStatesChanged();
+
+ void SetDefaultCueSettings();
+ nsresult StashDocument();
+
+ RefPtr<nsIDocument> mDocument;
+ nsString mText;
+ double mStartTime;
+ double mEndTime;
+
+ RefPtr<TextTrack> mTrack;
+ RefPtr<HTMLTrackElement> mTrackElement;
+ nsString mId;
+ MOZ_INIT_OUTSIDE_CTOR double mPosition;
+ bool mPositionIsAutoKeyword;
+ PositionAlignSetting mPositionAlign;
+ double mSize;
+ bool mPauseOnExit;
+ bool mSnapToLines;
+ RefPtr<TextTrackRegion> mRegion;
+ DirectionSetting mVertical;
+ bool mLineIsAutoKeyword;
+ MOZ_INIT_OUTSIDE_CTOR double mLine;
+ AlignSetting mAlign;
+ LineAlignSetting mLineAlign;
+
+ // Holds the computed DOM elements that represent the parsed cue text.
+ // http://www.whatwg.org/specs/web-apps/current-work/#text-track-cue-display-state
+ RefPtr<nsGenericHTMLElement> mDisplayState;
+ // Tells whether or not we need to recompute mDisplayState. This is set
+ // anytime a property that relates to the display of the TextTrackCue is
+ // changed.
+ Watchable<bool> mReset;
+
+ bool mActive;
+
+ static StaticRefPtr<nsIWebVTTParserWrapper> sParserWrapper;
+
+ // Only start watcher after the cue has text track.
+ bool mHaveStartedWatcher;
+ WatchManager<TextTrackCue> mWatchManager;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TextTrackCue_h
diff --git a/dom/media/TextTrackCueList.cpp b/dom/media/TextTrackCueList.cpp
new file mode 100644
index 000000000..3e67472d5
--- /dev/null
+++ b/dom/media/TextTrackCueList.cpp
@@ -0,0 +1,173 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TextTrackCueList.h"
+#include "mozilla/dom/TextTrackCueListBinding.h"
+#include "mozilla/dom/TextTrackCue.h"
+
+namespace mozilla {
+namespace dom {
+
+class CompareCuesByTime
+{
+public:
+ bool Equals(TextTrackCue* aOne, TextTrackCue* aTwo) const {
+ return false;
+ }
+ bool LessThan(TextTrackCue* aOne, TextTrackCue* aTwo) const {
+ return aOne->StartTime() < aTwo->StartTime() ||
+ (aOne->StartTime() == aTwo->StartTime() &&
+ aOne->EndTime() >= aTwo->EndTime());
+ }
+};
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TextTrackCueList, mParent, mList)
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TextTrackCueList)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TextTrackCueList)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextTrackCueList)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+TextTrackCueList::TextTrackCueList(nsISupports* aParent) : mParent(aParent)
+{
+}
+
+TextTrackCueList::~TextTrackCueList()
+{}
+
+JSObject*
+TextTrackCueList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TextTrackCueListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+TextTrackCue*
+TextTrackCueList::IndexedGetter(uint32_t aIndex, bool& aFound)
+{
+ aFound = aIndex < mList.Length();
+ if (!aFound) {
+ return nullptr;
+ }
+ return mList[aIndex];
+}
+
+TextTrackCue*
+TextTrackCueList::operator[](uint32_t aIndex)
+{
+ return mList.SafeElementAt(aIndex, nullptr);
+}
+
+TextTrackCueList&
+TextTrackCueList::operator=(const TextTrackCueList& aOther)
+{
+ mList = aOther.mList;
+ return *this;
+}
+
+TextTrackCue*
+TextTrackCueList::GetCueById(const nsAString& aId)
+{
+ if (aId.IsEmpty()) {
+ return nullptr;
+ }
+
+ for (uint32_t i = 0; i < mList.Length(); i++) {
+ if (aId.Equals(mList[i]->Id())) {
+ return mList[i];
+ }
+ }
+ return nullptr;
+}
+
+void
+TextTrackCueList::AddCue(TextTrackCue& aCue)
+{
+ if (mList.Contains(&aCue)) {
+ return;
+ }
+ mList.InsertElementSorted(&aCue, CompareCuesByTime());
+}
+
+void
+TextTrackCueList::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv)
+{
+ if (!mList.Contains(&aCue)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
+ return;
+ }
+ mList.RemoveElement(&aCue);
+}
+
+void
+TextTrackCueList::RemoveCue(TextTrackCue& aCue)
+{
+ mList.RemoveElement(&aCue);
+}
+
+void
+TextTrackCueList::RemoveCueAt(uint32_t aIndex)
+{
+ if (aIndex < mList.Length()) {
+ mList.RemoveElementAt(aIndex);
+ }
+}
+
+void
+TextTrackCueList::RemoveAll()
+{
+ mList.Clear();
+}
+
+void
+TextTrackCueList::GetArray(nsTArray<RefPtr<TextTrackCue> >& aCues)
+{
+ aCues = nsTArray<RefPtr<TextTrackCue> >(mList);
+}
+
+
+void
+TextTrackCueList::SetCuesInactive()
+{
+ for(uint32_t i = 0; i < mList.Length(); ++i) {
+ mList[i]->SetActive(false);
+ }
+}
+
+already_AddRefed<TextTrackCueList>
+TextTrackCueList::GetCueListByTimeInterval(media::Interval<double>& aInterval)
+{
+ RefPtr<TextTrackCueList> output = new TextTrackCueList(mParent);
+ for (uint32_t i = 0; i < mList.Length(); ++i) {
+ TextTrackCue* cue = mList[i];
+ if (cue->StartTime() <= aInterval.mEnd &&
+ aInterval.mStart <= cue->EndTime()) {
+ output->AddCue(*cue);
+ }
+ }
+ return output.forget();
+}
+
+void
+TextTrackCueList::NotifyCueUpdated(TextTrackCue *aCue)
+{
+ if (aCue) {
+ mList.RemoveElement(aCue);
+ mList.InsertElementSorted(aCue, CompareCuesByTime());
+ }
+}
+
+bool
+TextTrackCueList::IsCueExist(TextTrackCue *aCue)
+{
+ if (aCue && mList.Contains(aCue)) {
+ return true;
+ }
+ return false;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/TextTrackCueList.h b/dom/media/TextTrackCueList.h
new file mode 100644
index 000000000..ae33ea24b
--- /dev/null
+++ b/dom/media/TextTrackCueList.h
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TextTrackCueList_h
+#define mozilla_dom_TextTrackCueList_h
+
+#include "nsTArray.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "mozilla/ErrorResult.h"
+#include "Intervals.h"
+
+namespace mozilla {
+namespace dom {
+
+class TextTrackCue;
+
+class TextTrackCueList final : public nsISupports
+ , public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TextTrackCueList)
+
+ // TextTrackCueList WebIDL
+ explicit TextTrackCueList(nsISupports* aParent);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ nsISupports* GetParentObject() const
+ {
+ return mParent;
+ }
+
+ uint32_t Length() const
+ {
+ return mList.Length();
+ }
+
+ bool IsEmpty() const
+ {
+ return mList.Length() == 0;
+ }
+
+ TextTrackCue* IndexedGetter(uint32_t aIndex, bool& aFound);
+ TextTrackCue* operator[](uint32_t aIndex);
+ TextTrackCue* GetCueById(const nsAString& aId);
+ TextTrackCueList& operator=(const TextTrackCueList& aOther);
+ // Adds a cue to mList by performing an insertion sort on mList.
+ // We expect most files to already be sorted, so an insertion sort starting
+ // from the end of the current array should be more efficient than a general
+ // sort step after all cues are loaded.
+ void AddCue(TextTrackCue& aCue);
+ void RemoveCue(TextTrackCue& aCue);
+ void RemoveCue(TextTrackCue& aCue, ErrorResult& aRv);
+ void RemoveCueAt(uint32_t aIndex);
+ void RemoveAll();
+ void GetArray(nsTArray<RefPtr<TextTrackCue> >& aCues);
+
+ void SetCuesInactive();
+
+ already_AddRefed<TextTrackCueList>
+ GetCueListByTimeInterval(media::Interval<double>& aInterval);
+ void NotifyCueUpdated(TextTrackCue *aCue);
+ bool IsCueExist(TextTrackCue *aCue);
+
+private:
+ ~TextTrackCueList();
+
+ nsCOMPtr<nsISupports> mParent;
+
+ // A sorted list of TextTrackCues sorted by earliest start time. If the start
+ // times are equal then it will be sorted by end time, earliest first.
+ nsTArray< RefPtr<TextTrackCue> > mList;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TextTrackCueList_h
diff --git a/dom/media/TextTrackList.cpp b/dom/media/TextTrackList.cpp
new file mode 100644
index 000000000..e557d97f5
--- /dev/null
+++ b/dom/media/TextTrackList.cpp
@@ -0,0 +1,236 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TextTrackList.h"
+#include "mozilla/dom/TextTrackListBinding.h"
+#include "mozilla/dom/TrackEvent.h"
+#include "nsThreadUtils.h"
+#include "mozilla/dom/TextTrackCue.h"
+#include "mozilla/dom/TextTrackManager.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackList,
+ DOMEventTargetHelper,
+ mTextTracks,
+ mTextTrackManager)
+
+NS_IMPL_ADDREF_INHERITED(TextTrackList, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(TextTrackList, DOMEventTargetHelper)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackList)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+TextTrackList::TextTrackList(nsPIDOMWindowInner* aOwnerWindow)
+ : DOMEventTargetHelper(aOwnerWindow)
+{
+}
+
+TextTrackList::TextTrackList(nsPIDOMWindowInner* aOwnerWindow,
+ TextTrackManager* aTextTrackManager)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mTextTrackManager(aTextTrackManager)
+{
+}
+
+TextTrackList::~TextTrackList()
+{
+}
+
+void
+TextTrackList::GetShowingCues(nsTArray<RefPtr<TextTrackCue> >& aCues)
+{
+ nsTArray< RefPtr<TextTrackCue> > cues;
+ for (uint32_t i = 0; i < Length(); i++) {
+ if (mTextTracks[i]->Mode() == TextTrackMode::Showing) {
+ mTextTracks[i]->GetActiveCueArray(cues);
+ aCues.AppendElements(cues);
+ }
+ }
+}
+
+JSObject*
+TextTrackList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return TextTrackListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+TextTrack*
+TextTrackList::IndexedGetter(uint32_t aIndex, bool& aFound)
+{
+ aFound = aIndex < mTextTracks.Length();
+ if (!aFound) {
+ return nullptr;
+ }
+ return mTextTracks[aIndex];
+}
+
+TextTrack*
+TextTrackList::operator[](uint32_t aIndex)
+{
+ return mTextTracks.SafeElementAt(aIndex, nullptr);
+}
+
+already_AddRefed<TextTrack>
+TextTrackList::AddTextTrack(TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource,
+ const CompareTextTracks& aCompareTT)
+{
+ RefPtr<TextTrack> track = new TextTrack(GetOwner(), this, aKind, aLabel,
+ aLanguage, aMode, aReadyState,
+ aTextTrackSource);
+ AddTextTrack(track, aCompareTT);
+ return track.forget();
+}
+
+void
+TextTrackList::AddTextTrack(TextTrack* aTextTrack,
+ const CompareTextTracks& aCompareTT)
+{
+ if (mTextTracks.Contains(aTextTrack)) {
+ return;
+ }
+ if (mTextTracks.InsertElementSorted(aTextTrack, aCompareTT)) {
+ aTextTrack->SetTextTrackList(this);
+ CreateAndDispatchTrackEventRunner(aTextTrack, NS_LITERAL_STRING("addtrack"));
+ }
+}
+
+TextTrack*
+TextTrackList::GetTrackById(const nsAString& aId)
+{
+ nsAutoString id;
+ for (uint32_t i = 0; i < Length(); i++) {
+ mTextTracks[i]->GetId(id);
+ if (aId.Equals(id)) {
+ return mTextTracks[i];
+ }
+ }
+ return nullptr;
+}
+
+void
+TextTrackList::RemoveTextTrack(TextTrack* aTrack)
+{
+ if (mTextTracks.RemoveElement(aTrack)) {
+ CreateAndDispatchTrackEventRunner(aTrack, NS_LITERAL_STRING("removetrack"));
+ }
+}
+
+void
+TextTrackList::DidSeek()
+{
+ for (uint32_t i = 0; i < mTextTracks.Length(); i++) {
+ mTextTracks[i]->SetDirty();
+ }
+}
+
+class TrackEventRunner : public Runnable
+{
+public:
+ TrackEventRunner(TextTrackList* aList, nsIDOMEvent* aEvent)
+ : mList(aList)
+ , mEvent(aEvent)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ return mList->DispatchTrackEvent(mEvent);
+ }
+
+ RefPtr<TextTrackList> mList;
+private:
+ RefPtr<nsIDOMEvent> mEvent;
+};
+
+class ChangeEventRunner final : public TrackEventRunner
+{
+public:
+ ChangeEventRunner(TextTrackList* aList, nsIDOMEvent* aEvent)
+ : TrackEventRunner(aList, aEvent)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ mList->mPendingTextTrackChange = false;
+ return TrackEventRunner::Run();
+ }
+};
+
+nsresult
+TextTrackList::DispatchTrackEvent(nsIDOMEvent* aEvent)
+{
+ return DispatchTrustedEvent(aEvent);
+}
+
+void
+TextTrackList::CreateAndDispatchChangeEvent()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!mPendingTextTrackChange) {
+ mPendingTextTrackChange = true;
+ RefPtr<Event> event = NS_NewDOMEvent(this, nullptr, nullptr);
+
+ event->InitEvent(NS_LITERAL_STRING("change"), false, false);
+ event->SetTrusted(true);
+
+ nsCOMPtr<nsIRunnable> eventRunner = new ChangeEventRunner(this, event);
+ NS_DispatchToMainThread(eventRunner);
+ }
+}
+
+void
+TextTrackList::CreateAndDispatchTrackEventRunner(TextTrack* aTrack,
+ const nsAString& aEventName)
+{
+ nsCOMPtr<nsIThread> thread;
+ nsresult rv = NS_GetMainThread(getter_AddRefs(thread));
+ if (NS_FAILED(rv)) {
+ // If we are not able to get the main-thread object we are shutting down.
+ return;
+ }
+
+ TrackEventInit eventInit;
+ eventInit.mTrack.SetValue().SetAsTextTrack() = aTrack;
+ RefPtr<TrackEvent> event =
+ TrackEvent::Constructor(this, aEventName, eventInit);
+
+ // Dispatch the TrackEvent asynchronously.
+ rv = thread->Dispatch(do_AddRef(new TrackEventRunner(this, event)),
+ NS_DISPATCH_NORMAL);
+
+ // If we are shutting down this can file but it's still ok.
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Dispatch failed");
+}
+
+HTMLMediaElement*
+TextTrackList::GetMediaElement()
+{
+ if (mTextTrackManager) {
+ return mTextTrackManager->mMediaElement;
+ }
+ return nullptr;
+}
+
+void
+TextTrackList::SetTextTrackManager(TextTrackManager* aTextTrackManager)
+{
+ mTextTrackManager = aTextTrackManager;
+}
+
+void
+TextTrackList::SetCuesInactive()
+{
+ for (uint32_t i = 0; i < Length(); i++) {
+ mTextTracks[i]->SetCuesInactive();
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/TextTrackList.h b/dom/media/TextTrackList.h
new file mode 100644
index 000000000..607717137
--- /dev/null
+++ b/dom/media/TextTrackList.h
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TextTrackList_h
+#define mozilla_dom_TextTrackList_h
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/TextTrack.h"
+#include "nsCycleCollectionParticipant.h"
+
+namespace mozilla {
+namespace dom {
+
+class HTMLMediaElement;
+class TextTrackManager;
+class CompareTextTracks;
+class TrackEvent;
+class TrackEventRunner;
+
+class TextTrackList final : public DOMEventTargetHelper
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackList, DOMEventTargetHelper)
+
+ explicit TextTrackList(nsPIDOMWindowInner* aOwnerWindow);
+ TextTrackList(nsPIDOMWindowInner* aOwnerWindow, TextTrackManager* aTextTrackManager);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint32_t Length() const
+ {
+ return mTextTracks.Length();
+ }
+
+ // Get all the current active cues.
+ void GetShowingCues(nsTArray<RefPtr<TextTrackCue> >& aCues);
+
+ TextTrack* IndexedGetter(uint32_t aIndex, bool& aFound);
+ TextTrack* operator[](uint32_t aIndex);
+
+ already_AddRefed<TextTrack> AddTextTrack(TextTrackKind aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ TextTrackMode aMode,
+ TextTrackReadyState aReadyState,
+ TextTrackSource aTextTrackSource,
+ const CompareTextTracks& aCompareTT);
+ TextTrack* GetTrackById(const nsAString& aId);
+
+ void AddTextTrack(TextTrack* aTextTrack, const CompareTextTracks& aCompareTT);
+
+ void RemoveTextTrack(TextTrack* aTrack);
+ void DidSeek();
+
+ HTMLMediaElement* GetMediaElement();
+ void SetTextTrackManager(TextTrackManager* aTextTrackManager);
+
+ nsresult DispatchTrackEvent(nsIDOMEvent* aEvent);
+ void CreateAndDispatchChangeEvent();
+ void SetCuesInactive();
+
+ IMPL_EVENT_HANDLER(change)
+ IMPL_EVENT_HANDLER(addtrack)
+ IMPL_EVENT_HANDLER(removetrack)
+
+ bool mPendingTextTrackChange = false;
+
+private:
+ ~TextTrackList();
+
+ nsTArray< RefPtr<TextTrack> > mTextTracks;
+ RefPtr<TextTrackManager> mTextTrackManager;
+
+ void CreateAndDispatchTrackEventRunner(TextTrack* aTrack,
+ const nsAString& aEventName);
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_TextTrackList_h
diff --git a/dom/media/TextTrackRegion.cpp b/dom/media/TextTrackRegion.cpp
new file mode 100644
index 000000000..2ad85ef04
--- /dev/null
+++ b/dom/media/TextTrackRegion.cpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TextTrackRegion.h"
+#include "mozilla/dom/VTTRegionBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TextTrackRegion, mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TextTrackRegion)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TextTrackRegion)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextTrackRegion)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+JSObject*
+TextTrackRegion::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return VTTRegionBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<TextTrackRegion>
+TextTrackRegion::Constructor(const GlobalObject& aGlobal, ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<TextTrackRegion> region = new TextTrackRegion(aGlobal.GetAsSupports());
+ return region.forget();
+}
+
+TextTrackRegion::TextTrackRegion(nsISupports* aGlobal)
+ : mParent(aGlobal)
+ , mWidth(100)
+ , mLines(3)
+ , mRegionAnchorX(0)
+ , mRegionAnchorY(100)
+ , mViewportAnchorX(0)
+ , mViewportAnchorY(100)
+{
+}
+
+void
+TextTrackRegion::CopyValues(TextTrackRegion& aRegion)
+{
+ mWidth = aRegion.Width();
+ mLines = aRegion.Lines();
+ mRegionAnchorX = aRegion.RegionAnchorX();
+ mRegionAnchorY = aRegion.RegionAnchorY();
+ mViewportAnchorX = aRegion.ViewportAnchorX();
+ mViewportAnchorY = aRegion.ViewportAnchorY();
+ mScroll = aRegion.Scroll();
+}
+
+} //namespace dom
+} //namespace mozilla
+
diff --git a/dom/media/TextTrackRegion.h b/dom/media/TextTrackRegion.h
new file mode 100644
index 000000000..5d66c1c47
--- /dev/null
+++ b/dom/media/TextTrackRegion.h
@@ -0,0 +1,172 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_TextTrackRegion_h
+#define mozilla_dom_TextTrackRegion_h
+
+#include "nsCycleCollectionParticipant.h"
+#include "nsString.h"
+#include "nsWrapperCache.h"
+#include "mozilla/ErrorResult.h"
+#include "mozilla/dom/TextTrack.h"
+#include "mozilla/Preferences.h"
+
+namespace mozilla {
+namespace dom {
+
+class GlobalObject;
+class TextTrack;
+
+class TextTrackRegion final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TextTrackRegion)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ nsISupports* GetParentObject() const
+ {
+ return mParent;
+ }
+
+ explicit TextTrackRegion(nsISupports* aGlobal);
+
+ /** WebIDL Methods. */
+
+ static already_AddRefed<TextTrackRegion>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
+
+ double Lines() const
+ {
+ return mLines;
+ }
+
+ void SetLines(double aLines)
+ {
+ mLines = aLines;
+ }
+
+ double Width() const
+ {
+ return mWidth;
+ }
+
+ void SetWidth(double aWidth, ErrorResult& aRv)
+ {
+ if (!InvalidValue(aWidth, aRv)) {
+ mWidth = aWidth;
+ }
+ }
+
+ double RegionAnchorX() const
+ {
+ return mRegionAnchorX;
+ }
+
+ void SetRegionAnchorX(double aVal, ErrorResult& aRv)
+ {
+ if (!InvalidValue(aVal, aRv)) {
+ mRegionAnchorX = aVal;
+ }
+ }
+
+ double RegionAnchorY() const
+ {
+ return mRegionAnchorY;
+ }
+
+ void SetRegionAnchorY(double aVal, ErrorResult& aRv)
+ {
+ if (!InvalidValue(aVal, aRv)) {
+ mRegionAnchorY = aVal;
+ }
+ }
+
+ double ViewportAnchorX() const
+ {
+ return mViewportAnchorX;
+ }
+
+ void SetViewportAnchorX(double aVal, ErrorResult& aRv)
+ {
+ if (!InvalidValue(aVal, aRv)) {
+ mViewportAnchorX = aVal;
+ }
+ }
+
+ double ViewportAnchorY() const
+ {
+ return mViewportAnchorY;
+ }
+
+ void SetViewportAnchorY(double aVal, ErrorResult& aRv)
+ {
+ if (!InvalidValue(aVal, aRv)) {
+ mViewportAnchorY = aVal;
+ }
+ }
+
+ void GetScroll(nsAString& aScroll) const
+ {
+ aScroll = mScroll;
+ }
+
+ void SetScroll(const nsAString& aScroll, ErrorResult& aRv)
+ {
+ if (!aScroll.EqualsLiteral("") && !aScroll.EqualsLiteral("up")) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return;
+ }
+
+ mScroll = aScroll;
+ }
+
+ /** end WebIDL Methods. */
+
+
+ // Helper to aid copying of a given TextTrackRegion's width, lines,
+ // anchor, viewport and scroll values.
+ void CopyValues(TextTrackRegion& aRegion);
+
+ // -----helpers-------
+ const nsAString& Scroll() const
+ {
+ return mScroll;
+ }
+
+private:
+ ~TextTrackRegion() {}
+
+ nsCOMPtr<nsISupports> mParent;
+ double mWidth;
+ long mLines;
+ double mRegionAnchorX;
+ double mRegionAnchorY;
+ double mViewportAnchorX;
+ double mViewportAnchorY;
+ nsString mScroll;
+
+ // Helper to ensure new value is in the range: 0.0% - 100.0%; throws
+ // an IndexSizeError otherwise.
+ inline bool InvalidValue(double aValue, ErrorResult& aRv)
+ {
+ if(aValue < 0.0 || aValue > 100.0) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return true;
+ }
+
+ return false;
+ }
+
+};
+
+} //namespace dom
+} //namespace mozilla
+
+#endif //mozilla_dom_TextTrackRegion_h
diff --git a/dom/media/ThreadPoolCOMListener.cpp b/dom/media/ThreadPoolCOMListener.cpp
new file mode 100644
index 000000000..72f89b131
--- /dev/null
+++ b/dom/media/ThreadPoolCOMListener.cpp
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ThreadPoolCOMListener.h"
+
+namespace mozilla {
+
+NS_IMPL_ISUPPORTS(MSCOMInitThreadPoolListener, nsIThreadPoolListener)
+
+NS_IMETHODIMP
+MSCOMInitThreadPoolListener::OnThreadCreated()
+{
+ HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
+ if (FAILED(hr)) {
+ NS_WARNING("Failed to initialize MSCOM on decoder thread.");
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MSCOMInitThreadPoolListener::OnThreadShuttingDown()
+{
+ CoUninitialize();
+ return NS_OK;
+}
+
+}
diff --git a/dom/media/ThreadPoolCOMListener.h b/dom/media/ThreadPoolCOMListener.h
new file mode 100644
index 000000000..881013a78
--- /dev/null
+++ b/dom/media/ThreadPoolCOMListener.h
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MSCOMInitThreadPoolListener_h_
+#define MSCOMInitThreadPoolListener_h_
+
+#include "nsIThreadPool.h"
+#include <objbase.h>
+
+namespace mozilla {
+
+// Thread pool listener which ensures that MSCOM is initialized and
+// deinitialized on the thread pool thread. We may call into WMF or
+// DirectShow on this thread, so we need MSCOM working.
+class MSCOMInitThreadPoolListener final : public nsIThreadPoolListener {
+ ~MSCOMInitThreadPoolListener() {}
+ public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSITHREADPOOLLISTENER
+};
+
+} // namespace mozilla
+
+
+#endif // MSCOMInitThreadPoolListener_h_
diff --git a/dom/media/TimeUnits.h b/dom/media/TimeUnits.h
new file mode 100644
index 000000000..d815b9d40
--- /dev/null
+++ b/dom/media/TimeUnits.h
@@ -0,0 +1,310 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef TIME_UNITS_H
+#define TIME_UNITS_H
+
+#include "Intervals.h"
+#include "mozilla/CheckedInt.h"
+#include "mozilla/FloatingPoint.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/dom/TimeRanges.h"
+
+namespace mozilla {
+namespace media {
+class TimeIntervals;
+} // namespace media
+} // namespace mozilla
+// CopyChooser specalization for nsTArray
+template<>
+struct nsTArray_CopyChooser<mozilla::media::TimeIntervals>
+{
+ typedef nsTArray_CopyWithConstructors<mozilla::media::TimeIntervals> Type;
+};
+
+namespace mozilla {
+
+// Number of microseconds per second. 1e6.
+static const int64_t USECS_PER_S = 1000000;
+
+// Number of microseconds per millisecond.
+static const int64_t USECS_PER_MS = 1000;
+
+namespace media {
+
+// Number of nanoseconds per second. 1e9.
+static const int64_t NSECS_PER_S = 1000000000;
+
+struct Microseconds {
+ Microseconds()
+ : mValue(0)
+ {}
+
+ explicit Microseconds(int64_t aValue)
+ : mValue(aValue)
+ {}
+
+ double ToSeconds() {
+ return double(mValue) / USECS_PER_S;
+ }
+
+ static Microseconds FromSeconds(double aValue) {
+ MOZ_ASSERT(!IsNaN(aValue));
+
+ double val = aValue * USECS_PER_S;
+ if (val >= double(INT64_MAX)) {
+ return Microseconds(INT64_MAX);
+ } else if (val <= double(INT64_MIN)) {
+ return Microseconds(INT64_MIN);
+ } else {
+ return Microseconds(int64_t(val));
+ }
+ }
+
+ bool operator == (const Microseconds& aOther) const {
+ return mValue == aOther.mValue;
+ }
+ bool operator > (const Microseconds& aOther) const {
+ return mValue > aOther.mValue;
+ }
+ bool operator >= (const Microseconds& aOther) const {
+ return mValue >= aOther.mValue;
+ }
+ bool operator < (const Microseconds& aOther) const {
+ return mValue < aOther.mValue;
+ }
+ bool operator <= (const Microseconds& aOther) const {
+ return mValue <= aOther.mValue;
+ }
+
+ int64_t mValue;
+};
+
+// TimeUnit at present uses a CheckedInt64 as storage.
+// INT64_MAX has the special meaning of being +oo.
+class TimeUnit final {
+public:
+ static TimeUnit FromSeconds(double aValue) {
+ MOZ_ASSERT(!IsNaN(aValue));
+
+ if (mozilla::IsInfinite<double>(aValue)) {
+ return FromInfinity();
+ }
+ // Due to internal double representation, this
+ // operation is not commutative, do not attempt to simplify.
+ double val = (aValue + .0000005) * USECS_PER_S;
+ if (val >= double(INT64_MAX)) {
+ return FromMicroseconds(INT64_MAX);
+ } else if (val <= double(INT64_MIN)) {
+ return FromMicroseconds(INT64_MIN);
+ } else {
+ return FromMicroseconds(int64_t(val));
+ }
+ }
+
+ static TimeUnit FromMicroseconds(int64_t aValue) {
+ return TimeUnit(aValue);
+ }
+
+ static TimeUnit FromMicroseconds(Microseconds aValue) {
+ return TimeUnit(aValue.mValue);
+ }
+
+ static TimeUnit FromNanoseconds(int64_t aValue) {
+ return TimeUnit(aValue / 1000);
+ }
+
+ static TimeUnit FromInfinity() {
+ return TimeUnit(INT64_MAX);
+ }
+
+ static TimeUnit Invalid() {
+ TimeUnit ret;
+ ret.mValue = CheckedInt64(INT64_MAX);
+ // Force an overflow to render the CheckedInt invalid.
+ ret.mValue += 1;
+ return ret;
+ }
+
+ int64_t ToMicroseconds() const {
+ return mValue.value();
+ }
+
+ int64_t ToNanoseconds() const {
+ return mValue.value() * 1000;
+ }
+
+ double ToSeconds() const {
+ if (IsInfinite()) {
+ return PositiveInfinity<double>();
+ }
+ return double(mValue.value()) / USECS_PER_S;
+ }
+
+ bool IsInfinite() const {
+ return mValue.value() == INT64_MAX;
+ }
+
+ bool operator == (const TimeUnit& aOther) const {
+ MOZ_ASSERT(IsValid() && aOther.IsValid());
+ return mValue.value() == aOther.mValue.value();
+ }
+ bool operator != (const TimeUnit& aOther) const {
+ MOZ_ASSERT(IsValid() && aOther.IsValid());
+ return mValue.value() != aOther.mValue.value();
+ }
+ bool operator >= (const TimeUnit& aOther) const {
+ MOZ_ASSERT(IsValid() && aOther.IsValid());
+ return mValue.value() >= aOther.mValue.value();
+ }
+ bool operator > (const TimeUnit& aOther) const {
+ return !(*this <= aOther);
+ }
+ bool operator <= (const TimeUnit& aOther) const {
+ MOZ_ASSERT(IsValid() && aOther.IsValid());
+ return mValue.value() <= aOther.mValue.value();
+ }
+ bool operator < (const TimeUnit& aOther) const {
+ return !(*this >= aOther);
+ }
+ TimeUnit operator + (const TimeUnit& aOther) const {
+ if (IsInfinite() || aOther.IsInfinite()) {
+ return FromInfinity();
+ }
+ return TimeUnit(mValue + aOther.mValue);
+ }
+ TimeUnit operator - (const TimeUnit& aOther) const {
+ if (IsInfinite() && !aOther.IsInfinite()) {
+ return FromInfinity();
+ }
+ MOZ_ASSERT(!IsInfinite() && !aOther.IsInfinite());
+ return TimeUnit(mValue - aOther.mValue);
+ }
+ TimeUnit& operator += (const TimeUnit& aOther) {
+ *this = *this + aOther;
+ return *this;
+ }
+ TimeUnit& operator -= (const TimeUnit& aOther) {
+ *this = *this - aOther;
+ return *this;
+ }
+
+ friend TimeUnit operator* (int aVal, const TimeUnit& aUnit) {
+ return TimeUnit(aUnit.mValue * aVal);
+ }
+ friend TimeUnit operator* (const TimeUnit& aUnit, int aVal) {
+ return TimeUnit(aUnit.mValue * aVal);
+ }
+ friend TimeUnit operator/ (const TimeUnit& aUnit, int aVal) {
+ return TimeUnit(aUnit.mValue / aVal);
+ }
+
+ bool IsValid() const
+ {
+ return mValue.isValid();
+ }
+
+ TimeUnit()
+ : mValue(CheckedInt64(0))
+ {}
+
+ explicit TimeUnit(const Microseconds& aMicroseconds)
+ : mValue(aMicroseconds.mValue)
+ {}
+ TimeUnit& operator = (const Microseconds& aMicroseconds)
+ {
+ mValue = aMicroseconds.mValue;
+ return *this;
+ }
+
+ TimeUnit(const TimeUnit&) = default;
+
+ TimeUnit& operator = (const TimeUnit&) = default;
+
+private:
+ explicit TimeUnit(CheckedInt64 aMicroseconds)
+ : mValue(aMicroseconds)
+ {}
+
+ // Our internal representation is in microseconds.
+ CheckedInt64 mValue;
+};
+
+typedef Maybe<TimeUnit> NullableTimeUnit;
+
+typedef Interval<TimeUnit> TimeInterval;
+
+class TimeIntervals : public IntervalSet<TimeUnit>
+{
+public:
+ typedef IntervalSet<TimeUnit> BaseType;
+
+ // We can't use inherited constructors yet. So we have to duplicate all the
+ // constructors found in IntervalSet base class.
+ // all this could be later replaced with:
+ // using IntervalSet<TimeUnit>::IntervalSet;
+
+ // MOZ_IMPLICIT as we want to enable initialization in the form:
+ // TimeIntervals i = ... like we would do with IntervalSet<T> i = ...
+ MOZ_IMPLICIT TimeIntervals(const BaseType& aOther)
+ : BaseType(aOther)
+ {}
+ MOZ_IMPLICIT TimeIntervals(BaseType&& aOther)
+ : BaseType(Move(aOther))
+ {}
+ explicit TimeIntervals(const BaseType::ElemType& aOther)
+ : BaseType(aOther)
+ {}
+ explicit TimeIntervals(BaseType::ElemType&& aOther)
+ : BaseType(Move(aOther))
+ {}
+
+ static TimeIntervals Invalid()
+ {
+ return TimeIntervals(TimeInterval(TimeUnit::FromMicroseconds(INT64_MIN),
+ TimeUnit::FromMicroseconds(INT64_MIN)));
+ }
+ bool IsInvalid() const
+ {
+ return Length() == 1 && Start(0).ToMicroseconds() == INT64_MIN &&
+ End(0).ToMicroseconds() == INT64_MIN;
+ }
+
+ TimeIntervals() = default;
+
+ // Make TimeIntervals interchangeable with dom::TimeRanges.
+ explicit TimeIntervals(dom::TimeRanges* aRanges)
+ {
+ for (uint32_t i = 0; i < aRanges->Length(); i++) {
+ ErrorResult rv;
+ *this +=
+ TimeInterval(TimeUnit::FromSeconds(aRanges->Start(i, rv)),
+ TimeUnit::FromSeconds(aRanges->End(i, rv)));
+ }
+ }
+ TimeIntervals& operator = (dom::TimeRanges* aRanges)
+ {
+ *this = TimeIntervals(aRanges);
+ return *this;
+ }
+
+ static TimeIntervals FromTimeRanges(dom::TimeRanges* aRanges)
+ {
+ return TimeIntervals(aRanges);
+ }
+
+ void ToTimeRanges(dom::TimeRanges* aRanges) const
+ {
+ for (IndexType i = 0; i < Length(); i++) {
+ aRanges->Add(Start(i).ToSeconds(), End(i).ToSeconds());
+ }
+ }
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif // TIME_UNITS_H
diff --git a/dom/media/TrackUnionStream.cpp b/dom/media/TrackUnionStream.cpp
new file mode 100644
index 000000000..1c1ac2da0
--- /dev/null
+++ b/dom/media/TrackUnionStream.cpp
@@ -0,0 +1,481 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamGraphImpl.h"
+#include "MediaStreamListener.h"
+#include "mozilla/MathAlgorithms.h"
+#include "mozilla/Unused.h"
+
+#include "AudioSegment.h"
+#include "VideoSegment.h"
+#include "nsContentUtils.h"
+#include "nsIAppShell.h"
+#include "nsIObserver.h"
+#include "nsPrintfCString.h"
+#include "nsServiceManagerUtils.h"
+#include "nsWidgetsCID.h"
+#include "prerror.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Attributes.h"
+#include "TrackUnionStream.h"
+#include "ImageContainer.h"
+#include "AudioChannelService.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioNodeExternalInputStream.h"
+#include "webaudio/MediaStreamAudioDestinationNode.h"
+#include <algorithm>
+#include "DOMMediaStream.h"
+#include "GeckoProfiler.h"
+#ifdef MOZ_WEBRTC
+#include "AudioOutputObserver.h"
+#endif
+
+using namespace mozilla::layers;
+using namespace mozilla::dom;
+using namespace mozilla::gfx;
+
+namespace mozilla {
+
+#ifdef STREAM_LOG
+#undef STREAM_LOG
+#endif
+
+LazyLogModule gTrackUnionStreamLog("TrackUnionStream");
+#define STREAM_LOG(type, msg) MOZ_LOG(gTrackUnionStreamLog, type, msg)
+
+TrackUnionStream::TrackUnionStream() :
+ ProcessedMediaStream(), mNextAvailableTrackID(1)
+{
+}
+
+ void TrackUnionStream::RemoveInput(MediaInputPort* aPort)
+ {
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing input %p", this, aPort));
+ for (int32_t i = mTrackMap.Length() - 1; i >= 0; --i) {
+ if (mTrackMap[i].mInputPort == aPort) {
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing trackmap entry %d", this, i));
+ EndTrack(i);
+ nsTArray<RefPtr<DirectMediaStreamTrackListener>> listeners(
+ mTrackMap[i].mOwnedDirectListeners);
+ for (auto listener : listeners) {
+ // Remove listeners while the entry still exists.
+ RemoveDirectTrackListenerImpl(listener, mTrackMap[i].mOutputTrackID);
+ }
+ mTrackMap.RemoveElementAt(i);
+ }
+ }
+ ProcessedMediaStream::RemoveInput(aPort);
+ }
+ void TrackUnionStream::ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags)
+ {
+ if (IsFinishedOnGraphThread()) {
+ return;
+ }
+ AutoTArray<bool,8> mappedTracksFinished;
+ AutoTArray<bool,8> mappedTracksWithMatchingInputTracks;
+ for (uint32_t i = 0; i < mTrackMap.Length(); ++i) {
+ mappedTracksFinished.AppendElement(true);
+ mappedTracksWithMatchingInputTracks.AppendElement(false);
+ }
+ bool allFinished = !mInputs.IsEmpty();
+ bool allHaveCurrentData = !mInputs.IsEmpty();
+ for (uint32_t i = 0; i < mInputs.Length(); ++i) {
+ MediaStream* stream = mInputs[i]->GetSource();
+ if (!stream->IsFinishedOnGraphThread()) {
+ // XXX we really should check whether 'stream' has finished within time aTo,
+ // not just that it's finishing when all its queued data eventually runs
+ // out.
+ allFinished = false;
+ }
+ if (!stream->HasCurrentData()) {
+ allHaveCurrentData = false;
+ }
+ bool trackAdded = false;
+ for (StreamTracks::TrackIter tracks(stream->GetStreamTracks());
+ !tracks.IsEnded(); tracks.Next()) {
+ bool found = false;
+ for (uint32_t j = 0; j < mTrackMap.Length(); ++j) {
+ TrackMapEntry* map = &mTrackMap[j];
+ if (map->mInputPort == mInputs[i] && map->mInputTrackID == tracks->GetID()) {
+ bool trackFinished = false;
+ StreamTracks::Track* outputTrack = mTracks.FindTrack(map->mOutputTrackID);
+ found = true;
+ if (!outputTrack || outputTrack->IsEnded() ||
+ !mInputs[i]->PassTrackThrough(tracks->GetID())) {
+ trackFinished = true;
+ } else {
+ CopyTrackData(tracks.get(), j, aFrom, aTo, &trackFinished);
+ }
+ mappedTracksFinished[j] = trackFinished;
+ mappedTracksWithMatchingInputTracks[j] = true;
+ break;
+ }
+ }
+ if (!found && mInputs[i]->AllowCreationOf(tracks->GetID())) {
+ bool trackFinished = false;
+ trackAdded = true;
+ uint32_t mapIndex = AddTrack(mInputs[i], tracks.get(), aFrom);
+ CopyTrackData(tracks.get(), mapIndex, aFrom, aTo, &trackFinished);
+ mappedTracksFinished.AppendElement(trackFinished);
+ mappedTracksWithMatchingInputTracks.AppendElement(true);
+ }
+ }
+ if (trackAdded) {
+ for (MediaStreamListener* l : mListeners) {
+ l->NotifyFinishedTrackCreation(Graph());
+ }
+ }
+ }
+ for (int32_t i = mTrackMap.Length() - 1; i >= 0; --i) {
+ if (mappedTracksFinished[i]) {
+ EndTrack(i);
+ } else {
+ allFinished = false;
+ }
+ if (!mappedTracksWithMatchingInputTracks[i]) {
+ for (auto listener : mTrackMap[i].mOwnedDirectListeners) {
+ // Remove listeners while the entry still exists.
+ RemoveDirectTrackListenerImpl(listener, mTrackMap[i].mOutputTrackID);
+ }
+ mTrackMap.RemoveElementAt(i);
+ }
+ }
+ if (allFinished && mAutofinish && (aFlags & ALLOW_FINISH)) {
+ // All streams have finished and won't add any more tracks, and
+ // all our tracks have actually finished and been removed from our map,
+ // so we're finished now.
+ FinishOnGraphThread();
+ } else {
+ mTracks.AdvanceKnownTracksTime(GraphTimeToStreamTimeWithBlocking(aTo));
+ }
+ if (allHaveCurrentData) {
+ // We can make progress if we're not blocked
+ mHasCurrentData = true;
+ }
+ }
+
+ uint32_t TrackUnionStream::AddTrack(MediaInputPort* aPort, StreamTracks::Track* aTrack,
+ GraphTime aFrom)
+ {
+ STREAM_LOG(LogLevel::Verbose, ("TrackUnionStream %p adding track %d for "
+ "input stream %p track %d, desired id %d",
+ this, aTrack->GetID(), aPort->GetSource(),
+ aTrack->GetID(),
+ aPort->GetDestinationTrackId()));
+
+ TrackID id;
+ if (IsTrackIDExplicit(id = aPort->GetDestinationTrackId())) {
+ MOZ_ASSERT(id >= mNextAvailableTrackID &&
+ mUsedTracks.BinaryIndexOf(id) == mUsedTracks.NoIndex,
+ "Desired destination id taken. Only provide a destination ID "
+ "if you can assure its availability, or we may not be able "
+ "to bind to the correct DOM-side track.");
+#ifdef DEBUG
+ for (size_t i = 0; mInputs[i] != aPort; ++i) {
+ MOZ_ASSERT(mInputs[i]->GetSourceTrackId() != TRACK_ANY,
+ "You are adding a MediaInputPort with a track mapping "
+ "while there already exist generic MediaInputPorts for this "
+ "destination stream. This can lead to TrackID collisions!");
+ }
+#endif
+ mUsedTracks.InsertElementSorted(id);
+ } else if ((id = aTrack->GetID()) &&
+ id > mNextAvailableTrackID &&
+ mUsedTracks.BinaryIndexOf(id) == mUsedTracks.NoIndex) {
+ // Input id available. Mark it used in mUsedTracks.
+ mUsedTracks.InsertElementSorted(id);
+ } else {
+ // No desired destination id and Input id taken, allocate a new one.
+ id = mNextAvailableTrackID;
+
+ // Update mNextAvailableTrackID and prune any mUsedTracks members it now
+ // covers.
+ while (1) {
+ if (!mUsedTracks.RemoveElementSorted(++mNextAvailableTrackID)) {
+ // Not in use. We're done.
+ break;
+ }
+ }
+ }
+
+ // Round up the track start time so the track, if anything, starts a
+ // little later than the true time. This means we'll have enough
+ // samples in our input stream to go just beyond the destination time.
+ StreamTime outputStart = GraphTimeToStreamTimeWithBlocking(aFrom);
+
+ nsAutoPtr<MediaSegment> segment;
+ segment = aTrack->GetSegment()->CreateEmptyClone();
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ l->NotifyQueuedTrackChanges(Graph(), id, outputStart,
+ TrackEventCommand::TRACK_EVENT_CREATED,
+ *segment,
+ aPort->GetSource(), aTrack->GetID());
+ }
+ segment->AppendNullData(outputStart);
+ StreamTracks::Track* track =
+ &mTracks.AddTrack(id, outputStart, segment.forget());
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p added track %d for input stream %p track %d, start ticks %lld",
+ this, track->GetID(), aPort->GetSource(), aTrack->GetID(),
+ (long long)outputStart));
+
+ TrackMapEntry* map = mTrackMap.AppendElement();
+ map->mEndOfConsumedInputTicks = 0;
+ map->mEndOfLastInputIntervalInInputStream = -1;
+ map->mEndOfLastInputIntervalInOutputStream = -1;
+ map->mInputPort = aPort;
+ map->mInputTrackID = aTrack->GetID();
+ map->mOutputTrackID = track->GetID();
+ map->mSegment = aTrack->GetSegment()->CreateEmptyClone();
+
+ for (int32_t i = mPendingDirectTrackListeners.Length() - 1; i >= 0; --i) {
+ TrackBound<DirectMediaStreamTrackListener>& bound =
+ mPendingDirectTrackListeners[i];
+ if (bound.mTrackID != map->mOutputTrackID) {
+ continue;
+ }
+ MediaStream* source = map->mInputPort->GetSource();
+ map->mOwnedDirectListeners.AppendElement(bound.mListener);
+ DisabledTrackMode currentMode = GetDisabledTrackMode(bound.mTrackID);
+ if (currentMode != DisabledTrackMode::ENABLED) {
+ bound.mListener->IncreaseDisabled(currentMode);
+ }
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p adding direct listener "
+ "%p for track %d. Forwarding to input "
+ "stream %p track %d.",
+ this, bound.mListener.get(), bound.mTrackID,
+ source, map->mInputTrackID));
+ source->AddDirectTrackListenerImpl(bound.mListener.forget(),
+ map->mInputTrackID);
+ mPendingDirectTrackListeners.RemoveElementAt(i);
+ }
+
+ return mTrackMap.Length() - 1;
+ }
+
+ void TrackUnionStream::EndTrack(uint32_t aIndex)
+ {
+ StreamTracks::Track* outputTrack = mTracks.FindTrack(mTrackMap[aIndex].mOutputTrackID);
+ if (!outputTrack || outputTrack->IsEnded())
+ return;
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p ending track %d", this, outputTrack->GetID()));
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ StreamTime offset = outputTrack->GetSegment()->GetDuration();
+ nsAutoPtr<MediaSegment> segment;
+ segment = outputTrack->GetSegment()->CreateEmptyClone();
+ l->NotifyQueuedTrackChanges(Graph(), outputTrack->GetID(), offset,
+ TrackEventCommand::TRACK_EVENT_ENDED,
+ *segment,
+ mTrackMap[aIndex].mInputPort->GetSource(),
+ mTrackMap[aIndex].mInputTrackID);
+ }
+ for (TrackBound<MediaStreamTrackListener>& b : mTrackListeners) {
+ if (b.mTrackID == outputTrack->GetID()) {
+ b.mListener->NotifyEnded();
+ }
+ }
+ outputTrack->SetEnded();
+ }
+
+ void TrackUnionStream::CopyTrackData(StreamTracks::Track* aInputTrack,
+ uint32_t aMapIndex, GraphTime aFrom, GraphTime aTo,
+ bool* aOutputTrackFinished)
+ {
+ TrackMapEntry* map = &mTrackMap[aMapIndex];
+ StreamTracks::Track* outputTrack = mTracks.FindTrack(map->mOutputTrackID);
+ MOZ_ASSERT(outputTrack && !outputTrack->IsEnded(), "Can't copy to ended track");
+
+ MediaSegment* segment = map->mSegment;
+ MediaStream* source = map->mInputPort->GetSource();
+
+ GraphTime next;
+ *aOutputTrackFinished = false;
+ for (GraphTime t = aFrom; t < aTo; t = next) {
+ MediaInputPort::InputInterval interval = map->mInputPort->GetNextInputInterval(t);
+ interval.mEnd = std::min(interval.mEnd, aTo);
+ StreamTime inputEnd = source->GraphTimeToStreamTimeWithBlocking(interval.mEnd);
+ StreamTime inputTrackEndPoint = STREAM_TIME_MAX;
+
+ if (aInputTrack->IsEnded() &&
+ aInputTrack->GetEnd() <= inputEnd) {
+ inputTrackEndPoint = aInputTrack->GetEnd();
+ *aOutputTrackFinished = true;
+ }
+
+ if (interval.mStart >= interval.mEnd) {
+ break;
+ }
+ StreamTime ticks = interval.mEnd - interval.mStart;
+ next = interval.mEnd;
+
+ StreamTime outputStart = outputTrack->GetEnd();
+
+ if (interval.mInputIsBlocked) {
+ // Maybe the input track ended?
+ segment->AppendNullData(ticks);
+ STREAM_LOG(LogLevel::Verbose, ("TrackUnionStream %p appending %lld ticks of null data to track %d",
+ this, (long long)ticks, outputTrack->GetID()));
+ } else if (InMutedCycle()) {
+ segment->AppendNullData(ticks);
+ } else {
+ if (source->IsSuspended()) {
+ segment->AppendNullData(aTo - aFrom);
+ } else {
+ MOZ_ASSERT(outputTrack->GetEnd() == GraphTimeToStreamTimeWithBlocking(interval.mStart),
+ "Samples missing");
+ StreamTime inputStart = source->GraphTimeToStreamTimeWithBlocking(interval.mStart);
+ segment->AppendSlice(*aInputTrack->GetSegment(),
+ std::min(inputTrackEndPoint, inputStart),
+ std::min(inputTrackEndPoint, inputEnd));
+ }
+ }
+ ApplyTrackDisabling(outputTrack->GetID(), segment);
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ // Separate Audio and Video.
+ if (segment->GetType() == MediaSegment::AUDIO) {
+ l->NotifyQueuedAudioData(Graph(), outputTrack->GetID(),
+ outputStart,
+ *static_cast<AudioSegment*>(segment),
+ map->mInputPort->GetSource(),
+ map->mInputTrackID);
+ }
+ }
+ for (TrackBound<MediaStreamTrackListener>& b : mTrackListeners) {
+ if (b.mTrackID != outputTrack->GetID()) {
+ continue;
+ }
+ b.mListener->NotifyQueuedChanges(Graph(), outputStart, *segment);
+ }
+ outputTrack->GetSegment()->AppendFrom(segment);
+ }
+ }
+
+void
+TrackUnionStream::SetTrackEnabledImpl(TrackID aTrackID, DisabledTrackMode aMode) {
+ bool enabled = aMode == DisabledTrackMode::ENABLED;
+ for (TrackMapEntry& entry : mTrackMap) {
+ if (entry.mOutputTrackID == aTrackID) {
+ STREAM_LOG(LogLevel::Info, ("TrackUnionStream %p track %d was explicitly %s",
+ this, aTrackID, enabled ? "enabled" : "disabled"));
+ for (DirectMediaStreamTrackListener* listener : entry.mOwnedDirectListeners) {
+ DisabledTrackMode oldMode = GetDisabledTrackMode(aTrackID);
+ bool oldEnabled = oldMode == DisabledTrackMode::ENABLED;
+ if (!oldEnabled && enabled) {
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p track %d setting "
+ "direct listener enabled",
+ this, aTrackID));
+ listener->DecreaseDisabled(oldMode);
+ } else if (oldEnabled && !enabled) {
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p track %d setting "
+ "direct listener disabled",
+ this, aTrackID));
+ listener->IncreaseDisabled(aMode);
+ }
+ }
+ }
+ }
+ MediaStream::SetTrackEnabledImpl(aTrackID, aMode);
+}
+
+MediaStream*
+TrackUnionStream::GetInputStreamFor(TrackID aTrackID)
+{
+ for (TrackMapEntry& entry : mTrackMap) {
+ if (entry.mOutputTrackID == aTrackID && entry.mInputPort) {
+ return entry.mInputPort->GetSource();
+ }
+ }
+
+ return nullptr;
+}
+
+TrackID
+TrackUnionStream::GetInputTrackIDFor(TrackID aTrackID)
+{
+ for (TrackMapEntry& entry : mTrackMap) {
+ if (entry.mOutputTrackID == aTrackID) {
+ return entry.mInputTrackID;
+ }
+ }
+
+ return TRACK_NONE;
+}
+
+void
+TrackUnionStream::AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
+ TrackID aTrackID)
+{
+ RefPtr<DirectMediaStreamTrackListener> listener = aListener;
+
+ for (TrackMapEntry& entry : mTrackMap) {
+ if (entry.mOutputTrackID == aTrackID) {
+ MediaStream* source = entry.mInputPort->GetSource();
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p adding direct listener "
+ "%p for track %d. Forwarding to input "
+ "stream %p track %d.",
+ this, listener.get(), aTrackID, source,
+ entry.mInputTrackID));
+ entry.mOwnedDirectListeners.AppendElement(listener);
+ DisabledTrackMode currentMode = GetDisabledTrackMode(aTrackID);
+ if (currentMode != DisabledTrackMode::ENABLED) {
+ listener->IncreaseDisabled(currentMode);
+ }
+ source->AddDirectTrackListenerImpl(listener.forget(),
+ entry.mInputTrackID);
+ return;
+ }
+ }
+
+ TrackBound<DirectMediaStreamTrackListener>* bound =
+ mPendingDirectTrackListeners.AppendElement();
+ bound->mListener = listener.forget();
+ bound->mTrackID = aTrackID;
+}
+
+void
+TrackUnionStream::RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID)
+{
+ for (TrackMapEntry& entry : mTrackMap) {
+ // OutputTrackID is unique to this stream so we only need to do this once.
+ if (entry.mOutputTrackID != aTrackID) {
+ continue;
+ }
+ for (size_t i = 0; i < entry.mOwnedDirectListeners.Length(); ++i) {
+ if (entry.mOwnedDirectListeners[i] == aListener) {
+ STREAM_LOG(LogLevel::Debug, ("TrackUnionStream %p removing direct "
+ "listener %p for track %d, forwarding "
+ "to input stream %p track %d",
+ this, aListener, aTrackID,
+ entry.mInputPort->GetSource(),
+ entry.mInputTrackID));
+ DisabledTrackMode currentMode = GetDisabledTrackMode(aTrackID);
+ if (currentMode != DisabledTrackMode::ENABLED) {
+ // Reset the listener's state.
+ aListener->DecreaseDisabled(currentMode);
+ }
+ entry.mOwnedDirectListeners.RemoveElementAt(i);
+ break;
+ }
+ }
+ // Forward to the input
+ MediaStream* source = entry.mInputPort->GetSource();
+ source->RemoveDirectTrackListenerImpl(aListener, entry.mInputTrackID);
+ return;
+ }
+
+ for (size_t i = 0; i < mPendingDirectTrackListeners.Length(); ++i) {
+ TrackBound<DirectMediaStreamTrackListener>& bound =
+ mPendingDirectTrackListeners[i];
+ if (bound.mListener == aListener && bound.mTrackID == aTrackID) {
+ mPendingDirectTrackListeners.RemoveElementAt(i);
+ return;
+ }
+ }
+}
+} // namespace mozilla
diff --git a/dom/media/TrackUnionStream.h b/dom/media/TrackUnionStream.h
new file mode 100644
index 000000000..c82e35273
--- /dev/null
+++ b/dom/media/TrackUnionStream.h
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_TRACKUNIONSTREAM_H_
+#define MOZILLA_TRACKUNIONSTREAM_H_
+
+#include "MediaStreamGraph.h"
+#include "nsAutoPtr.h"
+#include <algorithm>
+
+namespace mozilla {
+
+/**
+ * See MediaStreamGraph::CreateTrackUnionStream.
+ */
+class TrackUnionStream : public ProcessedMediaStream {
+public:
+ explicit TrackUnionStream();
+
+ virtual TrackUnionStream* AsTrackUnionStream() override { return this; }
+ friend class DOMMediaStream;
+
+ void RemoveInput(MediaInputPort* aPort) override;
+ void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) override;
+
+ void SetTrackEnabledImpl(TrackID aTrackID, DisabledTrackMode aMode) override;
+
+ MediaStream* GetInputStreamFor(TrackID aTrackID) override;
+ TrackID GetInputTrackIDFor(TrackID aTrackID) override;
+
+ friend class MediaStreamGraphImpl;
+
+protected:
+ // Only non-ended tracks are allowed to persist in this map.
+ struct TrackMapEntry {
+ // mEndOfConsumedInputTicks is the end of the input ticks that we've consumed.
+ // 0 if we haven't consumed any yet.
+ StreamTime mEndOfConsumedInputTicks;
+ // mEndOfLastInputIntervalInInputStream is the timestamp for the end of the
+ // previous interval which was unblocked for both the input and output
+ // stream, in the input stream's timeline, or -1 if there wasn't one.
+ StreamTime mEndOfLastInputIntervalInInputStream;
+ // mEndOfLastInputIntervalInOutputStream is the timestamp for the end of the
+ // previous interval which was unblocked for both the input and output
+ // stream, in the output stream's timeline, or -1 if there wasn't one.
+ StreamTime mEndOfLastInputIntervalInOutputStream;
+ MediaInputPort* mInputPort;
+ // We keep track IDs instead of track pointers because
+ // tracks can be removed without us being notified (e.g.
+ // when a finished track is forgotten.) When we need a Track*,
+ // we call StreamTracks::FindTrack, which will return null if
+ // the track has been deleted.
+ TrackID mInputTrackID;
+ TrackID mOutputTrackID;
+ nsAutoPtr<MediaSegment> mSegment;
+ // These are direct track listeners that have been added to this
+ // TrackUnionStream-track and forwarded to the input track. We will update
+ // these when this track's disabled status changes.
+ nsTArray<RefPtr<DirectMediaStreamTrackListener>> mOwnedDirectListeners;
+ };
+
+ // Add the track to this stream, retaining its TrackID if it has never
+ // been previously used in this stream, allocating a new TrackID otherwise.
+ uint32_t AddTrack(MediaInputPort* aPort, StreamTracks::Track* aTrack,
+ GraphTime aFrom);
+ void EndTrack(uint32_t aIndex);
+ void CopyTrackData(StreamTracks::Track* aInputTrack,
+ uint32_t aMapIndex, GraphTime aFrom, GraphTime aTo,
+ bool* aOutputTrackFinished);
+
+ void AddDirectTrackListenerImpl(already_AddRefed<DirectMediaStreamTrackListener> aListener,
+ TrackID aTrackID) override;
+ void RemoveDirectTrackListenerImpl(DirectMediaStreamTrackListener* aListener,
+ TrackID aTrackID) override;
+
+ nsTArray<TrackMapEntry> mTrackMap;
+
+ // The next available TrackID, starting at 1 and progressing upwards.
+ // All TrackIDs in [1, mNextAvailableTrackID) have implicitly been used.
+ TrackID mNextAvailableTrackID;
+
+ // Sorted array of used TrackIDs that require manual tracking.
+ nsTArray<TrackID> mUsedTracks;
+
+ // Direct track listeners that have not been forwarded to their input stream
+ // yet. We'll forward these as their inputs become available.
+ nsTArray<TrackBound<DirectMediaStreamTrackListener>> mPendingDirectTrackListeners;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_MEDIASTREAMGRAPH_H_ */
diff --git a/dom/media/VideoFrameContainer.cpp b/dom/media/VideoFrameContainer.cpp
new file mode 100644
index 000000000..2b1965766
--- /dev/null
+++ b/dom/media/VideoFrameContainer.cpp
@@ -0,0 +1,359 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VideoFrameContainer.h"
+
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "nsIFrame.h"
+#include "nsDisplayList.h"
+#include "nsSVGEffects.h"
+
+using namespace mozilla::layers;
+
+namespace mozilla {
+static LazyLogModule gVideoFrameContainerLog("VideoFrameContainer");
+#define CONTAINER_LOG(type, msg) MOZ_LOG(gVideoFrameContainerLog, type, msg)
+
+VideoFrameContainer::VideoFrameContainer(dom::HTMLMediaElement* aElement,
+ already_AddRefed<ImageContainer> aContainer)
+ : mElement(aElement),
+ mImageContainer(aContainer), mMutex("nsVideoFrameContainer"),
+ mBlackImage(nullptr),
+ mFrameID(0),
+ mIntrinsicSizeChanged(false), mImageSizeChanged(false),
+ mPendingPrincipalHandle(PRINCIPAL_HANDLE_NONE), mFrameIDForPendingPrincipalHandle(0)
+{
+ NS_ASSERTION(aElement, "aElement must not be null");
+ NS_ASSERTION(mImageContainer, "aContainer must not be null");
+}
+
+VideoFrameContainer::~VideoFrameContainer()
+{}
+
+PrincipalHandle VideoFrameContainer::GetLastPrincipalHandle()
+{
+ MutexAutoLock lock(mMutex);
+ return GetLastPrincipalHandleLocked();
+}
+
+PrincipalHandle VideoFrameContainer::GetLastPrincipalHandleLocked()
+{
+ return mLastPrincipalHandle;
+}
+
+void VideoFrameContainer::UpdatePrincipalHandleForFrameID(const PrincipalHandle& aPrincipalHandle,
+ const ImageContainer::FrameID& aFrameID)
+{
+ MutexAutoLock lock(mMutex);
+ UpdatePrincipalHandleForFrameIDLocked(aPrincipalHandle, aFrameID);
+}
+
+void VideoFrameContainer::UpdatePrincipalHandleForFrameIDLocked(const PrincipalHandle& aPrincipalHandle,
+ const ImageContainer::FrameID& aFrameID)
+{
+ if (mPendingPrincipalHandle == aPrincipalHandle) {
+ return;
+ }
+ mPendingPrincipalHandle = aPrincipalHandle;
+ mFrameIDForPendingPrincipalHandle = aFrameID;
+}
+
+static void
+SetImageToBlackPixel(PlanarYCbCrImage* aImage)
+{
+ uint8_t blackPixel[] = { 0x10, 0x80, 0x80 };
+
+ PlanarYCbCrData data;
+ data.mYChannel = blackPixel;
+ data.mCbChannel = blackPixel + 1;
+ data.mCrChannel = blackPixel + 2;
+ data.mYStride = data.mCbCrStride = 1;
+ data.mPicSize = data.mYSize = data.mCbCrSize = gfx::IntSize(1, 1);
+ aImage->CopyData(data);
+}
+
+class VideoFrameContainerInvalidateRunnable : public Runnable {
+public:
+ explicit VideoFrameContainerInvalidateRunnable(VideoFrameContainer* aVideoFrameContainer)
+ : mVideoFrameContainer(aVideoFrameContainer)
+ {}
+ NS_IMETHOD Run()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ mVideoFrameContainer->Invalidate();
+
+ return NS_OK;
+ }
+private:
+ RefPtr<VideoFrameContainer> mVideoFrameContainer;
+};
+
+void VideoFrameContainer::SetCurrentFrames(const VideoSegment& aSegment)
+{
+ if (aSegment.IsEmpty()) {
+ return;
+ }
+
+ MutexAutoLock lock(mMutex);
+
+ // Collect any new frames produced in this iteration.
+ AutoTArray<ImageContainer::NonOwningImage,4> newImages;
+ PrincipalHandle lastPrincipalHandle = PRINCIPAL_HANDLE_NONE;
+
+ VideoSegment::ConstChunkIterator iter(aSegment);
+ while (!iter.IsEnded()) {
+ VideoChunk chunk = *iter;
+
+ const VideoFrame* frame = &chunk.mFrame;
+ if (*frame == mLastPlayedVideoFrame) {
+ iter.Next();
+ continue;
+ }
+
+ Image* image = frame->GetImage();
+ CONTAINER_LOG(LogLevel::Verbose,
+ ("VideoFrameContainer %p writing video frame %p (%d x %d)",
+ this, image, frame->GetIntrinsicSize().width,
+ frame->GetIntrinsicSize().height));
+
+ if (frame->GetForceBlack()) {
+ if (!mBlackImage) {
+ mBlackImage = GetImageContainer()->CreatePlanarYCbCrImage();
+ if (mBlackImage) {
+ // Sets the image to a single black pixel, which will be scaled to
+ // fill the rendered size.
+ SetImageToBlackPixel(mBlackImage->AsPlanarYCbCrImage());
+ }
+ }
+ if (mBlackImage) {
+ image = mBlackImage;
+ }
+ }
+ // Don't append null image to the newImages.
+ if (!image) {
+ iter.Next();
+ continue;
+ }
+ newImages.AppendElement(ImageContainer::NonOwningImage(image, chunk.mTimeStamp));
+
+ lastPrincipalHandle = chunk.GetPrincipalHandle();
+
+ mLastPlayedVideoFrame = *frame;
+ iter.Next();
+ }
+
+ // Don't update if there are no changes.
+ if (newImages.IsEmpty()) {
+ return;
+ }
+
+ AutoTArray<ImageContainer::NonOwningImage,4> images;
+
+ bool principalHandleChanged =
+ lastPrincipalHandle != PRINCIPAL_HANDLE_NONE &&
+ lastPrincipalHandle != GetLastPrincipalHandleLocked();
+
+ // Add the frames from this iteration.
+ for (auto& image : newImages) {
+ image.mFrameID = NewFrameID();
+ images.AppendElement(image);
+ }
+
+ if (principalHandleChanged) {
+ UpdatePrincipalHandleForFrameIDLocked(lastPrincipalHandle,
+ newImages.LastElement().mFrameID);
+ }
+
+ SetCurrentFramesLocked(mLastPlayedVideoFrame.GetIntrinsicSize(), images);
+ nsCOMPtr<nsIRunnable> event =
+ new VideoFrameContainerInvalidateRunnable(this);
+ NS_DispatchToMainThread(event.forget());
+
+ images.ClearAndRetainStorage();
+}
+
+void VideoFrameContainer::ClearFrames()
+{
+ ClearFutureFrames();
+}
+
+void VideoFrameContainer::SetCurrentFrame(const gfx::IntSize& aIntrinsicSize,
+ Image* aImage,
+ const TimeStamp& aTargetTime)
+{
+ if (aImage) {
+ MutexAutoLock lock(mMutex);
+ AutoTArray<ImageContainer::NonOwningImage,1> imageList;
+ imageList.AppendElement(
+ ImageContainer::NonOwningImage(aImage, aTargetTime, ++mFrameID));
+ SetCurrentFramesLocked(aIntrinsicSize, imageList);
+ } else {
+ ClearCurrentFrame(aIntrinsicSize);
+ }
+}
+
+void VideoFrameContainer::SetCurrentFrames(const gfx::IntSize& aIntrinsicSize,
+ const nsTArray<ImageContainer::NonOwningImage>& aImages)
+{
+ MutexAutoLock lock(mMutex);
+ SetCurrentFramesLocked(aIntrinsicSize, aImages);
+}
+
+void VideoFrameContainer::SetCurrentFramesLocked(const gfx::IntSize& aIntrinsicSize,
+ const nsTArray<ImageContainer::NonOwningImage>& aImages)
+{
+ mMutex.AssertCurrentThreadOwns();
+
+ if (aIntrinsicSize != mIntrinsicSize) {
+ mIntrinsicSize = aIntrinsicSize;
+ mIntrinsicSizeChanged = true;
+ }
+
+ gfx::IntSize oldFrameSize = mImageContainer->GetCurrentSize();
+
+ // When using the OMX decoder, destruction of the current image can indirectly
+ // block on main thread I/O. If we let this happen while holding onto
+ // |mImageContainer|'s lock, then when the main thread then tries to
+ // composite it can then block on |mImageContainer|'s lock, causing a
+ // deadlock. We use this hack to defer the destruction of the current image
+ // until it is safe.
+ nsTArray<ImageContainer::OwningImage> oldImages;
+ mImageContainer->GetCurrentImages(&oldImages);
+
+ ImageContainer::FrameID lastFrameIDForOldPrincipalHandle =
+ mFrameIDForPendingPrincipalHandle - 1;
+ if (mPendingPrincipalHandle != PRINCIPAL_HANDLE_NONE &&
+ ((!oldImages.IsEmpty() &&
+ oldImages.LastElement().mFrameID >= lastFrameIDForOldPrincipalHandle) ||
+ (!aImages.IsEmpty() &&
+ aImages[0].mFrameID > lastFrameIDForOldPrincipalHandle))) {
+ // We are releasing the last FrameID prior to `lastFrameIDForOldPrincipalHandle`
+ // OR
+ // there are no FrameIDs prior to `lastFrameIDForOldPrincipalHandle` in the new
+ // set of images.
+ // This means that the old principal handle has been flushed out and we can
+ // notify our video element about this change.
+ RefPtr<VideoFrameContainer> self = this;
+ PrincipalHandle principalHandle = mPendingPrincipalHandle;
+ mLastPrincipalHandle = mPendingPrincipalHandle;
+ mPendingPrincipalHandle = PRINCIPAL_HANDLE_NONE;
+ mFrameIDForPendingPrincipalHandle = 0;
+ NS_DispatchToMainThread(NS_NewRunnableFunction([self, principalHandle]() {
+ if (self->mElement) {
+ self->mElement->PrincipalHandleChangedForVideoFrameContainer(self, principalHandle);
+ }
+ }));
+ }
+
+ if (aImages.IsEmpty()) {
+ mImageContainer->ClearAllImages();
+ } else {
+ mImageContainer->SetCurrentImages(aImages);
+ }
+ gfx::IntSize newFrameSize = mImageContainer->GetCurrentSize();
+ if (oldFrameSize != newFrameSize) {
+ mImageSizeChanged = true;
+ }
+}
+
+void VideoFrameContainer::ClearCurrentFrame()
+{
+ MutexAutoLock lock(mMutex);
+
+ // See comment in SetCurrentFrame for the reasoning behind
+ // using a kungFuDeathGrip here.
+ nsTArray<ImageContainer::OwningImage> kungFuDeathGrip;
+ mImageContainer->GetCurrentImages(&kungFuDeathGrip);
+
+ mImageContainer->ClearAllImages();
+ mImageContainer->ClearCachedResources();
+}
+
+void VideoFrameContainer::ClearFutureFrames()
+{
+ MutexAutoLock lock(mMutex);
+
+ // See comment in SetCurrentFrame for the reasoning behind
+ // using a kungFuDeathGrip here.
+ nsTArray<ImageContainer::OwningImage> kungFuDeathGrip;
+ mImageContainer->GetCurrentImages(&kungFuDeathGrip);
+
+ if (!kungFuDeathGrip.IsEmpty()) {
+ nsTArray<ImageContainer::NonOwningImage> currentFrame;
+ const ImageContainer::OwningImage& img = kungFuDeathGrip[0];
+ currentFrame.AppendElement(ImageContainer::NonOwningImage(img.mImage,
+ img.mTimeStamp, img.mFrameID, img.mProducerID));
+ mImageContainer->SetCurrentImages(currentFrame);
+ }
+}
+
+void
+VideoFrameContainer::ClearCachedResources()
+{
+ mImageContainer->ClearCachedResources();
+}
+
+ImageContainer* VideoFrameContainer::GetImageContainer() {
+ return mImageContainer;
+}
+
+
+double VideoFrameContainer::GetFrameDelay()
+{
+ return mImageContainer->GetPaintDelay().ToSeconds();
+}
+
+void VideoFrameContainer::InvalidateWithFlags(uint32_t aFlags)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Must call on main thread");
+
+ if (!mElement) {
+ // Element has been destroyed
+ return;
+ }
+
+ nsIFrame* frame = mElement->GetPrimaryFrame();
+ bool invalidateFrame = false;
+
+ {
+ MutexAutoLock lock(mMutex);
+
+ // Get mImageContainerSizeChanged while holding the lock.
+ invalidateFrame = mImageSizeChanged;
+ mImageSizeChanged = false;
+
+ if (mIntrinsicSizeChanged) {
+ mElement->UpdateMediaSize(mIntrinsicSize);
+ mIntrinsicSizeChanged = false;
+
+ if (frame) {
+ nsPresContext* presContext = frame->PresContext();
+ nsIPresShell *presShell = presContext->PresShell();
+ presShell->FrameNeedsReflow(frame,
+ nsIPresShell::eStyleChange,
+ NS_FRAME_IS_DIRTY);
+ }
+ }
+ }
+
+ bool asyncInvalidate = mImageContainer &&
+ mImageContainer->IsAsync() &&
+ !(aFlags & INVALIDATE_FORCE);
+
+ if (frame) {
+ if (invalidateFrame) {
+ frame->InvalidateFrame();
+ } else {
+ frame->InvalidateLayer(nsDisplayItem::TYPE_VIDEO, nullptr, nullptr,
+ asyncInvalidate ? nsIFrame::UPDATE_IS_ASYNC : 0);
+ }
+ }
+
+ nsSVGEffects::InvalidateDirectRenderingObservers(mElement);
+}
+
+} // namespace mozilla
diff --git a/dom/media/VideoFrameContainer.h b/dom/media/VideoFrameContainer.h
new file mode 100644
index 000000000..b5c84e760
--- /dev/null
+++ b/dom/media/VideoFrameContainer.h
@@ -0,0 +1,147 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VIDEOFRAMECONTAINER_H_
+#define VIDEOFRAMECONTAINER_H_
+
+#include "mozilla/Mutex.h"
+#include "mozilla/TimeStamp.h"
+#include "gfxPoint.h"
+#include "nsCOMPtr.h"
+#include "ImageContainer.h"
+#include "MediaSegment.h"
+#include "MediaStreamVideoSink.h"
+#include "VideoSegment.h"
+
+namespace mozilla {
+
+namespace dom {
+class HTMLMediaElement;
+} // namespace dom
+
+/**
+ * This object is used in the decoder backend threads and the main thread
+ * to manage the "current video frame" state. This state includes timing data
+ * and an intrinsic size (see below).
+ * This has to be a thread-safe object since it's accessed by resource decoders
+ * and other off-main-thread components. So we can't put this state in the media
+ * element itself ... well, maybe we could, but it could be risky and/or
+ * confusing.
+ */
+class VideoFrameContainer : public MediaStreamVideoSink {
+ virtual ~VideoFrameContainer();
+
+public:
+ typedef layers::ImageContainer ImageContainer;
+ typedef layers::Image Image;
+
+ VideoFrameContainer(dom::HTMLMediaElement* aElement,
+ already_AddRefed<ImageContainer> aContainer);
+
+ // Call on any thread
+ virtual void SetCurrentFrames(const VideoSegment& aSegment) override;
+ virtual void ClearFrames() override;
+ void SetCurrentFrame(const gfx::IntSize& aIntrinsicSize, Image* aImage,
+ const TimeStamp& aTargetTime);
+ // Returns the last principalHandle we notified mElement about.
+ PrincipalHandle GetLastPrincipalHandle();
+ PrincipalHandle GetLastPrincipalHandleLocked();
+ // We will notify mElement that aPrincipalHandle has been applied when all
+ // FrameIDs prior to aFrameID have been flushed out.
+ // aFrameID is ignored if aPrincipalHandle already is our pending principalHandle.
+ void UpdatePrincipalHandleForFrameID(const PrincipalHandle& aPrincipalHandle,
+ const ImageContainer::FrameID& aFrameID);
+ void UpdatePrincipalHandleForFrameIDLocked(const PrincipalHandle& aPrincipalHandle,
+ const ImageContainer::FrameID& aFrameID);
+ void SetCurrentFrames(const gfx::IntSize& aIntrinsicSize,
+ const nsTArray<ImageContainer::NonOwningImage>& aImages);
+ void ClearCurrentFrame(const gfx::IntSize& aIntrinsicSize)
+ {
+ SetCurrentFrames(aIntrinsicSize, nsTArray<ImageContainer::NonOwningImage>());
+ }
+ VideoFrameContainer* AsVideoFrameContainer() override { return this; }
+
+ void ClearCurrentFrame();
+ // Make the current frame the only frame in the container, i.e. discard
+ // all future frames.
+ void ClearFutureFrames();
+ // Time in seconds by which the last painted video frame was late by.
+ // E.g. if the last painted frame should have been painted at time t,
+ // but was actually painted at t+n, this returns n in seconds. Threadsafe.
+ double GetFrameDelay();
+
+ // Clear any resources that are not immediately necessary.
+ void ClearCachedResources();
+
+ // Returns a new frame ID for SetCurrentFrames(). The client must either
+ // call this on only one thread or provide barriers. Do not use together
+ // with SetCurrentFrame().
+ ImageContainer::FrameID NewFrameID()
+ {
+ return ++mFrameID;
+ }
+
+ // Call on main thread
+ enum {
+ INVALIDATE_DEFAULT,
+ INVALIDATE_FORCE
+ };
+ void Invalidate() override { InvalidateWithFlags(INVALIDATE_DEFAULT); }
+ void InvalidateWithFlags(uint32_t aFlags);
+ ImageContainer* GetImageContainer();
+ void ForgetElement() { mElement = nullptr; }
+
+ uint32_t GetDroppedImageCount() { return mImageContainer->GetDroppedImageCount(); }
+
+protected:
+ void SetCurrentFramesLocked(const gfx::IntSize& aIntrinsicSize,
+ const nsTArray<ImageContainer::NonOwningImage>& aImages);
+
+ // Non-addreffed pointer to the element. The element calls ForgetElement
+ // to clear this reference when the element is destroyed.
+ dom::HTMLMediaElement* mElement;
+ RefPtr<ImageContainer> mImageContainer;
+
+ // mMutex protects all the fields below.
+ Mutex mMutex;
+ // Once the frame is forced to black, we initialize mBlackImage for following
+ // frames.
+ RefPtr<Image> mBlackImage;
+ // The intrinsic size is the ideal size which we should render the
+ // ImageContainer's current Image at.
+ // This can differ from the Image's actual size when the media resource
+ // specifies that the Image should be stretched to have the correct aspect
+ // ratio.
+ gfx::IntSize mIntrinsicSize;
+ // We maintain our own mFrameID which is auto-incremented at every
+ // SetCurrentFrame() or NewFrameID() call.
+ ImageContainer::FrameID mFrameID;
+ // We record the last played video frame to avoid playing the frame again
+ // with a different frame id.
+ VideoFrame mLastPlayedVideoFrame;
+ // True when the intrinsic size has been changed by SetCurrentFrame() since
+ // the last call to Invalidate().
+ // The next call to Invalidate() will recalculate
+ // and update the intrinsic size on the element, request a frame reflow and
+ // then reset this flag.
+ bool mIntrinsicSizeChanged;
+ // True when the Image size has changed since the last time Invalidate() was
+ // called. When set, the next call to Invalidate() will ensure that the
+ // frame is fully invalidated instead of just invalidating for the image change
+ // in the ImageLayer.
+ bool mImageSizeChanged;
+ // The last PrincipalHandle we notified mElement about.
+ PrincipalHandle mLastPrincipalHandle;
+ // The PrincipalHandle the client has notified us is changing with FrameID
+ // mFrameIDForPendingPrincipalHandle.
+ PrincipalHandle mPendingPrincipalHandle;
+ // The FrameID for which mPendingPrincipal is first valid.
+ ImageContainer::FrameID mFrameIDForPendingPrincipalHandle;
+};
+
+} // namespace mozilla
+
+#endif /* VIDEOFRAMECONTAINER_H_ */
diff --git a/dom/media/VideoLimits.h b/dom/media/VideoLimits.h
new file mode 100644
index 000000000..4f124aa0f
--- /dev/null
+++ b/dom/media/VideoLimits.h
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VideoLimits_h
+#define VideoLimits_h
+
+namespace mozilla {
+
+// The maximum height and width of the video. Used for
+// sanitizing the memory allocation of video frame buffers.
+// The maximum resolution we anticipate encountering in the
+// wild is 2160p (UHD "4K") or 4320p - 7680x4320 pixels for VR.
+static const int32_t MAX_VIDEO_WIDTH = 8192;
+static const int32_t MAX_VIDEO_HEIGHT = 4608;
+
+} // namespace mozilla
+
+#endif // VideoLimits_h
diff --git a/dom/media/VideoPlaybackQuality.cpp b/dom/media/VideoPlaybackQuality.cpp
new file mode 100644
index 000000000..01fecfcb9
--- /dev/null
+++ b/dom/media/VideoPlaybackQuality.cpp
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VideoPlaybackQuality.h"
+
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/VideoPlaybackQualityBinding.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+
+namespace mozilla {
+namespace dom {
+
+VideoPlaybackQuality::VideoPlaybackQuality(HTMLMediaElement* aElement,
+ DOMHighResTimeStamp aCreationTime,
+ uint32_t aTotalFrames,
+ uint32_t aDroppedFrames,
+ uint32_t aCorruptedFrames)
+ : mElement(aElement)
+ , mCreationTime(aCreationTime)
+ , mTotalFrames(aTotalFrames)
+ , mDroppedFrames(aDroppedFrames)
+ , mCorruptedFrames(aCorruptedFrames)
+{
+}
+
+HTMLMediaElement*
+VideoPlaybackQuality::GetParentObject() const
+{
+ return mElement;
+}
+
+JSObject*
+VideoPlaybackQuality::WrapObject(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return VideoPlaybackQualityBinding::Wrap(aCx, this, aGivenProto);
+}
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(VideoPlaybackQuality, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(VideoPlaybackQuality, Release)
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(VideoPlaybackQuality, mElement)
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/VideoPlaybackQuality.h b/dom/media/VideoPlaybackQuality.h
new file mode 100644
index 000000000..6054240c6
--- /dev/null
+++ b/dom/media/VideoPlaybackQuality.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_VideoPlaybackQuality_h_
+#define mozilla_dom_VideoPlaybackQuality_h_
+
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsDOMNavigationTiming.h"
+#include "nsWrapperCache.h"
+
+namespace mozilla {
+namespace dom {
+
+class VideoPlaybackQuality final : public nsWrapperCache
+{
+public:
+ NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(VideoPlaybackQuality)
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(VideoPlaybackQuality)
+
+ VideoPlaybackQuality(HTMLMediaElement* aElement,
+ DOMHighResTimeStamp aCreationTime,
+ uint32_t aTotalFrames,
+ uint32_t aDroppedFrames,
+ uint32_t aCorruptedFrames);
+
+ HTMLMediaElement* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ DOMHighResTimeStamp CreationTime() const
+ {
+ return mCreationTime;
+ }
+
+ uint32_t TotalVideoFrames() const
+ {
+ return mTotalFrames;
+ }
+
+ uint32_t DroppedVideoFrames() const
+ {
+ return mDroppedFrames;
+ }
+
+ uint32_t CorruptedVideoFrames() const
+ {
+ return mCorruptedFrames;
+ }
+
+private:
+ ~VideoPlaybackQuality() {}
+
+ RefPtr<HTMLMediaElement> mElement;
+ DOMHighResTimeStamp mCreationTime;
+ uint32_t mTotalFrames;
+ uint32_t mDroppedFrames;
+ uint32_t mCorruptedFrames;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_VideoPlaybackQuality_h_
diff --git a/dom/media/VideoSegment.cpp b/dom/media/VideoSegment.cpp
new file mode 100644
index 000000000..48e4760ba
--- /dev/null
+++ b/dom/media/VideoSegment.cpp
@@ -0,0 +1,121 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VideoSegment.h"
+
+#include "gfx2DGlue.h"
+#include "ImageContainer.h"
+#include "Layers.h"
+#include "mozilla/UniquePtr.h"
+
+namespace mozilla {
+
+using namespace layers;
+
+VideoFrame::VideoFrame(already_AddRefed<Image>& aImage,
+ const gfx::IntSize& aIntrinsicSize)
+ : mImage(aImage), mIntrinsicSize(aIntrinsicSize), mForceBlack(false),
+ mPrincipalHandle(PRINCIPAL_HANDLE_NONE)
+{}
+
+VideoFrame::VideoFrame()
+ : mIntrinsicSize(0, 0), mForceBlack(false), mPrincipalHandle(PRINCIPAL_HANDLE_NONE)
+{}
+
+VideoFrame::~VideoFrame()
+{}
+
+void
+VideoFrame::SetNull() {
+ mImage = nullptr;
+ mIntrinsicSize = gfx::IntSize(0, 0);
+ mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
+}
+
+void
+VideoFrame::TakeFrom(VideoFrame* aFrame)
+{
+ mImage = aFrame->mImage.forget();
+ mIntrinsicSize = aFrame->mIntrinsicSize;
+ mForceBlack = aFrame->GetForceBlack();
+ mPrincipalHandle = aFrame->mPrincipalHandle;
+}
+
+/* static */ already_AddRefed<Image>
+VideoFrame::CreateBlackImage(const gfx::IntSize& aSize)
+{
+ RefPtr<ImageContainer> container =
+ LayerManager::CreateImageContainer(ImageContainer::ASYNCHRONOUS);
+ RefPtr<PlanarYCbCrImage> image = container->CreatePlanarYCbCrImage();
+ if (!image) {
+ MOZ_ASSERT(false);
+ return nullptr;
+ }
+
+ int len = ((aSize.width * aSize.height) * 3 / 2);
+
+ // Generate a black image.
+ auto frame = MakeUnique<uint8_t[]>(len);
+ int y = aSize.width * aSize.height;
+ // Fill Y plane.
+ memset(frame.get(), 0x10, y);
+ // Fill Cb/Cr planes.
+ memset(frame.get() + y, 0x80, (len - y));
+
+ const uint8_t lumaBpp = 8;
+ const uint8_t chromaBpp = 4;
+
+ layers::PlanarYCbCrData data;
+ data.mYChannel = frame.get();
+ data.mYSize = gfx::IntSize(aSize.width, aSize.height);
+ data.mYStride = (int32_t) (aSize.width * lumaBpp / 8.0);
+ data.mCbCrStride = (int32_t) (aSize.width * chromaBpp / 8.0);
+ data.mCbChannel = frame.get() + aSize.height * data.mYStride;
+ data.mCrChannel = data.mCbChannel + aSize.height * data.mCbCrStride / 2;
+ data.mCbCrSize = gfx::IntSize(aSize.width / 2, aSize.height / 2);
+ data.mPicX = 0;
+ data.mPicY = 0;
+ data.mPicSize = gfx::IntSize(aSize.width, aSize.height);
+ data.mStereoMode = StereoMode::MONO;
+
+ // Copies data, so we can free data.
+ if (!image->CopyData(data)) {
+ MOZ_ASSERT(false);
+ return nullptr;
+ }
+
+ return image.forget();
+}
+
+VideoChunk::VideoChunk()
+{}
+
+VideoChunk::~VideoChunk()
+{}
+
+void
+VideoSegment::AppendFrame(already_AddRefed<Image>&& aImage,
+ StreamTime aDuration,
+ const IntSize& aIntrinsicSize,
+ const PrincipalHandle& aPrincipalHandle,
+ bool aForceBlack,
+ TimeStamp aTimeStamp)
+{
+ VideoChunk* chunk = AppendChunk(aDuration);
+ chunk->mTimeStamp = aTimeStamp;
+ VideoFrame frame(aImage, aIntrinsicSize);
+ frame.SetForceBlack(aForceBlack);
+ frame.SetPrincipalHandle(aPrincipalHandle);
+ chunk->mFrame.TakeFrom(&frame);
+}
+
+VideoSegment::VideoSegment()
+ : MediaSegmentBase<VideoSegment, VideoChunk>(VIDEO)
+{}
+
+VideoSegment::~VideoSegment()
+{}
+
+} // namespace mozilla
diff --git a/dom/media/VideoSegment.h b/dom/media/VideoSegment.h
new file mode 100644
index 000000000..3c9858a91
--- /dev/null
+++ b/dom/media/VideoSegment.h
@@ -0,0 +1,152 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_VIDEOSEGMENT_H_
+#define MOZILLA_VIDEOSEGMENT_H_
+
+#include "MediaSegment.h"
+#include "nsCOMPtr.h"
+#include "gfxPoint.h"
+#include "ImageContainer.h"
+
+namespace mozilla {
+
+namespace layers {
+class Image;
+} // namespace layers
+
+class VideoFrame {
+public:
+ typedef mozilla::layers::Image Image;
+
+ VideoFrame(already_AddRefed<Image>& aImage, const gfx::IntSize& aIntrinsicSize);
+ VideoFrame();
+ ~VideoFrame();
+
+ bool operator==(const VideoFrame& aFrame) const
+ {
+ return mIntrinsicSize == aFrame.mIntrinsicSize &&
+ mForceBlack == aFrame.mForceBlack &&
+ ((mForceBlack && aFrame.mForceBlack) || mImage == aFrame.mImage) &&
+ mPrincipalHandle == aFrame.mPrincipalHandle;
+ }
+ bool operator!=(const VideoFrame& aFrame) const
+ {
+ return !operator==(aFrame);
+ }
+
+ Image* GetImage() const { return mImage; }
+ void SetForceBlack(bool aForceBlack) { mForceBlack = aForceBlack; }
+ bool GetForceBlack() const { return mForceBlack; }
+ void SetPrincipalHandle(const PrincipalHandle& aPrincipalHandle) { mPrincipalHandle = aPrincipalHandle; }
+ PrincipalHandle GetPrincipalHandle() const { return mPrincipalHandle; }
+ const gfx::IntSize& GetIntrinsicSize() const { return mIntrinsicSize; }
+ void SetNull();
+ void TakeFrom(VideoFrame* aFrame);
+
+ // Create a planar YCbCr black image.
+ static already_AddRefed<Image> CreateBlackImage(const gfx::IntSize& aSize);
+
+protected:
+ // mImage can be null to indicate "no video" (aka "empty frame"). It can
+ // still have an intrinsic size in this case.
+ RefPtr<Image> mImage;
+ // The desired size to render the video frame at.
+ gfx::IntSize mIntrinsicSize;
+ bool mForceBlack;
+ // principalHandle for the image in this frame.
+ // This can be compared to an nsIPrincipal when back on main thread.
+ PrincipalHandle mPrincipalHandle;
+};
+
+struct VideoChunk {
+ VideoChunk();
+ ~VideoChunk();
+ void SliceTo(StreamTime aStart, StreamTime aEnd)
+ {
+ NS_ASSERTION(aStart >= 0 && aStart < aEnd && aEnd <= mDuration,
+ "Slice out of bounds");
+ mDuration = aEnd - aStart;
+ }
+ StreamTime GetDuration() const { return mDuration; }
+ bool CanCombineWithFollowing(const VideoChunk& aOther) const
+ {
+ return aOther.mFrame == mFrame;
+ }
+ bool IsNull() const { return !mFrame.GetImage(); }
+ void SetNull(StreamTime aDuration)
+ {
+ mDuration = aDuration;
+ mFrame.SetNull();
+ mTimeStamp = TimeStamp();
+ }
+ void SetForceBlack(bool aForceBlack) { mFrame.SetForceBlack(aForceBlack); }
+
+ size_t SizeOfExcludingThisIfUnshared(MallocSizeOf aMallocSizeOf) const
+ {
+ // Future:
+ // - mFrame
+ return 0;
+ }
+
+ PrincipalHandle GetPrincipalHandle() const { return mFrame.GetPrincipalHandle(); }
+
+ StreamTime mDuration;
+ VideoFrame mFrame;
+ TimeStamp mTimeStamp;
+};
+
+class VideoSegment : public MediaSegmentBase<VideoSegment, VideoChunk> {
+public:
+ typedef mozilla::layers::Image Image;
+ typedef mozilla::gfx::IntSize IntSize;
+
+ VideoSegment();
+ ~VideoSegment();
+
+ void AppendFrame(already_AddRefed<Image>&& aImage,
+ StreamTime aDuration,
+ const IntSize& aIntrinsicSize,
+ const PrincipalHandle& aPrincipalHandle,
+ bool aForceBlack = false,
+ TimeStamp aTimeStamp = TimeStamp::Now());
+ const VideoFrame* GetLastFrame(StreamTime* aStart = nullptr)
+ {
+ VideoChunk* c = GetLastChunk();
+ if (!c) {
+ return nullptr;
+ }
+ if (aStart) {
+ *aStart = mDuration - c->mDuration;
+ }
+ return &c->mFrame;
+ }
+ // Override default impl
+ void ReplaceWithDisabled() override {
+ for (ChunkIterator i(*this);
+ !i.IsEnded(); i.Next()) {
+ VideoChunk& chunk = *i;
+ chunk.SetForceBlack(true);
+ }
+ }
+
+ // Segment-generic methods not in MediaSegmentBase
+ static Type StaticType() { return VIDEO; }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ bool IsEmpty() const
+ {
+ return mChunks.IsEmpty();
+ }
+
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_VIDEOSEGMENT_H_ */
diff --git a/dom/media/VideoStreamTrack.cpp b/dom/media/VideoStreamTrack.cpp
new file mode 100644
index 000000000..cb36870fd
--- /dev/null
+++ b/dom/media/VideoStreamTrack.cpp
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VideoStreamTrack.h"
+
+#include "MediaStreamVideoSink.h"
+#include "MediaStreamGraph.h"
+
+#include "mozilla/dom/VideoStreamTrackBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+JSObject*
+VideoStreamTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return VideoStreamTrackBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+VideoStreamTrack::AddVideoOutput(MediaStreamVideoSink* aSink)
+{
+ GetOwnedStream()->AddVideoOutput(aSink, mTrackID);
+}
+
+void
+VideoStreamTrack::RemoveVideoOutput(MediaStreamVideoSink* aSink)
+{
+ GetOwnedStream()->RemoveVideoOutput(aSink, mTrackID);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/VideoStreamTrack.h b/dom/media/VideoStreamTrack.h
new file mode 100644
index 000000000..c61463210
--- /dev/null
+++ b/dom/media/VideoStreamTrack.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VIDEOSTREAMTRACK_H_
+#define VIDEOSTREAMTRACK_H_
+
+#include "MediaStreamTrack.h"
+#include "DOMMediaStream.h"
+
+namespace mozilla {
+
+class MediaStreamVideoSink;
+
+namespace dom {
+
+class VideoStreamTrack : public MediaStreamTrack {
+public:
+ VideoStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
+ TrackID aInputTrackID,
+ MediaStreamTrackSource* aSource,
+ const MediaTrackConstraints& aConstraints = MediaTrackConstraints())
+ : MediaStreamTrack(aStream, aTrackID, aInputTrackID, aSource, aConstraints) {}
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ VideoStreamTrack* AsVideoStreamTrack() override { return this; }
+
+ const VideoStreamTrack* AsVideoStreamTrack() const override { return this; }
+
+ void AddVideoOutput(MediaStreamVideoSink* aSink);
+ void RemoveVideoOutput(MediaStreamVideoSink* aSink);
+
+ // WebIDL
+ void GetKind(nsAString& aKind) override { aKind.AssignLiteral("video"); }
+
+protected:
+ already_AddRefed<MediaStreamTrack> CloneInternal(DOMMediaStream* aOwningStream,
+ TrackID aTrackID) override
+ {
+ return do_AddRef(new VideoStreamTrack(aOwningStream,
+ aTrackID,
+ mInputTrackID,
+ mSource,
+ mConstraints));
+ }
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* VIDEOSTREAMTRACK_H_ */
diff --git a/dom/media/VideoTrack.cpp b/dom/media/VideoTrack.cpp
new file mode 100644
index 000000000..f451e381e
--- /dev/null
+++ b/dom/media/VideoTrack.cpp
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/VideoStreamTrack.h"
+#include "mozilla/dom/VideoTrack.h"
+#include "mozilla/dom/VideoTrackBinding.h"
+#include "mozilla/dom/VideoTrackList.h"
+
+namespace mozilla {
+namespace dom {
+
+VideoTrack::VideoTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ VideoStreamTrack* aStreamTarck)
+ : MediaTrack(aId, aKind, aLabel, aLanguage)
+ , mSelected(false)
+ , mVideoStreamTrack(aStreamTarck)
+{
+}
+
+VideoTrack::~VideoTrack()
+{
+}
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(VideoTrack, MediaTrack, mVideoStreamTrack)
+
+NS_IMPL_ADDREF_INHERITED(VideoTrack, MediaTrack)
+NS_IMPL_RELEASE_INHERITED(VideoTrack, MediaTrack)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(VideoTrack)
+NS_INTERFACE_MAP_END_INHERITING(MediaTrack)
+
+JSObject*
+VideoTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return VideoTrackBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void VideoTrack::SetSelected(bool aSelected)
+{
+ SetEnabledInternal(aSelected, MediaTrack::DEFAULT);
+}
+
+void
+VideoTrack::SetEnabledInternal(bool aEnabled, int aFlags)
+{
+ if (aEnabled == mSelected) {
+ return;
+ }
+
+ mSelected = aEnabled;
+
+ // If this VideoTrack is no longer in its original VideoTrackList, then
+ // whether it is selected or not has no effect on its original list.
+ if (!mList) {
+ return;
+ }
+
+ VideoTrackList& list = static_cast<VideoTrackList&>(*mList);
+ if (mSelected) {
+ uint32_t curIndex = 0;
+
+ // Unselect all video tracks except the current one.
+ for (uint32_t i = 0; i < list.Length(); ++i) {
+ if (list[i] == this) {
+ curIndex = i;
+ continue;
+ }
+
+ VideoTrack* track = list[i];
+ track->SetSelected(false);
+ }
+
+ // Set the index of selected video track to the current's index.
+ list.mSelectedIndex = curIndex;
+
+ HTMLMediaElement* element = mList->GetMediaElement();
+ if (element) {
+ element->NotifyMediaTrackEnabled(this);
+ }
+ } else {
+ list.mSelectedIndex = -1;
+
+ HTMLMediaElement* element = mList->GetMediaElement();
+ if (element) {
+ element->NotifyMediaTrackDisabled(this);
+ }
+ }
+
+ // Fire the change event at selection changes on this video track, shall
+ // propose a spec change later.
+ if (!(aFlags & MediaTrack::FIRE_NO_EVENTS)) {
+ list.CreateAndDispatchChangeEvent();
+ }
+}
+
+} // namespace dom
+} //namespace mozilla
diff --git a/dom/media/VideoTrack.h b/dom/media/VideoTrack.h
new file mode 100644
index 000000000..8675f7284
--- /dev/null
+++ b/dom/media/VideoTrack.h
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_VideoTrack_h
+#define mozilla_dom_VideoTrack_h
+
+#include "MediaTrack.h"
+
+namespace mozilla {
+namespace dom {
+
+class VideoTrackList;
+class VideoStreamTrack;
+
+class VideoTrack : public MediaTrack
+{
+public:
+ VideoTrack(const nsAString& aId,
+ const nsAString& aKind,
+ const nsAString& aLabel,
+ const nsAString& aLanguage,
+ VideoStreamTrack* aStreamTarck = nullptr);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VideoTrack, MediaTrack)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ VideoTrack* AsVideoTrack() override
+ {
+ return this;
+ }
+
+ // When fetching media resource, if no video track is selected by the media
+ // resource, then the first VideoTrack object in the list is set selected as
+ // default. If multiple video tracks are selected by its media resource at
+ // fetching phase, then the first enabled video track is set selected.
+ // aFlags contains FIRE_NO_EVENTS because no events are fired in such cases.
+ void SetEnabledInternal(bool aEnabled, int aFlags) override;
+
+ // Get associated video stream track when the video track comes from
+ // MediaStream. This might be nullptr when the src of owning HTMLMediaElement
+ // is not MediaStream.
+ VideoStreamTrack* GetVideoStreamTrack() { return mVideoStreamTrack; }
+
+ // WebIDL
+ bool Selected() const
+ {
+ return mSelected;
+ }
+
+ // Either zero or one video track is selected in a list; If the selected track
+ // is in a VideoTrackList, then all the other VideoTrack objects in that list
+ // must be unselected.
+ void SetSelected(bool aSelected);
+
+private:
+ virtual ~VideoTrack();
+
+ bool mSelected;
+ RefPtr<VideoStreamTrack> mVideoStreamTrack;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_VideoTrack_h
diff --git a/dom/media/VideoTrackList.cpp b/dom/media/VideoTrackList.cpp
new file mode 100644
index 000000000..ad16b7086
--- /dev/null
+++ b/dom/media/VideoTrackList.cpp
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/VideoTrack.h"
+#include "mozilla/dom/VideoTrackList.h"
+#include "mozilla/dom/VideoTrackListBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+JSObject*
+VideoTrackList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return VideoTrackListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+VideoTrack*
+VideoTrackList::operator[](uint32_t aIndex)
+{
+ MediaTrack* track = MediaTrackList::operator[](aIndex);
+ return track->AsVideoTrack();
+}
+
+void
+VideoTrackList::RemoveTrack(const RefPtr<MediaTrack>& aTrack)
+{
+ // we need to find the video track before |MediaTrackList::RemoveTrack|. Or
+ // mSelectedIndex will not be valid. The check of mSelectedIndex == -1
+ // need to be done after RemoveTrack. Also the call of
+ // |MediaTrackList::RemoveTrack| is necessary even when mSelectedIndex = -1.
+ bool found;
+ VideoTrack* selectedVideoTrack = IndexedGetter(mSelectedIndex, found);
+ MediaTrackList::RemoveTrack(aTrack);
+ if (mSelectedIndex == -1) {
+ // There was no selected track and we don't select another track on removal.
+ return;
+ }
+ MOZ_ASSERT(found, "When mSelectedIndex is set it should point to a track");
+ MOZ_ASSERT(selectedVideoTrack, "The mSelectedIndex should be set to video track only");
+
+ // Let the caller of RemoveTrack deal with choosing the new selected track if
+ // it removes the currently-selected track.
+ if (aTrack == selectedVideoTrack) {
+ mSelectedIndex = -1;
+ return;
+ }
+
+ // The removed track was not the selected track and there is a
+ // currently-selected video track. We need to find the new location of the
+ // selected track.
+ for (size_t ix = 0; ix < mTracks.Length(); ix++) {
+ if (mTracks[ix] == selectedVideoTrack) {
+ mSelectedIndex = ix;
+ return;
+ }
+ }
+}
+
+void
+VideoTrackList::EmptyTracks()
+{
+ mSelectedIndex = -1;
+ MediaTrackList::EmptyTracks();
+}
+
+VideoTrack* VideoTrackList::GetSelectedTrack()
+{
+ if (mSelectedIndex < 0 || static_cast<size_t>(mSelectedIndex) >= mTracks.Length()) {
+ return nullptr;
+ }
+
+ return operator[](mSelectedIndex);
+}
+
+VideoTrack*
+VideoTrackList::IndexedGetter(uint32_t aIndex, bool& aFound)
+{
+ MediaTrack* track = MediaTrackList::IndexedGetter(aIndex, aFound);
+ return track ? track->AsVideoTrack() : nullptr;
+}
+
+VideoTrack*
+VideoTrackList::GetTrackById(const nsAString& aId)
+{
+ MediaTrack* track = MediaTrackList::GetTrackById(aId);
+ return track ? track->AsVideoTrack() : nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/VideoTrackList.h b/dom/media/VideoTrackList.h
new file mode 100644
index 000000000..6b41a2539
--- /dev/null
+++ b/dom/media/VideoTrackList.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 et tw=78: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_VideoTrackList_h
+#define mozilla_dom_VideoTrackList_h
+
+#include "MediaTrack.h"
+#include "MediaTrackList.h"
+
+namespace mozilla {
+namespace dom {
+
+class VideoTrack;
+
+class VideoTrackList : public MediaTrackList
+{
+public:
+ VideoTrackList(nsPIDOMWindowInner* aOwnerWindow,
+ HTMLMediaElement* aMediaElement)
+ : MediaTrackList(aOwnerWindow, aMediaElement)
+ , mSelectedIndex(-1)
+ {}
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ VideoTrack* operator[](uint32_t aIndex);
+
+ void RemoveTrack(const RefPtr<MediaTrack>& aTrack) override;
+
+ void EmptyTracks() override;
+
+ VideoTrack* GetSelectedTrack();
+
+ // WebIDL
+ int32_t SelectedIndex() const
+ {
+ return mSelectedIndex;
+ }
+
+ VideoTrack* IndexedGetter(uint32_t aIndex, bool& aFound);
+
+ VideoTrack* GetTrackById(const nsAString& aId);
+
+ friend class VideoTrack;
+
+protected:
+ VideoTrackList* AsVideoTrackList() override { return this; }
+
+private:
+ int32_t mSelectedIndex;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_VideoTrackList_h
diff --git a/dom/media/VideoUtils.cpp b/dom/media/VideoUtils.cpp
new file mode 100644
index 000000000..5c00e54bc
--- /dev/null
+++ b/dom/media/VideoUtils.cpp
@@ -0,0 +1,526 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VideoUtils.h"
+
+#include "mozilla/Base64.h"
+#include "mozilla/TaskQueue.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/Function.h"
+
+#include "MediaContentType.h"
+#include "MediaPrefs.h"
+#include "MediaResource.h"
+#include "TimeUnits.h"
+#include "nsMathUtils.h"
+#include "nsSize.h"
+#include "VorbisUtils.h"
+#include "ImageContainer.h"
+#include "mozilla/SharedThreadPool.h"
+#include "nsIRandomGenerator.h"
+#include "nsIServiceManager.h"
+#include "nsServiceManagerUtils.h"
+#include "nsIConsoleService.h"
+#include "nsThreadUtils.h"
+#include "nsCharSeparatedTokenizer.h"
+#include "nsContentTypeParser.h"
+
+#include <stdint.h>
+
+namespace mozilla {
+
+NS_NAMED_LITERAL_CSTRING(kEMEKeySystemClearkey, "org.w3.clearkey");
+NS_NAMED_LITERAL_CSTRING(kEMEKeySystemWidevine, "com.widevine.alpha");
+NS_NAMED_LITERAL_CSTRING(kEMEKeySystemPrimetime, "com.adobe.primetime");
+
+using layers::PlanarYCbCrImage;
+
+CheckedInt64 SaferMultDiv(int64_t aValue, uint32_t aMul, uint32_t aDiv) {
+ int64_t major = aValue / aDiv;
+ int64_t remainder = aValue % aDiv;
+ return CheckedInt64(remainder) * aMul / aDiv + CheckedInt64(major) * aMul;
+}
+
+// Converts from number of audio frames to microseconds, given the specified
+// audio rate.
+CheckedInt64 FramesToUsecs(int64_t aFrames, uint32_t aRate) {
+ return SaferMultDiv(aFrames, USECS_PER_S, aRate);
+}
+
+media::TimeUnit FramesToTimeUnit(int64_t aFrames, uint32_t aRate) {
+ int64_t major = aFrames / aRate;
+ int64_t remainder = aFrames % aRate;
+ return media::TimeUnit::FromMicroseconds(major) * USECS_PER_S +
+ (media::TimeUnit::FromMicroseconds(remainder) * USECS_PER_S) / aRate;
+}
+
+// Converts from microseconds to number of audio frames, given the specified
+// audio rate.
+CheckedInt64 UsecsToFrames(int64_t aUsecs, uint32_t aRate) {
+ return SaferMultDiv(aUsecs, aRate, USECS_PER_S);
+}
+
+// Format TimeUnit as number of frames at given rate.
+CheckedInt64 TimeUnitToFrames(const media::TimeUnit& aTime, uint32_t aRate) {
+ return UsecsToFrames(aTime.ToMicroseconds(), aRate);
+}
+
+nsresult SecondsToUsecs(double aSeconds, int64_t& aOutUsecs) {
+ if (aSeconds * double(USECS_PER_S) > INT64_MAX) {
+ return NS_ERROR_FAILURE;
+ }
+ aOutUsecs = int64_t(aSeconds * double(USECS_PER_S));
+ return NS_OK;
+}
+
+static int32_t ConditionDimension(float aValue)
+{
+ // This will exclude NaNs and too-big values.
+ if (aValue > 1.0 && aValue <= INT32_MAX)
+ return int32_t(NS_round(aValue));
+ return 0;
+}
+
+void ScaleDisplayByAspectRatio(nsIntSize& aDisplay, float aAspectRatio)
+{
+ if (aAspectRatio > 1.0) {
+ // Increase the intrinsic width
+ aDisplay.width = ConditionDimension(aAspectRatio * aDisplay.width);
+ } else {
+ // Increase the intrinsic height
+ aDisplay.height = ConditionDimension(aDisplay.height / aAspectRatio);
+ }
+}
+
+static int64_t BytesToTime(int64_t offset, int64_t length, int64_t durationUs) {
+ NS_ASSERTION(length > 0, "Must have positive length");
+ double r = double(offset) / double(length);
+ if (r > 1.0)
+ r = 1.0;
+ return int64_t(double(durationUs) * r);
+}
+
+media::TimeIntervals GetEstimatedBufferedTimeRanges(mozilla::MediaResource* aStream,
+ int64_t aDurationUsecs)
+{
+ media::TimeIntervals buffered;
+ // Nothing to cache if the media takes 0us to play.
+ if (aDurationUsecs <= 0 || !aStream)
+ return buffered;
+
+ // Special case completely cached files. This also handles local files.
+ if (aStream->IsDataCachedToEndOfResource(0)) {
+ buffered +=
+ media::TimeInterval(media::TimeUnit::FromMicroseconds(0),
+ media::TimeUnit::FromMicroseconds(aDurationUsecs));
+ return buffered;
+ }
+
+ int64_t totalBytes = aStream->GetLength();
+
+ // If we can't determine the total size, pretend that we have nothing
+ // buffered. This will put us in a state of eternally-low-on-undecoded-data
+ // which is not great, but about the best we can do.
+ if (totalBytes <= 0)
+ return buffered;
+
+ int64_t startOffset = aStream->GetNextCachedData(0);
+ while (startOffset >= 0) {
+ int64_t endOffset = aStream->GetCachedDataEnd(startOffset);
+ // Bytes [startOffset..endOffset] are cached.
+ NS_ASSERTION(startOffset >= 0, "Integer underflow in GetBuffered");
+ NS_ASSERTION(endOffset >= 0, "Integer underflow in GetBuffered");
+
+ int64_t startUs = BytesToTime(startOffset, totalBytes, aDurationUsecs);
+ int64_t endUs = BytesToTime(endOffset, totalBytes, aDurationUsecs);
+ if (startUs != endUs) {
+ buffered +=
+ media::TimeInterval(media::TimeUnit::FromMicroseconds(startUs),
+
+ media::TimeUnit::FromMicroseconds(endUs));
+ }
+ startOffset = aStream->GetNextCachedData(endOffset);
+ }
+ return buffered;
+}
+
+void DownmixStereoToMono(mozilla::AudioDataValue* aBuffer,
+ uint32_t aFrames)
+{
+ MOZ_ASSERT(aBuffer);
+ const int channels = 2;
+ for (uint32_t fIdx = 0; fIdx < aFrames; ++fIdx) {
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ float sample = 0.0;
+#else
+ int sample = 0;
+#endif
+ // The sample of the buffer would be interleaved.
+ sample = (aBuffer[fIdx*channels] + aBuffer[fIdx*channels + 1]) * 0.5;
+ aBuffer[fIdx*channels] = aBuffer[fIdx*channels + 1] = sample;
+ }
+}
+
+bool
+IsVideoContentType(const nsCString& aContentType)
+{
+ NS_NAMED_LITERAL_CSTRING(video, "video");
+ if (FindInReadable(video, aContentType)) {
+ return true;
+ }
+ return false;
+}
+
+bool
+IsValidVideoRegion(const nsIntSize& aFrame, const nsIntRect& aPicture,
+ const nsIntSize& aDisplay)
+{
+ return
+ aFrame.width <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aFrame.height <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aFrame.width * aFrame.height <= MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT &&
+ aFrame.width * aFrame.height != 0 &&
+ aPicture.width <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aPicture.x < PlanarYCbCrImage::MAX_DIMENSION &&
+ aPicture.x + aPicture.width < PlanarYCbCrImage::MAX_DIMENSION &&
+ aPicture.height <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aPicture.y < PlanarYCbCrImage::MAX_DIMENSION &&
+ aPicture.y + aPicture.height < PlanarYCbCrImage::MAX_DIMENSION &&
+ aPicture.width * aPicture.height <= MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT &&
+ aPicture.width * aPicture.height != 0 &&
+ aDisplay.width <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aDisplay.height <= PlanarYCbCrImage::MAX_DIMENSION &&
+ aDisplay.width * aDisplay.height <= MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT &&
+ aDisplay.width * aDisplay.height != 0;
+}
+
+already_AddRefed<SharedThreadPool> GetMediaThreadPool(MediaThreadType aType)
+{
+ const char *name;
+ switch (aType) {
+ case MediaThreadType::PLATFORM_DECODER:
+ name = "MediaPDecoder";
+ break;
+ default:
+ MOZ_FALLTHROUGH_ASSERT("Unexpected MediaThreadType");
+ case MediaThreadType::PLAYBACK:
+ name = "MediaPlayback";
+ break;
+ }
+ return SharedThreadPool::
+ Get(nsDependentCString(name), MediaPrefs::MediaThreadPoolDefaultCount());
+}
+
+bool
+ExtractH264CodecDetails(const nsAString& aCodec,
+ int16_t& aProfile,
+ int16_t& aLevel)
+{
+ // H.264 codecs parameters have a type defined as avcN.PPCCLL, where
+ // N = avc type. avc3 is avcc with SPS & PPS implicit (within stream)
+ // PP = profile_idc, CC = constraint_set flags, LL = level_idc.
+ // We ignore the constraint_set flags, as it's not clear from any
+ // documentation what constraints the platform decoders support.
+ // See http://blog.pearce.org.nz/2013/11/what-does-h264avc1-codecs-parameters.html
+ // for more details.
+ if (aCodec.Length() != strlen("avc1.PPCCLL")) {
+ return false;
+ }
+
+ // Verify the codec starts with "avc1." or "avc3.".
+ const nsAString& sample = Substring(aCodec, 0, 5);
+ if (!sample.EqualsASCII("avc1.") && !sample.EqualsASCII("avc3.")) {
+ return false;
+ }
+
+ // Extract the profile_idc and level_idc.
+ nsresult rv = NS_OK;
+ aProfile = PromiseFlatString(Substring(aCodec, 5, 2)).ToInteger(&rv, 16);
+ NS_ENSURE_SUCCESS(rv, false);
+
+ aLevel = PromiseFlatString(Substring(aCodec, 9, 2)).ToInteger(&rv, 16);
+ NS_ENSURE_SUCCESS(rv, false);
+
+ if (aLevel == 9) {
+ aLevel = H264_LEVEL_1_b;
+ } else if (aLevel <= 5) {
+ aLevel *= 10;
+ }
+
+ // Capture the constraint_set flag value for the purpose of Telemetry.
+ // We don't NS_ENSURE_SUCCESS here because ExtractH264CodecDetails doesn't
+ // care about this, but we make sure constraints is above 4 (constraint_set5_flag)
+ // otherwise collect 0 for unknown.
+ uint8_t constraints = PromiseFlatString(Substring(aCodec, 7, 2)).ToInteger(&rv, 16);
+ Telemetry::Accumulate(Telemetry::VIDEO_CANPLAYTYPE_H264_CONSTRAINT_SET_FLAG,
+ constraints >= 4 ? constraints : 0);
+
+ // 244 is the highest meaningful profile value (High 4:4:4 Intra Profile)
+ // that can be represented as single hex byte, otherwise collect 0 for unknown.
+ Telemetry::Accumulate(Telemetry::VIDEO_CANPLAYTYPE_H264_PROFILE,
+ aProfile <= 244 ? aProfile : 0);
+
+ // Make sure aLevel represents a value between levels 1 and 5.2,
+ // otherwise collect 0 for unknown.
+ Telemetry::Accumulate(Telemetry::VIDEO_CANPLAYTYPE_H264_LEVEL,
+ (aLevel >= 10 && aLevel <= 52) ? aLevel : 0);
+
+ return true;
+}
+
+nsresult
+GenerateRandomName(nsCString& aOutSalt, uint32_t aLength)
+{
+ nsresult rv;
+ nsCOMPtr<nsIRandomGenerator> rg =
+ do_GetService("@mozilla.org/security/random-generator;1", &rv);
+ if (NS_FAILED(rv)) return rv;
+
+ // For each three bytes of random data we will get four bytes of ASCII.
+ const uint32_t requiredBytesLength =
+ static_cast<uint32_t>((aLength + 3) / 4 * 3);
+
+ uint8_t* buffer;
+ rv = rg->GenerateRandomBytes(requiredBytesLength, &buffer);
+ if (NS_FAILED(rv)) return rv;
+
+ nsAutoCString temp;
+ nsDependentCSubstring randomData(reinterpret_cast<const char*>(buffer),
+ requiredBytesLength);
+ rv = Base64Encode(randomData, temp);
+ free(buffer);
+ buffer = nullptr;
+ if (NS_FAILED (rv)) return rv;
+
+ aOutSalt = temp;
+ return NS_OK;
+}
+
+nsresult
+GenerateRandomPathName(nsCString& aOutSalt, uint32_t aLength)
+{
+ nsresult rv = GenerateRandomName(aOutSalt, aLength);
+ if (NS_FAILED(rv)) return rv;
+
+ // Base64 characters are alphanumeric (a-zA-Z0-9) and '+' and '/', so we need
+ // to replace illegal characters -- notably '/'
+ aOutSalt.ReplaceChar(FILE_PATH_SEPARATOR FILE_ILLEGAL_CHARACTERS, '_');
+ return NS_OK;
+}
+
+already_AddRefed<TaskQueue>
+CreateMediaDecodeTaskQueue()
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
+ return queue.forget();
+}
+
+void
+SimpleTimer::Cancel() {
+ if (mTimer) {
+#ifdef DEBUG
+ nsCOMPtr<nsIEventTarget> target;
+ mTimer->GetTarget(getter_AddRefs(target));
+ nsCOMPtr<nsIThread> thread(do_QueryInterface(target));
+ MOZ_ASSERT(NS_GetCurrentThread() == thread);
+#endif
+ mTimer->Cancel();
+ mTimer = nullptr;
+ }
+ mTask = nullptr;
+}
+
+NS_IMETHODIMP
+SimpleTimer::Notify(nsITimer *timer) {
+ RefPtr<SimpleTimer> deathGrip(this);
+ if (mTask) {
+ mTask->Run();
+ mTask = nullptr;
+ }
+ return NS_OK;
+}
+
+nsresult
+SimpleTimer::Init(nsIRunnable* aTask, uint32_t aTimeoutMs, nsIThread* aTarget)
+{
+ nsresult rv;
+
+ // Get target thread first, so we don't have to cancel the timer if it fails.
+ nsCOMPtr<nsIThread> target;
+ if (aTarget) {
+ target = aTarget;
+ } else {
+ rv = NS_GetMainThread(getter_AddRefs(target));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ }
+
+ nsCOMPtr<nsITimer> timer = do_CreateInstance(NS_TIMER_CONTRACTID, &rv);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ // Note: set target before InitWithCallback in case the timer fires before
+ // we change the event target.
+ rv = timer->SetTarget(aTarget);
+ if (NS_FAILED(rv)) {
+ timer->Cancel();
+ return rv;
+ }
+ rv = timer->InitWithCallback(this, aTimeoutMs, nsITimer::TYPE_ONE_SHOT);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ mTimer = timer.forget();
+ mTask = aTask;
+ return NS_OK;
+}
+
+NS_IMPL_ISUPPORTS(SimpleTimer, nsITimerCallback)
+
+already_AddRefed<SimpleTimer>
+SimpleTimer::Create(nsIRunnable* aTask, uint32_t aTimeoutMs, nsIThread* aTarget)
+{
+ RefPtr<SimpleTimer> t(new SimpleTimer());
+ if (NS_FAILED(t->Init(aTask, aTimeoutMs, aTarget))) {
+ return nullptr;
+ }
+ return t.forget();
+}
+
+void
+LogToBrowserConsole(const nsAString& aMsg)
+{
+ if (!NS_IsMainThread()) {
+ nsString msg(aMsg);
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([msg]() { LogToBrowserConsole(msg); });
+ NS_DispatchToMainThread(task.forget(), NS_DISPATCH_NORMAL);
+ return;
+ }
+ nsCOMPtr<nsIConsoleService> console(
+ do_GetService("@mozilla.org/consoleservice;1"));
+ if (!console) {
+ NS_WARNING("Failed to log message to console.");
+ return;
+ }
+ nsAutoString msg(aMsg);
+ console->LogStringMessage(msg.get());
+}
+
+bool
+ParseCodecsString(const nsAString& aCodecs, nsTArray<nsString>& aOutCodecs)
+{
+ aOutCodecs.Clear();
+ bool expectMoreTokens = false;
+ nsCharSeparatedTokenizer tokenizer(aCodecs, ',');
+ while (tokenizer.hasMoreTokens()) {
+ const nsSubstring& token = tokenizer.nextToken();
+ expectMoreTokens = tokenizer.separatorAfterCurrentToken();
+ aOutCodecs.AppendElement(token);
+ }
+ if (expectMoreTokens) {
+ // Last codec name was empty
+ return false;
+ }
+ return true;
+}
+
+bool
+ParseMIMETypeString(const nsAString& aMIMEType,
+ nsString& aOutContainerType,
+ nsTArray<nsString>& aOutCodecs)
+{
+ nsContentTypeParser parser(aMIMEType);
+ nsresult rv = parser.GetType(aOutContainerType);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ nsString codecsStr;
+ parser.GetParameter("codecs", codecsStr);
+ return ParseCodecsString(codecsStr, aOutCodecs);
+}
+
+bool
+IsH264CodecString(const nsAString& aCodec)
+{
+ int16_t profile = 0;
+ int16_t level = 0;
+ return ExtractH264CodecDetails(aCodec, profile, level);
+}
+
+bool
+IsAACCodecString(const nsAString& aCodec)
+{
+ return
+ aCodec.EqualsLiteral("mp4a.40.2") || // MPEG4 AAC-LC
+ aCodec.EqualsLiteral("mp4a.40.5") || // MPEG4 HE-AAC
+ aCodec.EqualsLiteral("mp4a.67") || // MPEG2 AAC-LC
+ aCodec.EqualsLiteral("mp4a.40.29"); // MPEG4 HE-AACv2
+}
+
+bool
+IsVP8CodecString(const nsAString& aCodec)
+{
+ return aCodec.EqualsLiteral("vp8") ||
+ aCodec.EqualsLiteral("vp8.0");
+}
+
+bool
+IsVP9CodecString(const nsAString& aCodec)
+{
+ return aCodec.EqualsLiteral("vp9") ||
+ aCodec.EqualsLiteral("vp9.0");
+}
+
+template <int N>
+static bool
+StartsWith(const nsACString& string, const char (&prefix)[N])
+{
+ if (N - 1 > string.Length()) {
+ return false;
+ }
+ return memcmp(string.Data(), prefix, N - 1) == 0;
+}
+
+UniquePtr<TrackInfo>
+CreateTrackInfoWithMIMEType(const nsACString& aCodecMIMEType)
+{
+ UniquePtr<TrackInfo> trackInfo;
+ if (StartsWith(aCodecMIMEType, "audio/")) {
+ trackInfo.reset(new AudioInfo());
+ trackInfo->mMimeType = aCodecMIMEType;
+ } else if (StartsWith(aCodecMIMEType, "video/")) {
+ trackInfo.reset(new VideoInfo());
+ trackInfo->mMimeType = aCodecMIMEType;
+ }
+ return trackInfo;
+}
+
+UniquePtr<TrackInfo>
+CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ const nsACString& aCodecMIMEType,
+ const MediaContentType& aContentType)
+{
+ UniquePtr<TrackInfo> trackInfo = CreateTrackInfoWithMIMEType(aCodecMIMEType);
+ if (trackInfo) {
+ VideoInfo* videoInfo = trackInfo->GetAsVideoInfo();
+ if (videoInfo) {
+ Maybe<int32_t> maybeWidth = aContentType.GetWidth();
+ if (maybeWidth && *maybeWidth > 0) {
+ videoInfo->mImage.width = *maybeWidth;
+ }
+ Maybe<int32_t> maybeHeight = aContentType.GetHeight();
+ if (maybeHeight && *maybeHeight > 0) {
+ videoInfo->mImage.height = *maybeHeight;
+ }
+ }
+ }
+ return trackInfo;
+}
+
+} // end namespace mozilla
diff --git a/dom/media/VideoUtils.h b/dom/media/VideoUtils.h
new file mode 100644
index 000000000..441b63792
--- /dev/null
+++ b/dom/media/VideoUtils.h
@@ -0,0 +1,474 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VideoUtils_h
+#define VideoUtils_h
+
+#include "MediaInfo.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/CheckedInt.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/UniquePtr.h"
+
+#include "nsAutoPtr.h"
+#include "nsIThread.h"
+#include "nsSize.h"
+#include "nsRect.h"
+
+#include "nsThreadUtils.h"
+#include "prtime.h"
+#include "AudioSampleFormat.h"
+#include "TimeUnits.h"
+#include "nsITimer.h"
+#include "nsCOMPtr.h"
+#include "VideoLimits.h"
+
+using mozilla::CheckedInt64;
+using mozilla::CheckedUint64;
+using mozilla::CheckedInt32;
+using mozilla::CheckedUint32;
+
+// This file contains stuff we'd rather put elsewhere, but which is
+// dependent on other changes which we don't want to wait for. We plan to
+// remove this file in the near future.
+
+
+// This belongs in xpcom/monitor/Monitor.h, once we've made
+// mozilla::Monitor non-reentrant.
+namespace mozilla {
+
+class MediaContentType;
+
+// EME Key System String.
+extern const nsLiteralCString kEMEKeySystemClearkey;
+extern const nsLiteralCString kEMEKeySystemWidevine;
+extern const nsLiteralCString kEMEKeySystemPrimetime;
+
+/**
+ * ReentrantMonitorConditionallyEnter
+ *
+ * Enters the supplied monitor only if the conditional value |aEnter| is true.
+ * E.g. Used to allow unmonitored read access on the decode thread,
+ * and monitored access on all other threads.
+ */
+class MOZ_STACK_CLASS ReentrantMonitorConditionallyEnter
+{
+public:
+ ReentrantMonitorConditionallyEnter(bool aEnter,
+ ReentrantMonitor &aReentrantMonitor) :
+ mReentrantMonitor(nullptr)
+ {
+ MOZ_COUNT_CTOR(ReentrantMonitorConditionallyEnter);
+ if (aEnter) {
+ mReentrantMonitor = &aReentrantMonitor;
+ NS_ASSERTION(mReentrantMonitor, "null monitor");
+ mReentrantMonitor->Enter();
+ }
+ }
+ ~ReentrantMonitorConditionallyEnter(void)
+ {
+ if (mReentrantMonitor) {
+ mReentrantMonitor->Exit();
+ }
+ MOZ_COUNT_DTOR(ReentrantMonitorConditionallyEnter);
+ }
+private:
+ // Restrict to constructor and destructor defined above.
+ ReentrantMonitorConditionallyEnter();
+ ReentrantMonitorConditionallyEnter(const ReentrantMonitorConditionallyEnter&);
+ ReentrantMonitorConditionallyEnter& operator =(const ReentrantMonitorConditionallyEnter&);
+ static void* operator new(size_t) CPP_THROW_NEW;
+ static void operator delete(void*);
+
+ ReentrantMonitor* mReentrantMonitor;
+};
+
+// Shuts down a thread asynchronously.
+class ShutdownThreadEvent : public Runnable
+{
+public:
+ explicit ShutdownThreadEvent(nsIThread* aThread) : mThread(aThread) {}
+ ~ShutdownThreadEvent() {}
+ NS_IMETHOD Run() override {
+ mThread->Shutdown();
+ mThread = nullptr;
+ return NS_OK;
+ }
+private:
+ nsCOMPtr<nsIThread> mThread;
+};
+
+template<class T>
+class DeleteObjectTask: public Runnable {
+public:
+ explicit DeleteObjectTask(nsAutoPtr<T>& aObject)
+ : mObject(aObject)
+ {
+ }
+ NS_IMETHOD Run() override {
+ NS_ASSERTION(NS_IsMainThread(), "Must be on main thread.");
+ mObject = nullptr;
+ return NS_OK;
+ }
+private:
+ nsAutoPtr<T> mObject;
+};
+
+template<class T>
+void DeleteOnMainThread(nsAutoPtr<T>& aObject) {
+ NS_DispatchToMainThread(new DeleteObjectTask<T>(aObject));
+}
+
+class MediaResource;
+
+// Estimates the buffered ranges of a MediaResource using a simple
+// (byteOffset/length)*duration method. Probably inaccurate, but won't
+// do file I/O, and can be used when we don't have detailed knowledge
+// of the byte->time mapping of a resource. aDurationUsecs is the duration
+// of the media in microseconds. Estimated buffered ranges are stored in
+// aOutBuffered. Ranges are 0-normalized, i.e. in the range of (0,duration].
+media::TimeIntervals GetEstimatedBufferedTimeRanges(mozilla::MediaResource* aStream,
+ int64_t aDurationUsecs);
+
+// Converts from number of audio frames (aFrames) to microseconds, given
+// the specified audio rate (aRate).
+CheckedInt64 FramesToUsecs(int64_t aFrames, uint32_t aRate);
+// Converts from number of audio frames (aFrames) TimeUnit, given
+// the specified audio rate (aRate).
+media::TimeUnit FramesToTimeUnit(int64_t aFrames, uint32_t aRate);
+// Perform aValue * aMul / aDiv, reducing the possibility of overflow due to
+// aValue * aMul overflowing.
+CheckedInt64 SaferMultDiv(int64_t aValue, uint32_t aMul, uint32_t aDiv);
+
+// Converts from microseconds (aUsecs) to number of audio frames, given the
+// specified audio rate (aRate). Stores the result in aOutFrames. Returns
+// true if the operation succeeded, or false if there was an integer
+// overflow while calulating the conversion.
+CheckedInt64 UsecsToFrames(int64_t aUsecs, uint32_t aRate);
+
+// Format TimeUnit as number of frames at given rate.
+CheckedInt64 TimeUnitToFrames(const media::TimeUnit& aTime, uint32_t aRate);
+
+// Converts milliseconds to seconds.
+#define MS_TO_SECONDS(ms) ((double)(ms) / (PR_MSEC_PER_SEC))
+
+// Converts seconds to milliseconds.
+#define SECONDS_TO_MS(s) ((int)((s) * (PR_MSEC_PER_SEC)))
+
+// Converts from seconds to microseconds. Returns failure if the resulting
+// integer is too big to fit in an int64_t.
+nsresult SecondsToUsecs(double aSeconds, int64_t& aOutUsecs);
+
+// Scales the display rect aDisplay by aspect ratio aAspectRatio.
+// Note that aDisplay must be validated by IsValidVideoRegion()
+// before being used!
+void ScaleDisplayByAspectRatio(nsIntSize& aDisplay, float aAspectRatio);
+
+// Downmix Stereo audio samples to Mono.
+// Input are the buffer contains stereo data and the number of frames.
+void DownmixStereoToMono(mozilla::AudioDataValue* aBuffer,
+ uint32_t aFrames);
+
+bool IsVideoContentType(const nsCString& aContentType);
+
+// Returns true if it's safe to use aPicture as the picture to be
+// extracted inside a frame of size aFrame, and scaled up to and displayed
+// at a size of aDisplay. You should validate the frame, picture, and
+// display regions before using them to display video frames.
+bool IsValidVideoRegion(const nsIntSize& aFrame, const nsIntRect& aPicture,
+ const nsIntSize& aDisplay);
+
+// Template to automatically set a variable to a value on scope exit.
+// Useful for unsetting flags, etc.
+template<typename T>
+class AutoSetOnScopeExit {
+public:
+ AutoSetOnScopeExit(T& aVar, T aValue)
+ : mVar(aVar)
+ , mValue(aValue)
+ {}
+ ~AutoSetOnScopeExit() {
+ mVar = mValue;
+ }
+private:
+ T& mVar;
+ const T mValue;
+};
+
+class SharedThreadPool;
+
+// The MediaDataDecoder API blocks, with implementations waiting on platform
+// decoder tasks. These platform decoder tasks are queued on a separate
+// thread pool to ensure they can run when the MediaDataDecoder clients'
+// thread pool is blocked. Tasks on the PLATFORM_DECODER thread pool must not
+// wait on tasks in the PLAYBACK thread pool.
+//
+// No new dependencies on this mechanism should be added, as methods are being
+// made async supported by MozPromise, making this unnecessary and
+// permitting unifying the pool.
+enum class MediaThreadType {
+ PLAYBACK, // MediaDecoderStateMachine and MediaDecoderReader
+ PLATFORM_DECODER
+};
+// Returns the thread pool that is shared amongst all decoder state machines
+// for decoding streams.
+already_AddRefed<SharedThreadPool> GetMediaThreadPool(MediaThreadType aType);
+
+enum H264_PROFILE {
+ H264_PROFILE_UNKNOWN = 0,
+ H264_PROFILE_BASE = 0x42,
+ H264_PROFILE_MAIN = 0x4D,
+ H264_PROFILE_EXTENDED = 0x58,
+ H264_PROFILE_HIGH = 0x64,
+};
+
+enum H264_LEVEL {
+ H264_LEVEL_1 = 10,
+ H264_LEVEL_1_b = 11,
+ H264_LEVEL_1_1 = 11,
+ H264_LEVEL_1_2 = 12,
+ H264_LEVEL_1_3 = 13,
+ H264_LEVEL_2 = 20,
+ H264_LEVEL_2_1 = 21,
+ H264_LEVEL_2_2 = 22,
+ H264_LEVEL_3 = 30,
+ H264_LEVEL_3_1 = 31,
+ H264_LEVEL_3_2 = 32,
+ H264_LEVEL_4 = 40,
+ H264_LEVEL_4_1 = 41,
+ H264_LEVEL_4_2 = 42,
+ H264_LEVEL_5 = 50,
+ H264_LEVEL_5_1 = 51,
+ H264_LEVEL_5_2 = 52
+};
+
+// Extracts the H.264/AVC profile and level from an H.264 codecs string.
+// H.264 codecs parameters have a type defined as avc1.PPCCLL, where
+// PP = profile_idc, CC = constraint_set flags, LL = level_idc.
+// See http://blog.pearce.org.nz/2013/11/what-does-h264avc1-codecs-parameters.html
+// for more details.
+// Returns false on failure.
+bool
+ExtractH264CodecDetails(const nsAString& aCodecs,
+ int16_t& aProfile,
+ int16_t& aLevel);
+
+// Use a cryptographic quality PRNG to generate raw random bytes
+// and convert that to a base64 string.
+nsresult
+GenerateRandomName(nsCString& aOutSalt, uint32_t aLength);
+
+// This version returns a string suitable for use as a file or URL
+// path. This is based on code from nsExternalAppHandler::SetUpTempFile.
+nsresult
+GenerateRandomPathName(nsCString& aOutSalt, uint32_t aLength);
+
+already_AddRefed<TaskQueue>
+CreateMediaDecodeTaskQueue();
+
+// Iteratively invokes aWork until aCondition returns true, or aWork returns false.
+// Use this rather than a while loop to avoid bogarting the task queue.
+template<class Work, class Condition>
+RefPtr<GenericPromise> InvokeUntil(Work aWork, Condition aCondition) {
+ RefPtr<GenericPromise::Private> p = new GenericPromise::Private(__func__);
+
+ if (aCondition()) {
+ p->Resolve(true, __func__);
+ }
+
+ struct Helper {
+ static void Iteration(RefPtr<GenericPromise::Private> aPromise, Work aLocalWork, Condition aLocalCondition) {
+ if (!aLocalWork()) {
+ aPromise->Reject(NS_ERROR_FAILURE, __func__);
+ } else if (aLocalCondition()) {
+ aPromise->Resolve(true, __func__);
+ } else {
+ nsCOMPtr<nsIRunnable> r =
+ NS_NewRunnableFunction([aPromise, aLocalWork, aLocalCondition] () { Iteration(aPromise, aLocalWork, aLocalCondition); });
+ AbstractThread::GetCurrent()->Dispatch(r.forget());
+ }
+ }
+ };
+
+ Helper::Iteration(p, aWork, aCondition);
+ return p.forget();
+}
+
+// Simple timer to run a runnable after a timeout.
+class SimpleTimer : public nsITimerCallback
+{
+public:
+ NS_DECL_ISUPPORTS
+
+ // Create a new timer to run aTask after aTimeoutMs milliseconds
+ // on thread aTarget. If aTarget is null, task is run on the main thread.
+ static already_AddRefed<SimpleTimer> Create(nsIRunnable* aTask,
+ uint32_t aTimeoutMs,
+ nsIThread* aTarget = nullptr);
+ void Cancel();
+
+ NS_IMETHOD Notify(nsITimer *timer) override;
+
+private:
+ virtual ~SimpleTimer() {}
+ nsresult Init(nsIRunnable* aTask, uint32_t aTimeoutMs, nsIThread* aTarget);
+
+ RefPtr<nsIRunnable> mTask;
+ nsCOMPtr<nsITimer> mTimer;
+};
+
+void
+LogToBrowserConsole(const nsAString& aMsg);
+
+bool
+ParseMIMETypeString(const nsAString& aMIMEType,
+ nsString& aOutContainerType,
+ nsTArray<nsString>& aOutCodecs);
+
+bool
+ParseCodecsString(const nsAString& aCodecs, nsTArray<nsString>& aOutCodecs);
+
+bool
+IsH264CodecString(const nsAString& aCodec);
+
+bool
+IsAACCodecString(const nsAString& aCodec);
+
+bool
+IsVP8CodecString(const nsAString& aCodec);
+
+bool
+IsVP9CodecString(const nsAString& aCodec);
+
+// Try and create a TrackInfo with a given codec MIME type.
+UniquePtr<TrackInfo>
+CreateTrackInfoWithMIMEType(const nsACString& aCodecMIMEType);
+
+// Try and create a TrackInfo with a given codec MIME type, and optional extra
+// parameters from a content type (its MIME type and codecs are ignored).
+UniquePtr<TrackInfo>
+CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ const nsACString& aCodecMIMEType,
+ const MediaContentType& aContentType);
+
+template <typename String>
+class StringListRange
+{
+ typedef typename String::char_type CharType;
+ typedef const CharType* Pointer;
+
+public:
+ // Iterator into range, trims items and skips empty items.
+ class Iterator
+ {
+ public:
+ bool operator!=(const Iterator& a) const
+ {
+ return mStart != a.mStart || mEnd != a.mEnd;
+ }
+ Iterator& operator++()
+ {
+ SearchItemAt(mComma + 1);
+ return *this;
+ }
+ typedef decltype(Substring(Pointer(), Pointer())) DereferencedType;
+ DereferencedType operator*()
+ {
+ return Substring(mStart, mEnd);
+ }
+ private:
+ friend class StringListRange;
+ Iterator(const CharType* aRangeStart, uint32_t aLength)
+ : mRangeEnd(aRangeStart + aLength)
+ {
+ SearchItemAt(aRangeStart);
+ }
+ void SearchItemAt(Pointer start)
+ {
+ // First, skip leading whitespace.
+ for (Pointer p = start; ; ++p) {
+ if (p >= mRangeEnd) {
+ mStart = mEnd = mComma = mRangeEnd;
+ return;
+ }
+ auto c = *p;
+ if (c == CharType(',')) {
+ // Comma -> Empty item -> Skip.
+ } else if (c != CharType(' ')) {
+ mStart = p;
+ break;
+ }
+ }
+ // Find comma, recording start of trailing space.
+ Pointer trailingWhitespace = nullptr;
+ for (Pointer p = mStart + 1; ; ++p) {
+ if (p >= mRangeEnd) {
+ mEnd = trailingWhitespace ? trailingWhitespace : p;
+ mComma = p;
+ return;
+ }
+ auto c = *p;
+ if (c == CharType(',')) {
+ mEnd = trailingWhitespace ? trailingWhitespace : p;
+ mComma = p;
+ return;
+ }
+ if (c == CharType(' ')) {
+ // Found a whitespace -> Record as trailing if not first one.
+ if (!trailingWhitespace) {
+ trailingWhitespace = p;
+ }
+ } else {
+ // Found a non-whitespace -> Reset trailing whitespace if needed.
+ if (trailingWhitespace) {
+ trailingWhitespace = nullptr;
+ }
+ }
+ }
+ }
+ const Pointer mRangeEnd;
+ Pointer mStart;
+ Pointer mEnd;
+ Pointer mComma;
+ };
+
+ explicit StringListRange(const String& aList) : mList(aList) {}
+ Iterator begin()
+ {
+ return Iterator(mList.Data(), mList.Length());
+ }
+ Iterator end()
+ {
+ return Iterator(mList.Data() + mList.Length(), 0);
+ }
+private:
+ const String& mList;
+};
+
+template <typename String>
+StringListRange<String>
+MakeStringListRange(const String& aList)
+{
+ return StringListRange<String>(aList);
+}
+
+template <typename ListString, typename ItemString>
+static bool
+StringListContains(const ListString& aList, const ItemString& aItem)
+{
+ for (const auto& listItem : MakeStringListRange(aList)) {
+ if (listItem.Equals(aItem)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // end namespace mozilla
+
+#endif
diff --git a/dom/media/VorbisUtils.h b/dom/media/VorbisUtils.h
new file mode 100644
index 000000000..36ad21448
--- /dev/null
+++ b/dom/media/VorbisUtils.h
@@ -0,0 +1,27 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VORBISUTILS_H_
+#define VORBISUTILS_H_
+
+#ifdef MOZ_SAMPLE_TYPE_S16
+#include <ogg/os_types.h>
+typedef ogg_int32_t VorbisPCMValue;
+
+#define MOZ_CLIP_TO_15(x) ((x)<-32768?-32768:(x)<=32767?(x):32767)
+// Convert the output of vorbis_synthesis_pcmout to a AudioDataValue
+#define MOZ_CONVERT_VORBIS_SAMPLE(x) \
+ (static_cast<AudioDataValue>(MOZ_CLIP_TO_15((x)>>9)))
+
+#else /* MOZ_SAMPLE_TYPE_FLOAT32 */
+
+typedef float VorbisPCMValue;
+
+#define MOZ_CONVERT_VORBIS_SAMPLE(x) (x)
+
+#endif
+
+#endif /* VORBISUTILS_H_ */
diff --git a/dom/media/WebMSample.h b/dom/media/WebMSample.h
new file mode 100644
index 000000000..ee5f0a39e
--- /dev/null
+++ b/dom/media/WebMSample.h
@@ -0,0 +1,22783 @@
+static const uint8_t sWebMSample[] = {
+ 0x1a, 0x45, 0xdf, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
+ 0x42, 0x86, 0x81, 0x01, 0x42, 0xf7, 0x81, 0x01, 0x42, 0xf2, 0x81, 0x04,
+ 0x42, 0xf3, 0x81, 0x08, 0x42, 0x82, 0x84, 0x77, 0x65, 0x62, 0x6d, 0x42,
+ 0x87, 0x81, 0x02, 0x42, 0x85, 0x81, 0x02, 0x18, 0x53, 0x80, 0x67, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x2b, 0x9e, 0x11, 0x4d, 0x9b, 0x74, 0x40,
+ 0x2d, 0x4d, 0xbb, 0x8b, 0x53, 0xab, 0x84, 0x15, 0x49, 0xa9, 0x66, 0x53,
+ 0xac, 0x81, 0xdf, 0x4d, 0xbb, 0x8c, 0x53, 0xab, 0x84, 0x16, 0x54, 0xae,
+ 0x6b, 0x53, 0xac, 0x82, 0x01, 0x54, 0x4d, 0xbb, 0x8d, 0x53, 0xab, 0x84,
+ 0x1c, 0x53, 0xbb, 0x6b, 0x53, 0xac, 0x83, 0x04, 0x2b, 0x81, 0xec, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0x49, 0xa9, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x69, 0x2a, 0xd7, 0xb1, 0x83, 0x0f, 0x42, 0x40, 0x7b, 0xa9, 0xa1,
+ 0x42, 0x69, 0x67, 0x20, 0x42, 0x75, 0x63, 0x6b, 0x20, 0x42, 0x75, 0x6e,
+ 0x6e, 0x79, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x66, 0x6c, 0x6f, 0x77, 0x65,
+ 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x80, 0x8d,
+ 0x4c, 0x61, 0x76, 0x66, 0x35, 0x36, 0x2e, 0x33, 0x36, 0x2e, 0x31, 0x30,
+ 0x30, 0x57, 0x41, 0x8d, 0x4c, 0x61, 0x76, 0x66, 0x35, 0x36, 0x2e, 0x33,
+ 0x36, 0x2e, 0x31, 0x30, 0x30, 0x73, 0xa4, 0x90, 0xbc, 0x12, 0x68, 0xf6,
+ 0x3b, 0xee, 0xc2, 0x39, 0xb9, 0xe1, 0x53, 0xda, 0x25, 0xda, 0xfc, 0x3d,
+ 0x44, 0x89, 0x88, 0x40, 0x6e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16,
+ 0x54, 0xae, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xae,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xd7, 0x81, 0x01, 0x73,
+ 0xc5, 0x81, 0x01, 0x9c, 0x81, 0x00, 0x22, 0xb5, 0x9c, 0x83, 0x75, 0x6e,
+ 0x64, 0x86, 0x85, 0x56, 0x5f, 0x56, 0x50, 0x39, 0x83, 0x81, 0x01, 0x23,
+ 0xe3, 0x83, 0x84, 0x01, 0xfc, 0xa0, 0x55, 0xe0, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0xb0, 0x82, 0x05, 0x00, 0xba, 0x82, 0x02, 0xd0,
+ 0x54, 0xb0, 0x82, 0x05, 0x00, 0x54, 0xba, 0x82, 0x02, 0xd0, 0x1f, 0x43,
+ 0xb6, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x29, 0xce, 0xe7, 0x81,
+ 0x0e, 0xa3, 0x22, 0xf7, 0x4e, 0x81, 0x00, 0x00, 0x80, 0x82, 0x49, 0x83,
+ 0x42, 0x00, 0x4f, 0xf0, 0x2c, 0xf6, 0x00, 0x38, 0x24, 0x1c, 0x18, 0x30,
+ 0x18, 0x06, 0x2c, 0x7f, 0xf9, 0xaf, 0xf9, 0x5f, 0xa0, 0xff, 0x33, 0xf4,
+ 0x7d, 0x1f, 0xa6, 0xf6, 0x9f, 0xcd, 0xfe, 0xf7, 0xfd, 0xe7, 0xf5, 0xff,
+ 0xaf, 0xff, 0x17, 0xf1, 0x3f, 0xe4, 0x3f, 0xc1, 0xff, 0x7b, 0xfe, 0x33,
+ 0xed, 0x9f, 0xf8, 0x1f, 0xe4, 0xff, 0x33, 0xfd, 0xef, 0xab, 0xff, 0x07,
+ 0xe9, 0xbd, 0xda, 0xff, 0x89, 0xfe, 0x6f, 0xf4, 0xff, 0xe3, 0x3f, 0x07,
+ 0xe2, 0xff, 0x81, 0xfc, 0x1f, 0xe9, 0xff, 0xb3, 0xf6, 0x87, 0xf9, 0x5e,
+ 0x63, 0x7f, 0x3f, 0xfa, 0x5f, 0xdb, 0xfd, 0xff, 0xec, 0x7e, 0x0f, 0xf0,
+ 0xff, 0xc9, 0xfe, 0x8f, 0xed, 0xfe, 0x6e, 0xae, 0xfa, 0xdf, 0xb4, 0x3f,
+ 0x9b, 0xba, 0x35, 0xc2, 0xfa, 0xd1, 0xfb, 0x19, 0xf0, 0x7f, 0xdf, 0xff,
+ 0x23, 0xfd, 0xff, 0xf2, 0x3f, 0xc8, 0xff, 0x89, 0xf8, 0x7f, 0xe7, 0xff,
+ 0x91, 0xf8, 0xfe, 0xc5, 0xff, 0x57, 0xec, 0x5f, 0xc5, 0xfe, 0x17, 0x1b,
+ 0x9f, 0x5f, 0xfe, 0x7f, 0xf8, 0x1f, 0xdf, 0x98, 0xb6, 0x17, 0x3c, 0x77,
+ 0xbb, 0x18, 0xa3, 0xd2, 0xf6, 0x42, 0x27, 0xdc, 0xf8, 0x07, 0xe1, 0xfe,
+ 0xa9, 0xfd, 0x11, 0xd3, 0xbd, 0xbf, 0xa8, 0xf5, 0xdf, 0xd7, 0xdc, 0xda,
+ 0x1d, 0x23, 0xf8, 0x1c, 0xc9, 0xde, 0xff, 0xbf, 0x74, 0xef, 0xea, 0x6e,
+ 0x91, 0xea, 0xfc, 0x60, 0xf5, 0x1c, 0xb3, 0x72, 0x4f, 0x92, 0xde, 0xaf,
+ 0xc9, 0x0f, 0xe1, 0x3c, 0x6c, 0xf5, 0x7e, 0x28, 0xff, 0x1b, 0x58, 0xbe,
+ 0xf7, 0xf4, 0x8f, 0x17, 0x7f, 0x6f, 0xf2, 0x07, 0xd5, 0xf8, 0xb5, 0xfa,
+ 0xd4, 0x81, 0xfa, 0x5f, 0x4b, 0xf7, 0x5f, 0xc6, 0xfe, 0xfd, 0xe4, 0x6f,
+ 0xe9, 0xec, 0xa5, 0xf7, 0x45, 0xfe, 0x47, 0xdc, 0x8f, 0xc3, 0xf8, 0xdf,
+ 0xef, 0x7a, 0x2d, 0x07, 0x74, 0x5a, 0xd7, 0x23, 0x36, 0x6f, 0x1d, 0x21,
+ 0xe5, 0xad, 0x91, 0x97, 0x3d, 0x6b, 0xe2, 0xa7, 0xa8, 0x96, 0x9b, 0xbb,
+ 0x96, 0x0b, 0xa3, 0xbc, 0x77, 0x47, 0x27, 0xc3, 0x39, 0xfc, 0xb7, 0x34,
+ 0x76, 0xe8, 0xe4, 0xfc, 0xdb, 0xff, 0x8a, 0xe9, 0x1f, 0xd4, 0x1d, 0x23,
+ 0xf9, 0xcf, 0x1b, 0x3d, 0x45, 0x41, 0xfe, 0x9d, 0xd1, 0x7f, 0x7e, 0xf2,
+ 0x37, 0xf9, 0xff, 0x18, 0x3f, 0x60, 0xbf, 0xb7, 0x40, 0x7e, 0xaf, 0xbe,
+ 0xc7, 0xe2, 0xfb, 0x9c, 0xf9, 0x1f, 0xa7, 0xf7, 0x7c, 0x7f, 0xcd, 0xfa,
+ 0x35, 0x35, 0xba, 0xfa, 0x3d, 0x4d, 0xfe, 0xdf, 0x2c, 0x1f, 0x1c, 0xe7,
+ 0xba, 0xfd, 0x33, 0xa4, 0x7b, 0xbd, 0xed, 0xbe, 0xa7, 0xd5, 0xfb, 0xd0,
+ 0x7b, 0xbd, 0xee, 0x67, 0x84, 0xec, 0x79, 0xef, 0x71, 0x8d, 0xed, 0xbe,
+ 0xe2, 0xf9, 0x47, 0xf4, 0x7f, 0x67, 0xf2, 0x7f, 0x9b, 0xfe, 0x8f, 0xc2,
+ 0xff, 0x5f, 0xeb, 0x7f, 0xc5, 0xea, 0x92, 0x55, 0x9b, 0xd2, 0xf7, 0x29,
+ 0xd6, 0xf1, 0xba, 0x2c, 0x39, 0x7a, 0x8f, 0x15, 0x3f, 0x58, 0x60, 0xe0,
+ 0x80, 0x00, 0x00, 0x00, 0xdb, 0xb2, 0x7f, 0x94, 0x28, 0xff, 0x8e, 0x3f,
+ 0xae, 0x8d, 0x9d, 0xf1, 0xce, 0x16, 0xb8, 0x14, 0x58, 0xd4, 0xcb, 0x27,
+ 0x3d, 0xc0, 0x71, 0x82, 0x61, 0xbe, 0xc3, 0xfa, 0xf3, 0x89, 0x79, 0x80,
+ 0x4c, 0x6a, 0x99, 0x53, 0xe2, 0x4e, 0xfa, 0x2c, 0xb8, 0x37, 0xff, 0xea,
+ 0xbc, 0xbd, 0xc2, 0xf8, 0x2c, 0xa6, 0x8f, 0xff, 0xa5, 0x21, 0x68, 0x67,
+ 0xbe, 0x10, 0x15, 0x6e, 0xfb, 0xae, 0xb7, 0x1a, 0x30, 0x12, 0x8d, 0x4a,
+ 0x0a, 0x4a, 0x47, 0xe4, 0xab, 0xd6, 0x8a, 0x35, 0x53, 0x4e, 0x82, 0xee,
+ 0x7c, 0x69, 0x0c, 0x65, 0x80, 0x59, 0x29, 0xbc, 0xd3, 0xdf, 0x20, 0xf6,
+ 0xa0, 0x8e, 0xfa, 0xb4, 0xea, 0xf4, 0x4c, 0x3d, 0x8f, 0x61, 0x8d, 0x35,
+ 0x05, 0x82, 0xe0, 0xfc, 0xc0, 0xec, 0x7e, 0x09, 0x52, 0xe0, 0xf4, 0xa8,
+ 0x48, 0xa8, 0x71, 0x8b, 0x0a, 0xcd, 0xa6, 0x7d, 0x9e, 0x44, 0x13, 0x34,
+ 0xb7, 0xd7, 0xdf, 0x22, 0xdf, 0xd0, 0xbc, 0xc1, 0x9c, 0xe0, 0x0e, 0x47,
+ 0x60, 0x9e, 0xce, 0x97, 0x48, 0x7c, 0x8a, 0x14, 0x3e, 0xa9, 0x17, 0xf6,
+ 0xc6, 0xf9, 0x3e, 0x3d, 0x3a, 0x32, 0xc6, 0x95, 0x35, 0x05, 0x61, 0x59,
+ 0xad, 0x7b, 0x30, 0xe8, 0xff, 0xbf, 0x1b, 0x81, 0x99, 0xd7, 0xc6, 0xb8,
+ 0x67, 0x9b, 0x50, 0x4e, 0xb3, 0xfc, 0x7c, 0x94, 0xc4, 0xa8, 0x92, 0x2b,
+ 0x43, 0x65, 0x01, 0xbb, 0xce, 0x6e, 0x2d, 0x82, 0xcd, 0x65, 0x6d, 0x16,
+ 0x70, 0x7c, 0x9a, 0xd0, 0xac, 0x7c, 0x56, 0xce, 0x10, 0xd3, 0x2f, 0x2a,
+ 0xc5, 0xc5, 0xcb, 0x3d, 0x40, 0x6b, 0x88, 0x35, 0x69, 0x8e, 0xaf, 0x61,
+ 0x73, 0x2c, 0xfa, 0x36, 0xa5, 0x2f, 0x75, 0xc2, 0x65, 0x37, 0x36, 0x05,
+ 0x08, 0x17, 0xec, 0x4a, 0x27, 0x81, 0xdf, 0x27, 0xdd, 0x7a, 0xa9, 0x45,
+ 0xc3, 0xa1, 0xb3, 0xa9, 0x69, 0xb2, 0x25, 0xf9, 0x5d, 0x49, 0xde, 0xf3,
+ 0xd6, 0x04, 0x0b, 0x8b, 0xde, 0x99, 0x6f, 0x93, 0x2d, 0x99, 0x08, 0x73,
+ 0x6b, 0x69, 0xbf, 0x70, 0x8b, 0x93, 0x1b, 0x78, 0x27, 0xcd, 0x62, 0xb8,
+ 0xff, 0x99, 0xa8, 0xdf, 0xc0, 0x89, 0xd1, 0xd9, 0x1a, 0x08, 0xb2, 0xf3,
+ 0x70, 0xef, 0xc6, 0xf3, 0xdc, 0xd3, 0xc4, 0x1e, 0x03, 0x38, 0xfe, 0xf0,
+ 0x82, 0x41, 0xe5, 0x9f, 0xee, 0xd4, 0xd6, 0x87, 0x95, 0x08, 0xec, 0x01,
+ 0x5d, 0x58, 0x07, 0x84, 0x9a, 0x78, 0x40, 0xa9, 0x44, 0x3b, 0x25, 0xf0,
+ 0xd6, 0x74, 0x66, 0xf5, 0x36, 0x9e, 0x33, 0x3d, 0x1d, 0xc4, 0x00, 0x7e,
+ 0x2a, 0x02, 0xd4, 0xc3, 0xfd, 0xfc, 0x09, 0x8f, 0x89, 0x04, 0x3d, 0xe0,
+ 0x34, 0x03, 0x9d, 0x7a, 0x68, 0x4e, 0x87, 0xbf, 0x19, 0x4f, 0x3f, 0x48,
+ 0xb2, 0xf7, 0x54, 0xc6, 0xc3, 0xe8, 0x9d, 0xc8, 0xf1, 0x05, 0x9c, 0x22,
+ 0xac, 0x43, 0xac, 0x0e, 0x34, 0x0e, 0x86, 0x8f, 0xfe, 0xdf, 0xde, 0x7d,
+ 0xb8, 0xe3, 0x7b, 0x28, 0x41, 0xa0, 0x4a, 0x62, 0x84, 0x4e, 0xe2, 0xa8,
+ 0x13, 0x0c, 0x74, 0x41, 0xe0, 0x52, 0xdc, 0x70, 0xc2, 0x43, 0xea, 0xc5,
+ 0xf6, 0xac, 0x67, 0xa2, 0x75, 0x59, 0x35, 0x4b, 0xda, 0xd9, 0x46, 0x82,
+ 0x6c, 0x56, 0xe9, 0x7f, 0x69, 0xdb, 0xf4, 0x7c, 0xf4, 0x61, 0x04, 0x84,
+ 0xc7, 0x5d, 0x6d, 0xbb, 0x75, 0x0a, 0xb6, 0x33, 0xe6, 0x04, 0x18, 0x41,
+ 0x9d, 0x30, 0x17, 0xd3, 0x8f, 0x01, 0x1d, 0xb1, 0xa7, 0x7e, 0x14, 0x6b,
+ 0x81, 0x51, 0xbe, 0x30, 0xfa, 0x79, 0x45, 0x8e, 0x87, 0x5f, 0x9e, 0x42,
+ 0xdd, 0x57, 0x6e, 0x7f, 0xb9, 0x8f, 0x54, 0xd3, 0x15, 0x78, 0xf5, 0x21,
+ 0x24, 0xb9, 0x38, 0xcb, 0xde, 0xf2, 0x3b, 0x5e, 0x9c, 0x80, 0x9b, 0x69,
+ 0x62, 0x06, 0x54, 0x77, 0x73, 0xb5, 0x15, 0xef, 0xc8, 0x91, 0x4d, 0x53,
+ 0x41, 0xd6, 0x7b, 0x83, 0x4d, 0x8b, 0x75, 0x5b, 0xc3, 0x94, 0x9a, 0xd2,
+ 0xdb, 0x28, 0x81, 0xd2, 0x23, 0x6a, 0x9e, 0xef, 0xea, 0xa2, 0x1c, 0x31,
+ 0xb5, 0x24, 0x34, 0xee, 0x05, 0xfd, 0xbf, 0x01, 0x97, 0xca, 0x26, 0xeb,
+ 0x8e, 0x2c, 0xb3, 0xcc, 0x9e, 0x4a, 0xc5, 0x12, 0x83, 0x65, 0x3c, 0x5a,
+ 0x67, 0xa8, 0x7c, 0x89, 0x71, 0x28, 0x98, 0x6c, 0x1f, 0x57, 0x6b, 0x28,
+ 0xdf, 0x67, 0xa4, 0x1e, 0x10, 0x7a, 0x87, 0x4c, 0x0a, 0x62, 0x3a, 0xd6,
+ 0x60, 0xe9, 0x16, 0xe3, 0x36, 0x4d, 0x0f, 0x05, 0x9d, 0x7d, 0xe6, 0x8f,
+ 0xa7, 0x22, 0x35, 0x2e, 0x1a, 0xd5, 0x2f, 0xf5, 0xf0, 0xe1, 0x0d, 0xd1,
+ 0x36, 0x80, 0xc8, 0x99, 0x70, 0x50, 0x81, 0x41, 0x0c, 0x50, 0x54, 0xe3,
+ 0x43, 0xaf, 0xfd, 0xed, 0xef, 0x90, 0x56, 0x66, 0x24, 0x47, 0x7f, 0x1d,
+ 0x4a, 0x3e, 0x0d, 0xc8, 0x51, 0x65, 0xbc, 0xdf, 0x79, 0x28, 0x25, 0xea,
+ 0xac, 0x88, 0x4d, 0x41, 0xe4, 0x81, 0x90, 0x64, 0x36, 0x99, 0x78, 0xec,
+ 0xae, 0xd0, 0xfe, 0x93, 0xf3, 0xba, 0x9e, 0x39, 0xb6, 0xa1, 0x8b, 0x90,
+ 0xcb, 0xf9, 0xf9, 0xd0, 0xf2, 0xf1, 0x78, 0xc4, 0x09, 0xe9, 0xba, 0x26,
+ 0x7f, 0xf5, 0x0e, 0x99, 0x6c, 0xab, 0x5e, 0x92, 0xf3, 0x19, 0xbb, 0xc9,
+ 0x4f, 0x24, 0x88, 0x11, 0xd9, 0xa7, 0x4a, 0x33, 0x8d, 0xdb, 0x90, 0xfb,
+ 0xb6, 0xff, 0x5b, 0xdf, 0x9f, 0xb1, 0xee, 0x5e, 0x90, 0x9c, 0xaf, 0x5e,
+ 0xaf, 0xc3, 0x7d, 0x4d, 0x93, 0x3d, 0x25, 0x89, 0x05, 0x38, 0x6e, 0x01,
+ 0x17, 0xa7, 0xac, 0x0f, 0x52, 0xc4, 0x3e, 0xfc, 0x79, 0x90, 0xbe, 0x63,
+ 0xf5, 0x97, 0x1b, 0xcd, 0xc7, 0x87, 0xeb, 0x6a, 0x20, 0xe5, 0x18, 0x66,
+ 0x43, 0x54, 0x82, 0xe0, 0x7b, 0x9a, 0x1b, 0xc2, 0xe9, 0x59, 0xb4, 0x4a,
+ 0x18, 0x5c, 0x6d, 0x7d, 0x7e, 0x7d, 0x21, 0xda, 0x90, 0x7a, 0x0f, 0x5a,
+ 0x89, 0xfd, 0x43, 0xc2, 0xc9, 0xb5, 0x67, 0x8e, 0x97, 0xef, 0x2e, 0xfd,
+ 0xda, 0x71, 0x74, 0xda, 0x00, 0x75, 0xed, 0x4a, 0xb1, 0x3d, 0x57, 0x99,
+ 0xe1, 0x3c, 0x29, 0x8f, 0x84, 0x18, 0xf7, 0x47, 0xe9, 0x2f, 0x74, 0x38,
+ 0xe6, 0xaf, 0xbf, 0xfd, 0x1f, 0x64, 0x17, 0x5d, 0x7f, 0xfa, 0x24, 0x10,
+ 0x58, 0xcf, 0x7d, 0x80, 0x5e, 0x39, 0x38, 0xa2, 0x11, 0x0f, 0xf6, 0x5b,
+ 0xdb, 0xd3, 0xbd, 0x9c, 0x18, 0x6b, 0x88, 0x5c, 0xf1, 0x08, 0x21, 0x98,
+ 0xd2, 0x81, 0x16, 0x94, 0xf1, 0x07, 0xfc, 0xcc, 0x92, 0xc5, 0x04, 0xb8,
+ 0x06, 0x6a, 0x79, 0x9a, 0xad, 0x01, 0xf0, 0xba, 0x5c, 0xf1, 0xe6, 0xe3,
+ 0xb7, 0x4e, 0xcd, 0x1c, 0x43, 0x89, 0x48, 0xab, 0x03, 0x4d, 0xe4, 0xd6,
+ 0x14, 0xad, 0xf7, 0xf3, 0xc0, 0xda, 0x51, 0xe2, 0xa9, 0x56, 0xf7, 0xcb,
+ 0x98, 0x70, 0x9e, 0x88, 0x6d, 0xe6, 0xa0, 0x06, 0xfd, 0x92, 0xf0, 0xb8,
+ 0x16, 0xe9, 0x8d, 0x79, 0x60, 0x1b, 0x4b, 0x0b, 0x0e, 0xa1, 0xd5, 0x51,
+ 0x98, 0x17, 0xc0, 0xa8, 0xf1, 0x6b, 0x19, 0xd1, 0x24, 0xed, 0x7f, 0xdf,
+ 0x57, 0xfc, 0xa7, 0xf5, 0xdc, 0xce, 0x7e, 0xc2, 0x00, 0x09, 0x6e, 0xf5,
+ 0x99, 0x10, 0x5f, 0x7f, 0x5c, 0x97, 0xe8, 0xb0, 0xd8, 0xd4, 0x78, 0x0e,
+ 0xd3, 0xa3, 0x4b, 0x69, 0xb1, 0xf9, 0x6a, 0x98, 0x86, 0x88, 0x5c, 0x61,
+ 0x2b, 0x47, 0x62, 0x53, 0x53, 0xb1, 0xe8, 0x29, 0x5e, 0xaa, 0x26, 0x29,
+ 0xdd, 0x6a, 0xe9, 0x2c, 0xd4, 0x80, 0xbc, 0xdf, 0x97, 0x5d, 0xf3, 0x3f,
+ 0xec, 0xd5, 0x5c, 0xa7, 0xdc, 0xa0, 0x78, 0xee, 0xaf, 0x37, 0x5e, 0x4c,
+ 0x6f, 0xce, 0x9b, 0x41, 0xbf, 0x51, 0x46, 0x68, 0x80, 0x27, 0x4c, 0x21,
+ 0x0e, 0xdc, 0xae, 0xb5, 0x2f, 0x01, 0x15, 0x1a, 0x03, 0x66, 0x6c, 0xd9,
+ 0x68, 0xb7, 0x9a, 0x7b, 0x56, 0xcf, 0xf4, 0xe0, 0xb7, 0xd9, 0xc4, 0x1e,
+ 0xa5, 0x49, 0x57, 0xa0, 0xa4, 0x1e, 0xfe, 0xbe, 0x8e, 0xb5, 0x02, 0x0c,
+ 0xb7, 0xaf, 0x2f, 0x88, 0x95, 0x90, 0xe1, 0x0b, 0xbb, 0x5e, 0xdb, 0x15,
+ 0x62, 0xa7, 0x4d, 0x16, 0x4a, 0x65, 0x92, 0xd9, 0x16, 0xeb, 0x65, 0x76,
+ 0x7f, 0xc6, 0x45, 0x63, 0xd0, 0x7d, 0xd3, 0x7a, 0xea, 0x65, 0x46, 0x90,
+ 0xf6, 0x35, 0x23, 0x61, 0xd3, 0xdf, 0x65, 0x85, 0x50, 0x53, 0x00, 0xcc,
+ 0xdb, 0x0c, 0x3f, 0xf6, 0x15, 0x71, 0xd6, 0x57, 0x02, 0xcb, 0xe9, 0x4b,
+ 0x93, 0x35, 0xe9, 0xef, 0xf9, 0x80, 0xac, 0xe9, 0xef, 0x88, 0x0b, 0x44,
+ 0x6e, 0xb5, 0xbf, 0x82, 0xc4, 0x01, 0xad, 0x0c, 0xb7, 0x19, 0x2b, 0xaa,
+ 0xcf, 0x4c, 0x2f, 0xf4, 0x46, 0xb9, 0x02, 0x75, 0xd0, 0x03, 0x3b, 0xd7,
+ 0x72, 0x33, 0x86, 0x38, 0xbf, 0x53, 0x22, 0x5c, 0xa6, 0x90, 0xe2, 0x07,
+ 0x57, 0x0b, 0x37, 0x8a, 0x6a, 0xa5, 0x3a, 0x36, 0x4f, 0x90, 0xfc, 0xfd,
+ 0x7a, 0x54, 0x58, 0x70, 0x8b, 0x28, 0xd7, 0xaa, 0x87, 0x3d, 0x6d, 0xc0,
+ 0xf3, 0xd7, 0xfe, 0xcf, 0x9f, 0x2b, 0x97, 0x65, 0x79, 0x93, 0xff, 0x40,
+ 0xcd, 0x6f, 0x23, 0x48, 0x0a, 0x84, 0xe4, 0x87, 0xb5, 0x8b, 0x71, 0xfc,
+ 0xf3, 0x8a, 0xbe, 0x5f, 0xf5, 0xf7, 0xa2, 0xf0, 0xd5, 0x73, 0xc9, 0x6e,
+ 0xfe, 0x08, 0xfb, 0x0e, 0xfe, 0x88, 0xe7, 0xce, 0x23, 0x26, 0x2c, 0x7c,
+ 0x47, 0x26, 0x85, 0x36, 0x65, 0x84, 0x67, 0xcb, 0xfd, 0x34, 0x03, 0x6c,
+ 0x4b, 0xf1, 0x86, 0x77, 0xa3, 0xbe, 0x93, 0x66, 0x09, 0x83, 0xfd, 0xae,
+ 0x3d, 0x35, 0x05, 0x14, 0x76, 0xb3, 0x87, 0x6a, 0x2d, 0x9f, 0x4a, 0x5c,
+ 0x0c, 0x17, 0x2f, 0xe1, 0xa1, 0xf1, 0xcd, 0xf9, 0x63, 0x44, 0x5f, 0xe8,
+ 0xbf, 0x5d, 0x09, 0x0a, 0xb0, 0x98, 0x2e, 0x7a, 0xcc, 0xb1, 0xbf, 0x58,
+ 0x20, 0x28, 0xfb, 0x41, 0xdc, 0x88, 0x28, 0xd1, 0xd4, 0x65, 0x83, 0xec,
+ 0xac, 0x79, 0x90, 0x4d, 0x0d, 0x4f, 0x6e, 0x16, 0x33, 0x31, 0x3e, 0x61,
+ 0xe3, 0x71, 0x5c, 0xdd, 0x32, 0x64, 0x32, 0xaf, 0x84, 0xe5, 0xe7, 0x66,
+ 0xd0, 0xcd, 0x57, 0xcd, 0x6a, 0x15, 0xb2, 0x3b, 0xd7, 0xde, 0x78, 0xdb,
+ 0x2d, 0xaf, 0x22, 0x53, 0x07, 0xf3, 0xff, 0x09, 0x83, 0x48, 0xde, 0xbc,
+ 0x4d, 0x31, 0x6a, 0xf2, 0x5f, 0x49, 0x59, 0x29, 0x76, 0xe5, 0xba, 0xa2,
+ 0x58, 0x55, 0x56, 0xca, 0x06, 0x3c, 0x91, 0xbd, 0xeb, 0x7f, 0xfb, 0xbc,
+ 0xf5, 0x02, 0x19, 0x5a, 0xff, 0x39, 0x3b, 0x8f, 0x0a, 0xf4, 0xc3, 0x3a,
+ 0x3c, 0x3b, 0x48, 0x3c, 0x6c, 0xaa, 0xe2, 0x9d, 0x91, 0xdd, 0xbe, 0xd9,
+ 0x9d, 0x29, 0x22, 0x62, 0x92, 0x00, 0xec, 0xad, 0xa0, 0x8e, 0x8d, 0xfa,
+ 0xa7, 0x9c, 0x07, 0xf2, 0xbe, 0x74, 0x07, 0xf0, 0x82, 0x8c, 0x0b, 0xfd,
+ 0x89, 0x85, 0xad, 0x3d, 0xd6, 0x7f, 0x62, 0xe7, 0xd4, 0xef, 0x9f, 0xca,
+ 0x74, 0x2c, 0xc8, 0xfa, 0xc2, 0xed, 0x75, 0x09, 0x5b, 0x70, 0xdb, 0x8b,
+ 0x3b, 0xbf, 0x20, 0xaa, 0x97, 0xe1, 0x06, 0x3c, 0x8b, 0x32, 0xaf, 0x7e,
+ 0x05, 0x46, 0xfe, 0x18, 0xf1, 0xf0, 0x8c, 0xf5, 0x4e, 0xf8, 0xde, 0xfa,
+ 0x22, 0xa6, 0xd1, 0x0c, 0x67, 0x13, 0x6e, 0xdc, 0xcd, 0x65, 0x50, 0x4f,
+ 0xdf, 0x40, 0xaf, 0xc5, 0xec, 0x1c, 0x78, 0x82, 0x45, 0x7e, 0x85, 0xb7,
+ 0xbb, 0xea, 0x11, 0x57, 0xf9, 0xfc, 0x01, 0x6f, 0xec, 0xf6, 0x96, 0x86,
+ 0x38, 0x4a, 0xbb, 0xe9, 0x70, 0x91, 0x07, 0x23, 0x9a, 0xe7, 0x2c, 0xba,
+ 0x40, 0x68, 0x91, 0x86, 0x8d, 0x9b, 0xd5, 0x5b, 0xe1, 0xd1, 0x1a, 0x6e,
+ 0x14, 0xa6, 0x87, 0x1f, 0x1e, 0xd1, 0x1e, 0x0f, 0xea, 0xd6, 0x0b, 0xc9,
+ 0xeb, 0x26, 0x33, 0x86, 0xad, 0x6f, 0xda, 0x43, 0x30, 0x40, 0xec, 0x65,
+ 0xa0, 0x63, 0xa3, 0xed, 0xb1, 0xb8, 0xa1, 0x3b, 0x7f, 0x56, 0xe4, 0x79,
+ 0x89, 0x06, 0x00, 0x26, 0xc1, 0xbf, 0x42, 0xc8, 0xea, 0x5e, 0xc5, 0x14,
+ 0x03, 0x66, 0x3c, 0x18, 0x61, 0xfb, 0x52, 0x95, 0x02, 0xd2, 0x9c, 0x51,
+ 0xef, 0xc9, 0xb7, 0xd1, 0xf0, 0x16, 0x59, 0xa6, 0x85, 0x20, 0x9c, 0x3c,
+ 0x57, 0x53, 0x8c, 0xe0, 0x2a, 0x0e, 0x54, 0x5c, 0x1c, 0x25, 0xd5, 0xb7,
+ 0xcf, 0x4a, 0x2c, 0xff, 0x59, 0xbf, 0xfe, 0x36, 0x76, 0x1a, 0x28, 0x5e,
+ 0x2a, 0xe6, 0x5d, 0x48, 0x0e, 0x2e, 0x68, 0x49, 0xcb, 0x02, 0xa9, 0xb2,
+ 0xa6, 0xbe, 0xd8, 0x80, 0x64, 0x84, 0x4e, 0x67, 0x46, 0x7b, 0x35, 0x5d,
+ 0xf3, 0xa9, 0x0f, 0xb8, 0x8f, 0x22, 0x48, 0x1f, 0x20, 0x78, 0x1e, 0x66,
+ 0x1c, 0xe3, 0x56, 0xff, 0xe8, 0xf1, 0x41, 0xf0, 0x10, 0xf5, 0xb4, 0x22,
+ 0xc4, 0xc0, 0xe1, 0xac, 0xe7, 0x79, 0xfb, 0xf9, 0x49, 0xe3, 0x2e, 0xa2,
+ 0x59, 0x80, 0xa0, 0xcb, 0xe3, 0xba, 0x00, 0x5e, 0xfe, 0x66, 0xc1, 0x1b,
+ 0x29, 0x34, 0xc1, 0x17, 0xa3, 0xa0, 0x82, 0x14, 0x46, 0x9c, 0x97, 0x82,
+ 0x33, 0x43, 0xbf, 0x89, 0x03, 0x9c, 0x1c, 0x9f, 0xa9, 0x10, 0x03, 0x83,
+ 0x2f, 0x4b, 0x6e, 0xff, 0x13, 0x8f, 0x91, 0xf7, 0x5d, 0x1e, 0x04, 0xfa,
+ 0x78, 0xf7, 0xdc, 0x2e, 0xe4, 0xd8, 0x34, 0xe1, 0xae, 0xb8, 0xc5, 0xb5,
+ 0xee, 0x7d, 0xc1, 0x73, 0x02, 0x73, 0x63, 0x8f, 0x7e, 0xb8, 0x9d, 0xb1,
+ 0x76, 0xdc, 0x17, 0x41, 0x37, 0xe1, 0x9c, 0x10, 0x59, 0x84, 0xff, 0x5a,
+ 0x45, 0x5f, 0x14, 0x82, 0x9d, 0xd1, 0xe6, 0x8b, 0x8a, 0x55, 0xad, 0xdf,
+ 0xa3, 0xa7, 0x87, 0x19, 0x51, 0x37, 0xba, 0x47, 0xbc, 0x21, 0x25, 0x32,
+ 0xba, 0x24, 0xf3, 0x92, 0x5e, 0x1b, 0x91, 0x89, 0x4c, 0x6c, 0x6a, 0x2e,
+ 0x37, 0x21, 0xee, 0x87, 0x01, 0x8b, 0x39, 0xb8, 0x39, 0xe6, 0x86, 0xf4,
+ 0x7f, 0x49, 0x14, 0x10, 0x45, 0x71, 0xc6, 0xf3, 0xca, 0x53, 0x7e, 0xec,
+ 0x82, 0xb4, 0xee, 0x25, 0x1d, 0x83, 0x2c, 0x23, 0x8f, 0x0c, 0x97, 0xd8,
+ 0xc2, 0xd7, 0x8f, 0xcc, 0x06, 0x61, 0xf7, 0xe7, 0x6d, 0x9e, 0xbc, 0x7b,
+ 0x99, 0x65, 0xef, 0x9b, 0x96, 0xee, 0x84, 0xc9, 0x10, 0xa0, 0x77, 0x4d,
+ 0xae, 0x57, 0x79, 0xa3, 0xdb, 0xa1, 0xd8, 0x17, 0xeb, 0xd1, 0xdd, 0x27,
+ 0x00, 0x4a, 0xa0, 0xaa, 0x83, 0x76, 0x26, 0xeb, 0x6b, 0xac, 0x37, 0xdf,
+ 0x4b, 0x0f, 0x30, 0xf7, 0x45, 0x7e, 0xeb, 0xd7, 0xb6, 0x17, 0xdf, 0x43,
+ 0x1f, 0x99, 0x2d, 0x26, 0x1c, 0x41, 0xc6, 0x92, 0x3a, 0x22, 0x45, 0x3e,
+ 0x18, 0x13, 0xd7, 0xa6, 0xe2, 0x7a, 0x9d, 0x1c, 0xa6, 0xd5, 0x1e, 0x62,
+ 0x3f, 0xeb, 0x7d, 0xff, 0xfb, 0xcd, 0x0f, 0xbf, 0xed, 0x50, 0xb0, 0xdc,
+ 0x0b, 0xfe, 0x57, 0xb7, 0x24, 0x1e, 0x8e, 0x4c, 0xd1, 0xd1, 0x18, 0xe2,
+ 0x95, 0xe6, 0x3f, 0x77, 0x8d, 0xab, 0x67, 0xb2, 0x96, 0x0d, 0xcd, 0x6f,
+ 0x98, 0x51, 0x37, 0x72, 0xd6, 0xe8, 0x98, 0x50, 0x5a, 0x15, 0x7d, 0x19,
+ 0x3d, 0xe2, 0xd3, 0xce, 0x0e, 0x81, 0x6a, 0xbc, 0x07, 0x40, 0xfe, 0xe7,
+ 0xb7, 0xd6, 0xda, 0xd6, 0x5b, 0x6a, 0x9e, 0x7f, 0xc5, 0x44, 0x2e, 0x73,
+ 0x2d, 0x92, 0x26, 0x9d, 0xfa, 0xbe, 0xe1, 0x01, 0x36, 0x9e, 0x59, 0xf3,
+ 0xb5, 0xbf, 0x01, 0x5f, 0xdc, 0x8c, 0x5b, 0xbd, 0x27, 0x17, 0x3d, 0xf4,
+ 0x72, 0xfd, 0x92, 0x79, 0x1a, 0x98, 0x54, 0x5c, 0x85, 0x0c, 0xa7, 0xc3,
+ 0x2f, 0x06, 0x89, 0xb9, 0x62, 0x59, 0x5d, 0x47, 0x72, 0x93, 0x20, 0x84,
+ 0xa6, 0x87, 0xaa, 0xf1, 0xa6, 0xf2, 0x42, 0xf2, 0x28, 0x78, 0x20, 0xe6,
+ 0x98, 0x4b, 0x87, 0xd3, 0x78, 0x4b, 0xba, 0x05, 0x4f, 0xba, 0x1b, 0x12,
+ 0x75, 0x5f, 0xc6, 0x5d, 0x68, 0x13, 0xee, 0xa3, 0xa5, 0x8b, 0x47, 0x1f,
+ 0x92, 0x61, 0x12, 0x6d, 0xfd, 0x8f, 0xe7, 0x1f, 0xbc, 0x77, 0x38, 0x11,
+ 0x59, 0xfd, 0xee, 0x2a, 0x50, 0x4e, 0xe0, 0x61, 0x59, 0xee, 0x89, 0xc3,
+ 0x7c, 0x68, 0x24, 0x65, 0xd4, 0x2b, 0xa4, 0x15, 0x6b, 0x84, 0x49, 0xec,
+ 0xef, 0xad, 0xb7, 0xab, 0x59, 0xad, 0xcf, 0xff, 0xc8, 0x03, 0xf9, 0x38,
+ 0xfd, 0x33, 0xe7, 0x59, 0x16, 0x41, 0x67, 0x3c, 0x86, 0x67, 0x05, 0x3c,
+ 0xd5, 0x93, 0x3e, 0x76, 0xa0, 0x4e, 0xda, 0xc9, 0xdb, 0x3f, 0x3a, 0x25,
+ 0x4a, 0x2b, 0x70, 0x34, 0xef, 0xb8, 0x5a, 0xb9, 0xef, 0x3f, 0xdc, 0x4b,
+ 0x81, 0x42, 0xa4, 0x14, 0xe0, 0x44, 0x94, 0x28, 0x74, 0x3b, 0x06, 0x50,
+ 0xc5, 0x89, 0x1e, 0xf8, 0x30, 0x94, 0x3f, 0x7f, 0x00, 0x64, 0xd1, 0x4c,
+ 0x71, 0x3b, 0xef, 0x96, 0x08, 0x92, 0x49, 0xff, 0xa8, 0x7c, 0x32, 0x19,
+ 0x29, 0x30, 0x37, 0x9c, 0x7b, 0xd6, 0x5b, 0x0c, 0xe1, 0xc2, 0x91, 0x3e,
+ 0x8e, 0x8a, 0xd5, 0xee, 0x3b, 0x50, 0x9a, 0x4f, 0x1e, 0x5f, 0xf3, 0x8c,
+ 0x3d, 0x8e, 0x92, 0x55, 0x4e, 0x28, 0xf5, 0xd8, 0x20, 0xe0, 0x2f, 0x8c,
+ 0x50, 0x1e, 0x5b, 0x4f, 0xad, 0x74, 0xb7, 0x1c, 0x15, 0x0f, 0xb6, 0xf6,
+ 0x80, 0x00, 0xe1, 0xab, 0x12, 0xbf, 0x07, 0x1f, 0xa2, 0x6a, 0x27, 0x1d,
+ 0xc0, 0xae, 0xcf, 0x51, 0x78, 0xe1, 0xdb, 0xc4, 0xc8, 0xe5, 0x5c, 0x95,
+ 0xb8, 0x20, 0x20, 0x6f, 0x0f, 0xee, 0xab, 0xe6, 0x20, 0xdb, 0x7e, 0x5c,
+ 0x11, 0xa7, 0x84, 0xb1, 0xf6, 0xd6, 0xb0, 0x5f, 0x22, 0xe3, 0x2b, 0x4b,
+ 0x8c, 0x29, 0xc4, 0x11, 0xe3, 0x2e, 0x7b, 0x10, 0x6d, 0xfd, 0xb2, 0xc9,
+ 0xc3, 0xc8, 0x59, 0xa8, 0x9e, 0xe0, 0x1c, 0x11, 0xec, 0xe6, 0x3d, 0xd4,
+ 0x3e, 0xd9, 0xcf, 0x4d, 0x75, 0x5a, 0x43, 0x9b, 0xf2, 0x31, 0x5c, 0xe0,
+ 0xaf, 0x09, 0xcc, 0xf5, 0x08, 0x7f, 0x73, 0x39, 0xe7, 0x24, 0x2b, 0xdd,
+ 0x2d, 0xe5, 0x94, 0xbf, 0x90, 0x9b, 0x85, 0xaf, 0x5e, 0x7b, 0x63, 0xf3,
+ 0xe7, 0x39, 0x32, 0x17, 0x81, 0xe0, 0xf0, 0x79, 0x7c, 0x5b, 0x19, 0xff,
+ 0xda, 0x31, 0xbd, 0xf6, 0xa1, 0x47, 0xbc, 0x99, 0xe7, 0x4b, 0xcd, 0x4f,
+ 0x56, 0xbc, 0xd2, 0xb8, 0xed, 0xc2, 0x8b, 0x1e, 0xf2, 0xd9, 0x71, 0x8e,
+ 0x19, 0x16, 0x49, 0xaa, 0x1e, 0xa4, 0x10, 0x9c, 0xf9, 0xcb, 0xc9, 0x94,
+ 0x5e, 0xfa, 0x4a, 0xbc, 0x90, 0xa4, 0xcc, 0xeb, 0xc4, 0x1f, 0x69, 0x8b,
+ 0xf0, 0x97, 0x25, 0x77, 0xd5, 0x1f, 0xa5, 0x8a, 0xd7, 0xa6, 0xb0, 0x78,
+ 0x79, 0xfa, 0xf6, 0x5d, 0x5e, 0xc5, 0xae, 0x2d, 0xb1, 0xe1, 0x68, 0x56,
+ 0x40, 0xb5, 0x00, 0x62, 0x8a, 0x17, 0x77, 0x34, 0xc0, 0xd0, 0x7c, 0xe0,
+ 0xac, 0x4b, 0xa8, 0x45, 0x6b, 0x68, 0xb9, 0x32, 0x70, 0xa9, 0xa2, 0x12,
+ 0x2e, 0x25, 0xff, 0x88, 0xc6, 0xa5, 0x15, 0xb7, 0x16, 0xac, 0x2c, 0x2e,
+ 0x44, 0xe0, 0x0a, 0x73, 0xf1, 0xc9, 0x7e, 0x52, 0x09, 0x6a, 0x19, 0x4f,
+ 0x07, 0x97, 0x5e, 0xdd, 0x33, 0xe6, 0x70, 0xea, 0xcf, 0xc7, 0x37, 0x7f,
+ 0xaa, 0x70, 0x9f, 0xcd, 0x0c, 0x86, 0x0c, 0xba, 0x40, 0x7a, 0x65, 0xd2,
+ 0xef, 0xc2, 0xaf, 0xde, 0x68, 0x4c, 0x9c, 0x2d, 0x98, 0x9b, 0x6c, 0xe9,
+ 0xe8, 0x26, 0xc9, 0x27, 0xf4, 0x6e, 0x56, 0x43, 0x2d, 0x7c, 0x98, 0xef,
+ 0x89, 0x89, 0x23, 0xd3, 0xf3, 0x6e, 0x8b, 0x41, 0xc3, 0x87, 0xd0, 0x87,
+ 0x01, 0xca, 0xf8, 0x44, 0x88, 0x14, 0x55, 0x71, 0xd0, 0x58, 0x7d, 0x36,
+ 0x51, 0x1c, 0x8d, 0x77, 0xa0, 0x1a, 0x72, 0x4a, 0x2b, 0xfc, 0x50, 0x2f,
+ 0x17, 0x56, 0x7c, 0xd6, 0xdc, 0xe9, 0x87, 0x12, 0xde, 0x24, 0x36, 0x6e,
+ 0x03, 0x68, 0xfd, 0x10, 0x60, 0x33, 0x7b, 0x41, 0x63, 0x5f, 0x66, 0x3f,
+ 0x25, 0x68, 0x77, 0x29, 0xcb, 0x3c, 0x61, 0x1d, 0xfa, 0x70, 0x40, 0x67,
+ 0x70, 0x8c, 0xab, 0xfc, 0xa7, 0xc3, 0xd3, 0xf3, 0xd7, 0x62, 0xa2, 0xf0,
+ 0x10, 0xe9, 0xb4, 0xe8, 0xb7, 0xb6, 0xff, 0xe3, 0xa9, 0x1e, 0x5a, 0x15,
+ 0x64, 0xa4, 0x50, 0x9b, 0x40, 0x5f, 0x57, 0x9c, 0xe4, 0xf8, 0x8d, 0x7b,
+ 0xa6, 0xba, 0xa3, 0x9a, 0x06, 0xd5, 0x10, 0xb4, 0x53, 0xdd, 0x2a, 0xda,
+ 0xe3, 0xcd, 0xf6, 0x39, 0xde, 0x26, 0x11, 0xfe, 0x98, 0x21, 0xc7, 0x41,
+ 0x80, 0xbd, 0xa6, 0x1b, 0xc9, 0x63, 0x6f, 0x81, 0x8a, 0x03, 0x2e, 0x1b,
+ 0xd8, 0xe6, 0x3c, 0xa0, 0xe3, 0xd0, 0xff, 0x65, 0x92, 0x3a, 0x63, 0xf8,
+ 0x9f, 0x73, 0xae, 0x6e, 0x9d, 0x9a, 0x61, 0xbd, 0x6d, 0x09, 0x21, 0x8a,
+ 0xb3, 0x24, 0x55, 0x58, 0x09, 0x25, 0xc0, 0x73, 0x03, 0x9e, 0x48, 0x62,
+ 0x65, 0x66, 0xea, 0x89, 0xf1, 0xd3, 0x8b, 0x56, 0x3d, 0xba, 0x39, 0xfa,
+ 0xb5, 0xa2, 0xcb, 0xf9, 0xc8, 0xc5, 0x52, 0xce, 0x7e, 0x0d, 0x6c, 0x38,
+ 0x4d, 0x5a, 0x6a, 0x54, 0xfb, 0xf4, 0xed, 0xb2, 0xfc, 0x17, 0xa8, 0x76,
+ 0xfa, 0x50, 0xa9, 0x44, 0x3a, 0xcc, 0x91, 0x8f, 0xae, 0x5a, 0x2c, 0x1c,
+ 0x1e, 0x5e, 0x83, 0xd4, 0x2e, 0x4f, 0xf3, 0xc0, 0x44, 0x65, 0xcb, 0x0c,
+ 0x3d, 0x48, 0x79, 0x80, 0xe1, 0x93, 0xd4, 0xb9, 0x8f, 0xd7, 0x58, 0x39,
+ 0x6b, 0x62, 0xb9, 0xa6, 0x65, 0x31, 0xe0, 0x57, 0x78, 0xa3, 0xae, 0x1d,
+ 0x96, 0x4f, 0xaa, 0x4d, 0x8b, 0x0f, 0x4f, 0x80, 0xe2, 0x51, 0x42, 0x37,
+ 0x5b, 0x76, 0xec, 0xca, 0x97, 0xfb, 0xbc, 0x44, 0x1f, 0x12, 0x94, 0x44,
+ 0x60, 0x83, 0xe2, 0x2c, 0xe2, 0xab, 0xad, 0x0b, 0x51, 0x42, 0x98, 0x49,
+ 0x8c, 0x6c, 0x63, 0x33, 0x3e, 0x34, 0xc5, 0xd3, 0x75, 0xa7, 0x12, 0x36,
+ 0x97, 0xf4, 0x0d, 0xac, 0xf4, 0x74, 0xfe, 0xfa, 0x24, 0xf4, 0x4c, 0x2b,
+ 0xac, 0x0a, 0x55, 0x4f, 0x6f, 0xa5, 0x58, 0xca, 0x4c, 0x31, 0x4e, 0x0c,
+ 0x0d, 0x7a, 0xde, 0xd0, 0x09, 0xdb, 0xce, 0xe6, 0x3e, 0xa9, 0xb6, 0xd8,
+ 0x07, 0x26, 0x3d, 0x1e, 0x22, 0xd2, 0xcf, 0xe4, 0xcf, 0xa2, 0xb0, 0x51,
+ 0x01, 0xe7, 0xda, 0xa7, 0x6b, 0x97, 0x2e, 0x93, 0x22, 0xda, 0x86, 0xdf,
+ 0x4e, 0xaa, 0x7b, 0x1c, 0x79, 0xd1, 0x20, 0x3c, 0x46, 0x8b, 0x36, 0x34,
+ 0x73, 0x44, 0xda, 0x6f, 0x2d, 0xcc, 0x7b, 0xae, 0x3e, 0xa1, 0x68, 0xb2,
+ 0xf7, 0x12, 0x6c, 0x23, 0xf5, 0xc7, 0xb9, 0x38, 0x5d, 0xbb, 0x48, 0x4d,
+ 0xab, 0x10, 0x40, 0x2f, 0xe4, 0x71, 0x16, 0x19, 0xf9, 0xdc, 0x9d, 0x32,
+ 0x5b, 0xe3, 0xc4, 0x50, 0xb6, 0x27, 0x9b, 0x61, 0xc6, 0xda, 0x0a, 0x11,
+ 0xfd, 0x54, 0x00, 0xa7, 0x74, 0x18, 0x51, 0x3a, 0x62, 0x83, 0x7f, 0x0d,
+ 0xaf, 0x31, 0xad, 0xa9, 0x9d, 0xc9, 0x5c, 0x74, 0x82, 0x86, 0xdc, 0x56,
+ 0xbd, 0x6e, 0x72, 0x47, 0x11, 0x45, 0x41, 0x64, 0xb2, 0x05, 0x9b, 0xc8,
+ 0x20, 0x90, 0x05, 0x79, 0x52, 0x7d, 0xea, 0x12, 0xcb, 0x5f, 0xce, 0xd9,
+ 0x98, 0x23, 0x8f, 0x66, 0x37, 0x0c, 0x4d, 0x14, 0x9f, 0x85, 0xeb, 0x8a,
+ 0xa6, 0x14, 0x38, 0x6a, 0x68, 0x34, 0xcf, 0x7c, 0x18, 0x6b, 0x3f, 0x5d,
+ 0xf2, 0x2b, 0xe0, 0x41, 0xb6, 0x24, 0x75, 0x05, 0x14, 0x9e, 0xf2, 0x8a,
+ 0xdb, 0x67, 0xd1, 0x05, 0xc2, 0x05, 0x17, 0xac, 0x4d, 0xb6, 0x8d, 0x54,
+ 0xe3, 0x38, 0x74, 0x31, 0x83, 0x7f, 0x61, 0x61, 0xda, 0xc9, 0xf8, 0x27,
+ 0x40, 0xe5, 0xc2, 0xb5, 0xbc, 0x5a, 0x77, 0xcc, 0x9c, 0xfb, 0x6f, 0xbe,
+ 0x82, 0x7e, 0xad, 0x94, 0x59, 0xb0, 0x77, 0x97, 0x93, 0x71, 0xaf, 0xa3,
+ 0x8a, 0x36, 0x52, 0x2f, 0x73, 0x55, 0xfd, 0x40, 0xbb, 0xb8, 0x59, 0x09,
+ 0x13, 0xe8, 0xfd, 0x69, 0x71, 0x2a, 0xec, 0x62, 0x98, 0x37, 0x44, 0x3d,
+ 0x6f, 0x6c, 0x50, 0xb9, 0x43, 0xfb, 0xf6, 0xb7, 0x89, 0xea, 0x8f, 0x2f,
+ 0xce, 0xdc, 0xf4, 0x8b, 0x8e, 0xa9, 0xd7, 0xe9, 0x6f, 0xa5, 0x08, 0x6e,
+ 0x11, 0x02, 0x08, 0x35, 0x52, 0x38, 0x6f, 0x5d, 0xff, 0x4c, 0xf7, 0xdd,
+ 0x86, 0xf0, 0xdc, 0x91, 0x2a, 0x65, 0x3a, 0x98, 0x14, 0x64, 0x8b, 0x41,
+ 0xee, 0xb0, 0xd6, 0xd9, 0x70, 0xde, 0xa0, 0xd5, 0x0c, 0x56, 0x6c, 0x07,
+ 0x41, 0x10, 0x18, 0xb2, 0xac, 0x81, 0xbc, 0xd6, 0xe6, 0x82, 0x1c, 0xaa,
+ 0xc1, 0xde, 0xc9, 0xc5, 0xe2, 0x2d, 0x94, 0x5b, 0xdc, 0xb5, 0xcd, 0x0d,
+ 0x86, 0x29, 0x1d, 0xb6, 0x17, 0x1d, 0xfd, 0x10, 0x76, 0x0b, 0xa9, 0xef,
+ 0x64, 0x72, 0xc3, 0x97, 0x4f, 0x2e, 0xae, 0x05, 0xd2, 0x2f, 0x1b, 0x43,
+ 0x33, 0xa9, 0x56, 0x2e, 0xa6, 0xe5, 0xe9, 0x9c, 0x76, 0x06, 0xf5, 0x9a,
+ 0x9e, 0x84, 0x0c, 0x73, 0x64, 0x60, 0x47, 0x51, 0xb5, 0x47, 0xbb, 0xe0,
+ 0xbb, 0xab, 0x32, 0xfc, 0x0f, 0xff, 0xcc, 0xd6, 0xef, 0x3e, 0x1a, 0xa6,
+ 0xd9, 0x41, 0xe6, 0xf0, 0x49, 0x26, 0x73, 0xec, 0xed, 0x7c, 0x49, 0x5d,
+ 0x62, 0xd5, 0xbc, 0x7c, 0x66, 0x87, 0x45, 0x8c, 0xeb, 0xb2, 0x7f, 0x37,
+ 0x8d, 0xb5, 0xc4, 0xd2, 0xa7, 0x1f, 0xe4, 0xfa, 0xfe, 0xbb, 0xa7, 0x50,
+ 0xe8, 0x59, 0x4c, 0xaa, 0x40, 0xca, 0x6d, 0x8f, 0x28, 0x79, 0x1a, 0x2d,
+ 0xcd, 0xb0, 0xc5, 0x1d, 0x66, 0xe3, 0x9a, 0xa6, 0x4b, 0x59, 0x72, 0x97,
+ 0x68, 0x62, 0x0c, 0xb3, 0xc6, 0x6e, 0xf4, 0x71, 0xfc, 0x38, 0x59, 0xf7,
+ 0x86, 0x0c, 0xd7, 0x46, 0x6d, 0x1e, 0x25, 0xee, 0xcb, 0x62, 0x65, 0xd5,
+ 0x9a, 0x3b, 0xc7, 0xf4, 0xb8, 0xe2, 0x22, 0x10, 0xa5, 0x4a, 0x84, 0x66,
+ 0x1d, 0x08, 0x30, 0xf3, 0x33, 0x4d, 0xac, 0xa3, 0x1d, 0xff, 0x99, 0xe7,
+ 0x04, 0xa1, 0xe8, 0x35, 0x47, 0x24, 0x16, 0xef, 0x85, 0xf9, 0xbe, 0x9e,
+ 0x13, 0x00, 0x3b, 0xba, 0xd1, 0xf9, 0xff, 0x80, 0xd8, 0xa3, 0xba, 0xf7,
+ 0x48, 0xaa, 0x25, 0x19, 0xaa, 0xf8, 0x56, 0xfa, 0x6c, 0x07, 0xed, 0xf0,
+ 0xa7, 0x91, 0x2f, 0x69, 0x9f, 0xd7, 0x8d, 0x90, 0x51, 0x78, 0xdd, 0xcf,
+ 0x7e, 0x47, 0x21, 0x07, 0x4b, 0xf3, 0x5a, 0x21, 0x1a, 0x99, 0x4c, 0x1f,
+ 0xcb, 0x07, 0x4b, 0x2e, 0x92, 0x20, 0xc3, 0x2f, 0xe4, 0x40, 0xe6, 0xe4,
+ 0xf3, 0xed, 0x06, 0xcd, 0x70, 0x61, 0xb1, 0x0f, 0x5b, 0x6f, 0x49, 0xf4,
+ 0x13, 0x77, 0x41, 0x72, 0x96, 0xd0, 0x60, 0x83, 0x23, 0x62, 0xb9, 0xc8,
+ 0x2b, 0x68, 0xf4, 0xc5, 0x53, 0xfe, 0x12, 0xaf, 0x43, 0xb5, 0x9a, 0x17,
+ 0x53, 0xf6, 0x92, 0x66, 0x27, 0xca, 0xdb, 0xd6, 0xbb, 0x66, 0xcc, 0xd6,
+ 0xe7, 0x66, 0x37, 0x95, 0x5f, 0x34, 0x32, 0xde, 0x45, 0xf6, 0x79, 0x2a,
+ 0x8c, 0x2c, 0xa9, 0xfa, 0xfc, 0xac, 0x05, 0xde, 0x0e, 0xd2, 0xb9, 0x7c,
+ 0x13, 0x77, 0x5e, 0xad, 0x80, 0x99, 0xc7, 0x23, 0x8a, 0x89, 0x79, 0xdc,
+ 0x9c, 0xce, 0xd7, 0x43, 0x5a, 0xd9, 0x9d, 0xe5, 0x77, 0xf7, 0x00, 0xb9,
+ 0x74, 0x36, 0x2f, 0xcb, 0xdc, 0x78, 0xcd, 0x52, 0x7c, 0xca, 0xb8, 0x3a,
+ 0xa0, 0xfd, 0xd8, 0x93, 0x19, 0x4d, 0xa8, 0x2d, 0x8c, 0x28, 0xf1, 0xdc,
+ 0xe8, 0xaf, 0x1b, 0xee, 0x1d, 0x2b, 0x79, 0xfc, 0x65, 0xe1, 0x2f, 0x70,
+ 0x0f, 0x4d, 0x43, 0x78, 0xa8, 0x55, 0x14, 0x54, 0x07, 0x78, 0xe6, 0x55,
+ 0xf0, 0x9f, 0xc0, 0x6b, 0x92, 0xe1, 0x8b, 0xb0, 0xae, 0x03, 0xb6, 0xe5,
+ 0x56, 0xd6, 0x1e, 0xd4, 0xbe, 0x01, 0x2f, 0x96, 0xe6, 0x29, 0xd6, 0x5a,
+ 0x01, 0x3a, 0xa7, 0xe1, 0x91, 0xbf, 0xb9, 0x05, 0xae, 0x40, 0xd6, 0x83,
+ 0x82, 0xb9, 0x83, 0x77, 0x53, 0xff, 0xa7, 0x69, 0x03, 0xb1, 0x55, 0x41,
+ 0x93, 0xc6, 0x94, 0xb6, 0x14, 0xc5, 0x9e, 0x51, 0x8f, 0xaa, 0xa8, 0xad,
+ 0x83, 0x34, 0xaf, 0x15, 0xde, 0xfb, 0x53, 0x73, 0xf9, 0x79, 0xb0, 0xed,
+ 0x8e, 0x32, 0x10, 0xe5, 0x2f, 0x36, 0xcb, 0x2d, 0x4e, 0xc1, 0x4c, 0x65,
+ 0xc5, 0x32, 0x7b, 0x50, 0xe8, 0x76, 0xc4, 0xa3, 0x72, 0x2f, 0xbc, 0x6c,
+ 0x4a, 0xa1, 0x1b, 0x2b, 0x84, 0x1f, 0x21, 0x02, 0xff, 0xb8, 0xeb, 0x0d,
+ 0xb8, 0x63, 0x9c, 0xdb, 0x87, 0x91, 0x95, 0x11, 0xaf, 0x53, 0x11, 0xa6,
+ 0xde, 0xf5, 0x9b, 0xc0, 0x4a, 0x37, 0x0a, 0xca, 0xe0, 0x96, 0xa1, 0x73,
+ 0xa3, 0x31, 0x41, 0xd5, 0xe7, 0xef, 0x94, 0xb3, 0x73, 0xc8, 0xe8, 0x5a,
+ 0x61, 0xc9, 0x98, 0xe7, 0xe8, 0xdd, 0xc6, 0x62, 0x3f, 0xfe, 0xda, 0x0e,
+ 0x8e, 0x01, 0x11, 0x4f, 0xeb, 0x0e, 0xdb, 0xb0, 0xe7, 0x11, 0xe2, 0xff,
+ 0xf1, 0x3d, 0x77, 0x4d, 0x85, 0x82, 0x4a, 0xb4, 0x63, 0x0b, 0x6d, 0xc1,
+ 0xf2, 0xcc, 0x73, 0x8e, 0xb1, 0x96, 0x09, 0x2d, 0x3b, 0x0a, 0x05, 0x7e,
+ 0x93, 0x64, 0x6e, 0xd1, 0x51, 0x5f, 0x0b, 0xdd, 0xbf, 0x00, 0x76, 0xaf,
+ 0x4b, 0xe9, 0x18, 0x14, 0x2f, 0xe0, 0x33, 0x79, 0xb2, 0x1f, 0xdf, 0x3f,
+ 0xec, 0xd5, 0xf5, 0xcf, 0x8a, 0x5c, 0xe1, 0xae, 0x75, 0xf6, 0x16, 0x14,
+ 0x5f, 0xab, 0x07, 0xdb, 0x71, 0x1b, 0x3c, 0xb8, 0xd7, 0x02, 0xf9, 0xb0,
+ 0x7f, 0xb0, 0x74, 0x4a, 0x13, 0x91, 0x19, 0x6d, 0x8e, 0x3e, 0x0b, 0x42,
+ 0x1a, 0x03, 0x1d, 0xcc, 0x23, 0x34, 0xf9, 0x60, 0x0c, 0x19, 0x60, 0x23,
+ 0x5a, 0xf5, 0xc0, 0x14, 0x20, 0xae, 0x56, 0xa3, 0x78, 0x19, 0x76, 0x55,
+ 0xdf, 0x33, 0xe3, 0x47, 0xb2, 0x56, 0xa8, 0xff, 0xe6, 0x70, 0xef, 0x00,
+ 0x7c, 0x38, 0x4f, 0xf4, 0x67, 0x41, 0x97, 0x42, 0x45, 0xe3, 0xdb, 0xbe,
+ 0xcd, 0x21, 0x04, 0x3b, 0xb3, 0x65, 0x73, 0x3f, 0x81, 0x6c, 0x2f, 0x91,
+ 0x39, 0x14, 0x0a, 0x76, 0x41, 0xf9, 0x96, 0xa7, 0xa1, 0x5d, 0x75, 0xf7,
+ 0xb4, 0x6e, 0x27, 0x81, 0x1b, 0xe2, 0xdf, 0xba, 0x23, 0xd9, 0x02, 0x1e,
+ 0xe2, 0x8f, 0x03, 0x10, 0x32, 0x97, 0x32, 0x9f, 0xbd, 0xce, 0xfc, 0xc4,
+ 0xa7, 0x01, 0x31, 0x2d, 0x8b, 0x4f, 0xd5, 0x5f, 0xe5, 0x87, 0xfb, 0xd4,
+ 0x25, 0x7b, 0x6f, 0xe4, 0x79, 0xdd, 0x92, 0xf0, 0x4c, 0x6c, 0x36, 0xaa,
+ 0xf6, 0xf9, 0xb2, 0x28, 0x4d, 0xa7, 0x9c, 0x44, 0xe9, 0x71, 0x45, 0x18,
+ 0x3a, 0x6a, 0xd7, 0x17, 0x54, 0x3e, 0xd9, 0x03, 0x7b, 0x64, 0x4a, 0xf7,
+ 0x33, 0xc0, 0xfb, 0xda, 0xaf, 0xf2, 0xf7, 0x57, 0xa7, 0xf1, 0xaa, 0xdb,
+ 0x26, 0x5e, 0x08, 0xe2, 0x4f, 0xd5, 0x0f, 0xea, 0x2b, 0x96, 0x36, 0x64,
+ 0x14, 0x97, 0x0c, 0x13, 0x45, 0xf1, 0x4e, 0x8d, 0x31, 0x3a, 0x99, 0x78,
+ 0xd8, 0x48, 0x86, 0x5d, 0x02, 0x47, 0xa7, 0xaf, 0xa3, 0x4f, 0x16, 0x9a,
+ 0xeb, 0x65, 0x17, 0xf8, 0x3b, 0x05, 0x49, 0xc7, 0xf0, 0x3f, 0xce, 0x46,
+ 0xc0, 0x42, 0x25, 0xab, 0x5d, 0xa0, 0x8f, 0x54, 0xd4, 0xb4, 0x89, 0x8b,
+ 0xf0, 0x5b, 0x39, 0x6e, 0xb5, 0xd6, 0xc3, 0x6c, 0x89, 0x39, 0x14, 0x2e,
+ 0x40, 0x8d, 0xac, 0x14, 0x35, 0x25, 0xb1, 0xa0, 0x05, 0xb2, 0x20, 0x18,
+ 0xcd, 0x2a, 0x8b, 0x9a, 0xe4, 0x31, 0x8c, 0x64, 0x63, 0x75, 0xa9, 0x73,
+ 0x89, 0x1d, 0x8f, 0xe7, 0x16, 0x60, 0x20, 0x9f, 0x36, 0xa6, 0x36, 0x1b,
+ 0x94, 0x89, 0x98, 0xc4, 0x54, 0x19, 0x1f, 0x9d, 0x6b, 0x19, 0x5f, 0xe5,
+ 0x74, 0x4a, 0x61, 0x7a, 0xdc, 0xe9, 0x7c, 0xfb, 0xa8, 0x05, 0x8f, 0x7a,
+ 0xfb, 0x09, 0xbc, 0x57, 0x57, 0x4d, 0x59, 0xaf, 0xdb, 0x2e, 0xbf, 0xf0,
+ 0x0e, 0xf3, 0xb0, 0x6b, 0x30, 0x9a, 0x81, 0x03, 0x9d, 0xcb, 0xa8, 0x5a,
+ 0xc9, 0xe3, 0x43, 0x09, 0xe9, 0xa5, 0x7a, 0xa5, 0x7c, 0xb7, 0x46, 0xd0,
+ 0xf7, 0x87, 0xf7, 0xf2, 0xfe, 0x9d, 0x68, 0x7c, 0xde, 0xa4, 0xbc, 0xd0,
+ 0x8d, 0x49, 0x86, 0xb8, 0x89, 0xd9, 0xae, 0x27, 0x46, 0x6c, 0xfd, 0x74,
+ 0xab, 0xfd, 0xb8, 0x86, 0x39, 0x98, 0xa8, 0x16, 0x9f, 0xa6, 0x89, 0x34,
+ 0x93, 0xd6, 0x5a, 0xb1, 0x17, 0xa1, 0x54, 0x4d, 0x3a, 0xa7, 0x48, 0x71,
+ 0x58, 0xe9, 0x3a, 0x61, 0xa1, 0xf4, 0x6f, 0x34, 0xaf, 0x9a, 0xbb, 0x73,
+ 0x49, 0x53, 0x3e, 0x1e, 0x11, 0x00, 0xb6, 0x1a, 0xa8, 0x9f, 0x11, 0x1f,
+ 0x47, 0x5f, 0xab, 0xe0, 0x53, 0xf8, 0x33, 0xfa, 0x69, 0x33, 0x3c, 0x90,
+ 0x3d, 0x30, 0x0d, 0x4d, 0xd9, 0xf3, 0x4e, 0x02, 0xf9, 0x8f, 0x92, 0x36,
+ 0xca, 0x7e, 0x5d, 0x8f, 0x37, 0x54, 0x88, 0x46, 0xa2, 0xa0, 0x38, 0xdb,
+ 0xed, 0xd7, 0xc7, 0x93, 0x7b, 0xcb, 0x9a, 0x8a, 0xd7, 0xa2, 0x8a, 0xf1,
+ 0x2c, 0x93, 0x8e, 0xb1, 0x5a, 0x4a, 0xf3, 0xad, 0x70, 0x7e, 0x25, 0xca,
+ 0x31, 0x85, 0x80, 0xdd, 0x47, 0xa7, 0x8f, 0x70, 0x9f, 0x4f, 0xe2, 0xf0,
+ 0xd7, 0xdb, 0xf0, 0xc1, 0xf7, 0x6a, 0x4f, 0xe1, 0x63, 0xe7, 0x86, 0xec,
+ 0x8d, 0xe7, 0xf9, 0x28, 0x7e, 0xcf, 0x42, 0x37, 0x24, 0x23, 0xb0, 0x15,
+ 0x49, 0x77, 0xb0, 0xee, 0x94, 0x10, 0xca, 0x72, 0x95, 0x5f, 0x9c, 0x84,
+ 0xd3, 0x56, 0x2d, 0x65, 0x92, 0xa9, 0x6d, 0xe4, 0x82, 0xa3, 0x82, 0x94,
+ 0x4e, 0x02, 0x42, 0xbe, 0x44, 0x07, 0x63, 0xec, 0x10, 0x93, 0x38, 0x35,
+ 0xc7, 0x7e, 0xfb, 0xba, 0x0c, 0x9d, 0x5c, 0x22, 0xc9, 0xfc, 0x93, 0xcb,
+ 0x78, 0x92, 0x9c, 0x23, 0x9d, 0xd8, 0x7d, 0xbf, 0x6b, 0xfe, 0x1d, 0xec,
+ 0x78, 0xc7, 0x2b, 0xe1, 0x75, 0xd6, 0x10, 0x81, 0x69, 0xfa, 0x47, 0xf1,
+ 0x0b, 0x41, 0x85, 0x8f, 0x68, 0x1e, 0xb2, 0x99, 0xb8, 0x7c, 0x21, 0x95,
+ 0x16, 0x92, 0xce, 0x41, 0xb5, 0x85, 0x8c, 0xdf, 0x62, 0xe8, 0xd6, 0x6f,
+ 0x0d, 0x4e, 0xde, 0x73, 0x6e, 0x85, 0x5d, 0xa0, 0x9b, 0x4d, 0xa7, 0x11,
+ 0x69, 0x9e, 0xf0, 0x69, 0x6e, 0x5c, 0x7c, 0x3b, 0x62, 0x01, 0xfa, 0x34,
+ 0x5b, 0xda, 0xb0, 0x7b, 0xfc, 0x7f, 0x98, 0x02, 0x8a, 0x5f, 0xb7, 0xf4,
+ 0x50, 0xee, 0x6d, 0xbf, 0x02, 0x01, 0x4e, 0x75, 0x1a, 0xdd, 0x55, 0xe9,
+ 0x15, 0xfa, 0x4c, 0x2b, 0xd4, 0x22, 0xad, 0x3e, 0xd5, 0xda, 0x52, 0x40,
+ 0x27, 0x06, 0x39, 0x03, 0x49, 0xf1, 0x73, 0x3c, 0x6e, 0xd0, 0x42, 0xb5,
+ 0xc4, 0x3d, 0x13, 0x6c, 0x38, 0x26, 0xad, 0xe0, 0xcd, 0x85, 0x28, 0xd8,
+ 0xde, 0xc2, 0x89, 0x64, 0xa2, 0xd1, 0xdd, 0x20, 0xb8, 0xa7, 0xf2, 0xdb,
+ 0x9c, 0xf8, 0x2d, 0x6a, 0x85, 0x2c, 0x28, 0x6b, 0xc9, 0xb0, 0xc6, 0xd8,
+ 0xe5, 0x75, 0xf1, 0x63, 0x8c, 0xf3, 0xb9, 0xb8, 0x86, 0x8d, 0xc7, 0x3c,
+ 0xbc, 0xf8, 0x10, 0xc1, 0xc1, 0x4d, 0xbd, 0x3c, 0xf1, 0x2d, 0x67, 0x0b,
+ 0xbc, 0x58, 0x0d, 0x23, 0x42, 0x25, 0xc8, 0xbf, 0x48, 0xab, 0xbc, 0xff,
+ 0xcc, 0xae, 0xc1, 0x69, 0x37, 0xc6, 0xb5, 0x9e, 0x9e, 0x6b, 0x20, 0xbb,
+ 0x80, 0x7d, 0x5b, 0x93, 0x32, 0x9c, 0x9b, 0x38, 0x90, 0xa0, 0xf2, 0x33,
+ 0x0c, 0x7d, 0x06, 0x64, 0xeb, 0xdd, 0xf3, 0x7b, 0x4c, 0xd0, 0xc0, 0x67,
+ 0x7b, 0x33, 0x78, 0x79, 0x39, 0xeb, 0xd3, 0x6a, 0x10, 0xff, 0x2a, 0xa4,
+ 0x24, 0x6d, 0x4a, 0x1e, 0xd6, 0xad, 0x7f, 0xba, 0xbe, 0x5e, 0x5e, 0xc5,
+ 0x3d, 0xe3, 0x11, 0xcd, 0x12, 0x5a, 0x5f, 0x93, 0xd6, 0xd6, 0x67, 0x30,
+ 0xa7, 0x28, 0xc5, 0x7d, 0x8e, 0x19, 0xec, 0x20, 0x6c, 0x33, 0xfc, 0x11,
+ 0x0e, 0x2b, 0x07, 0x60, 0x06, 0x3c, 0x8b, 0x7d, 0x21, 0x8e, 0xce, 0x3d,
+ 0xf6, 0xcd, 0x98, 0x1c, 0x7f, 0xed, 0x46, 0xac, 0xc1, 0xbf, 0xd7, 0x96,
+ 0x70, 0x9f, 0x5c, 0x64, 0xb4, 0xc8, 0x07, 0xf3, 0xed, 0xcd, 0xb2, 0xa4,
+ 0x81, 0x9f, 0x65, 0xf6, 0x16, 0x27, 0x5e, 0xaf, 0xa6, 0x20, 0xbe, 0xf4,
+ 0x4d, 0xac, 0x5a, 0xe8, 0xe6, 0x4a, 0x28, 0x0f, 0xf1, 0x4b, 0xb6, 0x64,
+ 0x8c, 0x98, 0x33, 0x4f, 0xc1, 0xf1, 0x37, 0xb7, 0x9b, 0x35, 0x5f, 0x1f,
+ 0xd3, 0xf5, 0x5c, 0xf8, 0xda, 0xf6, 0xb9, 0x05, 0xd8, 0xd1, 0xc4, 0xef,
+ 0xb6, 0xc1, 0xdb, 0x86, 0xd5, 0xb1, 0x22, 0x96, 0xa2, 0x6e, 0x5e, 0x5f,
+ 0xaa, 0xcd, 0x5e, 0x9b, 0x8a, 0x7a, 0x31, 0x5c, 0x77, 0xb0, 0xb0, 0x34,
+ 0xed, 0xde, 0xde, 0x60, 0xdc, 0xb7, 0x2a, 0x09, 0x88, 0x9e, 0x3a, 0xaa,
+ 0x3e, 0xa5, 0x55, 0x3c, 0xd0, 0xa9, 0x34, 0xc1, 0x06, 0x3d, 0x9d, 0xc5,
+ 0x95, 0x48, 0x46, 0xd7, 0x41, 0x73, 0x5d, 0x95, 0x1d, 0x07, 0x7a, 0x0a,
+ 0xb2, 0x45, 0xf2, 0x88, 0x99, 0x1c, 0x70, 0x3a, 0xc4, 0xda, 0xb1, 0xba,
+ 0x7a, 0x38, 0x0a, 0x43, 0x3a, 0x41, 0xe1, 0x09, 0xc7, 0x24, 0x50, 0x45,
+ 0x70, 0xe5, 0xdb, 0xe8, 0xa2, 0x33, 0xc6, 0xc7, 0xf7, 0xd2, 0x23, 0x01,
+ 0xbf, 0xe1, 0xdb, 0xac, 0x3a, 0x87, 0xe1, 0x0e, 0xab, 0x3d, 0xe0, 0x1f,
+ 0x75, 0x52, 0x9d, 0xdd, 0x9a, 0xed, 0xb5, 0xbb, 0xa4, 0x4c, 0x56, 0x34,
+ 0x07, 0xf2, 0x41, 0x49, 0x72, 0x43, 0x57, 0x8c, 0xb8, 0xca, 0xa6, 0xda,
+ 0x6d, 0x93, 0x29, 0xc3, 0x1b, 0x2f, 0x22, 0x6a, 0xd2, 0x62, 0xa9, 0xcf,
+ 0x59, 0x97, 0x51, 0x10, 0x2f, 0x0e, 0x08, 0xc8, 0xe0, 0xab, 0x97, 0xa3,
+ 0x4b, 0x96, 0xd5, 0x00, 0xf0, 0xba, 0xca, 0x59, 0xcf, 0x8d, 0xa4, 0x13,
+ 0x82, 0xb7, 0x50, 0xaf, 0x6c, 0xb6, 0x80, 0xd1, 0x32, 0x7d, 0x3a, 0x8b,
+ 0x2b, 0xbe, 0x8d, 0xcc, 0x6c, 0xe4, 0xcf, 0x5d, 0x3b, 0x01, 0xf7, 0xfc,
+ 0xf5, 0x51, 0xae, 0x1d, 0x6b, 0xc8, 0x85, 0xa4, 0x78, 0xce, 0x81, 0x7c,
+ 0xff, 0xa6, 0x29, 0x80, 0xac, 0x44, 0xa9, 0xa3, 0xf0, 0x87, 0x69, 0x6f,
+ 0x7e, 0xc9, 0x37, 0xe6, 0x56, 0x8d, 0x8d, 0x9d, 0xa5, 0x31, 0x5d, 0xf4,
+ 0xb3, 0x05, 0x48, 0xd8, 0x78, 0xf6, 0x45, 0xdd, 0x43, 0x3c, 0x45, 0x9b,
+ 0x8f, 0xf8, 0x38, 0x62, 0xda, 0x6a, 0x13, 0x9d, 0x14, 0x9f, 0xd2, 0x43,
+ 0x00, 0x35, 0x9c, 0xeb, 0x94, 0xe0, 0x1c, 0x83, 0x4b, 0x14, 0x0c, 0x82,
+ 0x11, 0x6a, 0x70, 0x8a, 0xd1, 0x0d, 0xc3, 0x87, 0x43, 0x53, 0xa2, 0xa4,
+ 0x75, 0x40, 0x97, 0x05, 0xc5, 0x4c, 0x00, 0xdc, 0x69, 0x35, 0xbc, 0xed,
+ 0xaa, 0x35, 0x68, 0xd8, 0x4a, 0xf5, 0xc8, 0x58, 0xd5, 0x0b, 0x85, 0x15,
+ 0xef, 0x58, 0xf4, 0xf3, 0xfb, 0x45, 0x3a, 0xc0, 0xb1, 0xfe, 0xd2, 0x2d,
+ 0x77, 0x26, 0x49, 0x3c, 0x10, 0xbf, 0xcd, 0xe6, 0x68, 0x9a, 0x02, 0xd0,
+ 0xc7, 0x15, 0xa0, 0xe6, 0xb5, 0xcf, 0x26, 0xaf, 0xc4, 0x44, 0xe1, 0xdf,
+ 0xfc, 0x15, 0x7f, 0xc6, 0x09, 0x6b, 0x4a, 0xfc, 0x74, 0x73, 0xb8, 0x6e,
+ 0x2e, 0xff, 0x57, 0xd6, 0x1f, 0xca, 0x2c, 0x73, 0x5e, 0x07, 0xf0, 0x06,
+ 0xc4, 0xa5, 0x36, 0x80, 0x5e, 0x65, 0x81, 0x6e, 0x09, 0x0f, 0x13, 0xba,
+ 0x34, 0x54, 0x7e, 0x09, 0x13, 0x85, 0x45, 0xb7, 0x19, 0x09, 0xe0, 0xd9,
+ 0x98, 0x84, 0xd9, 0x6e, 0x36, 0x7c, 0x8e, 0x03, 0x46, 0x4f, 0xd5, 0x74,
+ 0x2b, 0xfa, 0x0e, 0xe4, 0xdf, 0x82, 0xad, 0x1f, 0x0c, 0x5d, 0x80, 0x00,
+ 0x02, 0x8d, 0x30, 0x53, 0xf4, 0x44, 0xe2, 0x36, 0xad, 0x4b, 0x97, 0x8c,
+ 0x36, 0xf4, 0x4d, 0xb3, 0xc8, 0xf4, 0xb4, 0x8a, 0x0b, 0xe0, 0x5b, 0x8d,
+ 0x04, 0xcf, 0x66, 0xbf, 0x74, 0x8b, 0x4e, 0xfa, 0x0e, 0x4a, 0x50, 0x81,
+ 0x91, 0xff, 0xde, 0x43, 0xc1, 0x6b, 0x78, 0x63, 0x77, 0x21, 0xf3, 0x25,
+ 0xe1, 0x0d, 0x49, 0x49, 0x8a, 0xe7, 0xe9, 0x7a, 0xd2, 0xd6, 0x09, 0xd4,
+ 0x57, 0x05, 0x53, 0xae, 0xeb, 0xbf, 0x59, 0x98, 0xad, 0xfd, 0x55, 0xbb,
+ 0xac, 0xba, 0xa0, 0xdc, 0x11, 0x11, 0xaa, 0xba, 0x94, 0x9d, 0x26, 0x75,
+ 0x91, 0xce, 0x5a, 0x22, 0xe4, 0xa6, 0x09, 0x30, 0x79, 0xe2, 0xc9, 0xcb,
+ 0x5d, 0x13, 0x6e, 0x74, 0x95, 0x07, 0x98, 0xe7, 0x08, 0xe4, 0x32, 0xa4,
+ 0x2d, 0x76, 0x65, 0x7e, 0xe4, 0xfc, 0x72, 0xae, 0xb9, 0xc5, 0x91, 0x2d,
+ 0xbd, 0xe7, 0x02, 0x51, 0x8b, 0x29, 0xa5, 0x09, 0x5b, 0x46, 0x86, 0xba,
+ 0x55, 0xb2, 0xb0, 0x14, 0x59, 0x75, 0x41, 0x75, 0x6c, 0x09, 0x94, 0x02,
+ 0x70, 0x7d, 0xa0, 0xd6, 0x8c, 0x16, 0x79, 0x8f, 0x3a, 0x67, 0x74, 0xeb,
+ 0x9e, 0x18, 0xf9, 0xd0, 0x45, 0x72, 0xaa, 0xa1, 0x85, 0xfc, 0x5c, 0x83,
+ 0xf7, 0x59, 0x4b, 0x1f, 0x49, 0xd5, 0x5b, 0xf5, 0x87, 0xf5, 0xd7, 0xc6,
+ 0xc1, 0x4f, 0x72, 0xc6, 0x76, 0xdd, 0xdb, 0x47, 0x05, 0xaa, 0xed, 0xc1,
+ 0xd3, 0x51, 0xc3, 0xc9, 0x8a, 0xd4, 0x26, 0xff, 0x5e, 0x80, 0xda, 0x38,
+ 0xc6, 0x6d, 0xdf, 0x22, 0xa1, 0x8b, 0x0b, 0xe5, 0x1f, 0xb7, 0xbe, 0xf1,
+ 0xf9, 0xe0, 0x7e, 0x93, 0x7f, 0x1c, 0x7a, 0xbc, 0x5c, 0xaa, 0xe9, 0xf9,
+ 0xaa, 0x25, 0x38, 0x88, 0xd0, 0xf7, 0x4f, 0xc0, 0xb9, 0xb3, 0x40, 0xc9,
+ 0xf0, 0xf9, 0x13, 0x09, 0x86, 0x88, 0x58, 0x7e, 0x81, 0xa7, 0xaf, 0xeb,
+ 0x1b, 0x66, 0x39, 0x40, 0x2c, 0xeb, 0x11, 0x57, 0xdb, 0x8f, 0xb9, 0x12,
+ 0x54, 0x3d, 0x6e, 0x86, 0xb8, 0x7e, 0x37, 0xc0, 0xd3, 0x71, 0xc0, 0xe2,
+ 0xcd, 0x5f, 0x94, 0xaf, 0xfe, 0x55, 0x76, 0x57, 0x1e, 0x6d, 0x9e, 0xc5,
+ 0xef, 0x5e, 0x30, 0xcf, 0xa9, 0xcd, 0x8d, 0xd7, 0x84, 0x9a, 0x32, 0xcf,
+ 0x3e, 0xf4, 0x62, 0x77, 0x66, 0x49, 0xb9, 0xc4, 0xf5, 0xcf, 0x71, 0x94,
+ 0x1d, 0x61, 0xa7, 0x4f, 0x4f, 0xa9, 0x5e, 0xf5, 0x55, 0xa3, 0xe5, 0xb8,
+ 0x91, 0x47, 0x53, 0x12, 0x72, 0x2b, 0xae, 0x93, 0xe9, 0xee, 0x07, 0x8e,
+ 0x37, 0x27, 0x2b, 0x13, 0x31, 0xdb, 0xe5, 0xc5, 0x39, 0x73, 0x3c, 0x71,
+ 0xb9, 0xad, 0x04, 0x99, 0xfe, 0x00, 0x44, 0xc4, 0xb6, 0xc9, 0x12, 0xc3,
+ 0x15, 0xb6, 0x2c, 0x9c, 0xde, 0x5a, 0x7a, 0x39, 0xc2, 0x66, 0xf1, 0x7c,
+ 0x4c, 0x93, 0x0a, 0x1d, 0x2e, 0xae, 0x2d, 0x1f, 0x23, 0x09, 0x77, 0x4a,
+ 0x24, 0x62, 0x6b, 0x7d, 0x49, 0x4f, 0xc2, 0x31, 0x76, 0x78, 0x31, 0xfc,
+ 0xbc, 0x58, 0x0e, 0xce, 0x1a, 0x65, 0xbf, 0x29, 0xb8, 0x35, 0xf9, 0x28,
+ 0x75, 0xfe, 0xbd, 0x54, 0x8e, 0xe5, 0x6d, 0x1e, 0xa8, 0x48, 0x4a, 0xf0,
+ 0x1f, 0x51, 0xb5, 0x2f, 0xd9, 0xb1, 0x57, 0x6c, 0xc5, 0x6b, 0x57, 0xa1,
+ 0xf4, 0x10, 0xaf, 0x20, 0xfe, 0xad, 0x5f, 0x3f, 0xff, 0xf7, 0xef, 0x80,
+ 0x87, 0xdf, 0x77, 0x9d, 0xe6, 0x83, 0xa9, 0x4e, 0x26, 0x37, 0xbc, 0x7f,
+ 0xed, 0xe2, 0xd6, 0xc0, 0x7f, 0x32, 0x2c, 0x6a, 0xb5, 0x43, 0xad, 0xbe,
+ 0xfb, 0x47, 0x67, 0x50, 0x26, 0x67, 0xb9, 0xe9, 0x86, 0xdf, 0x27, 0x06,
+ 0x18, 0x66, 0x91, 0x9c, 0x5f, 0xec, 0x5c, 0x56, 0xcc, 0xcf, 0x05, 0x95,
+ 0xd8, 0xfa, 0xcc, 0x3e, 0x06, 0x3c, 0xd0, 0x53, 0x37, 0x83, 0x0d, 0x96,
+ 0x7b, 0xca, 0xd0, 0x58, 0x71, 0x6b, 0x9c, 0x2c, 0xef, 0x25, 0x9e, 0xce,
+ 0x29, 0xd0, 0xf1, 0x9f, 0xb3, 0x97, 0x67, 0x14, 0x78, 0xc5, 0xa5, 0xb6,
+ 0xdf, 0xe9, 0x8a, 0xb8, 0xc2, 0xf2, 0x05, 0x00, 0x4c, 0xd8, 0xfe, 0x64,
+ 0x44, 0xfc, 0x27, 0x2c, 0x96, 0xf6, 0x8d, 0x88, 0xb9, 0x01, 0x49, 0xbf,
+ 0xd3, 0xc3, 0x93, 0x6a, 0x0f, 0xed, 0x15, 0xbc, 0x0b, 0x9b, 0x11, 0xe0,
+ 0x9e, 0x61, 0xc6, 0xa2, 0x99, 0x6b, 0x33, 0x4a, 0xf4, 0x92, 0xef, 0xe7,
+ 0x92, 0xde, 0x37, 0x78, 0x6f, 0x73, 0x7a, 0x32, 0x51, 0xbb, 0xc8, 0xaf,
+ 0x53, 0xd5, 0x5c, 0xa9, 0xf2, 0x88, 0x70, 0x22, 0xb7, 0x38, 0xd6, 0xb8,
+ 0x82, 0x2b, 0x19, 0xa5, 0x6f, 0x99, 0x57, 0xb4, 0xe1, 0xf1, 0x7f, 0xf5,
+ 0x40, 0x0d, 0x47, 0x5c, 0xea, 0x75, 0xd0, 0x47, 0xbc, 0x9a, 0x4c, 0x1e,
+ 0xb6, 0x57, 0xfe, 0x81, 0x55, 0x67, 0x1f, 0xad, 0xae, 0x98, 0x66, 0x65,
+ 0x2b, 0x32, 0x7d, 0x37, 0xe4, 0x88, 0x1e, 0x33, 0x20, 0x1a, 0x30, 0x64,
+ 0x43, 0xfa, 0x4f, 0x0c, 0x17, 0xff, 0x1e, 0x68, 0x40, 0xe3, 0xa1, 0x67,
+ 0x69, 0x88, 0xa8, 0x45, 0x3e, 0x99, 0xaa, 0x7e, 0x51, 0x6f, 0xbf, 0xf8,
+ 0xb6, 0xaa, 0xf0, 0x11, 0xe2, 0x8d, 0xf8, 0xe5, 0x2a, 0xe2, 0x59, 0xe2,
+ 0xdd, 0x48, 0xf7, 0x0c, 0x17, 0x1d, 0x55, 0x7c, 0x1c, 0x52, 0xc1, 0xd0,
+ 0x42, 0xf4, 0xcc, 0x6d, 0x04, 0x7a, 0x2b, 0xf9, 0x50, 0xe2, 0x7a, 0xe8,
+ 0xc1, 0xa9, 0xc9, 0x9d, 0x91, 0x5e, 0x7d, 0x61, 0x93, 0x15, 0x29, 0x51,
+ 0x29, 0x18, 0x12, 0x1a, 0x24, 0xcd, 0xbf, 0xb7, 0x55, 0x1c, 0x36, 0xb8,
+ 0x3b, 0xa8, 0x35, 0x0d, 0x19, 0xa6, 0xb7, 0x8b, 0x65, 0xb6, 0x24, 0xf8,
+ 0x93, 0x26, 0x11, 0xb3, 0xa1, 0x9b, 0x92, 0x40, 0x92, 0x1b, 0xfc, 0x70,
+ 0x06, 0x3f, 0x1a, 0x4e, 0x4e, 0xe3, 0xc8, 0x79, 0xba, 0xfb, 0x14, 0x23,
+ 0xd0, 0x33, 0x9e, 0x9d, 0xfe, 0xf6, 0x6a, 0x58, 0x9a, 0x4c, 0x0c, 0x00,
+ 0x2a, 0xc9, 0x65, 0xce, 0xbf, 0xd5, 0x1e, 0xd4, 0x94, 0x05, 0xe1, 0x86,
+ 0xf2, 0x5e, 0x16, 0xc0, 0x90, 0x2e, 0x1a, 0x31, 0x27, 0xc4, 0xc9, 0xaa,
+ 0xf8, 0xe5, 0x16, 0x1d, 0x7d, 0x85, 0x73, 0x33, 0x60, 0x73, 0xc8, 0x12,
+ 0xe5, 0xf9, 0xbb, 0xbc, 0xc3, 0xb2, 0xb2, 0x6e, 0xa1, 0xa8, 0x53, 0x48,
+ 0x32, 0x83, 0xec, 0xe2, 0xef, 0x81, 0xdf, 0x9e, 0xb1, 0x1c, 0x09, 0xc8,
+ 0xc9, 0x28, 0x84, 0x8a, 0x49, 0xaa, 0x82, 0x31, 0x44, 0x2c, 0x42, 0x23,
+ 0xdb, 0x24, 0xca, 0xe4, 0x70, 0xc0, 0x08, 0x2c, 0xfa, 0xaa, 0xc9, 0xe5,
+ 0x97, 0x7b, 0xf3, 0x3c, 0x4f, 0xa0, 0x60, 0x70, 0xa6, 0xc6, 0x2d, 0x4c,
+ 0xf8, 0xf0, 0x30, 0x57, 0x26, 0x37, 0x3e, 0x70, 0x6c, 0x45, 0x08, 0xed,
+ 0xc3, 0xd1, 0x9b, 0xa7, 0x9a, 0x0c, 0xab, 0xc9, 0x91, 0x80, 0xfc, 0xff,
+ 0x97, 0x1e, 0x09, 0x07, 0x54, 0x45, 0xd9, 0x06, 0xbf, 0xed, 0xcc, 0xb6,
+ 0x6b, 0x1c, 0x3c, 0x5c, 0xff, 0xbc, 0x83, 0x92, 0xa5, 0x3f, 0x02, 0x1f,
+ 0x35, 0x77, 0xcf, 0x24, 0x59, 0xf8, 0x63, 0x78, 0x4d, 0x1e, 0x96, 0x44,
+ 0x63, 0x97, 0x48, 0x23, 0x49, 0x2c, 0x63, 0x3a, 0x48, 0x4f, 0x9c, 0x82,
+ 0x66, 0xea, 0x6c, 0x4c, 0xaf, 0x9e, 0x64, 0xcf, 0x3e, 0x81, 0x31, 0x2e,
+ 0xb0, 0x4b, 0x45, 0xf1, 0x8c, 0xde, 0x22, 0xea, 0xfb, 0x72, 0xe5, 0x2d,
+ 0x18, 0xdf, 0x2f, 0xd2, 0x69, 0x0d, 0xa1, 0xe8, 0x60, 0x53, 0x3b, 0x48,
+ 0xf2, 0x29, 0x16, 0x2c, 0x73, 0xf7, 0x9c, 0xdc, 0x13, 0x93, 0xb5, 0x15,
+ 0xb7, 0x3f, 0x79, 0x62, 0xe6, 0xfd, 0x86, 0x17, 0x4a, 0xb6, 0x88, 0xfa,
+ 0x17, 0x9a, 0x56, 0xe1, 0xe1, 0xa3, 0x3b, 0x42, 0x06, 0x5f, 0x87, 0x3d,
+ 0x93, 0xad, 0xf2, 0xb6, 0x45, 0xe9, 0xf0, 0xea, 0xb7, 0xb9, 0xdd, 0x67,
+ 0x6a, 0xac, 0x87, 0x43, 0x55, 0xc3, 0x1e, 0x1c, 0x5a, 0xed, 0xa7, 0x91,
+ 0xd8, 0x82, 0x27, 0xeb, 0x2a, 0x68, 0xb9, 0xa0, 0x3c, 0x86, 0x5c, 0xd7,
+ 0x6f, 0xb3, 0xb7, 0xa0, 0x6f, 0x91, 0x64, 0xc5, 0xa7, 0x45, 0xd9, 0x23,
+ 0xd8, 0xf6, 0x69, 0x9f, 0xc6, 0x22, 0x66, 0xba, 0x64, 0x07, 0xaa, 0x50,
+ 0xd7, 0x07, 0xf7, 0xe4, 0xd8, 0x78, 0x9b, 0x75, 0xd1, 0x1a, 0xe2, 0xf5,
+ 0x14, 0x59, 0x24, 0x96, 0xec, 0xdd, 0x14, 0xef, 0xa2, 0xbf, 0x14, 0x1b,
+ 0x6e, 0xfd, 0x2c, 0x1f, 0xc9, 0x38, 0x5e, 0x85, 0x65, 0x7e, 0xb7, 0xe3,
+ 0x51, 0x5f, 0x0b, 0x3d, 0x30, 0xf5, 0xcf, 0x30, 0x98, 0x72, 0xce, 0xec,
+ 0xef, 0x8b, 0x04, 0xba, 0xba, 0xc6, 0xf1, 0xb4, 0x56, 0x7d, 0x5f, 0x64,
+ 0x8b, 0x17, 0x06, 0x64, 0x55, 0x84, 0xbf, 0x2e, 0x78, 0xda, 0x5d, 0xfc,
+ 0x81, 0xd6, 0xe4, 0x8a, 0x7e, 0x7b, 0x3a, 0x6c, 0x59, 0xdb, 0xd3, 0xa3,
+ 0xe7, 0x91, 0x7a, 0x52, 0x73, 0x95, 0x2b, 0x3d, 0x17, 0xd8, 0x34, 0xea,
+ 0x99, 0x68, 0xbf, 0x53, 0xc1, 0x31, 0xd6, 0x3b, 0xb1, 0xaa, 0x78, 0xb5,
+ 0xb1, 0x55, 0x6d, 0x0c, 0x96, 0x86, 0xa2, 0x2c, 0x36, 0xa7, 0xab, 0x62,
+ 0x3f, 0xcb, 0x66, 0x54, 0x6d, 0xab, 0xf7, 0x18, 0xc5, 0xec, 0x1c, 0xd8,
+ 0x3e, 0x7c, 0x19, 0xb7, 0x96, 0xd2, 0xa1, 0x12, 0xfb, 0xad, 0x27, 0x22,
+ 0x3e, 0xc4, 0x37, 0x07, 0x55, 0xc6, 0x92, 0x13, 0xac, 0xa9, 0x32, 0x3e,
+ 0x83, 0x02, 0x31, 0x5e, 0x94, 0x52, 0x66, 0x60, 0x99, 0x55, 0x4c, 0x3c,
+ 0x54, 0xe2, 0xe1, 0x16, 0x95, 0x4e, 0x81, 0x85, 0x32, 0x80, 0xe0, 0x89,
+ 0xa3, 0x9f, 0x73, 0x16, 0x8d, 0x70, 0xbf, 0x17, 0x71, 0x27, 0x16, 0xeb,
+ 0x06, 0xbb, 0xb4, 0xc3, 0x9d, 0xbb, 0x2a, 0xc3, 0xd4, 0xfa, 0x00, 0x2b,
+ 0x75, 0x3b, 0xbb, 0x5b, 0x14, 0xf1, 0x97, 0x92, 0x5e, 0xda, 0x71, 0x93,
+ 0xaf, 0xcb, 0x22, 0xeb, 0x1d, 0xf5, 0xfe, 0x42, 0x42, 0xcd, 0x13, 0x84,
+ 0x9a, 0xef, 0xb8, 0x55, 0x67, 0x28, 0x74, 0xa8, 0xea, 0xa1, 0x70, 0x6f,
+ 0x0c, 0x02, 0xe7, 0xfd, 0xcd, 0x7f, 0x1f, 0x74, 0xcb, 0xf3, 0x0f, 0x80,
+ 0x64, 0x30, 0xfc, 0xd0, 0xb2, 0x45, 0xc9, 0x84, 0x2b, 0x7c, 0x88, 0xa9,
+ 0xc0, 0x2c, 0x3d, 0xfe, 0x50, 0x2e, 0x5b, 0xfe, 0xec, 0xc8, 0xf0, 0x4d,
+ 0xab, 0xcc, 0xb6, 0xab, 0x55, 0x7a, 0x56, 0x20, 0x48, 0xff, 0x9d, 0x00,
+ 0xdf, 0x4e, 0x88, 0x2c, 0x0d, 0x97, 0xe7, 0x42, 0xe2, 0x84, 0xdd, 0x5f,
+ 0x41, 0xe5, 0x2c, 0x32, 0xdf, 0x7b, 0x1b, 0x81, 0x9e, 0xd3, 0x44, 0x33,
+ 0x57, 0x39, 0xa0, 0xa6, 0xd0, 0x61, 0xd6, 0x29, 0x49, 0x55, 0xae, 0xb0,
+ 0x0d, 0x76, 0x44, 0xe0, 0x4c, 0xb1, 0x34, 0x9b, 0x09, 0x19, 0x9b, 0x8e,
+ 0xf3, 0x7c, 0x66, 0x58, 0xf8, 0x24, 0xd8, 0xd9, 0x85, 0x61, 0x2a, 0x0d,
+ 0xd0, 0xfe, 0xd8, 0xa8, 0xeb, 0xd8, 0x26, 0x7e, 0x2d, 0x2d, 0x51, 0x48,
+ 0xae, 0xa6, 0x10, 0xc8, 0x51, 0x5e, 0x02, 0x2e, 0xd4, 0x4b, 0xcc, 0x29,
+ 0x6b, 0x5d, 0x22, 0x5d, 0x34, 0x6d, 0x4a, 0xff, 0x99, 0x78, 0x39, 0x13,
+ 0xe0, 0x49, 0xc2, 0x37, 0xf2, 0x8c, 0xab, 0xe4, 0x00, 0x6d, 0x29, 0x31,
+ 0x9b, 0xba, 0x51, 0x32, 0xc5, 0x08, 0x37, 0xc5, 0xec, 0x52, 0xb0, 0xf8,
+ 0x00, 0xe4, 0x12, 0xfb, 0xf8, 0x72, 0x59, 0x32, 0xea, 0x17, 0x48, 0xc2,
+ 0x7c, 0x5b, 0xc0, 0xf5, 0xde, 0x3f, 0xe9, 0x1d, 0x1d, 0xe6, 0x40, 0xb3,
+ 0x57, 0x29, 0x8b, 0x8b, 0x77, 0xfd, 0x9b, 0xbe, 0x9b, 0x50, 0x04, 0xc7,
+ 0x30, 0x7b, 0x16, 0x0a, 0x6f, 0x90, 0xff, 0xf7, 0xa6, 0x0c, 0xf3, 0x9d,
+ 0x42, 0xdc, 0xd8, 0x97, 0x37, 0xe1, 0x10, 0xde, 0xa4, 0x88, 0x70, 0xd6,
+ 0xad, 0xd0, 0x11, 0x45, 0x25, 0xaf, 0x6b, 0x53, 0x66, 0x37, 0x54, 0xf5,
+ 0x61, 0x44, 0x5e, 0xeb, 0x99, 0x77, 0x0b, 0xe2, 0x63, 0x25, 0xe3, 0x38,
+ 0xd6, 0xcc, 0x37, 0x1b, 0x40, 0xa1, 0x67, 0xe2, 0x32, 0x5c, 0xc3, 0x59,
+ 0x4a, 0x89, 0xcf, 0x37, 0x5b, 0xba, 0xb0, 0xd2, 0x5a, 0xa8, 0xc9, 0x30,
+ 0x6f, 0x76, 0x55, 0x52, 0xb4, 0x6e, 0x61, 0xd1, 0x37, 0x3d, 0x0f, 0x4a,
+ 0xc7, 0x9a, 0xb3, 0x6f, 0x61, 0x8e, 0x07, 0x3e, 0x38, 0x5f, 0x80, 0xaf,
+ 0xf5, 0x75, 0x8c, 0xb5, 0x66, 0x42, 0x68, 0x87, 0x48, 0x01, 0x15, 0x95,
+ 0x17, 0x0a, 0x2e, 0x3e, 0xc8, 0xaa, 0x65, 0xe2, 0x64, 0x5a, 0x3c, 0x37,
+ 0xb7, 0x15, 0x10, 0x26, 0x04, 0x5f, 0x19, 0x58, 0x7a, 0x38, 0xf8, 0x0b,
+ 0x25, 0x94, 0x2d, 0x4d, 0x20, 0xbb, 0x0c, 0x64, 0xa1, 0x0c, 0xd8, 0x34,
+ 0x81, 0x2a, 0xb2, 0x6c, 0xd4, 0x36, 0x18, 0x30, 0x95, 0x0d, 0xa9, 0x2a,
+ 0x03, 0xea, 0x9f, 0xfc, 0xef, 0x5d, 0x90, 0x80, 0x53, 0x89, 0xb6, 0xde,
+ 0xbe, 0x25, 0xe3, 0x66, 0x3d, 0x33, 0x0c, 0x86, 0x2c, 0xb2, 0x57, 0x24,
+ 0x7d, 0xd5, 0x11, 0xc0, 0x0c, 0x0e, 0xf5, 0x6c, 0x29, 0xe8, 0x02, 0xae,
+ 0x39, 0x3c, 0xa1, 0x41, 0x3f, 0x67, 0x7c, 0x60, 0x98, 0x02, 0x55, 0xcb,
+ 0x3d, 0xcb, 0xfb, 0x54, 0xad, 0x24, 0x72, 0x65, 0xb7, 0x93, 0x53, 0x62,
+ 0x93, 0x43, 0x24, 0xca, 0x43, 0xbb, 0xc5, 0x07, 0x77, 0x09, 0xdf, 0x98,
+ 0x4e, 0x45, 0x30, 0x09, 0x82, 0x3f, 0xbe, 0xfc, 0xd4, 0x3b, 0x29, 0x34,
+ 0xb9, 0x8f, 0x67, 0x21, 0xc6, 0x65, 0xa6, 0xb2, 0x75, 0x66, 0x61, 0x78,
+ 0xfc, 0xed, 0xc1, 0xe2, 0xa0, 0xe9, 0x47, 0x05, 0xa0, 0x35, 0x2f, 0x42,
+ 0x67, 0xa1, 0x9b, 0xb8, 0xe7, 0xe7, 0xd3, 0xc0, 0x33, 0xb3, 0xc3, 0x3a,
+ 0x34, 0x47, 0xb2, 0x01, 0x83, 0xb3, 0x56, 0xaf, 0xe0, 0x82, 0x23, 0xe7,
+ 0x25, 0x9b, 0x30, 0xea, 0x78, 0x9c, 0x70, 0x55, 0x4d, 0x99, 0x19, 0x3a,
+ 0xda, 0x12, 0xc1, 0x4d, 0x42, 0xbe, 0xcc, 0x07, 0xd4, 0x71, 0x1d, 0x20,
+ 0xb2, 0xf6, 0xe9, 0xdf, 0x62, 0xf9, 0x66, 0x75, 0x34, 0xc0, 0x99, 0x16,
+ 0xb6, 0xa1, 0x75, 0x2c, 0x38, 0x50, 0xe0, 0xfc, 0x6c, 0x18, 0xd8, 0x43,
+ 0x2b, 0xdf, 0x2d, 0xf0, 0xd3, 0x4e, 0x8e, 0x3f, 0x35, 0xb7, 0x54, 0x84,
+ 0xc8, 0x38, 0x5f, 0xd7, 0x00, 0xc6, 0xc1, 0x64, 0xda, 0x46, 0x0c, 0x2f,
+ 0xfe, 0x69, 0x12, 0xb4, 0x6e, 0x64, 0xff, 0x80, 0x75, 0x7b, 0x98, 0xa2,
+ 0xb6, 0xd4, 0x23, 0x6e, 0xea, 0x75, 0x43, 0x6f, 0x5c, 0x5e, 0x03, 0x77,
+ 0x40, 0x81, 0x43, 0x26, 0x31, 0xd0, 0x97, 0xc5, 0xa9, 0xe4, 0x78, 0x75,
+ 0x3d, 0x66, 0x73, 0x41, 0xe6, 0x21, 0x9a, 0x3a, 0xde, 0x19, 0x36, 0x93,
+ 0x8d, 0x56, 0xe2, 0x17, 0x3f, 0x14, 0x54, 0xc5, 0x20, 0xbf, 0xb6, 0x43,
+ 0x7b, 0x6c, 0xac, 0xf9, 0xbe, 0xa9, 0xe5, 0xfc, 0x57, 0xd7, 0x38, 0x6a,
+ 0x92, 0x07, 0x73, 0x92, 0xb2, 0x2b, 0xdb, 0xb1, 0xdb, 0x5c, 0xae, 0x53,
+ 0xac, 0x8b, 0xa1, 0xad, 0xd2, 0xe5, 0xe0, 0xa4, 0x2d, 0xe0, 0xbf, 0x70,
+ 0x60, 0xbf, 0xef, 0xa9, 0x62, 0x9e, 0x20, 0x1f, 0x43, 0xc3, 0xae, 0x70,
+ 0xb7, 0x22, 0x77, 0xe7, 0x94, 0x13, 0x93, 0x44, 0x68, 0x2f, 0x22, 0x29,
+ 0xac, 0xf3, 0xff, 0xc8, 0xce, 0x60, 0x3b, 0xa8, 0x9a, 0x99, 0x54, 0xcb,
+ 0x04, 0x0c, 0xf7, 0x41, 0xf8, 0xed, 0x1a, 0x25, 0x8c, 0xbe, 0x2d, 0x2c,
+ 0x85, 0x3e, 0x22, 0xec, 0x85, 0x13, 0xe6, 0x1f, 0x65, 0x0a, 0xd4, 0xc5,
+ 0xcf, 0x35, 0x2f, 0xb0, 0xa9, 0x5a, 0xe2, 0x0e, 0x5d, 0xf5, 0x32, 0x84,
+ 0xd7, 0xcd, 0x98, 0x15, 0xb5, 0x65, 0x5d, 0xff, 0xf0, 0x9d, 0x9c, 0x87,
+ 0x2d, 0x26, 0x2a, 0xdc, 0x05, 0xfc, 0x72, 0xdc, 0x35, 0x97, 0xd6, 0x20,
+ 0xf7, 0x9b, 0x64, 0x06, 0x5a, 0x68, 0x5a, 0x26, 0x1a, 0x87, 0x93, 0x9d,
+ 0xe9, 0xe4, 0x50, 0x5e, 0x59, 0xbc, 0xdb, 0x85, 0x23, 0x20, 0x7b, 0x28,
+ 0x5a, 0xbc, 0x21, 0x5e, 0xad, 0xfd, 0xfd, 0x0b, 0xb4, 0xfa, 0xe1, 0x4d,
+ 0xcb, 0xa3, 0xfe, 0xd2, 0xa6, 0x99, 0xb1, 0xe5, 0x4f, 0x05, 0x0f, 0xe8,
+ 0x28, 0xbf, 0x58, 0x13, 0xd7, 0x31, 0xbb, 0x09, 0xad, 0x8a, 0x2a, 0x3e,
+ 0x85, 0x06, 0x81, 0x2a, 0xdf, 0xe2, 0xd9, 0xfd, 0xb2, 0x42, 0xc2, 0x5c,
+ 0x98, 0xe5, 0xbd, 0x17, 0x6a, 0xc8, 0x89, 0xa7, 0x5d, 0x2e, 0xed, 0x84,
+ 0xe1, 0x37, 0xe4, 0x9f, 0x61, 0x21, 0x47, 0x54, 0xa4, 0xaa, 0x46, 0xce,
+ 0x55, 0x38, 0xb2, 0xfb, 0xc0, 0xa6, 0x8b, 0xe7, 0xb6, 0xf3, 0xb0, 0x7d,
+ 0x62, 0x1b, 0x0e, 0x2a, 0xf3, 0x39, 0xa3, 0x34, 0xf7, 0x8a, 0xb5, 0x91,
+ 0xfe, 0x73, 0xb9, 0xa5, 0xc3, 0x34, 0xb3, 0x8b, 0x71, 0xe5, 0xe4, 0x6c,
+ 0x34, 0x09, 0xef, 0x5c, 0x4a, 0x0c, 0x0f, 0xdf, 0xed, 0xab, 0x6c, 0x0f,
+ 0x49, 0x92, 0x9b, 0xf4, 0x95, 0xe1, 0xbf, 0xf8, 0x9d, 0xf1, 0xd1, 0xe2,
+ 0xf8, 0x81, 0x43, 0xdc, 0x39, 0xd1, 0xba, 0x51, 0x5f, 0xc6, 0xe4, 0x60,
+ 0x21, 0x68, 0xb2, 0xf3, 0xeb, 0xda, 0xd1, 0xfd, 0xaf, 0xc8, 0xb1, 0x02,
+ 0x94, 0xa0, 0xe8, 0x31, 0x1a, 0xe1, 0x6e, 0xff, 0xff, 0xee, 0xb2, 0x9c,
+ 0xe3, 0x73, 0x54, 0x0d, 0x13, 0x67, 0xde, 0x18, 0x97, 0xad, 0xc2, 0xc5,
+ 0xf3, 0x4d, 0xf2, 0x4d, 0x9b, 0x8c, 0xcf, 0xfa, 0xdb, 0x88, 0xe4, 0x5e,
+ 0x5b, 0xf5, 0xe3, 0x92, 0x3f, 0xff, 0xc2, 0x6b, 0xfe, 0xae, 0xea, 0x9b,
+ 0x52, 0xfe, 0xc0, 0x4b, 0xcc, 0xf9, 0xfa, 0x12, 0x63, 0xf8, 0x7f, 0xf8,
+ 0xf9, 0x88, 0x30, 0xcf, 0x57, 0xa2, 0x7b, 0xd2, 0x2a, 0xb6, 0xe1, 0xb9,
+ 0x77, 0x6e, 0x06, 0x60, 0xb9, 0x1b, 0x9d, 0x65, 0x40, 0x1a, 0x90, 0x90,
+ 0x4f, 0x17, 0xfb, 0x9b, 0xf9, 0x1d, 0x68, 0xb3, 0x6d, 0x59, 0x51, 0xee,
+ 0x54, 0x74, 0xb1, 0xf1, 0xa7, 0x62, 0xb2, 0x4e, 0xd7, 0x02, 0x47, 0x11,
+ 0x7b, 0x1d, 0x0e, 0x37, 0x08, 0xb7, 0x57, 0x97, 0x3b, 0x32, 0xda, 0x89,
+ 0xb9, 0x86, 0x2e, 0x5a, 0xec, 0x81, 0x08, 0x75, 0xaa, 0x41, 0x53, 0xd7,
+ 0x97, 0x99, 0x67, 0x25, 0x30, 0x6f, 0x49, 0x59, 0xae, 0x91, 0xf2, 0xa4,
+ 0xb7, 0x3e, 0x1e, 0xd3, 0xb3, 0x39, 0x3e, 0x5a, 0x4e, 0xc4, 0x53, 0x07,
+ 0x29, 0x6e, 0x02, 0x75, 0x83, 0x20, 0x4d, 0x26, 0xa0, 0xe1, 0xcb, 0xdb,
+ 0x56, 0xed, 0xd8, 0x0e, 0xf0, 0x3e, 0x80, 0x91, 0xb4, 0x23, 0x7a, 0xe9,
+ 0xef, 0x11, 0x73, 0x6b, 0xc6, 0x73, 0xc5, 0x46, 0x6d, 0x04, 0x64, 0xde,
+ 0x58, 0xdf, 0x3e, 0xb3, 0x41, 0x9c, 0x9d, 0x44, 0x6f, 0x58, 0x12, 0x80,
+ 0x48, 0x05, 0x14, 0xe8, 0x9c, 0xf2, 0xbb, 0xbd, 0x7a, 0x13, 0xf5, 0x9a,
+ 0x48, 0x72, 0xc3, 0x7d, 0x6d, 0x54, 0x1a, 0x7c, 0x30, 0xcd, 0x78, 0x10,
+ 0xac, 0x38, 0x46, 0xd4, 0x85, 0xf6, 0xe5, 0x35, 0x6b, 0xa1, 0x51, 0xea,
+ 0x4d, 0x16, 0x58, 0xe9, 0x79, 0x14, 0x3f, 0x92, 0x97, 0x01, 0x0f, 0x6d,
+ 0x34, 0x90, 0x91, 0x1c, 0xb9, 0xdc, 0xa7, 0xad, 0x1f, 0x8f, 0x3f, 0x24,
+ 0x00, 0xfe, 0x5e, 0xcb, 0xad, 0xaa, 0x0d, 0x88, 0xd1, 0xe3, 0xb0, 0xa7,
+ 0xda, 0x11, 0xef, 0x68, 0x81, 0x95, 0x80, 0x9e, 0x81, 0xdb, 0x26, 0xcc,
+ 0x09, 0x78, 0x3e, 0x60, 0xee, 0x39, 0xc2, 0xb1, 0x8b, 0xa0, 0x5b, 0x63,
+ 0xd3, 0xc8, 0xa9, 0x41, 0x64, 0xbd, 0x06, 0x11, 0x2b, 0xf0, 0x43, 0x08,
+ 0xf0, 0x5d, 0x3b, 0x3c, 0x7d, 0xb5, 0x6f, 0xec, 0x6b, 0x65, 0xf4, 0x12,
+ 0xdf, 0xa3, 0x6e, 0xab, 0x11, 0xca, 0xc7, 0x10, 0x61, 0xd1, 0xdd, 0xf2,
+ 0xa3, 0x03, 0xd7, 0x82, 0xf0, 0xf8, 0x30, 0xfe, 0x01, 0x42, 0x87, 0x58,
+ 0xb9, 0x9d, 0x85, 0xa1, 0x03, 0x31, 0xa3, 0x31, 0xc3, 0xc1, 0xa9, 0xad,
+ 0x13, 0x69, 0xcb, 0x4c, 0x75, 0x07, 0xc8, 0x60, 0x5a, 0x8f, 0x38, 0x5c,
+ 0xa4, 0x4b, 0xc3, 0x4b, 0x9a, 0xb2, 0x19, 0xda, 0xfd, 0xbf, 0x22, 0x19,
+ 0xaa, 0x29, 0xaa, 0x23, 0xa5, 0x75, 0xb2, 0x69, 0x3c, 0xe7, 0x39, 0xc8,
+ 0x5c, 0xda, 0x4d, 0xd2, 0x51, 0x95, 0x95, 0x71, 0xb8, 0x17, 0x10, 0x71,
+ 0xf5, 0x95, 0xa0, 0xf4, 0x11, 0x41, 0x40, 0x1d, 0x8e, 0xff, 0xaf, 0xf2,
+ 0xa3, 0xdd, 0xa2, 0x85, 0x4c, 0x3e, 0x82, 0x29, 0x4e, 0x6a, 0x08, 0xd1,
+ 0x87, 0x30, 0xaa, 0xe6, 0x59, 0x96, 0xab, 0xf7, 0x70, 0x88, 0x36, 0x3d,
+ 0x0b, 0x4e, 0xf0, 0x4f, 0x85, 0xe9, 0xa6, 0x86, 0xc7, 0xff, 0xd0, 0xf7,
+ 0xc2, 0xed, 0xe6, 0x87, 0xd2, 0xfd, 0x72, 0x2b, 0x34, 0x76, 0x6b, 0xed,
+ 0x9a, 0xd1, 0x55, 0x89, 0x44, 0x3b, 0xc5, 0xb9, 0xc0, 0xa2, 0x0a, 0x14,
+ 0x57, 0x22, 0x50, 0x45, 0x2d, 0xea, 0xe2, 0x2c, 0x8f, 0x8e, 0x45, 0x57,
+ 0x8c, 0x05, 0x7b, 0xe6, 0x27, 0x86, 0xb0, 0xef, 0x4e, 0xaf, 0xb7, 0x6b,
+ 0xe9, 0x41, 0x04, 0x07, 0x53, 0xf6, 0x68, 0x30, 0xd0, 0xc5, 0x5f, 0xf0,
+ 0x0e, 0xda, 0xf5, 0xd9, 0x8f, 0x01, 0x00, 0xf0, 0xdb, 0x72, 0xa6, 0x78,
+ 0xc2, 0xad, 0x6d, 0x05, 0x11, 0xae, 0x7e, 0x7a, 0xcb, 0x25, 0x02, 0xd4,
+ 0x5f, 0x70, 0x95, 0xaf, 0xda, 0x88, 0x2d, 0xa6, 0xfe, 0x3c, 0xfa, 0x7b,
+ 0x16, 0xfb, 0xb3, 0x4f, 0x5d, 0x6b, 0x43, 0x97, 0x51, 0x3c, 0xbf, 0xab,
+ 0x9f, 0xd4, 0x0f, 0x9f, 0xb2, 0x9e, 0x6d, 0xea, 0xbf, 0x08, 0x0c, 0xf0,
+ 0xb2, 0xe9, 0xd5, 0x31, 0x6e, 0x95, 0x8d, 0x2f, 0x2a, 0xc4, 0x7a, 0x43,
+ 0x27, 0x55, 0x32, 0x7c, 0xc2, 0xf2, 0xb2, 0x97, 0xf1, 0xd8, 0x4c, 0xd6,
+ 0x0d, 0xb7, 0xc6, 0x80, 0xc6, 0x5e, 0x0a, 0xd4, 0xf8, 0x09, 0x5d, 0xc1,
+ 0x4a, 0xad, 0x2e, 0x9f, 0x2e, 0x3a, 0x66, 0x73, 0xb9, 0xa3, 0x66, 0x73,
+ 0x51, 0x2c, 0x3c, 0xcb, 0xac, 0xad, 0x74, 0xb4, 0xce, 0xb8, 0x68, 0x0b,
+ 0xa5, 0x43, 0xc6, 0xa6, 0xca, 0xb6, 0x58, 0xdc, 0x91, 0xaf, 0x55, 0x06,
+ 0xe9, 0xb4, 0x51, 0x27, 0x21, 0x8b, 0x93, 0xef, 0x4b, 0x19, 0xc8, 0xd1,
+ 0x5a, 0x24, 0x64, 0x46, 0x34, 0xde, 0x85, 0x58, 0xdf, 0x13, 0x4a, 0xa8,
+ 0x6b, 0x7e, 0x21, 0x27, 0xbc, 0x1d, 0xcf, 0xc9, 0xb4, 0xd7, 0xd8, 0x16,
+ 0xe4, 0xd3, 0xed, 0x29, 0xcf, 0x70, 0xc1, 0x64, 0x4c, 0xd3, 0xe7, 0xf9,
+ 0x91, 0x1b, 0x80, 0x29, 0xce, 0x25, 0x7e, 0xf0, 0x97, 0x0a, 0x59, 0x61,
+ 0x09, 0x2e, 0x29, 0x28, 0xcc, 0x8e, 0xc1, 0x61, 0x72, 0x29, 0x81, 0xe8,
+ 0x92, 0xd5, 0xc1, 0x50, 0xb6, 0x16, 0xc6, 0xff, 0xad, 0x2f, 0x26, 0x34,
+ 0x88, 0x5e, 0x19, 0x96, 0x00, 0x5b, 0x7b, 0x84, 0x18, 0x0f, 0xc2, 0xeb,
+ 0x2b, 0x1d, 0xc1, 0x59, 0xd2, 0x30, 0xcb, 0x14, 0xa8, 0xc4, 0xd1, 0x12,
+ 0xf2, 0x4e, 0x5b, 0xff, 0x1f, 0x23, 0xe8, 0x0c, 0xa7, 0xff, 0xd8, 0xba,
+ 0xe2, 0x2e, 0xfb, 0x19, 0x5b, 0xa3, 0x84, 0xb4, 0x9e, 0x17, 0xf1, 0x7b,
+ 0x0c, 0xb9, 0x90, 0xc8, 0x95, 0x7c, 0xee, 0x02, 0x77, 0x8a, 0x31, 0xc8,
+ 0xac, 0x80, 0xa5, 0xe1, 0x47, 0x48, 0x2c, 0x1d, 0xad, 0x4a, 0x52, 0x4b,
+ 0xfa, 0x1d, 0x02, 0xe9, 0x08, 0xf8, 0xb5, 0x9e, 0xae, 0x58, 0x08, 0xa3,
+ 0xcb, 0xda, 0x13, 0x22, 0x16, 0xbe, 0x3e, 0x08, 0xf6, 0x47, 0x83, 0xe6,
+ 0xba, 0x3d, 0xb3, 0x3a, 0x88, 0x84, 0x5c, 0x7e, 0x99, 0xd4, 0x1b, 0x17,
+ 0xed, 0x48, 0xe0, 0x52, 0xfa, 0x0c, 0x37, 0xf3, 0x2a, 0x45, 0xda, 0x72,
+ 0x75, 0xa3, 0x21, 0x1e, 0x28, 0x6c, 0xcf, 0xa3, 0xae, 0x39, 0xa3, 0x88,
+ 0xb1, 0xc0, 0xcc, 0x03, 0xd2, 0x8d, 0x38, 0xe3, 0x13, 0x84, 0x99, 0xa6,
+ 0x89, 0x17, 0x79, 0x72, 0x35, 0x50, 0x3c, 0xdd, 0x76, 0x5f, 0xaa, 0xee,
+ 0xaf, 0xfa, 0xb7, 0x3b, 0xd5, 0xe4, 0x99, 0x61, 0x99, 0x3c, 0x70, 0xfb,
+ 0x7e, 0xa2, 0x28, 0x63, 0x02, 0xf8, 0x8d, 0x8c, 0x60, 0xbc, 0xeb, 0xb5,
+ 0x9f, 0x8c, 0x71, 0x01, 0x55, 0x5e, 0xd6, 0x8a, 0x67, 0x94, 0x86, 0xcb,
+ 0xc0, 0x72, 0x18, 0x92, 0xc5, 0xde, 0x8c, 0x2f, 0x9c, 0x01, 0x9a, 0x9a,
+ 0x31, 0xc2, 0xf1, 0xa2, 0x10, 0x56, 0x45, 0xa8, 0x8c, 0x31, 0x25, 0xf4,
+ 0x0c, 0x1b, 0x69, 0x21, 0x54, 0x2e, 0x58, 0x57, 0xcb, 0xcb, 0x75, 0x94,
+ 0x45, 0x5c, 0xea, 0x65, 0x14, 0xe6, 0x19, 0x95, 0x78, 0x45, 0x64, 0x7a,
+ 0x91, 0xac, 0xd6, 0x28, 0x1b, 0xc6, 0xa4, 0x6b, 0xe4, 0x92, 0x2b, 0x6d,
+ 0x40, 0xcc, 0x8d, 0xeb, 0x50, 0xc6, 0x2f, 0x14, 0xcb, 0x4e, 0xf9, 0xd7,
+ 0xe6, 0x35, 0x3d, 0x24, 0x4d, 0x7e, 0x6d, 0x34, 0xe7, 0x47, 0x0f, 0x3f,
+ 0x36, 0x50, 0x2f, 0x56, 0x64, 0x59, 0x3d, 0xc5, 0xf0, 0xe7, 0xe4, 0x8a,
+ 0x76, 0x4c, 0xf4, 0x8f, 0x47, 0x5d, 0xe6, 0xfa, 0xe8, 0x2b, 0x40, 0x96,
+ 0x8d, 0x50, 0x89, 0x16, 0x57, 0x28, 0xee, 0x41, 0x68, 0xd9, 0xc9, 0x9c,
+ 0x42, 0xd7, 0xc7, 0x5b, 0xe4, 0x24, 0x98, 0xda, 0xca, 0x7a, 0x16, 0xf0,
+ 0x24, 0x8d, 0xfd, 0xf9, 0x6b, 0x55, 0x48, 0x49, 0x25, 0x0d, 0xb4, 0x1e,
+ 0xce, 0x9a, 0xbe, 0x3e, 0x7d, 0x7c, 0x5e, 0x3e, 0x8e, 0xf0, 0xbd, 0xc1,
+ 0xba, 0xb4, 0x0a, 0xeb, 0xa3, 0x15, 0x1c, 0x8d, 0xcb, 0x88, 0x11, 0xc2,
+ 0x53, 0x8d, 0xb9, 0xbf, 0xe9, 0xc6, 0x68, 0x1a, 0x15, 0x2f, 0xbf, 0x3c,
+ 0xa1, 0x1a, 0xf6, 0x7f, 0xbc, 0x2e, 0x5d, 0x15, 0x61, 0x6a, 0xcd, 0xdb,
+ 0x21, 0x1c, 0x9c, 0x77, 0x04, 0xde, 0x88, 0x15, 0x42, 0x1e, 0xd5, 0xf4,
+ 0x03, 0x7a, 0x78, 0x8a, 0x58, 0xf5, 0xb1, 0xd8, 0x6b, 0x68, 0x18, 0xf9,
+ 0x1a, 0x57, 0x0f, 0x2a, 0x82, 0xc1, 0xe4, 0xaf, 0x61, 0x10, 0xf0, 0x47,
+ 0xa6, 0x91, 0x62, 0x1d, 0x49, 0xf0, 0x01, 0xcf, 0xe1, 0x94, 0xd2, 0xce,
+ 0x0b, 0xb1, 0x45, 0x2d, 0x84, 0x14, 0x28, 0xf0, 0x5b, 0xd9, 0xc7, 0x14,
+ 0xb8, 0x9d, 0x72, 0x77, 0x82, 0x21, 0x4a, 0xc3, 0x8f, 0xdb, 0x44, 0x91,
+ 0xbe, 0x9e, 0xc0, 0xbb, 0x47, 0x98, 0x03, 0xa0, 0xdd, 0x79, 0x7d, 0xba,
+ 0x3d, 0x29, 0xdb, 0x37, 0xba, 0x20, 0x3d, 0xe2, 0x02, 0x2a, 0x93, 0xd6,
+ 0x1f, 0xf7, 0x87, 0xeb, 0x84, 0x85, 0xcf, 0xb7, 0x0d, 0x00, 0xbd, 0x50,
+ 0xd6, 0xae, 0xb7, 0x25, 0x7e, 0xd5, 0x66, 0x28, 0x39, 0x6b, 0x26, 0xfb,
+ 0x62, 0x1e, 0xd7, 0x73, 0xd1, 0x15, 0x96, 0x3c, 0x14, 0xd8, 0x13, 0xc7,
+ 0x98, 0x8f, 0xeb, 0xc1, 0x54, 0x7a, 0x55, 0xcd, 0xb1, 0x0a, 0x38, 0x80,
+ 0xbe, 0x80, 0x89, 0x4c, 0x4e, 0x97, 0xcf, 0x42, 0x7b, 0xc3, 0x27, 0x5f,
+ 0xdb, 0x22, 0xb1, 0x4f, 0xac, 0x4f, 0x9d, 0xc1, 0x46, 0x2d, 0xed, 0xa5,
+ 0x0e, 0xc0, 0xbf, 0x8d, 0xdd, 0x9a, 0x06, 0xba, 0x59, 0xa1, 0xcf, 0xc6,
+ 0x9e, 0xd0, 0xb6, 0x45, 0xba, 0x4f, 0x36, 0x69, 0xf0, 0x4b, 0xea, 0x62,
+ 0x5d, 0x4f, 0xd2, 0x21, 0xf9, 0xdd, 0xc4, 0x74, 0xf2, 0x42, 0x74, 0xf0,
+ 0x4c, 0x32, 0x9b, 0xae, 0x55, 0x5c, 0x52, 0xfa, 0xd1, 0xa1, 0x16, 0x91,
+ 0x8e, 0x4d, 0xe7, 0xdc, 0xcd, 0xe9, 0x4f, 0x25, 0x44, 0x65, 0x20, 0xfb,
+ 0x25, 0x6f, 0x42, 0x3b, 0xc7, 0x96, 0xae, 0x1d, 0x4d, 0x88, 0x37, 0x47,
+ 0xd7, 0x47, 0x22, 0x40, 0xd0, 0xfe, 0x4f, 0x19, 0x4a, 0xa1, 0x7b, 0xf7,
+ 0xb3, 0x97, 0x13, 0x72, 0x2f, 0x4a, 0x4f, 0x87, 0x66, 0x13, 0xc5, 0xb6,
+ 0x1d, 0xab, 0x37, 0x60, 0x7c, 0x68, 0xdf, 0x92, 0xd9, 0x16, 0xc1, 0x27,
+ 0xff, 0x19, 0xc7, 0x19, 0xc0, 0x14, 0xf0, 0xf0, 0xcf, 0xeb, 0xa2, 0xa1,
+ 0x79, 0xab, 0x7b, 0x84, 0xda, 0xce, 0x49, 0x91, 0xe5, 0xc7, 0x88, 0x47,
+ 0x95, 0x29, 0xf7, 0xaa, 0x55, 0xf6, 0x2b, 0x89, 0xcd, 0x91, 0xe0, 0x4b,
+ 0xa6, 0xe7, 0xae, 0xcc, 0xa7, 0x67, 0x1e, 0xaa, 0xf3, 0x55, 0xb7, 0xe9,
+ 0x10, 0x75, 0xe0, 0x83, 0x2b, 0x0f, 0xbc, 0xa6, 0x88, 0xf8, 0x32, 0x28,
+ 0xe7, 0x99, 0xbb, 0x12, 0xd3, 0x30, 0xf7, 0xea, 0x18, 0x9a, 0x49, 0x8f,
+ 0x32, 0x76, 0x98, 0x9a, 0x7e, 0x06, 0x14, 0x35, 0x73, 0x68, 0xc5, 0xf6,
+ 0x3a, 0x4a, 0x07, 0x8e, 0xe6, 0xe7, 0x13, 0x73, 0x19, 0x1a, 0x27, 0xa7,
+ 0xd1, 0xbc, 0xf3, 0x1d, 0xc1, 0xa2, 0x0b, 0x47, 0x41, 0x4e, 0x78, 0xbc,
+ 0x71, 0x76, 0x8a, 0xca, 0x60, 0x63, 0xd6, 0x1d, 0xe9, 0xbe, 0x39, 0x99,
+ 0xee, 0x19, 0xdb, 0x49, 0x09, 0x29, 0x02, 0xb8, 0xd4, 0x0b, 0x19, 0xda,
+ 0xb8, 0x87, 0x3e, 0x5f, 0x77, 0x45, 0xd8, 0x80, 0x10, 0x38, 0x93, 0xdb,
+ 0x09, 0x35, 0x88, 0xb1, 0x9b, 0xee, 0x42, 0xd8, 0xb2, 0x67, 0xd7, 0x86,
+ 0x13, 0xf3, 0xc6, 0x75, 0x77, 0x4c, 0xa5, 0x0c, 0x44, 0x9c, 0xfa, 0xe9,
+ 0x06, 0xae, 0x62, 0x6c, 0xc8, 0xf3, 0xd8, 0xbe, 0xde, 0x6b, 0xf2, 0x5d,
+ 0x0c, 0xd5, 0xe5, 0xa4, 0x25, 0x58, 0xd6, 0xa4, 0x1e, 0xb5, 0xb7, 0xa6,
+ 0x3f, 0xb0, 0x51, 0xef, 0x49, 0xcd, 0x3e, 0x70, 0xa7, 0xc8, 0x53, 0x99,
+ 0x1c, 0x7e, 0x21, 0xcd, 0xfa, 0x3f, 0x22, 0x2a, 0x35, 0xf7, 0x5b, 0xfc,
+ 0x33, 0xb6, 0x58, 0x86, 0xac, 0x64, 0x33, 0x43, 0xa1, 0x09, 0x39, 0x6b,
+ 0xb8, 0xa3, 0x32, 0x16, 0xb3, 0xbe, 0x30, 0x02, 0xa1, 0x66, 0xb1, 0x5a,
+ 0x7e, 0xc7, 0x12, 0xc3, 0x21, 0xf6, 0x27, 0x2e, 0xc4, 0x48, 0x17, 0xb8,
+ 0xfe, 0xa5, 0x48, 0x9f, 0x93, 0x5f, 0x6b, 0xaa, 0xd2, 0x1b, 0x68, 0xc1,
+ 0xaf, 0x8b, 0x69, 0xca, 0xe9, 0x60, 0xa6, 0xc6, 0x93, 0x3c, 0x42, 0xba,
+ 0xaa, 0x6e, 0x77, 0x9e, 0x4f, 0x35, 0xa4, 0xb1, 0x8c, 0x95, 0x15, 0x7a,
+ 0x80, 0xa9, 0x97, 0x3b, 0xb0, 0x66, 0x36, 0xf6, 0x3a, 0xe8, 0xcf, 0x99,
+ 0xe0, 0xaa, 0xaf, 0x2c, 0x3b, 0x60, 0x21, 0x24, 0xb7, 0x71, 0xa7, 0x96,
+ 0x0a, 0x27, 0xca, 0x88, 0x72, 0x4f, 0xda, 0x51, 0xda, 0x38, 0x97, 0x9f,
+ 0x9a, 0x27, 0x24, 0xac, 0x4b, 0x6a, 0x4c, 0x10, 0x6b, 0xe9, 0x30, 0x2d,
+ 0xcb, 0x64, 0xa6, 0xce, 0x89, 0x4e, 0xe7, 0x0a, 0xc8, 0x47, 0x5d, 0x2a,
+ 0x38, 0x54, 0xc4, 0x7e, 0x0c, 0xea, 0x2e, 0x73, 0xf5, 0x72, 0xe7, 0xf9,
+ 0x94, 0x2c, 0xf5, 0x99, 0x9a, 0x04, 0xc9, 0x92, 0x71, 0xc6, 0xd3, 0xd0,
+ 0xff, 0xd2, 0xcf, 0xbf, 0x8b, 0xdb, 0xc9, 0xe4, 0x10, 0xc1, 0xcc, 0x29,
+ 0x62, 0x4f, 0xb7, 0x4e, 0x6d, 0xf3, 0xb0, 0xaf, 0xb1, 0x9b, 0x34, 0xf9,
+ 0xd5, 0xf1, 0x4c, 0xf3, 0x0e, 0xc3, 0xca, 0xcb, 0xa5, 0x92, 0x41, 0xc5,
+ 0x0a, 0xcb, 0x95, 0x8b, 0xa9, 0xf6, 0x02, 0x86, 0x60, 0xbb, 0x72, 0xf6,
+ 0x94, 0xae, 0x40, 0xbc, 0xfb, 0x8d, 0xed, 0xfa, 0x61, 0xe2, 0x03, 0xe0,
+ 0x01, 0x1c, 0xa6, 0xb0, 0xaa, 0x78, 0x52, 0x67, 0x45, 0xd3, 0x7d, 0x07,
+ 0x5d, 0x9c, 0xdf, 0xc0, 0xca, 0x52, 0xa4, 0xf9, 0x8e, 0xb6, 0x3a, 0x1f,
+ 0x06, 0x54, 0xa3, 0x02, 0xab, 0x0f, 0xb7, 0xf7, 0x87, 0x06, 0xbc, 0x43,
+ 0x26, 0xec, 0x8e, 0x57, 0xf6, 0x67, 0xa7, 0x68, 0x98, 0xfc, 0x17, 0x98,
+ 0x75, 0xa9, 0xb1, 0x4f, 0xdd, 0x37, 0x21, 0xc6, 0xb2, 0x9d, 0xa2, 0x9b,
+ 0xb1, 0x9f, 0x3b, 0xd6, 0x3f, 0xab, 0xa4, 0x8c, 0x33, 0x2a, 0xb5, 0x3b,
+ 0x10, 0xc6, 0xa4, 0xf9, 0x10, 0xd8, 0x1b, 0xdf, 0x46, 0xfe, 0xea, 0xf8,
+ 0xfa, 0xf9, 0xd8, 0xe6, 0x45, 0x8d, 0x65, 0x89, 0xcf, 0x9e, 0x93, 0x0e,
+ 0xbb, 0xca, 0xc0, 0xc3, 0x33, 0xe9, 0xe8, 0x4c, 0x50, 0xe8, 0xcd, 0xc4,
+ 0x26, 0xe7, 0x3d, 0x96, 0x0f, 0xc7, 0x07, 0x30, 0xaa, 0x62, 0xd4, 0x17,
+ 0x17, 0x2f, 0x7c, 0x4c, 0x53, 0xc9, 0xa5, 0x52, 0x52, 0xa7, 0x19, 0xd7,
+ 0x34, 0x0e, 0xf1, 0x4c, 0x69, 0x17, 0xdf, 0x43, 0xdb, 0x5f, 0x20, 0xf8,
+ 0xe3, 0x48, 0xd5, 0x24, 0xbc, 0x08, 0x3d, 0xcb, 0x2b, 0x5e, 0xf7, 0x7c,
+ 0x5d, 0xa4, 0x2f, 0xdf, 0x8a, 0x4a, 0x27, 0x18, 0x51, 0x31, 0x2d, 0x0a,
+ 0xf8, 0xdc, 0x30, 0xe6, 0xfa, 0x7a, 0x00, 0x61, 0xcd, 0xdb, 0x93, 0x43,
+ 0xc3, 0xbd, 0xc6, 0x0b, 0x82, 0x57, 0xf7, 0x9f, 0x0c, 0xb0, 0x43, 0xf2,
+ 0xe9, 0x61, 0xc6, 0x3a, 0x2a, 0x57, 0x4c, 0x74, 0x56, 0x07, 0x57, 0x7c,
+ 0xf1, 0xc8, 0x60, 0x55, 0xf7, 0x17, 0x17, 0xc7, 0xc0, 0x76, 0x11, 0xee,
+ 0xb4, 0xa1, 0x1c, 0x47, 0xf8, 0xd5, 0xb8, 0x1f, 0xe4, 0x47, 0x93, 0x17,
+ 0x4e, 0x55, 0xf1, 0x9f, 0x58, 0xb3, 0x46, 0xf1, 0x20, 0xd0, 0xe0, 0x30,
+ 0x7e, 0x5d, 0x18, 0x61, 0x8d, 0xe2, 0xf9, 0x78, 0xb3, 0x30, 0x41, 0xe5,
+ 0xe0, 0x1f, 0xff, 0x76, 0x51, 0xc6, 0x2b, 0x9a, 0x20, 0xe7, 0x6b, 0x79,
+ 0xe2, 0xad, 0x0d, 0x2d, 0x9b, 0x48, 0x2f, 0xbf, 0x44, 0x4a, 0xcb, 0xb0,
+ 0xd3, 0x63, 0x48, 0xab, 0xfe, 0x32, 0xef, 0xf9, 0x55, 0x09, 0x84, 0xe3,
+ 0xfc, 0x09, 0x30, 0x23, 0xcf, 0x30, 0x34, 0x43, 0x1e, 0x59, 0x65, 0x44,
+ 0x8a, 0x89, 0x2c, 0x1e, 0x3a, 0x3a, 0x17, 0x49, 0x0c, 0x0b, 0x7d, 0xb3,
+ 0xfd, 0x26, 0x73, 0x5b, 0xd1, 0x98, 0x08, 0x1a, 0x2a, 0xfc, 0xe9, 0x9e,
+ 0x61, 0xfb, 0x06, 0x97, 0x84, 0x2c, 0xb7, 0xf5, 0xca, 0xd9, 0xdf, 0x6c,
+ 0x22, 0x23, 0x03, 0xb6, 0x0c, 0x0c, 0xdb, 0x75, 0x00, 0x47, 0xfc, 0x5c,
+ 0xd1, 0x6a, 0xcb, 0x68, 0xe9, 0x35, 0x4b, 0x26, 0x0a, 0xda, 0x09, 0x86,
+ 0xdf, 0xda, 0x5a, 0x97, 0xdc, 0x59, 0x0e, 0x74, 0x6c, 0x0c, 0xc8, 0xc7,
+ 0x58, 0x55, 0xf8, 0x63, 0x7c, 0x75, 0x19, 0x13, 0x7a, 0xa1, 0xb9, 0xe4,
+ 0x62, 0xf0, 0x59, 0x0c, 0x37, 0xa5, 0x5e, 0xce, 0x62, 0x52, 0x26, 0x2b,
+ 0x35, 0xae, 0x98, 0x0e, 0x3e, 0xc8, 0x90, 0x34, 0x24, 0xbb, 0xe9, 0xdf,
+ 0x53, 0x3b, 0x03, 0x47, 0x47, 0x03, 0x0a, 0xbc, 0xd1, 0x15, 0xc6, 0x27,
+ 0x82, 0x36, 0x4b, 0xd7, 0x77, 0x52, 0x7e, 0x85, 0x21, 0x83, 0x0a, 0xb2,
+ 0xdd, 0x93, 0xc6, 0x2a, 0x79, 0x17, 0x75, 0xe5, 0xbc, 0xdb, 0x29, 0xb5,
+ 0xd1, 0xc7, 0x0d, 0xdd, 0x45, 0xf2, 0x3f, 0xda, 0x7f, 0xba, 0x14, 0xe8,
+ 0x6f, 0xf7, 0x2d, 0x49, 0x07, 0x19, 0x02, 0x9d, 0x99, 0x96, 0xb4, 0x1e,
+ 0xc0, 0xf2, 0x29, 0x43, 0xfe, 0xc2, 0xb9, 0xd2, 0xec, 0x59, 0x13, 0x20,
+ 0xd7, 0xcd, 0x6e, 0x5b, 0xae, 0x67, 0x7b, 0xd0, 0xd9, 0x4c, 0xf4, 0x42,
+ 0xfa, 0xe5, 0xe1, 0x91, 0xe9, 0xac, 0xd8, 0xde, 0x25, 0x34, 0x13, 0x56,
+ 0x82, 0x74, 0xd7, 0xf2, 0x45, 0x8a, 0x7e, 0xfa, 0x6c, 0x56, 0x8c, 0x2c,
+ 0x94, 0x45, 0x29, 0x01, 0xc0, 0xbb, 0x82, 0x86, 0x63, 0xb4, 0x52, 0x3a,
+ 0xab, 0x92, 0x76, 0x81, 0xf7, 0xdb, 0xff, 0x64, 0x6b, 0x18, 0x27, 0xde,
+ 0xfa, 0x41, 0x04, 0x8f, 0xaa, 0xae, 0x3e, 0x74, 0x01, 0x95, 0x4f, 0xf9,
+ 0x5d, 0xba, 0x12, 0x0e, 0xd4, 0xee, 0x59, 0x85, 0xf4, 0x70, 0x19, 0x56,
+ 0xd9, 0x23, 0x35, 0x46, 0x83, 0xde, 0x6f, 0x3c, 0xd6, 0x3c, 0x8c, 0xfe,
+ 0x0b, 0x22, 0xab, 0x79, 0x17, 0xb2, 0x9c, 0x42, 0x75, 0xdb, 0x33, 0x23,
+ 0x04, 0x8a, 0x47, 0x4e, 0xaf, 0x46, 0x3e, 0x77, 0x1d, 0x1b, 0x52, 0xed,
+ 0xad, 0x50, 0x95, 0xd6, 0xd2, 0x87, 0x9d, 0x4b, 0x47, 0xfb, 0x05, 0xc2,
+ 0x79, 0xbb, 0x8e, 0x62, 0x7d, 0xa5, 0xa1, 0x0e, 0x8a, 0x21, 0xb9, 0x47,
+ 0x6e, 0xe7, 0x5c, 0x4a, 0x43, 0xc3, 0xa4, 0x68, 0xab, 0x04, 0x18, 0x87,
+ 0x53, 0xf8, 0x06, 0x2e, 0xb5, 0x15, 0x45, 0xcc, 0x76, 0x9d, 0x18, 0xb8,
+ 0x61, 0x59, 0x7d, 0x4e, 0x42, 0x3a, 0x07, 0x4c, 0xc7, 0x82, 0xfd, 0x2d,
+ 0x5f, 0x48, 0xc1, 0x68, 0xe6, 0x76, 0xaf, 0x36, 0x1b, 0x14, 0x18, 0xb7,
+ 0x50, 0x1c, 0x69, 0x69, 0x79, 0x1b, 0x30, 0xbc, 0x39, 0x9f, 0x90, 0x3f,
+ 0x50, 0x35, 0x1e, 0xd9, 0xab, 0x4b, 0x0b, 0xc0, 0xef, 0x8e, 0xd4, 0xce,
+ 0xef, 0xeb, 0x44, 0x3e, 0xc1, 0xb6, 0xc2, 0x03, 0x88, 0x25, 0x0c, 0xe7,
+ 0x76, 0x5b, 0xdb, 0xe4, 0x13, 0x06, 0xc8, 0x2c, 0xbc, 0xac, 0x31, 0x1f,
+ 0xe1, 0x35, 0x92, 0x38, 0xe4, 0x39, 0x28, 0x81, 0xa8, 0x02, 0x54, 0x3f,
+ 0x71, 0x82, 0x7a, 0x9c, 0xbd, 0xc3, 0x24, 0x2d, 0xd7, 0x18, 0x64, 0x9c,
+ 0xb7, 0x87, 0x22, 0xf3, 0x1a, 0xa4, 0x02, 0x29, 0x98, 0x5a, 0xbc, 0x76,
+ 0x41, 0xd7, 0x98, 0xbb, 0xc5, 0x7d, 0x93, 0x94, 0xa4, 0xe9, 0x81, 0x25,
+ 0xd4, 0x50, 0xe6, 0x70, 0x74, 0x18, 0xb1, 0xad, 0x89, 0xb6, 0xf6, 0xe1,
+ 0x4e, 0x66, 0x02, 0xeb, 0x1d, 0x24, 0xfa, 0x81, 0xc0, 0xcc, 0xb1, 0x74,
+ 0x2d, 0x97, 0x07, 0x8f, 0x79, 0x64, 0x18, 0x5a, 0x99, 0x4f, 0xde, 0x2b,
+ 0xcc, 0xc7, 0x2e, 0x28, 0xca, 0xf8, 0xdf, 0x11, 0xf6, 0xbf, 0xe1, 0xbf,
+ 0x6e, 0xc1, 0x20, 0x05, 0x96, 0x46, 0xb1, 0x56, 0xca, 0x2d, 0x49, 0x17,
+ 0xca, 0x28, 0x5b, 0x5f, 0xbe, 0x8d, 0xe0, 0xd8, 0x79, 0x97, 0x3f, 0xc0,
+ 0xc0, 0x33, 0x0a, 0xd0, 0x66, 0xf5, 0x34, 0xde, 0x75, 0x0a, 0x9d, 0xa5,
+ 0x71, 0xc6, 0x52, 0x1d, 0x68, 0x15, 0x35, 0x4e, 0xa9, 0xa3, 0xba, 0x9d,
+ 0x92, 0x5b, 0x16, 0xe3, 0x96, 0x65, 0x26, 0x22, 0x7e, 0x98, 0x23, 0x97,
+ 0xe0, 0x17, 0xc8, 0xb7, 0xbd, 0x09, 0x11, 0xb8, 0xd0, 0x45, 0xe2, 0x32,
+ 0x92, 0xf5, 0xd1, 0xdb, 0xc0, 0x7b, 0x12, 0x84, 0xde, 0x13, 0x0c, 0x44,
+ 0xb4, 0x80, 0x04, 0x2b, 0x8f, 0x20, 0x1f, 0x06, 0x38, 0x2f, 0x44, 0x92,
+ 0xe5, 0xfd, 0x70, 0x14, 0xdd, 0xbe, 0xe5, 0xff, 0x0a, 0x28, 0x9d, 0x42,
+ 0x75, 0x13, 0x03, 0xea, 0xa0, 0x9b, 0xdc, 0x97, 0xda, 0x13, 0xf2, 0x66,
+ 0x9d, 0x2f, 0x75, 0x28, 0xea, 0x12, 0xd3, 0x0b, 0x3a, 0x6b, 0x67, 0xb2,
+ 0x21, 0xd5, 0xb1, 0x47, 0xa9, 0xf6, 0x6a, 0x29, 0x01, 0xf7, 0x0b, 0x18,
+ 0x76, 0x19, 0xc0, 0xa0, 0xee, 0x43, 0xa8, 0x8a, 0x77, 0x02, 0x70, 0x57,
+ 0xea, 0xf0, 0x5d, 0xa5, 0xb5, 0x77, 0x51, 0x8c, 0x7d, 0xd6, 0xe7, 0xc1,
+ 0xf0, 0x4a, 0xcf, 0xc8, 0x87, 0x04, 0x57, 0xd4, 0x21, 0xc6, 0xe1, 0xc5,
+ 0x01, 0x98, 0xa9, 0xa1, 0xb2, 0x4b, 0x72, 0xa8, 0xaf, 0xe5, 0xb6, 0x16,
+ 0x63, 0xf0, 0xac, 0x05, 0x45, 0x51, 0x93, 0xfd, 0xa7, 0xc8, 0xbe, 0x6a,
+ 0x0e, 0x15, 0xa0, 0x94, 0x57, 0x72, 0x7f, 0x79, 0x14, 0x13, 0x09, 0x6c,
+ 0x97, 0x06, 0x72, 0x2a, 0xc2, 0x15, 0xf9, 0x9c, 0x09, 0x5e, 0xf6, 0x58,
+ 0xaf, 0x5d, 0x36, 0x1f, 0x3f, 0x38, 0xfe, 0xd5, 0x70, 0xa3, 0x91, 0x2e,
+ 0x0f, 0x2e, 0xba, 0xe1, 0xf6, 0x14, 0x85, 0x27, 0xc3, 0x73, 0x3b, 0x66,
+ 0xdd, 0xdf, 0xd0, 0xe3, 0x16, 0xc4, 0x91, 0x52, 0xc1, 0xb3, 0x49, 0x0d,
+ 0x96, 0xe1, 0x8d, 0xcd, 0xdd, 0xa6, 0x49, 0x64, 0xa1, 0xb4, 0xe6, 0xb5,
+ 0xc6, 0x47, 0x62, 0x2a, 0x0d, 0xec, 0xce, 0x65, 0xf9, 0x0d, 0x5d, 0x7b,
+ 0x46, 0x39, 0x26, 0x75, 0x3e, 0xee, 0x4f, 0xf0, 0x32, 0x49, 0x24, 0x07,
+ 0xac, 0xcf, 0x20, 0xbf, 0x28, 0x58, 0xee, 0x2a, 0x4b, 0x21, 0xfd, 0x28,
+ 0x21, 0x14, 0x71, 0x7e, 0x34, 0xfb, 0xc7, 0x2c, 0xa6, 0xec, 0xba, 0x5a,
+ 0xad, 0x1a, 0x60, 0x4d, 0x38, 0x81, 0x07, 0x12, 0x74, 0x1c, 0x59, 0x89,
+ 0x0b, 0x34, 0x77, 0xa2, 0xc0, 0x6a, 0x59, 0xbe, 0x99, 0x25, 0xca, 0x59,
+ 0x34, 0x70, 0x9f, 0xc6, 0x99, 0xd3, 0x44, 0x21, 0x98, 0x23, 0xe8, 0x1a,
+ 0xce, 0x0b, 0x6e, 0xee, 0x22, 0xfd, 0x56, 0xf4, 0x27, 0x6d, 0x0a, 0x01,
+ 0xb5, 0x52, 0xb2, 0xf7, 0xb4, 0x8d, 0x4d, 0x03, 0x6d, 0x5a, 0xd2, 0x2e,
+ 0xc9, 0xa9, 0xc6, 0x06, 0x42, 0xc5, 0x1b, 0xde, 0x50, 0x90, 0x7a, 0x77,
+ 0x53, 0xa2, 0x27, 0x67, 0x54, 0xd2, 0xd4, 0x33, 0x0c, 0x1a, 0xb7, 0x65,
+ 0xd0, 0x76, 0xb7, 0x54, 0xb0, 0x45, 0x1a, 0xb5, 0xb4, 0xad, 0xc2, 0x05,
+ 0xb5, 0x41, 0x5a, 0xd3, 0x64, 0xb6, 0x60, 0xf4, 0x36, 0x69, 0x71, 0xbd,
+ 0x71, 0x79, 0x6b, 0x1a, 0xae, 0xe8, 0xa5, 0x48, 0x51, 0x0f, 0x2d, 0x9d,
+ 0x74, 0xdd, 0xbb, 0xa0, 0x3f, 0x69, 0xff, 0x82, 0x13, 0x32, 0xfd, 0x60,
+ 0x89, 0x39, 0xc4, 0x3b, 0x81, 0x0c, 0x46, 0xdd, 0x56, 0x7b, 0x4c, 0xd4,
+ 0x3a, 0x83, 0x92, 0x81, 0x1b, 0xe7, 0xcc, 0xc1, 0xfc, 0xbe, 0x62, 0xac,
+ 0x7b, 0x5d, 0x61, 0x22, 0x86, 0x00, 0x8e, 0x25, 0x9f, 0xf4, 0x13, 0x00,
+ 0x57, 0x30, 0xed, 0xbc, 0x9d, 0xde, 0x8e, 0x87, 0xff, 0x51, 0x43, 0x50,
+ 0xcf, 0x5e, 0x48, 0x14, 0x2e, 0x19, 0xe9, 0xdd, 0xb9, 0xd2, 0xde, 0xcd,
+ 0xcb, 0xf1, 0x63, 0x6c, 0xb7, 0xc9, 0xd7, 0x2d, 0x3c, 0xe0, 0x53, 0x37,
+ 0x98, 0x61, 0x7d, 0x70, 0x4a, 0xb4, 0x34, 0x44, 0x39, 0xc3, 0x71, 0xd5,
+ 0xaf, 0xff, 0x8f, 0x73, 0xbf, 0xfa, 0x63, 0x4d, 0xbe, 0x2a, 0x8a, 0x4b,
+ 0x56, 0x3d, 0x4c, 0x4b, 0xe4, 0x7c, 0x2c, 0x66, 0xfc, 0x01, 0xab, 0x41,
+ 0xe6, 0x41, 0x1e, 0x5b, 0xf4, 0x5b, 0x33, 0x08, 0xea, 0xc4, 0x99, 0xcb,
+ 0x23, 0xe1, 0x36, 0xe1, 0x60, 0x6e, 0xad, 0xfa, 0xe1, 0xfc, 0x8d, 0x60,
+ 0x58, 0xc4, 0x23, 0x9c, 0x63, 0xe2, 0xcf, 0x21, 0xcf, 0x07, 0x44, 0x19,
+ 0x1f, 0x9b, 0x40, 0x3b, 0xc1, 0xe6, 0x46, 0x86, 0xd9, 0x53, 0xc2, 0x27,
+ 0x40, 0xa6, 0xb4, 0xed, 0xce, 0x98, 0x66, 0xe1, 0xc0, 0x01, 0x36, 0x63,
+ 0x07, 0x5b, 0x61, 0x79, 0xa5, 0x8c, 0x5f, 0xd7, 0x9f, 0x9b, 0xcd, 0x40,
+ 0xdc, 0x29, 0x69, 0x13, 0xb3, 0xa3, 0x80, 0x3f, 0xdb, 0x62, 0xbf, 0x90,
+ 0x7e, 0xf6, 0x94, 0x89, 0xea, 0x08, 0xd4, 0x70, 0xe6, 0x27, 0x1c, 0x5c,
+ 0xb4, 0x82, 0x8c, 0xff, 0x26, 0xcb, 0xad, 0x98, 0xe4, 0xef, 0x99, 0x5a,
+ 0xfb, 0x05, 0xc6, 0xe7, 0x91, 0xe2, 0xa4, 0x7c, 0x5b, 0x0b, 0xd9, 0x60,
+ 0x17, 0xab, 0x0e, 0x99, 0x5d, 0x7f, 0x02, 0x42, 0x2b, 0x32, 0x41, 0xfc,
+ 0xd1, 0x27, 0x63, 0xf4, 0x69, 0x54, 0x4b, 0x4f, 0xcc, 0x09, 0x20, 0xd3,
+ 0x4a, 0x8f, 0xa1, 0xa4, 0x66, 0x3f, 0x57, 0x44, 0x94, 0xff, 0xb3, 0x97,
+ 0x58, 0xd2, 0xc1, 0xa2, 0x67, 0x1f, 0x87, 0x1c, 0x6a, 0xe9, 0x10, 0x15,
+ 0xe2, 0xa4, 0xac, 0xf6, 0xc7, 0x87, 0xdc, 0x81, 0x02, 0x89, 0xa0, 0x57,
+ 0x21, 0x9c, 0xfc, 0xa0, 0x22, 0x94, 0x9f, 0x56, 0x81, 0xaa, 0xea, 0x8e,
+ 0x71, 0x25, 0xc6, 0x57, 0xb0, 0xc3, 0x9a, 0x08, 0xfc, 0x1d, 0xa9, 0xc0,
+ 0x68, 0xb1, 0x29, 0x05, 0x97, 0xe8, 0x6d, 0xc4, 0x5e, 0x1e, 0x64, 0x16,
+ 0xc1, 0x71, 0x4b, 0x23, 0xb9, 0x5b, 0x85, 0xd1, 0xc3, 0x18, 0xa2, 0x7e,
+ 0xcb, 0x0c, 0x6c, 0x2a, 0x43, 0x51, 0x58, 0x63, 0xbb, 0xaf, 0xdc, 0x9d,
+ 0xfc, 0x6e, 0x76, 0xa0, 0x46, 0x0c, 0x31, 0xca, 0x3e, 0xdb, 0x91, 0x0e,
+ 0x6d, 0xd0, 0x30, 0x64, 0x40, 0x6c, 0x82, 0x8f, 0xc9, 0x92, 0x41, 0xf5,
+ 0x74, 0x37, 0x43, 0xd7, 0x41, 0x55, 0xdd, 0xc2, 0xb2, 0xb9, 0x09, 0x6e,
+ 0xb3, 0xc0, 0x03, 0x11, 0x95, 0x2f, 0xbc, 0x0e, 0xef, 0x61, 0x6b, 0xb3,
+ 0xf9, 0xd4, 0xa6, 0xea, 0xf4, 0x1b, 0xf5, 0x04, 0x69, 0x84, 0xd4, 0x5b,
+ 0x06, 0xc5, 0x83, 0x71, 0xfd, 0x52, 0x56, 0x24, 0x0d, 0x4b, 0x0c, 0xd2,
+ 0x29, 0xdf, 0xda, 0xb6, 0x2d, 0xc1, 0x5e, 0x1c, 0x42, 0x37, 0xb5, 0x68,
+ 0x89, 0x4e, 0x67, 0x44, 0x85, 0x38, 0xab, 0xf3, 0x4d, 0x02, 0x17, 0xe8,
+ 0xb2, 0x0e, 0xf7, 0x1e, 0x8a, 0x5f, 0x42, 0x16, 0x97, 0xea, 0xa6, 0x2d,
+ 0x88, 0x84, 0xf3, 0x1e, 0x00, 0xb7, 0xf5, 0x0c, 0xbb, 0xcd, 0x09, 0xc5,
+ 0xcf, 0xdb, 0x1a, 0x5e, 0x55, 0xdb, 0x46, 0x42, 0xa3, 0x63, 0xac, 0x3f,
+ 0x06, 0x53, 0xba, 0xcf, 0xbb, 0x31, 0x54, 0x77, 0x99, 0xe1, 0x48, 0xd3,
+ 0xb4, 0x29, 0x1e, 0xad, 0x0d, 0x6f, 0xac, 0xd4, 0x4c, 0x1f, 0xb0, 0x92,
+ 0xe5, 0x35, 0x48, 0x69, 0x0a, 0xbe, 0x62, 0xe9, 0xb4, 0xb8, 0x68, 0x20,
+ 0x3c, 0x6d, 0x69, 0xbf, 0x30, 0x21, 0xc6, 0xe4, 0x9d, 0x08, 0x8b, 0xd0,
+ 0xf1, 0xb8, 0x84, 0x4e, 0xd5, 0x4c, 0xf1, 0xbb, 0x3a, 0x58, 0x11, 0x06,
+ 0xcd, 0x56, 0x4b, 0x5f, 0xda, 0xb9, 0x34, 0x91, 0xc2, 0x3b, 0xfc, 0xd1,
+ 0x1e, 0x96, 0x24, 0xd2, 0xb6, 0x76, 0xe2, 0xe4, 0xae, 0x9e, 0x30, 0x40,
+ 0x3e, 0xea, 0xd8, 0x73, 0x90, 0x31, 0xe1, 0xdd, 0xed, 0xcf, 0x85, 0xcf,
+ 0x2b, 0x3e, 0x64, 0x7f, 0x4d, 0x8a, 0x1d, 0x0e, 0x2c, 0xd5, 0xe2, 0x43,
+ 0xae, 0x76, 0x3f, 0x21, 0x53, 0x3c, 0xd1, 0x1b, 0xdb, 0x2a, 0x9f, 0x27,
+ 0xd1, 0x28, 0x1b, 0x46, 0x96, 0x07, 0xe5, 0xdc, 0xd7, 0xca, 0xf1, 0x93,
+ 0x1a, 0x24, 0xcf, 0x4d, 0xef, 0xaf, 0x40, 0x4e, 0x2d, 0x93, 0xb6, 0x07,
+ 0xe4, 0xef, 0xf5, 0xc1, 0xca, 0x98, 0x7c, 0xa8, 0x10, 0x20, 0x06, 0x88,
+ 0x06, 0xb2, 0x52, 0xd9, 0x86, 0xae, 0x9d, 0x1a, 0x62, 0x06, 0x53, 0xed,
+ 0x31, 0x53, 0xc9, 0xce, 0x67, 0x02, 0x48, 0x4d, 0x23, 0x37, 0x22, 0x7d,
+ 0x14, 0xe0, 0x9a, 0xfd, 0xe4, 0x02, 0xfe, 0x6b, 0x9f, 0xa9, 0x46, 0x59,
+ 0x54, 0x6c, 0x77, 0x9d, 0xee, 0x72, 0xd2, 0x18, 0x7f, 0x1c, 0x1d, 0xcc,
+ 0x30, 0x87, 0xcd, 0x49, 0xc4, 0x42, 0x0d, 0x83, 0x10, 0x1c, 0x10, 0xa3,
+ 0x9e, 0x4e, 0xfd, 0xfd, 0xd4, 0x9f, 0x5e, 0xca, 0xad, 0x34, 0x6c, 0x32,
+ 0x63, 0x6b, 0xf0, 0xe5, 0x0c, 0x46, 0x39, 0x65, 0x83, 0x66, 0x07, 0x3a,
+ 0xfe, 0x92, 0xae, 0x72, 0x47, 0x5e, 0x30, 0xee, 0x07, 0xc6, 0xd5, 0x20,
+ 0x4a, 0xb6, 0xa7, 0xb8, 0x79, 0xff, 0xbf, 0x8e, 0xf9, 0x57, 0xa8, 0x25,
+ 0x9b, 0x05, 0xe3, 0x48, 0xd3, 0x39, 0xd2, 0x6c, 0x70, 0xdc, 0x8a, 0xa3,
+ 0x49, 0x94, 0x43, 0xec, 0xea, 0xac, 0x67, 0xf5, 0xb0, 0x31, 0x06, 0x2a,
+ 0xcb, 0xb4, 0xb2, 0x5a, 0x59, 0x7d, 0xd3, 0x7c, 0x6a, 0xd2, 0x6b, 0xf3,
+ 0xb6, 0x79, 0x58, 0xc5, 0x0e, 0x0f, 0x34, 0x71, 0x43, 0x3c, 0xec, 0x16,
+ 0xd1, 0xc3, 0x0c, 0xf7, 0xb4, 0x59, 0xf7, 0x14, 0x25, 0x7c, 0x13, 0x5c,
+ 0x10, 0xb8, 0x63, 0x50, 0x6e, 0xf4, 0x9a, 0x6e, 0x2f, 0x16, 0x6a, 0x06,
+ 0x32, 0x4c, 0x07, 0x9a, 0x90, 0xf9, 0x63, 0x82, 0xea, 0xec, 0x92, 0xfd,
+ 0x92, 0x59, 0xee, 0xc1, 0xeb, 0x0a, 0xe8, 0x20, 0xc7, 0x0a, 0x71, 0x12,
+ 0xde, 0xfd, 0x89, 0xe2, 0xbe, 0xd0, 0x53, 0x03, 0x59, 0xaa, 0x08, 0xa9,
+ 0x26, 0x6b, 0x76, 0x99, 0xb1, 0x11, 0xb9, 0xf5, 0xd1, 0xbc, 0xd0, 0x01,
+ 0x28, 0x67, 0xf6, 0x55, 0x22, 0xdd, 0x9c, 0x2d, 0x3e, 0x51, 0xd3, 0xe8,
+ 0x57, 0xbd, 0x0d, 0x76, 0x4b, 0x96, 0x31, 0x99, 0xf0, 0xd6, 0x62, 0x8e,
+ 0xc3, 0xdc, 0xdb, 0xba, 0x2b, 0x4c, 0xa4, 0xe1, 0xc3, 0x9d, 0xbc, 0xe9,
+ 0xe5, 0x2b, 0x59, 0x64, 0xc9, 0xb9, 0x61, 0x26, 0x0c, 0x5d, 0xa0, 0x6a,
+ 0xd1, 0x3a, 0x17, 0x3d, 0x7f, 0x50, 0x63, 0xd2, 0x61, 0x1b, 0xb9, 0x2e,
+ 0x3d, 0x4e, 0x12, 0x6c, 0x6b, 0x5e, 0x94, 0x9d, 0x8e, 0x83, 0x2e, 0xe9,
+ 0xe6, 0x12, 0x2f, 0x49, 0xab, 0x15, 0xa2, 0x46, 0x62, 0x70, 0x72, 0xf5,
+ 0xdb, 0xc6, 0x2d, 0x71, 0xcc, 0x48, 0xae, 0x04, 0xe3, 0x5e, 0xd6, 0xa7,
+ 0x31, 0xd0, 0x03, 0xc8, 0x61, 0x8d, 0x10, 0x0d, 0xaf, 0x65, 0xea, 0x88,
+ 0xf3, 0x51, 0x7f, 0x4c, 0x99, 0xa2, 0x38, 0xeb, 0x8f, 0x06, 0x88, 0x20,
+ 0xfe, 0xf1, 0x4c, 0xd2, 0xe3, 0xb3, 0x44, 0x2d, 0x6f, 0x93, 0x29, 0x13,
+ 0xec, 0x16, 0x8b, 0x86, 0x74, 0xb7, 0x27, 0xe2, 0xf0, 0x30, 0x4d, 0x52,
+ 0x26, 0x5f, 0x1b, 0x9f, 0x52, 0x52, 0x6b, 0xdb, 0xb5, 0x74, 0xe6, 0x5f,
+ 0xa7, 0x4f, 0x76, 0xcb, 0xc5, 0x1e, 0xa8, 0x2a, 0x94, 0xfd, 0x06, 0x74,
+ 0xfb, 0xd6, 0x2a, 0x20, 0xfd, 0xa0, 0x45, 0xc6, 0x65, 0xd5, 0xa6, 0x83,
+ 0xa3, 0x20, 0x7e, 0x4d, 0x7e, 0xac, 0x90, 0x6b, 0x74, 0x5a, 0xd8, 0x41,
+ 0x86, 0x74, 0x53, 0x8d, 0x53, 0x5a, 0x88, 0x53, 0x2d, 0xa6, 0x47, 0xff,
+ 0x07, 0x83, 0x83, 0xfb, 0x36, 0x24, 0x3d, 0x88, 0xe3, 0x28, 0xa3, 0x97,
+ 0x43, 0x9b, 0x1b, 0x26, 0x16, 0xb4, 0xe9, 0xec, 0xa6, 0x6f, 0xc9, 0xef,
+ 0x22, 0x36, 0x98, 0x83, 0x71, 0xed, 0x5e, 0xf5, 0xef, 0xe2, 0xf9, 0x85,
+ 0xf3, 0x08, 0xe2, 0xda, 0x44, 0x76, 0x03, 0x2b, 0x87, 0x9b, 0xd2, 0x74,
+ 0x61, 0xb6, 0x65, 0x01, 0x6b, 0x20, 0x79, 0xde, 0xd4, 0x1c, 0x3c, 0x7e,
+ 0x75, 0xb4, 0x89, 0x1a, 0xf2, 0xa3, 0x0d, 0x6d, 0x4e, 0x6b, 0x04, 0xf6,
+ 0x98, 0xa2, 0x57, 0x8e, 0x22, 0xf5, 0xad, 0xd8, 0x60, 0xb1, 0x83, 0xdd,
+ 0x30, 0xb1, 0x82, 0xa2, 0x48, 0xa3, 0x2f, 0x19, 0x3d, 0x36, 0x45, 0xfe,
+ 0xb2, 0x6e, 0xde, 0xbc, 0x7f, 0x71, 0x55, 0x0a, 0x4d, 0x75, 0xad, 0x5e,
+ 0x4e, 0xcc, 0x8e, 0x62, 0x43, 0x3e, 0xbb, 0x08, 0xb4, 0x5a, 0xc8, 0xc2,
+ 0xd8, 0x4d, 0x2b, 0x51, 0x62, 0x0f, 0xac, 0x03, 0xcd, 0x6e, 0x54, 0x28,
+ 0xb0, 0x02, 0x51, 0x31, 0x99, 0xef, 0xc5, 0x09, 0x1c, 0x6f, 0xc2, 0x24,
+ 0xc6, 0x13, 0x5d, 0xd6, 0x01, 0xc2, 0x70, 0xc2, 0x5a, 0xfe, 0x95, 0x96,
+ 0x20, 0x98, 0xe8, 0x6a, 0xb8, 0x98, 0x32, 0x57, 0xe3, 0xb6, 0xdc, 0x4a,
+ 0x75, 0x61, 0xbd, 0x98, 0xdb, 0x0b, 0xf8, 0xbb, 0x52, 0xa5, 0x4a, 0x93,
+ 0x21, 0xc2, 0x43, 0xc2, 0x6f, 0x8f, 0x36, 0xf7, 0x64, 0x92, 0x25, 0x9f,
+ 0xae, 0x47, 0xc4, 0x48, 0xa8, 0xae, 0xa0, 0x83, 0x60, 0x9e, 0x80, 0xc5,
+ 0x39, 0x84, 0x33, 0x70, 0xb9, 0x51, 0x76, 0x1f, 0xb4, 0xb7, 0x44, 0xcc,
+ 0x19, 0xf3, 0xa0, 0xa7, 0xa6, 0xe6, 0x60, 0x1d, 0x18, 0xd7, 0x41, 0x55,
+ 0xa7, 0x68, 0xbc, 0x5e, 0x96, 0x7a, 0x8a, 0x96, 0x09, 0xed, 0x74, 0x71,
+ 0xed, 0x8c, 0x64, 0x67, 0x82, 0x6a, 0x50, 0x59, 0x95, 0x3e, 0xb5, 0x98,
+ 0x7e, 0xa1, 0xa8, 0x0b, 0x26, 0x33, 0xdb, 0x1e, 0x88, 0x9b, 0x7c, 0x26,
+ 0xd0, 0x08, 0x18, 0xd4, 0xcd, 0x88, 0xd4, 0x89, 0x20, 0xb2, 0x0c, 0xa5,
+ 0x33, 0xd2, 0x2d, 0x9e, 0xf0, 0xe4, 0x41, 0x81, 0xbb, 0x76, 0x10, 0xc1,
+ 0xda, 0xf2, 0x04, 0xb3, 0xf9, 0x51, 0x03, 0x45, 0x25, 0xe8, 0x36, 0x46,
+ 0x5c, 0x72, 0xc6, 0xf2, 0x77, 0x22, 0x8e, 0x81, 0x77, 0xcd, 0xe2, 0x12,
+ 0x6f, 0x23, 0x2a, 0xbc, 0x5f, 0xd8, 0x66, 0xa7, 0x14, 0xe0, 0xf9, 0x06,
+ 0x3f, 0x29, 0xf9, 0x86, 0x99, 0x00, 0xb2, 0x72, 0x82, 0x49, 0x67, 0x18,
+ 0x2d, 0xde, 0x12, 0x1f, 0xde, 0x96, 0xdf, 0xa1, 0x15, 0x76, 0x93, 0x91,
+ 0x5b, 0x67, 0xb6, 0x8a, 0x6b, 0xf3, 0x2a, 0x6b, 0xb5, 0x29, 0x7a, 0x10,
+ 0x81, 0x83, 0x8b, 0xa8, 0x3e, 0xb4, 0x65, 0x08, 0xa6, 0x81, 0x68, 0xfe,
+ 0xbe, 0x25, 0x2a, 0xe5, 0x45, 0x86, 0x13, 0xa4, 0xd9, 0xcc, 0x29, 0x57,
+ 0x1e, 0xed, 0x7e, 0xda, 0x4e, 0xf5, 0x93, 0x4f, 0x22, 0x72, 0x57, 0x2a,
+ 0x9f, 0x27, 0xd9, 0xa8, 0x7c, 0x68, 0xe9, 0x1b, 0x06, 0xf8, 0x8f, 0x55,
+ 0x4a, 0x8b, 0x8c, 0x2c, 0x9a, 0x57, 0xd7, 0xd7, 0x36, 0xe7, 0x59, 0x37,
+ 0x70, 0xf4, 0x98, 0xc9, 0x05, 0xac, 0x3f, 0x82, 0x8e, 0xb0, 0x7f, 0x81,
+ 0xe4, 0xcf, 0x0e, 0x65, 0x6c, 0x9f, 0xa5, 0xa8, 0x06, 0x91, 0x94, 0xd6,
+ 0x6f, 0xc6, 0x64, 0x42, 0x9e, 0x98, 0xc0, 0xb2, 0x1e, 0x33, 0x1a, 0x17,
+ 0xb2, 0xea, 0x75, 0xc5, 0x55, 0x37, 0x39, 0xf9, 0xc9, 0xa9, 0x31, 0xe2,
+ 0x2e, 0xec, 0x02, 0x22, 0x13, 0x88, 0xe2, 0x92, 0x8a, 0x4c, 0x1e, 0xce,
+ 0xeb, 0x07, 0xbd, 0x45, 0x9c, 0x6c, 0x59, 0x67, 0xa5, 0xe2, 0xa4, 0xab,
+ 0x23, 0x33, 0xa9, 0x25, 0x2d, 0x3f, 0xe9, 0x36, 0x4c, 0xf0, 0xc3, 0x22,
+ 0x25, 0x1b, 0xb4, 0xd9, 0x57, 0x14, 0xd1, 0x66, 0x86, 0x9e, 0x7c, 0x47,
+ 0xad, 0xbc, 0x6f, 0x82, 0xdd, 0x01, 0x14, 0x77, 0xaf, 0xa7, 0x8f, 0xad,
+ 0xef, 0x44, 0xd8, 0xe3, 0xb9, 0xc4, 0x9c, 0x02, 0x40, 0x24, 0xe8, 0x86,
+ 0xd2, 0x62, 0xc2, 0xd7, 0xb3, 0x65, 0x29, 0x70, 0xaa, 0xb7, 0x15, 0xe9,
+ 0x22, 0x5a, 0xf0, 0xc5, 0x57, 0xb3, 0x1d, 0xaf, 0x31, 0x89, 0x61, 0x4d,
+ 0x20, 0x7d, 0xee, 0xcc, 0xb5, 0x60, 0x2e, 0xab, 0x6c, 0x02, 0x79, 0xbf,
+ 0x88, 0x98, 0x78, 0x7e, 0x27, 0x0e, 0x91, 0x3a, 0xab, 0xf8, 0x81, 0xe9,
+ 0x82, 0x96, 0x86, 0x79, 0x51, 0x3b, 0xda, 0x24, 0x90, 0x69, 0xa5, 0x29,
+ 0x08, 0x78, 0xfe, 0x7d, 0xf1, 0xde, 0x75, 0x18, 0x8f, 0x8c, 0x1b, 0xf1,
+ 0xac, 0xe6, 0xce, 0x48, 0x8a, 0x4a, 0xd4, 0xc1, 0xdc, 0x5f, 0xf1, 0x82,
+ 0xd2, 0xa6, 0x24, 0x47, 0x26, 0x44, 0x39, 0x43, 0x91, 0xe0, 0x58, 0x51,
+ 0xdc, 0xb3, 0xd2, 0xdc, 0x7e, 0x9b, 0x06, 0x44, 0xa0, 0x50, 0x5c, 0x35,
+ 0x65, 0x39, 0xff, 0x29, 0x98, 0x48, 0xf0, 0x58, 0xb4, 0x91, 0xf1, 0xd8,
+ 0x5c, 0xdf, 0x4a, 0x55, 0x00, 0x5d, 0x2c, 0xc0, 0x91, 0xa2, 0x82, 0x67,
+ 0xa1, 0x06, 0xed, 0x67, 0x5e, 0xaa, 0xb2, 0xfa, 0x0a, 0x1f, 0x3e, 0xde,
+ 0xa1, 0xe9, 0x2d, 0xfb, 0xe8, 0x98, 0x2a, 0x8a, 0x32, 0x67, 0x4b, 0xd3,
+ 0xb0, 0xd9, 0x89, 0xba, 0x22, 0x73, 0xa3, 0x5f, 0x07, 0x41, 0xae, 0x4a,
+ 0x42, 0xe3, 0xfd, 0x05, 0x60, 0xff, 0x0f, 0xfe, 0xd9, 0xcf, 0xd6, 0x9b,
+ 0xa8, 0x39, 0x3c, 0x10, 0xab, 0x01, 0x46, 0xfb, 0xa5, 0x2a, 0x29, 0x3a,
+ 0xca, 0x5f, 0x39, 0x17, 0xff, 0x5e, 0x46, 0xd9, 0x4a, 0x5d, 0x3d, 0x14,
+ 0x25, 0xc8, 0x97, 0x9f, 0x3d, 0x53, 0x53, 0x2c, 0x97, 0x9a, 0x66, 0x35,
+ 0x8d, 0xef, 0xac, 0xb6, 0xee, 0x4c, 0xf1, 0xa8, 0xe4, 0x2d, 0xcc, 0xd2,
+ 0x02, 0x21, 0xc4, 0x7c, 0x23, 0x45, 0xe9, 0x15, 0xdf, 0x18, 0xaf, 0x9a,
+ 0xa7, 0xb6, 0xe9, 0x39, 0x9b, 0xaf, 0x0e, 0xd9, 0xaa, 0x7b, 0x9e, 0x0c,
+ 0x7e, 0x39, 0x69, 0xbb, 0x7a, 0x73, 0xbe, 0x36, 0x0c, 0xa7, 0x58, 0x75,
+ 0xfa, 0xd4, 0x21, 0x6a, 0x1c, 0x25, 0xc2, 0x25, 0x67, 0xe9, 0xff, 0xc3,
+ 0x84, 0x06, 0x28, 0x74, 0x64, 0x21, 0x6f, 0xc4, 0x44, 0xc6, 0x58, 0xac,
+ 0xf9, 0xf8, 0x57, 0xac, 0xf7, 0x0b, 0x58, 0x51, 0xdc, 0xeb, 0x52, 0xed,
+ 0x27, 0x36, 0x53, 0x4f, 0x1d, 0x47, 0x2c, 0xaa, 0x2c, 0x93, 0xb2, 0xcb,
+ 0x34, 0x88, 0x83, 0xf0, 0x2a, 0x4e, 0x03, 0x8a, 0x6d, 0x9a, 0xda, 0x60,
+ 0xbf, 0x37, 0x24, 0x32, 0x7e, 0x23, 0x57, 0xaf, 0x90, 0x48, 0xf1, 0x68,
+ 0xb6, 0xba, 0xb6, 0x49, 0x0a, 0x58, 0xb1, 0x8a, 0x4e, 0xd5, 0x99, 0x84,
+ 0x45, 0xe9, 0xe3, 0x43, 0xbf, 0x73, 0xd2, 0x19, 0x55, 0x44, 0x4c, 0x11,
+ 0xea, 0xed, 0x50, 0x33, 0x53, 0xbd, 0x35, 0xeb, 0x4d, 0xc6, 0x17, 0x6a,
+ 0x23, 0x2d, 0x5d, 0x63, 0x1e, 0xd2, 0x4d, 0x83, 0x0a, 0x96, 0x0a, 0x16,
+ 0x24, 0x68, 0xeb, 0x54, 0xa6, 0x56, 0xb0, 0xdf, 0x4d, 0xc2, 0x9f, 0x88,
+ 0x4a, 0x8f, 0xdc, 0x69, 0xe0, 0xfc, 0xde, 0x2a, 0x4d, 0xd3, 0x70, 0x00,
+ 0xec, 0x4d, 0xc5, 0xe2, 0x90, 0xeb, 0x38, 0xbd, 0x4b, 0xda, 0x0b, 0x41,
+ 0x5f, 0xa7, 0x8e, 0xaa, 0x30, 0x93, 0xd0, 0x49, 0x87, 0xb3, 0x13, 0xaa,
+ 0x51, 0x88, 0x55, 0x70, 0x1e, 0x02, 0x90, 0x10, 0xd9, 0xa5, 0x30, 0xa3,
+ 0xf9, 0xd0, 0x1a, 0x65, 0x18, 0x87, 0xb2, 0x60, 0xab, 0x00, 0xda, 0x65,
+ 0x8e, 0x7b, 0x07, 0x9d, 0x36, 0x1e, 0x3e, 0x19, 0xe9, 0x79, 0x8e, 0x58,
+ 0xf9, 0x19, 0xe2, 0xbc, 0x46, 0x3f, 0x0a, 0x55, 0x56, 0x23, 0x9e, 0xeb,
+ 0x80, 0x8e, 0x57, 0x01, 0x3e, 0x7e, 0xaf, 0x53, 0x4d, 0x0a, 0x4f, 0xde,
+ 0xf3, 0x10, 0x2b, 0xce, 0x9e, 0xc4, 0x78, 0x60, 0x40, 0x87, 0xd8, 0x1b,
+ 0x98, 0xc9, 0xc7, 0xd6, 0x0f, 0x92, 0xba, 0x0c, 0x5a, 0x13, 0xf5, 0x00,
+ 0x88, 0x28, 0xe6, 0x3e, 0x7f, 0x1b, 0x1b, 0x06, 0xa8, 0xcc, 0x53, 0xb7,
+ 0x47, 0xaf, 0x29, 0x0e, 0xea, 0x38, 0x87, 0xc3, 0x84, 0xe0, 0xc6, 0xa2,
+ 0x4a, 0x69, 0x5d, 0x42, 0xe0, 0x21, 0x7b, 0x66, 0xa6, 0xdf, 0x46, 0x8a,
+ 0x15, 0x04, 0xcf, 0x12, 0x0b, 0xcc, 0xc9, 0x2d, 0xae, 0x68, 0xdc, 0x40,
+ 0xb1, 0x9c, 0x59, 0x7f, 0x20, 0xb8, 0x2a, 0xb0, 0x5a, 0x81, 0x00, 0x69,
+ 0x2e, 0x0f, 0x77, 0xe7, 0xce, 0x64, 0x05, 0x14, 0x0f, 0xa1, 0xe1, 0xdc,
+ 0xb7, 0x42, 0x69, 0x2a, 0xd6, 0xf0, 0xba, 0xc6, 0x67, 0x2c, 0xbf, 0xce,
+ 0x0f, 0x41, 0x9b, 0x6f, 0xb8, 0xf8, 0x13, 0x72, 0x7e, 0x4a, 0xf9, 0x13,
+ 0xbb, 0xce, 0x4a, 0x14, 0x2c, 0xbd, 0xdf, 0x55, 0x06, 0x6a, 0x7e, 0x18,
+ 0x03, 0x39, 0xea, 0x78, 0x3e, 0x56, 0x28, 0x05, 0x41, 0xbe, 0x06, 0xd7,
+ 0xf0, 0xe0, 0x33, 0x21, 0x57, 0xfe, 0x9b, 0xd2, 0xb8, 0xe7, 0x29, 0x4c,
+ 0xb7, 0x72, 0xf1, 0xd3, 0x45, 0x91, 0x91, 0xa5, 0x9b, 0x97, 0x6c, 0x44,
+ 0xcc, 0xbd, 0xc0, 0x40, 0xee, 0x9c, 0x81, 0xc8, 0xe5, 0x97, 0xe5, 0x42,
+ 0x68, 0xed, 0x6b, 0x5c, 0xab, 0x8e, 0x39, 0x08, 0x76, 0xf6, 0xdd, 0x2f,
+ 0xbe, 0x7a, 0xd0, 0xfb, 0x6a, 0x27, 0x9f, 0xdc, 0xe7, 0x88, 0x3a, 0x33,
+ 0x17, 0x42, 0x10, 0xe8, 0xf6, 0x75, 0x37, 0x2c, 0x31, 0x37, 0x5a, 0x39,
+ 0x40, 0xe1, 0x05, 0xec, 0x00, 0xa6, 0x00, 0x32, 0xa7, 0x6b, 0x3d, 0xb3,
+ 0x8c, 0x34, 0xde, 0x09, 0xda, 0x3e, 0x64, 0xc2, 0xb5, 0x6f, 0xea, 0xa3,
+ 0x3b, 0xc3, 0x7c, 0xc6, 0x13, 0xc1, 0x0b, 0x82, 0x90, 0xb2, 0x7e, 0xea,
+ 0x1f, 0xc5, 0xeb, 0x7a, 0xbc, 0x13, 0x29, 0xcc, 0xa8, 0xd2, 0x65, 0xbc,
+ 0x1c, 0x36, 0xac, 0x14, 0xc7, 0xf6, 0x20, 0x36, 0xd6, 0x41, 0xe5, 0xa3,
+ 0x29, 0x15, 0x1d, 0x48, 0xd7, 0xd9, 0x6c, 0x9d, 0x12, 0x54, 0xb3, 0x84,
+ 0x18, 0xc7, 0x9b, 0x2e, 0xb1, 0xc6, 0x37, 0xd4, 0xe7, 0x37, 0x9c, 0xa2,
+ 0xae, 0x77, 0x6b, 0x7a, 0xdc, 0x34, 0x04, 0x04, 0x03, 0x55, 0x6f, 0xf4,
+ 0xb3, 0x9f, 0x16, 0xd7, 0xa9, 0x94, 0x12, 0xcb, 0x62, 0x4d, 0x0b, 0x91,
+ 0x90, 0x69, 0xe4, 0xcb, 0xc7, 0x03, 0xf0, 0x88, 0x78, 0xf3, 0x67, 0xb0,
+ 0x3b, 0x3e, 0xfc, 0x11, 0xc1, 0x8b, 0xee, 0x30, 0x5a, 0x8e, 0x4a, 0xee,
+ 0xc8, 0x67, 0xc7, 0x45, 0x16, 0xc7, 0x3f, 0xea, 0xc9, 0xc5, 0xba, 0x7a,
+ 0xa9, 0x20, 0x87, 0xb2, 0xc1, 0x90, 0xb8, 0xca, 0x0f, 0x81, 0xab, 0x27,
+ 0xb1, 0x27, 0x88, 0xde, 0x94, 0xce, 0x47, 0x11, 0x0f, 0x32, 0x15, 0xbc,
+ 0x6e, 0xea, 0x3a, 0x47, 0x4b, 0x27, 0x49, 0xa8, 0xf0, 0xc2, 0x45, 0x51,
+ 0xac, 0x6e, 0x5e, 0x15, 0xc0, 0xce, 0xdc, 0x88, 0x7a, 0xeb, 0x27, 0xe9,
+ 0xbb, 0x67, 0x56, 0x83, 0xc9, 0xe4, 0xa4, 0x73, 0xab, 0x1f, 0x04, 0xe7,
+ 0x79, 0x2f, 0xd5, 0x8b, 0xee, 0xf2, 0x9b, 0xea, 0xd9, 0x08, 0xfa, 0xa0,
+ 0xe2, 0x81, 0xf8, 0xf3, 0x5a, 0xce, 0xf6, 0x75, 0xe4, 0x60, 0xd0, 0x51,
+ 0xb6, 0x36, 0xbb, 0xbf, 0xcf, 0xa3, 0x4c, 0x55, 0x40, 0x07, 0xa1, 0xa4,
+ 0x3a, 0xfd, 0x16, 0x01, 0xbb, 0x8b, 0xbe, 0x24, 0x2b, 0xbb, 0xd7, 0x6c,
+ 0x34, 0x37, 0xbb, 0x18, 0x7c, 0x66, 0x10, 0xb7, 0x49, 0xbe, 0xfd, 0x67,
+ 0x78, 0x61, 0x08, 0x7e, 0x58, 0x56, 0x71, 0x00, 0x85, 0x0b, 0xd2, 0xe7,
+ 0x17, 0xff, 0xfa, 0xf8, 0x97, 0xd7, 0x42, 0xf1, 0xa0, 0x72, 0xaf, 0xa2,
+ 0x98, 0x4b, 0x6b, 0x65, 0x0f, 0xbb, 0x87, 0x8a, 0x44, 0xe0, 0xd3, 0xeb,
+ 0xf6, 0xa2, 0x33, 0x0e, 0x8b, 0x13, 0x7e, 0x85, 0x5f, 0xcb, 0x0d, 0x25,
+ 0x8e, 0x51, 0xc2, 0xfc, 0xfe, 0xf4, 0x89, 0xc6, 0x4f, 0x6b, 0x45, 0x1f,
+ 0x1a, 0xb2, 0x91, 0xf6, 0x34, 0xc8, 0xdd, 0xe0, 0xd5, 0xce, 0x88, 0xf3,
+ 0x3f, 0x04, 0x1b, 0x65, 0x15, 0x43, 0xa0, 0x18, 0x22, 0x4e, 0xbc, 0xf7,
+ 0xb5, 0x53, 0xde, 0x99, 0xc9, 0x72, 0x7b, 0x3e, 0xba, 0x32, 0x78, 0x2f,
+ 0x57, 0xb7, 0x05, 0x86, 0x49, 0x84, 0x4d, 0x91, 0x3e, 0x97, 0x99, 0xee,
+ 0x73, 0x39, 0xa9, 0xf7, 0x03, 0x0e, 0x4b, 0x87, 0x04, 0xa8, 0x7a, 0xf8,
+ 0x3a, 0xe0, 0x92, 0x6e, 0x4e, 0x36, 0xef, 0x14, 0x7e, 0x13, 0x57, 0xc5,
+ 0xe0, 0x5f, 0xd8, 0x73, 0x59, 0x63, 0x66, 0xd8, 0x9b, 0x36, 0x04, 0x59,
+ 0xeb, 0x27, 0x59, 0x43, 0x0b, 0xdd, 0x2e, 0x3f, 0x22, 0x44, 0x2c, 0x8e,
+ 0x01, 0x61, 0xd6, 0x31, 0x41, 0xf6, 0x92, 0xe3, 0xd5, 0x2e, 0xf5, 0x6c,
+ 0x79, 0x3b, 0xe3, 0x34, 0xd7, 0x5e, 0xe1, 0xec, 0xc2, 0xf6, 0xe2, 0x48,
+ 0x3d, 0x72, 0x68, 0x54, 0xee, 0xbb, 0xa1, 0xe6, 0xe1, 0x63, 0x9d, 0xd1,
+ 0x28, 0x06, 0x48, 0x00, 0xbb, 0xe1, 0x02, 0x5a, 0x55, 0x13, 0xbc, 0x37,
+ 0xc5, 0xe6, 0x77, 0x58, 0x5c, 0xfa, 0x6c, 0x9f, 0xeb, 0xe4, 0xc2, 0x5b,
+ 0x27, 0x33, 0x8f, 0xea, 0x49, 0x85, 0xf4, 0x21, 0xdd, 0xe4, 0x41, 0xb5,
+ 0xf4, 0x1e, 0xd7, 0x1a, 0xd3, 0x7a, 0xd7, 0xb2, 0xf0, 0x83, 0x8e, 0x6c,
+ 0x66, 0xf9, 0x9d, 0x97, 0xe0, 0xb3, 0xf5, 0x49, 0xed, 0xac, 0x8d, 0xbe,
+ 0x23, 0xcf, 0xe2, 0x8f, 0x79, 0xd7, 0x6b, 0x97, 0x62, 0x3a, 0x20, 0x62,
+ 0x88, 0x8e, 0x54, 0x94, 0x9d, 0x68, 0xa0, 0x99, 0x3c, 0x69, 0x57, 0x53,
+ 0x35, 0xb4, 0x19, 0x27, 0xa6, 0xd9, 0xec, 0x0c, 0xb8, 0x06, 0xef, 0xfc,
+ 0xe7, 0xad, 0x3e, 0x44, 0xe5, 0x6d, 0x2c, 0x74, 0x0b, 0xcf, 0xbe, 0x01,
+ 0x00, 0xee, 0xb1, 0x8e, 0x92, 0x20, 0x27, 0xea, 0xba, 0xa8, 0xb5, 0x72,
+ 0x21, 0x40, 0x4b, 0x62, 0x75, 0x1a, 0x29, 0x8f, 0xe2, 0x61, 0x40, 0xdd,
+ 0x55, 0x9e, 0xd9, 0x66, 0x14, 0x09, 0x5b, 0x90, 0xa2, 0x37, 0x57, 0xbb,
+ 0x70, 0x41, 0xce, 0xdc, 0x9a, 0x7b, 0xb3, 0x8d, 0xcc, 0xd4, 0xc8, 0x21,
+ 0x2f, 0xe6, 0xa7, 0x7f, 0x16, 0xdb, 0xa5, 0xf9, 0x36, 0x27, 0xe9, 0xfd,
+ 0x37, 0x2a, 0xf1, 0x07, 0x68, 0x71, 0x59, 0xf6, 0xb1, 0xa2, 0xf3, 0xbc,
+ 0x45, 0xac, 0x33, 0x2d, 0x3f, 0x2f, 0xd8, 0x8d, 0x7b, 0xe9, 0x74, 0x5c,
+ 0x54, 0xda, 0x2c, 0x2a, 0x86, 0x9f, 0xf3, 0xc3, 0xab, 0x48, 0x96, 0x6b,
+ 0x07, 0xcc, 0x31, 0xaf, 0x7c, 0xae, 0x35, 0x71, 0xe7, 0xdf, 0xc7, 0xd0,
+ 0x26, 0xea, 0x84, 0x25, 0x0a, 0xe4, 0x4d, 0x64, 0x45, 0x20, 0x35, 0xf7,
+ 0x6f, 0x80, 0xb6, 0xa3, 0xc9, 0x2c, 0xa8, 0x0e, 0xcc, 0xef, 0x91, 0x82,
+ 0x80, 0x4b, 0x78, 0x28, 0xfc, 0x9b, 0xf0, 0xaf, 0x24, 0x51, 0x4c, 0xfb,
+ 0x14, 0xdb, 0x5c, 0x66, 0xc0, 0x1c, 0x06, 0xdc, 0xbc, 0x16, 0xc8, 0xc2,
+ 0xac, 0xde, 0xd8, 0x9e, 0xc1, 0xec, 0xd4, 0x8a, 0xc5, 0xf7, 0x41, 0xd2,
+ 0xc3, 0x5c, 0x5c, 0x95, 0x5f, 0x36, 0x1e, 0x48, 0x58, 0x86, 0xd4, 0xd4,
+ 0xaa, 0x97, 0xc3, 0x34, 0xd9, 0x47, 0x3e, 0x8a, 0x79, 0x21, 0x31, 0xe1,
+ 0x06, 0x45, 0x41, 0xda, 0x02, 0xec, 0x17, 0x75, 0x5e, 0xa8, 0x31, 0x26,
+ 0xac, 0x4c, 0xe7, 0x4e, 0xb4, 0x34, 0x3d, 0xe0, 0xda, 0x68, 0x0f, 0x00,
+ 0x81, 0x5e, 0xba, 0x1c, 0x54, 0xa2, 0x1a, 0x36, 0x07, 0x56, 0x33, 0x1a,
+ 0x5b, 0x7d, 0x09, 0xe4, 0xce, 0x88, 0x4d, 0xc3, 0x08, 0x0e, 0x0e, 0x57,
+ 0x86, 0xa3, 0xb3, 0xd6, 0x26, 0x5e, 0x83, 0x70, 0x4b, 0xe4, 0x4e, 0x5f,
+ 0xfc, 0x9b, 0x9c, 0xf7, 0x6b, 0x03, 0x2f, 0x63, 0x83, 0x69, 0x52, 0xe5,
+ 0x9e, 0x48, 0x06, 0x3a, 0x16, 0xac, 0x45, 0x16, 0x0b, 0xdc, 0xe1, 0x31,
+ 0x8e, 0xfa, 0x8e, 0x4c, 0x38, 0x78, 0x11, 0xb5, 0x43, 0xeb, 0x1c, 0x24,
+ 0x4b, 0x4c, 0x1f, 0x39, 0x61, 0x71, 0x8e, 0x31, 0x87, 0x75, 0x5e, 0x2e,
+ 0x4c, 0x0e, 0x21, 0x6e, 0xff, 0xd5, 0x8a, 0xec, 0x30, 0x16, 0x24, 0x1d,
+ 0x85, 0x5a, 0xb6, 0xa8, 0x3a, 0x0a, 0x4c, 0x94, 0x0d, 0x9c, 0xff, 0x24,
+ 0x48, 0x79, 0xda, 0xc1, 0x92, 0x20, 0x58, 0x22, 0xe6, 0xa4, 0xd3, 0x1e,
+ 0x83, 0x05, 0x6f, 0x2c, 0xa6, 0x54, 0xb2, 0xbc, 0xf8, 0xe4, 0x17, 0x42,
+ 0xb2, 0x4c, 0xff, 0x27, 0x8b, 0x25, 0xbb, 0xd6, 0xa1, 0x04, 0x48, 0x7d,
+ 0xe5, 0x6f, 0x77, 0xf3, 0x4f, 0x06, 0x52, 0x17, 0xe8, 0x33, 0xf5, 0x72,
+ 0xcd, 0xab, 0xa7, 0x41, 0xcb, 0x0b, 0x6c, 0xe6, 0xe6, 0xa0, 0x18, 0x51,
+ 0x8e, 0xc9, 0xe1, 0xf3, 0x17, 0x20, 0x35, 0x6d, 0xd8, 0xe2, 0x93, 0x4c,
+ 0xd5, 0x07, 0x60, 0x1c, 0x02, 0x7c, 0x13, 0xe8, 0xcb, 0x1f, 0x17, 0xf2,
+ 0xcd, 0xdb, 0x7c, 0xc2, 0xf9, 0xa4, 0xc6, 0x4c, 0x17, 0xe3, 0x1d, 0x6f,
+ 0x24, 0x94, 0xcb, 0x6d, 0xe5, 0x5f, 0xef, 0x62, 0xa5, 0xca, 0x17, 0xd4,
+ 0x16, 0x95, 0x73, 0x78, 0x6f, 0x1b, 0x51, 0xeb, 0xc4, 0x2b, 0x94, 0x8f,
+ 0xed, 0xad, 0x97, 0x95, 0x4d, 0xd4, 0x9e, 0xc3, 0x92, 0xa4, 0xb8, 0x4c,
+ 0xe1, 0x15, 0x2a, 0x1b, 0x8c, 0xd9, 0x2f, 0x9d, 0x6d, 0x61, 0xb4, 0x24,
+ 0xf7, 0x68, 0x52, 0xb5, 0x81, 0xe2, 0xba, 0xf5, 0x0a, 0x3b, 0xdf, 0xef,
+ 0x0f, 0x6f, 0x9d, 0xda, 0x0e, 0x23, 0x94, 0xb0, 0x91, 0xe6, 0x00, 0xef,
+ 0x0c, 0xe2, 0xc7, 0x19, 0x2a, 0x0c, 0xdb, 0x12, 0xbd, 0x99, 0x69, 0xb9,
+ 0x48, 0x05, 0x06, 0xc7, 0xf0, 0x77, 0xb8, 0x72, 0x5c, 0x7d, 0x0c, 0xbd,
+ 0xc5, 0x30, 0x93, 0x8e, 0xa4, 0x62, 0x43, 0x14, 0x12, 0x57, 0x06, 0x15,
+ 0x02, 0x29, 0x52, 0x47, 0x99, 0x40, 0xfa, 0x9c, 0x13, 0x34, 0x0d, 0x54,
+ 0x37, 0x9d, 0xf2, 0xff, 0x44, 0x5c, 0x09, 0x7d, 0xfa, 0x7e, 0xf4, 0x02,
+ 0xdc, 0xb6, 0xe4, 0x59, 0xb8, 0x58, 0xd6, 0xb4, 0x73, 0x2e, 0x5a, 0x40,
+ 0xcd, 0x4f, 0xfe, 0xf7, 0x89, 0x01, 0xde, 0xe6, 0xcd, 0x77, 0x39, 0xbd,
+ 0x26, 0xe8, 0x44, 0x25, 0x6a, 0x78, 0xee, 0xcd, 0x7d, 0xb0, 0xe5, 0x2b,
+ 0x7c, 0x1a, 0xbf, 0xdc, 0x01, 0x92, 0x4a, 0xd9, 0x17, 0x80, 0xf3, 0x03,
+ 0xd5, 0xd7, 0x51, 0x65, 0xfe, 0x82, 0x4e, 0x7e, 0xfe, 0xae, 0x39, 0xfd,
+ 0x87, 0x57, 0x24, 0x16, 0x1b, 0x54, 0x01, 0x79, 0x22, 0xe9, 0x0f, 0x2c,
+ 0x2a, 0xba, 0x20, 0x5a, 0x57, 0x16, 0x36, 0x76, 0x2f, 0x47, 0x04, 0x05,
+ 0xb9, 0xd2, 0x19, 0x80, 0xb2, 0x49, 0x92, 0xe3, 0xd6, 0x0e, 0x8f, 0x03,
+ 0x49, 0x0d, 0xcf, 0xf7, 0xde, 0xe9, 0x41, 0x98, 0xe5, 0x6a, 0x21, 0x23,
+ 0xb9, 0x07, 0xfa, 0x07, 0x97, 0x69, 0x4e, 0xaf, 0x01, 0x32, 0x6e, 0xc4,
+ 0xde, 0x13, 0x1b, 0x27, 0x89, 0x1a, 0x57, 0xc1, 0x85, 0x15, 0x22, 0xac,
+ 0x78, 0xea, 0xbb, 0x8d, 0xec, 0x0c, 0xff, 0x58, 0x54, 0x00, 0xff, 0xa8,
+ 0x98, 0xd5, 0x7b, 0xcb, 0xae, 0x04, 0x70, 0xa4, 0x19, 0xee, 0x8d, 0xbc,
+ 0x38, 0xe8, 0xf1, 0xd3, 0x95, 0x2b, 0x0d, 0x5c, 0x67, 0xeb, 0x49, 0xe3,
+ 0xfc, 0x81, 0xa5, 0xfe, 0x79, 0xf6, 0x8a, 0x3e, 0xde, 0xa7, 0xca, 0x2e,
+ 0xae, 0x14, 0xe0, 0x32, 0x3e, 0x94, 0x66, 0x15, 0x02, 0xac, 0x4d, 0xe7,
+ 0xdd, 0xd4, 0x09, 0x9a, 0x16, 0x88, 0x13, 0x3e, 0xd4, 0x28, 0x60, 0xb5,
+ 0x09, 0x1a, 0x3e, 0xd5, 0x8b, 0x52, 0xad, 0x57, 0xa3, 0xa9, 0x2b, 0x34,
+ 0x04, 0xec, 0x90, 0x5c, 0x3a, 0xbd, 0x87, 0x0d, 0xbf, 0xfd, 0x2f, 0x99,
+ 0xd8, 0xc8, 0x71, 0xee, 0x69, 0x86, 0x41, 0xc1, 0x5f, 0x78, 0xc4, 0xbe,
+ 0x38, 0x5d, 0xa4, 0x49, 0x03, 0xb3, 0xef, 0xb8, 0x5f, 0x9f, 0xce, 0x4b,
+ 0x1d, 0x06, 0xd1, 0xdb, 0x29, 0x2f, 0x26, 0x43, 0x2e, 0x2f, 0xa3, 0x71,
+ 0x22, 0x80, 0xd8, 0xbe, 0x4d, 0xc3, 0xfb, 0x7b, 0x76, 0xef, 0x65, 0x0e,
+ 0x31, 0x03, 0xd2, 0x00, 0x29, 0x3e, 0x51, 0x53, 0x23, 0xa0, 0x90, 0xe4,
+ 0xef, 0x2c, 0xe6, 0x5e, 0xa6, 0xd7, 0xa9, 0x6b, 0x9a, 0xea, 0x04, 0xbd,
+ 0xfa, 0x19, 0x05, 0x1f, 0x67, 0xa5, 0xe0, 0xf0, 0xab, 0x5c, 0x2f, 0xb2,
+ 0x2f, 0xfc, 0xc9, 0x2f, 0xe8, 0x98, 0xb1, 0x04, 0xfd, 0x52, 0xce, 0xdf,
+ 0x8b, 0x7c, 0xd0, 0xe6, 0xfb, 0xad, 0xdf, 0x98, 0xa4, 0x67, 0xef, 0x9e,
+ 0xa5, 0x1a, 0x43, 0x4a, 0x91, 0x26, 0xe4, 0x71, 0x7a, 0x51, 0xb3, 0xc4,
+ 0xd6, 0x2d, 0x22, 0xef, 0xa5, 0xa5, 0xf2, 0x49, 0xaa, 0xe9, 0xfd, 0xf8,
+ 0x06, 0xfc, 0x58, 0x15, 0x2c, 0x9e, 0x79, 0x33, 0x44, 0xd7, 0x6e, 0x10,
+ 0x3c, 0xe8, 0x0d, 0xf8, 0x9f, 0xbb, 0x5f, 0x16, 0x19, 0xf4, 0xc9, 0x90,
+ 0xd0, 0x2b, 0xa6, 0x41, 0x50, 0xa8, 0x53, 0xf6, 0x36, 0x15, 0x7a, 0x82,
+ 0x86, 0x54, 0x9b, 0x77, 0x2f, 0x2d, 0xfa, 0x92, 0x0d, 0x44, 0x56, 0x52,
+ 0xd3, 0xea, 0x29, 0x3c, 0x8b, 0xae, 0xf0, 0xe2, 0x29, 0x9a, 0x53, 0xbe,
+ 0x46, 0x53, 0xaa, 0x24, 0x38, 0xe9, 0xbf, 0x85, 0x82, 0x14, 0xb0, 0x02,
+ 0xe8, 0x9f, 0xc1, 0xc1, 0x3e, 0x8b, 0xab, 0xf2, 0xce, 0xfc, 0x1f, 0x9a,
+ 0x9b, 0xd7, 0x15, 0x3f, 0x0f, 0x7c, 0x9d, 0x30, 0x8f, 0xd8, 0x5b, 0x16,
+ 0x5a, 0x56, 0x03, 0x19, 0xbb, 0x86, 0xe5, 0xca, 0x8b, 0xf9, 0x8e, 0x44,
+ 0x2e, 0x55, 0x65, 0xfd, 0xd2, 0x70, 0x14, 0x21, 0x9a, 0x69, 0x7e, 0xc0,
+ 0xab, 0x1c, 0x0d, 0x30, 0xee, 0xa6, 0xa2, 0xec, 0x36, 0x9b, 0x67, 0xc8,
+ 0x87, 0xfc, 0xa4, 0x05, 0x58, 0x3b, 0x8f, 0x6c, 0x6d, 0xfc, 0x26, 0x2c,
+ 0xb9, 0xad, 0x11, 0x47, 0x93, 0xbf, 0x27, 0x84, 0xa5, 0x30, 0x9f, 0xee,
+ 0xf9, 0x13, 0x96, 0xfe, 0x2b, 0xc4, 0x4c, 0x2d, 0x0b, 0x11, 0x15, 0xd8,
+ 0x22, 0x20, 0x3f, 0xb7, 0x47, 0xf3, 0xcc, 0x48, 0x85, 0x7f, 0x4f, 0xd7,
+ 0xe8, 0x7e, 0xb2, 0xd2, 0xe2, 0x45, 0x6e, 0xa4, 0x64, 0x0b, 0x61, 0xc3,
+ 0xc0, 0x9d, 0x56, 0x99, 0x20, 0x76, 0x3c, 0x30, 0x23, 0x97, 0x16, 0xfa,
+ 0x7f, 0xeb, 0x82, 0xc5, 0x95, 0xa3, 0x2f, 0x1b, 0x25, 0x11, 0x32, 0x7c,
+ 0xfd, 0x26, 0xdb, 0xaa, 0x8e, 0x07, 0x0b, 0x3d, 0xab, 0xbb, 0xe3, 0x4c,
+ 0xa0, 0x4e, 0x80, 0xed, 0xa7, 0x0c, 0x3a, 0x93, 0x59, 0xc2, 0x64, 0x48,
+ 0xf2, 0x57, 0xd2, 0x2e, 0xf4, 0x4b, 0x61, 0x91, 0x0a, 0x9e, 0x52, 0x7d,
+ 0x58, 0x6f, 0x8e, 0x4f, 0x8c, 0x9f, 0x68, 0x79, 0x40, 0x4d, 0x0d, 0x56,
+ 0xef, 0xd5, 0xb3, 0x75, 0xe8, 0x77, 0x1f, 0x7b, 0x9c, 0x1e, 0xbd, 0xc8,
+ 0xf1, 0xb6, 0x9b, 0xbb, 0xa6, 0x89, 0xf4, 0xb5, 0xf9, 0x09, 0x0c, 0x0c,
+ 0xe0, 0xb8, 0xc2, 0x4b, 0x6b, 0x39, 0x81, 0x3b, 0xcb, 0xa2, 0xda, 0x47,
+ 0xc8, 0x46, 0x46, 0x3e, 0x76, 0x9a, 0xa6, 0xc8, 0x80, 0xa3, 0x28, 0x8d,
+ 0x5a, 0x73, 0x79, 0x1f, 0x19, 0x2b, 0xb1, 0x0d, 0xe5, 0xff, 0x6c, 0x90,
+ 0x52, 0x28, 0xd2, 0x0f, 0x88, 0x63, 0x4c, 0xe0, 0x53, 0x20, 0x52, 0x7a,
+ 0xf3, 0xf2, 0xcf, 0x5f, 0x1f, 0xe5, 0xf5, 0xa0, 0xb4, 0x6f, 0x59, 0x8b,
+ 0xa0, 0x17, 0x07, 0x63, 0x19, 0x14, 0xde, 0x49, 0x3d, 0xec, 0xbf, 0xd0,
+ 0x91, 0xe1, 0xaa, 0x25, 0xb5, 0x6f, 0x02, 0x89, 0x12, 0x62, 0x72, 0x6e,
+ 0x0d, 0xe3, 0xdb, 0xe7, 0xfb, 0x53, 0xc7, 0x2c, 0xf5, 0x71, 0x6b, 0xee,
+ 0x38, 0x8f, 0x7a, 0xcf, 0x51, 0xb3, 0xf2, 0x88, 0x5d, 0x27, 0x0e, 0x3d,
+ 0xc8, 0x18, 0xf9, 0xf8, 0x5f, 0xe3, 0xaf, 0xd3, 0xa4, 0x6f, 0x56, 0xf7,
+ 0x95, 0xd0, 0xd6, 0xb3, 0x74, 0x32, 0x77, 0x39, 0x71, 0x58, 0x0f, 0xf9,
+ 0x18, 0xfd, 0x2c, 0x92, 0x1b, 0x88, 0x7e, 0x74, 0x74, 0x99, 0x3c, 0xf5,
+ 0x77, 0x5c, 0xd6, 0xb0, 0x84, 0x11, 0x5c, 0x39, 0xfc, 0xf2, 0x71, 0x2f,
+ 0x9b, 0x8c, 0x0e, 0x4d, 0x5c, 0xd4, 0xda, 0x97, 0x8a, 0xe5, 0x75, 0x13,
+ 0xfe, 0x7f, 0x10, 0x87, 0xad, 0x53, 0xfb, 0xaa, 0xfb, 0x0a, 0xae, 0xa5,
+ 0xc9, 0xd7, 0xbe, 0x99, 0x63, 0xaa, 0xd3, 0x34, 0xde, 0x45, 0x85, 0xcd,
+ 0xa7, 0x21, 0x6f, 0xde, 0x24, 0x5d, 0x56, 0x41, 0xb5, 0xa5, 0x68, 0x4d,
+ 0xf5, 0x77, 0x1b, 0x6c, 0x79, 0xe7, 0xd6, 0x74, 0x4f, 0x6e, 0x57, 0x13,
+ 0x5c, 0x2e, 0x7e, 0x37, 0xbf, 0xf7, 0x64, 0x44, 0x2a, 0x1a, 0x18, 0x25,
+ 0x7b, 0x36, 0x50, 0xdd, 0x5d, 0xc2, 0x6c, 0x14, 0xcc, 0xad, 0xc8, 0xe8,
+ 0xd1, 0x0b, 0x3b, 0x9c, 0xaf, 0xd4, 0x62, 0xcd, 0x38, 0xb9, 0xe4, 0xa1,
+ 0x0d, 0x61, 0x55, 0x9f, 0x39, 0x3c, 0x8d, 0x60, 0x46, 0x55, 0xbb, 0x86,
+ 0x6b, 0x20, 0xe7, 0xc3, 0x81, 0x2c, 0xbc, 0xe4, 0x54, 0xa4, 0x1f, 0xf5,
+ 0x2f, 0x0e, 0xf9, 0xda, 0x36, 0xab, 0x26, 0x60, 0xef, 0xc1, 0x79, 0xad,
+ 0x46, 0x34, 0x95, 0x39, 0x46, 0x03, 0xd6, 0x20, 0x65, 0x53, 0x37, 0xd3,
+ 0x7d, 0xde, 0xf2, 0xd3, 0x55, 0x5a, 0xdd, 0x86, 0x69, 0xa0, 0x9d, 0xb3,
+ 0xd4, 0x13, 0x8d, 0x49, 0x71, 0xa4, 0x99, 0x7a, 0x3d, 0x81, 0x19, 0xf6,
+ 0xe6, 0x0f, 0x4e, 0x72, 0xca, 0x05, 0x7b, 0x5f, 0xc1, 0xc1, 0x29, 0xa8,
+ 0xe8, 0x6b, 0x17, 0xb3, 0xf3, 0x12, 0xd4, 0xf2, 0x46, 0x78, 0xcf, 0xd2,
+ 0x69, 0xac, 0xfc, 0x91, 0x4d, 0xbc, 0x7b, 0x9c, 0x55, 0x4f, 0xa1, 0x9b,
+ 0xf4, 0x83, 0xdb, 0xee, 0x29, 0xe5, 0x7f, 0x59, 0x1d, 0xbb, 0x6b, 0x85,
+ 0x3d, 0x2d, 0x76, 0x10, 0xc7, 0x00, 0xe6, 0x1d, 0x19, 0x32, 0x81, 0xdb,
+ 0x02, 0x0e, 0x32, 0xa1, 0xd1, 0x33, 0x54, 0xae, 0xbb, 0x03, 0x89, 0xea,
+ 0x82, 0xa5, 0xd9, 0x37, 0x18, 0xed, 0xdb, 0xa5, 0x4a, 0xe4, 0x4f, 0xb4,
+ 0x3e, 0x49, 0xf1, 0x15, 0xbe, 0xe7, 0xad, 0x40, 0xf5, 0xf8, 0xba, 0xc6,
+ 0xf1, 0x2e, 0x08, 0xc4, 0xb1, 0xbe, 0x9b, 0x3f, 0x57, 0x3b, 0xd3, 0x9c,
+ 0x93, 0x00, 0x44, 0xb0, 0xee, 0x6d, 0x15, 0x44, 0x31, 0xc8, 0x6f, 0xdc,
+ 0xa1, 0xb1, 0xd2, 0x8c, 0x14, 0x69, 0x94, 0x9f, 0x42, 0xdb, 0x23, 0xe6,
+ 0x5a, 0x6b, 0x27, 0xb8, 0x1f, 0xe9, 0x7c, 0xa0, 0x57, 0x2f, 0xa9, 0x9b,
+ 0x4e, 0x94, 0x57, 0x2a, 0xe4, 0x36, 0xc0, 0xe6, 0xbc, 0x9e, 0x7f, 0xe5,
+ 0x68, 0xd3, 0xc1, 0xb0, 0x46, 0xc4, 0xf1, 0x30, 0x6c, 0x40, 0x43, 0xc2,
+ 0x09, 0x98, 0xd3, 0x74, 0xb4, 0x80, 0xa2, 0x88, 0x9b, 0xb6, 0xef, 0x73,
+ 0x6c, 0xa0, 0x2b, 0xf5, 0xb8, 0x63, 0x27, 0x54, 0xec, 0x7f, 0xe3, 0x04,
+ 0xb6, 0x88, 0xdc, 0xa4, 0xdb, 0xae, 0x52, 0x79, 0xaf, 0x1e, 0xd2, 0xe5,
+ 0x5e, 0x25, 0x1e, 0x94, 0x34, 0xb7, 0x9d, 0x67, 0x63, 0x28, 0x33, 0xbe,
+ 0xff, 0xb3, 0x9b, 0xb3, 0x8e, 0x35, 0xf6, 0x63, 0x77, 0x8d, 0xca, 0x0c,
+ 0xb6, 0x22, 0xf5, 0x8f, 0xa0, 0xd6, 0xa5, 0xc5, 0xd2, 0xaf, 0x26, 0xd1,
+ 0x81, 0x65, 0x87, 0x0c, 0x22, 0xd7, 0x13, 0x21, 0xda, 0xd5, 0x7e, 0x56,
+ 0xe9, 0xd2, 0xac, 0x13, 0xa7, 0x8a, 0x2d, 0xd7, 0x5a, 0x7f, 0x5b, 0x06,
+ 0x48, 0xad, 0xab, 0x59, 0x74, 0xc0, 0xda, 0xcc, 0x85, 0x94, 0xf9, 0xd2,
+ 0xf0, 0xf3, 0x80, 0xae, 0x3f, 0x93, 0x48, 0xc2, 0x32, 0x89, 0xe5, 0x37,
+ 0x24, 0xf5, 0xd0, 0x5c, 0x0a, 0xcc, 0x0c, 0xc5, 0x4e, 0x55, 0xad, 0xc4,
+ 0x2d, 0xa3, 0xff, 0xbb, 0x17, 0x4c, 0xfc, 0x1e, 0x7c, 0x33, 0x00, 0xba,
+ 0x75, 0x46, 0xd8, 0x25, 0x63, 0x71, 0x53, 0x0c, 0x54, 0x06, 0x81, 0x35,
+ 0xed, 0x9e, 0xb2, 0x96, 0x74, 0x6a, 0x98, 0xa4, 0x74, 0x2d, 0x87, 0x06,
+ 0x30, 0x6f, 0x38, 0x08, 0x28, 0x37, 0xe8, 0x9b, 0xac, 0xa3, 0x89, 0xa5,
+ 0xad, 0x20, 0x0f, 0x46, 0x8b, 0x9a, 0x6d, 0x0d, 0x75, 0x0c, 0xc6, 0x52,
+ 0x61, 0x12, 0xe0, 0x7d, 0xb7, 0xcf, 0xb6, 0xa9, 0x3c, 0x66, 0x47, 0xca,
+ 0x39, 0x75, 0x8c, 0xa2, 0x8b, 0x41, 0x5d, 0x38, 0x6f, 0x98, 0x1d, 0xab,
+ 0x07, 0x44, 0xd4, 0x42, 0xf7, 0xfa, 0xc2, 0x1a, 0x61, 0xf3, 0x1d, 0xa6,
+ 0xbf, 0x4c, 0xd0, 0x52, 0xc7, 0x6c, 0x6b, 0x30, 0x56, 0x7c, 0x07, 0xc1,
+ 0x13, 0x14, 0xcb, 0xfc, 0xc6, 0x76, 0x6d, 0x62, 0xff, 0xe7, 0x18, 0x14,
+ 0x45, 0x7a, 0x47, 0xe2, 0x81, 0x33, 0xfa, 0x78, 0x2c, 0xed, 0xfa, 0x1d,
+ 0x2c, 0xb1, 0x4e, 0xbf, 0xb2, 0xf1, 0x29, 0xfb, 0x18, 0x43, 0x97, 0x09,
+ 0x9f, 0x47, 0xa0, 0xb1, 0xdf, 0xe1, 0x41, 0x33, 0x79, 0x81, 0xf1, 0xf0,
+ 0x7e, 0x1b, 0xe8, 0x30, 0x15, 0xe0, 0xba, 0xe3, 0xd5, 0xe1, 0xf5, 0x2d,
+ 0xaf, 0x36, 0xb9, 0x85, 0xde, 0x73, 0xe2, 0xd6, 0x1b, 0x07, 0xe8, 0xd9,
+ 0x76, 0x0f, 0xee, 0x98, 0xbe, 0x75, 0x1b, 0xae, 0xa8, 0xf5, 0xa7, 0x34,
+ 0x18, 0x4f, 0x7a, 0x3f, 0xff, 0xf4, 0x3e, 0x0f, 0x50, 0xd9, 0xe3, 0xda,
+ 0xfe, 0x48, 0x38, 0x6e, 0x76, 0x7c, 0x9d, 0x08, 0x72, 0x38, 0x02, 0xe1,
+ 0x78, 0x8a, 0xc9, 0x42, 0x06, 0x48, 0x60, 0x88, 0xbe, 0x36, 0x90, 0xec,
+ 0xef, 0x7e, 0x50, 0x02, 0x75, 0x0a, 0x14, 0x59, 0x28, 0x03, 0xe9, 0x0a,
+ 0x7c, 0x08, 0x86, 0x48, 0x14, 0x45, 0xf2, 0xf2, 0xad, 0x14, 0xfe, 0x85,
+ 0x1c, 0xbe, 0xcb, 0x64, 0xcf, 0xd6, 0x94, 0x64, 0x8b, 0x4a, 0xb1, 0xce,
+ 0x0d, 0x17, 0x6c, 0x75, 0x91, 0xdc, 0x0d, 0x2d, 0x56, 0x11, 0x27, 0x94,
+ 0x89, 0xb5, 0xe2, 0xc2, 0x2a, 0x44, 0xb8, 0x98, 0x7b, 0x42, 0xfb, 0x77,
+ 0xf1, 0x0d, 0xb1, 0x82, 0x28, 0x02, 0x92, 0x2f, 0xd6, 0x27, 0x34, 0xd9,
+ 0xbd, 0xd1, 0x0e, 0x1d, 0x9e, 0xe4, 0xc4, 0xf2, 0xa0, 0x09, 0x50, 0x89,
+ 0xf8, 0x37, 0x5d, 0x81, 0x15, 0x5e, 0xe0, 0xc8, 0xa9, 0x4b, 0xc3, 0xc5,
+ 0x56, 0xaa, 0x22, 0x8e, 0x9d, 0xb5, 0x51, 0xeb, 0x61, 0x32, 0xfd, 0xb5,
+ 0xad, 0x55, 0x7c, 0x61, 0x3c, 0x00, 0xfb, 0x72, 0xe4, 0x46, 0x31, 0xfb,
+ 0x9f, 0x0b, 0x6a, 0xbf, 0xa7, 0x57, 0xfc, 0xbd, 0xa7, 0x00, 0xde, 0xc7,
+ 0x80, 0x5a, 0x20, 0xc8, 0x51, 0x9f, 0xa6, 0xa3, 0xc9, 0x12, 0x3a, 0x0f,
+ 0x0f, 0x62, 0x20, 0xad, 0x8a, 0x56, 0x85, 0xe8, 0x6f, 0xf0, 0xe3, 0xd6,
+ 0x63, 0x6e, 0x19, 0x0b, 0x98, 0xf1, 0x3d, 0x3f, 0xce, 0xe6, 0x9f, 0x3c,
+ 0x75, 0x26, 0xe2, 0x6c, 0x10, 0x8f, 0xee, 0x96, 0xaa, 0x93, 0x41, 0xd8,
+ 0x86, 0xb5, 0x72, 0x70, 0x93, 0xd4, 0x29, 0xbe, 0x9f, 0x57, 0x68, 0xc2,
+ 0x7d, 0x59, 0xbb, 0x8d, 0x3d, 0x70, 0xa7, 0x04, 0x23, 0x84, 0x37, 0x86,
+ 0x1d, 0xb0, 0x5e, 0x00, 0x11, 0x24, 0x9d, 0x65, 0xca, 0x84, 0x7f, 0x69,
+ 0xd0, 0xa9, 0x16, 0xab, 0xdb, 0xa4, 0x9f, 0x83, 0x1c, 0x6a, 0x07, 0x7b,
+ 0x6d, 0xb9, 0x32, 0xff, 0xed, 0x09, 0x24, 0x4f, 0x0a, 0x16, 0x41, 0x10,
+ 0xce, 0x32, 0xb4, 0xa1, 0x78, 0x7f, 0x8d, 0xf4, 0x59, 0xb6, 0xcb, 0x3b,
+ 0xb8, 0x80, 0x9b, 0x47, 0x39, 0xeb, 0xcc, 0x10, 0xff, 0x19, 0xdb, 0x8c,
+ 0x70, 0xfe, 0x93, 0x36, 0xd6, 0x66, 0xaa, 0x87, 0xbc, 0x01, 0xbf, 0xa6,
+ 0xac, 0x20, 0x90, 0x84, 0x38, 0x17, 0xdc, 0x35, 0x23, 0x41, 0xde, 0x40,
+ 0x70, 0x0f, 0x1b, 0x99, 0xa6, 0xf2, 0xf0, 0x55, 0x9c, 0x37, 0x39, 0x5b,
+ 0xb3, 0x33, 0xcb, 0x59, 0x53, 0x4f, 0x6f, 0xc5, 0x73, 0x50, 0xc5, 0xaa,
+ 0x82, 0x70, 0x96, 0x86, 0xd6, 0xf5, 0xdf, 0x46, 0xb4, 0x09, 0xf4, 0xb2,
+ 0xe0, 0x6f, 0x88, 0x0b, 0xd3, 0xe9, 0x9f, 0x9b, 0xa7, 0x2e, 0x21, 0xf8,
+ 0xe0, 0xc6, 0x1a, 0x4a, 0x6b, 0xc9, 0xe4, 0x71, 0x67, 0x75, 0x8c, 0xee,
+ 0x9f, 0xc8, 0x04, 0x21, 0x4e, 0x25, 0x08, 0xd0, 0x49, 0x3a, 0x31, 0x5b,
+ 0xa8, 0x7f, 0xc2, 0xd7, 0x10, 0x2f, 0x00, 0x7a, 0x90, 0x81, 0x40, 0x59,
+ 0x0b, 0x92, 0xd1, 0x37, 0xe3, 0x77, 0xb1, 0x9d, 0xff, 0x73, 0xb0, 0x5f,
+ 0xd3, 0x3b, 0x2a, 0xc5, 0x46, 0x66, 0x75, 0x21, 0x22, 0x55, 0xee, 0x70,
+ 0x69, 0x11, 0x11, 0x89, 0x57, 0x08, 0x97, 0x04, 0x38, 0xdc, 0x96, 0xaf,
+ 0xd3, 0x0c, 0x0d, 0x39, 0x37, 0xf2, 0x0a, 0x34, 0xe9, 0xbf, 0x7f, 0xdf,
+ 0xa3, 0xbf, 0x90, 0xb0, 0xf1, 0x8a, 0xe5, 0xa2, 0x46, 0xc9, 0xd2, 0xe3,
+ 0xa2, 0x3b, 0xd1, 0x39, 0x27, 0x2b, 0xac, 0xb3, 0x45, 0x03, 0xa4, 0x35,
+ 0x2b, 0xc8, 0x1e, 0x61, 0x9e, 0x68, 0x97, 0x15, 0x49, 0x09, 0x6a, 0xb5,
+ 0x3f, 0xde, 0x0f, 0xd1, 0xc0, 0x9e, 0x54, 0xe0, 0xbd, 0xfb, 0x61, 0x4d,
+ 0x68, 0x22, 0x75, 0xc5, 0x95, 0xa3, 0xe5, 0xbe, 0xd6, 0xd0, 0xf5, 0x4b,
+ 0x8c, 0x63, 0x0e, 0xc7, 0xee, 0x24, 0x85, 0x79, 0xdf, 0xd6, 0x98, 0x6e,
+ 0x62, 0xa3, 0xb7, 0xb3, 0xe2, 0x4d, 0xbf, 0xe3, 0xdb, 0x57, 0x1c, 0xbc,
+ 0xbe, 0x5b, 0x89, 0x07, 0xfc, 0x82, 0x5b, 0xcb, 0x3d, 0x1a, 0xb6, 0x2c,
+ 0xc8, 0x0c, 0xad, 0xa8, 0x79, 0xd8, 0x44, 0xba, 0x79, 0x5a, 0x56, 0x46,
+ 0xb1, 0x7b, 0xc4, 0x0a, 0x95, 0x1b, 0x05, 0x1d, 0x3a, 0xcd, 0x21, 0x3b,
+ 0x98, 0xe5, 0xc8, 0xf1, 0xf7, 0x43, 0x25, 0x91, 0xaf, 0xe3, 0x97, 0x45,
+ 0x85, 0x48, 0x90, 0x88, 0x54, 0x2f, 0x92, 0x40, 0x57, 0xac, 0x4b, 0xd8,
+ 0x4e, 0x45, 0x5a, 0x5b, 0xc3, 0x5b, 0x3c, 0x53, 0xd7, 0xb4, 0xd6, 0x52,
+ 0x7e, 0x2a, 0x0d, 0x37, 0x80, 0xf9, 0xdb, 0x82, 0xfe, 0x90, 0x39, 0x4a,
+ 0x4c, 0x73, 0x8e, 0x3b, 0xee, 0x11, 0xd2, 0x6c, 0x45, 0x48, 0x9f, 0x90,
+ 0xf3, 0x7b, 0xb5, 0x8c, 0x0d, 0x06, 0xeb, 0xd5, 0x6c, 0x62, 0x62, 0x57,
+ 0x20, 0xda, 0xe3, 0x55, 0x1e, 0x49, 0x14, 0xcc, 0x54, 0x30, 0xe2, 0x39,
+ 0xcc, 0x5e, 0x12, 0xea, 0xb4, 0x1c, 0xe6, 0x06, 0xc7, 0x86, 0x82, 0x85,
+ 0x01, 0x46, 0xc9, 0xcc, 0xe8, 0x6b, 0x8b, 0xf4, 0xba, 0xae, 0x96, 0x86,
+ 0x61, 0x15, 0x41, 0x49, 0x97, 0x0b, 0x9d, 0xb9, 0xd7, 0xa2, 0x6d, 0x27,
+ 0x2d, 0x31, 0x0a, 0x4e, 0xa9, 0xbe, 0x39, 0x12, 0x46, 0xda, 0x51, 0x2b,
+ 0xf2, 0x73, 0x33, 0x77, 0x77, 0xd3, 0x8e, 0xfa, 0x37, 0xc3, 0x82, 0xec,
+ 0x0c, 0x96, 0x1f, 0xa7, 0x3c, 0xa4, 0xff, 0xe5, 0x67, 0xc0, 0x61, 0xff,
+ 0x2f, 0x8f, 0x45, 0x83, 0xac, 0xd2, 0xe6, 0xc0, 0xd0, 0x83, 0xa9, 0x43,
+ 0x22, 0x36, 0xc1, 0xaa, 0x5f, 0x32, 0x0f, 0x38, 0x55, 0x3d, 0x05, 0xad,
+ 0x33, 0xcc, 0x6f, 0xf3, 0x2f, 0x26, 0x3e, 0x0d, 0xd9, 0x08, 0x97, 0xad,
+ 0xb6, 0xb5, 0xe2, 0xd5, 0xe7, 0x93, 0xbf, 0x4d, 0xad, 0xf8, 0x8a, 0x88,
+ 0xb4, 0xbf, 0xaa, 0x56, 0x97, 0xcb, 0x99, 0xb0, 0x09, 0xdc, 0x4f, 0x95,
+ 0x51, 0x7e, 0x92, 0xd5, 0x0e, 0xb8, 0x0a, 0xc7, 0xcc, 0x1d, 0xb5, 0x8c,
+ 0xfb, 0x02, 0xee, 0x81, 0x35, 0x3c, 0x57, 0x76, 0xe7, 0x9b, 0xba, 0x4d,
+ 0x01, 0x28, 0xe7, 0x23, 0x82, 0xad, 0xfa, 0x99, 0x52, 0xb8, 0xd3, 0x1b,
+ 0x59, 0x3a, 0x25, 0x5c, 0x03, 0x33, 0x0c, 0x47, 0x0d, 0x8e, 0x42, 0x3d,
+ 0x7e, 0x62, 0x17, 0x76, 0x4f, 0x8e, 0x0f, 0xd2, 0x2b, 0xb8, 0x70, 0x99,
+ 0x11, 0x51, 0x4c, 0x4c, 0x7e, 0x8c, 0x8c, 0x70, 0x73, 0xaa, 0x87, 0xa0,
+ 0x0d, 0x29, 0xb4, 0xb3, 0x5e, 0x7f, 0x03, 0x3c, 0xf8, 0x04, 0x2a, 0xb4,
+ 0x4e, 0x78, 0x6c, 0xfa, 0xab, 0xf8, 0xd7, 0x62, 0xa0, 0x0a, 0x89, 0xfd,
+ 0x8c, 0x6b, 0x82, 0xdb, 0x12, 0xc5, 0xa3, 0x8b, 0x80, 0xb9, 0x76, 0x7c,
+ 0x67, 0x8c, 0x08, 0xfc, 0xc1, 0x8f, 0x0d, 0xf9, 0xef, 0xdc, 0x28, 0x0e,
+ 0x82, 0x1c, 0x4f, 0xbf, 0x30, 0x0f, 0x37, 0xaa, 0xf9, 0x8a, 0x6d, 0xb3,
+ 0x4d, 0xd0, 0x60, 0xec, 0xec, 0xe7, 0x04, 0xee, 0xa3, 0x8e, 0x29, 0xfb,
+ 0xf3, 0x54, 0x98, 0x48, 0x62, 0xa6, 0x6b, 0x73, 0x27, 0xc0, 0xc4, 0xe2,
+ 0x52, 0xc5, 0x8c, 0xbd, 0xa3, 0xd7, 0xa4, 0x99, 0x0f, 0x9b, 0x2f, 0x86,
+ 0xef, 0x64, 0x4d, 0xa7, 0x2f, 0xcf, 0xad, 0x33, 0xfd, 0x62, 0x3a, 0x3a,
+ 0xa0, 0xec, 0x13, 0x2d, 0x1e, 0x9d, 0x0d, 0x3f, 0x24, 0x42, 0x9c, 0x88,
+ 0xd7, 0xb1, 0xf4, 0xf1, 0xd9, 0xa8, 0xa0, 0x4d, 0xb0, 0xa8, 0x12, 0x71,
+ 0x52, 0x06, 0x06, 0xc8, 0x10, 0xa8, 0xc6, 0x9b, 0x98, 0x8e, 0xb4, 0x67,
+ 0xea, 0x32, 0xcb, 0xef, 0x75, 0x55, 0xf2, 0x57, 0xad, 0x97, 0x6b, 0x72,
+ 0x69, 0xb9, 0x20, 0xc2, 0x30, 0xbb, 0x94, 0x9d, 0xf9, 0xf3, 0x08, 0x8b,
+ 0xe5, 0x3f, 0xcb, 0xc4, 0x8d, 0xe0, 0x16, 0xc4, 0xd7, 0x03, 0xf2, 0xea,
+ 0xc8, 0xcb, 0x95, 0xc8, 0x2a, 0x0b, 0x73, 0x67, 0xec, 0xc9, 0x8e, 0xe6,
+ 0x94, 0x44, 0x92, 0x6a, 0x76, 0xf1, 0xa6, 0x79, 0x2f, 0x1d, 0xde, 0x18,
+ 0x4a, 0x3e, 0x83, 0x35, 0x6b, 0xd9, 0xdb, 0x1d, 0x26, 0x0c, 0x72, 0xe1,
+ 0x4e, 0xba, 0xf1, 0xde, 0x19, 0xe6, 0x78, 0x1e, 0xaa, 0x76, 0x5b, 0x2a,
+ 0x58, 0x6b, 0x7d, 0x34, 0x38, 0xb8, 0x2a, 0x78, 0xa0, 0x9f, 0x42, 0xeb,
+ 0x92, 0xa6, 0xaa, 0xa2, 0xc1, 0xe4, 0xfd, 0x90, 0x2f, 0x04, 0x2f, 0x21,
+ 0xce, 0xd1, 0xf9, 0x98, 0x4d, 0xc5, 0x3e, 0x62, 0xd4, 0xc7, 0xf7, 0xd9,
+ 0x7f, 0x5d, 0xfc, 0x24, 0x3d, 0xec, 0x6c, 0xab, 0x74, 0x9c, 0x94, 0x07,
+ 0x5a, 0xb5, 0x20, 0x4b, 0xe7, 0x3e, 0x0a, 0x78, 0x13, 0x94, 0x17, 0x5d,
+ 0x43, 0x23, 0x25, 0x5a, 0x77, 0x73, 0x13, 0xbf, 0xee, 0xfd, 0xa1, 0x2a,
+ 0xe8, 0x2a, 0x38, 0xcf, 0xe8, 0xa6, 0x19, 0x2f, 0x35, 0xa3, 0xdc, 0xed,
+ 0x9d, 0xcb, 0xe3, 0x8b, 0x2c, 0x40, 0xf1, 0x70, 0xda, 0x67, 0x60, 0x8a,
+ 0xd0, 0x8e, 0x05, 0x9c, 0x14, 0x79, 0x80, 0x59, 0x16, 0xa4, 0xbb, 0xb9,
+ 0x62, 0xb4, 0x22, 0xa1, 0xc2, 0x73, 0xf9, 0x1b, 0xe1, 0x96, 0x95, 0xd9,
+ 0x0c, 0xa0, 0xe7, 0x88, 0x59, 0x15, 0xa9, 0xcd, 0x33, 0x44, 0xd7, 0xe1,
+ 0x59, 0xc4, 0x98, 0xe7, 0x0e, 0x75, 0x1b, 0xe9, 0xb6, 0x90, 0xaf, 0x6d,
+ 0xbd, 0x99, 0xc1, 0x2a, 0xb0, 0x00, 0xb0, 0x9e, 0x21, 0x8d, 0x03, 0xa9,
+ 0xb2, 0x33, 0xcf, 0x66, 0xf0, 0x20, 0xab, 0x16, 0xf7, 0x1c, 0xe6, 0x6d,
+ 0x47, 0x97, 0xf4, 0x06, 0x52, 0x5b, 0x4e, 0xca, 0x69, 0xbd, 0xb6, 0xc1,
+ 0xe7, 0xc0, 0x2c, 0x97, 0x7f, 0x22, 0xba, 0x48, 0xea, 0xef, 0xbe, 0xa5,
+ 0x38, 0x71, 0x74, 0x0e, 0x13, 0x44, 0x56, 0x04, 0x91, 0x9b, 0x55, 0x9a,
+ 0xfd, 0xd2, 0x42, 0xc2, 0x03, 0x07, 0xca, 0xd3, 0xf0, 0x0c, 0x04, 0xe1,
+ 0xd7, 0xfa, 0xbc, 0x3e, 0x1e, 0xed, 0x61, 0x2a, 0x7d, 0x21, 0x56, 0xe7,
+ 0x80, 0x27, 0x17, 0x2e, 0x3c, 0x11, 0x03, 0x63, 0x20, 0xc8, 0xb5, 0xb0,
+ 0x3e, 0x59, 0xae, 0xf6, 0xfe, 0x75, 0x59, 0x79, 0x7b, 0xb8, 0x1e, 0x4d,
+ 0xf0, 0x29, 0xbe, 0x84, 0x44, 0xde, 0x20, 0x3c, 0xb2, 0xb6, 0x9f, 0x25,
+ 0x44, 0x37, 0x1e, 0x42, 0x83, 0xe5, 0xd6, 0xdd, 0xbd, 0xbd, 0xdf, 0xf9,
+ 0x22, 0xd1, 0x3d, 0x90, 0x63, 0x66, 0x7a, 0xc7, 0xe7, 0x57, 0x35, 0x8f,
+ 0x2f, 0x99, 0xcb, 0xc3, 0xcb, 0xcc, 0x00, 0xb6, 0x85, 0xa1, 0xe0, 0x21,
+ 0x10, 0xb3, 0x35, 0xbf, 0xae, 0xb8, 0x28, 0xed, 0xc1, 0x1a, 0x59, 0xcf,
+ 0x74, 0x54, 0x6c, 0xcd, 0x9d, 0xc2, 0xb7, 0xb8, 0x94, 0xf2, 0xb1, 0x94,
+ 0xe8, 0x7c, 0xf2, 0x0e, 0x98, 0x16, 0x16, 0x76, 0xf0, 0xf9, 0x41, 0xdb,
+ 0xfe, 0xc8, 0x51, 0x50, 0x63, 0x36, 0xc0, 0x00, 0xf0, 0x78, 0xbd, 0x4b,
+ 0xb0, 0xd4, 0x77, 0xa5, 0x61, 0x91, 0x3a, 0x66, 0xe2, 0x97, 0xae, 0x75,
+ 0x57, 0x44, 0xd5, 0x7b, 0x07, 0x05, 0x35, 0xbd, 0x01, 0xa5, 0x8e, 0xf9,
+ 0x46, 0x66, 0x90, 0x08, 0xd8, 0x8d, 0xd6, 0xbe, 0x2a, 0xac, 0xe4, 0x9c,
+ 0x4c, 0x53, 0xfe, 0x6e, 0x64, 0xec, 0x4a, 0x1b, 0xbf, 0x16, 0x41, 0x07,
+ 0x64, 0x64, 0x49, 0x81, 0x67, 0xc6, 0xc3, 0xdc, 0xd4, 0x12, 0x8d, 0xed,
+ 0xcc, 0xb3, 0x56, 0xa9, 0xa7, 0x89, 0x68, 0xcf, 0x18, 0x6f, 0x78, 0x07,
+ 0x67, 0x1e, 0xd4, 0x50, 0xa8, 0x62, 0x58, 0xde, 0xab, 0xca, 0x1a, 0x71,
+ 0x66, 0x74, 0xba, 0x5b, 0x74, 0xe6, 0xab, 0x59, 0xa1, 0x90, 0x9a, 0x34,
+ 0x07, 0x3a, 0x60, 0x95, 0xd2, 0x52, 0xc6, 0x1c, 0x1c, 0xec, 0xf1, 0x7c,
+ 0x42, 0x10, 0x17, 0xa9, 0x6f, 0x18, 0xe9, 0xda, 0x09, 0x60, 0xf9, 0xcb,
+ 0xe0, 0xb3, 0x4c, 0x9b, 0x3c, 0x8a, 0xf5, 0x9d, 0x8d, 0xb4, 0xf1, 0x7d,
+ 0x5a, 0x24, 0x86, 0x3f, 0x04, 0xc2, 0x2e, 0xb4, 0x11, 0x36, 0xc1, 0x1a,
+ 0x8d, 0x08, 0x71, 0xd6, 0x95, 0x4c, 0xb6, 0x62, 0xec, 0x81, 0x1a, 0x35,
+ 0x28, 0x67, 0x86, 0xe8, 0xf6, 0xc4, 0xf7, 0xd2, 0xe1, 0x2b, 0x94, 0xf6,
+ 0xc6, 0x17, 0xcd, 0x7e, 0xbd, 0x65, 0x96, 0x19, 0x74, 0x1f, 0x32, 0xf6,
+ 0xc0, 0xdb, 0x40, 0x2d, 0xf8, 0xce, 0x89, 0x9d, 0x9b, 0x81, 0xb0, 0xfb,
+ 0xed, 0x8d, 0xac, 0xb4, 0xea, 0xa4, 0xe8, 0x0a, 0xf0, 0xed, 0xbf, 0xe4,
+ 0x60, 0x64, 0x27, 0x77, 0x5b, 0x95, 0xc9, 0xe3, 0x08, 0x3f, 0x89, 0x56,
+ 0xc4, 0xbe, 0x2a, 0x56, 0x14, 0xdc, 0x34, 0xa1, 0xca, 0x0f, 0x2a, 0xbc,
+ 0x95, 0x8d, 0xaf, 0x22, 0x63, 0xa5, 0x40, 0xa9, 0xaa, 0x08, 0x52, 0x88,
+ 0x18, 0x80, 0xe8, 0x70, 0x38, 0xe2, 0x85, 0xcf, 0x8f, 0x78, 0x5a, 0x4e,
+ 0x1c, 0x7f, 0x2a, 0x14, 0xdd, 0xec, 0xf5, 0xc8, 0x3d, 0xe0, 0xe2, 0x3a,
+ 0x0c, 0x92, 0x48, 0x98, 0xdd, 0x5a, 0xea, 0x37, 0xa1, 0x75, 0xd7, 0x5c,
+ 0x3c, 0x84, 0xf1, 0x87, 0x2a, 0xce, 0x48, 0x92, 0x24, 0x68, 0x1a, 0xb6,
+ 0xa1, 0xdd, 0x03, 0xc8, 0xf3, 0xa4, 0x07, 0xb5, 0xd4, 0x5a, 0xbc, 0xe0,
+ 0x04, 0x38, 0x58, 0x10, 0xf3, 0x72, 0x5e, 0x53, 0x7e, 0xb2, 0x0f, 0xb0,
+ 0x49, 0xcf, 0x3b, 0x89, 0x0a, 0x57, 0x14, 0x39, 0xbe, 0xb3, 0x59, 0x09,
+ 0xb5, 0xb1, 0x82, 0x0f, 0xd6, 0x77, 0xe9, 0x9a, 0xa4, 0x37, 0x40, 0x5f,
+ 0x98, 0x37, 0xae, 0x50, 0x81, 0x65, 0x25, 0xd1, 0xcd, 0x6e, 0x06, 0x1b,
+ 0xab, 0xf0, 0x31, 0x37, 0xa1, 0xfd, 0x8e, 0x53, 0xed, 0x3f, 0xf3, 0x5d,
+ 0x99, 0x62, 0xa9, 0x74, 0xee, 0x87, 0x92, 0x0f, 0x0e, 0x22, 0xf1, 0xc8,
+ 0x1c, 0x66, 0x55, 0x7c, 0x88, 0xe4, 0x81, 0xb9, 0xf1, 0xbb, 0x94, 0xc7,
+ 0x93, 0x16, 0x49, 0xe8, 0x3c, 0x4e, 0x48, 0x43, 0x48, 0x11, 0x64, 0x73,
+ 0x76, 0xfa, 0x8d, 0x2b, 0xf1, 0x98, 0x76, 0x27, 0x3e, 0xd2, 0x6b, 0xd5,
+ 0xa0, 0x46, 0x83, 0x70, 0xc4, 0x44, 0xaa, 0x7f, 0x68, 0x06, 0xa0, 0xa3,
+ 0xeb, 0x03, 0x9b, 0x16, 0x2a, 0x44, 0x39, 0x64, 0x4c, 0xc7, 0x75, 0x4e,
+ 0xab, 0x01, 0xf6, 0x92, 0x43, 0xe8, 0x4d, 0x92, 0xcb, 0x1d, 0xfa, 0x72,
+ 0x98, 0xf7, 0xd5, 0xaf, 0x7c, 0x71, 0xbc, 0x2b, 0xc0, 0xf0, 0xe8, 0x45,
+ 0xb8, 0x72, 0xe1, 0x36, 0xfe, 0xed, 0xb9, 0xa7, 0xf3, 0xdf, 0x35, 0x19,
+ 0xa6, 0xdf, 0x8d, 0x10, 0x54, 0x9d, 0xe7, 0xa2, 0x3b, 0xcf, 0x9d, 0x66,
+ 0x47, 0x49, 0xae, 0x8b, 0x1f, 0xe2, 0x6c, 0xa5, 0x6d, 0x29, 0x27, 0x00,
+ 0xb9, 0xb8, 0x69, 0xb4, 0x44, 0x6b, 0x79, 0x15, 0xb7, 0xa9, 0xb7, 0x9e,
+ 0xb5, 0x58, 0x9f, 0xf3, 0x4f, 0xd3, 0x9f, 0xd6, 0x32, 0x21, 0x5e, 0xdf,
+ 0x35, 0xba, 0x9b, 0x4d, 0xe5, 0x01, 0x2d, 0x26, 0xd6, 0xa2, 0x3c, 0xc6,
+ 0x6e, 0x85, 0x1c, 0xbc, 0xbb, 0x55, 0xa1, 0xeb, 0x88, 0x35, 0x0e, 0x5b,
+ 0xe4, 0x8a, 0x5d, 0xb4, 0x19, 0x2e, 0x7c, 0x3f, 0x61, 0xf4, 0x8e, 0xbd,
+ 0xa0, 0xa5, 0x6f, 0x58, 0xb0, 0x7d, 0x56, 0x50, 0xc7, 0xe9, 0x6e, 0xef,
+ 0xc2, 0xff, 0x2a, 0x4d, 0x9d, 0x3e, 0xca, 0xe6, 0xe4, 0x92, 0x6e, 0xbb,
+ 0x67, 0xcf, 0xa3, 0xc2, 0x97, 0xd8, 0xe1, 0x3e, 0x66, 0x25, 0xb0, 0x7d,
+ 0x07, 0xa4, 0x47, 0xf5, 0xfc, 0xbf, 0x1e, 0x0b, 0xe4, 0xc0, 0x49, 0x7f,
+ 0xb7, 0x96, 0x83, 0x75, 0x3d, 0xce, 0xf2, 0x7e, 0x56, 0xad, 0x20, 0x2d,
+ 0x7e, 0xd7, 0xea, 0x5a, 0x0a, 0x75, 0xcc, 0x85, 0xed, 0x3f, 0x4d, 0x8f,
+ 0x39, 0x3e, 0x9b, 0x29, 0x27, 0x8a, 0x72, 0x8a, 0x4b, 0xab, 0x99, 0x6d,
+ 0x7f, 0x29, 0x63, 0x94, 0x2c, 0x5f, 0x40, 0xbf, 0xe0, 0x30, 0x54, 0xc0,
+ 0x0d, 0x3c, 0x37, 0xfd, 0xc3, 0xfe, 0xf2, 0xba, 0x1f, 0xc6, 0x39, 0xd0,
+ 0x57, 0x1a, 0x4a, 0x92, 0xed, 0x36, 0x4b, 0x28, 0x4d, 0x3f, 0x2a, 0x1e,
+ 0xc1, 0x45, 0x19, 0x3e, 0xdb, 0x30, 0xf3, 0xc7, 0xd0, 0xa9, 0x52, 0x27,
+ 0xdf, 0x00, 0x1f, 0x43, 0xbd, 0x56, 0x30, 0x68, 0x9c, 0x37, 0xc6, 0x42,
+ 0x76, 0x7e, 0x11, 0x2b, 0x45, 0x01, 0xa9, 0xb8, 0x16, 0x4b, 0x25, 0x89,
+ 0x9b, 0x78, 0xdf, 0x21, 0x38, 0xe5, 0x6b, 0x9f, 0xe1, 0x6a, 0xa1, 0x7c,
+ 0xc6, 0xa5, 0xdd, 0xe2, 0x78, 0x11, 0x81, 0xbc, 0x13, 0x58, 0xbf, 0x32,
+ 0x21, 0x06, 0xa1, 0x8e, 0x3a, 0xcf, 0xc2, 0x0a, 0xde, 0x60, 0x40, 0x43,
+ 0xb4, 0xd0, 0x05, 0x1c, 0x09, 0x97, 0xe4, 0x23, 0x94, 0xe2, 0x88, 0xd9,
+ 0x03, 0x2a, 0x8a, 0x28, 0x5e, 0xb6, 0x09, 0xb2, 0x23, 0x97, 0xcc, 0x47,
+ 0x9c, 0xfc, 0xa0, 0x9c, 0xd6, 0x35, 0x07, 0x0f, 0x33, 0x1a, 0x4c, 0x0e,
+ 0x27, 0xf6, 0x20, 0x28, 0x97, 0xea, 0xa6, 0x0d, 0x94, 0x93, 0x4b, 0x9e,
+ 0x67, 0x1a, 0x01, 0x71, 0x0e, 0x75, 0x75, 0x6b, 0x2c, 0x4a, 0x92, 0x37,
+ 0xc2, 0x77, 0x30, 0x98, 0x07, 0x62, 0x3e, 0x8a, 0x47, 0x94, 0x0a, 0xd9,
+ 0x8c, 0x61, 0xcb, 0x08, 0x48, 0xd8, 0x07, 0x1a, 0x95, 0xc4, 0x24, 0x25,
+ 0xa9, 0x84, 0x39, 0x14, 0x83, 0x17, 0xbf, 0x01, 0x26, 0x79, 0x22, 0x34,
+ 0x2d, 0x18, 0xa9, 0xae, 0x91, 0x5f, 0x8c, 0xc5, 0x02, 0xa4, 0x39, 0x68,
+ 0xf2, 0xba, 0x80, 0xab, 0x59, 0x58, 0xa3, 0xa6, 0x05, 0x27, 0x79, 0x04,
+ 0xf4, 0x15, 0xbd, 0x5d, 0xb5, 0xb8, 0x08, 0xa6, 0xeb, 0x2c, 0x4e, 0x31,
+ 0x09, 0xfe, 0x5b, 0xb2, 0x70, 0x5d, 0xb1, 0xde, 0x84, 0x9e, 0x44, 0x15,
+ 0x94, 0xca, 0x87, 0x8d, 0xb4, 0xb5, 0x6c, 0xc8, 0x63, 0x7e, 0x96, 0xf0,
+ 0x4c, 0x40, 0x9c, 0xb1, 0xfd, 0x17, 0x47, 0x63, 0x9e, 0x41, 0x74, 0x40,
+ 0x1e, 0xa7, 0xa7, 0x57, 0x76, 0xf5, 0xcb, 0x6e, 0xf4, 0x95, 0x35, 0xb0,
+ 0xf6, 0xc9, 0x37, 0x3c, 0xc0, 0xc4, 0x28, 0x4d, 0xf2, 0x61, 0x28, 0xf6,
+ 0xf8, 0xff, 0x9d, 0xee, 0x16, 0x0a, 0xc1, 0x6a, 0x0c, 0xd2, 0x90, 0xc3,
+ 0xdd, 0xb9, 0xe6, 0x69, 0x22, 0x4a, 0xdf, 0xcf, 0x58, 0x66, 0xd2, 0xab,
+ 0x05, 0x9a, 0x59, 0x61, 0x42, 0xc9, 0xcd, 0xe3, 0x91, 0x0a, 0xd7, 0x0d,
+ 0xe4, 0xb1, 0x33, 0x22, 0x44, 0x0f, 0xd6, 0x0b, 0xba, 0x39, 0x7d, 0x42,
+ 0x44, 0xb8, 0xf7, 0x48, 0xdb, 0xf2, 0x84, 0x28, 0xce, 0x56, 0x24, 0x91,
+ 0xfc, 0xf0, 0xaa, 0x04, 0x52, 0x08, 0x49, 0xb9, 0x5e, 0xd1, 0x68, 0x76,
+ 0x0c, 0x97, 0x52, 0x0e, 0x3d, 0x09, 0xbd, 0xd5, 0x91, 0x57, 0xfa, 0x53,
+ 0xce, 0x26, 0x1d, 0x6a, 0xeb, 0x39, 0x28, 0xd5, 0x24, 0xc9, 0x2a, 0x33,
+ 0xb6, 0x3c, 0x95, 0x03, 0x08, 0x30, 0xfc, 0xea, 0x87, 0xa4, 0xe1, 0x0e,
+ 0x31, 0x38, 0x7c, 0xf7, 0xe0, 0x8b, 0x8d, 0x09, 0x4e, 0x89, 0x16, 0x02,
+ 0x23, 0x44, 0xc0, 0xbf, 0xd0, 0x51, 0xca, 0x77, 0x8e, 0x45, 0x75, 0xe8,
+ 0x6b, 0xa9, 0x30, 0x1e, 0xc7, 0xaa, 0x2d, 0xdf, 0xad, 0x81, 0x0c, 0xac,
+ 0x1f, 0x8a, 0x5a, 0xd9, 0x80, 0xcd, 0x1d, 0x04, 0x57, 0x02, 0x79, 0xc1,
+ 0xbf, 0x65, 0xe3, 0x89, 0xa5, 0x35, 0x51, 0x9a, 0xe2, 0x09, 0xdf, 0xa7,
+ 0x62, 0xc7, 0xdc, 0x42, 0xcb, 0x27, 0x5c, 0x48, 0xda, 0x39, 0x81, 0x1b,
+ 0x43, 0x4f, 0x35, 0x71, 0x09, 0x9d, 0x0a, 0x71, 0x66, 0x16, 0x6f, 0x2c,
+ 0x53, 0x14, 0x43, 0x0b, 0x86, 0x2b, 0xe6, 0xa1, 0x4d, 0x5a, 0x6e, 0x4b,
+ 0xb3, 0x6b, 0x5e, 0x1c, 0x16, 0xb1, 0x3f, 0x4b, 0x54, 0x71, 0x6f, 0x37,
+ 0x56, 0x61, 0x62, 0xcc, 0xaa, 0x22, 0x98, 0x76, 0x7f, 0xd8, 0xa5, 0xac,
+ 0x12, 0x53, 0x01, 0xc4, 0x40, 0x8f, 0x95, 0x69, 0x3a, 0x1a, 0xb7, 0x41,
+ 0x53, 0x55, 0xa2, 0x9e, 0x9d, 0x26, 0x00, 0x58, 0x1e, 0x4b, 0x24, 0xc6,
+ 0x68, 0xd2, 0x17, 0x07, 0xd6, 0x9c, 0x12, 0x60, 0x18, 0x28, 0xa3, 0x1c,
+ 0xc8, 0x00, 0x97, 0xe6, 0xfb, 0x4f, 0x2e, 0x64, 0x32, 0x76, 0x45, 0x90,
+ 0xfa, 0xfb, 0x2d, 0x38, 0x68, 0x02, 0x20, 0xf5, 0x02, 0x1f, 0x46, 0xcf,
+ 0x4c, 0x82, 0x70, 0x02, 0xce, 0x87, 0x5f, 0xdd, 0x2a, 0xab, 0x1c, 0xe8,
+ 0x4c, 0x97, 0x59, 0x7b, 0x0a, 0x7a, 0x18, 0x52, 0x15, 0x7c, 0xf9, 0x66,
+ 0x33, 0x1c, 0xc7, 0xdf, 0xfc, 0xb8, 0x57, 0xf1, 0x4e, 0x30, 0x78, 0xfe,
+ 0x81, 0x38, 0x7f, 0x96, 0xf8, 0x48, 0xb2, 0x7a, 0xfc, 0x8b, 0xa0, 0xc8,
+ 0xdf, 0xb7, 0xd7, 0x5e, 0x13, 0x0f, 0x77, 0xe8, 0xbe, 0xa0, 0x2b, 0xd0,
+ 0xf6, 0x29, 0x53, 0x4d, 0x7a, 0xc8, 0xfc, 0x3f, 0x34, 0x6e, 0xab, 0x53,
+ 0x99, 0x39, 0xb9, 0xa7, 0x88, 0x5a, 0x57, 0x13, 0xb1, 0x7d, 0xf5, 0xf8,
+ 0x6a, 0x69, 0x6e, 0x39, 0xc1, 0xfe, 0xa0, 0xe4, 0xf3, 0xe2, 0x2f, 0xe3,
+ 0x58, 0x3f, 0xfa, 0x3c, 0x3b, 0x9d, 0x18, 0xad, 0x46, 0x55, 0xcc, 0x0a,
+ 0x64, 0x99, 0x15, 0x28, 0xe9, 0xb5, 0xee, 0xbf, 0x2d, 0x7f, 0x23, 0x2d,
+ 0x0a, 0xa6, 0x93, 0x72, 0x9b, 0x81, 0x53, 0x3c, 0x6f, 0x0a, 0xa6, 0x24,
+ 0x59, 0x6b, 0x21, 0x24, 0x65, 0xe5, 0xdc, 0x1b, 0x7e, 0x31, 0x4a, 0x09,
+ 0x3e, 0x33, 0xe7, 0x41, 0xd5, 0x63, 0x02, 0xd7, 0x8a, 0x5f, 0x6a, 0x96,
+ 0x79, 0xf7, 0x3b, 0x37, 0x31, 0xbd, 0xac, 0xf3, 0xaa, 0x27, 0x26, 0xdc,
+ 0x54, 0xce, 0x1c, 0xe4, 0x8d, 0x28, 0x59, 0xe5, 0xfb, 0x70, 0x7a, 0xdf,
+ 0x32, 0x32, 0xd9, 0x4a, 0xad, 0xcb, 0xf9, 0x2c, 0x2b, 0xfa, 0x28, 0x75,
+ 0x24, 0xc8, 0xc4, 0xe4, 0x4a, 0x50, 0x5b, 0x00, 0x60, 0xed, 0xa5, 0xcb,
+ 0x83, 0x68, 0x17, 0xdb, 0x2b, 0x9a, 0xa3, 0xae, 0xb4, 0x29, 0xd5, 0x89,
+ 0x41, 0xe8, 0x73, 0x06, 0xef, 0x84, 0x26, 0x83, 0x09, 0x54, 0xc7, 0xdf,
+ 0xed, 0x10, 0x56, 0x5e, 0x40, 0x4c, 0xdf, 0x6b, 0xc3, 0x78, 0x1b, 0x8a,
+ 0xe8, 0xee, 0xce, 0x55, 0x8e, 0x55, 0x4e, 0x53, 0xa3, 0xa6, 0x7b, 0xc2,
+ 0x45, 0x43, 0x65, 0xcf, 0xf0, 0xdb, 0xe4, 0x9e, 0xe2, 0x0d, 0xc8, 0x59,
+ 0xb7, 0xae, 0x8c, 0xf9, 0x36, 0xd7, 0x54, 0x28, 0xbe, 0xae, 0x1a, 0x5f,
+ 0x9a, 0x06, 0x6c, 0xc1, 0x83, 0xec, 0xac, 0x62, 0x77, 0xfe, 0xce, 0x54,
+ 0x68, 0xb0, 0x92, 0xcf, 0xe0, 0xbd, 0x91, 0xbf, 0x99, 0x09, 0x33, 0xe3,
+ 0x8f, 0xa8, 0xfe, 0xd5, 0x96, 0xaa, 0x08, 0x54, 0x53, 0x84, 0xb3, 0x2b,
+ 0xc9, 0x31, 0x2d, 0x56, 0x61, 0x6c, 0xc7, 0x59, 0xa9, 0xc1, 0x41, 0x74,
+ 0x02, 0xa8, 0x4f, 0x60, 0x13, 0x87, 0x06, 0xe7, 0x79, 0xe7, 0xbe, 0x8f,
+ 0x4b, 0x89, 0x78, 0x11, 0xc0, 0x61, 0x0e, 0x1b, 0x60, 0x11, 0xc7, 0x01,
+ 0x20, 0x70, 0x9f, 0x85, 0x4c, 0xf2, 0x6b, 0x7f, 0x52, 0x0e, 0xa8, 0x3c,
+ 0xcd, 0xf7, 0x91, 0x00, 0x37, 0xc0, 0xb4, 0x43, 0x52, 0x37, 0xe3, 0x15,
+ 0x23, 0x71, 0x6c, 0x5e, 0x0d, 0x27, 0xa9, 0x7c, 0x5a, 0x44, 0xa6, 0x2e,
+ 0xc2, 0x4c, 0x88, 0xa0, 0x27, 0x93, 0x70, 0x53, 0xbf, 0x6e, 0x88, 0x29,
+ 0x33, 0x1c, 0x4d, 0x59, 0x54, 0x90, 0x8d, 0x31, 0x68, 0xe7, 0x61, 0xd6,
+ 0x37, 0xa4, 0x24, 0x32, 0x05, 0x36, 0xa4, 0xfa, 0x99, 0x97, 0x71, 0xf9,
+ 0xa1, 0xd8, 0xbe, 0xae, 0x65, 0x1a, 0x0e, 0x0c, 0xec, 0x43, 0x37, 0x48,
+ 0xd4, 0xa1, 0x44, 0x2a, 0x7e, 0xe4, 0x9d, 0x63, 0x09, 0xc7, 0x8b, 0x4b,
+ 0xf9, 0x20, 0x6c, 0x8b, 0x13, 0xa3, 0xe5, 0x04, 0x32, 0x09, 0x89, 0xf2,
+ 0x25, 0x89, 0x96, 0x34, 0x97, 0x80, 0xff, 0xa8, 0xc6, 0x97, 0x70, 0x7e,
+ 0x78, 0x83, 0xd7, 0x9f, 0xb4, 0xb6, 0xad, 0xbb, 0x08, 0x9c, 0xf8, 0x62,
+ 0xcf, 0xf0, 0x7e, 0x4a, 0xc9, 0xbf, 0x97, 0xf7, 0x6a, 0xe5, 0x47, 0x9d,
+ 0x16, 0xbc, 0x9a, 0xeb, 0x57, 0x40, 0xbd, 0x11, 0x77, 0xed, 0xfe, 0x83,
+ 0xef, 0xc1, 0x0b, 0x97, 0x36, 0x31, 0x2a, 0x71, 0xa6, 0x21, 0xa6, 0x9c,
+ 0xde, 0x5c, 0xe5, 0x9c, 0xb8, 0xdf, 0x51, 0x3e, 0xca, 0xcf, 0x46, 0x4f,
+ 0x0b, 0xde, 0xb0, 0xfc, 0x13, 0xb6, 0x8b, 0xe7, 0x46, 0xef, 0x5a, 0x44,
+ 0x34, 0x95, 0x0f, 0x7f, 0x75, 0x2e, 0xf7, 0x15, 0x08, 0x20, 0x45, 0x06,
+ 0xdd, 0xdb, 0x38, 0x03, 0x77, 0x36, 0x00, 0x2d, 0xf5, 0x0e, 0x43, 0xdc,
+ 0x7b, 0x05, 0xf8, 0xc1, 0xd2, 0x1f, 0xb8, 0x9b, 0x45, 0xc1, 0xbf, 0x08,
+ 0x71, 0xe9, 0xfd, 0xf7, 0xf3, 0x25, 0x5f, 0xaa, 0x73, 0x11, 0xd7, 0xe2,
+ 0x1c, 0x89, 0xe4, 0xae, 0xde, 0x60, 0x79, 0x16, 0x1e, 0x0f, 0x46, 0xd2,
+ 0x13, 0xe6, 0x49, 0xef, 0xa1, 0x4e, 0x27, 0x83, 0xed, 0x96, 0x85, 0x03,
+ 0xcb, 0x7c, 0x3c, 0xb7, 0x69, 0xa3, 0xf5, 0x6e, 0x65, 0xe1, 0x05, 0x90,
+ 0xcf, 0x04, 0x0d, 0x21, 0x4b, 0xf5, 0x86, 0x73, 0x1b, 0x52, 0x1b, 0xee,
+ 0xba, 0x73, 0xca, 0x58, 0x75, 0x4f, 0x98, 0x06, 0x5c, 0xa6, 0x97, 0x9f,
+ 0x2a, 0x78, 0xde, 0x61, 0x52, 0x9c, 0x13, 0x9c, 0x0d, 0x85, 0xf4, 0x97,
+ 0x96, 0xf1, 0x92, 0x12, 0x55, 0x01, 0xf7, 0x8c, 0x69, 0xa8, 0x32, 0xa4,
+ 0x67, 0x1c, 0x65, 0xd5, 0x88, 0x98, 0xe3, 0xe8, 0x29, 0x98, 0x2b, 0x0f,
+ 0x9b, 0x9f, 0x1a, 0x15, 0x6a, 0x13, 0xee, 0xd4, 0xac, 0x77, 0x76, 0x20,
+ 0xc1, 0x72, 0x51, 0xdd, 0xb7, 0xea, 0x73, 0xdf, 0xc5, 0x73, 0x8b, 0x98,
+ 0xc5, 0x7a, 0xe9, 0x8d, 0x90, 0xfb, 0x0c, 0xf2, 0x60, 0x3e, 0x97, 0xb2,
+ 0x2e, 0x30, 0xb6, 0x9a, 0xa9, 0x0d, 0x04, 0xc8, 0x95, 0xfc, 0x0c, 0x7a,
+ 0xb6, 0xcf, 0x2b, 0x7a, 0x63, 0x58, 0x22, 0x87, 0xbf, 0xee, 0x7e, 0x0e,
+ 0xaf, 0x15, 0xf1, 0x72, 0xc6, 0x5e, 0x9a, 0x05, 0xac, 0xe2, 0x06, 0xb7,
+ 0x48, 0x22, 0x72, 0x79, 0x7f, 0x26, 0xe9, 0x69, 0x6f, 0xbd, 0x39, 0x98,
+ 0x03, 0x69, 0x61, 0x5e, 0x19, 0x4e, 0x57, 0x2e, 0x6e, 0x93, 0x2a, 0xc6,
+ 0x39, 0xdd, 0xe0, 0xfa, 0x68, 0x24, 0xe6, 0x1d, 0x8f, 0x92, 0xd0, 0x0e,
+ 0x08, 0x35, 0x2e, 0x06, 0x32, 0xfa, 0xb9, 0xe7, 0xa3, 0x33, 0x1d, 0xb7,
+ 0x4a, 0xf0, 0x96, 0x6a, 0x70, 0x31, 0x00, 0xa5, 0x93, 0x6e, 0xb4, 0xa6,
+ 0x40, 0xea, 0xaa, 0x2e, 0x7a, 0x2d, 0x68, 0x4b, 0x94, 0x61, 0xc8, 0xcf,
+ 0x14, 0xf1, 0x02, 0xda, 0x08, 0xd9, 0x68, 0x4b, 0x7a, 0xca, 0x84, 0xfe,
+ 0x13, 0x26, 0x60, 0xb9, 0x07, 0xe6, 0xa7, 0xaf, 0xca, 0xe1, 0x1a, 0x5e,
+ 0x07, 0x44, 0xed, 0x3c, 0x55, 0x59, 0xf0, 0x52, 0x0b, 0x6b, 0x3e, 0x61,
+ 0xf4, 0x38, 0xc2, 0x61, 0x4e, 0x90, 0x52, 0xd0, 0xfd, 0xc3, 0x3f, 0xf8,
+ 0xbc, 0xf9, 0x36, 0xd0, 0x3f, 0xb1, 0x0e, 0x69, 0x09, 0x8e, 0x4d, 0x87,
+ 0x6e, 0x51, 0x2c, 0x7a, 0x5e, 0xa7, 0x03, 0x3c, 0xd5, 0xbf, 0xa8, 0x01,
+ 0x03, 0xee, 0x9e, 0xcc, 0xd6, 0xcd, 0xd3, 0x72, 0xe0, 0x20, 0x29, 0x3c,
+ 0x0d, 0x67, 0xd8, 0xb7, 0x23, 0xa5, 0xc6, 0xba, 0x00, 0xd9, 0xf1, 0xdf,
+ 0xda, 0x2e, 0x0d, 0x4b, 0xf4, 0xe3, 0xff, 0xd2, 0xe9, 0xb8, 0x97, 0x22,
+ 0xf4, 0x32, 0x83, 0x16, 0xec, 0x13, 0x36, 0xf3, 0x7c, 0xb3, 0x7d, 0x0e,
+ 0xa2, 0x93, 0xfe, 0x08, 0x10, 0x2b, 0x2f, 0xb8, 0x89, 0x31, 0xeb, 0xaa,
+ 0x74, 0x04, 0xa7, 0x6e, 0x45, 0x51, 0xa7, 0x5f, 0xfd, 0x59, 0x3a, 0x59,
+ 0x6e, 0x5b, 0xf4, 0xf3, 0xd9, 0x6c, 0xc7, 0xd6, 0xe8, 0xc2, 0xeb, 0xba,
+ 0xcb, 0x9d, 0x38, 0xa3, 0x1e, 0x2f, 0x4e, 0xa6, 0x32, 0x51, 0xbe, 0x1f,
+ 0xba, 0xdd, 0xa6, 0x84, 0xb1, 0x7b, 0xda, 0x58, 0x75, 0xd0, 0xec, 0x9c,
+ 0xd7, 0x35, 0xbe, 0x5d, 0x2b, 0x31, 0xaf, 0xbb, 0xdb, 0xce, 0xd2, 0x61,
+ 0x51, 0xcd, 0x4c, 0x8c, 0x3e, 0x62, 0x29, 0x05, 0xbd, 0x41, 0x8c, 0x5b,
+ 0x95, 0x37, 0xe4, 0x2e, 0xb8, 0xc0, 0x11, 0xd1, 0xd3, 0x9f, 0x48, 0x85,
+ 0x4b, 0xff, 0x48, 0xca, 0x5e, 0xf0, 0x6f, 0xf9, 0x3a, 0xb0, 0x92, 0xf8,
+ 0xc6, 0x9b, 0xdc, 0xb8, 0x87, 0xd4, 0xaa, 0x81, 0x1d, 0x1c, 0xa8, 0x1f,
+ 0xba, 0xcb, 0x56, 0xe3, 0xa4, 0x90, 0x4b, 0xd2, 0x64, 0x5f, 0x17, 0x4e,
+ 0xcb, 0x30, 0xf3, 0x95, 0xee, 0xec, 0xd0, 0x6f, 0xc6, 0xee, 0x7c, 0x30,
+ 0x9a, 0x24, 0x61, 0x84, 0x2d, 0x90, 0x90, 0x0e, 0xa3, 0xe9, 0x79, 0xdc,
+ 0x45, 0x86, 0x17, 0x7d, 0x3e, 0x84, 0x30, 0x7a, 0xfd, 0xb4, 0x56, 0xd3,
+ 0xc0, 0x15, 0xda, 0x2f, 0x7f, 0x88, 0xcb, 0x1a, 0x44, 0xff, 0x71, 0x95,
+ 0x05, 0xec, 0xee, 0xe2, 0x48, 0x8a, 0x81, 0xb4, 0x54, 0xa9, 0x1b, 0x9d,
+ 0x2d, 0x83, 0xb0, 0x97, 0x84, 0xd6, 0x19, 0xe1, 0xf4, 0xd8, 0xdb, 0x8e,
+ 0x37, 0xb3, 0xec, 0x5b, 0x46, 0xa6, 0x0d, 0x17, 0xa7, 0x9e, 0xfd, 0xeb,
+ 0xec, 0xeb, 0xaf, 0x40, 0x66, 0x52, 0x7d, 0x37, 0x59, 0x79, 0x7e, 0xc7,
+ 0x0e, 0xd5, 0xc9, 0x00, 0x53, 0x60, 0x31, 0x89, 0xb7, 0x1d, 0x69, 0xc4,
+ 0xf0, 0x89, 0x10, 0x7a, 0xed, 0x59, 0xff, 0xea, 0xd3, 0x3b, 0x2f, 0x31,
+ 0x68, 0xca, 0x77, 0x3a, 0x22, 0x8b, 0xf9, 0x08, 0xe1, 0xe0, 0x3a, 0x37,
+ 0x32, 0xd7, 0xff, 0xf7, 0x58, 0x68, 0x1c, 0xf7, 0xff, 0xac, 0x02, 0x49,
+ 0x3a, 0x3f, 0x3f, 0x0a, 0xb2, 0xc0, 0xef, 0xf8, 0x36, 0xf5, 0x94, 0x8b,
+ 0xf7, 0xe3, 0x1f, 0xb0, 0xd2, 0xa2, 0xc4, 0xd1, 0x14, 0x45, 0xda, 0x19,
+ 0x9f, 0x31, 0xdf, 0x70, 0x1c, 0x99, 0x9c, 0x0d, 0x91, 0xc9, 0xba, 0x32,
+ 0x8d, 0xef, 0x6b, 0xa3, 0xf9, 0x4b, 0xc6, 0xae, 0x68, 0x74, 0x5d, 0x94,
+ 0x9f, 0xf6, 0x1b, 0x8b, 0xfb, 0xd1, 0x48, 0x28, 0x5d, 0x19, 0x3c, 0xa3,
+ 0xaa, 0x31, 0x05, 0x6a, 0xb9, 0x6c, 0xf2, 0x8a, 0x02, 0x4e, 0xb0, 0xbf,
+ 0xae, 0x98, 0x2e, 0xeb, 0xeb, 0x0d, 0x87, 0xee, 0x1f, 0x54, 0x54, 0xbb,
+ 0xa8, 0x17, 0xe4, 0x7f, 0x46, 0x74, 0x0f, 0x56, 0x20, 0xcb, 0xcf, 0xa4,
+ 0xdc, 0xaa, 0xc4, 0xeb, 0x81, 0x83, 0x12, 0x28, 0x1c, 0x47, 0x5b, 0xd5,
+ 0x62, 0xe2, 0x49, 0x0a, 0x35, 0x09, 0xcf, 0x29, 0xe7, 0x80, 0xaa, 0x89,
+ 0xe8, 0xc1, 0x2f, 0x36, 0x6d, 0xef, 0xa1, 0xe4, 0xb4, 0x19, 0x4a, 0x7d,
+ 0x6f, 0x29, 0x03, 0xb5, 0x15, 0x33, 0x9a, 0x84, 0xdc, 0x22, 0x71, 0x04,
+ 0x02, 0xdc, 0x0a, 0x73, 0x20, 0x4c, 0xd3, 0x2c, 0x31, 0x0e, 0xa2, 0xf2,
+ 0x89, 0xe6, 0x99, 0x0c, 0x5c, 0x04, 0x77, 0xed, 0x53, 0x24, 0xcb, 0xb6,
+ 0xb5, 0x5c, 0x87, 0x49, 0xab, 0x74, 0x8f, 0xe8, 0xa4, 0xfa, 0x2f, 0x8e,
+ 0x82, 0x01, 0xbc, 0xf8, 0x1f, 0x79, 0x50, 0x12, 0xea, 0x25, 0x40, 0xa6,
+ 0x30, 0x8c, 0x0b, 0x00, 0xd9, 0x20, 0x52, 0xbe, 0xda, 0xb7, 0xf2, 0x39,
+ 0xb6, 0x70, 0xae, 0xe9, 0xf1, 0x3c, 0x0d, 0xe2, 0xda, 0x1d, 0xa2, 0xeb,
+ 0xc3, 0x68, 0xd7, 0x90, 0xc5, 0x54, 0xb7, 0xb7, 0x3e, 0x9f, 0x5c, 0x88,
+ 0x94, 0x4b, 0x29, 0x27, 0xfc, 0xa5, 0x2e, 0x1b, 0x14, 0x0a, 0x02, 0x63,
+ 0xc3, 0x15, 0x8c, 0xbe, 0xc2, 0x8b, 0xc0, 0x74, 0x3b, 0xd0, 0xef, 0x6c,
+ 0x01, 0x35, 0x51, 0x57, 0x98, 0x97, 0x48, 0xc7, 0xdd, 0xe7, 0xce, 0x25,
+ 0x2e, 0xfe, 0xe3, 0x68, 0xfb, 0xf1, 0x15, 0xbf, 0xbb, 0xd3, 0xcf, 0x16,
+ 0xaa, 0x69, 0x3f, 0xa4, 0x09, 0xfd, 0xb6, 0xe6, 0xf2, 0xaf, 0xa7, 0xeb,
+ 0x17, 0x19, 0xdb, 0x6b, 0x79, 0x70, 0x73, 0x8b, 0xb3, 0x02, 0x81, 0x9d,
+ 0xb2, 0xc0, 0xf2, 0xc2, 0x35, 0x56, 0xa5, 0x98, 0x4a, 0x3f, 0x31, 0xb7,
+ 0x68, 0x13, 0xa5, 0x85, 0x3c, 0xe9, 0xe6, 0x98, 0x06, 0x81, 0xf1, 0x7b,
+ 0x4f, 0x29, 0xf6, 0x24, 0xa2, 0xc9, 0x96, 0x45, 0xc7, 0x15, 0x40, 0xbf,
+ 0x32, 0x22, 0x6c, 0x2c, 0x70, 0x6a, 0x6d, 0xbb, 0x15, 0x3a, 0x50, 0x12,
+ 0xa4, 0x62, 0x33, 0x36, 0x89, 0x78, 0x7b, 0x57, 0xfc, 0xf6, 0x2b, 0x60,
+ 0x6d, 0x86, 0x9f, 0x86, 0x87, 0x5b, 0xe4, 0x03, 0xdb, 0x24, 0x74, 0x2d,
+ 0x61, 0xe0, 0xfd, 0xb4, 0x16, 0x46, 0x34, 0xf2, 0xee, 0x96, 0x7a, 0xff,
+ 0x95, 0x5b, 0x21, 0x5f, 0x32, 0x74, 0x6d, 0xc3, 0x55, 0x0b, 0xe9, 0xf8,
+ 0x15, 0x21, 0x97, 0x14, 0xf5, 0x45, 0x5d, 0x2f, 0xb2, 0xbc, 0xa8, 0x45,
+ 0x14, 0x65, 0x78, 0x1e, 0xad, 0x5d, 0x55, 0x97, 0x32, 0xa1, 0x83, 0xbf,
+ 0xcc, 0x9b, 0x76, 0xd0, 0xa8, 0x4d, 0x97, 0x91, 0xe0, 0x5c, 0x34, 0x72,
+ 0xc9, 0x54, 0x04, 0x96, 0xbf, 0xf2, 0x0f, 0x55, 0x72, 0x1e, 0x31, 0xdf,
+ 0xa0, 0x97, 0x19, 0x97, 0x08, 0xef, 0x7a, 0x6b, 0xa0, 0x65, 0x2c, 0xdc,
+ 0xcc, 0x45, 0x69, 0x5d, 0x4b, 0x2e, 0xb0, 0x64, 0x45, 0x1c, 0x57, 0xec,
+ 0xbb, 0xb4, 0x30, 0x6d, 0xf6, 0x98, 0x4e, 0xad, 0x26, 0x90, 0x1b, 0xb8,
+ 0x06, 0x1a, 0x36, 0x33, 0x1b, 0xc4, 0x20, 0x5c, 0x67, 0xb8, 0x36, 0xed,
+ 0x52, 0xca, 0x04, 0x19, 0xbe, 0x46, 0xdc, 0x34, 0x7a, 0x30, 0x30, 0x71,
+ 0x98, 0xf5, 0x50, 0xb2, 0x46, 0xc9, 0x85, 0x89, 0x74, 0xf7, 0xb1, 0x6f,
+ 0x7d, 0xc7, 0xee, 0x6d, 0x07, 0xf0, 0x87, 0x29, 0xc2, 0x3c, 0x06, 0x1f,
+ 0x4b, 0xc2, 0x38, 0xbc, 0x5a, 0x31, 0x7a, 0x1b, 0x22, 0x23, 0x56, 0x8e,
+ 0x38, 0x75, 0x88, 0x8e, 0x9b, 0x47, 0xe7, 0x7d, 0xd9, 0xee, 0x84, 0xec,
+ 0xf7, 0x31, 0x05, 0x68, 0xce, 0x3c, 0x53, 0x73, 0xaa, 0xc5, 0xfc, 0xfe,
+ 0x1d, 0x18, 0xef, 0x66, 0xe1, 0x87, 0x05, 0xf9, 0xbb, 0xd5, 0x02, 0x32,
+ 0x46, 0xfc, 0x49, 0xaf, 0xd5, 0xa3, 0x13, 0x48, 0xbc, 0x0d, 0x05, 0xce,
+ 0xd3, 0xb3, 0xed, 0xff, 0x04, 0xd1, 0xa0, 0xda, 0xf0, 0x8d, 0xcf, 0xb0,
+ 0x9f, 0xd3, 0x57, 0x6e, 0x8a, 0x9a, 0x48, 0x6c, 0x1c, 0x99, 0x3c, 0xf0,
+ 0xcf, 0x24, 0x93, 0x45, 0xcc, 0x56, 0x6e, 0x6b, 0x71, 0x73, 0x33, 0x37,
+ 0x19, 0x36, 0x93, 0xef, 0xea, 0x99, 0x64, 0x6a, 0x39, 0x9a, 0x8f, 0xdb,
+ 0xe6, 0xb8, 0x93, 0x2b, 0xdf, 0xdd, 0x96, 0x98, 0x39, 0x5c, 0x46, 0x3d,
+ 0x1c, 0x53, 0x93, 0xf4, 0x9f, 0x59, 0x36, 0x20, 0xad, 0x9f, 0x5e, 0x40,
+ 0x74, 0x98, 0x46, 0x6d, 0x17, 0x35, 0xf6, 0x6a, 0x91, 0x71, 0x55, 0xfd,
+ 0xac, 0x79, 0xce, 0x31, 0x95, 0x72, 0xa5, 0xb4, 0xf6, 0xd0, 0xa2, 0x44,
+ 0x38, 0xf0, 0x6a, 0xba, 0xfc, 0xcd, 0xef, 0x5d, 0x5e, 0xf0, 0x8e, 0xfa,
+ 0xfc, 0x4a, 0x23, 0x83, 0x3a, 0x49, 0x4a, 0xd4, 0x12, 0xce, 0x4e, 0x19,
+ 0xe9, 0x2e, 0x59, 0x31, 0xce, 0x00, 0x03, 0xe1, 0x93, 0xc9, 0x9e, 0x42,
+ 0x94, 0x21, 0x23, 0xb0, 0x2f, 0x76, 0x9b, 0x64, 0xb1, 0x6d, 0xd3, 0x44,
+ 0x64, 0x0f, 0x0f, 0xf6, 0xde, 0x08, 0xb2, 0xb1, 0xf8, 0xa4, 0x54, 0xdc,
+ 0x7f, 0xf3, 0xd2, 0xc0, 0x61, 0x5c, 0x62, 0x60, 0x82, 0xca, 0x14, 0x31,
+ 0x4a, 0x05, 0xa0, 0xb5, 0xc4, 0xb0, 0xef, 0xe6, 0x75, 0xd7, 0x68, 0x5b,
+ 0xe8, 0x79, 0x5f, 0xa9, 0xe6, 0xfa, 0x3e, 0x7f, 0x36, 0x74, 0x7a, 0x1b,
+ 0x84, 0x09, 0x89, 0xac, 0x1b, 0x99, 0x17, 0x7f, 0xf8, 0x5b, 0x40, 0x1d,
+ 0xb2, 0x82, 0xe4, 0x2d, 0xbf, 0x4b, 0x99, 0xa1, 0x5f, 0x39, 0x10, 0xf5,
+ 0x75, 0x90, 0xda, 0xfd, 0xa7, 0x37, 0x7a, 0x4a, 0x0e, 0xf8, 0xb8, 0xf3,
+ 0xc4, 0xaf, 0x3b, 0x00, 0xef, 0x6d, 0xf5, 0xcd, 0x91, 0x55, 0xe9, 0xf4,
+ 0x28, 0x69, 0x56, 0x27, 0xb5, 0x83, 0xbe, 0x0f, 0x0f, 0xce, 0x1d, 0x32,
+ 0xbd, 0x2c, 0x86, 0x86, 0x28, 0x0a, 0xee, 0x35, 0x30, 0xe5, 0xda, 0x0e,
+ 0xe6, 0xf9, 0x99, 0x53, 0x48, 0x53, 0x47, 0x9b, 0xb8, 0x29, 0x6e, 0xdd,
+ 0x50, 0x4e, 0xc7, 0x77, 0x97, 0x9b, 0x52, 0xf1, 0x33, 0xf1, 0x6f, 0x36,
+ 0x9a, 0x5c, 0x86, 0x77, 0x17, 0x6d, 0x9b, 0xd1, 0xa0, 0xc6, 0xcd, 0x90,
+ 0x45, 0xa3, 0xbc, 0x5f, 0x75, 0x81, 0xc5, 0x02, 0x6d, 0xbf, 0x6f, 0xca,
+ 0x90, 0x7e, 0x77, 0x5a, 0x62, 0x04, 0x52, 0x91, 0x03, 0xd8, 0x8c, 0x6e,
+ 0x0b, 0x79, 0x61, 0xb7, 0x30, 0xac, 0xab, 0xc1, 0xdb, 0x6a, 0x93, 0x33,
+ 0xc9, 0xb4, 0x11, 0x5a, 0x00, 0xdc, 0x74, 0xe9, 0x64, 0xf1, 0x90, 0xa4,
+ 0x54, 0x0b, 0xa1, 0xbe, 0xa1, 0xe6, 0x96, 0x66, 0xe5, 0x32, 0xfc, 0x1c,
+ 0xd7, 0x65, 0x58, 0xaf, 0x61, 0xeb, 0xe1, 0x3c, 0x9d, 0xec, 0xbe, 0xf1,
+ 0xb8, 0x4d, 0x17, 0xc6, 0x40, 0xed, 0x63, 0xad, 0x65, 0xe8, 0x83, 0x9f,
+ 0x71, 0xa4, 0x78, 0x5d, 0x7c, 0xee, 0x43, 0xfd, 0x0f, 0xb6, 0x7e, 0x27,
+ 0x5e, 0x91, 0x04, 0xc5, 0x81, 0x11, 0x26, 0x66, 0xc2, 0x10, 0xd1, 0xe7,
+ 0x74, 0x12, 0x2f, 0xcf, 0xfb, 0xc1, 0xfd, 0xc2, 0x44, 0x21, 0x63, 0xab,
+ 0xa3, 0xb5, 0x28, 0x74, 0xf5, 0xd7, 0x38, 0xfe, 0x5d, 0x64, 0x89, 0x48,
+ 0xbb, 0x84, 0x9f, 0x7e, 0x6b, 0xe4, 0x69, 0x3b, 0xf2, 0xf7, 0x7e, 0xae,
+ 0x4e, 0x1a, 0x05, 0xed, 0x62, 0xf0, 0xc7, 0xf6, 0xd3, 0x86, 0xf9, 0xb5,
+ 0x95, 0x5d, 0x2c, 0xfd, 0x94, 0x0e, 0xa7, 0x17, 0x96, 0x5b, 0xeb, 0x47,
+ 0x8d, 0x86, 0x1a, 0xd3, 0x1a, 0x16, 0x65, 0x56, 0x61, 0x80, 0x89, 0x44,
+ 0x39, 0x7a, 0xe9, 0x62, 0x56, 0x76, 0x5b, 0xe0, 0xc3, 0x71, 0xb0, 0xef,
+ 0x03, 0x3b, 0x17, 0x44, 0xa5, 0x29, 0xb8, 0x87, 0x55, 0xfe, 0x0a, 0x69,
+ 0x9e, 0x57, 0x71, 0xd5, 0x15, 0xdd, 0xd0, 0xc5, 0xa3, 0xfd, 0x5e, 0x42,
+ 0x4e, 0x03, 0x7c, 0xc6, 0x19, 0x85, 0xf2, 0x50, 0xbe, 0xd4, 0xbf, 0x82,
+ 0x3a, 0xba, 0x5c, 0xee, 0x06, 0xe2, 0xc1, 0x8b, 0xe6, 0x00, 0xed, 0x7a,
+ 0x67, 0x7e, 0x2a, 0xad, 0xc8, 0xaa, 0x1d, 0x9a, 0x18, 0x40, 0x84, 0x04,
+ 0x8b, 0x56, 0xa5, 0xed, 0x0a, 0xcc, 0xe5, 0x3e, 0xb8, 0x84, 0x1e, 0xb5,
+ 0x2e, 0x20, 0xe7, 0xb0, 0x45, 0x1e, 0x4d, 0xe9, 0xe0, 0x84, 0xf5, 0x80,
+ 0xdb, 0xcb, 0x1f, 0x5d, 0x49, 0xa1, 0x25, 0xf9, 0x62, 0x63, 0x4c, 0x72,
+ 0x0a, 0x71, 0x6f, 0x2b, 0x30, 0x15, 0x65, 0x2e, 0x2c, 0xa5, 0x34, 0x74,
+ 0xca, 0xe2, 0x0a, 0x54, 0x6f, 0x56, 0xdf, 0x42, 0x32, 0xe4, 0x53, 0x0c,
+ 0x3b, 0xa6, 0x6f, 0x1f, 0x9d, 0xd6, 0xf2, 0x59, 0x25, 0x11, 0x6a, 0xf8,
+ 0x1c, 0xbf, 0xff, 0x35, 0xe8, 0xdf, 0xdd, 0x4d, 0xf2, 0x49, 0x5b, 0x8d,
+ 0xee, 0xdd, 0x9e, 0xdb, 0xd1, 0x18, 0x6c, 0xd3, 0x86, 0xd0, 0x43, 0xf0,
+ 0x0d, 0xa0, 0x71, 0xe6, 0xb4, 0xbe, 0xdb, 0x92, 0xac, 0x92, 0xf7, 0xd0,
+ 0xa4, 0x30, 0x31, 0xbb, 0xe4, 0x04, 0x42, 0xf9, 0xd2, 0x86, 0x31, 0x4c,
+ 0xe4, 0xb9, 0xe1, 0x92, 0x99, 0x99, 0x28, 0xac, 0xc3, 0x91, 0xe1, 0x0e,
+ 0x82, 0xb3, 0x38, 0x76, 0x3f, 0x1c, 0x79, 0x7b, 0xcc, 0xf4, 0xaf, 0x46,
+ 0xc8, 0xc3, 0x36, 0xdb, 0x34, 0x30, 0x79, 0x6c, 0x64, 0xd4, 0xbb, 0x01,
+ 0xc4, 0x1f, 0x9e, 0xa2, 0x63, 0xa6, 0xf0, 0xf8, 0x74, 0x61, 0x99, 0xde,
+ 0xb5, 0x75, 0x02, 0x74, 0x94, 0x78, 0x38, 0xf2, 0xed, 0xe4, 0xf0, 0xa9,
+ 0x1c, 0x7e, 0x6d, 0x28, 0xf5, 0x0c, 0xb9, 0x4e, 0x54, 0x74, 0x04, 0x52,
+ 0xba, 0x05, 0x70, 0xae, 0x3b, 0x0d, 0x90, 0x44, 0x46, 0x9d, 0xba, 0x41,
+ 0xb6, 0x37, 0x7c, 0xe8, 0x32, 0x0b, 0xca, 0xe4, 0x0c, 0xb2, 0xc2, 0x3d,
+ 0x6e, 0x22, 0x2e, 0x74, 0x6f, 0x18, 0xc8, 0xa3, 0x05, 0x96, 0x9a, 0x65,
+ 0xc0, 0x4f, 0x90, 0xf9, 0xb7, 0x49, 0x8a, 0x85, 0x81, 0x88, 0x60, 0x71,
+ 0xa9, 0xdd, 0x19, 0xf6, 0x3e, 0xf0, 0x2e, 0xb0, 0x77, 0xdc, 0x88, 0xf8,
+ 0x6d, 0x49, 0x73, 0xf8, 0x64, 0xa3, 0x56, 0xcb, 0x75, 0x20, 0xfc, 0x72,
+ 0x7c, 0x0b, 0x59, 0x96, 0x27, 0x1c, 0xcb, 0x9a, 0x94, 0x4a, 0xb8, 0xc9,
+ 0xb2, 0x6e, 0x98, 0x80, 0xfc, 0xb2, 0x18, 0x67, 0x9a, 0xff, 0x98, 0x01,
+ 0x33, 0x47, 0x3f, 0x96, 0x08, 0xde, 0xe4, 0xd3, 0x38, 0x8f, 0x00, 0x03,
+ 0xd2, 0xb1, 0xed, 0xc5, 0x1e, 0x71, 0x09, 0x00, 0x3b, 0x1a, 0x5e, 0x21,
+ 0x61, 0x23, 0x43, 0x6c, 0x8b, 0xa2, 0xfa, 0x6a, 0xf9, 0x7b, 0xce, 0xd1,
+ 0x36, 0xc8, 0x48, 0x81, 0x65, 0xd9, 0x3a, 0x96, 0x15, 0x82, 0x11, 0xe2,
+ 0x11, 0xf8, 0x4e, 0x18, 0x1a, 0xfa, 0xd1, 0x55, 0x6c, 0x82, 0xd2, 0x3e,
+ 0x56, 0xea, 0x5f, 0xe6, 0xb6, 0x1c, 0x1b, 0xe1, 0x67, 0x79, 0x4e, 0x30,
+ 0x11, 0xac, 0xae, 0xe2, 0x27, 0x41, 0x27, 0x7d, 0x11, 0x4a, 0xe7, 0xc4,
+ 0xc5, 0xe9, 0x02, 0xba, 0x3b, 0x8b, 0x1f, 0xf0, 0xa0, 0xf8, 0x9c, 0x78,
+ 0x5c, 0xfb, 0xc0, 0x82, 0x12, 0xf5, 0xdb, 0x4f, 0xdd, 0xd4, 0x76, 0x88,
+ 0x7c, 0x4a, 0xe6, 0xe5, 0x1b, 0x07, 0x01, 0xe4, 0x08, 0xcc, 0x12, 0x09,
+ 0xfb, 0x9f, 0x78, 0x85, 0x82, 0x7a, 0xf8, 0x39, 0x03, 0x52, 0xa9, 0xc6,
+ 0x1c, 0x13, 0x58, 0xf1, 0x38, 0x53, 0x09, 0x98, 0x3a, 0xc6, 0xcd, 0xff,
+ 0xa1, 0x7b, 0xb7, 0x54, 0x0b, 0x93, 0x8e, 0x75, 0x83, 0x6b, 0x4e, 0xea,
+ 0x05, 0x7f, 0xf1, 0x03, 0x58, 0xde, 0x0e, 0x6b, 0xba, 0x1c, 0x58, 0x11,
+ 0xa0, 0x90, 0x6a, 0xde, 0xfc, 0x1a, 0x8c, 0xbf, 0x7b, 0xd2, 0x76, 0xef,
+ 0x79, 0xf3, 0xf9, 0x4e, 0x4c, 0xfd, 0xa2, 0x5b, 0xcf, 0xf7, 0xc5, 0x69,
+ 0x08, 0xec, 0xd4, 0x47, 0xbe, 0x7a, 0x05, 0x23, 0x1f, 0x45, 0x56, 0x9d,
+ 0x1a, 0x61, 0x9d, 0xa6, 0xe9, 0x93, 0x18, 0xc6, 0x4b, 0x84, 0x68, 0x28,
+ 0x7e, 0x15, 0xbc, 0x63, 0xb9, 0x5f, 0x8c, 0x82, 0x6b, 0x84, 0xf1, 0x48,
+ 0x30, 0xcf, 0x2b, 0xe1, 0xa0, 0x5b, 0x70, 0xb4, 0x07, 0xe6, 0x28, 0xc2,
+ 0x57, 0x9c, 0xf4, 0xe8, 0xc3, 0xc8, 0x9c, 0xd1, 0x37, 0x1f, 0xac, 0xfa,
+ 0x8e, 0x12, 0x9b, 0x87, 0x5b, 0x41, 0x86, 0x61, 0x41, 0xe9, 0x39, 0x2a,
+ 0x14, 0x1d, 0x23, 0xd1, 0x65, 0xc7, 0x18, 0x71, 0x0c, 0xff, 0x7a, 0x55,
+ 0xef, 0xc9, 0x55, 0xe6, 0xec, 0xe5, 0x4c, 0xbd, 0x97, 0xe3, 0xf3, 0x54,
+ 0x3e, 0x02, 0xce, 0xeb, 0xa1, 0xf6, 0x09, 0x16, 0x95, 0x81, 0x7c, 0xbc,
+ 0xf7, 0xa0, 0x6a, 0x8f, 0xd5, 0x80, 0xb0, 0xcd, 0x6d, 0x34, 0x63, 0xb2,
+ 0xb4, 0xe3, 0xd3, 0xd9, 0x77, 0x43, 0xf1, 0x7f, 0xdb, 0x4e, 0x3f, 0x5c,
+ 0xe0, 0x9e, 0x1f, 0x43, 0xff, 0x4d, 0x31, 0xf3, 0x96, 0xeb, 0x0f, 0xf0,
+ 0x61, 0xf3, 0x57, 0xa1, 0x5a, 0x55, 0xdc, 0xee, 0xef, 0x34, 0xef, 0x0d,
+ 0xa2, 0x50, 0xa5, 0x5a, 0xb8, 0x28, 0x02, 0x3e, 0x64, 0xb2, 0xa9, 0x22,
+ 0xc0, 0x23, 0x04, 0x0d, 0x6d, 0x1f, 0x26, 0x43, 0xe5, 0x1d, 0x1c, 0xe7,
+ 0x48, 0xfe, 0x15, 0x85, 0xc5, 0x6a, 0x5f, 0x64, 0x31, 0xff, 0x66, 0xdf,
+ 0x0b, 0x87, 0x84, 0xad, 0x7d, 0xb3, 0x31, 0x49, 0xa1, 0xb9, 0x9c, 0xc1,
+ 0x28, 0xa7, 0x43, 0xba, 0x1c, 0xcd, 0x1a, 0x20, 0x42, 0xd8, 0xd0, 0xba,
+ 0xc7, 0x0d, 0xa8, 0x34, 0x79, 0xc6, 0xd5, 0x2a, 0xa9, 0x8d, 0x16, 0xe0,
+ 0xfa, 0x75, 0xc1, 0xfb, 0x20, 0x10, 0xb7, 0xe4, 0x3f, 0xb4, 0xde, 0x16,
+ 0x43, 0xb1, 0x6f, 0xc9, 0x2f, 0xd8, 0xa2, 0xca, 0x3b, 0x45, 0xbe, 0x86,
+ 0x65, 0x76, 0x8e, 0x25, 0xdb, 0xa4, 0x52, 0xf1, 0xc3, 0xe5, 0x58, 0xef,
+ 0x82, 0x90, 0x7a, 0x37, 0xfc, 0x16, 0xcb, 0xb1, 0xa8, 0x10, 0x73, 0x6d,
+ 0x51, 0x98, 0x50, 0x86, 0x7d, 0xe5, 0x79, 0x86, 0x4c, 0x6f, 0xfb, 0x93,
+ 0xb9, 0xbd, 0x35, 0x50, 0x93, 0x22, 0x99, 0x32, 0x17, 0x75, 0x26, 0xbd,
+ 0x7b, 0x11, 0xff, 0xb1, 0x51, 0x6c, 0x74, 0xc5, 0x8b, 0xa6, 0xda, 0xe7,
+ 0x4b, 0x3f, 0x01, 0x36, 0x6e, 0x97, 0xf1, 0x73, 0x28, 0xcd, 0x4b, 0x3a,
+ 0xcf, 0xb5, 0xb6, 0xf7, 0xc1, 0xdb, 0xcb, 0xce, 0xf7, 0x59, 0x25, 0xc9,
+ 0x6a, 0x3a, 0x60, 0x9c, 0xd4, 0x7d, 0xe1, 0x33, 0x9f, 0x8f, 0xac, 0x62,
+ 0xa8, 0xaa, 0x18, 0xc5, 0xed, 0x2e, 0xba, 0x68, 0xf4, 0x45, 0xd8, 0xbf,
+ 0xed, 0x69, 0xd1, 0x00, 0x2d, 0x91, 0x74, 0x13, 0x41, 0xaa, 0xbc, 0xc3,
+ 0x32, 0xb4, 0x8f, 0xbd, 0x6e, 0x00, 0xe2, 0x5d, 0xa2, 0xfc, 0x6c, 0x79,
+ 0x3c, 0x5b, 0x54, 0x53, 0xba, 0x57, 0x13, 0xb9, 0x54, 0x79, 0x14, 0x71,
+ 0x34, 0x61, 0x94, 0x52, 0x5e, 0x68, 0x14, 0x00, 0x87, 0x20, 0x85, 0xa9,
+ 0x85, 0xc4, 0xc8, 0x27, 0x4f, 0x9f, 0x54, 0x1d, 0x59, 0xea, 0x41, 0xc0,
+ 0x86, 0x2a, 0x51, 0x10, 0x29, 0xe6, 0x7d, 0xcd, 0x61, 0xa9, 0x35, 0x26,
+ 0x6c, 0x67, 0xe6, 0xa0, 0x00, 0xff, 0xb4, 0x17, 0x3b, 0x4f, 0xf6, 0x4a,
+ 0xd4, 0x85, 0xbe, 0x4f, 0xf9, 0xdd, 0x70, 0x9d, 0x0d, 0xc8, 0x2a, 0x91,
+ 0x21, 0x6c, 0x2b, 0xa8, 0x44, 0x0a, 0x02, 0x7d, 0x9e, 0x70, 0xfc, 0xec,
+ 0xe6, 0xd4, 0x84, 0xda, 0x1e, 0x5e, 0xab, 0x79, 0xca, 0x94, 0x6f, 0x0c,
+ 0x43, 0x05, 0x9e, 0xe7, 0x78, 0xa5, 0x49, 0x80, 0xd1, 0xa1, 0x49, 0x31,
+ 0x0d, 0x64, 0xd0, 0x6a, 0x64, 0xfb, 0x9a, 0xce, 0xa4, 0x64, 0x4c, 0x48,
+ 0x97, 0xe4, 0x44, 0x74, 0x71, 0x36, 0xdc, 0x00, 0x46, 0x02, 0x78, 0xbc,
+ 0x24, 0x48, 0xc9, 0x86, 0x0c, 0xdb, 0xa0, 0x53, 0x8d, 0xd7, 0x45, 0xab,
+ 0x9c, 0xf4, 0x03, 0xcd, 0x23, 0xb4, 0x6e, 0x7f, 0xec, 0xf0, 0x37, 0xb1,
+ 0x7b, 0x2f, 0x11, 0x0c, 0xac, 0x8c, 0x65, 0x83, 0x14, 0x52, 0x42, 0xe4,
+ 0x23, 0x46, 0x56, 0xd6, 0x49, 0xe4, 0xd7, 0xff, 0xc4, 0x62, 0xf2, 0x42,
+ 0x4a, 0x34, 0xb1, 0xb3, 0xaa, 0x72, 0x02, 0xff, 0x62, 0x3d, 0x00, 0xa9,
+ 0x70, 0x15, 0xbc, 0x6b, 0xc4, 0x79, 0x37, 0xca, 0x81, 0xdb, 0xf2, 0x19,
+ 0x96, 0x94, 0xa0, 0x94, 0x29, 0x94, 0xff, 0xec, 0x08, 0x92, 0x05, 0x9d,
+ 0x92, 0x42, 0x7c, 0x78, 0xa2, 0x55, 0xf7, 0xee, 0xa3, 0x63, 0xef, 0x10,
+ 0xfd, 0x64, 0x15, 0xa7, 0xd3, 0xae, 0x29, 0x08, 0x2b, 0xd7, 0x5d, 0x72,
+ 0x90, 0xd7, 0x24, 0x6b, 0x78, 0xac, 0xa8, 0xf7, 0x1c, 0x66, 0xdb, 0x14,
+ 0x50, 0x17, 0xbd, 0xe0, 0x5c, 0xfd, 0x6a, 0x03, 0x96, 0x45, 0x03, 0xf1,
+ 0x34, 0x2c, 0x8e, 0x7b, 0xc2, 0x03, 0x6b, 0x44, 0xf6, 0x20, 0x87, 0x71,
+ 0x22, 0x89, 0x7a, 0xba, 0x14, 0x39, 0x9f, 0xe4, 0x01, 0x15, 0x9e, 0x97,
+ 0x6a, 0x28, 0x1e, 0x1a, 0x27, 0x15, 0x16, 0x40, 0x01, 0xf8, 0x21, 0xcf,
+ 0x75, 0x41, 0xfd, 0x48, 0x7c, 0xb6, 0xf1, 0xae, 0x75, 0x02, 0x59, 0xfd,
+ 0xf1, 0x29, 0xaf, 0x8b, 0xba, 0xd4, 0x1e, 0xe3, 0x92, 0xa3, 0xda, 0x52,
+ 0x09, 0xb1, 0x56, 0x79, 0x20, 0x24, 0x31, 0x2d, 0xf6, 0x54, 0x54, 0x39,
+ 0x1d, 0x7d, 0x6a, 0xb7, 0x23, 0x41, 0x0d, 0x00, 0x31, 0xbe, 0x7d, 0x04,
+ 0x57, 0x0f, 0x13, 0x4f, 0xf6, 0x60, 0xdd, 0xff, 0x7d, 0x28, 0x3a, 0xa9,
+ 0x37, 0xbc, 0x02, 0x5b, 0x6f, 0x0f, 0x3d, 0xdc, 0x4c, 0xe9, 0x30, 0x38,
+ 0x5a, 0x39, 0xbd, 0xd9, 0x2e, 0xc1, 0x69, 0x6b, 0xf3, 0x2d, 0xa1, 0xbd,
+ 0x59, 0x9a, 0x06, 0x6c, 0x7a, 0x70, 0x03, 0x0b, 0xbc, 0xbb, 0x71, 0xc1,
+ 0xa2, 0x59, 0x1c, 0x9d, 0x26, 0x8b, 0xfe, 0x10, 0x97, 0x0d, 0xf7, 0x50,
+ 0xb6, 0x9e, 0x03, 0x58, 0x20, 0xd6, 0x40, 0x60, 0xd2, 0x77, 0x83, 0x90,
+ 0x3d, 0xbe, 0xae, 0x6a, 0x53, 0x32, 0x72, 0x60, 0xde, 0xf8, 0x0f, 0x5f,
+ 0xb7, 0x98, 0xbf, 0x97, 0x87, 0x6f, 0x17, 0x80, 0x0d, 0x68, 0xb0, 0x66,
+ 0x18, 0x2a, 0x5c, 0x9a, 0x34, 0xcb, 0xe1, 0x7c, 0xc1, 0xea, 0xa7, 0xee,
+ 0xa4, 0x19, 0x9f, 0xd9, 0x49, 0x42, 0x75, 0x6b, 0x1d, 0x91, 0xef, 0x50,
+ 0x46, 0x6a, 0x90, 0x02, 0x4e, 0x35, 0xf2, 0x45, 0x04, 0xa7, 0xd1, 0x5c,
+ 0x9a, 0x2d, 0x09, 0x61, 0x01, 0xf7, 0x81, 0xdc, 0x06, 0xb8, 0xfd, 0x54,
+ 0x46, 0x93, 0xb6, 0x7c, 0xa0, 0x3e, 0x56, 0xa8, 0xbf, 0x0f, 0x7c, 0x82,
+ 0xf9, 0x5c, 0x01, 0xdd, 0x91, 0x66, 0xb4, 0x16, 0x6b, 0xd7, 0x67, 0xd4,
+ 0x29, 0xf9, 0xe2, 0x40, 0xd8, 0x6c, 0x8d, 0xd1, 0x5e, 0x27, 0x1d, 0xfc,
+ 0x70, 0x05, 0x0d, 0xf2, 0x5d, 0x84, 0x06, 0x28, 0x52, 0x01, 0x0a, 0x9c,
+ 0xfb, 0xb2, 0x76, 0x49, 0x85, 0x61, 0x59, 0xbc, 0x08, 0x59, 0xff, 0x1f,
+ 0x32, 0x40, 0xd8, 0x04, 0xae, 0x0f, 0xce, 0xdc, 0x63, 0x43, 0xf8, 0x86,
+ 0xfe, 0xac, 0x80, 0x26, 0xe5, 0x82, 0x0a, 0xb1, 0x9f, 0xc5, 0xb7, 0x4f,
+ 0xfb, 0x72, 0x74, 0x28, 0x68, 0x43, 0x1d, 0x09, 0x59, 0xab, 0xe2, 0x11,
+ 0x6f, 0x03, 0xbf, 0xd8, 0x43, 0xc8, 0x90, 0x56, 0xbd, 0x9d, 0x81, 0x92,
+ 0xe0, 0x7e, 0x18, 0x14, 0xb2, 0x54, 0xb3, 0x53, 0x8b, 0x98, 0x13, 0x0c,
+ 0x1e, 0x15, 0x04, 0x0e, 0x0b, 0x9b, 0x6c, 0xdc, 0x5b, 0x81, 0xae, 0xab,
+ 0xa4, 0x44, 0xc7, 0x2f, 0x4d, 0x58, 0xc1, 0x08, 0xaa, 0xb1, 0xd4, 0x2c,
+ 0x93, 0xc7, 0x2c, 0xa5, 0xaf, 0x70, 0x51, 0xac, 0x23, 0xd4, 0x5d, 0xe2,
+ 0x52, 0xc8, 0x9f, 0xaa, 0xc8, 0xfd, 0x2f, 0x87, 0xe2, 0xaf, 0x99, 0xa8,
+ 0x64, 0x0b, 0xb4, 0x40, 0x69, 0x1a, 0x1f, 0xfd, 0xbc, 0xb7, 0xd1, 0x2f,
+ 0xa8, 0x89, 0x1c, 0xb9, 0x16, 0x24, 0xb0, 0xd0, 0x01, 0xdd, 0x9f, 0xdc,
+ 0xcc, 0x82, 0x0f, 0x1e, 0x7d, 0xc4, 0x65, 0x2d, 0x42, 0x94, 0x33, 0xcf,
+ 0xe2, 0xbe, 0x56, 0x70, 0xdd, 0x18, 0x64, 0xa5, 0x2e, 0xb1, 0x60, 0x1d,
+ 0x76, 0xca, 0x2b, 0x52, 0x06, 0x28, 0x10, 0x00, 0x01, 0x5c, 0x78, 0x81,
+ 0x7a, 0x7b, 0x06, 0x0b, 0x1b, 0x0e, 0x28, 0x41, 0xde, 0x97, 0x22, 0xf3,
+ 0xfe, 0x50, 0x2c, 0xd3, 0xff, 0xc8, 0xc2, 0x10, 0xef, 0x20, 0x3d, 0x91,
+ 0x53, 0x6b, 0x50, 0x1d, 0x8f, 0x73, 0x1a, 0x77, 0x24, 0x55, 0x1b, 0xf3,
+ 0x2c, 0xc5, 0xea, 0xd2, 0x1e, 0x43, 0x2d, 0x1c, 0x55, 0x3c, 0xaf, 0xab,
+ 0x7a, 0xd3, 0xfb, 0x9c, 0xb3, 0xd9, 0x9a, 0x62, 0xb2, 0x15, 0x38, 0x2c,
+ 0x71, 0x68, 0x3b, 0xfc, 0x0e, 0x35, 0xf1, 0x4c, 0xe1, 0x00, 0x76, 0x8e,
+ 0x93, 0xf5, 0x3f, 0x5f, 0x8a, 0x1a, 0xed, 0xda, 0x19, 0x40, 0x83, 0xca,
+ 0x6e, 0xfe, 0xde, 0x65, 0x0d, 0x84, 0xa1, 0xdf, 0x4d, 0x87, 0x97, 0x00,
+ 0xcf, 0x3f, 0xd3, 0x64, 0xcf, 0x87, 0xad, 0xa8, 0xd4, 0xb0, 0x12, 0x9c,
+ 0xfd, 0x82, 0xaa, 0xa5, 0x10, 0xe8, 0xef, 0x94, 0xb9, 0x5c, 0x6b, 0x7e,
+ 0x4b, 0x28, 0x1f, 0x1a, 0x68, 0xcd, 0xe1, 0xb7, 0x6f, 0xa8, 0xce, 0x2f,
+ 0xcc, 0x99, 0x31, 0xc7, 0x59, 0xd7, 0x6b, 0x2b, 0x49, 0x51, 0xb3, 0x70,
+ 0x77, 0x32, 0xcf, 0xb4, 0x64, 0x84, 0xbd, 0xba, 0x3e, 0x78, 0xda, 0x0b,
+ 0x1d, 0x7d, 0xd6, 0x28, 0xbd, 0x68, 0x7a, 0x29, 0x1d, 0xbe, 0x2a, 0x1f,
+ 0xc5, 0xdf, 0x87, 0xa0, 0x0e, 0xfe, 0x0b, 0xed, 0x67, 0xf7, 0x80, 0xf5,
+ 0xcd, 0xd2, 0x6a, 0xf8, 0x10, 0x39, 0x87, 0x24, 0x9a, 0xa5, 0x2f, 0xcf,
+ 0x55, 0xed, 0xcb, 0x7d, 0xf4, 0xfe, 0xa6, 0x10, 0xb5, 0x6b, 0x4f, 0x1c,
+ 0x1f, 0xfd, 0xde, 0xfa, 0x66, 0x64, 0x9d, 0x3d, 0x21, 0xa1, 0x6f, 0xe1,
+ 0xd4, 0x28, 0x62, 0x9f, 0x43, 0xb2, 0xa8, 0xf0, 0xd7, 0xc1, 0xfe, 0xb9,
+ 0xc9, 0x30, 0x9a, 0xbb, 0x43, 0xa5, 0xb3, 0xd0, 0x48, 0x89, 0xa7, 0xdc,
+ 0x5f, 0x0e, 0xa3, 0xf0, 0xf8, 0x49, 0xcf, 0xf1, 0x26, 0xff, 0xdb, 0x10,
+ 0xe8, 0xc0, 0x08, 0x91, 0xd2, 0xb2, 0x4f, 0x0b, 0x3a, 0xb9, 0xd0, 0xf2,
+ 0x62, 0x86, 0xd5, 0xac, 0x1c, 0x3a, 0x0e, 0x01, 0xa7, 0x55, 0xfc, 0x99,
+ 0xa6, 0x3d, 0xb4, 0x2f, 0x1b, 0x0c, 0xbf, 0xe1, 0x47, 0x5b, 0xb6, 0x05,
+ 0x9e, 0x7d, 0xf2, 0x9f, 0x82, 0x6a, 0x3e, 0x67, 0x43, 0xe6, 0xa5, 0x82,
+ 0xf2, 0x75, 0x87, 0xd2, 0xf3, 0x1e, 0x9a, 0xd1, 0xd6, 0x6d, 0x85, 0x6c,
+ 0xb4, 0xd8, 0xfa, 0x53, 0xdc, 0x17, 0x96, 0x8c, 0xfd, 0xb5, 0xb8, 0xf4,
+ 0x21, 0x96, 0x0a, 0x4f, 0xf2, 0x03, 0xee, 0xee, 0x60, 0x30, 0xd0, 0x4d,
+ 0x23, 0xa2, 0xb7, 0x3e, 0xa9, 0xc5, 0x77, 0x82, 0x21, 0x08, 0x0f, 0x25,
+ 0x2f, 0xf0, 0xe0, 0xe0, 0x00, 0x00, 0x01, 0x14, 0x66, 0x66, 0xc6, 0x62,
+ 0x51, 0xf1, 0xbc, 0x6b, 0x72, 0xb6, 0xa1, 0xb9, 0x98, 0x19, 0x03, 0x79,
+ 0xde, 0xe6, 0x12, 0xab, 0x7b, 0xf8, 0x06, 0x43, 0x30, 0x03, 0xe3, 0x83,
+ 0xa3, 0x19, 0x5d, 0xde, 0xd8, 0x3f, 0x90, 0x81, 0x78, 0xc6, 0x74, 0x88,
+ 0xce, 0x8b, 0xbc, 0x1f, 0x95, 0xa1, 0x27, 0x6b, 0xfa, 0x4d, 0x0f, 0xe2,
+ 0xa8, 0xab, 0x03, 0xdc, 0x32, 0xeb, 0xed, 0x8e, 0xd2, 0x36, 0x51, 0x21,
+ 0x1e, 0x89, 0xb3, 0xfb, 0x87, 0x47, 0x34, 0xf0, 0x28, 0x62, 0x19, 0x26,
+ 0xb4, 0x5f, 0xfb, 0x51, 0x37, 0xe2, 0x64, 0xdf, 0x34, 0x56, 0xb6, 0x15,
+ 0x29, 0xb8, 0x9d, 0xef, 0xc1, 0x31, 0xa4, 0xc5, 0x84, 0x0e, 0x2a, 0x4d,
+ 0x46, 0x6a, 0xc0, 0xfd, 0xd4, 0xde, 0xae, 0xcb, 0x58, 0x30, 0xa2, 0xd2,
+ 0x2d, 0x87, 0xe9, 0x6d, 0xa4, 0xff, 0xe6, 0xeb, 0xd2, 0x90, 0x50, 0x27,
+ 0xbb, 0xf5, 0x93, 0xb8, 0x78, 0x6e, 0x59, 0x9e, 0xdf, 0x67, 0x4d, 0x67,
+ 0xa6, 0x7d, 0xe6, 0x27, 0x4b, 0x8b, 0x1e, 0x8e, 0x7b, 0xc3, 0x5e, 0xbb,
+ 0x0b, 0xb3, 0x0b, 0x7c, 0xa7, 0xea, 0x38, 0x63, 0x79, 0x0e, 0x3e, 0xf2,
+ 0x14, 0x23, 0xa8, 0xa0, 0x2a, 0x04, 0x6f, 0xac, 0x68, 0xe0, 0xe0, 0xbb,
+ 0x5a, 0xc3, 0x32, 0x91, 0xe8, 0x49, 0x08, 0x7b, 0x99, 0x55, 0x36, 0x00,
+ 0x11, 0x21, 0xea, 0x5c, 0xfe, 0x8f, 0xd7, 0x8d, 0x30, 0x91, 0x15, 0xbe,
+ 0x63, 0x19, 0x60, 0x45, 0xa2, 0xbc, 0xf5, 0xba, 0x1f, 0x57, 0xd9, 0x6e,
+ 0x5f, 0xaa, 0xbd, 0x11, 0x92, 0x6d, 0x9f, 0x97, 0x75, 0x86, 0xda, 0xbc,
+ 0x1b, 0x28, 0x8d, 0xf7, 0x05, 0xf5, 0xab, 0x99, 0xb1, 0xb5, 0xd6, 0xde,
+ 0xd0, 0x1a, 0xb3, 0xba, 0x29, 0xa6, 0x2e, 0xeb, 0xb7, 0x82, 0x77, 0x01,
+ 0xc4, 0x8d, 0x40, 0x64, 0xac, 0x36, 0x65, 0xba, 0x37, 0x99, 0xbd, 0x37,
+ 0x8d, 0xbf, 0x15, 0x8e, 0xd9, 0x41, 0x69, 0x32, 0xaf, 0x6e, 0x37, 0x35,
+ 0x6e, 0xb7, 0xa7, 0x62, 0x3b, 0x81, 0xc9, 0x4d, 0x67, 0x56, 0x19, 0x1b,
+ 0xba, 0xb7, 0x67, 0xf7, 0xe7, 0x5a, 0xa4, 0xdd, 0x78, 0xc0, 0xa8, 0x8b,
+ 0xc3, 0x46, 0x0e, 0x2d, 0x69, 0x65, 0x18, 0x50, 0xea, 0xe6, 0x24, 0x6d,
+ 0x32, 0xa3, 0x3b, 0x8d, 0x4a, 0x78, 0xa5, 0x46, 0x38, 0xfe, 0x6c, 0x35,
+ 0x20, 0x99, 0x57, 0x4b, 0xc3, 0xf7, 0xed, 0xf1, 0x5b, 0xfc, 0xa1, 0x7f,
+ 0xb5, 0xdf, 0xda, 0xc1, 0x0f, 0xa4, 0x1a, 0x74, 0x6f, 0x09, 0x07, 0x92,
+ 0x4d, 0x70, 0x89, 0x5d, 0x8f, 0xc9, 0x04, 0xf6, 0xa6, 0x52, 0xcb, 0xd3,
+ 0x23, 0xb3, 0x38, 0x82, 0xfa, 0x16, 0x6b, 0xfc, 0x47, 0x7b, 0x1c, 0x55,
+ 0xf0, 0xfb, 0x94, 0x63, 0x7b, 0x17, 0x79, 0x6f, 0x14, 0x44, 0x3c, 0x23,
+ 0x48, 0x63, 0x0c, 0x4c, 0x72, 0x06, 0x63, 0x0c, 0xdd, 0x0e, 0x62, 0x62,
+ 0x84, 0x66, 0x59, 0x08, 0xec, 0xb0, 0xdd, 0x0e, 0x6d, 0xae, 0x17, 0xa1,
+ 0x71, 0xd6, 0xcd, 0x41, 0x93, 0xfe, 0x3b, 0x36, 0x24, 0xfe, 0x18, 0x1a,
+ 0x3b, 0x39, 0x9b, 0xe0, 0xc1, 0x2d, 0xcd, 0xe7, 0x8a, 0x0f, 0xff, 0xe9,
+ 0x63, 0x56, 0xe0, 0x80, 0x6a, 0xd3, 0x4b, 0x90, 0x03, 0x47, 0x8a, 0xb1,
+ 0xd6, 0x39, 0x97, 0x34, 0x9c, 0x80, 0xc8, 0x44, 0xbe, 0x54, 0xea, 0x7d,
+ 0xa7, 0xb3, 0x79, 0xcc, 0xa0, 0xc9, 0x94, 0xdd, 0x2e, 0x93, 0xa9, 0x5c,
+ 0xe9, 0xf5, 0xe9, 0x49, 0xe6, 0x69, 0xd3, 0x8e, 0xe3, 0x69, 0x8d, 0xb1,
+ 0xdb, 0xdd, 0x88, 0x25, 0x48, 0x6a, 0x00, 0x97, 0xfa, 0x48, 0xf8, 0xbe,
+ 0x7b, 0x81, 0xb4, 0xe0, 0x9f, 0x76, 0x61, 0x7f, 0xa0, 0x57, 0xf9, 0x5d,
+ 0x5b, 0x6a, 0x43, 0x88, 0x8d, 0xd4, 0xe0, 0x43, 0x05, 0x0a, 0x5f, 0x83,
+ 0x61, 0x05, 0x12, 0xb1, 0x1f, 0x4f, 0x16, 0xa9, 0x5c, 0xa7, 0x68, 0x91,
+ 0x01, 0xdd, 0x9f, 0x85, 0x5e, 0xc2, 0x78, 0x38, 0x19, 0x27, 0x4e, 0xcc,
+ 0xaf, 0x85, 0x3a, 0x55, 0x64, 0x99, 0xd9, 0x13, 0xa8, 0x24, 0x5f, 0xfa,
+ 0xcf, 0xca, 0xf9, 0xff, 0xa0, 0xcc, 0xda, 0xe3, 0x0e, 0x98, 0xcc, 0x7c,
+ 0x1d, 0xe3, 0xad, 0xe6, 0x4f, 0xa0, 0x4b, 0xda, 0x07, 0xc9, 0xb5, 0x9d,
+ 0x68, 0x54, 0xab, 0xf5, 0xa6, 0x47, 0xcc, 0x28, 0xe0, 0x10, 0x89, 0x97,
+ 0xbf, 0xdc, 0x61, 0x92, 0x59, 0xfb, 0xad, 0x01, 0xa3, 0x85, 0x90, 0x72,
+ 0x9f, 0x3b, 0x78, 0x4f, 0x08, 0x1d, 0x25, 0x0f, 0x52, 0xdd, 0xa9, 0x0a,
+ 0x0b, 0x4d, 0x1d, 0xde, 0xbd, 0xdd, 0x8c, 0x38, 0xef, 0x5f, 0xf5, 0xbd,
+ 0x7e, 0xe3, 0xbc, 0x19, 0xf2, 0x61, 0x76, 0x46, 0xe0, 0xb9, 0xb7, 0x05,
+ 0x38, 0x60, 0x10, 0x2d, 0xb4, 0x60, 0x2d, 0x5d, 0x8b, 0x5e, 0xbb, 0x2b,
+ 0x6e, 0x68, 0x2c, 0x77, 0x25, 0xe1, 0x32, 0xac, 0x6b, 0x1b, 0xc6, 0x79,
+ 0xf1, 0x61, 0x1c, 0xa9, 0x69, 0xba, 0x54, 0x2c, 0x7a, 0x17, 0x0b, 0x54,
+ 0xa0, 0x6f, 0x69, 0x59, 0x50, 0x85, 0x54, 0x9c, 0xcd, 0x23, 0x7b, 0xb6,
+ 0x8b, 0xdf, 0xd4, 0xbb, 0xbf, 0x81, 0xe6, 0x43, 0x62, 0x9d, 0xa9, 0x1d,
+ 0x15, 0x60, 0xba, 0x3c, 0xdb, 0x8a, 0x20, 0x70, 0x04, 0xde, 0x71, 0x34,
+ 0xbc, 0xc0, 0x15, 0xd1, 0x5a, 0xbc, 0xa6, 0xba, 0xa8, 0x9e, 0x03, 0xb9,
+ 0x54, 0xa1, 0xb2, 0xac, 0xbe, 0x9b, 0x0d, 0x87, 0xfc, 0x79, 0xca, 0x07,
+ 0xc0, 0xcc, 0x10, 0x57, 0xba, 0x7e, 0x8a, 0x04, 0x41, 0x54, 0xb6, 0xa0,
+ 0x86, 0x46, 0x07, 0x4e, 0x28, 0x89, 0x68, 0xa6, 0xcd, 0x37, 0x91, 0x57,
+ 0x38, 0x2b, 0xbb, 0x6b, 0x97, 0x8f, 0xb5, 0xe3, 0xaa, 0x5c, 0xfe, 0xf7,
+ 0xa2, 0x83, 0xa0, 0x67, 0x67, 0x71, 0x19, 0x1a, 0xa3, 0x62, 0x85, 0x3a,
+ 0xce, 0x9d, 0x95, 0x7b, 0x96, 0xad, 0x2c, 0x57, 0x53, 0x5c, 0x73, 0x80,
+ 0xe8, 0xb5, 0xfc, 0xc4, 0x86, 0x87, 0x2e, 0xcd, 0x04, 0x41, 0xd5, 0x36,
+ 0xc7, 0x89, 0x70, 0x88, 0xde, 0x25, 0xb6, 0xfa, 0x07, 0xea, 0xe2, 0x0e,
+ 0x52, 0xae, 0x8d, 0x4f, 0xde, 0x8e, 0x8e, 0x2f, 0xf8, 0x13, 0x4f, 0x6c,
+ 0x83, 0xe0, 0x16, 0x54, 0x1b, 0x2b, 0x49, 0x40, 0xba, 0xf2, 0xee, 0x6c,
+ 0x38, 0x33, 0xec, 0x06, 0xab, 0x1c, 0x20, 0xf1, 0x1e, 0x18, 0x20, 0x7b,
+ 0x9f, 0xba, 0x16, 0x3a, 0x57, 0xcb, 0x06, 0xf2, 0xbd, 0x72, 0x1e, 0x74,
+ 0xee, 0x7b, 0x50, 0xd2, 0xbb, 0x22, 0xa4, 0x40, 0xfb, 0x0e, 0xa2, 0xb0,
+ 0x5d, 0xa7, 0x18, 0xfd, 0x64, 0x47, 0xec, 0x82, 0x6a, 0x3f, 0x36, 0x79,
+ 0xe6, 0x69, 0x80, 0x53, 0x6b, 0xd4, 0xa6, 0x1d, 0xd1, 0xef, 0x0d, 0xbb,
+ 0xd7, 0xc2, 0xaa, 0x10, 0x46, 0xa4, 0xf1, 0x60, 0x55, 0xb9, 0x01, 0x04,
+ 0x77, 0x65, 0x64, 0xfa, 0x29, 0x02, 0xf5, 0x3f, 0xfc, 0x3a, 0x1c, 0x9a,
+ 0xb0, 0xfc, 0x77, 0x23, 0x92, 0x76, 0x3e, 0xd2, 0xd6, 0xb3, 0x5b, 0x69,
+ 0xcf, 0x37, 0x1b, 0x0e, 0xbb, 0xe9, 0x75, 0xe4, 0x11, 0xf1, 0xaa, 0x56,
+ 0xa0, 0x62, 0xd3, 0x1b, 0x08, 0x1d, 0xa1, 0xe2, 0xce, 0xb6, 0xd4, 0xe3,
+ 0x27, 0x45, 0x3a, 0x51, 0xfa, 0xd0, 0xfd, 0xb2, 0xa3, 0xb9, 0x30, 0x46,
+ 0x5a, 0x4b, 0x2c, 0x0f, 0xa8, 0x58, 0xcd, 0x31, 0x9e, 0x5b, 0x76, 0x05,
+ 0x07, 0x94, 0xec, 0x5f, 0x75, 0xc5, 0xef, 0x46, 0x90, 0x79, 0xea, 0xd9,
+ 0xb5, 0x67, 0x89, 0x15, 0x98, 0x4c, 0x29, 0x4d, 0xdd, 0x25, 0x6b, 0x50,
+ 0x72, 0xbe, 0x07, 0x0a, 0xc4, 0x78, 0x04, 0x5f, 0x6a, 0x05, 0x82, 0xb4,
+ 0x5b, 0x16, 0xf3, 0x22, 0x2a, 0xef, 0x94, 0x01, 0xb9, 0x70, 0xb2, 0x86,
+ 0xdb, 0xe5, 0xe9, 0x12, 0x8e, 0x6a, 0x6f, 0xda, 0x49, 0xf3, 0xae, 0xf4,
+ 0x2a, 0x86, 0x1d, 0x90, 0xac, 0x40, 0xb9, 0x9b, 0xfd, 0x8c, 0x09, 0x72,
+ 0x76, 0x67, 0x14, 0x8f, 0x56, 0x16, 0x90, 0xbc, 0xb7, 0x83, 0x91, 0x01,
+ 0x9e, 0x85, 0xff, 0xba, 0x77, 0x5b, 0x34, 0xc0, 0x71, 0xfd, 0x91, 0xde,
+ 0x7d, 0xfa, 0x92, 0x96, 0xa6, 0x55, 0x7a, 0x55, 0x36, 0xcf, 0x7d, 0x33,
+ 0xf1, 0xa5, 0xc6, 0x6a, 0xda, 0x15, 0xfe, 0x9e, 0x20, 0x41, 0x99, 0xb7,
+ 0xc5, 0xf4, 0xee, 0x13, 0xe6, 0xd2, 0x75, 0xd8, 0xf9, 0x16, 0x25, 0xf2,
+ 0xab, 0xc2, 0x69, 0x08, 0x53, 0x99, 0x5f, 0x0f, 0x22, 0x25, 0x50, 0x4b,
+ 0x6d, 0xd2, 0x78, 0xd5, 0xca, 0xcc, 0x04, 0xc0, 0xcf, 0xab, 0x37, 0xc8,
+ 0x1d, 0x30, 0x1f, 0x22, 0xec, 0x08, 0xbe, 0xb6, 0x5f, 0x1a, 0xa4, 0xa7,
+ 0x48, 0x09, 0xc9, 0x41, 0x32, 0x88, 0x31, 0xbb, 0xe9, 0xd1, 0xac, 0xac,
+ 0xeb, 0x35, 0xdb, 0xf8, 0xcb, 0xc6, 0xff, 0x03, 0x0f, 0xce, 0x28, 0x91,
+ 0xd8, 0x1d, 0x8a, 0x58, 0xd1, 0x77, 0x4c, 0xc7, 0x3f, 0x8c, 0xbc, 0xbe,
+ 0x46, 0xd7, 0xc0, 0x26, 0x95, 0x2d, 0xdc, 0xce, 0xcd, 0x7c, 0x9a, 0xa1,
+ 0x1e, 0x84, 0xb8, 0x02, 0xed, 0xab, 0x34, 0x21, 0xc4, 0x8b, 0xb9, 0x47,
+ 0x79, 0x18, 0x53, 0x1c, 0xb5, 0x12, 0x24, 0xfc, 0x39, 0x94, 0x43, 0xfb,
+ 0xa8, 0x9d, 0x11, 0x24, 0x6e, 0xa9, 0x27, 0x8c, 0x2a, 0x36, 0x32, 0x79,
+ 0x19, 0xb4, 0xa5, 0x96, 0x10, 0x93, 0x81, 0x09, 0x31, 0x0c, 0x81, 0x3a,
+ 0x9d, 0xc1, 0x7f, 0xf9, 0x6e, 0xf4, 0x39, 0x30, 0x79, 0x5a, 0xc7, 0x36,
+ 0xe3, 0x2b, 0xa0, 0x94, 0x23, 0x63, 0xc0, 0x09, 0x30, 0x01, 0x60, 0xb0,
+ 0x49, 0x25, 0x3c, 0xdd, 0x5c, 0x73, 0x69, 0x8e, 0xbf, 0xd8, 0x71, 0xa3,
+ 0xbe, 0xe3, 0x42, 0x07, 0xf0, 0xca, 0x85, 0x2e, 0x93, 0xff, 0x86, 0x5f,
+ 0xd6, 0xeb, 0xa3, 0xf7, 0x60, 0x9e, 0xa9, 0x1b, 0x92, 0x33, 0xe3, 0x51,
+ 0x82, 0x6d, 0x36, 0x21, 0x61, 0xc8, 0xac, 0x27, 0xd8, 0xb3, 0x8b, 0xdf,
+ 0x24, 0xce, 0x05, 0xe5, 0x59, 0xdc, 0xd8, 0xb8, 0x55, 0x48, 0x9d, 0x1b,
+ 0x88, 0xcb, 0x19, 0x6c, 0xdc, 0x88, 0x69, 0x18, 0x49, 0xa8, 0xbb, 0x0a,
+ 0xb8, 0x02, 0x3e, 0xc4, 0xa5, 0x0e, 0xa8, 0x9e, 0x3f, 0x8f, 0xa4, 0xeb,
+ 0x4b, 0xb3, 0x32, 0x1e, 0x13, 0x33, 0xca, 0xc4, 0xa5, 0xf2, 0xdb, 0x10,
+ 0x5b, 0xd8, 0x58, 0x37, 0x3c, 0x60, 0x07, 0x45, 0x76, 0x0c, 0x56, 0xab,
+ 0x0e, 0xa4, 0x2e, 0xff, 0x89, 0x5b, 0x24, 0x31, 0x39, 0x19, 0xba, 0x3c,
+ 0x59, 0x43, 0x68, 0x90, 0xf8, 0xca, 0x9f, 0xf2, 0xe9, 0xb2, 0xf8, 0x8e,
+ 0xef, 0x74, 0x06, 0x42, 0x1b, 0x20, 0x0d, 0xa3, 0x75, 0xdc, 0x5a, 0xc1,
+ 0x01, 0x4a, 0x10, 0x9f, 0xaf, 0x2d, 0x0d, 0xce, 0xab, 0xea, 0x81, 0x1c,
+ 0x23, 0xfe, 0x34, 0x0d, 0xf8, 0xdb, 0x5e, 0x33, 0xd2, 0x89, 0xba, 0x08,
+ 0xa5, 0xb0, 0xbb, 0xc6, 0xbc, 0x60, 0x52, 0x94, 0xff, 0x6a, 0x86, 0xed,
+ 0x87, 0xb4, 0x04, 0x8a, 0x68, 0x38, 0xc2, 0x61, 0x64, 0x32, 0x8e, 0xf4,
+ 0x48, 0xe7, 0x44, 0xb4, 0xa3, 0xf1, 0x90, 0xde, 0xd6, 0x42, 0xc2, 0xb7,
+ 0x61, 0x88, 0xb0, 0x0f, 0x9d, 0xbf, 0x00, 0xf1, 0xf0, 0x04, 0x24, 0xc8,
+ 0x7b, 0x00, 0xe7, 0xee, 0x39, 0x12, 0xb4, 0x54, 0xbe, 0x32, 0xd9, 0x00,
+ 0xd0, 0x8a, 0xf3, 0xe5, 0xe4, 0x23, 0xcc, 0x12, 0x47, 0x1f, 0x44, 0x02,
+ 0x76, 0x6a, 0xdd, 0x2c, 0x50, 0x9c, 0x91, 0x0c, 0x5d, 0xc8, 0x56, 0x40,
+ 0x30, 0x34, 0x0c, 0x98, 0x3c, 0x7e, 0x83, 0x73, 0x8a, 0x34, 0xef, 0x67,
+ 0xd1, 0x68, 0x04, 0xca, 0xe5, 0x13, 0xfe, 0x8e, 0x07, 0x81, 0xa4, 0xb8,
+ 0xbe, 0x7c, 0xa0, 0xb8, 0x7f, 0x31, 0x4e, 0xf5, 0xe1, 0x35, 0xe9, 0xfb,
+ 0xf9, 0xee, 0xd3, 0xe4, 0x3c, 0x6a, 0xb6, 0xf5, 0x2b, 0x30, 0x91, 0xff,
+ 0x45, 0x34, 0xc8, 0xa0, 0x3b, 0x96, 0xcc, 0x19, 0xbf, 0x6f, 0x65, 0x43,
+ 0xf6, 0x5f, 0x98, 0x06, 0x29, 0xc9, 0xf0, 0xec, 0xfc, 0x21, 0xaa, 0x6d,
+ 0xdc, 0x69, 0xd5, 0xf1, 0x48, 0x3e, 0xda, 0xcd, 0xce, 0xb5, 0xb1, 0xda,
+ 0x63, 0xa8, 0xdb, 0x01, 0x77, 0xaf, 0x47, 0x13, 0xcf, 0xe3, 0x37, 0x0d,
+ 0x0a, 0x1d, 0xc3, 0xf2, 0xd8, 0x52, 0xe1, 0xb2, 0x57, 0x42, 0x9c, 0x01,
+ 0x9e, 0x26, 0x57, 0x54, 0xa1, 0x47, 0xfb, 0xe3, 0xc9, 0xd3, 0x77, 0xae,
+ 0x4e, 0x5f, 0x69, 0xd1, 0x64, 0x07, 0xad, 0x9e, 0xa1, 0xab, 0xdf, 0xd9,
+ 0x50, 0x84, 0x43, 0xd5, 0xf6, 0x8c, 0x8e, 0xd9, 0xb5, 0xcb, 0xfc, 0x45,
+ 0xd8, 0x22, 0xd6, 0x7f, 0xc7, 0x4e, 0x88, 0xd1, 0x7b, 0xe0, 0xd9, 0xc1,
+ 0x80, 0x11, 0x6e, 0x2e, 0x3b, 0xef, 0x2d, 0x8b, 0x89, 0xf2, 0x40, 0x4c,
+ 0x45, 0xc3, 0x2c, 0xbe, 0xad, 0x6f, 0x63, 0x27, 0x81, 0xd3, 0x9e, 0x8f,
+ 0x38, 0x4c, 0x98, 0x4b, 0xec, 0xb7, 0x2a, 0xdd, 0x27, 0xc0, 0xee, 0x80,
+ 0xd8, 0xb9, 0xfd, 0xed, 0x6e, 0xcf, 0x0b, 0x84, 0xdf, 0xfd, 0xda, 0x27,
+ 0xfd, 0x09, 0x01, 0x8f, 0x07, 0x4b, 0x98, 0x93, 0x86, 0x95, 0x4b, 0xe1,
+ 0x05, 0x0b, 0x0c, 0x74, 0xf7, 0x3d, 0x17, 0xdb, 0xbd, 0x92, 0xad, 0x06,
+ 0x07, 0x06, 0xdb, 0xdc, 0xa7, 0xe7, 0x88, 0xe5, 0x38, 0xaa, 0x94, 0xaf,
+ 0xc9, 0xc9, 0x3e, 0x41, 0xeb, 0x91, 0x7f, 0x48, 0xc5, 0xf9, 0xf9, 0x07,
+ 0x3c, 0xc3, 0xba, 0x81, 0xee, 0x61, 0x61, 0xd2, 0x89, 0x81, 0xa5, 0xb0,
+ 0x45, 0x2c, 0x60, 0xc1, 0x26, 0xb4, 0xc7, 0x0b, 0xcd, 0xae, 0x04, 0x23,
+ 0x8b, 0x76, 0xea, 0x7b, 0xd7, 0x85, 0x19, 0xbe, 0xc9, 0x33, 0xea, 0x63,
+ 0xe9, 0x6e, 0xf2, 0x53, 0xdf, 0x8e, 0xbd, 0xf5, 0xf5, 0x23, 0x18, 0x75,
+ 0x8f, 0x8a, 0xe6, 0x82, 0xe0, 0x3d, 0x16, 0xb0, 0x71, 0xcd, 0x95, 0x5e,
+ 0x8e, 0x6b, 0x75, 0xa6, 0x06, 0x0e, 0x8b, 0x58, 0x51, 0x22, 0x8e, 0xca,
+ 0x1b, 0x09, 0x3e, 0x73, 0xf9, 0x01, 0x21, 0x3b, 0x72, 0x9b, 0xa3, 0x4c,
+ 0xdc, 0x75, 0xee, 0xab, 0x78, 0x18, 0x95, 0x33, 0x94, 0xb5, 0x9b, 0x99,
+ 0xa1, 0x8a, 0x3e, 0xe5, 0x88, 0x28, 0x87, 0x2d, 0x42, 0x45, 0xcc, 0xc4,
+ 0x26, 0xf6, 0xd4, 0x92, 0xc2, 0x76, 0x34, 0x0a, 0x9b, 0x5b, 0xa8, 0x8f,
+ 0xbe, 0x74, 0x26, 0xf9, 0xf7, 0xd6, 0x8c, 0x2a, 0x55, 0x34, 0x36, 0xbf,
+ 0x7a, 0x73, 0x79, 0x2f, 0xb6, 0x71, 0x83, 0x09, 0x3a, 0x78, 0x32, 0x74,
+ 0x47, 0x5e, 0xa7, 0x1d, 0x3d, 0xf4, 0x8b, 0xe3, 0x50, 0xc0, 0xbb, 0x48,
+ 0x7f, 0xec, 0x8c, 0xca, 0x27, 0x2f, 0x28, 0x75, 0x36, 0x4d, 0x1d, 0x5c,
+ 0x92, 0x50, 0x6e, 0xf3, 0xe9, 0xab, 0x32, 0xa7, 0xf3, 0x04, 0xb1, 0x5d,
+ 0x7c, 0x08, 0x27, 0x0d, 0xac, 0xa3, 0x35, 0xc9, 0x32, 0xb5, 0x68, 0x10,
+ 0xcf, 0x6d, 0xba, 0xcf, 0x83, 0xde, 0xf9, 0xa3, 0x11, 0xf4, 0xe0, 0xfe,
+ 0x62, 0x20, 0x04, 0x80, 0x93, 0x74, 0x0d, 0x1c, 0x02, 0xcc, 0x5b, 0xcc,
+ 0x06, 0x2a, 0x8a, 0xdc, 0x5a, 0x68, 0x10, 0xd9, 0xce, 0xfd, 0xb7, 0x29,
+ 0xda, 0x18, 0x0a, 0x37, 0xbe, 0x43, 0x5c, 0xf9, 0x19, 0x53, 0xf9, 0xc9,
+ 0x1e, 0x18, 0xbe, 0x61, 0x60, 0x3b, 0x46, 0xa5, 0xfa, 0x79, 0x63, 0x9c,
+ 0x93, 0x6b, 0x8e, 0xcf, 0xb5, 0x5f, 0x97, 0x11, 0xad, 0xdc, 0x37, 0xe5,
+ 0x5a, 0x7e, 0x2b, 0x3a, 0x00, 0x33, 0x8c, 0xa5, 0xc5, 0x70, 0x2f, 0x22,
+ 0xec, 0x48, 0x18, 0x0b, 0x54, 0xe2, 0x99, 0x0d, 0x60, 0x28, 0x10, 0xbc,
+ 0x16, 0xa3, 0x3a, 0x80, 0x67, 0x47, 0x6c, 0x36, 0xd9, 0x6e, 0x5f, 0x44,
+ 0x24, 0x1c, 0x65, 0x47, 0xf1, 0x98, 0x97, 0x3a, 0x2a, 0x19, 0x75, 0x7b,
+ 0x12, 0x2d, 0x53, 0x0c, 0x44, 0x4d, 0x5b, 0x41, 0x46, 0x3f, 0xc3, 0x2d,
+ 0x91, 0x5a, 0x71, 0x8e, 0x6e, 0x84, 0x07, 0xc7, 0x62, 0xb7, 0xcb, 0x39,
+ 0x11, 0x99, 0xef, 0x43, 0xe7, 0x61, 0x3d, 0xe9, 0x91, 0x38, 0x40, 0xb8,
+ 0x8c, 0x80, 0x08, 0x81, 0x30, 0xb9, 0x5b, 0x52, 0x9f, 0x18, 0x0d, 0xf3,
+ 0xb8, 0x27, 0xa3, 0xf5, 0xba, 0xfc, 0x41, 0xa5, 0x10, 0xfe, 0x3a, 0xe6,
+ 0x53, 0x3b, 0x2f, 0x90, 0x64, 0x0d, 0x15, 0x9b, 0xe4, 0x10, 0x29, 0x84,
+ 0xff, 0xac, 0x83, 0xac, 0x13, 0x5e, 0x90, 0x87, 0x68, 0x17, 0x6f, 0xde,
+ 0x3a, 0x27, 0x25, 0x33, 0xb2, 0x3b, 0xca, 0xb6, 0xb3, 0x5d, 0x6d, 0x0b,
+ 0xf3, 0x6f, 0xe8, 0x10, 0xb3, 0x42, 0xb3, 0xf0, 0xd7, 0xf0, 0x0d, 0xb6,
+ 0xae, 0x13, 0x40, 0xef, 0x0d, 0x12, 0x99, 0xeb, 0xdb, 0x73, 0x87, 0xf8,
+ 0x19, 0xa3, 0xbd, 0xea, 0x5c, 0xa2, 0xec, 0x6a, 0xae, 0x3e, 0xc7, 0x43,
+ 0x73, 0xd6, 0xe9, 0x51, 0xa2, 0x8d, 0x36, 0x49, 0x43, 0x5d, 0x12, 0x6d,
+ 0xeb, 0x99, 0x79, 0x7f, 0x15, 0x74, 0x69, 0xaf, 0xa1, 0x97, 0x5a, 0x91,
+ 0xfd, 0xc6, 0x0f, 0xa5, 0x43, 0x90, 0x38, 0x54, 0xb7, 0xd7, 0x57, 0x4b,
+ 0x7c, 0xdd, 0xa2, 0x45, 0x8e, 0xbb, 0x56, 0xae, 0x1c, 0x03, 0xf4, 0xcf,
+ 0xca, 0xee, 0xc6, 0x10, 0x3e, 0xb8, 0x24, 0x3c, 0xbd, 0x4e, 0xd6, 0xac,
+ 0x9e, 0x98, 0x9b, 0x2f, 0x5d, 0x49, 0x6b, 0xb4, 0xfa, 0xe3, 0x10, 0x7f,
+ 0x33, 0xea, 0xf7, 0x37, 0x07, 0xae, 0xf3, 0xac, 0x04, 0x5a, 0x6a, 0xb2,
+ 0x02, 0x9f, 0x3d, 0x01, 0x08, 0x9b, 0xb6, 0x37, 0xe6, 0x11, 0xf5, 0x71,
+ 0xb0, 0xe2, 0x73, 0xba, 0x11, 0x22, 0x38, 0x58, 0xad, 0x03, 0x06, 0x8a,
+ 0x89, 0xf5, 0x53, 0xb6, 0xa0, 0x78, 0x91, 0x31, 0x2f, 0x29, 0xf8, 0x56,
+ 0x0b, 0xd0, 0xf4, 0x77, 0xbc, 0x3b, 0x9b, 0xdf, 0x87, 0x40, 0x60, 0x39,
+ 0xc1, 0xfb, 0x0c, 0xb0, 0xa1, 0x74, 0x36, 0xf5, 0xad, 0xf2, 0x66, 0x3f,
+ 0xe7, 0xae, 0x62, 0x01, 0xa6, 0x6c, 0xf3, 0x64, 0x95, 0x5e, 0x78, 0x5e,
+ 0x44, 0xba, 0x55, 0x12, 0xdc, 0xed, 0x25, 0xc6, 0x82, 0x04, 0xbc, 0x01,
+ 0x95, 0x98, 0x74, 0x69, 0x80, 0x57, 0x6a, 0xa6, 0xdc, 0xa5, 0x74, 0x46,
+ 0xd6, 0xea, 0x86, 0x29, 0x34, 0xcf, 0x48, 0xdf, 0x0c, 0xd9, 0xd8, 0x71,
+ 0xbd, 0x97, 0x8d, 0x8f, 0xfc, 0xef, 0xba, 0x7d, 0x70, 0x53, 0xf0, 0xc6,
+ 0xf7, 0xfb, 0x2d, 0x46, 0x99, 0x0d, 0x0c, 0x9d, 0xf2, 0x8b, 0xbf, 0xe5,
+ 0x12, 0x7f, 0x4d, 0x87, 0xc5, 0x1a, 0x1c, 0xbf, 0x32, 0x18, 0x8d, 0xb4,
+ 0x29, 0x94, 0xcb, 0x44, 0xf8, 0x1a, 0xa2, 0xf8, 0x58, 0x3a, 0xe6, 0x77,
+ 0xe0, 0x25, 0xf4, 0xdd, 0x21, 0x8e, 0x1b, 0x81, 0xfa, 0xaf, 0xf1, 0x49,
+ 0x32, 0x70, 0x24, 0x1c, 0xae, 0xde, 0x74, 0x14, 0xba, 0xbc, 0x4f, 0x71,
+ 0xb7, 0x76, 0x7f, 0x52, 0xf1, 0x6e, 0xb3, 0xab, 0x3a, 0x68, 0xf8, 0x85,
+ 0x89, 0xd8, 0x87, 0xb9, 0x30, 0x5a, 0xa8, 0xf5, 0x9f, 0xdf, 0x99, 0x54,
+ 0xec, 0x9d, 0x88, 0xfd, 0x4b, 0xbb, 0x84, 0x31, 0xe2, 0x42, 0xb1, 0xef,
+ 0x05, 0x58, 0x2f, 0xd7, 0x5b, 0xe6, 0xd9, 0xf9, 0x42, 0x34, 0x02, 0xde,
+ 0xdb, 0x63, 0xae, 0x6b, 0x52, 0xe4, 0x03, 0xc2, 0x0a, 0x9b, 0x99, 0xcc,
+ 0xe2, 0xac, 0xa4, 0x8b, 0xe2, 0x8e, 0x6d, 0xfe, 0x30, 0xa4, 0x6b, 0x08,
+ 0x11, 0xf6, 0xe1, 0x8b, 0xc7, 0xf7, 0xa3, 0x58, 0xcf, 0x86, 0x76, 0xcd,
+ 0xea, 0x34, 0x10, 0x31, 0xb7, 0x67, 0x03, 0x38, 0x46, 0x2e, 0x5f, 0xae,
+ 0x16, 0x15, 0x7e, 0xdc, 0xa4, 0xc0, 0x32, 0x3d, 0x8b, 0xde, 0xfb, 0x6a,
+ 0x99, 0x48, 0x76, 0xc6, 0x32, 0x3f, 0x17, 0x23, 0xde, 0xeb, 0x23, 0x76,
+ 0x28, 0xaa, 0xf2, 0x1c, 0x63, 0x97, 0x18, 0xb8, 0x40, 0x06, 0x5e, 0x0f,
+ 0x25, 0x28, 0xcc, 0xde, 0xf9, 0x8d, 0x08, 0xda, 0x55, 0x1d, 0xd2, 0x78,
+ 0xd0, 0x98, 0x08, 0x4b, 0x5c, 0x9c, 0x56, 0xa7, 0x9c, 0xa8, 0xd3, 0x8a,
+ 0x7b, 0x00, 0x02, 0x7d, 0xa8, 0x2e, 0x73, 0x80, 0x8b, 0xea, 0x2d, 0xd9,
+ 0x5a, 0xd4, 0x97, 0x82, 0xfa, 0x20, 0xad, 0xe7, 0x89, 0xe2, 0x08, 0x76,
+ 0xdd, 0x2d, 0x73, 0xab, 0xe8, 0xa5, 0xe3, 0x9e, 0xb2, 0x55, 0x85, 0x50,
+ 0xf5, 0x78, 0xed, 0x37, 0xeb, 0xde, 0x01, 0xeb, 0x8c, 0x4f, 0x55, 0x3e,
+ 0x1c, 0xf7, 0x93, 0xad, 0xc1, 0xf5, 0xcb, 0x8b, 0x78, 0x32, 0xd8, 0xfa,
+ 0xa1, 0x04, 0x42, 0xa5, 0x0d, 0x82, 0x30, 0x75, 0x85, 0xc3, 0xb3, 0x29,
+ 0x81, 0xba, 0x5d, 0x9e, 0x48, 0xea, 0xcb, 0xce, 0x83, 0x81, 0xd1, 0x32,
+ 0xd4, 0x97, 0x50, 0x4c, 0xc3, 0xc0, 0x03, 0x2e, 0xda, 0x73, 0x1e, 0xf7,
+ 0xe4, 0xa3, 0xea, 0xeb, 0x6d, 0xeb, 0xe1, 0xf9, 0x09, 0xe5, 0xee, 0x4a,
+ 0x1a, 0x9a, 0x07, 0xa0, 0x79, 0x23, 0x9f, 0x0b, 0x87, 0x23, 0x80, 0x9a,
+ 0x0e, 0x8f, 0xc7, 0x97, 0xb9, 0xdc, 0xf3, 0x64, 0x27, 0x0d, 0xda, 0x08,
+ 0xe1, 0x4a, 0xba, 0xae, 0x0f, 0xc8, 0x2f, 0xb0, 0x4c, 0x64, 0x96, 0x1d,
+ 0xa1, 0xd6, 0xe0, 0x27, 0xfb, 0x3b, 0x64, 0x12, 0xc0, 0xeb, 0x1f, 0x50,
+ 0xe0, 0x53, 0x5b, 0xe0, 0x4b, 0x17, 0x4b, 0x39, 0x9a, 0x3a, 0x7a, 0xe7,
+ 0x7d, 0xdf, 0xad, 0x30, 0x69, 0x21, 0x66, 0x19, 0x59, 0xcb, 0x0e, 0x41,
+ 0x88, 0xda, 0xed, 0x9d, 0x4b, 0xf5, 0xe8, 0xff, 0x58, 0x73, 0xd3, 0x4f,
+ 0x9a, 0x90, 0xe4, 0x59, 0xad, 0x82, 0xee, 0x15, 0xcc, 0x7f, 0x33, 0xcc,
+ 0xa2, 0xe2, 0x2a, 0xcd, 0x5c, 0xdd, 0xd0, 0x9d, 0x74, 0x1d, 0xb9, 0x9a,
+ 0x26, 0xf5, 0x9d, 0xd7, 0x09, 0xd3, 0x2b, 0x4c, 0x00, 0xa6, 0xbc, 0xca,
+ 0x25, 0xa0, 0x44, 0xc2, 0xb8, 0x9b, 0xba, 0x67, 0xc0, 0x78, 0x43, 0xf7,
+ 0x2b, 0x19, 0x53, 0xd6, 0x14, 0x94, 0x8a, 0xd5, 0xe0, 0x35, 0xe8, 0x91,
+ 0x68, 0x47, 0x29, 0x65, 0x9c, 0xea, 0xc8, 0x93, 0x3a, 0x03, 0xd8, 0xcd,
+ 0x59, 0x62, 0x87, 0x19, 0xe9, 0xc2, 0xb3, 0x87, 0x58, 0x5d, 0xa4, 0x79,
+ 0x9c, 0x53, 0x7e, 0x4d, 0x05, 0xb6, 0x67, 0x18, 0x4e, 0xdf, 0x56, 0x02,
+ 0xd8, 0xd5, 0x61, 0xb5, 0xb1, 0x29, 0xd8, 0x0f, 0xb9, 0x99, 0x48, 0x5b,
+ 0x65, 0x25, 0xc0, 0x55, 0xf2, 0xf5, 0x96, 0xe1, 0xd7, 0xf1, 0x81, 0x63,
+ 0x98, 0xc4, 0xd7, 0x5c, 0x21, 0xef, 0x82, 0x16, 0xc8, 0xe8, 0x47, 0x33,
+ 0xb9, 0xef, 0xa4, 0x3a, 0x42, 0x80, 0xc5, 0x9b, 0x60, 0xe7, 0x20, 0x00,
+ 0xa8, 0x85, 0x80, 0x06, 0x5e, 0x3b, 0x73, 0xf2, 0x3e, 0x28, 0x75, 0x82,
+ 0xce, 0x1c, 0x03, 0xb2, 0xa0, 0x67, 0xe1, 0x9e, 0x65, 0x98, 0x4e, 0x35,
+ 0xc7, 0xa4, 0xb5, 0xae, 0x62, 0x1c, 0xe7, 0x12, 0x0c, 0x01, 0xc7, 0x03,
+ 0x4e, 0xa6, 0x6c, 0x66, 0xd3, 0x2c, 0xa9, 0x12, 0x3a, 0x64, 0xde, 0x11,
+ 0x21, 0x7e, 0xa1, 0x94, 0x35, 0xc7, 0xbf, 0x8c, 0xcb, 0x62, 0x69, 0xe7,
+ 0xde, 0x9c, 0x89, 0x44, 0x4f, 0x5b, 0x7b, 0x39, 0x8c, 0xf4, 0x27, 0x60,
+ 0x79, 0x92, 0x96, 0xad, 0x10, 0xd5, 0x7e, 0x01, 0x8d, 0xd2, 0x03, 0x38,
+ 0xc0, 0x74, 0x6e, 0x2a, 0x0b, 0xf8, 0xc3, 0x8d, 0xad, 0xc1, 0x5e, 0x7b,
+ 0xe6, 0x26, 0xb7, 0x23, 0x70, 0x2f, 0x33, 0xcd, 0x35, 0x4a, 0xec, 0x60,
+ 0x6c, 0x6c, 0x63, 0x18, 0x9e, 0xf9, 0xc6, 0x47, 0x14, 0x86, 0x6c, 0x94,
+ 0xe7, 0x01, 0x52, 0x83, 0x7f, 0x48, 0x00, 0x6a, 0x4c, 0x05, 0x2d, 0x88,
+ 0x1c, 0x9f, 0x8a, 0xb6, 0x21, 0x2d, 0x7b, 0xe8, 0xe9, 0x28, 0x3b, 0xb1,
+ 0x38, 0x61, 0x9f, 0x78, 0xae, 0x8d, 0x53, 0xc2, 0x0f, 0x87, 0x8e, 0xbf,
+ 0x65, 0xec, 0x28, 0x2a, 0x84, 0x00, 0xf8, 0x5b, 0xbe, 0x76, 0x1c, 0xc7,
+ 0x34, 0xbf, 0x0b, 0x2c, 0xf8, 0xcf, 0x8c, 0x2a, 0x62, 0xc9, 0xad, 0xe2,
+ 0x58, 0x70, 0x7f, 0x5c, 0xfc, 0x6f, 0x93, 0xef, 0xb2, 0xc3, 0x57, 0xd3,
+ 0x77, 0xee, 0xde, 0xde, 0xe8, 0xb6, 0xb5, 0x70, 0x1f, 0xff, 0x13, 0x8c,
+ 0xa8, 0x2c, 0x36, 0xd1, 0x3f, 0x08, 0xb7, 0xff, 0xa7, 0x8e, 0xd4, 0x1b,
+ 0xd8, 0x20, 0x7a, 0x8c, 0x67, 0x9c, 0xd8, 0x1e, 0xe9, 0xb2, 0x54, 0x35,
+ 0x9c, 0xec, 0x1c, 0x64, 0xe0, 0xe4, 0xa7, 0x0d, 0xed, 0x61, 0x4c, 0x1d,
+ 0x1d, 0x3b, 0x0a, 0x03, 0x92, 0x44, 0xc7, 0xb0, 0x7d, 0xa9, 0x32, 0x1e,
+ 0xcf, 0x3a, 0x0b, 0x90, 0x74, 0x3b, 0x88, 0x6f, 0x72, 0xc6, 0xdc, 0xde,
+ 0xf8, 0x8f, 0x1d, 0xaf, 0x64, 0x28, 0x8a, 0x9e, 0x89, 0x9b, 0xdc, 0x13,
+ 0x01, 0x2f, 0x8f, 0xb7, 0x93, 0xdf, 0xe0, 0xf0, 0xb5, 0x7b, 0x0f, 0x84,
+ 0x87, 0xf6, 0xc7, 0xd9, 0xa9, 0xce, 0x43, 0x20, 0xe3, 0x23, 0xd3, 0x09,
+ 0xaa, 0x75, 0x5c, 0xcc, 0x89, 0x92, 0x47, 0xe8, 0x78, 0x71, 0x08, 0x20,
+ 0x69, 0x9f, 0xe3, 0x61, 0x72, 0xb7, 0x85, 0x0a, 0xee, 0x01, 0x77, 0x07,
+ 0x78, 0x7b, 0xfa, 0xdb, 0xe2, 0x84, 0xf0, 0xf1, 0x2a, 0x93, 0x2a, 0x6f,
+ 0x8e, 0x6d, 0x5c, 0xa1, 0x34, 0x1f, 0x65, 0x08, 0x6f, 0xf2, 0xed, 0xb0,
+ 0x1e, 0x1b, 0x0e, 0x12, 0x0c, 0x25, 0x3a, 0x18, 0x52, 0xa2, 0x0c, 0x35,
+ 0x73, 0xdc, 0x7f, 0x90, 0x17, 0x77, 0x5a, 0x3e, 0xe9, 0xf7, 0x28, 0x6e,
+ 0xd1, 0xe5, 0xde, 0x85, 0x2b, 0xab, 0x3b, 0xb3, 0x67, 0x15, 0xdc, 0xc3,
+ 0x25, 0x21, 0xe9, 0xb7, 0x93, 0x34, 0x9d, 0x57, 0x8a, 0x6d, 0xa4, 0x4e,
+ 0x17, 0xf1, 0x0a, 0x90, 0xf6, 0x22, 0xaa, 0x6a, 0x69, 0x4c, 0x64, 0x88,
+ 0xbb, 0x11, 0xb3, 0x83, 0xc4, 0xfb, 0x31, 0x61, 0x20, 0x1a, 0x00, 0x00,
+ 0x9c, 0x2d, 0xcf, 0x74, 0xca, 0x93, 0xc3, 0xea, 0x8f, 0x58, 0xcc, 0xf2,
+ 0x46, 0x54, 0x36, 0x1b, 0x9c, 0x0c, 0x27, 0x98, 0x19, 0xb7, 0x24, 0xe9,
+ 0xfb, 0xb6, 0xd8, 0xe4, 0xfc, 0x2c, 0x9b, 0xd0, 0x25, 0x3f, 0xb0, 0xa5,
+ 0x5b, 0x22, 0x31, 0xa2, 0x86, 0xd5, 0x8a, 0xb6, 0x7b, 0xe5, 0x08, 0xcc,
+ 0x10, 0xf7, 0x76, 0xd9, 0x5a, 0x50, 0xc0, 0x17, 0xcc, 0x02, 0xb1, 0x2b,
+ 0x39, 0x84, 0x24, 0x16, 0x5a, 0x17, 0x9f, 0x79, 0x5d, 0x1b, 0x15, 0xd9,
+ 0x95, 0x59, 0xbe, 0x7c, 0x93, 0x5e, 0x2a, 0xf1, 0x60, 0x07, 0xe1, 0xdf,
+ 0xcb, 0x19, 0xa5, 0xf9, 0x32, 0x9e, 0x55, 0x01, 0x65, 0x69, 0x63, 0x77,
+ 0x50, 0xbb, 0x14, 0x2b, 0x0f, 0xc4, 0x54, 0x38, 0x15, 0xac, 0x0d, 0x9f,
+ 0xc9, 0xfb, 0x8d, 0x0f, 0xa2, 0xec, 0xe6, 0x0d, 0x50, 0xf9, 0x68, 0xcb,
+ 0xae, 0xb3, 0xb9, 0xad, 0x95, 0xb1, 0x4a, 0x81, 0x63, 0xcd, 0xb1, 0xd5,
+ 0xa1, 0xda, 0x81, 0x2a, 0xde, 0x08, 0x10, 0x33, 0x66, 0x5f, 0xee, 0x5d,
+ 0xfe, 0x75, 0x27, 0x42, 0x55, 0xcb, 0xb8, 0xb0, 0xca, 0xb0, 0x34, 0x10,
+ 0x00, 0x00, 0x59, 0x2b, 0x97, 0x99, 0xd5, 0x46, 0xca, 0x45, 0x48, 0x39,
+ 0x52, 0x2e, 0xb0, 0xab, 0xbe, 0x89, 0x25, 0x9b, 0x32, 0x5e, 0x8b, 0x4d,
+ 0x09, 0xd4, 0xb4, 0x04, 0xe1, 0x79, 0xd3, 0x48, 0xef, 0x2b, 0x65, 0x8e,
+ 0xeb, 0x59, 0x57, 0x62, 0x93, 0xd3, 0xbb, 0x22, 0x82, 0x0c, 0x66, 0x79,
+ 0xf2, 0x14, 0x54, 0xc6, 0x7a, 0xbd, 0xbe, 0xab, 0x09, 0x02, 0xd9, 0x88,
+ 0xa8, 0x13, 0xc6, 0x8f, 0x30, 0xbf, 0x05, 0xf7, 0xd3, 0x39, 0xcc, 0x18,
+ 0xf6, 0x9c, 0x01, 0xc5, 0x06, 0x70, 0x92, 0x5b, 0x60, 0x1c, 0x09, 0x92,
+ 0xfc, 0xb6, 0xe5, 0x94, 0x04, 0x71, 0xe6, 0x5b, 0xfc, 0x72, 0x80, 0x31,
+ 0x6a, 0x8c, 0x9b, 0x20, 0x9d, 0x50, 0x04, 0xa1, 0xcb, 0xc3, 0xd3, 0x6c,
+ 0x1d, 0x30, 0x1f, 0xa9, 0xba, 0xe4, 0x8d, 0x24, 0xa9, 0xcb, 0x50, 0x01,
+ 0xb7, 0xac, 0xf3, 0x5a, 0x90, 0x5f, 0xae, 0x2a, 0xfe, 0x42, 0xea, 0x8a,
+ 0x86, 0x74, 0x36, 0x39, 0xf2, 0x9e, 0xca, 0x33, 0x26, 0x87, 0x05, 0xac,
+ 0xb6, 0x7d, 0xe8, 0xfa, 0xe5, 0x0d, 0xc2, 0x67, 0x2e, 0xaf, 0xf9, 0xa1,
+ 0x48, 0xe8, 0xbe, 0x82, 0xd1, 0x13, 0xf9, 0x00, 0x82, 0x32, 0x66, 0xe0,
+ 0xb9, 0x54, 0x8a, 0x3d, 0xd6, 0xbb, 0xe8, 0xbb, 0x44, 0xf7, 0x99, 0x5a,
+ 0x22, 0xca, 0x40, 0x71, 0xd8, 0xdb, 0xd6, 0xf3, 0xeb, 0x07, 0x70, 0x8b,
+ 0x72, 0xb1, 0x58, 0x17, 0xbb, 0xbf, 0x35, 0x37, 0x0f, 0x33, 0xcb, 0xb1,
+ 0x70, 0xa5, 0x79, 0x5c, 0x6e, 0xda, 0x1e, 0x29, 0x30, 0x7a, 0x00, 0x50,
+ 0x8e, 0xd8, 0xcb, 0xd6, 0x99, 0xa5, 0x4a, 0x25, 0x4f, 0x69, 0xd5, 0xf2,
+ 0xd7, 0x8c, 0x74, 0xa3, 0x79, 0x5a, 0x70, 0xbf, 0x5c, 0x4b, 0xa1, 0xad,
+ 0xb3, 0x0a, 0x59, 0xaa, 0x12, 0x39, 0x30, 0xb2, 0x1e, 0xd9, 0xde, 0x71,
+ 0x51, 0x3e, 0xde, 0x9f, 0xef, 0x22, 0x38, 0x13, 0xf3, 0x06, 0xcd, 0x69,
+ 0xeb, 0x0c, 0xdc, 0x35, 0x2f, 0x4b, 0x46, 0x13, 0xb4, 0xb7, 0x5e, 0xe4,
+ 0x5b, 0x8f, 0x07, 0x19, 0x50, 0x39, 0xff, 0x4c, 0x85, 0x67, 0xda, 0x37,
+ 0x08, 0x5c, 0x1e, 0x46, 0xd3, 0x18, 0xd6, 0x8e, 0x21, 0x61, 0x24, 0x81,
+ 0x3c, 0x8a, 0x9b, 0xc8, 0x5b, 0x76, 0xd6, 0x57, 0x98, 0x5e, 0xa1, 0xa3,
+ 0xe5, 0xa7, 0x3d, 0x35, 0x1f, 0xf4, 0x11, 0xe0, 0x22, 0x14, 0x0d, 0x69,
+ 0xe6, 0x8d, 0xe8, 0x35, 0x31, 0x4a, 0xcf, 0xe9, 0xa7, 0xb2, 0xd7, 0xf5,
+ 0x64, 0x7d, 0xb2, 0x18, 0x51, 0x76, 0x9a, 0xed, 0x87, 0xff, 0x0f, 0x13,
+ 0x12, 0x1d, 0x29, 0x50, 0x3d, 0x61, 0xc8, 0x24, 0x17, 0x12, 0x8b, 0x75,
+ 0xa3, 0xb5, 0x54, 0x8c, 0xb6, 0xa2, 0xf0, 0x8c, 0x6e, 0x11, 0x24, 0x59,
+ 0xa4, 0xaf, 0xa4, 0x2a, 0xd4, 0xf2, 0xf9, 0xc5, 0x78, 0xef, 0x60, 0x1f,
+ 0x0e, 0x14, 0xc4, 0xe9, 0xd6, 0x07, 0xc4, 0xb0, 0x75, 0xe9, 0xbf, 0xbc,
+ 0xa1, 0x4c, 0xa0, 0x9b, 0xdc, 0x51, 0xce, 0xc5, 0x97, 0x09, 0x79, 0x01,
+ 0x27, 0xf8, 0x1d, 0x38, 0x21, 0xb1, 0x61, 0xa3, 0xf9, 0x08, 0xdd, 0xbc,
+ 0xa1, 0xaf, 0x7a, 0xa7, 0x6d, 0x5f, 0x3a, 0x75, 0xbc, 0x1c, 0xf7, 0x3d,
+ 0xe3, 0xc9, 0x4a, 0xdc, 0x62, 0x42, 0xf3, 0x5d, 0xe5, 0xd5, 0xa8, 0x42,
+ 0x1f, 0xb2, 0x43, 0x67, 0x9c, 0xd4, 0xf1, 0x9b, 0xfc, 0x89, 0xca, 0x4f,
+ 0xd8, 0xe5, 0x12, 0x07, 0xeb, 0x88, 0x2e, 0x03, 0x49, 0x44, 0x6b, 0x4c,
+ 0xac, 0x21, 0xa4, 0x69, 0x42, 0x62, 0x1b, 0xd5, 0xb2, 0xe9, 0xbd, 0x33,
+ 0x1e, 0x89, 0x8f, 0xbb, 0xdd, 0x38, 0x53, 0x4b, 0x01, 0x66, 0x1b, 0x46,
+ 0x1a, 0xdb, 0x82, 0x66, 0x53, 0x93, 0xe4, 0xac, 0x22, 0x06, 0x33, 0x85,
+ 0xa3, 0x63, 0xb2, 0xaf, 0xac, 0x4b, 0xee, 0x3f, 0xab, 0xbe, 0x86, 0x09,
+ 0x3f, 0x94, 0xcd, 0x46, 0x11, 0x9a, 0xd2, 0x2c, 0xf3, 0xcf, 0xc5, 0xdf,
+ 0x29, 0xcc, 0xe6, 0xcc, 0xc3, 0x6d, 0x58, 0xa4, 0xaa, 0xf7, 0xa3, 0x40,
+ 0x14, 0x69, 0x03, 0xa4, 0xf8, 0x79, 0x68, 0xe4, 0x0b, 0x72, 0xcb, 0xd5,
+ 0xa0, 0x59, 0x63, 0xe6, 0x82, 0xe8, 0x46, 0xe6, 0x6c, 0xe3, 0x40, 0x76,
+ 0x66, 0x0d, 0x17, 0xa3, 0x9e, 0x68, 0x7d, 0xc4, 0x15, 0x7a, 0x91, 0xff,
+ 0xcd, 0xc5, 0xd7, 0x7e, 0x68, 0xb4, 0x24, 0x70, 0xd5, 0x10, 0x40, 0xdd,
+ 0xfc, 0x46, 0x67, 0xca, 0x12, 0x9d, 0x0a, 0x70, 0x12, 0xf8, 0x76, 0x82,
+ 0xb6, 0xb1, 0x11, 0xbf, 0x9c, 0xcb, 0x9b, 0xbc, 0x48, 0x70, 0x73, 0x7b,
+ 0x62, 0x96, 0xb6, 0x5e, 0xfc, 0xfd, 0x86, 0xf8, 0xe4, 0x30, 0xe6, 0x17,
+ 0x24, 0x4e, 0x16, 0x25, 0x35, 0xdb, 0xa0, 0xe1, 0x94, 0x98, 0x21, 0xc1,
+ 0xbd, 0x81, 0x7c, 0x28, 0xf9, 0x30, 0x5c, 0x65, 0x3f, 0xa0, 0x9d, 0x15,
+ 0xd1, 0xf7, 0x24, 0x34, 0x9a, 0xb7, 0x87, 0xf7, 0xb6, 0x41, 0x89, 0xaf,
+ 0x01, 0xdf, 0x6a, 0x25, 0x57, 0x9f, 0x8b, 0xd1, 0x84, 0x38, 0x79, 0x4a,
+ 0x6b, 0xb8, 0x0d, 0xec, 0xfe, 0xaf, 0xa3, 0xd9, 0x8a, 0x71, 0x22, 0x16,
+ 0xd6, 0xa2, 0x51, 0x70, 0xc7, 0x35, 0x2a, 0xfb, 0x49, 0x15, 0xa5, 0x85,
+ 0x24, 0xfd, 0xa6, 0x5a, 0x0a, 0x09, 0x1b, 0x62, 0xfc, 0xa4, 0x4a, 0xd1,
+ 0x42, 0xe4, 0x7a, 0x3c, 0xe0, 0xb9, 0x92, 0xda, 0x2b, 0x8e, 0xa4, 0x7b,
+ 0xe8, 0x48, 0x0f, 0x1f, 0x69, 0x41, 0xfe, 0xbb, 0xb8, 0x2c, 0xa0, 0x47,
+ 0xe9, 0x8a, 0x98, 0x32, 0x39, 0xb2, 0xba, 0xab, 0x6e, 0x70, 0xce, 0x0a,
+ 0x7a, 0x56, 0xd4, 0x6e, 0xee, 0x98, 0xb1, 0xb5, 0x0c, 0xed, 0x3d, 0x49,
+ 0xbd, 0x18, 0x26, 0x8b, 0x5c, 0x84, 0xef, 0x19, 0xbe, 0x45, 0xbb, 0x61,
+ 0xef, 0xd0, 0xc8, 0x9f, 0x36, 0xcc, 0x9d, 0xeb, 0xd4, 0x9d, 0x17, 0x28,
+ 0x73, 0x63, 0x82, 0xe4, 0xc2, 0xec, 0x77, 0x62, 0xe2, 0x80, 0x34, 0xfe,
+ 0x92, 0x89, 0xc6, 0xa1, 0x6f, 0x21, 0xce, 0x87, 0x83, 0x41, 0x67, 0x2b,
+ 0xdc, 0x98, 0x48, 0x65, 0x13, 0x06, 0x45, 0xc4, 0x15, 0x27, 0x52, 0x88,
+ 0x74, 0x9c, 0x60, 0x23, 0x2d, 0x6c, 0x5a, 0x40, 0x7f, 0xa1, 0x0f, 0x40,
+ 0x86, 0xa3, 0x22, 0x81, 0x6d, 0xd7, 0xff, 0x9a, 0x8c, 0x52, 0xd7, 0x51,
+ 0x0d, 0xc5, 0x1a, 0x64, 0x58, 0x9f, 0x16, 0x31, 0xb6, 0x95, 0x48, 0x59,
+ 0xe7, 0xa4, 0xe4, 0x87, 0xd6, 0x11, 0xb9, 0xc4, 0xd2, 0x76, 0xb8, 0xcf,
+ 0xcc, 0x5e, 0x93, 0xb2, 0x4d, 0x05, 0x1d, 0xff, 0x08, 0x94, 0xbc, 0x35,
+ 0xc8, 0x16, 0x1c, 0xf9, 0x8c, 0x2d, 0x79, 0xfc, 0xe3, 0x63, 0x67, 0xbe,
+ 0x99, 0xad, 0xfb, 0xce, 0xea, 0x02, 0x9d, 0xb8, 0xaa, 0x90, 0xc9, 0x28,
+ 0xd2, 0x08, 0xce, 0xc9, 0x2d, 0x85, 0x07, 0x9b, 0x6b, 0x6f, 0x28, 0x9f,
+ 0x9d, 0xe1, 0xae, 0x6e, 0x0f, 0x63, 0xaa, 0xd0, 0x79, 0xe6, 0x0b, 0xe9,
+ 0xbe, 0xea, 0x99, 0x3a, 0x48, 0x28, 0xe3, 0xe3, 0x3a, 0x09, 0x19, 0x29,
+ 0xd7, 0x89, 0xbe, 0xe9, 0x3d, 0x16, 0x7a, 0x58, 0xf7, 0x06, 0xbe, 0xff,
+ 0x90, 0x30, 0xf5, 0x12, 0xb0, 0xcb, 0xc1, 0xbe, 0x83, 0xcc, 0x10, 0xff,
+ 0x07, 0x35, 0x0f, 0x5b, 0x3e, 0x56, 0xcd, 0x29, 0x9f, 0x0e, 0xad, 0xb0,
+ 0x11, 0x58, 0xda, 0xb7, 0xe4, 0x3e, 0x7b, 0x57, 0xb6, 0x8c, 0x40, 0x63,
+ 0x38, 0x4f, 0xa3, 0xa1, 0x27, 0x86, 0xfe, 0xe0, 0x19, 0x15, 0x58, 0xac,
+ 0xae, 0x69, 0x4f, 0x17, 0x0e, 0x90, 0x7b, 0x68, 0xde, 0x58, 0x96, 0xac,
+ 0x33, 0x4a, 0x0d, 0x8f, 0xb0, 0x0c, 0x72, 0x43, 0xd5, 0x21, 0x15, 0x74,
+ 0x78, 0x8b, 0x90, 0x44, 0x74, 0xf6, 0xb5, 0x9f, 0x3f, 0xab, 0xfa, 0xb3,
+ 0x38, 0x9b, 0xe3, 0x87, 0x2d, 0xff, 0x97, 0xd3, 0x24, 0xf9, 0x1d, 0x3e,
+ 0xac, 0xb4, 0x3d, 0x07, 0xec, 0x23, 0x8e, 0x33, 0x06, 0x62, 0xa4, 0xad,
+ 0x37, 0x31, 0x07, 0x2e, 0xd5, 0x3e, 0x24, 0xb5, 0x53, 0xc5, 0x79, 0x03,
+ 0xe4, 0x91, 0x0e, 0xda, 0xae, 0x45, 0xb7, 0x9c, 0xb2, 0x11, 0x7e, 0xef,
+ 0x83, 0x5a, 0xea, 0xbc, 0x48, 0xba, 0xb5, 0x61, 0x7d, 0x67, 0x86, 0x75,
+ 0xbe, 0x78, 0x08, 0x2c, 0xb2, 0x65, 0x16, 0x6d, 0x03, 0xeb, 0x7b, 0x1b,
+ 0x24, 0xa3, 0xc6, 0xbb, 0x4d, 0xa8, 0xd7, 0x40, 0x72, 0xbe, 0x04, 0x3f,
+ 0x81, 0x03, 0xdb, 0x96, 0xdf, 0xaf, 0xe8, 0x33, 0x9c, 0xa2, 0xea, 0x4e,
+ 0x0e, 0x81, 0xb0, 0x10, 0x9f, 0x96, 0x32, 0xc4, 0x70, 0xd3, 0x03, 0x19,
+ 0x81, 0x62, 0x16, 0x8d, 0xa5, 0xe4, 0xc1, 0x68, 0x2d, 0xe7, 0xda, 0x00,
+ 0x3f, 0x3d, 0x8e, 0x54, 0x55, 0x88, 0xbe, 0x66, 0x13, 0x72, 0x9d, 0x17,
+ 0x59, 0xe5, 0x31, 0x60, 0x29, 0x15, 0xdd, 0x95, 0x5e, 0x42, 0x09, 0x11,
+ 0xb9, 0x27, 0x8b, 0x9f, 0xdc, 0xae, 0x45, 0xb7, 0x1b, 0xe1, 0x35, 0xf8,
+ 0xee, 0x2d, 0x1f, 0xef, 0x40, 0x56, 0x8b, 0xc1, 0xee, 0xca, 0x32, 0x33,
+ 0x9a, 0x9e, 0xc7, 0x7b, 0xa6, 0xd1, 0xb9, 0xc3, 0x2b, 0xa9, 0x10, 0xa2,
+ 0x3f, 0xc4, 0x85, 0x03, 0x49, 0x34, 0x48, 0x17, 0x0d, 0x02, 0x81, 0x83,
+ 0x19, 0x2f, 0x0a, 0xaa, 0x41, 0x05, 0x81, 0x53, 0xb6, 0xc6, 0xb4, 0x2c,
+ 0x6d, 0x52, 0x23, 0x15, 0x96, 0xd7, 0x45, 0xf3, 0xde, 0xcd, 0x1f, 0x5c,
+ 0xf2, 0xf0, 0x80, 0x88, 0xe8, 0x0a, 0x28, 0xd6, 0x9f, 0x55, 0xb8, 0x9a,
+ 0xce, 0x24, 0x24, 0x32, 0x67, 0xb4, 0x71, 0x93, 0xac, 0xf9, 0x4e, 0x1b,
+ 0xfc, 0x54, 0x78, 0xee, 0x62, 0x71, 0xa6, 0xd0, 0xb0, 0x3a, 0x8d, 0x5f,
+ 0x24, 0xc1, 0x32, 0x22, 0xe0, 0x98, 0xb1, 0x12, 0xe3, 0xbf, 0x33, 0xa3,
+ 0x31, 0xe3, 0xf1, 0xa4, 0x91, 0xae, 0xff, 0xc6, 0xdd, 0x6a, 0x94, 0x7b,
+ 0xd1, 0x72, 0xb4, 0x50, 0x83, 0x5e, 0xa9, 0x58, 0x12, 0x5b, 0x18, 0xa2,
+ 0x34, 0x93, 0xf7, 0x47, 0x93, 0x58, 0xd9, 0xe2, 0x76, 0x85, 0x21, 0x6f,
+ 0xb1, 0x10, 0xa0, 0x9e, 0x7e, 0x0c, 0x2b, 0x68, 0x72, 0x16, 0x18, 0x6d,
+ 0x69, 0x29, 0xf8, 0xa6, 0xba, 0x60, 0x91, 0xbc, 0x50, 0x98, 0x54, 0x69,
+ 0xd3, 0xba, 0x7c, 0x1d, 0x65, 0x0f, 0xbf, 0x26, 0xa1, 0x0d, 0x07, 0x05,
+ 0x21, 0xa0, 0x1d, 0xe1, 0xec, 0x53, 0x22, 0x00, 0x16, 0x82, 0xaa, 0x23,
+ 0x14, 0xd8, 0xb1, 0xea, 0x5f, 0x74, 0xe1, 0x0d, 0xf7, 0x32, 0x9b, 0x7f,
+ 0xd0, 0xc8, 0xa5, 0x5e, 0x24, 0xd1, 0x79, 0x58, 0x55, 0x56, 0x32, 0x5a,
+ 0xb1, 0xd9, 0x66, 0x21, 0x65, 0x17, 0x80, 0x15, 0x3b, 0x67, 0xa7, 0x95,
+ 0x6c, 0x92, 0x71, 0x3f, 0xc2, 0x2b, 0x0e, 0xc8, 0x1e, 0x62, 0xdc, 0x01,
+ 0x2a, 0xb6, 0xd7, 0x31, 0x80, 0x5a, 0x0e, 0xe2, 0x4d, 0x19, 0xd0, 0x89,
+ 0x8f, 0x31, 0xa9, 0x02, 0xf5, 0x68, 0xa5, 0x5f, 0x5d, 0xc4, 0x18, 0x53,
+ 0xd6, 0xad, 0x47, 0x52, 0xa9, 0xba, 0x56, 0xeb, 0xec, 0xe4, 0x0e, 0x8d,
+ 0x84, 0x1b, 0x2b, 0x81, 0xf2, 0xbf, 0x2f, 0xc5, 0x44, 0x75, 0xbb, 0x45,
+ 0x17, 0xbc, 0x6c, 0x06, 0x72, 0x19, 0xa8, 0xa8, 0x1d, 0x19, 0x61, 0x50,
+ 0x4e, 0xcc, 0xf9, 0x9d, 0x34, 0xbd, 0x5e, 0x47, 0x44, 0xf7, 0x7e, 0x2f,
+ 0x87, 0x39, 0x46, 0xb6, 0x1d, 0xf1, 0x2e, 0xc4, 0x82, 0x70, 0x42, 0x0e,
+ 0x0d, 0x98, 0x57, 0x19, 0xa1, 0x72, 0x2f, 0x70, 0xae, 0x3b, 0x9b, 0xc9,
+ 0x1e, 0xe2, 0x8f, 0x5f, 0x50, 0x0e, 0x53, 0xb6, 0x7c, 0x37, 0xc6, 0x4b,
+ 0xa5, 0xe4, 0xe5, 0x25, 0x3e, 0xac, 0xca, 0x43, 0xc5, 0x86, 0x53, 0x41,
+ 0xa1, 0x0f, 0x32, 0x66, 0x6d, 0xae, 0x4a, 0xa0, 0xc6, 0xe3, 0xc9, 0xe4,
+ 0x7e, 0xe9, 0xe3, 0xb8, 0xb1, 0xe1, 0xff, 0x7a, 0xb5, 0x2c, 0xf5, 0x43,
+ 0x35, 0xd3, 0x82, 0x33, 0xfd, 0x1a, 0x36, 0x9c, 0x77, 0xec, 0xc4, 0x4d,
+ 0xf6, 0xb6, 0x21, 0x67, 0xcc, 0xfc, 0xaf, 0x70, 0xf7, 0x5f, 0x41, 0x3b,
+ 0xff, 0x82, 0x24, 0x6e, 0x13, 0xcb, 0x17, 0xae, 0x74, 0x29, 0xa8, 0xea,
+ 0x62, 0xcd, 0xd1, 0xa3, 0xbc, 0x31, 0xfe, 0x03, 0x3c, 0x63, 0x97, 0xec,
+ 0x5a, 0x72, 0x15, 0x41, 0x63, 0x7c, 0xf5, 0xf7, 0x2f, 0x3f, 0x2d, 0x3a,
+ 0x69, 0x6b, 0x0c, 0xb0, 0x82, 0x90, 0xaf, 0x8e, 0x47, 0xa7, 0xab, 0x0a,
+ 0x96, 0xf9, 0x3d, 0x2f, 0xc5, 0xd3, 0x96, 0xb5, 0xe4, 0x8a, 0xe9, 0x20,
+ 0x12, 0x7a, 0x68, 0x36, 0x28, 0xaf, 0xa9, 0xd6, 0xb4, 0xd0, 0x03, 0x05,
+ 0xdb, 0x31, 0x4c, 0x71, 0xc0, 0xc2, 0x74, 0x39, 0x88, 0x0d, 0x78, 0x6c,
+ 0x15, 0xac, 0x4b, 0xf7, 0xe6, 0xe2, 0x8f, 0xc5, 0x1d, 0x6b, 0x1c, 0xbf,
+ 0x36, 0x4d, 0x06, 0xd6, 0x77, 0xc7, 0x2a, 0x0f, 0x07, 0xe3, 0x41, 0x28,
+ 0xef, 0x4c, 0xb4, 0x09, 0x4e, 0xb1, 0x53, 0xe1, 0x5b, 0xfc, 0x05, 0xd6,
+ 0xd1, 0x26, 0x71, 0x11, 0xd3, 0x26, 0x9f, 0x46, 0x97, 0x9f, 0x5c, 0x58,
+ 0x1b, 0x1d, 0x7a, 0x74, 0x66, 0x18, 0x5a, 0x6b, 0x58, 0x4e, 0xea, 0x74,
+ 0xfe, 0x16, 0x53, 0x62, 0xea, 0xfd, 0xdc, 0x22, 0x0a, 0x36, 0x5e, 0x7e,
+ 0xb5, 0x8e, 0xba, 0x57, 0xb3, 0x01, 0xb8, 0x32, 0xdd, 0x11, 0xb3, 0xdd,
+ 0x4a, 0x53, 0x17, 0xbb, 0x84, 0x5d, 0x50, 0xad, 0x48, 0x44, 0x6a, 0xfc,
+ 0x74, 0x0b, 0xca, 0xf5, 0x00, 0x47, 0x0d, 0x8a, 0x45, 0xed, 0x6e, 0x5b,
+ 0x9e, 0x16, 0x27, 0xee, 0x8a, 0x7b, 0x06, 0x1c, 0xfc, 0xec, 0x99, 0x85,
+ 0xda, 0x91, 0x88, 0xc4, 0x96, 0xf2, 0x02, 0xc2, 0xf7, 0x0e, 0x8b, 0xd1,
+ 0x86, 0x3b, 0x8d, 0x62, 0x52, 0xef, 0xc6, 0x42, 0xe0, 0x2d, 0x47, 0x83,
+ 0xea, 0xfd, 0x2e, 0xf4, 0x73, 0x39, 0xdd, 0xf7, 0x33, 0x9a, 0x9d, 0xca,
+ 0xc7, 0x63, 0x06, 0xf7, 0x84, 0x1a, 0x4a, 0xa8, 0xf2, 0x3c, 0x78, 0x40,
+ 0x67, 0xef, 0x14, 0x2c, 0xf4, 0x66, 0xad, 0x41, 0x08, 0x55, 0x2b, 0xf8,
+ 0xec, 0xab, 0xe5, 0x8b, 0xa1, 0x1d, 0x3d, 0x9a, 0xd7, 0x20, 0x95, 0x9d,
+ 0x28, 0xf0, 0x2f, 0x0f, 0x34, 0x61, 0xdb, 0xf2, 0xa2, 0x12, 0x8b, 0x65,
+ 0x3d, 0xe0, 0xf4, 0x09, 0x07, 0x11, 0xe0, 0x97, 0x45, 0xaa, 0x5e, 0x66,
+ 0xdc, 0x0e, 0x50, 0x19, 0x37, 0x6b, 0xeb, 0x35, 0x95, 0x06, 0x1d, 0x7d,
+ 0xf2, 0xc2, 0x2d, 0xa7, 0xee, 0x4a, 0x4e, 0x33, 0x99, 0xce, 0x0d, 0xa4,
+ 0x9b, 0x4a, 0xb6, 0xc8, 0x2c, 0x62, 0xb9, 0x22, 0x3f, 0x18, 0x8d, 0xc3,
+ 0x4a, 0xfb, 0xf0, 0x12, 0x6f, 0x36, 0xbd, 0xa5, 0x1c, 0x80, 0xc8, 0xe6,
+ 0xfa, 0x89, 0x20, 0x7d, 0xa7, 0xa1, 0xf7, 0x53, 0x32, 0xa4, 0x7e, 0xf5,
+ 0x90, 0xe1, 0xef, 0x81, 0xb8, 0x9d, 0xea, 0x6c, 0x3a, 0x6e, 0x31, 0xe5,
+ 0x1c, 0x03, 0xec, 0xd8, 0x5b, 0xbf, 0xdd, 0xbe, 0xbb, 0x78, 0x29, 0xd7,
+ 0xc3, 0x29, 0xfe, 0x23, 0x6c, 0x17, 0xbe, 0x5a, 0x5a, 0x94, 0x32, 0xbf,
+ 0xed, 0x0a, 0x1f, 0x40, 0x67, 0x68, 0x7a, 0x80, 0xe4, 0x9d, 0xd2, 0xed,
+ 0x64, 0x1e, 0x9c, 0xac, 0x91, 0x03, 0x5b, 0x62, 0xeb, 0x49, 0xed, 0x1c,
+ 0xcb, 0x3c, 0x4b, 0x8c, 0x40, 0xb6, 0xbc, 0x5f, 0x13, 0x53, 0x24, 0xb3,
+ 0x50, 0x6c, 0x36, 0xcf, 0xeb, 0xab, 0x8c, 0xfd, 0x65, 0x44, 0x68, 0x28,
+ 0x6b, 0x8c, 0x08, 0x73, 0x96, 0x89, 0x9d, 0x02, 0xe5, 0xa4, 0xaa, 0x36,
+ 0x6c, 0xfc, 0x5d, 0x19, 0x0a, 0xd5, 0x57, 0xc7, 0x1d, 0x6b, 0xc3, 0xf2,
+ 0x62, 0x12, 0xe0, 0x2a, 0xcf, 0xec, 0xcd, 0x10, 0x9b, 0x14, 0x00, 0xd2,
+ 0x4e, 0xb9, 0xe4, 0xef, 0x42, 0x3b, 0x56, 0x90, 0x59, 0x7c, 0x9e, 0xf8,
+ 0xbe, 0x58, 0xa8, 0x7a, 0x7a, 0x11, 0x0e, 0x8e, 0x85, 0xae, 0x81, 0x2b,
+ 0x93, 0xe7, 0xea, 0x34, 0xa0, 0xfb, 0x8d, 0x13, 0x7f, 0x35, 0x31, 0x95,
+ 0x70, 0x76, 0xb9, 0x67, 0x0b, 0x90, 0x32, 0xe0, 0xa8, 0xbb, 0x6e, 0x1c,
+ 0x1c, 0x8f, 0xe8, 0x04, 0xc3, 0x54, 0xca, 0xb7, 0xc4, 0xd0, 0x2a, 0x38,
+ 0xa8, 0x7d, 0xa6, 0x8f, 0x71, 0xe2, 0x54, 0xa1, 0xce, 0x8d, 0x03, 0xa4,
+ 0x02, 0x34, 0x6f, 0x8c, 0xed, 0x18, 0x45, 0x60, 0xbb, 0xc0, 0x8c, 0xed,
+ 0x12, 0xdf, 0xa5, 0xbe, 0x4d, 0xa5, 0x13, 0x23, 0x8c, 0x4f, 0xc9, 0xb6,
+ 0x61, 0xc3, 0xb6, 0x25, 0x25, 0xd5, 0x03, 0x35, 0x6a, 0x87, 0xe7, 0x99,
+ 0x2f, 0x52, 0xc5, 0x87, 0x40, 0x88, 0xb4, 0xec, 0x97, 0x1b, 0xf4, 0xa1,
+ 0x0f, 0xa9, 0x07, 0xe0, 0xb0, 0x86, 0x2c, 0x0a, 0x07, 0x85, 0xac, 0x40,
+ 0x9a, 0x2a, 0x17, 0xb8, 0xc2, 0x3f, 0xeb, 0x4c, 0x2c, 0xcd, 0xb4, 0x02,
+ 0x2f, 0xd1, 0xd3, 0x82, 0x5d, 0xb1, 0x79, 0xd6, 0xf0, 0x79, 0xd0, 0x28,
+ 0xfc, 0x0a, 0x8d, 0x19, 0x42, 0xfe, 0x68, 0x7b, 0xee, 0xc1, 0x64, 0x0c,
+ 0x33, 0x0a, 0x96, 0x76, 0xee, 0x8a, 0xb4, 0xbf, 0xed, 0x8f, 0x51, 0x1e,
+ 0x6b, 0xcb, 0xee, 0x9e, 0xba, 0x41, 0x1a, 0xba, 0x4f, 0x22, 0xdf, 0xda,
+ 0x92, 0xc1, 0x62, 0x05, 0x81, 0x45, 0x9b, 0x74, 0xdf, 0x4f, 0xd4, 0xe3,
+ 0x96, 0xcd, 0x55, 0x06, 0xf6, 0x37, 0x68, 0xae, 0xb9, 0x7d, 0x2c, 0xd9,
+ 0x53, 0xb6, 0x55, 0x0c, 0x59, 0x79, 0xdc, 0x18, 0x69, 0x02, 0x84, 0x2c,
+ 0x35, 0x75, 0x13, 0x83, 0xf6, 0x59, 0x31, 0x2d, 0xd5, 0xf9, 0x12, 0xfb,
+ 0x3f, 0xb9, 0x40, 0x4b, 0xac, 0x19, 0x2d, 0x0d, 0xac, 0x42, 0x4a, 0x31,
+ 0x7a, 0x10, 0xa5, 0xa7, 0x9b, 0xf6, 0x17, 0x78, 0x5b, 0x31, 0x9c, 0xec,
+ 0x46, 0x1f, 0xde, 0xf1, 0x83, 0x3f, 0x05, 0x15, 0x84, 0x84, 0xee, 0x02,
+ 0x35, 0x5e, 0x6a, 0x75, 0x3e, 0x31, 0x5d, 0x44, 0xd3, 0xe4, 0xfd, 0x5f,
+ 0xb6, 0xda, 0x77, 0x0c, 0x6e, 0x32, 0xaf, 0xea, 0x36, 0x34, 0x8e, 0x13,
+ 0x77, 0x7c, 0x6e, 0x39, 0xfe, 0xd3, 0x8a, 0x16, 0x2d, 0x88, 0xae, 0x41,
+ 0xc5, 0x54, 0x39, 0x56, 0x2f, 0xde, 0x65, 0x1b, 0x2d, 0x2b, 0x44, 0x27,
+ 0x6d, 0xb7, 0x79, 0xf9, 0x10, 0x7f, 0x39, 0xb4, 0x08, 0xca, 0x3f, 0xcc,
+ 0xf3, 0x6c, 0x21, 0xec, 0xd2, 0xdc, 0x48, 0x45, 0x34, 0xae, 0x5d, 0x67,
+ 0xd8, 0xb1, 0x7b, 0xd5, 0xad, 0xb1, 0x08, 0x0e, 0x2d, 0xc3, 0xbc, 0xd5,
+ 0x31, 0xb6, 0x52, 0x42, 0x67, 0x48, 0x82, 0x24, 0x60, 0xf5, 0x5b, 0x4b,
+ 0x77, 0xc7, 0x2e, 0xdd, 0x0a, 0xed, 0x39, 0x03, 0x03, 0x2a, 0xb3, 0x25,
+ 0xe3, 0xd8, 0x40, 0x28, 0x5e, 0x96, 0xd7, 0xae, 0x95, 0x14, 0x00, 0xe9,
+ 0x1f, 0xbe, 0x1b, 0x73, 0x6a, 0x93, 0xba, 0xb4, 0x96, 0xd8, 0x7d, 0x26,
+ 0x16, 0xdb, 0xb2, 0xed, 0x96, 0xdb, 0xc4, 0x7e, 0x9a, 0x9f, 0x4b, 0xc5,
+ 0x63, 0x0e, 0x38, 0x15, 0xa2, 0x00, 0x18, 0xaa, 0xdd, 0x80, 0x1d, 0xfc,
+ 0x3c, 0x1a, 0xe6, 0x00, 0x0d, 0x11, 0x4c, 0x47, 0x68, 0xb6, 0x0b, 0xb7,
+ 0x8e, 0x3a, 0x0a, 0x8b, 0xf2, 0x43, 0xec, 0xb7, 0xfe, 0xb9, 0xec, 0x37,
+ 0xab, 0xf8, 0x38, 0x47, 0x6e, 0xcd, 0xfb, 0x36, 0x7c, 0x05, 0xb2, 0xde,
+ 0x9d, 0xee, 0x47, 0x8a, 0x3f, 0xb6, 0x67, 0x43, 0x1f, 0xfa, 0xf6, 0x86,
+ 0x8e, 0xb4, 0x60, 0x01, 0x23, 0x1a, 0xd7, 0x99, 0x0e, 0xe7, 0xb6, 0x71,
+ 0x24, 0x77, 0x44, 0xd7, 0xe3, 0xac, 0x52, 0xb6, 0xad, 0x7c, 0xab, 0x08,
+ 0x1b, 0x78, 0x1e, 0x7f, 0x0a, 0xda, 0x3c, 0x64, 0xc5, 0xdd, 0x78, 0x7a,
+ 0x7a, 0x14, 0xf6, 0x7f, 0xe1, 0x47, 0x4e, 0x9d, 0xff, 0x51, 0x10, 0x22,
+ 0x56, 0x8e, 0xfe, 0x09, 0x03, 0xa0, 0x9e, 0x08, 0x40, 0x91, 0x7c, 0x41,
+ 0x63, 0xec, 0xb7, 0xe5, 0xb8, 0xdf, 0x2a, 0xbf, 0xc3, 0xf4, 0x0e, 0x03,
+ 0xa8, 0x1c, 0x4e, 0x8b, 0xbb, 0x5a, 0x08, 0x3c, 0x88, 0x6e, 0xb7, 0x3d,
+ 0x23, 0x1f, 0xc8, 0xec, 0x47, 0x8a, 0x88, 0x97, 0x8d, 0x9b, 0x5f, 0xa0,
+ 0xd1, 0x9e, 0x5e, 0xf9, 0x98, 0x22, 0xee, 0xdd, 0x28, 0xdb, 0x1e, 0x98,
+ 0xec, 0xc3, 0xd3, 0x5f, 0x8e, 0x58, 0xcf, 0x22, 0x4d, 0xc4, 0x03, 0xaa,
+ 0x3f, 0xbb, 0x10, 0x7f, 0x58, 0x61, 0xce, 0x01, 0xc6, 0x13, 0x94, 0x66,
+ 0x71, 0xaf, 0xa0, 0xbe, 0x3a, 0x02, 0xeb, 0x14, 0xb5, 0x77, 0xb3, 0xde,
+ 0xda, 0xfb, 0x9a, 0x7d, 0xcf, 0x0d, 0x09, 0xd4, 0x63, 0x69, 0xeb, 0x49,
+ 0x43, 0xf8, 0x4d, 0x06, 0x5d, 0x73, 0xed, 0xc9, 0xbe, 0x56, 0x13, 0x15,
+ 0xb2, 0x79, 0x5f, 0x1a, 0x58, 0x23, 0x9c, 0xcf, 0x54, 0x61, 0x23, 0xff,
+ 0x2e, 0x83, 0x87, 0xdb, 0xf6, 0x84, 0x2c, 0x84, 0xb1, 0x64, 0xcc, 0x7b,
+ 0x4c, 0x9d, 0x88, 0x67, 0xb3, 0x88, 0x26, 0x70, 0x23, 0xd2, 0x6a, 0x02,
+ 0x0f, 0xcf, 0xd9, 0xb9, 0x47, 0x6c, 0xee, 0x5a, 0x65, 0x5f, 0x6a, 0x66,
+ 0x5b, 0x15, 0x1d, 0xd7, 0x46, 0xe1, 0x84, 0x28, 0xef, 0x0b, 0xaa, 0xbf,
+ 0xc3, 0x63, 0x6c, 0x6e, 0x88, 0x14, 0x78, 0x14, 0x2b, 0x20, 0xac, 0x26,
+ 0x1a, 0x70, 0x0e, 0xd0, 0x0f, 0x9a, 0x65, 0x36, 0xb3, 0x9d, 0x30, 0x19,
+ 0x14, 0x4b, 0xae, 0x46, 0x2d, 0x82, 0x77, 0xea, 0x50, 0xb0, 0xb3, 0x24,
+ 0xb5, 0xba, 0x16, 0xf0, 0x95, 0x2c, 0x4e, 0xe8, 0xfc, 0xeb, 0xc1, 0x78,
+ 0xc4, 0x35, 0x50, 0x61, 0xcd, 0x29, 0x81, 0x1b, 0x16, 0x6d, 0xcd, 0xa5,
+ 0xd5, 0x3a, 0xeb, 0xf3, 0x9a, 0xf9, 0xc8, 0x18, 0xbe, 0xcd, 0xd6, 0x10,
+ 0x0f, 0x61, 0x38, 0xe0, 0x28, 0x47, 0xed, 0x53, 0x86, 0xd2, 0xf4, 0xf4,
+ 0xda, 0x45, 0x64, 0xb9, 0xbf, 0x84, 0x71, 0xd0, 0x13, 0x56, 0x7c, 0xe0,
+ 0x5b, 0xca, 0x9f, 0x18, 0x5a, 0x2b, 0xb4, 0x8a, 0x7b, 0xe7, 0xe8, 0xd5,
+ 0xde, 0x94, 0xf1, 0xe7, 0xd0, 0x9b, 0x0c, 0xb8, 0x99, 0x4c, 0x2b, 0x3c,
+ 0x97, 0xd4, 0x33, 0xed, 0xc7, 0x5d, 0x6c, 0xfa, 0x48, 0x34, 0x7c, 0x77,
+ 0x43, 0xbf, 0x53, 0x81, 0x70, 0x7b, 0x5e, 0x1e, 0x29, 0xb2, 0x02, 0x40,
+ 0x59, 0xa0, 0x01, 0x01, 0xa6, 0x5d, 0x5a, 0xef, 0xe5, 0x3a, 0xfa, 0xca,
+ 0xb8, 0x40, 0x41, 0x75, 0x50, 0xaa, 0x1b, 0x70, 0xae, 0x5c, 0xd4, 0x6f,
+ 0x25, 0x81, 0x14, 0x32, 0xc5, 0xe6, 0x8e, 0x10, 0x76, 0x42, 0xfb, 0xa1,
+ 0xd9, 0x7e, 0x38, 0x74, 0x07, 0x7a, 0xbe, 0x53, 0xf5, 0xb9, 0xd3, 0x4d,
+ 0x7a, 0xb7, 0x0d, 0xaa, 0xef, 0x49, 0x40, 0x39, 0x74, 0xf8, 0xc3, 0x93,
+ 0x62, 0xfd, 0x11, 0x0a, 0x5d, 0x27, 0x22, 0x34, 0x2c, 0xaf, 0x6f, 0x99,
+ 0x99, 0xed, 0xc3, 0x87, 0x50, 0xaa, 0xad, 0xf5, 0x01, 0x44, 0x5b, 0xeb,
+ 0x96, 0x4c, 0xea, 0x32, 0xae, 0xd8, 0x4b, 0x03, 0x45, 0x38, 0x44, 0x5e,
+ 0xad, 0x2f, 0xb1, 0xd2, 0x47, 0xe3, 0x99, 0xda, 0x18, 0x97, 0x07, 0x40,
+ 0x8c, 0xec, 0xe1, 0x42, 0x4e, 0x09, 0x3d, 0x44, 0x83, 0xd5, 0x93, 0xfd,
+ 0x29, 0x3d, 0x17, 0x2e, 0x99, 0x48, 0xa2, 0x13, 0x20, 0x3a, 0xca, 0x63,
+ 0x5e, 0x26, 0xa2, 0xaf, 0x23, 0x1c, 0x2e, 0x57, 0xc7, 0xc5, 0x04, 0x97,
+ 0x54, 0x5a, 0x3e, 0x7f, 0x6c, 0xe5, 0x4e, 0xff, 0xf0, 0x44, 0x93, 0x7e,
+ 0x72, 0x07, 0x12, 0xb6, 0x51, 0xfb, 0x9a, 0x2f, 0x32, 0x12, 0xa9, 0xc5,
+ 0xd9, 0x6a, 0x96, 0x65, 0x2b, 0x23, 0xd7, 0xe7, 0x16, 0x38, 0xde, 0xf2,
+ 0xf9, 0x96, 0xec, 0x0e, 0x8e, 0x4f, 0x3f, 0x19, 0xa1, 0xcf, 0x99, 0x28,
+ 0x87, 0x64, 0x9a, 0x90, 0xa8, 0x1b, 0xd4, 0x71, 0x97, 0x46, 0x25, 0x34,
+ 0x8c, 0xe7, 0xe4, 0xd9, 0x90, 0x5f, 0xd9, 0x25, 0x55, 0x19, 0xb8, 0x35,
+ 0xd0, 0x98, 0xe1, 0xa3, 0xcd, 0x0c, 0xcf, 0xca, 0xf0, 0x01, 0xe0, 0xea,
+ 0xa0, 0x3e, 0x1c, 0x2d, 0xb7, 0x63, 0x37, 0xf6, 0x73, 0x07, 0xf8, 0x84,
+ 0xed, 0x1e, 0xbc, 0xf8, 0xaf, 0x97, 0x6b, 0x71, 0x1f, 0x90, 0x32, 0xfa,
+ 0xd8, 0xf5, 0x88, 0xd9, 0x22, 0x00, 0x2d, 0x5b, 0x9c, 0x40, 0x9d, 0x94,
+ 0x32, 0xab, 0x11, 0xc8, 0xaa, 0xbc, 0x1c, 0xca, 0xa1, 0xb7, 0x88, 0x17,
+ 0x98, 0xed, 0x9e, 0x1b, 0x08, 0xf8, 0xc4, 0x11, 0xae, 0x18, 0x68, 0x3a,
+ 0x41, 0xf4, 0x86, 0x2f, 0xd9, 0x36, 0x0f, 0x43, 0x62, 0x3d, 0xba, 0x1f,
+ 0x74, 0x1d, 0x3f, 0x2a, 0x9a, 0x0a, 0x31, 0x29, 0x35, 0xf0, 0x49, 0x30,
+ 0x86, 0xcb, 0x77, 0xca, 0x45, 0xdf, 0x4a, 0x77, 0x35, 0xb5, 0xaf, 0x43,
+ 0xd4, 0x53, 0x73, 0x6b, 0xd0, 0xb4, 0xa9, 0x1d, 0x8f, 0x21, 0x14, 0x10,
+ 0xac, 0x28, 0xce, 0x6a, 0x65, 0x8c, 0xc6, 0xc7, 0x3e, 0x01, 0x8a, 0x51,
+ 0x3b, 0x40, 0x92, 0x51, 0x27, 0x88, 0xc7, 0x59, 0xc0, 0x02, 0x4d, 0xa6,
+ 0x4f, 0xd4, 0xba, 0xc8, 0xb2, 0x0c, 0x21, 0x1c, 0xf9, 0xb0, 0x7d, 0x28,
+ 0x6a, 0x08, 0xe5, 0xce, 0x75, 0x54, 0xf9, 0x7f, 0xa9, 0xfd, 0x42, 0xe6,
+ 0xb1, 0x72, 0xda, 0x2f, 0x3e, 0x00, 0x40, 0x00, 0x08, 0x1d, 0x55, 0x1e,
+ 0xc0, 0x06, 0xa2, 0xe7, 0x69, 0x03, 0xdd, 0xfe, 0xf3, 0xe6, 0x52, 0x8c,
+ 0xaf, 0xd3, 0x3e, 0x5b, 0x62, 0xdf, 0x79, 0x62, 0xf2, 0x02, 0x22, 0x70,
+ 0x3e, 0x6f, 0x0f, 0x23, 0xc5, 0xc1, 0xf8, 0x8c, 0x8d, 0x84, 0xa3, 0x72,
+ 0x94, 0xcd, 0x93, 0xdc, 0x31, 0x53, 0xc8, 0x4f, 0xe8, 0xa1, 0xd8, 0x52,
+ 0xef, 0x54, 0xbb, 0x46, 0x22, 0xc2, 0x31, 0x22, 0x40, 0xee, 0xad, 0x20,
+ 0x3c, 0x53, 0x89, 0xf8, 0x7e, 0x2c, 0x17, 0x84, 0xa3, 0x68, 0x49, 0x63,
+ 0x44, 0xa3, 0x84, 0x4e, 0x7d, 0xad, 0x35, 0x4f, 0xaf, 0x1e, 0xfa, 0x98,
+ 0xdd, 0x7b, 0x12, 0xab, 0x3d, 0xed, 0xaf, 0x04, 0x5d, 0x70, 0x19, 0x83,
+ 0xc4, 0x20, 0xd0, 0x1b, 0x38, 0x64, 0x1f, 0xf4, 0x2c, 0x89, 0x39, 0x78,
+ 0x2f, 0x28, 0xcf, 0x3c, 0x39, 0x8a, 0xb0, 0xe1, 0x3d, 0x13, 0x01, 0xd7,
+ 0x3b, 0xa1, 0xfc, 0x71, 0xa0, 0xed, 0x8e, 0xad, 0xe6, 0xb0, 0xaa, 0x01,
+ 0x39, 0x04, 0x31, 0x2b, 0xe8, 0x96, 0x18, 0x0d, 0x53, 0xf0, 0x26, 0xdf,
+ 0xa1, 0x48, 0x4f, 0x45, 0xa2, 0x37, 0x03, 0x81, 0x2a, 0x6a, 0x65, 0x51,
+ 0x79, 0xf3, 0x28, 0x70, 0xb9, 0x5a, 0x5e, 0xdd, 0xa1, 0xce, 0x59, 0xec,
+ 0x20, 0x93, 0x7e, 0x02, 0xaf, 0x06, 0xad, 0x20, 0x64, 0x56, 0x33, 0xd4,
+ 0x06, 0xe1, 0x6e, 0x20, 0xc6, 0xc4, 0xda, 0x1b, 0x8b, 0x72, 0xa9, 0xa8,
+ 0xb3, 0x35, 0x7d, 0x7d, 0x12, 0xdd, 0xd7, 0xda, 0x1b, 0x8a, 0x13, 0xa7,
+ 0x71, 0xd5, 0xc5, 0xf1, 0xbd, 0xd9, 0xcc, 0xa3, 0xe2, 0x72, 0xe1, 0xed,
+ 0xb2, 0x35, 0x5b, 0x7a, 0x10, 0xdc, 0x70, 0x55, 0x62, 0xb3, 0xbd, 0x08,
+ 0x27, 0xcf, 0x7e, 0x3e, 0xec, 0x7c, 0xb9, 0x12, 0xcb, 0x40, 0x92, 0xae,
+ 0x67, 0x54, 0x3c, 0x37, 0xb7, 0xfa, 0x4a, 0x7d, 0xc9, 0x13, 0x64, 0xbb,
+ 0x0f, 0xd0, 0x7e, 0xe2, 0x55, 0x03, 0xb5, 0x38, 0x6a, 0x4a, 0x41, 0xd6,
+ 0x77, 0x7e, 0x59, 0xfc, 0xcf, 0x14, 0x37, 0x01, 0x0c, 0x7f, 0xd0, 0x6c,
+ 0x17, 0x32, 0x66, 0xe3, 0x3d, 0xa2, 0x87, 0xbc, 0xa6, 0x28, 0x45, 0x3d,
+ 0x8f, 0x41, 0xdd, 0xea, 0x5b, 0x7c, 0xb6, 0xb7, 0x09, 0xc0, 0xb0, 0x5b,
+ 0xac, 0xf0, 0xa6, 0x95, 0xc5, 0x15, 0x1e, 0xeb, 0xce, 0x2e, 0xa8, 0x4b,
+ 0x34, 0xd7, 0xec, 0x25, 0x5f, 0x7d, 0x12, 0xbe, 0xf6, 0x69, 0x0c, 0xfa,
+ 0x39, 0xa2, 0x3c, 0xc5, 0xda, 0x4e, 0x8e, 0xf1, 0x0c, 0x46, 0xae, 0x12,
+ 0xd4, 0x2f, 0x19, 0x5a, 0x70, 0x09, 0x56, 0xd7, 0x84, 0x4b, 0x9a, 0x94,
+ 0x10, 0x1a, 0x22, 0x5b, 0xcc, 0xfc, 0x92, 0x77, 0x73, 0xed, 0x20, 0xd1,
+ 0x1f, 0x85, 0x7b, 0x79, 0x3c, 0x32, 0xc7, 0x60, 0xcb, 0x82, 0x18, 0xdd,
+ 0x17, 0xc1, 0x0a, 0x7a, 0x88, 0x62, 0xf0, 0x99, 0x3e, 0x18, 0x03, 0xc7,
+ 0x66, 0x94, 0xba, 0x72, 0x06, 0x58, 0x4f, 0x20, 0xce, 0xa8, 0xa3, 0x93,
+ 0x1f, 0x71, 0x5c, 0xf2, 0x2c, 0xa5, 0x8e, 0x57, 0x81, 0xb7, 0x4c, 0x75,
+ 0x84, 0xf2, 0x66, 0x48, 0x1b, 0x24, 0xf0, 0xf1, 0x7a, 0xa8, 0x56, 0xc5,
+ 0x5f, 0x0c, 0x57, 0x1e, 0x97, 0x2a, 0xbb, 0x06, 0xf6, 0xce, 0x08, 0x4a,
+ 0x91, 0xa8, 0xfe, 0x2a, 0x65, 0x60, 0x9f, 0x24, 0x6e, 0xec, 0xe5, 0xff,
+ 0xe1, 0x50, 0xd8, 0xdf, 0x4c, 0x2e, 0x7b, 0x11, 0xc2, 0x13, 0xe8, 0xbc,
+ 0x35, 0x13, 0x53, 0xa0, 0x2a, 0xa8, 0xe3, 0xda, 0x0d, 0x71, 0x67, 0x1c,
+ 0x17, 0x74, 0x24, 0xc6, 0xa3, 0xbe, 0xc5, 0xcf, 0x15, 0x5d, 0x95, 0xcb,
+ 0x67, 0x74, 0xfa, 0x77, 0xa1, 0x20, 0x87, 0x6f, 0x50, 0x07, 0xe9, 0x25,
+ 0xf3, 0x18, 0xad, 0x56, 0x8a, 0x80, 0x32, 0xd8, 0x72, 0x3b, 0x87, 0xfd,
+ 0x45, 0x6c, 0xf0, 0x98, 0x9d, 0xb5, 0x21, 0x96, 0x9f, 0xff, 0x7e, 0xde,
+ 0xa3, 0xbb, 0x9f, 0xf4, 0xaa, 0x1e, 0x7c, 0xfb, 0x9d, 0x94, 0xbb, 0x7b,
+ 0xc1, 0x08, 0x1e, 0x8e, 0x35, 0x80, 0x55, 0x03, 0x8c, 0x28, 0xa3, 0x94,
+ 0x8a, 0x7f, 0x3b, 0x79, 0x98, 0xf2, 0x75, 0xd3, 0xd6, 0x9f, 0xf6, 0x9b,
+ 0xca, 0x43, 0xdc, 0x5c, 0xaa, 0x49, 0x32, 0x71, 0x90, 0xb9, 0x52, 0x8f,
+ 0x63, 0x93, 0x27, 0x6c, 0xf3, 0xe4, 0xa0, 0x8a, 0xe9, 0xcd, 0xb1, 0x3c,
+ 0x5c, 0x36, 0xc1, 0xaf, 0x38, 0xb0, 0x37, 0xb9, 0x5c, 0x08, 0xe4, 0x3f,
+ 0x2e, 0x0d, 0xa4, 0x04, 0x5a, 0x3e, 0x2a, 0xa9, 0x7f, 0x1b, 0x9f, 0x5d,
+ 0x18, 0xa2, 0xc8, 0xbb, 0x28, 0x56, 0x2d, 0x60, 0xd7, 0xc7, 0x52, 0xa2,
+ 0xd7, 0x4f, 0x2d, 0xbe, 0x18, 0xc8, 0x98, 0x0a, 0xe9, 0x64, 0x11, 0xea,
+ 0xe4, 0x0f, 0x19, 0xad, 0x21, 0x37, 0x5e, 0x8e, 0x6b, 0x20, 0x7c, 0x35,
+ 0x3e, 0x8b, 0xa1, 0x3f, 0x44, 0x96, 0x0d, 0xcd, 0x00, 0xb9, 0x7f, 0xbf,
+ 0xda, 0x3d, 0x01, 0x35, 0x43, 0x60, 0x05, 0x71, 0x9e, 0x4c, 0x94, 0xdd,
+ 0x83, 0x32, 0xcf, 0x6b, 0xdd, 0x06, 0xb0, 0x87, 0xc9, 0x34, 0xef, 0x05,
+ 0xb0, 0x3a, 0x56, 0x9a, 0x4a, 0x65, 0xdf, 0x51, 0xea, 0x2a, 0x85, 0x17,
+ 0xc5, 0x0a, 0xac, 0x40, 0x45, 0x69, 0x67, 0x7f, 0xe8, 0x05, 0x20, 0xa7,
+ 0xf4, 0x25, 0x85, 0x49, 0x79, 0x28, 0xd8, 0xb4, 0xe7, 0xbb, 0xc8, 0xd5,
+ 0x1e, 0x8f, 0xcc, 0x33, 0x8b, 0xff, 0x01, 0x1c, 0xca, 0x8a, 0xc0, 0xf4,
+ 0x2d, 0x9d, 0x91, 0x7e, 0x77, 0x3c, 0x89, 0xe4, 0xe7, 0xa6, 0x4b, 0x06,
+ 0x94, 0x88, 0x05, 0x58, 0x09, 0x81, 0x44, 0x60, 0x54, 0xa5, 0x34, 0x2a,
+ 0xba, 0xea, 0xdb, 0xe6, 0x18, 0x82, 0x44, 0x6f, 0xe4, 0x1d, 0x47, 0x2f,
+ 0xe6, 0x8c, 0x4d, 0xcf, 0x50, 0x2d, 0xde, 0x28, 0x21, 0xb3, 0x05, 0x18,
+ 0xb5, 0x55, 0x09, 0x34, 0x56, 0xbf, 0x54, 0x40, 0xb3, 0x34, 0x58, 0x40,
+ 0x1f, 0x0d, 0xa3, 0xf6, 0xfa, 0xa7, 0xa5, 0x3d, 0x49, 0xdd, 0x99, 0x98,
+ 0x02, 0x34, 0xd9, 0x92, 0xb3, 0x77, 0x0c, 0x01, 0xc2, 0x9d, 0x47, 0xbe,
+ 0xe9, 0x6a, 0x0e, 0x73, 0xd1, 0xa2, 0x64, 0x6a, 0x2e, 0x3e, 0xc0, 0x1b,
+ 0x3e, 0x5f, 0x68, 0x85, 0x40, 0x50, 0xa3, 0xa5, 0x24, 0x4d, 0x85, 0x75,
+ 0x41, 0xbf, 0x75, 0x63, 0x9e, 0xcb, 0xbb, 0xbc, 0x6a, 0xe3, 0xe7, 0xb3,
+ 0x00, 0x15, 0xa1, 0xd0, 0x24, 0xbe, 0x58, 0xb6, 0x0b, 0xae, 0x4c, 0x0b,
+ 0x5e, 0x18, 0x32, 0xd4, 0xc3, 0x0a, 0xf1, 0xf7, 0x91, 0xde, 0xb2, 0x45,
+ 0xa0, 0x12, 0xba, 0x42, 0xb5, 0x62, 0x2b, 0x96, 0x1f, 0x2e, 0xcc, 0x64,
+ 0xb7, 0x34, 0x43, 0xa5, 0x64, 0xe7, 0x70, 0x8a, 0x8a, 0x7c, 0xe5, 0x37,
+ 0x22, 0x66, 0xb1, 0x93, 0x0b, 0xf9, 0x42, 0x55, 0x61, 0xa3, 0xb3, 0x4d,
+ 0x70, 0xf7, 0xf7, 0x68, 0xff, 0xa1, 0xc4, 0x00, 0xdd, 0xfc, 0x44, 0xf2,
+ 0x74, 0xc3, 0xec, 0x4b, 0x9a, 0xbb, 0xeb, 0x44, 0x73, 0x3e, 0x25, 0x26,
+ 0x37, 0xec, 0x3c, 0xae, 0x00, 0x1d, 0x1b, 0x64, 0x79, 0xb4, 0x29, 0x63,
+ 0x21, 0x65, 0xce, 0x6f, 0x1e, 0x6e, 0x68, 0xa6, 0xb4, 0xa1, 0xc7, 0x79,
+ 0xf0, 0xf2, 0x9a, 0x7b, 0x5e, 0x67, 0x3a, 0xa4, 0xf7, 0x6d, 0x11, 0x35,
+ 0xb9, 0x33, 0x87, 0xa6, 0x4b, 0xac, 0x34, 0x8b, 0x8d, 0xe0, 0x91, 0xd7,
+ 0xec, 0xc7, 0xa1, 0x6c, 0x50, 0x4c, 0x3a, 0xd1, 0x93, 0x20, 0xd2, 0x35,
+ 0x9b, 0x39, 0x4a, 0x32, 0x12, 0x10, 0x68, 0xd4, 0x84, 0x41, 0xa7, 0x8a,
+ 0xf7, 0x3d, 0x9d, 0x64, 0xc7, 0x02, 0x39, 0x94, 0x6c, 0xba, 0x56, 0xd4,
+ 0x5a, 0x26, 0xb4, 0x9c, 0x92, 0x65, 0xd4, 0x95, 0xb1, 0xa9, 0xfb, 0x02,
+ 0xdc, 0xed, 0xee, 0x7b, 0x3e, 0x62, 0x18, 0xbc, 0x03, 0xc7, 0xdc, 0x95,
+ 0xee, 0x1f, 0xa5, 0x92, 0x5b, 0xbd, 0x16, 0xac, 0xfd, 0x91, 0x0a, 0xa5,
+ 0xa8, 0xa3, 0xcc, 0xcc, 0xf3, 0xe1, 0xe4, 0x21, 0xa6, 0x26, 0xb5, 0xa0,
+ 0x6f, 0xbe, 0x23, 0x61, 0xe7, 0x64, 0x05, 0x9f, 0xa4, 0x55, 0xfc, 0xb3,
+ 0x5d, 0x3b, 0x4c, 0x58, 0x3e, 0x5c, 0xfc, 0xdd, 0xcf, 0xa0, 0x06, 0x9d,
+ 0x50, 0x35, 0x7a, 0x32, 0xd1, 0x7c, 0x33, 0x6d, 0x36, 0x78, 0x56, 0xb7,
+ 0x4c, 0xf3, 0x0e, 0x80, 0xbd, 0x66, 0xf0, 0xdd, 0x34, 0x9c, 0xec, 0xab,
+ 0xf2, 0x4c, 0x9a, 0xaf, 0xa9, 0x67, 0x58, 0x70, 0x4c, 0xde, 0xe5, 0x44,
+ 0xc8, 0x74, 0x72, 0xe2, 0x00, 0x5b, 0x08, 0xc0, 0x58, 0x99, 0x7e, 0x5c,
+ 0x5e, 0x05, 0xd3, 0x51, 0xb1, 0x7b, 0x82, 0x41, 0xff, 0xf4, 0x3e, 0xfe,
+ 0x4c, 0xe0, 0x9c, 0x08, 0x7e, 0x63, 0x6d, 0x9e, 0xc0, 0xdd, 0x9a, 0xb4,
+ 0xae, 0xcf, 0xb8, 0x9e, 0x4a, 0x6c, 0xd5, 0x87, 0xab, 0x7b, 0x15, 0xd2,
+ 0x1f, 0x6f, 0xcc, 0x7d, 0x54, 0x3c, 0x6f, 0x3c, 0xf3, 0xd6, 0xd7, 0x6f,
+ 0x1d, 0x85, 0x26, 0x7f, 0x2a, 0x79, 0x0c, 0x1f, 0xdf, 0xdf, 0xf6, 0x68,
+ 0x58, 0xfd, 0x51, 0x0d, 0x82, 0x4f, 0xa6, 0xc3, 0xc3, 0x08, 0x3d, 0x4a,
+ 0xec, 0xb6, 0x26, 0xc6, 0xdc, 0xe4, 0xc8, 0xa8, 0x9d, 0x74, 0x4a, 0x07,
+ 0xff, 0x72, 0xff, 0x03, 0xb0, 0x71, 0x1c, 0x47, 0xdf, 0xfb, 0xf8, 0x1e,
+ 0x54, 0xea, 0xa0, 0xe8, 0x21, 0x3f, 0xc4, 0xa7, 0xfd, 0xab, 0x70, 0x34,
+ 0xcc, 0x09, 0x4a, 0xb8, 0x4f, 0x1b, 0x9d, 0xa8, 0x05, 0x9e, 0x78, 0x8a,
+ 0x44, 0x05, 0x8e, 0x66, 0x4e, 0xf0, 0xdc, 0xe3, 0xbf, 0x4f, 0xd9, 0xe2,
+ 0x6f, 0x9b, 0x5c, 0x51, 0xfc, 0xb6, 0xc9, 0x4a, 0x09, 0x7d, 0x79, 0x2b,
+ 0x2f, 0x49, 0xd0, 0x11, 0xca, 0x57, 0x03, 0xd8, 0x86, 0x2c, 0xb9, 0xdb,
+ 0xfb, 0x52, 0x6b, 0xac, 0xf9, 0x7e, 0x94, 0x73, 0xc9, 0xd0, 0x52, 0xab,
+ 0x71, 0xec, 0x7e, 0xb2, 0x7f, 0xda, 0x4f, 0xe4, 0xde, 0xc7, 0xba, 0xcc,
+ 0x5e, 0x9f, 0x8a, 0x35, 0x99, 0x80, 0xb8, 0x9d, 0xbf, 0x80, 0x2b, 0xa0,
+ 0x75, 0x8a, 0x60, 0x74, 0x31, 0xe2, 0x71, 0x1f, 0xd9, 0xc5, 0x3a, 0xf9,
+ 0x2e, 0x3d, 0x18, 0xe4, 0xaa, 0xd3, 0x62, 0x97, 0x4a, 0xd7, 0x0c, 0xbb,
+ 0x33, 0xdc, 0x62, 0x09, 0x9b, 0x07, 0xd3, 0x9d, 0xc1, 0xb7, 0x6b, 0x00,
+ 0x2b, 0x32, 0x9a, 0x6b, 0x9e, 0xfe, 0xbb, 0xb0, 0xb0, 0x00, 0x72, 0x12,
+ 0xac, 0x72, 0xed, 0xa7, 0xaf, 0xb7, 0xf3, 0x75, 0x9c, 0xb8, 0x15, 0x7f,
+ 0x2d, 0x23, 0x26, 0x0d, 0x76, 0xf5, 0x5e, 0xbe, 0xa4, 0xb2, 0x82, 0xe8,
+ 0xd8, 0x97, 0x36, 0xdb, 0xba, 0xaa, 0x47, 0x06, 0x1f, 0x57, 0x7d, 0x70,
+ 0x09, 0xe5, 0x31, 0xf2, 0xb2, 0x0e, 0x00, 0xcb, 0x34, 0x74, 0x10, 0x0f,
+ 0x98, 0xa5, 0xfe, 0x75, 0x8a, 0xd5, 0x0c, 0x6c, 0xc6, 0x59, 0xa0, 0xf2,
+ 0x0f, 0x67, 0x01, 0xfe, 0xa4, 0x99, 0xb1, 0x04, 0xc8, 0xd6, 0xbe, 0xa8,
+ 0x90, 0x24, 0x69, 0xa4, 0x4b, 0x63, 0x45, 0xfd, 0x4f, 0x17, 0x85, 0x42,
+ 0xdb, 0x69, 0xc3, 0xbd, 0xd6, 0xf4, 0xab, 0x96, 0xa1, 0xbf, 0x8b, 0xa7,
+ 0x23, 0x16, 0xc1, 0x31, 0x88, 0x14, 0xd7, 0x60, 0xe0, 0xe3, 0x16, 0xd2,
+ 0xa0, 0x44, 0x0e, 0xdc, 0x53, 0x50, 0xfb, 0xa0, 0x83, 0xfd, 0x69, 0xa7,
+ 0x86, 0x58, 0x35, 0x74, 0xc2, 0xa2, 0x8e, 0x89, 0x31, 0x07, 0xf5, 0x3b,
+ 0xd5, 0xa4, 0xc0, 0xd7, 0x8a, 0x37, 0x98, 0x2f, 0x7e, 0x9e, 0xe8, 0x19,
+ 0xd7, 0x6a, 0x0b, 0x74, 0x3f, 0x38, 0xd0, 0x32, 0xeb, 0xd1, 0x59, 0xea,
+ 0x24, 0x35, 0x7e, 0x27, 0xd0, 0xcd, 0x2f, 0x4e, 0x49, 0x07, 0xd7, 0xab,
+ 0x48, 0xc7, 0x10, 0x9f, 0xa7, 0x90, 0x84, 0x43, 0x1e, 0x55, 0x2f, 0x04,
+ 0x97, 0x42, 0x4a, 0x42, 0x4f, 0xc7, 0x48, 0xd5, 0x40, 0x8b, 0x03, 0x5b,
+ 0x4a, 0xb6, 0x35, 0xf9, 0x18, 0x0a, 0xc4, 0x1f, 0x79, 0x5c, 0xe0, 0xf7,
+ 0x41, 0x9c, 0x07, 0x89, 0xd0, 0x47, 0x4f, 0x78, 0xc3, 0x36, 0x17, 0x23,
+ 0x88, 0xa9, 0x3e, 0x61, 0x71, 0xf4, 0xb5, 0x3c, 0x48, 0x8c, 0xee, 0x98,
+ 0x3d, 0x2f, 0x6f, 0x6c, 0x9d, 0x37, 0x07, 0xcd, 0xe3, 0xf4, 0x2f, 0x59,
+ 0x3b, 0x61, 0xfc, 0xcd, 0x0c, 0xcd, 0xbe, 0x16, 0xd5, 0xd8, 0x75, 0x66,
+ 0x7e, 0xe9, 0xea, 0x0a, 0xee, 0xe4, 0xb6, 0x5c, 0x80, 0xad, 0x76, 0x1f,
+ 0x6e, 0x97, 0x00, 0x78, 0xfc, 0xe2, 0x4c, 0x22, 0x12, 0x82, 0xfc, 0x85,
+ 0xd5, 0x0d, 0x4b, 0x99, 0x06, 0x84, 0xf9, 0x38, 0x0c, 0xa6, 0x42, 0x5e,
+ 0x58, 0xe6, 0x68, 0x1f, 0x86, 0x91, 0x2f, 0x71, 0x8c, 0x1f, 0x59, 0x8d,
+ 0xeb, 0xd8, 0xc8, 0x2a, 0xab, 0xd5, 0xad, 0xb2, 0x70, 0x66, 0x72, 0x52,
+ 0xbb, 0xc2, 0xb4, 0x2a, 0x3d, 0xae, 0x71, 0xb9, 0x29, 0xcc, 0x53, 0xc8,
+ 0x89, 0xf2, 0xf7, 0xfc, 0xec, 0x1a, 0x9d, 0xa1, 0xa9, 0xa4, 0x1d, 0xdd,
+ 0x92, 0x5b, 0x36, 0x39, 0x15, 0x57, 0xc1, 0xf2, 0xbb, 0x8c, 0x0b, 0x7f,
+ 0x2f, 0x11, 0x6c, 0x7a, 0x1b, 0xec, 0x69, 0x7f, 0xf9, 0xfb, 0xd0, 0xf9,
+ 0x23, 0xc8, 0x40, 0x64, 0xdc, 0x30, 0xcb, 0xc5, 0x62, 0xca, 0x49, 0x52,
+ 0x97, 0xf7, 0x90, 0x72, 0x10, 0xb5, 0xea, 0x68, 0xe8, 0x9e, 0x90, 0xd0,
+ 0x9b, 0xe1, 0xd4, 0x0b, 0xc6, 0xd7, 0xfe, 0x2b, 0xe0, 0x74, 0xe1, 0xb8,
+ 0x46, 0xd3, 0x75, 0x8a, 0x60, 0x91, 0x79, 0x08, 0x0b, 0x34, 0xd9, 0x6c,
+ 0x8a, 0x51, 0x94, 0x37, 0x74, 0x88, 0x96, 0x44, 0xb0, 0x26, 0x54, 0x2a,
+ 0x0b, 0xa9, 0xbc, 0xb7, 0x0d, 0xff, 0x15, 0x99, 0x1c, 0x02, 0xb7, 0x5d,
+ 0x4f, 0x16, 0x7c, 0xdd, 0x15, 0xa6, 0x72, 0x1e, 0x6c, 0x28, 0xd6, 0x43,
+ 0xcc, 0x75, 0xb3, 0x1e, 0x0e, 0x6b, 0xa3, 0xef, 0xd4, 0x01, 0xab, 0x00,
+ 0xda, 0xc9, 0xd4, 0x96, 0xa4, 0x85, 0x37, 0x96, 0x93, 0xbf, 0x44, 0x1f,
+ 0x36, 0x77, 0xba, 0x08, 0xf4, 0x58, 0x29, 0xf3, 0x6b, 0xd8, 0x11, 0x57,
+ 0xf2, 0xf6, 0x0e, 0xa8, 0x8e, 0x0b, 0xea, 0x1d, 0xaa, 0xe1, 0x09, 0x35,
+ 0x03, 0x65, 0x57, 0x0f, 0x66, 0x8d, 0xf0, 0xe9, 0x1e, 0xa3, 0xc3, 0x65,
+ 0x95, 0x0c, 0x4d, 0x42, 0x95, 0x89, 0x75, 0xd8, 0xa1, 0x03, 0xe8, 0x19,
+ 0x2a, 0xe0, 0x88, 0x90, 0xc8, 0x7a, 0x73, 0x32, 0xd8, 0xb1, 0x30, 0x6f,
+ 0xaf, 0x5f, 0x55, 0xf2, 0x44, 0x19, 0x8d, 0xfb, 0x4a, 0xfa, 0x95, 0x31,
+ 0xea, 0xa0, 0xf1, 0xe2, 0xed, 0xa2, 0xd0, 0xbb, 0x26, 0x57, 0x5f, 0x55,
+ 0x89, 0x97, 0xdc, 0x17, 0x88, 0x3e, 0x2c, 0xb7, 0xdc, 0xb6, 0x6b, 0xaa,
+ 0x1b, 0x6f, 0x34, 0x55, 0x1d, 0x0d, 0x51, 0xa0, 0xb3, 0x95, 0x84, 0x4a,
+ 0x64, 0x83, 0xc1, 0x91, 0x71, 0x49, 0x94, 0x3b, 0x41, 0x3d, 0xa4, 0x81,
+ 0xf0, 0x4a, 0x6a, 0xcf, 0xcf, 0x79, 0x3f, 0xdb, 0xce, 0x37, 0xd0, 0xab,
+ 0x05, 0x3f, 0xc7, 0x76, 0xf3, 0x64, 0x8d, 0x2a, 0x7e, 0xbd, 0x0f, 0xc6,
+ 0xc9, 0xd5, 0x7e, 0x5c, 0x9a, 0xd1, 0x22, 0x44, 0x28, 0x43, 0xd1, 0x7a,
+ 0x49, 0xe6, 0x3d, 0x2f, 0x55, 0xb6, 0x73, 0xfe, 0xb1, 0x53, 0x4b, 0x11,
+ 0x2f, 0x3d, 0x8c, 0x2f, 0xba, 0x8b, 0x80, 0x85, 0xb3, 0x34, 0xb1, 0x07,
+ 0x54, 0x43, 0xee, 0x4d, 0xdf, 0x95, 0x87, 0x8f, 0xe2, 0xc1, 0x30, 0xf1,
+ 0x62, 0xe6, 0x03, 0x7b, 0x8d, 0xa5, 0x66, 0xed, 0x5b, 0xb0, 0xf6, 0x7f,
+ 0x6c, 0xd1, 0xad, 0xf8, 0x7f, 0x4b, 0x51, 0x89, 0x11, 0xcb, 0x19, 0x8e,
+ 0x47, 0x0d, 0x21, 0x2f, 0x83, 0xa9, 0x12, 0x0b, 0x2e, 0xf8, 0x8b, 0x9b,
+ 0xe6, 0xb3, 0x27, 0xd5, 0xe8, 0x29, 0xae, 0x83, 0x2d, 0xb7, 0x34, 0xc3,
+ 0x07, 0x15, 0xb6, 0x20, 0xdf, 0x21, 0x62, 0x0d, 0xd8, 0x3c, 0x91, 0xd2,
+ 0x49, 0x39, 0xe5, 0x1f, 0x69, 0xf2, 0xfd, 0x6e, 0xdc, 0x33, 0xfc, 0xe2,
+ 0x04, 0x73, 0xdd, 0x50, 0x8e, 0x6b, 0x69, 0xe5, 0x19, 0x41, 0x77, 0xfc,
+ 0xb2, 0x85, 0x9a, 0x2c, 0xb8, 0xd1, 0x7b, 0xb5, 0x7b, 0xb2, 0xe8, 0x11,
+ 0x30, 0x89, 0x9d, 0x0f, 0x88, 0xc9, 0x78, 0xce, 0x2d, 0x6e, 0x4f, 0xb6,
+ 0xaa, 0xe1, 0xca, 0x7f, 0x4b, 0x85, 0xf5, 0x5b, 0xf2, 0x2c, 0xfe, 0x7f,
+ 0xd9, 0x25, 0xca, 0xc9, 0x6b, 0xae, 0x81, 0xa2, 0x0f, 0x82, 0xe4, 0x7d,
+ 0xcf, 0xd0, 0x92, 0x21, 0xdc, 0x45, 0xee, 0x7b, 0x67, 0x19, 0x73, 0x72,
+ 0x29, 0xa1, 0x6d, 0x67, 0xb3, 0x9f, 0xc8, 0x39, 0xbc, 0x7d, 0xeb, 0x96,
+ 0x96, 0xa1, 0xf8, 0xe1, 0xab, 0xf0, 0x9a, 0x18, 0xb3, 0xf7, 0x31, 0xd4,
+ 0x35, 0x5a, 0x82, 0xc6, 0x13, 0xe6, 0xb1, 0x1e, 0xdd, 0xc4, 0x70, 0xc6,
+ 0x54, 0x97, 0x6b, 0x9c, 0xda, 0xe1, 0x25, 0xa4, 0x87, 0x2d, 0xab, 0x78,
+ 0x0c, 0xb7, 0x99, 0x0f, 0x21, 0x0e, 0xac, 0xe1, 0x35, 0x76, 0xb6, 0x9e,
+ 0x1d, 0x60, 0x49, 0x05, 0x0c, 0xee, 0x17, 0x50, 0x34, 0x51, 0xa4, 0xff,
+ 0x17, 0xad, 0xcb, 0xe2, 0xf7, 0x09, 0x99, 0xf9, 0x54, 0xf8, 0xe9, 0xb9,
+ 0xa9, 0x72, 0x1a, 0xc7, 0x92, 0xdd, 0x54, 0x75, 0x72, 0x86, 0xbb, 0xff,
+ 0xd5, 0x8d, 0x6f, 0x30, 0xd3, 0xef, 0xd8, 0x0b, 0x1f, 0x38, 0x6c, 0x1e,
+ 0x4e, 0x54, 0x26, 0x57, 0x71, 0x6b, 0x6d, 0x82, 0x2d, 0x02, 0xac, 0xd8,
+ 0xd9, 0xa7, 0x67, 0x79, 0x39, 0x3c, 0x82, 0x2a, 0x8a, 0x6e, 0x76, 0x9e,
+ 0x67, 0xe8, 0x9b, 0xb7, 0x68, 0x1e, 0x50, 0xcf, 0x50, 0x62, 0x61, 0x84,
+ 0xe2, 0x2f, 0x10, 0xb7, 0xc9, 0x40, 0x90, 0x63, 0x68, 0x4b, 0x4d, 0x20,
+ 0x09, 0xdc, 0x7a, 0x1a, 0xb8, 0x64, 0x25, 0xaf, 0xac, 0x60, 0x49, 0x30,
+ 0xbb, 0xeb, 0xe3, 0xe9, 0x03, 0x66, 0x4e, 0xf1, 0x7f, 0xa3, 0x89, 0x21,
+ 0xff, 0xce, 0xd9, 0xc7, 0xb0, 0x2c, 0x9a, 0xb5, 0x97, 0x11, 0x45, 0xf9,
+ 0x59, 0xf0, 0xff, 0x7a, 0x75, 0xdf, 0x91, 0xc4, 0xa0, 0x24, 0x59, 0x52,
+ 0x77, 0x4a, 0x5c, 0x26, 0xbc, 0x03, 0xe8, 0x9b, 0x21, 0x38, 0xb8, 0xe0,
+ 0x0e, 0x95, 0xc1, 0x4d, 0x03, 0x07, 0xf5, 0xae, 0x7b, 0x6a, 0x28, 0xbf,
+ 0x3b, 0x76, 0x0f, 0x59, 0x72, 0x7d, 0xf0, 0x3c, 0xae, 0x46, 0xe9, 0xcd,
+ 0x48, 0x34, 0x8a, 0xa2, 0xe7, 0x29, 0x27, 0x9b, 0xed, 0x3e, 0x19, 0x59,
+ 0x7c, 0x49, 0x8e, 0xf3, 0x8b, 0x48, 0xbf, 0xd5, 0xa7, 0xf3, 0x5f, 0xff,
+ 0xda, 0x0d, 0xc2, 0x6f, 0x50, 0xf7, 0xc6, 0x13, 0x6b, 0x3d, 0x00, 0x69,
+ 0x23, 0x97, 0x6d, 0x12, 0xaa, 0xd2, 0xff, 0x8c, 0x58, 0x1e, 0x3d, 0x93,
+ 0x84, 0x7e, 0xeb, 0xd5, 0xec, 0xf2, 0x7a, 0x02, 0x00, 0x71, 0x18, 0x6d,
+ 0x4a, 0x7a, 0x54, 0x25, 0x8b, 0x4e, 0x8b, 0xad, 0xa1, 0xbd, 0x4a, 0xaa,
+ 0xbd, 0x54, 0x54, 0xdb, 0x24, 0x47, 0x18, 0xc9, 0x0c, 0xee, 0x8c, 0x69,
+ 0x99, 0x85, 0x99, 0x75, 0x1f, 0x05, 0xa7, 0xa8, 0x8b, 0xcc, 0xb1, 0xf6,
+ 0xe4, 0x00, 0xcb, 0xa8, 0x8d, 0xf3, 0xf0, 0xc9, 0x98, 0xbf, 0xf2, 0x91,
+ 0x5f, 0xbd, 0x2b, 0x41, 0x7a, 0x41, 0xe6, 0x69, 0x65, 0xd7, 0xfb, 0xf2,
+ 0xc2, 0x4b, 0x80, 0x2d, 0xa8, 0x3c, 0xed, 0x91, 0xca, 0x63, 0xb1, 0xf8,
+ 0xf6, 0x31, 0x95, 0xfe, 0xa0, 0xc6, 0xc2, 0xf6, 0xa3, 0xa9, 0x22, 0x90,
+ 0xd7, 0x0d, 0xa5, 0xdd, 0x08, 0xd6, 0xe2, 0x3d, 0x41, 0x0c, 0xb2, 0xfb,
+ 0x34, 0x3a, 0x67, 0x4b, 0x71, 0xe6, 0x56, 0x44, 0x52, 0x44, 0x74, 0xdb,
+ 0xff, 0x8b, 0x72, 0xbf, 0x2f, 0x1e, 0xb3, 0x8f, 0xd5, 0xaf, 0x7e, 0xd8,
+ 0x55, 0xd9, 0x52, 0xbe, 0xcf, 0x06, 0x0f, 0x55, 0xd5, 0x70, 0x29, 0x49,
+ 0x30, 0x07, 0x32, 0xa1, 0x0f, 0x78, 0x4b, 0x55, 0x8f, 0x54, 0xfd, 0x1f,
+ 0x08, 0xb3, 0x9c, 0xcc, 0xb6, 0xb7, 0xbc, 0x89, 0x54, 0xb3, 0x0e, 0x9b,
+ 0xbb, 0x39, 0x46, 0x59, 0x45, 0x94, 0x34, 0x17, 0x8f, 0x83, 0x28, 0x70,
+ 0x50, 0x8d, 0x0f, 0xc4, 0x7a, 0x5b, 0x43, 0x96, 0x3d, 0x0a, 0x7c, 0xeb,
+ 0x68, 0x70, 0xb9, 0x33, 0x0d, 0x49, 0x1f, 0x8c, 0x0c, 0x37, 0x69, 0x65,
+ 0xa6, 0x54, 0xf3, 0xba, 0xee, 0xe0, 0x0e, 0xc1, 0x4f, 0x30, 0xbe, 0x09,
+ 0xc6, 0x6d, 0x39, 0xea, 0x09, 0x01, 0x63, 0x53, 0xf5, 0xdd, 0x1b, 0x51,
+ 0x1a, 0x9b, 0x33, 0x1d, 0x19, 0x0d, 0x90, 0x1e, 0x29, 0x89, 0x0a, 0xe1,
+ 0xa4, 0xbe, 0x94, 0x67, 0xda, 0xfd, 0x24, 0x0d, 0xd8, 0x00, 0xa2, 0x04,
+ 0x67, 0x9c, 0x90, 0xaf, 0xb9, 0xf4, 0xbb, 0x8e, 0xdd, 0xc0, 0xbc, 0x61,
+ 0x18, 0xca, 0x7a, 0x20, 0xe7, 0xb2, 0x42, 0xa9, 0xb1, 0x18, 0xe4, 0x32,
+ 0x5c, 0xba, 0x60, 0x2c, 0x2c, 0xfc, 0x2c, 0x1f, 0x8b, 0x03, 0x9f, 0xaa,
+ 0x8a, 0x92, 0xa7, 0xb0, 0xbf, 0x0a, 0x3b, 0x73, 0x7d, 0xd3, 0x18, 0xf5,
+ 0xe1, 0xf5, 0xd6, 0xe7, 0x9d, 0x59, 0x9a, 0x45, 0xf4, 0x5e, 0xeb, 0x77,
+ 0xc1, 0x8c, 0x4d, 0x16, 0x73, 0xaa, 0x08, 0x9d, 0x11, 0x57, 0xc1, 0x06,
+ 0xce, 0xa3, 0xc4, 0xed, 0xfe, 0x91, 0x8c, 0xf6, 0x2d, 0x07, 0xaa, 0x16,
+ 0xd3, 0x84, 0x11, 0xe6, 0x6d, 0x06, 0x66, 0x33, 0xa4, 0xe5, 0xd9, 0xee,
+ 0xfd, 0xdc, 0x18, 0xd8, 0x21, 0x3c, 0xcb, 0xf7, 0xa8, 0x39, 0x5a, 0x91,
+ 0xd1, 0x4b, 0x31, 0x2d, 0x6b, 0xa1, 0x6f, 0x96, 0xa3, 0x83, 0x2a, 0x3b,
+ 0xc1, 0xa0, 0x20, 0xb6, 0xa3, 0x60, 0xce, 0x4d, 0xf2, 0xb3, 0xce, 0x77,
+ 0xfe, 0x43, 0x4b, 0x6a, 0xc9, 0x4a, 0xe5, 0xe9, 0x83, 0xb9, 0xb2, 0x17,
+ 0x10, 0x3a, 0xae, 0xaa, 0x00, 0xc2, 0x8d, 0x06, 0xf3, 0x43, 0x98, 0x53,
+ 0x23, 0x23, 0x5e, 0x5b, 0x4b, 0xb5, 0xa8, 0xd4, 0x90, 0x33, 0x55, 0x58,
+ 0xc0, 0xb8, 0x8e, 0x46, 0xca, 0x5c, 0x94, 0x15, 0x81, 0xa9, 0xf4, 0x2a,
+ 0xb9, 0xc5, 0xbe, 0x8e, 0x4d, 0x13, 0xd2, 0x5a, 0x4c, 0x1f, 0x59, 0x99,
+ 0xb3, 0x80, 0x2d, 0x69, 0xe9, 0x09, 0x2d, 0x77, 0xcd, 0xb6, 0x6a, 0x15,
+ 0xe1, 0x37, 0xb6, 0x25, 0xd3, 0x32, 0xef, 0xd2, 0x2b, 0xcc, 0x61, 0x69,
+ 0xc3, 0x46, 0x74, 0x53, 0xb4, 0x3c, 0x46, 0x1f, 0xfe, 0x95, 0x86, 0x70,
+ 0xe8, 0x2d, 0xcb, 0x9b, 0xb9, 0x28, 0x7c, 0x5b, 0xec, 0x68, 0x19, 0x58,
+ 0x8d, 0xd7, 0x51, 0x05, 0x1f, 0x17, 0x87, 0x4f, 0x97, 0xea, 0x7b, 0xfb,
+ 0xae, 0xe2, 0x86, 0x1d, 0x0d, 0x70, 0x43, 0x05, 0xe5, 0x9a, 0x86, 0x56,
+ 0xbb, 0x0d, 0x78, 0x3e, 0xa2, 0x75, 0xe4, 0x8a, 0x06, 0x1e, 0x7a, 0x56,
+ 0x9e, 0x85, 0x99, 0xe0, 0x41, 0xb9, 0x6b, 0xef, 0xee, 0x72, 0x82, 0x87,
+ 0xa4, 0xfd, 0x43, 0x0f, 0x5d, 0xb8, 0xc5, 0x1a, 0xe4, 0x7d, 0x5c, 0xce,
+ 0x76, 0x10, 0x05, 0x4a, 0x2a, 0x2c, 0x2c, 0x5b, 0xa0, 0x85, 0x13, 0xfa,
+ 0x55, 0x84, 0x02, 0x94, 0x0f, 0x78, 0x9d, 0x77, 0x8c, 0x36, 0x83, 0x94,
+ 0x63, 0xc2, 0xf4, 0xf7, 0x5b, 0x25, 0x10, 0xf8, 0x01, 0x67, 0x9e, 0x8c,
+ 0x07, 0xb0, 0xd2, 0xbe, 0x7a, 0x3c, 0x1a, 0x2e, 0x87, 0x0e, 0x2a, 0x9f,
+ 0xb2, 0x64, 0x9f, 0x8f, 0xbc, 0xe2, 0xe7, 0x00, 0xb2, 0xf4, 0x1e, 0xae,
+ 0xad, 0xd2, 0x79, 0xf7, 0x98, 0xdd, 0xa1, 0x73, 0xbc, 0x89, 0x31, 0xec,
+ 0x6b, 0x79, 0x97, 0x75, 0xd8, 0xd0, 0x68, 0x7b, 0xd5, 0xc9, 0x34, 0x41,
+ 0x6c, 0xb0, 0x73, 0x63, 0xbf, 0xda, 0xbb, 0x3c, 0xf9, 0xe4, 0xa8, 0x1b,
+ 0xeb, 0x6b, 0xd8, 0xcc, 0xb9, 0x03, 0xbb, 0xbd, 0xe1, 0x98, 0x81, 0x20,
+ 0x37, 0x47, 0x57, 0x56, 0x01, 0x7b, 0xb5, 0xc7, 0x4f, 0x82, 0x12, 0x56,
+ 0xaa, 0x09, 0x5c, 0x41, 0x21, 0x99, 0x05, 0x48, 0x9b, 0x4e, 0xe9, 0x75,
+ 0x5f, 0x77, 0x7c, 0x64, 0xb6, 0xee, 0x62, 0xb0, 0x62, 0x9b, 0x76, 0x2a,
+ 0xb5, 0x3d, 0x67, 0xbc, 0x77, 0x8a, 0xd5, 0x2c, 0x91, 0x46, 0x73, 0x96,
+ 0x0f, 0xf7, 0x60, 0x77, 0x29, 0x0c, 0xa1, 0x87, 0x47, 0x4f, 0x05, 0xe5,
+ 0xb3, 0xf0, 0x9a, 0x71, 0x03, 0x06, 0xeb, 0xba, 0xb7, 0x79, 0xae, 0x79,
+ 0x0e, 0x1a, 0x71, 0xd9, 0xcb, 0x98, 0x78, 0x11, 0x18, 0xd0, 0xd5, 0x8b,
+ 0x70, 0x9a, 0x84, 0x00, 0xbd, 0x75, 0x65, 0x92, 0xef, 0xa5, 0x16, 0x77,
+ 0x8f, 0xaf, 0x53, 0x4b, 0x11, 0x35, 0x03, 0x0f, 0xc6, 0xf8, 0x87, 0x79,
+ 0xd4, 0xb1, 0xc2, 0xc4, 0x8d, 0x66, 0x4c, 0xa7, 0x90, 0xc7, 0x7d, 0x61,
+ 0x35, 0x0b, 0x38, 0xe2, 0x78, 0x5f, 0xd9, 0xa3, 0x00, 0x72, 0x77, 0x71,
+ 0xc5, 0x0e, 0xbc, 0x42, 0x23, 0x77, 0x12, 0x05, 0xd1, 0xa6, 0xa0, 0x93,
+ 0x45, 0xe9, 0xf2, 0x55, 0x5d, 0x3d, 0x5a, 0x31, 0x5f, 0x41, 0xac, 0x52,
+ 0x6f, 0x2e, 0x2b, 0xa5, 0xf7, 0x48, 0x00, 0xa6, 0x95, 0x6f, 0x5e, 0x9a,
+ 0x37, 0x31, 0x15, 0x30, 0xbf, 0xe5, 0x24, 0xcb, 0x8b, 0x26, 0x35, 0x41,
+ 0x9e, 0x11, 0x2a, 0x5b, 0xc3, 0x74, 0xb6, 0xd5, 0x8c, 0xdc, 0x65, 0x9e,
+ 0x8c, 0x27, 0x01, 0x0f, 0x79, 0x7a, 0x12, 0xa8, 0x4e, 0x91, 0x77, 0xdc,
+ 0x78, 0x4b, 0xa3, 0xcc, 0xa3, 0xab, 0x71, 0x20, 0x18, 0x2a, 0xb3, 0xec,
+ 0xd6, 0xdc, 0x2f, 0x1e, 0x48, 0xbd, 0x3f, 0x09, 0x98, 0xb8, 0x77, 0x96,
+ 0xd7, 0x64, 0x9a, 0x11, 0x32, 0x25, 0x38, 0xe7, 0xfa, 0x6b, 0x96, 0x87,
+ 0xa2, 0x47, 0x4b, 0xe8, 0x98, 0xd0, 0x40, 0x00, 0x00, 0x09, 0x7a, 0x14,
+ 0xce, 0x46, 0x81, 0xce, 0x36, 0x5e, 0x30, 0xed, 0xbf, 0x3f, 0xbe, 0x3b,
+ 0x1d, 0xde, 0x70, 0x1a, 0x3f, 0xf2, 0x8c, 0x0b, 0x90, 0x90, 0xad, 0x64,
+ 0x6b, 0xbf, 0xff, 0xa2, 0x34, 0xb0, 0x9d, 0x24, 0xc1, 0x0e, 0x21, 0xa6,
+ 0xc7, 0xde, 0x89, 0x9c, 0x5d, 0x48, 0xc0, 0xd4, 0x5f, 0x19, 0x39, 0x60,
+ 0x4e, 0xea, 0xf5, 0xe1, 0xa9, 0xe4, 0xa3, 0x1b, 0xf2, 0x2b, 0xb8, 0x00,
+ 0x03, 0x99, 0x4b, 0xd7, 0x9a, 0xf1, 0x5b, 0x58, 0xbb, 0xc7, 0xb1, 0x70,
+ 0xb0, 0x08, 0x73, 0xe0, 0xd3, 0x17, 0xe7, 0x51, 0x1e, 0xa4, 0x05, 0x43,
+ 0x6f, 0x3d, 0x2a, 0x70, 0x88, 0x3f, 0xd8, 0xd9, 0x2e, 0x3d, 0x25, 0x8e,
+ 0x4d, 0x6c, 0x8c, 0xdb, 0x89, 0x2c, 0x0b, 0x6a, 0xea, 0x07, 0x41, 0xac,
+ 0x60, 0x62, 0x63, 0xfe, 0x4a, 0x5e, 0x1f, 0x70, 0x9f, 0x02, 0x40, 0x99,
+ 0x6d, 0x55, 0xef, 0x61, 0xe0, 0x8f, 0xae, 0x7b, 0x00, 0xea, 0x70, 0x62,
+ 0x3b, 0x17, 0x3a, 0x66, 0xe2, 0x16, 0xb2, 0xd6, 0x05, 0xc8, 0xb4, 0xe7,
+ 0xd6, 0x71, 0x33, 0x1b, 0x19, 0x93, 0xf9, 0x40, 0xff, 0x4f, 0x55, 0xb5,
+ 0x47, 0xce, 0x91, 0x47, 0x95, 0xd0, 0x69, 0x8f, 0x4d, 0xf3, 0x89, 0x7a,
+ 0x0a, 0xa7, 0x0f, 0x56, 0x41, 0x67, 0x64, 0x3a, 0x16, 0x83, 0xe3, 0xb0,
+ 0xd8, 0x04, 0x55, 0x54, 0x35, 0xae, 0x90, 0xcd, 0x93, 0x2e, 0x69, 0x56,
+ 0xfa, 0xa2, 0xdb, 0xa2, 0xb2, 0x56, 0xee, 0xf1, 0x22, 0x8a, 0xe9, 0x9b,
+ 0x33, 0x2d, 0xa4, 0x19, 0x29, 0x78, 0x8f, 0xad, 0xd2, 0xca, 0x8c, 0x96,
+ 0x5c, 0xdd, 0x06, 0x7a, 0xbf, 0x2e, 0x06, 0x25, 0xee, 0x63, 0x02, 0xb0,
+ 0x72, 0x48, 0xcc, 0x36, 0x94, 0x49, 0x07, 0x0b, 0x33, 0x4c, 0x32, 0x09,
+ 0xe7, 0xee, 0x61, 0xe0, 0x90, 0x8a, 0x0f, 0xc8, 0xf5, 0x10, 0x48, 0x93,
+ 0x12, 0x2d, 0x58, 0xe9, 0xdd, 0x04, 0x00, 0x00, 0x38, 0xbc, 0x24, 0x80,
+ 0xcb, 0xc8, 0xa8, 0x8f, 0xb2, 0x8b, 0x97, 0x76, 0x76, 0x15, 0x39, 0x6f,
+ 0x0e, 0xd5, 0xd5, 0x25, 0x4c, 0xb8, 0xb6, 0x61, 0xa2, 0x9e, 0xfe, 0xf5,
+ 0x74, 0xc2, 0x2f, 0x98, 0x51, 0x6f, 0x0b, 0x51, 0xa0, 0xf4, 0xa8, 0x4a,
+ 0xfb, 0x10, 0x5f, 0x5e, 0xf2, 0xdd, 0x90, 0xa6, 0x37, 0xa3, 0x01, 0xcc,
+ 0xbd, 0x91, 0x27, 0xaa, 0x57, 0xc2, 0xa0, 0x14, 0x00, 0x00, 0x04, 0x08,
+ 0xf0, 0x2d, 0x71, 0x3d, 0x2f, 0x78, 0x21, 0x9e, 0x7d, 0xde, 0x31, 0x21,
+ 0x1c, 0x47, 0xe0, 0xe5, 0x44, 0x82, 0x78, 0x20, 0xdc, 0x87, 0x5d, 0xd5,
+ 0x85, 0xd7, 0x0c, 0x14, 0x81, 0xd9, 0x93, 0x5d, 0xb8, 0x30, 0x7e, 0x79,
+ 0xf2, 0xd0, 0x86, 0xd5, 0xf7, 0x07, 0x9e, 0x44, 0xcb, 0xfd, 0xfb, 0xfd,
+ 0x01, 0xbb, 0x91, 0x16, 0x0b, 0x86, 0x45, 0xe5, 0xc0, 0x20, 0x1f, 0x18,
+ 0x02, 0xa1, 0x31, 0x0f, 0x6a, 0x05, 0x08, 0x92, 0x11, 0xcc, 0x7c, 0xfa,
+ 0xa3, 0xf5, 0x06, 0x49, 0x42, 0xfe, 0x0a, 0x71, 0xa9, 0xbe, 0x40, 0xc9,
+ 0x24, 0xe3, 0xec, 0x12, 0x5a, 0x24, 0xa9, 0xfa, 0x48, 0x65, 0xf5, 0x4f,
+ 0xdf, 0x1d, 0xaf, 0xf4, 0x0b, 0x65, 0x3f, 0x48, 0x85, 0x8d, 0x5f, 0x30,
+ 0x02, 0xb8, 0x06, 0x87, 0xbd, 0x91, 0x6f, 0x51, 0x17, 0xd5, 0xa7, 0x0b,
+ 0xe3, 0x36, 0x3c, 0xc1, 0x28, 0xb7, 0x85, 0x2a, 0x0b, 0x6f, 0x91, 0xbb,
+ 0x29, 0x88, 0x1c, 0x4c, 0x3e, 0x1c, 0x13, 0xca, 0x31, 0x90, 0xdf, 0x76,
+ 0x5b, 0x46, 0x73, 0xb7, 0x85, 0x3e, 0xa7, 0x2c, 0x92, 0xf0, 0x70, 0x50,
+ 0x5b, 0x6b, 0xf6, 0x05, 0x0d, 0x15, 0x94, 0x42, 0x27, 0x67, 0x62, 0xb4,
+ 0x1c, 0x80, 0x47, 0x57, 0xb4, 0x39, 0xa7, 0xc7, 0xb3, 0x04, 0x4e, 0xa9,
+ 0x05, 0x36, 0xce, 0x22, 0x89, 0x89, 0xe0, 0xba, 0x1a, 0xd9, 0x38, 0x88,
+ 0x29, 0x00, 0xc0, 0xff, 0x02, 0x67, 0xc8, 0x85, 0xfc, 0xda, 0xcf, 0x04,
+ 0x83, 0x45, 0xea, 0xfa, 0x6d, 0x31, 0x85, 0x9d, 0x45, 0xea, 0x75, 0x13,
+ 0xb3, 0x8c, 0x27, 0x01, 0x06, 0xf2, 0x90, 0x7a, 0x85, 0x50, 0x5d, 0x0a,
+ 0xae, 0x5e, 0x49, 0x13, 0x55, 0x01, 0xbb, 0xbd, 0x4b, 0x96, 0x62, 0x69,
+ 0x7c, 0x06, 0xd3, 0xac, 0x1b, 0xd7, 0x8b, 0x71, 0x61, 0x0f, 0x05, 0xfa,
+ 0x01, 0x04, 0x46, 0x13, 0xf7, 0xae, 0x00, 0x6c, 0x13, 0x20, 0x6f, 0x99,
+ 0xeb, 0x8f, 0x3e, 0xc9, 0x15, 0x41, 0x25, 0x72, 0x9f, 0x7f, 0x79, 0x80,
+ 0x45, 0x52, 0x58, 0x37, 0xda, 0xb3, 0x49, 0x21, 0x3f, 0x83, 0x01, 0x5b,
+ 0xba, 0xf2, 0x0a, 0x9d, 0x15, 0x0b, 0xba, 0x13, 0x7e, 0x51, 0xad, 0x3a,
+ 0xb5, 0xbc, 0x84, 0xee, 0xa8, 0x6b, 0x20, 0x20, 0x86, 0x68, 0x90, 0x83,
+ 0xd5, 0xc9, 0xa2, 0x7d, 0x78, 0x74, 0xdc, 0xff, 0xc1, 0xfe, 0x2c, 0x1e,
+ 0xb4, 0x09, 0x2d, 0x67, 0x9f, 0x6e, 0xd5, 0xfa, 0x18, 0x27, 0xf3, 0x20,
+ 0x1d, 0x02, 0x08, 0x20, 0xe6, 0x2f, 0xe2, 0x6d, 0x52, 0x0f, 0xc4, 0x04,
+ 0x00, 0x03, 0xfc, 0x05, 0x39, 0xf8, 0x81, 0x75, 0x81, 0x31, 0x82, 0x6b,
+ 0xb6, 0x0f, 0xb9, 0xfb, 0xb5, 0xb6, 0x05, 0x38, 0x6d, 0x02, 0x97, 0x27,
+ 0xa5, 0x34, 0x04, 0x3d, 0x5c, 0x18, 0x4f, 0x25, 0x01, 0x30, 0xaf, 0xec,
+ 0x5e, 0xf1, 0xef, 0x1b, 0xaa, 0x24, 0x40, 0x97, 0x3f, 0x65, 0x6a, 0x38,
+ 0xb5, 0x8c, 0xfc, 0x72, 0x2a, 0x37, 0x49, 0x2e, 0x0c, 0x57, 0x0f, 0x98,
+ 0x23, 0x63, 0x5c, 0x71, 0xa9, 0x5f, 0x59, 0x61, 0xa7, 0xd7, 0xd1, 0x1f,
+ 0x3a, 0xf6, 0x56, 0x51, 0xef, 0x53, 0x18, 0xc7, 0xf1, 0xd5, 0x74, 0x9d,
+ 0xba, 0xac, 0x62, 0xa3, 0x1e, 0xd4, 0xc6, 0xa3, 0xeb, 0x62, 0xfc, 0x0c,
+ 0xa1, 0xfb, 0xb9, 0xe2, 0xc3, 0x00, 0x21, 0xe0, 0x9a, 0x20, 0x8a, 0x5f,
+ 0x03, 0xfa, 0x0e, 0x51, 0x77, 0x7e, 0xc3, 0xdf, 0x57, 0x81, 0x66, 0xf8,
+ 0x90, 0x5a, 0x1a, 0xd5, 0x92, 0xce, 0x43, 0x89, 0x5b, 0xbd, 0xf2, 0x65,
+ 0x85, 0xe5, 0x65, 0x30, 0xfc, 0x09, 0x9f, 0xad, 0xa1, 0xbb, 0x88, 0xfd,
+ 0xde, 0x24, 0xc8, 0x58, 0x55, 0xd8, 0x98, 0x41, 0xe9, 0x99, 0x94, 0xcb,
+ 0x2c, 0xec, 0x67, 0xf8, 0x22, 0x07, 0x16, 0x20, 0x1c, 0x95, 0xcd, 0x12,
+ 0x6d, 0x7d, 0x55, 0x7a, 0xb0, 0xec, 0xee, 0xb6, 0x15, 0x7c, 0x13, 0x37,
+ 0xc5, 0xaf, 0x24, 0xe2, 0x96, 0x3c, 0x21, 0x38, 0x65, 0x97, 0xc4, 0xc6,
+ 0xe7, 0x64, 0x48, 0xc7, 0x54, 0x4b, 0xac, 0xce, 0xfb, 0xe9, 0xd6, 0x3e,
+ 0xec, 0x05, 0xfe, 0xb7, 0xda, 0x80, 0x5c, 0x2c, 0x13, 0x5b, 0x3f, 0x6f,
+ 0x26, 0xc0, 0x15, 0xf0, 0x24, 0x4f, 0x26, 0x97, 0x32, 0x55, 0xe6, 0xc2,
+ 0x67, 0x60, 0x14, 0x61, 0xc0, 0xb9, 0xa4, 0x59, 0x12, 0x7b, 0x98, 0xa6,
+ 0x46, 0x24, 0xb1, 0x50, 0xe4, 0x1a, 0x22, 0x38, 0x1e, 0x0b, 0x13, 0xe0,
+ 0xab, 0xc7, 0xdb, 0x27, 0x6f, 0x67, 0x58, 0x49, 0x8e, 0x01, 0x2e, 0x76,
+ 0xad, 0x12, 0xb6, 0x12, 0x98, 0x07, 0x86, 0x16, 0xfb, 0x14, 0xee, 0x00,
+ 0x67, 0x8d, 0x43, 0x6b, 0x9b, 0xf9, 0x07, 0x0a, 0xb4, 0xbd, 0xe6, 0xfb,
+ 0xbb, 0x9a, 0xef, 0x83, 0xbb, 0x3c, 0x2d, 0x44, 0xb0, 0xf9, 0xd3, 0xae,
+ 0x8d, 0x1d, 0x99, 0x4c, 0x95, 0x27, 0xdf, 0x19, 0x03, 0x16, 0xdf, 0x7b,
+ 0xca, 0x64, 0x73, 0x75, 0xa8, 0xb1, 0xf8, 0x38, 0x6a, 0x1c, 0x87, 0x1b,
+ 0xd1, 0xf5, 0x83, 0x72, 0x07, 0x98, 0x95, 0xba, 0x12, 0xdb, 0xf6, 0x5d,
+ 0x59, 0x74, 0xa3, 0x47, 0xe5, 0x3b, 0xed, 0x10, 0xc5, 0x65, 0x52, 0x2e,
+ 0x8e, 0x30, 0xa5, 0x28, 0x7d, 0x3c, 0x12, 0xde, 0xef, 0xcc, 0xbf, 0x67,
+ 0x1f, 0xcd, 0xa8, 0xaa, 0x1b, 0xa9, 0x21, 0x45, 0x08, 0x4a, 0x69, 0xd9,
+ 0x0a, 0x3f, 0x5e, 0x11, 0x76, 0x10, 0x55, 0xa0, 0xaa, 0x04, 0x16, 0x52,
+ 0x73, 0x02, 0x09, 0x5f, 0x31, 0x17, 0xb4, 0x7c, 0x7d, 0xc9, 0x70, 0x16,
+ 0x57, 0x10, 0xd9, 0x09, 0xda, 0xa3, 0x5f, 0x94, 0xaf, 0xca, 0x44, 0xe4,
+ 0xd5, 0xa9, 0xe6, 0x5f, 0x53, 0x3b, 0x18, 0xf7, 0xff, 0xf2, 0x70, 0x8b,
+ 0x14, 0x61, 0xe5, 0xaa, 0x39, 0xd7, 0x21, 0xad, 0x49, 0x14, 0x9f, 0x14,
+ 0x1e, 0x57, 0x9b, 0x78, 0x92, 0x85, 0x5e, 0x17, 0x49, 0x5a, 0xd3, 0x7c,
+ 0xdb, 0x30, 0x5b, 0xe9, 0x56, 0x2e, 0xd6, 0xe2, 0x09, 0xbd, 0xd0, 0x78,
+ 0xe1, 0xb4, 0x5b, 0x50, 0x4b, 0x50, 0x76, 0x29, 0xbc, 0x8b, 0x5f, 0x38,
+ 0x56, 0xac, 0xb5, 0xb5, 0x3f, 0xbe, 0x79, 0x68, 0x7b, 0x75, 0xa5, 0x68,
+ 0x56, 0x64, 0x2a, 0x47, 0xf4, 0x24, 0x6c, 0x5a, 0x30, 0x2e, 0xa4, 0xa7,
+ 0x34, 0x04, 0xc5, 0x36, 0xf7, 0x4b, 0x55, 0xed, 0x0c, 0x69, 0x93, 0x22,
+ 0x5d, 0xf9, 0x5f, 0xc5, 0x37, 0x77, 0xa2, 0x5f, 0xed, 0x9c, 0xe0, 0xef,
+ 0xa5, 0x6a, 0xfc, 0xf7, 0xe2, 0xcb, 0x82, 0x0a, 0x6d, 0xfd, 0xa5, 0x8c,
+ 0xef, 0x99, 0xb7, 0xcd, 0x61, 0x65, 0x35, 0xbe, 0x57, 0x72, 0x33, 0x10,
+ 0x69, 0xfd, 0x0a, 0x71, 0x93, 0x59, 0x1e, 0x83, 0x45, 0xb6, 0xd7, 0x07,
+ 0xdb, 0x24, 0xbf, 0x3c, 0x2b, 0x90, 0xfe, 0xa2, 0x15, 0x8f, 0x8f, 0x30,
+ 0xb1, 0x2f, 0xce, 0x22, 0x14, 0x83, 0x7d, 0xff, 0x87, 0x05, 0x70, 0xae,
+ 0x6e, 0xd9, 0x3a, 0xcc, 0x25, 0xd3, 0xe1, 0x60, 0xe4, 0x5f, 0x3c, 0x80,
+ 0x2e, 0xbc, 0x26, 0xd7, 0x38, 0xfd, 0x43, 0x1b, 0x7e, 0xba, 0x18, 0xb2,
+ 0xaa, 0x0e, 0x52, 0x02, 0x82, 0xd3, 0x14, 0x53, 0x81, 0x81, 0xd8, 0x6f,
+ 0xb2, 0x90, 0x7b, 0x71, 0xd4, 0x74, 0x71, 0xd7, 0x21, 0xba, 0xd9, 0xe3,
+ 0x5b, 0xd5, 0xaf, 0x59, 0x52, 0x8a, 0xd4, 0xe6, 0xe9, 0xc1, 0x14, 0x04,
+ 0x3f, 0x74, 0xbc, 0xa1, 0xb7, 0x98, 0x20, 0x36, 0xe1, 0xd9, 0x3d, 0x62,
+ 0xde, 0x16, 0x3a, 0x18, 0xa8, 0x69, 0x90, 0x25, 0x8c, 0x5e, 0xb7, 0x5f,
+ 0x58, 0xfb, 0x57, 0xe1, 0x42, 0x9c, 0xb7, 0xa5, 0xc3, 0xa3, 0xa4, 0x2e,
+ 0x6e, 0x0d, 0x00, 0xad, 0x45, 0x22, 0xf3, 0x7a, 0xec, 0x82, 0x5c, 0x05,
+ 0xf8, 0x0f, 0xb9, 0x8a, 0x7d, 0xbc, 0x98, 0xc7, 0x79, 0xf8, 0xe5, 0x02,
+ 0x35, 0xa1, 0x15, 0x13, 0xf0, 0x3e, 0x42, 0xf7, 0x43, 0xe7, 0xde, 0x91,
+ 0x0a, 0x9e, 0x36, 0xb5, 0xf1, 0xc6, 0x88, 0x0c, 0x5c, 0xf6, 0xef, 0x00,
+ 0xb1, 0x50, 0x32, 0xe7, 0x77, 0x25, 0xa9, 0x3e, 0x60, 0x49, 0xb3, 0x4d,
+ 0x0b, 0x4e, 0xd4, 0x9d, 0x72, 0x92, 0x52, 0x23, 0x7a, 0x86, 0x6a, 0x2d,
+ 0xfb, 0xb9, 0xe7, 0x36, 0x8c, 0x80, 0x01, 0x32, 0x76, 0xf7, 0x63, 0xb0,
+ 0x9f, 0xef, 0x35, 0x64, 0x89, 0x81, 0xaa, 0x4c, 0x78, 0xb3, 0xc6, 0x5c,
+ 0xcc, 0x02, 0x5f, 0xfd, 0xf2, 0x96, 0x50, 0xaa, 0xaa, 0xe2, 0x0a, 0xe0,
+ 0x0a, 0xf7, 0x61, 0x09, 0xb9, 0x55, 0x94, 0x72, 0xd3, 0xdb, 0xf0, 0x76,
+ 0xa5, 0x53, 0x7d, 0x7a, 0x77, 0x4e, 0x9a, 0x5e, 0x78, 0x96, 0xf0, 0xbe,
+ 0x6b, 0x8f, 0x36, 0x02, 0xfe, 0xa8, 0x3b, 0x51, 0xc8, 0x39, 0x39, 0x44,
+ 0xbd, 0xf4, 0x0e, 0xce, 0x1f, 0x9a, 0xde, 0xeb, 0xcf, 0xa9, 0x46, 0x03,
+ 0xed, 0x25, 0x96, 0xeb, 0xbd, 0xe2, 0x1b, 0xcf, 0xbf, 0xda, 0x3c, 0xdc,
+ 0xb1, 0x1c, 0xcf, 0xb4, 0x5d, 0xff, 0x19, 0x4c, 0x8d, 0x55, 0x57, 0xe8,
+ 0xe2, 0xf1, 0x62, 0xe6, 0x63, 0x0e, 0x70, 0xc9, 0x38, 0x40, 0xb1, 0xde,
+ 0x11, 0x9a, 0x73, 0xf3, 0x43, 0x65, 0x8b, 0xfa, 0x4f, 0x49, 0x9b, 0xe6,
+ 0x46, 0xed, 0x29, 0x39, 0x0d, 0xbb, 0x87, 0xc4, 0x8a, 0x45, 0xd6, 0x4d,
+ 0xec, 0x35, 0x8d, 0x02, 0xff, 0xc9, 0x7f, 0x06, 0x73, 0x27, 0xfb, 0x1f,
+ 0xc4, 0xd6, 0xc7, 0xeb, 0xfc, 0xd6, 0x9f, 0x01, 0xe6, 0x5c, 0x07, 0xec,
+ 0x9f, 0x2f, 0xca, 0xda, 0xcd, 0x00, 0x7e, 0x42, 0x78, 0xa0, 0x25, 0xd5,
+ 0x70, 0xb4, 0xaa, 0x70, 0xd2, 0x3e, 0x0d, 0xe4, 0x5d, 0x42, 0x60, 0x8a,
+ 0x79, 0x8a, 0x72, 0x5c, 0x02, 0xfe, 0xca, 0xb0, 0xdd, 0xc1, 0x5c, 0xa4,
+ 0x59, 0x45, 0x6f, 0x88, 0xa9, 0xc4, 0x65, 0x3a, 0xa8, 0x55, 0xd9, 0x28,
+ 0x42, 0xb4, 0xf2, 0x3f, 0x95, 0x6f, 0xbf, 0x8c, 0x57, 0x47, 0xb4, 0xfd,
+ 0xbc, 0xb2, 0x39, 0xec, 0x9d, 0x4d, 0x53, 0xdc, 0x82, 0xca, 0xec, 0x1a,
+ 0x73, 0x4f, 0xc0, 0x6e, 0xbb, 0x92, 0x7f, 0x7b, 0x37, 0x2b, 0x83, 0x88,
+ 0x11, 0x01, 0x9a, 0x80, 0xa7, 0x17, 0x9c, 0x7b, 0xad, 0xc0, 0x5b, 0xe0,
+ 0xec, 0x68, 0xca, 0xbc, 0x12, 0x5e, 0xad, 0x09, 0x03, 0xbc, 0x10, 0xa6,
+ 0xa3, 0x2a, 0xae, 0x0c, 0x96, 0x48, 0xda, 0x63, 0xb8, 0x54, 0xbf, 0xcb,
+ 0xa2, 0xbb, 0xa5, 0x69, 0x8a, 0x58, 0xd0, 0x2e, 0xbc, 0xe5, 0x17, 0x29,
+ 0x6a, 0xe8, 0x05, 0x3f, 0xf3, 0xdb, 0xef, 0x1e, 0x50, 0xf7, 0xe6, 0xb9,
+ 0x09, 0x77, 0x1d, 0x78, 0xc0, 0xa1, 0x12, 0xcd, 0x32, 0x1a, 0x0e, 0xc6,
+ 0x2c, 0xc3, 0x20, 0x23, 0x63, 0xf2, 0x62, 0x47, 0x61, 0x37, 0xcc, 0xb2,
+ 0x68, 0x02, 0xb5, 0x4a, 0x10, 0x4e, 0xc9, 0x69, 0x33, 0xe3, 0x38, 0x7c,
+ 0x1a, 0xbf, 0x3e, 0x9c, 0x87, 0xc2, 0xb1, 0x93, 0x1b, 0xfa, 0xf3, 0xf8,
+ 0x9b, 0xc7, 0xf0, 0xcd, 0x6f, 0x3c, 0x9e, 0xe0, 0xc1, 0xc7, 0x88, 0xe4,
+ 0x04, 0x78, 0xfb, 0x5c, 0xd3, 0xed, 0x5c, 0xb1, 0x07, 0x80, 0x34, 0x24,
+ 0x0b, 0x55, 0xa3, 0x4d, 0xfc, 0xf9, 0xe6, 0x2e, 0x7b, 0x0b, 0xf5, 0xdb,
+ 0xeb, 0x75, 0xfb, 0xb7, 0x3b, 0x8f, 0xc2, 0x00, 0xfb, 0xf1, 0xf0, 0x46,
+ 0x28, 0x95, 0x1a, 0x5f, 0x4d, 0x66, 0x98, 0xd8, 0x09, 0xb0, 0xe6, 0xbc,
+ 0xae, 0x42, 0x8f, 0x13, 0xda, 0x31, 0xd4, 0xb4, 0x6e, 0xa6, 0xc1, 0x68,
+ 0xa9, 0x11, 0x5f, 0x9d, 0xe5, 0x73, 0xbe, 0x2b, 0x64, 0xe5, 0x8d, 0x43,
+ 0x7c, 0x4a, 0x71, 0xcb, 0x40, 0x78, 0x3d, 0x51, 0x13, 0xe4, 0x2b, 0x81,
+ 0x5d, 0x61, 0x4d, 0xca, 0x4b, 0x9b, 0xa4, 0x30, 0x5f, 0x85, 0xe9, 0x2e,
+ 0xf9, 0x38, 0xea, 0x62, 0x17, 0xee, 0x47, 0x74, 0xe3, 0xa5, 0x3c, 0x44,
+ 0xc8, 0x90, 0xf0, 0x18, 0x86, 0x7c, 0xe2, 0x9f, 0xb4, 0x84, 0x9c, 0xd7,
+ 0x56, 0x2b, 0x0e, 0x8a, 0x0c, 0xbe, 0x31, 0x89, 0xdb, 0xe6, 0x1d, 0x2f,
+ 0x49, 0x74, 0x6f, 0x76, 0xca, 0x31, 0x92, 0xa9, 0x24, 0xae, 0x27, 0x1b,
+ 0xd5, 0x3b, 0x6c, 0xb4, 0xb2, 0xb1, 0x9e, 0xfa, 0x03, 0x73, 0x65, 0x8b,
+ 0xba, 0xa2, 0x73, 0x2d, 0x2f, 0xd2, 0x65, 0x33, 0x93, 0x6b, 0xed, 0x3d,
+ 0x07, 0x97, 0xd5, 0x07, 0x17, 0x6b, 0x04, 0xaf, 0x81, 0xd4, 0x69, 0x19,
+ 0x75, 0xe3, 0x0a, 0xfc, 0x85, 0xef, 0x57, 0x2f, 0xbf, 0xfb, 0x9d, 0xec,
+ 0x77, 0x92, 0x3b, 0x7a, 0x2d, 0x56, 0x55, 0xf2, 0xa8, 0xe4, 0xc3, 0x03,
+ 0x0e, 0xb6, 0xd7, 0xf2, 0x21, 0x5d, 0xfc, 0x14, 0xaa, 0xe5, 0xa9, 0xa4,
+ 0xd9, 0xdf, 0x59, 0xc8, 0xe8, 0x8f, 0x07, 0xee, 0x5c, 0x22, 0x92, 0x8a,
+ 0xd1, 0xf6, 0x6b, 0xa6, 0x32, 0xcf, 0x86, 0x72, 0xfa, 0xaf, 0xd1, 0xcb,
+ 0xb9, 0x6c, 0x4d, 0x60, 0x73, 0x6b, 0x00, 0x09, 0x36, 0xcf, 0xe4, 0x3e,
+ 0xc2, 0xd5, 0x76, 0xe9, 0x23, 0x67, 0x36, 0x6b, 0x3e, 0xff, 0xd4, 0xef,
+ 0x15, 0xf1, 0x86, 0x5f, 0x50, 0x82, 0x00, 0x89, 0xa5, 0x5c, 0xe0, 0x38,
+ 0x7a, 0x32, 0x62, 0xf6, 0xeb, 0x9a, 0xe0, 0x67, 0xbf, 0x42, 0xcf, 0x7e,
+ 0xc6, 0x9a, 0xdc, 0x37, 0x3f, 0x3e, 0x82, 0xfe, 0x4d, 0xcc, 0x35, 0x07,
+ 0x95, 0x20, 0xad, 0x71, 0xda, 0x8c, 0xc0, 0xa8, 0x5f, 0x75, 0xd9, 0x7a,
+ 0x7b, 0x99, 0xef, 0x69, 0x13, 0xe2, 0x0a, 0x2e, 0xa4, 0x2d, 0x7b, 0x54,
+ 0x94, 0xfa, 0x81, 0xbb, 0xea, 0x2d, 0x9e, 0x8a, 0xd6, 0x02, 0x23, 0x69,
+ 0xf2, 0x92, 0xa4, 0x86, 0x06, 0xdd, 0x41, 0x60, 0x26, 0x0b, 0x4d, 0x08,
+ 0x31, 0x73, 0xfb, 0xdb, 0x52, 0x96, 0x04, 0xc9, 0xa4, 0x5a, 0x33, 0x87,
+ 0xfe, 0x0c, 0x22, 0xb7, 0xc6, 0x56, 0x22, 0xf0, 0x94, 0xbd, 0x72, 0xba,
+ 0x2c, 0xb3, 0x66, 0xb5, 0xf5, 0x86, 0xc6, 0x4f, 0x17, 0x78, 0xe3, 0x61,
+ 0xcb, 0xf7, 0xed, 0xb7, 0x8b, 0x7c, 0x8c, 0xd6, 0x19, 0x60, 0x69, 0x24,
+ 0x14, 0x8b, 0x0c, 0x00, 0xd1, 0x32, 0x03, 0x71, 0xf9, 0x71, 0x7d, 0x4b,
+ 0x79, 0x68, 0x19, 0x2d, 0x79, 0x1e, 0x67, 0x1b, 0x8f, 0x2e, 0xac, 0x0f,
+ 0x4a, 0x5e, 0x9b, 0xc9, 0xbf, 0xe1, 0x3f, 0x37, 0xbb, 0xbe, 0x4f, 0x1a,
+ 0x7a, 0xfc, 0x28, 0x3a, 0xd6, 0xa9, 0x36, 0xe5, 0xfb, 0x46, 0xc7, 0x6e,
+ 0x20, 0x69, 0x11, 0xc8, 0x5a, 0x47, 0xe5, 0x25, 0x2c, 0xe3, 0x1d, 0xef,
+ 0xf3, 0x6b, 0x5a, 0xe8, 0xd5, 0xd4, 0xe1, 0x56, 0xd1, 0x67, 0xf6, 0x9f,
+ 0x2e, 0xc3, 0xe8, 0xa2, 0xf5, 0xdb, 0x89, 0x1a, 0x68, 0x9a, 0x67, 0xd0,
+ 0x2c, 0x00, 0x30, 0x72, 0xda, 0x96, 0x8b, 0xf7, 0xba, 0xaf, 0x90, 0x71,
+ 0xaf, 0x3c, 0xe7, 0xfd, 0x97, 0xc5, 0x7e, 0x0e, 0xec, 0xe9, 0x2d, 0xec,
+ 0x1c, 0x8f, 0x9e, 0x44, 0xaa, 0x7e, 0x67, 0x2d, 0x7a, 0x90, 0xf0, 0xbd,
+ 0x14, 0x7a, 0xe9, 0x53, 0x15, 0x98, 0x6c, 0x9d, 0x37, 0xfe, 0xa1, 0xae,
+ 0xba, 0xa8, 0x6c, 0x0e, 0xea, 0xdb, 0xc8, 0x86, 0x00, 0xd6, 0x8a, 0x05,
+ 0x69, 0x09, 0xba, 0xa2, 0x5f, 0x9d, 0x0e, 0xbd, 0x75, 0x69, 0x7b, 0x46,
+ 0x1b, 0xaa, 0x24, 0xca, 0x6b, 0x8b, 0x65, 0x51, 0x85, 0xcf, 0xe5, 0x23,
+ 0x1d, 0x9b, 0x3e, 0x09, 0x53, 0xdd, 0xe7, 0x96, 0x34, 0x07, 0xe1, 0xa1,
+ 0x43, 0x04, 0x5f, 0xdd, 0x57, 0x29, 0xd9, 0x81, 0xe9, 0xf0, 0x5b, 0x3f,
+ 0xea, 0x3f, 0xae, 0x2c, 0x61, 0x32, 0x4d, 0x2c, 0x22, 0x90, 0xa0, 0xc5,
+ 0xf8, 0xdd, 0xe9, 0xeb, 0x64, 0xb5, 0xfd, 0x02, 0x28, 0x85, 0xb4, 0x52,
+ 0x4c, 0x0e, 0x76, 0x21, 0x55, 0x09, 0xee, 0x93, 0x6d, 0xaa, 0x7c, 0x74,
+ 0x17, 0x7c, 0xb0, 0xeb, 0xab, 0x0b, 0xee, 0x21, 0x6d, 0xe1, 0x2b, 0x40,
+ 0x8c, 0x19, 0x81, 0x9a, 0xb8, 0x15, 0x0e, 0x58, 0x78, 0x3d, 0x12, 0x8f,
+ 0x35, 0x1e, 0x18, 0x26, 0x2e, 0xfc, 0x78, 0x60, 0x79, 0x60, 0x92, 0x1f,
+ 0xa1, 0x19, 0xeb, 0x72, 0x61, 0x4a, 0x4a, 0x49, 0x44, 0xc5, 0x65, 0x45,
+ 0x1b, 0x8a, 0x60, 0xa6, 0x7b, 0xf3, 0x2c, 0xfe, 0x3f, 0xa0, 0x1b, 0xfc,
+ 0x28, 0xb5, 0x59, 0x1b, 0x84, 0xa4, 0xe9, 0xcc, 0x6a, 0x50, 0x7f, 0x34,
+ 0x94, 0x52, 0x6c, 0x23, 0xea, 0xd7, 0x1e, 0x69, 0x4a, 0x27, 0x6d, 0x12,
+ 0xb7, 0xa8, 0x99, 0xc6, 0x7b, 0x1f, 0x6a, 0x18, 0x1d, 0x09, 0x6d, 0x25,
+ 0x8b, 0xb8, 0x6b, 0xee, 0x92, 0xec, 0xdb, 0x08, 0x70, 0x98, 0x2c, 0x3d,
+ 0x93, 0x72, 0xbd, 0xc1, 0xd5, 0x4d, 0x41, 0x1b, 0x04, 0x69, 0xa6, 0xda,
+ 0xc5, 0x32, 0xfc, 0x0c, 0x58, 0x3d, 0x3e, 0x78, 0x53, 0xce, 0x98, 0xd6,
+ 0x13, 0xfc, 0x05, 0x61, 0x00, 0xdb, 0x83, 0x58, 0xd6, 0x74, 0x45, 0x06,
+ 0x49, 0xc2, 0x58, 0x32, 0xd3, 0x52, 0x46, 0xc4, 0x5b, 0xde, 0x08, 0x11,
+ 0xee, 0x90, 0x62, 0x5d, 0x91, 0x2e, 0x27, 0xe7, 0x54, 0xe3, 0x9d, 0x12,
+ 0x92, 0x82, 0xf1, 0x48, 0xf7, 0x1c, 0x91, 0xaa, 0x79, 0x01, 0x36, 0x3e,
+ 0xde, 0x2a, 0xb5, 0xf0, 0xb1, 0xed, 0x6e, 0xe8, 0x14, 0xf5, 0x72, 0x4f,
+ 0xae, 0x5b, 0x6c, 0xc0, 0xf9, 0xa2, 0xef, 0x45, 0xcd, 0x25, 0x35, 0x7c,
+ 0x83, 0xa0, 0x8a, 0xce, 0x6e, 0xfa, 0xfa, 0xc0, 0xae, 0xed, 0x39, 0x6c,
+ 0xa9, 0x29, 0xbc, 0xe0, 0x18, 0x48, 0xfe, 0xde, 0xb8, 0x8f, 0xa7, 0xff,
+ 0x13, 0xbd, 0x35, 0x32, 0x1b, 0x8b, 0x36, 0x64, 0x6a, 0x04, 0x70, 0x79,
+ 0x91, 0x84, 0x84, 0x17, 0xf1, 0x3f, 0xe9, 0xde, 0xb3, 0xf7, 0x8d, 0x38,
+ 0x7f, 0xeb, 0x1a, 0x5f, 0x43, 0x09, 0xcb, 0x7f, 0x52, 0x51, 0x2d, 0x9a,
+ 0xa0, 0xbc, 0xbe, 0x20, 0x0d, 0xa3, 0x4c, 0xb0, 0xe1, 0x5e, 0xd6, 0x49,
+ 0x6b, 0x55, 0x11, 0xba, 0xa4, 0xe6, 0xb9, 0x99, 0x36, 0xa2, 0x1f, 0x1a,
+ 0xd6, 0x14, 0x0c, 0x8d, 0x07, 0x98, 0x70, 0xba, 0xcf, 0x29, 0x42, 0x4f,
+ 0x69, 0x60, 0x73, 0x1c, 0x5c, 0x62, 0xf0, 0x0d, 0xa1, 0xa3, 0xe6, 0xe6,
+ 0x11, 0x79, 0x4d, 0x2b, 0x07, 0x21, 0x24, 0x48, 0x19, 0xa7, 0xf2, 0xc9,
+ 0xf3, 0x35, 0x52, 0xec, 0xa5, 0x05, 0x70, 0x90, 0x78, 0xd5, 0x21, 0xef,
+ 0xce, 0xa1, 0x6d, 0x0d, 0x98, 0xc2, 0x70, 0xbd, 0x46, 0xdd, 0xec, 0xbf,
+ 0xca, 0x7f, 0xdc, 0x9f, 0x7b, 0x49, 0x42, 0x32, 0xc1, 0x2a, 0x4f, 0xd9,
+ 0xc3, 0xcb, 0x7a, 0x0e, 0xcd, 0x17, 0xa2, 0x7e, 0xa3, 0xb6, 0x1f, 0x18,
+ 0x05, 0x17, 0x1e, 0x31, 0x3e, 0x1e, 0xd7, 0x17, 0x86, 0xc7, 0xd0, 0x95,
+ 0x8b, 0xc3, 0xb2, 0xf3, 0x9c, 0x2f, 0x2f, 0xeb, 0xde, 0x39, 0x14, 0x0b,
+ 0xfe, 0x56, 0x6c, 0x7a, 0xdd, 0x98, 0x4e, 0x86, 0x3f, 0xec, 0x51, 0xc7,
+ 0xff, 0xfe, 0x2d, 0x3b, 0xce, 0x54, 0xb6, 0x2b, 0x95, 0x81, 0x31, 0xf6,
+ 0x95, 0x26, 0x41, 0x39, 0xf4, 0x0b, 0xcf, 0x1e, 0xf6, 0xd0, 0x34, 0xe6,
+ 0x5c, 0x68, 0x01, 0x05, 0x9a, 0x1e, 0xba, 0xbf, 0xc1, 0x9e, 0x6d, 0xf0,
+ 0xd0, 0x6c, 0x84, 0xa5, 0x56, 0xec, 0x47, 0xaa, 0x82, 0x7f, 0x84, 0xf7,
+ 0xac, 0x52, 0x50, 0x6c, 0x32, 0x24, 0x8b, 0x2e, 0x54, 0x66, 0x63, 0xe8,
+ 0x97, 0x94, 0x73, 0xbd, 0x69, 0x92, 0x10, 0xa7, 0x4e, 0x88, 0x0d, 0xdd,
+ 0xd4, 0xa6, 0x5e, 0x77, 0x7e, 0xa1, 0xb0, 0xda, 0xb2, 0xff, 0xf4, 0xec,
+ 0x34, 0xc5, 0x8d, 0xb1, 0x39, 0x42, 0x04, 0x7f, 0xdd, 0x74, 0xb3, 0xb5,
+ 0xe5, 0x5a, 0xa9, 0x65, 0xc5, 0x4f, 0xe6, 0x20, 0x35, 0x85, 0x38, 0xb8,
+ 0xa7, 0xdd, 0x35, 0xf8, 0xcf, 0x3f, 0x2e, 0x80, 0x7f, 0x5f, 0x67, 0x8b,
+ 0xbf, 0xbe, 0x51, 0x02, 0x23, 0xff, 0xac, 0x0d, 0xfb, 0x7c, 0xe2, 0x86,
+ 0xe9, 0xc5, 0x20, 0x6d, 0x03, 0x55, 0xfa, 0xa7, 0x0a, 0x1f, 0x74, 0x17,
+ 0x31, 0x75, 0x1c, 0x62, 0xa2, 0x51, 0x38, 0x76, 0x4a, 0xab, 0x75, 0x42,
+ 0xa8, 0x00, 0xdc, 0x46, 0xf2, 0xc7, 0xdf, 0x1c, 0xdf, 0x60, 0xad, 0x5c,
+ 0x02, 0xee, 0x24, 0xbc, 0x07, 0xf1, 0xf5, 0xdd, 0x03, 0x2a, 0xcc, 0xf1,
+ 0x3c, 0xef, 0xc4, 0x0e, 0xff, 0x14, 0xe3, 0x42, 0x0a, 0x44, 0xe0, 0x87,
+ 0x4d, 0x75, 0x46, 0x65, 0xdd, 0x5b, 0x9e, 0xde, 0x68, 0xf6, 0x0c, 0xc0,
+ 0xf7, 0x48, 0xfe, 0x28, 0x39, 0x4a, 0xc4, 0x80, 0x64, 0xe5, 0x13, 0xbb,
+ 0x62, 0x6f, 0x32, 0x20, 0x08, 0xe2, 0x4a, 0xda, 0xe5, 0x27, 0x39, 0xc7,
+ 0xbc, 0x46, 0x4e, 0x54, 0x2b, 0x69, 0xc4, 0xcc, 0xc0, 0x22, 0xa9, 0xbd,
+ 0xca, 0xd7, 0xf5, 0x8f, 0xfd, 0xdb, 0xf1, 0x70, 0x48, 0x80, 0x11, 0xf6,
+ 0x39, 0x0a, 0xaf, 0x58, 0x6e, 0x45, 0x1a, 0xfb, 0xb0, 0xbf, 0xf6, 0x44,
+ 0xbc, 0x3a, 0x0c, 0x0a, 0x2c, 0x07, 0x62, 0x0e, 0xf0, 0x1c, 0xe5, 0x42,
+ 0xe0, 0x19, 0xb8, 0xbd, 0xcf, 0x76, 0x10, 0xf7, 0x94, 0xc1, 0x0f, 0x58,
+ 0x31, 0xdd, 0xcb, 0x50, 0x86, 0x30, 0xa0, 0x3d, 0xfd, 0x4d, 0xe7, 0xb2,
+ 0xb7, 0xbb, 0xbc, 0x5a, 0x56, 0x7a, 0x57, 0x34, 0xcb, 0xeb, 0x6f, 0x11,
+ 0x67, 0x63, 0xd2, 0xf4, 0x00, 0xf0, 0x4c, 0xe3, 0xf1, 0x48, 0xd7, 0xac,
+ 0xfe, 0xdb, 0x2c, 0x25, 0x9a, 0x48, 0x07, 0xcb, 0x07, 0x94, 0x77, 0x07,
+ 0xe7, 0xbf, 0xd5, 0xcf, 0x47, 0x88, 0xad, 0x73, 0xf3, 0x4e, 0x2a, 0x31,
+ 0x10, 0x2f, 0x0b, 0xc7, 0x2d, 0x79, 0x72, 0xe4, 0xde, 0x48, 0xf5, 0xc7,
+ 0xd9, 0x38, 0x73, 0x0e, 0xb4, 0x4a, 0xb5, 0x65, 0x85, 0x69, 0xf6, 0x22,
+ 0x8e, 0xea, 0x72, 0xc1, 0x0b, 0x67, 0xbd, 0x86, 0x05, 0x0c, 0xf7, 0x21,
+ 0x47, 0x0c, 0x23, 0x96, 0x6d, 0xce, 0xf2, 0xf9, 0x4e, 0x2f, 0x3f, 0xb8,
+ 0x88, 0xc5, 0xed, 0x0b, 0x8e, 0xd9, 0x3b, 0xa3, 0xfc, 0x88, 0xa6, 0x23,
+ 0xd5, 0x84, 0xfc, 0x09, 0xd5, 0x37, 0x78, 0xb2, 0xa5, 0x31, 0x7f, 0xf7,
+ 0x18, 0x26, 0x59, 0xfc, 0x14, 0x5a, 0x31, 0xc4, 0x85, 0xc8, 0xa7, 0x78,
+ 0x88, 0x70, 0x6b, 0x97, 0xf0, 0xee, 0x17, 0x6d, 0x53, 0x2f, 0x4c, 0x91,
+ 0x69, 0x8c, 0x8d, 0x78, 0x3e, 0x15, 0x12, 0x8b, 0xd7, 0x2a, 0xb9, 0x22,
+ 0x72, 0xcd, 0x86, 0x34, 0x90, 0x5f, 0x8b, 0x59, 0x0d, 0xca, 0x19, 0xb8,
+ 0x93, 0x03, 0x0f, 0x9a, 0x3d, 0x61, 0x7c, 0xea, 0x7c, 0x15, 0x2a, 0x88,
+ 0x29, 0x8c, 0xc7, 0xd3, 0x1d, 0x22, 0x74, 0x1a, 0x41, 0xd0, 0xe9, 0x7e,
+ 0x54, 0x61, 0x7c, 0x91, 0x6e, 0x49, 0x6a, 0x14, 0xc9, 0x75, 0xd3, 0x93,
+ 0x9e, 0x02, 0x19, 0xb7, 0xf8, 0x1d, 0x52, 0xe4, 0xa2, 0xfc, 0x08, 0xde,
+ 0xc6, 0x2f, 0xab, 0x10, 0xb7, 0x84, 0x17, 0xea, 0x93, 0x54, 0x89, 0xb2,
+ 0x2f, 0x23, 0x11, 0x77, 0xcc, 0xc9, 0x55, 0x79, 0xeb, 0x78, 0xc3, 0x92,
+ 0xc8, 0xe0, 0xd3, 0x65, 0xad, 0xbc, 0x9b, 0x99, 0x7f, 0x3c, 0x84, 0x01,
+ 0xb1, 0xc6, 0x78, 0x75, 0xc7, 0x0c, 0xe6, 0x13, 0xe8, 0x07, 0x3e, 0x14,
+ 0x83, 0x1c, 0x9f, 0xf9, 0x6d, 0xf1, 0x20, 0x1b, 0x5c, 0x5d, 0xc1, 0x95,
+ 0x85, 0x92, 0x62, 0xce, 0x75, 0xb0, 0x14, 0xc8, 0x15, 0x41, 0x62, 0xf0,
+ 0x99, 0x8c, 0xba, 0x4f, 0xcd, 0xb4, 0x3e, 0x29, 0x60, 0x51, 0x04, 0x98,
+ 0x65, 0x82, 0xc6, 0x4d, 0xde, 0xab, 0x30, 0x6a, 0xc4, 0xd2, 0xee, 0x86,
+ 0xf7, 0x60, 0xaa, 0x86, 0x36, 0x1d, 0x36, 0xc9, 0xc6, 0x89, 0x72, 0x3a,
+ 0x73, 0x5f, 0xba, 0x79, 0xbb, 0xc8, 0xaa, 0x98, 0x99, 0xdd, 0xdf, 0x8b,
+ 0xab, 0x30, 0xd9, 0x64, 0x3e, 0x07, 0xb7, 0x9d, 0x1f, 0x84, 0xc1, 0xae,
+ 0xfa, 0x57, 0x2b, 0x95, 0x19, 0xdf, 0xe9, 0xe4, 0x04, 0x8d, 0x8e, 0x0b,
+ 0x38, 0xc8, 0xf8, 0x67, 0x1b, 0xb8, 0xea, 0xf3, 0xfa, 0x64, 0xe2, 0x98,
+ 0x10, 0x67, 0xb1, 0x0a, 0xb3, 0x8e, 0x30, 0x1c, 0x2c, 0xe8, 0x92, 0x15,
+ 0xa5, 0xef, 0xa0, 0x8d, 0x62, 0xff, 0xb6, 0x9a, 0x15, 0x0a, 0xd7, 0x8f,
+ 0x9d, 0x1c, 0x63, 0xe1, 0x75, 0x07, 0xe2, 0xb3, 0x01, 0xc0, 0x87, 0x50,
+ 0x45, 0x60, 0x7a, 0x92, 0x78, 0x41, 0xc7, 0xee, 0xb0, 0xe2, 0x50, 0x72,
+ 0xd5, 0x38, 0x6e, 0xdb, 0xd7, 0xc3, 0x6b, 0x2e, 0xa0, 0xc2, 0x6e, 0xcb,
+ 0x41, 0x34, 0xfb, 0x86, 0xf9, 0x00, 0x74, 0x1d, 0x30, 0x35, 0xf9, 0x0a,
+ 0xc8, 0x23, 0x2c, 0x5d, 0xf5, 0x0d, 0x98, 0x63, 0x20, 0xab, 0xb4, 0x71,
+ 0xe8, 0x80, 0xab, 0x59, 0xbe, 0xa5, 0x8a, 0x6a, 0x50, 0x36, 0x5b, 0xb8,
+ 0xfe, 0x6c, 0xdf, 0x15, 0x8c, 0x30, 0x5c, 0xa0, 0x22, 0x48, 0x04, 0xff,
+ 0xe3, 0x16, 0x00, 0xf3, 0xa4, 0x8b, 0x79, 0xcc, 0x1c, 0x60, 0x59, 0xc3,
+ 0x05, 0x2a, 0x74, 0xe2, 0xff, 0xee, 0xef, 0x1f, 0x01, 0xeb, 0x6c, 0xff,
+ 0x8c, 0x6e, 0x6b, 0x60, 0x9e, 0x1b, 0x75, 0x7b, 0x39, 0xcb, 0x03, 0xa2,
+ 0x3c, 0x71, 0x44, 0x9c, 0x5b, 0x81, 0xb3, 0x83, 0xac, 0x26, 0x59, 0xb4,
+ 0xaa, 0xb7, 0xfe, 0xa5, 0x24, 0xe3, 0xf7, 0x87, 0x19, 0xbd, 0x90, 0xe1,
+ 0xcc, 0x7c, 0xff, 0xa4, 0x32, 0xdc, 0xd1, 0x0d, 0x02, 0x5a, 0x6f, 0xf9,
+ 0x4f, 0x91, 0x7a, 0xd6, 0x87, 0x2e, 0xbd, 0xcd, 0x8e, 0x99, 0x99, 0xf6,
+ 0xb4, 0xb8, 0x90, 0x2d, 0x56, 0x24, 0x08, 0x4c, 0x14, 0xc4, 0x12, 0x0f,
+ 0xa3, 0x70, 0x84, 0x4e, 0x82, 0xb9, 0x31, 0x63, 0x45, 0x5b, 0x9d, 0x9a,
+ 0x45, 0xf7, 0x6c, 0x26, 0xad, 0x51, 0x5b, 0x68, 0xf2, 0x50, 0x24, 0x8f,
+ 0x7f, 0x8e, 0x78, 0xaa, 0x8e, 0xde, 0xe4, 0x50, 0xa1, 0x40, 0xe0, 0x2e,
+ 0xee, 0x8f, 0x47, 0x02, 0x82, 0x08, 0xb4, 0x3d, 0x58, 0x28, 0x97, 0x96,
+ 0x24, 0xcd, 0xa5, 0xb8, 0xe3, 0x92, 0xbd, 0xde, 0xd7, 0x38, 0x5b, 0x32,
+ 0x1d, 0x60, 0x96, 0xe0, 0xbe, 0xd8, 0x3e, 0x6b, 0xe6, 0x10, 0xf0, 0xb9,
+ 0x80, 0x4f, 0x76, 0x35, 0x17, 0xad, 0xb3, 0x7a, 0xda, 0x00, 0x63, 0xbd,
+ 0xb6, 0x5f, 0x38, 0x59, 0xd2, 0xa8, 0xab, 0x27, 0x8a, 0xbd, 0x9f, 0xb8,
+ 0x1c, 0x52, 0x0c, 0xd0, 0xe0, 0x9d, 0xd2, 0xbd, 0x00, 0x71, 0xdb, 0xa4,
+ 0xc1, 0x6d, 0xe0, 0x28, 0xe8, 0x8a, 0xc7, 0x09, 0x51, 0xf8, 0x3f, 0xd2,
+ 0xd6, 0x93, 0xdf, 0xef, 0x7f, 0x07, 0xdd, 0x00, 0x34, 0xcc, 0x1e, 0x19,
+ 0xf9, 0x89, 0x05, 0xee, 0x28, 0x87, 0x5a, 0x29, 0x33, 0x80, 0x9e, 0x1e,
+ 0xb9, 0x6b, 0xdb, 0x3a, 0xd3, 0xdb, 0x23, 0xd7, 0x6f, 0xc3, 0x48, 0xe6,
+ 0x35, 0x42, 0x23, 0x7a, 0x95, 0xbd, 0x8e, 0xb0, 0x79, 0xaa, 0x74, 0x5e,
+ 0x59, 0x97, 0xed, 0xf9, 0xf2, 0x0c, 0xa5, 0xc1, 0x33, 0xa5, 0xe9, 0xb9,
+ 0x9b, 0xec, 0x39, 0xa8, 0x41, 0xfe, 0x6f, 0x2b, 0xda, 0xd2, 0x8b, 0xaf,
+ 0xa8, 0x1f, 0x1d, 0x22, 0x94, 0x1c, 0x7c, 0x4b, 0xd7, 0xa9, 0x27, 0x60,
+ 0xda, 0x00, 0x4d, 0x46, 0x4d, 0xb0, 0xe3, 0x0e, 0xf1, 0x27, 0xf4, 0x07,
+ 0x9d, 0x42, 0x78, 0x78, 0x70, 0x15, 0xa5, 0x12, 0x63, 0x9c, 0x49, 0x26,
+ 0x6d, 0xc4, 0x93, 0x01, 0x51, 0xf7, 0x34, 0x8b, 0x2d, 0x3f, 0x84, 0x07,
+ 0x62, 0xaf, 0x16, 0x81, 0x7a, 0x65, 0xf1, 0xce, 0xb3, 0xde, 0x46, 0x0e,
+ 0x8b, 0xa2, 0x94, 0xa5, 0xb7, 0x04, 0x0e, 0x93, 0x63, 0xf2, 0x1b, 0xa5,
+ 0xdd, 0xbc, 0x52, 0xdc, 0x6c, 0xaa, 0xb7, 0x12, 0x39, 0x09, 0xf3, 0x3d,
+ 0x5f, 0x8f, 0x2d, 0xd4, 0x00, 0x08, 0x11, 0xe6, 0xbf, 0xbf, 0xfb, 0xd7,
+ 0xb2, 0xed, 0xb9, 0x0a, 0x41, 0x46, 0x03, 0xa0, 0x34, 0x09, 0x07, 0xf7,
+ 0xeb, 0x26, 0x3a, 0x14, 0x8c, 0xfb, 0xb8, 0xd9, 0x87, 0x6b, 0x5e, 0xa2,
+ 0x04, 0x59, 0x80, 0xff, 0x57, 0x56, 0xba, 0x94, 0xa5, 0xdc, 0xd6, 0xff,
+ 0x54, 0x4c, 0x2b, 0xf8, 0xa0, 0x60, 0x02, 0xeb, 0x7d, 0xac, 0x2b, 0x3d,
+ 0xd7, 0xc1, 0xfb, 0x53, 0xed, 0x06, 0xef, 0x60, 0x3f, 0x1e, 0x3a, 0xaf,
+ 0x58, 0xcf, 0xe4, 0x4e, 0x01, 0x31, 0x7d, 0xdd, 0x96, 0x94, 0x61, 0x8d,
+ 0x9c, 0x99, 0x17, 0x0f, 0xb4, 0x0e, 0xa3, 0x98, 0x85, 0x41, 0x63, 0x27,
+ 0x72, 0x6e, 0x91, 0xd3, 0xd1, 0x5f, 0xc3, 0xb7, 0x2a, 0xb4, 0x32, 0x47,
+ 0x85, 0xaa, 0x84, 0x83, 0x6e, 0x05, 0x23, 0x85, 0x38, 0x04, 0xf5, 0x70,
+ 0xbc, 0x0a, 0x56, 0x97, 0x41, 0xd7, 0xe8, 0x2c, 0x38, 0x72, 0x48, 0x9f,
+ 0xd7, 0xda, 0x59, 0x2d, 0x33, 0xfc, 0x06, 0x50, 0xa9, 0xc5, 0x3a, 0x4a,
+ 0xb2, 0xe9, 0x15, 0x97, 0xfe, 0x4f, 0xdd, 0xfb, 0xab, 0xa4, 0x7c, 0x78,
+ 0xb2, 0x40, 0x9f, 0x92, 0x58, 0xfb, 0xc6, 0xc8, 0x20, 0x98, 0x1e, 0x10,
+ 0x41, 0xcb, 0x73, 0x3c, 0x6c, 0x5d, 0xc1, 0x63, 0x6b, 0xa4, 0x0c, 0x7e,
+ 0xb3, 0x11, 0x03, 0x23, 0xc6, 0x36, 0x33, 0xe9, 0xe5, 0x5d, 0xa6, 0x0c,
+ 0x0b, 0xd7, 0x93, 0xdb, 0xd9, 0x06, 0xdf, 0x3c, 0x30, 0x75, 0x4f, 0xfd,
+ 0x20, 0xd5, 0x80, 0x7f, 0xbc, 0xca, 0x29, 0x29, 0x9b, 0xa3, 0x5f, 0xf6,
+ 0x46, 0x76, 0xe9, 0x07, 0x9d, 0x20, 0xfb, 0xb7, 0x46, 0xbe, 0x9d, 0xe3,
+ 0x2d, 0x3c, 0x58, 0x44, 0xf4, 0x56, 0x63, 0x54, 0x51, 0xda, 0xf5, 0x4a,
+ 0xc5, 0x03, 0xc4, 0xf1, 0x6b, 0xa9, 0xbc, 0xe0, 0x32, 0x30, 0xc4, 0xee,
+ 0x03, 0xbc, 0xf5, 0x07, 0x15, 0xa7, 0x16, 0xbe, 0x81, 0xd2, 0xf3, 0x6a,
+ 0x94, 0xff, 0x1c, 0x82, 0x96, 0x10, 0xfe, 0xe6, 0xcf, 0xc6, 0xac, 0xb2,
+ 0xe0, 0xf8, 0x00, 0xff, 0xce, 0x46, 0xcc, 0xf5, 0x5f, 0xce, 0xe1, 0xaf,
+ 0xd6, 0x26, 0x7a, 0xfb, 0x1f, 0xde, 0x7f, 0x54, 0xa9, 0x91, 0xf8, 0x5d,
+ 0x76, 0x10, 0x6a, 0x92, 0x11, 0xc5, 0x1a, 0x2c, 0x9d, 0x48, 0x0a, 0xfb,
+ 0xf6, 0x17, 0xfd, 0x85, 0xa1, 0x81, 0x79, 0x89, 0x4f, 0xfb, 0x56, 0x94,
+ 0x9e, 0x5a, 0x87, 0x9b, 0x6b, 0x72, 0x4a, 0xd1, 0x13, 0x20, 0xb4, 0xd7,
+ 0x6a, 0xc6, 0x58, 0xb0, 0x5f, 0x36, 0x2d, 0x76, 0xbc, 0xf3, 0x91, 0x60,
+ 0xaa, 0xf4, 0x8b, 0x4c, 0x9f, 0xb0, 0x80, 0x95, 0x36, 0x66, 0xb0, 0x83,
+ 0x9f, 0x90, 0xcb, 0x4e, 0xd8, 0xa1, 0x08, 0x88, 0x67, 0x10, 0x71, 0x04,
+ 0x85, 0x1f, 0x7f, 0x7d, 0xd6, 0x9f, 0x7b, 0xc3, 0xbf, 0x5e, 0x85, 0x0b,
+ 0x74, 0x24, 0x8d, 0x43, 0x0f, 0xae, 0x38, 0x9d, 0xaa, 0xa3, 0x6f, 0x7b,
+ 0x46, 0xce, 0x43, 0xfc, 0x71, 0x9a, 0x57, 0xb9, 0xf8, 0xaa, 0x6a, 0x5e,
+ 0x22, 0xf4, 0x57, 0x3d, 0xda, 0x6a, 0xe7, 0x88, 0x27, 0xe9, 0xe9, 0xca,
+ 0xce, 0xad, 0x98, 0x13, 0x93, 0xe5, 0x31, 0x71, 0x4f, 0x1a, 0xe3, 0x80,
+ 0x23, 0xaa, 0x12, 0xbb, 0x40, 0x04, 0xcb, 0xf6, 0x0c, 0x70, 0x22, 0x31,
+ 0xab, 0x4b, 0xf1, 0x2f, 0xd7, 0x77, 0x17, 0xf5, 0xdf, 0x6d, 0xed, 0x39,
+ 0x51, 0x77, 0xe1, 0x9c, 0x32, 0xef, 0xd8, 0x2d, 0x30, 0x60, 0x52, 0x3d,
+ 0x4b, 0x9a, 0x0b, 0x53, 0x6b, 0x7e, 0xee, 0x5c, 0x28, 0xd9, 0x8e, 0xe7,
+ 0xe2, 0x85, 0xe2, 0x81, 0x42, 0x0c, 0x23, 0x2d, 0x3f, 0x79, 0x52, 0xe9,
+ 0x53, 0x8b, 0xc2, 0x50, 0xca, 0x30, 0xe3, 0x4b, 0xca, 0xc5, 0xda, 0x33,
+ 0x36, 0x3e, 0xc6, 0xef, 0xd8, 0xd6, 0xa6, 0xf7, 0xeb, 0x91, 0xae, 0x61,
+ 0xb5, 0x44, 0xca, 0xd7, 0x20, 0x3e, 0x43, 0x03, 0xad, 0x1c, 0x52, 0xcf,
+ 0x0f, 0x0d, 0xad, 0x1b, 0x73, 0x24, 0x1f, 0x77, 0x58, 0xdc, 0x42, 0xd4,
+ 0x3c, 0x09, 0xfc, 0xdd, 0xcf, 0xf6, 0x2c, 0xdc, 0x39, 0xb8, 0x49, 0x64,
+ 0x0c, 0xc9, 0x05, 0xa0, 0x74, 0x1b, 0x60, 0x13, 0x4f, 0x67, 0xa3, 0x2a,
+ 0xf8, 0x3b, 0x7b, 0xaa, 0xdc, 0xda, 0x69, 0x9b, 0xc4, 0xc5, 0xec, 0x24,
+ 0x3e, 0xf9, 0x64, 0x31, 0x86, 0x39, 0x8f, 0x2b, 0x79, 0x16, 0x03, 0xff,
+ 0x32, 0x6b, 0xc4, 0xaa, 0x1c, 0xc5, 0x77, 0x79, 0xc4, 0x40, 0x97, 0x62,
+ 0xea, 0x41, 0xd0, 0xa1, 0x7b, 0x3d, 0xae, 0x7e, 0xde, 0x4d, 0xb3, 0xc9,
+ 0x21, 0xb6, 0xaf, 0x8b, 0x40, 0xea, 0xd5, 0x3d, 0x40, 0x4e, 0x5f, 0xd4,
+ 0xa3, 0xcc, 0x1a, 0x89, 0x15, 0xd5, 0x6e, 0x3e, 0xfc, 0x4e, 0xba, 0x93,
+ 0xcb, 0x95, 0x12, 0xb7, 0x59, 0x96, 0x77, 0x07, 0x40, 0x05, 0x87, 0xde,
+ 0xad, 0x6d, 0x81, 0xfe, 0x35, 0x45, 0xfa, 0x46, 0x1a, 0xa5, 0x16, 0xc3,
+ 0xb6, 0x44, 0x19, 0x21, 0xfb, 0x95, 0x23, 0xac, 0x6f, 0xa1, 0x40, 0xff,
+ 0x76, 0xb9, 0x19, 0xd4, 0x17, 0x44, 0x64, 0x00, 0x6f, 0x7e, 0xb6, 0x1a,
+ 0x55, 0x10, 0x24, 0x54, 0xe8, 0x4c, 0x8d, 0x19, 0x4f, 0x9d, 0xf4, 0xf7,
+ 0x4d, 0xc2, 0x58, 0x55, 0x92, 0x63, 0x01, 0xfe, 0xb6, 0xa7, 0x8c, 0xd6,
+ 0xbd, 0x15, 0x30, 0x91, 0x9c, 0x2e, 0xf8, 0x4c, 0x89, 0xfd, 0x43, 0xa7,
+ 0x69, 0x93, 0x8f, 0x0d, 0x5c, 0xb2, 0xaf, 0x36, 0x6d, 0x60, 0x29, 0x41,
+ 0xc2, 0x3b, 0x25, 0xb8, 0xfb, 0xf6, 0xc3, 0x26, 0x15, 0x2c, 0xf3, 0xf2,
+ 0x6e, 0xf9, 0xd0, 0x94, 0x1c, 0x45, 0x5c, 0xcf, 0xf6, 0x03, 0x59, 0xa7,
+ 0xad, 0x11, 0x15, 0x36, 0xa8, 0x7e, 0x77, 0xf7, 0x58, 0xe4, 0x68, 0x58,
+ 0x24, 0x0b, 0x16, 0xce, 0xe7, 0x7f, 0xd6, 0x06, 0x04, 0x1a, 0x92, 0x60,
+ 0xbc, 0xec, 0x7f, 0x83, 0x1b, 0xe0, 0xcc, 0x12, 0xd1, 0x82, 0x74, 0xce,
+ 0xb5, 0x64, 0xa1, 0x7e, 0x81, 0x58, 0xcd, 0xb2, 0xd1, 0x8f, 0x1c, 0xea,
+ 0xb6, 0x6e, 0x02, 0xa5, 0x88, 0x07, 0xaa, 0xfb, 0xe6, 0xbb, 0xea, 0xbd,
+ 0x0c, 0x15, 0x65, 0x9a, 0x23, 0x6d, 0x5b, 0x03, 0x1a, 0x3c, 0xc7, 0xf1,
+ 0xf3, 0x4a, 0x29, 0x38, 0xf8, 0x56, 0xcd, 0x4f, 0x42, 0x41, 0x0b, 0x2a,
+ 0x75, 0x2d, 0x52, 0x30, 0x0c, 0xcb, 0x3d, 0x54, 0xdd, 0xe2, 0x3f, 0xdd,
+ 0xf6, 0xcd, 0xb5, 0xf5, 0x24, 0xb1, 0xc0, 0x6b, 0x57, 0xe0, 0x6c, 0xbf,
+ 0x4a, 0x38, 0xc5, 0x12, 0x27, 0x4c, 0x69, 0x87, 0x31, 0x6a, 0x1f, 0xba,
+ 0xbe, 0xfc, 0x23, 0x34, 0xb5, 0x42, 0x1c, 0x99, 0x7e, 0xb3, 0x43, 0x2b,
+ 0x22, 0x4d, 0x03, 0xa0, 0x6d, 0x43, 0xa1, 0xcc, 0x27, 0x3a, 0x97, 0x18,
+ 0xe0, 0x75, 0x2a, 0x30, 0x5d, 0x9f, 0xc1, 0xfb, 0x0e, 0xdb, 0x20, 0xdf,
+ 0x98, 0xe9, 0xc0, 0xcf, 0x34, 0x38, 0x43, 0x62, 0x76, 0x0b, 0x69, 0xac,
+ 0x22, 0x3f, 0x3e, 0x8f, 0xb8, 0x9f, 0xa8, 0x52, 0x76, 0x4a, 0xe0, 0x76,
+ 0x00, 0xdd, 0x92, 0x02, 0x72, 0x05, 0x02, 0x18, 0xd9, 0x7c, 0xd5, 0x5d,
+ 0x47, 0x1b, 0xed, 0x80, 0xb8, 0xa4, 0x2a, 0xf8, 0x06, 0x66, 0x7d, 0x5f,
+ 0x23, 0xb9, 0x55, 0xa2, 0x68, 0x3a, 0x11, 0x51, 0xc7, 0xd3, 0xe4, 0x89,
+ 0x32, 0xd5, 0xf5, 0x53, 0xcd, 0xde, 0xbf, 0x26, 0x5b, 0xa0, 0xa6, 0x0d,
+ 0x42, 0x50, 0x80, 0xa0, 0x2f, 0x27, 0x13, 0x82, 0x0b, 0xfe, 0xc9, 0x49,
+ 0xbe, 0xde, 0x87, 0x8f, 0x47, 0x30, 0x22, 0x27, 0x6e, 0xef, 0xf5, 0x82,
+ 0x44, 0xa8, 0x4a, 0xf7, 0xf2, 0xe4, 0x04, 0x54, 0x4c, 0xf7, 0x83, 0x39,
+ 0x7d, 0xcb, 0xec, 0x8b, 0x89, 0x70, 0x41, 0xfc, 0x2b, 0xa3, 0x1e, 0x51,
+ 0xac, 0xa9, 0x11, 0x6a, 0x69, 0xcc, 0x06, 0x99, 0x9f, 0xbc, 0x90, 0x0f,
+ 0x61, 0x22, 0xa3, 0x61, 0x46, 0x42, 0xce, 0x11, 0x09, 0x31, 0x3a, 0xf8,
+ 0x9d, 0x05, 0xc7, 0x33, 0x8a, 0x5c, 0xe7, 0x19, 0x09, 0xeb, 0x68, 0x5f,
+ 0xc7, 0x95, 0x12, 0xe4, 0xd4, 0x38, 0x75, 0x47, 0xa1, 0x66, 0xf1, 0x31,
+ 0x23, 0xf1, 0x98, 0x16, 0xdd, 0x64, 0xe8, 0xf8, 0x28, 0x57, 0x3e, 0x79,
+ 0x5b, 0x77, 0x5c, 0x76, 0xce, 0x70, 0xf5, 0x56, 0xc9, 0x4c, 0xf7, 0xcb,
+ 0x00, 0xd4, 0xc8, 0xe3, 0xbc, 0xe6, 0x20, 0xdf, 0xa1, 0x39, 0x9f, 0x51,
+ 0x40, 0x96, 0x8f, 0xc1, 0x81, 0x6f, 0xa4, 0x18, 0xb8, 0xb6, 0x0c, 0x16,
+ 0x5d, 0x1c, 0xfb, 0x3a, 0x82, 0x94, 0x7d, 0x84, 0x55, 0xd0, 0x20, 0x62,
+ 0xd3, 0xb5, 0x66, 0x6c, 0xa5, 0x22, 0x14, 0x18, 0xed, 0xd9, 0x62, 0x39,
+ 0xc1, 0x35, 0xc9, 0x03, 0x52, 0x9b, 0x9c, 0x30, 0x2c, 0x9b, 0x5d, 0xd0,
+ 0xb6, 0xc5, 0x57, 0xda, 0x6c, 0x69, 0xb9, 0xc7, 0x33, 0x8a, 0x17, 0xd0,
+ 0xcd, 0x22, 0x62, 0xc3, 0x04, 0xc1, 0x79, 0x4c, 0x7f, 0xad, 0x3d, 0xf5,
+ 0xba, 0xd6, 0x7d, 0x35, 0x9b, 0x49, 0x97, 0xee, 0xaf, 0x2b, 0x5c, 0x01,
+ 0xf6, 0x88, 0xf1, 0x64, 0xe0, 0x60, 0x1a, 0x09, 0x20, 0x0c, 0x8b, 0x28,
+ 0x91, 0xc5, 0x5c, 0x0f, 0x2b, 0x11, 0xaf, 0x5f, 0x63, 0xf9, 0xba, 0x44,
+ 0x9a, 0x75, 0xd4, 0xb2, 0x7e, 0x6a, 0x42, 0xf5, 0x52, 0xfb, 0x65, 0x46,
+ 0x33, 0xe2, 0xde, 0x50, 0xb3, 0xc6, 0x82, 0x3a, 0x23, 0x3d, 0x06, 0x64,
+ 0xd9, 0xe5, 0x2b, 0xae, 0x30, 0xa9, 0x9d, 0x09, 0x38, 0x2e, 0xfa, 0xbe,
+ 0xda, 0xd0, 0x6e, 0xb0, 0xc9, 0xf5, 0xb0, 0xf2, 0xbe, 0x59, 0x7b, 0x32,
+ 0x7e, 0xaa, 0x6c, 0xf5, 0x68, 0xe4, 0x2c, 0x83, 0x2d, 0x9f, 0xc6, 0x3d,
+ 0x18, 0x8a, 0xaf, 0x6c, 0x9b, 0x0d, 0x3b, 0xd2, 0x64, 0x1a, 0xf4, 0x43,
+ 0x05, 0xe2, 0x02, 0x20, 0x06, 0xb8, 0x9b, 0x0e, 0x4a, 0x23, 0x95, 0x1c,
+ 0x3e, 0x14, 0x36, 0x3d, 0x15, 0x46, 0x98, 0x2a, 0xa5, 0xdf, 0xd9, 0x07,
+ 0x6a, 0x70, 0xd2, 0x33, 0x8c, 0xb2, 0x9a, 0x62, 0x30, 0x08, 0x06, 0xc7,
+ 0x96, 0x04, 0xc1, 0xfc, 0x1b, 0x11, 0xe9, 0x6c, 0x96, 0x36, 0xfe, 0x3a,
+ 0x66, 0x02, 0x97, 0xdd, 0x32, 0xab, 0x76, 0x78, 0xda, 0x28, 0x0e, 0x31,
+ 0x6c, 0xe9, 0x1e, 0x40, 0xbe, 0x6d, 0x18, 0x5c, 0xdf, 0x13, 0x4d, 0x83,
+ 0x90, 0xec, 0x50, 0xf7, 0xea, 0xad, 0x32, 0x3f, 0x42, 0x79, 0x08, 0x7d,
+ 0x70, 0x80, 0x8b, 0x47, 0x21, 0xec, 0x90, 0x7d, 0x6c, 0x74, 0xf7, 0x32,
+ 0x03, 0x3a, 0xf3, 0x93, 0xb4, 0x02, 0xf2, 0xe1, 0xcb, 0x05, 0xf5, 0xc5,
+ 0xd4, 0x92, 0x22, 0x6e, 0x80, 0xc5, 0x01, 0x10, 0x5c, 0x42, 0x58, 0xb0,
+ 0x00, 0x74, 0x40, 0x1f, 0x00, 0x01, 0x7d, 0x68, 0x68, 0x55, 0xe9, 0xb1,
+ 0x3b, 0x2b, 0xaa, 0xba, 0xeb, 0xc8, 0xc6, 0xaa, 0xdb, 0x85, 0x12, 0x9b,
+ 0x3a, 0x89, 0x97, 0x70, 0x30, 0x00, 0xcf, 0x13, 0x0c, 0x81, 0x93, 0x14,
+ 0x9e, 0x0a, 0xf6, 0x64, 0xb3, 0x1e, 0x83, 0xb7, 0x50, 0x2d, 0xd5, 0x39,
+ 0x74, 0xe5, 0xb1, 0x9e, 0x68, 0xae, 0xc4, 0xd5, 0xa8, 0x72, 0x11, 0xe7,
+ 0xfc, 0xc5, 0xa1, 0x73, 0x08, 0xc4, 0xb2, 0xd8, 0x72, 0x7c, 0x5e, 0xdc,
+ 0xc5, 0x94, 0x1a, 0xc2, 0xeb, 0x13, 0x00, 0xf1, 0xf0, 0xd4, 0x36, 0x9d,
+ 0x24, 0x3a, 0x2a, 0x6b, 0xbf, 0x03, 0xf2, 0xce, 0x9b, 0x72, 0x6a, 0x78,
+ 0x21, 0x6c, 0x3f, 0xf1, 0xcf, 0x66, 0xb6, 0x3b, 0x9d, 0x68, 0x07, 0x2d,
+ 0xe0, 0xca, 0x2a, 0x84, 0x5c, 0x1d, 0xd4, 0xde, 0x82, 0xad, 0xc0, 0x88,
+ 0x82, 0x58, 0xed, 0x72, 0x94, 0x18, 0x13, 0xd4, 0xc3, 0x35, 0x3e, 0xb4,
+ 0x34, 0x6f, 0x26, 0x51, 0xf2, 0x34, 0xde, 0xed, 0xb7, 0x52, 0xa0, 0x94,
+ 0x85, 0x52, 0xdc, 0x38, 0xd9, 0x73, 0xdd, 0xd7, 0xa0, 0x6f, 0xec, 0xcf,
+ 0xd9, 0x3d, 0xd2, 0xf4, 0xc1, 0xcc, 0x46, 0xc6, 0xf7, 0xb8, 0x8c, 0xaa,
+ 0x71, 0xbc, 0x48, 0xdb, 0xb1, 0xba, 0x5e, 0x4c, 0x71, 0x67, 0x22, 0x38,
+ 0x9b, 0x7c, 0x47, 0x73, 0xf4, 0xc1, 0x9d, 0x9e, 0x51, 0x93, 0xe7, 0x9b,
+ 0xee, 0x86, 0xaf, 0x1b, 0x6f, 0x1c, 0x5c, 0x6f, 0x0d, 0xca, 0x17, 0xc9,
+ 0xcc, 0x74, 0xdd, 0xaa, 0x40, 0xde, 0x63, 0xee, 0x46, 0x9c, 0x60, 0x49,
+ 0xee, 0x6e, 0x8d, 0xaf, 0xbe, 0x5b, 0x39, 0xc1, 0xdb, 0x2c, 0xaa, 0x2f,
+ 0xed, 0x0d, 0x52, 0xcd, 0x40, 0xd8, 0x7a, 0xd3, 0x81, 0x2d, 0x76, 0x70,
+ 0xee, 0x7e, 0xe9, 0xdd, 0xe7, 0x74, 0x08, 0xa0, 0x40, 0xab, 0x55, 0x1d,
+ 0x25, 0xe2, 0xc1, 0xd4, 0xe8, 0xf2, 0xdf, 0x35, 0x5b, 0x19, 0xd9, 0x18,
+ 0x18, 0x0f, 0x0e, 0xeb, 0x5f, 0xf4, 0x0b, 0xc3, 0x38, 0xb6, 0x0a, 0x16,
+ 0x45, 0xa3, 0xb7, 0x5a, 0x44, 0x2c, 0x45, 0x5f, 0x57, 0x69, 0xd9, 0x7d,
+ 0xe5, 0x92, 0xcc, 0x97, 0xd7, 0x35, 0x08, 0x28, 0x80, 0x1c, 0xab, 0x8d,
+ 0xc6, 0x58, 0xe6, 0xd1, 0x60, 0xb6, 0x09, 0x36, 0x40, 0x0c, 0x00, 0xf1,
+ 0x13, 0xd7, 0x58, 0xca, 0x58, 0x1f, 0x88, 0x52, 0xb4, 0x20, 0x64, 0x9d,
+ 0x3a, 0x22, 0xa9, 0xef, 0x83, 0x6c, 0x35, 0x34, 0x43, 0x55, 0x5f, 0x7c,
+ 0xfd, 0xb2, 0x1d, 0xa5, 0x22, 0x7a, 0xdc, 0xcf, 0xae, 0x1d, 0x09, 0xfb,
+ 0x72, 0xbf, 0xa0, 0x49, 0xe3, 0xe0, 0x47, 0xfe, 0xbf, 0xb4, 0xcf, 0x97,
+ 0xf3, 0x69, 0xa0, 0x1b, 0x59, 0x7f, 0x99, 0xea, 0xd2, 0x5b, 0x01, 0xa8,
+ 0xaf, 0xe3, 0x97, 0xfe, 0xa9, 0xe2, 0xd7, 0x18, 0x20, 0x65, 0xa9, 0x36,
+ 0x77, 0x7c, 0x5f, 0x46, 0x9f, 0xe8, 0x76, 0xfc, 0x17, 0x81, 0x92, 0x92,
+ 0xd9, 0x38, 0xcf, 0x88, 0x39, 0x53, 0xcd, 0x9a, 0x7d, 0x63, 0xba, 0x9c,
+ 0x2e, 0x97, 0x15, 0xbf, 0xd2, 0x76, 0x97, 0x8d, 0x15, 0x5a, 0x06, 0x13,
+ 0x1d, 0xfd, 0x4b, 0x38, 0xfb, 0x7c, 0x9e, 0x08, 0x10, 0xee, 0x95, 0x49,
+ 0x8e, 0x28, 0xe7, 0x9f, 0x92, 0x55, 0xee, 0xa8, 0xf5, 0x7c, 0x87, 0x81,
+ 0x7d, 0x6f, 0x96, 0x83, 0xc9, 0x49, 0x9a, 0xc0, 0x96, 0x9a, 0xfe, 0x05,
+ 0x04, 0xa5, 0x7b, 0xd5, 0xf2, 0x62, 0xf6, 0x29, 0xa6, 0x5e, 0x27, 0x2f,
+ 0xa7, 0x7c, 0x8a, 0x51, 0x35, 0xb8, 0x82, 0xc2, 0xc8, 0x35, 0xcd, 0x2d,
+ 0x9e, 0x2f, 0x16, 0xc6, 0x1d, 0x6a, 0xca, 0x33, 0x55, 0x75, 0x25, 0x1d,
+ 0x65, 0x9a, 0x9b, 0xbf, 0x05, 0x0b, 0xf5, 0x59, 0x70, 0x3b, 0x06, 0xc8,
+ 0x66, 0x89, 0xdb, 0x5c, 0x7e, 0xa0, 0x5d, 0x36, 0x9e, 0x79, 0xf9, 0xc7,
+ 0xab, 0xab, 0x88, 0x8d, 0xdf, 0xc4, 0xd7, 0x68, 0xa9, 0x11, 0x57, 0x16,
+ 0x74, 0xf6, 0x2f, 0x96, 0xce, 0x10, 0xa1, 0xdc, 0x4d, 0xaa, 0xef, 0x62,
+ 0xcb, 0xc6, 0x72, 0x19, 0xc9, 0xee, 0xbf, 0xe7, 0xf9, 0x5b, 0x39, 0x4d,
+ 0x1d, 0x02, 0x1c, 0xd6, 0xd0, 0xa5, 0x06, 0x97, 0x1a, 0xcd, 0xfb, 0x0b,
+ 0x7e, 0x7c, 0x9b, 0xa1, 0xab, 0xb9, 0x50, 0x0d, 0xce, 0x91, 0x1b, 0x95,
+ 0xc9, 0xfd, 0x39, 0x80, 0x7a, 0x14, 0x02, 0x63, 0x23, 0x7b, 0x14, 0x34,
+ 0x3d, 0x52, 0xcf, 0x7b, 0xa2, 0x9f, 0x84, 0x6d, 0xb4, 0x1f, 0xff, 0x41,
+ 0x28, 0x87, 0xbc, 0xfc, 0x59, 0xa4, 0x9e, 0xe6, 0xb0, 0x22, 0x2c, 0x57,
+ 0x68, 0xf4, 0x6d, 0xcf, 0xe5, 0x32, 0xcb, 0x7f, 0x25, 0xe5, 0xf2, 0xaf,
+ 0x7a, 0xb3, 0x67, 0xbb, 0xbc, 0x1a, 0xa9, 0xcc, 0xcd, 0x33, 0xfc, 0x21,
+ 0x09, 0xff, 0xbf, 0x32, 0xe7, 0xbe, 0xca, 0xe7, 0xbd, 0xca, 0xa9, 0x5c,
+ 0xb7, 0x6f, 0xe5, 0xb6, 0x6d, 0x9a, 0x75, 0xc7, 0x35, 0xa2, 0xf0, 0xa4,
+ 0x4a, 0x3e, 0x32, 0xb0, 0xc4, 0xf4, 0xfd, 0xad, 0x1f, 0xc9, 0x1c, 0xb9,
+ 0x53, 0x2e, 0xd3, 0xcc, 0x89, 0x7f, 0x89, 0x70, 0xa5, 0x46, 0xb7, 0x6b,
+ 0xca, 0x45, 0xe2, 0x82, 0x2f, 0x85, 0x56, 0x0b, 0x93, 0xbb, 0xa4, 0x69,
+ 0xba, 0xb5, 0x9e, 0x95, 0xe2, 0x0a, 0xa3, 0x90, 0x8d, 0xdb, 0x66, 0xba,
+ 0x72, 0xf3, 0x4a, 0xd1, 0xa1, 0xc5, 0xf8, 0xdf, 0xdc, 0xc0, 0x92, 0x98,
+ 0xce, 0x17, 0x4c, 0xfe, 0xf0, 0x5e, 0xc6, 0x82, 0xf8, 0x38, 0xe6, 0x4e,
+ 0x0e, 0x7b, 0x8f, 0x76, 0xd5, 0x14, 0xbd, 0xd6, 0xb5, 0x23, 0x09, 0xba,
+ 0xbe, 0xed, 0xf0, 0x2a, 0xe7, 0xdc, 0x2a, 0xfe, 0x9e, 0xcf, 0x1b, 0x2e,
+ 0x6e, 0x81, 0x53, 0x78, 0xdf, 0x4d, 0x62, 0x05, 0x99, 0x2e, 0x11, 0x96,
+ 0x7e, 0xd9, 0x0d, 0xe7, 0xd5, 0x73, 0x1f, 0x5c, 0xa3, 0xe4, 0x3b, 0xff,
+ 0xdd, 0xa3, 0x83, 0x6c, 0xf7, 0xd3, 0x0f, 0x9e, 0xce, 0x73, 0xd9, 0x52,
+ 0x68, 0xea, 0x99, 0xb7, 0xab, 0x88, 0xfd, 0x2f, 0x1e, 0xc9, 0x23, 0x6f,
+ 0x98, 0x54, 0xac, 0x00, 0x9b, 0x9b, 0x0f, 0xe1, 0x09, 0xa1, 0xb3, 0xe6,
+ 0x23, 0x73, 0xa2, 0x27, 0xe1, 0x1d, 0x06, 0x96, 0x61, 0x20, 0x96, 0x24,
+ 0x00, 0xb5, 0x22, 0x9b, 0xca, 0xd6, 0xbb, 0x2d, 0x72, 0x0d, 0xea, 0xa2,
+ 0xde, 0xfb, 0x8b, 0xfa, 0x41, 0xd6, 0xc8, 0x80, 0x8b, 0x33, 0x79, 0x6b,
+ 0xc0, 0xf3, 0xd9, 0x09, 0xe9, 0x6d, 0x86, 0xcd, 0x1d, 0x30, 0xb9, 0x98,
+ 0x85, 0xc4, 0x1f, 0x90, 0xcd, 0x07, 0x91, 0xf2, 0x50, 0xf8, 0xfc, 0x0f,
+ 0xd7, 0x58, 0xbb, 0x73, 0x65, 0x3e, 0x32, 0x22, 0x37, 0x91, 0x72, 0x20,
+ 0xee, 0x77, 0x2c, 0xc7, 0x76, 0x85, 0xf2, 0x6a, 0xcf, 0x9c, 0xe3, 0xe7,
+ 0x08, 0x3f, 0xa8, 0xee, 0x04, 0x02, 0x66, 0x8e, 0x08, 0xcc, 0x25, 0xde,
+ 0xca, 0xd4, 0x6b, 0xba, 0xd3, 0x0a, 0x49, 0x5b, 0x92, 0x46, 0x11, 0x5a,
+ 0x0c, 0x8c, 0x17, 0x7b, 0xbc, 0xad, 0xab, 0x20, 0x3b, 0xde, 0x0f, 0xe9,
+ 0x7d, 0x7d, 0xf3, 0x6b, 0x22, 0x90, 0xe1, 0x00, 0xd2, 0xa9, 0xbd, 0x78,
+ 0x4e, 0xda, 0x3b, 0x8d, 0xb5, 0xad, 0x8c, 0xf2, 0x23, 0x38, 0x7f, 0x67,
+ 0xc6, 0x87, 0x1e, 0xa6, 0x40, 0xe7, 0xd3, 0x35, 0x10, 0x0e, 0xa1, 0x61,
+ 0x60, 0x48, 0xa6, 0x1f, 0x61, 0xe2, 0x7f, 0x5e, 0x2b, 0xcf, 0xd5, 0x86,
+ 0x55, 0x7a, 0xa4, 0xd5, 0x58, 0x4b, 0x12, 0x30, 0x77, 0x15, 0x10, 0x00,
+ 0xc9, 0xe1, 0x70, 0x2e, 0x8a, 0x7c, 0xb6, 0x3a, 0x84, 0xef, 0x6c, 0x9f,
+ 0xef, 0xf1, 0x6c, 0xf2, 0x22, 0xa4, 0x36, 0xc2, 0x2d, 0xc5, 0x7e, 0xb1,
+ 0x9d, 0xdb, 0x5b, 0xb9, 0x3b, 0x06, 0x76, 0x21, 0x5d, 0xfc, 0x06, 0xb7,
+ 0x15, 0xc0, 0x0d, 0xf4, 0x07, 0x64, 0x26, 0x92, 0x3c, 0xbb, 0x99, 0xa3,
+ 0xdf, 0x8e, 0x67, 0x06, 0x17, 0xee, 0x3c, 0xa4, 0x97, 0x8e, 0x83, 0x4e,
+ 0x4b, 0x82, 0x4c, 0x40, 0x45, 0x63, 0x8a, 0xcc, 0xfd, 0x4d, 0x13, 0xb3,
+ 0x5d, 0x56, 0x5d, 0x55, 0x62, 0x69, 0x83, 0x5b, 0x7f, 0x62, 0x43, 0x71,
+ 0xc0, 0xf5, 0x0f, 0x2c, 0xc7, 0x5b, 0x1d, 0x50, 0xac, 0x3f, 0x9b, 0xfa,
+ 0x75, 0xd9, 0x77, 0xa9, 0x67, 0x83, 0x24, 0x9a, 0x48, 0xdd, 0xbe, 0x54,
+ 0x68, 0x05, 0x3b, 0xf4, 0x9b, 0xac, 0xce, 0x2e, 0x85, 0x06, 0xc5, 0x08,
+ 0xad, 0x2d, 0x7d, 0xd1, 0xd8, 0x40, 0x17, 0x57, 0x2c, 0x0e, 0xdc, 0x5c,
+ 0x21, 0xac, 0x55, 0xdd, 0x69, 0xe0, 0x4c, 0x13, 0x85, 0x29, 0x78, 0x43,
+ 0xdf, 0xea, 0xc5, 0x3f, 0x74, 0x0c, 0x8a, 0x12, 0xeb, 0xf7, 0x53, 0x2f,
+ 0x4f, 0x25, 0x20, 0x38, 0xb2, 0x88, 0xce, 0x16, 0x95, 0x98, 0xab, 0xa6,
+ 0xf8, 0x8a, 0x40, 0x67, 0x6d, 0x71, 0xb7, 0xa8, 0x9f, 0x33, 0x27, 0x19,
+ 0x69, 0x37, 0xb0, 0xea, 0xae, 0x1b, 0xe1, 0x7d, 0xad, 0xcb, 0x60, 0x5d,
+ 0xb6, 0x81, 0x8a, 0x1f, 0x66, 0x6f, 0x65, 0xa2, 0x1c, 0x8a, 0x8d, 0x77,
+ 0x37, 0x1f, 0x13, 0x22, 0x08, 0x09, 0xdb, 0x81, 0x70, 0x5f, 0x4b, 0xba,
+ 0x06, 0x14, 0x2d, 0x2c, 0xf9, 0xfd, 0x64, 0xdf, 0x76, 0x28, 0xfa, 0x98,
+ 0x16, 0x9f, 0x85, 0x38, 0x5a, 0x92, 0x0a, 0x7a, 0x1e, 0x38, 0xf6, 0x23,
+ 0x2e, 0xd0, 0xad, 0xb5, 0x68, 0x78, 0x67, 0x77, 0x95, 0x2a, 0x7e, 0x5a,
+ 0x22, 0x15, 0x93, 0x16, 0x91, 0xdd, 0x63, 0x22, 0x5d, 0x83, 0x58, 0xe2,
+ 0xe0, 0xe1, 0x45, 0x65, 0x3e, 0x16, 0xaa, 0x57, 0x5f, 0xbe, 0xc3, 0xdf,
+ 0xda, 0xdd, 0x0f, 0x2c, 0x15, 0x7d, 0x10, 0x68, 0xef, 0xe8, 0x94, 0x85,
+ 0xd7, 0xf2, 0x27, 0x3f, 0x14, 0x76, 0xef, 0xb9, 0x63, 0x30, 0x1b, 0x93,
+ 0x98, 0x75, 0x56, 0x5a, 0x3e, 0x04, 0x07, 0x1a, 0x65, 0xbf, 0x18, 0xc6,
+ 0x2c, 0x64, 0x33, 0x5c, 0x09, 0x21, 0x33, 0xe2, 0x57, 0x5a, 0xd1, 0xb5,
+ 0xa2, 0xa1, 0x5d, 0xae, 0xba, 0xc1, 0x8f, 0x48, 0x78, 0xbb, 0x98, 0x0a,
+ 0x31, 0xd7, 0x95, 0x7e, 0x2c, 0xf2, 0xd7, 0x41, 0x4e, 0x2b, 0x46, 0x4c,
+ 0xe2, 0x20, 0xbc, 0x78, 0x2f, 0x7a, 0xf5, 0x64, 0x75, 0x3f, 0x22, 0x9f,
+ 0x1d, 0xfc, 0xc7, 0xbc, 0x39, 0x99, 0x70, 0x3d, 0xe3, 0x94, 0x6d, 0xb1,
+ 0x1a, 0x80, 0x92, 0xbd, 0x9d, 0xd2, 0xb9, 0x0d, 0xc5, 0x61, 0xe4, 0x70,
+ 0x63, 0x27, 0x8b, 0x5c, 0x5b, 0xa8, 0x1d, 0x3b, 0xad, 0x29, 0x26, 0x4b,
+ 0x67, 0x9a, 0x27, 0x11, 0xfa, 0x42, 0xd9, 0x76, 0x11, 0x51, 0x47, 0x9f,
+ 0xed, 0xfa, 0x62, 0xc9, 0xd2, 0x7c, 0x87, 0xca, 0xc4, 0x67, 0x9c, 0xee,
+ 0xff, 0xcf, 0x2c, 0x83, 0xa9, 0x9f, 0xca, 0xf1, 0x6a, 0xe3, 0x6f, 0x4b,
+ 0x11, 0xd4, 0xa5, 0x42, 0x53, 0xa2, 0x4a, 0x11, 0xfc, 0xc6, 0xa8, 0x6a,
+ 0x68, 0xcb, 0x6e, 0xac, 0xa1, 0x47, 0xc2, 0xea, 0xd7, 0x45, 0xa2, 0xd9,
+ 0xeb, 0x89, 0x3e, 0x98, 0x24, 0x20, 0x92, 0x71, 0xec, 0xf0, 0xbc, 0xbd,
+ 0xcd, 0x46, 0x46, 0x47, 0x1d, 0x54, 0xc2, 0x11, 0xb0, 0x76, 0xe7, 0x6c,
+ 0xb7, 0xcd, 0xd2, 0x6d, 0xc5, 0x4f, 0x44, 0xf1, 0xe5, 0x19, 0x36, 0x89,
+ 0x9e, 0xf0, 0xbf, 0x3f, 0x07, 0x17, 0x58, 0xb3, 0x68, 0x44, 0x14, 0x44,
+ 0x3f, 0xf9, 0x01, 0x70, 0xdc, 0xf9, 0x6f, 0x5d, 0xa0, 0x27, 0xa6, 0x0b,
+ 0x41, 0x74, 0x4e, 0xcd, 0x77, 0xdb, 0x6c, 0x40, 0xd0, 0x21, 0x4a, 0xa2,
+ 0x01, 0x85, 0x8c, 0x34, 0x3b, 0xca, 0x31, 0xa6, 0x48, 0x5d, 0x37, 0xc8,
+ 0xa1, 0xd5, 0xe0, 0x7f, 0x3e, 0xeb, 0x22, 0xba, 0xca, 0xe6, 0xd6, 0x71,
+ 0x63, 0x06, 0x89, 0x46, 0xf0, 0xe5, 0x38, 0x92, 0x28, 0x5d, 0x4c, 0xb9,
+ 0xbb, 0x70, 0x9e, 0x89, 0xb1, 0xe7, 0xf5, 0x1a, 0x86, 0xe8, 0x01, 0x83,
+ 0x6e, 0xb6, 0x37, 0x3a, 0xfb, 0xb8, 0x2f, 0x11, 0x7d, 0xa2, 0x5d, 0xf8,
+ 0x2a, 0x8c, 0xb7, 0xac, 0xbe, 0x89, 0xb9, 0x59, 0x62, 0x09, 0xbf, 0x95,
+ 0xf8, 0x04, 0x28, 0xf2, 0xd0, 0xe1, 0x0f, 0x48, 0xb1, 0xc7, 0xfa, 0x5e,
+ 0xb1, 0xb7, 0x60, 0x74, 0x96, 0x53, 0xb0, 0xac, 0x14, 0xbf, 0xb2, 0xc2,
+ 0xbe, 0xc2, 0xb1, 0xcf, 0xfd, 0xbc, 0xd9, 0x35, 0xa6, 0x63, 0x09, 0x63,
+ 0x14, 0xc4, 0x8a, 0x5a, 0x1f, 0x45, 0x06, 0xa8, 0x6c, 0xe7, 0xdc, 0x5b,
+ 0x81, 0x2f, 0xa5, 0xd4, 0xcf, 0x71, 0x0c, 0x22, 0x5d, 0x80, 0x31, 0x49,
+ 0xbe, 0x4c, 0xe6, 0x1e, 0xe6, 0xad, 0x82, 0x78, 0xc2, 0xe5, 0xfd, 0x91,
+ 0x36, 0xc1, 0xc6, 0xf1, 0x1f, 0xbe, 0xf5, 0xa2, 0x8e, 0x86, 0xf9, 0x05,
+ 0xd3, 0xd2, 0x01, 0x3d, 0x2d, 0xb2, 0xd0, 0x35, 0x75, 0xbd, 0x3d, 0x28,
+ 0xc4, 0xc3, 0xa4, 0xf7, 0x64, 0x85, 0x9c, 0x1c, 0x84, 0x81, 0x40, 0x4f,
+ 0x69, 0x8e, 0xb8, 0x88, 0xb6, 0x0b, 0x35, 0x45, 0x1a, 0x34, 0xa3, 0x1f,
+ 0x8f, 0xc5, 0x62, 0x3f, 0xa9, 0x9e, 0xaa, 0xb0, 0x3c, 0xcf, 0x5d, 0x11,
+ 0xb8, 0xfe, 0xac, 0xfa, 0xfa, 0x0f, 0x7b, 0x97, 0x7e, 0x3e, 0x13, 0x59,
+ 0xc2, 0x65, 0x4a, 0x18, 0xe6, 0xa0, 0x2a, 0x9a, 0x9a, 0x07, 0x73, 0x0a,
+ 0x0d, 0x95, 0xa8, 0x3e, 0xb9, 0x08, 0x90, 0x71, 0xd0, 0x37, 0x76, 0x57,
+ 0xc9, 0x72, 0x68, 0x2e, 0x7b, 0x69, 0xa6, 0x56, 0xcd, 0xb4, 0x37, 0x18,
+ 0xba, 0x9c, 0xbb, 0x25, 0x7b, 0xde, 0xa8, 0xec, 0xd6, 0x31, 0xcb, 0x91,
+ 0x28, 0x38, 0x15, 0x33, 0x4b, 0xaf, 0x06, 0xb2, 0x3e, 0x39, 0x5b, 0x65,
+ 0x26, 0xb4, 0x9a, 0x32, 0xcf, 0x07, 0x4e, 0x4e, 0xd8, 0x8e, 0x70, 0x02,
+ 0x0a, 0xbf, 0xee, 0x9a, 0x65, 0xa3, 0xed, 0xb6, 0x62, 0xdd, 0x0d, 0xc2,
+ 0xa7, 0x45, 0x37, 0xb4, 0x6d, 0xfe, 0xdf, 0x05, 0x97, 0xb3, 0xe2, 0x0a,
+ 0x24, 0x63, 0x68, 0xe0, 0xf9, 0xff, 0xd0, 0xcb, 0x52, 0xbc, 0x4d, 0xe0,
+ 0xfc, 0x7f, 0xc2, 0x66, 0x23, 0xd1, 0x39, 0x73, 0xb9, 0x64, 0xd7, 0xb9,
+ 0x81, 0x32, 0x5b, 0xa3, 0xbd, 0xbd, 0x87, 0x5f, 0x90, 0x2a, 0x03, 0xfc,
+ 0xa6, 0xba, 0xa2, 0xd1, 0xbe, 0xc2, 0x02, 0x03, 0x56, 0xcb, 0xf7, 0x5f,
+ 0x50, 0x8f, 0x5e, 0x3c, 0xab, 0xb9, 0xae, 0x57, 0xf8, 0x73, 0xf3, 0xce,
+ 0xd6, 0x86, 0xe2, 0x88, 0x0f, 0x38, 0xfc, 0x3c, 0xc4, 0x42, 0xdd, 0x84,
+ 0xfc, 0xc9, 0x52, 0xd8, 0xd1, 0x5c, 0x98, 0x69, 0xbb, 0x51, 0xe9, 0x35,
+ 0xec, 0xb4, 0x28, 0x1c, 0xfe, 0x08, 0xe9, 0x9b, 0x89, 0x6d, 0x4c, 0x21,
+ 0x96, 0x2b, 0x87, 0x4d, 0xa4, 0xce, 0x5b, 0x97, 0xab, 0xc1, 0x1c, 0xa4,
+ 0xd5, 0xe4, 0x3b, 0x5c, 0x17, 0x20, 0xac, 0xa9, 0xe2, 0xe2, 0xeb, 0x5e,
+ 0x49, 0xd8, 0x6c, 0x92, 0xf6, 0x0d, 0x0c, 0x51, 0xce, 0xfc, 0xc7, 0x10,
+ 0x6a, 0xc2, 0xb3, 0xb5, 0xfd, 0xec, 0x4f, 0x5c, 0xf0, 0x94, 0x74, 0xe5,
+ 0xf5, 0x8f, 0xf2, 0xe1, 0xf6, 0x4f, 0x30, 0x03, 0xd9, 0x72, 0x17, 0x15,
+ 0xd0, 0x92, 0x27, 0xad, 0x54, 0x0f, 0x5f, 0x82, 0x75, 0x58, 0x50, 0xd3,
+ 0x75, 0x5d, 0x61, 0xde, 0xaf, 0x60, 0x06, 0x13, 0x57, 0x7d, 0x57, 0xa3,
+ 0x35, 0x5a, 0x4c, 0xb1, 0xcf, 0x04, 0x63, 0x2f, 0x6c, 0xd2, 0xfb, 0x9f,
+ 0x39, 0x74, 0x8d, 0x77, 0xd7, 0x0e, 0x6b, 0x79, 0x8f, 0x53, 0xb2, 0x84,
+ 0x6e, 0x03, 0xc9, 0x93, 0x68, 0x07, 0x9a, 0xf3, 0x66, 0x1e, 0x27, 0x55,
+ 0x63, 0x10, 0x3a, 0x17, 0x0c, 0x75, 0xb4, 0xae, 0xef, 0x2d, 0xcc, 0x1e,
+ 0x40, 0xed, 0x59, 0x73, 0xb5, 0xe4, 0xec, 0xb5, 0xf5, 0xab, 0x94, 0x8e,
+ 0x44, 0xfb, 0xa6, 0x0d, 0x56, 0xe0, 0xfb, 0x97, 0xdf, 0x16, 0x27, 0xa7,
+ 0x8a, 0x1c, 0x45, 0x16, 0xd4, 0xd3, 0xd8, 0x51, 0x3d, 0xe3, 0xf1, 0x22,
+ 0xe4, 0xd7, 0x35, 0xd6, 0x31, 0x81, 0x12, 0xc6, 0xcc, 0x46, 0x5d, 0x1b,
+ 0x69, 0x42, 0x7b, 0x29, 0x8a, 0x60, 0x4c, 0x80, 0x9c, 0xa1, 0xef, 0xd1,
+ 0x29, 0x5b, 0xf7, 0x83, 0xc9, 0x3f, 0xe8, 0x87, 0x30, 0xdf, 0x70, 0xbb,
+ 0xec, 0x01, 0xd9, 0xae, 0xa6, 0xd6, 0x74, 0x5d, 0xa0, 0x51, 0x98, 0x36,
+ 0x3e, 0x0d, 0x80, 0xfc, 0xa7, 0x5f, 0x67, 0x46, 0xb0, 0xe1, 0x6f, 0x66,
+ 0xbe, 0x7b, 0x44, 0x63, 0xa3, 0x21, 0xd6, 0x20, 0xf5, 0x0b, 0xb4, 0xd4,
+ 0x0a, 0x0b, 0x1e, 0xb3, 0x38, 0x97, 0xac, 0x5c, 0x29, 0x74, 0xa5, 0x2b,
+ 0xa7, 0xed, 0xe6, 0xcd, 0x08, 0xa3, 0x7f, 0x85, 0x45, 0x11, 0x12, 0x8d,
+ 0xe3, 0x79, 0xe7, 0xe7, 0x13, 0x76, 0xc1, 0xd8, 0x50, 0x6f, 0x9a, 0x9c,
+ 0xcd, 0xec, 0xe8, 0x19, 0x9a, 0x9d, 0xe1, 0x1a, 0xcc, 0x86, 0x15, 0x73,
+ 0x06, 0x87, 0x37, 0xea, 0x6e, 0xd9, 0x19, 0xdd, 0x3f, 0xea, 0xac, 0x88,
+ 0xad, 0xe9, 0x10, 0xe3, 0xf9, 0xd5, 0x55, 0x53, 0x62, 0x57, 0x1c, 0xa0,
+ 0x59, 0x2b, 0x05, 0xc7, 0xda, 0x85, 0x09, 0xdf, 0xc4, 0x1f, 0xb0, 0x26,
+ 0xe8, 0xa8, 0x70, 0x73, 0x0d, 0x78, 0xe4, 0x6f, 0x36, 0x54, 0x28, 0x9b,
+ 0x96, 0xf2, 0x78, 0x62, 0x4e, 0x44, 0xb7, 0x16, 0xca, 0xf5, 0xac, 0x55,
+ 0x12, 0x05, 0xe1, 0xbd, 0x6e, 0x75, 0x53, 0x64, 0x87, 0x44, 0xc7, 0x9a,
+ 0x2e, 0xd0, 0x8d, 0xd5, 0xe7, 0xef, 0x03, 0xa4, 0x72, 0x98, 0xa5, 0x27,
+ 0xd7, 0x90, 0xbe, 0x73, 0x7b, 0xf1, 0xc0, 0xba, 0x24, 0xef, 0x61, 0x28,
+ 0xad, 0x0d, 0xdb, 0xbf, 0x1c, 0x53, 0x9c, 0xf7, 0xac, 0x36, 0x63, 0xcd,
+ 0xf8, 0xcf, 0x1f, 0x88, 0x1e, 0xe6, 0x9c, 0x64, 0x3f, 0xea, 0xdc, 0x64,
+ 0x66, 0x22, 0xea, 0x69, 0xf8, 0xb7, 0x06, 0x01, 0x34, 0xf2, 0x16, 0xbf,
+ 0xf1, 0x0a, 0xc4, 0x00, 0xfb, 0xa8, 0x2a, 0xb2, 0x47, 0xea, 0x28, 0xe9,
+ 0x01, 0x9c, 0x6b, 0x3d, 0x68, 0xe8, 0x65, 0x47, 0x0f, 0x63, 0x9b, 0xb5,
+ 0xbd, 0x83, 0xf3, 0x91, 0xf4, 0xeb, 0x14, 0x46, 0xff, 0xef, 0xa5, 0xd5,
+ 0x20, 0xe6, 0x18, 0xfe, 0xaf, 0xa9, 0xc8, 0xc4, 0x5b, 0x5d, 0x93, 0x52,
+ 0x12, 0x78, 0x25, 0x17, 0x67, 0x71, 0xa2, 0x76, 0x79, 0xd1, 0xa5, 0x9c,
+ 0xa1, 0x8f, 0x2b, 0x31, 0x23, 0x13, 0x5d, 0x04, 0xe6, 0x5c, 0x74, 0xb3,
+ 0x6f, 0xfd, 0xf0, 0x02, 0xd7, 0x6e, 0xdf, 0x0e, 0xc2, 0x09, 0x05, 0xff,
+ 0x5b, 0xd1, 0xe7, 0xf3, 0x3f, 0xec, 0x59, 0x25, 0xe4, 0x49, 0xd4, 0x96,
+ 0x86, 0x64, 0xbc, 0x3f, 0x23, 0x07, 0x88, 0xab, 0x78, 0xb1, 0x8a, 0x67,
+ 0xf8, 0xe3, 0xdb, 0x0d, 0xcf, 0x4e, 0xbb, 0x4c, 0xf9, 0x03, 0x75, 0xe2,
+ 0x6d, 0xec, 0xc7, 0xaa, 0x4a, 0xf3, 0xe3, 0x71, 0x67, 0x9c, 0x23, 0xd7,
+ 0xa9, 0x95, 0x20, 0xee, 0x5d, 0xbf, 0xc8, 0x2a, 0xe3, 0xc1, 0xb6, 0x32,
+ 0x2e, 0xe7, 0xa9, 0xc0, 0x55, 0xea, 0xd7, 0x99, 0x5f, 0xb4, 0xbc, 0x31,
+ 0x9b, 0x3e, 0x5e, 0x0f, 0x77, 0x81, 0xdd, 0xa7, 0x64, 0x44, 0x3a, 0x11,
+ 0xb0, 0x78, 0x1b, 0x4a, 0x95, 0x31, 0x8d, 0x45, 0x99, 0xb1, 0xac, 0xe1,
+ 0x1f, 0x53, 0xb5, 0x3d, 0xbb, 0xdc, 0xe0, 0x05, 0x41, 0xac, 0xae, 0x1d,
+ 0x0c, 0x61, 0x85, 0x0f, 0xdd, 0x66, 0x18, 0xab, 0xf9, 0x01, 0xa4, 0x51,
+ 0xf9, 0xbb, 0x03, 0x1b, 0xd8, 0xc6, 0x1f, 0x38, 0x42, 0xe9, 0x08, 0x7d,
+ 0xc0, 0x38, 0x0b, 0x60, 0xd9, 0x2b, 0xc4, 0x9c, 0x0e, 0xf5, 0x44, 0x05,
+ 0x69, 0x65, 0xf5, 0x22, 0x0a, 0xc4, 0xbf, 0xf9, 0x74, 0xf5, 0x43, 0xb2,
+ 0x3b, 0xda, 0x8f, 0x8d, 0x1c, 0x0f, 0x0b, 0x28, 0x7d, 0x37, 0x8e, 0x44,
+ 0x1e, 0x35, 0x03, 0x98, 0xdd, 0x10, 0x60, 0x81, 0x85, 0x4c, 0xdd, 0xcc,
+ 0x13, 0xd2, 0x9a, 0xad, 0x15, 0xb2, 0x91, 0xd9, 0x7c, 0xb6, 0xff, 0xa4,
+ 0x1f, 0xa9, 0xf4, 0xb0, 0xb2, 0xbf, 0x57, 0x76, 0x86, 0x2f, 0xb5, 0x1a,
+ 0x6b, 0xf4, 0x29, 0xd8, 0x4a, 0xaa, 0x0a, 0xe3, 0x64, 0xcb, 0xc7, 0xef,
+ 0xbe, 0x12, 0xf7, 0x98, 0xca, 0x57, 0x01, 0x59, 0xa0, 0x7e, 0x27, 0x57,
+ 0x5f, 0x80, 0x3f, 0xa8, 0x01, 0x02, 0x9c, 0xbd, 0x69, 0x38, 0xf2, 0x92,
+ 0x13, 0xbf, 0x2f, 0x7c, 0xde, 0x23, 0x4e, 0x73, 0x3d, 0x6e, 0x5c, 0x59,
+ 0x36, 0x4e, 0x69, 0x77, 0x3f, 0xbd, 0x47, 0xf7, 0xcf, 0xb5, 0x2f, 0x6d,
+ 0x03, 0xd6, 0xb4, 0x25, 0xb3, 0x01, 0x46, 0x72, 0x69, 0xea, 0xd5, 0x88,
+ 0x07, 0xe6, 0x4e, 0xdb, 0xf6, 0x22, 0x77, 0x8e, 0x6a, 0x02, 0xf0, 0x5b,
+ 0xe1, 0xf5, 0x0d, 0xdc, 0xf0, 0x0a, 0x02, 0x1a, 0x0c, 0xb9, 0xaf, 0xb0,
+ 0x5e, 0x2b, 0x5d, 0x21, 0x2d, 0xb9, 0x26, 0x39, 0x4e, 0xad, 0x31, 0x8a,
+ 0x81, 0x5d, 0x4f, 0x66, 0x37, 0xb9, 0xd9, 0xe8, 0xdf, 0x1f, 0x8a, 0x42,
+ 0x80, 0x1b, 0x95, 0x82, 0xfa, 0x22, 0x97, 0x4d, 0xac, 0x9d, 0x2c, 0xae,
+ 0x36, 0xc5, 0x4b, 0x64, 0x5f, 0xc2, 0xc6, 0x66, 0xec, 0x5a, 0xd7, 0xe2,
+ 0x4a, 0x20, 0x9e, 0xfa, 0xb9, 0x74, 0x4f, 0x9f, 0xc4, 0xc6, 0xbc, 0xad,
+ 0x07, 0x30, 0x97, 0x2e, 0x58, 0x75, 0xce, 0x7b, 0xb9, 0xb1, 0x9c, 0x38,
+ 0x73, 0x6e, 0x7e, 0x77, 0x93, 0x4f, 0xc5, 0x0d, 0x88, 0x0b, 0x3d, 0x46,
+ 0x48, 0xda, 0x98, 0xf2, 0xc9, 0xf8, 0x55, 0x71, 0xde, 0x02, 0x19, 0x1b,
+ 0x47, 0xef, 0x9f, 0xff, 0x2f, 0x96, 0xdc, 0x9c, 0x4e, 0xef, 0xb4, 0x5d,
+ 0x0d, 0x08, 0x05, 0x5f, 0x41, 0xae, 0x0a, 0x42, 0xbc, 0x7f, 0x4d, 0x7f,
+ 0x66, 0x48, 0x34, 0x62, 0x23, 0xf6, 0xbb, 0x46, 0x63, 0x64, 0xa5, 0x04,
+ 0x81, 0x36, 0xad, 0xc0, 0xf2, 0xf6, 0x81, 0x7f, 0x3f, 0x00, 0x58, 0x25,
+ 0xc0, 0x1d, 0x9a, 0x2b, 0x88, 0xb8, 0x14, 0x05, 0x92, 0x31, 0x84, 0x04,
+ 0x13, 0x44, 0x8c, 0x3c, 0xe8, 0xc7, 0x92, 0xa6, 0x07, 0x06, 0xf6, 0xe3,
+ 0x8d, 0x64, 0x7a, 0x2e, 0xcf, 0x3c, 0x8b, 0x1d, 0xd3, 0x29, 0x3b, 0x85,
+ 0x45, 0x45, 0x67, 0xbb, 0x88, 0x1a, 0xdb, 0xe1, 0x08, 0x25, 0x22, 0xbd,
+ 0xbf, 0xd1, 0x86, 0x5d, 0x47, 0xd8, 0xf4, 0x18, 0x79, 0xaf, 0x5f, 0xea,
+ 0x10, 0x5f, 0x1a, 0x50, 0x13, 0xd8, 0xa8, 0x91, 0xd0, 0x37, 0xd4, 0xe7,
+ 0x2d, 0x59, 0xee, 0x38, 0x37, 0xc2, 0xd0, 0xc3, 0xcc, 0x98, 0x2a, 0xd5,
+ 0xc8, 0xf7, 0xc2, 0x8f, 0xf3, 0x66, 0xaa, 0x36, 0x45, 0xc7, 0x61, 0x69,
+ 0xbc, 0xa8, 0x99, 0xeb, 0x05, 0xb2, 0x83, 0xf7, 0x23, 0x4a, 0xf4, 0x6e,
+ 0x99, 0xd7, 0xdc, 0xf9, 0x77, 0xde, 0xb2, 0x5f, 0x93, 0x5c, 0x6d, 0xf3,
+ 0x54, 0x56, 0x13, 0xe9, 0x73, 0xdb, 0x4f, 0x87, 0xb3, 0x24, 0x59, 0x19,
+ 0x4b, 0x99, 0x40, 0x92, 0x27, 0x16, 0xae, 0x26, 0xfe, 0xac, 0xaf, 0x75,
+ 0x5c, 0x61, 0xf8, 0xac, 0x6e, 0x42, 0x3a, 0x4a, 0xef, 0xb7, 0xe2, 0x77,
+ 0x6b, 0x5d, 0xab, 0xc5, 0x76, 0xb0, 0xd4, 0xa1, 0x19, 0x9b, 0x2a, 0x2f,
+ 0xaa, 0xa0, 0x98, 0x84, 0xf9, 0x09, 0x16, 0xef, 0x12, 0x08, 0xa5, 0xdf,
+ 0x80, 0xdc, 0x29, 0xae, 0xba, 0xa7, 0x00, 0x53, 0xf6, 0x9a, 0xb9, 0xe8,
+ 0x94, 0x67, 0xf6, 0x38, 0x80, 0x3b, 0xfd, 0x19, 0xcb, 0x80, 0x5c, 0x50,
+ 0xe4, 0x31, 0xec, 0xfc, 0x5b, 0x30, 0x00, 0x24, 0xb2, 0x6b, 0x06, 0x5f,
+ 0x45, 0x3e, 0x94, 0x41, 0x3a, 0x1a, 0xf8, 0x64, 0x09, 0x04, 0x35, 0x52,
+ 0xca, 0x14, 0x62, 0xcf, 0xb0, 0x63, 0x12, 0xfa, 0x3f, 0x8b, 0x7a, 0x82,
+ 0x66, 0x47, 0x6a, 0x63, 0x00, 0x10, 0x9b, 0x2a, 0xf5, 0xcb, 0x7f, 0xa6,
+ 0x02, 0x43, 0x70, 0x5b, 0x3b, 0x96, 0xfb, 0x62, 0x22, 0x06, 0xdd, 0x97,
+ 0x9d, 0x6e, 0x2c, 0x7f, 0x04, 0xf6, 0x82, 0x29, 0x5b, 0x49, 0x6f, 0x2c,
+ 0xcd, 0x11, 0x21, 0x30, 0x65, 0xa6, 0x20, 0xb1, 0xce, 0x7d, 0x9b, 0xe7,
+ 0x43, 0xec, 0xc4, 0x13, 0x9d, 0x94, 0x69, 0x5c, 0x64, 0xd4, 0xda, 0x4e,
+ 0x24, 0x54, 0x03, 0xe9, 0x68, 0x16, 0xfc, 0xee, 0xb4, 0x25, 0xd8, 0x3e,
+ 0x60, 0x52, 0xb5, 0xb1, 0x35, 0xbd, 0x7b, 0xf9, 0x6d, 0xfd, 0xe8, 0xef,
+ 0x7a, 0xfe, 0x89, 0x37, 0x32, 0x57, 0x33, 0xa0, 0x05, 0xc1, 0xea, 0x59,
+ 0x56, 0xe8, 0x97, 0x74, 0x5f, 0x09, 0x8f, 0x44, 0x27, 0xd2, 0x12, 0x76,
+ 0xf3, 0x8f, 0x53, 0x94, 0xec, 0xfb, 0x64, 0xb0, 0x99, 0xb3, 0x67, 0xf7,
+ 0xb2, 0x9e, 0xe3, 0x8e, 0x83, 0x3d, 0xe7, 0x01, 0x9f, 0xe9, 0xed, 0xd2,
+ 0x13, 0xae, 0xf3, 0x78, 0x63, 0xfe, 0x05, 0xa7, 0x11, 0x10, 0xb4, 0xcc,
+ 0xb4, 0x12, 0xd7, 0xd4, 0x18, 0xa4, 0x26, 0x54, 0x26, 0xac, 0x78, 0x8a,
+ 0xb7, 0x11, 0x12, 0x90, 0xbc, 0xfe, 0x05, 0xde, 0xae, 0x36, 0x8f, 0xc1,
+ 0x0f, 0x62, 0x93, 0x4d, 0x74, 0xfe, 0xdd, 0x06, 0xa0, 0x10, 0x89, 0x8f,
+ 0x15, 0xdc, 0x4c, 0x52, 0xc3, 0x9d, 0x91, 0xec, 0x57, 0xe3, 0x51, 0x23,
+ 0x07, 0x40, 0x81, 0x47, 0xfe, 0xa4, 0x3b, 0xcb, 0x85, 0x6d, 0xf2, 0x7c,
+ 0xb7, 0xf2, 0x29, 0xff, 0x5e, 0x9b, 0x88, 0x2a, 0x65, 0xef, 0x44, 0xb8,
+ 0x46, 0x2b, 0x4e, 0xf3, 0x87, 0xc9, 0x3c, 0x11, 0x69, 0xc8, 0x11, 0x07,
+ 0xea, 0xc3, 0x59, 0x78, 0x5e, 0x8e, 0x15, 0x3d, 0x97, 0xa4, 0x12, 0xab,
+ 0x79, 0x8a, 0x70, 0xbf, 0x8f, 0x65, 0xc0, 0x82, 0x54, 0x78, 0xd8, 0x6c,
+ 0xf6, 0xd7, 0x0c, 0x3b, 0x22, 0xd8, 0xff, 0x07, 0xfc, 0xd1, 0x8a, 0x10,
+ 0x9a, 0x0f, 0xb6, 0x56, 0x50, 0x0f, 0x3f, 0xac, 0xc1, 0x3a, 0x33, 0x20,
+ 0x35, 0x04, 0xfe, 0xed, 0x9b, 0x65, 0x18, 0x92, 0x0f, 0x66, 0x93, 0x20,
+ 0x7c, 0xd3, 0xb4, 0x90, 0xd1, 0x1b, 0x52, 0x96, 0xfb, 0x0e, 0x9b, 0xd1,
+ 0x2b, 0x83, 0x72, 0x84, 0x59, 0xbc, 0x55, 0xc8, 0xdb, 0x2e, 0xd8, 0x52,
+ 0x8b, 0x57, 0x40, 0x03, 0xa0, 0x57, 0x9f, 0x35, 0xfa, 0x8c, 0xe9, 0x68,
+ 0x28, 0x5e, 0xcf, 0x77, 0xcb, 0xde, 0xf1, 0xe0, 0x80, 0x5a, 0xb1, 0x94,
+ 0xac, 0x00, 0x02, 0xe9, 0x46, 0x32, 0x26, 0xbc, 0x83, 0x28, 0x2a, 0x6d,
+ 0xe7, 0x2c, 0x16, 0x54, 0xff, 0xb4, 0xfb, 0x79, 0x1c, 0xb0, 0x0b, 0xf2,
+ 0xb8, 0x69, 0xe2, 0x46, 0xe2, 0x11, 0xeb, 0x35, 0xbe, 0x43, 0xfa, 0x0f,
+ 0xd2, 0x06, 0x99, 0x8a, 0x8b, 0x41, 0x06, 0xce, 0x99, 0x56, 0x47, 0x7f,
+ 0x89, 0x94, 0x45, 0x0b, 0x88, 0xed, 0x03, 0x12, 0xc4, 0xea, 0x05, 0xa0,
+ 0xfb, 0x8d, 0x29, 0x5a, 0xdb, 0x95, 0x5a, 0xd9, 0xcf, 0xce, 0xb2, 0x0c,
+ 0xd4, 0xea, 0x2b, 0xff, 0xfe, 0x83, 0x84, 0x67, 0x91, 0x3c, 0xf2, 0xf9,
+ 0x1b, 0xf1, 0x38, 0xb1, 0xec, 0xcf, 0x97, 0x84, 0xbb, 0x05, 0x90, 0xec,
+ 0x38, 0xc4, 0x81, 0x95, 0x76, 0xf0, 0x80, 0x21, 0xe2, 0x12, 0xb0, 0x79,
+ 0xbb, 0xdf, 0x61, 0x7c, 0x2c, 0xc0, 0xeb, 0x08, 0x66, 0x82, 0x6c, 0x86,
+ 0xaf, 0x2c, 0x20, 0xf9, 0x0f, 0x0b, 0x19, 0x43, 0xa3, 0xb8, 0x69, 0x26,
+ 0x5e, 0x19, 0x1a, 0x05, 0xb8, 0x4f, 0x5d, 0xe3, 0x47, 0xef, 0x4d, 0x29,
+ 0x00, 0x7d, 0x68, 0xb8, 0x7d, 0x88, 0xec, 0x32, 0xbc, 0xce, 0x71, 0xcb,
+ 0x56, 0x52, 0xbb, 0xea, 0x78, 0x8d, 0x59, 0xd9, 0x6c, 0x5d, 0x5a, 0xc1,
+ 0x5d, 0x0f, 0xbb, 0xec, 0x4e, 0xa1, 0x0d, 0xb2, 0x3a, 0x92, 0x90, 0x8f,
+ 0x49, 0x25, 0xbe, 0x87, 0xb8, 0xa7, 0x4d, 0x23, 0x3d, 0xf2, 0xf3, 0x1e,
+ 0x51, 0x4a, 0xb4, 0x95, 0x94, 0x45, 0x9f, 0x60, 0x81, 0x55, 0xe7, 0xc3,
+ 0x71, 0x36, 0x1c, 0x52, 0xec, 0x57, 0x56, 0x32, 0x36, 0xa4, 0x34, 0xbd,
+ 0xd7, 0xec, 0xe7, 0x0d, 0xb9, 0xd8, 0x2c, 0xbb, 0x0f, 0x18, 0x2c, 0xd4,
+ 0x50, 0x4a, 0x04, 0x13, 0x8d, 0xdf, 0x89, 0x41, 0x06, 0xf3, 0xce, 0x2b,
+ 0xe8, 0xa5, 0x60, 0xd2, 0xa6, 0x43, 0x51, 0x20, 0x0b, 0x47, 0x21, 0x8e,
+ 0x14, 0x06, 0x51, 0x7a, 0x8f, 0xd9, 0xb8, 0xbf, 0xb8, 0x63, 0xf7, 0x6e,
+ 0x5a, 0xd4, 0xcd, 0xd6, 0xb7, 0xf5, 0x65, 0x91, 0x7e, 0x95, 0x16, 0x6b,
+ 0x2c, 0x37, 0x26, 0x02, 0xe5, 0x76, 0xd3, 0x2e, 0xf0, 0xfe, 0x5c, 0xce,
+ 0x70, 0x22, 0x08, 0x36, 0x0a, 0x5f, 0x38, 0xdb, 0xfc, 0xf1, 0x5b, 0xe1,
+ 0x6e, 0x3a, 0x3e, 0xfb, 0xe1, 0x07, 0x02, 0x16, 0xce, 0xbd, 0x73, 0xfb,
+ 0xc0, 0x79, 0x4d, 0xc9, 0xe4, 0x85, 0xc6, 0x4e, 0x7f, 0x3c, 0xf2, 0x67,
+ 0x8f, 0x8c, 0x4f, 0x08, 0x6f, 0xac, 0x7f, 0x09, 0x41, 0x58, 0x88, 0xc5,
+ 0x95, 0xf9, 0x34, 0x81, 0xc1, 0x8b, 0xa7, 0xed, 0xf6, 0x6a, 0x4c, 0x83,
+ 0xa9, 0x95, 0xac, 0x2f, 0x6d, 0x81, 0x5f, 0x5f, 0x32, 0x7f, 0x42, 0x89,
+ 0x99, 0x7d, 0x9b, 0x0c, 0xde, 0xea, 0x25, 0x4f, 0xef, 0xa1, 0x1b, 0x94,
+ 0xc8, 0xd1, 0x0b, 0x69, 0x58, 0x2c, 0x21, 0x58, 0xa1, 0x8f, 0x00, 0x1c,
+ 0x3e, 0xa0, 0xbf, 0x06, 0x8e, 0x78, 0xe8, 0x68, 0x62, 0xee, 0x62, 0x8e,
+ 0xbe, 0xa6, 0x88, 0x13, 0xec, 0xca, 0x92, 0x7a, 0x95, 0x2f, 0x95, 0x30,
+ 0x2c, 0x03, 0xea, 0x74, 0xdd, 0x4f, 0x0e, 0x00, 0x24, 0xb0, 0x56, 0xaa,
+ 0x44, 0xdd, 0x78, 0x56, 0x68, 0x4d, 0x3a, 0xd2, 0xdb, 0xf6, 0x7a, 0x39,
+ 0xa5, 0x78, 0xcf, 0x87, 0x56, 0x52, 0x69, 0xc5, 0x4e, 0x56, 0xa1, 0x70,
+ 0x57, 0xe7, 0x73, 0x24, 0xe9, 0x73, 0xae, 0xcc, 0xcf, 0x49, 0xc9, 0x95,
+ 0x1f, 0xf9, 0x3a, 0xca, 0x89, 0x12, 0xf0, 0x4f, 0xf0, 0x4e, 0x95, 0xce,
+ 0x28, 0x60, 0x38, 0xce, 0x53, 0xe7, 0x0a, 0xba, 0xed, 0x46, 0x12, 0x2d,
+ 0x04, 0x4d, 0x1e, 0xe3, 0x00, 0x0b, 0xff, 0x2f, 0xf3, 0xd1, 0xad, 0x5a,
+ 0x49, 0xe3, 0x5d, 0xef, 0x8c, 0x6c, 0x29, 0x8e, 0xc4, 0x6b, 0x46, 0x82,
+ 0x49, 0x83, 0x69, 0xb8, 0xc3, 0x88, 0xc5, 0x6c, 0x86, 0xc8, 0xdf, 0xaf,
+ 0xae, 0xab, 0x30, 0x86, 0x95, 0x1a, 0x41, 0x16, 0xb4, 0x63, 0xda, 0x9b,
+ 0x12, 0x4e, 0x18, 0xe1, 0x1a, 0x81, 0xc1, 0xdc, 0xce, 0x2b, 0xa6, 0xb5,
+ 0x9c, 0x43, 0x42, 0x2b, 0xfb, 0xfa, 0x29, 0xfc, 0xba, 0x60, 0xce, 0xb5,
+ 0x12, 0x00, 0x91, 0xb9, 0x98, 0x7c, 0x82, 0x83, 0xd9, 0xd1, 0x7c, 0x87,
+ 0xf9, 0x2e, 0x3e, 0xa2, 0xbc, 0x9f, 0x59, 0x48, 0x95, 0x72, 0x60, 0x82,
+ 0xa8, 0x22, 0x37, 0x61, 0x15, 0x40, 0x6d, 0x5a, 0xcb, 0x30, 0xd2, 0x5a,
+ 0xc1, 0xe1, 0x7b, 0x57, 0x60, 0xbd, 0xfa, 0x2e, 0x98, 0x8b, 0xaf, 0x0b,
+ 0x24, 0xd9, 0x47, 0xf3, 0x2c, 0x74, 0x2e, 0xd2, 0xdd, 0x9d, 0x8f, 0x77,
+ 0x29, 0xdd, 0xeb, 0x93, 0xb6, 0xa2, 0xd8, 0x7b, 0x2a, 0x4d, 0x32, 0xf7,
+ 0x95, 0xe1, 0xf9, 0x0f, 0xdb, 0x61, 0xb5, 0x3a, 0xfa, 0xd7, 0x45, 0x02,
+ 0xab, 0x7d, 0x55, 0x3c, 0x97, 0xe6, 0x6a, 0x1a, 0x40, 0x80, 0x1c, 0x6d,
+ 0x1f, 0x2b, 0xdd, 0xc1, 0x3a, 0x6e, 0x12, 0x1a, 0x42, 0x6b, 0x2d, 0x01,
+ 0x5f, 0x01, 0xc6, 0x98, 0xee, 0x09, 0x6f, 0x53, 0xbc, 0x8f, 0x6f, 0x8c,
+ 0xd0, 0xb1, 0x60, 0xfd, 0x5e, 0x1d, 0xf8, 0xc4, 0x6a, 0x3a, 0x76, 0x61,
+ 0x5d, 0x20, 0x2f, 0xb7, 0xea, 0xda, 0x0a, 0x32, 0x31, 0x11, 0xde, 0xef,
+ 0xef, 0x23, 0xac, 0xf3, 0xd2, 0x95, 0x04, 0x17, 0x4b, 0x49, 0x86, 0xfd,
+ 0x76, 0x64, 0x47, 0x84, 0x9f, 0x3e, 0x81, 0x86, 0xa5, 0x46, 0xfc, 0xd5,
+ 0x93, 0x76, 0x3d, 0x83, 0x75, 0x56, 0x05, 0x38, 0xb4, 0x47, 0xb7, 0xd4,
+ 0xb4, 0xe2, 0x5b, 0xb4, 0xef, 0x2f, 0x07, 0xf1, 0x1c, 0x14, 0xbe, 0xee,
+ 0xb8, 0xd3, 0x45, 0x7b, 0x06, 0x9d, 0xb7, 0x22, 0xb1, 0x45, 0xe3, 0x7e,
+ 0x81, 0x02, 0x89, 0x44, 0xcb, 0x10, 0x67, 0x8e, 0xc1, 0xf3, 0xc4, 0x2b,
+ 0x0b, 0x1e, 0x08, 0x5d, 0xe5, 0x9a, 0x52, 0xce, 0xdd, 0xfc, 0xb7, 0xea,
+ 0xcb, 0x38, 0x62, 0x1b, 0x9a, 0xd1, 0x81, 0xf0, 0xf8, 0x5c, 0xdc, 0x25,
+ 0x96, 0x71, 0x80, 0xbb, 0x2d, 0x18, 0xf0, 0x5c, 0xe4, 0xc5, 0x59, 0xb4,
+ 0x5f, 0x41, 0x27, 0xb9, 0xee, 0x13, 0x49, 0xd4, 0xc3, 0x87, 0x14, 0xc7,
+ 0x6c, 0x21, 0xf0, 0xa1, 0xe8, 0xd8, 0xbf, 0xb7, 0x84, 0x2a, 0xee, 0x9b,
+ 0x10, 0xa3, 0xb0, 0x7f, 0x6e, 0x13, 0xf4, 0xf8, 0x4a, 0x2f, 0x79, 0xb9,
+ 0xa1, 0x23, 0xdc, 0xe5, 0xfb, 0x47, 0x49, 0xfd, 0x32, 0xe9, 0xdf, 0x0f,
+ 0x46, 0xd7, 0xe8, 0x6e, 0x56, 0x4e, 0x9c, 0x76, 0x65, 0x2d, 0xd3, 0x03,
+ 0x66, 0x8a, 0x46, 0x7e, 0x46, 0xbf, 0x76, 0x2d, 0x38, 0x7b, 0xb7, 0x6f,
+ 0xda, 0x94, 0xf7, 0x5b, 0xb6, 0x67, 0x00, 0x2d, 0x52, 0xee, 0xc8, 0x3b,
+ 0xb1, 0xd7, 0x05, 0xcc, 0xd3, 0xdf, 0xa4, 0xcd, 0x46, 0xd5, 0xaa, 0xff,
+ 0xc6, 0x81, 0x7a, 0xac, 0xbd, 0x6b, 0x6d, 0x06, 0xbf, 0xf0, 0x72, 0xa5,
+ 0xde, 0xb6, 0xd3, 0xd1, 0xa9, 0x5e, 0x10, 0x84, 0x7a, 0x71, 0x99, 0x6a,
+ 0x7d, 0xa4, 0x34, 0x54, 0x16, 0xda, 0xc9, 0x26, 0x99, 0xe2, 0x90, 0xf4,
+ 0xf8, 0x5b, 0x28, 0xc5, 0xe8, 0x52, 0x64, 0x85, 0xb3, 0xff, 0x7f, 0xb4,
+ 0xda, 0x5f, 0x36, 0x1f, 0xa6, 0x0d, 0xca, 0x70, 0xcb, 0x23, 0x2c, 0x3b,
+ 0x28, 0xce, 0xdc, 0x4e, 0x66, 0x06, 0x0e, 0x3c, 0xbc, 0xac, 0xa1, 0x60,
+ 0x90, 0xf8, 0x7a, 0x52, 0x8b, 0xbf, 0x19, 0x57, 0xcc, 0xe4, 0x0d, 0x03,
+ 0xb1, 0xfd, 0xf5, 0x9c, 0x21, 0x21, 0xfe, 0x5d, 0x76, 0x29, 0x6a, 0x7f,
+ 0xfa, 0xcd, 0xd1, 0x6e, 0x75, 0xd6, 0x88, 0x1a, 0x2e, 0x76, 0x7f, 0xd0,
+ 0xd1, 0xd9, 0x25, 0x2d, 0x5d, 0x50, 0x44, 0x86, 0xac, 0x0d, 0x33, 0x1b,
+ 0x6d, 0xd8, 0x92, 0x33, 0xed, 0x30, 0x9b, 0x1a, 0x73, 0xdf, 0xa8, 0x60,
+ 0x34, 0x01, 0x26, 0x7a, 0x54, 0x44, 0xfd, 0xb8, 0x69, 0x55, 0x50, 0x22,
+ 0xb3, 0x09, 0xfe, 0x4d, 0x12, 0x0f, 0xcc, 0x1e, 0x65, 0x6e, 0x70, 0x92,
+ 0xc7, 0x01, 0xcb, 0xc9, 0xe2, 0x79, 0x38, 0x95, 0x3a, 0x71, 0x0e, 0xfa,
+ 0x23, 0x80, 0x97, 0xaa, 0xd3, 0x7f, 0xe8, 0x51, 0xe2, 0x04, 0xe7, 0x4e,
+ 0x1e, 0x25, 0x98, 0xb2, 0xb2, 0xbe, 0x88, 0xed, 0x61, 0x8b, 0x03, 0xc5,
+ 0x59, 0xe7, 0x20, 0x5e, 0xb6, 0xb7, 0x18, 0xdc, 0x31, 0x63, 0x1a, 0x04,
+ 0xa3, 0xe6, 0x97, 0x29, 0xeb, 0x85, 0xd4, 0xa6, 0xf6, 0xf8, 0xbf, 0x98,
+ 0xca, 0x24, 0x39, 0xf9, 0x60, 0xf2, 0x2b, 0x51, 0x23, 0x59, 0x83, 0x99,
+ 0x34, 0x85, 0x34, 0x76, 0xbc, 0xd8, 0x90, 0xbf, 0x69, 0xc2, 0xe6, 0x65,
+ 0xdd, 0x69, 0x45, 0xa3, 0x44, 0xc8, 0x9a, 0x98, 0x75, 0x21, 0x02, 0xff,
+ 0xbf, 0x9b, 0x64, 0xf1, 0x3f, 0x9e, 0xc0, 0xb5, 0xc6, 0x75, 0x30, 0x63,
+ 0xd8, 0xda, 0xf2, 0xb8, 0x00, 0xfc, 0x76, 0x86, 0x1c, 0xe8, 0x8b, 0x7a,
+ 0x68, 0xbb, 0x1a, 0x38, 0x73, 0x43, 0xe7, 0x5b, 0x69, 0x5f, 0x07, 0x40,
+ 0x11, 0x6d, 0xeb, 0xf3, 0x7d, 0x73, 0xfa, 0x9a, 0xb0, 0xfb, 0x1a, 0x90,
+ 0xf8, 0x9a, 0xb2, 0x82, 0x5d, 0xb2, 0x43, 0xc9, 0xe1, 0x5f, 0x86, 0xab,
+ 0xbc, 0xb1, 0x6f, 0xa1, 0xf9, 0x53, 0x76, 0xd9, 0x1e, 0xfe, 0xaf, 0xc2,
+ 0xb4, 0xa9, 0x7d, 0xc6, 0x74, 0x56, 0x12, 0x78, 0xac, 0xb2, 0xae, 0xfc,
+ 0xa9, 0xd8, 0x3e, 0xaa, 0xb0, 0x23, 0xae, 0x1d, 0xf6, 0xd7, 0x58, 0x39,
+ 0xbb, 0xb3, 0xa2, 0xe4, 0x4c, 0x80, 0x0e, 0x88, 0x2c, 0x69, 0x59, 0x62,
+ 0xbd, 0x48, 0x60, 0x82, 0x14, 0xa1, 0xdd, 0x75, 0x92, 0x72, 0xe0, 0xa8,
+ 0xb1, 0xf2, 0x34, 0xd2, 0xcf, 0x6c, 0x16, 0xaa, 0x33, 0x86, 0x1b, 0x2d,
+ 0xba, 0x11, 0x1e, 0x85, 0x38, 0x3e, 0x14, 0x02, 0x4b, 0xda, 0x54, 0xdf,
+ 0xe9, 0x43, 0x55, 0xd7, 0xc8, 0x12, 0x2c, 0x52, 0xb6, 0x50, 0x52, 0x73,
+ 0x50, 0x43, 0x77, 0xa4, 0xed, 0xf6, 0x73, 0xf9, 0xff, 0x76, 0x6f, 0xc3,
+ 0xb2, 0x1e, 0x91, 0x6c, 0x5e, 0xe4, 0x2d, 0xbd, 0xc1, 0x6c, 0x98, 0x17,
+ 0x5c, 0xee, 0x34, 0x69, 0x7f, 0x75, 0xd1, 0xb9, 0x30, 0xe2, 0xe7, 0xcf,
+ 0x8a, 0xb1, 0x43, 0xf6, 0x68, 0xcb, 0xfa, 0xdb, 0x65, 0xff, 0x58, 0xcc,
+ 0x81, 0xcb, 0xa1, 0x7d, 0x38, 0x87, 0x22, 0x0d, 0xd4, 0xb1, 0xf3, 0x34,
+ 0x34, 0xc8, 0xb2, 0xe2, 0x03, 0x36, 0x57, 0x49, 0xa2, 0x58, 0x40, 0x11,
+ 0x2c, 0x11, 0x9d, 0x3f, 0x94, 0x5c, 0x07, 0xac, 0x91, 0x32, 0x62, 0x38,
+ 0x25, 0xa6, 0x88, 0x49, 0x12, 0xdf, 0x0a, 0xb2, 0xb9, 0xf7, 0xda, 0x4f,
+ 0xa4, 0x0d, 0x4c, 0x69, 0xe6, 0xf3, 0xcf, 0xff, 0x86, 0x1d, 0x0f, 0xb0,
+ 0x8f, 0xf0, 0x9b, 0xbf, 0xfc, 0xa3, 0x1a, 0x5f, 0x20, 0x07, 0xe6, 0x4f,
+ 0x36, 0xc8, 0xb0, 0xa1, 0x9a, 0xb7, 0x6b, 0x80, 0x23, 0xf7, 0x31, 0xb5,
+ 0x2a, 0xb8, 0x93, 0x26, 0x46, 0xc2, 0x4a, 0x55, 0x05, 0xa2, 0x20, 0xa4,
+ 0xd9, 0xd1, 0x5f, 0x81, 0xe1, 0xfe, 0x58, 0xf4, 0xe8, 0x98, 0x80, 0xcf,
+ 0xae, 0xcc, 0x14, 0x9e, 0xbb, 0x2a, 0xf4, 0x24, 0x7a, 0x68, 0xb8, 0x3b,
+ 0xcb, 0x48, 0xe5, 0x04, 0xec, 0xe6, 0x86, 0x0a, 0xe2, 0x39, 0x96, 0x69,
+ 0x3b, 0x8b, 0x06, 0xee, 0xb5, 0xaf, 0x57, 0x2b, 0x21, 0x38, 0xf8, 0xee,
+ 0xfe, 0xc6, 0x51, 0x74, 0x80, 0x14, 0x5e, 0xc4, 0xbe, 0x92, 0xf1, 0xea,
+ 0xe0, 0x67, 0x19, 0xe3, 0xb9, 0x7f, 0x33, 0x00, 0x52, 0x0d, 0x1e, 0x36,
+ 0x41, 0x87, 0xd5, 0x3e, 0x88, 0x30, 0x80, 0xcf, 0x8b, 0x73, 0x66, 0xa5,
+ 0xbd, 0xe3, 0x06, 0x25, 0x15, 0x2b, 0xed, 0xc4, 0x8a, 0xc7, 0x32, 0xa9,
+ 0x42, 0x7f, 0x63, 0x07, 0x38, 0x6d, 0x04, 0x64, 0x51, 0x6a, 0x0a, 0xbf,
+ 0x83, 0xb8, 0xb7, 0xfd, 0x19, 0x4f, 0xcc, 0xbb, 0xb6, 0xeb, 0x34, 0xc7,
+ 0xaf, 0x08, 0x62, 0x57, 0xb0, 0x3f, 0x25, 0x0e, 0xbf, 0x34, 0xda, 0xbf,
+ 0xb9, 0xaf, 0x43, 0x80, 0x63, 0xa5, 0xe9, 0x6f, 0x60, 0xd4, 0xfa, 0x9f,
+ 0xdb, 0xd9, 0xbb, 0x24, 0xef, 0xb8, 0x58, 0xe6, 0xc0, 0xa7, 0xc0, 0x0b,
+ 0x13, 0x28, 0xa3, 0xe3, 0xc6, 0x0c, 0x0c, 0x0d, 0x52, 0x25, 0xad, 0x84,
+ 0x29, 0x4a, 0xcd, 0xc3, 0x14, 0x48, 0xf6, 0xb9, 0xaa, 0x51, 0x14, 0x86,
+ 0x8e, 0xf2, 0x98, 0xc7, 0xcc, 0xd8, 0xbc, 0xa1, 0x7f, 0xab, 0x96, 0x8c,
+ 0x82, 0x8c, 0x00, 0x87, 0xbe, 0xb7, 0xf1, 0x68, 0x4d, 0xd6, 0xaa, 0x4e,
+ 0xab, 0x69, 0x03, 0xa5, 0x56, 0x3b, 0x7e, 0x69, 0xd2, 0x7d, 0x07, 0x87,
+ 0xee, 0x2e, 0xab, 0xa8, 0xd6, 0xeb, 0x3f, 0x5c, 0x83, 0x8a, 0x76, 0xdc,
+ 0xaa, 0x71, 0xac, 0x60, 0xa3, 0x1a, 0xd9, 0xff, 0x90, 0x72, 0x2f, 0x30,
+ 0xc1, 0x6d, 0x77, 0x23, 0xd7, 0xa8, 0x43, 0x8b, 0x1f, 0x84, 0x3b, 0x88,
+ 0x23, 0xeb, 0x41, 0xaa, 0x18, 0xd0, 0x80, 0x5f, 0xd4, 0x6d, 0x5f, 0xe4,
+ 0xe4, 0x6a, 0x06, 0xa6, 0xd5, 0xaf, 0x58, 0xdf, 0x8c, 0x97, 0x31, 0x98,
+ 0x7a, 0xd8, 0x84, 0xb3, 0x9f, 0xc6, 0x13, 0xeb, 0x21, 0xeb, 0x34, 0x44,
+ 0xd4, 0xe2, 0x6c, 0xee, 0xbf, 0xdf, 0xa0, 0x11, 0x4e, 0xee, 0xe3, 0xb8,
+ 0xb7, 0x21, 0x20, 0x10, 0xfa, 0x57, 0xdf, 0xfe, 0xcd, 0xcc, 0xf6, 0x08,
+ 0x7e, 0xe8, 0xd0, 0xe5, 0x70, 0x15, 0x49, 0x6f, 0xb0, 0xcd, 0x7d, 0x8c,
+ 0x11, 0x50, 0x3f, 0x1f, 0xb8, 0xec, 0x84, 0x06, 0x7f, 0xd5, 0xc5, 0xa5,
+ 0xfc, 0x96, 0xe6, 0x3d, 0x0f, 0x22, 0xe2, 0x68, 0x92, 0x5a, 0xd3, 0xa8,
+ 0x27, 0xdd, 0x3d, 0x23, 0x6d, 0x46, 0xa7, 0xae, 0xbd, 0xec, 0x04, 0xac,
+ 0x13, 0x70, 0x3a, 0x40, 0xae, 0xc0, 0x2d, 0xea, 0xb5, 0xf0, 0xaa, 0xfc,
+ 0xc1, 0x1f, 0x98, 0x28, 0x21, 0x71, 0x75, 0x44, 0x19, 0x8e, 0xb3, 0x0c,
+ 0x90, 0x55, 0xfb, 0x21, 0x32, 0xc0, 0x2b, 0x3b, 0x09, 0x3c, 0x5e, 0x80,
+ 0x4d, 0x54, 0xe5, 0xc1, 0xa4, 0xd2, 0xb2, 0x50, 0x9a, 0x91, 0xdf, 0xd1,
+ 0x16, 0xdd, 0x61, 0xa3, 0x0d, 0x12, 0xfd, 0xcd, 0x34, 0x55, 0x9e, 0x1c,
+ 0x07, 0xcf, 0xc9, 0xc2, 0xd1, 0x7f, 0xa8, 0x2d, 0x47, 0xfb, 0xfa, 0xb4,
+ 0x50, 0x20, 0x44, 0xef, 0xfa, 0x94, 0x1d, 0x94, 0x61, 0x8b, 0x14, 0x97,
+ 0x42, 0xf5, 0x0a, 0xb1, 0xbd, 0xa6, 0x45, 0xd8, 0x26, 0x5d, 0xcc, 0xc0,
+ 0xd9, 0x36, 0xa4, 0x45, 0x53, 0x2e, 0x0d, 0x51, 0x93, 0x28, 0x2e, 0x0e,
+ 0xe4, 0xfb, 0xae, 0x4c, 0x0b, 0x5a, 0x72, 0x76, 0xaf, 0xab, 0x43, 0x4f,
+ 0xdd, 0x58, 0x40, 0x63, 0xcc, 0xe2, 0xdc, 0x19, 0xa0, 0xb9, 0x3c, 0xa9,
+ 0xf2, 0x3e, 0x7e, 0x3f, 0xb1, 0xb1, 0xc5, 0x59, 0x0d, 0xdd, 0xd4, 0x68,
+ 0xda, 0x89, 0xf6, 0x0c, 0xea, 0x04, 0xca, 0xc3, 0xc1, 0xa8, 0x2b, 0x64,
+ 0xf8, 0x86, 0x6e, 0x5a, 0x32, 0xcf, 0xd1, 0x3b, 0xf9, 0x4b, 0x2d, 0xbe,
+ 0x12, 0xaf, 0xbc, 0x58, 0x74, 0x55, 0x0c, 0xa6, 0xdf, 0xc5, 0x30, 0x27,
+ 0x84, 0x22, 0x3c, 0xd8, 0x45, 0x59, 0x49, 0x65, 0xea, 0x2e, 0xf1, 0x02,
+ 0xfa, 0x11, 0x2a, 0x7b, 0xab, 0x27, 0xab, 0x59, 0x05, 0x8e, 0xe5, 0x25,
+ 0xdf, 0x18, 0xee, 0xc6, 0xd5, 0x52, 0xf3, 0xb5, 0x79, 0x89, 0x0b, 0x56,
+ 0x38, 0xf7, 0x91, 0x48, 0xc0, 0x02, 0xb8, 0x2c, 0x31, 0x12, 0x9c, 0x8d,
+ 0x32, 0x4e, 0x7d, 0xfd, 0x7a, 0x15, 0x95, 0x52, 0x2f, 0x04, 0x18, 0x30,
+ 0x4a, 0xac, 0x06, 0x5b, 0x16, 0xc6, 0x4a, 0x62, 0x90, 0x61, 0x40, 0x63,
+ 0x64, 0x14, 0x0c, 0x2c, 0xc2, 0xe3, 0x31, 0xc5, 0x73, 0x70, 0x12, 0x65,
+ 0xed, 0x66, 0x3e, 0x85, 0xc0, 0xa7, 0xbb, 0x14, 0xb0, 0xc9, 0x9f, 0x0c,
+ 0x06, 0xe7, 0x82, 0x4a, 0xac, 0xd4, 0xf8, 0x6e, 0x40, 0xb9, 0x15, 0x47,
+ 0x67, 0x85, 0x29, 0x54, 0xd5, 0xbc, 0x54, 0x79, 0x6e, 0x06, 0x78, 0xf8,
+ 0x30, 0x30, 0x18, 0x1b, 0x43, 0x2b, 0x35, 0x74, 0x4e, 0xba, 0x71, 0x35,
+ 0x9f, 0xaf, 0x9c, 0x50, 0xa4, 0x8d, 0xb8, 0x54, 0x39, 0x99, 0x99, 0x40,
+ 0x7e, 0xf0, 0xc4, 0x25, 0x67, 0x07, 0x61, 0x2c, 0xd1, 0x8f, 0x55, 0x13,
+ 0x40, 0x8d, 0x69, 0xa8, 0x10, 0x21, 0xff, 0xe2, 0xe1, 0xc9, 0xd4, 0xc1,
+ 0x11, 0xbe, 0x54, 0x1a, 0xf0, 0x3b, 0x16, 0xb3, 0xf9, 0x56, 0x59, 0x2d,
+ 0xdf, 0x49, 0x83, 0xb9, 0x1b, 0xdc, 0x3a, 0xd6, 0x70, 0x7b, 0x72, 0xec,
+ 0x22, 0x35, 0xd5, 0x0c, 0xe6, 0x85, 0x39, 0xd5, 0x56, 0x24, 0x70, 0x78,
+ 0x2e, 0x9c, 0x9c, 0xc7, 0x32, 0x68, 0xb2, 0xf8, 0xc9, 0xc0, 0xd8, 0xb3,
+ 0xe1, 0x71, 0x27, 0xf6, 0x21, 0x14, 0xd4, 0xd1, 0x66, 0x67, 0x94, 0xf5,
+ 0x9a, 0x36, 0x63, 0x74, 0x7b, 0xce, 0x92, 0x92, 0x0e, 0xbb, 0x42, 0x0a,
+ 0xf8, 0x77, 0x23, 0x81, 0xb9, 0x1a, 0x19, 0x9e, 0x6c, 0x30, 0xc2, 0x52,
+ 0xec, 0xd4, 0xf1, 0xf3, 0x7a, 0x69, 0x71, 0x00, 0xde, 0xf7, 0x5d, 0x3a,
+ 0x99, 0x91, 0x27, 0x74, 0x11, 0x70, 0x67, 0xca, 0x0a, 0x84, 0x16, 0xe2,
+ 0xbe, 0x6b, 0xee, 0x72, 0x37, 0xb4, 0x61, 0x75, 0x36, 0x39, 0xee, 0xc5,
+ 0xfc, 0x2b, 0xd5, 0x5b, 0x34, 0xe2, 0x40, 0xb7, 0xb5, 0xb1, 0x4f, 0x1a,
+ 0x0e, 0x39, 0x0a, 0x30, 0xa4, 0xc3, 0x7e, 0xfe, 0xb0, 0xb9, 0xda, 0xf7,
+ 0xc7, 0x10, 0x4d, 0x03, 0x6a, 0x3b, 0xf0, 0xa2, 0xe0, 0xdb, 0xd0, 0xef,
+ 0xd7, 0x89, 0xf0, 0xdd, 0xae, 0x62, 0x98, 0x14, 0xc3, 0x6b, 0xce, 0x0a,
+ 0x03, 0xdf, 0xf5, 0xb0, 0xa0, 0x97, 0x52, 0x5b, 0xf3, 0x11, 0x48, 0xdc,
+ 0x86, 0xa6, 0x98, 0x0a, 0x7d, 0xae, 0xa5, 0x79, 0x9d, 0xba, 0xf0, 0x89,
+ 0x11, 0x44, 0xe1, 0x1e, 0xcf, 0xa2, 0x1c, 0x3c, 0x22, 0xb3, 0x6a, 0x6c,
+ 0x3c, 0xd2, 0x5d, 0xfa, 0x3c, 0x32, 0x15, 0x0b, 0xdd, 0x63, 0x36, 0xb3,
+ 0x9e, 0x0f, 0x57, 0x4b, 0x1b, 0x69, 0xbb, 0x1c, 0x90, 0xf7, 0x23, 0x1a,
+ 0x8e, 0x01, 0x57, 0xbb, 0xbb, 0x92, 0xb7, 0x1b, 0x4e, 0xf2, 0x41, 0xa4,
+ 0x05, 0xed, 0x44, 0xf9, 0xa2, 0xaf, 0x32, 0x35, 0x25, 0x5f, 0xa5, 0x89,
+ 0xf6, 0xa9, 0x90, 0xcc, 0x76, 0x7d, 0xfc, 0x09, 0xb4, 0x8f, 0x80, 0x0d,
+ 0xc7, 0xc6, 0xe4, 0xc4, 0xc6, 0xcb, 0x58, 0xe0, 0xb4, 0xd5, 0x68, 0x5c,
+ 0x52, 0x7e, 0x9b, 0xbc, 0xcb, 0xdc, 0x2a, 0x9c, 0x32, 0x95, 0xb8, 0xfc,
+ 0x6b, 0x82, 0x2e, 0xbf, 0xa9, 0xeb, 0xd0, 0x0a, 0x16, 0x19, 0x1b, 0xef,
+ 0xe1, 0x74, 0x34, 0x61, 0x24, 0xbe, 0xd7, 0x98, 0x74, 0x8d, 0x19, 0x5a,
+ 0x72, 0x6f, 0x57, 0x7d, 0xad, 0x8a, 0xfa, 0xff, 0x9a, 0x59, 0x87, 0x16,
+ 0xa4, 0x48, 0xf6, 0xb4, 0x5c, 0x2e, 0xbc, 0xc6, 0xab, 0xd2, 0x08, 0x69,
+ 0x1a, 0xdf, 0x45, 0x66, 0x66, 0xa1, 0xcc, 0x10, 0x5f, 0x11, 0xaf, 0x7a,
+ 0x71, 0xfe, 0xb0, 0x47, 0x01, 0x96, 0xc5, 0xc4, 0xf6, 0x30, 0x7e, 0xb6,
+ 0xd8, 0x99, 0x56, 0x56, 0x84, 0xda, 0x9a, 0x1f, 0x7e, 0xfe, 0x60, 0xdb,
+ 0xdf, 0xf7, 0x62, 0x30, 0xe8, 0x61, 0xec, 0x81, 0x9c, 0x66, 0x67, 0xc4,
+ 0xde, 0x9a, 0xff, 0x40, 0x2e, 0xc5, 0x2d, 0x73, 0x6b, 0x65, 0xed, 0x6d,
+ 0x7b, 0xff, 0xcd, 0x67, 0xea, 0x03, 0xbf, 0xf6, 0xed, 0x3f, 0x66, 0xcd,
+ 0xa0, 0xac, 0x3c, 0xca, 0xcd, 0xee, 0xd5, 0x10, 0x83, 0x1c, 0x89, 0x2c,
+ 0x9e, 0x38, 0xbe, 0xb9, 0x2a, 0xc0, 0xa9, 0x0f, 0x03, 0x64, 0x50, 0xf5,
+ 0x75, 0x95, 0x66, 0x38, 0x4f, 0x9b, 0x63, 0xca, 0x83, 0xbd, 0x3a, 0x6f,
+ 0xdb, 0x35, 0x9d, 0x13, 0xe8, 0x92, 0x60, 0x36, 0x41, 0xdf, 0x88, 0xcd,
+ 0x13, 0x46, 0x0d, 0x2a, 0x87, 0xc0, 0x64, 0x1d, 0x6d, 0xdc, 0xd0, 0x9f,
+ 0xe8, 0x5e, 0xe6, 0x64, 0xf9, 0x58, 0x73, 0x49, 0x39, 0xc7, 0xd7, 0xaf,
+ 0xc8, 0x1d, 0xce, 0x43, 0xcb, 0x4d, 0x79, 0x1e, 0x7d, 0xb8, 0x65, 0x45,
+ 0xdc, 0xd7, 0x74, 0xf8, 0xc3, 0xa3, 0xe9, 0xf2, 0x12, 0x1e, 0xb1, 0xd9,
+ 0x13, 0x9d, 0xad, 0x7b, 0x38, 0x46, 0x50, 0xff, 0x2a, 0xd1, 0xfa, 0x1a,
+ 0x53, 0xbc, 0xce, 0xfd, 0x4e, 0x4b, 0xc4, 0x7b, 0x2d, 0xe7, 0xd1, 0x8c,
+ 0xa1, 0xd2, 0x7a, 0x9a, 0x02, 0x90, 0x70, 0x12, 0x61, 0xb3, 0x75, 0x11,
+ 0xe6, 0x39, 0x6f, 0x35, 0x30, 0x3a, 0xf3, 0x3c, 0x31, 0x94, 0x93, 0x21,
+ 0x6c, 0x21, 0xbb, 0xf1, 0xa6, 0x47, 0xb0, 0x3c, 0xec, 0x6d, 0xf7, 0x68,
+ 0x32, 0x6c, 0x33, 0x8d, 0x80, 0x7c, 0xbc, 0x80, 0xdf, 0x22, 0x2a, 0x5f,
+ 0x7d, 0x6a, 0x75, 0x08, 0x26, 0x22, 0x9a, 0x53, 0xb5, 0x99, 0xdc, 0x62,
+ 0x7a, 0x81, 0xc9, 0xb5, 0xe2, 0x7e, 0x37, 0x63, 0x88, 0xfc, 0xad, 0x66,
+ 0xc6, 0xe6, 0x97, 0xb4, 0xbd, 0xea, 0x63, 0xc9, 0x3c, 0xae, 0x07, 0x90,
+ 0x28, 0x5a, 0x0b, 0xa6, 0xef, 0xbe, 0xe9, 0x0c, 0xb3, 0x71, 0x49, 0x5d,
+ 0xbc, 0x1f, 0xd4, 0x4c, 0xa4, 0xd3, 0xa6, 0x05, 0x14, 0xd4, 0x09, 0xd2,
+ 0x33, 0x7c, 0x22, 0xe3, 0x9c, 0xec, 0xff, 0xae, 0x50, 0xa7, 0x85, 0xd4,
+ 0xce, 0x03, 0x52, 0x46, 0xd3, 0x3c, 0x55, 0x4e, 0x7f, 0x97, 0xa7, 0x32,
+ 0x97, 0x4c, 0xcd, 0xb2, 0x03, 0x01, 0x49, 0x17, 0x58, 0x28, 0xfd, 0xab,
+ 0x19, 0xbc, 0x1c, 0xa4, 0xe4, 0xf9, 0x7f, 0xb4, 0xc8, 0x97, 0x66, 0x93,
+ 0xc1, 0xc0, 0xad, 0x55, 0xd9, 0x4c, 0x71, 0xb4, 0xce, 0x00, 0x2e, 0xaf,
+ 0x97, 0x0f, 0x70, 0xbb, 0x47, 0xfb, 0x3b, 0x10, 0x46, 0x96, 0xd4, 0x8d,
+ 0x4a, 0xbb, 0xe0, 0x6c, 0x63, 0xa7, 0xa0, 0x32, 0xab, 0x69, 0x5b, 0x3e,
+ 0x11, 0x91, 0x0d, 0x91, 0xb8, 0xf7, 0xf8, 0xc5, 0x20, 0x54, 0x44, 0x7a,
+ 0xb7, 0xa4, 0x03, 0xe2, 0xf1, 0x9a, 0x4b, 0x30, 0xd7, 0x54, 0x59, 0x6d,
+ 0x94, 0xf0, 0xce, 0x19, 0xab, 0x03, 0x5c, 0xf9, 0x2d, 0xd7, 0x11, 0x03,
+ 0x87, 0xfb, 0xed, 0x90, 0xa1, 0xee, 0x5d, 0x56, 0xfd, 0xf9, 0xac, 0x35,
+ 0x0d, 0xcd, 0x4e, 0x01, 0xcb, 0x77, 0xc4, 0x1f, 0x86, 0x8c, 0x1d, 0x15,
+ 0x3b, 0x1e, 0x7e, 0xc8, 0x91, 0x49, 0x9b, 0x54, 0x7c, 0xe4, 0x13, 0x39,
+ 0xbf, 0xa9, 0x4d, 0xcb, 0x02, 0x02, 0xf0, 0x7a, 0x82, 0xe5, 0x49, 0x32,
+ 0xcb, 0x18, 0xe5, 0xa3, 0x3e, 0x3e, 0x3a, 0x97, 0xa0, 0x24, 0x49, 0x38,
+ 0x9c, 0x80, 0xde, 0x14, 0x56, 0xa2, 0x58, 0x5e, 0x4f, 0x1f, 0x27, 0x5d,
+ 0x66, 0x4f, 0x4d, 0x5e, 0xbf, 0x83, 0x36, 0xea, 0xa1, 0x80, 0x16, 0x80,
+ 0xee, 0x5c, 0x81, 0x8a, 0x4e, 0x8f, 0xac, 0xc3, 0x68, 0xff, 0xa3, 0x10,
+ 0x88, 0x99, 0x45, 0x25, 0xf1, 0xdf, 0x3b, 0x38, 0xf7, 0xa6, 0x17, 0xe4,
+ 0x12, 0xd4, 0x72, 0x2f, 0x4a, 0xf8, 0xa8, 0x7d, 0x8c, 0x65, 0x14, 0xa9,
+ 0x66, 0x95, 0x48, 0x04, 0x4e, 0x07, 0x7c, 0x0f, 0x5c, 0x5f, 0x61, 0x78,
+ 0x0a, 0xc9, 0x05, 0x49, 0x1b, 0x46, 0xeb, 0xa8, 0x3e, 0x7a, 0xd6, 0x99,
+ 0xff, 0xda, 0x35, 0x31, 0xdc, 0x04, 0x43, 0xf5, 0xe1, 0x3b, 0x20, 0x86,
+ 0x71, 0x8b, 0x83, 0x97, 0x49, 0x20, 0x15, 0x1e, 0xb6, 0xd8, 0x5e, 0x60,
+ 0x5c, 0x14, 0x6d, 0x55, 0xe4, 0x81, 0xb9, 0x31, 0xc2, 0x9b, 0x77, 0xc8,
+ 0x4f, 0x71, 0xe4, 0xd9, 0x45, 0xf8, 0x51, 0x32, 0xec, 0x7f, 0x86, 0x71,
+ 0xe0, 0xb6, 0x12, 0x0c, 0xc4, 0xea, 0xc9, 0x6d, 0x78, 0x46, 0x8b, 0x9b,
+ 0x6b, 0xa2, 0x43, 0x5f, 0xe4, 0xc2, 0x06, 0xaf, 0x8c, 0xca, 0xba, 0xf5,
+ 0xe6, 0x06, 0x13, 0x99, 0x05, 0xd7, 0x6d, 0x15, 0x4c, 0xcc, 0xa9, 0x05,
+ 0xfd, 0x83, 0x92, 0x51, 0xd6, 0x41, 0xef, 0x0f, 0xaa, 0x5a, 0x7d, 0x60,
+ 0x25, 0x81, 0x4c, 0xe2, 0xa2, 0xe7, 0x95, 0xc5, 0xe0, 0xd7, 0x37, 0xe4,
+ 0xa3, 0x80, 0x3c, 0x04, 0x87, 0xb3, 0xc6, 0xf4, 0x98, 0x6d, 0xbb, 0xbb,
+ 0xfe, 0xcd, 0x87, 0x52, 0x01, 0x36, 0xcc, 0xf8, 0x4a, 0x2e, 0x40, 0x0f,
+ 0x94, 0x51, 0x58, 0x34, 0xc5, 0xe8, 0x84, 0x76, 0xd1, 0x59, 0x48, 0xaa,
+ 0xfd, 0x92, 0xa4, 0x35, 0xee, 0x57, 0xa8, 0x72, 0x21, 0xeb, 0x3f, 0x43,
+ 0xbd, 0x47, 0x68, 0xe7, 0x21, 0x0b, 0x05, 0x22, 0x46, 0x43, 0x70, 0xf6,
+ 0x1f, 0x1f, 0xcf, 0xe5, 0xd4, 0xdf, 0x16, 0xb9, 0xaf, 0x23, 0x0a, 0x57,
+ 0xe0, 0xe0, 0xf2, 0xca, 0xca, 0x4c, 0xb8, 0xf0, 0x03, 0xda, 0x7d, 0x47,
+ 0x74, 0x7f, 0x61, 0xc6, 0x64, 0xf7, 0xe8, 0x77, 0xe3, 0xa2, 0xd9, 0x39,
+ 0xa7, 0xdc, 0x47, 0x8f, 0x91, 0x37, 0x98, 0x04, 0x80, 0x06, 0x0e, 0x28,
+ 0xde, 0x72, 0xf1, 0xda, 0xf7, 0x26, 0x89, 0x53, 0x15, 0x5a, 0xbf, 0xfd,
+ 0x62, 0x1f, 0x28, 0x3d, 0x8f, 0xf6, 0xbc, 0x3b, 0xdd, 0x31, 0x22, 0x33,
+ 0x88, 0xae, 0xe6, 0x11, 0x60, 0xc1, 0x0b, 0x6c, 0x36, 0xc5, 0x0d, 0x83,
+ 0xf7, 0x6e, 0xda, 0x12, 0xc1, 0xfa, 0x84, 0xaf, 0x34, 0xc3, 0xb0, 0x2b,
+ 0xe8, 0xc0, 0x22, 0x26, 0xed, 0x90, 0x55, 0x07, 0xd1, 0xe3, 0x48, 0xf2,
+ 0x32, 0xf2, 0x0b, 0x61, 0xdd, 0x1d, 0x85, 0x05, 0xb7, 0x6c, 0xd9, 0x0a,
+ 0x5c, 0x0e, 0x8d, 0x82, 0x8a, 0x52, 0x3f, 0x78, 0xea, 0x1b, 0xd9, 0xe6,
+ 0xac, 0x7f, 0x00, 0x00, 0x5a, 0xc7, 0xbd, 0x8a, 0x84, 0xe1, 0x61, 0xdb,
+ 0x34, 0xf0, 0xa6, 0xee, 0x2e, 0x2e, 0x8f, 0xd3, 0xe7, 0x32, 0xc6, 0xb2,
+ 0x39, 0xdf, 0xe0, 0x7d, 0x6a, 0xcd, 0x4c, 0xe1, 0xdc, 0x2d, 0xaa, 0x51,
+ 0xac, 0xd5, 0x15, 0xb0, 0x13, 0xc3, 0x98, 0x6e, 0x29, 0xb7, 0xb6, 0x10,
+ 0xf7, 0x0a, 0x98, 0x15, 0x02, 0x31, 0x15, 0x73, 0xe5, 0xea, 0x03, 0x2a,
+ 0x40, 0x5f, 0x69, 0x85, 0xf4, 0xcb, 0xc8, 0x52, 0xe4, 0xdb, 0x59, 0x37,
+ 0xc6, 0xc9, 0x58, 0x81, 0x1c, 0xdc, 0xc1, 0xb8, 0x81, 0x29, 0x82, 0xa3,
+ 0x85, 0x3e, 0xd8, 0xd0, 0x67, 0xea, 0x03, 0x3d, 0x0a, 0x45, 0xa1, 0x22,
+ 0x9f, 0xfd, 0x93, 0x64, 0xd6, 0xfa, 0xe4, 0x25, 0xc7, 0x4d, 0x69, 0xbd,
+ 0xa7, 0x37, 0x5f, 0x48, 0xef, 0xe4, 0xf4, 0x35, 0x98, 0x10, 0x0f, 0x65,
+ 0xc1, 0xf0, 0x61, 0x62, 0x6b, 0x13, 0xd3, 0xec, 0xc5, 0x5b, 0x03, 0x50,
+ 0x64, 0x79, 0x8c, 0x28, 0x99, 0xe9, 0xe4, 0x84, 0x79, 0x6d, 0x2d, 0x39,
+ 0xee, 0x2a, 0x12, 0xc8, 0xf7, 0x4f, 0x82, 0x6e, 0x9c, 0x94, 0x15, 0x20,
+ 0x19, 0xd5, 0x26, 0xc8, 0x22, 0x04, 0x38, 0xbb, 0xdb, 0x13, 0x9a, 0x7a,
+ 0x87, 0x21, 0x99, 0x49, 0x00, 0x46, 0x17, 0x2e, 0xdf, 0xed, 0xca, 0x83,
+ 0x17, 0xe3, 0x74, 0xb1, 0x45, 0x2e, 0xe6, 0xc1, 0x09, 0xe9, 0xcc, 0xe9,
+ 0x31, 0x56, 0x4e, 0x23, 0xf1, 0xef, 0x88, 0x36, 0x88, 0x14, 0x7e, 0x7d,
+ 0x4a, 0x82, 0x4f, 0xb6, 0x5a, 0x62, 0xda, 0x8c, 0xb3, 0xa0, 0xca, 0xaa,
+ 0x9b, 0x66, 0x18, 0xb9, 0xbe, 0x0d, 0x59, 0x75, 0x1b, 0x5b, 0xff, 0xf5,
+ 0x58, 0x13, 0x19, 0x2a, 0x48, 0xc6, 0x7f, 0xbe, 0x11, 0x21, 0x5a, 0x1b,
+ 0xf4, 0x49, 0xe7, 0xbc, 0xd6, 0xb2, 0xdf, 0xf9, 0x2a, 0xaf, 0xfb, 0x15,
+ 0xa8, 0xa2, 0x34, 0x24, 0x7e, 0x36, 0x86, 0x33, 0x9c, 0x3e, 0xe3, 0x46,
+ 0x7d, 0x8b, 0x1d, 0x37, 0xfc, 0x47, 0xbe, 0xd2, 0x3f, 0xb8, 0x4c, 0x9d,
+ 0xd4, 0xa9, 0xbb, 0xb6, 0x7f, 0x4a, 0x2f, 0xa0, 0x22, 0xa9, 0x1a, 0x1e,
+ 0xdd, 0xd0, 0x1e, 0xb6, 0x40, 0x98, 0x12, 0xc2, 0x5d, 0xff, 0xfb, 0x20,
+ 0xdc, 0x2c, 0xfd, 0xb9, 0x4c, 0x9a, 0xcd, 0x6b, 0x29, 0xab, 0x75, 0xb0,
+ 0xfd, 0xc4, 0xdd, 0xa0, 0x92, 0xe3, 0x8b, 0x2f, 0x18, 0xbb, 0x7d, 0x82,
+ 0xa5, 0x30, 0x88, 0x21, 0x94, 0x31, 0x44, 0xfd, 0x76, 0xdc, 0xc9, 0x58,
+ 0xb8, 0x0a, 0x8d, 0x14, 0x59, 0x81, 0x22, 0xa7, 0x84, 0xaf, 0x84, 0x1e,
+ 0xc6, 0x5e, 0x0c, 0x50, 0x24, 0xac, 0x8b, 0xa0, 0x5e, 0x45, 0x14, 0x06,
+ 0x52, 0x60, 0x35, 0xa2, 0x88, 0x08, 0x2c, 0xc1, 0x5e, 0xfd, 0xca, 0x57,
+ 0x2b, 0xbe, 0x4d, 0xee, 0x12, 0x8e, 0x60, 0x99, 0x12, 0x9d, 0xad, 0x8c,
+ 0x57, 0x3e, 0xf2, 0x7f, 0x69, 0x57, 0x65, 0x00, 0xa7, 0x48, 0x62, 0x5e,
+ 0xb3, 0x4f, 0x2c, 0x1e, 0x38, 0xb0, 0xc6, 0xbb, 0x8d, 0x77, 0x35, 0x3e,
+ 0xca, 0xd4, 0x36, 0x30, 0x46, 0x20, 0xd2, 0xde, 0xd4, 0x66, 0x50, 0xd9,
+ 0x7f, 0x12, 0x28, 0x28, 0x4d, 0x0c, 0xf0, 0x44, 0x95, 0x17, 0xbf, 0xa5,
+ 0xf9, 0xd5, 0x62, 0x97, 0xbc, 0xc0, 0x08, 0x64, 0x1d, 0x44, 0x69, 0x3f,
+ 0xb0, 0x60, 0xd0, 0xe0, 0x92, 0xd0, 0x87, 0x4f, 0x6d, 0x5f, 0x3a, 0xc2,
+ 0x8e, 0x9b, 0xfc, 0x37, 0x6d, 0x3c, 0xe8, 0xe2, 0xd8, 0x09, 0x0a, 0x04,
+ 0xe2, 0x00, 0xd0, 0x80, 0x13, 0xcd, 0xb9, 0x5f, 0x12, 0x7a, 0xa4, 0xce,
+ 0xc4, 0xa0, 0xee, 0xad, 0xe4, 0xc7, 0x5d, 0x11, 0xf4, 0xaa, 0x38, 0x89,
+ 0xa7, 0x2b, 0xb2, 0x34, 0x38, 0x7c, 0xff, 0x05, 0xe6, 0x3f, 0xc1, 0xb8,
+ 0x1d, 0x80, 0x1e, 0x9b, 0xb8, 0xa1, 0xe1, 0x4a, 0x8d, 0x3f, 0x82, 0x9b,
+ 0x4d, 0x08, 0xce, 0x89, 0x8d, 0x7e, 0xb9, 0x20, 0x1b, 0x71, 0xb3, 0x57,
+ 0x5a, 0x71, 0xdc, 0x45, 0x1b, 0xba, 0x3c, 0x95, 0x18, 0xfb, 0x08, 0xb0,
+ 0x6e, 0x90, 0x27, 0xd3, 0xae, 0x20, 0x39, 0xdb, 0x1f, 0x71, 0xdd, 0x97,
+ 0x6f, 0x7c, 0xfa, 0xd9, 0x12, 0xff, 0x41, 0x81, 0x14, 0x5c, 0xc7, 0xbc,
+ 0xe9, 0xb2, 0x60, 0xe3, 0x0b, 0xf4, 0x27, 0x32, 0x52, 0x7e, 0x08, 0x1d,
+ 0xa0, 0xc3, 0x4d, 0x0b, 0x91, 0x60, 0xba, 0x90, 0xfe, 0x26, 0x62, 0xb1,
+ 0x96, 0x1e, 0x47, 0xa0, 0x70, 0x2a, 0x29, 0xc5, 0xa9, 0xd2, 0x83, 0xff,
+ 0xb5, 0x89, 0x60, 0x7b, 0xc5, 0xe6, 0x67, 0xd2, 0xf6, 0x6d, 0x83, 0xfa,
+ 0xb3, 0xb3, 0x26, 0x48, 0x4e, 0xf2, 0x82, 0x67, 0xbf, 0xa6, 0x9b, 0xdb,
+ 0x84, 0xc9, 0xbd, 0xfd, 0xce, 0x52, 0x84, 0xa5, 0x3a, 0x87, 0x54, 0xea,
+ 0x0b, 0x97, 0xb6, 0xb0, 0x5e, 0x20, 0xde, 0x61, 0xce, 0xf4, 0x45, 0x3e,
+ 0x2f, 0xf5, 0x01, 0x9e, 0xef, 0x20, 0xe4, 0x80, 0x06, 0x84, 0xd4, 0x35,
+ 0x73, 0x20, 0xd2, 0xf8, 0xe5, 0xf4, 0x99, 0xd5, 0xc1, 0xbb, 0x94, 0x01,
+ 0x46, 0x17, 0xc4, 0x10, 0xa8, 0x0a, 0x0f, 0xea, 0xd3, 0x24, 0x4c, 0x01,
+ 0xc2, 0xd5, 0xcc, 0xa1, 0x73, 0x5e, 0xf7, 0x36, 0xd2, 0x79, 0x86, 0x88,
+ 0x3b, 0x91, 0xb9, 0x0f, 0xd3, 0xa8, 0xb3, 0x5b, 0x64, 0x02, 0xa0, 0xfb,
+ 0x15, 0x56, 0xb1, 0xac, 0x2f, 0x9d, 0xe2, 0x9e, 0x0f, 0x7e, 0xcf, 0xa6,
+ 0xc5, 0xf2, 0x58, 0xbe, 0xd1, 0x76, 0xf0, 0xec, 0x69, 0xf4, 0x91, 0xa9,
+ 0x50, 0x56, 0xa3, 0xdb, 0xba, 0x19, 0xd8, 0x9f, 0x77, 0x0f, 0x18, 0x26,
+ 0xb9, 0xfb, 0xcd, 0x4d, 0x76, 0x4c, 0xd2, 0x07, 0xc3, 0x04, 0x83, 0xc8,
+ 0xf1, 0x30, 0x79, 0x23, 0xd6, 0xd6, 0x56, 0xf6, 0x96, 0xe2, 0xa5, 0x89,
+ 0x86, 0xe0, 0x62, 0x8c, 0x02, 0x3a, 0x85, 0x5d, 0x58, 0xf5, 0xe2, 0xcc,
+ 0x6d, 0x8e, 0x9a, 0xe3, 0x6f, 0x83, 0x35, 0x4e, 0xc8, 0x2a, 0xb3, 0xb1,
+ 0xf8, 0x04, 0xae, 0xf3, 0xe0, 0xb7, 0x09, 0xce, 0x38, 0x13, 0x73, 0x8c,
+ 0x97, 0x6c, 0x90, 0xd4, 0x24, 0x53, 0xab, 0xec, 0xd5, 0x10, 0x8c, 0xc7,
+ 0x02, 0x3a, 0x77, 0x6e, 0x7e, 0x42, 0x50, 0x54, 0xf1, 0xbc, 0xd7, 0x2d,
+ 0x62, 0x7c, 0x33, 0x6d, 0x53, 0x45, 0xd2, 0x2e, 0x4e, 0x19, 0xf4, 0x5d,
+ 0xae, 0x34, 0x17, 0x85, 0x6c, 0x43, 0xd7, 0x0c, 0x91, 0x65, 0x90, 0xa5,
+ 0x5f, 0x38, 0x3d, 0xc1, 0xb0, 0xae, 0xf2, 0x50, 0x37, 0x2f, 0x8a, 0xe5,
+ 0x49, 0x66, 0x71, 0x53, 0xb7, 0x66, 0xa8, 0xb4, 0x6d, 0x87, 0x13, 0xa2,
+ 0x88, 0xc9, 0xe4, 0xb6, 0xd5, 0x0e, 0x7f, 0xad, 0xfe, 0x1a, 0xcf, 0x59,
+ 0xf3, 0xdf, 0xd9, 0xd3, 0x64, 0xd9, 0x0a, 0x3c, 0x26, 0xff, 0xa9, 0x92,
+ 0x64, 0xdc, 0xa6, 0xd5, 0xae, 0x77, 0x2f, 0x7e, 0xc1, 0x53, 0xfc, 0xff,
+ 0x75, 0xa9, 0xa5, 0x39, 0x6e, 0xe2, 0xd5, 0xff, 0xff, 0xe3, 0x43, 0xac,
+ 0x0b, 0x21, 0x26, 0xd0, 0xe1, 0xe7, 0x33, 0x59, 0xb0, 0x26, 0xed, 0xd8,
+ 0x9d, 0x67, 0x28, 0x09, 0x8a, 0x0f, 0xf0, 0x56, 0x72, 0xd5, 0x8f, 0x87,
+ 0x9b, 0x17, 0x62, 0xdf, 0x9e, 0x39, 0x11, 0x9a, 0x2f, 0x88, 0x88, 0x48,
+ 0xc4, 0xf6, 0x52, 0x11, 0xce, 0x96, 0x37, 0xaa, 0x04, 0xc1, 0x07, 0x5f,
+ 0x18, 0x77, 0x40, 0x1c, 0x75, 0xe3, 0x22, 0x65, 0x72, 0x50, 0xcc, 0xe5,
+ 0x53, 0xfe, 0x9a, 0xde, 0x7e, 0xfc, 0x52, 0x92, 0x36, 0x69, 0x5e, 0x4c,
+ 0x79, 0xd7, 0x51, 0x11, 0xec, 0x65, 0xd2, 0xab, 0x3f, 0xbe, 0x07, 0x89,
+ 0x13, 0x66, 0xc6, 0xa7, 0xfa, 0x7c, 0x99, 0x07, 0x6b, 0x05, 0xd8, 0x2d,
+ 0x1c, 0x52, 0xaa, 0x53, 0x84, 0x94, 0x62, 0x48, 0x23, 0x9a, 0xca, 0x33,
+ 0x1a, 0xd5, 0xba, 0x3e, 0xce, 0x43, 0x44, 0xb5, 0x78, 0x0e, 0x4b, 0x91,
+ 0x7e, 0xac, 0xf3, 0x8e, 0xc4, 0x16, 0x4f, 0xd1, 0x12, 0x05, 0x16, 0x60,
+ 0x35, 0x63, 0xf6, 0x21, 0x61, 0x19, 0x00, 0x2e, 0xa7, 0x84, 0x45, 0x26,
+ 0xbf, 0x98, 0x3f, 0xe8, 0x42, 0xf6, 0xf0, 0x46, 0x0e, 0xc6, 0xe0, 0xe3,
+ 0xcc, 0x22, 0x50, 0xe8, 0x76, 0x64, 0x33, 0x83, 0x8b, 0x9f, 0xad, 0xd1,
+ 0x72, 0x17, 0xff, 0x47, 0x57, 0x61, 0x67, 0x12, 0xc1, 0xda, 0x4c, 0x89,
+ 0x27, 0x1f, 0xe7, 0xf0, 0x4a, 0xe5, 0x05, 0x68, 0x51, 0x49, 0x16, 0x59,
+ 0x91, 0x6e, 0xcb, 0xfd, 0xb3, 0x03, 0xbe, 0x70, 0x7d, 0x2d, 0xfa, 0x2f,
+ 0xf0, 0xcc, 0xc3, 0x98, 0x09, 0x56, 0xa5, 0x64, 0x87, 0x0d, 0xac, 0xfe,
+ 0xbe, 0xbc, 0x16, 0xb4, 0x69, 0x0c, 0x66, 0x1e, 0x6e, 0x88, 0xc9, 0x88,
+ 0x47, 0xe0, 0xdd, 0x43, 0xe4, 0x64, 0xaf, 0x10, 0x4c, 0xac, 0x94, 0x58,
+ 0x32, 0x9c, 0x34, 0xb9, 0xa0, 0x86, 0x84, 0x7f, 0x77, 0xc5, 0x9a, 0x05,
+ 0x2d, 0x97, 0x7e, 0x69, 0xb2, 0x82, 0x9d, 0x64, 0x27, 0xc7, 0x06, 0x77,
+ 0x81, 0x32, 0x76, 0x36, 0xca, 0x05, 0x66, 0x37, 0xae, 0x3e, 0x5f, 0xff,
+ 0x09, 0xd1, 0x26, 0x24, 0x8f, 0x1a, 0x89, 0xc6, 0x36, 0xfa, 0x02, 0x11,
+ 0x59, 0x2b, 0xa1, 0x0f, 0xb9, 0x2a, 0xe6, 0xb3, 0xd4, 0x39, 0x07, 0xd8,
+ 0xc9, 0x79, 0x5b, 0x3f, 0xa0, 0xd7, 0x5d, 0x0c, 0x0d, 0x12, 0xe6, 0x58,
+ 0x2c, 0x5b, 0x6b, 0x4f, 0x45, 0x86, 0x19, 0x17, 0x72, 0x22, 0x49, 0x17,
+ 0x47, 0x4e, 0x93, 0x63, 0xa3, 0x04, 0x50, 0xa2, 0xb2, 0x8e, 0xb5, 0xc7,
+ 0x91, 0x46, 0x5e, 0xdf, 0x68, 0xb0, 0xf1, 0x8d, 0x9d, 0x4c, 0x76, 0xc3,
+ 0x5d, 0x10, 0x1f, 0x43, 0x01, 0x2e, 0x3d, 0xe6, 0xc2, 0x40, 0x6a, 0x80,
+ 0x12, 0x5e, 0x8e, 0x48, 0x6d, 0x38, 0x31, 0xf2, 0x98, 0x4b, 0xc7, 0x86,
+ 0x7d, 0xb0, 0xd3, 0x45, 0x31, 0x57, 0xce, 0x91, 0x64, 0xae, 0x62, 0x19,
+ 0xba, 0x70, 0x8a, 0x6f, 0xcc, 0xf9, 0x8b, 0x8d, 0x23, 0x5d, 0xe9, 0x13,
+ 0xa2, 0x69, 0x08, 0x67, 0x3b, 0xfd, 0x3f, 0xf6, 0x4d, 0x1d, 0x83, 0x82,
+ 0xa0, 0x32, 0x8f, 0x5b, 0x9a, 0xc6, 0x9b, 0xc7, 0x13, 0x03, 0xc2, 0x39,
+ 0xae, 0x77, 0x19, 0x89, 0xfc, 0xc5, 0xb3, 0x1f, 0xf8, 0x43, 0x46, 0x9c,
+ 0xd1, 0xe7, 0xb3, 0x72, 0x16, 0xdb, 0x6d, 0xad, 0xc9, 0xb7, 0xf3, 0xdf,
+ 0x9f, 0xb4, 0x4b, 0xc7, 0x42, 0x42, 0x49, 0xac, 0x1d, 0xc7, 0x48, 0x37,
+ 0x25, 0x81, 0x36, 0xf9, 0xe7, 0xc7, 0x9f, 0x24, 0xaf, 0x97, 0xb0, 0x92,
+ 0x89, 0x1c, 0xab, 0x5b, 0x67, 0x80, 0xf9, 0x93, 0x61, 0xff, 0x1d, 0x89,
+ 0x67, 0xc0, 0xc1, 0xeb, 0xbd, 0xd1, 0xd4, 0xc0, 0x87, 0xca, 0x49, 0x40,
+ 0xbe, 0xe6, 0xc2, 0xa2, 0x46, 0xd6, 0x4d, 0x93, 0x4b, 0x7b, 0x97, 0xb6,
+ 0x60, 0x4d, 0x9f, 0xe5, 0xed, 0xc2, 0x56, 0xc4, 0x35, 0x50, 0xc7, 0x90,
+ 0x1a, 0x23, 0x4e, 0x4a, 0x82, 0xa6, 0x20, 0x01, 0x55, 0x5c, 0x1a, 0xf2,
+ 0xe8, 0x61, 0x1d, 0x76, 0xe9, 0xde, 0x7d, 0x7f, 0x4d, 0x62, 0xb9, 0x51,
+ 0xe6, 0x05, 0x3b, 0xf7, 0x5a, 0x98, 0x6c, 0x86, 0x72, 0xfe, 0x38, 0xf9,
+ 0x38, 0x7b, 0xed, 0x26, 0xed, 0xe5, 0x1f, 0xed, 0x89, 0xf8, 0x37, 0x4d,
+ 0x27, 0x7b, 0x0d, 0x1d, 0x77, 0xc2, 0x59, 0x6a, 0xc9, 0x86, 0x46, 0xd7,
+ 0xc0, 0x9e, 0xd7, 0xaa, 0xd9, 0xe2, 0x0c, 0x07, 0xd1, 0x2f, 0xa0, 0xdb,
+ 0x15, 0xc8, 0x95, 0x8d, 0xe8, 0xaa, 0xfc, 0x7c, 0xef, 0xa5, 0xf8, 0xca,
+ 0xc0, 0x82, 0xf9, 0x1f, 0xf4, 0xda, 0x93, 0xe4, 0x2e, 0x46, 0xec, 0x85,
+ 0x1b, 0x48, 0xfb, 0x00, 0x28, 0x8f, 0xde, 0x6e, 0x86, 0xf7, 0xcd, 0x66,
+ 0x46, 0x43, 0x88, 0xd4, 0xac, 0x80, 0x79, 0x44, 0xc7, 0x92, 0xd1, 0x6f,
+ 0x64, 0xbd, 0x0f, 0x48, 0x54, 0x43, 0x06, 0xa7, 0x09, 0xd4, 0xc9, 0xe8,
+ 0xd1, 0x40, 0xaa, 0x58, 0x74, 0xb6, 0x15, 0xb9, 0x4f, 0x03, 0x87, 0x52,
+ 0x26, 0x25, 0x72, 0x78, 0xa9, 0x08, 0x3d, 0x86, 0x93, 0x8b, 0x6e, 0x3f,
+ 0x13, 0x02, 0x9c, 0xbd, 0x96, 0xbd, 0xb3, 0x38, 0xf3, 0xba, 0x4a, 0x8e,
+ 0x54, 0x4b, 0x05, 0xbb, 0xe7, 0x2f, 0x04, 0x16, 0x7a, 0x5d, 0xc7, 0x63,
+ 0xed, 0x6d, 0xc5, 0x67, 0x9c, 0x5a, 0xb3, 0x2a, 0xa4, 0x4e, 0x25, 0xae,
+ 0xa4, 0x87, 0x58, 0x3c, 0x25, 0xea, 0xdc, 0x14, 0xe4, 0x47, 0xbb, 0xed,
+ 0x80, 0x5e, 0x8c, 0x8c, 0xa8, 0x14, 0x9d, 0x60, 0xa7, 0xad, 0x93, 0x56,
+ 0x04, 0xe1, 0xf2, 0x43, 0xaa, 0xc7, 0xd5, 0xb6, 0x42, 0xf4, 0xf5, 0xf7,
+ 0x2e, 0x94, 0x97, 0x9d, 0xdb, 0x61, 0xba, 0x88, 0xa3, 0xd7, 0x80, 0x69,
+ 0x40, 0xea, 0xf2, 0x77, 0x45, 0xe0, 0xcb, 0xd7, 0xb4, 0x8a, 0x7c, 0xca,
+ 0xfe, 0x2f, 0x86, 0x5e, 0x9a, 0x21, 0xa2, 0xcf, 0x26, 0xf2, 0xa7, 0xfd,
+ 0x41, 0x7a, 0x66, 0x68, 0xcc, 0x31, 0xfb, 0x17, 0x76, 0x06, 0x06, 0xd2,
+ 0xd3, 0x90, 0xb1, 0x23, 0x03, 0x28, 0x2a, 0x54, 0x6f, 0xf5, 0xcd, 0x94,
+ 0x41, 0x30, 0x9f, 0x4b, 0x46, 0xc7, 0xbf, 0x13, 0xe6, 0x9d, 0x2d, 0x47,
+ 0xb5, 0xe1, 0x31, 0x82, 0xcb, 0x5a, 0x96, 0x76, 0x9e, 0x0d, 0x82, 0xa4,
+ 0x8f, 0x24, 0xb0, 0x7b, 0xc1, 0xc6, 0x62, 0xed, 0xfd, 0xf8, 0x35, 0xfe,
+ 0xfd, 0xc3, 0xe5, 0xa6, 0x49, 0xf0, 0xc7, 0xab, 0x15, 0x2b, 0x8c, 0x38,
+ 0x2e, 0xe7, 0x24, 0x7e, 0x01, 0x94, 0xef, 0xe1, 0x0a, 0x33, 0xfb, 0xef,
+ 0x07, 0xae, 0x2e, 0xae, 0xf6, 0xf9, 0xe9, 0x4c, 0x55, 0x22, 0x20, 0xa6,
+ 0xa9, 0xe1, 0x28, 0xad, 0xe4, 0x54, 0xe0, 0xcd, 0x76, 0x49, 0x5d, 0x1d,
+ 0x63, 0x1e, 0x9d, 0xc1, 0x52, 0x32, 0x70, 0x07, 0x50, 0xb9, 0x65, 0x40,
+ 0x31, 0xdf, 0x57, 0xa0, 0xb1, 0xf2, 0x0b, 0xaa, 0x63, 0xad, 0x7e, 0x48,
+ 0xde, 0x77, 0x66, 0x33, 0xdc, 0x0a, 0x6a, 0xe9, 0x51, 0xcf, 0xf7, 0x41,
+ 0x13, 0xf2, 0xb7, 0xab, 0x5d, 0x8f, 0x04, 0x8f, 0xbb, 0xec, 0x46, 0x1e,
+ 0xea, 0x64, 0x8d, 0x0f, 0x62, 0xb2, 0x8c, 0x4c, 0xc6, 0x29, 0x4e, 0x51,
+ 0x18, 0x40, 0xe5, 0xa5, 0xe7, 0x65, 0xd2, 0x05, 0xef, 0xe2, 0x6b, 0xed,
+ 0xe4, 0x37, 0x3a, 0x18, 0xb5, 0xbf, 0x6f, 0xff, 0x95, 0xb8, 0xc7, 0x26,
+ 0xb7, 0x04, 0xe5, 0xe1, 0xfd, 0xc0, 0xd3, 0xbb, 0x89, 0xf8, 0xe1, 0xb1,
+ 0x0c, 0x6e, 0x35, 0x57, 0xd1, 0xd9, 0xb2, 0x75, 0x80, 0x5f, 0xdf, 0x6e,
+ 0xad, 0xfa, 0xb9, 0x3d, 0x7e, 0xa7, 0xb7, 0xfa, 0xcd, 0xc9, 0x8e, 0x66,
+ 0xd7, 0xff, 0xa8, 0x6f, 0xe9, 0x5b, 0x5a, 0x30, 0x42, 0x08, 0x4a, 0xa6,
+ 0x59, 0xfa, 0xc2, 0x63, 0xf0, 0xf5, 0x18, 0x14, 0xc2, 0x24, 0x38, 0x86,
+ 0x70, 0x30, 0x4f, 0x49, 0x14, 0xfe, 0xbd, 0x88, 0x42, 0x33, 0x38, 0xf3,
+ 0x27, 0x7e, 0x41, 0x56, 0xe5, 0x6e, 0x27, 0x3b, 0x0d, 0x45, 0xb3, 0x64,
+ 0x4d, 0x1e, 0xe4, 0x9b, 0x7e, 0x82, 0x70, 0x5b, 0xa3, 0x4f, 0x70, 0x88,
+ 0x70, 0x21, 0xcd, 0x26, 0x49, 0xd1, 0xc0, 0x0d, 0x32, 0x9b, 0xf2, 0xd1,
+ 0x7c, 0x7a, 0xc5, 0x5c, 0xc4, 0xe5, 0x45, 0xe7, 0x00, 0xf4, 0x7e, 0x28,
+ 0xf4, 0xff, 0xde, 0x87, 0x6e, 0x25, 0xb7, 0x5f, 0x82, 0xa3, 0xdb, 0xad,
+ 0xcb, 0x4f, 0x92, 0x87, 0x72, 0xc2, 0x43, 0xdd, 0xfe, 0x70, 0xc7, 0x12,
+ 0xfd, 0x84, 0xad, 0x89, 0x0b, 0xcd, 0x19, 0xd9, 0xf5, 0x73, 0xad, 0x18,
+ 0x64, 0x68, 0xad, 0x33, 0xaa, 0x98, 0xb4, 0x03, 0x8b, 0x05, 0x3c, 0xbf,
+ 0x87, 0x1b, 0xa6, 0xdd, 0x83, 0x84, 0xfa, 0xf4, 0x40, 0x5c, 0x8f, 0xd0,
+ 0xe1, 0xaf, 0xe6, 0xcd, 0xfe, 0x68, 0x65, 0x9a, 0x66, 0x23, 0x03, 0x8f,
+ 0x37, 0x23, 0xf6, 0x89, 0x36, 0x70, 0x17, 0x82, 0x11, 0x88, 0x5f, 0x31,
+ 0xb2, 0x56, 0xbe, 0x32, 0x83, 0xf8, 0xaa, 0x89, 0xfa, 0xb1, 0x86, 0xc6,
+ 0x22, 0x05, 0x60, 0x45, 0x22, 0x3a, 0x98, 0xde, 0x45, 0xca, 0x7e, 0x83,
+ 0xe4, 0x43, 0xb9, 0x36, 0xf7, 0x52, 0xdb, 0x1b, 0x1b, 0xe6, 0xb4, 0x72,
+ 0x4f, 0x56, 0x48, 0xff, 0x7d, 0x6c, 0x7d, 0x0f, 0x40, 0xd4, 0x6f, 0xd1,
+ 0xd8, 0x41, 0x64, 0x1e, 0xe0, 0x76, 0x4e, 0x68, 0x58, 0x02, 0x3d, 0xaa,
+ 0x90, 0xc1, 0xda, 0x5d, 0xa8, 0x7e, 0xb7, 0x95, 0x8c, 0xd0, 0x88, 0x38,
+ 0xa8, 0x21, 0xe5, 0xc2, 0x46, 0x3e, 0x37, 0xbd, 0x8e, 0xc8, 0x74, 0x98,
+ 0xed, 0x6c, 0x88, 0x7f, 0xfd, 0xeb, 0x62, 0x2e, 0xf2, 0x6a, 0xd4, 0xeb,
+ 0xf2, 0xf0, 0x66, 0x21, 0x72, 0x4a, 0x24, 0x32, 0xed, 0x00, 0x0c, 0x56,
+ 0xfa, 0x49, 0x9d, 0xc7, 0x08, 0x22, 0xc9, 0x52, 0xdc, 0xf0, 0x26, 0xc1,
+ 0x69, 0x58, 0x2a, 0xbe, 0x27, 0x5d, 0x5e, 0x44, 0xb3, 0x85, 0x0f, 0x68,
+ 0x25, 0xc4, 0x59, 0x8a, 0x6d, 0xca, 0xb1, 0xec, 0x69, 0x6d, 0x52, 0xd1,
+ 0x54, 0x61, 0x8c, 0xff, 0xe9, 0xf7, 0x62, 0x9b, 0x8b, 0xe6, 0xe6, 0xc9,
+ 0x43, 0xa9, 0xc0, 0xad, 0x3a, 0xfa, 0x3a, 0x41, 0x1a, 0xed, 0xa4, 0xc8,
+ 0x42, 0xeb, 0xba, 0xbb, 0xec, 0xde, 0x72, 0xf5, 0x55, 0x78, 0xff, 0x8d,
+ 0xb9, 0x8a, 0x62, 0xa3, 0xfb, 0x94, 0x23, 0xdb, 0x90, 0xf2, 0x57, 0x28,
+ 0x7b, 0x17, 0x51, 0xb3, 0xdd, 0x8b, 0x4f, 0x6d, 0x5a, 0xeb, 0x21, 0x59,
+ 0x50, 0x5f, 0x71, 0xe5, 0x95, 0xd6, 0x03, 0xf5, 0xad, 0x1b, 0x7b, 0xbb,
+ 0xe1, 0xc4, 0xae, 0x2e, 0x71, 0x15, 0x6c, 0x66, 0xd0, 0xfb, 0x01, 0x35,
+ 0x9c, 0x64, 0xae, 0x55, 0xc8, 0x82, 0xb5, 0x6d, 0x83, 0x2b, 0x5d, 0xf6,
+ 0xde, 0x79, 0x5d, 0x93, 0xb1, 0xfe, 0x2e, 0x60, 0x4d, 0x46, 0xd3, 0xd9,
+ 0xcc, 0xd2, 0x30, 0x7c, 0xec, 0xd4, 0xcb, 0x75, 0x9f, 0x78, 0xfd, 0x44,
+ 0xd9, 0x1d, 0x58, 0xac, 0xef, 0x02, 0x28, 0xaa, 0x8d, 0xbe, 0x3c, 0xec,
+ 0x51, 0x7e, 0x44, 0x40, 0xd7, 0xec, 0x52, 0x25, 0xf1, 0x99, 0x53, 0x65,
+ 0xfb, 0xbc, 0x10, 0x75, 0xa4, 0x27, 0x1b, 0x65, 0xdb, 0xe9, 0x8d, 0x90,
+ 0xa5, 0x14, 0xdc, 0x38, 0x31, 0xf1, 0x06, 0xf0, 0xa8, 0xea, 0xd6, 0xfb,
+ 0x7e, 0xb0, 0x18, 0x0d, 0x06, 0xbe, 0x92, 0xbc, 0xa0, 0x21, 0x9b, 0xfa,
+ 0x72, 0x4f, 0x0a, 0x4c, 0xa7, 0x8b, 0xd0, 0x39, 0xf1, 0xc3, 0x7b, 0x40,
+ 0x22, 0x5a, 0x11, 0x96, 0xe5, 0x50, 0xb5, 0xb1, 0x4e, 0xdf, 0x95, 0x03,
+ 0xe1, 0x6e, 0x16, 0x9d, 0x1f, 0xb8, 0xb7, 0x4c, 0x93, 0x3c, 0x8c, 0x19,
+ 0xbd, 0x57, 0x8f, 0x7d, 0xa5, 0x4d, 0x04, 0x1f, 0x11, 0x22, 0xd5, 0x3b,
+ 0xb6, 0x8f, 0xbd, 0x6d, 0x21, 0x89, 0xa3, 0xc9, 0xc5, 0xf6, 0x09, 0xf1,
+ 0x4a, 0x1f, 0xe9, 0xff, 0x96, 0x8e, 0x71, 0x28, 0x95, 0x68, 0xcb, 0xd5,
+ 0xd9, 0x3c, 0xe0, 0xa6, 0xc4, 0x49, 0xf4, 0x84, 0xa7, 0x57, 0x69, 0x73,
+ 0xc5, 0xd9, 0xc9, 0x14, 0x05, 0xa9, 0x06, 0xa5, 0x95, 0x21, 0xb2, 0x69,
+ 0x1b, 0x25, 0xbe, 0x20, 0x56, 0xf0, 0xdd, 0x2d, 0xed, 0xea, 0xaf, 0xc2,
+ 0x79, 0xb1, 0xea, 0xeb, 0xed, 0x27, 0x87, 0xe6, 0xc3, 0x4e, 0x5b, 0x08,
+ 0xde, 0x44, 0xb3, 0x01, 0xf9, 0x71, 0x1d, 0x3e, 0x2d, 0x1a, 0xc6, 0xfe,
+ 0x87, 0xe9, 0xa4, 0xea, 0x4c, 0xc7, 0x83, 0x80, 0xae, 0x03, 0x9a, 0x43,
+ 0x2f, 0x26, 0xa3, 0x86, 0xa0, 0x8d, 0xc2, 0xf4, 0x26, 0x24, 0x31, 0xab,
+ 0x5b, 0xc6, 0x0d, 0xf6, 0xc6, 0x07, 0x56, 0x9a, 0x69, 0x04, 0xc4, 0x50,
+ 0x0d, 0x7e, 0x25, 0x18, 0x88, 0x8c, 0x01, 0x98, 0xd4, 0x07, 0x72, 0xa4,
+ 0x26, 0xe1, 0x70, 0x26, 0xc1, 0x74, 0x74, 0x9f, 0xda, 0xc3, 0x40, 0x48,
+ 0xc2, 0x03, 0x8e, 0x05, 0x2c, 0x9d, 0x27, 0xbf, 0x50, 0x28, 0x77, 0xc3,
+ 0xd8, 0x9f, 0xeb, 0x0a, 0x3e, 0x9e, 0xe8, 0x88, 0x8e, 0x14, 0x98, 0xff,
+ 0xbd, 0x50, 0x3e, 0x5d, 0xd2, 0x3a, 0x70, 0x95, 0xe8, 0x1e, 0x77, 0x5f,
+ 0x45, 0xd8, 0x57, 0x00, 0xcc, 0xa2, 0x9f, 0x1f, 0xcd, 0xec, 0xa8, 0x0b,
+ 0x1a, 0x25, 0x7f, 0x2c, 0x72, 0x8b, 0x05, 0xce, 0xc0, 0x56, 0x0e, 0xcc,
+ 0x8e, 0x98, 0x5c, 0xbd, 0xf4, 0x64, 0xf8, 0x14, 0xf3, 0x1e, 0x6a, 0xd5,
+ 0xa1, 0x3a, 0x35, 0x06, 0xae, 0x3b, 0x25, 0x4c, 0xf5, 0x76, 0x55, 0xbe,
+ 0xde, 0x0a, 0xe3, 0xa0, 0x87, 0xcf, 0xfd, 0xfc, 0xdf, 0x3a, 0x83, 0x7f,
+ 0x0f, 0x77, 0x1c, 0x33, 0x46, 0x0a, 0x3b, 0x17, 0x72, 0x4c, 0x9b, 0x1f,
+ 0xb6, 0xd7, 0x72, 0x00, 0x21, 0x4d, 0x17, 0x3c, 0xd8, 0x1e, 0x22, 0xf1,
+ 0xcd, 0xb5, 0x7d, 0xf9, 0xc1, 0xa5, 0xba, 0x77, 0x2a, 0x0a, 0xd2, 0x9b,
+ 0x6a, 0x4d, 0x6a, 0x23, 0x7f, 0xc7, 0xe1, 0xff, 0x31, 0x69, 0x3b, 0xb8,
+ 0x9a, 0xb5, 0x53, 0x83, 0xa5, 0xa1, 0xc0, 0xd7, 0x8a, 0x07, 0x9a, 0x47,
+ 0xd3, 0x87, 0x8c, 0x66, 0x9c, 0xa3, 0x08, 0xa4, 0x48, 0xde, 0xdf, 0xf8,
+ 0x6e, 0xc8, 0xca, 0x3f, 0xcb, 0x10, 0x7d, 0x4d, 0xa8, 0x53, 0x7b, 0xfa,
+ 0xe5, 0xac, 0x0a, 0x98, 0xf1, 0x53, 0x1f, 0x3d, 0x19, 0x49, 0x70, 0x4a,
+ 0x76, 0x6d, 0xb7, 0x9d, 0x40, 0x1f, 0x80, 0x98, 0x91, 0xa7, 0xa9, 0x13,
+ 0xe7, 0x54, 0xa7, 0xc4, 0xa1, 0x00, 0x4c, 0xa4, 0xa2, 0x54, 0xcf, 0xff,
+ 0xb9, 0x54, 0xcd, 0x43, 0xcd, 0xe0, 0x4c, 0x90, 0xc2, 0x9a, 0xe4, 0xbc,
+ 0x6c, 0xc9, 0x1e, 0x86, 0x35, 0x4a, 0x5e, 0xce, 0x18, 0x6c, 0x63, 0xd7,
+ 0x93, 0x0c, 0x0d, 0xc2, 0xfb, 0x08, 0xbc, 0x37, 0x9f, 0xe9, 0x3f, 0x03,
+ 0x9e, 0x47, 0xbc, 0x87, 0xa2, 0x16, 0xb8, 0xc4, 0x1e, 0x8c, 0x80, 0xe7,
+ 0xfb, 0xc2, 0x24, 0xbd, 0x3e, 0xc2, 0x51, 0xac, 0x54, 0x92, 0x89, 0x04,
+ 0x0d, 0xfb, 0xf2, 0x5f, 0xf0, 0x52, 0xa2, 0xf9, 0xf5, 0xcd, 0x38, 0x4d,
+ 0xb9, 0xec, 0x60, 0x02, 0x82, 0xe1, 0x5c, 0x97, 0xa5, 0x2b, 0x66, 0x91,
+ 0x23, 0xab, 0x10, 0x40, 0x8d, 0xcd, 0x43, 0x95, 0xa2, 0xef, 0x8c, 0xe3,
+ 0x45, 0x02, 0x4d, 0xc8, 0x51, 0xa2, 0x8f, 0x90, 0x82, 0x05, 0x00, 0xd5,
+ 0x58, 0xad, 0x1b, 0x72, 0xc8, 0x20, 0x82, 0x72, 0x0f, 0x51, 0xc0, 0x50,
+ 0x2c, 0x71, 0x5a, 0x20, 0xc3, 0x20, 0xab, 0x72, 0x2d, 0x35, 0x51, 0x3b,
+ 0xb3, 0x37, 0x27, 0x35, 0xa8, 0x93, 0x89, 0xf5, 0x5c, 0xbc, 0x16, 0xe9,
+ 0x69, 0x3f, 0xdb, 0x15, 0xa0, 0xc7, 0x9a, 0xbc, 0xf6, 0xfb, 0xe6, 0x23,
+ 0x5d, 0xb6, 0xf3, 0xc7, 0xdb, 0x30, 0x4b, 0x5a, 0x06, 0x85, 0x82, 0x4e,
+ 0x5a, 0xce, 0xb3, 0xa6, 0x49, 0xac, 0x83, 0x6f, 0x03, 0x27, 0x1f, 0x75,
+ 0xde, 0x8c, 0xa1, 0xd3, 0x5b, 0x2a, 0xb9, 0x91, 0xbf, 0xe3, 0x17, 0x8c,
+ 0x23, 0x49, 0xbc, 0x6a, 0xdf, 0xc5, 0x14, 0x93, 0x26, 0x63, 0x67, 0xd3,
+ 0x62, 0x3b, 0xc4, 0x93, 0xda, 0xeb, 0xf6, 0x77, 0xed, 0x97, 0x76, 0x5a,
+ 0x89, 0x23, 0x00, 0xc1, 0x04, 0xcf, 0xb9, 0x36, 0x55, 0x13, 0x6d, 0x7e,
+ 0x72, 0x64, 0xe6, 0x45, 0x26, 0x35, 0xdc, 0x00, 0x99, 0x67, 0xb9, 0x97,
+ 0x74, 0xe4, 0x9a, 0x68, 0x5a, 0xcc, 0xa0, 0x25, 0xd1, 0x6c, 0x11, 0xdb,
+ 0x4c, 0x82, 0x6b, 0x33, 0xda, 0xf9, 0xd5, 0xcf, 0x35, 0x60, 0x7e, 0xd1,
+ 0x1a, 0xa9, 0x08, 0xaf, 0xea, 0x62, 0x3d, 0xfd, 0x5d, 0x06, 0x8e, 0xbb,
+ 0x03, 0x44, 0x5c, 0x12, 0xbe, 0x35, 0xa2, 0xd8, 0x09, 0x51, 0xfd, 0x57,
+ 0x14, 0x89, 0xc4, 0x9f, 0x36, 0x89, 0xdd, 0x6e, 0x68, 0xab, 0xa1, 0x3f,
+ 0x77, 0x0f, 0x8e, 0xa6, 0xbd, 0x95, 0xba, 0xd4, 0x33, 0x1f, 0x78, 0x2f,
+ 0x48, 0x27, 0x9a, 0xe8, 0x82, 0x46, 0x37, 0x2e, 0x17, 0x59, 0xdd, 0xe7,
+ 0x31, 0x4f, 0x26, 0x41, 0x68, 0xaa, 0x1f, 0x55, 0x9d, 0x4e, 0x39, 0x83,
+ 0x03, 0x9b, 0x70, 0x0f, 0x7f, 0x67, 0x2a, 0x3f, 0xef, 0xc5, 0xdf, 0xfe,
+ 0x24, 0x49, 0x03, 0x86, 0x31, 0x79, 0x54, 0xfa, 0x9f, 0x73, 0xe2, 0x36,
+ 0x2c, 0x2b, 0xdb, 0x10, 0xaf, 0x95, 0xe0, 0x50, 0x51, 0x47, 0x6f, 0xea,
+ 0x3b, 0x77, 0x8b, 0x35, 0x8c, 0x4b, 0xd9, 0x98, 0x09, 0x6a, 0x4a, 0x92,
+ 0x75, 0x18, 0xe2, 0x94, 0x88, 0xcd, 0x31, 0xde, 0x07, 0xdb, 0xe4, 0x5f,
+ 0x15, 0x32, 0x7a, 0xc9, 0xac, 0xbf, 0x26, 0x45, 0x7f, 0xde, 0x54, 0x0c,
+ 0x95, 0xd3, 0xce, 0x7e, 0x6c, 0x09, 0x51, 0x7d, 0x1e, 0xbd, 0x40, 0xd6,
+ 0x05, 0x8d, 0xb4, 0xc2, 0xfc, 0xb8, 0x53, 0x54, 0xe3, 0x8c, 0x6d, 0xfa,
+ 0x88, 0xbf, 0x46, 0x8f, 0x2e, 0x5b, 0x78, 0x74, 0x38, 0x4c, 0xa9, 0x1e,
+ 0x0c, 0x8e, 0x51, 0xe5, 0x55, 0x6f, 0xa6, 0xb7, 0x99, 0xee, 0xf2, 0xa2,
+ 0x38, 0x62, 0xb9, 0xdd, 0xc1, 0x59, 0xe7, 0x73, 0xf9, 0x6c, 0x36, 0xe4,
+ 0xd0, 0x5d, 0x29, 0xa5, 0xfb, 0xec, 0x77, 0x79, 0xd0, 0x48, 0x03, 0x61,
+ 0x81, 0x1b, 0x9a, 0x91, 0xa9, 0x71, 0x27, 0x96, 0x67, 0x85, 0xa6, 0xdc,
+ 0xef, 0x1b, 0xc7, 0xe1, 0x80, 0x9d, 0x49, 0xfe, 0x2f, 0x08, 0xe4, 0x25,
+ 0x1d, 0x44, 0x78, 0x1e, 0xc9, 0xba, 0xfb, 0x79, 0xd9, 0x5d, 0x36, 0xd5,
+ 0xfa, 0x40, 0xb3, 0x6f, 0x2e, 0x91, 0x5a, 0xc5, 0x4a, 0x02, 0x30, 0x82,
+ 0xf0, 0x87, 0x0b, 0xfb, 0x62, 0x5c, 0x12, 0x0a, 0xd4, 0x7c, 0xe8, 0xac,
+ 0xae, 0xf7, 0x21, 0x33, 0xeb, 0xc0, 0x9a, 0x25, 0xeb, 0xf4, 0x6a, 0x48,
+ 0xc9, 0xd2, 0xd4, 0x8f, 0xa5, 0x42, 0xf8, 0x23, 0xdf, 0x89, 0xd9, 0xee,
+ 0x4b, 0xaf, 0xea, 0xc9, 0x3a, 0xe1, 0xc5, 0x62, 0xe4, 0x9c, 0x14, 0x9b,
+ 0xe7, 0xb1, 0xf6, 0x2d, 0xa0, 0x87, 0x11, 0xb7, 0xe5, 0x7a, 0x98, 0x03,
+ 0x17, 0xbc, 0x62, 0x45, 0xcb, 0x42, 0x6c, 0xa4, 0x06, 0xb7, 0x5c, 0x86,
+ 0xa6, 0xc5, 0xaf, 0x02, 0xea, 0xac, 0xfb, 0x6e, 0x0a, 0xa2, 0x3b, 0x8d,
+ 0x05, 0x5e, 0x89, 0x42, 0x83, 0xc3, 0x2f, 0xc7, 0x9c, 0x4e, 0x9d, 0x4c,
+ 0xe4, 0x4e, 0x3d, 0x59, 0x4c, 0xe2, 0xde, 0x27, 0x13, 0x0d, 0x96, 0xb2,
+ 0xae, 0xfc, 0xba, 0xd3, 0xf4, 0x7a, 0x2d, 0xc9, 0xde, 0x91, 0x58, 0xcf,
+ 0xe8, 0xed, 0x78, 0x74, 0x62, 0x16, 0x83, 0xca, 0x6d, 0xa6, 0xc8, 0x74,
+ 0x24, 0x92, 0xbe, 0x58, 0xa7, 0x06, 0x58, 0x2d, 0x10, 0x44, 0xcd, 0x22,
+ 0xe3, 0xa9, 0xf9, 0x3a, 0x12, 0x2b, 0x9d, 0x0f, 0xa1, 0xce, 0xaf, 0xd5,
+ 0xf3, 0x66, 0x7b, 0xcc, 0x66, 0xec, 0x82, 0x8b, 0x92, 0x4f, 0x3f, 0x8c,
+ 0xf3, 0x4f, 0x7d, 0x2c, 0x05, 0xf3, 0x80, 0x01, 0xe7, 0x00, 0xf2, 0xf5,
+ 0xbd, 0xcd, 0x3b, 0x23, 0xb5, 0x8b, 0x4c, 0x68, 0xa2, 0x81, 0xaa, 0xc7,
+ 0xf6, 0x11, 0xf8, 0x0b, 0x55, 0xaf, 0x69, 0xf1, 0x18, 0x78, 0x63, 0x3d,
+ 0xcd, 0x58, 0x3e, 0xc5, 0x7e, 0x8f, 0xf2, 0xed, 0x5f, 0xf3, 0xe2, 0x9c,
+ 0x94, 0xb6, 0x64, 0x9c, 0x0c, 0x8d, 0xc7, 0xfa, 0xc9, 0x1f, 0x64, 0xdf,
+ 0x12, 0x2c, 0x60, 0xa6, 0x4d, 0x94, 0xa9, 0x01, 0x48, 0x40, 0xb4, 0xb9,
+ 0x43, 0x65, 0xcf, 0x6d, 0x25, 0x1f, 0xf0, 0xa1, 0x05, 0xc8, 0x58, 0x1d,
+ 0x93, 0xac, 0x16, 0x2e, 0x83, 0x04, 0x39, 0xd5, 0xd2, 0xb6, 0xdf, 0xa7,
+ 0x2b, 0x5b, 0x16, 0x2c, 0xed, 0x1c, 0x7b, 0x6d, 0x9f, 0x6b, 0xc7, 0xbf,
+ 0xf4, 0x00, 0xa1, 0x1b, 0x5d, 0x81, 0xbf, 0x27, 0xdc, 0xa5, 0x23, 0x76,
+ 0xbc, 0xe9, 0xd3, 0xf6, 0x7b, 0x9f, 0xb4, 0x6f, 0x5f, 0x39, 0x08, 0xec,
+ 0xfd, 0xf4, 0x7a, 0x63, 0x66, 0x79, 0x0f, 0x0d, 0xa2, 0x46, 0x7f, 0x94,
+ 0x58, 0x0d, 0xf3, 0x59, 0x95, 0x00, 0x9a, 0x01, 0xf9, 0x3f, 0x44, 0x64,
+ 0x04, 0xf0, 0xb1, 0xfe, 0x6f, 0x00, 0xa7, 0x26, 0x9a, 0x6b, 0x79, 0x01,
+ 0x82, 0x25, 0x1f, 0xc2, 0x21, 0x52, 0x13, 0x0f, 0x07, 0x15, 0xe9, 0x8c,
+ 0x79, 0xeb, 0xb0, 0x44, 0x68, 0x5c, 0x18, 0x3f, 0x47, 0xeb, 0x7e, 0x37,
+ 0xe2, 0x1b, 0x4e, 0xef, 0x75, 0x60, 0xfb, 0xa3, 0x6a, 0x50, 0xa6, 0xcf,
+ 0x2e, 0x44, 0x27, 0x45, 0x8c, 0xfe, 0x3a, 0xc6, 0x9f, 0xc4, 0x57, 0x80,
+ 0x31, 0xbb, 0x64, 0x08, 0x66, 0xc7, 0x35, 0xe5, 0xd2, 0x86, 0xd7, 0x4e,
+ 0xd8, 0x34, 0xd6, 0x2f, 0x1d, 0x1f, 0xe8, 0x1b, 0x79, 0xc0, 0xa0, 0x3c,
+ 0xb6, 0x5f, 0x9f, 0xd1, 0x42, 0xd2, 0x20, 0x36, 0xe1, 0x50, 0x10, 0x18,
+ 0xc1, 0xe9, 0xb0, 0xcc, 0x71, 0x14, 0x8a, 0x8e, 0x40, 0x37, 0xa5, 0x0b,
+ 0x6d, 0x6c, 0xfc, 0x98, 0x3c, 0xf6, 0x8f, 0x0f, 0xe8, 0x18, 0x3f, 0xaa,
+ 0x5b, 0xe6, 0x83, 0x84, 0xe0, 0x68, 0xa7, 0x4b, 0xb1, 0xbc, 0x3e, 0xa5,
+ 0xd5, 0x14, 0x6a, 0xdf, 0x63, 0x78, 0x15, 0x52, 0x5c, 0x1c, 0x74, 0xd4,
+ 0x90, 0xdd, 0x36, 0xe1, 0x4e, 0xa0, 0x42, 0x4b, 0x67, 0x67, 0x5d, 0xf4,
+ 0xb0, 0xb0, 0x4f, 0x9e, 0xf0, 0x6c, 0x68, 0xf8, 0x5a, 0x4a, 0xb1, 0xec,
+ 0x5c, 0x7b, 0x19, 0x8b, 0xbd, 0x39, 0x42, 0x74, 0x4f, 0xf5, 0x17, 0xfd,
+ 0xa4, 0xaa, 0xaf, 0xf8, 0x01, 0xdc, 0x40, 0xd2, 0x0f, 0x83, 0x0d, 0xe6,
+ 0x1e, 0xb8, 0xfd, 0xb7, 0x2c, 0xc9, 0x3a, 0x96, 0xe7, 0xee, 0xc5, 0x8e,
+ 0x8c, 0x89, 0x18, 0xb7, 0x32, 0x2a, 0x96, 0x9b, 0xc4, 0xc4, 0x93, 0xa1,
+ 0xbc, 0x2e, 0x17, 0x3f, 0x7f, 0xa3, 0xaf, 0x0e, 0xb5, 0x7f, 0xbc, 0x32,
+ 0x62, 0x50, 0x86, 0x02, 0x77, 0x25, 0x3f, 0x41, 0x82, 0x02, 0x07, 0xc9,
+ 0x43, 0xb2, 0xf4, 0x32, 0x65, 0xaa, 0x35, 0x36, 0x34, 0x90, 0xda, 0x1e,
+ 0x34, 0x16, 0x4f, 0xd0, 0x3e, 0x96, 0x76, 0x11, 0xd5, 0x64, 0xaf, 0x5a,
+ 0xaf, 0xbc, 0xa4, 0x2a, 0xd4, 0xf3, 0xba, 0x9d, 0x8b, 0x7d, 0x7e, 0xe5,
+ 0x2f, 0x59, 0xc5, 0x5a, 0x9a, 0x70, 0x00, 0xf5, 0xea, 0xec, 0x28, 0x55,
+ 0xd4, 0x4c, 0x25, 0x05, 0xa9, 0x65, 0x0e, 0x7e, 0x12, 0xc4, 0xb7, 0xa9,
+ 0xec, 0xf6, 0x7d, 0x92, 0x4e, 0x43, 0x67, 0x24, 0x8f, 0xe4, 0x1d, 0x5d,
+ 0x12, 0x6b, 0x76, 0xa4, 0x42, 0xba, 0x44, 0xfe, 0xa4, 0x8a, 0xf9, 0xf3,
+ 0x9c, 0xdc, 0x4b, 0x0c, 0x00, 0x41, 0x21, 0x19, 0xde, 0x7c, 0x56, 0xf1,
+ 0x6a, 0xa0, 0xed, 0xfe, 0xfb, 0x8e, 0x3f, 0x06, 0x85, 0x3f, 0x3e, 0x88,
+ 0xf0, 0x67, 0x6b, 0x17, 0xc7, 0xe1, 0x5f, 0x86, 0x03, 0x6e, 0x49, 0x46,
+ 0xbd, 0xec, 0xce, 0x0c, 0x1b, 0x05, 0x5c, 0x03, 0x85, 0xfd, 0xb5, 0xa1,
+ 0x1b, 0xfe, 0x19, 0x7b, 0xc3, 0x1f, 0xf3, 0xf0, 0xaf, 0xf8, 0xa8, 0xb2,
+ 0x15, 0x39, 0xdf, 0x89, 0x4a, 0x79, 0x00, 0x87, 0xa8, 0x6f, 0x2f, 0x05,
+ 0xd7, 0xa6, 0xd4, 0x4a, 0x9a, 0xf8, 0x28, 0x56, 0x36, 0x55, 0xd2, 0x41,
+ 0x54, 0xd9, 0x88, 0xf7, 0xe7, 0xdf, 0x7c, 0x4d, 0x37, 0xdc, 0x28, 0xe2,
+ 0x5a, 0x4a, 0x61, 0x5f, 0x66, 0x14, 0x53, 0x30, 0x5e, 0x90, 0x2d, 0xcc,
+ 0xa0, 0xe8, 0x63, 0xb6, 0x2b, 0x89, 0x97, 0x35, 0x93, 0xc2, 0xcd, 0xd9,
+ 0x0c, 0x7b, 0x95, 0x7f, 0x37, 0x45, 0x4f, 0x3b, 0x60, 0x48, 0x6f, 0x82,
+ 0x2d, 0x77, 0xeb, 0xfe, 0x7a, 0x2d, 0xc4, 0x42, 0x90, 0xc0, 0x62, 0x51,
+ 0x99, 0x5a, 0x7d, 0xff, 0x76, 0xbd, 0x60, 0x92, 0xb7, 0x59, 0xf8, 0xea,
+ 0x0c, 0x76, 0xf6, 0x67, 0x3c, 0x27, 0x39, 0x99, 0x8d, 0xf2, 0x4a, 0x30,
+ 0x39, 0x47, 0x04, 0x8b, 0x17, 0xe0, 0xfa, 0xfb, 0x20, 0xda, 0x9f, 0x36,
+ 0x61, 0x8c, 0xd7, 0x59, 0x08, 0xc4, 0x2f, 0xdb, 0x05, 0x1b, 0x25, 0x0c,
+ 0x6e, 0xaf, 0x78, 0x09, 0x7a, 0x64, 0x04, 0x98, 0x3e, 0x91, 0xa5, 0xcc,
+ 0x20, 0xcf, 0x47, 0xe1, 0x26, 0x8f, 0x9f, 0x10, 0x54, 0xc6, 0x71, 0x59,
+ 0x56, 0x5a, 0x07, 0xe0, 0xb2, 0x0a, 0x5e, 0xa0, 0x88, 0x34, 0x08, 0x31,
+ 0x0d, 0x37, 0x89, 0x70, 0x44, 0x92, 0x9f, 0xf3, 0x06, 0x1a, 0x15, 0x65,
+ 0x1c, 0xe2, 0x2d, 0xd3, 0xd9, 0x90, 0x3a, 0x28, 0x5d, 0x1d, 0x1f, 0x16,
+ 0x79, 0x91, 0xe1, 0xed, 0x97, 0x2b, 0x7c, 0x0d, 0xf8, 0xea, 0x1a, 0xf5,
+ 0x8d, 0xab, 0x4f, 0xdd, 0x09, 0x94, 0xea, 0xea, 0x8c, 0xa5, 0xa2, 0x77,
+ 0xd5, 0x15, 0xa7, 0x00, 0x68, 0xbc, 0x7d, 0x07, 0xdd, 0x17, 0x7e, 0x03,
+ 0xf9, 0x29, 0x5b, 0xaa, 0xa5, 0x5b, 0x91, 0x7f, 0xec, 0x3e, 0x75, 0xe7,
+ 0x4f, 0xd3, 0xdf, 0xa4, 0x69, 0x9f, 0xd0, 0x6d, 0x84, 0xdd, 0x32, 0x70,
+ 0x7c, 0xc4, 0x05, 0xa3, 0x74, 0xcd, 0x27, 0x3e, 0x6d, 0x07, 0x3a, 0x9f,
+ 0x96, 0xb4, 0x8a, 0xf9, 0xf1, 0x37, 0x30, 0x8d, 0x85, 0x0f, 0x35, 0x3b,
+ 0xc3, 0x22, 0xb4, 0xb9, 0x9f, 0x0a, 0x50, 0xa7, 0x2a, 0x27, 0xdc, 0xd8,
+ 0x67, 0xab, 0xa0, 0x16, 0xb2, 0xf2, 0xa6, 0x97, 0x49, 0xd9, 0x02, 0xd9,
+ 0x99, 0xae, 0x4c, 0x2e, 0x19, 0x59, 0xf2, 0x4c, 0x68, 0xc1, 0xf5, 0xc5,
+ 0x07, 0xa2, 0x09, 0xbb, 0xd4, 0x11, 0xa6, 0xbf, 0x90, 0xb0, 0xa0, 0xbd,
+ 0x41, 0x0e, 0x92, 0x97, 0x7b, 0x33, 0xfe, 0x9d, 0x1d, 0x14, 0x9f, 0xbe,
+ 0xfc, 0xb1, 0xf5, 0x3e, 0x95, 0x09, 0xda, 0x62, 0x76, 0x9a, 0x1c, 0x4b,
+ 0x55, 0x6f, 0xc5, 0x31, 0xb5, 0xb4, 0xcc, 0x85, 0x36, 0x62, 0x5f, 0xa7,
+ 0x4e, 0x57, 0x99, 0xd7, 0xb9, 0x2d, 0x3c, 0xc9, 0xbe, 0xd2, 0x6a, 0xd9,
+ 0xdb, 0xeb, 0xb4, 0x3c, 0xc0, 0xea, 0xee, 0x97, 0x43, 0xa4, 0x4e, 0xd8,
+ 0xce, 0xe3, 0xc0, 0xc3, 0xe2, 0x58, 0x1c, 0xc6, 0x7a, 0xde, 0xfc, 0x87,
+ 0xca, 0xc7, 0x13, 0x51, 0xce, 0x6b, 0x15, 0xcf, 0x1c, 0x6d, 0x3e, 0x36,
+ 0xb0, 0x0f, 0x0d, 0xdc, 0x4f, 0x51, 0xc6, 0x65, 0xbb, 0x28, 0x8e, 0xea,
+ 0x62, 0x8c, 0xf9, 0x79, 0x5e, 0x51, 0xd4, 0x6c, 0x77, 0xb2, 0x25, 0x9b,
+ 0xb8, 0xcc, 0xc3, 0x23, 0x04, 0x36, 0x81, 0xfd, 0xef, 0x80, 0xe4, 0x7e,
+ 0x92, 0xe6, 0xee, 0x1b, 0x3c, 0xcd, 0xf3, 0x68, 0xec, 0xca, 0x1e, 0x6d,
+ 0xb3, 0xd1, 0x40, 0x5a, 0xc8, 0xb6, 0x81, 0x60, 0x6a, 0x32, 0xa9, 0x11,
+ 0x93, 0xf7, 0xff, 0xa0, 0xab, 0x72, 0x26, 0x27, 0x11, 0xbf, 0x2c, 0xb4,
+ 0x88, 0x1c, 0x2b, 0x40, 0x4e, 0x9d, 0x88, 0x9b, 0x3b, 0x04, 0xdb, 0x3d,
+ 0x13, 0x9f, 0xbf, 0x10, 0x81, 0xa1, 0xe2, 0x0f, 0x1c, 0x22, 0xce, 0x64,
+ 0x2e, 0x53, 0xe0, 0xc7, 0x76, 0xd5, 0xf5, 0x52, 0x01, 0x78, 0x46, 0x94,
+ 0x50, 0x54, 0xc9, 0x68, 0xe6, 0x78, 0xa1, 0xd8, 0xff, 0xe6, 0xa0, 0x50,
+ 0xb6, 0x26, 0xce, 0x28, 0xb7, 0x02, 0xa5, 0x6d, 0x39, 0xd8, 0xac, 0xb7,
+ 0x1f, 0x55, 0xb6, 0xa4, 0x91, 0xdd, 0x67, 0x1e, 0x31, 0xd7, 0x2d, 0xcc,
+ 0xe3, 0x8f, 0x31, 0x9b, 0x39, 0xdc, 0x8e, 0xf3, 0xc7, 0xd4, 0x58, 0x42,
+ 0x93, 0x92, 0xd8, 0x3a, 0xce, 0x7b, 0xdc, 0x2c, 0xfb, 0x37, 0xf8, 0xff,
+ 0x7f, 0xc0, 0xa8, 0x6a, 0xc2, 0xc5, 0xd3, 0x7a, 0x76, 0x46, 0xd1, 0xa7,
+ 0x82, 0x0a, 0x27, 0xb0, 0xf7, 0xaf, 0xa5, 0x6b, 0xbe, 0xfa, 0x58, 0xd9,
+ 0x16, 0x1c, 0x8b, 0x3e, 0x7b, 0x7e, 0x9b, 0x61, 0x1c, 0x9f, 0x5d, 0xd1,
+ 0xd2, 0x44, 0x5f, 0x7b, 0x35, 0x42, 0x6b, 0xa5, 0x06, 0x26, 0x99, 0x83,
+ 0x58, 0xe6, 0x05, 0xd5, 0x28, 0x07, 0x5b, 0xad, 0xa0, 0xcf, 0xb3, 0xb0,
+ 0xa9, 0x75, 0x40, 0x3e, 0xe1, 0x39, 0xd1, 0x25, 0x21, 0x22, 0x8f, 0x5f,
+ 0x0e, 0x7a, 0xf0, 0xb5, 0x42, 0xeb, 0xf3, 0x4b, 0x3b, 0x89, 0xf8, 0x9e,
+ 0x5f, 0x60, 0x0f, 0xfd, 0xe3, 0x16, 0xc6, 0x45, 0x19, 0x72, 0xa1, 0x06,
+ 0xb0, 0xfc, 0x20, 0xa9, 0x59, 0xfd, 0x7b, 0x95, 0xd8, 0xfb, 0x0c, 0x3d,
+ 0xdc, 0xb7, 0xec, 0xbc, 0xf6, 0x95, 0x5f, 0x52, 0xb0, 0xcb, 0xe5, 0xe2,
+ 0x35, 0xb5, 0x5a, 0x5f, 0x6d, 0x92, 0x20, 0x6a, 0x2a, 0x18, 0x70, 0x9c,
+ 0xf0, 0xdf, 0x64, 0xb4, 0x83, 0x39, 0xe1, 0xcf, 0x22, 0xa2, 0x88, 0x9e,
+ 0x64, 0xc3, 0x6a, 0x32, 0xbc, 0x0b, 0x7b, 0xbc, 0xb8, 0x0b, 0xe0, 0xce,
+ 0x0e, 0x2a, 0xdc, 0xac, 0xff, 0x88, 0x24, 0x1d, 0x5b, 0xff, 0xb6, 0xc0,
+ 0xec, 0x0e, 0x40, 0x38, 0xf7, 0x01, 0x59, 0x66, 0x42, 0xba, 0xb0, 0xec,
+ 0xe2, 0x35, 0x61, 0xf0, 0x1e, 0x11, 0x24, 0x29, 0x59, 0x48, 0x1f, 0x69,
+ 0x0d, 0x50, 0x92, 0x8b, 0x68, 0x21, 0x19, 0x5e, 0xf7, 0xa6, 0x3e, 0x96,
+ 0x71, 0x26, 0xe8, 0x8c, 0x8e, 0x59, 0x48, 0x45, 0x66, 0xea, 0x8e, 0x7a,
+ 0x1b, 0xee, 0x55, 0x5a, 0x03, 0x8f, 0x14, 0x5c, 0x68, 0x15, 0x9b, 0x89,
+ 0xde, 0xb5, 0x38, 0xac, 0xbb, 0x86, 0x48, 0x32, 0x36, 0x20, 0x5a, 0x2b,
+ 0x2d, 0x4d, 0xbf, 0xa6, 0x4e, 0xf7, 0x35, 0x38, 0x21, 0x11, 0x8a, 0x5b,
+ 0x09, 0x14, 0x8e, 0xcc, 0x28, 0x00, 0x24, 0xcd, 0xb3, 0xb7, 0xec, 0x54,
+ 0x61, 0x85, 0x21, 0x94, 0xf7, 0xfd, 0x45, 0xa3, 0xde, 0x4b, 0x99, 0xc0,
+ 0x9a, 0x87, 0x79, 0x04, 0xc8, 0xd4, 0xd2, 0xf5, 0xf5, 0xeb, 0x00, 0x1b,
+ 0xa8, 0x25, 0xaf, 0x06, 0x49, 0xb0, 0x6e, 0xe5, 0xca, 0x51, 0x27, 0x55,
+ 0xd4, 0xa8, 0x74, 0x33, 0xa0, 0x4e, 0x89, 0xa4, 0xfd, 0x54, 0xf8, 0xa9,
+ 0x66, 0x95, 0x55, 0x5d, 0xec, 0x26, 0x17, 0xff, 0x7e, 0x1f, 0xb5, 0x3f,
+ 0xf8, 0xd0, 0x0b, 0x22, 0x05, 0x52, 0x02, 0x27, 0x79, 0x77, 0x75, 0xad,
+ 0xa1, 0xf7, 0x0f, 0x99, 0xcf, 0x70, 0xea, 0xc7, 0xcf, 0x0d, 0xd3, 0xd0,
+ 0x66, 0x01, 0x1c, 0xb7, 0xcc, 0x67, 0x3a, 0x9d, 0xd6, 0x3f, 0xa1, 0xb9,
+ 0xf4, 0xa9, 0x61, 0x1a, 0xe9, 0xeb, 0x42, 0xd2, 0xdb, 0x62, 0xd2, 0x9d,
+ 0xb7, 0xae, 0x06, 0x16, 0x1e, 0xd0, 0xdf, 0xe9, 0x17, 0xeb, 0xa9, 0xb0,
+ 0xdb, 0xe8, 0xf3, 0xd2, 0xa2, 0x64, 0x71, 0xe8, 0x7b, 0x7d, 0xd4, 0x3f,
+ 0x5e, 0x73, 0xb7, 0x6c, 0x86, 0x30, 0xdf, 0x30, 0x5b, 0x0f, 0x70, 0xb0,
+ 0xe0, 0xee, 0x29, 0x83, 0x15, 0x4e, 0x04, 0xac, 0xcb, 0x34, 0xe7, 0x21,
+ 0xeb, 0xcd, 0xa2, 0x08, 0xb6, 0x36, 0x87, 0x92, 0xa9, 0xb5, 0xc0, 0xb9,
+ 0xe6, 0x4a, 0x9f, 0xf0, 0xf2, 0xe1, 0x36, 0xe9, 0x22, 0x27, 0x46, 0xd8,
+ 0xf3, 0x81, 0xf4, 0xee, 0x08, 0x88, 0xc5, 0x5f, 0x17, 0xae, 0x8e, 0xac,
+ 0x12, 0x23, 0xa9, 0x92, 0x9c, 0xc1, 0x7e, 0xfa, 0x9f, 0x73, 0x60, 0x89,
+ 0xc7, 0xe5, 0x4d, 0x4c, 0xd3, 0xa9, 0x44, 0x48, 0xea, 0xcc, 0xc7, 0xaf,
+ 0xe2, 0x6a, 0x94, 0x6a, 0x78, 0x9e, 0x36, 0x49, 0x13, 0x0d, 0xb1, 0x53,
+ 0xee, 0x2a, 0xb5, 0xd3, 0x46, 0x71, 0xd8, 0xee, 0xdf, 0xac, 0x54, 0xe1,
+ 0x50, 0xca, 0xfd, 0xd2, 0xf1, 0x1c, 0xc6, 0x13, 0x96, 0x59, 0xf8, 0x36,
+ 0x05, 0x98, 0x6c, 0xe7, 0x3b, 0x11, 0x1d, 0xb0, 0x2c, 0xa8, 0xce, 0x3f,
+ 0xa5, 0xd4, 0xd6, 0xe5, 0xb3, 0x9a, 0xb7, 0x47, 0xd1, 0xab, 0x01, 0xc6,
+ 0xcd, 0x00, 0x95, 0x3e, 0xd2, 0x5d, 0x61, 0x63, 0xea, 0xe8, 0xec, 0x81,
+ 0x51, 0xc1, 0xe8, 0xc1, 0x0a, 0x13, 0x53, 0x7c, 0x1d, 0x86, 0x38, 0xd9,
+ 0xca, 0xb9, 0x0e, 0xbc, 0xf9, 0xcc, 0xac, 0x00, 0xe6, 0x10, 0x51, 0x54,
+ 0x69, 0x44, 0x80, 0x44, 0xd1, 0x2c, 0x3a, 0x6d, 0xaa, 0xee, 0x86, 0x71,
+ 0x12, 0xa3, 0x5c, 0x3b, 0x19, 0x71, 0x01, 0xdf, 0x62, 0x7d, 0x13, 0xdd,
+ 0x10, 0x72, 0x97, 0x8b, 0xc1, 0x3b, 0x4a, 0x1a, 0x3a, 0xdb, 0x6b, 0x0d,
+ 0x9b, 0x90, 0x70, 0x61, 0xa4, 0x5d, 0xac, 0x96, 0xdc, 0xb8, 0x00, 0x78,
+ 0x0f, 0x10, 0x40, 0xbd, 0xa8, 0xc3, 0x0d, 0x75, 0x5c, 0xcd, 0x42, 0x5f,
+ 0x09, 0xcf, 0x3e, 0x77, 0xcf, 0x72, 0x64, 0x18, 0x5a, 0x77, 0xe4, 0x35,
+ 0x76, 0x30, 0xd4, 0x90, 0xf6, 0x3b, 0xbc, 0x7e, 0x0c, 0x35, 0xfc, 0x82,
+ 0x9e, 0x1f, 0x3d, 0xdf, 0x9c, 0x8a, 0x91, 0xdf, 0xd8, 0xc2, 0x4b, 0xd4,
+ 0x3b, 0x31, 0xe6, 0xac, 0x36, 0x12, 0xa3, 0xa7, 0x13, 0x51, 0x44, 0x96,
+ 0x4f, 0xd3, 0x17, 0x5a, 0x8d, 0xcb, 0x21, 0x0e, 0xab, 0xa7, 0xb8, 0xca,
+ 0x07, 0xe7, 0x05, 0x4a, 0x99, 0x53, 0xcc, 0x46, 0x6c, 0x9f, 0x6a, 0xc1,
+ 0xe4, 0x6e, 0x90, 0x02, 0xbf, 0x83, 0x1c, 0xfd, 0xfc, 0x2d, 0xa4, 0xc1,
+ 0x6b, 0x7d, 0x0b, 0x20, 0xc2, 0xe3, 0x6b, 0xfe, 0x86, 0x60, 0xe7, 0x78,
+ 0x59, 0x60, 0x5e, 0x90, 0x4f, 0x91, 0xa1, 0xf2, 0x90, 0x9b, 0x5a, 0x2b,
+ 0x81, 0x7f, 0x0a, 0x94, 0x3c, 0xaf, 0x0e, 0x23, 0x12, 0x76, 0xcd, 0x62,
+ 0x47, 0xd3, 0xd2, 0x99, 0x52, 0x53, 0xc2, 0xd3, 0x60, 0xc1, 0x71, 0x15,
+ 0xb1, 0x2f, 0xdf, 0x6e, 0x0f, 0x6e, 0x4c, 0x31, 0x29, 0x78, 0x2c, 0xea,
+ 0xfb, 0xa7, 0x5f, 0x31, 0x68, 0xd4, 0x3d, 0x38, 0x87, 0xe0, 0x75, 0xd9,
+ 0xa8, 0x95, 0xde, 0xb2, 0x42, 0xfa, 0x20, 0x17, 0xc9, 0x7e, 0xba, 0x2a,
+ 0xd6, 0x34, 0x83, 0xeb, 0xd5, 0xa7, 0x78, 0xa1, 0x6d, 0xd4, 0x21, 0x29,
+ 0xa3, 0x71, 0xfe, 0xa7, 0x75, 0x48, 0xcd, 0xd3, 0xd5, 0x89, 0xb4, 0xab,
+ 0x23, 0xb2, 0x01, 0x37, 0xf8, 0xe2, 0xe2, 0xc5, 0xae, 0x90, 0x66, 0xa9,
+ 0xc5, 0xad, 0xf5, 0x34, 0xdf, 0x79, 0x05, 0x87, 0x74, 0xb7, 0x1c, 0x77,
+ 0x8d, 0xa7, 0x11, 0x59, 0x71, 0x8b, 0x2a, 0x50, 0xa7, 0xc9, 0xe4, 0xf1,
+ 0x6d, 0x98, 0xe2, 0x4f, 0x45, 0xa8, 0xea, 0xe7, 0x5b, 0x9f, 0xd0, 0xf4,
+ 0x45, 0x4c, 0xf8, 0x8c, 0x1e, 0x58, 0x13, 0x7b, 0xc8, 0xe2, 0xfe, 0xae,
+ 0x13, 0x87, 0x33, 0xff, 0x08, 0xe0, 0xcf, 0xb8, 0x8a, 0x51, 0xff, 0xbb,
+ 0x9e, 0xbb, 0x38, 0x45, 0x09, 0xf1, 0x88, 0x8c, 0x02, 0xd3, 0x17, 0x99,
+ 0x52, 0x37, 0xfe, 0x27, 0x81, 0xc6, 0x47, 0x74, 0x40, 0xf4, 0x87, 0x1f,
+ 0xd5, 0x73, 0x00, 0x91, 0x9e, 0x23, 0xda, 0xec, 0x9a, 0xe1, 0x3d, 0x7b,
+ 0xd6, 0x0b, 0x28, 0xde, 0x8d, 0xe3, 0x2f, 0xb8, 0xfd, 0x9a, 0xba, 0x0e,
+ 0xc7, 0xe9, 0x0d, 0x5d, 0x2b, 0x19, 0x77, 0xe8, 0xd5, 0x07, 0xa0, 0x1a,
+ 0x91, 0xb7, 0xb0, 0x6f, 0xfa, 0x96, 0x3a, 0x3b, 0xab, 0x1f, 0xfc, 0x25,
+ 0xa8, 0x85, 0x41, 0x81, 0x42, 0x5a, 0x8f, 0x5b, 0xe9, 0x69, 0xd5, 0xe9,
+ 0x12, 0xdc, 0xa0, 0xf5, 0xaf, 0xeb, 0x0f, 0x1c, 0x40, 0x9d, 0x16, 0x83,
+ 0xb8, 0xec, 0x2b, 0xcf, 0x5e, 0x8d, 0x06, 0x14, 0xa1, 0xd7, 0xac, 0xfb,
+ 0x35, 0x52, 0xfc, 0xeb, 0xea, 0x99, 0xd5, 0xa7, 0xda, 0x7c, 0x07, 0x32,
+ 0x02, 0xd9, 0x66, 0x07, 0x0d, 0x08, 0x28, 0x23, 0x12, 0x8f, 0xea, 0x1f,
+ 0x49, 0xce, 0x5f, 0x4c, 0x05, 0xfa, 0x89, 0x0b, 0x56, 0x04, 0x26, 0x54,
+ 0x51, 0xdb, 0x77, 0x34, 0x30, 0xd9, 0x82, 0x56, 0xf3, 0xf8, 0x74, 0x5c,
+ 0x7a, 0x95, 0x7f, 0xe5, 0xad, 0xff, 0xc9, 0x1d, 0x8e, 0x44, 0x02, 0x18,
+ 0x96, 0x72, 0x34, 0x81, 0xe4, 0x21, 0x44, 0x8a, 0x3d, 0x4d, 0x88, 0xa2,
+ 0x29, 0x42, 0x85, 0xa5, 0x92, 0x6b, 0x6c, 0x35, 0x15, 0xed, 0x0f, 0xc4,
+ 0x6d, 0x73, 0x5e, 0x03, 0x66, 0xb8, 0x55, 0xff, 0x63, 0x26, 0xa9, 0x1a,
+ 0x55, 0xe4, 0x97, 0x2d, 0xfd, 0xff, 0x2d, 0x72, 0xf2, 0x17, 0xe8, 0xee,
+ 0x24, 0x70, 0x4b, 0x9b, 0xfc, 0xa5, 0x4e, 0x93, 0xf5, 0x55, 0x4a, 0x28,
+ 0x07, 0xda, 0xc8, 0x0f, 0x27, 0x60, 0x76, 0x8f, 0x77, 0x7e, 0xb3, 0x00,
+ 0xb5, 0x58, 0x6c, 0x39, 0xe7, 0xad, 0x0c, 0xa2, 0xc9, 0x1a, 0x7a, 0x9d,
+ 0x48, 0xe3, 0x69, 0x39, 0xc4, 0xb1, 0x5c, 0x94, 0x09, 0x4e, 0xb7, 0x1a,
+ 0x09, 0x3c, 0x92, 0x1e, 0xa1, 0xc2, 0x5a, 0x95, 0xf2, 0x47, 0x6e, 0x70,
+ 0x2f, 0x01, 0x77, 0x73, 0x6b, 0x6b, 0xae, 0xf1, 0x37, 0x7e, 0x66, 0x55,
+ 0x1b, 0x5e, 0x42, 0x0c, 0xcc, 0xc0, 0x65, 0xb6, 0x1c, 0x6a, 0xe9, 0x8e,
+ 0xe0, 0x2f, 0x44, 0x9c, 0x68, 0x32, 0xd3, 0x95, 0x85, 0xc8, 0xf7, 0x3f,
+ 0xca, 0x49, 0x9f, 0x68, 0x05, 0xd9, 0x91, 0x24, 0xc0, 0x48, 0x64, 0x77,
+ 0x8e, 0x69, 0x6a, 0x00, 0x7c, 0xa3, 0xf5, 0x9f, 0xd0, 0xb3, 0xc3, 0x8e,
+ 0xc7, 0x32, 0x1a, 0x65, 0x72, 0x33, 0x68, 0xb2, 0x78, 0x2d, 0x7c, 0xe1,
+ 0x27, 0x57, 0x41, 0x7a, 0x08, 0x33, 0xff, 0xfc, 0xff, 0xff, 0x4f, 0x37,
+ 0x7b, 0x11, 0xaf, 0x91, 0x87, 0xfa, 0x10, 0x45, 0x62, 0xd4, 0xbf, 0xd7,
+ 0x33, 0x5f, 0x79, 0x44, 0xfb, 0xbc, 0xa7, 0xde, 0xee, 0xbb, 0xeb, 0x4f,
+ 0x70, 0x5c, 0x3a, 0x01, 0xe1, 0x0e, 0x2f, 0xad, 0x86, 0x65, 0x2b, 0xcc,
+ 0x6c, 0x5b, 0x31, 0x1b, 0x0b, 0x78, 0x90, 0x4a, 0x20, 0x1c, 0xe1, 0x21,
+ 0x05, 0x98, 0xb4, 0x1e, 0x10, 0x2c, 0x46, 0x2f, 0x1e, 0xed, 0x78, 0x59,
+ 0x9e, 0xec, 0x90, 0x3e, 0xd0, 0xde, 0x05, 0xda, 0x5c, 0x38, 0xb4, 0x1c,
+ 0x72, 0x84, 0x40, 0x3e, 0x90, 0xb6, 0x4d, 0x52, 0x01, 0x47, 0x11, 0xf5,
+ 0x2a, 0xec, 0x95, 0x77, 0xf2, 0x54, 0x1f, 0x95, 0x3a, 0xef, 0x23, 0xa2,
+ 0x0d, 0xd4, 0x35, 0xbe, 0x65, 0xa8, 0xe6, 0xac, 0x94, 0x6f, 0x90, 0xf6,
+ 0xb7, 0xa3, 0x6d, 0x0e, 0x17, 0x92, 0x78, 0x4f, 0x1a, 0x3b, 0x81, 0x59,
+ 0xb5, 0x36, 0xaf, 0xcd, 0xa0, 0xf1, 0x32, 0xc3, 0x13, 0x74, 0x5d, 0xeb,
+ 0xb0, 0xcf, 0x00, 0x2f, 0xa6, 0x84, 0xef, 0x4e, 0x0f, 0xcb, 0x74, 0xda,
+ 0x32, 0x99, 0x32, 0x92, 0x54, 0x48, 0xb3, 0x95, 0x56, 0xc2, 0x76, 0x3f,
+ 0x00, 0x9d, 0x7b, 0xc6, 0x3a, 0xd9, 0xf7, 0x5c, 0xbf, 0x92, 0x14, 0xa4,
+ 0x44, 0x74, 0xe0, 0x49, 0x56, 0x75, 0xc9, 0x2d, 0x4d, 0x63, 0x3c, 0xab,
+ 0x96, 0xa7, 0x61, 0xdc, 0x0f, 0x7b, 0x07, 0x36, 0xe7, 0xfc, 0x0a, 0xfb,
+ 0x61, 0x4a, 0xae, 0x7c, 0x68, 0x3c, 0xa0, 0x86, 0xab, 0xe8, 0x38, 0x8b,
+ 0x6f, 0xfd, 0xf0, 0x1c, 0x7b, 0x17, 0x88, 0x68, 0x64, 0xf7, 0xae, 0x11,
+ 0x12, 0xb0, 0x6e, 0x65, 0x7d, 0x9f, 0x3f, 0xcd, 0x4e, 0x2b, 0x9b, 0x03,
+ 0x7a, 0xf9, 0x53, 0x8f, 0xff, 0x77, 0x37, 0xdb, 0xeb, 0x80, 0x56, 0xbe,
+ 0xce, 0xb3, 0xc4, 0x2f, 0x2e, 0x22, 0x0a, 0x7e, 0xbc, 0xf5, 0xb5, 0xe6,
+ 0x29, 0xe7, 0xec, 0x01, 0x83, 0x76, 0x8a, 0x73, 0x5f, 0xab, 0x90, 0xba,
+ 0x68, 0xc3, 0x83, 0x24, 0x96, 0x3f, 0x30, 0x38, 0x54, 0xae, 0x87, 0xdd,
+ 0xe7, 0xaf, 0xa6, 0xa0, 0x7e, 0xcd, 0x2e, 0x72, 0x05, 0x86, 0x13, 0x9f,
+ 0xf0, 0x87, 0x21, 0x60, 0xd9, 0x56, 0x23, 0x32, 0xa3, 0xce, 0x02, 0xd6,
+ 0xad, 0xc2, 0xbc, 0x0e, 0x28, 0xd5, 0x1e, 0x74, 0xe9, 0xc2, 0xe1, 0x67,
+ 0x3b, 0xf0, 0xf6, 0x99, 0xc5, 0x33, 0x81, 0xca, 0xcb, 0x36, 0xf5, 0x32,
+ 0xa8, 0x7a, 0xe8, 0xc3, 0x4b, 0x41, 0x1b, 0x48, 0x33, 0x1e, 0xd0, 0xc4,
+ 0x41, 0x58, 0x73, 0x43, 0x03, 0xef, 0x2e, 0xeb, 0x58, 0x07, 0x9f, 0xe2,
+ 0x4f, 0x31, 0xcb, 0x02, 0x69, 0x7d, 0x3e, 0xef, 0x80, 0x5c, 0x97, 0x26,
+ 0xf3, 0x93, 0x97, 0x2a, 0x20, 0x81, 0x84, 0x67, 0x92, 0x29, 0x71, 0xff,
+ 0xcb, 0x79, 0x96, 0x34, 0x11, 0xf5, 0xcb, 0x56, 0x0e, 0x13, 0xae, 0x26,
+ 0xc5, 0x40, 0x70, 0xc0, 0xa5, 0x74, 0x8f, 0x5c, 0x16, 0x43, 0xc6, 0x36,
+ 0x81, 0x8d, 0x95, 0xb9, 0xc9, 0x52, 0x2c, 0x19, 0x02, 0xfc, 0x4d, 0x24,
+ 0x05, 0xef, 0xd4, 0xfe, 0x9a, 0xd5, 0xbf, 0x5b, 0x68, 0x6c, 0x0a, 0x52,
+ 0x41, 0xa5, 0xb9, 0x0d, 0x88, 0xd4, 0xa7, 0x84, 0xe9, 0x8b, 0x75, 0xbd,
+ 0x85, 0x36, 0x2b, 0x2b, 0x37, 0xd4, 0x6b, 0x46, 0xaa, 0xd8, 0xcb, 0x8e,
+ 0x30, 0xa6, 0x21, 0x0d, 0x42, 0x7e, 0xb1, 0x7f, 0x33, 0x89, 0x88, 0xcb,
+ 0xe2, 0x89, 0x35, 0xf4, 0x82, 0xc5, 0xe0, 0x58, 0x6d, 0x01, 0x93, 0x82,
+ 0xc6, 0x15, 0xda, 0xa3, 0x5b, 0xae, 0xdd, 0x03, 0xd9, 0xad, 0xb6, 0x81,
+ 0xa2, 0x7a, 0x3b, 0xa2, 0xc5, 0xbb, 0xbf, 0xa6, 0x61, 0x24, 0xc7, 0xf5,
+ 0x8b, 0xdf, 0xcc, 0xa8, 0xfd, 0x35, 0xfa, 0xae, 0x28, 0x99, 0x55, 0x52,
+ 0xf4, 0x40, 0x9b, 0x71, 0xd8, 0xbb, 0xd8, 0xdc, 0x7e, 0xdd, 0xad, 0xee,
+ 0xc9, 0xa1, 0x9b, 0xc9, 0x9a, 0xf0, 0x96, 0x34, 0xc2, 0xde, 0x5d, 0x0d,
+ 0x1d, 0xcd, 0x20, 0x86, 0x99, 0x34, 0x80, 0x90, 0x78, 0x99, 0x4b, 0x60,
+ 0x00, 0x26, 0x4e, 0x2d, 0x43, 0xc1, 0x17, 0x90, 0x8c, 0x72, 0x3f, 0xd0,
+ 0x4a, 0xec, 0x08, 0x1b, 0xe8, 0xa0, 0xa5, 0xb4, 0x54, 0x80, 0x36, 0x97,
+ 0x3c, 0xb0, 0x75, 0x2c, 0x9c, 0x5f, 0xf7, 0xde, 0xdd, 0x62, 0xfa, 0xe7,
+ 0xd3, 0xef, 0x84, 0x0b, 0x56, 0x32, 0xc9, 0xfb, 0x08, 0x8b, 0x71, 0xe2,
+ 0x5a, 0x0b, 0x24, 0xd9, 0x75, 0xcd, 0x1e, 0x0d, 0x9e, 0xf7, 0xf4, 0x5e,
+ 0x28, 0x60, 0xa5, 0xd8, 0x2e, 0x7c, 0x73, 0x90, 0xb5, 0xae, 0xc0, 0xd5,
+ 0xb0, 0x9c, 0xfb, 0xdb, 0x35, 0x2e, 0x36, 0x17, 0xe7, 0x85, 0x2e, 0xe2,
+ 0xab, 0x01, 0x14, 0xf6, 0x69, 0x12, 0x9a, 0x88, 0x6f, 0x19, 0xa9, 0x42,
+ 0x85, 0x5c, 0x5c, 0x85, 0x5e, 0xce, 0xcd, 0x29, 0x02, 0x78, 0x2d, 0x0a,
+ 0x0d, 0x1c, 0xf8, 0x61, 0x38, 0xd7, 0x51, 0x1a, 0x8f, 0xdd, 0xe0, 0xf5,
+ 0x74, 0xf3, 0xd8, 0xb6, 0x60, 0x6b, 0x22, 0x9f, 0xe8, 0xd3, 0x40, 0xc4,
+ 0xc6, 0x14, 0x6d, 0x23, 0xa2, 0x3b, 0xcb, 0x80, 0xa8, 0x5c, 0xf5, 0x3a,
+ 0x0c, 0x15, 0xa0, 0xc8, 0x28, 0xa8, 0xb0, 0x04, 0xef, 0xbf, 0x99, 0x51,
+ 0x7f, 0x02, 0x41, 0x08, 0xe8, 0x3c, 0x44, 0x7c, 0xd1, 0xd5, 0xa2, 0x38,
+ 0x61, 0x0a, 0xc3, 0xfd, 0x7e, 0xe3, 0x0a, 0xef, 0x5e, 0x81, 0x8f, 0xbb,
+ 0xb3, 0xd9, 0x65, 0xda, 0x3b, 0x45, 0x23, 0xdf, 0x5c, 0xdb, 0x05, 0x11,
+ 0x71, 0xfa, 0x4c, 0x4a, 0xf3, 0x56, 0xb6, 0x10, 0xfd, 0x27, 0x14, 0xdc,
+ 0x80, 0xb5, 0xd7, 0x6a, 0xe5, 0x66, 0x4e, 0xf0, 0xaa, 0x60, 0x72, 0x90,
+ 0x4c, 0x0e, 0x35, 0xb8, 0x1b, 0x86, 0xda, 0x3a, 0xe8, 0x00, 0x00, 0x09,
+ 0x05, 0x4f, 0x2f, 0x48, 0x3d, 0x16, 0x30, 0x9d, 0xc7, 0xff, 0x3c, 0xa7,
+ 0xff, 0xed, 0x38, 0x23, 0x17, 0x66, 0xc9, 0xea, 0xa8, 0xe6, 0xbe, 0xcc,
+ 0xf7, 0xfb, 0xdc, 0x91, 0xd1, 0x0e, 0xd3, 0x1b, 0x6b, 0x86, 0xd6, 0x69,
+ 0xa3, 0x23, 0x73, 0x4c, 0xf9, 0x72, 0x5b, 0x6b, 0x1f, 0x59, 0x64, 0x9e,
+ 0xde, 0x7f, 0x62, 0x0a, 0x58, 0x97, 0x73, 0x4b, 0x9c, 0xdf, 0x28, 0x14,
+ 0x61, 0x01, 0xdd, 0x14, 0xc6, 0xad, 0x7f, 0x46, 0x6e, 0x4e, 0xe2, 0xd1,
+ 0x79, 0xe7, 0x75, 0x7d, 0xc8, 0x89, 0x66, 0xd4, 0x37, 0x29, 0x9e, 0x9e,
+ 0x89, 0x19, 0xc9, 0xa1, 0x21, 0x8a, 0xaf, 0x3d, 0x0d, 0x7c, 0xdc, 0xe2,
+ 0x73, 0xcc, 0x8d, 0x01, 0x9b, 0xab, 0xd9, 0x9b, 0xd0, 0xf0, 0x09, 0x22,
+ 0xb9, 0xac, 0x82, 0x6b, 0x80, 0xb7, 0x69, 0xb2, 0xee, 0xa3, 0xe2, 0xc1,
+ 0x8d, 0x35, 0xeb, 0x03, 0x3d, 0x1c, 0xaa, 0xd7, 0x4b, 0xd1, 0x08, 0xfd,
+ 0xab, 0x84, 0x2e, 0xc4, 0xdd, 0xbd, 0xfd, 0x54, 0x04, 0xb5, 0x2d, 0xc8,
+ 0xea, 0xd3, 0xcd, 0x54, 0x04, 0x2c, 0xad, 0x42, 0x7d, 0xa4, 0x17, 0xcd,
+ 0xcf, 0x1f, 0x8e, 0xe0, 0x7b, 0x4e, 0x6e, 0xfa, 0x2d, 0xa8, 0xca, 0x03,
+ 0x01, 0xe2, 0xde, 0x32, 0xcf, 0xd6, 0x24, 0x91, 0x54, 0xc8, 0x4a, 0x6f,
+ 0x5a, 0x7f, 0x51, 0xa9, 0x87, 0x8a, 0x2b, 0x87, 0x87, 0x2b, 0xcf, 0x84,
+ 0x69, 0xa7, 0x1f, 0x91, 0x4b, 0x41, 0x2a, 0xa3, 0x9c, 0xef, 0x55, 0x31,
+ 0x3c, 0xe4, 0x84, 0x74, 0x76, 0x2b, 0x60, 0xb5, 0x2b, 0x68, 0xa5, 0x5a,
+ 0x6b, 0x58, 0xb9, 0x77, 0xf4, 0x0a, 0x8e, 0x25, 0x8b, 0x98, 0x2b, 0xa2,
+ 0x94, 0x6c, 0x8e, 0xa5, 0xee, 0x91, 0x1a, 0x22, 0x11, 0x51, 0xd4, 0xa4,
+ 0xaa, 0x0c, 0x0e, 0x9c, 0x43, 0x13, 0x17, 0xce, 0xb6, 0xca, 0xe4, 0x87,
+ 0xfa, 0x9d, 0x1a, 0xaf, 0xe3, 0xa3, 0x99, 0x7d, 0xa1, 0xb8, 0x00, 0x9d,
+ 0x5d, 0xd6, 0x0b, 0x3d, 0xb3, 0x86, 0x75, 0x1b, 0xd6, 0xb0, 0x2b, 0x21,
+ 0x16, 0x85, 0x34, 0x35, 0xa5, 0x7e, 0xa7, 0x5a, 0x3c, 0xba, 0x82, 0x78,
+ 0xdf, 0x95, 0x76, 0x57, 0x30, 0x3b, 0x2d, 0x17, 0x04, 0x25, 0x90, 0x3c,
+ 0x6e, 0xbc, 0xc1, 0x97, 0x17, 0xb6, 0xf4, 0xc0, 0x9f, 0xc0, 0xa3, 0xd0,
+ 0xea, 0x8a, 0x1c, 0x96, 0x55, 0xe2, 0x68, 0x49, 0xd9, 0x52, 0xa8, 0xa0,
+ 0x45, 0x86, 0x00, 0xc1, 0x0b, 0x82, 0x5a, 0x69, 0xfb, 0x0c, 0xc6, 0x13,
+ 0xad, 0x19, 0x1b, 0xc9, 0xc1, 0x80, 0x51, 0x72, 0x04, 0xa8, 0x7e, 0x0c,
+ 0x66, 0x2b, 0x07, 0xe1, 0xfa, 0x02, 0x95, 0xf9, 0x9e, 0xe9, 0x1a, 0xff,
+ 0x2f, 0xf7, 0x27, 0x01, 0x12, 0x27, 0x37, 0x65, 0x13, 0x99, 0x3a, 0xe9,
+ 0xa5, 0x53, 0xbe, 0xf3, 0x93, 0x02, 0x73, 0x24, 0x19, 0x9c, 0x4a, 0x5a,
+ 0x1d, 0x0d, 0x02, 0xbb, 0x53, 0x4c, 0x0d, 0x24, 0xa5, 0x7c, 0x50, 0x0e,
+ 0x1e, 0x7f, 0x25, 0xf6, 0xca, 0x96, 0x59, 0x2a, 0x24, 0x1a, 0x67, 0x4a,
+ 0x8b, 0x7f, 0xdd, 0x90, 0x36, 0x7f, 0xf0, 0x05, 0xae, 0x4e, 0xc9, 0xa9,
+ 0x6f, 0x1f, 0x8d, 0xfd, 0x1c, 0x70, 0xe1, 0xe5, 0xc7, 0xe7, 0x18, 0x27,
+ 0x58, 0xb6, 0xf7, 0x09, 0x31, 0x67, 0x94, 0x98, 0xc4, 0x89, 0x8d, 0xf2,
+ 0x95, 0xff, 0x55, 0xb6, 0xcc, 0x3c, 0x0e, 0xa7, 0xf9, 0x77, 0x7a, 0xfc,
+ 0x33, 0xfb, 0xa7, 0x07, 0x6f, 0x5d, 0x2e, 0x5f, 0x72, 0xba, 0xc6, 0x2f,
+ 0xd3, 0x34, 0x0e, 0x87, 0x51, 0x8d, 0x5b, 0xd7, 0x61, 0x85, 0x18, 0x2f,
+ 0xff, 0xd3, 0x92, 0xdb, 0x1c, 0xbd, 0x46, 0xaa, 0x9c, 0xae, 0x7b, 0xc0,
+ 0x45, 0xa0, 0x0d, 0xbd, 0x3c, 0xf4, 0x78, 0xd4, 0xd2, 0x47, 0x1f, 0x21,
+ 0x91, 0xcf, 0x5d, 0xf9, 0xca, 0x02, 0xe2, 0x6c, 0xe5, 0xdb, 0x9a, 0x7e,
+ 0x2d, 0x21, 0x17, 0x23, 0x90, 0x71, 0x0b, 0x7f, 0x87, 0xf1, 0x6c, 0xbc,
+ 0x2d, 0x31, 0x18, 0xa0, 0x2a, 0xd6, 0x44, 0xf4, 0xd4, 0xd5, 0x3b, 0x25,
+ 0x85, 0x90, 0xc6, 0x6d, 0xd3, 0x7e, 0xac, 0x6e, 0x0a, 0x49, 0xa5, 0xb2,
+ 0xd3, 0x8a, 0x25, 0x79, 0x08, 0xda, 0x2e, 0x2d, 0x1d, 0xbc, 0x8f, 0xc4,
+ 0x15, 0x1e, 0x15, 0xa4, 0xf6, 0xc5, 0x8b, 0xb9, 0x0e, 0x9b, 0x04, 0x77,
+ 0x3a, 0x20, 0xdc, 0xcc, 0x6b, 0x0d, 0x30, 0xc2, 0x43, 0x87, 0xae, 0xad,
+ 0x36, 0xd6, 0x84, 0x4f, 0xf3, 0x59, 0x60, 0x1e, 0x42, 0x83, 0x9c, 0xaa,
+ 0x00, 0x9b, 0x6d, 0x65, 0xac, 0x39, 0xc2, 0x6b, 0xad, 0x31, 0x4f, 0x3d,
+ 0xa5, 0x79, 0xc8, 0xe5, 0x7a, 0x91, 0xcc, 0xee, 0xef, 0x39, 0x7d, 0x91,
+ 0xd9, 0x10, 0xeb, 0x08, 0xbb, 0x78, 0xc0, 0xe3, 0x6c, 0xe7, 0xed, 0x46,
+ 0xd4, 0xb0, 0x21, 0x68, 0x58, 0x33, 0xa5, 0xe0, 0x73, 0x47, 0xc3, 0xc0,
+ 0x9e, 0x2b, 0xc8, 0x48, 0xca, 0xd3, 0x44, 0xd9, 0xc6, 0xb5, 0x9f, 0x44,
+ 0xe7, 0xf4, 0x80, 0xfb, 0x99, 0xbc, 0x3a, 0xde, 0x9e, 0x78, 0xcc, 0x17,
+ 0xf0, 0xd7, 0x8d, 0x77, 0xe3, 0x03, 0xad, 0xce, 0xda, 0xeb, 0xce, 0x44,
+ 0x5f, 0x30, 0x86, 0xff, 0xd0, 0xbf, 0x61, 0x52, 0xce, 0x49, 0x54, 0xfc,
+ 0xdb, 0x98, 0x9b, 0xcb, 0x58, 0x18, 0xce, 0xec, 0xf1, 0xde, 0xfc, 0x32,
+ 0xf8, 0x06, 0xb2, 0x15, 0xff, 0xd9, 0x4e, 0x81, 0xfb, 0x8c, 0x01, 0x17,
+ 0x79, 0x65, 0x02, 0xfe, 0x9e, 0x42, 0x91, 0x22, 0x86, 0xa9, 0xed, 0x7d,
+ 0xaa, 0xf4, 0x41, 0x79, 0xe7, 0xbe, 0x30, 0x75, 0x74, 0x71, 0x41, 0x2d,
+ 0x54, 0x6c, 0x44, 0x38, 0x50, 0xa9, 0xdf, 0x7f, 0x1f, 0x18, 0x7f, 0xf8,
+ 0x5e, 0xe4, 0x0e, 0x42, 0x0c, 0x84, 0x74, 0x48, 0x1a, 0xb8, 0x74, 0x72,
+ 0x08, 0x98, 0xf9, 0x71, 0xea, 0xea, 0x1f, 0xa8, 0x1c, 0xa3, 0x5e, 0x7e,
+ 0xe1, 0x46, 0x34, 0x2b, 0xac, 0x6e, 0x75, 0xa8, 0x96, 0x8d, 0x22, 0x61,
+ 0x56, 0xc7, 0x5c, 0x11, 0x47, 0xc8, 0xcd, 0x36, 0x01, 0x3a, 0x67, 0x05,
+ 0x5b, 0x61, 0x03, 0x46, 0xfc, 0x97, 0x62, 0xa2, 0x1d, 0x31, 0x5f, 0xe3,
+ 0x62, 0x8f, 0x8b, 0x4f, 0x7e, 0xc2, 0x93, 0x93, 0x52, 0x0e, 0x0c, 0xfc,
+ 0x4c, 0x69, 0x4d, 0xce, 0xfc, 0x54, 0x45, 0x96, 0x95, 0x67, 0xe6, 0x7c,
+ 0xc1, 0x21, 0xc7, 0x2e, 0xb9, 0x42, 0x2f, 0xab, 0x96, 0xeb, 0xa0, 0xd1,
+ 0x4e, 0x91, 0x89, 0xe1, 0xf2, 0x66, 0x27, 0xb2, 0xd1, 0xb8, 0xc9, 0x6a,
+ 0xc4, 0x0f, 0xcf, 0x9c, 0x76, 0x3f, 0xd0, 0x35, 0x12, 0xe1, 0x28, 0x89,
+ 0x3a, 0x08, 0xf5, 0x42, 0x39, 0x54, 0x0c, 0x8d, 0x85, 0x5f, 0x13, 0xb9,
+ 0xfc, 0x4d, 0x6c, 0xd9, 0xe4, 0x8c, 0xb6, 0x4a, 0x3b, 0x32, 0xc9, 0x6e,
+ 0xca, 0x33, 0xc3, 0x79, 0xda, 0xa6, 0x3c, 0xcb, 0x25, 0x32, 0xcb, 0x4c,
+ 0x9d, 0xa8, 0x73, 0x72, 0x88, 0x81, 0xb1, 0x3a, 0xe9, 0x9c, 0x5f, 0xf2,
+ 0x87, 0x43, 0xcd, 0x03, 0x4c, 0xd9, 0x53, 0x6e, 0x0a, 0xe4, 0x6b, 0x45,
+ 0xfe, 0x77, 0xd9, 0xdb, 0x4c, 0xd5, 0xf3, 0xd0, 0x51, 0x1b, 0x7c, 0x82,
+ 0xf9, 0x45, 0x00, 0x71, 0xfe, 0xb9, 0x78, 0x27, 0x8f, 0xa0, 0x70, 0x32,
+ 0xeb, 0xb7, 0x11, 0x9c, 0x33, 0x27, 0xf1, 0x05, 0x51, 0x5e, 0xe0, 0x26,
+ 0x09, 0xe6, 0x26, 0x8a, 0x99, 0xac, 0xed, 0x32, 0x46, 0x2f, 0x1e, 0x48,
+ 0xf2, 0x73, 0xdf, 0xb5, 0x67, 0x8c, 0x72, 0x7c, 0x10, 0xf9, 0xd1, 0xa3,
+ 0xf1, 0x65, 0x89, 0x9d, 0xde, 0x0b, 0x6d, 0xe7, 0x86, 0xbe, 0xbb, 0x67,
+ 0xc0, 0x50, 0x4f, 0x92, 0xde, 0xc2, 0xf4, 0xd1, 0x38, 0x7a, 0xf9, 0x38,
+ 0xef, 0x36, 0x61, 0x3c, 0x3e, 0x02, 0x11, 0xcc, 0xe4, 0x3a, 0xa0, 0xd9,
+ 0xdd, 0x41, 0x56, 0xef, 0xb4, 0xf1, 0x02, 0x47, 0xbb, 0x53, 0x3f, 0x0c,
+ 0x23, 0x6f, 0xf8, 0x42, 0x7c, 0x17, 0x1c, 0x88, 0xfb, 0x33, 0xbb, 0x9a,
+ 0xa1, 0x9d, 0xb1, 0x2c, 0x8a, 0x4f, 0x0a, 0xcc, 0x83, 0x13, 0xd2, 0xa7,
+ 0x00, 0xff, 0x05, 0x2a, 0xa5, 0xcf, 0x20, 0xd4, 0x63, 0x26, 0x54, 0x39,
+ 0x8c, 0xa2, 0xa6, 0x06, 0xa1, 0xc2, 0x4e, 0x85, 0x21, 0x84, 0xf1, 0x4f,
+ 0x6a, 0x5c, 0xce, 0x66, 0x05, 0xbc, 0x17, 0x2c, 0x10, 0x08, 0x0c, 0x90,
+ 0x6e, 0xf0, 0xff, 0xf6, 0xef, 0xf7, 0x79, 0x1d, 0x6b, 0x5f, 0x7c, 0xd2,
+ 0x03, 0x35, 0xc3, 0x2b, 0x06, 0x01, 0x8d, 0xfc, 0xc7, 0x1f, 0x19, 0xc5,
+ 0xda, 0x7e, 0xed, 0x25, 0x36, 0xf1, 0xed, 0xab, 0x4c, 0x03, 0x56, 0x94,
+ 0xb3, 0x08, 0x28, 0x1b, 0xc5, 0xbe, 0xf0, 0xf9, 0x43, 0x95, 0xc6, 0xb9,
+ 0xab, 0x08, 0xab, 0xe0, 0x03, 0x14, 0x3c, 0x65, 0xf8, 0x79, 0xea, 0x3c,
+ 0xcd, 0x1c, 0x73, 0xf1, 0x77, 0x78, 0x64, 0x75, 0x01, 0x2e, 0x94, 0x99,
+ 0xf4, 0x06, 0xf4, 0x70, 0x0c, 0x75, 0x32, 0xc7, 0x1f, 0xc2, 0x53, 0xee,
+ 0x13, 0x17, 0x50, 0xe1, 0x7b, 0xea, 0x47, 0x92, 0xc0, 0xc3, 0x27, 0x1b,
+ 0x18, 0x79, 0x10, 0x34, 0xec, 0x6f, 0xce, 0xb1, 0x50, 0x2f, 0x53, 0xec,
+ 0x48, 0xb7, 0x1e, 0x2b, 0x00, 0x11, 0x5a, 0x93, 0x1f, 0x5f, 0x8b, 0x4b,
+ 0xc8, 0xcf, 0x69, 0xbb, 0xb4, 0x1b, 0x9c, 0x1d, 0xde, 0x8d, 0xa9, 0xe9,
+ 0x47, 0xe8, 0xe9, 0xd9, 0xe7, 0xce, 0x0a, 0xe5, 0x2a, 0x81, 0xc7, 0x5f,
+ 0x2a, 0x62, 0xcb, 0xa2, 0x05, 0x80, 0x00, 0xdc, 0x39, 0xa1, 0x24, 0x18,
+ 0x0e, 0xf6, 0x82, 0x87, 0x93, 0x5c, 0xb3, 0x8f, 0xda, 0xae, 0x8f, 0x3b,
+ 0x0c, 0x1b, 0xe7, 0x43, 0x79, 0xc3, 0xdf, 0xef, 0xdf, 0xff, 0x0f, 0xff,
+ 0x79, 0xc9, 0xad, 0x25, 0xff, 0x7d, 0xec, 0xd2, 0x3a, 0xab, 0x74, 0xf6,
+ 0xe8, 0xb8, 0x28, 0x55, 0x78, 0x00, 0xa8, 0xa9, 0x84, 0x08, 0x67, 0x03,
+ 0x83, 0x79, 0xd1, 0x8f, 0x86, 0xf8, 0xc4, 0xce, 0x8b, 0x2d, 0x08, 0x65,
+ 0xb5, 0x74, 0x33, 0xc8, 0x35, 0x16, 0xf4, 0xc7, 0xef, 0x5c, 0x11, 0x7a,
+ 0xfb, 0x7f, 0x47, 0x9a, 0x7c, 0x92, 0x8c, 0x42, 0xd4, 0x2a, 0x7c, 0xfa,
+ 0xa5, 0x65, 0x06, 0x0e, 0xb9, 0x7c, 0x23, 0x79, 0x19, 0x17, 0x0c, 0x4d,
+ 0xd3, 0x2c, 0x18, 0x6a, 0x25, 0xe0, 0xb0, 0x1b, 0x0b, 0x09, 0x28, 0x88,
+ 0xcc, 0x02, 0x8b, 0x20, 0xa8, 0x41, 0xef, 0xca, 0xd5, 0xc1, 0x9f, 0x87,
+ 0x8b, 0x7a, 0xaa, 0xd8, 0x82, 0x7e, 0x0a, 0x03, 0xbd, 0xe5, 0x83, 0x0b,
+ 0xf7, 0x84, 0xea, 0x2c, 0x15, 0xfb, 0xf5, 0x0a, 0x88, 0xf8, 0x61, 0x8d,
+ 0x65, 0xa7, 0x75, 0xeb, 0x05, 0x6b, 0x44, 0x4e, 0xcf, 0x67, 0xd5, 0xc7,
+ 0xe3, 0x35, 0x80, 0x3a, 0x18, 0x31, 0x1c, 0x23, 0x7a, 0x2e, 0x95, 0x27,
+ 0xea, 0x6f, 0x4c, 0xf3, 0x50, 0x80, 0xe0, 0x75, 0x5c, 0x3b, 0x8b, 0x4c,
+ 0xe2, 0xec, 0xa5, 0x76, 0x71, 0xe8, 0xd5, 0xe7, 0xfc, 0xfa, 0xa2, 0xd4,
+ 0x8c, 0x46, 0x8d, 0xff, 0xe6, 0x39, 0x40, 0x38, 0x81, 0xb5, 0x65, 0xdb,
+ 0x29, 0x7d, 0x4f, 0xef, 0x47, 0xfd, 0xd6, 0x49, 0x06, 0x3b, 0xb6, 0xdc,
+ 0x9c, 0xf1, 0x3b, 0xd9, 0xa7, 0x26, 0xb9, 0x7e, 0xc1, 0x56, 0xe1, 0x87,
+ 0x74, 0x1d, 0xed, 0x6e, 0xe2, 0xdd, 0xee, 0xed, 0x06, 0xff, 0x5b, 0x36,
+ 0x7e, 0xe1, 0x72, 0x28, 0xb7, 0xc8, 0x28, 0x28, 0x4f, 0x00, 0x84, 0xdc,
+ 0xa1, 0x27, 0x57, 0x52, 0x19, 0x45, 0xe0, 0x2b, 0x45, 0x01, 0xb7, 0xa9,
+ 0x6c, 0x33, 0x3c, 0xc0, 0x31, 0xca, 0xd7, 0x43, 0x6c, 0x92, 0xf4, 0xc6,
+ 0x7a, 0x7b, 0x0f, 0x6c, 0x02, 0xfc, 0x0c, 0x54, 0xff, 0x16, 0x98, 0x7b,
+ 0xb5, 0x4f, 0xd5, 0xf6, 0x4f, 0xc2, 0x17, 0x2f, 0x86, 0xc1, 0xe9, 0x48,
+ 0x9e, 0x6d, 0xaa, 0xbe, 0xc8, 0x0a, 0x70, 0x8a, 0x7c, 0xf7, 0x5f, 0xb9,
+ 0x91, 0x2c, 0xc1, 0xc5, 0x57, 0xab, 0x8c, 0xef, 0xf0, 0xb9, 0xe3, 0x3e,
+ 0x2a, 0xfd, 0xaa, 0x3f, 0x75, 0xa4, 0xcc, 0x86, 0x2b, 0x51, 0x2e, 0xf7,
+ 0x57, 0x3e, 0xef, 0x6b, 0x7c, 0x82, 0x90, 0x8e, 0x08, 0x8f, 0x95, 0xd7,
+ 0xa9, 0xfa, 0x19, 0x77, 0xca, 0x3e, 0x80, 0xc3, 0xef, 0x25, 0xc2, 0x2c,
+ 0xa9, 0x04, 0x44, 0x6d, 0xe5, 0xc7, 0xd2, 0xd4, 0x79, 0xae, 0x41, 0x74,
+ 0x94, 0x87, 0x1a, 0x26, 0x87, 0x71, 0x62, 0x26, 0x02, 0x59, 0x7d, 0xd3,
+ 0xef, 0x3c, 0xe3, 0x47, 0x8e, 0x84, 0x4e, 0x24, 0x32, 0x85, 0xa7, 0xc7,
+ 0x06, 0xe0, 0x78, 0xe5, 0x69, 0x19, 0x19, 0xe5, 0xa7, 0x8d, 0xa8, 0xc8,
+ 0xff, 0xa9, 0x39, 0x6b, 0x4c, 0x13, 0x35, 0x8a, 0x8e, 0x86, 0x6e, 0xd7,
+ 0xdd, 0xf5, 0xfd, 0x9e, 0xe2, 0x01, 0x43, 0x5d, 0xb4, 0x5f, 0xba, 0x41,
+ 0xca, 0x3c, 0xec, 0x7f, 0xee, 0xa3, 0x3b, 0xe7, 0xf7, 0x14, 0xb8, 0xee,
+ 0x82, 0x3f, 0xf9, 0x2c, 0xca, 0x14, 0x90, 0x2a, 0xf6, 0x73, 0x38, 0x3b,
+ 0xb6, 0xff, 0xff, 0xa4, 0x55, 0x3f, 0x63, 0x4f, 0x0f, 0x60, 0x19, 0x79,
+ 0xdc, 0xe8, 0x02, 0x5d, 0x24, 0x75, 0x89, 0x55, 0x91, 0xe4, 0xa3, 0x87,
+ 0xa9, 0x05, 0x38, 0x69, 0x0e, 0xde, 0x9c, 0x84, 0x2d, 0xff, 0x5b, 0x18,
+ 0x49, 0xeb, 0x8b, 0xc7, 0x01, 0x08, 0x75, 0x63, 0x66, 0x3a, 0x98, 0x24,
+ 0x38, 0x6f, 0x0a, 0x9d, 0x17, 0x95, 0xec, 0x86, 0x43, 0x1d, 0xae, 0xe4,
+ 0x59, 0xfe, 0xdb, 0xed, 0xa0, 0xec, 0x4a, 0x4d, 0x0d, 0x00, 0x48, 0x56,
+ 0x0b, 0x09, 0xff, 0xbb, 0x85, 0xbf, 0x0d, 0x60, 0xd7, 0x10, 0xe8, 0x07,
+ 0xda, 0x3f, 0xb4, 0xd5, 0xf6, 0x16, 0x66, 0xf6, 0xc8, 0x36, 0x47, 0x1e,
+ 0xbb, 0x75, 0xd8, 0x13, 0xdf, 0xe4, 0x01, 0x11, 0xa8, 0xab, 0x05, 0xba,
+ 0xb9, 0x7e, 0xcd, 0x2b, 0xfe, 0x41, 0x6c, 0x60, 0x34, 0xde, 0x2e, 0x30,
+ 0xc2, 0x8e, 0xdd, 0x91, 0x28, 0x0e, 0x35, 0x41, 0x4c, 0x8b, 0x22, 0xc7,
+ 0xd2, 0xf7, 0xdc, 0x6b, 0x09, 0x31, 0x19, 0x56, 0x58, 0x2c, 0x71, 0xde,
+ 0x62, 0x6b, 0xdc, 0x7e, 0xc1, 0x86, 0x04, 0x28, 0x10, 0xcc, 0xd0, 0x09,
+ 0x97, 0x2e, 0xae, 0x33, 0xa7, 0xe0, 0xfa, 0x7c, 0x2d, 0x0f, 0xa1, 0x07,
+ 0xb3, 0x6d, 0x7c, 0x8c, 0xb3, 0x9a, 0xcb, 0x33, 0x8e, 0xc0, 0x04, 0x95,
+ 0xfd, 0xc4, 0xf9, 0x6a, 0xc3, 0xb8, 0xa7, 0xf5, 0x4f, 0x65, 0x2b, 0x83,
+ 0xd7, 0xae, 0xe6, 0x9a, 0x96, 0x3f, 0xe5, 0x7f, 0xd2, 0x2e, 0xee, 0x6f,
+ 0xdd, 0xb3, 0x55, 0x97, 0xa7, 0x69, 0x02, 0xf4, 0xb3, 0xd6, 0xc6, 0xf7,
+ 0x1a, 0x60, 0x0e, 0x6a, 0xed, 0x1f, 0x5d, 0x98, 0xfd, 0xef, 0x08, 0x1b,
+ 0xac, 0x64, 0x93, 0x1c, 0xe2, 0x3e, 0x08, 0x3b, 0x3c, 0x05, 0xff, 0x22,
+ 0xda, 0xc2, 0x07, 0xdb, 0xf7, 0x50, 0x91, 0xab, 0xb5, 0x41, 0xc2, 0x01,
+ 0xd2, 0x35, 0x15, 0x03, 0xfb, 0x6a, 0x6d, 0x56, 0xbb, 0x07, 0xd2, 0xc2,
+ 0xc9, 0x59, 0x85, 0xf8, 0x5e, 0x7c, 0x3c, 0xca, 0xc7, 0x70, 0x10, 0x16,
+ 0xb6, 0x52, 0xac, 0xab, 0x7b, 0x59, 0x0a, 0xf7, 0x0b, 0xde, 0xdc, 0x01,
+ 0x91, 0x48, 0x89, 0xc7, 0xb5, 0x48, 0x28, 0xf5, 0xa9, 0x99, 0x55, 0xee,
+ 0xc8, 0x39, 0x66, 0x99, 0xf5, 0x67, 0xd8, 0x04, 0x77, 0xdf, 0xf6, 0x83,
+ 0x19, 0x49, 0x8b, 0x11, 0x20, 0x24, 0x15, 0x3d, 0x0d, 0x32, 0xa3, 0x01,
+ 0x1d, 0x05, 0xa6, 0x06, 0xf5, 0x63, 0xa7, 0x3d, 0x9f, 0xf8, 0xe5, 0x53,
+ 0x5c, 0xaf, 0x01, 0xc1, 0xd4, 0x4a, 0xbb, 0x35, 0xbd, 0x05, 0x24, 0x0e,
+ 0x2b, 0x9e, 0x07, 0x86, 0xbc, 0xc2, 0x64, 0xd1, 0xc0, 0x04, 0xb9, 0x7c,
+ 0x38, 0x38, 0xd0, 0xc8, 0xd8, 0x14, 0x73, 0xfb, 0x49, 0x10, 0x90, 0x00,
+ 0x20, 0xf1, 0xc8, 0x46, 0x7e, 0x8e, 0x57, 0xf4, 0x7a, 0x56, 0x92, 0x23,
+ 0x10, 0xe0, 0x9c, 0xcd, 0x8f, 0x92, 0x9b, 0x43, 0x23, 0xe6, 0x6b, 0xdc,
+ 0x1c, 0x2c, 0x5a, 0x10, 0x9b, 0x0c, 0x92, 0x03, 0xbc, 0xcb, 0x27, 0x39,
+ 0x19, 0xed, 0xad, 0x5e, 0x76, 0x5f, 0x6e, 0x9f, 0x90, 0x36, 0xea, 0x95,
+ 0xa6, 0xad, 0x16, 0x28, 0x75, 0x9f, 0x54, 0x63, 0x4f, 0x45, 0xa9, 0xa0,
+ 0x62, 0x6d, 0xe4, 0x36, 0xf2, 0xb5, 0xae, 0x86, 0x45, 0x9c, 0x0f, 0xeb,
+ 0x88, 0x91, 0xbe, 0x9d, 0x6f, 0x3c, 0xb0, 0x16, 0xa2, 0x6a, 0xbe, 0x87,
+ 0x43, 0xa7, 0x79, 0xf8, 0x7f, 0x1f, 0xb6, 0x6c, 0xb4, 0xcf, 0x3f, 0xc4,
+ 0x12, 0x56, 0xde, 0x12, 0x3b, 0x57, 0xcc, 0x73, 0x34, 0xae, 0xcb, 0xc3,
+ 0x5a, 0x5b, 0x84, 0x79, 0x29, 0xab, 0xc0, 0x66, 0xc2, 0xaa, 0xef, 0x09,
+ 0x3c, 0x01, 0x2b, 0x57, 0x8c, 0xda, 0x71, 0x0d, 0x73, 0x9a, 0x57, 0x1d,
+ 0xe0, 0xbd, 0x0e, 0x33, 0xb5, 0xf2, 0x94, 0x05, 0x8f, 0x24, 0x00, 0x4b,
+ 0xbd, 0xbe, 0x29, 0x7d, 0xd3, 0xdb, 0x1e, 0x91, 0x52, 0xd4, 0x98, 0x21,
+ 0x62, 0x82, 0xb2, 0x04, 0x23, 0xd0, 0x0f, 0x5c, 0x53, 0x7e, 0x12, 0x36,
+ 0x13, 0x8a, 0xb6, 0x74, 0x9e, 0xb1, 0xcd, 0xbb, 0x8b, 0x57, 0x36, 0x4f,
+ 0xae, 0x4e, 0xf7, 0xa4, 0x3f, 0xdd, 0x9d, 0x92, 0xcd, 0x08, 0x5a, 0x76,
+ 0x0c, 0x46, 0x2b, 0xca, 0xe9, 0x24, 0xf2, 0xc8, 0x76, 0xb9, 0xab, 0x05,
+ 0x2f, 0x03, 0x9e, 0x78, 0x61, 0xf3, 0xd4, 0xdc, 0xb9, 0x43, 0x68, 0x38,
+ 0xc3, 0xde, 0x7f, 0x28, 0x80, 0x22, 0x55, 0x89, 0xc3, 0xe8, 0x64, 0x50,
+ 0x11, 0x6b, 0x55, 0xe2, 0x30, 0xd8, 0xb2, 0xd6, 0x0e, 0xc0, 0x1f, 0x15,
+ 0x42, 0x2e, 0xfe, 0x05, 0xff, 0x0e, 0xb5, 0xe4, 0x04, 0x64, 0x47, 0x3f,
+ 0x0a, 0x47, 0x9e, 0xe7, 0xcb, 0x79, 0x86, 0x83, 0x4f, 0x66, 0xca, 0xaf,
+ 0xd8, 0x71, 0x85, 0x6e, 0x6c, 0x27, 0xaa, 0x74, 0x79, 0xf3, 0x21, 0x2a,
+ 0xef, 0x27, 0xe0, 0x78, 0x54, 0x53, 0x19, 0xc4, 0xcb, 0x93, 0x4b, 0xcd,
+ 0xc7, 0xa5, 0xea, 0xcb, 0xeb, 0xa7, 0x21, 0x4c, 0x4a, 0x09, 0xf5, 0x68,
+ 0x1f, 0x72, 0xc8, 0x0f, 0xfe, 0xfc, 0xd5, 0xee, 0x98, 0xd4, 0xd4, 0xd5,
+ 0x64, 0x23, 0xfe, 0xcb, 0xb9, 0x88, 0x95, 0x91, 0xa9, 0xce, 0x85, 0x45,
+ 0xe1, 0x2f, 0x92, 0xe1, 0x3b, 0x59, 0xb2, 0x3a, 0x1a, 0x59, 0x88, 0xf2,
+ 0x32, 0xe3, 0x23, 0x73, 0xd7, 0xc3, 0x84, 0x9b, 0x9e, 0xb4, 0xb5, 0x59,
+ 0xe6, 0x53, 0x0c, 0x5f, 0x26, 0x97, 0x29, 0xe4, 0xc9, 0xad, 0x05, 0x50,
+ 0xc0, 0x50, 0x07, 0xcd, 0x2a, 0x11, 0x62, 0xd4, 0xe1, 0xde, 0x20, 0xaa,
+ 0xf5, 0x76, 0x8e, 0x32, 0x53, 0x09, 0x29, 0x5e, 0x0b, 0xf1, 0xf9, 0x31,
+ 0xf0, 0x7b, 0x37, 0x6e, 0x06, 0xb3, 0x25, 0xf3, 0xf8, 0x6d, 0xe0, 0x32,
+ 0x54, 0x74, 0xe9, 0x5a, 0x21, 0xa3, 0xbe, 0x35, 0x15, 0x61, 0xf1, 0x41,
+ 0xc7, 0x4d, 0xc1, 0xe5, 0x1b, 0x0e, 0x36, 0x93, 0x0b, 0x9b, 0x69, 0xf8,
+ 0x1c, 0x0f, 0x4d, 0x09, 0x1d, 0xbc, 0xf6, 0xfe, 0x4a, 0x98, 0x29, 0x3b,
+ 0x00, 0xa5, 0x71, 0xa6, 0xa8, 0xa1, 0x02, 0xf8, 0xbe, 0xb6, 0x41, 0x14,
+ 0xc4, 0x83, 0x94, 0x2e, 0x55, 0x04, 0x04, 0xba, 0xe8, 0x1e, 0xf6, 0x29,
+ 0xd4, 0xa3, 0x3b, 0xa4, 0xaa, 0xd2, 0xea, 0x22, 0xc1, 0xf9, 0x22, 0xfe,
+ 0x14, 0x12, 0x53, 0x22, 0xe7, 0xc6, 0x9c, 0xeb, 0x51, 0xa0, 0x28, 0x0a,
+ 0x24, 0xd7, 0xdc, 0xeb, 0x9b, 0x7f, 0x6e, 0x50, 0x31, 0x23, 0x82, 0xac,
+ 0x92, 0x53, 0xfc, 0xda, 0x16, 0xdf, 0x24, 0x69, 0x89, 0x37, 0x5a, 0xbc,
+ 0xc7, 0xff, 0xda, 0x1b, 0xda, 0xa9, 0xaf, 0x7a, 0x11, 0x9a, 0xb8, 0xf8,
+ 0x32, 0xd6, 0x91, 0xfc, 0xd9, 0x49, 0x25, 0x0b, 0x8a, 0xd7, 0x50, 0xf8,
+ 0xa6, 0xe8, 0x17, 0x1b, 0xa8, 0x7e, 0xf3, 0x9c, 0x82, 0x35, 0x5f, 0xfb,
+ 0x0c, 0x05, 0x8d, 0x50, 0x4b, 0x76, 0xaf, 0xa8, 0x93, 0xda, 0x94, 0x75,
+ 0xbf, 0x4a, 0x33, 0x4e, 0x4d, 0xa7, 0xb4, 0x80, 0xcb, 0xd3, 0xe3, 0xb3,
+ 0x1b, 0xda, 0x95, 0xe1, 0x22, 0x06, 0xe6, 0x97, 0x71, 0x36, 0xe4, 0x79,
+ 0xc9, 0xc0, 0xc9, 0x49, 0xbc, 0x4e, 0x4e, 0xe6, 0x78, 0x07, 0xc4, 0xbc,
+ 0x70, 0xee, 0x8a, 0x7f, 0x3f, 0x65, 0x66, 0x55, 0x6c, 0x83, 0x21, 0x2e,
+ 0xd9, 0x53, 0x50, 0xde, 0x64, 0xef, 0x9a, 0x01, 0x66, 0x3d, 0x1e, 0x92,
+ 0x5b, 0xa2, 0x29, 0xb4, 0x75, 0xd1, 0xc8, 0x0a, 0x63, 0xeb, 0xd6, 0x9e,
+ 0x5b, 0x76, 0x6a, 0x06, 0xf0, 0xfe, 0x56, 0xff, 0x1d, 0xa3, 0xe6, 0x23,
+ 0xed, 0xa1, 0xf9, 0x13, 0xdb, 0x3c, 0x7d, 0x7b, 0x5b, 0x5e, 0x55, 0x24,
+ 0x92, 0x3f, 0x16, 0xd4, 0x84, 0xbf, 0xa0, 0x67, 0x62, 0xfd, 0x69, 0xe8,
+ 0x16, 0x10, 0x43, 0x6d, 0x58, 0xca, 0x78, 0xfd, 0xaa, 0x19, 0x16, 0x00,
+ 0xec, 0x31, 0xd4, 0x56, 0xec, 0x4f, 0x52, 0xaa, 0xf0, 0x6d, 0xae, 0xc2,
+ 0x85, 0xb2, 0x8c, 0xa7, 0x8b, 0xbd, 0xab, 0x65, 0xdd, 0x7a, 0x4c, 0xdf,
+ 0x19, 0x9a, 0x93, 0xf1, 0x19, 0x2c, 0x70, 0xc8, 0xcd, 0x40, 0xe7, 0x13,
+ 0xca, 0x64, 0xc8, 0xed, 0xa4, 0x40, 0x66, 0xed, 0x2e, 0xc7, 0x04, 0x8e,
+ 0xd8, 0xe8, 0xf5, 0x35, 0x72, 0xc1, 0x5f, 0x8c, 0x9d, 0x94, 0xbc, 0xcb,
+ 0x7a, 0xf8, 0x64, 0xf6, 0xc0, 0x8e, 0x7c, 0xa3, 0x2d, 0x93, 0x4d, 0x99,
+ 0x50, 0x71, 0x60, 0xbb, 0x90, 0xba, 0x68, 0x9c, 0x91, 0xff, 0x3d, 0x0a,
+ 0x80, 0x04, 0x74, 0x27, 0x2e, 0x1e, 0x0e, 0x95, 0x01, 0x41, 0xae, 0xa5,
+ 0xb2, 0x5b, 0x95, 0x39, 0x2b, 0x71, 0x97, 0xe1, 0x0e, 0x35, 0x92, 0x5f,
+ 0x25, 0xf3, 0x5a, 0xab, 0xf2, 0x09, 0xd9, 0xcf, 0xe0, 0x04, 0xb8, 0xcf,
+ 0x16, 0x75, 0xb3, 0x27, 0xd7, 0x3a, 0xbc, 0xa4, 0x6c, 0x43, 0xfb, 0x73,
+ 0xa3, 0x90, 0x59, 0xe8, 0x63, 0x81, 0xd3, 0xc0, 0x75, 0xf6, 0x6f, 0x69,
+ 0xb4, 0x8b, 0x36, 0xa6, 0x58, 0xd6, 0x19, 0xde, 0xec, 0x80, 0xd6, 0x39,
+ 0x32, 0x1c, 0x55, 0x2e, 0x31, 0x9c, 0xde, 0x14, 0xd4, 0x73, 0x98, 0xc8,
+ 0xe0, 0x47, 0x36, 0xac, 0x81, 0xac, 0x96, 0x86, 0x4d, 0x04, 0x0b, 0x82,
+ 0xae, 0x64, 0x01, 0x33, 0x4c, 0x6d, 0xba, 0x12, 0xd2, 0xd2, 0x8e, 0x5f,
+ 0xcc, 0x9c, 0xaa, 0xfe, 0xeb, 0x46, 0xae, 0x7f, 0x0d, 0xf4, 0x61, 0x9b,
+ 0xda, 0x2d, 0xb4, 0x68, 0x3e, 0x9d, 0xf2, 0xda, 0x8a, 0xf7, 0x6f, 0x72,
+ 0x64, 0x45, 0x22, 0x13, 0x08, 0x0f, 0x79, 0xa0, 0xe5, 0xa2, 0x4d, 0x0e,
+ 0x3f, 0xf3, 0xc4, 0xe9, 0x0c, 0xd9, 0x48, 0x00, 0x65, 0x2d, 0xd4, 0x50,
+ 0xfd, 0xcd, 0x52, 0xf4, 0xc4, 0x29, 0xe1, 0xa2, 0x6f, 0xf1, 0x7b, 0x4d,
+ 0xf5, 0x30, 0xc9, 0xe7, 0xf4, 0xf3, 0xd2, 0x92, 0xe9, 0xf7, 0x07, 0x6f,
+ 0x8b, 0x59, 0xf5, 0x30, 0xad, 0xcf, 0xd9, 0xfd, 0xb1, 0x1a, 0x17, 0x75,
+ 0x1d, 0x47, 0x21, 0x95, 0x3d, 0x6e, 0xec, 0x80, 0xd0, 0x73, 0x4d, 0xc4,
+ 0x19, 0xb6, 0x72, 0xd3, 0x23, 0xa2, 0x8f, 0x63, 0x07, 0x1f, 0x29, 0xb2,
+ 0x59, 0x1e, 0x2c, 0x50, 0x5d, 0x95, 0x02, 0xf0, 0xb2, 0x56, 0x35, 0xac,
+ 0xda, 0xca, 0xe9, 0xe7, 0xa4, 0xe2, 0x92, 0xab, 0x73, 0x76, 0x85, 0xfc,
+ 0x31, 0x3a, 0xad, 0x14, 0xe8, 0xe2, 0x56, 0x60, 0xc0, 0x7b, 0xb1, 0xb4,
+ 0x6a, 0x13, 0x77, 0xf8, 0x7d, 0x5e, 0xf0, 0x82, 0xf2, 0xab, 0x30, 0xe0,
+ 0x5b, 0x4e, 0xff, 0x55, 0xc5, 0x89, 0x43, 0xbe, 0x8d, 0x96, 0xca, 0x2c,
+ 0xa9, 0x9e, 0x83, 0x1d, 0x61, 0x7a, 0xd3, 0x14, 0xac, 0x28, 0x32, 0xfe,
+ 0x97, 0x7a, 0xd6, 0x08, 0x54, 0xf0, 0xf2, 0x39, 0xb8, 0x0c, 0x95, 0xa6,
+ 0xdd, 0x78, 0xa0, 0x3c, 0xde, 0x30, 0x44, 0xc3, 0xa3, 0x8f, 0xc2, 0xf4,
+ 0xce, 0x3f, 0xda, 0x73, 0xe2, 0x22, 0x4f, 0xd4, 0x46, 0xc1, 0x71, 0x5d,
+ 0xa3, 0x7a, 0x05, 0xb5, 0x35, 0xbb, 0xf2, 0x46, 0x7b, 0xcc, 0xb9, 0x20,
+ 0xc0, 0x35, 0x90, 0x19, 0xba, 0x92, 0x6e, 0xa6, 0x2b, 0x0b, 0x63, 0x1f,
+ 0xed, 0xec, 0x05, 0xed, 0x20, 0xed, 0x07, 0x00, 0xa1, 0x13, 0xb1, 0x36,
+ 0xeb, 0x75, 0xa2, 0x60, 0x01, 0xb0, 0xbc, 0x2c, 0xdc, 0xb4, 0x19, 0x19,
+ 0x39, 0xc1, 0x9e, 0xb5, 0xed, 0xdf, 0x8f, 0xe4, 0x56, 0xec, 0xad, 0xc1,
+ 0xdf, 0x76, 0xce, 0x39, 0x24, 0x01, 0x78, 0x62, 0x07, 0x3a, 0x7c, 0x3b,
+ 0x48, 0x2b, 0xb3, 0xec, 0x34, 0x87, 0xfb, 0x82, 0xae, 0x63, 0x0a, 0x74,
+ 0x26, 0x6a, 0xde, 0xca, 0x06, 0xc1, 0x54, 0x24, 0x29, 0xb5, 0x04, 0x73,
+ 0x1f, 0x03, 0x49, 0x8b, 0xcd, 0x8a, 0xf6, 0xd9, 0xd3, 0x64, 0xd6, 0x20,
+ 0xea, 0x8b, 0x18, 0xf4, 0x9a, 0x6b, 0x05, 0x39, 0x8b, 0x1f, 0xd5, 0x2a,
+ 0xd5, 0x63, 0x63, 0xa7, 0x91, 0xa2, 0x86, 0x80, 0x69, 0xc7, 0xe2, 0x13,
+ 0x29, 0xc0, 0x87, 0x79, 0x3f, 0xa7, 0x94, 0xa6, 0xb8, 0x31, 0x56, 0xd4,
+ 0x45, 0x7e, 0x09, 0xea, 0x48, 0x19, 0xcc, 0xa5, 0xca, 0x25, 0x14, 0x7b,
+ 0x6d, 0xb2, 0x88, 0x19, 0x5a, 0xa0, 0x79, 0x15, 0x1a, 0xb1, 0xa2, 0x24,
+ 0x49, 0xda, 0x70, 0x89, 0x1c, 0x98, 0x64, 0x46, 0xeb, 0x2b, 0x66, 0xcf,
+ 0xca, 0x34, 0x01, 0x8e, 0xb9, 0x7e, 0x60, 0xf2, 0x7a, 0x60, 0x40, 0xdd,
+ 0x38, 0x11, 0xe3, 0xb8, 0x5e, 0x25, 0xa2, 0x69, 0xde, 0x42, 0x9b, 0xd1,
+ 0x98, 0xfb, 0x28, 0x56, 0xa1, 0xc5, 0x23, 0xd1, 0x36, 0x34, 0xa7, 0xde,
+ 0x08, 0xd4, 0x58, 0xe9, 0x30, 0x98, 0x85, 0x87, 0xaf, 0xca, 0x90, 0xc7,
+ 0xfa, 0x01, 0x34, 0xdd, 0x98, 0xc2, 0x85, 0xf4, 0xfd, 0xeb, 0xfa, 0x75,
+ 0x5f, 0xa5, 0xb1, 0x10, 0xae, 0xff, 0xfd, 0xba, 0x76, 0xaf, 0xfe, 0x24,
+ 0xda, 0x11, 0x6a, 0x11, 0x2d, 0x6d, 0x62, 0x63, 0xc5, 0x8d, 0x5f, 0x44,
+ 0xfe, 0x4f, 0xa0, 0xe8, 0x8c, 0x5b, 0x9c, 0x5d, 0xfe, 0xf8, 0xec, 0x2f,
+ 0x5f, 0x9b, 0x7a, 0x3c, 0x0e, 0x05, 0x4d, 0x57, 0xa2, 0x89, 0x73, 0xc5,
+ 0x24, 0x41, 0xf4, 0x3a, 0x22, 0x1b, 0xc7, 0x7f, 0xfb, 0xba, 0xd1, 0x74,
+ 0xfc, 0x4f, 0xaf, 0xdb, 0x2f, 0xc3, 0xf8, 0x4f, 0x00, 0xb3, 0x6a, 0x25,
+ 0xb6, 0xf7, 0x4a, 0xe1, 0x84, 0xfa, 0x29, 0xf8, 0x31, 0x4a, 0x3f, 0x06,
+ 0xfe, 0xc1, 0x82, 0x90, 0xe0, 0x5c, 0x07, 0xfb, 0xbb, 0x87, 0xb9, 0x91,
+ 0xc6, 0x21, 0x10, 0x4b, 0x80, 0x0a, 0xf6, 0xa7, 0xdc, 0x5c, 0x7f, 0xa9,
+ 0x62, 0x33, 0x95, 0x43, 0x2f, 0x17, 0xbd, 0x51, 0x6e, 0x4b, 0x21, 0x0a,
+ 0x02, 0x15, 0xc8, 0xef, 0x2f, 0xa7, 0xb0, 0xf7, 0x1e, 0xae, 0xce, 0xe3,
+ 0xc4, 0xe6, 0x08, 0x9f, 0x6a, 0xd7, 0x5a, 0x70, 0x80, 0xdf, 0x3a, 0xff,
+ 0x6d, 0xa5, 0xaa, 0xde, 0xfc, 0xe9, 0x3e, 0x14, 0xb6, 0x20, 0xd6, 0x95,
+ 0x61, 0xb4, 0xfe, 0xec, 0x39, 0x59, 0xd8, 0x43, 0xa9, 0x27, 0x11, 0xd6,
+ 0xe8, 0x75, 0xff, 0x9a, 0xc2, 0x64, 0xa7, 0x76, 0x2b, 0xf0, 0xb5, 0x0d,
+ 0xa6, 0x7d, 0xdf, 0xe7, 0xb8, 0xdf, 0x9e, 0xb2, 0x38, 0xab, 0x57, 0xcf,
+ 0x41, 0x1a, 0x6f, 0xc2, 0x1c, 0x86, 0xd9, 0x58, 0x19, 0x04, 0xe9, 0xbe,
+ 0x6b, 0xb9, 0x96, 0xb4, 0x8d, 0x50, 0x6b, 0x59, 0x67, 0xc6, 0xa6, 0xf5,
+ 0x6b, 0x2c, 0x89, 0xc1, 0x4e, 0x7c, 0x3d, 0x9e, 0x99, 0xc6, 0xf2, 0x75,
+ 0xd2, 0x7d, 0x4c, 0x0a, 0x9a, 0x26, 0xc1, 0x56, 0x66, 0x25, 0x24, 0xdc,
+ 0x42, 0xd8, 0xc6, 0xb2, 0xd0, 0xe1, 0xcd, 0x07, 0x29, 0xbe, 0x92, 0x26,
+ 0x26, 0x35, 0xed, 0x2f, 0xea, 0xb4, 0x52, 0xfe, 0xcc, 0x1a, 0xdf, 0xd2,
+ 0xe8, 0xde, 0x59, 0x77, 0x55, 0xe5, 0x26, 0xae, 0x38, 0x9e, 0xf2, 0xf3,
+ 0x65, 0x72, 0xfc, 0x25, 0xa8, 0xfb, 0x22, 0xda, 0x9a, 0x24, 0x8f, 0x73,
+ 0xc9, 0xcc, 0x2d, 0x62, 0xc1, 0xa5, 0x97, 0x49, 0x2e, 0x02, 0xb4, 0x05,
+ 0x13, 0x84, 0x02, 0x2a, 0xf4, 0x53, 0x60, 0x87, 0x82, 0x73, 0xfc, 0x6e,
+ 0x91, 0x1a, 0x3c, 0x28, 0xaf, 0x3e, 0xd5, 0xc8, 0xfe, 0x11, 0x39, 0x38,
+ 0x4c, 0x1e, 0xeb, 0x45, 0x3e, 0xca, 0x79, 0x91, 0x47, 0x89, 0x8d, 0xaf,
+ 0xb4, 0xea, 0xfe, 0xd7, 0x4d, 0x4f, 0x44, 0x06, 0x3e, 0x69, 0xa5, 0x1b,
+ 0x9a, 0x58, 0x2f, 0x68, 0xc1, 0x98, 0xd8, 0xe4, 0xfa, 0xac, 0xbd, 0x74,
+ 0x9e, 0x7a, 0x04, 0xa7, 0x17, 0x57, 0xca, 0x3e, 0x37, 0x17, 0x20, 0xd9,
+ 0x6a, 0x8e, 0x48, 0xec, 0x0f, 0x8a, 0x20, 0x9b, 0x1f, 0xa4, 0x6b, 0xbc,
+ 0xf2, 0x51, 0xac, 0xd6, 0x51, 0xb7, 0x36, 0x6b, 0x0d, 0x63, 0x1d, 0x0e,
+ 0x30, 0xd1, 0xd3, 0x87, 0xbb, 0x77, 0xd5, 0xa7, 0xdd, 0x7b, 0xcd, 0xf0,
+ 0xe7, 0x53, 0xe2, 0xc9, 0x7f, 0x9b, 0xaa, 0x7c, 0x50, 0x86, 0x40, 0x8e,
+ 0x4e, 0xeb, 0xf6, 0x4c, 0x86, 0xe7, 0xd9, 0xf9, 0xec, 0x20, 0x8b, 0x14,
+ 0xef, 0xf1, 0xce, 0xc9, 0xa0, 0x45, 0x8a, 0x1d, 0x80, 0x92, 0xed, 0xe8,
+ 0xbc, 0xcf, 0x61, 0xcc, 0x0a, 0x10, 0x95, 0x85, 0x33, 0x79, 0x9e, 0xdb,
+ 0x19, 0x4d, 0xac, 0x58, 0xa9, 0x24, 0x12, 0x41, 0x52, 0x97, 0x55, 0x71,
+ 0x9f, 0x48, 0xa3, 0xec, 0xb4, 0x72, 0xee, 0xa2, 0xe3, 0xd9, 0x32, 0x09,
+ 0x2d, 0x29, 0x88, 0x3f, 0x25, 0x4f, 0xfd, 0xa0, 0x21, 0xf1, 0x07, 0xb0,
+ 0xd4, 0x18, 0x9e, 0x36, 0xd1, 0xbd, 0xb7, 0xd5, 0x1c, 0xb2, 0x6a, 0x4c,
+ 0x5b, 0x1d, 0x33, 0x03, 0x33, 0x4e, 0x8f, 0x18, 0xfd, 0x72, 0x9e, 0x2e,
+ 0x70, 0xec, 0x71, 0x18, 0x61, 0x2a, 0xaa, 0xb8, 0x56, 0x03, 0x04, 0x69,
+ 0x33, 0xa9, 0x57, 0x57, 0xdc, 0x0d, 0xfd, 0x46, 0x0d, 0xba, 0x40, 0x77,
+ 0xf5, 0x80, 0xb7, 0x0f, 0x86, 0xb1, 0x1c, 0x2f, 0x83, 0xb1, 0xcd, 0x32,
+ 0x5f, 0x77, 0x9f, 0x70, 0x16, 0x8d, 0x6a, 0x6d, 0x32, 0xc7, 0xae, 0x01,
+ 0x20, 0x9f, 0x93, 0xbf, 0xb6, 0xd4, 0x2d, 0xdf, 0x4f, 0x72, 0x18, 0x7d,
+ 0x87, 0x3b, 0xde, 0xe1, 0x55, 0xbe, 0xb0, 0xa1, 0x3d, 0xf5, 0x67, 0xcf,
+ 0x26, 0x0b, 0x96, 0x4e, 0x38, 0xca, 0xf3, 0x9c, 0xf9, 0x74, 0x7b, 0x4f,
+ 0x37, 0x39, 0x9f, 0x1d, 0x13, 0xde, 0x5a, 0xe2, 0x70, 0x31, 0x51, 0x96,
+ 0x0f, 0xb8, 0xf3, 0x74, 0x06, 0x99, 0xd1, 0x34, 0x94, 0xee, 0xb6, 0x01,
+ 0x23, 0x07, 0x7c, 0xb4, 0x9a, 0x0c, 0x9e, 0x8c, 0xf0, 0x54, 0xb6, 0x83,
+ 0x00, 0x63, 0xea, 0x30, 0x8c, 0xdc, 0xcc, 0x48, 0xb1, 0xcc, 0xb1, 0xe6,
+ 0x90, 0xf9, 0x40, 0x8e, 0xf8, 0x7b, 0x84, 0x94, 0x6f, 0x1c, 0x8d, 0xbd,
+ 0x73, 0xed, 0x83, 0xcd, 0xfc, 0x30, 0xac, 0x03, 0xd7, 0x94, 0x62, 0x4c,
+ 0xaa, 0x79, 0xfd, 0xcc, 0x64, 0x3c, 0x62, 0x47, 0x51, 0xfb, 0x18, 0x9f,
+ 0x76, 0x14, 0x7e, 0xb4, 0xce, 0x47, 0x23, 0x5f, 0x06, 0x02, 0x89, 0x37,
+ 0x80, 0x88, 0xc6, 0xab, 0x89, 0x5c, 0xc5, 0xf5, 0x4d, 0x2a, 0x13, 0x63,
+ 0xc4, 0xfa, 0x2d, 0xb1, 0x07, 0x2b, 0xe3, 0x19, 0x63, 0x98, 0xbe, 0x5d,
+ 0x08, 0x8b, 0x8e, 0x70, 0xa7, 0x5d, 0x55, 0x7b, 0xa6, 0x87, 0x80, 0xaf,
+ 0x2f, 0x6e, 0x14, 0xb8, 0x8c, 0xff, 0xff, 0x8c, 0x4e, 0x3e, 0xdc, 0x0d,
+ 0x06, 0x65, 0x72, 0x24, 0xc5, 0x28, 0x9f, 0xd4, 0xb1, 0x3d, 0xab, 0xf4,
+ 0x13, 0x90, 0x54, 0xed, 0x89, 0xa2, 0xea, 0x0a, 0x9c, 0x7a, 0x25, 0x93,
+ 0xef, 0x69, 0x9a, 0x3f, 0x38, 0x68, 0xbc, 0xfe, 0x2c, 0x37, 0x85, 0xaa,
+ 0x21, 0xbd, 0x37, 0x09, 0x22, 0x37, 0xf2, 0x36, 0xe3, 0x05, 0x37, 0x1b,
+ 0xf3, 0x9a, 0x5a, 0x5c, 0xf2, 0xfe, 0x44, 0x7b, 0x36, 0xee, 0x3e, 0x2f,
+ 0xbb, 0x60, 0x6e, 0x6d, 0x21, 0x4e, 0x15, 0x92, 0xf6, 0x1f, 0x9b, 0x32,
+ 0x83, 0x58, 0x8c, 0x6e, 0x9c, 0xa2, 0xab, 0x4e, 0x61, 0xae, 0xc2, 0xc6,
+ 0x98, 0x14, 0x1a, 0x96, 0x41, 0xa0, 0x0f, 0x70, 0x4c, 0xfd, 0xb9, 0x1a,
+ 0xb1, 0x53, 0x9c, 0xdf, 0x6a, 0xab, 0xe3, 0xa4, 0x69, 0x23, 0xd7, 0xb1,
+ 0x2d, 0x40, 0xd1, 0x38, 0xb8, 0x6a, 0xbc, 0xe5, 0x33, 0xd3, 0x04, 0x37,
+ 0x6a, 0xac, 0x28, 0xf0, 0x0e, 0xeb, 0x4f, 0xc4, 0x75, 0xef, 0x36, 0xf9,
+ 0xaf, 0xfe, 0x1a, 0xd0, 0xcf, 0x99, 0x54, 0xb7, 0xd5, 0x69, 0xb2, 0xff,
+ 0x83, 0xa0, 0xe8, 0x0b, 0xef, 0x1e, 0x47, 0x8b, 0x72, 0xb2, 0xd3, 0x97,
+ 0x0b, 0xc8, 0x55, 0x5b, 0x7d, 0x66, 0x4d, 0xa4, 0x42, 0x61, 0xf7, 0x79,
+ 0x6c, 0x10, 0x22, 0x81, 0x41, 0x44, 0x91, 0x65, 0x29, 0x26, 0x17, 0x34,
+ 0x29, 0xb2, 0x39, 0xc0, 0xe2, 0x7b, 0xf9, 0xea, 0xc3, 0x15, 0xe7, 0xf4,
+ 0x19, 0x9e, 0x83, 0x84, 0xcb, 0x7d, 0x20, 0xae, 0x3a, 0xdf, 0xd4, 0x5d,
+ 0x30, 0x6a, 0xf3, 0x01, 0xe7, 0xa5, 0xe4, 0x99, 0x3d, 0x7e, 0xef, 0x57,
+ 0x0a, 0x53, 0xe9, 0x01, 0x93, 0x85, 0x24, 0x73, 0x56, 0x46, 0xbb, 0x4c,
+ 0x00, 0x12, 0xd5, 0xb3, 0xe8, 0x19, 0xfe, 0xc9, 0x23, 0xe0, 0xd4, 0xe4,
+ 0x59, 0x77, 0xc8, 0xca, 0x66, 0xde, 0x4e, 0x3e, 0xd4, 0xcb, 0x02, 0x6e,
+ 0x76, 0xe7, 0x51, 0x9e, 0x70, 0x2e, 0x77, 0xd9, 0xa6, 0xcd, 0x99, 0xf6,
+ 0xaf, 0x17, 0x4b, 0xfb, 0x6d, 0x61, 0x5d, 0x78, 0xb6, 0x42, 0x83, 0x6b,
+ 0x21, 0x83, 0x51, 0x91, 0x69, 0x27, 0x8c, 0xc6, 0xd7, 0x4a, 0xe7, 0xf6,
+ 0x00, 0x06, 0x17, 0x5b, 0xa5, 0x99, 0x87, 0x12, 0x38, 0x6e, 0x3a, 0x37,
+ 0xee, 0xad, 0x39, 0x97, 0xa8, 0x54, 0x93, 0x14, 0x13, 0xf4, 0x85, 0x34,
+ 0xfb, 0xea, 0xa6, 0xca, 0xaa, 0x57, 0x76, 0xd7, 0x05, 0x26, 0xc5, 0x32,
+ 0x7c, 0x7f, 0x52, 0xf7, 0x96, 0xec, 0x38, 0xc3, 0x77, 0x0d, 0x07, 0xde,
+ 0xe9, 0x83, 0x1f, 0x2c, 0x8a, 0x82, 0xac, 0x73, 0x10, 0x66, 0x7e, 0x44,
+ 0x16, 0x99, 0x05, 0xf7, 0x68, 0xc2, 0x5b, 0xd5, 0xa8, 0xb8, 0xac, 0xdd,
+ 0x98, 0x16, 0x21, 0xc3, 0xa5, 0xbc, 0xbe, 0xa9, 0xc2, 0xbf, 0xb0, 0x2d,
+ 0xf1, 0x31, 0xcd, 0x1a, 0x0b, 0x31, 0x90, 0xbf, 0x22, 0x94, 0x60, 0x36,
+ 0x86, 0xf6, 0x3d, 0x0e, 0x24, 0xea, 0x1a, 0xdc, 0x8b, 0x09, 0x83, 0xc2,
+ 0xf3, 0x80, 0x9c, 0xc1, 0x39, 0x9a, 0x6f, 0x65, 0xcf, 0x64, 0x9e, 0xa9,
+ 0x73, 0x87, 0x64, 0xce, 0xd4, 0xc2, 0xde, 0x8f, 0x25, 0x8a, 0x83, 0xa1,
+ 0xfa, 0xf5, 0x48, 0xd2, 0xbd, 0xc1, 0x4f, 0x58, 0x9b, 0x89, 0x12, 0x38,
+ 0x90, 0x54, 0xaf, 0xd4, 0x35, 0x6a, 0xa2, 0x42, 0x54, 0xdb, 0xb4, 0xa5,
+ 0xae, 0xd6, 0xd6, 0xbd, 0xe7, 0x4f, 0xda, 0xc8, 0xce, 0xd8, 0x24, 0x62,
+ 0xb6, 0x0a, 0x80, 0x2b, 0x41, 0x30, 0xfe, 0x14, 0x79, 0xa1, 0xaa, 0xb2,
+ 0xfa, 0xa8, 0x74, 0x1e, 0x22, 0x77, 0x1e, 0x05, 0xaf, 0xb0, 0x32, 0xce,
+ 0xba, 0x1b, 0xb5, 0xb5, 0x10, 0xab, 0x59, 0x7a, 0x90, 0x4e, 0xd4, 0x89,
+ 0x62, 0x5f, 0xcc, 0x0e, 0x32, 0x29, 0x17, 0x24, 0x41, 0x94, 0x27, 0x9f,
+ 0xff, 0x8a, 0xe4, 0x01, 0xb7, 0xc5, 0xdb, 0x94, 0xaf, 0x84, 0x3a, 0xcc,
+ 0x13, 0x50, 0x25, 0xb1, 0x2a, 0x87, 0x2b, 0x32, 0x84, 0x56, 0x0c, 0xea,
+ 0xda, 0xf4, 0x6d, 0xb2, 0xf1, 0x5c, 0xed, 0xfc, 0x17, 0x6a, 0x9e, 0x1b,
+ 0x6b, 0xe3, 0x54, 0x3c, 0x05, 0xfa, 0x92, 0x73, 0x6d, 0x9b, 0xfe, 0xf8,
+ 0x7d, 0x7a, 0xfb, 0x95, 0x94, 0xe0, 0x30, 0xad, 0x7c, 0x20, 0xa6, 0xc4,
+ 0x9b, 0x9e, 0xd3, 0xe8, 0x76, 0x64, 0xea, 0x9b, 0x16, 0x08, 0x49, 0xab,
+ 0x26, 0xa3, 0xd4, 0xbe, 0x16, 0x15, 0x28, 0x79, 0x12, 0x2f, 0x2c, 0x64,
+ 0xa3, 0x1e, 0x12, 0xf1, 0xcd, 0xed, 0x88, 0xb1, 0x37, 0xc0, 0x4f, 0x4d,
+ 0x8d, 0xe4, 0xc9, 0x00, 0x00, 0x00, 0x82, 0x74, 0x71, 0xaf, 0xff, 0xff,
+ 0xfd, 0x85, 0x62, 0x25, 0xb6, 0x91, 0x1e, 0x44, 0x9b, 0x4b, 0x3b, 0xd9,
+ 0x55, 0x21, 0xb7, 0x25, 0x79, 0x39, 0x5f, 0xb1, 0x02, 0x3d, 0xe4, 0xb1,
+ 0x75, 0x32, 0x03, 0x0b, 0x95, 0xc9, 0xbd, 0x37, 0xe4, 0x8a, 0x26, 0xd7,
+ 0x3b, 0x1b, 0xed, 0x05, 0xee, 0x89, 0xba, 0xa3, 0xd2, 0x6f, 0xd3, 0x65,
+ 0x92, 0x56, 0x16, 0x29, 0x49, 0xb0, 0x10, 0x82, 0x17, 0xa1, 0x06, 0xc7,
+ 0xfc, 0xbb, 0x75, 0xaa, 0xfc, 0xd7, 0x68, 0x62, 0x85, 0x4e, 0xb7, 0x41,
+ 0x10, 0x45, 0xb1, 0x5f, 0xef, 0x48, 0xf7, 0x1e, 0x6c, 0x2d, 0x26, 0xa5,
+ 0x99, 0xd3, 0x6d, 0xae, 0x52, 0xc4, 0x0a, 0xd1, 0x14, 0x1b, 0x02, 0x7f,
+ 0xd8, 0x16, 0xeb, 0xcd, 0x59, 0x7f, 0xec, 0x5e, 0xc6, 0x94, 0x22, 0xe1,
+ 0xcd, 0x09, 0x86, 0x0a, 0x0d, 0x73, 0xed, 0x09, 0x97, 0x88, 0x3c, 0x0e,
+ 0x54, 0x9b, 0xff, 0x77, 0x41, 0x32, 0x9e, 0x68, 0x3d, 0xcf, 0x8b, 0xda,
+ 0x47, 0x75, 0x8b, 0x03, 0xb9, 0x62, 0x81, 0xa5, 0xce, 0x37, 0xa3, 0x3f,
+ 0x3f, 0x87, 0xfe, 0x1b, 0xdd, 0x2a, 0xdb, 0x1c, 0x98, 0x41, 0x28, 0xd0,
+ 0xac, 0xe1, 0x9f, 0x80, 0xb3, 0x4c, 0x4b, 0xe9, 0x2b, 0xa9, 0xdd, 0x25,
+ 0x25, 0x14, 0x7c, 0xe9, 0x5f, 0x89, 0x91, 0x6b, 0xec, 0x6f, 0xf7, 0x8c,
+ 0xab, 0x8c, 0x8a, 0x28, 0x26, 0x79, 0x36, 0xbf, 0xbb, 0xfe, 0x4d, 0x46,
+ 0x59, 0x75, 0x98, 0xb3, 0x37, 0xe5, 0x1b, 0x3d, 0x4c, 0xdc, 0xf4, 0x9d,
+ 0x7e, 0xdc, 0xdf, 0x73, 0x47, 0x94, 0xcd, 0x32, 0x4a, 0x2a, 0x31, 0x6f,
+ 0x91, 0x92, 0x31, 0xba, 0xbc, 0xc2, 0xfb, 0x54, 0xb9, 0x0e, 0x61, 0x1a,
+ 0x91, 0xa7, 0x83, 0x0f, 0xee, 0xc7, 0x72, 0xd6, 0x69, 0x1b, 0x5a, 0xf7,
+ 0x8e, 0x5e, 0x7f, 0xc2, 0xfe, 0x3a, 0xb3, 0x7d, 0x1d, 0x91, 0x44, 0xa8,
+ 0x29, 0x05, 0x8f, 0x11, 0x23, 0x9b, 0xda, 0xf0, 0xc8, 0x6c, 0xf2, 0x43,
+ 0x81, 0x70, 0xb4, 0x98, 0x84, 0xa7, 0x83, 0x0b, 0x14, 0x22, 0xfb, 0xe9,
+ 0x16, 0x96, 0xbc, 0xe2, 0x47, 0x33, 0xcc, 0x3a, 0x62, 0xf9, 0xc9, 0xdf,
+ 0x89, 0x65, 0xcd, 0x61, 0xfe, 0x7a, 0x56, 0xe5, 0xd1, 0x5a, 0x09, 0x64,
+ 0xbf, 0x7b, 0x29, 0x58, 0x1b, 0x25, 0x71, 0x7e, 0xfb, 0x19, 0x00, 0x4c,
+ 0x85, 0x74, 0xe2, 0xe0, 0x9b, 0x59, 0x1b, 0x84, 0xee, 0xe2, 0x42, 0x75,
+ 0xc3, 0x76, 0x29, 0xf3, 0x79, 0x0f, 0xe0, 0x4a, 0x42, 0xbd, 0x28, 0x70,
+ 0xc9, 0x86, 0x6e, 0x8f, 0xfe, 0x28, 0xa4, 0xe8, 0x97, 0xeb, 0xaa, 0xb2,
+ 0x3e, 0x04, 0x95, 0xd8, 0x7f, 0x4e, 0x49, 0x7a, 0x95, 0x9a, 0xea, 0xd2,
+ 0x92, 0x98, 0xcd, 0xe2, 0x6b, 0x6d, 0xf0, 0xd1, 0xb2, 0xae, 0x52, 0x6e,
+ 0x9b, 0xce, 0x24, 0xa1, 0x66, 0x52, 0x66, 0xd1, 0x6b, 0xbd, 0xb3, 0xc7,
+ 0x47, 0x91, 0x30, 0x18, 0x13, 0xd0, 0xa7, 0xe3, 0x61, 0xd7, 0x0c, 0x51,
+ 0x35, 0x6f, 0xb6, 0xe8, 0xfe, 0xf9, 0x50, 0x24, 0xc0, 0x56, 0x8b, 0x18,
+ 0xe3, 0xae, 0x4e, 0x1b, 0x08, 0x8e, 0x09, 0xa2, 0x1c, 0xeb, 0x97, 0x18,
+ 0xe3, 0x0c, 0x4b, 0x62, 0xf3, 0xea, 0x76, 0xf8, 0x82, 0xb9, 0xc1, 0xc2,
+ 0x5a, 0x92, 0x42, 0x2d, 0x2d, 0x04, 0xef, 0x06, 0x86, 0x8f, 0xb9, 0xda,
+ 0x0a, 0x31, 0x3c, 0x14, 0xf5, 0x01, 0x6e, 0x88, 0xc5, 0x70, 0xeb, 0xaf,
+ 0xad, 0x33, 0x21, 0x18, 0xe8, 0xbd, 0xe9, 0x32, 0x63, 0x0a, 0xe8, 0xf0,
+ 0xfe, 0xdc, 0x14, 0x4d, 0x5a, 0x9d, 0xc6, 0xd4, 0xad, 0x24, 0x1f, 0x3c,
+ 0xe5, 0xdf, 0x14, 0x1d, 0xd4, 0x32, 0xc5, 0x25, 0x78, 0xbf, 0x67, 0x84,
+ 0x37, 0x51, 0x59, 0x41, 0xb9, 0x65, 0x22, 0xf1, 0x44, 0xfe, 0x12, 0x60,
+ 0xab, 0x47, 0x00, 0x79, 0x50, 0x0a, 0x3a, 0x26, 0x2b, 0x92, 0xb7, 0x0b,
+ 0xf0, 0x6a, 0xee, 0xc5, 0x41, 0x18, 0x98, 0x90, 0xe0, 0xd5, 0x1c, 0xef,
+ 0x78, 0xa5, 0x6f, 0xeb, 0x13, 0xb5, 0x7f, 0xa6, 0xeb, 0x06, 0x6c, 0xf1,
+ 0xad, 0x44, 0xaf, 0x8b, 0xc2, 0x74, 0x9b, 0x39, 0x99, 0xda, 0xee, 0xfe,
+ 0x07, 0x54, 0x9f, 0xc3, 0x05, 0x5e, 0x2d, 0x0a, 0x13, 0x1c, 0x50, 0x90,
+ 0x43, 0x44, 0x5a, 0x6c, 0x34, 0xe5, 0xec, 0x71, 0x4e, 0x37, 0x5c, 0xa4,
+ 0xa9, 0x84, 0x48, 0x80, 0x3d, 0xb6, 0x69, 0xa2, 0x84, 0x2d, 0xe7, 0xbd,
+ 0x05, 0x9d, 0xd7, 0x40, 0x05, 0xf6, 0x69, 0x06, 0xf5, 0x16, 0x3f, 0xed,
+ 0x09, 0xa0, 0x3e, 0x5b, 0x5c, 0x61, 0x7c, 0x6b, 0xc6, 0xb8, 0x77, 0x77,
+ 0x24, 0x12, 0x72, 0xfc, 0xf3, 0xf7, 0x31, 0xce, 0x04, 0xe9, 0xd7, 0x5a,
+ 0x84, 0x2e, 0xaf, 0x69, 0x04, 0x58, 0x38, 0x4b, 0xf4, 0x20, 0x3e, 0xf6,
+ 0x25, 0x89, 0x5f, 0xb3, 0x02, 0x72, 0x59, 0x4b, 0x82, 0x9f, 0x98, 0x3a,
+ 0x09, 0x32, 0xb6, 0x94, 0xdc, 0x52, 0xbb, 0xe0, 0x5f, 0xef, 0xd2, 0x7e,
+ 0x5b, 0x13, 0x9d, 0x96, 0x12, 0x10, 0xbf, 0x01, 0xb4, 0x31, 0xcc, 0xfd,
+ 0xee, 0x27, 0x9c, 0xdc, 0x56, 0xae, 0x9a, 0x94, 0xb9, 0xde, 0xcf, 0xf4,
+ 0x39, 0x80, 0x8f, 0xbe, 0x3e, 0xc9, 0x94, 0xe5, 0xaa, 0xb7, 0x77, 0xd0,
+ 0xb7, 0xaf, 0x83, 0xee, 0x3c, 0xa3, 0xe2, 0x22, 0xd8, 0xf1, 0x48, 0xcd,
+ 0xfe, 0x72, 0x2f, 0x7e, 0x36, 0xe9, 0x5e, 0xb8, 0x27, 0x05, 0xe6, 0x18,
+ 0xb9, 0x5d, 0x78, 0x5e, 0x01, 0x59, 0xd1, 0xe8, 0x3f, 0x5a, 0xf9, 0xaf,
+ 0x93, 0x68, 0x9f, 0x8e, 0xdd, 0xc6, 0xcb, 0x7c, 0xbe, 0x1e, 0x51, 0x9e,
+ 0x64, 0x48, 0xd0, 0x13, 0xfb, 0x63, 0xfe, 0xa5, 0x5c, 0xcb, 0x79, 0xb6,
+ 0xc7, 0xac, 0xe6, 0x89, 0xb9, 0x08, 0x8a, 0xb6, 0x3e, 0x63, 0xf2, 0x17,
+ 0x2c, 0x34, 0xa4, 0x30, 0xb7, 0x06, 0x41, 0x7c, 0x04, 0xa8, 0xf9, 0xe5,
+ 0x5b, 0x6f, 0x5a, 0x9d, 0x73, 0x5a, 0x60, 0x7a, 0x60, 0x1f, 0x7c, 0x32,
+ 0x5a, 0xa3, 0xb1, 0xc7, 0xf8, 0x20, 0x91, 0xb1, 0x85, 0xb8, 0xd3, 0x3a,
+ 0xd3, 0x7e, 0x55, 0x60, 0xba, 0x46, 0x43, 0x8c, 0x46, 0xdf, 0xa9, 0x3e,
+ 0xb8, 0x13, 0x52, 0x2c, 0x5c, 0xad, 0x4d, 0x26, 0x54, 0x87, 0x63, 0x3c,
+ 0x9a, 0x12, 0x95, 0x4c, 0x21, 0x28, 0xbc, 0xc5, 0xa1, 0x24, 0xc0, 0x11,
+ 0x9d, 0x28, 0x50, 0xb2, 0x10, 0xd9, 0x7f, 0x69, 0xaf, 0xc0, 0x14, 0xe6,
+ 0xeb, 0x73, 0xfc, 0xb8, 0x90, 0xb5, 0x06, 0x49, 0xc9, 0x73, 0x99, 0xfb,
+ 0x6e, 0x4d, 0x85, 0x0f, 0x1c, 0x76, 0x5b, 0x9e, 0x67, 0x22, 0x3a, 0x9e,
+ 0x85, 0xf6, 0x9f, 0x76, 0xe7, 0x55, 0xeb, 0xe6, 0xba, 0x16, 0xa4, 0x7a,
+ 0x73, 0xa7, 0xe1, 0xd9, 0xf9, 0x3c, 0x2f, 0xc1, 0x48, 0x46, 0xc2, 0x0a,
+ 0x0a, 0xd3, 0xd2, 0x59, 0x7c, 0x6e, 0xaf, 0xf0, 0xa5, 0x28, 0x62, 0xd1,
+ 0xb3, 0xd3, 0xe9, 0xf1, 0xcc, 0x2c, 0x1c, 0x04, 0xe6, 0x92, 0x2b, 0xce,
+ 0x8f, 0xbd, 0xce, 0x1f, 0x55, 0xc3, 0x29, 0xad, 0x24, 0x01, 0xfa, 0x3f,
+ 0xba, 0x88, 0x35, 0x74, 0x53, 0x56, 0xda, 0x50, 0x68, 0x66, 0x66, 0xb9,
+ 0xe2, 0x70, 0x70, 0x68, 0x1b, 0x6b, 0x16, 0xc4, 0xef, 0x8e, 0x58, 0x10,
+ 0x21, 0x37, 0x54, 0x1a, 0x23, 0xa3, 0x1e, 0x39, 0x56, 0xb3, 0x5a, 0x18,
+ 0x38, 0xf1, 0xef, 0xb4, 0x9a, 0xdc, 0x00, 0x0c, 0xcf, 0xcc, 0x0b, 0xc2,
+ 0xf1, 0xea, 0x05, 0xf7, 0xd9, 0xe8, 0xe1, 0xeb, 0x16, 0x28, 0x7f, 0x6d,
+ 0x0d, 0x2c, 0xfb, 0x8e, 0x71, 0x41, 0x99, 0xe8, 0x53, 0x1b, 0x4f, 0xbf,
+ 0xff, 0x1d, 0x4b, 0xfd, 0x83, 0xe1, 0x2a, 0x58, 0x96, 0xe8, 0x31, 0x55,
+ 0xd2, 0xb8, 0x39, 0xd8, 0x18, 0x26, 0x91, 0xfb, 0xac, 0x76, 0xbd, 0x52,
+ 0x65, 0xac, 0x37, 0xef, 0x3c, 0xde, 0x2f, 0xb0, 0x76, 0x55, 0xd4, 0xeb,
+ 0xd1, 0x1b, 0x1a, 0x3f, 0x43, 0x22, 0x35, 0x78, 0x43, 0x45, 0xb5, 0xaf,
+ 0x9b, 0x04, 0x11, 0x24, 0x4f, 0xe8, 0xde, 0xdd, 0x03, 0xd0, 0x5e, 0x50,
+ 0xd6, 0x1f, 0x7c, 0x4a, 0xc4, 0x9d, 0xb0, 0x9c, 0x85, 0x09, 0xb1, 0x89,
+ 0x18, 0x7f, 0x4a, 0x85, 0x9f, 0x7d, 0x2a, 0xfe, 0x7a, 0xb7, 0xfa, 0x66,
+ 0xd3, 0xe4, 0x28, 0x91, 0xea, 0xb7, 0xd9, 0x8a, 0x11, 0x8f, 0x6c, 0x25,
+ 0x65, 0x1a, 0x99, 0xb2, 0x0b, 0x4e, 0x20, 0x97, 0x9b, 0x43, 0x44, 0x6c,
+ 0xc0, 0xe6, 0x81, 0x76, 0x95, 0xd9, 0xd8, 0x01, 0x3c, 0xc9, 0x6f, 0x1f,
+ 0xf3, 0xfa, 0x0f, 0x13, 0x1b, 0x1f, 0xaa, 0x84, 0x5e, 0xbe, 0xec, 0x4e,
+ 0xb3, 0x2e, 0x0b, 0x16, 0x41, 0x2d, 0xfb, 0xb9, 0x9b, 0x59, 0xb7, 0x8d,
+ 0xd9, 0x61, 0xa3, 0x88, 0x7f, 0xc2, 0x4d, 0x87, 0x65, 0xc0, 0xf1, 0x67,
+ 0xf7, 0xc0, 0x0d, 0xc5, 0xcd, 0x56, 0x50, 0xc3, 0x93, 0xd7, 0x34, 0xb1,
+ 0xae, 0xb4, 0x47, 0x7b, 0xf4, 0x3d, 0x55, 0x99, 0xb7, 0x92, 0xc5, 0x34,
+ 0x94, 0x7b, 0x76, 0x1f, 0x26, 0x70, 0x0a, 0xce, 0xa8, 0xd7, 0x9f, 0x1d,
+ 0x63, 0x46, 0xcd, 0x0a, 0x36, 0x0b, 0x8c, 0x98, 0xd9, 0xc4, 0x1b, 0x16,
+ 0x69, 0x60, 0x47, 0xeb, 0x5a, 0xf1, 0xec, 0x33, 0x88, 0xac, 0x5c, 0x45,
+ 0xc0, 0x5a, 0x55, 0x53, 0x59, 0x3d, 0xee, 0xc1, 0xc5, 0xfa, 0x82, 0xe5,
+ 0x44, 0x83, 0xca, 0xa7, 0x0b, 0x1d, 0xc2, 0xaa, 0x6f, 0xe9, 0x73, 0x0c,
+ 0xf1, 0x37, 0x32, 0xab, 0xea, 0xe7, 0x08, 0x90, 0x52, 0x01, 0x6e, 0x80,
+ 0x8f, 0x03, 0x59, 0x3d, 0xc4, 0xcf, 0x2f, 0x1b, 0xce, 0xd8, 0x95, 0x23,
+ 0xfc, 0x9e, 0x8e, 0x0f, 0x6a, 0x20, 0xe8, 0xcf, 0x3f, 0xc6, 0x32, 0x42,
+ 0x74, 0x7f, 0x31, 0xef, 0x2d, 0xba, 0x52, 0x59, 0xfc, 0x9e, 0x0d, 0x86,
+ 0x4d, 0xd5, 0x1b, 0x94, 0x5a, 0x61, 0xc7, 0x9f, 0x06, 0x96, 0x6a, 0xaa,
+ 0x39, 0x2a, 0x94, 0x44, 0xf0, 0x7f, 0x67, 0x5b, 0x50, 0x93, 0xaa, 0xdf,
+ 0xcc, 0x40, 0xb9, 0x8a, 0xb8, 0x27, 0x41, 0x95, 0xcf, 0x91, 0xcf, 0x59,
+ 0xf6, 0x57, 0xc9, 0x55, 0x70, 0xae, 0xd7, 0xb6, 0x26, 0x02, 0xd2, 0x41,
+ 0x53, 0x72, 0xc8, 0xb3, 0xc7, 0x97, 0x39, 0x3d, 0x6a, 0x58, 0x60, 0xc1,
+ 0x14, 0xd2, 0x8b, 0x0a, 0x0a, 0x4a, 0xbe, 0xb2, 0xbe, 0x40, 0xc6, 0x4a,
+ 0x3c, 0xd2, 0xbd, 0xc6, 0x1a, 0x71, 0x2f, 0x8a, 0x76, 0x4d, 0x45, 0xe0,
+ 0xcb, 0x6d, 0xec, 0x74, 0x15, 0x24, 0x93, 0xf4, 0xf8, 0xcc, 0x5f, 0x27,
+ 0x4c, 0xe7, 0x29, 0x38, 0x4d, 0xa0, 0x1f, 0x7e, 0x8e, 0x8f, 0x36, 0x9c,
+ 0x2d, 0x3c, 0xd5, 0x90, 0x05, 0x77, 0x85, 0xd0, 0x58, 0xb9, 0x65, 0xd0,
+ 0x4b, 0x5c, 0x27, 0xe0, 0xc9, 0xff, 0x90, 0xfe, 0x8e, 0xd5, 0xf9, 0xf7,
+ 0x62, 0xf5, 0xa4, 0xbe, 0x58, 0xa2, 0x82, 0x29, 0x8a, 0x71, 0xd1, 0x68,
+ 0xba, 0x7e, 0x72, 0x02, 0x52, 0xeb, 0xf7, 0x01, 0x6b, 0x7b, 0x29, 0x93,
+ 0x4b, 0xd2, 0x84, 0x1f, 0xdf, 0x4b, 0x6a, 0x24, 0xd8, 0xc5, 0xd6, 0x13,
+ 0x94, 0xab, 0x7b, 0xfc, 0x17, 0xa0, 0x21, 0xf1, 0xbe, 0xcd, 0xba, 0x9b,
+ 0xcb, 0xe0, 0x3b, 0xda, 0x45, 0x0a, 0x84, 0x45, 0x99, 0x20, 0x9a, 0x30,
+ 0x23, 0xd8, 0xd8, 0x91, 0xaa, 0xb7, 0x3f, 0x30, 0xc9, 0x6e, 0xcb, 0x4d,
+ 0xdf, 0x8a, 0x9d, 0x75, 0x35, 0x8a, 0xbb, 0x93, 0xe3, 0x0c, 0x97, 0x3e,
+ 0xdf, 0x8f, 0xc6, 0xec, 0x70, 0xc4, 0x39, 0x7f, 0x05, 0xae, 0xa6, 0x0f,
+ 0x23, 0x1f, 0xac, 0x0f, 0xdd, 0xe4, 0x1a, 0xa1, 0x16, 0x03, 0x0b, 0xd5,
+ 0xa5, 0x79, 0x7b, 0xab, 0x3d, 0xe1, 0xc1, 0xaa, 0x5e, 0x3b, 0xf5, 0x83,
+ 0x8e, 0x38, 0x8c, 0x95, 0x8f, 0xfc, 0xf0, 0xb5, 0x70, 0x90, 0xc3, 0xe6,
+ 0x26, 0x86, 0x1c, 0x0c, 0xd8, 0x71, 0x22, 0x63, 0xb7, 0xe1, 0x8a, 0x64,
+ 0xe0, 0x2e, 0x1b, 0x2d, 0x12, 0x30, 0x2a, 0x65, 0x32, 0xdb, 0xf0, 0x2d,
+ 0x3b, 0xbb, 0x35, 0xd7, 0x05, 0x9f, 0x87, 0x1e, 0xad, 0x46, 0xeb, 0x8c,
+ 0x41, 0x10, 0x8d, 0xb2, 0xb3, 0x49, 0x68, 0xb7, 0x40, 0x5a, 0xae, 0x92,
+ 0xa6, 0xba, 0xae, 0x18, 0xab, 0xfb, 0x01, 0xd7, 0xb4, 0xe4, 0xfc, 0xdd,
+ 0x49, 0xd7, 0x16, 0x81, 0xd5, 0xb0, 0x5c, 0xb6, 0x9d, 0xcf, 0x3f, 0x92,
+ 0x67, 0x6e, 0xa9, 0x0d, 0x49, 0x77, 0xd8, 0x27, 0x6d, 0xd4, 0xe3, 0xb0,
+ 0x53, 0xac, 0xbc, 0x0f, 0xeb, 0xe1, 0x4e, 0x5d, 0x99, 0xce, 0x55, 0x41,
+ 0xa7, 0x96, 0x94, 0x0b, 0xa9, 0x00, 0x4b, 0xb6, 0xb4, 0xca, 0x8a, 0xe9,
+ 0x8a, 0xfc, 0xbe, 0x1c, 0xf4, 0x6c, 0x47, 0x99, 0xe2, 0x4a, 0x68, 0xc5,
+ 0x4c, 0x36, 0x40, 0xf7, 0xc4, 0xf2, 0xe0, 0x22, 0xbb, 0x18, 0x40, 0x8e,
+ 0x9f, 0xe9, 0x27, 0xea, 0x40, 0x0f, 0x26, 0xef, 0x7c, 0xad, 0xf3, 0xab,
+ 0x5f, 0x29, 0xdc, 0x6b, 0x9f, 0xab, 0xc5, 0xf5, 0x2a, 0x6c, 0x8c, 0x20,
+ 0xf6, 0xc7, 0xc4, 0x5a, 0x42, 0x7c, 0x99, 0x66, 0x6b, 0x25, 0x59, 0xee,
+ 0xe0, 0xf9, 0x4b, 0x05, 0x53, 0xac, 0x24, 0xf2, 0x0c, 0x87, 0xa5, 0xcb,
+ 0x6c, 0xed, 0x3e, 0x47, 0xec, 0x7b, 0x36, 0x9f, 0xb4, 0xfe, 0x3f, 0xfa,
+ 0x6d, 0xa4, 0x6b, 0x4e, 0x6e, 0x55, 0x32, 0xec, 0xd2, 0x0d, 0xba, 0x34,
+ 0xdc, 0x88, 0x98, 0xed, 0x8b, 0x45, 0xea, 0x6d, 0xd5, 0x01, 0xa7, 0xae,
+ 0xcd, 0x76, 0x44, 0x66, 0x9d, 0x7f, 0x8a, 0xee, 0x27, 0x26, 0x1d, 0xd2,
+ 0xdb, 0x69, 0xcc, 0xa5, 0xbb, 0xe5, 0x26, 0x87, 0xb2, 0xd7, 0x88, 0xb5,
+ 0x47, 0xe9, 0xe9, 0xc8, 0xd5, 0xcf, 0xdd, 0xfa, 0x09, 0xcb, 0xec, 0x26,
+ 0xab, 0xaa, 0x47, 0x12, 0x70, 0x5f, 0xa3, 0x9d, 0x65, 0xbb, 0x49, 0xc1,
+ 0xf6, 0x1e, 0x48, 0xea, 0x20, 0x73, 0x67, 0xc0, 0xa6, 0x4a, 0x95, 0x7f,
+ 0x41, 0x9e, 0x89, 0xb5, 0x02, 0x4f, 0x68, 0x2f, 0x64, 0x24, 0xc4, 0x82,
+ 0x0e, 0xe0, 0xe2, 0x07, 0x35, 0x98, 0x78, 0x8e, 0xc3, 0xba, 0x0b, 0xef,
+ 0x77, 0xe6, 0xbf, 0xe3, 0x23, 0x7b, 0xb4, 0x59, 0x11, 0xa1, 0xb7, 0xfc,
+ 0xce, 0x8a, 0x52, 0xa8, 0x34, 0x3f, 0x70, 0x8a, 0xd4, 0x1d, 0x0f, 0x13,
+ 0xfa, 0xf2, 0x67, 0x36, 0x6a, 0x42, 0x08, 0x6e, 0xc9, 0x5d, 0x98, 0xd6,
+ 0xc4, 0xc9, 0x19, 0xd3, 0x2f, 0xcd, 0xbd, 0x65, 0x72, 0xeb, 0x41, 0x83,
+ 0x10, 0x66, 0x54, 0x16, 0x25, 0xe1, 0xca, 0x17, 0x4e, 0x1c, 0x7b, 0x9f,
+ 0xb0, 0xf9, 0x2b, 0x81, 0xe6, 0xb7, 0x2d, 0x8b, 0x5f, 0xf3, 0xb3, 0xca,
+ 0x97, 0x82, 0x4e, 0x25, 0x77, 0xfe, 0x16, 0x74, 0xd2, 0x35, 0x12, 0x15,
+ 0xec, 0x8c, 0x83, 0x0a, 0xca, 0x21, 0x31, 0x68, 0x8b, 0xd7, 0x58, 0x46,
+ 0x24, 0x31, 0x26, 0xf5, 0x90, 0xdb, 0x7b, 0x3f, 0xe5, 0xbb, 0x1a, 0x28,
+ 0x54, 0x89, 0xfe, 0xa2, 0x60, 0x04, 0xdc, 0x09, 0x11, 0x6c, 0x6c, 0x66,
+ 0x14, 0x69, 0x28, 0x81, 0x9d, 0x52, 0x63, 0xbf, 0x7f, 0xe9, 0xfe, 0x62,
+ 0x48, 0x1c, 0x0a, 0xfe, 0x19, 0x28, 0x09, 0x2a, 0x83, 0xdd, 0xa8, 0x82,
+ 0xeb, 0xe7, 0x6b, 0xe5, 0x23, 0x7c, 0x58, 0x3e, 0xcd, 0x38, 0x32, 0xbe,
+ 0x47, 0xe4, 0x28, 0x96, 0xce, 0x77, 0x70, 0x7e, 0x65, 0xd9, 0xb1, 0x1b,
+ 0xef, 0x7e, 0x51, 0xf6, 0xac, 0xf0, 0x6c, 0xe5, 0xc7, 0x38, 0x03, 0xf7,
+ 0x9d, 0xf1, 0x73, 0x56, 0x02, 0xf1, 0xc2, 0x0f, 0x41, 0x27, 0x9f, 0x67,
+ 0xd3, 0xa6, 0x30, 0x29, 0x81, 0x65, 0x0b, 0x02, 0xf7, 0xac, 0xad, 0x4a,
+ 0xb0, 0x90, 0x63, 0x20, 0x11, 0x74, 0x28, 0xdd, 0xb7, 0x12, 0x76, 0xe9,
+ 0xe9, 0xe3, 0xcf, 0xae, 0xeb, 0x01, 0xbf, 0xf3, 0x82, 0x80, 0xdb, 0x00,
+ 0x08, 0xff, 0xe6, 0xce, 0x09, 0xfb, 0xc9, 0x3d, 0x31, 0x65, 0x39, 0x54,
+ 0x4a, 0x45, 0xc0, 0x1a, 0x1c, 0xb2, 0x90, 0x1e, 0x57, 0x50, 0xef, 0x3c,
+ 0x60, 0x5d, 0x1e, 0x4e, 0xa6, 0x0f, 0xab, 0xbb, 0x41, 0x8d, 0xf7, 0x4c,
+ 0xa6, 0xd8, 0xb2, 0x97, 0xfa, 0xfa, 0x47, 0xcf, 0xa1, 0xe7, 0x57, 0x73,
+ 0x74, 0xa0, 0x01, 0xf6, 0x6e, 0x92, 0x7a, 0xc0, 0x3f, 0x0d, 0x92, 0x49,
+ 0xa8, 0x28, 0xfd, 0xa2, 0x78, 0x9a, 0x3e, 0x15, 0x8a, 0x8a, 0x07, 0x05,
+ 0xc3, 0xd0, 0x24, 0x12, 0x25, 0x9a, 0x5a, 0x42, 0xfa, 0xfe, 0x9e, 0x41,
+ 0x21, 0xb5, 0xa5, 0x29, 0xb3, 0x09, 0xcb, 0x16, 0x70, 0x0f, 0xd0, 0x17,
+ 0x2b, 0x9f, 0xda, 0xf3, 0x29, 0x48, 0xa2, 0x32, 0xd7, 0x40, 0xb0, 0x4c,
+ 0x14, 0x1b, 0x33, 0xcd, 0x5d, 0x4f, 0xbe, 0x3a, 0x4a, 0x34, 0x2b, 0x6b,
+ 0xbe, 0x17, 0xc0, 0x86, 0x07, 0xfd, 0x2e, 0xc4, 0x8e, 0xec, 0xd7, 0x74,
+ 0xd7, 0x3a, 0xf7, 0x86, 0x6b, 0x55, 0x8a, 0xf5, 0x66, 0xd8, 0xb0, 0x41,
+ 0x5e, 0xc9, 0x3c, 0x21, 0x8e, 0x64, 0x55, 0xef, 0x95, 0xa3, 0x18, 0x64,
+ 0x18, 0xda, 0x8c, 0xd1, 0x29, 0xc5, 0xf3, 0xf0, 0xad, 0x38, 0x5f, 0xda,
+ 0x24, 0xf9, 0x66, 0xe0, 0xeb, 0xdc, 0xcb, 0x8b, 0x8e, 0xc9, 0x09, 0x0c,
+ 0x0e, 0xdd, 0xf3, 0x15, 0x86, 0xc3, 0xec, 0x38, 0x05, 0xdf, 0x27, 0x83,
+ 0xd6, 0x04, 0x68, 0xf0, 0x56, 0xa1, 0xd2, 0x02, 0xf0, 0x84, 0x41, 0x0b,
+ 0xdb, 0x66, 0xb3, 0x73, 0x86, 0x66, 0xce, 0x88, 0x4f, 0xb3, 0x39, 0x9c,
+ 0xa8, 0xca, 0xcf, 0x50, 0xd8, 0xa5, 0x6d, 0x56, 0x7b, 0x2c, 0xad, 0xc1,
+ 0x20, 0xc8, 0xec, 0x15, 0x2a, 0x88, 0x11, 0x3b, 0xea, 0xb2, 0xe6, 0x96,
+ 0xf4, 0x32, 0xdf, 0xf9, 0xa9, 0xaa, 0x37, 0x97, 0x68, 0xec, 0x7e, 0x7f,
+ 0x2b, 0x18, 0x2f, 0x0c, 0x75, 0x86, 0x53, 0x9d, 0x76, 0xf5, 0x98, 0x82,
+ 0xbb, 0x50, 0x86, 0xce, 0xdc, 0x0f, 0x43, 0x95, 0x89, 0x0e, 0x7f, 0x91,
+ 0x1d, 0x93, 0x70, 0x35, 0xef, 0x6a, 0x8e, 0x1c, 0x38, 0x58, 0xa5, 0x8f,
+ 0x2d, 0x8f, 0xea, 0x54, 0x70, 0xf1, 0xc8, 0x03, 0xce, 0x50, 0xd2, 0x23,
+ 0xdd, 0xd4, 0xc1, 0xd2, 0x12, 0x74, 0xbe, 0x79, 0x94, 0x2c, 0x45, 0x67,
+ 0x67, 0x6b, 0xa3, 0x4d, 0x22, 0x95, 0x91, 0x30, 0x7c, 0x8a, 0x30, 0x10,
+ 0x0a, 0x42, 0xcd, 0xaa, 0x46, 0x11, 0xf7, 0xa1, 0x87, 0x24, 0xfc, 0x0c,
+ 0xbb, 0x0c, 0xb7, 0x6f, 0x7f, 0x19, 0x09, 0x0a, 0x6b, 0x08, 0xc4, 0x2e,
+ 0x24, 0xec, 0xf8, 0x40, 0x69, 0x00, 0xad, 0x46, 0xda, 0x51, 0x74, 0xf5,
+ 0x8d, 0x76, 0x3e, 0x88, 0xd5, 0x7a, 0x87, 0xc9, 0x11, 0xce, 0x20, 0xc6,
+ 0x5d, 0x86, 0x44, 0x4b, 0xb3, 0x7a, 0x14, 0x83, 0x3a, 0x99, 0x82, 0x54,
+ 0x28, 0x69, 0x7b, 0x08, 0x09, 0x1e, 0x69, 0x86, 0x34, 0x0c, 0xdc, 0x3f,
+ 0x0a, 0x68, 0xd4, 0xc8, 0x09, 0x2b, 0x3e, 0x97, 0x7a, 0xc0, 0x11, 0x58,
+ 0x9b, 0xc8, 0x9a, 0x53, 0x4f, 0xbe, 0x42, 0x9a, 0x2b, 0xca, 0x7a, 0x27,
+ 0xc6, 0x54, 0x5d, 0xaf, 0x88, 0x0e, 0xe3, 0x22, 0x84, 0xad, 0xc2, 0xf5,
+ 0x8c, 0xd0, 0x55, 0xfc, 0x2a, 0x33, 0xe4, 0xd7, 0xbe, 0xc5, 0xcd, 0xe8,
+ 0x51, 0x82, 0xe5, 0xb8, 0xdb, 0x8a, 0x10, 0xd4, 0x3f, 0x93, 0x60, 0xf2,
+ 0xe6, 0x50, 0x93, 0xce, 0x43, 0xb6, 0x80, 0xb2, 0x2f, 0xb7, 0xff, 0x1a,
+ 0xdb, 0xb2, 0x7d, 0x71, 0xa2, 0x30, 0x93, 0x01, 0x4b, 0xaa, 0x03, 0x1a,
+ 0xf2, 0xce, 0x2b, 0x17, 0xcf, 0xcb, 0xa0, 0xe0, 0x5e, 0x03, 0xab, 0x71,
+ 0xc5, 0x04, 0x8f, 0x7c, 0x71, 0xce, 0x36, 0x1c, 0x29, 0xed, 0xfe, 0x11,
+ 0x7a, 0xfe, 0x6c, 0x82, 0xc8, 0x8d, 0xdb, 0x68, 0x25, 0x9d, 0xd2, 0x0f,
+ 0xd0, 0xa0, 0x26, 0xea, 0x8d, 0x03, 0xb4, 0xcb, 0x34, 0x0a, 0xf2, 0x23,
+ 0x4f, 0xe3, 0x8b, 0x62, 0xde, 0x22, 0xf0, 0x0c, 0x84, 0x05, 0xb4, 0xcf,
+ 0xa8, 0xb7, 0x95, 0xd2, 0x0a, 0xe7, 0x11, 0x19, 0x2a, 0xe9, 0x85, 0x5f,
+ 0x1e, 0x83, 0x22, 0x48, 0x4b, 0x2e, 0x9c, 0x0e, 0x1f, 0x44, 0x2c, 0xf2,
+ 0xdc, 0xc6, 0x4d, 0xb1, 0xc4, 0xfd, 0xe9, 0xaa, 0xb4, 0x93, 0x17, 0xf3,
+ 0xa7, 0xdd, 0x03, 0x68, 0xc3, 0x23, 0xd7, 0xd3, 0xcb, 0x53, 0x80, 0x66,
+ 0xb2, 0x96, 0x58, 0xea, 0x2e, 0x26, 0x76, 0xf8, 0xeb, 0x2d, 0x84, 0x1d,
+ 0xb2, 0x41, 0xd4, 0xdc, 0x9b, 0x94, 0x90, 0xb5, 0x6f, 0xde, 0xa3, 0x07,
+ 0x44, 0x91, 0xd5, 0xc5, 0x74, 0xb6, 0xbc, 0xbd, 0xc2, 0x0e, 0x28, 0xd4,
+ 0xd9, 0x1c, 0x7c, 0x5b, 0x47, 0xec, 0x17, 0x8a, 0x28, 0x2c, 0xcf, 0x8f,
+ 0xd5, 0xe4, 0x22, 0x67, 0x73, 0xde, 0xce, 0x35, 0xdb, 0x70, 0x2b, 0x83,
+ 0x65, 0x0b, 0xe0, 0x6a, 0x7a, 0x57, 0xdc, 0x88, 0x15, 0x1a, 0x54, 0xa2,
+ 0xdf, 0xc2, 0x4c, 0xca, 0x7f, 0xe0, 0x6a, 0xe7, 0x2d, 0x2e, 0x6b, 0xb5,
+ 0x92, 0xfd, 0xc8, 0x95, 0xe1, 0x50, 0xa2, 0x0a, 0xdd, 0x7d, 0x6c, 0x2a,
+ 0x0e, 0x00, 0x01, 0xc9, 0x6f, 0x73, 0x68, 0x0a, 0x47, 0x74, 0x61, 0xc4,
+ 0x7c, 0xd1, 0xe1, 0x7d, 0xd3, 0x86, 0xa8, 0xb4, 0xc8, 0x3c, 0x39, 0x87,
+ 0x1c, 0xa8, 0x36, 0x90, 0xd2, 0xcc, 0x8d, 0x56, 0xd0, 0x3a, 0xe7, 0x9a,
+ 0x97, 0x33, 0xd2, 0x88, 0x70, 0x90, 0x8b, 0x01, 0x17, 0x76, 0xb1, 0x49,
+ 0x55, 0x95, 0xed, 0x9c, 0x97, 0x80, 0xb5, 0xb2, 0x4b, 0x78, 0x49, 0x47,
+ 0x16, 0x02, 0xa6, 0x2a, 0xb0, 0x21, 0x84, 0x9f, 0x9d, 0xe1, 0xd4, 0x25,
+ 0x14, 0xaf, 0x30, 0xbe, 0xa0, 0x86, 0x05, 0x0e, 0x12, 0xe8, 0x07, 0x11,
+ 0xd8, 0xf0, 0xa3, 0x70, 0xe1, 0x9e, 0xf4, 0x1a, 0x50, 0xb2, 0x55, 0x7d,
+ 0xf4, 0xa8, 0x24, 0x5e, 0x79, 0x56, 0x1f, 0x93, 0x23, 0x6d, 0x50, 0x67,
+ 0x54, 0x9c, 0x96, 0xca, 0x1a, 0x69, 0xf8, 0xfe, 0xfa, 0xc7, 0x48, 0x6b,
+ 0xf9, 0x98, 0x61, 0x96, 0xa4, 0x94, 0x2d, 0x15, 0x6b, 0x44, 0x57, 0x23,
+ 0x06, 0xa3, 0x16, 0x91, 0x19, 0x7b, 0x02, 0xb4, 0x03, 0x8b, 0x79, 0xc3,
+ 0xb8, 0xc9, 0x25, 0xd5, 0x64, 0xa7, 0x42, 0xc3, 0xd3, 0x72, 0x2e, 0x6f,
+ 0x73, 0x85, 0xc9, 0x18, 0x1c, 0x8a, 0x7b, 0x8f, 0x4d, 0x49, 0xae, 0x00,
+ 0xe1, 0xe6, 0x4c, 0xb3, 0x9f, 0x37, 0xda, 0x2c, 0xd6, 0xd1, 0x33, 0x9b,
+ 0x3e, 0x97, 0x63, 0x44, 0xb1, 0x04, 0xc2, 0x63, 0x4a, 0x7a, 0x65, 0x14,
+ 0x24, 0xe9, 0x09, 0x9d, 0x48, 0x93, 0x72, 0x3c, 0xbd, 0x8b, 0x14, 0x95,
+ 0xb7, 0x84, 0x6d, 0x3f, 0xe7, 0xd6, 0xd1, 0x22, 0x9d, 0xd1, 0xb2, 0xd5,
+ 0x4e, 0xd2, 0xd3, 0x34, 0x0b, 0xea, 0x41, 0x54, 0xbc, 0x97, 0x4d, 0x96,
+ 0x77, 0x4d, 0xdc, 0xaf, 0xae, 0xbd, 0xa8, 0x42, 0x0d, 0x5d, 0x25, 0x4c,
+ 0x18, 0x8f, 0x89, 0xb9, 0x62, 0x3c, 0x57, 0x49, 0xa1, 0x07, 0x1e, 0xcb,
+ 0xb4, 0xf3, 0x43, 0x0b, 0x93, 0xfd, 0x12, 0x46, 0x32, 0xc4, 0x44, 0x5f,
+ 0x4e, 0xcd, 0x8d, 0xba, 0xb2, 0x47, 0x36, 0xde, 0x4c, 0x75, 0x81, 0x96,
+ 0xd8, 0xe4, 0x2f, 0xfe, 0x65, 0xb9, 0x1f, 0xa3, 0x60, 0x7d, 0xd4, 0x7e,
+ 0xa2, 0x9d, 0x2e, 0xd1, 0xba, 0x08, 0x1a, 0x39, 0x24, 0xc4, 0xab, 0xdb,
+ 0x16, 0xaf, 0x1d, 0x42, 0x55, 0x5e, 0x9a, 0xc5, 0xef, 0x2d, 0xb9, 0xab,
+ 0xe9, 0x32, 0xe8, 0x25, 0x69, 0xdb, 0x7b, 0x60, 0xb1, 0xe9, 0x90, 0x32,
+ 0x71, 0xb8, 0x33, 0xc7, 0x57, 0x0c, 0x50, 0x00, 0x97, 0x8c, 0x0f, 0x47,
+ 0x4c, 0x0c, 0x9f, 0x55, 0xac, 0x10, 0xfb, 0xd3, 0xe0, 0x81, 0x43, 0xba,
+ 0x06, 0x04, 0xaa, 0xf1, 0x1a, 0x33, 0x9e, 0x7b, 0xe8, 0xeb, 0xea, 0x05,
+ 0xff, 0x2c, 0x7e, 0xd4, 0x7d, 0xb4, 0xc1, 0xc3, 0xe4, 0xb5, 0x37, 0xc6,
+ 0x3c, 0x34, 0x34, 0x36, 0x76, 0x51, 0x67, 0x1a, 0x68, 0xe3, 0xee, 0x59,
+ 0x09, 0xb7, 0xe1, 0x19, 0x90, 0xb9, 0x4c, 0x89, 0xf4, 0x3b, 0x30, 0xce,
+ 0xe8, 0xa1, 0x90, 0xc6, 0xc3, 0x1f, 0x9e, 0x7e, 0x36, 0x0f, 0xd8, 0xac,
+ 0x84, 0x4e, 0xbd, 0x80, 0x06, 0x38, 0x77, 0x2a, 0x96, 0xa0, 0xef, 0xd9,
+ 0xf9, 0x54, 0xdf, 0x0b, 0x11, 0xdb, 0xf8, 0xb5, 0x21, 0xdd, 0x2d, 0xc6,
+ 0xc1, 0x09, 0x85, 0xec, 0x1b, 0xcb, 0x55, 0x14, 0x39, 0x13, 0xf9, 0xf5,
+ 0xc4, 0x65, 0xeb, 0xeb, 0x2e, 0xe7, 0x01, 0x47, 0x39, 0x9b, 0x57, 0x0f,
+ 0x1d, 0x64, 0x4d, 0xaf, 0x86, 0xaf, 0x7e, 0xc5, 0x88, 0x02, 0x7d, 0x2c,
+ 0x22, 0x70, 0xa8, 0x4d, 0x5c, 0x18, 0x5d, 0x7b, 0x07, 0x1a, 0x6b, 0x30,
+ 0x33, 0xff, 0x0b, 0x2e, 0xf6, 0x12, 0xa1, 0x2d, 0xe4, 0xab, 0x49, 0xa4,
+ 0x8d, 0xde, 0x12, 0xe5, 0x40, 0x79, 0xc3, 0x78, 0x68, 0xc2, 0x6a, 0x5f,
+ 0x7b, 0xe3, 0x00, 0x0d, 0xb8, 0xf1, 0x38, 0x29, 0x7d, 0xc9, 0x06, 0xd9,
+ 0x7e, 0xc8, 0xc3, 0x2c, 0xb1, 0x37, 0xf2, 0x01, 0x46, 0xf0, 0xca, 0xaa,
+ 0xed, 0xa1, 0xe6, 0x57, 0x2b, 0xc9, 0x28, 0x0a, 0x43, 0x77, 0x11, 0x55,
+ 0x78, 0x39, 0xb8, 0x0f, 0x70, 0x56, 0xc6, 0x3a, 0xf0, 0xa6, 0x92, 0xae,
+ 0x2b, 0xbf, 0x47, 0xc7, 0x25, 0xcd, 0xb1, 0x7e, 0x7f, 0x00, 0x0c, 0xab,
+ 0xa5, 0xe0, 0x1e, 0x18, 0x0a, 0xb4, 0xb2, 0x11, 0xd0, 0xab, 0x53, 0x8b,
+ 0x91, 0x63, 0x4a, 0x88, 0x94, 0xf7, 0xd1, 0x25, 0xa3, 0xa2, 0xb2, 0x60,
+ 0x77, 0x78, 0x8a, 0x82, 0xb8, 0x2e, 0xfb, 0x00, 0x37, 0x7e, 0xe9, 0xdd,
+ 0x80, 0x5c, 0x3a, 0x3e, 0x67, 0x32, 0x67, 0x44, 0xbe, 0x68, 0x61, 0xd8,
+ 0xa0, 0xcd, 0xb2, 0xb0, 0x7a, 0x79, 0x45, 0xdc, 0x94, 0x54, 0xd4, 0xa0,
+ 0xa4, 0xbb, 0x5a, 0x18, 0x85, 0x46, 0x8d, 0xe7, 0x26, 0x56, 0x92, 0x02,
+ 0xfd, 0x47, 0x9a, 0x32, 0x68, 0xc9, 0x03, 0x35, 0xd4, 0x70, 0x21, 0x8d,
+ 0x2f, 0x08, 0xab, 0x84, 0x30, 0xab, 0x27, 0x6e, 0x63, 0x50, 0xc6, 0x13,
+ 0x48, 0xc4, 0x60, 0xaf, 0xb1, 0xf7, 0xfd, 0x70, 0x62, 0xc4, 0x15, 0x23,
+ 0x16, 0x70, 0x1e, 0x3a, 0xe3, 0x47, 0x4f, 0xac, 0xdf, 0xd6, 0x5f, 0x96,
+ 0x51, 0x9b, 0x37, 0x40, 0x16, 0xb1, 0xce, 0xda, 0xd5, 0x7e, 0xe5, 0x64,
+ 0x06, 0x63, 0x03, 0x54, 0x34, 0xb3, 0xe9, 0x5c, 0x1e, 0x2e, 0x18, 0xe2,
+ 0x05, 0xf3, 0xe5, 0x35, 0x3b, 0x09, 0x15, 0xef, 0xb8, 0xc9, 0x7a, 0x3f,
+ 0x42, 0x51, 0x02, 0x7b, 0x3e, 0x3a, 0xcc, 0xf8, 0x5b, 0x95, 0x19, 0x99,
+ 0xd9, 0xa2, 0x93, 0x87, 0x44, 0x5c, 0x83, 0x25, 0xb6, 0xdd, 0x92, 0xdb,
+ 0x50, 0x3c, 0xde, 0x81, 0x08, 0x88, 0x86, 0xf3, 0x92, 0xbb, 0xa2, 0x6a,
+ 0x5a, 0x40, 0x69, 0x7f, 0xf4, 0xfc, 0x77, 0x92, 0xb5, 0x7d, 0xdf, 0x57,
+ 0x7c, 0x64, 0x8f, 0xd7, 0x73, 0x0b, 0x5c, 0xd5, 0x34, 0xa7, 0xce, 0xaa,
+ 0xb6, 0x61, 0xd0, 0x2c, 0x1d, 0x6c, 0xfb, 0xfb, 0x51, 0xa7, 0x98, 0x9f,
+ 0x6e, 0x65, 0x97, 0xed, 0x70, 0x6e, 0x7f, 0x99, 0x5d, 0x01, 0xf1, 0x3c,
+ 0xac, 0xbb, 0xc0, 0x27, 0xb8, 0xf9, 0x0c, 0xca, 0x07, 0x88, 0xde, 0x0e,
+ 0xd9, 0x12, 0x18, 0x6b, 0x5c, 0x86, 0x0c, 0x51, 0x19, 0x4e, 0xf8, 0x70,
+ 0x58, 0x7c, 0xc7, 0xd0, 0xf8, 0x87, 0x5b, 0xc1, 0x8a, 0x3b, 0x5e, 0xd7,
+ 0x16, 0x3c, 0xaf, 0xbf, 0x32, 0x65, 0xac, 0x27, 0x18, 0x25, 0xcb, 0x2c,
+ 0xd3, 0x19, 0x82, 0x74, 0xd7, 0x3a, 0xd0, 0xc5, 0x9f, 0x42, 0xa7, 0x92,
+ 0xc7, 0xae, 0x87, 0x7d, 0xab, 0x4f, 0x53, 0xa5, 0x73, 0x9c, 0xcc, 0x77,
+ 0x34, 0x20, 0x67, 0x3b, 0x18, 0xee, 0x5d, 0x8c, 0x0d, 0x44, 0xc8, 0xc3,
+ 0xb4, 0xcd, 0x34, 0x41, 0x3b, 0xad, 0xe5, 0x7c, 0xd0, 0xf4, 0xf2, 0xba,
+ 0xe1, 0xae, 0x36, 0xc7, 0xd2, 0x12, 0x49, 0xfc, 0xd3, 0x62, 0x29, 0xbe,
+ 0x02, 0xf1, 0xa8, 0xb7, 0xec, 0xec, 0xc9, 0x18, 0x91, 0x72, 0x91, 0xa0,
+ 0x63, 0xe7, 0x0a, 0xb8, 0x21, 0x1f, 0x34, 0x30, 0x23, 0xa7, 0xb9, 0x81,
+ 0xe5, 0x80, 0xf6, 0x5d, 0x32, 0xe8, 0x93, 0x4a, 0x8b, 0xa9, 0x85, 0xb0,
+ 0xa4, 0x25, 0xb7, 0xc0, 0x86, 0x3e, 0x93, 0x8e, 0x3b, 0x32, 0x75, 0x5b,
+ 0x4a, 0xf2, 0x10, 0xb7, 0xb6, 0x6b, 0x77, 0x3c, 0x92, 0x01, 0x84, 0xb8,
+ 0xf0, 0x4f, 0x08, 0xa7, 0xd7, 0xb6, 0x4d, 0x34, 0x15, 0xf8, 0x90, 0x9f,
+ 0x07, 0xe2, 0x26, 0x95, 0xad, 0x17, 0x1c, 0xd2, 0xc7, 0x25, 0x24, 0xd6,
+ 0xc5, 0x85, 0x0f, 0x59, 0xef, 0x9c, 0xf4, 0x5b, 0xb6, 0x58, 0x36, 0x9a,
+ 0x07, 0x9e, 0x3e, 0x67, 0x0d, 0x0c, 0x79, 0x20, 0x75, 0x0d, 0xd3, 0x86,
+ 0x3b, 0x92, 0xab, 0xb4, 0xf8, 0xad, 0x04, 0xc9, 0x87, 0x18, 0x45, 0xce,
+ 0x32, 0x29, 0x35, 0xcf, 0x9a, 0x9e, 0x42, 0xf6, 0x0a, 0x3c, 0xcd, 0x4a,
+ 0xb6, 0x28, 0x52, 0x70, 0x34, 0x43, 0x1d, 0x1a, 0x8d, 0x47, 0x19, 0x62,
+ 0x3d, 0x77, 0x6b, 0x2e, 0x8b, 0x33, 0x8f, 0xee, 0x32, 0xe6, 0xb8, 0x44,
+ 0x1a, 0xc4, 0x82, 0xae, 0x6f, 0xc2, 0x37, 0x18, 0x4f, 0xb3, 0xdd, 0xc0,
+ 0x2e, 0xb3, 0x3c, 0x5c, 0x53, 0x35, 0xbf, 0x92, 0x02, 0x22, 0xc9, 0x0c,
+ 0xee, 0x82, 0xcd, 0x3a, 0xb2, 0xd9, 0xf6, 0x29, 0x62, 0xbb, 0xf4, 0x75,
+ 0xd3, 0x70, 0x87, 0xd1, 0x36, 0x47, 0x40, 0xfe, 0x6e, 0x0e, 0x14, 0xf1,
+ 0xd1, 0x71, 0x02, 0x9d, 0x92, 0xec, 0xb5, 0x63, 0xc4, 0x59, 0xd5, 0xc3,
+ 0x27, 0x99, 0x05, 0x4c, 0xb6, 0xfa, 0xde, 0x2e, 0xf5, 0xdd, 0xa5, 0x00,
+ 0xa6, 0x66, 0xc9, 0xa7, 0x48, 0x7b, 0x3c, 0x11, 0xbd, 0x40, 0xf6, 0xf8,
+ 0x7f, 0x25, 0x82, 0x8c, 0x78, 0xbd, 0xf1, 0x32, 0x55, 0x5b, 0x7f, 0xb6,
+ 0xd5, 0xbb, 0x01, 0x55, 0x91, 0xd6, 0x4b, 0xd1, 0x54, 0xf9, 0x0c, 0x8e,
+ 0x21, 0x77, 0xe2, 0x6c, 0x2d, 0x1a, 0x97, 0x44, 0x40, 0x3f, 0x7f, 0xec,
+ 0x1e, 0x52, 0x3b, 0x8d, 0xd3, 0xbf, 0xa7, 0xa2, 0x15, 0xb4, 0x9d, 0xf2,
+ 0x24, 0x14, 0x2b, 0x6c, 0x83, 0x37, 0xae, 0x81, 0xb8, 0x87, 0xfd, 0x3f,
+ 0xf7, 0x4a, 0x51, 0x7d, 0xb6, 0x5b, 0x32, 0x1e, 0x40, 0xbe, 0xa7, 0x62,
+ 0x8d, 0x9c, 0xae, 0xcf, 0xd2, 0xbf, 0x88, 0x01, 0x05, 0x20, 0xe3, 0x70,
+ 0xa3, 0x66, 0x54, 0xbf, 0x65, 0xc8, 0x04, 0xbb, 0xd4, 0x87, 0x9a, 0xea,
+ 0xfc, 0x1c, 0x5e, 0x13, 0x20, 0x2a, 0x73, 0x06, 0x2c, 0x1f, 0x48, 0xa4,
+ 0xf6, 0x4c, 0x7c, 0xfb, 0xb6, 0x72, 0x39, 0x65, 0xc0, 0x49, 0xa3, 0x93,
+ 0x5d, 0x6c, 0x84, 0xfb, 0x23, 0xe6, 0x86, 0x26, 0x02, 0xa8, 0x4c, 0xfd,
+ 0x87, 0x0b, 0x58, 0xba, 0xc0, 0xac, 0x2d, 0x6d, 0xc5, 0x7f, 0xf4, 0xa0,
+ 0xf4, 0xce, 0xaf, 0x3e, 0x3d, 0x3b, 0xcf, 0x16, 0xae, 0x7e, 0x89, 0xb1,
+ 0x1a, 0xa5, 0x9d, 0x96, 0x27, 0xa3, 0x20, 0xcb, 0xf3, 0xe8, 0xe7, 0x32,
+ 0x28, 0x8d, 0xa8, 0xc8, 0x1b, 0x91, 0x7e, 0x0e, 0xea, 0x0a, 0x41, 0xce,
+ 0xae, 0x62, 0x37, 0x37, 0xf2, 0x1e, 0x84, 0xa8, 0x1f, 0x00, 0xe2, 0x6c,
+ 0x79, 0xb3, 0x7f, 0xfb, 0xf9, 0x88, 0x3d, 0x1a, 0x8d, 0xb1, 0x1c, 0xa1,
+ 0x0b, 0x2e, 0x21, 0x01, 0xde, 0x1b, 0x47, 0xb4, 0x8c, 0x47, 0x1d, 0x9c,
+ 0x71, 0x3f, 0x25, 0x75, 0xb8, 0xa8, 0x34, 0xc3, 0x83, 0x11, 0xab, 0x35,
+ 0xc2, 0x99, 0x38, 0xd0, 0x19, 0x90, 0x40, 0xf8, 0x2e, 0x33, 0xe2, 0x4d,
+ 0x1a, 0x15, 0xc4, 0xb5, 0x17, 0x3a, 0x63, 0x6f, 0x77, 0xe0, 0x8f, 0xac,
+ 0xef, 0x51, 0x42, 0xec, 0xed, 0xd2, 0xc3, 0x43, 0x47, 0xe6, 0x3e, 0x5b,
+ 0xe6, 0x97, 0xfe, 0x87, 0x38, 0xc6, 0x78, 0xd1, 0x50, 0xbe, 0xef, 0x08,
+ 0xd7, 0xe7, 0x5f, 0x26, 0xb7, 0xe0, 0x76, 0xff, 0x57, 0x95, 0x8b, 0xef,
+ 0x0f, 0xd9, 0x6d, 0xbb, 0x02, 0x0f, 0xee, 0xc9, 0xdb, 0x72, 0x63, 0xee,
+ 0xd6, 0x75, 0xa5, 0x3a, 0xcb, 0xbc, 0xe9, 0xc7, 0xee, 0xf0, 0x01, 0xae,
+ 0xf1, 0x13, 0x2d, 0xd2, 0xfc, 0xe9, 0x5c, 0xc4, 0xae, 0x59, 0x36, 0x3e,
+ 0xb4, 0xdb, 0x36, 0xc4, 0x77, 0xe1, 0xbf, 0x65, 0x40, 0xa7, 0x30, 0x24,
+ 0x2c, 0x3e, 0xe5, 0xac, 0xe6, 0x9f, 0x29, 0xbb, 0x4d, 0xf0, 0x24, 0x71,
+ 0x59, 0xef, 0xcd, 0xd8, 0x92, 0x5e, 0x85, 0x94, 0xc8, 0x59, 0x91, 0x38,
+ 0x1c, 0x99, 0xd1, 0xe1, 0xde, 0x4f, 0xfc, 0x46, 0x8a, 0x2f, 0x25, 0xe0,
+ 0xca, 0xd1, 0xee, 0x14, 0xd4, 0xaa, 0xd8, 0xf4, 0x34, 0xd7, 0xa3, 0xfb,
+ 0x6e, 0xce, 0xdf, 0x62, 0x08, 0x0c, 0x9c, 0xe8, 0xad, 0xfd, 0x0f, 0x79,
+ 0x85, 0xf6, 0xec, 0x5b, 0xf8, 0x35, 0x64, 0x55, 0xa8, 0x69, 0x54, 0x4f,
+ 0x78, 0x1a, 0xd7, 0x8b, 0x91, 0x28, 0x44, 0x18, 0x8a, 0xe8, 0xb5, 0xcf,
+ 0xb5, 0x14, 0xf3, 0x6e, 0x65, 0x6f, 0x48, 0x57, 0xc0, 0x8d, 0x09, 0xca,
+ 0x52, 0xf8, 0x19, 0xb6, 0xbc, 0x4a, 0x17, 0xd0, 0x8e, 0xd5, 0xd6, 0x5f,
+ 0x88, 0xcf, 0xc3, 0x62, 0x35, 0x63, 0x14, 0x05, 0x9d, 0x2c, 0x6e, 0x33,
+ 0x11, 0x88, 0x4f, 0xd7, 0x1e, 0x71, 0x67, 0xa6, 0xae, 0xfb, 0x66, 0xcb,
+ 0x8e, 0x9d, 0x39, 0x37, 0xbd, 0xa3, 0xf8, 0xba, 0x63, 0xf4, 0x01, 0xcc,
+ 0xd1, 0x98, 0x26, 0x83, 0xeb, 0xec, 0x43, 0x7f, 0x3f, 0xf2, 0xeb, 0x7f,
+ 0x82, 0x16, 0xed, 0xf6, 0x22, 0x36, 0x28, 0xda, 0xa6, 0xda, 0x64, 0x2f,
+ 0x3b, 0x50, 0x9c, 0x6e, 0xeb, 0xb7, 0x72, 0xf8, 0x27, 0x3f, 0xa2, 0x50,
+ 0xc7, 0xc8, 0x24, 0xab, 0xa7, 0x53, 0x14, 0x8c, 0x2a, 0x5d, 0xa9, 0x11,
+ 0xb6, 0xd5, 0x8e, 0xa0, 0x2a, 0x68, 0x0e, 0x4e, 0x48, 0x34, 0x39, 0x8c,
+ 0x0a, 0x29, 0x6d, 0x8d, 0x7b, 0x09, 0x9f, 0xeb, 0xd3, 0xeb, 0x83, 0x75,
+ 0xcc, 0x5a, 0xe4, 0xfe, 0x0c, 0x57, 0x31, 0x52, 0xd5, 0xdb, 0x2c, 0x16,
+ 0xdb, 0x0c, 0x9f, 0x04, 0x04, 0x0a, 0xdd, 0x78, 0x98, 0x31, 0xb0, 0xd4,
+ 0xcb, 0x84, 0x44, 0x08, 0xe6, 0xa3, 0x5b, 0xcd, 0x4a, 0xa8, 0x02, 0xce,
+ 0x4c, 0x05, 0x81, 0x4c, 0xae, 0xa8, 0x99, 0x04, 0xca, 0x91, 0xca, 0xdb,
+ 0x1d, 0xc1, 0xcc, 0xfc, 0xa1, 0x85, 0xb2, 0x2b, 0x88, 0x42, 0x0e, 0xc6,
+ 0x36, 0xfb, 0xe4, 0x23, 0x6e, 0xf9, 0x43, 0xba, 0x10, 0x0c, 0x82, 0xef,
+ 0x90, 0x1b, 0x8e, 0xa0, 0xf4, 0xae, 0xe8, 0x40, 0x72, 0x3a, 0x34, 0x1a,
+ 0xa2, 0xc5, 0x3d, 0x5c, 0xe5, 0xdb, 0xfc, 0x4e, 0xb0, 0xe5, 0x8a, 0xaf,
+ 0x19, 0x0d, 0xfb, 0x68, 0x06, 0xc2, 0x50, 0x0a, 0x5f, 0xf3, 0x6f, 0xdf,
+ 0x33, 0xcb, 0x5e, 0x61, 0x7e, 0xe0, 0x26, 0xd1, 0x1f, 0xb7, 0x26, 0x2f,
+ 0x17, 0x9b, 0x97, 0x42, 0x0f, 0xc2, 0x4a, 0x3d, 0xf1, 0x19, 0x0a, 0xf8,
+ 0xca, 0x95, 0xee, 0x56, 0x50, 0x57, 0xbe, 0x34, 0x4d, 0x55, 0x65, 0x96,
+ 0xe3, 0xfb, 0x05, 0x35, 0xe8, 0x4e, 0x2b, 0x71, 0x26, 0x71, 0xe8, 0xfd,
+ 0x2b, 0xf3, 0xa8, 0x5b, 0xaf, 0x6d, 0x01, 0x7c, 0x84, 0xde, 0xfb, 0x1f,
+ 0x6c, 0x7a, 0x22, 0xc4, 0xae, 0x85, 0x20, 0x40, 0x94, 0x2e, 0x44, 0x1d,
+ 0x0e, 0x66, 0x0e, 0xed, 0xac, 0x2f, 0xa8, 0xa6, 0x09, 0xcf, 0xe0, 0x33,
+ 0x93, 0xfc, 0x2f, 0xc3, 0xc1, 0xd1, 0x69, 0x6c, 0x12, 0xaf, 0xda, 0x31,
+ 0x68, 0xbc, 0xff, 0x8b, 0x90, 0xea, 0x94, 0xe9, 0xc7, 0xb3, 0x63, 0x66,
+ 0x0b, 0x64, 0xa7, 0x96, 0xf3, 0x1b, 0x37, 0xfc, 0x55, 0x37, 0x48, 0x38,
+ 0xc7, 0x0c, 0x74, 0xec, 0x7e, 0xc4, 0xc5, 0xe4, 0x0b, 0x85, 0x75, 0x05,
+ 0x57, 0x07, 0x35, 0xbc, 0x94, 0x0b, 0xf1, 0xb2, 0x6e, 0x70, 0x8b, 0xcf,
+ 0x70, 0x3f, 0xf4, 0xa2, 0xa5, 0x19, 0xde, 0x28, 0x5b, 0xa8, 0xda, 0x27,
+ 0xc8, 0x1b, 0x32, 0xf4, 0x68, 0x41, 0x69, 0x04, 0xd3, 0x9a, 0x26, 0xff,
+ 0xce, 0x1f, 0x77, 0x83, 0x97, 0xa2, 0x1b, 0x15, 0x89, 0xc4, 0xfa, 0xf3,
+ 0x17, 0x41, 0xf4, 0x6a, 0x52, 0xde, 0x37, 0x1c, 0x4c, 0x3f, 0x99, 0x5b,
+ 0x90, 0x8e, 0x51, 0xc6, 0x54, 0xd7, 0x8a, 0xb6, 0xd9, 0x8e, 0x63, 0x1a,
+ 0x2a, 0xeb, 0x9d, 0xb2, 0xeb, 0x18, 0xb1, 0x13, 0xda, 0x7c, 0x23, 0x6d,
+ 0xa7, 0x0f, 0xe2, 0x47, 0x8a, 0x4e, 0x5e, 0xd6, 0xc3, 0x4f, 0x67, 0x67,
+ 0xaa, 0x5f, 0x00, 0xcf, 0xc0, 0x0d, 0xac, 0x24, 0x9a, 0xc5, 0x88, 0xfa,
+ 0x3e, 0xb7, 0x80, 0xd8, 0xaf, 0x34, 0xd4, 0xf4, 0xd9, 0xca, 0x74, 0xe8,
+ 0xcf, 0xa5, 0x5f, 0x88, 0x65, 0x39, 0xc2, 0xff, 0xf2, 0x05, 0x72, 0xe9,
+ 0x71, 0x8e, 0xe0, 0xc4, 0xc6, 0x93, 0xbb, 0x58, 0x7a, 0x26, 0x5a, 0x37,
+ 0x90, 0xeb, 0xd9, 0xab, 0xc0, 0xf3, 0xd3, 0x9f, 0x1e, 0xea, 0xcf, 0x39,
+ 0x67, 0x15, 0x09, 0xe3, 0x94, 0x17, 0xea, 0x88, 0xf3, 0x72, 0x81, 0x42,
+ 0xa0, 0xcc, 0x4d, 0x4e, 0xb6, 0x31, 0x25, 0x2d, 0x4a, 0xe8, 0xa7, 0xbb,
+ 0xef, 0xab, 0x94, 0x14, 0xda, 0xfc, 0xcb, 0x98, 0x28, 0x24, 0x2c, 0x8a,
+ 0x5d, 0x91, 0x18, 0x67, 0xa5, 0x40, 0x0c, 0x1f, 0x29, 0xbc, 0x30, 0x61,
+ 0xfb, 0x0d, 0x54, 0x07, 0x50, 0x2b, 0xcb, 0xca, 0xeb, 0xbb, 0xa6, 0x39,
+ 0x24, 0x80, 0x52, 0x88, 0xf7, 0x5c, 0xa0, 0x39, 0xc1, 0xe8, 0xb7, 0x10,
+ 0xb9, 0xb5, 0x29, 0xdf, 0x56, 0xd6, 0x40, 0xcc, 0xf4, 0x26, 0x5a, 0xfc,
+ 0x50, 0xd3, 0x18, 0x7b, 0x31, 0xe6, 0xce, 0xd8, 0x16, 0xac, 0xe3, 0xe2,
+ 0xa5, 0x0d, 0x20, 0xd0, 0x70, 0x57, 0x02, 0x38, 0x68, 0x9c, 0x32, 0x84,
+ 0xee, 0x9a, 0x1b, 0x8b, 0x33, 0x65, 0x32, 0x8a, 0xb2, 0xe0, 0xb2, 0x0a,
+ 0x1d, 0xa8, 0x28, 0x38, 0x16, 0x39, 0xf3, 0xdc, 0x2b, 0x14, 0x6b, 0x79,
+ 0x14, 0xc1, 0x63, 0x58, 0x54, 0x78, 0xe0, 0xf3, 0x65, 0x16, 0x3d, 0xc5,
+ 0x78, 0x20, 0xb1, 0x93, 0x83, 0xde, 0x57, 0xac, 0x15, 0xce, 0x56, 0x84,
+ 0x35, 0x45, 0x99, 0x89, 0x31, 0x71, 0x01, 0xa9, 0x43, 0x86, 0x5b, 0x71,
+ 0xb7, 0x8c, 0x7f, 0x1b, 0x14, 0x95, 0xe5, 0x74, 0xaa, 0x97, 0x57, 0xd6,
+ 0x41, 0xd9, 0xd4, 0xd9, 0xdb, 0x95, 0xe1, 0xde, 0xe0, 0x1e, 0xa1, 0x88,
+ 0xc2, 0x30, 0x72, 0xa9, 0x54, 0x53, 0x8d, 0x93, 0x75, 0xc3, 0x25, 0x2d,
+ 0x4a, 0x07, 0x19, 0xec, 0x0e, 0x74, 0x2b, 0x1e, 0x03, 0xc3, 0x5e, 0xbd,
+ 0x43, 0x8e, 0xaa, 0x66, 0x98, 0x50, 0xc7, 0xfb, 0xef, 0x2b, 0x37, 0x8e,
+ 0xd8, 0xb5, 0x1e, 0x4f, 0x10, 0x7f, 0xe3, 0x2b, 0xf4, 0x99, 0x3d, 0x04,
+ 0xc3, 0xed, 0x07, 0x23, 0xf2, 0xcd, 0x2a, 0x7d, 0x2d, 0xc3, 0x53, 0x80,
+ 0x30, 0x82, 0x8a, 0x0d, 0x89, 0xb2, 0xc7, 0xce, 0xf3, 0xbb, 0xd8, 0x9a,
+ 0x98, 0xb4, 0x72, 0x45, 0x7d, 0x68, 0xa8, 0xb7, 0x52, 0x15, 0x30, 0x9e,
+ 0xd0, 0x5c, 0x87, 0x47, 0x83, 0x0a, 0xa7, 0x83, 0x75, 0x29, 0x0a, 0x78,
+ 0x8a, 0x86, 0x73, 0x05, 0x87, 0x65, 0x48, 0x45, 0xec, 0x09, 0x5e, 0x9b,
+ 0xc4, 0xe5, 0x12, 0xf7, 0x3b, 0xec, 0xdf, 0x19, 0xb8, 0x81, 0x05, 0xc9,
+ 0x97, 0xc9, 0x1f, 0x1e, 0x13, 0xc4, 0x36, 0xee, 0x79, 0x82, 0x52, 0xfb,
+ 0x6a, 0x38, 0xe5, 0x63, 0x56, 0x43, 0x48, 0xf9, 0xf7, 0x61, 0xe1, 0xf8,
+ 0xc8, 0x12, 0xf9, 0x8e, 0xb4, 0x0a, 0xcd, 0xa4, 0xa8, 0xbf, 0x59, 0x42,
+ 0xca, 0x4b, 0x6b, 0x23, 0x6c, 0x77, 0x07, 0xaf, 0xfc, 0xea, 0x77, 0xd6,
+ 0xf1, 0xa6, 0xc9, 0xf0, 0xd4, 0x23, 0x95, 0xb0, 0xdb, 0xee, 0x60, 0xf0,
+ 0x92, 0x5e, 0xdb, 0xec, 0xac, 0x62, 0xcf, 0xc3, 0x15, 0x7f, 0xff, 0x4a,
+ 0x7c, 0x29, 0x66, 0x91, 0x17, 0x00, 0xee, 0x56, 0x2b, 0xa7, 0x8b, 0x94,
+ 0x3c, 0xd3, 0x38, 0x66, 0x00, 0x80, 0x4f, 0x69, 0x91, 0x0f, 0x25, 0xfe,
+ 0xbd, 0x51, 0xf7, 0xa1, 0xcb, 0x29, 0xee, 0x5f, 0x54, 0xc5, 0xe9, 0x66,
+ 0x5e, 0xa4, 0xbe, 0x98, 0xab, 0xb4, 0x3b, 0x1a, 0x9f, 0x4d, 0xc9, 0x7d,
+ 0xeb, 0x7c, 0xe8, 0xa2, 0x51, 0x82, 0xb0, 0x54, 0xaa, 0x38, 0x47, 0xc2,
+ 0x6e, 0x29, 0x71, 0x08, 0xfb, 0xc1, 0xcb, 0x27, 0xef, 0x81, 0xcb, 0x8e,
+ 0xb4, 0x16, 0x00, 0xa1, 0xb2, 0x6b, 0x47, 0x5b, 0x3b, 0x3b, 0xf2, 0x7c,
+ 0x2d, 0x78, 0xd9, 0x42, 0xca, 0xd3, 0x41, 0x3e, 0x9d, 0xfd, 0x50, 0x32,
+ 0x8f, 0xeb, 0xb1, 0x73, 0x17, 0xe0, 0xda, 0xa4, 0x07, 0x74, 0x50, 0xe1,
+ 0xe0, 0x0d, 0xe7, 0x0a, 0x2c, 0x27, 0x39, 0xad, 0x4c, 0xbf, 0x4a, 0xe7,
+ 0x13, 0xda, 0x76, 0x0b, 0x24, 0x0a, 0x0d, 0x5a, 0x17, 0x26, 0x15, 0x72,
+ 0x03, 0xa1, 0xd4, 0x06, 0x42, 0xc8, 0x27, 0x7a, 0x53, 0x32, 0x76, 0xe3,
+ 0xef, 0xbd, 0x23, 0x3c, 0xa6, 0xbd, 0x80, 0x12, 0x0d, 0x06, 0x50, 0x76,
+ 0x9a, 0xdd, 0x51, 0x4c, 0x87, 0x0c, 0x85, 0x91, 0x6f, 0x48, 0x49, 0x84,
+ 0x20, 0xa2, 0xa3, 0x51, 0x82, 0x9d, 0xb1, 0x77, 0xca, 0x11, 0x73, 0x8d,
+ 0xa1, 0xb6, 0x89, 0x76, 0x01, 0xe5, 0x58, 0xe6, 0xca, 0xee, 0x29, 0x22,
+ 0x8c, 0x68, 0x3b, 0xbc, 0x19, 0x8a, 0x20, 0xd8, 0x8d, 0xd6, 0x95, 0x53,
+ 0x84, 0x65, 0xe7, 0x6b, 0xb2, 0x74, 0x76, 0xc9, 0xe3, 0x9d, 0x04, 0x47,
+ 0x6d, 0x22, 0xc9, 0x17, 0xdf, 0x5d, 0x6f, 0x0a, 0x04, 0xfe, 0xbc, 0x82,
+ 0xca, 0x3c, 0xcb, 0xe1, 0xab, 0xc8, 0xdb, 0x34, 0xd2, 0xde, 0xd9, 0x79,
+ 0x84, 0xb2, 0x7e, 0x4d, 0x62, 0xc1, 0xf2, 0xa3, 0x65, 0xda, 0x0b, 0x0f,
+ 0xa5, 0x24, 0x73, 0xa9, 0x07, 0x4d, 0xfa, 0x1d, 0x6b, 0x46, 0x77, 0x7e,
+ 0xfa, 0xcd, 0x8c, 0x43, 0x26, 0x71, 0x65, 0x5e, 0x12, 0xea, 0xcc, 0x62,
+ 0x66, 0x16, 0xdb, 0x97, 0x47, 0x40, 0xe6, 0x62, 0x5c, 0x30, 0x8e, 0x56,
+ 0x50, 0x75, 0xe0, 0x0b, 0x49, 0xae, 0xa4, 0xbf, 0x44, 0xea, 0xee, 0xe8,
+ 0xeb, 0x05, 0xf6, 0x9e, 0x44, 0xd0, 0x01, 0xc0, 0x4e, 0x92, 0xb9, 0x0e,
+ 0xe2, 0x48, 0xe0, 0xb6, 0xee, 0x4e, 0x7e, 0xec, 0xdf, 0x93, 0xe7, 0x39,
+ 0x3c, 0xc5, 0xf2, 0x21, 0xe9, 0x83, 0x77, 0x2e, 0xd7, 0x08, 0xc2, 0x05,
+ 0x14, 0x81, 0x57, 0x69, 0xf6, 0x5d, 0x31, 0x86, 0x4a, 0x55, 0xcd, 0xeb,
+ 0x96, 0xf1, 0xba, 0x3b, 0x80, 0x3d, 0x06, 0xd7, 0xb8, 0x04, 0xda, 0x66,
+ 0x0e, 0x04, 0x2a, 0x39, 0x8d, 0xfb, 0xe2, 0x1d, 0xe6, 0x94, 0x7b, 0x9c,
+ 0x12, 0xbb, 0xf0, 0x57, 0x13, 0x05, 0x02, 0xd3, 0xe5, 0x8d, 0x2e, 0x3a,
+ 0x19, 0x48, 0x46, 0xbc, 0x32, 0xdb, 0xaf, 0xa8, 0xf0, 0x8f, 0xd5, 0xd0,
+ 0xd4, 0xac, 0xda, 0xcb, 0x01, 0xbc, 0x02, 0xc9, 0xce, 0x33, 0x08, 0x42,
+ 0x45, 0x3c, 0xb3, 0x13, 0x2c, 0x24, 0xaa, 0x92, 0x37, 0x48, 0xbf, 0x40,
+ 0xed, 0xe0, 0xe6, 0xc8, 0x77, 0xb3, 0x53, 0xa5, 0x28, 0xd8, 0x19, 0xfc,
+ 0x33, 0xf5, 0x5d, 0x51, 0xa5, 0x2a, 0xb2, 0xb1, 0x6e, 0x57, 0x9b, 0x48,
+ 0xdc, 0x00, 0x22, 0xa9, 0x0d, 0x23, 0x7a, 0xb4, 0xb4, 0x3d, 0x8a, 0x95,
+ 0xb3, 0x9e, 0x6b, 0x03, 0x87, 0x69, 0xb0, 0x2f, 0xcb, 0x69, 0x7b, 0xb2,
+ 0xc6, 0x8d, 0x51, 0x3b, 0x73, 0x80, 0x9f, 0x04, 0xb1, 0x9f, 0x4d, 0x97,
+ 0x7a, 0xb8, 0x76, 0x01, 0xf9, 0x77, 0xfe, 0x31, 0x7f, 0x6b, 0x6c, 0xd0,
+ 0x45, 0x85, 0x1b, 0xd3, 0xab, 0x7b, 0x11, 0x99, 0xfa, 0x36, 0xad, 0x25,
+ 0xaf, 0x57, 0x87, 0x3c, 0xa9, 0x4c, 0xe0, 0x42, 0xa9, 0x0c, 0x47, 0x7a,
+ 0x8b, 0xb4, 0x54, 0x31, 0xf3, 0x77, 0xee, 0x08, 0xb2, 0x8e, 0x07, 0x9e,
+ 0x2a, 0x41, 0x8f, 0xf7, 0x76, 0x17, 0x83, 0x26, 0xb4, 0x80, 0xad, 0x27,
+ 0x2d, 0x59, 0x3a, 0xca, 0x9d, 0x0b, 0xbf, 0x79, 0x39, 0x8b, 0x20, 0xf0,
+ 0x7d, 0x4c, 0xe9, 0x0e, 0xd9, 0x46, 0x39, 0x60, 0x0e, 0xa4, 0x7f, 0x8d,
+ 0xf5, 0x0c, 0x8c, 0xbb, 0x25, 0x78, 0xe7, 0x43, 0x09, 0x87, 0xad, 0x20,
+ 0xfc, 0x51, 0xa6, 0x71, 0x6a, 0xdf, 0xfd, 0xde, 0x29, 0x6d, 0xbb, 0x19,
+ 0x73, 0x3a, 0x5e, 0xa5, 0x41, 0x2c, 0xef, 0x5b, 0x42, 0x57, 0xc6, 0x6f,
+ 0x8e, 0x63, 0xf1, 0x0d, 0x4b, 0xb7, 0xb2, 0xa4, 0x94, 0x67, 0x35, 0xa4,
+ 0xae, 0x7e, 0x8d, 0x07, 0xe5, 0x3c, 0x87, 0xa4, 0xd9, 0x25, 0x7d, 0xde,
+ 0xb6, 0x9e, 0x85, 0x3b, 0xc7, 0x8c, 0x12, 0x41, 0xa1, 0x85, 0x00, 0xd9,
+ 0xcb, 0xc7, 0x4d, 0x1d, 0xac, 0xc7, 0x0e, 0x46, 0x4e, 0x7d, 0xb1, 0x42,
+ 0x9d, 0x8a, 0x26, 0x8c, 0x3e, 0x21, 0x8e, 0x82, 0xa1, 0x33, 0xa8, 0xe2,
+ 0xf6, 0x84, 0x36, 0xc2, 0x3b, 0x29, 0x14, 0x90, 0xaf, 0x84, 0x9a, 0x78,
+ 0x7e, 0x85, 0x3d, 0x7f, 0x30, 0x10, 0x4c, 0xcd, 0x12, 0x3e, 0x40, 0xe9,
+ 0xd0, 0x0c, 0x84, 0x69, 0xdf, 0xac, 0x2d, 0xc0, 0x7d, 0xdc, 0x3b, 0xef,
+ 0x69, 0x82, 0x02, 0x65, 0x81, 0xdb, 0x57, 0x3b, 0xa8, 0x56, 0x2a, 0xe7,
+ 0x11, 0x0b, 0x34, 0x3e, 0x6f, 0x81, 0x63, 0xe8, 0xd4, 0x3c, 0x18, 0xcf,
+ 0xdc, 0xff, 0x15, 0x3e, 0xe9, 0x98, 0xf8, 0x66, 0x1a, 0x44, 0x50, 0xb2,
+ 0xec, 0xbf, 0xc9, 0xc8, 0x1b, 0xe4, 0x11, 0xe5, 0x00, 0x76, 0x01, 0x6d,
+ 0x91, 0xde, 0xd4, 0xa8, 0x2e, 0x33, 0xa6, 0x69, 0x08, 0x15, 0xf7, 0x42,
+ 0xfa, 0x11, 0x93, 0xb8, 0x4f, 0x27, 0xdd, 0x35, 0xdf, 0x3a, 0x8f, 0x19,
+ 0xd1, 0x9f, 0x72, 0x15, 0x1d, 0xad, 0x32, 0x8e, 0xb8, 0x28, 0xd6, 0xad,
+ 0xe5, 0xad, 0xbe, 0x0f, 0x75, 0x7d, 0x14, 0xbc, 0x46, 0x1e, 0x13, 0x6b,
+ 0x86, 0xdf, 0x2f, 0xd1, 0xfd, 0x51, 0x7e, 0x88, 0x7d, 0xf8, 0xc0, 0x31,
+ 0x67, 0x31, 0x8a, 0x6b, 0x28, 0x35, 0xe2, 0x06, 0xa1, 0xa0, 0x73, 0x5c,
+ 0x40, 0x57, 0xb7, 0x26, 0x0e, 0x84, 0xab, 0x5b, 0x9e, 0x6d, 0x01, 0x34,
+ 0x51, 0x6f, 0x6f, 0xfd, 0x7f, 0x0d, 0x33, 0x50, 0x98, 0x7d, 0xd1, 0xd0,
+ 0x05, 0xaf, 0x27, 0x4c, 0x5a, 0xa9, 0xa8, 0x0a, 0x4e, 0x24, 0x6b, 0x67,
+ 0x23, 0xd3, 0xb9, 0x16, 0x6e, 0x61, 0x25, 0x63, 0xad, 0x19, 0xab, 0xe8,
+ 0x65, 0x8f, 0x0f, 0xb4, 0xa6, 0xd8, 0x4f, 0x78, 0xec, 0xa2, 0x36, 0x5f,
+ 0x3b, 0xe0, 0xcb, 0xd5, 0x85, 0x64, 0xa0, 0x1f, 0x96, 0x4f, 0xef, 0x0f,
+ 0x79, 0x99, 0xe4, 0x67, 0x47, 0x40, 0xe8, 0xc5, 0xdf, 0x05, 0x63, 0xa3,
+ 0x24, 0x04, 0x7e, 0x98, 0x3c, 0x8c, 0xfb, 0xec, 0x96, 0xb4, 0x41, 0x49,
+ 0x93, 0x07, 0xad, 0x84, 0xe2, 0x23, 0x36, 0xcc, 0x57, 0x60, 0xa0, 0xc2,
+ 0xbb, 0xc8, 0x8a, 0xa5, 0x67, 0x61, 0x2a, 0x40, 0xbe, 0x0e, 0xae, 0x62,
+ 0xa5, 0x1e, 0x09, 0xe1, 0x32, 0x43, 0xd1, 0xb1, 0x25, 0xdd, 0xeb, 0x2f,
+ 0x92, 0x55, 0x86, 0x9f, 0x1a, 0xa6, 0xd7, 0x7c, 0x91, 0xb4, 0xab, 0xde,
+ 0x80, 0xd4, 0xc6, 0x42, 0x1f, 0x63, 0x45, 0xca, 0xbf, 0xd2, 0x81, 0xec,
+ 0x5f, 0xf8, 0x0a, 0xd6, 0x81, 0x5e, 0x90, 0x3d, 0x57, 0x33, 0x31, 0xf2,
+ 0x29, 0x2c, 0x66, 0x78, 0xce, 0xbf, 0xb5, 0xca, 0x15, 0xca, 0xad, 0x3f,
+ 0xcc, 0x4c, 0xc9, 0x15, 0xb4, 0xff, 0x60, 0x2f, 0xe6, 0x3c, 0x34, 0x46,
+ 0x4b, 0x13, 0xe8, 0x03, 0xf1, 0xfa, 0xa9, 0x4d, 0x5b, 0x2a, 0x3e, 0xfd,
+ 0x62, 0x7e, 0x7b, 0x84, 0x2e, 0x53, 0xa0, 0x8e, 0x6f, 0xd4, 0xaa, 0xb8,
+ 0x29, 0x71, 0xfc, 0x0f, 0xb1, 0x7f, 0x54, 0x00, 0x16, 0x14, 0xd2, 0xd2,
+ 0x1a, 0xd7, 0xec, 0x56, 0xcf, 0xed, 0xc1, 0x6d, 0xa5, 0x5e, 0xfc, 0xcf,
+ 0x42, 0x43, 0x8a, 0xa6, 0xc0, 0x6c, 0x13, 0xbf, 0xdd, 0xaa, 0x94, 0x08,
+ 0xfb, 0x4e, 0x24, 0xce, 0x4d, 0xb8, 0xc9, 0x16, 0xb7, 0xf1, 0x04, 0x1a,
+ 0x8c, 0x9c, 0xc2, 0x19, 0x91, 0x4f, 0xb3, 0x9f, 0x56, 0xc7, 0x30, 0xc4,
+ 0x40, 0x7c, 0x32, 0xff, 0xd2, 0x2d, 0x3d, 0x35, 0xd1, 0x76, 0x40, 0x4b,
+ 0xb9, 0x11, 0x05, 0x92, 0x85, 0x02, 0x57, 0xc4, 0xea, 0x67, 0xe9, 0xf0,
+ 0xd8, 0x9f, 0x06, 0xa2, 0x79, 0xe0, 0x6f, 0x01, 0x81, 0xff, 0xd8, 0x99,
+ 0xd7, 0x82, 0xbb, 0x5e, 0x1a, 0x7c, 0x44, 0xc4, 0xb0, 0xb8, 0x9a, 0xba,
+ 0x60, 0x22, 0x93, 0xb0, 0x0b, 0x0e, 0x1d, 0xbc, 0x1d, 0x94, 0xad, 0x60,
+ 0xbd, 0xed, 0xb2, 0x91, 0x73, 0xef, 0xdc, 0x6b, 0xfc, 0x04, 0xf1, 0xcb,
+ 0x52, 0xb8, 0xa1, 0xf4, 0x13, 0x7e, 0x12, 0xef, 0xac, 0x42, 0x5a, 0x35,
+ 0x3e, 0x56, 0x20, 0x5d, 0x28, 0x4a, 0x9d, 0xc4, 0xd7, 0x81, 0x91, 0x97,
+ 0x2d, 0x62, 0xc3, 0x03, 0x8c, 0x2e, 0xd3, 0x77, 0x62, 0x23, 0x5a, 0xb8,
+ 0xbb, 0x76, 0x97, 0x2f, 0x12, 0x65, 0x11, 0x96, 0x38, 0x29, 0xf9, 0xee,
+ 0xd3, 0x63, 0xd5, 0xfb, 0x6a, 0xc1, 0x1e, 0x83, 0x87, 0xea, 0x6b, 0xe0,
+ 0xe9, 0xcb, 0xeb, 0x68, 0xca, 0x4c, 0x76, 0x60, 0x55, 0xc1, 0x5b, 0x6a,
+ 0x3a, 0xf2, 0xab, 0xbc, 0xc4, 0x36, 0x10, 0xe2, 0xce, 0xa0, 0x91, 0x99,
+ 0x5d, 0xd9, 0x9e, 0xae, 0x1d, 0xaa, 0xcb, 0xfb, 0x96, 0xe7, 0x6c, 0x56,
+ 0x00, 0xcc, 0xf3, 0x4f, 0xcf, 0x32, 0x82, 0x4d, 0x25, 0x99, 0x38, 0x84,
+ 0xd4, 0x14, 0x28, 0xbd, 0x7a, 0x1e, 0xd0, 0x3d, 0x12, 0x7d, 0x5a, 0x85,
+ 0x62, 0xfb, 0x4c, 0xfe, 0x61, 0xc0, 0xda, 0x5c, 0x29, 0xdc, 0xe0, 0xbf,
+ 0x50, 0x3f, 0x58, 0x4b, 0x10, 0xe3, 0x38, 0xe1, 0xcb, 0xf9, 0xd9, 0xf6,
+ 0xf2, 0x83, 0xc9, 0xe1, 0x3d, 0x11, 0xe7, 0xe9, 0x26, 0x5e, 0xd1, 0xf6,
+ 0x67, 0xe9, 0xbd, 0x11, 0x17, 0xd9, 0xaf, 0x44, 0xc5, 0x75, 0x69, 0x19,
+ 0x98, 0x9c, 0x35, 0x39, 0xda, 0xe6, 0x1c, 0x65, 0x55, 0xac, 0xfc, 0x0a,
+ 0xf0, 0xc1, 0x57, 0x5b, 0xc1, 0x59, 0x86, 0x52, 0x38, 0x0e, 0xa6, 0x3a,
+ 0x43, 0x07, 0x9e, 0x7c, 0x93, 0x65, 0x88, 0x91, 0x8f, 0x48, 0xf7, 0x64,
+ 0x7e, 0xe9, 0x38, 0xaf, 0xd6, 0x93, 0x41, 0xf4, 0x48, 0xd9, 0x28, 0x70,
+ 0xf9, 0x75, 0xf7, 0x8d, 0xd2, 0x5b, 0x65, 0x4e, 0x01, 0x5e, 0x6a, 0x19,
+ 0x53, 0xde, 0x13, 0x89, 0xa4, 0x45, 0x96, 0xe9, 0x37, 0x2d, 0x5f, 0xeb,
+ 0xb7, 0x48, 0xda, 0x24, 0xf9, 0x5f, 0xed, 0xb0, 0xf3, 0x1d, 0x29, 0x19,
+ 0x2a, 0xe7, 0xa8, 0xe0, 0x93, 0xa9, 0x48, 0x1e, 0xc2, 0xe5, 0x0a, 0x7a,
+ 0x75, 0x06, 0xe1, 0x7f, 0xc4, 0xf4, 0x65, 0xff, 0x9a, 0x3b, 0x93, 0x8f,
+ 0x71, 0xee, 0x92, 0xad, 0xb9, 0x20, 0x1c, 0x76, 0x72, 0x45, 0x95, 0xa6,
+ 0xd8, 0xec, 0x97, 0x23, 0x5e, 0x37, 0x3e, 0x28, 0xf2, 0x3f, 0xc7, 0xdf,
+ 0x46, 0x04, 0x32, 0x79, 0xd3, 0x5b, 0xd8, 0xab, 0x35, 0x34, 0x51, 0xe4,
+ 0x3f, 0x69, 0xb4, 0xd9, 0xe3, 0xd4, 0xc6, 0xbb, 0x2f, 0x54, 0x4b, 0xaa,
+ 0x1d, 0x91, 0xd3, 0xd0, 0xc7, 0xe0, 0x78, 0x9c, 0xc9, 0x34, 0xc3, 0xbb,
+ 0x1c, 0x1d, 0x15, 0xa8, 0x8c, 0x4f, 0x2d, 0x93, 0x10, 0x4a, 0x15, 0x0f,
+ 0x0e, 0xa8, 0x7d, 0x66, 0x70, 0x63, 0xa8, 0x2d, 0x0b, 0x6c, 0xce, 0x86,
+ 0xb4, 0xd8, 0xc6, 0x09, 0xdd, 0xcd, 0x98, 0x74, 0x49, 0x03, 0xf6, 0xb3,
+ 0x6b, 0x10, 0xb1, 0x17, 0x04, 0x36, 0x10, 0x1d, 0x1e, 0x75, 0xa3, 0xdb,
+ 0x9b, 0x5a, 0x39, 0x1c, 0xfa, 0x56, 0x5d, 0x35, 0x11, 0x16, 0x5d, 0x3b,
+ 0x0d, 0x39, 0xd9, 0x3a, 0x82, 0x2c, 0x56, 0xd1, 0xb2, 0xa0, 0x56, 0x85,
+ 0xf4, 0xdd, 0x2c, 0xe6, 0x5d, 0xa1, 0x4a, 0x88, 0x06, 0x00, 0x1a, 0x59,
+ 0xbb, 0xd0, 0x68, 0x29, 0x0b, 0xba, 0xa5, 0xc6, 0x89, 0xe6, 0x4b, 0x9c,
+ 0xdc, 0xf1, 0x12, 0x63, 0x64, 0x75, 0xc7, 0xc4, 0xaa, 0xdc, 0x66, 0x3e,
+ 0xaf, 0xa5, 0xdf, 0xef, 0xb0, 0x7f, 0x6d, 0x7b, 0x22, 0x70, 0xdb, 0x33,
+ 0x14, 0x45, 0x74, 0xf6, 0xe1, 0x2c, 0x47, 0x5e, 0x6e, 0xa6, 0x3c, 0x58,
+ 0x8d, 0xcc, 0x03, 0x12, 0x8b, 0xc6, 0xd0, 0xf7, 0x4d, 0xab, 0xcd, 0x90,
+ 0x84, 0x9b, 0xb9, 0x3b, 0xe5, 0xe2, 0x23, 0x00, 0x3d, 0xfd, 0x8f, 0xba,
+ 0x33, 0x71, 0x7b, 0xf9, 0xeb, 0xe8, 0x80, 0xe4, 0x61, 0x5d, 0x4a, 0xd7,
+ 0xe8, 0x0e, 0x12, 0x05, 0xa7, 0xcd, 0x40, 0xeb, 0xe4, 0x59, 0x1c, 0xeb,
+ 0x9a, 0xb1, 0xf4, 0xb7, 0x99, 0x26, 0xd1, 0x30, 0xc5, 0x66, 0xfc, 0x50,
+ 0xd6, 0x7d, 0x63, 0xe9, 0x0e, 0xa5, 0xf3, 0x3d, 0x8e, 0x98, 0xc3, 0xde,
+ 0x4a, 0xc9, 0xd7, 0xaf, 0xae, 0x73, 0x8d, 0xa3, 0x63, 0x78, 0xc8, 0x68,
+ 0xe7, 0x7f, 0xb7, 0x75, 0xe0, 0x2a, 0x52, 0x6b, 0xdb, 0x27, 0xe0, 0x94,
+ 0xab, 0x75, 0xd0, 0x84, 0xec, 0x65, 0xec, 0x2b, 0x53, 0x3a, 0x34, 0xf4,
+ 0x75, 0x46, 0x5e, 0x66, 0x2c, 0xf5, 0x40, 0x29, 0x84, 0xc6, 0x4d, 0xee,
+ 0xb6, 0x7e, 0xdb, 0x4d, 0x61, 0xe4, 0xe0, 0xd6, 0xfb, 0xb9, 0x7d, 0xd5,
+ 0xc5, 0xcb, 0x32, 0x7d, 0x9b, 0x9c, 0x2c, 0x0e, 0xbe, 0xea, 0xab, 0xd0,
+ 0x12, 0x90, 0x21, 0x06, 0x37, 0xaa, 0xeb, 0x8f, 0xdd, 0x08, 0x68, 0xbc,
+ 0xda, 0xd7, 0x1c, 0x11, 0x14, 0x7a, 0x4d, 0xf2, 0xf8, 0xf3, 0x10, 0xd2,
+ 0x5e, 0xca, 0x10, 0x15, 0xfa, 0x77, 0xd8, 0xb9, 0x7f, 0xfe, 0x6b, 0xa8,
+ 0x7a, 0xea, 0x0a, 0xe4, 0xd1, 0x2e, 0x2f, 0xa2, 0x81, 0x6f, 0xf5, 0xca,
+ 0xa6, 0xd2, 0x70, 0x34, 0xff, 0x69, 0x72, 0x6b, 0x20, 0x69, 0x8c, 0x9a,
+ 0x38, 0x5e, 0xfd, 0x95, 0xef, 0xb5, 0x07, 0x94, 0x2a, 0x43, 0x58, 0x45,
+ 0xa0, 0xf6, 0x13, 0xdd, 0x16, 0xdc, 0xa1, 0x65, 0xbc, 0xc8, 0x2e, 0x86,
+ 0xa0, 0x2a, 0xee, 0xb6, 0x22, 0x29, 0xeb, 0xca, 0x54, 0x97, 0x60, 0x33,
+ 0x84, 0xb6, 0xbb, 0xa6, 0x26, 0x4e, 0x55, 0x8c, 0x1f, 0xc3, 0x6e, 0x92,
+ 0xa5, 0xcf, 0x39, 0x67, 0xd5, 0x69, 0x8f, 0x7f, 0xa0, 0x4c, 0x7c, 0x8e,
+ 0x33, 0x3f, 0xcb, 0x14, 0x13, 0x77, 0xae, 0x86, 0xb9, 0x49, 0xe1, 0x53,
+ 0x9c, 0x2c, 0x8a, 0xc6, 0x7b, 0xd9, 0x0a, 0xc5, 0x10, 0x9d, 0xde, 0x8d,
+ 0x9d, 0x74, 0x34, 0xb5, 0xf6, 0xbe, 0x04, 0xa7, 0x56, 0xda, 0xd4, 0x8a,
+ 0x70, 0xdd, 0x50, 0x96, 0xe8, 0x65, 0x3a, 0xa7, 0x43, 0xe8, 0xc4, 0x19,
+ 0xfa, 0xfe, 0xb3, 0xa6, 0x72, 0x76, 0xd6, 0xdf, 0x8a, 0xe6, 0x8e, 0x1a,
+ 0x51, 0xa6, 0x21, 0x8f, 0x80, 0xd3, 0x48, 0xa1, 0xc3, 0xd4, 0xd5, 0xde,
+ 0x66, 0x84, 0x80, 0x68, 0x2b, 0x14, 0xa2, 0x75, 0xe5, 0x99, 0x00, 0x52,
+ 0xa5, 0x0a, 0x11, 0xd7, 0x85, 0x6b, 0xc8, 0xc6, 0x74, 0x16, 0xc8, 0x14,
+ 0x6a, 0xcb, 0x02, 0x91, 0x02, 0x05, 0x82, 0xca, 0x8b, 0x94, 0x2a, 0x3e,
+ 0x51, 0x6b, 0x9d, 0xda, 0x73, 0xf0, 0x77, 0x46, 0x90, 0x34, 0x22, 0xa7,
+ 0xa7, 0xd8, 0x29, 0xbf, 0x13, 0x6d, 0x65, 0x02, 0x0c, 0x01, 0x3b, 0x75,
+ 0xa1, 0x00, 0xb7, 0x09, 0xf8, 0x65, 0x04, 0x08, 0x2f, 0xab, 0xf0, 0x6b,
+ 0x28, 0x53, 0x9b, 0xdc, 0xbd, 0x3f, 0xf0, 0x5a, 0xd3, 0x47, 0x5c, 0x52,
+ 0xb9, 0xa6, 0xba, 0x04, 0x57, 0x39, 0x71, 0x13, 0x4c, 0xa1, 0xaf, 0xc6,
+ 0x46, 0x5e, 0x3e, 0x4c, 0xa1, 0xa2, 0xf0, 0x41, 0x95, 0x42, 0x3f, 0x64,
+ 0xbb, 0x45, 0xbc, 0xc2, 0x00, 0x87, 0x42, 0x0c, 0x8e, 0xdd, 0xcd, 0x37,
+ 0x57, 0xe5, 0x39, 0xd8, 0x81, 0x5d, 0x07, 0x85, 0x34, 0x52, 0x05, 0xb3,
+ 0x0f, 0x0a, 0x46, 0x2d, 0x40, 0xac, 0x3a, 0xd8, 0x4e, 0xf9, 0xc7, 0xbe,
+ 0xfd, 0x5c, 0xdd, 0x83, 0x60, 0x07, 0xda, 0x7d, 0x45, 0x1f, 0x21, 0xf8,
+ 0xa5, 0xe2, 0x2d, 0xe8, 0xe5, 0x2f, 0xc6, 0x19, 0x16, 0x4b, 0x2f, 0x48,
+ 0x72, 0x57, 0x30, 0xcd, 0xa6, 0x27, 0xa6, 0x19, 0x41, 0x64, 0x73, 0x1b,
+ 0x29, 0x3d, 0x4b, 0x10, 0xa5, 0x41, 0x22, 0x6b, 0x9c, 0x82, 0xc4, 0xb9,
+ 0x69, 0xa3, 0x9c, 0x9d, 0x8a, 0xcd, 0x17, 0x2e, 0xa0, 0x12, 0x9e, 0xf2,
+ 0x22, 0x54, 0xe7, 0xaa, 0x50, 0x92, 0xc6, 0xed, 0x77, 0xd4, 0x89, 0xe8,
+ 0xcf, 0x73, 0x6f, 0x66, 0x55, 0x6c, 0xb3, 0x5d, 0x4b, 0x8d, 0x5b, 0x72,
+ 0xb0, 0xa8, 0xfb, 0x18, 0x37, 0xae, 0x85, 0x25, 0x07, 0x8b, 0xfe, 0x67,
+ 0x9b, 0x2a, 0x99, 0x7b, 0x2d, 0x94, 0x6f, 0x6d, 0x9e, 0x83, 0x7d, 0xf0,
+ 0xec, 0x24, 0x3c, 0x2d, 0xf6, 0x4d, 0x0a, 0x08, 0xbb, 0x54, 0xbd, 0x01,
+ 0x7c, 0xd3, 0xf5, 0x4f, 0x7f, 0xac, 0xc6, 0x33, 0x4c, 0x78, 0x7f, 0x7a,
+ 0xd1, 0x0f, 0xad, 0xb9, 0x10, 0x4a, 0xba, 0x26, 0x19, 0xf5, 0xe0, 0x36,
+ 0xbf, 0xf7, 0xff, 0x79, 0x91, 0xba, 0x0e, 0x35, 0x0c, 0x53, 0xb0, 0x0b,
+ 0xd6, 0xd9, 0x84, 0x36, 0xa2, 0x85, 0xa3, 0x88, 0x1c, 0x7f, 0xde, 0xb7,
+ 0x3b, 0xb9, 0x8b, 0x38, 0x85, 0x91, 0xf9, 0x8b, 0x41, 0xc0, 0x92, 0x8b,
+ 0x8d, 0x1d, 0x74, 0x99, 0x6b, 0xa9, 0x1c, 0xd9, 0x2d, 0xff, 0xfb, 0x01,
+ 0xd6, 0xa3, 0xf0, 0x57, 0xbe, 0x67, 0x15, 0xa9, 0xa2, 0x30, 0xc8, 0x5a,
+ 0xb0, 0xf1, 0x31, 0x95, 0xb7, 0x86, 0x37, 0xa7, 0xd4, 0xb7, 0xf4, 0x2c,
+ 0xb9, 0xb4, 0x1c, 0x5e, 0x37, 0xd6, 0x1c, 0x4d, 0x83, 0xe5, 0x77, 0xdd,
+ 0xa7, 0xd9, 0x31, 0xc7, 0xc1, 0x47, 0x5b, 0x81, 0x9f, 0x08, 0xb4, 0x51,
+ 0x1f, 0x5e, 0x27, 0x7c, 0xde, 0xe4, 0x7f, 0xc2, 0x2d, 0x91, 0x38, 0x2d,
+ 0x35, 0x44, 0x0a, 0xbf, 0xf0, 0xd6, 0x29, 0xca, 0xae, 0x2e, 0x67, 0xba,
+ 0xc7, 0xe4, 0xd1, 0xb7, 0x7a, 0x5b, 0xff, 0xcf, 0xd6, 0x0b, 0x1b, 0x02,
+ 0xc0, 0x7b, 0x56, 0x51, 0x61, 0x8d, 0xf6, 0x0f, 0x88, 0x5c, 0xe1, 0xe1,
+ 0x8b, 0x79, 0x65, 0xfb, 0x11, 0xf1, 0x8e, 0x11, 0x78, 0xed, 0x89, 0xc5,
+ 0x13, 0xd1, 0xe0, 0x2e, 0xd5, 0xd4, 0x0c, 0x86, 0xca, 0xd5, 0xa0, 0x12,
+ 0x0e, 0xc1, 0xdf, 0x57, 0xcc, 0xb9, 0x64, 0x0c, 0x37, 0x77, 0xbc, 0x5c,
+ 0x94, 0xe4, 0x60, 0x80, 0xfb, 0x6e, 0x44, 0xa8, 0xa7, 0xa3, 0xd1, 0xec,
+ 0x0d, 0x5e, 0x7b, 0xa0, 0x0e, 0x2c, 0x52, 0x0a, 0x7e, 0xb7, 0x21, 0xe4,
+ 0x87, 0x75, 0xb1, 0x4e, 0x12, 0x45, 0x82, 0xe4, 0xe6, 0x68, 0x1b, 0xc6,
+ 0x90, 0xc0, 0x09, 0xfc, 0xc1, 0x8b, 0x26, 0x60, 0xa5, 0xf6, 0xb9, 0x16,
+ 0x75, 0x83, 0xc7, 0x99, 0xab, 0xc3, 0x90, 0x3e, 0x7b, 0x1f, 0xde, 0xd5,
+ 0x93, 0x08, 0xf8, 0x11, 0x7a, 0xfc, 0x66, 0xc6, 0xb1, 0xff, 0x82, 0x89,
+ 0x63, 0x64, 0xd4, 0xd6, 0x84, 0xb9, 0x49, 0x1e, 0x3a, 0x26, 0xaf, 0x05,
+ 0xfc, 0xdb, 0xc4, 0xf2, 0xa5, 0xd8, 0xec, 0xd1, 0xe4, 0xfb, 0xae, 0x7e,
+ 0x8a, 0x34, 0x33, 0x31, 0x9d, 0x81, 0xd1, 0x6e, 0xf7, 0x95, 0x1d, 0xc5,
+ 0x4c, 0x3a, 0x92, 0x02, 0x05, 0xa8, 0x89, 0x37, 0x89, 0x28, 0x1a, 0xaf,
+ 0xa8, 0x3c, 0xe9, 0x1c, 0x2e, 0x47, 0xb3, 0xc9, 0xb9, 0xbf, 0x59, 0x1a,
+ 0xed, 0xf1, 0xa9, 0xeb, 0xb5, 0x5a, 0x73, 0x22, 0xa2, 0x65, 0x5a, 0xcc,
+ 0xef, 0x69, 0x8e, 0xb0, 0x9c, 0xe9, 0xb8, 0x06, 0x69, 0x44, 0x58, 0xb2,
+ 0x42, 0x45, 0x09, 0x71, 0xa8, 0x17, 0x57, 0xd8, 0xd9, 0x61, 0x63, 0x79,
+ 0x13, 0x2b, 0xee, 0xf8, 0x59, 0x1e, 0x71, 0x19, 0x69, 0x05, 0xea, 0xb0,
+ 0xef, 0xde, 0x3b, 0xef, 0x85, 0x2a, 0x76, 0x57, 0xb5, 0x7c, 0xf0, 0x6b,
+ 0xa9, 0x89, 0x9a, 0x48, 0xc8, 0x74, 0x5a, 0x47, 0xcd, 0xcc, 0x1a, 0x1c,
+ 0x80, 0x6e, 0xd1, 0xd9, 0xab, 0x09, 0x02, 0x66, 0x86, 0x73, 0x85, 0xbe,
+ 0x45, 0x26, 0x9a, 0x74, 0xa9, 0x82, 0xd6, 0xa1, 0xc3, 0xf3, 0x24, 0x7f,
+ 0xe4, 0x5b, 0xd0, 0xf3, 0x29, 0xd9, 0xd1, 0x00, 0x9a, 0xa8, 0x67, 0x1f,
+ 0xa4, 0xcd, 0x17, 0x7c, 0x9d, 0x2d, 0xaa, 0x34, 0x1b, 0xba, 0x39, 0x53,
+ 0x10, 0x8a, 0xea, 0x65, 0xbe, 0xb4, 0x2c, 0x22, 0xe6, 0xea, 0x7e, 0x25,
+ 0x65, 0x41, 0xf9, 0xf1, 0xe0, 0x8d, 0x14, 0xfd, 0x78, 0x9c, 0x7b, 0xb1,
+ 0x67, 0x15, 0xee, 0x67, 0x49, 0x0a, 0x76, 0x1f, 0x21, 0x66, 0xb5, 0xd3,
+ 0x38, 0x43, 0x9e, 0x10, 0xfa, 0xd7, 0x6b, 0xf3, 0x6b, 0x67, 0xa2, 0x76,
+ 0xa4, 0x56, 0x47, 0x13, 0x29, 0xb6, 0x8d, 0xe9, 0xe7, 0xc8, 0x10, 0xe6,
+ 0x4f, 0x2c, 0x68, 0xd3, 0xfb, 0x83, 0xfa, 0xd9, 0xfc, 0x9f, 0xe7, 0x30,
+ 0xbe, 0x0a, 0x0d, 0xf2, 0xca, 0x18, 0xcb, 0x83, 0x86, 0x6e, 0x83, 0x32,
+ 0x0b, 0xd9, 0xe8, 0x06, 0x40, 0x59, 0x7b, 0x12, 0x42, 0x6b, 0xf1, 0xa2,
+ 0xaf, 0xe2, 0x1d, 0x0d, 0x11, 0xd9, 0x59, 0x0e, 0xa3, 0x49, 0xbd, 0xdd,
+ 0x1a, 0x29, 0x09, 0x4e, 0x6e, 0x0b, 0x4f, 0x88, 0x5d, 0x79, 0xda, 0x93,
+ 0x08, 0x65, 0xd9, 0x56, 0x4b, 0xef, 0x8c, 0x44, 0xe8, 0x14, 0x58, 0x6b,
+ 0xfc, 0x9f, 0x8b, 0x57, 0x59, 0xe6, 0xdd, 0xd6, 0xf2, 0x3e, 0x2a, 0x7e,
+ 0x80, 0x7f, 0x52, 0x14, 0x86, 0xe9, 0xe1, 0xc5, 0x5f, 0x47, 0x07, 0x85,
+ 0x99, 0xa7, 0x4e, 0x0c, 0x37, 0x6c, 0xdc, 0x60, 0xe9, 0xe7, 0x5e, 0xe0,
+ 0x35, 0x98, 0xe5, 0x30, 0x3d, 0x12, 0xdb, 0x41, 0x3c, 0xce, 0xee, 0x05,
+ 0xb7, 0xb1, 0x13, 0xcc, 0x69, 0xf5, 0xcc, 0xe7, 0xa8, 0x38, 0x5a, 0xb5,
+ 0xfb, 0x65, 0xac, 0xc5, 0xa1, 0x0a, 0x34, 0x08, 0x93, 0x15, 0x5b, 0xfa,
+ 0x18, 0x20, 0x00, 0x05, 0x01, 0x13, 0xe9, 0x07, 0xb5, 0x9d, 0x98, 0x7f,
+ 0xab, 0x49, 0xb2, 0xb4, 0x51, 0x0f, 0xfa, 0x5c, 0x03, 0x62, 0x46, 0xb3,
+ 0xe8, 0x03, 0xce, 0xfe, 0x84, 0x29, 0xd5, 0x36, 0x4c, 0x42, 0x36, 0x1f,
+ 0x75, 0x1f, 0x98, 0x91, 0xd7, 0x1a, 0x5c, 0x84, 0x60, 0xb5, 0xe3, 0x32,
+ 0xa7, 0xfb, 0xd8, 0x30, 0x10, 0x5f, 0x15, 0x35, 0x58, 0x41, 0xa2, 0xf8,
+ 0xf7, 0xea, 0xbc, 0x21, 0x49, 0x81, 0x46, 0xf2, 0xd5, 0xbb, 0x4c, 0x7f,
+ 0x89, 0x06, 0xe9, 0xd6, 0x19, 0x51, 0x1a, 0x06, 0x93, 0x37, 0x92, 0x11,
+ 0x87, 0x5a, 0x7d, 0x68, 0x75, 0x4c, 0xf7, 0x59, 0xd2, 0x1a, 0x62, 0xae,
+ 0xe7, 0xb0, 0xc0, 0x50, 0x52, 0xfd, 0x66, 0x30, 0x34, 0xb3, 0x42, 0x1a,
+ 0x42, 0xd9, 0xdc, 0x6d, 0xe1, 0x58, 0xbd, 0x30, 0x2e, 0x19, 0xed, 0xcd,
+ 0xc3, 0xe1, 0xd1, 0xd2, 0x16, 0x93, 0x0a, 0xe4, 0x8f, 0xa5, 0xc6, 0xc7,
+ 0xb8, 0x26, 0x89, 0xa1, 0x2f, 0x6d, 0x3d, 0xf3, 0xc9, 0xeb, 0x6b, 0x26,
+ 0xdb, 0xe9, 0x4e, 0x37, 0x76, 0x8f, 0x9c, 0x99, 0x53, 0x16, 0x7b, 0x9b,
+ 0x8d, 0x5c, 0xa6, 0x9e, 0x20, 0x26, 0xca, 0xcb, 0xde, 0x87, 0xe1, 0x30,
+ 0xcf, 0xa1, 0xa1, 0x1f, 0xa0, 0xe0, 0x10, 0x41, 0x91, 0xf5, 0xac, 0x96,
+ 0x88, 0xd3, 0x31, 0x2b, 0x00, 0x41, 0x11, 0xb4, 0x1c, 0x90, 0xb5, 0xdd,
+ 0x05, 0x25, 0x66, 0xc0, 0x43, 0x47, 0x0b, 0xcb, 0xb5, 0x62, 0x47, 0xb7,
+ 0xb2, 0x9b, 0x3b, 0x17, 0x87, 0xa0, 0x09, 0x6a, 0x85, 0x8a, 0xce, 0xcc,
+ 0x41, 0xb2, 0x04, 0x3a, 0x4f, 0xd0, 0x2e, 0x6c, 0xa7, 0xb4, 0x1b, 0x6f,
+ 0x37, 0x0e, 0x1f, 0x87, 0x59, 0x39, 0x96, 0x74, 0x32, 0xfa, 0xc1, 0xc2,
+ 0xb2, 0x2e, 0xba, 0xc1, 0x47, 0xf8, 0x42, 0xbf, 0x6c, 0x89, 0xe3, 0x75,
+ 0xf2, 0x05, 0x0e, 0x96, 0x22, 0x1d, 0x6e, 0x2f, 0x5f, 0xc3, 0x8d, 0x71,
+ 0x0a, 0xcd, 0x4f, 0xe7, 0xe7, 0xd6, 0x82, 0x8c, 0x9c, 0xb0, 0x4f, 0xe5,
+ 0x86, 0x91, 0x65, 0xf7, 0xe4, 0x3e, 0x00, 0xb3, 0x8f, 0x9d, 0xb6, 0xeb,
+ 0xf2, 0xcc, 0xc5, 0x9b, 0x32, 0xb4, 0xd8, 0x17, 0x7e, 0xa9, 0x4f, 0xe0,
+ 0xa1, 0xb3, 0x7e, 0x40, 0x0d, 0x53, 0xa0, 0xbe, 0x81, 0x03, 0x0d, 0x94,
+ 0x4b, 0x71, 0xfb, 0xb2, 0x82, 0x41, 0x3a, 0x6c, 0xf1, 0x9a, 0xe0, 0x49,
+ 0x53, 0x8a, 0xc4, 0x9e, 0x64, 0xef, 0x2a, 0xaf, 0xa3, 0x43, 0xc2, 0x7c,
+ 0x5b, 0x93, 0xac, 0xc6, 0xaa, 0x02, 0x68, 0x05, 0xeb, 0x90, 0x50, 0x65,
+ 0xda, 0x26, 0x8f, 0x61, 0xcf, 0x29, 0x8a, 0xbe, 0x3a, 0x6f, 0x5a, 0xe7,
+ 0x30, 0xb7, 0x4f, 0x75, 0x09, 0xae, 0xce, 0x62, 0xe0, 0x3a, 0x65, 0xb4,
+ 0x9c, 0x12, 0x3b, 0x14, 0x4e, 0x4e, 0x19, 0x57, 0xb2, 0x20, 0xcd, 0x81,
+ 0xd3, 0xf7, 0xe0, 0x11, 0xf5, 0xbe, 0x15, 0x31, 0xf1, 0x24, 0x9d, 0x06,
+ 0x2f, 0x0f, 0x18, 0x36, 0xc7, 0x2f, 0x55, 0x74, 0x5c, 0x08, 0xaa, 0x1a,
+ 0xde, 0x0e, 0x50, 0x5d, 0xd5, 0xc9, 0xf1, 0x89, 0x9f, 0xd0, 0x5d, 0x45,
+ 0xef, 0x0a, 0x01, 0xdd, 0xd2, 0x41, 0xe8, 0xa0, 0x1a, 0xc9, 0xea, 0xc3,
+ 0xe2, 0x34, 0x48, 0xe6, 0x0c, 0x24, 0xdb, 0xa2, 0xef, 0xe2, 0x61, 0x16,
+ 0xcb, 0xde, 0x0e, 0x26, 0x6f, 0x76, 0xb0, 0x28, 0x53, 0xa8, 0x78, 0xb8,
+ 0x5e, 0x39, 0x42, 0x78, 0x5a, 0x28, 0x7e, 0x11, 0x77, 0x20, 0x90, 0xa9,
+ 0xca, 0x8b, 0xd6, 0xaa, 0xc3, 0xb4, 0x0e, 0x70, 0xc5, 0x8a, 0xb5, 0x6e,
+ 0x74, 0x82, 0x21, 0xa6, 0x69, 0xe9, 0xc1, 0x9e, 0xef, 0x3e, 0x93, 0xed,
+ 0xc0, 0x6f, 0x26, 0xdc, 0x46, 0xa6, 0x50, 0xda, 0x86, 0xd2, 0xe8, 0xf1,
+ 0x8c, 0xbc, 0xad, 0x40, 0x58, 0x1e, 0x6b, 0x6f, 0xb1, 0x42, 0x6d, 0x47,
+ 0xf5, 0x24, 0xd6, 0xf7, 0x78, 0x1c, 0x63, 0xb9, 0xd0, 0xe1, 0xd5, 0x82,
+ 0x0f, 0xd3, 0x14, 0x56, 0x6a, 0xd2, 0xa7, 0xb7, 0xc3, 0x48, 0x9f, 0xfe,
+ 0xa2, 0xa8, 0x51, 0x3f, 0x20, 0x42, 0x9c, 0x8c, 0xd2, 0xe8, 0xd7, 0xce,
+ 0xfa, 0xb1, 0xe8, 0x60, 0x3f, 0xcc, 0xf5, 0xd2, 0xf8, 0x38, 0x40, 0xc5,
+ 0xa8, 0xc4, 0x58, 0x63, 0xb6, 0xf4, 0x0d, 0x46, 0x3c, 0x45, 0xb2, 0xea,
+ 0x98, 0x9c, 0x8e, 0x86, 0x2b, 0x89, 0x20, 0xab, 0x45, 0xf7, 0x71, 0x9c,
+ 0x09, 0x97, 0x4b, 0x33, 0x1e, 0x4b, 0x4f, 0x12, 0x5b, 0xe5, 0x60, 0xdb,
+ 0xc2, 0xb9, 0x86, 0x83, 0x38, 0x8a, 0x2f, 0xd6, 0xa4, 0x2f, 0xc6, 0x81,
+ 0x97, 0xc4, 0xfd, 0xa4, 0xbf, 0xe9, 0xc5, 0x05, 0x24, 0x3b, 0xb1, 0xc4,
+ 0x22, 0xde, 0x73, 0x5a, 0x61, 0x78, 0x36, 0xe1, 0xa3, 0xf4, 0x52, 0x1d,
+ 0xaa, 0xfc, 0xbd, 0x32, 0xda, 0x56, 0x69, 0x41, 0x96, 0x3f, 0xdb, 0xa9,
+ 0xad, 0xe5, 0x79, 0xcb, 0x50, 0xb4, 0x31, 0x4c, 0x35, 0xf9, 0xb8, 0xbf,
+ 0xa8, 0x88, 0xd1, 0x05, 0xe6, 0x35, 0xbc, 0xfd, 0x39, 0x1f, 0x92, 0xef,
+ 0xb3, 0xe0, 0x46, 0x66, 0x2b, 0xa4, 0xf2, 0x04, 0xeb, 0xa2, 0x56, 0xdc,
+ 0xc8, 0x42, 0x76, 0x6c, 0x95, 0x8c, 0x8d, 0xc7, 0x4e, 0x6b, 0x54, 0xc7,
+ 0x5f, 0x48, 0x3f, 0xce, 0x20, 0xdd, 0x34, 0xb0, 0x92, 0x7d, 0x60, 0x93,
+ 0x4d, 0x20, 0xf3, 0x7c, 0x31, 0xda, 0x9c, 0x46, 0x0e, 0x21, 0x50, 0xb9,
+ 0xaf, 0x37, 0x93, 0xfb, 0x58, 0xce, 0x54, 0xce, 0x88, 0x65, 0x93, 0x7b,
+ 0x7b, 0xd3, 0x18, 0xe5, 0xc0, 0x51, 0xee, 0x0c, 0x37, 0x73, 0x30, 0x61,
+ 0x57, 0xb0, 0x30, 0xda, 0x54, 0xb0, 0x97, 0x4f, 0x44, 0xee, 0x14, 0x13,
+ 0xbc, 0x3b, 0xe6, 0xb1, 0x4b, 0xc6, 0xae, 0x0e, 0x13, 0x31, 0xc3, 0x65,
+ 0x2e, 0x28, 0xa8, 0x2c, 0xc5, 0xbb, 0x19, 0x5d, 0xf5, 0x9d, 0xfa, 0x7a,
+ 0x9a, 0xf8, 0x36, 0x4a, 0x8b, 0xfe, 0xdb, 0x55, 0xaf, 0x6f, 0x37, 0x27,
+ 0xfc, 0x59, 0x41, 0x02, 0x08, 0xe8, 0xda, 0x90, 0x6c, 0x42, 0x15, 0xe7,
+ 0xce, 0xdc, 0xce, 0x7d, 0x96, 0xc1, 0xc6, 0x61, 0x6a, 0x00, 0xba, 0x69,
+ 0xc7, 0x49, 0xa5, 0x80, 0x01, 0x9f, 0x69, 0x86, 0xa4, 0xb2, 0xd5, 0x0f,
+ 0x7a, 0x43, 0xee, 0x92, 0x1d, 0x73, 0xcf, 0x84, 0xc7, 0x4d, 0x83, 0x25,
+ 0x7b, 0xc7, 0x9d, 0x7e, 0xab, 0x73, 0xb2, 0x42, 0x6c, 0x72, 0x25, 0x4f,
+ 0xc1, 0xda, 0xfe, 0x15, 0x47, 0x1a, 0xd8, 0x39, 0x84, 0xc0, 0x10, 0xf3,
+ 0xf7, 0xa8, 0x8e, 0x76, 0xe1, 0x63, 0xa2, 0xb3, 0x51, 0xf3, 0x79, 0xb6,
+ 0xc0, 0xa4, 0xbf, 0xbe, 0xb7, 0xf1, 0xf0, 0x2a, 0x24, 0xf7, 0x79, 0x51,
+ 0x88, 0x93, 0x01, 0x49, 0xf3, 0xaf, 0x4a, 0x21, 0xc1, 0xbf, 0xbb, 0xf6,
+ 0x6b, 0xe1, 0x70, 0x63, 0x29, 0x40, 0x87, 0x78, 0xb5, 0x07, 0xa4, 0x46,
+ 0x90, 0xc8, 0x45, 0x0b, 0x58, 0x08, 0xbf, 0xdf, 0x9c, 0x9d, 0xd7, 0x01,
+ 0xf8, 0xb5, 0x81, 0x03, 0xa4, 0x73, 0x7f, 0x52, 0xfa, 0x24, 0x08, 0x27,
+ 0x8f, 0x35, 0xd7, 0x76, 0xd5, 0x3f, 0xe0, 0x4c, 0x99, 0xb8, 0x52, 0x55,
+ 0x5c, 0x3f, 0xbd, 0x23, 0x8b, 0x8a, 0xca, 0xec, 0xdd, 0xb9, 0xbb, 0x18,
+ 0x68, 0x39, 0xcd, 0xd2, 0xa3, 0x96, 0x51, 0x61, 0xe2, 0x72, 0x3a, 0x6b,
+ 0xf8, 0x22, 0xe2, 0x9d, 0xe6, 0x86, 0x4a, 0x08, 0xb9, 0x64, 0x0e, 0x28,
+ 0x4b, 0xc9, 0xd4, 0x9e, 0x91, 0x84, 0x6b, 0xf2, 0x00, 0x1e, 0xea, 0x30,
+ 0xa4, 0x4c, 0x3b, 0x67, 0xff, 0xd5, 0x12, 0xb7, 0x1f, 0x62, 0xa5, 0x99,
+ 0x05, 0xbd, 0x69, 0x23, 0xb5, 0x33, 0xb0, 0x63, 0x64, 0x88, 0x9e, 0xa7,
+ 0x8b, 0x69, 0xf4, 0x92, 0x2e, 0xd7, 0x43, 0x3d, 0x19, 0x78, 0xc2, 0x0f,
+ 0x91, 0x40, 0x0b, 0x8f, 0xef, 0xa6, 0x3e, 0x08, 0x3c, 0x54, 0x8d, 0x7c,
+ 0x84, 0x47, 0x73, 0xe3, 0x7e, 0x70, 0x68, 0x11, 0x82, 0xcd, 0xfe, 0x77,
+ 0x4e, 0x91, 0x4c, 0x26, 0x56, 0xa0, 0x6f, 0x81, 0x97, 0x1f, 0xff, 0x05,
+ 0x83, 0xbd, 0x41, 0xf8, 0x9d, 0x98, 0x91, 0xf5, 0xb0, 0xd7, 0x07, 0x1b,
+ 0x13, 0x63, 0x52, 0xd7, 0xe4, 0x1a, 0xe5, 0xe0, 0x12, 0x9a, 0x55, 0xe9,
+ 0x40, 0xf1, 0xb3, 0xcc, 0xbb, 0x82, 0xbb, 0xda, 0xfc, 0xe6, 0x83, 0xb3,
+ 0x3d, 0xe6, 0x77, 0x74, 0x78, 0x7f, 0xe5, 0x14, 0x0c, 0xea, 0x87, 0x61,
+ 0x3d, 0x85, 0xe3, 0x08, 0x7f, 0x72, 0x08, 0x02, 0xc8, 0xc9, 0xef, 0xb4,
+ 0x04, 0x9a, 0x3e, 0xe3, 0xad, 0x52, 0x89, 0xea, 0x27, 0x5f, 0x47, 0xe2,
+ 0xa6, 0xba, 0xc4, 0x63, 0xe3, 0xd0, 0x2b, 0x10, 0x60, 0xe7, 0x59, 0x74,
+ 0xae, 0x7d, 0x6d, 0x55, 0x83, 0x13, 0x75, 0x11, 0x82, 0x22, 0x95, 0x09,
+ 0x8b, 0x8c, 0x6c, 0x10, 0xa4, 0x52, 0x15, 0x41, 0xb5, 0x3e, 0x81, 0x82,
+ 0x44, 0x5d, 0xa7, 0xd9, 0x1b, 0xd2, 0xcb, 0x11, 0xd0, 0x53, 0xf4, 0x74,
+ 0x36, 0xba, 0xf1, 0xe6, 0x4b, 0x23, 0x2b, 0x0b, 0xb5, 0xa3, 0xe7, 0xe3,
+ 0x38, 0xe5, 0x1d, 0x45, 0xf2, 0xf6, 0xe9, 0xfd, 0x9d, 0xb8, 0x69, 0xd5,
+ 0x96, 0xf2, 0xa7, 0x2f, 0x24, 0x6b, 0x55, 0x20, 0xe6, 0xf7, 0xe2, 0xcf,
+ 0x18, 0x91, 0xb2, 0x41, 0x70, 0xda, 0x7a, 0xfc, 0x07, 0x6f, 0x45, 0xd9,
+ 0xdd, 0x53, 0xb9, 0x29, 0x82, 0x9d, 0xdb, 0x9e, 0xea, 0xdd, 0x6b, 0x32,
+ 0x9e, 0xb1, 0x4a, 0x80, 0x5a, 0xf8, 0x6d, 0x00, 0xd8, 0xcd, 0x25, 0x2d,
+ 0x9b, 0x52, 0xdf, 0x91, 0xdf, 0x55, 0x9b, 0xce, 0x8a, 0xc3, 0xe8, 0x9c,
+ 0xf2, 0xd5, 0x66, 0x11, 0x8c, 0x27, 0x1c, 0x29, 0x5f, 0x27, 0xf7, 0x7d,
+ 0x19, 0x2d, 0xbc, 0x00, 0x16, 0x9c, 0x32, 0x5f, 0x7c, 0xfc, 0x15, 0xe4,
+ 0x16, 0xc6, 0x58, 0xeb, 0x9b, 0x40, 0x8f, 0xc7, 0xbb, 0x05, 0xda, 0xa6,
+ 0xf7, 0xbb, 0x74, 0x36, 0xcd, 0xf4, 0xa0, 0xde, 0x71, 0xc3, 0xd5, 0x89,
+ 0xd1, 0x19, 0x99, 0xb6, 0x7f, 0xd5, 0xf4, 0xb8, 0x8f, 0x11, 0xea, 0x5d,
+ 0xc2, 0x40, 0x51, 0xcb, 0x6a, 0x5c, 0xc2, 0x8a, 0x11, 0x22, 0xd9, 0x53,
+ 0xb1, 0x1e, 0x48, 0xcc, 0xb8, 0x6b, 0xeb, 0x9a, 0x69, 0xe1, 0x5a, 0x39,
+ 0x84, 0x4e, 0x8d, 0xcb, 0xef, 0x8a, 0x5b, 0xac, 0x73, 0x72, 0xe0, 0xf4,
+ 0xf8, 0x60, 0x76, 0xcd, 0x28, 0xf1, 0x78, 0x08, 0x29, 0x14, 0x07, 0x14,
+ 0xfe, 0x4c, 0x5b, 0x03, 0x27, 0xcd, 0x98, 0x3c, 0x9c, 0x90, 0x14, 0xc4,
+ 0x67, 0xa6, 0x66, 0xf0, 0xc6, 0x19, 0x91, 0x61, 0xa4, 0x33, 0x9f, 0xef,
+ 0xbe, 0x5f, 0x07, 0xaf, 0x41, 0x02, 0x13, 0x88, 0x2b, 0xf6, 0x77, 0xa1,
+ 0x42, 0x82, 0xef, 0x42, 0x8c, 0x7f, 0x05, 0x3f, 0xb3, 0x8d, 0x14, 0x58,
+ 0x62, 0xe9, 0x5e, 0xb0, 0xab, 0x80, 0xdf, 0xf0, 0x3c, 0x97, 0x81, 0xb2,
+ 0x0f, 0x98, 0xd3, 0xd0, 0x93, 0x33, 0x0f, 0x91, 0x1c, 0xcc, 0xde, 0xf8,
+ 0xf5, 0x77, 0xb6, 0xfa, 0x34, 0x4b, 0x0c, 0x9f, 0x22, 0xeb, 0x74, 0x6c,
+ 0xc6, 0xf5, 0x2e, 0xa4, 0x07, 0x31, 0xa4, 0x23, 0xde, 0xd1, 0x9b, 0x4c,
+ 0x15, 0x9f, 0xe4, 0xd1, 0x8b, 0x3b, 0x2d, 0x01, 0x17, 0x83, 0xea, 0x39,
+ 0x62, 0xd5, 0x0b, 0xae, 0x5a, 0x17, 0x73, 0xcd, 0x34, 0xa0, 0x53, 0x65,
+ 0x3c, 0x44, 0x19, 0x13, 0x53, 0x3f, 0x04, 0xf0, 0x55, 0x48, 0xe8, 0x02,
+ 0xd9, 0xd8, 0xdd, 0x94, 0x68, 0x19, 0x33, 0xeb, 0x93, 0x04, 0x61, 0xe0,
+ 0xea, 0x3b, 0x4c, 0x9a, 0xe6, 0x90, 0x78, 0x60, 0x25, 0xad, 0x98, 0x5a,
+ 0x76, 0xfb, 0x5d, 0xb0, 0x74, 0xc8, 0x91, 0xcc, 0x80, 0xd1, 0xc1, 0x9c,
+ 0xd3, 0x21, 0x88, 0x0b, 0x9a, 0x88, 0x02, 0xd8, 0x6b, 0xb3, 0xad, 0x46,
+ 0x2e, 0xac, 0x45, 0xc1, 0x1b, 0x04, 0x27, 0x1c, 0xb2, 0x53, 0xed, 0x34,
+ 0x59, 0x62, 0xf0, 0xf8, 0x7c, 0xee, 0xce, 0x91, 0x93, 0x68, 0x3f, 0xad,
+ 0xb8, 0xdd, 0xa1, 0x59, 0x8b, 0x21, 0x80, 0x12, 0x63, 0x00, 0xc9, 0xc9,
+ 0xe6, 0x2e, 0x5c, 0x7f, 0xb5, 0x25, 0x6f, 0xfb, 0x71, 0xf8, 0x8a, 0x58,
+ 0x3c, 0x25, 0xfa, 0x14, 0xd1, 0xbf, 0x33, 0x28, 0x64, 0x84, 0x42, 0x73,
+ 0x13, 0x7c, 0xc8, 0x68, 0xbb, 0x64, 0x67, 0x84, 0xbf, 0xce, 0x46, 0xfd,
+ 0xdc, 0x56, 0x8b, 0x6e, 0x11, 0xc5, 0x83, 0x98, 0x6b, 0x67, 0x19, 0xee,
+ 0xfd, 0xb2, 0xf1, 0xe9, 0xac, 0x0f, 0xbf, 0x9b, 0xc0, 0xba, 0xbe, 0x6d,
+ 0xf0, 0x57, 0xa7, 0x2b, 0xeb, 0xca, 0xef, 0x03, 0xe0, 0xb5, 0xe1, 0xfb,
+ 0x57, 0x67, 0xa3, 0xba, 0xb6, 0x84, 0xab, 0xae, 0xce, 0x45, 0xee, 0x0a,
+ 0x43, 0x96, 0xe3, 0x81, 0x09, 0x11, 0x5d, 0x27, 0xcb, 0xca, 0x3c, 0xca,
+ 0xb0, 0x24, 0x78, 0x2f, 0x6a, 0xa8, 0x8d, 0xa5, 0x81, 0xb4, 0x49, 0x80,
+ 0x2b, 0x44, 0xd7, 0x32, 0xbc, 0x1f, 0xef, 0x2f, 0xbb, 0x1c, 0xa4, 0x9f,
+ 0xcc, 0x19, 0x48, 0x9f, 0x3c, 0x48, 0x31, 0xfa, 0x84, 0x81, 0xe7, 0x02,
+ 0x83, 0xbc, 0x55, 0xaa, 0x67, 0x36, 0x65, 0x82, 0xbf, 0x30, 0xa5, 0xe4,
+ 0x4c, 0x12, 0x47, 0xee, 0x67, 0xf1, 0x87, 0x68, 0x91, 0x4a, 0x14, 0xdf,
+ 0x4b, 0x88, 0xca, 0xe2, 0xfa, 0x2f, 0xef, 0xed, 0x68, 0xc4, 0x44, 0xa2,
+ 0x02, 0xba, 0x4d, 0x05, 0x9c, 0x65, 0xc0, 0x88, 0x46, 0x84, 0x8a, 0x35,
+ 0x40, 0x59, 0x8d, 0x96, 0x61, 0x17, 0x3e, 0x4e, 0x81, 0x31, 0xf5, 0x7f,
+ 0xa3, 0x32, 0xc2, 0xea, 0xc7, 0x7b, 0x2d, 0xad, 0x4e, 0x1e, 0x45, 0x29,
+ 0x56, 0xfc, 0xc5, 0x56, 0xd9, 0x99, 0x97, 0x30, 0x4f, 0x51, 0x3d, 0xb8,
+ 0x72, 0x88, 0x82, 0x66, 0xb4, 0x1f, 0xd8, 0xd8, 0x00, 0xfd, 0x53, 0x94,
+ 0x5b, 0x6e, 0xe5, 0x1e, 0xb2, 0xb6, 0xe7, 0x5a, 0x80, 0xa2, 0xa6, 0x0f,
+ 0x0b, 0x53, 0xa9, 0x83, 0x6c, 0x17, 0x14, 0x63, 0xe9, 0x51, 0xc9, 0x47,
+ 0xca, 0x50, 0xdc, 0x26, 0x90, 0xb8, 0x66, 0x0f, 0x2e, 0x4c, 0xb4, 0x98,
+ 0x89, 0x5d, 0x63, 0x8a, 0x06, 0xf6, 0x9d, 0xd3, 0xaa, 0xad, 0x15, 0x68,
+ 0xf2, 0xdf, 0xad, 0x27, 0x43, 0xf5, 0x30, 0x08, 0xd1, 0x2a, 0xf3, 0x18,
+ 0x22, 0xb0, 0x84, 0x39, 0x16, 0x7a, 0x7b, 0x9f, 0x93, 0x92, 0x57, 0x35,
+ 0xcb, 0xdf, 0x78, 0x4a, 0xc4, 0x99, 0xd9, 0xe5, 0x72, 0xac, 0x80, 0xea,
+ 0xab, 0x8d, 0x1f, 0xde, 0x34, 0xdc, 0x1f, 0x5f, 0x3a, 0xfc, 0x07, 0x9b,
+ 0xef, 0x62, 0xeb, 0x15, 0x69, 0x9b, 0x20, 0x53, 0x02, 0x43, 0x4b, 0x65,
+ 0x51, 0x54, 0xb5, 0x2e, 0xad, 0x53, 0x0a, 0x72, 0xa2, 0x19, 0xd4, 0x0c,
+ 0x77, 0x8e, 0xd4, 0x5a, 0x9c, 0x4d, 0x8e, 0x1e, 0x8e, 0x72, 0x2b, 0xdc,
+ 0x0d, 0x36, 0x73, 0xbd, 0xe4, 0x80, 0x3e, 0xae, 0x32, 0x36, 0x7f, 0x29,
+ 0x50, 0xd9, 0x26, 0xd8, 0xb5, 0xea, 0xf4, 0x30, 0x23, 0xdb, 0x4e, 0x5e,
+ 0xfa, 0x01, 0x85, 0xe2, 0xe6, 0x35, 0x2b, 0x01, 0x6b, 0x3e, 0xe4, 0xf3,
+ 0xcc, 0x04, 0x1c, 0x47, 0x38, 0xeb, 0xa5, 0x0e, 0x59, 0x48, 0x2f, 0x67,
+ 0xe6, 0x80, 0x1d, 0x4a, 0x54, 0xab, 0x90, 0x5a, 0x16, 0x7d, 0x35, 0x58,
+ 0xf6, 0x61, 0x6a, 0xaa, 0x7a, 0xd0, 0x0f, 0xb0, 0x85, 0xf0, 0x59, 0x2c,
+ 0x5a, 0x09, 0x97, 0xa6, 0x10, 0xce, 0x65, 0x1d, 0x2e, 0xe9, 0xed, 0x66,
+ 0xc6, 0x0e, 0x1b, 0x94, 0x8e, 0x67, 0x6b, 0xea, 0xb0, 0xc1, 0xd5, 0x5d,
+ 0x0f, 0xdd, 0xe7, 0xc0, 0xdd, 0xc1, 0x4e, 0x3f, 0x80, 0xa6, 0x1f, 0x78,
+ 0x73, 0x75, 0x80, 0xd3, 0x1d, 0xd0, 0x35, 0x1b, 0xb2, 0x14, 0xd6, 0xf8,
+ 0x20, 0xcf, 0x54, 0x61, 0xe7, 0xbd, 0x2b, 0x55, 0x95, 0xbc, 0x02, 0x5b,
+ 0x40, 0xc3, 0x58, 0xe5, 0x96, 0x26, 0x30, 0x9a, 0xa4, 0x9c, 0x82, 0x4b,
+ 0x14, 0xa9, 0x35, 0x4c, 0x61, 0x6e, 0x25, 0xa9, 0xf9, 0x4a, 0xf8, 0x93,
+ 0xd7, 0x77, 0x6c, 0xb5, 0x2c, 0x53, 0xbc, 0x36, 0x7d, 0x57, 0xca, 0x05,
+ 0x1e, 0x6f, 0x70, 0x70, 0x01, 0x5c, 0x6a, 0xc4, 0x27, 0xa0, 0x45, 0xb1,
+ 0xc8, 0x7f, 0x5b, 0x61, 0x5d, 0x4a, 0x67, 0xc6, 0x0a, 0x6b, 0xb8, 0x56,
+ 0x35, 0x8e, 0xa9, 0x88, 0x99, 0x13, 0xa1, 0xe8, 0x79, 0x1b, 0x34, 0x2d,
+ 0x2d, 0xe2, 0xab, 0x68, 0x0b, 0xde, 0xb2, 0x49, 0xa8, 0xa8, 0x3c, 0x1d,
+ 0xd6, 0x6f, 0x28, 0x3d, 0xfc, 0xe2, 0x31, 0x27, 0x8d, 0x3b, 0x74, 0xe0,
+ 0x84, 0xc7, 0x72, 0x03, 0x20, 0x2a, 0x76, 0x3d, 0x9c, 0xdc, 0x69, 0x3d,
+ 0x30, 0x41, 0x07, 0xcb, 0x45, 0x72, 0x18, 0xab, 0xd1, 0xd9, 0x8e, 0x3c,
+ 0xa6, 0xe2, 0x51, 0x40, 0xf3, 0x09, 0xcc, 0xb3, 0x31, 0x91, 0x63, 0xd5,
+ 0x61, 0x4f, 0x16, 0x0e, 0x07, 0x00, 0x3a, 0x21, 0x70, 0x8d, 0x26, 0xef,
+ 0x01, 0x67, 0xb7, 0xbc, 0x8f, 0xaa, 0x1a, 0x77, 0x3d, 0x5b, 0xcc, 0x03,
+ 0xde, 0xcc, 0x1e, 0xa5, 0xe6, 0x01, 0xbb, 0x8f, 0x84, 0x48, 0x0f, 0x1f,
+ 0xb6, 0x2e, 0x46, 0xe8, 0xe6, 0x78, 0x0f, 0xd0, 0x62, 0xae, 0xe5, 0x6e,
+ 0xbc, 0x18, 0xe6, 0xc5, 0x88, 0x81, 0x9d, 0x2d, 0x4e, 0xa7, 0xf9, 0x5b,
+ 0xc1, 0xd0, 0x79, 0x56, 0x45, 0x68, 0x19, 0x81, 0x3d, 0xc6, 0xcc, 0xe2,
+ 0xac, 0x05, 0x44, 0xcf, 0x07, 0x8a, 0xec, 0x2b, 0xaf, 0xac, 0x5b, 0x91,
+ 0xba, 0x3b, 0xa9, 0x5b, 0x40, 0x7f, 0x5f, 0x78, 0xd1, 0x66, 0x0f, 0xc0,
+ 0x0b, 0x26, 0x74, 0x74, 0x54, 0x89, 0xc0, 0xb7, 0x7b, 0x33, 0x9a, 0xf5,
+ 0x4f, 0x57, 0x5d, 0xfb, 0x67, 0x86, 0x89, 0x17, 0xbd, 0x6e, 0x74, 0x40,
+ 0xb6, 0x9a, 0xe1, 0xf4, 0x5b, 0x8f, 0x23, 0x38, 0x85, 0xec, 0xda, 0x68,
+ 0x17, 0x4b, 0xb7, 0xfd, 0x33, 0xba, 0xea, 0xca, 0xdf, 0x16, 0x6b, 0x4c,
+ 0xc9, 0x26, 0xa6, 0xe7, 0x9c, 0xc2, 0x6a, 0x4f, 0xf6, 0x2c, 0xf3, 0x46,
+ 0xde, 0x40, 0xcb, 0xa4, 0xa7, 0x7b, 0x05, 0x01, 0x03, 0xb5, 0x0a, 0x14,
+ 0x25, 0x86, 0x43, 0x66, 0xdf, 0x06, 0xcc, 0xd9, 0xf0, 0xa7, 0xb9, 0x4d,
+ 0x8c, 0xf3, 0x7c, 0xc6, 0xd1, 0xa0, 0x67, 0x2f, 0x7f, 0xd3, 0x41, 0xa0,
+ 0xe0, 0x35, 0x75, 0x16, 0xa2, 0xfe, 0x57, 0xed, 0x33, 0x73, 0xfa, 0x6a,
+ 0x24, 0xc3, 0x72, 0x32, 0xa9, 0x46, 0x42, 0x61, 0x4c, 0xf5, 0xad, 0x71,
+ 0x04, 0xd0, 0x91, 0xe0, 0x93, 0x1c, 0x4e, 0x63, 0xc4, 0x2f, 0x8e, 0x9b,
+ 0xc8, 0xf5, 0x77, 0x5c, 0xdc, 0xd7, 0x75, 0xc4, 0x45, 0x72, 0x38, 0x34,
+ 0xca, 0xc2, 0xac, 0x70, 0xc7, 0x85, 0xb1, 0xbb, 0xf3, 0xe6, 0xea, 0x95,
+ 0x8e, 0x67, 0xc6, 0x6e, 0x86, 0x44, 0x7e, 0x9c, 0x66, 0x15, 0x1b, 0xae,
+ 0x80, 0x99, 0x6b, 0xf8, 0xa4, 0x39, 0x0e, 0x82, 0x15, 0x1e, 0xca, 0x2f,
+ 0xc0, 0xf2, 0x0b, 0x61, 0xf6, 0xef, 0xd8, 0x40, 0xa0, 0x2b, 0x5a, 0x5b,
+ 0xc7, 0x35, 0x6d, 0xc4, 0x1f, 0xba, 0xcd, 0x37, 0x02, 0xa8, 0xe5, 0x7b,
+ 0x43, 0xdb, 0xb7, 0x72, 0xb5, 0xe8, 0x5a, 0x4f, 0x9e, 0x02, 0xda, 0x93,
+ 0x47, 0x04, 0xe0, 0xee, 0xcd, 0x3e, 0xba, 0xca, 0x15, 0xcd, 0xfa, 0x00,
+ 0x6a, 0xa0, 0x22, 0xe1, 0x18, 0xbc, 0xcd, 0x74, 0x7f, 0xc7, 0x69, 0x1e,
+ 0x85, 0x41, 0xb7, 0x59, 0x94, 0xd8, 0xcf, 0xc3, 0x85, 0x20, 0x33, 0x89,
+ 0x8d, 0x01, 0x88, 0xd0, 0xea, 0xad, 0x55, 0x58, 0xe4, 0xc3, 0x2d, 0x7a,
+ 0x0a, 0xd9, 0x97, 0xf0, 0x13, 0x32, 0xfb, 0x37, 0xde, 0x00, 0x93, 0xc1,
+ 0x3b, 0x7c, 0x91, 0xdd, 0xa4, 0x51, 0x9d, 0xd2, 0xc2, 0x50, 0xbf, 0x80,
+ 0x9c, 0x55, 0xc1, 0x56, 0x4c, 0x41, 0x4e, 0x90, 0x5f, 0x44, 0x8f, 0x31,
+ 0x9a, 0x11, 0x51, 0x15, 0x0a, 0xa3, 0xd9, 0x3d, 0x0d, 0xa2, 0x35, 0xd0,
+ 0x70, 0xd2, 0xa5, 0x58, 0xa5, 0x1d, 0x89, 0x9b, 0x53, 0x3e, 0x12, 0x7e,
+ 0x3f, 0x9a, 0xf7, 0x07, 0xf9, 0xe3, 0xf5, 0x15, 0xc8, 0x49, 0x25, 0xe6,
+ 0x91, 0x7f, 0xd4, 0x6a, 0xd8, 0x4c, 0x24, 0xa6, 0xf4, 0x89, 0x9d, 0xa6,
+ 0x8a, 0x75, 0x0b, 0xde, 0xd0, 0xeb, 0xc3, 0x4e, 0x75, 0xb8, 0xfd, 0x36,
+ 0x6b, 0x12, 0xca, 0x97, 0x06, 0xaf, 0xc0, 0xe0, 0x9d, 0x99, 0xba, 0xe2,
+ 0x5c, 0xb6, 0x3c, 0x6f, 0x25, 0x9d, 0x72, 0x43, 0x59, 0xd9, 0xb9, 0xad,
+ 0x17, 0x07, 0x7d, 0xd1, 0xe6, 0xf2, 0x84, 0xba, 0x50, 0xea, 0x92, 0xf2,
+ 0xb2, 0x9c, 0xa0, 0x18, 0x57, 0xb9, 0xe5, 0x0b, 0x95, 0xe2, 0xc4, 0x68,
+ 0x7e, 0xe0, 0x83, 0xc3, 0x3a, 0x46, 0x20, 0x9f, 0x1e, 0xcb, 0x20, 0x33,
+ 0xb6, 0xb7, 0xcf, 0x1a, 0x5c, 0x58, 0xac, 0xeb, 0x29, 0x8b, 0x22, 0xaa,
+ 0x00, 0xa0, 0x33, 0x32, 0xa4, 0xfe, 0x17, 0x98, 0xed, 0xa1, 0xd8, 0x52,
+ 0x5d, 0x16, 0x6f, 0xc0, 0x4a, 0x62, 0x94, 0x70, 0x4b, 0xb6, 0x66, 0x57,
+ 0x8b, 0x58, 0x20, 0xf4, 0x7c, 0xe8, 0x3f, 0xda, 0x79, 0x8a, 0x33, 0x4c,
+ 0xe2, 0xbc, 0xa9, 0x31, 0x1c, 0x3a, 0xf3, 0xbb, 0xe8, 0x32, 0x2a, 0x45,
+ 0x96, 0x10, 0xe1, 0x92, 0x83, 0xa3, 0xbc, 0x0e, 0xfb, 0xa6, 0x2d, 0x9b,
+ 0x2d, 0xa0, 0x98, 0x71, 0xd8, 0x2c, 0x68, 0x23, 0x0d, 0x34, 0x94, 0xdd,
+ 0x4b, 0xd8, 0xd5, 0x04, 0xb3, 0x6d, 0xdb, 0x76, 0x32, 0xa0, 0x21, 0x44,
+ 0x99, 0xb4, 0x98, 0x2c, 0x22, 0xed, 0x7e, 0xce, 0x74, 0x72, 0xee, 0xaf,
+ 0x71, 0x59, 0x39, 0x3b, 0x4c, 0xba, 0x8b, 0x1e, 0x19, 0x27, 0xca, 0x05,
+ 0x5d, 0xf6, 0x35, 0xe3, 0xb4, 0x12, 0xd6, 0x1f, 0xef, 0x6b, 0xfd, 0x0c,
+ 0x4a, 0x78, 0xd7, 0xa3, 0x28, 0x7a, 0xb8, 0x67, 0xf6, 0x9b, 0x75, 0xb5,
+ 0x7d, 0xcd, 0x4d, 0x9a, 0x46, 0xc2, 0x8d, 0x24, 0xdf, 0x70, 0x31, 0x7c,
+ 0xc4, 0x9c, 0x54, 0x56, 0x36, 0xf7, 0xdf, 0x3d, 0xe3, 0xe0, 0xdd, 0xd7,
+ 0xc5, 0x7d, 0x34, 0x77, 0x10, 0x23, 0x3e, 0x44, 0xb1, 0xf8, 0x7c, 0x30,
+ 0x5f, 0x6e, 0x0e, 0xb0, 0xb6, 0x49, 0x10, 0x21, 0x1c, 0x79, 0x22, 0x5c,
+ 0x87, 0x1d, 0x61, 0x43, 0x27, 0x82, 0x58, 0x14, 0x32, 0x30, 0x5c, 0x8b,
+ 0x8b, 0x3c, 0xf1, 0x05, 0xf1, 0xc6, 0xf4, 0x42, 0x5f, 0x5a, 0x57, 0x30,
+ 0x88, 0x0b, 0x40, 0xfa, 0x24, 0x08, 0xca, 0x25, 0x97, 0x5a, 0xf3, 0x11,
+ 0x0c, 0xc2, 0x4f, 0x8e, 0x1d, 0x31, 0x04, 0x6d, 0x06, 0xb0, 0xfc, 0xea,
+ 0x81, 0xa8, 0x47, 0x8b, 0xbf, 0x30, 0x7f, 0xc1, 0x87, 0x12, 0xaa, 0x35,
+ 0xe1, 0xce, 0xc3, 0xa8, 0xfc, 0x12, 0xca, 0x76, 0xbf, 0xe9, 0x22, 0x00,
+ 0x89, 0x5f, 0xa4, 0xd5, 0xce, 0xcb, 0xb9, 0x2c, 0xe4, 0xb5, 0x27, 0x60,
+ 0xe5, 0xd6, 0x7b, 0xcc, 0xde, 0xbc, 0xc3, 0x9e, 0x77, 0x7e, 0x73, 0xb6,
+ 0xb8, 0x78, 0x5d, 0x32, 0x75, 0xe6, 0x0c, 0x0a, 0x66, 0x52, 0x31, 0xfb,
+ 0xb4, 0xcc, 0x46, 0x43, 0xef, 0x00, 0xee, 0xf4, 0x66, 0x7b, 0x35, 0x7a,
+ 0x7c, 0x63, 0xbd, 0x1d, 0xd0, 0xab, 0xe0, 0x01, 0x79, 0x1e, 0xbf, 0xc1,
+ 0x4b, 0x3a, 0xe5, 0xc3, 0xb9, 0x7a, 0x1a, 0x0d, 0xc3, 0x21, 0xb0, 0xa0,
+ 0xf9, 0xbf, 0x06, 0x1b, 0x5d, 0x3d, 0xa8, 0x64, 0x20, 0x5c, 0x65, 0xbf,
+ 0x81, 0x49, 0xb8, 0x8a, 0xa1, 0xc7, 0x60, 0x96, 0x72, 0xb1, 0x34, 0xf8,
+ 0xf4, 0xd4, 0x81, 0xb2, 0x3f, 0xa5, 0xc9, 0x76, 0x90, 0x73, 0x39, 0x42,
+ 0xdb, 0x80, 0xed, 0x8c, 0xf4, 0xea, 0x7c, 0xc5, 0xe7, 0xd0, 0xad, 0x4e,
+ 0x12, 0x60, 0x94, 0x80, 0xaf, 0x9e, 0x5c, 0x86, 0x9c, 0x04, 0x95, 0xbe,
+ 0x7b, 0xee, 0x1c, 0x92, 0x02, 0xc5, 0x79, 0xe3, 0x99, 0x23, 0x93, 0xab,
+ 0xec, 0x1d, 0x70, 0x50, 0xdb, 0x53, 0x41, 0x80, 0x0d, 0x91, 0x98, 0x4e,
+ 0xa2, 0x67, 0xf4, 0x25, 0xdc, 0xdf, 0xc8, 0xab, 0xf1, 0x48, 0xc5, 0x16,
+ 0xb3, 0x21, 0xe3, 0x8e, 0x25, 0x0b, 0x26, 0x81, 0x2e, 0xa8, 0x17, 0x78,
+ 0x38, 0x7f, 0x94, 0xd5, 0x9e, 0x05, 0x43, 0x38, 0xac, 0xd7, 0x62, 0x2e,
+ 0x0c, 0x6e, 0x91, 0x78, 0xb9, 0x20, 0xd0, 0x06, 0x84, 0x67, 0x33, 0xb3,
+ 0x3a, 0x5c, 0xef, 0xe7, 0x08, 0x9d, 0xd4, 0x89, 0x8b, 0xe2, 0x58, 0x53,
+ 0xa7, 0x6a, 0x17, 0x19, 0xbd, 0x75, 0x76, 0x69, 0x79, 0x40, 0x7a, 0x14,
+ 0x0f, 0x0b, 0xc2, 0x62, 0x0a, 0x82, 0xc4, 0x02, 0x01, 0x27, 0x9d, 0xc3,
+ 0x6e, 0x4d, 0x60, 0xd2, 0x5c, 0xd6, 0xee, 0x97, 0x6d, 0x80, 0xbd, 0x27,
+ 0xde, 0x31, 0xd8, 0x31, 0x81, 0x63, 0x87, 0x02, 0x06, 0x7a, 0x1a, 0x8c,
+ 0xd8, 0x6c, 0x91, 0x36, 0x3f, 0xd3, 0xc3, 0x6f, 0x37, 0xc7, 0x7a, 0xf7,
+ 0x46, 0xc6, 0x87, 0x8d, 0x9a, 0x6f, 0xfe, 0x5b, 0xdc, 0x01, 0x3e, 0xe9,
+ 0xd6, 0xd4, 0x75, 0x27, 0xd3, 0x79, 0x5e, 0xea, 0x7c, 0x92, 0xb0, 0xde,
+ 0x99, 0x9c, 0xd4, 0x08, 0x04, 0xcf, 0xe0, 0x94, 0x69, 0xb1, 0x69, 0xe6,
+ 0x3b, 0x22, 0x01, 0x29, 0xf3, 0x5d, 0xd0, 0x6b, 0x61, 0x78, 0x67, 0x93,
+ 0x4c, 0xd1, 0x65, 0xb0, 0x45, 0xd8, 0x88, 0x35, 0x5a, 0x4b, 0x8a, 0xca,
+ 0xf6, 0xb7, 0x2d, 0x4b, 0x8e, 0x7e, 0xba, 0x49, 0x2a, 0x5c, 0xf3, 0xe1,
+ 0x01, 0xa3, 0xd2, 0xd8, 0xa8, 0x69, 0xbd, 0x0e, 0x50, 0x16, 0x18, 0x54,
+ 0xb8, 0xa2, 0xaa, 0x36, 0xd1, 0x8a, 0x16, 0xdc, 0x8b, 0x9a, 0x40, 0x73,
+ 0xaf, 0xc3, 0x92, 0xb6, 0x02, 0xdc, 0x73, 0x29, 0xec, 0xb3, 0x7a, 0x9d,
+ 0x00, 0xdd, 0x59, 0x59, 0x39, 0x80, 0x5d, 0x07, 0xbf, 0x87, 0xab, 0x2e,
+ 0x87, 0x5b, 0x3c, 0xe4, 0x8a, 0x47, 0xef, 0x0a, 0x31, 0x8a, 0x2b, 0x90,
+ 0xff, 0x44, 0xb1, 0xb2, 0x90, 0xe3, 0xc7, 0x08, 0x9a, 0xb9, 0x5a, 0xef,
+ 0xf3, 0xcb, 0x32, 0x20, 0x0f, 0x2e, 0xa1, 0x4a, 0x1d, 0x59, 0x61, 0x24,
+ 0xc2, 0xc7, 0x9b, 0x68, 0x1d, 0x02, 0xb8, 0xe0, 0xbb, 0x8f, 0xbd, 0xf5,
+ 0x19, 0x54, 0xc7, 0x6e, 0x44, 0x16, 0x94, 0x7f, 0x23, 0x33, 0xbb, 0x05,
+ 0x30, 0x8f, 0xd4, 0xe3, 0x28, 0xb3, 0xbb, 0x17, 0x5e, 0x3a, 0xff, 0x6d,
+ 0x75, 0x21, 0x23, 0x60, 0x51, 0xfe, 0xbb, 0x53, 0xff, 0x9f, 0x74, 0xd7,
+ 0x45, 0x29, 0xbd, 0x5c, 0xef, 0x94, 0x36, 0x0e, 0x63, 0x20, 0xd8, 0xaa,
+ 0x1c, 0x3c, 0xf9, 0x5d, 0xb9, 0x4d, 0x2d, 0x7a, 0x0e, 0xe5, 0x6d, 0x9b,
+ 0xd6, 0xd3, 0x21, 0x85, 0x14, 0xc9, 0x80, 0x4f, 0x3d, 0xc5, 0xd2, 0x79,
+ 0xcf, 0xf0, 0x4f, 0xa3, 0x49, 0x58, 0x5d, 0xcc, 0xf6, 0xf9, 0xda, 0x5f,
+ 0x20, 0x32, 0x60, 0x6a, 0x73, 0xb4, 0x45, 0xfe, 0x60, 0x00, 0x07, 0xd3,
+ 0xc0, 0x8a, 0x6a, 0xc3, 0x96, 0xb6, 0x12, 0x6b, 0xbd, 0x3e, 0xd3, 0x67,
+ 0x7b, 0x70, 0xf5, 0xc7, 0xaf, 0xaa, 0x81, 0x6c, 0x67, 0x1e, 0xf4, 0x32,
+ 0xac, 0xd7, 0x9f, 0x93, 0x79, 0x0c, 0xa7, 0x2f, 0x9a, 0x9d, 0x45, 0xb9,
+ 0xba, 0x6e, 0x4c, 0xee, 0xa0, 0x93, 0x41, 0xc4, 0xb7, 0x32, 0x3b, 0x72,
+ 0xe0, 0x9a, 0xe6, 0x61, 0x38, 0x18, 0x4a, 0x26, 0xcd, 0x08, 0xa1, 0xda,
+ 0x55, 0xb5, 0x35, 0x12, 0x86, 0x7a, 0x9d, 0x28, 0xd0, 0x37, 0x5e, 0x0e,
+ 0x96, 0x12, 0xa2, 0x39, 0x78, 0x75, 0x02, 0x08, 0x3d, 0x48, 0x4f, 0x6c,
+ 0x6b, 0x2e, 0x01, 0x50, 0x38, 0x25, 0x57, 0xa6, 0x8a, 0xc6, 0xee, 0x3d,
+ 0xf6, 0xfe, 0x02, 0x0a, 0x2a, 0x19, 0x36, 0x1e, 0xeb, 0xc1, 0xa2, 0xd0,
+ 0x18, 0xc0, 0x60, 0x49, 0xa4, 0x7d, 0xde, 0x0a, 0x52, 0x5b, 0x4c, 0x51,
+ 0x52, 0x55, 0xe9, 0xce, 0xc0, 0x77, 0x4b, 0xd3, 0xda, 0x8a, 0x58, 0x1d,
+ 0xc0, 0x33, 0x5d, 0x1a, 0x86, 0xd1, 0xdf, 0xe7, 0x28, 0x61, 0x5f, 0x53,
+ 0x2d, 0x20, 0xe2, 0xa8, 0x97, 0xda, 0x1c, 0xe3, 0x71, 0x95, 0xff, 0xbc,
+ 0xa9, 0x8d, 0xe6, 0xd2, 0xe5, 0x41, 0xb4, 0x9e, 0x19, 0xba, 0x00, 0x1f,
+ 0x78, 0x52, 0x3b, 0x3a, 0x50, 0x85, 0xbb, 0xa5, 0x2a, 0x3f, 0x46, 0x59,
+ 0x08, 0xae, 0x2f, 0x18, 0x58, 0x02, 0x46, 0x60, 0xaf, 0x5d, 0xe7, 0x6f,
+ 0xaa, 0x11, 0xee, 0x37, 0x22, 0xb6, 0xef, 0x62, 0xba, 0x0a, 0xc2, 0x24,
+ 0xaa, 0xf9, 0x54, 0xc2, 0x4f, 0xb0, 0xb4, 0x32, 0xa7, 0x59, 0x16, 0xa3,
+ 0x2b, 0xfb, 0x69, 0x7d, 0x51, 0xba, 0xd3, 0x00, 0xa5, 0xe6, 0x5c, 0xb6,
+ 0xd4, 0xcc, 0x5a, 0x50, 0xd4, 0x46, 0x77, 0x7d, 0x0b, 0x1a, 0xf1, 0xce,
+ 0x88, 0x51, 0xbd, 0x87, 0xc9, 0xfa, 0x33, 0x99, 0xeb, 0xc0, 0x5d, 0xee,
+ 0x04, 0x37, 0x21, 0x51, 0x15, 0x08, 0xf3, 0x70, 0x34, 0xb2, 0xfe, 0x74,
+ 0x1c, 0x91, 0x38, 0x2e, 0x54, 0x7b, 0xf8, 0xd3, 0xd7, 0x1c, 0xa4, 0x42,
+ 0x62, 0x76, 0x1d, 0x25, 0x10, 0xad, 0xc6, 0x12, 0xef, 0x07, 0xcb, 0x3b,
+ 0x9d, 0x5d, 0x66, 0x27, 0xe2, 0x82, 0x57, 0xb5, 0x36, 0xd7, 0x31, 0xdb,
+ 0x71, 0x2e, 0xb8, 0x55, 0xea, 0xc2, 0x25, 0x54, 0xf8, 0x1f, 0x6b, 0xcf,
+ 0xdd, 0x4a, 0x1f, 0xc6, 0x69, 0x3c, 0xf9, 0xc1, 0x96, 0x0d, 0xaf, 0xda,
+ 0xc2, 0x7e, 0x88, 0x10, 0x8e, 0xb6, 0x89, 0x2f, 0x1f, 0x09, 0xae, 0x7e,
+ 0x2d, 0x65, 0xec, 0xea, 0xa4, 0x6f, 0xd3, 0x54, 0x33, 0xea, 0x1b, 0x63,
+ 0x1c, 0x27, 0x91, 0x00, 0x77, 0x34, 0x5b, 0x73, 0x1b, 0xf1, 0xd6, 0xbd,
+ 0xcc, 0x86, 0xa2, 0x38, 0x8a, 0xd5, 0x55, 0xe2, 0x9f, 0x90, 0xdd, 0xb9,
+ 0xfa, 0xd9, 0xe2, 0x82, 0x24, 0xe9, 0x17, 0xfc, 0x8b, 0xb3, 0x8b, 0xeb,
+ 0x41, 0xed, 0xe5, 0xd9, 0xbd, 0x78, 0x20, 0xde, 0x20, 0xed, 0x98, 0x17,
+ 0x8a, 0x7f, 0x5d, 0x40, 0xbd, 0x0a, 0x03, 0x5d, 0xe2, 0x22, 0x65, 0x94,
+ 0xd3, 0x11, 0xb2, 0xc9, 0x83, 0x9b, 0xc6, 0xb7, 0x3f, 0x27, 0x03, 0x47,
+ 0x16, 0xd2, 0xfd, 0x6c, 0x5a, 0x19, 0x0c, 0x77, 0xb7, 0xd2, 0x41, 0x89,
+ 0xd9, 0xeb, 0x1b, 0x56, 0xfa, 0xb4, 0xbe, 0x0b, 0xd1, 0x43, 0x5d, 0xfb,
+ 0x13, 0x41, 0x54, 0x66, 0xc2, 0x23, 0x96, 0x9a, 0x79, 0x38, 0xaf, 0x6f,
+ 0x46, 0x44, 0x18, 0x5c, 0x11, 0xd6, 0xb1, 0xf7, 0xfa, 0x84, 0x2a, 0x2e,
+ 0x9d, 0x23, 0x4f, 0xfe, 0x72, 0xc8, 0x87, 0x9e, 0x17, 0x0a, 0xe4, 0xf8,
+ 0x38, 0x27, 0x36, 0x16, 0x72, 0xf4, 0xc0, 0xae, 0xd8, 0x4a, 0x83, 0xd8,
+ 0xf3, 0x6e, 0x7f, 0x5a, 0x6a, 0x65, 0xd5, 0x12, 0x91, 0x42, 0x50, 0x28,
+ 0xc2, 0xfe, 0x02, 0xa4, 0x57, 0xf1, 0xb3, 0x0a, 0x86, 0xaa, 0x67, 0xda,
+ 0x0d, 0xe2, 0x54, 0xda, 0x44, 0x38, 0x44, 0xf4, 0x9f, 0xfc, 0x56, 0xe6,
+ 0x05, 0x4a, 0x5f, 0x33, 0xcb, 0x64, 0x17, 0xb2, 0xd1, 0x1d, 0x08, 0x07,
+ 0x51, 0x57, 0xd3, 0x3a, 0xc6, 0x54, 0x52, 0x6c, 0x03, 0xe9, 0x2e, 0x3f,
+ 0x92, 0x05, 0xe4, 0x53, 0x80, 0xeb, 0xbe, 0xdf, 0x29, 0xb4, 0xed, 0xea,
+ 0xb4, 0x5e, 0x97, 0xdf, 0x2a, 0xa2, 0x20, 0x69, 0x27, 0x94, 0xa6, 0x77,
+ 0xb1, 0xae, 0x0a, 0x5a, 0x05, 0x1e, 0x34, 0x49, 0x27, 0x0c, 0x5d, 0xa2,
+ 0x77, 0xd0, 0xeb, 0x4a, 0x96, 0x53, 0xf4, 0xbc, 0x0f, 0x8e, 0x58, 0x3a,
+ 0x8b, 0xbc, 0xf2, 0xe3, 0x09, 0xe8, 0xd8, 0xf2, 0xf1, 0x17, 0xe3, 0x9a,
+ 0x18, 0xa5, 0x6d, 0x3e, 0x52, 0x0b, 0xc0, 0xc5, 0x95, 0xf6, 0xb8, 0x15,
+ 0xfc, 0x8b, 0x67, 0xd9, 0x28, 0x88, 0x27, 0xb5, 0x0a, 0x62, 0xdf, 0x4d,
+ 0x31, 0x62, 0xca, 0x12, 0x9e, 0xa3, 0x09, 0x25, 0x90, 0x94, 0x18, 0x26,
+ 0xa9, 0x41, 0x21, 0x21, 0x37, 0xb6, 0x4d, 0xcd, 0x99, 0x7b, 0x22, 0xe2,
+ 0x3f, 0x6b, 0x71, 0x5b, 0x84, 0xeb, 0x19, 0xca, 0x15, 0xa7, 0x6d, 0x65,
+ 0x57, 0x3e, 0x15, 0xcb, 0x1a, 0xb9, 0x66, 0xf2, 0x18, 0xa1, 0xfc, 0xd7,
+ 0xd8, 0x1a, 0xd0, 0x08, 0x5f, 0xd6, 0xe9, 0x18, 0x0e, 0x0d, 0x08, 0x13,
+ 0x1d, 0xd8, 0xb2, 0x45, 0x74, 0xb8, 0x46, 0xea, 0x2f, 0xe4, 0x24, 0xca,
+ 0x74, 0x21, 0xee, 0xf8, 0x5c, 0x1d, 0xed, 0x8b, 0x23, 0x76, 0x6a, 0x10,
+ 0xd5, 0x3a, 0x19, 0x9b, 0xfe, 0x6b, 0xc0, 0xcf, 0xf1, 0x29, 0x22, 0xec,
+ 0x22, 0x55, 0xc4, 0xc2, 0xae, 0xb2, 0x52, 0x92, 0x8b, 0x18, 0xbc, 0xbc,
+ 0x25, 0xb0, 0x4c, 0xf2, 0x08, 0x05, 0x71, 0xa1, 0xe9, 0xdd, 0x4c, 0xc8,
+ 0x91, 0xe7, 0xe7, 0x61, 0xc0, 0xf6, 0x12, 0x59, 0x4f, 0xb6, 0x98, 0x81,
+ 0xe0, 0x15, 0x29, 0xbe, 0x08, 0x4a, 0x6a, 0x73, 0x53, 0xff, 0x5f, 0x22,
+ 0x3d, 0xa0, 0xfd, 0xb3, 0xf1, 0xa5, 0x30, 0x57, 0xdb, 0x14, 0x12, 0xf3,
+ 0x1a, 0xa1, 0x53, 0x16, 0xe1, 0x90, 0xe7, 0x53, 0x18, 0xc8, 0x53, 0x00,
+ 0x80, 0x3e, 0xc4, 0xc8, 0xa4, 0x70, 0x2f, 0x6f, 0xc6, 0x7a, 0x5b, 0x5a,
+ 0xe7, 0x9c, 0xa7, 0x0e, 0x80, 0x99, 0x71, 0x37, 0x60, 0x23, 0x11, 0x31,
+ 0xc1, 0xbb, 0xb1, 0x92, 0x96, 0x07, 0xf5, 0xad, 0xaa, 0x66, 0xbd, 0x0b,
+ 0x28, 0x85, 0x30, 0x02, 0x85, 0x83, 0x73, 0x68, 0x9e, 0xdf, 0xfc, 0x19,
+ 0xc3, 0xb2, 0x50, 0x17, 0xa9, 0x72, 0xf3, 0x91, 0x77, 0xdd, 0x4f, 0xae,
+ 0xc1, 0xb6, 0xc0, 0x7e, 0x31, 0x87, 0xc0, 0x2f, 0xe6, 0x8f, 0x6a, 0xc8,
+ 0x3d, 0xbb, 0xe9, 0x49, 0x8f, 0xc5, 0x0d, 0x68, 0xc9, 0x5d, 0x90, 0x39,
+ 0x65, 0x5e, 0x07, 0x38, 0xd1, 0x66, 0x6a, 0xc5, 0x8b, 0xb8, 0xd3, 0xb7,
+ 0x24, 0x1a, 0xd2, 0x03, 0x1b, 0xed, 0xfb, 0x41, 0x07, 0x43, 0x74, 0xe3,
+ 0x1a, 0x54, 0x1a, 0xc0, 0xc5, 0x87, 0x70, 0x52, 0x31, 0x22, 0x50, 0x8c,
+ 0x31, 0x4b, 0x5c, 0xd9, 0x4d, 0xba, 0xaf, 0xc6, 0x1f, 0x4f, 0x4d, 0xa1,
+ 0x5a, 0xa2, 0x52, 0x7a, 0xe6, 0xe3, 0x0f, 0xcc, 0xf6, 0x5c, 0xd4, 0xdb,
+ 0x96, 0xf2, 0xc7, 0x2e, 0x69, 0x2d, 0xb5, 0x46, 0x1a, 0x2d, 0xbc, 0xf7,
+ 0xe1, 0x78, 0x86, 0x2c, 0x41, 0x8b, 0x70, 0x17, 0xaa, 0xe4, 0x7c, 0x8b,
+ 0xdb, 0xfa, 0xdc, 0x09, 0x53, 0xaf, 0xa9, 0xa3, 0xb8, 0x66, 0x16, 0x16,
+ 0xb7, 0x8f, 0xf6, 0x1f, 0x0a, 0x36, 0x4b, 0x06, 0x40, 0xef, 0xef, 0x1e,
+ 0x8d, 0x46, 0x7d, 0x35, 0x43, 0xfe, 0xa6, 0x8b, 0xe9, 0x19, 0x31, 0x2c,
+ 0x2c, 0xb8, 0x96, 0x30, 0xa4, 0x8c, 0x36, 0x2a, 0x64, 0x27, 0x72, 0xad,
+ 0x62, 0xfb, 0x70, 0x90, 0x58, 0xe7, 0x51, 0x59, 0x01, 0xc2, 0x98, 0x43,
+ 0xee, 0x7f, 0xc1, 0x36, 0x85, 0xc7, 0x32, 0xd5, 0x25, 0x7d, 0x56, 0xef,
+ 0xa4, 0x1d, 0x29, 0x8c, 0x44, 0xba, 0x7b, 0x82, 0x85, 0xee, 0x4a, 0x2c,
+ 0x45, 0xd0, 0xdf, 0xcc, 0x8c, 0x77, 0x02, 0xf7, 0x41, 0x0c, 0x44, 0x16,
+ 0x19, 0xc6, 0xd4, 0x25, 0xa6, 0xae, 0xfb, 0x07, 0x74, 0x90, 0x40, 0x5a,
+ 0x68, 0x6e, 0x4a, 0xaa, 0xe2, 0xb8, 0xa9, 0x90, 0xb0, 0x20, 0x5f, 0x48,
+ 0xe7, 0xb4, 0xe8, 0xa8, 0xa3, 0x70, 0xb5, 0x5a, 0xb8, 0xc4, 0xf9, 0x8a,
+ 0x61, 0x62, 0x99, 0xc3, 0x95, 0xaa, 0xd7, 0x21, 0x5e, 0x1b, 0x86, 0xe0,
+ 0xba, 0xa9, 0x5b, 0xf8, 0x0b, 0x3b, 0xa1, 0x69, 0x35, 0xe3, 0x6b, 0xe9,
+ 0x7e, 0x14, 0x00, 0x91, 0xe5, 0x67, 0x92, 0xcb, 0xb9, 0xc6, 0xae, 0x3a,
+ 0x6b, 0xaa, 0x4c, 0x80, 0x5e, 0x30, 0xaf, 0x0c, 0xf5, 0x26, 0xfc, 0x5e,
+ 0xbb, 0xbe, 0x34, 0x21, 0x42, 0x44, 0x7f, 0x31, 0x9c, 0x6e, 0x37, 0x0f,
+ 0xa0, 0xaa, 0x69, 0x66, 0xbc, 0x25, 0x48, 0xe5, 0x41, 0x51, 0xf8, 0x04,
+ 0x4f, 0xd3, 0x19, 0x97, 0x75, 0xb4, 0xd5, 0xe9, 0x08, 0x72, 0x56, 0x9c,
+ 0xe0, 0x48, 0x1a, 0x71, 0x2a, 0x3b, 0x38, 0x9d, 0x15, 0xd9, 0x00, 0xc8,
+ 0x43, 0x03, 0x5a, 0x7d, 0x20, 0xde, 0xc3, 0xfd, 0x9b, 0xb9, 0x35, 0xc8,
+ 0x88, 0x34, 0xf3, 0x16, 0xf1, 0xb2, 0xbf, 0xd1, 0xc8, 0x71, 0x46, 0xaf,
+ 0x30, 0x5e, 0x82, 0xb8, 0x37, 0x71, 0x80, 0x06, 0x17, 0x89, 0x06, 0x39,
+ 0xe2, 0x89, 0x40, 0x87, 0x60, 0x74, 0x08, 0x42, 0xd5, 0x47, 0x58, 0x9d,
+ 0xc4, 0x56, 0xa3, 0xa4, 0x21, 0xfa, 0x80, 0x41, 0x3c, 0x0b, 0xb4, 0x6e,
+ 0xc9, 0x49, 0x28, 0x93, 0x21, 0x2a, 0xef, 0xdd, 0xcb, 0x2c, 0x2f, 0xfa,
+ 0x1d, 0x45, 0x2a, 0xb7, 0xef, 0x4c, 0xd2, 0xdc, 0xf0, 0x0e, 0x21, 0xf3,
+ 0x51, 0xed, 0x61, 0x03, 0xc3, 0x0f, 0x4c, 0x75, 0xdd, 0xde, 0x8b, 0x0a,
+ 0x41, 0x2c, 0xd9, 0x01, 0xab, 0x95, 0xd1, 0xba, 0x09, 0x32, 0x3c, 0xb4,
+ 0x0e, 0xf0, 0x44, 0xcd, 0xfe, 0x96, 0xe3, 0xa8, 0x53, 0x51, 0xb8, 0xe8,
+ 0x6c, 0xa8, 0x0d, 0xa4, 0x8e, 0x35, 0x23, 0x02, 0x78, 0xe9, 0x08, 0x35,
+ 0x9f, 0x8e, 0x01, 0x66, 0x64, 0x85, 0xa9, 0x66, 0xa7, 0x48, 0x67, 0x82,
+ 0x69, 0xe5, 0x4a, 0x06, 0x6f, 0x2c, 0x0b, 0xac, 0xc2, 0x49, 0x82, 0x76,
+ 0xcd, 0xae, 0x9d, 0x50, 0x64, 0x7a, 0x0a, 0x2a, 0xc1, 0x13, 0xed, 0xe4,
+ 0x0c, 0xb1, 0xd3, 0x6a, 0x9d, 0xed, 0x87, 0x2f, 0x19, 0x2c, 0x3e, 0x64,
+ 0x59, 0x65, 0xe6, 0x1a, 0x43, 0xed, 0xef, 0x28, 0x92, 0xd7, 0xf6, 0x72,
+ 0xe5, 0xb6, 0x4b, 0xcd, 0x03, 0x90, 0xac, 0xa5, 0xad, 0x4b, 0xae, 0x85,
+ 0x42, 0x82, 0xff, 0x64, 0xfd, 0xb3, 0x42, 0x24, 0x28, 0x9c, 0xec, 0xe9,
+ 0xe5, 0xb6, 0xcc, 0xec, 0xc8, 0x4c, 0xd2, 0x21, 0x82, 0xcd, 0xe1, 0x5c,
+ 0x74, 0x2e, 0xe9, 0x78, 0xf6, 0x3b, 0x97, 0x09, 0x89, 0x6a, 0xd0, 0xb3,
+ 0x62, 0xd6, 0x21, 0x41, 0x76, 0x83, 0xaa, 0x34, 0x19, 0x85, 0x29, 0x5b,
+ 0x1f, 0x6c, 0xf8, 0xc7, 0x8e, 0xe7, 0x78, 0x59, 0x20, 0x83, 0x8a, 0x20,
+ 0xe8, 0x83, 0xdd, 0x1e, 0xd8, 0x11, 0x1f, 0x1c, 0x71, 0x1d, 0x1f, 0x0c,
+ 0xb2, 0x77, 0xc9, 0xf2, 0x3d, 0x7b, 0xcb, 0xad, 0xa7, 0x92, 0x6a, 0x72,
+ 0x07, 0x2c, 0x06, 0x66, 0xea, 0x3b, 0xd6, 0x9f, 0xcd, 0xf0, 0xa1, 0x95,
+ 0xc4, 0xc3, 0x7b, 0xbb, 0xad, 0xe0, 0x11, 0x1b, 0x8f, 0x80, 0xec, 0xf1,
+ 0x86, 0x1d, 0xd2, 0x1c, 0x1c, 0x00, 0xda, 0xba, 0xe5, 0x29, 0x68, 0x9a,
+ 0xff, 0x7f, 0x02, 0x0c, 0x01, 0x4f, 0x22, 0x85, 0x96, 0x85, 0x4c, 0xad,
+ 0x29, 0x92, 0xa6, 0x7d, 0xa5, 0x02, 0x8f, 0x19, 0xd1, 0x01, 0x49, 0x11,
+ 0x72, 0x6a, 0x8d, 0x86, 0x96, 0xd4, 0xce, 0x72, 0x6f, 0x61, 0x34, 0x08,
+ 0xbd, 0x2c, 0x07, 0xdc, 0x10, 0x74, 0x5e, 0xa8, 0xdf, 0xb7, 0x53, 0xfd,
+ 0x6c, 0x2a, 0x99, 0x75, 0x39, 0x7d, 0x7d, 0xda, 0x3b, 0x8f, 0x29, 0x55,
+ 0xae, 0x70, 0x17, 0x1d, 0x9b, 0x2c, 0x50, 0xcc, 0xa8, 0x5f, 0xf1, 0xf6,
+ 0xaa, 0x29, 0x28, 0x46, 0x75, 0xac, 0x4c, 0xbe, 0x4e, 0x36, 0x94, 0x67,
+ 0x91, 0x55, 0x70, 0x3a, 0x8b, 0x33, 0x51, 0x49, 0x29, 0x11, 0xd9, 0xdc,
+ 0x1b, 0xc1, 0x85, 0x48, 0x3e, 0xd3, 0x40, 0x00, 0xe7, 0x63, 0xaa, 0x49,
+ 0xdd, 0x96, 0x9a, 0xad, 0x3f, 0xf6, 0xb3, 0xfe, 0xc5, 0x00, 0x6c, 0x5e,
+ 0x3c, 0xcc, 0x04, 0x23, 0x01, 0xa7, 0xaa, 0xaa, 0x19, 0x14, 0x89, 0x42,
+ 0xf0, 0x05, 0x56, 0x61, 0x99, 0xc7, 0x8f, 0x8d, 0x43, 0xe7, 0xc0, 0xf1,
+ 0x84, 0x9f, 0x57, 0x2c, 0xda, 0x87, 0xa0, 0x3d, 0x2e, 0xfd, 0xd6, 0xf9,
+ 0xc3, 0x23, 0x1d, 0xe2, 0x9b, 0xeb, 0x21, 0xef, 0xf1, 0x27, 0xdc, 0x9e,
+ 0xc0, 0x50, 0xe7, 0xea, 0x6c, 0xee, 0x1a, 0x8d, 0x82, 0x18, 0x01, 0x34,
+ 0x72, 0x53, 0x62, 0x1f, 0x4a, 0xcf, 0x07, 0x0a, 0x04, 0xa5, 0x49, 0x73,
+ 0x37, 0x13, 0xe1, 0xb7, 0x22, 0xac, 0x16, 0xbc, 0x3d, 0xe1, 0x34, 0x75,
+ 0xca, 0x54, 0x1b, 0x1b, 0xb2, 0xe6, 0xe4, 0x41, 0x83, 0xb8, 0xc9, 0xec,
+ 0xd1, 0xaf, 0x9b, 0x25, 0x59, 0x76, 0xc0, 0x7b, 0x10, 0xa8, 0xda, 0xb6,
+ 0x14, 0xdc, 0xc2, 0x33, 0xa7, 0xfb, 0x35, 0x8e, 0x8f, 0x3d, 0x6c, 0x42,
+ 0xbe, 0x4f, 0x40, 0x08, 0xe0, 0x9f, 0xd3, 0xb2, 0xaa, 0xc9, 0x73, 0x2c,
+ 0x66, 0x43, 0x01, 0xa4, 0xb9, 0x26, 0x9a, 0x01, 0x96, 0x5f, 0x12, 0x10,
+ 0x0f, 0xf8, 0x2d, 0x43, 0x07, 0xab, 0x33, 0x73, 0x3a, 0x58, 0xf1, 0x31,
+ 0x98, 0x61, 0x25, 0x28, 0xa4, 0x69, 0x1a, 0x77, 0xce, 0x55, 0x71, 0xe9,
+ 0x3e, 0x3b, 0x38, 0xd3, 0xa8, 0x9c, 0x13, 0xa1, 0xe7, 0xae, 0xa7, 0x96,
+ 0x3a, 0x31, 0x0d, 0x85, 0xb0, 0xa3, 0xb1, 0x1a, 0x8f, 0x19, 0x41, 0xfa,
+ 0xe9, 0x34, 0x42, 0x42, 0x89, 0x00, 0x03, 0x18, 0x60, 0x07, 0x12, 0x34,
+ 0xa3, 0x2c, 0x7e, 0x8e, 0x9f, 0x22, 0x0b, 0x2c, 0xd8, 0x23, 0xb4, 0x8e,
+ 0xff, 0x0b, 0xfc, 0xd8, 0x37, 0x9e, 0x63, 0xc7, 0xe4, 0x9d, 0xf6, 0xbf,
+ 0x65, 0xca, 0x65, 0xb7, 0xbd, 0xfb, 0x55, 0x08, 0x66, 0x34, 0x60, 0xea,
+ 0x3e, 0xcd, 0x9e, 0xa1, 0x7b, 0xd6, 0x26, 0x25, 0x1a, 0xb7, 0x51, 0x8c,
+ 0xda, 0x4b, 0xf4, 0xc4, 0xcc, 0x3f, 0x7c, 0xb5, 0x94, 0x85, 0x36, 0xb3,
+ 0xd7, 0x7c, 0xe4, 0x91, 0x88, 0xce, 0x79, 0x5d, 0xbd, 0x71, 0x48, 0x34,
+ 0xf5, 0x29, 0xba, 0x84, 0x9a, 0x0f, 0xb8, 0x4c, 0xa3, 0x2f, 0x7e, 0x17,
+ 0xc4, 0x37, 0x17, 0x57, 0x33, 0x9e, 0xce, 0xea, 0x7f, 0xd9, 0x32, 0x3c,
+ 0x69, 0xed, 0xb4, 0x50, 0xc9, 0xd4, 0xaf, 0x89, 0x30, 0x6e, 0xe6, 0xec,
+ 0x90, 0x00, 0x4c, 0xa0, 0x00, 0x77, 0xf9, 0x61, 0x45, 0x41, 0x77, 0x55,
+ 0x97, 0xaf, 0xe6, 0x92, 0x25, 0xb5, 0x10, 0x0e, 0x48, 0xf4, 0xc0, 0xc2,
+ 0x52, 0x09, 0xc7, 0x6c, 0x2d, 0x31, 0x6f, 0xd1, 0x64, 0xb5, 0x54, 0x13,
+ 0x1e, 0xc6, 0x93, 0xf8, 0x5c, 0x7f, 0x90, 0xa1, 0x4e, 0x15, 0xeb, 0x93,
+ 0x14, 0x95, 0x75, 0x48, 0xa5, 0x19, 0x70, 0x64, 0xee, 0xff, 0x57, 0xc9,
+ 0x9a, 0xf9, 0x3f, 0x38, 0x5b, 0x34, 0x20, 0x2d, 0x65, 0xb9, 0xc3, 0xac,
+ 0x89, 0x21, 0x4f, 0x12, 0xc6, 0x31, 0xd7, 0x16, 0x35, 0xb3, 0x58, 0x78,
+ 0xd6, 0xe7, 0x15, 0xa2, 0x66, 0xa6, 0xe3, 0x3c, 0x31, 0xc4, 0xf2, 0xcc,
+ 0x89, 0xc6, 0xa7, 0x31, 0xa8, 0x37, 0xb2, 0x4c, 0x19, 0xe1, 0x3e, 0x82,
+ 0x61, 0x72, 0xa1, 0x8c, 0xe1, 0xac, 0xad, 0x84, 0x72, 0x0f, 0xfb, 0x1f,
+ 0xd5, 0x40, 0x47, 0x98, 0x3a, 0x6c, 0xf8, 0xce, 0x54, 0x01, 0x07, 0xcc,
+ 0x19, 0x5a, 0x41, 0x17, 0x65, 0x69, 0x71, 0x96, 0x13, 0x38, 0xa6, 0xd1,
+ 0x97, 0xfd, 0xdc, 0x7b, 0x3c, 0x52, 0xf7, 0x1f, 0x8b, 0x7a, 0x3a, 0x65,
+ 0xe7, 0xbb, 0xe5, 0x8a, 0x7f, 0x4d, 0x5f, 0xa2, 0x74, 0xc7, 0x7b, 0x85,
+ 0xdf, 0x43, 0x9c, 0x2e, 0x63, 0x12, 0x40, 0xc5, 0xad, 0xa9, 0xe8, 0xd4,
+ 0x5b, 0xb0, 0x81, 0x57, 0xdb, 0x24, 0x21, 0x6e, 0x10, 0xaa, 0x05, 0x09,
+ 0x4b, 0x4c, 0x37, 0x0b, 0x35, 0x07, 0xa5, 0xb9, 0x3c, 0xdf, 0xb9, 0x9e,
+ 0x9d, 0x9d, 0x4f, 0x0e, 0x11, 0x86, 0x39, 0xd8, 0x32, 0x28, 0xfe, 0x5b,
+ 0x8d, 0xeb, 0x99, 0x2d, 0x06, 0xe9, 0xf1, 0x73, 0xa6, 0x69, 0xd5, 0xb7,
+ 0xd6, 0x7a, 0xbe, 0xe7, 0x84, 0xc1, 0x37, 0x94, 0xe6, 0xfa, 0x2a, 0x17,
+ 0xb3, 0x40, 0xed, 0x02, 0x9c, 0xc5, 0x50, 0x47, 0x4b, 0xfe, 0x56, 0xdb,
+ 0x74, 0x9d, 0x68, 0x7f, 0x36, 0xd4, 0xeb, 0x2c, 0x81, 0xa2, 0x24, 0xa8,
+ 0x30, 0x0c, 0x71, 0xd3, 0x98, 0xa0, 0xec, 0xb8, 0x7e, 0x95, 0x07, 0x5c,
+ 0xca, 0x90, 0x52, 0xbd, 0xa3, 0xaf, 0x20, 0x4f, 0x67, 0xc9, 0x29, 0x2c,
+ 0x7c, 0xf8, 0x3f, 0x29, 0x96, 0xa5, 0x12, 0x66, 0xb3, 0x57, 0x74, 0x32,
+ 0x9a, 0x17, 0x24, 0x41, 0x29, 0xb2, 0xff, 0x7a, 0xf2, 0xee, 0x63, 0x8c,
+ 0x33, 0xe8, 0x8d, 0x4c, 0x46, 0x51, 0x4c, 0x34, 0x97, 0x50, 0x56, 0x7d,
+ 0x9a, 0x62, 0x01, 0xef, 0x54, 0xd9, 0x70, 0xbb, 0x40, 0xbe, 0x68, 0x12,
+ 0x59, 0x9e, 0xe6, 0x75, 0xae, 0x05, 0xe2, 0x6a, 0x7f, 0xae, 0x91, 0x37,
+ 0x3c, 0xd6, 0x82, 0x31, 0x7c, 0x83, 0x21, 0xff, 0xb0, 0x5d, 0x01, 0xc1,
+ 0xee, 0xc6, 0xff, 0x77, 0x94, 0xe0, 0x0e, 0xe0, 0xe6, 0x64, 0x86, 0xf2,
+ 0xea, 0xb9, 0x7a, 0xa4, 0xc4, 0x42, 0xf4, 0xbd, 0x71, 0x7d, 0xa4, 0xd6,
+ 0x27, 0x34, 0x69, 0x4d, 0xa2, 0x82, 0xa7, 0x70, 0xcf, 0xc4, 0x0f, 0x85,
+ 0xe4, 0x8a, 0x9f, 0x45, 0x20, 0x15, 0x27, 0x14, 0xf8, 0x7f, 0xb1, 0x1b,
+ 0xf6, 0x65, 0xf2, 0xa9, 0xed, 0x01, 0xec, 0x56, 0x3a, 0xae, 0xcb, 0x39,
+ 0x0a, 0xd6, 0x50, 0xe5, 0x53, 0x9a, 0x3e, 0x68, 0xf7, 0x98, 0x44, 0x0d,
+ 0x1a, 0x3a, 0x9b, 0xc5, 0xb5, 0x26, 0x52, 0x04, 0x0b, 0x8f, 0x0b, 0x46,
+ 0x1d, 0x93, 0x2d, 0xd8, 0x2f, 0xfe, 0x9d, 0x73, 0x54, 0x2b, 0xb5, 0x8a,
+ 0xb6, 0xd4, 0x8b, 0x23, 0xfd, 0x05, 0x28, 0xe5, 0xe8, 0xef, 0xf5, 0xa1,
+ 0x91, 0xaf, 0x8a, 0x73, 0x3e, 0xd7, 0x57, 0xd1, 0xcd, 0x3b, 0xc6, 0xee,
+ 0x28, 0xb5, 0x87, 0xd4, 0xa4, 0x92, 0xaa, 0x93, 0xa2, 0x42, 0xbd, 0xb2,
+ 0x1b, 0xcb, 0x24, 0xcb, 0x4c, 0x71, 0x31, 0xce, 0x00, 0xeb, 0x82, 0xf9,
+ 0xdb, 0xe9, 0xab, 0xf2, 0x24, 0x0e, 0x79, 0xbc, 0x72, 0x7c, 0xce, 0x40,
+ 0xcb, 0xc6, 0x3e, 0xb4, 0xb7, 0x16, 0xdf, 0x8b, 0xb2, 0x10, 0x98, 0x9d,
+ 0xf7, 0x8d, 0x0b, 0x4d, 0xb9, 0xa7, 0xd8, 0x3d, 0xc1, 0xa0, 0x6d, 0x4a,
+ 0x8b, 0x54, 0x8a, 0xfe, 0xcd, 0x20, 0x80, 0x11, 0x61, 0x6d, 0x6d, 0x1b,
+ 0xec, 0x36, 0x9b, 0x0b, 0x80, 0xf8, 0x27, 0x76, 0x48, 0x04, 0x6a, 0x29,
+ 0x34, 0x2d, 0x0c, 0x3b, 0xcf, 0xe5, 0x52, 0x8b, 0x5a, 0x00, 0x05, 0xe3,
+ 0x24, 0xe7, 0x93, 0xd9, 0xe2, 0x50, 0x02, 0xa4, 0x45, 0xd2, 0x25, 0x37,
+ 0xbf, 0x8c, 0x77, 0x1e, 0xc9, 0x40, 0x04, 0x3c, 0x16, 0x19, 0x3d, 0x40,
+ 0xce, 0x9d, 0xe3, 0xa6, 0xbe, 0x19, 0x0f, 0x22, 0xe7, 0xdd, 0x9b, 0x25,
+ 0xaa, 0x32, 0x54, 0x1b, 0x84, 0x7b, 0xa4, 0x5f, 0xd3, 0xaf, 0x22, 0x23,
+ 0x3f, 0xec, 0x17, 0xe8, 0x49, 0x2a, 0xb6, 0xd8, 0xd0, 0x0d, 0x9d, 0x72,
+ 0xd5, 0xae, 0x06, 0xcb, 0x25, 0x52, 0xa8, 0xdc, 0x4c, 0x5a, 0xe3, 0x16,
+ 0xba, 0x25, 0x7c, 0xc8, 0x49, 0xf0, 0x51, 0xf6, 0x48, 0x17, 0xe5, 0x63,
+ 0xb3, 0xe5, 0x32, 0x56, 0x2a, 0x87, 0xa9, 0xbf, 0x7b, 0xaa, 0x7f, 0x1e,
+ 0xf1, 0x98, 0x38, 0x2b, 0xa4, 0x5a, 0x3e, 0x0d, 0xb5, 0x02, 0xbf, 0x74,
+ 0x8f, 0x5b, 0xd2, 0x2c, 0x0a, 0x6f, 0x2c, 0x18, 0x40, 0x32, 0x97, 0x2b,
+ 0x82, 0xaa, 0x18, 0xe6, 0x54, 0x49, 0xc0, 0x4f, 0xbd, 0x87, 0xd7, 0xe8,
+ 0x0f, 0x4e, 0xcb, 0x0b, 0xfd, 0x9d, 0xe2, 0xdf, 0xb4, 0xa4, 0xe9, 0x3a,
+ 0x7b, 0x5b, 0x57, 0x20, 0x50, 0x62, 0x7f, 0xca, 0x22, 0x08, 0x03, 0x71,
+ 0x6c, 0x6e, 0x90, 0x50, 0x23, 0x98, 0x35, 0x32, 0x8c, 0x29, 0xac, 0xa5,
+ 0x59, 0x53, 0x5e, 0xd9, 0xee, 0x2e, 0x0c, 0x0e, 0xa8, 0x36, 0xce, 0xf8,
+ 0xe1, 0xd0, 0xf0, 0xbe, 0xde, 0x53, 0x62, 0xac, 0x1f, 0xcb, 0x8b, 0x17,
+ 0x10, 0xd5, 0x34, 0xcb, 0x85, 0x8c, 0xf5, 0x54, 0x51, 0x8c, 0xf3, 0x4d,
+ 0x44, 0x90, 0x2d, 0x0b, 0x2c, 0x14, 0x0d, 0xc5, 0xe8, 0x9b, 0x76, 0xa5,
+ 0x1a, 0x0e, 0x56, 0xf1, 0x51, 0xaf, 0x4f, 0x07, 0xf5, 0x2e, 0xfd, 0xaa,
+ 0x98, 0xe7, 0x76, 0x8e, 0xb0, 0x8d, 0x19, 0x75, 0x8b, 0xbf, 0xa0, 0x54,
+ 0x2a, 0x96, 0x76, 0xfc, 0x56, 0x20, 0xf6, 0x3b, 0x58, 0xbc, 0x16, 0x87,
+ 0xa9, 0x16, 0x7a, 0xda, 0x0a, 0x81, 0x67, 0x51, 0x40, 0x33, 0x37, 0x54,
+ 0x36, 0x7c, 0x41, 0x6d, 0xc7, 0x6f, 0x3c, 0xf0, 0x0b, 0x3c, 0x37, 0xe8,
+ 0x9d, 0xf4, 0x9a, 0x79, 0xf8, 0x8e, 0x23, 0x27, 0x7c, 0x5a, 0x7d, 0xc3,
+ 0xde, 0x1e, 0xa8, 0xd8, 0x7a, 0x0d, 0x4e, 0x2c, 0x2f, 0x18, 0xa6, 0xeb,
+ 0xcd, 0x33, 0xd1, 0xe2, 0x1d, 0x3a, 0x5b, 0xd1, 0x4f, 0x06, 0xc4, 0x80,
+ 0x96, 0x7c, 0xeb, 0x22, 0xe8, 0xb3, 0x80, 0x5f, 0x3a, 0x30, 0x16, 0x13,
+ 0x8b, 0x48, 0xc6, 0x4b, 0x92, 0x24, 0xd3, 0xc6, 0x0e, 0xd3, 0x3f, 0xab,
+ 0xc1, 0x71, 0x0b, 0xfc, 0xe0, 0x45, 0xbe, 0xaa, 0xd3, 0xc9, 0xe1, 0x00,
+ 0x7c, 0x37, 0x48, 0xb1, 0x62, 0xaf, 0x6d, 0x62, 0xf9, 0x31, 0xb9, 0x92,
+ 0xbc, 0x79, 0x7e, 0xe5, 0x61, 0xae, 0xcc, 0x4b, 0x19, 0x31, 0xf4, 0x51,
+ 0xbf, 0x1d, 0x22, 0x25, 0x6e, 0xe3, 0xf5, 0x88, 0x70, 0x01, 0x77, 0xff,
+ 0x03, 0x6f, 0x61, 0x2b, 0x82, 0x1b, 0x3a, 0xc3, 0x6b, 0x1b, 0xe5, 0xef,
+ 0xc5, 0x40, 0x50, 0x49, 0x4b, 0x39, 0x33, 0x7c, 0x22, 0x5b, 0x5b, 0xbc,
+ 0xbe, 0x6e, 0x3d, 0x09, 0xfc, 0xa0, 0x6e, 0xb8, 0x76, 0x78, 0x0f, 0xeb,
+ 0x0c, 0xf4, 0x23, 0x79, 0x98, 0x9b, 0xf3, 0xc4, 0xfd, 0xbe, 0xb2, 0x85,
+ 0x45, 0xdc, 0xa0, 0x9b, 0xed, 0x82, 0xa9, 0x36, 0xcd, 0x94, 0xf6, 0x2b,
+ 0x60, 0x9d, 0xf4, 0x27, 0xe6, 0xbd, 0xf2, 0x6a, 0x91, 0xaf, 0xd8, 0x10,
+ 0xf1, 0xf4, 0xd4, 0xee, 0x7f, 0x33, 0x16, 0x04, 0xaf, 0xae, 0xd9, 0x88,
+ 0x28, 0x4e, 0xa8, 0xde, 0xce, 0x60, 0x02, 0x16, 0x45, 0x3e, 0x39, 0x7f,
+ 0x1c, 0xfc, 0xa3, 0x81, 0x97, 0x17, 0xf8, 0xbd, 0xad, 0xca, 0x32, 0x02,
+ 0x86, 0x46, 0xaa, 0xff, 0x7a, 0x39, 0xf9, 0xf0, 0xee, 0xa8, 0xaf, 0x56,
+ 0x74, 0x11, 0x92, 0xbf, 0xb4, 0x0a, 0x12, 0x80, 0x3d, 0x21, 0xd4, 0xca,
+ 0x28, 0x99, 0xb4, 0xd9, 0x99, 0x72, 0xe3, 0xdf, 0x0e, 0x31, 0xfb, 0x42,
+ 0xd6, 0xc3, 0x10, 0xd2, 0x28, 0x45, 0x67, 0x67, 0xfd, 0x81, 0xc8, 0x80,
+ 0x46, 0xed, 0xb2, 0x53, 0x54, 0x13, 0xbf, 0x21, 0x6e, 0xed, 0xe4, 0x3f,
+ 0x8c, 0xb7, 0x4b, 0x28, 0x5c, 0x2f, 0x4a, 0x78, 0x3c, 0x56, 0x09, 0x8b,
+ 0x36, 0x45, 0x81, 0xcb, 0x17, 0xbc, 0x3f, 0x86, 0x87, 0xdf, 0x64, 0xfa,
+ 0x76, 0x04, 0xd8, 0xb2, 0xa8, 0x3d, 0xf6, 0x69, 0x1c, 0xbc, 0x80, 0x19,
+ 0xea, 0x37, 0x1c, 0xf3, 0x28, 0xa8, 0x80, 0x1c, 0xc5, 0x85, 0x3c, 0xb8,
+ 0xc3, 0x29, 0x61, 0xba, 0x90, 0xc9, 0x6b, 0x25, 0xfb, 0xa6, 0x37, 0x7a,
+ 0x5c, 0xd6, 0x2a, 0xdd, 0xdb, 0x30, 0x40, 0x3b, 0x8e, 0x8d, 0xee, 0xd0,
+ 0xb8, 0x7e, 0xee, 0xe7, 0x2e, 0xd0, 0x34, 0xdf, 0x27, 0x6f, 0x23, 0xf5,
+ 0x5c, 0x2c, 0x13, 0x67, 0x4c, 0xb8, 0xb3, 0x52, 0xbc, 0xb6, 0x98, 0xf8,
+ 0x3f, 0x98, 0x20, 0x0a, 0x76, 0x7a, 0x27, 0x17, 0xa6, 0xab, 0x4b, 0x70,
+ 0x3d, 0x6d, 0xdc, 0x5d, 0x0a, 0xc7, 0x48, 0x82, 0x47, 0x8b, 0x62, 0x54,
+ 0x0b, 0x5a, 0x05, 0x03, 0x4d, 0x6f, 0xa4, 0xcb, 0x2b, 0x7c, 0x07, 0xe6,
+ 0x17, 0x9e, 0x8b, 0xb9, 0x52, 0x9e, 0xbf, 0x0f, 0x71, 0x9a, 0x61, 0x90,
+ 0x45, 0x59, 0x09, 0xa5, 0x90, 0x28, 0xfa, 0x49, 0x2e, 0x06, 0x21, 0x1b,
+ 0x7b, 0x13, 0x43, 0x75, 0x14, 0x95, 0x17, 0x8a, 0x91, 0x74, 0x47, 0x0c,
+ 0x90, 0x4b, 0xd5, 0xa0, 0x91, 0x80, 0x91, 0xa3, 0xa2, 0x39, 0x00, 0xdd,
+ 0x87, 0x4d, 0x2e, 0x90, 0x0a, 0x61, 0xca, 0x0f, 0xb3, 0x8b, 0xae, 0x04,
+ 0xa9, 0x04, 0xa6, 0xd9, 0x6e, 0x04, 0x83, 0xd8, 0xa4, 0xcc, 0x4a, 0x05,
+ 0x80, 0x53, 0x07, 0xa0, 0xe8, 0x68, 0xae, 0x64, 0x44, 0x9e, 0x51, 0xfb,
+ 0x41, 0xae, 0xb9, 0x68, 0x26, 0xfb, 0x8d, 0xae, 0x3f, 0xc7, 0x60, 0xbd,
+ 0x6c, 0x26, 0xe1, 0x63, 0xa1, 0x9a, 0xe8, 0x17, 0x84, 0x52, 0xee, 0xb0,
+ 0xa0, 0x8a, 0x83, 0x09, 0xcc, 0xbd, 0xd8, 0x68, 0x64, 0x4b, 0xcd, 0x72,
+ 0x39, 0xd1, 0xa0, 0xc0, 0x04, 0x46, 0xc6, 0xa8, 0x5e, 0x4d, 0x01, 0x7f,
+ 0x14, 0xdc, 0xd0, 0x42, 0xc3, 0xa0, 0xae, 0x45, 0x80, 0x4e, 0x52, 0x85,
+ 0x12, 0xa8, 0x0c, 0x86, 0x7a, 0xf8, 0x2d, 0x5a, 0x47, 0x5d, 0xa1, 0x99,
+ 0x33, 0x25, 0x3b, 0x4a, 0xc8, 0x3f, 0x57, 0xbf, 0x79, 0x07, 0xe8, 0x73,
+ 0x5b, 0x77, 0x52, 0x3a, 0x87, 0xe2, 0x67, 0x27, 0x4c, 0xda, 0xa6, 0x66,
+ 0x48, 0xe0, 0x99, 0x3d, 0xd0, 0xbe, 0x39, 0x09, 0xf7, 0xfb, 0x79, 0xce,
+ 0xe7, 0xf0, 0x47, 0xd0, 0x80, 0x3a, 0x6e, 0x26, 0x25, 0x27, 0xf7, 0x78,
+ 0xec, 0x53, 0xd4, 0x0b, 0x34, 0x42, 0x4a, 0x5c, 0xf9, 0x1f, 0xab, 0x86,
+ 0xd5, 0x2f, 0x5a, 0x4b, 0xc2, 0x53, 0x10, 0x40, 0xda, 0x75, 0x1b, 0x88,
+ 0x8d, 0x33, 0xdd, 0xe1, 0x29, 0x5f, 0xe5, 0x30, 0x95, 0xfc, 0x8b, 0x13,
+ 0x29, 0x3a, 0x7c, 0x5d, 0xa2, 0x24, 0x88, 0xf9, 0xa5, 0x30, 0xcb, 0xb1,
+ 0xb4, 0xae, 0x0f, 0x60, 0x59, 0x89, 0x6c, 0x98, 0x82, 0xef, 0xb7, 0x28,
+ 0xcf, 0x7b, 0xfe, 0xfa, 0x88, 0x0d, 0x62, 0x70, 0x49, 0x90, 0xd3, 0x31,
+ 0xe0, 0x0e, 0xb2, 0x74, 0x9b, 0x45, 0x4b, 0x43, 0xf4, 0xc4, 0xa9, 0xec,
+ 0x44, 0xd7, 0xb9, 0x21, 0x78, 0xf8, 0x18, 0xfe, 0x3e, 0xf5, 0xb2, 0x76,
+ 0x5b, 0x01, 0x70, 0xe6, 0xb8, 0xef, 0xc3, 0xcf, 0x0c, 0xb3, 0x0e, 0x6b,
+ 0xaa, 0xc9, 0xcf, 0xcf, 0x4a, 0x84, 0xa6, 0x40, 0x7d, 0xe9, 0xb7, 0x8d,
+ 0xcb, 0x7a, 0x7a, 0x29, 0xbd, 0x12, 0xf9, 0x88, 0x3f, 0xdc, 0x69, 0xa8,
+ 0x70, 0xc3, 0xf5, 0x01, 0x6f, 0x84, 0x5f, 0x1a, 0x21, 0xc0, 0x10, 0x58,
+ 0xaf, 0x2d, 0x10, 0x68, 0xbf, 0xc4, 0xdd, 0x50, 0xc9, 0x1d, 0x44, 0xf7,
+ 0x86, 0x86, 0x87, 0x0b, 0xa6, 0x1d, 0xef, 0xf3, 0x72, 0x0d, 0x34, 0xe6,
+ 0x68, 0xe7, 0x09, 0x9c, 0x93, 0x9b, 0x83, 0x2f, 0x81, 0x28, 0xfb, 0x4f,
+ 0x03, 0x83, 0xac, 0x75, 0x00, 0x14, 0x51, 0xb2, 0x21, 0x73, 0x35, 0x37,
+ 0x25, 0xab, 0xc0, 0x1c, 0x4d, 0x21, 0x0a, 0xab, 0x28, 0xa0, 0xe7, 0x5b,
+ 0x47, 0x5a, 0x07, 0x58, 0xa9, 0x85, 0xfc, 0x19, 0x43, 0x32, 0xc5, 0xea,
+ 0x89, 0x84, 0x57, 0xe6, 0x7e, 0xa3, 0x95, 0x81, 0x61, 0x6b, 0xbd, 0xc5,
+ 0x35, 0xf2, 0xc4, 0x24, 0xcd, 0xf0, 0x42, 0xff, 0xe0, 0x5e, 0xc2, 0xed,
+ 0x43, 0xd7, 0xea, 0x72, 0x34, 0x7f, 0x8b, 0x14, 0xc1, 0x85, 0xe5, 0x74,
+ 0x0e, 0x76, 0xa1, 0xe5, 0xd5, 0xa4, 0x5a, 0xe1, 0xc4, 0xe9, 0xf4, 0xa4,
+ 0xd2, 0xa8, 0xd3, 0x11, 0xc9, 0xb8, 0xeb, 0xa4, 0xd7, 0x30, 0xba, 0x49,
+ 0xb5, 0x62, 0xa2, 0xc4, 0x30, 0x26, 0x5b, 0x0d, 0x45, 0xaa, 0xce, 0x7b,
+ 0x6d, 0xb3, 0xe9, 0x90, 0x38, 0xf8, 0xaa, 0xc0, 0xb0, 0x00, 0x9b, 0x45,
+ 0x03, 0x34, 0x2d, 0x23, 0xa2, 0x75, 0xda, 0x59, 0xa0, 0xcb, 0x01, 0xcb,
+ 0xf5, 0x74, 0x60, 0x19, 0x47, 0x9f, 0xc9, 0x2b, 0xfa, 0x0c, 0xef, 0xde,
+ 0x1b, 0x7e, 0x33, 0x53, 0xbd, 0x78, 0x6f, 0x88, 0x34, 0x86, 0x80, 0x9a,
+ 0xd1, 0xbd, 0x6b, 0x89, 0x4f, 0xb0, 0x21, 0x7d, 0xf1, 0xcb, 0xc0, 0x23,
+ 0xc9, 0xf0, 0xbd, 0xa3, 0x6b, 0x79, 0xc3, 0xa5, 0x15, 0x09, 0xbc, 0xe0,
+ 0x25, 0x38, 0xed, 0x61, 0x4d, 0x7e, 0xc7, 0x68, 0xa7, 0x19, 0x2e, 0xb6,
+ 0xc8, 0xa0, 0x36, 0x8c, 0xda, 0xdf, 0xce, 0x3b, 0x8f, 0x95, 0x41, 0x5b,
+ 0x71, 0x95, 0xe3, 0xd3, 0x18, 0x89, 0x2e, 0x2b, 0x71, 0x11, 0x14, 0xf2,
+ 0x33, 0x84, 0x11, 0x69, 0xb0, 0x43, 0x0b, 0xd2, 0x45, 0xbd, 0x68, 0xfe,
+ 0xc4, 0x9e, 0x32, 0xc5, 0x77, 0x13, 0xea, 0xba, 0x8c, 0x5d, 0x20, 0x44,
+ 0x30, 0xe5, 0x25, 0xca, 0x75, 0x13, 0xef, 0xd8, 0x15, 0x6d, 0x8d, 0xe6,
+ 0xef, 0xe1, 0xe7, 0x6c, 0x83, 0xd8, 0x15, 0x6c, 0x6a, 0x66, 0x40, 0x9c,
+ 0x1b, 0xc2, 0x41, 0x41, 0xc0, 0x20, 0x66, 0x39, 0x87, 0x72, 0xc7, 0x59,
+ 0xdb, 0x0f, 0x4e, 0x15, 0x3a, 0x6d, 0x6f, 0x23, 0x55, 0x92, 0x59, 0xdc,
+ 0x46, 0xff, 0xd6, 0x19, 0x94, 0x01, 0xb5, 0x58, 0x16, 0x3c, 0x0b, 0x2e,
+ 0xdc, 0xa6, 0x4d, 0xf0, 0xcc, 0xcb, 0x8c, 0xab, 0xc1, 0xca, 0xa9, 0x36,
+ 0x13, 0x7e, 0xf2, 0x29, 0x13, 0xf0, 0x25, 0x1e, 0xd4, 0x8c, 0x21, 0x7a,
+ 0x93, 0xce, 0xc7, 0xb2, 0xca, 0x79, 0x69, 0x2d, 0xd4, 0x40, 0x0e, 0x59,
+ 0xae, 0x49, 0xaa, 0xea, 0xd3, 0x24, 0x01, 0xc6, 0x02, 0x36, 0x0d, 0x5e,
+ 0xd6, 0x00, 0x03, 0x03, 0x04, 0xe2, 0x9c, 0x01, 0x26, 0xbe, 0xd7, 0x28,
+ 0xde, 0x72, 0x44, 0xf7, 0xca, 0x5e, 0x20, 0xdb, 0x3a, 0x35, 0x63, 0xe9,
+ 0x90, 0x05, 0xfd, 0xb8, 0x3e, 0x98, 0x71, 0x42, 0x9d, 0x55, 0x96, 0xa4,
+ 0xd3, 0x78, 0x3b, 0x2c, 0xa5, 0x4a, 0x29, 0x40, 0xda, 0x42, 0x50, 0x9a,
+ 0x8a, 0x92, 0xec, 0x22, 0x92, 0xfd, 0x9f, 0x04, 0xe3, 0xa1, 0x9d, 0xea,
+ 0x01, 0x35, 0x88, 0xb2, 0xa9, 0x86, 0xcc, 0x2b, 0x48, 0x44, 0x9e, 0x96,
+ 0x1e, 0xf9, 0x85, 0xa2, 0x30, 0xab, 0xb5, 0x5b, 0xf1, 0x53, 0xb6, 0x0e,
+ 0xaa, 0xee, 0x0f, 0xd0, 0x80, 0x66, 0x6f, 0x47, 0xbd, 0x18, 0x3f, 0x04,
+ 0x5c, 0x6c, 0xdb, 0xe6, 0xc1, 0x02, 0x0c, 0xb1, 0x31, 0x93, 0x91, 0x16,
+ 0x7c, 0xfd, 0x70, 0x7f, 0x91, 0x66, 0x00, 0x13, 0x74, 0x6b, 0x65, 0xf9,
+ 0xdf, 0x33, 0xfc, 0xb5, 0xb3, 0x84, 0x59, 0xa4, 0xb0, 0x18, 0x8f, 0x5b,
+ 0x38, 0xc1, 0x2f, 0x83, 0x00, 0x97, 0x33, 0x14, 0x68, 0x0d, 0x64, 0x93,
+ 0xac, 0xbd, 0xfa, 0xdf, 0x6b, 0x97, 0x20, 0x42, 0x7e, 0x7e, 0xde, 0x2d,
+ 0x90, 0x32, 0x7d, 0x0f, 0x8b, 0xde, 0x2e, 0x7f, 0x10, 0x33, 0x59, 0xeb,
+ 0x85, 0xf7, 0x1f, 0x5a, 0x62, 0x1e, 0x3c, 0x14, 0xc2, 0x8a, 0xf7, 0xe2,
+ 0xeb, 0xbf, 0x9d, 0xd2, 0xe9, 0xe5, 0x6d, 0xa1, 0xa0, 0x87, 0x95, 0xa5,
+ 0x64, 0x72, 0xf3, 0xf3, 0x4f, 0x76, 0x7a, 0x2d, 0x53, 0x76, 0x5a, 0xfe,
+ 0xa5, 0xd0, 0xd2, 0xfa, 0xdd, 0x33, 0xb2, 0xaa, 0x67, 0x5f, 0x5c, 0x54,
+ 0xcb, 0xe7, 0xe2, 0x40, 0xcf, 0x69, 0x1d, 0xe8, 0x68, 0xba, 0x9c, 0xa8,
+ 0x96, 0xe7, 0xef, 0xce, 0xae, 0xfe, 0x70, 0x88, 0xcd, 0x1a, 0xec, 0xa3,
+ 0xd7, 0x6b, 0xf3, 0x1b, 0x1d, 0x2f, 0xc6, 0x83, 0x5e, 0x92, 0xb0, 0x11,
+ 0x74, 0x75, 0x1c, 0x6d, 0x62, 0xc8, 0x14, 0x6c, 0x33, 0x1a, 0x92, 0x25,
+ 0x6b, 0x61, 0x04, 0x29, 0xf1, 0x27, 0x36, 0xd3, 0x35, 0x5d, 0xd8, 0x01,
+ 0x6d, 0x31, 0xaa, 0xac, 0x61, 0xe6, 0xeb, 0x96, 0xd2, 0x39, 0x3b, 0xb8,
+ 0xa3, 0x0a, 0xde, 0x40, 0xc4, 0xaa, 0x59, 0x09, 0x0f, 0x82, 0x67, 0xe0,
+ 0xa6, 0xc3, 0x74, 0x2d, 0x37, 0x34, 0x5a, 0x47, 0x9d, 0xf8, 0x8e, 0x72,
+ 0xee, 0x8d, 0x74, 0x5d, 0x68, 0x3a, 0xc0, 0x2a, 0x80, 0x80, 0x16, 0x8b,
+ 0x14, 0x9d, 0xca, 0x04, 0xf4, 0x6c, 0x3b, 0x78, 0x6f, 0x38, 0x09, 0xb9,
+ 0xf6, 0xe0, 0x6b, 0x61, 0x65, 0x10, 0x34, 0x22, 0xe9, 0xac, 0x0f, 0x0b,
+ 0x27, 0x12, 0x0b, 0x77, 0x11, 0x29, 0x53, 0xb9, 0xdd, 0x98, 0x02, 0x1b,
+ 0xa1, 0x63, 0x63, 0x46, 0x1d, 0xb7, 0x73, 0x35, 0x2c, 0xf9, 0xb7, 0x39,
+ 0x50, 0x5a, 0xe9, 0xd5, 0x10, 0x9d, 0xa4, 0xc0, 0xe9, 0xe0, 0xa1, 0x42,
+ 0xe0, 0xd3, 0x39, 0x6d, 0x78, 0xa3, 0x42, 0x49, 0x42, 0xc1, 0x24, 0xe8,
+ 0x06, 0xc1, 0x08, 0xb7, 0xa4, 0xe4, 0xcc, 0xb7, 0x04, 0xf5, 0x65, 0x26,
+ 0x3d, 0xd0, 0xaa, 0x88, 0x7f, 0xec, 0x42, 0x19, 0xe2, 0xc3, 0x78, 0x9b,
+ 0x55, 0x77, 0xf7, 0x57, 0x79, 0x8b, 0xc0, 0x90, 0x47, 0xba, 0x0e, 0x58,
+ 0x23, 0x51, 0x01, 0x03, 0xcf, 0xd9, 0x1f, 0x97, 0xba, 0x05, 0x43, 0x59,
+ 0x9b, 0x3f, 0xad, 0x42, 0x82, 0xd8, 0xdf, 0x23, 0x3b, 0xf9, 0x0c, 0x66,
+ 0xa7, 0xed, 0x26, 0xc1, 0xc7, 0x82, 0x92, 0xf2, 0x7b, 0xe9, 0xbd, 0x7d,
+ 0x97, 0xb2, 0x04, 0xce, 0x6e, 0x60, 0x1c, 0x4e, 0x8e, 0x64, 0xa3, 0xa0,
+ 0x75, 0x49, 0x8a, 0xb3, 0x4a, 0x2d, 0xea, 0xef, 0x47, 0x8f, 0xaf, 0x8a,
+ 0x81, 0x5f, 0xb3, 0xee, 0x31, 0x69, 0x1f, 0x67, 0xe6, 0x73, 0xc5, 0x9a,
+ 0xc3, 0x74, 0xb0, 0x4e, 0x52, 0x0e, 0x2f, 0x73, 0xb9, 0x17, 0x8c, 0x2b,
+ 0x28, 0xce, 0xd5, 0x42, 0xcf, 0x0b, 0xf5, 0x35, 0x81, 0x53, 0x72, 0xea,
+ 0x0c, 0xaa, 0xad, 0xee, 0x42, 0x8c, 0x74, 0x78, 0x6b, 0x03, 0xf2, 0x6e,
+ 0x03, 0x66, 0x5f, 0x56, 0x2b, 0x51, 0x95, 0x22, 0xf5, 0x8d, 0xd6, 0x09,
+ 0x53, 0x60, 0xe7, 0xdf, 0x50, 0x13, 0x70, 0x18, 0x65, 0x29, 0x99, 0x62,
+ 0x56, 0xb4, 0x35, 0xb7, 0x64, 0x93, 0xb7, 0x48, 0x32, 0xbc, 0x15, 0xe8,
+ 0x87, 0xe5, 0xdb, 0xf6, 0xd2, 0x6a, 0x71, 0x02, 0x01, 0x69, 0x87, 0x79,
+ 0xa6, 0x86, 0xfc, 0x1f, 0x4d, 0x0a, 0x88, 0x0d, 0x51, 0x7f, 0xdc, 0x55,
+ 0x06, 0x96, 0xd0, 0x0f, 0x34, 0xa9, 0x5e, 0xda, 0x34, 0x75, 0x0f, 0x0f,
+ 0x9b, 0x9c, 0x49, 0xea, 0xac, 0x1e, 0x48, 0x72, 0xa2, 0x96, 0x2d, 0x7a,
+ 0x74, 0x74, 0x0f, 0x4b, 0x6e, 0x10, 0x6c, 0x00, 0xa7, 0x6a, 0xfd, 0x43,
+ 0xbc, 0x9a, 0x4a, 0x71, 0x68, 0xad, 0xef, 0x90, 0x15, 0x11, 0x5b, 0x4d,
+ 0x0c, 0xd4, 0xe5, 0xf4, 0x81, 0x1f, 0x01, 0x8b, 0x2d, 0x87, 0xb2, 0xeb,
+ 0x6f, 0xaf, 0x3c, 0xe6, 0xef, 0x37, 0x65, 0x6d, 0x6d, 0x3c, 0x49, 0xa1,
+ 0x85, 0x5a, 0x25, 0xf1, 0x9f, 0x04, 0xd9, 0x16, 0x36, 0xfa, 0x18, 0xc7,
+ 0x8e, 0x5a, 0x6c, 0x57, 0xb7, 0x73, 0xf7, 0xf5, 0xbd, 0xb0, 0x5c, 0x00,
+ 0x60, 0xc8, 0xe3, 0xda, 0x05, 0x50, 0x0f, 0xad, 0x18, 0xf3, 0xa9, 0x49,
+ 0xb1, 0xe0, 0x10, 0xe3, 0xd8, 0x06, 0x7f, 0x5f, 0xda, 0x82, 0xf7, 0xd7,
+ 0x67, 0xa1, 0xc6, 0xe2, 0x20, 0x89, 0xca, 0x94, 0xc0, 0xc0, 0xf3, 0x8e,
+ 0xbf, 0x79, 0x24, 0x48, 0x6e, 0x09, 0x68, 0x60, 0x0a, 0xa0, 0x1a, 0x66,
+ 0x54, 0xa0, 0xbc, 0x77, 0xb1, 0xd7, 0xf4, 0x24, 0x7e, 0x47, 0xdc, 0x8d,
+ 0x6e, 0x4b, 0xd4, 0x74, 0x6b, 0xde, 0x8c, 0xb0, 0xd2, 0xed, 0x8e, 0x40,
+ 0xd4, 0x14, 0x51, 0x81, 0xad, 0x82, 0x51, 0x4d, 0xe2, 0xf9, 0x72, 0x66,
+ 0xd9, 0x51, 0x9f, 0x1f, 0x41, 0x70, 0x3a, 0x60, 0xe1, 0x5d, 0x39, 0x35,
+ 0xb3, 0x66, 0xdb, 0xc0, 0xbd, 0x12, 0xd6, 0xf8, 0x5e, 0x3e, 0x2f, 0x9c,
+ 0x96, 0x1a, 0x62, 0xb7, 0xa4, 0x2f, 0x3b, 0xd2, 0x41, 0x36, 0x06, 0x4b,
+ 0xe6, 0x58, 0x53, 0x5e, 0x10, 0xbf, 0xa2, 0x21, 0xf2, 0x1d, 0xd2, 0x93,
+ 0xb6, 0x71, 0x8c, 0xe5, 0x51, 0x5d, 0xad, 0x7b, 0x24, 0x28, 0x9f, 0x70,
+ 0x70, 0xdc, 0x3a, 0x3a, 0xff, 0x6e, 0x91, 0x13, 0xe3, 0xfa, 0x3d, 0xfe,
+ 0x35, 0x38, 0x69, 0x03, 0xfb, 0x69, 0x8d, 0x2b, 0xe3, 0x0f, 0x16, 0x3e,
+ 0x5e, 0x8a, 0x3e, 0x1e, 0x50, 0x98, 0xce, 0x00, 0x8f, 0x0e, 0xbe, 0xbb,
+ 0x22, 0x09, 0xd5, 0x13, 0x9f, 0x12, 0x66, 0x81, 0xfa, 0x34, 0x81, 0x58,
+ 0xa1, 0x04, 0x17, 0x22, 0x1a, 0xe7, 0x51, 0x05, 0x98, 0x8d, 0x9d, 0x83,
+ 0xda, 0x24, 0xb6, 0x2f, 0x82, 0xbc, 0x15, 0xe0, 0x51, 0x7b, 0xb8, 0x70,
+ 0x7d, 0xf2, 0xaa, 0x19, 0x6c, 0x16, 0xdc, 0xf5, 0x27, 0xa7, 0xd6, 0x7e,
+ 0xca, 0x94, 0x0b, 0xe7, 0x37, 0x40, 0xd6, 0x17, 0x93, 0x7a, 0x32, 0xc9,
+ 0x4d, 0x9b, 0xd9, 0xbc, 0x2c, 0xa6, 0x1e, 0xdc, 0xb2, 0x9b, 0x00, 0xba,
+ 0x86, 0xf4, 0xce, 0x87, 0xb4, 0x3f, 0x9a, 0x1a, 0xc7, 0xa7, 0xd0, 0x49,
+ 0x41, 0x39, 0xe9, 0x99, 0x0b, 0x88, 0x54, 0x27, 0xf0, 0x76, 0xec, 0x01,
+ 0x3d, 0x3e, 0x2a, 0x39, 0x12, 0xa1, 0x34, 0xda, 0xab, 0x41, 0x8b, 0x86,
+ 0x80, 0x4c, 0x46, 0x03, 0x15, 0x64, 0x49, 0x29, 0x6b, 0xb9, 0xc4, 0xb0,
+ 0x34, 0xae, 0x6c, 0x44, 0x0d, 0xff, 0xa6, 0x91, 0x94, 0x43, 0xf0, 0xaf,
+ 0x4b, 0x3b, 0xef, 0x0f, 0x70, 0x4f, 0xcd, 0x9d, 0x78, 0xeb, 0xb7, 0x3b,
+ 0x1e, 0x08, 0x86, 0xa4, 0x02, 0x8c, 0xa2, 0xaf, 0x23, 0x43, 0xe6, 0x35,
+ 0x0e, 0xfc, 0x31, 0xdc, 0xeb, 0xf8, 0xa3, 0x81, 0xec, 0xde, 0x68, 0x87,
+ 0x2b, 0x8b, 0x93, 0xf4, 0xf7, 0x4c, 0xd8, 0x6c, 0xcc, 0x40, 0xe9, 0x5f,
+ 0xe0, 0x60, 0xfd, 0x6e, 0xd4, 0x52, 0x8e, 0x65, 0x89, 0xd6, 0xcc, 0x01,
+ 0xb4, 0x0c, 0x03, 0xdd, 0xb1, 0x1f, 0x7d, 0x0e, 0x5e, 0x09, 0x62, 0x5b,
+ 0xe0, 0x3f, 0x32, 0xd8, 0x7a, 0x8b, 0x84, 0xa9, 0x82, 0x90, 0xf9, 0x06,
+ 0xef, 0xea, 0xe2, 0x3b, 0x6e, 0x1e, 0x2c, 0x02, 0x97, 0xad, 0xae, 0x67,
+ 0xb4, 0x7d, 0xc6, 0xd5, 0xf3, 0xd5, 0xad, 0xb4, 0xcc, 0xa4, 0x87, 0x1d,
+ 0x9e, 0x0e, 0xfb, 0xc0, 0x4d, 0xd5, 0xcd, 0xd1, 0xb2, 0xfb, 0xe9, 0x02,
+ 0x7d, 0x40, 0xc2, 0x86, 0xb4, 0x5d, 0xe0, 0x07, 0x9b, 0x36, 0x03, 0x8f,
+ 0x93, 0xa3, 0x68, 0x91, 0x05, 0xea, 0x05, 0x55, 0x25, 0xd1, 0x6e, 0x4e,
+ 0x5b, 0xd6, 0x01, 0x0a, 0x9b, 0x66, 0x47, 0x56, 0xb5, 0x7d, 0xf4, 0x6c,
+ 0xe1, 0x43, 0xa0, 0x94, 0x7e, 0x4c, 0x9a, 0x48, 0xd0, 0x22, 0x54, 0x55,
+ 0x1b, 0x9d, 0x70, 0xe6, 0x34, 0x8c, 0x3e, 0xbb, 0xe5, 0xa6, 0x28, 0x89,
+ 0x66, 0xc8, 0xd4, 0xd5, 0x83, 0x1b, 0xaf, 0x55, 0xc3, 0x58, 0xce, 0x82,
+ 0x1e, 0x66, 0xa4, 0xbe, 0x37, 0x9c, 0x07, 0xe5, 0x1e, 0xac, 0x80, 0x6d,
+ 0x82, 0xe4, 0xf0, 0x8d, 0x81, 0x20, 0xb2, 0x71, 0xee, 0x28, 0x39, 0x74,
+ 0x11, 0xbb, 0xc6, 0xe5, 0x93, 0xde, 0xdf, 0x32, 0x8a, 0x1a, 0x9a, 0x37,
+ 0xf6, 0x0d, 0xf3, 0x07, 0x2f, 0x2f, 0x2c, 0x84, 0x71, 0xc8, 0x32, 0x45,
+ 0xb3, 0x70, 0x99, 0x93, 0x22, 0x64, 0xa3, 0x22, 0x54, 0x08, 0xd6, 0xd0,
+ 0xb6, 0x64, 0xaf, 0xc6, 0x03, 0x0c, 0x2f, 0x48, 0x75, 0x02, 0xda, 0x7c,
+ 0xb3, 0xfa, 0xab, 0x03, 0x09, 0xbf, 0xd0, 0xdd, 0xdb, 0xa5, 0x45, 0xef,
+ 0xec, 0xe9, 0x6e, 0x5b, 0xba, 0xbd, 0xbc, 0xa2, 0x01, 0x2b, 0xc0, 0x5f,
+ 0xa1, 0x7d, 0x9a, 0x05, 0x19, 0xfe, 0x63, 0xaa, 0x49, 0xcc, 0x3c, 0x7f,
+ 0x88, 0x41, 0x60, 0x12, 0x76, 0xa7, 0x50, 0x9f, 0x3e, 0x91, 0x0e, 0x6f,
+ 0x55, 0x94, 0x83, 0xf8, 0x54, 0xde, 0x07, 0x3b, 0x20, 0x9f, 0xc8, 0x50,
+ 0x13, 0xba, 0x48, 0x9a, 0xc4, 0x36, 0x05, 0xc9, 0x05, 0x62, 0x6e, 0x3e,
+ 0x42, 0xfa, 0xc9, 0x5d, 0x6f, 0x63, 0xd9, 0x30, 0x8d, 0x48, 0x93, 0xd4,
+ 0x08, 0x39, 0x81, 0x0f, 0x1f, 0x23, 0x51, 0x94, 0x2b, 0xa0, 0x0a, 0x5f,
+ 0x2c, 0x6d, 0x89, 0x0a, 0x24, 0x47, 0x3a, 0x57, 0x16, 0xaa, 0x4b, 0xab,
+ 0x8c, 0x87, 0x5d, 0x2a, 0xc1, 0x10, 0x26, 0x98, 0x7c, 0x0d, 0x52, 0x83,
+ 0xcc, 0x81, 0x04, 0x1b, 0x54, 0xd4, 0xf2, 0x09, 0xac, 0xe1, 0x70, 0x8e,
+ 0xe4, 0x2f, 0xc2, 0xc0, 0x8e, 0x77, 0x19, 0x8e, 0x34, 0x44, 0xe1, 0x42,
+ 0x3e, 0x60, 0x0e, 0xa0, 0x6e, 0xd9, 0xea, 0x13, 0xa4, 0xe8, 0x33, 0xbd,
+ 0xa5, 0xd4, 0x95, 0x05, 0x0f, 0xf9, 0x8c, 0x8d, 0x1f, 0x90, 0x68, 0x15,
+ 0x2a, 0xe4, 0xb2, 0x12, 0xc3, 0x6d, 0x6b, 0xbf, 0x15, 0xd6, 0x07, 0xd8,
+ 0x3d, 0xbf, 0x34, 0xe6, 0x4c, 0x18, 0x6b, 0x05, 0x78, 0x3b, 0x04, 0x3f,
+ 0x21, 0x5c, 0xc2, 0xba, 0xa0, 0x75, 0xdf, 0xc4, 0x97, 0x98, 0xd7, 0xd0,
+ 0x12, 0x27, 0xd2, 0x44, 0xde, 0x75, 0x4b, 0x9c, 0x0b, 0x39, 0x36, 0x60,
+ 0x69, 0x81, 0xb4, 0xa3, 0x75, 0xe8, 0x67, 0xd2, 0xfa, 0x3a, 0x5d, 0x6f,
+ 0x13, 0x20, 0x55, 0xe5, 0xbb, 0x2f, 0xd3, 0x4e, 0x3f, 0x08, 0x17, 0xc7,
+ 0x77, 0xfa, 0xad, 0x4d, 0xc6, 0xad, 0xe3, 0x10, 0x20, 0xf5, 0xb2, 0x90,
+ 0xbf, 0xf6, 0xef, 0xe9, 0x24, 0x9f, 0xd1, 0xfd, 0xa4, 0xfa, 0xd5, 0x5b,
+ 0xc2, 0xb4, 0x5a, 0xa1, 0xd2, 0xcc, 0x59, 0xd6, 0x43, 0xf7, 0xff, 0x06,
+ 0xf9, 0xeb, 0xef, 0x70, 0x4d, 0x3f, 0x67, 0x15, 0x80, 0x9a, 0x4f, 0xf8,
+ 0x9c, 0xce, 0xff, 0x62, 0x40, 0x82, 0x1c, 0x96, 0xc5, 0xd5, 0xac, 0x75,
+ 0x99, 0x92, 0xc4, 0xae, 0x9a, 0xd6, 0x6b, 0x09, 0x0e, 0x30, 0x9b, 0xa6,
+ 0xa6, 0x64, 0x5d, 0x52, 0x3d, 0x5f, 0x6c, 0x72, 0x0d, 0xdd, 0x11, 0x4d,
+ 0x71, 0xee, 0xb7, 0xe7, 0xf8, 0xe4, 0xd7, 0x78, 0x42, 0xe1, 0x4c, 0x24,
+ 0xf5, 0x60, 0x28, 0x30, 0x86, 0x92, 0x98, 0x6b, 0x4e, 0x8c, 0x1f, 0x79,
+ 0x89, 0x90, 0xb8, 0x49, 0x19, 0xfc, 0x04, 0x5a, 0xe4, 0x35, 0x45, 0x16,
+ 0x73, 0x17, 0x85, 0xa5, 0xe7, 0xb0, 0xba, 0xdb, 0x20, 0x1c, 0x52, 0x46,
+ 0xce, 0xbe, 0x82, 0xeb, 0x66, 0x20, 0x84, 0xaf, 0x5d, 0x35, 0xfa, 0xc8,
+ 0xb6, 0xf3, 0x5e, 0x80, 0x6a, 0xcd, 0xfd, 0xb7, 0x56, 0x87, 0x88, 0xfd,
+ 0x92, 0xaf, 0x74, 0xa6, 0xb7, 0xbc, 0x20, 0x60, 0x85, 0x30, 0x55, 0xf9,
+ 0xa0, 0x51, 0xf5, 0x74, 0x65, 0x7c, 0x64, 0xf8, 0x11, 0x2c, 0x6c, 0x30,
+ 0xf5, 0xb8, 0x6e, 0x33, 0xda, 0x9c, 0x33, 0xe1, 0xce, 0x14, 0x24, 0xfc,
+ 0x2f, 0x65, 0xba, 0x2f, 0x51, 0xe0, 0x3b, 0x2b, 0x67, 0x9b, 0xaf, 0x7c,
+ 0xac, 0x9e, 0x9a, 0xa6, 0x24, 0x87, 0x5a, 0xfd, 0xb4, 0x56, 0x51, 0xa4,
+ 0x62, 0x7f, 0x69, 0xd9, 0x3c, 0xce, 0x45, 0xfa, 0x97, 0xfd, 0xc5, 0xe3,
+ 0x36, 0xa0, 0x3a, 0x10, 0xf5, 0xe5, 0x88, 0x5c, 0x97, 0x34, 0x10, 0xab,
+ 0xbc, 0xe5, 0x45, 0xd3, 0xd6, 0xd6, 0x3f, 0x2e, 0x65, 0x64, 0xed, 0x7b,
+ 0x37, 0xae, 0x4e, 0xcc, 0xb0, 0x4b, 0x8c, 0xe6, 0x3a, 0x78, 0xb2, 0xea,
+ 0xfd, 0x0f, 0xbf, 0x7e, 0x23, 0xf8, 0x10, 0x97, 0xa2, 0xd0, 0xa8, 0x9a,
+ 0x74, 0x3a, 0x51, 0xaa, 0x95, 0x11, 0x04, 0x89, 0x0b, 0xb2, 0x20, 0xcd,
+ 0xec, 0x3d, 0xe5, 0xdf, 0x65, 0xfb, 0xe1, 0x13, 0xcb, 0x23, 0xee, 0x89,
+ 0x58, 0x2c, 0xa5, 0xc6, 0xef, 0xfa, 0x5d, 0x79, 0x5f, 0x73, 0x7d, 0x0a,
+ 0x51, 0xb1, 0x26, 0x9a, 0x7a, 0xb9, 0x16, 0x3e, 0xb3, 0x0f, 0x0b, 0x25,
+ 0x9f, 0xe9, 0xb6, 0xb5, 0xe7, 0x98, 0x52, 0x2e, 0xcc, 0x29, 0xc6, 0x4f,
+ 0xd3, 0xc7, 0x73, 0x40, 0xbb, 0xfb, 0x48, 0x57, 0x3f, 0xea, 0xf8, 0x12,
+ 0x79, 0x0f, 0x15, 0x86, 0x8f, 0x9d, 0xcc, 0xde, 0x73, 0xed, 0xc1, 0x25,
+ 0x72, 0x20, 0xb1, 0x04, 0xef, 0x56, 0x50, 0x16, 0x81, 0x96, 0x7b, 0x5f,
+ 0x50, 0x39, 0x8b, 0x1b, 0x5d, 0xcb, 0xce, 0x73, 0xe3, 0x05, 0x31, 0x63,
+ 0x5b, 0xcd, 0x45, 0x30, 0xa5, 0xee, 0x10, 0x39, 0xd6, 0xc6, 0x6d, 0x3b,
+ 0xda, 0xe7, 0x23, 0x4d, 0x55, 0x44, 0x05, 0x82, 0x9f, 0x63, 0x7a, 0x10,
+ 0x1b, 0x7d, 0x1c, 0xcf, 0x30, 0x93, 0xe1, 0x6c, 0xc5, 0xa1, 0x17, 0x45,
+ 0x8a, 0x4e, 0x76, 0xb0, 0xf8, 0x03, 0x61, 0x72, 0x8a, 0x42, 0x7b, 0x49,
+ 0xca, 0x9a, 0xf4, 0x83, 0x64, 0xce, 0xa5, 0xd0, 0xf1, 0x58, 0xa8, 0xfb,
+ 0x53, 0x90, 0xde, 0x2f, 0x14, 0x40, 0x49, 0x04, 0xd4, 0xb4, 0xd9, 0x5f,
+ 0x8d, 0x1c, 0x3e, 0x67, 0x35, 0x53, 0x03, 0x28, 0x45, 0xb9, 0x98, 0x77,
+ 0x33, 0x37, 0x81, 0x26, 0xae, 0xcb, 0x50, 0x22, 0x02, 0x8c, 0xe6, 0xda,
+ 0xf6, 0x0e, 0x9f, 0xd6, 0x40, 0xd9, 0x2d, 0xa3, 0xa0, 0xca, 0xaa, 0x4d,
+ 0xe0, 0x70, 0x39, 0x94, 0xb2, 0xa1, 0xf3, 0x57, 0xa6, 0x3f, 0x60, 0x56,
+ 0x7f, 0xc2, 0x80, 0x54, 0x1d, 0xff, 0x9b, 0x35, 0x71, 0x4a, 0xd6, 0xcd,
+ 0x54, 0xd0, 0xdb, 0x0b, 0xb2, 0xba, 0xda, 0xe1, 0xe6, 0xd1, 0x23, 0x2b,
+ 0x29, 0xc0, 0xdb, 0xa8, 0x63, 0x59, 0x8e, 0x84, 0xe1, 0x83, 0xa3, 0x73,
+ 0x9e, 0xd3, 0xb3, 0xb5, 0x70, 0x0e, 0xe7, 0xed, 0x44, 0xff, 0x25, 0x26,
+ 0xbf, 0x7c, 0xd5, 0xc7, 0xe2, 0xf7, 0xe0, 0x4c, 0xeb, 0x3f, 0xe1, 0x57,
+ 0xaa, 0xb5, 0x3f, 0x6c, 0xb4, 0x98, 0x42, 0xfd, 0xb5, 0x68, 0x96, 0xb3,
+ 0x46, 0x33, 0x84, 0xaa, 0x63, 0xe0, 0x0b, 0xb3, 0x5c, 0x5f, 0x2f, 0x1f,
+ 0xf1, 0x2f, 0xf9, 0x26, 0x7a, 0x66, 0x67, 0x0f, 0xa8, 0x09, 0x05, 0x28,
+ 0x3a, 0x51, 0x38, 0x0d, 0x92, 0x45, 0xba, 0xb7, 0xe2, 0x16, 0xad, 0xad,
+ 0x17, 0x16, 0x0f, 0x15, 0x8c, 0x12, 0xca, 0x21, 0x5d, 0xa7, 0x64, 0x1b,
+ 0xef, 0xf3, 0x55, 0x09, 0x26, 0xa6, 0x95, 0x8d, 0xa2, 0x69, 0x08, 0x42,
+ 0x0d, 0xa4, 0xc8, 0x74, 0xe9, 0xbc, 0x1f, 0x2f, 0x88, 0x99, 0x52, 0x9d,
+ 0xd5, 0x6d, 0x09, 0xc3, 0xf1, 0x8f, 0x1d, 0x7d, 0xd5, 0x48, 0x1f, 0x60,
+ 0x74, 0x25, 0xdf, 0xe6, 0x29, 0xf5, 0x19, 0x4f, 0xe3, 0x89, 0x03, 0x2c,
+ 0x58, 0xcd, 0x46, 0x63, 0xdd, 0xa8, 0x94, 0x86, 0x91, 0xb7, 0xb0, 0x8e,
+ 0x76, 0xd2, 0x3c, 0x87, 0x3d, 0xf7, 0xf2, 0xda, 0xe6, 0xcd, 0x70, 0xf3,
+ 0x5b, 0x43, 0x83, 0x7b, 0x5e, 0xb7, 0xcd, 0xde, 0xdb, 0x8d, 0x95, 0x91,
+ 0x14, 0x6d, 0xb5, 0xba, 0xb7, 0xae, 0x4a, 0xf1, 0x5b, 0xcd, 0x81, 0xbb,
+ 0xcd, 0x2c, 0x32, 0x4e, 0xdf, 0xac, 0x5a, 0x77, 0x7e, 0x5d, 0x8a, 0x0b,
+ 0x24, 0xe1, 0x32, 0x1e, 0x34, 0x6f, 0x48, 0xaa, 0x83, 0x6c, 0x1e, 0x94,
+ 0x76, 0x7c, 0xf7, 0xa0, 0xf7, 0xc1, 0xfb, 0xac, 0x8a, 0x56, 0xe7, 0xad,
+ 0x4a, 0xf3, 0xe4, 0xc8, 0xca, 0xfd, 0xab, 0xd6, 0xda, 0x4d, 0xb3, 0xe3,
+ 0xc9, 0xd2, 0xf9, 0x26, 0x45, 0x62, 0x84, 0xe9, 0xb6, 0xfe, 0xea, 0xbc,
+ 0xb1, 0xce, 0xf5, 0xb9, 0xe4, 0xe8, 0x9e, 0xc2, 0xed, 0x6d, 0x08, 0xeb,
+ 0x3b, 0x67, 0xcf, 0x3e, 0x69, 0x2a, 0x66, 0xf9, 0x52, 0xd5, 0x52, 0xf1,
+ 0x48, 0x6f, 0xa5, 0x9c, 0xe6, 0xc1, 0xd1, 0xbd, 0xff, 0xfd, 0x55, 0x03,
+ 0x31, 0xaa, 0x57, 0xae, 0x3f, 0x15, 0x29, 0x3d, 0xe2, 0x85, 0x76, 0x4d,
+ 0x57, 0xdc, 0x0b, 0x3c, 0x5b, 0xb5, 0xcb, 0x92, 0xcb, 0x8f, 0x1d, 0xf4,
+ 0xad, 0x2f, 0xc7, 0x54, 0xe2, 0xdc, 0xfa, 0xe1, 0xd7, 0xd1, 0xbf, 0x0d,
+ 0x1f, 0x69, 0x02, 0xdb, 0xb3, 0x74, 0xba, 0x4b, 0x5a, 0x96, 0xf8, 0xa8,
+ 0x2f, 0xfa, 0x5e, 0x18, 0xb7, 0xf5, 0x09, 0xbf, 0x44, 0xb4, 0xcc, 0xf7,
+ 0x57, 0xd9, 0x05, 0x6b, 0x7a, 0x57, 0x55, 0x59, 0xbe, 0x51, 0x96, 0x0c,
+ 0x2a, 0xc7, 0x59, 0xf9, 0x00, 0xad, 0xcd, 0xc6, 0x55, 0xee, 0x0b, 0xe2,
+ 0xfc, 0xf5, 0x8d, 0x3b, 0x9b, 0x8b, 0x19, 0x42, 0x7b, 0x1a, 0xba, 0x6c,
+ 0x99, 0x9a, 0xb4, 0x00, 0xee, 0x12, 0xf9, 0x3b, 0x98, 0x9a, 0x51, 0x9c,
+ 0xdc, 0xa7, 0xc5, 0x89, 0x76, 0xda, 0x16, 0x7c, 0xe7, 0x1e, 0xb3, 0xe5,
+ 0x9e, 0x20, 0x9f, 0xe7, 0x4c, 0xd9, 0x14, 0xef, 0x07, 0xcf, 0xb2, 0xb7,
+ 0x82, 0xec, 0xcf, 0x2e, 0xd6, 0x77, 0x91, 0x42, 0x2d, 0x38, 0xc4, 0xba,
+ 0x6b, 0x75, 0x26, 0x23, 0x85, 0xe6, 0x86, 0x37, 0x22, 0x26, 0xc5, 0x79,
+ 0xe9, 0x87, 0xf1, 0x43, 0xb6, 0xcf, 0xba, 0x79, 0xcd, 0x6e, 0x40, 0x77,
+ 0x2f, 0xec, 0x6b, 0x64, 0xba, 0x28, 0x61, 0x7c, 0xed, 0x60, 0x8c, 0x69,
+ 0x4a, 0xa8, 0xc9, 0x00, 0x59, 0xc5, 0x41, 0x8e, 0x87, 0x01, 0x2a, 0x1f,
+ 0x0c, 0xc4, 0x76, 0x30, 0x27, 0x56, 0xd3, 0x22, 0x86, 0x54, 0x6c, 0xc0,
+ 0xd8, 0x1c, 0x5b, 0x78, 0x34, 0xcc, 0xd2, 0x0f, 0x0f, 0x82, 0x80, 0x67,
+ 0x75, 0x09, 0x49, 0xaa, 0x14, 0xe6, 0x64, 0x89, 0xab, 0xd0, 0xeb, 0x7e,
+ 0x5a, 0x95, 0x80, 0xd7, 0x5a, 0x89, 0x32, 0x4d, 0xbd, 0x12, 0x3f, 0x94,
+ 0xbf, 0x13, 0xe7, 0x49, 0x22, 0x17, 0xc3, 0x02, 0xc3, 0xe1, 0x15, 0x46,
+ 0x68, 0xbc, 0xd6, 0x60, 0x89, 0x89, 0x23, 0x98, 0xd8, 0x03, 0xbf, 0x24,
+ 0x71, 0x0b, 0x00, 0xcb, 0x0e, 0x6c, 0xb2, 0x93, 0xcf, 0xf1, 0x3d, 0x1c,
+ 0xb3, 0xef, 0x86, 0xb5, 0xd7, 0x08, 0x4f, 0x43, 0x29, 0xb6, 0xf2, 0x0e,
+ 0x08, 0x2d, 0xb5, 0x4b, 0x0d, 0x74, 0xe5, 0xb6, 0x0d, 0x6c, 0xee, 0xf8,
+ 0xb4, 0x81, 0x00, 0x39, 0x53, 0x6a, 0x89, 0x75, 0x42, 0x0f, 0x78, 0x7f,
+ 0x2e, 0xcb, 0xe4, 0x63, 0x97, 0x30, 0x8b, 0x32, 0xad, 0xaa, 0xd8, 0xf9,
+ 0xc4, 0xe5, 0x82, 0x9b, 0x2b, 0xde, 0xc1, 0x2d, 0x82, 0x64, 0xed, 0x51,
+ 0x2a, 0x63, 0x66, 0xef, 0x18, 0x48, 0x94, 0x8d, 0xfc, 0x67, 0xc8, 0x1c,
+ 0x57, 0xe7, 0xef, 0x12, 0x2e, 0x88, 0xc4, 0xfe, 0x7e, 0xab, 0xd2, 0x74,
+ 0x5a, 0xa4, 0x73, 0xf4, 0x28, 0x9f, 0xc8, 0x78, 0x29, 0xc8, 0xce, 0xa7,
+ 0x86, 0xea, 0x22, 0xa3, 0xb9, 0x99, 0x19, 0x33, 0xd9, 0x89, 0xd6, 0xc0,
+ 0x20, 0x9f, 0x98, 0x72, 0x8e, 0x9b, 0xfe, 0x5b, 0xff, 0xbb, 0x61, 0x11,
+ 0x11, 0x04, 0x49, 0xe4, 0xb5, 0x3f, 0x5b, 0x53, 0xb7, 0x58, 0x61, 0x97,
+ 0x90, 0xc9, 0x9b, 0x08, 0xdf, 0xd5, 0x81, 0xad, 0x7a, 0x50, 0x57, 0xbf,
+ 0xba, 0x03, 0xfa, 0xef, 0x9e, 0x74, 0x52, 0xe7, 0x5f, 0x16, 0xab, 0xa3,
+ 0x94, 0xeb, 0x8b, 0x0a, 0xe6, 0x85, 0x16, 0xb1, 0x7e, 0x55, 0x10, 0x60,
+ 0x92, 0x6b, 0x00, 0x07, 0x1d, 0xc4, 0x32, 0x3c, 0x29, 0x7a, 0x78, 0xa7,
+ 0x58, 0x23, 0x79, 0xfd, 0x6c, 0x57, 0x9e, 0x63, 0xc6, 0x50, 0xe8, 0x7d,
+ 0x23, 0xe8, 0xc7, 0x8a, 0x41, 0x94, 0x58, 0x0c, 0xf0, 0x33, 0x75, 0x0a,
+ 0x20, 0x45, 0x74, 0xcd, 0x5d, 0x33, 0x9c, 0x4d, 0x97, 0x6c, 0xbe, 0xee,
+ 0xdb, 0xb5, 0x8b, 0x61, 0x69, 0xfd, 0xd4, 0xa1, 0x2a, 0x52, 0x7e, 0x08,
+ 0x36, 0x4b, 0xfa, 0xe9, 0xf4, 0x5b, 0x3d, 0x0c, 0x2f, 0x4e, 0x06, 0xb8,
+ 0xfe, 0x96, 0x6d, 0xf5, 0x9c, 0x4e, 0x45, 0xa6, 0x68, 0x5b, 0x78, 0xf0,
+ 0x1d, 0x2e, 0x83, 0x59, 0x35, 0xc0, 0x99, 0x66, 0x98, 0x85, 0xe4, 0xc3,
+ 0x33, 0xac, 0x61, 0x9d, 0x9f, 0xe1, 0x14, 0x4c, 0x78, 0xf3, 0xff, 0x0a,
+ 0x97, 0xf7, 0x64, 0xb4, 0x0c, 0x93, 0x0c, 0x71, 0xe9, 0x01, 0x90, 0xae,
+ 0x18, 0xe3, 0x4a, 0xc3, 0x04, 0x9e, 0xce, 0x9d, 0x10, 0x32, 0x42, 0x54,
+ 0xdb, 0xbd, 0x40, 0x72, 0x89, 0xc6, 0x32, 0xda, 0x08, 0x82, 0xea, 0x41,
+ 0xe2, 0x4a, 0x40, 0x50, 0x41, 0xaf, 0x90, 0x81, 0x94, 0x9f, 0xac, 0x9a,
+ 0xa0, 0x3b, 0xc2, 0x62, 0x38, 0x40, 0xe0, 0xc6, 0x7a, 0x56, 0x6e, 0x69,
+ 0xb6, 0xe5, 0xdc, 0xd6, 0x24, 0x77, 0x7c, 0xf6, 0x38, 0xfe, 0x3c, 0x98,
+ 0xcc, 0xe1, 0x95, 0x87, 0x68, 0xc3, 0x76, 0x5a, 0x9e, 0x89, 0xb6, 0x9f,
+ 0xf3, 0xd6, 0x3c, 0x1f, 0x88, 0xcc, 0x59, 0x4b, 0x9e, 0x09, 0x31, 0xff,
+ 0xa3, 0x12, 0xa3, 0xa9, 0x22, 0x65, 0xaf, 0xc9, 0xd3, 0x58, 0x79, 0xa3,
+ 0x0c, 0x7e, 0x82, 0xa2, 0x83, 0xd2, 0xa1, 0x34, 0x5b, 0x54, 0x17, 0x36,
+ 0x72, 0x5b, 0x73, 0x64, 0x36, 0x3e, 0x4d, 0xb8, 0xfd, 0x0d, 0x13, 0xa0,
+ 0x8a, 0xd0, 0x36, 0x87, 0x63, 0x82, 0x98, 0x99, 0x3e, 0x49, 0x09, 0xb1,
+ 0x55, 0x0d, 0x26, 0x6a, 0xda, 0x9c, 0x5a, 0x10, 0x0f, 0xdd, 0xa7, 0xdf,
+ 0xaa, 0x0b, 0x1c, 0xa1, 0xee, 0x6e, 0xe1, 0xd3, 0xff, 0x82, 0xeb, 0x26,
+ 0xa3, 0xbc, 0x33, 0x71, 0xb5, 0xb7, 0xfe, 0x30, 0xd6, 0x28, 0x65, 0x01,
+ 0xc2, 0x6a, 0x36, 0xa2, 0x76, 0x69, 0x53, 0x19, 0x43, 0x1f, 0xdf, 0x4d,
+ 0x55, 0x1b, 0xf2, 0xa1, 0xdb, 0x3f, 0xbc, 0x73, 0x05, 0x82, 0xb1, 0xab,
+ 0xca, 0x04, 0x99, 0xb9, 0x93, 0x3f, 0x19, 0x6e, 0x30, 0xef, 0x87, 0xc9,
+ 0xbf, 0x78, 0x38, 0x83, 0xf9, 0x5c, 0x60, 0xc1, 0x84, 0xc7, 0x2b, 0xcb,
+ 0xf4, 0x3d, 0x16, 0xf3, 0x5b, 0xc2, 0xf4, 0x07, 0x2f, 0xf6, 0xe4, 0x6a,
+ 0x3c, 0x4a, 0xc3, 0x23, 0x5f, 0x1d, 0x6d, 0xb1, 0xe9, 0x2b, 0xa7, 0xf7,
+ 0x91, 0x44, 0xca, 0x0a, 0xce, 0xa1, 0x59, 0xf8, 0x7f, 0x08, 0x17, 0x66,
+ 0xbc, 0xa7, 0x1b, 0x4c, 0x41, 0x50, 0xee, 0x4f, 0xbc, 0xed, 0x50, 0xbd,
+ 0xf6, 0xfa, 0xa1, 0xd2, 0x81, 0x23, 0x9e, 0x9e, 0x4a, 0x78, 0xa1, 0xe1,
+ 0xe9, 0xf1, 0xac, 0xe4, 0xb9, 0x1c, 0x71, 0x75, 0x5c, 0xdd, 0x28, 0x22,
+ 0x21, 0x86, 0xaa, 0xcf, 0x2f, 0xed, 0x02, 0x78, 0x53, 0xa2, 0xf4, 0x7c,
+ 0x49, 0x46, 0xa0, 0xe0, 0x04, 0x14, 0x3a, 0xac, 0x48, 0x38, 0xc1, 0x7a,
+ 0x8f, 0x22, 0x13, 0xb5, 0x90, 0x24, 0x51, 0xe6, 0xe5, 0x44, 0x77, 0xe8,
+ 0xbe, 0x6f, 0xb4, 0xe2, 0xa0, 0xa4, 0x38, 0xad, 0x3a, 0xb8, 0x21, 0xbc,
+ 0x0e, 0x69, 0x2f, 0xc7, 0xfe, 0x53, 0x5a, 0x06, 0xb7, 0x88, 0x42, 0xbd,
+ 0xbe, 0x8d, 0x1f, 0x1d, 0xe4, 0xf3, 0xda, 0xa1, 0xcd, 0x03, 0x3e, 0x33,
+ 0x6a, 0x6d, 0x31, 0x35, 0xbf, 0x5f, 0xb3, 0x0d, 0x6f, 0xf8, 0x7c, 0x16,
+ 0xde, 0xa8, 0xcb, 0x69, 0xf3, 0x91, 0x09, 0xb5, 0xe2, 0x9d, 0x7b, 0xdf,
+ 0x23, 0x10, 0xb4, 0xd3, 0x40, 0x1c, 0xdc, 0x33, 0x90, 0x05, 0x5a, 0x9b,
+ 0x83, 0xd8, 0x8e, 0x49, 0xd7, 0x1e, 0x91, 0xf8, 0x1c, 0xbd, 0xcf, 0x01,
+ 0x54, 0xb6, 0x4f, 0x01, 0x86, 0x90, 0xda, 0x68, 0x41, 0x72, 0xea, 0x2e,
+ 0xe3, 0xb1, 0x44, 0x06, 0x19, 0x9d, 0xc2, 0x7c, 0x4d, 0x86, 0xe9, 0x0d,
+ 0x71, 0x5f, 0x63, 0xc2, 0xdd, 0x78, 0x7f, 0x4e, 0x6f, 0x16, 0x11, 0x3d,
+ 0x35, 0xd9, 0xb4, 0xf0, 0xb4, 0xa7, 0x88, 0xc4, 0x7d, 0x80, 0x04, 0x96,
+ 0x1b, 0xae, 0x78, 0x0a, 0x3d, 0x8f, 0xe4, 0x14, 0x31, 0xa0, 0x2f, 0x6c,
+ 0xac, 0xd6, 0x06, 0xf4, 0x03, 0x44, 0xfb, 0xaa, 0x3d, 0xa9, 0x7e, 0xf1,
+ 0xf2, 0x86, 0x3d, 0x58, 0xdc, 0xb4, 0xba, 0x67, 0xf8, 0xc6, 0x71, 0x0d,
+ 0xf0, 0x1a, 0xfe, 0x5d, 0x9b, 0x9d, 0x48, 0x91, 0x27, 0x44, 0xd2, 0x3c,
+ 0x2b, 0x1d, 0x91, 0xb5, 0x46, 0x3e, 0x39, 0x0d, 0xb5, 0xe8, 0x36, 0xeb,
+ 0xe3, 0xf2, 0xb6, 0x8a, 0xe6, 0xb2, 0xbd, 0x6d, 0xa3, 0xe0, 0x3f, 0xf9,
+ 0xf3, 0xef, 0xe6, 0xc8, 0xd1, 0x88, 0x48, 0xda, 0xf5, 0xd4, 0x3d, 0x16,
+ 0xee, 0x95, 0x28, 0xee, 0x79, 0x4d, 0xe1, 0xbb, 0xb0, 0x96, 0x57, 0xea,
+ 0x27, 0xfb, 0x95, 0x31, 0x49, 0x14, 0xba, 0xc3, 0xa5, 0xd2, 0xf9, 0x60,
+ 0xf4, 0xdd, 0x95, 0x78, 0x38, 0xa4, 0x5f, 0x44, 0x49, 0xc6, 0x7d, 0x24,
+ 0x63, 0x30, 0x49, 0x83, 0x07, 0x2d, 0xb6, 0xa8, 0xd7, 0x35, 0x36, 0xa1,
+ 0x10, 0xfd, 0xda, 0xa8, 0x62, 0x99, 0x18, 0xec, 0x73, 0x4a, 0x03, 0x91,
+ 0x82, 0x8d, 0xf8, 0x1c, 0xa4, 0x9d, 0xd5, 0x57, 0x45, 0x79, 0xd1, 0xaa,
+ 0xbf, 0x24, 0xba, 0xeb, 0x8b, 0x18, 0x6f, 0x42, 0x7f, 0x34, 0x14, 0xc9,
+ 0x07, 0x7e, 0xfe, 0x0a, 0xc9, 0x27, 0x28, 0x7e, 0x31, 0x03, 0x9e, 0xb7,
+ 0x13, 0xbb, 0x3f, 0x95, 0xec, 0x6b, 0x81, 0x60, 0xa6, 0x52, 0x3a, 0xf2,
+ 0x13, 0xb4, 0x4d, 0xbb, 0xd2, 0x54, 0x60, 0xfb, 0x74, 0x9f, 0x2d, 0xd6,
+ 0xaa, 0xf3, 0x8b, 0xfa, 0x5f, 0xb2, 0x88, 0x64, 0x77, 0x17, 0x0a, 0xc6,
+ 0xa4, 0x47, 0x2a, 0xe2, 0xf3, 0x50, 0x72, 0xba, 0x21, 0x2d, 0xbf, 0xe2,
+ 0xf7, 0x23, 0xd3, 0x27, 0x2d, 0x5f, 0xf6, 0x00, 0x44, 0xfe, 0xe6, 0xc4,
+ 0xfb, 0x1f, 0xb1, 0x58, 0x7c, 0x2c, 0x80, 0x2e, 0x34, 0x01, 0x6f, 0xce,
+ 0xd4, 0x3b, 0x70, 0x40, 0x5e, 0x77, 0x56, 0x17, 0xac, 0xb8, 0xd7, 0xe3,
+ 0x5d, 0x94, 0x06, 0x0c, 0x85, 0xbd, 0x6e, 0xf1, 0xd7, 0x0d, 0xc7, 0x5d,
+ 0x13, 0x9e, 0xed, 0x57, 0xd3, 0x85, 0xcb, 0x5c, 0x4d, 0x44, 0x1c, 0xe8,
+ 0x05, 0xcc, 0xd0, 0x74, 0xad, 0x83, 0x6e, 0x30, 0x27, 0x71, 0x4b, 0xe6,
+ 0x38, 0x09, 0x8a, 0x6b, 0xb6, 0xd2, 0x1a, 0xb8, 0xb4, 0xc0, 0x54, 0xb3,
+ 0x18, 0x80, 0xf2, 0x77, 0x25, 0xf5, 0x68, 0x09, 0x6e, 0x2e, 0x17, 0x39,
+ 0x9d, 0xda, 0x22, 0x1a, 0xce, 0xae, 0x40, 0xf3, 0x0a, 0x88, 0xbc, 0xf4,
+ 0x8b, 0x7d, 0x4a, 0x9f, 0xec, 0x9a, 0x1a, 0xb8, 0xd7, 0x5e, 0x03, 0x56,
+ 0x4d, 0xf7, 0x03, 0x19, 0x9b, 0x9c, 0xaf, 0x8c, 0x5e, 0xf9, 0x99, 0x21,
+ 0xa2, 0xb9, 0xa7, 0x46, 0x34, 0x0b, 0x16, 0x47, 0x8d, 0xfa, 0xca, 0x91,
+ 0x49, 0x2e, 0x5f, 0x58, 0xf5, 0x81, 0xd4, 0xf9, 0x4b, 0x68, 0x45, 0x1b,
+ 0xdb, 0x67, 0xd5, 0x6a, 0x85, 0xc8, 0xb9, 0x71, 0x53, 0x31, 0x45, 0xd8,
+ 0x5f, 0x70, 0xc1, 0xce, 0x4a, 0xd0, 0x51, 0x43, 0xd3, 0x95, 0xe7, 0x69,
+ 0x6b, 0xcc, 0x19, 0x2c, 0xf7, 0xc2, 0x89, 0x7a, 0x50, 0x41, 0x65, 0x15,
+ 0x09, 0x2a, 0x76, 0x2d, 0x12, 0xb8, 0xd9, 0x7b, 0x33, 0x9f, 0xb1, 0xaf,
+ 0x81, 0xa5, 0xc8, 0x53, 0xc4, 0x8f, 0xe8, 0x89, 0x80, 0xef, 0x93, 0x66,
+ 0xb7, 0x15, 0x74, 0x4a, 0xf9, 0x41, 0x3d, 0x95, 0x75, 0x92, 0xa2, 0x16,
+ 0x76, 0xe0, 0xa3, 0x5d, 0x55, 0x9b, 0x3b, 0x6d, 0x0d, 0x06, 0x62, 0x46,
+ 0x11, 0xd6, 0xe5, 0xeb, 0x6d, 0x93, 0x62, 0x11, 0x5c, 0xcb, 0x22, 0x86,
+ 0x4d, 0x68, 0x0b, 0xa2, 0x63, 0x74, 0x67, 0x79, 0x6d, 0x66, 0x2d, 0x51,
+ 0x8e, 0xd5, 0xaa, 0x45, 0xc2, 0x34, 0x0f, 0xad, 0x4c, 0xef, 0xa5, 0x90,
+ 0x94, 0x19, 0x4d, 0x48, 0xf9, 0xb5, 0x92, 0xa7, 0xdb, 0x37, 0xc8, 0x6f,
+ 0x24, 0x85, 0xf3, 0xc4, 0xd9, 0x26, 0x2c, 0x64, 0x7f, 0xa8, 0x86, 0x47,
+ 0x46, 0x35, 0xc2, 0xdf, 0x54, 0x42, 0x52, 0x1f, 0x43, 0x43, 0xcb, 0x50,
+ 0x1b, 0xbf, 0xf6, 0xd8, 0x11, 0x7d, 0x31, 0x4c, 0xc3, 0x2d, 0x70, 0xb3,
+ 0xa0, 0x6b, 0x6d, 0xcc, 0x88, 0xc3, 0xa7, 0x59, 0xe0, 0x2f, 0xaa, 0xdb,
+ 0x98, 0x9d, 0x9f, 0x7b, 0x28, 0x79, 0x0b, 0xa7, 0x7a, 0x90, 0x9f, 0x11,
+ 0x3a, 0xca, 0x3a, 0xc5, 0xd1, 0x6f, 0x0b, 0x90, 0xe9, 0x7a, 0x9d, 0x72,
+ 0x7a, 0xb5, 0x84, 0xf3, 0x46, 0xf2, 0x61, 0x96, 0xda, 0xf3, 0x3a, 0x72,
+ 0x50, 0x67, 0xc0, 0xe7, 0xe3, 0x4c, 0x82, 0xb6, 0x38, 0x72, 0x02, 0x05,
+ 0xcd, 0x8e, 0xe6, 0xf1, 0x9b, 0x21, 0x00, 0x4c, 0xfe, 0x78, 0xf6, 0x73,
+ 0x49, 0x95, 0x8b, 0x41, 0x5e, 0x30, 0xf8, 0x1e, 0xc2, 0x96, 0x3b, 0x4f,
+ 0xfd, 0x9a, 0x10, 0xc2, 0x1f, 0x54, 0x14, 0x7e, 0x14, 0x4d, 0x69, 0xd9,
+ 0xc8, 0xa3, 0xfa, 0x4a, 0x7d, 0x02, 0x0e, 0x32, 0x88, 0x02, 0x22, 0x31,
+ 0x6d, 0x13, 0xab, 0xd1, 0x1a, 0xcf, 0x80, 0xc7, 0x11, 0xbc, 0xa7, 0xd7,
+ 0x73, 0xc1, 0xc5, 0x15, 0x52, 0x7e, 0x82, 0xe7, 0x4f, 0x84, 0xc8, 0x50,
+ 0xa8, 0xb3, 0xb4, 0x70, 0x5e, 0x95, 0x71, 0x48, 0x31, 0x26, 0xc9, 0x91,
+ 0xb4, 0x53, 0xcc, 0x82, 0xd0, 0xf0, 0xf9, 0x84, 0x1f, 0xff, 0x49, 0x08,
+ 0x40, 0xfe, 0x39, 0x3c, 0x64, 0x72, 0x1c, 0x8b, 0x9f, 0x02, 0xc9, 0x27,
+ 0x23, 0xda, 0x4b, 0x86, 0x00, 0x4d, 0x84, 0x63, 0x23, 0x58, 0x60, 0x80,
+ 0x2a, 0x2a, 0xa8, 0xf0, 0x70, 0x86, 0x2c, 0xf6, 0x4a, 0xcc, 0x4f, 0xa5,
+ 0x9e, 0x98, 0x31, 0x90, 0xa6, 0x70, 0x6a, 0xd1, 0x31, 0xd5, 0x10, 0x06,
+ 0x63, 0xc6, 0x2e, 0x70, 0x22, 0x79, 0x7f, 0x21, 0x71, 0x5a, 0x01, 0xef,
+ 0x3f, 0x15, 0x2f, 0xed, 0x8c, 0x29, 0x01, 0x11, 0x52, 0xa2, 0xc2, 0xa3,
+ 0x6b, 0xdf, 0xcc, 0x6a, 0xae, 0x8b, 0x57, 0x11, 0x22, 0x5c, 0xa8, 0x90,
+ 0x93, 0xa2, 0x68, 0x85, 0x66, 0xcc, 0x9f, 0xa8, 0x13, 0x65, 0x41, 0x6c,
+ 0xee, 0x6f, 0xba, 0xc9, 0x0a, 0xa6, 0x0b, 0x5a, 0x5f, 0x72, 0x49, 0x05,
+ 0x55, 0xcf, 0xb7, 0x81, 0x16, 0xd5, 0xf2, 0xdb, 0x2e, 0x74, 0xd1, 0x40,
+ 0x7f, 0xf8, 0x96, 0xc5, 0xe4, 0x29, 0x4f, 0xc4, 0x0e, 0x1b, 0x9c, 0x86,
+ 0xf9, 0xfd, 0x0b, 0x4e, 0x64, 0x8b, 0xdc, 0x9a, 0xef, 0x59, 0xdb, 0x28,
+ 0x7f, 0x7f, 0xda, 0x16, 0x59, 0x0b, 0x2e, 0x42, 0x65, 0xe4, 0x0f, 0xbb,
+ 0xbe, 0xe6, 0x09, 0x3d, 0xa3, 0x95, 0xc9, 0x38, 0xa3, 0xb6, 0x4e, 0x07,
+ 0x9c, 0x7e, 0xe8, 0xe4, 0x77, 0x04, 0xa9, 0xdd, 0x75, 0x3f, 0x46, 0x90,
+ 0xe0, 0xc8, 0x25, 0x0d, 0x4b, 0x44, 0xc5, 0x7a, 0x03, 0x73, 0xd6, 0x9e,
+ 0xd9, 0x40, 0x10, 0x99, 0x85, 0x2b, 0x09, 0xa5, 0xa1, 0xff, 0xff, 0x96,
+ 0x83, 0xb2, 0x22, 0x18, 0xb5, 0x97, 0x9b, 0xd8, 0x87, 0xe4, 0xdb, 0x63,
+ 0xa2, 0x34, 0x65, 0xaa, 0x8f, 0x19, 0x61, 0x28, 0x0a, 0x1f, 0xda, 0x61,
+ 0xda, 0x6e, 0x93, 0x42, 0xff, 0xdd, 0x72, 0xad, 0x4c, 0x57, 0x0f, 0xc2,
+ 0x50, 0x75, 0xb3, 0x32, 0x7a, 0x86, 0x14, 0x7a, 0xbb, 0xac, 0xdb, 0x01,
+ 0x67, 0x7b, 0x24, 0x97, 0xbd, 0xee, 0xf0, 0x75, 0x2f, 0x5d, 0xff, 0x4f,
+ 0x66, 0x0c, 0x65, 0x36, 0x12, 0x15, 0x77, 0x13, 0xfe, 0x10, 0x35, 0x6d,
+ 0x93, 0x2b, 0x55, 0x94, 0xbe, 0xe3, 0x75, 0xc6, 0xba, 0xe0, 0x57, 0x09,
+ 0xf5, 0x46, 0x4e, 0x75, 0x8d, 0xb5, 0x54, 0x5b, 0x41, 0xa4, 0x19, 0xb0,
+ 0xbb, 0xda, 0x9f, 0xb6, 0xed, 0xc6, 0x10, 0x62, 0xb6, 0xfb, 0x6e, 0xf4,
+ 0xef, 0x5d, 0xec, 0x66, 0xcb, 0xee, 0x15, 0x41, 0x22, 0x2a, 0x8e, 0x3c,
+ 0xca, 0x74, 0xe1, 0x41, 0x64, 0xaf, 0x53, 0x03, 0xbb, 0xa3, 0x80, 0xbe,
+ 0xc6, 0x1b, 0x72, 0x42, 0x32, 0x9a, 0xc6, 0xe6, 0x6f, 0x72, 0x64, 0x4c,
+ 0x11, 0xdb, 0x59, 0xa3, 0x57, 0x49, 0x92, 0x63, 0x9c, 0x1f, 0x16, 0x9e,
+ 0xf7, 0x17, 0x43, 0x66, 0x06, 0x41, 0x8b, 0x0d, 0xbe, 0x29, 0xfe, 0xec,
+ 0x51, 0x80, 0xc6, 0x0c, 0xbc, 0xf8, 0xa7, 0x0d, 0x99, 0xee, 0x05, 0x54,
+ 0x02, 0x9f, 0x89, 0x37, 0xa5, 0x1c, 0x91, 0x34, 0xac, 0xc6, 0x0b, 0x2e,
+ 0x06, 0x0c, 0x96, 0xd8, 0xaa, 0x76, 0x73, 0x8b, 0x62, 0xe7, 0x83, 0x92,
+ 0xbd, 0x65, 0x5a, 0x46, 0x78, 0x01, 0x11, 0xbd, 0x7a, 0x43, 0xd9, 0xce,
+ 0x01, 0x3b, 0x7b, 0x79, 0x3b, 0xb4, 0x42, 0x1f, 0xc1, 0x2d, 0x00, 0x2b,
+ 0xa9, 0x5a, 0xad, 0xf8, 0x74, 0xc8, 0xba, 0xdd, 0x5a, 0x4f, 0x85, 0x8a,
+ 0x34, 0xd4, 0xad, 0x60, 0xd2, 0xfb, 0x3f, 0x03, 0xf3, 0x52, 0x57, 0x08,
+ 0x16, 0x1e, 0x4d, 0x92, 0x38, 0xfb, 0x07, 0x40, 0x68, 0xef, 0x8b, 0xba,
+ 0xd6, 0xbd, 0xc8, 0xbc, 0x1f, 0x2a, 0xab, 0x82, 0x16, 0x01, 0x44, 0x77,
+ 0x76, 0x54, 0xfa, 0x90, 0xd4, 0x11, 0x4c, 0xb1, 0x9c, 0x5f, 0xc6, 0xce,
+ 0xf5, 0x3e, 0x31, 0x7a, 0x23, 0x55, 0x69, 0xc1, 0x13, 0x7e, 0x47, 0x69,
+ 0xa0, 0x68, 0x1f, 0xf6, 0x3b, 0x01, 0xbb, 0x2c, 0xce, 0xb1, 0x8d, 0x6e,
+ 0x06, 0x9d, 0xe4, 0x8c, 0xe2, 0xe3, 0xc9, 0xd4, 0x33, 0x68, 0x68, 0x7c,
+ 0xfd, 0x4d, 0xcd, 0x0f, 0x6d, 0xd5, 0xfe, 0x93, 0x5a, 0x1c, 0x48, 0x6a,
+ 0x84, 0x63, 0x95, 0x3c, 0xaf, 0x89, 0x65, 0xee, 0x74, 0x51, 0xcb, 0xad,
+ 0x0b, 0xc2, 0xb6, 0xb2, 0x22, 0xb3, 0xcb, 0x0f, 0x79, 0xe8, 0xa9, 0x85,
+ 0x46, 0x9f, 0x13, 0x6d, 0x5b, 0xc5, 0x50, 0xe9, 0xed, 0xa3, 0x91, 0xaa,
+ 0x0c, 0x2f, 0xad, 0xac, 0x64, 0x53, 0xb3, 0x8b, 0x0c, 0xf0, 0xa5, 0xf0,
+ 0x7c, 0x1b, 0x8a, 0x3c, 0xce, 0x7a, 0x40, 0x84, 0x1b, 0x32, 0x6f, 0x10,
+ 0xde, 0x3e, 0x15, 0x8b, 0xea, 0xb3, 0x67, 0xee, 0x50, 0xef, 0x17, 0xff,
+ 0x16, 0x71, 0xbc, 0xdc, 0x89, 0xb4, 0x95, 0xb8, 0x4b, 0x87, 0xd4, 0x5f,
+ 0xa8, 0x99, 0xca, 0xed, 0x1f, 0xd9, 0xdb, 0x87, 0x8a, 0x02, 0xa5, 0x45,
+ 0xb6, 0x51, 0xe1, 0xce, 0x8a, 0x1c, 0xc2, 0xb4, 0xd3, 0xe0, 0xdb, 0xb5,
+ 0x37, 0x88, 0xd7, 0x95, 0xd1, 0x5b, 0x59, 0x4d, 0xef, 0x86, 0x39, 0xf8,
+ 0xb1, 0xed, 0x9d, 0xaf, 0xfa, 0x7e, 0x2e, 0x11, 0x11, 0xde, 0x75, 0x03,
+ 0xd5, 0x0e, 0x92, 0xad, 0x75, 0xbb, 0xfa, 0x38, 0xc3, 0xef, 0x74, 0x71,
+ 0xe6, 0x96, 0x33, 0xd7, 0x40, 0xd2, 0x4c, 0x06, 0xee, 0x4a, 0x2b, 0x54,
+ 0x2d, 0xd4, 0x77, 0xe4, 0xfc, 0x27, 0x80, 0x83, 0xbe, 0x33, 0xbb, 0xd9,
+ 0x29, 0x7a, 0x45, 0x43, 0xc2, 0x54, 0x79, 0xcd, 0x33, 0x45, 0xe2, 0x1c,
+ 0xda, 0x91, 0x3e, 0x56, 0xbb, 0x7e, 0x56, 0x3b, 0xa3, 0x2a, 0xc3, 0x5a,
+ 0x1e, 0x5f, 0x03, 0x27, 0xaa, 0x10, 0x22, 0x62, 0x31, 0x1c, 0x31, 0x66,
+ 0x3f, 0x52, 0xc1, 0xa7, 0x1f, 0x0e, 0x4d, 0xe8, 0xc0, 0x9a, 0x2f, 0x2b,
+ 0x55, 0x0b, 0xa6, 0x60, 0x7c, 0xc2, 0x57, 0xa7, 0x3e, 0x94, 0x38, 0x0f,
+ 0x94, 0x52, 0x06, 0x5d, 0xfc, 0x5b, 0xc4, 0x75, 0x22, 0x00, 0x2e, 0x16,
+ 0x8c, 0x75, 0x0e, 0x07, 0x0e, 0x99, 0x2e, 0x2b, 0x73, 0xf2, 0x89, 0x7e,
+ 0xe4, 0xb4, 0x96, 0x5e, 0x84, 0x86, 0x71, 0x32, 0xc5, 0x0a, 0x3a, 0x3f,
+ 0xc1, 0x51, 0xac, 0x3d, 0xb3, 0x93, 0x7a, 0x53, 0x10, 0x74, 0x99, 0x02,
+ 0xa1, 0x86, 0xe0, 0xad, 0xd1, 0xf0, 0x1f, 0xb1, 0x67, 0xa1, 0xac, 0xc1,
+ 0x87, 0x79, 0xb9, 0x4e, 0x2a, 0x74, 0xc7, 0x54, 0xcc, 0x49, 0x28, 0x71,
+ 0x04, 0xad, 0xec, 0xae, 0xf6, 0xb0, 0x4b, 0x37, 0x3f, 0xa3, 0x5e, 0x52,
+ 0x74, 0x00, 0xa2, 0x72, 0x21, 0x45, 0x54, 0xb6, 0xb4, 0x9c, 0x96, 0xbd,
+ 0x31, 0x9e, 0x28, 0xf6, 0x6f, 0xb5, 0x61, 0xa4, 0x00, 0x51, 0x22, 0xbb,
+ 0xe2, 0x3a, 0x4d, 0xab, 0x3c, 0x7e, 0x40, 0x95, 0x81, 0x97, 0x1d, 0xbe,
+ 0x60, 0xb0, 0xe5, 0x7b, 0xf0, 0x63, 0xd3, 0x4e, 0x49, 0x72, 0x07, 0xa9,
+ 0x19, 0xb4, 0x4f, 0x12, 0x44, 0x21, 0xe2, 0x3f, 0x85, 0x27, 0x1b, 0xe2,
+ 0xc6, 0x8c, 0xc7, 0x1a, 0x2e, 0xc1, 0x6e, 0x05, 0x1d, 0xc4, 0x69, 0x76,
+ 0xb3, 0x96, 0xe0, 0xa7, 0x4c, 0x70, 0xeb, 0x2b, 0x47, 0x38, 0x54, 0x40,
+ 0x60, 0x02, 0x55, 0x3a, 0xb6, 0xa1, 0xac, 0x96, 0xae, 0xa8, 0x7f, 0x11,
+ 0x45, 0xa5, 0x43, 0x61, 0x47, 0x86, 0x80, 0x27, 0x5f, 0xf3, 0x53, 0x9b,
+ 0x91, 0x25, 0x02, 0x4d, 0xaf, 0x3b, 0x85, 0x11, 0x55, 0xf6, 0x74, 0xf4,
+ 0xc3, 0xd5, 0xdd, 0xc0, 0x05, 0x14, 0xd8, 0xd1, 0x90, 0xc8, 0x7e, 0x55,
+ 0xf7, 0xb3, 0x53, 0x2d, 0x87, 0x72, 0x66, 0x29, 0x46, 0x22, 0x92, 0xdc,
+ 0xd7, 0x88, 0x47, 0xce, 0x9a, 0xc9, 0x8c, 0x12, 0xc3, 0xd6, 0x71, 0xf9,
+ 0xf9, 0xb7, 0x5d, 0xb9, 0xcd, 0x01, 0x5e, 0x83, 0x6f, 0x67, 0xf4, 0x40,
+ 0xac, 0xd9, 0xfa, 0x35, 0x72, 0x0c, 0x97, 0x83, 0xa3, 0x3d, 0x10, 0xca,
+ 0xbf, 0xd2, 0xa6, 0xc9, 0x17, 0xf5, 0x59, 0xef, 0xb0, 0xb0, 0x1d, 0x8d,
+ 0x9c, 0x00, 0x83, 0x25, 0x43, 0x41, 0x1c, 0x43, 0x1b, 0xa0, 0x30, 0xb6,
+ 0xee, 0x3f, 0xf2, 0x70, 0x04, 0x28, 0xb0, 0x20, 0xab, 0x45, 0x65, 0x9a,
+ 0x49, 0x4f, 0x4d, 0x5c, 0x4f, 0x2a, 0x11, 0x64, 0x2c, 0xa9, 0x39, 0x36,
+ 0xb7, 0xe2, 0x5d, 0x1d, 0xa4, 0x61, 0x88, 0x24, 0xf5, 0x52, 0xde, 0x0f,
+ 0x1b, 0x35, 0x32, 0xb7, 0xde, 0x18, 0x11, 0x52, 0x23, 0x90, 0x3c, 0x49,
+ 0xc2, 0xd1, 0x93, 0x73, 0x98, 0x64, 0x00, 0x6a, 0x37, 0x90, 0xe7, 0xb8,
+ 0x40, 0x7e, 0xc0, 0x2f, 0xbb, 0x55, 0x5e, 0xf1, 0xf6, 0x25, 0x22, 0x5b,
+ 0x93, 0xb8, 0xe2, 0x29, 0x8a, 0x81, 0xa8, 0x6d, 0xcc, 0xcf, 0xe5, 0xc1,
+ 0x7e, 0x1a, 0xc3, 0xe7, 0xd7, 0xb8, 0xd3, 0x88, 0xb1, 0xcb, 0x71, 0x87,
+ 0x5e, 0x28, 0xf5, 0x19, 0x4c, 0xd5, 0xe8, 0xc8, 0xa8, 0x77, 0x57, 0x02,
+ 0x9d, 0x4b, 0x97, 0x52, 0xba, 0x6a, 0x3a, 0xa1, 0x5e, 0x50, 0x89, 0xdc,
+ 0x4f, 0xfd, 0xdf, 0x62, 0xae, 0xd7, 0x88, 0xc6, 0x37, 0xda, 0x61, 0x89,
+ 0x68, 0x19, 0x05, 0xf6, 0xa6, 0xad, 0xfc, 0x1a, 0xcd, 0xbf, 0x0e, 0x49,
+ 0x28, 0xf7, 0xd3, 0x29, 0xc2, 0xd7, 0xfc, 0x81, 0x85, 0xad, 0xa8, 0x40,
+ 0x87, 0xd8, 0xed, 0xd1, 0xce, 0x5f, 0xa4, 0xfd, 0x32, 0xb2, 0x8e, 0xa4,
+ 0xd6, 0xd8, 0x99, 0x4f, 0x78, 0x89, 0xc4, 0x64, 0x92, 0x61, 0x18, 0xd3,
+ 0x77, 0x76, 0xab, 0xce, 0x93, 0x42, 0x86, 0x9b, 0xce, 0x36, 0x1d, 0x13,
+ 0x05, 0x0a, 0x27, 0x86, 0xf1, 0xaf, 0xee, 0xa1, 0x73, 0xcb, 0xae, 0x14,
+ 0x9f, 0x10, 0x1d, 0xc5, 0x4d, 0x37, 0x09, 0xd4, 0x7a, 0x30, 0x34, 0xbe,
+ 0x84, 0x94, 0xf6, 0x7b, 0x16, 0xac, 0xef, 0x25, 0x33, 0x4a, 0x89, 0x86,
+ 0xed, 0x65, 0x27, 0xf0, 0xc0, 0x82, 0x3d, 0x90, 0x33, 0x69, 0x9c, 0x73,
+ 0x7d, 0x69, 0xa0, 0xaf, 0x85, 0xaf, 0xc3, 0x00, 0x19, 0xa0, 0xb0, 0xf1,
+ 0x3b, 0xea, 0x1a, 0x64, 0xbe, 0xf1, 0x30, 0xb2, 0xd7, 0x26, 0xcb, 0x98,
+ 0xaa, 0x04, 0x45, 0x6b, 0x16, 0xb6, 0x69, 0x90, 0x50, 0xd0, 0x05, 0xfa,
+ 0xad, 0xcf, 0x77, 0xf5, 0xb2, 0x96, 0xfa, 0xb8, 0x47, 0x8f, 0x23, 0xc2,
+ 0x2c, 0x8f, 0x94, 0xfb, 0x40, 0xf8, 0x65, 0x68, 0xc7, 0x80, 0x2e, 0x93,
+ 0x46, 0xa7, 0xaa, 0xbb, 0xae, 0x6f, 0x52, 0x03, 0x77, 0x6b, 0xdf, 0x82,
+ 0x6c, 0x9a, 0xb2, 0xf7, 0xd4, 0x90, 0xbf, 0x3c, 0x35, 0x4b, 0xbd, 0xe5,
+ 0xd5, 0x2f, 0x63, 0x82, 0x2b, 0xf0, 0xc5, 0xb8, 0x90, 0xb8, 0x81, 0xa1,
+ 0x71, 0x96, 0x66, 0x29, 0x3d, 0xeb, 0x8c, 0xc8, 0x24, 0x69, 0xc8, 0xb2,
+ 0x91, 0xdf, 0xc4, 0x52, 0xfa, 0x30, 0xcf, 0xa8, 0x39, 0x1d, 0x7b, 0x09,
+ 0xd5, 0xe1, 0xb3, 0x6e, 0x21, 0xa8, 0x08, 0x8e, 0x70, 0xd9, 0xb3, 0xc7,
+ 0x6d, 0x6a, 0x53, 0x9b, 0xf8, 0xbc, 0x9e, 0x8f, 0x6c, 0xa3, 0x84, 0x24,
+ 0xae, 0x70, 0x5b, 0x12, 0xb5, 0x8c, 0xb4, 0xf1, 0x75, 0xae, 0x5a, 0x24,
+ 0xe0, 0x08, 0x5d, 0xe8, 0x7e, 0xa9, 0xf4, 0xd8, 0x25, 0x72, 0xf2, 0xca,
+ 0x6f, 0x87, 0x38, 0xc7, 0x1b, 0xca, 0x3c, 0x82, 0xc7, 0x1b, 0xa1, 0xcb,
+ 0xf1, 0x94, 0xe4, 0x6c, 0xdd, 0x1c, 0x51, 0x6e, 0x4c, 0x06, 0x8e, 0x49,
+ 0x50, 0x29, 0x84, 0x17, 0xe7, 0xdc, 0x69, 0xdf, 0xb6, 0x7c, 0xe4, 0xc0,
+ 0xa2, 0xef, 0x1d, 0x6c, 0x84, 0x4c, 0x06, 0xc4, 0x0e, 0xda, 0xe7, 0x46,
+ 0xd3, 0xd4, 0x94, 0x22, 0x11, 0xc9, 0x07, 0xed, 0xf0, 0xfd, 0x06, 0x7e,
+ 0x3b, 0x52, 0x3a, 0x2b, 0x97, 0x6a, 0xb9, 0x5a, 0xff, 0xb2, 0xa6, 0xe3,
+ 0x8b, 0x48, 0xde, 0x07, 0xe0, 0xa0, 0x8d, 0xd5, 0x27, 0x61, 0x98, 0x32,
+ 0x23, 0x85, 0x30, 0xbc, 0xb6, 0x40, 0x94, 0xe2, 0x7f, 0xd8, 0xbf, 0x43,
+ 0x74, 0xa9, 0x3c, 0x0d, 0xc9, 0x57, 0x4f, 0x9a, 0x44, 0xa2, 0xd6, 0x97,
+ 0x82, 0x09, 0xff, 0x0d, 0x83, 0xae, 0x1c, 0xcc, 0xab, 0x93, 0xe6, 0xcf,
+ 0xcb, 0x77, 0x35, 0xe8, 0xc2, 0x93, 0xdc, 0xa5, 0x29, 0x34, 0x26, 0x54,
+ 0x40, 0x5e, 0x0c, 0x46, 0xfb, 0x16, 0x9b, 0x1e, 0xb8, 0x3e, 0xb7, 0xce,
+ 0xe5, 0x16, 0x2b, 0x58, 0x9c, 0x60, 0x06, 0xfd, 0x0c, 0x40, 0x51, 0x63,
+ 0xf5, 0x19, 0x2f, 0xfa, 0x1e, 0x3a, 0xc6, 0x5b, 0x52, 0x71, 0xe7, 0x52,
+ 0x55, 0x42, 0x64, 0x6b, 0x49, 0x75, 0x2b, 0x63, 0xca, 0x4a, 0xbc, 0x51,
+ 0xd8, 0x59, 0x17, 0x14, 0xed, 0xe1, 0xed, 0x7b, 0xbf, 0x59, 0x89, 0x6a,
+ 0x06, 0x3b, 0x0b, 0xe4, 0xec, 0xcd, 0x4f, 0x48, 0x52, 0x41, 0x6f, 0xf6,
+ 0x75, 0x7e, 0xd9, 0xb2, 0x4e, 0x52, 0xde, 0xa2, 0xb2, 0xb4, 0xdf, 0x1a,
+ 0x70, 0x39, 0x2a, 0x0b, 0xc6, 0x26, 0xa1, 0xc5, 0x62, 0x4b, 0xff, 0x8f,
+ 0x11, 0xf1, 0x67, 0x03, 0x03, 0x51, 0x8c, 0xd9, 0x8a, 0x22, 0x8b, 0x51,
+ 0x52, 0x86, 0x2c, 0x3a, 0xb5, 0x57, 0x25, 0xc0, 0xea, 0x7c, 0x65, 0x7a,
+ 0xc2, 0xea, 0x37, 0x37, 0x38, 0xfe, 0x91, 0x50, 0xda, 0x1e, 0xc9, 0x3b,
+ 0x91, 0x2b, 0x29, 0x79, 0x67, 0x07, 0x5f, 0xf1, 0x74, 0x20, 0x21, 0x63,
+ 0xe0, 0xdf, 0xa7, 0x71, 0xdb, 0xe9, 0x7e, 0x15, 0x65, 0x04, 0xf9, 0xa2,
+ 0x64, 0xcd, 0x79, 0x79, 0x75, 0x33, 0x1a, 0x79, 0x3a, 0xe3, 0xf3, 0xa8,
+ 0x57, 0x65, 0xec, 0xe0, 0xea, 0x08, 0x5a, 0x53, 0x25, 0x7a, 0x93, 0x7b,
+ 0x51, 0x0a, 0x52, 0xac, 0x1b, 0x40, 0x38, 0xfa, 0x77, 0xb6, 0xa2, 0x3f,
+ 0xb1, 0x79, 0x69, 0xd8, 0xd2, 0x9e, 0x3d, 0x21, 0x54, 0x0c, 0xdf, 0x25,
+ 0xb3, 0xa2, 0xc7, 0x05, 0x78, 0x9d, 0x7f, 0xb1, 0x5e, 0xb5, 0x9e, 0x28,
+ 0x38, 0x3b, 0x7f, 0x13, 0xa7, 0xd9, 0x58, 0xf0, 0x1c, 0x04, 0xa4, 0x36,
+ 0x59, 0x78, 0xa9, 0x49, 0x46, 0xbd, 0xb8, 0x5c, 0x69, 0xef, 0x20, 0x54,
+ 0xad, 0x1c, 0xdd, 0x5c, 0x64, 0xf3, 0xbc, 0x07, 0xd1, 0xba, 0x9d, 0x2e,
+ 0xe1, 0xae, 0x31, 0x71, 0xb6, 0xc8, 0x16, 0xbd, 0x80, 0x77, 0x4c, 0x3c,
+ 0xb7, 0xd8, 0x4d, 0x5d, 0x4a, 0x58, 0x62, 0x7a, 0xb1, 0x80, 0x5b, 0x49,
+ 0x82, 0x42, 0x37, 0xe0, 0xc1, 0xbe, 0x9e, 0x71, 0x98, 0x3a, 0x9e, 0x88,
+ 0x61, 0x5b, 0x37, 0xb4, 0x98, 0x4d, 0x71, 0x15, 0x64, 0x36, 0xb3, 0xd4,
+ 0x2d, 0x5b, 0x80, 0x17, 0xae, 0x33, 0xa7, 0x65, 0xe1, 0xc4, 0x82, 0x3e,
+ 0x5e, 0xba, 0x56, 0x8f, 0x06, 0x33, 0x54, 0xee, 0xa3, 0x69, 0xf9, 0x2e,
+ 0xe0, 0xfe, 0x91, 0x7f, 0xfc, 0xfb, 0x57, 0xf7, 0x3a, 0x2c, 0xf4, 0x02,
+ 0x1b, 0xfc, 0x04, 0x50, 0x13, 0x19, 0x1c, 0x3c, 0x30, 0x66, 0xa5, 0x7f,
+ 0xb8, 0x8d, 0x53, 0xb6, 0x20, 0x9e, 0x24, 0x7d, 0xa4, 0x72, 0xa4, 0x17,
+ 0x23, 0x1e, 0xe7, 0x4e, 0x4b, 0xe8, 0x51, 0x82, 0x8d, 0x2a, 0xcd, 0x49,
+ 0x11, 0xe5, 0x64, 0xeb, 0x05, 0xc1, 0x78, 0xe4, 0xac, 0x9a, 0x41, 0x41,
+ 0xcb, 0x63, 0x5e, 0x23, 0xf1, 0xfb, 0x9a, 0xdc, 0x29, 0xcc, 0xae, 0xf5,
+ 0x21, 0x71, 0x77, 0xea, 0xa0, 0x53, 0x4b, 0xd9, 0x2b, 0x51, 0xc0, 0x9d,
+ 0x88, 0xaf, 0xed, 0x0b, 0x81, 0x17, 0x79, 0xbb, 0x4a, 0xb6, 0xa4, 0x97,
+ 0x39, 0x22, 0xcf, 0x72, 0xa6, 0xbd, 0x02, 0x15, 0xe0, 0xae, 0x2f, 0x5c,
+ 0xfc, 0x25, 0x60, 0xc3, 0xcd, 0x05, 0x6d, 0x4d, 0x4e, 0x06, 0x2d, 0xae,
+ 0x94, 0xfc, 0x2b, 0x9a, 0xec, 0x30, 0x4e, 0x56, 0x5c, 0xc6, 0xf7, 0x02,
+ 0x6d, 0x85, 0x26, 0x9a, 0xb6, 0x86, 0xcf, 0x64, 0xf6, 0xec, 0x6c, 0x4f,
+ 0x7d, 0x94, 0x0f, 0xd4, 0x1b, 0x38, 0x77, 0x2f, 0x45, 0x8c, 0x67, 0xce,
+ 0xc6, 0xd3, 0xa0, 0x59, 0x18, 0x4e, 0x27, 0x81, 0x12, 0x73, 0x4c, 0x23,
+ 0x12, 0x84, 0x4e, 0xe6, 0x4a, 0x45, 0x08, 0x4b, 0xba, 0x8b, 0x99, 0x8a,
+ 0xf8, 0xca, 0x0b, 0x9f, 0x78, 0xec, 0x3c, 0x51, 0xd7, 0x27, 0x83, 0x4d,
+ 0x05, 0x7c, 0x99, 0xa3, 0xe6, 0x38, 0x05, 0x20, 0x92, 0x7a, 0x67, 0x31,
+ 0xb5, 0xa7, 0x28, 0x83, 0xb2, 0x24, 0xa3, 0xa8, 0xab, 0xfb, 0xc2, 0xdf,
+ 0x2e, 0x03, 0xee, 0xd0, 0x50, 0x8e, 0x74, 0x4a, 0xcd, 0x0d, 0x29, 0x57,
+ 0x60, 0x8c, 0x07, 0xe1, 0x22, 0x9b, 0x11, 0xa1, 0xed, 0x92, 0x9c, 0x8d,
+ 0x2e, 0x5a, 0xd8, 0x7c, 0xbf, 0xfa, 0xb9, 0x96, 0x06, 0xa7, 0x05, 0xc5,
+ 0x01, 0x74, 0x2d, 0x1a, 0x22, 0x38, 0x11, 0x4f, 0x4d, 0xc2, 0xba, 0xf6,
+ 0x4b, 0x21, 0x2a, 0xca, 0xa4, 0x7f, 0xa9, 0xfe, 0xe3, 0xc8, 0x63, 0x28,
+ 0xa3, 0x6f, 0xc8, 0xb5, 0xeb, 0xe6, 0xcf, 0x8e, 0xd6, 0x21, 0x60, 0x4e,
+ 0x36, 0x64, 0xcc, 0x44, 0x03, 0xc9, 0x77, 0xb5, 0x19, 0x9a, 0x16, 0x98,
+ 0x98, 0x1d, 0x38, 0x8b, 0x54, 0xc7, 0x3e, 0xd5, 0xe7, 0x97, 0x63, 0x6b,
+ 0x29, 0xf3, 0x54, 0xd3, 0xe3, 0xfd, 0x30, 0x4f, 0xb0, 0xeb, 0x00, 0xfa,
+ 0x8e, 0xe3, 0x58, 0xa6, 0x14, 0xa0, 0x1b, 0x0c, 0x36, 0x03, 0x84, 0x6f,
+ 0x68, 0xe5, 0x3a, 0xb3, 0xa9, 0x97, 0xc6, 0xe9, 0xf0, 0x1d, 0x56, 0x20,
+ 0x49, 0x1c, 0x62, 0x01, 0x54, 0x10, 0x63, 0x31, 0xfc, 0x9d, 0xf6, 0xba,
+ 0x27, 0xfe, 0x57, 0xd2, 0x24, 0x21, 0x26, 0xbb, 0x0c, 0x66, 0x60, 0x7c,
+ 0x31, 0x88, 0x79, 0x67, 0xdb, 0x54, 0x31, 0x81, 0xc2, 0x69, 0xd1, 0xec,
+ 0x0c, 0xb9, 0x2e, 0x86, 0x20, 0x19, 0x22, 0x67, 0xfe, 0xf4, 0x83, 0x27,
+ 0x9c, 0x79, 0xa6, 0x0d, 0x58, 0xe5, 0xbe, 0x79, 0xb3, 0x11, 0x93, 0xc6,
+ 0x7e, 0x74, 0xb6, 0xcb, 0x71, 0x02, 0x0c, 0x52, 0x73, 0xff, 0x59, 0xed,
+ 0xc9, 0x84, 0xf4, 0x38, 0x6a, 0xf0, 0x77, 0x52, 0x57, 0x3d, 0x54, 0xb2,
+ 0xf0, 0xd3, 0x75, 0xf4, 0x4e, 0x58, 0x18, 0x15, 0x68, 0xee, 0x34, 0xe7,
+ 0xd9, 0xa5, 0xab, 0xbe, 0x95, 0x36, 0x46, 0xb5, 0x2d, 0xe3, 0x47, 0x99,
+ 0xfb, 0x54, 0x86, 0x5a, 0xca, 0x52, 0x12, 0x52, 0x18, 0x60, 0x08, 0x21,
+ 0x80, 0xde, 0xdd, 0x6b, 0xaa, 0xea, 0x2e, 0x6d, 0x70, 0x80, 0xd5, 0x01,
+ 0x44, 0xc9, 0x49, 0xa1, 0xeb, 0x04, 0x7c, 0xba, 0xa0, 0x4a, 0xfb, 0x86,
+ 0x48, 0x54, 0x88, 0x45, 0x73, 0x60, 0x3a, 0x7c, 0x6c, 0xd7, 0xc3, 0xaf,
+ 0x92, 0x2d, 0x97, 0x41, 0xc7, 0x8d, 0xab, 0x7a, 0xa2, 0xa9, 0x3f, 0xe4,
+ 0xe9, 0x16, 0xb9, 0x23, 0x44, 0x32, 0xe6, 0x4f, 0xd6, 0x39, 0x79, 0x78,
+ 0xeb, 0x26, 0xc6, 0x84, 0x28, 0x3e, 0xcc, 0x81, 0x8a, 0xaa, 0xec, 0xc2,
+ 0x05, 0x5c, 0x9d, 0x22, 0xd9, 0x6f, 0x9a, 0xa2, 0x32, 0xad, 0x20, 0x77,
+ 0x75, 0xf8, 0x8a, 0x85, 0x22, 0x4a, 0xe9, 0xa0, 0x5f, 0x87, 0x81, 0x95,
+ 0x2f, 0x61, 0xff, 0x8a, 0x86, 0x0d, 0x12, 0x89, 0x62, 0xab, 0x36, 0xf9,
+ 0x8c, 0x05, 0x6f, 0x6e, 0x23, 0x2c, 0xb3, 0x7c, 0x7c, 0xe1, 0x30, 0x9d,
+ 0x07, 0x21, 0x41, 0xd6, 0xef, 0x35, 0xc2, 0x08, 0x2e, 0xf7, 0x2f, 0x9b,
+ 0xb0, 0xad, 0x36, 0x2f, 0xd4, 0x8d, 0x65, 0xe1, 0xba, 0x26, 0x28, 0x80,
+ 0xfe, 0x52, 0x27, 0x67, 0x15, 0x43, 0x27, 0x3e, 0x8f, 0x54, 0xf3, 0x79,
+ 0x7b, 0x39, 0xec, 0x34, 0x97, 0x6b, 0xb3, 0xbf, 0xb6, 0x03, 0xba, 0xfa,
+ 0x0a, 0x9d, 0xbe, 0x6d, 0x70, 0x79, 0x33, 0x0e, 0x91, 0x46, 0x3f, 0xa3,
+ 0xa1, 0x24, 0x97, 0x32, 0xbe, 0xf3, 0x4d, 0xba, 0x8e, 0xa4, 0x2d, 0x0b,
+ 0xeb, 0x67, 0xa6, 0x11, 0x5c, 0xfa, 0xfe, 0x0e, 0xaf, 0x17, 0xc2, 0x74,
+ 0x0e, 0x45, 0x39, 0xdb, 0xdb, 0xf7, 0xae, 0xcf, 0xc0, 0x75, 0xe7, 0xcc,
+ 0x12, 0x2e, 0x1a, 0xb2, 0x0d, 0xe5, 0x5d, 0xe8, 0x2d, 0x52, 0x67, 0x44,
+ 0xab, 0x2e, 0x13, 0x6b, 0xb7, 0x0c, 0xa7, 0xbe, 0x65, 0x08, 0xc5, 0x74,
+ 0xba, 0xf1, 0x45, 0xac, 0x2d, 0xe6, 0xc2, 0x33, 0x5e, 0xf0, 0xa0, 0x49,
+ 0xf6, 0xd0, 0xdc, 0x02, 0x0b, 0x0a, 0x73, 0x03, 0x16, 0x30, 0xfc, 0xb4,
+ 0xad, 0xe5, 0xac, 0x9e, 0x18, 0xae, 0x79, 0xee, 0xb4, 0xf1, 0x30, 0xcd,
+ 0x76, 0xba, 0x36, 0x8e, 0xfe, 0xce, 0x0d, 0x83, 0xb7, 0xb7, 0x87, 0x36,
+ 0xb0, 0x17, 0x64, 0xf2, 0xa1, 0x52, 0xdc, 0x13, 0xd0, 0xd6, 0xd9, 0xd2,
+ 0xf8, 0xa1, 0x81, 0xf0, 0x96, 0x8f, 0x69, 0xe5, 0x8e, 0x1f, 0x66, 0xcc,
+ 0xac, 0xe6, 0x65, 0x28, 0x55, 0x32, 0x03, 0xfa, 0xa1, 0x69, 0xeb, 0x6f,
+ 0xbf, 0x2e, 0xff, 0xfe, 0x5b, 0xaf, 0x8e, 0x44, 0x6d, 0x10, 0x17, 0xfd,
+ 0x14, 0x67, 0xd9, 0x5d, 0xe3, 0xc7, 0x84, 0xd6, 0xe3, 0x1e, 0x11, 0x4f,
+ 0xa9, 0x10, 0x48, 0x2c, 0x7b, 0x04, 0x6a, 0x78, 0x36, 0x2d, 0xfb, 0xe0,
+ 0x1f, 0x39, 0x94, 0x67, 0xf2, 0xb5, 0xf0, 0xcf, 0xef, 0x2d, 0x2e, 0xe8,
+ 0x50, 0x1f, 0xab, 0x72, 0xb4, 0xf0, 0x62, 0xd5, 0xca, 0xf4, 0x69, 0xa0,
+ 0x79, 0x62, 0x9f, 0xff, 0x97, 0xa2, 0xc7, 0xd0, 0x6b, 0xd1, 0x78, 0x51,
+ 0x75, 0x95, 0x23, 0x33, 0xf9, 0x41, 0xc4, 0x46, 0xea, 0x91, 0x01, 0x0c,
+ 0x66, 0xa3, 0x78, 0x17, 0x6d, 0xc1, 0x32, 0x38, 0x4e, 0x16, 0x49, 0x5d,
+ 0x34, 0x86, 0x02, 0x85, 0xc7, 0x88, 0xca, 0x26, 0x97, 0xbd, 0xe5, 0xd8,
+ 0xd9, 0xb4, 0xc6, 0xbd, 0xfa, 0x59, 0xaf, 0x09, 0xae, 0x2e, 0x0d, 0x1d,
+ 0xc0, 0x10, 0x5a, 0xe7, 0x6b, 0x87, 0xab, 0xcc, 0x7c, 0xc1, 0x57, 0x83,
+ 0x61, 0xe9, 0x25, 0x07, 0xc9, 0x54, 0x6c, 0x95, 0x76, 0xca, 0x84, 0xbc,
+ 0x21, 0x26, 0x38, 0x1f, 0x14, 0x6c, 0x29, 0xbc, 0xd1, 0xf9, 0xc0, 0x4d,
+ 0xb2, 0xd0, 0x5b, 0x28, 0x75, 0x09, 0x9b, 0x08, 0x1b, 0x73, 0xe3, 0xa7,
+ 0x4d, 0xd8, 0x4d, 0x6b, 0x57, 0xec, 0x0c, 0xd0, 0x9a, 0xd0, 0xd1, 0xca,
+ 0x0c, 0xcf, 0x49, 0xc3, 0x19, 0x49, 0x0a, 0x51, 0x01, 0x98, 0x6e, 0x82,
+ 0x1f, 0x1e, 0x17, 0x06, 0xec, 0x8f, 0xc3, 0xf8, 0xc0, 0x0d, 0xbd, 0x5c,
+ 0xcc, 0x17, 0x74, 0x87, 0x2b, 0x2a, 0x4a, 0xce, 0x62, 0xc4, 0x0c, 0xa2,
+ 0x8e, 0x84, 0x44, 0xdd, 0x84, 0x31, 0x36, 0xfe, 0x1d, 0x31, 0xc8, 0x91,
+ 0xe2, 0x4c, 0x1f, 0xca, 0xa4, 0xca, 0x01, 0x6a, 0x41, 0x14, 0x91, 0x5d,
+ 0xd5, 0x2c, 0xb2, 0x31, 0xd1, 0x3d, 0xff, 0xde, 0xce, 0x96, 0x86, 0x29,
+ 0xad, 0xea, 0x4e, 0x95, 0x4e, 0xed, 0x75, 0x7f, 0xa9, 0xb1, 0xbe, 0xc2,
+ 0x13, 0xb7, 0x31, 0xc9, 0x84, 0x95, 0xb6, 0x1f, 0x92, 0x70, 0x69, 0x43,
+ 0x4a, 0x1a, 0xdd, 0x2e, 0x11, 0x38, 0xa8, 0xb1, 0x09, 0x76, 0x65, 0xe9,
+ 0x0c, 0xe2, 0xe5, 0xb3, 0x43, 0x2d, 0x7c, 0xbe, 0xb9, 0x04, 0xb6, 0x84,
+ 0x5d, 0x6b, 0x77, 0x6f, 0x5a, 0x21, 0x2c, 0x93, 0x2f, 0xb8, 0x35, 0x1a,
+ 0xf6, 0x46, 0xb1, 0x95, 0x73, 0x17, 0x59, 0xc8, 0x02, 0xe3, 0x31, 0xbd,
+ 0x43, 0x35, 0x99, 0x89, 0x20, 0xf2, 0xc4, 0x80, 0x0f, 0x73, 0x23, 0x1b,
+ 0x4f, 0xeb, 0xc4, 0x8a, 0x8b, 0xd3, 0x25, 0x6b, 0x87, 0xcc, 0x43, 0x6b,
+ 0x92, 0x65, 0xfb, 0xb5, 0x1f, 0x5e, 0xf5, 0x7b, 0x54, 0x7d, 0xc5, 0x77,
+ 0xef, 0x7c, 0xb1, 0xfe, 0x50, 0x6e, 0xa4, 0x0d, 0xc6, 0xc7, 0x2c, 0x4d,
+ 0xd2, 0xba, 0x55, 0x60, 0xeb, 0x3f, 0xe3, 0xbf, 0x6e, 0x13, 0xea, 0x84,
+ 0xd5, 0x41, 0x43, 0x29, 0x6c, 0xf2, 0x2c, 0xbb, 0xa4, 0x89, 0x4a, 0xf3,
+ 0xc0, 0x2b, 0x82, 0x50, 0x4b, 0x51, 0x5b, 0x95, 0x77, 0x60, 0xf4, 0xd6,
+ 0x7a, 0x15, 0x37, 0x38, 0xe7, 0x8b, 0x93, 0xce, 0xd0, 0x1b, 0x60, 0x3b,
+ 0x86, 0xfa, 0x91, 0xf2, 0x87, 0xfa, 0x08, 0xb0, 0x38, 0x99, 0x53, 0xf0,
+ 0x76, 0x42, 0x87, 0x9f, 0x66, 0xd6, 0xa4, 0xfd, 0x9e, 0x86, 0xa8, 0xf7,
+ 0xf2, 0xa1, 0xaa, 0xa2, 0x48, 0x5f, 0x79, 0x21, 0x21, 0xb7, 0xa1, 0x00,
+ 0x48, 0x2e, 0x33, 0x7e, 0x82, 0x05, 0x1c, 0x86, 0x22, 0x68, 0xa6, 0x05,
+ 0xeb, 0xba, 0xad, 0xf6, 0x39, 0xbd, 0x52, 0x6e, 0x6c, 0x5f, 0x0e, 0x7f,
+ 0xeb, 0x62, 0xfb, 0x1d, 0x6c, 0xfd, 0xa1, 0xd9, 0xf5, 0x55, 0xfc, 0xe9,
+ 0x06, 0xcd, 0xda, 0x85, 0xc2, 0x5c, 0xb2, 0x4e, 0x3a, 0xf4, 0xdf, 0xc6,
+ 0x7f, 0x54, 0xfb, 0xdd, 0x21, 0x26, 0x44, 0x9f, 0x3b, 0x88, 0x8c, 0xff,
+ 0x25, 0x1c, 0xb3, 0x16, 0x55, 0xcd, 0x51, 0x77, 0x9c, 0x08, 0x76, 0xe3,
+ 0xa9, 0x2f, 0xa0, 0x99, 0xc4, 0x31, 0x53, 0xc4, 0x77, 0xab, 0x7f, 0x79,
+ 0x82, 0xb0, 0x5a, 0x93, 0x88, 0xde, 0xbd, 0x3e, 0x04, 0xa1, 0xe6, 0x60,
+ 0xc5, 0xe7, 0xae, 0x89, 0x42, 0x71, 0x6d, 0x30, 0x91, 0x89, 0xe0, 0x26,
+ 0x57, 0x0a, 0x2d, 0x50, 0x83, 0xe7, 0x9d, 0x77, 0xc5, 0xe3, 0x4c, 0x4b,
+ 0x7a, 0x5b, 0x9e, 0xab, 0x26, 0x12, 0x24, 0xa6, 0xd9, 0x91, 0xee, 0x31,
+ 0x6b, 0x3c, 0x06, 0x28, 0x25, 0x4f, 0xe3, 0x0b, 0xbd, 0xe3, 0x13, 0xcb,
+ 0x97, 0x0c, 0x20, 0xba, 0x8a, 0xbd, 0x02, 0xff, 0xe0, 0xc6, 0x5c, 0xa6,
+ 0x3c, 0x4f, 0xd6, 0xdd, 0x45, 0x82, 0x35, 0x35, 0x46, 0xca, 0xf9, 0x67,
+ 0xb7, 0x47, 0x43, 0x9a, 0x5f, 0x32, 0x3a, 0xa9, 0x83, 0x86, 0xa0, 0xc8,
+ 0x35, 0x06, 0xc2, 0x36, 0x9d, 0xed, 0x39, 0x56, 0xa5, 0x10, 0xcb, 0x39,
+ 0x0d, 0xa7, 0x65, 0x0b, 0x77, 0x34, 0x98, 0xee, 0xe5, 0xee, 0xc1, 0x17,
+ 0x35, 0x46, 0xcd, 0x8a, 0xf6, 0xed, 0x42, 0x4a, 0x9e, 0x8a, 0xfe, 0x41,
+ 0x00, 0x4e, 0x77, 0x8c, 0x53, 0xd6, 0xb1, 0x9b, 0x08, 0xde, 0x57, 0xf5,
+ 0xa0, 0x92, 0x09, 0xba, 0x1b, 0x45, 0xb3, 0x11, 0x4a, 0xc4, 0xc8, 0x68,
+ 0xb3, 0x75, 0x4c, 0xd6, 0x3f, 0x40, 0xbd, 0xc4, 0x05, 0xd5, 0x00, 0xea,
+ 0xb6, 0xc1, 0x38, 0x77, 0x51, 0xea, 0xab, 0x4b, 0xf1, 0x2b, 0x27, 0x68,
+ 0xfb, 0x95, 0xe4, 0xf2, 0xee, 0xe0, 0x07, 0xa2, 0x10, 0xa6, 0xfa, 0xfa,
+ 0xd3, 0xc7, 0xf3, 0x7f, 0x4b, 0xc1, 0xed, 0x51, 0xac, 0x2a, 0xaa, 0x2b,
+ 0x4e, 0x20, 0x76, 0x02, 0x52, 0x1f, 0x70, 0x58, 0x06, 0x97, 0x10, 0x59,
+ 0x96, 0x36, 0x40, 0xa4, 0x1d, 0x90, 0xf6, 0xfa, 0x92, 0x1b, 0xf5, 0x85,
+ 0x18, 0xdf, 0x2b, 0xfe, 0xa6, 0x90, 0xc3, 0x44, 0xce, 0xd9, 0x53, 0xb3,
+ 0x4e, 0x56, 0x92, 0x7d, 0x3d, 0x05, 0x3e, 0x16, 0x42, 0x81, 0x0e, 0x3d,
+ 0xcc, 0xb7, 0x7e, 0x34, 0x4a, 0xe6, 0x6d, 0x79, 0x4d, 0x3d, 0x9b, 0xbd,
+ 0x8b, 0xb3, 0xdc, 0xe7, 0xb5, 0xa7, 0x67, 0xe8, 0xf8, 0x7e, 0x27, 0x27,
+ 0x9c, 0xa3, 0xfe, 0x0d, 0x76, 0x02, 0x54, 0x98, 0x4f, 0x7a, 0x98, 0x96,
+ 0x21, 0xbe, 0xc7, 0x76, 0xce, 0xcf, 0x64, 0x99, 0x0b, 0x44, 0x8b, 0x53,
+ 0x85, 0x59, 0x91, 0x46, 0x80, 0x2a, 0x49, 0x6c, 0xa6, 0x7f, 0x4d, 0x12,
+ 0xdb, 0xe8, 0x19, 0x0e, 0x92, 0xa8, 0xab, 0x60, 0x59, 0x4a, 0x16, 0x38,
+ 0xfb, 0xd7, 0xd5, 0xb6, 0x60, 0xa4, 0xc6, 0x6f, 0x1a, 0xc9, 0x7f, 0x3b,
+ 0x6b, 0x4d, 0xff, 0x7e, 0xb1, 0x6a, 0x6a, 0x52, 0x42, 0xe2, 0x0a, 0x60,
+ 0xe8, 0x9c, 0xf1, 0x96, 0x5c, 0x1b, 0x5f, 0x07, 0xb9, 0x6f, 0x22, 0x4c,
+ 0x68, 0x0e, 0x4f, 0x43, 0xe2, 0xcf, 0x4c, 0x11, 0x88, 0xed, 0x2c, 0x4a,
+ 0xc1, 0x40, 0x17, 0xa4, 0xf2, 0xc1, 0xaa, 0x0e, 0x24, 0x13, 0x3b, 0xbc,
+ 0x3a, 0x6a, 0xe0, 0xe0, 0x5f, 0x03, 0x2e, 0x9c, 0x1e, 0x0d, 0xc0, 0x8c,
+ 0xa7, 0x30, 0x52, 0x95, 0xb2, 0x22, 0xb5, 0x7b, 0xb4, 0x6b, 0x01, 0x9b,
+ 0x3d, 0xbc, 0xd6, 0x79, 0xa1, 0x28, 0x58, 0x76, 0x97, 0xec, 0xae, 0xf6,
+ 0x65, 0x20, 0x01, 0xc0, 0x5e, 0xe2, 0x4d, 0x21, 0xcf, 0x3a, 0x1e, 0x7b,
+ 0x05, 0x04, 0x62, 0xe3, 0x72, 0x6c, 0x54, 0x31, 0x52, 0x41, 0xa1, 0x74,
+ 0x4b, 0x65, 0xd0, 0xef, 0x05, 0xcf, 0x65, 0x1f, 0x6c, 0x98, 0x89, 0xb1,
+ 0xff, 0xad, 0xe7, 0x37, 0x6d, 0xee, 0x10, 0xf3, 0x62, 0x1a, 0xf5, 0x96,
+ 0x1a, 0x41, 0x40, 0x7d, 0x33, 0x50, 0x04, 0xa2, 0x25, 0xb7, 0xf3, 0x16,
+ 0x6f, 0xae, 0x9f, 0xb8, 0x51, 0x4f, 0x38, 0xa3, 0x0c, 0xf0, 0x0a, 0x53,
+ 0x2f, 0x19, 0x88, 0x67, 0xac, 0x31, 0x7f, 0xdd, 0x82, 0x01, 0xd8, 0xca,
+ 0xc1, 0xe2, 0x32, 0xcb, 0x74, 0xed, 0x24, 0x3b, 0x33, 0xa9, 0xa1, 0xe2,
+ 0xfc, 0x1f, 0x8b, 0x6f, 0xaf, 0x4c, 0x67, 0x96, 0xce, 0x0f, 0x03, 0xd9,
+ 0x75, 0xcb, 0x8f, 0xad, 0xe3, 0xa2, 0xa6, 0xd9, 0x74, 0xb6, 0x99, 0xef,
+ 0x24, 0x75, 0x76, 0x34, 0xc7, 0x91, 0xc6, 0xb5, 0x8c, 0xaf, 0xe6, 0x28,
+ 0xfe, 0x06, 0x6e, 0x0b, 0xc9, 0x04, 0x92, 0xaf, 0x71, 0xa2, 0x9c, 0x31,
+ 0xbf, 0x8f, 0x6f, 0xd1, 0xcc, 0x00, 0xdd, 0x97, 0x9f, 0xb8, 0x8d, 0x4b,
+ 0x97, 0x8a, 0xda, 0x66, 0x65, 0x10, 0x20, 0xcb, 0x46, 0xc1, 0x6f, 0xdc,
+ 0x75, 0x69, 0x5d, 0x74, 0x5b, 0x3f, 0x70, 0xf8, 0xa2, 0xff, 0xf7, 0xba,
+ 0x3e, 0xfa, 0x13, 0x7c, 0xf3, 0x27, 0x74, 0x3e, 0x5c, 0x6b, 0x4d, 0x14,
+ 0xd4, 0x61, 0xbe, 0xe1, 0x20, 0xed, 0xfa, 0x43, 0x68, 0xa5, 0xcc, 0xdd,
+ 0x8b, 0x82, 0x21, 0xa0, 0x21, 0x4d, 0x5a, 0x2a, 0x90, 0xae, 0x33, 0x39,
+ 0x3b, 0xac, 0xb6, 0x85, 0xec, 0x28, 0x1c, 0xc8, 0x3a, 0xad, 0x0b, 0x67,
+ 0xa9, 0xd1, 0xc7, 0x29, 0x6c, 0x54, 0x94, 0x03, 0x5e, 0x90, 0x3a, 0x06,
+ 0xdd, 0xbb, 0x4b, 0x4d, 0xdb, 0x06, 0x8b, 0x98, 0x3c, 0xf2, 0x54, 0x25,
+ 0xc6, 0x29, 0x21, 0x0e, 0x87, 0xc3, 0xe8, 0x0c, 0x51, 0x79, 0x48, 0x77,
+ 0x7a, 0x61, 0x16, 0x7d, 0xca, 0x36, 0x24, 0xe8, 0xca, 0xab, 0xc6, 0x67,
+ 0x95, 0xa7, 0x8f, 0xc3, 0x69, 0xc3, 0x51, 0x94, 0x4e, 0x7c, 0x5a, 0x41,
+ 0x61, 0x1d, 0xf2, 0x6a, 0x14, 0x0a, 0xda, 0x90, 0xba, 0x96, 0x67, 0xa2,
+ 0x31, 0x02, 0xc9, 0xfa, 0x43, 0xb5, 0x51, 0xeb, 0x75, 0x42, 0xa4, 0x7e,
+ 0x12, 0x93, 0x85, 0xad, 0x62, 0xb2, 0x95, 0x93, 0xba, 0x8a, 0x8e, 0x90,
+ 0x53, 0x66, 0x0b, 0x4f, 0x2f, 0xa0, 0x3b, 0x5a, 0x81, 0xa9, 0x62, 0x66,
+ 0xf2, 0xe9, 0xcb, 0x61, 0x12, 0x17, 0x2b, 0x08, 0xf3, 0x95, 0x79, 0x98,
+ 0xe5, 0x3a, 0x59, 0xdf, 0x45, 0xe6, 0x6a, 0x08, 0x33, 0xad, 0x67, 0x11,
+ 0xed, 0x0a, 0x51, 0xeb, 0xc0, 0xa6, 0x1c, 0x68, 0xc9, 0x79, 0x98, 0xb7,
+ 0x0a, 0xb4, 0x46, 0x6b, 0x28, 0x8a, 0xe1, 0x98, 0x65, 0x0e, 0x9b, 0xa0,
+ 0xac, 0xb2, 0xe8, 0x4e, 0x75, 0xf0, 0xf4, 0xfe, 0xa5, 0x08, 0x43, 0xd8,
+ 0x1e, 0x20, 0x8e, 0x8d, 0x77, 0xaa, 0xfd, 0x45, 0xfd, 0x8d, 0xbe, 0xef,
+ 0xd0, 0x69, 0x6b, 0x20, 0x88, 0x0a, 0x08, 0x19, 0x8e, 0x8d, 0x6e, 0x29,
+ 0x53, 0xbd, 0xf5, 0xc8, 0x38, 0xca, 0x30, 0xd0, 0x07, 0x62, 0x59, 0x70,
+ 0x2e, 0xa0, 0x0b, 0x00, 0xd5, 0x2b, 0x8d, 0x9e, 0x03, 0x84, 0x49, 0x01,
+ 0xfe, 0x8b, 0x5b, 0x5c, 0x4d, 0x22, 0x80, 0x7a, 0xea, 0x2b, 0xa2, 0xd2,
+ 0x1a, 0xc7, 0x01, 0xc2, 0x46, 0x1e, 0x20, 0x8a, 0xb4, 0x93, 0x4f, 0x56,
+ 0xec, 0xd2, 0xf5, 0x01, 0x6e, 0x38, 0x57, 0x94, 0xe9, 0x9e, 0xb2, 0x61,
+ 0x6f, 0x29, 0x8c, 0x81, 0xbe, 0x92, 0xc5, 0x9e, 0x71, 0xc1, 0xb3, 0x6b,
+ 0x62, 0x03, 0x35, 0xd8, 0x71, 0x02, 0x50, 0x3e, 0x48, 0xad, 0xd2, 0x77,
+ 0x1c, 0x50, 0x88, 0xf5, 0xc9, 0x2b, 0x11, 0xe2, 0x62, 0xb4, 0x6f, 0xf3,
+ 0x7b, 0xeb, 0xba, 0xe7, 0x7f, 0x08, 0xbc, 0x1d, 0xef, 0xd0, 0x54, 0xa9,
+ 0x2c, 0xb1, 0x8b, 0x27, 0xd5, 0x33, 0xfe, 0xf0, 0x32, 0xb9, 0x99, 0x1a,
+ 0xac, 0x8e, 0x6c, 0x6e, 0xe0, 0x88, 0x22, 0xe3, 0xe9, 0x4d, 0xd7, 0x90,
+ 0x91, 0x1f, 0x0d, 0xdf, 0x43, 0xfe, 0x4a, 0x1d, 0x46, 0xc0, 0xea, 0x7c,
+ 0xf8, 0x5a, 0x34, 0x78, 0x60, 0x8d, 0xbd, 0xea, 0xfa, 0xca, 0xdb, 0x07,
+ 0xfd, 0x76, 0x97, 0xbd, 0xfd, 0x5b, 0xa6, 0xc2, 0xf4, 0x5e, 0x77, 0xe9,
+ 0x7a, 0xae, 0x61, 0xc0, 0x9e, 0xf7, 0x07, 0xd1, 0xde, 0x62, 0xe6, 0xe3,
+ 0xa1, 0xfc, 0xcf, 0x8a, 0x61, 0x9e, 0xbb, 0x05, 0x75, 0xcd, 0x2e, 0x8f,
+ 0xa6, 0xa1, 0x2c, 0x91, 0xf8, 0x25, 0xf0, 0xa5, 0x11, 0xd0, 0xa8, 0x6a,
+ 0x74, 0x08, 0x72, 0xfc, 0xa3, 0xe3, 0x44, 0x0c, 0x96, 0x7b, 0x60, 0x71,
+ 0xff, 0x04, 0xa3, 0x57, 0x6f, 0x34, 0xe8, 0xf0, 0xc9, 0x6b, 0x75, 0x76,
+ 0xeb, 0xc2, 0x59, 0xfd, 0x31, 0x38, 0xbf, 0x51, 0x8c, 0x5c, 0xf0, 0xd9,
+ 0x8e, 0x98, 0x01, 0x61, 0x45, 0x54, 0xa9, 0x7a, 0x28, 0x2b, 0x56, 0x18,
+ 0x76, 0x64, 0x68, 0x09, 0x2f, 0x20, 0xd0, 0x87, 0xd6, 0x8f, 0x39, 0x79,
+ 0x11, 0x11, 0x52, 0xf5, 0xa6, 0x93, 0x49, 0xe4, 0xcf, 0xba, 0xff, 0x5e,
+ 0x61, 0x4f, 0x30, 0xee, 0x38, 0xb7, 0xfc, 0xac, 0xeb, 0x3c, 0xa1, 0x2a,
+ 0x35, 0x32, 0xb4, 0x9c, 0x6b, 0x54, 0xfc, 0xd8, 0xe3, 0x1b, 0xf4, 0x53,
+ 0x36, 0xf3, 0x92, 0xca, 0x13, 0x4e, 0xbb, 0xc7, 0x9f, 0x95, 0x27, 0xc5,
+ 0x17, 0x99, 0x13, 0xbb, 0xbe, 0x6b, 0xf3, 0x24, 0x55, 0x4d, 0x5c, 0x7d,
+ 0x30, 0x35, 0x87, 0x5e, 0x56, 0x54, 0xb4, 0xdc, 0x54, 0xf1, 0x1c, 0x4c,
+ 0xca, 0x1e, 0xde, 0xdb, 0xaa, 0x04, 0x54, 0xe8, 0x1e, 0x30, 0x7f, 0xde,
+ 0xba, 0xa9, 0x66, 0xc5, 0x71, 0xda, 0x70, 0x44, 0x41, 0x72, 0x91, 0x4f,
+ 0xcc, 0x77, 0x55, 0x24, 0xff, 0x09, 0xe2, 0xbb, 0x5c, 0xbc, 0x19, 0xe0,
+ 0x15, 0xf2, 0x6a, 0x1d, 0x08, 0xca, 0xd9, 0x95, 0x10, 0x67, 0x51, 0x35,
+ 0xaf, 0xd4, 0xd7, 0x36, 0x40, 0x84, 0xb4, 0x39, 0x43, 0x4b, 0x43, 0x73,
+ 0x3b, 0xc6, 0x92, 0xe5, 0x19, 0x57, 0x56, 0x86, 0xfa, 0x1e, 0x8a, 0xe2,
+ 0x57, 0xb2, 0x0c, 0x5a, 0xde, 0x6c, 0x5d, 0xef, 0xb8, 0x0b, 0x38, 0xc6,
+ 0x91, 0x2e, 0x84, 0xf2, 0x49, 0xe4, 0x3b, 0xda, 0x5d, 0xcc, 0xcb, 0x6f,
+ 0x61, 0x20, 0xd5, 0xb6, 0xf5, 0xab, 0x02, 0x47, 0xbd, 0x53, 0xf2, 0x10,
+ 0x89, 0xfc, 0x3f, 0x69, 0xb3, 0xd2, 0x45, 0x9f, 0xdf, 0x3b, 0x99, 0x89,
+ 0x4a, 0x4f, 0x84, 0x48, 0x16, 0x75, 0x90, 0xa9, 0x74, 0xf6, 0xaf, 0xee,
+ 0x8e, 0x8a, 0x35, 0x90, 0x4b, 0x80, 0x06, 0x48, 0x04, 0x75, 0x72, 0xce,
+ 0xa8, 0xd4, 0xf8, 0xe5, 0x95, 0xb4, 0xab, 0x39, 0x69, 0x0d, 0x1a, 0x9b,
+ 0x82, 0xd7, 0x81, 0x2f, 0x07, 0x21, 0x29, 0x91, 0xda, 0x0c, 0x32, 0x18,
+ 0x64, 0x36, 0xc0, 0x37, 0x69, 0xde, 0x1a, 0xb4, 0xce, 0x50, 0x29, 0x02,
+ 0x0c, 0x91, 0x3c, 0xe5, 0x80, 0x28, 0x79, 0x66, 0x8e, 0xa6, 0x0a, 0x6e,
+ 0x9d, 0xb1, 0xf8, 0xab, 0x19, 0xae, 0x23, 0xea, 0x34, 0x10, 0x12, 0x06,
+ 0xd5, 0xcf, 0xb5, 0xf7, 0x5c, 0x29, 0xb3, 0x0c, 0xf9, 0xc4, 0x29, 0x28,
+ 0x64, 0x03, 0x6f, 0x05, 0x41, 0xc0, 0xf4, 0x59, 0x91, 0xaa, 0x5c, 0x0b,
+ 0x13, 0x62, 0xdd, 0x48, 0x13, 0xf7, 0x8e, 0xbf, 0xec, 0xb2, 0xb0, 0xe5,
+ 0x81, 0xdc, 0xd3, 0x3f, 0x0c, 0xf0, 0x67, 0x5b, 0x8b, 0x04, 0xf5, 0x1e,
+ 0x00, 0xcb, 0xcf, 0x13, 0xe3, 0xa7, 0xc8, 0x19, 0x0b, 0xe7, 0xbe, 0x61,
+ 0xa4, 0xf9, 0x63, 0x11, 0xa9, 0x0d, 0x1f, 0x04, 0xbf, 0x73, 0xc9, 0x5d,
+ 0x93, 0x84, 0x9a, 0x14, 0xa6, 0xa4, 0x28, 0x22, 0x00, 0x69, 0xea, 0x0a,
+ 0x78, 0xc4, 0x29, 0x6b, 0x57, 0x22, 0x36, 0xae, 0x2c, 0x02, 0xc3, 0x08,
+ 0xd0, 0x4c, 0x80, 0x62, 0xe5, 0x4e, 0xda, 0xbc, 0x0f, 0x83, 0x0e, 0xc3,
+ 0x95, 0x1e, 0x5f, 0x27, 0xac, 0xd1, 0x63, 0x91, 0xdf, 0xaf, 0x8e, 0x5b,
+ 0xb1, 0x6b, 0x47, 0x29, 0x07, 0xa7, 0xd0, 0x1f, 0x51, 0xdf, 0x8b, 0x2b,
+ 0xd7, 0xac, 0xd1, 0x78, 0x19, 0x02, 0x6a, 0x64, 0x65, 0x0a, 0x75, 0xb3,
+ 0x3a, 0x44, 0x42, 0x19, 0x4d, 0x2d, 0x3a, 0x1c, 0x24, 0xcb, 0x4d, 0x7e,
+ 0xa2, 0xfa, 0x87, 0x92, 0xfc, 0x08, 0x92, 0x5c, 0x4a, 0xfc, 0x7c, 0xbf,
+ 0x3b, 0xfc, 0x7f, 0xcf, 0x0e, 0x52, 0x0e, 0xad, 0xf6, 0x36, 0x14, 0xc6,
+ 0xa2, 0x46, 0x9c, 0x3a, 0xd9, 0xa2, 0x47, 0x74, 0x58, 0x81, 0x79, 0x21,
+ 0xa0, 0x7d, 0x72, 0xbd, 0x70, 0x1d, 0x11, 0xe7, 0x48, 0x84, 0xde, 0xf1,
+ 0xc5, 0xbf, 0xa5, 0xee, 0xa1, 0xfd, 0xa3, 0x72, 0x77, 0x27, 0x24, 0xc8,
+ 0xdf, 0x64, 0x9b, 0x22, 0x14, 0x56, 0x7d, 0x1a, 0x9d, 0xc0, 0x18, 0x88,
+ 0x30, 0x8b, 0xf6, 0x1f, 0xb3, 0xb6, 0x5d, 0x49, 0x87, 0x0f, 0x78, 0x93,
+ 0xdf, 0x9c, 0x1e, 0x22, 0x27, 0x95, 0x65, 0xc1, 0x3a, 0xd9, 0x42, 0x40,
+ 0xba, 0xac, 0xa2, 0x2c, 0xc4, 0xb2, 0x74, 0xfd, 0x57, 0xb4, 0x88, 0xa2,
+ 0xf7, 0x28, 0xbc, 0x50, 0x79, 0xc8, 0x38, 0x75, 0x06, 0x17, 0x9f, 0xb7,
+ 0xd2, 0xf4, 0x3a, 0xbb, 0x56, 0xfc, 0xde, 0x3c, 0xca, 0x3e, 0xcc, 0x71,
+ 0xae, 0x79, 0x6c, 0x4e, 0x8c, 0x75, 0x11, 0xb5, 0x30, 0xb4, 0x63, 0xde,
+ 0xfe, 0x95, 0x65, 0xb7, 0x35, 0x7c, 0x09, 0x46, 0x78, 0xb7, 0xa3, 0x24,
+ 0x0f, 0x06, 0x22, 0xf6, 0x60, 0x76, 0xd0, 0xee, 0x63, 0x1d, 0xaa, 0x2b,
+ 0x68, 0x2a, 0x89, 0x4d, 0x4b, 0xbc, 0xf4, 0xfe, 0x78, 0x35, 0xa7, 0x2f,
+ 0x48, 0xa6, 0xf1, 0xc9, 0x33, 0xa3, 0x2d, 0x3e, 0x5e, 0x5d, 0xdd, 0xdc,
+ 0x54, 0xae, 0xad, 0x20, 0xd0, 0x5c, 0x40, 0x6b, 0x21, 0x6f, 0x10, 0xd5,
+ 0xbb, 0x5d, 0x90, 0x3f, 0xd3, 0x34, 0x5c, 0x82, 0x53, 0xa0, 0x46, 0x8f,
+ 0xfb, 0x2f, 0xf3, 0xc2, 0x5f, 0x44, 0xf1, 0xa6, 0x83, 0x79, 0x6b, 0xf5,
+ 0x1f, 0x41, 0x45, 0xcb, 0x99, 0x2e, 0x7c, 0xd5, 0x23, 0xff, 0x92, 0x4e,
+ 0x9b, 0xc3, 0xc2, 0x67, 0x68, 0x24, 0xa0, 0x57, 0xa0, 0xb6, 0x29, 0xcb,
+ 0x25, 0xb1, 0x87, 0x56, 0x13, 0x86, 0x70, 0xb9, 0x42, 0x2b, 0x9c, 0xa4,
+ 0x18, 0xa7, 0x0c, 0xd6, 0x8b, 0xb0, 0xfc, 0xe0, 0xe3, 0x7e, 0x95, 0x3d,
+ 0x5e, 0x9b, 0x83, 0x09, 0x88, 0xf8, 0x9e, 0x91, 0x68, 0x70, 0x13, 0xdc,
+ 0x6f, 0x91, 0x47, 0x5a, 0x31, 0x7d, 0xc8, 0x79, 0x04, 0x39, 0x0b, 0xdb,
+ 0x2e, 0xe3, 0xe9, 0xfb, 0xbb, 0x07, 0x0b, 0x21, 0x93, 0xc3, 0xc6, 0xaf,
+ 0x1a, 0xb3, 0x25, 0xd7, 0xd4, 0x1e, 0x3e, 0xf0, 0xaf, 0x3c, 0xaa, 0xea,
+ 0xd3, 0x8a, 0x41, 0x2a, 0x8e, 0x83, 0x6c, 0xe3, 0xad, 0x0c, 0x12, 0xa3,
+ 0xc3, 0x67, 0x40, 0x0f, 0x14, 0x0f, 0xbe, 0xf6, 0x4c, 0x86, 0x08, 0xd1,
+ 0xc8, 0x4f, 0x75, 0xcf, 0x62, 0xde, 0x6a, 0x24, 0x7c, 0x67, 0x7f, 0x2b,
+ 0x2e, 0x97, 0x42, 0xa7, 0x2a, 0x07, 0x96, 0xa8, 0x36, 0xc1, 0xd1, 0xe9,
+ 0x6b, 0xb2, 0xdc, 0x36, 0x9a, 0x6e, 0x19, 0x99, 0xf6, 0x36, 0x28, 0xdb,
+ 0xdc, 0xb0, 0x8d, 0x33, 0x6d, 0x22, 0x8c, 0xe3, 0x78, 0x55, 0x56, 0xed,
+ 0xe7, 0x68, 0xdb, 0xd5, 0x77, 0x5e, 0x25, 0x6c, 0xdf, 0x41, 0x5d, 0x7e,
+ 0xce, 0x33, 0xd6, 0xee, 0x35, 0x04, 0xa7, 0xda, 0x94, 0x27, 0x0e, 0xd8,
+ 0x57, 0x3c, 0x6b, 0x18, 0x04, 0x93, 0x64, 0xb8, 0xf4, 0x5b, 0x3e, 0xe1,
+ 0xfb, 0x0c, 0xb8, 0x72, 0x4e, 0x27, 0xb8, 0xa4, 0x53, 0xc4, 0x27, 0xfc,
+ 0x22, 0x76, 0x78, 0xf2, 0x52, 0x00, 0xe5, 0x3b, 0xff, 0x10, 0xba, 0x75,
+ 0x52, 0xd7, 0xe8, 0xb9, 0x3f, 0xcb, 0x56, 0xc3, 0x2e, 0x3d, 0x5d, 0xcc,
+ 0x67, 0x88, 0x7b, 0x33, 0x6c, 0x9e, 0xa4, 0x0f, 0x80, 0xa3, 0x62, 0x3f,
+ 0x03, 0x89, 0x06, 0x82, 0x93, 0xbb, 0x32, 0xcd, 0xe8, 0x99, 0x5a, 0x3a,
+ 0x4c, 0xf6, 0x42, 0x0d, 0x56, 0x60, 0x3c, 0xdc, 0xcf, 0x6b, 0xc2, 0x5a,
+ 0x1d, 0x35, 0x8d, 0xd1, 0x11, 0x31, 0xe0, 0x30, 0xba, 0xa6, 0x48, 0xfc,
+ 0x94, 0x6a, 0x31, 0x29, 0xc7, 0xa6, 0x47, 0xaf, 0x14, 0x93, 0x33, 0x2b,
+ 0x3e, 0x34, 0x5d, 0x79, 0xb7, 0xca, 0xea, 0xac, 0xa7, 0xf3, 0xfa, 0x65,
+ 0x57, 0x4c, 0xcd, 0x2c, 0x0b, 0xa5, 0xbc, 0x25, 0x8a, 0x2a, 0xa2, 0xfe,
+ 0x40, 0xf7, 0x28, 0x30, 0x4a, 0x1e, 0x4c, 0x29, 0x82, 0x86, 0x04, 0x2a,
+ 0x63, 0xc3, 0xcf, 0xd4, 0x81, 0xda, 0xb8, 0x43, 0x71, 0x57, 0x3b, 0xf6,
+ 0x58, 0xf1, 0xae, 0x84, 0xa8, 0xd0, 0xa0, 0x3b, 0xfe, 0x5a, 0x39, 0x8a,
+ 0xf2, 0x35, 0x00, 0x58, 0xb6, 0x25, 0x46, 0x62, 0x05, 0xab, 0x27, 0x98,
+ 0x28, 0x4e, 0x37, 0xbc, 0xe2, 0xd7, 0x30, 0x2c, 0xae, 0x1c, 0xea, 0x59,
+ 0x96, 0x72, 0xa9, 0x9d, 0xa8, 0x9e, 0xed, 0x24, 0xc0, 0x48, 0x63, 0xad,
+ 0x54, 0x2d, 0x17, 0x0f, 0xa1, 0xff, 0x72, 0xac, 0xbb, 0xa6, 0x62, 0x3a,
+ 0x83, 0x71, 0xd8, 0x02, 0x51, 0x7c, 0xaa, 0x9e, 0x3b, 0x72, 0xdc, 0x10,
+ 0xa7, 0xd5, 0x1b, 0xa1, 0x7a, 0x7a, 0x21, 0x99, 0x5a, 0x6f, 0x83, 0x07,
+ 0x5f, 0x71, 0xa3, 0x2b, 0x6d, 0x81, 0xd3, 0x20, 0x18, 0xc2, 0x08, 0xd5,
+ 0xe8, 0x00, 0xaa, 0xfb, 0x3b, 0x3c, 0xd7, 0xba, 0x4d, 0xa2, 0x67, 0x96,
+ 0x42, 0x89, 0xb7, 0x4b, 0x6c, 0x0f, 0xa0, 0x0d, 0x07, 0x82, 0x33, 0xf7,
+ 0x8d, 0xdc, 0xf2, 0x7d, 0x61, 0x02, 0x1b, 0xd6, 0x78, 0xfe, 0x24, 0x11,
+ 0xbd, 0xb1, 0x0e, 0x82, 0x97, 0x3c, 0x44, 0x82, 0xb0, 0x4d, 0x58, 0xa8,
+ 0x9f, 0x4c, 0x28, 0x52, 0x7c, 0xbe, 0xeb, 0xc1, 0x18, 0x22, 0x55, 0xb0,
+ 0xb3, 0x23, 0x8d, 0x2a, 0xc2, 0xcb, 0x73, 0x58, 0x74, 0x07, 0xe1, 0xa6,
+ 0xb7, 0x71, 0x1d, 0x93, 0xff, 0x43, 0xba, 0xe0, 0xad, 0x93, 0x42, 0x12,
+ 0xa9, 0x54, 0xab, 0xc9, 0x29, 0x7e, 0x5a, 0xf1, 0xf0, 0x99, 0xb9, 0x59,
+ 0x22, 0x05, 0xb4, 0xd4, 0xfb, 0xf6, 0xca, 0xb2, 0x81, 0x12, 0x28, 0xf8,
+ 0x2a, 0x57, 0xc9, 0x14, 0x60, 0x4c, 0xd0, 0xcd, 0x2e, 0x3a, 0xd6, 0x65,
+ 0x63, 0x88, 0xe7, 0xff, 0xdc, 0x21, 0xfd, 0xe4, 0xd9, 0x91, 0xc2, 0xa5,
+ 0xd2, 0x93, 0xa3, 0xd7, 0x81, 0x19, 0x79, 0x5a, 0x02, 0x08, 0xae, 0x45,
+ 0xa2, 0xb2, 0x2a, 0x38, 0x02, 0x8a, 0x67, 0x49, 0x00, 0xb8, 0x74, 0xec,
+ 0xd9, 0x78, 0xd7, 0x97, 0xd2, 0xba, 0xd7, 0x7f, 0xd3, 0x1c, 0x6f, 0x40,
+ 0x2c, 0x4c, 0xb6, 0x95, 0xf1, 0x2b, 0xa1, 0x19, 0x66, 0x76, 0x35, 0xf2,
+ 0x04, 0x1f, 0xcc, 0x0b, 0x0b, 0x89, 0x97, 0x4a, 0xf7, 0x49, 0x66, 0x25,
+ 0x90, 0x22, 0x3f, 0x9a, 0xf2, 0x9c, 0x7a, 0x68, 0xed, 0x73, 0x42, 0x9c,
+ 0x83, 0x27, 0xbf, 0x44, 0x9e, 0x77, 0xcd, 0x21, 0xb6, 0x4b, 0xe5, 0x9f,
+ 0x97, 0x48, 0x78, 0x86, 0x1d, 0x3c, 0x20, 0xc3, 0xb9, 0xbf, 0x42, 0xdd,
+ 0x29, 0x2f, 0xd9, 0x2b, 0xd9, 0x7a, 0xc1, 0x1c, 0xca, 0x2b, 0x9c, 0xcd,
+ 0xd0, 0x76, 0x86, 0x06, 0xcd, 0x23, 0x3e, 0x41, 0x15, 0xd2, 0x57, 0xe9,
+ 0x7b, 0xca, 0x6f, 0x02, 0x26, 0x43, 0xa8, 0xd6, 0x87, 0x83, 0xed, 0xb3,
+ 0xa8, 0x84, 0x54, 0xad, 0x8f, 0x83, 0x7a, 0x34, 0xc3, 0x6a, 0x5d, 0x97,
+ 0x1e, 0xb9, 0x93, 0x58, 0x6b, 0x67, 0x4d, 0x3b, 0x6b, 0x69, 0x86, 0xfb,
+ 0x40, 0xa6, 0x76, 0xee, 0x74, 0xaa, 0x54, 0x25, 0x5d, 0x24, 0x8c, 0x52,
+ 0xc2, 0x31, 0xd0, 0x86, 0xab, 0xd2, 0x59, 0x6f, 0x46, 0x8a, 0x18, 0x53,
+ 0x0a, 0xf3, 0x94, 0xe0, 0x6c, 0x2c, 0x69, 0xf9, 0x47, 0x49, 0x7e, 0xc5,
+ 0xb0, 0x80, 0x72, 0xf7, 0xc1, 0x4e, 0xc2, 0x9f, 0x7e, 0x8b, 0x94, 0x1c,
+ 0xb3, 0x00, 0xa1, 0xdc, 0x13, 0x66, 0x73, 0x7b, 0x91, 0x2a, 0x78, 0xe6,
+ 0x11, 0xd4, 0x7a, 0xa0, 0x98, 0xe6, 0x2e, 0x4b, 0x73, 0x4d, 0x19, 0xe2,
+ 0x8c, 0x7b, 0x13, 0xf6, 0x03, 0x32, 0x78, 0x4c, 0x99, 0xdf, 0xd8, 0x75,
+ 0x2b, 0x2b, 0x01, 0x35, 0x0c, 0xea, 0xb4, 0x80, 0x2c, 0x82, 0x83, 0xe1,
+ 0xd2, 0x81, 0x38, 0xad, 0x34, 0x71, 0xf8, 0x56, 0xfc, 0x05, 0xa0, 0xa5,
+ 0x6d, 0xfa, 0x67, 0x01, 0x78, 0x8d, 0x1c, 0xb4, 0x72, 0x06, 0x7b, 0x8e,
+ 0xf9, 0x11, 0x72, 0xc6, 0xe6, 0x9b, 0x7d, 0x7c, 0x6d, 0x6d, 0x20, 0xd9,
+ 0x60, 0xa1, 0x76, 0x65, 0x0a, 0x13, 0x41, 0x96, 0xea, 0x24, 0x56, 0xbf,
+ 0x45, 0xf0, 0x0e, 0xa1, 0xe1, 0x6c, 0x70, 0x9d, 0x16, 0x76, 0xf5, 0x22,
+ 0x63, 0xd9, 0x1b, 0xf4, 0x83, 0x39, 0xc9, 0xad, 0xde, 0xa4, 0x83, 0x95,
+ 0x1a, 0x0d, 0xba, 0xd6, 0x48, 0xff, 0x7a, 0x41, 0x46, 0x27, 0x02, 0x0f,
+ 0x47, 0xff, 0x6a, 0x1d, 0xe3, 0xba, 0xc3, 0x24, 0xc4, 0x9f, 0x02, 0xc2,
+ 0x65, 0xd6, 0xd1, 0x32, 0x40, 0x91, 0x50, 0x74, 0x75, 0x44, 0x3e, 0xf8,
+ 0x24, 0xc8, 0xdd, 0xdb, 0xaa, 0xd3, 0xff, 0x08, 0x0d, 0x2e, 0x61, 0x41,
+ 0x87, 0xbc, 0x8a, 0x96, 0xd8, 0xd5, 0xe2, 0x25, 0x65, 0xd4, 0xa8, 0xe1,
+ 0x61, 0x3d, 0x11, 0x00, 0xff, 0xcf, 0x25, 0x87, 0xd3, 0xa8, 0x6b, 0x88,
+ 0x73, 0xa2, 0xb8, 0xa4, 0x96, 0xa8, 0xcf, 0x6c, 0xd3, 0xb8, 0xb0, 0x07,
+ 0x7a, 0xdc, 0xf0, 0x52, 0x27, 0xfe, 0xe1, 0x44, 0x93, 0x2c, 0x9f, 0x91,
+ 0x68, 0xbe, 0x37, 0x0f, 0x8c, 0x89, 0x4c, 0x2e, 0x8e, 0x1c, 0xe9, 0xdc,
+ 0xeb, 0x68, 0x91, 0x1b, 0x8d, 0x69, 0x88, 0x7e, 0xea, 0x56, 0xa3, 0x79,
+ 0x72, 0x62, 0xd2, 0x63, 0xfb, 0x32, 0xa3, 0xa0, 0xcc, 0x2c, 0x4e, 0xaa,
+ 0xb4, 0x0a, 0x19, 0xa4, 0x8d, 0x8c, 0x03, 0x31, 0x20, 0x7a, 0x9b, 0x09,
+ 0x63, 0x4b, 0x81, 0x4b, 0x50, 0x33, 0x42, 0xe0, 0x24, 0x82, 0x66, 0xb2,
+ 0x7f, 0x44, 0x19, 0xed, 0x44, 0x17, 0x4b, 0x66, 0x9e, 0x22, 0x28, 0x80,
+ 0x55, 0xdf, 0xb6, 0xad, 0xce, 0x1b, 0xb0, 0xcd, 0x5d, 0x73, 0xe0, 0x2d,
+ 0x3c, 0xf0, 0xc4, 0xd8, 0x4d, 0x05, 0x0c, 0x31, 0x3b, 0xb1, 0xfc, 0xf9,
+ 0x49, 0xcd, 0xc3, 0x04, 0x65, 0xb0, 0x0e, 0xcc, 0xd3, 0xd4, 0xb4, 0xef,
+ 0xe3, 0xd6, 0xb1, 0xd5, 0x3a, 0xa3, 0x96, 0x54, 0x84, 0x1a, 0x4a, 0x2f,
+ 0x05, 0xb3, 0x86, 0x99, 0x65, 0x31, 0xc1, 0xed, 0x46, 0xfb, 0x7e, 0x36,
+ 0xc8, 0x10, 0x5a, 0x8a, 0x4f, 0x64, 0xf7, 0x66, 0xad, 0x79, 0x0e, 0xd4,
+ 0x6e, 0x65, 0x81, 0x2e, 0x4a, 0xcb, 0x32, 0xf2, 0xe2, 0x86, 0x59, 0xb5,
+ 0x65, 0x4f, 0x9e, 0xf1, 0x42, 0x0b, 0xdc, 0x67, 0xb2, 0x78, 0xf7, 0x60,
+ 0x1a, 0xb8, 0xa6, 0x8f, 0x4d, 0x55, 0x2f, 0xeb, 0x45, 0x05, 0x5b, 0xb4,
+ 0xc5, 0x67, 0xbc, 0x2b, 0x2c, 0xbe, 0x75, 0xe1, 0x5c, 0xa3, 0x2a, 0xdf,
+ 0xb9, 0xc9, 0x6e, 0xc7, 0x20, 0xe9, 0x90, 0xdf, 0x24, 0x56, 0x72, 0xf7,
+ 0xa1, 0xc7, 0x3e, 0xbc, 0x69, 0x7d, 0x4c, 0xc7, 0xcc, 0xfc, 0xbe, 0xe4,
+ 0x3e, 0xe0, 0x8a, 0xd1, 0x06, 0xb5, 0x95, 0xcd, 0xc0, 0xb7, 0x77, 0x13,
+ 0x8a, 0xfb, 0x56, 0xb7, 0x94, 0x8a, 0x77, 0x52, 0xcb, 0x00, 0x87, 0x1b,
+ 0xc8, 0xd2, 0xb3, 0xe3, 0x50, 0xf1, 0xb3, 0xdc, 0x3f, 0x62, 0x0c, 0xbf,
+ 0xad, 0xf7, 0x92, 0xf0, 0x57, 0xfb, 0xc2, 0xaa, 0x91, 0x4b, 0xc9, 0x1a,
+ 0x96, 0x19, 0xed, 0x52, 0x52, 0x0c, 0x0a, 0x39, 0x14, 0x4d, 0x77, 0xc8,
+ 0x5a, 0xdb, 0x46, 0xbb, 0xd6, 0x80, 0x6a, 0xd2, 0xe3, 0xaa, 0xd8, 0xda,
+ 0x28, 0xb9, 0xc4, 0x85, 0x7d, 0x50, 0xbc, 0x5d, 0xbe, 0xa7, 0xfa, 0x90,
+ 0xbe, 0x3f, 0x18, 0x46, 0xb5, 0xf9, 0x5d, 0xd4, 0xfa, 0xa3, 0x8b, 0x97,
+ 0x1c, 0x81, 0xb8, 0x06, 0x4a, 0x4a, 0x74, 0xcb, 0xb5, 0x07, 0xcc, 0xea,
+ 0xa2, 0xa3, 0x16, 0x2f, 0x88, 0xff, 0xb6, 0xc3, 0x05, 0x4f, 0x0a, 0x5c,
+ 0x20, 0xea, 0x05, 0x43, 0xca, 0x7c, 0x60, 0x00, 0x43, 0xd3, 0xfa, 0x19,
+ 0x1e, 0x5b, 0x77, 0xbb, 0x5b, 0xff, 0x3b, 0xa4, 0xfb, 0x96, 0xe9, 0x9f,
+ 0x45, 0x6f, 0x87, 0xce, 0x02, 0x26, 0x7b, 0x8a, 0xbe, 0x92, 0xe4, 0xf1,
+ 0x38, 0x51, 0x5a, 0xe0, 0x16, 0x83, 0x8a, 0xc2, 0x84, 0x8a, 0x34, 0x9c,
+ 0x14, 0xa3, 0xa6, 0x9d, 0x9f, 0xac, 0x44, 0x0c, 0x5b, 0x03, 0x9b, 0x8e,
+ 0xa5, 0xd5, 0x4d, 0xae, 0x42, 0xa8, 0x29, 0x75, 0xdd, 0x5e, 0xee, 0x3c,
+ 0xa8, 0x3d, 0xb9, 0xcb, 0x12, 0x33, 0x0c, 0x21, 0x6a, 0xe1, 0x29, 0xf7,
+ 0xde, 0x63, 0x8d, 0x38, 0x78, 0xdf, 0x5a, 0x6e, 0x8f, 0x60, 0x7b, 0xab,
+ 0xdf, 0x29, 0x67, 0xb2, 0x5c, 0x56, 0x50, 0x08, 0x37, 0x13, 0x67, 0xf6,
+ 0xc3, 0xe3, 0xed, 0x29, 0xc7, 0xd5, 0xdb, 0xcc, 0x3a, 0x98, 0x92, 0xba,
+ 0x8f, 0x11, 0x5c, 0x79, 0x21, 0x8a, 0x46, 0x1b, 0x97, 0x49, 0x3d, 0x49,
+ 0xca, 0xf9, 0x4a, 0xf7, 0x49, 0x37, 0x9e, 0x2c, 0x17, 0xae, 0x5d, 0xa3,
+ 0x35, 0x6d, 0xdb, 0xc7, 0xaf, 0xfb, 0x50, 0xfd, 0xf8, 0xd4, 0x4f, 0x2e,
+ 0x4b, 0xc1, 0xa1, 0x9d, 0xdf, 0x32, 0x72, 0x5b, 0x1d, 0x67, 0x7e, 0x91,
+ 0xf3, 0x46, 0xed, 0xdd, 0x1f, 0x69, 0x89, 0x34, 0xb7, 0x0a, 0x16, 0xbf,
+ 0xa1, 0x29, 0xf5, 0x4d, 0xf8, 0x3a, 0xb3, 0xfa, 0xf7, 0x0b, 0xeb, 0x64,
+ 0xad, 0x3c, 0x47, 0x3e, 0x14, 0x37, 0x5b, 0xde, 0xf0, 0xe7, 0x27, 0xce,
+ 0x4b, 0xe5, 0x1f, 0x72, 0xad, 0x7b, 0xca, 0x8c, 0xb8, 0x69, 0xef, 0x39,
+ 0x98, 0x13, 0xcd, 0xaa, 0xe7, 0x58, 0x90, 0x51, 0x8b, 0xfd, 0xbb, 0x51,
+ 0xe4, 0xa8, 0x80, 0xb3, 0x58, 0x59, 0x1f, 0x7b, 0x96, 0xcc, 0x7e, 0xa8,
+ 0xef, 0xc5, 0x98, 0xa0, 0x22, 0x8e, 0xbc, 0x5e, 0x25, 0x01, 0x0f, 0x70,
+ 0x04, 0x93, 0x5f, 0x96, 0xc2, 0x9e, 0x1d, 0xbb, 0xf5, 0x88, 0xd4, 0xf2,
+ 0x7e, 0xfd, 0x4f, 0x3b, 0xf0, 0xbe, 0xe6, 0xad, 0x41, 0x82, 0xf4, 0x0b,
+ 0x2e, 0xa8, 0xbc, 0xfd, 0xb5, 0xc7, 0xd6, 0x72, 0xb5, 0x48, 0x7b, 0x12,
+ 0x18, 0xbf, 0x9e, 0x26, 0x11, 0x49, 0x58, 0xab, 0x53, 0x86, 0xa4, 0xa4,
+ 0x91, 0x35, 0x35, 0x5e, 0x91, 0x33, 0xe0, 0xe6, 0x03, 0xee, 0x2e, 0x8d,
+ 0x22, 0xfb, 0x12, 0x87, 0xdc, 0xd8, 0x17, 0x3a, 0xdb, 0x08, 0xfb, 0x33,
+ 0xf0, 0x6e, 0x94, 0x4b, 0xfc, 0x35, 0x59, 0x9f, 0x79, 0xfd, 0x6f, 0x11,
+ 0x72, 0x33, 0xa0, 0xdb, 0x08, 0xbc, 0x75, 0x7a, 0x44, 0xdb, 0x9b, 0xac,
+ 0x50, 0x2d, 0xff, 0xec, 0x87, 0x52, 0xee, 0xf7, 0xeb, 0x24, 0xd9, 0x7e,
+ 0xab, 0xd4, 0x0d, 0x3d, 0x3a, 0x69, 0x57, 0x82, 0x0f, 0x79, 0xca, 0x5b,
+ 0xea, 0x3d, 0x09, 0x5a, 0xaf, 0xf7, 0x5f, 0xe1, 0x4a, 0x1a, 0x84, 0xdb,
+ 0xe7, 0x7a, 0x74, 0x0d, 0xdf, 0x21, 0x67, 0x7f, 0x99, 0x29, 0x01, 0x31,
+ 0xd1, 0x84, 0x0e, 0xf6, 0xd3, 0x62, 0xfc, 0x80, 0xd4, 0x95, 0xc1, 0x8b,
+ 0x12, 0x90, 0xe6, 0x5c, 0xd2, 0xf5, 0x19, 0x8a, 0xad, 0x09, 0xf8, 0x24,
+ 0x28, 0x05, 0x1f, 0x2a, 0xc6, 0x6d, 0xdf, 0xaf, 0xdf, 0xa5, 0xcb, 0xa4,
+ 0x04, 0x51, 0xd0, 0x1f, 0x68, 0xd3, 0xc0, 0x63, 0xbb, 0xd1, 0xa4, 0x43,
+ 0x7d, 0xc4, 0x6e, 0x7d, 0x25, 0xe6, 0x73, 0xfe, 0x96, 0xbd, 0xb1, 0x27,
+ 0x76, 0x97, 0xf6, 0x64, 0xfc, 0x1c, 0x12, 0x7f, 0xec, 0xea, 0x2e, 0xa5,
+ 0x98, 0xe9, 0xc6, 0x8f, 0xf9, 0x15, 0xb3, 0x0a, 0xc8, 0xf7, 0xca, 0x23,
+ 0x0f, 0x7e, 0x42, 0x79, 0x10, 0x31, 0x96, 0x78, 0x7d, 0x05, 0x2c, 0x82,
+ 0xea, 0xaf, 0x59, 0xc9, 0x77, 0xb4, 0xa7, 0xa4, 0x48, 0x31, 0xa6, 0x29,
+ 0x7b, 0x9d, 0x83, 0x87, 0xfc, 0x11, 0x96, 0x3d, 0x78, 0x02, 0xc6, 0xfe,
+ 0x7d, 0x81, 0x3b, 0xa1, 0xf3, 0xc6, 0xf2, 0xdb, 0x45, 0xfc, 0xe3, 0xfb,
+ 0x04, 0x35, 0xbd, 0xaa, 0xdb, 0x97, 0xaa, 0x6a, 0x4e, 0xac, 0xc3, 0x98,
+ 0xff, 0x70, 0xad, 0xa1, 0xab, 0x15, 0x43, 0xcf, 0x31, 0x0d, 0xd1, 0x5c,
+ 0xe5, 0xf5, 0x4e, 0x0c, 0x45, 0x22, 0xc1, 0x27, 0x4f, 0x82, 0x90, 0x39,
+ 0x97, 0xb9, 0x1d, 0x5e, 0xe3, 0x7d, 0x0e, 0x90, 0x04, 0x3a, 0xc2, 0x71,
+ 0xbb, 0x17, 0x64, 0xe2, 0xd0, 0x97, 0x0d, 0x79, 0x29, 0xbc, 0x67, 0x30,
+ 0xd0, 0xb8, 0x42, 0x3c, 0x64, 0x7f, 0x98, 0x4d, 0x13, 0x95, 0x87, 0xe4,
+ 0x17, 0xd9, 0x00, 0x02, 0x6b, 0x4b, 0x67, 0x7d, 0x6c, 0x24, 0x3f, 0x5b,
+ 0xe2, 0x6f, 0x9d, 0xa4, 0xf7, 0x00, 0x4f, 0x96, 0x1f, 0x23, 0xb3, 0x42,
+ 0x87, 0x8c, 0xa1, 0x48, 0x51, 0x15, 0x16, 0x82, 0xf9, 0xb8, 0x65, 0xf4,
+ 0x4e, 0x87, 0x59, 0xf7, 0x9b, 0x12, 0xf5, 0x3b, 0xc2, 0xff, 0xe6, 0xcc,
+ 0xfc, 0x62, 0x4c, 0xd9, 0x85, 0x2b, 0x45, 0xdc, 0x04, 0x2c, 0x47, 0x69,
+ 0x58, 0xc4, 0x0a, 0x95, 0xd9, 0xfe, 0xf7, 0x09, 0xd9, 0xd3, 0x8e, 0xf1,
+ 0xc6, 0xe7, 0xc3, 0x51, 0xf3, 0x69, 0x18, 0xeb, 0x7b, 0xf2, 0x00, 0x80,
+ 0x23, 0x75, 0x1f, 0x1e, 0x0f, 0xba, 0xab, 0x41, 0xe1, 0xa9, 0x35, 0xd0,
+ 0x5d, 0x5a, 0x49, 0xbf, 0x1f, 0x88, 0x40, 0xa6, 0x77, 0x4a, 0x40, 0xcf,
+ 0x6b, 0xb8, 0xec, 0x9a, 0x45, 0x05, 0xbf, 0xe5, 0x0f, 0xde, 0xd4, 0xaf,
+ 0xeb, 0x73, 0xef, 0x70, 0xa9, 0xe5, 0xfe, 0xba, 0x03, 0xd9, 0xea, 0xfa,
+ 0x8f, 0x0b, 0x37, 0xcd, 0xc1, 0xcd, 0x95, 0xd7, 0x65, 0x12, 0xfc, 0x18,
+ 0x43, 0x2b, 0xbb, 0xcd, 0x65, 0xc9, 0x25, 0x4a, 0x9b, 0x70, 0xcb, 0xe2,
+ 0x95, 0x39, 0x55, 0x90, 0xe9, 0xf5, 0x8c, 0x97, 0x6d, 0xd4, 0xbe, 0x1c,
+ 0xc0, 0x6b, 0x7c, 0x14, 0x59, 0x09, 0xae, 0xbd, 0x09, 0x8a, 0x41, 0xba,
+ 0x79, 0xde, 0x29, 0x91, 0x63, 0x29, 0xda, 0x07, 0xe4, 0xbc, 0xe0, 0x27,
+ 0xa4, 0xdb, 0xe5, 0x85, 0x80, 0xe9, 0xdd, 0x55, 0xbe, 0xc3, 0xb5, 0x4e,
+ 0x33, 0x89, 0xda, 0x2d, 0x42, 0x74, 0xdc, 0x02, 0x06, 0x16, 0x46, 0xeb,
+ 0xce, 0xb0, 0x7b, 0x73, 0x3d, 0x0b, 0x90, 0xcb, 0x16, 0x48, 0x75, 0x7e,
+ 0x4c, 0x1d, 0x13, 0x53, 0x57, 0x57, 0x89, 0x75, 0x43, 0x43, 0x55, 0x26,
+ 0x4d, 0x7a, 0xa5, 0xdf, 0x59, 0xdf, 0x47, 0x44, 0xb1, 0xdc, 0x55, 0x8f,
+ 0xec, 0x3e, 0x5f, 0x3f, 0x8a, 0x2a, 0xd0, 0x9c, 0x1f, 0xe7, 0xef, 0x41,
+ 0x2d, 0x6f, 0x66, 0xb1, 0x08, 0x5a, 0x2b, 0xcb, 0xfc, 0xdb, 0x6c, 0x2e,
+ 0x28, 0x66, 0xa6, 0x8f, 0xcb, 0x9a, 0x88, 0x81, 0x7b, 0x51, 0x0a, 0x6c,
+ 0x65, 0xba, 0x0a, 0xf6, 0xd5, 0x49, 0x1a, 0xf8, 0x35, 0x68, 0x07, 0x1b,
+ 0x0d, 0x12, 0xce, 0x75, 0xb1, 0x48, 0xfc, 0x8f, 0x6f, 0xf2, 0xb4, 0x33,
+ 0xdd, 0xf2, 0xce, 0xa1, 0xa8, 0x75, 0x86, 0x20, 0x0a, 0x25, 0xe1, 0x6f,
+ 0xf4, 0x6a, 0x93, 0x49, 0xe3, 0xd6, 0x9e, 0x4f, 0xbf, 0xc2, 0x48, 0xfe,
+ 0x21, 0x01, 0x13, 0xde, 0x3b, 0x62, 0x4a, 0xff, 0x83, 0xe7, 0x55, 0x2a,
+ 0x81, 0x9f, 0xbd, 0x43, 0xe1, 0x4d, 0x6d, 0x80, 0x5c, 0xd3, 0xa9, 0x51,
+ 0x03, 0xf0, 0x01, 0x17, 0x10, 0x1f, 0xe5, 0x0f, 0xbb, 0x0a, 0x87, 0x67,
+ 0xff, 0x64, 0xcc, 0x19, 0xc8, 0xba, 0xd4, 0xba, 0x2c, 0xd7, 0x71, 0xd0,
+ 0x05, 0xa9, 0xa9, 0x7e, 0x01, 0xac, 0x48, 0xdb, 0xee, 0x24, 0xc2, 0x16,
+ 0xfa, 0x04, 0x8a, 0x83, 0x9a, 0x42, 0x96, 0x22, 0x84, 0xe5, 0x2b, 0xa3,
+ 0x74, 0xb9, 0xc2, 0x98, 0xd0, 0x2a, 0x58, 0xab, 0x03, 0xf1, 0xfc, 0xb2,
+ 0x1a, 0x2d, 0xed, 0x46, 0x33, 0xb6, 0x5b, 0xb6, 0xa4, 0x9e, 0xf4, 0x54,
+ 0xba, 0x93, 0xf4, 0x6a, 0x4a, 0x91, 0xce, 0xa5, 0x17, 0x3b, 0x01, 0xd3,
+ 0x40, 0x17, 0xa0, 0xfa, 0x9f, 0x70, 0xa5, 0x45, 0x2c, 0x6b, 0xb1, 0xb9,
+ 0x5b, 0x6d, 0xdd, 0xc3, 0xcb, 0x68, 0xd0, 0x7e, 0x12, 0x9e, 0xc5, 0xf0,
+ 0x7a, 0x8e, 0xd0, 0xe2, 0xc5, 0xf1, 0x3c, 0xb0, 0x32, 0x73, 0xeb, 0xc9,
+ 0x04, 0xbe, 0xc3, 0x57, 0xcd, 0x84, 0xa2, 0x6f, 0x74, 0xb1, 0x59, 0xa7,
+ 0x8d, 0x6b, 0xad, 0x5b, 0x1b, 0x2d, 0x8b, 0xf3, 0x07, 0x5c, 0xb5, 0x1c,
+ 0x83, 0xee, 0x82, 0x18, 0x7c, 0xf1, 0xc0, 0x8e, 0x64, 0xd6, 0x48, 0xef,
+ 0x28, 0x5e, 0x28, 0x20, 0x3c, 0x91, 0xb1, 0xcd, 0xa3, 0x1e, 0x37, 0x2a,
+ 0x66, 0xba, 0x3d, 0x5a, 0x11, 0xb1, 0x6b, 0x77, 0x29, 0xb3, 0x46, 0x15,
+ 0x8e, 0x59, 0xc2, 0x2e, 0xc4, 0x5a, 0x03, 0xa1, 0x60, 0xb5, 0x03, 0x63,
+ 0x46, 0xbf, 0x94, 0x4f, 0xef, 0xa7, 0x2f, 0x9d, 0x20, 0x40, 0xfa, 0x5f,
+ 0xf2, 0xad, 0x2b, 0x0c, 0x70, 0xed, 0xdf, 0x98, 0x08, 0xf6, 0x94, 0x1c,
+ 0x93, 0x8e, 0x59, 0xf4, 0xe3, 0x87, 0x94, 0xe4, 0xfc, 0xae, 0x3e, 0x08,
+ 0x07, 0xc4, 0x96, 0x90, 0x6a, 0x0e, 0xbb, 0x5b, 0x76, 0x61, 0xf6, 0x76,
+ 0x2b, 0x71, 0x03, 0x41, 0xc2, 0x8f, 0x84, 0x2b, 0xad, 0x39, 0x52, 0x26,
+ 0xa5, 0x64, 0xfe, 0x3c, 0x84, 0x84, 0x25, 0x21, 0xe7, 0x9a, 0x54, 0xc0,
+ 0xf1, 0xfb, 0xdf, 0x74, 0x16, 0xbe, 0x98, 0xd2, 0x5b, 0xfd, 0x3a, 0xd9,
+ 0xe5, 0x38, 0x0a, 0x81, 0x06, 0x62, 0xbd, 0xe4, 0x85, 0x25, 0xbd, 0x35,
+ 0x64, 0x40, 0xc0, 0x33, 0x2d, 0x20, 0x8d, 0xc9, 0xa3, 0xcd, 0xdb, 0x01,
+ 0xec, 0xec, 0xa4, 0x5f, 0xde, 0xb4, 0xe0, 0x6d, 0xd2, 0x13, 0x9d, 0x92,
+ 0xb8, 0x1d, 0xa8, 0xe8, 0xb8, 0xe0, 0x80, 0x19, 0xbe, 0x5a, 0x0e, 0x5a,
+ 0xaf, 0x91, 0xe0, 0xe8, 0x27, 0xe1, 0x81, 0xef, 0xa4, 0x71, 0xff, 0xe8,
+ 0x0a, 0x76, 0x8d, 0x56, 0x8b, 0x39, 0x18, 0x54, 0x81, 0xf2, 0xa8, 0x0b,
+ 0x56, 0x7e, 0x55, 0x46, 0x18, 0x8e, 0xb2, 0x3e, 0xad, 0xf1, 0x02, 0x4e,
+ 0xc5, 0x08, 0xf6, 0xb1, 0xce, 0x85, 0xf4, 0xab, 0x02, 0xfc, 0x45, 0x42,
+ 0x1c, 0xe8, 0xa1, 0xb7, 0x29, 0xd0, 0x76, 0x58, 0xdc, 0xd6, 0x6c, 0xdf,
+ 0x90, 0x59, 0x36, 0xd0, 0x2e, 0xd2, 0x9b, 0x86, 0xa2, 0x2b, 0x62, 0xc8,
+ 0x47, 0x67, 0x89, 0xab, 0xa3, 0xae, 0xf9, 0x92, 0xc3, 0x82, 0x64, 0x2a,
+ 0x63, 0x01, 0x91, 0xd3, 0x08, 0xca, 0xe7, 0x36, 0x17, 0x77, 0xbb, 0xee,
+ 0xd0, 0x43, 0x3f, 0x4e, 0x53, 0xc7, 0x2a, 0x55, 0x0f, 0x03, 0xdd, 0xb2,
+ 0x30, 0xb8, 0x1c, 0x66, 0x95, 0x5c, 0x93, 0x39, 0xba, 0x4d, 0xc6, 0xe2,
+ 0xd2, 0xf0, 0x67, 0x2d, 0x1d, 0xea, 0xe3, 0xe7, 0x21, 0x0c, 0x1d, 0x84,
+ 0xaf, 0xe0, 0xf1, 0x2a, 0x76, 0x1f, 0x9c, 0x93, 0xfc, 0x50, 0x5b, 0xea,
+ 0x73, 0x82, 0xa2, 0x96, 0xa1, 0x6e, 0x8b, 0xd3, 0xbe, 0x95, 0x5d, 0xd7,
+ 0x0a, 0xe4, 0xc4, 0xc6, 0x6b, 0x5f, 0xd3, 0xe9, 0x50, 0x7e, 0xc0, 0x5d,
+ 0x5b, 0xb6, 0x3e, 0x9c, 0xad, 0x74, 0x1b, 0xe1, 0xbf, 0xa3, 0x2c, 0x8e,
+ 0xb0, 0x99, 0x52, 0x5f, 0x51, 0x52, 0x68, 0x91, 0x96, 0x4c, 0xed, 0xd3,
+ 0x37, 0x7c, 0xb1, 0x8a, 0x75, 0xb7, 0xfc, 0xff, 0x1e, 0xfd, 0x60, 0xe0,
+ 0x09, 0x8b, 0xdb, 0x60, 0xa6, 0xde, 0x34, 0x1d, 0x9b, 0x0a, 0xf3, 0x49,
+ 0xd5, 0xf2, 0xbb, 0xa7, 0xee, 0xce, 0x2e, 0x45, 0xca, 0xc0, 0x5e, 0x95,
+ 0xfe, 0xb3, 0xc6, 0xc6, 0xde, 0x22, 0xfd, 0x91, 0x7a, 0x4a, 0x3c, 0x7d,
+ 0xec, 0xb0, 0x21, 0xd4, 0xb7, 0xd2, 0x42, 0x9b, 0x8b, 0xa8, 0x2f, 0x60,
+ 0xa2, 0x78, 0x03, 0x47, 0x8e, 0x01, 0x57, 0xe7, 0x7e, 0xf0, 0x91, 0xb5,
+ 0xfb, 0x86, 0xd4, 0xc1, 0x1c, 0xf6, 0xf9, 0x88, 0x30, 0xbb, 0x04, 0x4a,
+ 0x52, 0xfb, 0xd3, 0x08, 0x0a, 0xa8, 0x97, 0x2c, 0xad, 0xa5, 0xf2, 0xf4,
+ 0x63, 0x65, 0x17, 0x53, 0xa7, 0xeb, 0x6d, 0x93, 0xb8, 0xbc, 0x1d, 0xc9,
+ 0x17, 0x59, 0x7e, 0x3f, 0x7c, 0xf0, 0x27, 0x2e, 0xe8, 0xe4, 0x9e, 0x0c,
+ 0xcd, 0xe4, 0x9a, 0xbc, 0x7e, 0xcf, 0xf5, 0x46, 0xb7, 0x01, 0x3e, 0x73,
+ 0xd2, 0x32, 0x77, 0x1c, 0x97, 0x54, 0xe9, 0xdb, 0xc7, 0x20, 0xc1, 0xb7,
+ 0xc9, 0xd0, 0x55, 0x6f, 0xb9, 0x2e, 0x58, 0x63, 0xd6, 0xc0, 0x0c, 0x86,
+ 0xe8, 0xcf, 0x55, 0x02, 0xde, 0x2e, 0x8a, 0xe0, 0x26, 0x23, 0xd3, 0x43,
+ 0xb8, 0x78, 0x79, 0x16, 0x11, 0x0d, 0xc6, 0x17, 0x8b, 0x89, 0xf6, 0x4a,
+ 0xfd, 0xc1, 0xd7, 0x6b, 0x25, 0xa4, 0xde, 0x3d, 0xd4, 0xea, 0x08, 0x38,
+ 0xbb, 0x51, 0x6f, 0x4f, 0xb7, 0x74, 0xd9, 0x22, 0x63, 0x90, 0x79, 0x6b,
+ 0x7a, 0x4a, 0xde, 0x68, 0xb1, 0x75, 0x1c, 0x7e, 0xb5, 0xd4, 0x3a, 0x43,
+ 0xc2, 0xdb, 0x42, 0x53, 0x4f, 0xe4, 0xad, 0xfc, 0xdf, 0x56, 0xc6, 0xbb,
+ 0x5c, 0x5c, 0x2f, 0xaf, 0xdb, 0xed, 0xb3, 0x08, 0xd3, 0x75, 0x56, 0x9d,
+ 0xb1, 0x6c, 0x45, 0x55, 0x7e, 0x92, 0xd0, 0x17, 0xb8, 0x2a, 0x14, 0xd2,
+ 0x6d, 0x15, 0x91, 0xa0, 0x27, 0x55, 0x10, 0xf6, 0x90, 0xba, 0x26, 0x22,
+ 0x0c, 0x2a, 0xa3, 0xbf, 0xf3, 0xac, 0x6e, 0x0f, 0x3f, 0xfb, 0xa8, 0x3d,
+ 0x06, 0xb9, 0x32, 0x06, 0xb6, 0x9e, 0x84, 0x35, 0x91, 0xff, 0xe5, 0x4e,
+ 0x53, 0x1c, 0xe1, 0x43, 0x90, 0x7a, 0x61, 0x4d, 0x08, 0xf3, 0xae, 0xb5,
+ 0xde, 0x13, 0xb4, 0x6a, 0x11, 0x6d, 0xcc, 0x50, 0x99, 0xf7, 0xf7, 0x33,
+ 0xf9, 0x56, 0x64, 0x27, 0x71, 0x42, 0xc2, 0x21, 0x12, 0x76, 0x2a, 0xb0,
+ 0x12, 0xb1, 0x72, 0x28, 0xdb, 0xc3, 0xdf, 0x0a, 0x42, 0xf6, 0x40, 0xd8,
+ 0xbb, 0x34, 0x8c, 0x0f, 0xad, 0x17, 0xe7, 0xba, 0x22, 0x7f, 0x4e, 0x72,
+ 0xd2, 0x56, 0xbc, 0x93, 0x28, 0x3a, 0x37, 0x33, 0x8f, 0x22, 0xc0, 0x18,
+ 0x1e, 0x8b, 0x3f, 0xf7, 0x43, 0x89, 0x09, 0x1d, 0x6d, 0xba, 0xcb, 0x1d,
+ 0xee, 0x4d, 0x9f, 0x45, 0xbe, 0x24, 0x24, 0x86, 0xd3, 0x4c, 0xb3, 0xef,
+ 0x77, 0x5b, 0xa8, 0x66, 0xcb, 0x7a, 0x2f, 0x88, 0xd0, 0x98, 0xb4, 0x51,
+ 0x7e, 0x26, 0x6b, 0x50, 0x1d, 0xa9, 0xe4, 0xe4, 0x17, 0x90, 0xc2, 0x89,
+ 0x5b, 0xc5, 0xd5, 0x9f, 0x9b, 0x1d, 0x66, 0x0f, 0xec, 0x83, 0x91, 0x6e,
+ 0x6c, 0x20, 0x3f, 0x55, 0xea, 0xd7, 0x4e, 0x76, 0xc9, 0x55, 0xf1, 0xbc,
+ 0xbc, 0x9e, 0x9d, 0x3b, 0x63, 0x7c, 0x71, 0xbd, 0x6f, 0x2f, 0xfe, 0xe0,
+ 0x19, 0x8e, 0xef, 0xca, 0x19, 0x8b, 0xf7, 0x00, 0xa5, 0x08, 0x6a, 0xf1,
+ 0xaa, 0xf3, 0x4e, 0x78, 0x36, 0xbd, 0x8f, 0xdf, 0x36, 0x30, 0xe3, 0xd3,
+ 0xdb, 0x24, 0x21, 0x3c, 0xe3, 0x18, 0xb4, 0x0d, 0xc5, 0x04, 0x88, 0x48,
+ 0x82, 0xe3, 0x06, 0x45, 0xe1, 0x6f, 0xe5, 0x2d, 0x6c, 0x54, 0x65, 0x6c,
+ 0x61, 0xac, 0xf8, 0x96, 0x3c, 0xf9, 0x31, 0xa5, 0x78, 0xb1, 0xd3, 0x96,
+ 0x01, 0xf0, 0x14, 0xc2, 0xbb, 0xdd, 0x3e, 0x4f, 0x85, 0xb2, 0xa3, 0x81,
+ 0xff, 0x14, 0xf0, 0xec, 0x41, 0x4a, 0x5e, 0x63, 0x33, 0xd3, 0x9b, 0xce,
+ 0x9d, 0x26, 0x47, 0x17, 0x2e, 0x33, 0xfb, 0xb0, 0x72, 0x49, 0x42, 0x64,
+ 0xe2, 0xd9, 0x41, 0xc1, 0x3c, 0x4b, 0x7e, 0xe7, 0x39, 0xd6, 0x11, 0xc9,
+ 0x2b, 0x32, 0x6a, 0x39, 0xe8, 0x74, 0xf1, 0x40, 0x2f, 0xdf, 0x77, 0x19,
+ 0x32, 0x75, 0x79, 0xb2, 0x5e, 0x55, 0x40, 0xce, 0x39, 0x16, 0x3b, 0xf8,
+ 0x6d, 0x59, 0x7f, 0x2a, 0xa4, 0x00, 0xd7, 0x28, 0x98, 0x61, 0x77, 0xed,
+ 0xff, 0xd7, 0x24, 0xc7, 0x4a, 0x9c, 0xd2, 0x59, 0xaa, 0x30, 0x17, 0xdf,
+ 0x3c, 0xb9, 0x82, 0x27, 0xaf, 0x2d, 0xa3, 0x15, 0x52, 0xb7, 0x25, 0x83,
+ 0x60, 0xed, 0x37, 0xf1, 0x45, 0x4b, 0x9c, 0xf5, 0x09, 0xa9, 0x1b, 0xbc,
+ 0x13, 0x47, 0xd5, 0x8b, 0x03, 0xd3, 0x0d, 0x51, 0xb2, 0x62, 0x5b, 0x69,
+ 0x66, 0x8a, 0x7b, 0xfb, 0x43, 0x6b, 0x76, 0x88, 0x5b, 0x6e, 0x6e, 0x6b,
+ 0x2f, 0x4c, 0x95, 0x25, 0x2e, 0x6f, 0x55, 0xf8, 0x4c, 0xdb, 0x3f, 0x51,
+ 0x34, 0x78, 0x3c, 0xc7, 0x2a, 0x10, 0xa7, 0x1b, 0x28, 0x80, 0x56, 0xc9,
+ 0x0c, 0x03, 0xdd, 0xe7, 0x67, 0x44, 0xfe, 0x7f, 0xdc, 0xcd, 0x14, 0x15,
+ 0xcb, 0xe0, 0x74, 0x38, 0xc9, 0xc7, 0x1c, 0xe2, 0x9f, 0x81, 0xab, 0xfc,
+ 0x02, 0x4c, 0xb4, 0x6c, 0x86, 0x1d, 0x73, 0x4b, 0x77, 0x4e, 0x35, 0x78,
+ 0xb5, 0x68, 0x60, 0xc2, 0x62, 0xf0, 0xa5, 0xa3, 0x0b, 0xf1, 0xea, 0x33,
+ 0xea, 0x95, 0x24, 0x06, 0x6f, 0xca, 0x19, 0x32, 0xfa, 0xbe, 0xbe, 0x80,
+ 0xda, 0x43, 0xac, 0x51, 0xd1, 0xa8, 0xc1, 0x6e, 0xc6, 0xd8, 0xaf, 0xaa,
+ 0xde, 0x1c, 0xf4, 0xfb, 0x49, 0x2d, 0xea, 0xa6, 0x9d, 0x47, 0x92, 0x0b,
+ 0x6d, 0x9c, 0x75, 0xda, 0xd2, 0x6d, 0x64, 0xbd, 0x08, 0x13, 0x38, 0x3c,
+ 0xfd, 0x57, 0x5b, 0x0b, 0x05, 0xb4, 0x7c, 0x7a, 0x46, 0x5c, 0x6e, 0x24,
+ 0x7a, 0x96, 0xb1, 0x57, 0x4f, 0x62, 0x43, 0x00, 0x13, 0x6b, 0x9d, 0x30,
+ 0xa9, 0x35, 0x5a, 0x4a, 0xd0, 0x2a, 0xd1, 0xcf, 0xdd, 0xc8, 0x14, 0x41,
+ 0x7c, 0x78, 0xad, 0xf7, 0xa4, 0x5d, 0x32, 0x38, 0x6a, 0x41, 0xc9, 0xd2,
+ 0xe3, 0xc0, 0x9d, 0xf5, 0x84, 0x25, 0x2b, 0xfe, 0x09, 0x99, 0xdc, 0x82,
+ 0x55, 0x86, 0x2d, 0x08, 0x6a, 0xee, 0x1f, 0xb6, 0xa0, 0xb3, 0xfd, 0x3f,
+ 0x23, 0x0b, 0xa4, 0x30, 0x96, 0xa0, 0x70, 0xda, 0xd9, 0xda, 0xb6, 0xbf,
+ 0xa6, 0x19, 0x00, 0x06, 0xa4, 0x6c, 0xb5, 0xb0, 0x46, 0x71, 0x0d, 0x98,
+ 0x60, 0x85, 0xbd, 0x45, 0x84, 0x86, 0xc9, 0x18, 0x62, 0xed, 0x4d, 0x8a,
+ 0x23, 0x34, 0xd0, 0x00, 0xdc, 0x43, 0x7c, 0xa6, 0x94, 0x65, 0x58, 0x64,
+ 0x41, 0xa2, 0xd8, 0x40, 0xc0, 0x74, 0x90, 0x9b, 0xda, 0x0c, 0xdc, 0x94,
+ 0x7b, 0x4b, 0xd7, 0x6e, 0x42, 0xbe, 0x99, 0xac, 0x17, 0x58, 0x71, 0x03,
+ 0x88, 0x1f, 0xe3, 0xc9, 0xac, 0x69, 0x10, 0xf4, 0x2d, 0xf7, 0xd3, 0x9b,
+ 0xb5, 0xa4, 0xcd, 0xf7, 0xa2, 0xdc, 0x04, 0x82, 0x32, 0x12, 0x18, 0x83,
+ 0x35, 0xd3, 0x0e, 0xca, 0xa8, 0x6c, 0x5d, 0x5c, 0x78, 0xce, 0x4c, 0xa9,
+ 0x13, 0x8d, 0xce, 0x3f, 0xac, 0xc8, 0x00, 0x18, 0x9f, 0x34, 0xab, 0xc3,
+ 0x8e, 0xe3, 0x4d, 0x58, 0xbc, 0x79, 0xa2, 0x04, 0x97, 0x6c, 0x25, 0x38,
+ 0x9b, 0x45, 0x28, 0x39, 0x92, 0x57, 0x13, 0xac, 0x55, 0xb8, 0x63, 0x09,
+ 0xc1, 0x75, 0x61, 0x3a, 0x13, 0x20, 0xf4, 0x7c, 0x74, 0xa2, 0xcf, 0xc2,
+ 0x5d, 0x18, 0xe2, 0x91, 0x24, 0x4f, 0xa3, 0x6e, 0x0a, 0x70, 0x8d, 0x6f,
+ 0x8f, 0xd3, 0xa6, 0x2e, 0x32, 0x4c, 0x44, 0x40, 0xd0, 0xf1, 0xe2, 0xe9,
+ 0xb5, 0xf9, 0x14, 0xe5, 0x73, 0x4d, 0x80, 0xc4, 0x5c, 0xc0, 0x32, 0xd4,
+ 0xb1, 0x9a, 0xf6, 0x94, 0x3a, 0xc8, 0x04, 0x61, 0xb5, 0xb3, 0x5e, 0xbb,
+ 0x44, 0x8e, 0xdf, 0x4e, 0xb3, 0x2a, 0xad, 0xed, 0xdd, 0x9e, 0x71, 0xf6,
+ 0x48, 0x41, 0xb5, 0xdb, 0xf8, 0x81, 0x28, 0x81, 0x29, 0xf0, 0x8e, 0xb9,
+ 0xb7, 0xb3, 0x08, 0x60, 0x99, 0xb8, 0xef, 0x97, 0x8c, 0x9a, 0x65, 0x7a,
+ 0x3b, 0x13, 0x38, 0xbd, 0x07, 0x80, 0xc2, 0xba, 0x31, 0x4c, 0x56, 0x10,
+ 0x2f, 0x87, 0xbd, 0x9c, 0xb5, 0x13, 0x90, 0x83, 0x34, 0x2e, 0x65, 0xb4,
+ 0x0c, 0x84, 0xd1, 0x93, 0x4e, 0xaa, 0x26, 0x76, 0xf2, 0xc0, 0xdd, 0xe0,
+ 0x90, 0x16, 0x02, 0x1f, 0x3c, 0xbe, 0x51, 0xf6, 0xbf, 0xbc, 0xca, 0x22,
+ 0x46, 0xdb, 0x2b, 0xb9, 0x4f, 0x23, 0xe9, 0xee, 0x7c, 0x8f, 0x33, 0xab,
+ 0x4f, 0x98, 0xa8, 0xe5, 0x0e, 0xb9, 0x5a, 0x38, 0x9a, 0xae, 0xca, 0x9c,
+ 0xbe, 0x76, 0x28, 0xb6, 0xfd, 0x42, 0x14, 0x07, 0xbe, 0x2a, 0xdb, 0xab,
+ 0x0f, 0x03, 0x80, 0xfe, 0x78, 0x30, 0x5d, 0xea, 0x66, 0x19, 0xcf, 0x35,
+ 0x6d, 0x25, 0xe5, 0x55, 0xeb, 0x79, 0xd1, 0x2d, 0x97, 0x81, 0x7c, 0x15,
+ 0xfc, 0xfa, 0x5d, 0xbf, 0x85, 0xe0, 0x06, 0x4e, 0xf5, 0x36, 0xd6, 0x31,
+ 0x62, 0x11, 0x5f, 0xb8, 0x2b, 0x08, 0xdd, 0x50, 0x60, 0x91, 0x45, 0x0d,
+ 0xbd, 0xa7, 0x0a, 0x2a, 0xdf, 0x44, 0xa6, 0x07, 0xf4, 0x53, 0xe1, 0x40,
+ 0xa2, 0xcc, 0xa8, 0xa8, 0x86, 0x76, 0x64, 0xc8, 0xd8, 0x6c, 0x48, 0x0b,
+ 0x38, 0xbf, 0xe2, 0x13, 0xd0, 0xaa, 0xc4, 0xff, 0x83, 0xc0, 0x5e, 0xda,
+ 0x69, 0x38, 0xf3, 0x5b, 0xba, 0x82, 0x48, 0xa8, 0x28, 0x0d, 0xb2, 0xc6,
+ 0x77, 0xdc, 0x37, 0x8e, 0xb4, 0x94, 0x22, 0xa1, 0x42, 0xa9, 0xf3, 0x3e,
+ 0x3c, 0x1e, 0x75, 0x43, 0xdc, 0x0b, 0x9c, 0x77, 0x84, 0x2f, 0xf5, 0x27,
+ 0xd8, 0xcb, 0x0f, 0x5a, 0x87, 0x30, 0x52, 0x71, 0x71, 0xa0, 0x6d, 0xf3,
+ 0xaf, 0x2e, 0x68, 0xed, 0xa2, 0x6e, 0x10, 0x2c, 0xc6, 0xdb, 0xc0, 0x77,
+ 0x52, 0xbc, 0xe2, 0xa3, 0x69, 0x5f, 0x2f, 0x0f, 0x68, 0xd9, 0x2d, 0x29,
+ 0x3e, 0xf0, 0x83, 0x6f, 0x05, 0xca, 0xc9, 0x2a, 0x72, 0x86, 0x95, 0xbc,
+ 0xde, 0xab, 0x44, 0x7f, 0xbc, 0x2a, 0xad, 0xa8, 0x29, 0x03, 0x3e, 0xd4,
+ 0x0e, 0x3d, 0x2f, 0xde, 0x0e, 0xc4, 0xcf, 0x61, 0x47, 0xb7, 0x29, 0x77,
+ 0xd1, 0x58, 0x43, 0xf8, 0xa2, 0xaa, 0x1d, 0xb1, 0x8d, 0x6f, 0x31, 0xb3,
+ 0x5e, 0xab, 0x83, 0x55, 0xa2, 0xe0, 0xab, 0x60, 0x9e, 0x31, 0x0b, 0xf6,
+ 0x9c, 0x9e, 0x13, 0x4f, 0xe7, 0x26, 0xc3, 0x97, 0x89, 0xea, 0x60, 0x1d,
+ 0xeb, 0xd9, 0xfc, 0x11, 0xdf, 0xde, 0xe7, 0xd2, 0x3b, 0x65, 0xd8, 0x19,
+ 0x8e, 0xbd, 0x4d, 0xaf, 0xcc, 0xa5, 0x46, 0x02, 0x0c, 0xd7, 0x9f, 0x2f,
+ 0xf7, 0xf3, 0x38, 0xb5, 0x01, 0x56, 0xc4, 0xef, 0x0a, 0x19, 0xca, 0x28,
+ 0x1a, 0xc0, 0x1a, 0x55, 0x64, 0x81, 0x19, 0xf6, 0x52, 0xeb, 0xef, 0x70,
+ 0xa8, 0xfb, 0xa2, 0xb3, 0xae, 0x57, 0xd1, 0x4c, 0x3c, 0xc1, 0x82, 0x49,
+ 0x39, 0x04, 0x19, 0xdd, 0xab, 0xb6, 0x31, 0x7c, 0xde, 0x9d, 0xee, 0xc9,
+ 0xf6, 0xbd, 0x5c, 0xf4, 0xff, 0xfb, 0x5c, 0xf2, 0x02, 0x08, 0x41, 0x4f,
+ 0xff, 0xa9, 0xb2, 0x95, 0x0b, 0x01, 0xa9, 0x3c, 0xd3, 0x71, 0x48, 0xef,
+ 0xf1, 0x51, 0xea, 0xe8, 0xc1, 0xff, 0x62, 0xb2, 0x95, 0xc7, 0xd6, 0xc1,
+ 0xc7, 0xaa, 0xd6, 0x05, 0xd7, 0x64, 0xe7, 0x6e, 0x18, 0xbb, 0x51, 0xa2,
+ 0x7f, 0x19, 0x0f, 0x60, 0x2a, 0x3c, 0xf9, 0x70, 0xad, 0xb6, 0xe0, 0xa7,
+ 0xb1, 0x21, 0x9c, 0x45, 0xa9, 0x4f, 0x2b, 0xda, 0x53, 0x32, 0x07, 0x46,
+ 0x12, 0xb6, 0xf9, 0x97, 0x8a, 0x39, 0xc7, 0xc7, 0xb8, 0x19, 0xca, 0x18,
+ 0x74, 0xcc, 0x10, 0xef, 0x4d, 0x12, 0x90, 0xfd, 0xbb, 0xd8, 0x1b, 0x3d,
+ 0x31, 0x34, 0x79, 0x1d, 0x0b, 0x8c, 0x5e, 0xfd, 0x99, 0xbf, 0x78, 0x56,
+ 0x7b, 0x25, 0x24, 0x4f, 0x4b, 0xda, 0x8d, 0xbf, 0xd6, 0x5f, 0xb7, 0xfa,
+ 0x63, 0xf1, 0x99, 0xa7, 0x63, 0x39, 0x82, 0x1a, 0x79, 0x5b, 0x0c, 0xc4,
+ 0xcd, 0xfd, 0xfb, 0x66, 0xdc, 0xc7, 0x22, 0xa8, 0x44, 0x19, 0xc5, 0xf3,
+ 0xeb, 0x44, 0xbb, 0x98, 0xc0, 0x47, 0xc3, 0xa3, 0x0c, 0x12, 0x82, 0xd8,
+ 0x75, 0x66, 0x50, 0x1f, 0xae, 0xe0, 0x05, 0x5a, 0x42, 0x78, 0x9a, 0xbf,
+ 0x70, 0xd5, 0x20, 0xae, 0xb1, 0xf5, 0x91, 0xe4, 0x33, 0x46, 0x58, 0x6a,
+ 0xf8, 0x7c, 0xe5, 0x06, 0x98, 0xbc, 0xdb, 0xd6, 0xfd, 0xcb, 0xee, 0x6b,
+ 0x6b, 0x8b, 0xd4, 0x96, 0x25, 0xbd, 0xe8, 0x44, 0xb0, 0x62, 0xcb, 0xaf,
+ 0xad, 0x11, 0x55, 0xe7, 0x69, 0xe2, 0x6a, 0x78, 0x44, 0xe2, 0x93, 0xdc,
+ 0x0f, 0x4e, 0x63, 0x18, 0x69, 0xda, 0xe8, 0xcc, 0xae, 0x35, 0x20, 0x9a,
+ 0xd7, 0x49, 0xe7, 0xf0, 0xf7, 0x94, 0x10, 0xea, 0x0f, 0x2c, 0x4e, 0x1b,
+ 0xfe, 0x0d, 0xc5, 0xc1, 0x0f, 0x88, 0x84, 0x99, 0x34, 0x8d, 0xd8, 0x25,
+ 0xfa, 0x88, 0x84, 0x29, 0x98, 0xd1, 0x6d, 0x51, 0x70, 0xd5, 0x58, 0x7c,
+ 0x65, 0xd8, 0x0c, 0x53, 0xd5, 0x78, 0xb2, 0x7c, 0x0d, 0x60, 0x0a, 0x82,
+ 0x37, 0x20, 0x12, 0x9c, 0x37, 0x20, 0xca, 0xdc, 0xbd, 0xfd, 0xbf, 0xe8,
+ 0xdf, 0xe3, 0x16, 0x43, 0x4d, 0x1d, 0xb5, 0x3e, 0x75, 0x83, 0xfb, 0x43,
+ 0x78, 0x46, 0xe6, 0x9c, 0x00, 0x18, 0xde, 0xa6, 0xdc, 0xfa, 0x57, 0x3c,
+ 0x7b, 0x98, 0x0e, 0xc9, 0x39, 0x1e, 0x01, 0xc1, 0x7d, 0x5f, 0x29, 0x47,
+ 0x40, 0xf4, 0x1c, 0x56, 0x0f, 0x02, 0xc0, 0xa2, 0xde, 0x1a, 0x3c, 0x9f,
+ 0x64, 0x1a, 0x8c, 0x42, 0x16, 0x96, 0xb0, 0x30, 0x25, 0x99, 0xb5, 0xbf,
+ 0xf7, 0x4e, 0xce, 0x02, 0xd0, 0x54, 0x55, 0x29, 0xa3, 0xf6, 0xf0, 0x6d,
+ 0xc8, 0x10, 0x38, 0x96, 0x2d, 0xfa, 0x3e, 0x30, 0xae, 0xa0, 0xea, 0x0f,
+ 0x48, 0x73, 0x93, 0x69, 0x94, 0x4e, 0xe8, 0x44, 0xdc, 0x16, 0xe4, 0xad,
+ 0x9b, 0xa1, 0x38, 0x09, 0x82, 0x9d, 0x4b, 0x7c, 0xf5, 0x32, 0x95, 0x72,
+ 0x27, 0x43, 0x0e, 0x86, 0x00, 0x0e, 0x23, 0x94, 0x5c, 0x85, 0x66, 0xe3,
+ 0x39, 0x79, 0xa3, 0x70, 0xb5, 0x47, 0x94, 0x0e, 0x11, 0xbb, 0x6b, 0x51,
+ 0x4d, 0x91, 0xc6, 0xc8, 0x2d, 0xab, 0x4c, 0xfc, 0x52, 0x42, 0x99, 0x74,
+ 0x13, 0x86, 0xb2, 0x1f, 0x1c, 0x70, 0x71, 0x36, 0xbf, 0xa5, 0x92, 0x38,
+ 0xda, 0x33, 0x8e, 0x97, 0x89, 0xae, 0xf0, 0xd1, 0x06, 0x6f, 0x86, 0xc9,
+ 0x5d, 0x2a, 0xe7, 0x80, 0x04, 0x94, 0xdc, 0xdb, 0xd5, 0x5a, 0x6d, 0x0c,
+ 0xac, 0x84, 0x07, 0xfd, 0xcb, 0xf5, 0xa7, 0x7c, 0x96, 0xc5, 0x4b, 0xd6,
+ 0x00, 0x43, 0x9e, 0x34, 0x27, 0x56, 0x01, 0x18, 0x8e, 0x05, 0xe5, 0x20,
+ 0x38, 0xd0, 0x67, 0x44, 0xe0, 0xc5, 0x9f, 0x10, 0x48, 0x9d, 0x6a, 0xf5,
+ 0x79, 0x84, 0x83, 0x32, 0xc3, 0x61, 0xf5, 0x80, 0xd9, 0xbf, 0xfe, 0x7e,
+ 0xca, 0xcc, 0xad, 0x8d, 0x40, 0x58, 0x62, 0xc6, 0xe5, 0x24, 0x17, 0x75,
+ 0x58, 0x7d, 0x48, 0x85, 0xc9, 0xac, 0xc6, 0x1e, 0x36, 0x83, 0x76, 0xcf,
+ 0xc3, 0x9e, 0xb2, 0xd6, 0xc5, 0x76, 0x4e, 0x67, 0xfd, 0x24, 0xcd, 0xb6,
+ 0x7e, 0xf7, 0x92, 0x2a, 0x30, 0x9d, 0xfd, 0x36, 0x81, 0x9a, 0xe6, 0x25,
+ 0x31, 0x1f, 0xb8, 0x52, 0xb9, 0x7b, 0x56, 0xf5, 0xff, 0x9a, 0xdf, 0x5a,
+ 0x1a, 0xf8, 0xa1, 0x30, 0xc5, 0x8c, 0x0d, 0x3c, 0xc4, 0x5f, 0x33, 0xaf,
+ 0x36, 0xe3, 0x8e, 0x4e, 0x45, 0x22, 0xa4, 0xfa, 0x5f, 0x34, 0x7a, 0x42,
+ 0x50, 0x14, 0x23, 0xa2, 0x2f, 0xb6, 0xea, 0xc6, 0xe3, 0xd7, 0xa6, 0x73,
+ 0x83, 0xb3, 0xdc, 0xd6, 0x1b, 0x65, 0xa8, 0xae, 0xc6, 0xc2, 0xe6, 0x10,
+ 0xaf, 0x46, 0x5c, 0x8e, 0xbe, 0x88, 0x11, 0xae, 0x34, 0xe5, 0x95, 0xf0,
+ 0x49, 0x08, 0x1c, 0xfa, 0x30, 0xb6, 0x07, 0x4b, 0x71, 0x6e, 0x88, 0xaa,
+ 0xf2, 0xfe, 0xc1, 0x01, 0x42, 0xba, 0x38, 0x50, 0xb8, 0xdf, 0x14, 0x11,
+ 0x5f, 0xf8, 0x58, 0x19, 0x9d, 0x18, 0xa2, 0x0d, 0x0a, 0x7d, 0x3e, 0xed,
+ 0x84, 0xfa, 0xb4, 0x17, 0x78, 0x7f, 0xd3, 0x86, 0x0f, 0xd2, 0xa0, 0xbf,
+ 0xc6, 0xdf, 0xaa, 0xdc, 0x6c, 0xd0, 0x04, 0x84, 0x18, 0xe4, 0x0e, 0x2f,
+ 0x27, 0x50, 0x1f, 0xa0, 0xe4, 0x03, 0x65, 0xce, 0xd0, 0xdf, 0x42, 0x2b,
+ 0x69, 0x17, 0x9b, 0xa6, 0x27, 0xb7, 0xbc, 0x08, 0x26, 0xe5, 0x76, 0x82,
+ 0x69, 0x99, 0x7d, 0x7b, 0xc6, 0x4b, 0x61, 0xe5, 0xac, 0x21, 0x4b, 0xe1,
+ 0x7f, 0x05, 0x7a, 0x3f, 0xdb, 0x74, 0x21, 0x58, 0xe2, 0x49, 0x65, 0x6d,
+ 0xc6, 0xc0, 0x94, 0x15, 0x58, 0x90, 0x97, 0xc5, 0xe2, 0xaf, 0xe0, 0x2f,
+ 0x9d, 0xc5, 0xdb, 0xde, 0xc9, 0xbc, 0xc4, 0x11, 0xf3, 0xe4, 0x40, 0x2d,
+ 0xbe, 0x36, 0x59, 0x58, 0x0f, 0x10, 0x05, 0x6e, 0x8b, 0x12, 0x11, 0xfe,
+ 0xdb, 0x96, 0x9a, 0x2b, 0x9c, 0x72, 0xc3, 0xa4, 0xbd, 0xfa, 0x08, 0x83,
+ 0xed, 0x20, 0x2e, 0x0e, 0xd3, 0x80, 0x35, 0xb7, 0xda, 0xdd, 0xaa, 0xff,
+ 0xb1, 0x63, 0x67, 0x53, 0xf8, 0x6e, 0x75, 0x2f, 0x7d, 0x11, 0x1b, 0x4e,
+ 0xb8, 0x5e, 0x4f, 0xb3, 0x30, 0xc7, 0xfe, 0xc1, 0xa3, 0xc8, 0x3f, 0x3b,
+ 0x2d, 0x28, 0x92, 0xd0, 0xa8, 0x65, 0x5f, 0x1e, 0x4e, 0xf7, 0xf3, 0xe6,
+ 0x8f, 0x30, 0x7c, 0x55, 0x8a, 0x47, 0x4a, 0xb3, 0x86, 0xd5, 0x03, 0x5c,
+ 0x9b, 0x96, 0x54, 0xad, 0xee, 0x80, 0x7a, 0x76, 0xa6, 0x98, 0x65, 0x69,
+ 0xdf, 0x4f, 0x85, 0x63, 0xa4, 0xdf, 0xf1, 0xcc, 0x1a, 0x64, 0xa0, 0x8a,
+ 0x81, 0x09, 0x2c, 0xfd, 0x66, 0xc7, 0xb6, 0xd2, 0x41, 0x14, 0xeb, 0xad,
+ 0x25, 0xef, 0x72, 0xb1, 0xba, 0x69, 0xb1, 0x9b, 0x74, 0x8d, 0x00, 0xc6,
+ 0xd3, 0x10, 0x40, 0x8d, 0x7f, 0xf7, 0xdc, 0xf6, 0x29, 0x2d, 0xff, 0xe9,
+ 0xb5, 0x6a, 0x5d, 0x3b, 0x25, 0xb6, 0x24, 0xe1, 0x30, 0x97, 0xfc, 0xa4,
+ 0xf3, 0xf6, 0x2c, 0x7d, 0x47, 0x0a, 0xff, 0x20, 0x45, 0xd2, 0x58, 0x27,
+ 0x67, 0x53, 0x43, 0x2c, 0x58, 0xdd, 0x64, 0x5d, 0xb5, 0xd5, 0x47, 0x5a,
+ 0x9b, 0x6f, 0xb0, 0x9e, 0x33, 0x61, 0xa1, 0x15, 0xc8, 0x5b, 0x79, 0x16,
+ 0x79, 0x2c, 0x1a, 0xfd, 0x59, 0xf2, 0x7b, 0xd7, 0x8c, 0xa5, 0xf4, 0xbc,
+ 0x6b, 0x30, 0x7c, 0xe5, 0x70, 0xd0, 0x18, 0x6e, 0xf0, 0x5c, 0x67, 0x16,
+ 0xe1, 0x7e, 0xff, 0xc8, 0x2f, 0x11, 0x90, 0x7c, 0x1f, 0xf4, 0xd2, 0x21,
+ 0x0a, 0x74, 0x1a, 0x76, 0xb1, 0xad, 0xc3, 0xf8, 0x77, 0xff, 0xbb, 0x3a,
+ 0x89, 0x9a, 0xe6, 0x80, 0xed, 0xf4, 0x79, 0x5f, 0xa7, 0xef, 0xd8, 0x53,
+ 0x6e, 0x67, 0xce, 0xb6, 0xe4, 0x25, 0x2e, 0xf9, 0xaf, 0x60, 0x53, 0x95,
+ 0x31, 0xd8, 0x95, 0x9f, 0x4c, 0x9c, 0x2b, 0x55, 0x8b, 0x78, 0x0d, 0x17,
+ 0x96, 0xb0, 0xdf, 0xa3, 0x04, 0xa4, 0xc1, 0xe1, 0x4a, 0x0d, 0x9e, 0x4d,
+ 0xcb, 0x2d, 0x96, 0x83, 0xa9, 0xea, 0xd4, 0xcc, 0xf1, 0x78, 0x47, 0xed,
+ 0xb8, 0xbd, 0x29, 0x4c, 0x46, 0xc8, 0x68, 0x82, 0x6a, 0x17, 0xfa, 0x87,
+ 0x36, 0xf9, 0xe9, 0xa9, 0x52, 0xc3, 0x47, 0x7d, 0x3d, 0x69, 0xa3, 0x54,
+ 0xd8, 0x39, 0xd9, 0x57, 0x37, 0xa5, 0x6e, 0xbd, 0xb9, 0x08, 0x03, 0x52,
+ 0x84, 0xa5, 0xd4, 0x2d, 0x5c, 0xd1, 0xd2, 0x54, 0xad, 0xb5, 0xfa, 0x5a,
+ 0x6b, 0x69, 0xb6, 0xb0, 0x99, 0xaa, 0x73, 0xab, 0x6e, 0x24, 0xec, 0x63,
+ 0x6c, 0x3e, 0x33, 0x4b, 0x17, 0x1c, 0xd8, 0xac, 0xf9, 0x8d, 0xa7, 0xef,
+ 0xd2, 0x00, 0x8c, 0x84, 0xfa, 0x2d, 0x41, 0xce, 0xaf, 0x2b, 0x43, 0x49,
+ 0xa3, 0xae, 0xab, 0x81, 0xee, 0xc8, 0xf3, 0x02, 0xd7, 0x39, 0xdc, 0x43,
+ 0x68, 0xff, 0xf4, 0xba, 0xf0, 0xdd, 0x67, 0x6e, 0x4f, 0x50, 0x8c, 0xdb,
+ 0xb2, 0xb1, 0x9b, 0x7c, 0x45, 0xd4, 0x28, 0xc4, 0xff, 0x59, 0xe3, 0x6f,
+ 0x77, 0x2b, 0x1a, 0x69, 0xd6, 0x7f, 0xfe, 0x8d, 0x66, 0x3f, 0x83, 0x94,
+ 0xe5, 0xd9, 0x0d, 0x9a, 0xcb, 0x4e, 0x88, 0xb1, 0x22, 0xe0, 0xe3, 0xb2,
+ 0x3b, 0x26, 0x46, 0x1d, 0xb1, 0x19, 0x94, 0xc3, 0xf2, 0xcc, 0xcb, 0xa3,
+ 0xde, 0xb5, 0xee, 0xbf, 0x7a, 0x69, 0x59, 0xb7, 0x07, 0xb7, 0x79, 0x53,
+ 0x17, 0xb1, 0x63, 0xeb, 0xb9, 0x56, 0xe6, 0x08, 0x6c, 0x06, 0xa1, 0xec,
+ 0x9e, 0x48, 0x4e, 0xcb, 0xb2, 0xa2, 0xc7, 0x65, 0x87, 0x4d, 0x9d, 0x2a,
+ 0xfd, 0x27, 0xbf, 0x53, 0xca, 0xf4, 0x7f, 0x5d, 0xdf, 0x32, 0x0c, 0x55,
+ 0xe4, 0xff, 0xa3, 0x5f, 0xb2, 0xa4, 0xc4, 0x86, 0x16, 0x57, 0x79, 0xbb,
+ 0xb3, 0xf4, 0xb5, 0x32, 0x0b, 0x09, 0x02, 0x4b, 0x7c, 0x38, 0xa1, 0xc7,
+ 0x79, 0x19, 0x0b, 0xbb, 0x9b, 0xeb, 0xca, 0x86, 0x1c, 0x84, 0x43, 0x6e,
+ 0x02, 0x0e, 0x86, 0x20, 0xee, 0x47, 0x5d, 0x8c, 0xdd, 0xf9, 0x36, 0xf7,
+ 0x06, 0x97, 0x5c, 0x92, 0xe9, 0xe8, 0xb8, 0x5b, 0xf5, 0x99, 0x8c, 0x0d,
+ 0x54, 0x38, 0xcc, 0x73, 0xba, 0x99, 0xd1, 0x7b, 0x46, 0x4e, 0xfa, 0x10,
+ 0x43, 0x3d, 0x1f, 0xd8, 0xd2, 0x38, 0x87, 0x28, 0x85, 0x61, 0x38, 0x96,
+ 0xef, 0x6a, 0x48, 0xb0, 0x72, 0xb8, 0x6a, 0xcb, 0x91, 0xb6, 0x2d, 0x67,
+ 0x25, 0xbe, 0x64, 0x4d, 0xf4, 0x2e, 0x46, 0x2c, 0x68, 0x2c, 0xef, 0x8c,
+ 0x75, 0x9d, 0x6e, 0xde, 0xcd, 0xaa, 0xe3, 0x88, 0x2d, 0x98, 0x74, 0xae,
+ 0xa5, 0xbc, 0x0a, 0x80, 0x4b, 0x6b, 0x67, 0xfe, 0xc7, 0xcf, 0x8c, 0x4e,
+ 0x53, 0x4e, 0x52, 0xdf, 0x50, 0x79, 0x3a, 0x9e, 0xc6, 0xb6, 0x0c, 0x74,
+ 0xff, 0x18, 0xda, 0xb6, 0xc9, 0x40, 0x70, 0x27, 0xa8, 0x16, 0x70, 0x88,
+ 0x38, 0xb4, 0x0f, 0x6d, 0xf1, 0x5d, 0xe3, 0x1a, 0xeb, 0x27, 0x9a, 0x8b,
+ 0x39, 0xeb, 0xcf, 0xff, 0x7b, 0x66, 0xbe, 0x17, 0x53, 0xcb, 0x2f, 0x17,
+ 0xc3, 0xf3, 0x4b, 0x2b, 0xaf, 0x2c, 0x90, 0x32, 0x8a, 0x31, 0x49, 0x70,
+ 0x0a, 0xed, 0x7f, 0xad, 0xc6, 0xc9, 0xf4, 0x20, 0x4c, 0x08, 0x36, 0x17,
+ 0xbe, 0x97, 0x26, 0xff, 0x0d, 0x26, 0x5b, 0x76, 0x83, 0x79, 0x78, 0xa4,
+ 0x11, 0xf7, 0x90, 0xcf, 0x1c, 0x9d, 0xee, 0xa2, 0x1c, 0xc1, 0xc4, 0x57,
+ 0x9c, 0xb1, 0x1d, 0xc4, 0xfb, 0xf9, 0xa8, 0x87, 0x66, 0xe7, 0xa3, 0xf1,
+ 0xe1, 0x43, 0xb9, 0x16, 0x56, 0x7b, 0x52, 0x1d, 0xa0, 0xf4, 0x7b, 0xa9,
+ 0xee, 0x26, 0x16, 0x5a, 0x2f, 0xdb, 0xf9, 0x17, 0x30, 0x29, 0x47, 0xcc,
+ 0x98, 0x54, 0x8a, 0x74, 0xd8, 0x11, 0xab, 0xbc, 0x6b, 0xb3, 0x02, 0x55,
+ 0x8c, 0xe6, 0xf2, 0xa0, 0x41, 0xa3, 0xfb, 0xe8, 0x0d, 0xa9, 0x81, 0xea,
+ 0x50, 0x05, 0x4f, 0x56, 0x96, 0x18, 0x9a, 0x87, 0x98, 0x4e, 0xf3, 0x7d,
+ 0xbc, 0x37, 0x5d, 0xf6, 0xa1, 0x6c, 0x1b, 0x6c, 0x59, 0x75, 0x87, 0x41,
+ 0xb9, 0xa8, 0xe6, 0xff, 0xb9, 0x0a, 0x48, 0x38, 0x0c, 0x01, 0xe5, 0xf7,
+ 0xc5, 0x0d, 0x43, 0x76, 0xfc, 0xee, 0x89, 0xe5, 0xa1, 0x67, 0x01, 0x64,
+ 0x15, 0x45, 0x0e, 0xf5, 0x9c, 0xe7, 0xc4, 0x76, 0x4b, 0x3d, 0xc9, 0xd7,
+ 0x0e, 0x6c, 0x99, 0xa0, 0xd8, 0x50, 0x44, 0xdc, 0x3a, 0xcf, 0xf8, 0xbf,
+ 0x05, 0x33, 0x1c, 0xd2, 0xbd, 0xe0, 0x5f, 0xf5, 0x64, 0xb0, 0x6b, 0x94,
+ 0xec, 0x73, 0x06, 0xd7, 0x03, 0xef, 0xdf, 0xd0, 0xfe, 0x70, 0xf2, 0x23,
+ 0xb4, 0x47, 0xae, 0x6e, 0xcb, 0x23, 0xc4, 0x12, 0xe1, 0x72, 0xd0, 0xd0,
+ 0xa9, 0x67, 0x80, 0x4d, 0x8d, 0x8f, 0x92, 0x54, 0xce, 0xce, 0x81, 0xae,
+ 0x22, 0xf3, 0xaa, 0xec, 0x5f, 0x5b, 0xda, 0xed, 0xd5, 0xbc, 0x43, 0x1a,
+ 0x3d, 0xd0, 0x5f, 0xa2, 0xb8, 0x25, 0x6d, 0x1c, 0x21, 0x75, 0x32, 0xf7,
+ 0x35, 0x8f, 0xae, 0xc1, 0x1b, 0x6d, 0x50, 0xa0, 0x9b, 0xf9, 0x5e, 0xe6,
+ 0x2a, 0x08, 0xf7, 0x30, 0xac, 0xc4, 0xfb, 0x6b, 0x05, 0x48, 0x47, 0x3a,
+ 0x78, 0x0b, 0x36, 0x82, 0x89, 0xac, 0x91, 0x94, 0xd5, 0x87, 0xd8, 0x69,
+ 0x59, 0x7b, 0x6e, 0xb6, 0x60, 0xce, 0xa0, 0x56, 0x95, 0x74, 0x92, 0xb4,
+ 0x68, 0x4d, 0x04, 0x4b, 0xfe, 0xd7, 0xcf, 0x25, 0x68, 0x73, 0x7d, 0x6e,
+ 0xc7, 0xa1, 0x47, 0x5d, 0x95, 0xa1, 0x05, 0x06, 0x6d, 0xe4, 0x63, 0xdc,
+ 0x30, 0x7a, 0x19, 0xb3, 0xf2, 0x18, 0x32, 0xda, 0x09, 0xfb, 0x37, 0x96,
+ 0x7e, 0x5e, 0x1f, 0xf2, 0x43, 0xe5, 0xc0, 0xe1, 0xc0, 0xa2, 0x54, 0x49,
+ 0x2d, 0x3a, 0x91, 0x3c, 0x72, 0x90, 0xbf, 0x56, 0xc3, 0x00, 0x30, 0xcd,
+ 0xd0, 0x3c, 0x0d, 0xc3, 0xe7, 0x76, 0x79, 0xaa, 0x0a, 0xc4, 0x10, 0x1e,
+ 0x3d, 0x80, 0x6d, 0x8b, 0xfe, 0xc6, 0xed, 0x42, 0x37, 0x1d, 0x87, 0x4b,
+ 0x5d, 0x98, 0xe1, 0x1a, 0x1c, 0x08, 0x61, 0xc1, 0xe2, 0x2f, 0xaf, 0x8b,
+ 0xc2, 0x50, 0x72, 0xad, 0xe8, 0xe5, 0x56, 0x09, 0xb4, 0xce, 0xaf, 0xbc,
+ 0x96, 0x0b, 0xf5, 0x89, 0xdb, 0xc8, 0x71, 0x72, 0x80, 0x09, 0xcb, 0x3d,
+ 0x9b, 0xf5, 0x68, 0xbf, 0xfc, 0x90, 0x95, 0x8b, 0x82, 0x83, 0xce, 0x8a,
+ 0xc3, 0x52, 0x58, 0xfe, 0x45, 0x13, 0x76, 0x1c, 0x4b, 0xfc, 0xf7, 0xf1,
+ 0x1c, 0x51, 0xaa, 0x5c, 0x70, 0x92, 0xf9, 0x69, 0x47, 0x65, 0x72, 0xf1,
+ 0xa9, 0xf9, 0xc0, 0xb8, 0xe0, 0xca, 0xd9, 0x92, 0xc8, 0x92, 0x0e, 0x8c,
+ 0x3b, 0x70, 0x92, 0xa3, 0x71, 0xd3, 0xf5, 0x4c, 0x05, 0x95, 0x56, 0x98,
+ 0xac, 0x86, 0x93, 0x9a, 0xb6, 0xe4, 0x5a, 0x92, 0xa6, 0x70, 0xa4, 0x06,
+ 0x32, 0xc7, 0x67, 0x9d, 0xbd, 0xff, 0xa2, 0x94, 0x8d, 0xf2, 0xd7, 0xe4,
+ 0x00, 0x36, 0xa8, 0x6b, 0x12, 0x47, 0x8c, 0xb3, 0x48, 0x97, 0xbd, 0xe2,
+ 0x1f, 0x2f, 0xa1, 0x00, 0x41, 0xa5, 0x3f, 0xfc, 0xa1, 0xa2, 0xc7, 0x24,
+ 0x4b, 0xaf, 0xc8, 0x90, 0x0d, 0x51, 0x3a, 0x5b, 0x7e, 0xe5, 0xbf, 0xd0,
+ 0xc6, 0xb0, 0x20, 0x61, 0xdd, 0x09, 0x10, 0x48, 0x51, 0x3e, 0xdc, 0xb8,
+ 0x30, 0xba, 0x12, 0x31, 0x50, 0x75, 0x8e, 0xe3, 0x40, 0x5c, 0xa7, 0x14,
+ 0x6e, 0xa2, 0xce, 0x36, 0x83, 0x1d, 0xdf, 0xb8, 0xd4, 0xc7, 0x50, 0xb7,
+ 0xf8, 0x6a, 0x57, 0x37, 0x29, 0x93, 0x57, 0xc7, 0x75, 0x6f, 0x41, 0xf8,
+ 0x5f, 0xf3, 0x7d, 0x9d, 0x3d, 0x8c, 0xb6, 0xb4, 0x81, 0x08, 0xf3, 0x44,
+ 0xdd, 0x3f, 0x63, 0xa9, 0xcd, 0xa6, 0xd7, 0x21, 0xee, 0x2d, 0x41, 0xbd,
+ 0xa0, 0x83, 0x05, 0xbc, 0x1d, 0x92, 0xb4, 0x1d, 0x36, 0xfb, 0xef, 0x6c,
+ 0x9b, 0x68, 0x93, 0x52, 0x59, 0x16, 0x43, 0x14, 0x30, 0xc3, 0x8f, 0x9d,
+ 0x75, 0xd1, 0x3b, 0x19, 0xfd, 0x62, 0x81, 0xf3, 0x29, 0x8e, 0xe1, 0xf8,
+ 0xc1, 0xba, 0x9c, 0x66, 0x95, 0x93, 0x79, 0x34, 0x25, 0x1f, 0x03, 0xf1,
+ 0x06, 0x06, 0xfd, 0x1c, 0x17, 0x00, 0x8e, 0x21, 0x59, 0xae, 0xae, 0x71,
+ 0x80, 0xe9, 0xe5, 0x5d, 0x86, 0x2c, 0xce, 0xaa, 0x45, 0x7a, 0xdf, 0xe5,
+ 0x3f, 0xfb, 0xf0, 0x69, 0x6c, 0xcf, 0x30, 0x97, 0x5f, 0xe1, 0xb4, 0xe8,
+ 0x94, 0xf0, 0x1f, 0x70, 0x6e, 0x0a, 0x4c, 0xeb, 0x08, 0xdc, 0x6f, 0xd6,
+ 0xe7, 0x9c, 0x3c, 0x1b, 0x16, 0xa5, 0x02, 0xff, 0x26, 0x91, 0x99, 0x6d,
+ 0x1a, 0x17, 0x73, 0xfe, 0xa2, 0xdd, 0xf5, 0xf2, 0x42, 0xda, 0xa6, 0xe2,
+ 0x7a, 0x9f, 0xd3, 0x28, 0xc5, 0x0a, 0xa8, 0x1f, 0x45, 0x78, 0xe2, 0x1c,
+ 0x52, 0xdd, 0x9f, 0x72, 0xf5, 0x67, 0x83, 0x56, 0x0a, 0xc2, 0x11, 0x2a,
+ 0x92, 0x35, 0xb5, 0xc7, 0xdd, 0xbc, 0x5f, 0xd8, 0x3b, 0x95, 0xb0, 0x01,
+ 0xcd, 0x58, 0x4b, 0xd4, 0x7d, 0x0e, 0x5e, 0x91, 0xa7, 0x76, 0xdc, 0xc6,
+ 0xb9, 0x54, 0xa6, 0x45, 0xf4, 0xa2, 0xd3, 0x58, 0x35, 0x02, 0x3b, 0xa2,
+ 0x9b, 0x53, 0x5c, 0x31, 0xac, 0x1c, 0x91, 0x33, 0xf3, 0x8b, 0xb5, 0x2a,
+ 0x44, 0x1c, 0xd4, 0x4f, 0x64, 0xad, 0xda, 0x46, 0x9e, 0xba, 0x9a, 0x13,
+ 0xb6, 0xad, 0x81, 0x43, 0xdb, 0x1b, 0x91, 0xf6, 0x84, 0xec, 0xd0, 0x6b,
+ 0xcf, 0x06, 0xff, 0x08, 0xe5, 0x0b, 0x45, 0xa4, 0x5b, 0x44, 0x9b, 0xdc,
+ 0x3f, 0xb5, 0x4a, 0xb0, 0x12, 0x4f, 0xd7, 0xb0, 0xb0, 0x24, 0x07, 0xf9,
+ 0xf9, 0xc9, 0x16, 0x16, 0x58, 0x1b, 0x56, 0x66, 0x42, 0x3c, 0xee, 0x55,
+ 0xe0, 0xd5, 0xc6, 0xdb, 0xa5, 0x3b, 0x96, 0xff, 0x66, 0x19, 0xf8, 0xcd,
+ 0xd0, 0x7a, 0x28, 0xe2, 0x12, 0xb5, 0x6c, 0x6a, 0xdb, 0xc1, 0xd1, 0xf7,
+ 0x2d, 0x46, 0xe6, 0x57, 0x3e, 0x1b, 0x9e, 0xcd, 0x46, 0xe9, 0x59, 0xed,
+ 0x29, 0xc3, 0xfb, 0xf8, 0x9c, 0x97, 0xe2, 0x7e, 0xf3, 0x97, 0xef, 0x2d,
+ 0xc4, 0x65, 0x37, 0x38, 0x31, 0x62, 0xd7, 0x83, 0x20, 0xb3, 0xc8, 0xc1,
+ 0x38, 0xb3, 0x5e, 0x6a, 0x62, 0x90, 0x79, 0x81, 0x66, 0x39, 0x69, 0x23,
+ 0xed, 0x67, 0xdc, 0x28, 0x4d, 0x17, 0x5b, 0x50, 0xeb, 0xf8, 0x55, 0xd0,
+ 0x5d, 0x19, 0x39, 0x58, 0x3d, 0x2d, 0xfb, 0xc2, 0x37, 0x76, 0xe8, 0x94,
+ 0x65, 0xcc, 0x39, 0x5e, 0x50, 0xb2, 0xed, 0xa0, 0x1d, 0xdd, 0x0b, 0x3a,
+ 0x74, 0x24, 0xba, 0x17, 0x27, 0x4c, 0xf9, 0x1d, 0xae, 0xd1, 0x63, 0x37,
+ 0xcd, 0x07, 0x37, 0xcd, 0x89, 0xda, 0xa8, 0x3b, 0x21, 0xd1, 0x50, 0xd3,
+ 0xf6, 0x3b, 0x01, 0x03, 0xd2, 0x9e, 0xb8, 0x76, 0xe0, 0xeb, 0x43, 0xd4,
+ 0x6b, 0x22, 0x02, 0x16, 0x4b, 0x6c, 0x25, 0x65, 0x20, 0x86, 0x09, 0x61,
+ 0x73, 0xa3, 0x59, 0x12, 0x59, 0xf5, 0xe5, 0x4c, 0x14, 0xef, 0x9d, 0x3f,
+ 0xac, 0x5b, 0xad, 0x90, 0x0b, 0x85, 0x81, 0x7c, 0x63, 0x43, 0xc7, 0x28,
+ 0xe3, 0x9c, 0x04, 0xc5, 0x85, 0x45, 0xf0, 0x4a, 0x68, 0x76, 0x1c, 0x53,
+ 0xc4, 0xb4, 0xab, 0xde, 0x80, 0x96, 0x36, 0x6b, 0xd1, 0xfc, 0xa9, 0x38,
+ 0xc9, 0xf2, 0x72, 0x3c, 0x45, 0x37, 0xc7, 0xb2, 0xeb, 0xe2, 0x03, 0x34,
+ 0x76, 0x94, 0x2f, 0x69, 0x71, 0x41, 0xc8, 0x9e, 0x52, 0x7e, 0xf7, 0x5b,
+ 0x49, 0xd6, 0x77, 0x06, 0x7a, 0xd7, 0x04, 0x01, 0x46, 0x2e, 0x65, 0x10,
+ 0xd2, 0xee, 0x26, 0xdb, 0xb9, 0xf0, 0xbe, 0x5b, 0x92, 0x2d, 0xf6, 0x57,
+ 0xb2, 0x33, 0x25, 0x0a, 0xec, 0x45, 0xf6, 0xd4, 0xcb, 0x85, 0xe0, 0xc1,
+ 0x77, 0xe7, 0x7c, 0x02, 0x92, 0x98, 0xb1, 0x02, 0xd8, 0xcb, 0xe0, 0x38,
+ 0x50, 0xfc, 0x11, 0x2e, 0x8b, 0xc3, 0xdf, 0xa2, 0x91, 0x32, 0x07, 0xea,
+ 0x82, 0xc5, 0x4d, 0x67, 0x19, 0xe6, 0x45, 0x3f, 0xd0, 0xdc, 0x50, 0x87,
+ 0x9c, 0xdb, 0x25, 0x75, 0xd1, 0x47, 0x68, 0x60, 0xc0, 0x82, 0xd0, 0x23,
+ 0xbd, 0x48, 0x2e, 0x00, 0xc9, 0x8d, 0xfb, 0x92, 0x08, 0xda, 0xea, 0xfb,
+ 0x60, 0xb4, 0x7c, 0xb4, 0xe7, 0xec, 0x58, 0x76, 0x40, 0xa6, 0x6d, 0xe0,
+ 0x2e, 0x3c, 0xe0, 0xa8, 0x2b, 0x23, 0xbe, 0x67, 0x6b, 0x59, 0x1a, 0xa2,
+ 0x1d, 0x23, 0x05, 0xa2, 0xfa, 0x8c, 0x69, 0xbf, 0x80, 0x21, 0x43, 0x0c,
+ 0x85, 0x8a, 0x8f, 0x30, 0x99, 0x10, 0xf0, 0xc2, 0xf6, 0x8f, 0xfc, 0xaa,
+ 0x2f, 0x11, 0x9f, 0xea, 0xd0, 0xc2, 0xe3, 0xba, 0x05, 0x20, 0x2c, 0x3a,
+ 0x1b, 0xb0, 0xfb, 0x1e, 0x5f, 0x78, 0xac, 0xd5, 0xc4, 0x73, 0x26, 0x7a,
+ 0xa6, 0x6f, 0x56, 0xde, 0x5a, 0x63, 0x7d, 0xa2, 0x8e, 0x30, 0xd9, 0xaf,
+ 0x87, 0x54, 0xe6, 0xbd, 0x6a, 0x8c, 0x51, 0x32, 0x6f, 0x05, 0x83, 0xea,
+ 0x53, 0xc3, 0xba, 0xac, 0x4a, 0x2b, 0x87, 0x2e, 0x1f, 0x21, 0x77, 0x58,
+ 0x8b, 0x80, 0xe3, 0xff, 0x92, 0x41, 0x97, 0x0f, 0x76, 0x30, 0xe2, 0xe0,
+ 0x99, 0x90, 0xb2, 0xb1, 0x00, 0xb1, 0xaa, 0x79, 0x04, 0x4f, 0x34, 0xff,
+ 0x73, 0x35, 0x7f, 0x9d, 0x7d, 0x29, 0x1e, 0x45, 0x43, 0xb3, 0x46, 0xc6,
+ 0xa6, 0x39, 0xe1, 0x52, 0xe6, 0x8b, 0xd4, 0xa5, 0x71, 0x96, 0xd7, 0x0a,
+ 0x02, 0x23, 0xf8, 0xf3, 0x02, 0x03, 0x31, 0xe5, 0xa2, 0x81, 0x9b, 0xb0,
+ 0xb5, 0x12, 0x09, 0x6f, 0x30, 0x58, 0x2a, 0xeb, 0x3c, 0x03, 0x46, 0xe7,
+ 0x30, 0xb6, 0x21, 0x55, 0x30, 0x01, 0x0e, 0x94, 0xb9, 0x5f, 0xa6, 0x72,
+ 0xd1, 0xb3, 0x5e, 0xc4, 0xde, 0xf3, 0xbb, 0x95, 0x91, 0x19, 0x31, 0x82,
+ 0x7a, 0x63, 0xa1, 0xbf, 0xdf, 0x42, 0x2c, 0x90, 0x26, 0xad, 0xc9, 0xc8,
+ 0x78, 0x6d, 0x91, 0xdb, 0x34, 0x6e, 0x0b, 0x6f, 0x35, 0x7d, 0x6a, 0x2d,
+ 0x69, 0x11, 0x2f, 0x46, 0x64, 0x2f, 0xa8, 0xb6, 0xd6, 0xf0, 0x97, 0x8b,
+ 0x5c, 0x7d, 0xbb, 0x90, 0x10, 0xb8, 0x07, 0x26, 0xf9, 0x7e, 0xba, 0xf0,
+ 0xbf, 0x64, 0xf3, 0x6d, 0xa2, 0x14, 0xa3, 0xe6, 0x0e, 0x0b, 0xda, 0x64,
+ 0x26, 0x81, 0x64, 0x3b, 0xff, 0x82, 0x10, 0x0a, 0xc7, 0xac, 0xa7, 0x35,
+ 0x94, 0xd4, 0x31, 0x0b, 0x1d, 0x4e, 0x78, 0xc8, 0xf0, 0xef, 0xa8, 0x77,
+ 0xac, 0xcf, 0x11, 0x89, 0x93, 0x43, 0x4c, 0x18, 0x1f, 0xbc, 0x96, 0xe8,
+ 0x32, 0x19, 0xed, 0x48, 0x97, 0x98, 0x86, 0xb6, 0x6f, 0x33, 0x03, 0xda,
+ 0x53, 0xba, 0x68, 0x8c, 0xba, 0x99, 0xba, 0x78, 0xf3, 0x58, 0x10, 0x1b,
+ 0x4d, 0x93, 0x8a, 0x02, 0xcb, 0x73, 0x33, 0x79, 0x91, 0x2e, 0x83, 0xee,
+ 0xd7, 0x91, 0x83, 0x98, 0xdf, 0x3b, 0x50, 0x49, 0x4e, 0x83, 0x75, 0x34,
+ 0x27, 0x4d, 0x39, 0x65, 0x66, 0x95, 0x04, 0x5e, 0x97, 0x56, 0x9c, 0x5e,
+ 0xfd, 0x2a, 0x4d, 0xf6, 0x2d, 0xe2, 0x9b, 0xd3, 0xbf, 0xfb, 0x2c, 0x08,
+ 0x52, 0x3c, 0x76, 0x07, 0x58, 0x40, 0xb9, 0x51, 0x5c, 0x42, 0x52, 0x0d,
+ 0x62, 0xcc, 0x88, 0xf9, 0xc2, 0x26, 0x22, 0xb4, 0xd0, 0x91, 0x5f, 0x7d,
+ 0xe8, 0x9a, 0x0a, 0x86, 0x8e, 0xe9, 0xf6, 0x1d, 0xcd, 0x66, 0x83, 0xc0,
+ 0x13, 0xf6, 0x4d, 0xe3, 0xd2, 0xce, 0x8f, 0xa1, 0x0a, 0xc2, 0x14, 0x0e,
+ 0xb6, 0xb5, 0xb9, 0x93, 0x11, 0xd5, 0xa7, 0xa0, 0xb0, 0xb9, 0x8a, 0x93,
+ 0x46, 0xdd, 0xa2, 0xb3, 0x0e, 0x0b, 0x63, 0xf5, 0x93, 0x24, 0xc0, 0x76,
+ 0x30, 0x56, 0xe8, 0x4f, 0xb2, 0x0a, 0x67, 0x6e, 0x67, 0x16, 0x6c, 0x6a,
+ 0x52, 0x9a, 0xe2, 0x2d, 0xa9, 0xcf, 0xdf, 0x46, 0xf3, 0x99, 0xfd, 0xfd,
+ 0xdb, 0x2e, 0x87, 0x4d, 0x6e, 0x0f, 0xa6, 0x23, 0x4a, 0x36, 0x56, 0x11,
+ 0xcf, 0x1b, 0x8a, 0x67, 0x32, 0x75, 0x13, 0x85, 0x71, 0xec, 0x91, 0x43,
+ 0x16, 0x9a, 0xb4, 0x64, 0xf9, 0xf3, 0xd3, 0x0e, 0xa4, 0x2c, 0x15, 0x6f,
+ 0x4a, 0x49, 0x12, 0xed, 0x31, 0x2b, 0x47, 0xa2, 0x65, 0xa7, 0x04, 0xea,
+ 0x8d, 0xe3, 0x3f, 0xfd, 0x9a, 0x79, 0x8a, 0x99, 0x9c, 0xcf, 0xaf, 0xdb,
+ 0x5d, 0x62, 0xa8, 0x3e, 0x9d, 0x89, 0x8c, 0x91, 0xd9, 0x8b, 0xbe, 0x76,
+ 0xc8, 0xb9, 0x4f, 0x03, 0xa6, 0xe4, 0xa0, 0xc0, 0x85, 0x2c, 0xb3, 0xa8,
+ 0xdb, 0x67, 0xb4, 0x22, 0xc0, 0xe9, 0x3c, 0x87, 0x6a, 0x96, 0xd7, 0xb3,
+ 0xd8, 0xe9, 0xae, 0x69, 0x44, 0x49, 0xf3, 0x15, 0x21, 0x3a, 0x71, 0xb1,
+ 0xc0, 0xe8, 0x78, 0xb3, 0x76, 0xbf, 0x92, 0x41, 0x44, 0xd1, 0x58, 0x2a,
+ 0x2f, 0xe0, 0xff, 0xa9, 0x0a, 0xaa, 0xa9, 0x69, 0xa1, 0x58, 0xeb, 0x71,
+ 0x58, 0xc0, 0xd4, 0x4a, 0xa2, 0x32, 0x1c, 0x1b, 0x04, 0xea, 0x77, 0xb3,
+ 0xb4, 0x2c, 0xf3, 0x07, 0xb9, 0x1f, 0x8e, 0x4e, 0x1e, 0xe2, 0x26, 0xaf,
+ 0xe5, 0x64, 0xa2, 0x0d, 0xa0, 0x8d, 0xc9, 0xb0, 0xee, 0xf0, 0xbb, 0x4f,
+ 0x66, 0x6d, 0x48, 0xb9, 0x1b, 0xb6, 0x39, 0x95, 0xce, 0x54, 0x30, 0x18,
+ 0xf7, 0xfb, 0x98, 0x67, 0x1a, 0xf6, 0xb4, 0x17, 0x31, 0xd4, 0x88, 0xae,
+ 0x53, 0x49, 0x86, 0x80, 0x2e, 0x9c, 0x7b, 0x30, 0x1f, 0x6a, 0x3d, 0xc2,
+ 0xa4, 0x83, 0x30, 0x4a, 0x23, 0xd4, 0xa9, 0xb1, 0xeb, 0x37, 0xad, 0x09,
+ 0xfd, 0x2a, 0x07, 0xb3, 0xbc, 0x98, 0x39, 0xb4, 0x6c, 0x9d, 0x90, 0x69,
+ 0x8e, 0xd2, 0xd6, 0x5f, 0xbc, 0x0d, 0x29, 0x27, 0x12, 0xa6, 0x82, 0xc4,
+ 0x59, 0xac, 0x71, 0x95, 0xbd, 0xcc, 0x28, 0x82, 0x43, 0xab, 0xb8, 0x44,
+ 0xfe, 0xfe, 0x3b, 0x4c, 0x9a, 0x2e, 0x93, 0x37, 0xaf, 0xb4, 0xeb, 0x9f,
+ 0x58, 0xdd, 0x2b, 0x9f, 0xc4, 0xd4, 0x44, 0xad, 0xaf, 0x39, 0x49, 0xb7,
+ 0x43, 0x66, 0x5e, 0x4c, 0xe5, 0x3a, 0x65, 0xe1, 0xb7, 0xf8, 0xa8, 0xdd,
+ 0xf5, 0x6b, 0x37, 0x13, 0xb2, 0xba, 0x0f, 0x57, 0x66, 0x95, 0xf1, 0x4d,
+ 0x92, 0x52, 0x39, 0xde, 0x85, 0x41, 0xae, 0xc5, 0xe4, 0xa0, 0xa3, 0xab,
+ 0xd8, 0x25, 0xab, 0xe1, 0x2a, 0x91, 0x31, 0xbb, 0x41, 0x0e, 0xab, 0x52,
+ 0x6f, 0xf3, 0x58, 0xa7, 0xfc, 0x9f, 0x36, 0x3f, 0x43, 0x8b, 0xcd, 0x0a,
+ 0xa0, 0xe2, 0xb9, 0xcb, 0x18, 0x47, 0x83, 0x4a, 0x81, 0x6f, 0xe9, 0x56,
+ 0xcf, 0x2b, 0xad, 0x48, 0x76, 0xe4, 0xba, 0x03, 0xb0, 0x2b, 0x2d, 0x7d,
+ 0xd6, 0x3c, 0xec, 0xcb, 0xb7, 0x23, 0x16, 0xbc, 0x2c, 0x2f, 0x90, 0xff,
+ 0xa5, 0x7a, 0xe5, 0x9a, 0xf7, 0xc3, 0x60, 0xd9, 0x91, 0x5a, 0x99, 0x2b,
+ 0x3f, 0xe7, 0xfa, 0x90, 0xd6, 0x3a, 0xf7, 0x1a, 0x73, 0xe5, 0x36, 0x02,
+ 0xec, 0xf4, 0x18, 0x41, 0xde, 0x90, 0x4c, 0xb5, 0xd9, 0xe3, 0x9c, 0x38,
+ 0xb7, 0x73, 0xc7, 0x05, 0x5e, 0xd8, 0xc0, 0x1a, 0xd9, 0x44, 0xa9, 0x9e,
+ 0x20, 0x0d, 0xbd, 0x12, 0xe5, 0xcb, 0x18, 0xcc, 0xaf, 0x05, 0xcc, 0xbb,
+ 0x60, 0x56, 0xbe, 0x38, 0xfa, 0x18, 0x2c, 0xf9, 0x76, 0x81, 0x2f, 0x88,
+ 0xc5, 0xf6, 0xdb, 0x37, 0xd4, 0x55, 0x00, 0x30, 0x9b, 0x84, 0xef, 0xdd,
+ 0xba, 0x75, 0xe2, 0x52, 0xb2, 0x23, 0xa7, 0xc8, 0x0e, 0xcf, 0xe8, 0x7f,
+ 0xbb, 0xda, 0xdb, 0x27, 0xf8, 0xcf, 0x9f, 0xe4, 0x3c, 0xd7, 0xc8, 0x0c,
+ 0x7a, 0x99, 0x08, 0x02, 0xa2, 0xe0, 0xa8, 0x43, 0x70, 0xcd, 0x7f, 0x79,
+ 0x6f, 0x25, 0x2b, 0x47, 0x6c, 0xe3, 0x8f, 0xa1, 0x6a, 0x1c, 0x7c, 0x6a,
+ 0x77, 0x92, 0xd2, 0x01, 0x5c, 0xa9, 0xb3, 0xd2, 0x1f, 0x26, 0xba, 0xb8,
+ 0x94, 0x59, 0xf9, 0x50, 0x0c, 0xc3, 0x72, 0xe8, 0x7a, 0x8b, 0x51, 0x85,
+ 0x4b, 0xf7, 0xa8, 0x3e, 0x9d, 0x52, 0x4f, 0xb1, 0xa8, 0x90, 0x59, 0x2c,
+ 0x2f, 0xac, 0xed, 0xbf, 0x22, 0xf0, 0x38, 0x35, 0x03, 0xb3, 0xbb, 0x0e,
+ 0xc8, 0x61, 0xf2, 0x60, 0x5e, 0xe1, 0xdb, 0xd3, 0x7b, 0x88, 0x5e, 0x54,
+ 0x9d, 0xe8, 0xc3, 0xdc, 0xcd, 0x48, 0x54, 0x3a, 0x96, 0xd3, 0xda, 0x72,
+ 0xe2, 0x96, 0xb6, 0x50, 0xb1, 0xe6, 0x28, 0x5f, 0xf3, 0x1a, 0x6b, 0x7c,
+ 0x29, 0x8e, 0x12, 0x00, 0x10, 0x50, 0xe3, 0x08, 0x3f, 0x3e, 0x19, 0xf5,
+ 0xf7, 0xc5, 0x1a, 0xa4, 0x44, 0x48, 0xfc, 0xa9, 0x39, 0x10, 0xcb, 0x4c,
+ 0xa2, 0xcb, 0x60, 0xf5, 0xf8, 0x4b, 0xfb, 0xe4, 0x5d, 0xf3, 0x87, 0x92,
+ 0x62, 0xee, 0x66, 0x91, 0x0e, 0x3d, 0x5d, 0xe4, 0x2c, 0x58, 0xe5, 0xce,
+ 0x8e, 0x52, 0xe5, 0x6e, 0xad, 0xf5, 0xc8, 0x54, 0x1c, 0x33, 0x38, 0xfa,
+ 0x2b, 0x06, 0x4d, 0xde, 0x3b, 0xbe, 0x16, 0xf6, 0x42, 0x44, 0x57, 0xc6,
+ 0x74, 0xe1, 0xcd, 0xa7, 0x09, 0x30, 0x88, 0x80, 0xd5, 0x60, 0xe9, 0x39,
+ 0x95, 0x29, 0x8f, 0xe5, 0x67, 0x59, 0x23, 0xcc, 0x44, 0xe2, 0x43, 0x77,
+ 0xa2, 0x9f, 0xc0, 0xab, 0xe9, 0x6e, 0xc0, 0x97, 0x6c, 0xd8, 0xa0, 0x6b,
+ 0xc9, 0x3d, 0xb6, 0xf9, 0x4d, 0x34, 0xad, 0xe0, 0x18, 0xe7, 0xe3, 0xc7,
+ 0xa3, 0x57, 0xd0, 0x93, 0x1b, 0xfc, 0x5a, 0x9c, 0xa2, 0x7c, 0xf8, 0x40,
+ 0x53, 0xa4, 0xb2, 0xa4, 0x18, 0x4f, 0x67, 0xf7, 0x2e, 0xe2, 0x43, 0x5b,
+ 0x30, 0xfe, 0x18, 0x52, 0xc5, 0x38, 0xfa, 0xe0, 0x9a, 0x48, 0x66, 0x32,
+ 0x66, 0x4d, 0x09, 0xa5, 0x64, 0x3d, 0xed, 0x4f, 0x50, 0xb9, 0x09, 0xca,
+ 0x46, 0xe8, 0x9e, 0x72, 0x95, 0xe5, 0x6f, 0x26, 0x5c, 0x36, 0x0f, 0xcf,
+ 0x8e, 0x06, 0x6d, 0x9b, 0xc0, 0xf0, 0x56, 0x6f, 0xbd, 0x4b, 0x01, 0xba,
+ 0x33, 0x33, 0x86, 0xb9, 0xa4, 0xd6, 0xcd, 0xe0, 0x19, 0x00, 0x17, 0xf0,
+ 0xdb, 0x6e, 0x94, 0x6d, 0x00, 0x1b, 0x0e, 0x8f, 0x9b, 0x24, 0x00, 0x69,
+ 0x25, 0x6e, 0xc8, 0x3f, 0xd2, 0x0e, 0x4b, 0x66, 0x72, 0x25, 0x75, 0x3a,
+ 0xe0, 0x44, 0x5c, 0xad, 0x7c, 0x00, 0xde, 0xdb, 0x2b, 0xcf, 0xc5, 0x36,
+ 0x98, 0xa3, 0x6f, 0x31, 0xeb, 0x3d, 0x57, 0x72, 0x71, 0xdc, 0xc3, 0x37,
+ 0x49, 0x9b, 0x01, 0x06, 0xb9, 0x89, 0x0f, 0x7f, 0x7b, 0x04, 0x66, 0x26,
+ 0x41, 0xdd, 0xb2, 0x74, 0xca, 0xed, 0xef, 0xc2, 0x35, 0xe8, 0x78, 0x49,
+ 0x00, 0x47, 0x9a, 0x4a, 0x58, 0x1c, 0xcd, 0xd3, 0x0f, 0x99, 0xeb, 0x8d,
+ 0x2e, 0xab, 0x73, 0x47, 0x39, 0xaf, 0x6c, 0x89, 0x28, 0xbc, 0x2e, 0x4c,
+ 0x44, 0x9e, 0x6d, 0x9e, 0x43, 0xe1, 0x43, 0x2f, 0x3c, 0x6d, 0x4b, 0xe5,
+ 0xef, 0xfa, 0x14, 0xb5, 0x55, 0xcf, 0x03, 0x96, 0xaf, 0x2c, 0x2b, 0xf3,
+ 0x43, 0x84, 0xbb, 0x53, 0x44, 0xb7, 0x42, 0x5f, 0x37, 0xf1, 0x60, 0xbb,
+ 0xb4, 0xd6, 0x5e, 0x6e, 0xc9, 0x71, 0x98, 0xa0, 0xe7, 0x5a, 0xe3, 0x3e,
+ 0x5b, 0x55, 0xff, 0x17, 0x2e, 0x21, 0xdd, 0x79, 0x28, 0xfd, 0x8e, 0x34,
+ 0xd8, 0xe9, 0x35, 0x3e, 0x88, 0x60, 0x1a, 0x89, 0x0b, 0x0d, 0xb5, 0xb6,
+ 0xd8, 0x58, 0x17, 0xd2, 0x66, 0xe6, 0xe2, 0x3d, 0x71, 0x67, 0xfd, 0x26,
+ 0x73, 0x71, 0x83, 0xb7, 0x76, 0x4b, 0x1e, 0x9f, 0x9c, 0x88, 0x5a, 0x5e,
+ 0x8c, 0x19, 0x9a, 0x7b, 0xbd, 0x6e, 0x23, 0x3e, 0x62, 0x9c, 0xac, 0x64,
+ 0xd1, 0x0b, 0x74, 0xb2, 0xac, 0xa4, 0xc9, 0x12, 0xdf, 0x2a, 0xd2, 0xa2,
+ 0xef, 0x7c, 0x98, 0x1b, 0x33, 0x13, 0xa4, 0xb2, 0x5b, 0x8b, 0xbb, 0x97,
+ 0x89, 0x73, 0x12, 0x6f, 0xee, 0xd9, 0xd2, 0x19, 0xdc, 0x59, 0x28, 0xe6,
+ 0xe1, 0x45, 0x8c, 0x53, 0x39, 0xec, 0x01, 0xd8, 0x30, 0x69, 0x12, 0x8b,
+ 0x06, 0x10, 0x9c, 0x5c, 0x76, 0x6b, 0x5d, 0x5c, 0xce, 0xa5, 0x3e, 0x19,
+ 0xfb, 0x9e, 0x39, 0x51, 0xfc, 0xab, 0x9a, 0x16, 0xd0, 0xa6, 0xb0, 0x7a,
+ 0xa6, 0x8f, 0x56, 0x70, 0x13, 0x16, 0x33, 0xf5, 0x2f, 0xee, 0xbe, 0x2f,
+ 0x0d, 0xd4, 0x9b, 0xaa, 0xe7, 0x5d, 0x8b, 0x2a, 0xa4, 0x34, 0xa2, 0x14,
+ 0xd6, 0xde, 0x4c, 0x87, 0x30, 0x49, 0x33, 0xb9, 0xf9, 0x6c, 0x64, 0xf7,
+ 0x92, 0x58, 0xe9, 0x40, 0x2f, 0x3d, 0x84, 0x85, 0x1a, 0xb8, 0xad, 0xc6,
+ 0xe8, 0x15, 0x60, 0xd0, 0x91, 0x16, 0x47, 0x1b, 0xc2, 0xef, 0x73, 0xfa,
+ 0xfe, 0x7d, 0x17, 0x69, 0xd0, 0x65, 0x63, 0x3d, 0x92, 0x97, 0x6a, 0xa6,
+ 0x4b, 0xf3, 0xc4, 0x3d, 0x4d, 0x52, 0x2a, 0x03, 0xf5, 0x7e, 0x75, 0x30,
+ 0xb7, 0xf5, 0xf3, 0xac, 0xc7, 0x3a, 0x17, 0x8e, 0x30, 0xfe, 0x12, 0x6d,
+ 0xce, 0xcf, 0x53, 0x2d, 0xb6, 0x22, 0xa7, 0x05, 0xcc, 0x81, 0x29, 0xec,
+ 0xd1, 0xfd, 0x9e, 0xde, 0xfa, 0x2d, 0xc9, 0x15, 0x18, 0x33, 0x46, 0xac,
+ 0xed, 0x01, 0xbd, 0x0a, 0xa0, 0x54, 0x01, 0xa0, 0xa2, 0xe4, 0xc9, 0x13,
+ 0xa6, 0x7e, 0xa3, 0x7d, 0x8f, 0x0a, 0x68, 0xc8, 0x4c, 0xaf, 0x80, 0x5c,
+ 0x11, 0xb1, 0x40, 0x99, 0xaa, 0x29, 0x74, 0x44, 0x1d, 0xff, 0xf7, 0x26,
+ 0xad, 0xbf, 0x8a, 0x8a, 0x24, 0x72, 0x39, 0x59, 0x04, 0x27, 0x19, 0xf1,
+ 0x2d, 0x8a, 0xc8, 0x1f, 0x11, 0x1d, 0x55, 0x63, 0x7c, 0x8f, 0x47, 0x8a,
+ 0x60, 0x4a, 0x3a, 0x1c, 0xb7, 0xf0, 0xb6, 0x56, 0x3f, 0xad, 0xe1, 0x0d,
+ 0xd1, 0xe2, 0x70, 0x67, 0x88, 0xc9, 0x77, 0x25, 0x39, 0x1d, 0x89, 0x34,
+ 0x53, 0xe3, 0x1b, 0x82, 0x9d, 0x72, 0xc6, 0x37, 0xec, 0xb4, 0x50, 0x04,
+ 0x49, 0x13, 0x34, 0x16, 0x0b, 0x8e, 0x9f, 0xc9, 0xf9, 0xec, 0x02, 0xc2,
+ 0x23, 0x49, 0x92, 0x98, 0x43, 0x0d, 0x63, 0x00, 0x00, 0x00, 0x4a, 0xa0,
+ 0x7f, 0xec, 0x15, 0xdb, 0xff, 0xda, 0xbf, 0xb1, 0xa2, 0xe7, 0x17, 0x57,
+ 0xf6, 0xb0, 0x7c, 0xb7, 0x23, 0x2f, 0x0a, 0x01, 0x17, 0xfa, 0xde, 0x3d,
+ 0x82, 0x6e, 0x61, 0x16, 0xaf, 0x7b, 0xd8, 0x48, 0xfb, 0x43, 0x4d, 0xa0,
+ 0xcf, 0xff, 0x7e, 0x7b, 0xca, 0x17, 0x0c, 0xf1, 0x7b, 0xb9, 0xb4, 0xb8,
+ 0x68, 0xf5, 0x86, 0x1d, 0xcc, 0xfd, 0xec, 0xbc, 0x71, 0xd9, 0xf5, 0x77,
+ 0x7d, 0x07, 0xe9, 0x3f, 0xf6, 0x64, 0x84, 0xbd, 0xe1, 0x05, 0x95, 0x37,
+ 0x19, 0x6f, 0xc9, 0xdd, 0x9e, 0x52, 0xbf, 0xe7, 0xb9, 0x6f, 0xd7, 0x0a,
+ 0x3e, 0xc4, 0xba, 0x7a, 0xeb, 0x14, 0x3d, 0xc2, 0x25, 0x62, 0x2f, 0x1f,
+ 0x5c, 0xbd, 0x82, 0x23, 0xa7, 0x37, 0xe0, 0x39, 0xae, 0xae, 0x9d, 0x37,
+ 0x71, 0x3b, 0xa6, 0xb0, 0x37, 0x26, 0x64, 0x40, 0x01, 0x3a, 0x0d, 0x77,
+ 0xe2, 0x84, 0xd4, 0x06, 0xd0, 0x4b, 0x9b, 0x0d, 0xef, 0x71, 0x91, 0xb6,
+ 0x69, 0xab, 0xe1, 0x7e, 0xdc, 0x94, 0x53, 0xef, 0x25, 0xad, 0x9c, 0x3b,
+ 0x95, 0x4c, 0xa7, 0x3c, 0xf2, 0xf3, 0x1a, 0x03, 0xbe, 0x87, 0xf7, 0x4d,
+ 0x68, 0xad, 0x54, 0x3f, 0x7d, 0x23, 0xcd, 0xa1, 0x3a, 0xc0, 0xee, 0x97,
+ 0x05, 0x22, 0xc4, 0xdd, 0x60, 0x17, 0x63, 0x11, 0x3a, 0xdb, 0x73, 0x6f,
+ 0xdd, 0x07, 0xd9, 0x43, 0x3f, 0xea, 0x26, 0x96, 0xfa, 0x12, 0x7f, 0x3d,
+ 0xd6, 0xed, 0xac, 0x20, 0x23, 0x24, 0xcf, 0x8e, 0x88, 0x3d, 0x75, 0xe7,
+ 0x2c, 0xa3, 0xdb, 0x1e, 0x82, 0xd8, 0xf0, 0x3a, 0x20, 0x56, 0xf8, 0x84,
+ 0x89, 0xe7, 0xf9, 0x88, 0x1b, 0x69, 0xd3, 0xf7, 0xa5, 0x79, 0x80, 0xc8,
+ 0x7b, 0xe4, 0x92, 0x30, 0x51, 0x49, 0x1c, 0x3e, 0x64, 0xc2, 0x7b, 0x51,
+ 0x9c, 0x50, 0x63, 0x20, 0x70, 0xec, 0x78, 0xbe, 0xe6, 0x83, 0xab, 0x49,
+ 0xf9, 0xa8, 0x28, 0x01, 0x35, 0x36, 0xf9, 0xee, 0xf4, 0x55, 0x88, 0x65,
+ 0xa8, 0xdb, 0x0c, 0x23, 0xa8, 0xeb, 0x96, 0x25, 0x49, 0x5a, 0x3d, 0xf2,
+ 0x82, 0xea, 0xc6, 0xca, 0xca, 0xc7, 0x2a, 0x5c, 0xc6, 0xfc, 0x5f, 0x5d,
+ 0xab, 0x87, 0xf6, 0xb9, 0xae, 0x41, 0x34, 0x2e, 0x90, 0x26, 0x9f, 0xff,
+ 0x12, 0x47, 0xb8, 0x6a, 0x03, 0x7e, 0x54, 0x65, 0xde, 0xca, 0x5f, 0xf3,
+ 0xcf, 0x7a, 0x86, 0x11, 0x28, 0xac, 0x84, 0x3a, 0xd4, 0x65, 0x97, 0xe2,
+ 0xc5, 0xe4, 0x63, 0x69, 0xa8, 0x04, 0xae, 0x53, 0xc6, 0xba, 0x4e, 0xc7,
+ 0x55, 0x27, 0x3e, 0xa4, 0x02, 0x2a, 0x45, 0x51, 0xc7, 0x1f, 0xc8, 0x0d,
+ 0x15, 0x07, 0x1b, 0x4d, 0x01, 0x91, 0xbe, 0x30, 0xf6, 0xa3, 0x6e, 0x68,
+ 0x95, 0xad, 0x16, 0x58, 0xbb, 0x44, 0x55, 0x3b, 0xc3, 0xb2, 0x87, 0x36,
+ 0x93, 0x1e, 0xa4, 0xa3, 0xef, 0x5d, 0xc2, 0xcc, 0xab, 0x98, 0xfb, 0x71,
+ 0xf3, 0xdf, 0x36, 0x64, 0x4c, 0xc6, 0xa8, 0xb3, 0x09, 0x26, 0x30, 0xce,
+ 0x96, 0x7d, 0x3b, 0xee, 0x4d, 0x04, 0xc6, 0x74, 0x54, 0xc9, 0xa6, 0x2e,
+ 0x38, 0xd7, 0x0d, 0xc8, 0xb8, 0xe7, 0xf6, 0xd1, 0xf6, 0x0b, 0xf4, 0x7f,
+ 0xe2, 0xbf, 0xa4, 0xfa, 0x28, 0xeb, 0xd6, 0x6d, 0x3a, 0xc2, 0x8f, 0xf0,
+ 0x50, 0x80, 0xab, 0xbb, 0x07, 0x29, 0xdd, 0x7b, 0x06, 0xe0, 0x0c, 0x7e,
+ 0x4a, 0x5d, 0x9b, 0xe6, 0x35, 0xb5, 0x6d, 0x27, 0x9a, 0x28, 0x3a, 0xf2,
+ 0xc0, 0x2f, 0x23, 0x8e, 0x48, 0x46, 0x39, 0x7d, 0xc4, 0x03, 0x9c, 0x02,
+ 0xd0, 0x68, 0x04, 0x26, 0x02, 0x14, 0xc7, 0x2e, 0x75, 0xa6, 0xac, 0x1e,
+ 0x72, 0x05, 0x3a, 0xbb, 0x9b, 0x41, 0x7a, 0x00, 0x3a, 0x5e, 0xd8, 0x97,
+ 0xef, 0xea, 0x62, 0x49, 0x4d, 0xc8, 0x71, 0x4a, 0x0c, 0x5d, 0x00, 0x68,
+ 0xa8, 0x72, 0x03, 0xe3, 0xed, 0x74, 0xbc, 0x66, 0xd5, 0x37, 0xab, 0x86,
+ 0x77, 0x49, 0xb1, 0x42, 0x14, 0x3e, 0x2a, 0xc8, 0xbd, 0x71, 0x38, 0xef,
+ 0x7f, 0x64, 0xfa, 0x46, 0xb2, 0xd4, 0xbb, 0x0d, 0x05, 0xd1, 0xb4, 0xa1,
+ 0x29, 0xb7, 0x50, 0x4c, 0x67, 0x3a, 0x39, 0x38, 0x9f, 0xca, 0x5a, 0x82,
+ 0x2f, 0xc8, 0x57, 0xe4, 0x66, 0x82, 0x60, 0x40, 0xb1, 0x3b, 0xca, 0x75,
+ 0xdd, 0x8e, 0x61, 0x05, 0x3f, 0xd5, 0x10, 0xdf, 0x50, 0x10, 0x3e, 0x01,
+ 0x8a, 0x5a, 0xaa, 0x9a, 0xb7, 0x62, 0xaf, 0x41, 0x36, 0xa5, 0x02, 0x2a,
+ 0xb7, 0x3f, 0x11, 0x8b, 0x0a, 0x68, 0x97, 0x22, 0x8b, 0xd2, 0x58, 0x54,
+ 0xba, 0x52, 0xcd, 0x03, 0x3d, 0xb1, 0x9a, 0x45, 0xa5, 0xc4, 0xc3, 0xfe,
+ 0x9b, 0x71, 0x18, 0x70, 0xae, 0x7f, 0xa4, 0x5f, 0xec, 0xf1, 0x65, 0x04,
+ 0xa1, 0xf0, 0xb9, 0x95, 0x5d, 0x4c, 0x6c, 0x2a, 0xe8, 0x4d, 0x28, 0x32,
+ 0xd1, 0x1b, 0x8c, 0x45, 0x9f, 0xf7, 0xe6, 0x98, 0xc4, 0x8b, 0x35, 0x0a,
+ 0xea, 0x70, 0x20, 0xff, 0x8d, 0x76, 0x68, 0x34, 0x10, 0x5b, 0x75, 0x8c,
+ 0x95, 0xb4, 0x2d, 0x33, 0xbe, 0xb5, 0x13, 0x52, 0xe3, 0xa6, 0x53, 0x96,
+ 0x33, 0x4f, 0x0b, 0x00, 0xea, 0x37, 0xf2, 0x7d, 0x57, 0x2b, 0x76, 0xf3,
+ 0xc8, 0x58, 0x8d, 0x9a, 0xa9, 0x35, 0xa8, 0xb7, 0x4b, 0xb5, 0xcf, 0xfb,
+ 0xd4, 0xd6, 0x24, 0x74, 0x31, 0xcc, 0x9c, 0xfe, 0x93, 0x46, 0x16, 0x97,
+ 0x8f, 0xbc, 0x1f, 0x59, 0x79, 0xa2, 0xce, 0x6f, 0x2d, 0xfc, 0x36, 0x27,
+ 0xdd, 0x4a, 0x4a, 0x73, 0xd5, 0xd5, 0xb4, 0x14, 0xa1, 0x1e, 0xc0, 0x0c,
+ 0xc3, 0xf3, 0x90, 0x5d, 0x4b, 0x5c, 0xaa, 0xe3, 0x10, 0xfb, 0x67, 0x76,
+ 0x57, 0x9b, 0xc0, 0x76, 0x18, 0x2f, 0x8d, 0x33, 0x59, 0x1f, 0xfa, 0x75,
+ 0x5f, 0x2d, 0x86, 0xb9, 0x81, 0x21, 0xe9, 0x9a, 0x7f, 0xcc, 0xf9, 0xcb,
+ 0x55, 0x19, 0xe8, 0x70, 0x81, 0xdf, 0x90, 0x13, 0xda, 0xbf, 0x83, 0xf8,
+ 0xe8, 0x44, 0x87, 0x8a, 0x86, 0x38, 0x4f, 0xbc, 0x5c, 0x74, 0x75, 0xe3,
+ 0x65, 0xd4, 0x29, 0xa2, 0x09, 0xc7, 0xcc, 0xa3, 0x07, 0x90, 0xab, 0x17,
+ 0xb7, 0x78, 0x69, 0xbb, 0x17, 0xf8, 0x12, 0x51, 0xc5, 0xa6, 0x92, 0xc8,
+ 0xab, 0x68, 0xb1, 0xcf, 0xcd, 0xf9, 0xbc, 0x37, 0x08, 0x56, 0xfa, 0x1a,
+ 0x05, 0xba, 0x80, 0xb4, 0xa8, 0x64, 0xa5, 0x12, 0xa1, 0xa5, 0xb9, 0x0e,
+ 0x3f, 0x6d, 0x86, 0x29, 0x49, 0x9e, 0x69, 0x73, 0x73, 0xab, 0xda, 0xd0,
+ 0x4c, 0xac, 0x1e, 0xb3, 0xdc, 0xde, 0x08, 0xd1, 0x8b, 0xb1, 0x29, 0xc0,
+ 0x42, 0xa8, 0xc0, 0xcd, 0xd1, 0x52, 0xb9, 0x5d, 0xf2, 0x54, 0xf5, 0x94,
+ 0x5b, 0xab, 0xe1, 0xda, 0x7b, 0xc3, 0x10, 0xb4, 0x9c, 0x2f, 0x54, 0xe4,
+ 0x9c, 0x04, 0xf6, 0xd8, 0x22, 0xde, 0x15, 0xcb, 0x56, 0xee, 0x09, 0x57,
+ 0x27, 0x2e, 0xd0, 0xf5, 0x80, 0x2e, 0x45, 0xb5, 0xb3, 0xac, 0xcd, 0x9f,
+ 0x51, 0x31, 0x22, 0x97, 0x7b, 0x5b, 0x5a, 0xe8, 0x5b, 0x5b, 0x2a, 0x05,
+ 0xab, 0x00, 0xba, 0x22, 0x77, 0xea, 0x4c, 0x84, 0x51, 0xa6, 0x60, 0x18,
+ 0x2b, 0x0c, 0xe7, 0xf9, 0x5e, 0x46, 0x10, 0xbb, 0xc6, 0x76, 0xa3, 0x07,
+ 0xee, 0xd6, 0x8b, 0x45, 0x22, 0xd6, 0x61, 0x3d, 0xac, 0x81, 0x4b, 0x04,
+ 0xc1, 0x8d, 0x62, 0x84, 0x94, 0x6c, 0x5f, 0xe3, 0x73, 0x97, 0xa0, 0xbd,
+ 0x38, 0x0b, 0xd9, 0xa9, 0x72, 0xa3, 0xbc, 0xf2, 0xdd, 0x80, 0x70, 0x0f,
+ 0x08, 0x99, 0xa0, 0x4f, 0xb8, 0x22, 0x24, 0x27, 0x29, 0xf6, 0x95, 0x95,
+ 0x5d, 0xc8, 0xac, 0x13, 0x1b, 0x30, 0x4b, 0x1e, 0x49, 0x35, 0x81, 0x7a,
+ 0x11, 0xc0, 0x94, 0x0c, 0xe0, 0xaf, 0x9b, 0x8f, 0x57, 0xed, 0x38, 0x2c,
+ 0x31, 0x66, 0x94, 0x46, 0x90, 0x40, 0x67, 0x52, 0xa5, 0xb5, 0xcb, 0x69,
+ 0x63, 0x8d, 0xde, 0x3b, 0xe9, 0x94, 0x8a, 0x0c, 0xf3, 0x23, 0x21, 0xb4,
+ 0x5d, 0xd7, 0x57, 0x3d, 0x55, 0x3f, 0x85, 0x1f, 0x2f, 0x22, 0x7f, 0xf2,
+ 0x16, 0xa6, 0x94, 0x53, 0x47, 0x20, 0x46, 0x4c, 0xe4, 0x42, 0xcf, 0x4f,
+ 0x74, 0x83, 0x02, 0xaa, 0xd5, 0x04, 0x43, 0xa1, 0xfa, 0x91, 0xd0, 0x4c,
+ 0x35, 0x1d, 0x4a, 0xa4, 0x36, 0x7f, 0xb5, 0x85, 0x17, 0x69, 0x60, 0xac,
+ 0x72, 0x52, 0xc7, 0x88, 0x70, 0x8b, 0xff, 0x88, 0x1d, 0xde, 0x7d, 0xbb,
+ 0xc1, 0xac, 0xe7, 0x84, 0xff, 0x50, 0xe6, 0x9c, 0x1c, 0xf4, 0xb0, 0xc4,
+ 0x8c, 0x71, 0x5d, 0x4f, 0x26, 0x04, 0x23, 0xf6, 0x57, 0xa0, 0x78, 0x74,
+ 0x3c, 0x5c, 0x9f, 0x40, 0x74, 0xca, 0x90, 0x9a, 0x6a, 0x7b, 0x04, 0x00,
+ 0xe4, 0x44, 0x00, 0xa3, 0x2e, 0x58, 0x1f, 0xb0, 0xf0, 0x5c, 0x91, 0x81,
+ 0xc4, 0x84, 0xf9, 0x9f, 0x45, 0x44, 0x07, 0xfc, 0x28, 0x0d, 0xef, 0x69,
+ 0x3a, 0x84, 0xf1, 0xa5, 0x03, 0x68, 0x82, 0x18, 0x0b, 0xaa, 0x34, 0x8c,
+ 0x7f, 0x38, 0xb6, 0xdf, 0xdb, 0x00, 0x5e, 0x81, 0xe7, 0xa8, 0x1a, 0x70,
+ 0x91, 0xd6, 0x5a, 0xaa, 0xab, 0x00, 0x0b, 0x6f, 0x08, 0xf7, 0xdc, 0x56,
+ 0x4f, 0x05, 0xa9, 0x7e, 0x57, 0x90, 0x60, 0x28, 0xd5, 0xe7, 0x01, 0x1f,
+ 0xeb, 0x9b, 0x85, 0xeb, 0x01, 0x0b, 0xd7, 0xaf, 0xa3, 0x11, 0x4a, 0xf6,
+ 0x2b, 0xd3, 0xac, 0x75, 0xf5, 0xf4, 0xb5, 0x11, 0x5a, 0x64, 0x8f, 0x69,
+ 0x9f, 0x26, 0xf0, 0x83, 0x0f, 0xae, 0x11, 0xae, 0xc0, 0x45, 0x0c, 0x93,
+ 0xf1, 0xa8, 0xe9, 0xbb, 0x1f, 0x29, 0x40, 0xdb, 0x3b, 0x18, 0x30, 0xef,
+ 0xce, 0x8f, 0x80, 0xd8, 0x86, 0xd2, 0x36, 0x84, 0xdc, 0x09, 0x90, 0x65,
+ 0x94, 0x61, 0x9f, 0x53, 0xed, 0xb7, 0xd9, 0x58, 0x79, 0x9d, 0x4c, 0xef,
+ 0xb8, 0xbe, 0x82, 0xe8, 0x52, 0x39, 0xa5, 0x91, 0x59, 0x28, 0x5c, 0x4b,
+ 0x65, 0xa5, 0x41, 0x79, 0x9d, 0xc4, 0x48, 0x47, 0xe6, 0x5c, 0x2d, 0x69,
+ 0x67, 0xe0, 0xd2, 0x9d, 0x6e, 0x35, 0xc5, 0xcc, 0xf1, 0xb5, 0x1c, 0xc9,
+ 0xc0, 0x00, 0x93, 0x23, 0x96, 0x7e, 0xbf, 0x72, 0x30, 0x88, 0xb3, 0x1d,
+ 0x14, 0x12, 0xa5, 0x2a, 0x72, 0xbb, 0x1a, 0x85, 0x05, 0x6b, 0x87, 0xed,
+ 0xce, 0x24, 0x81, 0xcb, 0x4b, 0x45, 0xeb, 0x33, 0xb9, 0xfb, 0x71, 0xd9,
+ 0xcf, 0x33, 0x63, 0x3c, 0x7c, 0x6a, 0xe8, 0xe9, 0x06, 0x0d, 0x1d, 0xec,
+ 0xb6, 0x23, 0x14, 0xbe, 0xc7, 0x51, 0x8b, 0x14, 0x34, 0xfb, 0xaf, 0xa4,
+ 0x77, 0x30, 0xec, 0xe4, 0x2c, 0x30, 0x5b, 0x6b, 0x0a, 0x08, 0xf1, 0xce,
+ 0xa7, 0x27, 0xf7, 0xe0, 0x70, 0x47, 0x02, 0xea, 0xf2, 0x93, 0x80, 0x1e,
+ 0x38, 0xd1, 0xb7, 0xf2, 0xd9, 0x6f, 0x8f, 0x09, 0x20, 0xc9, 0x9f, 0x09,
+ 0xdd, 0x05, 0x60, 0x72, 0xf8, 0x96, 0xb3, 0xa0, 0x25, 0x29, 0xd9, 0xf3,
+ 0x44, 0xf6, 0xdc, 0xb4, 0xbb, 0x10, 0x1f, 0xfd, 0xe9, 0x96, 0xb1, 0x7f,
+ 0x49, 0x45, 0x81, 0x1b, 0x63, 0xd2, 0x29, 0x78, 0x85, 0xb2, 0x44, 0xb5,
+ 0x50, 0x96, 0x62, 0x0c, 0x85, 0xa7, 0x71, 0xad, 0xaf, 0x4f, 0x7d, 0xbe,
+ 0xb1, 0xdc, 0x5b, 0x0d, 0x0f, 0x62, 0x3f, 0x06, 0x05, 0xec, 0x29, 0xf5,
+ 0xc7, 0xba, 0x95, 0x1c, 0xc0, 0x57, 0xff, 0x07, 0x96, 0xc0, 0x65, 0x8f,
+ 0x72, 0xef, 0x8a, 0x94, 0x40, 0xe5, 0xd2, 0x09, 0x76, 0xc1, 0x90, 0x7b,
+ 0x61, 0x26, 0xef, 0x56, 0x87, 0x0f, 0x54, 0x0a, 0xe4, 0x20, 0x8d, 0x46,
+ 0xfc, 0x04, 0x78, 0x47, 0x38, 0x6a, 0xc8, 0xa6, 0x1c, 0xa3, 0x4b, 0x24,
+ 0x01, 0xd7, 0x3e, 0x04, 0x0e, 0x91, 0xfb, 0xce, 0xd6, 0x78, 0xdf, 0x0f,
+ 0x5e, 0xb8, 0xa9, 0xf2, 0xf5, 0x6e, 0xd8, 0x88, 0xc0, 0xb6, 0x9e, 0xea,
+ 0x18, 0x6e, 0x77, 0xed, 0xa0, 0x8e, 0x98, 0x7a, 0x00, 0x59, 0xc5, 0x23,
+ 0xd2, 0x79, 0x47, 0xce, 0xee, 0xfa, 0xc0, 0x05, 0x40, 0x19, 0xd6, 0xb0,
+ 0x72, 0x58, 0xf2, 0xa7, 0x49, 0x14, 0x56, 0xa2, 0x50, 0x8e, 0xf6, 0xf2,
+ 0x33, 0x95, 0x41, 0x4c, 0xea, 0xb7, 0x3e, 0x9b, 0xb3, 0x63, 0x0a, 0xdc,
+ 0x4b, 0xb7, 0xe9, 0x5f, 0x5c, 0x2e, 0x5d, 0xac, 0x07, 0x03, 0xef, 0xda,
+ 0x70, 0x36, 0xb7, 0xf3, 0x69, 0x4f, 0x21, 0xde, 0x0c, 0x7d, 0xe5, 0x71,
+ 0x79, 0xd4, 0xd4, 0xd7, 0xb8, 0xb2, 0xcf, 0xae, 0xd0, 0xd3, 0xae, 0xe2,
+ 0x88, 0xda, 0x7d, 0x24, 0x2b, 0x07, 0x80, 0x01, 0x0b, 0x8b, 0xbc, 0x3d,
+ 0xc9, 0x50, 0x2a, 0x4c, 0xf3, 0x08, 0x5b, 0xc1, 0x51, 0x03, 0x35, 0x29,
+ 0x27, 0x56, 0xd3, 0xb6, 0xdb, 0x5f, 0x54, 0x8b, 0x31, 0xeb, 0x63, 0xe6,
+ 0x3e, 0x8a, 0x24, 0x5d, 0xe3, 0xa3, 0x3a, 0x28, 0x51, 0xd6, 0x07, 0x71,
+ 0x73, 0x54, 0x1b, 0x37, 0xc0, 0xf7, 0xcd, 0x54, 0x74, 0x4e, 0xcf, 0x5a,
+ 0x12, 0x8a, 0x89, 0xf0, 0x07, 0xf9, 0x30, 0xbf, 0x35, 0xd1, 0xd0, 0x84,
+ 0x1c, 0xe2, 0x9e, 0x23, 0x94, 0x00, 0xa9, 0x5c, 0xdf, 0x1e, 0x66, 0x3c,
+ 0xdf, 0x8b, 0x4e, 0xfc, 0x4d, 0x00, 0x97, 0x3d, 0xd1, 0xe8, 0x52, 0x79,
+ 0xda, 0x4e, 0xab, 0x47, 0x24, 0x03, 0xb7, 0xb5, 0xdf, 0x82, 0x6f, 0xfe,
+ 0xb2, 0x3c, 0x43, 0x0f, 0x73, 0x7c, 0x50, 0xdc, 0xb0, 0x80, 0xd8, 0x2d,
+ 0x8e, 0xb6, 0x42, 0x52, 0x4e, 0x44, 0x9c, 0x2b, 0x89, 0x29, 0xe4, 0x01,
+ 0x56, 0x02, 0x7d, 0xba, 0x20, 0x8d, 0x43, 0x16, 0x4a, 0x7a, 0x22, 0x7b,
+ 0xfc, 0xba, 0x7a, 0xdf, 0xbe, 0x96, 0x76, 0x40, 0xc6, 0x43, 0xb3, 0xe3,
+ 0xca, 0x22, 0x1b, 0x5e, 0x9a, 0x2a, 0x75, 0xd5, 0xfc, 0x23, 0xa6, 0xf1,
+ 0xca, 0xad, 0xa8, 0x82, 0xd7, 0xb7, 0x21, 0xd4, 0x20, 0xcd, 0x3c, 0xe9,
+ 0x20, 0x23, 0x1a, 0xae, 0xa2, 0xe6, 0x72, 0x2c, 0xf2, 0x77, 0x3c, 0x0f,
+ 0x70, 0x61, 0xc3, 0x49, 0x0d, 0x1c, 0x54, 0x64, 0xcd, 0x50, 0x2a, 0x89,
+ 0x09, 0x62, 0x2c, 0x13, 0x36, 0x07, 0x54, 0x90, 0x31, 0x7a, 0xcc, 0x90,
+ 0x73, 0x8d, 0xae, 0x4c, 0xab, 0x3e, 0x93, 0xa9, 0x5a, 0x2d, 0x8f, 0xcc,
+ 0x7c, 0x9a, 0x1a, 0x75, 0xb2, 0x18, 0x8b, 0xc7, 0xd5, 0x4f, 0x1e, 0x65,
+ 0xbf, 0x64, 0x7b, 0xac, 0xf6, 0x9f, 0x26, 0x38, 0x91, 0x66, 0xc9, 0xee,
+ 0xea, 0x33, 0x87, 0xb3, 0xe2, 0xcc, 0x4a, 0xab, 0x13, 0xfa, 0x0b, 0xea,
+ 0x4b, 0x99, 0x98, 0xef, 0xa4, 0x98, 0x38, 0x61, 0x57, 0xaf, 0x33, 0x1e,
+ 0xbf, 0x8a, 0xf6, 0xba, 0x47, 0x43, 0x0d, 0xb8, 0x56, 0xd6, 0x3a, 0xef,
+ 0x41, 0x4c, 0xd9, 0xc7, 0x6f, 0x34, 0x59, 0xb4, 0xe0, 0x19, 0xc8, 0x74,
+ 0x11, 0x79, 0xd5, 0xcf, 0x15, 0x40, 0x1a, 0xaa, 0xeb, 0xb8, 0x6c, 0x96,
+ 0x76, 0x6f, 0xb9, 0x01, 0xe0, 0xd0, 0x7e, 0x09, 0x3a, 0x2a, 0x4a, 0xd9,
+ 0xba, 0x90, 0xa9, 0x2a, 0x59, 0xb7, 0xb4, 0x3f, 0x37, 0x49, 0xe8, 0x32,
+ 0x57, 0xfd, 0x51, 0x87, 0xe8, 0x2f, 0x38, 0xcd, 0xce, 0x98, 0xdc, 0x54,
+ 0xa6, 0xc8, 0x89, 0xd8, 0x8b, 0x03, 0x2b, 0x54, 0xad, 0xf3, 0xd9, 0x16,
+ 0xd9, 0x53, 0xec, 0xf8, 0x5c, 0xb7, 0xa5, 0x6b, 0xb2, 0x09, 0xd6, 0x17,
+ 0xcb, 0xbb, 0x45, 0x71, 0xdb, 0x67, 0xd8, 0x49, 0x73, 0x2b, 0x80, 0xfc,
+ 0x01, 0xcd, 0x4e, 0x18, 0xda, 0xb5, 0x9a, 0x9c, 0xcd, 0xac, 0x53, 0x3c,
+ 0x09, 0x85, 0x69, 0x76, 0xa9, 0xdf, 0x9a, 0x8d, 0x00, 0xd2, 0xea, 0xf7,
+ 0xb3, 0xa7, 0x86, 0x51, 0xb6, 0xd8, 0xeb, 0x02, 0xd4, 0x4b, 0xc7, 0xa6,
+ 0x76, 0x57, 0xc0, 0xf8, 0xb5, 0x52, 0xfd, 0x18, 0x3f, 0xf4, 0x24, 0x78,
+ 0xd8, 0xdc, 0xd0, 0x14, 0x00, 0xb9, 0xef, 0x04, 0xe6, 0x62, 0xf4, 0x2f,
+ 0x7c, 0x72, 0x01, 0x93, 0x17, 0xb5, 0xbf, 0x85, 0x2e, 0x2d, 0x79, 0xdc,
+ 0xb9, 0xc8, 0xdd, 0x6a, 0xd2, 0x83, 0xd1, 0x74, 0x01, 0x4d, 0xac, 0xab,
+ 0x6e, 0xbd, 0x21, 0x1d, 0xf7, 0x0b, 0xe2, 0x68, 0xff, 0x46, 0x9d, 0xd8,
+ 0x72, 0x19, 0xeb, 0x33, 0x61, 0x96, 0x93, 0x3b, 0x40, 0xd0, 0x5b, 0x10,
+ 0x03, 0x0d, 0x36, 0xa0, 0xd3, 0x95, 0x51, 0x99, 0x76, 0x11, 0x67, 0xc9,
+ 0x72, 0xba, 0x90, 0x59, 0x45, 0x8a, 0x35, 0x9b, 0x65, 0xbb, 0xc4, 0x6e,
+ 0xa7, 0x11, 0x6b, 0x44, 0xa8, 0xff, 0x2a, 0xc2, 0x47, 0xc8, 0x6e, 0x9b,
+ 0x89, 0x7e, 0xcc, 0x56, 0xe6, 0x3f, 0x04, 0x7d, 0x43, 0x15, 0x42, 0xfa,
+ 0xfb, 0x5c, 0x2e, 0x1d, 0xad, 0xbc, 0xe6, 0x73, 0x34, 0x48, 0xcd, 0xf5,
+ 0x10, 0x5e, 0x4a, 0x69, 0x1b, 0xe7, 0x09, 0xcb, 0xf6, 0x12, 0xff, 0xea,
+ 0xdd, 0x53, 0x57, 0x61, 0x53, 0x15, 0x58, 0x6c, 0xf2, 0x74, 0xdd, 0x05,
+ 0xf6, 0x98, 0x78, 0x34, 0x74, 0x88, 0xee, 0x86, 0xfc, 0x48, 0xc3, 0x37,
+ 0xe8, 0xfb, 0x05, 0xcd, 0xfb, 0x80, 0xd5, 0xee, 0xf6, 0xdc, 0xbc, 0x05,
+ 0xe7, 0x4d, 0x18, 0x7e, 0xe3, 0x08, 0xa6, 0xf3, 0xc0, 0x84, 0x3c, 0xf0,
+ 0xda, 0x27, 0xa9, 0xfb, 0xa6, 0xef, 0x4a, 0xaa, 0x32, 0x8c, 0xc0, 0x46,
+ 0x9f, 0x65, 0xbb, 0x5d, 0x9d, 0xf3, 0x5b, 0x73, 0x9a, 0xe9, 0x73, 0x81,
+ 0x73, 0xd6, 0xcb, 0xb7, 0x52, 0x21, 0x67, 0xce, 0xa4, 0x45, 0x7f, 0xe0,
+ 0x83, 0x1d, 0x9e, 0x60, 0x99, 0xd9, 0x7d, 0x5e, 0x53, 0xaf, 0x6b, 0x9e,
+ 0x5d, 0xfc, 0x11, 0x16, 0xf6, 0xa0, 0xd9, 0xb8, 0x6e, 0xe5, 0x13, 0x3b,
+ 0xbc, 0xd6, 0x43, 0x23, 0xde, 0x43, 0x1f, 0xc4, 0x2f, 0xba, 0x46, 0x03,
+ 0x7d, 0x76, 0x21, 0xc0, 0xf6, 0x87, 0x95, 0xd8, 0x04, 0x9e, 0x4f, 0x9c,
+ 0x0f, 0x11, 0x41, 0x2c, 0x06, 0x02, 0xeb, 0x2c, 0xac, 0x68, 0x49, 0x59,
+ 0x89, 0x71, 0xde, 0x1b, 0x0b, 0x25, 0xc1, 0x83, 0x71, 0x31, 0x66, 0xee,
+ 0xdf, 0xd7, 0x1f, 0xa0, 0xae, 0x13, 0x69, 0x0f, 0x61, 0x60, 0x2b, 0xf5,
+ 0xb5, 0x36, 0xac, 0x52, 0x19, 0xc7, 0x00, 0xe2, 0xd2, 0x0d, 0xff, 0xe5,
+ 0x0f, 0xb7, 0x5a, 0x04, 0x3b, 0xe1, 0x60, 0x6f, 0xf0, 0x45, 0x49, 0x83,
+ 0x97, 0x87, 0x5c, 0xbc, 0x82, 0x15, 0x47, 0x9d, 0x45, 0x01, 0x89, 0x99,
+ 0x10, 0x8a, 0xb7, 0x7a, 0xfc, 0x75, 0x67, 0x82, 0xf0, 0xa9, 0x8b, 0xd9,
+ 0x0c, 0x71, 0xa9, 0x00, 0x39, 0xff, 0x0a, 0xde, 0x5b, 0x78, 0x4b, 0x89,
+ 0x07, 0x23, 0xff, 0x31, 0xb3, 0xaa, 0xa4, 0x2c, 0xb0, 0x2f, 0x69, 0xd0,
+ 0x5a, 0x39, 0x5c, 0x76, 0x51, 0x80, 0x16, 0x2e, 0x43, 0xa9, 0xde, 0xbe,
+ 0x7e, 0xa6, 0xad, 0x04, 0x15, 0x53, 0x85, 0x40, 0x4b, 0xc7, 0x00, 0x46,
+ 0x60, 0x69, 0xca, 0x95, 0xfd, 0x5a, 0x67, 0xc2, 0xd7, 0x11, 0xae, 0x55,
+ 0xca, 0x06, 0xd8, 0x1f, 0x4c, 0x02, 0x75, 0x5e, 0x38, 0x6f, 0x76, 0x9e,
+ 0x07, 0xff, 0x59, 0x0a, 0x62, 0x3d, 0xa1, 0x11, 0xe2, 0xc2, 0xea, 0xa7,
+ 0x90, 0x19, 0x52, 0x2b, 0xf6, 0x5b, 0x35, 0x0c, 0x0a, 0x51, 0x3d, 0x1b,
+ 0x1e, 0x82, 0x13, 0xfa, 0x8a, 0x7b, 0x43, 0x22, 0xdf, 0x99, 0xda, 0x19,
+ 0x2a, 0xdc, 0x33, 0x4c, 0xba, 0x42, 0x1b, 0xc5, 0x45, 0xf0, 0xa6, 0x50,
+ 0x01, 0x05, 0x4e, 0xce, 0x93, 0x04, 0xc2, 0x0a, 0x81, 0xa0, 0x10, 0xfd,
+ 0xf3, 0x46, 0x6f, 0xb0, 0x6d, 0x84, 0x8c, 0x46, 0xcc, 0xe2, 0xa6, 0x1c,
+ 0x27, 0x2c, 0xc3, 0x97, 0xc8, 0x24, 0x6e, 0x2b, 0x8d, 0x9f, 0x7a, 0xfd,
+ 0x5a, 0x55, 0x21, 0x45, 0xa4, 0xbb, 0xc1, 0xa8, 0x2d, 0xd3, 0xc9, 0x7e,
+ 0x13, 0xdb, 0x0f, 0xbf, 0x93, 0xb5, 0x8c, 0x99, 0x11, 0x96, 0x35, 0xc3,
+ 0x8a, 0x1f, 0xde, 0xc3, 0x89, 0x7a, 0x57, 0x1c, 0x08, 0xf0, 0x1f, 0x10,
+ 0xa3, 0x5b, 0xbc, 0x3f, 0xfc, 0x34, 0x0c, 0x28, 0x82, 0xac, 0xeb, 0xbf,
+ 0x31, 0x67, 0x6f, 0x3e, 0xa3, 0xcd, 0xc1, 0x44, 0x57, 0x8a, 0xac, 0x05,
+ 0xb8, 0xf1, 0xdd, 0xab, 0xb8, 0x9f, 0xb6, 0x35, 0x11, 0x38, 0x96, 0xd7,
+ 0x67, 0xe7, 0x7f, 0xe5, 0x0e, 0xd8, 0x87, 0x26, 0x6d, 0x49, 0x9f, 0x68,
+ 0x6a, 0xba, 0xfa, 0x01, 0x06, 0xca, 0xe6, 0xac, 0xac, 0x14, 0x63, 0xd9,
+ 0x95, 0x8a, 0x22, 0x79, 0x1e, 0x03, 0xdf, 0x83, 0x96, 0x71, 0x4d, 0x05,
+ 0x81, 0xb9, 0x95, 0x20, 0x9e, 0x09, 0xc5, 0xdd, 0x5c, 0x1e, 0x9e, 0x24,
+ 0x76, 0xc9, 0xe3, 0x0f, 0x11, 0xb8, 0xf0, 0x04, 0xa4, 0x5d, 0x3d, 0xc4,
+ 0x12, 0xe8, 0xfd, 0x00, 0x0d, 0xb3, 0x97, 0x95, 0xfe, 0xe8, 0x3b, 0xe8,
+ 0xa0, 0x0b, 0xae, 0x56, 0xd4, 0x03, 0xe7, 0xcd, 0xae, 0x53, 0xde, 0xbb,
+ 0x69, 0xde, 0xc3, 0x81, 0x87, 0x45, 0x08, 0x51, 0xa7, 0x02, 0x14, 0x11,
+ 0x23, 0x1d, 0x3e, 0x0d, 0xe6, 0x82, 0x05, 0x18, 0x63, 0x3c, 0x76, 0x5a,
+ 0x27, 0xd2, 0x59, 0xde, 0xe8, 0x94, 0x7a, 0x43, 0x47, 0xa9, 0x2d, 0xc4,
+ 0x6f, 0xf9, 0x77, 0x27, 0x9c, 0xad, 0xe3, 0x4d, 0x8b, 0xc8, 0x1d, 0xfe,
+ 0x2e, 0xfe, 0x4b, 0xa6, 0x39, 0x25, 0x4b, 0x90, 0xb2, 0x54, 0x69, 0xb2,
+ 0x4c, 0xca, 0x17, 0xdd, 0xa8, 0x49, 0xd0, 0xbb, 0x86, 0xca, 0x3b, 0xc4,
+ 0x89, 0x10, 0x78, 0x1f, 0x90, 0x7e, 0xe9, 0xef, 0x89, 0xc3, 0x98, 0x23,
+ 0xcf, 0xbb, 0xce, 0xdc, 0xa7, 0x4a, 0xd2, 0x2b, 0xe7, 0x45, 0xdf, 0xb4,
+ 0x6e, 0xd1, 0xff, 0x2a, 0x7f, 0xa5, 0x89, 0x82, 0x28, 0x2f, 0xa5, 0xbb,
+ 0xee, 0xd1, 0x7f, 0xfc, 0x52, 0xb6, 0x27, 0xa0, 0xa3, 0x42, 0xf5, 0x2d,
+ 0x12, 0x3a, 0xb6, 0xd5, 0x9d, 0x2c, 0x62, 0xb8, 0x5e, 0x88, 0xe5, 0xb0,
+ 0x3c, 0xe8, 0x70, 0xd6, 0x73, 0x35, 0xe0, 0xe7, 0xb8, 0x16, 0x1c, 0xb7,
+ 0x82, 0xcc, 0xa3, 0x8b, 0x6c, 0xc1, 0x9d, 0x45, 0x51, 0x8f, 0xa8, 0xb1,
+ 0xaf, 0x7c, 0x5d, 0xd2, 0x67, 0x9f, 0xf0, 0xa3, 0x4d, 0x1f, 0x10, 0xf1,
+ 0x58, 0x8c, 0x9b, 0x14, 0xd2, 0x2d, 0xa9, 0x42, 0x90, 0xf6, 0xb6, 0x08,
+ 0x9d, 0x5a, 0xe0, 0x1f, 0x7a, 0x0f, 0x56, 0x2c, 0x06, 0x3d, 0xcd, 0x98,
+ 0x73, 0x71, 0x10, 0xc9, 0xf2, 0xa9, 0x18, 0x51, 0x6b, 0xa6, 0x96, 0xde,
+ 0xfb, 0xff, 0x3c, 0x18, 0x82, 0x0d, 0xa8, 0x7e, 0x80, 0xd8, 0x46, 0x3f,
+ 0xac, 0x10, 0xbd, 0xb7, 0xf8, 0x0b, 0x80, 0x2f, 0x7b, 0xda, 0x27, 0xdb,
+ 0xa8, 0x30, 0x1a, 0x78, 0x36, 0xa8, 0x0c, 0xe2, 0x78, 0x4c, 0x99, 0xbd,
+ 0xf9, 0xb0, 0x3d, 0xaa, 0x20, 0x88, 0xd3, 0xfd, 0x75, 0x08, 0x36, 0x3d,
+ 0x53, 0x46, 0xbf, 0xdb, 0xef, 0x94, 0x0f, 0xa2, 0x4c, 0x49, 0x44, 0x85,
+ 0xda, 0x9f, 0x94, 0xb9, 0xed, 0x68, 0x9f, 0x39, 0xa9, 0x47, 0xb8, 0x46,
+ 0x35, 0x45, 0x74, 0x11, 0x78, 0xf5, 0x47, 0xd2, 0x04, 0x19, 0x82, 0xcc,
+ 0x8f, 0x9e, 0xba, 0x50, 0x31, 0xff, 0x44, 0xeb, 0x7c, 0xe5, 0xbb, 0x0a,
+ 0xa4, 0x37, 0x6c, 0xd0, 0x89, 0x84, 0x1d, 0x2c, 0xe5, 0x17, 0x0c, 0x45,
+ 0x0b, 0x03, 0x46, 0xb4, 0xc7, 0xda, 0x4a, 0x5d, 0xb7, 0xb1, 0xb6, 0xc3,
+ 0x54, 0xf2, 0xf2, 0x4c, 0x22, 0x49, 0x95, 0x97, 0x8a, 0xba, 0xcf, 0x20,
+ 0x83, 0x47, 0xf4, 0xf7, 0xb0, 0x60, 0x19, 0x37, 0xc7, 0xb0, 0x56, 0x00,
+ 0x16, 0xe2, 0xca, 0x87, 0x62, 0x9f, 0x73, 0x82, 0x55, 0xb8, 0x89, 0x33,
+ 0xc7, 0xe6, 0xf3, 0xda, 0x3f, 0x4d, 0x85, 0x3b, 0x46, 0x6f, 0xb1, 0xd3,
+ 0x24, 0x7e, 0xb2, 0x92, 0x20, 0xd1, 0x28, 0xb3, 0x4d, 0xe3, 0x4d, 0xac,
+ 0xe6, 0xaa, 0x9f, 0x86, 0x2f, 0x15, 0x07, 0x38, 0x54, 0xa5, 0xce, 0xc2,
+ 0x77, 0x05, 0xd0, 0x63, 0x07, 0x5b, 0xc1, 0x4c, 0x1f, 0xe3, 0x02, 0xf5,
+ 0xf1, 0x58, 0xd4, 0x37, 0xef, 0xf8, 0xcb, 0x20, 0x6c, 0x32, 0x73, 0xb1,
+ 0x0f, 0x4c, 0x67, 0x11, 0x2f, 0x97, 0x66, 0x4d, 0x95, 0xe0, 0x2e, 0x80,
+ 0x99, 0x4d, 0x42, 0x6c, 0xb3, 0x99, 0x35, 0xe0, 0xae, 0x16, 0xc5, 0xe6,
+ 0x7e, 0xd0, 0x77, 0x80, 0x74, 0x34, 0x3c, 0x6e, 0xe8, 0x8a, 0x95, 0x62,
+ 0xbb, 0x47, 0x6e, 0x09, 0xb2, 0x90, 0x96, 0xc3, 0x9c, 0xd5, 0xca, 0x3a,
+ 0xc8, 0xeb, 0x4d, 0x0e, 0xb2, 0x18, 0xf4, 0xd3, 0x54, 0x54, 0x94, 0xe2,
+ 0x80, 0x0c, 0x92, 0x2b, 0xd2, 0xa3, 0xe5, 0x85, 0x75, 0x92, 0xcf, 0x4d,
+ 0xc1, 0x55, 0xe0, 0xad, 0x15, 0x79, 0x00, 0xa5, 0x1a, 0x89, 0x31, 0x40,
+ 0xfa, 0x39, 0xfc, 0x52, 0x35, 0xde, 0x10, 0x9c, 0xad, 0x44, 0xc7, 0x15,
+ 0x55, 0x6d, 0xec, 0x28, 0xf2, 0xfb, 0x51, 0x35, 0x1e, 0xce, 0xa0, 0x62,
+ 0x7b, 0x21, 0x4d, 0x17, 0xc2, 0x44, 0xbe, 0x77, 0x57, 0x5b, 0x17, 0xf0,
+ 0x2b, 0x18, 0xaf, 0x6a, 0x8f, 0x32, 0x31, 0xa4, 0x33, 0xe5, 0x94, 0x85,
+ 0xcf, 0x21, 0x83, 0x87, 0x56, 0xcc, 0x43, 0xd7, 0x69, 0x38, 0x97, 0x88,
+ 0xa5, 0xeb, 0x7f, 0x9a, 0x1b, 0x88, 0x91, 0xcc, 0xf8, 0x50, 0x33, 0xeb,
+ 0x61, 0xa4, 0x06, 0x30, 0x0b, 0x33, 0x30, 0x31, 0x1d, 0xec, 0x99, 0x82,
+ 0xc5, 0x1b, 0xb0, 0x14, 0x9e, 0x66, 0xc5, 0x6b, 0x07, 0x77, 0xf5, 0x39,
+ 0xd8, 0x83, 0x81, 0xa2, 0xf4, 0x2c, 0x40, 0xbc, 0x89, 0x61, 0xa7, 0xc3,
+ 0x04, 0x60, 0x8c, 0xe9, 0x81, 0x84, 0xed, 0x46, 0x4c, 0xc8, 0xb0, 0x11,
+ 0x95, 0x6d, 0x10, 0xb3, 0x81, 0x3b, 0xf4, 0x73, 0xfb, 0xcb, 0x66, 0xeb,
+ 0xfc, 0x54, 0x96, 0x2a, 0xa3, 0xaa, 0xb5, 0x28, 0x0b, 0xe4, 0xee, 0xe6,
+ 0x7e, 0xb3, 0xeb, 0x0f, 0x0f, 0x7d, 0x91, 0x53, 0x2c, 0x68, 0xc4, 0xf0,
+ 0xb2, 0x9e, 0xee, 0x29, 0x4a, 0x8a, 0x39, 0x6e, 0x2f, 0x7b, 0xfc, 0x0d,
+ 0x41, 0x1a, 0xc6, 0xc1, 0x2d, 0x93, 0xaf, 0xa4, 0x11, 0x20, 0xcd, 0xbf,
+ 0x11, 0xe4, 0xe8, 0x5d, 0x8b, 0x0b, 0x6a, 0x9a, 0x6a, 0xac, 0x1f, 0xc9,
+ 0xf9, 0xd9, 0x9d, 0xdb, 0x4b, 0x2f, 0x9e, 0x8e, 0x8d, 0x12, 0xdd, 0xe1,
+ 0xb9, 0xc9, 0x32, 0x76, 0x0b, 0xc6, 0xf7, 0x08, 0x48, 0x6a, 0xb3, 0x70,
+ 0x96, 0x69, 0x9b, 0xfa, 0x31, 0x28, 0xa1, 0xf4, 0x25, 0xe6, 0x30, 0x52,
+ 0x1a, 0x89, 0xe5, 0x4b, 0xbf, 0xc2, 0x25, 0x30, 0x4d, 0xa2, 0xf6, 0x00,
+ 0x99, 0x23, 0x57, 0xfd, 0x79, 0xb6, 0x4c, 0x0d, 0xa8, 0x5a, 0x1e, 0xf7,
+ 0xb2, 0x85, 0x17, 0x74, 0x5e, 0xb9, 0xc2, 0x69, 0x29, 0x67, 0x03, 0xb5,
+ 0x35, 0xc1, 0xd2, 0xc5, 0x70, 0x1a, 0x94, 0x12, 0xe8, 0x2e, 0x59, 0x81,
+ 0xbd, 0xce, 0x72, 0x9a, 0x4d, 0x03, 0x42, 0x51, 0xaa, 0x0c, 0xa5, 0x9c,
+ 0x91, 0xf9, 0xd1, 0x92, 0xc5, 0xbd, 0xef, 0x6c, 0x8d, 0x7d, 0x73, 0x4c,
+ 0x43, 0x41, 0xcf, 0x65, 0xd9, 0xca, 0x38, 0x98, 0x7a, 0x82, 0x56, 0x83,
+ 0x48, 0x08, 0x4d, 0x00, 0x82, 0x25, 0xb9, 0xba, 0xf3, 0x31, 0x96, 0x26,
+ 0xcc, 0x14, 0x56, 0x5a, 0x3c, 0x62, 0x2b, 0xf3, 0x56, 0x33, 0xdf, 0xe2,
+ 0x9f, 0x1e, 0xcf, 0x35, 0x03, 0xad, 0x94, 0x89, 0x60, 0x82, 0x18, 0xce,
+ 0x0d, 0x81, 0xcc, 0x35, 0x96, 0xbd, 0xda, 0x22, 0x58, 0x1c, 0xe9, 0x26,
+ 0x96, 0x4c, 0x0a, 0x98, 0xc5, 0xbb, 0x8f, 0x10, 0xb9, 0x1d, 0x0e, 0x05,
+ 0x59, 0xef, 0x95, 0x22, 0xcd, 0xa9, 0xbb, 0x75, 0x68, 0xac, 0xfc, 0xf5,
+ 0x32, 0x64, 0x38, 0x36, 0xc4, 0x82, 0x02, 0xd5, 0x95, 0x1d, 0xb8, 0xf5,
+ 0x0e, 0x42, 0xa4, 0x69, 0x32, 0x82, 0x3d, 0x68, 0x15, 0xf9, 0x13, 0x66,
+ 0x9e, 0x4f, 0xd0, 0xfa, 0x32, 0x95, 0x42, 0xd1, 0xf7, 0x43, 0xb1, 0x0c,
+ 0x0e, 0x91, 0xfc, 0xa0, 0xcb, 0x0f, 0xda, 0xac, 0x67, 0xf7, 0x64, 0x2e,
+ 0x5f, 0xc7, 0x08, 0xeb, 0xfd, 0x75, 0xf7, 0x74, 0x8e, 0xb9, 0xff, 0x57,
+ 0xe3, 0xe0, 0x73, 0xcd, 0xdf, 0xec, 0x20, 0x27, 0xb8, 0x52, 0x43, 0xce,
+ 0x8c, 0xd0, 0x0f, 0xdd, 0x1a, 0xb2, 0x9c, 0x1e, 0xb9, 0x7b, 0x5b, 0x1c,
+ 0xed, 0xd4, 0x54, 0xc1, 0x80, 0x6c, 0x5f, 0xdb, 0xb1, 0x68, 0x9f, 0xac,
+ 0x8a, 0x82, 0xc2, 0x33, 0x9e, 0xa8, 0x22, 0xe6, 0xf2, 0x13, 0x60, 0xf7,
+ 0x1f, 0x4e, 0x67, 0xbc, 0xa7, 0x5c, 0xf4, 0xa9, 0xa9, 0xf3, 0x8f, 0xb2,
+ 0x36, 0x43, 0xd5, 0x5c, 0x4c, 0x1f, 0x0b, 0x02, 0x55, 0xad, 0xfd, 0x14,
+ 0x54, 0x4f, 0x0e, 0x5d, 0xe4, 0x08, 0xaa, 0xda, 0x65, 0xee, 0x39, 0xf3,
+ 0x79, 0x42, 0x0e, 0xa7, 0xd1, 0x95, 0x5b, 0xcf, 0x06, 0xb4, 0xfa, 0x9d,
+ 0xd1, 0x6b, 0x0d, 0x50, 0xa3, 0x00, 0x57, 0x04, 0x13, 0xfd, 0x3c, 0xe7,
+ 0x0b, 0xf4, 0x62, 0x92, 0xc8, 0x88, 0x44, 0x4c, 0x18, 0x1f, 0xde, 0x59,
+ 0x9f, 0x45, 0xc9, 0x32, 0xdf, 0x6e, 0xa7, 0x00, 0x08, 0x03, 0x18, 0xe0,
+ 0xb7, 0x53, 0x52, 0x81, 0x8a, 0x6f, 0x05, 0x21, 0x3e, 0xc3, 0xa8, 0x8f,
+ 0xc1, 0xc4, 0x50, 0xe2, 0x3b, 0x26, 0x35, 0xbb, 0x69, 0xe1, 0x6b, 0xb7,
+ 0xed, 0xf3, 0x5b, 0x4e, 0xc8, 0x36, 0xf0, 0xe8, 0x0e, 0xa0, 0x2f, 0x43,
+ 0x8b, 0x0d, 0x8b, 0x1f, 0xad, 0xa3, 0x6e, 0x8a, 0x6a, 0x80, 0x33, 0x8b,
+ 0xe0, 0x6f, 0x39, 0xa4, 0x43, 0xbc, 0x9b, 0x41, 0x60, 0x8c, 0xca, 0x5e,
+ 0x25, 0x1f, 0xd4, 0x33, 0xaf, 0xef, 0xe2, 0xed, 0x9c, 0x2d, 0x0c, 0x66,
+ 0x8f, 0x44, 0x47, 0x02, 0x50, 0x38, 0x99, 0x9e, 0x42, 0x9d, 0xd2, 0x3f,
+ 0x94, 0xbc, 0x38, 0xcd, 0x56, 0x68, 0x69, 0x39, 0x64, 0x05, 0x1c, 0x5f,
+ 0x0c, 0xbb, 0xed, 0x6d, 0xb2, 0x31, 0xd7, 0x33, 0x83, 0x51, 0xb1, 0x26,
+ 0x04, 0x67, 0x35, 0x8e, 0x8c, 0x74, 0x90, 0x9b, 0x46, 0xca, 0x0a, 0x7a,
+ 0x6c, 0xae, 0xe3, 0x7c, 0x87, 0x42, 0xd0, 0xbb, 0x82, 0x27, 0x1c, 0x3e,
+ 0xde, 0x81, 0xcb, 0xd3, 0x5f, 0x6c, 0x5a, 0xae, 0xd6, 0xff, 0x51, 0x51,
+ 0xa6, 0x9c, 0xfa, 0x14, 0x4c, 0x88, 0x51, 0x55, 0xab, 0xeb, 0x4b, 0xbc,
+ 0xa7, 0x62, 0x81, 0x4a, 0x26, 0xde, 0x21, 0x79, 0x26, 0x6d, 0xe9, 0xb6,
+ 0x3f, 0x72, 0xb8, 0x51, 0x79, 0x72, 0x3e, 0x83, 0x82, 0xd2, 0x95, 0xbf,
+ 0x70, 0xa5, 0xbc, 0xd7, 0x07, 0x68, 0xaa, 0x00, 0x2c, 0xf8, 0xfe, 0x45,
+ 0xd9, 0xd7, 0x33, 0x61, 0xce, 0xa9, 0xe9, 0xe1, 0x77, 0xa9, 0x8b, 0x7f,
+ 0xda, 0x26, 0x2c, 0x6a, 0xda, 0x31, 0x7a, 0xb9, 0x2f, 0xa2, 0xef, 0x74,
+ 0x93, 0x2c, 0x53, 0x2a, 0x81, 0xd5, 0x61, 0x15, 0x1d, 0xa8, 0x1d, 0x7f,
+ 0xd1, 0x82, 0xee, 0xe1, 0x34, 0x42, 0x5d, 0xea, 0xdd, 0x87, 0x6a, 0x25,
+ 0x95, 0xdf, 0xaf, 0xb8, 0x24, 0x4f, 0x1c, 0xc2, 0x2f, 0xdc, 0xf7, 0x25,
+ 0xe6, 0xea, 0x64, 0x84, 0x37, 0xba, 0x3a, 0x1e, 0xf2, 0x5e, 0x74, 0xaf,
+ 0x32, 0x8e, 0xa7, 0x9d, 0x74, 0x6b, 0x26, 0x09, 0x4c, 0x12, 0x28, 0xf2,
+ 0x1b, 0x69, 0x30, 0xf3, 0x11, 0xf0, 0x5b, 0xbf, 0xad, 0x2a, 0xa4, 0x11,
+ 0x51, 0x6f, 0x11, 0xe4, 0x5b, 0xf5, 0xad, 0x04, 0x4f, 0xe1, 0x73, 0x59,
+ 0xdb, 0x24, 0x2a, 0x78, 0x6c, 0xdf, 0x95, 0xe1, 0x7c, 0x92, 0xf8, 0x69,
+ 0x36, 0xdd, 0x62, 0xf2, 0x6c, 0xbd, 0xe7, 0xfd, 0x49, 0xc5, 0x30, 0xa3,
+ 0xdc, 0x5e, 0xd7, 0x37, 0xd3, 0x3e, 0x7f, 0x3d, 0x5c, 0x4d, 0xee, 0x18,
+ 0xdb, 0xff, 0xb9, 0x7c, 0x33, 0xa5, 0x6d, 0x23, 0x76, 0x3d, 0x81, 0x99,
+ 0x0b, 0x43, 0x7f, 0xbf, 0x35, 0xf9, 0x9f, 0x43, 0xae, 0x73, 0x4d, 0x56,
+ 0x17, 0x36, 0x82, 0x8b, 0x13, 0xaf, 0x03, 0xa4, 0x8e, 0xc4, 0xa0, 0x31,
+ 0x0e, 0xa5, 0x55, 0x43, 0x0d, 0xe3, 0x19, 0xaf, 0xa2, 0x6e, 0x3a, 0x31,
+ 0xa4, 0x07, 0x3f, 0x28, 0x89, 0x8c, 0x47, 0x9f, 0x74, 0xa9, 0x64, 0x9a,
+ 0xa6, 0x0e, 0x55, 0xd2, 0xd5, 0x18, 0x89, 0x88, 0x5b, 0x3f, 0xc5, 0x3a,
+ 0x3e, 0x6a, 0xc8, 0x9d, 0x80, 0x31, 0xb5, 0xc4, 0xc2, 0xe0, 0x5f, 0xb0,
+ 0x6f, 0xba, 0x17, 0x99, 0x21, 0x7d, 0x29, 0x8c, 0xfe, 0x5c, 0x4b, 0x1f,
+ 0x3f, 0x3c, 0xcc, 0x58, 0x06, 0x67, 0x36, 0xd0, 0x78, 0xad, 0x7a, 0x30,
+ 0xb3, 0x66, 0xd1, 0xc5, 0x84, 0x90, 0x93, 0x46, 0xd2, 0x65, 0xfa, 0x30,
+ 0x0e, 0x34, 0x64, 0xd4, 0x01, 0x56, 0x5a, 0x61, 0x92, 0xf7, 0xaa, 0xf2,
+ 0x99, 0x6e, 0xc7, 0x6a, 0xd1, 0x90, 0xeb, 0x59, 0x8c, 0xac, 0x8b, 0xe4,
+ 0x18, 0x23, 0x03, 0x64, 0x01, 0x9d, 0x8d, 0x29, 0xf7, 0x01, 0x38, 0x5f,
+ 0x4d, 0x45, 0x0a, 0x8c, 0x6f, 0x02, 0xc5, 0x10, 0x03, 0x3a, 0xda, 0xbc,
+ 0x0d, 0x52, 0x2c, 0x87, 0xf8, 0x47, 0x32, 0x64, 0x74, 0xb5, 0x84, 0x2f,
+ 0xe5, 0x50, 0x0c, 0xc6, 0xf7, 0x14, 0x25, 0x20, 0x76, 0xd2, 0xcf, 0x14,
+ 0xe3, 0x6e, 0xef, 0x1e, 0x54, 0x83, 0xa6, 0xf4, 0x13, 0x62, 0x22, 0xf0,
+ 0x97, 0x12, 0xf1, 0x2e, 0x49, 0x40, 0x4c, 0x7d, 0xe5, 0x2f, 0xa5, 0x0e,
+ 0x1c, 0x2c, 0xce, 0x5e, 0xfe, 0x55, 0xb2, 0xee, 0x71, 0x7a, 0x89, 0xfd,
+ 0x60, 0xf3, 0xe6, 0x36, 0xc5, 0xd7, 0x5b, 0xd1, 0xb3, 0x72, 0x4d, 0x55,
+ 0x65, 0xf6, 0x47, 0x16, 0x8e, 0x7e, 0xd1, 0xb3, 0x2e, 0xfe, 0xdc, 0xfb,
+ 0x0e, 0x50, 0x3c, 0x99, 0x1c, 0x5c, 0x2e, 0x4a, 0xce, 0x9f, 0x78, 0x49,
+ 0x32, 0x7c, 0x48, 0x99, 0x6a, 0x6c, 0x1d, 0xd0, 0x09, 0x08, 0x26, 0x02,
+ 0x2d, 0x09, 0xf9, 0xff, 0x1a, 0xcd, 0xe8, 0xa2, 0xc8, 0x81, 0xbf, 0xf1,
+ 0x28, 0x6f, 0xf2, 0xf5, 0xd1, 0x4e, 0xa3, 0x0f, 0xbd, 0x15, 0xc2, 0x3e,
+ 0x33, 0x32, 0xdf, 0x04, 0x2d, 0x5f, 0x6b, 0xb7, 0x95, 0xbf, 0x88, 0x2f,
+ 0xa1, 0x2e, 0xf1, 0x51, 0x59, 0xd2, 0x02, 0xf7, 0x22, 0xfb, 0x87, 0x36,
+ 0x39, 0xe7, 0xa2, 0xb9, 0x5e, 0x34, 0x71, 0xda, 0xf7, 0x15, 0x23, 0x2c,
+ 0xed, 0xae, 0xbd, 0x88, 0xaf, 0xf1, 0x8d, 0xa1, 0x25, 0x9a, 0xc2, 0x61,
+ 0xbc, 0xa3, 0xf6, 0x44, 0xd0, 0x9c, 0x57, 0x19, 0x19, 0x8a, 0x30, 0xee,
+ 0x00, 0xab, 0x8f, 0x6d, 0xd2, 0xb4, 0x08, 0x64, 0x08, 0xc9, 0x4e, 0xb9,
+ 0x1e, 0x6f, 0x28, 0xcc, 0xc4, 0x0c, 0x4e, 0x4d, 0xd4, 0x40, 0x0f, 0x04,
+ 0x8e, 0xba, 0x68, 0xb9, 0x71, 0x3b, 0x98, 0x9c, 0x4f, 0xeb, 0x9e, 0x29,
+ 0xff, 0xd3, 0xb6, 0x2d, 0xe5, 0x14, 0xda, 0x25, 0x27, 0x93, 0xb3, 0x6e,
+ 0x63, 0x8f, 0x25, 0x41, 0xb3, 0xc6, 0xa3, 0xe6, 0x76, 0x98, 0x46, 0xd1,
+ 0xbc, 0x54, 0x8d, 0x78, 0xe4, 0xc6, 0x15, 0xf7, 0xc1, 0xe6, 0xeb, 0x61,
+ 0xa9, 0x41, 0x86, 0x65, 0x3e, 0xb9, 0xa2, 0x69, 0x19, 0x42, 0x77, 0xa9,
+ 0x64, 0xa9, 0x55, 0xc6, 0x62, 0x77, 0x41, 0x99, 0x38, 0x7e, 0xfb, 0x46,
+ 0xd2, 0x9d, 0x02, 0xf3, 0x6e, 0x07, 0x45, 0x70, 0x49, 0x98, 0xff, 0xd2,
+ 0x88, 0x57, 0xa3, 0x63, 0x6a, 0x37, 0x84, 0xdc, 0xe7, 0x30, 0x14, 0x02,
+ 0xb2, 0xb1, 0x82, 0x2d, 0x87, 0x0d, 0x5e, 0xf4, 0xc5, 0xe5, 0x84, 0x02,
+ 0x02, 0xdf, 0xf2, 0x4e, 0x69, 0x52, 0x4f, 0x40, 0xfc, 0x01, 0x16, 0x53,
+ 0xb0, 0xca, 0x33, 0x80, 0x98, 0xe3, 0x3a, 0x1b, 0x50, 0x45, 0x82, 0x1f,
+ 0xa9, 0x39, 0x94, 0xe5, 0xf9, 0x27, 0x52, 0x01, 0xe9, 0x53, 0xf2, 0x0a,
+ 0x89, 0xab, 0x8a, 0x58, 0x00, 0xf5, 0xbc, 0x79, 0x35, 0x44, 0x27, 0xef,
+ 0xc2, 0x07, 0xa5, 0x42, 0xa9, 0xd2, 0xc2, 0xb0, 0x78, 0x8b, 0x81, 0xe6,
+ 0x00, 0x07, 0x2d, 0x94, 0xe0, 0x21, 0x56, 0x6e, 0x79, 0x87, 0x20, 0x53,
+ 0x8f, 0xea, 0x48, 0x7f, 0x3e, 0x48, 0xf6, 0x09, 0x82, 0x93, 0x22, 0x35,
+ 0x5c, 0x6d, 0x1b, 0xc1, 0xcd, 0x48, 0xbb, 0x6a, 0xd7, 0xe5, 0x07, 0x31,
+ 0x5c, 0x8a, 0x7a, 0x96, 0x2e, 0x43, 0x6e, 0x38, 0x2d, 0x00, 0x51, 0x9d,
+ 0x12, 0x65, 0x5c, 0x4e, 0xcb, 0xcb, 0x44, 0xe4, 0xa9, 0xe2, 0xf9, 0x35,
+ 0xb6, 0xdd, 0xbf, 0x0f, 0x18, 0xa9, 0x57, 0xe8, 0x3f, 0xce, 0xf8, 0x09,
+ 0x04, 0xcd, 0xff, 0x4f, 0x9b, 0x30, 0x57, 0x48, 0xd5, 0xce, 0x4f, 0x46,
+ 0x1a, 0xae, 0xa6, 0x2c, 0x5f, 0x72, 0x4d, 0xaf, 0x66, 0x41, 0x42, 0x70,
+ 0xe7, 0xac, 0xd4, 0xba, 0x5c, 0x5f, 0x2f, 0xc4, 0xa3, 0xfe, 0x17, 0xf6,
+ 0xeb, 0xdf, 0x38, 0x20, 0x05, 0x16, 0xfb, 0xdf, 0x8d, 0xf8, 0x9f, 0x22,
+ 0x41, 0xab, 0xbc, 0xa8, 0x87, 0xe1, 0x96, 0xe0, 0x42, 0x2a, 0x65, 0x3f,
+ 0x56, 0x96, 0xf0, 0x5a, 0xdd, 0xeb, 0x46, 0x23, 0x29, 0x58, 0xe7, 0xb2,
+ 0x32, 0x37, 0x99, 0x7f, 0x4d, 0x33, 0x52, 0x7e, 0x0d, 0x5f, 0xce, 0x79,
+ 0x3d, 0x48, 0x19, 0x55, 0x8a, 0xb9, 0x1d, 0xfd, 0xe7, 0x36, 0xb8, 0x0f,
+ 0xf1, 0xa8, 0xa2, 0xdb, 0x0e, 0xd9, 0x35, 0x11, 0xa0, 0xd0, 0xa9, 0xf3,
+ 0x16, 0xea, 0x2b, 0x2b, 0x57, 0x5d, 0x40, 0x92, 0x25, 0xff, 0x38, 0x70,
+ 0xeb, 0x3a, 0x01, 0xcf, 0xb6, 0x73, 0x4e, 0x73, 0xa6, 0x2b, 0xdf, 0xae,
+ 0x52, 0xf2, 0xec, 0xde, 0xd7, 0xb7, 0x23, 0x1d, 0xc2, 0x9c, 0x40, 0x5d,
+ 0xd3, 0x83, 0x8a, 0x92, 0x2e, 0xde, 0x5e, 0xb5, 0xcb, 0x31, 0x95, 0xa1,
+ 0x3e, 0x43, 0xc9, 0xfa, 0x0e, 0x64, 0x77, 0xe1, 0x1e, 0x9d, 0xd2, 0x78,
+ 0xc6, 0x5a, 0x30, 0xe5, 0x50, 0xf2, 0xcd, 0x8c, 0x1e, 0x2c, 0x32, 0xf4,
+ 0x03, 0x25, 0xe2, 0x67, 0xd5, 0xe5, 0x2b, 0x31, 0x4f, 0x5a, 0xea, 0xd0,
+ 0xe8, 0x25, 0x6b, 0xf5, 0xbe, 0x5d, 0x72, 0xec, 0xc2, 0xcd, 0x2f, 0x12,
+ 0x95, 0x42, 0xda, 0xc9, 0x70, 0x8d, 0xa8, 0x20, 0x23, 0x22, 0x37, 0x28,
+ 0x28, 0xdb, 0xa6, 0xf9, 0xe3, 0x35, 0xd1, 0x68, 0x53, 0x82, 0x9c, 0x2e,
+ 0x65, 0xa2, 0xbc, 0x62, 0x06, 0xdd, 0x6e, 0x27, 0xa0, 0x14, 0xe3, 0xf6,
+ 0xac, 0x8f, 0x82, 0xdf, 0x2a, 0x1a, 0xbb, 0x8f, 0x2c, 0xd8, 0x8f, 0x8a,
+ 0x06, 0xca, 0xa6, 0xf5, 0x30, 0x41, 0xb8, 0xbf, 0xfe, 0x7d, 0x53, 0x40,
+ 0xc3, 0x3f, 0x3a, 0x1b, 0xa7, 0xc0, 0x64, 0xb1, 0x2a, 0x51, 0xf1, 0x04,
+ 0xbd, 0x19, 0xb9, 0xaf, 0x17, 0xf2, 0x9e, 0x5a, 0x1e, 0x40, 0x78, 0xc3,
+ 0xd3, 0xef, 0x96, 0x78, 0x5d, 0x2f, 0x1a, 0xf0, 0x6f, 0xaf, 0x72, 0x52,
+ 0xae, 0x61, 0x93, 0x4f, 0x36, 0x76, 0x34, 0x8b, 0xf4, 0x0e, 0xd5, 0xd0,
+ 0xee, 0xe7, 0x8f, 0x91, 0x0d, 0x49, 0x7a, 0x45, 0x31, 0xa2, 0x60, 0xd9,
+ 0x8f, 0x51, 0x5c, 0x3f, 0x92, 0xca, 0x4e, 0x0d, 0x92, 0x04, 0x5d, 0x17,
+ 0x56, 0xa6, 0x02, 0x6c, 0x9b, 0x59, 0x32, 0x2c, 0x24, 0x5d, 0x86, 0x85,
+ 0x73, 0x1b, 0x9e, 0x56, 0xcf, 0x96, 0x08, 0x07, 0xc8, 0x5d, 0x78, 0x1d,
+ 0x51, 0x5d, 0x2a, 0x3f, 0x15, 0x40, 0xde, 0x32, 0xe5, 0x79, 0x2e, 0x9f,
+ 0x0b, 0x0b, 0x5a, 0xa4, 0x6b, 0xb3, 0xba, 0x69, 0xee, 0x77, 0x36, 0x08,
+ 0xf4, 0x8d, 0x00, 0x94, 0x86, 0x53, 0x7e, 0xd1, 0xee, 0x64, 0x7c, 0x88,
+ 0x9d, 0xf3, 0x01, 0xfd, 0xfc, 0xf6, 0x9d, 0xb4, 0xe6, 0xac, 0x08, 0x29,
+ 0x2c, 0x86, 0xb3, 0xe1, 0xf7, 0xb0, 0x7b, 0x0d, 0x9d, 0x31, 0xe1, 0x7b,
+ 0x9a, 0x35, 0x0a, 0x6c, 0x97, 0x19, 0xcc, 0x09, 0x07, 0x81, 0x4d, 0xbe,
+ 0xf0, 0xe9, 0x56, 0xb0, 0xd0, 0x4e, 0x4d, 0x18, 0x9b, 0x07, 0xe5, 0xdd,
+ 0x80, 0x04, 0x68, 0x70, 0x83, 0xae, 0xb5, 0x6e, 0x28, 0x80, 0x1a, 0xac,
+ 0xab, 0xe8, 0xcb, 0x56, 0xef, 0xab, 0x34, 0x48, 0x17, 0xe8, 0xca, 0x74,
+ 0x6e, 0xff, 0xbc, 0x9f, 0x0c, 0xcb, 0xcb, 0x7b, 0xe0, 0x16, 0x93, 0x5c,
+ 0xdf, 0x18, 0x51, 0x3b, 0x97, 0x57, 0x6e, 0xef, 0xac, 0x1d, 0xc4, 0x93,
+ 0xc1, 0x5d, 0x29, 0x32, 0x98, 0x18, 0x9e, 0x3a, 0x0d, 0x45, 0x90, 0xeb,
+ 0xf8, 0xb9, 0xbe, 0xd4, 0x35, 0x6f, 0xb5, 0xea, 0xe7, 0xf6, 0xc7, 0x6f,
+ 0x2b, 0xf1, 0xe7, 0x40, 0x98, 0xe7, 0x04, 0x5e, 0x1b, 0x1c, 0x19, 0x5f,
+ 0xf6, 0x6a, 0xce, 0x56, 0x07, 0x18, 0xcf, 0x78, 0xca, 0x25, 0xb7, 0x35,
+ 0xa3, 0xf0, 0xf7, 0x3b, 0xdd, 0x1a, 0x16, 0x5d, 0x97, 0x3e, 0x7d, 0x21,
+ 0xce, 0x62, 0x6a, 0xf1, 0x1a, 0xcc, 0x8b, 0xb5, 0x19, 0xd1, 0x03, 0x94,
+ 0x33, 0x86, 0xe2, 0xc2, 0x43, 0xb5, 0xa8, 0xdc, 0x4c, 0xd5, 0x67, 0x29,
+ 0x2e, 0x4e, 0x81, 0xe6, 0x06, 0x1b, 0x81, 0x39, 0xd1, 0x66, 0xcb, 0x18,
+ 0x7c, 0xd0, 0x04, 0x17, 0xdd, 0x83, 0x02, 0xbf, 0xf5, 0xaa, 0xe9, 0xec,
+ 0xdb, 0x1a, 0xc9, 0xca, 0x9d, 0x53, 0xe7, 0x01, 0xc8, 0xa7, 0xcf, 0x49,
+ 0xc0, 0x8f, 0x53, 0x40, 0x28, 0x51, 0x62, 0x5f, 0xd5, 0xf9, 0x6a, 0x01,
+ 0x7b, 0x7f, 0x09, 0x13, 0x57, 0xf9, 0xc9, 0x56, 0xd6, 0x88, 0xbb, 0x13,
+ 0x7b, 0x53, 0xcc, 0x79, 0x7e, 0x2e, 0x13, 0x42, 0xfc, 0x37, 0x48, 0xf0,
+ 0x04, 0x0a, 0x5b, 0x88, 0x74, 0xd1, 0x85, 0x56, 0x8c, 0x92, 0xf4, 0x5a,
+ 0x99, 0x1f, 0x3a, 0xbe, 0x57, 0xcc, 0xa7, 0x77, 0xb5, 0x27, 0x2c, 0x09,
+ 0x0d, 0x8f, 0x41, 0x67, 0xd5, 0xdc, 0x3a, 0x55, 0x3d, 0xd5, 0x13, 0x96,
+ 0x64, 0xe4, 0xb8, 0xa6, 0x5a, 0xa3, 0x22, 0x84, 0xae, 0x7a, 0x24, 0xee,
+ 0x93, 0x86, 0x7d, 0x52, 0x31, 0xb4, 0xb0, 0x89, 0x04, 0x46, 0x8d, 0x86,
+ 0x63, 0xcb, 0xd4, 0xd2, 0xaf, 0x0a, 0x69, 0xad, 0xa9, 0x96, 0x42, 0xf1,
+ 0x1e, 0xef, 0x07, 0xa9, 0x24, 0xb7, 0xca, 0xfa, 0xda, 0x68, 0x51, 0xb6,
+ 0xde, 0x6f, 0x5d, 0x46, 0x79, 0xc1, 0xa6, 0xbe, 0x43, 0x9a, 0x90, 0x41,
+ 0xd1, 0xc4, 0x99, 0x5b, 0x3d, 0xd4, 0x25, 0xb9, 0xa4, 0xdb, 0xfc, 0x29,
+ 0xfd, 0x27, 0x26, 0xeb, 0x23, 0x6f, 0xa3, 0xdf, 0x70, 0x7b, 0x07, 0xae,
+ 0x96, 0x58, 0x3a, 0xe7, 0x2b, 0x26, 0x31, 0xd8, 0xb9, 0xf5, 0x45, 0x10,
+ 0xc0, 0x2e, 0x33, 0x98, 0xe5, 0x24, 0xcf, 0xc4, 0x54, 0x6e, 0x12, 0x5b,
+ 0x1b, 0xbe, 0xc2, 0x4a, 0x56, 0x03, 0x76, 0x1e, 0x87, 0x5e, 0x2f, 0x9e,
+ 0xe5, 0xd7, 0x90, 0x4e, 0x45, 0x5f, 0x42, 0x56, 0x49, 0x2c, 0xee, 0x52,
+ 0xa0, 0x5a, 0xb4, 0xc5, 0xc2, 0x2d, 0x62, 0xd7, 0xc6, 0xc8, 0x75, 0xee,
+ 0x9e, 0x6a, 0x90, 0x1a, 0x8e, 0x69, 0x3f, 0x93, 0x26, 0x70, 0x8c, 0xaa,
+ 0x55, 0x82, 0x51, 0x80, 0x59, 0x23, 0xc8, 0xec, 0x9e, 0xc3, 0x9b, 0x06,
+ 0xd6, 0x21, 0x19, 0x45, 0xab, 0xa4, 0x33, 0x0a, 0x0e, 0x1d, 0x0e, 0xdc,
+ 0x7c, 0x4d, 0x9c, 0xa4, 0xa7, 0xfa, 0x49, 0x67, 0x9a, 0x5b, 0xc0, 0x7b,
+ 0x59, 0x9b, 0x97, 0xc5, 0xf6, 0x76, 0x03, 0x22, 0x17, 0xa4, 0xf5, 0x35,
+ 0x34, 0x25, 0xcd, 0xba, 0xc3, 0x24, 0xec, 0xe5, 0xe5, 0x0e, 0x86, 0xbd,
+ 0xa9, 0xdf, 0xd0, 0xfd, 0x82, 0xf9, 0x8a, 0x18, 0x29, 0x51, 0x00, 0xb6,
+ 0xff, 0xf5, 0x47, 0x6d, 0xf2, 0x19, 0xf0, 0xed, 0x4e, 0xa0, 0x4d, 0x48,
+ 0x84, 0xa1, 0xb8, 0x94, 0xc2, 0xf1, 0x48, 0x16, 0x87, 0xbd, 0x73, 0x18,
+ 0xa7, 0x79, 0x64, 0x7a, 0x07, 0xc8, 0xc4, 0x52, 0x52, 0xab, 0x57, 0xfd,
+ 0xec, 0x77, 0xf8, 0x1d, 0x54, 0x11, 0xf5, 0x45, 0x4a, 0x37, 0x8e, 0x31,
+ 0xca, 0xb9, 0x2a, 0x8a, 0xe8, 0x2f, 0x0d, 0x19, 0x01, 0x35, 0xcd, 0x77,
+ 0x21, 0xa8, 0xeb, 0x04, 0x87, 0xa1, 0x59, 0x28, 0x79, 0xd7, 0xc7, 0xd0,
+ 0x2a, 0x21, 0xaf, 0xc0, 0x02, 0xac, 0x27, 0xd5, 0xf0, 0x28, 0xd2, 0x09,
+ 0x4c, 0x14, 0x4f, 0xf4, 0xcc, 0xa6, 0x8b, 0x03, 0xe6, 0xcb, 0x90, 0xaf,
+ 0xb8, 0x1c, 0xf5, 0xd7, 0xb6, 0x87, 0xa2, 0xd9, 0x78, 0x96, 0xa6, 0xc0,
+ 0x65, 0x61, 0xcf, 0x46, 0x82, 0x9b, 0x17, 0x39, 0xe1, 0xc0, 0x7f, 0xa7,
+ 0x87, 0x50, 0xd0, 0x05, 0xcd, 0xa4, 0xbb, 0xdf, 0xc9, 0xe0, 0x59, 0x1e,
+ 0x70, 0xa4, 0xa3, 0x9c, 0x26, 0x80, 0xaa, 0x6c, 0x21, 0x4a, 0xa1, 0xb9,
+ 0x35, 0x61, 0xff, 0xb3, 0x5d, 0x3c, 0x1a, 0x19, 0xbc, 0xf7, 0x95, 0xf1,
+ 0x37, 0x55, 0x45, 0xfe, 0x2e, 0x85, 0x96, 0x39, 0xa5, 0xc8, 0x82, 0x6b,
+ 0x73, 0xaf, 0x23, 0xe2, 0x5c, 0xb3, 0x68, 0xc5, 0x78, 0xb3, 0x04, 0x49,
+ 0x99, 0x72, 0x9c, 0x3f, 0x08, 0xf5, 0x02, 0x3b, 0x89, 0x07, 0x3f, 0x38,
+ 0x2c, 0xcd, 0x9a, 0x7a, 0xdb, 0xfd, 0xe8, 0x84, 0xc9, 0x50, 0xd2, 0x67,
+ 0x02, 0x63, 0xbe, 0x57, 0x2d, 0xe4, 0x00, 0x02, 0xa2, 0x10, 0x34, 0x25,
+ 0xcf, 0x41, 0x45, 0x49, 0x01, 0xef, 0xb5, 0xd7, 0x43, 0x99, 0x12, 0x25,
+ 0xe8, 0xb9, 0x0c, 0x5a, 0xde, 0xfd, 0x91, 0xcf, 0xf2, 0x53, 0x9b, 0xf0,
+ 0x13, 0x5e, 0x70, 0x72, 0x39, 0x3e, 0x3c, 0x18, 0xf3, 0x1a, 0x73, 0x42,
+ 0x00, 0xd2, 0x07, 0xff, 0xdf, 0x66, 0xfb, 0x2b, 0x50, 0x62, 0x2c, 0x1c,
+ 0x71, 0x4f, 0x00, 0x44, 0xc5, 0xa3, 0xb3, 0xad, 0x09, 0xd9, 0x26, 0x51,
+ 0xe8, 0xa9, 0x39, 0x1f, 0x0e, 0xa6, 0xb2, 0x03, 0x17, 0x34, 0x07, 0x6a,
+ 0x22, 0xdf, 0xfb, 0xcf, 0x9f, 0xb1, 0xc6, 0x38, 0xa7, 0x92, 0xd6, 0x71,
+ 0x84, 0x76, 0x3d, 0xaa, 0x21, 0x88, 0x0a, 0x37, 0x46, 0x51, 0x41, 0x60,
+ 0xc9, 0x8b, 0x31, 0x8c, 0x94, 0x5b, 0x37, 0xae, 0x71, 0x31, 0xdf, 0xb6,
+ 0x8b, 0xaa, 0xa7, 0x68, 0x86, 0xa3, 0x2f, 0xcf, 0xbb, 0x2e, 0x40, 0xd1,
+ 0x36, 0xb2, 0xa2, 0xdb, 0x2c, 0x1a, 0x78, 0x34, 0xdd, 0x1b, 0xa4, 0x53,
+ 0xe7, 0xcc, 0x42, 0xfe, 0x84, 0xf0, 0x32, 0x0d, 0xfc, 0x0c, 0x4a, 0x9f,
+ 0x1d, 0x3f, 0xcc, 0x19, 0x40, 0x08, 0x36, 0x01, 0x74, 0x1a, 0xbc, 0x16,
+ 0x73, 0x3a, 0xc6, 0xb1, 0x1c, 0x06, 0xaa, 0xe7, 0xe2, 0xca, 0x01, 0x13,
+ 0x79, 0x71, 0xb0, 0x1d, 0x0b, 0xb2, 0x10, 0x10, 0x2e, 0xe1, 0x8b, 0x96,
+ 0x9f, 0xb2, 0xe1, 0xcf, 0x91, 0x62, 0x06, 0x66, 0xf4, 0x07, 0x7f, 0xbc,
+ 0xb5, 0xd4, 0xc5, 0xa8, 0x2e, 0xee, 0xb2, 0x8d, 0x9a, 0xa2, 0x23, 0xaf,
+ 0xd4, 0x86, 0x8e, 0x03, 0xe6, 0x96, 0x8a, 0x29, 0x87, 0x47, 0xa3, 0x63,
+ 0x81, 0x2b, 0x17, 0xd1, 0x24, 0xa7, 0xc1, 0xec, 0x7d, 0x76, 0x6d, 0x62,
+ 0xab, 0x88, 0x16, 0x5e, 0x63, 0x92, 0x74, 0x78, 0xee, 0x49, 0x14, 0x18,
+ 0x69, 0x8b, 0x02, 0x72, 0xc5, 0x21, 0x45, 0x03, 0xe0, 0xa1, 0xde, 0xd1,
+ 0x9d, 0x25, 0xb1, 0x1e, 0x9b, 0x45, 0x6b, 0xd7, 0x80, 0x0d, 0x04, 0x68,
+ 0x15, 0x5f, 0x9b, 0x27, 0xab, 0x78, 0x6b, 0x11, 0xa8, 0x7d, 0x29, 0x39,
+ 0x6f, 0x1d, 0x12, 0xc9, 0x3b, 0xc0, 0x12, 0x96, 0xa0, 0xf2, 0x27, 0xcc,
+ 0x97, 0x22, 0x6c, 0x55, 0xc2, 0xfd, 0xc2, 0xe0, 0xa6, 0x99, 0xaf, 0x44,
+ 0xe5, 0x96, 0xa8, 0x59, 0xe4, 0xb0, 0xfc, 0xa5, 0x68, 0x24, 0x50, 0x60,
+ 0xfa, 0xba, 0x20, 0x8f, 0x75, 0xab, 0xbe, 0xe5, 0x32, 0x02, 0x3b, 0xd4,
+ 0x83, 0x19, 0xeb, 0x0d, 0x19, 0x14, 0x10, 0x7d, 0xb7, 0xc0, 0x58, 0x62,
+ 0xa2, 0xb6, 0x75, 0xbf, 0x93, 0x78, 0xff, 0x40, 0x06, 0x1c, 0x62, 0x4a,
+ 0x18, 0x28, 0xb6, 0xcf, 0xf3, 0x6b, 0xee, 0xf3, 0x3e, 0xd9, 0x59, 0xf7,
+ 0x95, 0xd7, 0x91, 0x2f, 0x5c, 0x4a, 0xd6, 0xe4, 0x44, 0xa4, 0x51, 0x0d,
+ 0xec, 0xa1, 0x26, 0xd2, 0xc6, 0x15, 0xd5, 0x43, 0xff, 0xac, 0x70, 0x98,
+ 0xbf, 0xa2, 0xec, 0x43, 0xf9, 0x14, 0xf2, 0x9d, 0xc3, 0xaa, 0x42, 0x88,
+ 0xd0, 0x96, 0x78, 0xd9, 0x8a, 0x0e, 0x3e, 0x1c, 0xc4, 0xef, 0x49, 0x24,
+ 0x2a, 0xf7, 0x4f, 0xf3, 0xc1, 0xeb, 0x18, 0x17, 0x3c, 0x18, 0x58, 0x86,
+ 0xa3, 0x3a, 0x3f, 0x41, 0x9a, 0x04, 0x4e, 0xed, 0x64, 0xfe, 0x46, 0x36,
+ 0x4f, 0x62, 0xff, 0xae, 0x6c, 0x08, 0xa2, 0x2a, 0x76, 0xe4, 0x52, 0xaa,
+ 0x7c, 0xe8, 0xa6, 0xdd, 0x08, 0x51, 0xe5, 0xf4, 0x7d, 0x84, 0x61, 0x75,
+ 0xa7, 0x90, 0x3c, 0x5e, 0x67, 0x3d, 0xec, 0x11, 0xbd, 0x1b, 0x87, 0x03,
+ 0x48, 0x92, 0x58, 0x90, 0x6b, 0x90, 0x47, 0xfb, 0x30, 0x87, 0x6d, 0x0f,
+ 0x56, 0x78, 0x6a, 0x9b, 0x5d, 0xe9, 0xb5, 0xed, 0xbc, 0xfb, 0xa3, 0x58,
+ 0x04, 0x67, 0x2c, 0x94, 0x47, 0xed, 0xc3, 0x78, 0x77, 0x19, 0x25, 0x65,
+ 0xa1, 0xb9, 0x34, 0x34, 0xfe, 0x84, 0x29, 0x5c, 0x31, 0xc9, 0x57, 0x1e,
+ 0xbd, 0xa1, 0xd7, 0x6d, 0x7e, 0x11, 0x1e, 0xf9, 0x5e, 0xa8, 0x19, 0xda,
+ 0xe3, 0xad, 0xef, 0x4e, 0x0a, 0x69, 0x55, 0x6e, 0xb9, 0xbd, 0x6d, 0x02,
+ 0x14, 0x56, 0xff, 0xfe, 0xc2, 0x84, 0xbc, 0x2b, 0xc4, 0x21, 0x1d, 0xb3,
+ 0x39, 0x40, 0x09, 0x06, 0xb2, 0x0b, 0x64, 0x1b, 0xfc, 0xb1, 0x9e, 0x21,
+ 0x8d, 0x49, 0xd1, 0x67, 0x52, 0x0d, 0xa5, 0xae, 0x69, 0xbc, 0x37, 0xbe,
+ 0xff, 0xd0, 0x95, 0xad, 0x3e, 0x76, 0xbc, 0x82, 0x89, 0x15, 0x0a, 0x4e,
+ 0x4f, 0x7c, 0x5e, 0xa4, 0xda, 0xb4, 0xb1, 0x9d, 0x80, 0x57, 0x7b, 0x1b,
+ 0x56, 0x1b, 0xee, 0x25, 0x53, 0x1c, 0xeb, 0x35, 0x5d, 0x8f, 0x25, 0x4e,
+ 0x62, 0x26, 0xc2, 0x50, 0x2a, 0x9f, 0x27, 0x84, 0x4c, 0x21, 0x31, 0x18,
+ 0x54, 0xf7, 0xe3, 0x00, 0xe1, 0x39, 0xa6, 0xa1, 0x99, 0x93, 0x5f, 0xc1,
+ 0x95, 0x13, 0x6d, 0x32, 0x9e, 0x02, 0x53, 0x67, 0x87, 0x13, 0xdb, 0x41,
+ 0x1c, 0xef, 0x66, 0x6a, 0xc8, 0xf8, 0x6f, 0xeb, 0x51, 0xea, 0xed, 0xe2,
+ 0x5d, 0x5a, 0x26, 0xde, 0xa8, 0x53, 0xb8, 0x8e, 0x3b, 0x5a, 0x93, 0xf9,
+ 0xec, 0x1c, 0xaf, 0x12, 0x9d, 0x69, 0xb8, 0x6c, 0xf9, 0x77, 0xd9, 0xa6,
+ 0x45, 0x71, 0x7b, 0xd0, 0x16, 0x7a, 0xe2, 0x32, 0x40, 0x2d, 0xe3, 0x34,
+ 0x41, 0x9c, 0x4c, 0x2d, 0x19, 0x82, 0x11, 0x90, 0x39, 0xea, 0x9e, 0xd1,
+ 0x91, 0x6f, 0x06, 0x9f, 0x09, 0x7d, 0x26, 0x14, 0x35, 0x0b, 0xc2, 0xc1,
+ 0x24, 0x4b, 0xc7, 0xdc, 0xb8, 0x0a, 0x98, 0x94, 0x8e, 0x7a, 0x04, 0x7b,
+ 0x08, 0x95, 0x0e, 0x6f, 0x6c, 0x42, 0x1a, 0xd4, 0x2b, 0x93, 0x16, 0xe9,
+ 0xee, 0x8f, 0xff, 0x36, 0xde, 0x77, 0x5b, 0xec, 0x60, 0x34, 0x99, 0xbe,
+ 0x0a, 0x29, 0xdc, 0x8c, 0x1e, 0x5a, 0xc4, 0x8b, 0x01, 0x97, 0xd4, 0xd1,
+ 0x37, 0xe7, 0x69, 0x29, 0xe6, 0x8a, 0x69, 0xb9, 0xe0, 0xc2, 0x0d, 0x62,
+ 0x26, 0xd8, 0xa6, 0x8a, 0x09, 0xd6, 0x87, 0xfc, 0xea, 0x18, 0x1b, 0x55,
+ 0x31, 0xae, 0x48, 0xa7, 0x3f, 0x72, 0xc8, 0xf1, 0xe1, 0x2f, 0x32, 0x10,
+ 0x7d, 0xf8, 0xa0, 0xd4, 0x57, 0xd1, 0x7b, 0x80, 0x60, 0x3d, 0x20, 0x1a,
+ 0x53, 0x88, 0x5a, 0xc2, 0xb8, 0x86, 0xc3, 0xe2, 0x3b, 0x01, 0x95, 0xe6,
+ 0xbe, 0x0b, 0x36, 0x60, 0xaa, 0x72, 0xef, 0x18, 0x0f, 0x52, 0x4d, 0x56,
+ 0x78, 0x79, 0x9c, 0xaf, 0xb1, 0x23, 0x61, 0x4c, 0x5b, 0x2d, 0x9c, 0x96,
+ 0x1a, 0x09, 0x17, 0x4d, 0x87, 0x8c, 0xe6, 0xfb, 0xbd, 0x9f, 0x62, 0x13,
+ 0xce, 0x61, 0x4b, 0x4e, 0x28, 0xf6, 0xa3, 0x19, 0xe6, 0x9e, 0xf7, 0x7d,
+ 0x19, 0xde, 0x05, 0x39, 0xf8, 0x0b, 0xbc, 0x47, 0xcb, 0x64, 0xa8, 0xf2,
+ 0x26, 0x97, 0x73, 0xdb, 0x7b, 0x8b, 0x64, 0xc1, 0xec, 0x10, 0xc3, 0xce,
+ 0xf4, 0xfb, 0x74, 0x33, 0xeb, 0x48, 0xd3, 0x86, 0x04, 0x6b, 0x1a, 0xa6,
+ 0xd2, 0x3c, 0x4a, 0xa2, 0x91, 0x35, 0x05, 0x21, 0x12, 0x93, 0xdb, 0x4e,
+ 0xf3, 0x74, 0x63, 0x32, 0xd5, 0x15, 0xb3, 0x1b, 0xa1, 0x0c, 0x72, 0xfc,
+ 0x35, 0x79, 0xf5, 0x39, 0x4a, 0x0b, 0x6b, 0x35, 0xd4, 0xa8, 0x59, 0x8e,
+ 0xe1, 0x41, 0x5f, 0x80, 0xc0, 0x7e, 0x8c, 0xea, 0x61, 0x71, 0x03, 0x6d,
+ 0xd0, 0x6d, 0x03, 0xec, 0x5c, 0x50, 0xec, 0xea, 0x70, 0x75, 0x65, 0x6a,
+ 0xc1, 0x5d, 0xbc, 0x4f, 0xf5, 0xc9, 0xaa, 0x3f, 0x84, 0x90, 0x5d, 0x52,
+ 0x5b, 0xde, 0xc4, 0xa8, 0x80, 0xbb, 0xff, 0x1b, 0x21, 0xd3, 0xc0, 0x32,
+ 0x4c, 0xea, 0x2f, 0xd1, 0xc4, 0x8d, 0x41, 0x5d, 0x89, 0x5c, 0xb9, 0xc3,
+ 0x5c, 0x92, 0x7e, 0xd8, 0x91, 0xed, 0xdc, 0xc3, 0xfe, 0x78, 0xb8, 0xd0,
+ 0x4c, 0x29, 0x9e, 0x1e, 0x52, 0xe8, 0x1a, 0x89, 0xa9, 0xb1, 0xd3, 0x9f,
+ 0x4d, 0x69, 0xf1, 0x02, 0x95, 0xd6, 0x0e, 0xc5, 0xea, 0x88, 0xe6, 0x3b,
+ 0x20, 0x37, 0xd5, 0xfc, 0xec, 0x38, 0xcc, 0xd1, 0x24, 0x29, 0x54, 0x13,
+ 0xd8, 0xb9, 0x55, 0x35, 0x72, 0xd9, 0x21, 0x43, 0xcd, 0xfa, 0x83, 0xa1,
+ 0x82, 0x73, 0x52, 0xf5, 0x05, 0x34, 0xfa, 0xe6, 0xf2, 0xfc, 0xeb, 0xe2,
+ 0xaa, 0xc7, 0x0f, 0x6a, 0xeb, 0xb9, 0x74, 0xf0, 0xde, 0x04, 0xd6, 0xc0,
+ 0xf7, 0x5e, 0xdb, 0x3e, 0xc4, 0xbf, 0x1b, 0xc9, 0x59, 0xf0, 0x55, 0x0a,
+ 0x8e, 0xdb, 0x84, 0xaf, 0x5d, 0xcf, 0x4d, 0xe8, 0xed, 0xc3, 0x01, 0xd1,
+ 0xb4, 0xd6, 0xe0, 0x19, 0xb9, 0x1d, 0x6c, 0x26, 0x9d, 0xdb, 0xac, 0xb3,
+ 0x60, 0x9b, 0xa4, 0xa9, 0xfb, 0xb4, 0xba, 0x4d, 0x0e, 0xb3, 0x38, 0x60,
+ 0xb1, 0x26, 0x76, 0x74, 0xb8, 0x4b, 0x42, 0xa3, 0x93, 0x7a, 0xca, 0xc9,
+ 0x14, 0xb3, 0xce, 0xd8, 0x4b, 0xc9, 0x51, 0x75, 0x4e, 0x87, 0xb0, 0xc7,
+ 0x0c, 0x53, 0xa3, 0xc3, 0x06, 0xd2, 0x93, 0xaa, 0xb5, 0x57, 0xad, 0xbc,
+ 0x02, 0xf8, 0x0d, 0xa8, 0x22, 0x63, 0x2e, 0x61, 0x56, 0xd1, 0xa9, 0x35,
+ 0x69, 0x83, 0x45, 0x82, 0xe1, 0x83, 0x4b, 0xae, 0x45, 0x3d, 0xdc, 0x83,
+ 0x87, 0x58, 0x1f, 0xe2, 0x69, 0xb8, 0x16, 0x55, 0xcb, 0xcc, 0x51, 0xc0,
+ 0xe7, 0x92, 0x9b, 0x62, 0x64, 0x57, 0x59, 0x01, 0x80, 0x10, 0xc0, 0xa9,
+ 0x26, 0x20, 0xa8, 0x10, 0x0b, 0xbe, 0x1f, 0x71, 0x51, 0xe3, 0x71, 0x3d,
+ 0x89, 0x77, 0x49, 0x77, 0xd1, 0x00, 0x19, 0xb0, 0x0e, 0x55, 0x0e, 0x91,
+ 0x0b, 0x79, 0xdb, 0xbe, 0x0f, 0x04, 0xd8, 0x25, 0xfb, 0xc5, 0x11, 0x99,
+ 0x48, 0xa6, 0xe6, 0x8f, 0xf9, 0x31, 0x31, 0x75, 0x6e, 0x13, 0x21, 0x5f,
+ 0x8a, 0xd9, 0xc4, 0xd7, 0xb9, 0x7a, 0x29, 0x4f, 0x58, 0x0d, 0x41, 0x4c,
+ 0x17, 0x4f, 0xb6, 0x35, 0xf3, 0x71, 0x2b, 0x11, 0x47, 0x16, 0x3b, 0xe7,
+ 0x02, 0xa0, 0xb5, 0x9b, 0x24, 0xf1, 0x52, 0xd6, 0x70, 0xf8, 0x20, 0x6a,
+ 0x4d, 0xfc, 0x10, 0x9f, 0x8e, 0x1f, 0xbe, 0x11, 0x1d, 0x50, 0x27, 0xf8,
+ 0x4e, 0x03, 0x4b, 0x22, 0x09, 0xcf, 0xab, 0xc4, 0x69, 0x17, 0x5e, 0x3a,
+ 0x0a, 0x7d, 0xc5, 0x76, 0x4a, 0xf4, 0x74, 0xce, 0x2d, 0x60, 0x0e, 0x20,
+ 0xa6, 0x7e, 0x8c, 0x9e, 0x83, 0x34, 0x45, 0x73, 0xfc, 0xdb, 0xd5, 0xe7,
+ 0x97, 0x58, 0x60, 0x63, 0x98, 0x5f, 0xa3, 0xea, 0x4e, 0x9a, 0x7a, 0x17,
+ 0x38, 0x6b, 0xb1, 0xba, 0x67, 0xb3, 0x62, 0x3a, 0x69, 0x9b, 0x94, 0xa6,
+ 0x6c, 0x0a, 0x32, 0x96, 0x8f, 0x6e, 0xe6, 0x1a, 0x50, 0x2d, 0x36, 0x77,
+ 0xed, 0x7b, 0xaf, 0xa4, 0xf1, 0xd8, 0x3c, 0x69, 0x6b, 0x01, 0xec, 0xa2,
+ 0x72, 0x74, 0x5d, 0xcb, 0x65, 0x42, 0xb8, 0x9a, 0x89, 0x33, 0xa2, 0x0c,
+ 0x07, 0xc8, 0x66, 0xd4, 0x57, 0x3b, 0x0c, 0x04, 0xda, 0x65, 0xc4, 0xfb,
+ 0xb1, 0xcc, 0x43, 0xe2, 0x0c, 0x1f, 0xf4, 0x5a, 0x85, 0xa5, 0x78, 0xfb,
+ 0xc5, 0x49, 0x85, 0xc1, 0x7f, 0x52, 0xec, 0xc6, 0x47, 0x0e, 0xe7, 0x93,
+ 0x2f, 0x51, 0xbf, 0x35, 0x71, 0x21, 0x3c, 0x7b, 0x35, 0x91, 0xe9, 0x12,
+ 0xc8, 0x7b, 0xeb, 0x76, 0x1a, 0x4a, 0xca, 0xc8, 0x63, 0xa5, 0xce, 0x20,
+ 0xf4, 0x1b, 0x26, 0x30, 0x5c, 0x00, 0xe7, 0x83, 0xf6, 0x57, 0x6b, 0x47,
+ 0x02, 0x09, 0x7c, 0x8e, 0x6d, 0x4f, 0x39, 0x9c, 0x73, 0x6c, 0x91, 0xb9,
+ 0xda, 0x93, 0x18, 0xa2, 0x27, 0x2f, 0x4f, 0x59, 0x79, 0x36, 0xab, 0x16,
+ 0x7e, 0x4e, 0x41, 0x55, 0x20, 0x76, 0xd7, 0xf3, 0xa1, 0x89, 0x1b, 0xce,
+ 0xbc, 0x7e, 0xaf, 0x8b, 0x82, 0x24, 0x74, 0x65, 0xe6, 0xa0, 0xf6, 0x33,
+ 0xc0, 0xb3, 0xae, 0x19, 0x96, 0x51, 0xd5, 0xaa, 0xe8, 0xa4, 0x4d, 0xf9,
+ 0x7d, 0x84, 0x21, 0x30, 0xe4, 0xf9, 0x61, 0xfe, 0xd0, 0x2a, 0xf0, 0xb4,
+ 0x93, 0x97, 0xb8, 0x40, 0x6a, 0x41, 0xb0, 0xc0, 0x1c, 0x9a, 0x9a, 0x9d,
+ 0x51, 0x03, 0x30, 0x89, 0xe1, 0xde, 0x8c, 0x23, 0x0f, 0x00, 0x04, 0x01,
+ 0x45, 0x71, 0x33, 0x43, 0xfd, 0x8b, 0x5a, 0xf2, 0x2d, 0x1c, 0xe6, 0x45,
+ 0xc7, 0xac, 0xac, 0x3b, 0x35, 0x7a, 0xb9, 0x85, 0x37, 0xd2, 0x37, 0x8b,
+ 0x52, 0xb6, 0x0b, 0xe6, 0x86, 0xae, 0x15, 0x8e, 0xff, 0x71, 0x8b, 0xcb,
+ 0x42, 0x9d, 0xd6, 0x9d, 0xfb, 0x64, 0x97, 0x59, 0x81, 0xb7, 0x81, 0x95,
+ 0x06, 0xba, 0x82, 0x09, 0xdf, 0x32, 0x17, 0x48, 0xfd, 0x5d, 0x3a, 0x1c,
+ 0xcc, 0x75, 0xcd, 0x69, 0x34, 0xd9, 0x57, 0xb0, 0xc1, 0x04, 0xbb, 0x71,
+ 0x3c, 0x1e, 0xf6, 0xf5, 0xa9, 0x06, 0x72, 0x02, 0x9c, 0x0c, 0x9b, 0x5d,
+ 0x8d, 0x58, 0x67, 0x4f, 0xf8, 0x74, 0xf2, 0x6f, 0x9a, 0x56, 0xba, 0xf1,
+ 0x0d, 0x0b, 0x9a, 0x21, 0xd0, 0x7a, 0x4c, 0x38, 0x82, 0x83, 0x51, 0xe4,
+ 0xad, 0x3f, 0xb1, 0x37, 0x32, 0xca, 0xc0, 0x2a, 0xf5, 0x0d, 0x85, 0x0d,
+ 0xf1, 0x59, 0x79, 0xcd, 0x3b, 0x10, 0x7c, 0xba, 0x07, 0x88, 0x29, 0xe0,
+ 0xef, 0x97, 0x7b, 0xcc, 0xfc, 0x64, 0xd3, 0x39, 0x1d, 0x34, 0x7a, 0x46,
+ 0x9d, 0xb9, 0xe8, 0x99, 0x71, 0x16, 0x95, 0x4a, 0xac, 0xf5, 0xd0, 0xcd,
+ 0x47, 0xd1, 0xbb, 0xdc, 0x0b, 0x4a, 0xcc, 0x4a, 0xb7, 0x67, 0x3f, 0xb6,
+ 0xd9, 0x38, 0x44, 0x29, 0x71, 0xa9, 0x4a, 0x0e, 0x57, 0x3e, 0xed, 0x60,
+ 0xef, 0xe9, 0xd4, 0xc4, 0x4e, 0xeb, 0x82, 0xab, 0xb8, 0x01, 0x51, 0x9d,
+ 0xad, 0xaa, 0xdc, 0xc1, 0xad, 0xf2, 0x00, 0x6e, 0x60, 0xfe, 0x63, 0xe3,
+ 0x49, 0x9a, 0xe0, 0x7f, 0x03, 0xe6, 0xcb, 0x82, 0xab, 0x25, 0xbc, 0x90,
+ 0xea, 0xbe, 0xd9, 0xf0, 0x3b, 0x92, 0x81, 0x64, 0x15, 0xb7, 0xa3, 0x78,
+ 0xe3, 0xd1, 0xb2, 0x46, 0x8e, 0xdc, 0x30, 0xb4, 0x56, 0x18, 0x82, 0x65,
+ 0xf4, 0x26, 0x08, 0x85, 0x66, 0x02, 0xb6, 0x69, 0x88, 0x3d, 0x18, 0x66,
+ 0xf4, 0x73, 0x74, 0x11, 0x8d, 0x16, 0xd8, 0x9a, 0x4f, 0xfe, 0x3d, 0x14,
+ 0x91, 0x76, 0x3a, 0xed, 0x00, 0x1d, 0x1e, 0x2f, 0xdd, 0x9f, 0xc2, 0xa2,
+ 0x54, 0x18, 0x4f, 0x1f, 0xd3, 0x2e, 0x64, 0x74, 0xfd, 0x84, 0xc2, 0x84,
+ 0x88, 0x27, 0xb2, 0xdd, 0x71, 0xd6, 0x38, 0x91, 0xcd, 0xcd, 0x86, 0xe9,
+ 0x89, 0x06, 0x8e, 0x91, 0x1d, 0xac, 0xbb, 0x55, 0xa5, 0x82, 0x07, 0x5a,
+ 0x19, 0x02, 0x7e, 0xc8, 0x44, 0xe2, 0x9a, 0x9b, 0xb5, 0xf1, 0xcb, 0x5a,
+ 0x03, 0x34, 0x8f, 0x28, 0x1d, 0xa8, 0x2d, 0xd7, 0x9b, 0x55, 0xde, 0x42,
+ 0x2e, 0xdd, 0x9a, 0x84, 0x9a, 0x09, 0x57, 0xca, 0xdd, 0x0b, 0x01, 0xc7,
+ 0x8f, 0xc8, 0x08, 0x21, 0x8d, 0xf2, 0x11, 0xb3, 0x94, 0x6e, 0x00, 0xc3,
+ 0xac, 0x19, 0x0f, 0x80, 0x21, 0xc8, 0x8e, 0x5f, 0x83, 0x0d, 0x19, 0x9d,
+ 0x14, 0x4a, 0xa5, 0x6e, 0x24, 0xe9, 0x24, 0x75, 0xbc, 0x10, 0xe9, 0xc2,
+ 0x75, 0xe0, 0x60, 0xa5, 0x60, 0xd3, 0x64, 0x6e, 0x6e, 0xe3, 0x2e, 0x93,
+ 0x81, 0x42, 0x66, 0xa0, 0xa4, 0x96, 0xae, 0x46, 0xc9, 0xc3, 0xe4, 0x74,
+ 0xac, 0xc8, 0x62, 0xc3, 0xd7, 0x4e, 0xa1, 0x38, 0x7f, 0x6f, 0xd0, 0x13,
+ 0x0e, 0x68, 0x2e, 0x85, 0x1d, 0x83, 0xab, 0xc2, 0x7a, 0x2a, 0x1b, 0x1d,
+ 0xaf, 0x09, 0x32, 0x41, 0xd0, 0xfb, 0xd3, 0x57, 0x13, 0x18, 0x5a, 0x87,
+ 0xf5, 0xc5, 0xca, 0xda, 0x3e, 0xaa, 0x2c, 0x9c, 0x3a, 0x8a, 0x07, 0x42,
+ 0x98, 0x7a, 0xfa, 0xc5, 0xc8, 0x1d, 0xec, 0xa4, 0x65, 0xea, 0x01, 0x80,
+ 0x35, 0x9c, 0x93, 0xd0, 0xdd, 0x49, 0x55, 0x58, 0x99, 0xfc, 0x4a, 0x32,
+ 0xe3, 0xdc, 0x73, 0xde, 0x10, 0xcd, 0x77, 0xba, 0x20, 0x3a, 0x60, 0x88,
+ 0x8a, 0x06, 0xc2, 0x64, 0x4e, 0xd8, 0xc5, 0x03, 0x2c, 0x46, 0xf8, 0x48,
+ 0x34, 0x1e, 0xa6, 0x17, 0x24, 0xb2, 0x37, 0xc3, 0x52, 0xfc, 0xf9, 0x42,
+ 0xfa, 0x51, 0x05, 0x03, 0xf3, 0x48, 0x38, 0x14, 0x38, 0xfa, 0x54, 0xb4,
+ 0x87, 0xee, 0x5a, 0xfe, 0xef, 0xd1, 0x7b, 0x8b, 0x37, 0xf5, 0xc5, 0x7f,
+ 0x29, 0xf7, 0x12, 0x00, 0x84, 0xd0, 0x30, 0xc8, 0x03, 0x4b, 0xa5, 0xf9,
+ 0x4a, 0x2c, 0xae, 0x69, 0x1c, 0xea, 0x5f, 0x3b, 0xda, 0xe8, 0x15, 0xe5,
+ 0xb9, 0xf9, 0x51, 0x02, 0x1c, 0x9a, 0xc6, 0x27, 0xb9, 0x5d, 0x7e, 0x96,
+ 0x64, 0xd0, 0x34, 0xc9, 0x18, 0xe4, 0x6b, 0x0b, 0x83, 0xb6, 0x2b, 0x49,
+ 0x13, 0x75, 0x08, 0xbd, 0xf5, 0x5a, 0x53, 0xf6, 0xd4, 0xa6, 0x76, 0x87,
+ 0xc9, 0x18, 0x5c, 0x10, 0x73, 0x3f, 0x47, 0x81, 0x31, 0x72, 0x35, 0xcf,
+ 0x9c, 0x97, 0xd5, 0x55, 0x1a, 0x01, 0x5f, 0x0f, 0x56, 0x53, 0xa1, 0x07,
+ 0x55, 0x4a, 0x57, 0x79, 0xd9, 0xbe, 0x69, 0x91, 0x57, 0x6e, 0x3e, 0x4a,
+ 0xc3, 0xe8, 0xce, 0x3f, 0x1b, 0x5c, 0xc7, 0x82, 0x92, 0x6d, 0xcd, 0xbf,
+ 0x4d, 0x8b, 0xf4, 0x0c, 0x2c, 0x54, 0x65, 0x2d, 0xb3, 0x03, 0x21, 0x54,
+ 0x67, 0xd7, 0x91, 0xf7, 0x4c, 0xf4, 0x17, 0x79, 0x56, 0xe3, 0x15, 0xfc,
+ 0x69, 0xb7, 0xab, 0x84, 0xc5, 0x92, 0x3e, 0x9a, 0x47, 0x54, 0xb4, 0xf1,
+ 0x6e, 0xc3, 0xf2, 0x4a, 0x36, 0xcf, 0x35, 0x7a, 0xb4, 0xc8, 0x64, 0x91,
+ 0xb2, 0x5b, 0x6e, 0x68, 0x3e, 0x95, 0x9e, 0xeb, 0x8d, 0xb0, 0x66, 0x62,
+ 0xf4, 0xc3, 0x6c, 0xf2, 0xb0, 0x9d, 0x32, 0xc5, 0x95, 0x2d, 0xb9, 0x72,
+ 0xd5, 0xc8, 0xe2, 0x58, 0x10, 0xda, 0xb2, 0x1f, 0xc0, 0x54, 0xdb, 0x49,
+ 0x96, 0x9f, 0xb0, 0x21, 0x3b, 0x6a, 0x42, 0x8b, 0xdc, 0xfa, 0x4b, 0x4e,
+ 0x2b, 0xe0, 0xa1, 0x0d, 0x43, 0xbc, 0x5b, 0x9b, 0x05, 0xc9, 0x9f, 0x40,
+ 0x15, 0x1a, 0x65, 0x69, 0x40, 0xab, 0x80, 0x01, 0xe9, 0x5e, 0xac, 0x8b,
+ 0xb4, 0x64, 0x9b, 0xac, 0x11, 0x72, 0x57, 0xa3, 0x24, 0x18, 0x55, 0x2a,
+ 0x6f, 0x32, 0xb7, 0xe1, 0x3f, 0x7c, 0x42, 0x0a, 0x0a, 0xc8, 0xe7, 0x17,
+ 0x7d, 0x1e, 0x67, 0xdc, 0xea, 0x92, 0x84, 0x65, 0xc2, 0xbc, 0x84, 0x2c,
+ 0x54, 0x08, 0xab, 0x25, 0x8e, 0x59, 0x3d, 0x5a, 0x1b, 0xb6, 0xb7, 0x17,
+ 0xd5, 0x0f, 0x98, 0x2f, 0x7c, 0x17, 0x10, 0x3c, 0x04, 0x84, 0x46, 0x34,
+ 0x1e, 0x32, 0x3b, 0x70, 0xda, 0x4f, 0xde, 0x29, 0xe7, 0x87, 0x41, 0xb9,
+ 0x4d, 0x29, 0x3b, 0xd3, 0x14, 0x39, 0x35, 0x7a, 0x84, 0x6e, 0x80, 0xb2,
+ 0xc2, 0xe2, 0x28, 0x91, 0xc0, 0x61, 0xbb, 0x4d, 0x19, 0x8a, 0xac, 0x96,
+ 0x25, 0xba, 0x65, 0x41, 0xc9, 0xd0, 0xbc, 0xd6, 0x2e, 0xf6, 0x88, 0xd1,
+ 0x75, 0xe7, 0x6b, 0x86, 0xa1, 0x87, 0x4e, 0xae, 0xdb, 0x0c, 0x1a, 0x03,
+ 0x87, 0x4b, 0xd1, 0xb2, 0x37, 0x00, 0x22, 0x29, 0x7d, 0xc8, 0x37, 0x4a,
+ 0x29, 0xc6, 0xd3, 0x12, 0xd1, 0x3d, 0xdf, 0x00, 0x19, 0xab, 0x70, 0x65,
+ 0x31, 0x76, 0x68, 0x76, 0x40, 0x0d, 0x7a, 0xb6, 0x5a, 0xe1, 0xbe, 0x95,
+ 0xa7, 0x2a, 0x77, 0xb6, 0xf7, 0x5b, 0x94, 0xc3, 0xba, 0x4e, 0x6b, 0x93,
+ 0x4f, 0x98, 0x6b, 0xda, 0x28, 0xa3, 0x41, 0x28, 0xbc, 0xed, 0xa9, 0x51,
+ 0x26, 0x98, 0xf6, 0xef, 0xa6, 0x55, 0x3e, 0x6d, 0xc1, 0x87, 0x59, 0xb9,
+ 0xb0, 0xdc, 0xea, 0x6f, 0x2c, 0x2a, 0xa3, 0x14, 0x43, 0x6d, 0x72, 0xfc,
+ 0x06, 0x06, 0x9c, 0xd5, 0xfa, 0xe9, 0xfb, 0x9f, 0x57, 0xb1, 0x4f, 0x69,
+ 0x47, 0xee, 0xb2, 0x59, 0x44, 0xe3, 0x88, 0x44, 0x04, 0xa4, 0xb2, 0x7b,
+ 0x3e, 0xed, 0xb3, 0xde, 0x60, 0x71, 0x23, 0xdb, 0x88, 0x6b, 0x54, 0x6d,
+ 0xee, 0xd6, 0xc1, 0x29, 0xdb, 0x19, 0xfa, 0x36, 0x5b, 0xba, 0x1c, 0x93,
+ 0x1c, 0xfd, 0x6c, 0x32, 0x6d, 0xdc, 0x92, 0x85, 0x92, 0xf9, 0x50, 0xad,
+ 0x97, 0x43, 0x32, 0xe2, 0x23, 0x27, 0x84, 0x16, 0x9d, 0x11, 0x15, 0x2b,
+ 0x73, 0x14, 0xd6, 0xc3, 0x98, 0xa7, 0x48, 0xac, 0x6e, 0xca, 0x23, 0x1b,
+ 0x6a, 0xa8, 0x27, 0x4c, 0xfd, 0x69, 0x17, 0x8e, 0x0e, 0x52, 0x5e, 0x36,
+ 0x36, 0x46, 0x18, 0xb5, 0xa1, 0xf7, 0x5f, 0x02, 0xcf, 0x2d, 0xeb, 0x6f,
+ 0xcc, 0x61, 0x12, 0x32, 0x2a, 0x7a, 0xae, 0x2d, 0x7c, 0x30, 0xd4, 0x72,
+ 0xb1, 0xdf, 0x01, 0x89, 0xe0, 0x00, 0x9e, 0x48, 0x48, 0x04, 0x42, 0xb2,
+ 0x15, 0x30, 0xc5, 0xc1, 0x51, 0x49, 0x3c, 0x67, 0x57, 0xd6, 0xd7, 0xf8,
+ 0x30, 0xc6, 0xa7, 0x97, 0x84, 0x7f, 0x03, 0x6c, 0xdf, 0xd2, 0xb4, 0xf8,
+ 0x40, 0xcf, 0x6c, 0x6a, 0x72, 0xa1, 0x85, 0xb4, 0x6d, 0x5a, 0x3f, 0xa1,
+ 0xac, 0xbb, 0xd2, 0xac, 0x97, 0xfb, 0x33, 0x53, 0xfe, 0xf9, 0x4b, 0xae,
+ 0x0e, 0xa1, 0x39, 0xfc, 0x8c, 0xdb, 0xf9, 0x4f, 0xbf, 0xe8, 0x48, 0x91,
+ 0xc1, 0xe3, 0x01, 0xf3, 0x4b, 0xd6, 0x24, 0xcc, 0xd0, 0x11, 0x77, 0x52,
+ 0x5a, 0x09, 0x6f, 0xa9, 0x42, 0x32, 0x0b, 0x7a, 0xf4, 0xa0, 0xf4, 0x04,
+ 0x5a, 0x10, 0x72, 0x84, 0x4c, 0x25, 0x51, 0xbb, 0xb9, 0xd2, 0xf9, 0xbc,
+ 0x2d, 0xc2, 0x32, 0xf7, 0xa3, 0xd1, 0x27, 0x6f, 0x9a, 0xa0, 0xda, 0xc9,
+ 0x46, 0xcf, 0xfb, 0x3f, 0xb5, 0xf8, 0x3d, 0xe8, 0xd2, 0x72, 0x93, 0x66,
+ 0x78, 0x2c, 0x77, 0x2d, 0x10, 0x78, 0x3f, 0xa8, 0x87, 0x90, 0x5d, 0xe4,
+ 0x2c, 0x77, 0xf4, 0x1d, 0x02, 0x23, 0xf5, 0xf2, 0xdc, 0x71, 0x15, 0xa4,
+ 0xc0, 0xda, 0x00, 0x80, 0xcc, 0x62, 0x91, 0x43, 0xc5, 0xe5, 0x80, 0x09,
+ 0x46, 0xaa, 0x1b, 0x7a, 0x10, 0x8f, 0x56, 0x45, 0x72, 0xa9, 0xa6, 0x87,
+ 0x1b, 0x92, 0xb3, 0x95, 0x13, 0x76, 0xf4, 0x88, 0x44, 0xd8, 0x39, 0x6c,
+ 0x82, 0x4d, 0x00, 0x90, 0x79, 0xc6, 0x84, 0x10, 0xb4, 0x2e, 0x54, 0x14,
+ 0x8a, 0x42, 0x3e, 0x4c, 0x35, 0x7e, 0x8b, 0xbb, 0x0c, 0x49, 0x7c, 0xff,
+ 0xa0, 0x58, 0xc2, 0x35, 0x67, 0xf3, 0x49, 0x3e, 0xa2, 0x41, 0x78, 0xb9,
+ 0x47, 0x4d, 0x0d, 0xfd, 0x26, 0xb2, 0xf1, 0xe7, 0x0b, 0x63, 0xb1, 0xa7,
+ 0x31, 0x10, 0x27, 0x1e, 0x53, 0x86, 0x6a, 0xf7, 0xb3, 0x10, 0xd9, 0x81,
+ 0x64, 0x2e, 0xe4, 0xbd, 0xdf, 0x0a, 0x15, 0x54, 0xa3, 0xe9, 0x57, 0xc0,
+ 0xdf, 0xd9, 0xb9, 0xeb, 0x42, 0xe8, 0x76, 0xf0, 0x3c, 0xcb, 0xbf, 0xbf,
+ 0xae, 0x57, 0xd5, 0xe9, 0x5a, 0x78, 0x6e, 0x21, 0xc4, 0xc9, 0x36, 0x22,
+ 0x6a, 0x99, 0x27, 0xfd, 0xf5, 0xd6, 0xc8, 0x42, 0x80, 0xc6, 0x06, 0x30,
+ 0x08, 0xa0, 0x25, 0x3f, 0x0e, 0xf0, 0x8e, 0xe0, 0x0d, 0xb6, 0x0a, 0xe5,
+ 0x08, 0x13, 0x3d, 0xe8, 0x2d, 0x35, 0x82, 0x28, 0x84, 0xb9, 0x2e, 0x8a,
+ 0x78, 0xd0, 0xeb, 0xa7, 0xaf, 0xa5, 0x11, 0x2a, 0x83, 0x72, 0xe8, 0x07,
+ 0x93, 0xaa, 0xff, 0x11, 0xd0, 0x95, 0x33, 0xc4, 0x00, 0x76, 0xc0, 0xab,
+ 0xe6, 0x29, 0xda, 0xb3, 0x67, 0x2f, 0x5d, 0xed, 0xf9, 0x89, 0xfb, 0x62,
+ 0x2d, 0x7a, 0x8f, 0xd8, 0xa7, 0x92, 0xd1, 0xf0, 0x4c, 0x73, 0x34, 0xa1,
+ 0xff, 0x4c, 0xa7, 0x3c, 0x0e, 0x4a, 0x4b, 0x0e, 0xd2, 0x3e, 0xdd, 0x9d,
+ 0xa5, 0x3c, 0xed, 0xc2, 0x50, 0x46, 0x5e, 0xcd, 0x81, 0x81, 0x49, 0xca,
+ 0x9e, 0x50, 0x40, 0xc1, 0xae, 0xd8, 0x30, 0xc9, 0x64, 0x4b, 0x52, 0x84,
+ 0x57, 0x0d, 0xa2, 0x11, 0x40, 0x00, 0x07, 0x10, 0x43, 0x49, 0x18, 0x33,
+ 0x5a, 0x29, 0xfd, 0xb1, 0xe6, 0x37, 0x44, 0x7d, 0xad, 0xe8, 0xda, 0x6d,
+ 0x19, 0x8b, 0x31, 0x8c, 0x01, 0xb0, 0xcb, 0xa4, 0x8d, 0x14, 0x42, 0x66,
+ 0xa5, 0x7b, 0x25, 0x00, 0xe6, 0x92, 0x5b, 0xef, 0x21, 0xe6, 0x16, 0x1b,
+ 0xbf, 0xce, 0x80, 0x80, 0x8c, 0x97, 0xcf, 0x66, 0xd5, 0xa1, 0xe5, 0xbc,
+ 0x82, 0x6b, 0xab, 0x0c, 0x68, 0x74, 0x39, 0x71, 0x9c, 0x98, 0x42, 0xa1,
+ 0xc3, 0xe6, 0x75, 0xb1, 0x5e, 0xea, 0x2c, 0xe1, 0xb1, 0x14, 0x52, 0x65,
+ 0x5e, 0xb1, 0xa3, 0x51, 0x8d, 0x19, 0xb7, 0xee, 0x1f, 0x29, 0x99, 0xf7,
+ 0x20, 0x01, 0x26, 0xa3, 0xd5, 0xf0, 0x80, 0x24, 0xf7, 0x8a, 0xcb, 0x1c,
+ 0x33, 0xc1, 0x9a, 0x0c, 0x0c, 0x27, 0xb9, 0x6c, 0x18, 0x39, 0xb6, 0x87,
+ 0x9d, 0x35, 0x30, 0xff, 0xaa, 0xeb, 0xb3, 0x1f, 0x59, 0xd1, 0xb5, 0x06,
+ 0x6f, 0x62, 0xba, 0x2d, 0x61, 0xd6, 0xf4, 0xf4, 0xb7, 0x86, 0xda, 0x83,
+ 0x2b, 0x94, 0xf6, 0x1d, 0x68, 0x63, 0x27, 0xeb, 0xb0, 0xd0, 0xd2, 0x24,
+ 0xfd, 0xbe, 0xed, 0x91, 0xfc, 0xb1, 0xc9, 0x09, 0xda, 0x54, 0x0a, 0x76,
+ 0x75, 0xea, 0xc4, 0xba, 0xb7, 0x7e, 0x1b, 0xb2, 0x0b, 0x53, 0x53, 0xed,
+ 0x54, 0xd0, 0xa6, 0xc1, 0x85, 0xa1, 0x1a, 0x62, 0x16, 0xde, 0xca, 0xe9,
+ 0xd9, 0x55, 0x31, 0x5c, 0x6c, 0x0b, 0x60, 0x3b, 0x39, 0x29, 0x5c, 0x49,
+ 0x88, 0x20, 0xc5, 0x80, 0x47, 0xfd, 0x94, 0x0f, 0xac, 0x81, 0x9c, 0x98,
+ 0xe9, 0xfd, 0x05, 0x70, 0x85, 0xa3, 0xbf, 0x4b, 0xf9, 0x57, 0xbe, 0xe3,
+ 0x01, 0xde, 0xb3, 0x23, 0xf3, 0x64, 0xd4, 0xe0, 0x89, 0x3c, 0xfb, 0xe3,
+ 0x45, 0x3e, 0xda, 0x03, 0x0b, 0xd8, 0x80, 0xae, 0x07, 0x50, 0x19, 0x59,
+ 0x25, 0x7f, 0x93, 0x07, 0x75, 0xd2, 0x9a, 0x94, 0x94, 0xdf, 0x8f, 0x8c,
+ 0xd0, 0xc7, 0x38, 0x37, 0xf4, 0xbb, 0x27, 0x02, 0xbb, 0x40, 0x44, 0x3b,
+ 0xea, 0xfd, 0xb4, 0xdd, 0x6a, 0x29, 0x7d, 0x3c, 0x83, 0xef, 0xc4, 0x47,
+ 0x88, 0x9d, 0xed, 0xf1, 0x24, 0x62, 0xae, 0xe0, 0x9d, 0xa9, 0xb2, 0x47,
+ 0x4d, 0xfc, 0xb2, 0xc4, 0x2e, 0xd7, 0x6e, 0x0b, 0x65, 0xf8, 0xe9, 0x12,
+ 0xc7, 0xb7, 0x19, 0x33, 0x4b, 0x1f, 0x70, 0xa3, 0x35, 0x51, 0x38, 0xf8,
+ 0x4c, 0x59, 0xf5, 0xe9, 0xf8, 0xff, 0x4b, 0x2d, 0x3d, 0x5a, 0xdc, 0x67,
+ 0x5c, 0xfd, 0x17, 0x82, 0x13, 0xde, 0x2d, 0x99, 0xab, 0x85, 0xe0, 0xfa,
+ 0xe2, 0x3d, 0x1b, 0x95, 0x0f, 0xd2, 0xd4, 0xc8, 0x51, 0x31, 0x03, 0x1b,
+ 0xa6, 0xf3, 0xb0, 0x54, 0x0d, 0x58, 0x84, 0xfd, 0x34, 0x01, 0xeb, 0xd3,
+ 0xc4, 0x12, 0x05, 0x84, 0x06, 0xa3, 0x3a, 0x18, 0xc9, 0x2d, 0xad, 0x73,
+ 0x1e, 0x3b, 0x1b, 0xbb, 0x29, 0xcb, 0x59, 0xd3, 0x02, 0x81, 0xaf, 0x4d,
+ 0x62, 0x39, 0xad, 0x3d, 0xa4, 0x79, 0xd8, 0x0d, 0x9c, 0x44, 0xdc, 0x0c,
+ 0x16, 0xd6, 0xfd, 0xdf, 0x2d, 0xd9, 0x1e, 0x74, 0x14, 0xc4, 0x61, 0x26,
+ 0x13, 0x49, 0xed, 0xfb, 0xcb, 0x71, 0xd6, 0x72, 0x87, 0xe8, 0x5a, 0xcf,
+ 0xa2, 0x59, 0xf5, 0x45, 0x47, 0xae, 0xc9, 0x8d, 0x86, 0x0a, 0x2a, 0x3b,
+ 0xd2, 0x57, 0x50, 0x95, 0x5f, 0x52, 0x43, 0xc7, 0xad, 0xb3, 0x8b, 0x44,
+ 0xee, 0x9a, 0x9f, 0x84, 0x04, 0x36, 0x8c, 0x6f, 0x76, 0xbd, 0xcd, 0xd8,
+ 0xf3, 0x32, 0x32, 0x4f, 0xdd, 0x8d, 0x78, 0x75, 0x81, 0x75, 0x27, 0x18,
+ 0x73, 0xc4, 0xde, 0x0c, 0x3b, 0x58, 0x2e, 0x36, 0x2c, 0xba, 0x0d, 0x06,
+ 0x53, 0x52, 0x6c, 0x0d, 0xf1, 0x4e, 0xf8, 0xfc, 0x59, 0xe1, 0xd5, 0x38,
+ 0x4b, 0x25, 0x48, 0x9e, 0x35, 0xfa, 0x83, 0x32, 0xe4, 0x9c, 0x27, 0x81,
+ 0x7a, 0x02, 0x40, 0x2b, 0xd4, 0x4e, 0xa2, 0x1b, 0xca, 0xa9, 0xa6, 0x8b,
+ 0x71, 0x95, 0x57, 0xfd, 0x5f, 0x36, 0x44, 0xbd, 0x12, 0x99, 0x27, 0x7c,
+ 0x46, 0xee, 0xab, 0x3c, 0xb4, 0xae, 0xc8, 0x58, 0xc2, 0x6d, 0x1d, 0x6c,
+ 0xb9, 0x07, 0xa5, 0xcf, 0xbd, 0x53, 0x70, 0x79, 0x5a, 0xb1, 0x91, 0x5a,
+ 0x31, 0x0a, 0x21, 0x2f, 0x97, 0x88, 0xde, 0x22, 0xf3, 0x49, 0x68, 0xab,
+ 0xeb, 0xb2, 0xfc, 0x13, 0xff, 0x88, 0xa7, 0xcd, 0x0d, 0x52, 0x89, 0xb8,
+ 0x0d, 0xde, 0xe8, 0xfa, 0xbc, 0x38, 0xcf, 0x8f, 0x11, 0x5f, 0xb4, 0xa0,
+ 0xe9, 0x80, 0x5f, 0x0b, 0x1b, 0x04, 0xc9, 0xd6, 0x26, 0x21, 0xdd, 0xc6,
+ 0x13, 0xda, 0x8a, 0x0a, 0xa8, 0x39, 0x1e, 0xcd, 0x70, 0xf2, 0x2a, 0x05,
+ 0x0c, 0xda, 0x34, 0xc3, 0x8a, 0x2e, 0xe1, 0x75, 0x4c, 0x80, 0x29, 0x67,
+ 0x72, 0xe8, 0xdc, 0x4e, 0xe1, 0xed, 0x3c, 0x9f, 0xbf, 0x24, 0x16, 0x11,
+ 0x32, 0xc2, 0x7d, 0x2e, 0x6b, 0xed, 0x04, 0xbe, 0x1f, 0x79, 0x2b, 0xc7,
+ 0xfc, 0xc7, 0x62, 0x21, 0xed, 0x64, 0x84, 0xba, 0xa4, 0xae, 0xa6, 0x61,
+ 0x5e, 0xeb, 0xf8, 0x54, 0xf9, 0x85, 0xe7, 0x2e, 0xbb, 0xd6, 0x70, 0x8d,
+ 0x28, 0x60, 0x27, 0x02, 0x3a, 0xc5, 0xb3, 0xa5, 0xf0, 0x12, 0x32, 0x88,
+ 0x56, 0x8d, 0x5b, 0xa9, 0xc2, 0x0b, 0x51, 0x8b, 0x43, 0x84, 0x93, 0xc9,
+ 0xc8, 0xb9, 0x6c, 0xad, 0x00, 0x31, 0x96, 0x2e, 0x84, 0x65, 0x4c, 0x1e,
+ 0x44, 0x22, 0x62, 0xda, 0xa5, 0x92, 0x23, 0x62, 0x84, 0x99, 0x64, 0xca,
+ 0x16, 0xff, 0xb7, 0x08, 0xe6, 0xcf, 0xde, 0xf2, 0xb9, 0x9b, 0x51, 0x03,
+ 0x15, 0xc0, 0x20, 0x4e, 0x30, 0x2b, 0x09, 0x60, 0x90, 0x91, 0xb8, 0x67,
+ 0xe2, 0x3b, 0x4e, 0x9b, 0x10, 0xe9, 0x1c, 0x32, 0x34, 0x89, 0xd6, 0xb1,
+ 0x3a, 0x3d, 0x89, 0xa6, 0xd0, 0x2a, 0x5e, 0x1d, 0xea, 0x47, 0x75, 0xc7,
+ 0xc9, 0xed, 0x8f, 0x76, 0xa4, 0xe7, 0x5d, 0x96, 0xcd, 0x5e, 0x65, 0x51,
+ 0x4b, 0x47, 0xe1, 0x87, 0xcb, 0x83, 0xb2, 0xfc, 0x52, 0x2b, 0x15, 0x15,
+ 0x81, 0x95, 0x7c, 0x27, 0x33, 0xe3, 0x6f, 0xaa, 0x3c, 0xc9, 0x0d, 0xe3,
+ 0x45, 0xba, 0xfe, 0x1d, 0x9d, 0xd4, 0xf1, 0xb8, 0xd2, 0xba, 0xf8, 0x98,
+ 0xde, 0x26, 0x7e, 0xc5, 0x0b, 0x41, 0x8f, 0x00, 0x9e, 0xc3, 0xd0, 0x91,
+ 0x72, 0x10, 0x38, 0x1b, 0x67, 0x33, 0x7e, 0x7b, 0x71, 0xb0, 0x8b, 0x87,
+ 0x23, 0x60, 0x26, 0x8f, 0x58, 0x9f, 0x57, 0x81, 0xe3, 0x47, 0xe5, 0x66,
+ 0xd5, 0xa2, 0x59, 0x3e, 0x82, 0xac, 0xe1, 0xf6, 0x26, 0x1a, 0xa8, 0x32,
+ 0x46, 0xca, 0xb0, 0x0a, 0x54, 0xc6, 0xdd, 0x4b, 0xe7, 0x6c, 0x5a, 0x41,
+ 0xf1, 0x3d, 0xb0, 0x00, 0x4b, 0x45, 0x29, 0x49, 0x0f, 0x8b, 0x04, 0xcd,
+ 0x18, 0xbc, 0xb1, 0xd8, 0xe2, 0x4b, 0x95, 0x06, 0x2c, 0x13, 0xfc, 0xab,
+ 0xd1, 0x60, 0x71, 0x1a, 0x91, 0x46, 0xdb, 0x8d, 0x8c, 0x71, 0x4b, 0x27,
+ 0xef, 0x51, 0xbc, 0xd7, 0x12, 0x5c, 0xfe, 0xce, 0xde, 0x4f, 0x9d, 0x86,
+ 0x4b, 0xfa, 0x46, 0x2f, 0x71, 0xbe, 0x97, 0x29, 0x6d, 0x64, 0xc0, 0x3f,
+ 0x1b, 0x47, 0x20, 0xb1, 0x19, 0xc2, 0x62, 0x30, 0xa6, 0x98, 0xfd, 0xee,
+ 0xad, 0xe8, 0xb9, 0x75, 0x8b, 0xd0, 0x8e, 0xa8, 0x82, 0x24, 0xe0, 0x0f,
+ 0x27, 0x04, 0x50, 0xc8, 0xe7, 0x3a, 0x0d, 0x57, 0x18, 0x67, 0x81, 0x12,
+ 0xa5, 0xf9, 0xa0, 0x15, 0x4d, 0x0d, 0x30, 0xa7, 0x8d, 0x35, 0x75, 0x95,
+ 0x75, 0x69, 0x90, 0x57, 0xde, 0x42, 0x82, 0x5d, 0x53, 0xf4, 0xc7, 0x6f,
+ 0x9b, 0x5e, 0x4a, 0x5f, 0x6c, 0x76, 0x2a, 0x06, 0xea, 0xeb, 0xa5, 0xa3,
+ 0x1d, 0xea, 0xe8, 0xb3, 0xf6, 0xb6, 0x01, 0x60, 0x62, 0x5c, 0x4e, 0x73,
+ 0x0a, 0xea, 0x25, 0x05, 0x38, 0x91, 0x0d, 0xe8, 0x47, 0x15, 0x3f, 0x54,
+ 0x3a, 0xa4, 0x52, 0x07, 0x5e, 0xb9, 0x1c, 0x55, 0x46, 0x4f, 0x5f, 0xde,
+ 0xe0, 0x0e, 0x62, 0x59, 0x36, 0xb6, 0x3d, 0xb7, 0xa5, 0x03, 0xc7, 0x29,
+ 0x14, 0x60, 0x97, 0x4d, 0x15, 0x9f, 0x5e, 0x32, 0xb1, 0x74, 0x99, 0x5f,
+ 0x5e, 0x14, 0x73, 0x06, 0x6a, 0x64, 0xe2, 0xe9, 0xf7, 0xda, 0x08, 0x88,
+ 0xbd, 0xb8, 0x4e, 0xa0, 0xa2, 0x94, 0x50, 0x41, 0x8f, 0x19, 0x8a, 0x95,
+ 0x86, 0x65, 0xcc, 0x64, 0x51, 0x74, 0x10, 0x1f, 0x1a, 0x81, 0x89, 0x4d,
+ 0x19, 0x2a, 0x84, 0x1b, 0x76, 0xc1, 0x7e, 0x7f, 0xde, 0x3f, 0x1c, 0x88,
+ 0x7e, 0x97, 0xa1, 0x82, 0x93, 0xea, 0x75, 0xa1, 0xd8, 0xf3, 0x73, 0x46,
+ 0x82, 0x3d, 0xe1, 0x60, 0xbd, 0xe7, 0x52, 0x26, 0xf8, 0xf3, 0xfa, 0x10,
+ 0x07, 0x06, 0x48, 0xc2, 0xa3, 0x47, 0x11, 0xc8, 0x92, 0xb9, 0x95, 0x10,
+ 0x01, 0xc1, 0x0b, 0xbd, 0x7b, 0xd1, 0x46, 0xdf, 0x0d, 0xb1, 0x61, 0x53,
+ 0x34, 0xe1, 0x34, 0x4a, 0x8a, 0xdf, 0x70, 0xce, 0x5d, 0xd0, 0x33, 0xb5,
+ 0x1e, 0x5e, 0xe6, 0x42, 0x30, 0x24, 0x32, 0xb7, 0xd6, 0xe4, 0xd4, 0x62,
+ 0x88, 0xd4, 0x7e, 0xb4, 0xd7, 0x87, 0x8c, 0xa5, 0xed, 0x43, 0xf2, 0x76,
+ 0x1c, 0x7b, 0x1d, 0xb4, 0x74, 0x4d, 0xc8, 0xa0, 0xb1, 0xc8, 0x9d, 0x67,
+ 0x59, 0x53, 0x71, 0x82, 0x17, 0x84, 0x6a, 0x7b, 0x10, 0xad, 0xc2, 0xb1,
+ 0x06, 0xff, 0xb1, 0xf0, 0xc0, 0xad, 0xa3, 0x12, 0x77, 0x30, 0xac, 0xe8,
+ 0x13, 0x1a, 0x8b, 0x2b, 0xcd, 0x01, 0xeb, 0x79, 0x0b, 0x30, 0x93, 0x24,
+ 0xe7, 0xf4, 0x44, 0xc4, 0x49, 0xf1, 0xc1, 0x3c, 0x22, 0x4e, 0x26, 0x20,
+ 0x37, 0x73, 0xe5, 0x37, 0x72, 0x33, 0xfb, 0x0d, 0x34, 0x5a, 0x3e, 0x35,
+ 0x58, 0xad, 0xdf, 0x8e, 0xa7, 0xba, 0xcb, 0x87, 0xb6, 0x2a, 0x27, 0xba,
+ 0xb7, 0x79, 0x38, 0xcb, 0x23, 0xa2, 0xb0, 0xbd, 0x26, 0xc4, 0xfe, 0xcd,
+ 0x7d, 0x12, 0x03, 0xfc, 0xd9, 0x9d, 0x52, 0x2f, 0x10, 0xd7, 0x7e, 0xe4,
+ 0x27, 0xa6, 0xa8, 0xba, 0xe3, 0x2d, 0xa7, 0xd6, 0x94, 0x3a, 0x28, 0x84,
+ 0x33, 0x13, 0xd7, 0x93, 0xe6, 0xd4, 0x03, 0x8a, 0x5d, 0xea, 0xd1, 0x32,
+ 0x30, 0x3b, 0x35, 0xe5, 0xaf, 0xcf, 0x18, 0xa0, 0x06, 0x0a, 0xc3, 0x53,
+ 0x40, 0x3b, 0x87, 0x56, 0x41, 0xcb, 0xf2, 0xa0, 0x72, 0x6d, 0xa4, 0xb5,
+ 0xab, 0x1d, 0xfc, 0xc1, 0xf3, 0x33, 0x06, 0x68, 0x63, 0x49, 0x03, 0x5e,
+ 0xb7, 0x93, 0x0c, 0x99, 0x07, 0xd9, 0x3a, 0x35, 0x5a, 0x54, 0x3b, 0x0b,
+ 0xf3, 0xaf, 0x17, 0xe5, 0x34, 0x3d, 0xe5, 0x0e, 0x25, 0xf0, 0x82, 0xf9,
+ 0xc7, 0x4e, 0xaf, 0x56, 0x63, 0x1b, 0xa8, 0x30, 0x55, 0xa4, 0x6b, 0x91,
+ 0x67, 0x49, 0xe2, 0x81, 0x1b, 0x93, 0x11, 0x6a, 0x9b, 0x38, 0xbe, 0x94,
+ 0xa4, 0x1c, 0x7d, 0x2e, 0x4e, 0x14, 0x0f, 0xd2, 0x30, 0xad, 0x39, 0xf1,
+ 0x68, 0x86, 0x55, 0x89, 0x5d, 0xac, 0xde, 0x4e, 0x12, 0xf2, 0xb1, 0x4c,
+ 0xf9, 0x0b, 0x7a, 0x96, 0xe6, 0x6e, 0x2e, 0x82, 0xbb, 0x58, 0xf5, 0xeb,
+ 0x81, 0x72, 0x23, 0x2e, 0x01, 0xef, 0x8d, 0xe2, 0x95, 0xe7, 0x8e, 0xef,
+ 0x82, 0x8a, 0xde, 0x76, 0xea, 0x5b, 0x16, 0xcb, 0xf5, 0x33, 0x70, 0xad,
+ 0xa4, 0x6f, 0x20, 0x92, 0x84, 0x15, 0x0a, 0x20, 0x47, 0x0a, 0x8e, 0x85,
+ 0x4e, 0xf2, 0xe9, 0xea, 0xa2, 0x7c, 0x4b, 0x95, 0xe6, 0x25, 0xef, 0xed,
+ 0x93, 0x7c, 0xca, 0x85, 0xe3, 0x14, 0x22, 0x67, 0x67, 0x62, 0x0f, 0x78,
+ 0x4d, 0x79, 0x05, 0xd0, 0x88, 0xfd, 0x8a, 0xf2, 0x54, 0xbb, 0x40, 0x87,
+ 0xcc, 0x70, 0x46, 0x96, 0x17, 0x04, 0xd5, 0x83, 0x87, 0x4a, 0x5a, 0x0b,
+ 0xc1, 0xd3, 0x34, 0x25, 0x99, 0xcd, 0x8b, 0x6a, 0xde, 0xac, 0x39, 0xe9,
+ 0x08, 0x05, 0xea, 0xb0, 0x21, 0x6b, 0xf5, 0x92, 0x2d, 0xd6, 0xcf, 0x1f,
+ 0x9a, 0x1c, 0x73, 0xb3, 0x04, 0x37, 0xd7, 0x5b, 0x5e, 0xfe, 0xa2, 0x9d,
+ 0x7e, 0x90, 0xf2, 0x19, 0x61, 0x17, 0xef, 0xa1, 0x64, 0x0d, 0x3a, 0x0c,
+ 0xc5, 0x83, 0xf9, 0xca, 0xe2, 0xd7, 0x8e, 0x40, 0xdd, 0x8c, 0xb5, 0xf6,
+ 0x20, 0x00, 0x16, 0x5e, 0x04, 0x10, 0x85, 0x69, 0x79, 0x8f, 0x62, 0x71,
+ 0x32, 0xf2, 0x5e, 0xfd, 0x53, 0x39, 0x1e, 0x5c, 0x60, 0xe7, 0xd9, 0x87,
+ 0xfc, 0x99, 0x86, 0xd1, 0x20, 0x8e, 0x8b, 0x5d, 0xdf, 0xc3, 0xbe, 0x99,
+ 0x25, 0x15, 0xea, 0x6e, 0x12, 0x74, 0x8f, 0x8d, 0x8c, 0x8a, 0xa5, 0xf8,
+ 0x29, 0x00, 0x4b, 0x7e, 0x93, 0x1d, 0x64, 0x91, 0xde, 0xf7, 0x18, 0x49,
+ 0xa5, 0x46, 0x54, 0x27, 0x95, 0x7a, 0xed, 0x24, 0x84, 0x5b, 0x2c, 0x9a,
+ 0x39, 0x40, 0x46, 0x04, 0x56, 0x57, 0x77, 0x1c, 0x61, 0x6d, 0x86, 0xef,
+ 0xda, 0x23, 0x3b, 0xfb, 0x28, 0x5a, 0xdf, 0xae, 0x31, 0x6b, 0x09, 0x3d,
+ 0x43, 0xb2, 0x11, 0x91, 0xc8, 0x5c, 0x9f, 0x97, 0x71, 0xff, 0xf4, 0x40,
+ 0x14, 0x7d, 0xb4, 0x7b, 0x53, 0x50, 0x97, 0xac, 0x15, 0x86, 0x32, 0x42,
+ 0xc5, 0xac, 0xc1, 0x4d, 0x78, 0x4b, 0x9d, 0xe3, 0xb6, 0xd4, 0x22, 0x8f,
+ 0x62, 0x65, 0x11, 0xce, 0xe8, 0x05, 0x3f, 0x53, 0x73, 0x90, 0xa1, 0x26,
+ 0x23, 0xe6, 0x7a, 0xfe, 0x4e, 0x17, 0x05, 0xce, 0x54, 0x2e, 0xbd, 0xe1,
+ 0x75, 0x7d, 0x69, 0xcd, 0xa4, 0xd0, 0xfd, 0x55, 0xf6, 0x43, 0x53, 0xd6,
+ 0xed, 0x40, 0x68, 0xc6, 0x10, 0xa7, 0xef, 0x96, 0x73, 0xca, 0x8a, 0xc7,
+ 0x7b, 0x37, 0x30, 0x3b, 0xad, 0xef, 0xb8, 0x5e, 0x5d, 0x13, 0x78, 0xfc,
+ 0x9c, 0xe5, 0x20, 0xa2, 0x47, 0x13, 0x01, 0xc1, 0xba, 0x3a, 0xab, 0x2d,
+ 0xaa, 0xe1, 0xfc, 0x87, 0xec, 0xf4, 0x87, 0x99, 0xe0, 0x14, 0xb1, 0x3e,
+ 0xf8, 0xb2, 0xe4, 0x90, 0xcf, 0xc0, 0x0c, 0x0d, 0xde, 0x6f, 0xbb, 0x4e,
+ 0x01, 0x66, 0x8e, 0xb3, 0xaa, 0x32, 0xcd, 0xa3, 0x1a, 0x3c, 0x46, 0x65,
+ 0x07, 0x98, 0x32, 0x74, 0x6b, 0x60, 0xd5, 0x6f, 0xbb, 0xe1, 0x55, 0xb2,
+ 0x18, 0xbd, 0xa0, 0x5c, 0xdc, 0x70, 0xa1, 0xf0, 0x03, 0x08, 0x62, 0xed,
+ 0x9c, 0xbd, 0xbf, 0x8b, 0x8c, 0x8e, 0x24, 0x3d, 0xaf, 0x07, 0x7b, 0x42,
+ 0xa1, 0x0b, 0xe2, 0xb5, 0x4d, 0x09, 0xef, 0x4c, 0x0a, 0xfc, 0x35, 0x5d,
+ 0x17, 0xb8, 0x4f, 0x71, 0x11, 0xc7, 0x4b, 0x80, 0x06, 0x29, 0x97, 0x12,
+ 0x6d, 0x1c, 0x8a, 0x53, 0x42, 0x73, 0xe0, 0x00, 0x18, 0x18, 0x1c, 0x5c,
+ 0x32, 0xa9, 0x61, 0x3e, 0x55, 0x4f, 0xee, 0x7c, 0xe3, 0x82, 0x8c, 0xab,
+ 0x04, 0x41, 0x9c, 0xfb, 0x8c, 0x85, 0xad, 0x93, 0x46, 0x94, 0x01, 0x2a,
+ 0x0c, 0x2f, 0xd2, 0x92, 0x3b, 0xcf, 0x99, 0xc9, 0x02, 0x75, 0x8d, 0x5e,
+ 0x2b, 0x7f, 0x4b, 0xa8, 0x80, 0x60, 0x8b, 0xe8, 0x96, 0x4c, 0xd8, 0x80,
+ 0xfc, 0x32, 0xe6, 0x2e, 0x7a, 0x39, 0xe3, 0xfc, 0xd9, 0x53, 0x83, 0x3a,
+ 0x6a, 0x08, 0x49, 0x7b, 0x7b, 0xcb, 0xc9, 0x2d, 0x5c, 0x91, 0x6a, 0x6f,
+ 0x6a, 0x8d, 0x54, 0x22, 0x36, 0xe5, 0x91, 0x48, 0x03, 0x36, 0x5d, 0xa1,
+ 0x03, 0x59, 0xd1, 0xa8, 0xe0, 0x5c, 0xce, 0xaf, 0x58, 0x16, 0x7f, 0xee,
+ 0xc4, 0x43, 0xb3, 0x66, 0xb9, 0x10, 0xb3, 0x49, 0x9b, 0x5a, 0x33, 0x51,
+ 0xa4, 0x20, 0xec, 0xb9, 0x6c, 0x2e, 0x4f, 0xfd, 0x49, 0xae, 0x72, 0xa4,
+ 0x81, 0x6b, 0x86, 0xd0, 0xd1, 0x44, 0x61, 0xab, 0x8d, 0x3e, 0x6b, 0xc5,
+ 0x88, 0x38, 0x48, 0x24, 0xee, 0x46, 0x4a, 0xa1, 0xca, 0x7d, 0x21, 0x80,
+ 0x07, 0x1d, 0xa5, 0xa0, 0x96, 0xc1, 0xb5, 0x20, 0xdb, 0x9f, 0xdc, 0x8e,
+ 0xae, 0x3c, 0x3f, 0xea, 0xd0, 0xb1, 0xd1, 0xc2, 0x74, 0x94, 0x84, 0x37,
+ 0x3d, 0x88, 0x20, 0xc4, 0xc7, 0x8c, 0xdb, 0x61, 0xda, 0x0c, 0x72, 0x06,
+ 0x4d, 0xdb, 0x72, 0x0e, 0x9e, 0xd8, 0xbf, 0x4b, 0x35, 0xd2, 0xf6, 0xb7,
+ 0x32, 0x7e, 0xdb, 0x97, 0x43, 0x3e, 0xf7, 0x48, 0xeb, 0xba, 0x3d, 0x55,
+ 0x3d, 0x7b, 0xa4, 0x3b, 0x7e, 0x24, 0x21, 0xba, 0x12, 0x47, 0xa2, 0x8a,
+ 0x41, 0x63, 0x72, 0x67, 0x97, 0x62, 0xaf, 0x03, 0x6f, 0x3f, 0xb1, 0x72,
+ 0x04, 0x40, 0x06, 0x68, 0x54, 0x92, 0x24, 0x6c, 0x48, 0x0e, 0x2c, 0x78,
+ 0x04, 0x2e, 0x82, 0x51, 0xaf, 0xb3, 0xc2, 0x71, 0xb3, 0x29, 0x21, 0x43,
+ 0x79, 0x0f, 0x1c, 0x08, 0x10, 0x12, 0x2b, 0x62, 0x56, 0xfe, 0x18, 0xb8,
+ 0x36, 0xc7, 0xdd, 0xf1, 0x29, 0xde, 0x05, 0x94, 0xb3, 0x8b, 0x77, 0x98,
+ 0x3d, 0x74, 0x39, 0xc5, 0xa8, 0x1c, 0xea, 0x88, 0x5d, 0x42, 0xe4, 0xa8,
+ 0x8d, 0xf8, 0x32, 0x42, 0x93, 0x8a, 0x4b, 0xa0, 0x9e, 0x27, 0xe1, 0x36,
+ 0x29, 0xec, 0xeb, 0xe0, 0x7b, 0x2a, 0xfc, 0x82, 0x63, 0xe4, 0xba, 0x41,
+ 0x68, 0x34, 0x14, 0x5c, 0xbf, 0x3a, 0x4d, 0xc4, 0xd5, 0xac, 0x45, 0xb7,
+ 0x83, 0x1e, 0x47, 0x27, 0xb8, 0xfe, 0x9e, 0x62, 0x61, 0xf5, 0x52, 0x57,
+ 0x39, 0x4f, 0xfb, 0x96, 0x5c, 0x3e, 0xa1, 0x28, 0xb2, 0x9d, 0x0f, 0x0e,
+ 0x99, 0xac, 0xac, 0xae, 0x57, 0x31, 0x51, 0x25, 0x19, 0x43, 0x50, 0x4f,
+ 0x3c, 0xb2, 0x48, 0xec, 0xff, 0x26, 0xe1, 0xc4, 0xff, 0x59, 0x63, 0x9a,
+ 0xd3, 0x0b, 0xb5, 0x70, 0xf4, 0xaa, 0x4f, 0x85, 0xbb, 0x22, 0x13, 0x57,
+ 0x72, 0xe8, 0x00, 0x61, 0xd7, 0xab, 0x07, 0x81, 0x18, 0xe2, 0x66, 0xb3,
+ 0x5f, 0xe5, 0x89, 0x46, 0x64, 0x47, 0x52, 0xae, 0xc9, 0xd6, 0xd0, 0x15,
+ 0x60, 0xc7, 0x72, 0xb6, 0x87, 0xe9, 0xcd, 0x46, 0x03, 0x60, 0x56, 0xe2,
+ 0x0a, 0x64, 0x1e, 0x2b, 0x50, 0xea, 0xb3, 0x8a, 0x15, 0x98, 0x9b, 0xab,
+ 0x44, 0x99, 0x6b, 0x2a, 0x49, 0xbb, 0xfd, 0x29, 0x94, 0xef, 0xf5, 0x4e,
+ 0x99, 0x9a, 0xf0, 0x7d, 0xcc, 0x1c, 0xe9, 0xbb, 0x33, 0x44, 0x43, 0xd5,
+ 0x63, 0x36, 0x74, 0x9c, 0x2c, 0x1a, 0x52, 0x35, 0x07, 0xd8, 0x7e, 0x73,
+ 0x50, 0x80, 0x9d, 0x28, 0x74, 0x97, 0x10, 0xc6, 0x60, 0x34, 0x9c, 0xe0,
+ 0x82, 0x39, 0xd4, 0x86, 0x24, 0xc4, 0x5f, 0xf6, 0xcb, 0xd5, 0x32, 0x3a,
+ 0x20, 0xac, 0xc1, 0xa6, 0x2a, 0xf5, 0xc9, 0x93, 0x45, 0xc5, 0xc9, 0x09,
+ 0xc0, 0x67, 0x20, 0xa5, 0x8d, 0x50, 0xad, 0xaf, 0xf5, 0xf1, 0x5b, 0xdb,
+ 0x14, 0xee, 0xea, 0x70, 0x0c, 0x86, 0x77, 0xa3, 0x4d, 0x89, 0xd5, 0x1a,
+ 0xd7, 0x22, 0xde, 0xb5, 0x0b, 0x66, 0xc7, 0x96, 0x9c, 0xb1, 0xbb, 0x37,
+ 0x47, 0xda, 0x81, 0x0b, 0x01, 0x7f, 0x10, 0x93, 0xfb, 0xd6, 0x93, 0x69,
+ 0x07, 0xd1, 0x26, 0x81, 0xe2, 0xff, 0x45, 0x35, 0x37, 0x23, 0x7e, 0x4b,
+ 0xc8, 0x0a, 0x02, 0x59, 0x33, 0x2e, 0x51, 0xa5, 0x37, 0x31, 0xb8, 0x71,
+ 0x00, 0xcf, 0x07, 0xe1, 0x6d, 0x36, 0x22, 0x32, 0x6e, 0x48, 0x47, 0xb0,
+ 0x3b, 0x71, 0x03, 0x83, 0xb2, 0x61, 0xc8, 0xac, 0x5f, 0x6e, 0x08, 0x31,
+ 0x10, 0x4e, 0xdf, 0x77, 0xd8, 0x49, 0x68, 0x9b, 0x4d, 0xd4, 0x01, 0xc1,
+ 0xf1, 0x28, 0x43, 0xf5, 0x4f, 0x89, 0xdb, 0x3b, 0xfb, 0x1d, 0xee, 0x86,
+ 0x0b, 0x02, 0x57, 0xd0, 0xf2, 0xf9, 0x8a, 0xd5, 0xf0, 0xf4, 0x9c, 0x25,
+ 0xfd, 0xf1, 0x07, 0x30, 0x16, 0xb6, 0x22, 0xd1, 0x84, 0x5e, 0xda, 0x60,
+ 0xe5, 0xd5, 0x60, 0xe0, 0xad, 0x67, 0xbe, 0xd7, 0x67, 0x6e, 0xe9, 0xd3,
+ 0x0e, 0x01, 0xd8, 0xda, 0x04, 0x00, 0xac, 0xee, 0xc5, 0xe3, 0x33, 0x4b,
+ 0xda, 0x49, 0x1a, 0x41, 0x2d, 0x36, 0xa4, 0x2e, 0x3c, 0x47, 0x1a, 0xe0,
+ 0x18, 0xd9, 0x4f, 0xf3, 0xec, 0xb0, 0x42, 0x5a, 0x81, 0xa2, 0x9e, 0x54,
+ 0x16, 0x8c, 0x93, 0x6c, 0xba, 0x23, 0x83, 0x04, 0xe5, 0xc7, 0xfb, 0x38,
+ 0xd0, 0xfb, 0x64, 0x69, 0xe3, 0x1d, 0x50, 0x09, 0x94, 0xef, 0x6c, 0x97,
+ 0xbd, 0xda, 0xfd, 0xdd, 0xd9, 0x84, 0x38, 0x1f, 0xd8, 0x8d, 0x40, 0xe8,
+ 0xa0, 0x4f, 0x4e, 0x55, 0xf2, 0x7a, 0x49, 0xf9, 0x87, 0xaa, 0x6e, 0xf6,
+ 0xc7, 0xd8, 0x66, 0x3c, 0x3b, 0xfc, 0x68, 0xd9, 0x44, 0x2c, 0x19, 0xc0,
+ 0x2a, 0x88, 0x6a, 0x62, 0x7c, 0x6e, 0xbe, 0x88, 0x18, 0x43, 0x9b, 0xdf,
+ 0xf4, 0x88, 0x37, 0xda, 0xfd, 0x5a, 0x3b, 0x2e, 0xae, 0x2f, 0xf9, 0x48,
+ 0x0a, 0x0b, 0x24, 0x1e, 0x3b, 0x21, 0x9c, 0x1b, 0xd8, 0xc4, 0x85, 0xcd,
+ 0x12, 0xa4, 0x87, 0x4f, 0xed, 0xca, 0xbc, 0x4e, 0x9f, 0xeb, 0xd9, 0x8f,
+ 0xda, 0xfd, 0xf4, 0xc3, 0x6d, 0x13, 0xa6, 0x73, 0x47, 0x50, 0x99, 0x59,
+ 0x81, 0xa8, 0xd6, 0xfb, 0x46, 0xca, 0x1a, 0xde, 0x32, 0x2b, 0xa1, 0x04,
+ 0x29, 0x95, 0x7f, 0xb6, 0x2e, 0x30, 0x2f, 0x8e, 0xc8, 0xe4, 0x44, 0x2f,
+ 0xe9, 0xfd, 0x5c, 0x05, 0x22, 0x8d, 0xfc, 0x57, 0x39, 0xd1, 0x8d, 0x62,
+ 0xc1, 0xee, 0x30, 0x4b, 0xa4, 0xbe, 0x9d, 0x01, 0xd2, 0x87, 0x98, 0xb8,
+ 0x05, 0xe4, 0xf8, 0x1f, 0x61, 0x0d, 0x79, 0x1e, 0x74, 0xb9, 0x24, 0x5c,
+ 0xe0, 0x32, 0xfc, 0x25, 0xf9, 0xef, 0x9f, 0xaf, 0x7e, 0xfd, 0x3a, 0x03,
+ 0x30, 0x09, 0x81, 0x61, 0x44, 0xa3, 0xf4, 0xd6, 0x1a, 0x85, 0x92, 0x6f,
+ 0xf5, 0x9c, 0x76, 0x0d, 0xb3, 0xb3, 0x32, 0x36, 0x2c, 0xeb, 0xa5, 0x08,
+ 0xc0, 0x2b, 0x32, 0xd6, 0x8d, 0x0a, 0x03, 0xbb, 0x06, 0x97, 0x4f, 0xf3,
+ 0xe3, 0x2a, 0x81, 0xd6, 0x3b, 0x09, 0x4a, 0xfc, 0x14, 0x5a, 0xa5, 0x35,
+ 0x08, 0xec, 0xb6, 0x89, 0x25, 0x5a, 0x63, 0x52, 0x00, 0x6b, 0xa0, 0x5c,
+ 0x04, 0x4a, 0x2c, 0xbd, 0x87, 0x28, 0xd8, 0xe4, 0x58, 0xbd, 0xd6, 0x34,
+ 0xe0, 0x55, 0x73, 0x47, 0x41, 0xf1, 0x30, 0xc2, 0xd8, 0x6b, 0x68, 0x2c,
+ 0xb6, 0xf7, 0x4a, 0x6e, 0x81, 0x32, 0xbd, 0x43, 0x74, 0xf4, 0x5a, 0xd0,
+ 0x9e, 0xe1, 0x20, 0xb0, 0x7f, 0x2f, 0xe0, 0x9b, 0xd9, 0xc6, 0x21, 0x72,
+ 0xa4, 0xd6, 0x7e, 0x8d, 0x8e, 0xc2, 0x68, 0xe2, 0x83, 0x7b, 0x86, 0x34,
+ 0x4d, 0xec, 0xe6, 0x01, 0xf3, 0x6b, 0xb3, 0x6b, 0x74, 0x07, 0x4c, 0x52,
+ 0x95, 0x6b, 0x19, 0xe0, 0xbd, 0x2e, 0x53, 0x56, 0x6c, 0x50, 0x07, 0x14,
+ 0xb8, 0xf5, 0xad, 0x98, 0xbb, 0x93, 0x45, 0xd1, 0xc0, 0x7e, 0x09, 0x1b,
+ 0xe1, 0xcb, 0x90, 0xd4, 0xe2, 0x79, 0x19, 0xba, 0xea, 0x7c, 0xda, 0xda,
+ 0x4f, 0x6e, 0x3c, 0xd1, 0xb0, 0x27, 0x2a, 0xb0, 0x5d, 0xed, 0xb0, 0xb0,
+ 0xff, 0x72, 0x65, 0x1f, 0xbc, 0xb6, 0x38, 0x6b, 0xe8, 0xcf, 0x66, 0xd4,
+ 0x35, 0x5e, 0xfd, 0x9c, 0x01, 0x4e, 0xf9, 0x92, 0x1e, 0x09, 0x7b, 0x0f,
+ 0x98, 0x11, 0x27, 0xa2, 0x70, 0xb7, 0xf5, 0x93, 0xdd, 0xbe, 0x69, 0xb8,
+ 0x9d, 0x1d, 0x8b, 0x70, 0x6c, 0x37, 0x4b, 0xfb, 0x78, 0xb2, 0x66, 0x7e,
+ 0xc5, 0xdb, 0xe2, 0xa1, 0xd6, 0x54, 0xc6, 0x3f, 0xbf, 0xf7, 0xd6, 0xae,
+ 0xd0, 0x46, 0xcb, 0x8d, 0x73, 0xbb, 0x01, 0x79, 0xc9, 0x0d, 0xdf, 0x81,
+ 0x63, 0xd4, 0xaf, 0xc4, 0x9e, 0x51, 0xdc, 0x6f, 0x72, 0xde, 0xf8, 0xc7,
+ 0x35, 0xd3, 0xc4, 0xc0, 0xdc, 0x40, 0x80, 0x27, 0x62, 0x36, 0x55, 0xaf,
+ 0xd1, 0x44, 0xc1, 0xe4, 0xb7, 0x3c, 0x00, 0xf2, 0x8d, 0x1b, 0x88, 0xdd,
+ 0x76, 0x9d, 0xc0, 0x3b, 0x29, 0x27, 0xba, 0xd3, 0x7b, 0x9c, 0xb1, 0x92,
+ 0xaa, 0xaa, 0xaf, 0x49, 0x4e, 0x36, 0x14, 0xe3, 0x95, 0x86, 0xee, 0x5a,
+ 0x75, 0xcc, 0x12, 0xde, 0xc8, 0xca, 0x02, 0x04, 0xdc, 0x6b, 0x7d, 0x0d,
+ 0x4b, 0xd2, 0x68, 0x75, 0xeb, 0x32, 0x5f, 0x3c, 0xa3, 0x40, 0x9c, 0x88,
+ 0xda, 0x61, 0xc9, 0xa3, 0xd3, 0xe0, 0xc4, 0x82, 0x13, 0x9c, 0x5c, 0x9f,
+ 0x53, 0xeb, 0xb3, 0x0a, 0x80, 0xb4, 0xe2, 0x6e, 0x3c, 0xbc, 0xac, 0x7e,
+ 0xd7, 0xfe, 0x9a, 0x68, 0xcb, 0x32, 0x05, 0x14, 0x20, 0x73, 0xe7, 0x05,
+ 0xb1, 0x43, 0xd9, 0x71, 0x14, 0xfb, 0x7b, 0x02, 0x01, 0x41, 0xe0, 0xe2,
+ 0xe4, 0x78, 0xba, 0xb6, 0x13, 0xad, 0xdc, 0x0e, 0xd5, 0x38, 0x67, 0xd8,
+ 0x56, 0xc4, 0xbd, 0x47, 0x14, 0x49, 0x24, 0x65, 0x4e, 0x83, 0x87, 0x20,
+ 0x90, 0xe7, 0x3c, 0x39, 0x83, 0x35, 0x88, 0x3f, 0x9c, 0xbc, 0xfa, 0xba,
+ 0x9f, 0xdf, 0xfa, 0x4d, 0xc1, 0x18, 0x64, 0xd7, 0xa0, 0x87, 0xa8, 0xac,
+ 0x58, 0xef, 0x1e, 0xae, 0xb8, 0x58, 0x8b, 0xe3, 0x3c, 0x8e, 0xdf, 0x9a,
+ 0x12, 0x37, 0x8e, 0x62, 0x79, 0xe5, 0xbe, 0xe0, 0x7a, 0x16, 0xa3, 0xdf,
+ 0x99, 0x98, 0x14, 0x56, 0x6e, 0xa8, 0x0a, 0x05, 0x0f, 0xf0, 0x70, 0x9f,
+ 0xcd, 0xfd, 0xb4, 0x23, 0xb3, 0x0b, 0xe1, 0x1d, 0xe6, 0xf8, 0xa7, 0x46,
+ 0x24, 0x7f, 0xef, 0xc4, 0x15, 0xe0, 0x7f, 0xfd, 0xa3, 0x7b, 0x5c, 0x1d,
+ 0x62, 0x0f, 0x5d, 0x91, 0x53, 0x27, 0xb3, 0xde, 0xa0, 0xee, 0xd2, 0xf9,
+ 0x19, 0x16, 0xca, 0x3e, 0x0d, 0x94, 0xa8, 0x78, 0x60, 0xc5, 0xc2, 0x2d,
+ 0xba, 0xbd, 0x33, 0x79, 0x7c, 0x73, 0x08, 0x5a, 0x95, 0x1d, 0xe6, 0x5e,
+ 0x1c, 0x24, 0xaa, 0x34, 0xf0, 0x70, 0xcf, 0xc2, 0xbe, 0x35, 0x43, 0x51,
+ 0x35, 0x05, 0x2f, 0x5e, 0xca, 0x04, 0x1e, 0x08, 0x6e, 0x13, 0xa5, 0x64,
+ 0xbd, 0xe8, 0xb1, 0x63, 0x38, 0xca, 0x4d, 0xc7, 0xf2, 0xde, 0x31, 0xc7,
+ 0xb0, 0x74, 0x0b, 0xef, 0x96, 0x32, 0xb0, 0xfc, 0xf3, 0x7f, 0xe4, 0xd0,
+ 0xf6, 0x78, 0xa0, 0x36, 0x1e, 0x6b, 0x84, 0xa6, 0x30, 0x0d, 0x74, 0xb9,
+ 0x96, 0xec, 0xcc, 0xdd, 0x07, 0x95, 0x8b, 0xa6, 0xf5, 0x00, 0x6c, 0x84,
+ 0x43, 0xfd, 0xe4, 0x3c, 0xbe, 0x34, 0x4d, 0x45, 0xf9, 0x05, 0x95, 0x58,
+ 0x6d, 0x36, 0xa5, 0x14, 0x00, 0x18, 0x6f, 0x31, 0x27, 0x2e, 0x97, 0x16,
+ 0x7b, 0xb8, 0xd8, 0x8d, 0x14, 0x93, 0xd6, 0xa9, 0xb3, 0x8d, 0x9d, 0x35,
+ 0x54, 0xbd, 0xac, 0x82, 0x4b, 0x8f, 0x72, 0x55, 0xbe, 0x9f, 0x14, 0x6c,
+ 0x87, 0x2f, 0x51, 0xe4, 0x3c, 0x02, 0x7e, 0x4f, 0xf6, 0x73, 0x2e, 0x19,
+ 0xb9, 0x62, 0x0a, 0x6c, 0x69, 0x35, 0x6d, 0x4b, 0x06, 0x44, 0x5d, 0x90,
+ 0xd7, 0x12, 0x5c, 0x9b, 0xba, 0x00, 0x53, 0x38, 0x09, 0xd8, 0x52, 0xdb,
+ 0x2d, 0xdd, 0x30, 0xda, 0x09, 0xa9, 0x14, 0xfb, 0x2f, 0xb3, 0x58, 0xdf,
+ 0xcd, 0xe8, 0x9b, 0x69, 0xa4, 0x98, 0x14, 0x3e, 0xc5, 0x34, 0xef, 0xca,
+ 0xee, 0xf9, 0xed, 0x34, 0x60, 0x8d, 0xd4, 0x0a, 0x0e, 0xa7, 0xf8, 0xbb,
+ 0x94, 0x4d, 0x47, 0x92, 0x2e, 0x09, 0xf4, 0xdf, 0x60, 0xf8, 0x35, 0x49,
+ 0xff, 0xe8, 0xfd, 0x1b, 0xf3, 0xcf, 0x2b, 0x11, 0xf6, 0x4e, 0x3a, 0x24,
+ 0x38, 0xe1, 0x82, 0xc7, 0xe5, 0x35, 0xd6, 0xe0, 0x71, 0x70, 0x53, 0x71,
+ 0xc9, 0x0d, 0x1f, 0xfe, 0x04, 0xeb, 0x0c, 0xa4, 0x04, 0xf7, 0x70, 0x1f,
+ 0x49, 0x01, 0x89, 0x55, 0x09, 0x01, 0x54, 0x56, 0xb4, 0xf5, 0xd5, 0x48,
+ 0xff, 0x8d, 0xcf, 0xea, 0xcb, 0x1c, 0xb0, 0x51, 0xf7, 0xb5, 0x96, 0x88,
+ 0x82, 0xb4, 0xd6, 0x2e, 0xba, 0x02, 0x9b, 0xcb, 0x26, 0x84, 0x65, 0x7d,
+ 0x83, 0x6c, 0x8a, 0x73, 0x31, 0x73, 0xd5, 0xdd, 0x15, 0x0a, 0xec, 0x48,
+ 0xf9, 0xe3, 0x2f, 0x7a, 0x59, 0x58, 0xf5, 0xb5, 0x14, 0xf5, 0x74, 0x36,
+ 0xb4, 0x46, 0x62, 0x55, 0xcf, 0x3c, 0x2f, 0x80, 0xa5, 0x20, 0x2a, 0xc7,
+ 0xd5, 0x09, 0xdd, 0xc1, 0xa5, 0xdc, 0xf1, 0x3a, 0xbd, 0xe7, 0xc7, 0x12,
+ 0x25, 0x2b, 0x28, 0xc8, 0x72, 0x2e, 0x98, 0x0b, 0x8f, 0x21, 0x2f, 0x04,
+ 0xe0, 0x7c, 0x51, 0xfd, 0x6a, 0xb0, 0x12, 0xf4, 0x5e, 0x99, 0xb7, 0x02,
+ 0x4a, 0x6e, 0x02, 0xd2, 0xd9, 0x81, 0xef, 0x6a, 0x11, 0xbc, 0x53, 0x82,
+ 0x51, 0xb6, 0xdc, 0x0e, 0x02, 0x60, 0xb3, 0x46, 0x63, 0xe1, 0xf6, 0x03,
+ 0x35, 0xee, 0xb7, 0x3b, 0x28, 0x8b, 0xa2, 0x8e, 0xfc, 0x80, 0x2e, 0x75,
+ 0xdf, 0xdf, 0xeb, 0x15, 0xba, 0x34, 0xda, 0xc8, 0x34, 0xcd, 0x71, 0xf6,
+ 0x47, 0x07, 0x32, 0x53, 0x1e, 0xe8, 0xd6, 0x9b, 0x0a, 0x3d, 0x34, 0xe2,
+ 0xc7, 0x5c, 0x63, 0x60, 0xd4, 0xd9, 0x5d, 0x3d, 0xb1, 0x51, 0x88, 0xc5,
+ 0x06, 0x26, 0xea, 0xb3, 0xc2, 0x8e, 0xdc, 0xb3, 0x41, 0x5c, 0xba, 0xcd,
+ 0x52, 0x55, 0xe6, 0x58, 0xef, 0x97, 0x1e, 0x29, 0xfa, 0x70, 0x64, 0xa6,
+ 0x01, 0x23, 0x41, 0x2e, 0xa8, 0x59, 0x87, 0x70, 0xf4, 0xae, 0xf8, 0xd8,
+ 0x4a, 0x25, 0x27, 0xbc, 0xed, 0xf8, 0x06, 0xfa, 0x5d, 0x28, 0x14, 0x48,
+ 0xb5, 0x63, 0x7a, 0x7e, 0xae, 0x55, 0x22, 0x05, 0xa3, 0xb2, 0xa1, 0xbb,
+ 0x65, 0xa3, 0xa6, 0xeb, 0x12, 0x52, 0x00, 0xd0, 0x99, 0xc3, 0x29, 0x13,
+ 0x9b, 0x11, 0xeb, 0xd5, 0x35, 0xa2, 0x76, 0x82, 0x7c, 0x0f, 0xba, 0xaa,
+ 0x64, 0x05, 0x7a, 0xb6, 0x77, 0xed, 0x76, 0xd6, 0x04, 0x7c, 0x7b, 0x2e,
+ 0x81, 0xef, 0xc4, 0x95, 0xcc, 0x1d, 0x69, 0x63, 0x5f, 0xae, 0x81, 0x70,
+ 0xb2, 0x64, 0x4e, 0x59, 0xb5, 0xd5, 0x4e, 0x50, 0xc3, 0x8d, 0xe3, 0x74,
+ 0x7e, 0xa8, 0x42, 0x68, 0x63, 0xe2, 0x68, 0x91, 0x1c, 0x76, 0x3f, 0x00,
+ 0x1d, 0x1d, 0x52, 0x3f, 0x60, 0x92, 0x84, 0x46, 0x41, 0x00, 0xb9, 0x6d,
+ 0x38, 0x27, 0x8d, 0xca, 0x11, 0x5c, 0xba, 0x17, 0xc7, 0x9c, 0x7f, 0x7b,
+ 0x44, 0xe2, 0x6f, 0x66, 0xcd, 0x36, 0xb0, 0x7a, 0x16, 0x79, 0x1e, 0x65,
+ 0x62, 0x31, 0x52, 0x17, 0xec, 0x70, 0x94, 0x81, 0xaf, 0x48, 0x95, 0xde,
+ 0x3d, 0x3c, 0x62, 0x44, 0x16, 0x71, 0x77, 0x80, 0xa8, 0x7c, 0x1c, 0x6d,
+ 0xb2, 0x13, 0x0a, 0x1c, 0xf6, 0xd2, 0x88, 0x85, 0xf9, 0x19, 0x9b, 0x91,
+ 0x77, 0x08, 0x3f, 0x1c, 0xd6, 0xbc, 0x13, 0x66, 0x1d, 0xea, 0x5c, 0x12,
+ 0x75, 0x17, 0x24, 0xf4, 0xc4, 0xbf, 0xac, 0xa1, 0x4b, 0x60, 0x2c, 0x1b,
+ 0xda, 0x44, 0x07, 0x81, 0x9c, 0x76, 0x63, 0xa2, 0x49, 0x6b, 0xb5, 0x3b,
+ 0x13, 0xf5, 0xa2, 0x10, 0x3b, 0x5e, 0xe6, 0xf8, 0xf9, 0x2b, 0xdb, 0xc4,
+ 0x8c, 0xd0, 0x7b, 0x28, 0xfa, 0x67, 0x7d, 0xc5, 0xb9, 0x25, 0xd3, 0x01,
+ 0x5e, 0x01, 0x10, 0x72, 0xfd, 0xf8, 0x4f, 0xe7, 0x68, 0x38, 0xba, 0x56,
+ 0x88, 0x33, 0xa5, 0x09, 0xb4, 0xd4, 0xcf, 0x31, 0x80, 0x57, 0xa5, 0xfe,
+ 0xce, 0x3e, 0x34, 0x99, 0x61, 0x9d, 0xa3, 0x09, 0x1f, 0x6f, 0x39, 0x53,
+ 0x64, 0xe5, 0xdf, 0xe0, 0x93, 0x6c, 0xbd, 0x68, 0xb5, 0x16, 0xdf, 0x11,
+ 0x60, 0x8d, 0x6a, 0xdc, 0x24, 0xa2, 0xc2, 0xde, 0xc8, 0xf7, 0xac, 0x8d,
+ 0xee, 0x6b, 0x8a, 0xae, 0x29, 0x06, 0xa9, 0xed, 0xaa, 0xa3, 0xab, 0x94,
+ 0x6f, 0xe0, 0x00, 0x19, 0x44, 0xa0, 0x1c, 0x1f, 0x85, 0xca, 0xc9, 0x6e,
+ 0x0b, 0x43, 0x7c, 0xc6, 0xdb, 0x20, 0x32, 0x06, 0x6b, 0x49, 0xd4, 0x54,
+ 0x88, 0x62, 0x93, 0xf0, 0xf1, 0xad, 0x7c, 0xb3, 0xf8, 0x30, 0xc9, 0x00,
+ 0x69, 0x11, 0x37, 0xa5, 0xb2, 0xa8, 0x21, 0x9c, 0x85, 0x74, 0x0b, 0xa1,
+ 0x14, 0x0d, 0x9b, 0x4a, 0x23, 0x22, 0xe0, 0x7a, 0x66, 0x19, 0xe0, 0xaf,
+ 0x47, 0xfb, 0x2a, 0x5d, 0x1e, 0x88, 0xb3, 0xe3, 0x23, 0x70, 0xfe, 0xc7,
+ 0x7b, 0x6b, 0x34, 0x7d, 0xb1, 0x8a, 0xcc, 0x1a, 0x69, 0x0d, 0x5a, 0xe7,
+ 0x34, 0xb9, 0x63, 0xc4, 0xd9, 0xc6, 0x06, 0x80, 0x7f, 0x4f, 0x00, 0x7a,
+ 0x94, 0x55, 0x08, 0x14, 0xee, 0xc5, 0x2a, 0x12, 0x88, 0x28, 0x45, 0xb0,
+ 0x12, 0x66, 0x34, 0xa3, 0xd3, 0x31, 0x3f, 0x05, 0x8e, 0x1f, 0x40, 0x3d,
+ 0x34, 0x16, 0x44, 0xca, 0x87, 0xa0, 0x60, 0xcd, 0xc6, 0x26, 0x37, 0x9f,
+ 0x56, 0x01, 0x8d, 0xc6, 0x90, 0xda, 0x5f, 0x3a, 0xc6, 0xc9, 0xf0, 0x90,
+ 0x1e, 0x88, 0x67, 0x69, 0xa1, 0x5b, 0xec, 0x8b, 0xa5, 0xe7, 0xa2, 0xfd,
+ 0xe3, 0x2c, 0x6f, 0x58, 0x82, 0x78, 0x0f, 0xcd, 0x6b, 0x54, 0x85, 0xa6,
+ 0x00, 0x29, 0x88, 0xdc, 0x67, 0x21, 0xcc, 0x0a, 0x88, 0xbb, 0xb4, 0x12,
+ 0x38, 0xee, 0x06, 0x59, 0x61, 0x08, 0x6a, 0xef, 0x52, 0xd6, 0x23, 0x63,
+ 0xd3, 0x26, 0x3a, 0x1a, 0x73, 0xc0, 0x2c, 0xf1, 0xf4, 0x60, 0xd0, 0x94,
+ 0x04, 0x3a, 0x31, 0x6d, 0xa1, 0x24, 0xab, 0x57, 0x57, 0x92, 0xd2, 0x3f,
+ 0x15, 0xf8, 0xde, 0x83, 0x91, 0x1c, 0xa2, 0x23, 0xd0, 0x82, 0x3e, 0xe3,
+ 0x59, 0x5b, 0x1f, 0xb1, 0x28, 0x1a, 0x54, 0xee, 0x60, 0x3f, 0xf1, 0xb8,
+ 0x9d, 0xee, 0xb1, 0xcb, 0x1d, 0x8b, 0x0f, 0x44, 0x63, 0xb9, 0x37, 0xfc,
+ 0x4e, 0xc6, 0xe9, 0xc9, 0xf4, 0x6d, 0x23, 0xaa, 0x25, 0xe9, 0xcf, 0x46,
+ 0x67, 0xbd, 0x28, 0x98, 0xf8, 0x5e, 0xba, 0xe3, 0x77, 0x00, 0x54, 0x30,
+ 0x52, 0xa8, 0x18, 0xd5, 0x7d, 0xb4, 0x76, 0x8f, 0xb8, 0xb1, 0x5c, 0x16,
+ 0xf8, 0xc0, 0x1d, 0x13, 0x6e, 0xf9, 0x50, 0x89, 0x95, 0xf0, 0x35, 0x77,
+ 0xd7, 0x7f, 0x17, 0x18, 0xe9, 0xf0, 0xa0, 0x6d, 0x10, 0x97, 0x9e, 0x18,
+ 0x10, 0xc4, 0xe3, 0xf4, 0x2b, 0x00, 0xde, 0x2d, 0x24, 0xd4, 0xcf, 0xa2,
+ 0x8a, 0x2b, 0x0a, 0x80, 0x18, 0x15, 0xef, 0x00, 0x9a, 0xf2, 0x7a, 0x01,
+ 0x09, 0x9b, 0xb4, 0xc4, 0xeb, 0x96, 0x70, 0xda, 0xf6, 0xef, 0x43, 0x77,
+ 0x9c, 0xae, 0x0a, 0xca, 0xfd, 0xc5, 0xb0, 0x85, 0xf8, 0xca, 0xa6, 0x49,
+ 0x01, 0xd7, 0x1a, 0x44, 0xfe, 0xe5, 0x1b, 0x91, 0x62, 0x63, 0xc5, 0x70,
+ 0x23, 0x56, 0x45, 0x74, 0xcb, 0x0c, 0x8f, 0xff, 0x95, 0xd1, 0x40, 0x00,
+ 0x0e, 0x86, 0x10, 0x2b, 0xb8, 0x40, 0x92, 0x80, 0x4f, 0xed, 0xb6, 0x5b,
+ 0x94, 0x60, 0x9f, 0x09, 0x51, 0x87, 0xa7, 0x31, 0x51, 0x06, 0xfe, 0x85,
+ 0xb8, 0x05, 0xe7, 0xd1, 0x44, 0x8b, 0x20, 0x13, 0x85, 0xaa, 0x09, 0xc8,
+ 0x8b, 0xa9, 0xec, 0x3f, 0xb7, 0x9d, 0x5b, 0x96, 0x50, 0xf1, 0x16, 0xf4,
+ 0x1d, 0x84, 0x3f, 0x9a, 0x40, 0x14, 0x2c, 0xa3, 0xa3, 0xaf, 0x01, 0xe8,
+ 0x83, 0xd4, 0x08, 0x68, 0x02, 0x58, 0xf4, 0x0c, 0xd5, 0x3a, 0xd2, 0x81,
+ 0x01, 0xeb, 0xf9, 0x91, 0x9c, 0x6e, 0x0f, 0x80, 0xce, 0xf7, 0x0e, 0x93,
+ 0xf7, 0xfe, 0x82, 0xd3, 0x0e, 0x48, 0x8d, 0xc7, 0x26, 0xd0, 0x8e, 0x5a,
+ 0xa3, 0xd7, 0x9a, 0xc3, 0x75, 0xc7, 0x42, 0xdc, 0x31, 0x53, 0x5d, 0xdf,
+ 0xab, 0xfa, 0x2d, 0x0c, 0x24, 0x3f, 0x94, 0x20, 0x84, 0xc2, 0xed, 0x0d,
+ 0x90, 0x8a, 0x98, 0x56, 0x17, 0xd0, 0xa6, 0x6a, 0x6e, 0xf0, 0x0f, 0x8c,
+ 0x5b, 0x49, 0xa6, 0x33, 0xef, 0x69, 0xab, 0x7e, 0x68, 0x52, 0xca, 0x5b,
+ 0xe6, 0x32, 0x2a, 0x2d, 0x57, 0xb5, 0x4e, 0x1a, 0xfa, 0x1b, 0xfa, 0xd2,
+ 0x02, 0x56, 0x79, 0x45, 0xc6, 0x65, 0x80, 0x3a, 0x14, 0xd6, 0xf9, 0x3b,
+ 0x57, 0x8b, 0xe5, 0xf4, 0x09, 0x31, 0x8c, 0xc9, 0x24, 0x8b, 0x4e, 0x40,
+ 0xf7, 0xf6, 0x5b, 0xa8, 0x49, 0x45, 0x9f, 0xca, 0x8d, 0x16, 0x1f, 0x2d,
+ 0x40, 0x8f, 0x82, 0x10, 0x64, 0xbc, 0xe9, 0xaf, 0x9d, 0xae, 0x82, 0x03,
+ 0x71, 0xb3, 0x77, 0xb2, 0x59, 0x4f, 0x58, 0xa6, 0xa5, 0x9c, 0xfc, 0x42,
+ 0x3a, 0x78, 0x60, 0xd6, 0xbd, 0xfd, 0x54, 0xc6, 0x2e, 0x36, 0xd9, 0xd0,
+ 0xe8, 0x12, 0xf4, 0xe3, 0xdd, 0x4c, 0xa5, 0x79, 0x9c, 0xff, 0x81, 0x46,
+ 0x30, 0xe1, 0xb3, 0x5c, 0xd6, 0x2c, 0x8b, 0x44, 0xe5, 0xd2, 0xe8, 0x04,
+ 0x0d, 0x49, 0x4d, 0xc6, 0xb8, 0x58, 0xf5, 0x78, 0x1e, 0xd0, 0x4d, 0x5d,
+ 0x99, 0xcb, 0xbe, 0x7c, 0x8f, 0xf7, 0x1e, 0x59, 0xfb, 0x1a, 0x4e, 0xa4,
+ 0xf1, 0x5d, 0xfc, 0x00, 0x04, 0x7d, 0x4d, 0xc4, 0x07, 0xb3, 0xb2, 0xd4,
+ 0xf3, 0xa3, 0xc0, 0xbc, 0xdd, 0x63, 0xc8, 0x23, 0x03, 0x97, 0x5b, 0xc0,
+ 0xc8, 0x87, 0x72, 0xeb, 0xb5, 0xa3, 0xdb, 0xe2, 0x3e, 0x4a, 0x26, 0x0a,
+ 0xd2, 0x54, 0x45, 0x71, 0x89, 0xaf, 0xa1, 0xd6, 0x21, 0xf9, 0x7f, 0x15,
+ 0xc0, 0xcd, 0x40, 0xa7, 0xb0, 0x1a, 0x7a, 0xfe, 0x34, 0xbf, 0x73, 0xf0,
+ 0x90, 0x43, 0x1f, 0x6f, 0x4e, 0x0a, 0xa6, 0x33, 0xf3, 0x33, 0xc9, 0x9d,
+ 0x85, 0x25, 0xa9, 0x13, 0xdc, 0x2b, 0xd1, 0xe7, 0x01, 0x85, 0x50, 0xb8,
+ 0x4c, 0xa6, 0xb7, 0x6d, 0xf0, 0x96, 0x0f, 0x00, 0xb3, 0x46, 0x2e, 0x94,
+ 0xf0, 0xd3, 0x67, 0xe9, 0xc0, 0x29, 0x4e, 0x75, 0xf7, 0xfa, 0x23, 0x06,
+ 0x5e, 0xee, 0x22, 0xba, 0x94, 0x84, 0xf9, 0x59, 0x26, 0x65, 0x70, 0x2a,
+ 0x81, 0xf6, 0xf9, 0x48, 0x0c, 0x38, 0xf4, 0x0c, 0x6c, 0x59, 0x8b, 0x06,
+ 0xa7, 0x07, 0x82, 0x8c, 0x8e, 0x9b, 0x09, 0xed, 0x98, 0x26, 0x3e, 0xb9,
+ 0x79, 0xcd, 0x4b, 0x03, 0xfa, 0x25, 0x77, 0x47, 0xe9, 0x63, 0xbf, 0xa9,
+ 0x41, 0x29, 0x97, 0x1f, 0xb7, 0x7f, 0x6f, 0xd1, 0xb5, 0xab, 0xae, 0x80,
+ 0xbb, 0xdc, 0x46, 0x29, 0x83, 0x4a, 0x62, 0x48, 0xfd, 0x42, 0x4a, 0xba,
+ 0xee, 0xcb, 0x99, 0xce, 0x6d, 0x5b, 0x7d, 0x0e, 0xf8, 0x35, 0x37, 0xb9,
+ 0xcd, 0xab, 0xf8, 0x49, 0xfa, 0xa9, 0xdb, 0xdb, 0xec, 0x05, 0x97, 0x09,
+ 0x6f, 0x7d, 0x0f, 0x07, 0xad, 0x27, 0x73, 0xf8, 0x51, 0x58, 0x7b, 0x1d,
+ 0x0f, 0x15, 0xb9, 0x24, 0x76, 0x84, 0x06, 0x0f, 0x2d, 0x9f, 0xb6, 0x8a,
+ 0x42, 0x70, 0x97, 0x59, 0x81, 0x7f, 0xa9, 0x5c, 0xbb, 0x89, 0x26, 0xaf,
+ 0xcd, 0x32, 0x32, 0x3a, 0x64, 0x24, 0xc9, 0xd5, 0xec, 0x62, 0xd6, 0x53,
+ 0xda, 0xfe, 0xf5, 0xd1, 0x5a, 0x46, 0x0c, 0x29, 0x94, 0x6c, 0x15, 0x33,
+ 0x63, 0xba, 0x25, 0xbd, 0x44, 0x3e, 0x4b, 0x5e, 0x5b, 0xe0, 0xf6, 0x2d,
+ 0xcf, 0x7a, 0x44, 0x3d, 0xc2, 0xc4, 0xdd, 0x76, 0x3a, 0xd1, 0x72, 0xd9,
+ 0x23, 0xb2, 0xf0, 0xc5, 0x78, 0xe3, 0x0f, 0x79, 0xb2, 0x0c, 0x07, 0x03,
+ 0x1e, 0x3e, 0x5a, 0xc7, 0x5b, 0x88, 0x1b, 0x32, 0x2c, 0x33, 0x04, 0xd8,
+ 0x2b, 0xeb, 0xa6, 0x84, 0xe9, 0xee, 0x1d, 0xed, 0x95, 0x98, 0x25, 0x80,
+ 0x07, 0x10, 0x0b, 0x9b, 0xf8, 0x63, 0xe0, 0xc4, 0xe2, 0x1d, 0x9d, 0x0e,
+ 0xc8, 0xba, 0xbb, 0x24, 0x27, 0x1c, 0xf4, 0x14, 0x9c, 0x56, 0x9e, 0xd3,
+ 0x00, 0x26, 0x61, 0x6a, 0xb8, 0x06, 0xa4, 0x09, 0xf2, 0x0d, 0x1a, 0x68,
+ 0x6c, 0x65, 0xdf, 0xce, 0x9c, 0x66, 0x07, 0x06, 0x4a, 0xba, 0x8b, 0x20,
+ 0x66, 0x4d, 0x4b, 0x88, 0x72, 0xd1, 0xa2, 0xaa, 0xd7, 0xb6, 0x07, 0x79,
+ 0x42, 0x54, 0x87, 0x4c, 0x91, 0xbf, 0xa8, 0x96, 0xf3, 0x76, 0xba, 0xb3,
+ 0xb6, 0x2b, 0x00, 0x04, 0xf1, 0xf0, 0x14, 0xe4, 0x63, 0x66, 0xc5, 0xdc,
+ 0x23, 0xb4, 0x6d, 0x93, 0x0c, 0x10, 0x49, 0x7a, 0x20, 0xb9, 0x07, 0x58,
+ 0xd8, 0xf6, 0x9e, 0x4e, 0x6a, 0x1b, 0x9d, 0x13, 0x24, 0xe5, 0xd9, 0x7b,
+ 0xa5, 0x86, 0xa6, 0x39, 0xef, 0xd3, 0xbd, 0x5b, 0xa9, 0x2b, 0x78, 0x6f,
+ 0xd8, 0x59, 0x4f, 0x20, 0x30, 0x8f, 0x38, 0x7c, 0x70, 0x32, 0xab, 0x11,
+ 0x00, 0xef, 0x47, 0x3e, 0xf5, 0x27, 0xa4, 0x7b, 0xfb, 0xc8, 0x26, 0x87,
+ 0x5a, 0x26, 0x8d, 0xee, 0xa2, 0x01, 0x98, 0x97, 0x2c, 0x57, 0x2f, 0x4e,
+ 0xf6, 0x52, 0x7a, 0x4e, 0x9c, 0xf5, 0x9e, 0x48, 0x58, 0xf4, 0x99, 0x30,
+ 0xe2, 0x36, 0x0e, 0xc5, 0x3c, 0x74, 0x30, 0xb4, 0x2f, 0x2e, 0xd5, 0xb5,
+ 0x4d, 0x39, 0x1f, 0xa0, 0xbd, 0x93, 0x39, 0xc1, 0x46, 0xcc, 0xe1, 0xbc,
+ 0x24, 0x5c, 0x35, 0x57, 0x8e, 0x0a, 0x80, 0xca, 0xd1, 0x89, 0x4d, 0x05,
+ 0xcf, 0xd6, 0x4a, 0xcf, 0xa4, 0xb7, 0xb8, 0xa3, 0x72, 0xb7, 0xa0, 0xda,
+ 0xb3, 0x81, 0xf5, 0x28, 0xae, 0xde, 0x90, 0x6a, 0x61, 0x3d, 0x60, 0xac,
+ 0xf7, 0xe6, 0xb4, 0xdf, 0xba, 0x08, 0x30, 0xd3, 0x1e, 0xc1, 0xe4, 0x39,
+ 0x93, 0xb3, 0xf8, 0x57, 0xa6, 0x9d, 0xb5, 0xbb, 0x7e, 0xe6, 0xe7, 0xb1,
+ 0x30, 0x24, 0x89, 0x2f, 0x4a, 0xec, 0xf8, 0xd9, 0x5a, 0x76, 0x1c, 0x2d,
+ 0xfc, 0xe0, 0xd5, 0x13, 0xfd, 0x48, 0x97, 0x34, 0x59, 0xa9, 0x73, 0x60,
+ 0x0f, 0x89, 0xf0, 0x5b, 0xbe, 0xf1, 0xd7, 0x2c, 0x8e, 0x07, 0x12, 0x23,
+ 0x62, 0x1c, 0xe8, 0xae, 0x1a, 0xef, 0x85, 0xab, 0x94, 0x73, 0xd0, 0xb9,
+ 0x48, 0x56, 0x9f, 0x5e, 0x5b, 0x88, 0x75, 0xf8, 0x36, 0x91, 0x1f, 0xa4,
+ 0xd7, 0xac, 0x94, 0x33, 0xcb, 0x26, 0xed, 0x87, 0x73, 0xc7, 0x7f, 0x2e,
+ 0x34, 0xdc, 0x30, 0x50, 0x2a, 0xb7, 0xac, 0x31, 0x99, 0x80, 0x86, 0xdc,
+ 0xcb, 0x0d, 0xbf, 0xce, 0x11, 0x14, 0x71, 0xf1, 0xa2, 0xa6, 0x83, 0xfc,
+ 0x30, 0x35, 0xf0, 0xb1, 0x36, 0x90, 0x65, 0xbc, 0x04, 0xa7, 0x03, 0x93,
+ 0x8b, 0x79, 0xd6, 0xb0, 0x00, 0xe1, 0x72, 0x1a, 0x13, 0x18, 0x38, 0xc3,
+ 0x5c, 0xfd, 0x9b, 0x07, 0x65, 0x16, 0x55, 0xab, 0x52, 0x16, 0x4c, 0xf2,
+ 0xaf, 0x7f, 0xcd, 0x2e, 0x54, 0x0b, 0x5f, 0xcf, 0xc5, 0x2a, 0xdf, 0xa0,
+ 0xb1, 0x23, 0xbd, 0xf7, 0xeb, 0x5b, 0xc6, 0x2c, 0x12, 0xd2, 0xe4, 0x1f,
+ 0x8b, 0xf8, 0xdb, 0xd6, 0x47, 0x76, 0x41, 0x6b, 0x4a, 0x9a, 0x63, 0x43,
+ 0x6d, 0xfa, 0x33, 0x6c, 0xf6, 0x9f, 0xa2, 0x27, 0x98, 0x06, 0x6d, 0xe0,
+ 0x79, 0x70, 0xf2, 0xd4, 0x83, 0xa4, 0x48, 0x01, 0x7d, 0xd6, 0x00, 0xbd,
+ 0xbf, 0xa3, 0xfc, 0xad, 0x9b, 0x1e, 0x92, 0xdc, 0xa7, 0xf4, 0x01, 0xe9,
+ 0x68, 0xc2, 0xb3, 0x5a, 0xeb, 0xc1, 0xe1, 0x74, 0xa8, 0xc1, 0x44, 0x55,
+ 0xc3, 0x59, 0x41, 0x19, 0xd4, 0x71, 0x56, 0xd6, 0x06, 0x24, 0x36, 0x47,
+ 0xfa, 0x8d, 0xa4, 0xb3, 0xa8, 0x54, 0xed, 0x46, 0x1a, 0xc3, 0xdd, 0x72,
+ 0xab, 0x07, 0x1e, 0xbe, 0x80, 0xfc, 0x25, 0x15, 0xd5, 0x52, 0x1b, 0x61,
+ 0x12, 0x88, 0x12, 0x01, 0x53, 0x57, 0xb7, 0xcc, 0x16, 0xc5, 0xc2, 0x49,
+ 0xe6, 0x28, 0xa3, 0xf6, 0x44, 0xd9, 0xb3, 0xed, 0xf9, 0x7f, 0x20, 0xad,
+ 0x80, 0xe5, 0x9a, 0x4b, 0xa6, 0x8e, 0xda, 0x94, 0x1c, 0x80, 0x60, 0x23,
+ 0xda, 0x75, 0x29, 0x1e, 0x3e, 0xdd, 0xba, 0x06, 0x88, 0x51, 0x25, 0xca,
+ 0x6e, 0x06, 0x39, 0x50, 0xa7, 0xf0, 0x90, 0xbe, 0xc9, 0x45, 0x8e, 0xf8,
+ 0x48, 0xae, 0xa5, 0xa3, 0xc0, 0x18, 0xaa, 0x0f, 0xbe, 0x81, 0x67, 0xe4,
+ 0xb4, 0x03, 0x2b, 0xe4, 0xb9, 0x47, 0x81, 0x8c, 0x6d, 0x48, 0xfd, 0xe7,
+ 0x55, 0xc6, 0xea, 0xb9, 0x65, 0xae, 0xd0, 0x57, 0x92, 0x20, 0x4c, 0xde,
+ 0xeb, 0x7b, 0xa8, 0x75, 0x57, 0xd7, 0x5a, 0xa3, 0xb9, 0x70, 0x9f, 0xb9,
+ 0xfb, 0xe4, 0x9b, 0x14, 0x24, 0x31, 0x31, 0xb6, 0xe9, 0x3f, 0xd5, 0x7e,
+ 0x5e, 0xf2, 0xa1, 0x9d, 0xe0, 0x02, 0x4d, 0x90, 0x3f, 0x48, 0x68, 0x95,
+ 0x37, 0xe6, 0x70, 0x60, 0xa8, 0x59, 0x01, 0x82, 0x4c, 0x66, 0x51, 0xc0,
+ 0xd3, 0x41, 0x00, 0xa7, 0x70, 0x9f, 0x4e, 0xd0, 0x44, 0x8a, 0x7b, 0x46,
+ 0x04, 0x1d, 0x06, 0x4c, 0x38, 0x8d, 0xe5, 0x63, 0x6b, 0x9d, 0x75, 0x9c,
+ 0xa2, 0x69, 0x9a, 0x22, 0x4b, 0x23, 0xe2, 0x8f, 0xe4, 0x15, 0xef, 0x76,
+ 0xf6, 0x36, 0xf8, 0xcd, 0xc1, 0x12, 0x55, 0xb0, 0xa7, 0xe5, 0xb9, 0xfb,
+ 0xd3, 0x92, 0xf9, 0xe1, 0x0c, 0xb1, 0xc7, 0x17, 0x90, 0x1a, 0x78, 0x04,
+ 0xec, 0x88, 0x6b, 0x00, 0xeb, 0xe5, 0x90, 0xec, 0x84, 0x8c, 0xb2, 0x2c,
+ 0x0d, 0xc5, 0x48, 0xc6, 0x34, 0x8b, 0x9a, 0x44, 0x45, 0x5d, 0x27, 0x40,
+ 0x36, 0x82, 0x91, 0x2b, 0xcc, 0x37, 0x5e, 0xc3, 0xd7, 0xef, 0x10, 0x43,
+ 0x7a, 0x07, 0x80, 0x21, 0xd8, 0x50, 0x8d, 0xbd, 0x75, 0xae, 0x89, 0x0f,
+ 0xe2, 0x6f, 0x30, 0x48, 0x00, 0xa1, 0xb8, 0xe8, 0x86, 0x61, 0xdb, 0xa2,
+ 0x26, 0x31, 0x28, 0xfa, 0x64, 0xfb, 0x0f, 0x87, 0x35, 0xef, 0x00, 0x4a,
+ 0x39, 0xb0, 0xf0, 0x26, 0x2a, 0x6e, 0xae, 0x4e, 0xad, 0x71, 0xb2, 0x64,
+ 0x4b, 0xc9, 0xda, 0x49, 0x97, 0x1b, 0x6a, 0x3a, 0xe9, 0x01, 0x43, 0xa0,
+ 0x8f, 0xbc, 0xf5, 0xa0, 0x06, 0xd6, 0x80, 0x70, 0x37, 0x27, 0x85, 0xf8,
+ 0x81, 0x07, 0x69, 0x80, 0x5a, 0xf4, 0x27, 0x4b, 0x41, 0x47, 0xf9, 0xc0,
+ 0x61, 0x8f, 0x79, 0xb2, 0xea, 0xfb, 0x99, 0xf1, 0x23, 0x94, 0xc0, 0xce,
+ 0x69, 0x9a, 0x32, 0x09, 0x02, 0x1a, 0x84, 0x66, 0xd5, 0x50, 0x58, 0xa8,
+ 0x4a, 0xdb, 0xb2, 0x33, 0x7d, 0x7f, 0xb4, 0xa2, 0xe7, 0x8a, 0x5b, 0xc6,
+ 0x9d, 0x5c, 0xbf, 0x75, 0x50, 0xac, 0xea, 0xe5, 0x01, 0x41, 0x12, 0x29,
+ 0x56, 0x15, 0x58, 0x6c, 0xa4, 0x85, 0x71, 0x9a, 0x31, 0x3c, 0xc2, 0x9b,
+ 0xd3, 0x9a, 0xcd, 0xed, 0x9a, 0xb5, 0x48, 0xf5, 0xc6, 0xdc, 0xa8, 0x51,
+ 0x9e, 0x45, 0x8a, 0x50, 0xab, 0x8d, 0x5e, 0x74, 0x00, 0xd7, 0x6f, 0x48,
+ 0x7a, 0xc3, 0xb0, 0x7f, 0x21, 0x3b, 0x7b, 0x9a, 0x40, 0x24, 0xae, 0x42,
+ 0x28, 0x90, 0xd6, 0x38, 0xdc, 0x86, 0x6c, 0xd9, 0x62, 0x9e, 0x2f, 0x48,
+ 0xbc, 0x83, 0x43, 0x51, 0x6c, 0x2b, 0x09, 0x05, 0x78, 0xf0, 0xa1, 0x5c,
+ 0x9c, 0x02, 0x5e, 0xa8, 0x5a, 0xc8, 0x6a, 0x13, 0x01, 0xa7, 0xa3, 0x7d,
+ 0xff, 0x0b, 0xe3, 0x53, 0x0e, 0xae, 0x6c, 0xae, 0xfb, 0x86, 0xaf, 0xf7,
+ 0x00, 0x87, 0x86, 0x76, 0x59, 0x34, 0x88, 0x14, 0x73, 0xef, 0xe3, 0xe1,
+ 0xfd, 0x5a, 0x6c, 0xd2, 0x42, 0x83, 0x55, 0xae, 0x3f, 0x1e, 0x25, 0x09,
+ 0xd6, 0xd7, 0x19, 0x38, 0xb6, 0x47, 0x4b, 0x00, 0x70, 0x22, 0xb5, 0x54,
+ 0x19, 0xd1, 0x5c, 0x46, 0xe9, 0x2a, 0x16, 0x39, 0xf0, 0x37, 0x67, 0xa3,
+ 0x25, 0xe5, 0xbf, 0xe3, 0x12, 0x36, 0xdc, 0x6f, 0xad, 0x51, 0xf0, 0x0f,
+ 0x88, 0x4a, 0xb9, 0x3a, 0x14, 0x94, 0x56, 0xf8, 0x3a, 0xf6, 0x5b, 0x45,
+ 0x80, 0x03, 0x2e, 0xe3, 0xfd, 0x55, 0xee, 0x16, 0x5c, 0x33, 0xe4, 0x73,
+ 0x4e, 0x84, 0x60, 0x28, 0x62, 0x70, 0x7a, 0x1b, 0xca, 0xb6, 0xad, 0x17,
+ 0xa4, 0x3c, 0x08, 0xb6, 0x00, 0x82, 0x38, 0x7f, 0xbe, 0x4d, 0x67, 0x4a,
+ 0x5f, 0x64, 0x3b, 0x37, 0x51, 0x99, 0x9e, 0xd9, 0x98, 0x99, 0xc5, 0x96,
+ 0x10, 0x68, 0x46, 0xc8, 0xed, 0x01, 0x0d, 0x39, 0x04, 0xbc, 0xe0, 0x1a,
+ 0x61, 0xc9, 0x6c, 0x61, 0xd6, 0xf6, 0xee, 0xb3, 0xec, 0xda, 0xf4, 0x73,
+ 0x94, 0x92, 0xc8, 0x01, 0xd9, 0x21, 0xd9, 0xd7, 0x86, 0xf8, 0xd4, 0xfb,
+ 0x85, 0x70, 0x5e, 0x8d, 0x0e, 0xbd, 0x58, 0x79, 0xeb, 0x0b, 0xd7, 0xd4,
+ 0xbf, 0x2d, 0xa7, 0x4e, 0xc0, 0xef, 0x22, 0x04, 0x90, 0x3f, 0x6f, 0xaf,
+ 0xe5, 0xb8, 0x3f, 0xb5, 0x70, 0x26, 0x08, 0xe3, 0xa0, 0x05, 0xae, 0x1d,
+ 0x5a, 0xec, 0xc7, 0xbd, 0x22, 0xc9, 0x13, 0xc9, 0xc1, 0xfc, 0xe0, 0xac,
+ 0x29, 0xb7, 0x5a, 0xab, 0xc1, 0x3e, 0x34, 0xf0, 0xf2, 0x73, 0x19, 0x71,
+ 0xde, 0x3f, 0xa3, 0x28, 0xc1, 0xb4, 0x6d, 0xbe, 0x7b, 0x06, 0xa5, 0x92,
+ 0x15, 0x7a, 0x46, 0x63, 0x8a, 0x4c, 0x31, 0x7d, 0xa0, 0x43, 0x3e, 0xca,
+ 0x05, 0x02, 0x2e, 0xb1, 0x1d, 0x81, 0xd7, 0x3b, 0x16, 0xf8, 0x98, 0x01,
+ 0x6f, 0xff, 0x7a, 0x3a, 0xfd, 0x32, 0x70, 0xb1, 0xf0, 0x20, 0xa7, 0x3e,
+ 0x78, 0x43, 0xde, 0x9c, 0xf9, 0xff, 0x51, 0xd2, 0x1b, 0xe8, 0xa5, 0x51,
+ 0x7b, 0x23, 0x31, 0x2c, 0xa2, 0x59, 0x37, 0x67, 0x6a, 0x79, 0xd2, 0x9f,
+ 0x6c, 0xbd, 0x85, 0xa5, 0xab, 0xfa, 0x4f, 0xea, 0x8a, 0xe8, 0xcd, 0x4d,
+ 0xd8, 0xbc, 0x04, 0x60, 0x5a, 0xff, 0xbf, 0x5b, 0xbb, 0x23, 0xef, 0xe4,
+ 0xb7, 0xb8, 0x2e, 0x14, 0x4f, 0xbc, 0xf5, 0x5b, 0xa2, 0x96, 0x56, 0xba,
+ 0xd7, 0x7f, 0x44, 0x35, 0xed, 0xcc, 0x05, 0xd8, 0xc8, 0xe2, 0x7a, 0x71,
+ 0x39, 0x2f, 0xd9, 0x51, 0xd5, 0x30, 0x10, 0x54, 0xc2, 0xa6, 0x42, 0xd3,
+ 0x8c, 0x64, 0x00, 0x87, 0xc3, 0xd7, 0xec, 0x00, 0xaa, 0xcf, 0xe1, 0xaf,
+ 0x9e, 0x74, 0xf0, 0x0b, 0xf4, 0x0f, 0x97, 0xc9, 0x0d, 0xbe, 0x7e, 0x01,
+ 0xcf, 0xe9, 0x85, 0x08, 0x83, 0x35, 0x08, 0x05, 0xa2, 0x5d, 0x83, 0x7f,
+ 0x6a, 0xe5, 0xad, 0x42, 0xcb, 0xa3, 0x02, 0x1f, 0x39, 0x68, 0x6e, 0x3d,
+ 0xf2, 0x8a, 0x1b, 0x1d, 0x9e, 0x5f, 0x1d, 0x76, 0x6b, 0x97, 0xc2, 0xcc,
+ 0x7e, 0x0c, 0x72, 0x4b, 0xa9, 0x0f, 0x8f, 0x14, 0x31, 0x46, 0x80, 0x0e,
+ 0x25, 0xac, 0xbc, 0xb9, 0x6f, 0x43, 0xe5, 0xa8, 0x53, 0xe8, 0x48, 0xf2,
+ 0x6e, 0xae, 0xfa, 0x3a, 0xa9, 0x08, 0x27, 0xb3, 0x0d, 0xd6, 0xfb, 0x77,
+ 0xfa, 0x28, 0x96, 0x5a, 0x17, 0x31, 0xd7, 0x97, 0x84, 0x2b, 0xae, 0xe5,
+ 0x8a, 0x9e, 0x04, 0xfe, 0x74, 0x93, 0x6b, 0x35, 0xcd, 0x68, 0x14, 0x14,
+ 0x83, 0xbc, 0xe5, 0x59, 0x82, 0x65, 0x67, 0x47, 0xdc, 0x34, 0x4c, 0x7e,
+ 0x8f, 0x65, 0x70, 0xb1, 0xfc, 0xd5, 0x60, 0x2a, 0x95, 0x23, 0x90, 0x5b,
+ 0x07, 0xfc, 0x45, 0x09, 0x52, 0xfa, 0xbb, 0x8f, 0xf4, 0x33, 0xd1, 0x4b,
+ 0x8a, 0x5a, 0xc3, 0xe1, 0x20, 0x9c, 0x40, 0x2d, 0x0b, 0xd2, 0xe6, 0x85,
+ 0xea, 0x93, 0x33, 0x7c, 0xeb, 0x08, 0x42, 0xef, 0x93, 0x0a, 0x1b, 0x9a,
+ 0x4b, 0xbd, 0xef, 0x2d, 0x8a, 0x84, 0x1f, 0x61, 0xe1, 0xed, 0x08, 0x43,
+ 0xc8, 0x64, 0x56, 0x21, 0x8c, 0x1a, 0x56, 0x58, 0x24, 0xa5, 0x78, 0x5d,
+ 0x4f, 0x71, 0xca, 0xa1, 0xae, 0x05, 0x96, 0x4c, 0x98, 0x9c, 0x7d, 0x19,
+ 0x7b, 0x38, 0x59, 0xa9, 0x73, 0xed, 0x37, 0xce, 0x62, 0x45, 0x14, 0xb7,
+ 0x5b, 0x1d, 0x09, 0x1f, 0xc3, 0x6e, 0x57, 0xf8, 0x64, 0xde, 0xe7, 0xb3,
+ 0x25, 0xc0, 0x5c, 0xac, 0xb5, 0xe3, 0x9e, 0xf3, 0x0d, 0xf8, 0xf8, 0x80,
+ 0xf6, 0x8b, 0x25, 0x94, 0xda, 0x14, 0x5f, 0x61, 0x13, 0xf5, 0x2a, 0x6d,
+ 0xe7, 0xf5, 0xaf, 0x5c, 0xf6, 0xdb, 0x11, 0xaf, 0xbf, 0x28, 0xa0, 0xe9,
+ 0x02, 0xa7, 0x4f, 0x26, 0x6f, 0xef, 0xa1, 0x95, 0xa7, 0x3e, 0x5e, 0x86,
+ 0x34, 0x79, 0xb1, 0x24, 0xc5, 0x5e, 0xd8, 0x59, 0x75, 0xf7, 0xf1, 0xd0,
+ 0x50, 0xa7, 0x5c, 0x83, 0x37, 0xbe, 0x03, 0x82, 0xb9, 0xa6, 0xdb, 0x20,
+ 0xe8, 0x8e, 0x06, 0x58, 0xea, 0xea, 0xfd, 0x53, 0x27, 0xeb, 0x62, 0x9f,
+ 0xab, 0x54, 0x17, 0xa0, 0x92, 0x57, 0xc9, 0x3a, 0x1c, 0x7b, 0xad, 0xd1,
+ 0xd7, 0x4e, 0x26, 0x1f, 0xd7, 0x5d, 0x05, 0xc1, 0x4c, 0xee, 0x6b, 0x4f,
+ 0x6b, 0xb4, 0x96, 0x5d, 0x9f, 0x40, 0x37, 0x32, 0x26, 0x65, 0xb8, 0xfb,
+ 0x5f, 0xb3, 0xc4, 0x96, 0x9a, 0xe9, 0x2c, 0x57, 0xc5, 0x0c, 0x82, 0xbc,
+ 0xcf, 0x8a, 0xba, 0xfa, 0x34, 0x9b, 0xa0, 0xd5, 0x7e, 0x0a, 0xab, 0x02,
+ 0xe9, 0x0a, 0xb8, 0x40, 0xf9, 0x15, 0xa7, 0x39, 0xe0, 0xec, 0x2d, 0x32,
+ 0x7f, 0x22, 0x00, 0x8f, 0x44, 0x0a, 0x78, 0x31, 0xa3, 0xd1, 0x40, 0x00,
+ 0x05, 0x42, 0x1c, 0x27, 0x11, 0xf2, 0x13, 0x74, 0xf4, 0x8a, 0xa0, 0x92,
+ 0xe6, 0x11, 0xef, 0x3a, 0x05, 0x0b, 0x08, 0x01, 0x26, 0x1f, 0x1a, 0x54,
+ 0xbd, 0x6d, 0x05, 0x38, 0x83, 0x2d, 0x74, 0x16, 0xc9, 0x6b, 0xa9, 0x54,
+ 0x9f, 0x7e, 0xed, 0xef, 0x5a, 0xd8, 0x83, 0x38, 0x3d, 0x57, 0x34, 0x49,
+ 0x8c, 0xbd, 0x9d, 0x0d, 0x16, 0x46, 0xa2, 0xec, 0xbf, 0x0f, 0x8f, 0x64,
+ 0x53, 0x63, 0x03, 0x99, 0xa6, 0xa8, 0xcc, 0x91, 0xd4, 0x7a, 0xa9, 0x4e,
+ 0xf5, 0xe0, 0xe9, 0xc4, 0x52, 0x36, 0x82, 0x6d, 0xa6, 0x2c, 0x23, 0xa0,
+ 0x1e, 0xca, 0xf3, 0x54, 0xd9, 0x1b, 0x31, 0x79, 0xb1, 0x2c, 0x8f, 0xec,
+ 0x0b, 0x81, 0xa3, 0x0f, 0x21, 0xee, 0x86, 0x30, 0x5a, 0xb1, 0xe2, 0x18,
+ 0x4e, 0xb2, 0x88, 0x08, 0xe0, 0x67, 0x70, 0xdd, 0x56, 0x9b, 0x34, 0xf6,
+ 0xc9, 0x19, 0x46, 0x07, 0x90, 0x1c, 0xf6, 0x31, 0x33, 0x91, 0x65, 0xf2,
+ 0xb2, 0xe4, 0xb1, 0xb5, 0xb9, 0x97, 0x6f, 0x5b, 0x29, 0xde, 0x51, 0x43,
+ 0xa7, 0xac, 0x7e, 0x43, 0xc5, 0x4d, 0x2b, 0xef, 0x2b, 0xd8, 0xcf, 0x88,
+ 0x1d, 0x5b, 0xa3, 0xda, 0x13, 0xf8, 0x55, 0x35, 0xb3, 0xb8, 0x5b, 0xe9,
+ 0x7c, 0x48, 0x70, 0xa7, 0xa8, 0xde, 0xe8, 0x0f, 0x08, 0xc1, 0x66, 0x43,
+ 0xfe, 0xd5, 0x19, 0x6d, 0x05, 0x53, 0x48, 0x2c, 0x6f, 0x21, 0x48, 0x88,
+ 0x9f, 0xaf, 0xa5, 0x1b, 0x3c, 0x3f, 0xcf, 0xcf, 0x3d, 0xd5, 0xcb, 0x5b,
+ 0xf8, 0xb6, 0x3c, 0x1c, 0xe2, 0x7f, 0xd3, 0xae, 0x74, 0x26, 0xd4, 0xc1,
+ 0x27, 0xad, 0xb5, 0xf9, 0x8a, 0x43, 0x92, 0xfe, 0xac, 0x56, 0xc7, 0x86,
+ 0x44, 0xcd, 0x78, 0xb9, 0xd6, 0xf1, 0xec, 0x34, 0x24, 0x4b, 0x03, 0xdc,
+ 0xa6, 0x42, 0x66, 0xd1, 0xf6, 0x5e, 0x98, 0xba, 0x86, 0x9f, 0xdd, 0xf2,
+ 0xb9, 0x0e, 0x91, 0xf6, 0x7c, 0x82, 0xaa, 0x94, 0x0e, 0x34, 0x18, 0x7b,
+ 0x9f, 0x11, 0x73, 0x6a, 0x57, 0x8e, 0x0d, 0x43, 0xb8, 0x0c, 0xe1, 0x0e,
+ 0xc3, 0x1a, 0x6e, 0xbe, 0x4d, 0xb7, 0x22, 0xe1, 0xca, 0x7d, 0x4a, 0x5c,
+ 0xdb, 0x72, 0x2c, 0x29, 0xe7, 0xa8, 0x66, 0x08, 0xfd, 0x84, 0x58, 0x77,
+ 0x02, 0x96, 0xd0, 0xcc, 0xac, 0x07, 0xd9, 0x62, 0xdd, 0xbe, 0xfc, 0xdb,
+ 0x13, 0x65, 0x5a, 0xbc, 0xe1, 0x02, 0xd5, 0x57, 0x2e, 0xda, 0x58, 0x13,
+ 0x11, 0xa9, 0xe5, 0x1f, 0x5d, 0xd2, 0xff, 0xc4, 0x0c, 0x11, 0x2e, 0x4d,
+ 0x39, 0x6e, 0x7b, 0x86, 0x4e, 0xbf, 0xa2, 0x28, 0xdb, 0x7c, 0x5b, 0x72,
+ 0x2d, 0x8a, 0xaf, 0xff, 0x2b, 0x4c, 0x77, 0x4d, 0xe5, 0xcf, 0x3b, 0xd4,
+ 0x86, 0x64, 0x82, 0x9e, 0x6e, 0x4b, 0xdf, 0x4b, 0xa5, 0x80, 0xe4, 0xde,
+ 0x00, 0xcd, 0xb9, 0x8c, 0xfe, 0x54, 0xf9, 0xc1, 0x88, 0x09, 0x7b, 0x05,
+ 0x30, 0xbb, 0xa6, 0x8d, 0x9c, 0x9d, 0xdb, 0x02, 0x7f, 0x83, 0x60, 0xd0,
+ 0x33, 0x15, 0xf8, 0xf0, 0xaa, 0x38, 0x11, 0x2a, 0x75, 0xad, 0x21, 0x5f,
+ 0x1b, 0x1f, 0xdf, 0x89, 0x83, 0xc5, 0x3f, 0xc7, 0x19, 0xad, 0x80, 0x98,
+ 0xb6, 0x6a, 0x29, 0x36, 0x15, 0x87, 0x36, 0x14, 0x66, 0xef, 0x19, 0x10,
+ 0xc2, 0xae, 0x11, 0xe1, 0xd2, 0x05, 0x7d, 0xcb, 0xfe, 0x2b, 0x2a, 0x67,
+ 0xbf, 0xf5, 0xe4, 0xd3, 0xe2, 0x13, 0x40, 0xfc, 0x38, 0x88, 0xe6, 0x26,
+ 0x99, 0x6d, 0xc2, 0x36, 0x2b, 0x56, 0x56, 0x0e, 0xaa, 0xc8, 0x50, 0xe8,
+ 0x9f, 0x6e, 0x03, 0xc9, 0x3d, 0x82, 0x25, 0x86, 0x43, 0xde, 0xdd, 0x25,
+ 0x00, 0x33, 0x63, 0x06, 0xfa, 0xc1, 0xe2, 0xf3, 0x1a, 0x3a, 0x99, 0x95,
+ 0xa1, 0x87, 0x98, 0x5d, 0xa3, 0x69, 0x6b, 0x96, 0xc2, 0x71, 0x02, 0xe8,
+ 0xde, 0x3d, 0x89, 0x93, 0x1b, 0xfa, 0x51, 0x78, 0x8e, 0x42, 0x04, 0xee,
+ 0x22, 0x31, 0x23, 0xd6, 0xfa, 0x6f, 0xcf, 0x1b, 0x07, 0x4e, 0x5a, 0x3f,
+ 0xca, 0xa7, 0x08, 0xda, 0x85, 0xf5, 0xc0, 0x05, 0x4a, 0xb0, 0xe0, 0x20,
+ 0x38, 0x84, 0x26, 0x5b, 0x98, 0xb5, 0xa6, 0x33, 0xe2, 0x28, 0x26, 0x81,
+ 0x58, 0xd9, 0x0c, 0x3a, 0xf3, 0x95, 0x74, 0xa5, 0x0a, 0x32, 0x3f, 0x8c,
+ 0x6c, 0x02, 0x1a, 0xb5, 0x94, 0x40, 0xde, 0xef, 0xc5, 0x87, 0x67, 0x8a,
+ 0xdc, 0x94, 0xb9, 0xd1, 0x39, 0xe5, 0xae, 0x6d, 0x7d, 0x77, 0xe3, 0x93,
+ 0x8d, 0x8e, 0x05, 0xca, 0x81, 0xf2, 0x93, 0x0c, 0xc1, 0x08, 0x50, 0xc6,
+ 0xa7, 0x29, 0xcb, 0xce, 0x3c, 0x3a, 0x02, 0xae, 0xf8, 0x4a, 0x93, 0x18,
+ 0xe5, 0x5d, 0x7f, 0x45, 0x3f, 0x2f, 0x38, 0xdc, 0x97, 0x0f, 0x97, 0x08,
+ 0x7c, 0x94, 0xcd, 0x64, 0xe9, 0x51, 0x40, 0x6c, 0x52, 0x6a, 0x18, 0x33,
+ 0x57, 0x16, 0xb0, 0x6f, 0x14, 0x10, 0x00, 0x1d, 0x8c, 0x85, 0xa6, 0x0a,
+ 0x37, 0xeb, 0xed, 0xb3, 0x0a, 0xe9, 0x70, 0x58, 0xd8, 0x30, 0xd6, 0x80,
+ 0x5b, 0x4b, 0x05, 0x48, 0x01, 0x8d, 0x85, 0xe2, 0xf2, 0xd3, 0x83, 0xe6,
+ 0x08, 0xae, 0x06, 0x1c, 0x07, 0xc5, 0x95, 0xfe, 0xce, 0x07, 0xcb, 0xcc,
+ 0xd1, 0xf2, 0x67, 0x85, 0xa8, 0x73, 0x08, 0xcc, 0x77, 0x90, 0x99, 0x09,
+ 0xdc, 0x54, 0x07, 0x81, 0x14, 0x69, 0x77, 0xfe, 0x4a, 0xb2, 0x70, 0x77,
+ 0x76, 0x16, 0xe6, 0x12, 0x54, 0xa3, 0xc1, 0x51, 0x81, 0x8f, 0xfe, 0x7a,
+ 0xe8, 0x0f, 0x12, 0xc9, 0x2e, 0x7c, 0xc1, 0x70, 0x24, 0x93, 0xd4, 0x06,
+ 0x14, 0x64, 0x4c, 0xa0, 0x62, 0x61, 0xe9, 0x7f, 0xd6, 0x57, 0x28, 0x42,
+ 0xd2, 0x4c, 0x87, 0xb6, 0xb8, 0x74, 0x34, 0x05, 0xb6, 0xad, 0xad, 0x65,
+ 0x75, 0x74, 0x39, 0x0c, 0x2f, 0x8c, 0xae, 0xc7, 0x54, 0xd5, 0xc5, 0x59,
+ 0x56, 0x1a, 0xa5, 0xe0, 0x34, 0xfd, 0x2e, 0xdc, 0x3e, 0x91, 0x9f, 0xa8,
+ 0x79, 0xc3, 0x63, 0x9a, 0x1f, 0x62, 0xd6, 0x0f, 0xe6, 0x22, 0x27, 0x80,
+ 0x43, 0xe5, 0xba, 0x60, 0xaa, 0xcf, 0x75, 0xd7, 0x1f, 0x3e, 0x5b, 0x75,
+ 0x0b, 0x6e, 0x36, 0xf8, 0x98, 0x5d, 0xf6, 0x0e, 0xee, 0x60, 0x52, 0x4b,
+ 0xfd, 0x7c, 0xe1, 0xd0, 0xac, 0x41, 0xad, 0x29, 0x8c, 0x8f, 0x40, 0xe7,
+ 0x6e, 0xd1, 0xfa, 0xea, 0xd7, 0x9a, 0x52, 0xf8, 0xa0, 0x13, 0xe0, 0x8d,
+ 0xb5, 0x17, 0xaf, 0x90, 0x72, 0x07, 0x1c, 0x83, 0x65, 0x76, 0x08, 0x5d,
+ 0xe6, 0x25, 0xc9, 0x26, 0xef, 0x78, 0x17, 0x52, 0xb1, 0x6f, 0x9f, 0x2e,
+ 0x47, 0x04, 0x46, 0x4f, 0x00, 0x96, 0x9b, 0x08, 0x70, 0x72, 0x15, 0xf4,
+ 0x13, 0x86, 0xd5, 0x22, 0x10, 0x4d, 0xf9, 0xe7, 0x36, 0x27, 0x91, 0xf8,
+ 0xdd, 0x36, 0xa9, 0x42, 0x68, 0x5c, 0x8f, 0xcf, 0x24, 0xf7, 0xb6, 0xc4,
+ 0x59, 0x6f, 0x67, 0x41, 0xc1, 0xfb, 0xd7, 0xd5, 0xba, 0x9c, 0xbe, 0xa1,
+ 0xfb, 0x0a, 0x71, 0x45, 0xd0, 0xd4, 0xcb, 0x05, 0x56, 0x00, 0x47, 0x57,
+ 0xb4, 0x65, 0x0a, 0x69, 0x02, 0x1a, 0x5e, 0x36, 0x61, 0xd2, 0x39, 0xff,
+ 0x1e, 0xbd, 0x37, 0x6d, 0xa6, 0x15, 0x33, 0x94, 0x17, 0x06, 0xf3, 0xc6,
+ 0xf4, 0xa3, 0xc2, 0x04, 0x2d, 0x77, 0x44, 0xdd, 0x51, 0xa3, 0xc8, 0x3c,
+ 0xee, 0x8a, 0x97, 0x84, 0x2a, 0xb7, 0x39, 0xb9, 0xdc, 0xd6, 0x0f, 0x26,
+ 0x82, 0x61, 0x77, 0x69, 0x81, 0x9c, 0x7d, 0x13, 0x7a, 0xc4, 0x80, 0x8f,
+ 0x65, 0x5e, 0x41, 0x41, 0x9f, 0xb2, 0x86, 0x0d, 0x20, 0x33, 0x9d, 0x6a,
+ 0x35, 0x5f, 0x3d, 0xe6, 0x93, 0x77, 0x6f, 0xf8, 0xad, 0xd0, 0xd2, 0x97,
+ 0xc5, 0xa9, 0x31, 0xc7, 0x51, 0x26, 0xb0, 0xb5, 0x27, 0x0b, 0x37, 0x03,
+ 0xc8, 0x4d, 0x65, 0xc7, 0x5d, 0x05, 0x44, 0x63, 0xf3, 0x55, 0x97, 0xb9,
+ 0xa8, 0x9d, 0x53, 0xe5, 0x40, 0xd0, 0x4e, 0xaa, 0xb6, 0x65, 0x99, 0x0c,
+ 0x5e, 0x5a, 0x18, 0x09, 0x32, 0x29, 0x9c, 0xc6, 0x90, 0x66, 0x90, 0x74,
+ 0x9f, 0xfb, 0x10, 0xa7, 0xea, 0x35, 0x13, 0x05, 0xe5, 0x38, 0xfd, 0x45,
+ 0x86, 0x26, 0x2d, 0x17, 0x80, 0x8f, 0x44, 0xcd, 0x92, 0xfa, 0x47, 0xc4,
+ 0xef, 0x9e, 0xda, 0x5c, 0x1e, 0x14, 0x85, 0xd8, 0xf7, 0xc2, 0x17, 0xd7,
+ 0x9e, 0xd7, 0xa7, 0x36, 0xec, 0x6a, 0x33, 0x5b, 0xad, 0x7d, 0xcb, 0x72,
+ 0x82, 0xaf, 0x65, 0x8d, 0x13, 0x1d, 0x3d, 0xd5, 0x19, 0xc2, 0xb8, 0x84,
+ 0x64, 0xce, 0xe8, 0x93, 0x86, 0x5f, 0x00, 0x95, 0x26, 0x4e, 0x2e, 0x33,
+ 0x1d, 0x0c, 0x48, 0x3c, 0x5b, 0xbe, 0x74, 0xda, 0x97, 0xde, 0x5d, 0xb9,
+ 0x3e, 0x65, 0x4d, 0x88, 0x3d, 0x05, 0x2d, 0x3a, 0x6b, 0xc7, 0x2f, 0x8c,
+ 0x0d, 0x02, 0x8e, 0x8b, 0x2c, 0x07, 0xa3, 0x24, 0xcb, 0xf6, 0x13, 0x63,
+ 0xd8, 0xee, 0x86, 0xda, 0x2e, 0x53, 0x87, 0xe3, 0x36, 0x81, 0x58, 0x08,
+ 0x6e, 0x6a, 0xfa, 0xd5, 0xc1, 0x8b, 0xb8, 0x10, 0x0a, 0xff, 0x56, 0x2a,
+ 0x4b, 0x0e, 0x0d, 0x63, 0x31, 0xb5, 0x66, 0xe6, 0x7c, 0x53, 0x8e, 0x46,
+ 0x24, 0x28, 0x9c, 0x55, 0x40, 0x5b, 0xe6, 0xc2, 0x14, 0xfa, 0xa9, 0x56,
+ 0xce, 0x88, 0x0f, 0x6d, 0xc5, 0x9c, 0x45, 0x25, 0x5e, 0xf5, 0x82, 0x61,
+ 0x0f, 0x2b, 0x70, 0x9f, 0xbe, 0xd0, 0xdd, 0xd0, 0x9c, 0x0b, 0x8d, 0x97,
+ 0xcd, 0x75, 0xe4, 0x9a, 0x63, 0x28, 0x1c, 0x09, 0xc3, 0x14, 0x77, 0x9e,
+ 0xba, 0x03, 0xcf, 0x89, 0xc6, 0xfe, 0xc3, 0xf1, 0x24, 0xb3, 0xc5, 0xf2,
+ 0xf7, 0xf2, 0xac, 0x1d, 0xc9, 0xb8, 0xb1, 0x9d, 0xfd, 0x2c, 0xd5, 0x27,
+ 0xe3, 0x0e, 0x46, 0x22, 0x6a, 0xa8, 0xc1, 0x2a, 0xa6, 0x6f, 0xcc, 0xed,
+ 0x99, 0xba, 0x5f, 0x5f, 0x72, 0x3d, 0xdf, 0xb9, 0xed, 0x02, 0x5f, 0xaa,
+ 0xe6, 0x2a, 0x25, 0x12, 0xfe, 0x27, 0xaf, 0xed, 0xa2, 0x63, 0xf4, 0x27,
+ 0x5c, 0xb6, 0xea, 0x00, 0x0a, 0x0b, 0x10, 0xdb, 0xf4, 0x9a, 0x3c, 0x90,
+ 0x96, 0xaf, 0x31, 0x7f, 0x94, 0x25, 0xaf, 0x41, 0x8c, 0x7f, 0xf5, 0xe3,
+ 0x4a, 0xb4, 0x96, 0x88, 0x8e, 0x67, 0x52, 0x39, 0x00, 0x0b, 0xe0, 0xad,
+ 0x81, 0x4c, 0xf9, 0xb1, 0x18, 0xc8, 0x07, 0xa3, 0x85, 0x5d, 0x15, 0xc7,
+ 0x3f, 0x69, 0x0c, 0x6b, 0x40, 0x74, 0x74, 0x92, 0x25, 0x4a, 0xc7, 0x66,
+ 0xf1, 0x70, 0x17, 0xc5, 0x0c, 0x7e, 0x63, 0x96, 0xf8, 0xfe, 0xba, 0xa3,
+ 0xd4, 0x39, 0x8d, 0xd8, 0x8b, 0xe8, 0x5e, 0x3b, 0x13, 0x34, 0x4d, 0x5e,
+ 0xca, 0x8e, 0x63, 0xa1, 0x53, 0x61, 0x4c, 0xf0, 0x92, 0x16, 0x05, 0x2f,
+ 0x0a, 0x02, 0x7f, 0x06, 0xfa, 0x19, 0xc8, 0x8b, 0x38, 0x14, 0x86, 0xa5,
+ 0x97, 0x94, 0xd7, 0xce, 0xbe, 0x9e, 0xb4, 0x5c, 0x29, 0xf9, 0x7b, 0x5b,
+ 0x05, 0x1b, 0xc1, 0x97, 0x92, 0xf2, 0x58, 0xd7, 0xbf, 0xb6, 0x3e, 0x29,
+ 0xde, 0x1e, 0x16, 0x46, 0xbe, 0x7d, 0x1c, 0xf8, 0xc4, 0xaa, 0xe8, 0x02,
+ 0x18, 0x1d, 0x79, 0x5d, 0x8b, 0xae, 0x7b, 0x2b, 0xe3, 0x75, 0x8b, 0x5a,
+ 0xb8, 0x2e, 0xb5, 0xb8, 0x84, 0xf5, 0x10, 0x26, 0x6e, 0x3c, 0xbf, 0x3d,
+ 0x4d, 0xb0, 0x2c, 0x49, 0xe2, 0x8d, 0xf6, 0x38, 0x32, 0xf2, 0xfa, 0x3e,
+ 0x8d, 0xa0, 0x48, 0x15, 0x21, 0x2e, 0xaa, 0xe6, 0xf9, 0x73, 0x14, 0x79,
+ 0xaf, 0x8f, 0xaa, 0xcb, 0x6e, 0x0c, 0xeb, 0x21, 0xc3, 0x02, 0x96, 0x07,
+ 0x21, 0x56, 0x6c, 0x41, 0x5f, 0x28, 0x2b, 0x61, 0xaf, 0xd7, 0xdb, 0xdf,
+ 0x01, 0x94, 0x38, 0xfa, 0x49, 0x77, 0x05, 0x99, 0xc5, 0xec, 0x94, 0xfc,
+ 0x89, 0xfc, 0xb0, 0x6d, 0x6a, 0x83, 0xce, 0xe7, 0xd9, 0xb6, 0xfe, 0x4f,
+ 0x65, 0x03, 0x05, 0x7f, 0xdb, 0xd6, 0xd8, 0x11, 0xcd, 0x8b, 0x3d, 0x0c,
+ 0x6f, 0x0f, 0x8c, 0x0b, 0x92, 0x03, 0x7a, 0xf2, 0xb1, 0xb6, 0x66, 0x7a,
+ 0x14, 0x03, 0x4d, 0x49, 0x7a, 0xcb, 0x52, 0x6f, 0xc7, 0x07, 0xee, 0xbb,
+ 0x8a, 0x95, 0x80, 0xe2, 0xa2, 0x35, 0x75, 0x97, 0x66, 0x42, 0x5e, 0xa5,
+ 0xae, 0x37, 0x71, 0x3c, 0x59, 0xf1, 0x5b, 0xe8, 0xa5, 0x7a, 0x89, 0x63,
+ 0xf8, 0x9b, 0x7b, 0x06, 0x6e, 0x3f, 0x46, 0x10, 0xe6, 0xb6, 0xaf, 0x7b,
+ 0x2e, 0x80, 0xd4, 0x8e, 0xbe, 0x44, 0x06, 0x02, 0x01, 0xb4, 0xd8, 0x6b,
+ 0xce, 0x83, 0xa2, 0xec, 0xa3, 0x16, 0xbe, 0x79, 0xd6, 0xdc, 0xd4, 0xc1,
+ 0xd4, 0x6d, 0xc4, 0xdb, 0x3f, 0x81, 0xb2, 0xe3, 0x02, 0xe8, 0xeb, 0x75,
+ 0x6e, 0x36, 0x00, 0xe7, 0xcc, 0x8b, 0x7d, 0x5d, 0xf1, 0xd7, 0xca, 0x2b,
+ 0xe5, 0x08, 0x59, 0xf2, 0x0f, 0x55, 0x98, 0xa3, 0xfd, 0xa1, 0x23, 0xb2,
+ 0x9f, 0x00, 0x52, 0x55, 0x68, 0x98, 0xea, 0xd7, 0xbd, 0x7b, 0x4f, 0xd1,
+ 0x02, 0xa9, 0xe4, 0x3f, 0x56, 0xbf, 0xb1, 0x44, 0x39, 0x4f, 0x27, 0xa9,
+ 0x59, 0x87, 0xc0, 0x26, 0xde, 0x60, 0xfa, 0xea, 0xbf, 0xff, 0xe5, 0x0f,
+ 0x14, 0xbf, 0xab, 0xfd, 0x25, 0xaa, 0x70, 0xd6, 0xf5, 0xac, 0xf1, 0x65,
+ 0xd3, 0x43, 0x4c, 0x98, 0x70, 0x16, 0xf1, 0x3c, 0x92, 0x9d, 0x7c, 0x37,
+ 0x77, 0xfa, 0x61, 0x95, 0x6d, 0x14, 0xb9, 0x24, 0x3f, 0xf8, 0x9e, 0x36,
+ 0x48, 0xdb, 0xab, 0x01, 0xac, 0x19, 0x07, 0x54, 0x80, 0x5c, 0x5f, 0xf4,
+ 0xde, 0xd8, 0x5b, 0x94, 0xd9, 0xe4, 0xc1, 0x50, 0x08, 0x8d, 0xa2, 0x93,
+ 0xd6, 0x8a, 0x7c, 0xad, 0xd8, 0x35, 0xcd, 0xba, 0x2f, 0xf1, 0xbf, 0x0f,
+ 0x42, 0xbe, 0xf4, 0x23, 0x09, 0x43, 0x08, 0xce, 0xea, 0x33, 0xa9, 0x1a,
+ 0x44, 0x77, 0xdf, 0x54, 0x35, 0xfe, 0xd8, 0xa8, 0x9f, 0x57, 0xda, 0xe2,
+ 0xd1, 0x5b, 0x0f, 0x8f, 0x1a, 0x2b, 0xa5, 0x32, 0x79, 0xfb, 0xc6, 0xef,
+ 0x7b, 0x17, 0x7f, 0xea, 0x1d, 0xfe, 0x6c, 0x29, 0xe8, 0x3b, 0xa8, 0x30,
+ 0xe1, 0xc8, 0x69, 0x02, 0x75, 0x3e, 0x7e, 0x1a, 0x81, 0xee, 0xb4, 0x32,
+ 0x14, 0x66, 0x5f, 0xfc, 0x74, 0xeb, 0x3e, 0xf9, 0xc8, 0x91, 0x27, 0x76,
+ 0xeb, 0x53, 0x1e, 0x03, 0xe3, 0x19, 0x3e, 0xb9, 0xca, 0xc2, 0xf8, 0xa8,
+ 0xb7, 0x1a, 0xc7, 0xc6, 0x24, 0xbf, 0xf1, 0x3b, 0x6a, 0xb0, 0x29, 0xc3,
+ 0x09, 0xca, 0x1a, 0x52, 0x1b, 0xa5, 0x1b, 0xfd, 0x24, 0xa6, 0xeb, 0xaf,
+ 0x05, 0x3e, 0xab, 0x66, 0x3a, 0xcd, 0x44, 0x58, 0x53, 0x6c, 0x72, 0xaf,
+ 0x5f, 0x34, 0x0c, 0x9f, 0xdd, 0x20, 0xd8, 0x5b, 0x66, 0x4e, 0x6a, 0x4d,
+ 0xab, 0x43, 0xcd, 0x13, 0x07, 0x73, 0xe8, 0x8d, 0xd1, 0x40, 0xb4, 0x47,
+ 0xee, 0x74, 0x7f, 0x68, 0xf1, 0xb3, 0x09, 0x1e, 0x20, 0x5e, 0x6a, 0xc8,
+ 0xa0, 0xaf, 0xea, 0xfe, 0xc5, 0xe4, 0xed, 0xf9, 0x26, 0xf5, 0xb7, 0x1a,
+ 0x0f, 0xee, 0xe5, 0x7c, 0xcd, 0x12, 0x38, 0x4b, 0x1e, 0xb0, 0x8a, 0xfd,
+ 0xf0, 0x68, 0xbb, 0x90, 0xae, 0xfc, 0x65, 0x9b, 0xcb, 0x7a, 0x51, 0x69,
+ 0x9b, 0xc8, 0xc5, 0x23, 0x9e, 0x96, 0x2f, 0x9e, 0xee, 0xb5, 0xca, 0xa9,
+ 0xaa, 0x73, 0xed, 0xa8, 0xa6, 0x15, 0x5d, 0x17, 0xf2, 0x90, 0xd8, 0x18,
+ 0x99, 0xd4, 0xf0, 0x7f, 0x03, 0x69, 0x68, 0x54, 0xc0, 0x58, 0x88, 0x64,
+ 0xea, 0x95, 0x66, 0x79, 0x85, 0x19, 0x95, 0xd4, 0x52, 0x76, 0x0f, 0x18,
+ 0xfc, 0x4f, 0x2f, 0x12, 0xc9, 0xa5, 0x57, 0x2c, 0x05, 0x2d, 0x40, 0xec,
+ 0xfd, 0xb4, 0xfe, 0x9e, 0x7c, 0xdd, 0x26, 0xa7, 0xc2, 0xfd, 0x94, 0xfb,
+ 0x71, 0xeb, 0xab, 0x10, 0xe6, 0xb0, 0xaa, 0xd4, 0xfd, 0x65, 0x11, 0xbf,
+ 0xb1, 0xa6, 0xb3, 0x7d, 0x98, 0xe4, 0x0e, 0x8f, 0x8d, 0x28, 0x39, 0xee,
+ 0x25, 0x2d, 0x00, 0x11, 0xc7, 0x58, 0x03, 0xd9, 0x87, 0xdf, 0x7b, 0xe0,
+ 0x7f, 0x88, 0x48, 0xa4, 0x82, 0xb4, 0xbd, 0x7a, 0x41, 0xe8, 0x63, 0x79,
+ 0x1a, 0x74, 0x89, 0x19, 0x1f, 0x24, 0x84, 0x46, 0xfe, 0x2f, 0x4e, 0x5b,
+ 0x53, 0x2f, 0xf5, 0x3a, 0x41, 0x70, 0x48, 0xc9, 0x13, 0xe7, 0x02, 0xac,
+ 0xc7, 0x9f, 0x79, 0x1e, 0x6a, 0xb9, 0x97, 0x43, 0x39, 0x39, 0xd3, 0xaf,
+ 0xaa, 0x5a, 0xf1, 0xc5, 0x17, 0x9d, 0x10, 0x2a, 0x68, 0x47, 0x26, 0xae,
+ 0x7c, 0x1f, 0x4d, 0x01, 0x93, 0xfa, 0x02, 0xc7, 0x02, 0xd8, 0x79, 0x0a,
+ 0x26, 0x01, 0xa7, 0x18, 0x09, 0x3b, 0xa4, 0x11, 0xba, 0x42, 0x40, 0xad,
+ 0x5f, 0x9b, 0x15, 0x43, 0xee, 0x58, 0x13, 0x7a, 0x42, 0x6c, 0xc5, 0xd4,
+ 0x37, 0xf7, 0x73, 0x43, 0xb4, 0xac, 0x9a, 0xd9, 0x1e, 0xbc, 0x90, 0xa5,
+ 0xbe, 0x5b, 0x16, 0xa9, 0x55, 0xe5, 0x6b, 0x9a, 0x80, 0xc5, 0x76, 0xc3,
+ 0x37, 0x3d, 0x8f, 0x47, 0x89, 0x70, 0xf2, 0x01, 0x30, 0x64, 0x77, 0x5a,
+ 0xfa, 0xbd, 0x93, 0x2f, 0x77, 0x01, 0x54, 0xb2, 0x84, 0x49, 0xff, 0xd8,
+ 0x53, 0x04, 0x98, 0xdd, 0x8d, 0x6f, 0xb3, 0x27, 0x9e, 0x6f, 0xe8, 0xce,
+ 0x3f, 0xd4, 0x3a, 0xf1, 0x38, 0x99, 0x9e, 0xef, 0x14, 0x54, 0x2d, 0xf8,
+ 0x92, 0x69, 0x2c, 0xeb, 0x3c, 0xaa, 0xb8, 0xf6, 0x18, 0xbb, 0x83, 0xc2,
+ 0xd4, 0xeb, 0x19, 0xca, 0x9e, 0xd7, 0x9e, 0xf5, 0xa2, 0xf3, 0x6c, 0x15,
+ 0x6c, 0xdb, 0x1b, 0x8a, 0xa0, 0xd1, 0x8c, 0x4d, 0x38, 0xae, 0xd0, 0xcb,
+ 0x25, 0xd4, 0x21, 0x95, 0xee, 0xeb, 0x44, 0x41, 0x73, 0x2b, 0xe1, 0x32,
+ 0x8b, 0x33, 0xd3, 0x10, 0xb7, 0x78, 0x33, 0x23, 0xa4, 0x03, 0x6c, 0x28,
+ 0xd6, 0x9d, 0x51, 0x11, 0xa9, 0xc4, 0xe5, 0x86, 0xaa, 0x35, 0x0d, 0x27,
+ 0xc4, 0x32, 0x44, 0xec, 0x8c, 0xb5, 0xa6, 0x25, 0xc5, 0x61, 0x0a, 0xd9,
+ 0x99, 0x8f, 0x6b, 0x7b, 0x17, 0xa3, 0xf7, 0x97, 0x51, 0xdc, 0x0d, 0x67,
+ 0xbd, 0xe9, 0xe7, 0x33, 0xae, 0x34, 0xed, 0x7c, 0x2f, 0xe5, 0xbd, 0x6a,
+ 0x79, 0x91, 0xdd, 0xe9, 0x9e, 0xdb, 0xfd, 0xc3, 0xf9, 0xe4, 0x7c, 0x8a,
+ 0x18, 0x39, 0xa3, 0x07, 0xa6, 0x50, 0x6d, 0xfe, 0xa9, 0xa2, 0xf7, 0x9d,
+ 0xef, 0xab, 0x03, 0x78, 0xab, 0xed, 0xee, 0x3d, 0x6d, 0x03, 0x7c, 0x45,
+ 0x34, 0x4f, 0xb0, 0x76, 0x18, 0xb8, 0x51, 0xe3, 0x13, 0x07, 0x5a, 0x5f,
+ 0xe6, 0xee, 0x4c, 0x0c, 0xc8, 0x77, 0x50, 0x97, 0x21, 0x3f, 0x08, 0x9a,
+ 0xe5, 0x55, 0xea, 0x0e, 0x10, 0xe2, 0xa9, 0x2f, 0x85, 0x7f, 0x71, 0x57,
+ 0x42, 0xda, 0x20, 0xc6, 0xde, 0xc5, 0x1f, 0x7e, 0x73, 0xb8, 0xf4, 0x8a,
+ 0x2a, 0x04, 0x70, 0x79, 0xef, 0xfc, 0xfd, 0xe9, 0x8a, 0x98, 0x24, 0x9f,
+ 0x8f, 0x22, 0xa9, 0xdd, 0x08, 0x45, 0x2e, 0x69, 0x5a, 0x57, 0xd3, 0xc9,
+ 0xd9, 0xce, 0xa2, 0xcc, 0x79, 0xae, 0x39, 0x22, 0xe4, 0x26, 0x2e, 0x81,
+ 0x8a, 0x1a, 0x11, 0x01, 0x87, 0x59, 0x39, 0x23, 0x5a, 0x5f, 0xb1, 0xa0,
+ 0xa5, 0xfc, 0x9a, 0x9c, 0x2e, 0xb0, 0x78, 0x86, 0xdb, 0x02, 0xb0, 0xf8,
+ 0xe7, 0x8c, 0xad, 0x05, 0xe5, 0xa7, 0x6f, 0x16, 0x40, 0xd5, 0x47, 0xe2,
+ 0xd4, 0x5a, 0x56, 0x13, 0x8b, 0xc3, 0xd1, 0xd1, 0xd8, 0x7c, 0x39, 0x64,
+ 0x6f, 0x20, 0x51, 0x3f, 0x13, 0xf3, 0x39, 0x57, 0x34, 0xe6, 0xac, 0x28,
+ 0xe7, 0x8d, 0xd4, 0x10, 0x5c, 0x7e, 0xee, 0x09, 0xa1, 0x65, 0x2d, 0x81,
+ 0xdc, 0xb3, 0x7e, 0xa2, 0xa6, 0x65, 0x3c, 0x19, 0x33, 0x08, 0x19, 0x17,
+ 0xb4, 0x12, 0x54, 0x36, 0xa8, 0x16, 0xe3, 0x2e, 0xd6, 0xcb, 0xa6, 0xf2,
+ 0x0f, 0x51, 0x99, 0x3d, 0x78, 0xce, 0x92, 0xca, 0x96, 0xc5, 0x1f, 0x89,
+ 0x58, 0x01, 0xed, 0x56, 0xa7, 0x33, 0x78, 0x35, 0xf9, 0x6e, 0xad, 0xff,
+ 0xee, 0x91, 0x43, 0x21, 0x0c, 0x65, 0x1f, 0xfb, 0x8d, 0x02, 0x41, 0xda,
+ 0x14, 0xf5, 0x59, 0xf8, 0x4c, 0x60, 0xa9, 0xa5, 0xa9, 0xd4, 0xc2, 0x38,
+ 0x8f, 0xce, 0xe0, 0x06, 0xa4, 0x9a, 0x02, 0xb8, 0x84, 0x3a, 0x03, 0xa1,
+ 0xab, 0xbd, 0x75, 0xb5, 0x23, 0x6f, 0xa5, 0x01, 0xfd, 0xba, 0x89, 0xbe,
+ 0xf2, 0xf7, 0x2a, 0x9e, 0xa8, 0x68, 0x18, 0xd4, 0xa0, 0x4b, 0xbd, 0x23,
+ 0x6c, 0xc2, 0xe5, 0x04, 0x9d, 0x10, 0x69, 0x14, 0xea, 0x83, 0xf1, 0x11,
+ 0x69, 0x08, 0x38, 0xfa, 0x98, 0x86, 0x59, 0x43, 0x37, 0x4c, 0xac, 0xad,
+ 0xf5, 0x22, 0x18, 0x8b, 0x8e, 0x1a, 0xaf, 0x2c, 0x70, 0x72, 0xec, 0x63,
+ 0x35, 0xc9, 0x2e, 0x92, 0xa7, 0x7b, 0x14, 0xb9, 0x03, 0x0c, 0xf4, 0x9d,
+ 0x09, 0xcd, 0x07, 0xf2, 0x94, 0x53, 0x08, 0x0c, 0xd9, 0x74, 0x35, 0xcf,
+ 0xab, 0xd9, 0xe9, 0xa2, 0x99, 0x77, 0x07, 0x3f, 0x3c, 0xf7, 0x48, 0xb5,
+ 0xf3, 0x7a, 0x07, 0xee, 0xfd, 0x51, 0x82, 0xba, 0x47, 0x91, 0x0d, 0x44,
+ 0xb3, 0xeb, 0x33, 0x15, 0x95, 0x62, 0x5e, 0xe1, 0x6e, 0x22, 0xe6, 0xad,
+ 0xa8, 0x43, 0xd7, 0xef, 0xba, 0xb3, 0x16, 0x73, 0xbe, 0x81, 0xfb, 0x25,
+ 0x10, 0x4d, 0x83, 0xfb, 0x13, 0x39, 0x7a, 0x46, 0x7d, 0x60, 0x54, 0x63,
+ 0xa3, 0x1a, 0xa3, 0x46, 0x78, 0xd3, 0xe9, 0xd7, 0x5a, 0x3f, 0xc6, 0xc5,
+ 0x4a, 0xce, 0xa5, 0x62, 0x93, 0x49, 0xde, 0xfc, 0x71, 0xf6, 0xe4, 0x6c,
+ 0x5f, 0x3d, 0x35, 0xea, 0x7d, 0xed, 0x25, 0x4a, 0xf1, 0x47, 0x61, 0xed,
+ 0x75, 0x6a, 0x0c, 0x04, 0x28, 0x2f, 0xca, 0xdf, 0x8b, 0x5a, 0x8c, 0x1b,
+ 0x42, 0xf0, 0xeb, 0x59, 0x18, 0x09, 0x82, 0x51, 0x1e, 0xc1, 0x6d, 0x46,
+ 0xe4, 0xe3, 0x32, 0x1d, 0xe8, 0xc5, 0x8d, 0x31, 0xd2, 0x15, 0x14, 0xdb,
+ 0x38, 0x76, 0xc6, 0xdc, 0xdb, 0xd1, 0x7e, 0x38, 0x41, 0xb6, 0x7a, 0x78,
+ 0x7d, 0xa9, 0xbf, 0xae, 0xe3, 0x99, 0x7c, 0x69, 0x59, 0xd1, 0xc6, 0x2b,
+ 0x3d, 0xf3, 0x9a, 0xc4, 0x35, 0x59, 0x5b, 0x45, 0x87, 0x2a, 0x14, 0xad,
+ 0x49, 0x81, 0x0f, 0x5a, 0x3d, 0x4c, 0xcc, 0x69, 0x7b, 0x95, 0x64, 0x32,
+ 0x24, 0xd0, 0xd4, 0xa0, 0xaa, 0xf2, 0x5a, 0x6b, 0x43, 0xc4, 0xf5, 0x85,
+ 0x64, 0x4e, 0xea, 0x03, 0x2e, 0x9b, 0x25, 0x8e, 0xf5, 0x4e, 0xed, 0xfb,
+ 0xa4, 0x00, 0x7d, 0x7a, 0x1f, 0x26, 0x88, 0x36, 0x22, 0xb2, 0x33, 0x14,
+ 0x47, 0xc0, 0xaa, 0x83, 0x69, 0xdf, 0x49, 0x69, 0x1d, 0x58, 0x5d, 0x1d,
+ 0x80, 0xc9, 0x5c, 0xfe, 0xfe, 0x58, 0x9a, 0x78, 0x26, 0xf6, 0xa0, 0x72,
+ 0xaa, 0x07, 0xd8, 0xbd, 0x80, 0x10, 0xb0, 0x7d, 0xa7, 0x17, 0x04, 0xde,
+ 0x13, 0x21, 0x17, 0x85, 0xca, 0xa3, 0x40, 0x92, 0xe4, 0x93, 0xd8, 0xb4,
+ 0x31, 0xb0, 0x56, 0x04, 0x2c, 0x35, 0xa6, 0xd9, 0xe3, 0x4f, 0x61, 0xdf,
+ 0x96, 0xff, 0xd7, 0x65, 0xf5, 0x92, 0x11, 0xf3, 0x81, 0x3e, 0x03, 0x2b,
+ 0xf1, 0x6a, 0xfc, 0x8b, 0x36, 0x0c, 0x4a, 0x4e, 0xa4, 0xf7, 0x4f, 0x28,
+ 0x34, 0xac, 0x4e, 0x5d, 0xb3, 0x86, 0x1c, 0xe7, 0x96, 0x80, 0xb6, 0x71,
+ 0x40, 0x6d, 0xd9, 0x38, 0xca, 0xb9, 0xd2, 0xbd, 0xe4, 0xc7, 0x71, 0xd3,
+ 0x22, 0x7a, 0x36, 0x8e, 0x75, 0xb5, 0x8c, 0xe6, 0x22, 0xfc, 0x91, 0x91,
+ 0xef, 0x3e, 0x91, 0x2e, 0x6c, 0x94, 0x8e, 0xf2, 0x9b, 0x5a, 0xf2, 0x45,
+ 0x63, 0x61, 0x8b, 0x70, 0x95, 0x7d, 0x5c, 0x2d, 0x50, 0xac, 0x1d, 0xbf,
+ 0x95, 0x26, 0x15, 0x91, 0xd0, 0x88, 0xe9, 0xb5, 0x54, 0xa4, 0x2e, 0x3f,
+ 0x8e, 0x7a, 0x1e, 0xc4, 0x1f, 0x33, 0x6b, 0xfc, 0x1f, 0x35, 0x58, 0xbf,
+ 0x5c, 0xae, 0xe6, 0x0b, 0x59, 0x7d, 0xb5, 0x73, 0x44, 0x29, 0x2d, 0x68,
+ 0x7e, 0xc9, 0x92, 0x1d, 0xa3, 0x66, 0xe6, 0xb3, 0x1e, 0x5e, 0x99, 0x09,
+ 0x21, 0xb8, 0xe9, 0x28, 0x7a, 0xf2, 0x2d, 0xb3, 0xf0, 0xae, 0x3d, 0xb0,
+ 0xe5, 0xb3, 0x85, 0x13, 0x75, 0xbe, 0xb7, 0x9f, 0xfb, 0xe6, 0x38, 0x9f,
+ 0xfa, 0x3f, 0x5c, 0x3e, 0x82, 0xf3, 0xc2, 0x63, 0xcb, 0xff, 0xee, 0x2f,
+ 0x2f, 0xbc, 0xe3, 0xe5, 0x57, 0x7e, 0xba, 0x20, 0xfd, 0x41, 0xbd, 0x3b,
+ 0x63, 0x0d, 0x2f, 0xfa, 0xbd, 0x38, 0xf0, 0x69, 0x69, 0x5d, 0x29, 0xc5,
+ 0xb3, 0xa1, 0xde, 0x52, 0xbe, 0x0c, 0x67, 0xe5, 0x05, 0x5d, 0xf2, 0x06,
+ 0x6a, 0xe0, 0x15, 0x40, 0x0f, 0x97, 0x51, 0xf5, 0x40, 0x49, 0x56, 0x27,
+ 0x8b, 0x81, 0xc6, 0x7b, 0x69, 0xf1, 0xf6, 0x77, 0x43, 0xb2, 0xc2, 0x6a,
+ 0x0c, 0x88, 0x2e, 0xc4, 0xc6, 0xad, 0x81, 0xad, 0x10, 0x64, 0xbc, 0xbc,
+ 0x7c, 0x69, 0xee, 0xa5, 0xb3, 0x2d, 0x63, 0x28, 0x87, 0x63, 0xe7, 0xb0,
+ 0x00, 0x6b, 0x32, 0xcf, 0x6f, 0x8f, 0x5b, 0x12, 0xf5, 0x79, 0x08, 0x36,
+ 0x88, 0x64, 0xad, 0xce, 0x39, 0x77, 0x4c, 0x79, 0x4d, 0x3b, 0xd8, 0xf3,
+ 0x06, 0xf0, 0xac, 0x54, 0x43, 0xe4, 0xd9, 0x30, 0x63, 0x01, 0x1b, 0x14,
+ 0x87, 0x8f, 0x06, 0x00, 0x67, 0xf1, 0x5a, 0x5d, 0xd0, 0xf6, 0x52, 0xfa,
+ 0xe5, 0x39, 0x56, 0xb8, 0xd6, 0x9d, 0xf5, 0x3e, 0x52, 0x88, 0xe2, 0xab,
+ 0xe0, 0x53, 0x0a, 0x4c, 0xd5, 0xcb, 0x1a, 0x63, 0xa2, 0xcc, 0x2b, 0x40,
+ 0x7f, 0xca, 0xc7, 0x6f, 0xff, 0xa8, 0x0e, 0x9f, 0x62, 0xe5, 0x22, 0x9f,
+ 0x1d, 0xa2, 0xa9, 0xeb, 0x3b, 0x5f, 0x98, 0x64, 0x14, 0x0b, 0x27, 0x25,
+ 0x14, 0x89, 0x6d, 0x2b, 0xff, 0xb9, 0xfc, 0xf6, 0x1f, 0xff, 0xd8, 0xe8,
+ 0x65, 0x31, 0xd8, 0x50, 0x5f, 0x47, 0xed, 0xf5, 0x9a, 0xd3, 0x62, 0xf5,
+ 0x8b, 0x92, 0x51, 0x81, 0x4a, 0xde, 0x6b, 0xc1, 0x85, 0xcc, 0x18, 0x42,
+ 0xbc, 0x0d, 0xe5, 0x25, 0x68, 0x41, 0x34, 0x13, 0x49, 0x59, 0x5d, 0x9c,
+ 0x29, 0x2c, 0x0d, 0xe0, 0xfb, 0x8d, 0x72, 0x09, 0xf5, 0x0f, 0x84, 0x1f,
+ 0x78, 0xe2, 0x4f, 0x6f, 0x68, 0x54, 0x43, 0xa3, 0xba, 0x5b, 0x4a, 0x1f,
+ 0x60, 0xda, 0x13, 0x6a, 0xd1, 0x4e, 0x5c, 0xff, 0x53, 0x37, 0xbb, 0x22,
+ 0x44, 0xeb, 0x66, 0x1c, 0xfc, 0x9a, 0xec, 0x6b, 0x8b, 0x52, 0x1a, 0x43,
+ 0x3c, 0x0e, 0x88, 0x09, 0x65, 0x5e, 0xc3, 0x33, 0xeb, 0x47, 0x27, 0x9f,
+ 0xb3, 0xaf, 0xd8, 0x3c, 0x0a, 0xda, 0x7a, 0xda, 0xbf, 0x4c, 0x4c, 0x5e,
+ 0xf8, 0x5d, 0x77, 0xcf, 0xa9, 0x67, 0xf8, 0x93, 0x22, 0x3f, 0xe2, 0xb4,
+ 0xfc, 0xb4, 0x1c, 0x70, 0x45, 0xdc, 0x14, 0xd9, 0x32, 0xe2, 0x81, 0x80,
+ 0xa2, 0x8c, 0xea, 0xb8, 0x85, 0xf2, 0xc0, 0xbc, 0xe5, 0x35, 0xc6, 0x05,
+ 0xcf, 0x2a, 0x3a, 0xcc, 0xfa, 0x9f, 0x17, 0xc2, 0x28, 0x91, 0xe2, 0xab,
+ 0xc6, 0x3c, 0x6d, 0xbc, 0x60, 0xff, 0xaa, 0x52, 0x01, 0x7a, 0x6f, 0x7e,
+ 0xbd, 0x75, 0xdf, 0x7e, 0x0d, 0xd1, 0x99, 0xa2, 0x1e, 0x26, 0x14, 0x61,
+ 0x77, 0x4c, 0x5c, 0x06, 0xd0, 0x8f, 0x43, 0x34, 0x18, 0xfb, 0xb7, 0xf4,
+ 0x46, 0x73, 0xc8, 0x2e, 0x2c, 0xc4, 0x46, 0x28, 0x6d, 0x0d, 0xec, 0x7b,
+ 0x3e, 0x6e, 0xff, 0x16, 0x27, 0xc9, 0x14, 0xa8, 0x7a, 0x1a, 0x1d, 0x94,
+ 0xe4, 0x3b, 0xfc, 0x94, 0x16, 0xe0, 0x0c, 0xef, 0x8e, 0x8a, 0x15, 0x80,
+ 0x19, 0xfb, 0x2a, 0x21, 0xca, 0xbe, 0x0e, 0xb2, 0xd8, 0xbb, 0xfa, 0xaa,
+ 0xd5, 0x5e, 0x39, 0xb3, 0xda, 0xab, 0x9e, 0x24, 0x36, 0x49, 0x8c, 0x4b,
+ 0xf7, 0x25, 0x56, 0x2c, 0x29, 0xab, 0x99, 0x36, 0x90, 0xa5, 0xcf, 0x5e,
+ 0xa4, 0x4b, 0xe5, 0xfb, 0xc8, 0xb7, 0xad, 0x15, 0x49, 0xcb, 0xaa, 0xca,
+ 0x8d, 0x80, 0x21, 0x2e, 0x72, 0x96, 0xc0, 0xb5, 0xde, 0x2b, 0xf5, 0x40,
+ 0x18, 0x46, 0xb0, 0x3b, 0x34, 0x5e, 0x67, 0xeb, 0x6e, 0xe6, 0x0d, 0xfd,
+ 0x9c, 0x34, 0x71, 0xa1, 0xfc, 0x43, 0x5d, 0x07, 0xbc, 0x96, 0xac, 0xb3,
+ 0xfb, 0x79, 0x8f, 0xbb, 0xe2, 0x0e, 0x35, 0x29, 0xd5, 0x0b, 0xf0, 0x25,
+ 0xf0, 0xe9, 0x2b, 0x9e, 0xab, 0xa1, 0x57, 0x09, 0x70, 0x88, 0xb0, 0xf5,
+ 0x10, 0x0c, 0x8f, 0xf1, 0x1f, 0x14, 0xa8, 0x55, 0x5e, 0xdd, 0xc2, 0xa4,
+ 0xba, 0xbc, 0xfa, 0x24, 0x6e, 0x1f, 0xe8, 0x34, 0x9a, 0xa7, 0x4b, 0x2c,
+ 0x04, 0x71, 0xc9, 0x43, 0x64, 0xd1, 0x11, 0xcf, 0xd1, 0x50, 0x0b, 0xf7,
+ 0xc9, 0xa9, 0x85, 0xb1, 0x0b, 0xce, 0x72, 0x72, 0xf2, 0xaa, 0xcd, 0xae,
+ 0xc9, 0x6b, 0x33, 0x5f, 0x4a, 0xa6, 0x07, 0xcd, 0x4b, 0xfb, 0x2f, 0x12,
+ 0x27, 0xf9, 0xee, 0xf3, 0x5e, 0x60, 0x2f, 0x2f, 0x8f, 0x6d, 0x56, 0xcb,
+ 0x12, 0x7f, 0xdf, 0xfd, 0x6c, 0x25, 0xb4, 0x18, 0x82, 0x2e, 0x91, 0x4b,
+ 0xa9, 0xc2, 0x50, 0x71, 0x1e, 0xbf, 0x4a, 0xdc, 0x6f, 0x1f, 0x15, 0x6f,
+ 0x0b, 0xdf, 0x91, 0x5e, 0x7e, 0xf1, 0xf8, 0x1f, 0x5f, 0xd8, 0x43, 0x2b,
+ 0x18, 0xb7, 0xd4, 0x48, 0x5f, 0xb7, 0x8c, 0x7d, 0xa8, 0xd0, 0x21, 0x18,
+ 0xd8, 0x32, 0xd7, 0xb9, 0xf3, 0x56, 0x4b, 0x54, 0xc2, 0x36, 0x8b, 0xe1,
+ 0xa5, 0x23, 0x4e, 0xdc, 0x8d, 0x32, 0x03, 0x31, 0x78, 0x99, 0x64, 0x32,
+ 0x44, 0x1d, 0x8e, 0xa0, 0xce, 0x0b, 0x51, 0x2f, 0xb6, 0x64, 0xe6, 0x04,
+ 0xd8, 0x32, 0xb9, 0x17, 0xff, 0x9d, 0x87, 0x3f, 0x41, 0x32, 0x66, 0x94,
+ 0x91, 0xf2, 0x60, 0x82, 0x19, 0x31, 0x5f, 0x80, 0x8d, 0x54, 0xe0, 0x98,
+ 0x07, 0x03, 0x81, 0x93, 0xe1, 0x67, 0x17, 0x1b, 0x58, 0x62, 0x57, 0x77,
+ 0xa2, 0x4b, 0x2a, 0x7a, 0x77, 0x59, 0x1f, 0x85, 0xdb, 0x3b, 0xcf, 0x2f,
+ 0x7a, 0x7c, 0xce, 0xbf, 0xa6, 0x77, 0x9c, 0x89, 0x83, 0xeb, 0xd9, 0xb9,
+ 0x21, 0xd7, 0x02, 0x6c, 0x78, 0x12, 0x0f, 0x84, 0x29, 0x26, 0xee, 0x5e,
+ 0xb3, 0xd0, 0xa4, 0x48, 0x82, 0x84, 0x4f, 0x1d, 0x77, 0x8d, 0xca, 0x77,
+ 0x7a, 0x10, 0x38, 0x78, 0x0f, 0xde, 0xd9, 0x8d, 0x8b, 0xeb, 0x04, 0xf4,
+ 0x53, 0xff, 0x0b, 0xae, 0x3f, 0x02, 0x16, 0x89, 0x09, 0xa2, 0x20, 0x04,
+ 0x90, 0xf6, 0x72, 0x66, 0xd2, 0x52, 0x50, 0x40, 0x6d, 0x77, 0x7d, 0x7c,
+ 0xf7, 0x38, 0xa6, 0x8b, 0xc4, 0x52, 0xa2, 0xba, 0x33, 0x76, 0x75, 0xc1,
+ 0xf2, 0x26, 0xf1, 0x87, 0x92, 0xa0, 0xc7, 0xa4, 0x80, 0xf8, 0x4e, 0xc7,
+ 0x9d, 0x42, 0xaf, 0x6e, 0xce, 0x38, 0x9d, 0xa5, 0x73, 0xf1, 0x3e, 0x75,
+ 0x26, 0xac, 0x33, 0xee, 0x5a, 0x51, 0xf9, 0x1e, 0x56, 0xcb, 0x6d, 0x1e,
+ 0x3f, 0x1a, 0x94, 0xe9, 0x0d, 0x14, 0x7b, 0xc0, 0x4a, 0xfa, 0xf9, 0x36,
+ 0x98, 0xdb, 0x64, 0xc1, 0x11, 0x33, 0x2d, 0x4f, 0x29, 0xa0, 0xff, 0x56,
+ 0xef, 0x40, 0xba, 0xf0, 0x75, 0xf0, 0xdd, 0x9c, 0x89, 0x02, 0x1b, 0xa5,
+ 0xb0, 0xdf, 0x6f, 0xae, 0x45, 0xca, 0xbf, 0x2e, 0x63, 0xd7, 0x75, 0x11,
+ 0x83, 0x3c, 0x21, 0x5d, 0xc6, 0xc8, 0x88, 0x60, 0xf8, 0x62, 0x11, 0xf5,
+ 0x49, 0xdc, 0x01, 0xa7, 0x04, 0x60, 0xed, 0xac, 0x4b, 0x04, 0x45, 0x80,
+ 0xa8, 0xf3, 0x7a, 0xc1, 0x65, 0x71, 0x76, 0x54, 0x6a, 0x4b, 0x7d, 0xef,
+ 0xb8, 0x05, 0xd6, 0x2a, 0x5d, 0x9e, 0x8a, 0x8c, 0x82, 0xe6, 0x71, 0x89,
+ 0x07, 0x6c, 0xcf, 0xf7, 0xf5, 0xb8, 0xfc, 0xfc, 0x83, 0x11, 0xdd, 0xc3,
+ 0x60, 0x75, 0x8f, 0xb4, 0x2a, 0xdf, 0xcc, 0xe5, 0x3d, 0x89, 0xce, 0x8d,
+ 0x90, 0x6e, 0xed, 0x36, 0x97, 0xf5, 0x44, 0x20, 0xcf, 0xc4, 0xc2, 0x1f,
+ 0xbc, 0xf4, 0x7a, 0x02, 0x6b, 0xa0, 0x9c, 0xad, 0xde, 0xf7, 0x4e, 0xda,
+ 0x6b, 0xd9, 0x5e, 0x74, 0xb2, 0x2c, 0xae, 0x89, 0x74, 0x5d, 0x3e, 0x40,
+ 0x41, 0x8d, 0x4b, 0x38, 0xba, 0x69, 0x1e, 0xe6, 0x42, 0x04, 0x6c, 0xa4,
+ 0x24, 0x46, 0xc8, 0x8e, 0xa3, 0xfb, 0x11, 0x11, 0x55, 0x0b, 0xb6, 0xcf,
+ 0xde, 0xb6, 0x8a, 0x99, 0x92, 0xb0, 0x2f, 0x7d, 0x5d, 0xac, 0x9b, 0xea,
+ 0x41, 0x03, 0x79, 0x5b, 0x95, 0x37, 0xeb, 0x9c, 0xae, 0x8c, 0xe8, 0xee,
+ 0x8b, 0x75, 0xf0, 0xd9, 0x92, 0xfd, 0x94, 0xb9, 0x4a, 0x88, 0x95, 0x9b,
+ 0x41, 0xdf, 0xe5, 0x86, 0x51, 0xcf, 0x7b, 0xa9, 0xe6, 0xad, 0x69, 0xf2,
+ 0x27, 0x96, 0x80, 0xc7, 0xcb, 0x92, 0xb3, 0xb4, 0x9e, 0xca, 0xd6, 0xb7,
+ 0xc8, 0x49, 0x49, 0x89, 0x5c, 0xd3, 0xa5, 0xf1, 0xf7, 0x56, 0x35, 0x59,
+ 0x40, 0x1f, 0xa7, 0x9e, 0x6c, 0x2e, 0x6d, 0xfe, 0x99, 0x7e, 0xc9, 0xb9,
+ 0xe3, 0xf4, 0xb8, 0xa5, 0x20, 0xe2, 0xec, 0x50, 0x67, 0x48, 0x50, 0xfc,
+ 0x7f, 0x7d, 0xbf, 0x26, 0x88, 0x2f, 0x35, 0xd3, 0xea, 0xc1, 0x94, 0x05,
+ 0xd7, 0x7f, 0x8c, 0x01, 0x1d, 0x98, 0x00, 0x39, 0x5f, 0x85, 0x1c, 0x6c,
+ 0x78, 0xf1, 0xe8, 0xa6, 0xca, 0xa2, 0x6d, 0x0e, 0x05, 0x53, 0x9e, 0xf1,
+ 0x1a, 0xee, 0xed, 0x97, 0x1d, 0x3b, 0xc5, 0x26, 0xf7, 0x62, 0x40, 0xa5,
+ 0x5d, 0xba, 0x18, 0x56, 0xcd, 0x8f, 0x7f, 0xd8, 0xa9, 0x4e, 0x9b, 0xbb,
+ 0x97, 0xbe, 0xfe, 0x4a, 0xe7, 0x65, 0x07, 0xa1, 0x49, 0xd6, 0xf7, 0x9c,
+ 0xf8, 0x8e, 0xd7, 0x4f, 0x6d, 0xf7, 0xe2, 0x81, 0x51, 0x37, 0x72, 0x61,
+ 0x2c, 0xae, 0x92, 0x34, 0x56, 0x5a, 0x39, 0xa8, 0xb9, 0x71, 0x83, 0xec,
+ 0x10, 0xfd, 0x66, 0x46, 0xed, 0xbc, 0xcc, 0x3e, 0xac, 0xb2, 0x15, 0xd0,
+ 0xd6, 0x77, 0x17, 0x83, 0x11, 0x50, 0x0b, 0xdc, 0xdf, 0xa6, 0x56, 0x85,
+ 0x11, 0x2e, 0xe6, 0x87, 0x6b, 0x57, 0x77, 0x1a, 0xae, 0x2e, 0x9b, 0x69,
+ 0xc2, 0x16, 0x40, 0x0c, 0x3c, 0xba, 0xd8, 0xe7, 0xe2, 0xdc, 0x7d, 0x05,
+ 0x09, 0x39, 0x97, 0xea, 0xe6, 0xe5, 0x3a, 0xac, 0x26, 0x82, 0x8a, 0x16,
+ 0xba, 0xa3, 0xf4, 0xae, 0xee, 0xa5, 0x0a, 0x39, 0xa3, 0x70, 0xc7, 0xde,
+ 0xf7, 0x61, 0xd2, 0x1c, 0x28, 0xe1, 0x34, 0x5f, 0xf3, 0xf7, 0xce, 0xf9,
+ 0xde, 0xb4, 0xfd, 0xba, 0x71, 0xd9, 0x69, 0xd3, 0x92, 0x35, 0x1c, 0xb9,
+ 0x91, 0x20, 0x34, 0x85, 0x2b, 0x49, 0xc5, 0x80, 0xeb, 0x9f, 0x61, 0x5e,
+ 0xd6, 0x8c, 0xa0, 0x83, 0xe1, 0x61, 0x8e, 0x61, 0xd2, 0x64, 0x41, 0x88,
+ 0xf5, 0xf6, 0x51, 0x22, 0x3b, 0x1d, 0x2c, 0x7d, 0x66, 0x26, 0x4f, 0x5e,
+ 0xe3, 0x78, 0xbc, 0x4b, 0x00, 0x00, 0x96, 0x6e, 0x01, 0xab, 0x0a, 0xf3,
+ 0xdc, 0xc9, 0x97, 0xa0, 0xf6, 0x30, 0x47, 0x56, 0x66, 0x79, 0xa2, 0xb2,
+ 0x1d, 0x98, 0x98, 0x46, 0xbb, 0x78, 0x73, 0x55, 0xe9, 0x6c, 0xbe, 0xcf,
+ 0xf1, 0x08, 0x47, 0x98, 0xa8, 0xdc, 0x9f, 0xbe, 0x9a, 0x43, 0x6b, 0x32,
+ 0x73, 0xa9, 0xc2, 0x4e, 0xa5, 0xfa, 0xe1, 0xe6, 0xd7, 0x4e, 0xf5, 0xff,
+ 0xf3, 0x69, 0x8b, 0x2c, 0x7e, 0x53, 0x19, 0x5b, 0xb0, 0xb5, 0x0e, 0xb2,
+ 0x0e, 0x21, 0x49, 0xac, 0xfc, 0x27, 0x5d, 0x32, 0x73, 0x36, 0x3d, 0x26,
+ 0x50, 0x27, 0x6c, 0xbc, 0x24, 0xb9, 0xf7, 0x50, 0x3a, 0xfb, 0x84, 0x2c,
+ 0xd2, 0x25, 0x61, 0x4b, 0x89, 0xef, 0xd2, 0x17, 0x2f, 0xff, 0x20, 0xba,
+ 0xa4, 0x5d, 0xb5, 0x94, 0xf3, 0xe0, 0x29, 0x64, 0x70, 0xfe, 0x81, 0xa1,
+ 0x72, 0x93, 0x95, 0x6b, 0x55, 0x0f, 0x8b, 0x18, 0xca, 0x85, 0xe6, 0x2c,
+ 0xb8, 0x90, 0x42, 0xbc, 0x5e, 0x5a, 0x9c, 0xd3, 0x30, 0x33, 0x27, 0xa3,
+ 0x9c, 0xb8, 0x69, 0x36, 0xca, 0xaa, 0xbe, 0x24, 0x54, 0x92, 0x5a, 0x5d,
+ 0x41, 0xcc, 0x27, 0xf9, 0x99, 0x4f, 0x10, 0x0b, 0xb7, 0xf3, 0x06, 0xd7,
+ 0x9d, 0x73, 0x22, 0x57, 0xd8, 0x3a, 0x73, 0x22, 0x77, 0x38, 0x00, 0x0e,
+ 0xd4, 0xad, 0x95, 0xac, 0x80, 0xf1, 0xae, 0xf5, 0x4a, 0xff, 0xd7, 0x57,
+ 0x34, 0xd3, 0xd2, 0xb0, 0xee, 0x61, 0xb1, 0x76, 0x17, 0x7e, 0xc1, 0xdd,
+ 0xdc, 0xab, 0x7c, 0x10, 0x95, 0x33, 0xec, 0x73, 0x01, 0x91, 0x51, 0xd9,
+ 0x6d, 0x6e, 0x2b, 0x29, 0x70, 0x41, 0xd8, 0xe7, 0xbe, 0x86, 0x91, 0x13,
+ 0x57, 0x9c, 0x91, 0x88, 0x83, 0x7a, 0xe7, 0xff, 0x1c, 0x8e, 0xbc, 0x04,
+ 0x1a, 0x89, 0xca, 0x29, 0x37, 0x96, 0x4d, 0xb7, 0xf1, 0x5a, 0x2d, 0x38,
+ 0xe2, 0x38, 0x83, 0xff, 0xe9, 0xa1, 0x89, 0xd5, 0xfc, 0xc5, 0xf2, 0xa9,
+ 0x1b, 0x3d, 0x82, 0x39, 0x90, 0xe2, 0x17, 0xfd, 0xf6, 0x4b, 0x22, 0x32,
+ 0x6e, 0xa2, 0x78, 0x46, 0x50, 0xaf, 0xb5, 0x75, 0x8a, 0x6b, 0x28, 0x11,
+ 0xd4, 0x49, 0x6c, 0x3d, 0x56, 0x4e, 0x2d, 0x2b, 0x56, 0x75, 0x41, 0xbf,
+ 0x2d, 0x15, 0x0d, 0xbb, 0x6c, 0x7b, 0x3d, 0xa6, 0xf5, 0xbe, 0x92, 0xeb,
+ 0x32, 0xaa, 0x92, 0x0d, 0x72, 0xd4, 0xa5, 0x8d, 0x83, 0xfb, 0x25, 0xc9,
+ 0xcc, 0x53, 0xb0, 0x78, 0xea, 0x73, 0x04, 0xd1, 0x06, 0x05, 0x16, 0x60,
+ 0xdb, 0xec, 0x49, 0x7a, 0x82, 0x2a, 0xc7, 0x51, 0xa4, 0x17, 0xf8, 0x41,
+ 0x91, 0xb2, 0xed, 0x70, 0xbe, 0x00, 0x73, 0xe4, 0xb0, 0x35, 0x8d, 0xbc,
+ 0xe4, 0x06, 0xa1, 0xcd, 0x29, 0xe8, 0x16, 0xaa, 0x34, 0xcf, 0xaa, 0xe0,
+ 0xc8, 0x75, 0x8b, 0x0d, 0x5e, 0x78, 0x10, 0x03, 0x9f, 0xf8, 0x98, 0xbe,
+ 0x52, 0x88, 0x60, 0x22, 0xf7, 0xc5, 0x11, 0x1e, 0xc4, 0xf1, 0x81, 0x1d,
+ 0x6b, 0x38, 0xb3, 0xf4, 0xad, 0x8f, 0x2a, 0xc9, 0x58, 0x97, 0x4c, 0x7b,
+ 0xea, 0x6f, 0x49, 0x04, 0x1e, 0xcd, 0xc1, 0x81, 0x73, 0x24, 0xe5, 0xf1,
+ 0x78, 0x27, 0x13, 0x01, 0x87, 0xc3, 0x45, 0xa1, 0x6c, 0x80, 0xbd, 0x5b,
+ 0x94, 0x8f, 0x5a, 0x69, 0x01, 0x02, 0xb6, 0xbf, 0x9c, 0x63, 0xa3, 0x3d,
+ 0x57, 0xb0, 0x3c, 0x6c, 0x09, 0x96, 0x73, 0x8f, 0x60, 0xc2, 0x98, 0xbb,
+ 0x34, 0x34, 0x7e, 0x22, 0xd4, 0xf5, 0xc9, 0x55, 0x48, 0x2b, 0x84, 0x4c,
+ 0xb9, 0x1f, 0x9e, 0x82, 0x9b, 0xaf, 0xfc, 0x73, 0xaa, 0x6a, 0x0f, 0x21,
+ 0xa3, 0xfe, 0xa8, 0x37, 0x52, 0xea, 0xea, 0x98, 0x0a, 0x09, 0x33, 0x34,
+ 0x10, 0xad, 0xbf, 0xe6, 0x38, 0xc1, 0xf0, 0xb3, 0xfd, 0xe7, 0xad, 0x8f,
+ 0xd5, 0x46, 0x19, 0xaf, 0xfc, 0xd9, 0x02, 0x73, 0xfe, 0xae, 0x7c, 0x4f,
+ 0xb5, 0xb0, 0x4d, 0x47, 0x83, 0xa0, 0xff, 0xb4, 0x02, 0xd2, 0x3c, 0x5e,
+ 0x64, 0x36, 0x5a, 0x75, 0x39, 0x56, 0xc3, 0x7b, 0x5c, 0x71, 0xed, 0xe4,
+ 0x05, 0x4e, 0xd5, 0x18, 0xe0, 0x03, 0xa2, 0x37, 0xe3, 0xa7, 0x00, 0xef,
+ 0xd0, 0x8a, 0x34, 0x6f, 0x24, 0x56, 0xdf, 0xa5, 0xc5, 0xde, 0xff, 0x90,
+ 0x05, 0x08, 0xfa, 0xd4, 0xf4, 0xb8, 0x06, 0xd0, 0x24, 0x48, 0x65, 0x39,
+ 0xe3, 0x00, 0xb5, 0x44, 0x20, 0xeb, 0xc1, 0xb9, 0x71, 0x05, 0x75, 0xb7,
+ 0xf6, 0x52, 0x87, 0x6c, 0xc0, 0xf1, 0x5f, 0x13, 0x69, 0xca, 0x85, 0xe7,
+ 0x59, 0x0b, 0xac, 0x1e, 0xa0, 0xb1, 0x4a, 0x6b, 0xfb, 0xab, 0xf7, 0x47,
+ 0x8f, 0x9a, 0xfb, 0x77, 0x58, 0x7a, 0x99, 0x0a, 0x17, 0xa3, 0x15, 0xc9,
+ 0x68, 0x19, 0x2b, 0xef, 0xee, 0xeb, 0xda, 0xbf, 0x57, 0xfe, 0x94, 0x88,
+ 0xdc, 0x34, 0x5d, 0xde, 0x96, 0x93, 0x6a, 0x7b, 0x74, 0xbb, 0xff, 0xe8,
+ 0x6f, 0x39, 0x1a, 0x01, 0xd3, 0x1f, 0xb3, 0xe7, 0x28, 0x7d, 0x0a, 0x6f,
+ 0x2a, 0x04, 0xa6, 0xa9, 0x88, 0xb8, 0xa9, 0x0a, 0x12, 0xd0, 0xdd, 0xb3,
+ 0x96, 0x67, 0xfe, 0x3e, 0xef, 0x6c, 0xae, 0xab, 0xc4, 0x30, 0x29, 0x62,
+ 0x0c, 0x17, 0x88, 0x2a, 0x87, 0xd3, 0x51, 0x39, 0xeb, 0x5c, 0x68, 0xaf,
+ 0x03, 0x47, 0xe8, 0xfd, 0xf7, 0x0d, 0x61, 0x54, 0x24, 0x21, 0x64, 0xd7,
+ 0xcc, 0xc1, 0x6b, 0x3f, 0xf2, 0x62, 0x0f, 0x8b, 0xce, 0x12, 0x34, 0x49,
+ 0x0a, 0xf8, 0x1d, 0x6b, 0xe2, 0x25, 0xd0, 0x23, 0x30, 0x63, 0x35, 0xb4,
+ 0xc3, 0xae, 0x7b, 0x2b, 0xb5, 0xe8, 0xe3, 0x85, 0xa9, 0x54, 0x32, 0xdf,
+ 0xce, 0x8b, 0xac, 0x01, 0xaa, 0x8e, 0x82, 0x6e, 0x30, 0xc5, 0x4b, 0x56,
+ 0xed, 0xea, 0x1d, 0xf5, 0xc5, 0x76, 0x56, 0x63, 0x99, 0x37, 0xa9, 0x21,
+ 0x8b, 0xea, 0x18, 0xfd, 0xd1, 0xa7, 0xc7, 0x27, 0x66, 0x6e, 0x7a, 0x86,
+ 0x70, 0xd1, 0xcd, 0x06, 0x80, 0xa6, 0xa0, 0x95, 0xd3, 0x59, 0x21, 0x58,
+ 0xc1, 0x03, 0x3c, 0x33, 0x07, 0xcf, 0xe4, 0x3a, 0x3c, 0x69, 0x20, 0x35,
+ 0x58, 0x56, 0x10, 0x94, 0xff, 0x4f, 0x92, 0xe4, 0xd0, 0xcc, 0x04, 0x72,
+ 0x3c, 0x35, 0x81, 0x5d, 0x31, 0x29, 0x99, 0x4c, 0x52, 0x19, 0x77, 0xa3,
+ 0x38, 0x2f, 0x58, 0x6e, 0x02, 0xc7, 0x2e, 0xd0, 0x7b, 0x14, 0x76, 0x94,
+ 0x8c, 0x1e, 0xeb, 0xee, 0xb2, 0x4c, 0x01, 0x50, 0x59, 0xcd, 0x2c, 0x33,
+ 0x6b, 0x46, 0xf5, 0xa6, 0x2e, 0xa9, 0x68, 0x2b, 0x4e, 0x9d, 0x7d, 0x19,
+ 0xdb, 0xa0, 0x60, 0xf1, 0xd4, 0x10, 0xc8, 0xa7, 0x18, 0x63, 0x67, 0x26,
+ 0xf6, 0x31, 0x18, 0x9b, 0xf3, 0x03, 0xec, 0xab, 0x98, 0x2c, 0xed, 0x87,
+ 0x19, 0x0f, 0x38, 0x85, 0x0e, 0x79, 0xd4, 0xe7, 0xcf, 0x39, 0x32, 0xdf,
+ 0xee, 0xdd, 0xc7, 0xa0, 0x18, 0x78, 0x4a, 0x6e, 0x93, 0x21, 0xc3, 0x26,
+ 0x12, 0x0c, 0x6c, 0xe6, 0x16, 0x46, 0x85, 0x7f, 0x76, 0xca, 0x53, 0x8d,
+ 0xa3, 0xae, 0xa3, 0xd0, 0x31, 0x55, 0x10, 0x32, 0xfe, 0xdf, 0x6d, 0x2b,
+ 0xf6, 0xf7, 0xba, 0x07, 0x5f, 0xca, 0xf8, 0x95, 0x02, 0xd6, 0xad, 0xc1,
+ 0x9e, 0x7c, 0xb5, 0xba, 0x1a, 0xfe, 0x64, 0xd1, 0x6a, 0x35, 0x96, 0x43,
+ 0x61, 0x5d, 0x3d, 0x5a, 0x20, 0x4b, 0x4a, 0x11, 0x39, 0xf5, 0xb3, 0xd1,
+ 0x81, 0x5f, 0xd0, 0x59, 0xef, 0x10, 0x88, 0x2d, 0x24, 0xe1, 0x2c, 0xd5,
+ 0x74, 0x5e, 0xf7, 0x6b, 0xd3, 0x5a, 0x16, 0xb8, 0x23, 0x72, 0x4a, 0x8e,
+ 0x0b, 0xcf, 0x56, 0xc5, 0x41, 0x66, 0x16, 0xb7, 0x90, 0x32, 0xd1, 0xb8,
+ 0x6e, 0x8f, 0xc6, 0x5b, 0xa4, 0x2d, 0x4a, 0x62, 0xac, 0xb4, 0x7d, 0x87,
+ 0x0d, 0xc4, 0x4d, 0x4e, 0x56, 0x9f, 0x78, 0x92, 0x41, 0xf4, 0xd0, 0x9d,
+ 0xf1, 0x5d, 0x73, 0x38, 0xd9, 0xe1, 0xaf, 0xc4, 0xe4, 0x5d, 0x21, 0x6a,
+ 0x02, 0x38, 0x7d, 0x28, 0xd4, 0x9a, 0xea, 0xc2, 0x8c, 0x70, 0x53, 0x37,
+ 0x85, 0x97, 0x6f, 0xaa, 0xc3, 0x28, 0x0d, 0xab, 0x4d, 0x02, 0x4b, 0x9d,
+ 0x1c, 0xca, 0x11, 0x47, 0xf2, 0xf1, 0x97, 0x0f, 0x1a, 0xa9, 0x18, 0xc3,
+ 0x2e, 0x97, 0xd7, 0xff, 0xe4, 0x28, 0x3a, 0x7c, 0x47, 0x5b, 0xde, 0x35,
+ 0x01, 0x5f, 0xbe, 0x42, 0x25, 0xfb, 0x72, 0x89, 0x19, 0xfe, 0x52, 0x27,
+ 0xe9, 0xaf, 0x9e, 0x53, 0x36, 0x7c, 0x0f, 0xe5, 0x66, 0xc9, 0x8a, 0xb8,
+ 0xcb, 0xd3, 0x6f, 0x3d, 0xe7, 0x61, 0xf7, 0x80, 0x93, 0x8f, 0xac, 0x8f,
+ 0x8f, 0xf8, 0xce, 0x80, 0xe7, 0x20, 0x3b, 0xc7, 0x00, 0x9e, 0x20, 0x42,
+ 0x55, 0xd6, 0x0f, 0x87, 0xea, 0xb8, 0xe3, 0xa9, 0x4b, 0xa0, 0xe0, 0xff,
+ 0x64, 0xaa, 0x8d, 0x14, 0xf1, 0xc6, 0x73, 0x31, 0x88, 0x0c, 0x41, 0xb2,
+ 0xa7, 0x51, 0xc3, 0x26, 0x39, 0xc7, 0x87, 0xce, 0xc6, 0x76, 0xc8, 0x10,
+ 0xbd, 0xc2, 0xc1, 0x42, 0xdb, 0x7b, 0x1b, 0x21, 0x03, 0x3b, 0xab, 0x2a,
+ 0xd5, 0xf7, 0x2c, 0x9f, 0x23, 0x00, 0xf4, 0xd2, 0xd2, 0xdc, 0x0b, 0xcf,
+ 0xad, 0xa9, 0xd5, 0x04, 0xc2, 0xbc, 0xef, 0xc3, 0xf1, 0xc1, 0xe1, 0xf9,
+ 0x12, 0xf0, 0x30, 0x3a, 0x37, 0x62, 0x14, 0x70, 0x66, 0x5d, 0x59, 0x98,
+ 0x86, 0x61, 0xb6, 0xee, 0xcf, 0x32, 0xf8, 0x47, 0x27, 0x36, 0xc8, 0xe3,
+ 0x4b, 0xbd, 0x44, 0xdd, 0x6b, 0x9f, 0x96, 0x9e, 0xe5, 0xc7, 0x52, 0x3c,
+ 0x95, 0x20, 0x0c, 0xf0, 0xc6, 0x21, 0x82, 0xa8, 0x16, 0x80, 0x67, 0x31,
+ 0x33, 0xd8, 0x23, 0x7b, 0xe7, 0x87, 0x7b, 0xcf, 0x04, 0x63, 0xc1, 0xd1,
+ 0xfc, 0x5d, 0xf6, 0xb1, 0x32, 0x0c, 0x42, 0xc5, 0xa1, 0x12, 0x93, 0xd1,
+ 0x32, 0x2d, 0xaf, 0x23, 0x9c, 0x68, 0x5c, 0xfe, 0xb0, 0x00, 0x06, 0x21,
+ 0xa0, 0xd7, 0x92, 0x4e, 0xf7, 0x08, 0x27, 0x26, 0x17, 0x0e, 0x05, 0x8b,
+ 0x9c, 0x62, 0x64, 0x19, 0xc3, 0xdc, 0xa9, 0x2f, 0x32, 0xf0, 0x91, 0xd0,
+ 0x86, 0xd6, 0x42, 0xc8, 0x7d, 0x9d, 0x44, 0xc5, 0x1b, 0x93, 0xb3, 0xb6,
+ 0x7d, 0x10, 0x3b, 0xab, 0x6f, 0x02, 0x4c, 0xe5, 0xf5, 0x37, 0xb4, 0x0c,
+ 0x8d, 0xec, 0x72, 0x64, 0x22, 0x5d, 0x77, 0x54, 0x0a, 0x62, 0xb4, 0x8d,
+ 0xae, 0x85, 0xb4, 0x6e, 0x72, 0x0f, 0xdc, 0x2d, 0x6f, 0x5f, 0xa5, 0xf2,
+ 0xeb, 0x95, 0x9a, 0xf2, 0x4c, 0x2a, 0x8b, 0xa9, 0x8e, 0x68, 0x45, 0x2c,
+ 0xab, 0x14, 0x71, 0x69, 0x89, 0x9b, 0x23, 0xdb, 0x3b, 0x30, 0x34, 0x9c,
+ 0xee, 0xef, 0x78, 0x95, 0xf9, 0x1c, 0x2d, 0xce, 0x17, 0xa4, 0x46, 0x9a,
+ 0x63, 0x4a, 0xaa, 0x42, 0x37, 0x8e, 0xac, 0xe4, 0x58, 0x23, 0xe8, 0x4a,
+ 0xc4, 0x91, 0x07, 0xad, 0x3a, 0x4e, 0x6f, 0x6b, 0x53, 0xee, 0x6a, 0xc4,
+ 0x9b, 0xbc, 0x18, 0x86, 0x29, 0x4d, 0x01, 0x3e, 0x7f, 0x2c, 0x79, 0x54,
+ 0xb5, 0xb1, 0x1a, 0x5a, 0xb9, 0x3d, 0x37, 0x1f, 0x8b, 0x89, 0x58, 0xc4,
+ 0x45, 0x6b, 0xc0, 0x58, 0x21, 0xc7, 0xaf, 0xa0, 0x1d, 0x11, 0x3b, 0xd3,
+ 0xf8, 0x1d, 0x31, 0xf2, 0x33, 0x5b, 0x63, 0x54, 0x0c, 0x00, 0xd9, 0x98,
+ 0x4b, 0x42, 0xd9, 0x4e, 0xd8, 0x11, 0x04, 0x49, 0x67, 0x47, 0x27, 0xff,
+ 0x8b, 0xe0, 0x04, 0x96, 0x08, 0xbe, 0x46, 0xf2, 0xff, 0x07, 0xa4, 0xe9,
+ 0x22, 0xbf, 0x4b, 0x44, 0x01, 0x40, 0xfe, 0xf4, 0xe7, 0xe6, 0x8e, 0x95,
+ 0xb3, 0x99, 0x75, 0xd1, 0xe7, 0x59, 0x89, 0xc9, 0x9d, 0xe4, 0x79, 0x80,
+ 0x3c, 0x25, 0xd6, 0xf1, 0xa1, 0xc8, 0xca, 0x27, 0x14, 0x56, 0xc4, 0x6b,
+ 0xc2, 0xda, 0x99, 0x0e, 0x7c, 0xe2, 0xf7, 0x5e, 0x0e, 0x84, 0x37, 0x74,
+ 0xeb, 0x98, 0x81, 0x07, 0x9c, 0xb5, 0x4a, 0x2e, 0x16, 0x3f, 0xab, 0x3e,
+ 0x6d, 0x49, 0x89, 0xce, 0x92, 0x27, 0x97, 0x3a, 0xdd, 0x4f, 0xd5, 0x51,
+ 0xe3, 0x4e, 0x2e, 0x7b, 0x48, 0xaa, 0x17, 0xfb, 0x49, 0xf1, 0x6e, 0xbf,
+ 0xd5, 0x6b, 0xce, 0xc2, 0x7a, 0x74, 0x53, 0x5c, 0x51, 0xb2, 0x4b, 0xa7,
+ 0x7e, 0xf3, 0x44, 0xfb, 0xa6, 0x23, 0xf1, 0xe4, 0x0d, 0xe7, 0x7e, 0x27,
+ 0x58, 0xcc, 0x94, 0x73, 0xbf, 0x93, 0x56, 0xe8, 0x2f, 0x96, 0x97, 0x42,
+ 0x3a, 0x9b, 0x5f, 0xa7, 0x15, 0x7b, 0x06, 0xe4, 0xb6, 0x0e, 0xb3, 0xfb,
+ 0x2f, 0xcc, 0xfb, 0x79, 0xcc, 0x97, 0x7c, 0xf6, 0xe5, 0x25, 0xbb, 0x68,
+ 0x43, 0x87, 0x58, 0xc7, 0xb9, 0x52, 0xd8, 0x39, 0x7d, 0x16, 0x3b, 0x07,
+ 0x32, 0x23, 0x7d, 0x70, 0x3c, 0xcf, 0x96, 0x35, 0xf0, 0xbe, 0xd9, 0x25,
+ 0x84, 0x5b, 0x56, 0x1a, 0xeb, 0xf6, 0x8d, 0x9a, 0x03, 0xab, 0x3e, 0xb5,
+ 0x8a, 0x14, 0xce, 0xd2, 0x0c, 0x78, 0xeb, 0xb9, 0x1e, 0xdb, 0x10, 0x1c,
+ 0x5c, 0xd4, 0xf5, 0x19, 0xbb, 0x09, 0xd2, 0x88, 0x26, 0x5a, 0xba, 0x28,
+ 0x0d, 0x04, 0x87, 0xdb, 0xc0, 0x6d, 0x23, 0x2c, 0xfb, 0x97, 0xf8, 0x8b,
+ 0x3c, 0x3a, 0x29, 0x27, 0xcb, 0x6a, 0x17, 0x68, 0x1c, 0x8f, 0x16, 0x90,
+ 0x6f, 0x2f, 0x71, 0xea, 0x68, 0xe4, 0xc6, 0xc1, 0xee, 0xf3, 0xb5, 0x4a,
+ 0xe0, 0xcc, 0x3f, 0xba, 0x8f, 0x98, 0x45, 0xdf, 0x62, 0x5d, 0x9d, 0x29,
+ 0x65, 0x62, 0x7c, 0x0e, 0x2e, 0x83, 0x37, 0xfb, 0x47, 0x70, 0x06, 0xbc,
+ 0x70, 0x32, 0x99, 0xd1, 0x42, 0xcb, 0x75, 0x7f, 0x41, 0x46, 0x38, 0x82,
+ 0x88, 0x6d, 0x0d, 0x30, 0x9a, 0x99, 0xcc, 0x67, 0xbe, 0x60, 0xa5, 0xa4,
+ 0x6e, 0xc4, 0x0e, 0xb3, 0xfa, 0x0d, 0xa7, 0x9b, 0x22, 0xaa, 0x87, 0xf9,
+ 0x55, 0x3f, 0xe1, 0x18, 0x9a, 0xbf, 0xf0, 0x37, 0xb3, 0xd2, 0x7c, 0x7f,
+ 0x61, 0xde, 0x21, 0xc7, 0x0e, 0x03, 0xe5, 0x10, 0x0b, 0x54, 0x71, 0x70,
+ 0x72, 0x23, 0x77, 0x17, 0xc2, 0xee, 0xc4, 0xff, 0xdf, 0xa2, 0x8c, 0xdd,
+ 0xad, 0x8c, 0x63, 0xe4, 0x8a, 0xd0, 0x02, 0xa1, 0x38, 0xc4, 0x32, 0x97,
+ 0x4b, 0x76, 0x97, 0x97, 0xd1, 0xd6, 0xc5, 0x7c, 0x94, 0x3b, 0x6f, 0x97,
+ 0x3d, 0x0d, 0xb6, 0xd9, 0x78, 0x28, 0xcd, 0x3f, 0x71, 0xca, 0x28, 0x5e,
+ 0xf7, 0xaa, 0x93, 0xfb, 0xb3, 0xb5, 0x5c, 0x05, 0x92, 0xd2, 0xf2, 0x51,
+ 0x9e, 0x6d, 0xbb, 0xec, 0x7c, 0x64, 0xec, 0x50, 0x27, 0x08, 0x17, 0x72,
+ 0xe3, 0xb1, 0x5c, 0xf2, 0x7f, 0x8b, 0x96, 0xea, 0xa1, 0x73, 0x46, 0xa2,
+ 0x6e, 0x47, 0xff, 0x92, 0x5f, 0xba, 0x8c, 0xd9, 0x96, 0xae, 0xf6, 0x99,
+ 0x95, 0x96, 0xf1, 0x21, 0x82, 0xf3, 0x9c, 0x59, 0x92, 0x28, 0x38, 0x38,
+ 0xdf, 0xc1, 0x9a, 0xa3, 0xaf, 0x5f, 0xc5, 0xad, 0xec, 0x66, 0xdf, 0x88,
+ 0x14, 0x5e, 0x11, 0x30, 0x7d, 0x62, 0xbe, 0x46, 0xd0, 0xfa, 0x84, 0x61,
+ 0x8e, 0xd5, 0x9a, 0x87, 0x59, 0x2b, 0x32, 0xc1, 0x0d, 0xfa, 0x4c, 0xa6,
+ 0xd9, 0x5e, 0x09, 0x78, 0x24, 0xf7, 0x72, 0x5a, 0x33, 0x64, 0x07, 0xc0,
+ 0x71, 0x81, 0xdf, 0x96, 0x6d, 0x36, 0x5f, 0x26, 0xee, 0xa2, 0xc1, 0x81,
+ 0x75, 0x67, 0xef, 0x99, 0x1b, 0x5f, 0x04, 0x2e, 0x30, 0x57, 0xe3, 0xfe,
+ 0x9a, 0xf2, 0x3a, 0x94, 0x48, 0xf6, 0x08, 0x62, 0x79, 0x0c, 0x7e, 0xdb,
+ 0x62, 0xff, 0x0f, 0x79, 0x5a, 0xc6, 0xac, 0x16, 0x20, 0x62, 0xdd, 0xb0,
+ 0xee, 0x29, 0x28, 0x1d, 0x79, 0xce, 0xb8, 0x44, 0xaa, 0xb4, 0x9c, 0xb2,
+ 0x54, 0x86, 0x18, 0xda, 0xed, 0x68, 0xff, 0x59, 0xeb, 0x07, 0xca, 0x28,
+ 0xf1, 0x10, 0x9e, 0xdc, 0x14, 0x55, 0x4f, 0x17, 0x62, 0x81, 0xcc, 0xbe,
+ 0xd1, 0xf5, 0x39, 0xe3, 0xc5, 0x75, 0x55, 0x3b, 0x06, 0x6b, 0x98, 0x9f,
+ 0x9d, 0x48, 0x4d, 0xa3, 0x52, 0x96, 0x64, 0x76, 0xa6, 0x16, 0x91, 0x04,
+ 0x02, 0x9b, 0x38, 0x75, 0x41, 0x09, 0xa3, 0xe9, 0xab, 0xf0, 0x9a, 0xb2,
+ 0x14, 0xb7, 0x8d, 0x7d, 0xab, 0x58, 0xbd, 0xaa, 0xe8, 0x69, 0x45, 0x93,
+ 0x06, 0xe9, 0x91, 0xd1, 0x03, 0x60, 0xc5, 0x32, 0x35, 0x95, 0xd8, 0xf8,
+ 0x82, 0x19, 0xef, 0x91, 0x2e, 0xc2, 0xbb, 0x91, 0x79, 0x6f, 0x80, 0x1e,
+ 0x60, 0x4b, 0x08, 0x9f, 0xe8, 0x1e, 0x47, 0x56, 0xc8, 0x40, 0xc3, 0x12,
+ 0x1a, 0x67, 0x17, 0x36, 0x3c, 0xc8, 0x46, 0xd0, 0x2c, 0xe5, 0xe6, 0x43,
+ 0x4f, 0xa7, 0x4a, 0x1d, 0x32, 0xfa, 0x91, 0x01, 0x6d, 0xb9, 0xab, 0x26,
+ 0x22, 0x9e, 0xd9, 0xe8, 0x7e, 0xa2, 0xff, 0xd2, 0xb8, 0xe3, 0x30, 0x40,
+ 0x80, 0xc4, 0x48, 0xf3, 0xcd, 0x45, 0xfe, 0x72, 0x6e, 0x6b, 0x56, 0xfe,
+ 0x88, 0x22, 0x8d, 0xf2, 0x7f, 0xe3, 0x7d, 0xb8, 0x83, 0x53, 0xa7, 0x42,
+ 0x54, 0xfc, 0x1e, 0x1d, 0xb5, 0xba, 0x2e, 0x70, 0xb4, 0x93, 0x41, 0x30,
+ 0x3d, 0x4c, 0x05, 0x36, 0x58, 0x1f, 0x18, 0x14, 0x71, 0xc6, 0xdd, 0x98,
+ 0x90, 0x4d, 0x97, 0xad, 0x02, 0xff, 0x2a, 0x61, 0xae, 0x82, 0xa1, 0xb0,
+ 0xf2, 0xe1, 0x74, 0x15, 0x07, 0x79, 0x5d, 0xb8, 0x14, 0x52, 0xa5, 0x48,
+ 0xed, 0xc0, 0xfc, 0x5b, 0x91, 0x74, 0xb9, 0xff, 0xb6, 0xc9, 0x3f, 0xd9,
+ 0xb2, 0xbf, 0xb1, 0x66, 0x91, 0xc8, 0x0a, 0xaf, 0x48, 0x98, 0x25, 0x8a,
+ 0x07, 0xab, 0x16, 0x97, 0xfc, 0xdf, 0xc8, 0xcc, 0x67, 0xe0, 0x9f, 0x81,
+ 0x18, 0xcb, 0x8a, 0x5e, 0x6c, 0xa2, 0xc8, 0x01, 0xbe, 0x3f, 0xe4, 0x84,
+ 0xb8, 0x70, 0x70, 0xc2, 0xee, 0x43, 0xfc, 0xb7, 0xb7, 0xc9, 0x43, 0x78,
+ 0xf2, 0x87, 0x37, 0xbd, 0xdb, 0xe7, 0x96, 0xda, 0x6d, 0x49, 0xef, 0x01,
+ 0xc0, 0xcd, 0xdb, 0x03, 0x4f, 0x77, 0xf6, 0xdb, 0xc0, 0x8f, 0x0a, 0x1d,
+ 0x3f, 0xd8, 0x60, 0x64, 0x6d, 0x56, 0x52, 0xa2, 0x50, 0x76, 0x35, 0x32,
+ 0x8b, 0x76, 0x77, 0xad, 0x69, 0xa7, 0x79, 0x45, 0x71, 0xb9, 0x9c, 0x73,
+ 0xd5, 0xb6, 0x35, 0x2e, 0x51, 0x6d, 0x47, 0x8a, 0x11, 0xfd, 0xf6, 0x5b,
+ 0x07, 0xd9, 0x7e, 0xf8, 0xb0, 0x2e, 0x5d, 0xac, 0xdf, 0xa5, 0x8a, 0x1e,
+ 0xae, 0x61, 0xcf, 0xf4, 0x1c, 0x73, 0x95, 0x06, 0x69, 0x5e, 0xe7, 0xfd,
+ 0x52, 0x91, 0xec, 0xba, 0x8c, 0x38, 0x91, 0xea, 0x94, 0xf4, 0x0b, 0x7f,
+ 0xd8, 0xce, 0xbf, 0x76, 0xca, 0xf2, 0xc8, 0x02, 0x02, 0xde, 0x99, 0x1a,
+ 0xa4, 0x80, 0x24, 0x3e, 0x60, 0xd1, 0x76, 0xf5, 0xac, 0x0d, 0xc3, 0x7f,
+ 0x2b, 0xce, 0x3e, 0xf2, 0x33, 0x87, 0x77, 0xc2, 0x08, 0xba, 0x55, 0xbb,
+ 0x26, 0x12, 0x20, 0xa1, 0xde, 0xf0, 0x83, 0xe1, 0x48, 0xc5, 0x70, 0x49,
+ 0x29, 0x3b, 0x19, 0xda, 0xd1, 0x46, 0x60, 0x27, 0x2d, 0x15, 0x85, 0xd5,
+ 0x62, 0x94, 0x1d, 0x8f, 0x60, 0x7e, 0x56, 0xb9, 0x43, 0x92, 0xc8, 0x1a,
+ 0x4c, 0xca, 0x13, 0x53, 0x57, 0xb2, 0xb4, 0xb8, 0x4f, 0xa7, 0x5f, 0x4f,
+ 0x41, 0x8e, 0xcf, 0x44, 0x60, 0x05, 0x5f, 0x40, 0x60, 0xee, 0x67, 0x0b,
+ 0x67, 0xa1, 0xff, 0x3f, 0x63, 0x3b, 0x90, 0x56, 0x9d, 0x73, 0x27, 0xd7,
+ 0xd2, 0x64, 0xae, 0x38, 0x33, 0x58, 0xc0, 0xd6, 0x24, 0x7c, 0x99, 0xe9,
+ 0xe9, 0x6f, 0x7e, 0xdb, 0x35, 0x10, 0x94, 0xe9, 0xb7, 0x98, 0x26, 0xec,
+ 0xfc, 0x23, 0xcb, 0xc8, 0x21, 0x68, 0xe9, 0x9b, 0xdb, 0x2d, 0x08, 0x7f,
+ 0x3b, 0x33, 0xa7, 0xc9, 0x98, 0x87, 0x72, 0x3d, 0xfe, 0xfe, 0x67, 0x3f,
+ 0xee, 0x8b, 0xec, 0x65, 0x89, 0x38, 0xab, 0x4d, 0xfb, 0x63, 0xd0, 0x69,
+ 0xa4, 0x1e, 0x68, 0xa2, 0xc3, 0x41, 0xfd, 0x0e, 0x0a, 0xd1, 0x71, 0xd8,
+ 0xd7, 0xc9, 0xa0, 0x16, 0x7b, 0xa0, 0xbb, 0x83, 0x22, 0x8d, 0x70, 0xbb,
+ 0x1c, 0xf5, 0xcf, 0xbe, 0xb0, 0xf9, 0x2b, 0xfd, 0x7d, 0x4c, 0xb9, 0xd8,
+ 0x09, 0x42, 0x46, 0x33, 0x21, 0x96, 0x24, 0x51, 0xf8, 0xdf, 0x85, 0x01,
+ 0xf7, 0x88, 0xaa, 0xb2, 0xa7, 0xc8, 0x1c, 0x2b, 0xa9, 0x76, 0x6b, 0x91,
+ 0x61, 0xfd, 0x5b, 0x87, 0xc0, 0x92, 0xde, 0x3e, 0x35, 0x99, 0x1b, 0x5a,
+ 0xf3, 0x17, 0x7e, 0x1a, 0x6d, 0xd2, 0x78, 0x32, 0x13, 0x96, 0x2d, 0xbe,
+ 0x42, 0x06, 0xee, 0x4b, 0x50, 0x8f, 0xdf, 0x1e, 0xcb, 0x06, 0x35, 0x9f,
+ 0xf9, 0xbc, 0x42, 0xe2, 0x5d, 0xc8, 0xbc, 0xa1, 0x89, 0x75, 0x5d, 0xe1,
+ 0xdc, 0xbe, 0x4c, 0x6f, 0xfa, 0x77, 0xd5, 0x68, 0xf0, 0xde, 0xdd, 0xc7,
+ 0xae, 0x93, 0x16, 0x1f, 0xff, 0x47, 0xec, 0xb5, 0x0d, 0x62, 0xc2, 0xf6,
+ 0xbc, 0xed, 0xd5, 0x82, 0x7d, 0x23, 0x76, 0xf3, 0xa1, 0x63, 0xac, 0x68,
+ 0x36, 0x2d, 0xe6, 0x02, 0x1c, 0x26, 0x96, 0xee, 0x2a, 0x11, 0xe3, 0x24,
+ 0x6a, 0x5c, 0xf9, 0xca, 0x7f, 0x01, 0xcb, 0x37, 0x0b, 0x94, 0x99, 0xfe,
+ 0x04, 0xef, 0x4d, 0x3e, 0x3d, 0x3c, 0x0d, 0x27, 0x0a, 0xbd, 0x47, 0xa5,
+ 0xa0, 0x9b, 0x21, 0xfe, 0x79, 0xa9, 0xd2, 0x50, 0x25, 0x1f, 0x1b, 0xc6,
+ 0x52, 0x14, 0xa9, 0x3a, 0xa1, 0x0c, 0xcd, 0x61, 0xe8, 0x1b, 0xbd, 0x5c,
+ 0x76, 0x08, 0x5f, 0xdf, 0x58, 0xe3, 0x2c, 0x5c, 0x48, 0x22, 0xb5, 0x73,
+ 0x8a, 0xcc, 0x79, 0x52, 0xcd, 0xd2, 0x23, 0x69, 0xce, 0x53, 0xff, 0xef,
+ 0x95, 0xde, 0x6c, 0xe0, 0xe3, 0x14, 0xfa, 0x26, 0xb2, 0x6c, 0x5e, 0xb3,
+ 0x3d, 0xae, 0x4a, 0xff, 0x64, 0xc3, 0xdb, 0x7c, 0xf3, 0xb6, 0x67, 0xff,
+ 0xed, 0x13, 0x93, 0x6e, 0xd7, 0xf7, 0x4e, 0x7b, 0x96, 0x80, 0xa7, 0xcc,
+ 0x14, 0xea, 0xb1, 0xd0, 0xe1, 0x8b, 0x64, 0x5c, 0xed, 0x4a, 0x32, 0x9a,
+ 0x86, 0x79, 0xf3, 0xb2, 0x30, 0x95, 0xe6, 0x9a, 0xc9, 0x8a, 0x4d, 0x69,
+ 0xd4, 0xf3, 0x1a, 0x5a, 0x87, 0xb3, 0x7d, 0xc2, 0xa3, 0x97, 0x2b, 0x26,
+ 0x8b, 0xe6, 0xe1, 0xf7, 0x55, 0xd2, 0x82, 0xa2, 0x4b, 0xd4, 0x7a, 0x4b,
+ 0x98, 0xdd, 0x59, 0x8d, 0x6a, 0x76, 0xe2, 0x33, 0x93, 0x86, 0x6b, 0x4b,
+ 0x61, 0xd4, 0x5e, 0x1b, 0x96, 0xb7, 0xd5, 0xbb, 0x4b, 0x67, 0x20, 0x8f,
+ 0xdb, 0x9f, 0x01, 0xc1, 0x5c, 0x2a, 0x53, 0xf6, 0x67, 0x1f, 0xd9, 0x16,
+ 0x43, 0x33, 0xd2, 0xca, 0xb9, 0x76, 0xe8, 0x88, 0x63, 0xe2, 0xa5, 0x28,
+ 0xc8, 0x0d, 0x06, 0xc1, 0xd1, 0x54, 0x71, 0x22, 0x24, 0x98, 0xb5, 0xab,
+ 0xc6, 0x55, 0xc5, 0x19, 0x9b, 0xa6, 0x9d, 0x31, 0x8c, 0xd6, 0xc3, 0x3e,
+ 0x6e, 0x51, 0x26, 0x3b, 0xde, 0x7f, 0xcc, 0x7c, 0x98, 0x0d, 0xb4, 0xa1,
+ 0xf6, 0x63, 0x37, 0xfa, 0x35, 0xc5, 0x2a, 0xd1, 0x25, 0xe1, 0x85, 0xda,
+ 0xc9, 0xbc, 0xe0, 0x9d, 0x08, 0xf4, 0x70, 0xec, 0xb4, 0x6a, 0x66, 0xa5,
+ 0xd3, 0xf1, 0xba, 0x5a, 0x48, 0x6d, 0xa5, 0xf2, 0x0e, 0x1c, 0x68, 0x12,
+ 0x79, 0xb0, 0xb4, 0x99, 0xda, 0xa5, 0x19, 0xa6, 0xc5, 0x8f, 0x69, 0x60,
+ 0xd2, 0xca, 0xa1, 0x24, 0x7e, 0x03, 0xcd, 0x3d, 0x12, 0x2c, 0xe2, 0x9a,
+ 0x2a, 0xb0, 0x21, 0xda, 0xa2, 0xd7, 0x30, 0x6b, 0x47, 0xf0, 0x90, 0xcf,
+ 0x4b, 0x91, 0x33, 0x26, 0xb3, 0xeb, 0x2b, 0x9b, 0x76, 0xdb, 0xf6, 0x45,
+ 0xcd, 0x43, 0xe3, 0x70, 0x46, 0x89, 0x6a, 0xd4, 0x8a, 0x23, 0x25, 0x92,
+ 0x01, 0x70, 0xea, 0xcf, 0xca, 0xec, 0xe5, 0xb1, 0x6b, 0x55, 0x10, 0xd8,
+ 0xf2, 0x30, 0xbc, 0x32, 0xe4, 0x57, 0xfa, 0xc1, 0x81, 0x5c, 0xea, 0x67,
+ 0x13, 0xaa, 0x76, 0x26, 0x0b, 0xc5, 0xc7, 0x85, 0x9f, 0xb3, 0x40, 0xbc,
+ 0xfe, 0x64, 0xe2, 0xa6, 0xdc, 0x62, 0x11, 0xef, 0xd3, 0x42, 0x33, 0xbd,
+ 0x6e, 0x0d, 0x94, 0xdd, 0x99, 0xfe, 0x1a, 0xe3, 0x18, 0xe0, 0x55, 0xa3,
+ 0x4c, 0xcc, 0xce, 0x8f, 0xee, 0x5f, 0xd8, 0x43, 0xa6, 0xbe, 0x37, 0x4e,
+ 0xc5, 0x31, 0xfc, 0x3f, 0x80, 0x29, 0x33, 0x26, 0x08, 0x93, 0xb4, 0x6b,
+ 0xb0, 0xd3, 0xbb, 0xbc, 0x01, 0x17, 0x6a, 0x59, 0x0c, 0xca, 0x65, 0xaa,
+ 0x07, 0xae, 0xfc, 0x0a, 0xf4, 0x93, 0xcb, 0x4b, 0x7f, 0x29, 0xbc, 0xa8,
+ 0x3c, 0xc8, 0xeb, 0x5c, 0x44, 0xf5, 0xea, 0x06, 0xe2, 0x8e, 0x2b, 0xe2,
+ 0xd9, 0x48, 0x7e, 0x07, 0x89, 0xbc, 0x84, 0x09, 0xd0, 0x68, 0x33, 0x34,
+ 0x18, 0x6c, 0xa5, 0x50, 0x2c, 0xa4, 0xcc, 0xda, 0xda, 0xeb, 0x3f, 0xfa,
+ 0x76, 0x5c, 0x7f, 0x5f, 0xeb, 0x8c, 0x5a, 0xd6, 0x16, 0x0b, 0xf6, 0x85,
+ 0x70, 0x40, 0x47, 0x8f, 0xa3, 0x77, 0xdb, 0xbf, 0xb3, 0xbc, 0xb0, 0xa9,
+ 0xbf, 0xbe, 0x1d, 0x4f, 0x2f, 0x96, 0x9d, 0x87, 0xcc, 0x6d, 0x2e, 0xa4,
+ 0x84, 0xfa, 0x89, 0xb9, 0x05, 0xc5, 0x6e, 0x60, 0x00, 0xaa, 0x82, 0x25,
+ 0x0e, 0xa7, 0x61, 0xa7, 0xc9, 0x55, 0x99, 0xb3, 0x8e, 0x99, 0x41, 0xc8,
+ 0x1a, 0x7e, 0x1d, 0xd6, 0x5f, 0x4c, 0x22, 0xfb, 0x82, 0x2b, 0xaf, 0x7d,
+ 0x3b, 0x85, 0x18, 0xfe, 0x23, 0x3c, 0x0c, 0x8c, 0x95, 0xac, 0xc1, 0x20,
+ 0x2c, 0x37, 0x77, 0x32, 0xf0, 0x22, 0xbd, 0x5f, 0x93, 0xa2, 0xe6, 0x87,
+ 0x4d, 0x40, 0xd7, 0xd1, 0x45, 0x48, 0x77, 0xea, 0xc7, 0x8d, 0xc1, 0x23,
+ 0x40, 0xcd, 0x46, 0x69, 0xf6, 0x08, 0x85, 0x1a, 0x75, 0xa2, 0x7c, 0x73,
+ 0xf7, 0xfa, 0xe3, 0x18, 0x88, 0xb9, 0xde, 0x8d, 0x3c, 0x65, 0xdb, 0x3f,
+ 0xd4, 0x95, 0x91, 0x79, 0x6c, 0x9c, 0xaa, 0xa0, 0x0f, 0xf0, 0x9f, 0x6e,
+ 0xe7, 0x9b, 0xf9, 0x93, 0x83, 0xa1, 0x00, 0x83, 0xa9, 0x1f, 0x52, 0xc0,
+ 0xce, 0x89, 0xab, 0x7a, 0x88, 0x93, 0x72, 0x8c, 0xa7, 0xc4, 0xbb, 0x7d,
+ 0xcb, 0xc0, 0xd7, 0xa4, 0x15, 0x2a, 0x70, 0x16, 0x30, 0x27, 0xac, 0xf8,
+ 0x61, 0xbd, 0x87, 0x00, 0xc9, 0x29, 0x67, 0xb8, 0x27, 0xcb, 0xbc, 0xae,
+ 0x3f, 0xd7, 0xd8, 0xd3, 0x1f, 0x36, 0x07, 0x65, 0xea, 0x69, 0x7d, 0x98,
+ 0xd9, 0x3b, 0xd6, 0xf5, 0xff, 0x63, 0x32, 0xe6, 0xf4, 0x72, 0x1f, 0x18,
+ 0x1f, 0x61, 0xb0, 0x58, 0x54, 0xcc, 0x76, 0xbc, 0xb6, 0xc3, 0xfb, 0x43,
+ 0xd3, 0x79, 0x34, 0x55, 0x7f, 0x44, 0x59, 0x3a, 0x82, 0xdc, 0x7f, 0x09,
+ 0x0d, 0x8c, 0xf9, 0x86, 0x11, 0x64, 0x41, 0x9a, 0xae, 0xd4, 0x16, 0x47,
+ 0xfc, 0xfe, 0x0a, 0x0f, 0x94, 0x78, 0x9f, 0x8e, 0x73, 0xcc, 0xfc, 0x25,
+ 0x30, 0x08, 0x18, 0x3b, 0xcd, 0x2c, 0x9b, 0xe6, 0x27, 0x57, 0x55, 0xe4,
+ 0x37, 0x73, 0x61, 0x2e, 0x8f, 0x07, 0x27, 0xc8, 0x35, 0x72, 0x8d, 0x12,
+ 0x88, 0x52, 0x67, 0xef, 0xc2, 0xe1, 0x8e, 0x18, 0x8b, 0xfd, 0x91, 0x9e,
+ 0xaa, 0x32, 0x71, 0x02, 0x71, 0x5e, 0xbd, 0x71, 0x29, 0xc9, 0xb0, 0xb3,
+ 0x48, 0x1a, 0x7b, 0x41, 0xd9, 0x78, 0x1e, 0x31, 0x97, 0xe9, 0xfb, 0x34,
+ 0xb0, 0xa7, 0x82, 0x28, 0xcd, 0x6f, 0x2c, 0x7b, 0x5a, 0xcb, 0x2d, 0xed,
+ 0xd1, 0x95, 0xbe, 0xe7, 0x1f, 0xb3, 0xc0, 0xaa, 0xce, 0x11, 0xd7, 0x59,
+ 0xe7, 0x8e, 0x52, 0x8d, 0x07, 0x2f, 0xd5, 0xc5, 0x63, 0x65, 0xae, 0x93,
+ 0x06, 0x4d, 0xa8, 0xe3, 0xb4, 0x80, 0xc6, 0xa8, 0x2d, 0x25, 0x90, 0xa3,
+ 0x3a, 0x48, 0x5c, 0xde, 0x43, 0x9e, 0xe2, 0x9f, 0x4d, 0x19, 0x7b, 0xf2,
+ 0xc3, 0xae, 0x84, 0xc3, 0xdd, 0xce, 0x5e, 0x9f, 0x9f, 0x61, 0x99, 0x70,
+ 0x4f, 0xee, 0x08, 0xd5, 0xa9, 0x52, 0x19, 0x71, 0xd1, 0x3d, 0x52, 0xbd,
+ 0x39, 0xbe, 0xbf, 0x29, 0x30, 0x27, 0x4c, 0x60, 0x57, 0xcf, 0x1f, 0x4e,
+ 0xa6, 0xae, 0x21, 0xee, 0x44, 0x4b, 0xf7, 0xa2, 0x8a, 0x66, 0xa0, 0xfc,
+ 0x96, 0xa0, 0x82, 0x9c, 0xa5, 0xab, 0xf6, 0x4c, 0xba, 0x2d, 0x72, 0xd5,
+ 0xad, 0x03, 0x7d, 0x70, 0x89, 0xf1, 0xb3, 0x11, 0xb4, 0xf3, 0xdd, 0x28,
+ 0xf0, 0x23, 0xf0, 0x22, 0x3d, 0x91, 0x3b, 0x34, 0x1a, 0xd5, 0xa0, 0x11,
+ 0x2a, 0xe7, 0xdc, 0x62, 0xc9, 0x39, 0x0a, 0x27, 0x93, 0x4b, 0x81, 0x62,
+ 0x31, 0xe0, 0xb7, 0x5f, 0xa7, 0xed, 0x5a, 0xd3, 0xa5, 0xfb, 0x87, 0x1e,
+ 0x48, 0x3c, 0x5f, 0x69, 0xa6, 0x61, 0x31, 0x77, 0x59, 0x65, 0x9e, 0x3a,
+ 0x39, 0x11, 0x1c, 0x70, 0xc5, 0xbe, 0x8d, 0xd9, 0xf1, 0xdc, 0x31, 0x97,
+ 0xb2, 0x72, 0x6a, 0x78, 0xdd, 0x7d, 0x50, 0x54, 0x10, 0x70, 0x66, 0x6c,
+ 0xc1, 0x41, 0x89, 0x9d, 0x7e, 0xbd, 0x15, 0x52, 0x4a, 0x6e, 0x80, 0x06,
+ 0x13, 0x08, 0x81, 0xf1, 0x7a, 0xaf, 0x40, 0xfb, 0x22, 0xa5, 0x45, 0x73,
+ 0xec, 0xbc, 0x37, 0x8e, 0xb3, 0xfb, 0x1d, 0x7e, 0x5d, 0xa6, 0xe4, 0x9e,
+ 0xa1, 0x43, 0xf9, 0xa3, 0xad, 0x19, 0x86, 0xc3, 0x2a, 0xcd, 0xb8, 0xcd,
+ 0x2d, 0xcc, 0xd7, 0xa1, 0xf3, 0x8c, 0xb2, 0x34, 0x7e, 0x0a, 0xdb, 0x57,
+ 0x0e, 0x33, 0x41, 0x51, 0xcf, 0x75, 0xea, 0x52, 0x74, 0x5c, 0xa7, 0x08,
+ 0xb4, 0xef, 0x4a, 0xb7, 0xb2, 0x3b, 0x81, 0x97, 0xe2, 0x3a, 0x29, 0x3f,
+ 0x71, 0xd1, 0xb0, 0x46, 0x83, 0x3e, 0xcf, 0x91, 0x2b, 0xc0, 0xe4, 0x9e,
+ 0xa8, 0x66, 0x3f, 0xd6, 0x8f, 0x67, 0x26, 0x8e, 0x28, 0xca, 0x79, 0x04,
+ 0x2e, 0xe2, 0x1f, 0xd4, 0x43, 0x37, 0xbb, 0xe1, 0xdb, 0xe5, 0x62, 0xeb,
+ 0x29, 0x02, 0xdf, 0xe2, 0xf7, 0x73, 0x69, 0x74, 0xbc, 0xbc, 0x98, 0x22,
+ 0x28, 0x56, 0x45, 0xc5, 0xe7, 0xf2, 0xec, 0x96, 0x61, 0xa9, 0xf3, 0x4b,
+ 0x43, 0x7b, 0xb2, 0x41, 0x2d, 0xe7, 0xc7, 0x88, 0xf5, 0x17, 0x1a, 0xf4,
+ 0xbe, 0x0f, 0x49, 0xc6, 0x67, 0xd4, 0xd9, 0xe9, 0x55, 0x40, 0x3a, 0x4b,
+ 0xe8, 0xa8, 0x56, 0x53, 0x31, 0xf6, 0xe8, 0xaa, 0xfc, 0xab, 0x39, 0xe0,
+ 0xe6, 0xb1, 0xd7, 0x89, 0xa1, 0x2b, 0xf2, 0xd5, 0x59, 0x3f, 0x67, 0x90,
+ 0x65, 0x2d, 0xa3, 0xb7, 0x39, 0x81, 0xb3, 0x1e, 0xfb, 0x7c, 0x25, 0x76,
+ 0xa9, 0x1e, 0x05, 0x38, 0x0c, 0xd0, 0xcd, 0x20, 0x7f, 0x31, 0x76, 0xb1,
+ 0xfb, 0xba, 0xa1, 0x3b, 0xd7, 0x2c, 0x2a, 0x61, 0x2e, 0x4a, 0xb3, 0x24,
+ 0x70, 0x35, 0xb1, 0x88, 0x87, 0xaf, 0x37, 0xbd, 0x29, 0xf0, 0xcb, 0x22,
+ 0xa6, 0xcf, 0x0b, 0xc8, 0x31, 0x09, 0x51, 0xf8, 0x8f, 0x22, 0x6c, 0xdd,
+ 0x57, 0x51, 0xf2, 0x43, 0xf7, 0xba, 0x9c, 0xcb, 0x25, 0xde, 0x6e, 0x9c,
+ 0xc1, 0xac, 0x4a, 0x01, 0xaf, 0x87, 0x8b, 0x80, 0x65, 0xb4, 0x75, 0x2d,
+ 0xd8, 0x68, 0xd4, 0x03, 0x88, 0x13, 0x37, 0xfe, 0x29, 0xa2, 0x6c, 0x03,
+ 0xe2, 0xe6, 0xe9, 0x19, 0xc4, 0x85, 0xb6, 0x66, 0xf9, 0x7b, 0xe5, 0x63,
+ 0x2e, 0x8c, 0xd3, 0x7c, 0x70, 0x93, 0x15, 0x74, 0x98, 0x50, 0xcb, 0x5f,
+ 0x73, 0xcb, 0x05, 0xa5, 0xa0, 0x56, 0x40, 0x22, 0x57, 0x04, 0xb2, 0xa9,
+ 0xfb, 0xab, 0xfb, 0x40, 0x2a, 0x91, 0x6b, 0x48, 0x84, 0x77, 0x14, 0xe9,
+ 0x15, 0x3a, 0x9f, 0xed, 0xf9, 0x3d, 0xcc, 0x34, 0x8a, 0x56, 0x42, 0xea,
+ 0xa9, 0x4c, 0x9b, 0xa0, 0xb4, 0x75, 0x13, 0x22, 0xca, 0x8c, 0x6e, 0x80,
+ 0xd5, 0xf2, 0xfe, 0x9a, 0xce, 0x3c, 0x49, 0x7b, 0x6e, 0x61, 0xc0, 0x56,
+ 0xe5, 0x5d, 0x4f, 0xb7, 0x5e, 0x7d, 0x56, 0x5d, 0x85, 0xd9, 0xe8, 0x03,
+ 0xdb, 0x30, 0x1f, 0x22, 0x38, 0xdb, 0xff, 0x08, 0xae, 0xf1, 0x9c, 0xf7,
+ 0x47, 0x96, 0xe0, 0x89, 0x83, 0xea, 0x03, 0xc0, 0x1d, 0xb5, 0xbb, 0xbe,
+ 0x79, 0x76, 0x9b, 0x2f, 0xda, 0xe7, 0x65, 0x1f, 0xba, 0x02, 0x14, 0xae,
+ 0x2e, 0xf2, 0x09, 0x6b, 0x40, 0x51, 0x08, 0xc2, 0xb7, 0x5c, 0xa5, 0xf1,
+ 0xf4, 0x55, 0xd8, 0x12, 0xa4, 0xeb, 0x97, 0xc1, 0x33, 0x0d, 0xe4, 0x83,
+ 0x5f, 0xf3, 0xd6, 0xdb, 0xf9, 0xe7, 0x8c, 0x0b, 0x6f, 0xb6, 0x1d, 0x12,
+ 0x10, 0xaf, 0x4d, 0x41, 0x47, 0x50, 0x6d, 0x72, 0xf1, 0x03, 0xe6, 0x8e,
+ 0xe5, 0xbf, 0xb5, 0xe1, 0x34, 0xda, 0x8b, 0x52, 0x17, 0xcb, 0xcf, 0x1c,
+ 0xb6, 0x79, 0x32, 0x15, 0x82, 0x67, 0x47, 0x21, 0xa4, 0xc5, 0xc4, 0xab,
+ 0x74, 0xdb, 0xae, 0x95, 0xbd, 0xbf, 0x59, 0x68, 0x4f, 0x4b, 0x82, 0x51,
+ 0xba, 0xf2, 0x29, 0x78, 0x9f, 0xaa, 0x42, 0x67, 0x90, 0xcb, 0x83, 0x8b,
+ 0xeb, 0x24, 0x76, 0x30, 0x9a, 0xef, 0xe9, 0x95, 0xd2, 0x1c, 0xf6, 0x25,
+ 0xa2, 0x09, 0x8f, 0x2c, 0x04, 0xdc, 0x77, 0xff, 0x42, 0xe1, 0x7a, 0xca,
+ 0x98, 0x7b, 0xc0, 0xa1, 0x63, 0x3e, 0x59, 0x7c, 0xf7, 0xd4, 0xb2, 0x38,
+ 0x0a, 0x2b, 0x8f, 0x79, 0x96, 0x5f, 0xc0, 0x34, 0x36, 0xb9, 0xea, 0xc5,
+ 0xf7, 0x75, 0x1f, 0x5a, 0x72, 0x65, 0x67, 0x63, 0x0a, 0xd9, 0xb5, 0xe8,
+ 0x72, 0xc0, 0xf9, 0x06, 0xed, 0xc5, 0xa1, 0x8f, 0x62, 0x0e, 0x08, 0x62,
+ 0x70, 0x56, 0xf9, 0x70, 0xab, 0x56, 0xe1, 0x86, 0x9f, 0xb0, 0x9d, 0x2a,
+ 0x8a, 0x85, 0xe5, 0xd9, 0xe9, 0xe4, 0x87, 0xa6, 0x7f, 0x6e, 0xd4, 0xda,
+ 0x74, 0xc8, 0x43, 0x5a, 0x37, 0xa0, 0xbc, 0x93, 0x4c, 0x32, 0xc4, 0x81,
+ 0xf5, 0x88, 0x49, 0xf2, 0x13, 0x5f, 0x57, 0x59, 0xc1, 0xc9, 0x95, 0xa1,
+ 0x19, 0x4d, 0x06, 0xb2, 0x4c, 0x3d, 0x54, 0x41, 0x96, 0x59, 0xbf, 0xf3,
+ 0x67, 0xb8, 0xb3, 0x49, 0x79, 0x89, 0x33, 0x21, 0x94, 0x3a, 0xf1, 0x3c,
+ 0x94, 0x1e, 0xa1, 0xf9, 0x3a, 0x07, 0x66, 0xdd, 0xf1, 0x9b, 0xf9, 0x9e,
+ 0x33, 0xce, 0xae, 0xb7, 0x8b, 0x59, 0x1a, 0x71, 0x7f, 0x8f, 0xc7, 0x8c,
+ 0x76, 0x79, 0x70, 0xe9, 0x76, 0xff, 0xa7, 0x42, 0x2d, 0xd9, 0x70, 0xa7,
+ 0x42, 0x3c, 0xe0, 0xcf, 0xe5, 0x4f, 0xd8, 0xdf, 0x0e, 0xeb, 0x7c, 0x65,
+ 0x38, 0x67, 0xdb, 0x3e, 0xdc, 0x00, 0x25, 0xe1, 0xcd, 0x4e, 0x48, 0x6c,
+ 0x19, 0x46, 0xb4, 0x57, 0xf0, 0xad, 0x0b, 0xd2, 0x31, 0x9e, 0x3f, 0xb9,
+ 0x54, 0xdb, 0xdc, 0xd4, 0xae, 0x7f, 0x55, 0xee, 0xb0, 0x9b, 0x42, 0xa8,
+ 0x36, 0xac, 0x90, 0xcb, 0xbb, 0x78, 0x49, 0xb0, 0xdf, 0x8b, 0x5a, 0xf5,
+ 0x59, 0x00, 0x18, 0x57, 0x38, 0x79, 0xaf, 0xb2, 0x78, 0x68, 0x1c, 0x32,
+ 0x44, 0xa0, 0xa1, 0x2a, 0xc9, 0x9e, 0x3c, 0xe2, 0x83, 0x9c, 0xe6, 0x2f,
+ 0x67, 0x32, 0x64, 0xe4, 0x21, 0xed, 0x37, 0xd8, 0x6d, 0x74, 0x1e, 0xfc,
+ 0x33, 0xc9, 0x6e, 0x9e, 0x3d, 0x09, 0xeb, 0x93, 0x68, 0xeb, 0xd4, 0xde,
+ 0x39, 0x8d, 0x7b, 0xd7, 0xf3, 0x37, 0xd8, 0xd9, 0x0f, 0xb5, 0x23, 0x96,
+ 0x5f, 0x3c, 0x2b, 0x14, 0x8d, 0xbb, 0x51, 0x1f, 0x7f, 0xba, 0xb6, 0x13,
+ 0x54, 0x77, 0xb3, 0xcb, 0x18, 0xa0, 0xdc, 0xa4, 0x26, 0x16, 0x84, 0xbe,
+ 0xa8, 0x64, 0x13, 0x4f, 0x2e, 0xfe, 0xd4, 0x12, 0x36, 0x97, 0xf3, 0xb9,
+ 0xe0, 0x50, 0xe1, 0xf2, 0xbd, 0xdb, 0x29, 0xeb, 0x8d, 0x81, 0x4b, 0x40,
+ 0xfb, 0x56, 0x39, 0x65, 0x8a, 0x20, 0x7e, 0x64, 0x47, 0x5d, 0x8d, 0x60,
+ 0xfb, 0xd4, 0x0b, 0xa7, 0x7b, 0xe7, 0x25, 0xb4, 0x0b, 0xef, 0x6d, 0xbc,
+ 0x4b, 0xdb, 0xa2, 0xb4, 0x4e, 0x4f, 0x5d, 0x0f, 0xe4, 0xe0, 0xc1, 0xdb,
+ 0x28, 0x5e, 0x63, 0x75, 0xb0, 0x37, 0x43, 0x96, 0x1d, 0x9f, 0x4e, 0xf0,
+ 0x09, 0xe1, 0x14, 0x9f, 0xab, 0x12, 0xfd, 0x4c, 0x26, 0x23, 0xb3, 0xf3,
+ 0xe9, 0xfd, 0x34, 0x6a, 0x87, 0xed, 0x6d, 0x43, 0x47, 0x31, 0x59, 0x8d,
+ 0xa4, 0xfc, 0x85, 0xe6, 0x25, 0xf1, 0xf1, 0xfd, 0xae, 0xe7, 0xd7, 0x3a,
+ 0x1d, 0x86, 0x1d, 0x45, 0xef, 0x18, 0x82, 0x2d, 0xc7, 0xb1, 0xdf, 0xe1,
+ 0x11, 0xec, 0xe5, 0x55, 0xbe, 0xb0, 0x63, 0xba, 0xde, 0xc2, 0x3b, 0xaa,
+ 0x30, 0xcb, 0x4b, 0xaf, 0x62, 0x0a, 0x22, 0x8d, 0x14, 0x63, 0xdc, 0x86,
+ 0x3b, 0xac, 0x45, 0xca, 0xd4, 0x4e, 0x60, 0x40, 0xcb, 0xd8, 0xfb, 0xda,
+ 0x88, 0xd3, 0x31, 0x37, 0xec, 0x71, 0xbf, 0x44, 0x2d, 0x1e, 0x1d, 0x33,
+ 0x62, 0x0d, 0x3e, 0xf6, 0x34, 0x9f, 0x9d, 0x15, 0xe4, 0x2b, 0x03, 0x0c,
+ 0xd1, 0x52, 0xd4, 0xf9, 0xd5, 0x4b, 0x54, 0xf6, 0x6d, 0x04, 0x94, 0xcf,
+ 0xeb, 0xf3, 0x31, 0xb9, 0xb9, 0x40, 0x3c, 0xd8, 0x23, 0xa0, 0xc3, 0x2f,
+ 0x0d, 0xa3, 0x86, 0x84, 0x88, 0x74, 0xd5, 0x04, 0xc4, 0x19, 0xac, 0x2e,
+ 0xa2, 0x3f, 0xcc, 0xbf, 0xaa, 0xe1, 0x29, 0xb0, 0x1f, 0x74, 0x9d, 0x1d,
+ 0xee, 0xbd, 0x2b, 0x31, 0xc4, 0xdd, 0x71, 0xf1, 0xd7, 0x13, 0x1e, 0xcd,
+ 0xcf, 0x0f, 0x97, 0x5c, 0xbb, 0x61, 0xd5, 0xa3, 0x45, 0x6f, 0x91, 0xcf,
+ 0x73, 0x4a, 0x43, 0x8d, 0xcc, 0xbf, 0xcf, 0x16, 0x15, 0xa2, 0x60, 0xe4,
+ 0xfe, 0x0f, 0x2c, 0xf1, 0x6b, 0xb5, 0x59, 0x02, 0xf4, 0x99, 0x4d, 0x55,
+ 0x1a, 0x33, 0x8e, 0xe5, 0xe0, 0x95, 0x08, 0x41, 0xcf, 0x72, 0x01, 0x57,
+ 0x3e, 0x4a, 0xa0, 0xd9, 0x71, 0xfe, 0xe9, 0x9e, 0x4b, 0x70, 0xfd, 0x7b,
+ 0x67, 0x29, 0x96, 0x9d, 0xed, 0x7f, 0xc8, 0x06, 0x60, 0xa3, 0xe4, 0x34,
+ 0x17, 0xde, 0xe8, 0xa3, 0xf0, 0xfe, 0x0d, 0xa3, 0x69, 0xd3, 0x73, 0x82,
+ 0x49, 0x3a, 0xcb, 0xdb, 0x36, 0x30, 0xed, 0x2a, 0xfd, 0x3f, 0xd7, 0xb7,
+ 0x6e, 0xf8, 0xe2, 0x14, 0xf7, 0xb7, 0xf8, 0x0f, 0x32, 0xdd, 0x8e, 0x8e,
+ 0xe1, 0x5c, 0x5e, 0x6a, 0x06, 0xd7, 0xef, 0x21, 0xf5, 0xc3, 0xf5, 0x79,
+ 0x0b, 0x12, 0xf7, 0x1b, 0x89, 0x7e, 0x6d, 0x57, 0x10, 0x3e, 0x6e, 0x74,
+ 0x88, 0xe6, 0xfd, 0x72, 0x20, 0xc3, 0x83, 0xd1, 0x2e, 0xb7, 0xb8, 0xbb,
+ 0xc8, 0x75, 0x81, 0x14, 0x46, 0x1d, 0xee, 0x36, 0x6c, 0x0b, 0xe1, 0x0d,
+ 0x15, 0xec, 0x0d, 0x5d, 0x30, 0x08, 0xbc, 0x42, 0xde, 0xa8, 0x64, 0x1b,
+ 0x3d, 0xbf, 0xe7, 0x14, 0x2a, 0x83, 0x90, 0x5e, 0x48, 0xfd, 0x96, 0x70,
+ 0x36, 0x2d, 0xa4, 0xeb, 0x28, 0xe7, 0x70, 0xe4, 0xfe, 0xb9, 0xed, 0x40,
+ 0xbc, 0x29, 0x34, 0x79, 0xec, 0x19, 0x79, 0xa1, 0xf3, 0x9d, 0x49, 0x8a,
+ 0xf0, 0x2d, 0x2b, 0x02, 0xd9, 0x50, 0x9e, 0xa7, 0xf4, 0xf8, 0x61, 0xad,
+ 0x79, 0xe0, 0x46, 0xe4, 0xe3, 0x78, 0x3c, 0x57, 0x9b, 0x56, 0xb6, 0x14,
+ 0xa8, 0x2f, 0xf8, 0xca, 0x5f, 0x1e, 0xd8, 0xa6, 0x9c, 0x2c, 0x2d, 0x14,
+ 0xf9, 0xff, 0x98, 0x1c, 0xef, 0x10, 0xe9, 0x75, 0x2e, 0x27, 0xde, 0x78,
+ 0x8a, 0xe0, 0x7b, 0xba, 0xa5, 0x97, 0x77, 0x2a, 0x20, 0xcb, 0xc2, 0x53,
+ 0x2e, 0x8b, 0x34, 0xbd, 0x28, 0xba, 0x57, 0xed, 0x10, 0xc1, 0xfd, 0x87,
+ 0x7c, 0x0e, 0x15, 0x63, 0x84, 0xb6, 0x54, 0xfb, 0x81, 0x05, 0xa5, 0x3c,
+ 0x0f, 0x63, 0x48, 0xbb, 0x54, 0x03, 0x7e, 0x2b, 0x2e, 0x9d, 0xfb, 0xcf,
+ 0x86, 0xd7, 0x04, 0xf7, 0x28, 0x84, 0x96, 0x5a, 0x6f, 0x8e, 0x6f, 0x1d,
+ 0x86, 0x2c, 0xf0, 0xe5, 0x33, 0xfd, 0x5d, 0xb3, 0xc3, 0xbf, 0xf7, 0x81,
+ 0x34, 0x33, 0x5c, 0x72, 0xa7, 0x7f, 0xf0, 0x5d, 0x88, 0x19, 0x2f, 0xbc,
+ 0xc4, 0x1c, 0xc5, 0xd3, 0xc2, 0x4d, 0xf9, 0xa5, 0x68, 0x94, 0x50, 0x97,
+ 0xb5, 0x54, 0x7d, 0xa2, 0xd0, 0x8c, 0xc0, 0xcf, 0x03, 0xd1, 0x93, 0x64,
+ 0xaf, 0xf1, 0x6b, 0xb5, 0xd3, 0x7e, 0x08, 0xb1, 0x44, 0x45, 0x84, 0x74,
+ 0xb8, 0x14, 0x9d, 0xc0, 0x63, 0x1c, 0x7b, 0xbc, 0x78, 0x43, 0x83, 0x1a,
+ 0xb2, 0xdc, 0x61, 0x9a, 0xbe, 0x22, 0xa5, 0x6f, 0x00, 0xb1, 0x99, 0x94,
+ 0x18, 0xf9, 0xbb, 0xd2, 0xb9, 0x6e, 0x1b, 0xb6, 0x2d, 0x36, 0x8d, 0xd3,
+ 0x68, 0xf6, 0x77, 0x32, 0xbd, 0x39, 0x6a, 0xb3, 0x12, 0x1d, 0x58, 0x2c,
+ 0x8a, 0x8e, 0x5b, 0x97, 0x09, 0x85, 0x92, 0x7e, 0xca, 0x42, 0xdc, 0x24,
+ 0x8a, 0x8b, 0x40, 0xbd, 0x66, 0x42, 0x5d, 0xa2, 0x21, 0x44, 0xdd, 0x93,
+ 0x8b, 0x43, 0xd6, 0xa6, 0x4b, 0x38, 0xe3, 0x0d, 0x3a, 0x69, 0x0d, 0xd9,
+ 0xac, 0x3f, 0xde, 0xe7, 0x48, 0x45, 0x29, 0xd6, 0x64, 0x3a, 0x86, 0x55,
+ 0xb4, 0x01, 0x1e, 0xa1, 0x2c, 0xff, 0xdb, 0x8f, 0x40, 0xde, 0xc0, 0xef,
+ 0x18, 0xc4, 0x57, 0x96, 0x35, 0xbe, 0xe2, 0x21, 0x3e, 0xde, 0x88, 0x33,
+ 0xd5, 0x68, 0x24, 0x07, 0xb0, 0x6c, 0xa2, 0xe7, 0xef, 0xff, 0xc6, 0x95,
+ 0x16, 0x85, 0x26, 0xc2, 0xf0, 0xe7, 0x59, 0x94, 0xbc, 0x02, 0x0d, 0x90,
+ 0x56, 0x67, 0x1a, 0x19, 0x9a, 0x1f, 0xf1, 0x4c, 0xdb, 0x96, 0xfd, 0xa3,
+ 0x6f, 0x87, 0x0e, 0xa0, 0xf7, 0x27, 0x95, 0x3a, 0x41, 0x5e, 0x84, 0x18,
+ 0x97, 0x0e, 0x0c, 0xb1, 0x7e, 0x0c, 0x72, 0xbd, 0xe4, 0x16, 0x6b, 0x3d,
+ 0x9f, 0x35, 0x11, 0xa3, 0x23, 0x22, 0x92, 0x93, 0x64, 0x1b, 0x38, 0x5e,
+ 0xb8, 0x20, 0x37, 0xa5, 0x79, 0x93, 0xfc, 0xa9, 0xc2, 0x8d, 0x76, 0xc5,
+ 0xa5, 0x7d, 0x03, 0xf4, 0x65, 0x6e, 0x04, 0xf1, 0x17, 0xc3, 0x24, 0xfa,
+ 0xc1, 0x64, 0xc2, 0xa6, 0xc1, 0x1f, 0x91, 0xc5, 0x16, 0x0c, 0xd4, 0x13,
+ 0x5e, 0xb9, 0x39, 0x3b, 0xe0, 0xf2, 0xc1, 0xe0, 0xa4, 0xa7, 0xcf, 0x33,
+ 0xcd, 0xbc, 0x22, 0xa2, 0x00, 0x35, 0x13, 0x55, 0x37, 0xda, 0x3a, 0x6f,
+ 0x9f, 0x93, 0xb2, 0xa2, 0xa5, 0x33, 0x95, 0x96, 0x1b, 0x6f, 0xfe, 0x0e,
+ 0x57, 0xd6, 0x57, 0xbd, 0x21, 0x82, 0xb0, 0x43, 0x58, 0x80, 0xd1, 0xc6,
+ 0x45, 0x66, 0x7a, 0x67, 0xde, 0xdd, 0x68, 0x79, 0x1a, 0x9c, 0x3d, 0x4e,
+ 0xd3, 0x26, 0x79, 0x0a, 0xcc, 0x36, 0x8d, 0x5a, 0xbf, 0x91, 0x69, 0x21,
+ 0xe1, 0xd6, 0xd6, 0xcf, 0x52, 0x0d, 0x56, 0xc8, 0x35, 0x1f, 0x19, 0x71,
+ 0xde, 0xc8, 0x73, 0x8e, 0x31, 0xf5, 0x1d, 0xf5, 0x63, 0x31, 0x66, 0xcf,
+ 0xb2, 0x60, 0xbf, 0x03, 0x39, 0x40, 0xa4, 0xb7, 0x2a, 0x03, 0x58, 0x78,
+ 0xd8, 0x33, 0x80, 0x6e, 0xbd, 0xf2, 0xf2, 0xaf, 0x88, 0x29, 0xa3, 0x07,
+ 0xc1, 0x20, 0xfe, 0xc8, 0x75, 0x25, 0xe6, 0x52, 0xe9, 0x57, 0x6c, 0x7b,
+ 0x16, 0xcf, 0x2c, 0x61, 0xf9, 0x3a, 0xa8, 0xa2, 0x67, 0x62, 0x9c, 0x7c,
+ 0xd1, 0xf4, 0xab, 0x54, 0x8c, 0xbb, 0x0d, 0x92, 0xde, 0x05, 0x54, 0x1a,
+ 0x5b, 0x84, 0x75, 0x2f, 0x30, 0x2a, 0x30, 0x50, 0xdb, 0x42, 0xb7, 0xfe,
+ 0xff, 0x18, 0x9b, 0xbd, 0x70, 0x2f, 0x47, 0x34, 0x44, 0x34, 0x58, 0x43,
+ 0x0c, 0x29, 0xea, 0xc6, 0xbd, 0x1c, 0xfd, 0xf6, 0x6e, 0x3c, 0xe2, 0x21,
+ 0x55, 0xc3, 0x1f, 0x82, 0x25, 0xd2, 0x5d, 0x4e, 0x81, 0x8f, 0xaa, 0x6d,
+ 0x92, 0x64, 0x90, 0x72, 0xbe, 0x03, 0xda, 0xac, 0xd0, 0x1c, 0x66, 0xc2,
+ 0x50, 0xd3, 0xd8, 0xca, 0xe1, 0xe0, 0xe3, 0xfb, 0xc7, 0xa5, 0x59, 0x71,
+ 0x4f, 0xdc, 0x1b, 0x4f, 0xd0, 0x75, 0x57, 0x0b, 0x1f, 0x99, 0x45, 0x25,
+ 0x20, 0xf1, 0xd9, 0xe4, 0x55, 0x47, 0xd2, 0xc1, 0x13, 0x04, 0x56, 0xc4,
+ 0x37, 0x61, 0x27, 0xaa, 0xb2, 0xfb, 0x52, 0x73, 0xbf, 0xd8, 0x3e, 0x0d,
+ 0xf4, 0xe8, 0x19, 0x21, 0x13, 0x90, 0xfb, 0x93, 0xd4, 0x94, 0x5b, 0x0d,
+ 0x93, 0xc9, 0x00, 0xaa, 0xb9, 0x6f, 0x41, 0x5c, 0xcf, 0x9e, 0x27, 0x2a,
+ 0xf9, 0xb5, 0x09, 0xc9, 0xc3, 0xeb, 0x8b, 0x09, 0xce, 0x27, 0x54, 0x1d,
+ 0x41, 0x0c, 0x13, 0x17, 0xca, 0x2e, 0x90, 0xa4, 0xa1, 0x0d, 0xad, 0xa0,
+ 0x16, 0x7c, 0x57, 0x21, 0x91, 0x27, 0x07, 0xaf, 0x71, 0x96, 0x96, 0xa5,
+ 0x74, 0x51, 0x45, 0xc5, 0x07, 0xd4, 0x7d, 0xae, 0xb8, 0xf6, 0xe0, 0x95,
+ 0x70, 0xe7, 0xe4, 0xbb, 0x91, 0x6b, 0xe0, 0xa6, 0xbe, 0x9c, 0x26, 0x81,
+ 0x16, 0xbf, 0x80, 0xb9, 0x7c, 0x18, 0x34, 0x98, 0xab, 0x60, 0xa1, 0x7f,
+ 0x18, 0xcb, 0x29, 0xc6, 0xe4, 0x50, 0xe7, 0x20, 0x52, 0xc1, 0x43, 0xd0,
+ 0x9f, 0x10, 0x38, 0xf9, 0x3a, 0xf2, 0x56, 0xb1, 0x08, 0x4c, 0x2c, 0xac,
+ 0x07, 0xb3, 0xd6, 0x7e, 0xa8, 0x46, 0x1c, 0x71, 0x1f, 0x92, 0xf5, 0x6e,
+ 0x04, 0x3b, 0x56, 0xf2, 0x92, 0x8c, 0x59, 0xb6, 0x77, 0xb6, 0x9c, 0xdf,
+ 0xda, 0x41, 0xb4, 0x9e, 0x67, 0xb6, 0x51, 0xd8, 0xb6, 0x47, 0xbb, 0xfa,
+ 0x3e, 0xe9, 0xcf, 0x50, 0x63, 0xd3, 0x18, 0xa4, 0x32, 0x39, 0xda, 0xb1,
+ 0xf4, 0xae, 0xcd, 0xbc, 0x83, 0xe6, 0xcb, 0x45, 0xbc, 0xd2, 0xea, 0xcb,
+ 0xba, 0xb1, 0x34, 0x44, 0xea, 0x89, 0xed, 0xe0, 0x56, 0x51, 0xd9, 0x36,
+ 0x32, 0xcf, 0x65, 0xb0, 0x6b, 0xfa, 0x66, 0x45, 0x40, 0xed, 0x2c, 0x58,
+ 0x25, 0xf6, 0xdd, 0x9a, 0xd1, 0x92, 0xf3, 0x0b, 0xad, 0x78, 0x62, 0xbe,
+ 0x6b, 0x7f, 0xc5, 0x4f, 0x3e, 0x98, 0x23, 0x86, 0x77, 0xb3, 0x9f, 0xe3,
+ 0x88, 0xcd, 0xab, 0x9b, 0x2e, 0x3c, 0x55, 0x72, 0x57, 0xe6, 0x03, 0x23,
+ 0x30, 0x34, 0x0c, 0x62, 0xda, 0x30, 0xc6, 0xfb, 0xad, 0xf6, 0x19, 0x7b,
+ 0xde, 0x63, 0xbe, 0x34, 0x1e, 0xd1, 0x27, 0x9b, 0x9f, 0xea, 0x90, 0x53,
+ 0x40, 0x0e, 0x9b, 0xef, 0x5b, 0xa5, 0x69, 0xde, 0xaf, 0x6b, 0x01, 0x8e,
+ 0x2c, 0xf1, 0xab, 0x0e, 0xe7, 0xaf, 0x59, 0xf0, 0xa3, 0x11, 0xb5, 0x00,
+ 0x7c, 0x8f, 0x5e, 0x02, 0x73, 0x1c, 0x88, 0x43, 0x68, 0x8d, 0xa3, 0x3a,
+ 0x36, 0x11, 0xdb, 0x26, 0x92, 0x25, 0x69, 0x7a, 0xa7, 0xed, 0xd0, 0xc3,
+ 0x3b, 0x05, 0xd3, 0x46, 0x22, 0x88, 0x21, 0xf3, 0xa1, 0x87, 0x6d, 0x87,
+ 0xdc, 0xed, 0x4c, 0xad, 0xac, 0xf1, 0xc1, 0x61, 0x70, 0xe8, 0xd2, 0x54,
+ 0x44, 0xb1, 0x49, 0xae, 0x25, 0xc9, 0x91, 0x46, 0xde, 0x89, 0x9a, 0x3a,
+ 0xcb, 0xfe, 0xb8, 0xaf, 0xcb, 0x39, 0x4e, 0x30, 0x87, 0xb7, 0x88, 0xcc,
+ 0xdd, 0x7e, 0x01, 0xa2, 0xad, 0x1b, 0x01, 0xd2, 0x6e, 0x47, 0xf6, 0xa5,
+ 0xfb, 0xf7, 0x73, 0x5f, 0x2c, 0x24, 0xd0, 0x9f, 0xe9, 0x8e, 0x49, 0xbb,
+ 0x85, 0x9d, 0x45, 0x8b, 0x63, 0xbb, 0x7a, 0x79, 0xd0, 0xfa, 0x85, 0xe9,
+ 0x4f, 0xad, 0xa2, 0x19, 0xd4, 0xfc, 0x24, 0x89, 0x44, 0x7d, 0x89, 0x33,
+ 0x34, 0x07, 0x25, 0x22, 0x90, 0x96, 0x45, 0x5e, 0x7e, 0xe3, 0x57, 0x3f,
+ 0x57, 0xd3, 0xc7, 0x60, 0xa1, 0x26, 0x14, 0xad, 0x19, 0x51, 0x39, 0x9d,
+ 0x70, 0x48, 0xf4, 0x8b, 0x06, 0xf1, 0xc7, 0x73, 0xe9, 0xe9, 0xca, 0xb0,
+ 0x7d, 0x7c, 0x8f, 0xf4, 0xda, 0x8e, 0x83, 0x99, 0x9d, 0x64, 0x65, 0x82,
+ 0xb3, 0xf1, 0x85, 0xd5, 0x64, 0xfe, 0xb0, 0x1e, 0x3d, 0x1a, 0x30, 0xfd,
+ 0xe1, 0x6b, 0xe1, 0x65, 0x26, 0x93, 0x53, 0x4d, 0x90, 0x7d, 0xe1, 0xc8,
+ 0xe8, 0x50, 0x24, 0x0f, 0x62, 0x73, 0x73, 0x1f, 0x5f, 0xce, 0x9b, 0x36,
+ 0xe9, 0x16, 0xf6, 0x78, 0x8e, 0x5d, 0x3e, 0x99, 0x79, 0x19, 0x36, 0x2f,
+ 0x96, 0x9a, 0x27, 0x34, 0x95, 0x2d, 0x28, 0x22, 0x0f, 0x30, 0x81, 0x49,
+ 0x49, 0xcd, 0x47, 0x24, 0xa5, 0xde, 0xd9, 0x3a, 0x31, 0x9b, 0xf6, 0x84,
+ 0x48, 0xda, 0x0f, 0xbb, 0x87, 0x59, 0xdc, 0xcc, 0x57, 0xf3, 0x02, 0x53,
+ 0xe6, 0xda, 0xfe, 0x97, 0x1e, 0xc7, 0xf8, 0x34, 0xf6, 0x3f, 0xf7, 0x4f,
+ 0x07, 0x5d, 0xe3, 0x77, 0x80, 0x85, 0xb5, 0xa7, 0xff, 0x60, 0x06, 0xd7,
+ 0xec, 0x67, 0xd3, 0x25, 0x31, 0xd9, 0x9b, 0x41, 0x24, 0x93, 0xdf, 0x68,
+ 0x1d, 0x95, 0x42, 0x39, 0x5d, 0xdc, 0xa8, 0x5c, 0x73, 0xfc, 0x08, 0x97,
+ 0x47, 0xa2, 0x0f, 0xc7, 0x1a, 0xc8, 0xea, 0x7e, 0x61, 0x44, 0x64, 0xd9,
+ 0xef, 0x43, 0x3c, 0x88, 0x83, 0x6b, 0x6f, 0x40, 0x70, 0xb1, 0xad, 0x13,
+ 0x3a, 0x8a, 0x80, 0xae, 0xe6, 0xfa, 0xc3, 0x71, 0x7d, 0xd7, 0x3d, 0xfd,
+ 0xdb, 0x36, 0x04, 0x62, 0x92, 0xc6, 0x70, 0x78, 0x49, 0xc3, 0x42, 0x96,
+ 0x94, 0xed, 0x64, 0xc0, 0xf1, 0x95, 0x05, 0x30, 0x4a, 0x1b, 0x13, 0x46,
+ 0x88, 0xf8, 0x3d, 0x51, 0xdd, 0x6a, 0xb9, 0xfa, 0xd7, 0xe2, 0xae, 0xcd,
+ 0xa6, 0x1f, 0x15, 0xef, 0xc7, 0x04, 0x9e, 0x7a, 0x46, 0x02, 0x3e, 0xc8,
+ 0x76, 0xad, 0x9c, 0xba, 0x04, 0xad, 0x58, 0x0c, 0x31, 0x53, 0x15, 0x79,
+ 0x57, 0x23, 0xc0, 0x14, 0xcd, 0x01, 0x78, 0x3f, 0xe8, 0x80, 0x77, 0x8a,
+ 0x57, 0x33, 0xa5, 0xc5, 0x2e, 0xa4, 0xa6, 0xae, 0xd2, 0x2c, 0x64, 0xbf,
+ 0x55, 0xf8, 0x59, 0xf5, 0x81, 0xa0, 0xf4, 0x66, 0x94, 0x25, 0x0f, 0xfb,
+ 0x6b, 0xb8, 0x52, 0x0d, 0xb6, 0x21, 0x08, 0xba, 0xa9, 0x93, 0xac, 0xd6,
+ 0x3b, 0x71, 0xe6, 0xaa, 0xd5, 0x27, 0x68, 0x82, 0xd1, 0x34, 0xdb, 0x80,
+ 0x69, 0x1c, 0x9b, 0x4b, 0xce, 0x9d, 0xa8, 0x5b, 0xc1, 0x62, 0x05, 0xf7,
+ 0xce, 0x87, 0x66, 0xf4, 0x13, 0x4b, 0xca, 0x75, 0x1e, 0x3f, 0xe6, 0x4b,
+ 0xaf, 0x40, 0xe7, 0xf4, 0x91, 0x64, 0x13, 0x60, 0x52, 0xd3, 0x43, 0x28,
+ 0xab, 0x23, 0xd2, 0x9c, 0x05, 0x34, 0x19, 0xf2, 0x53, 0xb7, 0x77, 0xa7,
+ 0x6f, 0x81, 0x36, 0x94, 0xd7, 0x31, 0x52, 0x89, 0x00, 0x6e, 0x08, 0x30,
+ 0x24, 0x38, 0xb3, 0x95, 0x86, 0xfe, 0x91, 0x1f, 0x47, 0xe4, 0x9e, 0xf6,
+ 0x3c, 0x18, 0xdd, 0x38, 0xde, 0x59, 0x6e, 0x6f, 0xc6, 0x2d, 0x3f, 0x81,
+ 0x49, 0x62, 0xfd, 0x2b, 0xe3, 0xab, 0x70, 0xa3, 0x85, 0xdc, 0x78, 0xad,
+ 0x97, 0xa7, 0x08, 0xd6, 0x91, 0x34, 0xb2, 0xe4, 0x12, 0x1c, 0xe3, 0x1e,
+ 0xba, 0xf8, 0x69, 0xbc, 0x07, 0x2c, 0x3b, 0x76, 0xa5, 0xda, 0xc7, 0x85,
+ 0x2f, 0xb0, 0xb7, 0xc3, 0xd8, 0x1a, 0x69, 0x03, 0x76, 0x14, 0x54, 0x88,
+ 0x94, 0x9e, 0xb5, 0x2e, 0xd7, 0x0c, 0x90, 0x92, 0x05, 0x19, 0x1e, 0x31,
+ 0xe7, 0x92, 0xf8, 0x00, 0x29, 0x59, 0x48, 0x68, 0x5a, 0x9f, 0xcd, 0xa6,
+ 0xde, 0x34, 0x23, 0xdf, 0x82, 0xe3, 0x82, 0x1b, 0x33, 0x65, 0x31, 0xa5,
+ 0x57, 0xa8, 0x15, 0x29, 0xcb, 0x6f, 0xab, 0x0c, 0x6b, 0x56, 0x5e, 0x29,
+ 0xf4, 0x20, 0xa3, 0x4e, 0x81, 0xcf, 0x7b, 0x70, 0x06, 0xba, 0x7c, 0x7c,
+ 0x3e, 0x8e, 0x36, 0x9e, 0x71, 0xaa, 0xa8, 0xc7, 0xfb, 0x39, 0xb0, 0x2e,
+ 0xfd, 0xef, 0x2c, 0x7a, 0x20, 0xea, 0xc8, 0x00, 0x62, 0x76, 0x9f, 0xc8,
+ 0x55, 0x3f, 0x6f, 0xd4, 0x0d, 0x15, 0xf8, 0xd2, 0xda, 0xc3, 0x47, 0x0e,
+ 0x9d, 0xa8, 0x4a, 0xe7, 0xff, 0x6a, 0xe7, 0x90, 0x49, 0xba, 0xc5, 0x12,
+ 0x01, 0x73, 0xaa, 0xbe, 0x90, 0xc2, 0x7c, 0xf5, 0xc6, 0xd5, 0x66, 0x2a,
+ 0x73, 0x7d, 0x05, 0x2a, 0xef, 0x2c, 0x50, 0x00, 0x6a, 0xa6, 0x82, 0x48,
+ 0x4f, 0x03, 0x5b, 0x80, 0x8a, 0x38, 0x5c, 0xeb, 0x81, 0xc3, 0x59, 0xf7,
+ 0x46, 0xd9, 0x87, 0x7b, 0xb7, 0x59, 0xe8, 0x00, 0xde, 0x6d, 0x0d, 0x7c,
+ 0x90, 0x78, 0x23, 0xb8, 0xb1, 0xa2, 0x67, 0x7c, 0x6f, 0xd8, 0xe9, 0x2e,
+ 0x6b, 0x94, 0xd7, 0xac, 0x10, 0x9b, 0xa4, 0x13, 0x27, 0xb8, 0x2b, 0x4e,
+ 0x73, 0x88, 0x38, 0x06, 0xa6, 0xa6, 0x67, 0x68, 0xbc, 0xd0, 0x85, 0xaa,
+ 0x14, 0xf9, 0x33, 0x7e, 0xff, 0x4a, 0x22, 0x67, 0x74, 0xfd, 0x64, 0x0c,
+ 0x83, 0xee, 0x9c, 0xa1, 0x0e, 0xe2, 0x9e, 0x68, 0xa8, 0x1e, 0x59, 0x2d,
+ 0x1e, 0x73, 0x37, 0xab, 0x6b, 0x21, 0x9d, 0x91, 0x9d, 0xce, 0x03, 0x30,
+ 0xbe, 0x0d, 0x32, 0x94, 0xa5, 0xf1, 0x28, 0xe1, 0x2f, 0x8b, 0xda, 0x43,
+ 0xf6, 0x2c, 0xf4, 0x2f, 0xd7, 0x1e, 0x9e, 0xa3, 0x09, 0xdb, 0xb3, 0x76,
+ 0xc0, 0xa1, 0xf1, 0x09, 0xc0, 0xaa, 0x77, 0xc4, 0x35, 0x89, 0xfe, 0xbd,
+ 0x84, 0x6f, 0x4c, 0x66, 0xcf, 0x5f, 0x08, 0x28, 0x16, 0xb1, 0x0d, 0xb7,
+ 0xc2, 0xc3, 0x19, 0xf2, 0x0e, 0x6a, 0xba, 0x42, 0x38, 0xdb, 0x13, 0xc2,
+ 0xf4, 0x73, 0xef, 0x80, 0x50, 0x2c, 0x9d, 0x39, 0xa3, 0x16, 0xd7, 0x5c,
+ 0x58, 0xae, 0x5b, 0xbc, 0x56, 0xf0, 0x79, 0x5c, 0xfe, 0xba, 0x1a, 0xc8,
+ 0x37, 0x07, 0x93, 0x06, 0xfe, 0x7c, 0xa4, 0xc3, 0xa4, 0xe5, 0x75, 0x74,
+ 0xbd, 0xe2, 0x62, 0x10, 0x25, 0xd9, 0xae, 0x71, 0x7c, 0x53, 0x67, 0xac,
+ 0x6a, 0x13, 0xec, 0x22, 0x40, 0x62, 0x40, 0xe7, 0xa4, 0xff, 0x6c, 0xd3,
+ 0x75, 0xee, 0x19, 0x52, 0xe4, 0xac, 0x7f, 0x07, 0x41, 0x58, 0x05, 0xb3,
+ 0xdd, 0xd4, 0xd0, 0xca, 0xd6, 0xe7, 0x3e, 0x57, 0x4f, 0x13, 0x7d, 0x20,
+ 0xbf, 0xcb, 0x39, 0xa0, 0x9e, 0xf8, 0x6d, 0x5b, 0x43, 0x6a, 0x79, 0xb9,
+ 0xdc, 0xd7, 0xb3, 0xf0, 0xd1, 0x17, 0x15, 0x01, 0xb2, 0xd4, 0x60, 0xaa,
+ 0x9c, 0x5f, 0xd2, 0xc2, 0xe7, 0x31, 0x07, 0xc5, 0x31, 0x12, 0xd8, 0x34,
+ 0x53, 0x1f, 0x53, 0x85, 0x4b, 0xd7, 0xbf, 0x87, 0x20, 0x86, 0x74, 0x45,
+ 0x77, 0x97, 0xa5, 0x95, 0xc0, 0xde, 0x7f, 0x09, 0xbd, 0x2d, 0x27, 0x17,
+ 0xb8, 0x37, 0xa7, 0xeb, 0xf0, 0xc4, 0x2f, 0xcb, 0x52, 0x8b, 0x39, 0x3f,
+ 0x56, 0x7a, 0x13, 0x30, 0x89, 0xd1, 0xc2, 0x92, 0x53, 0x82, 0x33, 0xef,
+ 0x64, 0xe2, 0xc9, 0x19, 0xfe, 0xdf, 0x8a, 0xf5, 0x60, 0x58, 0x25, 0x98,
+ 0xad, 0xfb, 0xb6, 0xaf, 0x63, 0xc4, 0xe4, 0xd0, 0xe1, 0xf1, 0x82, 0x81,
+ 0x82, 0x8b, 0x87, 0xce, 0x2c, 0xd1, 0x0a, 0xaa, 0x78, 0x88, 0x21, 0x06,
+ 0x44, 0x78, 0xae, 0x16, 0x90, 0xb6, 0xfb, 0x58, 0x85, 0x3a, 0x7d, 0xb3,
+ 0x6c, 0xe9, 0x1d, 0x5f, 0x96, 0x42, 0xcc, 0xea, 0x58, 0x26, 0x37, 0x67,
+ 0x5d, 0x85, 0x09, 0x66, 0x23, 0x9c, 0x26, 0xeb, 0x25, 0x88, 0xae, 0x79,
+ 0xa5, 0x87, 0x3e, 0xad, 0x9c, 0xda, 0x06, 0x1d, 0xc5, 0xba, 0x24, 0xe1,
+ 0x42, 0x0a, 0xae, 0xc0, 0x41, 0xd5, 0xf2, 0x55, 0x4f, 0xdb, 0x96, 0x37,
+ 0xb7, 0xac, 0x8c, 0xc6, 0x74, 0x3a, 0xc5, 0x09, 0x60, 0x2e, 0xe0, 0xe2,
+ 0x39, 0x4c, 0x9d, 0x81, 0x11, 0x40, 0xf1, 0x8a, 0x23, 0x3d, 0xb0, 0x6c,
+ 0x0c, 0xfe, 0x2e, 0x11, 0x84, 0x14, 0x2e, 0xbb, 0x8d, 0x19, 0x6b, 0x20,
+ 0xbf, 0xb9, 0x6f, 0xcd, 0x01, 0xea, 0xe8, 0x36, 0x7a, 0x3c, 0xfc, 0xb3,
+ 0x2c, 0x7d, 0x07, 0x96, 0x29, 0x14, 0x62, 0x23, 0x08, 0x8f, 0x62, 0x90,
+ 0x0f, 0x60, 0x58, 0xe8, 0x81, 0x3d, 0xe0, 0x74, 0x62, 0x8d, 0x84, 0x31,
+ 0x45, 0xce, 0xc6, 0x79, 0x11, 0x5c, 0xf0, 0x04, 0x95, 0x0b, 0x7d, 0xf4,
+ 0x32, 0xcf, 0x85, 0x83, 0x37, 0x1d, 0x7a, 0x64, 0x9a, 0x7c, 0x7b, 0x79,
+ 0x9d, 0x2d, 0x54, 0xd9, 0x5c, 0x9a, 0xed, 0x1d, 0xa6, 0x4d, 0x35, 0x22,
+ 0x36, 0x84, 0xa4, 0x3a, 0x7e, 0x3e, 0x38, 0xca, 0x8b, 0x5d, 0x1d, 0xab,
+ 0x84, 0x2f, 0x00, 0xa6, 0x4b, 0xce, 0xb3, 0x85, 0x7e, 0x17, 0xdc, 0xa9,
+ 0xcc, 0x42, 0xbf, 0x5a, 0x25, 0x69, 0xf5, 0xed, 0xd3, 0x73, 0xfd, 0xf7,
+ 0x56, 0x24, 0x10, 0xbd, 0xcc, 0xe0, 0xdb, 0xe1, 0x32, 0xac, 0x66, 0xcf,
+ 0x69, 0x2c, 0x02, 0x1b, 0x2d, 0x99, 0x66, 0xf1, 0x57, 0xcb, 0x8d, 0x74,
+ 0xa7, 0xa0, 0x05, 0x8e, 0x57, 0x0d, 0xc7, 0xce, 0xce, 0xcf, 0xcc, 0x20,
+ 0xc4, 0x87, 0x42, 0x91, 0xa7, 0x86, 0xdf, 0xbb, 0xe6, 0x56, 0x7a, 0x59,
+ 0xa6, 0x60, 0xe1, 0xfd, 0x73, 0x68, 0x97, 0xf8, 0x40, 0xc9, 0x16, 0xca,
+ 0xb5, 0xa8, 0xbe, 0x37, 0xb0, 0x84, 0x2e, 0x1a, 0xf3, 0x6f, 0x76, 0x06,
+ 0x6a, 0x44, 0xe4, 0xad, 0x23, 0xb5, 0x9c, 0xc6, 0xf2, 0xff, 0xdd, 0xf4,
+ 0xf8, 0xeb, 0x89, 0x7f, 0xf9, 0xc8, 0x87, 0x99, 0x5f, 0x7c, 0x93, 0x86,
+ 0xb6, 0xe1, 0xaf, 0x7b, 0xa2, 0x1a, 0xde, 0x9d, 0x34, 0xe1, 0x73, 0x24,
+ 0x1b, 0xb0, 0x35, 0xb4, 0x3f, 0xb7, 0x61, 0x0a, 0x20, 0x1e, 0xec, 0x2a,
+ 0x4f, 0x06, 0x6b, 0x53, 0x41, 0xd9, 0x5f, 0x69, 0x46, 0xfa, 0x5f, 0x57,
+ 0xd2, 0xfb, 0x75, 0x32, 0xfb, 0xa0, 0x91, 0x8d, 0x05, 0x8f, 0xfe, 0x86,
+ 0x4d, 0x90, 0xa8, 0x74, 0x5a, 0x71, 0x95, 0xd2, 0x13, 0xeb, 0xcf, 0x05,
+ 0xe6, 0x38, 0x6b, 0x89, 0xb4, 0x08, 0xc0, 0x16, 0x95, 0xe9, 0xe9, 0x2f,
+ 0x36, 0x87, 0x3a, 0xb4, 0x42, 0xc4, 0x68, 0x49, 0x65, 0x3a, 0x94, 0xea,
+ 0xa6, 0x63, 0x08, 0x22, 0xf7, 0xa4, 0x4c, 0x81, 0x0b, 0x04, 0xe5, 0xda,
+ 0x5e, 0x28, 0xd6, 0xa3, 0x08, 0x37, 0x59, 0x03, 0xdd, 0x0d, 0xfa, 0x70,
+ 0xb3, 0x77, 0xc9, 0xc2, 0xc6, 0xf6, 0x8c, 0x2d, 0x26, 0x31, 0xec, 0x2c,
+ 0xf1, 0x2d, 0x05, 0xaa, 0x32, 0x2a, 0xe9, 0xb9, 0xc2, 0xd0, 0x82, 0x61,
+ 0x1e, 0xcf, 0xa4, 0x3c, 0x12, 0x16, 0xf0, 0x4d, 0x66, 0xa0, 0x2b, 0xa1,
+ 0xa6, 0x0c, 0xe9, 0x32, 0xce, 0xae, 0x90, 0x7a, 0xf0, 0x74, 0x99, 0x82,
+ 0xc6, 0x39, 0xdb, 0x9b, 0x75, 0xe2, 0xd3, 0x56, 0x36, 0xc0, 0x1d, 0x19,
+ 0xd6, 0x31, 0x10, 0xca, 0xaa, 0xb4, 0x1e, 0x13, 0x63, 0x69, 0xe8, 0xe4,
+ 0xf8, 0x5d, 0x13, 0x7e, 0xa9, 0x5e, 0x64, 0x79, 0x58, 0xc6, 0xf6, 0xc9,
+ 0x1b, 0x50, 0xc6, 0xd5, 0x96, 0xaa, 0x06, 0xd5, 0x90, 0xbd, 0xa9, 0xf3,
+ 0x8a, 0xed, 0x58, 0x78, 0xba, 0x9f, 0x8b, 0x3d, 0x46, 0x6f, 0x55, 0x1d,
+ 0xf9, 0x14, 0x7d, 0x7b, 0xdd, 0x03, 0x78, 0x9d, 0x06, 0x7d, 0xaf, 0x1b,
+ 0x49, 0xa0, 0x82, 0xb3, 0xeb, 0x2f, 0x81, 0x8a, 0x08, 0x8b, 0xbc, 0xce,
+ 0xf5, 0x26, 0xe8, 0x7e, 0xb9, 0xe9, 0x28, 0x57, 0x76, 0x01, 0x61, 0xca,
+ 0x5f, 0xa9, 0x30, 0x7f, 0xa5, 0x16, 0x7f, 0x24, 0xdf, 0x78, 0xf5, 0xc2,
+ 0xd5, 0x91, 0x39, 0x82, 0x7e, 0x8a, 0x6d, 0x5b, 0x88, 0x97, 0xce, 0x9a,
+ 0xf0, 0x8e, 0x0f, 0xce, 0x12, 0x68, 0x60, 0x2a, 0x9b, 0x39, 0x85, 0xdf,
+ 0x39, 0x19, 0x24, 0xe6, 0x46, 0x59, 0xe3, 0x17, 0xb1, 0x8d, 0xec, 0x97,
+ 0x7e, 0x95, 0x0c, 0xfb, 0x48, 0xe5, 0xab, 0xf4, 0xef, 0xc6, 0x63, 0x4f,
+ 0xa3, 0x5e, 0x92, 0x52, 0x2d, 0x23, 0x3e, 0x7c, 0x5e, 0x57, 0xe1, 0x56,
+ 0x26, 0xce, 0xd6, 0xfe, 0x2a, 0xec, 0xec, 0x47, 0xc7, 0x80, 0x4b, 0x83,
+ 0xee, 0xf6, 0x43, 0x06, 0x9a, 0xf8, 0x6b, 0x82, 0x50, 0x0c, 0x03, 0x5d,
+ 0x4d, 0x30, 0x09, 0x00, 0x24, 0x3d, 0x85, 0x39, 0x5d, 0x05, 0x59, 0x28,
+ 0x72, 0x38, 0xea, 0x56, 0xc9, 0xb8, 0xfc, 0xf8, 0x52, 0xfa, 0x3c, 0x0a,
+ 0x1f, 0x5e, 0xad, 0x91, 0xf2, 0xf4, 0x90, 0xb4, 0xc2, 0xb3, 0x4d, 0xdb,
+ 0xef, 0x64, 0xba, 0x89, 0x72, 0x10, 0x0a, 0xa4, 0x84, 0xff, 0x88, 0x38,
+ 0xab, 0x0f, 0x1b, 0x73, 0xfc, 0x3e, 0x92, 0x48, 0x5a, 0xee, 0x70, 0xcb,
+ 0x80, 0x82, 0x88, 0xb0, 0xfa, 0x85, 0xcd, 0xb7, 0xcc, 0x84, 0x25, 0x3f,
+ 0x99, 0x5f, 0xdb, 0xf4, 0x4d, 0x8f, 0x0e, 0x31, 0x96, 0xf9, 0xab, 0x2b,
+ 0x22, 0xdf, 0xcf, 0x5a, 0x81, 0x50, 0x84, 0x0d, 0xc4, 0xde, 0x90, 0xc4,
+ 0x1a, 0x2f, 0xe0, 0x59, 0x1f, 0x39, 0x1b, 0x56, 0x4f, 0x77, 0x26, 0xf3,
+ 0xcb, 0x96, 0xf7, 0x0b, 0x39, 0x23, 0xe0, 0x2c, 0x1c, 0x0a, 0x03, 0x58,
+ 0xd0, 0xd8, 0x7a, 0xce, 0x24, 0xb5, 0x08, 0x95, 0x43, 0x58, 0xbe, 0x37,
+ 0x83, 0xc2, 0x7a, 0xf3, 0xe2, 0x68, 0xd3, 0x29, 0x61, 0xc9, 0xf6, 0x68,
+ 0xc4, 0x9c, 0x13, 0x04, 0xf0, 0xb5, 0x72, 0x8a, 0xdd, 0x50, 0xdf, 0xdf,
+ 0xe5, 0x09, 0x65, 0x61, 0x14, 0x98, 0x91, 0x1b, 0xc8, 0xcc, 0x7c, 0xa3,
+ 0x5d, 0x05, 0x64, 0x13, 0x46, 0xac, 0xdb, 0x64, 0x01, 0x59, 0x84, 0x2b,
+ 0x77, 0xc7, 0xb1, 0xab, 0x0a, 0x09, 0x8a, 0x4c, 0x7d, 0xee, 0x92, 0x44,
+ 0x36, 0x4d, 0xe5, 0xcb, 0x20, 0x39, 0x3b, 0x23, 0xfd, 0xf3, 0x5c, 0x09,
+ 0x30, 0xff, 0x19, 0xaf, 0xe3, 0xe8, 0x46, 0x46, 0x02, 0x62, 0x81, 0x41,
+ 0x3c, 0xd6, 0x23, 0xa0, 0x66, 0x7b, 0x09, 0xed, 0xe4, 0xbe, 0x11, 0x57,
+ 0x4f, 0xb7, 0xbb, 0x72, 0xc9, 0x31, 0x8c, 0xdd, 0x98, 0x1e, 0x60, 0x87,
+ 0xae, 0x49, 0x61, 0x71, 0x17, 0x79, 0xeb, 0x08, 0x64, 0x06, 0x4f, 0x88,
+ 0x55, 0xa6, 0x65, 0xe5, 0x02, 0x64, 0x4a, 0x26, 0xc2, 0x60, 0x07, 0xfb,
+ 0xba, 0x82, 0xad, 0x6e, 0xc1, 0xb2, 0x87, 0xb2, 0xb0, 0x87, 0x43, 0x3d,
+ 0x94, 0xb1, 0xa1, 0xd0, 0xc7, 0xeb, 0xa0, 0xad, 0x02, 0x07, 0x3f, 0x76,
+ 0x99, 0xbc, 0x7d, 0x8c, 0xec, 0x8a, 0x95, 0x5b, 0x84, 0xce, 0xd9, 0x10,
+ 0x0d, 0xec, 0x2d, 0x2e, 0xc3, 0xf6, 0xb3, 0xd3, 0x27, 0xbf, 0x0e, 0x5d,
+ 0x57, 0xf1, 0x7f, 0xeb, 0x86, 0xd3, 0x96, 0xce, 0xde, 0x48, 0xf8, 0xf7,
+ 0xa5, 0x08, 0x22, 0x5b, 0xf5, 0x9d, 0xd5, 0xb4, 0x18, 0x43, 0x40, 0x12,
+ 0x40, 0x61, 0xa9, 0xcc, 0xe2, 0x6e, 0x22, 0x0f, 0x57, 0x2d, 0x56, 0x8d,
+ 0x46, 0xac, 0x93, 0x12, 0xb9, 0xaa, 0x3e, 0x76, 0x87, 0xcf, 0x14, 0x2d,
+ 0x5a, 0x6a, 0x9a, 0x96, 0x3c, 0x88, 0x34, 0x46, 0x03, 0xa0, 0xe4, 0x1e,
+ 0x36, 0x59, 0x3e, 0x04, 0xa9, 0xff, 0xb9, 0x08, 0x55, 0xa7, 0x9b, 0x76,
+ 0x9c, 0xdc, 0x8b, 0xf0, 0x58, 0x76, 0x88, 0x6c, 0xca, 0xc0, 0x39, 0x8a,
+ 0x17, 0x29, 0xf6, 0xcb, 0xa3, 0xd6, 0x1f, 0xb6, 0x91, 0xee, 0xaa, 0xe6,
+ 0xc3, 0x8a, 0x2b, 0x54, 0xd1, 0x47, 0x67, 0x2f, 0x7b, 0x1d, 0xfd, 0xb3,
+ 0xba, 0xb9, 0x44, 0xc9, 0x41, 0xcd, 0x43, 0x49, 0x3f, 0xb3, 0x6b, 0x17,
+ 0xb6, 0x13, 0xae, 0x31, 0x94, 0x37, 0x08, 0x32, 0xf6, 0x3c, 0xcb, 0x3c,
+ 0xe4, 0xf5, 0xa7, 0x2d, 0x86, 0x32, 0x5e, 0x85, 0x82, 0x85, 0x43, 0x9b,
+ 0x35, 0xe6, 0xd5, 0x0f, 0x15, 0x9f, 0xc3, 0x28, 0xd5, 0x36, 0x41, 0x5b,
+ 0x7e, 0x14, 0x08, 0x96, 0x20, 0x6d, 0x18, 0x92, 0xdf, 0xf4, 0xca, 0x26,
+ 0x33, 0xa9, 0x2f, 0xd2, 0xc9, 0xaf, 0xc5, 0xf1, 0xc1, 0x05, 0x82, 0x79,
+ 0x3a, 0x92, 0xd6, 0x0c, 0xcf, 0xc0, 0xb0, 0xe1, 0xb0, 0x05, 0xf2, 0xe2,
+ 0x2c, 0x27, 0xe7, 0x6b, 0x43, 0x0f, 0x7a, 0x22, 0xc9, 0x62, 0xda, 0x61,
+ 0xce, 0xde, 0x15, 0xb5, 0x7c, 0x2b, 0x08, 0x7e, 0x2e, 0xed, 0xf5, 0xff,
+ 0x9c, 0xa6, 0xaf, 0x56, 0xb9, 0xc2, 0x36, 0xd8, 0x4c, 0x83, 0xcb, 0xeb,
+ 0xe1, 0x7f, 0x3a, 0xd7, 0xf7, 0x37, 0xf2, 0x30, 0xa7, 0x38, 0xd2, 0x07,
+ 0xd4, 0x88, 0xc8, 0xc5, 0x29, 0xb4, 0x93, 0xb3, 0xe6, 0xd0, 0x74, 0x0b,
+ 0x14, 0x77, 0x74, 0x97, 0x21, 0xce, 0xa1, 0x71, 0xa3, 0xb5, 0xa6, 0x5f,
+ 0xdb, 0x11, 0xf4, 0xc4, 0xa3, 0x21, 0xf1, 0x9b, 0xc4, 0xee, 0xa5, 0x84,
+ 0x1e, 0x03, 0xd6, 0x5f, 0xc6, 0xf1, 0xf8, 0x0b, 0xc0, 0x6c, 0x1a, 0x31,
+ 0x68, 0x80, 0x79, 0x3f, 0x65, 0x5a, 0xf8, 0x68, 0xf3, 0x69, 0x2e, 0x48,
+ 0x68, 0x04, 0x38, 0xe1, 0xdd, 0xe7, 0x9f, 0x02, 0x8d, 0xea, 0x87, 0x3e,
+ 0x53, 0x26, 0xbe, 0xcc, 0x6f, 0xfa, 0x47, 0x19, 0x84, 0x82, 0xf3, 0xf4,
+ 0x1d, 0x59, 0xe4, 0xb4, 0xe2, 0x68, 0x40, 0xa8, 0x33, 0x39, 0x34, 0x4b,
+ 0x01, 0x38, 0xb7, 0x8b, 0x1f, 0x0d, 0xdc, 0x63, 0x3a, 0x49, 0x61, 0xfa,
+ 0x45, 0x16, 0x7c, 0x3f, 0x38, 0xb6, 0x0d, 0x1d, 0xd8, 0xa7, 0x13, 0xad,
+ 0x04, 0x32, 0xb8, 0x3a, 0x92, 0x39, 0x40, 0x4c, 0x8c, 0xb7, 0xb3, 0x82,
+ 0xb1, 0xbc, 0x37, 0xe9, 0x70, 0xc1, 0x12, 0x5f, 0x42, 0xb8, 0xda, 0x3c,
+ 0x6d, 0xe6, 0x0f, 0xfc, 0x94, 0x5f, 0x6c, 0x62, 0x3c, 0x95, 0xc2, 0x8b,
+ 0xb8, 0x9f, 0x4b, 0xcb, 0xef, 0x96, 0x27, 0x1c, 0xa0, 0x32, 0x64, 0x6d,
+ 0xc6, 0x6c, 0xb4, 0x29, 0x3f, 0x0f, 0xc9, 0xae, 0xea, 0x8b, 0x2a, 0x9e,
+ 0x50, 0xdd, 0x7c, 0x99, 0xb8, 0xd9, 0x73, 0x28, 0x01, 0x5c, 0x6e, 0x5b,
+ 0xe5, 0x1b, 0x6e, 0xa3, 0x0b, 0xc5, 0x70, 0x08, 0x69, 0x7b, 0xfc, 0x1d,
+ 0x40, 0x5a, 0x40, 0x5f, 0x0c, 0xb7, 0xde, 0xaf, 0x9b, 0xdf, 0xe8, 0x27,
+ 0xe4, 0x46, 0x7b, 0x1b, 0xf3, 0x81, 0x0a, 0x64, 0x27, 0x7a, 0x14, 0xc4,
+ 0xdd, 0x3b, 0x1e, 0x89, 0xa9, 0xff, 0xbb, 0x4d, 0xf3, 0x5a, 0x40, 0xd1,
+ 0x4c, 0x96, 0xaa, 0x35, 0xe2, 0x3c, 0x96, 0xf9, 0x57, 0xb9, 0x59, 0x04,
+ 0x33, 0xab, 0xe5, 0x01, 0x2c, 0x27, 0xef, 0xbf, 0x9e, 0x99, 0x8e, 0x05,
+ 0x54, 0x6a, 0xb4, 0x8c, 0x7c, 0x98, 0x22, 0x08, 0xb8, 0x25, 0xa6, 0x85,
+ 0xe8, 0xc8, 0xd9, 0x91, 0x73, 0x5a, 0x15, 0xb2, 0x4b, 0xf5, 0xca, 0xe1,
+ 0x70, 0xdc, 0x93, 0xde, 0x0e, 0xe0, 0x1a, 0x35, 0xeb, 0x69, 0xee, 0x2b,
+ 0xb6, 0xd3, 0x39, 0x69, 0x80, 0x77, 0xd8, 0x96, 0x60, 0x3a, 0xb9, 0x3b,
+ 0xa7, 0xcc, 0x57, 0xb5, 0xaa, 0x57, 0x96, 0xb7, 0xee, 0x65, 0x88, 0xe4,
+ 0xf6, 0xe8, 0xc5, 0xd9, 0x0f, 0xe5, 0xfb, 0xcb, 0x6b, 0x0d, 0x7f, 0x00,
+ 0x2e, 0xe7, 0x77, 0x43, 0x29, 0xf6, 0xbe, 0xe6, 0xf2, 0xac, 0x73, 0x0a,
+ 0x6b, 0xd5, 0x16, 0x45, 0x4a, 0x00, 0x2c, 0x61, 0x2a, 0x21, 0xec, 0xaa,
+ 0x99, 0x99, 0x6f, 0xe1, 0x25, 0x5c, 0x49, 0x13, 0x6b, 0xd1, 0x10, 0x9a,
+ 0x0c, 0x7d, 0x3e, 0x96, 0xf7, 0x65, 0x4d, 0xb3, 0xaa, 0xe9, 0xf0, 0x80,
+ 0x40, 0x39, 0x08, 0xb4, 0x93, 0xbb, 0xd8, 0xf8, 0x49, 0xdd, 0xdc, 0x25,
+ 0x2b, 0xeb, 0x18, 0x43, 0x5f, 0x76, 0xa5, 0x10, 0x7f, 0x75, 0xd0, 0x2e,
+ 0x69, 0x65, 0xe7, 0xc1, 0xa9, 0x80, 0x24, 0xb0, 0x7f, 0xf9, 0x88, 0xcb,
+ 0xfc, 0x83, 0x9f, 0x3f, 0x0b, 0xa4, 0x8e, 0x12, 0x71, 0xae, 0x98, 0x2e,
+ 0xb6, 0x45, 0xde, 0x2e, 0x95, 0x77, 0x11, 0xbb, 0x89, 0x4c, 0x13, 0x66,
+ 0x78, 0x70, 0x97, 0x0b, 0x19, 0x0e, 0x39, 0x44, 0x93, 0x5a, 0x4a, 0xa2,
+ 0xb5, 0x15, 0x7a, 0x05, 0xd4, 0x2c, 0xed, 0x3f, 0x7c, 0x37, 0xa8, 0x95,
+ 0x21, 0x96, 0x9b, 0x82, 0xb7, 0x10, 0xfe, 0x92, 0x2c, 0x17, 0x7f, 0xfc,
+ 0x03, 0x54, 0x81, 0x75, 0x66, 0x01, 0xfd, 0xcc, 0xf7, 0xef, 0x45, 0x86,
+ 0x7c, 0x05, 0xbd, 0x05, 0x13, 0x67, 0x5e, 0xa1, 0x74, 0x5e, 0x3c, 0xd3,
+ 0xdf, 0xdb, 0x03, 0xa9, 0x6e, 0xd3, 0xcb, 0xcb, 0x8f, 0x40, 0xd5, 0x33,
+ 0x93, 0xf1, 0x7c, 0x6a, 0x53, 0x5a, 0x15, 0x60, 0x6c, 0xc7, 0x1d, 0xaf,
+ 0xf8, 0xa1, 0xf7, 0x7d, 0xd3, 0x33, 0x73, 0xe5, 0x83, 0xf3, 0x63, 0x1b,
+ 0xaf, 0xd9, 0xb6, 0xaa, 0xba, 0xe2, 0x2a, 0xdf, 0xe1, 0xee, 0xc5, 0x7b,
+ 0xd4, 0x76, 0x22, 0xbb, 0xa9, 0x83, 0x52, 0x5d, 0x08, 0x4b, 0x38, 0x6a,
+ 0xb8, 0x9f, 0xfa, 0xc7, 0x60, 0x5f, 0x31, 0x86, 0x70, 0x94, 0x8d, 0x6b,
+ 0xdd, 0x21, 0x39, 0xd7, 0xb5, 0x4a, 0x3c, 0x31, 0xb7, 0xa4, 0x44, 0x22,
+ 0x9a, 0xa3, 0x2c, 0x6a, 0xd2, 0xcf, 0xaf, 0xc9, 0x95, 0x25, 0x74, 0xcb,
+ 0x2b, 0x2f, 0xcc, 0x6f, 0xc5, 0xcf, 0xc7, 0xee, 0x7a, 0x07, 0xf7, 0x20,
+ 0xce, 0x42, 0x98, 0x6a, 0x6d, 0xff, 0xeb, 0x81, 0xff, 0xe2, 0x1a, 0xfd,
+ 0xeb, 0x12, 0x57, 0xfa, 0xd4, 0x2e, 0x50, 0xf8, 0x25, 0x49, 0xb2, 0xff,
+ 0x13, 0x20, 0x4b, 0xca, 0xcc, 0x2b, 0xbc, 0xe7, 0xc6, 0x23, 0x60, 0x60,
+ 0xb7, 0xef, 0x5e, 0x94, 0xb9, 0xa2, 0x6b, 0x9c, 0xfd, 0x8c, 0x8e, 0xbf,
+ 0x4c, 0xe5, 0x69, 0xe0, 0xea, 0xab, 0xe6, 0x31, 0x30, 0xf1, 0x75, 0xa4,
+ 0xe9, 0x12, 0x60, 0x7e, 0xf0, 0xf6, 0xd8, 0x28, 0x86, 0xda, 0x51, 0x85,
+ 0xce, 0x55, 0x74, 0x26, 0x9d, 0x25, 0x19, 0x92, 0x1e, 0x37, 0xd7, 0xc3,
+ 0xae, 0x00, 0x1b, 0x7b, 0x4d, 0x88, 0x33, 0x1a, 0xbe, 0x41, 0x44, 0xa6,
+ 0x12, 0x2b, 0x0f, 0xae, 0xab, 0x47, 0xce, 0x6a, 0xf3, 0x53, 0x76, 0x1c,
+ 0xa4, 0xc9, 0x04, 0x83, 0xbd, 0x13, 0x7e, 0xec, 0x19, 0xea, 0xbb, 0x20,
+ 0x79, 0x0b, 0x12, 0x1e, 0x85, 0xcc, 0x7d, 0xa1, 0x1b, 0x06, 0xc2, 0x7f,
+ 0x71, 0x6b, 0x62, 0xcc, 0xe7, 0x39, 0x80, 0xff, 0xc3, 0x50, 0x1e, 0xea,
+ 0x37, 0x35, 0xbd, 0x38, 0x4c, 0x24, 0x8c, 0x62, 0x5b, 0x72, 0xab, 0x1b,
+ 0x24, 0x3a, 0xc9, 0xc0, 0x7f, 0xd3, 0xdd, 0xb9, 0x59, 0x61, 0xd2, 0xad,
+ 0x6b, 0x89, 0x18, 0x5b, 0xa2, 0x15, 0x98, 0xb5, 0xf7, 0x07, 0xe7, 0x10,
+ 0x92, 0x6a, 0x25, 0xb5, 0x9a, 0x48, 0xe9, 0xad, 0xc8, 0x87, 0x95, 0x8d,
+ 0x28, 0x2a, 0x5c, 0xca, 0xc0, 0x42, 0xa1, 0x10, 0x07, 0x1d, 0xe2, 0x8b,
+ 0xde, 0x92, 0xe2, 0xce, 0x23, 0xe7, 0x7b, 0x37, 0x00, 0x87, 0x41, 0x78,
+ 0x30, 0x8b, 0x79, 0x55, 0xa6, 0x72, 0xee, 0x80, 0xd3, 0x55, 0xd1, 0x78,
+ 0x57, 0x76, 0x6e, 0xe5, 0xe9, 0x7e, 0x9e, 0x00, 0xc3, 0xeb, 0x48, 0x4f,
+ 0x61, 0x20, 0xfc, 0x15, 0xa3, 0x27, 0xe7, 0x36, 0x3d, 0xf7, 0xcf, 0xca,
+ 0xa3, 0x89, 0xe6, 0xfa, 0x9f, 0xee, 0x48, 0xbf, 0x26, 0x56, 0xa9, 0x88,
+ 0x3f, 0x9e, 0xa0, 0x65, 0x93, 0xe9, 0x0c, 0x3d, 0x97, 0x4a, 0xf4, 0x8d,
+ 0x47, 0x8e, 0x59, 0x8d, 0x38, 0xa8, 0x32, 0xe1, 0xe0, 0x04, 0x2f, 0xf1,
+ 0xf3, 0xe5, 0xc8, 0xc5, 0x22, 0xb0, 0x7e, 0x29, 0x1e, 0xe1, 0x53, 0x3a,
+ 0x12, 0x02, 0xaa, 0xa2, 0xd9, 0x4e, 0x93, 0xf5, 0x55, 0x6c, 0xa7, 0x1d,
+ 0x6c, 0xe6, 0x6e, 0x37, 0x98, 0xb7, 0x9f, 0x30, 0xa8, 0x38, 0x02, 0xaf,
+ 0x52, 0xde, 0xe7, 0x65, 0xd9, 0xf2, 0xd6, 0xef, 0x27, 0xc1, 0x78, 0xc4,
+ 0xcb, 0x1c, 0x43, 0x18, 0x72, 0x00, 0x0c, 0xf8, 0x11, 0x89, 0x43, 0xe5,
+ 0xf3, 0x5a, 0xa3, 0xc0, 0x85, 0xa0, 0x68, 0x8d, 0xa7, 0xcb, 0x00, 0x2d,
+ 0x5d, 0x2e, 0x6e, 0xad, 0xf3, 0xaf, 0x7c, 0x6c, 0x47, 0x42, 0x48, 0xf9,
+ 0x36, 0xaa, 0x27, 0x9d, 0x7a, 0x03, 0x7b, 0x09, 0x1e, 0x31, 0x57, 0x39,
+ 0x10, 0x27, 0xb8, 0xdd, 0xc9, 0xc8, 0x84, 0x5d, 0x20, 0xc5, 0x10, 0xf0,
+ 0xee, 0xec, 0x29, 0x2f, 0xa3, 0xd6, 0x2a, 0x51, 0x88, 0x21, 0xb3, 0xc7,
+ 0x18, 0x73, 0x1c, 0xb0, 0xee, 0x51, 0x9e, 0xf9, 0x78, 0x51, 0x84, 0x00,
+ 0x37, 0x2d, 0xde, 0x9d, 0xf3, 0xc1, 0x66, 0xf8, 0xf9, 0xac, 0x5c, 0xc4,
+ 0x46, 0xb8, 0x27, 0xb0, 0xab, 0x25, 0x55, 0x04, 0xf0, 0xb0, 0xe9, 0xcd,
+ 0x4f, 0xdf, 0xc6, 0x7a, 0x9c, 0x26, 0x85, 0xec, 0xa4, 0x54, 0x9a, 0xb1,
+ 0x5e, 0xa5, 0xb0, 0xba, 0x72, 0x1f, 0x6d, 0xec, 0xdc, 0xe1, 0x61, 0xe3,
+ 0xb6, 0x66, 0xb7, 0xd8, 0x6b, 0xff, 0x68, 0x9f, 0xc8, 0xfd, 0xd0, 0xfa,
+ 0x3e, 0x0c, 0xae, 0x25, 0x29, 0x95, 0x56, 0x67, 0x44, 0xb7, 0xf0, 0xb4,
+ 0xe8, 0x44, 0x36, 0x2c, 0xe0, 0x27, 0xa9, 0x21, 0xdb, 0x0f, 0xdd, 0x8c,
+ 0xac, 0x29, 0x4a, 0xb2, 0x55, 0xa7, 0x03, 0xe4, 0xfd, 0x78, 0x16, 0xe6,
+ 0xac, 0x21, 0xa8, 0x3a, 0x58, 0xbe, 0x4c, 0xdc, 0x57, 0xa8, 0xdf, 0x2d,
+ 0x6b, 0x4a, 0xf2, 0xe8, 0x84, 0x32, 0x68, 0xf8, 0x4b, 0x4b, 0x4d, 0x11,
+ 0x76, 0x6f, 0xfe, 0xbb, 0x5c, 0x0a, 0x52, 0x82, 0x8d, 0x28, 0xf4, 0x9c,
+ 0xa6, 0x68, 0x95, 0x37, 0x44, 0x04, 0x64, 0xe4, 0xae, 0x0d, 0x17, 0xf4,
+ 0x0c, 0x58, 0x7f, 0xf3, 0x8a, 0xf4, 0xea, 0x04, 0x3c, 0xc7, 0xa0, 0x49,
+ 0x70, 0x8a, 0xb2, 0x1f, 0xfb, 0x73, 0x8e, 0xe9, 0xc2, 0x2d, 0x74, 0xf5,
+ 0x62, 0x3d, 0x0e, 0x7d, 0xfe, 0xa6, 0x67, 0xd5, 0x34, 0x10, 0xa1, 0x7e,
+ 0xf3, 0x81, 0x28, 0x5c, 0xcc, 0x41, 0x98, 0x32, 0x33, 0x06, 0x9b, 0x02,
+ 0x72, 0x72, 0x94, 0xd3, 0x3b, 0x27, 0xcf, 0x7a, 0xb7, 0x26, 0xe5, 0xc4,
+ 0x30, 0x96, 0xae, 0x02, 0x4d, 0xa6, 0x8c, 0xcf, 0x25, 0x1a, 0x0b, 0x5d,
+ 0x17, 0x89, 0x91, 0x55, 0x04, 0x68, 0xd2, 0xb0, 0xb4, 0x1a, 0x61, 0xe1,
+ 0xb7, 0x0d, 0x53, 0x4f, 0x6e, 0xa2, 0xd0, 0x34, 0x5d, 0x25, 0x9d, 0x81,
+ 0xdc, 0x3a, 0xa8, 0xbe, 0x4f, 0xd6, 0x69, 0x91, 0x49, 0xdd, 0x36, 0xc5,
+ 0xbc, 0x19, 0x93, 0xaf, 0xcf, 0xf0, 0xe1, 0x77, 0x1b, 0xaf, 0xe3, 0x0d,
+ 0x1b, 0x71, 0xad, 0xdb, 0x5e, 0x0f, 0xda, 0xa5, 0x53, 0x58, 0xc7, 0xc5,
+ 0x0d, 0xa5, 0xe5, 0x15, 0xea, 0x38, 0x3d, 0xe9, 0xc8, 0x93, 0x69, 0xdd,
+ 0x7f, 0x56, 0xa8, 0xc2, 0x38, 0xda, 0x0d, 0xe7, 0xe4, 0x19, 0x2b, 0xaa,
+ 0x22, 0xb7, 0x8e, 0x83, 0x43, 0xaa, 0x52, 0x64, 0xb0, 0x78, 0x16, 0xdb,
+ 0x15, 0x77, 0xc8, 0x6f, 0x79, 0xab, 0x8c, 0x0f, 0x51, 0x49, 0xab, 0x04,
+ 0xb8, 0xae, 0xec, 0x15, 0xa0, 0x95, 0x35, 0x28, 0xf1, 0x18, 0xc0, 0x7a,
+ 0x53, 0x1f, 0x9f, 0xd3, 0x20, 0x59, 0xa3, 0x33, 0xab, 0x1e, 0x20, 0x21,
+ 0xa1, 0x66, 0x99, 0x12, 0x6d, 0xdc, 0x8b, 0x73, 0xb3, 0x48, 0x83, 0x6e,
+ 0xa8, 0xf9, 0xd5, 0x98, 0x67, 0x6d, 0x77, 0x67, 0xcf, 0x58, 0xc3, 0xf6,
+ 0xd8, 0x03, 0xd8, 0xa7, 0xa6, 0x6b, 0x12, 0xa6, 0x88, 0xb3, 0x8a, 0x9c,
+ 0x72, 0x0a, 0x55, 0x65, 0xa2, 0x81, 0x3b, 0x2f, 0x85, 0x5a, 0xe8, 0xa4,
+ 0x96, 0xb1, 0xd4, 0x19, 0x68, 0x41, 0x1f, 0x0e, 0x1a, 0xd7, 0x3f, 0x78,
+ 0x3a, 0xce, 0x2b, 0x5e, 0x38, 0xe4, 0x24, 0xf5, 0x4c, 0x63, 0x75, 0x62,
+ 0xdc, 0x0e, 0xb4, 0xc7, 0xe0, 0x7f, 0x71, 0x86, 0x64, 0xa1, 0x45, 0x1f,
+ 0x72, 0xc1, 0x45, 0x8a, 0x60, 0x33, 0x21, 0x01, 0xeb, 0xa1, 0x5e, 0x51,
+ 0x4e, 0x85, 0xd8, 0x3e, 0x4b, 0xd2, 0x33, 0x89, 0x09, 0x47, 0xbf, 0xbd,
+ 0xb1, 0xe1, 0x22, 0xd2, 0x0f, 0xec, 0xa5, 0x51, 0x1e, 0xab, 0x96, 0x82,
+ 0xe3, 0x48, 0x45, 0x47, 0x6a, 0xee, 0xca, 0x07, 0x5e, 0xb3, 0xc9, 0x7a,
+ 0xe1, 0xf2, 0x42, 0xba, 0x3b, 0x2e, 0x5a, 0x86, 0x1f, 0x11, 0x4a, 0x1a,
+ 0xe6, 0xb7, 0xc8, 0xd8, 0xc4, 0x85, 0xed, 0x61, 0xf3, 0xf9, 0xd2, 0xdb,
+ 0x33, 0x5c, 0x3e, 0x94, 0xe1, 0xb7, 0x71, 0x69, 0xff, 0x79, 0x25, 0x0f,
+ 0x40, 0xea, 0xc8, 0x79, 0xb6, 0xdb, 0x09, 0xf8, 0xd9, 0x8c, 0xfe, 0x04,
+ 0x3b, 0x9a, 0x2f, 0xf1, 0x18, 0xad, 0xdd, 0xcc, 0xf6, 0x37, 0x3c, 0x41,
+ 0x87, 0x9a, 0xbe, 0x9f, 0x61, 0x92, 0x95, 0x5a, 0x44, 0xeb, 0xb4, 0x27,
+ 0xed, 0xbf, 0x38, 0xef, 0xd4, 0xc1, 0x5f, 0x0d, 0x2c, 0x41, 0x84, 0x92,
+ 0x3e, 0x3e, 0xb9, 0x83, 0x7a, 0xaa, 0x28, 0x25, 0xb0, 0x80, 0x33, 0x17,
+ 0xb7, 0x79, 0x6a, 0xcb, 0x19, 0x9b, 0x78, 0xd6, 0x8e, 0x51, 0x3b, 0x86,
+ 0x2f, 0x9c, 0x28, 0xb4, 0x87, 0x6d, 0x92, 0x2a, 0x48, 0xed, 0xd6, 0xde,
+ 0x94, 0x52, 0xe0, 0xf3, 0x63, 0x36, 0x1d, 0x14, 0x9c, 0xfc, 0x38, 0xf1,
+ 0x9a, 0x4e, 0xde, 0xc9, 0x8f, 0xd4, 0x1a, 0x15, 0xc7, 0x8e, 0x14, 0xb1,
+ 0xbc, 0x4e, 0x6e, 0xad, 0x88, 0xc0, 0x02, 0xd1, 0x02, 0x66, 0xb3, 0x4c,
+ 0x52, 0x8e, 0x3e, 0x48, 0x02, 0x1f, 0xcb, 0x60, 0x37, 0x78, 0x5c, 0x4d,
+ 0x01, 0x50, 0xe8, 0xb9, 0xf2, 0x1b, 0x3b, 0xed, 0x90, 0x50, 0x1e, 0x36,
+ 0x08, 0x1f, 0x5d, 0x78, 0x6c, 0x36, 0xdc, 0xbf, 0x03, 0x95, 0xf3, 0x43,
+ 0x07, 0x01, 0x99, 0xd6, 0x31, 0x4a, 0x1e, 0x9d, 0x39, 0x69, 0x75, 0xaf,
+ 0x8c, 0x7a, 0xb9, 0x90, 0xa0, 0xbd, 0x83, 0xbb, 0x71, 0x21, 0x58, 0xa3,
+ 0x61, 0xa1, 0xb6, 0x33, 0xd2, 0xb1, 0x82, 0x24, 0x59, 0xad, 0x0f, 0xc1,
+ 0x98, 0x06, 0x7c, 0x9d, 0x28, 0x30, 0xd5, 0x64, 0x32, 0x53, 0xa9, 0x38,
+ 0x04, 0x1c, 0xc3, 0x00, 0xc3, 0xa4, 0xfc, 0x58, 0xbb, 0xa2, 0x07, 0x2b,
+ 0xd4, 0x2b, 0xb9, 0xcd, 0x9f, 0x7c, 0x72, 0xb1, 0x2a, 0x76, 0x8a, 0xca,
+ 0x71, 0x73, 0x00, 0xa0, 0x90, 0xd8, 0xaf, 0x79, 0x03, 0x29, 0x26, 0x8f,
+ 0x23, 0xc9, 0x38, 0x41, 0xd4, 0x6a, 0x03, 0x64, 0x91, 0x53, 0x9b, 0x95,
+ 0xbc, 0x88, 0x6d, 0xf9, 0xca, 0xf3, 0x04, 0x69, 0x8a, 0x07, 0x01, 0x4a,
+ 0x3c, 0x1a, 0x6a, 0x82, 0x99, 0x85, 0x7b, 0x69, 0x6b, 0x51, 0x88, 0x00,
+ 0x0b, 0xc9, 0xca, 0x8e, 0x9f, 0x64, 0x89, 0x8d, 0x19, 0x82, 0xa1, 0xf2,
+ 0x3e, 0xf9, 0xba, 0x70, 0x7e, 0xbc, 0x36, 0x45, 0xef, 0x8f, 0x70, 0xe2,
+ 0x94, 0x37, 0xb5, 0xa7, 0x1f, 0xcb, 0x2d, 0x99, 0x7d, 0x30, 0x7f, 0xcf,
+ 0xe2, 0x91, 0xff, 0x96, 0xcb, 0x8e, 0x3a, 0x19, 0xc8, 0xc3, 0xd7, 0xa4,
+ 0x6a, 0x43, 0xf0, 0x8d, 0x0e, 0x77, 0x37, 0x6d, 0x94, 0xbe, 0x0b, 0x68,
+ 0x96, 0x9e, 0xaa, 0x0c, 0xf7, 0x23, 0xae, 0xcb, 0x77, 0x2a, 0x78, 0xaa,
+ 0xf8, 0x03, 0x15, 0x90, 0xc0, 0x6f, 0x24, 0x64, 0x98, 0xf3, 0xb8, 0x8b,
+ 0xaa, 0xf5, 0x16, 0x79, 0x89, 0xb7, 0x29, 0xeb, 0xfe, 0xd9, 0xbe, 0x54,
+ 0xa0, 0x4b, 0xb5, 0x3c, 0xb2, 0xc8, 0x39, 0x44, 0xe0, 0x4a, 0xd4, 0xa6,
+ 0xf2, 0x8a, 0xc5, 0x21, 0xf5, 0xc2, 0x86, 0x5a, 0xcc, 0x16, 0x49, 0x25,
+ 0x38, 0x39, 0x59, 0xea, 0x48, 0x83, 0xa3, 0xb3, 0x47, 0x6a, 0x9f, 0xc7,
+ 0x2b, 0x91, 0x8a, 0x50, 0x78, 0x47, 0xc5, 0x9d, 0x15, 0x2f, 0xda, 0x23,
+ 0xf5, 0xf2, 0xd6, 0x19, 0x17, 0x26, 0x90, 0xf0, 0xb4, 0x7c, 0xee, 0x3b,
+ 0x75, 0xb6, 0xd7, 0xa4, 0x43, 0x1f, 0x9b, 0x89, 0x9f, 0x14, 0x66, 0x92,
+ 0x2f, 0xd2, 0x0e, 0xab, 0x3b, 0x88, 0x01, 0x57, 0x9c, 0xb1, 0x0e, 0xae,
+ 0x89, 0x89, 0x9d, 0x07, 0x55, 0x5f, 0xb6, 0x9b, 0x8c, 0x61, 0x30, 0xfc,
+ 0x85, 0xc9, 0x80, 0x2f, 0x52, 0x1c, 0x05, 0x59, 0x3c, 0xe8, 0x76, 0x34,
+ 0x26, 0xc6, 0x63, 0x6b, 0xa1, 0x82, 0xe8, 0x9a, 0x60, 0x3b, 0x46, 0x55,
+ 0xc3, 0xfc, 0x25, 0x9a, 0x7e, 0x84, 0x55, 0x1f, 0x86, 0x54, 0x7c, 0xc0,
+ 0xa5, 0xa9, 0x54, 0x9a, 0x15, 0x6e, 0xcf, 0xb9, 0x54, 0x5c, 0x60, 0xd5,
+ 0x15, 0x95, 0xb6, 0x5f, 0x5a, 0x76, 0xd0, 0xc0, 0xed, 0xb8, 0xde, 0xe4,
+ 0x70, 0x56, 0xe9, 0xb4, 0x0a, 0xaa, 0x90, 0xfc, 0x69, 0xf1, 0x25, 0xc4,
+ 0xe3, 0x1f, 0x7b, 0x9e, 0x01, 0x6d, 0xad, 0xcd, 0xcd, 0xfc, 0xba, 0x88,
+ 0xdb, 0x91, 0x4b, 0xa8, 0xb1, 0x96, 0xc6, 0xbd, 0xf2, 0x14, 0x61, 0x40,
+ 0xe1, 0x55, 0x33, 0xfc, 0x98, 0x29, 0x90, 0x9b, 0x3d, 0x5e, 0x9c, 0x28,
+ 0xb0, 0x59, 0x6b, 0x2b, 0x4e, 0xca, 0x6b, 0x00, 0x0b, 0xb2, 0xa2, 0xf8,
+ 0x3f, 0x80, 0xda, 0x23, 0x44, 0x1c, 0x4c, 0x7e, 0xba, 0x6e, 0xfd, 0x55,
+ 0x3c, 0x7a, 0x21, 0xb2, 0x5b, 0x3f, 0xe4, 0xa2, 0xbf, 0xf4, 0x17, 0x5f,
+ 0x88, 0x10, 0x03, 0xfc, 0x81, 0xb0, 0x23, 0x98, 0xe7, 0x2a, 0x0e, 0xe0,
+ 0x0b, 0xb9, 0xf5, 0xc4, 0x44, 0xd2, 0xa9, 0x24, 0x1a, 0xab, 0x2a, 0x46,
+ 0x65, 0x1f, 0x7b, 0xf5, 0xfb, 0xfc, 0xf3, 0x8f, 0xf0, 0x27, 0xeb, 0x82,
+ 0x2d, 0x39, 0xff, 0xdf, 0x08, 0xf6, 0xc2, 0x48, 0x49, 0x31, 0xb9, 0x85,
+ 0x11, 0xec, 0x86, 0x80, 0xe3, 0x68, 0x01, 0x82, 0x5f, 0xc1, 0x55, 0xfc,
+ 0x05, 0xc9, 0xb6, 0x5b, 0xac, 0x04, 0xf1, 0x11, 0x48, 0x0e, 0xd0, 0xc3,
+ 0x9f, 0xb2, 0x2c, 0xad, 0x48, 0xe4, 0x19, 0x06, 0x10, 0x5d, 0x7d, 0xa1,
+ 0x65, 0xbf, 0xbf, 0xf7, 0x95, 0x32, 0x4e, 0x33, 0x95, 0x86, 0x9e, 0x1c,
+ 0x1c, 0x17, 0x09, 0x45, 0x21, 0x8e, 0x48, 0xa5, 0x9f, 0x6f, 0xe8, 0x52,
+ 0x0e, 0xc0, 0x37, 0x22, 0x8a, 0x75, 0x9f, 0xff, 0x8b, 0xd3, 0xc0, 0x2b,
+ 0xb8, 0xe8, 0xb9, 0xbd, 0x22, 0x40, 0x92, 0x2e, 0x3e, 0xbf, 0x4c, 0x21,
+ 0x23, 0x24, 0xc1, 0xcc, 0x0d, 0xfd, 0x43, 0xf6, 0xdd, 0xb8, 0x38, 0x70,
+ 0x1c, 0x68, 0x70, 0xb6, 0xc2, 0x92, 0x2e, 0x83, 0xcc, 0xe8, 0xb2, 0xc2,
+ 0x10, 0x02, 0x5e, 0x67, 0x2f, 0xd4, 0xb7, 0x42, 0xbf, 0x70, 0x52, 0xed,
+ 0xaf, 0x3d, 0x3f, 0xe5, 0x6d, 0xbf, 0x72, 0xec, 0x44, 0xf3, 0x69, 0x7c,
+ 0x33, 0x20, 0xf5, 0x20, 0xe8, 0x12, 0x07, 0x00, 0x86, 0xc5, 0xec, 0xee,
+ 0x7b, 0x93, 0xae, 0x2b, 0xb7, 0x08, 0x93, 0x60, 0x81, 0x51, 0xc1, 0xce,
+ 0xec, 0x7f, 0x23, 0x5c, 0x5c, 0xde, 0xcc, 0x4b, 0x3d, 0x8b, 0x63, 0x47,
+ 0xc0, 0x0c, 0x3c, 0x02, 0x98, 0xc9, 0x15, 0xa6, 0xc0, 0x2d, 0xdb, 0xb1,
+ 0xfc, 0x6f, 0x04, 0x2a, 0x41, 0x2a, 0x05, 0xba, 0x17, 0x59, 0xe5, 0x73,
+ 0xdf, 0x3b, 0xb7, 0x18, 0x6d, 0xd2, 0xe2, 0x2a, 0x15, 0x94, 0x5f, 0xd0,
+ 0xfe, 0x04, 0x45, 0x4c, 0xc2, 0xa9, 0x57, 0x6b, 0x06, 0x7f, 0x93, 0x2a,
+ 0xd7, 0x03, 0x12, 0x31, 0x15, 0xc1, 0x78, 0x08, 0xfb, 0x70, 0x35, 0x4b,
+ 0x8a, 0x9f, 0xc7, 0x03, 0xb5, 0x8b, 0xce, 0x2b, 0x4d, 0x71, 0xd0, 0x6d,
+ 0x79, 0x81, 0xf7, 0xec, 0xad, 0xe9, 0x8b, 0xa9, 0x33, 0xbe, 0x69, 0xb9,
+ 0x66, 0x34, 0xc7, 0x2b, 0x67, 0xec, 0x1f, 0x44, 0x4e, 0x75, 0xcc, 0xe3,
+ 0x77, 0xa9, 0x8c, 0x5b, 0x40, 0x58, 0x18, 0x80, 0xfc, 0xe3, 0xdb, 0x2d,
+ 0xfe, 0xfb, 0x40, 0x58, 0x94, 0x17, 0x59, 0xe7, 0x6e, 0x11, 0xaf, 0x76,
+ 0x04, 0xd0, 0x66, 0x9f, 0x36, 0x49, 0xb7, 0x34, 0xac, 0xf4, 0xae, 0x3f,
+ 0x65, 0xe6, 0xea, 0x63, 0xfe, 0x15, 0x4a, 0x52, 0x82, 0x28, 0x88, 0x0d,
+ 0x18, 0xd9, 0xeb, 0x05, 0xa3, 0x14, 0x45, 0x06, 0xba, 0x35, 0x17, 0xba,
+ 0xb9, 0xfc, 0x27, 0xd8, 0x07, 0x18, 0xe5, 0xb6, 0x3b, 0xd3, 0xaa, 0x63,
+ 0x60, 0x8e, 0x2a, 0x47, 0x32, 0x36, 0xef, 0xf6, 0xa3, 0x13, 0x3b, 0x02,
+ 0xba, 0xf4, 0x24, 0x77, 0x34, 0xe9, 0x7a, 0x55, 0x87, 0xf8, 0x57, 0x00,
+ 0x4d, 0xad, 0xd5, 0x1f, 0xdc, 0xca, 0x58, 0x30, 0xdb, 0xe3, 0xb5, 0x9a,
+ 0x7d, 0x42, 0xda, 0x60, 0xcc, 0x1c, 0xd5, 0x7d, 0xa5, 0xcc, 0x38, 0x9b,
+ 0xba, 0xa1, 0x1f, 0x28, 0x67, 0x3d, 0x9e, 0xd3, 0x18, 0x4f, 0xdf, 0xc7,
+ 0x9f, 0x4a, 0x41, 0x4b, 0x3e, 0x16, 0xcb, 0xa6, 0xdb, 0x5c, 0xdf, 0xce,
+ 0x48, 0xac, 0xc6, 0xf5, 0xc8, 0x6a, 0x68, 0xdc, 0xf4, 0xb4, 0xfa, 0xcb,
+ 0xf4, 0x90, 0x33, 0x5c, 0x43, 0xea, 0xe7, 0xbe, 0x30, 0xaf, 0xf3, 0xaa,
+ 0xed, 0x95, 0x88, 0x47, 0x83, 0x56, 0x65, 0x5e, 0x6d, 0x3e, 0xe7, 0x00,
+ 0x24, 0x2d, 0xd5, 0xe7, 0xeb, 0x22, 0x5b, 0x86, 0x42, 0xc6, 0x41, 0x55,
+ 0x7a, 0xea, 0xd1, 0x94, 0x04, 0xb5, 0xea, 0x7f, 0x4c, 0x49, 0xcf, 0xb2,
+ 0x25, 0x4f, 0x2d, 0x9f, 0xf5, 0xde, 0xf3, 0xe4, 0x5f, 0x3d, 0xbb, 0xd4,
+ 0x67, 0x74, 0xed, 0x05, 0xf2, 0xc5, 0x50, 0x45, 0xef, 0x65, 0x57, 0xf8,
+ 0x63, 0x1a, 0x6a, 0x64, 0x3f, 0xc1, 0xb9, 0xb4, 0xda, 0x3c, 0x93, 0x62,
+ 0xf1, 0xe0, 0xc6, 0x6c, 0x30, 0x1e, 0x4a, 0x26, 0x65, 0x6f, 0xae, 0x6c,
+ 0xb2, 0xc3, 0xd1, 0x03, 0xa4, 0x4a, 0x6a, 0xcf, 0x31, 0x40, 0xa3, 0x40,
+ 0xa5, 0x39, 0x90, 0x9b, 0x33, 0x09, 0xa0, 0x62, 0x94, 0x9a, 0x00, 0xec,
+ 0xc5, 0x58, 0x46, 0x93, 0x67, 0x78, 0xa4, 0xf4, 0x6b, 0x25, 0x0d, 0x10,
+ 0x4b, 0x5c, 0xd1, 0xc5, 0xf2, 0x2a, 0x0b, 0xc1, 0x46, 0xa2, 0xd0, 0x37,
+ 0x9b, 0x12, 0xae, 0x5c, 0x5f, 0x7f, 0xdb, 0x96, 0x15, 0xf0, 0xc1, 0x4a,
+ 0xdb, 0x05, 0x85, 0xc1, 0x08, 0xc9, 0x40, 0x8c, 0x85, 0x7b, 0x6f, 0x2a,
+ 0x6b, 0x9d, 0xa9, 0x9d, 0xff, 0x54, 0xa5, 0xdb, 0xef, 0x45, 0x4f, 0xc2,
+ 0x88, 0xb4, 0xd3, 0x86, 0x33, 0x8e, 0xe9, 0x0f, 0xb3, 0x6d, 0xe8, 0x6f,
+ 0x88, 0xa3, 0xaf, 0xb0, 0x89, 0x3e, 0x1e, 0x1d, 0x8d, 0x10, 0x86, 0x4e,
+ 0xf1, 0x59, 0x85, 0xe2, 0x66, 0xcc, 0x5c, 0x6f, 0x6a, 0xce, 0xce, 0x60,
+ 0xcf, 0x15, 0xeb, 0x1d, 0x8d, 0xaa, 0x67, 0xf6, 0xf8, 0xb0, 0xd9, 0x0c,
+ 0x01, 0xa2, 0x37, 0x6c, 0x8f, 0xb8, 0x79, 0x4f, 0xc3, 0xeb, 0x46, 0x54,
+ 0xc2, 0x85, 0x54, 0xe4, 0x2b, 0x52, 0x3f, 0x10, 0x8e, 0xba, 0x47, 0xfc,
+ 0x5b, 0x0b, 0x41, 0x17, 0xad, 0x5c, 0x07, 0xf5, 0x0c, 0xc3, 0x03, 0xcc,
+ 0x35, 0x9d, 0x64, 0x2e, 0x2d, 0xbb, 0xdc, 0x96, 0x02, 0xb4, 0x52, 0xb8,
+ 0xe9, 0x77, 0x08, 0x19, 0x87, 0x86, 0xe2, 0xdc, 0x82, 0x7f, 0x7d, 0xfe,
+ 0xac, 0x06, 0x98, 0xd8, 0x3b, 0x7f, 0xbf, 0xdb, 0x35, 0x70, 0x48, 0xeb,
+ 0xd1, 0xfb, 0xc4, 0xa4, 0x42, 0x9d, 0x92, 0xbe, 0xa8, 0x4a, 0x25, 0xa7,
+ 0x78, 0xd7, 0xa1, 0x83, 0x03, 0xeb, 0xc7, 0xb2, 0xc3, 0x46, 0x7f, 0xc4,
+ 0x73, 0xbf, 0xf5, 0xe3, 0x1e, 0x91, 0x3d, 0x01, 0xcd, 0x32, 0xc9, 0x25,
+ 0xd9, 0x8f, 0x7e, 0x4a, 0x4f, 0xb7, 0x95, 0xc0, 0x73, 0xd0, 0x2f, 0xd6,
+ 0x0d, 0x48, 0xcc, 0xc7, 0xd6, 0x05, 0x0a, 0xe3, 0xca, 0x8c, 0x0b, 0x6b,
+ 0xb4, 0x1a, 0x45, 0xdc, 0x8a, 0xae, 0xea, 0xae, 0xc7, 0xd3, 0x1e, 0x3b,
+ 0xc3, 0xff, 0x6d, 0x20, 0x07, 0x82, 0x80, 0x6a, 0x10, 0x36, 0x30, 0x71,
+ 0xb0, 0x68, 0x56, 0x81, 0x1c, 0x6b, 0x98, 0x7a, 0xac, 0x1d, 0xd6, 0x2b,
+ 0xb8, 0x73, 0x21, 0x1b, 0x70, 0xd3, 0x5a, 0xe1, 0x0e, 0x14, 0x90, 0x8d,
+ 0x5c, 0xa6, 0xd4, 0x2a, 0xf8, 0xd3, 0x6d, 0x9f, 0x4f, 0x33, 0x92, 0x7d,
+ 0xee, 0x9d, 0x2f, 0x72, 0xf5, 0x93, 0xfc, 0x31, 0x25, 0xaa, 0xd4, 0xef,
+ 0x1a, 0xd9, 0xd6, 0x1f, 0xa1, 0x39, 0x70, 0xdb, 0xf8, 0xd6, 0x02, 0xad,
+ 0x9e, 0xe0, 0xd3, 0x40, 0x68, 0x30, 0x11, 0xe8, 0x93, 0x37, 0x50, 0x72,
+ 0x19, 0x3a, 0xab, 0x65, 0x9c, 0x28, 0xc9, 0x67, 0x0a, 0x6b, 0xf0, 0x80,
+ 0x58, 0x2c, 0xc4, 0x67, 0x06, 0x88, 0x4f, 0x6d, 0xa9, 0xfc, 0x9e, 0xe8,
+ 0xfc, 0xde, 0xd8, 0xb1, 0xe0, 0xcb, 0x32, 0x9c, 0x79, 0x89, 0x8e, 0x2d,
+ 0x0b, 0xe1, 0xae, 0x09, 0x77, 0x97, 0xe2, 0xf2, 0x36, 0x47, 0x0e, 0x87,
+ 0xe8, 0x67, 0x7e, 0xe7, 0x33, 0x8d, 0xc1, 0x61, 0x41, 0xa0, 0xc8, 0x05,
+ 0x8d, 0x80, 0x26, 0xe6, 0x29, 0x3c, 0x00, 0x50, 0x79, 0x25, 0xd1, 0xb3,
+ 0xa4, 0x0a, 0x75, 0x83, 0x4b, 0xf0, 0x6b, 0xbc, 0xf1, 0x24, 0xe0, 0xa8,
+ 0x5b, 0x48, 0xf0, 0x49, 0x88, 0x66, 0x7a, 0xeb, 0x0e, 0x95, 0x88, 0x64,
+ 0xe4, 0x46, 0x13, 0xfe, 0xe3, 0xbe, 0x74, 0xf3, 0xb6, 0x7b, 0x45, 0x2d,
+ 0xc1, 0x37, 0x93, 0x52, 0xb9, 0xf0, 0x1f, 0xc6, 0xe2, 0x48, 0x1a, 0xfd,
+ 0xf9, 0x69, 0x71, 0x12, 0xf1, 0x98, 0x9b, 0x03, 0xce, 0x02, 0x58, 0xf9,
+ 0xd4, 0xb3, 0x20, 0x63, 0xd5, 0x5e, 0x1f, 0x30, 0x65, 0x73, 0x08, 0x81,
+ 0x41, 0x89, 0x5b, 0x7e, 0x1a, 0x2f, 0xc3, 0x9f, 0x5d, 0x6a, 0x61, 0xdb,
+ 0x83, 0x15, 0xda, 0x95, 0xb7, 0x4c, 0x96, 0x63, 0xd3, 0x1b, 0x9d, 0xfe,
+ 0x0b, 0x11, 0xf0, 0x60, 0x01, 0x7b, 0xf5, 0x01, 0x26, 0xbd, 0xad, 0x61,
+ 0xbb, 0xb8, 0x1c, 0x8f, 0x03, 0xe6, 0x8c, 0x39, 0xa6, 0x4f, 0x59, 0xbb,
+ 0x56, 0xa2, 0x5f, 0xe4, 0x19, 0x23, 0x23, 0xf0, 0x9c, 0x52, 0xd4, 0x41,
+ 0x5b, 0xd3, 0xc1, 0xd9, 0x26, 0x96, 0xe5, 0xf4, 0xdf, 0x64, 0x7e, 0xa3,
+ 0xea, 0x67, 0xa3, 0x39, 0x0d, 0x64, 0x77, 0xc7, 0xe5, 0x67, 0x87, 0xd5,
+ 0xd3, 0x71, 0x98, 0xb9, 0x25, 0xa1, 0x0b, 0x64, 0xa1, 0x3b, 0x69, 0x34,
+ 0xea, 0x73, 0xca, 0xeb, 0x2d, 0x9c, 0x29, 0x3d, 0xdd, 0x6d, 0x48, 0x28,
+ 0xd8, 0x96, 0x25, 0x7e, 0x0b, 0x86, 0xda, 0x1f, 0x3b, 0xbf, 0x05, 0x60,
+ 0xa8, 0xbe, 0x46, 0xb2, 0x4d, 0x1d, 0x1f, 0x4e, 0xba, 0xf9, 0x13, 0x8f,
+ 0x7b, 0x51, 0x48, 0xb7, 0xd7, 0x2f, 0x70, 0x35, 0xaa, 0x9a, 0xa0, 0xd7,
+ 0xc3, 0x8a, 0x46, 0x66, 0xd9, 0xd0, 0x6f, 0x63, 0x65, 0x12, 0x04, 0xd8,
+ 0xa5, 0x6b, 0x03, 0x3f, 0x90, 0x5c, 0x1d, 0xad, 0xf0, 0xdb, 0x2b, 0x01,
+ 0x16, 0x39, 0xf5, 0x07, 0xa0, 0x3a, 0x38, 0x20, 0x69, 0x1c, 0x91, 0x6b,
+ 0xec, 0x52, 0x54, 0x1f, 0x7e, 0xd9, 0x30, 0x00, 0x39, 0x9e, 0x07, 0x31,
+ 0x84, 0x2f, 0xe7, 0x81, 0x77, 0xe6, 0x5e, 0xcc, 0x59, 0x8e, 0x7c, 0x98,
+ 0x5a, 0xea, 0x63, 0x89, 0x95, 0x59, 0xdd, 0xcf, 0xac, 0x0a, 0x5c, 0x78,
+ 0x11, 0x2f, 0xa1, 0xf5, 0xc8, 0xf0, 0x2b, 0xb6, 0x01, 0xa5, 0x8a, 0x83,
+ 0xac, 0x78, 0x3a, 0x74, 0xcf, 0xb6, 0x99, 0x3c, 0x87, 0xc4, 0x8e, 0x4c,
+ 0x49, 0xbd, 0xff, 0x63, 0x5b, 0x1d, 0xb9, 0xe9, 0xf5, 0x24, 0x69, 0x28,
+ 0xbb, 0x1d, 0x9e, 0x71, 0x9d, 0xaa, 0xcf, 0x8f, 0x6e, 0xd6, 0x82, 0xce,
+ 0x5b, 0x35, 0x7d, 0xc3, 0x1b, 0x5d, 0x8c, 0x75, 0x77, 0x46, 0xa5, 0x3b,
+ 0x73, 0x3e, 0x1a, 0x2e, 0xcc, 0x23, 0x2f, 0xf6, 0x57, 0x21, 0xfe, 0x8f,
+ 0xcb, 0x04, 0x4d, 0x7d, 0xa3, 0x51, 0x57, 0x4b, 0xee, 0xdf, 0xfb, 0xbe,
+ 0x5b, 0x90, 0xc6, 0x36, 0x66, 0x99, 0x92, 0xd2, 0xea, 0xbf, 0xea, 0xd0,
+ 0x11, 0xea, 0x89, 0x8b, 0x1b, 0x82, 0x7d, 0x8d, 0x4a, 0x51, 0xbb, 0x49,
+ 0x6a, 0xaf, 0x74, 0x43, 0x14, 0xea, 0x02, 0xdc, 0xc1, 0x9e, 0xe1, 0x30,
+ 0x9b, 0xdb, 0x65, 0x6a, 0x93, 0x6d, 0x8b, 0x90, 0x9f, 0x4e, 0xec, 0xd3,
+ 0x7d, 0x26, 0xbb, 0xfd, 0x93, 0xb6, 0x64, 0x8d, 0xb8, 0x2c, 0x90, 0x10,
+ 0xfe, 0xdd, 0x1c, 0x3f, 0xe2, 0xa0, 0xad, 0x9f, 0xa8, 0xa0, 0x37, 0x56,
+ 0x5a, 0x36, 0xfa, 0x89, 0x47, 0xbb, 0x05, 0x5e, 0x23, 0x2c, 0x92, 0xdb,
+ 0x81, 0x3d, 0x13, 0x7a, 0x5f, 0xd3, 0x27, 0x2f, 0xf7, 0xcb, 0x73, 0xe2,
+ 0x4a, 0x84, 0x53, 0x6c, 0x8d, 0x0c, 0x5e, 0x54, 0x4d, 0xfb, 0x00, 0x8b,
+ 0x55, 0xf1, 0x36, 0xcf, 0x0f, 0x80, 0x2c, 0xc7, 0x48, 0x79, 0xe5, 0x4c,
+ 0x54, 0x6a, 0x8a, 0xf1, 0x75, 0x53, 0x88, 0xbb, 0xd3, 0xc6, 0x83, 0xf8,
+ 0x26, 0xc2, 0xd3, 0x76, 0x7d, 0x79, 0xd8, 0x65, 0x90, 0x3e, 0xaa, 0x2c,
+ 0xc6, 0x81, 0x81, 0x15, 0x73, 0xbf, 0xf3, 0x2e, 0xf9, 0xdf, 0x11, 0x5b,
+ 0x3d, 0x98, 0xea, 0x82, 0x39, 0x8c, 0xb1, 0xbd, 0xef, 0x2b, 0x91, 0xfb,
+ 0x16, 0x59, 0x41, 0xf8, 0x3d, 0x4b, 0xac, 0xb3, 0xf2, 0x02, 0x4e, 0xd4,
+ 0x31, 0x57, 0xde, 0xf6, 0xe6, 0x1f, 0x50, 0x26, 0x68, 0xda, 0xbc, 0x03,
+ 0xee, 0xe1, 0x36, 0x8f, 0x2b, 0x10, 0xb3, 0xd1, 0xb6, 0x14, 0x00, 0xfd,
+ 0xea, 0x8a, 0xd7, 0xc3, 0xcf, 0x6f, 0x3c, 0x73, 0xf9, 0x7e, 0xb7, 0xd4,
+ 0x96, 0xa5, 0x4d, 0x06, 0x4b, 0xd3, 0x2b, 0xec, 0xf8, 0x4f, 0x79, 0x57,
+ 0x36, 0x70, 0x78, 0x9d, 0x95, 0x26, 0x56, 0xf6, 0xc7, 0x11, 0x78, 0xef,
+ 0x93, 0xa3, 0x6a, 0xc5, 0xad, 0x33, 0x67, 0x82, 0x6b, 0x8b, 0x3c, 0xce,
+ 0xcd, 0x31, 0x3b, 0xa7, 0x07, 0x88, 0xb4, 0x1d, 0x19, 0x16, 0x7a, 0x78,
+ 0x4d, 0xec, 0x00, 0x61, 0x22, 0x73, 0x63, 0x37, 0xfa, 0x1d, 0x5f, 0xc1,
+ 0xce, 0xf4, 0xa9, 0xa9, 0xfc, 0x86, 0x85, 0x46, 0xd8, 0x37, 0xbe, 0xc1,
+ 0x23, 0x25, 0xf8, 0x9f, 0xeb, 0xaa, 0x17, 0x1b, 0xce, 0x03, 0x42, 0x66,
+ 0x7a, 0xb5, 0x36, 0x58, 0x4f, 0x97, 0xc3, 0x54, 0x43, 0x54, 0xcf, 0x6c,
+ 0xd3, 0xc2, 0xed, 0x0d, 0x9f, 0xc2, 0xb0, 0xd1, 0x7f, 0x87, 0xd1, 0x30,
+ 0xcf, 0x4e, 0xf1, 0x4b, 0x45, 0xe5, 0xff, 0x76, 0x55, 0x3c, 0x9e, 0x39,
+ 0x8b, 0x23, 0xfa, 0xef, 0xbc, 0x79, 0xc5, 0xab, 0xea, 0xdf, 0x2f, 0xf4,
+ 0x80, 0xcc, 0x7f, 0x85, 0x17, 0x05, 0x56, 0x8a, 0x38, 0x25, 0xab, 0x40,
+ 0x6d, 0x29, 0xcd, 0xf3, 0x82, 0xcd, 0x20, 0xfb, 0xfb, 0xda, 0x60, 0x6f,
+ 0xd4, 0x32, 0x8a, 0x12, 0x45, 0xbb, 0xea, 0x29, 0x65, 0x81, 0xc6, 0x90,
+ 0x0d, 0x31, 0x29, 0xc3, 0xd5, 0xeb, 0x43, 0x8f, 0x0e, 0xe5, 0x7a, 0xd6,
+ 0x64, 0x1c, 0x7c, 0xe2, 0x38, 0xe4, 0x9c, 0x5b, 0xe1, 0x78, 0xca, 0x88,
+ 0x32, 0x0a, 0xc3, 0x5f, 0xb6, 0x7a, 0x94, 0x15, 0xdf, 0x69, 0x10, 0x16,
+ 0xca, 0xb9, 0xd3, 0x96, 0x94, 0xd2, 0x19, 0x68, 0x5c, 0x6b, 0xce, 0x78,
+ 0xa3, 0x79, 0x6c, 0x05, 0xbe, 0x67, 0xb9, 0xc2, 0x27, 0x85, 0x1c, 0x57,
+ 0x2e, 0x9c, 0xbe, 0x4e, 0x6e, 0xb1, 0xad, 0x56, 0x8e, 0xa7, 0xcc, 0x69,
+ 0x7b, 0x5b, 0x6b, 0x12, 0x80, 0x80, 0x67, 0x6c, 0x39, 0x89, 0x07, 0xee,
+ 0x8f, 0x2a, 0x1c, 0xc1, 0x35, 0x50, 0xa9, 0xb9, 0x64, 0x59, 0x0b, 0x80,
+ 0xe9, 0xbc, 0xd6, 0x36, 0x13, 0xfa, 0xf0, 0xe6, 0x73, 0x45, 0x8c, 0x7b,
+ 0x02, 0x3f, 0x9c, 0x36, 0xa5, 0x6f, 0xd4, 0x8e, 0x88, 0x56, 0xef, 0x6a,
+ 0x10, 0x70, 0x6d, 0x40, 0x26, 0xab, 0x81, 0xfd, 0x4d, 0xcd, 0x4a, 0x4a,
+ 0x0a, 0xb8, 0x86, 0x0a, 0x20, 0x32, 0x23, 0x0e, 0x1e, 0x40, 0x78, 0x50,
+ 0x01, 0x7e, 0x64, 0xf1, 0x9c, 0x4d, 0x98, 0x83, 0x62, 0x92, 0xdb, 0xe4,
+ 0x57, 0x5a, 0xa2, 0xbf, 0xa5, 0x85, 0xd1, 0x46, 0x12, 0xb7, 0x29, 0x09,
+ 0x51, 0x15, 0xe2, 0x3c, 0x04, 0x4c, 0xdc, 0x10, 0xd5, 0x19, 0x03, 0x6b,
+ 0xee, 0xfd, 0x3c, 0x8e, 0xd4, 0xb1, 0x32, 0x0b, 0xd2, 0x71, 0x95, 0xef,
+ 0x99, 0x50, 0xbb, 0xb6, 0x2d, 0x51, 0x9a, 0x5f, 0x0e, 0x80, 0x4f, 0x79,
+ 0x15, 0xe9, 0x4d, 0xdb, 0xcc, 0x5d, 0x3c, 0x4b, 0xd6, 0x7a, 0xdb, 0x1b,
+ 0x2e, 0x2a, 0x2e, 0xd6, 0x8f, 0xaf, 0x43, 0xa1, 0xaf, 0xbe, 0x52, 0xd5,
+ 0xaf, 0xe2, 0xd4, 0x68, 0x59, 0xec, 0x81, 0x88, 0xa5, 0x61, 0xb5, 0x41,
+ 0x29, 0x0a, 0xeb, 0x61, 0x93, 0x0a, 0xaf, 0xae, 0x08, 0x6f, 0x0a, 0xb9,
+ 0x99, 0x6e, 0x6e, 0x94, 0x80, 0xfd, 0x14, 0x46, 0xc7, 0xd3, 0x9f, 0xe4,
+ 0xee, 0x15, 0x24, 0xf2, 0x36, 0x53, 0xf6, 0x63, 0xba, 0x51, 0x34, 0x71,
+ 0x2b, 0xca, 0x5d, 0xe6, 0x6c, 0x5b, 0x5c, 0x6c, 0xbd, 0x2c, 0x96, 0x39,
+ 0xe2, 0x0a, 0x99, 0x00, 0x88, 0xaf, 0x03, 0x48, 0x27, 0xb8, 0x1b, 0x5b,
+ 0x95, 0x7f, 0x83, 0x7b, 0xf6, 0x76, 0x8d, 0x60, 0x02, 0x05, 0x99, 0x0a,
+ 0xaf, 0xda, 0xfb, 0xe1, 0x45, 0x55, 0x46, 0x04, 0x24, 0xd3, 0x7c, 0x9f,
+ 0x8b, 0x40, 0x3d, 0x26, 0x6e, 0xc9, 0xfe, 0x7d, 0xa3, 0xc9, 0x8c, 0x5a,
+ 0x5b, 0xc6, 0xb4, 0x5b, 0xe6, 0xe4, 0xfb, 0x1c, 0x90, 0x7a, 0x17, 0x9f,
+ 0x4c, 0xaa, 0xff, 0x45, 0x67, 0x3a, 0x1a, 0xeb, 0xa1, 0xa0, 0x2a, 0x27,
+ 0xa6, 0xfa, 0x01, 0x41, 0x9a, 0x7a, 0xb3, 0x8b, 0x41, 0x2b, 0xe2, 0x9d,
+ 0x24, 0xa1, 0x9e, 0xd2, 0xfd, 0x81, 0x9b, 0x2f, 0x10, 0x28, 0x94, 0xda,
+ 0x7b, 0x20, 0x59, 0x01, 0xfd, 0x2d, 0x2d, 0xbc, 0x34, 0xb4, 0xcd, 0xd6,
+ 0x93, 0xae, 0xdb, 0x01, 0x86, 0x29, 0xa8, 0x2a, 0xf9, 0x9d, 0x72, 0x06,
+ 0xdb, 0x59, 0x72, 0x06, 0xbd, 0x62, 0x0f, 0x59, 0x0d, 0xd0, 0x36, 0x75,
+ 0xed, 0xde, 0xf9, 0x22, 0x92, 0x99, 0x34, 0x34, 0x01, 0xb4, 0x76, 0xb5,
+ 0x74, 0x08, 0xfe, 0x0a, 0x19, 0x1d, 0xda, 0xca, 0x7d, 0x06, 0x8c, 0x60,
+ 0x77, 0x85, 0x75, 0x0f, 0x75, 0xd1, 0x97, 0x28, 0xca, 0xaf, 0xba, 0xc8,
+ 0x35, 0xcc, 0xa9, 0x2d, 0xb1, 0xbc, 0x1d, 0x0e, 0xbe, 0x4b, 0x68, 0xa8,
+ 0x4b, 0x00, 0xc3, 0xbe, 0x0e, 0x78, 0xdc, 0x12, 0x80, 0xc6, 0x75, 0x20,
+ 0xf9, 0xb0, 0x05, 0x24, 0xde, 0x3d, 0x25, 0x34, 0x44, 0x9c, 0xb9, 0x66,
+ 0x70, 0x4a, 0xba, 0xa9, 0x3b, 0xe3, 0x80, 0xe2, 0xad, 0x35, 0x4d, 0x0d,
+ 0xe4, 0xbb, 0x4f, 0x7b, 0x97, 0x32, 0x4b, 0x8d, 0x83, 0x13, 0xb8, 0x46,
+ 0x59, 0xbb, 0x12, 0xe3, 0xce, 0x44, 0xb4, 0xbe, 0x8a, 0x79, 0xd0, 0x3c,
+ 0xfe, 0x77, 0x9e, 0xc7, 0xa7, 0x69, 0xc8, 0x39, 0x60, 0xfd, 0x77, 0x05,
+ 0x5a, 0x93, 0xa2, 0x11, 0xec, 0x9e, 0xe5, 0x6d, 0x90, 0xb7, 0x7e, 0x36,
+ 0x8e, 0x13, 0x07, 0xb8, 0x33, 0x70, 0x97, 0xab, 0x4b, 0x25, 0xb3, 0xa3,
+ 0xfa, 0x17, 0x71, 0x22, 0xa7, 0xda, 0x29, 0x66, 0xe2, 0x19, 0x19, 0x3d,
+ 0x08, 0x87, 0xa1, 0xb5, 0x93, 0x30, 0x7a, 0x85, 0x23, 0x64, 0xf4, 0x4c,
+ 0x06, 0x42, 0x2d, 0x44, 0x0b, 0xb1, 0xa2, 0x6d, 0xff, 0x1b, 0xa1, 0x19,
+ 0xd7, 0xe5, 0x88, 0x2e, 0x97, 0x60, 0xbf, 0xa9, 0x79, 0x25, 0x8d, 0xec,
+ 0x05, 0x34, 0xfc, 0x7e, 0x5f, 0xb9, 0xf7, 0x6d, 0x64, 0x55, 0x81, 0x5f,
+ 0x45, 0x98, 0xec, 0x1d, 0x22, 0x8c, 0xb9, 0x72, 0x3c, 0x4f, 0x85, 0x75,
+ 0x01, 0x19, 0xb7, 0x19, 0xa9, 0xda, 0x49, 0x01, 0x58, 0x25, 0xb6, 0x1b,
+ 0x6e, 0x6b, 0xaa, 0x5d, 0x87, 0xff, 0xd1, 0xf3, 0x97, 0x05, 0x3d, 0x11,
+ 0xc5, 0x87, 0x68, 0x12, 0x4d, 0x0c, 0x4a, 0x7d, 0x68, 0x23, 0x12, 0xe9,
+ 0xa3, 0xe6, 0xbb, 0xaf, 0x43, 0xc2, 0x4b, 0xb4, 0x75, 0xfb, 0xe9, 0xbd,
+ 0x02, 0xf3, 0x6f, 0x6f, 0x8b, 0x60, 0x2e, 0x0a, 0xc9, 0x4c, 0xfc, 0xdd,
+ 0xe2, 0x64, 0x86, 0x50, 0x48, 0xfc, 0xdf, 0x46, 0x0a, 0x7a, 0x39, 0xd8,
+ 0x7b, 0x79, 0x4d, 0xbf, 0x31, 0x36, 0xd9, 0x0f, 0x56, 0x85, 0x8d, 0xfb,
+ 0xb7, 0x52, 0xa6, 0xf1, 0x4f, 0xf7, 0x78, 0xc1, 0xb9, 0x33, 0x4e, 0xeb,
+ 0x3c, 0x17, 0xb4, 0xd4, 0x51, 0x1d, 0xe5, 0xc5, 0xc7, 0xac, 0x48, 0x8c,
+ 0x31, 0xcf, 0x50, 0x7c, 0xb3, 0x03, 0x53, 0xcb, 0x59, 0xbe, 0x4d, 0xa5,
+ 0xd3, 0x5f, 0xd3, 0x0d, 0x76, 0x08, 0xa4, 0xcc, 0x96, 0xcd, 0xc6, 0x79,
+ 0x1d, 0xe1, 0xd8, 0x79, 0xd9, 0x75, 0x3f, 0x97, 0x6b, 0x0a, 0xab, 0x83,
+ 0xe5, 0xbf, 0x3e, 0xa8, 0x78, 0xb8, 0x65, 0x00, 0x1f, 0x9b, 0x96, 0xde,
+ 0xb3, 0x22, 0x50, 0x5c, 0x1d, 0x9e, 0xab, 0x7f, 0x75, 0x90, 0x5c, 0xed,
+ 0xd1, 0xcd, 0x3d, 0xa9, 0x09, 0xd4, 0x89, 0x1b, 0x6a, 0x94, 0xce, 0x53,
+ 0xb0, 0x08, 0x3a, 0xf9, 0x55, 0xdf, 0xf6, 0x5d, 0x76, 0xba, 0x9f, 0x87,
+ 0x32, 0xa0, 0x05, 0x0f, 0xea, 0x49, 0x97, 0xaf, 0xc5, 0x9e, 0x0e, 0x0a,
+ 0xeb, 0x9c, 0xf3, 0x21, 0xe8, 0x74, 0xce, 0x91, 0x6f, 0x45, 0x67, 0xe0,
+ 0x04, 0xfe, 0xfb, 0x6c, 0x94, 0x65, 0xe3, 0x60, 0x83, 0x47, 0xe9, 0x56,
+ 0x4a, 0x0c, 0xa2, 0x1a, 0xb6, 0x71, 0xba, 0xe7, 0x41, 0xe7, 0x65, 0x3f,
+ 0x61, 0xee, 0x9b, 0xfa, 0x62, 0xa9, 0x47, 0x15, 0x00, 0xc3, 0x39, 0x0c,
+ 0x97, 0x71, 0x17, 0xa6, 0xfe, 0x8b, 0x24, 0x1d, 0x1b, 0x6d, 0x4e, 0x4b,
+ 0x5d, 0xbe, 0x3c, 0xc8, 0xa3, 0xf4, 0xfc, 0xd4, 0x74, 0x2d, 0xb1, 0xff,
+ 0x39, 0x62, 0x43, 0x20, 0x83, 0x66, 0x36, 0x4d, 0x31, 0x49, 0xbd, 0xbe,
+ 0xb5, 0x55, 0x89, 0x02, 0x80, 0x13, 0x69, 0x3c, 0xc9, 0x5a, 0x75, 0x3c,
+ 0x88, 0x12, 0xd5, 0xed, 0xdc, 0x3f, 0x5e, 0xc0, 0x12, 0x58, 0x17, 0x2d,
+ 0xca, 0xc1, 0xd1, 0x52, 0xd7, 0x56, 0x4d, 0xbb, 0xcb, 0xeb, 0x7c, 0xd9,
+ 0xe7, 0x6a, 0xac, 0x76, 0xe6, 0x50, 0xa4, 0x19, 0x65, 0xae, 0x1c, 0x32,
+ 0x3f, 0xee, 0xd4, 0x30, 0x83, 0x1f, 0x56, 0xf8, 0x53, 0x71, 0xc1, 0xe2,
+ 0x14, 0x94, 0x10, 0x29, 0xe9, 0x28, 0xb6, 0xbc, 0x26, 0xbb, 0xd0, 0x4e,
+ 0x00, 0xed, 0x43, 0xec, 0x7e, 0xae, 0x70, 0xc5, 0x93, 0x69, 0x41, 0x65,
+ 0x5a, 0x58, 0x0c, 0x6b, 0x4c, 0x13, 0x30, 0x92, 0x8f, 0x18, 0x3e, 0xf6,
+ 0x26, 0x9d, 0x62, 0x23, 0x55, 0xae, 0x6e, 0x8f, 0x90, 0x32, 0xdd, 0x9b,
+ 0xd7, 0x14, 0x8a, 0xf3, 0xe8, 0x89, 0xc4, 0xca, 0xd4, 0xc2, 0x80, 0xae,
+ 0x56, 0x00, 0x1b, 0x95, 0x5c, 0xc4, 0x38, 0xf8, 0x28, 0x2e, 0xac, 0x5b,
+ 0x7d, 0x78, 0xd6, 0xdb, 0x9a, 0xa9, 0x3f, 0x27, 0xb9, 0x71, 0xe3, 0xcf,
+ 0x8c, 0xfa, 0x6d, 0xf8, 0x64, 0x1c, 0xa3, 0x66, 0xe1, 0x28, 0x3d, 0x3d,
+ 0xbc, 0x71, 0xe2, 0x46, 0x2e, 0x7c, 0x57, 0x83, 0x73, 0x93, 0xea, 0xcf,
+ 0x53, 0xc1, 0xca, 0x14, 0x55, 0xfd, 0x56, 0x58, 0xc0, 0x56, 0xfa, 0x3c,
+ 0xcb, 0x8d, 0xb7, 0x4f, 0x31, 0x14, 0x75, 0x92, 0x71, 0x33, 0x95, 0x54,
+ 0x23, 0x9e, 0x83, 0x32, 0xa3, 0x0e, 0x29, 0x60, 0x4c, 0xdb, 0xe3, 0x39,
+ 0xa5, 0x45, 0x20, 0x5b, 0x82, 0x24, 0x3a, 0xef, 0xfc, 0xd2, 0xf3, 0xe9,
+ 0x64, 0x2c, 0xed, 0x79, 0xfd, 0x2f, 0x64, 0x2f, 0xab, 0x27, 0x30, 0x51,
+ 0xc3, 0x63, 0x09, 0xb7, 0xb0, 0x99, 0xe6, 0xb7, 0x34, 0x2c, 0xa2, 0x4e,
+ 0x62, 0x7b, 0x6c, 0x41, 0x90, 0xd6, 0x16, 0x9f, 0x04, 0xf6, 0x6d, 0x63,
+ 0xee, 0xe4, 0x36, 0x68, 0x0d, 0x34, 0x71, 0x42, 0xac, 0xdd, 0xbe, 0x7f,
+ 0xd1, 0x96, 0x72, 0xca, 0x5f, 0x12, 0xa2, 0x5d, 0x01, 0xc4, 0x48, 0x92,
+ 0x2b, 0xba, 0x23, 0x70, 0xab, 0x13, 0x91, 0x27, 0x5e, 0xfd, 0x27, 0x1f,
+ 0x2c, 0x72, 0x8e, 0x4d, 0x36, 0x2e, 0x58, 0x2f, 0x6b, 0x01, 0xab, 0x5a,
+ 0x2c, 0xea, 0x74, 0x55, 0xb5, 0x5a, 0x26, 0xc7, 0x2d, 0x96, 0x9b, 0x4d,
+ 0xd2, 0x05, 0x79, 0xee, 0xe8, 0xd5, 0x2a, 0xf4, 0x74, 0x61, 0x18, 0x25,
+ 0x6e, 0xa0, 0x34, 0xae, 0x9d, 0xdc, 0x0a, 0xcd, 0x53, 0xff, 0xc3, 0x52,
+ 0x88, 0x0f, 0x1d, 0xff, 0xd6, 0xff, 0xb6, 0x6c, 0x1e, 0x73, 0x53, 0x91,
+ 0xc4, 0x86, 0x1b, 0x8f, 0x9e, 0xee, 0xee, 0xa4, 0x95, 0x3e, 0xff, 0x76,
+ 0x81, 0x16, 0x90, 0x3f, 0x4d, 0xb6, 0x39, 0x4f, 0x86, 0xf8, 0x35, 0xeb,
+ 0x19, 0x80, 0xe7, 0xfd, 0x65, 0x20, 0x7a, 0x03, 0x7b, 0x69, 0xec, 0xda,
+ 0xf2, 0xb8, 0x0c, 0x06, 0x65, 0xa6, 0x4b, 0xe4, 0x38, 0xc9, 0x6d, 0xd3,
+ 0x39, 0x40, 0x4e, 0x83, 0xfb, 0x98, 0x8b, 0xe9, 0x13, 0xb4, 0xd6, 0x30,
+ 0x95, 0x4b, 0xf7, 0x91, 0x1f, 0xa9, 0xc3, 0xa3, 0xd7, 0x26, 0x7f, 0x4f,
+ 0x30, 0x51, 0xfb, 0x20, 0x62, 0x82, 0x1c, 0xef, 0xd0, 0x54, 0xd3, 0x00,
+ 0x55, 0x3c, 0xa1, 0xdc, 0x4d, 0x08, 0x4f, 0xef, 0x61, 0x4e, 0xd4, 0x75,
+ 0x60, 0xff, 0x8a, 0xb7, 0x13, 0xfd, 0x1f, 0xb8, 0xfb, 0xf2, 0x51, 0x7a,
+ 0x68, 0xf1, 0xb5, 0xc5, 0xbb, 0x41, 0xa8, 0x2f, 0x0b, 0x8d, 0x2b, 0xc3,
+ 0x88, 0x48, 0xd0, 0xe5, 0xb3, 0xd7, 0xee, 0x75, 0x81, 0x73, 0x99, 0x28,
+ 0x0e, 0xb5, 0x86, 0x01, 0x4f, 0x5d, 0x38, 0xf0, 0x47, 0x08, 0x27, 0xd1,
+ 0xaf, 0xe6, 0x9b, 0xf9, 0x4f, 0xd6, 0xe4, 0x01, 0x10, 0x7a, 0x61, 0x2f,
+ 0xb0, 0xed, 0x18, 0xdb, 0xab, 0x9e, 0xde, 0x8c, 0xfc, 0x36, 0x88, 0x91,
+ 0xf4, 0x85, 0x76, 0x6e, 0xa9, 0x4b, 0x28, 0xda, 0xc9, 0x64, 0xee, 0xff,
+ 0xe5, 0xfb, 0x53, 0xa6, 0x23, 0x8d, 0xe8, 0xdc, 0xdb, 0x52, 0x38, 0x11,
+ 0x0b, 0xf2, 0xe0, 0x37, 0x31, 0xad, 0x88, 0xba, 0x4e, 0x25, 0x8c, 0x0a,
+ 0xc6, 0xc1, 0x98, 0x74, 0x03, 0x33, 0x3d, 0xea, 0x3c, 0xaa, 0x2a, 0x0a,
+ 0x30, 0xf4, 0x3a, 0xef, 0xa8, 0x99, 0xe7, 0xba, 0x9f, 0x90, 0x8e, 0x4a,
+ 0xb3, 0x7c, 0xa7, 0x1f, 0xd4, 0x51, 0x1d, 0x09, 0x60, 0x23, 0x1f, 0x57,
+ 0xcb, 0xb9, 0x11, 0x51, 0x64, 0xc0, 0x15, 0x5a, 0x2e, 0x77, 0x12, 0x58,
+ 0xae, 0x45, 0xc7, 0x80, 0x56, 0xde, 0x0a, 0xf2, 0xd2, 0x44, 0x6f, 0x84,
+ 0x16, 0x79, 0x38, 0x65, 0xa7, 0x1b, 0xd1, 0x49, 0x60, 0xdb, 0x05, 0x91,
+ 0x8f, 0xd9, 0x20, 0x8c, 0x88, 0x1f, 0xe8, 0x04, 0xf3, 0x7e, 0xde, 0x22,
+ 0x04, 0xf3, 0x01, 0xcc, 0x83, 0x8a, 0x14, 0x47, 0xd4, 0xba, 0x1b, 0x89,
+ 0x28, 0x5f, 0x69, 0x60, 0x69, 0xbb, 0xb4, 0x00, 0x96, 0xee, 0xb2, 0xfd,
+ 0xc7, 0xab, 0xd6, 0x23, 0x5f, 0x7f, 0x5e, 0xec, 0xf7, 0x1d, 0x36, 0xb4,
+ 0x60, 0xbb, 0x50, 0x4c, 0xe9, 0x9a, 0xc1, 0x9a, 0x8d, 0x8d, 0x57, 0x8e,
+ 0x4a, 0xf0, 0x06, 0xc6, 0x67, 0x1f, 0x55, 0x3a, 0x2d, 0xce, 0x77, 0x5e,
+ 0x2a, 0xc2, 0x76, 0xe1, 0xbc, 0x23, 0x31, 0xd2, 0x7f, 0x21, 0x89, 0xde,
+ 0xe1, 0xcc, 0x47, 0x35, 0xdf, 0x09, 0x85, 0x95, 0x02, 0x2e, 0x30, 0xb4,
+ 0xcc, 0xad, 0x6a, 0x48, 0x7c, 0xa7, 0xa6, 0x9c, 0xf9, 0xce, 0xba, 0x00,
+ 0x91, 0xcf, 0x0d, 0xc0, 0x74, 0x4f, 0x3c, 0x31, 0x0d, 0x3b, 0x5e, 0xcd,
+ 0x46, 0xab, 0xf9, 0x9f, 0x3b, 0xb3, 0x61, 0xbe, 0x15, 0xe7, 0xc7, 0xb1,
+ 0xe2, 0xda, 0xae, 0x95, 0xb9, 0x63, 0x93, 0xcf, 0x62, 0x72, 0xb0, 0x91,
+ 0x3e, 0xfa, 0xff, 0x1e, 0x0a, 0x58, 0x23, 0x21, 0xef, 0x34, 0xca, 0x7b,
+ 0x69, 0x40, 0x12, 0x25, 0xd8, 0xaf, 0x74, 0xd5, 0xb7, 0xfb, 0x52, 0x63,
+ 0xb4, 0x4f, 0x2e, 0x59, 0xcd, 0xdb, 0x86, 0x98, 0x54, 0xde, 0x37, 0xcd,
+ 0x40, 0x5b, 0x9f, 0x0a, 0xab, 0x8d, 0x26, 0x91, 0x94, 0x1f, 0x73, 0x48,
+ 0x27, 0x5e, 0xc1, 0x6a, 0x45, 0x42, 0x24, 0xbf, 0x00, 0x41, 0xfc, 0xe9,
+ 0x65, 0x26, 0x5a, 0xba, 0x38, 0x3d, 0xf2, 0xa2, 0x35, 0x37, 0x14, 0x8d,
+ 0xc5, 0x98, 0xec, 0xa3, 0x5e, 0x73, 0xad, 0x3e, 0x18, 0x28, 0xdc, 0x32,
+ 0x6a, 0xad, 0x5b, 0x69, 0x84, 0x3c, 0x79, 0x83, 0x5d, 0x7c, 0x00, 0x93,
+ 0xcf, 0xd7, 0xff, 0x94, 0xaa, 0x36, 0xa3, 0xbb, 0xa3, 0xdc, 0xb2, 0x8a,
+ 0x65, 0x02, 0x16, 0xd0, 0x2a, 0xd5, 0xbc, 0xb9, 0xf1, 0xb2, 0x5c, 0x20,
+ 0x7a, 0xcc, 0xcb, 0x84, 0xa5, 0x48, 0xc3, 0x93, 0xf4, 0xd9, 0x91, 0xd0,
+ 0xf7, 0x9f, 0x99, 0xb8, 0xa3, 0xb9, 0x1f, 0x3d, 0x83, 0x80, 0x1e, 0x1c,
+ 0x5b, 0x9a, 0x87, 0x71, 0xbb, 0x2a, 0x86, 0x52, 0x88, 0xd3, 0xb4, 0xf8,
+ 0x39, 0xf2, 0xb5, 0x68, 0x49, 0xc8, 0xb9, 0x87, 0x22, 0x82, 0xa6, 0x4a,
+ 0xcf, 0x86, 0x7b, 0x27, 0x0c, 0x18, 0x01, 0x2a, 0x49, 0xdf, 0xc3, 0xf8,
+ 0x92, 0x90, 0x26, 0xa8, 0x30, 0x7f, 0x7b, 0x48, 0xd2, 0xcf, 0x17, 0xac,
+ 0x96, 0x69, 0x5e, 0x48, 0xd0, 0x42, 0x02, 0x56, 0xa5, 0x87, 0xdd, 0x98,
+ 0x5b, 0x3e, 0x9f, 0x04, 0x08, 0xc7, 0xe6, 0xfa, 0x91, 0xf8, 0xc8, 0x8c,
+ 0xa7, 0xaa, 0x4c, 0xfd, 0x05, 0x57, 0xa8, 0xab, 0xae, 0xce, 0xdc, 0x74,
+ 0xe1, 0x9d, 0xa1, 0xfd, 0x3b, 0x43, 0x29, 0x82, 0xab, 0xf7, 0x7e, 0x22,
+ 0xa8, 0x9a, 0x2f, 0x8b, 0xa0, 0x8e, 0x41, 0x05, 0xe3, 0xd8, 0x8a, 0x83,
+ 0x02, 0x48, 0x74, 0x7c, 0x51, 0x09, 0xac, 0x94, 0x44, 0x8f, 0x4a, 0x97,
+ 0x0f, 0xb1, 0xfd, 0xf5, 0xbe, 0x84, 0x4e, 0x68, 0x48, 0x2b, 0x05, 0xfb,
+ 0x03, 0x04, 0x23, 0xfc, 0xf5, 0x60, 0x0e, 0x3f, 0xea, 0xb9, 0xdf, 0xe3,
+ 0x91, 0x14, 0x3e, 0x2d, 0x3a, 0x7e, 0x90, 0xf6, 0x52, 0x3c, 0x5f, 0x9d,
+ 0x56, 0x38, 0xa9, 0x10, 0xa1, 0xec, 0x65, 0xc6, 0x67, 0xb8, 0x14, 0x39,
+ 0xaf, 0x2d, 0xba, 0x46, 0x7b, 0x7f, 0x2e, 0xdd, 0x72, 0xd1, 0x5a, 0x60,
+ 0xf4, 0xbf, 0x57, 0x2c, 0x27, 0xb4, 0x8f, 0x22, 0xde, 0x3c, 0x3a, 0xfc,
+ 0xbe, 0xf9, 0xc7, 0x3c, 0x6c, 0x36, 0xf0, 0x5c, 0xfb, 0xcd, 0x40, 0xc6,
+ 0x87, 0xa3, 0xe7, 0x68, 0x9f, 0x86, 0x4b, 0x1b, 0xb1, 0x90, 0x49, 0xa1,
+ 0x6d, 0xd2, 0x34, 0xc2, 0xa6, 0x55, 0xf3, 0x52, 0x43, 0xf3, 0x41, 0x97,
+ 0x7e, 0x66, 0x46, 0x2b, 0xac, 0xb4, 0x20, 0xd9, 0xd6, 0x2d, 0x05, 0x00,
+ 0x3b, 0xce, 0xb2, 0xfa, 0x17, 0xa0, 0x11, 0xbb, 0xa8, 0x6b, 0xba, 0x25,
+ 0xaa, 0x15, 0x3f, 0x67, 0x4e, 0x18, 0x04, 0xb5, 0x75, 0x0e, 0x29, 0xc0,
+ 0x3e, 0x44, 0x65, 0xfc, 0x19, 0x4e, 0xe0, 0x06, 0x16, 0x37, 0x1f, 0xd7,
+ 0x0d, 0xc5, 0x26, 0x96, 0x1e, 0x3b, 0xdc, 0x52, 0xd6, 0x45, 0xaa, 0x9f,
+ 0x11, 0xe8, 0x44, 0x2d, 0xb8, 0xd4, 0x4e, 0xc5, 0x96, 0x06, 0x1e, 0x9e,
+ 0x04, 0x2e, 0x88, 0xf3, 0x32, 0xde, 0x8f, 0x2e, 0x97, 0x39, 0xe7, 0xef,
+ 0x1c, 0xba, 0xca, 0xfd, 0x33, 0x0c, 0xc4, 0x04, 0xfd, 0xe6, 0xdc, 0x98,
+ 0x3d, 0x20, 0xc8, 0x8d, 0x83, 0x82, 0x19, 0xfd, 0xbb, 0xb6, 0xcb, 0xf6,
+ 0x63, 0x1d, 0x23, 0xd9, 0xe8, 0xf4, 0x60, 0x29, 0x63, 0x61, 0xc6, 0x2b,
+ 0x3f, 0x37, 0xdd, 0x94, 0x50, 0x38, 0x81, 0xef, 0xb0, 0xf4, 0x0f, 0xba,
+ 0xa8, 0x7a, 0x47, 0xe5, 0x19, 0xf7, 0x4d, 0x52, 0x8f, 0xfe, 0x33, 0xde,
+ 0x2e, 0xc1, 0xb8, 0x9d, 0xb0, 0x84, 0xfa, 0x7f, 0x7f, 0x0f, 0x32, 0x23,
+ 0x86, 0x89, 0xce, 0xfe, 0xe7, 0x73, 0xb8, 0x69, 0xa8, 0x91, 0xa6, 0x24,
+ 0x97, 0x84, 0x51, 0x3e, 0x7f, 0x4d, 0xed, 0x98, 0x50, 0xa7, 0xc6, 0xb4,
+ 0x56, 0x68, 0xe2, 0x81, 0x12, 0x78, 0x01, 0x13, 0x82, 0x00, 0x50, 0x7e,
+ 0x69, 0xa5, 0xf9, 0xbb, 0xaa, 0x7a, 0xd8, 0x0d, 0xe9, 0x07, 0x49, 0x89,
+ 0xc5, 0xa1, 0xe9, 0x0c, 0xeb, 0x3c, 0xd3, 0xd0, 0x3a, 0x69, 0xce, 0x9e,
+ 0x67, 0xc1, 0x08, 0x75, 0x7d, 0x71, 0xed, 0x15, 0x1b, 0x3a, 0x57, 0xaf,
+ 0x2b, 0x9b, 0x8c, 0x37, 0x8a, 0x45, 0x86, 0x3a, 0xb0, 0xcd, 0xde, 0x5c,
+ 0x5f, 0x17, 0x41, 0x95, 0x73, 0x7e, 0x16, 0x9d, 0x6b, 0x30, 0xe3, 0xff,
+ 0xe6, 0xa8, 0x91, 0x94, 0xb5, 0x7c, 0xcb, 0xd3, 0x85, 0x1f, 0x5c, 0x15,
+ 0xdc, 0xd9, 0x5f, 0x2b, 0x52, 0x62, 0xac, 0x54, 0x05, 0xd6, 0x00, 0x3c,
+ 0xd7, 0x88, 0xe8, 0x6e, 0xca, 0x58, 0x72, 0xe8, 0xa2, 0x70, 0x96, 0xf0,
+ 0x2d, 0x2e, 0x03, 0x32, 0x1b, 0x37, 0x49, 0x8e, 0x89, 0x93, 0xe4, 0x12,
+ 0xe7, 0x59, 0xbf, 0x8e, 0xd0, 0x8b, 0x58, 0x2f, 0x2b, 0x65, 0xf7, 0x3d,
+ 0x4f, 0xe2, 0xff, 0xad, 0x7d, 0xf3, 0xe7, 0x0a, 0x59, 0x82, 0xf2, 0x10,
+ 0xaa, 0x31, 0xa7, 0x3c, 0x75, 0xfc, 0x98, 0x26, 0x75, 0x0c, 0x28, 0xa8,
+ 0x49, 0x99, 0x5f, 0xeb, 0x6f, 0xa7, 0x39, 0x2a, 0x8e, 0xef, 0xeb, 0x66,
+ 0x57, 0x90, 0x03, 0x2b, 0xb1, 0x1d, 0xd4, 0x7a, 0xdc, 0x01, 0x77, 0xa3,
+ 0x0a, 0xfc, 0xc2, 0xe7, 0x21, 0xf7, 0xe4, 0x2f, 0x8a, 0x22, 0x7b, 0x79,
+ 0x46, 0xf1, 0x72, 0x07, 0xb2, 0x5f, 0x84, 0xed, 0xca, 0x37, 0xc8, 0xef,
+ 0xc1, 0x82, 0xc0, 0x01, 0xf1, 0xd7, 0xc4, 0x2f, 0x1b, 0xbb, 0x8a, 0xb9,
+ 0xdb, 0x68, 0x40, 0xb6, 0x7d, 0x14, 0x7e, 0x27, 0xa4, 0x62, 0xc4, 0x85,
+ 0xc3, 0xb7, 0x58, 0xa0, 0x37, 0xfa, 0x6d, 0x2c, 0x92, 0xca, 0x80, 0x8c,
+ 0x6a, 0x68, 0xef, 0x76, 0x61, 0xb1, 0x13, 0xd9, 0x01, 0xcd, 0xa9, 0xb7,
+ 0x5f, 0x0b, 0x8f, 0x18, 0xa1, 0x66, 0xea, 0x6b, 0xeb, 0xd2, 0xb5, 0x4c,
+ 0xee, 0x52, 0x22, 0x59, 0xc8, 0x26, 0x9f, 0x01, 0x92, 0x48, 0x41, 0x37,
+ 0xec, 0xc6, 0x27, 0xbe, 0x56, 0x42, 0x04, 0x6d, 0x83, 0xa1, 0x96, 0x31,
+ 0x03, 0xff, 0x39, 0xf3, 0x2b, 0xf1, 0x6d, 0x7f, 0x2f, 0xd6, 0xec, 0xf0,
+ 0x18, 0xf2, 0xc8, 0xbc, 0xe3, 0x80, 0x47, 0x08, 0x2d, 0x54, 0xb4, 0xe3,
+ 0x0a, 0x9b, 0x2a, 0xec, 0x5b, 0xdb, 0xb3, 0x31, 0x3b, 0xc5, 0xd9, 0xf1,
+ 0x5f, 0x5a, 0xb9, 0x9b, 0x46, 0x8a, 0x79, 0xd9, 0x59, 0x56, 0x43, 0x4d,
+ 0x60, 0xa6, 0x10, 0xae, 0xca, 0x77, 0xef, 0xa1, 0x5f, 0x20, 0xb5, 0xa9,
+ 0x22, 0xcb, 0xeb, 0xe8, 0x48, 0xe8, 0xc1, 0x29, 0xf8, 0xce, 0x38, 0xd1,
+ 0x31, 0x2f, 0x1a, 0xea, 0x36, 0x25, 0xd1, 0x5e, 0x6a, 0x60, 0x94, 0x9c,
+ 0xf8, 0x1d, 0x3c, 0xf1, 0x75, 0x08, 0x06, 0x6f, 0xaa, 0x5e, 0x78, 0x41,
+ 0x11, 0x94, 0xe4, 0xa3, 0x79, 0x67, 0x78, 0x46, 0xc9, 0x1f, 0xa2, 0xbc,
+ 0x75, 0xb2, 0xc5, 0x15, 0xee, 0x0b, 0x88, 0xf9, 0xff, 0xdf, 0x41, 0xa1,
+ 0xb8, 0x3a, 0x5f, 0xbb, 0x20, 0x1f, 0x1f, 0x81, 0xba, 0xc5, 0xbd, 0x7f,
+ 0x29, 0xdd, 0xcb, 0x05, 0x0e, 0x74, 0xe4, 0x48, 0x0d, 0x02, 0xaa, 0xae,
+ 0xb6, 0x93, 0x5b, 0xa0, 0x3f, 0x65, 0xe6, 0x18, 0xfd, 0xac, 0xac, 0x85,
+ 0x93, 0x54, 0xf6, 0x26, 0xff, 0xa6, 0xe8, 0x9f, 0x86, 0x87, 0xe2, 0xd4,
+ 0xe6, 0x92, 0x59, 0xda, 0x16, 0xed, 0xcf, 0x93, 0x2b, 0x17, 0x7d, 0x35,
+ 0x0b, 0x19, 0x9a, 0x8c, 0x08, 0x27, 0xf3, 0xeb, 0x69, 0x50, 0xe1, 0x33,
+ 0xf6, 0xa1, 0xfe, 0x75, 0x6d, 0x0e, 0xe5, 0x0e, 0x22, 0xe7, 0xf9, 0x21,
+ 0x44, 0x4f, 0x84, 0x5c, 0xfb, 0x32, 0x3e, 0xe1, 0xf8, 0xd4, 0x02, 0x53,
+ 0x9b, 0x8c, 0xb9, 0x07, 0xaa, 0x15, 0x9a, 0x76, 0x58, 0x49, 0x08, 0x33,
+ 0x4d, 0x5c, 0x4f, 0xf4, 0x28, 0x4b, 0x33, 0xb4, 0x51, 0x9b, 0xe9, 0x13,
+ 0x4a, 0x52, 0x5c, 0x83, 0xbf, 0xf7, 0xd3, 0x48, 0xcb, 0x98, 0x0c, 0xb4,
+ 0x5d, 0xcd, 0x97, 0x4a, 0x1f, 0xc2, 0x19, 0x95, 0x03, 0x8a, 0x56, 0x35,
+ 0xef, 0x6a, 0x84, 0xa4, 0x62, 0xe8, 0x9a, 0x0a, 0x52, 0xfb, 0xe8, 0x61,
+ 0xd5, 0xbc, 0xee, 0x27, 0xad, 0xfd, 0x5b, 0xb0, 0x03, 0xb9, 0xde, 0xd3,
+ 0xf6, 0x74, 0x86, 0xc2, 0x0d, 0xaa, 0x4d, 0x89, 0x2e, 0x88, 0x44, 0x1a,
+ 0x18, 0xc8, 0xf0, 0x21, 0x3e, 0x95, 0x6e, 0x58, 0x06, 0xdd, 0x1c, 0x27,
+ 0xbb, 0x5f, 0x52, 0x10, 0xa5, 0x68, 0xb2, 0x95, 0x85, 0xea, 0x11, 0x16,
+ 0x67, 0x6d, 0x2d, 0x35, 0x47, 0x13, 0x6d, 0x8e, 0x4b, 0x17, 0x1c, 0x7f,
+ 0x72, 0xc8, 0xd8, 0x2f, 0x0b, 0x16, 0xf4, 0x04, 0x7a, 0x5e, 0xfa, 0x24,
+ 0x2c, 0xae, 0xde, 0x8d, 0x9b, 0x48, 0xe1, 0x65, 0x83, 0x0c, 0xff, 0xcf,
+ 0x3e, 0x14, 0xf9, 0x1b, 0x8d, 0xf7, 0xbe, 0x38, 0xbf, 0x2d, 0x5a, 0x5a,
+ 0xed, 0xb6, 0x70, 0xc6, 0xab, 0x7b, 0xa3, 0xe9, 0xc8, 0x31, 0x4f, 0x9c,
+ 0x9a, 0x98, 0x88, 0xc4, 0x72, 0x22, 0xe2, 0x85, 0x12, 0xf4, 0xea, 0x52,
+ 0xb6, 0x48, 0x2f, 0x53, 0x12, 0xc6, 0xf9, 0xe5, 0x3c, 0xdc, 0x74, 0x17,
+ 0xcc, 0xe3, 0xe5, 0x04, 0x5d, 0xc1, 0x47, 0xa7, 0xc0, 0xb9, 0xc7, 0xb9,
+ 0x39, 0x98, 0xaf, 0xcf, 0x60, 0xb5, 0x7f, 0x82, 0xa7, 0xb9, 0x0a, 0x25,
+ 0xfb, 0x70, 0xa2, 0x43, 0xf2, 0xc1, 0x8a, 0x99, 0x36, 0xbc, 0x03, 0x73,
+ 0x9a, 0xf1, 0x97, 0x65, 0xff, 0xe6, 0xe2, 0x37, 0xba, 0xac, 0x0d, 0xc1,
+ 0x93, 0x05, 0x4b, 0xf5, 0x69, 0x45, 0x9b, 0x83, 0xc2, 0x44, 0xea, 0x23,
+ 0x65, 0x5c, 0x22, 0xb2, 0x97, 0x2f, 0x8d, 0xab, 0x51, 0x61, 0xa1, 0xa6,
+ 0x8a, 0x6a, 0x1c, 0xf6, 0xff, 0xc2, 0x83, 0xfb, 0x56, 0xef, 0xf0, 0xbd,
+ 0x67, 0x6e, 0xe6, 0x50, 0x2f, 0xa0, 0xe6, 0x26, 0x2d, 0x68, 0x7e, 0x97,
+ 0x09, 0x4c, 0x0a, 0x17, 0x26, 0x98, 0x69, 0x3a, 0x3e, 0x06, 0x15, 0x20,
+ 0x99, 0x38, 0x59, 0x7d, 0x54, 0x5c, 0x34, 0xd7, 0x9a, 0x51, 0xcc, 0x36,
+ 0x28, 0xc1, 0x0b, 0x9c, 0x6c, 0xd2, 0x03, 0xc6, 0x8f, 0x1e, 0x40, 0xa2,
+ 0xd6, 0xa3, 0x34, 0xf2, 0xb1, 0x21, 0xef, 0x93, 0xd5, 0x51, 0xfb, 0x77,
+ 0x76, 0x92, 0x05, 0x8f, 0xad, 0x36, 0x12, 0x33, 0xce, 0x3e, 0x8f, 0xa9,
+ 0x2c, 0x67, 0xe7, 0x4f, 0x02, 0x02, 0xbd, 0x83, 0xcc, 0x16, 0xea, 0xf7,
+ 0x64, 0x7f, 0xde, 0xa0, 0x37, 0xf5, 0x89, 0xa2, 0x3e, 0xa2, 0xca, 0x8f,
+ 0xe1, 0x8a, 0x65, 0x7f, 0x37, 0x12, 0xd9, 0x1e, 0x6f, 0x7f, 0xce, 0x73,
+ 0x87, 0xdc, 0xd3, 0xa6, 0xec, 0xe0, 0x59, 0x62, 0xaf, 0x6d, 0xaa, 0x89,
+ 0xe8, 0x51, 0xfa, 0xa8, 0x9a, 0x75, 0xf9, 0x64, 0xf2, 0x36, 0xd3, 0xbd,
+ 0x89, 0x9d, 0x14, 0x4e, 0xf5, 0x36, 0x81, 0x29, 0x4c, 0x37, 0x84, 0xd9,
+ 0x9b, 0x6f, 0xf1, 0x60, 0x27, 0xef, 0x03, 0x8a, 0xd6, 0xbc, 0x73, 0xe3,
+ 0x91, 0xd0, 0x75, 0x58, 0xb7, 0x0e, 0x49, 0x16, 0x0e, 0x44, 0xf9, 0x13,
+ 0x3f, 0xe7, 0x80, 0xfb, 0x41, 0xf6, 0xdf, 0x14, 0x35, 0x39, 0x30, 0xb9,
+ 0x31, 0x14, 0x4b, 0xba, 0x35, 0x5a, 0x14, 0x1d, 0xdf, 0x56, 0x88, 0x98,
+ 0xa8, 0xae, 0x8b, 0x73, 0xb9, 0xb9, 0xcd, 0xa5, 0x63, 0x21, 0x2b, 0xb2,
+ 0xb9, 0x76, 0xe8, 0x52, 0x33, 0x20, 0xff, 0x90, 0x66, 0x5f, 0xbc, 0x38,
+ 0xeb, 0xf9, 0xd0, 0x57, 0x9d, 0xb6, 0xfa, 0xf6, 0x83, 0xf8, 0xbe, 0x69,
+ 0x97, 0xb4, 0x2e, 0x60, 0xa1, 0x4f, 0x00, 0x9b, 0x7a, 0xae, 0xa2, 0x7f,
+ 0x5e, 0x36, 0x6d, 0x1e, 0x6d, 0x4f, 0xc4, 0xbc, 0xfb, 0xb3, 0x3a, 0x01,
+ 0x65, 0x45, 0xb0, 0x46, 0x24, 0xe0, 0xf8, 0xc8, 0x39, 0xa3, 0x28, 0x99,
+ 0xb9, 0xc1, 0xdf, 0xa1, 0xbc, 0x7e, 0x8c, 0x2f, 0x05, 0xde, 0x81, 0xc2,
+ 0xe8, 0x1a, 0xf1, 0x25, 0xca, 0xd0, 0xc0, 0xd6, 0xdc, 0xc3, 0x7e, 0x4e,
+ 0x48, 0xdb, 0xf6, 0x5a, 0x76, 0x6f, 0x67, 0x37, 0x1c, 0xc9, 0xcf, 0x11,
+ 0xcc, 0x79, 0x24, 0xea, 0xbb, 0xab, 0x47, 0xb1, 0x80, 0x54, 0xe3, 0x99,
+ 0xa6, 0x96, 0x68, 0x10, 0xb9, 0xae, 0x54, 0xbe, 0xfc, 0x76, 0x2c, 0x47,
+ 0x3d, 0xff, 0x2b, 0xf5, 0xec, 0x88, 0xb8, 0x07, 0xb6, 0x6e, 0xbf, 0xbe,
+ 0x46, 0xdb, 0x11, 0x2e, 0x7c, 0x7f, 0xae, 0xa3, 0x17, 0x48, 0x4c, 0x05,
+ 0xb6, 0xd7, 0x29, 0x42, 0xb7, 0xcd, 0x1a, 0xb2, 0xbb, 0x21, 0x74, 0x8b,
+ 0x60, 0xcd, 0x07, 0x75, 0x44, 0x0c, 0x05, 0x85, 0x9a, 0xd4, 0x1f, 0xd2,
+ 0x74, 0xa3, 0x8e, 0x5a, 0x20, 0x3e, 0x60, 0xb8, 0x80, 0x35, 0xac, 0xca,
+ 0x5b, 0x79, 0x5b, 0x9d, 0xcc, 0xaa, 0xbe, 0x44, 0x86, 0x11, 0x06, 0x97,
+ 0x2c, 0xd7, 0xd0, 0xb6, 0xb4, 0xca, 0x4b, 0x6a, 0xd6, 0x01, 0xfe, 0x81,
+ 0x06, 0xdd, 0x34, 0x12, 0xd3, 0xa6, 0xfb, 0xc7, 0x33, 0x41, 0xd1, 0x55,
+ 0x54, 0x54, 0xb5, 0xf7, 0x6e, 0x65, 0x69, 0xff, 0xe6, 0xf9, 0x96, 0x6d,
+ 0x9c, 0xc9, 0x37, 0x16, 0xd3, 0x0e, 0x92, 0xbc, 0xd1, 0x15, 0x6a, 0x5b,
+ 0x69, 0xd8, 0xa5, 0xb6, 0xdc, 0xb6, 0xd8, 0x17, 0xc2, 0x5a, 0x3f, 0xd2,
+ 0xeb, 0xd9, 0x04, 0xc9, 0x1f, 0xee, 0xdc, 0x8b, 0x27, 0x48, 0xad, 0xc3,
+ 0x12, 0x8d, 0x0f, 0xf6, 0x4b, 0x46, 0xd6, 0x86, 0x8c, 0x1c, 0xae, 0x81,
+ 0x6e, 0xd6, 0xb5, 0xae, 0x50, 0xaf, 0x52, 0x95, 0x61, 0xcc, 0x1d, 0x86,
+ 0x11, 0x12, 0x3f, 0x56, 0x4c, 0x98, 0xa8, 0x91, 0x9c, 0x26, 0x98, 0xe7,
+ 0x56, 0x0d, 0xc9, 0x20, 0x4e, 0xe0, 0x67, 0x5e, 0xe9, 0xe0, 0x99, 0xed,
+ 0x93, 0x29, 0x9a, 0xfb, 0x71, 0x24, 0x02, 0x5a, 0x6d, 0xe5, 0xec, 0x4b,
+ 0xc5, 0x7d, 0x35, 0x3d, 0xd7, 0x55, 0xc3, 0x7f, 0x69, 0x5d, 0x5b, 0x87,
+ 0xba, 0x9a, 0x78, 0x39, 0xa8, 0x31, 0x63, 0x3b, 0xdb, 0xc2, 0xed, 0xc2,
+ 0xf8, 0xc8, 0xee, 0xa5, 0x46, 0xf3, 0xb0, 0x0e, 0x76, 0x0a, 0x6e, 0x83,
+ 0xc4, 0x2f, 0xf4, 0xa4, 0x8c, 0x73, 0xab, 0xf8, 0xcf, 0xe2, 0xf8, 0x4d,
+ 0xa5, 0x74, 0x58, 0xae, 0x13, 0xe2, 0xc7, 0x9a, 0x15, 0xf9, 0x18, 0x30,
+ 0x1a, 0xa3, 0x31, 0x65, 0xec, 0x9f, 0xf7, 0xa5, 0x7f, 0x3a, 0x1b, 0xf1,
+ 0x3e, 0x96, 0xb6, 0x23, 0xac, 0xd8, 0xa9, 0x9d, 0x5c, 0x77, 0x63, 0xb4,
+ 0xa8, 0xc8, 0x07, 0x1b, 0x30, 0xe0, 0xea, 0xce, 0xc9, 0x8e, 0x7b, 0x25,
+ 0x95, 0x09, 0x8e, 0xff, 0xf1, 0xad, 0x12, 0x10, 0x32, 0xbb, 0x6a, 0xfa,
+ 0x52, 0x58, 0xa3, 0x4c, 0x5c, 0x14, 0x61, 0x33, 0x46, 0x76, 0x7d, 0xf1,
+ 0x28, 0xb8, 0xdb, 0xe8, 0xf6, 0x3e, 0xdd, 0x17, 0xfb, 0x5a, 0x33, 0x93,
+ 0x67, 0x1e, 0x9b, 0x31, 0xdd, 0x24, 0x76, 0xab, 0x88, 0x50, 0x71, 0x52,
+ 0xcc, 0x30, 0x55, 0x04, 0xf2, 0x62, 0x5f, 0x3d, 0x2e, 0xc0, 0x6d, 0x81,
+ 0x9c, 0xcf, 0xbe, 0x0f, 0x72, 0x04, 0xc1, 0xcb, 0x7a, 0x85, 0x7c, 0x88,
+ 0x1a, 0xe4, 0xbf, 0x5a, 0x25, 0x14, 0x7b, 0x8b, 0x61, 0x4a, 0x78, 0xbf,
+ 0x75, 0xe6, 0x6f, 0x8f, 0xf5, 0xce, 0x2e, 0xbf, 0xe0, 0xa2, 0x17, 0xc1,
+ 0xc3, 0x17, 0x62, 0x36, 0x6f, 0xd3, 0x0e, 0x39, 0xba, 0x76, 0x6c, 0x66,
+ 0x8d, 0xcd, 0x7b, 0xb4, 0xe3, 0x11, 0x8b, 0xeb, 0x7d, 0x83, 0x39, 0xbc,
+ 0xca, 0x55, 0x70, 0xe1, 0x6f, 0x27, 0x46, 0x0e, 0x78, 0x78, 0x77, 0x16,
+ 0xab, 0x03, 0xcc, 0x3e, 0xd2, 0xf3, 0xb6, 0xfd, 0x60, 0xe8, 0x35, 0x1f,
+ 0xf3, 0x5f, 0x2b, 0x9b, 0x5b, 0x57, 0xe6, 0xb4, 0xe3, 0x3e, 0x28, 0x8c,
+ 0xd0, 0xdc, 0xe2, 0xc7, 0xb2, 0x48, 0x6b, 0x76, 0x6e, 0x4d, 0xe4, 0x88,
+ 0xf8, 0xdb, 0x66, 0x58, 0xda, 0x66, 0x1c, 0x03, 0x60, 0xc6, 0x8e, 0xf6,
+ 0x96, 0x46, 0x45, 0x0b, 0xc1, 0x93, 0xa1, 0x3b, 0xbe, 0x73, 0xe6, 0x59,
+ 0x6d, 0x8e, 0xd6, 0x04, 0xe6, 0x7c, 0x1b, 0xd0, 0x38, 0xb2, 0x50, 0x62,
+ 0x2d, 0x03, 0x2a, 0xc5, 0x3a, 0x7f, 0xf3, 0x2e, 0x23, 0x4c, 0x64, 0x00,
+ 0x77, 0xba, 0xa7, 0xaf, 0x81, 0x84, 0x37, 0x6b, 0xf8, 0xe2, 0x93, 0xbe,
+ 0x63, 0x6f, 0x7f, 0xe5, 0x39, 0xfb, 0xad, 0xca, 0xe4, 0x32, 0x70, 0x51,
+ 0x58, 0xb3, 0xac, 0xa2, 0xb6, 0xd2, 0x2f, 0x3c, 0xf5, 0x91, 0xf8, 0xd9,
+ 0x3e, 0xaa, 0x6a, 0xe2, 0x15, 0x49, 0x85, 0x6e, 0xde, 0xae, 0x51, 0xe9,
+ 0x5b, 0x56, 0x2a, 0x7f, 0x87, 0x02, 0x71, 0x89, 0x42, 0x86, 0x09, 0x1f,
+ 0xe2, 0x2a, 0xb7, 0x8e, 0x78, 0xc0, 0xd0, 0xc9, 0xca, 0x94, 0xeb, 0x5f,
+ 0xd5, 0x04, 0x8d, 0x5a, 0x67, 0x47, 0x10, 0x4a, 0xa7, 0x70, 0x62, 0x4f,
+ 0x15, 0x18, 0xd3, 0x19, 0x45, 0x0b, 0x14, 0xef, 0x54, 0xf4, 0x50, 0x64,
+ 0x1a, 0xc8, 0x65, 0xd1, 0x2f, 0x6c, 0xb5, 0x95, 0xb9, 0x42, 0x45, 0x36,
+ 0x8d, 0x2b, 0x69, 0x23, 0xcc, 0xfb, 0x47, 0x5d, 0x81, 0x37, 0x78, 0xc1,
+ 0x41, 0xcb, 0x21, 0xd5, 0xed, 0x9d, 0x01, 0x01, 0x60, 0x82, 0x5c, 0x55,
+ 0x55, 0xa4, 0xe3, 0xfb, 0xb5, 0x1e, 0x8f, 0x8d, 0x70, 0xd3, 0xaf, 0xa6,
+ 0x2c, 0x4e, 0x66, 0x23, 0xd4, 0xa4, 0x18, 0xd6, 0x71, 0x0a, 0x14, 0xa7,
+ 0xfb, 0x05, 0x15, 0xea, 0xaa, 0xaa, 0x5e, 0xa3, 0x07, 0x86, 0xdd, 0xce,
+ 0x60, 0x27, 0x29, 0x5a, 0x49, 0x75, 0xb7, 0xe0, 0x2c, 0xba, 0xff, 0x64,
+ 0x45, 0x0f, 0xe5, 0x40, 0xbd, 0x94, 0x0b, 0x3d, 0xd5, 0x6b, 0x0b, 0x5f,
+ 0x52, 0x70, 0xf7, 0x7c, 0x04, 0x82, 0x6b, 0x07, 0xa1, 0xec, 0xa4, 0xae,
+ 0x79, 0x3b, 0x0f, 0x95, 0x92, 0x1b, 0x04, 0xae, 0xbd, 0xba, 0xdb, 0xf5,
+ 0xd2, 0x14, 0x6b, 0xf5, 0x6e, 0x7f, 0x6a, 0x98, 0xa1, 0xea, 0x33, 0x08,
+ 0x38, 0x3d, 0xac, 0x83, 0xd2, 0xf2, 0x07, 0xdb, 0x00, 0x94, 0x84, 0xb6,
+ 0x19, 0xf9, 0x5a, 0x96, 0xf8, 0x4c, 0xaa, 0x4e, 0xba, 0x8c, 0x11, 0x2e,
+ 0x08, 0xbb, 0x15, 0xed, 0xb5, 0x19, 0x3a, 0x2a, 0xa8, 0xde, 0xf4, 0xb2,
+ 0xbf, 0xa0, 0xae, 0x87, 0x54, 0xae, 0x6d, 0x2b, 0xae, 0xfd, 0x06, 0x61,
+ 0x35, 0x9a, 0xa4, 0x2d, 0x6d, 0x80, 0xb0, 0x1b, 0x47, 0x5b, 0xd5, 0x64,
+ 0xe5, 0xdc, 0x4e, 0xa1, 0x15, 0xe9, 0x71, 0xd2, 0xcc, 0x29, 0x53, 0x36,
+ 0x87, 0x94, 0x1a, 0x0f, 0xcb, 0x3c, 0x1e, 0xdf, 0x20, 0xc4, 0xe5, 0x3f,
+ 0x29, 0x78, 0xf8, 0xc1, 0xf5, 0xab, 0x59, 0x89, 0xd6, 0x95, 0xf9, 0x7b,
+ 0x4f, 0x8d, 0x12, 0x9b, 0xa3, 0x24, 0x37, 0xc3, 0xf4, 0xb0, 0x7c, 0xca,
+ 0x40, 0xe7, 0x0b, 0x13, 0x11, 0x63, 0xf1, 0x71, 0x39, 0x11, 0x04, 0xb0,
+ 0xfb, 0x85, 0x07, 0xb7, 0xc0, 0xdd, 0x75, 0xca, 0xb9, 0x56, 0x15, 0x66,
+ 0xc4, 0x91, 0x3e, 0xff, 0xb3, 0x6e, 0x0d, 0x35, 0x47, 0x6f, 0xde, 0xf2,
+ 0xd4, 0x06, 0xfb, 0x73, 0x84, 0xc6, 0x33, 0xd4, 0x06, 0x74, 0x9d, 0x37,
+ 0x29, 0x9c, 0xe4, 0x17, 0x22, 0xac, 0xb3, 0xe9, 0x26, 0xe4, 0xf9, 0x37,
+ 0x56, 0xcd, 0xd0, 0x4d, 0x90, 0xe0, 0x75, 0x90, 0x64, 0xe2, 0xf3, 0x67,
+ 0x07, 0xdb, 0xde, 0xbe, 0xdd, 0x50, 0x24, 0x86, 0x28, 0xf9, 0x3b, 0xb5,
+ 0x2d, 0x92, 0xaf, 0x78, 0x7a, 0x2d, 0xf7, 0xe7, 0xc9, 0x34, 0xc7, 0xd1,
+ 0x40, 0x25, 0x0a, 0x92, 0x74, 0x7c, 0x8f, 0xb7, 0xfd, 0x9a, 0x13, 0x79,
+ 0xd9, 0x8e, 0x70, 0xa5, 0x9a, 0xcc, 0xfe, 0x9b, 0x64, 0x04, 0xe0, 0xff,
+ 0x66, 0x8d, 0x84, 0xc7, 0xae, 0x3c, 0xfb, 0x66, 0x21, 0x61, 0x09, 0x04,
+ 0x45, 0x11, 0x29, 0x46, 0x8a, 0x49, 0x23, 0x8d, 0xbb, 0xcc, 0xbe, 0x11,
+ 0x02, 0x90, 0x58, 0xcb, 0xe8, 0xd9, 0xd4, 0xad, 0x19, 0x10, 0xd1, 0x9e,
+ 0x70, 0x02, 0x40, 0x02, 0x2f, 0xbe, 0xef, 0xe9, 0x9a, 0xda, 0x80, 0xd3,
+ 0xf3, 0x0f, 0x47, 0xe2, 0x6c, 0xfc, 0x58, 0xac, 0x59, 0x54, 0x2c, 0x51,
+ 0x4c, 0xa5, 0x70, 0x90, 0xa9, 0x83, 0x5b, 0x5e, 0xbc, 0xd3, 0x1e, 0x40,
+ 0x3c, 0x9d, 0x65, 0xa5, 0xc0, 0x0f, 0x66, 0x20, 0x7f, 0x3c, 0xaf, 0x9f,
+ 0xc0, 0x23, 0x6f, 0x52, 0x6f, 0x1d, 0x7a, 0xfd, 0xf1, 0x70, 0xda, 0x07,
+ 0x0a, 0xd8, 0x90, 0xc9, 0x68, 0x58, 0x36, 0xf0, 0xc3, 0x50, 0xf0, 0xe7,
+ 0x68, 0xe2, 0xb5, 0x43, 0x9a, 0x5e, 0x6a, 0x03, 0x81, 0xe6, 0x65, 0x9b,
+ 0xb5, 0x8c, 0xa6, 0xb5, 0xfe, 0x7f, 0x3d, 0xde, 0xc7, 0x75, 0x5e, 0x1b,
+ 0xf4, 0x7f, 0xbe, 0x65, 0x44, 0x8b, 0xd1, 0x47, 0xb5, 0xf5, 0x27, 0xcc,
+ 0xf7, 0xc2, 0x76, 0xc1, 0x5f, 0x26, 0x08, 0xb1, 0x5d, 0x0a, 0x2b, 0xd4,
+ 0xcf, 0xf0, 0xc7, 0x32, 0xf6, 0xad, 0xac, 0x2b, 0x70, 0x72, 0xd5, 0x3c,
+ 0x23, 0xc8, 0xb1, 0x3a, 0xd9, 0x22, 0xb9, 0x93, 0x62, 0x87, 0x1d, 0xab,
+ 0x48, 0xbe, 0xa8, 0x03, 0x68, 0xa4, 0xf1, 0x58, 0x75, 0x17, 0x35, 0x7b,
+ 0x1f, 0x1e, 0x4b, 0x55, 0x12, 0x8e, 0x6a, 0x08, 0xd1, 0x9c, 0x21, 0x44,
+ 0xc6, 0x3b, 0xfb, 0x55, 0x3f, 0x9d, 0x9e, 0xda, 0x3b, 0xf8, 0xb7, 0x79,
+ 0x50, 0xe3, 0x6e, 0x4d, 0xd6, 0x9e, 0x44, 0x9f, 0xb7, 0x39, 0x9a, 0x70,
+ 0x51, 0x2b, 0x7a, 0xe5, 0x60, 0xc8, 0xd9, 0x2a, 0xe0, 0xa5, 0xcf, 0xeb,
+ 0x46, 0xdb, 0xb7, 0xbc, 0x4a, 0x2b, 0x36, 0xb0, 0xc2, 0x24, 0xfb, 0x7f,
+ 0xb9, 0x53, 0x7c, 0x63, 0xbb, 0x88, 0x09, 0xba, 0xe9, 0x0e, 0x46, 0x57,
+ 0x28, 0xd7, 0x7e, 0xff, 0xde, 0x33, 0x23, 0xa7, 0xee, 0x00, 0xe2, 0x28,
+ 0x52, 0x88, 0xc4, 0xb6, 0xa9, 0xe4, 0x64, 0xe3, 0xea, 0x57, 0xab, 0x1b,
+ 0x2b, 0xec, 0x36, 0xe9, 0x07, 0xbd, 0x47, 0x94, 0xad, 0xfa, 0x1a, 0x9e,
+ 0x38, 0x44, 0x79, 0x2c, 0x76, 0x45, 0x3a, 0x59, 0xdb, 0xb5, 0xf1, 0x4b,
+ 0x96, 0x73, 0xcc, 0xc9, 0x84, 0x05, 0x4b, 0xdb, 0x81, 0x98, 0x58, 0xf8,
+ 0x1a, 0xc8, 0x89, 0xa7, 0x26, 0xa4, 0xf9, 0xd4, 0x65, 0x77, 0xc6, 0xd6,
+ 0x18, 0xfc, 0x99, 0x48, 0x72, 0xaa, 0xf0, 0x8a, 0xca, 0x3f, 0xbc, 0x45,
+ 0xf6, 0xc5, 0x08, 0xd7, 0x9f, 0x7a, 0xa5, 0x81, 0xe9, 0xfb, 0x50, 0xd0,
+ 0x42, 0xbe, 0x48, 0x25, 0x37, 0x2a, 0x86, 0xe9, 0x39, 0xdc, 0x6a, 0x9f,
+ 0x08, 0x1e, 0x06, 0xa4, 0x35, 0x1d, 0x99, 0xeb, 0xb8, 0x76, 0xeb, 0x80,
+ 0x9f, 0x1e, 0x40, 0xae, 0xef, 0xd5, 0xf8, 0x74, 0x8a, 0x85, 0x57, 0x11,
+ 0x21, 0x1d, 0xbd, 0xe8, 0xc3, 0x65, 0x6f, 0x53, 0xe9, 0xda, 0xbf, 0xb8,
+ 0x4e, 0xcc, 0x2b, 0x91, 0xb0, 0xa3, 0xc3, 0xa3, 0xe0, 0xa1, 0x9d, 0x05,
+ 0x9e, 0xff, 0xc6, 0x64, 0xb3, 0x8d, 0xc1, 0xaf, 0xde, 0x4d, 0x8f, 0x26,
+ 0x78, 0x04, 0xc9, 0xfb, 0xe6, 0x06, 0x17, 0x86, 0x42, 0xc2, 0xa5, 0xd3,
+ 0xf4, 0xe0, 0x81, 0xbd, 0x16, 0xd3, 0xc6, 0x1a, 0xd7, 0xd9, 0xed, 0x24,
+ 0x22, 0x7a, 0xeb, 0x95, 0xa3, 0x1a, 0x96, 0x81, 0x13, 0x48, 0x15, 0x70,
+ 0x18, 0xf8, 0x2f, 0x98, 0xf3, 0x61, 0x49, 0xaa, 0x69, 0x92, 0x63, 0x6e,
+ 0xd2, 0xe3, 0xa6, 0x45, 0x75, 0x71, 0xc8, 0x29, 0xc0, 0x21, 0xfa, 0x6a,
+ 0xe6, 0xdf, 0x40, 0xbb, 0x94, 0x75, 0xba, 0xf2, 0x6c, 0x44, 0xb6, 0xd6,
+ 0x28, 0xf5, 0x7f, 0x99, 0xb8, 0x56, 0x08, 0xba, 0x30, 0x45, 0x31, 0x87,
+ 0x46, 0xdc, 0xf5, 0xcf, 0xbe, 0x65, 0xbd, 0x63, 0xf0, 0xcb, 0x7b, 0x58,
+ 0x83, 0x79, 0xbe, 0xd8, 0xda, 0x9e, 0xce, 0x54, 0x40, 0x19, 0xf0, 0xe5,
+ 0x3d, 0x99, 0x98, 0x7b, 0xce, 0xbc, 0x8f, 0x0f, 0x72, 0x4d, 0xdc, 0xf1,
+ 0xae, 0x44, 0x13, 0x7c, 0xa7, 0x6c, 0x17, 0x8a, 0xe8, 0xeb, 0x6b, 0xad,
+ 0xc8, 0x3a, 0xce, 0x4a, 0x60, 0xb7, 0x93, 0x5e, 0x32, 0x94, 0xa6, 0x64,
+ 0x15, 0x09, 0xe7, 0x69, 0x07, 0x42, 0xf1, 0x4b, 0x59, 0x3d, 0xf4, 0xb2,
+ 0xf9, 0x10, 0xca, 0xef, 0x64, 0x86, 0x3d, 0x58, 0xac, 0x90, 0x45, 0x4b,
+ 0xe8, 0x27, 0xff, 0x2b, 0x16, 0xb2, 0x33, 0x43, 0x7c, 0xa7, 0xef, 0xc6,
+ 0xbb, 0x7a, 0xfa, 0xce, 0xda, 0x03, 0x95, 0x68, 0x3c, 0xff, 0x1b, 0xcd,
+ 0x84, 0x94, 0x41, 0xac, 0x05, 0x88, 0x19, 0x51, 0xf1, 0x9c, 0x5e, 0x55,
+ 0x2f, 0x69, 0x4a, 0xe7, 0x91, 0x36, 0x1f, 0x20, 0x51, 0xa4, 0xc6, 0x9d,
+ 0xc5, 0x33, 0x80, 0xe0, 0x9d, 0x09, 0x42, 0x63, 0x20, 0x6a, 0x8f, 0x4f,
+ 0xa9, 0x2d, 0xef, 0x33, 0x63, 0x57, 0xed, 0x39, 0xea, 0x34, 0x5b, 0x51,
+ 0x8b, 0x59, 0xcd, 0x80, 0x9c, 0xa3, 0x66, 0x26, 0x51, 0x1c, 0x78, 0x1c,
+ 0xbf, 0x72, 0x11, 0xfe, 0xb3, 0xba, 0x21, 0xe0, 0x8c, 0xea, 0xea, 0xb2,
+ 0x49, 0x02, 0xd3, 0x10, 0x64, 0x74, 0xbf, 0xf0, 0x1e, 0x39, 0xd0, 0x9d,
+ 0x9b, 0x19, 0x69, 0xe0, 0xa4, 0x33, 0xdc, 0xcc, 0x3d, 0x95, 0x9d, 0xd4,
+ 0x10, 0xcd, 0xa5, 0x8e, 0xd4, 0x4a, 0xec, 0x04, 0xf5, 0x9d, 0x47, 0x28,
+ 0x2a, 0x1c, 0xa0, 0x1a, 0x3c, 0x74, 0xd2, 0x86, 0xda, 0x60, 0x0e, 0x68,
+ 0x33, 0x1f, 0x21, 0xdf, 0x32, 0x61, 0xf2, 0x3e, 0x7c, 0xf7, 0x2a, 0xd8,
+ 0xa2, 0xa7, 0xcb, 0xa3, 0x4d, 0xe6, 0x3c, 0x48, 0xb5, 0x5c, 0x44, 0xd4,
+ 0x5a, 0x91, 0x94, 0xda, 0xdf, 0x9b, 0x47, 0xa5, 0x0a, 0x1f, 0x74, 0x66,
+ 0x95, 0x95, 0x9c, 0x04, 0x4c, 0xaa, 0x20, 0x26, 0xe7, 0x28, 0xc4, 0x7a,
+ 0x38, 0xf9, 0x53, 0x33, 0x95, 0x96, 0x4e, 0xaf, 0x27, 0x11, 0x0a, 0x4d,
+ 0x23, 0xc5, 0x77, 0xe0, 0x60, 0xcb, 0x95, 0xc6, 0x98, 0x44, 0xcb, 0xec,
+ 0x2d, 0xa0, 0x37, 0x38, 0x79, 0x72, 0x39, 0x76, 0xee, 0xd2, 0x4a, 0xf9,
+ 0x50, 0x2f, 0xe2, 0x84, 0x17, 0x97, 0x97, 0x4c, 0xab, 0xc5, 0xb8, 0xae,
+ 0xb5, 0x99, 0x4d, 0xd6, 0xe9, 0x02, 0x6f, 0x2d, 0x3a, 0x5c, 0x12, 0x5f,
+ 0x1d, 0x5a, 0x74, 0x34, 0xd1, 0x94, 0x36, 0x0d, 0xc5, 0x63, 0x84, 0x12,
+ 0x9a, 0xa3, 0xa1, 0x73, 0x48, 0x2c, 0x9f, 0x60, 0x93, 0x4f, 0x84, 0xd9,
+ 0x9a, 0xd6, 0x3f, 0x70, 0x79, 0x4d, 0x96, 0x55, 0x6e, 0x5b, 0x52, 0x1c,
+ 0x02, 0xea, 0xae, 0xfb, 0x4f, 0xc1, 0xab, 0x43, 0x87, 0x67, 0x61, 0xd5,
+ 0x83, 0x9d, 0x35, 0xf5, 0x76, 0x0f, 0xc6, 0x9f, 0xf3, 0xdc, 0x29, 0x48,
+ 0x41, 0xa8, 0x23, 0x66, 0x43, 0x63, 0x5c, 0x28, 0x20, 0xf6, 0x33, 0xe6,
+ 0x00, 0x38, 0xaa, 0x7f, 0x05, 0xf5, 0xd7, 0x89, 0xc6, 0x6a, 0xaa, 0x24,
+ 0xcd, 0xde, 0x6c, 0xf9, 0xbc, 0xa8, 0xc3, 0xbd, 0x88, 0xeb, 0x1b, 0x73,
+ 0x1d, 0xb4, 0x50, 0x40, 0x75, 0x29, 0x75, 0x64, 0x83, 0xc4, 0x1c, 0x13,
+ 0x6a, 0xa3, 0x6e, 0xec, 0x0b, 0x5e, 0xce, 0xb4, 0x32, 0x72, 0x4e, 0xb8,
+ 0x54, 0x03, 0x57, 0x7e, 0x04, 0x1a, 0x8f, 0xea, 0x38, 0xac, 0x87, 0x3d,
+ 0x6a, 0x1a, 0x44, 0xfe, 0x34, 0x54, 0x60, 0xab, 0xfe, 0xbf, 0x2e, 0x95,
+ 0xdb, 0xf6, 0x49, 0x66, 0x58, 0x4d, 0xff, 0x93, 0xbf, 0x8f, 0x8a, 0xf9,
+ 0x16, 0xd0, 0xa2, 0x9e, 0x7d, 0xbe, 0x4f, 0xd0, 0xa3, 0xc7, 0xe1, 0x52,
+ 0x24, 0x4d, 0x15, 0x01, 0xfb, 0xca, 0x49, 0xec, 0x30, 0x85, 0xc9, 0x99,
+ 0x78, 0x0a, 0xcb, 0x79, 0x24, 0x56, 0x08, 0x4e, 0x27, 0x93, 0x63, 0xcd,
+ 0x0e, 0xed, 0x39, 0x4a, 0x3a, 0x79, 0x03, 0x19, 0xa7, 0x53, 0x03, 0xaa,
+ 0xf4, 0x71, 0xce, 0x03, 0x64, 0xaf, 0x55, 0x29, 0x53, 0x38, 0x23, 0x23,
+ 0xbc, 0x27, 0xbf, 0x42, 0x31, 0xd5, 0xab, 0xe9, 0xb1, 0xad, 0xda, 0x3f,
+ 0xbc, 0xff, 0x9e, 0x58, 0x91, 0x4f, 0x5e, 0xb5, 0x0d, 0x3b, 0xc0, 0x9d,
+ 0x76, 0x6c, 0xf0, 0x49, 0xb8, 0xf4, 0xc7, 0x81, 0x37, 0x2e, 0x98, 0x13,
+ 0xa5, 0x7e, 0x9b, 0x84, 0x73, 0x38, 0x8d, 0x66, 0x95, 0xbc, 0x17, 0xf0,
+ 0x01, 0x96, 0x3b, 0xa4, 0xb8, 0x54, 0xfc, 0x21, 0x9e, 0x7a, 0x91, 0xc0,
+ 0x19, 0x72, 0xd8, 0xd2, 0xe7, 0x3a, 0x63, 0xf0, 0xf2, 0xca, 0xf1, 0x86,
+ 0x0a, 0xdc, 0x1a, 0x87, 0xdc, 0xdb, 0x5f, 0x07, 0xad, 0xc1, 0xd4, 0xeb,
+ 0x3d, 0x15, 0x78, 0x3e, 0x9f, 0x03, 0xfb, 0x07, 0xff, 0xbe, 0x0d, 0xd2,
+ 0xea, 0xf0, 0x7d, 0xc1, 0x18, 0x19, 0x06, 0x35, 0xcc, 0xea, 0x47, 0x08,
+ 0x17, 0xe5, 0x7f, 0x1b, 0x3c, 0xcd, 0x6b, 0xf5, 0xd9, 0x48, 0xb9, 0x1e,
+ 0x44, 0x31, 0x41, 0x36, 0xcc, 0x11, 0x21, 0xcd, 0xa5, 0xe4, 0x77, 0x3e,
+ 0xca, 0xae, 0x06, 0x8a, 0x57, 0x36, 0xf1, 0xd4, 0x3f, 0x20, 0x1c, 0x3d,
+ 0x47, 0x9d, 0x2e, 0x13, 0x53, 0xf9, 0xb0, 0xf9, 0x33, 0x6e, 0x46, 0xcd,
+ 0xf2, 0x89, 0x77, 0x3b, 0xad, 0xe7, 0x3d, 0x1c, 0x95, 0x29, 0x48, 0x16,
+ 0x23, 0xa2, 0x22, 0x87, 0xe6, 0x31, 0x68, 0xd1, 0xd1, 0xa1, 0x6f, 0xe9,
+ 0x5a, 0xc3, 0x24, 0xc5, 0x40, 0x9a, 0x74, 0xc1, 0x80, 0x0b, 0xc5, 0xf6,
+ 0x32, 0x1d, 0x5c, 0xf4, 0x28, 0x3f, 0x57, 0x3e, 0x87, 0x93, 0xd5, 0x82,
+ 0x23, 0x77, 0xa9, 0x95, 0x3a, 0x01, 0x55, 0x87, 0x72, 0xf5, 0xe7, 0x10,
+ 0x6f, 0x10, 0xf8, 0x18, 0x69, 0x95, 0x08, 0x3c, 0xa8, 0xe1, 0x65, 0x88,
+ 0x4d, 0xbd, 0x2a, 0x9c, 0x61, 0xb9, 0x26, 0x1e, 0x98, 0x98, 0x88, 0x8c,
+ 0x62, 0x47, 0x37, 0x0b, 0x4d, 0xd0, 0xe6, 0x1b, 0x9d, 0x13, 0xf3, 0xcf,
+ 0xe1, 0xdb, 0x3b, 0xe6, 0xcc, 0x92, 0x85, 0xc3, 0xba, 0x68, 0xfd, 0xc8,
+ 0x90, 0xa8, 0xd5, 0x23, 0xd2, 0xe5, 0x90, 0x8b, 0x54, 0xc7, 0x8f, 0x45,
+ 0x17, 0xb7, 0x33, 0x30, 0xca, 0x67, 0x3a, 0x61, 0x9f, 0x70, 0xf4, 0xc5,
+ 0xa1, 0xae, 0x62, 0x3a, 0x1b, 0xb9, 0x5c, 0x0d, 0x40, 0x18, 0xab, 0x6b,
+ 0x37, 0x43, 0xf9, 0xec, 0xe4, 0x4f, 0xb7, 0x3f, 0x99, 0xfe, 0xaa, 0x5d,
+ 0x23, 0x27, 0x88, 0x44, 0xef, 0xd3, 0xcb, 0xfb, 0x3b, 0xc4, 0xcb, 0x78,
+ 0x72, 0x7c, 0x70, 0x03, 0x1b, 0xa8, 0xf7, 0xe9, 0xda, 0xc4, 0xee, 0x9a,
+ 0x79, 0xbb, 0x8a, 0xc6, 0x59, 0xd6, 0x51, 0x67, 0xd7, 0xf6, 0xcb, 0x61,
+ 0x8d, 0xe0, 0xf2, 0xaf, 0xa7, 0x8c, 0xa9, 0x4c, 0x9c, 0x6f, 0xec, 0x2c,
+ 0x33, 0x44, 0x85, 0x1f, 0x36, 0xdc, 0xc7, 0x47, 0xdd, 0xe0, 0x9c, 0xec,
+ 0xf0, 0xaf, 0xf2, 0x2f, 0x88, 0x45, 0x89, 0xf9, 0xd2, 0xc7, 0xba, 0xce,
+ 0x57, 0x24, 0x3d, 0x74, 0xa0, 0x8d, 0xe7, 0x4d, 0x7b, 0xa3, 0xda, 0x67,
+ 0x72, 0x29, 0x32, 0x0d, 0x3b, 0x6b, 0x74, 0xf7, 0xaa, 0xa3, 0x81, 0x8d,
+ 0x0b, 0x25, 0xfa, 0xd2, 0xbc, 0xb7, 0xb1, 0xa6, 0x33, 0xc5, 0xf8, 0x05,
+ 0x26, 0xb6, 0xdf, 0x96, 0x18, 0xd5, 0xf3, 0xab, 0xac, 0x20, 0x54, 0x95,
+ 0x0a, 0xb9, 0x29, 0x34, 0x5f, 0xd4, 0xc4, 0xdd, 0x5b, 0xb4, 0x60, 0xaf,
+ 0xe2, 0x87, 0xf9, 0x1b, 0x96, 0xd0, 0x75, 0x4a, 0x68, 0xcc, 0x4f, 0xef,
+ 0x48, 0x3a, 0x97, 0x4c, 0xa6, 0x57, 0x89, 0x9d, 0xfc, 0x36, 0x8b, 0x3a,
+ 0xb8, 0xa5, 0x20, 0x19, 0xf8, 0x98, 0x45, 0xb4, 0x48, 0xfc, 0xc8, 0xca,
+ 0xf7, 0x26, 0x1d, 0x57, 0xd2, 0xe7, 0x41, 0x86, 0x8e, 0x38, 0x9b, 0xb2,
+ 0x25, 0xf3, 0xfd, 0x26, 0x4d, 0xf6, 0x42, 0x69, 0x7d, 0x49, 0x8b, 0xbf,
+ 0x4d, 0x9f, 0xf7, 0x21, 0xcf, 0x2b, 0xbe, 0x63, 0x7e, 0xdc, 0x3e, 0x15,
+ 0xc9, 0x6f, 0x54, 0xf6, 0x21, 0x57, 0xcc, 0xb5, 0x4a, 0x0c, 0x6d, 0x67,
+ 0xcd, 0xff, 0xb2, 0xe1, 0x40, 0x57, 0x03, 0x8a, 0x57, 0xec, 0x97, 0x08,
+ 0x3b, 0xfe, 0xa9, 0xeb, 0x35, 0xaf, 0x11, 0x58, 0xcd, 0x42, 0x4e, 0xa0,
+ 0x6b, 0xf3, 0xb6, 0x30, 0x6a, 0xf0, 0xff, 0x0c, 0xe9, 0x27, 0x8c, 0x83,
+ 0x0f, 0x90, 0xe7, 0xc5, 0x40, 0xdc, 0xa0, 0xa5, 0x4f, 0xd7, 0x93, 0x45,
+ 0x2b, 0x10, 0x08, 0xa3, 0x89, 0x8a, 0xff, 0x7d, 0x1d, 0x55, 0x84, 0x05,
+ 0x89, 0x44, 0x33, 0x0e, 0x5d, 0xd2, 0x33, 0x71, 0xf7, 0xbe, 0x3c, 0xa1,
+ 0xfc, 0xa0, 0x7e, 0xbf, 0x86, 0x02, 0xb1, 0xb9, 0xf9, 0xec, 0xd7, 0x59,
+ 0x7f, 0xb9, 0x4e, 0x6c, 0xd7, 0x4f, 0x9f, 0xb0, 0x3d, 0x5d, 0x58, 0x59,
+ 0x00, 0x82, 0xa7, 0xf5, 0xb9, 0x33, 0x17, 0x43, 0x17, 0xef, 0xcb, 0x99,
+ 0x1a, 0x08, 0x15, 0x00, 0xd3, 0x53, 0xb9, 0x95, 0xe3, 0x11, 0x15, 0x49,
+ 0x07, 0x98, 0x6f, 0x2f, 0x97, 0x81, 0xf0, 0x61, 0xa7, 0xc0, 0xbe, 0xeb,
+ 0x3a, 0x30, 0xb1, 0x40, 0x3a, 0x0b, 0x1b, 0x9d, 0x8d, 0x4e, 0x94, 0x94,
+ 0x66, 0xe0, 0x57, 0x56, 0xb0, 0xf3, 0xf2, 0xcc, 0x0e, 0x88, 0xb8, 0xc4,
+ 0xfc, 0xfb, 0x93, 0xe6, 0x08, 0xa2, 0x25, 0xbf, 0xb1, 0x57, 0x8e, 0xb4,
+ 0x4d, 0x9e, 0x97, 0x01, 0xd3, 0x15, 0xa2, 0xea, 0x3f, 0x4b, 0x97, 0x91,
+ 0xf7, 0x4e, 0xb5, 0x03, 0xd2, 0x60, 0xd7, 0xca, 0x9c, 0x67, 0x68, 0x55,
+ 0x03, 0xd1, 0xbe, 0x3d, 0xb5, 0x71, 0x9a, 0x5e, 0xea, 0x68, 0x32, 0x7c,
+ 0x3d, 0xc4, 0x73, 0xf2, 0x5c, 0x2a, 0xb2, 0x17, 0xa0, 0x37, 0x3a, 0x8b,
+ 0x8f, 0x77, 0xa7, 0xe2, 0x5f, 0x6b, 0x06, 0xa4, 0x74, 0x97, 0xaa, 0xbe,
+ 0x3b, 0x03, 0xf6, 0x0c, 0xd6, 0x3a, 0xb0, 0x5a, 0x8c, 0x60, 0xdc, 0x1a,
+ 0x5a, 0xdc, 0xfc, 0xa6, 0x8d, 0x2b, 0x99, 0x88, 0xfc, 0xb8, 0x3e, 0xf8,
+ 0x66, 0x6c, 0xa7, 0x00, 0xff, 0xcb, 0x08, 0x99, 0x9c, 0x55, 0xe9, 0xdb,
+ 0x6b, 0x48, 0x62, 0xe5, 0x75, 0x73, 0x20, 0x79, 0x06, 0xea, 0xb4, 0x34,
+ 0xac, 0x92, 0xb4, 0x05, 0xff, 0x4e, 0x08, 0xa6, 0xc4, 0x19, 0x53, 0xe6,
+ 0xcf, 0xcc, 0xc8, 0xbb, 0xa4, 0x73, 0xe9, 0xec, 0xa9, 0x8a, 0x4e, 0xef,
+ 0xc6, 0xdf, 0xd3, 0xe9, 0xe0, 0x29, 0x0d, 0xe5, 0xb1, 0xf8, 0xaf, 0x27,
+ 0xbc, 0xd1, 0xe2, 0x03, 0x73, 0x4d, 0x19, 0x11, 0x4e, 0x3d, 0x33, 0xc7,
+ 0xab, 0x87, 0xa8, 0x31, 0x73, 0xa0, 0x47, 0xd3, 0x17, 0xfa, 0x11, 0xcc,
+ 0x07, 0x87, 0x7c, 0x78, 0xae, 0xac, 0x7a, 0x77, 0x6a, 0x26, 0x99, 0x95,
+ 0xb7, 0xd3, 0x4b, 0xf1, 0xb0, 0x46, 0x53, 0xff, 0x82, 0xde, 0xb6, 0x39,
+ 0xf5, 0xde, 0x8f, 0x12, 0x91, 0x1c, 0x27, 0xd5, 0x9d, 0xf2, 0x38, 0xa7,
+ 0x80, 0x2b, 0xf2, 0xa2, 0xbf, 0x41, 0x8b, 0x89, 0xf5, 0x27, 0x8d, 0xdf,
+ 0xc0, 0x79, 0xe4, 0x66, 0x67, 0x81, 0x6c, 0xcb, 0xa6, 0xf7, 0x92, 0x2a,
+ 0xf1, 0xf5, 0x22, 0x77, 0xd7, 0xe0, 0xf8, 0xa9, 0x9f, 0x2c, 0xd4, 0x11,
+ 0x6d, 0x10, 0xd1, 0xcf, 0x93, 0x35, 0x87, 0x61, 0xad, 0x5d, 0x0b, 0x52,
+ 0x71, 0x3d, 0x4c, 0x57, 0x69, 0xfa, 0xc1, 0x9a, 0xe4, 0xba, 0xeb, 0x9f,
+ 0xd3, 0xd4, 0x07, 0x87, 0x5a, 0x43, 0x29, 0x9d, 0x73, 0xfc, 0x4b, 0x94,
+ 0x42, 0x59, 0x78, 0x16, 0x91, 0x19, 0xdd, 0xf1, 0x38, 0x04, 0xa5, 0x5b,
+ 0x7e, 0x02, 0xe1, 0x6c, 0xd9, 0xd1, 0x17, 0x85, 0xe8, 0xcb, 0x9c, 0x38,
+ 0x3c, 0xa9, 0xa6, 0x13, 0x7d, 0x0a, 0xda, 0x53, 0x1c, 0x31, 0x25, 0xd7,
+ 0x21, 0x91, 0x74, 0xf8, 0x4c, 0xcf, 0xb2, 0xc6, 0x1c, 0xc7, 0xf6, 0x90,
+ 0x96, 0x40, 0x44, 0x24, 0xfe, 0x47, 0xe0, 0xe5, 0xe6, 0x40, 0x6c, 0x47,
+ 0x21, 0xaa, 0x48, 0xcb, 0x17, 0x4b, 0x1f, 0x49, 0x31, 0x89, 0xaa, 0xc6,
+ 0x84, 0x2b, 0x42, 0x28, 0xf9, 0x45, 0x3c, 0xa8, 0xa7, 0xfa, 0x68, 0x08,
+ 0x84, 0x28, 0x9b, 0x08, 0x2d, 0xe0, 0x9e, 0x6c, 0x1c, 0xe4, 0x51, 0xc0,
+ 0x6d, 0x76, 0x35, 0x0b, 0xd2, 0x4c, 0xe6, 0x6f, 0xcf, 0xfd, 0xde, 0x51,
+ 0xbd, 0xc3, 0x60, 0xf0, 0xeb, 0x53, 0xba, 0xfd, 0x3c, 0xa7, 0xfd, 0x64,
+ 0x9a, 0xfc, 0xb4, 0xb2, 0x5b, 0x63, 0xa9, 0xd5, 0x34, 0x98, 0x23, 0x6d,
+ 0x7b, 0x8a, 0xa8, 0x9a, 0x03, 0x76, 0x9b, 0xdf, 0x9c, 0x20, 0x89, 0x78,
+ 0xf1, 0x46, 0x0f, 0x99, 0x51, 0xf0, 0x9b, 0x19, 0x12, 0xc0, 0x96, 0x64,
+ 0xf8, 0x90, 0xa0, 0x4a, 0xa9, 0xec, 0xdf, 0x8e, 0xa1, 0x2c, 0x25, 0x01,
+ 0xcd, 0x38, 0x15, 0x8b, 0x0b, 0x33, 0xec, 0xbb, 0xa2, 0x64, 0x4f, 0xd0,
+ 0x35, 0x47, 0x2f, 0x20, 0x5d, 0x3c, 0x0f, 0x20, 0xca, 0x3b, 0x6a, 0xb2,
+ 0x76, 0x7a, 0xaa, 0x9a, 0xd1, 0x83, 0xd1, 0xab, 0x07, 0xc0, 0x19, 0x97,
+ 0x83, 0xf1, 0xe5, 0xe1, 0x81, 0x70, 0x84, 0x39, 0x4c, 0x17, 0x36, 0x04,
+ 0xc0, 0x99, 0x48, 0x51, 0x2a, 0x8e, 0x80, 0x94, 0x67, 0xcd, 0x1e, 0x03,
+ 0x99, 0x9e, 0x23, 0x26, 0xbd, 0x0e, 0x4b, 0x46, 0xfc, 0x8e, 0xc4, 0x8e,
+ 0x8a, 0xc1, 0xfd, 0x7f, 0xa1, 0x11, 0x87, 0x5f, 0x03, 0x5e, 0x9f, 0x25,
+ 0xb2, 0x3f, 0xf0, 0xcd, 0xdb, 0x30, 0x20, 0x8c, 0xb6, 0x4a, 0x08, 0xf1,
+ 0x7b, 0x21, 0xd6, 0x68, 0xbe, 0x96, 0xcf, 0x17, 0x3f, 0x15, 0x10, 0x07,
+ 0xb5, 0xd2, 0x34, 0xee, 0x73, 0xcd, 0x69, 0xdb, 0x4c, 0x19, 0xc2, 0xca,
+ 0xa2, 0x96, 0x92, 0xab, 0x8f, 0x20, 0xf2, 0xf2, 0x5d, 0xe1, 0xb4, 0xfa,
+ 0x82, 0xa9, 0xd7, 0xc9, 0xb2, 0x64, 0x25, 0xbb, 0x09, 0xa6, 0x4d, 0xf8,
+ 0x12, 0x8d, 0x7c, 0x65, 0x81, 0xba, 0x6c, 0x5f, 0x5b, 0x72, 0x04, 0x67,
+ 0x51, 0x66, 0xbb, 0xb6, 0x5c, 0x83, 0x6d, 0xc1, 0x18, 0xde, 0x84, 0x4a,
+ 0x9d, 0xb6, 0x46, 0x9f, 0xa5, 0x6f, 0x0a, 0x97, 0x5c, 0x16, 0xe7, 0x24,
+ 0x54, 0x3a, 0x12, 0xbd, 0x76, 0xec, 0xd7, 0x14, 0x8a, 0x0e, 0xed, 0xb8,
+ 0xc9, 0xf6, 0x2c, 0x58, 0x49, 0x1a, 0x4a, 0x5a, 0xaf, 0xb8, 0xfb, 0x0a,
+ 0xe5, 0x0f, 0xfd, 0x63, 0xbb, 0x21, 0x81, 0xdf, 0x9d, 0x14, 0x55, 0x46,
+ 0x30, 0x28, 0x47, 0x11, 0x1d, 0x2b, 0xc5, 0x81, 0xa0, 0x41, 0xdb, 0x3b,
+ 0xfe, 0xb6, 0xe7, 0xe6, 0x9d, 0xa4, 0xe0, 0xda, 0x45, 0x04, 0xe4, 0x2d,
+ 0x88, 0x60, 0x14, 0xc1, 0xe3, 0xb4, 0xc0, 0x16, 0xa6, 0x22, 0x4f, 0x55,
+ 0x26, 0x6e, 0x67, 0x73, 0xf1, 0x42, 0x9a, 0x2f, 0xbe, 0x46, 0xd5, 0x35,
+ 0xe6, 0x28, 0x98, 0xa4, 0x20, 0x85, 0x54, 0x4f, 0x17, 0x09, 0xa1, 0x75,
+ 0x73, 0xd5, 0x6b, 0xc8, 0x79, 0xc2, 0x63, 0xd3, 0xe0, 0x03, 0x5c, 0x6b,
+ 0x97, 0x9d, 0x41, 0x48, 0xff, 0x7d, 0x50, 0xba, 0x88, 0x62, 0xc9, 0x6c,
+ 0x8c, 0x39, 0x29, 0x91, 0x3f, 0xd0, 0xa7, 0x9c, 0x06, 0x17, 0x13, 0x41,
+ 0x43, 0x37, 0x12, 0xf2, 0x4b, 0xf4, 0x3d, 0xca, 0x63, 0xf1, 0x60, 0xf2,
+ 0xb0, 0xe0, 0x17, 0xc6, 0x13, 0x00, 0x35, 0x2a, 0x2e, 0xc7, 0x50, 0x19,
+ 0x80, 0x41, 0x26, 0x8b, 0xf9, 0x77, 0xab, 0x44, 0xd0, 0x53, 0x5e, 0xb1,
+ 0x16, 0xd2, 0x61, 0xdc, 0xad, 0xe9, 0xd1, 0x18, 0x54, 0x52, 0xa4, 0xe2,
+ 0x70, 0xee, 0xb0, 0x3e, 0x25, 0x95, 0x61, 0xe3, 0x4f, 0xfa, 0x1a, 0xd1,
+ 0xb0, 0xef, 0x93, 0xba, 0xff, 0xc7, 0x0c, 0x53, 0xfa, 0x8e, 0x51, 0x87,
+ 0x18, 0xf4, 0x9b, 0x59, 0x5f, 0xec, 0x16, 0x0a, 0xb8, 0x45, 0xf4, 0x12,
+ 0x18, 0xdb, 0x75, 0xd3, 0x61, 0x7d, 0xc2, 0x44, 0xf9, 0xdd, 0x21, 0x50,
+ 0xea, 0xde, 0x04, 0x5d, 0x59, 0x82, 0xbf, 0x1a, 0xbb, 0x07, 0xf6, 0x32,
+ 0x66, 0x00, 0x46, 0x1e, 0x1e, 0x62, 0x90, 0xb0, 0x63, 0x45, 0xe7, 0x40,
+ 0x83, 0xb3, 0x9e, 0x81, 0xa8, 0x0e, 0x6f, 0x3f, 0xbf, 0x50, 0x36, 0xcb,
+ 0x07, 0x2c, 0x0a, 0xb2, 0xe5, 0x15, 0x27, 0xb2, 0x02, 0x96, 0x30, 0x36,
+ 0x89, 0x87, 0xd6, 0x82, 0x13, 0xb9, 0xcb, 0x77, 0x78, 0xc2, 0xf2, 0xa6,
+ 0xdd, 0xa2, 0xa3, 0x9a, 0xc8, 0xdc, 0xb5, 0x99, 0x3f, 0x3d, 0x68, 0x99,
+ 0xd9, 0x31, 0xa6, 0xf6, 0x9c, 0xd2, 0x67, 0x19, 0xd8, 0x2c, 0x01, 0xb7,
+ 0xc6, 0xa8, 0xa1, 0xc5, 0x5a, 0x41, 0x08, 0xee, 0xe8, 0x2f, 0x9b, 0x9e,
+ 0xfc, 0x91, 0xd4, 0x4b, 0x04, 0x03, 0x3e, 0xbf, 0x9b, 0x90, 0x5c, 0x73,
+ 0xc4, 0x55, 0x43, 0x7e, 0x08, 0x8e, 0x63, 0x4c, 0xd0, 0xd0, 0xc8, 0x74,
+ 0x40, 0x9d, 0x4a, 0x41, 0x67, 0x4b, 0xc9, 0x27, 0xdb, 0xef, 0x44, 0x79,
+ 0xeb, 0x05, 0x86, 0x53, 0xcd, 0x95, 0x5b, 0x43, 0xab, 0x31, 0xf4, 0xd3,
+ 0x50, 0xda, 0x40, 0xfe, 0x6b, 0x9d, 0x85, 0x7f, 0xf8, 0x00, 0x28, 0xce,
+ 0x66, 0x72, 0xbe, 0x3e, 0xc1, 0xc4, 0xfc, 0x85, 0x6a, 0x61, 0x1e, 0xab,
+ 0x7e, 0xb6, 0xc8, 0xc4, 0xa4, 0x6f, 0x16, 0xd4, 0x56, 0xf4, 0xaa, 0x34,
+ 0x12, 0xdf, 0x94, 0x31, 0xce, 0xaf, 0x43, 0x63, 0x8f, 0x1d, 0xe4, 0x4b,
+ 0xc4, 0xba, 0x5e, 0x7f, 0x6d, 0x75, 0x73, 0x24, 0x09, 0x45, 0xa7, 0x5f,
+ 0x59, 0x40, 0x1a, 0x0e, 0x63, 0xe0, 0x86, 0xb3, 0xe7, 0x88, 0xec, 0x97,
+ 0xb7, 0x36, 0x7f, 0xd5, 0x91, 0x78, 0x23, 0x3e, 0x60, 0xdb, 0xae, 0x7f,
+ 0xc6, 0x8c, 0x43, 0xfb, 0x99, 0xe6, 0xc8, 0xd3, 0xc3, 0xd6, 0xb4, 0x99,
+ 0xb7, 0xaa, 0xcc, 0xd0, 0xb2, 0x48, 0x97, 0xc7, 0x2e, 0x77, 0x21, 0x93,
+ 0x32, 0x9a, 0x4a, 0x62, 0x2a, 0xa3, 0x59, 0x5a, 0x39, 0x6a, 0x2f, 0xaf,
+ 0xec, 0x42, 0xbd, 0xdd, 0x70, 0x0f, 0xeb, 0x27, 0x0a, 0xc2, 0x92, 0x15,
+ 0xe5, 0x7e, 0xf5, 0x8f, 0x85, 0x30, 0xd9, 0x7d, 0x3f, 0xa5, 0x9e, 0x2a,
+ 0x3f, 0xd3, 0x82, 0x23, 0x2c, 0x9a, 0x6a, 0xf0, 0x4b, 0xf9, 0x87, 0xde,
+ 0x5e, 0xe7, 0x8f, 0x8d, 0x8f, 0x6b, 0x77, 0xc3, 0x62, 0x81, 0x2d, 0x68,
+ 0x8a, 0x90, 0x80, 0x56, 0x4e, 0x30, 0xbc, 0xef, 0x22, 0xbd, 0x24, 0x72,
+ 0xb4, 0xf3, 0x65, 0x01, 0x01, 0xf6, 0xb0, 0xbe, 0x7a, 0x76, 0x87, 0xb9,
+ 0xc3, 0xbe, 0x3c, 0x99, 0x76, 0x93, 0xe2, 0x5b, 0x58, 0x88, 0xae, 0x59,
+ 0xfb, 0x13, 0x7f, 0x5b, 0xf0, 0x79, 0xd6, 0xd1, 0x27, 0x21, 0x14, 0x5e,
+ 0x18, 0x21, 0x02, 0xb9, 0xe5, 0x51, 0x7c, 0x87, 0xb0, 0x82, 0xa7, 0x8d,
+ 0x06, 0x6f, 0x94, 0x01, 0x64, 0x72, 0x35, 0xc3, 0x37, 0x5a, 0xae, 0x51,
+ 0x87, 0x54, 0xcd, 0xd3, 0x8f, 0x62, 0x8c, 0xc9, 0xf7, 0x17, 0xe6, 0x40,
+ 0x39, 0x0f, 0x9b, 0x9f, 0x2a, 0x5c, 0xe2, 0x29, 0x84, 0x54, 0xcb, 0xd5,
+ 0x72, 0xac, 0x37, 0x0e, 0xbf, 0x56, 0x77, 0x6d, 0xdb, 0x96, 0x63, 0xa0,
+ 0xad, 0xfe, 0xc8, 0x6a, 0x57, 0xd1, 0x21, 0x63, 0x42, 0x7a, 0xe1, 0x40,
+ 0x5a, 0x47, 0x75, 0xb7, 0xd1, 0x7a, 0x5b, 0xde, 0x69, 0x57, 0x90, 0xff,
+ 0xcb, 0x0b, 0x30, 0xf5, 0xda, 0xab, 0xa6, 0x07, 0xf9, 0xd7, 0x80, 0x1d,
+ 0xe4, 0xe1, 0xf1, 0x79, 0x28, 0xe3, 0xfe, 0x7a, 0x3a, 0xd3, 0xb3, 0x44,
+ 0x7e, 0x4d, 0xaf, 0x0a, 0x22, 0x89, 0x54, 0x0d, 0x12, 0x44, 0xdc, 0xb0,
+ 0x07, 0xa0, 0xd4, 0x24, 0x7f, 0xc5, 0xad, 0x6c, 0x53, 0x5c, 0x2a, 0x50,
+ 0x8d, 0x6a, 0x74, 0x30, 0x09, 0x14, 0x2c, 0x09, 0x9d, 0x30, 0xb5, 0xc8,
+ 0x09, 0x3b, 0x22, 0xb8, 0xe9, 0x41, 0xe6, 0x3d, 0x73, 0x15, 0xb7, 0xa3,
+ 0x6d, 0xb7, 0xad, 0x3d, 0xeb, 0xad, 0x97, 0x15, 0xb9, 0xc2, 0x19, 0x0f,
+ 0xb2, 0x50, 0xde, 0xab, 0x4d, 0x05, 0xb4, 0x6a, 0x4a, 0x01, 0x65, 0xb0,
+ 0x6e, 0xa5, 0x7c, 0xab, 0x15, 0xc0, 0xb1, 0x7d, 0xdf, 0x38, 0x08, 0xf9,
+ 0x89, 0x71, 0x42, 0x11, 0x0c, 0xcf, 0x79, 0x73, 0x46, 0x33, 0x0d, 0x14,
+ 0x4e, 0xf4, 0x55, 0x47, 0x02, 0x7f, 0x91, 0xeb, 0xa5, 0x23, 0xad, 0xf9,
+ 0xe6, 0xfc, 0x22, 0xc3, 0x05, 0x38, 0xdf, 0x72, 0xf5, 0x16, 0x6e, 0x45,
+ 0xc1, 0xac, 0x60, 0x50, 0x8d, 0xaa, 0x29, 0x0c, 0x7e, 0x39, 0x21, 0xeb,
+ 0x8b, 0x45, 0x76, 0x60, 0xb7, 0x98, 0x9a, 0x2e, 0x7c, 0xa0, 0x71, 0xb4,
+ 0x38, 0x3b, 0x41, 0xea, 0xdf, 0x1a, 0x17, 0x5e, 0x13, 0xbe, 0x11, 0x72,
+ 0x66, 0x1f, 0xad, 0x54, 0xd9, 0xee, 0x4d, 0xef, 0x6a, 0x32, 0x5f, 0x14,
+ 0x3f, 0x3b, 0xf4, 0x23, 0x67, 0xa6, 0x12, 0x72, 0x69, 0xd5, 0x62, 0x9e,
+ 0xd5, 0xe5, 0xec, 0x4b, 0x7a, 0x4b, 0x96, 0xde, 0xcc, 0x90, 0x9e, 0xbd,
+ 0x40, 0xbb, 0x8b, 0xa6, 0x38, 0xd4, 0x37, 0x22, 0x7e, 0x0f, 0x86, 0x43,
+ 0x94, 0x3b, 0x72, 0xb7, 0x00, 0x0f, 0x5a, 0x62, 0x6d, 0x87, 0xd1, 0xb1,
+ 0xdf, 0x2a, 0x3e, 0xda, 0x1c, 0x86, 0x2c, 0x08, 0xf1, 0x81, 0x18, 0xf9,
+ 0x20, 0x51, 0x3b, 0x68, 0x1e, 0x7d, 0x04, 0xc0, 0x04, 0x29, 0xad, 0x63,
+ 0xe9, 0x03, 0xcf, 0x73, 0x5d, 0x27, 0x2e, 0xa5, 0x49, 0xe9, 0x57, 0xe1,
+ 0x9a, 0x89, 0x2f, 0x52, 0xa8, 0x9b, 0x56, 0x66, 0xa0, 0x54, 0xd3, 0x1b,
+ 0x06, 0x70, 0x5f, 0x07, 0xc9, 0x5b, 0x56, 0xf0, 0xa9, 0xd6, 0x5f, 0x9b,
+ 0xd0, 0x7b, 0x59, 0x98, 0xa1, 0x3f, 0xf3, 0x32, 0x9d, 0xda, 0x64, 0xa0,
+ 0xbb, 0x33, 0x82, 0x69, 0x61, 0x1e, 0xc3, 0xb7, 0xab, 0x88, 0xe7, 0x40,
+ 0xb6, 0x07, 0x41, 0x6c, 0x96, 0x4d, 0xda, 0x95, 0x05, 0x30, 0x15, 0x69,
+ 0xc1, 0xdb, 0x8e, 0xda, 0x04, 0xff, 0x26, 0x19, 0xbe, 0x7a, 0x53, 0xcf,
+ 0xe1, 0xab, 0x95, 0x24, 0xb6, 0xcb, 0xd0, 0xd8, 0xa8, 0x8e, 0x56, 0x9c,
+ 0x38, 0x69, 0xb9, 0x80, 0x73, 0xbc, 0xde, 0xbd, 0xf6, 0xde, 0xd2, 0xd1,
+ 0x95, 0x01, 0x55, 0x51, 0x56, 0x13, 0x25, 0xf2, 0x43, 0x6b, 0x88, 0xc0,
+ 0xd2, 0x32, 0x01, 0xb6, 0x05, 0x10, 0x57, 0x44, 0x89, 0x06, 0x9e, 0x19,
+ 0xf9, 0x04, 0x8a, 0xff, 0xb9, 0x6c, 0xb3, 0x10, 0x13, 0x4e, 0x49, 0xae,
+ 0xfe, 0x8b, 0xb0, 0xe4, 0xc3, 0xdb, 0xf9, 0x00, 0x84, 0xc1, 0x3f, 0x48,
+ 0x18, 0xd9, 0x3f, 0xb8, 0x53, 0x31, 0xa9, 0x62, 0xdd, 0x61, 0x54, 0xd0,
+ 0xd5, 0x32, 0x3e, 0xad, 0x02, 0x47, 0xc5, 0x28, 0x51, 0x50, 0xa6, 0x0e,
+ 0xb8, 0x94, 0xee, 0x03, 0x47, 0xae, 0x4c, 0x3b, 0x43, 0x5b, 0xd6, 0x4c,
+ 0x49, 0x3e, 0x65, 0xbc, 0xfc, 0x7f, 0x35, 0xfc, 0x4a, 0xdd, 0xda, 0xb3,
+ 0x33, 0x76, 0xf2, 0x08, 0xb7, 0x54, 0xc7, 0x28, 0x1a, 0xc1, 0xa8, 0xe8,
+ 0xf4, 0x35, 0xd3, 0xd4, 0x29, 0x1d, 0xe5, 0x68, 0x42, 0x1a, 0x22, 0x69,
+ 0x63, 0xe9, 0x72, 0x54, 0xcd, 0x93, 0xde, 0x93, 0xba, 0x4f, 0xa6, 0x2d,
+ 0x05, 0xaa, 0x53, 0x99, 0xbc, 0x29, 0x15, 0x3b, 0xbe, 0xba, 0x37, 0x09,
+ 0x12, 0xe7, 0xf3, 0x2a, 0x8f, 0x51, 0x11, 0x1a, 0x71, 0x3c, 0xb9, 0x46,
+ 0x05, 0x22, 0xd6, 0x3a, 0xe3, 0x2e, 0xc5, 0x04, 0x81, 0x4e, 0x0e, 0x6e,
+ 0xad, 0x83, 0xa7, 0x20, 0x6b, 0xcc, 0x7a, 0x92, 0x8b, 0x3e, 0xf8, 0x67,
+ 0x69, 0x59, 0x16, 0x1e, 0xe1, 0x24, 0xbe, 0xbc, 0x4a, 0x0d, 0x80, 0x06,
+ 0xcd, 0x77, 0x89, 0x14, 0x64, 0xbf, 0x5b, 0x2a, 0x35, 0x09, 0xe3, 0x86,
+ 0x73, 0x90, 0xc3, 0x2d, 0xff, 0x1a, 0xc9, 0x83, 0x6e, 0x5d, 0xd9, 0xea,
+ 0xa2, 0xf1, 0xc0, 0xe6, 0x26, 0xa4, 0xc7, 0x9c, 0xd9, 0x61, 0xa8, 0xa8,
+ 0xa9, 0xfe, 0xfd, 0xf3, 0xdd, 0x86, 0x18, 0x57, 0xe9, 0x4d, 0xec, 0x0e,
+ 0x26, 0x49, 0xe5, 0xaa, 0x9e, 0x14, 0xc5, 0xfe, 0xbb, 0xdc, 0x3c, 0x8d,
+ 0x3b, 0x47, 0xb3, 0xd9, 0xe1, 0x0d, 0x8d, 0x2a, 0xb6, 0xff, 0xaa, 0xcc,
+ 0x5c, 0xd2, 0x21, 0xea, 0xa7, 0x1d, 0x97, 0xd7, 0xd1, 0xa9, 0xa7, 0x27,
+ 0x98, 0x4f, 0x89, 0x11, 0xb6, 0xc9, 0x51, 0x8e, 0x49, 0xef, 0xb3, 0x0c,
+ 0x7e, 0x59, 0xb1, 0x8e, 0x0e, 0xb1, 0x1b, 0x67, 0x5c, 0x29, 0xf9, 0x92,
+ 0x77, 0x11, 0x8f, 0x34, 0x8e, 0xb2, 0x1c, 0x02, 0xab, 0x55, 0x8c, 0x71,
+ 0xcb, 0xeb, 0x63, 0xfe, 0x3b, 0x96, 0x5c, 0x5f, 0x0b, 0xa7, 0xc8, 0xfc,
+ 0x02, 0xdf, 0x77, 0x29, 0x81, 0x93, 0x78, 0x40, 0xf9, 0xb9, 0x3a, 0x53,
+ 0xd5, 0x5c, 0x75, 0x39, 0xa1, 0x0e, 0x24, 0x42, 0x15, 0x95, 0xfc, 0x10,
+ 0xbc, 0x2f, 0xbf, 0xb5, 0xb5, 0x02, 0xaf, 0xdf, 0x0b, 0x8d, 0xdf, 0x06,
+ 0x5e, 0x89, 0xab, 0x10, 0xe8, 0x2d, 0x48, 0x6a, 0x3f, 0x20, 0x9f, 0x52,
+ 0x1d, 0x82, 0xab, 0x31, 0xfb, 0xeb, 0x86, 0xe1, 0xb2, 0x8b, 0x16, 0x9c,
+ 0xdd, 0xa9, 0x19, 0xb7, 0xbc, 0xe4, 0x1f, 0x7a, 0x95, 0x87, 0x22, 0xac,
+ 0x85, 0x66, 0x18, 0x5a, 0x56, 0xc5, 0x9f, 0xb3, 0xf2, 0x7b, 0x1e, 0x3e,
+ 0x61, 0xb5, 0x19, 0x04, 0x11, 0xe6, 0xe7, 0x43, 0x78, 0x2a, 0x3b, 0x3b,
+ 0x34, 0x71, 0x6a, 0x74, 0x2b, 0xb7, 0x03, 0x50, 0xe3, 0x76, 0x1c, 0x4a,
+ 0xf2, 0xda, 0xd6, 0x79, 0x69, 0x78, 0x20, 0xff, 0x44, 0xd3, 0x7f, 0x04,
+ 0x82, 0x70, 0x5e, 0x80, 0xf2, 0x5a, 0x22, 0xc0, 0xf4, 0x61, 0x65, 0x92,
+ 0x7f, 0xc7, 0x86, 0xa9, 0xe5, 0xf6, 0x67, 0x30, 0xfc, 0x59, 0x60, 0xb2,
+ 0xff, 0x17, 0xc0, 0xef, 0xd6, 0xec, 0xdb, 0xfe, 0xbf, 0x9e, 0xa6, 0x86,
+ 0x83, 0x6e, 0xa9, 0xdc, 0xd2, 0xf5, 0x61, 0x06, 0xd5, 0xe2, 0x74, 0x83,
+ 0x9d, 0x36, 0x80, 0xe7, 0xb0, 0xa9, 0x5f, 0xdc, 0x2e, 0x33, 0x99, 0x0e,
+ 0xa4, 0xd7, 0xae, 0xaf, 0x4e, 0x67, 0xa1, 0x1e, 0x3b, 0x1c, 0x9e, 0x57,
+ 0x12, 0xd0, 0xe5, 0x87, 0x6a, 0xa3, 0xea, 0xf1, 0x40, 0x64, 0x9b, 0x7a,
+ 0x20, 0x6b, 0x9d, 0xb0, 0x75, 0xf2, 0x16, 0x5f, 0x57, 0x0f, 0xa7, 0xfe,
+ 0x5c, 0x16, 0x0a, 0xd4, 0x7d, 0x19, 0x8f, 0x69, 0xb2, 0x42, 0x70, 0x90,
+ 0xca, 0x56, 0x04, 0xb7, 0x60, 0x8f, 0xa8, 0x32, 0x1a, 0xf5, 0x30, 0x87,
+ 0x7d, 0x2f, 0x0e, 0xd9, 0xec, 0x24, 0x7c, 0xae, 0xdf, 0x16, 0x88, 0xf8,
+ 0x89, 0x1a, 0x47, 0xb6, 0xd9, 0x3b, 0x6f, 0xda, 0xdc, 0x56, 0x42, 0x5a,
+ 0xe6, 0xbe, 0xfe, 0x5d, 0x91, 0x70, 0x2e, 0xe7, 0x5c, 0x78, 0x57, 0x16,
+ 0xb8, 0xfe, 0x97, 0x30, 0x0d, 0x6f, 0xe8, 0x62, 0xa0, 0xa3, 0x25, 0xa6,
+ 0x96, 0x46, 0x87, 0xaa, 0xa7, 0x8f, 0xdf, 0x84, 0x6d, 0x28, 0x43, 0x6a,
+ 0xea, 0x7a, 0xe4, 0x10, 0xb1, 0x03, 0xcb, 0xbf, 0xb8, 0x4a, 0x89, 0x53,
+ 0xbe, 0xb7, 0xac, 0xbd, 0x98, 0x71, 0xad, 0x72, 0xb4, 0xd1, 0x74, 0xb2,
+ 0xeb, 0x83, 0x65, 0x32, 0x33, 0x8b, 0x1a, 0xfe, 0xb7, 0x95, 0x1e, 0x38,
+ 0xa7, 0xf9, 0xa5, 0x21, 0x52, 0x3f, 0x8c, 0xeb, 0x98, 0x5d, 0xce, 0x5d,
+ 0x1e, 0x45, 0xdd, 0xd5, 0xae, 0x62, 0x43, 0xab, 0x45, 0x2d, 0xaa, 0xfb,
+ 0x6d, 0x52, 0xdc, 0x43, 0xc2, 0x60, 0x11, 0xdd, 0x3f, 0x1b, 0x00, 0xec,
+ 0x88, 0x50, 0x9f, 0x39, 0xf1, 0xa8, 0x0a, 0xa4, 0x4c, 0xea, 0xd2, 0xe5,
+ 0x18, 0x0b, 0x19, 0x9e, 0xc2, 0x08, 0x0f, 0x5b, 0x2e, 0x44, 0x4c, 0xa7,
+ 0xe1, 0xd5, 0x72, 0x56, 0xba, 0xad, 0x7a, 0x06, 0xb6, 0x06, 0x1b, 0xff,
+ 0xe4, 0x85, 0x3d, 0xf9, 0x7e, 0x08, 0x8b, 0x71, 0x7d, 0x4b, 0x85, 0x8f,
+ 0x6a, 0x12, 0x20, 0x2e, 0x5c, 0x1c, 0x7e, 0xc8, 0xc6, 0xee, 0x5c, 0x8f,
+ 0x01, 0x6b, 0x68, 0x63, 0xc0, 0xfb, 0x87, 0x5e, 0x02, 0x29, 0x3f, 0x72,
+ 0x20, 0x3f, 0x4e, 0x32, 0x2c, 0x41, 0xdf, 0x59, 0x8c, 0xec, 0x8e, 0x9a,
+ 0x96, 0x46, 0xb6, 0x41, 0xe2, 0x25, 0xbc, 0x85, 0xef, 0xd4, 0xed, 0x60,
+ 0xf7, 0x52, 0xc2, 0xa3, 0x81, 0xe7, 0x2d, 0xbb, 0x25, 0xaa, 0x14, 0x2d,
+ 0x6c, 0xe2, 0x9d, 0xad, 0x63, 0xc6, 0x03, 0x3c, 0x94, 0x75, 0x8e, 0x92,
+ 0x39, 0x55, 0x89, 0xb0, 0xb3, 0x5f, 0x00, 0x85, 0xb5, 0xc9, 0x6b, 0x8f,
+ 0xc6, 0x05, 0xd4, 0xc5, 0x01, 0xc9, 0x82, 0xd2, 0x25, 0x86, 0x4e, 0x7a,
+ 0x11, 0xdc, 0xaf, 0x99, 0xcc, 0xb4, 0x02, 0x55, 0x45, 0xe5, 0xe5, 0x21,
+ 0x5c, 0xff, 0xf0, 0xaa, 0x98, 0xc1, 0xf2, 0xce, 0xeb, 0x98, 0xdd, 0x9c,
+ 0xf2, 0xd6, 0xc0, 0xa2, 0xae, 0x0e, 0xf4, 0x26, 0x3f, 0xfc, 0x5a, 0xb0,
+ 0xa1, 0xb3, 0x66, 0xa7, 0x9e, 0x3d, 0xca, 0x0e, 0xc6, 0x4e, 0x63, 0x81,
+ 0xca, 0x82, 0xa9, 0x59, 0xaf, 0x26, 0x98, 0x75, 0x81, 0x77, 0x50, 0x0a,
+ 0x82, 0x77, 0x68, 0x29, 0x40, 0x35, 0x30, 0x6c, 0xe7, 0xb6, 0x40, 0x72,
+ 0xeb, 0x40, 0x27, 0xb0, 0x14, 0x2e, 0x37, 0x4b, 0x21, 0x17, 0x91, 0xd8,
+ 0x88, 0x32, 0x8b, 0x3a, 0xd3, 0x17, 0xea, 0x51, 0x88, 0xbc, 0x7a, 0xeb,
+ 0xa2, 0x5a, 0x72, 0x7d, 0xff, 0x6e, 0x4f, 0x07, 0xc6, 0xc0, 0x0c, 0x20,
+ 0x69, 0x2e, 0xdd, 0xa0, 0x1f, 0xec, 0xc7, 0x77, 0x31, 0xcb, 0x76, 0x3c,
+ 0x1f, 0xff, 0x08, 0xcb, 0x35, 0x20, 0xe7, 0xed, 0xb9, 0xfb, 0x3e, 0xb0,
+ 0x33, 0xbb, 0x7a, 0x90, 0x8a, 0x90, 0x08, 0x7a, 0xd3, 0x63, 0xa3, 0x59,
+ 0xe3, 0x28, 0xcc, 0xa0, 0x2a, 0xd3, 0x39, 0xc9, 0x11, 0x54, 0xac, 0xaa,
+ 0x54, 0xa7, 0x77, 0x1a, 0xf9, 0x2e, 0x28, 0x6b, 0x18, 0x3c, 0x45, 0x31,
+ 0x90, 0xfc, 0x1e, 0xdd, 0xf2, 0xff, 0x55, 0xec, 0xb3, 0x6d, 0x50, 0xec,
+ 0x5e, 0xad, 0x2b, 0x2e, 0x66, 0x2e, 0x47, 0x0f, 0x8c, 0x6d, 0xe5, 0xb0,
+ 0x6c, 0x06, 0xea, 0x34, 0x5d, 0x8f, 0xda, 0x89, 0x3f, 0xb7, 0xbc, 0x11,
+ 0x18, 0xee, 0x1b, 0x31, 0x6f, 0x89, 0x41, 0x22, 0xa9, 0x12, 0xed, 0xea,
+ 0xf5, 0x71, 0x76, 0xf0, 0xda, 0x07, 0xff, 0xd9, 0x0c, 0xed, 0x64, 0x48,
+ 0x80, 0xee, 0x7b, 0xf4, 0x71, 0x65, 0x37, 0x5e, 0x1a, 0x72, 0xbf, 0x2e,
+ 0xa5, 0xb6, 0xdb, 0x74, 0xdf, 0xf2, 0x65, 0xba, 0xa0, 0x03, 0x5e, 0x41,
+ 0x48, 0xeb, 0xfa, 0xac, 0x70, 0xd6, 0x54, 0xeb, 0xe7, 0x0b, 0x4e, 0x76,
+ 0xbb, 0xc2, 0x12, 0x1f, 0x43, 0x33, 0x36, 0x1d, 0xef, 0xd7, 0xab, 0x52,
+ 0xf6, 0x51, 0xe5, 0xe8, 0x19, 0x9d, 0x9f, 0xaa, 0xe7, 0x1e, 0x0c, 0x4e,
+ 0x95, 0x52, 0x99, 0x8c, 0xf3, 0x8d, 0x03, 0xf2, 0xa4, 0xf6, 0x1c, 0x7a,
+ 0x4b, 0xfe, 0x0c, 0x4c, 0x75, 0x55, 0x52, 0x3b, 0x17, 0x45, 0xe0, 0x81,
+ 0xf2, 0xb8, 0x3e, 0x44, 0x0e, 0x2c, 0xd2, 0xf4, 0x23, 0x44, 0x88, 0x7b,
+ 0xc4, 0xf6, 0x4f, 0x72, 0x11, 0x69, 0x6f, 0x59, 0x46, 0x99, 0x7d, 0x45,
+ 0x58, 0xeb, 0x52, 0x84, 0x3b, 0x22, 0x1c, 0x7f, 0xef, 0xaa, 0xc2, 0xb7,
+ 0x69, 0xcd, 0x1e, 0x7d, 0xf1, 0xcd, 0x85, 0x63, 0xb0, 0x54, 0x44, 0x1b,
+ 0x5d, 0x98, 0xb9, 0x61, 0xa1, 0xa3, 0x12, 0x20, 0xab, 0xdd, 0xaa, 0xa3,
+ 0xd3, 0x31, 0x11, 0x82, 0x8a, 0x02, 0xe5, 0x12, 0x7a, 0x1e, 0xc4, 0x3e,
+ 0x72, 0x5a, 0x98, 0x7f, 0xe8, 0x51, 0xd9, 0x3d, 0xe4, 0xbe, 0x8d, 0x86,
+ 0x35, 0x4b, 0x32, 0x34, 0x0d, 0xf0, 0x55, 0x7d, 0x2b, 0x94, 0xee, 0xcc,
+ 0xaa, 0x60, 0x32, 0x23, 0xf9, 0x61, 0xaf, 0xae, 0xf3, 0x30, 0xda, 0x13,
+ 0xf0, 0xb0, 0x4e, 0xaf, 0x6f, 0xbe, 0x95, 0x52, 0xf9, 0x2e, 0x3a, 0x52,
+ 0xa2, 0x8d, 0xc5, 0xc1, 0xdd, 0xcf, 0xf0, 0xce, 0x7a, 0xb0, 0x64, 0xe6,
+ 0xd0, 0x8e, 0xfe, 0x17, 0x65, 0x9e, 0x03, 0xb3, 0x79, 0xff, 0x77, 0x3b,
+ 0x4e, 0x27, 0xd2, 0x5c, 0x87, 0x6c, 0xda, 0x1b, 0xbf, 0xf8, 0x10, 0x15,
+ 0x21, 0x2b, 0x3f, 0x35, 0xff, 0xa2, 0xfa, 0x77, 0x1d, 0xa9, 0x48, 0x47,
+ 0x68, 0x0b, 0xaf, 0x25, 0xdc, 0xaa, 0x4e, 0x02, 0x21, 0xb3, 0x35, 0x4f,
+ 0xcc, 0xe5, 0xf8, 0x70, 0xff, 0x6c, 0x02, 0x4d, 0x94, 0xf3, 0x40, 0x70,
+ 0xac, 0x8e, 0x47, 0xd3, 0x02, 0x07, 0x29, 0x18, 0xb1, 0xe8, 0xfc, 0xc8,
+ 0xdc, 0x86, 0x29, 0x50, 0x21, 0xc1, 0x9b, 0x1b, 0x53, 0x5e, 0xff, 0x0b,
+ 0xb7, 0xb4, 0xb5, 0xf6, 0xed, 0x51, 0xec, 0x14, 0x83, 0x4a, 0x97, 0x09,
+ 0xdb, 0xf8, 0x06, 0x09, 0xfb, 0x51, 0xfc, 0xb8, 0x70, 0x76, 0x95, 0x3e,
+ 0x42, 0x07, 0xd7, 0x93, 0x53, 0xaf, 0xa4, 0x59, 0x10, 0x93, 0x89, 0x0a,
+ 0xf6, 0x3c, 0x70, 0x52, 0xb5, 0x24, 0x90, 0x2e, 0x7d, 0x82, 0x91, 0x01,
+ 0xa6, 0x6c, 0x31, 0x74, 0x64, 0x54, 0x63, 0x31, 0x81, 0xc7, 0x7d, 0xb1,
+ 0xfa, 0xc4, 0x2d, 0x96, 0xfa, 0x6a, 0x03, 0x4d, 0x39, 0x34, 0x1d, 0x33,
+ 0x9a, 0x28, 0x40, 0xf4, 0xb3, 0xc8, 0xa3, 0xfa, 0x86, 0xd7, 0x05, 0x6b,
+ 0x78, 0xfe, 0x4c, 0xab, 0x89, 0xeb, 0x21, 0x07, 0xfe, 0x02, 0x63, 0x12,
+ 0x5c, 0xed, 0x3d, 0x43, 0xb9, 0x6e, 0x22, 0x15, 0x80, 0x39, 0x39, 0x24,
+ 0x0a, 0x61, 0x67, 0xa0, 0x07, 0x99, 0xaa, 0x92, 0x3e, 0xeb, 0x96, 0x1c,
+ 0x4e, 0x36, 0x65, 0xe4, 0xaf, 0x5f, 0x5e, 0x5e, 0xb2, 0xba, 0xe8, 0xef,
+ 0x33, 0xb9, 0x91, 0x11, 0x94, 0x49, 0xaa, 0x79, 0x2c, 0xa4, 0xf3, 0x14,
+ 0x7b, 0x65, 0x76, 0xb3, 0xe9, 0x68, 0xdf, 0x62, 0x30, 0xa0, 0x5d, 0xc3,
+ 0xeb, 0x80, 0x75, 0x3c, 0x11, 0xc5, 0x7e, 0x73, 0x06, 0x3e, 0x7e, 0x80,
+ 0x0c, 0x99, 0x2c, 0xc3, 0xcd, 0x59, 0x03, 0xd9, 0x0f, 0x2c, 0x9f, 0x2f,
+ 0x84, 0xe8, 0xfc, 0xa7, 0x48, 0x52, 0xa1, 0x71, 0xec, 0xb2, 0x11, 0xec,
+ 0x66, 0x7f, 0xc6, 0xcf, 0xb2, 0x20, 0xfd, 0x33, 0x4a, 0x2b, 0xee, 0xa7,
+ 0x92, 0x60, 0x3d, 0x73, 0xb1, 0xbd, 0xf4, 0x37, 0x53, 0x8f, 0xe6, 0x5b,
+ 0xbb, 0x50, 0x1a, 0x2c, 0xfa, 0xd4, 0x4c, 0xfd, 0x53, 0x7e, 0x66, 0x78,
+ 0x73, 0xaa, 0x6a, 0x7b, 0x68, 0x9c, 0xb4, 0xb0, 0x93, 0xf0, 0x94, 0xbd,
+ 0x59, 0xc8, 0x32, 0x03, 0x92, 0x9b, 0xf8, 0x39, 0x71, 0x48, 0xcc, 0x16,
+ 0x5c, 0x34, 0x10, 0x40, 0x13, 0x18, 0xbe, 0x6c, 0x7e, 0xc0, 0xfd, 0xbf,
+ 0x48, 0x7b, 0xdd, 0x52, 0x5f, 0xe4, 0x67, 0x3f, 0x98, 0x01, 0x54, 0xa2,
+ 0xbc, 0xbb, 0x55, 0x1e, 0x04, 0x11, 0x5e, 0xa9, 0xc2, 0x03, 0xac, 0x82,
+ 0x11, 0xc9, 0xe0, 0x4f, 0x3f, 0x78, 0x31, 0x8b, 0x5a, 0xa4, 0x5a, 0x58,
+ 0xe6, 0xfe, 0xf5, 0x6a, 0xd9, 0x9c, 0x59, 0xc2, 0xe8, 0x09, 0xf2, 0xdb,
+ 0x50, 0x9c, 0xc6, 0x97, 0xb5, 0x09, 0x2b, 0xad, 0xbd, 0xa0, 0x99, 0x1a,
+ 0x3a, 0x69, 0x34, 0xad, 0x58, 0x07, 0x01, 0x1c, 0x57, 0x13, 0x04, 0xaf,
+ 0x5e, 0x2e, 0xd7, 0x42, 0xd9, 0x3e, 0xf4, 0xdc, 0x09, 0x6c, 0x57, 0xb3,
+ 0x22, 0x37, 0x33, 0x0b, 0xf0, 0x97, 0x88, 0x0e, 0x55, 0x41, 0xbe, 0x14,
+ 0xeb, 0x9a, 0xcb, 0xc7, 0xc5, 0x34, 0xe8, 0x99, 0xfa, 0x33, 0x16, 0xb3,
+ 0x50, 0x22, 0x83, 0x7b, 0x1d, 0x7c, 0x0b, 0xc9, 0x05, 0x9f, 0x82, 0x21,
+ 0x02, 0xb6, 0x56, 0xe6, 0xdb, 0x70, 0xab, 0xcf, 0xc3, 0x46, 0x05, 0x18,
+ 0xc6, 0x94, 0xc9, 0xef, 0x26, 0xf8, 0x07, 0x6e, 0x54, 0xdd, 0x27, 0x88,
+ 0x35, 0x2b, 0x9e, 0x83, 0x54, 0x08, 0x08, 0x68, 0x44, 0x65, 0x8f, 0x50,
+ 0x5b, 0x58, 0xd9, 0xf0, 0x3e, 0x90, 0x3d, 0x04, 0x07, 0xa3, 0xa7, 0x7f,
+ 0x1a, 0x7f, 0xe6, 0x1c, 0xe1, 0x08, 0x2d, 0x19, 0x53, 0xe8, 0xd7, 0x24,
+ 0x85, 0xe6, 0x5c, 0xe7, 0xcc, 0x83, 0x97, 0xfc, 0x5f, 0xe7, 0xee, 0x6e,
+ 0xe9, 0xaa, 0x72, 0xc4, 0xff, 0x5e, 0x3c, 0x9b, 0xad, 0x28, 0xe9, 0x5a,
+ 0x23, 0xf8, 0xfd, 0xca, 0x4c, 0x75, 0x77, 0xe6, 0x64, 0x08, 0xa5, 0x7d,
+ 0xf6, 0x37, 0xa6, 0x70, 0xf2, 0x81, 0x21, 0x97, 0xfa, 0x91, 0x18, 0xd2,
+ 0x30, 0xdd, 0x7d, 0xa1, 0x3c, 0x09, 0xe7, 0x8f, 0x13, 0x5f, 0x7c, 0x8e,
+ 0x55, 0xcd, 0xcf, 0x8b, 0xbf, 0xd5, 0xe8, 0xf3, 0xa2, 0xa5, 0x62, 0xe5,
+ 0x0c, 0x5a, 0x00, 0x0e, 0xe9, 0x36, 0xe1, 0xda, 0x7f, 0xc6, 0xe1, 0xc5,
+ 0x54, 0x4a, 0x87, 0x87, 0xc9, 0xf0, 0xfa, 0xd0, 0x14, 0x54, 0x62, 0xad,
+ 0xb6, 0xc9, 0x56, 0x2b, 0xc5, 0x21, 0xa8, 0x0e, 0xc1, 0xcd, 0x9f, 0x41,
+ 0xda, 0x52, 0x35, 0xb6, 0x83, 0x6b, 0x24, 0x37, 0xf5, 0xf8, 0x15, 0xbe,
+ 0xdc, 0x9e, 0x03, 0x66, 0xcc, 0x23, 0xb4, 0xd6, 0xcd, 0x08, 0xfc, 0xd5,
+ 0xb2, 0xa7, 0xa2, 0x35, 0xc3, 0x3a, 0x86, 0xfd, 0x69, 0xe5, 0xeb, 0x7b,
+ 0x5d, 0xd1, 0xad, 0x19, 0x3a, 0xf8, 0xae, 0xcc, 0xfc, 0x50, 0xf1, 0x1e,
+ 0xcc, 0x97, 0x87, 0x1c, 0xe1, 0x51, 0x84, 0xb0, 0x75, 0x6c, 0x4f, 0x17,
+ 0x69, 0xf7, 0xf6, 0x3b, 0xc7, 0x7f, 0x78, 0x41, 0xf8, 0xb5, 0x01, 0x36,
+ 0x69, 0x66, 0x52, 0x05, 0x5e, 0x17, 0x54, 0xfe, 0x33, 0x0a, 0x8d, 0xf2,
+ 0x69, 0xad, 0x71, 0xa8, 0x4f, 0x4e, 0xb2, 0xb1, 0x55, 0x31, 0x0c, 0xe3,
+ 0x73, 0x6c, 0xdd, 0xdf, 0xc2, 0x4c, 0x3e, 0x5a, 0x6b, 0xac, 0x57, 0xbd,
+ 0x95, 0x56, 0x6d, 0x71, 0x96, 0xf5, 0xa1, 0x1d, 0x6c, 0xa6, 0x2c, 0x9e,
+ 0x2d, 0xd1, 0xed, 0xb2, 0xaa, 0xcd, 0x10, 0xcd, 0x5a, 0x7d, 0x35, 0xb8,
+ 0xb9, 0xfc, 0x44, 0x6c, 0xf4, 0x28, 0xc5, 0xcd, 0xa7, 0x6e, 0xdc, 0x03,
+ 0x66, 0xb0, 0xc5, 0x4e, 0xca, 0x97, 0x42, 0x77, 0x0c, 0xec, 0x0b, 0xdb,
+ 0xfe, 0xee, 0xa1, 0x2a, 0x73, 0x32, 0xff, 0x07, 0x50, 0x29, 0x91, 0x1b,
+ 0x41, 0xb0, 0xb7, 0xae, 0xe4, 0xbb, 0xd2, 0x95, 0xf3, 0xbb, 0x85, 0x63,
+ 0x0f, 0xec, 0x44, 0x29, 0xd2, 0x90, 0x31, 0xbc, 0x20, 0x4e, 0x84, 0x75,
+ 0x92, 0x50, 0xe8, 0xa5, 0xcf, 0xd8, 0x15, 0xb3, 0xb2, 0x2d, 0x6d, 0x33,
+ 0xe6, 0xec, 0x05, 0x65, 0xc8, 0x51, 0x1e, 0x31, 0xf4, 0xfa, 0xd6, 0x7c,
+ 0xe2, 0x55, 0x71, 0x33, 0x5f, 0x32, 0xce, 0x81, 0xaa, 0x7c, 0x64, 0x81,
+ 0xc5, 0xc4, 0x2c, 0x95, 0xc1, 0xb3, 0xe6, 0x98, 0x39, 0x4f, 0x6e, 0x14,
+ 0x49, 0x5f, 0xc5, 0xe4, 0x88, 0xed, 0x00, 0x43, 0x87, 0xa5, 0xe6, 0xfd,
+ 0xf0, 0x86, 0xb6, 0x24, 0x1c, 0xb5, 0xf7, 0x7c, 0x6f, 0x51, 0xf3, 0x8a,
+ 0xbc, 0xf9, 0xb5, 0xcc, 0x10, 0x8c, 0x3d, 0x53, 0x39, 0xd7, 0x26, 0x9c,
+ 0x4c, 0x9a, 0x1c, 0xe0, 0xa5, 0x62, 0xb4, 0xb9, 0x13, 0xfa, 0x18, 0xd1,
+ 0xbe, 0x3e, 0xb3, 0x6f, 0x2b, 0xce, 0xc3, 0x6d, 0xa5, 0xc2, 0x02, 0x0c,
+ 0x2c, 0xe1, 0xa9, 0xa7, 0x3e, 0x0c, 0x5b, 0x1d, 0x7c, 0xbd, 0xcf, 0x76,
+ 0xde, 0x2f, 0xea, 0x3f, 0xa3, 0x2b, 0xaf, 0x06, 0xaa, 0xa2, 0x59, 0xf3,
+ 0xe8, 0x09, 0xf8, 0xb9, 0x3c, 0x13, 0x45, 0x12, 0xdd, 0x68, 0xb0, 0xb2,
+ 0x21, 0xcf, 0xd3, 0xb7, 0x59, 0xdd, 0x09, 0xc9, 0xac, 0x57, 0x8b, 0x10,
+ 0xfb, 0x83, 0xee, 0xa4, 0xf2, 0xc9, 0x9d, 0x04, 0x82, 0xf6, 0xa1, 0xcf,
+ 0x9e, 0x91, 0xfa, 0xa8, 0x2f, 0x87, 0x60, 0x70, 0xd8, 0xed, 0x6d, 0x10,
+ 0xe3, 0x86, 0xc1, 0x44, 0x6f, 0x71, 0x9b, 0xee, 0xb4, 0xfd, 0x9d, 0x6f,
+ 0x14, 0xca, 0x36, 0xaf, 0x8a, 0xbb, 0x63, 0xca, 0x8e, 0xff, 0xd8, 0xa7,
+ 0xda, 0x48, 0x32, 0x78, 0x20, 0xd1, 0x2b, 0x5c, 0x63, 0xe4, 0x7a, 0xea,
+ 0x45, 0x2d, 0x53, 0xca, 0x37, 0x82, 0xa2, 0xda, 0x32, 0x0e, 0x92, 0x83,
+ 0xec, 0xd2, 0xa1, 0xeb, 0x5f, 0xfe, 0x85, 0xd5, 0x5c, 0x8c, 0xab, 0xda,
+ 0x60, 0xc5, 0x9c, 0xd5, 0x75, 0xcd, 0xd1, 0xff, 0x5a, 0xc4, 0x10, 0x7f,
+ 0x3d, 0x47, 0xb9, 0x05, 0x9f, 0xaf, 0xca, 0x15, 0xd7, 0xf8, 0x98, 0x53,
+ 0x1a, 0xe0, 0x35, 0x04, 0x19, 0x45, 0xd5, 0x86, 0xc1, 0x6c, 0xb1, 0x90,
+ 0x7a, 0x4d, 0x45, 0x7a, 0xc1, 0x7c, 0x17, 0xcd, 0x9f, 0x59, 0xc5, 0x7c,
+ 0x4e, 0x20, 0x6d, 0xe9, 0x7b, 0x90, 0x37, 0x61, 0xfb, 0xe6, 0x8c, 0x82,
+ 0xfe, 0x22, 0x42, 0xe4, 0x32, 0xc4, 0x97, 0x1f, 0x9b, 0xe3, 0x7e, 0x5d,
+ 0x01, 0x0c, 0xa4, 0xc2, 0x6f, 0xed, 0xb0, 0xf0, 0x8d, 0x63, 0x3a, 0xf6,
+ 0xa1, 0x0d, 0xd3, 0xca, 0x50, 0xf8, 0x01, 0x1a, 0xf7, 0xf8, 0x49, 0x39,
+ 0x6e, 0x04, 0x25, 0xfe, 0x42, 0xdd, 0xa9, 0xa2, 0xe7, 0x87, 0x86, 0x58,
+ 0x72, 0x01, 0x86, 0x29, 0x98, 0xa2, 0x89, 0xa0, 0x0e, 0xe4, 0xcf, 0xd7,
+ 0x00, 0x36, 0xce, 0x33, 0xa6, 0xfa, 0x0c, 0x41, 0x54, 0x96, 0x23, 0x96,
+ 0x0c, 0xdd, 0x1d, 0x82, 0x03, 0x76, 0x1e, 0x06, 0xba, 0x26, 0x01, 0xe2,
+ 0x02, 0xdb, 0xef, 0x29, 0x5a, 0xb2, 0xbe, 0x2a, 0xed, 0x90, 0x8f, 0x8a,
+ 0x50, 0x97, 0xbb, 0x00, 0xbf, 0x9d, 0x4e, 0xeb, 0x18, 0x41, 0x94, 0xb3,
+ 0xef, 0x63, 0x26, 0xb3, 0x21, 0x32, 0xe0, 0x9b, 0x26, 0x70, 0xbe, 0xd9,
+ 0xe2, 0x3c, 0x04, 0x23, 0xb0, 0x80, 0xab, 0x75, 0xce, 0xfc, 0x1a, 0xf2,
+ 0x80, 0x54, 0x02, 0xad, 0xc7, 0xf3, 0xa0, 0x30, 0x72, 0x56, 0x8f, 0x26,
+ 0x39, 0x8f, 0xa8, 0xb9, 0xf3, 0x9b, 0xfa, 0x2b, 0xf9, 0x6e, 0xae, 0x3f,
+ 0xc2, 0xd5, 0x87, 0xc2, 0x33, 0x74, 0x2b, 0xb6, 0xa1, 0x45, 0x8c, 0x29,
+ 0xb2, 0xcb, 0x1c, 0x06, 0x45, 0x83, 0x88, 0xd5, 0xac, 0x8f, 0x2d, 0x52,
+ 0x21, 0xb0, 0x90, 0x86, 0xe0, 0x73, 0xdb, 0x75, 0x0b, 0x86, 0x2d, 0xc7,
+ 0x1a, 0x77, 0x51, 0x34, 0xaa, 0xc7, 0xc0, 0x73, 0x6a, 0x2f, 0xca, 0x36,
+ 0x86, 0xe4, 0xc9, 0x60, 0x34, 0x27, 0x67, 0xef, 0xd5, 0x89, 0x1f, 0x63,
+ 0xd8, 0xc4, 0x91, 0x9e, 0x33, 0xc1, 0xeb, 0xfb, 0x40, 0xd5, 0xe2, 0x3d,
+ 0xe6, 0x0d, 0x82, 0x9e, 0xd4, 0x23, 0x87, 0x4e, 0xbf, 0x52, 0x24, 0xd1,
+ 0x0c, 0x29, 0x5e, 0xf5, 0x20, 0x1c, 0x36, 0x8d, 0xa2, 0x9a, 0x77, 0x90,
+ 0xa1, 0xc6, 0x7a, 0x65, 0x14, 0x8f, 0xf5, 0xb2, 0xf8, 0x5d, 0x70, 0xce,
+ 0xd3, 0xde, 0x89, 0x15, 0x9d, 0x34, 0x9f, 0xec, 0x8a, 0xd8, 0xc4, 0x19,
+ 0x15, 0xcd, 0x6b, 0xd4, 0x07, 0x2a, 0x42, 0x69, 0xfc, 0x1b, 0x7c, 0x9f,
+ 0xde, 0x81, 0x92, 0x28, 0x93, 0x53, 0xaf, 0x6c, 0xdf, 0xb1, 0xff, 0xab,
+ 0x07, 0x07, 0x8f, 0x3f, 0xe0, 0xdc, 0x16, 0x8c, 0xd1, 0xaa, 0x11, 0x09,
+ 0xa1, 0x2b, 0xfc, 0x54, 0x1a, 0x8f, 0x37, 0x19, 0x42, 0xab, 0x1b, 0xac,
+ 0x5a, 0x06, 0x9c, 0x61, 0xb2, 0x02, 0xdf, 0x35, 0x87, 0xdf, 0x1a, 0x63,
+ 0xcf, 0x4c, 0x3e, 0x76, 0x2e, 0x7a, 0xce, 0x6d, 0x7f, 0xda, 0xea, 0xe9,
+ 0x63, 0x4b, 0x2e, 0x8a, 0xf7, 0x11, 0x0f, 0x4f, 0x4f, 0x6e, 0x80, 0x12,
+ 0x76, 0x8e, 0xdd, 0xc0, 0x41, 0x24, 0xc6, 0x22, 0x13, 0xd2, 0xd3, 0x8a,
+ 0x28, 0x8c, 0x21, 0x6e, 0xde, 0xc0, 0x11, 0xa8, 0xaf, 0x4b, 0x07, 0x12,
+ 0x95, 0xc3, 0x44, 0xa4, 0x8d, 0x88, 0x07, 0x9c, 0x51, 0x75, 0xb0, 0x9f,
+ 0xd9, 0xc2, 0x48, 0x63, 0xd4, 0xef, 0xbb, 0x11, 0x39, 0x70, 0x56, 0x53,
+ 0xc5, 0x9b, 0xd9, 0xd3, 0x88, 0x52, 0xd4, 0x47, 0x18, 0x9c, 0xfc, 0xd1,
+ 0xca, 0x89, 0x24, 0x45, 0x9d, 0x43, 0x96, 0xa2, 0x66, 0x70, 0x1f, 0x16,
+ 0x6c, 0x41, 0xb2, 0x45, 0x6d, 0x32, 0x10, 0x46, 0xa9, 0xe5, 0xb9, 0xb1,
+ 0x20, 0x1c, 0x59, 0xd9, 0xdc, 0xca, 0x67, 0x4e, 0x92, 0xc2, 0x20, 0xcf,
+ 0x8a, 0x29, 0x7a, 0xac, 0x48, 0xc4, 0xd6, 0x29, 0xb9, 0x6e, 0x57, 0x15,
+ 0xb0, 0xd5, 0xd8, 0x23, 0xe4, 0xd0, 0xb1, 0xbf, 0x45, 0x29, 0x9e, 0x5b,
+ 0x1f, 0xd1, 0xdf, 0x80, 0x1a, 0x87, 0xe0, 0x30, 0x7d, 0x53, 0xb6, 0x7c,
+ 0x70, 0x8c, 0x35, 0x6f, 0xec, 0x8e, 0xc6, 0x03, 0x73, 0x19, 0x86, 0x57,
+ 0x63, 0x6f, 0x74, 0x98, 0x36, 0xe2, 0x6e, 0x77, 0x62, 0x83, 0xc4, 0xf0,
+ 0xc2, 0xdc, 0xf8, 0x00, 0x06, 0xab, 0x02, 0x05, 0x79, 0x35, 0x9e, 0xbe,
+ 0x56, 0x86, 0xad, 0xd5, 0x07, 0xa4, 0x29, 0x31, 0x71, 0x9a, 0x5f, 0x02,
+ 0xfc, 0x23, 0xd3, 0x1d, 0x0f, 0xc1, 0xc0, 0x0a, 0x79, 0x8a, 0xaa, 0x4d,
+ 0x4c, 0x32, 0x26, 0x3c, 0x46, 0xa2, 0x04, 0xae, 0x94, 0x60, 0xb0, 0x1c,
+ 0x3d, 0xc7, 0x5e, 0xde, 0xe8, 0xa3, 0x20, 0xd9, 0x09, 0xbb, 0x05, 0xf8,
+ 0x92, 0x56, 0xd3, 0x27, 0x5f, 0xe7, 0x42, 0x18, 0xb3, 0x76, 0x0c, 0xa2,
+ 0xd5, 0x91, 0xec, 0x68, 0x05, 0xa0, 0x9e, 0x76, 0x0c, 0x03, 0xdd, 0x56,
+ 0x2c, 0xd6, 0x87, 0xde, 0xf2, 0x3f, 0xcc, 0xb1, 0xd3, 0xd9, 0x45, 0x97,
+ 0xac, 0x77, 0xbc, 0xbc, 0x29, 0x5a, 0xbe, 0x3d, 0x60, 0x11, 0x42, 0x8e,
+ 0xe9, 0x23, 0x5e, 0xed, 0xea, 0x78, 0xc0, 0x44, 0xa8, 0xe7, 0xf6, 0xb3,
+ 0xa5, 0xcc, 0x0e, 0xfa, 0xdd, 0x1b, 0xf7, 0x42, 0x7e, 0x6c, 0xd2, 0xd1,
+ 0x6c, 0x4d, 0xca, 0x49, 0x78, 0xd1, 0x8c, 0x2f, 0xde, 0xa2, 0xad, 0xc9,
+ 0x1f, 0xa2, 0x83, 0x40, 0x33, 0xec, 0x2e, 0x1c, 0x4f, 0x86, 0xf4, 0xcf,
+ 0x3e, 0x3b, 0xdb, 0xf8, 0xaa, 0x50, 0x1a, 0x5d, 0x5a, 0x48, 0xdd, 0x42,
+ 0xd2, 0xce, 0x27, 0x34, 0x21, 0x8a, 0x08, 0xed, 0x66, 0x84, 0x86, 0xe8,
+ 0xc4, 0x9c, 0x2b, 0x14, 0x34, 0xdb, 0x9a, 0xf0, 0xa3, 0xe9, 0x14, 0x70,
+ 0x6e, 0x95, 0x10, 0x4e, 0x9e, 0x7f, 0x45, 0x36, 0x5f, 0x2f, 0xd9, 0x6a,
+ 0x83, 0x3c, 0x81, 0x55, 0x2d, 0xbc, 0xb9, 0xcc, 0x4f, 0xf4, 0xcf, 0x81,
+ 0xc5, 0x96, 0xb2, 0x13, 0x52, 0x3f, 0xef, 0x03, 0x67, 0x20, 0xe6, 0x0b,
+ 0xed, 0x7d, 0x3b, 0x89, 0x42, 0x07, 0xa3, 0xf1, 0xc4, 0x3a, 0xe1, 0xed,
+ 0x0c, 0x49, 0x41, 0x63, 0xa7, 0xf1, 0xe3, 0xcf, 0xc9, 0x95, 0xcf, 0x5d,
+ 0xba, 0x3e, 0xc4, 0xf1, 0x5b, 0x42, 0xb1, 0x07, 0x1f, 0x34, 0x45, 0x4f,
+ 0x32, 0xdc, 0x32, 0x5d, 0x6b, 0xed, 0x9b, 0x0a, 0x87, 0x52, 0x04, 0x69,
+ 0x84, 0xee, 0x60, 0x17, 0x68, 0xb9, 0xcb, 0x5f, 0x10, 0x99, 0x79, 0x22,
+ 0xa0, 0xab, 0x67, 0x71, 0x22, 0xcc, 0x6f, 0xc4, 0x8a, 0x5a, 0xc0, 0xd9,
+ 0x47, 0xee, 0x68, 0x48, 0x46, 0xae, 0x1f, 0x19, 0x10, 0xbe, 0x6b, 0xdb,
+ 0xc5, 0xd1, 0xda, 0x48, 0x56, 0x8b, 0xfb, 0x3f, 0x53, 0x88, 0x5f, 0x58,
+ 0xbb, 0x50, 0xaa, 0x04, 0xe3, 0xcf, 0x9b, 0x89, 0x21, 0x93, 0x62, 0x63,
+ 0xf8, 0x53, 0x9a, 0xd8, 0xba, 0x61, 0x9e, 0x67, 0x09, 0x03, 0x5f, 0x92,
+ 0xa6, 0x68, 0x26, 0xc6, 0x24, 0x04, 0x91, 0x0a, 0x32, 0x16, 0x73, 0xa2,
+ 0x81, 0x1b, 0xa2, 0xa4, 0xb2, 0x17, 0x5b, 0x51, 0x05, 0xcb, 0xb5, 0x4f,
+ 0xe7, 0x40, 0xc2, 0xf0, 0xee, 0xf8, 0x4f, 0x70, 0xc2, 0xb4, 0xa2, 0x06,
+ 0x83, 0xe1, 0x13, 0x88, 0xfd, 0x13, 0xc8, 0x8a, 0x0f, 0xb2, 0x50, 0xbe,
+ 0xc3, 0x66, 0xbe, 0x04, 0xde, 0x47, 0x54, 0xc7, 0x1b, 0x01, 0xf7, 0xdb,
+ 0x56, 0xe7, 0xb4, 0x9f, 0xf5, 0x20, 0x5b, 0x8c, 0xcb, 0x9f, 0x5f, 0xd4,
+ 0xb2, 0x47, 0x72, 0x6b, 0x5b, 0x45, 0x27, 0x9a, 0xbb, 0x4c, 0xcd, 0x37,
+ 0xd4, 0x06, 0x68, 0x2d, 0x50, 0x40, 0x19, 0xcc, 0x76, 0x57, 0x98, 0xe2,
+ 0x07, 0xb6, 0xf4, 0x98, 0x1d, 0x95, 0x0f, 0x96, 0x9c, 0x2a, 0x1b, 0xb8,
+ 0x69, 0xb0, 0xaf, 0x1b, 0xbc, 0x6a, 0xc4, 0xb8, 0x9c, 0x2e, 0x2d, 0x2f,
+ 0x9c, 0xa7, 0xaf, 0x5c, 0x6c, 0x32, 0x8b, 0x31, 0x45, 0x6e, 0x85, 0x89,
+ 0x39, 0xa9, 0x8d, 0x15, 0x66, 0xd2, 0xd6, 0x48, 0x65, 0xda, 0x44, 0x6d,
+ 0x63, 0xdd, 0x30, 0xe9, 0x02, 0xc8, 0x64, 0x5c, 0x79, 0x42, 0xe7, 0x3e,
+ 0x7e, 0x74, 0x86, 0xfa, 0x78, 0x3e, 0x73, 0x7d, 0x79, 0xa8, 0xb7, 0xd1,
+ 0xbf, 0x01, 0x4f, 0x4b, 0x7b, 0xc5, 0x50, 0xae, 0x89, 0x69, 0x10, 0x73,
+ 0x17, 0x14, 0x98, 0x9f, 0x8c, 0xe4, 0x83, 0x49, 0xfc, 0x79, 0xc2, 0x53,
+ 0xfc, 0x1d, 0x16, 0xe9, 0x8b, 0x33, 0xce, 0xcc, 0x81, 0x57, 0xed, 0xd0,
+ 0x9d, 0xc6, 0x27, 0x1d, 0x77, 0x72, 0x65, 0x02, 0xc0, 0x0e, 0x6c, 0x88,
+ 0x9e, 0xb7, 0x25, 0x19, 0x94, 0x7f, 0xdf, 0x75, 0x95, 0xf9, 0x2c, 0x00,
+ 0xf2, 0x69, 0x2a, 0x63, 0x4d, 0x06, 0xef, 0xa9, 0x91, 0x63, 0x41, 0xe9,
+ 0x04, 0x3d, 0x55, 0x0c, 0x78, 0x64, 0xf9, 0x85, 0x7b, 0x03, 0x82, 0xad,
+ 0x3d, 0x09, 0x49, 0xb1, 0xaf, 0x2c, 0xe1, 0x93, 0xbd, 0xd6, 0x4f, 0x66,
+ 0xa8, 0xc8, 0x9e, 0xa5, 0x36, 0x61, 0x67, 0xb0, 0xb7, 0x8e, 0x38, 0x57,
+ 0x1f, 0x5a, 0x66, 0x8d, 0xde, 0x6f, 0x08, 0xb2, 0x2a, 0x72, 0x85, 0xef,
+ 0x13, 0x11, 0x72, 0x3b, 0x9b, 0xa6, 0xce, 0xc3, 0x67, 0x24, 0x20, 0xeb,
+ 0xc5, 0x5a, 0x5d, 0x77, 0x37, 0xc9, 0x47, 0x0c, 0x4f, 0x10, 0x0d, 0x79,
+ 0x23, 0xfd, 0xff, 0x50, 0xe1, 0xe0, 0xb9, 0x08, 0x0e, 0x54, 0x10, 0x47,
+ 0x48, 0x98, 0x60, 0xda, 0x8c, 0x6f, 0x30, 0xb3, 0x93, 0xcd, 0x6e, 0xcf,
+ 0x10, 0x65, 0xd5, 0xa2, 0xcc, 0x06, 0x84, 0x6a, 0x1e, 0x3e, 0x88, 0x7c,
+ 0x86, 0x11, 0x01, 0x5b, 0x27, 0xff, 0x61, 0x4f, 0x1b, 0xce, 0xe6, 0x17,
+ 0x17, 0xfe, 0xcb, 0xe2, 0xb3, 0xfa, 0x39, 0x8d, 0xf8, 0xf1, 0x4d, 0xe9,
+ 0xe7, 0x6d, 0x2e, 0xeb, 0x85, 0x30, 0x81, 0x24, 0xbf, 0xb3, 0x67, 0x9b,
+ 0x49, 0xd8, 0x46, 0x0b, 0xc3, 0x57, 0xee, 0x70, 0x8b, 0xab, 0x36, 0x23,
+ 0x95, 0x4c, 0x24, 0xec, 0x6f, 0x35, 0xd1, 0xd3, 0xb2, 0x69, 0x86, 0x14,
+ 0xa7, 0x4a, 0x38, 0xb3, 0x26, 0x28, 0x35, 0xf4, 0x34, 0x6f, 0x50, 0xf9,
+ 0xec, 0xa8, 0x47, 0x96, 0xb8, 0x69, 0x7a, 0x4a, 0x85, 0xf1, 0x64, 0x90,
+ 0xc1, 0x30, 0x25, 0xba, 0x7a, 0x36, 0x59, 0x6a, 0x5b, 0x7e, 0xf3, 0x48,
+ 0x0d, 0xba, 0x04, 0xd8, 0x8e, 0xc2, 0x1c, 0x63, 0x9f, 0x53, 0x36, 0x22,
+ 0x4c, 0xeb, 0x27, 0xda, 0x61, 0xfc, 0x32, 0xb1, 0xfc, 0x51, 0xfe, 0x95,
+ 0x5d, 0x64, 0xe3, 0x79, 0x34, 0x15, 0x03, 0x19, 0x7a, 0x3c, 0xc8, 0x5f,
+ 0x36, 0xb2, 0x24, 0xb1, 0x52, 0xc2, 0x69, 0xc9, 0xcd, 0xf4, 0x27, 0x6f,
+ 0x02, 0xf5, 0xcf, 0x2f, 0x24, 0xe0, 0xf2, 0x3c, 0x8a, 0xa1, 0x2e, 0x58,
+ 0x3d, 0x7c, 0x9f, 0x90, 0x35, 0x6c, 0x9d, 0xb1, 0xa8, 0xdf, 0xae, 0xde,
+ 0xe9, 0xb4, 0xa1, 0xe8, 0xe1, 0xe5, 0x5c, 0x51, 0x1a, 0xce, 0x7a, 0xc7,
+ 0x46, 0xb1, 0x72, 0x10, 0xc0, 0xaa, 0xd9, 0x62, 0x3e, 0x72, 0x1a, 0x67,
+ 0x4e, 0x73, 0x72, 0x96, 0x29, 0x8f, 0x69, 0x52, 0xb6, 0xc6, 0x3c, 0x5e,
+ 0xbd, 0xfa, 0x41, 0x89, 0x21, 0x29, 0x06, 0xbb, 0xca, 0xc0, 0xd1, 0x30,
+ 0xb7, 0xdf, 0x12, 0x2b, 0xcd, 0x53, 0x5e, 0x99, 0x67, 0x07, 0x03, 0xac,
+ 0x97, 0xa2, 0x3e, 0x87, 0x39, 0x68, 0x8f, 0xac, 0xfe, 0xcb, 0x0c, 0x18,
+ 0xe3, 0x0b, 0xa1, 0xdf, 0x99, 0x1f, 0x7f, 0x32, 0xbc, 0xb1, 0x52, 0x30,
+ 0xbb, 0x12, 0x3c, 0x5a, 0x0d, 0xdf, 0x21, 0xe2, 0xa1, 0xb8, 0x7e, 0xbc,
+ 0x99, 0x78, 0xca, 0x54, 0x38, 0x98, 0x93, 0xdc, 0x25, 0xf8, 0x17, 0x85,
+ 0x57, 0x7f, 0xb8, 0x3e, 0xb3, 0x8d, 0x65, 0x11, 0x24, 0x89, 0x2d, 0xff,
+ 0x96, 0x26, 0x65, 0x20, 0xb5, 0xd6, 0xf6, 0x99, 0xe0, 0xfd, 0xf3, 0x90,
+ 0x28, 0x29, 0x2a, 0x76, 0x72, 0x18, 0x4a, 0xd9, 0x1c, 0xad, 0x89, 0xa1,
+ 0xa9, 0x53, 0x0a, 0x73, 0x14, 0x06, 0xea, 0xa2, 0xd7, 0xcb, 0x8f, 0xc0,
+ 0xf8, 0xce, 0x95, 0x42, 0xb7, 0x3c, 0x90, 0x34, 0xa1, 0x45, 0xc1, 0x1d,
+ 0xd2, 0x94, 0x3d, 0x17, 0xfd, 0x1a, 0xfd, 0x5c, 0x43, 0x89, 0x12, 0x09,
+ 0xec, 0x1f, 0xf0, 0x46, 0x16, 0x11, 0x6b, 0xcd, 0xd5, 0x61, 0x3b, 0xa2,
+ 0x36, 0x97, 0x78, 0x40, 0x2e, 0xdc, 0x01, 0x08, 0x13, 0x65, 0x15, 0xfd,
+ 0xef, 0xd6, 0xa1, 0x9e, 0xf2, 0x7b, 0x80, 0x88, 0x64, 0xdc, 0x7c, 0x91,
+ 0xbb, 0x95, 0x5c, 0x6f, 0xee, 0x23, 0xa5, 0xec, 0x60, 0x68, 0x21, 0xba,
+ 0x98, 0x6b, 0x6f, 0xe0, 0xb6, 0x99, 0x13, 0x28, 0xd8, 0x8d, 0x10, 0x05,
+ 0xda, 0xe6, 0x20, 0xcb, 0xb2, 0xba, 0xb7, 0x9a, 0x73, 0x40, 0xa3, 0x14,
+ 0x8e, 0x74, 0xe4, 0xa4, 0x85, 0x15, 0xdf, 0x17, 0x1e, 0x64, 0xce, 0x53,
+ 0x45, 0x8f, 0x4d, 0x9c, 0x5f, 0x7a, 0x4f, 0xc7, 0xd4, 0xec, 0xeb, 0x96,
+ 0x22, 0x68, 0x1f, 0x1a, 0xa0, 0xac, 0x84, 0x9f, 0xe4, 0x2f, 0xb8, 0x78,
+ 0x13, 0x84, 0xea, 0x0b, 0x9c, 0xd6, 0x1e, 0x74, 0x9a, 0x7a, 0x5d, 0x94,
+ 0x1d, 0x47, 0xa1, 0x48, 0xe2, 0x6c, 0x8f, 0x14, 0xb0, 0xea, 0x94, 0x66,
+ 0xbd, 0xd0, 0x50, 0x0f, 0xfb, 0xd1, 0x9a, 0x6e, 0xb4, 0xcf, 0xb8, 0xfc,
+ 0xe5, 0x63, 0xe8, 0x6d, 0x9f, 0xeb, 0xe9, 0xa2, 0x73, 0x2e, 0xa4, 0xc3,
+ 0x4c, 0x17, 0xb0, 0xf5, 0xaf, 0x8e, 0xe3, 0xe8, 0x84, 0x64, 0x2e, 0x0a,
+ 0x14, 0xa3, 0x37, 0x31, 0x8a, 0xd3, 0x55, 0x80, 0x62, 0x21, 0x29, 0x6b,
+ 0x39, 0x47, 0x79, 0x31, 0x7f, 0x0f, 0xd3, 0xea, 0xb3, 0xdc, 0x81, 0x1c,
+ 0x9f, 0xf0, 0x9c, 0x25, 0xc6, 0xdf, 0xdc, 0x1c, 0x79, 0xad, 0xa8, 0xb7,
+ 0xf5, 0x6c, 0xed, 0xcc, 0x89, 0xc0, 0x26, 0x08, 0x8f, 0x4e, 0xb4, 0xa0,
+ 0xcb, 0x11, 0xb1, 0xe7, 0x6c, 0x33, 0x72, 0x81, 0x39, 0xe8, 0x26, 0x07,
+ 0xd5, 0x9b, 0xcf, 0x9b, 0x82, 0xf9, 0x25, 0x25, 0x8e, 0x00, 0x7b, 0xf0,
+ 0x6a, 0xcb, 0xf0, 0xc6, 0xb3, 0xb3, 0xd4, 0x6b, 0x43, 0x7d, 0xf8, 0x4b,
+ 0x77, 0xfd, 0x66, 0xd4, 0x15, 0x56, 0x0c, 0x58, 0x06, 0x69, 0x53, 0xce,
+ 0xe3, 0xfa, 0x0b, 0x99, 0x7c, 0x41, 0xf1, 0x08, 0xb3, 0x44, 0x65, 0x27,
+ 0xdd, 0x2b, 0xcc, 0xf1, 0xe6, 0xb9, 0xc4, 0x8c, 0x20, 0xa1, 0x79, 0x79,
+ 0x6a, 0x91, 0xc1, 0x9c, 0x88, 0x50, 0xcf, 0x5b, 0x03, 0x13, 0x4e, 0x3d,
+ 0x62, 0xd4, 0x0b, 0x3e, 0x5b, 0xaa, 0x83, 0xfe, 0x6f, 0x7d, 0xc3, 0x49,
+ 0x00, 0x09, 0x9a, 0x87, 0xed, 0x7a, 0xc4, 0xd8, 0xe7, 0xd0, 0xf7, 0xd2,
+ 0x50, 0xdd, 0x3d, 0xf5, 0x59, 0x14, 0x52, 0x7a, 0xd6, 0x6f, 0x65, 0x7b,
+ 0x98, 0xf8, 0x8c, 0x89, 0x14, 0xfb, 0x1e, 0x61, 0xe7, 0x09, 0xa6, 0xe2,
+ 0xf8, 0x1f, 0x9c, 0x7e, 0x80, 0x4c, 0x9e, 0x28, 0xec, 0x00, 0x80, 0xf2,
+ 0x9f, 0xe5, 0x4c, 0x8c, 0xb5, 0x30, 0x70, 0x59, 0x06, 0x4a, 0xca, 0x0e,
+ 0x06, 0x0e, 0xa6, 0xfe, 0x06, 0x5e, 0x9a, 0xe4, 0x58, 0x99, 0x51, 0xdf,
+ 0xe6, 0x62, 0xc8, 0xb5, 0x88, 0xca, 0x4f, 0x7b, 0x39, 0x2f, 0xed, 0x9f,
+ 0x58, 0x3c, 0x54, 0x1f, 0xfc, 0x90, 0x55, 0x08, 0x9d, 0x5d, 0xd9, 0x5f,
+ 0x42, 0x5a, 0x91, 0xd1, 0xcb, 0x3c, 0x2e, 0xa9, 0xc2, 0x85, 0xe3, 0xa6,
+ 0xc8, 0x7a, 0x99, 0xc5, 0x08, 0x24, 0xf3, 0x22, 0x98, 0x8b, 0xb9, 0x33,
+ 0x7d, 0xc1, 0xe3, 0xba, 0xd0, 0x88, 0xcb, 0x7d, 0x5a, 0x63, 0xb7, 0xad,
+ 0x88, 0x10, 0x86, 0x4c, 0x77, 0x9b, 0xac, 0x61, 0xc1, 0xcf, 0xd3, 0x7c,
+ 0x4c, 0x19, 0xe5, 0x6a, 0xe5, 0x6e, 0x74, 0x1f, 0x40, 0xac, 0x9a, 0xbc,
+ 0x64, 0x8c, 0x61, 0x12, 0x30, 0x74, 0xde, 0x31, 0xbc, 0x40, 0x63, 0x02,
+ 0x98, 0x42, 0x17, 0xce, 0xb9, 0x93, 0x05, 0x41, 0x2b, 0x5d, 0x56, 0x7a,
+ 0x15, 0xd4, 0xbf, 0xc5, 0xb5, 0x72, 0x62, 0x07, 0xed, 0x92, 0x6a, 0xa0,
+ 0x6b, 0x48, 0x41, 0x47, 0x78, 0x3f, 0xf2, 0x67, 0x98, 0x65, 0x9b, 0xfc,
+ 0xf4, 0x00, 0x76, 0x64, 0xbe, 0x8a, 0xd1, 0x88, 0x98, 0xe0, 0x0c, 0xc5,
+ 0xc1, 0x28, 0x25, 0x24, 0x21, 0x0f, 0x47, 0x1b, 0x7f, 0x81, 0xca, 0x74,
+ 0x0f, 0x88, 0xe6, 0x83, 0xd3, 0x42, 0x22, 0xba, 0x8b, 0xd4, 0x22, 0x0c,
+ 0xa6, 0x7a, 0xdb, 0x36, 0x86, 0x4b, 0xe3, 0xa2, 0xde, 0x18, 0x8c, 0x4d,
+ 0x3c, 0xd7, 0x30, 0x55, 0x85, 0xb4, 0xde, 0x69, 0xa1, 0x65, 0x88, 0x72,
+ 0xe9, 0xfb, 0xd1, 0x12, 0x58, 0x9c, 0x02, 0x10, 0x26, 0xe7, 0x4b, 0x9e,
+ 0x31, 0x78, 0xbc, 0x15, 0xe7, 0xdc, 0xd8, 0x9e, 0xa2, 0xb5, 0x7f, 0x70,
+ 0x0a, 0x98, 0x88, 0x4c, 0xb7, 0x48, 0x76, 0x6e, 0x66, 0xe8, 0x09, 0xeb,
+ 0xda, 0x43, 0xda, 0x2d, 0x76, 0x9d, 0xdc, 0x61, 0x23, 0xcf, 0xd7, 0x00,
+ 0x8e, 0x2f, 0xc9, 0x98, 0x9a, 0x51, 0x51, 0x98, 0x1b, 0xa9, 0x45, 0x0b,
+ 0x9b, 0x08, 0xf3, 0xfb, 0x65, 0xaf, 0xa8, 0x86, 0x7a, 0xc9, 0x6c, 0x81,
+ 0xa2, 0x5f, 0x8d, 0x7a, 0xb9, 0xfe, 0x62, 0x01, 0xe8, 0x1a, 0x4c, 0x94,
+ 0xe8, 0xa1, 0x4a, 0x52, 0xfa, 0x1e, 0xff, 0xd7, 0xe5, 0xff, 0x8a, 0x84,
+ 0x24, 0x0d, 0x54, 0x7f, 0x9d, 0x5c, 0xdf, 0xf6, 0xa2, 0xc4, 0x64, 0xf7,
+ 0x75, 0xfa, 0x5a, 0xb3, 0xf4, 0xbb, 0xea, 0x0d, 0x3c, 0x32, 0xbe, 0x5c,
+ 0xc9, 0x9b, 0xb0, 0x29, 0x64, 0x7b, 0x11, 0xdc, 0xfc, 0x72, 0xfa, 0x95,
+ 0x67, 0xa5, 0xb9, 0x2f, 0xbc, 0xff, 0x73, 0xe6, 0x1e, 0xa6, 0xa6, 0x08,
+ 0x51, 0xb1, 0x1a, 0xb7, 0xda, 0x8f, 0xbe, 0x00, 0xd1, 0x69, 0x38, 0x20,
+ 0x52, 0x12, 0x3f, 0xdd, 0xde, 0x78, 0xb9, 0xb0, 0x90, 0xe7, 0x1d, 0x48,
+ 0x4d, 0xb9, 0x9c, 0x31, 0x82, 0x5b, 0x81, 0xd5, 0xe8, 0xef, 0xe9, 0xdd,
+ 0x1b, 0x83, 0x44, 0x1d, 0x59, 0x51, 0x5f, 0xeb, 0x70, 0xb1, 0x86, 0xe0,
+ 0x27, 0x08, 0xc6, 0xe2, 0x37, 0xd0, 0xea, 0x28, 0xd0, 0x28, 0xd8, 0x57,
+ 0x2e, 0x38, 0x2e, 0xa5, 0x3d, 0x73, 0x08, 0xac, 0x2d, 0xbb, 0x92, 0xf6,
+ 0x3c, 0xa7, 0x42, 0x8f, 0x2f, 0xbc, 0x3a, 0xd9, 0xc4, 0xc0, 0xf8, 0xb2,
+ 0xce, 0x93, 0x1a, 0xa4, 0x04, 0x6a, 0x91, 0xe4, 0xbf, 0x51, 0x16, 0xd2,
+ 0x39, 0xf3, 0x9d, 0x83, 0x17, 0xe6, 0x71, 0xd6, 0x52, 0x0a, 0x1e, 0x65,
+ 0xc7, 0x0b, 0x5a, 0xd3, 0x94, 0x91, 0xb8, 0x0a, 0xaf, 0x74, 0x37, 0xeb,
+ 0x44, 0xa4, 0x5a, 0x85, 0xae, 0x2f, 0x4a, 0x50, 0x27, 0x5f, 0x0e, 0x52,
+ 0x59, 0xac, 0xe8, 0xdd, 0x4b, 0x7a, 0xb9, 0x72, 0xcf, 0x41, 0x68, 0xda,
+ 0xf2, 0xe2, 0xc6, 0x3f, 0xfc, 0xa7, 0x45, 0xd4, 0x42, 0xe5, 0xe1, 0x38,
+ 0xbc, 0xe0, 0x7c, 0x1d, 0xad, 0x3e, 0xbf, 0xfc, 0x87, 0x21, 0x2f, 0x80,
+ 0xbb, 0x84, 0x2c, 0xb8, 0x75, 0x43, 0x4f, 0x29, 0x13, 0x1e, 0x2a, 0x45,
+ 0x42, 0x62, 0x35, 0x67, 0x47, 0x36, 0xf1, 0xe4, 0x32, 0xc6, 0x2b, 0x59,
+ 0x72, 0x52, 0x7f, 0xb4, 0x35, 0x71, 0x8f, 0xed, 0x1b, 0x80, 0xe9, 0x35,
+ 0xc1, 0xa5, 0xb1, 0xd6, 0xfe, 0x17, 0x7a, 0xcc, 0x91, 0x38, 0x09, 0xac,
+ 0xe3, 0xe7, 0x28, 0xa0, 0xef, 0x8a, 0xf2, 0x03, 0x0d, 0x76, 0x41, 0x24,
+ 0x40, 0x8e, 0x1d, 0x66, 0x5b, 0xea, 0x06, 0xd9, 0xef, 0xfa, 0xa6, 0x28,
+ 0x0a, 0xd5, 0x9c, 0xe1, 0xfb, 0xb0, 0x95, 0x48, 0x82, 0x62, 0xac, 0x11,
+ 0x1b, 0x56, 0x8d, 0xb6, 0xff, 0x13, 0xcc, 0xe7, 0x0d, 0x0c, 0x1f, 0xdb,
+ 0x1a, 0x0b, 0xf8, 0x88, 0xc0, 0x27, 0x23, 0xec, 0x05, 0x11, 0xbe, 0xae,
+ 0xfb, 0xed, 0x4f, 0xef, 0x21, 0xc6, 0xa1, 0x23, 0x6d, 0x2c, 0x81, 0xc7,
+ 0xe4, 0x64, 0x5e, 0x94, 0x9f, 0xc4, 0x76, 0xb8, 0x3a, 0x23, 0xda, 0xc5,
+ 0xa3, 0x20, 0x54, 0xa7, 0x80, 0xde, 0x06, 0xc5, 0x2b, 0x91, 0x2c, 0xa8,
+ 0x10, 0xb7, 0x84, 0x09, 0x32, 0xb3, 0x5d, 0x04, 0x0e, 0xe0, 0xcf, 0x13,
+ 0xb7, 0x3a, 0xbf, 0x8e, 0xdf, 0x5b, 0xd5, 0xbc, 0x3d, 0x60, 0x43, 0x24,
+ 0xca, 0x77, 0xbf, 0x38, 0x9f, 0x2a, 0x97, 0x60, 0xef, 0x81, 0x9a, 0xd0,
+ 0x5a, 0x11, 0x58, 0xce, 0xb3, 0xb9, 0x1c, 0xa8, 0xce, 0x4b, 0x7c, 0xa8,
+ 0xbf, 0x2a, 0x95, 0xca, 0x16, 0xc4, 0xc6, 0x7f, 0x73, 0x2b, 0x15, 0x4d,
+ 0x70, 0x7d, 0x9f, 0x82, 0x4f, 0x65, 0x2f, 0xf8, 0xe2, 0x22, 0x41, 0x17,
+ 0x23, 0xa3, 0x31, 0x6c, 0x59, 0x12, 0xf4, 0xf0, 0xf6, 0x3a, 0x25, 0xe9,
+ 0x74, 0x2e, 0xc8, 0x0b, 0x38, 0xdc, 0x4d, 0x0a, 0x30, 0x12, 0x52, 0x69,
+ 0x78, 0xc5, 0x0f, 0x91, 0x3e, 0x8c, 0xea, 0x37, 0x8d, 0x87, 0x15, 0x2c,
+ 0xa2, 0xe7, 0x5c, 0x2d, 0x6b, 0x12, 0x5e, 0xcb, 0x68, 0x47, 0x32, 0x89,
+ 0x00, 0xc0, 0xbd, 0xa8, 0x9c, 0x26, 0x96, 0xb7, 0x04, 0xae, 0xa0, 0x13,
+ 0xad, 0x2f, 0xd4, 0x02, 0x04, 0x58, 0xaf, 0xec, 0xa7, 0x3c, 0xda, 0x3e,
+ 0x42, 0x26, 0xe5, 0x13, 0x00, 0xa8, 0x96, 0xc5, 0xc4, 0x6f, 0xa9, 0x84,
+ 0x3c, 0xf3, 0x21, 0x6a, 0xd5, 0x08, 0xa4, 0x74, 0x42, 0x1b, 0xa3, 0x36,
+ 0x05, 0x1e, 0xfb, 0x72, 0x49, 0x94, 0x63, 0xce, 0xea, 0xdd, 0xb1, 0x26,
+ 0x0b, 0x77, 0x11, 0x54, 0x3a, 0x6a, 0x09, 0xe2, 0x95, 0x81, 0xbb, 0xa6,
+ 0x29, 0xb0, 0xe4, 0x9d, 0x54, 0xc0, 0x45, 0xf0, 0x07, 0x73, 0x50, 0xea,
+ 0x92, 0x75, 0x1c, 0x41, 0x3b, 0x1c, 0xe5, 0x67, 0x3d, 0x10, 0x65, 0xa7,
+ 0x1c, 0xfc, 0x3e, 0xa7, 0x97, 0x17, 0xb2, 0x5d, 0x48, 0x8e, 0xa1, 0xa8,
+ 0xb7, 0xcd, 0x1b, 0xd1, 0x39, 0x3a, 0x74, 0xa1, 0xdf, 0xc4, 0x62, 0x84,
+ 0xd9, 0x45, 0x20, 0x3a, 0x5f, 0x94, 0x7b, 0xbb, 0xba, 0x10, 0xc2, 0x6a,
+ 0xa7, 0x0f, 0x8e, 0x8f, 0xaf, 0x92, 0x7f, 0x94, 0x04, 0xc5, 0x2a, 0x8c,
+ 0x00, 0x15, 0x7c, 0x00, 0x76, 0x80, 0xf6, 0xd8, 0x13, 0x75, 0x36, 0x24,
+ 0xe7, 0x82, 0x55, 0xdf, 0xe6, 0xdd, 0xc7, 0xcf, 0xde, 0x13, 0x55, 0xb9,
+ 0x38, 0x28, 0x2a, 0x6d, 0xa1, 0x87, 0x03, 0xc2, 0xf0, 0x06, 0x4d, 0xb8,
+ 0x8e, 0x39, 0x8f, 0xb3, 0xa6, 0x6c, 0xe1, 0xe8, 0xde, 0xb6, 0x09, 0xfc,
+ 0xbf, 0x63, 0x05, 0x82, 0xc4, 0x40, 0x5c, 0xd8, 0x35, 0xf9, 0x8e, 0x82,
+ 0x3c, 0xcd, 0x89, 0x3f, 0x86, 0x1e, 0xcd, 0xe6, 0xe1, 0xa3, 0x29, 0xc0,
+ 0x0d, 0x41, 0x03, 0x83, 0x83, 0xdc, 0x10, 0xa2, 0x99, 0x9c, 0xeb, 0x71,
+ 0x2b, 0x53, 0x2d, 0x1f, 0xdb, 0x34, 0xaa, 0x1a, 0x52, 0xc7, 0x29, 0xdf,
+ 0x48, 0x39, 0x6c, 0x45, 0xb2, 0x8b, 0x0f, 0xf1, 0x2e, 0x28, 0x8e, 0x7d,
+ 0xfa, 0x2d, 0x62, 0xa1, 0x29, 0x46, 0xb1, 0xfa, 0x2e, 0x31, 0x9e, 0x7e,
+ 0xc5, 0x31, 0x69, 0xf2, 0x03, 0x4e, 0xef, 0x52, 0x08, 0x68, 0xfc, 0x16,
+ 0x8c, 0xa0, 0x5c, 0x60, 0x6b, 0x48, 0xc3, 0xf7, 0xee, 0xcf, 0x5a, 0x6a,
+ 0xef, 0xb4, 0xe4, 0xe1, 0xbe, 0x53, 0xe7, 0x9f, 0x06, 0xe3, 0x79, 0x82,
+ 0x5f, 0xe9, 0x5e, 0xc7, 0x0a, 0x20, 0xb8, 0xd2, 0x0f, 0x8d, 0x8d, 0x72,
+ 0xd0, 0x42, 0x4b, 0x3d, 0x06, 0xf7, 0x5e, 0xdb, 0x1c, 0x0b, 0x31, 0xa7,
+ 0xf2, 0xc9, 0x53, 0xf5, 0x05, 0x90, 0xb3, 0x7b, 0x38, 0xf4, 0xcb, 0x2e,
+ 0x32, 0x6b, 0xa8, 0x0d, 0x62, 0xc4, 0xbc, 0x88, 0x95, 0x3d, 0x75, 0xc6,
+ 0x6f, 0x0e, 0x00, 0x0c, 0xaf, 0xf0, 0xfe, 0x33, 0x98, 0x49, 0x18, 0x72,
+ 0x40, 0x26, 0x30, 0xb3, 0x3b, 0x79, 0x14, 0x1c, 0xdf, 0x21, 0x45, 0x8c,
+ 0x7f, 0x19, 0xe9, 0xa8, 0x1c, 0xd3, 0x3a, 0x8b, 0x6e, 0x43, 0xc0, 0x0a,
+ 0x32, 0x3e, 0xe2, 0xbd, 0x4c, 0x75, 0xe6, 0xd9, 0x7a, 0x18, 0x39, 0x15,
+ 0x02, 0xdd, 0xfe, 0xae, 0x77, 0x38, 0x46, 0xc0, 0x94, 0x48, 0x91, 0xb5,
+ 0x15, 0xff, 0x52, 0x28, 0x78, 0xf1, 0x5b, 0x19, 0x67, 0x61, 0x6c, 0xcb,
+ 0xed, 0x8d, 0xba, 0x36, 0xed, 0x85, 0x12, 0xb3, 0x22, 0x31, 0x7a, 0x62,
+ 0x73, 0xe1, 0xf1, 0xb6, 0xab, 0x86, 0x16, 0x12, 0x75, 0xee, 0x10, 0xe4,
+ 0x60, 0xcf, 0x33, 0xe6, 0xad, 0x57, 0x68, 0x85, 0x07, 0xfa, 0x65, 0xf2,
+ 0xa2, 0xc6, 0x9a, 0xcf, 0x33, 0x6e, 0x7d, 0x39, 0xd3, 0xc3, 0x65, 0x25,
+ 0x20, 0xa7, 0xe4, 0x21, 0x8d, 0x8d, 0xb9, 0x7c, 0x03, 0xab, 0xc5, 0x2d,
+ 0xd7, 0x1f, 0x4a, 0xa3, 0xbc, 0x92, 0x74, 0xc6, 0x23, 0xe7, 0x7a, 0xd9,
+ 0xe4, 0xfc, 0x4d, 0xfb, 0x3b, 0x92, 0x09, 0x69, 0x95, 0xa7, 0x8f, 0x0d,
+ 0x53, 0xd9, 0x33, 0xb5, 0x09, 0x2b, 0x1f, 0x9c, 0x1a, 0x9b, 0xd4, 0x73,
+ 0x5a, 0xe6, 0xfe, 0xd9, 0x7a, 0x9d, 0xe1, 0xa5, 0x87, 0x14, 0x35, 0xcb,
+ 0xd7, 0xea, 0x0d, 0x14, 0x95, 0xd3, 0xc2, 0x06, 0x2b, 0xa6, 0xf9, 0x57,
+ 0x6c, 0x1d, 0x55, 0x1d, 0x7e, 0x7c, 0xc2, 0xf9, 0xd8, 0x70, 0x52, 0x33,
+ 0x23, 0xf1, 0x6a, 0xf1, 0x3e, 0x70, 0x25, 0x50, 0xcc, 0xc8, 0xd7, 0x25,
+ 0x54, 0x2f, 0x5b, 0x40, 0xe5, 0x58, 0xe5, 0x12, 0x45, 0x58, 0x53, 0xef,
+ 0x67, 0x01, 0xfb, 0x10, 0x9f, 0x76, 0x4c, 0xac, 0x8c, 0x52, 0xda, 0xfc,
+ 0xa2, 0x2f, 0x29, 0xc4, 0x28, 0xaf, 0x69, 0x5d, 0xe5, 0xdb, 0x41, 0x90,
+ 0xb6, 0x36, 0xb9, 0x5e, 0x25, 0x24, 0xcd, 0x76, 0x7b, 0x62, 0xa7, 0xfa,
+ 0x9e, 0xef, 0xf9, 0x01, 0xbe, 0x5d, 0x13, 0xb5, 0x19, 0x93, 0x40, 0x5f,
+ 0xa8, 0x77, 0xa3, 0x40, 0x77, 0x44, 0xdc, 0x97, 0x70, 0x35, 0x3d, 0x28,
+ 0x13, 0xf4, 0xda, 0xc9, 0xa9, 0x18, 0x3c, 0xa1, 0x57, 0x4f, 0x3c, 0x85,
+ 0x7e, 0x17, 0x9d, 0xf2, 0xf2, 0xaf, 0x21, 0xd5, 0xb6, 0x26, 0x4e, 0xc9,
+ 0x6b, 0xcf, 0xa3, 0xe8, 0x3a, 0x92, 0x61, 0xdb, 0x3b, 0x7f, 0x97, 0xd6,
+ 0x9b, 0xc2, 0x8f, 0x8a, 0x70, 0xfa, 0xaf, 0x04, 0x72, 0xa6, 0x02, 0x35,
+ 0x91, 0xb0, 0x81, 0x66, 0xeb, 0xd8, 0x62, 0x84, 0x07, 0x7b, 0x1f, 0x79,
+ 0x7c, 0x4e, 0x27, 0x7b, 0x81, 0x34, 0x99, 0xab, 0xe8, 0xc8, 0xd3, 0x57,
+ 0x0c, 0x8f, 0x43, 0x0d, 0xc2, 0x7f, 0xf2, 0xe6, 0x0d, 0x9c, 0x2f, 0xae,
+ 0xeb, 0xc0, 0x4d, 0x03, 0x6e, 0x0b, 0x52, 0x94, 0xa0, 0x52, 0xc6, 0x49,
+ 0xb1, 0x9b, 0xce, 0x5b, 0x6a, 0x8c, 0xcd, 0x37, 0x93, 0x49, 0xce, 0x82,
+ 0x6d, 0x0c, 0x5a, 0xbd, 0x1e, 0x92, 0xd5, 0xd8, 0x65, 0xfd, 0x50, 0x70,
+ 0x6f, 0x4d, 0x37, 0xac, 0xbc, 0xae, 0x82, 0xe2, 0x4a, 0x5f, 0x25, 0x88,
+ 0x9f, 0x78, 0xf1, 0x09, 0x03, 0x9f, 0x17, 0xca, 0x2a, 0xb4, 0xa6, 0xbb,
+ 0x19, 0xec, 0xcc, 0xbb, 0xe5, 0xbc, 0xab, 0xc6, 0x44, 0xed, 0x05, 0x58,
+ 0xd6, 0x11, 0xb9, 0x15, 0xad, 0xf7, 0x09, 0x49, 0x77, 0xb6, 0x89, 0x6f,
+ 0x12, 0x94, 0xc8, 0x90, 0xdc, 0x92, 0x04, 0x65, 0x44, 0x52, 0x9e, 0x99,
+ 0xc7, 0xf4, 0x5e, 0x16, 0x47, 0x41, 0xa8, 0xd3, 0x8b, 0x81, 0x0d, 0xde,
+ 0x90, 0x69, 0xeb, 0xa2, 0xc7, 0x12, 0x42, 0x17, 0x1b, 0x1e, 0x2b, 0x47,
+ 0x42, 0xaf, 0x96, 0x1f, 0x99, 0x90, 0x5c, 0x19, 0xe9, 0x91, 0x20, 0x62,
+ 0x5a, 0x42, 0x3c, 0x3a, 0x4e, 0xe5, 0x21, 0x8a, 0xe1, 0x7f, 0x4d, 0x35,
+ 0x5b, 0x3f, 0xb9, 0x7b, 0x78, 0x83, 0x0a, 0x9d, 0x78, 0x93, 0x0d, 0x08,
+ 0xcc, 0x5b, 0x5d, 0x02, 0x12, 0x44, 0x10, 0x1a, 0x67, 0x1b, 0xa3, 0xec,
+ 0x74, 0xae, 0xfc, 0x3e, 0x88, 0xac, 0x93, 0x43, 0x8b, 0x54, 0xea, 0x93,
+ 0x4c, 0x85, 0x12, 0xaa, 0x76, 0xe0, 0x48, 0x7c, 0x5d, 0x00, 0x20, 0x4e,
+ 0x8f, 0xa0, 0x07, 0x36, 0x1d, 0x64, 0x51, 0x14, 0xed, 0x07, 0x7b, 0x42,
+ 0x26, 0xc2, 0xfa, 0x5f, 0xab, 0xc7, 0xaf, 0xec, 0x73, 0x1a, 0x96, 0xb5,
+ 0x4c, 0x2a, 0xa4, 0x8d, 0xe0, 0x3f, 0x04, 0x51, 0xdb, 0x65, 0xbf, 0x93,
+ 0x23, 0x8f, 0x6b, 0x69, 0x5c, 0xd3, 0xe3, 0xbc, 0x57, 0xc6, 0x1c, 0x6c,
+ 0xc2, 0x53, 0x11, 0x19, 0x08, 0x03, 0x58, 0xe1, 0x44, 0xb5, 0x8d, 0x11,
+ 0x49, 0xa3, 0x34, 0xac, 0x2a, 0x72, 0x62, 0xda, 0xab, 0x20, 0x35, 0x9d,
+ 0x3f, 0x5f, 0xc8, 0xd6, 0x79, 0x4f, 0xac, 0x1b, 0xcc, 0x80, 0xb6, 0x50,
+ 0x48, 0x84, 0x6a, 0xaa, 0xd3, 0x81, 0x04, 0x28, 0xe2, 0x5c, 0x91, 0x25,
+ 0x97, 0xb7, 0x4e, 0x2c, 0x4b, 0xa0, 0xac, 0x4e, 0x0c, 0x2a, 0x07, 0x9e,
+ 0x9a, 0x06, 0xdd, 0xc2, 0xfd, 0x0b, 0x85, 0x0a, 0x64, 0x33, 0x34, 0x6b,
+ 0x9c, 0x52, 0x99, 0x2d, 0xf2, 0xd2, 0x4d, 0xbe, 0x8c, 0xff, 0x40, 0xc2,
+ 0xbd, 0x16, 0x89, 0x7d, 0x30, 0xe1, 0x52, 0x6d, 0x02, 0x67, 0x1b, 0x4c,
+ 0xd2, 0xaa, 0xf7, 0xb9, 0x93, 0xcf, 0xf4, 0xb9, 0x65, 0x2e, 0x10, 0x4f,
+ 0x02, 0xbd, 0xbd, 0x17, 0xda, 0xb5, 0x4b, 0xf7, 0x54, 0x1f, 0x29, 0x1a,
+ 0xfd, 0xfa, 0xfd, 0xc5, 0x70, 0x34, 0x6b, 0xce, 0x1b, 0x0c, 0x19, 0x2b,
+ 0x20, 0x28, 0xe2, 0x9b, 0xc0, 0xd6, 0x36, 0x22, 0xd3, 0x9f, 0x8e, 0xc1,
+ 0x46, 0xcd, 0x68, 0x00, 0xd9, 0x6a, 0x4c, 0xc5, 0x1a, 0x7d, 0xb5, 0x2a,
+ 0xb7, 0xde, 0x19, 0x58, 0x04, 0x55, 0x43, 0x53, 0x91, 0xed, 0x83, 0xec,
+ 0x98, 0xf0, 0x89, 0x4b, 0xa1, 0xfc, 0xc1, 0xea, 0xda, 0xc4, 0xeb, 0x57,
+ 0xae, 0x2a, 0xcb, 0x8c, 0x75, 0x58, 0xbc, 0x5a, 0x81, 0x95, 0x10, 0x74,
+ 0xfb, 0xd5, 0x35, 0xb5, 0x3e, 0xe1, 0x74, 0x4c, 0x6b, 0x10, 0x26, 0x02,
+ 0xea, 0xa3, 0xfe, 0xc7, 0xd1, 0x75, 0xa4, 0xf5, 0xce, 0x02, 0x5e, 0x2f,
+ 0x8d, 0xf9, 0xc0, 0xc8, 0xd3, 0xa9, 0xa9, 0xc3, 0xd9, 0x32, 0x08, 0x95,
+ 0x24, 0xe9, 0x9f, 0x69, 0x71, 0xa5, 0xbf, 0x97, 0x47, 0x1c, 0x4b, 0x97,
+ 0x29, 0xbe, 0x30, 0x31, 0xe2, 0xe8, 0x78, 0x55, 0x73, 0xdc, 0x0b, 0x15,
+ 0x86, 0x47, 0xc9, 0x31, 0xce, 0xf9, 0x31, 0xa8, 0xe6, 0x32, 0x53, 0x2e,
+ 0x93, 0xc7, 0x6c, 0xfc, 0xa7, 0x49, 0x81, 0x09, 0x6b, 0x91, 0x61, 0x24,
+ 0x7d, 0x88, 0x84, 0x44, 0x56, 0x43, 0x6c, 0xf4, 0x51, 0x01, 0x8e, 0x28,
+ 0x5d, 0xd4, 0xc5, 0x37, 0x5f, 0xf6, 0x8a, 0x68, 0xb8, 0x58, 0xad, 0x39,
+ 0x36, 0x20, 0x6d, 0x74, 0x8a, 0xbe, 0xcc, 0x66, 0x02, 0xaa, 0x72, 0x55,
+ 0xea, 0xa6, 0xd5, 0x5b, 0x65, 0x89, 0x03, 0x7a, 0x34, 0x71, 0x39, 0x7c,
+ 0x37, 0x0f, 0x3f, 0x5a, 0x49, 0xf2, 0x6d, 0xf8, 0x6e, 0x9e, 0xbe, 0x60,
+ 0x7d, 0x80, 0xa5, 0xb4, 0xeb, 0x8c, 0x40, 0x9e, 0x06, 0xc2, 0x0d, 0x56,
+ 0x01, 0xcc, 0x0e, 0xc2, 0x66, 0xe9, 0xf8, 0x43, 0xdd, 0xbe, 0x94, 0x37,
+ 0x63, 0x28, 0x3f, 0x9d, 0xd1, 0x06, 0x7f, 0x1d, 0xdc, 0x6f, 0x5b, 0xd8,
+ 0xb1, 0x72, 0x30, 0x4a, 0xa4, 0x11, 0x1f, 0xc4, 0x5a, 0x47, 0xe7, 0xcd,
+ 0x8b, 0xc2, 0x8e, 0x01, 0x65, 0x0d, 0xe7, 0x01, 0x21, 0x2a, 0x74, 0x62,
+ 0xe5, 0xce, 0x64, 0x3a, 0x23, 0x96, 0x4b, 0x75, 0x8a, 0xbd, 0xdb, 0xa2,
+ 0x56, 0xc6, 0x08, 0x52, 0xad, 0x25, 0x3d, 0x3e, 0x32, 0x7b, 0x47, 0x05,
+ 0x11, 0x38, 0xf7, 0x05, 0xaa, 0x48, 0xd7, 0x96, 0xdf, 0x3e, 0x0e, 0x57,
+ 0xbd, 0x9b, 0x75, 0x74, 0x18, 0x4e, 0xaf, 0xfc, 0x74, 0xf0, 0xef, 0xd8,
+ 0x63, 0xb7, 0xa3, 0x19, 0x1c, 0xbd, 0xbb, 0xe0, 0xc5, 0xe0, 0xb0, 0x69,
+ 0x6f, 0xc8, 0x05, 0x20, 0x4e, 0x5d, 0xef, 0x9b, 0x51, 0x64, 0x43, 0xf9,
+ 0x28, 0x8c, 0xa1, 0x7e, 0x0e, 0x4b, 0x0f, 0xed, 0x63, 0x62, 0xbc, 0x78,
+ 0x35, 0x4d, 0xd0, 0x21, 0x39, 0x33, 0x93, 0xa7, 0xb9, 0x04, 0xb5, 0xed,
+ 0xde, 0x2a, 0x0b, 0xc8, 0xa5, 0x9f, 0x82, 0x5d, 0x37, 0x68, 0x25, 0x51,
+ 0x4a, 0x54, 0x99, 0x54, 0x50, 0xcd, 0xa3, 0x6c, 0xd1, 0xe9, 0x83, 0x26,
+ 0x67, 0x0b, 0xb0, 0x78, 0x34, 0x62, 0x87, 0x3a, 0x4c, 0xce, 0x71, 0xe6,
+ 0x20, 0xd2, 0x8b, 0x0e, 0xa8, 0x42, 0xe5, 0x98, 0x9d, 0xd5, 0x0e, 0x62,
+ 0xe8, 0x40, 0x66, 0x35, 0xf2, 0x6d, 0x80, 0xc6, 0x56, 0xa4, 0x78, 0x20,
+ 0xf5, 0x12, 0x9f, 0x3e, 0xa6, 0x17, 0x4a, 0x05, 0xbd, 0xa6, 0x4b, 0xa4,
+ 0x89, 0x89, 0xcf, 0x3b, 0xdb, 0xc8, 0x42, 0xfc, 0xbb, 0x6d, 0x34, 0x89,
+ 0x78, 0x96, 0x54, 0x48, 0xd0, 0x8b, 0x04, 0x86, 0xfa, 0x32, 0x34, 0xc6,
+ 0x9e, 0xcb, 0x5a, 0x9a, 0xc6, 0xc4, 0xb0, 0xfa, 0xf7, 0x30, 0xec, 0xdf,
+ 0xb3, 0x42, 0x0c, 0x0b, 0x41, 0x09, 0x0d, 0xe9, 0x09, 0xda, 0x2a, 0xf3,
+ 0x8a, 0x29, 0xab, 0xcd, 0x10, 0x38, 0x39, 0x79, 0xd4, 0x20, 0xc4, 0xa7,
+ 0xbb, 0xb6, 0x73, 0x84, 0x2e, 0x7a, 0x0b, 0x3d, 0xb8, 0xa8, 0xde, 0xcb,
+ 0x7c, 0x92, 0x68, 0xbe, 0x81, 0x16, 0xdc, 0x0e, 0x55, 0xbb, 0x64, 0x19,
+ 0xe2, 0x7c, 0xde, 0x01, 0x15, 0x23, 0x2d, 0x97, 0x5f, 0x98, 0x20, 0x18,
+ 0x9d, 0x61, 0x6e, 0x3f, 0x03, 0x01, 0x14, 0x2a, 0x96, 0xd8, 0x2a, 0x13,
+ 0xfa, 0xad, 0x23, 0x60, 0xe8, 0x67, 0xfd, 0x48, 0x68, 0xe7, 0x0b, 0x60,
+ 0x77, 0x60, 0x7d, 0x35, 0x76, 0xb9, 0xd0, 0xd9, 0xcd, 0xaa, 0x72, 0x2e,
+ 0x6c, 0x9c, 0xcd, 0xd6, 0xba, 0x04, 0x1c, 0x05, 0x80, 0x80, 0x39, 0x6a,
+ 0xa3, 0xd0, 0x17, 0x3d, 0x52, 0x57, 0x2a, 0x5d, 0x6f, 0xae, 0x90, 0x8d,
+ 0xea, 0xaf, 0xc2, 0x60, 0x0f, 0xb7, 0x68, 0x5f, 0x26, 0x59, 0x3a, 0xc4,
+ 0xdd, 0x20, 0x05, 0xe4, 0xab, 0x43, 0xb3, 0x26, 0x9d, 0x59, 0x12, 0x6b,
+ 0x7e, 0x87, 0x69, 0x6d, 0xa5, 0x96, 0xf8, 0xd8, 0xc7, 0x00, 0xdd, 0x77,
+ 0xf6, 0x14, 0x33, 0x6c, 0xdf, 0xc4, 0x08, 0xb5, 0xb9, 0x87, 0xb6, 0xa0,
+ 0x6c, 0xe9, 0xe8, 0x28, 0x8b, 0x3b, 0x5a, 0xaf, 0x8e, 0xc5, 0xe0, 0x3a,
+ 0x3b, 0xe2, 0x90, 0x0e, 0xb2, 0x15, 0x2a, 0x56, 0xa3, 0x35, 0xa0, 0xf4,
+ 0x77, 0x61, 0xfc, 0x2d, 0xe8, 0xae, 0x62, 0x14, 0xa4, 0xfa, 0x2e, 0x79,
+ 0x38, 0xd1, 0x70, 0x9d, 0x4a, 0x0d, 0xed, 0x37, 0xd5, 0x60, 0x6c, 0x17,
+ 0xa3, 0xc7, 0x4c, 0x23, 0xfd, 0xa2, 0xd1, 0x52, 0x83, 0xee, 0xde, 0x81,
+ 0x4b, 0x11, 0xdb, 0x56, 0x73, 0x47, 0x1d, 0xa2, 0xa5, 0x39, 0xcb, 0x57,
+ 0x80, 0x37, 0xe0, 0x74, 0xae, 0x49, 0xa0, 0xdd, 0x43, 0x8b, 0xf2, 0x11,
+ 0x89, 0xaa, 0x48, 0x43, 0x79, 0x07, 0x4c, 0x6a, 0x22, 0x6e, 0xe1, 0xd4,
+ 0x97, 0x5c, 0x0e, 0xa2, 0xd3, 0x86, 0x04, 0x0f, 0x17, 0xbc, 0x56, 0xa7,
+ 0x0b, 0x16, 0xe8, 0x9d, 0x92, 0xc9, 0x51, 0xfd, 0x26, 0x04, 0x15, 0xb5,
+ 0x39, 0x06, 0x00, 0xa4, 0x0e, 0x4d, 0x1d, 0xdc, 0x84, 0x38, 0x41, 0x91,
+ 0x46, 0x64, 0xee, 0xeb, 0x00, 0xfb, 0x88, 0xe0, 0x64, 0x41, 0x97, 0x78,
+ 0x5e, 0xa2, 0x15, 0xa8, 0x51, 0x42, 0xbd, 0x95, 0xbf, 0x3c, 0x1b, 0x82,
+ 0x3d, 0xad, 0xc5, 0x9e, 0x5c, 0x64, 0xa7, 0x1f, 0xd0, 0x7b, 0x4d, 0xc7,
+ 0x36, 0x15, 0x4c, 0xa9, 0x04, 0x29, 0x2b, 0x7e, 0x51, 0x2a, 0x20, 0xbe,
+ 0x41, 0x94, 0x0f, 0x58, 0x94, 0xf1, 0x6b, 0x2e, 0x63, 0x2b, 0xc8, 0x26,
+ 0x4c, 0x1e, 0xf3, 0x33, 0x13, 0x14, 0x58, 0x7d, 0x1a, 0x49, 0x56, 0xbf,
+ 0x8e, 0x69, 0xda, 0x9b, 0x6e, 0x94, 0xb9, 0x2a, 0x91, 0x8e, 0x23, 0xaf,
+ 0x58, 0x5a, 0x28, 0x9d, 0x94, 0xfc, 0x39, 0xc7, 0x9d, 0xbe, 0x55, 0x28,
+ 0x6e, 0x05, 0xb9, 0xf4, 0xeb, 0x75, 0xe1, 0xd0, 0xdb, 0xe7, 0xd9, 0x02,
+ 0xcb, 0x84, 0xc7, 0xa9, 0xa1, 0xd4, 0x20, 0x2d, 0x01, 0x27, 0x38, 0xd5,
+ 0x21, 0x0a, 0x88, 0xd8, 0x3b, 0x4b, 0xd4, 0xa3, 0xf8, 0x42, 0x20, 0x59,
+ 0xa1, 0x13, 0x3f, 0x12, 0x1c, 0x05, 0xf2, 0xa2, 0xda, 0x25, 0x75, 0x6d,
+ 0x2c, 0x50, 0x80, 0x64, 0xff, 0x65, 0xdb, 0x40, 0x8c, 0xc6, 0x68, 0xd7,
+ 0x38, 0x15, 0x6f, 0x40, 0xa3, 0x11, 0xe0, 0x02, 0x51, 0x3e, 0x26, 0x12,
+ 0xdd, 0xcb, 0xe4, 0x28, 0xd6, 0xbf, 0xcf, 0xb4, 0xe4, 0x90, 0xe1, 0xf6,
+ 0xc7, 0xf0, 0xf2, 0x7a, 0x0e, 0x2f, 0xa4, 0xd2, 0x1b, 0xca, 0x4e, 0x06,
+ 0xcb, 0x16, 0xda, 0x48, 0xfd, 0x81, 0x78, 0x81, 0x7e, 0xc5, 0x96, 0x85,
+ 0x43, 0x04, 0x23, 0xca, 0x16, 0x76, 0x74, 0xe1, 0x87, 0x13, 0x8b, 0xa7,
+ 0x0b, 0x48, 0x9e, 0x70, 0xf8, 0xf7, 0xda, 0x96, 0x70, 0xdc, 0xaa, 0xfd,
+ 0x1a, 0xe2, 0xa4, 0xcd, 0x8f, 0xfd, 0x30, 0xdf, 0x6e, 0xc3, 0x9d, 0x5a,
+ 0x3f, 0x7f, 0xc8, 0x96, 0x6f, 0x30, 0x19, 0xcb, 0xc1, 0x43, 0xdb, 0x44,
+ 0xa0, 0xab, 0x9b, 0xd9, 0xd1, 0x1b, 0x5f, 0xf6, 0x38, 0x6b, 0xf5, 0x3b,
+ 0xf0, 0xe8, 0x96, 0x58, 0x00, 0xa6, 0x74, 0xfb, 0x6c, 0xee, 0xb1, 0x76,
+ 0xbf, 0x3b, 0xdf, 0xaa, 0xc0, 0x96, 0xea, 0x2e, 0x73, 0xb6, 0x61, 0x7a,
+ 0xb2, 0x9b, 0xd7, 0x49, 0xee, 0x4c, 0x2d, 0x46, 0x7a, 0xba, 0xdf, 0x7a,
+ 0x28, 0xd7, 0xaf, 0xaf, 0x49, 0xc1, 0x80, 0x76, 0x35, 0xff, 0xf6, 0x16,
+ 0xed, 0x6c, 0x4e, 0xea, 0xad, 0x87, 0x08, 0xa7, 0x5d, 0x52, 0xb4, 0xf2,
+ 0x82, 0x7b, 0x52, 0xae, 0x53, 0x88, 0xee, 0x05, 0x34, 0xb7, 0x54, 0xa5,
+ 0x6f, 0xc1, 0xa4, 0xa3, 0x0c, 0x2c, 0x79, 0x01, 0x8e, 0x94, 0x5b, 0x8a,
+ 0xe4, 0x2e, 0xd0, 0x72, 0x1f, 0x48, 0x3e, 0xcd, 0x5a, 0xba, 0x30, 0x5e,
+ 0x0d, 0xb3, 0xba, 0x91, 0x6a, 0xb8, 0x4d, 0x8e, 0x2f, 0x7c, 0x8c, 0xa7,
+ 0x17, 0xe1, 0x9d, 0x8d, 0x0a, 0x22, 0x24, 0x8d, 0x90, 0xfd, 0xc8, 0xa3,
+ 0x7b, 0x53, 0x9c, 0x32, 0x6f, 0x9f, 0x2b, 0xe5, 0x6a, 0x0a, 0x90, 0xc8,
+ 0x37, 0x6a, 0xf3, 0x6a, 0x60, 0xd9, 0xc2, 0xc4, 0x96, 0x9d, 0x53, 0xa6,
+ 0x95, 0xf4, 0xa7, 0xab, 0x30, 0x39, 0x0a, 0xf7, 0x0b, 0x36, 0xe2, 0x55,
+ 0x2f, 0x8f, 0xc7, 0xd1, 0xc8, 0x47, 0x44, 0x98, 0x20, 0xf6, 0x16, 0x50,
+ 0x66, 0x83, 0x91, 0x9c, 0x1a, 0x65, 0x7e, 0x5b, 0x81, 0xde, 0xca, 0x13,
+ 0xfa, 0x42, 0x47, 0x57, 0xeb, 0x9a, 0x84, 0xd7, 0x50, 0xaf, 0xa0, 0xae,
+ 0x0f, 0x5d, 0xe7, 0xcc, 0x65, 0xa0, 0x93, 0x45, 0x1d, 0x2e, 0x72, 0x3b,
+ 0x41, 0xf6, 0xd0, 0x3d, 0xf4, 0xaa, 0x82, 0x37, 0x81, 0xd1, 0xf7, 0x59,
+ 0x0f, 0x9d, 0x6d, 0xb4, 0x3d, 0xd4, 0x53, 0x60, 0xbf, 0x11, 0x12, 0x33,
+ 0xaf, 0xd5, 0x40, 0x09, 0xe3, 0x41, 0xac, 0x28, 0x31, 0x63, 0xf5, 0x93,
+ 0x43, 0xc7, 0x8d, 0x28, 0xba, 0x1a, 0x6a, 0x35, 0x46, 0x1b, 0x99, 0xd7,
+ 0x2b, 0x74, 0x0a, 0xf4, 0x89, 0x33, 0x96, 0xdc, 0x60, 0x6b, 0xd5, 0xa7,
+ 0x68, 0x5f, 0xbf, 0x1c, 0xbf, 0x5a, 0xe2, 0x96, 0x07, 0xbf, 0x3c, 0x0a,
+ 0xc2, 0x3f, 0x27, 0x89, 0x5e, 0x9a, 0x52, 0x27, 0x4b, 0xe6, 0xca, 0xcf,
+ 0x4d, 0x15, 0x53, 0x64, 0xc6, 0x7f, 0x89, 0xd1, 0x3e, 0xc0, 0x6b, 0x9e,
+ 0xd2, 0x30, 0xdc, 0xdf, 0x6c, 0xf5, 0x03, 0xac, 0xcb, 0x02, 0x4c, 0x79,
+ 0xf1, 0xd4, 0x9b, 0xd6, 0xe1, 0x86, 0x56, 0xc8, 0x36, 0xaf, 0x02, 0xd4,
+ 0xd4, 0x8c, 0xb9, 0xd9, 0xea, 0x50, 0x75, 0x97, 0xd7, 0x01, 0x3f, 0x7d,
+ 0x1a, 0x6b, 0x6a, 0x4b, 0x13, 0xfc, 0xce, 0x22, 0xd0, 0x1f, 0x0b, 0x32,
+ 0xbe, 0x7f, 0x01, 0x01, 0xfb, 0x7e, 0xcd, 0xb1, 0x26, 0x2a, 0x47, 0x74,
+ 0xaf, 0xa8, 0x1d, 0xe2, 0xf3, 0xcf, 0xb2, 0x23, 0x69, 0xeb, 0x9e, 0xfd,
+ 0xcf, 0xdf, 0x5d, 0x7d, 0xd2, 0x65, 0x2c, 0xf4, 0x38, 0xb4, 0x07, 0x38,
+ 0x67, 0x0c, 0x6b, 0x04, 0x77, 0xa4, 0x77, 0x8d, 0x94, 0x4c, 0xf2, 0x55,
+ 0x77, 0x95, 0x4e, 0xc2, 0x4e, 0xb7, 0x7a, 0xf9, 0xc1, 0x8b, 0x8b, 0x2a,
+ 0xc9, 0x71, 0xd9, 0x69, 0xf4, 0x35, 0x67, 0x86, 0xb4, 0xbc, 0x2d, 0x91,
+ 0x3e, 0x3c, 0xba, 0x73, 0x8a, 0xba, 0x37, 0xc2, 0x39, 0xaa, 0x4d, 0x5c,
+ 0x8b, 0x3c, 0x8d, 0xd1, 0x64, 0x70, 0x6c, 0xf1, 0x9c, 0x25, 0x26, 0xf4,
+ 0xd1, 0xdb, 0x33, 0x9c, 0x1e, 0xc5, 0xb0, 0x21, 0xf9, 0xaf, 0x77, 0x5a,
+ 0xdc, 0x7b, 0xec, 0xcd, 0xc4, 0x78, 0x12, 0xa0, 0x2a, 0xab, 0x2a, 0xaf,
+ 0xbe, 0xd7, 0x00, 0xcf, 0x22, 0x2c, 0xd5, 0x0b, 0xce, 0xc6, 0x6e, 0xc3,
+ 0x82, 0xbf, 0x1d, 0xf0, 0x6e, 0x61, 0x96, 0xbb, 0x0a, 0xdc, 0x1e, 0x86,
+ 0x8c, 0x37, 0xb8, 0xa5, 0x10, 0x75, 0xfe, 0xb4, 0x7e, 0x01, 0x4d, 0x20,
+ 0x4d, 0xa4, 0x64, 0x1d, 0x4b, 0x56, 0x89, 0x7c, 0x27, 0xb0, 0x41, 0x54,
+ 0xab, 0x5e, 0xcb, 0x36, 0x56, 0xac, 0xbb, 0xfb, 0x53, 0x14, 0xad, 0x5f,
+ 0xeb, 0xaf, 0x19, 0xe7, 0x72, 0xfe, 0x90, 0xb3, 0x29, 0x66, 0x7e, 0x90,
+ 0xab, 0x06, 0x3a, 0x73, 0x37, 0x6a, 0xd1, 0x7e, 0xc9, 0x33, 0xbd, 0x25,
+ 0x81, 0xf6, 0x30, 0x70, 0x66, 0x5f, 0x08, 0xa0, 0x11, 0xd5, 0x0a, 0xa1,
+ 0xc4, 0xa1, 0xef, 0x94, 0xaa, 0x45, 0xf3, 0x12, 0xa6, 0x1b, 0x66, 0xca,
+ 0x34, 0x3e, 0xc8, 0x23, 0xbd, 0x7d, 0x70, 0x96, 0x81, 0xaa, 0x05, 0x22,
+ 0xaa, 0x2e, 0xe4, 0x1c, 0xd4, 0x75, 0xdd, 0xcc, 0x57, 0x81, 0xac, 0x68,
+ 0xb0, 0x68, 0xbe, 0x06, 0x72, 0x4a, 0x11, 0x0b, 0xf4, 0xa7, 0x18, 0x7d,
+ 0x9a, 0xf7, 0xe1, 0x4b, 0x1c, 0xc0, 0x77, 0x3d, 0x25, 0x54, 0xe6, 0x40,
+ 0xd6, 0x09, 0x12, 0x77, 0x57, 0xc6, 0xa7, 0x89, 0x79, 0x4c, 0xf6, 0x7e,
+ 0xe3, 0xe6, 0x86, 0xf9, 0x1d, 0xf6, 0x0d, 0xa4, 0xb8, 0x03, 0x37, 0x47,
+ 0x84, 0xfa, 0x9f, 0xd6, 0x62, 0x19, 0xc3, 0x27, 0xa3, 0x52, 0xfd, 0x06,
+ 0x39, 0x89, 0x81, 0x78, 0x94, 0x1d, 0x9e, 0x01, 0xd0, 0xed, 0xea, 0x22,
+ 0x11, 0x94, 0x71, 0x97, 0x81, 0x16, 0x16, 0xaf, 0xe5, 0x29, 0x9a, 0xb6,
+ 0xaa, 0x06, 0xf6, 0xff, 0x9c, 0x7c, 0x6d, 0xa7, 0xf0, 0xfc, 0x28, 0xac,
+ 0xef, 0x60, 0x36, 0x6c, 0x50, 0x8c, 0x78, 0x85, 0xb9, 0xb0, 0x76, 0x00,
+ 0xdd, 0xbd, 0xbd, 0xab, 0x02, 0xf2, 0x7a, 0x19, 0x54, 0x19, 0xde, 0xad,
+ 0x93, 0x69, 0x4b, 0x4b, 0x53, 0xbe, 0x27, 0x60, 0xc2, 0x28, 0xf4, 0x5b,
+ 0xbf, 0xb5, 0xad, 0x61, 0xc9, 0xf6, 0x71, 0x4b, 0x09, 0x00, 0xfc, 0xd6,
+ 0xff, 0xe2, 0xea, 0xea, 0x91, 0x35, 0xa8, 0x85, 0xa1, 0x03, 0xcb, 0x4e,
+ 0x94, 0x8b, 0x6a, 0x1b, 0x15, 0xbe, 0x5d, 0x24, 0xc3, 0x10, 0x8b, 0x0c,
+ 0x03, 0x69, 0xe0, 0xdd, 0x33, 0x08, 0xb9, 0x72, 0xa8, 0x05, 0xd3, 0xa1,
+ 0x48, 0x48, 0xe4, 0x5a, 0x74, 0xce, 0x22, 0x49, 0xef, 0x2b, 0xe4, 0x14,
+ 0xba, 0x22, 0x94, 0xcd, 0x42, 0xe2, 0x64, 0xe8, 0xce, 0xf8, 0x81, 0x4b,
+ 0xd4, 0xe8, 0x7a, 0xec, 0x63, 0xd3, 0x12, 0xa8, 0x11, 0x9f, 0xd4, 0x30,
+ 0x65, 0x80, 0x1d, 0x00, 0x26, 0x2b, 0xa2, 0x97, 0x90, 0x65, 0xfa, 0xe9,
+ 0x81, 0xa1, 0xdc, 0xc7, 0xbc, 0xdc, 0x7c, 0xee, 0x52, 0xae, 0x2a, 0x69,
+ 0xaf, 0x81, 0xf9, 0xed, 0x04, 0x37, 0xbc, 0x41, 0xda, 0x3a, 0x3d, 0xdb,
+ 0x21, 0x22, 0xe7, 0x8e, 0xec, 0xe3, 0xf3, 0xb1, 0xed, 0xdb, 0xaf, 0x6f,
+ 0xc3, 0x96, 0xa2, 0xcf, 0x6a, 0xdd, 0xb5, 0x35, 0xf9, 0x77, 0xdc, 0xb0,
+ 0x30, 0x26, 0xd9, 0x0b, 0x5c, 0xac, 0x38, 0xb2, 0xe2, 0x5d, 0x8c, 0x0f,
+ 0xcc, 0x57, 0x81, 0x99, 0x3b, 0xab, 0xc6, 0xa7, 0x61, 0xdd, 0xc8, 0x7a,
+ 0xdc, 0x96, 0x99, 0x8f, 0xed, 0x6e, 0x16, 0x82, 0x47, 0xcf, 0x08, 0x6f,
+ 0x61, 0x07, 0xa3, 0x7f, 0x7b, 0x7e, 0x32, 0x60, 0x56, 0x2b, 0x42, 0x60,
+ 0xb7, 0xa6, 0xbc, 0xe8, 0x8a, 0x79, 0x2c, 0x56, 0x58, 0x57, 0xe6, 0xbb,
+ 0xe2, 0x4d, 0x65, 0x50, 0x49, 0x33, 0x46, 0xb0, 0xfb, 0x89, 0x8a, 0x9c,
+ 0xc4, 0x2e, 0x8c, 0x34, 0xa2, 0xee, 0x6d, 0xb7, 0x19, 0x4c, 0x3f, 0x30,
+ 0xd5, 0xf9, 0x80, 0x11, 0xe9, 0x66, 0x9a, 0x71, 0xdf, 0x1b, 0xbc, 0x1d,
+ 0x2f, 0x7b, 0x6e, 0x84, 0x74, 0xb6, 0xca, 0x3f, 0xaa, 0x41, 0xae, 0x1a,
+ 0x3d, 0x34, 0xca, 0xb5, 0xf8, 0x13, 0xbb, 0x96, 0x9d, 0x3f, 0x3c, 0x15,
+ 0xf0, 0xc8, 0x90, 0xbc, 0x5b, 0x4a, 0xa0, 0x71, 0x63, 0x74, 0x1b, 0x49,
+ 0x61, 0xfe, 0x37, 0xac, 0x82, 0xbb, 0x68, 0x3a, 0x06, 0xf7, 0xda, 0x84,
+ 0x59, 0x91, 0x0e, 0xcd, 0xb9, 0x53, 0x2d, 0xbb, 0xe9, 0x58, 0xd1, 0x23,
+ 0x42, 0x64, 0x49, 0x64, 0x15, 0x02, 0xe8, 0x06, 0x17, 0xaa, 0xef, 0x13,
+ 0xb3, 0xc0, 0x47, 0xf2, 0xfa, 0xd5, 0x97, 0xd1, 0x2f, 0xc8, 0x69, 0xa3,
+ 0x21, 0xa7, 0xbe, 0x7f, 0x59, 0x7e, 0x68, 0x82, 0x2f, 0x04, 0x13, 0x38,
+ 0x5a, 0x73, 0x88, 0x70, 0xde, 0x4b, 0xd6, 0xc5, 0x9a, 0x67, 0x4b, 0x04,
+ 0xf6, 0xf4, 0xf9, 0xd2, 0xd2, 0xf9, 0x02, 0x03, 0x04, 0x69, 0xc5, 0x1c,
+ 0x2e, 0x63, 0xb2, 0x25, 0x3b, 0x07, 0x79, 0x40, 0x65, 0x5a, 0xa8, 0xc1,
+ 0x48, 0x9f, 0xef, 0x48, 0x50, 0x75, 0x35, 0xc3, 0x4e, 0xfd, 0x16, 0x05,
+ 0x93, 0x81, 0x2e, 0x31, 0xdf, 0xce, 0x7a, 0xde, 0x9c, 0xc4, 0x5a, 0xa1,
+ 0x9e, 0x9d, 0x5b, 0x13, 0xbc, 0x5e, 0x97, 0x43, 0xcc, 0xa2, 0x47, 0xf1,
+ 0x19, 0x5e, 0x84, 0xaa, 0x5a, 0x7a, 0x26, 0x8a, 0x01, 0x10, 0xd1, 0xe3,
+ 0xc7, 0xcd, 0x9b, 0x57, 0x3e, 0xf5, 0x1f, 0x62, 0xd3, 0x39, 0xd5, 0x56,
+ 0xce, 0x38, 0x0a, 0x11, 0x0e, 0x00, 0xbe, 0xf0, 0x8b, 0xc7, 0xb4, 0x68,
+ 0x30, 0x2b, 0x08, 0x93, 0xf8, 0xb3, 0x12, 0x67, 0x5a, 0x07, 0x34, 0xcf,
+ 0x80, 0x54, 0x2e, 0xa9, 0x3f, 0x00, 0x15, 0x97, 0x34, 0x1f, 0x8e, 0xed,
+ 0xcf, 0xf0, 0x70, 0xae, 0x80, 0xe8, 0x4d, 0xeb, 0x20, 0x53, 0x4b, 0x19,
+ 0x88, 0xfb, 0x29, 0x3d, 0x15, 0xfc, 0x60, 0x3d, 0x1e, 0xb2, 0x99, 0xe6,
+ 0x01, 0xb5, 0x5b, 0x86, 0x8c, 0x5a, 0x91, 0x1d, 0x32, 0xdc, 0x0c, 0xf2,
+ 0xb0, 0x4f, 0xda, 0xdb, 0xc6, 0x7a, 0x8a, 0x36, 0x20, 0x24, 0xfc, 0xcb,
+ 0xd1, 0xc1, 0xbf, 0x18, 0xd0, 0x02, 0xb7, 0xa5, 0xfc, 0xeb, 0x50, 0x1a,
+ 0x27, 0xb0, 0xd5, 0x67, 0x4a, 0xaa, 0x3b, 0x9b, 0x5c, 0x87, 0x3c, 0xd1,
+ 0x4a, 0x4c, 0x5c, 0xd3, 0x85, 0x54, 0x43, 0xe0, 0xdc, 0xe2, 0x15, 0x64,
+ 0x0f, 0x45, 0x6c, 0x21, 0xc0, 0xa9, 0x22, 0x88, 0x22, 0xa9, 0x9a, 0x32,
+ 0x98, 0x8b, 0x0a, 0xd9, 0x35, 0x6a, 0x3e, 0x3b, 0xfc, 0x22, 0x8f, 0xf7,
+ 0xd3, 0x67, 0x2b, 0x57, 0x8b, 0x6d, 0x84, 0x68, 0xf7, 0xa1, 0xe0, 0xd5,
+ 0xaf, 0xb5, 0x05, 0x0c, 0xbf, 0xe4, 0x2e, 0x6c, 0x29, 0x6d, 0xd2, 0xb0,
+ 0x57, 0x26, 0x80, 0xe4, 0xb1, 0xa0, 0x4d, 0x85, 0x7c, 0xe5, 0x64, 0x25,
+ 0x0a, 0x15, 0x1b, 0xf7, 0x52, 0xd8, 0x04, 0x6d, 0xbb, 0xc2, 0xdf, 0xfe,
+ 0xde, 0xa5, 0xd2, 0xd5, 0x75, 0x92, 0x2f, 0x9a, 0xdd, 0x5d, 0x0f, 0xf3,
+ 0xe0, 0xfa, 0x7a, 0x54, 0xbb, 0x40, 0x76, 0xac, 0x35, 0x74, 0x02, 0xc6,
+ 0x59, 0xbf, 0x7f, 0x80, 0x74, 0xac, 0x3b, 0x1d, 0x3a, 0xa2, 0xb1, 0x9b,
+ 0xd6, 0xf7, 0x46, 0x1b, 0xe6, 0x31, 0xc5, 0x06, 0xc6, 0xe2, 0xac, 0x08,
+ 0x80, 0x1e, 0xdc, 0xc4, 0xf6, 0x15, 0x95, 0x54, 0xb9, 0x62, 0xe5, 0x04,
+ 0x5e, 0x0a, 0xa8, 0xcb, 0x84, 0x37, 0xb3, 0xfa, 0xdc, 0xd0, 0x20, 0xcc,
+ 0x75, 0x98, 0xb5, 0x6c, 0x3c, 0x76, 0x6f, 0x34, 0x0e, 0x83, 0x43, 0xae,
+ 0x8d, 0xe1, 0x20, 0x38, 0x6b, 0x5f, 0xee, 0xf2, 0x4c, 0x34, 0xc2, 0xd7,
+ 0x51, 0xc4, 0x4b, 0x4c, 0x48, 0x49, 0xeb, 0xc7, 0x35, 0x30, 0xd9, 0x7a,
+ 0x7f, 0xcf, 0x70, 0xe2, 0xc0, 0xf5, 0x36, 0xbc, 0x5c, 0x2b, 0x5e, 0xae,
+ 0x09, 0xe1, 0x38, 0x1f, 0x7b, 0x9e, 0xca, 0xdb, 0x86, 0xec, 0x77, 0xe6,
+ 0x38, 0x17, 0xce, 0x7b, 0x2e, 0xcf, 0x6a, 0x54, 0xda, 0xb6, 0x0e, 0x51,
+ 0xda, 0x50, 0xd9, 0x0c, 0xa6, 0xe4, 0xa0, 0xeb, 0xf0, 0xb6, 0xb9, 0xd4,
+ 0x91, 0x12, 0x8a, 0x51, 0xf0, 0xef, 0xda, 0xa8, 0x69, 0xec, 0x1f, 0x7f,
+ 0x08, 0xcd, 0x8c, 0xdd, 0x12, 0x96, 0xa2, 0xef, 0xac, 0x52, 0xc9, 0x4b,
+ 0x94, 0xea, 0x69, 0x50, 0x55, 0x3c, 0xc4, 0x4f, 0x7e, 0x52, 0x94, 0xb4,
+ 0xb4, 0x1c, 0xa1, 0x7f, 0x29, 0xf2, 0x32, 0xdd, 0x94, 0xdf, 0xea, 0x47,
+ 0x6c, 0x67, 0xcf, 0xe0, 0x12, 0x7a, 0x29, 0xbf, 0xd9, 0x2c, 0xcb, 0x4f,
+ 0x01, 0xb0, 0x62, 0x9f, 0xf0, 0xf2, 0x58, 0xa5, 0xff, 0x13, 0x3e, 0x7f,
+ 0x95, 0xfc, 0x9b, 0xf2, 0xc3, 0x8c, 0x69, 0x6b, 0xa7, 0xec, 0xf7, 0x33,
+ 0x70, 0x00, 0x08, 0x57, 0x2d, 0x0b, 0xe9, 0xd3, 0xfd, 0x43, 0x98, 0xea,
+ 0x90, 0x3c, 0x0e, 0x41, 0x00, 0xb9, 0x12, 0xcb, 0x22, 0x0f, 0x98, 0x42,
+ 0xab, 0x07, 0xad, 0x06, 0x65, 0xb3, 0xd7, 0xc9, 0x54, 0x16, 0x33, 0x97,
+ 0xca, 0x2d, 0x1d, 0xd9, 0x67, 0xe0, 0x7c, 0x50, 0x58, 0x05, 0x3f, 0x63,
+ 0xc2, 0x5d, 0x57, 0x0d, 0x47, 0xfb, 0x97, 0x8c, 0x6a, 0xff, 0x70, 0x25,
+ 0xe5, 0x7f, 0x68, 0x4c, 0x81, 0x84, 0x08, 0x89, 0xf8, 0x8a, 0x04, 0xa6,
+ 0x5b, 0xa3, 0x32, 0x20, 0x85, 0x1a, 0xf7, 0x70, 0x3f, 0xf2, 0xbc, 0x29,
+ 0x5d, 0x78, 0xa6, 0x0d, 0x82, 0x1d, 0x7d, 0x5c, 0x3b, 0xa3, 0x18, 0xab,
+ 0x5a, 0xfc, 0xd3, 0xda, 0xc1, 0x20, 0x9f, 0xbb, 0x3c, 0x7e, 0x70, 0xca,
+ 0x49, 0x65, 0x6b, 0xcd, 0x6e, 0x34, 0xe5, 0x39, 0x5d, 0x58, 0x44, 0x34,
+ 0x50, 0xc8, 0x73, 0x56, 0x39, 0x8e, 0xf7, 0xf6, 0xec, 0x42, 0x9a, 0x82,
+ 0x87, 0x89, 0x7a, 0x48, 0x84, 0xd8, 0x2c, 0xce, 0xc7, 0xbd, 0x9e, 0xfe,
+ 0xa5, 0x1b, 0xe6, 0xa4, 0xb3, 0x4c, 0xa2, 0xde, 0xae, 0x12, 0x29, 0x8e,
+ 0x3c, 0x42, 0x18, 0xf5, 0xd8, 0x1e, 0xbb, 0x06, 0xa4, 0xc5, 0xff, 0xd0,
+ 0x71, 0xce, 0x1b, 0xec, 0x77, 0x1a, 0x04, 0xd5, 0x5d, 0xd1, 0x46, 0xff,
+ 0x5b, 0x79, 0x4f, 0x9b, 0x1e, 0x14, 0x7a, 0xd7, 0x28, 0x98, 0x23, 0x12,
+ 0x77, 0x52, 0xa6, 0x7d, 0x81, 0x44, 0xc5, 0x40, 0x73, 0x46, 0x28, 0x67,
+ 0x08, 0xc1, 0xf3, 0xde, 0x01, 0xc1, 0x9d, 0x29, 0xcf, 0x7e, 0x62, 0x1c,
+ 0xad, 0xb9, 0xfb, 0xf8, 0x97, 0x5e, 0x73, 0xe0, 0x95, 0x6f, 0x0a, 0x00,
+ 0xce, 0xd2, 0x9d, 0x42, 0xf8, 0x74, 0x4d, 0x5d, 0x0a, 0x7c, 0x9c, 0xda,
+ 0x31, 0x8e, 0x80, 0x36, 0x1c, 0x3f, 0x05, 0x04, 0x5e, 0x37, 0x8a, 0xcf,
+ 0xde, 0x66, 0x2b, 0x5f, 0xda, 0x65, 0x54, 0x42, 0x6c, 0x16, 0x4f, 0x3e,
+ 0xd3, 0xd1, 0x1b, 0xcd, 0xe0, 0xc8, 0x8d, 0x40, 0x64, 0xad, 0x8e, 0x4d,
+ 0xc2, 0xa7, 0x46, 0x40, 0x1b, 0x15, 0x13, 0x2d, 0x82, 0x50, 0x46, 0xe0,
+ 0x1e, 0x53, 0x10, 0x74, 0x7c, 0xf9, 0x64, 0xef, 0xb5, 0xf8, 0xeb, 0xe9,
+ 0x07, 0x15, 0x85, 0x37, 0xc7, 0xb4, 0xdf, 0xa3, 0x51, 0x55, 0xd6, 0xd8,
+ 0x7e, 0xac, 0x18, 0x38, 0x61, 0xd0, 0x8e, 0x17, 0x32, 0x0d, 0xd2, 0x73,
+ 0x16, 0x72, 0x43, 0xae, 0xf5, 0x87, 0x92, 0x72, 0x47, 0xb1, 0xe7, 0xb0,
+ 0xff, 0x35, 0x62, 0x69, 0xaa, 0x32, 0xe8, 0x0d, 0xa1, 0x73, 0xa9, 0x5c,
+ 0xc2, 0x60, 0x51, 0x00, 0x4a, 0xab, 0xf8, 0x1b, 0x16, 0xf9, 0xe0, 0x74,
+ 0x8b, 0xe6, 0xe4, 0x6f, 0x7e, 0x79, 0x9e, 0x81, 0xc7, 0x6d, 0xf7, 0xaa,
+ 0x22, 0xae, 0xc7, 0x7b, 0x7c, 0xdf, 0x04, 0x57, 0x47, 0x5d, 0xfd, 0x05,
+ 0x89, 0x4c, 0xac, 0x31, 0xf0, 0x25, 0x4d, 0x12, 0x03, 0x80, 0x69, 0xae,
+ 0x31, 0xfd, 0x4f, 0x63, 0xf1, 0xc1, 0xd9, 0x32, 0xa9, 0x1c, 0x26, 0x43,
+ 0x1e, 0x71, 0x07, 0xe6, 0xae, 0x88, 0x7b, 0xb4, 0x5d, 0xea, 0x47, 0x04,
+ 0xe4, 0x86, 0x7e, 0x03, 0x31, 0x88, 0x7c, 0x79, 0x5e, 0x0f, 0xb8, 0xd7,
+ 0x92, 0x63, 0x6d, 0x77, 0xab, 0x47, 0x53, 0x5e, 0x17, 0xe6, 0xef, 0x66,
+ 0x12, 0x25, 0x4c, 0x27, 0x16, 0x04, 0x51, 0xd0, 0x74, 0x41, 0xb0, 0x5e,
+ 0x41, 0x66, 0x58, 0x23, 0x3f, 0xad, 0xd1, 0x47, 0xba, 0x9d, 0xd3, 0xa5,
+ 0x2d, 0x20, 0xb8, 0xa6, 0x4e, 0x7e, 0x4a, 0x00, 0xf6, 0x0f, 0x9b, 0x1a,
+ 0x62, 0x30, 0x3d, 0x8e, 0xae, 0xd2, 0x89, 0xe1, 0x98, 0x4b, 0x3e, 0xf0,
+ 0xe8, 0x84, 0x5b, 0xf9, 0x54, 0xd9, 0xae, 0xfd, 0xed, 0x58, 0x80, 0xd3,
+ 0x66, 0xe6, 0x0f, 0x69, 0x91, 0xdf, 0xca, 0xb8, 0x97, 0xb5, 0x6b, 0xdc,
+ 0x0d, 0xcf, 0x2e, 0xd8, 0xb8, 0xe6, 0xd2, 0xbf, 0xf9, 0x08, 0x32, 0xf1,
+ 0xc0, 0x2e, 0x7a, 0xbd, 0x69, 0xa7, 0xd0, 0x5e, 0x52, 0xd3, 0x63, 0xf0,
+ 0x0e, 0xb9, 0x42, 0xa0, 0xcb, 0x30, 0x9b, 0xdd, 0x60, 0x95, 0xe6, 0xf4,
+ 0xeb, 0x48, 0xdc, 0x81, 0xdd, 0x81, 0xfa, 0xa6, 0x1e, 0x31, 0x1b, 0x85,
+ 0xd6, 0x83, 0x16, 0x55, 0xe9, 0x05, 0x0a, 0xf2, 0x24, 0x9e, 0x8c, 0xd5,
+ 0x43, 0xe8, 0x96, 0xce, 0x10, 0x60, 0x23, 0xfe, 0x55, 0x88, 0x21, 0x10,
+ 0x12, 0x5f, 0x96, 0xfa, 0xbf, 0xf2, 0xf9, 0xda, 0x0b, 0x1d, 0x40, 0x94,
+ 0x19, 0xda, 0x0f, 0x4b, 0xe2, 0xc4, 0xe6, 0x8a, 0x81, 0x07, 0x27, 0x3f,
+ 0x1c, 0xef, 0x37, 0xbb, 0xaa, 0xb1, 0x14, 0x23, 0x59, 0x0d, 0x3e, 0x9f,
+ 0x1a, 0x7e, 0x34, 0xaa, 0x9b, 0xd9, 0x25, 0x94, 0x2a, 0xa8, 0x0f, 0xa2,
+ 0xe6, 0xec, 0x48, 0x36, 0xf5, 0x03, 0xf0, 0x36, 0xb9, 0xf6, 0xd9, 0x4d,
+ 0xc2, 0xf7, 0x4e, 0x87, 0x20, 0xf0, 0x33, 0x26, 0x2b, 0x8b, 0xf2, 0xd7,
+ 0x14, 0x58, 0xde, 0x9d, 0x9e, 0x7d, 0xf0, 0x6a, 0x74, 0x9b, 0xd7, 0x50,
+ 0xcf, 0xbc, 0x8d, 0xd0, 0xe7, 0x88, 0xce, 0x4d, 0x18, 0x47, 0x0a, 0x0d,
+ 0x21, 0x7d, 0x96, 0x11, 0xa9, 0xf0, 0x06, 0x38, 0x47, 0xf1, 0x4c, 0xf4,
+ 0xb9, 0x1a, 0x54, 0xd5, 0x02, 0xe0, 0xdb, 0x00, 0x0a, 0x45, 0x42, 0x76,
+ 0x9f, 0xbf, 0x4b, 0xa7, 0xad, 0xf0, 0x42, 0x57, 0xd5, 0xb8, 0x1e, 0xb5,
+ 0x54, 0x2c, 0x4d, 0xff, 0x3f, 0x0c, 0xf7, 0xde, 0xdb, 0x3d, 0x80, 0xc1,
+ 0xdb, 0x32, 0x2c, 0x43, 0x25, 0x18, 0x90, 0x59, 0xac, 0xc7, 0xb9, 0x35,
+ 0xb8, 0x88, 0xfe, 0x76, 0x71, 0x80, 0xdc, 0xe8, 0xdd, 0x5a, 0xfa, 0x44,
+ 0x38, 0x0a, 0xec, 0x07, 0x2c, 0xe8, 0xd2, 0x6a, 0xd1, 0x2a, 0xc8, 0x18,
+ 0x4e, 0x79, 0xf7, 0x4f, 0x60, 0xf6, 0xdf, 0x04, 0xc8, 0x16, 0x69, 0x96,
+ 0x66, 0x06, 0xaf, 0xac, 0x68, 0x73, 0xe7, 0x4b, 0x71, 0x86, 0xae, 0x87,
+ 0xaf, 0xe8, 0x03, 0x7a, 0xb9, 0xb6, 0x0b, 0xbd, 0x1e, 0x43, 0xe2, 0xa7,
+ 0x88, 0x59, 0x80, 0xee, 0x97, 0xe7, 0x68, 0x9f, 0xef, 0x89, 0x44, 0xbf,
+ 0x25, 0xf4, 0xde, 0x42, 0x65, 0x35, 0x91, 0x42, 0xbd, 0x33, 0x60, 0x24,
+ 0xbb, 0xc5, 0xc3, 0x67, 0xe1, 0x5d, 0xd3, 0x62, 0xc8, 0x47, 0xee, 0x2b,
+ 0x47, 0xac, 0xb9, 0x2d, 0xf4, 0x8f, 0x62, 0x16, 0x32, 0xd6, 0xce, 0x06,
+ 0x3e, 0x32, 0x30, 0x93, 0x72, 0x64, 0x41, 0xa5, 0x2d, 0x03, 0x05, 0x6d,
+ 0x0b, 0x2d, 0x7e, 0xb4, 0xfb, 0x86, 0x82, 0x10, 0xe9, 0x3a, 0x16, 0x29,
+ 0x50, 0x86, 0xdb, 0x8c, 0x93, 0x0e, 0x03, 0x66, 0x20, 0xc4, 0x3b, 0x8c,
+ 0x4a, 0x32, 0xd6, 0x3c, 0x4d, 0xb8, 0x1c, 0x57, 0xf3, 0x8e, 0x06, 0xa4,
+ 0x54, 0xd1, 0xd0, 0xab, 0x62, 0x16, 0xb7, 0x5b, 0x4e, 0x8e, 0xfa, 0x8d,
+ 0x78, 0xb0, 0x97, 0x67, 0x26, 0x26, 0xec, 0x9a, 0xfb, 0xc3, 0xee, 0x4b,
+ 0xc5, 0xeb, 0x6c, 0x5d, 0x2e, 0xb4, 0x2f, 0x74, 0x03, 0xf7, 0x20, 0x99,
+ 0x0c, 0x39, 0x23, 0xe1, 0x4e, 0xfe, 0x35, 0x41, 0xe8, 0x59, 0xaa, 0xdd,
+ 0xf8, 0xfe, 0xa5, 0x2d, 0x2c, 0x95, 0x00, 0x1a, 0xc9, 0x9c, 0x3c, 0xb2,
+ 0xd3, 0xa6, 0xfd, 0x6b, 0xe3, 0x59, 0xa9, 0x1d, 0x07, 0x18, 0xca, 0xde,
+ 0x3c, 0x0e, 0x5f, 0x6c, 0x7a, 0xd1, 0x70, 0xe9, 0x2d, 0xb5, 0x61, 0x1b,
+ 0x81, 0x6b, 0x0e, 0x5a, 0x9b, 0x3e, 0x21, 0xf8, 0xab, 0xba, 0xd9, 0xb1,
+ 0x2a, 0x8a, 0x81, 0x9f, 0x5e, 0x2c, 0x64, 0xaa, 0xdd, 0x59, 0xd0, 0xa6,
+ 0x9a, 0xb1, 0x83, 0x5c, 0x18, 0xfa, 0xe0, 0x8f, 0xf8, 0xa3, 0x13, 0x02,
+ 0x37, 0x43, 0xb0, 0x7b, 0x3e, 0x83, 0x6e, 0xdf, 0x87, 0xbc, 0x34, 0xf3,
+ 0x54, 0xa1, 0x9e, 0x43, 0x1a, 0xa1, 0x66, 0x36, 0xee, 0x58, 0x34, 0x34,
+ 0x3a, 0xa2, 0x19, 0xa8, 0xfd, 0x51, 0xcf, 0xae, 0x0a, 0x5a, 0x77, 0x0f,
+ 0xcf, 0x54, 0x38, 0x77, 0x2c, 0xcf, 0x14, 0xdf, 0x4a, 0x2d, 0x6b, 0x9b,
+ 0x57, 0x08, 0x5a, 0x5d, 0xfb, 0x57, 0x2c, 0x4b, 0x75, 0x70, 0x74, 0x4d,
+ 0x31, 0xf2, 0x67, 0xbf, 0xc9, 0x16, 0x35, 0x62, 0xa7, 0x1a, 0xfd, 0xc1,
+ 0xa9, 0x33, 0x86, 0x96, 0x9d, 0xdf, 0x02, 0xcf, 0xf8, 0x0b, 0x6e, 0xc1,
+ 0x3f, 0xf6, 0x05, 0x00, 0xae, 0xb1, 0x7f, 0x39, 0xff, 0x8d, 0x10, 0x0e,
+ 0xf0, 0xfd, 0x50, 0x55, 0x86, 0x71, 0xbc, 0xdc, 0xd7, 0x33, 0x41, 0xae,
+ 0x4d, 0x37, 0x5d, 0xd0, 0x67, 0x3f, 0xda, 0x62, 0x0b, 0x01, 0xe2, 0x87,
+ 0x6c, 0xcd, 0x32, 0x4b, 0x07, 0x54, 0xe9, 0x6f, 0x13, 0x82, 0x12, 0x2e,
+ 0x3b, 0x3e, 0x9b, 0x36, 0x13, 0x10, 0x2c, 0xd0, 0xff, 0xd8, 0x80, 0x17,
+ 0x79, 0xd3, 0x12, 0x8a, 0x4a, 0x13, 0xf8, 0xf9, 0xd1, 0x93, 0x41, 0xca,
+ 0x4c, 0xad, 0xa5, 0x96, 0x12, 0xc6, 0x78, 0xfb, 0x94, 0xa8, 0x89, 0x53,
+ 0x0c, 0xc2, 0x0c, 0xf8, 0x7d, 0x55, 0x5a, 0xff, 0xea, 0xd2, 0x93, 0x95,
+ 0xa0, 0x18, 0x92, 0xb1, 0xf9, 0xfb, 0x30, 0x4f, 0xd5, 0xce, 0xe5, 0xb1,
+ 0x19, 0x69, 0x1b, 0x23, 0xd3, 0x3b, 0x31, 0xe0, 0x7b, 0x65, 0xc7, 0x38,
+ 0x78, 0x74, 0x00, 0x0f, 0x42, 0x19, 0x4a, 0x5c, 0xb0, 0x90, 0xdd, 0xb6,
+ 0x45, 0x8d, 0x6b, 0x5f, 0xe7, 0xe3, 0x0b, 0x37, 0xea, 0xde, 0xa6, 0xc5,
+ 0x73, 0xa2, 0x96, 0xb6, 0x33, 0x3e, 0x6b, 0xb0, 0x4f, 0xa5, 0xe3, 0xfc,
+ 0x15, 0x6d, 0xfc, 0x7d, 0x39, 0x8e, 0x0b, 0xf3, 0x0e, 0x2a, 0x1e, 0x21,
+ 0xce, 0x89, 0x13, 0x80, 0xe2, 0x67, 0x0b, 0x4a, 0x92, 0xa6, 0x2d, 0x7c,
+ 0x4b, 0xc7, 0x93, 0x20, 0x0e, 0x77, 0xde, 0xcf, 0xb1, 0x38, 0x9c, 0x49,
+ 0x61, 0x99, 0xd3, 0x45, 0xc7, 0xc1, 0x39, 0x4b, 0x28, 0x99, 0xb1, 0xab,
+ 0x6e, 0x00, 0xbb, 0x6f, 0x5a, 0xdd, 0x7c, 0x06, 0x43, 0x3c, 0x49, 0xcf,
+ 0x39, 0xe8, 0x6e, 0x44, 0xc9, 0xc7, 0x25, 0xdb, 0x7b, 0x40, 0xee, 0xf5,
+ 0xb4, 0xc1, 0x3b, 0x1c, 0x4e, 0xd0, 0x05, 0x1b, 0x0a, 0x65, 0x64, 0x5e,
+ 0x81, 0xd9, 0x7c, 0xf5, 0x61, 0x7a, 0x2f, 0x2f, 0x8d, 0x2d, 0xea, 0x15,
+ 0x71, 0x23, 0x11, 0x44, 0x31, 0xf9, 0x86, 0xb3, 0x62, 0x76, 0x05, 0x67,
+ 0xcf, 0xb6, 0x72, 0x8f, 0x9a, 0xe4, 0x69, 0xd0, 0x61, 0x0f, 0x98, 0xd7,
+ 0xc1, 0x00, 0x31, 0xd6, 0x9c, 0xf1, 0xb8, 0x7a, 0x07, 0x23, 0xc4, 0x9a,
+ 0xf9, 0xc3, 0x07, 0x1a, 0x9b, 0x8e, 0xba, 0xa7, 0x6f, 0x12, 0xcd, 0x98,
+ 0x2f, 0xbe, 0x3d, 0x8e, 0xc3, 0x04, 0xc1, 0xf4, 0xba, 0x29, 0x29, 0x0c,
+ 0x54, 0x98, 0x70, 0xdc, 0xbe, 0x57, 0xa9, 0x54, 0xdd, 0x67, 0x1e, 0x98,
+ 0xff, 0x04, 0x59, 0x07, 0x5f, 0xa1, 0x1b, 0xe4, 0xe2, 0x1d, 0x0f, 0x05,
+ 0xfd, 0x55, 0x4d, 0x6f, 0xec, 0xe6, 0x1d, 0x82, 0xf3, 0x2e, 0x37, 0x35,
+ 0xc6, 0xff, 0x79, 0x38, 0x9f, 0x7b, 0x47, 0x0b, 0x68, 0x26, 0xc2, 0x46,
+ 0x11, 0x88, 0xae, 0x4a, 0xe0, 0xfe, 0x53, 0x7f, 0x67, 0x1b, 0xb4, 0xd5,
+ 0x52, 0x42, 0xee, 0x5b, 0xa9, 0x07, 0x54, 0x30, 0x4d, 0xb7, 0x15, 0xf1,
+ 0x2c, 0x6c, 0x35, 0x80, 0xb5, 0x90, 0x58, 0xc3, 0xae, 0xcc, 0x7e, 0xc9,
+ 0x9c, 0x40, 0x03, 0xdc, 0xf2, 0x62, 0x76, 0x84, 0x9e, 0x99, 0x37, 0xc3,
+ 0x6d, 0x99, 0x99, 0x23, 0x14, 0xb3, 0xa3, 0xd3, 0x27, 0x3c, 0x6b, 0xb6,
+ 0x2e, 0xb5, 0xc0, 0xb8, 0x4d, 0xa4, 0xf5, 0x85, 0x37, 0x33, 0xf7, 0x4f,
+ 0x10, 0x65, 0x59, 0x16, 0xad, 0x5f, 0xaf, 0xc8, 0x35, 0x92, 0xd7, 0xed,
+ 0x8a, 0xaa, 0x83, 0xb8, 0xbd, 0x06, 0x29, 0x38, 0x9f, 0xec, 0xf1, 0x6f,
+ 0xdf, 0xe4, 0x51, 0xad, 0x58, 0x98, 0x6c, 0x90, 0xb6, 0x8c, 0x12, 0x9a,
+ 0x51, 0xa7, 0xbd, 0x93, 0x72, 0x51, 0x27, 0x82, 0x0e, 0xee, 0x0b, 0xde,
+ 0x2b, 0xf1, 0x80, 0x04, 0x95, 0xf6, 0xed, 0xbc, 0x33, 0xe6, 0xae, 0xf2,
+ 0x56, 0x88, 0xe6, 0x08, 0x31, 0x2c, 0xbc, 0xfe, 0xdb, 0x00, 0x21, 0x54,
+ 0x3e, 0x41, 0x7c, 0x0b, 0xa4, 0x97, 0x68, 0x7f, 0xf0, 0xf3, 0x42, 0x8c,
+ 0x9e, 0xb9, 0x3b, 0x2a, 0xc6, 0xbc, 0xd0, 0x69, 0x64, 0x9f, 0x31, 0xbb,
+ 0x45, 0x3e, 0x7d, 0x47, 0x32, 0x85, 0x8b, 0x23, 0xff, 0x41, 0xff, 0xe6,
+ 0x4d, 0xb3, 0x98, 0xaf, 0xa6, 0x6f, 0x1a, 0x84, 0x55, 0xa4, 0x45, 0xa3,
+ 0xff, 0x4f, 0x2c, 0x18, 0x38, 0x03, 0x25, 0x19, 0x93, 0xe8, 0x0f, 0x78,
+ 0xf4, 0x50, 0x06, 0xfe, 0xc7, 0xcf, 0x10, 0x03, 0x46, 0x99, 0xca, 0x71,
+ 0xd8, 0x1e, 0xac, 0x62, 0xba, 0x55, 0x88, 0x93, 0x19, 0x43, 0x18, 0x82,
+ 0xeb, 0x9a, 0x6c, 0xc2, 0xf4, 0xa3, 0xbf, 0x69, 0x76, 0x20, 0x9b, 0xb7,
+ 0xbb, 0x1c, 0x06, 0x3f, 0xcb, 0xb8, 0xc7, 0xbd, 0xad, 0x08, 0x31, 0xf2,
+ 0xdc, 0x49, 0xc3, 0x0d, 0xb7, 0x48, 0x07, 0x25, 0x15, 0x46, 0x49, 0x09,
+ 0x01, 0xcf, 0xa9, 0x65, 0xc5, 0x21, 0x6b, 0xe6, 0x72, 0x18, 0x46, 0x03,
+ 0xe4, 0xa2, 0xcc, 0x53, 0x55, 0xdc, 0x94, 0xf2, 0x72, 0xae, 0x48, 0x98,
+ 0x0d, 0x63, 0xf3, 0x7a, 0x6d, 0x3c, 0x6a, 0x5c, 0x51, 0x69, 0xa7, 0x53,
+ 0x26, 0x39, 0x14, 0xce, 0x22, 0xbc, 0x7b, 0xe0, 0x99, 0xed, 0x6f, 0x94,
+ 0x4e, 0x02, 0x33, 0x5a, 0xcc, 0x6f, 0xf8, 0xaf, 0x31, 0xbc, 0xae, 0x9e,
+ 0x10, 0xc3, 0xaf, 0x2d, 0x50, 0x31, 0x34, 0x66, 0xe0, 0xc1, 0x55, 0xd1,
+ 0xee, 0x16, 0x21, 0xac, 0xdc, 0x80, 0x64, 0xd5, 0xf9, 0x49, 0xa2, 0xf8,
+ 0xe6, 0xad, 0x46, 0x7e, 0x40, 0x7f, 0xec, 0x2f, 0x29, 0xea, 0xec, 0x16,
+ 0xaf, 0xca, 0x71, 0xff, 0x80, 0x2e, 0x9f, 0x65, 0xbd, 0x69, 0x74, 0x4f,
+ 0x4f, 0x93, 0xf4, 0x36, 0x2e, 0xd4, 0xc5, 0x14, 0x5e, 0x67, 0x99, 0x03,
+ 0x75, 0xa4, 0x4c, 0x1e, 0x00, 0x66, 0xf6, 0xf1, 0x1a, 0xb4, 0xcb, 0x49,
+ 0x6e, 0x78, 0xf9, 0x44, 0x05, 0x4f, 0x3a, 0x97, 0x60, 0xe4, 0x59, 0xe9,
+ 0x78, 0x60, 0x9d, 0x47, 0xf1, 0xc1, 0xcc, 0x1a, 0x42, 0x57, 0xa0, 0x0c,
+ 0x69, 0xa3, 0x9a, 0x78, 0xb5, 0xf2, 0xe6, 0xa7, 0xf2, 0x06, 0xc4, 0xa8,
+ 0xdb, 0xc2, 0xc9, 0xe5, 0x78, 0xa9, 0x81, 0xd0, 0x6c, 0x18, 0xe8, 0x09,
+ 0xa2, 0x13, 0xbe, 0x07, 0xc6, 0x11, 0xec, 0xc5, 0xc2, 0xa2, 0xe9, 0xed,
+ 0x97, 0x03, 0x0a, 0x6d, 0xdd, 0x40, 0x2d, 0x20, 0x58, 0x7b, 0x63, 0x55,
+ 0xd5, 0x9c, 0x67, 0x6b, 0xf8, 0xc8, 0x2b, 0x58, 0x0c, 0xb9, 0x5c, 0xd2,
+ 0x2a, 0xb6, 0xc9, 0x82, 0x96, 0xbf, 0x81, 0x55, 0x71, 0x1a, 0x59, 0x9f,
+ 0x26, 0xce, 0x06, 0x1e, 0x02, 0xca, 0x4c, 0x34, 0xa9, 0x15, 0xda, 0xfb,
+ 0x5b, 0xa9, 0xd2, 0x34, 0xe3, 0xf6, 0xa1, 0xe5, 0xc1, 0xe2, 0x9a, 0x75,
+ 0x5d, 0x30, 0xf8, 0x88, 0xc7, 0xd2, 0x1c, 0x6b, 0x60, 0x82, 0x43, 0xe7,
+ 0xeb, 0x4d, 0x42, 0x87, 0x27, 0xdd, 0x7e, 0x0e, 0x68, 0x21, 0xda, 0x3a,
+ 0x54, 0x88, 0x0b, 0x6d, 0x14, 0x88, 0xd4, 0x26, 0x7e, 0x97, 0x26, 0xd0,
+ 0x1f, 0x00, 0x81, 0xe1, 0x6d, 0x56, 0xf6, 0xf1, 0x4d, 0x79, 0x28, 0x7b,
+ 0xc3, 0x5e, 0x5a, 0x59, 0x07, 0x48, 0x06, 0x14, 0x4f, 0x70, 0x2c, 0xc3,
+ 0x40, 0x62, 0xc7, 0x38, 0x22, 0xb9, 0x7e, 0xcf, 0x25, 0x34, 0xcc, 0x6b,
+ 0x50, 0x74, 0xbd, 0xfd, 0x8f, 0xd8, 0xf1, 0x27, 0x54, 0xf1, 0x53, 0x93,
+ 0xb3, 0x94, 0x12, 0x0b, 0x5b, 0x3e, 0x7e, 0xb2, 0xda, 0xe7, 0x19, 0x32,
+ 0xc4, 0x81, 0xc0, 0x21, 0x17, 0x9b, 0xf3, 0x63, 0x36, 0xdc, 0x57, 0x56,
+ 0x0d, 0x6e, 0x35, 0xe5, 0xdc, 0xe4, 0x4a, 0xe9, 0x4f, 0xd9, 0xc6, 0x6a,
+ 0xff, 0x80, 0xdb, 0xdd, 0x42, 0xe1, 0x99, 0x93, 0x14, 0x1e, 0x60, 0xeb,
+ 0xbf, 0x13, 0x32, 0x4b, 0xf8, 0xa5, 0xc7, 0xee, 0xf4, 0x72, 0x23, 0xa6,
+ 0x63, 0x08, 0x07, 0x69, 0x4d, 0x71, 0x2e, 0x74, 0xc2, 0xd8, 0x52, 0x76,
+ 0x75, 0x5f, 0x66, 0xd7, 0xba, 0x27, 0x74, 0x5d, 0x5e, 0x34, 0x22, 0x97,
+ 0x53, 0x09, 0xdd, 0x35, 0xac, 0x57, 0xd6, 0xdd, 0xbf, 0xe1, 0x61, 0x6e,
+ 0x04, 0xfa, 0x8e, 0x09, 0x03, 0xe8, 0x68, 0xf0, 0x85, 0x1d, 0x49, 0x6a,
+ 0x31, 0xbf, 0xd8, 0x18, 0x88, 0x7b, 0x06, 0xa6, 0xbb, 0x53, 0xd2, 0xab,
+ 0x4b, 0x20, 0x00, 0xe7, 0x6b, 0xc9, 0xd1, 0x2d, 0xbf, 0x21, 0x4d, 0x7a,
+ 0x79, 0xa4, 0x00, 0x41, 0x35, 0x91, 0x76, 0xbb, 0xb3, 0xc6, 0xda, 0xd7,
+ 0x54, 0x53, 0xa5, 0xb0, 0x03, 0x61, 0x33, 0x67, 0xa7, 0x29, 0x76, 0xa5,
+ 0x66, 0x2c, 0xf3, 0x5f, 0xdd, 0x9a, 0xab, 0xb1, 0x9d, 0xaa, 0x37, 0x6b,
+ 0x01, 0x43, 0x40, 0x95, 0x3f, 0xe1, 0xdb, 0xdf, 0x9b, 0x70, 0xfc, 0xd6,
+ 0x4a, 0x45, 0xec, 0x90, 0xa5, 0x77, 0x87, 0xe9, 0xcf, 0xdc, 0x11, 0x39,
+ 0x78, 0x02, 0x42, 0xfd, 0x72, 0xf8, 0x55, 0xf2, 0x13, 0xf7, 0x56, 0x7b,
+ 0x01, 0x70, 0x9a, 0xeb, 0x8b, 0x83, 0x6a, 0x30, 0x11, 0xd2, 0x87, 0x3f,
+ 0x6b, 0x00, 0xf4, 0x73, 0x9b, 0x44, 0xc3, 0xa7, 0xd8, 0xeb, 0xa6, 0xb6,
+ 0x7b, 0x98, 0x1a, 0x11, 0x17, 0x80, 0xb4, 0xb6, 0x85, 0x88, 0x16, 0x7f,
+ 0xb9, 0xb6, 0xae, 0x0a, 0x89, 0x30, 0x38, 0x09, 0x78, 0x39, 0x44, 0x04,
+ 0x85, 0x88, 0x64, 0x42, 0xf1, 0x7c, 0x42, 0x3f, 0xdb, 0x8a, 0x9e, 0x11,
+ 0x56, 0x04, 0x3d, 0x4f, 0x96, 0xb2, 0xe0, 0xa6, 0x03, 0x40, 0x2f, 0x22,
+ 0x10, 0xd5, 0xd6, 0x99, 0xff, 0x12, 0xd6, 0x58, 0x0a, 0xd9, 0x03, 0x6c,
+ 0xce, 0x50, 0xf1, 0x13, 0xdb, 0xb9, 0xd5, 0x9b, 0xae, 0xeb, 0xc2, 0x97,
+ 0x3d, 0xd1, 0x50, 0xa4, 0xd4, 0xa3, 0xf2, 0x9b, 0x47, 0xf2, 0xf0, 0x87,
+ 0xb3, 0x36, 0x10, 0xc1, 0x7f, 0x02, 0x19, 0x4f, 0xc4, 0xb6, 0x2a, 0x8b,
+ 0x9b, 0x2c, 0xe2, 0x66, 0x58, 0xc3, 0x1f, 0x16, 0xaf, 0x78, 0x33, 0xf9,
+ 0x9a, 0xe4, 0x15, 0x05, 0x12, 0x86, 0x9a, 0xce, 0xb6, 0x47, 0x7b, 0x0e,
+ 0x52, 0xde, 0xd3, 0xad, 0x47, 0xc9, 0x1d, 0xd3, 0x76, 0xde, 0x32, 0x38,
+ 0xca, 0x08, 0x08, 0xc7, 0xc1, 0xf0, 0x98, 0x86, 0x8c, 0xfb, 0xf4, 0xf2,
+ 0x6b, 0xfa, 0x60, 0x6b, 0xd0, 0xaf, 0xe0, 0x32, 0x1f, 0x7f, 0x0e, 0x60,
+ 0x08, 0x34, 0x05, 0xf8, 0x4f, 0xab, 0x9c, 0xb9, 0xa3, 0xb0, 0x6a, 0xda,
+ 0xb6, 0x0b, 0x15, 0x35, 0x21, 0x31, 0xbf, 0x8d, 0x79, 0x55, 0x29, 0xd7,
+ 0x25, 0x1b, 0xe8, 0x62, 0x32, 0xd5, 0x35, 0x7a, 0x7a, 0x25, 0x2e, 0x4b,
+ 0xb5, 0xa1, 0xe7, 0x7e, 0xbe, 0xa3, 0xcb, 0x68, 0x1f, 0x44, 0xc6, 0x42,
+ 0xf2, 0x04, 0xa7, 0xc2, 0x55, 0xef, 0x80, 0xe5, 0x8e, 0x28, 0x21, 0xd1,
+ 0x01, 0xe3, 0x8c, 0x43, 0xef, 0xec, 0xbe, 0x60, 0x45, 0xcf, 0x98, 0x23,
+ 0x99, 0x7e, 0x7b, 0x68, 0x5d, 0xc1, 0x1b, 0x6a, 0x12, 0xcc, 0xd6, 0xbe,
+ 0x70, 0x68, 0x5c, 0x86, 0xcc, 0xb9, 0x35, 0x37, 0xdd, 0x75, 0xff, 0xfb,
+ 0x72, 0xd0, 0x6a, 0xd2, 0x81, 0x96, 0x74, 0x2e, 0x66, 0x75, 0x64, 0x6f,
+ 0xf3, 0x8c, 0x7b, 0xad, 0xbc, 0x1c, 0xba, 0x60, 0x68, 0x3c, 0x1c, 0x69,
+ 0xe2, 0x73, 0x2a, 0xcb, 0xe0, 0x44, 0xfc, 0xb0, 0x8d, 0xab, 0x3a, 0x06,
+ 0x49, 0x22, 0x3c, 0x86, 0xad, 0x0f, 0x17, 0x08, 0x44, 0x94, 0x36, 0x50,
+ 0x5b, 0x4a, 0xe5, 0xe2, 0x36, 0xf5, 0x23, 0xb2, 0x1a, 0x71, 0x54, 0x08,
+ 0x70, 0x0a, 0x60, 0x2c, 0xec, 0xb0, 0xaf, 0x95, 0xbf, 0xd0, 0x6a, 0x19,
+ 0x91, 0x53, 0x13, 0xad, 0x3a, 0x14, 0xe2, 0x22, 0x71, 0xd7, 0x86, 0x10,
+ 0x97, 0x88, 0x29, 0xce, 0x18, 0x9f, 0x20, 0xf8, 0x2e, 0x80, 0x19, 0xac,
+ 0xdd, 0x87, 0x6d, 0xb9, 0x6a, 0x63, 0x9e, 0x30, 0xd5, 0x44, 0xc0, 0xd7,
+ 0xf8, 0x0e, 0x52, 0xab, 0x7a, 0x71, 0xff, 0x63, 0x23, 0x27, 0x43, 0x97,
+ 0x8d, 0x96, 0xda, 0xaa, 0x0c, 0x14, 0x5a, 0xb9, 0xb4, 0x0f, 0xb8, 0x56,
+ 0xb1, 0x49, 0x90, 0xaa, 0x3a, 0x63, 0xa8, 0xe2, 0x17, 0x96, 0x10, 0x58,
+ 0x72, 0xa7, 0xd7, 0x9f, 0x0f, 0xff, 0x99, 0x3d, 0x60, 0x8f, 0xd1, 0xa3,
+ 0x94, 0x37, 0xb1, 0x67, 0xf2, 0x6f, 0x97, 0x95, 0x8c, 0x88, 0x40, 0x57,
+ 0x8c, 0x55, 0x99, 0xe2, 0xcf, 0x15, 0x40, 0x24, 0x1e, 0xe4, 0x9d, 0xff,
+ 0x6f, 0xc9, 0xd8, 0xb1, 0x48, 0xb1, 0x1f, 0xc8, 0xaa, 0xa2, 0x14, 0xfb,
+ 0x7d, 0x13, 0xd8, 0xc7, 0xe4, 0x97, 0xe5, 0xd3, 0xc3, 0x8b, 0xae, 0x1c,
+ 0x8d, 0x21, 0x61, 0x25, 0x78, 0x3f, 0x8d, 0x37, 0x81, 0x73, 0x6f, 0x6e,
+ 0xa0, 0xbf, 0xbc, 0xda, 0xc1, 0x21, 0x7b, 0x69, 0x7e, 0x06, 0xc6, 0x44,
+ 0x1b, 0x0b, 0x52, 0xc8, 0xe8, 0xfb, 0x35, 0x32, 0xa6, 0x98, 0x81, 0xe6,
+ 0x65, 0xba, 0x8c, 0x98, 0x79, 0x68, 0xac, 0xe6, 0x75, 0xb4, 0x58, 0x9b,
+ 0xec, 0xa5, 0x1c, 0x0f, 0x35, 0xc5, 0x1e, 0x65, 0xb4, 0xe9, 0x14, 0x22,
+ 0xaf, 0x91, 0x15, 0xeb, 0x8d, 0x57, 0x54, 0xb3, 0x87, 0x61, 0xe9, 0xf7,
+ 0x65, 0x23, 0x95, 0x68, 0x83, 0xf2, 0x6f, 0xb3, 0x65, 0x1d, 0xc2, 0x50,
+ 0xde, 0xd1, 0x65, 0xcb, 0x5b, 0xbc, 0xfe, 0x44, 0xc1, 0x08, 0xc5, 0x75,
+ 0x0c, 0xdc, 0x59, 0xe2, 0xfe, 0x46, 0x25, 0xfc, 0x77, 0xaf, 0xc3, 0xee,
+ 0x1a, 0xc8, 0x41, 0xb5, 0x30, 0xc5, 0xf9, 0xd1, 0x06, 0x0f, 0x92, 0x89,
+ 0x93, 0x0a, 0x84, 0xa3, 0x60, 0xf5, 0x09, 0xb0, 0x42, 0x1d, 0x62, 0x33,
+ 0xaf, 0xb4, 0xbd, 0xe9, 0x99, 0x16, 0x72, 0x33, 0x18, 0x13, 0x98, 0xd3,
+ 0x0e, 0x24, 0xb3, 0x10, 0xe9, 0x43, 0xb9, 0x89, 0xac, 0x2f, 0x6f, 0x42,
+ 0xc3, 0xc5, 0x06, 0xa1, 0xbc, 0xc5, 0x0d, 0x7a, 0xdb, 0xcf, 0x15, 0x89,
+ 0xc6, 0x48, 0x95, 0x79, 0x42, 0xe2, 0xa8, 0xca, 0x5b, 0xb9, 0x51, 0x79,
+ 0x67, 0xdf, 0x5d, 0x90, 0xc0, 0x95, 0x32, 0x4f, 0xc1, 0x50, 0x79, 0x7c,
+ 0xae, 0x4f, 0x59, 0x6a, 0x1a, 0xf9, 0x3b, 0x0a, 0x87, 0xb8, 0xab, 0x1f,
+ 0x92, 0xe4, 0x0e, 0x72, 0x38, 0x6a, 0x10, 0x5a, 0x24, 0x2b, 0x30, 0x75,
+ 0xcd, 0x29, 0xf8, 0x12, 0x95, 0xdf, 0x11, 0x6c, 0x33, 0x9a, 0x02, 0x5e,
+ 0xf9, 0x6c, 0x4d, 0x52, 0xb3, 0x77, 0xe1, 0x9c, 0xac, 0xb8, 0x38, 0x00,
+ 0x2b, 0x16, 0xb1, 0xeb, 0x1d, 0xe9, 0x57, 0xcb, 0x6e, 0xdf, 0x57, 0xdf,
+ 0xd8, 0x6c, 0xa9, 0x56, 0xe3, 0x8d, 0xff, 0xa1, 0xb8, 0x6a, 0x3d, 0xad,
+ 0xb5, 0x6c, 0x42, 0xb6, 0x1f, 0x18, 0x22, 0xd3, 0xcb, 0xf7, 0x32, 0x8d,
+ 0x94, 0x95, 0x15, 0x82, 0x94, 0x9b, 0xee, 0xcd, 0x35, 0xf0, 0x00, 0x21,
+ 0x95, 0x13, 0xf6, 0x17, 0x23, 0x12, 0xf7, 0xd2, 0xbc, 0x71, 0xbe, 0x9d,
+ 0x24, 0xef, 0x54, 0x17, 0xfc, 0xcd, 0x02, 0x13, 0x0d, 0xcf, 0x74, 0x64,
+ 0xa4, 0xc4, 0x8d, 0xdb, 0x1c, 0xd2, 0x56, 0x86, 0x64, 0xf3, 0x26, 0xc2,
+ 0x57, 0x94, 0x50, 0x3c, 0x3d, 0x78, 0x36, 0x2d, 0x2e, 0xb4, 0x69, 0xc9,
+ 0xb7, 0xf8, 0xfc, 0x4e, 0xf3, 0xfd, 0xde, 0x23, 0x3a, 0xe3, 0x0c, 0x3c,
+ 0xf1, 0xe3, 0xeb, 0xb8, 0xaa, 0x0c, 0x32, 0xed, 0x9a, 0x88, 0xa9, 0x11,
+ 0xd5, 0x06, 0xc4, 0x9c, 0x0f, 0x56, 0x2e, 0xa6, 0xe7, 0x42, 0xf0, 0x5d,
+ 0xa0, 0xc4, 0xeb, 0xd7, 0x70, 0x43, 0x39, 0x8b, 0x18, 0x7a, 0xab, 0x83,
+ 0xff, 0x00, 0xc1, 0x7b, 0xc3, 0xe9, 0xff, 0x07, 0x6e, 0xf9, 0x21, 0x0d,
+ 0x9c, 0xad, 0xb6, 0x22, 0xd8, 0x88, 0x91, 0x49, 0x92, 0x6c, 0xa2, 0x7f,
+ 0x61, 0x37, 0x9f, 0xc7, 0xae, 0x6e, 0x15, 0xd7, 0x8f, 0x0d, 0xd3, 0x81,
+ 0x2a, 0xd2, 0xba, 0xe2, 0xdf, 0x85, 0x30, 0x54, 0x09, 0x8c, 0xe8, 0x7e,
+ 0x94, 0xbb, 0x78, 0x06, 0x33, 0x17, 0x2c, 0x67, 0x33, 0x10, 0xa8, 0x8a,
+ 0x3f, 0x67, 0x30, 0x62, 0xc8, 0xf5, 0xa3, 0x39, 0xbb, 0xd4, 0x9d, 0x6f,
+ 0x07, 0x1d, 0xae, 0x59, 0x2b, 0xb7, 0x94, 0x87, 0x04, 0x7f, 0x57, 0x25,
+ 0x17, 0x42, 0x17, 0xd8, 0x9d, 0x5f, 0x5d, 0xee, 0x41, 0x08, 0x31, 0xf1,
+ 0x42, 0x5c, 0xc7, 0x32, 0xd8, 0xc1, 0xc4, 0x3a, 0xff, 0x04, 0xa9, 0x15,
+ 0xbf, 0x8f, 0x17, 0xe1, 0x20, 0xad, 0x8f, 0xb9, 0xd6, 0x3a, 0x18, 0x86,
+ 0xc1, 0x20, 0x29, 0xca, 0xb4, 0xec, 0x55, 0xc5, 0xbd, 0x23, 0xd5, 0x84,
+ 0x52, 0xc6, 0xe8, 0xbe, 0x80, 0x8b, 0x07, 0x0d, 0xb4, 0xc0, 0xfd, 0xb4,
+ 0xbd, 0xb2, 0x76, 0x6e, 0x4a, 0xd9, 0xe6, 0x2e, 0xe2, 0x52, 0xfe, 0xca,
+ 0x02, 0x01, 0x18, 0x41, 0x81, 0xbf, 0xfc, 0x47, 0x8b, 0xf4, 0x1f, 0x54,
+ 0x65, 0xe8, 0xec, 0x8b, 0x8d, 0x6b, 0x73, 0x2b, 0xcf, 0xd5, 0x92, 0xd6,
+ 0xfa, 0x89, 0x2d, 0x67, 0x97, 0x7a, 0xe4, 0x0c, 0x02, 0x08, 0x32, 0x07,
+ 0x3f, 0x6f, 0x48, 0x03, 0xfb, 0x1d, 0xde, 0xd3, 0xe1, 0x42, 0x50, 0xf9,
+ 0xbf, 0xc1, 0x8b, 0x1a, 0x1d, 0x30, 0x6a, 0xd1, 0xd2, 0xb2, 0xf8, 0xd6,
+ 0xfb, 0x27, 0x24, 0x63, 0xfb, 0xf0, 0x74, 0x5a, 0x40, 0xe7, 0x5e, 0xac,
+ 0xc6, 0x5f, 0x44, 0x18, 0x3b, 0x73, 0x92, 0x0f, 0x8d, 0x17, 0x3e, 0xa4,
+ 0x58, 0x19, 0xae, 0xf5, 0xd1, 0x1e, 0x2d, 0xab, 0x0a, 0x77, 0x06, 0xe8,
+ 0x07, 0x35, 0xd7, 0x91, 0xe5, 0x36, 0xa7, 0x90, 0x23, 0x54, 0x44, 0x95,
+ 0xa7, 0xdf, 0x79, 0x05, 0xfb, 0xad, 0xc7, 0xcc, 0x87, 0x4f, 0x7e, 0x50,
+ 0x09, 0xe4, 0x50, 0x12, 0xad, 0x26, 0xd9, 0x44, 0xff, 0xc2, 0xd0, 0x23,
+ 0xe2, 0x08, 0x90, 0x7a, 0xca, 0x30, 0x98, 0x5b, 0xe0, 0x31, 0x06, 0x18,
+ 0x24, 0x82, 0xb5, 0x69, 0xfc, 0xce, 0xa2, 0xbd, 0x3d, 0xe3, 0x44, 0xa9,
+ 0x6e, 0xce, 0x8b, 0x32, 0x97, 0xf8, 0x6f, 0x2d, 0x5d, 0xca, 0x6d, 0x2b,
+ 0xdc, 0x0d, 0xd7, 0xe3, 0x7c, 0x9b, 0xd1, 0xe7, 0xd6, 0x04, 0xa5, 0x6b,
+ 0xf9, 0xa4, 0x33, 0xc9, 0xfe, 0x13, 0x56, 0xaa, 0xd2, 0x6e, 0xfc, 0xee,
+ 0xb7, 0xcd, 0xc1, 0xcc, 0xe0, 0x57, 0xf3, 0x08, 0x7d, 0x99, 0x05, 0xf0,
+ 0xf1, 0x91, 0xb2, 0x2b, 0x91, 0x80, 0x99, 0x63, 0x97, 0x1a, 0x5e, 0x93,
+ 0x89, 0x16, 0xcd, 0x5e, 0xf9, 0xe7, 0x3c, 0x53, 0xbe, 0x94, 0x38, 0x5a,
+ 0x3b, 0xd5, 0x16, 0xe0, 0x74, 0x96, 0x4f, 0x2f, 0x6d, 0xee, 0x9e, 0xd3,
+ 0xbb, 0x58, 0xff, 0x7e, 0xb6, 0x0b, 0x18, 0xe1, 0xf7, 0x04, 0x67, 0x7b,
+ 0x0d, 0x55, 0x57, 0x82, 0xe4, 0x1e, 0x8c, 0x31, 0xf0, 0xe9, 0x15, 0x55,
+ 0xda, 0x43, 0xc4, 0xba, 0x7a, 0x26, 0xf2, 0xe0, 0x05, 0xb1, 0x8e, 0x5f,
+ 0x50, 0x7c, 0x76, 0x00, 0x84, 0xf0, 0x3d, 0x58, 0x3d, 0xe3, 0x58, 0xca,
+ 0x9e, 0xb0, 0x95, 0xa7, 0x92, 0x47, 0xc7, 0xe0, 0x70, 0x3a, 0xd3, 0x27,
+ 0x06, 0xb6, 0x0d, 0x26, 0xc1, 0x87, 0xdf, 0xb3, 0x01, 0xd2, 0xea, 0x77,
+ 0x71, 0x30, 0xdb, 0x9e, 0x3d, 0x0b, 0xed, 0x2d, 0xb5, 0x39, 0x4f, 0x4b,
+ 0x0d, 0x26, 0xeb, 0xff, 0x73, 0x0c, 0xde, 0x01, 0xca, 0xb8, 0x8e, 0x6e,
+ 0xff, 0x0a, 0xda, 0xea, 0x4c, 0x02, 0x3e, 0x5b, 0x0b, 0x79, 0xeb, 0xb2,
+ 0x26, 0xb7, 0x01, 0xfe, 0xcc, 0x2f, 0x44, 0xa1, 0x14, 0x14, 0x57, 0x97,
+ 0xab, 0xc0, 0xac, 0x0b, 0x43, 0x73, 0x67, 0xff, 0xbf, 0x51, 0xae, 0xaa,
+ 0xa0, 0x28, 0xbe, 0xd9, 0xc7, 0x8b, 0xf4, 0x3f, 0xdb, 0x61, 0x01, 0x1a,
+ 0x65, 0x90, 0x05, 0xcb, 0x0c, 0x43, 0xd0, 0x2e, 0xf4, 0xce, 0xcc, 0xe9,
+ 0x88, 0xe8, 0x8b, 0x8a, 0x1c, 0x87, 0x29, 0xc4, 0xe1, 0xcb, 0xaa, 0xfd,
+ 0x70, 0xe5, 0xd4, 0x3f, 0x2a, 0xbf, 0x2f, 0x3a, 0x63, 0x29, 0x0c, 0xcf,
+ 0xe7, 0x61, 0xb3, 0xfc, 0xf4, 0x52, 0x35, 0x2f, 0x09, 0x57, 0x57, 0x78,
+ 0xd0, 0xb6, 0x81, 0xa1, 0x58, 0xfe, 0x65, 0xf9, 0x1d, 0x15, 0x57, 0xbe,
+ 0xbc, 0x95, 0x46, 0xfc, 0x5e, 0x1c, 0x9d, 0x84, 0x0e, 0x4d, 0x11, 0x14,
+ 0x9e, 0x65, 0xd6, 0xc9, 0xb9, 0xe5, 0x87, 0x33, 0x68, 0xa8, 0x5f, 0x82,
+ 0x90, 0xaf, 0x90, 0xe6, 0xbd, 0x62, 0x31, 0xf0, 0xfa, 0x5b, 0xcf, 0x2c,
+ 0x67, 0xe7, 0xf4, 0x05, 0xe3, 0xb9, 0x45, 0x92, 0x16, 0xbf, 0x0f, 0x5a,
+ 0x74, 0xd1, 0xdb, 0x24, 0x16, 0x9e, 0xb9, 0xd8, 0x2c, 0xc2, 0x46, 0x24,
+ 0xbc, 0xaa, 0x1b, 0x9f, 0xd0, 0xad, 0x18, 0x11, 0xb9, 0x9e, 0x8e, 0x46,
+ 0x75, 0xf3, 0x81, 0x37, 0x46, 0x99, 0x43, 0xad, 0x69, 0xf8, 0x75, 0x79,
+ 0xae, 0x2c, 0xeb, 0xb1, 0x77, 0x29, 0x47, 0x15, 0x95, 0x21, 0xa0, 0xf6,
+ 0xec, 0xb9, 0xcc, 0xa0, 0x6a, 0xfd, 0x47, 0x0f, 0x98, 0x5f, 0x12, 0xaf,
+ 0xed, 0x8b, 0x11, 0xe4, 0xcf, 0x93, 0x31, 0x79, 0x50, 0x08, 0xb0, 0x28,
+ 0x91, 0x56, 0xd9, 0x05, 0x16, 0x43, 0xc5, 0x84, 0x50, 0x43, 0x0f, 0x47,
+ 0xc9, 0x3a, 0xb4, 0xef, 0x39, 0xf0, 0xb1, 0xb5, 0x2c, 0xab, 0x3b, 0xbb,
+ 0xed, 0xaf, 0x64, 0x59, 0x5e, 0x6b, 0xa0, 0x0c, 0x6c, 0xf6, 0x4f, 0x69,
+ 0x4f, 0xf1, 0xaa, 0x02, 0x1d, 0x25, 0xa0, 0x39, 0xc8, 0xc7, 0xb4, 0x99,
+ 0xb8, 0x77, 0xf3, 0x10, 0x1a, 0x52, 0x50, 0x3a, 0xcc, 0x14, 0x90, 0x85,
+ 0x75, 0x63, 0xf8, 0x31, 0x14, 0x56, 0x0c, 0xa0, 0xc2, 0x83, 0x1f, 0xa7,
+ 0xcc, 0xc3, 0x69, 0xd8, 0xef, 0x2e, 0x30, 0x13, 0xbb, 0x15, 0xfc, 0x61,
+ 0xbc, 0x01, 0x89, 0x41, 0xbe, 0x04, 0x2f, 0x64, 0x3e, 0xa4, 0x0b, 0xf1,
+ 0x5e, 0x93, 0x7a, 0x85, 0xb0, 0x23, 0xbd, 0xbc, 0x89, 0xc6, 0xb4, 0x27,
+ 0xdd, 0x41, 0x51, 0xde, 0xe2, 0x05, 0x43, 0xf6, 0x91, 0x80, 0xfa, 0xb8,
+ 0xab, 0xc5, 0xf5, 0xc8, 0xca, 0x24, 0xa0, 0xc5, 0x50, 0x86, 0x29, 0x82,
+ 0x84, 0xfd, 0x34, 0x6e, 0xe2, 0x38, 0xd0, 0x86, 0xbe, 0x04, 0xee, 0x50,
+ 0x56, 0x79, 0x9d, 0x5b, 0xcf, 0xc4, 0x77, 0x8c, 0x60, 0xd9, 0x0b, 0xe6,
+ 0xc5, 0x7c, 0xef, 0x7f, 0x5e, 0x55, 0x6d, 0x27, 0xc0, 0x6a, 0xdc, 0xe1,
+ 0x1d, 0x99, 0x87, 0x11, 0xf1, 0x5d, 0xf5, 0xc8, 0x57, 0xd4, 0x30, 0x61,
+ 0xa1, 0x26, 0xd5, 0x59, 0x67, 0x60, 0xbb, 0x22, 0x96, 0xac, 0x97, 0x11,
+ 0xda, 0x21, 0xcf, 0xcf, 0x6c, 0x47, 0xbc, 0x17, 0xd6, 0xda, 0x03, 0x2e,
+ 0x95, 0x2d, 0x88, 0x54, 0xd9, 0xcd, 0x38, 0xb2, 0x08, 0xd7, 0x70, 0x52,
+ 0x0c, 0xed, 0x83, 0x23, 0x0f, 0xfc, 0x9a, 0x61, 0xca, 0x33, 0x05, 0x62,
+ 0x41, 0xde, 0x5c, 0xd2, 0xf8, 0x0a, 0xf3, 0xef, 0x2d, 0x2d, 0xc1, 0xb5,
+ 0x90, 0x01, 0x68, 0x02, 0x69, 0xdb, 0xe8, 0x24, 0xe4, 0x08, 0xa9, 0x17,
+ 0x04, 0x13, 0xab, 0xdc, 0xa7, 0x9e, 0x6c, 0x74, 0x76, 0x18, 0xe2, 0x55,
+ 0x05, 0xb6, 0xef, 0x3d, 0x19, 0xc7, 0x64, 0x63, 0xdf, 0x81, 0xc0, 0x97,
+ 0x4d, 0x78, 0x70, 0xc5, 0xcd, 0x8a, 0xa8, 0x88, 0xf4, 0xd2, 0xb0, 0x4e,
+ 0xfd, 0xe8, 0x79, 0x75, 0x70, 0x1f, 0x1c, 0xf9, 0x6e, 0xb4, 0xbe, 0xae,
+ 0x91, 0x65, 0xb4, 0x68, 0xcb, 0xa0, 0x7a, 0x3e, 0x5e, 0x5f, 0x02, 0x8f,
+ 0x52, 0x00, 0x4b, 0x49, 0x5d, 0x57, 0x9a, 0x37, 0x8d, 0x0a, 0x35, 0xbd,
+ 0x62, 0x4b, 0x26, 0x13, 0xf8, 0xe5, 0xec, 0xcd, 0x80, 0x47, 0x31, 0x1a,
+ 0x94, 0x5f, 0x79, 0x11, 0x81, 0x83, 0x41, 0xcf, 0x48, 0x5b, 0x52, 0xb2,
+ 0x84, 0xfd, 0x9c, 0x40, 0x92, 0xee, 0xb4, 0xad, 0x20, 0x3b, 0xfb, 0x61,
+ 0x0c, 0xf6, 0x39, 0x73, 0xfc, 0xf9, 0x97, 0x05, 0x41, 0x48, 0x97, 0xea,
+ 0x3d, 0x49, 0x15, 0x14, 0xad, 0xf4, 0x09, 0xc7, 0x1d, 0x1e, 0xe8, 0x39,
+ 0x8c, 0xc2, 0x0a, 0x50, 0x94, 0xd0, 0x9c, 0x40, 0x4d, 0x9b, 0xe7, 0x70,
+ 0x33, 0xbc, 0xd9, 0xf1, 0x37, 0xcb, 0xe1, 0xaf, 0x71, 0x9b, 0xa0, 0xa0,
+ 0xc7, 0x0d, 0x0b, 0xeb, 0x62, 0x92, 0x35, 0xb8, 0xaf, 0xa9, 0x36, 0x38,
+ 0x4a, 0x96, 0x01, 0xb0, 0x23, 0x8c, 0x0f, 0x4f, 0x61, 0xdf, 0xb1, 0x7d,
+ 0xaa, 0xc4, 0xe8, 0x6e, 0xde, 0x5b, 0x76, 0x0e, 0x36, 0xf0, 0x95, 0x1b,
+ 0x66, 0xcd, 0xcc, 0xe1, 0xd4, 0xe5, 0x59, 0x2b, 0xe6, 0x42, 0x20, 0x75,
+ 0xc0, 0x7b, 0xdd, 0x26, 0xb8, 0x73, 0xbb, 0x13, 0x55, 0x01, 0xd5, 0xd3,
+ 0xf2, 0x3d, 0x7c, 0x17, 0x43, 0x8f, 0x11, 0x8f, 0xdf, 0x60, 0x3a, 0xd2,
+ 0x96, 0x05, 0xf6, 0x55, 0x95, 0x5b, 0x15, 0x8f, 0xbe, 0x32, 0x83, 0xb3,
+ 0xd6, 0xbf, 0xc9, 0x04, 0x1d, 0x8f, 0x81, 0xab, 0x53, 0x81, 0x28, 0x7d,
+ 0x05, 0x33, 0xb5, 0xd7, 0xf2, 0x4e, 0x74, 0x0e, 0xfc, 0x81, 0xdf, 0x30,
+ 0x0e, 0x34, 0x04, 0x7c, 0x79, 0xd5, 0x4a, 0x5c, 0x52, 0xe8, 0xe0, 0x1a,
+ 0x6b, 0x17, 0x8d, 0x3a, 0xc4, 0x5f, 0xb5, 0x8f, 0x33, 0x65, 0xf7, 0xed,
+ 0xd2, 0x31, 0xab, 0x15, 0xa1, 0x2f, 0xe4, 0x9a, 0xb4, 0xd4, 0x92, 0x58,
+ 0x54, 0xc2, 0x97, 0x20, 0x22, 0x1c, 0x70, 0x29, 0x2c, 0xfe, 0xb0, 0x08,
+ 0x57, 0x98, 0x5c, 0x4d, 0x54, 0x9c, 0x32, 0x49, 0x31, 0x2b, 0xc5, 0x17,
+ 0x17, 0x1c, 0x76, 0x73, 0x5b, 0x26, 0xe3, 0xef, 0xa9, 0x28, 0x20, 0x90,
+ 0x33, 0x49, 0x3c, 0xc0, 0x03, 0x7a, 0xf5, 0x3e, 0xd2, 0x7d, 0xbd, 0x35,
+ 0x06, 0x78, 0x89, 0xb4, 0x6c, 0x6c, 0x3f, 0xeb, 0xac, 0x34, 0xaf, 0x9e,
+ 0xfc, 0x19, 0xbe, 0x37, 0x9c, 0x54, 0x6d, 0x81, 0xdb, 0xa3, 0x4c, 0x22,
+ 0x46, 0x78, 0x2d, 0x62, 0x61, 0xc5, 0xed, 0xe9, 0xe8, 0xe4, 0x71, 0xe8,
+ 0xf8, 0x23, 0x15, 0x4a, 0x4f, 0x0e, 0xaa, 0x56, 0xad, 0x44, 0xde, 0x43,
+ 0x19, 0xcb, 0xaf, 0x89, 0x52, 0x82, 0x58, 0xc4, 0xac, 0xa0, 0x8e, 0x9d,
+ 0x20, 0x99, 0xf2, 0xd2, 0xc3, 0x2e, 0xb7, 0x04, 0x94, 0x6f, 0xc1, 0x1e,
+ 0x4e, 0x09, 0x90, 0x36, 0xb2, 0x37, 0x6d, 0x58, 0x09, 0x72, 0xcf, 0xac,
+ 0xcb, 0xb8, 0xdd, 0x07, 0x07, 0x8b, 0x99, 0x90, 0x1a, 0xb9, 0xf4, 0x5b,
+ 0xd6, 0xe4, 0x51, 0x0a, 0x49, 0x5d, 0x34, 0x3d, 0xe4, 0xe3, 0x4a, 0xb7,
+ 0xc7, 0xe1, 0x1c, 0x47, 0xc6, 0x83, 0x0a, 0x6f, 0xb4, 0x1e, 0x62, 0xb4,
+ 0x3e, 0x73, 0xa7, 0xc4, 0xc6, 0x36, 0x86, 0x95, 0xf3, 0xe8, 0x59, 0xab,
+ 0xe3, 0x2a, 0x1e, 0xb5, 0xce, 0x85, 0xe5, 0x26, 0x54, 0x52, 0x32, 0x28,
+ 0xe7, 0x00, 0x4d, 0xdd, 0x1c, 0x66, 0x0f, 0x0d, 0xcf, 0x9e, 0xdb, 0xfa,
+ 0xb7, 0x62, 0xa4, 0x81, 0x24, 0x58, 0xe5, 0xd8, 0xa4, 0xdb, 0x29, 0x61,
+ 0xbe, 0x15, 0x93, 0x83, 0x56, 0x11, 0x56, 0xfa, 0x6a, 0xb4, 0xb4, 0x58,
+ 0x65, 0x9f, 0x52, 0x1e, 0xdb, 0x74, 0x14, 0x0d, 0x72, 0x4e, 0xc7, 0x85,
+ 0x97, 0x51, 0x36, 0xd8, 0x37, 0x09, 0xb8, 0xd2, 0x4f, 0xb3, 0x77, 0x56,
+ 0x13, 0xe3, 0x76, 0xcd, 0x24, 0x45, 0x8d, 0xc8, 0x20, 0xa4, 0x1e, 0x93,
+ 0xd7, 0xa0, 0x8a, 0x21, 0x5a, 0xa1, 0x6b, 0x01, 0xf1, 0x94, 0xb4, 0xe0,
+ 0x33, 0xc5, 0xbe, 0x18, 0xd4, 0xdc, 0xea, 0xd1, 0xbc, 0xe9, 0x58, 0x73,
+ 0x21, 0x58, 0x28, 0x4e, 0xb6, 0x02, 0x6a, 0xca, 0x70, 0x11, 0x78, 0x35,
+ 0xc8, 0x78, 0xf5, 0x4d, 0xb8, 0xda, 0x51, 0x3e, 0x6c, 0xd5, 0x46, 0x31,
+ 0x5d, 0x69, 0xfb, 0xc2, 0x6f, 0x2f, 0xae, 0xa9, 0x79, 0x6c, 0x0b, 0xfd,
+ 0x6b, 0xed, 0xe0, 0x35, 0xac, 0xc9, 0x11, 0x5f, 0x06, 0x90, 0x80, 0x59,
+ 0x47, 0xcb, 0xd8, 0x21, 0xed, 0x08, 0x46, 0x87, 0xd4, 0x4b, 0xf1, 0x15,
+ 0x74, 0x32, 0x72, 0x66, 0xde, 0x6a, 0xb9, 0xf1, 0x8d, 0x27, 0xdc, 0x59,
+ 0x44, 0xa3, 0x11, 0x32, 0xd8, 0x57, 0xb6, 0x9e, 0xe7, 0x09, 0xaa, 0x58,
+ 0xa6, 0x87, 0x1e, 0xb9, 0xc8, 0xcd, 0xde, 0xa9, 0xbe, 0x53, 0x6d, 0x42,
+ 0xaa, 0x87, 0x74, 0x96, 0x50, 0xaf, 0xdd, 0xf1, 0xe2, 0xcf, 0xa3, 0x99,
+ 0xbd, 0x6f, 0xb8, 0x48, 0xcc, 0x80, 0x73, 0xa8, 0xbb, 0x69, 0x72, 0xa6,
+ 0x41, 0x16, 0xad, 0xc3, 0xa6, 0x8c, 0x23, 0x2a, 0xf0, 0x02, 0xfc, 0x56,
+ 0x1a, 0x41, 0xd3, 0xe9, 0xcf, 0x08, 0x05, 0xb2, 0xd8, 0x56, 0xb7, 0x7a,
+ 0x19, 0xa1, 0x89, 0x1e, 0x31, 0x03, 0x50, 0x4d, 0x19, 0x4e, 0x64, 0x3e,
+ 0xd5, 0xfb, 0x16, 0xfd, 0x91, 0x33, 0x83, 0x67, 0x04, 0xc9, 0xea, 0x98,
+ 0x17, 0xe2, 0x9d, 0x2a, 0x82, 0x7b, 0x2c, 0xb8, 0xbf, 0x35, 0x05, 0xa8,
+ 0x1b, 0x66, 0xed, 0x7c, 0x12, 0x42, 0x1e, 0xee, 0x1b, 0xa9, 0xa4, 0xab,
+ 0x25, 0x8c, 0x01, 0x8e, 0x5e, 0x7b, 0x77, 0x40, 0x7e, 0x49, 0xbf, 0x2a,
+ 0x19, 0x1e, 0x6b, 0xcc, 0x34, 0x45, 0x4f, 0xa8, 0x22, 0xf5, 0x14, 0x68,
+ 0x87, 0x53, 0x7e, 0x5f, 0xa1, 0x46, 0x9d, 0xfe, 0x9d, 0x44, 0xaa, 0x52,
+ 0xc3, 0xab, 0xf2, 0xc0, 0x5d, 0xfe, 0x88, 0xe2, 0x99, 0x1f, 0xf2, 0xd9,
+ 0xa5, 0x75, 0x40, 0xfa, 0x99, 0xbe, 0x9d, 0xc2, 0xfd, 0x0a, 0xd4, 0x7b,
+ 0xdd, 0x17, 0xed, 0x2a, 0x75, 0xc7, 0x4c, 0xd4, 0x3a, 0x76, 0xb3, 0x72,
+ 0xa5, 0x48, 0x8f, 0x10, 0xf3, 0x2b, 0x1f, 0x2f, 0xa5, 0x3c, 0xe8, 0x8b,
+ 0x39, 0x5d, 0x30, 0x7d, 0x49, 0xfb, 0x4b, 0x20, 0x63, 0x98, 0xb8, 0x59,
+ 0x53, 0xc8, 0x3c, 0x59, 0xc6, 0x63, 0xb6, 0xe4, 0x70, 0x6b, 0xbc, 0x1b,
+ 0x0e, 0x0b, 0x29, 0x69, 0xc7, 0xc4, 0xbf, 0xfa, 0x58, 0x29, 0xa5, 0x19,
+ 0x3c, 0x55, 0x78, 0xfc, 0xcb, 0xf1, 0x8a, 0xab, 0x7c, 0xa0, 0x25, 0x48,
+ 0x5d, 0x4b, 0x5b, 0x49, 0xca, 0xa7, 0xf8, 0x23, 0x68, 0x84, 0x1f, 0xd2,
+ 0x6b, 0xdf, 0x5c, 0xcc, 0x8d, 0x4d, 0x97, 0xa5, 0xc7, 0x7e, 0xa4, 0xda,
+ 0x26, 0xbe, 0xfb, 0x9c, 0x8d, 0xaa, 0x4d, 0xb0, 0x38, 0x05, 0x08, 0x68,
+ 0xf4, 0x43, 0x28, 0x44, 0xf8, 0x65, 0x54, 0xc7, 0x50, 0xe7, 0x9d, 0x58,
+ 0x15, 0x01, 0x38, 0x55, 0xfb, 0xc5, 0x4a, 0x42, 0xa8, 0x24, 0xac, 0x84,
+ 0x9b, 0xb3, 0x52, 0x74, 0xf0, 0xdb, 0xdc, 0x37, 0x32, 0x79, 0x54, 0xf2,
+ 0x68, 0x1b, 0x0c, 0x3a, 0x96, 0x20, 0xcc, 0x8d, 0x05, 0xc3, 0xe5, 0x2b,
+ 0x2f, 0xe6, 0xb8, 0xfc, 0x39, 0xa4, 0xc0, 0xd6, 0x91, 0xc0, 0x88, 0xf6,
+ 0xcb, 0x11, 0x67, 0x11, 0xcf, 0x0f, 0x1d, 0xd9, 0xea, 0x84, 0xa4, 0xe3,
+ 0xa6, 0x34, 0x41, 0x7a, 0x9d, 0x37, 0x38, 0x13, 0xe6, 0xbd, 0xba, 0xa7,
+ 0xfd, 0x13, 0x43, 0xb4, 0x00, 0xab, 0xe2, 0x14, 0xd4, 0x62, 0x48, 0x3d,
+ 0x73, 0x0a, 0x26, 0xcb, 0xf5, 0x75, 0xd0, 0x3c, 0x00, 0xb1, 0x5a, 0xc9,
+ 0xa3, 0xe1, 0xd6, 0x2e, 0x06, 0xc3, 0xda, 0x4c, 0x72, 0xd7, 0x6f, 0x98,
+ 0x89, 0x7d, 0x6f, 0xb8, 0xe7, 0x52, 0x3c, 0xc1, 0x64, 0x87, 0x47, 0x18,
+ 0x8c, 0xe7, 0x8e, 0x5e, 0x01, 0xf5, 0x9b, 0x35, 0x82, 0x33, 0xb7, 0xcb,
+ 0x9c, 0x99, 0x6a, 0x38, 0x9d, 0x2d, 0xbb, 0x5e, 0x7e, 0x0d, 0xdc, 0x3a,
+ 0xda, 0xc0, 0xba, 0x87, 0x07, 0xda, 0x94, 0x75, 0xa4, 0xf9, 0xed, 0xb9,
+ 0xe5, 0xc7, 0xdb, 0xe8, 0x2c, 0xac, 0x4c, 0x65, 0xc4, 0x9f, 0xd9, 0x7b,
+ 0xb9, 0x8f, 0x3a, 0xd5, 0x0c, 0x14, 0x40, 0x19, 0x54, 0x21, 0xad, 0xc0,
+ 0x55, 0x68, 0x99, 0xbe, 0xf4, 0xab, 0x89, 0xdc, 0x11, 0x06, 0xb9, 0x59,
+ 0xfc, 0x4a, 0xda, 0x72, 0xe4, 0x27, 0xf5, 0x26, 0xb9, 0xb6, 0xfe, 0x87,
+ 0x6e, 0x3f, 0xaf, 0x63, 0xcc, 0xd7, 0x1e, 0x95, 0x8e, 0x2b, 0xb5, 0xba,
+ 0x0a, 0x54, 0x37, 0x91, 0xf9, 0x7b, 0xc4, 0x4e, 0xe2, 0xe6, 0x11, 0x1e,
+ 0xb4, 0x9f, 0xcd, 0x45, 0xf3, 0x53, 0x71, 0x3b, 0xbc, 0xfa, 0x45, 0x2c,
+ 0x0b, 0x9d, 0x62, 0x7d, 0x73, 0x5a, 0xb0, 0x26, 0x86, 0x30, 0x54, 0x33,
+ 0x72, 0xc9, 0xae, 0x1b, 0xfe, 0xbe, 0x36, 0x24, 0xd0, 0xcc, 0xcd, 0xd8,
+ 0xd4, 0x66, 0x49, 0x8f, 0xdd, 0x4e, 0xb2, 0xa9, 0x66, 0x6e, 0x78, 0xcc,
+ 0xb5, 0x3e, 0xf3, 0xba, 0xe9, 0x8c, 0x38, 0x3e, 0xc1, 0xdd, 0xef, 0x5c,
+ 0x89, 0xfb, 0x5e, 0xca, 0x12, 0xfd, 0x19, 0x80, 0x73, 0x56, 0x39, 0x23,
+ 0x19, 0x2a, 0x3e, 0xae, 0xb5, 0xc0, 0xf0, 0x81, 0x88, 0x0f, 0x60, 0xae,
+ 0x16, 0xa6, 0x3e, 0x5c, 0xbb, 0xda, 0x7d, 0x9c, 0x38, 0xdd, 0x97, 0xd7,
+ 0x31, 0x5f, 0x0b, 0x50, 0x45, 0x6f, 0xc5, 0x96, 0x49, 0x8e, 0x5f, 0x47,
+ 0xe4, 0xaa, 0xeb, 0x7d, 0x58, 0x7a, 0x51, 0xfc, 0xc2, 0x81, 0x5b, 0xc1,
+ 0x8d, 0xc2, 0xf1, 0xd5, 0xbb, 0x8a, 0x1e, 0xe9, 0xd8, 0x9c, 0x45, 0x51,
+ 0x0a, 0x8c, 0x42, 0xff, 0xcd, 0xce, 0x09, 0xf7, 0x89, 0x45, 0xee, 0x3b,
+ 0x3b, 0x51, 0x4f, 0xdc, 0xf1, 0x16, 0x4b, 0x8f, 0xa1, 0x78, 0xcb, 0x9a,
+ 0x44, 0xbe, 0xde, 0x09, 0x77, 0x2d, 0xdb, 0x68, 0x04, 0x9d, 0x9e, 0x41,
+ 0x7a, 0x1e, 0x8d, 0xf0, 0x09, 0x46, 0xb7, 0xd2, 0x6a, 0xc8, 0x8f, 0x8b,
+ 0x2d, 0xb0, 0x81, 0x96, 0xda, 0xbe, 0x70, 0xf1, 0x19, 0xfc, 0x53, 0x45,
+ 0xdb, 0x25, 0x87, 0x66, 0x5c, 0x1f, 0x49, 0xec, 0x0f, 0x5a, 0xb3, 0xab,
+ 0xb0, 0x0c, 0x43, 0x98, 0xcc, 0x38, 0xac, 0x53, 0xbf, 0x2e, 0x2f, 0x1f,
+ 0x66, 0x63, 0x8b, 0xfe, 0xc5, 0x82, 0x65, 0xd5, 0xcb, 0xdf, 0xc1, 0xa2,
+ 0x23, 0x2f, 0xd3, 0x37, 0x05, 0x7f, 0x16, 0xdb, 0xfc, 0x1f, 0x1d, 0xea,
+ 0xf9, 0x5f, 0x06, 0x86, 0x35, 0xff, 0x0f, 0xf6, 0x68, 0x60, 0xd9, 0x29,
+ 0xc9, 0x72, 0xc0, 0xe9, 0x87, 0x24, 0xe2, 0x97, 0x5a, 0x80, 0x0a, 0x09,
+ 0x51, 0xe0, 0x65, 0x9a, 0x25, 0x6a, 0xd4, 0x79, 0x9c, 0xb4, 0xe4, 0xa6,
+ 0xef, 0x5c, 0x33, 0xdf, 0xc1, 0xd9, 0xb1, 0x6e, 0x6d, 0x34, 0x1d, 0x16,
+ 0x3b, 0xc2, 0x4e, 0x5c, 0x3a, 0xbe, 0x1b, 0x05, 0x7e, 0x22, 0x05, 0x0e,
+ 0x8b, 0x76, 0x39, 0xc5, 0xa7, 0x0f, 0xe2, 0x7d, 0x11, 0x81, 0x7e, 0x32,
+ 0x1c, 0xcb, 0xf3, 0xe3, 0xbc, 0x6e, 0x48, 0x5c, 0xa5, 0xbf, 0x95, 0x18,
+ 0xb5, 0x38, 0x63, 0xdd, 0xca, 0xa1, 0xaf, 0x7c, 0x4c, 0x97, 0xff, 0x71,
+ 0xe6, 0x06, 0x21, 0xec, 0x11, 0x88, 0xf5, 0x88, 0x47, 0xcf, 0x94, 0x7f,
+ 0x45, 0xd1, 0x08, 0x7b, 0xfd, 0xf5, 0xef, 0xf0, 0x32, 0x15, 0x91, 0xa2,
+ 0x3e, 0xbc, 0xca, 0x41, 0x39, 0xe7, 0xed, 0x91, 0x67, 0x49, 0x97, 0x38,
+ 0x4e, 0x63, 0xe9, 0xa0, 0x27, 0x2f, 0xe0, 0x39, 0xbb, 0x8d, 0x2c, 0xb1,
+ 0x18, 0x20, 0x63, 0x7e, 0x8a, 0x34, 0x5a, 0x40, 0x58, 0x80, 0xab, 0x01,
+ 0x56, 0xab, 0x01, 0x52, 0xf8, 0xbf, 0x21, 0x88, 0xe6, 0xec, 0x7f, 0xef,
+ 0x2d, 0xda, 0x7f, 0x5e, 0x0f, 0xa6, 0x43, 0xc6, 0x47, 0xf6, 0xcb, 0x7a,
+ 0xcc, 0xb6, 0xbb, 0x8a, 0x0b, 0x1c, 0x33, 0x85, 0xe6, 0xa3, 0xad, 0x35,
+ 0x7a, 0xb7, 0x74, 0x75, 0xfc, 0xe6, 0xa0, 0x81, 0x18, 0x22, 0xbf, 0x25,
+ 0xe8, 0xc7, 0xd4, 0xc1, 0x57, 0x30, 0x32, 0x51, 0x82, 0x37, 0x34, 0x95,
+ 0xdf, 0x3a, 0x96, 0xc1, 0xa6, 0xdc, 0x63, 0x18, 0x84, 0xd6, 0xd0, 0xb9,
+ 0xa0, 0x52, 0x6b, 0x7b, 0x39, 0x8b, 0x1e, 0x4d, 0xdc, 0xa1, 0xaf, 0x4e,
+ 0x42, 0xba, 0xa5, 0x3b, 0x41, 0x02, 0xd1, 0x4d, 0x03, 0x81, 0xe9, 0x14,
+ 0xf0, 0x97, 0x3f, 0x6a, 0x61, 0xe8, 0x8e, 0xe5, 0xd6, 0xc3, 0x2d, 0x8b,
+ 0xa6, 0x50, 0x0b, 0xb9, 0x8d, 0x09, 0x77, 0xd2, 0xc6, 0x7a, 0x86, 0x36,
+ 0x8a, 0x9e, 0x8a, 0x46, 0x96, 0x26, 0x7d, 0xe7, 0x97, 0xf6, 0x62, 0xa4,
+ 0x42, 0x98, 0x07, 0x2d, 0x6f, 0x78, 0x8c, 0xcf, 0x8a, 0x4e, 0xf9, 0x8d,
+ 0xef, 0x28, 0x80, 0x18, 0x62, 0x92, 0x37, 0xa2, 0x26, 0x69, 0x9c, 0x54,
+ 0x1f, 0x12, 0x86, 0xd5, 0x4b, 0xc8, 0xc1, 0xf2, 0x61, 0xb2, 0x8b, 0xee,
+ 0x4f, 0x47, 0xcc, 0xcf, 0x7b, 0xae, 0x23, 0xd0, 0x33, 0x5e, 0x08, 0x74,
+ 0xb2, 0x34, 0x94, 0xca, 0xf0, 0xfb, 0x5a, 0x70, 0xad, 0x82, 0x00, 0x93,
+ 0x4a, 0xbf, 0x19, 0xe5, 0x66, 0xf8, 0x41, 0xfc, 0xc2, 0x85, 0x12, 0x5e,
+ 0x82, 0x46, 0xcd, 0xb3, 0x2d, 0xac, 0x47, 0x58, 0x43, 0x37, 0x90, 0x42,
+ 0x8e, 0x26, 0x0b, 0xd2, 0x05, 0x8e, 0x9f, 0x56, 0x74, 0xcd, 0xf9, 0x44,
+ 0xe0, 0xfd, 0x6e, 0x4f, 0x74, 0xbc, 0xd5, 0x39, 0x93, 0xbf, 0xba, 0x47,
+ 0xd8, 0x8d, 0x00, 0xb5, 0x1c, 0xf4, 0x50, 0xa8, 0xcf, 0xf1, 0x25, 0xaf,
+ 0x27, 0xdc, 0x5c, 0x43, 0xce, 0x73, 0xf6, 0xe8, 0xd8, 0x95, 0x98, 0xef,
+ 0x4b, 0xf3, 0xc4, 0x5a, 0x91, 0xef, 0xa8, 0x40, 0x4f, 0xe7, 0xc1, 0x94,
+ 0x9a, 0xdd, 0xf7, 0x38, 0x1e, 0x81, 0x60, 0xb8, 0xb7, 0x46, 0x2d, 0xa9,
+ 0x23, 0x5a, 0x62, 0x90, 0x97, 0xc6, 0xdf, 0x6f, 0xf8, 0xe3, 0xc5, 0xe0,
+ 0x1b, 0x82, 0xba, 0xb1, 0x18, 0x3d, 0x48, 0xee, 0x01, 0x32, 0x48, 0x10,
+ 0x78, 0x36, 0xa6, 0x55, 0xfa, 0xff, 0xa5, 0xc8, 0x15, 0x59, 0x2a, 0x88,
+ 0xc3, 0xea, 0xd0, 0x2e, 0x15, 0xfb, 0x3f, 0x08, 0xf2, 0xaf, 0x29, 0x10,
+ 0xa6, 0xa4, 0x28, 0xb0, 0xc1, 0xe8, 0x3d, 0x15, 0xfb, 0xc7, 0xc4, 0x83,
+ 0x37, 0x48, 0x97, 0x39, 0xb3, 0xfe, 0xe5, 0x70, 0xfb, 0x43, 0xb2, 0x9e,
+ 0x82, 0x20, 0x94, 0xbe, 0x59, 0xe4, 0xa7, 0x02, 0x63, 0x10, 0xa2, 0xae,
+ 0xc4, 0x61, 0x57, 0x1d, 0x20, 0x1b, 0x37, 0xf9, 0x73, 0x6f, 0x8c, 0xc8,
+ 0xa3, 0x40, 0x57, 0x82, 0x82, 0xb2, 0x0c, 0x75, 0xb4, 0xfe, 0xd8, 0x2c,
+ 0xd2, 0xa0, 0x18, 0x5d, 0x61, 0x10, 0x40, 0xc2, 0x99, 0xd6, 0x6b, 0xd3,
+ 0x54, 0x26, 0x54, 0x07, 0xa1, 0x28, 0x5d, 0xff, 0x37, 0x17, 0xff, 0xa2,
+ 0x33, 0x87, 0xee, 0x51, 0x6a, 0x27, 0x96, 0x35, 0xe3, 0x87, 0x8a, 0x1e,
+ 0x26, 0x56, 0xc8, 0x71, 0x34, 0x53, 0x25, 0x7a, 0x10, 0x5e, 0x8c, 0x37,
+ 0xe8, 0x03, 0x25, 0xf9, 0x70, 0x0a, 0xb5, 0x41, 0xce, 0xc8, 0x7f, 0x36,
+ 0x1d, 0x19, 0x52, 0xf3, 0x54, 0x2c, 0x27, 0xea, 0xdb, 0x7a, 0x44, 0xea,
+ 0x19, 0x8c, 0x11, 0x0e, 0x41, 0x2f, 0xd1, 0xa4, 0xa6, 0x1a, 0x2e, 0x89,
+ 0xc3, 0x78, 0x19, 0x95, 0xce, 0xbc, 0x00, 0x06, 0x90, 0xb4, 0x1f, 0x9b,
+ 0x14, 0xbc, 0x13, 0x9b, 0xfc, 0x68, 0xfa, 0x9c, 0x39, 0x6f, 0xc2, 0x64,
+ 0xcc, 0xdc, 0xf8, 0x7e, 0xae, 0x8e, 0x05, 0xcf, 0xe1, 0xab, 0x38, 0x46,
+ 0xbd, 0x58, 0x8d, 0x49, 0xc5, 0xa0, 0x75, 0x44, 0xbd, 0xca, 0x79, 0xf8,
+ 0xbe, 0xb7, 0xe4, 0x8a, 0x93, 0x29, 0xb8, 0x5d, 0xe7, 0x3c, 0x4f, 0xb8,
+ 0x33, 0x62, 0x4a, 0xbb, 0xaf, 0xf3, 0xb5, 0xfc, 0xf5, 0x30, 0x8e, 0x11,
+ 0x8a, 0x01, 0x20, 0x3e, 0xde, 0xaf, 0x95, 0xb5, 0xd9, 0x39, 0x5f, 0xa4,
+ 0x1c, 0x8f, 0x2f, 0x30, 0xa6, 0x22, 0x3b, 0x86, 0xc6, 0x2a, 0xff, 0x6d,
+ 0x8e, 0x83, 0x9c, 0xc8, 0x42, 0x74, 0x3d, 0x76, 0x55, 0xab, 0xe5, 0x17,
+ 0xda, 0x64, 0xff, 0x96, 0xcd, 0x30, 0xe7, 0xe7, 0x6a, 0x1b, 0x46, 0xa0,
+ 0x24, 0x99, 0x18, 0x21, 0x39, 0xeb, 0x6a, 0xb5, 0xd1, 0x11, 0xdd, 0xf2,
+ 0xb4, 0x6a, 0xac, 0x55, 0x3e, 0xf9, 0xbe, 0x20, 0x0c, 0x51, 0x24, 0xe9,
+ 0xae, 0xdf, 0x59, 0xa8, 0xef, 0xcd, 0xfc, 0xea, 0xb6, 0xe0, 0x61, 0x7d,
+ 0xd3, 0x2a, 0x8f, 0x21, 0xde, 0x20, 0xa8, 0x2e, 0xbe, 0x28, 0x62, 0xaa,
+ 0x95, 0xae, 0x25, 0x14, 0xd0, 0x55, 0x0f, 0x90, 0xb4, 0x03, 0xad, 0xf9,
+ 0xb4, 0x93, 0x0d, 0x7a, 0xff, 0xa9, 0x5b, 0x61, 0x3a, 0x36, 0xe0, 0x15,
+ 0xc9, 0x82, 0xe8, 0x1d, 0x22, 0xd8, 0x57, 0xa4, 0x75, 0x06, 0xe8, 0x86,
+ 0x06, 0x2c, 0x0a, 0xd3, 0x13, 0x62, 0x90, 0xba, 0xf2, 0xde, 0x77, 0xe3,
+ 0x80, 0x51, 0x99, 0xb3, 0xcc, 0x8d, 0x43, 0xdb, 0xc0, 0xcc, 0x45, 0x87,
+ 0xb8, 0x2a, 0xa8, 0x81, 0x20, 0x3b, 0xa1, 0xa0, 0x0c, 0xc6, 0x91, 0x53,
+ 0x4b, 0x21, 0xd5, 0x5f, 0x39, 0x12, 0x0b, 0x27, 0x9f, 0x15, 0x4a, 0xea,
+ 0xec, 0x49, 0x71, 0x4c, 0x2d, 0x2d, 0xa0, 0x89, 0x8f, 0x0c, 0x98, 0x20,
+ 0x5a, 0x45, 0xf2, 0xdf, 0x2e, 0x58, 0x48, 0xcc, 0x2c, 0xba, 0x93, 0x0f,
+ 0x96, 0x6f, 0x0d, 0x30, 0xcd, 0x82, 0xc4, 0xd1, 0xc0, 0x6a, 0xeb, 0x5e,
+ 0x5d, 0x02, 0xaa, 0x46, 0xab, 0x7f, 0x5f, 0x80, 0x72, 0x25, 0xad, 0xc4,
+ 0x04, 0x5e, 0x10, 0xee, 0xa4, 0xf6, 0x83, 0x50, 0x0e, 0x24, 0x2b, 0xdc,
+ 0xaf, 0x8c, 0x0f, 0x2e, 0x88, 0x88, 0xe5, 0xb6, 0xe0, 0x18, 0xfd, 0xdb,
+ 0xbd, 0x80, 0xe2, 0x53, 0x0e, 0xdb, 0x6d, 0x2b, 0x1c, 0x28, 0xd2, 0x33,
+ 0xd6, 0x43, 0x32, 0xc5, 0x3a, 0x1a, 0x7e, 0xee, 0x4b, 0x01, 0x28, 0xb3,
+ 0x8b, 0x43, 0xf8, 0xea, 0x4f, 0xe4, 0x19, 0x07, 0x95, 0x76, 0x1f, 0xec,
+ 0x1d, 0xe7, 0x6d, 0xac, 0xe5, 0x64, 0x9e, 0x3d, 0x16, 0x83, 0x56, 0x35,
+ 0xf3, 0xaa, 0xd0, 0xcd, 0x3b, 0x64, 0x81, 0x90, 0x0d, 0xdf, 0x3c, 0x86,
+ 0x17, 0xff, 0xf6, 0x9d, 0x64, 0x42, 0xcc, 0xc5, 0x41, 0x9b, 0x4d, 0x26,
+ 0x2b, 0x47, 0xa8, 0x53, 0xf9, 0x58, 0xc3, 0x51, 0x00, 0x31, 0x19, 0xa3,
+ 0xef, 0xeb, 0x21, 0x6d, 0x78, 0x7f, 0x45, 0xe6, 0x24, 0xcb, 0x90, 0x09,
+ 0xe8, 0x95, 0x0a, 0xde, 0x34, 0xfd, 0x21, 0xaf, 0x61, 0x34, 0x5d, 0xd3,
+ 0x61, 0x49, 0x4d, 0x26, 0x00, 0xbc, 0x13, 0xc4, 0xbb, 0x96, 0xfa, 0x3e,
+ 0x3d, 0x8c, 0xe7, 0x4f, 0xfa, 0x27, 0xb5, 0x46, 0x71, 0xf3, 0x01, 0x68,
+ 0xe9, 0x09, 0x28, 0xe7, 0x0f, 0x97, 0x0e, 0x69, 0xe3, 0x30, 0x86, 0xef,
+ 0x0d, 0x25, 0x33, 0x43, 0x4c, 0xc8, 0x8a, 0xbb, 0x13, 0x27, 0x08, 0x46,
+ 0x54, 0xa6, 0x28, 0x57, 0xf5, 0xcc, 0x61, 0x55, 0x67, 0xae, 0x43, 0x88,
+ 0xa9, 0x27, 0xe1, 0x3c, 0x61, 0xda, 0x9b, 0x18, 0xc8, 0x60, 0x06, 0x27,
+ 0xf7, 0x67, 0x45, 0xbd, 0xb9, 0x0c, 0x96, 0x73, 0x30, 0x1a, 0x9a, 0x5f,
+ 0xfa, 0x16, 0xa5, 0xbe, 0xc7, 0xed, 0x4a, 0x98, 0xf8, 0x13, 0xaa, 0x89,
+ 0x92, 0xa2, 0x77, 0xb6, 0x66, 0x9d, 0x20, 0x83, 0xd2, 0x25, 0xbb, 0x9e,
+ 0x70, 0xb8, 0x27, 0x63, 0x93, 0x29, 0x55, 0x61, 0x7c, 0xa3, 0x34, 0xeb,
+ 0xa5, 0x3d, 0xa6, 0x71, 0x75, 0x77, 0x55, 0xc9, 0xf7, 0x44, 0xad, 0xa0,
+ 0xac, 0xb5, 0x46, 0x41, 0x23, 0x57, 0x4d, 0x3b, 0x1e, 0xea, 0x38, 0x3b,
+ 0xab, 0xe5, 0x2b, 0xcc, 0x2b, 0x5a, 0xae, 0x84, 0xf1, 0x22, 0xc5, 0x2e,
+ 0xec, 0xe8, 0x0c, 0xbe, 0xb9, 0xe1, 0x20, 0xaa, 0x59, 0xc0, 0xd9, 0x40,
+ 0xe0, 0x5d, 0xdc, 0x73, 0x01, 0x0b, 0x1a, 0x08, 0x82, 0x98, 0x8e, 0x92,
+ 0x3d, 0xf2, 0x74, 0xa2, 0xfe, 0x47, 0x17, 0x46, 0x3e, 0xc6, 0xaa, 0xa3,
+ 0xc0, 0xcd, 0xd0, 0x2e, 0xbe, 0x5b, 0xd8, 0x6c, 0x10, 0xc3, 0x1b, 0x2d,
+ 0xd2, 0x83, 0x70, 0xa0, 0xf4, 0x66, 0xad, 0x9f, 0x89, 0x5c, 0x8b, 0xde,
+ 0xb0, 0x7c, 0x46, 0x9d, 0x2a, 0xd4, 0x9a, 0x75, 0x29, 0x0b, 0x62, 0x0a,
+ 0xb4, 0x1f, 0xeb, 0x81, 0x76, 0x70, 0x71, 0x37, 0xc6, 0xa0, 0xce, 0xab,
+ 0x75, 0xeb, 0x73, 0xac, 0x1a, 0x1d, 0x8b, 0x39, 0x13, 0xca, 0xfa, 0x17,
+ 0x62, 0x75, 0xf2, 0x2e, 0xe3, 0x62, 0xb2, 0xad, 0x96, 0x89, 0x0f, 0xd3,
+ 0x0a, 0xfb, 0x90, 0x83, 0x36, 0x43, 0x5f, 0x43, 0x52, 0x9f, 0x5a, 0xab,
+ 0xd5, 0xb6, 0xdf, 0x69, 0x69, 0x2c, 0xca, 0x5a, 0x20, 0xc7, 0x2a, 0x1f,
+ 0x90, 0x41, 0x24, 0x71, 0xf3, 0x54, 0x0c, 0x7c, 0x06, 0xfc, 0x5d, 0x33,
+ 0xc5, 0x56, 0x2c, 0x4a, 0x90, 0x4e, 0x36, 0x46, 0xa1, 0xef, 0x0d, 0x57,
+ 0xd0, 0x1c, 0x2b, 0xdd, 0x26, 0x94, 0xb4, 0xea, 0xbc, 0xd0, 0xb2, 0x89,
+ 0xb5, 0x53, 0x28, 0xf6, 0x80, 0xf6, 0xb7, 0xb4, 0x73, 0x8b, 0xad, 0x60,
+ 0x3c, 0x4c, 0x44, 0xc0, 0x1b, 0xe0, 0xb4, 0xf2, 0x97, 0xa0, 0xc2, 0x94,
+ 0x33, 0x4f, 0x96, 0x48, 0xe8, 0x35, 0x23, 0x9f, 0xaa, 0x64, 0x25, 0x11,
+ 0x50, 0x60, 0x81, 0x35, 0x62, 0xa0, 0x1e, 0x6b, 0xaf, 0x41, 0xda, 0xdb,
+ 0x40, 0x51, 0xd4, 0xa0, 0x02, 0x2f, 0xff, 0x6e, 0xf0, 0x11, 0x1c, 0xb6,
+ 0x7c, 0x1d, 0x79, 0xba, 0x05, 0x8c, 0x49, 0x96, 0xf5, 0x2d, 0xf4, 0x46,
+ 0x83, 0x80, 0xf1, 0x9f, 0xc2, 0xd9, 0x64, 0x88, 0x0f, 0x07, 0x5b, 0xd0,
+ 0x3a, 0x32, 0x93, 0xed, 0xf3, 0x41, 0xc7, 0x0e, 0x1b, 0xbd, 0x1b, 0x75,
+ 0x49, 0x68, 0xb1, 0xeb, 0x5f, 0xa4, 0x3e, 0xda, 0xec, 0x8a, 0xa3, 0x85,
+ 0x08, 0x8a, 0x90, 0x10, 0x1a, 0x59, 0x6a, 0x46, 0xfe, 0xe2, 0x38, 0x7c,
+ 0x17, 0x93, 0x13, 0x88, 0xee, 0xfc, 0x55, 0xc7, 0x9b, 0xcf, 0x31, 0x8c,
+ 0x8d, 0xd8, 0x32, 0xa6, 0x38, 0xae, 0x61, 0x94, 0xdb, 0x41, 0x32, 0x81,
+ 0x64, 0xe6, 0x44, 0x55, 0x04, 0x08, 0xc0, 0xbb, 0xa6, 0x9b, 0x9f, 0x06,
+ 0xa1, 0x1b, 0xbd, 0x1e, 0xe9, 0x7d, 0xd6, 0x7d, 0x6f, 0x30, 0x69, 0xb8,
+ 0xad, 0x77, 0x0a, 0xfb, 0x35, 0x03, 0x29, 0x16, 0xa7, 0xa6, 0x7d, 0x17,
+ 0xe2, 0xdb, 0x6e, 0xf0, 0xa4, 0x0e, 0x14, 0x5a, 0xb7, 0x18, 0xb7, 0x9f,
+ 0x1b, 0xbf, 0xa9, 0xae, 0x7e, 0xbf, 0x47, 0x79, 0xbe, 0xae, 0x53, 0x11,
+ 0x8f, 0x21, 0x92, 0x1f, 0x4a, 0x4a, 0x17, 0xbd, 0x38, 0x03, 0x2e, 0x28,
+ 0x76, 0xff, 0x3f, 0x0b, 0x43, 0x28, 0xf8, 0xa2, 0xa2, 0x58, 0xee, 0xec,
+ 0x4e, 0x01, 0x77, 0x81, 0x0f, 0x27, 0xdf, 0xc5, 0x6f, 0x43, 0xba, 0xad,
+ 0x28, 0x08, 0xa8, 0xdc, 0xde, 0xdf, 0x3e, 0x9f, 0xc5, 0x15, 0x39, 0xf5,
+ 0xea, 0x11, 0xf4, 0xe1, 0xe8, 0xfa, 0x24, 0x02, 0xa2, 0xbc, 0xd0, 0xca,
+ 0xc0, 0xc7, 0x22, 0x5a, 0x3b, 0x77, 0x18, 0x0b, 0x32, 0xb8, 0x52, 0xba,
+ 0xa5, 0x8d, 0x2b, 0x80, 0xda, 0x29, 0x1a, 0xaf, 0x99, 0x48, 0xf6, 0x81,
+ 0xd7, 0x5c, 0x11, 0x75, 0xe3, 0x10, 0xca, 0x14, 0xa5, 0x3e, 0x1a, 0x6a,
+ 0xf9, 0x30, 0x87, 0xcd, 0x6c, 0xd3, 0x55, 0xc2, 0x15, 0x7e, 0x8c, 0x4e,
+ 0x19, 0x17, 0x3c, 0xcf, 0xa9, 0xdd, 0xda, 0x9d, 0xfa, 0xfb, 0x18, 0x17,
+ 0x11, 0x76, 0x30, 0x2b, 0x9d, 0x60, 0x9d, 0xb5, 0x9a, 0x0f, 0xf4, 0x61,
+ 0xca, 0xd6, 0x29, 0x76, 0xd4, 0x85, 0x7e, 0xba, 0x7d, 0xff, 0x31, 0x17,
+ 0x12, 0xdd, 0xe6, 0xf2, 0x98, 0xf0, 0x5e, 0x5c, 0x1c, 0x1f, 0xc5, 0x00,
+ 0x9d, 0xee, 0xc5, 0xc0, 0xd9, 0xa5, 0xbd, 0xd0, 0x30, 0x8e, 0x24, 0x30,
+ 0x87, 0xfb, 0x9f, 0xcd, 0x51, 0xef, 0x20, 0xf0, 0x67, 0x41, 0x1c, 0x73,
+ 0xc5, 0x8f, 0x4d, 0xcb, 0x30, 0x3f, 0xa3, 0xd8, 0xb1, 0xc7, 0x9c, 0xb7,
+ 0xff, 0x4b, 0xd5, 0xae, 0xad, 0x89, 0x9b, 0xd0, 0x99, 0xd7, 0x52, 0xf7,
+ 0x7a, 0xa7, 0x5d, 0x1d, 0x5f, 0x15, 0xe7, 0x09, 0x84, 0xb4, 0x61, 0x78,
+ 0x47, 0x8f, 0xb1, 0x9f, 0x54, 0xaf, 0xc3, 0x5d, 0xf1, 0xad, 0xc7, 0xdf,
+ 0x0e, 0xd8, 0x99, 0x78, 0xf4, 0x86, 0x9e, 0x77, 0x0f, 0xc6, 0x93, 0xdd,
+ 0xc8, 0xa6, 0x71, 0x6d, 0x19, 0xee, 0x64, 0x6c, 0x6e, 0x53, 0xc0, 0xd3,
+ 0xa3, 0xf5, 0x2d, 0xe7, 0xec, 0x73, 0x34, 0x09, 0x1d, 0x34, 0x0d, 0x8c,
+ 0xae, 0xf9, 0x62, 0x6a, 0xf5, 0x67, 0x20, 0x46, 0x2b, 0xfc, 0x2f, 0x77,
+ 0xee, 0xa3, 0x68, 0xbf, 0x0e, 0x17, 0x5c, 0x8e, 0x44, 0x97, 0x95, 0x68,
+ 0x65, 0xee, 0xf8, 0xb1, 0x13, 0x29, 0xef, 0x10, 0xc7, 0x7b, 0xa6, 0x85,
+ 0xf3, 0xb7, 0xcb, 0x85, 0xa6, 0x38, 0xc4, 0xb1, 0xa1, 0xb8, 0x20, 0x6f,
+ 0x22, 0xd7, 0xd9, 0x54, 0x85, 0x6c, 0x6f, 0xb1, 0x1c, 0xa1, 0xb0, 0x13,
+ 0xab, 0x4e, 0xa6, 0x62, 0x59, 0x69, 0x6f, 0xf7, 0xfd, 0xfd, 0x8c, 0x48,
+ 0xe4, 0x2f, 0x64, 0x30, 0x75, 0x45, 0xe3, 0xa5, 0x02, 0xf3, 0x6b, 0x11,
+ 0x3f, 0xe2, 0xc2, 0x7b, 0x9d, 0x8a, 0x48, 0xfd, 0xa1, 0xa4, 0xe3, 0xf7,
+ 0xcc, 0xd5, 0xca, 0x3f, 0x64, 0x2e, 0x55, 0xcb, 0x67, 0x97, 0xca, 0xe7,
+ 0x45, 0x17, 0xdc, 0x68, 0x01, 0x84, 0xe5, 0xf4, 0x9a, 0x76, 0xfe, 0xb4,
+ 0x1b, 0xdc, 0x83, 0xee, 0x33, 0xa3, 0x74, 0x42, 0x22, 0x6c, 0xbe, 0x72,
+ 0x62, 0xa2, 0x39, 0x33, 0x3a, 0xea, 0x14, 0x4f, 0xf5, 0xf1, 0x9a, 0xbe,
+ 0xa9, 0x4f, 0xb1, 0xfc, 0xee, 0x1c, 0xbe, 0xba, 0x69, 0x03, 0x66, 0x3e,
+ 0x4f, 0x23, 0xe8, 0x95, 0x3f, 0xdb, 0xd0, 0x0a, 0xef, 0x19, 0xff, 0x4d,
+ 0xe8, 0x1e, 0x67, 0x70, 0x36, 0xca, 0x58, 0xf4, 0x4c, 0x97, 0xa5, 0x34,
+ 0xf7, 0xf2, 0xd4, 0xd3, 0x1e, 0x85, 0x18, 0x0e, 0x15, 0xf8, 0x9e, 0xe8,
+ 0x06, 0xbb, 0x7d, 0x77, 0x47, 0x7a, 0xe2, 0xc3, 0x10, 0x13, 0x19, 0xc3,
+ 0xfb, 0xa7, 0xf8, 0x97, 0xf5, 0x73, 0xe2, 0xf5, 0x25, 0x63, 0x71, 0x6b,
+ 0x52, 0xba, 0x93, 0x23, 0x67, 0x5a, 0x11, 0x3a, 0x8c, 0x8c, 0x6e, 0xd4,
+ 0x57, 0x94, 0x75, 0x74, 0x89, 0xdb, 0xb7, 0x11, 0xb0, 0x21, 0x1c, 0xee,
+ 0x83, 0x41, 0x34, 0x7c, 0x99, 0xa7, 0xbd, 0xfb, 0xfc, 0x08, 0xf6, 0xf3,
+ 0x0f, 0xc9, 0x5b, 0x3f, 0xbd, 0xb1, 0xda, 0xda, 0xf9, 0x0d, 0xe8, 0x06,
+ 0xe0, 0xf0, 0x45, 0x44, 0x74, 0x66, 0xc8, 0xb5, 0xa1, 0xf1, 0xa3, 0x3a,
+ 0x3e, 0x75, 0x18, 0xb2, 0x91, 0x0e, 0xd0, 0x68, 0x61, 0xd4, 0xc9, 0xba,
+ 0xb3, 0xad, 0x83, 0x13, 0xe2, 0x41, 0xc7, 0xeb, 0xa1, 0x03, 0x4d, 0xfc,
+ 0xf3, 0x67, 0x11, 0x58, 0xc0, 0x55, 0x08, 0xa3, 0x6f, 0x37, 0x12, 0x15,
+ 0xc7, 0x59, 0x1c, 0x60, 0xa6, 0x4e, 0xcb, 0xe1, 0xb1, 0x5b, 0xf7, 0x20,
+ 0xed, 0x73, 0x23, 0x16, 0x43, 0x4b, 0x66, 0xe7, 0xf5, 0xe0, 0x90, 0x4a,
+ 0x5f, 0xd5, 0x2d, 0x9c, 0xfc, 0x9c, 0x45, 0xf4, 0x48, 0xe9, 0x91, 0xb6,
+ 0xf7, 0x44, 0xb9, 0x6a, 0xb1, 0x48, 0x6c, 0x6f, 0x67, 0xcd, 0x37, 0xe7,
+ 0x96, 0xcd, 0x99, 0x7f, 0xf0, 0xfe, 0x0e, 0x52, 0x7d, 0xdd, 0x0b, 0xae,
+ 0x85, 0x8b, 0x1f, 0x99, 0xb1, 0xfa, 0x05, 0xff, 0x4d, 0xa7, 0x7c, 0xeb,
+ 0x17, 0x35, 0x44, 0xfa, 0x31, 0x6b, 0x57, 0x18, 0x23, 0x8f, 0xee, 0xd7,
+ 0x80, 0xfb, 0xd2, 0xc2, 0xc5, 0xce, 0x98, 0xd7, 0x73, 0x9b, 0x44, 0x27,
+ 0x96, 0x96, 0x82, 0x98, 0x0d, 0x47, 0x7f, 0xf0, 0x44, 0x9a, 0x12, 0x21,
+ 0x22, 0xa8, 0x57, 0x34, 0xf9, 0x68, 0x4c, 0x98, 0xc6, 0xed, 0xa1, 0xb6,
+ 0x68, 0xd2, 0xf2, 0x56, 0x10, 0xfa, 0x78, 0x78, 0x07, 0xe9, 0xf0, 0x08,
+ 0x81, 0x7c, 0x1d, 0x65, 0x18, 0x8f, 0x3d, 0x6b, 0xf7, 0x09, 0xe9, 0x11,
+ 0x58, 0x62, 0x05, 0xbe, 0xf9, 0x8f, 0xfb, 0xb7, 0x20, 0xee, 0x53, 0x46,
+ 0x62, 0xb8, 0x9c, 0x12, 0x2d, 0x4b, 0x67, 0x7b, 0xe1, 0xec, 0xb3, 0x98,
+ 0x6c, 0xe1, 0x89, 0x82, 0x0a, 0xe1, 0x9c, 0xfa, 0x25, 0x79, 0xa0, 0x74,
+ 0x4f, 0xe4, 0x0e, 0x6f, 0xc2, 0xe4, 0x6e, 0x8e, 0xb3, 0xbf, 0x24, 0x06,
+ 0x5c, 0x47, 0xf3, 0xfe, 0x4a, 0xc4, 0x6a, 0x77, 0x33, 0x87, 0x82, 0x92,
+ 0x09, 0xd6, 0xf4, 0x11, 0xe3, 0x43, 0x85, 0x75, 0x99, 0x70, 0x14, 0x16,
+ 0x5d, 0xbd, 0xd9, 0x20, 0x04, 0x51, 0x89, 0x10, 0x30, 0xea, 0x88, 0x84,
+ 0x5a, 0x16, 0x2f, 0x34, 0x85, 0x3b, 0x1f, 0x1d, 0x28, 0x8b, 0x0c, 0xe3,
+ 0xcd, 0xb8, 0x82, 0xa7, 0xd7, 0xae, 0x16, 0x29, 0x29, 0x80, 0x7f, 0x15,
+ 0xb2, 0x69, 0xf4, 0xff, 0x72, 0x85, 0xda, 0x1c, 0xb7, 0xc8, 0x21, 0x6b,
+ 0x35, 0xc8, 0x49, 0x90, 0x07, 0xf3, 0x91, 0x6a, 0x51, 0x1d, 0x78, 0x35,
+ 0x4a, 0xc6, 0xa7, 0xe1, 0x7a, 0x1c, 0x08, 0x48, 0x2e, 0xdc, 0xef, 0xa9,
+ 0xf5, 0xab, 0x69, 0x1a, 0x59, 0xf9, 0xd6, 0x35, 0xa2, 0x42, 0x59, 0xc2,
+ 0xd0, 0x30, 0x31, 0xb4, 0x5b, 0x2c, 0xaf, 0x8d, 0x3e, 0x08, 0x5e, 0xe2,
+ 0xb8, 0x45, 0xa9, 0x82, 0x5e, 0x47, 0x94, 0xb2, 0xc5, 0xd1, 0xdd, 0x35,
+ 0xf5, 0x84, 0x8c, 0xc4, 0x92, 0xa7, 0xf9, 0x57, 0x0b, 0x7e, 0x9f, 0xab,
+ 0x9c, 0xd3, 0x9a, 0x68, 0xd6, 0xa1, 0x91, 0x93, 0x84, 0xbe, 0x0c, 0xfc,
+ 0x75, 0x01, 0x58, 0xde, 0xf4, 0xeb, 0x47, 0x6e, 0x61, 0x1d, 0x6f, 0x6d,
+ 0x94, 0xb6, 0x3a, 0xe1, 0x44, 0x0d, 0xf5, 0x31, 0xc3, 0xc9, 0x3b, 0xd3,
+ 0xa3, 0x5c, 0x5f, 0x96, 0xa1, 0xf0, 0x52, 0x22, 0x87, 0xa9, 0x38, 0x69,
+ 0x4a, 0xef, 0x4d, 0xb0, 0xc6, 0x78, 0xd1, 0xd6, 0x8c, 0xf8, 0x8f, 0x8f,
+ 0x04, 0xb4, 0x54, 0xae, 0x55, 0x6c, 0x5c, 0x6e, 0x98, 0x7d, 0x92, 0x47,
+ 0x14, 0x42, 0x1e, 0xb3, 0x9d, 0xbc, 0xa4, 0x17, 0xd0, 0xbe, 0xf0, 0x53,
+ 0x50, 0x9c, 0xc0, 0xc6, 0x76, 0xfe, 0xf6, 0x95, 0x67, 0xf8, 0x69, 0x5c,
+ 0x2f, 0x98, 0xee, 0xbf, 0xdc, 0x62, 0x16, 0x39, 0x45, 0x01, 0xe1, 0x9d,
+ 0x8a, 0x33, 0x23, 0x49, 0xd3, 0x80, 0x4f, 0x72, 0x3a, 0xfe, 0x81, 0xe7,
+ 0x65, 0x53, 0xda, 0xc1, 0x92, 0x3e, 0x89, 0x8f, 0x65, 0xc6, 0x7d, 0x90,
+ 0x7f, 0x6e, 0x58, 0xc4, 0xba, 0xad, 0xdf, 0x6c, 0xce, 0x0c, 0x66, 0xec,
+ 0xc0, 0xfc, 0xf2, 0xac, 0x5f, 0xb4, 0xb4, 0xab, 0x8b, 0x0d, 0xb6, 0xac,
+ 0x29, 0x73, 0xbf, 0x5f, 0x13, 0x54, 0x89, 0xaf, 0xb8, 0x56, 0x00, 0x41,
+ 0x48, 0x4d, 0x4b, 0x13, 0xb3, 0xb8, 0x92, 0xc4, 0xff, 0x61, 0x26, 0x5e,
+ 0xfb, 0x76, 0xae, 0x05, 0xbb, 0x03, 0xaa, 0x46, 0x45, 0x5b, 0xcd, 0xd4,
+ 0x7e, 0x5f, 0x81, 0x50, 0x8c, 0x66, 0x57, 0x49, 0x8f, 0x3a, 0x5e, 0xf3,
+ 0x43, 0xac, 0x95, 0xb6, 0xdb, 0x18, 0x82, 0xbe, 0x29, 0xea, 0x2b, 0xd9,
+ 0xc0, 0xeb, 0xfe, 0xd5, 0xd3, 0x37, 0xf9, 0xa3, 0xcc, 0xb1, 0xd2, 0xe4,
+ 0x7b, 0x03, 0x0a, 0x84, 0x6a, 0xbe, 0x8c, 0x79, 0x98, 0x14, 0x41, 0x61,
+ 0x4d, 0x48, 0xa9, 0x33, 0x0e, 0x41, 0xf7, 0x03, 0xf8, 0x0f, 0xcc, 0x2a,
+ 0xc0, 0x37, 0x6e, 0x57, 0x24, 0x42, 0xd7, 0xed, 0xf7, 0x11, 0xd2, 0x84,
+ 0x91, 0x1f, 0x97, 0x69, 0x85, 0xc3, 0xec, 0xe0, 0xa2, 0x9b, 0xcb, 0x5b,
+ 0x24, 0x88, 0x29, 0x04, 0x05, 0x56, 0x5a, 0x30, 0x43, 0xc5, 0xba, 0x2a,
+ 0xc1, 0x8e, 0x19, 0x2b, 0x31, 0x6b, 0x5c, 0xbf, 0x12, 0x75, 0xb8, 0x5d,
+ 0x23, 0xce, 0x81, 0x45, 0xec, 0x93, 0x29, 0xcb, 0x5c, 0x18, 0xc6, 0x90,
+ 0x50, 0xd6, 0x1a, 0x48, 0x1d, 0x7d, 0xb7, 0x5c, 0x78, 0xcc, 0x0e, 0xc5,
+ 0xf5, 0x85, 0xc7, 0x28, 0x60, 0x5d, 0x4b, 0x4d, 0xb0, 0x39, 0x64, 0x47,
+ 0x55, 0xb9, 0xe7, 0x3a, 0x57, 0xbc, 0xc3, 0xa7, 0xe2, 0x8a, 0xf9, 0x85,
+ 0x0c, 0xff, 0x3b, 0x3c, 0x74, 0x6c, 0x96, 0xa4, 0xd5, 0x26, 0xe0, 0xb4,
+ 0xa6, 0x4c, 0xb0, 0x83, 0x1f, 0x54, 0x7b, 0x67, 0x7a, 0x2b, 0x9d, 0x79,
+ 0x08, 0x30, 0xd3, 0xe8, 0x62, 0x5e, 0x65, 0x2a, 0x5e, 0x7a, 0xf4, 0xbe,
+ 0x53, 0xac, 0x5d, 0xf4, 0x2f, 0x75, 0x9a, 0xb6, 0xb3, 0x3c, 0xe9, 0x58,
+ 0xe9, 0x12, 0x7f, 0x7e, 0xb8, 0xd6, 0x53, 0x5e, 0x4a, 0x3f, 0x70, 0x8b,
+ 0x67, 0x32, 0x50, 0x5c, 0xd3, 0x10, 0xd9, 0x8d, 0x47, 0x73, 0xc5, 0x21,
+ 0x44, 0x47, 0xe9, 0x4b, 0x89, 0xea, 0x86, 0x21, 0x4e, 0x2c, 0xea, 0x5e,
+ 0x70, 0x65, 0x28, 0xa0, 0x1d, 0x3e, 0x15, 0x9c, 0xa3, 0xd7, 0x62, 0xa5,
+ 0x13, 0x0d, 0x6f, 0x2f, 0x1f, 0xdd, 0x97, 0x28, 0xa5, 0x36, 0x75, 0xc8,
+ 0xdd, 0xfa, 0x02, 0x43, 0xf8, 0x6c, 0x13, 0xef, 0x93, 0x17, 0xe9, 0x3a,
+ 0xa9, 0xa7, 0x5c, 0x9c, 0x74, 0xc8, 0x19, 0x33, 0x6e, 0x0b, 0xf5, 0xca,
+ 0x5c, 0xcc, 0x90, 0x73, 0x88, 0x50, 0x79, 0x36, 0xd9, 0x1b, 0x60, 0xd1,
+ 0xe4, 0xcf, 0x3a, 0x26, 0xa9, 0xdd, 0xa3, 0x27, 0x33, 0x12, 0x95, 0xe3,
+ 0x7e, 0xc4, 0x8d, 0x0a, 0x44, 0x5e, 0x57, 0x4d, 0xd4, 0x3d, 0x9a, 0x6a,
+ 0x1d, 0x55, 0x81, 0x1f, 0x8b, 0xff, 0x84, 0x8d, 0xee, 0xe4, 0x9a, 0xf0,
+ 0x24, 0x89, 0xcc, 0x1a, 0x9d, 0x49, 0xd4, 0x9c, 0xea, 0x73, 0x52, 0x19,
+ 0x15, 0xe9, 0x50, 0x65, 0x18, 0xed, 0x1c, 0x3c, 0x50, 0xd0, 0xef, 0x8e,
+ 0x63, 0xe9, 0x08, 0x5b, 0x4d, 0x60, 0x0c, 0x26, 0x50, 0xb4, 0xe1, 0x49,
+ 0x58, 0x6b, 0x18, 0x54, 0x47, 0x60, 0x1e, 0xff, 0x4a, 0x00, 0x8a, 0x52,
+ 0x07, 0xef, 0x51, 0xcb, 0xc1, 0x41, 0xfe, 0x40, 0xa4, 0x3d, 0x6d, 0x76,
+ 0x5c, 0x43, 0x2c, 0xdc, 0x9c, 0xe8, 0x09, 0x7d, 0x8c, 0xdf, 0x84, 0xef,
+ 0xa9, 0xa8, 0xe8, 0xd3, 0xa3, 0x10, 0x00, 0x2d, 0xb7, 0x30, 0x29, 0xc4,
+ 0x6f, 0x10, 0xe7, 0x2a, 0xfa, 0xe3, 0x26, 0x49, 0xcf, 0x5c, 0xf1, 0xcc,
+ 0xc4, 0x27, 0xc9, 0xc2, 0x35, 0xd8, 0xba, 0xa7, 0x97, 0x61, 0x87, 0x95,
+ 0x13, 0xee, 0x1a, 0xec, 0xe3, 0x2d, 0xae, 0xca, 0x93, 0x26, 0x4e, 0xbe,
+ 0x02, 0x31, 0xb5, 0xec, 0xe9, 0x4e, 0xfc, 0x82, 0x94, 0x84, 0xb9, 0x92,
+ 0x96, 0xef, 0xeb, 0x2b, 0x41, 0xf3, 0xd4, 0x27, 0xb3, 0xef, 0x90, 0x53,
+ 0xd6, 0x83, 0xe8, 0x4f, 0x54, 0xbc, 0x76, 0xd3, 0xa3, 0x6f, 0xf0, 0xc7,
+ 0x2c, 0xc8, 0xa0, 0x64, 0x4b, 0xa3, 0x7f, 0x86, 0x52, 0xc3, 0xc0, 0xdb,
+ 0x63, 0xc8, 0x44, 0xfb, 0x6d, 0x5d, 0xa6, 0x4e, 0xc2, 0xbc, 0x07, 0x51,
+ 0x70, 0x47, 0xf3, 0xd9, 0xe9, 0x45, 0x0b, 0x46, 0xdd, 0x54, 0x49, 0xd8,
+ 0x1f, 0x49, 0x75, 0xc2, 0x86, 0xff, 0x9a, 0x66, 0x53, 0x86, 0xd9, 0xbf,
+ 0xa2, 0x30, 0xed, 0xd0, 0x40, 0x64, 0xcf, 0xb9, 0xb3, 0xbd, 0x6b, 0xb5,
+ 0x5c, 0x00, 0x8a, 0x50, 0xc0, 0xae, 0xf5, 0x56, 0xc9, 0x57, 0x0f, 0xb2,
+ 0x61, 0x65, 0xbe, 0xa6, 0x26, 0x00, 0x1c, 0xc5, 0xdc, 0x30, 0x46, 0xa5,
+ 0x88, 0x72, 0xf8, 0x07, 0x07, 0x84, 0xb5, 0xaf, 0x1b, 0xef, 0x12, 0x8a,
+ 0x61, 0xc2, 0xd9, 0xc3, 0x99, 0x2b, 0x16, 0x0a, 0x02, 0xf5, 0xd8, 0x46,
+ 0xbb, 0x16, 0xc5, 0xb6, 0x90, 0x37, 0x3b, 0x72, 0x9e, 0x3a, 0xb9, 0xbb,
+ 0x86, 0x6e, 0x08, 0x48, 0xd6, 0xad, 0x48, 0x8b, 0x53, 0x4f, 0xbc, 0x27,
+ 0x47, 0x84, 0x1c, 0x17, 0xba, 0xae, 0xf3, 0x00, 0xe1, 0x1a, 0xfd, 0x73,
+ 0xa5, 0xf7, 0x04, 0x44, 0xc1, 0xac, 0xbb, 0x2c, 0xc3, 0x69, 0xe2, 0x45,
+ 0x46, 0x33, 0xdd, 0x2c, 0xea, 0x82, 0xef, 0x7a, 0x45, 0x58, 0x07, 0x7a,
+ 0xaa, 0xdd, 0x36, 0x26, 0x5a, 0xed, 0x41, 0xc5, 0x61, 0x9c, 0xd6, 0x3c,
+ 0x57, 0x45, 0xcf, 0xb6, 0xc1, 0x1f, 0x14, 0x65, 0x68, 0x4e, 0x8b, 0x16,
+ 0xf2, 0x07, 0x76, 0x10, 0x4c, 0x00, 0xc6, 0xc6, 0x14, 0xcf, 0xdc, 0x98,
+ 0x17, 0x50, 0xde, 0x27, 0x86, 0xf2, 0x5f, 0xab, 0x94, 0x73, 0x75, 0xb5,
+ 0x9e, 0x5d, 0x03, 0x5e, 0xed, 0xa5, 0xa9, 0xdb, 0x47, 0x48, 0xf1, 0xb9,
+ 0xb7, 0x72, 0x02, 0xfb, 0x24, 0x86, 0x20, 0x13, 0xa8, 0xf0, 0x44, 0xc4,
+ 0x8a, 0xec, 0x3d, 0x33, 0x40, 0xaa, 0xe7, 0xb0, 0xa4, 0x0e, 0x34, 0x6e,
+ 0x5b, 0x07, 0x5d, 0x08, 0x05, 0x9d, 0x2d, 0x5c, 0x54, 0xd6, 0x1c, 0x35,
+ 0x4c, 0x7f, 0x0b, 0x39, 0x1f, 0xbd, 0xd7, 0xb9, 0x6b, 0xda, 0x86, 0xcd,
+ 0x09, 0x43, 0xb5, 0x9a, 0xf8, 0xed, 0x42, 0x72, 0x49, 0x9f, 0xdd, 0x09,
+ 0x21, 0x61, 0xca, 0x6b, 0x8e, 0x2c, 0x17, 0x5c, 0x7a, 0x08, 0x80, 0x02,
+ 0x9a, 0x3b, 0x42, 0xf6, 0x44, 0x50, 0xfc, 0x7c, 0x6f, 0x24, 0x75, 0xca,
+ 0x4b, 0x14, 0xb2, 0x3c, 0x4a, 0x59, 0x37, 0x7b, 0x4e, 0x0e, 0xa4, 0xa8,
+ 0x21, 0x0b, 0x72, 0x3a, 0x53, 0xc8, 0x63, 0xdf, 0x67, 0xb6, 0x32, 0x79,
+ 0x07, 0x13, 0x61, 0x54, 0x28, 0x17, 0x7d, 0x05, 0xa1, 0xde, 0xdd, 0x7c,
+ 0xbc, 0x15, 0x72, 0x4a, 0xa9, 0xee, 0x6e, 0x32, 0xa0, 0x72, 0x22, 0x63,
+ 0xe5, 0xf8, 0x59, 0x19, 0x31, 0xd7, 0xc0, 0xc7, 0xd0, 0x37, 0xda, 0x3b,
+ 0x15, 0x4e, 0xa1, 0xf7, 0x93, 0x85, 0x63, 0x4c, 0x6b, 0x0e, 0x00, 0xec,
+ 0x47, 0x5f, 0x1f, 0xb1, 0x13, 0xbe, 0xad, 0x13, 0x0d, 0x47, 0xf8, 0x94,
+ 0xce, 0x54, 0xce, 0x00, 0x2e, 0xfd, 0xa4, 0x6f, 0x72, 0xf3, 0x02, 0x9c,
+ 0xd4, 0x4c, 0xce, 0x3b, 0x26, 0x09, 0xbb, 0x54, 0xa5, 0xef, 0x2a, 0x8a,
+ 0xe3, 0x45, 0x38, 0xff, 0xc8, 0x58, 0x12, 0x76, 0x78, 0x2f, 0x15, 0x62,
+ 0xb6, 0x6b, 0x54, 0x3c, 0x10, 0xd3, 0x01, 0x6e, 0x14, 0x7f, 0xa6, 0xe6,
+ 0x31, 0xda, 0x17, 0xee, 0x43, 0x91, 0xcc, 0x84, 0x1f, 0x53, 0xb7, 0xb0,
+ 0xf7, 0x15, 0x5c, 0x24, 0xe1, 0x82, 0x25, 0x62, 0x35, 0x31, 0xf5, 0xa1,
+ 0xee, 0x46, 0x93, 0x8c, 0x55, 0x7d, 0x40, 0x43, 0xc8, 0xec, 0xed, 0x99,
+ 0x94, 0xe4, 0x74, 0x88, 0x9a, 0x81, 0x4a, 0x05, 0xae, 0x5c, 0x88, 0x08,
+ 0xe7, 0x69, 0x2a, 0xe1, 0x04, 0xe4, 0xd0, 0x7a, 0xeb, 0x7a, 0xa6, 0xe5,
+ 0x07, 0x73, 0x1e, 0x70, 0xb5, 0x47, 0xae, 0xee, 0xa9, 0xcf, 0x19, 0xb1,
+ 0x74, 0x43, 0x86, 0x1a, 0x21, 0x08, 0x42, 0x0d, 0xca, 0xd7, 0x1a, 0xa4,
+ 0xe8, 0xae, 0xf0, 0xe1, 0x90, 0x03, 0x46, 0xa3, 0xb6, 0x72, 0xfa, 0x84,
+ 0xf4, 0x98, 0xdd, 0x0e, 0x24, 0x5b, 0x4a, 0x3f, 0x4a, 0x8a, 0x73, 0x78,
+ 0xa6, 0x89, 0x47, 0x36, 0x99, 0x7c, 0x2b, 0xfe, 0x34, 0x95, 0xe6, 0x9e,
+ 0xac, 0x72, 0x92, 0x4c, 0x3a, 0xf2, 0xf9, 0xe3, 0xf6, 0x9d, 0x15, 0xf9,
+ 0xbe, 0x03, 0x59, 0x07, 0x04, 0xe5, 0x27, 0xb7, 0x43, 0x19, 0x6c, 0xba,
+ 0x2a, 0x5b, 0xf9, 0x8c, 0xd8, 0xd2, 0x4f, 0x90, 0x58, 0xd1, 0xaa, 0x97,
+ 0x50, 0x8b, 0xaa, 0x56, 0xb6, 0xf0, 0x0a, 0xd2, 0x4e, 0x55, 0x56, 0x91,
+ 0xeb, 0x4d, 0x9c, 0x66, 0xd1, 0xec, 0x39, 0x92, 0x40, 0xd7, 0xb8, 0x50,
+ 0x0b, 0x18, 0x3c, 0xa1, 0x96, 0xd0, 0xc4, 0x88, 0xc0, 0x04, 0x3e, 0xe2,
+ 0x16, 0xb2, 0x1c, 0x6a, 0x95, 0xb2, 0xb9, 0x82, 0xdb, 0xda, 0x1e, 0x95,
+ 0x91, 0x1f, 0x9d, 0xfc, 0x95, 0x34, 0x77, 0x6d, 0x43, 0x59, 0x90, 0xb6,
+ 0x14, 0x58, 0x93, 0xce, 0xca, 0xb1, 0xdf, 0x09, 0xcf, 0x69, 0x6b, 0x15,
+ 0x60, 0x47, 0xa9, 0x7c, 0x03, 0xf4, 0xf8, 0xec, 0x87, 0x16, 0x49, 0xc0,
+ 0x97, 0x7e, 0x58, 0xd4, 0x5b, 0x39, 0x90, 0x19, 0xc8, 0x92, 0x4f, 0x2b,
+ 0x1e, 0x4c, 0xfc, 0x26, 0xa2, 0x01, 0x98, 0xeb, 0xb7, 0x0f, 0x52, 0x84,
+ 0xa2, 0x7a, 0xfe, 0x6b, 0x97, 0xa7, 0xc6, 0x0b, 0xb8, 0x02, 0xe4, 0x45,
+ 0x19, 0x54, 0x2d, 0x4c, 0x57, 0x50, 0xa1, 0xeb, 0x5f, 0xc6, 0xb0, 0x0c,
+ 0xbf, 0xf0, 0x00, 0x5e, 0xf9, 0xae, 0x0b, 0x86, 0x85, 0xb3, 0xb1, 0x6f,
+ 0x5d, 0xf8, 0x58, 0x87, 0x62, 0x43, 0x82, 0x80, 0x9b, 0xcc, 0x10, 0x78,
+ 0x6d, 0x24, 0xd7, 0xa9, 0x1b, 0xc5, 0x77, 0x5a, 0xff, 0x3d, 0x9d, 0x0c,
+ 0x45, 0xb8, 0x6b, 0xc7, 0x95, 0xf1, 0xb9, 0x7b, 0xe7, 0x87, 0xf3, 0x10,
+ 0x55, 0x1b, 0x25, 0x41, 0x5c, 0xb5, 0x13, 0xe4, 0xf2, 0xba, 0xab, 0x37,
+ 0x6a, 0x1d, 0xca, 0x01, 0xe4, 0x4f, 0x7d, 0xcf, 0xad, 0xbc, 0xb5, 0xfc,
+ 0x98, 0x12, 0xac, 0x9c, 0x4a, 0xdd, 0x51, 0x88, 0x96, 0x0f, 0xf2, 0xed,
+ 0x58, 0xb3, 0x96, 0x48, 0xbe, 0xff, 0x42, 0x7a, 0x9e, 0x16, 0xc0, 0x1c,
+ 0xa9, 0xc7, 0x97, 0x97, 0x6d, 0xfa, 0xcf, 0x9c, 0xac, 0x5d, 0x4e, 0xb7,
+ 0x4c, 0xf1, 0x16, 0x9e, 0x7c, 0x2a, 0x06, 0x2e, 0x9b, 0x8b, 0x56, 0xa3,
+ 0x22, 0x35, 0x86, 0xec, 0x22, 0x33, 0xd1, 0xe0, 0xc2, 0x42, 0x53, 0x95,
+ 0x84, 0xfa, 0xf0, 0x2c, 0xa1, 0x2b, 0x6b, 0xc2, 0x35, 0x0e, 0x9a, 0x21,
+ 0x65, 0xb8, 0xd4, 0xc3, 0xb6, 0x7d, 0x2b, 0x46, 0xa7, 0x62, 0x6d, 0x70,
+ 0x95, 0xc9, 0xd1, 0xfe, 0x88, 0xd2, 0x3a, 0x35, 0x65, 0xa1, 0x8d, 0x16,
+ 0xad, 0x65, 0xde, 0x23, 0x4b, 0x65, 0xf3, 0xe8, 0x2d, 0x42, 0x79, 0xd3,
+ 0x71, 0x8f, 0x54, 0xf4, 0xd7, 0x80, 0x6a, 0x4d, 0x67, 0x26, 0x0d, 0x9b,
+ 0x9c, 0x39, 0x9c, 0x05, 0x3f, 0xe6, 0x23, 0xfd, 0xc0, 0x33, 0x85, 0x7c,
+ 0x42, 0x6f, 0x8b, 0x25, 0x6f, 0x0f, 0x26, 0xf6, 0x52, 0x91, 0xa3, 0x6b,
+ 0xbb, 0xe7, 0x4a, 0x26, 0x17, 0xd8, 0xbd, 0xcd, 0xd1, 0x44, 0xc2, 0xf4,
+ 0x33, 0xfd, 0xbd, 0x3f, 0x66, 0xe8, 0xfd, 0x04, 0xde, 0x37, 0x42, 0xb7,
+ 0xfd, 0xbc, 0x21, 0x17, 0x03, 0x0f, 0x49, 0x54, 0x1d, 0x1d, 0x02, 0xcc,
+ 0x93, 0xa3, 0x16, 0xf1, 0x9b, 0xac, 0xd1, 0x31, 0xdd, 0xe2, 0x34, 0xf1,
+ 0x62, 0xfc, 0xdf, 0xe2, 0xb3, 0x5b, 0x47, 0x78, 0x0b, 0x05, 0xd6, 0xe9,
+ 0xe9, 0xb4, 0x13, 0x46, 0x10, 0x38, 0xd1, 0xfb, 0x90, 0xe8, 0xa6, 0x82,
+ 0x40, 0x8a, 0x8d, 0x7f, 0xc7, 0xe5, 0x35, 0x96, 0xa0, 0xf5, 0x4d, 0x2b,
+ 0xe9, 0xbd, 0x0b, 0x08, 0x39, 0xf3, 0x66, 0xb1, 0xbc, 0x37, 0x0b, 0xe2,
+ 0x56, 0x40, 0x6e, 0x5b, 0x45, 0x73, 0x2a, 0xb8, 0xe0, 0x99, 0x5f, 0x9f,
+ 0x81, 0xad, 0xa5, 0x3f, 0xf3, 0x35, 0x5c, 0xc7, 0xb8, 0xa1, 0xd9, 0x7f,
+ 0x84, 0x84, 0x93, 0xbb, 0xbc, 0x57, 0xed, 0x98, 0xa4, 0xec, 0xb8, 0x1c,
+ 0xfa, 0xd9, 0xae, 0xbf, 0xe0, 0xc9, 0x4e, 0x9e, 0x3c, 0x9a, 0xc1, 0xb3,
+ 0x45, 0x05, 0x24, 0xab, 0x07, 0x20, 0x87, 0xc6, 0xfd, 0x84, 0xf9, 0x6c,
+ 0xfa, 0x5c, 0x9c, 0x09, 0x65, 0xa0, 0x8d, 0x3f, 0x07, 0x80, 0x46, 0x89,
+ 0x32, 0x07, 0xfe, 0xbc, 0xbd, 0xf4, 0xaf, 0x92, 0xe3, 0xee, 0x4a, 0xa6,
+ 0x00, 0xf8, 0x08, 0xec, 0x96, 0xae, 0x3c, 0x49, 0xa5, 0xf4, 0xd3, 0x5e,
+ 0x8e, 0x25, 0x80, 0x3a, 0xfe, 0xa9, 0x4b, 0x78, 0x40, 0x06, 0xbc, 0xf2,
+ 0x4a, 0x44, 0xe6, 0xa3, 0xfe, 0x94, 0x30, 0x7e, 0x72, 0x27, 0xb3, 0xed,
+ 0x9d, 0xca, 0xda, 0xd8, 0xd6, 0xca, 0x73, 0x3d, 0xbe, 0x97, 0xa2, 0xb1,
+ 0xe6, 0x8c, 0xd0, 0xe3, 0x68, 0x57, 0xa3, 0x89, 0x2b, 0xfa, 0x7f, 0x0a,
+ 0x8a, 0x93, 0x09, 0x99, 0x90, 0xf5, 0x6f, 0xbf, 0x79, 0x44, 0x18, 0xe9,
+ 0xb8, 0x40, 0x12, 0x7e, 0xf3, 0x61, 0xd0, 0x8b, 0x0c, 0xcb, 0x1f, 0x1a,
+ 0x5e, 0xb7, 0xf3, 0x81, 0x2e, 0x5e, 0x9e, 0x87, 0xc9, 0x74, 0x57, 0x42,
+ 0x63, 0xe1, 0xba, 0xd5, 0xc9, 0x29, 0x4d, 0xc0, 0x32, 0xbc, 0xeb, 0xba,
+ 0x81, 0x84, 0x21, 0x1e, 0xff, 0x37, 0xe8, 0x45, 0xa2, 0xa0, 0xdb, 0xb8,
+ 0x10, 0xba, 0xf2, 0xe6, 0x7a, 0xbf, 0x4a, 0x9f, 0xc9, 0xd4, 0x7e, 0x30,
+ 0xa2, 0x97, 0xe6, 0xf7, 0x1a, 0x74, 0xd9, 0xa5, 0xe3, 0xa2, 0x50, 0xe3,
+ 0x04, 0xae, 0x4e, 0x49, 0x12, 0x65, 0xc5, 0xf3, 0x58, 0xc7, 0xbc, 0x6a,
+ 0x14, 0x7b, 0x9e, 0x3f, 0x81, 0xbb, 0x21, 0xb2, 0x0e, 0x26, 0x17, 0x32,
+ 0xc7, 0x4e, 0xd8, 0x1e, 0x96, 0x83, 0x54, 0x4f, 0x35, 0xee, 0x21, 0x6c,
+ 0x5a, 0xdc, 0x92, 0xe3, 0x96, 0x53, 0x71, 0x89, 0x44, 0xd1, 0x8f, 0x4f,
+ 0xc8, 0xb4, 0x9b, 0x31, 0x5c, 0xff, 0xf0, 0x0f, 0xf3, 0xea, 0x4e, 0xb8,
+ 0x67, 0x0f, 0x1e, 0xa6, 0x55, 0xcb, 0xa5, 0xfd, 0x3a, 0x84, 0x80, 0xd3,
+ 0x1c, 0x2e, 0x15, 0xd5, 0x17, 0x4a, 0xb2, 0x1a, 0xb9, 0x34, 0x77, 0x79,
+ 0xac, 0x7b, 0x15, 0x43, 0x6d, 0x1a, 0x71, 0x08, 0xe5, 0x8e, 0x78, 0xb0,
+ 0x4e, 0x1f, 0xd5, 0x6c, 0xae, 0x9a, 0x2b, 0xdf, 0x2f, 0xd6, 0x5b, 0x5b,
+ 0x28, 0xac, 0xed, 0xb3, 0x9f, 0xc1, 0x38, 0xd7, 0xfc, 0xd8, 0xd0, 0x23,
+ 0x51, 0xa9, 0x3d, 0x7d, 0xd4, 0x8a, 0x85, 0x8c, 0x24, 0x65, 0x82, 0x91,
+ 0xa0, 0x52, 0x4b, 0xa5, 0x09, 0xe7, 0x0b, 0x88, 0xf6, 0xc0, 0x1f, 0xca,
+ 0x42, 0x37, 0xfc, 0xa6, 0xe0, 0x92, 0x41, 0x93, 0x06, 0x55, 0x65, 0x5e,
+ 0x47, 0x14, 0x72, 0xf1, 0x8f, 0x90, 0x02, 0x58, 0xc0, 0xca, 0xe0, 0xed,
+ 0x1e, 0x56, 0x4f, 0xf0, 0x48, 0xaf, 0x3e, 0x2e, 0xc1, 0x05, 0x6e, 0x12,
+ 0x01, 0x7e, 0xe0, 0xd5, 0x20, 0xb6, 0x5f, 0x35, 0x87, 0x78, 0xc5, 0x15,
+ 0x7e, 0x88, 0x5d, 0x0a, 0xcd, 0xc2, 0x94, 0x94, 0x60, 0xf8, 0x72, 0x40,
+ 0x3a, 0x63, 0xd4, 0x78, 0x5b, 0x05, 0x63, 0x9a, 0x1c, 0x35, 0x58, 0x88,
+ 0x4f, 0x09, 0x39, 0x35, 0xda, 0x06, 0xb0, 0xbf, 0x7c, 0x84, 0xc2, 0xaf,
+ 0xab, 0x12, 0x6d, 0xd7, 0x99, 0xef, 0xe1, 0xfe, 0x9a, 0x01, 0x9a, 0x1f,
+ 0x67, 0xd9, 0x2d, 0x61, 0xa7, 0xb0, 0x25, 0xd6, 0x20, 0x06, 0xbc, 0xb4,
+ 0xa3, 0xce, 0x8f, 0xd8, 0x90, 0xbe, 0x66, 0x48, 0x9f, 0xdc, 0x96, 0xcb,
+ 0x78, 0x04, 0x54, 0x2f, 0x2c, 0x2f, 0x28, 0x4d, 0x63, 0x85, 0x9c, 0x49,
+ 0xfe, 0xd7, 0x77, 0x7e, 0x34, 0x70, 0x6f, 0xd9, 0xdc, 0x18, 0xa1, 0x66,
+ 0xc4, 0x16, 0x33, 0xf7, 0x07, 0xd6, 0xb4, 0xcc, 0xe4, 0x63, 0x67, 0x82,
+ 0xd5, 0xf7, 0xfe, 0x35, 0xe4, 0x0f, 0xff, 0x1a, 0x00, 0x64, 0x4e, 0x8c,
+ 0xf0, 0xdf, 0xc0, 0xf3, 0xe5, 0x3d, 0xad, 0x0d, 0x8e, 0x98, 0x5f, 0x4e,
+ 0x10, 0x6f, 0xbe, 0x51, 0xd2, 0xb4, 0xf5, 0xa0, 0xff, 0xa5, 0x73, 0x7d,
+ 0x99, 0xc6, 0x99, 0xe5, 0xce, 0x40, 0x3b, 0xb1, 0xf5, 0x86, 0x3a, 0xaf,
+ 0x3f, 0x5f, 0x12, 0xa7, 0xff, 0xa3, 0x85, 0xf4, 0xeb, 0xa7, 0xfb, 0xb0,
+ 0x66, 0x02, 0x5f, 0x64, 0x70, 0xba, 0x5a, 0xa2, 0x92, 0x41, 0x9b, 0x49,
+ 0x64, 0x3a, 0x26, 0xd9, 0x55, 0xc3, 0x30, 0xf0, 0x13, 0x54, 0xde, 0xc1,
+ 0xaf, 0xfd, 0x48, 0xe8, 0x60, 0xd5, 0x8c, 0x24, 0x3a, 0xd9, 0xfe, 0xed,
+ 0x4e, 0xda, 0xda, 0xcf, 0x4e, 0xdf, 0x05, 0x46, 0xaa, 0x88, 0x43, 0xa5,
+ 0x8d, 0xd0, 0x6f, 0xc1, 0xfe, 0x50, 0xa5, 0x45, 0xfd, 0xc5, 0x56, 0x67,
+ 0x1c, 0x45, 0x69, 0x05, 0x2a, 0x7b, 0xb0, 0xa8, 0x7c, 0x80, 0x6d, 0x2f,
+ 0xcd, 0x2b, 0xf7, 0x3b, 0xca, 0xee, 0x75, 0x4b, 0xb1, 0xf1, 0x69, 0xe9,
+ 0x5d, 0x59, 0xd0, 0x4d, 0xb7, 0x2e, 0xd4, 0xc7, 0x30, 0x1c, 0x81, 0x5b,
+ 0x57, 0x20, 0x2e, 0xf9, 0x9f, 0x21, 0x10, 0x58, 0x9c, 0x80, 0x9e, 0x40,
+ 0xa5, 0x5a, 0xab, 0x21, 0x5f, 0x2c, 0xce, 0xfb, 0xb3, 0xf3, 0x07, 0x69,
+ 0xd0, 0x92, 0xfb, 0xa1, 0x06, 0x27, 0xd3, 0x29, 0x1e, 0xb3, 0x61, 0xbc,
+ 0xca, 0x9f, 0x85, 0x80, 0x79, 0xf6, 0xcc, 0x6b, 0x62, 0x42, 0x3b, 0x74,
+ 0xa4, 0x0a, 0x53, 0x59, 0x01, 0x54, 0x03, 0x17, 0x19, 0xb6, 0xa8, 0x06,
+ 0xd1, 0xc9, 0xe2, 0x9f, 0x9c, 0x77, 0x62, 0xa7, 0x12, 0x08, 0x01, 0xe8,
+ 0x2c, 0xd7, 0xaf, 0xb0, 0x5b, 0x4f, 0x29, 0x0a, 0xa0, 0x30, 0x84, 0x0a,
+ 0xe0, 0xf3, 0x85, 0xe8, 0x8e, 0xa4, 0x7e, 0xa9, 0x0b, 0x72, 0xac, 0x63,
+ 0xde, 0x19, 0xfd, 0x4d, 0x95, 0xb2, 0x3b, 0xa8, 0x45, 0x8d, 0xe2, 0x83,
+ 0xf6, 0xcd, 0x16, 0xb3, 0x46, 0x1e, 0x56, 0x96, 0x42, 0x5b, 0xf2, 0x2a,
+ 0xda, 0xed, 0xf9, 0x92, 0x21, 0xb3, 0xf0, 0x2f, 0xc2, 0x97, 0x18, 0xbf,
+ 0xa9, 0x26, 0xb6, 0x39, 0x59, 0xf1, 0x46, 0x49, 0x64, 0xf4, 0xb7, 0x7e,
+ 0x87, 0x09, 0x9a, 0x73, 0x5e, 0x10, 0x47, 0x19, 0xf4, 0x58, 0xc2, 0xff,
+ 0x81, 0x61, 0xe1, 0xff, 0x6b, 0xe3, 0xb9, 0xb4, 0x9a, 0x19, 0x71, 0xa7,
+ 0x87, 0x3d, 0x76, 0x6a, 0xbf, 0x4e, 0x89, 0x72, 0x45, 0xdc, 0x6a, 0x44,
+ 0x79, 0xf8, 0x76, 0x10, 0x4d, 0x53, 0xde, 0x56, 0x42, 0x9a, 0x47, 0xd9,
+ 0x13, 0x72, 0xf7, 0xaa, 0xe9, 0x84, 0x4f, 0x2d, 0x4d, 0xb7, 0x5f, 0xda,
+ 0x3f, 0x8f, 0x99, 0xbc, 0x77, 0x71, 0xc9, 0xbf, 0xfa, 0xb4, 0x65, 0x51,
+ 0x16, 0x9c, 0x3f, 0x04, 0x62, 0x6f, 0x45, 0x46, 0x7b, 0xcc, 0xf6, 0xbc,
+ 0xc2, 0x0d, 0xd6, 0x92, 0xe3, 0x29, 0xd4, 0xa5, 0x1c, 0x06, 0xc2, 0xf2,
+ 0xed, 0x4f, 0xf0, 0x5e, 0x55, 0xe2, 0xae, 0x9a, 0x68, 0x67, 0x7a, 0x79,
+ 0x66, 0xd4, 0x9d, 0xb0, 0x35, 0x8e, 0x79, 0x95, 0xf3, 0xca, 0xaf, 0x47,
+ 0xad, 0x84, 0x14, 0x62, 0xcf, 0xe0, 0xe4, 0x09, 0xe1, 0xed, 0xfc, 0xbf,
+ 0x6a, 0x06, 0x72, 0xc7, 0x0a, 0x53, 0x41, 0x93, 0xaf, 0x27, 0x33, 0xfb,
+ 0xd3, 0x68, 0xed, 0x5c, 0x13, 0x23, 0xce, 0xda, 0x62, 0xf3, 0xfe, 0xf2,
+ 0x91, 0x60, 0x0e, 0xb0, 0x6f, 0x43, 0x34, 0x2e, 0x56, 0xb8, 0xbb, 0x3f,
+ 0x52, 0xf3, 0x4d, 0x3f, 0x97, 0xfb, 0xab, 0x88, 0xc1, 0x08, 0xb3, 0xc7,
+ 0x72, 0x6b, 0xc1, 0x49, 0x63, 0xc2, 0xb7, 0x05, 0x00, 0x47, 0x53, 0xf0,
+ 0x22, 0xca, 0x47, 0xa4, 0x7c, 0x89, 0xff, 0x4d, 0x84, 0xe5, 0x90, 0xf1,
+ 0xd3, 0x61, 0x71, 0x35, 0xdf, 0xe9, 0x43, 0x8e, 0x20, 0x8d, 0xd4, 0xe6,
+ 0x74, 0xf7, 0xe8, 0x98, 0x17, 0xcd, 0xfd, 0xd7, 0x32, 0xa1, 0x5a, 0xd1,
+ 0x27, 0x30, 0xfe, 0x22, 0x05, 0x1e, 0xd2, 0xff, 0x1b, 0x23, 0x42, 0x33,
+ 0xf5, 0xa9, 0xbc, 0x43, 0xe9, 0xa5, 0x55, 0xf1, 0x51, 0x5e, 0xc6, 0xd6,
+ 0xac, 0x38, 0x06, 0x84, 0xe9, 0x75, 0x5f, 0xd7, 0xa2, 0xf9, 0xc2, 0xf3,
+ 0x6b, 0x0e, 0x5b, 0x01, 0x56, 0x60, 0x6e, 0xbe, 0x60, 0xaf, 0x96, 0x77,
+ 0xc8, 0x1f, 0x88, 0x9e, 0x19, 0x53, 0x48, 0x6d, 0x37, 0xd6, 0xc2, 0x8d,
+ 0x88, 0x1f, 0x39, 0x61, 0xcd, 0xea, 0x0e, 0x6a, 0x39, 0x62, 0xcd, 0xac,
+ 0x8d, 0xfd, 0x33, 0x1e, 0x1e, 0x6c, 0xfd, 0x1f, 0xd1, 0x8e, 0x14, 0x11,
+ 0x80, 0x9d, 0x29, 0x77, 0xc6, 0x6b, 0x12, 0xb6, 0xa9, 0x2b, 0xf0, 0xe7,
+ 0xa5, 0x4e, 0x47, 0x07, 0xc3, 0x34, 0xb1, 0xa1, 0xa0, 0x6a, 0x4a, 0x55,
+ 0xac, 0x01, 0x2d, 0x7d, 0x38, 0xd0, 0x41, 0xbe, 0x2a, 0xe9, 0xaa, 0xdd,
+ 0xc1, 0x39, 0xb7, 0xfb, 0xb4, 0x76, 0x99, 0xc1, 0xcc, 0x29, 0x06, 0x15,
+ 0x71, 0x7a, 0xb2, 0xdd, 0x82, 0x25, 0x13, 0xfa, 0xa7, 0x16, 0xeb, 0x22,
+ 0x3b, 0xa8, 0x4c, 0x7f, 0x62, 0xd8, 0x23, 0x0e, 0xca, 0x3b, 0x1b, 0x6d,
+ 0x21, 0x99, 0x2c, 0xd0, 0xa2, 0x54, 0x31, 0x58, 0x52, 0xc1, 0xff, 0xac,
+ 0x6c, 0xf6, 0xa2, 0x8f, 0x07, 0x5e, 0x17, 0x17, 0x7e, 0x52, 0x02, 0x4d,
+ 0xfc, 0x2f, 0xa0, 0x56, 0x48, 0xea, 0xb3, 0x84, 0x60, 0x9f, 0xd5, 0x59,
+ 0x98, 0x79, 0x8a, 0xa6, 0xe6, 0x4e, 0xd5, 0x2c, 0x3e, 0x53, 0x30, 0x1a,
+ 0x16, 0x5a, 0xfe, 0x15, 0xe3, 0x6d, 0xc5, 0xc5, 0x39, 0x3e, 0x28, 0xae,
+ 0xf5, 0x59, 0xfd, 0x5b, 0xb3, 0x34, 0x05, 0x92, 0x2a, 0xd5, 0xdd, 0xa9,
+ 0x58, 0xd7, 0x1a, 0xa5, 0xd9, 0xd3, 0xaf, 0xf2, 0xf0, 0xff, 0x91, 0xda,
+ 0x2d, 0x9c, 0xcc, 0xdb, 0xc8, 0xfd, 0xd7, 0x10, 0x31, 0x2b, 0xa9, 0xfd,
+ 0xb7, 0xc6, 0x5d, 0x83, 0x1f, 0xcd, 0xcc, 0x1c, 0xcb, 0x6a, 0xb5, 0xba,
+ 0x4d, 0xdf, 0x4c, 0xe0, 0x4e, 0x53, 0x5c, 0x34, 0x06, 0x35, 0xd3, 0x1f,
+ 0x43, 0xf5, 0xe3, 0x66, 0xb4, 0x7c, 0xb6, 0x06, 0x06, 0xe5, 0xab, 0x3b,
+ 0x12, 0x9e, 0x47, 0x7c, 0xe9, 0x91, 0xf2, 0x34, 0x47, 0x7c, 0xdb, 0xd4,
+ 0xf2, 0xec, 0xf1, 0x70, 0xff, 0x71, 0xf5, 0xf4, 0x24, 0x16, 0x61, 0xf7,
+ 0xa9, 0xb1, 0x12, 0x4d, 0xa6, 0x81, 0xf6, 0x4d, 0x6c, 0xd9, 0x98, 0xbb,
+ 0x66, 0x8f, 0x77, 0x8a, 0x02, 0xde, 0xf4, 0xf6, 0x10, 0xb4, 0xcc, 0xfb,
+ 0x0f, 0x69, 0x94, 0xfb, 0x37, 0x2a, 0x22, 0x26, 0x64, 0xfd, 0xc3, 0x85,
+ 0x30, 0xfb, 0x8f, 0x48, 0x8d, 0xc6, 0x5b, 0xc4, 0xee, 0xc5, 0x9a, 0x7d,
+ 0x57, 0x2d, 0x26, 0xd8, 0x7f, 0x37, 0xb7, 0xab, 0xe6, 0x55, 0x9a, 0x8f,
+ 0x30, 0xd0, 0x85, 0x6d, 0x44, 0x23, 0x8b, 0x9c, 0xc6, 0xdd, 0xd7, 0xa6,
+ 0xc5, 0xca, 0x99, 0x63, 0x8b, 0xd8, 0x0e, 0x50, 0x79, 0xce, 0xaa, 0xb8,
+ 0x62, 0x8c, 0x3d, 0x8b, 0x0b, 0xf1, 0xdc, 0x38, 0x88, 0x76, 0x82, 0xb7,
+ 0x47, 0x69, 0x72, 0xba, 0x9a, 0x4b, 0x20, 0x59, 0x88, 0x65, 0x02, 0x0c,
+ 0x9d, 0x6b, 0x40, 0x98, 0x8d, 0xd7, 0x83, 0xd5, 0xf0, 0xc3, 0x87, 0xca,
+ 0xdb, 0x7e, 0x96, 0x88, 0x64, 0x49, 0x16, 0x64, 0x08, 0xaa, 0x4b, 0xe0,
+ 0x30, 0x4d, 0xe9, 0xe8, 0x3e, 0x10, 0xcb, 0x18, 0x26, 0x13, 0x05, 0x1d,
+ 0x8e, 0xb7, 0x5f, 0xd9, 0x08, 0xca, 0xf8, 0x1e, 0x02, 0xf4, 0x35, 0x69,
+ 0xf2, 0xf1, 0x65, 0x50, 0xde, 0x9c, 0x93, 0x51, 0xb6, 0xa2, 0xc4, 0xa0,
+ 0x57, 0x58, 0x11, 0x9f, 0xce, 0xa0, 0x33, 0xb1, 0x3a, 0x02, 0x1a, 0x7f,
+ 0x15, 0x9d, 0x4a, 0x30, 0x66, 0x3c, 0xd2, 0xd4, 0xef, 0x94, 0xf4, 0x1b,
+ 0x0c, 0x33, 0x1e, 0x3e, 0x1c, 0x99, 0x30, 0xaf, 0x1e, 0x3d, 0x55, 0xc8,
+ 0x28, 0x87, 0xbd, 0x3a, 0x7a, 0xb5, 0xb7, 0x1c, 0x5c, 0xdc, 0xf1, 0xaf,
+ 0x5c, 0x16, 0x35, 0x81, 0x72, 0x8a, 0x95, 0x61, 0x13, 0x19, 0x77, 0x9f,
+ 0x45, 0xf2, 0x74, 0x66, 0x11, 0x8f, 0x91, 0x34, 0x32, 0x5e, 0xd9, 0x8a,
+ 0x0b, 0xad, 0x55, 0x66, 0x54, 0x88, 0xb0, 0x0a, 0xd2, 0xb0, 0x6e, 0x29,
+ 0xd2, 0x1d, 0xb6, 0x7a, 0x94, 0xd0, 0xbd, 0xf7, 0x37, 0x31, 0x04, 0xd3,
+ 0x79, 0x5c, 0xd7, 0x05, 0x5f, 0x29, 0x9d, 0xc1, 0x39, 0x17, 0xf6, 0xaf,
+ 0xfe, 0x2a, 0x26, 0xbe, 0x10, 0x4e, 0x57, 0x2e, 0xcb, 0x7b, 0x2b, 0x0f,
+ 0xd0, 0x27, 0x87, 0xab, 0xbc, 0x73, 0x0e, 0x3e, 0x21, 0x73, 0x81, 0xf1,
+ 0xf8, 0xd4, 0xcb, 0x72, 0xce, 0x81, 0xcc, 0x5d, 0x80, 0x32, 0x9f, 0xe0,
+ 0x25, 0x50, 0x1a, 0x3f, 0xe7, 0xa1, 0xb1, 0x00, 0xd7, 0x07, 0x02, 0x11,
+ 0x4a, 0x56, 0xe0, 0x95, 0x67, 0xb7, 0x7a, 0x7e, 0xcb, 0x2f, 0x76, 0xf0,
+ 0x7f, 0xff, 0xf3, 0x22, 0xf3, 0xd8, 0xac, 0x12, 0xc1, 0xea, 0x79, 0x55,
+ 0xe2, 0x28, 0x2f, 0xf9, 0x44, 0xdf, 0x31, 0xb8, 0x8e, 0xa9, 0x5f, 0x15,
+ 0x2b, 0x4a, 0x00, 0x82, 0x7e, 0xf3, 0xf7, 0xda, 0x27, 0x0e, 0x8d, 0x4f,
+ 0x3f, 0x06, 0x03, 0x33, 0xd2, 0xab, 0xd6, 0xb5, 0x79, 0xbe, 0x5e, 0x0d,
+ 0x10, 0xb1, 0x62, 0xb7, 0xe6, 0x24, 0xb2, 0x9a, 0xa6, 0xe1, 0x97, 0x5f,
+ 0xad, 0x5f, 0x2b, 0xdf, 0x10, 0xf9, 0x12, 0xe6, 0x6a, 0xc1, 0x7e, 0xac,
+ 0x1a, 0x13, 0x3b, 0xe0, 0xe8, 0x23, 0x39, 0x86, 0x9c, 0x5d, 0x27, 0xb8,
+ 0x3e, 0x25, 0xbe, 0x44, 0xcf, 0x2f, 0xcf, 0x7c, 0x41, 0xb5, 0x33, 0xbd,
+ 0xf0, 0x61, 0x6a, 0x93, 0x3f, 0x13, 0x82, 0xa5, 0xde, 0xdc, 0x8d, 0xd4,
+ 0x3e, 0xcd, 0xb8, 0xdb, 0x2b, 0xa8, 0xc9, 0xcd, 0x93, 0xe4, 0xe0, 0x43,
+ 0x50, 0x13, 0x78, 0x67, 0x7f, 0xe5, 0xe0, 0xf9, 0xb6, 0x8a, 0xc1, 0xb2,
+ 0xb2, 0xa6, 0xda, 0x4f, 0xe0, 0x1a, 0x9a, 0x2a, 0x1b, 0x77, 0xd6, 0x5a,
+ 0x21, 0x9e, 0x37, 0xd4, 0xc1, 0x97, 0x73, 0x3c, 0xd0, 0xe4, 0x97, 0x38,
+ 0x5f, 0x7b, 0x67, 0x80, 0x8f, 0x2d, 0x13, 0xd3, 0xac, 0xe6, 0x3c, 0x4d,
+ 0x4b, 0x85, 0x47, 0x30, 0x9d, 0x7c, 0xa5, 0xde, 0xc8, 0x06, 0x27, 0xbd,
+ 0x80, 0x2c, 0xa6, 0x2c, 0x3d, 0x27, 0xe2, 0x01, 0xb5, 0x5a, 0x58, 0x8b,
+ 0x08, 0x77, 0xcb, 0xb4, 0xfe, 0xe8, 0x61, 0x63, 0xe4, 0x54, 0xbb, 0xb7,
+ 0xb1, 0xdb, 0xcf, 0xa2, 0xf3, 0x14, 0xa2, 0x45, 0xc7, 0x69, 0xc3, 0x59,
+ 0xb2, 0x87, 0xab, 0x1d, 0x9d, 0x1a, 0xaf, 0x49, 0x5c, 0x7c, 0x21, 0x1f,
+ 0xaf, 0x0f, 0x8e, 0x00, 0x67, 0xab, 0xb3, 0x33, 0xfc, 0x97, 0xc2, 0x2e,
+ 0xa8, 0x52, 0xae, 0x8a, 0x16, 0x33, 0x39, 0xc4, 0x73, 0xdf, 0xc7, 0xf3,
+ 0x63, 0x0b, 0x31, 0xf8, 0xb8, 0x57, 0x91, 0xcb, 0x0f, 0x0b, 0x74, 0x3a,
+ 0xb4, 0x3e, 0x4d, 0x6d, 0x25, 0x1b, 0xe8, 0x30, 0xac, 0xbe, 0x29, 0x03,
+ 0x12, 0x43, 0xca, 0x12, 0x56, 0x25, 0x4a, 0xad, 0x87, 0x93, 0x43, 0xb1,
+ 0x41, 0xac, 0xa7, 0x06, 0xf2, 0x15, 0xf5, 0x00, 0x84, 0xc5, 0xbe, 0x22,
+ 0xf8, 0x60, 0xa1, 0x38, 0x42, 0x8c, 0x25, 0xda, 0xd2, 0x5d, 0xbe, 0xa1,
+ 0xc4, 0xc0, 0xf8, 0x33, 0x4e, 0x59, 0xf8, 0xd7, 0x3c, 0xfd, 0x65, 0xa0,
+ 0xa1, 0xf8, 0xbb, 0xc6, 0xa3, 0x20, 0xf5, 0x71, 0x04, 0xb6, 0x79, 0x19,
+ 0x85, 0x77, 0xc2, 0x6e, 0x4c, 0x17, 0x21, 0x59, 0xa7, 0xe5, 0x3d, 0x26,
+ 0x42, 0xeb, 0xf0, 0x29, 0xba, 0xef, 0x97, 0x05, 0x63, 0xe9, 0x7f, 0x88,
+ 0x4f, 0x8d, 0x7d, 0xdf, 0x01, 0x6d, 0x9d, 0x1e, 0xf6, 0xe1, 0x11, 0xf8,
+ 0xf1, 0xfa, 0x15, 0x31, 0xfd, 0x50, 0xac, 0x29, 0xbf, 0x4e, 0x3f, 0xbb,
+ 0xa1, 0x20, 0x2e, 0x4f, 0x30, 0xbd, 0xb9, 0xed, 0x5b, 0xbf, 0x23, 0x59,
+ 0x5f, 0x2a, 0x3e, 0xd2, 0x05, 0x00, 0xf9, 0x4b, 0xc6, 0x48, 0xd8, 0xb0,
+ 0x91, 0xa2, 0x9f, 0x5b, 0xbd, 0xd7, 0xa6, 0x7f, 0x41, 0x49, 0x78, 0x94,
+ 0x15, 0x90, 0xe7, 0x58, 0xd1, 0x8a, 0xfa, 0x27, 0xfa, 0x1b, 0xe9, 0x52,
+ 0xf2, 0xa8, 0xc1, 0xc1, 0x48, 0x61, 0x2a, 0x2f, 0xdd, 0x9e, 0x52, 0x9a,
+ 0xa7, 0x9d, 0xe8, 0x23, 0xd9, 0x73, 0x8b, 0x09, 0x8c, 0x79, 0xb3, 0x48,
+ 0x32, 0xe0, 0x4e, 0xce, 0x37, 0x48, 0x61, 0x26, 0x79, 0x8e, 0x02, 0xeb,
+ 0xa0, 0xf8, 0xff, 0xda, 0xaa, 0x36, 0x8b, 0x4d, 0x29, 0x8b, 0x8d, 0x41,
+ 0xea, 0xbc, 0xdc, 0xde, 0x3a, 0x9b, 0x9e, 0xdf, 0xda, 0xcc, 0xc1, 0x42,
+ 0x16, 0x59, 0x5c, 0x2a, 0x83, 0x35, 0xa3, 0x1e, 0x86, 0x6c, 0x53, 0x43,
+ 0xe9, 0xa8, 0x31, 0xd1, 0xfa, 0x24, 0x57, 0x74, 0xad, 0x07, 0xc6, 0x63,
+ 0x07, 0x77, 0x71, 0x9c, 0xe3, 0x58, 0x1a, 0xc2, 0xb3, 0xe6, 0x88, 0x5c,
+ 0x45, 0x0f, 0xe2, 0x4c, 0xd2, 0x20, 0x29, 0x3b, 0xf5, 0xf4, 0x4e, 0x85,
+ 0x82, 0xaa, 0xfd, 0xf1, 0x44, 0xf3, 0x27, 0x89, 0x9e, 0x12, 0x87, 0x14,
+ 0xf6, 0x56, 0x48, 0x03, 0x81, 0x5e, 0x96, 0xff, 0xb2, 0x8e, 0x48, 0x7d,
+ 0xe7, 0x0f, 0xfd, 0x24, 0x9d, 0x37, 0xbc, 0xac, 0xd7, 0x08, 0xbd, 0xe3,
+ 0xe7, 0x7d, 0x80, 0x15, 0x35, 0xdc, 0x88, 0xbe, 0xfa, 0x40, 0xa6, 0x17,
+ 0x85, 0xfc, 0x04, 0xda, 0xfa, 0x7b, 0x6c, 0xe6, 0xb4, 0x8d, 0x1b, 0x7e,
+ 0x27, 0xbc, 0xa7, 0x02, 0xeb, 0x8d, 0xc5, 0xaf, 0xc8, 0xa7, 0x98, 0x2b,
+ 0x4f, 0xad, 0x22, 0xc2, 0xf1, 0x33, 0x2f, 0x2d, 0x3e, 0x8b, 0x8a, 0x1b,
+ 0xea, 0x55, 0xd2, 0xe4, 0x15, 0xb9, 0x96, 0x1e, 0x21, 0xb6, 0x30, 0xb3,
+ 0x72, 0x50, 0xbc, 0x24, 0x29, 0x4c, 0x37, 0x86, 0xbb, 0xe0, 0x0a, 0x92,
+ 0xea, 0x51, 0x2e, 0xa5, 0xf1, 0x7c, 0x94, 0xef, 0x1b, 0x55, 0x8e, 0xe5,
+ 0x40, 0x3b, 0xa2, 0xb3, 0x7c, 0x81, 0x0d, 0xb5, 0x20, 0x76, 0xc5, 0x99,
+ 0x39, 0xfb, 0x61, 0x0b, 0x4b, 0xf4, 0xac, 0xd2, 0x65, 0xb7, 0x20, 0xc0,
+ 0xab, 0x3f, 0xe6, 0x1c, 0x46, 0xcf, 0xdf, 0x84, 0xc2, 0x66, 0xd2, 0x9b,
+ 0x53, 0x32, 0x45, 0xcc, 0x89, 0xbb, 0x89, 0xe7, 0x3d, 0xa3, 0x9d, 0x75,
+ 0xdc, 0xba, 0x67, 0xd4, 0x7a, 0xe0, 0x00, 0x03, 0xfb, 0xd1, 0x6d, 0x10,
+ 0xc0, 0x62, 0x4a, 0xfd, 0xb7, 0x31, 0x0c, 0x01, 0x1c, 0xfc, 0x7f, 0x5f,
+ 0xcb, 0xfe, 0x78, 0x7f, 0xe5, 0x8a, 0x09, 0x5a, 0xc6, 0xd8, 0x97, 0xe7,
+ 0x62, 0xcd, 0xc7, 0x0c, 0xf0, 0x5e, 0x16, 0xfe, 0x18, 0x50, 0xed, 0x73,
+ 0xcc, 0xf7, 0x81, 0x32, 0x0f, 0xad, 0x06, 0xb9, 0x82, 0xa0, 0xe9, 0x49,
+ 0x10, 0x98, 0x3b, 0x5d, 0xf1, 0xaa, 0xbe, 0xb0, 0xb1, 0x11, 0x1b, 0xd0,
+ 0xaf, 0xd1, 0xe5, 0xc8, 0x35, 0x2e, 0x04, 0x88, 0x26, 0x63, 0x25, 0x38,
+ 0x77, 0x1e, 0x66, 0x98, 0x7f, 0x7c, 0x75, 0xe2, 0x13, 0xe6, 0x6b, 0x63,
+ 0x59, 0xd1, 0xd1, 0x65, 0x4a, 0x3a, 0x5a, 0xfe, 0xf8, 0x23, 0xab, 0xed,
+ 0x2d, 0x68, 0x78, 0x55, 0x8f, 0x69, 0x1e, 0x2a, 0x8f, 0xb2, 0xc2, 0xa4,
+ 0xe6, 0x8f, 0xc4, 0xd9, 0x4e, 0xf6, 0xe9, 0x86, 0x0f, 0x3b, 0x98, 0x27,
+ 0x3a, 0x32, 0x17, 0x76, 0xee, 0x3a, 0x48, 0xcb, 0x2b, 0x31, 0x16, 0xe0,
+ 0x46, 0x56, 0xe3, 0x95, 0x11, 0x59, 0xb7, 0xfa, 0x83, 0x2d, 0x40, 0xff,
+ 0x4f, 0x13, 0x07, 0x13, 0xac, 0x47, 0x20, 0xcb, 0xb4, 0x84, 0x63, 0x72,
+ 0x11, 0x5e, 0xee, 0xbe, 0x08, 0xc2, 0xe6, 0x48, 0xdd, 0x28, 0x7f, 0x9f,
+ 0x99, 0x57, 0x66, 0x38, 0x42, 0xd2, 0x95, 0x0c, 0x2a, 0x4e, 0xf2, 0x0e,
+ 0x58, 0xe5, 0x82, 0xb5, 0x34, 0xa5, 0xaf, 0x3b, 0x5a, 0x8e, 0x83, 0xc5,
+ 0x6d, 0xfd, 0x43, 0x3f, 0xa8, 0xbd, 0x65, 0xcd, 0x2b, 0xd2, 0xf1, 0xae,
+ 0x66, 0x13, 0x34, 0x27, 0x39, 0x89, 0x4b, 0x7a, 0xb3, 0x28, 0xbf, 0xfc,
+ 0x66, 0x63, 0x2b, 0x59, 0xaa, 0x81, 0xe1, 0xbe, 0xc6, 0x39, 0xb0, 0x5c,
+ 0xf6, 0x15, 0x60, 0x99, 0xfc, 0x45, 0x0a, 0xc4, 0x31, 0x70, 0xd9, 0xb1,
+ 0x13, 0x97, 0xff, 0x80, 0xd0, 0x3c, 0x3e, 0x22, 0x79, 0x75, 0xc4, 0x66,
+ 0xf5, 0xf3, 0xb3, 0xe6, 0x77, 0x8b, 0xef, 0x56, 0x78, 0x2c, 0x33, 0xa5,
+ 0x01, 0xe3, 0xcf, 0xa0, 0x30, 0x64, 0x32, 0x1d, 0x05, 0x9a, 0x21, 0x41,
+ 0x18, 0x22, 0x0f, 0x7b, 0x60, 0x00, 0xbb, 0xc5, 0x5a, 0xd8, 0x85, 0xc1,
+ 0xd7, 0x11, 0x87, 0x53, 0xbd, 0xa3, 0xae, 0xd5, 0x3a, 0xcf, 0x00, 0x40,
+ 0x64, 0x1f, 0xa0, 0x44, 0xbb, 0x60, 0x49, 0x77, 0x01, 0xba, 0x3a, 0xa2,
+ 0xad, 0xb1, 0x0d, 0x00, 0xc8, 0x76, 0xcc, 0xd2, 0xc0, 0x69, 0x2d, 0x95,
+ 0x05, 0xf7, 0xf6, 0xd1, 0x8c, 0x2b, 0xee, 0x89, 0xab, 0x7c, 0x31, 0x82,
+ 0xfb, 0x9b, 0x09, 0x83, 0x39, 0x18, 0x19, 0x05, 0x73, 0x36, 0xac, 0xaf,
+ 0x0a, 0x66, 0xb7, 0xe3, 0x0d, 0x98, 0x96, 0x2d, 0xc7, 0x93, 0xb3, 0x2f,
+ 0x89, 0xe2, 0xf7, 0xe5, 0x4a, 0x6a, 0x0f, 0x9f, 0x0e, 0xe9, 0x10, 0x77,
+ 0x8f, 0xc4, 0x40, 0xa6, 0x11, 0x7f, 0xb3, 0xb4, 0xc2, 0x3c, 0xd6, 0x4e,
+ 0xe9, 0xa2, 0xdc, 0x2a, 0x37, 0xe2, 0x2f, 0x7b, 0x41, 0x17, 0xe5, 0x7a,
+ 0x80, 0xb4, 0x4a, 0x32, 0x2d, 0x37, 0x24, 0xa3, 0x42, 0xb4, 0xba, 0x58,
+ 0x59, 0x2a, 0x5e, 0x36, 0x09, 0xa5, 0xed, 0x32, 0xcb, 0x57, 0x83, 0xe9,
+ 0xbb, 0xe5, 0x7d, 0x7d, 0x10, 0x6f, 0x82, 0xce, 0x3b, 0x01, 0x49, 0xe4,
+ 0x60, 0xfe, 0xfc, 0xd5, 0xdd, 0xa9, 0xb0, 0xad, 0x4a, 0x12, 0x97, 0x77,
+ 0x0e, 0xa5, 0x10, 0x39, 0xf8, 0xfb, 0x5c, 0xd7, 0xdc, 0x66, 0x39, 0x07,
+ 0xe5, 0xce, 0x4c, 0xa3, 0xcf, 0x59, 0x97, 0xbd, 0x00, 0xa4, 0x90, 0x8b,
+ 0x31, 0x2f, 0xca, 0x91, 0x74, 0xe1, 0x4c, 0xdd, 0x0e, 0x93, 0x85, 0x9a,
+ 0x91, 0x5a, 0xfb, 0x9e, 0x1c, 0x01, 0x0f, 0xcb, 0xce, 0xb2, 0xcb, 0xa3,
+ 0xc2, 0xc4, 0x11, 0x03, 0x0a, 0x1d, 0x88, 0x03, 0x1e, 0x3c, 0xdd, 0x85,
+ 0x55, 0x2e, 0xee, 0x3b, 0xc7, 0x80, 0xf6, 0x63, 0xe9, 0xfc, 0xad, 0x71,
+ 0x76, 0xf5, 0x94, 0x94, 0x53, 0xdf, 0x33, 0x82, 0x2a, 0x68, 0xf6, 0x92,
+ 0x27, 0x67, 0xb2, 0x4c, 0x48, 0x8c, 0x58, 0x1d, 0xde, 0x20, 0x71, 0x57,
+ 0x7b, 0xe4, 0x67, 0xd1, 0x00, 0x9b, 0x40, 0x5b, 0x40, 0xe1, 0x6e, 0x95,
+ 0x4f, 0x6c, 0xf5, 0x4d, 0xd3, 0xf9, 0xca, 0x1d, 0xfa, 0x86, 0x7d, 0x2b,
+ 0x53, 0x1a, 0x21, 0xa2, 0xef, 0x70, 0x69, 0x67, 0x16, 0xbc, 0x2a, 0x56,
+ 0x0f, 0x58, 0xab, 0x44, 0x02, 0xe3, 0x2e, 0x3a, 0x8b, 0x47, 0x3c, 0x52,
+ 0x68, 0x80, 0x8c, 0xef, 0x90, 0x81, 0x6a, 0x60, 0x6a, 0xb5, 0x07, 0xba,
+ 0x1a, 0x82, 0xad, 0x58, 0x59, 0xbb, 0x7b, 0xf3, 0x5b, 0x29, 0xac, 0x2a,
+ 0x31, 0xc2, 0x0f, 0x37, 0x87, 0xb6, 0xd7, 0xe9, 0xaf, 0x65, 0x8f, 0x46,
+ 0x22, 0xe4, 0x6b, 0xcc, 0x4e, 0xd0, 0xdb, 0x56, 0x84, 0x0b, 0x1c, 0xcf,
+ 0xaa, 0xe3, 0x6a, 0x07, 0xbb, 0x0e, 0x4e, 0xb0, 0x76, 0x07, 0x14, 0xc8,
+ 0x77, 0x3d, 0x77, 0x8a, 0xca, 0x2e, 0x85, 0x1b, 0xfe, 0x15, 0x79, 0xe0,
+ 0x57, 0xb2, 0xc6, 0x96, 0x8d, 0xd1, 0x59, 0x5a, 0x9f, 0x47, 0x56, 0xdf,
+ 0xb5, 0x0f, 0x25, 0x8c, 0x2b, 0xd1, 0xbd, 0xa2, 0x4a, 0x8b, 0xdd, 0xc5,
+ 0x7d, 0x52, 0xcb, 0x62, 0x93, 0x79, 0x15, 0xd5, 0x14, 0x03, 0xab, 0x1b,
+ 0x28, 0xc3, 0x9c, 0xd1, 0x95, 0x52, 0x36, 0x7f, 0x35, 0x91, 0xe8, 0xe8,
+ 0xb3, 0xc9, 0xd2, 0xe7, 0x87, 0x5f, 0xc4, 0x8c, 0xc1, 0x83, 0xab, 0x6f,
+ 0xcc, 0xfc, 0x5f, 0x4d, 0xf4, 0xfa, 0x82, 0x53, 0xb9, 0xa8, 0x5f, 0x45,
+ 0x57, 0x50, 0xd9, 0x26, 0x34, 0xd2, 0x4a, 0x8f, 0x98, 0x84, 0xc7, 0xc5,
+ 0x67, 0x63, 0xf8, 0x03, 0x93, 0x1f, 0x47, 0x6f, 0xb1, 0x45, 0xa5, 0xd4,
+ 0xff, 0xa3, 0xcc, 0xca, 0x14, 0x82, 0x94, 0xa1, 0x4f, 0xa3, 0x3d, 0xc5,
+ 0x71, 0xaa, 0x3b, 0xec, 0x1a, 0x7f, 0x4b, 0xc0, 0xfd, 0x00, 0xfd, 0x4b,
+ 0xe1, 0xbf, 0x32, 0xb1, 0x07, 0x8e, 0x84, 0x79, 0x78, 0x88, 0xd7, 0xac,
+ 0xe4, 0x11, 0x48, 0xdf, 0xb0, 0x63, 0x9d, 0xc1, 0x61, 0xe6, 0xdc, 0x78,
+ 0x53, 0x27, 0xa4, 0xb6, 0xb5, 0x61, 0xfd, 0x32, 0x85, 0x0c, 0xfe, 0xc7,
+ 0xfc, 0x99, 0x00, 0x91, 0xc3, 0xb7, 0x28, 0x2f, 0x56, 0xb4, 0x7b, 0xe1,
+ 0x33, 0xe8, 0x11, 0x6c, 0x2f, 0xba, 0x9c, 0xdb, 0x7a, 0x82, 0xbd, 0xab,
+ 0x28, 0xd2, 0x0e, 0xc9, 0x68, 0xfc, 0x66, 0x9d, 0x97, 0x85, 0x00, 0x7f,
+ 0xbc, 0x51, 0xd0, 0xcd, 0x97, 0x74, 0x66, 0x32, 0xb6, 0x34, 0xa2, 0x6c,
+ 0x8f, 0xb8, 0x51, 0xa5, 0xb6, 0xda, 0x57, 0x0d, 0x0b, 0xa7, 0xf5, 0x95,
+ 0x64, 0xd4, 0x5d, 0x9f, 0xe8, 0xfd, 0xd7, 0xd2, 0xf2, 0x54, 0x5f, 0x94,
+ 0x95, 0x92, 0xbd, 0xb4, 0x01, 0x61, 0x00, 0x71, 0x41, 0x72, 0x5f, 0x57,
+ 0xe0, 0xbe, 0x97, 0x4d, 0xdd, 0x22, 0xf4, 0xfa, 0x82, 0x77, 0xea, 0xf1,
+ 0x30, 0x10, 0x4c, 0x94, 0xc4, 0xf2, 0x35, 0x27, 0x75, 0x8d, 0x66, 0x82,
+ 0x7f, 0x79, 0x33, 0xca, 0x4b, 0x6d, 0x8d, 0x08, 0x32, 0x22, 0xc7, 0x59,
+ 0x66, 0x61, 0xb2, 0x48, 0xe9, 0x17, 0x82, 0xa2, 0x4a, 0x72, 0x3b, 0xff,
+ 0xcb, 0x90, 0xea, 0x7d, 0xb5, 0x2a, 0x08, 0x76, 0xcf, 0xc3, 0xf7, 0x0d,
+ 0x69, 0xaa, 0x05, 0x7d, 0x11, 0x64, 0xc5, 0x21, 0xe8, 0x28, 0x7d, 0x91,
+ 0x35, 0x1b, 0xb7, 0x09, 0xa9, 0x7e, 0x7e, 0x35, 0x77, 0x7c, 0xe1, 0xf5,
+ 0x31, 0xea, 0x20, 0xf9, 0x7d, 0xc9, 0xe1, 0x38, 0x99, 0xc6, 0x80, 0x96,
+ 0x1c, 0x5c, 0x10, 0xa5, 0x30, 0x3a, 0x41, 0x48, 0x40, 0x02, 0xba, 0x6a,
+ 0x0b, 0xec, 0x5c, 0xf3, 0xad, 0xd9, 0x86, 0x8b, 0xe3, 0xbd, 0xff, 0x7a,
+ 0x6c, 0x8e, 0x23, 0xdb, 0x71, 0x23, 0xec, 0x01, 0x00, 0xab, 0xce, 0x5b,
+ 0x98, 0x05, 0x5e, 0x32, 0x7c, 0x1d, 0x2b, 0x3e, 0xe8, 0x73, 0xeb, 0x92,
+ 0xbe, 0x48, 0xb3, 0x08, 0x66, 0x03, 0x07, 0xc0, 0x3f, 0xad, 0x25, 0xfc,
+ 0xbe, 0xdd, 0x6c, 0x4d, 0xdf, 0x13, 0x4b, 0xaa, 0xf8, 0xc0, 0xe4, 0x59,
+ 0xfb, 0x55, 0xb5, 0x5d, 0x28, 0x2d, 0x1d, 0x1a, 0x65, 0x2a, 0x23, 0x2e,
+ 0x44, 0xe5, 0x2c, 0xfd, 0x94, 0xe9, 0xd3, 0xa5, 0x94, 0x65, 0xcc, 0xcd,
+ 0x5b, 0x26, 0x1b, 0x04, 0x09, 0xa2, 0xf0, 0x4e, 0xfc, 0x87, 0x51, 0xcc,
+ 0x5a, 0x4e, 0x50, 0x41, 0x00, 0xa8, 0x46, 0x61, 0x71, 0x39, 0xdf, 0xc6,
+ 0x1b, 0xed, 0x8a, 0xe9, 0xf0, 0xcf, 0xea, 0xb7, 0x4f, 0x77, 0x8a, 0x2c,
+ 0x4e, 0xec, 0xcc, 0x2c, 0x3f, 0xdb, 0x91, 0x44, 0x3b, 0x03, 0xf2, 0x1c,
+ 0x2e, 0x0a, 0xfb, 0x58, 0x51, 0xef, 0x0b, 0x34, 0x76, 0x9b, 0x0f, 0x91,
+ 0xfe, 0xa1, 0x59, 0x7c, 0xaa, 0x71, 0xd7, 0x8a, 0xf2, 0x95, 0xd0, 0xfc,
+ 0x54, 0xaa, 0x1a, 0x65, 0x67, 0xb2, 0x29, 0x79, 0x33, 0x5d, 0x7f, 0xd5,
+ 0x46, 0xbb, 0x5f, 0x8d, 0x68, 0x77, 0x54, 0x4c, 0x7c, 0x5f, 0xb4, 0xa3,
+ 0x1b, 0x7c, 0xe3, 0x39, 0x20, 0x2f, 0xf4, 0x43, 0x9b, 0x76, 0xc2, 0x59,
+ 0xf3, 0x52, 0x68, 0xed, 0x15, 0x3a, 0x0b, 0x27, 0xf5, 0x86, 0x7a, 0x09,
+ 0xe8, 0xc7, 0x18, 0xc5, 0x65, 0x9a, 0xc5, 0xb4, 0x88, 0x8c, 0x83, 0x83,
+ 0xfc, 0x89, 0xd5, 0xf8, 0xd5, 0xb4, 0x31, 0x13, 0x8c, 0x26, 0x8a, 0x95,
+ 0x39, 0x4c, 0xab, 0xc5, 0x97, 0x2c, 0xee, 0x9b, 0xb1, 0x36, 0x42, 0x23,
+ 0x1b, 0x67, 0xd1, 0xde, 0xe5, 0xac, 0xe8, 0xbd, 0xea, 0x41, 0x0c, 0x31,
+ 0x88, 0x0e, 0x2a, 0xb6, 0x49, 0xf3, 0x81, 0xb3, 0xe2, 0x5f, 0xc7, 0x5f,
+ 0xbb, 0x8b, 0x71, 0xe4, 0x04, 0x6a, 0x30, 0x4c, 0xa3, 0x01, 0x54, 0xa1,
+ 0x56, 0xaa, 0x0b, 0xf1, 0xec, 0xd0, 0x36, 0x73, 0xaa, 0x0f, 0x7f, 0x5f,
+ 0xeb, 0x97, 0xff, 0x14, 0x1f, 0x21, 0x3f, 0x2c, 0xd5, 0xf1, 0xcd, 0x39,
+ 0x31, 0x0e, 0x91, 0xe4, 0x0e, 0xf5, 0x12, 0x40, 0xe5, 0x62, 0xa2, 0x59,
+ 0xb2, 0x66, 0xee, 0xaa, 0x00, 0xd9, 0x9a, 0x4f, 0xd8, 0x27, 0xc7, 0x5b,
+ 0x0c, 0x5a, 0x2d, 0x37, 0x3e, 0xfa, 0x64, 0x5f, 0x7b, 0xc8, 0xf3, 0xe1,
+ 0x84, 0x47, 0x19, 0xb1, 0x1c, 0x0e, 0xe7, 0x1c, 0x50, 0x40, 0x8f, 0x67,
+ 0xe8, 0x57, 0xb6, 0x47, 0xfc, 0x85, 0xcf, 0xa0, 0x3e, 0xc0, 0x14, 0x86,
+ 0x54, 0xaf, 0xdc, 0x3a, 0x40, 0x0c, 0x67, 0x40, 0xab, 0x69, 0x19, 0xcf,
+ 0xef, 0x3d, 0x8a, 0x13, 0x98, 0xd7, 0x91, 0xc5, 0x45, 0xee, 0x8a, 0xec,
+ 0x44, 0x69, 0x29, 0xb1, 0x99, 0x6f, 0xd7, 0x6a, 0x2e, 0x57, 0x8d, 0x48,
+ 0x3e, 0x86, 0x77, 0x7c, 0xde, 0x6d, 0xf7, 0x1f, 0xdc, 0x41, 0xcc, 0xf4,
+ 0xd9, 0x85, 0x50, 0x55, 0x0f, 0x82, 0x09, 0x38, 0x74, 0x17, 0xa8, 0xe5,
+ 0xe0, 0xd0, 0xea, 0x6c, 0x1a, 0x07, 0x83, 0x3f, 0xa9, 0x93, 0xea, 0xc7,
+ 0xc5, 0xa6, 0x3d, 0xb4, 0x6e, 0x3c, 0x09, 0x62, 0x73, 0xf8, 0x73, 0x9f,
+ 0x94, 0x46, 0x68, 0xf0, 0x52, 0x4a, 0xf7, 0x07, 0xa4, 0x62, 0x5f, 0xaa,
+ 0x90, 0x46, 0x06, 0x86, 0xdf, 0x31, 0x7e, 0x4f, 0x8e, 0x89, 0xdc, 0xfb,
+ 0xbc, 0x48, 0x23, 0x3c, 0x14, 0x30, 0xfb, 0xfc, 0x40, 0xa1, 0x73, 0xdf,
+ 0x87, 0x72, 0xe4, 0x2c, 0x29, 0xf8, 0xd5, 0xa5, 0x9c, 0x00, 0xcf, 0x09,
+ 0x2d, 0xc0, 0xec, 0x7d, 0x55, 0x4c, 0xa9, 0x14, 0x79, 0x09, 0x48, 0xd2,
+ 0x00, 0xb9, 0x07, 0x35, 0xf4, 0xa6, 0x07, 0x4e, 0x00, 0x0f, 0x37, 0x74,
+ 0xf3, 0x10, 0x98, 0x47, 0x9a, 0x38, 0xf5, 0xf7, 0xe2, 0xa3, 0xda, 0xef,
+ 0xba, 0xf6, 0x0d, 0x9e, 0x84, 0xdf, 0x44, 0xe8, 0xf4, 0x66, 0x58, 0x5f,
+ 0xfa, 0x77, 0x4e, 0xd2, 0x7c, 0x6b, 0xcd, 0xed, 0xdd, 0x64, 0xee, 0xc2,
+ 0x53, 0xe2, 0x47, 0x59, 0xd0, 0xe4, 0xa4, 0x9f, 0x62, 0x97, 0xa4, 0xe0,
+ 0x99, 0xcf, 0x9c, 0x8e, 0x2a, 0x78, 0x27, 0x55, 0xa9, 0x12, 0x40, 0x7b,
+ 0x12, 0xfa, 0x98, 0xd0, 0x1f, 0x6e, 0x98, 0x15, 0x15, 0x15, 0xf6, 0x09,
+ 0x9c, 0xe1, 0x07, 0x1e, 0x2d, 0xc7, 0xd8, 0x5b, 0x52, 0x57, 0xa0, 0xd1,
+ 0x7f, 0x07, 0xfd, 0x00, 0x5a, 0x93, 0x09, 0xcb, 0x3a, 0xc7, 0xe0, 0x54,
+ 0x32, 0xe7, 0xaf, 0xdc, 0x42, 0x44, 0x44, 0x1c, 0x10, 0xd9, 0x8b, 0x38,
+ 0x5c, 0x3c, 0x6c, 0x60, 0xd4, 0x87, 0x7b, 0x11, 0x37, 0x67, 0x5f, 0x85,
+ 0x8b, 0xba, 0x9d, 0x99, 0x73, 0xf1, 0xf6, 0x2a, 0x8b, 0xbe, 0x4b, 0xba,
+ 0x83, 0x54, 0xaf, 0xfd, 0xa9, 0xbd, 0x84, 0x06, 0x54, 0xeb, 0x27, 0xd0,
+ 0xec, 0xac, 0x1b, 0x7e, 0x16, 0xcd, 0xb7, 0x1e, 0xee, 0xe3, 0x99, 0x21,
+ 0xc4, 0xf2, 0xc2, 0x5f, 0xe7, 0x9e, 0x7d, 0xa5, 0x8e, 0x6d, 0xb7, 0xcc,
+ 0xcf, 0xc9, 0x4c, 0xdf, 0x67, 0x16, 0x03, 0xd4, 0x54, 0x7c, 0xdf, 0x2b,
+ 0xb4, 0xab, 0xf8, 0x2c, 0x4b, 0xed, 0x20, 0xec, 0x1d, 0x08, 0xff, 0xa9,
+ 0xb1, 0x9f, 0xc5, 0xa9, 0x7f, 0xaa, 0x4a, 0xb5, 0xd3, 0xea, 0x83, 0x51,
+ 0xb9, 0x11, 0xe7, 0xf9, 0x43, 0xec, 0x2f, 0x2c, 0x51, 0x31, 0xa3, 0x77,
+ 0x28, 0x06, 0x2d, 0x2b, 0x96, 0x2a, 0xcb, 0x6d, 0xec, 0x65, 0x69, 0x23,
+ 0xe9, 0x01, 0xce, 0x5a, 0xde, 0xfa, 0xa1, 0xa6, 0x88, 0x4d, 0x0b, 0x1c,
+ 0xfc, 0x29, 0x00, 0xb3, 0xfb, 0xb6, 0x4c, 0xef, 0x16, 0xda, 0xa6, 0x94,
+ 0xa6, 0x90, 0x9d, 0x91, 0xdf, 0xef, 0x85, 0x7f, 0xf5, 0xcf, 0xb3, 0x84,
+ 0xda, 0xf9, 0x17, 0x73, 0x90, 0x73, 0x43, 0x60, 0x22, 0x82, 0x11, 0xee,
+ 0xc5, 0x07, 0x3e, 0x2a, 0x2f, 0xb7, 0x26, 0x85, 0x78, 0xb7, 0xc1, 0xfd,
+ 0xef, 0xb2, 0x9f, 0xd3, 0x93, 0xed, 0x07, 0xde, 0xb3, 0xf1, 0x8c, 0x42,
+ 0x12, 0xfd, 0x58, 0xde, 0x74, 0x44, 0xd2, 0x97, 0xe6, 0xc8, 0x33, 0x50,
+ 0xb9, 0xee, 0xdb, 0x5b, 0x1e, 0x9e, 0x5d, 0xcd, 0x54, 0x9e, 0x72, 0xc1,
+ 0x29, 0xaa, 0xa1, 0xf5, 0x59, 0x92, 0x68, 0xea, 0x76, 0x00, 0x9d, 0x9b,
+ 0x1f, 0x1b, 0x2f, 0x10, 0xa1, 0x19, 0x39, 0x56, 0xf7, 0xa3, 0x7c, 0xd4,
+ 0x99, 0xa7, 0x9f, 0x4f, 0x19, 0x14, 0xec, 0xb2, 0xb9, 0x37, 0x0d, 0x98,
+ 0xda, 0x47, 0x3a, 0x40, 0x17, 0x81, 0x7a, 0x6a, 0x31, 0x2a, 0x42, 0x22,
+ 0xe3, 0xbe, 0xad, 0x4c, 0x00, 0x1f, 0x3f, 0x93, 0x1b, 0xd9, 0x67, 0xd6,
+ 0x8f, 0x0e, 0x87, 0x6b, 0x06, 0xb7, 0x85, 0xe0, 0x7f, 0x9e, 0xa9, 0x31,
+ 0xc6, 0xc5, 0xf7, 0x70, 0x82, 0x47, 0x4a, 0xf2, 0x6a, 0x37, 0x81, 0x9d,
+ 0x17, 0xe3, 0x26, 0xd6, 0x8a, 0xf5, 0xfe, 0x45, 0x8b, 0xe2, 0xc2, 0x7e,
+ 0xa0, 0x6a, 0x4a, 0x5a, 0xe7, 0x7e, 0x90, 0x76, 0xad, 0x60, 0x2a, 0x3c,
+ 0x8d, 0xd2, 0xbb, 0xe1, 0x13, 0xd4, 0x36, 0x54, 0x62, 0xcf, 0x7a, 0xbe,
+ 0x62, 0x81, 0x7d, 0xd2, 0x7a, 0x22, 0x79, 0xc4, 0x94, 0x14, 0x52, 0xf6,
+ 0x09, 0xa7, 0xfd, 0xd7, 0xca, 0xc8, 0x71, 0x92, 0x2a, 0xb5, 0x03, 0x24,
+ 0xbd, 0x22, 0xa9, 0x6e, 0x7b, 0xf8, 0xe4, 0x40, 0x0f, 0x6a, 0xa3, 0x7d,
+ 0xc5, 0x67, 0x4c, 0xdd, 0xb6, 0x1d, 0xd4, 0xf4, 0x61, 0xb3, 0x9a, 0xa5,
+ 0xbc, 0x37, 0xa7, 0x7a, 0x54, 0xa2, 0xef, 0xe0, 0xcf, 0xe7, 0xf7, 0xe8,
+ 0x34, 0x67, 0x49, 0x71, 0x4f, 0x0c, 0x00, 0x29, 0x87, 0x90, 0xce, 0x7d,
+ 0x53, 0xf8, 0x2a, 0x21, 0x9e, 0xdf, 0xb4, 0xd3, 0xd0, 0x39, 0x7c, 0x42,
+ 0xd7, 0xc2, 0x3b, 0x6f, 0x04, 0x6d, 0xe0, 0xe0, 0xde, 0x9b, 0xcf, 0x69,
+ 0x6a, 0x25, 0xfd, 0x7c, 0xcf, 0xb9, 0x61, 0x71, 0xff, 0x2e, 0x6f, 0xa3,
+ 0x0e, 0x57, 0x05, 0x0c, 0x49, 0x50, 0xdf, 0xa5, 0xe9, 0xed, 0x1a, 0x66,
+ 0xe3, 0xab, 0x6d, 0x61, 0x55, 0x65, 0x8a, 0x21, 0x39, 0x96, 0x3b, 0x18,
+ 0x33, 0xe6, 0x71, 0x1a, 0x58, 0x56, 0x60, 0xd4, 0xab, 0x00, 0xec, 0x36,
+ 0x98, 0x02, 0x3f, 0x46, 0x4f, 0x5f, 0x75, 0x0f, 0x8a, 0xb2, 0x4d, 0x85,
+ 0x1e, 0x50, 0xee, 0x18, 0x31, 0xb0, 0xc3, 0x39, 0x04, 0x40, 0x66, 0xb2,
+ 0x7c, 0x46, 0x10, 0x27, 0xba, 0x86, 0x8a, 0x31, 0xef, 0xd1, 0x86, 0x89,
+ 0xaf, 0x84, 0x73, 0xb9, 0xc8, 0xcc, 0xa4, 0xa3, 0x35, 0x49, 0xb4, 0x52,
+ 0x76, 0x01, 0x69, 0x16, 0x8c, 0x23, 0x6c, 0x39, 0xb5, 0x02, 0x3f, 0x56,
+ 0x35, 0x0d, 0x11, 0x79, 0xc3, 0x07, 0xf8, 0xe0, 0x4e, 0x25, 0xd4, 0x39,
+ 0x5b, 0xa3, 0x9a, 0x7f, 0xb5, 0xa5, 0xed, 0x19, 0x1a, 0xf7, 0xb8, 0x1f,
+ 0x23, 0xf8, 0x63, 0x98, 0x2a, 0x90, 0x0e, 0xc6, 0x0e, 0xad, 0xbd, 0x55,
+ 0xda, 0x25, 0xeb, 0xac, 0xf1, 0xde, 0xbe, 0x64, 0x02, 0xae, 0x2b, 0x58,
+ 0x4c, 0x86, 0x7a, 0x0b, 0xb4, 0x3c, 0x3c, 0x68, 0xdd, 0xdd, 0x2d, 0xd2,
+ 0x44, 0x15, 0xce, 0x37, 0xd8, 0x88, 0x99, 0xa0, 0x2b, 0xe7, 0xe7, 0x76,
+ 0x3f, 0x58, 0xfc, 0xc4, 0x91, 0x71, 0xec, 0xae, 0x74, 0x39, 0x63, 0x91,
+ 0x3b, 0x79, 0xd2, 0xa5, 0x67, 0x8e, 0xaf, 0x76, 0x99, 0x9f, 0xbe, 0xfd,
+ 0xde, 0x8d, 0x23, 0xe1, 0xd1, 0xb1, 0x8a, 0x70, 0x4a, 0x0c, 0xbc, 0xf7,
+ 0x24, 0x22, 0xb6, 0xdf, 0x58, 0x4f, 0x4c, 0xde, 0x62, 0x9c, 0x66, 0xff,
+ 0x96, 0x38, 0x6b, 0xef, 0x45, 0x98, 0x9d, 0x31, 0x3a, 0xdc, 0x1f, 0x2c,
+ 0x01, 0xf7, 0x9a, 0x9e, 0x36, 0x98, 0xe9, 0x10, 0x0d, 0xea, 0x60, 0xb1,
+ 0x66, 0xb0, 0x09, 0xf7, 0x1c, 0x10, 0x84, 0xe4, 0xc2, 0xae, 0x03, 0xce,
+ 0xe9, 0x8b, 0xd5, 0xa5, 0xc8, 0xe7, 0xde, 0x58, 0xc2, 0xe5, 0xd8, 0xef,
+ 0xa1, 0x97, 0x77, 0x98, 0xfc, 0x36, 0x66, 0x52, 0xc0, 0x17, 0xde, 0x29,
+ 0x09, 0x98, 0xa5, 0x7b, 0xbf, 0x19, 0xb6, 0xea, 0x02, 0x0b, 0x68, 0xed,
+ 0x43, 0x7c, 0x43, 0x88, 0x02, 0x36, 0x80, 0x2e, 0x76, 0xbb, 0x4e, 0x71,
+ 0xb5, 0x24, 0xcc, 0xbf, 0x9d, 0xb6, 0x78, 0x8a, 0xf5, 0xe6, 0xcd, 0x7a,
+ 0xb4, 0x9b, 0xc9, 0x6f, 0xaa, 0xdc, 0xdb, 0x10, 0xdc, 0x86, 0x90, 0xbe,
+ 0x94, 0x54, 0xbd, 0xb5, 0x79, 0x97, 0x3f, 0x52, 0xbc, 0x07, 0x6d, 0x7f,
+ 0xe8, 0xbf, 0xf2, 0xb1, 0xc3, 0x04, 0x84, 0x75, 0xc3, 0x43, 0x0c, 0xbf,
+ 0x52, 0xbb, 0x5a, 0x35, 0x29, 0x83, 0xb2, 0x7f, 0x9b, 0x73, 0x6e, 0x75,
+ 0x41, 0x20, 0x3b, 0x1f, 0x5c, 0x7b, 0x57, 0x1f, 0x8b, 0xf4, 0x26, 0x24,
+ 0xde, 0x16, 0x4a, 0x1f, 0xdd, 0x7c, 0x7e, 0x3e, 0x2a, 0x47, 0x0e, 0xa2,
+ 0xe9, 0x13, 0xe7, 0x47, 0xdf, 0x2c, 0xab, 0xd6, 0x09, 0xba, 0x0b, 0xae,
+ 0x97, 0xc3, 0xac, 0x86, 0x97, 0xe5, 0x38, 0x49, 0x14, 0xc6, 0x95, 0xc4,
+ 0x0d, 0xd9, 0x37, 0x19, 0x9b, 0x3c, 0x15, 0x7e, 0xe7, 0x79, 0xcf, 0xcb,
+ 0xc6, 0x09, 0xe3, 0x74, 0x14, 0xf9, 0xd2, 0x23, 0x22, 0x56, 0x42, 0x79,
+ 0x5f, 0x88, 0xaa, 0xba, 0xa1, 0xff, 0x6b, 0xc1, 0x59, 0x67, 0xc2, 0x84,
+ 0xa3, 0x0e, 0xdc, 0x9f, 0x4e, 0x9e, 0x85, 0xaf, 0x83, 0xed, 0xd3, 0x7b,
+ 0x91, 0xaf, 0x7c, 0xc2, 0x84, 0x3f, 0xd8, 0xc7, 0x7d, 0x8a, 0x49, 0x90,
+ 0xf3, 0x92, 0xb0, 0x74, 0xb3, 0x2f, 0x96, 0x77, 0x12, 0xed, 0x0a, 0x8e,
+ 0x27, 0x97, 0xcf, 0x3c, 0xd9, 0xb2, 0xcb, 0x4a, 0x37, 0x8b, 0x68, 0xa1,
+ 0x34, 0xdb, 0x84, 0xbd, 0xe7, 0x97, 0x71, 0x1b, 0x99, 0x76, 0xb8, 0x2f,
+ 0xe1, 0x8d, 0x56, 0x7a, 0x45, 0x3d, 0xce, 0xac, 0x25, 0x5f, 0xc7, 0x55,
+ 0xe0, 0xa7, 0x05, 0x82, 0x4a, 0x89, 0x9b, 0x90, 0x5a, 0xca, 0x35, 0xa1,
+ 0x5c, 0x73, 0xb2, 0x80, 0xa4, 0x06, 0x83, 0xf3, 0x9b, 0xf7, 0x4e, 0x87,
+ 0x1e, 0x4d, 0xc0, 0x5c, 0x48, 0xa7, 0xf2, 0xb9, 0x90, 0x9c, 0x4a, 0x06,
+ 0x3b, 0x9a, 0x9f, 0x8c, 0x95, 0xe7, 0x61, 0xe4, 0x37, 0x4a, 0xf1, 0xd5,
+ 0xfa, 0xb5, 0x11, 0x61, 0x29, 0xa7, 0xde, 0x00, 0x8e, 0xc4, 0x35, 0x03,
+ 0x84, 0x21, 0x74, 0x74, 0xa1, 0x98, 0x42, 0xc2, 0x98, 0x00, 0x3a, 0xf7,
+ 0xcf, 0x3c, 0xc0, 0x5e, 0xd8, 0x18, 0x78, 0xcd, 0xc3, 0x18, 0xff, 0x26,
+ 0x65, 0xea, 0x1b, 0xcd, 0xe1, 0x21, 0xe7, 0xd9, 0x87, 0x7f, 0xa9, 0x9c,
+ 0xb4, 0x7a, 0x97, 0x6c, 0x01, 0x55, 0x5b, 0x2c, 0x76, 0xaa, 0x9a, 0xea,
+ 0x3d, 0x32, 0xe1, 0xb0, 0xee, 0x23, 0x46, 0x42, 0xe2, 0x28, 0x87, 0x8d,
+ 0x24, 0xa0, 0x7b, 0x58, 0xd6, 0x30, 0x46, 0x47, 0x68, 0x13, 0xfd, 0x5b,
+ 0x79, 0x86, 0xf7, 0x96, 0x11, 0x3a, 0x4f, 0x7b, 0x69, 0xe6, 0xeb, 0xf2,
+ 0x19, 0x62, 0x45, 0x05, 0xbd, 0xf6, 0xde, 0x67, 0x08, 0xf7, 0x27, 0x72,
+ 0xc8, 0xa7, 0x9e, 0xf2, 0xbb, 0x4c, 0x27, 0xe2, 0x92, 0x51, 0x41, 0xca,
+ 0x6d, 0x96, 0xbf, 0x97, 0xf7, 0x49, 0xe6, 0x26, 0xb3, 0x35, 0x21, 0x08,
+ 0xff, 0x4c, 0x0f, 0x87, 0x8b, 0xa6, 0xbb, 0x67, 0xcd, 0x31, 0x35, 0x3a,
+ 0x94, 0xcb, 0x51, 0xb3, 0x65, 0x2d, 0x85, 0x46, 0xa2, 0x21, 0x07, 0x73,
+ 0x21, 0x12, 0x2f, 0x6e, 0xf2, 0x81, 0x9b, 0xeb, 0x71, 0x9e, 0xb9, 0xa3,
+ 0x20, 0x46, 0xff, 0xf7, 0x2d, 0xad, 0xd9, 0x7e, 0xdc, 0x61, 0x60, 0xa1,
+ 0x64, 0x3a, 0xd8, 0xb4, 0x7b, 0x6c, 0xd8, 0x31, 0x9c, 0x3a, 0x91, 0xf6,
+ 0xb4, 0xe8, 0xeb, 0xbf, 0xbe, 0xe1, 0x32, 0x5d, 0x90, 0x08, 0x2f, 0xa3,
+ 0xde, 0xb6, 0xf9, 0x01, 0x46, 0x34, 0x08, 0xd4, 0xdb, 0x7d, 0x07, 0xcc,
+ 0x46, 0x2b, 0x9a, 0xe5, 0x9a, 0x15, 0x9b, 0xfe, 0x5c, 0x83, 0x68, 0x6a,
+ 0x22, 0x7f, 0x22, 0x92, 0xf3, 0x74, 0x06, 0xae, 0x15, 0x6f, 0x60, 0x64,
+ 0x42, 0x3c, 0xef, 0x82, 0xd8, 0x3f, 0x4d, 0xc0, 0x52, 0xb5, 0xea, 0xf7,
+ 0xc7, 0x10, 0x3d, 0xe2, 0x92, 0x3a, 0x17, 0xa5, 0x41, 0x80, 0x7a, 0x98,
+ 0x91, 0x5d, 0x81, 0x4d, 0x21, 0xc9, 0x4b, 0x9f, 0xf0, 0x51, 0x41, 0xe6,
+ 0x09, 0x36, 0xc3, 0x67, 0x61, 0x86, 0xef, 0x96, 0x74, 0x07, 0xdb, 0x0a,
+ 0x34, 0xe2, 0x08, 0x4f, 0x63, 0x37, 0x42, 0xe5, 0x0e, 0xb2, 0x99, 0x5e,
+ 0x06, 0x5a, 0xd2, 0x19, 0xb7, 0x84, 0x99, 0xc5, 0x7e, 0x9c, 0xca, 0x6b,
+ 0x18, 0x19, 0x54, 0xff, 0x75, 0x5f, 0x1d, 0x6c, 0xbe, 0x5a, 0x49, 0xec,
+ 0x56, 0x89, 0x73, 0xed, 0x92, 0xaf, 0x77, 0xff, 0x42, 0x49, 0xff, 0xd3,
+ 0xb0, 0x42, 0x79, 0xab, 0x6e, 0x74, 0xa9, 0x7a, 0x92, 0x38, 0x97, 0xf6,
+ 0xdd, 0x9c, 0x8b, 0x12, 0xf6, 0x1d, 0x0c, 0xa4, 0x5f, 0x69, 0xfa, 0x67,
+ 0x3c, 0xd4, 0x07, 0x53, 0x1c, 0xbc, 0x73, 0xd7, 0xa0, 0xa5, 0x28, 0x1f,
+ 0x25, 0x59, 0x9d, 0x4f, 0xe8, 0x9b, 0xc3, 0xba, 0x40, 0xe1, 0x16, 0x41,
+ 0x7b, 0x68, 0xa0, 0xe1, 0x73, 0x64, 0xbe, 0xf0, 0x99, 0x23, 0xac, 0x69,
+ 0xa0, 0x7c, 0xfd, 0xec, 0x5e, 0xcb, 0xfe, 0x57, 0x14, 0xa4, 0x1d, 0x80,
+ 0xfe, 0xda, 0x7e, 0x45, 0x56, 0x9d, 0x24, 0x86, 0xad, 0x10, 0x0b, 0xc2,
+ 0x32, 0x81, 0xbd, 0x62, 0x27, 0x9e, 0x7e, 0x45, 0x96, 0xec, 0xb4, 0x13,
+ 0xee, 0x96, 0x34, 0xec, 0x01, 0x3f, 0x48, 0x9d, 0x40, 0xe8, 0xb8, 0xdf,
+ 0xc6, 0xd3, 0xb7, 0x50, 0x05, 0x8f, 0xab, 0x5c, 0x44, 0x66, 0xca, 0x76,
+ 0x9d, 0xa2, 0xfa, 0x8b, 0x51, 0xa0, 0x55, 0x19, 0xfd, 0x66, 0x4f, 0xbf,
+ 0xc6, 0xcb, 0x22, 0xc4, 0xb1, 0xc2, 0x48, 0x16, 0x6d, 0xb8, 0x95, 0x1b,
+ 0x94, 0xe9, 0x6b, 0xe3, 0xec, 0xde, 0x29, 0xb5, 0xda, 0x90, 0xc8, 0x86,
+ 0xdf, 0xd5, 0xf3, 0x00, 0xe2, 0xcd, 0x10, 0x86, 0x9a, 0x8f, 0xaf, 0x3f,
+ 0xe2, 0x56, 0x51, 0x78, 0xca, 0x77, 0x51, 0x5f, 0xd2, 0xe8, 0xf7, 0x86,
+ 0x44, 0x81, 0x7d, 0x33, 0xc0, 0xea, 0xb7, 0x92, 0xe0, 0xbb, 0x1f, 0x5f,
+ 0x33, 0x35, 0xad, 0x19, 0x8f, 0x69, 0xf8, 0x7b, 0x02, 0xd1, 0xbf, 0x8a,
+ 0x02, 0xbe, 0xe1, 0x98, 0x1e, 0xa2, 0x14, 0x9c, 0x69, 0x54, 0xc3, 0xb3,
+ 0x94, 0x04, 0x81, 0xff, 0xa0, 0x48, 0x76, 0x23, 0xf3, 0x89, 0x19, 0x60,
+ 0x31, 0xd3, 0xc5, 0xb5, 0x53, 0xc1, 0x88, 0xdf, 0xbd, 0x7a, 0xd5, 0x71,
+ 0x3b, 0xeb, 0xac, 0x5b, 0xd0, 0x8c, 0x6d, 0x01, 0xca, 0x22, 0x95, 0x28,
+ 0xee, 0xd8, 0x89, 0xd9, 0xa6, 0xc5, 0x05, 0x82, 0xeb, 0x00, 0xf7, 0xf9,
+ 0xec, 0xa6, 0x87, 0xbf, 0x93, 0xb5, 0xfd, 0x3c, 0xc6, 0xa8, 0x70, 0x8d,
+ 0x5e, 0x46, 0xee, 0x60, 0x04, 0xd7, 0x61, 0xec, 0xb5, 0x9f, 0x2e, 0x99,
+ 0x6d, 0xaf, 0x88, 0xc3, 0x8b, 0xa9, 0x54, 0x65, 0x0b, 0x1c, 0x80, 0x87,
+ 0xb0, 0x82, 0x79, 0x7d, 0x3f, 0x51, 0x7f, 0xd1, 0x66, 0x02, 0x7e, 0x73,
+ 0xac, 0xc5, 0x35, 0xd3, 0xa7, 0xf4, 0x6a, 0x0c, 0xbc, 0x16, 0xf9, 0x05,
+ 0x1a, 0x76, 0x78, 0xcc, 0x7b, 0xbd, 0x26, 0x05, 0xa1, 0x57, 0xb3, 0x87,
+ 0x91, 0x79, 0x8b, 0x08, 0x71, 0x57, 0x03, 0xbd, 0xc8, 0xdf, 0x5c, 0x36,
+ 0x57, 0x17, 0x27, 0x59, 0xc5, 0x19, 0x87, 0x04, 0x56, 0x5c, 0xe9, 0x07,
+ 0x60, 0x7d, 0x82, 0x22, 0xda, 0xee, 0x83, 0x3e, 0xed, 0x01, 0xa7, 0x95,
+ 0xe4, 0xbd, 0x7a, 0xd0, 0x29, 0x07, 0x46, 0x76, 0x60, 0x3b, 0x43, 0xdd,
+ 0x06, 0x1e, 0xb3, 0xe1, 0x44, 0xde, 0x02, 0xe4, 0x85, 0x2c, 0x61, 0xe7,
+ 0x06, 0x7a, 0xcc, 0xc9, 0xc3, 0xfc, 0x7a, 0xb3, 0x4c, 0x58, 0x1c, 0xbd,
+ 0x2e, 0xdf, 0x6b, 0xf9, 0x74, 0x83, 0x97, 0x5d, 0x76, 0xf8, 0x63, 0xc4,
+ 0xe8, 0x07, 0x24, 0xd7, 0x8a, 0xf0, 0x71, 0xeb, 0x56, 0xa9, 0xa0, 0xa5,
+ 0xd1, 0x1e, 0x3d, 0x48, 0x60, 0xe7, 0xb3, 0x27, 0x0a, 0xc6, 0x7a, 0xa6,
+ 0x53, 0x8d, 0xe6, 0x5b, 0x33, 0xea, 0xce, 0x39, 0xba, 0x9f, 0xb7, 0x64,
+ 0x59, 0xe2, 0xd8, 0x32, 0x63, 0x6e, 0x65, 0xdf, 0x90, 0xc8, 0xdf, 0x19,
+ 0x26, 0x00, 0xc6, 0x3a, 0xa3, 0xe8, 0x00, 0x4b, 0x1c, 0x58, 0xfa, 0xfc,
+ 0x52, 0x27, 0x31, 0x3d, 0x35, 0x9b, 0xf6, 0xe2, 0xd4, 0x98, 0x01, 0x6e,
+ 0xe4, 0x22, 0x4c, 0x69, 0x44, 0x60, 0x11, 0xbe, 0x3f, 0x37, 0x77, 0xf1,
+ 0xe4, 0x54, 0x24, 0x85, 0x10, 0x66, 0xa8, 0xa9, 0xe9, 0xdf, 0xab, 0xcc,
+ 0x08, 0x93, 0x62, 0x35, 0x6d, 0xb0, 0x95, 0x47, 0xed, 0x92, 0xbe, 0x98,
+ 0x48, 0x74, 0x56, 0x80, 0x74, 0xe3, 0x84, 0x7b, 0x90, 0x39, 0x2e, 0xe8,
+ 0x45, 0xa2, 0xcd, 0xca, 0x11, 0x62, 0xa2, 0xc8, 0xf5, 0x6e, 0x6c, 0xb1,
+ 0x14, 0x83, 0x70, 0x8f, 0xfb, 0x14, 0x9a, 0xa1, 0x87, 0x14, 0x87, 0x42,
+ 0xd0, 0x17, 0x52, 0xd3, 0x59, 0x56, 0xff, 0xad, 0x58, 0x9a, 0x73, 0x07,
+ 0x38, 0xf7, 0x0c, 0xc8, 0xb1, 0x58, 0xd2, 0x18, 0xb3, 0x3f, 0xbc, 0x2d,
+ 0x1b, 0xa3, 0x2b, 0x6d, 0x9a, 0x26, 0xaa, 0x6c, 0x8b, 0xb7, 0x7b, 0x3e,
+ 0xf6, 0x18, 0x70, 0x52, 0x45, 0x96, 0xb0, 0xdf, 0x60, 0xe7, 0xbc, 0x75,
+ 0x4c, 0x34, 0xde, 0xaa, 0x9c, 0x10, 0x16, 0xe0, 0x1f, 0x82, 0x2d, 0xde,
+ 0x4f, 0xd3, 0x5b, 0xe5, 0xdf, 0xc6, 0x7a, 0x8f, 0x22, 0x7a, 0x88, 0xbd,
+ 0x59, 0xa9, 0xb5, 0xc5, 0x3e, 0x0a, 0xbb, 0x49, 0xc3, 0x0f, 0xe2, 0x6d,
+ 0x45, 0xf9, 0xa0, 0x51, 0x50, 0xdd, 0x4b, 0xae, 0xe8, 0x8f, 0xac, 0x24,
+ 0x3a, 0xa2, 0xd9, 0xfa, 0xca, 0x82, 0x8d, 0x13, 0xc8, 0x14, 0x6d, 0x65,
+ 0x02, 0x31, 0x4a, 0x15, 0xeb, 0x4b, 0xdc, 0x88, 0x30, 0xe9, 0x9d, 0xa1,
+ 0x42, 0x05, 0xce, 0x50, 0xa9, 0x6e, 0xb7, 0x30, 0x17, 0xad, 0xd8, 0xb6,
+ 0xaf, 0xf1, 0x17, 0x27, 0xc7, 0xca, 0x1d, 0xdc, 0x3f, 0x16, 0x7f, 0xfd,
+ 0xba, 0xdc, 0xce, 0xcd, 0xef, 0xb3, 0x5a, 0x73, 0xea, 0xf4, 0xb7, 0x85,
+ 0x3c, 0xb3, 0xdf, 0x91, 0xe9, 0x27, 0x6a, 0x38, 0x1b, 0xee, 0x34, 0x96,
+ 0xb3, 0xe3, 0xa1, 0xb8, 0x3e, 0x9f, 0xbd, 0x8e, 0x09, 0x16, 0xf4, 0xc5,
+ 0xf7, 0x6c, 0xbb, 0x61, 0x4d, 0xae, 0x06, 0xf7, 0x22, 0xce, 0xd2, 0x02,
+ 0xe6, 0x1f, 0x75, 0x0c, 0x6e, 0xca, 0x9f, 0x89, 0x27, 0xde, 0x49, 0x79,
+ 0x1a, 0x56, 0x20, 0xcd, 0xa7, 0xdd, 0x5a, 0xf1, 0xfb, 0xaf, 0xd1, 0x5d,
+ 0xf1, 0x2a, 0x29, 0xbe, 0xae, 0xbe, 0x6c, 0x1e, 0x06, 0x74, 0xfa, 0x34,
+ 0xb0, 0x1a, 0xd2, 0x97, 0xae, 0x2b, 0xd1, 0x67, 0xa8, 0x54, 0xbb, 0x6a,
+ 0x4e, 0xd9, 0x18, 0x05, 0xbd, 0xe1, 0xb2, 0x67, 0x46, 0x66, 0xc2, 0x94,
+ 0xe8, 0x2c, 0x1f, 0x20, 0x85, 0xb3, 0xe4, 0x6f, 0x23, 0xb5, 0x56, 0x9f,
+ 0x26, 0x95, 0x61, 0x65, 0xe4, 0x6d, 0xd9, 0xfd, 0x37, 0x44, 0x30, 0x9c,
+ 0xbf, 0x78, 0x6c, 0x03, 0x69, 0x51, 0xad, 0xcc, 0x48, 0xf6, 0x93, 0xa6,
+ 0xb2, 0x62, 0x99, 0x1e, 0x56, 0xc8, 0x54, 0x3f, 0x33, 0x0c, 0x2d, 0xe5,
+ 0xa7, 0x65, 0x7b, 0xe1, 0x6c, 0x42, 0x45, 0x72, 0xcb, 0xa0, 0x28, 0x33,
+ 0xe3, 0x35, 0x35, 0x05, 0xfd, 0x0c, 0x82, 0x29, 0x01, 0x8c, 0x73, 0x30,
+ 0xa9, 0x94, 0x56, 0x00, 0xcc, 0xa4, 0xf6, 0x4c, 0x13, 0x99, 0xfa, 0x38,
+ 0x99, 0xa7, 0x23, 0x10, 0xba, 0x59, 0xf8, 0xa8, 0x63, 0xc1, 0x72, 0x0b,
+ 0x7c, 0x9a, 0x7f, 0x68, 0x94, 0x88, 0xd9, 0x85, 0xb1, 0x46, 0x37, 0x44,
+ 0xf5, 0xfa, 0xdf, 0x37, 0x26, 0xa7, 0xa9, 0x07, 0x7b, 0x1f, 0x17, 0x9a,
+ 0xbf, 0x69, 0xf2, 0x9f, 0x79, 0x44, 0xd0, 0x99, 0x58, 0xbd, 0x21, 0x79,
+ 0x69, 0x7b, 0xec, 0x10, 0x9e, 0xf4, 0x74, 0x42, 0x2d, 0xf8, 0xb5, 0x4b,
+ 0xef, 0xa4, 0xbe, 0xaf, 0x7b, 0x21, 0x7f, 0x2d, 0xea, 0x43, 0x2e, 0xfb,
+ 0x45, 0x02, 0xa6, 0xed, 0x36, 0x99, 0xee, 0xe6, 0x2a, 0x8d, 0x5f, 0x69,
+ 0x2b, 0xa6, 0xe3, 0xb9, 0xea, 0x55, 0x26, 0x6f, 0x6e, 0xa8, 0xfc, 0xb8,
+ 0xb8, 0x52, 0xed, 0x58, 0xca, 0xc1, 0x40, 0x53, 0x33, 0x26, 0xa1, 0xca,
+ 0xcc, 0xde, 0x6b, 0x8e, 0xad, 0x5c, 0xff, 0x44, 0x6e, 0x0f, 0xc3, 0xa5,
+ 0x7f, 0x39, 0xd7, 0xef, 0x0c, 0x45, 0x9b, 0x1f, 0x92, 0x1a, 0x5c, 0x26,
+ 0x94, 0x93, 0x38, 0xdc, 0x5a, 0x05, 0x04, 0xd2, 0x05, 0xf4, 0xdd, 0xf5,
+ 0x4a, 0x77, 0xdf, 0xb6, 0x47, 0x10, 0x5e, 0x3d, 0x4e, 0x73, 0x83, 0x3f,
+ 0x02, 0x69, 0x7a, 0x9c, 0x48, 0x63, 0x06, 0x7b, 0xa5, 0x6b, 0x3c, 0xbc,
+ 0x63, 0xf1, 0x4e, 0x26, 0x87, 0xf8, 0xbc, 0xbd, 0x71, 0x76, 0x4a, 0xd8,
+ 0x60, 0xfe, 0xb2, 0x92, 0x78, 0x20, 0x22, 0xf4, 0xc9, 0xba, 0xed, 0xe6,
+ 0x6e, 0x1b, 0xd9, 0x3e, 0x8f, 0x8a, 0xce, 0x13, 0xfc, 0xb8, 0xed, 0x33,
+ 0x64, 0x09, 0x11, 0x56, 0xa8, 0x40, 0x9f, 0x49, 0x90, 0xc6, 0x16, 0xbb,
+ 0xd9, 0x49, 0xab, 0xea, 0x7e, 0x1d, 0xfd, 0x83, 0x79, 0x79, 0x14, 0xb5,
+ 0xe7, 0x2c, 0x24, 0x75, 0x05, 0xe3, 0x77, 0xc3, 0x4d, 0x61, 0xb0, 0xff,
+ 0x13, 0x12, 0x78, 0x96, 0x7e, 0xc1, 0x91, 0x45, 0x0c, 0x4f, 0x36, 0x01,
+ 0x6b, 0x0e, 0x3d, 0x52, 0xa0, 0xf2, 0xb4, 0x26, 0x81, 0x33, 0x39, 0x10,
+ 0xa3, 0x87, 0x7f, 0x7d, 0x41, 0xbd, 0x03, 0xff, 0x0f, 0x3c, 0xb9, 0x6d,
+ 0xef, 0x1a, 0xe8, 0x1c, 0x8a, 0x99, 0x02, 0x70, 0x23, 0x28, 0x1c, 0x91,
+ 0x60, 0xa9, 0x2d, 0xf8, 0x8d, 0x8a, 0xd1, 0x32, 0x4f, 0xd3, 0xe0, 0x56,
+ 0x9a, 0x04, 0x26, 0x7a, 0xf6, 0x71, 0xe1, 0x58, 0xc0, 0x68, 0x2c, 0x38,
+ 0x0e, 0xa3, 0xb7, 0x4b, 0x29, 0xc8, 0x23, 0x1e, 0xd7, 0x93, 0xb4, 0x31,
+ 0x54, 0x1c, 0x5c, 0x35, 0x56, 0x01, 0x26, 0xd3, 0x27, 0xf7, 0x6b, 0xda,
+ 0x6b, 0x76, 0x16, 0x99, 0xe1, 0x12, 0x9e, 0x2e, 0xdf, 0xd6, 0x2e, 0xdf,
+ 0x5a, 0xfa, 0xeb, 0xed, 0x22, 0x3b, 0xdc, 0x4b, 0x42, 0x4c, 0x46, 0xb8,
+ 0x10, 0xe9, 0x7d, 0x27, 0xb7, 0xf1, 0x1a, 0x03, 0x0e, 0x90, 0x4e, 0xa3,
+ 0xff, 0x40, 0x02, 0x99, 0xfb, 0xfc, 0x91, 0x65, 0xab, 0x90, 0x83, 0xc9,
+ 0xd0, 0xf5, 0xae, 0xcc, 0x77, 0xcc, 0x46, 0x4d, 0x4a, 0x5d, 0xfe, 0x9f,
+ 0x32, 0xff, 0x24, 0xf4, 0x00, 0x74, 0x77, 0x34, 0x5f, 0xb4, 0xcb, 0x90,
+ 0x0e, 0xe3, 0x0f, 0xd4, 0x0e, 0x94, 0x49, 0x5d, 0x8a, 0x1f, 0x2f, 0x23,
+ 0x5b, 0x54, 0xa5, 0x56, 0x10, 0xd1, 0x14, 0x3d, 0x75, 0x86, 0x77, 0x86,
+ 0xa5, 0x69, 0x4c, 0x5d, 0x9c, 0x32, 0xa7, 0x88, 0xa0, 0x1c, 0xe6, 0x0a,
+ 0x7c, 0x66, 0xd2, 0x62, 0xb0, 0x81, 0x5b, 0x13, 0x42, 0x4d, 0x6d, 0x2e,
+ 0xf0, 0xa8, 0x64, 0xf6, 0x95, 0x4e, 0xf3, 0x2a, 0x4f, 0x77, 0x2c, 0xb0,
+ 0x7b, 0xc8, 0xf2, 0xfb, 0xbd, 0xa3, 0xc9, 0x2e, 0x8e, 0x66, 0x53, 0xb7,
+ 0x20, 0x61, 0xad, 0x82, 0x31, 0xb4, 0x18, 0xcc, 0x0d, 0x48, 0xcc, 0x20,
+ 0xd7, 0x90, 0x5b, 0x9f, 0x4d, 0x53, 0x10, 0xb4, 0x63, 0xfb, 0x5d, 0x60,
+ 0x66, 0x1d, 0xa0, 0x46, 0x62, 0x8d, 0x5a, 0xa2, 0xea, 0x35, 0x58, 0x0a,
+ 0xa0, 0x09, 0xff, 0xcb, 0xcd, 0xe4, 0x9a, 0xc0, 0xff, 0x8b, 0x71, 0x30,
+ 0xc4, 0xeb, 0x7a, 0x7d, 0xe1, 0xa6, 0xb8, 0x57, 0x57, 0xb1, 0xc0, 0x44,
+ 0x27, 0x16, 0xc4, 0x3c, 0xad, 0x4a, 0x73, 0xe1, 0x66, 0x0d, 0xf6, 0xea,
+ 0x4c, 0xd4, 0x24, 0x35, 0x34, 0x79, 0x9e, 0xa9, 0x88, 0xe3, 0x81, 0x1e,
+ 0x5e, 0xf3, 0xb0, 0x87, 0x4a, 0x9e, 0xe8, 0x90, 0x02, 0x36, 0x21, 0x58,
+ 0x9c, 0x0f, 0xa4, 0xd8, 0xee, 0xc2, 0xfd, 0x3e, 0x26, 0x2d, 0x37, 0xf4,
+ 0x8d, 0x29, 0xca, 0x97, 0xcf, 0x83, 0x34, 0xcb, 0xd3, 0x15, 0x34, 0x88,
+ 0x45, 0x5b, 0x78, 0xeb, 0xcf, 0xc1, 0x9e, 0xf7, 0xc2, 0x62, 0xf8, 0x72,
+ 0x8d, 0x60, 0x38, 0xaf, 0x08, 0xd7, 0x64, 0xbe, 0xf6, 0xd3, 0x02, 0x3e,
+ 0x15, 0xb1, 0xc4, 0x1e, 0x29, 0x1e, 0x74, 0x76, 0xf6, 0x91, 0x01, 0x86,
+ 0x94, 0xd5, 0xa3, 0x64, 0x40, 0x2b, 0xd0, 0x95, 0x29, 0xc3, 0xf5, 0xde,
+ 0x13, 0x44, 0xe4, 0xdc, 0xae, 0x1f, 0x27, 0x9c, 0x9f, 0x85, 0xb4, 0x5d,
+ 0x53, 0xd4, 0xbf, 0xd7, 0xdb, 0xf9, 0x2a, 0xed, 0xaa, 0xcf, 0x53, 0x2b,
+ 0x87, 0x3b, 0x06, 0x50, 0xc6, 0x8e, 0xa2, 0xaa, 0x0b, 0x07, 0xfe, 0x7f,
+ 0xeb, 0xd6, 0x71, 0xa0, 0x96, 0xb4, 0x69, 0xe4, 0xc2, 0xab, 0x75, 0x6e,
+ 0x07, 0xe8, 0xe0, 0x64, 0x5f, 0xa3, 0x64, 0x22, 0x8d, 0x9e, 0x85, 0x4c,
+ 0x91, 0x2a, 0x5c, 0x8b, 0xd3, 0x1b, 0x63, 0x27, 0xd2, 0x99, 0x08, 0x23,
+ 0x0c, 0x2e, 0xcc, 0x5c, 0x74, 0xd7, 0x44, 0x66, 0x11, 0xa5, 0x9a, 0x40,
+ 0x31, 0x42, 0x23, 0x5d, 0x96, 0xda, 0x90, 0xae, 0x0d, 0x9c, 0x73, 0x3c,
+ 0xf0, 0xdf, 0xf2, 0xcd, 0x08, 0x4c, 0x47, 0xb2, 0xc3, 0x86, 0xfc, 0xf2,
+ 0xf1, 0x05, 0xa5, 0x4f, 0xe2, 0x48, 0x86, 0xba, 0xe5, 0xf6, 0x13, 0xa8,
+ 0xbc, 0x7b, 0x59, 0xc2, 0x4a, 0x20, 0xfc, 0x5c, 0x38, 0x7a, 0xc9, 0xdc,
+ 0x2a, 0xf2, 0xd1, 0x6a, 0x26, 0xd2, 0x97, 0x53, 0x3c, 0x61, 0x4e, 0x0f,
+ 0x95, 0xee, 0xad, 0xd4, 0xad, 0xa2, 0x09, 0xba, 0xa6, 0xd0, 0xc3, 0x6a,
+ 0xf0, 0x68, 0x59, 0x18, 0x3c, 0x1f, 0x91, 0x38, 0xaf, 0xd5, 0x28, 0xfa,
+ 0xdc, 0xda, 0xb7, 0x09, 0xec, 0x0f, 0x8e, 0xa9, 0x7c, 0xb7, 0xc7, 0x1b,
+ 0xb9, 0x00, 0x60, 0x47, 0x5b, 0xbc, 0x02, 0x9b, 0xdf, 0xa3, 0x45, 0xfc,
+ 0x24, 0x51, 0xbc, 0x2a, 0x4e, 0x86, 0x66, 0xf3, 0xed, 0xfe, 0xf9, 0x99,
+ 0x88, 0xb8, 0xd7, 0x87, 0xf3, 0x80, 0x86, 0x0d, 0x47, 0xd3, 0x83, 0x58,
+ 0x94, 0xc1, 0x6e, 0x08, 0x52, 0x8d, 0x79, 0x2b, 0x93, 0x8d, 0x56, 0x15,
+ 0xf5, 0xa3, 0xd5, 0x04, 0xbe, 0xdd, 0xd9, 0x49, 0x52, 0x1b, 0x08, 0xc1,
+ 0x09, 0xe0, 0xd1, 0xb4, 0x2f, 0xc2, 0x60, 0x66, 0x70, 0x2d, 0xf6, 0x9d,
+ 0xda, 0x8a, 0xb6, 0xee, 0x37, 0x5e, 0xf6, 0xa1, 0x67, 0xe4, 0x11, 0xe0,
+ 0x58, 0x8d, 0xbb, 0xbd, 0x9e, 0xba, 0x72, 0x3d, 0xfa, 0x76, 0x7a, 0x16,
+ 0xfd, 0xa8, 0xb1, 0x80, 0xe6, 0x3b, 0xf7, 0xee, 0x07, 0xbf, 0x4b, 0x13,
+ 0x4b, 0x49, 0xd9, 0x9a, 0x89, 0x47, 0xbc, 0x65, 0xa2, 0xd8, 0xbf, 0x84,
+ 0x5e, 0x1a, 0x3c, 0x63, 0x81, 0x57, 0xc2, 0x96, 0x47, 0x29, 0x31, 0xe4,
+ 0xdd, 0xae, 0x50, 0x27, 0x53, 0x49, 0xe1, 0xb1, 0x54, 0x9e, 0xcc, 0x4c,
+ 0x54, 0xd3, 0x4f, 0x37, 0x77, 0x0b, 0x20, 0xb7, 0xac, 0x47, 0x90, 0x33,
+ 0xa0, 0x12, 0xc0, 0x93, 0x08, 0x77, 0x7d, 0x19, 0x6a, 0xaa, 0x29, 0xce,
+ 0xdb, 0x06, 0x37, 0x2e, 0xab, 0xca, 0xf4, 0x36, 0xaa, 0x91, 0xd7, 0x4d,
+ 0x5a, 0xf3, 0xac, 0x04, 0xa9, 0xaa, 0x39, 0xce, 0x63, 0x70, 0x59, 0x97,
+ 0x4f, 0x63, 0xd4, 0x9b, 0x2f, 0x13, 0xef, 0xe1, 0xee, 0x5b, 0x18, 0xa9,
+ 0x38, 0x22, 0x64, 0x60, 0x04, 0x10, 0x2a, 0x7d, 0x75, 0xa4, 0x26, 0xc5,
+ 0x13, 0x4f, 0xcb, 0x17, 0x6d, 0xd8, 0xf8, 0xcd, 0xf4, 0x99, 0x32, 0x8a,
+ 0xdb, 0x31, 0xa5, 0x39, 0x52, 0x7e, 0x76, 0x7e, 0x2e, 0xd5, 0xde, 0x75,
+ 0x3d, 0x16, 0xf8, 0x79, 0xe7, 0x8c, 0x6d, 0x1b, 0xe3, 0xd2, 0x6d, 0x06,
+ 0x5a, 0x65, 0xfc, 0x37, 0x43, 0xac, 0xfc, 0xb2, 0x89, 0x5f, 0x8f, 0x02,
+ 0x58, 0x1b, 0x03, 0xa6, 0x9c, 0x50, 0x6d, 0x1c, 0xa3, 0xd7, 0x19, 0x35,
+ 0x23, 0xaa, 0x13, 0xef, 0xe4, 0xa9, 0x3b, 0xb0, 0x23, 0x11, 0x5f, 0x81,
+ 0xab, 0xa0, 0xd6, 0x5b, 0x53, 0x1c, 0x66, 0x7f, 0xa6, 0x0d, 0xaf, 0x43,
+ 0x8d, 0x80, 0xd9, 0x2c, 0x5f, 0xda, 0xb1, 0x0d, 0xc9, 0x38, 0x91, 0x08,
+ 0x64, 0xac, 0xc0, 0x1f, 0x20, 0xba, 0xdf, 0xaf, 0xaa, 0x8e, 0x11, 0x25,
+ 0xd2, 0xa2, 0x93, 0xdb, 0x3f, 0x67, 0xf0, 0x1c, 0xbc, 0xf3, 0x22, 0xe9,
+ 0x17, 0x47, 0x47, 0xdc, 0x80, 0xf4, 0x17, 0xc6, 0x20, 0xd3, 0x97, 0x49,
+ 0xc9, 0xa6, 0x4c, 0xbc, 0x9d, 0x3f, 0xea, 0xee, 0xe5, 0x2b, 0xba, 0xe5,
+ 0x9a, 0x5a, 0x39, 0x1a, 0x4e, 0x15, 0x10, 0x9b, 0xef, 0xcc, 0x6b, 0x25,
+ 0xfb, 0xef, 0xa2, 0x8b, 0xb4, 0x9b, 0x28, 0x8f, 0xa1, 0x01, 0x51, 0x32,
+ 0x33, 0x7a, 0xeb, 0x34, 0x2c, 0xcb, 0x51, 0x7a, 0x77, 0x02, 0x7b, 0xde,
+ 0x99, 0xc5, 0x9f, 0xe1, 0xc8, 0x2c, 0xb3, 0x2e, 0x45, 0x4d, 0xdf, 0xa6,
+ 0xf0, 0x1c, 0x6a, 0x93, 0x3d, 0xc2, 0xf8, 0xe0, 0xfe, 0x4f, 0x5e, 0xc2,
+ 0x56, 0x57, 0xb6, 0x7e, 0x4e, 0x4d, 0xc1, 0x3f, 0x62, 0xe8, 0xb7, 0xdb,
+ 0x14, 0x0c, 0xae, 0xa9, 0xb3, 0x99, 0xbf, 0x48, 0xd5, 0x62, 0x25, 0x2d,
+ 0x47, 0x03, 0x1c, 0x55, 0x36, 0xda, 0x74, 0x55, 0x9b, 0x70, 0x00, 0x72,
+ 0x86, 0x34, 0x45, 0x8a, 0x77, 0x1a, 0x21, 0x8d, 0x2a, 0x5c, 0x53, 0xad,
+ 0x63, 0x7b, 0xe0, 0x76, 0x82, 0xfc, 0x73, 0x33, 0xac, 0xe5, 0x33, 0xa4,
+ 0x76, 0xd9, 0xb6, 0x2b, 0xb8, 0x0f, 0xcb, 0x78, 0xf7, 0xa7, 0xfd, 0x8c,
+ 0xad, 0x4f, 0x91, 0x60, 0xa5, 0x11, 0x6e, 0x5a, 0x50, 0x8c, 0x02, 0x3b,
+ 0x29, 0x3f, 0x8f, 0x75, 0x76, 0x21, 0x27, 0x8d, 0x37, 0x96, 0x74, 0x02,
+ 0xb3, 0x41, 0x53, 0xe5, 0x2a, 0xb5, 0xdf, 0xcc, 0xa9, 0x05, 0x78, 0xcd,
+ 0xce, 0x78, 0x66, 0xaa, 0x43, 0x81, 0x4a, 0xb1, 0xe1, 0x3b, 0x2c, 0xff,
+ 0x49, 0x57, 0x6c, 0x80, 0x19, 0xf1, 0xeb, 0x69, 0x02, 0x91, 0xf0, 0x7a,
+ 0x2e, 0x7d, 0x45, 0x33, 0x29, 0xc9, 0x26, 0x55, 0x28, 0x16, 0xba, 0xfa,
+ 0x18, 0x11, 0xc6, 0xc2, 0x28, 0x2a, 0x50, 0x8e, 0xf7, 0xf1, 0x26, 0xbe,
+ 0x6c, 0xe6, 0x9f, 0xea, 0x08, 0x92, 0xc1, 0xa9, 0x7c, 0x69, 0xbb, 0x3c,
+ 0x93, 0x5e, 0xdc, 0x0c, 0xaf, 0x0e, 0x4c, 0xa8, 0x1d, 0xca, 0x45, 0x70,
+ 0xac, 0x2b, 0xb9, 0x01, 0xca, 0xaf, 0x82, 0x8b, 0xfc, 0xef, 0x1b, 0x79,
+ 0x7b, 0xfb, 0x9d, 0x3c, 0x7c, 0x1f, 0x69, 0x29, 0xf1, 0x23, 0x91, 0xad,
+ 0xd0, 0xcc, 0x3f, 0x21, 0xfc, 0xee, 0xa1, 0x38, 0xd0, 0xa7, 0x1e, 0x6b,
+ 0x74, 0x72, 0x6a, 0x93, 0x8a, 0x8e, 0xc2, 0x13, 0xf2, 0xc9, 0x79, 0x03,
+ 0xeb, 0xed, 0xf7, 0x6b, 0x4d, 0xba, 0x92, 0xab, 0x34, 0xde, 0x61, 0xd3,
+ 0x66, 0xe6, 0x25, 0x71, 0xd4, 0xa6, 0xe0, 0x78, 0x99, 0xaf, 0xca, 0x60,
+ 0xeb, 0x79, 0x15, 0x87, 0x0f, 0x6a, 0x68, 0x8e, 0x5f, 0xa7, 0x9c, 0xba,
+ 0x8c, 0xcc, 0x9d, 0xe0, 0x3f, 0x93, 0x81, 0x49, 0xbb, 0xb4, 0x8f, 0xed,
+ 0x7a, 0x22, 0x5c, 0x45, 0x52, 0xde, 0x68, 0xac, 0xbe, 0x5b, 0x7b, 0x36,
+ 0xad, 0x1e, 0xc3, 0xa5, 0xe5, 0xfd, 0x42, 0xb7, 0xa6, 0x5d, 0x7b, 0xf8,
+ 0x87, 0xbf, 0xeb, 0xd5, 0xb6, 0xb5, 0x03, 0x4d, 0xa6, 0xc2, 0x50, 0x68,
+ 0x0c, 0x03, 0x2a, 0xc2, 0xf5, 0xf5, 0x33, 0xf8, 0x38, 0xb9, 0x7a, 0x37,
+ 0xcc, 0xd5, 0xfe, 0xc4, 0x2b, 0x09, 0x89, 0x82, 0x0c, 0x83, 0xa1, 0x5d,
+ 0x3b, 0x29, 0x47, 0x4d, 0x9b, 0x1f, 0x13, 0xa9, 0xad, 0xa2, 0x31, 0x5c,
+ 0x36, 0x0a, 0xd5, 0x0b, 0x4c, 0xd8, 0xfb, 0xc3, 0x00, 0x2c, 0x1a, 0xf1,
+ 0x54, 0x63, 0xcc, 0x31, 0xb9, 0x24, 0x4b, 0x16, 0x26, 0x0e, 0x63, 0xbe,
+ 0x1b, 0x49, 0x6f, 0x23, 0x55, 0xe2, 0xe4, 0x20, 0xff, 0xf1, 0x2c, 0xf5,
+ 0x22, 0x88, 0xf9, 0x60, 0xed, 0x59, 0x17, 0x99, 0x58, 0x1d, 0xb7, 0xd8,
+ 0x24, 0x3a, 0x24, 0xe3, 0xd7, 0xbf, 0xd0, 0x4c, 0xac, 0x2b, 0x7b, 0x2c,
+ 0xab, 0xff, 0xc1, 0xa7, 0x13, 0x67, 0xf9, 0x9d, 0x9c, 0x3c, 0x15, 0x25,
+ 0x18, 0xde, 0xb9, 0xe1, 0x3b, 0x5e, 0xe3, 0xca, 0xf4, 0xc2, 0x9e, 0x6b,
+ 0xae, 0xc6, 0xfe, 0xe2, 0xd9, 0xf6, 0xbb, 0xf5, 0x6b, 0xc5, 0x54, 0x13,
+ 0x7e, 0x94, 0x93, 0xe6, 0x17, 0xee, 0xb0, 0x70, 0x22, 0xff, 0xab, 0xe1,
+ 0x93, 0x9f, 0xd5, 0x72, 0xa9, 0x29, 0x98, 0x8b, 0x39, 0x5e, 0x48, 0xd6,
+ 0xb1, 0xbe, 0xf5, 0xcb, 0x0f, 0x06, 0xfd, 0x3c, 0xfd, 0x8a, 0xfc, 0x97,
+ 0x58, 0x1a, 0x0a, 0x6d, 0xf0, 0xbf, 0x17, 0x0e, 0xbc, 0x00, 0x36, 0xbf,
+ 0xa6, 0x57, 0xeb, 0x83, 0x8f, 0x5b, 0x71, 0x5f, 0x1a, 0xa1, 0x37, 0x4d,
+ 0x0c, 0xe3, 0x0a, 0x72, 0x54, 0x1d, 0x46, 0xa0, 0x54, 0x90, 0xe3, 0x04,
+ 0x68, 0xd9, 0x56, 0x6c, 0x66, 0x21, 0xfd, 0xef, 0xa1, 0xd7, 0xb4, 0x40,
+ 0x9b, 0xda, 0x3e, 0x1a, 0x4d, 0xc8, 0x32, 0x1c, 0x49, 0x90, 0xa7, 0x39,
+ 0x97, 0x22, 0xe0, 0x61, 0x18, 0x46, 0x38, 0x02, 0xdd, 0x76, 0x60, 0x59,
+ 0x65, 0xed, 0x24, 0x73, 0x09, 0x25, 0x92, 0x66, 0x7d, 0x70, 0x1b, 0x5e,
+ 0x26, 0xab, 0xa5, 0xa2, 0xe2, 0x6c, 0xf6, 0x8d, 0xd3, 0xa1, 0xef, 0x15,
+ 0x08, 0x4f, 0x7b, 0x6e, 0xd3, 0x7a, 0xc5, 0xa4, 0xc9, 0x00, 0x3a, 0xb7,
+ 0xf1, 0xa9, 0x6f, 0x8f, 0x82, 0xd2, 0x19, 0xba, 0x68, 0xb3, 0xe8, 0x91,
+ 0x45, 0x94, 0x3c, 0x98, 0xd0, 0xe8, 0x12, 0xa7, 0x89, 0xf7, 0xcf, 0xcb,
+ 0xa6, 0x77, 0x8b, 0xc3, 0x25, 0xec, 0x7c, 0x02, 0x64, 0xd0, 0x23, 0x0b,
+ 0x30, 0x64, 0xb8, 0xa4, 0x4f, 0x75, 0x3f, 0x0f, 0x1a, 0xc9, 0x19, 0x20,
+ 0xd8, 0x93, 0xeb, 0xf7, 0x5e, 0xc9, 0xa6, 0x2a, 0x2c, 0x7b, 0x77, 0x0f,
+ 0xb3, 0x21, 0x4d, 0x60, 0x9b, 0xc6, 0x77, 0xb9, 0x41, 0xf3, 0xd3, 0x89,
+ 0xf9, 0xe6, 0x94, 0x85, 0x69, 0x9f, 0xc7, 0x79, 0xa7, 0xe1, 0x13, 0x75,
+ 0xc2, 0xd8, 0x0a, 0x2a, 0xc6, 0xc0, 0x6a, 0xe2, 0xfd, 0x53, 0x7a, 0x86,
+ 0x8f, 0x6a, 0xbd, 0xdd, 0x5d, 0x72, 0x5a, 0xa4, 0x31, 0x2c, 0xed, 0xf9,
+ 0xe1, 0x9b, 0x00, 0x0f, 0x6d, 0x7e, 0x00, 0x6d, 0x3f, 0x77, 0xd5, 0xb0,
+ 0x45, 0xfd, 0x95, 0xff, 0xb0, 0xee, 0x6a, 0xdb, 0x52, 0x7c, 0x11, 0xa8,
+ 0xaa, 0x10, 0x6a, 0x3a, 0xea, 0xe4, 0xd0, 0x46, 0x1e, 0xda, 0x6f, 0xde,
+ 0xb8, 0x14, 0x57, 0x87, 0x01, 0xbc, 0xd1, 0x77, 0xa4, 0x7f, 0x74, 0x29,
+ 0xdf, 0xeb, 0x08, 0xdb, 0xb2, 0xaf, 0xfe, 0xd1, 0xab, 0x91, 0xa6, 0x51,
+ 0xeb, 0x96, 0x6b, 0xef, 0x5f, 0x9e, 0x5d, 0x88, 0x82, 0xa8, 0x7d, 0xb1,
+ 0xb6, 0xab, 0x22, 0x41, 0x8a, 0xaa, 0xb7, 0xa3, 0x72, 0xfd, 0x71, 0x35,
+ 0x86, 0x41, 0xdf, 0xe4, 0x0b, 0xef, 0x34, 0x12, 0x3b, 0x43, 0x6a, 0x14,
+ 0xa1, 0x70, 0x47, 0x44, 0x2f, 0x5c, 0x67, 0xd6, 0x31, 0x98, 0x51, 0x3f,
+ 0x58, 0x1e, 0xd6, 0x3d, 0x27, 0xe5, 0x93, 0xf7, 0xa5, 0x76, 0xa7, 0x1e,
+ 0x5e, 0x4f, 0xc1, 0x5d, 0x1d, 0x8d, 0xce, 0xdd, 0x76, 0xe2, 0xaa, 0x7e,
+ 0x3a, 0x06, 0x0a, 0x3c, 0xc1, 0xad, 0x80, 0x99, 0x67, 0xd9, 0xc6, 0xac,
+ 0x99, 0x73, 0x4d, 0xd1, 0xb4, 0x6d, 0xee, 0x38, 0xe2, 0x77, 0xb9, 0x46,
+ 0xb9, 0x80, 0xbf, 0x24, 0x25, 0x8c, 0x14, 0x7f, 0xd2, 0x9c, 0x4a, 0xef,
+ 0x9f, 0xb6, 0x28, 0x98, 0xa9, 0xfa, 0x29, 0x4c, 0x74, 0xc2, 0x82, 0x52,
+ 0xb1, 0xa9, 0x0e, 0x8e, 0xf2, 0xc1, 0xfc, 0x7f, 0xdf, 0x2e, 0x41, 0x63,
+ 0x9a, 0x17, 0x61, 0xcc, 0xa0, 0x78, 0xca, 0xeb, 0x5c, 0xd9, 0xe6, 0x44,
+ 0x0e, 0xb5, 0x92, 0x30, 0xfe, 0x53, 0xeb, 0x9b, 0x4d, 0x52, 0x8d, 0x74,
+ 0x1e, 0x79, 0x32, 0xb2, 0xbf, 0x0d, 0xe3, 0x77, 0x28, 0x7c, 0xd6, 0x37,
+ 0x62, 0xe2, 0x80, 0xed, 0x98, 0x0a, 0x23, 0x6a, 0x45, 0x5b, 0x81, 0x65,
+ 0x21, 0xd0, 0x4f, 0xf4, 0x64, 0x4c, 0x84, 0x75, 0x6d, 0x52, 0xf8, 0x5e,
+ 0xaa, 0x95, 0xfb, 0x07, 0xe4, 0x1b, 0xd9, 0xce, 0xff, 0x5d, 0x57, 0x35,
+ 0xed, 0x83, 0xc3, 0x27, 0xa2, 0x4f, 0x7a, 0x95, 0xf2, 0x56, 0x69, 0x0b,
+ 0x2c, 0xd6, 0x04, 0xc0, 0x87, 0x4c, 0xf1, 0x36, 0x30, 0x14, 0x37, 0xb7,
+ 0x19, 0xe5, 0xc4, 0x0f, 0x72, 0xac, 0x65, 0x75, 0x5c, 0x83, 0xed, 0xb1,
+ 0x73, 0x45, 0xc5, 0xb1, 0x84, 0xa7, 0x54, 0x45, 0x9f, 0x0e, 0x63, 0x54,
+ 0x53, 0x56, 0x1e, 0xf7, 0xd5, 0x07, 0xcb, 0x58, 0x65, 0xba, 0x5e, 0x9e,
+ 0xad, 0xfd, 0x25, 0xbc, 0x94, 0xb5, 0x18, 0x3a, 0x08, 0xe1, 0xc8, 0xef,
+ 0x5f, 0xd7, 0x4d, 0xa2, 0x73, 0x45, 0xe9, 0xf3, 0x3e, 0x50, 0xc5, 0xf9,
+ 0x27, 0xf2, 0xb1, 0x59, 0x56, 0x8e, 0xf0, 0x6a, 0x14, 0xb5, 0xb1, 0xa1,
+ 0xa8, 0xbf, 0x79, 0x59, 0xa9, 0x5e, 0x5f, 0xf2, 0x4a, 0x12, 0xaa, 0x8a,
+ 0x3d, 0x92, 0x08, 0x20, 0x40, 0xe7, 0x3e, 0x71, 0xde, 0x6e, 0xb3, 0x9c,
+ 0x51, 0xc7, 0x0b, 0xb4, 0xf4, 0x86, 0xb3, 0x7a, 0x44, 0xa3, 0x39, 0xcb,
+ 0x30, 0xfd, 0xae, 0x31, 0xf1, 0xfb, 0x76, 0x01, 0x87, 0x13, 0x03, 0xc2,
+ 0x5a, 0x28, 0xfa, 0x16, 0x05, 0x0b, 0xc6, 0x41, 0xa1, 0x43, 0x3c, 0x73,
+ 0xcf, 0x56, 0xf7, 0x64, 0x88, 0x2c, 0xc5, 0x1f, 0xc4, 0x02, 0x80, 0x63,
+ 0x97, 0xe7, 0x29, 0x92, 0x0a, 0x62, 0x05, 0xd8, 0x1c, 0xfa, 0x1a, 0x2a,
+ 0x36, 0x93, 0xdc, 0x1e, 0x4e, 0x4e, 0x6a, 0x89, 0xfb, 0x1e, 0xc2, 0xf2,
+ 0x8a, 0x2f, 0x48, 0x6c, 0x92, 0x5d, 0xb7, 0xe2, 0x9c, 0x4f, 0x55, 0x36,
+ 0xe4, 0x0d, 0x2c, 0x2f, 0x76, 0xbc, 0x81, 0xdc, 0xec, 0x42, 0xe2, 0x70,
+ 0xf8, 0x83, 0x05, 0x66, 0xf1, 0x14, 0xb1, 0xfe, 0x07, 0x0d, 0x25, 0x98,
+ 0x4f, 0xd3, 0x2f, 0x03, 0xc3, 0xb4, 0x57, 0x29, 0xca, 0x2c, 0xdd, 0x8e,
+ 0x25, 0x0d, 0xea, 0x7b, 0xe3, 0x0c, 0x59, 0x5f, 0x6f, 0x86, 0xa2, 0xbe,
+ 0x97, 0x19, 0xe4, 0x73, 0x0a, 0xc3, 0xc7, 0x58, 0xab, 0x2b, 0xc3, 0x54,
+ 0x33, 0xb5, 0x9a, 0x40, 0x41, 0x6a, 0x37, 0x18, 0x27, 0xa9, 0x44, 0x27,
+ 0x44, 0x4e, 0xdc, 0x01, 0xcc, 0x80, 0x69, 0x33, 0xa0, 0xcb, 0xf9, 0xe3,
+ 0x9c, 0xf6, 0xab, 0xa7, 0xfb, 0x7c, 0xab, 0x97, 0xaf, 0x5f, 0xc9, 0xe8,
+ 0xc0, 0x79, 0x95, 0xea, 0xf9, 0x90, 0xbe, 0xa2, 0xa0, 0x89, 0x3a, 0x85,
+ 0x29, 0x81, 0xc9, 0x88, 0x46, 0xec, 0xee, 0x42, 0xef, 0x78, 0x69, 0x92,
+ 0x6a, 0xf3, 0x87, 0x20, 0x47, 0x20, 0xc1, 0x9e, 0xef, 0x45, 0xbb, 0x59,
+ 0x26, 0xd2, 0x22, 0xaf, 0x8b, 0x61, 0xb6, 0xca, 0x91, 0xf2, 0xa0, 0x0d,
+ 0xff, 0x9c, 0x7a, 0x5c, 0x5c, 0x8c, 0xce, 0x28, 0xb2, 0x73, 0xab, 0x67,
+ 0x47, 0x27, 0x74, 0x5b, 0xdc, 0x01, 0x1c, 0x2e, 0x97, 0x66, 0x7b, 0xf6,
+ 0x7b, 0xa0, 0x23, 0x56, 0xca, 0x5f, 0x7d, 0x42, 0x02, 0xf2, 0xc7, 0x22,
+ 0x2e, 0x1d, 0x7c, 0xbc, 0x65, 0x70, 0x9e, 0x25, 0x9c, 0xd4, 0xa1, 0x63,
+ 0xbc, 0x3c, 0xc7, 0x69, 0xca, 0xd7, 0x26, 0xb5, 0xf6, 0x15, 0xc3, 0x96,
+ 0x3f, 0x72, 0xc0, 0x74, 0xd9, 0x6a, 0x96, 0xbf, 0xe3, 0xe9, 0x16, 0xf4,
+ 0x5d, 0xee, 0x27, 0xe4, 0xb7, 0x26, 0x1b, 0xd5, 0x43, 0x05, 0x2f, 0x49,
+ 0xa4, 0x11, 0xc0, 0x77, 0xcf, 0xe7, 0x41, 0xd3, 0xd6, 0x4d, 0x2a, 0x09,
+ 0x7e, 0xb2, 0x8f, 0x17, 0x19, 0x41, 0x2f, 0xea, 0x17, 0x83, 0xc0, 0x1f,
+ 0xc1, 0xa5, 0x26, 0x4b, 0xca, 0xbc, 0xfe, 0x4a, 0x47, 0x0b, 0x0f, 0x3f,
+ 0x10, 0x0c, 0x97, 0x93, 0x16, 0x03, 0x9c, 0x2f, 0x72, 0x31, 0xd2, 0xed,
+ 0x07, 0x54, 0xb4, 0x60, 0xd9, 0x6c, 0x80, 0xbf, 0xfa, 0x25, 0x38, 0xc8,
+ 0xea, 0xad, 0x71, 0x6e, 0x79, 0x12, 0xe2, 0xbe, 0x04, 0x1a, 0xba, 0x0a,
+ 0xa4, 0xec, 0x6d, 0xce, 0xb4, 0x12, 0x5e, 0xfe, 0xaa, 0xce, 0x58, 0x02,
+ 0x3a, 0x07, 0xfa, 0x5a, 0x6d, 0x71, 0xcb, 0xa0, 0x4a, 0x6e, 0xe9, 0x8f,
+ 0x56, 0xa8, 0x10, 0x29, 0x0e, 0x17, 0xd9, 0x5f, 0x11, 0x2d, 0xa9, 0xb5,
+ 0x45, 0x98, 0x73, 0x45, 0x8c, 0x73, 0x4b, 0xef, 0xce, 0xde, 0xb7, 0xfb,
+ 0x07, 0xdb, 0xa8, 0xeb, 0xd3, 0x69, 0x4b, 0x3b, 0xc4, 0x5f, 0x3c, 0xa6,
+ 0x09, 0x94, 0xdb, 0x64, 0xe9, 0xc8, 0x38, 0xb3, 0x2b, 0xbd, 0x6e, 0x41,
+ 0x99, 0x16, 0xae, 0x82, 0x23, 0x19, 0x77, 0xc5, 0x5b, 0x46, 0xa4, 0xb5,
+ 0xd3, 0x31, 0xac, 0x81, 0xdb, 0x1a, 0xa2, 0x39, 0x28, 0x60, 0x95, 0x75,
+ 0x6f, 0xc3, 0xb1, 0xd1, 0x61, 0x94, 0xb9, 0x8b, 0x8e, 0xf8, 0x22, 0xeb,
+ 0xe5, 0xa1, 0x0a, 0x09, 0x85, 0xf6, 0x6e, 0x19, 0xc4, 0x02, 0xe1, 0xb9,
+ 0xde, 0xd3, 0x44, 0x98, 0x61, 0xe0, 0x82, 0x96, 0xf8, 0x0d, 0x72, 0xac,
+ 0x86, 0x20, 0xbf, 0xb9, 0x38, 0x9f, 0x71, 0x29, 0x86, 0x57, 0xfb, 0xf0,
+ 0x86, 0xb8, 0x62, 0xa0, 0xb0, 0x8b, 0x28, 0xaf, 0xe7, 0x09, 0x5d, 0x07,
+ 0xae, 0xdb, 0xb8, 0xbf, 0x96, 0x45, 0x2b, 0xc6, 0x6d, 0xa6, 0x75, 0x70,
+ 0x54, 0x4c, 0xbc, 0xb7, 0xff, 0x5a, 0xf9, 0xd3, 0xca, 0xb1, 0xa2, 0x8e,
+ 0x11, 0x34, 0x3d, 0x2a, 0x12, 0x37, 0x6a, 0xf5, 0x1e, 0x01, 0x03, 0x6c,
+ 0xce, 0xfe, 0x66, 0xdd, 0x3c, 0xca, 0x45, 0xdc, 0x98, 0x73, 0x9a, 0x95,
+ 0x6b, 0xcc, 0x9e, 0xa8, 0x36, 0xed, 0x3e, 0x46, 0x24, 0xf6, 0xc2, 0xc8,
+ 0x69, 0x38, 0xd7, 0x6f, 0xe2, 0xa3, 0x4b, 0xa8, 0xaf, 0x41, 0xad, 0x1f,
+ 0xdd, 0x6d, 0x86, 0x13, 0x41, 0x23, 0xd6, 0x4c, 0x4e, 0x8b, 0xef, 0x07,
+ 0x60, 0x75, 0x07, 0xca, 0x92, 0x4c, 0x05, 0x5b, 0x7f, 0x47, 0x34, 0x39,
+ 0x8e, 0x1b, 0x02, 0xff, 0xb5, 0x77, 0xef, 0x0f, 0xe9, 0xe6, 0xca, 0x84,
+ 0x2d, 0xbf, 0x71, 0x19, 0x7e, 0x9e, 0xd4, 0x36, 0x9b, 0xf8, 0x39, 0x2a,
+ 0x7b, 0xf9, 0x58, 0x7c, 0xbe, 0x62, 0x82, 0x56, 0xad, 0x6c, 0xbe, 0x7a,
+ 0x05, 0xc1, 0x72, 0xe8, 0x71, 0x73, 0x3a, 0xdb, 0xe4, 0xba, 0x42, 0x3c,
+ 0x04, 0x36, 0xe7, 0x24, 0x97, 0x63, 0x0d, 0x45, 0x7b, 0xa9, 0x18, 0x76,
+ 0x1c, 0x45, 0xba, 0x03, 0x40, 0xc1, 0xf1, 0x3d, 0xac, 0xbd, 0xf1, 0x80,
+ 0xd5, 0x7a, 0x5d, 0xa5, 0xe5, 0x32, 0x67, 0x1a, 0x62, 0xc6, 0x96, 0x6c,
+ 0x3f, 0xcc, 0xa2, 0x94, 0xb8, 0xe8, 0x8e, 0x18, 0x81, 0xe1, 0x8b, 0x18,
+ 0xc5, 0xcb, 0x27, 0xb7, 0x8a, 0xed, 0xdb, 0x1d, 0x2b, 0xdc, 0xf7, 0x41,
+ 0x98, 0xa5, 0x96, 0x31, 0x15, 0x0d, 0x49, 0x5b, 0x7a, 0x70, 0x39, 0x1e,
+ 0xb5, 0xf9, 0xd8, 0x57, 0x3e, 0xa5, 0x46, 0x53, 0xa7, 0x05, 0xbd, 0x16,
+ 0x3c, 0x89, 0xd7, 0x7b, 0xf2, 0x5e, 0x2f, 0xc2, 0x43, 0x37, 0x02, 0x76,
+ 0x56, 0x06, 0x6d, 0x7b, 0xbc, 0x37, 0xef, 0xda, 0x89, 0xcd, 0xf9, 0x03,
+ 0x36, 0x4f, 0x3f, 0x40, 0xbf, 0xab, 0xce, 0x88, 0x2e, 0xd0, 0xff, 0x8e,
+ 0x1e, 0xb2, 0x9c, 0x1a, 0x13, 0xa8, 0xb8, 0xb3, 0x7f, 0x8e, 0x31, 0xe9,
+ 0xf1, 0xdc, 0xe9, 0x30, 0x38, 0x5e, 0xa5, 0x7a, 0xa0, 0x6e, 0x07, 0xf2,
+ 0xe5, 0x9f, 0xb2, 0xfb, 0x81, 0x48, 0x2d, 0x14, 0xef, 0x5e, 0x7b, 0x2c,
+ 0xe9, 0xbd, 0xf7, 0x86, 0xef, 0x20, 0xc5, 0x32, 0xd1, 0x48, 0xab, 0xec,
+ 0xa8, 0xbe, 0x22, 0x88, 0x00, 0x2e, 0x47, 0xe4, 0x43, 0x76, 0x53, 0x89,
+ 0x67, 0xb4, 0x1e, 0x95, 0xb6, 0x97, 0xc0, 0x08, 0xe0, 0xb9, 0x25, 0x13,
+ 0x55, 0xf1, 0xeb, 0x1d, 0x81, 0x50, 0x6d, 0xab, 0x90, 0x32, 0xf0, 0x84,
+ 0xb1, 0x52, 0xfe, 0x5b, 0xaa, 0x96, 0x52, 0x6f, 0x7b, 0xac, 0xa0, 0x54,
+ 0x7b, 0xb5, 0x76, 0x3d, 0x51, 0x09, 0x24, 0xdc, 0x4d, 0x99, 0x3a, 0x2f,
+ 0x69, 0xb1, 0xf1, 0xf3, 0xeb, 0xff, 0x47, 0xfe, 0xdb, 0x24, 0xf6, 0x1a,
+ 0xcc, 0x0d, 0x79, 0xbb, 0xd2, 0x99, 0x8f, 0x8e, 0x5d, 0xf1, 0x9c, 0x21,
+ 0x99, 0x70, 0xa7, 0x7b, 0xb8, 0x32, 0xcf, 0x24, 0xf6, 0xf9, 0x2c, 0x14,
+ 0xb3, 0xc6, 0x00, 0x2d, 0xff, 0xeb, 0xd5, 0x3a, 0xe2, 0x41, 0x00, 0x47,
+ 0x56, 0xf3, 0x1f, 0x53, 0x51, 0x76, 0xff, 0xfe, 0x54, 0x8e, 0xbf, 0xc1,
+ 0x7e, 0x22, 0x7d, 0x25, 0x79, 0x92, 0x33, 0xce, 0x99, 0x07, 0x6a, 0x96,
+ 0xac, 0xa2, 0x26, 0x2f, 0xb8, 0xdc, 0x14, 0x1f, 0xc6, 0x44, 0xec, 0x6f,
+ 0xb8, 0xd0, 0xd4, 0x5d, 0xa1, 0x56, 0x19, 0x31, 0x9b, 0xb9, 0x9a, 0x9b,
+ 0x2b, 0xa1, 0x5f, 0x2f, 0x9c, 0xbf, 0x14, 0x59, 0xca, 0x74, 0x84, 0x9e,
+ 0x96, 0x60, 0xe8, 0x16, 0xa3, 0xcf, 0x6a, 0x79, 0x70, 0x36, 0xc8, 0xe8,
+ 0x6b, 0xa1, 0xde, 0x26, 0x60, 0xed, 0x03, 0x5d, 0xe2, 0x4c, 0x81, 0x0d,
+ 0x27, 0xd3, 0xd7, 0xd1, 0xa6, 0x34, 0x75, 0xde, 0xde, 0xba, 0x44, 0x28,
+ 0x42, 0xa9, 0xd0, 0x72, 0x26, 0x61, 0xdb, 0x37, 0xa9, 0x27, 0x60, 0xbd,
+ 0x1f, 0xd5, 0x3c, 0x74, 0xa1, 0x1f, 0x67, 0xeb, 0x54, 0xca, 0x44, 0x35,
+ 0xf2, 0xe2, 0x08, 0x98, 0x01, 0x7f, 0x11, 0x3c, 0x28, 0x4f, 0x33, 0x37,
+ 0x80, 0x41, 0x7d, 0x11, 0xfb, 0xb6, 0xce, 0x88, 0xc0, 0x9a, 0x6b, 0x64,
+ 0x97, 0xff, 0x9d, 0x6d, 0x39, 0x19, 0x60, 0x46, 0xdb, 0x0d, 0x99, 0xff,
+ 0x53, 0xad, 0x9c, 0xde, 0x77, 0x3b, 0xd7, 0xc0, 0x92, 0x9f, 0x35, 0x9c,
+ 0xb3, 0x0f, 0x7b, 0xd7, 0x66, 0xea, 0x1f, 0x6b, 0x8d, 0x45, 0xd8, 0xc6,
+ 0xa0, 0x97, 0x73, 0xbe, 0x7b, 0x11, 0xf7, 0xd1, 0xdc, 0x53, 0x40, 0x37,
+ 0xf3, 0x5b, 0x1d, 0x3d, 0x39, 0x3c, 0x39, 0x71, 0x1d, 0xad, 0x40, 0xb5,
+ 0x2a, 0x55, 0x0c, 0x2f, 0x6d, 0x92, 0x53, 0x51, 0xa7, 0x6d, 0x9e, 0x4b,
+ 0x32, 0x01, 0x8c, 0x62, 0x36, 0x74, 0x4c, 0x3b, 0xe3, 0xb8, 0x1f, 0xc3,
+ 0xc8, 0x70, 0xf0, 0x7a, 0x7b, 0x02, 0xf9, 0xd9, 0x31, 0x20, 0x36, 0x03,
+ 0x18, 0x82, 0x85, 0x1e, 0x82, 0x0d, 0x26, 0x4b, 0xf0, 0xbc, 0x8c, 0x2a,
+ 0xb8, 0xbc, 0xf4, 0x83, 0x2b, 0xe1, 0x51, 0x8b, 0xef, 0x82, 0x58, 0x86,
+ 0x26, 0x4e, 0x26, 0x48, 0x0a, 0x16, 0x49, 0x9a, 0x1d, 0x2a, 0xd7, 0x6c,
+ 0x53, 0x64, 0x4c, 0x3b, 0xdf, 0xb2, 0x9d, 0x57, 0xb3, 0x69, 0x3d, 0xfb,
+ 0xb3, 0x79, 0xfd, 0x75, 0xe2, 0x0b, 0x42, 0xb1, 0x29, 0x1b, 0xfd, 0xef,
+ 0x03, 0x73, 0x1a, 0x43, 0x1c, 0xfd, 0x8d, 0x02, 0x50, 0xc7, 0x6d, 0x0c,
+ 0x68, 0xa0, 0xd5, 0x3c, 0x75, 0x5e, 0x92, 0x68, 0x64, 0x83, 0xe1, 0x35,
+ 0x15, 0xda, 0x6c, 0xfa, 0x20, 0x35, 0x64, 0x82, 0xdd, 0x25, 0x05, 0xf9,
+ 0xdf, 0xc8, 0x8d, 0x52, 0xfa, 0xcb, 0x84, 0x37, 0x9c, 0x04, 0x4a, 0x17,
+ 0x9c, 0x93, 0x50, 0xbd, 0x26, 0xff, 0xe2, 0x57, 0xb8, 0x1d, 0x11, 0xfa,
+ 0x54, 0x35, 0xef, 0xe4, 0xca, 0x27, 0x79, 0x6a, 0xc7, 0x53, 0x21, 0xb2,
+ 0x9b, 0x3d, 0x9e, 0x2d, 0xe8, 0xdf, 0xaa, 0x49, 0x92, 0x85, 0xdb, 0xd4,
+ 0x9b, 0x8c, 0x2f, 0x18, 0x64, 0xd9, 0x92, 0xbe, 0x03, 0x63, 0x24, 0x2b,
+ 0x35, 0x0f, 0x25, 0x9e, 0xb7, 0x24, 0x95, 0x1f, 0x6c, 0xc1, 0xdd, 0x86,
+ 0x8e, 0xff, 0x6e, 0x6d, 0xa6, 0xe9, 0x1b, 0x80, 0xac, 0x97, 0xb0, 0xe1,
+ 0x4c, 0x93, 0xf5, 0x68, 0x42, 0xff, 0xf8, 0x3d, 0x65, 0x7e, 0xec, 0xfb,
+ 0x90, 0xbe, 0x72, 0x91, 0x6e, 0x80, 0x3d, 0x0e, 0x86, 0xb5, 0xc6, 0x75,
+ 0xc3, 0x9e, 0x9b, 0xc0, 0x30, 0x4a, 0x65, 0x46, 0x11, 0xcd, 0x27, 0xa5,
+ 0xb1, 0xd0, 0x7d, 0x09, 0xcf, 0xe6, 0x45, 0x2c, 0xee, 0x48, 0xe1, 0x22,
+ 0x34, 0x4f, 0xe2, 0x55, 0x2b, 0xb9, 0x9c, 0x7b, 0xed, 0x8a, 0x5c, 0xbc,
+ 0xf9, 0x47, 0x0b, 0x52, 0x73, 0xe2, 0xb3, 0x45, 0x06, 0xf7, 0x1b, 0xae,
+ 0x95, 0x1c, 0x64, 0x7b, 0xe2, 0x3e, 0xaa, 0x0d, 0xf3, 0xf3, 0x28, 0x9c,
+ 0xe3, 0x88, 0x97, 0x0d, 0xda, 0x56, 0x4f, 0x25, 0x90, 0xa5, 0x7d, 0x2a,
+ 0x2b, 0x7d, 0x72, 0x54, 0xb1, 0xb5, 0x75, 0x01, 0x33, 0x44, 0xa1, 0x85,
+ 0x62, 0x3b, 0x5e, 0xfc, 0xf7, 0xcf, 0xa4, 0x36, 0x7a, 0x03, 0x35, 0xd7,
+ 0x03, 0x72, 0x37, 0x28, 0x0f, 0x7e, 0x85, 0x22, 0xb3, 0x26, 0xf4, 0x1b,
+ 0x07, 0x1e, 0x49, 0x6b, 0x6c, 0xc8, 0x8e, 0xa1, 0x17, 0x5b, 0x02, 0xe9,
+ 0xb2, 0x1b, 0xd8, 0xbf, 0x0a, 0xcc, 0xcb, 0xc7, 0x5d, 0x87, 0x5b, 0xcc,
+ 0xc8, 0x12, 0x52, 0x09, 0xae, 0x22, 0x90, 0xa4, 0x83, 0xe7, 0x02, 0xdf,
+ 0x9d, 0xc9, 0x85, 0x3d, 0x50, 0xaa, 0x22, 0x2a, 0x79, 0xae, 0xfb, 0x72,
+ 0x14, 0x93, 0x46, 0xff, 0x4d, 0x96, 0x44, 0x61, 0xca, 0xdf, 0x6f, 0x4e,
+ 0xa4, 0x4c, 0x33, 0xfa, 0x95, 0xf0, 0xc0, 0x16, 0x1d, 0xbe, 0x4c, 0x82,
+ 0x85, 0xc0, 0xe6, 0xf3, 0x58, 0x86, 0x21, 0x5b, 0x50, 0xd6, 0x31, 0xd4,
+ 0xb4, 0x70, 0x38, 0x7b, 0x61, 0x4b, 0x07, 0xab, 0xca, 0xa1, 0xb5, 0xb7,
+ 0xc0, 0x4a, 0x6f, 0x26, 0x38, 0x2b, 0xb1, 0xa8, 0x4a, 0xae, 0x98, 0x03,
+ 0xfc, 0x01, 0xe5, 0x37, 0xb0, 0x0c, 0x51, 0xe1, 0xc0, 0xca, 0xa9, 0xf8,
+ 0x64, 0xda, 0xe8, 0xa9, 0xb2, 0x09, 0x36, 0xde, 0xb2, 0x74, 0x3d, 0x50,
+ 0x6c, 0xf7, 0x31, 0x64, 0x0b, 0x7c, 0x71, 0x57, 0xda, 0x00, 0x47, 0xa1,
+ 0x56, 0x04, 0xbc, 0x08, 0xe7, 0x66, 0x41, 0x5d, 0xab, 0xeb, 0x0a, 0x8b,
+ 0xc4, 0x13, 0x3a, 0x0e, 0xca, 0xd7, 0xe1, 0x43, 0x32, 0x4f, 0xc8, 0xd7,
+ 0x2a, 0xe1, 0x25, 0x89, 0xbe, 0x73, 0x17, 0x39, 0xe3, 0x49, 0x4a, 0x3b,
+ 0x72, 0xdd, 0x4a, 0xa4, 0xe3, 0xf2, 0xe9, 0x06, 0x5b, 0x9f, 0x49, 0x42,
+ 0xb9, 0x48, 0xb7, 0x9e, 0xc2, 0x73, 0x28, 0x18, 0x69, 0x15, 0xf7, 0x6b,
+ 0x0f, 0x20, 0xd5, 0x30, 0xad, 0xab, 0xd1, 0xe2, 0x35, 0xb4, 0xd8, 0xde,
+ 0x9b, 0xd2, 0x5e, 0x72, 0xed, 0xc2, 0x1c, 0x6e, 0xb2, 0xa6, 0xa4, 0x42,
+ 0x57, 0x7d, 0xb1, 0x75, 0xe8, 0x2b, 0x97, 0x0d, 0x8b, 0x12, 0x8f, 0x2e,
+ 0xe5, 0x30, 0x3d, 0x43, 0xe5, 0xdb, 0x0f, 0x9e, 0x57, 0x63, 0x31, 0xf4,
+ 0x69, 0xda, 0x6d, 0xc2, 0x29, 0x6f, 0xda, 0x1c, 0xc9, 0x95, 0x3c, 0x07,
+ 0x60, 0x36, 0xb3, 0x0c, 0x14, 0x2b, 0x47, 0xe4, 0x42, 0xed, 0x0b, 0x8d,
+ 0x72, 0xbd, 0xb9, 0x04, 0xee, 0xf4, 0x64, 0x91, 0xcc, 0xa5, 0x3b, 0x59,
+ 0x4d, 0xef, 0x52, 0x38, 0x68, 0xfd, 0x1e, 0xae, 0x38, 0xd0, 0x36, 0x18,
+ 0x69, 0x7a, 0xf0, 0xfd, 0x03, 0xec, 0x8d, 0x1a, 0x36, 0x21, 0xc4, 0xef,
+ 0x16, 0x8f, 0xef, 0xeb, 0x52, 0x6b, 0xb5, 0x22, 0x36, 0x7a, 0x1f, 0xdf,
+ 0xf0, 0xa0, 0xac, 0x74, 0x90, 0xe8, 0x39, 0x8e, 0x32, 0x94, 0x29, 0x9a,
+ 0xa3, 0x1b, 0x1b, 0x5c, 0xef, 0x7b, 0xeb, 0x25, 0xbb, 0xc1, 0x89, 0x38,
+ 0x90, 0x84, 0xba, 0x14, 0x53, 0xef, 0x61, 0x85, 0xaf, 0x27, 0xef, 0x4c,
+ 0xb4, 0x2b, 0xac, 0xb2, 0xf6, 0x21, 0x3c, 0xbf, 0x2a, 0x24, 0xac, 0xef,
+ 0x8a, 0xeb, 0xd1, 0x82, 0xb8, 0x2e, 0x29, 0x3a, 0xcf, 0xc3, 0xcd, 0xc3,
+ 0x1e, 0xb8, 0xff, 0xac, 0x35, 0xbe, 0x63, 0x3f, 0xbd, 0xa5, 0x97, 0xb2,
+ 0xdb, 0xa6, 0x73, 0x4e, 0xb3, 0x62, 0x70, 0x02, 0x63, 0x4f, 0xdf, 0x9b,
+ 0x81, 0xe0, 0xa8, 0x75, 0x2c, 0xd6, 0x4b, 0x22, 0x4f, 0x83, 0x74, 0xc2,
+ 0xe7, 0x5f, 0x64, 0x73, 0xcf, 0x7d, 0xa8, 0x9a, 0x2d, 0x87, 0x99, 0x91,
+ 0x35, 0x08, 0xe6, 0x14, 0x8d, 0xef, 0x51, 0xd7, 0xa9, 0x97, 0xeb, 0xbd,
+ 0x90, 0xa4, 0xc7, 0xc8, 0x35, 0x32, 0xc4, 0xe0, 0x7a, 0x12, 0x33, 0x12,
+ 0x20, 0x8e, 0x05, 0xde, 0xe9, 0x0f, 0xf9, 0x1b, 0xc8, 0xfa, 0xb2, 0x74,
+ 0x81, 0x36, 0xff, 0x3f, 0x2a, 0x55, 0x09, 0xe0, 0xd6, 0xc4, 0xeb, 0x8f,
+ 0xfe, 0x88, 0xe5, 0xcf, 0x50, 0x2b, 0xd0, 0x53, 0x80, 0xb8, 0x75, 0x5e,
+ 0xbb, 0x08, 0xd9, 0x3a, 0x8a, 0x4b, 0xdc, 0x16, 0xb0, 0x17, 0x43, 0x34,
+ 0x57, 0xb7, 0x42, 0xc1, 0x57, 0xd7, 0x9d, 0x79, 0x13, 0xcb, 0xac, 0x73,
+ 0x16, 0x44, 0xbb, 0xff, 0xa1, 0x34, 0xc5, 0x17, 0xce, 0x13, 0x75, 0xeb,
+ 0x27, 0x84, 0x01, 0xda, 0x44, 0x6d, 0x8c, 0x22, 0x40, 0x7b, 0x02, 0xc7,
+ 0x87, 0x7c, 0x3f, 0xa2, 0x6c, 0xd5, 0xc4, 0xda, 0xbe, 0x32, 0x2c, 0x39,
+ 0x1e, 0x30, 0xb4, 0x48, 0x4e, 0x7c, 0x94, 0x3a, 0x94, 0xbf, 0xb8, 0x98,
+ 0x8e, 0xf1, 0xcc, 0xd8, 0x58, 0x55, 0x43, 0xeb, 0xc8, 0x9c, 0xc8, 0x93,
+ 0x82, 0xaf, 0x0d, 0x59, 0x4d, 0xee, 0xb5, 0x16, 0x60, 0xb7, 0x9e, 0x2c,
+ 0x7c, 0x86, 0x5c, 0xf4, 0x71, 0x56, 0x7b, 0xff, 0xaa, 0x82, 0xf7, 0x55,
+ 0x68, 0x51, 0x63, 0x23, 0x26, 0xdf, 0x43, 0x32, 0x45, 0xbf, 0xa2, 0xeb,
+ 0xc3, 0x7e, 0x3d, 0x38, 0x62, 0x4c, 0xa3, 0x78, 0xf4, 0x45, 0x41, 0xb5,
+ 0x9b, 0xee, 0x33, 0x94, 0x74, 0xe8, 0x43, 0x44, 0x03, 0xb5, 0x30, 0x32,
+ 0x9d, 0x05, 0x5e, 0x83, 0xd7, 0x6c, 0x3d, 0xb3, 0xa7, 0x39, 0x91, 0x15,
+ 0x3f, 0x7d, 0xfe, 0x07, 0x17, 0x86, 0xee, 0x7f, 0x3f, 0xcb, 0xe4, 0xa6,
+ 0x3e, 0xd1, 0x47, 0xd3, 0x50, 0x8e, 0x26, 0x90, 0xef, 0x3b, 0x6c, 0xd7,
+ 0xe5, 0x4c, 0x41, 0xb5, 0xb4, 0x7f, 0x37, 0xe4, 0xec, 0xa9, 0x71, 0x0b,
+ 0xea, 0x83, 0x2f, 0x14, 0xe4, 0xc8, 0x3f, 0x69, 0xef, 0x6f, 0x82, 0xf1,
+ 0xe5, 0x28, 0x54, 0xcf, 0xb1, 0xed, 0x7a, 0xb8, 0x11, 0xac, 0x6c, 0x7b,
+ 0x55, 0x25, 0x49, 0x21, 0xed, 0x0a, 0x29, 0x29, 0x01, 0x41, 0x13, 0xd4,
+ 0xec, 0xf1, 0xaf, 0x7e, 0x21, 0xf6, 0xf9, 0x51, 0xb3, 0x5e, 0x72, 0x83,
+ 0xfb, 0x7c, 0x72, 0x6b, 0xe0, 0xce, 0xdf, 0xff, 0x49, 0x15, 0x79, 0x22,
+ 0x43, 0x63, 0xb9, 0x1c, 0xf9, 0x58, 0x86, 0xa4, 0x20, 0x95, 0x84, 0x16,
+ 0x2d, 0xd4, 0x03, 0x97, 0x7a, 0xca, 0xbb, 0xc6, 0x55, 0x90, 0x39, 0xf4,
+ 0x45, 0x0d, 0xd5, 0x75, 0x0a, 0x38, 0x18, 0x61, 0x1a, 0xcf, 0xe6, 0xc0,
+ 0xe9, 0x0b, 0xba, 0xe4, 0x42, 0x24, 0xa1, 0xba, 0x3d, 0x8d, 0x57, 0xf3,
+ 0x85, 0x0a, 0xba, 0x94, 0x52, 0x86, 0xb7, 0x72, 0x25, 0xa6, 0xe6, 0xaa,
+ 0xbd, 0x33, 0xef, 0xd9, 0x63, 0x1c, 0x8b, 0xb8, 0xd4, 0x1c, 0x5f, 0x26,
+ 0x20, 0x8e, 0x11, 0xb0, 0x04, 0xc6, 0xdc, 0x5b, 0x7e, 0xc9, 0x18, 0x8b,
+ 0xd7, 0xa4, 0x71, 0xed, 0x9b, 0x69, 0xdd, 0xe4, 0xaf, 0xc4, 0x21, 0x0e,
+ 0x31, 0xac, 0x5f, 0x1d, 0x17, 0xf4, 0xf3, 0x71, 0xd0, 0x8a, 0xbd, 0x0f,
+ 0x37, 0x7e, 0x03, 0x22, 0x8c, 0xf5, 0xc5, 0x92, 0x37, 0xd6, 0xca, 0x37,
+ 0x2b, 0xd1, 0x2b, 0x1c, 0x9b, 0x71, 0x5e, 0x0b, 0xe3, 0x91, 0x2e, 0xe1,
+ 0x0d, 0xc0, 0xfa, 0x9f, 0xb0, 0x95, 0xf0, 0x92, 0x9e, 0xdc, 0x98, 0xa9,
+ 0xb8, 0xd4, 0xa5, 0x8e, 0x01, 0xd6, 0x5c, 0x9e, 0x4d, 0xe5, 0x5b, 0x75,
+ 0xfe, 0x2a, 0x43, 0xc6, 0x21, 0xe3, 0x34, 0x8b, 0x36, 0x63, 0xf7, 0xf4,
+ 0xa6, 0xcf, 0x98, 0x24, 0xa2, 0x18, 0x12, 0x1b, 0xb6, 0xef, 0xe5, 0x7f,
+ 0x79, 0xd6, 0xb2, 0x33, 0xd9, 0x51, 0xb1, 0x2e, 0x4c, 0x0c, 0xae, 0x29,
+ 0x23, 0x9d, 0x31, 0x9d, 0x92, 0xdc, 0x78, 0x84, 0x24, 0xfd, 0x0d, 0xd0,
+ 0x5d, 0x59, 0xcd, 0x1a, 0x8b, 0x68, 0x01, 0xb1, 0x4e, 0x53, 0xd9, 0xc7,
+ 0x0f, 0x05, 0x49, 0xaf, 0x87, 0x9c, 0x48, 0xa9, 0xd2, 0xfd, 0x4c, 0xb8,
+ 0x2c, 0x18, 0xa6, 0x64, 0x7f, 0x75, 0x29, 0x7d, 0xb7, 0x4e, 0x3b, 0x6b,
+ 0x57, 0x7e, 0x8d, 0x83, 0x8a, 0x54, 0xe7, 0x08, 0xe9, 0x3b, 0x9a, 0xd3,
+ 0x93, 0xbb, 0x19, 0xa4, 0x3c, 0x0c, 0x6e, 0x9c, 0x41, 0x7b, 0xfb, 0xef,
+ 0x7a, 0x2a, 0x47, 0xbe, 0x0d, 0xe4, 0x4d, 0x95, 0x12, 0x06, 0x5b, 0x1a,
+ 0x99, 0x6f, 0xb8, 0xcc, 0x06, 0x04, 0x8f, 0xeb, 0xff, 0xf4, 0x9f, 0xd8,
+ 0x2e, 0xd0, 0x80, 0x22, 0xfb, 0x6c, 0x5a, 0x21, 0x33, 0x98, 0x7d, 0xaf,
+ 0x36, 0x97, 0x76, 0x02, 0xdb, 0x0d, 0x76, 0xe4, 0x12, 0x77, 0x33, 0x4e,
+ 0x52, 0x1c, 0xd8, 0xe2, 0x33, 0xa2, 0xf9, 0x1c, 0x6f, 0x8d, 0xc3, 0x12,
+ 0xef, 0xa5, 0x35, 0x4f, 0x4b, 0x73, 0x87, 0x57, 0x60, 0xb5, 0x39, 0x22,
+ 0xb4, 0x80, 0xa5, 0x48, 0x7e, 0x2e, 0x78, 0xc3, 0xc2, 0xc5, 0x87, 0x80,
+ 0xff, 0x7f, 0x09, 0x99, 0xd4, 0x96, 0x07, 0x4d, 0xc0, 0x7f, 0xb7, 0x57,
+ 0x83, 0x58, 0xf0, 0xb4, 0xde, 0xc6, 0xd1, 0x1c, 0x82, 0x7f, 0x46, 0x98,
+ 0xf4, 0x81, 0x9f, 0xa3, 0x13, 0xf6, 0xf2, 0x2c, 0x91, 0x3c, 0x5a, 0x6f,
+ 0xac, 0xc0, 0x05, 0x7f, 0x19, 0x31, 0x95, 0x70, 0x8b, 0x63, 0x71, 0x98,
+ 0x3a, 0xf2, 0x72, 0x36, 0xfd, 0x88, 0x88, 0x12, 0x86, 0x28, 0x1a, 0x33,
+ 0xaf, 0x41, 0xab, 0x56, 0xa1, 0xf7, 0x84, 0x16, 0x8d, 0x4f, 0xde, 0xd2,
+ 0x82, 0xb4, 0x72, 0x5a, 0x5b, 0xd2, 0x6f, 0xed, 0x53, 0x64, 0x7e, 0x74,
+ 0x64, 0x22, 0xc2, 0x6a, 0xd9, 0xa6, 0x1a, 0x60, 0x97, 0x75, 0x6c, 0x92,
+ 0x54, 0x77, 0x9c, 0xf5, 0x03, 0xd8, 0x93, 0x2d, 0x95, 0xc5, 0x55, 0x57,
+ 0x73, 0x34, 0xb9, 0x08, 0x2d, 0xb5, 0x87, 0xda, 0xf2, 0x26, 0xca, 0xf0,
+ 0x55, 0x36, 0x74, 0x76, 0x64, 0x77, 0xf7, 0x85, 0x4f, 0xe1, 0xe3, 0xc8,
+ 0x3f, 0x78, 0x3f, 0x00, 0xa0, 0xbe, 0x19, 0x53, 0xbd, 0xec, 0xe1, 0xc3,
+ 0xbe, 0xc1, 0x15, 0xea, 0x09, 0xd1, 0xc2, 0x4a, 0xa4, 0x52, 0x50, 0xa5,
+ 0x1b, 0xd0, 0xb3, 0x8b, 0x91, 0x4f, 0x93, 0xa1, 0xcc, 0x60, 0xd7, 0xd9,
+ 0x8c, 0xc6, 0xbb, 0x76, 0xc5, 0xbf, 0x52, 0x32, 0x66, 0x95, 0xb4, 0x73,
+ 0x48, 0x26, 0xfb, 0x55, 0xd7, 0xa8, 0x04, 0x1e, 0x8f, 0xb9, 0x3d, 0x5d,
+ 0xe7, 0xe2, 0x16, 0x27, 0x04, 0x48, 0x24, 0x4c, 0x0e, 0x45, 0x89, 0x45,
+ 0x5b, 0xab, 0x7a, 0xb7, 0x0d, 0x75, 0x85, 0x7c, 0xa3, 0x73, 0xa2, 0x95,
+ 0x2f, 0xd6, 0x00, 0x80, 0x75, 0x8a, 0x9f, 0x35, 0x39, 0x25, 0x7b, 0x08,
+ 0x2c, 0xef, 0xea, 0x2b, 0x8c, 0xfd, 0xec, 0x59, 0xff, 0x76, 0xc3, 0xa2,
+ 0xa3, 0x34, 0xd8, 0x7a, 0xb0, 0x5e, 0xbe, 0xc5, 0x70, 0x02, 0x74, 0x2d,
+ 0x94, 0xba, 0x62, 0x57, 0x39, 0x36, 0xa2, 0xcf, 0x7e, 0x70, 0x66, 0x3c,
+ 0xe3, 0x20, 0x53, 0x49, 0x40, 0xc2, 0xb0, 0x4b, 0xa5, 0x1f, 0x4f, 0x2b,
+ 0x4c, 0xc5, 0x9c, 0xc1, 0x6a, 0x87, 0xef, 0x22, 0xb2, 0xf9, 0x25, 0x6a,
+ 0xcb, 0x6d, 0xa8, 0xdc, 0xc2, 0x62, 0xf6, 0xb2, 0xb4, 0x25, 0x05, 0x57,
+ 0x79, 0xfb, 0xee, 0xb7, 0x45, 0x25, 0x67, 0x72, 0x27, 0x74, 0x8d, 0xa4,
+ 0xe1, 0xfd, 0xae, 0x83, 0xad, 0xe8, 0xde, 0x59, 0x93, 0x1a, 0xec, 0x06,
+ 0xfd, 0x86, 0x8f, 0x5b, 0x69, 0x73, 0x9c, 0x28, 0x3a, 0xb4, 0xde, 0x63,
+ 0x23, 0x20, 0x0f, 0x6e, 0x2f, 0x2e, 0xe2, 0x28, 0xa9, 0x23, 0xf2, 0xc7,
+ 0xbc, 0xc7, 0x46, 0x83, 0x01, 0xb7, 0xdd, 0xcc, 0x97, 0x13, 0x26, 0xba,
+ 0x76, 0xb8, 0x24, 0x4c, 0x8c, 0x81, 0x39, 0xd5, 0x93, 0xe0, 0x4c, 0x19,
+ 0xd0, 0x52, 0xdd, 0x98, 0x51, 0x67, 0x28, 0x0b, 0xb8, 0x09, 0x58, 0x01,
+ 0xaf, 0x2d, 0x4b, 0x15, 0x38, 0x95, 0x10, 0x20, 0xff, 0x6a, 0xe6, 0x58,
+ 0xd6, 0x7d, 0x7e, 0x2f, 0x7d, 0x03, 0xae, 0xd2, 0x93, 0x1d, 0x40, 0x61,
+ 0xd7, 0xdf, 0x98, 0xd1, 0x0a, 0xa6, 0xd3, 0x03, 0x65, 0xa2, 0xa6, 0xcd,
+ 0xab, 0x42, 0xc0, 0xfc, 0xab, 0x77, 0xf1, 0xf7, 0x61, 0xcb, 0x58, 0x6f,
+ 0x2a, 0x36, 0xd1, 0xa7, 0x6f, 0x60, 0xfd, 0x16, 0x8c, 0x4b, 0x2d, 0xa5,
+ 0x9a, 0x5c, 0x1f, 0xb9, 0x2a, 0xd1, 0xfe, 0x7a, 0x39, 0xa0, 0x97, 0xcd,
+ 0xf6, 0xb4, 0x81, 0x0a, 0xf7, 0x8d, 0x1f, 0x8e, 0x15, 0x29, 0x26, 0xda,
+ 0x7e, 0x76, 0x93, 0x06, 0x0c, 0xe3, 0x20, 0x27, 0x83, 0xe1, 0xcb, 0x43,
+ 0x0e, 0xb4, 0xfe, 0x0f, 0x54, 0xb5, 0x23, 0x05, 0x50, 0x1d, 0x92, 0x3b,
+ 0x3e, 0x58, 0xf1, 0xe7, 0x97, 0x02, 0x7c, 0x59, 0x4d, 0xe7, 0x63, 0xaa,
+ 0xb3, 0x8b, 0x43, 0xdb, 0x61, 0x30, 0xbd, 0x66, 0x4e, 0x5d, 0xa9, 0xde,
+ 0xda, 0x13, 0x5f, 0xf4, 0xeb, 0x72, 0x9f, 0x2b, 0x40, 0xc5, 0x34, 0x00,
+ 0xf3, 0x4b, 0xf8, 0x9a, 0x6e, 0x42, 0x27, 0xd8, 0x18, 0xf6, 0xfe, 0xfc,
+ 0x6a, 0x74, 0x38, 0xe9, 0x9d, 0x97, 0xf0, 0x36, 0x13, 0x65, 0x84, 0x1b,
+ 0x97, 0xe4, 0x9c, 0xfe, 0x53, 0xf0, 0x27, 0xc0, 0xc7, 0xf9, 0x62, 0xcb,
+ 0xb6, 0x0b, 0xba, 0x89, 0x85, 0xb3, 0x45, 0x67, 0x16, 0xa7, 0xd8, 0x6c,
+ 0xf3, 0x44, 0x10, 0x2b, 0x0d, 0xcf, 0x43, 0x25, 0xd2, 0x74, 0x73, 0xff,
+ 0x2e, 0x91, 0x86, 0xb5, 0x7a, 0xda, 0xc1, 0x67, 0x1b, 0x96, 0x00, 0x28,
+ 0xca, 0xb4, 0x74, 0xf2, 0xf4, 0xd2, 0x10, 0x15, 0x58, 0x2d, 0x19, 0x97,
+ 0xd1, 0xc6, 0xd2, 0xac, 0x7a, 0xd6, 0x9e, 0x00, 0x6c, 0x85, 0xfb, 0xad,
+ 0x3a, 0x6a, 0x8c, 0x8a, 0x3a, 0xa3, 0x39, 0x4e, 0x75, 0xf4, 0xb5, 0x8a,
+ 0x16, 0x37, 0x61, 0x60, 0x36, 0x7b, 0xf2, 0xd8, 0x4b, 0x56, 0xfe, 0x4d,
+ 0x47, 0xe4, 0x17, 0x79, 0x08, 0xa9, 0x85, 0x42, 0x13, 0xbe, 0x5c, 0x02,
+ 0x8b, 0x46, 0x1d, 0x36, 0x78, 0x97, 0x09, 0x13, 0xbd, 0x0d, 0xc9, 0xab,
+ 0x3a, 0x64, 0x2c, 0xc2, 0x3c, 0x38, 0x6f, 0xc6, 0xdc, 0x73, 0x0d, 0xb8,
+ 0xb8, 0x9c, 0x12, 0x85, 0x07, 0x39, 0xaa, 0xbb, 0xa0, 0x69, 0x85, 0x6f,
+ 0x7d, 0x8d, 0xcb, 0x9c, 0x22, 0x34, 0xea, 0xe5, 0x53, 0x38, 0x41, 0x15,
+ 0x4e, 0xe8, 0x77, 0x30, 0xa0, 0x21, 0xfa, 0xd1, 0x89, 0xcf, 0x18, 0xdf,
+ 0xa8, 0x11, 0xbf, 0xfb, 0x5b, 0xb3, 0x90, 0xb2, 0xf7, 0x28, 0x9c, 0x69,
+ 0x86, 0x4f, 0x9e, 0xd2, 0xd2, 0x81, 0x1c, 0xaa, 0xe7, 0xc9, 0xe2, 0x1b,
+ 0xf0, 0xde, 0x04, 0x6e, 0xca, 0xda, 0x4a, 0x80, 0xb1, 0x3d, 0x14, 0x93,
+ 0x3a, 0x6f, 0x52, 0xea, 0x55, 0x1f, 0x98, 0x17, 0xfe, 0x56, 0xdf, 0x7e,
+ 0x33, 0x03, 0x96, 0x26, 0xaa, 0xf3, 0xd2, 0x70, 0xfe, 0x5f, 0xb3, 0xac,
+ 0x97, 0x9a, 0x7e, 0xef, 0xeb, 0x45, 0x23, 0x06, 0x94, 0x51, 0x33, 0x63,
+ 0x57, 0xce, 0xad, 0x81, 0xc7, 0xbc, 0xa5, 0x74, 0xfd, 0x67, 0xda, 0xe9,
+ 0x67, 0x59, 0x49, 0xd0, 0x35, 0xb1, 0x7f, 0x23, 0x27, 0x7e, 0xe4, 0xd1,
+ 0x73, 0x25, 0xac, 0x2d, 0xd4, 0x30, 0x4c, 0x0a, 0x1f, 0x13, 0x54, 0x5c,
+ 0x80, 0x7d, 0x80, 0x85, 0xd2, 0x73, 0x91, 0x08, 0x66, 0x22, 0x5a, 0x0c,
+ 0xe1, 0xbb, 0x63, 0xab, 0x6f, 0xb9, 0x49, 0xe3, 0x21, 0xaa, 0x63, 0x91,
+ 0xf5, 0x44, 0x61, 0xd1, 0x5b, 0x5f, 0xb0, 0x47, 0x6a, 0xa2, 0xff, 0xbd,
+ 0x9e, 0xe7, 0x2d, 0x09, 0x27, 0x8d, 0xc4, 0x72, 0x55, 0xa5, 0x7e, 0xea,
+ 0xc9, 0xd6, 0x0b, 0xe1, 0xc3, 0xd6, 0x90, 0x9c, 0x0a, 0x18, 0xa9, 0xfc,
+ 0x35, 0xe5, 0x49, 0xd3, 0x80, 0x16, 0x05, 0x84, 0xdf, 0x05, 0x32, 0x3b,
+ 0xd8, 0x8c, 0x65, 0xfb, 0xc7, 0xaa, 0x73, 0xeb, 0x06, 0x5b, 0x3d, 0xff,
+ 0x8e, 0xf2, 0x20, 0xe5, 0x57, 0x83, 0x7a, 0x25, 0x53, 0x08, 0xc1, 0x1f,
+ 0x4b, 0xb7, 0xa5, 0xa4, 0x20, 0x4f, 0x61, 0xf4, 0x40, 0x15, 0x53, 0xc1,
+ 0x94, 0x11, 0xe5, 0x28, 0xab, 0x52, 0x22, 0xaf, 0x3b, 0x80, 0x31, 0xe2,
+ 0x6f, 0xaa, 0xde, 0xc5, 0x86, 0xb3, 0x6e, 0xe3, 0x3b, 0x27, 0x7c, 0xb9,
+ 0x24, 0xa5, 0x71, 0x57, 0x8a, 0x56, 0x17, 0x7f, 0xd5, 0x1b, 0x7e, 0x5a,
+ 0x8d, 0x8e, 0xcd, 0xfb, 0xc2, 0x4f, 0x3f, 0x8a, 0x05, 0x1a, 0x9e, 0x84,
+ 0x31, 0x26, 0x0e, 0xe4, 0x5e, 0x3f, 0x28, 0xe8, 0x33, 0x55, 0x34, 0x58,
+ 0x7b, 0xb7, 0x21, 0x0b, 0x67, 0x90, 0xd7, 0xcd, 0xdf, 0x2b, 0x2e, 0xd5,
+ 0x50, 0x1a, 0x1b, 0x21, 0x57, 0x1e, 0x9d, 0x17, 0x48, 0x3a, 0x00, 0xf8,
+ 0xc9, 0xca, 0xf6, 0x81, 0x5d, 0x74, 0x6b, 0x8c, 0x91, 0x16, 0x87, 0xf6,
+ 0xd9, 0xca, 0x6c, 0xce, 0xb5, 0xb5, 0x49, 0x6e, 0x5d, 0xda, 0x7b, 0x53,
+ 0xff, 0x5b, 0x4b, 0x1a, 0x59, 0x61, 0x1d, 0x99, 0x2f, 0x50, 0xe1, 0x32,
+ 0x63, 0x4e, 0xd1, 0x46, 0x22, 0x41, 0x88, 0x32, 0x43, 0x97, 0xfc, 0xa2,
+ 0xcc, 0x42, 0x53, 0xbb, 0x14, 0x34, 0x42, 0x6c, 0x2d, 0x1a, 0xc0, 0xf1,
+ 0x0e, 0xe4, 0x43, 0x43, 0xe3, 0xf6, 0xf0, 0xaa, 0x0e, 0x73, 0x68, 0xe5,
+ 0x8c, 0xcd, 0xe5, 0x37, 0x39, 0x8e, 0x95, 0xab, 0x95, 0xdb, 0x4f, 0x88,
+ 0x9f, 0x4b, 0xa9, 0xae, 0x50, 0x81, 0xd6, 0x77, 0x6a, 0xb2, 0xd6, 0x24,
+ 0xd5, 0x8f, 0xc2, 0xd8, 0x65, 0x97, 0x78, 0x84, 0x30, 0x47, 0x6a, 0x53,
+ 0x1e, 0xa7, 0x27, 0x77, 0xc2, 0x94, 0x0a, 0xb3, 0x8c, 0x97, 0x16, 0x70,
+ 0xca, 0x16, 0x10, 0xf4, 0xad, 0xf7, 0x8b, 0x4f, 0x94, 0x7f, 0xb4, 0x0e,
+ 0x0a, 0x12, 0xe4, 0x08, 0x71, 0xe7, 0x3e, 0xbe, 0x10, 0xd9, 0xd1, 0xed,
+ 0x20, 0x9b, 0xee, 0xcd, 0x8d, 0xbf, 0xcb, 0x42, 0x7e, 0xc7, 0x77, 0xad,
+ 0x69, 0xa0, 0x0c, 0xfb, 0x88, 0xf4, 0x8c, 0x82, 0x50, 0xc2, 0xaf, 0xb1,
+ 0x8d, 0x5e, 0xb3, 0x3d, 0x41, 0xee, 0x4d, 0x9c, 0x36, 0x33, 0xa4, 0x4c,
+ 0x8e, 0x72, 0x85, 0xbf, 0x0d, 0x82, 0x53, 0xf3, 0x28, 0x7f, 0xd6, 0xec,
+ 0x99, 0xa8, 0xf4, 0xfe, 0xde, 0xf4, 0xde, 0xd7, 0xd6, 0xd7, 0x1c, 0x29,
+ 0x93, 0x3a, 0x6b, 0x3f, 0x70, 0x46, 0xd0, 0x20, 0x8f, 0xe4, 0xb4, 0x0f,
+ 0x57, 0xb4, 0x48, 0x97, 0xb1, 0x83, 0x2a, 0x3b, 0x61, 0x3f, 0xec, 0xdc,
+ 0x2b, 0x2d, 0xb6, 0x54, 0x6b, 0x3c, 0x86, 0xf0, 0x8d, 0xd7, 0xad, 0x44,
+ 0xc6, 0x49, 0x6f, 0xa9, 0xc4, 0x13, 0x57, 0x94, 0x86, 0xc9, 0xe2, 0x76,
+ 0xbe, 0xe6, 0xb7, 0xad, 0x24, 0xbe, 0x3d, 0xae, 0x94, 0x3e, 0x32, 0x1e,
+ 0x71, 0x72, 0xb7, 0x01, 0xcd, 0x2c, 0x9d, 0x11, 0x24, 0xb9, 0xa1, 0x9b,
+ 0x35, 0x1c, 0x0e, 0xb6, 0x8c, 0x48, 0x1f, 0x5f, 0xbe, 0xc3, 0x65, 0x88,
+ 0xa3, 0x66, 0x21, 0x1f, 0x33, 0xda, 0xf5, 0x4e, 0x30, 0x50, 0x76, 0xb6,
+ 0x77, 0x5f, 0xfb, 0xa6, 0xc4, 0xfc, 0x18, 0x92, 0xe0, 0x07, 0x98, 0x88,
+ 0xcb, 0x50, 0x19, 0x21, 0xc8, 0x3a, 0x80, 0xe5, 0xe9, 0xe9, 0x42, 0xe3,
+ 0xfc, 0x80, 0x3e, 0x61, 0xc5, 0xee, 0x5c, 0xb7, 0xd7, 0x16, 0x42, 0x4a,
+ 0xdc, 0x82, 0x91, 0x98, 0xeb, 0x06, 0xbe, 0x2c, 0xcf, 0xe6, 0x5c, 0x80,
+ 0x99, 0x24, 0x0c, 0xe2, 0xa5, 0x83, 0x6d, 0xb1, 0xc0, 0x5b, 0x2f, 0x93,
+ 0xd4, 0x91, 0x1d, 0x70, 0x15, 0x7e, 0x25, 0xdc, 0x23, 0x89, 0xfb, 0xc4,
+ 0x86, 0xcd, 0x8b, 0x46, 0x0c, 0xd9, 0x64, 0x32, 0x0a, 0x28, 0xc9, 0xeb,
+ 0xcd, 0xc4, 0xaa, 0x81, 0x1c, 0x5d, 0xb4, 0x1f, 0x07, 0xea, 0x7e, 0x0b,
+ 0xdb, 0xf6, 0xb6, 0x41, 0x68, 0x15, 0x0b, 0x3a, 0xdf, 0xbd, 0x47, 0x9f,
+ 0xee, 0x9f, 0xe9, 0x4f, 0x61, 0xa4, 0x91, 0xfd, 0x18, 0xda, 0x07, 0xec,
+ 0xd7, 0xc5, 0x36, 0x1c, 0x8a, 0xe2, 0xe5, 0x96, 0xc6, 0xe3, 0x86, 0xd2,
+ 0x9e, 0xcd, 0x16, 0x6b, 0xe4, 0x33, 0xb7, 0xff, 0xa5, 0x31, 0xf8, 0xdf,
+ 0xd0, 0xb1, 0xbe, 0xc7, 0x29, 0x09, 0xfb, 0x19, 0x86, 0xaf, 0xf4, 0xe3,
+ 0x53, 0x98, 0x33, 0x64, 0x56, 0xa2, 0x57, 0x2d, 0x06, 0x0e, 0xc4, 0xe7,
+ 0x06, 0xdd, 0x56, 0xc7, 0x2a, 0xb3, 0x09, 0xb4, 0xf0, 0x80, 0xaa, 0x3d,
+ 0xf5, 0x97, 0xc6, 0x41, 0x0d, 0x89, 0x69, 0xf8, 0x7e, 0xc4, 0xee, 0x39,
+ 0xc3, 0x9f, 0x74, 0xe4, 0x40, 0x80, 0x3c, 0xf5, 0x4d, 0x91, 0xaf, 0xc0,
+ 0xf1, 0x57, 0x2d, 0xf8, 0xa2, 0x1c, 0x21, 0xe5, 0x50, 0xaf, 0x0c, 0xa1,
+ 0xfb, 0x79, 0xa4, 0x7c, 0x46, 0x22, 0x3f, 0x72, 0xdf, 0x8f, 0x93, 0xe8,
+ 0x62, 0x1f, 0x9e, 0x11, 0x76, 0x3b, 0xeb, 0x49, 0x77, 0x7c, 0x03, 0x66,
+ 0xcf, 0x91, 0x4f, 0x02, 0x0b, 0xdf, 0x15, 0xc1, 0x1f, 0x23, 0x2e, 0x0d,
+ 0x2b, 0x73, 0xca, 0x82, 0x35, 0xdb, 0xb5, 0xe2, 0x8c, 0x1f, 0x00, 0xbc,
+ 0xec, 0xb1, 0xe4, 0x50, 0xca, 0x49, 0x81, 0x69, 0x73, 0xc1, 0x14, 0x06,
+ 0x5c, 0x65, 0xff, 0xc9, 0x22, 0x1c, 0x32, 0x12, 0xca, 0x98, 0x49, 0x0b,
+ 0xdb, 0x8f, 0xd3, 0xac, 0x43, 0x6f, 0x42, 0xdc, 0xc7, 0xa0, 0x6f, 0x53,
+ 0xd6, 0x0f, 0x9b, 0xa4, 0xf8, 0x93, 0x65, 0x2e, 0xe1, 0xf6, 0x49, 0xc5,
+ 0x47, 0x88, 0xca, 0xfd, 0xc2, 0xc7, 0x97, 0xe9, 0xef, 0x9a, 0xd3, 0xa1,
+ 0x2a, 0x9c, 0x8e, 0xbf, 0xd7, 0x17, 0x09, 0xba, 0xa7, 0x3e, 0x67, 0xa8,
+ 0x69, 0xbe, 0xc5, 0xb7, 0xc6, 0x7c, 0xe5, 0xea, 0xc2, 0x42, 0xdc, 0xcd,
+ 0x70, 0xc7, 0xab, 0xef, 0x42, 0x52, 0xe4, 0x8d, 0xd9, 0x31, 0xd4, 0x43,
+ 0xf0, 0xe5, 0x53, 0x15, 0x14, 0x2b, 0x21, 0xd0, 0x9d, 0x2a, 0xdc, 0x7a,
+ 0x81, 0x4b, 0x0b, 0x37, 0x54, 0x0f, 0x53, 0xac, 0x20, 0xb0, 0xfb, 0xaa,
+ 0x41, 0x99, 0x62, 0xae, 0xed, 0xbe, 0xeb, 0x2f, 0x70, 0x1b, 0x36, 0x75,
+ 0xbb, 0xa9, 0x18, 0x1c, 0x59, 0xa1, 0x33, 0x30, 0x7f, 0x3f, 0x56, 0x1d,
+ 0x3f, 0x88, 0x7c, 0x3f, 0xd9, 0x46, 0xa3, 0x92, 0x5c, 0x09, 0x37, 0x31,
+ 0x2e, 0xa5, 0x47, 0x65, 0xad, 0x94, 0x22, 0xcf, 0x3e, 0x8c, 0x29, 0x91,
+ 0x6f, 0xeb, 0x9e, 0xac, 0xe4, 0x93, 0x69, 0x85, 0xae, 0x6f, 0x91, 0xa9,
+ 0xa9, 0x52, 0xfd, 0xc7, 0x7e, 0x25, 0x50, 0x32, 0x98, 0x96, 0x7c, 0xb3,
+ 0x88, 0x23, 0x04, 0xbd, 0x7c, 0x34, 0x26, 0x71, 0xc0, 0xee, 0xb0, 0x5a,
+ 0xc8, 0x16, 0xc6, 0x6f, 0x32, 0x9a, 0x37, 0x8a, 0x5f, 0xf7, 0x2d, 0xed,
+ 0x73, 0xfe, 0x30, 0x84, 0x7d, 0x33, 0xc7, 0x36, 0x37, 0xec, 0xec, 0xda,
+ 0x87, 0xb8, 0x55, 0xc0, 0xd6, 0x9d, 0x95, 0x0d, 0xa6, 0x93, 0x01, 0x19,
+ 0x6f, 0x10, 0x42, 0x89, 0x36, 0x39, 0x44, 0x39, 0x27, 0x75, 0xbb, 0x89,
+ 0x31, 0x26, 0x03, 0x27, 0x2a, 0x34, 0xf5, 0x1e, 0x27, 0xaa, 0x3d, 0xfe,
+ 0x2c, 0x2b, 0x07, 0x9a, 0x7e, 0xf0, 0x4a, 0xc2, 0x46, 0xf7, 0x45, 0x53,
+ 0xb6, 0x94, 0x7d, 0x75, 0x01, 0x6f, 0xc9, 0x02, 0x3e, 0x85, 0x1f, 0x37,
+ 0x0e, 0x8e, 0xfc, 0x72, 0x2e, 0xe2, 0x69, 0x6b, 0xeb, 0x77, 0xd3, 0xf4,
+ 0xae, 0x7f, 0x77, 0xda, 0x18, 0x4f, 0x5a, 0x5d, 0xca, 0xe7, 0xd4, 0xd8,
+ 0x8e, 0x15, 0x82, 0x41, 0x3f, 0xf6, 0xa4, 0x6b, 0x8a, 0x36, 0xc4, 0xa7,
+ 0x10, 0xbd, 0xdc, 0xf9, 0xe0, 0xd9, 0x03, 0xf9, 0x41, 0x39, 0xe5, 0xad,
+ 0xb3, 0xc7, 0xa7, 0x6a, 0x37, 0x1b, 0x23, 0x54, 0xc8, 0x8d, 0x51, 0x41,
+ 0x45, 0x24, 0xe9, 0xf1, 0x94, 0xc6, 0x3e, 0xb3, 0x17, 0x6b, 0xb3, 0x9b,
+ 0xbf, 0xd3, 0x62, 0xed, 0x36, 0x4e, 0x00, 0x88, 0x6c, 0x7b, 0xf0, 0xce,
+ 0x90, 0x4f, 0x0b, 0xa6, 0xb3, 0xa5, 0x66, 0x2d, 0x90, 0x61, 0x21, 0x86,
+ 0x02, 0xf4, 0x0c, 0x80, 0xb4, 0xbc, 0x2b, 0xb9, 0xd1, 0x20, 0x53, 0xd3,
+ 0x24, 0x1f, 0x0f, 0xac, 0x75, 0x92, 0x1b, 0x2b, 0x72, 0x95, 0x57, 0xbb,
+ 0xa6, 0xaa, 0xf5, 0x49, 0xbc, 0xdd, 0x87, 0x36, 0x36, 0xa3, 0xec, 0x0e,
+ 0x23, 0x94, 0x96, 0xcb, 0x10, 0x00, 0xc1, 0x6b, 0x6b, 0xd2, 0x8a, 0x07,
+ 0x66, 0x81, 0xfc, 0x5d, 0xe7, 0x40, 0xfc, 0x54, 0x96, 0x4d, 0x4c, 0x5a,
+ 0xcb, 0x68, 0x91, 0xbf, 0xe9, 0xb1, 0x18, 0x05, 0xb9, 0xeb, 0x1e, 0x9d,
+ 0xc6, 0xcb, 0xe1, 0xcf, 0x82, 0x84, 0xae, 0x39, 0x45, 0x2f, 0x99, 0x7d,
+ 0xcb, 0x78, 0xa0, 0xff, 0x35, 0x6d, 0xee, 0x4a, 0xc5, 0x63, 0x18, 0xad,
+ 0x62, 0xd3, 0xa6, 0xc6, 0x8b, 0x48, 0x65, 0x2d, 0x06, 0x18, 0xe1, 0x3e,
+ 0xe8, 0x5c, 0x18, 0x7f, 0x20, 0x1e, 0x0a, 0xdb, 0xce, 0x56, 0x78, 0x7b,
+ 0x6d, 0x23, 0xc8, 0xae, 0x66, 0x10, 0xb2, 0x8f, 0xd3, 0x33, 0x5d, 0x2c,
+ 0x29, 0x65, 0xa9, 0xac, 0xa9, 0x05, 0xbd, 0x3c, 0xa9, 0xd7, 0xea, 0xe9,
+ 0x81, 0x6d, 0x5c, 0x7e, 0x9d, 0x70, 0x85, 0x1a, 0xb2, 0x13, 0x5f, 0x34,
+ 0x74, 0xb2, 0x05, 0x78, 0x51, 0xd0, 0x72, 0x51, 0x20, 0x8b, 0x90, 0xec,
+ 0xaa, 0xfa, 0x2e, 0xf1, 0x6f, 0xf9, 0x25, 0x8e, 0xe4, 0x5c, 0x5a, 0x0c,
+ 0x0d, 0xba, 0x26, 0x69, 0x56, 0xf5, 0x94, 0x4a, 0x22, 0x54, 0x77, 0xd4,
+ 0xbe, 0x8e, 0xb7, 0xda, 0xee, 0x1d, 0x97, 0x06, 0xb0, 0xe4, 0xed, 0x17,
+ 0x34, 0x93, 0x2d, 0x4d, 0xbe, 0x4d, 0xf2, 0x98, 0x3f, 0x67, 0x61, 0xe1,
+ 0x6e, 0x70, 0xb6, 0x28, 0x7e, 0x84, 0x38, 0x0c, 0xc6, 0x28, 0x45, 0x8f,
+ 0x22, 0xe9, 0x4d, 0xb5, 0xf7, 0x61, 0xfd, 0x97, 0xf4, 0xcc, 0xa9, 0x38,
+ 0x85, 0x06, 0xb7, 0x7e, 0x13, 0xbb, 0x0d, 0x16, 0x4c, 0x33, 0x96, 0x79,
+ 0x89, 0x5b, 0x5f, 0x44, 0xea, 0xfe, 0xc6, 0xce, 0xb8, 0xd7, 0xe7, 0x75,
+ 0xc7, 0xcd, 0x84, 0x59, 0x8b, 0xf9, 0x1f, 0xf0, 0x65, 0x3a, 0x74, 0x26,
+ 0x5e, 0xc1, 0xde, 0xa5, 0x1c, 0x1c, 0x4f, 0xa3, 0x24, 0x3d, 0x09, 0xb7,
+ 0x43, 0xc0, 0x31, 0x0d, 0x89, 0x62, 0x63, 0xf8, 0x14, 0x9f, 0x28, 0x24,
+ 0xf0, 0x2b, 0xae, 0x26, 0x45, 0xc1, 0xd3, 0x95, 0x48, 0xc8, 0x0e, 0x3d,
+ 0xac, 0xf0, 0x24, 0x8c, 0x48, 0x7c, 0xe8, 0x1a, 0x54, 0x3c, 0xbf, 0xf7,
+ 0xb0, 0xd7, 0x4a, 0x9a, 0x95, 0xe0, 0x28, 0xa0, 0x46, 0x07, 0x3d, 0x90,
+ 0xcd, 0x08, 0x80, 0x16, 0x3c, 0x4d, 0x6d, 0x17, 0x56, 0xe8, 0xb4, 0x6c,
+ 0x14, 0x7c, 0x73, 0x56, 0xaf, 0xef, 0xef, 0xae, 0xe4, 0x88, 0x55, 0xe3,
+ 0x53, 0x64, 0x25, 0x2c, 0x03, 0x28, 0x4e, 0x7c, 0xb5, 0x4d, 0x32, 0xb1,
+ 0xd8, 0x1f, 0x2a, 0x3b, 0xe4, 0x35, 0x82, 0x68, 0x06, 0x99, 0xf9, 0x07,
+ 0x56, 0x0d, 0xdb, 0x0d, 0x98, 0x13, 0x89, 0xd3, 0xee, 0xc2, 0x94, 0x4a,
+ 0xfb, 0x58, 0xf5, 0x12, 0x28, 0xe7, 0x2b, 0x67, 0x3b, 0xe0, 0x41, 0xe8,
+ 0x7d, 0xe7, 0xba, 0x54, 0xa2, 0x0a, 0xa8, 0x6c, 0x07, 0x8e, 0x66, 0x6c,
+ 0x64, 0xfd, 0x96, 0x15, 0x0f, 0xd7, 0x58, 0x38, 0xc4, 0xcb, 0x0c, 0xec,
+ 0x98, 0xec, 0x85, 0x26, 0x33, 0x66, 0xe6, 0xd6, 0xd7, 0xd1, 0xc4, 0xcf,
+ 0xe5, 0xcd, 0x20, 0xf2, 0x1b, 0x11, 0x90, 0x22, 0x46, 0x67, 0x47, 0x68,
+ 0xc4, 0xda, 0x47, 0xe0, 0x27, 0x09, 0x9e, 0x2d, 0x06, 0xa3, 0x98, 0xf9,
+ 0xd4, 0xde, 0x3e, 0xaf, 0xee, 0x1b, 0x9b, 0x3d, 0x05, 0xb0, 0x13, 0xa5,
+ 0xe9, 0xf7, 0xcf, 0x0f, 0xc2, 0x28, 0xa1, 0xac, 0xa1, 0xfc, 0x7b, 0xa3,
+ 0x6b, 0xee, 0x3b, 0xfc, 0xf0, 0xd1, 0xb3, 0x05, 0x59, 0xc0, 0x21, 0xc1,
+ 0x84, 0x24, 0x71, 0x55, 0x7e, 0x78, 0x0c, 0x12, 0x0f, 0x8a, 0xcb, 0x86,
+ 0xa6, 0x81, 0xba, 0xd0, 0xc7, 0x34, 0xb2, 0x69, 0x60, 0xb0, 0x50, 0x42,
+ 0xea, 0x46, 0xb7, 0x51, 0x5d, 0x69, 0x53, 0x65, 0xe5, 0xd9, 0x1c, 0x6d,
+ 0x61, 0xb4, 0x8e, 0x27, 0x5b, 0x46, 0xb1, 0x4c, 0x9d, 0xf8, 0x41, 0x7d,
+ 0x0e, 0xfa, 0x56, 0x5d, 0xfb, 0xfa, 0x9a, 0x1d, 0xd3, 0x2a, 0x6e, 0x13,
+ 0xa0, 0x4a, 0x61, 0x70, 0x94, 0xc2, 0x69, 0x91, 0xfd, 0x2b, 0x67, 0x55,
+ 0x7a, 0x5a, 0x10, 0xff, 0x06, 0xbb, 0xcf, 0x71, 0x75, 0x61, 0x38, 0xfa,
+ 0x57, 0xdb, 0x2a, 0xc0, 0xd3, 0x53, 0x2b, 0x46, 0x14, 0x60, 0x7e, 0xa4,
+ 0x19, 0x5f, 0xd8, 0xe5, 0x36, 0x27, 0xa8, 0x80, 0xbb, 0x86, 0x18, 0x4c,
+ 0xbe, 0x54, 0xfe, 0xb0, 0x10, 0x79, 0xd3, 0x09, 0x1a, 0xe3, 0xdf, 0xee,
+ 0x4d, 0x96, 0xab, 0x0f, 0x8a, 0xf9, 0x1a, 0x5b, 0x06, 0x8e, 0x52, 0xca,
+ 0x90, 0xa1, 0x8b, 0x62, 0xc0, 0x2d, 0xe5, 0x2c, 0x6d, 0x69, 0x13, 0xbb,
+ 0x86, 0x2e, 0xb3, 0xb2, 0x06, 0x14, 0x52, 0x04, 0x72, 0x67, 0x55, 0x1c,
+ 0xf1, 0x6a, 0xdf, 0x3d, 0xe2, 0xfb, 0xf1, 0x43, 0xef, 0x22, 0xc9, 0x5e,
+ 0xd3, 0x14, 0x09, 0x5a, 0x2e, 0x0c, 0xb6, 0x89, 0x05, 0xda, 0xf0, 0x3a,
+ 0x0f, 0xed, 0x51, 0x65, 0x86, 0x12, 0x68, 0xd3, 0xa3, 0xfb, 0x14, 0x6d,
+ 0x59, 0x07, 0xeb, 0xa2, 0xd8, 0x86, 0xef, 0x04, 0xe1, 0xbe, 0xeb, 0xff,
+ 0xb9, 0x76, 0xaf, 0x90, 0x6a, 0x9e, 0xbb, 0x5d, 0xef, 0x57, 0x1b, 0x7e,
+ 0xc0, 0xe8, 0x13, 0x30, 0xc9, 0xad, 0x83, 0x16, 0x2c, 0x2d, 0x98, 0x6d,
+ 0x4d, 0x8e, 0x92, 0x88, 0x42, 0x56, 0xce, 0x16, 0xfb, 0x06, 0x00, 0x53,
+ 0xb5, 0x03, 0xbe, 0x0f, 0xf4, 0xfd, 0x11, 0xf2, 0x73, 0xb7, 0xae, 0xea,
+ 0xfc, 0x1f, 0xea, 0xbf, 0x19, 0xee, 0xa0, 0xc7, 0x0d, 0x4e, 0x1e, 0xc1,
+ 0xa4, 0x83, 0xef, 0xdd, 0xb8, 0x1d, 0x23, 0x18, 0x99, 0xb2, 0x13, 0xa9,
+ 0xe6, 0x31, 0x4c, 0xc1, 0x28, 0x4a, 0xb8, 0xc9, 0x30, 0xab, 0xe9, 0xd1,
+ 0x49, 0x58, 0x3b, 0x4f, 0x7f, 0x9c, 0x58, 0x3a, 0x34, 0xc3, 0x12, 0x17,
+ 0x99, 0x4f, 0x81, 0x97, 0x74, 0xaf, 0x71, 0x3c, 0x1a, 0xe3, 0x26, 0x48,
+ 0xb5, 0x05, 0x5e, 0x8e, 0xa8, 0xe9, 0x81, 0xb7, 0x96, 0xec, 0x16, 0xa5,
+ 0x37, 0x07, 0xe1, 0xa7, 0x8e, 0xb7, 0x61, 0xe0, 0xb9, 0xf4, 0xf3, 0x55,
+ 0x4d, 0xc2, 0xc8, 0xb5, 0xe7, 0x8c, 0x85, 0x7a, 0x92, 0x6f, 0x39, 0x1c,
+ 0x17, 0x8b, 0x1f, 0xcc, 0x05, 0x9b, 0x6c, 0x04, 0xda, 0x54, 0x61, 0xb9,
+ 0x41, 0x87, 0x27, 0x38, 0x50, 0x35, 0xa6, 0x8e, 0x3b, 0x66, 0x5c, 0xd8,
+ 0x4a, 0xcd, 0x05, 0x28, 0xb3, 0x29, 0xa5, 0x84, 0xad, 0x8b, 0xea, 0x21,
+ 0x94, 0x04, 0xe9, 0x97, 0x2d, 0x98, 0x44, 0x4b, 0xa9, 0x53, 0x4f, 0xb9,
+ 0x0e, 0x99, 0x50, 0xb4, 0x35, 0xc8, 0x10, 0x6b, 0x4f, 0xcd, 0xa7, 0x4a,
+ 0x69, 0xf2, 0xd0, 0x09, 0x36, 0x20, 0x57, 0xe5, 0xe7, 0x4a, 0x39, 0x6e,
+ 0x73, 0xf1, 0x9b, 0xc7, 0x59, 0x6b, 0x47, 0x73, 0xb9, 0xcc, 0xa2, 0x81,
+ 0x5e, 0x08, 0xd6, 0x18, 0xfe, 0x5c, 0x16, 0x4f, 0x08, 0xac, 0xd3, 0x5b,
+ 0xe0, 0x41, 0x64, 0x8a, 0x06, 0xd4, 0x84, 0xe8, 0x72, 0xe7, 0x07, 0xde,
+ 0xed, 0x69, 0x88, 0xb3, 0xba, 0x04, 0x54, 0x5a, 0xec, 0x1d, 0x04, 0x97,
+ 0xca, 0x27, 0x7e, 0x2c, 0x5a, 0x25, 0xa3, 0xec, 0x01, 0x18, 0xfb, 0x60,
+ 0x34, 0xbf, 0xdd, 0xfd, 0xa6, 0xfa, 0xe6, 0x47, 0xfe, 0x07, 0x2c, 0x20,
+ 0x0e, 0x1c, 0x1c, 0x68, 0xe4, 0x03, 0x08, 0x37, 0xd6, 0xd4, 0x37, 0x12,
+ 0x02, 0xf8, 0x66, 0xff, 0x61, 0x59, 0x07, 0x7b, 0xac, 0x92, 0x01, 0x28,
+ 0x3c, 0xa1, 0x66, 0x8e, 0x05, 0xbb, 0x79, 0x5a, 0xfb, 0x89, 0xff, 0x13,
+ 0x24, 0x1c, 0xf9, 0x32, 0x36, 0x18, 0x50, 0xa2, 0xa6, 0x37, 0x90, 0x19,
+ 0x02, 0x8b, 0xa1, 0x1a, 0x34, 0xd3, 0x10, 0xef, 0xf2, 0xa2, 0xe3, 0x96,
+ 0x19, 0xbe, 0x8c, 0xb0, 0xba, 0xe8, 0xd5, 0xf1, 0x2e, 0xf0, 0x52, 0x83,
+ 0xc5, 0xe8, 0x56, 0xca, 0xae, 0x41, 0x0f, 0x0a, 0x58, 0x3e, 0xa1, 0x58,
+ 0x39, 0xb2, 0x05, 0x23, 0x46, 0x2e, 0xb2, 0xb2, 0x7c, 0x43, 0xda, 0x28,
+ 0x49, 0x7b, 0x96, 0xe9, 0xdd, 0x26, 0x0e, 0x6e, 0x8c, 0xd6, 0x3c, 0xbc,
+ 0xd8, 0xdd, 0x63, 0xe6, 0x2e, 0x84, 0x8f, 0x65, 0xa3, 0x13, 0x60, 0xf7,
+ 0x9c, 0xbc, 0x81, 0xfa, 0xa4, 0x74, 0x49, 0x5f, 0xb4, 0x27, 0xf2, 0x45,
+ 0x20, 0xe4, 0x60, 0xc3, 0xa0, 0xa2, 0x75, 0xf4, 0xfd, 0x53, 0x45, 0xdb,
+ 0x0f, 0x4b, 0xb4, 0x87, 0x7e, 0xea, 0xea, 0x32, 0x9e, 0x10, 0x1d, 0xfe,
+ 0x23, 0x99, 0xee, 0xd8, 0x96, 0x6b, 0x79, 0x49, 0x4d, 0xfa, 0x31, 0x63,
+ 0xcb, 0xe1, 0x80, 0xe1, 0xab, 0x20, 0x68, 0x1b, 0x00, 0x41, 0x96, 0x2f,
+ 0xce, 0x82, 0xf1, 0x30, 0x6e, 0xfe, 0x5b, 0xea, 0x83, 0x1c, 0x63, 0x3a,
+ 0xcd, 0x87, 0xca, 0xb3, 0xf3, 0xc8, 0x0b, 0x8f, 0x1c, 0x1b, 0x3d, 0xfa,
+ 0xfd, 0x1f, 0xf2, 0x01, 0x4a, 0x48, 0x74, 0x5a, 0xba, 0x86, 0x75, 0xfa,
+ 0xff, 0x14, 0xe1, 0xf7, 0xad, 0x8e, 0x4f, 0xe7, 0x27, 0x62, 0x1b, 0x05,
+ 0x40, 0x7f, 0x41, 0x37, 0xcd, 0x9e, 0x18, 0x3b, 0x0e, 0xf6, 0x56, 0xcf,
+ 0xf2, 0x5f, 0x72, 0x5f, 0xfb, 0x8a, 0x1a, 0x96, 0x2c, 0x7f, 0x23, 0xe4,
+ 0xe7, 0xef, 0x33, 0x66, 0xeb, 0xf6, 0x72, 0x65, 0x81, 0x84, 0x90, 0x48,
+ 0xe3, 0xab, 0x09, 0x2a, 0xe1, 0xec, 0xfd, 0x9b, 0x72, 0x95, 0x09, 0xa4,
+ 0x8a, 0x36, 0x1f, 0x18, 0x9c, 0x02, 0x06, 0x98, 0x57, 0xe8, 0xe2, 0xe6,
+ 0xf9, 0x9b, 0xe2, 0x4a, 0x0a, 0x1f, 0x2c, 0xb2, 0x08, 0x6a, 0xda, 0x71,
+ 0x46, 0xdc, 0xcf, 0x65, 0x59, 0xeb, 0x03, 0x14, 0x1c, 0x43, 0x94, 0xa1,
+ 0x3c, 0xe6, 0xee, 0x80, 0x00, 0x9d, 0x7e, 0x9b, 0x6e, 0xac, 0x2f, 0x75,
+ 0x27, 0x75, 0x8f, 0xc7, 0xc4, 0x98, 0xa4, 0xf0, 0x84, 0x7b, 0xc1, 0x3f,
+ 0xf8, 0x89, 0x18, 0xb5, 0x60, 0x2f, 0x16, 0x68, 0x43, 0x87, 0x9d, 0xd7,
+ 0xd2, 0xb0, 0xb2, 0x6d, 0xac, 0xef, 0xdc, 0xcd, 0x0d, 0xa9, 0x73, 0x24,
+ 0x69, 0xcd, 0xbc, 0x77, 0x97, 0x83, 0xa6, 0x52, 0x83, 0x2a, 0x5f, 0xd7,
+ 0xc2, 0x4f, 0x9a, 0xbb, 0x7a, 0x09, 0xa4, 0xd2, 0x64, 0xc2, 0xc6, 0x18,
+ 0xda, 0xd8, 0x20, 0x72, 0xe5, 0x60, 0x92, 0xa5, 0x97, 0x22, 0x63, 0xf5,
+ 0xa8, 0xf1, 0x9f, 0xb2, 0x52, 0x4f, 0x2c, 0x63, 0xee, 0x9b, 0xa3, 0x5f,
+ 0xf9, 0x3f, 0x83, 0xb0, 0x71, 0x0c, 0xb2, 0x07, 0x7f, 0xb6, 0xf8, 0x8f,
+ 0x35, 0xf1, 0xaa, 0x90, 0x4e, 0xcc, 0x52, 0x0b, 0xc7, 0xbe, 0x29, 0xa1,
+ 0xa7, 0xd9, 0xce, 0x50, 0x80, 0x5a, 0x2c, 0xf9, 0x41, 0x93, 0x04, 0x56,
+ 0xad, 0xd0, 0x50, 0xe1, 0x23, 0x84, 0x3d, 0xc8, 0xba, 0xbd, 0xb3, 0x3b,
+ 0x2f, 0xe1, 0x1c, 0xf3, 0xe5, 0x73, 0x3c, 0x51, 0x0b, 0x61, 0xa6, 0x48,
+ 0x1f, 0xcc, 0xd1, 0x96, 0xb6, 0xce, 0x35, 0x22, 0x67, 0x58, 0xf5, 0x58,
+ 0x41, 0x75, 0xf4, 0xf0, 0xe8, 0x35, 0x77, 0xb9, 0x84, 0x82, 0xc6, 0xe1,
+ 0x8a, 0x83, 0xe6, 0x26, 0xe6, 0x30, 0xed, 0x27, 0xf6, 0xaa, 0x91, 0xb6,
+ 0x71, 0x36, 0x54, 0x47, 0xf4, 0x9b, 0xe1, 0xcb, 0x8e, 0xb1, 0xc7, 0x07,
+ 0x92, 0x33, 0x04, 0x87, 0x7e, 0xf2, 0x10, 0xfb, 0x56, 0x8b, 0x22, 0xce,
+ 0xd0, 0x78, 0x85, 0x7b, 0x41, 0xb5, 0x9e, 0x56, 0x26, 0x3e, 0x11, 0x20,
+ 0x38, 0xec, 0xe7, 0x48, 0x37, 0x04, 0xb5, 0x2b, 0x28, 0x1b, 0x26, 0x6f,
+ 0xc6, 0xb5, 0x65, 0x8b, 0x0a, 0x5d, 0x64, 0x44, 0x1c, 0xb9, 0x07, 0x8a,
+ 0x38, 0xa9, 0x20, 0x86, 0x06, 0xdf, 0x1b, 0xee, 0x50, 0xf5, 0x27, 0x85,
+ 0x5d, 0xb8, 0x19, 0x6f, 0xf7, 0xbc, 0x31, 0x27, 0xa6, 0xe9, 0x05, 0xbc,
+ 0x98, 0x35, 0x0b, 0xc5, 0x95, 0x8f, 0x81, 0x21, 0x51, 0xfa, 0xcc, 0xc7,
+ 0xf8, 0xaa, 0x0a, 0x95, 0xae, 0x77, 0x71, 0x0e, 0xa1, 0x70, 0x0e, 0x40,
+ 0x65, 0x0f, 0x90, 0x26, 0x3a, 0xb2, 0x3d, 0x20, 0xeb, 0x0a, 0x8b, 0x0d,
+ 0xc5, 0x1e, 0xfa, 0x78, 0x6e, 0xfe, 0x20, 0x7d, 0xd9, 0x46, 0xc1, 0xee,
+ 0x44, 0x9d, 0x11, 0xd2, 0xd7, 0xa9, 0xc3, 0xa8, 0x9f, 0x59, 0x08, 0x84,
+ 0x9e, 0x77, 0xc4, 0x7d, 0x11, 0x89, 0x4b, 0x75, 0xc0, 0xf7, 0x79, 0xe0,
+ 0xbd, 0x7e, 0xb3, 0xcf, 0x31, 0x2d, 0x50, 0xd3, 0xaf, 0xc1, 0xcc, 0x5b,
+ 0xf2, 0x5a, 0x31, 0x63, 0xf4, 0x5f, 0x01, 0x49, 0x5b, 0xa1, 0x7e, 0x3c,
+ 0x53, 0xc3, 0xf3, 0x42, 0x2d, 0x1e, 0xe0, 0x16, 0x52, 0xdc, 0xff, 0x6b,
+ 0xe0, 0x3d, 0xa5, 0x82, 0x44, 0x0f, 0x76, 0x5b, 0xb6, 0xe5, 0xda, 0x75,
+ 0x1f, 0xf8, 0xbe, 0xd6, 0xb2, 0xe9, 0xb7, 0xd2, 0x99, 0x35, 0xf2, 0x2d,
+ 0xc7, 0xcb, 0xf9, 0x3a, 0x41, 0xcb, 0x11, 0x8e, 0x23, 0x7e, 0xe5, 0xbc,
+ 0xff, 0x4a, 0xa7, 0xc5, 0xbc, 0x2d, 0x22, 0x8b, 0xd2, 0xb4, 0x2f, 0xdf,
+ 0x6b, 0x52, 0x42, 0x3e, 0xbf, 0x6e, 0x39, 0x9c, 0xc2, 0xa9, 0x7b, 0x8c,
+ 0xba, 0xd2, 0x73, 0x0d, 0x4b, 0x5e, 0x16, 0x41, 0xd6, 0x21, 0x81, 0x49,
+ 0x72, 0x78, 0x52, 0x61, 0xad, 0x96, 0x28, 0x23, 0x9c, 0xce, 0xdc, 0x6c,
+ 0x4d, 0xa3, 0xed, 0x2c, 0x40, 0x3c, 0xf1, 0xe2, 0x77, 0x21, 0x69, 0x35,
+ 0xab, 0xe8, 0x2b, 0x48, 0x0d, 0xd3, 0x83, 0x14, 0xbe, 0x3b, 0x0c, 0x36,
+ 0xc8, 0x77, 0x56, 0x35, 0xfd, 0x95, 0x40, 0xe9, 0xfb, 0xfa, 0x6c, 0xd9,
+ 0x2d, 0xf4, 0x78, 0x09, 0x18, 0x24, 0x0d, 0xe7, 0xee, 0xff, 0x5d, 0x68,
+ 0x12, 0x72, 0x79, 0xa8, 0x2f, 0xee, 0x9e, 0x68, 0x9c, 0xf7, 0x6d, 0x07,
+ 0xbf, 0xfb, 0xe2, 0xe0, 0x09, 0x49, 0xac, 0x41, 0x1f, 0x6b, 0xfd, 0x3c,
+ 0xef, 0x83, 0x9d, 0x6d, 0x8a, 0x97, 0xef, 0x3b, 0xc1, 0xb2, 0xfa, 0x3f,
+ 0x17, 0x14, 0x3d, 0xad, 0x33, 0x3e, 0x83, 0xda, 0xd2, 0x14, 0x8a, 0xd7,
+ 0x56, 0x40, 0xaf, 0x71, 0x07, 0xc7, 0xf4, 0x8b, 0xcb, 0x05, 0x11, 0x03,
+ 0x9d, 0x59, 0x83, 0x04, 0xac, 0x80, 0x71, 0xa2, 0x75, 0x0b, 0xee, 0x7f,
+ 0xd2, 0x6f, 0xb7, 0x3b, 0xa5, 0xbb, 0xad, 0x46, 0x43, 0x8f, 0x6d, 0x23,
+ 0x97, 0x39, 0xd6, 0x32, 0x65, 0xe7, 0x6e, 0x1c, 0x68, 0x77, 0xc4, 0x62,
+ 0x25, 0xfb, 0xed, 0xcd, 0x3e, 0x9d, 0xd7, 0xa5, 0x72, 0xfb, 0xad, 0x29,
+ 0x30, 0xd7, 0x13, 0xda, 0x75, 0x57, 0x00, 0x58, 0x4b, 0xab, 0x8c, 0xec,
+ 0xf1, 0x17, 0x49, 0x4e, 0x5b, 0x10, 0x61, 0x5e, 0x5f, 0x17, 0x6a, 0x86,
+ 0xa8, 0xae, 0x52, 0xa8, 0x1b, 0x9d, 0x15, 0x9f, 0xe3, 0x16, 0xa3, 0x38,
+ 0xec, 0x8a, 0x6b, 0xfd, 0x22, 0x9d, 0x9e, 0xf5, 0xf4, 0x6e, 0xca, 0xd8,
+ 0xc6, 0xd9, 0xe2, 0x2f, 0xbb, 0x69, 0x6f, 0x04, 0x86, 0xe7, 0xeb, 0xae,
+ 0xf6, 0xa4, 0x57, 0xd7, 0x24, 0xc4, 0xbb, 0xdb, 0x81, 0x91, 0xa2, 0x7c,
+ 0x80, 0x6d, 0xb9, 0x8b, 0x13, 0xaa, 0xb6, 0x10, 0xd7, 0x33, 0x8d, 0xb7,
+ 0x3b, 0xd1, 0x80, 0xa6, 0x2a, 0x18, 0x52, 0xd8, 0x75, 0x84, 0x18, 0x66,
+ 0x1c, 0x7a, 0xc4, 0x80, 0x23, 0x0d, 0x04, 0x33, 0x77, 0xb3, 0x99, 0x12,
+ 0x33, 0x26, 0x9e, 0xeb, 0xcf, 0xb8, 0xb1, 0x5f, 0xbb, 0x43, 0xc2, 0x2f,
+ 0xdf, 0xf8, 0x7b, 0x8f, 0x6d, 0x23, 0xc1, 0x58, 0x86, 0xde, 0x30, 0xba,
+ 0x32, 0x36, 0x39, 0xe5, 0xc3, 0x48, 0xd9, 0xa7, 0x56, 0x4c, 0x49, 0xb1,
+ 0x96, 0xdf, 0xe0, 0x6b, 0xf0, 0xa8, 0x9e, 0x02, 0xc4, 0x9a, 0x9b, 0x5e,
+ 0xcd, 0x10, 0xc1, 0x68, 0x8b, 0xac, 0x65, 0xf6, 0x7e, 0xc8, 0xf3, 0x23,
+ 0x27, 0x82, 0xbd, 0xd8, 0xfa, 0x16, 0x4d, 0xd9, 0xf7, 0xc1, 0x01, 0x8a,
+ 0x24, 0xce, 0x56, 0xb5, 0x4e, 0xf2, 0xb4, 0xe1, 0x5e, 0x25, 0x18, 0x3b,
+ 0x22, 0x6a, 0xba, 0x63, 0xa9, 0x19, 0xae, 0xee, 0x6d, 0x33, 0xba, 0x78,
+ 0x3e, 0xbe, 0x4b, 0x24, 0x0e, 0x7e, 0x98, 0x8f, 0xe3, 0xd1, 0x6a, 0xe4,
+ 0x4c, 0x87, 0xb0, 0xdc, 0x71, 0x06, 0x5d, 0xd2, 0x37, 0x99, 0xa1, 0x63,
+ 0xc3, 0x4f, 0x96, 0x0a, 0xba, 0x3e, 0xdf, 0x6f, 0xf8, 0x9c, 0x3c, 0xb4,
+ 0x02, 0xeb, 0x68, 0xb3, 0xf1, 0x01, 0x0e, 0xbe, 0x92, 0x3e, 0xb9, 0x6d,
+ 0x68, 0x3d, 0x6b, 0x68, 0x57, 0x43, 0x7c, 0x52, 0xc6, 0xed, 0x4a, 0xc2,
+ 0xb4, 0x5f, 0x54, 0x5a, 0x2a, 0xc7, 0xc6, 0x96, 0x4e, 0x54, 0xed, 0x04,
+ 0xe6, 0xc1, 0x55, 0xac, 0xcd, 0x4b, 0xeb, 0x20, 0x24, 0xc0, 0xf7, 0x99,
+ 0x49, 0xd3, 0xa6, 0xc6, 0x32, 0xc6, 0x60, 0x7c, 0xd3, 0x36, 0x2b, 0xfa,
+ 0x62, 0xac, 0xd4, 0xa2, 0xc2, 0x29, 0xef, 0x26, 0x59, 0x6c, 0x05, 0x92,
+ 0x6e, 0xc6, 0x0b, 0xe3, 0x12, 0x0f, 0x5c, 0xef, 0x19, 0x32, 0xde, 0xd1,
+ 0x5e, 0x0b, 0x90, 0xa4, 0x88, 0xc9, 0xa5, 0x94, 0x58, 0xd2, 0xe2, 0xf1,
+ 0xe5, 0x4c, 0xfe, 0x8c, 0x01, 0x7b, 0x5d, 0xcb, 0x2e, 0xc3, 0x26, 0xe5,
+ 0xf3, 0x38, 0xf0, 0xfa, 0x2c, 0x1b, 0xd9, 0x2c, 0x41, 0x2f, 0x8c, 0x5f,
+ 0xc1, 0x42, 0x4c, 0x8a, 0x1e, 0x33, 0xda, 0x02, 0xb9, 0xc7, 0xb7, 0x82,
+ 0xcc, 0x3d, 0x68, 0x63, 0xde, 0xf5, 0x64, 0x05, 0xe2, 0x2a, 0xc3, 0x92,
+ 0xc9, 0x7b, 0x09, 0x56, 0x20, 0x21, 0x88, 0xb6, 0xa1, 0x25, 0x6e, 0x9a,
+ 0x89, 0x06, 0x88, 0xe7, 0x2d, 0x64, 0xb6, 0x31, 0x8a, 0x3c, 0xa0, 0x47,
+ 0xeb, 0x48, 0x30, 0xba, 0xe5, 0xd7, 0xb9, 0xce, 0x43, 0xe0, 0x6c, 0xbe,
+ 0x77, 0x4e, 0x35, 0xb6, 0x01, 0xaf, 0xf4, 0x42, 0xb7, 0xa8, 0x85, 0x7d,
+ 0xb2, 0xa4, 0x05, 0x6a, 0x30, 0x3f, 0x30, 0x75, 0xa9, 0x4e, 0xab, 0x9d,
+ 0x15, 0x98, 0x98, 0xf8, 0x53, 0x81, 0xbd, 0x0b, 0x5d, 0x75, 0x79, 0x56,
+ 0xd5, 0xd4, 0xab, 0x72, 0x1d, 0x33, 0x3c, 0x7b, 0x9b, 0x2c, 0x47, 0xeb,
+ 0xe6, 0x3f, 0xdd, 0x84, 0x5a, 0x67, 0x6d, 0x35, 0x91, 0x33, 0xb3, 0x48,
+ 0x9f, 0x92, 0x9b, 0x28, 0xdb, 0x36, 0xd6, 0x68, 0x47, 0x8c, 0xce, 0xe7,
+ 0x2e, 0x1c, 0x45, 0x36, 0xca, 0xf0, 0x91, 0xce, 0x3b, 0x48, 0x14, 0xc9,
+ 0xd7, 0x89, 0x74, 0x3b, 0xdb, 0xca, 0x57, 0x2d, 0x8a, 0xc0, 0xe8, 0xc7,
+ 0xb4, 0xad, 0xce, 0xa2, 0x5d, 0xa7, 0xe7, 0x20, 0x67, 0x62, 0x7a, 0xfd,
+ 0x5e, 0xc4, 0x2e, 0xd1, 0xab, 0x8d, 0xb5, 0xa1, 0x22, 0x83, 0x1f, 0x20,
+ 0xed, 0xb0, 0xe9, 0xaa, 0x3d, 0x57, 0x0c, 0xe0, 0xfa, 0x8a, 0x2e, 0x25,
+ 0xe9, 0xab, 0x0f, 0xe6, 0x7d, 0xe5, 0x3a, 0x69, 0x34, 0xab, 0xd6, 0x84,
+ 0x57, 0xac, 0x9c, 0x24, 0xc3, 0x77, 0x18, 0x50, 0xd1, 0x02, 0x99, 0x43,
+ 0x8d, 0x0c, 0x01, 0xcd, 0x24, 0x57, 0x62, 0xa1, 0x73, 0x27, 0x3a, 0x08,
+ 0xbd, 0x61, 0x51, 0x03, 0xaf, 0xb4, 0xc3, 0x6e, 0x0a, 0x59, 0x2f, 0x98,
+ 0x64, 0x05, 0x68, 0x5a, 0x9f, 0xb4, 0xa5, 0x02, 0xaf, 0x8f, 0xa3, 0xa7,
+ 0xbb, 0x27, 0x6c, 0x04, 0xa5, 0x05, 0xcd, 0x1f, 0x15, 0x43, 0xec, 0x08,
+ 0x57, 0x96, 0x4b, 0xfa, 0x3a, 0x3c, 0x80, 0xce, 0xab, 0xf5, 0x4e, 0x6c,
+ 0xa8, 0x19, 0x8a, 0xef, 0x50, 0x2a, 0xdf, 0x54, 0x8f, 0xc8, 0x95, 0x4b,
+ 0xa1, 0x8d, 0x97, 0x97, 0xdd, 0x89, 0x31, 0x29, 0xed, 0x5f, 0xa0, 0xb7,
+ 0xfe, 0xae, 0xb7, 0xbb, 0x4e, 0xee, 0xee, 0xd3, 0xe9, 0xcb, 0x4f, 0x4c,
+ 0x63, 0x47, 0x19, 0xff, 0xdf, 0xc2, 0x38, 0x61, 0x80, 0xa5, 0x68, 0x8f,
+ 0xdd, 0xa3, 0x2f, 0x6d, 0x56, 0xc9, 0x30, 0x7a, 0x98, 0xc0, 0xc2, 0xe8,
+ 0xb1, 0xb2, 0x13, 0x89, 0x86, 0x56, 0x65, 0xe7, 0xb5, 0xdd, 0x15, 0x8a,
+ 0xa5, 0x8c, 0x96, 0x0e, 0x68, 0x65, 0x1d, 0xd6, 0xdf, 0x10, 0x44, 0x7f,
+ 0x2f, 0xf8, 0xa3, 0x24, 0x32, 0xdf, 0x46, 0xe2, 0xc8, 0xbf, 0x8d, 0xef,
+ 0x24, 0x55, 0x06, 0xbd, 0x3b, 0x92, 0x36, 0x3c, 0x8a, 0xad, 0x8f, 0xd0,
+ 0x39, 0x96, 0xac, 0xfd, 0x7c, 0xfa, 0xd8, 0xe4, 0x1a, 0xc9, 0xdd, 0x0a,
+ 0x9a, 0xfa, 0x63, 0x18, 0xa6, 0x03, 0xdc, 0xbf, 0xc4, 0xc1, 0x70, 0xd8,
+ 0x42, 0xc5, 0x11, 0xf1, 0x27, 0xbb, 0x47, 0x5a, 0x6a, 0xac, 0xf9, 0xf2,
+ 0x38, 0x34, 0x77, 0xec, 0x47, 0x76, 0x5c, 0x92, 0x15, 0x28, 0x92, 0xbf,
+ 0x6c, 0x15, 0x44, 0x01, 0x4e, 0x1f, 0x26, 0xf8, 0xc3, 0x3a, 0x73, 0x3d,
+ 0x8e, 0x66, 0xb7, 0xb8, 0xc3, 0xdb, 0x66, 0x00, 0x1a, 0xe9, 0x2c, 0xae,
+ 0xdd, 0x92, 0xc0, 0x94, 0x59, 0x3b, 0x9a, 0x01, 0x8d, 0x14, 0x48, 0x30,
+ 0x2f, 0x86, 0x03, 0xb2, 0xdf, 0x2e, 0xe1, 0x14, 0xed, 0xe0, 0x8d, 0x9f,
+ 0x03, 0x54, 0x4a, 0xf0, 0x5c, 0x44, 0xc4, 0x60, 0x75, 0x0b, 0x27, 0x1f,
+ 0xd1, 0xea, 0xd2, 0xae, 0x9c, 0x7d, 0xd1, 0x33, 0x81, 0x39, 0x2d, 0x47,
+ 0xc3, 0x20, 0x10, 0x13, 0xcf, 0x06, 0x4d, 0x3e, 0x79, 0x37, 0x2b, 0x28,
+ 0x93, 0x66, 0xdd, 0x73, 0xe6, 0x4a, 0x4c, 0xa4, 0x7f, 0xba, 0xa5, 0x76,
+ 0xf5, 0x07, 0x89, 0x79, 0xb9, 0x46, 0x5f, 0x1f, 0xbf, 0x47, 0x77, 0x09,
+ 0x78, 0xa3, 0xdf, 0xf9, 0xf9, 0x42, 0x6c, 0x9b, 0x3b, 0xa1, 0x59, 0x0e,
+ 0x22, 0x82, 0x87, 0xe4, 0x32, 0xd9, 0xf4, 0x02, 0xf1, 0xca, 0x5d, 0x09,
+ 0x9f, 0xe3, 0x94, 0xa8, 0x8a, 0xe8, 0x3f, 0xa0, 0x0b, 0x5a, 0x29, 0xa4,
+ 0xec, 0xd3, 0x06, 0x6a, 0x6c, 0x3f, 0x6b, 0x74, 0xdc, 0x3d, 0xbf, 0xa3,
+ 0x91, 0x00, 0x76, 0xaf, 0xfd, 0x28, 0xb6, 0x43, 0xc7, 0xc3, 0x58, 0xdf,
+ 0xaa, 0x31, 0x09, 0x7b, 0xb3, 0x88, 0x22, 0x40, 0x58, 0x44, 0xda, 0x18,
+ 0x77, 0x61, 0xcd, 0xe8, 0x84, 0x2b, 0xca, 0x18, 0xd8, 0x8a, 0xff, 0x65,
+ 0xbf, 0xdb, 0x60, 0xd9, 0x0b, 0xf0, 0xc7, 0xc2, 0x1d, 0x26, 0x6a, 0xa1,
+ 0xcc, 0x30, 0x0d, 0x89, 0x4f, 0x55, 0x1d, 0x48, 0x6f, 0xca, 0xc8, 0x4f,
+ 0xec, 0x7b, 0x74, 0x52, 0x6f, 0x14, 0xc5, 0xfb, 0xc9, 0x09, 0xec, 0xc8,
+ 0x54, 0x65, 0xf6, 0x77, 0x7c, 0x62, 0x86, 0xa4, 0xf0, 0x7c, 0x25, 0x77,
+ 0xdc, 0x51, 0xde, 0xf7, 0x67, 0xd4, 0x74, 0xf2, 0xf9, 0x01, 0x2e, 0x61,
+ 0xb2, 0x9a, 0x13, 0xe6, 0x8a, 0x93, 0x20, 0x39, 0x02, 0x14, 0x3e, 0xc6,
+ 0x9d, 0x27, 0x44, 0x1a, 0x7b, 0x60, 0x18, 0xd1, 0xb4, 0xa7, 0xc9, 0xb7,
+ 0xe4, 0x42, 0x73, 0x26, 0x1f, 0xb4, 0xb2, 0x7e, 0x18, 0x5e, 0x9a, 0x02,
+ 0x7f, 0x64, 0x95, 0xee, 0x92, 0x1b, 0x3f, 0xfd, 0xda, 0x21, 0x91, 0x7d,
+ 0x5d, 0x47, 0xe8, 0x2a, 0x52, 0x90, 0xf3, 0xd1, 0xb8, 0x4d, 0x56, 0x84,
+ 0x25, 0xd5, 0x6c, 0xca, 0x5a, 0xd1, 0xb5, 0x60, 0x9e, 0x91, 0xbf, 0x12,
+ 0x82, 0x65, 0xda, 0xef, 0x2e, 0x83, 0xaa, 0x20, 0x72, 0x08, 0x13, 0x3a,
+ 0x9f, 0x1f, 0x3e, 0xb2, 0x52, 0x48, 0x8b, 0xaf, 0xa3, 0x4a, 0xbc, 0x4b,
+ 0x5a, 0x9a, 0x1b, 0xf0, 0x13, 0xab, 0x9f, 0x03, 0x3d, 0xe5, 0x2b, 0x6f,
+ 0xc9, 0x82, 0x18, 0x69, 0x20, 0x24, 0xa2, 0x66, 0x10, 0x3e, 0xb8, 0x65,
+ 0x34, 0x2c, 0x27, 0xcf, 0xdc, 0x35, 0xd0, 0x6b, 0x65, 0xf4, 0x61, 0x5b,
+ 0x86, 0x6f, 0x1b, 0xef, 0x20, 0x1a, 0x80, 0xb7, 0x94, 0x36, 0xeb, 0x89,
+ 0x01, 0x92, 0xd8, 0xf8, 0x4e, 0xb0, 0xa5, 0xa8, 0x4c, 0x38, 0x20, 0xc7,
+ 0xed, 0x79, 0x5a, 0xe5, 0x6a, 0x31, 0xc8, 0x6d, 0xb6, 0x17, 0xeb, 0xe3,
+ 0x62, 0x07, 0xc0, 0x75, 0x58, 0xc2, 0xa0, 0xbb, 0x6b, 0x7f, 0xec, 0x9c,
+ 0x26, 0x53, 0xd0, 0x79, 0xc8, 0x5c, 0x03, 0xea, 0xd6, 0x09, 0x46, 0x33,
+ 0xbb, 0x03, 0x7a, 0xb6, 0xc2, 0xe8, 0xa4, 0xab, 0xf4, 0xed, 0x7d, 0xae,
+ 0xfa, 0xcc, 0x96, 0x5a, 0x2d, 0x07, 0x38, 0x61, 0x1c, 0x82, 0xe9, 0xbb,
+ 0x14, 0x1c, 0x52, 0x35, 0xb5, 0x62, 0x2c, 0xfc, 0x54, 0x5e, 0xe1, 0xd3,
+ 0x37, 0xec, 0xbe, 0xdc, 0x4a, 0xe2, 0xd2, 0xb9, 0x45, 0x8e, 0x75, 0xdd,
+ 0xbd, 0xff, 0x7e, 0x2c, 0x88, 0x1c, 0x48, 0x82, 0x35, 0x27, 0xce, 0xa5,
+ 0x18, 0x5a, 0xa9, 0xbd, 0x9c, 0x11, 0x13, 0xcf, 0x88, 0x38, 0x0e, 0x6b,
+ 0x40, 0x0f, 0x72, 0x16, 0x2b, 0x69, 0xfd, 0x27, 0x73, 0xbf, 0x14, 0x5b,
+ 0x20, 0xfd, 0x0b, 0x9c, 0x30, 0x48, 0x87, 0xeb, 0x56, 0xbd, 0x8f, 0x22,
+ 0x47, 0x0c, 0xca, 0xe8, 0xf4, 0x31, 0x12, 0x5b, 0x56, 0xc6, 0x0b, 0x59,
+ 0x1f, 0x88, 0x0c, 0xa0, 0xc6, 0x39, 0xd2, 0xae, 0xad, 0x3c, 0x20, 0x71,
+ 0xd4, 0xc0, 0xdd, 0x8b, 0x4f, 0x7e, 0xde, 0x0d, 0xf4, 0x79, 0x55, 0xbb,
+ 0x17, 0xe6, 0xfb, 0xb9, 0xc6, 0x5f, 0x68, 0x72, 0xd5, 0x1a, 0xfc, 0x0b,
+ 0xbc, 0x07, 0x27, 0x5b, 0x2c, 0x22, 0x50, 0x39, 0x22, 0xc1, 0x6f, 0xe4,
+ 0xfb, 0xec, 0x77, 0xc3, 0x3c, 0xd1, 0x61, 0x58, 0xf3, 0x02, 0xd2, 0x18,
+ 0xd4, 0xd1, 0xad, 0x0e, 0x5f, 0x85, 0x43, 0xa9, 0x1c, 0xee, 0xc6, 0x59,
+ 0xe8, 0x83, 0x8b, 0x56, 0xc7, 0x1f, 0xcf, 0xd1, 0x19, 0x03, 0x57, 0xc7,
+ 0x04, 0x22, 0x52, 0x41, 0xb2, 0x40, 0xc9, 0x62, 0xfe, 0xa8, 0x17, 0xf2,
+ 0x08, 0x10, 0xfb, 0x28, 0xb6, 0xf5, 0x35, 0x30, 0xd3, 0x2c, 0xe8, 0x8b,
+ 0xb6, 0xea, 0x5a, 0xf1, 0x70, 0x9b, 0x8e, 0x68, 0x8b, 0xec, 0xff, 0x29,
+ 0xf2, 0xfe, 0x20, 0xce, 0xf1, 0x46, 0xce, 0x1c, 0x68, 0xab, 0xc3, 0xaf,
+ 0x83, 0xb2, 0x19, 0xb5, 0x53, 0xb9, 0x90, 0xf2, 0xac, 0x95, 0xb6, 0x53,
+ 0x18, 0x40, 0x2f, 0x4f, 0xa6, 0xe3, 0xed, 0x8e, 0xac, 0x29, 0xa8, 0xbd,
+ 0x40, 0x57, 0xa7, 0x7e, 0x02, 0xcd, 0x76, 0x8c, 0xe0, 0x28, 0xd6, 0x49,
+ 0x76, 0x60, 0xf4, 0xe1, 0xaa, 0x95, 0x7f, 0x29, 0xae, 0x80, 0x97, 0xed,
+ 0xf6, 0xaf, 0x41, 0xc3, 0x77, 0x7b, 0xfa, 0xa8, 0x26, 0x63, 0xd6, 0x00,
+ 0x36, 0xec, 0x45, 0x2a, 0x6f, 0xc7, 0x46, 0x41, 0x06, 0x5c, 0xfe, 0xc6,
+ 0x8b, 0x7e, 0xe7, 0x1d, 0x4b, 0x8e, 0xde, 0x8c, 0x66, 0x41, 0xc7, 0x58,
+ 0xd5, 0xff, 0x32, 0xdf, 0x06, 0x45, 0xfc, 0x16, 0x9e, 0x08, 0xf6, 0x36,
+ 0x40, 0x53, 0x04, 0xe5, 0x36, 0x32, 0xdc, 0xf2, 0xbe, 0x7d, 0xc2, 0x58,
+ 0xab, 0x08, 0x5c, 0xf6, 0x5f, 0x97, 0x4c, 0x77, 0x76, 0x8c, 0x1f, 0xd2,
+ 0xe8, 0xcf, 0xec, 0xea, 0x38, 0x0f, 0xbd, 0x29, 0xd2, 0x86, 0xcc, 0x29,
+ 0xe1, 0x18, 0x02, 0xa8, 0xf6, 0x1f, 0x34, 0x60, 0x8a, 0xe5, 0xa6, 0x22,
+ 0xa8, 0x39, 0x86, 0xe6, 0xb7, 0x63, 0xc9, 0x05, 0xff, 0x3e, 0xad, 0xd1,
+ 0x5d, 0xc2, 0x3b, 0xce, 0x51, 0xc5, 0x55, 0x19, 0xdf, 0x33, 0x13, 0x53,
+ 0xa1, 0x80, 0x0d, 0xb0, 0xc5, 0xd3, 0x0f, 0x6b, 0x56, 0x1b, 0x84, 0x73,
+ 0x49, 0x29, 0x82, 0x4e, 0x99, 0x32, 0xbc, 0x28, 0x42, 0xf3, 0xae, 0x74,
+ 0x15, 0x11, 0x3b, 0x24, 0x6e, 0x4f, 0x43, 0xe3, 0x75, 0x22, 0x45, 0xb3,
+ 0xed, 0x02, 0xb1, 0x05, 0x0a, 0x3d, 0xe4, 0xc3, 0xeb, 0x1d, 0x62, 0x25,
+ 0x5b, 0x3b, 0xa7, 0x64, 0x2e, 0xc5, 0x75, 0x57, 0x46, 0x8f, 0x90, 0xb4,
+ 0xd0, 0xe7, 0xc3, 0xe1, 0x8a, 0xd2, 0xa2, 0xc8, 0xc1, 0x3e, 0x08, 0x7a,
+ 0x55, 0xaf, 0xb0, 0x03, 0xae, 0xb2, 0x12, 0x11, 0xf8, 0x06, 0xe9, 0xf6,
+ 0x98, 0x7e, 0x7c, 0xde, 0x01, 0x67, 0x81, 0x85, 0x8e, 0xd8, 0xb8, 0x8a,
+ 0xf2, 0x07, 0xb8, 0xc6, 0xca, 0x65, 0xd4, 0xae, 0x58, 0x62, 0x97, 0x28,
+ 0x6e, 0x94, 0xd0, 0x11, 0xd1, 0xc2, 0x6f, 0xd2, 0x74, 0xa7, 0x90, 0x8d,
+ 0x25, 0x7e, 0x5a, 0xe6, 0x1a, 0xe7, 0xb2, 0x16, 0x20, 0x0c, 0x6b, 0x74,
+ 0x48, 0x08, 0x76, 0x14, 0x18, 0x01, 0xee, 0xff, 0x54, 0x9c, 0x7a, 0x25,
+ 0x08, 0xf1, 0x54, 0x57, 0x00, 0xd7, 0xe7, 0x14, 0x1d, 0xae, 0xec, 0x20,
+ 0x5d, 0x99, 0xf3, 0xc1, 0x2c, 0x57, 0xe8, 0xbd, 0x9a, 0x7a, 0x33, 0x0d,
+ 0xe8, 0x0b, 0xd0, 0x0e, 0x69, 0xa9, 0x20, 0xe8, 0xcc, 0xd9, 0xdf, 0x8b,
+ 0x32, 0x14, 0x69, 0x9d, 0x98, 0xf2, 0xf8, 0x63, 0xfe, 0x68, 0x5f, 0x94,
+ 0x02, 0xd9, 0x23, 0xd6, 0xa4, 0x45, 0x3f, 0xcc, 0x1f, 0x09, 0xc9, 0x07,
+ 0xd9, 0x11, 0xd4, 0x70, 0x75, 0x4d, 0xfb, 0xca, 0x1d, 0xd2, 0xfc, 0x1c,
+ 0x0e, 0x91, 0x20, 0x38, 0xef, 0xa9, 0x30, 0x2e, 0xe4, 0x89, 0x53, 0x9c,
+ 0x22, 0xf9, 0x4e, 0xe6, 0x9b, 0x69, 0x27, 0x53, 0x1e, 0x8c, 0x68, 0xa7,
+ 0x3b, 0x75, 0x37, 0x0f, 0x5f, 0xd4, 0x6b, 0x36, 0x1c, 0xdd, 0xfb, 0xb5,
+ 0xac, 0x16, 0x5c, 0xa4, 0xf4, 0x2a, 0x43, 0x44, 0xaa, 0x28, 0xa2, 0xc7,
+ 0x2f, 0xdd, 0x45, 0x90, 0xe8, 0xb8, 0xd8, 0x10, 0x69, 0xe0, 0xd0, 0x4c,
+ 0x7c, 0x4f, 0xd7, 0xc8, 0x35, 0xfa, 0xf8, 0x71, 0x4a, 0xb7, 0x36, 0x6e,
+ 0xfd, 0x44, 0x9d, 0x40, 0x1f, 0xb9, 0xb1, 0x64, 0x0a, 0x82, 0x50, 0x38,
+ 0xf3, 0x78, 0x61, 0xd3, 0xdb, 0x18, 0xa8, 0xa8, 0x66, 0x42, 0x81, 0xf4,
+ 0x13, 0x68, 0xec, 0xff, 0x4a, 0x58, 0xb1, 0x44, 0x06, 0x9f, 0xca, 0x65,
+ 0x66, 0x87, 0xc3, 0xbf, 0x7e, 0xa6, 0xea, 0x6f, 0x93, 0xd2, 0x0e, 0x9a,
+ 0x26, 0x5c, 0xa1, 0x7c, 0x7c, 0x00, 0x34, 0xe8, 0xb2, 0x45, 0x1f, 0xff,
+ 0x8c, 0xb4, 0xaa, 0x9e, 0x21, 0x76, 0x06, 0x7e, 0xa6, 0x2f, 0x85, 0xd8,
+ 0x94, 0xaa, 0xd5, 0x2f, 0xc2, 0xe4, 0x22, 0x61, 0x8a, 0xaf, 0xa4, 0x7a,
+ 0x8e, 0x5f, 0x50, 0x28, 0xb4, 0xc5, 0x55, 0x57, 0xb4, 0x2a, 0xb6, 0x5f,
+ 0x4c, 0xce, 0x1b, 0xa2, 0x02, 0x78, 0x5e, 0x19, 0xb6, 0x65, 0x50, 0x5c,
+ 0x48, 0x5e, 0x6f, 0xe2, 0x07, 0x61, 0x75, 0x26, 0xf4, 0xa2, 0x94, 0xbd,
+ 0x5c, 0xc4, 0x91, 0x3d, 0x6a, 0x16, 0x61, 0x44, 0xd8, 0xb1, 0xaf, 0xc6,
+ 0xcc, 0x4b, 0x4d, 0x8a, 0x0b, 0xec, 0x2d, 0xec, 0x7c, 0x0b, 0x45, 0xc4,
+ 0xdb, 0x29, 0xc3, 0x03, 0x5a, 0xad, 0x53, 0xe3, 0x8b, 0xf4, 0x86, 0x12,
+ 0xd0, 0xc3, 0x34, 0x0d, 0xac, 0x03, 0xdf, 0x9b, 0x0d, 0x56, 0x70, 0xd0,
+ 0x4b, 0x79, 0x2f, 0x25, 0x12, 0xbc, 0x70, 0x13, 0xfa, 0xcb, 0xed, 0x4e,
+ 0x4b, 0xcf, 0x2b, 0x46, 0xe4, 0xfe, 0xf2, 0x6c, 0x47, 0x79, 0x66, 0x73,
+ 0xe1, 0x35, 0x10, 0xc8, 0x9c, 0x8f, 0xf9, 0xcb, 0x0d, 0x80, 0xf6, 0x8d,
+ 0xd8, 0xd7, 0xa9, 0xb0, 0x54, 0x24, 0xc3, 0x9d, 0x91, 0xac, 0x16, 0xd2,
+ 0xff, 0x98, 0x7e, 0x86, 0xd4, 0x8b, 0x68, 0xc0, 0xc5, 0xa2, 0x3a, 0x8f,
+ 0x48, 0x8b, 0xc8, 0x62, 0xae, 0x71, 0x58, 0x6e, 0xba, 0x23, 0x80, 0xec,
+ 0xf6, 0x0d, 0x47, 0x79, 0x32, 0x5a, 0x95, 0x33, 0x3d, 0xfc, 0x37, 0x56,
+ 0xe9, 0x2f, 0x5c, 0xbd, 0xc3, 0x3c, 0x9c, 0x63, 0xe2, 0x94, 0x10, 0xf8,
+ 0x50, 0x52, 0x22, 0xbe, 0xad, 0x0a, 0x16, 0xc8, 0x91, 0x6a, 0x08, 0x45,
+ 0x67, 0x7c, 0xe8, 0x67, 0x30, 0x9f, 0x5c, 0xe0, 0x9a, 0x1d, 0x79, 0x09,
+ 0x11, 0x80, 0xf0, 0x04, 0xf6, 0xf7, 0x27, 0xed, 0x6a, 0x20, 0x25, 0xe7,
+ 0x8b, 0xb8, 0x17, 0x3e, 0x70, 0xf0, 0xd9, 0x56, 0x0e, 0x23, 0xd2, 0xa2,
+ 0x95, 0x2f, 0x40, 0xcb, 0x36, 0x1c, 0x57, 0xba, 0x79, 0x77, 0xe0, 0xc1,
+ 0x4b, 0x31, 0xe7, 0x5d, 0x2a, 0xa6, 0x23, 0x2f, 0x83, 0x0e, 0xca, 0x5f,
+ 0x45, 0x7e, 0x2f, 0xbb, 0xb1, 0xa3, 0x9a, 0xb4, 0x9e, 0xa9, 0x4c, 0xf8,
+ 0x8f, 0xaf, 0x86, 0x76, 0x20, 0x79, 0xa5, 0x3e, 0x85, 0xe9, 0xd3, 0x2a,
+ 0xab, 0x89, 0xfd, 0x64, 0x36, 0x21, 0xd0, 0xf4, 0xc4, 0x91, 0xea, 0x3c,
+ 0xe1, 0x20, 0x1b, 0x82, 0xde, 0x4d, 0x92, 0xaf, 0x1a, 0xfe, 0xb5, 0x2b,
+ 0x09, 0x51, 0xd7, 0x57, 0x9e, 0xa6, 0xe8, 0xbf, 0xee, 0xef, 0xb7, 0xc2,
+ 0x15, 0xe7, 0x6a, 0x52, 0x22, 0x32, 0xce, 0x77, 0xb3, 0x4d, 0xc2, 0xe4,
+ 0x90, 0xaf, 0x68, 0x14, 0x41, 0xcd, 0x37, 0x3d, 0xd7, 0x4a, 0x6d, 0x3e,
+ 0x31, 0xa4, 0x28, 0x7b, 0x59, 0xd2, 0xa7, 0x56, 0x7d, 0x51, 0x74, 0x2f,
+ 0x48, 0x77, 0x71, 0xe8, 0xa1, 0xaf, 0x6a, 0xa0, 0x4f, 0xf3, 0xb6, 0xbf,
+ 0xb6, 0x10, 0x14, 0x94, 0xd4, 0x61, 0x4a, 0xfc, 0xff, 0xd7, 0x6d, 0xd4,
+ 0x01, 0x6a, 0x41, 0xf6, 0xd6, 0x0b, 0xe9, 0x5b, 0xb7, 0x0a, 0x0b, 0xa6,
+ 0x6d, 0x51, 0x64, 0x01, 0x91, 0xe6, 0xf1, 0x69, 0x7b, 0x7d, 0xee, 0xb0,
+ 0xb9, 0x6f, 0x92, 0x41, 0xb4, 0xfa, 0x7c, 0xf1, 0xcf, 0xb6, 0xc1, 0x3e,
+ 0xcb, 0xe2, 0x3a, 0xc1, 0x74, 0x61, 0xc2, 0xf1, 0xbd, 0xd2, 0xff, 0x2d,
+ 0x4c, 0x56, 0xee, 0x26, 0xe3, 0xf3, 0xbd, 0xb9, 0xc7, 0xf8, 0x42, 0xab,
+ 0xcd, 0x37, 0x97, 0xd2, 0x87, 0x81, 0xbb, 0xd5, 0xd0, 0xc6, 0xe7, 0x85,
+ 0xfb, 0x1a, 0xd7, 0xac, 0x04, 0xcf, 0xa8, 0xb9, 0xc5, 0x66, 0xa3, 0x55,
+ 0x05, 0x9c, 0xfb, 0x6c, 0x02, 0x67, 0x21, 0x1f, 0x1e, 0xd7, 0x33, 0x3c,
+ 0x17, 0xba, 0x97, 0x09, 0x0c, 0xb3, 0xb9, 0x7c, 0x24, 0x8c, 0xdf, 0x99,
+ 0x47, 0xdc, 0xcc, 0x31, 0xdf, 0xf6, 0x5a, 0x31, 0xa7, 0x94, 0x8f, 0xf2,
+ 0xfb, 0x1d, 0x5b, 0x05, 0x61, 0x8f, 0xf9, 0x2d, 0xb2, 0xc5, 0xc7, 0x2d,
+ 0x09, 0x3d, 0x8a, 0x07, 0x5e, 0xfa, 0x9f, 0xd2, 0xfe, 0x81, 0x7b, 0x35,
+ 0x42, 0xa7, 0x7b, 0x33, 0x7c, 0xcc, 0x7b, 0x63, 0x7c, 0x83, 0x05, 0x1c,
+ 0xbe, 0x3a, 0x54, 0xde, 0x35, 0xf0, 0xd0, 0xdf, 0x89, 0x30, 0x05, 0x1d,
+ 0x84, 0x3b, 0xbd, 0x0d, 0x4e, 0xc7, 0x2c, 0x6f, 0x4b, 0xb4, 0x88, 0xc7,
+ 0x93, 0xab, 0xad, 0x64, 0xcb, 0x7c, 0x7b, 0xf4, 0x8d, 0x4b, 0xfc, 0x85,
+ 0x25, 0xff, 0x84, 0x7b, 0xf1, 0xb5, 0x56, 0xa8, 0x7d, 0x16, 0xf8, 0x8d,
+ 0x47, 0x40, 0x61, 0x1c, 0x1b, 0xde, 0xdb, 0xbf, 0xc7, 0xfd, 0x3d, 0x3b,
+ 0x8c, 0xf8, 0x73, 0x30, 0x6c, 0x0c, 0x05, 0x26, 0x67, 0xa1, 0x83, 0xaa,
+ 0x04, 0x7a, 0x36, 0xc0, 0x0b, 0x8d, 0x8c, 0x50, 0x94, 0xb0, 0x85, 0x89,
+ 0xae, 0xf0, 0x94, 0x0d, 0xd1, 0x51, 0xd8, 0x33, 0xc6, 0x91, 0x8d, 0xc3,
+ 0x11, 0xd8, 0xb7, 0xcb, 0xb3, 0x61, 0x33, 0x6b, 0x64, 0xf8, 0x74, 0x01,
+ 0xfa, 0x92, 0x89, 0xa0, 0xbd, 0xb5, 0x2b, 0x8c, 0x42, 0x3a, 0x8f, 0xae,
+ 0xb3, 0xd4, 0xb5, 0xcc, 0x4e, 0x77, 0x3e, 0xc5, 0x31, 0x2a, 0xd7, 0xb3,
+ 0x9e, 0x66, 0xec, 0x09, 0x8e, 0x75, 0x14, 0xbf, 0x0d, 0x5b, 0x5b, 0xb6,
+ 0x47, 0x18, 0xed, 0xf3, 0x72, 0x61, 0xf5, 0xac, 0x54, 0xf2, 0x35, 0xa8,
+ 0x39, 0xf7, 0x86, 0x1b, 0x7c, 0xf9, 0x7a, 0x75, 0xab, 0xa9, 0x01, 0xec,
+ 0x88, 0x6b, 0x15, 0x2e, 0x6f, 0xea, 0x8e, 0xfd, 0x9e, 0x4e, 0x18, 0xc4,
+ 0xb0, 0xcf, 0x8f, 0x3d, 0x31, 0x08, 0x64, 0x9a, 0xba, 0xd3, 0x2d, 0xf1,
+ 0x60, 0x6b, 0x61, 0x65, 0x0a, 0x8a, 0x25, 0xd9, 0x53, 0xd5, 0xc3, 0x15,
+ 0xeb, 0xcc, 0x69, 0x23, 0x26, 0x12, 0x92, 0x58, 0x0c, 0x7d, 0x19, 0x3e,
+ 0xf5, 0xc9, 0x68, 0x7d, 0x44, 0x8a, 0xf3, 0x1e, 0x14, 0x89, 0x2d, 0x18,
+ 0x82, 0x1a, 0x54, 0x55, 0xf5, 0x8a, 0x64, 0xbf, 0x63, 0x46, 0x0c, 0xdf,
+ 0xca, 0x05, 0x92, 0xbc, 0x94, 0x4b, 0xd1, 0x68, 0x85, 0x1f, 0xab, 0x07,
+ 0xaa, 0xde, 0x2d, 0x5c, 0x80, 0x71, 0x73, 0x41, 0x78, 0x0c, 0xb7, 0xc9,
+ 0x7a, 0xda, 0x4c, 0x5c, 0xc1, 0x2c, 0x6a, 0x7e, 0xad, 0x5f, 0x02, 0xeb,
+ 0xc8, 0x68, 0x00, 0x4c, 0x6b, 0xa4, 0x65, 0x6c, 0xd4, 0xed, 0x85, 0x48,
+ 0x82, 0x29, 0xe3, 0xa4, 0x77, 0xf3, 0x32, 0xf0, 0x43, 0x5f, 0x12, 0x6a,
+ 0xd2, 0x0d, 0x40, 0x8a, 0x76, 0x5e, 0x7a, 0x91, 0x2a, 0x2a, 0xfc, 0x18,
+ 0x15, 0x4d, 0x84, 0x3f, 0xa4, 0x72, 0xbb, 0x27, 0xd4, 0xea, 0x49, 0xb0,
+ 0x47, 0xc8, 0xcf, 0x08, 0xca, 0xe0, 0xdd, 0x39, 0xc6, 0x87, 0x26, 0xde,
+ 0xae, 0xa4, 0xab, 0xb6, 0x29, 0x40, 0xfa, 0x00, 0xfa, 0xa9, 0xd5, 0xad,
+ 0x05, 0x8c, 0x32, 0xd4, 0xdb, 0xd6, 0xd6, 0x5d, 0x9b, 0xfb, 0xd0, 0xa1,
+ 0x76, 0x0b, 0xde, 0x79, 0x59, 0x8a, 0x69, 0xdf, 0xcc, 0x77, 0xb3, 0xaa,
+ 0x4a, 0xf5, 0xc0, 0x80, 0x9d, 0x61, 0x9d, 0xc4, 0xcb, 0x82, 0x3a, 0xc5,
+ 0x2d, 0x25, 0x40, 0xc3, 0x35, 0xd0, 0x7a, 0xe1, 0x83, 0x5b, 0x01, 0x61,
+ 0x9b, 0xa1, 0x56, 0x1a, 0x07, 0x8b, 0xd1, 0x9d, 0x38, 0xfa, 0x4e, 0xa9,
+ 0xa3, 0x84, 0x78, 0xa2, 0x36, 0x09, 0x9d, 0xea, 0xb3, 0xbe, 0x70, 0x31,
+ 0xfc, 0xcb, 0x28, 0x12, 0x34, 0x64, 0xca, 0x95, 0x78, 0xcc, 0x71, 0xbc,
+ 0x10, 0xd0, 0x69, 0x3e, 0xee, 0x66, 0xff, 0x27, 0x49, 0x00, 0xb1, 0xd6,
+ 0x1e, 0x48, 0x33, 0x87, 0xab, 0x3a, 0xbe, 0xf3, 0x55, 0xf7, 0xec, 0xee,
+ 0xd7, 0x3f, 0x5b, 0x6a, 0xaa, 0xbe, 0xc9, 0xae, 0x9c, 0xee, 0xba, 0x1b,
+ 0x3b, 0xca, 0x0b, 0xb0, 0x95, 0x3e, 0x0a, 0x73, 0xbb, 0x1c, 0x5a, 0xb3,
+ 0x5f, 0x88, 0xcf, 0x6f, 0x97, 0xe4, 0x9a, 0x71, 0x45, 0xb0, 0x5e, 0xca,
+ 0x67, 0x21, 0x06, 0xfb, 0xae, 0xfe, 0xff, 0x61, 0x9c, 0xdf, 0xd4, 0x0b,
+ 0x5c, 0x5d, 0x00, 0x4f, 0xdf, 0xea, 0xe6, 0x23, 0xdf, 0xfc, 0x9c, 0xc6,
+ 0x45, 0xcf, 0xfd, 0x6c, 0xf7, 0x40, 0x96, 0xc7, 0xca, 0x91, 0xa5, 0xb1,
+ 0x1f, 0x16, 0x85, 0x42, 0x61, 0x14, 0xa3, 0x41, 0x9d, 0x6c, 0x6e, 0x13,
+ 0xb3, 0xf5, 0x73, 0x8d, 0x5b, 0xd6, 0x54, 0xc2, 0xa9, 0xab, 0x57, 0x80,
+ 0x33, 0x23, 0x86, 0x8e, 0xb3, 0x9e, 0xc8, 0xc3, 0xc9, 0x94, 0x36, 0xf5,
+ 0x40, 0x9d, 0x7d, 0x14, 0xb9, 0x7e, 0x77, 0x0a, 0x85, 0x3b, 0x5d, 0x12,
+ 0x67, 0xa8, 0x25, 0x51, 0x5f, 0xc8, 0x5c, 0x54, 0xff, 0x73, 0xc5, 0xaf,
+ 0x3b, 0xfd, 0xc8, 0x39, 0x4a, 0x9c, 0xa7, 0x5d, 0x8f, 0x8f, 0x32, 0x1a,
+ 0x4d, 0xce, 0x92, 0xab, 0xec, 0x36, 0x38, 0xe5, 0x73, 0xb2, 0x48, 0x7e,
+ 0x2b, 0x6c, 0x0c, 0x02, 0x37, 0x8c, 0xbe, 0x7d, 0xe0, 0x40, 0xfa, 0xfb,
+ 0xb9, 0x0f, 0xab, 0xa1, 0x05, 0x74, 0x76, 0x48, 0x6d, 0x57, 0x3d, 0xd0,
+ 0xed, 0x38, 0x64, 0x59, 0x0f, 0xcc, 0x52, 0x45, 0xea, 0x11, 0x80, 0x12,
+ 0x04, 0xac, 0x43, 0x31, 0xb3, 0x2d, 0xd4, 0xa4, 0xb4, 0x5c, 0x88, 0xcf,
+ 0xa5, 0xaa, 0xf8, 0x31, 0x46, 0x61, 0x9d, 0xb3, 0x3a, 0x78, 0xd7, 0xb4,
+ 0x9a, 0x38, 0x46, 0x08, 0xa3, 0xc6, 0x68, 0xe7, 0x78, 0xee, 0x1c, 0x93,
+ 0xdf, 0x94, 0x90, 0xed, 0xd3, 0x24, 0x30, 0x0e, 0x2a, 0x23, 0xd3, 0x76,
+ 0x27, 0x3a, 0x33, 0x12, 0x45, 0x05, 0x86, 0xa6, 0x06, 0x45, 0x3f, 0x9b,
+ 0x6d, 0x2f, 0x8f, 0x51, 0xeb, 0x2c, 0x96, 0xf3, 0x7d, 0x29, 0x55, 0xd6,
+ 0x9d, 0x4b, 0x89, 0x10, 0xa2, 0x76, 0xe1, 0x52, 0xa5, 0x6c, 0x88, 0xf2,
+ 0x0c, 0x06, 0xa0, 0xd0, 0x9e, 0x2e, 0x6e, 0x59, 0xc3, 0x99, 0x36, 0x1e,
+ 0xc6, 0xef, 0xe6, 0x11, 0x66, 0x59, 0xf3, 0xe5, 0x0d, 0x03, 0x48, 0x51,
+ 0x0a, 0xe6, 0x8a, 0xf6, 0xeb, 0x69, 0x7c, 0x47, 0x4c, 0xa1, 0x56, 0x83,
+ 0xcc, 0x51, 0x47, 0x86, 0x74, 0x87, 0x7a, 0xc9, 0x87, 0xf3, 0x0a, 0x34,
+ 0x6c, 0xf6, 0x96, 0x69, 0xd7, 0x61, 0x85, 0x2d, 0xa6, 0x97, 0x31, 0x4c,
+ 0xd4, 0x72, 0xb5, 0x67, 0x2e, 0xff, 0x02, 0x33, 0x59, 0x7b, 0x0c, 0xa5,
+ 0x07, 0xf2, 0x01, 0xf7, 0x23, 0x53, 0x24, 0x20, 0x17, 0xad, 0x7b, 0x0e,
+ 0xb9, 0x4e, 0xb3, 0xd9, 0x01, 0x8a, 0x73, 0xc6, 0x3a, 0x06, 0xb6, 0x5c,
+ 0xe3, 0x57, 0x21, 0x10, 0x8e, 0x38, 0x5f, 0xa8, 0x89, 0xc1, 0xfe, 0xf5,
+ 0xf3, 0xe2, 0x75, 0x61, 0x4c, 0x1a, 0x98, 0x12, 0xc5, 0x39, 0x57, 0x78,
+ 0x90, 0x5f, 0x9f, 0x55, 0xc4, 0xcc, 0x9b, 0x7f, 0x6a, 0x86, 0xc4, 0x2b,
+ 0xf5, 0x16, 0xd2, 0xc7, 0x31, 0xa1, 0x7f, 0x63, 0x1c, 0xbb, 0xb8, 0x0d,
+ 0x50, 0xb1, 0x5a, 0xd5, 0xe1, 0xc9, 0xdb, 0x8e, 0xff, 0x31, 0x53, 0xc3,
+ 0xbd, 0xea, 0x5b, 0xed, 0x82, 0x4c, 0xbb, 0x7b, 0x5d, 0x1a, 0x72, 0xf0,
+ 0x2b, 0x3e, 0xf9, 0xce, 0x88, 0x32, 0xb5, 0xb0, 0x30, 0x37, 0x26, 0xd5,
+ 0xca, 0x9a, 0xde, 0x5b, 0xc7, 0x04, 0x4b, 0x6a, 0x68, 0xdc, 0x09, 0x6c,
+ 0x3b, 0x7f, 0x36, 0x6b, 0x53, 0x27, 0xd2, 0x7a, 0x03, 0x0a, 0x26, 0x06,
+ 0x5a, 0x27, 0xc4, 0x5c, 0xf8, 0xbb, 0xa2, 0x0f, 0xbf, 0xd9, 0xa7, 0x50,
+ 0xf0, 0x1b, 0xb2, 0x90, 0xb8, 0x3b, 0x0e, 0x64, 0x73, 0x98, 0x77, 0xd2,
+ 0x32, 0x76, 0x21, 0x97, 0x7b, 0x4c, 0x3d, 0x3c, 0xad, 0xbe, 0x94, 0xde,
+ 0x23, 0x44, 0xcd, 0x03, 0x83, 0x36, 0x00, 0xd1, 0x97, 0x8f, 0x37, 0x6b,
+ 0x95, 0xb8, 0x92, 0x57, 0xb4, 0xfb, 0xeb, 0x67, 0x40, 0x33, 0x64, 0xba,
+ 0x7d, 0x48, 0xfe, 0x9f, 0xe7, 0xab, 0x2e, 0x18, 0x91, 0x5b, 0x38, 0x18,
+ 0xa3, 0x77, 0x57, 0x0b, 0x46, 0xf0, 0x00, 0xde, 0x7e, 0x89, 0xac, 0x53,
+ 0x10, 0xa6, 0x3a, 0xdd, 0x73, 0x42, 0x97, 0x32, 0x9d, 0x7d, 0x9c, 0x19,
+ 0x80, 0xd7, 0x72, 0x01, 0x46, 0x11, 0xc8, 0x60, 0xcb, 0xaf, 0xd1, 0x88,
+ 0xfc, 0x19, 0x3f, 0x53, 0xb7, 0xab, 0x61, 0x55, 0x01, 0x1c, 0x5f, 0x49,
+ 0xa5, 0x8c, 0x59, 0x7a, 0x5c, 0x7a, 0x2f, 0x65, 0xc9, 0x0a, 0xab, 0xae,
+ 0x2e, 0x4a, 0xdd, 0x44, 0x5f, 0x48, 0x9c, 0xb5, 0x17, 0x42, 0xd7, 0x8b,
+ 0xfc, 0xdf, 0x39, 0xf1, 0xa0, 0x6b, 0x1b, 0x92, 0x11, 0xa0, 0x77, 0xa8,
+ 0x95, 0xab, 0xf3, 0xe3, 0x9e, 0xf6, 0x12, 0x93, 0x29, 0xa2, 0x6c, 0xba,
+ 0xe2, 0x60, 0xd5, 0xcb, 0x01, 0x46, 0x55, 0x0c, 0x3f, 0x08, 0xb0, 0x74,
+ 0x84, 0xbb, 0xc2, 0x18, 0x8a, 0x1c, 0x6d, 0x36, 0x6e, 0xea, 0xa8, 0x6a,
+ 0x78, 0xe8, 0x58, 0x84, 0xd8, 0x33, 0xac, 0xe1, 0x74, 0xf6, 0xb2, 0x80,
+ 0x68, 0x62, 0x74, 0x27, 0xf5, 0x2e, 0x00, 0xdc, 0x3c, 0xee, 0x75, 0x72,
+ 0x27, 0xa4, 0x85, 0xe4, 0xba, 0x97, 0xc0, 0x57, 0xaf, 0xfe, 0xdb, 0xc4,
+ 0x2c, 0xaf, 0xb1, 0x22, 0xee, 0x82, 0x21, 0x93, 0xdd, 0x87, 0xe4, 0xdc,
+ 0xfd, 0x0c, 0x6a, 0x6c, 0xb4, 0x3a, 0x6e, 0xf9, 0x54, 0x00, 0x4f, 0x98,
+ 0x2a, 0xde, 0xea, 0x5c, 0xa4, 0xde, 0x6e, 0x6a, 0x5c, 0x49, 0xfd, 0x9f,
+ 0xcf, 0xee, 0xe0, 0x06, 0xfd, 0xfc, 0xee, 0xb3, 0xf6, 0x02, 0xd8, 0xb1,
+ 0x7f, 0x5b, 0x6c, 0x2e, 0xc2, 0xd1, 0x5c, 0xe1, 0xec, 0x8a, 0x86, 0xe0,
+ 0x12, 0x63, 0x87, 0x7a, 0x48, 0x5f, 0x43, 0xb7, 0x8f, 0xf7, 0x8a, 0xcd,
+ 0x1b, 0x08, 0xc8, 0x40, 0xb4, 0x10, 0xfb, 0xc6, 0xa7, 0xc6, 0xf6, 0xee,
+ 0x41, 0x81, 0x07, 0x19, 0x49, 0x10, 0x26, 0xc1, 0xb2, 0x74, 0xba, 0x26,
+ 0xeb, 0xed, 0x08, 0x3b, 0xb9, 0x1d, 0xfc, 0x37, 0xc0, 0x78, 0xcd, 0xe9,
+ 0x25, 0xbe, 0xc8, 0xcf, 0x31, 0x12, 0xd1, 0xec, 0xf1, 0x0a, 0x41, 0x28,
+ 0x34, 0x2d, 0xbe, 0x9f, 0xfe, 0x68, 0x48, 0x8c, 0x89, 0x25, 0x65, 0x0b,
+ 0x3e, 0xc1, 0x1c, 0x9d, 0xee, 0xac, 0x65, 0x4b, 0xc7, 0x32, 0x2f, 0xa3,
+ 0x78, 0xd6, 0x1f, 0x62, 0xe7, 0xae, 0x95, 0x64, 0x6b, 0xc9, 0xef, 0xbd,
+ 0xd3, 0xc6, 0x19, 0xdf, 0x5d, 0x7f, 0x06, 0x0e, 0xe7, 0x0f, 0xaf, 0x8c,
+ 0x36, 0x6f, 0x84, 0xe5, 0xe1, 0x66, 0x3b, 0x96, 0xc4, 0xdd, 0xbc, 0x01,
+ 0xeb, 0x6d, 0xce, 0xf9, 0x1e, 0x8c, 0x71, 0xb8, 0xa0, 0x94, 0x70, 0xb4,
+ 0x67, 0x50, 0xd0, 0x9c, 0xd4, 0xa8, 0xa6, 0x35, 0xe7, 0x9f, 0x00, 0x8e,
+ 0x33, 0x51, 0x4e, 0x66, 0x69, 0xb5, 0x89, 0x63, 0x0e, 0x63, 0x72, 0xd7,
+ 0x18, 0xe1, 0x1d, 0x59, 0xde, 0x14, 0x27, 0xbc, 0x44, 0x4e, 0x42, 0x6c,
+ 0xa1, 0x18, 0xb8, 0x0d, 0x6d, 0x34, 0x82, 0x88, 0xbf, 0x9a, 0x7d, 0xe1,
+ 0x8b, 0xf3, 0xd9, 0x02, 0xae, 0xbd, 0x6f, 0x2e, 0x4f, 0x76, 0xc7, 0x7f,
+ 0x7f, 0x42, 0x1f, 0x77, 0x69, 0x80, 0x01, 0x24, 0xf6, 0xae, 0x04, 0xc5,
+ 0x07, 0xe0, 0xeb, 0xed, 0x46, 0x5e, 0x37, 0xf4, 0xde, 0x17, 0x03, 0xe2,
+ 0xdc, 0xe8, 0x49, 0x38, 0x74, 0xb1, 0xc7, 0xd8, 0x98, 0x0c, 0x2e, 0xad,
+ 0xf8, 0x9b, 0xc1, 0x8c, 0x91, 0x51, 0xdc, 0xb7, 0xbe, 0xfc, 0x86, 0xbf,
+ 0x8c, 0x60, 0x4e, 0xb3, 0xdb, 0xb8, 0x3f, 0xea, 0xf0, 0x81, 0x22, 0x1e,
+ 0x29, 0x21, 0x6f, 0x8b, 0x1e, 0x1c, 0x00, 0xc4, 0x2a, 0x48, 0x88, 0x0c,
+ 0x07, 0xd8, 0xb6, 0x5d, 0xa6, 0x66, 0xac, 0xaa, 0x76, 0x64, 0xe4, 0x4f,
+ 0x62, 0xfa, 0xba, 0x11, 0xfe, 0x34, 0x1b, 0x68, 0x35, 0xb3, 0x04, 0x4f,
+ 0xfd, 0xb7, 0x81, 0x4b, 0x47, 0x23, 0xdb, 0x63, 0x1b, 0x1d, 0x5b, 0x89,
+ 0x5e, 0x01, 0x1a, 0x6b, 0x22, 0x02, 0x40, 0x2c, 0x7f, 0x0f, 0x50, 0x6d,
+ 0xf0, 0x54, 0x29, 0xf0, 0xfc, 0x84, 0x88, 0xcc, 0xeb, 0x3c, 0x21, 0x19,
+ 0x6d, 0x1f, 0x10, 0xa2, 0xec, 0x19, 0x03, 0xf1, 0xb1, 0xcd, 0xc2, 0x1c,
+ 0x8d, 0x94, 0xe0, 0xa4, 0x16, 0xb5, 0x34, 0xbb, 0xee, 0x25, 0x08, 0x27,
+ 0xee, 0x38, 0x2e, 0x24, 0xae, 0x18, 0x52, 0xf1, 0x58, 0x29, 0xbc, 0xc5,
+ 0x65, 0x4f, 0xa6, 0x0e, 0x4b, 0x59, 0xb8, 0x00, 0x07, 0x80, 0x67, 0x87,
+ 0x61, 0x42, 0xa3, 0x11, 0x4a, 0xd5, 0xba, 0x8c, 0x7e, 0x46, 0x8c, 0x6f,
+ 0xef, 0xc9, 0x48, 0x69, 0x16, 0x70, 0xf3, 0x1a, 0xb3, 0xe7, 0x1e, 0xd9,
+ 0x4a, 0x35, 0x02, 0xcb, 0xf8, 0x75, 0x30, 0x77, 0x87, 0xeb, 0x84, 0xfc,
+ 0x41, 0x2b, 0xe7, 0xaa, 0xf6, 0x37, 0x36, 0xd7, 0xac, 0x53, 0xc1, 0xd5,
+ 0x6b, 0xe8, 0xd1, 0x57, 0xf5, 0xc3, 0x42, 0x78, 0x98, 0x09, 0xec, 0xd1,
+ 0x5e, 0x84, 0x26, 0x2b, 0x38, 0x34, 0x1e, 0xc1, 0x20, 0xab, 0xc5, 0x00,
+ 0xe7, 0xf1, 0x43, 0x55, 0xf6, 0x60, 0x8b, 0xee, 0xd4, 0xed, 0x5e, 0x03,
+ 0x2b, 0x1b, 0xbf, 0x4b, 0x77, 0xbe, 0xb3, 0xbd, 0xc8, 0xfa, 0x53, 0x4a,
+ 0xb5, 0xdc, 0xa3, 0x4c, 0x6f, 0xf1, 0x77, 0x54, 0xce, 0x95, 0xca, 0x78,
+ 0xf0, 0xcc, 0x3a, 0xbb, 0xce, 0x9d, 0x20, 0xe6, 0xe4, 0xc6, 0xcd, 0x71,
+ 0x25, 0xbe, 0xd4, 0xac, 0x05, 0xdc, 0x21, 0x66, 0x41, 0xe0, 0x5d, 0x3c,
+ 0x79, 0x14, 0x67, 0xcf, 0x7e, 0x77, 0xf0, 0x8c, 0x33, 0xe7, 0x85, 0xdc,
+ 0xfc, 0x03, 0xe8, 0xf5, 0x2d, 0x34, 0x1e, 0xa6, 0x81, 0x65, 0x7f, 0xe9,
+ 0xe4, 0xa4, 0xb9, 0x1e, 0x9e, 0x5c, 0x66, 0x71, 0xc1, 0xbe, 0xaa, 0x0a,
+ 0x4b, 0x7e, 0x05, 0x66, 0x75, 0x6e, 0x89, 0x44, 0xed, 0x7b, 0x06, 0x60,
+ 0x66, 0x09, 0xb1, 0x1d, 0xf8, 0x21, 0xd0, 0xeb, 0x63, 0x11, 0x06, 0x8a,
+ 0xbc, 0x24, 0xcc, 0xd2, 0x99, 0xc6, 0xc8, 0xbf, 0x5e, 0x94, 0x17, 0xb5,
+ 0x27, 0x74, 0x5b, 0x3c, 0xaf, 0xe3, 0xcb, 0xd6, 0xb5, 0x31, 0xe1, 0xf3,
+ 0x8d, 0x4e, 0x4a, 0xcb, 0xa3, 0x1d, 0x53, 0x43, 0xa0, 0x4f, 0x99, 0xf1,
+ 0x5d, 0x82, 0x22, 0xbd, 0xbd, 0xc4, 0xb8, 0x01, 0xe8, 0xe3, 0xca, 0xd0,
+ 0x68, 0xe6, 0xa3, 0x15, 0xf2, 0x91, 0xd2, 0xf4, 0x1f, 0x65, 0x1b, 0xde,
+ 0x82, 0x3d, 0xdc, 0x01, 0x48, 0x27, 0x64, 0xc1, 0x63, 0x9e, 0xfb, 0x44,
+ 0x51, 0x3a, 0x4b, 0xf9, 0x1a, 0x1e, 0x68, 0xd5, 0x21, 0xee, 0xfe, 0xac,
+ 0x1f, 0x26, 0x9c, 0x5e, 0x53, 0x2f, 0x10, 0x04, 0xda, 0xc3, 0xe2, 0xf7,
+ 0x8e, 0x9e, 0x24, 0xd1, 0xd3, 0xbd, 0x3c, 0x5c, 0xc0, 0x57, 0xf8, 0x57,
+ 0x1f, 0xfa, 0x9f, 0x98, 0xeb, 0x94, 0x80, 0x91, 0x2c, 0x3f, 0x78, 0x61,
+ 0xdc, 0x96, 0x0c, 0x87, 0x45, 0xe5, 0x10, 0x27, 0xc1, 0x7b, 0x69, 0x89,
+ 0x45, 0x6b, 0x34, 0x3a, 0xf6, 0x65, 0x02, 0x81, 0xd8, 0x3c, 0xdb, 0xee,
+ 0x32, 0x06, 0xb2, 0x49, 0x45, 0x9d, 0x61, 0xbe, 0xc1, 0x0b, 0xe3, 0xa5,
+ 0xaa, 0x99, 0xb9, 0x96, 0x6c, 0xcc, 0x73, 0xb9, 0x97, 0x2f, 0xfb, 0xf3,
+ 0x80, 0xf3, 0x51, 0x28, 0x2d, 0x03, 0xb5, 0xc5, 0x56, 0xa6, 0x52, 0xb4,
+ 0x76, 0xd8, 0x6b, 0x6e, 0x32, 0x6b, 0x6b, 0xca, 0x92, 0x14, 0x67, 0xf3,
+ 0xa7, 0xb9, 0x7c, 0xab, 0xa6, 0xf4, 0x27, 0x94, 0x21, 0x5f, 0xa0, 0xb6,
+ 0x36, 0x54, 0x30, 0x60, 0xaa, 0x21, 0x45, 0xac, 0xe5, 0xe6, 0xa1, 0x7c,
+ 0x99, 0x12, 0x7e, 0xdb, 0xab, 0xa2, 0xbd, 0x1c, 0xa3, 0x89, 0xc0, 0x70,
+ 0x45, 0xdf, 0x97, 0xc3, 0xac, 0xe1, 0x5f, 0xe9, 0xee, 0x50, 0x66, 0x25,
+ 0x05, 0xcc, 0x97, 0xad, 0xd4, 0x36, 0x84, 0x97, 0xcb, 0x09, 0xeb, 0x32,
+ 0xf5, 0xf2, 0xfa, 0x3e, 0x2e, 0x3d, 0x68, 0xf7, 0x41, 0xa3, 0x54, 0x27,
+ 0xc5, 0xf2, 0x4d, 0x6f, 0xf9, 0x6d, 0x92, 0x5c, 0x7e, 0xd9, 0x6e, 0x77,
+ 0xd4, 0x0a, 0x56, 0x15, 0x64, 0x06, 0xdd, 0xd0, 0xa7, 0xd1, 0x53, 0xf7,
+ 0x3c, 0x3b, 0x7e, 0x13, 0xc8, 0x96, 0x9e, 0x3a, 0x9a, 0xcf, 0x48, 0x10,
+ 0xa9, 0xca, 0x20, 0xcc, 0x36, 0xed, 0x6c, 0x46, 0x08, 0xc1, 0xf0, 0x7e,
+ 0x74, 0xab, 0xe2, 0xa6, 0x2d, 0xbe, 0x7d, 0x95, 0xd2, 0x27, 0x43, 0x0b,
+ 0x7b, 0x46, 0x48, 0x8f, 0x6c, 0x3b, 0x14, 0x2b, 0x26, 0xb8, 0x41, 0xef,
+ 0xdf, 0x8b, 0x7e, 0x74, 0x62, 0x94, 0x2b, 0x4a, 0x6a, 0x74, 0xc5, 0xc5,
+ 0x8f, 0xa3, 0x77, 0x74, 0xc9, 0x51, 0xa6, 0x4f, 0xc3, 0x07, 0x94, 0x44,
+ 0xb7, 0xac, 0x80, 0x15, 0x4c, 0xf7, 0x47, 0xd2, 0x0d, 0x3d, 0xb6, 0x77,
+ 0x2a, 0x2f, 0x22, 0x5e, 0x0c, 0xf3, 0x73, 0xa6, 0x84, 0x66, 0xb5, 0x34,
+ 0xf5, 0x6b, 0xda, 0x05, 0x89, 0xff, 0x0d, 0x3c, 0x8d, 0x90, 0x8d, 0xb7,
+ 0x73, 0xc9, 0xc2, 0x2e, 0x49, 0x08, 0x01, 0xbe, 0xdd, 0x28, 0xec, 0xcd,
+ 0x02, 0xb6, 0x09, 0xd9, 0xef, 0xcc, 0xe3, 0x2c, 0x9e, 0xc2, 0x91, 0xe4,
+ 0x88, 0x85, 0x86, 0x30, 0x00, 0xab, 0x06, 0x28, 0xd8, 0x80, 0xaa, 0xe5,
+ 0x93, 0x14, 0xd3, 0xbd, 0x88, 0xf6, 0x69, 0xd8, 0x84, 0x57, 0xda, 0x84,
+ 0xa1, 0x90, 0x32, 0xdb, 0x2e, 0x6e, 0xe9, 0xb1, 0x91, 0x66, 0x87, 0x68,
+ 0x4a, 0xc0, 0x51, 0xe9, 0x8b, 0x0f, 0xe8, 0x4c, 0x7d, 0xc6, 0xe7, 0xc5,
+ 0xf7, 0x79, 0x47, 0xa2, 0x67, 0x7b, 0x40, 0x91, 0xdc, 0xdb, 0x2a, 0xd3,
+ 0x40, 0xf0, 0xc7, 0x2d, 0x29, 0x11, 0x38, 0x7f, 0x3a, 0x2e, 0x1a, 0x93,
+ 0xc8, 0xd7, 0x8e, 0x99, 0x6c, 0x8e, 0x6e, 0xe1, 0x05, 0xbb, 0xee, 0x96,
+ 0xdb, 0x0b, 0x8f, 0x9d, 0x74, 0x78, 0xcf, 0x68, 0x9e, 0x10, 0x81, 0x95,
+ 0xf4, 0x75, 0x9b, 0x2f, 0xf1, 0x7d, 0xe6, 0xa4, 0xc8, 0xcb, 0x0d, 0xaa,
+ 0xc2, 0xf0, 0xf0, 0xd2, 0xbb, 0x98, 0x07, 0x68, 0xbd, 0x25, 0x00, 0x14,
+ 0xbc, 0x12, 0x6b, 0xb8, 0xa3, 0xa0, 0xc5, 0xf9, 0x42, 0xae, 0x10, 0xf0,
+ 0x4e, 0xb7, 0xd0, 0xa0, 0x5f, 0x13, 0x97, 0x66, 0x8c, 0x04, 0x1e, 0xc4,
+ 0x25, 0x8b, 0x49, 0x2c, 0x5d, 0x83, 0xef, 0x4e, 0xd0, 0x2b, 0x17, 0x6c,
+ 0x2d, 0x05, 0x48, 0xc0, 0x9b, 0x8f, 0xda, 0xb0, 0x99, 0xf6, 0xe2, 0xb8,
+ 0x01, 0x97, 0x06, 0xf1, 0xcb, 0x0f, 0xdb, 0x11, 0xc0, 0xb1, 0x19, 0x93,
+ 0x79, 0x6e, 0x90, 0x3f, 0xca, 0xa2, 0x9a, 0xc1, 0x81, 0x4f, 0x1e, 0x64,
+ 0xeb, 0xf5, 0x5d, 0x9c, 0xd7, 0x38, 0xf8, 0x7b, 0x1a, 0x9b, 0x7b, 0xd7,
+ 0x58, 0x72, 0x7b, 0xca, 0xd3, 0xe3, 0xbe, 0xbe, 0xf7, 0xa7, 0xa1, 0x74,
+ 0x4e, 0x63, 0x11, 0xb9, 0xec, 0x03, 0xf5, 0x0e, 0x79, 0x8b, 0xf0, 0x77,
+ 0xf8, 0x3d, 0xbb, 0xfe, 0x47, 0x6a, 0xeb, 0x11, 0xcc, 0xa3, 0xd1, 0x6d,
+ 0x92, 0x13, 0xdc, 0x2b, 0x97, 0x9c, 0xb9, 0x00, 0xd6, 0xee, 0xe6, 0xfb,
+ 0xa2, 0x5e, 0x43, 0x12, 0xdc, 0x65, 0x7e, 0x06, 0xc9, 0x40, 0x3c, 0x4b,
+ 0x90, 0x46, 0xc4, 0x22, 0xdf, 0x4b, 0x48, 0xa7, 0xf0, 0xad, 0xac, 0x72,
+ 0x87, 0x06, 0x62, 0x10, 0xea, 0xce, 0x01, 0x27, 0xcf, 0x42, 0x9a, 0x6e,
+ 0x8b, 0x64, 0xbc, 0xa3, 0xcc, 0x4b, 0xa9, 0x2a, 0xd9, 0x41, 0x63, 0xd5,
+ 0xa7, 0x08, 0x7f, 0x9c, 0xe7, 0x54, 0xf2, 0x91, 0x33, 0x88, 0xab, 0xe4,
+ 0x97, 0xce, 0x37, 0xc6, 0x1e, 0x9e, 0x14, 0x4a, 0x0c, 0xef, 0xa4, 0xd1,
+ 0xfc, 0xa5, 0x0d, 0x8b, 0x7a, 0x61, 0x2b, 0xea, 0x05, 0x79, 0xba, 0x33,
+ 0xcd, 0x38, 0xa7, 0x78, 0x07, 0xd2, 0xb8, 0xfb, 0x22, 0x7f, 0x96, 0xb4,
+ 0x6e, 0x0b, 0xdf, 0x35, 0xfd, 0x57, 0x5a, 0xb4, 0x38, 0xc7, 0xfb, 0x90,
+ 0x1b, 0x44, 0x1d, 0x79, 0x12, 0x98, 0x11, 0x95, 0x7b, 0x38, 0xc1, 0x28,
+ 0x75, 0xd9, 0x90, 0xbd, 0xc3, 0x5b, 0x7f, 0x7f, 0x22, 0x1e, 0xb8, 0x87,
+ 0x03, 0xad, 0x03, 0xe3, 0xab, 0x68, 0x25, 0x37, 0x69, 0x06, 0x58, 0xb9,
+ 0x51, 0x8f, 0xb3, 0x1b, 0x73, 0xe1, 0x5c, 0xc5, 0x68, 0xd9, 0x40, 0x22,
+ 0x1b, 0x25, 0xec, 0xc9, 0x4c, 0xe7, 0x96, 0xfb, 0x30, 0xb8, 0x0c, 0x67,
+ 0xbe, 0xcf, 0x2f, 0x6f, 0x5c, 0x42, 0xce, 0x38, 0x23, 0xe1, 0x82, 0xbb,
+ 0xd5, 0x6e, 0x0c, 0x57, 0xe9, 0xc9, 0x29, 0xf7, 0x30, 0xb9, 0xf2, 0xca,
+ 0x63, 0xf4, 0x90, 0x67, 0xdd, 0x51, 0x24, 0xac, 0x4f, 0x05, 0x44, 0xec,
+ 0xb3, 0x77, 0xcd, 0xb5, 0x9e, 0x98, 0xf3, 0xa9, 0xc9, 0x7a, 0xb0, 0x5a,
+ 0xac, 0x8b, 0x22, 0x52, 0x07, 0x27, 0xe3, 0x1e, 0x2d, 0xdd, 0x8e, 0xca,
+ 0xee, 0x1b, 0x61, 0x7f, 0xb0, 0xd3, 0x77, 0xe8, 0x29, 0xc8, 0xc1, 0x8f,
+ 0x60, 0x79, 0x0d, 0xdf, 0xac, 0x83, 0x1a, 0x76, 0x84, 0x23, 0x8a, 0x0e,
+ 0x17, 0xfd, 0x93, 0xaf, 0x77, 0x5c, 0x69, 0xa8, 0x44, 0x53, 0x83, 0xd2,
+ 0xcf, 0x46, 0x91, 0xf1, 0xca, 0x48, 0x8f, 0xcc, 0xc9, 0xd3, 0x7b, 0x73,
+ 0x86, 0xa3, 0xc7, 0x5c, 0x02, 0x8f, 0xe2, 0xac, 0x90, 0xa9, 0x38, 0x1f,
+ 0x57, 0xee, 0xc1, 0xde, 0x91, 0xc5, 0xa6, 0x0c, 0x70, 0xd4, 0x63, 0x08,
+ 0x04, 0x16, 0x8f, 0x53, 0x27, 0xba, 0x06, 0x75, 0x8e, 0xe7, 0x54, 0x6f,
+ 0xd9, 0x7d, 0xef, 0x6d, 0x42, 0xfb, 0x67, 0x99, 0xfb, 0x97, 0x8b, 0xe3,
+ 0x28, 0x88, 0xf2, 0x92, 0xcb, 0x78, 0x6e, 0x86, 0x85, 0x01, 0x59, 0x19,
+ 0x4b, 0x1c, 0x3f, 0x25, 0x6f, 0xd0, 0x6c, 0x58, 0x2f, 0xdb, 0x05, 0xeb,
+ 0xc3, 0x14, 0x06, 0x5c, 0xa0, 0x6e, 0x89, 0x4d, 0x81, 0x20, 0x55, 0xf3,
+ 0xba, 0xf0, 0x36, 0x4f, 0x66, 0x83, 0x3c, 0x8f, 0xe1, 0x34, 0xcc, 0x23,
+ 0xe2, 0x8b, 0x91, 0x03, 0x80, 0xa9, 0x88, 0x69, 0xa7, 0x97, 0xb6, 0x43,
+ 0x47, 0x17, 0xa2, 0x0f, 0x58, 0x41, 0x86, 0x60, 0xfc, 0x8f, 0x4f, 0xca,
+ 0x44, 0x0a, 0x79, 0x6b, 0x75, 0xfa, 0x65, 0x73, 0x9f, 0x17, 0xe1, 0x3d,
+ 0x53, 0xc8, 0x9b, 0x8c, 0x15, 0xf0, 0x91, 0x35, 0xe4, 0x04, 0x32, 0x8c,
+ 0x61, 0x46, 0xcd, 0x48, 0x6d, 0x34, 0xaf, 0xfb, 0x49, 0x92, 0xd0, 0xcb,
+ 0xb9, 0x9d, 0xcb, 0x53, 0x51, 0x67, 0xd2, 0x7e, 0x0a, 0xa3, 0x33, 0x02,
+ 0x99, 0x66, 0xf2, 0xdd, 0x63, 0x54, 0xe5, 0x5e, 0xa5, 0x2f, 0xd3, 0xf8,
+ 0x2c, 0xa6, 0x10, 0xe6, 0xba, 0x4a, 0xb4, 0x04, 0xc1, 0x9e, 0xe1, 0xe5,
+ 0x2e, 0xf6, 0xc0, 0x70, 0x10, 0x7a, 0x73, 0xff, 0xd8, 0x4a, 0x10, 0xc9,
+ 0x13, 0x29, 0xa8, 0x94, 0x41, 0xfa, 0xd1, 0xf8, 0xb7, 0xad, 0xad, 0xcf,
+ 0xd8, 0xaf, 0xf2, 0x4a, 0x72, 0x7b, 0xd3, 0xa5, 0x7d, 0xe8, 0x63, 0x17,
+ 0x76, 0x58, 0xf7, 0xdb, 0xc4, 0xc9, 0xa8, 0x96, 0x63, 0x48, 0xa7, 0xf4,
+ 0x46, 0x58, 0x8e, 0x64, 0x21, 0xc1, 0xcb, 0x66, 0x1d, 0xe4, 0x03, 0x3b,
+ 0xa9, 0x77, 0x5f, 0x15, 0x05, 0xac, 0x70, 0x80, 0x2b, 0xc8, 0x90, 0x9e,
+ 0xd9, 0xfc, 0xc3, 0xbb, 0xd4, 0xb6, 0x37, 0x24, 0x78, 0x45, 0x51, 0xff,
+ 0x2b, 0xd3, 0xe6, 0x13, 0x76, 0x73, 0x15, 0xf7, 0x39, 0xeb, 0x1f, 0xc8,
+ 0xd9, 0x4e, 0xe3, 0x6c, 0x9b, 0x6c, 0xe7, 0x3b, 0xe2, 0x2e, 0xec, 0x6a,
+ 0xc0, 0x50, 0xcb, 0x3e, 0xe8, 0xfb, 0x58, 0xb4, 0x72, 0xf4, 0x54, 0x38,
+ 0xc3, 0xf7, 0x43, 0x2d, 0xec, 0xd0, 0x85, 0x31, 0x27, 0xa2, 0x77, 0x0b,
+ 0x16, 0x26, 0xe6, 0x79, 0x4c, 0xc0, 0xd4, 0x49, 0x0f, 0x78, 0x8a, 0x63,
+ 0xca, 0x75, 0xeb, 0x15, 0x36, 0xce, 0xd3, 0x4f, 0x93, 0x95, 0xda, 0xa0,
+ 0x73, 0x25, 0x3a, 0xbd, 0xa4, 0x24, 0x5d, 0xb7, 0x55, 0x71, 0x5d, 0x09,
+ 0x4b, 0x1c, 0xf2, 0xd6, 0xf8, 0x36, 0x20, 0x82, 0x70, 0x33, 0xa1, 0x1f,
+ 0xb4, 0x17, 0xcc, 0xfd, 0xb8, 0xaf, 0xe7, 0x4a, 0x30, 0x35, 0xe1, 0x8c,
+ 0x38, 0x4c, 0x3c, 0x1c, 0xb0, 0xc0, 0x31, 0x98, 0x47, 0x84, 0x59, 0x67,
+ 0xbf, 0x6c, 0x57, 0x55, 0xe6, 0x0d, 0x82, 0x6b, 0xe2, 0xd0, 0xd2, 0x71,
+ 0x51, 0x4c, 0x83, 0x5d, 0xea, 0x17, 0xbf, 0xb9, 0xbb, 0x37, 0xdf, 0x30,
+ 0x3f, 0xe9, 0x85, 0x32, 0x06, 0xd5, 0xbb, 0x4a, 0xb7, 0xca, 0xab, 0xca,
+ 0x15, 0x65, 0x11, 0x35, 0x1b, 0x4b, 0xdb, 0x72, 0xd1, 0xbc, 0xc4, 0x55,
+ 0xd4, 0x8f, 0xa0, 0xb6, 0x70, 0x46, 0x9a, 0x07, 0x61, 0xee, 0xc7, 0xbb,
+ 0x8a, 0x93, 0xe7, 0x1f, 0xfc, 0x42, 0x77, 0x27, 0xcc, 0xff, 0x78, 0xa7,
+ 0x26, 0x08, 0x97, 0x93, 0x7a, 0xda, 0x32, 0xc8, 0x3d, 0xbb, 0x0d, 0x2c,
+ 0x77, 0x22, 0x1e, 0xd3, 0x37, 0x74, 0xe7, 0xb8, 0x00, 0x7c, 0x88, 0x08,
+ 0x9c, 0x93, 0xa6, 0x83, 0xea, 0x5c, 0xec, 0xdc, 0x3f, 0x6a, 0x87, 0x69,
+ 0x65, 0x9a, 0x03, 0xb1, 0xe4, 0x6d, 0xdc, 0x3a, 0x27, 0xad, 0x72, 0xcb,
+ 0x15, 0x7a, 0x10, 0x30, 0x4a, 0xe8, 0xfe, 0x0c, 0xfc, 0x54, 0x12, 0xfa,
+ 0xca, 0x24, 0x83, 0x28, 0xde, 0x87, 0xf2, 0x89, 0x78, 0x99, 0xa2, 0x28,
+ 0xce, 0xce, 0x30, 0x8e, 0x90, 0x6f, 0x6a, 0x75, 0x78, 0x84, 0xa5, 0x01,
+ 0x5c, 0x2c, 0x99, 0xc2, 0x93, 0x16, 0xa9, 0x0b, 0xc7, 0x4e, 0xa3, 0xb4,
+ 0xb3, 0x54, 0x5f, 0x06, 0x41, 0xe1, 0xd7, 0x43, 0xed, 0x52, 0xde, 0x5f,
+ 0x66, 0xf4, 0xb9, 0x67, 0xad, 0x07, 0xe8, 0x18, 0xaa, 0x6a, 0x7a, 0x0c,
+ 0xe6, 0x9b, 0xba, 0x76, 0xb4, 0x23, 0x06, 0x18, 0x27, 0x8f, 0x11, 0xba,
+ 0x4e, 0x30, 0xdd, 0x46, 0x00, 0xa9, 0xc1, 0x3b, 0x05, 0xe7, 0xdd, 0x5f,
+ 0xfb, 0x53, 0xe0, 0x62, 0x56, 0x12, 0x03, 0x61, 0x5e, 0xd9, 0x5d, 0x68,
+ 0x0d, 0x29, 0x89, 0x87, 0xb5, 0x37, 0x13, 0x6f, 0xa7, 0x8b, 0x68, 0x2f,
+ 0xcf, 0x0c, 0x30, 0xed, 0x0c, 0xda, 0x10, 0x9e, 0xf7, 0x5b, 0xa1, 0x99,
+ 0x30, 0xcb, 0xfa, 0xec, 0x53, 0x18, 0xe4, 0x40, 0x97, 0xbc, 0x13, 0x0b,
+ 0xa0, 0x07, 0x57, 0xf1, 0x5d, 0x57, 0xe5, 0x86, 0x67, 0x11, 0x17, 0xab,
+ 0x89, 0x93, 0xdc, 0x06, 0x92, 0x36, 0xd9, 0x9c, 0x78, 0xbd, 0xd6, 0xe1,
+ 0x4f, 0xb7, 0x7f, 0xd5, 0x89, 0x18, 0x4f, 0xc8, 0x7a, 0x2d, 0x3d, 0x01,
+ 0x26, 0x6b, 0xa0, 0xd3, 0xfa, 0xa7, 0x42, 0xf7, 0xf4, 0x9f, 0xcb, 0x77,
+ 0xc3, 0x40, 0x44, 0x55, 0x85, 0x36, 0xd5, 0x7d, 0xaf, 0x58, 0xac, 0x44,
+ 0x4e, 0x84, 0xfb, 0x86, 0x40, 0x8b, 0xea, 0x17, 0x73, 0x63, 0x65, 0xd2,
+ 0x27, 0xc0, 0x7b, 0x7f, 0x56, 0xd3, 0x30, 0xc1, 0xe0, 0x09, 0x49, 0x11,
+ 0xd7, 0x2b, 0x2c, 0x15, 0x3c, 0x8d, 0x57, 0xff, 0xb5, 0x22, 0x62, 0x31,
+ 0x66, 0x6f, 0x01, 0x93, 0xc7, 0x45, 0xd6, 0xdb, 0xa6, 0xba, 0x18, 0x0d,
+ 0x91, 0x1f, 0x33, 0x23, 0xb5, 0x77, 0x58, 0x56, 0xe7, 0xdd, 0x27, 0xa1,
+ 0xf8, 0x8d, 0x9f, 0x3f, 0xe5, 0x0b, 0x2f, 0xa4, 0x29, 0x4e, 0x3a, 0x47,
+ 0x98, 0xdd, 0x23, 0x02, 0x53, 0x6c, 0x27, 0xa3, 0x3e, 0xbe, 0x76, 0xac,
+ 0x8b, 0xe4, 0xbd, 0x7a, 0x7d, 0xe0, 0x35, 0xe6, 0x1b, 0xc9, 0x1c, 0xb1,
+ 0xf5, 0xfd, 0xa4, 0xee, 0xdd, 0x6d, 0x14, 0x37, 0x8f, 0x1a, 0x5d, 0xbe,
+ 0xa1, 0x6e, 0xed, 0xa4, 0x78, 0xc5, 0xaa, 0x1d, 0xf4, 0xc3, 0x5d, 0xd8,
+ 0x21, 0x40, 0xc4, 0xd7, 0x74, 0x15, 0x2c, 0x77, 0x0e, 0xb8, 0x79, 0x2d,
+ 0x3c, 0xb2, 0x42, 0xc8, 0x7d, 0x66, 0x3c, 0xe8, 0xab, 0xdd, 0xa5, 0x4a,
+ 0x09, 0x47, 0x15, 0x54, 0x92, 0x97, 0x4d, 0xf0, 0x85, 0x91, 0x08, 0x83,
+ 0x26, 0x44, 0xdd, 0xd3, 0x51, 0x28, 0xb4, 0x9b, 0xd5, 0x01, 0xac, 0x04,
+ 0x1a, 0x27, 0x16, 0x0c, 0xc7, 0x75, 0xc2, 0x10, 0x42, 0x66, 0x22, 0x53,
+ 0x6b, 0xa8, 0x3d, 0x72, 0xf9, 0xc5, 0x6a, 0x6b, 0xf7, 0x93, 0xb8, 0x1f,
+ 0x6e, 0xb3, 0x8b, 0x41, 0x55, 0xb2, 0x30, 0x5c, 0xc5, 0x00, 0xca, 0x7d,
+ 0x63, 0xeb, 0xbc, 0x30, 0xcd, 0x99, 0xbb, 0x80, 0xb8, 0x66, 0x90, 0x38,
+ 0x90, 0xb6, 0x4f, 0x4e, 0xab, 0x93, 0x5d, 0x53, 0xec, 0x57, 0x5c, 0xd3,
+ 0x53, 0x68, 0x8c, 0x99, 0xfa, 0x47, 0x23, 0xe1, 0x8e, 0x0f, 0x37, 0xff,
+ 0xdf, 0x96, 0xc2, 0x73, 0x91, 0x79, 0x06, 0x04, 0x94, 0xe9, 0xb3, 0xe7,
+ 0x7d, 0x30, 0xf4, 0x8d, 0x43, 0xdb, 0xc8, 0x3e, 0x25, 0x95, 0x8c, 0x8b,
+ 0x31, 0x6e, 0x5b, 0x6a, 0x32, 0x29, 0x93, 0xbd, 0x45, 0xea, 0x90, 0x39,
+ 0x7a, 0x82, 0xe5, 0x92, 0xbf, 0x61, 0x23, 0x3b, 0x5f, 0xcc, 0x81, 0x76,
+ 0x26, 0x20, 0xce, 0x28, 0x78, 0xe1, 0xe6, 0xb0, 0xc6, 0xe3, 0xa3, 0xb0,
+ 0x90, 0x62, 0x91, 0xa1, 0x8e, 0x47, 0x49, 0x23, 0xb9, 0xbb, 0x90, 0xc8,
+ 0xdc, 0x99, 0x63, 0xe8, 0x22, 0x10, 0xca, 0x46, 0xb3, 0xd0, 0x13, 0xd2,
+ 0x90, 0xac, 0x02, 0xb5, 0xba, 0x86, 0x3d, 0x46, 0x7f, 0xbe, 0xbc, 0x98,
+ 0x40, 0x67, 0xaa, 0x58, 0xa5, 0x73, 0xdf, 0xb3, 0x1f, 0x90, 0x9a, 0x09,
+ 0xa8, 0x57, 0x32, 0x13, 0x62, 0x95, 0xf1, 0x2b, 0xcd, 0x28, 0xf3, 0x61,
+ 0xf6, 0x4b, 0xad, 0x0b, 0xec, 0x10, 0xb8, 0x4c, 0x1f, 0x2f, 0x84, 0x02,
+ 0xea, 0x6c, 0x1b, 0xb3, 0x71, 0x93, 0x55, 0x95, 0xbd, 0xd0, 0xfa, 0x18,
+ 0x96, 0xd4, 0x78, 0x62, 0x89, 0x5f, 0xcb, 0x21, 0xad, 0x9c, 0xcf, 0xbc,
+ 0x80, 0xbb, 0x13, 0x0c, 0x1f, 0xad, 0xa9, 0x9d, 0x12, 0x57, 0x29, 0xc1,
+ 0xe1, 0xc4, 0x97, 0xd6, 0x65, 0xe9, 0xdc, 0xc3, 0x1b, 0xc3, 0x0d, 0x5e,
+ 0xe5, 0x5f, 0x12, 0xe8, 0xb2, 0x87, 0xd2, 0xc7, 0x57, 0x9b, 0x8a, 0xa8,
+ 0x63, 0xfb, 0x61, 0x42, 0x9f, 0x5b, 0xf6, 0xbb, 0xfe, 0x50, 0x39, 0x36,
+ 0x4d, 0x27, 0x70, 0x96, 0xe0, 0xc8, 0x6b, 0xa1, 0xe6, 0xd1, 0xe4, 0x35,
+ 0xad, 0x91, 0xb5, 0x20, 0x62, 0x3b, 0x97, 0x92, 0x94, 0xd1, 0xac, 0xa4,
+ 0xac, 0xf8, 0x54, 0x16, 0xf3, 0xf8, 0xa4, 0x15, 0x3d, 0x0e, 0x0d, 0x22,
+ 0x93, 0x11, 0xa4, 0x42, 0xa4, 0x55, 0xc4, 0x13, 0x9b, 0x95, 0x75, 0xf0,
+ 0xcb, 0x06, 0x12, 0x3f, 0x55, 0xbf, 0xe8, 0x04, 0x8e, 0x35, 0xa9, 0x10,
+ 0xa1, 0x09, 0x67, 0xe7, 0xd2, 0x65, 0xb9, 0x77, 0x3f, 0x2a, 0x43, 0xf6,
+ 0xae, 0xe1, 0xdb, 0x92, 0xbf, 0x25, 0x9f, 0x24, 0xb2, 0x42, 0x44, 0x65,
+ 0x35, 0xb4, 0x02, 0x74, 0x2d, 0x93, 0xe5, 0x33, 0xf2, 0x75, 0xae, 0xba,
+ 0x6e, 0xb9, 0x55, 0xeb, 0xb6, 0x60, 0x22, 0x24, 0xfd, 0xf3, 0x98, 0x32,
+ 0x25, 0x5e, 0xb9, 0x60, 0x82, 0xe8, 0x46, 0x0a, 0x68, 0x47, 0x5c, 0x65,
+ 0xd5, 0xa2, 0xe7, 0x29, 0x43, 0x80, 0x9f, 0x1d, 0x2d, 0xb2, 0x27, 0x67,
+ 0x39, 0x47, 0x19, 0xfe, 0xfa, 0x1b, 0x4a, 0x09, 0xee, 0xa1, 0xe7, 0x87,
+ 0xdf, 0xd7, 0xc4, 0xb8, 0x20, 0xff, 0x8b, 0xda, 0x42, 0x92, 0x41, 0x20,
+ 0xd5, 0xd1, 0x8b, 0xfb, 0x2a, 0xfd, 0x37, 0xa4, 0xc6, 0xaf, 0x68, 0xd8,
+ 0xae, 0xd5, 0xbc, 0xf9, 0x83, 0x88, 0xb4, 0xc7, 0x3d, 0x02, 0x99, 0x6c,
+ 0x5c, 0xc3, 0x56, 0xde, 0x7a, 0xb2, 0x2f, 0x59, 0xdb, 0x10, 0x1e, 0xf7,
+ 0x9f, 0xfb, 0x45, 0x81, 0x4b, 0x6e, 0xd4, 0x6e, 0x27, 0x1b, 0x4f, 0x06,
+ 0x9b, 0x35, 0x02, 0xe7, 0xbe, 0xca, 0x65, 0xd8, 0xa4, 0xcc, 0xe8, 0x99,
+ 0x36, 0xaf, 0x96, 0x98, 0xe4, 0x73, 0x75, 0x07, 0x5f, 0x09, 0xf5, 0x8a,
+ 0x2a, 0x39, 0x19, 0x9e, 0x24, 0xfa, 0x21, 0x78, 0x41, 0xb1, 0xab, 0x6e,
+ 0x8b, 0xeb, 0xa3, 0xd9, 0x0e, 0x9f, 0xf4, 0x43, 0x08, 0x36, 0xe3, 0xa2,
+ 0x46, 0x7a, 0x93, 0x0c, 0x3f, 0x56, 0x3d, 0x55, 0xbe, 0xb0, 0x04, 0x96,
+ 0x3f, 0x22, 0xcf, 0x89, 0x02, 0xac, 0xf3, 0x0f, 0x17, 0xbe, 0xbc, 0x6f,
+ 0x61, 0x2b, 0xfb, 0x5e, 0xf2, 0x21, 0x31, 0xdc, 0xdc, 0x51, 0xbf, 0x59,
+ 0x83, 0xf8, 0xb1, 0x72, 0x23, 0x07, 0xea, 0xea, 0xc9, 0x7a, 0xe7, 0x2e,
+ 0x9a, 0x45, 0x90, 0xa5, 0xb9, 0x1d, 0x09, 0x79, 0xaa, 0x66, 0xe6, 0xf8,
+ 0x59, 0x40, 0x79, 0x37, 0xc9, 0x24, 0xa2, 0x91, 0xa0, 0x1f, 0xa0, 0x68,
+ 0x7b, 0x91, 0x3c, 0x85, 0xa8, 0x23, 0xbc, 0xd8, 0x6c, 0x86, 0x5b, 0x76,
+ 0xa2, 0xdd, 0x28, 0x04, 0x46, 0x23, 0x63, 0xb6, 0xfc, 0x26, 0x51, 0xde,
+ 0x87, 0xd5, 0x98, 0xf3, 0x9f, 0xde, 0xd2, 0xee, 0xde, 0x6d, 0x17, 0x70,
+ 0x0e, 0xb4, 0x62, 0xb3, 0xfa, 0x96, 0x3a, 0xff, 0x6b, 0x16, 0x30, 0x0f,
+ 0x1f, 0xd7, 0x61, 0xb3, 0xf2, 0x62, 0x76, 0x4a, 0x36, 0x62, 0x63, 0x9f,
+ 0x79, 0x8c, 0xb8, 0x9d, 0x91, 0x81, 0x23, 0x37, 0x05, 0xfc, 0xd7, 0x69,
+ 0xac, 0x2b, 0xaf, 0x98, 0x47, 0xad, 0x81, 0x05, 0xc3, 0xec, 0xeb, 0xd1,
+ 0x9d, 0xbf, 0xe6, 0x82, 0xf1, 0x0b, 0x9a, 0x8a, 0x1c, 0xf5, 0xd4, 0xcc,
+ 0xf5, 0x6e, 0x67, 0xa4, 0xe1, 0xdb, 0x2f, 0x18, 0x7a, 0xf3, 0x8b, 0x24,
+ 0xac, 0xca, 0x71, 0xef, 0x42, 0x44, 0xb6, 0xd7, 0x17, 0xa4, 0x68, 0x22,
+ 0x67, 0x8e, 0xad, 0xe3, 0x92, 0x63, 0x40, 0xe0, 0xea, 0x91, 0x8f, 0x4c,
+ 0xe8, 0xc6, 0x2b, 0x4c, 0xca, 0x4b, 0x29, 0x12, 0xf4, 0xb6, 0x2b, 0xdf,
+ 0xd5, 0x50, 0x62, 0x64, 0x43, 0x87, 0x54, 0x87, 0x4e, 0x18, 0x0c, 0x51,
+ 0x07, 0x8f, 0xe6, 0x3f, 0x3f, 0xc2, 0xb9, 0x96, 0xee, 0xd0, 0x74, 0x2b,
+ 0x19, 0xab, 0x88, 0x7b, 0xb5, 0x78, 0x93, 0xc7, 0x04, 0x2e, 0x27, 0x64,
+ 0x78, 0x29, 0x7f, 0x0a, 0x37, 0x79, 0xbc, 0x6b, 0x1c, 0x7f, 0x97, 0x01,
+ 0xe8, 0x97, 0x35, 0xf3, 0xb6, 0x1c, 0xd2, 0xa1, 0x7f, 0x83, 0xb5, 0x44,
+ 0x62, 0xc0, 0x90, 0xc7, 0xd5, 0xa5, 0xd0, 0x80, 0x58, 0x5e, 0xaa, 0x80,
+ 0xb2, 0x62, 0x0e, 0xe3, 0xc1, 0xb5, 0x3f, 0x5c, 0x0b, 0x4f, 0xea, 0x4c,
+ 0x6c, 0x08, 0xcd, 0xe8, 0xd8, 0xb0, 0x50, 0x8a, 0xc7, 0x8d, 0x07, 0x74,
+ 0x9c, 0x41, 0x52, 0x42, 0x15, 0x15, 0x32, 0x3b, 0xa6, 0x04, 0x29, 0x30,
+ 0x3f, 0xf7, 0x7b, 0x1a, 0x13, 0x6e, 0x85, 0x90, 0xde, 0x95, 0x2f, 0x48,
+ 0x03, 0x5f, 0x2c, 0x3a, 0x0e, 0x8d, 0x77, 0x36, 0x25, 0xc5, 0x16, 0x6a,
+ 0xfb, 0x5c, 0x88, 0x86, 0xdf, 0x49, 0x81, 0xc5, 0x61, 0xef, 0xee, 0x27,
+ 0x64, 0xa5, 0x68, 0x56, 0xc4, 0x78, 0xe3, 0x41, 0x0e, 0x02, 0xd8, 0x58,
+ 0xe7, 0xbd, 0x79, 0xa8, 0x56, 0xdf, 0x18, 0x15, 0xb0, 0x64, 0x11, 0x5b,
+ 0x83, 0xdd, 0x6d, 0x7f, 0x0b, 0x96, 0xe0, 0x0a, 0x48, 0xc8, 0x9d, 0xf5,
+ 0x5c, 0xf0, 0x7d, 0xcd, 0x14, 0x83, 0xc0, 0x9a, 0x78, 0x34, 0xcc, 0xd7,
+ 0xa7, 0x11, 0x65, 0x85, 0xb8, 0x44, 0x3a, 0xa5, 0x89, 0x94, 0xd3, 0x44,
+ 0x60, 0xe9, 0xa3, 0xbf, 0xe2, 0xbf, 0xe4, 0xee, 0xc8, 0xcd, 0x2d, 0x7b,
+ 0xa9, 0xab, 0x8d, 0x90, 0x02, 0x34, 0x6f, 0xe5, 0x4c, 0xe7, 0xfc, 0xdc,
+ 0x1e, 0x95, 0xee, 0xc7, 0xa8, 0x06, 0xaf, 0x21, 0xda, 0x6e, 0x45, 0x12,
+ 0x0f, 0x06, 0x4e, 0x86, 0x0c, 0x97, 0x71, 0x8c, 0x40, 0x47, 0xd9, 0x2d,
+ 0x1e, 0x76, 0xed, 0xb7, 0xf2, 0x27, 0xe0, 0x5e, 0x7a, 0xa8, 0xb1, 0x88,
+ 0x40, 0xd8, 0xc2, 0x57, 0x51, 0x30, 0xc8, 0x02, 0x6b, 0xcd, 0x6b, 0xb7,
+ 0x35, 0x60, 0xd7, 0xd8, 0x70, 0x34, 0x79, 0x6f, 0x01, 0xaf, 0x26, 0xf0,
+ 0x13, 0x18, 0x1f, 0x39, 0x69, 0xfc, 0x75, 0xb7, 0x16, 0x8e, 0x7a, 0x40,
+ 0x64, 0xf3, 0x7f, 0xa9, 0x94, 0xa1, 0x50, 0xe4, 0x7c, 0xcf, 0x54, 0x08,
+ 0x04, 0x45, 0x8a, 0xfe, 0x9c, 0x6a, 0x03, 0x29, 0xea, 0x5d, 0x25, 0xcd,
+ 0xad, 0xfb, 0xd7, 0x14, 0xb8, 0xef, 0x1c, 0x50, 0xc6, 0xd6, 0xab, 0x5a,
+ 0x89, 0x5e, 0x57, 0x39, 0x01, 0xf0, 0xf2, 0x76, 0x18, 0x5f, 0x37, 0x1e,
+ 0xc7, 0x38, 0x63, 0x17, 0x1c, 0x88, 0x3f, 0xa9, 0x72, 0xb3, 0xd8, 0xfd,
+ 0xed, 0xe3, 0xee, 0x3c, 0xa7, 0xf1, 0xb6, 0x48, 0x3a, 0xf8, 0xb4, 0xe2,
+ 0x49, 0x7c, 0x78, 0x83, 0xe8, 0x98, 0xfd, 0xbb, 0x54, 0x2d, 0xa5, 0x9b,
+ 0xab, 0x8f, 0xd2, 0x21, 0xaa, 0x7d, 0x20, 0x7a, 0xb5, 0x97, 0x16, 0x33,
+ 0xba, 0xf7, 0x94, 0x8f, 0xd6, 0x30, 0x77, 0xda, 0x83, 0x67, 0x5a, 0xc7,
+ 0x79, 0x7b, 0x60, 0x8e, 0x5e, 0x50, 0x1a, 0x36, 0xd0, 0x6d, 0x03, 0x1c,
+ 0x32, 0xf9, 0x6c, 0xa7, 0xaf, 0x82, 0xcc, 0x4c, 0x27, 0x8c, 0xca, 0x23,
+ 0x67, 0x32, 0x39, 0xc0, 0x5c, 0x23, 0x71, 0xa4, 0x37, 0x38, 0xf0, 0xf8,
+ 0xa2, 0x16, 0x0e, 0x31, 0x42, 0xaf, 0x5d, 0x09, 0xff, 0x07, 0x71, 0x47,
+ 0x76, 0x6a, 0xb0, 0xd8, 0x27, 0x9e, 0x95, 0x49, 0x73, 0xf2, 0xea, 0x81,
+ 0xa2, 0xc4, 0xfb, 0x48, 0xa3, 0xf7, 0x6d, 0x5b, 0xd7, 0x68, 0x95, 0xfc,
+ 0x9d, 0x81, 0x98, 0x25, 0x56, 0xc8, 0x82, 0x40, 0x0a, 0xe1, 0x6a, 0xc0,
+ 0x80, 0xe8, 0x68, 0x4f, 0x18, 0x2f, 0x4a, 0xa3, 0xb4, 0x87, 0xa8, 0xc5,
+ 0xb3, 0xcf, 0xb3, 0xae, 0x40, 0x65, 0x55, 0x5c, 0x46, 0xd0, 0x20, 0xb3,
+ 0xae, 0x51, 0x99, 0xe2, 0xfd, 0x3a, 0x23, 0x67, 0xdd, 0x31, 0x75, 0xa1,
+ 0x38, 0x1a, 0x70, 0x9d, 0x1c, 0x50, 0xa6, 0xe6, 0xf6, 0x5a, 0x64, 0x6a,
+ 0x7f, 0xbd, 0x34, 0xa8, 0xba, 0xf6, 0x5e, 0x51, 0x3c, 0x16, 0x45, 0xfa,
+ 0x89, 0x4c, 0x8a, 0x4f, 0x6e, 0x55, 0xbb, 0xcc, 0xe7, 0x5f, 0x9f, 0xd7,
+ 0x65, 0x79, 0xa4, 0xe4, 0x9c, 0x1a, 0xf6, 0xba, 0x63, 0x98, 0x4e, 0xd2,
+ 0xa5, 0x50, 0x80, 0x8f, 0xed, 0xf5, 0xfc, 0x7e, 0x57, 0xc5, 0xe8, 0xdf,
+ 0x0e, 0xc6, 0xdc, 0x13, 0xbf, 0xab, 0xb6, 0x23, 0xc9, 0xb7, 0x6d, 0x8c,
+ 0xac, 0x45, 0x2f, 0x28, 0xa8, 0x01, 0xb2, 0x09, 0xf5, 0x8d, 0xcd, 0x34,
+ 0x72, 0x14, 0x12, 0x24, 0x2c, 0x47, 0x92, 0xa5, 0x1c, 0xb6, 0x42, 0x4b,
+ 0x0b, 0x1a, 0x1f, 0xb8, 0x2c, 0xcb, 0x0a, 0x7c, 0x04, 0x90, 0x9c, 0x21,
+ 0x39, 0xe1, 0x85, 0x0c, 0x83, 0xf8, 0xf0, 0xf6, 0xe5, 0xc5, 0x85, 0x62,
+ 0xaf, 0xb0, 0x92, 0xc1, 0x45, 0x81, 0xcc, 0xa8, 0x95, 0xdf, 0x97, 0xa2,
+ 0x65, 0x45, 0x38, 0x47, 0x42, 0xf6, 0x17, 0xf8, 0x2d, 0x3b, 0x82, 0x0e,
+ 0x6c, 0x15, 0xb0, 0xe3, 0xc6, 0x7f, 0x65, 0x40, 0x91, 0xbb, 0x6d, 0xac,
+ 0xdf, 0x57, 0x21, 0x91, 0x9b, 0x27, 0xd9, 0x33, 0x4e, 0x8c, 0x5f, 0x9a,
+ 0x56, 0xb7, 0x42, 0x84, 0x94, 0xdb, 0xe4, 0x8a, 0x45, 0xde, 0x0c, 0x90,
+ 0x15, 0x00, 0x3c, 0xd6, 0xd4, 0xcf, 0xd0, 0xec, 0xaa, 0xf1, 0x61, 0xe2,
+ 0x27, 0xe8, 0x34, 0xe0, 0x6f, 0x52, 0x97, 0xee, 0x0e, 0xd1, 0xbd, 0x15,
+ 0xe1, 0x53, 0x1d, 0xac, 0x42, 0xc7, 0x73, 0x3d, 0xd8, 0x72, 0x22, 0xbf,
+ 0x56, 0x28, 0xb6, 0x40, 0x37, 0x91, 0xe2, 0xbe, 0xeb, 0x56, 0xf1, 0x0b,
+ 0xcf, 0x1e, 0xd3, 0x5c, 0x40, 0x0d, 0x17, 0x07, 0x76, 0x6f, 0x03, 0x2f,
+ 0x81, 0x62, 0xee, 0xf3, 0xc0, 0xe3, 0xfc, 0x6c, 0x73, 0x73, 0x37, 0x5e,
+ 0x7d, 0xad, 0x07, 0x92, 0x1a, 0x23, 0x38, 0xb6, 0x07, 0x97, 0x35, 0x8e,
+ 0x9b, 0x95, 0x42, 0x8a, 0xf2, 0xbf, 0x5a, 0x46, 0xf8, 0x3b, 0x55, 0xfc,
+ 0xde, 0x79, 0xa6, 0xa4, 0x1b, 0xa8, 0xe9, 0xba, 0x7a, 0x97, 0x26, 0x18,
+ 0x8c, 0xac, 0x34, 0xa3, 0xd3, 0x2f, 0x55, 0x8a, 0xd9, 0xa6, 0x56, 0x86,
+ 0xd0, 0x76, 0x30, 0x9f, 0x30, 0x64, 0x57, 0xbd, 0x78, 0xf7, 0xaf, 0x25,
+ 0xef, 0x01, 0xdd, 0x99, 0xfe, 0x5c, 0x52, 0x40, 0x1d, 0xdb, 0x84, 0xb4,
+ 0x55, 0x8a, 0x29, 0x64, 0x50, 0x22, 0x66, 0xc4, 0xa2, 0xc5, 0x49, 0x74,
+ 0x37, 0x08, 0x36, 0xec, 0x6a, 0x5c, 0x7a, 0x95, 0x75, 0xca, 0xec, 0xc1,
+ 0x05, 0x13, 0x27, 0x4d, 0xd2, 0x03, 0xee, 0x7b, 0xe0, 0x0b, 0xbc, 0x9b,
+ 0x7d, 0x4b, 0x64, 0x67, 0x1f, 0x2c, 0x1c, 0x65, 0x6e, 0x1c, 0xea, 0x3a,
+ 0x45, 0x41, 0x70, 0xdb, 0xad, 0x08, 0x2c, 0x06, 0x70, 0x43, 0xa8, 0x6c,
+ 0xa5, 0x3e, 0xd1, 0x9d, 0x6b, 0x3f, 0x6f, 0x75, 0x0c, 0xeb, 0xdc, 0xc0,
+ 0x49, 0x33, 0x4b, 0x07, 0xc2, 0x00, 0x79, 0x88, 0x17, 0x79, 0x0e, 0x62,
+ 0x84, 0x12, 0x51, 0xc5, 0x3b, 0xed, 0xe7, 0x8f, 0x6c, 0xbe, 0x90, 0x9c,
+ 0xe5, 0xc1, 0x1d, 0x0b, 0x46, 0xd1, 0xdb, 0xa8, 0x57, 0xd7, 0xa0, 0x18,
+ 0xd9, 0xb5, 0x7a, 0x09, 0xb9, 0xd7, 0xae, 0xca, 0xa1, 0xfb, 0xcd, 0x7a,
+ 0x16, 0xe5, 0x4a, 0x1e, 0x88, 0x79, 0x7e, 0xfd, 0x6e, 0xaf, 0x56, 0xe9,
+ 0x80, 0x61, 0xe8, 0xaa, 0x14, 0xde, 0x43, 0x35, 0xb7, 0x58, 0xf1, 0xe2,
+ 0x03, 0x02, 0xcb, 0x9b, 0x14, 0x99, 0xcc, 0xba, 0x93, 0x27, 0x96, 0xc3,
+ 0x41, 0xcd, 0x06, 0xed, 0x81, 0x95, 0x64, 0x37, 0xb3, 0xfe, 0xd5, 0x4c,
+ 0xc5, 0x6a, 0x06, 0x61, 0xcb, 0xfa, 0x83, 0x40, 0xb7, 0x0e, 0x16, 0xa7,
+ 0xd4, 0x7e, 0x5f, 0xba, 0x60, 0xef, 0xd4, 0x7f, 0xaa, 0xaa, 0x6b, 0x33,
+ 0xfa, 0x3b, 0x78, 0x8d, 0xc8, 0x28, 0xf4, 0x07, 0xf6, 0xa7, 0x76, 0xf7,
+ 0x75, 0x8f, 0x78, 0x13, 0xb0, 0x7e, 0xb5, 0xb7, 0x87, 0x8a, 0x01, 0x6a,
+ 0x62, 0x1e, 0x78, 0xd4, 0xf2, 0x00, 0x49, 0x8e, 0x5f, 0x81, 0x19, 0x1a,
+ 0x09, 0x00, 0x06, 0x4c, 0x79, 0xa6, 0xfb, 0x43, 0x01, 0x93, 0x6f, 0xfa,
+ 0x1e, 0x3f, 0x51, 0xe4, 0x74, 0x4e, 0xcd, 0x04, 0x35, 0x23, 0xad, 0xa0,
+ 0x77, 0x77, 0x0e, 0x4c, 0xef, 0xf3, 0xa9, 0x41, 0x63, 0x9b, 0x26, 0xcf,
+ 0xa1, 0x6b, 0x8e, 0x30, 0x49, 0x2d, 0xb4, 0x47, 0xfe, 0x64, 0x4b, 0xc5,
+ 0xd7, 0xa4, 0x47, 0x8a, 0x97, 0x36, 0x57, 0xaa, 0xc4, 0x76, 0x98, 0x7a,
+ 0x49, 0x65, 0x7c, 0x3f, 0x44, 0xb8, 0xf8, 0x9a, 0x3b, 0x44, 0xf8, 0x24,
+ 0x36, 0x9e, 0x34, 0x66, 0xbd, 0x68, 0xb4, 0x8f, 0x90, 0xf0, 0x6c, 0x8f,
+ 0x77, 0x1a, 0x44, 0x15, 0x0e, 0xf1, 0x27, 0x82, 0x8e, 0xc4, 0x41, 0xaf,
+ 0x6e, 0x63, 0x37, 0xce, 0x0e, 0x18, 0x90, 0xa2, 0x9f, 0xb3, 0x1c, 0x19,
+ 0xbf, 0x20, 0xf6, 0xd6, 0x9d, 0xa7, 0x84, 0xe5, 0x76, 0xd8, 0xda, 0xd7,
+ 0x91, 0xa2, 0xe2, 0xca, 0xae, 0xa3, 0xcd, 0xe8, 0x2e, 0xc8, 0x9f, 0x90,
+ 0x0f, 0xfb, 0x55, 0xc9, 0x01, 0xa8, 0x86, 0x27, 0x65, 0x22, 0x9b, 0x0a,
+ 0x17, 0x73, 0xd0, 0xd6, 0x62, 0xe6, 0x2c, 0xf5, 0x6c, 0xab, 0x81, 0xfe,
+ 0x5b, 0xa6, 0xaa, 0x28, 0x86, 0x9d, 0x05, 0xbd, 0x26, 0x4e, 0x8c, 0xfe,
+ 0x72, 0x98, 0x57, 0x49, 0x2c, 0x45, 0x14, 0xbb, 0x87, 0x92, 0x4b, 0xd9,
+ 0x62, 0x5a, 0xf5, 0x7f, 0x5f, 0x4f, 0xff, 0xf4, 0x58, 0x91, 0xfb, 0xe5,
+ 0xf6, 0x82, 0xab, 0xad, 0x2c, 0x16, 0x1f, 0x0e, 0x66, 0x1e, 0x97, 0x97,
+ 0x3c, 0x18, 0x42, 0x33, 0x11, 0xa9, 0x22, 0x99, 0x08, 0x01, 0x07, 0x55,
+ 0xf2, 0x38, 0xf2, 0xff, 0x1e, 0x6f, 0xcb, 0x69, 0xf6, 0xc8, 0x1c, 0xae,
+ 0xac, 0xf7, 0x09, 0x17, 0x7c, 0x5b, 0x4c, 0x17, 0xa1, 0x94, 0x44, 0xa9,
+ 0x99, 0xc8, 0x94, 0x63, 0x46, 0x8b, 0x4f, 0x7e, 0x28, 0xf5, 0x23, 0x3e,
+ 0x44, 0x7f, 0xa8, 0x05, 0x38, 0x5a, 0x25, 0xc2, 0x10, 0xbd, 0x7a, 0x92,
+ 0xf9, 0xbb, 0x31, 0xb6, 0xd1, 0x39, 0x52, 0xdd, 0x63, 0x65, 0xe1, 0x68,
+ 0x6b, 0x4f, 0x9f, 0x3f, 0xfb, 0xa3, 0xcb, 0x10, 0xc6, 0xc4, 0x76, 0x6a,
+ 0x93, 0x65, 0x10, 0x24, 0x8f, 0xb2, 0x64, 0x13, 0x3e, 0xe5, 0x66, 0x87,
+ 0xfa, 0x96, 0x1b, 0x6d, 0x19, 0xfb, 0x2d, 0x37, 0x4e, 0x5a, 0xc5, 0xfe,
+ 0xcf, 0xea, 0x04, 0xf8, 0xf4, 0xd4, 0x15, 0x33, 0xf1, 0x26, 0xb1, 0x51,
+ 0x62, 0x9b, 0xfa, 0xca, 0xfb, 0xed, 0x40, 0x57, 0xd9, 0x9a, 0x93, 0x6c,
+ 0xa7, 0xe5, 0x56, 0xea, 0x16, 0x5d, 0x7c, 0xb1, 0xdb, 0xb4, 0x2e, 0x8d,
+ 0xf2, 0xad, 0x55, 0x77, 0x0e, 0xf6, 0x66, 0xb8, 0x2e, 0x4a, 0x09, 0x03,
+ 0x76, 0x80, 0x71, 0xe0, 0x93, 0x05, 0x19, 0xa7, 0x68, 0xf2, 0xd3, 0xb1,
+ 0xd0, 0x18, 0x35, 0x8b, 0x6e, 0xec, 0x49, 0x77, 0xc2, 0x67, 0x53, 0xf2,
+ 0x1b, 0xf7, 0x63, 0xca, 0x7d, 0xc7, 0xce, 0xa7, 0x70, 0xae, 0x11, 0x44,
+ 0xec, 0x71, 0x7e, 0x16, 0x0c, 0x4e, 0x9c, 0x23, 0xec, 0xad, 0xe7, 0x3d,
+ 0xe4, 0x14, 0xb2, 0xec, 0x1f, 0x85, 0xcf, 0x48, 0xde, 0x63, 0x71, 0xf3,
+ 0xbc, 0x68, 0xe4, 0x47, 0xaf, 0x10, 0x3e, 0x8d, 0x68, 0x36, 0x62, 0x10,
+ 0xc1, 0x23, 0x3d, 0x1d, 0x82, 0x1e, 0x2d, 0x57, 0xb6, 0x5e, 0xae, 0x96,
+ 0x37, 0xc5, 0x46, 0x0e, 0x78, 0x43, 0x4f, 0xbf, 0xd0, 0x6b, 0x2e, 0x85,
+ 0xc3, 0xf3, 0x06, 0x29, 0xc3, 0xc3, 0x45, 0x88, 0x0b, 0xeb, 0x4b, 0xb6,
+ 0xaf, 0x49, 0x6a, 0x57, 0xa5, 0xa4, 0xf1, 0x94, 0xf6, 0xfa, 0x18, 0x07,
+ 0xf9, 0xb3, 0x8c, 0x4a, 0x5c, 0x4f, 0xd5, 0x35, 0xba, 0x39, 0xb9, 0x91,
+ 0x81, 0x85, 0x48, 0x6f, 0xaa, 0x0f, 0x5d, 0x66, 0xf4, 0x21, 0x01, 0xcc,
+ 0x2a, 0x55, 0x33, 0xa4, 0xe5, 0x96, 0xd0, 0x07, 0x61, 0xc9, 0x68, 0xc2,
+ 0xb4, 0x59, 0x7a, 0x1f, 0xe1, 0x52, 0x8c, 0xe4, 0x1c, 0x2e, 0x22, 0xc7,
+ 0x22, 0xc1, 0x1d, 0x41, 0x96, 0xb3, 0xbe, 0x4b, 0xcd, 0x56, 0xb6, 0x7b,
+ 0x4c, 0x52, 0xdc, 0xc5, 0x0e, 0xe0, 0x1e, 0x1c, 0x78, 0x04, 0xd5, 0x1f,
+ 0x8e, 0xdf, 0xa6, 0x28, 0xa5, 0xee, 0x16, 0xcb, 0x60, 0x96, 0x4a, 0xf1,
+ 0x73, 0x20, 0xb6, 0x2d, 0x4a, 0x37, 0x3e, 0x4b, 0x7a, 0x3e, 0x20, 0x8c,
+ 0x21, 0xd9, 0x46, 0x1e, 0xd0, 0xd2, 0x2c, 0xba, 0x65, 0x88, 0x80, 0xda,
+ 0x72, 0x6b, 0x91, 0x40, 0xfb, 0x89, 0x3f, 0xa4, 0xc8, 0xec, 0xdc, 0x9d,
+ 0x54, 0x0c, 0x33, 0x57, 0x84, 0xc4, 0x33, 0xbe, 0x2a, 0x56, 0x11, 0x57,
+ 0x39, 0xd3, 0xef, 0x39, 0x44, 0x0b, 0xd9, 0x81, 0xe4, 0xd2, 0xca, 0xf2,
+ 0x9b, 0x5d, 0x7d, 0x33, 0x04, 0x0b, 0xb6, 0xf0, 0xc6, 0x73, 0x6a, 0xa1,
+ 0xc1, 0x2f, 0xc3, 0x94, 0x37, 0x87, 0xa8, 0x88, 0x45, 0x63, 0x13, 0x3c,
+ 0x1b, 0xdf, 0xc0, 0xd3, 0x21, 0x09, 0x13, 0xd3, 0xe7, 0x8a, 0xef, 0xaa,
+ 0x64, 0xc8, 0xcd, 0xf9, 0x94, 0x6d, 0x23, 0x98, 0x1a, 0x51, 0x6a, 0x62,
+ 0x79, 0xce, 0x1e, 0xdc, 0xec, 0x00, 0xa0, 0x66, 0x9c, 0x6b, 0x83, 0x19,
+ 0x40, 0xf5, 0xba, 0x5e, 0xb4, 0x5b, 0x3e, 0xaa, 0x35, 0x9d, 0xb6, 0xa4,
+ 0xe5, 0x49, 0x07, 0x69, 0xf7, 0x0f, 0xaa, 0x4c, 0xd2, 0x09, 0x4e, 0xeb,
+ 0x87, 0x33, 0xae, 0x07, 0x0b, 0xd4, 0xe0, 0xee, 0xdb, 0x72, 0x71, 0x07,
+ 0x6b, 0x16, 0x7d, 0x47, 0x1e, 0x92, 0x0e, 0xc9, 0xf8, 0xd0, 0xbb, 0x31,
+ 0x58, 0x26, 0x9b, 0x1c, 0xe5, 0x73, 0x95, 0xa7, 0xc2, 0xb4, 0x3b, 0x73,
+ 0x7a, 0x77, 0xb2, 0xda, 0x55, 0x96, 0x4d, 0xf4, 0xb9, 0xf2, 0x86, 0xd0,
+ 0x84, 0xab, 0x3c, 0x4f, 0x00, 0xd7, 0x9c, 0x61, 0x93, 0xc7, 0xa6, 0x09,
+ 0x3b, 0xfe, 0x9b, 0xaf, 0xb7, 0xd1, 0x63, 0xca, 0x15, 0x83, 0xde, 0xc4,
+ 0xc6, 0x97, 0x09, 0xa0, 0x52, 0x1b, 0xfa, 0x94, 0x7e, 0xed, 0xfc, 0x27,
+ 0xd1, 0x51, 0xf7, 0x38, 0x16, 0x7a, 0x78, 0xa0, 0x67, 0xba, 0x6c, 0xda,
+ 0x7b, 0x0f, 0x75, 0xfb, 0xe5, 0x13, 0xf8, 0xfb, 0x9a, 0x0f, 0x14, 0x80,
+ 0xb5, 0x06, 0x6d, 0x57, 0x37, 0xff, 0x8d, 0x4a, 0xca, 0xd2, 0x9f, 0x5c,
+ 0x61, 0x6a, 0xbe, 0x89, 0x15, 0xf7, 0x07, 0x95, 0x49, 0x71, 0xb9, 0x33,
+ 0x8a, 0xa2, 0xc3, 0xd2, 0x34, 0xa5, 0x67, 0x74, 0xc8, 0x8e, 0x19, 0xee,
+ 0xa2, 0x03, 0x0d, 0x4b, 0xbf, 0x88, 0xc4, 0x9c, 0xae, 0x70, 0x1b, 0xc9,
+ 0x84, 0x0a, 0x1d, 0x31, 0x68, 0x99, 0x98, 0x53, 0xe4, 0x78, 0x95, 0x8c,
+ 0xf7, 0xa8, 0x88, 0xf6, 0x75, 0xcf, 0xbf, 0x7c, 0x09, 0x57, 0x8a, 0x9b,
+ 0x64, 0x68, 0xb0, 0xeb, 0x95, 0x9b, 0xf3, 0x34, 0xae, 0x6a, 0x56, 0xe1,
+ 0x8a, 0x8a, 0x1b, 0x97, 0x4d, 0xe4, 0x38, 0x88, 0xe4, 0x36, 0x28, 0x59,
+ 0x1d, 0x72, 0xb3, 0xbf, 0xb2, 0x8b, 0x23, 0xe9, 0x4d, 0x26, 0xc9, 0xdf,
+ 0x4a, 0x44, 0xc9, 0xfe, 0xd6, 0xe5, 0xba, 0xda, 0x7f, 0xf9, 0x96, 0xfb,
+ 0xf0, 0xcf, 0xae, 0xee, 0x6e, 0x60, 0x0f, 0xec, 0xf4, 0xd2, 0x49, 0x49,
+ 0x65, 0x9f, 0xb9, 0x3d, 0x52, 0xee, 0x23, 0xb2, 0x88, 0x7c, 0xd0, 0x7f,
+ 0xb8, 0xee, 0x81, 0xe2, 0x24, 0x75, 0x8e, 0xcc, 0x39, 0x3c, 0xc7, 0x87,
+ 0x97, 0xa6, 0xc7, 0xb8, 0x6f, 0xff, 0x60, 0x73, 0x62, 0x27, 0x84, 0xf1,
+ 0x8d, 0xf6, 0xb2, 0xaf, 0x3b, 0x24, 0xce, 0xa7, 0x3a, 0x8f, 0xfb, 0x27,
+ 0x29, 0x64, 0x31, 0x81, 0x6e, 0x8b, 0x47, 0x08, 0x46, 0x6f, 0x96, 0x81,
+ 0x27, 0xe4, 0xf1, 0xef, 0x0a, 0x07, 0xab, 0xb9, 0xda, 0xd6, 0x26, 0xdd,
+ 0x73, 0x9c, 0xe4, 0x27, 0xcf, 0xd8, 0xfb, 0xb1, 0x13, 0x59, 0x28, 0x9f,
+ 0xbb, 0x44, 0x04, 0x97, 0x7a, 0x13, 0x02, 0xde, 0x18, 0x7d, 0x19, 0x38,
+ 0x15, 0x3a, 0xd8, 0x46, 0x9b, 0x57, 0x8f, 0x85, 0x2f, 0x69, 0xea, 0xd4,
+ 0x22, 0xf5, 0x3d, 0x57, 0xcb, 0x4f, 0xa9, 0x33, 0xa5, 0xae, 0x95, 0xda,
+ 0x2a, 0xa1, 0x55, 0xbc, 0x53, 0xcc, 0xc1, 0xce, 0x86, 0x12, 0x1a, 0x96,
+ 0x7b, 0x73, 0xfa, 0x97, 0xcf, 0xc5, 0x1a, 0x22, 0x50, 0xf1, 0x89, 0x42,
+ 0x23, 0x1b, 0xeb, 0x76, 0xc1, 0xf2, 0x4c, 0x45, 0xd8, 0xba, 0x6c, 0x8a,
+ 0x76, 0xc9, 0xe6, 0xae, 0xb6, 0xaa, 0x71, 0x79, 0x5c, 0x95, 0x6a, 0x8f,
+ 0x20, 0xfa, 0x96, 0xde, 0xf2, 0x1e, 0xc0, 0xef, 0x8d, 0xdb, 0xb0, 0xef,
+ 0xd0, 0xb2, 0x40, 0x71, 0x10, 0x67, 0x7a, 0xbd, 0xc5, 0x98, 0x56, 0x02,
+ 0x75, 0xf4, 0x03, 0x2e, 0xd2, 0x39, 0x26, 0x38, 0x85, 0x1e, 0x85, 0x10,
+ 0x46, 0xf4, 0x82, 0x1d, 0x0e, 0x74, 0xe3, 0x2a, 0x2f, 0x24, 0x36, 0x0a,
+ 0x29, 0xfb, 0x7a, 0x19, 0xfa, 0x2d, 0x93, 0xdc, 0xe3, 0x1f, 0x2a, 0x0c,
+ 0x2e, 0x2c, 0xbf, 0xb5, 0x6d, 0xc9, 0x94, 0x58, 0x5c, 0x02, 0xbc, 0x83,
+ 0xc4, 0xc5, 0xfe, 0x70, 0x6f, 0xa6, 0x0c, 0x47, 0x81, 0xfc, 0x5a, 0xbf,
+ 0x6c, 0x58, 0xca, 0xb4, 0xf6, 0x2e, 0x95, 0x63, 0x90, 0xf2, 0x15, 0x40,
+ 0x2e, 0x74, 0x3e, 0x4a, 0xd2, 0xd0, 0x3f, 0x8e, 0x87, 0x83, 0xac, 0x1f,
+ 0x22, 0xa0, 0x53, 0x66, 0x74, 0x4f, 0x57, 0x51, 0x3c, 0xba, 0x4a, 0x01,
+ 0xdf, 0xd9, 0xcc, 0x87, 0x70, 0xc2, 0xa3, 0x49, 0x2b, 0x9c, 0x9c, 0xa0,
+ 0xbf, 0x96, 0xb0, 0xc5, 0x52, 0xce, 0x58, 0x11, 0xa0, 0x6b, 0xf5, 0x3e,
+ 0x9a, 0x56, 0x6f, 0x48, 0x48, 0xf8, 0x28, 0x9e, 0x83, 0x92, 0xd9, 0xad,
+ 0x52, 0xbb, 0x20, 0x37, 0x12, 0x03, 0xf2, 0xac, 0xf9, 0xbf, 0x3a, 0x10,
+ 0xea, 0x42, 0xe0, 0x4b, 0x87, 0xb7, 0x41, 0xd5, 0xcb, 0x35, 0xf5, 0x06,
+ 0x49, 0xfa, 0x33, 0xf6, 0xae, 0x75, 0x04, 0x12, 0xde, 0xc0, 0x39, 0x69,
+ 0x6d, 0x11, 0xcb, 0x2c, 0x72, 0xd4, 0x5c, 0xde, 0x53, 0x44, 0xba, 0x57,
+ 0x7b, 0x84, 0x9c, 0xad, 0x77, 0x53, 0x35, 0x8f, 0x2c, 0x40, 0x34, 0x7d,
+ 0xfd, 0x8f, 0x84, 0x8e, 0xcf, 0x64, 0xd4, 0x15, 0x2c, 0x67, 0xb6, 0x8f,
+ 0xdf, 0x5e, 0xdc, 0x73, 0x7d, 0xef, 0x3f, 0xb3, 0x04, 0xa5, 0x37, 0x8c,
+ 0x71, 0x59, 0x39, 0xaf, 0x55, 0x10, 0x37, 0xcb, 0xae, 0x60, 0x3d, 0xb5,
+ 0x41, 0x45, 0x31, 0xb0, 0xcc, 0x56, 0x30, 0x68, 0x59, 0x68, 0xf1, 0x9f,
+ 0x04, 0xe4, 0xbc, 0xfe, 0x51, 0xfd, 0x49, 0x7c, 0x6a, 0xb1, 0xca, 0xb2,
+ 0x10, 0x72, 0xda, 0xdf, 0x8c, 0xb4, 0x44, 0x3d, 0x27, 0x66, 0x47, 0x31,
+ 0x26, 0x6d, 0x3e, 0x29, 0x39, 0x4e, 0x74, 0x9e, 0x4a, 0x7e, 0x5a, 0xfe,
+ 0x9c, 0xa9, 0x4a, 0x33, 0x89, 0x12, 0x24, 0x40, 0xec, 0xec, 0x20, 0x37,
+ 0xb8, 0xc7, 0xc2, 0xb4, 0xef, 0xfd, 0xf0, 0xbb, 0x13, 0x74, 0xad, 0x85,
+ 0xa9, 0xb9, 0x39, 0xe9, 0x05, 0x73, 0x98, 0xc3, 0xee, 0x18, 0x87, 0xaa,
+ 0x12, 0xf7, 0x65, 0x2f, 0xee, 0xaa, 0x3f, 0x38, 0xdb, 0xa6, 0x2e, 0xf6,
+ 0xbc, 0x33, 0x30, 0xfd, 0x6b, 0x02, 0xb2, 0xab, 0x6b, 0x27, 0x8c, 0x45,
+ 0x6c, 0x01, 0xf1, 0x9d, 0x03, 0xf4, 0x6d, 0x44, 0x75, 0x59, 0xf7, 0xda,
+ 0x59, 0x50, 0x69, 0xef, 0xe7, 0x90, 0xfe, 0xb1, 0x37, 0x6e, 0x0d, 0x73,
+ 0x3e, 0xb1, 0x93, 0x8e, 0x40, 0x45, 0x61, 0xe3, 0x73, 0xc7, 0xdd, 0x51,
+ 0x69, 0x31, 0xb2, 0x07, 0xdd, 0xa5, 0x17, 0x85, 0x85, 0xae, 0x33, 0xa9,
+ 0x54, 0xb3, 0xb8, 0xb6, 0xc3, 0xcd, 0x50, 0x4a, 0x35, 0x7c, 0xfb, 0x66,
+ 0xf7, 0x1a, 0x52, 0x1a, 0xdd, 0xd6, 0x92, 0x6d, 0xb0, 0xb4, 0x68, 0xd0,
+ 0x3c, 0xe9, 0x63, 0xd4, 0x1c, 0xfd, 0xfb, 0xa1, 0xc0, 0xb6, 0x31, 0x61,
+ 0xd4, 0xc1, 0x95, 0xd1, 0x0a, 0xef, 0x21, 0x84, 0x41, 0xce, 0xe3, 0xc7,
+ 0xce, 0xe8, 0x6e, 0x4e, 0x55, 0xb8, 0x96, 0x9a, 0x84, 0x6b, 0x22, 0x00,
+ 0xfc, 0xb6, 0xf8, 0x9e, 0x22, 0xeb, 0xae, 0xbc, 0x14, 0x5d, 0x18, 0x71,
+ 0x8f, 0x44, 0x03, 0x87, 0xe1, 0xf5, 0xd5, 0x84, 0x14, 0xc1, 0x73, 0xc0,
+ 0xa1, 0x22, 0x08, 0x4c, 0x49, 0xfe, 0x3f, 0xda, 0x23, 0xa0, 0x47, 0x2a,
+ 0x2c, 0xeb, 0xda, 0xe8, 0x18, 0xc0, 0x6e, 0x9e, 0xc2, 0x56, 0xcc, 0xbd,
+ 0x6a, 0x4b, 0x5a, 0xd2, 0xf2, 0xcb, 0x0c, 0xf8, 0xa0, 0xec, 0x82, 0xdf,
+ 0x41, 0x5c, 0x71, 0xc3, 0x6a, 0xfc, 0xc4, 0x3a, 0x7b, 0x97, 0x1e, 0x07,
+ 0x99, 0xe9, 0xa6, 0xeb, 0x67, 0x10, 0xcb, 0xd1, 0xed, 0xaa, 0x38, 0x77,
+ 0x8e, 0xd8, 0xfe, 0xd3, 0xb6, 0x31, 0x0c, 0xc3, 0xcf, 0x6f, 0xd5, 0xb5,
+ 0xd0, 0x5a, 0xab, 0xd9, 0x5a, 0x38, 0x28, 0x64, 0xba, 0x63, 0x34, 0xeb,
+ 0x19, 0x51, 0x93, 0x91, 0x21, 0x4f, 0x98, 0x7d, 0x3a, 0xd7, 0x1b, 0x2a,
+ 0x16, 0x15, 0xd9, 0xd4, 0x63, 0xa6, 0x71, 0x43, 0x74, 0x84, 0xd7, 0xbc,
+ 0x77, 0x39, 0x7b, 0xbb, 0x22, 0x4e, 0xc6, 0xe6, 0x4b, 0x51, 0x8f, 0x3d,
+ 0x15, 0x28, 0x6d, 0x18, 0x57, 0x26, 0x01, 0x84, 0x1a, 0xb5, 0xbc, 0xdc,
+ 0x7a, 0x22, 0xb2, 0xb7, 0xf7, 0xd9, 0xbf, 0x9f, 0x86, 0x2f, 0x44, 0x4c,
+ 0xb1, 0xd1, 0x87, 0x61, 0x3a, 0xcd, 0xd7, 0x08, 0x12, 0xed, 0x45, 0x76,
+ 0xd3, 0x64, 0x73, 0xf0, 0x87, 0xcc, 0xff, 0x10, 0x8e, 0x2b, 0x57, 0x45,
+ 0x9f, 0xcd, 0x69, 0x86, 0x2a, 0xe6, 0x92, 0xfe, 0x37, 0x86, 0x92, 0x32,
+ 0xc3, 0xde, 0xca, 0xa6, 0x9d, 0xf1, 0x3f, 0xd2, 0x44, 0xc5, 0xc2, 0x60,
+ 0xa8, 0x9a, 0x74, 0xb7, 0xb9, 0x20, 0x6b, 0x0c, 0xe3, 0xde, 0x40, 0xb8,
+ 0xda, 0xc9, 0x6b, 0x1f, 0x5b, 0x2e, 0xb6, 0x5d, 0xfc, 0x03, 0x36, 0x0b,
+ 0x9d, 0xcb, 0xdf, 0x11, 0x8f, 0x62, 0x18, 0xf6, 0x12, 0xb4, 0x7c, 0x7c,
+ 0xf2, 0x2f, 0x06, 0xe6, 0x47, 0x32, 0xf0, 0xce, 0xcd, 0xa7, 0x19, 0xfb,
+ 0x24, 0x32, 0xf4, 0xf0, 0xbf, 0xd5, 0xae, 0x1a, 0x0a, 0x55, 0x30, 0x2d,
+ 0x8c, 0xce, 0xdc, 0xa4, 0xf4, 0x9d, 0xce, 0x33, 0x24, 0x77, 0x82, 0x25,
+ 0x2f, 0xaf, 0x01, 0x32, 0x67, 0x20, 0x3c, 0x4e, 0xc9, 0x6d, 0xeb, 0x94,
+ 0x57, 0xbe, 0x59, 0x29, 0x10, 0x8a, 0x3f, 0x72, 0x2a, 0x8a, 0xa4, 0x5d,
+ 0x56, 0x3e, 0x9c, 0xca, 0x4e, 0xc9, 0xc7, 0xf6, 0xb4, 0x6b, 0xa1, 0xcd,
+ 0x72, 0xa1, 0x91, 0xa9, 0x2f, 0x32, 0xfb, 0xd2, 0x81, 0x2f, 0x2b, 0x27,
+ 0xb8, 0x54, 0x1d, 0x02, 0xef, 0xdb, 0x1e, 0xf1, 0x6a, 0xc3, 0x8c, 0x54,
+ 0x8b, 0x31, 0xec, 0x3c, 0x65, 0x34, 0xa4, 0x72, 0x15, 0x32, 0x35, 0xef,
+ 0x69, 0x4f, 0x87, 0xed, 0x78, 0x38, 0xc9, 0x53, 0x9b, 0x27, 0x42, 0x4e,
+ 0xcb, 0xe4, 0x12, 0x1b, 0x65, 0xe3, 0x7a, 0xcd, 0x3d, 0xba, 0xd2, 0xb2,
+ 0x48, 0xc0, 0x13, 0xdf, 0xa0, 0x02, 0x2e, 0xf2, 0x1a, 0x88, 0x69, 0xef,
+ 0x42, 0xcd, 0x84, 0x02, 0x50, 0x11, 0x3a, 0xef, 0x0f, 0x88, 0x91, 0x71,
+ 0x33, 0xcb, 0xa8, 0xaa, 0x71, 0x72, 0x40, 0xb8, 0xa5, 0x1e, 0xc9, 0xb4,
+ 0x1c, 0x58, 0xef, 0xbe, 0xe4, 0xda, 0x5e, 0xc2, 0xff, 0x5f, 0x36, 0xf9,
+ 0x7a, 0x68, 0x3d, 0xd3, 0xa8, 0x8f, 0x4e, 0x02, 0x2b, 0xf9, 0x8b, 0xf8,
+ 0x60, 0x34, 0x1c, 0x50, 0xfc, 0x6a, 0x41, 0x87, 0xe3, 0xe4, 0xb0, 0x50,
+ 0x19, 0x2e, 0x1c, 0x95, 0xb0, 0xa9, 0x11, 0x95, 0x69, 0x51, 0xe9, 0x6b,
+ 0x29, 0xd3, 0xd3, 0xca, 0x72, 0x33, 0x86, 0x95, 0xe1, 0x4f, 0x0d, 0xb6,
+ 0x9f, 0xa9, 0x4b, 0xaf, 0x1b, 0xa2, 0x15, 0x6f, 0xc0, 0x19, 0xbb, 0xeb,
+ 0x06, 0x25, 0x44, 0x1c, 0x0a, 0x0a, 0x1f, 0x4a, 0x5a, 0xa2, 0xbd, 0xec,
+ 0x46, 0x0c, 0x39, 0xfd, 0xb9, 0x8d, 0x6c, 0xcc, 0x1c, 0x54, 0x88, 0xf7,
+ 0xb4, 0x56, 0x90, 0xff, 0x32, 0xcd, 0x64, 0xee, 0xd2, 0x30, 0x5c, 0xab,
+ 0x0b, 0xa2, 0x3e, 0x0e, 0xd7, 0x09, 0x2e, 0x33, 0x5e, 0x2c, 0x89, 0xae,
+ 0x28, 0x24, 0x96, 0xd3, 0x8c, 0x82, 0x93, 0xfb, 0x19, 0x1d, 0xcf, 0x5b,
+ 0x33, 0xe5, 0x1f, 0x82, 0xe6, 0x26, 0x6d, 0xa8, 0xa1, 0xdf, 0x8d, 0x94,
+ 0x53, 0x01, 0x33, 0x63, 0x74, 0x28, 0xe7, 0xfb, 0xf7, 0x43, 0xf1, 0xee,
+ 0xf0, 0xbd, 0x08, 0x58, 0x9c, 0xdd, 0x5e, 0xaa, 0x38, 0x6c, 0x40, 0x41,
+ 0x32, 0xa7, 0x6b, 0xe1, 0x25, 0x8f, 0x01, 0x6e, 0xb0, 0xdb, 0x0e, 0x51,
+ 0x7f, 0x6d, 0x22, 0x79, 0x74, 0xc1, 0x34, 0x0b, 0x98, 0x06, 0xe7, 0xcf,
+ 0xff, 0x87, 0x27, 0x9a, 0x46, 0x48, 0xa4, 0xae, 0xd3, 0xc9, 0xe1, 0x5a,
+ 0xbd, 0xe8, 0xe9, 0xa2, 0x31, 0xe3, 0xb2, 0x58, 0x67, 0xf0, 0xc0, 0xbb,
+ 0xd8, 0xa7, 0x34, 0xa1, 0x71, 0x39, 0x24, 0x05, 0x54, 0xec, 0xc6, 0x59,
+ 0x5d, 0xf2, 0x8d, 0xd7, 0x74, 0x7c, 0x31, 0x23, 0x60, 0x75, 0xb7, 0xdb,
+ 0xf0, 0x0b, 0x03, 0x01, 0xe8, 0xf2, 0x97, 0xbf, 0x6e, 0xff, 0xa5, 0x9b,
+ 0x4a, 0xe3, 0x84, 0x49, 0x7f, 0x08, 0x95, 0xc2, 0x1f, 0x8c, 0xd6, 0x81,
+ 0xda, 0x69, 0x71, 0x48, 0x80, 0x87, 0x25, 0xdd, 0x89, 0x5e, 0x1c, 0x29,
+ 0xfe, 0x9a, 0xfe, 0x34, 0x32, 0x9c, 0x74, 0x27, 0x57, 0x53, 0xc0, 0x5c,
+ 0x12, 0xe7, 0x4d, 0xc7, 0xea, 0xb4, 0x6b, 0x48, 0xf7, 0xf2, 0x3b, 0x59,
+ 0xaa, 0x1f, 0x9b, 0x5f, 0xf9, 0xf7, 0xb8, 0x2b, 0x7f, 0x4f, 0x71, 0xba,
+ 0x18, 0xc1, 0x73, 0x37, 0xe4, 0xa8, 0x14, 0xe8, 0x69, 0xc6, 0x07, 0x80,
+ 0x93, 0x68, 0xec, 0x22, 0x69, 0xd8, 0xd3, 0x17, 0xd0, 0x66, 0x15, 0x80,
+ 0x81, 0xeb, 0x30, 0xde, 0xc6, 0xb4, 0x6b, 0xdd, 0x8c, 0xce, 0xbe, 0xcb,
+ 0x1a, 0x75, 0x83, 0x31, 0x20, 0xcf, 0x8d, 0x9f, 0x15, 0x25, 0xc8, 0x20,
+ 0x7b, 0x40, 0x3f, 0x12, 0x82, 0x75, 0xff, 0x76, 0x1a, 0x36, 0xfe, 0x66,
+ 0x7b, 0xae, 0x6f, 0xb0, 0x5c, 0x69, 0x2e, 0x1a, 0x55, 0xdc, 0x2a, 0x17,
+ 0x7c, 0xf6, 0x27, 0xf4, 0x76, 0xd6, 0xe5, 0x2f, 0x0d, 0x19, 0x23, 0x18,
+ 0x57, 0xc3, 0x96, 0x8f, 0x7c, 0xcf, 0xf6, 0x89, 0xdc, 0xb7, 0xa7, 0xa3,
+ 0x66, 0x2a, 0xc0, 0xf6, 0x07, 0x00, 0xcb, 0x13, 0x71, 0xd0, 0xbc, 0xd0,
+ 0x84, 0x94, 0x24, 0x51, 0xf5, 0x68, 0xeb, 0x8f, 0xeb, 0xc4, 0xb8, 0xa1,
+ 0xca, 0x4e, 0x3a, 0x85, 0xf2, 0xd9, 0x32, 0x22, 0xc5, 0xc4, 0x62, 0x1a,
+ 0xe0, 0xb6, 0x58, 0x7a, 0xd2, 0xb1, 0xd7, 0x44, 0x60, 0x8f, 0xc8, 0x9b,
+ 0xde, 0xfd, 0xa2, 0x29, 0x18, 0xab, 0x58, 0xf5, 0xf1, 0x35, 0xca, 0xe5,
+ 0x28, 0x46, 0xbc, 0x0d, 0x97, 0xf5, 0x53, 0xb4, 0x4d, 0xd1, 0x5d, 0xaf,
+ 0xf7, 0xa7, 0xaa, 0xd9, 0x26, 0xa8, 0x7a, 0x7f, 0x73, 0x8d, 0xf2, 0x6a,
+ 0x8a, 0x51, 0x8a, 0x31, 0x04, 0x6f, 0xd8, 0x79, 0x32, 0x5d, 0x52, 0xa8,
+ 0x9c, 0x6f, 0xdd, 0x70, 0x99, 0x0a, 0x8e, 0x76, 0xc7, 0x1f, 0x76, 0xeb,
+ 0x67, 0x65, 0xf7, 0x79, 0xfc, 0x58, 0xf4, 0xcf, 0x12, 0xd7, 0x19, 0x4d,
+ 0xb4, 0x23, 0xa9, 0x1f, 0xf1, 0x60, 0x70, 0xd0, 0x9a, 0x2d, 0xa5, 0xe4,
+ 0xde, 0x70, 0x0a, 0x72, 0xf7, 0x66, 0x31, 0x62, 0x2e, 0x85, 0x72, 0x6c,
+ 0x83, 0xce, 0x71, 0xb8, 0x68, 0xfd, 0x40, 0x76, 0xf9, 0x1d, 0xc9, 0x12,
+ 0x93, 0x51, 0xa4, 0xe1, 0xbc, 0x9c, 0xb5, 0x4d, 0x5e, 0x0e, 0x6b, 0xd5,
+ 0x33, 0x97, 0xb7, 0xa2, 0xe4, 0xd7, 0x92, 0x3c, 0x43, 0xe5, 0x0e, 0x7f,
+ 0x86, 0x75, 0x82, 0x29, 0x58, 0x4b, 0x28, 0xf2, 0x59, 0x56, 0x5e, 0x68,
+ 0x80, 0x2e, 0x7b, 0xb0, 0xd3, 0x66, 0x08, 0x3e, 0x79, 0x67, 0xf6, 0x84,
+ 0x6f, 0x9d, 0x97, 0x69, 0x14, 0x32, 0x3c, 0x15, 0x6e, 0xd5, 0x09, 0x2c,
+ 0x36, 0x46, 0xa1, 0x56, 0x65, 0x62, 0x25, 0xe4, 0x2c, 0xd7, 0x1d, 0x14,
+ 0xe3, 0x02, 0x17, 0xad, 0xcd, 0x5b, 0x84, 0xf7, 0xc6, 0xf9, 0xd3, 0xe6,
+ 0x8e, 0xbe, 0x05, 0xc5, 0x3e, 0x8b, 0xed, 0x5f, 0x05, 0x2a, 0x92, 0x71,
+ 0xe6, 0x0e, 0x1e, 0x92, 0x9a, 0xc5, 0x1c, 0x49, 0x15, 0x7f, 0x6f, 0xf4,
+ 0x40, 0xc9, 0x53, 0x58, 0xe8, 0x11, 0xd5, 0x8c, 0x14, 0xd8, 0xf0, 0x29,
+ 0x04, 0x0f, 0xbc, 0xfe, 0x41, 0x98, 0xc7, 0xf2, 0xb1, 0xf0, 0x2f, 0x9a,
+ 0x86, 0x82, 0xe9, 0x1b, 0x33, 0xbb, 0x91, 0x38, 0x5e, 0xf0, 0xfc, 0xba,
+ 0xca, 0x73, 0x9f, 0xcd, 0xfa, 0xf1, 0xfa, 0xe2, 0x5b, 0x8e, 0xe3, 0xea,
+ 0x53, 0x61, 0x3e, 0x06, 0x33, 0x0b, 0x85, 0x5e, 0x7e, 0xe1, 0xb2, 0x8a,
+ 0x3c, 0x1c, 0x5f, 0x00, 0x6c, 0xe9, 0x15, 0x82, 0xce, 0x27, 0x4d, 0xdf,
+ 0x3a, 0x09, 0xd3, 0x0a, 0xb2, 0x7d, 0xab, 0xf0, 0x1e, 0x99, 0xdf, 0xf6,
+ 0x82, 0x96, 0x03, 0x65, 0x38, 0x2e, 0x7b, 0xe2, 0x32, 0x92, 0x32, 0x0f,
+ 0xa7, 0x05, 0xef, 0xcc, 0x8d, 0x01, 0xcf, 0x1e, 0x1f, 0x1d, 0xa8, 0x72,
+ 0x25, 0x2c, 0x8b, 0x92, 0xaf, 0x56, 0xd0, 0xa8, 0x2f, 0x52, 0x47, 0xe0,
+ 0xf0, 0xc8, 0x41, 0xcb, 0x3b, 0xed, 0xc3, 0xb1, 0x7d, 0xc5, 0x0d, 0xe6,
+ 0x49, 0x59, 0xce, 0x01, 0xab, 0x69, 0xff, 0xcd, 0x4c, 0x7f, 0x6c, 0xf4,
+ 0xc6, 0x0d, 0x57, 0xfe, 0x28, 0xcc, 0x73, 0x10, 0x8f, 0x2d, 0xed, 0x3b,
+ 0x33, 0x5f, 0xee, 0xe0, 0x31, 0x7c, 0xd7, 0x80, 0xc1, 0x10, 0x23, 0xba,
+ 0xe2, 0xec, 0x50, 0x1f, 0xf1, 0x49, 0x40, 0xfe, 0x06, 0xd1, 0x84, 0x30,
+ 0xf5, 0xd4, 0xdc, 0x87, 0xf1, 0xee, 0xf7, 0xfd, 0xd3, 0xfe, 0x06, 0x6f,
+ 0xf5, 0xce, 0x96, 0xaf, 0xb1, 0x6a, 0xbc, 0xd2, 0xc1, 0xcd, 0x60, 0x19,
+ 0x15, 0x3d, 0x81, 0xba, 0x06, 0x84, 0x48, 0x21, 0x4f, 0xf6, 0xdd, 0x35,
+ 0xcd, 0xf7, 0x2e, 0x3d, 0x04, 0x7f, 0xd3, 0x84, 0xc9, 0x61, 0x21, 0x2f,
+ 0xe9, 0xd7, 0x6e, 0xae, 0x43, 0x35, 0x38, 0x46, 0x14, 0xcd, 0xe7, 0x86,
+ 0x8a, 0x0f, 0xc9, 0x9f, 0xdc, 0x6a, 0x18, 0x66, 0x37, 0x2d, 0x54, 0x3f,
+ 0xbf, 0x1f, 0x24, 0xd7, 0xd9, 0x0a, 0x5c, 0x8f, 0x05, 0x3e, 0xec, 0x81,
+ 0x07, 0xf1, 0xc3, 0xdb, 0xff, 0x7f, 0x52, 0xec, 0x62, 0xaa, 0xad, 0x4c,
+ 0x8e, 0x65, 0xc6, 0xc4, 0x0e, 0xdd, 0x9e, 0x56, 0x1a, 0xa6, 0x66, 0xad,
+ 0x7a, 0x43, 0xe4, 0xfb, 0x39, 0x09, 0x7b, 0x7f, 0x32, 0x6a, 0xbb, 0xdd,
+ 0x6c, 0x43, 0x48, 0x7e, 0x95, 0x51, 0x82, 0xdc, 0x84, 0x62, 0x50, 0x0b,
+ 0x7c, 0x3d, 0xfa, 0x3c, 0x35, 0x97, 0x01, 0xd7, 0x9b, 0xc4, 0xe2, 0x20,
+ 0x40, 0x2f, 0xb7, 0x03, 0x08, 0xda, 0x88, 0x29, 0x10, 0xc9, 0xb7, 0x64,
+ 0xba, 0x5d, 0xd6, 0x9e, 0xa5, 0x18, 0xd6, 0x8e, 0xf6, 0x97, 0x70, 0x1d,
+ 0xdb, 0x32, 0x29, 0x36, 0x79, 0xc2, 0x37, 0xc2, 0xdc, 0x1c, 0x4a, 0x04,
+ 0xba, 0x9f, 0x8d, 0x74, 0xfd, 0x34, 0xd0, 0xd5, 0xf4, 0xee, 0xc7, 0xb2,
+ 0xda, 0x82, 0x7a, 0x6e, 0x4e, 0x36, 0xb1, 0xc4, 0x87, 0xab, 0x59, 0x3d,
+ 0x97, 0x49, 0x3b, 0xa6, 0x98, 0x3b, 0xbd, 0x12, 0xf2, 0x40, 0x44, 0xaa,
+ 0xf1, 0x07, 0x4d, 0xa1, 0xff, 0x98, 0xca, 0xb0, 0x88, 0xae, 0x32, 0xcb,
+ 0xf3, 0x3d, 0x7e, 0x12, 0x2c, 0x2f, 0x8c, 0x75, 0x83, 0x6b, 0x4d, 0x66,
+ 0x3f, 0x93, 0x91, 0xd4, 0x73, 0x76, 0x0c, 0x2a, 0xed, 0x6a, 0xb0, 0x86,
+ 0x44, 0xfa, 0xe7, 0x1c, 0x89, 0x5b, 0x70, 0x33, 0x9c, 0x2f, 0x2b, 0xa9,
+ 0x3c, 0x9b, 0x58, 0xef, 0x60, 0xa0, 0x8b, 0xbb, 0x58, 0xda, 0x04, 0x38,
+ 0x10, 0x3a, 0x6c, 0x88, 0x64, 0x24, 0x97, 0x60, 0x04, 0x90, 0x9e, 0x72,
+ 0x97, 0x0d, 0x03, 0xf0, 0xf7, 0xfa, 0x26, 0xbf, 0xd7, 0xd1, 0x33, 0xa4,
+ 0x6f, 0x2b, 0xb9, 0xd0, 0xf7, 0x0b, 0xaf, 0xd7, 0x2c, 0x23, 0xb9, 0xfe,
+ 0x66, 0x46, 0x18, 0x6e, 0xb7, 0x0f, 0xdb, 0x93, 0x1b, 0x67, 0x86, 0xa6,
+ 0xb2, 0x57, 0x9b, 0x8f, 0xe0, 0xf2, 0x37, 0x4e, 0x09, 0xb6, 0x0b, 0x11,
+ 0xc7, 0x0c, 0x7d, 0x18, 0x57, 0x8b, 0xc4, 0x1f, 0xaa, 0x1b, 0x75, 0x9a,
+ 0xb7, 0x27, 0x8d, 0x59, 0x3b, 0xbb, 0x99, 0x30, 0xbb, 0x85, 0xde, 0x8f,
+ 0x22, 0x82, 0xa6, 0x50, 0xae, 0x48, 0xcb, 0x1e, 0x32, 0x3a, 0x22, 0x1f,
+ 0xed, 0x2a, 0x24, 0x47, 0x64, 0xd9, 0x66, 0x7a, 0x9a, 0xa5, 0x59, 0xfa,
+ 0x9f, 0x64, 0xd2, 0xc2, 0x65, 0x07, 0x0b, 0x82, 0xe7, 0xa7, 0x1e, 0x5f,
+ 0xed, 0x91, 0x9d, 0xc3, 0x79, 0x7f, 0x1a, 0xc9, 0x58, 0x6a, 0xfc, 0xe2,
+ 0x41, 0xf4, 0x3b, 0xdf, 0x3d, 0x0a, 0xb2, 0x2d, 0x46, 0x27, 0x57, 0x0f,
+ 0xfb, 0xc4, 0x36, 0x90, 0x66, 0xbf, 0x10, 0x14, 0x33, 0xed, 0x1d, 0xba,
+ 0xe7, 0xe5, 0xcb, 0x4c, 0xf5, 0xc6, 0x55, 0x18, 0x13, 0xba, 0xc5, 0xa1,
+ 0xac, 0xf6, 0xe2, 0x79, 0xd6, 0xb7, 0xb3, 0x8d, 0x93, 0x0d, 0xa0, 0x78,
+ 0x9e, 0xc0, 0x33, 0x08, 0x74, 0x7b, 0x57, 0xef, 0x29, 0xa0, 0x54, 0xdf,
+ 0xf6, 0x60, 0x63, 0xde, 0x5a, 0x2e, 0x9b, 0xf9, 0xf9, 0x24, 0x65, 0x78,
+ 0x86, 0xb7, 0xc1, 0xa7, 0xd8, 0x36, 0xe2, 0x9d, 0x42, 0xee, 0x76, 0xcd,
+ 0x00, 0x77, 0x90, 0xec, 0x5f, 0xc2, 0x1e, 0xd8, 0x2f, 0x4a, 0x31, 0x05,
+ 0x62, 0xd4, 0x2a, 0x8e, 0x33, 0x63, 0xce, 0xce, 0x16, 0x88, 0x50, 0x3f,
+ 0x26, 0x7d, 0x44, 0xad, 0xd9, 0xc5, 0xf4, 0xd3, 0xe7, 0x69, 0xfd, 0xb3,
+ 0x66, 0x76, 0x5f, 0xd5, 0x5d, 0xf7, 0x54, 0x77, 0xf9, 0x3c, 0x8c, 0xc0,
+ 0x61, 0x30, 0x54, 0x9a, 0x8b, 0x48, 0x92, 0x18, 0xdb, 0x96, 0x2b, 0xc7,
+ 0x84, 0x75, 0x10, 0x69, 0x61, 0x52, 0x6d, 0x1f, 0x1a, 0x2f, 0x09, 0x4b,
+ 0x07, 0x10, 0xec, 0x46, 0x1f, 0x97, 0x8f, 0xe7, 0x94, 0x82, 0x6b, 0x8f,
+ 0x72, 0x7d, 0x12, 0xca, 0x5a, 0x85, 0xec, 0x62, 0x62, 0x84, 0xba, 0x38,
+ 0xf5, 0xf4, 0x94, 0x3b, 0x63, 0xd9, 0xeb, 0x36, 0xb3, 0x9e, 0xbe, 0x76,
+ 0xb6, 0xa0, 0x0b, 0x76, 0x40, 0x4a, 0x84, 0xc0, 0x70, 0x3e, 0x0a, 0x1c,
+ 0x6f, 0x02, 0x55, 0x7d, 0x94, 0x0e, 0x1a, 0x3e, 0x8a, 0x5e, 0xf2, 0xc9,
+ 0xcb, 0xfd, 0x6b, 0xf1, 0xe4, 0xcf, 0xca, 0xa6, 0x26, 0x69, 0xc5, 0xba,
+ 0xdb, 0xa6, 0x54, 0x25, 0x44, 0xe0, 0x46, 0xaf, 0x06, 0xff, 0x05, 0x38,
+ 0x23, 0xb9, 0xfa, 0xf5, 0x63, 0xf8, 0x1c, 0x2d, 0xcd, 0x47, 0x03, 0xd9,
+ 0x38, 0x61, 0xbb, 0xcb, 0x84, 0x75, 0x2e, 0xf8, 0x77, 0x5d, 0x5a, 0x19,
+ 0x73, 0xbe, 0xb6, 0x06, 0x5a, 0x28, 0xc2, 0xc6, 0x49, 0xfd, 0xf0, 0xad,
+ 0x54, 0xc9, 0xbd, 0x1b, 0xd3, 0x24, 0x01, 0x42, 0x63, 0x75, 0x5b, 0xe4,
+ 0xce, 0x94, 0x61, 0x15, 0x05, 0xd5, 0x8e, 0x7a, 0xa3, 0xc7, 0xd7, 0x6f,
+ 0xbc, 0x61, 0xf6, 0x96, 0x59, 0xc8, 0x7b, 0x7f, 0x2c, 0x63, 0x8e, 0x17,
+ 0xbc, 0x34, 0x2f, 0xfd, 0xf8, 0x2a, 0x51, 0x8a, 0x89, 0x2e, 0xa1, 0xdc,
+ 0x7e, 0xa9, 0xb5, 0xc7, 0xc6, 0x1f, 0xb4, 0x0d, 0x31, 0x85, 0x2d, 0x05,
+ 0x71, 0x1e, 0xeb, 0xdf, 0xda, 0xed, 0x55, 0x84, 0xd3, 0xf9, 0x3e, 0x1f,
+ 0xb7, 0x71, 0x58, 0x93, 0x68, 0x3b, 0xd8, 0x76, 0xc3, 0x0e, 0xee, 0xb6,
+ 0x35, 0x87, 0x10, 0x2e, 0x56, 0x70, 0x1f, 0x68, 0x1a, 0x2b, 0x38, 0x00,
+ 0x97, 0x5f, 0xdf, 0x8c, 0x43, 0x5e, 0xc8, 0x6b, 0xbe, 0xfd, 0x5c, 0x6d,
+ 0xa5, 0x38, 0x8a, 0x2f, 0x63, 0x77, 0xb6, 0x42, 0xbb, 0x7f, 0x65, 0xd6,
+ 0xeb, 0xe3, 0x96, 0x40, 0xd3, 0xee, 0x09, 0xd7, 0xa9, 0xad, 0x17, 0xb3,
+ 0xa9, 0x1e, 0xff, 0x5e, 0xcb, 0x5f, 0xfe, 0xcb, 0x03, 0xf8, 0x4e, 0x6f,
+ 0xd7, 0xbd, 0x89, 0x4c, 0x05, 0xa5, 0x6c, 0x77, 0xb3, 0x71, 0x37, 0x0b,
+ 0x79, 0x8b, 0xf0, 0x59, 0xfd, 0xff, 0x1f, 0xb8, 0x69, 0x6d, 0xdb, 0x09,
+ 0x13, 0x75, 0xc2, 0x31, 0x9a, 0xd7, 0x9f, 0x69, 0x2b, 0xff, 0x42, 0x16,
+ 0x51, 0xcd, 0x25, 0x83, 0x7d, 0xdf, 0x6e, 0x27, 0x14, 0x28, 0xae, 0xb5,
+ 0x85, 0x01, 0x9d, 0x84, 0x54, 0x99, 0x46, 0xa6, 0xcb, 0x36, 0xfa, 0x36,
+ 0xe7, 0xf0, 0x03, 0xc0, 0x30, 0x5e, 0xc6, 0xbe, 0x29, 0x1a, 0x5a, 0xeb,
+ 0x43, 0x47, 0x31, 0xdd, 0x43, 0x7b, 0x84, 0xbb, 0x28, 0xe3, 0xe2, 0x5c,
+ 0x2d, 0xdc, 0x15, 0x88, 0x58, 0x0a, 0xbf, 0xe0, 0xf0, 0x16, 0xf6, 0x79,
+ 0x72, 0x5e, 0x23, 0x8c, 0xb0, 0xb9, 0x0e, 0xb6, 0xbe, 0x35, 0xe4, 0xe1,
+ 0x60, 0x5e, 0xe2, 0xd6, 0xb4, 0x31, 0xc6, 0x49, 0xfe, 0xd4, 0x72, 0x47,
+ 0xd8, 0xff, 0xf5, 0x6e, 0x19, 0xe6, 0x2c, 0x41, 0x19, 0xd2, 0xd3, 0x17,
+ 0xb6, 0xd8, 0x90, 0xad, 0xee, 0x1f, 0x14, 0x0c, 0xee, 0xa1, 0x1d, 0x6b,
+ 0x2d, 0xe9, 0x77, 0x7f, 0xd9, 0xc6, 0xf5, 0xf1, 0x30, 0x08, 0x82, 0xf4,
+ 0xb2, 0x56, 0x65, 0xc4, 0xf3, 0xbf, 0x8b, 0x7e, 0xe6, 0xbd, 0x4f, 0x55,
+ 0xd7, 0xfe, 0xe9, 0x04, 0x73, 0x4b, 0x66, 0xa5, 0x87, 0xe9, 0x7a, 0x36,
+ 0x30, 0x30, 0xe9, 0x36, 0x83, 0xe3, 0x14, 0x57, 0xe3, 0xa0, 0xc3, 0x7a,
+ 0xc3, 0x4f, 0x38, 0x0d, 0x04, 0x56, 0x9e, 0x4b, 0x30, 0xbd, 0xba, 0x7f,
+ 0xd9, 0x2b, 0xdc, 0x45, 0xcb, 0xb5, 0xaf, 0x01, 0xc2, 0x29, 0x09, 0x3e,
+ 0x40, 0xbf, 0xcd, 0xaa, 0x7e, 0xe0, 0xbe, 0x9c, 0x8d, 0xde, 0x09, 0x35,
+ 0xb5, 0xd6, 0x40, 0x1b, 0xcc, 0xc8, 0xaf, 0x75, 0x33, 0xd9, 0x10, 0xe2,
+ 0x55, 0x42, 0x09, 0xca, 0x74, 0x35, 0xb6, 0xd0, 0x19, 0xba, 0xda, 0x47,
+ 0xbd, 0x42, 0x19, 0x92, 0x7d, 0x8f, 0x6e, 0xc4, 0x91, 0x76, 0x13, 0xf0,
+ 0x2c, 0xd6, 0xa0, 0x5c, 0x9e, 0xff, 0x28, 0x97, 0xd3, 0x57, 0x63, 0xe5,
+ 0x20, 0x9c, 0x1e, 0x31, 0x45, 0x3f, 0xec, 0x1a, 0xd8, 0xff, 0xd0, 0xc2,
+ 0xef, 0x22, 0xed, 0xc7, 0xee, 0x8c, 0xc5, 0xa2, 0xd6, 0xad, 0x38, 0x0f,
+ 0xc2, 0xe3, 0xdf, 0x72, 0x35, 0xe9, 0xe1, 0xeb, 0x2f, 0xb8, 0xf5, 0x18,
+ 0xe1, 0x6d, 0xe2, 0x22, 0x24, 0x42, 0xf1, 0x18, 0x2e, 0xf5, 0x7b, 0xff,
+ 0xf2, 0x17, 0xd1, 0x8a, 0x51, 0x25, 0x55, 0x82, 0xbd, 0xb5, 0xa2, 0x78,
+ 0x76, 0x32, 0xe0, 0xa5, 0x47, 0x2d, 0x5a, 0x88, 0xaa, 0x47, 0xde, 0x06,
+ 0xb8, 0xec, 0x76, 0xbc, 0x88, 0x1b, 0xc8, 0x7d, 0x9c, 0xe7, 0x9d, 0x6d,
+ 0xe3, 0x09, 0xd3, 0xc8, 0xeb, 0x78, 0x1c, 0xc3, 0x00, 0xe5, 0x17, 0x49,
+ 0xfd, 0xf3, 0x6d, 0x84, 0x21, 0xcc, 0x6f, 0xbb, 0x8b, 0xdb, 0xc0, 0x56,
+ 0x90, 0x0e, 0x32, 0xbd, 0xa5, 0xed, 0xd5, 0xb5, 0xf3, 0xd1, 0x37, 0x2d,
+ 0x6f, 0x47, 0xd7, 0xba, 0xb7, 0xbf, 0x58, 0x09, 0xbe, 0x07, 0x46, 0x96,
+ 0xd4, 0xcc, 0xcb, 0xfd, 0x6a, 0xa0, 0x56, 0x39, 0xea, 0xe4, 0x67, 0xc1,
+ 0xc6, 0x0a, 0xb3, 0x55, 0xb8, 0xb3, 0xc1, 0x99, 0xbf, 0x52, 0x23, 0x84,
+ 0x63, 0x31, 0xeb, 0xfc, 0x53, 0x5d, 0x58, 0x2a, 0x00, 0x00, 0xaa, 0x5a,
+ 0x11, 0xc2, 0x30, 0x54, 0xb6, 0x2f, 0xba, 0x10, 0xe5, 0x3e, 0xf3, 0xb7,
+ 0x46, 0xbd, 0xbe, 0x8e, 0x08, 0xf6, 0x89, 0xf1, 0x18, 0x05, 0x95, 0xba,
+ 0x2d, 0xad, 0xaf, 0x64, 0x58, 0x98, 0x86, 0x6d, 0xa7, 0x48, 0xbb, 0xf1,
+ 0xb4, 0xab, 0x14, 0xa1, 0x09, 0x98, 0xcc, 0x9f, 0xcb, 0x7f, 0xba, 0x39,
+ 0xb5, 0x8d, 0x93, 0xd7, 0x03, 0x48, 0x86, 0x29, 0x7c, 0x69, 0x17, 0xc5,
+ 0xa6, 0xa0, 0xe5, 0xce, 0x90, 0x8a, 0x7d, 0xd7, 0xb8, 0xf7, 0x55, 0x63,
+ 0x06, 0x88, 0xe8, 0x04, 0x51, 0x88, 0xf8, 0x8b, 0xb5, 0x99, 0x2b, 0x7d,
+ 0x52, 0x5d, 0x23, 0x2d, 0xa2, 0x19, 0xcd, 0x31, 0x55, 0x30, 0x3e, 0xd4,
+ 0x8a, 0xfb, 0x6a, 0x5b, 0x99, 0xb7, 0xfb, 0xc1, 0x03, 0x98, 0xf0, 0x53,
+ 0x5c, 0xb1, 0x5e, 0x4b, 0x47, 0x8a, 0x9c, 0x21, 0xeb, 0x77, 0x44, 0x96,
+ 0xc3, 0x4f, 0x56, 0x01, 0x65, 0x7e, 0x93, 0x37, 0xaa, 0x0e, 0x97, 0xce,
+ 0x3d, 0xf2, 0xb1, 0x69, 0x93, 0x5e, 0x95, 0x6f, 0xe9, 0x27, 0xbc, 0x9c,
+ 0x45, 0xa5, 0x16, 0xec, 0xb4, 0xc8, 0xfa, 0x41, 0x0e, 0x6e, 0x79, 0x0a,
+ 0x0f, 0x6d, 0x9d, 0x6e, 0x4c, 0x07, 0x6b, 0x35, 0x6f, 0x0c, 0x4c, 0x65,
+ 0x2f, 0x48, 0x87, 0x3e, 0x47, 0x41, 0x9d, 0x5e, 0xe4, 0x7a, 0xd1, 0x54,
+ 0xd2, 0xd6, 0x45, 0x04, 0x4d, 0xde, 0xb2, 0x1f, 0x3f, 0x91, 0xac, 0x15,
+ 0x3a, 0x38, 0xf8, 0x6e, 0xe5, 0x29, 0xc6, 0x96, 0xa4, 0x61, 0xae, 0xf6,
+ 0x52, 0x89, 0x63, 0x96, 0x7d, 0xd5, 0x5d, 0x07, 0x15, 0x18, 0x11, 0xba,
+ 0x07, 0x59, 0xb4, 0xe4, 0x10, 0x5b, 0xfe, 0x08, 0x3e, 0xab, 0xad, 0xfc,
+ 0x32, 0x70, 0x84, 0xa4, 0xdc, 0x69, 0x69, 0xc9, 0x10, 0xb8, 0x1a, 0x7b,
+ 0x55, 0xd9, 0x44, 0xe5, 0x53, 0xf5, 0x2c, 0x46, 0x82, 0x1d, 0xac, 0xfd,
+ 0x6f, 0xc4, 0x65, 0x12, 0x69, 0xc7, 0x2a, 0x85, 0x95, 0x77, 0x54, 0x23,
+ 0x7b, 0xdd, 0x7c, 0x55, 0x76, 0x9e, 0x17, 0x66, 0x3b, 0xda, 0xf7, 0xd1,
+ 0xf0, 0x7a, 0xd4, 0x28, 0x07, 0x10, 0x8d, 0x5b, 0xab, 0x63, 0x91, 0x3b,
+ 0x6e, 0xa6, 0xa2, 0xae, 0x10, 0x87, 0x4b, 0xe2, 0x82, 0x1b, 0xfa, 0x12,
+ 0xb8, 0xff, 0xaf, 0x0f, 0x57, 0xa9, 0x01, 0x98, 0xc0, 0x2f, 0x6b, 0x71,
+ 0x1e, 0xc3, 0x63, 0x40, 0x4f, 0x3a, 0xf8, 0xd1, 0x68, 0x50, 0x58, 0x64,
+ 0x5f, 0x97, 0xe8, 0x3d, 0x7c, 0xcf, 0x71, 0x55, 0xcf, 0x7b, 0xea, 0xf5,
+ 0x97, 0x2a, 0x45, 0x6d, 0xcb, 0x7f, 0xc6, 0x74, 0x27, 0x9f, 0xc4, 0xea,
+ 0x30, 0x3d, 0x1a, 0x05, 0x88, 0x90, 0xcf, 0x0e, 0x7f, 0xdf, 0xcd, 0xe5,
+ 0x09, 0x8b, 0x4f, 0x0f, 0x83, 0xe9, 0x74, 0x47, 0x76, 0x5f, 0x9b, 0xd4,
+ 0x01, 0x14, 0x4c, 0x96, 0xcb, 0x9c, 0xde, 0x02, 0xc9, 0x95, 0x4e, 0x7b,
+ 0x97, 0x8a, 0x90, 0x62, 0x68, 0x52, 0x05, 0x61, 0xc8, 0x25, 0x89, 0x95,
+ 0x90, 0xd8, 0x08, 0xe8, 0xa6, 0xf9, 0x66, 0x94, 0x7c, 0xad, 0xe9, 0x3e,
+ 0x32, 0x0f, 0xe3, 0xac, 0x2d, 0xd0, 0x3b, 0xc7, 0x56, 0x01, 0x52, 0x3c,
+ 0x61, 0x51, 0x0b, 0xb3, 0x66, 0x75, 0x80, 0xe1, 0x6b, 0xd8, 0x95, 0xea,
+ 0x88, 0x90, 0x69, 0x43, 0x69, 0xd6, 0xc5, 0x04, 0x39, 0x6c, 0xe4, 0x0a,
+ 0x7c, 0x54, 0xcb, 0xcb, 0x35, 0x7c, 0xbe, 0x8c, 0x8f, 0x3c, 0xb0, 0x16,
+ 0x6f, 0xa6, 0x60, 0x52, 0xca, 0x0f, 0x1d, 0x23, 0x87, 0x38, 0x44, 0xbd,
+ 0x4e, 0xd7, 0xb8, 0x07, 0x2d, 0xc9, 0xdd, 0x45, 0xea, 0xca, 0x0c, 0x0e,
+ 0x2f, 0x6a, 0x28, 0xad, 0x94, 0xde, 0xc3, 0x8a, 0xce, 0x97, 0x9b, 0xb0,
+ 0x03, 0xe0, 0x3d, 0xb9, 0xc9, 0xe9, 0x1a, 0x69, 0xa6, 0xf7, 0xcb, 0x29,
+ 0x6a, 0xe7, 0xb4, 0xfa, 0xc5, 0xad, 0x45, 0xe2, 0x32, 0x73, 0xb2, 0x2e,
+ 0x0b, 0xc1, 0xf3, 0xbe, 0x54, 0xb6, 0xf5, 0xc4, 0xda, 0x15, 0x8a, 0x1f,
+ 0x90, 0x8b, 0x7a, 0x62, 0x77, 0x70, 0x01, 0xc6, 0x60, 0xbc, 0x90, 0x87,
+ 0x64, 0x3f, 0xea, 0x56, 0x6d, 0xe2, 0x53, 0xa0, 0x3c, 0xee, 0x41, 0x0c,
+ 0x37, 0xeb, 0x7e, 0x2e, 0x0a, 0xec, 0x73, 0x02, 0x09, 0xce, 0xbd, 0x04,
+ 0x0e, 0xfc, 0x05, 0x9f, 0x0e, 0xdf, 0x80, 0x17, 0x50, 0xb9, 0xe3, 0xb9,
+ 0x4f, 0xff, 0x19, 0xc5, 0x6b, 0x74, 0x43, 0xdc, 0x2b, 0x00, 0xdc, 0xca,
+ 0x26, 0x97, 0xae, 0x9f, 0x39, 0xb3, 0x4f, 0x56, 0x60, 0x5f, 0x8b, 0x24,
+ 0x16, 0x69, 0xff, 0x4c, 0xe9, 0x2e, 0x91, 0x48, 0xa6, 0x09, 0xda, 0xcf,
+ 0x72, 0x56, 0x45, 0xb7, 0x29, 0x87, 0x78, 0xbb, 0x29, 0xe0, 0x78, 0x04,
+ 0xfd, 0xad, 0x91, 0x77, 0xe5, 0xe9, 0xd9, 0x42, 0x16, 0xbf, 0xfb, 0x14,
+ 0xb7, 0x54, 0xd1, 0x56, 0x4d, 0x4f, 0x0c, 0x42, 0x02, 0x9a, 0xdc, 0xea,
+ 0x21, 0x7a, 0x24, 0x7c, 0x1b, 0xbf, 0x74, 0x3c, 0x39, 0x1f, 0x96, 0x34,
+ 0x6e, 0xaa, 0x7b, 0xcb, 0x5f, 0x11, 0x72, 0x76, 0x96, 0x62, 0x17, 0xd8,
+ 0x28, 0x4d, 0x32, 0x19, 0x74, 0x0f, 0xb0, 0x59, 0xe8, 0x4d, 0x93, 0x68,
+ 0x3e, 0x38, 0x71, 0x84, 0x6e, 0x80, 0xfc, 0x96, 0x0a, 0x56, 0xfa, 0x3b,
+ 0x93, 0x2d, 0x84, 0x57, 0xb6, 0xac, 0x18, 0xe9, 0x07, 0x07, 0xa8, 0x45,
+ 0xed, 0x54, 0xd3, 0xdf, 0x53, 0x3a, 0x48, 0xcf, 0xbe, 0x49, 0x8f, 0xf8,
+ 0xbb, 0xe4, 0xf8, 0xe1, 0x7e, 0x83, 0xcc, 0xda, 0x26, 0xea, 0xba, 0x99,
+ 0xe4, 0x23, 0x0f, 0xd0, 0xd0, 0x61, 0xd9, 0x6b, 0xa0, 0x9b, 0xa1, 0x2e,
+ 0xcf, 0x0c, 0x7b, 0x8f, 0x8d, 0xd1, 0x29, 0x35, 0x9e, 0x48, 0x9a, 0xdb,
+ 0x64, 0x2f, 0x42, 0x8c, 0x76, 0x24, 0xc8, 0x2c, 0x48, 0xdf, 0x57, 0xdd,
+ 0x3d, 0xb7, 0xd6, 0x4e, 0x0a, 0x04, 0xfe, 0x79, 0x92, 0xb2, 0x48, 0xef,
+ 0x0f, 0xf4, 0x91, 0xbd, 0xa2, 0x5b, 0x40, 0x9a, 0x8d, 0x48, 0x71, 0xc3,
+ 0x83, 0x85, 0x63, 0x22, 0x17, 0x0a, 0x7a, 0xd8, 0xa0, 0x40, 0x57, 0xf9,
+ 0x93, 0x66, 0xf4, 0xef, 0xd5, 0xc9, 0xcc, 0x90, 0x5b, 0x45, 0x6e, 0x85,
+ 0xe8, 0xa3, 0x06, 0xb0, 0xfe, 0x73, 0x2c, 0x5b, 0x93, 0x9a, 0x57, 0x73,
+ 0x65, 0x95, 0x7d, 0xef, 0x18, 0x9d, 0xed, 0x6d, 0x12, 0x34, 0xec, 0xfa,
+ 0xdd, 0xc5, 0x42, 0x2d, 0x24, 0xf6, 0x78, 0x64, 0x58, 0x88, 0xf5, 0x7d,
+ 0xc6, 0xf0, 0x13, 0xe1, 0xa8, 0x37, 0x81, 0x03, 0x54, 0x9c, 0x40, 0xfd,
+ 0x0c, 0x8d, 0x6c, 0x4f, 0xf9, 0x2a, 0x4e, 0x8f, 0x43, 0xe3, 0x24, 0x60,
+ 0x01, 0x9d, 0x43, 0x39, 0x4f, 0xbf, 0xc7, 0x91, 0xcf, 0x3e, 0xe9, 0xa9,
+ 0xb4, 0xbb, 0x9d, 0xe7, 0xc0, 0x2d, 0xc1, 0x51, 0x94, 0xec, 0x91, 0x9e,
+ 0x14, 0x3f, 0xae, 0xd2, 0x27, 0xa8, 0x8c, 0x83, 0x5b, 0x6d, 0xba, 0x11,
+ 0xc4, 0x4b, 0xc9, 0x47, 0xad, 0x94, 0x48, 0x0e, 0x29, 0xfa, 0x42, 0x45,
+ 0x1a, 0x71, 0xba, 0x65, 0xf8, 0x89, 0x69, 0xcc, 0x64, 0xd0, 0x50, 0xfc,
+ 0x9c, 0xc5, 0x33, 0x1b, 0x65, 0x88, 0x30, 0xf7, 0xca, 0x64, 0x05, 0x5a,
+ 0xc9, 0x30, 0x79, 0x99, 0x3b, 0x79, 0xca, 0x37, 0x84, 0x02, 0x60, 0x3b,
+ 0x69, 0x43, 0x55, 0x95, 0x37, 0x10, 0x25, 0xa4, 0xdd, 0xfe, 0xdf, 0x70,
+ 0xbf, 0xa8, 0xaa, 0x7c, 0x0a, 0xf9, 0x77, 0x64, 0x00, 0x48, 0xdf, 0x0e,
+ 0xf3, 0x99, 0xf6, 0x75, 0x76, 0xac, 0xe6, 0xa9, 0x5b, 0x7d, 0x64, 0x90,
+ 0xe3, 0xb6, 0x2d, 0x88, 0x03, 0x33, 0x95, 0x2a, 0x49, 0xda, 0xd5, 0xa7,
+ 0x99, 0xaf, 0xee, 0x81, 0xba, 0x9d, 0x82, 0xf6, 0x93, 0x24, 0xf1, 0xdb,
+ 0x26, 0x41, 0x1a, 0x1c, 0xfc, 0x38, 0x49, 0xb3, 0xa1, 0x97, 0xb0, 0x1d,
+ 0x5a, 0x7f, 0x2a, 0xb0, 0x3e, 0xfa, 0x3b, 0x02, 0x34, 0xc8, 0x39, 0xc4,
+ 0x02, 0x66, 0x91, 0xd9, 0xc2, 0x4e, 0x02, 0x27, 0x52, 0x90, 0x13, 0xaa,
+ 0x41, 0xfa, 0xae, 0xd5, 0xdc, 0xab, 0xc9, 0xdd, 0x9a, 0xa7, 0x17, 0xdd,
+ 0x41, 0x3e, 0xca, 0x0f, 0x19, 0x07, 0x33, 0x94, 0xd7, 0xbf, 0x15, 0x47,
+ 0x39, 0x20, 0x1e, 0x7d, 0x9c, 0x88, 0x64, 0xd4, 0x0c, 0x95, 0xb6, 0x02,
+ 0x9f, 0x87, 0x95, 0xba, 0x0e, 0x00, 0x3d, 0x94, 0xb3, 0x28, 0x16, 0xb7,
+ 0xeb, 0x3e, 0x86, 0x59, 0xae, 0x1e, 0xb9, 0xbc, 0x95, 0xbf, 0x50, 0xd5,
+ 0x39, 0x9c, 0xe6, 0x74, 0xcd, 0xba, 0x1b, 0x03, 0xa6, 0xf6, 0xc3, 0xfa,
+ 0x58, 0x36, 0x01, 0x81, 0xfa, 0xfa, 0xb4, 0xdf, 0x49, 0xb5, 0x77, 0x34,
+ 0xcb, 0x56, 0xc7, 0x14, 0x98, 0xb0, 0x8d, 0xb9, 0x52, 0x6d, 0x94, 0x5e,
+ 0x5f, 0x0d, 0x31, 0xe1, 0x4c, 0x22, 0x75, 0x4a, 0x95, 0x78, 0x1a, 0x70,
+ 0xbe, 0x5e, 0x22, 0xe6, 0x27, 0x7d, 0x65, 0x8e, 0xff, 0xb5, 0x0a, 0x1f,
+ 0x24, 0x30, 0x1d, 0x23, 0x3a, 0x5e, 0x3d, 0xd8, 0xfe, 0x00, 0x83, 0x75,
+ 0xa2, 0x8c, 0x6f, 0x09, 0x59, 0x4f, 0x68, 0x45, 0x69, 0xde, 0xe0, 0xbf,
+ 0x95, 0x9a, 0x12, 0x8e, 0x22, 0x72, 0x66, 0xf7, 0x0e, 0xf1, 0x8c, 0x20,
+ 0x34, 0x9a, 0xdb, 0x9f, 0xfa, 0xf7, 0xac, 0x65, 0x91, 0xb0, 0x73, 0x1f,
+ 0x88, 0x73, 0xef, 0x2a, 0xe4, 0x81, 0x61, 0x5b, 0x20, 0xef, 0x43, 0xba,
+ 0xfb, 0x56, 0xa7, 0x9d, 0x12, 0xb1, 0xdd, 0xb1, 0x9e, 0x75, 0xa4, 0x71,
+ 0xe0, 0x5f, 0x74, 0x56, 0x61, 0x6a, 0x15, 0x5f, 0x03, 0x36, 0xf9, 0x88,
+ 0x3e, 0xbb, 0xc1, 0x67, 0xfd, 0x4f, 0xc2, 0x2e, 0x9c, 0xcf, 0x5c, 0x7b,
+ 0xd5, 0x3a, 0x32, 0xa6, 0xef, 0xad, 0x7e, 0x9f, 0x84, 0xe7, 0xb7, 0x36,
+ 0x21, 0x68, 0x79, 0x1e, 0xbc, 0x24, 0x8c, 0xf9, 0x92, 0xb4, 0x90, 0x18,
+ 0xe3, 0x7a, 0x6e, 0xe4, 0xa7, 0xf2, 0x16, 0xc0, 0x62, 0x92, 0x2b, 0x19,
+ 0xd7, 0x65, 0x26, 0xde, 0x0b, 0x51, 0x8a, 0xbf, 0x64, 0xe0, 0xf0, 0x57,
+ 0xe8, 0x4f, 0x1f, 0x1a, 0x24, 0x4c, 0x73, 0x9c, 0xac, 0xf0, 0x8c, 0x40,
+ 0x8a, 0x23, 0xf8, 0x5b, 0x46, 0x70, 0x63, 0x78, 0x6c, 0x13, 0x38, 0x75,
+ 0x0e, 0xb9, 0x34, 0xb6, 0x72, 0x1c, 0xff, 0x8c, 0x6a, 0xcf, 0x8a, 0x55,
+ 0x29, 0x5e, 0xc6, 0x3a, 0x85, 0x01, 0x40, 0x1d, 0x13, 0x70, 0xd4, 0xa6,
+ 0x69, 0x69, 0xcf, 0x39, 0xa2, 0x7a, 0x06, 0xe0, 0x5b, 0xc5, 0xe4, 0x85,
+ 0xb8, 0x6a, 0xc7, 0xa0, 0x0b, 0x9d, 0x0e, 0xf5, 0xa2, 0xc4, 0xd4, 0x1c,
+ 0xc7, 0x8f, 0x53, 0x06, 0xf5, 0x2a, 0xb0, 0x92, 0x57, 0x55, 0xd6, 0xf0,
+ 0xc3, 0x05, 0xb9, 0x73, 0x77, 0xb1, 0xdd, 0x1f, 0xb1, 0xeb, 0xb5, 0xa3,
+ 0x35, 0xdc, 0x44, 0x1b, 0x74, 0x85, 0x62, 0x46, 0xce, 0x5e, 0xde, 0x91,
+ 0x1b, 0x21, 0x6d, 0xa6, 0xc1, 0x34, 0x7d, 0xb8, 0x06, 0x86, 0xfc, 0x72,
+ 0x31, 0xcf, 0xd0, 0x83, 0xd8, 0xaa, 0xdd, 0xf4, 0x38, 0x6f, 0x32, 0x16,
+ 0x5f, 0x86, 0x8c, 0xf0, 0xd4, 0x76, 0xdc, 0xd1, 0x37, 0xdb, 0xc5, 0x75,
+ 0xda, 0xd4, 0xf9, 0xd7, 0x3f, 0xa1, 0x98, 0x9f, 0xd6, 0xb8, 0x2d, 0xaa,
+ 0xb3, 0x24, 0xc0, 0xb3, 0x87, 0xa2, 0x8b, 0x34, 0x8f, 0x1b, 0x64, 0x0d,
+ 0x1a, 0xf3, 0x60, 0x85, 0x34, 0x97, 0xac, 0xe8, 0xf3, 0xb4, 0x0b, 0x25,
+ 0x6e, 0x58, 0xea, 0x12, 0x22, 0x0b, 0x03, 0x7b, 0xbe, 0xc9, 0xb0, 0x49,
+ 0x92, 0xc6, 0x03, 0x25, 0xd1, 0x99, 0xdd, 0x44, 0x8c, 0xe3, 0xec, 0x7c,
+ 0x46, 0x4a, 0x0a, 0x2d, 0xed, 0x65, 0x5f, 0x55, 0x51, 0xd6, 0x60, 0xcd,
+ 0x38, 0xb9, 0xe8, 0xaa, 0x49, 0x02, 0x22, 0x18, 0x91, 0x5d, 0x9a, 0x32,
+ 0x37, 0x6c, 0xa7, 0x82, 0x3e, 0x69, 0xbc, 0x7e, 0xc6, 0x72, 0xa6, 0x97,
+ 0xa2, 0x1c, 0x2d, 0xdb, 0x03, 0xe0, 0x6d, 0xeb, 0x64, 0xd0, 0xf0, 0x84,
+ 0x7c, 0x9f, 0xed, 0xd4, 0x18, 0xfe, 0x53, 0xf8, 0xab, 0x31, 0xf5, 0x4e,
+ 0xbe, 0xa1, 0x97, 0x8e, 0x76, 0xb5, 0x45, 0x46, 0x08, 0xfa, 0x44, 0x5c,
+ 0x93, 0x4f, 0x7e, 0x84, 0xcd, 0x33, 0xda, 0x9a, 0xca, 0x87, 0x96, 0xd0,
+ 0x01, 0x9e, 0x5f, 0xa1, 0x3e, 0x3a, 0x4d, 0xe1, 0x71, 0xfb, 0x5a, 0x6c,
+ 0xc7, 0xfe, 0x06, 0x91, 0x84, 0x94, 0x00, 0x06, 0xe6, 0xda, 0xa8, 0xd9,
+ 0x08, 0x99, 0x0f, 0xa5, 0x5d, 0x69, 0x2b, 0x2d, 0x47, 0xbd, 0xc6, 0x64,
+ 0xf2, 0xa1, 0xb0, 0x20, 0x4c, 0x54, 0x85, 0xe7, 0x88, 0x5d, 0xd0, 0x2b,
+ 0xea, 0x3e, 0x16, 0xc7, 0x17, 0x1c, 0xb4, 0x6d, 0x49, 0xee, 0x3c, 0x63,
+ 0xe8, 0xe3, 0x67, 0x53, 0x1e, 0xff, 0xca, 0xd2, 0xed, 0x47, 0x13, 0x26,
+ 0x6f, 0x1e, 0x36, 0xc0, 0xb4, 0x9c, 0x6a, 0x9d, 0xf3, 0x58, 0x79, 0x09,
+ 0x60, 0x41, 0x48, 0xaa, 0xac, 0x47, 0x37, 0x2b, 0xec, 0x76, 0x8c, 0x90,
+ 0xc6, 0xd4, 0x5d, 0x0d, 0x7c, 0x8c, 0xc1, 0x26, 0x83, 0x61, 0xc2, 0x0f,
+ 0x33, 0xc2, 0x12, 0x5d, 0xef, 0x69, 0x61, 0x6a, 0x4e, 0x59, 0x0a, 0x5b,
+ 0xac, 0x85, 0xc7, 0x38, 0xf4, 0x3d, 0x7c, 0x35, 0xeb, 0xec, 0xa5, 0xc2,
+ 0x94, 0x83, 0x4a, 0x30, 0xff, 0xcb, 0xe0, 0xb5, 0xbc, 0xf8, 0x80, 0x0d,
+ 0x3e, 0x92, 0x39, 0x44, 0x18, 0x8d, 0x5b, 0xce, 0xf1, 0x1b, 0x22, 0x0c,
+ 0x05, 0xd3, 0xc2, 0x7f, 0xca, 0x32, 0xde, 0x4a, 0x57, 0xc0, 0x31, 0xb6,
+ 0x86, 0xe2, 0x94, 0x19, 0xdc, 0x6c, 0x6f, 0xa0, 0xe2, 0x5d, 0x63, 0xc3,
+ 0xef, 0x4f, 0xbc, 0x03, 0x0c, 0x1c, 0x95, 0x3f, 0xe1, 0x73, 0x4b, 0xea,
+ 0xa2, 0xce, 0x14, 0xb9, 0x99, 0x17, 0x60, 0x58, 0xe9, 0x37, 0x33, 0xc4,
+ 0x3f, 0xf5, 0xa7, 0x98, 0xc8, 0x2e, 0xa6, 0xe5, 0xdb, 0x67, 0x16, 0xff,
+ 0x35, 0x07, 0x7c, 0x50, 0xd7, 0x3e, 0xb4, 0x74, 0xe6, 0x7e, 0xe5, 0xc8,
+ 0xbf, 0x5f, 0x0f, 0xc8, 0x35, 0x8b, 0x52, 0x3e, 0x68, 0xd8, 0xb0, 0x71,
+ 0x31, 0x1f, 0xab, 0x05, 0xde, 0xad, 0x0d, 0x99, 0x9e, 0xf6, 0xff, 0x2b,
+ 0x31, 0x0d, 0xc6, 0x77, 0xdd, 0x98, 0x79, 0x18, 0x9d, 0xdd, 0x4c, 0xef,
+ 0x5f, 0xda, 0xc0, 0xcc, 0x36, 0x1b, 0x7a, 0xe6, 0xb1, 0xb8, 0x50, 0x2c,
+ 0x93, 0x0b, 0x15, 0xe0, 0xe4, 0x85, 0xe7, 0xd2, 0x24, 0xab, 0xda, 0x32,
+ 0x65, 0x55, 0x09, 0x66, 0x21, 0x0c, 0x76, 0x2c, 0xb0, 0xe1, 0xa3, 0x1a,
+ 0x91, 0x8c, 0xd3, 0xf1, 0x27, 0xa7, 0x8a, 0x1e, 0xd9, 0xa2, 0x74, 0x41,
+ 0xeb, 0xb0, 0xcc, 0x85, 0x1d, 0xdc, 0xf1, 0x62, 0x50, 0xc4, 0x00, 0x88,
+ 0x8c, 0xe2, 0xb1, 0x90, 0xbe, 0x68, 0xbd, 0x68, 0xcc, 0xfb, 0x8e, 0xde,
+ 0xc9, 0x0a, 0x51, 0x43, 0x9a, 0x13, 0x28, 0xe0, 0x5b, 0x68, 0x21, 0x4d,
+ 0xba, 0x05, 0xa3, 0xdc, 0x77, 0x4f, 0xd9, 0x92, 0xe8, 0xb6, 0x39, 0xcf,
+ 0x14, 0x76, 0x34, 0x49, 0x72, 0x86, 0xd2, 0x0c, 0xa4, 0x5a, 0x2a, 0x0e,
+ 0xc5, 0x52, 0x4b, 0x20, 0x6f, 0x33, 0xe3, 0xd7, 0xe1, 0x55, 0x4e, 0x8e,
+ 0x4b, 0xc0, 0xef, 0x7b, 0x14, 0x64, 0x91, 0xf2, 0xe2, 0xd3, 0xc9, 0x70,
+ 0xcf, 0x10, 0x2c, 0xf1, 0x04, 0x2f, 0xf5, 0xe3, 0x54, 0x69, 0x08, 0xc1,
+ 0xd3, 0x7f, 0x68, 0x67, 0x05, 0x86, 0xc7, 0x44, 0x66, 0xff, 0x6f, 0xda,
+ 0x3d, 0x36, 0x79, 0xf1, 0xad, 0x46, 0x7f, 0xc9, 0x95, 0x66, 0x12, 0x8c,
+ 0x1b, 0x53, 0xab, 0x91, 0x76, 0x97, 0xbb, 0xfd, 0x46, 0x14, 0x5a, 0xe9,
+ 0xab, 0x60, 0x8b, 0xa2, 0xd2, 0x60, 0x98, 0x21, 0x0c, 0x9a, 0xd1, 0xa1,
+ 0x35, 0x24, 0x4d, 0x01, 0x76, 0xa4, 0x95, 0x3c, 0x1f, 0x6c, 0x96, 0x44,
+ 0xd4, 0xc0, 0xd1, 0xdb, 0x92, 0x4d, 0xfe, 0x4d, 0xf1, 0x9e, 0x5a, 0x8c,
+ 0x9d, 0x92, 0x5c, 0xff, 0x50, 0x21, 0xcf, 0x59, 0x8a, 0xe4, 0x20, 0x19,
+ 0x56, 0x28, 0x20, 0x8a, 0x77, 0x7e, 0x58, 0xd1, 0xe1, 0x5e, 0x43, 0x70,
+ 0x72, 0x65, 0xfd, 0x9f, 0x07, 0x99, 0x1f, 0x88, 0x72, 0x8d, 0xf3, 0x12,
+ 0xb1, 0x54, 0x2a, 0x5b, 0xe8, 0xd7, 0x1e, 0x54, 0x36, 0xe2, 0x3f, 0x21,
+ 0xde, 0x87, 0x37, 0xa7, 0x9d, 0x68, 0xc9, 0x82, 0x57, 0xe4, 0x43, 0xe8,
+ 0xc6, 0x34, 0x19, 0x48, 0x5b, 0xfb, 0x1c, 0x3c, 0x5e, 0x8b, 0xdd, 0xb4,
+ 0x00, 0x77, 0xdf, 0x41, 0x92, 0x1d, 0x4b, 0x17, 0xb8, 0xdb, 0x13, 0x35,
+ 0x02, 0xb7, 0xa0, 0xed, 0x52, 0x05, 0xb3, 0x78, 0x0a, 0x85, 0x53, 0x0c,
+ 0xed, 0x77, 0xa1, 0x25, 0xb4, 0x95, 0xec, 0xa1, 0x86, 0xd5, 0x64, 0x44,
+ 0xc8, 0x87, 0x6d, 0x06, 0xfb, 0xdc, 0x33, 0x41, 0x06, 0xe6, 0x79, 0x2d,
+ 0xc4, 0xf8, 0xee, 0xa8, 0x38, 0x99, 0xb9, 0x4d, 0x5e, 0x29, 0x60, 0xb2,
+ 0x0b, 0xd6, 0xa3, 0xf7, 0x6f, 0x34, 0x65, 0xc3, 0xf4, 0xcc, 0x85, 0x44,
+ 0x60, 0xe5, 0xb9, 0x53, 0x3c, 0xf3, 0x99, 0x81, 0x6e, 0xa9, 0x52, 0x3a,
+ 0x0f, 0x6f, 0x36, 0xac, 0xd4, 0x6b, 0xbe, 0x00, 0xae, 0x40, 0xd4, 0xda,
+ 0x89, 0x46, 0x7f, 0x53, 0x12, 0x98, 0xbd, 0xca, 0x5a, 0x66, 0x81, 0x3f,
+ 0x55, 0x36, 0x31, 0xf0, 0x15, 0x10, 0x01, 0xac, 0x77, 0x11, 0xa9, 0x97,
+ 0x1c, 0xa0, 0xaf, 0xd1, 0x9f, 0x71, 0x76, 0x86, 0x55, 0x5a, 0x26, 0x0e,
+ 0x01, 0x22, 0x26, 0x9a, 0xf0, 0xb5, 0x51, 0xa4, 0x83, 0x46, 0xa0, 0x84,
+ 0x08, 0xd4, 0x85, 0x38, 0x64, 0x7e, 0x3b, 0xa3, 0x2f, 0x13, 0xb0, 0x5b,
+ 0x3f, 0x7c, 0x59, 0x0b, 0x26, 0x3c, 0x70, 0xe0, 0x15, 0xee, 0x17, 0x04,
+ 0x0c, 0x13, 0x19, 0xe4, 0xdf, 0xc7, 0xad, 0x5b, 0xd6, 0x53, 0x0c, 0xe8,
+ 0x3e, 0x17, 0x94, 0x7e, 0x9c, 0xa8, 0x52, 0x85, 0x79, 0x0d, 0x93, 0xe2,
+ 0xef, 0xc8, 0x2f, 0x80, 0x84, 0xf4, 0xa0, 0xba, 0x51, 0xfc, 0xf6, 0xf8,
+ 0xe4, 0xed, 0x4b, 0xbb, 0x1b, 0xcc, 0x16, 0xe7, 0x6b, 0x03, 0xb8, 0xc0,
+ 0x5c, 0xbb, 0x18, 0xe9, 0x5e, 0x37, 0x29, 0x4d, 0x45, 0x97, 0xc8, 0xf7,
+ 0xee, 0x5d, 0x41, 0x32, 0xd8, 0xd4, 0x37, 0x56, 0x5d, 0xd2, 0x6d, 0x4f,
+ 0xed, 0xfb, 0xc7, 0x1c, 0xf2, 0xac, 0x82, 0x84, 0xee, 0x3f, 0x90, 0x91,
+ 0x1a, 0x55, 0xb0, 0x54, 0xdc, 0x97, 0x25, 0x7f, 0xf7, 0x2d, 0x93, 0x0e,
+ 0x0f, 0x59, 0xa8, 0xf5, 0x18, 0x62, 0x14, 0xb2, 0x10, 0xd1, 0xf7, 0x6f,
+ 0x22, 0x65, 0x40, 0x40, 0x63, 0x4f, 0xf1, 0x93, 0x80, 0x4f, 0x8a, 0xf5,
+ 0xa6, 0x00, 0x2f, 0x00, 0x3a, 0xb6, 0x23, 0x94, 0x35, 0x74, 0x91, 0x02,
+ 0x21, 0x25, 0x46, 0x71, 0xc4, 0x7a, 0x90, 0x3a, 0xdd, 0x60, 0x67, 0x5a,
+ 0x54, 0x22, 0x67, 0xc7, 0xb8, 0xb1, 0xfa, 0xb7, 0x73, 0xc4, 0x75, 0x9b,
+ 0xc0, 0x51, 0x6f, 0x5e, 0xc1, 0x5f, 0xd6, 0x39, 0x52, 0x10, 0x5c, 0x61,
+ 0x22, 0xe4, 0xa4, 0xce, 0x59, 0xca, 0x6b, 0x54, 0x07, 0xd7, 0x79, 0x6f,
+ 0x15, 0x2e, 0x28, 0xe4, 0x4a, 0x04, 0x0f, 0x0c, 0x85, 0xb4, 0x7a, 0xfa,
+ 0x8c, 0xca, 0x7d, 0x12, 0x2d, 0xe7, 0xfc, 0xa2, 0xae, 0x11, 0xba, 0x31,
+ 0x32, 0xe8, 0xdd, 0x6b, 0x49, 0xb9, 0x82, 0xf7, 0x60, 0x3d, 0xdd, 0xee,
+ 0xd9, 0xc2, 0xb6, 0x2f, 0xbd, 0x3c, 0xd3, 0x60, 0x94, 0xed, 0x32, 0x4c,
+ 0x12, 0xf0, 0xd8, 0xf9, 0x01, 0xc8, 0x22, 0xa0, 0x60, 0xc9, 0xe4, 0xd6,
+ 0xaa, 0x71, 0x9f, 0xd5, 0x8d, 0x59, 0x0c, 0xd5, 0x54, 0x81, 0x17, 0xdd,
+ 0xe6, 0x8d, 0x85, 0xc8, 0xfa, 0x3d, 0x50, 0x09, 0x9d, 0xf5, 0xb6, 0x95,
+ 0x2d, 0x30, 0xfe, 0xeb, 0x67, 0x6e, 0x0e, 0x6e, 0xe4, 0x77, 0x9e, 0x9d,
+ 0x2e, 0x2f, 0x15, 0xbe, 0x81, 0x3c, 0x65, 0xb7, 0x2b, 0xf9, 0x9f, 0x3c,
+ 0xf0, 0xdc, 0x79, 0x14, 0xca, 0xd2, 0x55, 0x80, 0xe8, 0x9e, 0xd0, 0x10,
+ 0x9b, 0x91, 0x56, 0xf9, 0x02, 0x34, 0xb7, 0xd9, 0xa8, 0x73, 0x0d, 0x0b,
+ 0x9c, 0x71, 0xc9, 0x78, 0xf2, 0x9d, 0xc2, 0xf7, 0x71, 0xef, 0x16, 0x91,
+ 0xf8, 0x30, 0x16, 0x29, 0x61, 0x7f, 0xb3, 0xca, 0x82, 0x7c, 0xe3, 0x2f,
+ 0xdb, 0x09, 0x3d, 0xa7, 0xee, 0x7a, 0xb4, 0x4e, 0x20, 0xce, 0xf6, 0xd7,
+ 0x17, 0x13, 0xc1, 0x25, 0x09, 0x35, 0x24, 0x6d, 0xec, 0x92, 0x69, 0x3d,
+ 0xbf, 0x6f, 0xac, 0xaa, 0x2b, 0x43, 0x43, 0xfb, 0x12, 0x59, 0x18, 0xc4,
+ 0x0e, 0x1e, 0x43, 0x12, 0x5e, 0x22, 0x88, 0x3f, 0xf7, 0x2a, 0x9b, 0x1c,
+ 0x62, 0xbf, 0x2e, 0x03, 0x90, 0x5f, 0x68, 0x57, 0x4b, 0x61, 0x29, 0x57,
+ 0xcb, 0x80, 0x6a, 0x51, 0x01, 0x37, 0x96, 0xd7, 0x19, 0x8e, 0xc1, 0x3f,
+ 0x40, 0xe4, 0x6a, 0x29, 0x17, 0xe2, 0xdf, 0xea, 0xe7, 0xd8, 0xf6, 0x0d,
+ 0xa0, 0x6d, 0xb3, 0x0f, 0x12, 0x67, 0xec, 0x55, 0x91, 0xc0, 0x73, 0x03,
+ 0x90, 0xb9, 0x5f, 0xac, 0x73, 0xec, 0x33, 0x86, 0xd3, 0x25, 0x4d, 0xbc,
+ 0x93, 0x44, 0x21, 0x56, 0x4b, 0x99, 0xfa, 0xc0, 0x94, 0xc4, 0x4f, 0x87,
+ 0xcf, 0xb0, 0x3a, 0xd7, 0xd9, 0xf2, 0x38, 0x31, 0x99, 0x4d, 0x7f, 0xc3,
+ 0x24, 0x22, 0x9f, 0xe4, 0xf9, 0xbf, 0xcd, 0x31, 0x75, 0x93, 0x24, 0x19,
+ 0xb2, 0xd6, 0xee, 0xfa, 0xf9, 0x31, 0x58, 0x0c, 0x34, 0xc1, 0xf5, 0x3e,
+ 0x1f, 0x84, 0x92, 0x27, 0xb9, 0xfa, 0xda, 0xde, 0xce, 0x38, 0x17, 0x31,
+ 0x7d, 0xdc, 0x69, 0xdb, 0x3d, 0x6e, 0xe8, 0xb2, 0xe6, 0x77, 0x5a, 0xcf,
+ 0xac, 0xbf, 0x58, 0xb3, 0x59, 0x09, 0xa3, 0xf9, 0x12, 0x25, 0x50, 0x89,
+ 0xee, 0x4e, 0x74, 0x61, 0xca, 0x79, 0x25, 0xbb, 0x20, 0x6f, 0xf1, 0x2c,
+ 0x8e, 0xe6, 0xae, 0xdc, 0x76, 0x7f, 0x6c, 0xf0, 0x53, 0x8a, 0x3b, 0xe5,
+ 0x4c, 0xb3, 0xd3, 0x75, 0x8e, 0x9c, 0xbf, 0x18, 0xfc, 0xc3, 0x62, 0x16,
+ 0x2a, 0xc2, 0x1c, 0xc5, 0x94, 0xd0, 0xbc, 0x0f, 0x59, 0x41, 0xcf, 0xd1,
+ 0x07, 0xbd, 0x09, 0x00, 0xbd, 0x28, 0x3c, 0x87, 0xff, 0x3e, 0x6d, 0x42,
+ 0x2d, 0xb2, 0xbd, 0xba, 0xda, 0x71, 0x47, 0x00, 0xfd, 0xf9, 0x3e, 0x8e,
+ 0x37, 0x2d, 0x65, 0x78, 0x3a, 0xf3, 0x72, 0xda, 0x5e, 0xf1, 0xe7, 0x22,
+ 0x63, 0xb9, 0xb1, 0x1a, 0x2f, 0x79, 0xa6, 0x76, 0x23, 0x76, 0xd2, 0xf0,
+ 0xe0, 0x1f, 0xcf, 0x71, 0x27, 0x42, 0x4d, 0x30, 0xbc, 0xdf, 0x12, 0xb1,
+ 0x02, 0xf6, 0x01, 0x16, 0x93, 0x26, 0x1b, 0x85, 0x08, 0x73, 0x69, 0xeb,
+ 0x06, 0x3a, 0xf4, 0xe7, 0x25, 0xe9, 0x19, 0x3e, 0x40, 0xf7, 0x81, 0x02,
+ 0x21, 0xc8, 0xbe, 0x1f, 0xfa, 0x7d, 0x20, 0x5a, 0x02, 0x2f, 0x3b, 0x1c,
+ 0x92, 0x19, 0x39, 0xbb, 0xdf, 0xbf, 0x22, 0xac, 0x5c, 0x2a, 0x73, 0xbf,
+ 0x7b, 0x7d, 0x34, 0xc6, 0xb4, 0xc5, 0x94, 0x11, 0x9d, 0x81, 0x3d, 0xea,
+ 0xbe, 0x63, 0x60, 0xe0, 0x9b, 0x58, 0xc3, 0x4e, 0x9f, 0xb8, 0xe7, 0x55,
+ 0x5a, 0x72, 0x69, 0x91, 0x84, 0x64, 0x63, 0x94, 0x6d, 0x4c, 0x88, 0xde,
+ 0xfc, 0xcf, 0x6f, 0xa9, 0x07, 0x0a, 0x12, 0x96, 0xb6, 0xc4, 0x4c, 0x42,
+ 0x49, 0xb3, 0x75, 0x10, 0xba, 0xa1, 0xb1, 0x29, 0xe2, 0x84, 0xd4, 0x0e,
+ 0xa8, 0x77, 0x7c, 0x3e, 0x3b, 0xf4, 0xbd, 0xa1, 0x73, 0x89, 0xd5, 0x39,
+ 0x14, 0xeb, 0xdb, 0xda, 0x46, 0x70, 0x95, 0x2c, 0x7d, 0xa5, 0x54, 0x4d,
+ 0x56, 0xcc, 0x20, 0xcb, 0x59, 0x12, 0x33, 0xc1, 0xe5, 0xb8, 0x0a, 0xc5,
+ 0x26, 0xc6, 0x58, 0xdb, 0x8d, 0x98, 0x25, 0xbf, 0xf9, 0x5f, 0x93, 0x4d,
+ 0x4e, 0xb9, 0xc1, 0x2c, 0xae, 0x51, 0x2e, 0x38, 0xa2, 0x11, 0x5a, 0x87,
+ 0x0a, 0xbe, 0x68, 0xae, 0x17, 0xcc, 0xf0, 0x43, 0xd4, 0x7a, 0xc1, 0xc4,
+ 0xd4, 0x3b, 0x4c, 0x48, 0x9c, 0xb6, 0x79, 0xbf, 0xfc, 0x1b, 0xfa, 0x34,
+ 0xea, 0x60, 0x3b, 0xca, 0xda, 0x41, 0x88, 0x78, 0x00, 0xea, 0xa2, 0x9e,
+ 0x65, 0xb9, 0xaf, 0x29, 0x35, 0xcc, 0x8f, 0x23, 0x13, 0x90, 0x82, 0x5b,
+ 0x40, 0x0b, 0xa1, 0xea, 0xfd, 0xd4, 0xea, 0x84, 0xa5, 0x31, 0xd2, 0xb9,
+ 0xdf, 0x93, 0xa6, 0x05, 0xf9, 0xb1, 0xf2, 0x31, 0x3a, 0x6e, 0xbb, 0xf4,
+ 0xcc, 0x44, 0xa5, 0x83, 0x8f, 0xeb, 0x37, 0x7e, 0xbb, 0x65, 0x64, 0x13,
+ 0xa0, 0xfe, 0xb3, 0xb9, 0x19, 0x40, 0xbf, 0x6e, 0xe6, 0x4a, 0xff, 0x50,
+ 0x3d, 0x49, 0xaa, 0x72, 0xda, 0x25, 0xb0, 0x7d, 0x18, 0x58, 0xab, 0x55,
+ 0xb2, 0xf1, 0x07, 0xe5, 0xf1, 0x7e, 0x92, 0x66, 0x3d, 0x8b, 0xd7, 0x59,
+ 0xd4, 0x73, 0x87, 0xe9, 0x79, 0xd4, 0xbe, 0xda, 0x6a, 0xb1, 0x2c, 0x94,
+ 0x91, 0xfa, 0x53, 0x47, 0xb8, 0xf5, 0xe5, 0xb2, 0x71, 0xfd, 0x54, 0x6c,
+ 0x0c, 0x2c, 0xd3, 0x57, 0x92, 0x3a, 0xd0, 0xc5, 0xce, 0x91, 0xbe, 0x21,
+ 0x93, 0xf0, 0x56, 0x53, 0x84, 0x37, 0x85, 0x77, 0xab, 0xc4, 0x8a, 0x1b,
+ 0xb6, 0x85, 0xfe, 0x9c, 0x84, 0x46, 0x4a, 0x5e, 0xf9, 0x49, 0x18, 0x78,
+ 0xa6, 0x33, 0xf3, 0xd2, 0xca, 0xcf, 0xeb, 0x17, 0xcb, 0xaf, 0x11, 0x1c,
+ 0x48, 0x02, 0x71, 0x6b, 0x0b, 0x05, 0x17, 0x29, 0xc7, 0xda, 0x22, 0x83,
+ 0x40, 0xe2, 0xa9, 0xdf, 0x5d, 0x89, 0xa3, 0x03, 0x25, 0x0b, 0x10, 0x17,
+ 0x90, 0x1b, 0x55, 0xea, 0x98, 0x95, 0x98, 0xca, 0xd5, 0x74, 0x20, 0xb9,
+ 0x21, 0x4d, 0x5f, 0xbf, 0x99, 0x08, 0x45, 0x3e, 0x52, 0xb0, 0x25, 0x8e,
+ 0x5e, 0x18, 0xe2, 0xf6, 0x09, 0x16, 0x71, 0x03, 0x2b, 0xc9, 0x5f, 0x98,
+ 0x93, 0xe8, 0xd8, 0x1d, 0xff, 0x69, 0x95, 0x45, 0xfd, 0x73, 0xf5, 0x00,
+ 0x6b, 0xbf, 0x44, 0x27, 0x8a, 0x8b, 0xd8, 0xba, 0xc4, 0x07, 0x03, 0x77,
+ 0x54, 0x73, 0x79, 0x0e, 0x29, 0x04, 0x98, 0x6c, 0x0f, 0x5b, 0x82, 0x03,
+ 0x5f, 0xca, 0x80, 0x29, 0x85, 0x1b, 0xf6, 0xb3, 0x71, 0x07, 0xae, 0xca,
+ 0x2d, 0xb1, 0xdd, 0xb5, 0x9b, 0xfb, 0x36, 0x36, 0x8a, 0x79, 0x42, 0xc3,
+ 0x43, 0xa5, 0xe4, 0xda, 0x12, 0xb9, 0xf5, 0x58, 0x7b, 0xe6, 0x26, 0x02,
+ 0x13, 0xc1, 0x23, 0x0a, 0xe6, 0x4d, 0xa7, 0xac, 0x99, 0x1f, 0x06, 0xc7,
+ 0xe1, 0x54, 0x3e, 0x90, 0xc2, 0x1e, 0xdb, 0x52, 0x4a, 0x17, 0xfc, 0x1e,
+ 0xa6, 0xfc, 0x58, 0x8b, 0xc9, 0x13, 0xb2, 0xca, 0x30, 0xaa, 0xab, 0x4d,
+ 0x65, 0xf3, 0x6a, 0x93, 0x5c, 0x55, 0x4f, 0xff, 0x6c, 0xcc, 0x61, 0xc4,
+ 0x5c, 0xe8, 0x36, 0x97, 0xb3, 0xc6, 0x15, 0xe0, 0x5a, 0x8b, 0x8c, 0x33,
+ 0x0f, 0x7c, 0x32, 0xad, 0x9c, 0x98, 0x6f, 0x43, 0x52, 0x5b, 0xa8, 0x89,
+ 0x9f, 0xfb, 0x8e, 0x3b, 0x1e, 0x92, 0xaa, 0x70, 0xc2, 0x19, 0xa1, 0x58,
+ 0xd1, 0x57, 0x30, 0x21, 0xd4, 0x8e, 0xf3, 0x6a, 0x9e, 0xa3, 0x9f, 0x1f,
+ 0xa5, 0xf0, 0xf6, 0x83, 0x1e, 0x0d, 0x30, 0xf8, 0xa9, 0x49, 0x6a, 0xb4,
+ 0x7f, 0xb8, 0x23, 0x7e, 0xe8, 0x2e, 0xb2, 0xdd, 0xc0, 0x17, 0x37, 0xe5,
+ 0x3a, 0xc1, 0x3e, 0x8e, 0x21, 0x58, 0x01, 0x49, 0xf9, 0x8f, 0xfe, 0xb7,
+ 0xe8, 0x4d, 0xdd, 0x8b, 0xaa, 0x83, 0x4c, 0x5e, 0xeb, 0x59, 0x25, 0x1e,
+ 0x07, 0x58, 0x20, 0x17, 0xce, 0x96, 0xc3, 0x39, 0xd3, 0x17, 0x8e, 0x4c,
+ 0xf9, 0x46, 0xe2, 0x4d, 0x9a, 0x30, 0xf9, 0xd5, 0xbf, 0x40, 0xb0, 0x2c,
+ 0xa9, 0x0e, 0x41, 0x32, 0xe1, 0xd4, 0x03, 0x63, 0xe7, 0x32, 0x18, 0x29,
+ 0xb6, 0x21, 0x47, 0xdc, 0xda, 0x8a, 0xb5, 0x3c, 0xb3, 0x60, 0xba, 0x4c,
+ 0x84, 0x6e, 0x0c, 0xf4, 0xd3, 0xbc, 0x75, 0x53, 0x8e, 0x3a, 0x2b, 0xfd,
+ 0x9a, 0x08, 0x77, 0x1e, 0xc7, 0x63, 0x90, 0xb7, 0x94, 0x1e, 0xac, 0xb7,
+ 0x96, 0xf1, 0x38, 0x17, 0x0c, 0xa8, 0x29, 0x77, 0x4e, 0xa9, 0x73, 0x0a,
+ 0x78, 0x75, 0xca, 0xeb, 0x23, 0xf3, 0xc8, 0x47, 0xad, 0x87, 0x5b, 0x82,
+ 0x09, 0x78, 0x9a, 0x67, 0x4d, 0x00, 0xa7, 0xa2, 0x13, 0x07, 0x9e, 0xcc,
+ 0x12, 0xd8, 0x9e, 0x6a, 0x69, 0xeb, 0xe8, 0x74, 0xd5, 0x2e, 0x82, 0x75,
+ 0x26, 0xbd, 0xec, 0x47, 0xbb, 0x15, 0x2d, 0x17, 0xe0, 0x8d, 0x37, 0x53,
+ 0x57, 0x0d, 0x17, 0x9f, 0xd3, 0x8f, 0x75, 0xb8, 0x3f, 0x6c, 0xff, 0xec,
+ 0x76, 0x95, 0xaa, 0x4e, 0xaa, 0xa5, 0xee, 0xb7, 0x94, 0x6b, 0xbd, 0x8e,
+ 0x51, 0x6f, 0xb6, 0x21, 0xeb, 0x78, 0x5b, 0x75, 0x57, 0x6b, 0x4f, 0xf3,
+ 0xfd, 0xe2, 0x29, 0xef, 0x6d, 0xc4, 0xd5, 0xd7, 0x60, 0x18, 0x47, 0xee,
+ 0xa0, 0xfd, 0xb0, 0xd1, 0xc0, 0xf8, 0x4f, 0x77, 0x5f, 0xfe, 0x26, 0x15,
+ 0x58, 0x59, 0xee, 0x27, 0x3e, 0x93, 0x5e, 0xbe, 0x7a, 0x19, 0xeb, 0x46,
+ 0xdb, 0x39, 0xc3, 0x8a, 0x18, 0x52, 0xee, 0xed, 0x6c, 0xff, 0x66, 0x87,
+ 0xea, 0x6d, 0x0e, 0xfc, 0x35, 0xe1, 0xe6, 0x1c, 0x21, 0x64, 0xeb, 0x87,
+ 0x7c, 0x63, 0x4c, 0x28, 0x65, 0xbf, 0xcc, 0x81, 0xc3, 0x38, 0x87, 0x18,
+ 0x3b, 0x62, 0x8c, 0xce, 0x3d, 0x42, 0x99, 0x04, 0x6b, 0x54, 0xea, 0xd8,
+ 0xa2, 0x45, 0x84, 0xb7, 0x68, 0xc2, 0x00, 0xcc, 0x83, 0x73, 0xf1, 0xe3,
+ 0xfe, 0x32, 0x96, 0xcd, 0xef, 0xc9, 0x56, 0xe8, 0xe8, 0xe4, 0x93, 0xc1,
+ 0xae, 0x21, 0x9a, 0xe3, 0x66, 0xc7, 0xed, 0x31, 0x86, 0xb2, 0x83, 0xa7,
+ 0x38, 0x9e, 0x7d, 0xe6, 0x26, 0xf1, 0x84, 0x58, 0x41, 0x4a, 0x8a, 0xf6,
+ 0x1e, 0x90, 0x23, 0xf3, 0x8d, 0x54, 0x26, 0x8c, 0x49, 0x38, 0x81, 0x57,
+ 0xc3, 0xd5, 0x91, 0x6b, 0x92, 0x2e, 0x10, 0x2d, 0x56, 0x4c, 0x21, 0xe7,
+ 0x52, 0xc8, 0x8a, 0x15, 0x6b, 0xb2, 0xe8, 0x5f, 0xfd, 0x92, 0x59, 0xd0,
+ 0xf4, 0x28, 0xc8, 0x7d, 0xce, 0xfe, 0xb2, 0x3f, 0x1e, 0xd8, 0xfa, 0x0c,
+ 0xd1, 0x8b, 0xff, 0xff, 0x08, 0x67, 0xd7, 0x92, 0x2c, 0x0f, 0x90, 0x65,
+ 0xf2, 0xb9, 0xaf, 0xdd, 0x04, 0x0e, 0xf4, 0x01, 0xd0, 0x0b, 0xf9, 0x0d,
+ 0x0a, 0x36, 0xf5, 0x4b, 0x7c, 0x91, 0x44, 0x74, 0x1b, 0xef, 0x91, 0x68,
+ 0x86, 0x65, 0x12, 0x54, 0xb3, 0x4b, 0x55, 0xab, 0xc1, 0x74, 0x8a, 0x0b,
+ 0x5c, 0xd3, 0xc3, 0x4e, 0xcd, 0x97, 0x65, 0xcd, 0x25, 0xb2, 0x30, 0x72,
+ 0x84, 0x53, 0xa6, 0xde, 0x43, 0x8e, 0x8b, 0x59, 0x3c, 0x4a, 0x21, 0x22,
+ 0x7f, 0x64, 0xb8, 0xb6, 0x83, 0x14, 0x62, 0xbe, 0x15, 0xe8, 0xa4, 0x1b,
+ 0xc1, 0xe2, 0xf9, 0xe4, 0x0c, 0xc4, 0x9f, 0x21, 0x9e, 0x6d, 0x55, 0x46,
+ 0x12, 0x89, 0xf9, 0x6f, 0x6f, 0x93, 0x65, 0x04, 0x40, 0xf3, 0x28, 0x68,
+ 0x53, 0xc2, 0x99, 0xa9, 0x03, 0x75, 0xfb, 0xd6, 0xbe, 0x09, 0xcf, 0x3f,
+ 0x2f, 0x76, 0xd0, 0x52, 0x45, 0x2e, 0x63, 0xdf, 0x85, 0x2d, 0xb5, 0xfa,
+ 0xc5, 0x78, 0xdb, 0xda, 0x53, 0x67, 0x1d, 0x18, 0x1f, 0x89, 0xb5, 0x5a,
+ 0x41, 0x97, 0xd2, 0xa7, 0x09, 0xcd, 0x16, 0x73, 0xf0, 0x9a, 0x89, 0x01,
+ 0x31, 0x30, 0x9f, 0xb5, 0x43, 0x59, 0x9f, 0xf6, 0xb2, 0xc2, 0x59, 0x57,
+ 0x57, 0x85, 0xa1, 0xc1, 0xba, 0xe7, 0x18, 0xd5, 0x4f, 0xce, 0xc9, 0xe9,
+ 0x00, 0xbc, 0xf8, 0x52, 0xbe, 0x40, 0x3c, 0x3b, 0x38, 0x1b, 0xc9, 0x29,
+ 0x67, 0x06, 0x48, 0xd7, 0xf6, 0xb0, 0xd0, 0x21, 0x90, 0x30, 0xf7, 0x67,
+ 0xd8, 0xe5, 0x18, 0x33, 0x1f, 0x39, 0x4d, 0xaf, 0x97, 0x66, 0x91, 0x7d,
+ 0xbb, 0xfe, 0x56, 0xb4, 0x77, 0x0b, 0xa0, 0xd5, 0xe5, 0x1c, 0x70, 0x05,
+ 0x5c, 0x82, 0xd7, 0x6d, 0x8b, 0x0a, 0xfc, 0x03, 0x91, 0x4d, 0xd0, 0x12,
+ 0xa8, 0x0e, 0xf5, 0x32, 0xae, 0xf7, 0x14, 0x64, 0x42, 0xf6, 0xfb, 0x2a,
+ 0x7f, 0x26, 0x7b, 0xdc, 0xc7, 0xb0, 0xae, 0xa9, 0xe7, 0xe6, 0x28, 0x58,
+ 0xdc, 0xd0, 0x0b, 0xf2, 0xe3, 0xcc, 0x6f, 0x28, 0x31, 0x95, 0x1b, 0xb1,
+ 0x0b, 0xb5, 0xaa, 0xf9, 0xf1, 0x8b, 0x8d, 0x07, 0xe1, 0x9b, 0xb4, 0xc3,
+ 0x6c, 0xd2, 0xec, 0xc7, 0x45, 0x6f, 0xec, 0xc3, 0x67, 0xc7, 0x09, 0x16,
+ 0x10, 0xd3, 0x79, 0x29, 0xbd, 0x26, 0xbb, 0xa8, 0x85, 0xae, 0xb2, 0x76,
+ 0xe6, 0x0c, 0x35, 0xac, 0xa8, 0xe7, 0xab, 0xe1, 0xde, 0x11, 0x99, 0x56,
+ 0xcd, 0x80, 0x1d, 0x1b, 0x16, 0x6f, 0xe2, 0xef, 0x02, 0x21, 0x2b, 0x67,
+ 0xdd, 0xcf, 0x9c, 0x88, 0x25, 0xfe, 0x15, 0xa2, 0xd8, 0x3e, 0x8d, 0x37,
+ 0xc8, 0xdd, 0xbb, 0xf2, 0xfb, 0x14, 0x95, 0xae, 0x93, 0x30, 0x3b, 0x86,
+ 0x2a, 0x16, 0x92, 0x6d, 0xa0, 0xd8, 0xc4, 0xa5, 0x3e, 0xa7, 0xa8, 0x93,
+ 0xe3, 0x56, 0xce, 0x18, 0x5b, 0x3e, 0x5b, 0xc4, 0x30, 0xc7, 0x85, 0x1c,
+ 0xe2, 0x9d, 0x1f, 0x49, 0x33, 0xee, 0x6b, 0xb1, 0xfd, 0x77, 0x75, 0x2f,
+ 0x5b, 0x33, 0xa3, 0x15, 0xec, 0xd9, 0xf1, 0x3d, 0x06, 0x05, 0xf7, 0x4b,
+ 0x48, 0x51, 0x3c, 0x3e, 0x3f, 0x97, 0x4d, 0xc0, 0xb8, 0xd9, 0x9b, 0xff,
+ 0x3e, 0xc5, 0xd7, 0x94, 0x89, 0x38, 0x5a, 0x69, 0xf5, 0x0c, 0x02, 0x98,
+ 0x6e, 0x28, 0xc2, 0xa7, 0x9b, 0x9a, 0x42, 0x93, 0x02, 0x89, 0x4a, 0x67,
+ 0x43, 0xfc, 0x78, 0xb7, 0x37, 0x24, 0x0a, 0x62, 0x7e, 0xdf, 0x63, 0x2b,
+ 0xef, 0x79, 0x69, 0xcc, 0xd9, 0xe1, 0xab, 0x3f, 0x8e, 0x4d, 0xa5, 0xd0,
+ 0xca, 0x24, 0x05, 0xce, 0x35, 0x4f, 0x34, 0xbe, 0xff, 0x12, 0x52, 0x44,
+ 0x43, 0x35, 0x63, 0x64, 0x4d, 0x22, 0x6a, 0x40, 0x89, 0x92, 0xa7, 0x04,
+ 0x30, 0x29, 0x8a, 0x70, 0x34, 0xda, 0x2d, 0xf5, 0x78, 0xf5, 0x0c, 0x1c,
+ 0x0e, 0xd8, 0x06, 0x49, 0x5c, 0xaf, 0x68, 0xd0, 0x18, 0x0a, 0xd9, 0xe1,
+ 0x17, 0x1a, 0x84, 0x03, 0x71, 0x4a, 0x43, 0xb5, 0x34, 0xdd, 0xd7, 0xd7,
+ 0x84, 0xc6, 0xa6, 0x8d, 0x06, 0xd5, 0x15, 0xfa, 0x19, 0x8c, 0xe7, 0xac,
+ 0x1c, 0x4a, 0x95, 0x48, 0xf2, 0xb3, 0xcd, 0xf5, 0xd3, 0xfe, 0x3e, 0x28,
+ 0x07, 0x90, 0x57, 0x95, 0x7d, 0x5c, 0xda, 0x29, 0x5b, 0x42, 0x70, 0x58,
+ 0xdb, 0x6c, 0x69, 0xba, 0x88, 0xa6, 0x4f, 0xc2, 0xb4, 0xf7, 0x33, 0x55,
+ 0xd9, 0x62, 0x6f, 0x63, 0x65, 0x6a, 0x1f, 0x77, 0xc7, 0xec, 0xd9, 0x99,
+ 0x6b, 0xed, 0xd8, 0x9b, 0x09, 0x9a, 0xca, 0x07, 0x73, 0xab, 0xe5, 0x61,
+ 0x5b, 0x49, 0x4a, 0xa4, 0xff, 0xff, 0x18, 0x43, 0x73, 0xde, 0xdc, 0x65,
+ 0x47, 0xcb, 0xc2, 0x37, 0xcc, 0x10, 0xe7, 0xc4, 0xa1, 0x3d, 0xb5, 0x11,
+ 0xce, 0x1f, 0xd7, 0xb3, 0x4c, 0x46, 0x4a, 0xa1, 0x6d, 0x2f, 0xd6, 0x7e,
+ 0x30, 0xa7, 0x0e, 0x31, 0x71, 0xbc, 0xfb, 0xf3, 0xf3, 0x97, 0x48, 0xf9,
+ 0x38, 0xf4, 0x76, 0x22, 0x78, 0x4e, 0x90, 0x9f, 0x54, 0x2d, 0xdc, 0x23,
+ 0x05, 0xc2, 0x3e, 0xf1, 0x83, 0x4c, 0x3b, 0x42, 0x00, 0xdc, 0x5b, 0x1e,
+ 0x2f, 0x18, 0x6b, 0x45, 0xe3, 0x08, 0xd0, 0xa7, 0xad, 0x7e, 0xad, 0x85,
+ 0xde, 0x3f, 0x34, 0x5b, 0xb4, 0x64, 0xbc, 0x50, 0x4f, 0x26, 0xb1, 0x21,
+ 0x98, 0xb0, 0xc1, 0x9a, 0x7d, 0x47, 0xa9, 0xa3, 0x49, 0x8d, 0xbb, 0xad,
+ 0xfc, 0x65, 0xc7, 0xeb, 0x12, 0xdd, 0xdb, 0x38, 0x2d, 0xb3, 0xa1, 0x42,
+ 0x55, 0xa3, 0x7e, 0x1a, 0x78, 0x98, 0xc7, 0x0f, 0x63, 0x39, 0xc7, 0x72,
+ 0x04, 0x61, 0x3a, 0xf0, 0x77, 0x20, 0xb7, 0xf6, 0x59, 0x3c, 0x55, 0x2c,
+ 0x8f, 0x72, 0x54, 0x66, 0x49, 0x41, 0xb6, 0xd9, 0x99, 0x53, 0x06, 0x19,
+ 0x95, 0xfc, 0x28, 0x7c, 0x50, 0x8b, 0xcd, 0x9c, 0xc3, 0x92, 0xdf, 0x4d,
+ 0xa3, 0x68, 0x9a, 0x5a, 0xaa, 0x06, 0x32, 0x9f, 0xff, 0xdf, 0xcc, 0x11,
+ 0x6e, 0x9e, 0x33, 0xb1, 0x5d, 0x57, 0x3f, 0xea, 0xf6, 0xfb, 0x01, 0xa1,
+ 0xf5, 0xa1, 0x77, 0x0d, 0x98, 0x34, 0x5c, 0xd0, 0xa1, 0xd6, 0x94, 0x6d,
+ 0x8d, 0xb1, 0xc9, 0xbe, 0x4f, 0x43, 0x48, 0xca, 0xe6, 0x73, 0xad, 0xc6,
+ 0xee, 0x7a, 0x36, 0x6c, 0xae, 0xbb, 0x96, 0x96, 0x61, 0xfa, 0xcb, 0x07,
+ 0xd6, 0x09, 0xba, 0xff, 0x11, 0xe9, 0x08, 0x82, 0x9a, 0xb8, 0x80, 0x2e,
+ 0x22, 0x26, 0x43, 0xdb, 0xd4, 0xef, 0xd6, 0xe1, 0xcc, 0xbc, 0x88, 0x53,
+ 0x1d, 0xa3, 0x57, 0x7a, 0x99, 0xab, 0xe6, 0x9e, 0x0b, 0x43, 0x03, 0x11,
+ 0x68, 0x4c, 0xa5, 0xde, 0x07, 0xc1, 0x6c, 0xb1, 0x85, 0xae, 0x81, 0xb8,
+ 0x3b, 0x34, 0x5e, 0xa8, 0x62, 0x75, 0x5e, 0x9c, 0x28, 0x02, 0xf7, 0x76,
+ 0xda, 0x1a, 0x82, 0xe2, 0xba, 0xb5, 0x4a, 0xd8, 0xaa, 0x90, 0xf9, 0x51,
+ 0x7e, 0xa3, 0x49, 0xb3, 0x86, 0xc1, 0x5d, 0xe0, 0x52, 0x01, 0xd1, 0xfd,
+ 0x71, 0x30, 0xe4, 0x19, 0x25, 0xd3, 0x28, 0x15, 0x15, 0xaa, 0x23, 0x6e,
+ 0x97, 0xfa, 0x77, 0xb6, 0xd2, 0x6e, 0x7e, 0x93, 0x63, 0x3f, 0x75, 0x24,
+ 0x57, 0xf3, 0x9f, 0x18, 0x46, 0xd5, 0x09, 0x89, 0x55, 0xa3, 0xfd, 0x6e,
+ 0xfd, 0x40, 0xb4, 0xe7, 0x5d, 0x21, 0x44, 0x6e, 0x52, 0x62, 0x66, 0xae,
+ 0xe2, 0xeb, 0x93, 0x4c, 0x17, 0x12, 0x48, 0x88, 0xf6, 0x59, 0x81, 0xfb,
+ 0x88, 0x5c, 0x21, 0x14, 0x96, 0xeb, 0x70, 0xcf, 0xdc, 0xed, 0xc0, 0x56,
+ 0xaf, 0x83, 0x57, 0x8b, 0x6f, 0x65, 0x65, 0x65, 0x9e, 0x8d, 0x90, 0x92,
+ 0x91, 0x08, 0x08, 0x9e, 0x71, 0x3b, 0x14, 0x97, 0xd6, 0xc8, 0xdb, 0x17,
+ 0x1e, 0xef, 0x5c, 0x95, 0x87, 0xd0, 0x6f, 0x84, 0x66, 0xa0, 0x01, 0x97,
+ 0xd9, 0xfb, 0x24, 0x65, 0x41, 0xfe, 0x1c, 0x95, 0x59, 0xb5, 0xe6, 0x52,
+ 0x05, 0x7a, 0xac, 0xeb, 0xd6, 0xff, 0xcd, 0xb6, 0xde, 0x7f, 0xd4, 0xd1,
+ 0x1c, 0x04, 0x8c, 0x01, 0x8d, 0x54, 0xac, 0xcd, 0x00, 0xf6, 0x40, 0xfc,
+ 0x6e, 0xbe, 0x9a, 0x87, 0x51, 0xf6, 0x77, 0x45, 0x5a, 0xfc, 0x4c, 0x5b,
+ 0x0d, 0x4b, 0xa1, 0xb7, 0x98, 0xde, 0x78, 0xd0, 0x61, 0x92, 0x97, 0xfe,
+ 0x9a, 0x08, 0xf4, 0x07, 0xd6, 0xee, 0x4c, 0x2b, 0x43, 0x22, 0xde, 0x43,
+ 0xab, 0x59, 0x35, 0x1e, 0x0e, 0xb4, 0x95, 0x05, 0xf7, 0x84, 0x6a, 0xa8,
+ 0x2b, 0x93, 0x6e, 0xb5, 0xb0, 0xf6, 0xd8, 0x12, 0xab, 0x6b, 0x7c, 0x65,
+ 0x5b, 0x74, 0x4e, 0xce, 0xf9, 0x45, 0x57, 0xa1, 0x6a, 0xaa, 0x1a, 0xcd,
+ 0x08, 0x67, 0x57, 0x9c, 0x4f, 0x1f, 0x5d, 0x95, 0xde, 0x4c, 0x64, 0xda,
+ 0x96, 0x69, 0x8c, 0x13, 0x7c, 0x54, 0x2a, 0x15, 0x4e, 0x12, 0xf1, 0x86,
+ 0xa2, 0x8c, 0x9f, 0xcf, 0x97, 0x15, 0x3a, 0xd3, 0xaa, 0x4b, 0x1c, 0x5f,
+ 0xfc, 0xdd, 0x9a, 0xb4, 0xc4, 0xaf, 0x56, 0xc8, 0x70, 0xbe, 0x05, 0x0b,
+ 0x11, 0xfa, 0xff, 0x35, 0x50, 0xd5, 0x03, 0xfb, 0x33, 0xa5, 0x31, 0xf3,
+ 0x04, 0x57, 0xed, 0x42, 0x22, 0xde, 0xe3, 0x80, 0xd8, 0xea, 0xc9, 0xb3,
+ 0xa4, 0xed, 0x73, 0x64, 0xc9, 0xa8, 0x62, 0xaf, 0x30, 0xb1, 0xe4, 0x43,
+ 0x9b, 0xc5, 0x3f, 0x96, 0xa5, 0x67, 0x6d, 0xb5, 0x1e, 0xf0, 0xb0, 0x47,
+ 0x45, 0x8c, 0x6d, 0xd1, 0xf5, 0x96, 0x12, 0xd9, 0x83, 0x00, 0xc8, 0xb0,
+ 0x38, 0xa6, 0xb4, 0x4d, 0x60, 0xd2, 0x9f, 0x3f, 0x31, 0xa0, 0x5a, 0x93,
+ 0x9d, 0xc4, 0x9d, 0xf9, 0xbc, 0xfd, 0x9f, 0xa5, 0xdd, 0x20, 0x96, 0x37,
+ 0x99, 0xd9, 0x80, 0xf3, 0xa3, 0x5a, 0xa6, 0x8f, 0x24, 0x0e, 0x9a, 0xd7,
+ 0x81, 0x00, 0x22, 0xbc, 0x9a, 0xcd, 0x3b, 0x1e, 0x67, 0x64, 0xbd, 0x1a,
+ 0xda, 0x26, 0xb4, 0x47, 0xb0, 0x18, 0x99, 0xad, 0xb4, 0x72, 0xe0, 0x63,
+ 0x35, 0x2b, 0xe3, 0x19, 0xe6, 0x42, 0xeb, 0x42, 0x97, 0x0f, 0x8c, 0x0a,
+ 0xae, 0x36, 0xff, 0x34, 0xfd, 0x1b, 0x14, 0x06, 0xbe, 0xa6, 0xe0, 0xf3,
+ 0x5f, 0x02, 0x0a, 0x8b, 0xed, 0x4d, 0xa9, 0xa6, 0xb4, 0xc9, 0x66, 0x86,
+ 0x90, 0xa1, 0xa5, 0x02, 0x2d, 0xce, 0x97, 0xcf, 0xc6, 0x5c, 0xea, 0x56,
+ 0x63, 0x13, 0x5c, 0xba, 0x9b, 0xb1, 0x9b, 0xfe, 0xd0, 0xef, 0xb7, 0x43,
+ 0x0a, 0x60, 0xbd, 0x78, 0xfe, 0xd2, 0x28, 0xca, 0xf5, 0xe0, 0x85, 0x0d,
+ 0x02, 0x5d, 0x2e, 0x6a, 0xcb, 0x83, 0xae, 0x75, 0xe4, 0xba, 0xa4, 0x8b,
+ 0xa2, 0x6b, 0xad, 0x2f, 0x47, 0xb4, 0xee, 0x6b, 0xcc, 0x5a, 0x21, 0xa1,
+ 0xac, 0xad, 0x9f, 0x12, 0x6e, 0x95, 0x75, 0xb2, 0x03, 0x54, 0x7c, 0xa0,
+ 0xd7, 0x80, 0xeb, 0x91, 0x04, 0xd4, 0xc0, 0x4a, 0x51, 0x75, 0x3c, 0x25,
+ 0xf1, 0x89, 0x32, 0x63, 0x47, 0xaf, 0x63, 0x68, 0xff, 0x05, 0x31, 0x1f,
+ 0x77, 0xce, 0xd7, 0x9b, 0xf7, 0x38, 0xd4, 0x30, 0xf8, 0x83, 0xf0, 0x68,
+ 0xff, 0x8f, 0xf5, 0x25, 0x78, 0xa3, 0x99, 0xcd, 0xa2, 0x11, 0x0e, 0x26,
+ 0xa0, 0x7b, 0x22, 0xf5, 0xdc, 0xdd, 0x17, 0x94, 0x00, 0x5c, 0xde, 0xb2,
+ 0xe2, 0x37, 0x00, 0x94, 0x57, 0x6f, 0xc5, 0x65, 0xa1, 0xfe, 0xdd, 0xa1,
+ 0x51, 0x6d, 0x38, 0xb2, 0xe4, 0xd4, 0x62, 0xfc, 0xf1, 0xc8, 0xf2, 0x60,
+ 0x08, 0x2e, 0x58, 0xb0, 0x43, 0xa5, 0xc6, 0xe0, 0x9f, 0xbb, 0xff, 0xb5,
+ 0xc0, 0x36, 0xca, 0xf9, 0x48, 0x7a, 0x87, 0x15, 0xf6, 0xad, 0x09, 0x3f,
+ 0x20, 0xe8, 0x11, 0x89, 0xcd, 0xe5, 0x8a, 0x09, 0x35, 0x49, 0xee, 0x31,
+ 0xa4, 0x7a, 0xe6, 0x37, 0xe1, 0x6f, 0x26, 0x61, 0xd6, 0xd1, 0xa4, 0x8f,
+ 0xa2, 0x7b, 0x43, 0x83, 0x6d, 0xcc, 0x50, 0x4a, 0x88, 0x5e, 0x14, 0x8b,
+ 0xc2, 0xb4, 0x40, 0x2f, 0xe0, 0xdf, 0xcb, 0xb2, 0xf5, 0x44, 0x12, 0x91,
+ 0x31, 0x04, 0x84, 0xce, 0xda, 0x58, 0xc8, 0x74, 0x7b, 0x2e, 0xaf, 0xf7,
+ 0x8b, 0xcc, 0x53, 0x9d, 0xd0, 0x2a, 0x6c, 0x70, 0xf7, 0xe4, 0x80, 0xd1,
+ 0x94, 0xc0, 0x51, 0x27, 0xe3, 0x9a, 0xeb, 0x26, 0x7d, 0xc7, 0xc5, 0x96,
+ 0x63, 0x1e, 0x2d, 0x22, 0xd9, 0x53, 0x79, 0x0b, 0xf5, 0x1d, 0xbf, 0x94,
+ 0xd8, 0xe1, 0xea, 0xe6, 0x84, 0x46, 0x5c, 0xf3, 0x55, 0x59, 0xa4, 0x06,
+ 0x96, 0xc3, 0x6f, 0x53, 0xac, 0x76, 0xff, 0x8a, 0xa5, 0xc4, 0x6a, 0xa6,
+ 0xdd, 0xba, 0x81, 0x52, 0xe1, 0x25, 0xbb, 0xad, 0x29, 0x84, 0xa6, 0x6e,
+ 0x3d, 0x16, 0xdc, 0xcc, 0xd7, 0x2a, 0x9b, 0x3e, 0x20, 0x42, 0x62, 0x47,
+ 0xcc, 0xed, 0x5f, 0xea, 0xd7, 0x71, 0x4c, 0x39, 0xf5, 0x5e, 0x99, 0x3c,
+ 0xaa, 0x2d, 0xbe, 0x0f, 0xb2, 0xbd, 0x60, 0x55, 0xd8, 0x3f, 0xbf, 0xc0,
+ 0x91, 0xf8, 0xe9, 0xd1, 0x64, 0x24, 0xed, 0x62, 0xb1, 0xd7, 0xb6, 0x8f,
+ 0xba, 0x3f, 0x4e, 0x8d, 0xe5, 0xea, 0x84, 0xbe, 0x2e, 0x52, 0xb9, 0x59,
+ 0xf7, 0xc6, 0x36, 0xa3, 0xb6, 0xce, 0xbe, 0x4e, 0xbc, 0x19, 0xc7, 0x6e,
+ 0xd9, 0x47, 0x6e, 0x21, 0x91, 0xf3, 0x0e, 0xaa, 0x6f, 0xe0, 0x95, 0x58,
+ 0xb1, 0x4f, 0x41, 0xcb, 0x37, 0x3d, 0x67, 0x6a, 0x48, 0x9c, 0xda, 0xfe,
+ 0x88, 0x05, 0xc4, 0x67, 0x3d, 0x75, 0x5d, 0x2b, 0xa2, 0x2c, 0x93, 0x17,
+ 0x86, 0x3f, 0xe0, 0x33, 0xc5, 0x84, 0x24, 0x53, 0x45, 0x5e, 0xff, 0x9b,
+ 0xef, 0x77, 0x20, 0xe2, 0x30, 0xd4, 0xa9, 0xbd, 0xce, 0xa3, 0x43, 0x4e,
+ 0xe1, 0xe6, 0xf9, 0x40, 0x7b, 0x37, 0x72, 0xcf, 0x0e, 0x86, 0x9d, 0xb1,
+ 0x16, 0xf6, 0x2b, 0x57, 0x85, 0x00, 0xfe, 0x0c, 0x21, 0x46, 0x15, 0x75,
+ 0x39, 0xaa, 0xcf, 0xa6, 0x65, 0x79, 0x73, 0x0a, 0x7b, 0x4c, 0x66, 0x28,
+ 0xfd, 0x8f, 0xdd, 0xd0, 0x5c, 0xe3, 0x47, 0xca, 0x2f, 0x67, 0x57, 0xef,
+ 0x5b, 0x67, 0xeb, 0x52, 0x40, 0x31, 0xa1, 0xf7, 0xf1, 0x1f, 0x1f, 0xcf,
+ 0x6c, 0x63, 0x18, 0x64, 0x3e, 0xbb, 0xdd, 0xbc, 0xe9, 0x55, 0xcf, 0x22,
+ 0x95, 0xd8, 0xc3, 0xec, 0x64, 0x74, 0x14, 0x4a, 0x1f, 0x08, 0x60, 0xa9,
+ 0xdf, 0xb0, 0x7b, 0xe1, 0x7f, 0x22, 0x64, 0xe5, 0xed, 0xab, 0x06, 0xfa,
+ 0x3b, 0x9c, 0xf3, 0xfa, 0xc2, 0x77, 0xd7, 0xcb, 0xcc, 0xba, 0xdd, 0x22,
+ 0x61, 0x46, 0x0d, 0xba, 0x4a, 0x1b, 0x43, 0xee, 0x14, 0x89, 0x29, 0xe1,
+ 0xa5, 0x5f, 0x5f, 0x59, 0x08, 0x8f, 0xdd, 0xee, 0x6b, 0x24, 0x33, 0x76,
+ 0x82, 0xcb, 0x58, 0xab, 0xea, 0xb8, 0xc3, 0x2a, 0x97, 0x2d, 0x85, 0x71,
+ 0x26, 0x8b, 0x19, 0x12, 0x1a, 0xd0, 0x70, 0xb5, 0xd4, 0xf5, 0x9b, 0xb9,
+ 0xf2, 0xca, 0x72, 0xc3, 0x12, 0x94, 0x96, 0x91, 0x00, 0xbd, 0xce, 0x26,
+ 0xeb, 0x9a, 0xce, 0x33, 0x77, 0xfc, 0x45, 0x6b, 0x14, 0x61, 0x48, 0xf4,
+ 0xab, 0xe5, 0xae, 0x8a, 0x2a, 0x4d, 0x6c, 0x5b, 0xce, 0xfc, 0xa8, 0x16,
+ 0xe5, 0xef, 0xa5, 0x3d, 0x48, 0xef, 0x4c, 0x92, 0xe7, 0x26, 0x53, 0x16,
+ 0xc6, 0x5a, 0xb0, 0x57, 0x91, 0x38, 0xa8, 0x67, 0x52, 0x7f, 0x87, 0x57,
+ 0xf9, 0x74, 0xf4, 0xe2, 0xef, 0xbf, 0xd4, 0x3d, 0xb4, 0xe9, 0x4f, 0x25,
+ 0xd3, 0x59, 0xce, 0xc7, 0x14, 0xfd, 0x23, 0x4b, 0x22, 0x63, 0xea, 0x0d,
+ 0xe7, 0xdf, 0x1c, 0xbc, 0xaa, 0x61, 0xa3, 0xd1, 0x14, 0xf8, 0x96, 0x43,
+ 0xf5, 0xe6, 0xaf, 0x57, 0x46, 0xa1, 0xc3, 0xe5, 0x7f, 0x53, 0xed, 0x71,
+ 0x62, 0x59, 0x65, 0xfa, 0x99, 0x9f, 0x9f, 0x63, 0xf1, 0xfa, 0x64, 0x89,
+ 0xe1, 0xcf, 0xeb, 0x0c, 0xdb, 0x88, 0x7a, 0xaa, 0x4c, 0x69, 0x4c, 0x50,
+ 0x73, 0x97, 0x9a, 0xee, 0xd2, 0x39, 0x1f, 0xbe, 0x22, 0x33, 0x51, 0x8a,
+ 0xb2, 0xf0, 0xe6, 0x0f, 0x85, 0xe3, 0x4f, 0x98, 0x22, 0x94, 0x2f, 0x15,
+ 0x67, 0x92, 0xd2, 0x44, 0x35, 0x87, 0xa1, 0xdb, 0x9a, 0x13, 0x60, 0x71,
+ 0x50, 0x9c, 0x49, 0xf4, 0xbd, 0x8c, 0xfd, 0x17, 0x4e, 0x43, 0x4e, 0xb5,
+ 0x48, 0x40, 0x70, 0x02, 0xd7, 0x51, 0x24, 0x01, 0x3f, 0xdf, 0xe5, 0x38,
+ 0x3a, 0x2f, 0xb1, 0x64, 0x1a, 0x21, 0x38, 0xa8, 0x7d, 0x95, 0x97, 0x9d,
+ 0x44, 0x74, 0x4b, 0xb2, 0x23, 0x41, 0x09, 0x95, 0x58, 0xc5, 0x14, 0x8c,
+ 0x89, 0x03, 0xb3, 0x83, 0x3d, 0x82, 0xe4, 0x3a, 0xa4, 0x95, 0x2d, 0x6e,
+ 0x6f, 0x7a, 0x49, 0x8b, 0x49, 0x4e, 0xb9, 0x5b, 0x5a, 0x8f, 0x9d, 0x6e,
+ 0xf5, 0x1d, 0x11, 0x93, 0x47, 0xfd, 0xa5, 0xe4, 0xaa, 0x91, 0xb1, 0x0c,
+ 0x8e, 0xab, 0xf6, 0xff, 0x14, 0x14, 0xa4, 0xfa, 0x4d, 0x95, 0x1a, 0x44,
+ 0x99, 0xe7, 0xf4, 0xbd, 0xdc, 0x4c, 0x8e, 0x1e, 0xc6, 0x0c, 0xc0, 0x93,
+ 0x7d, 0xf2, 0x8c, 0x50, 0xba, 0x8a, 0xcf, 0x2d, 0xd4, 0xc9, 0xd8, 0x05,
+ 0xe8, 0x9b, 0xc3, 0x3c, 0x44, 0xb4, 0xad, 0x28, 0x3e, 0x76, 0x11, 0xf1,
+ 0x3e, 0x41, 0x98, 0x51, 0xa1, 0x18, 0x99, 0x37, 0xbe, 0xd8, 0xd5, 0x7b,
+ 0x97, 0x39, 0x7a, 0xe3, 0xfe, 0x6f, 0xc5, 0x5e, 0xa8, 0x56, 0x1d, 0x38,
+ 0xac, 0x7c, 0xc6, 0xc7, 0x10, 0x40, 0xff, 0xb4, 0x16, 0xf6, 0x7a, 0x9c,
+ 0x57, 0x06, 0x41, 0x8d, 0xb1, 0x0e, 0xb9, 0x0c, 0xeb, 0x23, 0xe7, 0x2a,
+ 0x1e, 0x98, 0xfe, 0x22, 0x07, 0xb6, 0xa1, 0xb5, 0x22, 0xe3, 0x2e, 0x48,
+ 0x8c, 0x44, 0xd3, 0x60, 0x39, 0xac, 0x9f, 0xaa, 0x60, 0xe1, 0x03, 0x61,
+ 0xbe, 0x32, 0x9a, 0x1f, 0xee, 0x20, 0xe3, 0x16, 0x61, 0x74, 0x19, 0xc1,
+ 0xf1, 0x15, 0x39, 0x5a, 0x8f, 0xf0, 0xea, 0xda, 0xdc, 0xa7, 0x3f, 0x3e,
+ 0xb7, 0x70, 0x41, 0x3e, 0xa4, 0xbb, 0x97, 0xee, 0x2c, 0x2f, 0xa9, 0x17,
+ 0x54, 0x43, 0x4a, 0x5b, 0x32, 0x5e, 0xe1, 0x5e, 0x0d, 0x8b, 0xbc, 0x2c,
+ 0x97, 0x0d, 0x07, 0x36, 0x61, 0x31, 0x87, 0x2c, 0x63, 0xf2, 0xfc, 0x4e,
+ 0x4e, 0x47, 0x87, 0xfb, 0xe0, 0xfc, 0xa9, 0x25, 0xcd, 0xbc, 0x17, 0xb0,
+ 0x88, 0x91, 0x15, 0xaa, 0xcf, 0x26, 0xa3, 0x24, 0x8d, 0xc9, 0xa0, 0xdb,
+ 0x09, 0xeb, 0x82, 0x15, 0x68, 0x0b, 0xb5, 0x20, 0xe7, 0xad, 0xc6, 0x67,
+ 0x67, 0xa7, 0xb0, 0xce, 0x06, 0xcd, 0x24, 0x7c, 0x8d, 0x3a, 0x05, 0xef,
+ 0x0f, 0xb3, 0x4a, 0x26, 0x72, 0x0d, 0x00, 0x19, 0x65, 0xbf, 0x5f, 0x9e,
+ 0xb7, 0xda, 0x40, 0xbb, 0x8d, 0xe5, 0x4d, 0x71, 0x0e, 0xc6, 0x89, 0xa5,
+ 0x8d, 0x4f, 0x55, 0x09, 0xe4, 0x8a, 0xce, 0x3a, 0x0c, 0x97, 0x7e, 0x6b,
+ 0x73, 0x30, 0x17, 0x56, 0x45, 0x5f, 0x0d, 0xa9, 0x5c, 0xe3, 0x93, 0x79,
+ 0x0f, 0x1b, 0x5e, 0xf4, 0x26, 0xae, 0xc1, 0x30, 0x04, 0x6c, 0x66, 0xb6,
+ 0xed, 0x04, 0x74, 0x11, 0x5e, 0x6b, 0xb6, 0x99, 0x1d, 0x29, 0x64, 0x85,
+ 0xe4, 0xb5, 0x3e, 0x3f, 0x7b, 0xe3, 0xcf, 0x5c, 0x29, 0xda, 0xca, 0xa3,
+ 0x70, 0x9f, 0x21, 0xc5, 0x9f, 0xd2, 0xa0, 0xa1, 0x9a, 0x4d, 0x38, 0xe5,
+ 0x87, 0x60, 0x25, 0x6c, 0xd2, 0x22, 0xd3, 0xc6, 0x05, 0x24, 0xd4, 0xbc,
+ 0x4b, 0x4d, 0xbc, 0xa8, 0xe0, 0xc4, 0x5d, 0x17, 0x7c, 0x43, 0x9d, 0xc8,
+ 0xdb, 0x58, 0x1e, 0x86, 0xaa, 0xcb, 0x48, 0xd5, 0x70, 0x4f, 0x35, 0x8a,
+ 0x96, 0x77, 0x90, 0x3a, 0x62, 0xb1, 0x93, 0x16, 0x36, 0xf3, 0xd7, 0x29,
+ 0x25, 0xb0, 0xea, 0xc9, 0xec, 0x7f, 0xb5, 0xa5, 0x1f, 0x23, 0x30, 0xff,
+ 0x7e, 0x13, 0xc0, 0x6e, 0xa7, 0x2f, 0x5a, 0x35, 0xd1, 0x9e, 0x57, 0xed,
+ 0xf5, 0xd3, 0x42, 0xcf, 0x02, 0x67, 0x0e, 0x21, 0x2d, 0x6b, 0x90, 0xe7,
+ 0xc2, 0x07, 0x2d, 0x43, 0xb5, 0xc5, 0x09, 0xb5, 0x0f, 0x93, 0xbc, 0xb6,
+ 0x72, 0x36, 0x82, 0x12, 0x8e, 0xfd, 0x52, 0x1c, 0x2f, 0x5a, 0x2b, 0x23,
+ 0xc0, 0xcb, 0x91, 0x18, 0xe1, 0xe2, 0xa0, 0x12, 0x89, 0x61, 0x7d, 0xa8,
+ 0xc2, 0x09, 0xfe, 0x5e, 0xdf, 0x1c, 0xd8, 0xc1, 0x6d, 0x01, 0xe1, 0x9b,
+ 0x5d, 0xc8, 0x3f, 0xa8, 0xd5, 0x71, 0xd9, 0xea, 0x89, 0xb5, 0x9b, 0xd3,
+ 0xb0, 0xa7, 0x51, 0xa6, 0x22, 0xf6, 0xf6, 0xeb, 0x48, 0x9b, 0xd6, 0x45,
+ 0xf6, 0x01, 0x67, 0x91, 0x97, 0x3a, 0x0b, 0xb1, 0xfa, 0x9c, 0xd1, 0x42,
+ 0xb1, 0x9e, 0x39, 0xaa, 0x02, 0xb7, 0xb9, 0xbf, 0x08, 0xf5, 0xaf, 0xe8,
+ 0xb8, 0x7e, 0xf3, 0x02, 0x53, 0xff, 0x1f, 0xae, 0x8b, 0xee, 0xaf, 0x44,
+ 0x11, 0x6c, 0x16, 0xfb, 0x79, 0x8b, 0xb8, 0x44, 0xb3, 0x13, 0x77, 0xdd,
+ 0xde, 0xa9, 0x9b, 0xd5, 0x66, 0x7c, 0x8f, 0xde, 0x59, 0x15, 0x3d, 0xc3,
+ 0x3b, 0x18, 0xff, 0x91, 0x3f, 0xc6, 0x32, 0xd2, 0xe1, 0x2d, 0xe4, 0x9b,
+ 0xa8, 0x9f, 0x97, 0xf1, 0x7e, 0x23, 0x6e, 0x31, 0x79, 0xb9, 0x7e, 0x6e,
+ 0xcb, 0xbc, 0x47, 0x62, 0x24, 0x82, 0x94, 0xcb, 0xc0, 0xe9, 0x19, 0x25,
+ 0xaf, 0xf5, 0xa0, 0x3a, 0xf2, 0xcb, 0x45, 0xf3, 0xa2, 0x3b, 0xdb, 0xe7,
+ 0x51, 0x63, 0xa4, 0x6f, 0xb6, 0x0f, 0xd0, 0x52, 0xef, 0xce, 0x35, 0x33,
+ 0x0e, 0xcf, 0xf8, 0x7a, 0x1a, 0x53, 0xec, 0xfb, 0xfa, 0xdb, 0xca, 0xd1,
+ 0xa6, 0xab, 0x77, 0x43, 0xb0, 0x8a, 0x63, 0x92, 0xa0, 0x2b, 0x23, 0xe9,
+ 0xf4, 0x01, 0x63, 0xd7, 0xe6, 0xbf, 0x18, 0x57, 0x2a, 0xf4, 0xc5, 0xd6,
+ 0x5a, 0xe1, 0x7c, 0x79, 0xff, 0xf9, 0xc5, 0x68, 0xb1, 0xdb, 0xab, 0xaf,
+ 0x26, 0x78, 0x05, 0x81, 0x13, 0x27, 0x03, 0xbe, 0x2d, 0xdc, 0x83, 0x60,
+ 0x1d, 0x41, 0x58, 0xf3, 0xa0, 0x08, 0x8c, 0x3c, 0x99, 0xa9, 0xae, 0x8e,
+ 0xcd, 0x5c, 0xcc, 0x8f, 0x03, 0x6f, 0x88, 0x7b, 0x18, 0x7d, 0x37, 0x80,
+ 0x30, 0x1d, 0xc3, 0x3d, 0x7b, 0xa1, 0x21, 0x3b, 0xae, 0x45, 0xb3, 0xf2,
+ 0x76, 0x54, 0x5d, 0xa8, 0x1e, 0x2b, 0x80, 0x64, 0xc2, 0xce, 0x5d, 0x44,
+ 0x5c, 0x35, 0x7e, 0x1f, 0xa8, 0x2a, 0xcd, 0x52, 0x43, 0x1e, 0xd6, 0x67,
+ 0x56, 0x56, 0x8b, 0x4d, 0xca, 0x11, 0x38, 0x5a, 0x00, 0xce, 0xbb, 0xc0,
+ 0xb3, 0x23, 0xf3, 0xe2, 0xab, 0xbc, 0xd2, 0xa4, 0xeb, 0x5e, 0x69, 0x27,
+ 0xc6, 0x31, 0x14, 0x3e, 0x63, 0x41, 0xce, 0x09, 0x32, 0xab, 0xc5, 0xc2,
+ 0x31, 0x47, 0x3a, 0x99, 0x03, 0x05, 0x77, 0x23, 0xc3, 0xa3, 0x77, 0x13,
+ 0x60, 0x79, 0x4a, 0x77, 0xd1, 0x92, 0xb8, 0x7d, 0xe6, 0x8e, 0x3b, 0x8c,
+ 0x69, 0x39, 0xcc, 0x00, 0x06, 0xe2, 0x62, 0x84, 0x80, 0x73, 0x12, 0xae,
+ 0x4d, 0x61, 0x60, 0xad, 0x6d, 0x1d, 0x43, 0x44, 0x65, 0x84, 0xdd, 0x46,
+ 0x4b, 0x11, 0xea, 0xdc, 0x47, 0x69, 0xc9, 0xbe, 0x72, 0x25, 0x6c, 0x69,
+ 0x57, 0x23, 0xae, 0x8d, 0x91, 0x63, 0x3e, 0x9a, 0xde, 0x96, 0xb8, 0x13,
+ 0x60, 0xd6, 0x4b, 0x8b, 0x05, 0x06, 0x7d, 0x78, 0xcf, 0x51, 0x0b, 0x5a,
+ 0x3d, 0x88, 0x33, 0x6d, 0x1c, 0x0b, 0x91, 0x3f, 0x17, 0xa9, 0x4e, 0x5a,
+ 0xb9, 0x89, 0x1a, 0xcd, 0x5a, 0x86, 0x6e, 0x9f, 0x64, 0x8c, 0xf0, 0xab,
+ 0x98, 0x41, 0xd2, 0xf6, 0x3e, 0x1b, 0x79, 0x29, 0xb7, 0x66, 0xa1, 0x2a,
+ 0xc2, 0x71, 0xfc, 0xda, 0xb4, 0xdf, 0xbd, 0x2d, 0x7c, 0x03, 0xba, 0xdd,
+ 0x64, 0x6b, 0xa7, 0x17, 0x55, 0xf1, 0xfe, 0xc5, 0xc6, 0xdf, 0x96, 0x65,
+ 0x8a, 0xc5, 0x3b, 0xb5, 0x37, 0x39, 0xa7, 0x3c, 0x83, 0x0a, 0xbc, 0x5e,
+ 0xf0, 0x3c, 0x8b, 0x30, 0xb0, 0x7b, 0x90, 0xba, 0x1b, 0x85, 0x2d, 0xc3,
+ 0xd6, 0x60, 0x2e, 0x4b, 0xa4, 0x2d, 0x62, 0xc8, 0xb3, 0x01, 0x8a, 0x48,
+ 0xd3, 0xe2, 0xd6, 0xf0, 0x56, 0x7d, 0xb7, 0x36, 0x64, 0xa9, 0x1f, 0x42,
+ 0x88, 0xa4, 0x34, 0xee, 0x7a, 0x28, 0x32, 0xd1, 0x2f, 0x2f, 0x26, 0x11,
+ 0x63, 0xab, 0x6c, 0xf2, 0x94, 0x54, 0x08, 0x66, 0xaf, 0x55, 0x0e, 0xd8,
+ 0x45, 0xe0, 0x8c, 0x8c, 0x17, 0x7b, 0xb5, 0xa3, 0x15, 0xfa, 0xb0, 0xcd,
+ 0x04, 0x9e, 0xbf, 0xc5, 0x09, 0x4e, 0x76, 0xb3, 0x74, 0xe0, 0x50, 0xad,
+ 0xaf, 0xf1, 0xff, 0x18, 0xe1, 0x7b, 0x94, 0x44, 0x2f, 0x6e, 0xb3, 0x4b,
+ 0x3f, 0x75, 0x8a, 0xa8, 0x05, 0xd5, 0x55, 0xab, 0xbb, 0xc0, 0x32, 0x3a,
+ 0xca, 0xe2, 0x78, 0x74, 0x0d, 0x40, 0x19, 0xdb, 0x99, 0x9e, 0xad, 0xbf,
+ 0xc1, 0x04, 0xa3, 0x10, 0x49, 0xfa, 0x7b, 0xf7, 0x2f, 0x1c, 0xf6, 0xa8,
+ 0xba, 0x37, 0xc8, 0x77, 0x36, 0x39, 0x27, 0x54, 0xc9, 0x76, 0x9b, 0xa5,
+ 0x43, 0x51, 0x12, 0x59, 0x76, 0x09, 0x3e, 0x53, 0x68, 0xd8, 0x4c, 0x50,
+ 0xc1, 0xf5, 0x08, 0x5f, 0x88, 0x22, 0xae, 0xd5, 0x84, 0x65, 0x59, 0x9f,
+ 0x57, 0xea, 0x9d, 0x6f, 0x14, 0x19, 0xf6, 0xd4, 0x82, 0xac, 0x34, 0xfa,
+ 0x1d, 0xdd, 0x66, 0x14, 0x36, 0x70, 0xf3, 0x40, 0x0d, 0x25, 0xfa, 0xa8,
+ 0x45, 0x64, 0xea, 0x9d, 0xe7, 0xf4, 0x80, 0x50, 0x91, 0x9e, 0x21, 0x54,
+ 0xc9, 0x54, 0x29, 0x9d, 0xf6, 0xde, 0xe2, 0x91, 0x76, 0x98, 0x3e, 0xe9,
+ 0x9b, 0x0b, 0x90, 0xe3, 0x5d, 0xdb, 0xcd, 0x06, 0x1e, 0xf4, 0xdb, 0xd1,
+ 0xcf, 0x88, 0x72, 0x07, 0x65, 0xa8, 0xe2, 0x0e, 0xa6, 0xe1, 0x93, 0x83,
+ 0xfd, 0x40, 0x98, 0x82, 0x03, 0x82, 0x7f, 0xd3, 0x7a, 0xc1, 0xef, 0x25,
+ 0xc2, 0x51, 0xfd, 0x02, 0x5d, 0xe2, 0x2f, 0x9b, 0xd1, 0xf7, 0xc9, 0x03,
+ 0xcd, 0x47, 0xf1, 0xee, 0x32, 0xd9, 0x75, 0xb2, 0xad, 0x27, 0x91, 0x9f,
+ 0x65, 0x0d, 0x5a, 0x73, 0x39, 0xc9, 0x93, 0x7d, 0x47, 0xc1, 0xf7, 0xd4,
+ 0x8f, 0xfe, 0x9b, 0x4b, 0xf2, 0xb8, 0x5e, 0x93, 0x4b, 0xc0, 0x46, 0xe1,
+ 0xc8, 0x3e, 0xd4, 0x8d, 0xb3, 0xf2, 0x99, 0xb9, 0x6f, 0xe8, 0x69, 0xec,
+ 0xa9, 0x7b, 0x01, 0x90, 0x7a, 0xf8, 0x2e, 0x17, 0xb7, 0x57, 0x11, 0x5a,
+ 0x46, 0xdc, 0x4b, 0x53, 0x16, 0x5a, 0xd9, 0xef, 0xb9, 0x44, 0x09, 0x21,
+ 0x55, 0xf1, 0xc7, 0x99, 0x70, 0x4f, 0xc3, 0x4c, 0x9f, 0x17, 0x61, 0xb7,
+ 0x56, 0xc0, 0xe7, 0x61, 0xda, 0xe3, 0x8e, 0xb9, 0x9e, 0x88, 0x5d, 0x73,
+ 0x44, 0x47, 0x6a, 0x0a, 0x98, 0x9a, 0xbc, 0xf9, 0x10, 0x03, 0x08, 0x90,
+ 0x5b, 0x95, 0xce, 0x06, 0x10, 0xcf, 0xc0, 0xbe, 0x97, 0x3b, 0xb7, 0xb2,
+ 0x0f, 0x0a, 0x53, 0x55, 0x73, 0x5d, 0x03, 0x5a, 0x7f, 0x5f, 0x53, 0xe1,
+ 0x37, 0x98, 0x6f, 0xf7, 0x79, 0x8e, 0x22, 0xfd, 0x49, 0x7c, 0x3f, 0x05,
+ 0xdd, 0xf6, 0xb9, 0x63, 0x7e, 0xc6, 0x6e, 0xe6, 0x94, 0x7e, 0x4f, 0x5d,
+ 0x2c, 0xeb, 0xb7, 0x45, 0x79, 0xcf, 0xf6, 0x5f, 0x4d, 0x3b, 0x45, 0x68,
+ 0xf6, 0x54, 0xf8, 0x89, 0x90, 0x30, 0xde, 0xdc, 0x5f, 0x52, 0x04, 0x7a,
+ 0x85, 0x02, 0x18, 0x16, 0x23, 0x2f, 0xbd, 0xe9, 0x72, 0x04, 0xef, 0x0e,
+ 0x75, 0x1e, 0x33, 0x5b, 0x65, 0x91, 0x2a, 0x25, 0xc9, 0xf9, 0xb2, 0x13,
+ 0x54, 0xde, 0xcc, 0xa0, 0x75, 0xc6, 0xed, 0xf4, 0x22, 0x8f, 0xde, 0xf1,
+ 0x4e, 0x25, 0x9b, 0xe9, 0x13, 0x0a, 0xf4, 0xba, 0x4f, 0xe4, 0x23, 0x0f,
+ 0x5c, 0x38, 0x63, 0xe7, 0xff, 0x6a, 0xaa, 0x85, 0xda, 0x68, 0xd8, 0xad,
+ 0x45, 0x80, 0x5c, 0x86, 0x8c, 0x9f, 0x9f, 0xf3, 0xb0, 0xee, 0x3f, 0xf0,
+ 0x54, 0x06, 0x32, 0xfd, 0x57, 0xc2, 0x71, 0x16, 0xed, 0xd4, 0xe3, 0x22,
+ 0xa8, 0xd3, 0x9a, 0x00, 0x7b, 0x83, 0xf4, 0xc5, 0x86, 0x3b, 0xfa, 0x30,
+ 0xba, 0x85, 0x68, 0x06, 0x53, 0x8a, 0x7f, 0x77, 0xc2, 0x66, 0xfe, 0x8e,
+ 0x4b, 0x7f, 0xf7, 0xb1, 0x76, 0x42, 0xf1, 0x69, 0x7b, 0xb1, 0x25, 0xb6,
+ 0xb3, 0xfb, 0x9f, 0xb3, 0xcf, 0x1f, 0xf1, 0xaf, 0x55, 0x22, 0x44, 0x51,
+ 0x2e, 0x82, 0x89, 0x84, 0xf2, 0xc3, 0x09, 0xfd, 0x22, 0xf4, 0x75, 0x88,
+ 0x78, 0xd2, 0x3e, 0x82, 0x14, 0x46, 0x7e, 0xd9, 0xe5, 0xee, 0x50, 0xb5,
+ 0x1d, 0x41, 0x89, 0x95, 0xe2, 0x60, 0x56, 0xd4, 0x39, 0x48, 0x65, 0x06,
+ 0x11, 0x64, 0xa0, 0x76, 0x27, 0x1b, 0xf6, 0x3a, 0x90, 0x9e, 0x36, 0xf7,
+ 0x33, 0x81, 0x3b, 0x58, 0x75, 0xce, 0x87, 0x03, 0x36, 0x23, 0xe9, 0x38,
+ 0x81, 0x4f, 0xf4, 0x72, 0x6e, 0xbf, 0xa6, 0x3a, 0x23, 0x15, 0x70, 0x11,
+ 0x95, 0xcc, 0xfa, 0x60, 0x3b, 0x8f, 0x14, 0xe6, 0xad, 0x2a, 0xd0, 0x91,
+ 0xe8, 0x7e, 0x11, 0xbb, 0x2e, 0xbb, 0xfe, 0x76, 0xe1, 0x9c, 0xa4, 0x12,
+ 0xd3, 0xb1, 0xa0, 0x05, 0xd2, 0xf3, 0x28, 0x4d, 0xb6, 0x13, 0xbe, 0x19,
+ 0x1d, 0x8e, 0x0b, 0x95, 0x4b, 0x0a, 0x57, 0xa3, 0xa3, 0x84, 0xf4, 0x8e,
+ 0x0a, 0x98, 0x0c, 0xb6, 0x96, 0x3e, 0xb2, 0x39, 0xd0, 0x12, 0x51, 0xee,
+ 0x6c, 0x15, 0xc4, 0xfd, 0x67, 0x33, 0x2f, 0xe1, 0xc8, 0x8d, 0x9f, 0xce,
+ 0xec, 0xd0, 0xd1, 0xa8, 0xda, 0x8a, 0x24, 0xa4, 0x4a, 0x1b, 0x8e, 0x4a,
+ 0xe3, 0x93, 0xef, 0x4e, 0xdf, 0x17, 0x66, 0x84, 0x31, 0x78, 0x3a, 0x18,
+ 0xe1, 0xfb, 0xae, 0x97, 0xa7, 0x30, 0x94, 0x75, 0x5c, 0xfc, 0xd6, 0xf7,
+ 0xdc, 0x50, 0x44, 0xfe, 0x62, 0xb1, 0x57, 0xfc, 0x11, 0x18, 0xa7, 0x7d,
+ 0xc9, 0x6b, 0x37, 0x04, 0x00, 0xff, 0x7a, 0x25, 0x78, 0x5c, 0xf1, 0x80,
+ 0xac, 0x03, 0x60, 0xd4, 0xda, 0x78, 0x46, 0x52, 0xb1, 0xf3, 0xa4, 0x3d,
+ 0x1d, 0x56, 0xe3, 0x49, 0x09, 0xcf, 0xa8, 0x75, 0x72, 0x68, 0x99, 0x20,
+ 0x22, 0x01, 0xf5, 0x3c, 0x91, 0xc9, 0xbe, 0x2d, 0x17, 0xa8, 0x16, 0xe3,
+ 0x8d, 0x16, 0x90, 0x3f, 0xb4, 0xf4, 0xfd, 0x64, 0xaa, 0x68, 0x08, 0x61,
+ 0xba, 0x65, 0xb9, 0x3d, 0x25, 0x4b, 0x25, 0x2e, 0xe2, 0x5d, 0xd5, 0xa4,
+ 0xfa, 0x6b, 0x2f, 0x01, 0x8f, 0x07, 0x55, 0xb7, 0x72, 0x11, 0xe0, 0x48,
+ 0xdb, 0x1f, 0xdf, 0x67, 0x97, 0x40, 0x32, 0xab, 0x0d, 0x9e, 0xfe, 0xf8,
+ 0xca, 0xb7, 0x6b, 0x03, 0x5a, 0x06, 0x9f, 0x2c, 0xed, 0x23, 0x5e, 0x4a,
+ 0xb1, 0x41, 0x7c, 0xa1, 0x92, 0x24, 0x6c, 0x98, 0x8c, 0x78, 0x59, 0x94,
+ 0x2e, 0x64, 0x37, 0x13, 0x5c, 0xab, 0xc7, 0x10, 0x5a, 0xf1, 0xe1, 0xd6,
+ 0xa2, 0x78, 0x87, 0x6c, 0x26, 0x9b, 0x96, 0x32, 0x6f, 0x82, 0x4c, 0x29,
+ 0x41, 0x54, 0xfa, 0x9c, 0xce, 0x4b, 0x43, 0x3a, 0xac, 0x98, 0x89, 0x64,
+ 0x95, 0x3c, 0x80, 0xaa, 0xb4, 0xee, 0x1f, 0x7c, 0x9b, 0xc8, 0xed, 0xf4,
+ 0xb1, 0x85, 0x9f, 0x06, 0x62, 0x76, 0xe3, 0x59, 0x26, 0x18, 0x91, 0x5f,
+ 0xc1, 0xe5, 0x98, 0xe2, 0x9f, 0x13, 0x53, 0x2e, 0xa1, 0x84, 0xee, 0xf5,
+ 0x5b, 0x97, 0xba, 0x8b, 0xaa, 0x90, 0x4f, 0x53, 0x8e, 0x78, 0x61, 0x07,
+ 0x94, 0x8c, 0x3f, 0x8c, 0x34, 0x75, 0x93, 0x4b, 0x7e, 0x25, 0xd9, 0x6e,
+ 0x9c, 0xaa, 0x14, 0xd6, 0x85, 0x15, 0xd5, 0x6a, 0xfe, 0x4a, 0x1a, 0x0e,
+ 0x3f, 0xcf, 0x23, 0xb8, 0xf8, 0x77, 0xba, 0x5a, 0x4d, 0xb6, 0x0c, 0x2d,
+ 0xe5, 0xe7, 0x7c, 0x0b, 0xb9, 0x4b, 0x6a, 0xaf, 0xda, 0xec, 0x05, 0x5e,
+ 0x6a, 0xaa, 0xbe, 0x91, 0x58, 0x72, 0x1a, 0x52, 0x84, 0xdb, 0x3c, 0x72,
+ 0x60, 0x12, 0x5a, 0x3a, 0x05, 0xdf, 0x11, 0x94, 0xbf, 0xce, 0x4a, 0x14,
+ 0xf3, 0xc1, 0x70, 0x52, 0xd3, 0xee, 0x32, 0xfc, 0x3a, 0xce, 0x58, 0x84,
+ 0x9c, 0x55, 0x1f, 0x4f, 0xe9, 0xb4, 0x7a, 0x8b, 0xfe, 0x1c, 0xb5, 0xee,
+ 0x86, 0xdb, 0x94, 0x9d, 0x2c, 0x9b, 0x1e, 0x7b, 0xef, 0xb5, 0xec, 0x2d,
+ 0x61, 0x6e, 0x4d, 0xa1, 0xb3, 0x08, 0x26, 0x59, 0x80, 0xd5, 0x66, 0x03,
+ 0xb2, 0x83, 0xfb, 0xff, 0xb0, 0x3f, 0xa7, 0x01, 0x1b, 0xf8, 0x14, 0x89,
+ 0x5a, 0x79, 0x8c, 0x75, 0x8e, 0x60, 0x57, 0x8f, 0xcd, 0x16, 0xeb, 0xfe,
+ 0xde, 0xf6, 0xeb, 0x84, 0xe9, 0xf7, 0xad, 0xb8, 0x06, 0xc0, 0x07, 0x80,
+ 0x19, 0xed, 0x7d, 0x88, 0xd1, 0xb5, 0xef, 0x7e, 0x88, 0xfe, 0x96, 0xf1,
+ 0x2a, 0x71, 0x9d, 0x54, 0xae, 0xfe, 0x27, 0x6c, 0xe5, 0xa3, 0x4a, 0xca,
+ 0x00, 0xac, 0x67, 0x14, 0x99, 0x0f, 0x03, 0xb6, 0xb5, 0xd0, 0xa9, 0x0c,
+ 0x04, 0x7b, 0x70, 0x4d, 0xe0, 0x83, 0xb6, 0x56, 0x8a, 0xc2, 0x04, 0xbb,
+ 0x76, 0xbc, 0xdb, 0x24, 0x23, 0x07, 0xa6, 0xf2, 0x70, 0x46, 0xab, 0x2f,
+ 0xc9, 0x80, 0xbe, 0x36, 0x3b, 0xb0, 0xe0, 0xc9, 0x49, 0xf2, 0x83, 0x15,
+ 0x0a, 0xd3, 0xab, 0x64, 0x8d, 0xd5, 0x6b, 0x13, 0xaf, 0x61, 0x94, 0x27,
+ 0x5f, 0x56, 0xe0, 0x69, 0x3e, 0x0d, 0x4c, 0xf9, 0xb4, 0xba, 0xab, 0x2d,
+ 0xf5, 0x36, 0x69, 0xfe, 0xda, 0x20, 0xb9, 0xd3, 0xf3, 0x8a, 0xf7, 0x56,
+ 0xca, 0x5d, 0x74, 0x6d, 0x35, 0x61, 0x89, 0x1c, 0x51, 0x32, 0xf1, 0x63,
+ 0xfc, 0xaa, 0x72, 0x6e, 0x95, 0xde, 0xbd, 0x76, 0xd2, 0x7f, 0x0b, 0x8d,
+ 0x11, 0xf8, 0xdd, 0x73, 0x92, 0x85, 0x29, 0x3a, 0xdf, 0x50, 0x87, 0x81,
+ 0xaa, 0x0f, 0xfe, 0x9b, 0x0d, 0x52, 0x66, 0x73, 0xd0, 0xff, 0xff, 0xf6,
+ 0xd4, 0xb8, 0xe7, 0xcd, 0x07, 0x49, 0x4e, 0xeb, 0x1f, 0x81, 0x50, 0xb3,
+ 0x51, 0x63, 0x78, 0x46, 0x1b, 0x20, 0x84, 0x8e, 0x71, 0xa7, 0x0a, 0xca,
+ 0x80, 0x39, 0xdc, 0x6b, 0xd8, 0xc1, 0xbe, 0xd1, 0x36, 0xda, 0x4c, 0x7c,
+ 0x94, 0xd2, 0x8e, 0x0f, 0xfb, 0x0a, 0x95, 0x6d, 0x5e, 0x59, 0x50, 0x15,
+ 0x9a, 0xda, 0x39, 0xc7, 0x2b, 0xda, 0x91, 0x82, 0x75, 0x3f, 0xee, 0xae,
+ 0xbb, 0xa7, 0x1c, 0x3c, 0x52, 0xfa, 0x19, 0x05, 0x30, 0x25, 0x37, 0xa0,
+ 0x59, 0x4a, 0x98, 0xe1, 0x28, 0x40, 0x53, 0x72, 0x6f, 0xa9, 0x5a, 0x26,
+ 0x49, 0x14, 0xd0, 0x8d, 0xb5, 0x98, 0x6f, 0x68, 0x1c, 0x7f, 0x67, 0xfd,
+ 0x4d, 0x46, 0xfe, 0x0a, 0x7b, 0xc0, 0x6d, 0xbd, 0xa1, 0x30, 0xcf, 0x99,
+ 0x3f, 0x01, 0x55, 0xdd, 0x07, 0x5e, 0x22, 0xf2, 0x4d, 0xf9, 0xba, 0xc0,
+ 0x82, 0x6f, 0x39, 0x78, 0x08, 0x6f, 0xb9, 0x40, 0x82, 0x9f, 0xf2, 0xd1,
+ 0x7a, 0x12, 0xcd, 0xa2, 0x8c, 0xa0, 0x80, 0xa7, 0xf9, 0x53, 0xec, 0x64,
+ 0x35, 0xa6, 0xec, 0x0b, 0x34, 0x83, 0x7a, 0x89, 0x2c, 0x28, 0x8c, 0x25,
+ 0x79, 0xd6, 0x64, 0x83, 0x79, 0x42, 0xea, 0x99, 0x66, 0xfd, 0x7e, 0x35,
+ 0x59, 0xb7, 0x4b, 0x24, 0x3c, 0x5c, 0x9c, 0xb0, 0x2a, 0xbc, 0x39, 0x83,
+ 0xed, 0x49, 0x3c, 0xc6, 0x79, 0x6b, 0x20, 0x27, 0xd3, 0xfa, 0x26, 0xf2,
+ 0x0e, 0x20, 0xb9, 0xe8, 0x5a, 0x24, 0xf1, 0xea, 0x17, 0xc1, 0xeb, 0xe7,
+ 0xd7, 0xee, 0x61, 0x6b, 0xf5, 0x09, 0xf1, 0xb1, 0x70, 0x9b, 0x4d, 0xfc,
+ 0xcf, 0xfc, 0x67, 0x82, 0x9b, 0x02, 0x11, 0x62, 0x66, 0x8e, 0x07, 0xad,
+ 0x3a, 0x9b, 0xc4, 0x5f, 0x1c, 0xf6, 0xc6, 0xc5, 0xd8, 0x34, 0x61, 0x80,
+ 0xfa, 0x27, 0x3d, 0x35, 0x27, 0x77, 0x74, 0x21, 0xee, 0x7e, 0x15, 0x29,
+ 0xe3, 0xd5, 0xbe, 0x02, 0xee, 0x5c, 0x0e, 0x7a, 0x04, 0xe6, 0xd6, 0xe6,
+ 0xa9, 0x1c, 0x13, 0x37, 0x7c, 0xc9, 0x3c, 0x2e, 0xf3, 0xf5, 0x7d, 0xbc,
+ 0x50, 0x2c, 0x17, 0x6a, 0x51, 0xac, 0x22, 0xa8, 0x34, 0x0c, 0xc4, 0x95,
+ 0xd3, 0xbc, 0xe5, 0x6d, 0x0d, 0x89, 0x0a, 0x39, 0xd7, 0x24, 0x8b, 0xc2,
+ 0xbd, 0x31, 0xf5, 0xa7, 0xc4, 0x23, 0x57, 0xcc, 0x3b, 0xdf, 0x67, 0x64,
+ 0xcd, 0x7a, 0x8e, 0xb8, 0x5a, 0x62, 0xe6, 0x29, 0xa3, 0x8b, 0xba, 0x24,
+ 0x5f, 0xdc, 0x2e, 0xb5, 0x30, 0x9b, 0x7b, 0x21, 0xfa, 0x4e, 0x3b, 0xa0,
+ 0x03, 0x07, 0x2d, 0x7b, 0x51, 0x9f, 0xd3, 0xba, 0x91, 0x73, 0x25, 0xce,
+ 0xdb, 0x8e, 0xcd, 0x2f, 0xdf, 0x9c, 0x3f, 0xa3, 0x39, 0xa7, 0x8e, 0x50,
+ 0x06, 0x21, 0x42, 0xb5, 0x52, 0xfe, 0x4c, 0x5d, 0xdd, 0xf1, 0x75, 0x9b,
+ 0x9d, 0xb8, 0xce, 0x2a, 0xfc, 0x28, 0x34, 0xa1, 0x5b, 0xa3, 0x95, 0xf7,
+ 0x7f, 0x53, 0xd2, 0x4f, 0x25, 0xc1, 0x8a, 0x21, 0x93, 0xba, 0xdc, 0xb5,
+ 0x61, 0xcc, 0x35, 0xcc, 0x66, 0x8e, 0xb7, 0x43, 0x1a, 0x4c, 0xb1, 0xbb,
+ 0x19, 0x80, 0xe0, 0xd5, 0x76, 0x44, 0x26, 0x16, 0x54, 0x17, 0x6a, 0x13,
+ 0x19, 0xe8, 0x67, 0x1a, 0x7b, 0x64, 0xb0, 0x49, 0x70, 0x0e, 0xdb, 0xc1,
+ 0xd7, 0xa9, 0x53, 0x63, 0x8b, 0x54, 0x23, 0xe1, 0x46, 0x61, 0xd5, 0xda,
+ 0x7f, 0x3c, 0xf1, 0x52, 0x62, 0xe7, 0x27, 0x8c, 0x68, 0xcc, 0x84, 0x05,
+ 0x05, 0xe0, 0xa9, 0xb1, 0x2f, 0x2f, 0x23, 0x38, 0x78, 0x66, 0xac, 0x07,
+ 0xec, 0xaf, 0x3a, 0x99, 0xf6, 0x46, 0x2e, 0xb4, 0x43, 0xa2, 0xc3, 0x98,
+ 0x9b, 0x10, 0x39, 0x63, 0x5a, 0x0b, 0x1e, 0x44, 0x30, 0xf4, 0xfb, 0x7a,
+ 0x2f, 0x2f, 0xeb, 0xad, 0x4e, 0xd0, 0x12, 0xeb, 0x57, 0x0e, 0x78, 0xb1,
+ 0x9c, 0x01, 0xe2, 0xfd, 0xf3, 0xcb, 0x86, 0x70, 0x5c, 0x65, 0xcc, 0xc0,
+ 0x91, 0xe5, 0x15, 0xbd, 0x3a, 0x1b, 0x2e, 0xb1, 0xc1, 0xfb, 0x97, 0x2d,
+ 0x68, 0x7a, 0xb6, 0x46, 0xd4, 0x5e, 0x90, 0x17, 0x91, 0x94, 0xcd, 0x78,
+ 0x16, 0xba, 0xa5, 0x0b, 0xe5, 0xfc, 0xf6, 0xcf, 0xb3, 0xd3, 0xcb, 0x28,
+ 0xa5, 0xf7, 0xde, 0xb2, 0x0f, 0xb6, 0x65, 0xa5, 0xd3, 0xe9, 0xeb, 0xe0,
+ 0x72, 0x1b, 0xf3, 0x5c, 0xde, 0xfb, 0x36, 0xf3, 0x94, 0x1e, 0xe1, 0x7a,
+ 0x85, 0x43, 0x4e, 0x8f, 0x66, 0xf0, 0x50, 0x88, 0xfa, 0x11, 0xf6, 0x44,
+ 0x96, 0x66, 0xc3, 0xd5, 0x0d, 0xb0, 0x56, 0x9e, 0x93, 0xbe, 0x22, 0xc0,
+ 0x54, 0xa6, 0x68, 0x2c, 0x31, 0xea, 0x87, 0x15, 0x53, 0xd2, 0xae, 0xb2,
+ 0x5a, 0x20, 0x93, 0x68, 0xa6, 0x9f, 0xe5, 0x8e, 0xe9, 0xe8, 0xa9, 0xc7,
+ 0x49, 0xe9, 0x63, 0xbe, 0x2f, 0xd4, 0xf3, 0x7d, 0xa5, 0xb1, 0xb7, 0x78,
+ 0x85, 0x0c, 0x5c, 0x11, 0x77, 0xea, 0xef, 0x16, 0x2f, 0xbe, 0xdd, 0x40,
+ 0x9d, 0xdd, 0x96, 0xbf, 0x9f, 0x7e, 0xa0, 0xd4, 0x72, 0x7c, 0x42, 0xc0,
+ 0x2e, 0x81, 0x88, 0xf7, 0x74, 0xbd, 0x93, 0x7c, 0x21, 0x53, 0x29, 0xb1,
+ 0x61, 0x6e, 0x74, 0xe4, 0xb4, 0xd7, 0xd3, 0x6b, 0x9f, 0x72, 0xa3, 0x9e,
+ 0x10, 0xad, 0xd8, 0xf0, 0xe4, 0x54, 0xb5, 0x79, 0xeb, 0x8e, 0x68, 0xc3,
+ 0xeb, 0xa0, 0x5d, 0x05, 0xee, 0xd3, 0xb4, 0x60, 0x4d, 0xd8, 0x6a, 0x37,
+ 0x18, 0x87, 0x81, 0x98, 0xfc, 0x8e, 0x07, 0x2d, 0xf9, 0x24, 0xc7, 0x0b,
+ 0x20, 0x8e, 0xf4, 0x7e, 0x89, 0xd1, 0x66, 0xf9, 0x92, 0x0f, 0xf8, 0x7f,
+ 0x49, 0x40, 0x8f, 0x99, 0x19, 0xd5, 0xc2, 0x93, 0x9d, 0x06, 0x7c, 0xe2,
+ 0x0b, 0xa8, 0xb0, 0xaa, 0x6a, 0x5b, 0x81, 0x1e, 0xa8, 0x6a, 0x03, 0xe0,
+ 0xa2, 0xdc, 0x7b, 0x5b, 0x5d, 0xab, 0xf2, 0x94, 0xbc, 0x44, 0x05, 0xa0,
+ 0x2f, 0x82, 0x66, 0xd3, 0x6c, 0xd7, 0xce, 0x30, 0x64, 0x71, 0xb8, 0x27,
+ 0x96, 0xae, 0xdc, 0xcc, 0x3d, 0xdf, 0x2d, 0x3c, 0x3e, 0x5a, 0x36, 0xb8,
+ 0x90, 0x75, 0x2a, 0xb2, 0x29, 0xfd, 0xd4, 0x63, 0xa2, 0xe7, 0x82, 0xcc,
+ 0x2e, 0x39, 0x8b, 0x30, 0x4b, 0xc9, 0x60, 0xaa, 0x27, 0xc9, 0x51, 0x6a,
+ 0x69, 0x22, 0x3e, 0xde, 0xd6, 0xba, 0xb2, 0x39, 0x4e, 0x43, 0xd5, 0x41,
+ 0xc5, 0xca, 0x22, 0x68, 0x88, 0xa4, 0x1a, 0xad, 0x5a, 0x05, 0x7e, 0xe7,
+ 0xdb, 0xb2, 0x2c, 0xe7, 0xf0, 0xec, 0xa8, 0x00, 0x9a, 0x5a, 0xe6, 0x75,
+ 0x94, 0x62, 0x7e, 0xc3, 0xcd, 0x59, 0x63, 0x02, 0xd1, 0xa1, 0xd2, 0xf9,
+ 0xeb, 0x6d, 0x79, 0x69, 0xa7, 0xd2, 0xeb, 0x0b, 0x7c, 0xeb, 0x51, 0x10,
+ 0xcf, 0xcd, 0x1e, 0x16, 0x0b, 0x5b, 0x5e, 0xe4, 0xe8, 0x6f, 0x30, 0xcc,
+ 0xeb, 0xc0, 0xf6, 0xb6, 0xd0, 0xd0, 0x1a, 0xee, 0x02, 0x3e, 0x1f, 0x73,
+ 0x31, 0x8e, 0xd7, 0x9f, 0x6d, 0xfb, 0x76, 0x17, 0x6e, 0x99, 0x7f, 0xec,
+ 0xe4, 0x56, 0xa0, 0xe6, 0x4d, 0x9f, 0x6e, 0x72, 0x18, 0x4d, 0x6b, 0x7a,
+ 0x20, 0x53, 0xa9, 0x7b, 0x4d, 0x3f, 0xf8, 0xc5, 0x7e, 0x0d, 0x5d, 0x27,
+ 0x9b, 0x7c, 0xb8, 0x69, 0x7b, 0xc4, 0xf6, 0xc8, 0x17, 0xa1, 0xa8, 0x11,
+ 0xa4, 0xa4, 0x73, 0xb6, 0x4e, 0xc7, 0x94, 0x18, 0x4d, 0x8c, 0xe1, 0x90,
+ 0x36, 0x04, 0xbc, 0xf1, 0xd5, 0x55, 0xce, 0x57, 0x92, 0x23, 0x69, 0xce,
+ 0x3c, 0xb0, 0x63, 0x50, 0x05, 0x50, 0x8b, 0xa4, 0x50, 0xf7, 0x24, 0xcd,
+ 0x89, 0xed, 0xc0, 0x64, 0xe5, 0x93, 0x79, 0x3e, 0x7c, 0x15, 0x89, 0x01,
+ 0x2e, 0x9c, 0xf0, 0x30, 0xcb, 0xf3, 0x03, 0x87, 0x70, 0xaa, 0x07, 0x4c,
+ 0xf3, 0x4c, 0xe4, 0xbb, 0x6d, 0x3f, 0xde, 0x52, 0xde, 0x0a, 0xfe, 0xbe,
+ 0x6a, 0xc1, 0x9c, 0xd1, 0x0d, 0x02, 0x9e, 0xb4, 0x68, 0x1d, 0x23, 0x01,
+ 0x5d, 0x6a, 0xa7, 0x27, 0x9d, 0xb9, 0xad, 0xaa, 0x8c, 0xf1, 0x76, 0xbf,
+ 0xda, 0x37, 0x79, 0x8a, 0x84, 0xd8, 0x0c, 0x5d, 0x89, 0x5a, 0x70, 0xe6,
+ 0x7f, 0xb5, 0x3c, 0xd8, 0xad, 0x29, 0x59, 0xd5, 0x75, 0x66, 0x84, 0x87,
+ 0x82, 0xd8, 0xc0, 0x66, 0xf2, 0x2a, 0x53, 0xe9, 0xbd, 0xe2, 0xb0, 0x10,
+ 0x5d, 0x2e, 0x73, 0xad, 0x9c, 0xff, 0xd2, 0xcc, 0x6a, 0x76, 0x95, 0xcb,
+ 0x59, 0xf1, 0x41, 0xf3, 0x08, 0x3e, 0x96, 0x13, 0x54, 0xb4, 0x5a, 0x82,
+ 0x8b, 0x93, 0x00, 0x87, 0x54, 0x2e, 0x0a, 0xb5, 0x65, 0x5c, 0xdd, 0x86,
+ 0x9c, 0x35, 0x31, 0x7d, 0x82, 0x86, 0x83, 0x9f, 0x44, 0x80, 0x16, 0xc9,
+ 0x70, 0xd1, 0xff, 0x33, 0x21, 0xb0, 0xf2, 0x10, 0xd2, 0x47, 0x00, 0xff,
+ 0x56, 0x04, 0x25, 0xe7, 0xe4, 0xca, 0x5a, 0x27, 0xc0, 0x9a, 0x4e, 0xc2,
+ 0xa1, 0x37, 0xf1, 0x3f, 0x02, 0xec, 0xd1, 0xfd, 0x3d, 0xa2, 0xef, 0x42,
+ 0xf4, 0xca, 0x83, 0xca, 0x50, 0x9f, 0x08, 0x1e, 0x63, 0x4f, 0x82, 0x8a,
+ 0x8a, 0xfa, 0xaa, 0x89, 0xb0, 0x4c, 0xc9, 0x59, 0xbc, 0x9a, 0xf7, 0xbd,
+ 0xfd, 0xc0, 0xf8, 0xbd, 0xe6, 0xb6, 0x6e, 0x9b, 0x58, 0x8a, 0x55, 0x98,
+ 0x37, 0xa4, 0xf1, 0x0b, 0x6a, 0x5a, 0x5d, 0x41, 0xbc, 0x19, 0xa1, 0x78,
+ 0x5a, 0xcf, 0xee, 0x8f, 0x9c, 0x5a, 0x97, 0x28, 0xa8, 0x11, 0x15, 0x40,
+ 0xe4, 0x21, 0x9d, 0xdd, 0xd8, 0xcc, 0x60, 0xf6, 0x78, 0x14, 0xc8, 0x14,
+ 0xff, 0x47, 0x76, 0x26, 0x3e, 0x96, 0x01, 0x72, 0x80, 0x07, 0x36, 0xa9,
+ 0xc9, 0xf8, 0x9e, 0xec, 0x69, 0x2a, 0x1c, 0xd3, 0x09, 0x5c, 0xd7, 0x3a,
+ 0x6f, 0xdf, 0xa8, 0x92, 0x66, 0xe4, 0x7f, 0x8c, 0x85, 0x95, 0x12, 0xf5,
+ 0x42, 0x87, 0xa4, 0x30, 0x55, 0xcf, 0x56, 0x9a, 0x46, 0xfb, 0xaf, 0x29,
+ 0x20, 0x7b, 0xca, 0x4e, 0xc1, 0xf9, 0x6b, 0x6a, 0x22, 0x8a, 0x2c, 0x3a,
+ 0xda, 0x22, 0x50, 0x83, 0x3b, 0x08, 0xf9, 0xcb, 0xdb, 0xce, 0xf7, 0xb7,
+ 0x82, 0x14, 0x41, 0xec, 0xcf, 0xbd, 0xe6, 0x44, 0x38, 0x14, 0xad, 0x03,
+ 0xaa, 0x05, 0xe2, 0x4e, 0xda, 0x30, 0xee, 0xb9, 0xb2, 0x8b, 0xa6, 0x37,
+ 0xfd, 0x6e, 0xa4, 0xa1, 0x02, 0xde, 0x3e, 0x36, 0xfd, 0x1c, 0xdc, 0x2c,
+ 0xd1, 0x6b, 0xc3, 0xd5, 0xcd, 0x16, 0x28, 0xd4, 0x66, 0x77, 0xa9, 0x1a,
+ 0x34, 0x3e, 0x8b, 0x54, 0x81, 0x41, 0xfd, 0xff, 0x3c, 0xad, 0x05, 0xa9,
+ 0x14, 0x6d, 0xc6, 0xa3, 0x95, 0xb0, 0x02, 0x6b, 0x9d, 0x24, 0x5a, 0xe2,
+ 0x9d, 0x86, 0xd6, 0x62, 0x0c, 0x38, 0x44, 0x1a, 0x65, 0x65, 0x4b, 0x84,
+ 0xe7, 0xd9, 0x20, 0x83, 0xa2, 0x7a, 0x4e, 0xac, 0xe9, 0x1b, 0x06, 0x54,
+ 0x63, 0x86, 0x65, 0xc4, 0x28, 0xf9, 0x66, 0x55, 0x8b, 0x12, 0x68, 0x5a,
+ 0x87, 0x78, 0x63, 0xcd, 0xff, 0x4c, 0x00, 0x7a, 0x04, 0x75, 0x6b, 0x05,
+ 0xd0, 0xd8, 0xed, 0x33, 0x84, 0xae, 0x00, 0x5a, 0x35, 0xea, 0xf3, 0xa8,
+ 0x86, 0x11, 0xd0, 0xe6, 0x5c, 0xb0, 0x06, 0xc5, 0x13, 0xb3, 0x44, 0xe5,
+ 0x2f, 0x21, 0x13, 0x06, 0xe5, 0x1f, 0x06, 0x90, 0xa6, 0xb0, 0xff, 0x0d,
+ 0x29, 0x06, 0xb1, 0x5f, 0x1a, 0x41, 0x16, 0x60, 0x14, 0xbc, 0xaa, 0xbf,
+ 0xe1, 0xd3, 0x9b, 0x0d, 0xc8, 0x8b, 0x84, 0x24, 0x73, 0x43, 0x76, 0xe3,
+ 0x9b, 0x99, 0x73, 0x32, 0xcd, 0x22, 0x41, 0xe6, 0x15, 0x70, 0x5f, 0xa9,
+ 0xd5, 0x3d, 0x58, 0xb5, 0x09, 0xa2, 0x97, 0x96, 0x81, 0x1d, 0xcf, 0xa2,
+ 0x69, 0x42, 0xb8, 0xc0, 0x82, 0x04, 0x29, 0x03, 0x91, 0x26, 0x10, 0x39,
+ 0x95, 0x1e, 0xe2, 0xb0, 0xcb, 0x8e, 0x47, 0x0a, 0xdc, 0x1d, 0x7e, 0xd4,
+ 0x29, 0x90, 0xb1, 0x7e, 0xdf, 0x94, 0x8c, 0xcf, 0x17, 0x3f, 0xcd, 0x14,
+ 0x7b, 0xb5, 0xe8, 0xbb, 0x41, 0x73, 0xb1, 0x03, 0xd2, 0x18, 0x52, 0x7b,
+ 0xa5, 0x9b, 0x59, 0x9c, 0x1b, 0xf1, 0xff, 0xde, 0x73, 0x70, 0xb3, 0xbb,
+ 0xee, 0x8b, 0xdb, 0xc4, 0xa6, 0x44, 0x51, 0xef, 0x3d, 0xb0, 0x0e, 0x9e,
+ 0x60, 0xdd, 0x12, 0xbd, 0x42, 0xe4, 0xef, 0x24, 0x99, 0x33, 0x42, 0x01,
+ 0x71, 0x93, 0x4a, 0xc3, 0xf4, 0xa5, 0x47, 0x14, 0xc0, 0x21, 0x62, 0xb0,
+ 0xf3, 0x53, 0xe0, 0xf1, 0xba, 0x9e, 0x81, 0xbd, 0xe8, 0x0a, 0xa2, 0x16,
+ 0xad, 0x5c, 0x89, 0xe7, 0xa5, 0x1f, 0xb3, 0x53, 0x5b, 0x8a, 0x75, 0x43,
+ 0x68, 0xbc, 0x83, 0xe6, 0x0e, 0x74, 0x80, 0xfa, 0xe5, 0x99, 0x7e, 0xd0,
+ 0x5a, 0x0f, 0x0b, 0x7d, 0xc7, 0x9d, 0x53, 0x20, 0xf7, 0x2b, 0x34, 0xb6,
+ 0xfd, 0x60, 0x75, 0x45, 0x88, 0x2b, 0x10, 0x2c, 0x82, 0xc5, 0xea, 0xb8,
+ 0xa2, 0x5e, 0x0e, 0xaf, 0x0c, 0xf3, 0x7c, 0x1d, 0x91, 0x4a, 0x24, 0xff,
+ 0x9d, 0xa4, 0xae, 0xb4, 0xc7, 0x2c, 0xaa, 0xc9, 0x42, 0x4d, 0x3c, 0x33,
+ 0x21, 0xc8, 0xb1, 0x1e, 0x66, 0xc8, 0x5b, 0xba, 0x10, 0xa9, 0x17, 0x13,
+ 0x67, 0x3c, 0x52, 0x2d, 0x0b, 0x11, 0xb4, 0x0d, 0xf4, 0x47, 0x90, 0x4d,
+ 0x61, 0xab, 0x86, 0x60, 0xf3, 0x53, 0x39, 0x92, 0xa4, 0xd6, 0xeb, 0x9e,
+ 0x69, 0xe7, 0xa8, 0x6e, 0x24, 0x78, 0xfe, 0x52, 0x27, 0xa2, 0xdc, 0x9f,
+ 0xed, 0xc6, 0x99, 0xe1, 0x94, 0x41, 0xcd, 0xfe, 0x0b, 0x95, 0xb4, 0x85,
+ 0x20, 0x16, 0x71, 0x07, 0x5d, 0xab, 0xc0, 0xc0, 0x87, 0x3d, 0xd2, 0xe2,
+ 0x58, 0x4f, 0xf9, 0x1f, 0x63, 0x68, 0xbe, 0x50, 0x5e, 0xe0, 0x51, 0xab,
+ 0x47, 0x65, 0xaf, 0x46, 0xe2, 0x64, 0x56, 0x0b, 0x02, 0x51, 0x9e, 0xd4,
+ 0x84, 0xc8, 0xa5, 0x8d, 0xf3, 0x17, 0xa7, 0xe7, 0x06, 0xe9, 0x77, 0x74,
+ 0xf1, 0xf1, 0x2f, 0xa1, 0x18, 0x4b, 0xf7, 0x75, 0x4b, 0xa6, 0xf0, 0x53,
+ 0x5b, 0xd0, 0x11, 0xd5, 0xad, 0xb2, 0x33, 0xc0, 0xca, 0x73, 0x0a, 0xc6,
+ 0x46, 0xa0, 0x68, 0xda, 0x36, 0x27, 0xa5, 0x95, 0x49, 0x8d, 0x9d, 0x08,
+ 0xfe, 0x27, 0xce, 0x2f, 0x10, 0x27, 0xd6, 0x46, 0x85, 0x6c, 0x71, 0xce,
+ 0xa0, 0x5a, 0x0e, 0x3d, 0x4f, 0x4d, 0x9d, 0x29, 0xf5, 0xbc, 0x67, 0x58,
+ 0xb5, 0x29, 0x87, 0x85, 0xdb, 0xcd, 0x78, 0x5b, 0xab, 0xa9, 0x1e, 0x73,
+ 0x45, 0x97, 0x38, 0x20, 0x76, 0xd9, 0x16, 0xb1, 0x0c, 0xfe, 0x1e, 0x25,
+ 0x2b, 0x5c, 0xd8, 0x5b, 0xf0, 0x32, 0xf5, 0xa3, 0x1d, 0xb9, 0xef, 0x4c,
+ 0x34, 0x80, 0x73, 0x42, 0xec, 0xb9, 0x49, 0x61, 0xdd, 0xad, 0x38, 0xa8,
+ 0x9a, 0x2e, 0xf5, 0x75, 0x56, 0x5a, 0xc2, 0xf4, 0x20, 0xc0, 0x13, 0x03,
+ 0xbb, 0xfa, 0x72, 0x7d, 0xbe, 0xdc, 0xc8, 0xca, 0x5c, 0x7d, 0x62, 0x5e,
+ 0xb0, 0x75, 0xe9, 0xd7, 0x7f, 0xfe, 0xf2, 0xb8, 0x34, 0xc9, 0xdb, 0x1c,
+ 0x69, 0x7b, 0x59, 0x3f, 0xed, 0xc9, 0xa1, 0x6f, 0x82, 0xdd, 0x61, 0x11,
+ 0x0b, 0x44, 0x0b, 0xbc, 0x8f, 0xba, 0xe1, 0xbe, 0xea, 0x34, 0x66, 0x9a,
+ 0xfe, 0x1d, 0x9a, 0x31, 0x9f, 0x61, 0x15, 0x5c, 0xee, 0x98, 0x63, 0x94,
+ 0x4b, 0x01, 0x7d, 0x62, 0xcd, 0xa7, 0x47, 0x3b, 0x65, 0xd6, 0x4d, 0xb0,
+ 0x4b, 0x73, 0xcd, 0x36, 0xb7, 0x25, 0x50, 0x4f, 0xae, 0x1f, 0x73, 0xa7,
+ 0xbd, 0x84, 0x4c, 0x74, 0x1c, 0x45, 0x87, 0x63, 0x17, 0xba, 0x84, 0xf6,
+ 0xbb, 0x32, 0x1e, 0x90, 0xb1, 0x67, 0x72, 0x62, 0x8a, 0x1f, 0xdb, 0x32,
+ 0x4c, 0x93, 0xfc, 0x31, 0x00, 0x30, 0x69, 0xbd, 0xf2, 0x55, 0xe1, 0x17,
+ 0x63, 0x7f, 0x8d, 0xf8, 0x7f, 0x2f, 0x1b, 0xa0, 0x29, 0x51, 0x14, 0x9e,
+ 0x15, 0x00, 0x59, 0xcb, 0x0e, 0xf1, 0x78, 0x6b, 0xeb, 0x0d, 0xc2, 0xba,
+ 0xb0, 0x9f, 0xb6, 0x93, 0x2b, 0x03, 0xd6, 0x44, 0x6f, 0xfd, 0xe8, 0xb4,
+ 0x20, 0x5b, 0xec, 0xaa, 0xd4, 0x7f, 0x45, 0x65, 0x22, 0x0a, 0x3f, 0xd1,
+ 0x24, 0x15, 0x28, 0x28, 0x95, 0xe5, 0xef, 0x7c, 0xfe, 0xe8, 0x52, 0xc3,
+ 0x6d, 0x8e, 0xca, 0x33, 0x89, 0xa8, 0xb6, 0x5c, 0xef, 0xee, 0xdf, 0x54,
+ 0x51, 0x4f, 0xfd, 0x81, 0x9a, 0x6a, 0x7d, 0xcd, 0x90, 0x6c, 0xb7, 0xaf,
+ 0x47, 0x12, 0x9e, 0x03, 0x0f, 0xd9, 0xb3, 0x14, 0x8f, 0x72, 0x03, 0x18,
+ 0x30, 0xb3, 0xb7, 0xb7, 0x6c, 0xc6, 0x53, 0x09, 0x77, 0x4d, 0x8d, 0x11,
+ 0xc1, 0x2c, 0xe1, 0xf6, 0x6c, 0xdf, 0x51, 0xc2, 0x56, 0x1f, 0x75, 0xc4,
+ 0x92, 0xe9, 0x33, 0x68, 0x14, 0x2b, 0xf5, 0xe6, 0x67, 0x15, 0x57, 0x6c,
+ 0x2c, 0xe2, 0x30, 0x50, 0x40, 0x26, 0xec, 0xf2, 0x4f, 0x56, 0x37, 0xaa,
+ 0xb7, 0x7a, 0x4e, 0xb3, 0x57, 0xee, 0x2a, 0xa0, 0xa1, 0x1c, 0xcf, 0x7f,
+ 0xc7, 0x59, 0x72, 0x08, 0x07, 0xc5, 0xce, 0xfd, 0x8f, 0x72, 0x89, 0x5b,
+ 0xbc, 0xdf, 0xec, 0x60, 0xf9, 0xff, 0xeb, 0x40, 0xe5, 0xf8, 0x6a, 0x97,
+ 0x79, 0x30, 0x87, 0xff, 0x5b, 0x0e, 0x9b, 0x37, 0x15, 0xca, 0x45, 0x5a,
+ 0x2f, 0x8b, 0xf4, 0xd1, 0xde, 0x00, 0xc3, 0x9f, 0x6d, 0x7b, 0x5c, 0xa8,
+ 0x84, 0x7d, 0x56, 0x92, 0x15, 0xdb, 0x6e, 0xe4, 0x9a, 0xde, 0x4d, 0xe1,
+ 0xa4, 0xe9, 0xfd, 0x8c, 0x15, 0xec, 0x18, 0xb6, 0x5a, 0xe5, 0xf2, 0x4c,
+ 0x54, 0xce, 0x77, 0xed, 0xb7, 0xba, 0x14, 0xad, 0x19, 0xce, 0x45, 0x5e,
+ 0x4f, 0x53, 0x41, 0x01, 0xbd, 0x65, 0x06, 0xcd, 0x07, 0x8a, 0x5b, 0xcc,
+ 0x60, 0xfa, 0x48, 0xba, 0x1c, 0xde, 0x26, 0xd9, 0x83, 0x82, 0xd2, 0x12,
+ 0x1f, 0x49, 0x75, 0xcf, 0xb4, 0xde, 0x80, 0xa0, 0xe0, 0x78, 0x9b, 0x49,
+ 0xce, 0xcf, 0xb1, 0x22, 0x32, 0x37, 0x56, 0x94, 0x9a, 0x2f, 0xa9, 0xef,
+ 0xbb, 0x4e, 0xc1, 0x07, 0x92, 0x0d, 0xbc, 0xe9, 0x6b, 0x0e, 0x5a, 0xd5,
+ 0x5b, 0xe1, 0x43, 0x4d, 0x12, 0x1a, 0x72, 0x2e, 0x0b, 0x5a, 0x4a, 0x4d,
+ 0xf6, 0x56, 0xe5, 0x1c, 0x71, 0x49, 0xfe, 0x0c, 0x3e, 0x30, 0x8f, 0x15,
+ 0xd0, 0x7e, 0xb2, 0x0d, 0x5d, 0x48, 0xda, 0x23, 0x10, 0x22, 0xa4, 0xf5,
+ 0xf4, 0x3a, 0x3a, 0xe1, 0xd4, 0xfc, 0x63, 0x6d, 0x0c, 0xcd, 0x7b, 0x60,
+ 0xa8, 0x89, 0xe3, 0x97, 0x7c, 0x7f, 0xe9, 0x54, 0x43, 0xe4, 0xac, 0xd1,
+ 0x6c, 0x31, 0xf8, 0x61, 0x96, 0x14, 0xb5, 0x4c, 0xa8, 0x42, 0xb8, 0x67,
+ 0x79, 0xfe, 0x46, 0xc3, 0x06, 0x6b, 0x29, 0x1d, 0x4f, 0x84, 0x6f, 0x8e,
+ 0x1d, 0xbf, 0xb1, 0x81, 0x51, 0xe7, 0x21, 0x71, 0x78, 0x2a, 0x8a, 0xb8,
+ 0x53, 0x6a, 0xcc, 0x06, 0x79, 0x9d, 0xa3, 0xd7, 0xe0, 0x69, 0xc4, 0xc4,
+ 0x56, 0x75, 0xb2, 0x82, 0x6e, 0x6d, 0xff, 0x62, 0x4b, 0x21, 0x58, 0x8a,
+ 0x62, 0x09, 0x0d, 0xdc, 0xd3, 0x31, 0xf2, 0x55, 0x75, 0xd6, 0xcf, 0x28,
+ 0xf7, 0xed, 0xe1, 0x41, 0xd6, 0x3f, 0x6c, 0x88, 0x18, 0xe6, 0x1a, 0x82,
+ 0xfb, 0x07, 0xd4, 0x14, 0x33, 0x6a, 0xd9, 0xa5, 0x66, 0x09, 0x2a, 0xce,
+ 0x95, 0x4d, 0x7d, 0xfa, 0xfc, 0x58, 0x9b, 0xd5, 0xfd, 0x1a, 0x5b, 0x61,
+ 0x38, 0xc5, 0x6a, 0x93, 0xcc, 0x62, 0xe0, 0x91, 0x27, 0x47, 0x2e, 0xaa,
+ 0x4e, 0x5a, 0x2c, 0x5e, 0x54, 0x98, 0xff, 0x98, 0xa6, 0x88, 0xb7, 0x76,
+ 0x73, 0x05, 0xf1, 0x8c, 0x18, 0x34, 0x88, 0xf5, 0xcd, 0xad, 0x4f, 0xdb,
+ 0x85, 0x42, 0x67, 0xe7, 0x88, 0xaf, 0xbe, 0x4e, 0x76, 0xc1, 0x22, 0x21,
+ 0x46, 0x3c, 0x64, 0xd5, 0x6e, 0x6a, 0x46, 0x1c, 0x86, 0x9b, 0x51, 0x87,
+ 0x14, 0x39, 0x2e, 0x83, 0x08, 0x47, 0x05, 0x49, 0xed, 0x09, 0xc2, 0xbd,
+ 0x2f, 0x77, 0x3a, 0x90, 0xd0, 0x7c, 0xe9, 0xcb, 0xcd, 0xb0, 0x4c, 0x10,
+ 0x39, 0xfb, 0xde, 0x73, 0xbb, 0x70, 0x27, 0xcc, 0xf0, 0x1f, 0xfb, 0x50,
+ 0x83, 0x62, 0xf4, 0x76, 0xb9, 0x47, 0x12, 0x11, 0xa4, 0x3e, 0xbe, 0x8d,
+ 0xe2, 0xa4, 0x19, 0xfe, 0x21, 0xcc, 0xca, 0x6d, 0x93, 0x15, 0xdd, 0xd2,
+ 0x8c, 0x56, 0x55, 0xc7, 0xf4, 0x6c, 0x62, 0xcf, 0xa9, 0x81, 0x01, 0xce,
+ 0x1b, 0x0f, 0xc6, 0x3b, 0xf0, 0xf3, 0xa8, 0xa0, 0x96, 0x9d, 0x9b, 0xb7,
+ 0x14, 0x85, 0x65, 0x0f, 0x57, 0x6f, 0xc2, 0x14, 0xfc, 0xfe, 0xb4, 0x98,
+ 0x9b, 0xc6, 0xa4, 0x34, 0xf9, 0x04, 0x6d, 0x7f, 0x90, 0xaf, 0xfa, 0x6f,
+ 0xe1, 0x37, 0xfb, 0x26, 0xca, 0xd0, 0xd6, 0x1d, 0x65, 0x36, 0x07, 0x4d,
+ 0x09, 0x8e, 0xae, 0x1f, 0x3a, 0x56, 0x14, 0x8b, 0x8f, 0xec, 0x23, 0x03,
+ 0x78, 0xe6, 0x7c, 0xef, 0xbd, 0xf9, 0xd6, 0xb8, 0xd9, 0x67, 0x81, 0xe3,
+ 0x24, 0xb2, 0xef, 0xf8, 0x48, 0x08, 0x7f, 0x46, 0xac, 0x02, 0x58, 0x83,
+ 0xb8, 0x32, 0xa0, 0x90, 0xa3, 0x1f, 0x9b, 0xfb, 0xe2, 0x02, 0x4c, 0x90,
+ 0x0f, 0x80, 0xf9, 0xd6, 0x6f, 0xa4, 0xb2, 0xd4, 0xa0, 0x24, 0x18, 0xef,
+ 0xdf, 0xf3, 0x87, 0x0c, 0x8d, 0x19, 0xe5, 0x61, 0x6e, 0x75, 0x81, 0x3b,
+ 0x56, 0x26, 0xbe, 0x0b, 0xed, 0x52, 0x8d, 0x0b, 0xa5, 0x0e, 0xa0, 0x3e,
+ 0x9f, 0xa1, 0x89, 0xe1, 0xff, 0x2b, 0xcd, 0xa4, 0xf3, 0x8c, 0x9d, 0xf5,
+ 0xe9, 0xb5, 0xad, 0xb5, 0x19, 0xf7, 0x9f, 0x74, 0x1b, 0xf2, 0xb4, 0x54,
+ 0x64, 0x26, 0xba, 0x58, 0x26, 0x4a, 0x16, 0x42, 0xbf, 0xa6, 0xc7, 0xb5,
+ 0xbd, 0x39, 0x7d, 0x12, 0xae, 0x95, 0xcd, 0x28, 0x10, 0x63, 0x71, 0x49,
+ 0x76, 0xe0, 0x0b, 0x1e, 0x65, 0x63, 0x87, 0xc4, 0x09, 0xb7, 0x58, 0xb3,
+ 0x9b, 0x76, 0x37, 0x1a, 0xa4, 0xa7, 0xf2, 0xd7, 0x89, 0xbf, 0x29, 0xd2,
+ 0x8a, 0xf6, 0xf4, 0xcc, 0xa9, 0x9b, 0x82, 0x60, 0x32, 0x41, 0x34, 0xdc,
+ 0x68, 0x2e, 0x74, 0x32, 0x3a, 0xf6, 0xd6, 0x1e, 0x31, 0xf0, 0x99, 0xf4,
+ 0xe8, 0x78, 0x20, 0xc4, 0x35, 0xd0, 0x67, 0x7b, 0xd1, 0xc9, 0xc4, 0xf0,
+ 0x0a, 0xf9, 0xcb, 0x98, 0xd7, 0xea, 0x35, 0x65, 0x7d, 0xab, 0xca, 0x65,
+ 0x78, 0xb7, 0xd6, 0xf7, 0x67, 0xa4, 0x41, 0x72, 0x6e, 0xa0, 0x88, 0x31,
+ 0x91, 0xf7, 0x43, 0xe2, 0xa3, 0x6e, 0x78, 0x7e, 0x70, 0xeb, 0x28, 0xd9,
+ 0x1c, 0x5b, 0x47, 0xc3, 0x73, 0x6e, 0x86, 0x57, 0x66, 0x1b, 0x83, 0xae,
+ 0x3a, 0xa9, 0x01, 0x26, 0x0c, 0xa1, 0x61, 0xec, 0xa7, 0x50, 0xe0, 0xdd,
+ 0xb3, 0xbd, 0x2c, 0x4f, 0xf1, 0x71, 0xe0, 0xa6, 0xbb, 0xc1, 0x00, 0x9e,
+ 0x80, 0x42, 0x07, 0x31, 0x6e, 0xdc, 0x48, 0x9c, 0x1b, 0xd7, 0xb8, 0x53,
+ 0xf9, 0x73, 0xba, 0x81, 0x23, 0x12, 0x8f, 0x90, 0x5f, 0x38, 0xda, 0xfd,
+ 0x07, 0x97, 0x63, 0x1e, 0xa6, 0x23, 0xf4, 0xb2, 0xf8, 0xcd, 0x75, 0x7e,
+ 0x70, 0x9d, 0x60, 0x50, 0x57, 0x4c, 0xf0, 0x01, 0xdf, 0x0a, 0xd8, 0x51,
+ 0x58, 0x5e, 0x30, 0x7a, 0xaa, 0x0f, 0x98, 0x18, 0xaf, 0x4b, 0xe7, 0x59,
+ 0xc6, 0x70, 0x03, 0x36, 0xae, 0x82, 0x69, 0x33, 0x53, 0xf1, 0x90, 0xf0,
+ 0xb4, 0x99, 0xf6, 0x85, 0x1c, 0x60, 0x87, 0xb8, 0x67, 0xea, 0x5a, 0xd0,
+ 0xd6, 0xcb, 0xeb, 0x45, 0x3e, 0x06, 0x61, 0xec, 0xcf, 0x5e, 0x86, 0xe3,
+ 0x9d, 0x36, 0xd5, 0x3c, 0x89, 0x6d, 0x42, 0x94, 0x5b, 0x31, 0xa7, 0x6b,
+ 0x94, 0xd7, 0x1a, 0x36, 0xaa, 0xad, 0x82, 0x1d, 0x61, 0x16, 0x9a, 0xcf,
+ 0x8c, 0x4a, 0xdc, 0xd8, 0x1e, 0xea, 0x32, 0x79, 0x3b, 0x94, 0xa9, 0x65,
+ 0x2a, 0x27, 0x97, 0xa7, 0xc2, 0x89, 0xaa, 0x5d, 0x29, 0xbb, 0xef, 0x3a,
+ 0xc0, 0xc8, 0x18, 0x81, 0x92, 0x0e, 0x87, 0x75, 0x14, 0x91, 0x77, 0x09,
+ 0xc1, 0xff, 0xc8, 0x99, 0x19, 0xdb, 0x3c, 0x72, 0x0d, 0xdf, 0xfd, 0xd3,
+ 0xaf, 0x6d, 0x68, 0xb0, 0x0f, 0xc9, 0x7e, 0x2b, 0x24, 0xa4, 0x34, 0x2f,
+ 0x53, 0xa4, 0x6f, 0xb1, 0xa0, 0xef, 0x30, 0x7a, 0x9a, 0x21, 0x11, 0x24,
+ 0x12, 0xc7, 0x74, 0x8d, 0x12, 0x75, 0xba, 0x6c, 0x31, 0xc2, 0xf0, 0xa1,
+ 0x6a, 0x23, 0xba, 0x65, 0x96, 0x13, 0xc3, 0xd3, 0x6c, 0xbb, 0xbf, 0xfb,
+ 0xfb, 0x5f, 0x54, 0xf2, 0xfd, 0xbe, 0xf0, 0xfc, 0x58, 0x4a, 0x52, 0x15,
+ 0x57, 0xce, 0x3e, 0xee, 0x01, 0xb0, 0xcc, 0x90, 0xf8, 0xed, 0x27, 0xbe,
+ 0x99, 0x04, 0x75, 0x37, 0xe8, 0x14, 0x60, 0x12, 0x3c, 0x8e, 0xbb, 0x32,
+ 0x7b, 0x0b, 0x42, 0xa5, 0x1e, 0xa2, 0xba, 0xff, 0x44, 0xa7, 0x0b, 0x7d,
+ 0x2f, 0xb2, 0xac, 0xc6, 0xaf, 0xfd, 0xa5, 0x81, 0xfe, 0xa7, 0x8c, 0x3b,
+ 0xfd, 0xb3, 0x37, 0x9e, 0x1b, 0x32, 0xa8, 0xe8, 0x28, 0x05, 0x94, 0x25,
+ 0xda, 0xe9, 0x6c, 0x48, 0x21, 0xc6, 0x8a, 0xc8, 0x76, 0x6a, 0xc3, 0x4b,
+ 0x34, 0x68, 0xd9, 0xcf, 0x05, 0xf9, 0xb7, 0x99, 0x31, 0xc8, 0x25, 0x2e,
+ 0xfb, 0xc1, 0xcd, 0x4c, 0x82, 0xae, 0x0d, 0x4d, 0x10, 0x18, 0x15, 0x5a,
+ 0x93, 0x42, 0xeb, 0xf9, 0x3f, 0xe7, 0x76, 0x6e, 0xfe, 0xbc, 0x15, 0x27,
+ 0x36, 0xb4, 0x5f, 0x14, 0x16, 0xb6, 0x8a, 0x22, 0x19, 0xbb, 0xe6, 0x9f,
+ 0x5a, 0xa7, 0xec, 0xff, 0x00, 0x04, 0x3a, 0x74, 0x95, 0x6a, 0xb3, 0xb1,
+ 0xc5, 0xa2, 0x69, 0x97, 0x28, 0xc3, 0xb7, 0x37, 0xb9, 0x48, 0xd8, 0x69,
+ 0xc9, 0xac, 0xba, 0x0b, 0x57, 0xc1, 0x6c, 0x0f, 0xc6, 0x6b, 0x84, 0xb4,
+ 0x28, 0x40, 0x69, 0x86, 0x78, 0xea, 0xba, 0xb4, 0xac, 0x0a, 0x58, 0x86,
+ 0x46, 0x73, 0x26, 0x0c, 0x6b, 0x38, 0x7c, 0xfb, 0xb1, 0xc8, 0x02, 0x50,
+ 0x06, 0x1d, 0xc7, 0x82, 0xb1, 0x73, 0x71, 0x99, 0x42, 0xa5, 0x94, 0x34,
+ 0x83, 0x01, 0x43, 0xc3, 0x04, 0x18, 0x5f, 0x86, 0xbc, 0x9f, 0x45, 0x58,
+ 0x93, 0x20, 0xfe, 0xe8, 0xe5, 0x0d, 0x03, 0x2b, 0x6b, 0x1c, 0xf6, 0x5b,
+ 0x5b, 0x0a, 0xdd, 0x57, 0xb4, 0x12, 0x3e, 0xf3, 0x81, 0xf8, 0x94, 0x0e,
+ 0x84, 0xe1, 0xf1, 0x2f, 0x97, 0x06, 0x9e, 0x96, 0x35, 0x3d, 0x93, 0x6e,
+ 0xd1, 0x15, 0xd7, 0xe5, 0x13, 0x18, 0x8e, 0x91, 0xaf, 0x77, 0x26, 0x8d,
+ 0xe1, 0x20, 0x23, 0x73, 0x7e, 0x3a, 0x95, 0xb8, 0x2e, 0x2d, 0x90, 0xf0,
+ 0x09, 0x89, 0x07, 0x55, 0xef, 0x90, 0xdd, 0x74, 0x3f, 0x32, 0xfb, 0x3d,
+ 0x45, 0xa9, 0xdd, 0x59, 0xc5, 0x99, 0xc1, 0x28, 0x6d, 0xfd, 0x61, 0x71,
+ 0x77, 0x21, 0xb8, 0x83, 0x17, 0xab, 0xab, 0x6c, 0x4e, 0x30, 0xbb, 0xd4,
+ 0x3d, 0x4c, 0xe6, 0x4c, 0xf2, 0x2c, 0xbc, 0x99, 0xf6, 0x9a, 0xa9, 0x76,
+ 0x34, 0x03, 0x58, 0x1a, 0x09, 0x65, 0x67, 0x5d, 0x8c, 0x96, 0x1c, 0x6a,
+ 0x4e, 0x5a, 0x54, 0x64, 0xd7, 0x77, 0x1d, 0xa3, 0x1a, 0xa6, 0xda, 0xc6,
+ 0x27, 0x6e, 0x9c, 0x50, 0x49, 0x6f, 0xb5, 0x2b, 0x50, 0x27, 0xdc, 0x02,
+ 0x4d, 0xf3, 0x36, 0xa5, 0x7b, 0x90, 0x70, 0x30, 0xae, 0xa5, 0x38, 0x92,
+ 0xfc, 0xce, 0x19, 0x0e, 0x8b, 0x44, 0x9f, 0x8f, 0x78, 0xb7, 0x6e, 0x05,
+ 0xe8, 0xbe, 0xdf, 0x0f, 0x29, 0xbd, 0xd8, 0x6a, 0x18, 0xd1, 0x54, 0xad,
+ 0x1a, 0x5d, 0x48, 0xa1, 0x2f, 0x66, 0xeb, 0x18, 0x90, 0x4f, 0x84, 0x7d,
+ 0x6f, 0xec, 0xd3, 0x0e, 0xcf, 0x9e, 0xfe, 0xf8, 0x3e, 0x57, 0xef, 0x43,
+ 0xd6, 0xfb, 0x44, 0x33, 0x6c, 0x18, 0x4a, 0xd4, 0x94, 0xbd, 0x55, 0x2a,
+ 0xdc, 0x85, 0x11, 0x8f, 0x41, 0x79, 0xbc, 0xd2, 0x97, 0x33, 0x8a, 0xa0,
+ 0xc7, 0x8d, 0xc4, 0x38, 0x53, 0xfb, 0x07, 0xcc, 0x67, 0x3b, 0xe1, 0x8b,
+ 0xc7, 0x17, 0xef, 0xa4, 0xb1, 0xc3, 0xea, 0x3d, 0xbe, 0xb9, 0x4d, 0xe7,
+ 0x9e, 0xab, 0x26, 0xc7, 0x68, 0xd9, 0x6b, 0xe7, 0x41, 0xd6, 0xd7, 0xab,
+ 0xc7, 0xea, 0xe0, 0x47, 0xc7, 0x10, 0xd2, 0x9d, 0xb9, 0xa9, 0x49, 0xec,
+ 0x10, 0x82, 0x97, 0x73, 0xd5, 0x34, 0xd1, 0x0d, 0xaf, 0x4a, 0x57, 0x97,
+ 0x1b, 0xf4, 0x33, 0xdf, 0xd5, 0x9d, 0x01, 0xa9, 0xcb, 0xe5, 0x8a, 0xf5,
+ 0x94, 0x57, 0x2a, 0xa6, 0xc8, 0xe7, 0xa2, 0xd5, 0xc0, 0xf0, 0x3c, 0x91,
+ 0x59, 0x0d, 0x45, 0xd3, 0x1d, 0x17, 0x9c, 0xee, 0x70, 0x7c, 0x2c, 0xbc,
+ 0x47, 0x99, 0xb6, 0x5e, 0x28, 0x69, 0xd1, 0xf7, 0xbb, 0xb3, 0x6f, 0xff,
+ 0xdf, 0x97, 0xe1, 0x1e, 0xa0, 0x9b, 0x00, 0xef, 0xaa, 0x30, 0x49, 0x2e,
+ 0x90, 0xed, 0x93, 0x21, 0x31, 0xd0, 0x49, 0x72, 0x84, 0x16, 0xb3, 0x87,
+ 0x99, 0x2e, 0xfa, 0xe6, 0x1f, 0xe2, 0x2a, 0xcf, 0x46, 0x21, 0xa8, 0x59,
+ 0x45, 0xf9, 0xcf, 0x5c, 0x60, 0xad, 0x93, 0xbc, 0xe1, 0x6d, 0xac, 0xd5,
+ 0x2a, 0x18, 0x34, 0x08, 0x2a, 0x94, 0xcb, 0x2e, 0xa8, 0xa7, 0xe1, 0x35,
+ 0x81, 0x56, 0x16, 0x7f, 0xd8, 0x3a, 0xf2, 0x08, 0xbf, 0xdf, 0x8d, 0x5a,
+ 0x8d, 0x9e, 0xfc, 0x8a, 0x82, 0xf4, 0xde, 0x3a, 0x7a, 0x14, 0xa3, 0x87,
+ 0xb9, 0x80, 0xac, 0x0b, 0x16, 0x76, 0x43, 0x95, 0x32, 0xd0, 0xd1, 0x2d,
+ 0xf4, 0x9d, 0x9a, 0x0d, 0x1c, 0x8e, 0x48, 0x9b, 0xe8, 0xcc, 0x89, 0xe0,
+ 0x66, 0xde, 0x17, 0x82, 0x5f, 0xdc, 0x93, 0x47, 0x23, 0x27, 0x6d, 0xbf,
+ 0x8c, 0xd0, 0x9a, 0xf9, 0x17, 0xc3, 0xe7, 0xd6, 0x9d, 0x93, 0xe2, 0x2a,
+ 0x83, 0x1d, 0x19, 0x36, 0xe8, 0xbd, 0x55, 0x53, 0xda, 0x7b, 0x11, 0x66,
+ 0x59, 0xe5, 0xef, 0xed, 0x95, 0xb8, 0x55, 0x16, 0x49, 0xa0, 0x83, 0x97,
+ 0x21, 0x9a, 0x4b, 0x01, 0x53, 0xb7, 0x6f, 0x4e, 0x40, 0x04, 0x6b, 0xbe,
+ 0x01, 0xeb, 0xac, 0x1c, 0x29, 0xe0, 0xb9, 0x53, 0xb2, 0x97, 0xf9, 0x3e,
+ 0x4b, 0x11, 0x38, 0x09, 0x02, 0xfd, 0x9d, 0x0b, 0xc7, 0xaa, 0x38, 0x36,
+ 0x29, 0x32, 0x76, 0xe7, 0x12, 0x7f, 0x85, 0x92, 0xab, 0xbe, 0x96, 0x52,
+ 0x4e, 0x1b, 0x6c, 0x6f, 0x19, 0xd2, 0x43, 0xf8, 0xb9, 0x3f, 0xa3, 0x88,
+ 0x0d, 0xf0, 0x2a, 0xf3, 0x08, 0x80, 0xab, 0x32, 0x22, 0xe0, 0x6d, 0x1a,
+ 0x5d, 0x12, 0x1c, 0x25, 0xf5, 0x1e, 0x19, 0xfe, 0x93, 0xd3, 0x49, 0x10,
+ 0x51, 0x7e, 0xe5, 0x54, 0x87, 0x93, 0xf5, 0xa9, 0xc1, 0x1c, 0xa1, 0x02,
+ 0x70, 0x43, 0xae, 0xbb, 0x12, 0x61, 0x24, 0x63, 0x95, 0x22, 0xc1, 0x2c,
+ 0xb5, 0x08, 0x18, 0x11, 0x9a, 0x35, 0x00, 0x7e, 0x7a, 0x51, 0x0d, 0x1f,
+ 0x24, 0xfe, 0xb9, 0xd2, 0x9f, 0x44, 0x52, 0x0b, 0x97, 0x4b, 0xec, 0x8d,
+ 0x79, 0x84, 0x14, 0xcd, 0xa5, 0xe8, 0x2c, 0xf2, 0x39, 0x9f, 0x3e, 0xbb,
+ 0x04, 0xf0, 0xb3, 0x10, 0xa3, 0xac, 0x79, 0x0f, 0x80, 0xf2, 0x8c, 0xb9,
+ 0xbf, 0x80, 0x47, 0x78, 0xfb, 0xb5, 0x8e, 0x1d, 0x54, 0x4c, 0x4e, 0x46,
+ 0x7f, 0x9f, 0xd6, 0x65, 0x3b, 0xc5, 0xb9, 0x11, 0x1b, 0x97, 0xdf, 0xc3,
+ 0xbe, 0xa0, 0x9a, 0xab, 0x12, 0x72, 0x2c, 0x99, 0xd3, 0x07, 0xff, 0x4e,
+ 0x68, 0x47, 0x13, 0xa8, 0xea, 0x7c, 0x9f, 0x74, 0xbb, 0xed, 0xdb, 0x78,
+ 0x4f, 0x5c, 0xf8, 0xe6, 0xca, 0xfd, 0xeb, 0x79, 0x2b, 0x3e, 0xf9, 0x5c,
+ 0x05, 0x77, 0xd3, 0x72, 0x01, 0xd3, 0x3f, 0x5a, 0x16, 0x16, 0xb7, 0xdb,
+ 0xe7, 0x7f, 0xf5, 0x05, 0x54, 0x9b, 0xa3, 0xa8, 0xa1, 0xda, 0x55, 0xa8,
+ 0xb3, 0x02, 0x25, 0xb6, 0x65, 0xe1, 0xff, 0x5e, 0x0a, 0x8f, 0x5b, 0xb7,
+ 0xcb, 0xbb, 0x8b, 0xaf, 0x18, 0x3a, 0x9c, 0x39, 0x2c, 0x4f, 0x2e, 0x70,
+ 0x0f, 0xde, 0x09, 0x57, 0x40, 0x77, 0x59, 0x7e, 0x72, 0xc0, 0x7d, 0xb2,
+ 0x26, 0x77, 0xa9, 0x1f, 0x3a, 0x6b, 0x96, 0x2e, 0x9c, 0x96, 0x9d, 0x4e,
+ 0x5a, 0xe3, 0xc9, 0xa8, 0x6b, 0xee, 0xe0, 0xac, 0x8d, 0x0e, 0x22, 0x61,
+ 0x5d, 0xe0, 0x1d, 0x41, 0xce, 0x6c, 0x96, 0x39, 0x4a, 0xb8, 0xf0, 0x09,
+ 0x35, 0x94, 0x63, 0x5f, 0xe2, 0xd8, 0x3c, 0x9f, 0xdb, 0x0a, 0x94, 0xdd,
+ 0x7c, 0x2a, 0x0a, 0x9e, 0x8b, 0xe9, 0xd6, 0xf2, 0x91, 0xa9, 0x30, 0x3f,
+ 0xa4, 0xf5, 0x42, 0x8f, 0x67, 0x4f, 0xfb, 0x91, 0xb7, 0x6d, 0x72, 0xd2,
+ 0x23, 0x15, 0x77, 0x0d, 0x53, 0xf6, 0x38, 0x3b, 0x36, 0xcd, 0x81, 0xc6,
+ 0xa6, 0x51, 0x5c, 0xa0, 0x1a, 0xd1, 0x07, 0x10, 0x97, 0x2b, 0xe9, 0x70,
+ 0xe9, 0x40, 0x98, 0xe9, 0xa5, 0xed, 0x98, 0xab, 0xd8, 0x6c, 0xf8, 0xbf,
+ 0xca, 0xaa, 0xe0, 0x28, 0xde, 0x59, 0xe8, 0xa4, 0x1f, 0xf2, 0x62, 0x52,
+ 0x10, 0x07, 0x97, 0x03, 0xad, 0xe3, 0xff, 0x7a, 0xed, 0x5e, 0x07, 0xcb,
+ 0xdf, 0x66, 0x89, 0xf8, 0xab, 0x83, 0xd3, 0x8f, 0xdf, 0x39, 0x97, 0x6a,
+ 0x61, 0x9c, 0xae, 0x4b, 0xc2, 0x84, 0x5b, 0xa9, 0xdb, 0xe0, 0xb3, 0xcb,
+ 0xb0, 0xbd, 0xbc, 0x8e, 0xa4, 0x3d, 0x8e, 0xa5, 0xda, 0xe5, 0xf9, 0x0d,
+ 0x29, 0x6c, 0x72, 0x6a, 0x73, 0x7c, 0xa7, 0x7a, 0x02, 0x5f, 0xd0, 0xd9,
+ 0xf6, 0x10, 0xcd, 0xea, 0x95, 0x12, 0x2d, 0xf4, 0x2b, 0x92, 0x3d, 0x36,
+ 0xef, 0x40, 0x43, 0x46, 0x02, 0x51, 0xe9, 0x72, 0x03, 0x43, 0xce, 0xe7,
+ 0x5b, 0x7b, 0xfa, 0x37, 0xe4, 0xef, 0x55, 0x49, 0x9b, 0xd6, 0x3e, 0xa2,
+ 0x93, 0xc4, 0xe6, 0xa6, 0x32, 0x40, 0x99, 0x5f, 0xee, 0xb2, 0xd9, 0x92,
+ 0x0f, 0xad, 0x23, 0x68, 0xe9, 0xf6, 0xbf, 0xf2, 0x58, 0x07, 0x34, 0x63,
+ 0x07, 0x9e, 0x1d, 0xe0, 0xfa, 0x2d, 0x5e, 0x76, 0xa4, 0x92, 0x2d, 0xff,
+ 0xf4, 0x3a, 0x3c, 0xbd, 0x70, 0xb2, 0xde, 0x99, 0xbd, 0xa5, 0x3b, 0xae,
+ 0xa0, 0x1a, 0x10, 0xa8, 0x2b, 0xd7, 0xc2, 0x52, 0x9e, 0xc9, 0x36, 0xaa,
+ 0x0c, 0x82, 0x6f, 0x4f, 0x1f, 0x46, 0x16, 0x15, 0x35, 0x07, 0x63, 0x25,
+ 0x68, 0xf1, 0x9f, 0x60, 0x2b, 0x9e, 0xbe, 0xec, 0x08, 0x84, 0x60, 0x20,
+ 0x1b, 0x5c, 0xbc, 0x6c, 0x0d, 0x36, 0x42, 0x87, 0x0f, 0xb4, 0xd8, 0xb0,
+ 0xf1, 0x1e, 0xfe, 0xfc, 0x56, 0xe5, 0xd8, 0xd2, 0x03, 0x5b, 0x4e, 0x6b,
+ 0xc6, 0x31, 0x8a, 0xcc, 0x29, 0xa4, 0x54, 0x72, 0xff, 0x2b, 0x5f, 0xe4,
+ 0x4f, 0xfc, 0x5c, 0x66, 0x7c, 0x52, 0x3f, 0xd6, 0xc4, 0x85, 0x86, 0x2b,
+ 0x23, 0x20, 0xb6, 0x83, 0x00, 0x6f, 0xa4, 0x23, 0x68, 0x84, 0x4c, 0xb9,
+ 0xbc, 0x3b, 0xac, 0xc5, 0xed, 0x03, 0xad, 0xa5, 0xc8, 0x73, 0x98, 0x9b,
+ 0x00, 0xe6, 0xdf, 0x60, 0xc6, 0x6c, 0xe3, 0x80, 0xe2, 0x72, 0xae, 0x2b,
+ 0xeb, 0x5f, 0x92, 0x62, 0x34, 0x70, 0x0d, 0x9b, 0x51, 0xc3, 0x96, 0x3d,
+ 0x27, 0x27, 0x28, 0xb1, 0x44, 0x9d, 0x4b, 0x9a, 0x59, 0x43, 0x4d, 0x52,
+ 0xbe, 0x2f, 0xd1, 0xdb, 0x50, 0x88, 0x48, 0xf4, 0x02, 0x4c, 0x95, 0x94,
+ 0x43, 0x17, 0x08, 0x22, 0x15, 0x8d, 0x37, 0x03, 0x73, 0x9a, 0x10, 0x0b,
+ 0x62, 0xa8, 0x21, 0x5b, 0x04, 0x9e, 0x40, 0x63, 0xf1, 0xee, 0x34, 0xaa,
+ 0xa6, 0xec, 0xeb, 0xb5, 0xc8, 0xf9, 0x67, 0x9b, 0x1e, 0x4f, 0x1e, 0xbc,
+ 0xa2, 0x5e, 0xcb, 0x57, 0xf0, 0x9a, 0xa0, 0xe3, 0xcc, 0x18, 0x96, 0xa3,
+ 0xcc, 0x69, 0xe4, 0x9b, 0x16, 0xe4, 0xb3, 0x8e, 0xb6, 0xef, 0xae, 0x34,
+ 0x75, 0x43, 0x2a, 0x37, 0xe4, 0x49, 0x5c, 0xc2, 0x1d, 0x33, 0xda, 0x06,
+ 0x33, 0x1c, 0x52, 0xe5, 0x64, 0xb0, 0x00, 0x81, 0xd5, 0xb8, 0x80, 0x18,
+ 0xd6, 0xed, 0xb7, 0x9e, 0x6a, 0x6e, 0xe4, 0xd8, 0x9b, 0xcf, 0x7e, 0x4c,
+ 0xee, 0x53, 0x19, 0x48, 0x0f, 0x24, 0x3a, 0x77, 0x48, 0xbe, 0x09, 0xb8,
+ 0x87, 0x39, 0x0f, 0xc4, 0xb5, 0x90, 0x5e, 0x5c, 0x48, 0x1d, 0xe6, 0xf4,
+ 0x42, 0x1e, 0xd8, 0xa4, 0x3d, 0x0f, 0x61, 0x5d, 0xd7, 0x0b, 0x7a, 0x70,
+ 0x86, 0x9d, 0x12, 0x83, 0x13, 0xdf, 0x92, 0x64, 0xca, 0x39, 0x1d, 0x58,
+ 0x80, 0xc8, 0xdf, 0xed, 0xbb, 0x5a, 0xf7, 0xa8, 0xfa, 0xee, 0x90, 0x68,
+ 0x18, 0xda, 0x4e, 0xfd, 0xae, 0xec, 0xf2, 0xf6, 0xd5, 0xe1, 0xf9, 0xd7,
+ 0x89, 0xd6, 0xec, 0x7e, 0xd3, 0x81, 0xa1, 0xa4, 0x6c, 0xd5, 0x1c, 0xcb,
+ 0xc8, 0x1a, 0x89, 0xbc, 0x2e, 0xc6, 0x12, 0x7e, 0x6d, 0xa0, 0xf5, 0xf8,
+ 0x72, 0x01, 0x24, 0x5f, 0xf1, 0xbe, 0x67, 0x51, 0xe1, 0x83, 0x96, 0xca,
+ 0x98, 0x9d, 0xb1, 0x27, 0x31, 0x08, 0xf2, 0xa8, 0xf1, 0x5a, 0xd2, 0xc4,
+ 0x7c, 0x3f, 0xf1, 0xc1, 0xe0, 0xcd, 0x8f, 0x71, 0xfb, 0x16, 0x5f, 0x18,
+ 0x6b, 0xa3, 0xae, 0xa0, 0x15, 0x4b, 0x01, 0xd7, 0xb5, 0xfe, 0xeb, 0xae,
+ 0xf1, 0xe3, 0x28, 0x39, 0x38, 0x9b, 0xae, 0x93, 0x69, 0xb8, 0x8c, 0x20,
+ 0xef, 0x88, 0xcd, 0x1d, 0x5b, 0xc5, 0x09, 0x6d, 0xac, 0x1e, 0xa9, 0x0d,
+ 0xc1, 0x86, 0xc6, 0xbb, 0xb5, 0xb7, 0xf7, 0x1a, 0x06, 0xf8, 0x53, 0x2c,
+ 0x51, 0x2f, 0x1b, 0x88, 0x9f, 0xac, 0x44, 0x6b, 0x8a, 0x1a, 0xc3, 0xe7,
+ 0x48, 0x64, 0x8f, 0xf5, 0x67, 0x1f, 0x93, 0x83, 0x63, 0x77, 0x27, 0xcc,
+ 0x59, 0x74, 0xb3, 0x30, 0xce, 0x11, 0x9b, 0xff, 0x6b, 0x67, 0x13, 0x47,
+ 0xae, 0xb9, 0xaa, 0xcd, 0x22, 0x4a, 0x52, 0x71, 0x12, 0x1a, 0x63, 0x6a,
+ 0x8d, 0x94, 0xd3, 0x5d, 0xd4, 0x87, 0x64, 0x7e, 0x33, 0xd7, 0xcc, 0xd7,
+ 0x5f, 0x4c, 0xb0, 0x31, 0xba, 0xb0, 0xe0, 0x3b, 0x76, 0x31, 0x2f, 0x34,
+ 0x6f, 0x58, 0x94, 0x33, 0x9d, 0xa4, 0x6b, 0x1b, 0x0d, 0x6e, 0x8e, 0x70,
+ 0xcb, 0x27, 0xce, 0x6c, 0x9c, 0x8a, 0xe1, 0xac, 0x4a, 0x45, 0xb8, 0xe5,
+ 0xd2, 0xf9, 0xf2, 0x61, 0x6d, 0xb6, 0x08, 0xaf, 0x67, 0xc6, 0xdd, 0x31,
+ 0x7d, 0x6c, 0xe7, 0x0a, 0x05, 0x40, 0xcd, 0x01, 0xfa, 0xbe, 0x57, 0x65,
+ 0x21, 0x42, 0xb9, 0x26, 0x74, 0x4d, 0x3e, 0xef, 0x8a, 0x92, 0x90, 0x8b,
+ 0x96, 0xbe, 0x6d, 0x16, 0x5a, 0x58, 0x75, 0x8e, 0xec, 0x5d, 0xfa, 0xe7,
+ 0x03, 0x3e, 0x15, 0x25, 0x09, 0xcc, 0x71, 0x81, 0xac, 0xfb, 0xf6, 0xe1,
+ 0xce, 0xa0, 0xff, 0xee, 0xf9, 0x1a, 0xd4, 0x29, 0x26, 0x82, 0x4d, 0x50,
+ 0xc6, 0xe6, 0xf8, 0x78, 0x26, 0x27, 0x6d, 0x00, 0x7d, 0xb9, 0x2b, 0x39,
+ 0xdf, 0x7c, 0x37, 0xe5, 0xd1, 0x63, 0xbb, 0x44, 0x4b, 0x46, 0xe7, 0x4c,
+ 0x08, 0x75, 0xe1, 0x4c, 0x5b, 0xa8, 0xd8, 0x8d, 0x4e, 0x80, 0xee, 0x7c,
+ 0xcd, 0xf4, 0x9d, 0xb4, 0xc7, 0x59, 0x37, 0x81, 0x66, 0x12, 0xbc, 0xe4,
+ 0xbd, 0xda, 0x0d, 0x22, 0x12, 0xb2, 0x0d, 0xee, 0xd2, 0x2d, 0xbf, 0x73,
+ 0x5c, 0x58, 0x43, 0x3f, 0xb3, 0xd1, 0x9a, 0x65, 0xb7, 0xbe, 0xc0, 0x6b,
+ 0xb7, 0xd2, 0x47, 0x18, 0xac, 0x63, 0xb9, 0x01, 0x9f, 0xbc, 0x6c, 0x17,
+ 0x4f, 0x1a, 0xae, 0x01, 0x7e, 0xd1, 0x99, 0x39, 0x5b, 0x2d, 0xf2, 0xec,
+ 0xae, 0x03, 0x48, 0x48, 0x37, 0x5d, 0xbd, 0xd2, 0x75, 0xd9, 0x64, 0x46,
+ 0x14, 0xf2, 0xc6, 0xe7, 0x27, 0xac, 0xf7, 0x52, 0xbc, 0x07, 0xb4, 0x0a,
+ 0x7d, 0xf8, 0xf6, 0x1e, 0xf2, 0xb4, 0xcd, 0xfc, 0x9c, 0x90, 0xe0, 0xd5,
+ 0x3d, 0x77, 0xc4, 0x95, 0x30, 0x27, 0x93, 0xe6, 0xc0, 0x24, 0xb4, 0x6a,
+ 0x4b, 0x79, 0x98, 0x64, 0x80, 0x6b, 0x17, 0x34, 0xb6, 0xcb, 0x3f, 0xbd,
+ 0xe6, 0x0d, 0x9f, 0xe6, 0xfd, 0x8d, 0x7c, 0x36, 0x00, 0x87, 0x0b, 0x57,
+ 0xdc, 0x66, 0x46, 0x7f, 0xce, 0xed, 0x75, 0x37, 0xb4, 0xb1, 0xfc, 0x8d,
+ 0x22, 0x3c, 0x40, 0x48, 0x87, 0x51, 0xb6, 0x53, 0xdb, 0x15, 0x4d, 0x84,
+ 0x2d, 0xcb, 0xee, 0x66, 0xdc, 0x87, 0x6d, 0x22, 0x3b, 0x4e, 0xf1, 0x96,
+ 0x2e, 0x20, 0x75, 0x88, 0xa2, 0x52, 0xed, 0x77, 0xef, 0xe3, 0x9a, 0x2c,
+ 0x50, 0x67, 0xf5, 0x37, 0x9c, 0xab, 0xc4, 0x93, 0xbe, 0xd2, 0xfa, 0x0e,
+ 0xb5, 0x8d, 0x23, 0x3d, 0xd3, 0xb2, 0x50, 0x58, 0x40, 0xfc, 0x58, 0xf7,
+ 0x89, 0x91, 0xeb, 0x25, 0x5b, 0x8a, 0xe5, 0x51, 0xe3, 0xbd, 0x06, 0x05,
+ 0x45, 0x49, 0x6a, 0xcd, 0x1f, 0xc5, 0x9b, 0xa7, 0x91, 0x78, 0x45, 0x6a,
+ 0xd3, 0x65, 0x8d, 0x8c, 0xdb, 0x58, 0xbb, 0x40, 0x40, 0x8c, 0x50, 0x8f,
+ 0xd2, 0x31, 0xad, 0x19, 0x81, 0x89, 0xcb, 0xfb, 0x8c, 0xa3, 0xf4, 0x5b,
+ 0xc3, 0xe9, 0x7f, 0xff, 0x25, 0x79, 0xc9, 0xf6, 0x79, 0x2a, 0x5f, 0x31,
+ 0xf8, 0xb0, 0xd3, 0xc2, 0x91, 0x98, 0xe9, 0xe2, 0x8d, 0x91, 0xc3, 0xb1,
+ 0xc0, 0x93, 0x51, 0x97, 0xc1, 0x26, 0x79, 0xac, 0x9e, 0x73, 0xb3, 0xec,
+ 0xac, 0x4b, 0x78, 0x69, 0x94, 0x27, 0xf9, 0xef, 0x3f, 0x9d, 0xb8, 0x34,
+ 0x03, 0xa6, 0xb3, 0x14, 0x2d, 0x7e, 0xb1, 0x5f, 0xc3, 0x05, 0x8b, 0xd8,
+ 0x17, 0xe5, 0x11, 0xbb, 0x49, 0x13, 0x78, 0x6a, 0x60, 0x6f, 0xcc, 0x93,
+ 0x16, 0xc1, 0x5c, 0xfd, 0x43, 0xad, 0x03, 0xfe, 0x43, 0x51, 0x05, 0xa1,
+ 0xb1, 0xde, 0xaa, 0x7d, 0x4e, 0x66, 0xd6, 0x96, 0xc3, 0x0c, 0xc2, 0x68,
+ 0x9d, 0x17, 0xd3, 0xfd, 0x69, 0xd3, 0x25, 0xf8, 0x9a, 0x73, 0xaa, 0x5a,
+ 0xd8, 0xae, 0xcc, 0x2c, 0x81, 0xe7, 0x1a, 0x62, 0x77, 0x0b, 0x0e, 0x19,
+ 0x52, 0x6c, 0x56, 0x32, 0xdb, 0x44, 0x52, 0x4d, 0xa4, 0x88, 0x07, 0x94,
+ 0x13, 0x38, 0x74, 0xd6, 0xab, 0x95, 0x87, 0x95, 0xfe, 0xe8, 0x65, 0x48,
+ 0x23, 0x4a, 0x69, 0x4d, 0x12, 0xc6, 0xa2, 0x1b, 0x3a, 0x65, 0xf5, 0x84,
+ 0x0a, 0xd1, 0xa4, 0xe5, 0x64, 0xcb, 0x3a, 0x40, 0x6f, 0x0f, 0xa5, 0x87,
+ 0x57, 0x8a, 0xec, 0x69, 0xbc, 0xdc, 0xc3, 0xae, 0x6b, 0xbe, 0x50, 0x59,
+ 0x0e, 0xa8, 0x66, 0xfe, 0x28, 0xc3, 0x0b, 0xb2, 0x33, 0xf8, 0xa7, 0x46,
+ 0x29, 0x69, 0x81, 0x5b, 0xa5, 0x6f, 0xfe, 0xe3, 0xc2, 0xee, 0xbc, 0xdc,
+ 0xc6, 0xab, 0x72, 0x46, 0xa3, 0xc3, 0x0b, 0x54, 0xf5, 0xa4, 0xb2, 0x63,
+ 0xba, 0xf7, 0x96, 0x85, 0xc4, 0xd5, 0x51, 0x96, 0xb6, 0x42, 0x92, 0xbc,
+ 0x7b, 0x0b, 0xbf, 0x13, 0x9b, 0x0a, 0x1a, 0xfa, 0x3f, 0x82, 0x1b, 0x54,
+ 0xc2, 0x39, 0x08, 0xc9, 0xc5, 0xa1, 0x95, 0xc5, 0xf9, 0x20, 0xeb, 0xb5,
+ 0x7f, 0x6d, 0x5a, 0x8a, 0x36, 0x1e, 0x7a, 0x50, 0xe1, 0xce, 0xd5, 0x23,
+ 0xf5, 0x7e, 0x47, 0x94, 0x81, 0xfe, 0xca, 0x43, 0xae, 0x27, 0x3e, 0xf3,
+ 0x69, 0x87, 0xbd, 0x7e, 0x86, 0x4e, 0xc5, 0xdf, 0xdd, 0x83, 0x4c, 0x28,
+ 0x68, 0x38, 0x95, 0x81, 0x98, 0xba, 0xb4, 0xd5, 0xf1, 0xcf, 0xb7, 0x57,
+ 0x7b, 0x40, 0xea, 0x23, 0x69, 0xf2, 0x5e, 0xa3, 0x7b, 0xab, 0x4e, 0x89,
+ 0xe2, 0x3f, 0x6a, 0xa0, 0x9c, 0xaa, 0xf8, 0x78, 0xa9, 0x40, 0x28, 0xdd,
+ 0x40, 0x11, 0x23, 0xe1, 0xc2, 0x98, 0x92, 0xbe, 0x00, 0xc5, 0x2e, 0x48,
+ 0x35, 0x0a, 0xf7, 0x93, 0xe2, 0xc0, 0x18, 0xd9, 0x34, 0x99, 0x9f, 0x28,
+ 0xb0, 0x18, 0xa7, 0xe5, 0x20, 0x3f, 0xd0, 0x5d, 0xc4, 0xca, 0xac, 0x25,
+ 0x0b, 0x50, 0x91, 0x69, 0xea, 0xe9, 0x9d, 0x2b, 0x5a, 0x25, 0x78, 0x26,
+ 0x3d, 0xdc, 0x67, 0x0c, 0xf3, 0x30, 0x9e, 0xe7, 0xfa, 0x54, 0x88, 0x3e,
+ 0x96, 0x2d, 0x67, 0x79, 0x20, 0x2c, 0xfc, 0x70, 0xb1, 0x3f, 0xf6, 0x57,
+ 0x8e, 0x1a, 0x64, 0x08, 0x03, 0x34, 0x55, 0x6a, 0xb3, 0x11, 0xf1, 0xa9,
+ 0xcc, 0x87, 0x60, 0x94, 0xe9, 0x58, 0x37, 0x56, 0xb0, 0x3d, 0x8d, 0x26,
+ 0xa1, 0x55, 0xfc, 0x8e, 0xd3, 0xa6, 0xfd, 0x74, 0x42, 0x82, 0x8d, 0x45,
+ 0xf9, 0x0d, 0x46, 0x23, 0x7d, 0xd3, 0xfe, 0x91, 0x0d, 0x2c, 0x4a, 0xda,
+ 0x3b, 0x52, 0x89, 0x3b, 0xf6, 0x7b, 0xb1, 0x3f, 0x52, 0xea, 0x08, 0xf8,
+ 0xc2, 0xe8, 0xb1, 0x39, 0x8c, 0xee, 0x62, 0x22, 0x99, 0x5b, 0xf2, 0xe7,
+ 0x05, 0xb8, 0x6e, 0x97, 0x5f, 0x0c, 0x3e, 0x8c, 0xdc, 0x7f, 0xbf, 0xfe,
+ 0x4d, 0x79, 0xc3, 0xc0, 0x42, 0xab, 0xcb, 0xbd, 0x95, 0x8f, 0x01, 0xf3,
+ 0xdc, 0x12, 0x5a, 0x96, 0x70, 0x31, 0x85, 0xf4, 0x5d, 0x8f, 0xea, 0x6f,
+ 0xab, 0xf9, 0x5b, 0xb1, 0x34, 0x03, 0x80, 0xea, 0x80, 0xa0, 0x7b, 0xdf,
+ 0xa4, 0x3b, 0x5b, 0x68, 0xb4, 0x92, 0xa4, 0x64, 0x5f, 0x15, 0x88, 0x4d,
+ 0xec, 0xfc, 0x41, 0xa2, 0x36, 0xd9, 0xc3, 0x6a, 0x48, 0x9d, 0x3d, 0x1f,
+ 0x58, 0x47, 0x16, 0xe5, 0xd4, 0xd0, 0x33, 0xb0, 0x9b, 0xef, 0xe4, 0x83,
+ 0x85, 0x86, 0xc9, 0x4c, 0xb6, 0x83, 0x99, 0xa8, 0x2a, 0x25, 0x0d, 0x12,
+ 0x38, 0x48, 0xd8, 0xff, 0xdf, 0xc2, 0xda, 0xf3, 0x7c, 0xae, 0xbc, 0x05,
+ 0x1a, 0xfc, 0x90, 0x81, 0x9e, 0x08, 0x27, 0x45, 0x36, 0x56, 0x5f, 0xe6,
+ 0x9e, 0xf9, 0x52, 0xd5, 0x48, 0x88, 0x6d, 0x63, 0x90, 0xbb, 0xcc, 0x3d,
+ 0xef, 0x43, 0x88, 0x3c, 0x3d, 0xd0, 0x77, 0x4d, 0x13, 0x85, 0xad, 0xd4,
+ 0x1c, 0x18, 0xb9, 0x89, 0xbc, 0xb8, 0x11, 0xd0, 0x0e, 0x98, 0x27, 0x15,
+ 0x08, 0x7d, 0xf1, 0x76, 0xe6, 0x53, 0x3e, 0x0d, 0x98, 0x08, 0xdc, 0x79,
+ 0x44, 0x4f, 0x5d, 0x6a, 0x9f, 0xff, 0x9f, 0x69, 0xb4, 0x07, 0x8a, 0x27,
+ 0x78, 0xb1, 0x9b, 0x1e, 0x21, 0xc8, 0xa3, 0xc7, 0xeb, 0x09, 0x83, 0xb2,
+ 0x1b, 0x25, 0x0c, 0x43, 0xc1, 0xed, 0xc0, 0xd5, 0x01, 0xc3, 0x2e, 0x9d,
+ 0x47, 0x14, 0x1a, 0x30, 0xe2, 0xc6, 0x54, 0x3d, 0xbc, 0xc3, 0xc1, 0x5f,
+ 0xb1, 0x62, 0x18, 0xee, 0x00, 0xc5, 0x43, 0x29, 0xe8, 0x6b, 0x3c, 0xcb,
+ 0x5f, 0x79, 0xdc, 0x28, 0x32, 0xb5, 0x63, 0x86, 0xad, 0xc5, 0x06, 0xf9,
+ 0x26, 0x2e, 0x7c, 0x2c, 0x1f, 0x76, 0x3e, 0x63, 0x2a, 0xdf, 0x5b, 0x40,
+ 0x56, 0x46, 0x1b, 0xd7, 0x42, 0xa6, 0x7e, 0x10, 0x02, 0x96, 0x2b, 0x9a,
+ 0x1e, 0xaa, 0x5c, 0x5f, 0x46, 0xd6, 0xc7, 0x32, 0x62, 0x39, 0xf0, 0x9b,
+ 0x72, 0xd5, 0xba, 0x87, 0x8b, 0x06, 0x61, 0xec, 0x57, 0x5f, 0xcc, 0x81,
+ 0x14, 0xc4, 0xc9, 0x73, 0xe8, 0xd1, 0x47, 0x6f, 0x7b, 0xbd, 0x1b, 0x63,
+ 0x99, 0x1a, 0x2d, 0xc2, 0xaf, 0xe9, 0x28, 0x27, 0xa2, 0x2b, 0xc8, 0x88,
+ 0x45, 0x47, 0xbc, 0x52, 0x29, 0x9f, 0x7e, 0x63, 0x2c, 0xb0, 0xcb, 0xa0,
+ 0xcb, 0x83, 0x42, 0xe5, 0xd7, 0xf6, 0xa4, 0xd3, 0x27, 0xbf, 0x89, 0x49,
+ 0x83, 0xdc, 0x1f, 0x2b, 0xbd, 0x32, 0x58, 0x5b, 0x9d, 0xd6, 0x74, 0x7c,
+ 0x8d, 0x8b, 0x38, 0xca, 0x5e, 0xce, 0xd6, 0xf6, 0x95, 0xcd, 0x5b, 0xb7,
+ 0x85, 0x3a, 0x64, 0xed, 0x3a, 0x2e, 0xcc, 0xeb, 0xad, 0x0a, 0x87, 0xc7,
+ 0x93, 0xf8, 0x55, 0x2c, 0x5b, 0xac, 0x63, 0xfc, 0x76, 0xa8, 0xd7, 0xa3,
+ 0xcf, 0x6e, 0x46, 0x8b, 0x18, 0x51, 0x5b, 0xdd, 0xdc, 0x00, 0x5f, 0xbe,
+ 0x34, 0xc2, 0x92, 0xb2, 0xcf, 0x11, 0x83, 0x85, 0x84, 0x23, 0x1b, 0xa9,
+ 0x54, 0xd9, 0xbf, 0x94, 0xa8, 0x1d, 0x90, 0x82, 0xf0, 0xbb, 0x86, 0x39,
+ 0xb8, 0x2b, 0x95, 0x78, 0xc2, 0xd9, 0xa4, 0x72, 0x0f, 0x11, 0xf0, 0x84,
+ 0xc3, 0x49, 0x8f, 0xdb, 0xa4, 0xf3, 0x85, 0x1b, 0xd6, 0xc5, 0xcb, 0x47,
+ 0xea, 0xa6, 0x69, 0xa5, 0x48, 0x26, 0xab, 0xd9, 0x95, 0xfb, 0xaa, 0x6a,
+ 0x55, 0xcc, 0x25, 0x43, 0xfe, 0x2b, 0x70, 0x66, 0xb9, 0x44, 0xef, 0x49,
+ 0x34, 0xcf, 0x66, 0xd0, 0x0f, 0x0e, 0x46, 0x2b, 0x6c, 0x94, 0x9e, 0x3f,
+ 0x9c, 0xa0, 0x6d, 0xd0, 0x15, 0x00, 0x42, 0x8f, 0x5b, 0x53, 0x11, 0x40,
+ 0x26, 0x06, 0x02, 0xbc, 0x21, 0xd5, 0x32, 0x0a, 0xe2, 0xb7, 0xb5, 0x49,
+ 0xd2, 0x19, 0x79, 0xce, 0x06, 0x40, 0x4f, 0x48, 0xca, 0x4f, 0x10, 0x15,
+ 0x91, 0xf9, 0x41, 0xd9, 0xcd, 0xb4, 0x64, 0x1b, 0xed, 0xa4, 0xca, 0x4e,
+ 0x7c, 0xcc, 0xa8, 0xa7, 0xa4, 0x87, 0xb5, 0x68, 0xd7, 0xba, 0x70, 0x69,
+ 0xd6, 0x4e, 0x05, 0x2a, 0xb6, 0x9c, 0x4f, 0x9b, 0xc4, 0x01, 0x8d, 0xc5,
+ 0x1a, 0x2b, 0x53, 0x97, 0x2a, 0x9e, 0x66, 0x87, 0xc5, 0xf8, 0xd6, 0x6b,
+ 0x28, 0xcf, 0x4d, 0x8b, 0x14, 0xa9, 0x4b, 0xdd, 0xe7, 0xd9, 0x22, 0xc7,
+ 0xa1, 0xeb, 0xe6, 0x4c, 0x1f, 0x32, 0xe4, 0xb0, 0x8d, 0x1a, 0x8c, 0x06,
+ 0xfe, 0xc4, 0x4f, 0x40, 0x4d, 0x30, 0x48, 0x00, 0x00, 0xf4, 0xd4, 0x5f,
+ 0x89, 0xb7, 0x81, 0xde, 0x32, 0x73, 0x42, 0x14, 0xf0, 0x56, 0x42, 0x0a,
+ 0xac, 0x9a, 0x1e, 0x22, 0x2f, 0xf0, 0x32, 0x59, 0x75, 0x80, 0x30, 0x80,
+ 0x4a, 0x17, 0xe5, 0x0d, 0x5a, 0xcb, 0x54, 0x4b, 0xbf, 0x45, 0x7b, 0x1c,
+ 0x8a, 0xe7, 0x32, 0xec, 0x5c, 0xd5, 0xd6, 0x5a, 0xc5, 0x2e, 0xb7, 0x7a,
+ 0x45, 0xc5, 0xe3, 0x50, 0x17, 0x54, 0x8d, 0x05, 0xdb, 0x35, 0xa2, 0x2d,
+ 0xce, 0x77, 0x08, 0x04, 0x1b, 0x0e, 0x2d, 0x40, 0x01, 0xca, 0x4a, 0x29,
+ 0x9f, 0x0e, 0x54, 0x36, 0x69, 0x94, 0xec, 0x0e, 0x34, 0x5f, 0xc1, 0xba,
+ 0x8b, 0x35, 0x4e, 0xde, 0x1a, 0x75, 0x88, 0xac, 0xc9, 0xde, 0x13, 0x2f,
+ 0x31, 0xfd, 0x8f, 0x5d, 0x93, 0x59, 0xf2, 0xf2, 0x22, 0x88, 0x70, 0x18,
+ 0x49, 0x46, 0x3f, 0x35, 0x8a, 0x36, 0xf4, 0x34, 0xd1, 0x1a, 0x84, 0x72,
+ 0xa6, 0x02, 0x75, 0xaa, 0x7c, 0x6d, 0x16, 0x89, 0x21, 0xfe, 0x2b, 0x42,
+ 0x36, 0xf4, 0x8e, 0xf2, 0xb4, 0xa8, 0xd2, 0xc3, 0xaa, 0xd2, 0x3e, 0xb0,
+ 0x22, 0xd9, 0xbd, 0x5d, 0x6c, 0x7f, 0xa9, 0x88, 0xb8, 0x63, 0x8d, 0x50,
+ 0x4e, 0x7d, 0x4b, 0x85, 0xd7, 0x3a, 0x5b, 0xd4, 0x4d, 0xfb, 0xd8, 0xae,
+ 0xd8, 0x66, 0xb9, 0x85, 0x51, 0xb2, 0x4c, 0x4f, 0xe6, 0xe6, 0x46, 0x66,
+ 0x30, 0xd3, 0xc2, 0x0c, 0x87, 0x6e, 0x65, 0x5d, 0x04, 0x54, 0xdb, 0x3d,
+ 0x60, 0xae, 0x1f, 0xc3, 0x07, 0x48, 0xd0, 0x83, 0x34, 0x27, 0xab, 0xa7,
+ 0x7f, 0xe6, 0x91, 0x21, 0xf8, 0x9c, 0x45, 0x57, 0x2a, 0x76, 0x64, 0xa6,
+ 0xc6, 0xf4, 0xf3, 0x33, 0x2a, 0xfe, 0x76, 0x70, 0xff, 0xba, 0x25, 0xbe,
+ 0x0e, 0xb8, 0x42, 0x8f, 0x22, 0x43, 0xfe, 0x16, 0x0f, 0x2a, 0xa9, 0x3e,
+ 0x0e, 0xe5, 0x5d, 0x8a, 0xe2, 0x79, 0x05, 0xb1, 0x19, 0xb5, 0x33, 0x2d,
+ 0xb7, 0xf2, 0x82, 0xad, 0x17, 0x24, 0x06, 0x53, 0xb9, 0xd4, 0x3c, 0xc5,
+ 0x74, 0xc1, 0x2e, 0xaa, 0x5c, 0x88, 0x85, 0x0f, 0xa7, 0x1c, 0x67, 0x97,
+ 0x6b, 0x03, 0x85, 0x76, 0xf9, 0xce, 0x16, 0xdd, 0x1a, 0x11, 0x8e, 0xec,
+ 0xfa, 0x0e, 0xaf, 0x57, 0x72, 0x02, 0x0b, 0xbb, 0x63, 0x48, 0xf4, 0x27,
+ 0x9f, 0xe6, 0x32, 0x63, 0xb1, 0xac, 0x0d, 0x0e, 0x5b, 0x22, 0x43, 0xe9,
+ 0x06, 0xa8, 0x50, 0x0f, 0x15, 0xb6, 0x37, 0x31, 0x2b, 0x0b, 0x6a, 0xc1,
+ 0x33, 0x2f, 0x91, 0xe2, 0x7c, 0x94, 0x71, 0xaf, 0xbe, 0xd5, 0x91, 0x39,
+ 0x30, 0x72, 0xba, 0x26, 0xfa, 0x48, 0x05, 0x6a, 0x1f, 0x4b, 0xa0, 0x7d,
+ 0x9d, 0x24, 0x73, 0x89, 0xfa, 0xe2, 0xab, 0xbd, 0x46, 0x25, 0x65, 0x9e,
+ 0xf1, 0xea, 0xb9, 0x25, 0x18, 0x87, 0x04, 0xdd, 0xdb, 0x1e, 0xd9, 0xde,
+ 0x32, 0xfd, 0x3e, 0xa3, 0x1f, 0x26, 0xf0, 0x90, 0xfb, 0x2c, 0xaf, 0xba,
+ 0x6a, 0x62, 0xf5, 0x66, 0xb2, 0x97, 0x26, 0x74, 0x70, 0xf8, 0x9a, 0x2c,
+ 0x5c, 0xbf, 0x89, 0x0a, 0x2b, 0x2b, 0xb1, 0x91, 0x1d, 0xaa, 0x39, 0x20,
+ 0x2b, 0x67, 0x8f, 0x38, 0xf4, 0x91, 0x4b, 0xad, 0x6b, 0xcb, 0x02, 0xfb,
+ 0x52, 0xf9, 0x38, 0x5a, 0xd3, 0x48, 0xc8, 0x4d, 0xc6, 0x9e, 0x7d, 0x1b,
+ 0x60, 0x6d, 0xa3, 0x3a, 0x07, 0x74, 0xde, 0xb8, 0x64, 0xd9, 0xed, 0x7e,
+ 0x77, 0x38, 0x7e, 0x0c, 0x93, 0x40, 0x89, 0xc8, 0x7e, 0x41, 0xb4, 0x7b,
+ 0xde, 0xb3, 0xa5, 0xbc, 0x6a, 0xf4, 0x74, 0xd6, 0x82, 0x47, 0x45, 0x99,
+ 0x5f, 0x7f, 0x3f, 0x77, 0x81, 0x82, 0xd2, 0xbb, 0xb0, 0x62, 0x3a, 0x9a,
+ 0x7c, 0x21, 0x10, 0xf6, 0x75, 0x92, 0xb8, 0xdb, 0x26, 0xb7, 0x53, 0xde,
+ 0xe4, 0x81, 0xc2, 0x49, 0xc1, 0x91, 0xfe, 0x64, 0x83, 0x27, 0xc3, 0xe5,
+ 0x4f, 0x33, 0x95, 0x65, 0x7c, 0x0f, 0xcf, 0xbc, 0x22, 0x82, 0x70, 0x89,
+ 0xe5, 0xba, 0x85, 0x05, 0x3b, 0xc9, 0x7b, 0xc1, 0x53, 0x36, 0x7f, 0x66,
+ 0x8f, 0x52, 0xdb, 0xd4, 0x8e, 0x2b, 0x3d, 0x24, 0x13, 0x6b, 0x4c, 0xa8,
+ 0x9f, 0xfa, 0x3c, 0x59, 0xb9, 0x2b, 0x71, 0xbb, 0x4a, 0x46, 0x9d, 0x57,
+ 0xe1, 0x05, 0x28, 0xd4, 0x22, 0x93, 0x2f, 0x12, 0x57, 0xf5, 0xe2, 0xd3,
+ 0x95, 0xd0, 0xb9, 0xe4, 0x23, 0x2d, 0x75, 0xd6, 0x2c, 0x88, 0x68, 0x4a,
+ 0x5d, 0x94, 0xfb, 0x60, 0xd6, 0x3c, 0xae, 0xde, 0xb4, 0x0a, 0x49, 0x1a,
+ 0x74, 0x61, 0x9a, 0xd8, 0xe4, 0xd4, 0x3e, 0x85, 0xc5, 0xda, 0x0d, 0x25,
+ 0x6d, 0xc8, 0x9f, 0x51, 0xa9, 0x9b, 0xa0, 0xe5, 0x7b, 0x5e, 0xe5, 0x28,
+ 0xa9, 0x8e, 0xd3, 0x06, 0x85, 0x09, 0x07, 0x74, 0xc0, 0xd0, 0x09, 0xa9,
+ 0xf1, 0xea, 0xca, 0x82, 0x8c, 0x4a, 0xf6, 0x02, 0x8d, 0xf1, 0xd9, 0x86,
+ 0xff, 0x1f, 0x11, 0x0c, 0xd9, 0x00, 0x4f, 0x5b, 0x22, 0x98, 0x4e, 0x50,
+ 0x7d, 0xc6, 0x34, 0xbb, 0x23, 0xdb, 0x75, 0xc1, 0x5b, 0x17, 0x44, 0x3a,
+ 0x3f, 0x91, 0xb7, 0x0a, 0x17, 0xaf, 0x3e, 0x4f, 0xb6, 0xbd, 0x3b, 0x69,
+ 0xb9, 0x92, 0xbf, 0xe3, 0x47, 0x89, 0x41, 0xe2, 0x55, 0xbd, 0xb5, 0x4c,
+ 0xbe, 0xb7, 0x57, 0xd6, 0x41, 0x12, 0xf4, 0x20, 0x1b, 0x10, 0x22, 0x3f,
+ 0x8b, 0x62, 0x0f, 0x27, 0x76, 0xdf, 0xa7, 0xef, 0x73, 0xd1, 0x3b, 0x61,
+ 0x18, 0xd7, 0x90, 0xd8, 0x1b, 0xdb, 0xd1, 0xa9, 0x2c, 0x4e, 0x88, 0xa8,
+ 0x0c, 0xc9, 0xe4, 0xed, 0x73, 0x76, 0x8a, 0x4c, 0xda, 0xcd, 0xc5, 0x8b,
+ 0xce, 0x70, 0xcb, 0xc2, 0x57, 0x72, 0xb8, 0xe5, 0xfc, 0x80, 0x02, 0xb4,
+ 0x2d, 0xa6, 0x72, 0x88, 0xde, 0x96, 0x99, 0xd1, 0x8f, 0x08, 0xec, 0xd4,
+ 0xda, 0x8f, 0x84, 0x44, 0x0f, 0x0b, 0xba, 0xc5, 0x0c, 0xac, 0xbd, 0x03,
+ 0x7e, 0x95, 0x33, 0x65, 0x5b, 0x86, 0xfb, 0x25, 0xf3, 0xe4, 0x2e, 0x7e,
+ 0x8b, 0x70, 0x19, 0x4e, 0x35, 0xe5, 0x1d, 0x22, 0xa8, 0xad, 0xc9, 0xbf,
+ 0x80, 0xd0, 0x2b, 0xc4, 0x2d, 0x5a, 0xfe, 0x67, 0x96, 0x88, 0x4f, 0xda,
+ 0x1b, 0x48, 0xa4, 0x25, 0x51, 0x8c, 0x83, 0x3f, 0x22, 0xf6, 0x5d, 0xc1,
+ 0x8f, 0x48, 0x56, 0xd3, 0xed, 0xa4, 0x12, 0x29, 0x18, 0x32, 0xa9, 0x9c,
+ 0xcc, 0x42, 0xec, 0x0c, 0xf7, 0x26, 0x2b, 0xb6, 0xd0, 0x49, 0x6d, 0xa0,
+ 0xf4, 0x59, 0x58, 0x5c, 0xab, 0x9f, 0x2f, 0xfe, 0x7b, 0x2c, 0x8b, 0xf3,
+ 0x61, 0xb1, 0xd9, 0x84, 0xd4, 0x84, 0xed, 0x0a, 0x9a, 0xc6, 0x0b, 0x0f,
+ 0x67, 0x8a, 0xdd, 0x26, 0xdb, 0xd2, 0x54, 0xea, 0x22, 0x56, 0xff, 0x8b,
+ 0x2b, 0xf8, 0xd3, 0x18, 0x10, 0x18, 0x2c, 0xeb, 0xb9, 0x4f, 0xa9, 0x3d,
+ 0xa0, 0xea, 0x86, 0xb9, 0x27, 0xb1, 0xac, 0xa8, 0xfd, 0xc1, 0x72, 0x9a,
+ 0xaa, 0xcf, 0x51, 0x27, 0x2e, 0x39, 0xb7, 0x7e, 0x29, 0x2c, 0xad, 0xe7,
+ 0x42, 0x8b, 0xd1, 0x8a, 0x91, 0x5f, 0x17, 0xd9, 0xcb, 0xf4, 0x5c, 0x9f,
+ 0xeb, 0x67, 0xf4, 0x99, 0xe8, 0x09, 0x0a, 0x83, 0xc7, 0xe0, 0x43, 0x58,
+ 0xd9, 0x1c, 0xc3, 0xb8, 0x0c, 0x13, 0xb0, 0x4e, 0x05, 0xfd, 0x9b, 0x48,
+ 0xd1, 0x33, 0x87, 0xec, 0xf1, 0x99, 0xd4, 0xd6, 0xfe, 0x74, 0x89, 0x2e,
+ 0x46, 0xe7, 0xdb, 0x5c, 0x14, 0x8b, 0x87, 0x06, 0x1e, 0x97, 0x65, 0x31,
+ 0x20, 0x3e, 0x68, 0x9f, 0x78, 0x0d, 0x6b, 0x22, 0xaf, 0x05, 0xfb, 0xba,
+ 0x8e, 0x12, 0xd3, 0x86, 0x03, 0x71, 0x45, 0x87, 0x8a, 0x2e, 0x69, 0xef,
+ 0x52, 0xe7, 0xce, 0xac, 0xe4, 0xe2, 0x9d, 0x5b, 0xc4, 0x84, 0x27, 0x38,
+ 0x2b, 0xbd, 0x3b, 0x7a, 0xed, 0xe4, 0x11, 0x7e, 0xbf, 0x30, 0xa9, 0x8a,
+ 0x86, 0x4a, 0x3c, 0xde, 0x16, 0xa9, 0x41, 0x4e, 0xb9, 0xf6, 0x31, 0xb5,
+ 0x04, 0x09, 0xaa, 0xf2, 0x66, 0x90, 0xce, 0x97, 0x21, 0x3f, 0x34, 0x8a,
+ 0x66, 0x10, 0xa2, 0xd0, 0xa9, 0x28, 0xae, 0xa5, 0xef, 0xf7, 0x1a, 0x59,
+ 0x41, 0x7d, 0xe9, 0x87, 0x17, 0x7d, 0x31, 0x28, 0xdd, 0x62, 0xb3, 0x9d,
+ 0x63, 0x16, 0xa9, 0x05, 0x53, 0xf0, 0xfa, 0x6f, 0xc9, 0x49, 0xe3, 0x02,
+ 0x37, 0xa6, 0xcb, 0xb2, 0xb2, 0x55, 0x5f, 0x89, 0xbf, 0xb7, 0x71, 0x5a,
+ 0xa0, 0x6b, 0x0a, 0x15, 0xb9, 0x8a, 0xc2, 0xec, 0xa8, 0x25, 0x75, 0x78,
+ 0x27, 0x07, 0x0a, 0x0d, 0x47, 0xc5, 0x6c, 0x59, 0x47, 0x7b, 0x31, 0x24,
+ 0xce, 0x64, 0x29, 0x66, 0xba, 0xe0, 0x4e, 0xf5, 0x3d, 0x33, 0x1a, 0xfc,
+ 0x8f, 0xac, 0xcd, 0x1c, 0x02, 0xe5, 0x60, 0xe9, 0x45, 0xad, 0x80, 0x2f,
+ 0x25, 0xb7, 0x0b, 0xb6, 0x5a, 0x5b, 0x23, 0x69, 0xf9, 0x1f, 0xe6, 0x68,
+ 0xc3, 0xc7, 0x28, 0x6d, 0x2d, 0xa6, 0x68, 0x62, 0x4e, 0x8f, 0x11, 0x86,
+ 0xee, 0x72, 0x86, 0xaa, 0x47, 0x80, 0xe4, 0x0c, 0x61, 0x51, 0x67, 0xca,
+ 0x95, 0x86, 0x89, 0xa4, 0x46, 0x8a, 0xa5, 0xa5, 0x08, 0xc8, 0xb9, 0x14,
+ 0x0f, 0x90, 0xf8, 0x76, 0xab, 0x53, 0x57, 0x18, 0xd0, 0x51, 0x70, 0xd9,
+ 0x7f, 0xd7, 0xdd, 0xe3, 0xc9, 0x17, 0x5a, 0xfe, 0x42, 0x29, 0x0f, 0xf8,
+ 0x1e, 0x48, 0x4d, 0xd1, 0x5d, 0x3e, 0x0f, 0x8f, 0x10, 0x85, 0x07, 0x0f,
+ 0x6b, 0xeb, 0x58, 0x40, 0x87, 0xd5, 0x46, 0xb5, 0x16, 0x81, 0xdc, 0x40,
+ 0x46, 0xdf, 0xde, 0xcc, 0xeb, 0xc2, 0x07, 0x71, 0x7b, 0xa2, 0x28, 0xd5,
+ 0xd0, 0xf2, 0x0c, 0x05, 0xee, 0x43, 0x3f, 0xfe, 0x09, 0xfe, 0x3b, 0x51,
+ 0xf6, 0x4a, 0xf7, 0xcb, 0xbf, 0x36, 0x99, 0xe5, 0xda, 0xf3, 0x0c, 0xaf,
+ 0xaf, 0xd1, 0x5a, 0xa0, 0x58, 0xa6, 0x19, 0x48, 0x04, 0xdd, 0x2f, 0x41,
+ 0x57, 0xf4, 0x93, 0xca, 0x5d, 0xe7, 0x61, 0x66, 0xcc, 0x12, 0x8d, 0x00,
+ 0xdb, 0x55, 0xa8, 0x69, 0x96, 0xdc, 0x5a, 0xc4, 0xcf, 0x32, 0x74, 0x30,
+ 0xcf, 0xca, 0x2e, 0xa9, 0xda, 0x3d, 0x21, 0x47, 0x15, 0xe8, 0xf1, 0xb6,
+ 0xa2, 0xdf, 0xf7, 0x9c, 0xc2, 0x43, 0xd6, 0x46, 0x64, 0x5e, 0xd4, 0x15,
+ 0xa3, 0x22, 0x90, 0x68, 0x5a, 0xfa, 0xb4, 0xdf, 0x1f, 0x54, 0xfa, 0xe5,
+ 0xb0, 0xa0, 0xad, 0x4a, 0xdf, 0xb0, 0x14, 0x44, 0x05, 0x17, 0xb5, 0xe1,
+ 0x94, 0xb2, 0x3a, 0x51, 0x6c, 0xcd, 0xfa, 0xee, 0x4f, 0x29, 0x17, 0x71,
+ 0x99, 0x2c, 0xfb, 0x1a, 0x3c, 0xa0, 0x62, 0x59, 0xc2, 0xee, 0xbd, 0x9f,
+ 0x7f, 0xf7, 0xa5, 0x7a, 0x25, 0x74, 0xbf, 0xb0, 0x59, 0xff, 0x97, 0xe4,
+ 0xff, 0xed, 0x29, 0x3d, 0x86, 0xf3, 0xf6, 0xdb, 0x6e, 0x1a, 0x11, 0x15,
+ 0x29, 0x09, 0xb6, 0x98, 0x10, 0xe3, 0x94, 0x15, 0xe2, 0x2a, 0x5c, 0xc5,
+ 0x27, 0xf4, 0x58, 0xea, 0x3d, 0x1f, 0x0b, 0xca, 0xfe, 0x5a, 0x5f, 0xb5,
+ 0x42, 0x7d, 0x72, 0x00, 0x9e, 0x45, 0xab, 0x0d, 0xd7, 0xa2, 0x75, 0x88,
+ 0x56, 0x20, 0x99, 0xc1, 0x28, 0x79, 0x9f, 0x16, 0x2b, 0x08, 0xc1, 0xe0,
+ 0x25, 0x6a, 0x01, 0xee, 0xdc, 0x03, 0xc7, 0x1c, 0xcf, 0xe6, 0x17, 0x77,
+ 0xa8, 0xb6, 0xae, 0x5a, 0xd4, 0x75, 0xd8, 0x84, 0x70, 0xf4, 0xdf, 0x0c,
+ 0xe4, 0xce, 0xaa, 0x70, 0x34, 0x61, 0xbd, 0x8a, 0x79, 0x57, 0x11, 0x63,
+ 0xd3, 0x78, 0x66, 0xb7, 0xc6, 0xbf, 0xda, 0x63, 0xc0, 0x23, 0xef, 0x9e,
+ 0xea, 0x35, 0x6d, 0x50, 0xa7, 0x04, 0x6a, 0xda, 0x30, 0x56, 0x1b, 0x6d,
+ 0xdf, 0x1c, 0xae, 0xcb, 0xa5, 0xb6, 0xd2, 0xd8, 0x5b, 0x48, 0x74, 0x01,
+ 0xc4, 0x64, 0xcc, 0x09, 0xfb, 0xc7, 0x6b, 0xe5, 0xf8, 0xd6, 0x0b, 0x0b,
+ 0x71, 0x39, 0xfa, 0xee, 0x58, 0x0e, 0xf3, 0xf9, 0x0e, 0x5b, 0x38, 0xeb,
+ 0x16, 0xc5, 0xb6, 0x5a, 0x26, 0xeb, 0xf8, 0x23, 0xe2, 0x4a, 0x10, 0x59,
+ 0xc3, 0xb2, 0x38, 0x2a, 0x0f, 0x64, 0x3b, 0xa1, 0x65, 0x8b, 0x30, 0x7c,
+ 0x54, 0x8e, 0xe3, 0x54, 0x75, 0x9c, 0xd6, 0xb2, 0x0f, 0x37, 0x5b, 0xe0,
+ 0xf7, 0x25, 0x3c, 0x73, 0xbd, 0x8f, 0xba, 0xb4, 0xa0, 0xd2, 0xcf, 0x90,
+ 0x57, 0x19, 0x65, 0x64, 0x9f, 0x4d, 0x34, 0x9a, 0x40, 0x6e, 0xbf, 0xeb,
+ 0xbe, 0x6f, 0xfc, 0x76, 0x6b, 0x0b, 0x14, 0xda, 0xa1, 0x09, 0xff, 0x11,
+ 0x2c, 0xa8, 0x8f, 0x70, 0xc9, 0xe1, 0x96, 0x2b, 0xf8, 0x2c, 0x21, 0x87,
+ 0x21, 0xfd, 0x5d, 0xd0, 0x21, 0x2e, 0x75, 0xfb, 0x46, 0xd9, 0x1d, 0xa2,
+ 0x72, 0x9d, 0x44, 0xf5, 0x29, 0xfa, 0x01, 0x2c, 0xc7, 0x4f, 0x42, 0xa4,
+ 0x55, 0xb1, 0x90, 0x3f, 0xec, 0x8c, 0x56, 0xba, 0x69, 0x57, 0xd0, 0xf1,
+ 0x9d, 0x9f, 0xd3, 0x83, 0x21, 0xb8, 0xda, 0xc1, 0x90, 0x03, 0xd5, 0xfb,
+ 0x7e, 0xc8, 0xbd, 0x96, 0xe8, 0xce, 0x48, 0x31, 0x9f, 0xc6, 0x37, 0x8a,
+ 0xc5, 0x42, 0x54, 0x46, 0x38, 0xf2, 0x42, 0x6c, 0xfa, 0xfa, 0x5f, 0xe6,
+ 0x32, 0x4b, 0xda, 0xab, 0xb9, 0xd6, 0x96, 0x4a, 0x2c, 0xbb, 0x7d, 0x7b,
+ 0x7b, 0x4a, 0xca, 0xaf, 0x9c, 0xad, 0x4d, 0xfe, 0xde, 0x5c, 0x5e, 0x92,
+ 0x73, 0x73, 0xed, 0x8d, 0x57, 0x49, 0x52, 0x17, 0xeb, 0x96, 0x2e, 0x27,
+ 0x15, 0x54, 0x4f, 0xf8, 0x7a, 0xc2, 0x37, 0xf3, 0xc9, 0x70, 0xd2, 0x88,
+ 0x10, 0x1b, 0xc5, 0x6d, 0x52, 0x9a, 0xc5, 0x8b, 0x56, 0x7e, 0xc1, 0x5a,
+ 0xd8, 0xea, 0xc9, 0x69, 0x0e, 0x70, 0xda, 0xed, 0x0e, 0xd4, 0x5c, 0xe1,
+ 0xcd, 0x68, 0xbe, 0x26, 0xb9, 0xb3, 0xfc, 0x00, 0x4d, 0xb2, 0xbf, 0x1a,
+ 0x9e, 0x03, 0x82, 0xac, 0x79, 0x3b, 0x51, 0xc6, 0xf7, 0xce, 0xdc, 0xf2,
+ 0x1e, 0x62, 0xb1, 0x8b, 0x1f, 0xb8, 0x45, 0xdf, 0xe4, 0xb1, 0xc6, 0x95,
+ 0x07, 0x0e, 0x27, 0xe1, 0xd1, 0x30, 0x60, 0xec, 0x90, 0xd2, 0x0f, 0xac,
+ 0xd1, 0xd4, 0x57, 0xc4, 0x1b, 0xe6, 0xdf, 0xa3, 0x2a, 0x55, 0x20, 0xc3,
+ 0x35, 0x1a, 0x23, 0x27, 0x90, 0x77, 0xc9, 0xb1, 0x75, 0xfa, 0xf1, 0x03,
+ 0x1a, 0x5a, 0xf8, 0x6b, 0x6b, 0xc0, 0x10, 0x69, 0x8d, 0x5e, 0x9e, 0x40,
+ 0x96, 0xf8, 0x46, 0xc2, 0x38, 0x07, 0xcf, 0x00, 0x26, 0x7e, 0x7f, 0x4e,
+ 0x72, 0x66, 0xca, 0x39, 0xf9, 0x73, 0x07, 0x46, 0xd9, 0xd5, 0x87, 0x23,
+ 0x6d, 0xa2, 0xd8, 0xe4, 0x05, 0x5c, 0x80, 0x7a, 0xe6, 0x5a, 0x0a, 0x4c,
+ 0x58, 0x45, 0xf5, 0x4d, 0x4c, 0xcf, 0x0b, 0x59, 0xa2, 0x07, 0x63, 0xb9,
+ 0x99, 0xa4, 0xec, 0x67, 0xb1, 0x96, 0x7f, 0x6c, 0xd7, 0xe0, 0x2b, 0x30,
+ 0x1e, 0x57, 0x75, 0x92, 0x1f, 0x47, 0x41, 0x5c, 0xdd, 0xf2, 0xe2, 0xa2,
+ 0xc5, 0x43, 0x2e, 0xd5, 0x2c, 0x9a, 0x15, 0x7a, 0x98, 0xa6, 0x7e, 0x9b,
+ 0x5f, 0x9f, 0xe7, 0xc7, 0xf5, 0x91, 0xc3, 0x39, 0xd0, 0xa6, 0xd6, 0x58,
+ 0x1a, 0x08, 0xa3, 0x2f, 0xce, 0x7e, 0x7c, 0xe5, 0x34, 0x9b, 0x8f, 0xd6,
+ 0x0d, 0x0e, 0xbc, 0x3c, 0x99, 0xad, 0x77, 0x87, 0x60, 0x23, 0x99, 0xcf,
+ 0xd5, 0x2c, 0x82, 0x80, 0xf2, 0x4e, 0x8f, 0x1a, 0x2e, 0x5e, 0x10, 0x9f,
+ 0xcb, 0x7b, 0x21, 0xfe, 0x17, 0x03, 0x99, 0x20, 0x6e, 0x2a, 0x3d, 0x97,
+ 0x96, 0x4c, 0x52, 0x58, 0x07, 0xa1, 0xa1, 0xdd, 0xfc, 0xa1, 0x52, 0x94,
+ 0x3a, 0xa5, 0xbd, 0xbb, 0xb5, 0x08, 0x13, 0xff, 0xcb, 0xfc, 0x79, 0xa8,
+ 0xdb, 0xde, 0xb5, 0x11, 0x4d, 0x5f, 0xb0, 0x2e, 0x2e, 0x0c, 0xa4, 0x95,
+ 0x40, 0x44, 0xe4, 0x8a, 0xe8, 0x94, 0xc2, 0x32, 0x84, 0x19, 0xfb, 0x46,
+ 0xfe, 0xd3, 0xdc, 0xfb, 0xb4, 0x7e, 0x27, 0xec, 0x17, 0x6c, 0xa5, 0xa6,
+ 0xb6, 0x6e, 0x89, 0x15, 0x1b, 0xa4, 0xda, 0xa3, 0xac, 0x25, 0x7e, 0x9e,
+ 0xf8, 0x97, 0x07, 0x41, 0x21, 0x61, 0x55, 0x40, 0xe0, 0xd9, 0x20, 0x1f,
+ 0x26, 0xad, 0xe9, 0x7f, 0x0f, 0xc7, 0x89, 0x0c, 0x6e, 0x13, 0xca, 0xef,
+ 0x5e, 0x7d, 0x71, 0x12, 0x73, 0xe5, 0xf3, 0xdf, 0xd8, 0xcf, 0xac, 0xda,
+ 0xbf, 0x27, 0xa3, 0x53, 0xf8, 0x8a, 0x5f, 0xbb, 0x44, 0x04, 0x34, 0x7d,
+ 0x42, 0xe2, 0x64, 0x88, 0x4a, 0xf4, 0x67, 0x24, 0x7e, 0xc9, 0x06, 0x63,
+ 0x54, 0xc6, 0x0d, 0x46, 0x86, 0xf2, 0x41, 0x50, 0xee, 0xf9, 0xd2, 0x2c,
+ 0x87, 0xd1, 0x4e, 0x5f, 0x93, 0x69, 0x47, 0x9e, 0x02, 0x98, 0xcc, 0x34,
+ 0xc9, 0x46, 0x84, 0x02, 0x31, 0x12, 0x6a, 0x47, 0x3d, 0x9a, 0x70, 0x87,
+ 0xbb, 0xc4, 0xc0, 0x48, 0x90, 0x88, 0x0a, 0x61, 0x3c, 0x6a, 0x68, 0x63,
+ 0x0c, 0x5c, 0x2e, 0x80, 0x19, 0x54, 0x0a, 0xc5, 0x2b, 0x61, 0x7d, 0x55,
+ 0x92, 0x2d, 0x83, 0x33, 0x1c, 0x7a, 0x0c, 0xfd, 0x82, 0x40, 0x4c, 0x53,
+ 0xb0, 0x64, 0xd2, 0x02, 0x96, 0x35, 0xd8, 0x3c, 0x08, 0x6d, 0x4b, 0x3d,
+ 0x15, 0x55, 0xf8, 0x2a, 0xa7, 0xca, 0x89, 0x68, 0xb0, 0xc0, 0xf6, 0x84,
+ 0xc4, 0xf9, 0x86, 0xb4, 0x9e, 0x61, 0x23, 0xee, 0x87, 0xce, 0x15, 0x3e,
+ 0xa1, 0xf6, 0x86, 0xeb, 0x0c, 0x90, 0xca, 0x7a, 0x4e, 0xc5, 0xba, 0x8c,
+ 0x0d, 0x05, 0x41, 0x1a, 0xf7, 0x84, 0x3c, 0x64, 0x1e, 0x1f, 0x55, 0x83,
+ 0x74, 0x95, 0x34, 0x64, 0xb2, 0x03, 0xd6, 0xcf, 0x0f, 0xe6, 0xd2, 0xe5,
+ 0x56, 0x8f, 0x8a, 0x87, 0xe7, 0x24, 0x79, 0xb2, 0xbb, 0x91, 0x24, 0xf6,
+ 0x3f, 0x6a, 0x2e, 0x38, 0x1b, 0xd9, 0xa8, 0x06, 0x4e, 0x1f, 0x85, 0x76,
+ 0x7d, 0x0e, 0x90, 0xa2, 0x50, 0x4d, 0x01, 0xdc, 0x04, 0xae, 0x7e, 0x4d,
+ 0xfe, 0xe9, 0x43, 0x79, 0x84, 0x8b, 0xf1, 0xd6, 0x7a, 0x97, 0xa2, 0xc6,
+ 0x08, 0xb3, 0xbe, 0xeb, 0xd5, 0xe6, 0x31, 0x1b, 0x51, 0xdb, 0x6e, 0xf9,
+ 0xd9, 0xe0, 0x99, 0xcb, 0x8a, 0x35, 0xd3, 0x53, 0x48, 0xbb, 0x80, 0xe3,
+ 0xde, 0xdd, 0xa4, 0xad, 0x5e, 0x97, 0x27, 0xb7, 0xd6, 0xff, 0x8d, 0xd8,
+ 0x50, 0x62, 0xb6, 0xe3, 0xd3, 0xc3, 0xf6, 0x24, 0xff, 0x8a, 0x2a, 0x3a,
+ 0x2d, 0xd4, 0x8e, 0x22, 0x27, 0xae, 0x00, 0x42, 0xce, 0x28, 0x2e, 0x07,
+ 0x47, 0x29, 0x14, 0x46, 0x38, 0xd2, 0x73, 0x0d, 0xad, 0xb9, 0xca, 0x1d,
+ 0x68, 0x13, 0x45, 0xd3, 0xc1, 0xcf, 0xe7, 0x2b, 0x77, 0x6b, 0x01, 0xeb,
+ 0xe6, 0x83, 0x28, 0x31, 0x47, 0x33, 0x74, 0xb0, 0xc1, 0x5d, 0x3c, 0xe4,
+ 0xb4, 0x05, 0xe8, 0xb0, 0x5b, 0xaa, 0xeb, 0x74, 0xc5, 0x98, 0xd8, 0xf3,
+ 0x1c, 0x83, 0x9b, 0x4b, 0xa1, 0x14, 0xfe, 0x66, 0x1e, 0x22, 0x7d, 0x82,
+ 0x43, 0x6c, 0xa8, 0x2b, 0x99, 0x97, 0xdd, 0xbc, 0x67, 0x2d, 0x26, 0x2b,
+ 0x98, 0xe5, 0xf1, 0x1f, 0x5a, 0x15, 0xd5, 0x1e, 0x13, 0x21, 0x4e, 0x2c,
+ 0x75, 0x78, 0x6d, 0x23, 0x3b, 0x66, 0xff, 0x95, 0x6b, 0xdf, 0x93, 0x36,
+ 0x9e, 0xab, 0x59, 0xc2, 0x18, 0x5e, 0x0e, 0x42, 0xa4, 0x13, 0x3c, 0x4f,
+ 0x91, 0x3f, 0x36, 0xd4, 0xa4, 0xa8, 0x40, 0x4b, 0xf9, 0xc9, 0xdb, 0xce,
+ 0x55, 0x17, 0xc5, 0x72, 0x49, 0xd5, 0x29, 0xb0, 0x7b, 0x15, 0x45, 0x9c,
+ 0x57, 0xf3, 0x38, 0x22, 0x0e, 0x92, 0x10, 0x69, 0xaf, 0xb5, 0x72, 0x22,
+ 0x05, 0x7d, 0xb6, 0xad, 0x6e, 0x85, 0x83, 0xca, 0x03, 0x18, 0x08, 0xab,
+ 0x13, 0xf3, 0xa1, 0x33, 0x6e, 0x7f, 0xae, 0xa8, 0x7f, 0x7e, 0x0e, 0x60,
+ 0xb6, 0x77, 0xea, 0xe1, 0x36, 0xe5, 0x47, 0xe7, 0x26, 0x19, 0xa1, 0x22,
+ 0x43, 0x23, 0x75, 0xf5, 0x97, 0xd1, 0x90, 0xe3, 0x25, 0xd5, 0x79, 0x65,
+ 0xb4, 0xf7, 0xa1, 0xd7, 0x90, 0xd0, 0x37, 0x02, 0xbc, 0xb9, 0xc4, 0x56,
+ 0x14, 0x2a, 0xf7, 0x10, 0xb8, 0x60, 0x8a, 0x1b, 0x03, 0xdc, 0x62, 0x57,
+ 0xb8, 0xa5, 0x3a, 0x4f, 0xfc, 0x7d, 0xbe, 0x48, 0x97, 0xe1, 0x6f, 0xb0,
+ 0xe6, 0x79, 0x7a, 0x6c, 0x08, 0x3a, 0x2a, 0xc6, 0x3b, 0x04, 0xbc, 0x3b,
+ 0x3b, 0xf6, 0x96, 0x42, 0xf8, 0x8f, 0xc5, 0x8c, 0xc2, 0x1f, 0x0a, 0x23,
+ 0xd0, 0x06, 0x48, 0x34, 0x81, 0x4b, 0x46, 0x16, 0x2c, 0x95, 0xb0, 0x18,
+ 0x19, 0x01, 0x54, 0x38, 0xea, 0x47, 0x1e, 0xbd, 0x9e, 0xf7, 0x5a, 0x9c,
+ 0x4b, 0xc0, 0x3f, 0x05, 0xa2, 0x34, 0xff, 0xf7, 0x40, 0xc3, 0xe9, 0xb8,
+ 0x2b, 0x99, 0xc1, 0xdf, 0x51, 0x2d, 0x5c, 0xe9, 0x78, 0x81, 0x51, 0x2f,
+ 0x4d, 0xfb, 0x69, 0x5f, 0x9c, 0x2a, 0x57, 0xe3, 0x7d, 0xb6, 0xa5, 0xeb,
+ 0x97, 0x0e, 0x23, 0x98, 0x9d, 0x78, 0xdb, 0x7b, 0x48, 0x60, 0xd7, 0xf3,
+ 0xa0, 0x67, 0x88, 0xaf, 0xa7, 0xf1, 0xf8, 0x57, 0xc8, 0x2a, 0x50, 0xc4,
+ 0x77, 0x80, 0xba, 0x37, 0xf6, 0x00, 0x16, 0xea, 0xbb, 0x4d, 0xef, 0x94,
+ 0xa2, 0x4c, 0x5c, 0x5b, 0x58, 0xc3, 0x74, 0x54, 0xff, 0x96, 0x1a, 0x2f,
+ 0xb4, 0x07, 0x3f, 0x1e, 0x27, 0x02, 0x3f, 0x3e, 0xf5, 0x0d, 0xe5, 0x39,
+ 0x87, 0xe8, 0x73, 0x61, 0xe7, 0x49, 0x98, 0x45, 0xad, 0xc6, 0x23, 0xa8,
+ 0xfb, 0x69, 0x0b, 0x81, 0x3d, 0x2f, 0x7d, 0x2d, 0xc4, 0xca, 0x36, 0x69,
+ 0xe4, 0x7a, 0x76, 0x23, 0x60, 0xd0, 0x9d, 0x3e, 0x49, 0x4e, 0x1e, 0x33,
+ 0x84, 0x08, 0xa0, 0xd3, 0x7a, 0x8b, 0x33, 0x82, 0xb3, 0x4a, 0x9b, 0x93,
+ 0xe9, 0x02, 0xa8, 0xb6, 0x25, 0x6a, 0x77, 0x1a, 0x53, 0x4d, 0x21, 0xe0,
+ 0x3a, 0xad, 0xf5, 0x7f, 0x2c, 0x7a, 0xcf, 0xef, 0x84, 0x7c, 0xd0, 0xef,
+ 0x5d, 0xb6, 0x3a, 0xea, 0x44, 0xe4, 0xe1, 0x19, 0x5a, 0xfe, 0xe8, 0xae,
+ 0xfb, 0x16, 0x0c, 0x4b, 0x8d, 0xb0, 0x57, 0xa7, 0xf1, 0x3c, 0x19, 0x67,
+ 0x37, 0x4a, 0x5b, 0x26, 0x8d, 0x68, 0x61, 0xe2, 0x95, 0x1b, 0xc7, 0x80,
+ 0xfb, 0x2e, 0x19, 0x44, 0xfb, 0x1f, 0x18, 0xa1, 0x6a, 0xc6, 0xc8, 0xc0,
+ 0xec, 0xa5, 0x02, 0x09, 0x8b, 0x3f, 0x9f, 0x9c, 0xe9, 0xfe, 0x23, 0x43,
+ 0x1f, 0x4c, 0xea, 0x0c, 0x21, 0x53, 0x02, 0x85, 0x08, 0x3f, 0x53, 0x82,
+ 0x94, 0xe1, 0xa5, 0x41, 0x25, 0x44, 0x6c, 0x5a, 0xe0, 0x8b, 0xe0, 0x83,
+ 0xff, 0xfa, 0x85, 0x4f, 0xac, 0xfc, 0xd8, 0x25, 0x2c, 0xc8, 0x2e, 0x88,
+ 0xc4, 0x58, 0xf3, 0x6d, 0xb3, 0xef, 0xe8, 0x53, 0x0e, 0xf8, 0x86, 0xd4,
+ 0xa4, 0xf5, 0x9c, 0x56, 0xbc, 0xb1, 0x69, 0x82, 0x50, 0x9f, 0x38, 0x2c,
+ 0x68, 0xd4, 0x94, 0xc4, 0x8c, 0x19, 0x41, 0xd2, 0x10, 0x2f, 0xd5, 0x63,
+ 0x66, 0x80, 0x5e, 0x7d, 0x14, 0xb5, 0x4a, 0xbc, 0x32, 0x61, 0x21, 0x83,
+ 0x82, 0x2c, 0x0f, 0xe2, 0x48, 0x10, 0xb8, 0x23, 0xd4, 0xf6, 0xbc, 0xa9,
+ 0xff, 0x7d, 0xaa, 0xcd, 0xc1, 0x66, 0x74, 0xa4, 0x44, 0x2b, 0xcd, 0x2d,
+ 0x12, 0x4c, 0x1e, 0x61, 0xf3, 0x07, 0x83, 0xeb, 0xe2, 0x50, 0x94, 0xf0,
+ 0xa8, 0x6e, 0xff, 0xe9, 0xf6, 0x0c, 0xfd, 0x54, 0x25, 0x14, 0xaa, 0xaf,
+ 0x1f, 0x3b, 0x29, 0x9d, 0xb5, 0xb3, 0x66, 0x92, 0xee, 0x99, 0xda, 0xd6,
+ 0xdf, 0xc7, 0x1a, 0x88, 0xfd, 0xa0, 0xe4, 0x86, 0x92, 0x10, 0xe9, 0x83,
+ 0xaf, 0xd4, 0xeb, 0x6a, 0xf6, 0x4d, 0x39, 0x47, 0x46, 0x90, 0xa6, 0xa1,
+ 0x92, 0x0b, 0x0b, 0x3b, 0xe6, 0xaa, 0x85, 0xdd, 0x86, 0x33, 0xb2, 0x98,
+ 0xf3, 0x67, 0x48, 0x34, 0xaa, 0x0b, 0x81, 0xd4, 0xc8, 0x31, 0x15, 0x8f,
+ 0x0e, 0x5b, 0xc0, 0x9d, 0xdf, 0xc7, 0x9e, 0x11, 0x54, 0x47, 0xd2, 0x2a,
+ 0x13, 0x21, 0x55, 0x88, 0x61, 0xed, 0xd5, 0x4f, 0x9a, 0x66, 0xb2, 0x86,
+ 0xa1, 0xe4, 0x96, 0x60, 0xb2, 0x65, 0xe1, 0x9e, 0x53, 0x96, 0x2f, 0xd0,
+ 0x91, 0x42, 0xb1, 0x2d, 0xcb, 0xf0, 0x55, 0xb5, 0xb5, 0xb0, 0x83, 0x30,
+ 0x8a, 0x22, 0xb4, 0x65, 0x54, 0xae, 0xe1, 0xde, 0x91, 0xdc, 0x48, 0x60,
+ 0x81, 0xe0, 0x24, 0x46, 0xdf, 0x19, 0xaa, 0x18, 0xde, 0xc9, 0x22, 0x31,
+ 0x50, 0x2e, 0xd1, 0x8e, 0x4e, 0x03, 0xc2, 0x7f, 0x19, 0x9f, 0x21, 0x52,
+ 0xba, 0xdd, 0x2a, 0xac, 0xbd, 0x92, 0x59, 0x45, 0x31, 0xde, 0x53, 0x1a,
+ 0x40, 0x79, 0x76, 0x83, 0xfd, 0x5d, 0x8f, 0x4c, 0xd6, 0xfc, 0x92, 0x6a,
+ 0x28, 0xb9, 0x20, 0x32, 0xae, 0xa6, 0xc6, 0x0e, 0x14, 0xd8, 0xea, 0x01,
+ 0x1c, 0xf4, 0x17, 0x23, 0xc4, 0x37, 0x23, 0x33, 0x6c, 0xc1, 0x7e, 0x80,
+ 0xe3, 0x20, 0xde, 0x1b, 0x88, 0xb1, 0x14, 0xa9, 0xe3, 0x7c, 0xae, 0xb1,
+ 0xf6, 0xc4, 0xeb, 0xa2, 0xf1, 0x59, 0xcb, 0xb0, 0xf0, 0x26, 0x68, 0xd5,
+ 0x6d, 0x9b, 0x98, 0xa4, 0x8f, 0xb0, 0xc4, 0x2e, 0xf7, 0xca, 0x60, 0x25,
+ 0xcc, 0xd5, 0x9c, 0xfa, 0x98, 0xca, 0x6d, 0x13, 0x21, 0x3b, 0x0e, 0x36,
+ 0xd7, 0x68, 0xb4, 0xd3, 0x05, 0x3f, 0xcd, 0x78, 0x63, 0x41, 0x22, 0x9e,
+ 0xfd, 0x09, 0xfc, 0xcc, 0xce, 0x6e, 0xef, 0x9e, 0x1f, 0xb9, 0x6a, 0x31,
+ 0xf8, 0xe0, 0xdc, 0xf5, 0x51, 0xae, 0x9f, 0x81, 0xfa, 0xe4, 0x7a, 0x51,
+ 0x26, 0xce, 0x87, 0xa3, 0x96, 0xca, 0x10, 0x43, 0xfa, 0x4a, 0xbf, 0x95,
+ 0xdd, 0x15, 0xb2, 0x9c, 0x9a, 0xd4, 0x59, 0xe1, 0xd8, 0x69, 0xb5, 0xc1,
+ 0x8c, 0x42, 0x46, 0x06, 0xc2, 0x3e, 0x31, 0xf3, 0x29, 0xe0, 0x5d, 0x04,
+ 0x23, 0x25, 0x42, 0x89, 0xda, 0xd1, 0x49, 0x8a, 0xed, 0x63, 0xa1, 0x0c,
+ 0x51, 0xb3, 0xe8, 0x9b, 0x55, 0x3e, 0xc3, 0x40, 0x20, 0x96, 0x2d, 0xbf,
+ 0x1e, 0x5c, 0x56, 0x37, 0xda, 0x15, 0x8a, 0x6e, 0x20, 0xac, 0x10, 0x1f,
+ 0x8c, 0x87, 0xfa, 0x34, 0xc3, 0x57, 0xfb, 0xec, 0xfc, 0x6b, 0x62, 0xf9,
+ 0x90, 0x58, 0x39, 0xe6, 0x8d, 0xd4, 0xd0, 0x72, 0xdd, 0x5a, 0x00, 0xed,
+ 0xf1, 0x9f, 0x61, 0x24, 0xb4, 0xd2, 0x60, 0x41, 0xfc, 0x0f, 0xff, 0xf9,
+ 0xfe, 0xc6, 0x29, 0xbe, 0x05, 0x0a, 0xcb, 0x4f, 0xea, 0x0a, 0x2c, 0x42,
+ 0x0c, 0x42, 0xc4, 0x64, 0x49, 0xba, 0xd5, 0x50, 0x11, 0x3d, 0xc4, 0x6e,
+ 0x02, 0xfe, 0xc5, 0x0e, 0x47, 0x1e, 0x7f, 0x74, 0xef, 0x76, 0x20, 0x8d,
+ 0xd6, 0xe5, 0x71, 0xe4, 0xd7, 0x60, 0x89, 0xc2, 0xf6, 0xa6, 0xa0, 0xfc,
+ 0x0a, 0x29, 0x95, 0xf8, 0x66, 0x31, 0x7d, 0x0e, 0xde, 0x29, 0x74, 0x29,
+ 0xe3, 0x9c, 0x0a, 0xb3, 0x18, 0x80, 0x8b, 0x64, 0xc4, 0x1f, 0x47, 0x50,
+ 0x88, 0x26, 0x13, 0xaa, 0x2d, 0x59, 0x61, 0x17, 0x0e, 0x6f, 0xd9, 0x6b,
+ 0x69, 0xb9, 0x60, 0x50, 0xc4, 0x74, 0xa6, 0x17, 0x9b, 0x3d, 0x19, 0x0d,
+ 0xe9, 0x24, 0x20, 0xe9, 0xb5, 0x03, 0x13, 0xb0, 0x41, 0xbb, 0x97, 0xcc,
+ 0xe3, 0x29, 0xc1, 0xaf, 0x40, 0xa9, 0xed, 0x2a, 0x4c, 0x09, 0x40, 0xa3,
+ 0x20, 0xe7, 0x59, 0x81, 0x00, 0x21, 0x00, 0x84, 0x00, 0x80, 0x49, 0x7a,
+ 0x00, 0x85, 0x43, 0x00, 0xa4, 0x80, 0x7f, 0x05, 0xf2, 0xe1, 0x8f, 0x79,
+ 0xb0, 0x7f, 0x7b, 0xf2, 0x43, 0xcb, 0x2b, 0x99, 0x9f, 0x1a, 0x7d, 0x77,
+ 0x95, 0xf7, 0xae, 0xde, 0x35, 0x2d, 0x7f, 0x41, 0x7e, 0x67, 0xf2, 0x1f,
+ 0xd5, 0x3b, 0xbb, 0x7e, 0xd4, 0xf7, 0xea, 0x3d, 0x2f, 0xf2, 0x1f, 0xce,
+ 0x6e, 0xe8, 0x61, 0xff, 0x51, 0xe8, 0xbf, 0xc6, 0xb1, 0x21, 0xd2, 0xfc,
+ 0x5e, 0x5f, 0x4f, 0xc7, 0xf0, 0xff, 0xe2, 0x7f, 0x17, 0xfb, 0x9f, 0xf5,
+ 0x5f, 0xa3, 0xf1, 0xff, 0xc2, 0x7e, 0x2f, 0xf6, 0xbf, 0xe6, 0xbf, 0x26,
+ 0x67, 0xfc, 0x5f, 0x8b, 0xf3, 0xfe, 0x4f, 0xc9, 0x99, 0xff, 0xe0, 0xbf,
+ 0xca, 0xfd, 0x1f, 0xf2, 0xbf, 0xf0, 0xd9, 0x9f, 0xec, 0x8f, 0xd9, 0xf0,
+ 0xb3, 0x47, 0xaa, 0xb1, 0x44, 0xd3, 0x72, 0xf7, 0xaa, 0xf6, 0xbf, 0xb6,
+ 0x7f, 0xd7, 0xff, 0x47, 0xfc, 0x3f, 0xfa, 0x0f, 0xb8, 0x4f, 0x87, 0xf8,
+ 0xbd, 0x27, 0xa7, 0xf3, 0x5f, 0xfa, 0xbf, 0x17, 0xda, 0x1f, 0xf0, 0x9f,
+ 0x0f, 0xf3, 0x6d, 0x83, 0xf6, 0xaf, 0xdb, 0x7f, 0xf0, 0x9e, 0x93, 0x6a,
+ 0xff, 0xc8, 0xff, 0x5f, 0xe2, 0x7f, 0xc9, 0xfc, 0x3f, 0xcd, 0xae, 0x47,
+ 0xe2, 0xfe, 0xcf, 0xf7, 0xbf, 0xde, 0xf4, 0x44, 0x45, 0x3d, 0xef, 0x63,
+ 0xf6, 0xfd, 0x23, 0xdb, 0xfa, 0xee, 0x9d, 0xfb, 0x97, 0xb4, 0xf6, 0x8b,
+ 0x23, 0xf8, 0xdf, 0xdc, 0xba, 0xd7, 0xae, 0x62, 0x73, 0xf5, 0xae, 0xa9,
+ 0xeb, 0x98, 0xa2, 0x3d, 0x47, 0x98, 0x67, 0xae, 0x66, 0xfe, 0xa3, 0xf6,
+ 0xcf, 0x63, 0xfd, 0x89, 0xfc, 0xe3, 0x03, 0xb7, 0xaf, 0x6c, 0x8a, 0x59,
+ 0x8d, 0xfb, 0xa3, 0xf9, 0xc6, 0x18, 0x3f, 0x9c, 0xf2, 0xbb, 0xf5, 0xdb,
+ 0x98, 0x53, 0x7c, 0xf8, 0xc6, 0x1c, 0x2c, 0xef, 0x6f, 0xe5, 0xfc, 0xbf,
+ 0xdb, 0xfe, 0x4f, 0xfd, 0x0f, 0xf7, 0xfe, 0x5f, 0xcf, 0xf2, 0x7b, 0xcb,
+ 0xf8, 0x3f, 0x17, 0xd2, 0x7f, 0x7f, 0xe6, 0xd4, 0x5a, 0xc1, 0xbb, 0x2e,
+ 0xb4, 0xde, 0xca, 0xff, 0x8c, 0x79, 0x6b, 0x7c, 0x6f, 0x63, 0xff, 0x5a,
+ 0xff, 0x09, 0xf5, 0x7f, 0xd9, 0x5f, 0xd9, 0x5a, 0x53, 0xf9, 0xcf, 0x75,
+ 0xd8, 0x39, 0x54, 0xfd, 0x53, 0xea, 0xf7, 0xd7, 0x54, 0xac, 0x17, 0xb3,
+ 0x7a, 0xa1, 0xff, 0xf9, 0x3c, 0xc0, 0x63, 0xff, 0x92, 0x79, 0x84, 0x9f,
+ 0xe4, 0x3e, 0x5b, 0x6a, 0xef, 0xc9, 0xfc, 0xf2, 0x71, 0x60, 0x00, 0x00,
+ 0x00, 0x42, 0x6e, 0x7a, 0xe7, 0x9c, 0xa9, 0x13, 0xb3, 0xbc, 0xf2, 0x5b,
+ 0xb9, 0xfb, 0x8a, 0x48, 0x83, 0x58, 0xe7, 0x1f, 0xe0, 0xb0, 0x46, 0xe8,
+ 0x6c, 0xd0, 0x67, 0x48, 0xa0, 0xb7, 0x87, 0x8e, 0xa2, 0xae, 0x44, 0x15,
+ 0x93, 0xab, 0x6b, 0x61, 0x52, 0xe0, 0x7f, 0x98, 0xb7, 0x29, 0xa5, 0x17,
+ 0x77, 0x48, 0x57, 0xf1, 0x2c, 0x73, 0x6f, 0xd3, 0x9e, 0x0e, 0xaa, 0x50,
+ 0x47, 0x2c, 0x13, 0x1a, 0xa4, 0x59, 0x2d, 0xa9, 0xe3, 0xff, 0xf6, 0xbf,
+ 0x79, 0x09, 0xa1, 0xa8, 0xdd, 0x57, 0x55, 0x26, 0x4c, 0x1d, 0xa7, 0x9c,
+ 0xd6, 0xfb, 0xef, 0xc9, 0x5b, 0x80, 0xb6, 0xe4, 0x49, 0xb1, 0xe6, 0x71,
+ 0x5e, 0xe0, 0x12, 0x65, 0x7c, 0x11, 0x2d, 0xf8, 0xb2, 0xa8, 0x03, 0xd3,
+ 0x66, 0xa4, 0x94, 0x63, 0x9d, 0x12, 0x75, 0x7e, 0xd3, 0xef, 0x2a, 0xb1,
+ 0x4f, 0xc7, 0x56, 0x35, 0x9e, 0xae, 0x91, 0x5d, 0xa7, 0x99, 0x66, 0x21,
+ 0x1d, 0xdb, 0xf9, 0x9e, 0xf3, 0xfd, 0x70, 0x3b, 0x2f, 0xe5, 0xa8, 0xf1,
+ 0xc3, 0x0c, 0x44, 0xbc, 0x44, 0xef, 0x2e, 0x4d, 0x9b, 0x0e, 0xaf, 0xb2,
+ 0x7b, 0xea, 0xb2, 0x28, 0xc2, 0x92, 0xdd, 0xce, 0x7b, 0x2f, 0x90, 0xdb,
+ 0xf5, 0xa5, 0xdd, 0x00, 0x7e, 0x53, 0x94, 0x2b, 0x7d, 0xb7, 0x61, 0x71,
+ 0x17, 0x54, 0x05, 0x75, 0x6d, 0x99, 0x47, 0x43, 0xa3, 0x63, 0x25, 0xe4,
+ 0x35, 0x27, 0x1d, 0xfc, 0xb3, 0x46, 0xd9, 0xf4, 0x72, 0x18, 0x83, 0x24,
+ 0x61, 0xc1, 0x7f, 0xcf, 0x28, 0x2a, 0x13, 0x75, 0x73, 0x54, 0xb2, 0xfb,
+ 0xe5, 0xa2, 0xb0, 0xad, 0xe2, 0x83, 0x09, 0xc5, 0xc4, 0x98, 0xd6, 0xe6,
+ 0xb4, 0xc6, 0xc4, 0xe5, 0xdf, 0x57, 0x71, 0x41, 0xb7, 0xaa, 0xfc, 0xd2,
+ 0x73, 0xe1, 0xb8, 0xf6, 0x12, 0x81, 0x81, 0x69, 0x14, 0x55, 0x2a, 0xf5,
+ 0xb6, 0xc4, 0x56, 0x10, 0x9b, 0x35, 0x10, 0xf7, 0x8f, 0xfa, 0xd5, 0xd3,
+ 0x51, 0x5e, 0x10, 0x32, 0xee, 0x32, 0x92, 0x40, 0xc7, 0x5d, 0x2b, 0xc9,
+ 0xea, 0x14, 0x30, 0xec, 0xae, 0x1c, 0x0a, 0x79, 0xfb, 0x1b, 0xca, 0x91,
+ 0xab, 0x58, 0x83, 0x54, 0x7f, 0x64, 0x24, 0x6d, 0xae, 0x63, 0x88, 0x9a,
+ 0x6d, 0x09, 0x63, 0xb6, 0x90, 0xb4, 0x99, 0xa0, 0xa4, 0x72, 0x0b, 0xd1,
+ 0x81, 0xa3, 0x07, 0x3e, 0x33, 0xde, 0xf6, 0x27, 0x36, 0xee, 0x40, 0x91,
+ 0x82, 0x87, 0x5c, 0x35, 0x1d, 0x3e, 0xb9, 0xbc, 0xcd, 0x03, 0x2d, 0x32,
+ 0x10, 0xba, 0xbf, 0x10, 0x6d, 0x42, 0x68, 0x69, 0x3a, 0x6a, 0x54, 0xc7,
+ 0xcb, 0xdc, 0x5d, 0xe3, 0x29, 0xce, 0x1d, 0x30, 0xf2, 0x87, 0x54, 0xe5,
+ 0xc7, 0x60, 0x13, 0x76, 0x89, 0xb5, 0xc1, 0x00, 0x1c, 0x59, 0x93, 0x5e,
+ 0x3b, 0x9d, 0xe2, 0x9e, 0xda, 0x39, 0xf1, 0x20, 0x19, 0x9d, 0xd6, 0x1a,
+ 0xeb, 0xf6, 0x1d, 0xf9, 0x9c, 0xf7, 0xe9, 0x02, 0xa0, 0x6a, 0xf2, 0x79,
+ 0xee, 0xe1, 0xc9, 0xdc, 0x1a, 0x7a, 0x9b, 0xbc, 0xec, 0xf1, 0x2e, 0xb4,
+ 0x67, 0xe9, 0xa3, 0xf3, 0x61, 0x51, 0xce, 0xd4, 0xf9, 0xaf, 0x7d, 0x33,
+ 0xb6, 0xd7, 0xc1, 0x8f, 0xbc, 0xba, 0x91, 0xfa, 0xa6, 0xa1, 0x31, 0x1c,
+ 0x63, 0x71, 0x69, 0x81, 0x16, 0xcb, 0x8a, 0x3e, 0x18, 0x04, 0xf9, 0x7d,
+ 0x13, 0xcf, 0x84, 0x84, 0xfe, 0x8f, 0xe4, 0x8e, 0x60, 0xad, 0x6e, 0xfe,
+ 0xf7, 0xc5, 0x60, 0xdb, 0x08, 0xc2, 0xc4, 0xd5, 0xfe, 0x7c, 0x40, 0xed,
+ 0x41, 0xc8, 0x61, 0x30, 0x53, 0xa6, 0xb9, 0x26, 0x40, 0x67, 0x58, 0x64,
+ 0xbe, 0x3c, 0xd4, 0x45, 0x72, 0x71, 0x2b, 0x20, 0x03, 0x3e, 0xb6, 0x48,
+ 0x26, 0x23, 0x4d, 0xb7, 0xab, 0xed, 0x79, 0xc8, 0xbb, 0x01, 0x83, 0x34,
+ 0xc5, 0x3e, 0x89, 0x8f, 0x7a, 0x49, 0x64, 0x4e, 0xf2, 0xed, 0x1f, 0x55,
+ 0xb8, 0x45, 0x50, 0xe9, 0x07, 0x72, 0xbd, 0x9b, 0xab, 0x54, 0x86, 0xfd,
+ 0xf4, 0x9e, 0x5a, 0xfb, 0x29, 0x09, 0x3d, 0x95, 0x91, 0x9c, 0x1d, 0x3e,
+ 0x9a, 0xfa, 0xad, 0x27, 0x97, 0x53, 0x78, 0x61, 0x88, 0xaf, 0x45, 0x88,
+ 0x1a, 0x59, 0x36, 0x59, 0x92, 0x17, 0x0e, 0x11, 0x7c, 0x23, 0x2e, 0xb0,
+ 0xa8, 0xd5, 0x9b, 0xb0, 0xfc, 0x2c, 0xc3, 0xf8, 0x8a, 0x15, 0x90, 0x7a,
+ 0xbd, 0xb4, 0xc4, 0x22, 0x70, 0x04, 0x01, 0xd5, 0xc7, 0x42, 0x34, 0xd0,
+ 0x2a, 0x55, 0x65, 0xcf, 0x7a, 0x8f, 0x33, 0xb9, 0x40, 0xe0, 0xb9, 0x46,
+ 0x47, 0x4e, 0x24, 0x16, 0x32, 0x54, 0x5a, 0x47, 0xa5, 0xeb, 0xbc, 0x42,
+ 0xee, 0x47, 0xd1, 0x2e, 0x0b, 0xd3, 0x5b, 0x29, 0x05, 0x7a, 0x0a, 0xeb,
+ 0x91, 0x69, 0x34, 0xec, 0xee, 0x66, 0x52, 0x37, 0xc6, 0xaf, 0x61, 0xd0,
+ 0x7b, 0xa7, 0x55, 0x62, 0x51, 0x57, 0x76, 0xd1, 0x7c, 0x4a, 0x83, 0x85,
+ 0x1d, 0xab, 0x3a, 0x8b, 0x2b, 0x33, 0x2c, 0x4b, 0x8f, 0x59, 0x20, 0xe4,
+ 0x58, 0x57, 0xdb, 0x85, 0x96, 0x51, 0x25, 0x4b, 0xb3, 0xa3, 0xcf, 0x6f,
+ 0xbc, 0x59, 0x1c, 0x99, 0xe5, 0x2f, 0xb9, 0x13, 0x20, 0x77, 0x20, 0xab,
+ 0x3e, 0x4a, 0xd8, 0x13, 0x47, 0x5f, 0xb2, 0x64, 0x17, 0xb7, 0xbd, 0x2e,
+ 0x04, 0x30, 0x01, 0x25, 0x32, 0xda, 0x94, 0x38, 0xf4, 0xfd, 0x64, 0xb7,
+ 0x57, 0x9a, 0xf8, 0xa4, 0xfd, 0x36, 0x5f, 0x5b, 0x8f, 0x32, 0x24, 0xeb,
+ 0x81, 0x12, 0xb4, 0xb3, 0xc5, 0x14, 0x7c, 0xce, 0x3a, 0x6d, 0xb2, 0x81,
+ 0x23, 0x3a, 0x78, 0x78, 0x17, 0xa1, 0x2c, 0xc3, 0xb6, 0xd2, 0x68, 0x55,
+ 0x1f, 0x48, 0x12, 0x94, 0xb5, 0x84, 0xee, 0x9e, 0x5b, 0x8c, 0xb0, 0x66,
+ 0xdf, 0x88, 0xf9, 0x8f, 0x75, 0xac, 0x93, 0xd4, 0x26, 0xa5, 0x61, 0x81,
+ 0xa3, 0x1a, 0x81, 0x9b, 0xac, 0x9d, 0x14, 0x1c, 0xa5, 0xbc, 0x13, 0xe2,
+ 0xd4, 0x7c, 0xc9, 0x5a, 0x00, 0x81, 0x66, 0xe0, 0xfc, 0x1c, 0xc7, 0x52,
+ 0x53, 0x32, 0xe9, 0x52, 0x80, 0x8b, 0x13, 0x91, 0x4e, 0x69, 0x6c, 0xda,
+ 0x66, 0xe3, 0x18, 0xe9, 0x84, 0x4e, 0x1e, 0x07, 0x02, 0x18, 0x53, 0x11,
+ 0x5d, 0x8e, 0x9a, 0xf2, 0x12, 0x35, 0xa6, 0x93, 0x94, 0xce, 0x5f, 0x8e,
+ 0x99, 0x33, 0x12, 0x26, 0xc1, 0x8a, 0x40, 0xac, 0xc5, 0x7e, 0x12, 0xde,
+ 0x6a, 0xa2, 0x01, 0x6e, 0xa0, 0x75, 0xde, 0x75, 0x14, 0x5f, 0xfa, 0xe4,
+ 0xef, 0x23, 0xbc, 0xc3, 0x63, 0xc8, 0x12, 0x07, 0x6a, 0xc2, 0x5d, 0x76,
+ 0xad, 0x99, 0x0e, 0xe1, 0xf4, 0xfc, 0xa0, 0x3f, 0x72, 0xff, 0xf1, 0x48,
+ 0x58, 0x0a, 0x7d, 0x2a, 0x8c, 0x3d, 0xab, 0x45, 0xc2, 0x81, 0xf3, 0x67,
+ 0x4d, 0x8f, 0x29, 0x6d, 0x17, 0x88, 0x1f, 0x06, 0x87, 0xba, 0x59, 0x45,
+ 0xd4, 0x6b, 0x0f, 0x62, 0x8c, 0xe4, 0xf0, 0x82, 0x61, 0xe4, 0xf9, 0xcb,
+ 0xc5, 0x89, 0x75, 0x5e, 0x71, 0x14, 0x0b, 0x93, 0xdc, 0x50, 0xdc, 0x08,
+ 0xb9, 0xdc, 0x7b, 0x32, 0xc0, 0x67, 0x00, 0x6e, 0xb9, 0xc4, 0x6e, 0x34,
+ 0xa2, 0xc2, 0x9f, 0xa1, 0x4f, 0x88, 0x77, 0x00, 0x40, 0x14, 0x9c, 0xe0,
+ 0xe6, 0x9f, 0x4b, 0x62, 0x6d, 0x8c, 0x94, 0xcb, 0x29, 0x7a, 0xe2, 0x24,
+ 0x4c, 0x0d, 0x31, 0xeb, 0x70, 0x97, 0xcf, 0x06, 0xd8, 0x4f, 0xd2, 0xed,
+ 0x42, 0xc5, 0x6c, 0x51, 0x01, 0x6d, 0x27, 0x9d, 0xd2, 0x71, 0x86, 0xcf,
+ 0x80, 0xf7, 0xba, 0xb7, 0x43, 0xb5, 0xc5, 0xdf, 0x39, 0x92, 0x7b, 0xcc,
+ 0xa0, 0x2d, 0xc8, 0x57, 0x2c, 0x3b, 0xb1, 0xb2, 0x0d, 0x6e, 0xef, 0xfd,
+ 0x77, 0x8a, 0x4b, 0xb7, 0x77, 0x96, 0x22, 0x90, 0xa9, 0x71, 0x3c, 0x2b,
+ 0x2b, 0x85, 0xb3, 0x89, 0x1a, 0xb6, 0xd7, 0x43, 0x04, 0xfa, 0xda, 0xbe,
+ 0x3f, 0x47, 0x07, 0x9b, 0xd3, 0xaf, 0xa4, 0xee, 0xd5, 0xd3, 0xc4, 0xe0,
+ 0x4a, 0x24, 0xbc, 0x78, 0xbd, 0x88, 0x55, 0xfe, 0x45, 0xba, 0x47, 0xeb,
+ 0xcc, 0x61, 0x71, 0x21, 0xd5, 0x9b, 0x4a, 0xc0, 0x1a, 0x7c, 0xf9, 0xd5,
+ 0x37, 0xf8, 0x9f, 0x79, 0x40, 0xa0, 0x10, 0xc8, 0x3e, 0x75, 0xfe, 0x99,
+ 0xef, 0xec, 0xeb, 0x53, 0x87, 0x8a, 0xf4, 0x95, 0x53, 0xb8, 0x4b, 0x01,
+ 0xa0, 0x66, 0x46, 0x9c, 0x4a, 0x95, 0x95, 0xa9, 0x44, 0x45, 0xec, 0x02,
+ 0xd2, 0xd8, 0x6b, 0x71, 0x8a, 0xb2, 0x21, 0x70, 0xe2, 0xa1, 0x25, 0xd6,
+ 0x11, 0x3a, 0x29, 0x01, 0x5b, 0x58, 0x0d, 0x96, 0x6e, 0xe8, 0xa8, 0x82,
+ 0xb5, 0x95, 0xa0, 0xab, 0xc1, 0xea, 0x7d, 0x39, 0x02, 0x32, 0x8c, 0x68,
+ 0x54, 0x10, 0x3f, 0x2d, 0x01, 0x2f, 0x93, 0x26, 0xce, 0x35, 0x0d, 0xfb,
+ 0x9a, 0x6e, 0xd4, 0xf6, 0xb8, 0x01, 0x8a, 0x79, 0x21, 0xfe, 0x0e, 0x3f,
+ 0x03, 0x66, 0x18, 0xd1, 0x16, 0x9e, 0xcc, 0xbd, 0xde, 0xcf, 0x8b, 0x7c,
+ 0x36, 0xca, 0x4d, 0x7a, 0x84, 0x4d, 0x7f, 0xdf, 0xb1, 0x8f, 0xaf, 0x7d,
+ 0x95, 0x60, 0x7b, 0xa5, 0xce, 0x18, 0x18, 0x9a, 0x47, 0xa1, 0x6e, 0x22,
+ 0x39, 0xb9, 0x51, 0x9b, 0xab, 0x92, 0xfd, 0x2c, 0x28, 0x21, 0x96, 0x56,
+ 0x06, 0x57, 0xf2, 0x7b, 0x71, 0xb8, 0x0b, 0x16, 0x23, 0xa4, 0x1b, 0x22,
+ 0x47, 0xff, 0x47, 0x03, 0x61, 0x1c, 0xbf, 0x2a, 0xa3, 0x86, 0x0a, 0x2b,
+ 0x6f, 0x60, 0x71, 0x7d, 0xb1, 0xe1, 0x76, 0x5f, 0xe0, 0x51, 0x28, 0xeb,
+ 0x08, 0x1d, 0xea, 0x6d, 0x57, 0xb8, 0x35, 0xe4, 0x29, 0x39, 0xd4, 0xb5,
+ 0xde, 0x63, 0xde, 0x45, 0xe0, 0xd1, 0x72, 0xe4, 0x69, 0x78, 0xb0, 0xa5,
+ 0x83, 0x61, 0x54, 0x23, 0xb7, 0xf8, 0x26, 0xf7, 0xc8, 0x4a, 0xfd, 0xe1,
+ 0xb6, 0x75, 0x63, 0x2e, 0x80, 0xe7, 0x9a, 0x71, 0xb8, 0x92, 0x79, 0x1d,
+ 0xac, 0xfb, 0x15, 0xfe, 0x67, 0x0a, 0xed, 0xde, 0x24, 0x79, 0x16, 0xd3,
+ 0x5c, 0x00, 0xa1, 0x7c, 0x85, 0xad, 0x0d, 0x10, 0x5d, 0xe4, 0xbf, 0x6e,
+ 0x76, 0x6e, 0x19, 0xd2, 0x46, 0xb9, 0x73, 0xab, 0x35, 0x14, 0xf6, 0xc7,
+ 0x86, 0x78, 0x0e, 0x88, 0x47, 0x6e, 0x4e, 0x75, 0xf4, 0x0f, 0x1b, 0x5b,
+ 0x6b, 0xce, 0x44, 0xd0, 0x87, 0xd0, 0x8e, 0xd5, 0x6e, 0x37, 0x08, 0xc9,
+ 0xb1, 0x37, 0xff, 0xb0, 0xa9, 0xaa, 0xf1, 0x9d, 0x51, 0xb9, 0x6d, 0x15,
+ 0x31, 0x34, 0x7a, 0x8a, 0x6d, 0xf2, 0xfa, 0x43, 0xb9, 0xed, 0xfe, 0x00,
+ 0x63, 0xb5, 0x01, 0x7f, 0xf1, 0x0b, 0x54, 0x99, 0xd7, 0xd0, 0x34, 0xbb,
+ 0x07, 0x17, 0xe1, 0xca, 0x8b, 0xda, 0x26, 0x4d, 0xd6, 0xe4, 0x98, 0xfc,
+ 0x22, 0x94, 0xf1, 0xa1, 0x1c, 0x11, 0xf4, 0x30, 0xe0, 0x0c, 0xf6, 0x7a,
+ 0x2e, 0x7f, 0x1c, 0x6c, 0xe0, 0x07, 0xb8, 0x90, 0x2d, 0x7e, 0xea, 0x35,
+ 0xd8, 0xa9, 0xc6, 0x89, 0xa0, 0x39, 0xd0, 0x66, 0x41, 0xcf, 0x6f, 0x3f,
+ 0x77, 0x88, 0x8a, 0xb5, 0x71, 0xb6, 0x68, 0x51, 0xdf, 0xa9, 0x5b, 0x96,
+ 0x28, 0x14, 0x81, 0x4e, 0x36, 0x6b, 0x16, 0xa3, 0xb7, 0x0d, 0x20, 0xad,
+ 0x22, 0x92, 0xaf, 0x4a, 0x57, 0x0f, 0xcb, 0x27, 0xc4, 0x8f, 0xb7, 0x84,
+ 0x00, 0x2b, 0xb9, 0x07, 0xee, 0x88, 0xf7, 0xa0, 0x40, 0x52, 0xfd, 0xcb,
+ 0x0c, 0x85, 0xec, 0x52, 0x38, 0x67, 0xf4, 0x63, 0x52, 0x2a, 0xe7, 0x6f,
+ 0x19, 0x65, 0xdd, 0xa4, 0x45, 0x37, 0xbf, 0xe1, 0xa4, 0x7c, 0xed, 0xfa,
+ 0x20, 0x2c, 0xa2, 0x9f, 0x48, 0xfc, 0xc2, 0xae, 0x24, 0x5d, 0xad, 0x93,
+ 0xbe, 0x3e, 0xdf, 0x25, 0xd0, 0x11, 0xa3, 0xf6, 0xb1, 0x2e, 0x26, 0x66,
+ 0xd8, 0x88, 0x63, 0x9e, 0x84, 0x40, 0xfc, 0x5b, 0x47, 0x53, 0xcd, 0xc2,
+ 0xff, 0xa4, 0xfd, 0x5d, 0x8c, 0xdb, 0xad, 0xe2, 0x32, 0x79, 0x65, 0xe1,
+ 0xeb, 0x5a, 0x74, 0xc5, 0xc1, 0x5e, 0x50, 0xb1, 0x4f, 0xab, 0xec, 0x0a,
+ 0xd2, 0x2e, 0x62, 0x58, 0x5b, 0xfd, 0x6f, 0xed, 0x4e, 0x10, 0x95, 0xb3,
+ 0x97, 0x00, 0x79, 0xd9, 0xe5, 0x56, 0x11, 0xea, 0x85, 0x8f, 0xc0, 0x26,
+ 0x2c, 0x8d, 0x0c, 0x71, 0x65, 0x02, 0x55, 0xe9, 0xa9, 0x81, 0x24, 0x08,
+ 0x92, 0xfc, 0x48, 0x5b, 0x52, 0xaf, 0xf3, 0xa2, 0xc6, 0x46, 0xe1, 0x82,
+ 0xb6, 0xc1, 0x13, 0xa5, 0x0a, 0xe7, 0xdb, 0xa8, 0x5e, 0xf0, 0x2d, 0x3d,
+ 0x1d, 0x65, 0xd9, 0x67, 0xc0, 0x3a, 0xba, 0xf2, 0x40, 0x4f, 0xe6, 0x46,
+ 0x05, 0x5d, 0x1a, 0x32, 0x5d, 0xb1, 0x75, 0xdb, 0x05, 0x89, 0x5e, 0xad,
+ 0xe7, 0x38, 0x9a, 0xc3, 0x6a, 0x40, 0x08, 0xb4, 0x76, 0x82, 0xe7, 0xdb,
+ 0x68, 0x0f, 0xb4, 0x8a, 0x25, 0x99, 0x40, 0x8e, 0x39, 0x73, 0x40, 0x88,
+ 0x28, 0x06, 0x74, 0x72, 0xcd, 0x24, 0x5e, 0x05, 0x88, 0xda, 0xdd, 0xb6,
+ 0x80, 0x0d, 0xb0, 0x92, 0x52, 0x8b, 0x36, 0xec, 0x6a, 0x54, 0x32, 0xd9,
+ 0xad, 0x96, 0xd5, 0x19, 0x45, 0x05, 0x50, 0x8d, 0x64, 0x51, 0x79, 0xa5,
+ 0x1f, 0x0f, 0x2e, 0xc1, 0x1b, 0xca, 0x0a, 0x13, 0x43, 0x3c, 0x4b, 0xd2,
+ 0x52, 0xa2, 0x99, 0x53, 0xb4, 0xdd, 0x96, 0xb9, 0xf0, 0x8c, 0x25, 0x63,
+ 0x6e, 0x4f, 0x4e, 0x48, 0xa6, 0x51, 0x8e, 0xc9, 0x8e, 0x23, 0x98, 0x3f,
+ 0xb2, 0x3f, 0x1b, 0x39, 0x05, 0xc2, 0x3a, 0x0e, 0x83, 0xb5, 0x0f, 0x7e,
+ 0xc2, 0xcd, 0x18, 0x50, 0x1b, 0x29, 0x64, 0xd2, 0x4d, 0x91, 0x44, 0x02,
+ 0xb3, 0xb3, 0x9a, 0x95, 0xc7, 0xeb, 0x68, 0xd6, 0xc8, 0x99, 0xe5, 0xf6,
+ 0xb2, 0xba, 0xfd, 0x09, 0x20, 0xfe, 0x8d, 0xa2, 0x43, 0xa2, 0x3b, 0x85,
+ 0x01, 0x0c, 0x3b, 0x51, 0xa2, 0x6d, 0x06, 0xf6, 0xd2, 0x0d, 0x55, 0x48,
+ 0x9d, 0x38, 0x0e, 0xcc, 0x0d, 0x4b, 0xd4, 0x3a, 0x1f, 0x49, 0x9a, 0xa9,
+ 0xa3, 0x02, 0x7e, 0xaa, 0x9f, 0x80, 0x95, 0xd6, 0x55, 0x21, 0x64, 0x95,
+ 0x57, 0x95, 0x99, 0xf9, 0xa6, 0x65, 0x6e, 0x6e, 0x0a, 0x7a, 0xd1, 0xcb,
+ 0x3e, 0xdf, 0xd8, 0x48, 0xcc, 0x31, 0x2a, 0x05, 0xf0, 0xaf, 0xa5, 0x42,
+ 0xc6, 0x93, 0x45, 0xe5, 0x1e, 0x50, 0xab, 0xb8, 0xf5, 0x8a, 0x5d, 0x53,
+ 0x49, 0xde, 0xcd, 0xa4, 0x42, 0x7a, 0x96, 0xae, 0xfe, 0xbf, 0xf2, 0xc7,
+ 0x9f, 0x56, 0xda, 0x68, 0xb9, 0x65, 0x5c, 0xfc, 0xcc, 0x23, 0x72, 0x3c,
+ 0xfc, 0x51, 0xb9, 0xc7, 0xe7, 0x0e, 0x48, 0xd2, 0x63, 0x44, 0xe6, 0xba,
+ 0xb2, 0x83, 0xc0, 0xe3, 0xa6, 0xa9, 0x6d, 0x6e, 0x26, 0xf8, 0x70, 0xd9,
+ 0xde, 0x9f, 0xa8, 0x50, 0x5a, 0x99, 0xff, 0x69, 0xf4, 0xd1, 0xdb, 0x1a,
+ 0x98, 0xfd, 0x34, 0x9c, 0x8a, 0xbe, 0x7b, 0xc9, 0xb1, 0xc0, 0x6c, 0xbc,
+ 0x9d, 0x5f, 0xf1, 0x2c, 0x8e, 0x4b, 0x36, 0x11, 0x97, 0x63, 0x2a, 0xec,
+ 0x56, 0xf5, 0x88, 0x1f, 0x25, 0xbd, 0xf6, 0x2a, 0x48, 0x16, 0xb3, 0xdd,
+ 0x42, 0xf9, 0x0c, 0x03, 0xe5, 0x36, 0x2e, 0xf0, 0x5a, 0x7b, 0x8b, 0x40,
+ 0xab, 0xb0, 0xe5, 0x4e, 0xc4, 0xed, 0xc0, 0xc9, 0x80, 0x95, 0x34, 0x3d,
+ 0x36, 0x63, 0xb5, 0xcb, 0x4e, 0x74, 0x5d, 0x23, 0x22, 0x97, 0x5c, 0x62,
+ 0x8e, 0xa3, 0x83, 0xf2, 0x09, 0xdb, 0x36, 0xc1, 0xd6, 0x92, 0xd3, 0xf6,
+ 0xf5, 0xe5, 0x58, 0x3f, 0x98, 0x9e, 0x8a, 0x14, 0x05, 0xd0, 0xfc, 0x22,
+ 0x1f, 0x27, 0xcb, 0xec, 0xa0, 0x0b, 0x97, 0xb6, 0x27, 0x28, 0xe1, 0xe3,
+ 0x18, 0x86, 0x45, 0xf8, 0x6a, 0x1d, 0xc6, 0x2b, 0x61, 0x27, 0x0e, 0xf4,
+ 0x5d, 0x23, 0xe6, 0x11, 0xe1, 0xc8, 0x02, 0x1e, 0x6d, 0x79, 0x01, 0xce,
+ 0xa2, 0xbb, 0x02, 0xbf, 0x8e, 0xd5, 0xb0, 0xb9, 0x2c, 0x15, 0xa6, 0x94,
+ 0x9c, 0x8d, 0x92, 0x99, 0x5e, 0x20, 0x19, 0xec, 0x1f, 0xec, 0x63, 0x79,
+ 0xd8, 0xb3, 0x64, 0x94, 0x89, 0x28, 0xa3, 0xac, 0x32, 0xd7, 0xe7, 0xe7,
+ 0x25, 0xf6, 0x42, 0x58, 0xff, 0x21, 0x1c, 0x6c, 0xa3, 0x8a, 0xeb, 0xd3,
+ 0x3d, 0xbe, 0xe4, 0x89, 0xaa, 0x39, 0x43, 0x5a, 0x66, 0x3e, 0x8b, 0xc5,
+ 0x6b, 0x42, 0x0b, 0x90, 0xf4, 0xd1, 0x69, 0x84, 0x68, 0x71, 0x60, 0x04,
+ 0x9c, 0xf6, 0xa9, 0xb7, 0x89, 0x5c, 0x96, 0x7e, 0x4d, 0x78, 0xb4, 0xa0,
+ 0x1a, 0x3e, 0xd4, 0xa1, 0x81, 0x29, 0x3d, 0x86, 0xd0, 0x76, 0x9e, 0xd1,
+ 0xac, 0xaa, 0x09, 0x2c, 0x18, 0x4f, 0x15, 0x26, 0x30, 0x9d, 0x3e, 0xe4,
+ 0x51, 0x2e, 0x35, 0xa8, 0x43, 0x01, 0x72, 0xce, 0x2a, 0xbf, 0x9b, 0x75,
+ 0x1b, 0xd8, 0x68, 0xe2, 0x21, 0x91, 0x28, 0xee, 0x32, 0x8b, 0x4d, 0x67,
+ 0x68, 0xb2, 0x5f, 0x19, 0x5e, 0x47, 0xd4, 0x78, 0x70, 0x4b, 0x05, 0xdb,
+ 0x8b, 0x2e, 0x80, 0x4a, 0xd0, 0xda, 0x00, 0xac, 0xa5, 0x69, 0xd9, 0xe7,
+ 0xe8, 0x1f, 0x4d, 0xc6, 0x32, 0x5f, 0xd4, 0x04, 0xa2, 0x3a, 0xa8, 0x43,
+ 0x8b, 0xdf, 0x30, 0xe7, 0x40, 0x57, 0x51, 0x68, 0x73, 0xa3, 0xf1, 0xa9,
+ 0xe0, 0xfa, 0x18, 0x19, 0x5f, 0x3e, 0xf6, 0x86, 0xe3, 0x6e, 0x3e, 0xf9,
+ 0xf0, 0xdb, 0xab, 0x6a, 0x88, 0x8a, 0x1b, 0x59, 0xcc, 0x5e, 0xfe, 0x96,
+ 0x32, 0x79, 0x6b, 0xdf, 0x79, 0x9d, 0xae, 0x20, 0xd0, 0xc2, 0x0f, 0xf3,
+ 0x64, 0xb0, 0x36, 0xeb, 0x65, 0x9a, 0xae, 0xa2, 0x4c, 0xc8, 0x45, 0x74,
+ 0xd4, 0x9b, 0x00, 0x6d, 0xb2, 0xe3, 0x3a, 0x18, 0xb0, 0x1b, 0x16, 0x87,
+ 0xd8, 0xef, 0x1c, 0xed, 0xec, 0x36, 0xe3, 0x6f, 0xe8, 0x5a, 0xf2, 0x06,
+ 0xd9, 0x80, 0xf8, 0xb3, 0x31, 0x12, 0x7b, 0x9f, 0x9e, 0xe8, 0x0b, 0x24,
+ 0x37, 0x97, 0xa9, 0xf9, 0xcb, 0x77, 0xa4, 0xcf, 0x4a, 0xd6, 0x64, 0xf5,
+ 0xd2, 0x7d, 0x99, 0x4f, 0x9d, 0xf3, 0xa8, 0x9c, 0xbf, 0x61, 0x0c, 0xae,
+ 0x7b, 0xf6, 0xc5, 0x0a, 0x03, 0x98, 0x40, 0x59, 0xd5, 0xfd, 0x98, 0x11,
+ 0x4f, 0x9c, 0x95, 0x01, 0x63, 0x6b, 0xbf, 0x2a, 0xe7, 0x90, 0xd2, 0x49,
+ 0xc5, 0x02, 0x3c, 0x04, 0xa0, 0x52, 0x91, 0x26, 0x45, 0x9d, 0xa9, 0xd9,
+ 0x41, 0x9d, 0x3b, 0x05, 0x93, 0x70, 0x50, 0xb2, 0x09, 0x56, 0x55, 0xbf,
+ 0x56, 0xde, 0xb4, 0x63, 0x42, 0x03, 0x84, 0xf9, 0x74, 0x85, 0xc1, 0x1b,
+ 0x5e, 0xf6, 0x5e, 0xdf, 0x01, 0x86, 0xa6, 0x99, 0x3b, 0x7d, 0x73, 0x0c,
+ 0xc9, 0x6e, 0xad, 0x12, 0x9c, 0x4d, 0x31, 0x4e, 0xd4, 0x12, 0x0a, 0x4e,
+ 0x2b, 0x17, 0xaa, 0xb8, 0x4f, 0x5c, 0x20, 0xe3, 0xe6, 0x3a, 0x0a, 0xcc,
+ 0xbd, 0x5d, 0x26, 0x98, 0x96, 0x9d, 0x2c, 0xf2, 0xcc, 0x1e, 0x0f, 0x03,
+ 0x67, 0x67, 0x8e, 0x34, 0x9d, 0x54, 0x9c, 0xc8, 0x58, 0x99, 0xe3, 0x45,
+ 0xc3, 0xb5, 0xba, 0xc7, 0x45, 0x97, 0xb0, 0x56, 0x60, 0xf6, 0x80, 0xee,
+ 0x2b, 0x06, 0x90, 0x99, 0x3e, 0xa8, 0xb7, 0xdc, 0xb0, 0xb0, 0x6d, 0xb9,
+ 0x68, 0x2b, 0x31, 0x79, 0xf4, 0x1d, 0x05, 0xe1, 0x6e, 0x67, 0x04, 0xb1,
+ 0x9b, 0xa7, 0x6a, 0x69, 0x0c, 0x4d, 0x76, 0x17, 0xf4, 0x9b, 0x2a, 0xc1,
+ 0x90, 0x6c, 0xf5, 0x67, 0x98, 0x5e, 0xb4, 0x8d, 0xad, 0x12, 0x6c, 0xaf,
+ 0x89, 0x09, 0x82, 0xb2, 0x64, 0x58, 0x44, 0xd6, 0x01, 0xd6, 0x0d, 0x20,
+ 0xf7, 0x04, 0xad, 0x4e, 0x1d, 0x9b, 0x4f, 0xad, 0xf9, 0x45, 0x34, 0xbf,
+ 0xeb, 0x38, 0x9e, 0x55, 0x87, 0xdd, 0xcc, 0x61, 0x29, 0x5f, 0xe1, 0xf6,
+ 0x35, 0x87, 0xc6, 0x5b, 0xc2, 0x90, 0xb9, 0x60, 0xfc, 0xdb, 0x74, 0x7d,
+ 0xce, 0x0e, 0x93, 0x58, 0x28, 0xfa, 0xf8, 0xee, 0x8e, 0x75, 0xe6, 0xcd,
+ 0x8d, 0x9c, 0xc5, 0x15, 0x05, 0x4c, 0x39, 0x34, 0x73, 0x12, 0x56, 0x74,
+ 0x80, 0x09, 0x0a, 0x9f, 0x25, 0x53, 0x80, 0x76, 0x20, 0x04, 0xf4, 0x99,
+ 0x6e, 0xbb, 0x29, 0x68, 0x54, 0xe0, 0xe8, 0x1e, 0x40, 0x1d, 0x82, 0x25,
+ 0xdc, 0xfe, 0x44, 0x37, 0x79, 0xe7, 0x97, 0x0a, 0x02, 0x8c, 0x56, 0xc1,
+ 0x16, 0xe4, 0xce, 0xf7, 0xfb, 0x43, 0x9f, 0xd2, 0xe5, 0xa0, 0x18, 0xab,
+ 0xdb, 0x7f, 0xb7, 0x08, 0x43, 0xe6, 0xed, 0xae, 0xbf, 0x00, 0x8f, 0xa5,
+ 0xfa, 0xdd, 0x95, 0x69, 0x3d, 0xfe, 0xcf, 0x0f, 0x8a, 0x5c, 0x8e, 0x21,
+ 0x1b, 0xf4, 0xae, 0x79, 0x54, 0x2a, 0xbd, 0x68, 0x9c, 0xde, 0xd2, 0x7c,
+ 0x51, 0xd6, 0x12, 0x72, 0xed, 0xaa, 0xa3, 0x34, 0x6f, 0x1e, 0x00, 0x44,
+ 0xc5, 0xec, 0x02, 0x17, 0x60, 0xf2, 0xd4, 0xe9, 0x82, 0x2f, 0xfe, 0x53,
+ 0x1c, 0xaf, 0xd1, 0xac, 0xdb, 0x8c, 0xf8, 0xce, 0x89, 0x27, 0xa1, 0x53,
+ 0xcf, 0x6a, 0x3f, 0xd3, 0xb7, 0x53, 0xce, 0x98, 0x5c, 0x57, 0x54, 0x6d,
+ 0x9b, 0xf4, 0x6e, 0x67, 0xad, 0x69, 0xeb, 0xa6, 0x86, 0xba, 0x9a, 0xd4,
+ 0x99, 0xb0, 0xde, 0x53, 0x28, 0x90, 0x42, 0x43, 0xf0, 0x57, 0x1a, 0x01,
+ 0x05, 0x08, 0x41, 0xe2, 0x9b, 0x5d, 0x95, 0xe4, 0x5c, 0x4d, 0x67, 0xd5,
+ 0xd2, 0xe8, 0xb6, 0xcb, 0xa8, 0x5e, 0x66, 0x8e, 0x27, 0xa6, 0x01, 0x40,
+ 0x22, 0x40, 0x29, 0xff, 0x74, 0x30, 0xf9, 0x3d, 0xf7, 0x93, 0x40, 0xb6,
+ 0x46, 0xb2, 0xe1, 0x26, 0x57, 0x51, 0xd3, 0x24, 0x5d, 0x2b, 0xc7, 0x4c,
+ 0x6e, 0x53, 0xca, 0x6d, 0xc5, 0xee, 0x05, 0x51, 0x2b, 0xe1, 0x6a, 0xa1,
+ 0x78, 0x0a, 0x97, 0x63, 0xdb, 0x09, 0x6e, 0x99, 0x02, 0x4f, 0x68, 0x2d,
+ 0x5a, 0xd2, 0xe9, 0x60, 0x27, 0x9a, 0x9f, 0xb3, 0xcf, 0xb2, 0xfe, 0xe2,
+ 0x8e, 0x3a, 0xdf, 0x6a, 0xaf, 0x4f, 0x6e, 0x79, 0x91, 0xfb, 0x78, 0x54,
+ 0x54, 0x1d, 0xaf, 0x59, 0x25, 0x84, 0xdf, 0x57, 0x58, 0x1c, 0x4f, 0xf2,
+ 0xf8, 0x2d, 0x4a, 0xd2, 0x97, 0xbe, 0xdc, 0xcd, 0xf1, 0x87, 0xe7, 0x42,
+ 0x30, 0xa7, 0x57, 0x6f, 0x8f, 0x98, 0x5e, 0x2c, 0x34, 0x2b, 0x76, 0x07,
+ 0xe8, 0x58, 0xca, 0x89, 0x01, 0x92, 0x8f, 0x71, 0x07, 0x35, 0x12, 0x74,
+ 0x78, 0x50, 0x8d, 0x9f, 0x47, 0xed, 0xa9, 0x02, 0xa3, 0xbf, 0xb0, 0xc6,
+ 0x98, 0x8d, 0x8b, 0x32, 0x2b, 0xca, 0x72, 0xdc, 0xbe, 0xa5, 0x12, 0x09,
+ 0xd1, 0xc7, 0x4b, 0xc7, 0xef, 0x70, 0x92, 0x37, 0xb7, 0x42, 0x16, 0x31,
+ 0x28, 0x3c, 0xc4, 0x31, 0x18, 0x8d, 0x9f, 0x1e, 0x8c, 0x6b, 0xef, 0x26,
+ 0xd8, 0xfd, 0xe0, 0x5a, 0x11, 0x60, 0x02, 0xf0, 0x3f, 0x01, 0x4c, 0x15,
+ 0x4d, 0x35, 0x90, 0x64, 0xc4, 0xc7, 0xc7, 0x59, 0x4e, 0x2b, 0x2d, 0x84,
+ 0x46, 0xf7, 0xe4, 0x68, 0xad, 0x93, 0xa7, 0xb9, 0x51, 0xdf, 0x7c, 0x62,
+ 0x73, 0x4e, 0xa2, 0x1a, 0x24, 0xb7, 0xed, 0x51, 0x64, 0x48, 0xdd, 0xe7,
+ 0x76, 0x21, 0x62, 0xa2, 0x3f, 0xda, 0xa3, 0xd9, 0x66, 0x66, 0xbb, 0x04,
+ 0x45, 0x27, 0x10, 0xbf, 0x9a, 0x1d, 0xbf, 0xf9, 0x58, 0x6e, 0xc5, 0xeb,
+ 0xd9, 0xd7, 0x0d, 0xe0, 0x60, 0x2f, 0x16, 0x47, 0xce, 0xc5, 0x7b, 0x26,
+ 0xfc, 0xbc, 0x54, 0xd2, 0xbf, 0x40, 0xc0, 0x31, 0xdb, 0x6c, 0x22, 0x81,
+ 0x69, 0x07, 0x1c, 0x9e, 0x33, 0xf7, 0x4e, 0xf3, 0x0c, 0x38, 0x45, 0x1e,
+ 0x8d, 0x51, 0x49, 0x7a, 0x26, 0x43, 0xfe, 0x32, 0x0e, 0x98, 0xef, 0x90,
+ 0x55, 0x50, 0xbb, 0xbf, 0xca, 0x15, 0x91, 0x38, 0x5e, 0x1b, 0xcb, 0xb0,
+ 0xc3, 0xd5, 0x89, 0x80, 0x0f, 0x91, 0x4e, 0xbb, 0x31, 0xd9, 0x49, 0xa0,
+ 0x4f, 0x28, 0xf6, 0x26, 0x8e, 0x88, 0x9e, 0x9e, 0x4a, 0x47, 0x0d, 0xac,
+ 0xb6, 0x8a, 0xdf, 0xc4, 0x4c, 0xc9, 0x3f, 0x16, 0xf3, 0x24, 0x0f, 0x52,
+ 0x60, 0x12, 0x2b, 0x2f, 0x08, 0x35, 0xd1, 0x08, 0xff, 0x13, 0xef, 0x27,
+ 0xd8, 0x97, 0xc4, 0x9e, 0x16, 0x4d, 0xbd, 0xdb, 0x25, 0xca, 0xff, 0x50,
+ 0x65, 0x6f, 0xc3, 0x6f, 0x6c, 0x62, 0x86, 0x4f, 0x10, 0xb5, 0x3c, 0x64,
+ 0xe0, 0xd5, 0xb8, 0xaf, 0xff, 0xea, 0xc7, 0xef, 0xed, 0x64, 0x7d, 0xcd,
+ 0xc4, 0x2f, 0x81, 0xf9, 0x7b, 0x9c, 0xaa, 0xb2, 0x62, 0x75, 0xfe, 0xb8,
+ 0x43, 0x79, 0x10, 0xe8, 0xa1, 0xa8, 0x3a, 0x6f, 0x43, 0x89, 0x64, 0xc0,
+ 0x7a, 0x5f, 0x4a, 0xe7, 0xd0, 0x3b, 0xab, 0x2e, 0x32, 0x9d, 0x3b, 0x35,
+ 0x23, 0xec, 0x47, 0x85, 0xf4, 0xff, 0xcc, 0xfd, 0x14, 0x72, 0x6d, 0x1c,
+ 0x33, 0xfe, 0x38, 0xb7, 0xf4, 0x84, 0x08, 0x2a, 0x17, 0x67, 0xd3, 0x48,
+ 0x9c, 0x43, 0x93, 0x5d, 0xa6, 0x8c, 0xbb, 0xb5, 0x7a, 0x40, 0xab, 0xd6,
+ 0x15, 0xc5, 0x36, 0x2d, 0x67, 0x42, 0xf7, 0xe7, 0xdb, 0xbd, 0x2a, 0xd9,
+ 0x29, 0xe6, 0x3b, 0x82, 0xff, 0x10, 0x02, 0xe8, 0x3d, 0xc4, 0x70, 0x4f,
+ 0xe3, 0xe5, 0x98, 0x76, 0xf3, 0x37, 0x30, 0x53, 0xd9, 0x49, 0x9d, 0x45,
+ 0xed, 0x2d, 0xad, 0x0b, 0xfa, 0xd0, 0xe9, 0xd9, 0x29, 0x12, 0x30, 0xc1,
+ 0xf7, 0x38, 0x7b, 0x2e, 0xad, 0xb1, 0xb5, 0x9c, 0xe6, 0xc8, 0xf0, 0x3d,
+ 0xf6, 0x45, 0x9c, 0x07, 0x5e, 0xfc, 0x34, 0x66, 0x51, 0x79, 0xc8, 0x5a,
+ 0x82, 0x51, 0x48, 0x58, 0x70, 0x42, 0x14, 0x29, 0x19, 0x53, 0x90, 0xeb,
+ 0xe3, 0x0f, 0xea, 0xbf, 0x58, 0x06, 0xb7, 0x9a, 0x5e, 0x17, 0x95, 0x3b,
+ 0x70, 0x1d, 0xad, 0x3d, 0x52, 0xc7, 0xcd, 0xcd, 0x77, 0x75, 0x01, 0xb0,
+ 0xbe, 0xa8, 0xe7, 0x4a, 0x2e, 0x5b, 0xa7, 0xe2, 0xc7, 0xfa, 0x6f, 0x2c,
+ 0xd0, 0xad, 0x1f, 0xa5, 0x76, 0xff, 0xd2, 0x18, 0xe3, 0x81, 0x71, 0xbc,
+ 0xb6, 0xfe, 0x88, 0xa4, 0xea, 0xdb, 0xc7, 0xa5, 0xf0, 0x4e, 0x64, 0xc0,
+ 0xf3, 0xea, 0xe3, 0x7a, 0x5c, 0x53, 0xad, 0xc4, 0xa9, 0x14, 0x45, 0x48,
+ 0xfd, 0x2f, 0x51, 0xf1, 0x46, 0xe3, 0x5d, 0x87, 0x29, 0xd8, 0x48, 0x4e,
+ 0x4b, 0xef, 0x2b, 0x8d, 0x04, 0x21, 0x6f, 0x9c, 0x4e, 0x8b, 0x88, 0x8c,
+ 0xd4, 0xf4, 0x97, 0x0e, 0x13, 0xcd, 0x79, 0x3f, 0x0d, 0xd8, 0x8a, 0xf0,
+ 0xf1, 0xf8, 0x85, 0xf3, 0x9c, 0x6e, 0x3d, 0x29, 0x65, 0xb2, 0x2d, 0x16,
+ 0x73, 0x27, 0x7d, 0x59, 0xf6, 0xbd, 0x4c, 0x2c, 0x8f, 0xaa, 0x0e, 0x34,
+ 0xd0, 0x4c, 0xa2, 0x0b, 0xcb, 0x69, 0x32, 0x80, 0x07, 0x58, 0xc5, 0x50,
+ 0x61, 0x05, 0x00, 0x4b, 0xf1, 0x55, 0xce, 0xbb, 0x52, 0x35, 0xe9, 0xe6,
+ 0x85, 0x48, 0x1f, 0x85, 0x4e, 0x01, 0xdf, 0xeb, 0x6f, 0x6f, 0x0a, 0xe0,
+ 0xad, 0x61, 0x94, 0xc6, 0x2e, 0x99, 0xc0, 0xcd, 0x59, 0xf9, 0xc4, 0x8d,
+ 0x15, 0x17, 0x43, 0x22, 0xcf, 0x63, 0xf8, 0x01, 0x3a, 0xbc, 0x00, 0x06,
+ 0x07, 0xb5, 0xf6, 0x00, 0x97, 0xd5, 0xff, 0x7e, 0x89, 0x26, 0x70, 0x14,
+ 0xdc, 0x12, 0xdd, 0x48, 0x47, 0x35, 0xf8, 0x09, 0xb9, 0x65, 0x95, 0x2a,
+ 0xa5, 0x40, 0x0a, 0x07, 0xc4, 0x4f, 0x18, 0x4a, 0x6a, 0x3f, 0x90, 0x66,
+ 0xeb, 0x71, 0xae, 0xb8, 0x0f, 0x74, 0xb0, 0x3c, 0x42, 0x63, 0x6c, 0x77,
+ 0x5d, 0xd5, 0x97, 0xb7, 0x5a, 0x04, 0xe9, 0x47, 0xb3, 0x61, 0xbe, 0x05,
+ 0x5b, 0x96, 0x93, 0x72, 0x30, 0x86, 0x67, 0x47, 0x83, 0x58, 0xd0, 0x00,
+ 0x7e, 0x47, 0x2e, 0x40, 0xf1, 0xb2, 0x45, 0xc8, 0x71, 0x9a, 0x45, 0x25,
+ 0xdc, 0xdf, 0x34, 0x16, 0x4e, 0x52, 0x74, 0x64, 0x7b, 0xcd, 0x5b, 0x67,
+ 0x64, 0xf6, 0x59, 0x17, 0x5a, 0x91, 0x2d, 0xc0, 0x65, 0x97, 0x9c, 0x60,
+ 0x1f, 0xca, 0xd2, 0x0d, 0xea, 0x53, 0xf9, 0xa5, 0xe4, 0x9f, 0x9d, 0x5f,
+ 0x32, 0xd8, 0x4d, 0x8a, 0xc8, 0x0a, 0x63, 0xa2, 0x90, 0x5d, 0x24, 0x2b,
+ 0x35, 0xc3, 0x44, 0x20, 0xe1, 0xac, 0x89, 0xa4, 0xa1, 0x93, 0x39, 0xe9,
+ 0x3e, 0xcf, 0x9f, 0x71, 0xda, 0x14, 0x53, 0x61, 0x8a, 0x3e, 0xec, 0xce,
+ 0xc3, 0x84, 0xc1, 0x0b, 0xfa, 0x4b, 0x8c, 0x21, 0x95, 0x99, 0x86, 0x36,
+ 0x5c, 0x21, 0xde, 0x39, 0xee, 0xe7, 0x46, 0x33, 0x1c, 0x64, 0x2e, 0x6d,
+ 0x32, 0x2c, 0xd3, 0xcf, 0x06, 0xa8, 0x91, 0x3d, 0xd2, 0x92, 0x97, 0x7b,
+ 0x8c, 0x23, 0x56, 0x05, 0x9b, 0x4b, 0xc9, 0x6f, 0x43, 0xa8, 0x9d, 0xba,
+ 0xbb, 0x90, 0x73, 0x4b, 0x8e, 0x1e, 0xa3, 0x0f, 0x9c, 0x8c, 0x81, 0xf8,
+ 0xb2, 0xda, 0x41, 0x47, 0x7b, 0x9e, 0x0f, 0x8a, 0xea, 0x48, 0x00, 0xa2,
+ 0x4a, 0x93, 0xf9, 0x3d, 0x04, 0xcd, 0xa9, 0xf8, 0x95, 0xb9, 0x45, 0x64,
+ 0x28, 0xb3, 0x27, 0x30, 0xfc, 0x59, 0x4e, 0xbc, 0x19, 0xe9, 0x68, 0x41,
+ 0x35, 0x65, 0xc9, 0xaf, 0x07, 0x57, 0xf9, 0x26, 0x88, 0x96, 0x4f, 0xa1,
+ 0xb3, 0xff, 0x5c, 0x0e, 0xb5, 0xc9, 0x1a, 0x66, 0x07, 0x19, 0x4c, 0x59,
+ 0x11, 0xf7, 0xa5, 0xcb, 0x76, 0x7d, 0x75, 0x20, 0x8d, 0xa2, 0x31, 0x56,
+ 0x8e, 0xae, 0x75, 0xba, 0x3f, 0x57, 0x19, 0x33, 0xa6, 0xbc, 0x15, 0x19,
+ 0x7f, 0x2e, 0x8c, 0xf1, 0x1d, 0xee, 0x0b, 0x66, 0xa9, 0x1a, 0xe3, 0x65,
+ 0xa9, 0xc5, 0xda, 0xbb, 0x8a, 0xe5, 0x8a, 0xe6, 0xae, 0x51, 0x73, 0xed,
+ 0x48, 0xaf, 0x22, 0x73, 0xd9, 0xd8, 0x9b, 0x74, 0x8b, 0xfe, 0xdb, 0xb2,
+ 0x06, 0xf6, 0x45, 0x80, 0xcc, 0x59, 0xce, 0x0c, 0x40, 0xb6, 0xfd, 0x38,
+ 0x65, 0x79, 0x4b, 0x5e, 0xb9, 0x99, 0x78, 0x37, 0x49, 0xb9, 0x4f, 0x82,
+ 0xef, 0x6d, 0xdf, 0xb7, 0xe1, 0xd6, 0xca, 0xe8, 0x77, 0x96, 0xb1, 0x83,
+ 0x4c, 0x3d, 0xc6, 0x5a, 0xb9, 0xa3, 0xb5, 0xf1, 0x3e, 0x18, 0xc5, 0xbc,
+ 0x8f, 0xac, 0xbf, 0xb5, 0x01, 0xbf, 0x00, 0x11, 0x45, 0x26, 0xf6, 0x39,
+ 0x07, 0x2e, 0xee, 0x1d, 0x5f, 0xc9, 0x8d, 0xc5, 0xc6, 0xeb, 0x84, 0x9b,
+ 0x0a, 0xd1, 0x0f, 0xb7, 0xbe, 0x00, 0x52, 0xd1, 0xc8, 0xdb, 0xc7, 0x5c,
+ 0xee, 0xb3, 0xca, 0x39, 0x69, 0xe4, 0x69, 0x29, 0xe0, 0x8d, 0x47, 0x71,
+ 0x9d, 0xd5, 0x98, 0x5f, 0x1b, 0xa2, 0xa7, 0xce, 0xf0, 0xfd, 0x44, 0x52,
+ 0x68, 0xee, 0x83, 0x5b, 0xfa, 0xab, 0xa9, 0x94, 0x33, 0x82, 0x39, 0x12,
+ 0xe5, 0xa4, 0x1b, 0x02, 0x1e, 0xb7, 0x07, 0x04, 0x6b, 0xa0, 0x3d, 0xb6,
+ 0x55, 0x19, 0xe8, 0x4d, 0x4a, 0x70, 0x6b, 0x7b, 0x4d, 0x22, 0x05, 0xfa,
+ 0xff, 0x88, 0x4f, 0xac, 0x41, 0xa7, 0xf2, 0x9d, 0x32, 0x93, 0x90, 0x6c,
+ 0x8f, 0x95, 0xc1, 0x19, 0xfa, 0xdb, 0x5d, 0xde, 0x07, 0x5d, 0x54, 0x37,
+ 0x7d, 0x8d, 0xa2, 0x80, 0xc2, 0x01, 0xf0, 0xf5, 0x65, 0x2a, 0xf8, 0x6c,
+ 0x25, 0x5d, 0xae, 0x9f, 0xc7, 0x99, 0x63, 0x55, 0x85, 0x46, 0x12, 0x61,
+ 0x85, 0xcb, 0x92, 0x6b, 0xba, 0xb0, 0xfe, 0x54, 0xc2, 0xae, 0x6c, 0xfa,
+ 0x4d, 0x10, 0x0b, 0xdd, 0xff, 0x31, 0x30, 0x26, 0x79, 0x94, 0xa6, 0xd2,
+ 0xb8, 0xa2, 0x78, 0xed, 0x8f, 0x77, 0xbe, 0x9c, 0xcf, 0xbf, 0x5a, 0xe0,
+ 0xf5, 0xda, 0x3b, 0x0b, 0x3b, 0xd1, 0x6e, 0x05, 0x21, 0xad, 0x23, 0xe7,
+ 0x62, 0x51, 0xdd, 0x17, 0xda, 0x5c, 0x35, 0x22, 0x5d, 0xfc, 0x2c, 0x40,
+ 0x48, 0x14, 0xa2, 0x2f, 0x47, 0x76, 0xbc, 0x5b, 0x6e, 0x39, 0xd7, 0x2d,
+ 0xcc, 0x50, 0xba, 0x51, 0x85, 0x48, 0x7b, 0x5f, 0x5d, 0xb4, 0xa3, 0x78,
+ 0xb4, 0xe8, 0x3c, 0x66, 0xa6, 0x94, 0x3b, 0x76, 0x9d, 0x3f, 0x7a, 0x8e,
+ 0x4b, 0xb3, 0x43, 0x93, 0x94, 0x6f, 0xb8, 0x51, 0x49, 0x9e, 0x77, 0xf3,
+ 0xc4, 0xc9, 0x16, 0x6a, 0x4b, 0xd4, 0xa2, 0xb2, 0x8e, 0x60, 0xfe, 0xaf,
+ 0x23, 0x7a, 0xdf, 0x26, 0x6f, 0x87, 0xc8, 0x8a, 0x81, 0x11, 0xe7, 0xc2,
+ 0x24, 0x24, 0x47, 0x85, 0x5b, 0xc1, 0x93, 0x58, 0x8d, 0xf9, 0x60, 0x78,
+ 0x8a, 0xc8, 0x94, 0x78, 0xbc, 0xe1, 0x8c, 0xf7, 0xbc, 0xe0, 0xa4, 0x41,
+ 0x5e, 0x33, 0x34, 0x1b, 0x3b, 0xf1, 0x1f, 0x98, 0x24, 0xce, 0xe5, 0xe0,
+ 0x4f, 0x22, 0x2a, 0x9b, 0x1d, 0x05, 0xc6, 0xbf, 0x3f, 0x7e, 0x3f, 0x15,
+ 0x15, 0xce, 0x1b, 0x85, 0x8b, 0x73, 0x2c, 0x85, 0x20, 0xd3, 0x2e, 0x22,
+ 0x62, 0x4b, 0x8c, 0x51, 0x8b, 0xd9, 0x44, 0x1a, 0x01, 0x02, 0xf0, 0xa6,
+ 0x56, 0x87, 0x21, 0xfc, 0x0a, 0xa8, 0xa6, 0x8f, 0x4e, 0xf2, 0xd3, 0xd5,
+ 0x8e, 0x94, 0xdf, 0x3a, 0xe6, 0x54, 0x30, 0x90, 0xe3, 0xcd, 0x26, 0xde,
+ 0x3d, 0x2e, 0x6c, 0x30, 0xa3, 0x54, 0x5d, 0x02, 0x5a, 0x51, 0xff, 0xa8,
+ 0x93, 0x1e, 0x03, 0x15, 0x85, 0x5e, 0xda, 0x52, 0x39, 0x91, 0x61, 0x21,
+ 0xdd, 0x2d, 0xb5, 0x63, 0x80, 0xdd, 0x13, 0x5e, 0x15, 0x44, 0x69, 0xae,
+ 0x61, 0xa1, 0xb8, 0x7d, 0xb5, 0xa9, 0x22, 0xe6, 0xf7, 0xce, 0xa3, 0x0c,
+ 0xff, 0xcb, 0xef, 0x05, 0xff, 0xbd, 0xf5, 0xe6, 0xc5, 0x56, 0xa4, 0x8e,
+ 0x2c, 0x5f, 0xab, 0x46, 0x6e, 0xb5, 0xe5, 0x5c, 0x86, 0xa3, 0x70, 0x69,
+ 0x01, 0xb5, 0x6d, 0x44, 0x19, 0x44, 0x98, 0xa8, 0x8d, 0x1c, 0xb9, 0x8c,
+ 0xd3, 0x1b, 0x0b, 0xe6, 0x28, 0x36, 0xfd, 0x4e, 0x14, 0x67, 0x3c, 0xb8,
+ 0x0a, 0x17, 0xee, 0xb2, 0x6c, 0x01, 0x5d, 0x58, 0xf0, 0x6a, 0x8f, 0x19,
+ 0x90, 0x0b, 0xdf, 0xd5, 0xa9, 0xef, 0xb7, 0x69, 0xd2, 0x37, 0x1e, 0xdd,
+ 0x6b, 0xa6, 0xc0, 0x16, 0xa9, 0x4d, 0xb6, 0xf0, 0x5f, 0xf2, 0x39, 0x76,
+ 0x20, 0x99, 0x5d, 0x9e, 0x43, 0x84, 0xc4, 0x8e, 0x3b, 0xb9, 0xc4, 0xf8,
+ 0x62, 0x88, 0x3c, 0xd3, 0x60, 0x66, 0xd8, 0xbd, 0x1f, 0xc5, 0x01, 0x90,
+ 0xa0, 0x8e, 0x3a, 0xbd, 0x05, 0x03, 0x63, 0x45, 0x5d, 0xc8, 0x2e, 0xb2,
+ 0xa5, 0x56, 0xb4, 0xe1, 0x84, 0x0c, 0xcc, 0xff, 0x8e, 0xbb, 0xb7, 0x99,
+ 0x6e, 0x15, 0x93, 0x33, 0xca, 0xe8, 0x1e, 0x66, 0x96, 0x04, 0x98, 0x33,
+ 0x20, 0x47, 0x3b, 0xe6, 0x35, 0xdb, 0x69, 0xb7, 0x2a, 0x54, 0x03, 0xe4,
+ 0x66, 0xde, 0x97, 0x4e, 0x95, 0xbe, 0xbe, 0x1d, 0xd3, 0xe3, 0x7f, 0x75,
+ 0x76, 0xdd, 0xae, 0xfd, 0xbc, 0x7b, 0xa8, 0xcf, 0xf9, 0xb8, 0x04, 0x0c,
+ 0xdb, 0x81, 0xaa, 0x7a, 0xa3, 0xa0, 0xff, 0xda, 0xeb, 0x8d, 0x88, 0x29,
+ 0x9d, 0x77, 0xe0, 0x61, 0x8a, 0x6e, 0x84, 0xca, 0x76, 0xd4, 0x0a, 0x7a,
+ 0x80, 0xdf, 0xaa, 0x56, 0x96, 0x38, 0x26, 0x4f, 0x23, 0x6f, 0xd7, 0x02,
+ 0xd8, 0xa9, 0xd6, 0xad, 0x37, 0x4c, 0x43, 0x8e, 0xad, 0x72, 0x89, 0xfe,
+ 0x44, 0x5a, 0xb7, 0x5d, 0xf7, 0xdf, 0x8f, 0xfd, 0x79, 0x2c, 0xa9, 0xb6,
+ 0xa4, 0xba, 0xda, 0x8a, 0xa1, 0xa5, 0xb9, 0xe2, 0x0f, 0x28, 0xf2, 0xa9,
+ 0xef, 0x85, 0xbd, 0xce, 0xd8, 0x66, 0x6a, 0xb8, 0x6c, 0xe6, 0x38, 0x5b,
+ 0xbd, 0x15, 0xf2, 0x6b, 0x2f, 0xcb, 0xbf, 0xee, 0xe5, 0xc7, 0xf0, 0xf4,
+ 0x8b, 0xca, 0xbc, 0xdd, 0x58, 0xd2, 0x06, 0xaa, 0x0c, 0x9c, 0x42, 0x9b,
+ 0xf9, 0x05, 0x0e, 0xf0, 0xad, 0x28, 0xe8, 0x53, 0x27, 0x0e, 0xb5, 0x00,
+ 0x06, 0xc3, 0x50, 0x78, 0x55, 0x93, 0x91, 0x70, 0xb9, 0x20, 0xea, 0x1f,
+ 0xbb, 0xdc, 0xa4, 0x9b, 0xd0, 0x7a, 0xd6, 0xcd, 0xd7, 0x45, 0x83, 0x41,
+ 0xa1, 0x78, 0xef, 0xa0, 0x2c, 0xc2, 0x2d, 0x18, 0x6f, 0x72, 0x5e, 0x56,
+ 0x36, 0xd5, 0x94, 0x41, 0x6e, 0x2e, 0xe4, 0x96, 0xe1, 0xe4, 0xb9, 0xf9,
+ 0xf5, 0x52, 0x1b, 0xd9, 0xf3, 0x82, 0x00, 0x38, 0x91, 0xf8, 0x37, 0xe4,
+ 0x32, 0xb8, 0x02, 0xc3, 0x30, 0x78, 0xf6, 0x24, 0x35, 0xef, 0x31, 0x98,
+ 0x8b, 0x58, 0x8d, 0xf0, 0x42, 0xab, 0x47, 0xc2, 0xe1, 0x20, 0x1b, 0x14,
+ 0x19, 0x51, 0x7d, 0xb7, 0xb9, 0x97, 0x31, 0x00, 0xb8, 0x84, 0x59, 0xdd,
+ 0xb2, 0x97, 0xfe, 0x2e, 0x84, 0x30, 0x6d, 0xe9, 0x0d, 0x43, 0xca, 0x04,
+ 0x40, 0x6b, 0x08, 0x57, 0xa2, 0xdb, 0xc6, 0xc6, 0x00, 0xa0, 0xa9, 0x86,
+ 0x5b, 0x2d, 0xad, 0x89, 0xbf, 0xdc, 0x9d, 0xec, 0x1f, 0x13, 0xea, 0x78,
+ 0xde, 0xb5, 0x20, 0xe4, 0x4d, 0x74, 0xde, 0xa7, 0xaa, 0xa9, 0xc6, 0x78,
+ 0x43, 0xcb, 0xe0, 0x44, 0x4c, 0x12, 0x3c, 0x7d, 0x2b, 0xd7, 0x94, 0xc0,
+ 0x05, 0xa8, 0x97, 0xbc, 0xda, 0x83, 0x85, 0xc5, 0x1a, 0xe6, 0xd2, 0x68,
+ 0xdf, 0xfa, 0xb0, 0x5d, 0x63, 0x3b, 0x73, 0xcb, 0xfc, 0x75, 0xb3, 0xbd,
+ 0xe8, 0x60, 0xb8, 0xc4, 0x99, 0xd6, 0xea, 0xf6, 0x21, 0x6e, 0x14, 0xd3,
+ 0x4a, 0x6b, 0x78, 0xb2, 0xd3, 0x1e, 0xa8, 0x5f, 0x88, 0x7d, 0xfd, 0x70,
+ 0x3a, 0x57, 0x17, 0x23, 0xf1, 0x3f, 0x5f, 0xa9, 0xee, 0x1f, 0x52, 0xdb,
+ 0x92, 0x3f, 0xea, 0xf0, 0x97, 0x96, 0x56, 0x77, 0x33, 0xd0, 0x57, 0xe5,
+ 0xa7, 0xb3, 0xf8, 0xa2, 0x59, 0xe9, 0x08, 0xb9, 0x56, 0xdc, 0x07, 0xdc,
+ 0x9f, 0xff, 0x8e, 0x97, 0x57, 0xe9, 0x92, 0xec, 0xff, 0xdd, 0x72, 0xd6,
+ 0x55, 0x94, 0xa7, 0xf8, 0xb8, 0x1d, 0x55, 0xf2, 0xf9, 0xda, 0xa3, 0xd4,
+ 0x27, 0x99, 0xb4, 0x65, 0x5d, 0xe7, 0xa7, 0x86, 0x46, 0xe0, 0x39, 0x20,
+ 0xe4, 0x5d, 0xeb, 0x4d, 0x5f, 0xbe, 0x9f, 0x66, 0x6f, 0xdd, 0xab, 0xbd,
+ 0x16, 0xd2, 0x3d, 0x9e, 0xc2, 0x57, 0x68, 0x6b, 0x0a, 0x09, 0xc5, 0xac,
+ 0x5f, 0x3e, 0x59, 0x6e, 0x68, 0xf6, 0x10, 0x22, 0x9c, 0x02, 0x18, 0x0a,
+ 0x6c, 0xb6, 0x77, 0xa6, 0x77, 0x41, 0x9c, 0x4c, 0x60, 0xde, 0xec, 0xdd,
+ 0x15, 0xc1, 0x21, 0x02, 0xde, 0x8c, 0x3a, 0x49, 0x5b, 0xf0, 0xc3, 0xc8,
+ 0x1e, 0x01, 0x27, 0xf5, 0xc0, 0x22, 0x35, 0x3e, 0x86, 0x95, 0x33, 0xbb,
+ 0xb8, 0x5d, 0x46, 0x96, 0x93, 0xcb, 0x8c, 0x3c, 0xf4, 0xfc, 0x02, 0x7f,
+ 0x59, 0x79, 0x81, 0xf6, 0x3e, 0x55, 0x44, 0x16, 0xb7, 0xb1, 0x7a, 0xa8,
+ 0x08, 0x2b, 0x97, 0xfc, 0xef, 0x26, 0x09, 0x51, 0xf0, 0x77, 0x0d, 0x93,
+ 0xea, 0x19, 0xff, 0x55, 0x6d, 0x7a, 0x25, 0x35, 0xfd, 0x3c, 0x3b, 0xc4,
+ 0xac, 0x55, 0xf3, 0xbd, 0x99, 0xb0, 0xbf, 0x01, 0xac, 0x34, 0xb3, 0xad,
+ 0x9d, 0xcf, 0xa5, 0x15, 0x3d, 0x14, 0xf5, 0x31, 0xbb, 0x8c, 0xa3, 0xa4,
+ 0x86, 0xe1, 0xbb, 0x14, 0x2a, 0xda, 0x4b, 0x57, 0x45, 0x74, 0xbf, 0x51,
+ 0xfe, 0xe3, 0xa4, 0xff, 0xb8, 0xab, 0xcb, 0xbc, 0x56, 0x61, 0x3c, 0x11,
+ 0xf5, 0x15, 0xb1, 0xa0, 0xb0, 0x40, 0xf1, 0x88, 0xbc, 0x53, 0xe2, 0x6a,
+ 0x4d, 0x67, 0xbb, 0x6d, 0x22, 0xc5, 0x32, 0xcd, 0xd2, 0xad, 0xba, 0x88,
+ 0x3c, 0x7a, 0x22, 0xcb, 0x0b, 0xbf, 0xfd, 0xe7, 0xb4, 0xe9, 0xd8, 0x95,
+ 0xbb, 0xfc, 0xef, 0x23, 0xa3, 0x57, 0xa4, 0x5c, 0x78, 0xc6, 0xd2, 0x17,
+ 0x39, 0x46, 0x20, 0x0a, 0xe0, 0xa3, 0xcc, 0x0f, 0x57, 0x4d, 0xa1, 0xa9,
+ 0xd6, 0x4c, 0x92, 0x84, 0xb8, 0x7f, 0xf5, 0x74, 0xb5, 0xe1, 0x56, 0xb2,
+ 0xe4, 0x7a, 0xc0, 0xe1, 0x8f, 0xf2, 0x60, 0x95, 0x4e, 0x88, 0xb3, 0x93,
+ 0x35, 0xd0, 0x24, 0x21, 0x01, 0xcd, 0x11, 0xfa, 0xee, 0x24, 0x2b, 0x1d,
+ 0xe4, 0x63, 0x6f, 0x26, 0x2a, 0x87, 0xa0, 0x72, 0x86, 0x43, 0x9f, 0x52,
+ 0x32, 0xee, 0x9d, 0xf6, 0x37, 0x0b, 0xec, 0x80, 0xb9, 0xc4, 0xc4, 0x02,
+ 0x98, 0x0c, 0xb2, 0x79, 0x66, 0xc1, 0xf6, 0x70, 0x0e, 0xf4, 0x41, 0x9b,
+ 0x3d, 0xe9, 0x94, 0xb9, 0xda, 0x75, 0x01, 0x78, 0x31, 0x77, 0xfc, 0xf9,
+ 0x7a, 0x18, 0xba, 0xc8, 0xac, 0x0b, 0xb0, 0xee, 0xf8, 0x77, 0xa5, 0x33,
+ 0xc2, 0xaf, 0xa0, 0x39, 0xa8, 0x96, 0xc4, 0x1f, 0x40, 0x31, 0x04, 0x5b,
+ 0x0f, 0x9b, 0x2b, 0x96, 0xf2, 0x82, 0x0d, 0xf9, 0x4f, 0x8e, 0xcc, 0xeb,
+ 0x27, 0xac, 0x68, 0x84, 0xba, 0x34, 0x0b, 0xd8, 0x9a, 0xe7, 0x35, 0x6c,
+ 0x19, 0xb5, 0x49, 0xd0, 0x2a, 0xf8, 0x44, 0xa6, 0xdd, 0x80, 0x75, 0xc9,
+ 0x56, 0xaf, 0xd2, 0x28, 0x41, 0x58, 0x0e, 0x76, 0xdc, 0x42, 0xd2, 0x77,
+ 0x0c, 0x15, 0x00, 0x04, 0x24, 0x7f, 0x7a, 0x13, 0x53, 0x42, 0xaa, 0x93,
+ 0x32, 0x9a, 0x7c, 0xc9, 0x44, 0x7b, 0x85, 0xa9, 0xff, 0x2a, 0xe8, 0x86,
+ 0x51, 0xc0, 0x06, 0xa4, 0xc9, 0xff, 0x1e, 0x05, 0xc0, 0x13, 0x8b, 0xf8,
+ 0x9a, 0xfc, 0xea, 0xba, 0xdf, 0x82, 0x56, 0x41, 0x96, 0x6f, 0x67, 0x7e,
+ 0x7c, 0xe1, 0x4e, 0xae, 0xa6, 0x83, 0x52, 0x36, 0x7e, 0x9e, 0xf4, 0xfd,
+ 0xe0, 0xcf, 0x0c, 0xbb, 0x52, 0x55, 0xc2, 0xc8, 0xd7, 0x39, 0x71, 0xff,
+ 0x17, 0x45, 0x77, 0xaa, 0xd2, 0x1a, 0xfe, 0x66, 0x88, 0xc0, 0xf1, 0xcd,
+ 0x2d, 0xe5, 0xe2, 0x19, 0x20, 0x20, 0x47, 0x4b, 0x87, 0x8f, 0x68, 0xce,
+ 0x31, 0x74, 0x63, 0x5e, 0xce, 0x08, 0x09, 0x28, 0x35, 0xc4, 0x1e, 0x87,
+ 0xc2, 0xc5, 0x6c, 0xaf, 0x69, 0x9e, 0xb3, 0x6f, 0xf0, 0x98, 0x2b, 0x34,
+ 0xf2, 0xe2, 0xbc, 0x0e, 0xc4, 0xa2, 0xdd, 0x28, 0xb7, 0x9d, 0xf1, 0xa9,
+ 0xc7, 0x64, 0x84, 0x58, 0x0e, 0xa5, 0x32, 0x1f, 0xab, 0x44, 0xfd, 0xf3,
+ 0xe8, 0x2e, 0xf5, 0x35, 0x96, 0xdf, 0x5d, 0xc8, 0x46, 0xa2, 0xdd, 0x20,
+ 0xa6, 0x8b, 0x24, 0x0e, 0xa7, 0x74, 0x49, 0x4c, 0xb6, 0x36, 0x4b, 0xf1,
+ 0xea, 0x7c, 0xf3, 0x10, 0x2a, 0xde, 0xe3, 0x9b, 0x27, 0xf1, 0x6c, 0x83,
+ 0x74, 0xc2, 0xb4, 0xb1, 0xec, 0xfa, 0x4c, 0x75, 0x41, 0x5b, 0x64, 0x3d,
+ 0x1e, 0x1e, 0xbc, 0xc5, 0x25, 0x0f, 0x72, 0x9c, 0x11, 0x13, 0xe7, 0xa2,
+ 0x44, 0x23, 0x86, 0xc8, 0x32, 0xe0, 0x6b, 0x53, 0xdd, 0xcd, 0x30, 0xb7,
+ 0xc1, 0xd1, 0x10, 0xe8, 0xe0, 0x60, 0xcb, 0x1e, 0x24, 0xab, 0xeb, 0x97,
+ 0x4b, 0x51, 0xa5, 0x3a, 0x8b, 0x76, 0x2c, 0x8a, 0xec, 0x35, 0xb4, 0xf8,
+ 0x1d, 0x9c, 0x51, 0x40, 0xc7, 0x0e, 0x74, 0x21, 0x73, 0xd8, 0x6f, 0xc5,
+ 0x89, 0x15, 0xd0, 0x32, 0x9b, 0xfb, 0x5b, 0xe8, 0xc7, 0xc9, 0x6e, 0x61,
+ 0x1c, 0x6e, 0x3e, 0xb6, 0xc3, 0xcd, 0x02, 0xda, 0x5c, 0x36, 0xe2, 0x0e,
+ 0xa0, 0xd3, 0xd6, 0x1c, 0x95, 0x1f, 0x73, 0xec, 0xdb, 0x07, 0x11, 0x97,
+ 0x73, 0x1e, 0xf9, 0xa9, 0x17, 0x75, 0x19, 0x43, 0x43, 0x4b, 0x7e, 0x5d,
+ 0xf7, 0x22, 0xa8, 0xf8, 0xb4, 0x62, 0xe8, 0x9f, 0x69, 0x61, 0x50, 0xf6,
+ 0x40, 0x22, 0x95, 0x4b, 0x11, 0x57, 0x25, 0x7b, 0xd7, 0x53, 0x10, 0x92,
+ 0xc2, 0x37, 0x9f, 0xd6, 0x4c, 0x03, 0x65, 0x0a, 0x42, 0x6b, 0x4d, 0x05,
+ 0x92, 0xa9, 0xba, 0x3e, 0x3b, 0xac, 0xd0, 0x67, 0x71, 0xe6, 0xf1, 0xb0,
+ 0x35, 0x6b, 0x30, 0x7f, 0xe3, 0x90, 0xe8, 0x1f, 0x3d, 0x17, 0x1d, 0xef,
+ 0xc7, 0xac, 0x2b, 0x3c, 0x73, 0x36, 0x74, 0x69, 0x7b, 0x11, 0x4a, 0xcd,
+ 0xdb, 0x12, 0x63, 0x3e, 0xe6, 0x3d, 0xa5, 0x13, 0x05, 0x93, 0xf8, 0x91,
+ 0x15, 0x6c, 0xbb, 0xd2, 0x61, 0x30, 0x0d, 0x0d, 0x79, 0x0a, 0x1a, 0x71,
+ 0xae, 0xf2, 0x4a, 0x83, 0xb2, 0x4e, 0xb5, 0x83, 0xab, 0xb7, 0x3d, 0xce,
+ 0xd0, 0xa7, 0x43, 0x1c, 0x67, 0x5c, 0x14, 0xd1, 0x31, 0x7f, 0xb2, 0x31,
+ 0x8f, 0xb3, 0xe5, 0x2c, 0x1b, 0x52, 0xf6, 0xac, 0xc8, 0xb2, 0x84, 0x4b,
+ 0xe2, 0x6f, 0x01, 0xb7, 0x96, 0x5f, 0xd9, 0xa3, 0xf4, 0x11, 0xdf, 0xb6,
+ 0x7e, 0xd9, 0xb7, 0x10, 0x9a, 0xf6, 0x04, 0x0d, 0x7f, 0x18, 0x82, 0x56,
+ 0xa6, 0x24, 0xa4, 0xfb, 0x26, 0xff, 0xa3, 0x39, 0xd1, 0xbd, 0xc9, 0x0a,
+ 0x6d, 0x1d, 0x9e, 0x1d, 0x2c, 0x75, 0xa2, 0x37, 0x92, 0x5e, 0x68, 0xb9,
+ 0x80, 0x4d, 0x9f, 0xc0, 0x3c, 0x86, 0xc9, 0xed, 0x46, 0xaf, 0xd4, 0x41,
+ 0xe2, 0xb4, 0xdf, 0x50, 0x94, 0x4f, 0x7a, 0xf2, 0xf9, 0x66, 0xf1, 0x76,
+ 0xca, 0xc9, 0x28, 0xf1, 0xb0, 0x8d, 0x8b, 0x90, 0xce, 0x8b, 0x91, 0xda,
+ 0xe2, 0x88, 0x53, 0xd6, 0x5a, 0x44, 0x5b, 0x49, 0x67, 0x21, 0x9a, 0x86,
+ 0xf3, 0x8f, 0xdf, 0xe2, 0xdf, 0x79, 0x88, 0xde, 0xc7, 0x53, 0x5a, 0x31,
+ 0x53, 0x7b, 0x0d, 0x54, 0x9b, 0x21, 0xc1, 0xc0, 0x49, 0xd0, 0x4b, 0xc8,
+ 0x14, 0x05, 0x95, 0xb5, 0x1e, 0xd7, 0xe4, 0xf7, 0xaf, 0x1c, 0x16, 0x08,
+ 0x08, 0xab, 0xce, 0x84, 0xb1, 0x9f, 0xcc, 0x6f, 0xef, 0x5f, 0x30, 0x70,
+ 0x84, 0x6c, 0xfd, 0xe1, 0xa7, 0x1c, 0xae, 0x99, 0x00, 0x15, 0xe7, 0x0f,
+ 0x5f, 0x9a, 0x08, 0x51, 0x5e, 0x02, 0xc6, 0xde, 0xd4, 0x4b, 0xe0, 0xf4,
+ 0xf8, 0x3c, 0x89, 0x71, 0x7a, 0x9f, 0x23, 0x16, 0x86, 0xd5, 0xe7, 0x5c,
+ 0x9d, 0xde, 0x98, 0xdd, 0x5c, 0x54, 0x94, 0x96, 0x18, 0x05, 0x96, 0xa0,
+ 0x1d, 0x34, 0x13, 0xef, 0xc6, 0x92, 0x48, 0x7a, 0x79, 0x85, 0xe1, 0x32,
+ 0xf8, 0x84, 0xc1, 0xca, 0x3e, 0xad, 0x6b, 0xf6, 0x45, 0x89, 0x3f, 0x4d,
+ 0x25, 0xf9, 0x24, 0x03, 0xad, 0x85, 0xac, 0x75, 0x47, 0x44, 0xff, 0x33,
+ 0x24, 0xcd, 0x01, 0xcc, 0xe4, 0xd3, 0x08, 0xde, 0x68, 0x56, 0xa2, 0x0e,
+ 0x22, 0xab, 0x83, 0xe8, 0x03, 0x0e, 0x5e, 0xee, 0xb9, 0x2e, 0x24, 0x2f,
+ 0x55, 0xa1, 0x1f, 0x83, 0xb0, 0x4a, 0x4c, 0xaf, 0x4b, 0x2c, 0x71, 0x0c,
+ 0x2c, 0x84, 0xac, 0xa2, 0xa0, 0xfc, 0x83, 0x6f, 0x24, 0xa8, 0x04, 0x72,
+ 0xf0, 0x6b, 0xb8, 0x84, 0xfa, 0x82, 0x2c, 0x29, 0x9b, 0xd6, 0xbb, 0x47,
+ 0x2c, 0x19, 0x74, 0x82, 0x01, 0x4b, 0x3e, 0x7b, 0x32, 0x7a, 0xb6, 0x6f,
+ 0x2d, 0x58, 0x16, 0xd0, 0x45, 0x3e, 0x98, 0xce, 0x86, 0x9d, 0x25, 0xab,
+ 0x42, 0x94, 0x43, 0x91, 0x73, 0xef, 0x4d, 0x75, 0xf3, 0x36, 0x8a, 0x8f,
+ 0xcc, 0xa7, 0x19, 0xe0, 0x5c, 0x25, 0xda, 0x91, 0x1c, 0x59, 0x84, 0x65,
+ 0x28, 0xc2, 0x01, 0xd1, 0xaa, 0x79, 0x1f, 0x00, 0x6e, 0x21, 0x11, 0x73,
+ 0x95, 0xbe, 0xcd, 0x72, 0x38, 0xf0, 0xc2, 0xf9, 0xbf, 0x0f, 0xbb, 0x1e,
+ 0x05, 0x9e, 0x00, 0x9c, 0x4d, 0x4b, 0xcf, 0x36, 0xc2, 0x9b, 0xcd, 0xa0,
+ 0xb7, 0x4b, 0x88, 0x15, 0x76, 0x18, 0xcc, 0x76, 0xe7, 0x11, 0x27, 0x04,
+ 0xea, 0x43, 0x92, 0xd6, 0xe6, 0x7d, 0x11, 0xb3, 0x21, 0x3d, 0xff, 0xea,
+ 0x7d, 0x22, 0x22, 0x6c, 0x18, 0x96, 0x54, 0x35, 0x80, 0xd1, 0x0c, 0x29,
+ 0x72, 0x96, 0x8e, 0x26, 0xe0, 0x12, 0x5f, 0xc1, 0x06, 0x1e, 0xaf, 0xf1,
+ 0x42, 0x1f, 0x09, 0xad, 0x3d, 0x09, 0x06, 0x1b, 0x28, 0x3e, 0xaa, 0x27,
+ 0x21, 0xf6, 0x20, 0x78, 0x9c, 0x69, 0x92, 0x1f, 0x78, 0x75, 0x1d, 0x66,
+ 0x89, 0x25, 0x22, 0x35, 0x5f, 0x05, 0xf6, 0xb2, 0x98, 0xa0, 0xd1, 0xd8,
+ 0x4b, 0xa8, 0x98, 0x29, 0x90, 0x97, 0x1f, 0xfc, 0xc3, 0xd6, 0xb9, 0x5d,
+ 0x8f, 0xa2, 0x87, 0xcc, 0xfe, 0x80, 0xcf, 0x67, 0xe7, 0x12, 0xae, 0xd6,
+ 0x57, 0x0d, 0x59, 0xfe, 0xaf, 0x8d, 0x40, 0x04, 0x1a, 0xcb, 0x1d, 0x01,
+ 0x48, 0x83, 0xfa, 0x0d, 0xbe, 0xc5, 0xc4, 0xcf, 0xb3, 0xf2, 0x7e, 0x7b,
+ 0x18, 0x0d, 0x7c, 0x8c, 0x2e, 0xbe, 0x54, 0xe4, 0x02, 0x32, 0x0d, 0x0f,
+ 0x9c, 0x34, 0xb0, 0xff, 0x5d, 0x6b, 0x75, 0x52, 0xa7, 0x58, 0xcc, 0x96,
+ 0x29, 0x11, 0x13, 0x2e, 0x97, 0x74, 0x4e, 0x7e, 0x52, 0xe7, 0x5d, 0x8c,
+ 0xf9, 0x6a, 0x52, 0xef, 0xbc, 0x7d, 0x41, 0x28, 0xef, 0x2c, 0x09, 0xf3,
+ 0xb6, 0x51, 0xcd, 0xcc, 0x6b, 0x41, 0x1e, 0x0b, 0x91, 0xda, 0xbd, 0x08,
+ 0x7f, 0x82, 0x59, 0x01, 0xfc, 0x1d, 0xe9, 0xb1, 0x6d, 0xbb, 0x5d, 0x90,
+ 0xa1, 0x60, 0xde, 0xa7, 0xd5, 0x9d, 0x9e, 0x8f, 0x24, 0xd7, 0x07, 0x0d,
+ 0xbc, 0xb4, 0x09, 0xfd, 0x40, 0xdd, 0x9f, 0x5f, 0xd3, 0xb8, 0x64, 0xb1,
+ 0x9a, 0x36, 0xe5, 0xc5, 0x2d, 0x8f, 0x96, 0xf3, 0x1e, 0xdc, 0x14, 0x17,
+ 0xa4, 0x79, 0x23, 0xe5, 0x38, 0xae, 0x1f, 0x4f, 0xa5, 0x77, 0xa9, 0x2b,
+ 0x85, 0x8d, 0x64, 0x1b, 0x65, 0x9b, 0x47, 0x3b, 0xb4, 0x65, 0xf8, 0x18,
+ 0xac, 0xab, 0xd3, 0x7c, 0x02, 0x8b, 0x77, 0x4d, 0x1e, 0x19, 0xcb, 0x28,
+ 0xb3, 0x2d, 0xd6, 0x9f, 0x5c, 0x54, 0xda, 0xb0, 0x69, 0xec, 0x90, 0x55,
+ 0x65, 0x93, 0x91, 0x4f, 0x00, 0xf2, 0x98, 0x66, 0xa6, 0x38, 0x8f, 0x9f,
+ 0xb7, 0x6a, 0xaf, 0x99, 0x88, 0x90, 0x14, 0xee, 0xef, 0x1f, 0x20, 0x45,
+ 0x68, 0xf3, 0x46, 0x00, 0x32, 0x8e, 0x0f, 0xc4, 0x7f, 0xee, 0xd8, 0x3d,
+ 0x09, 0xd5, 0x3e, 0xbd, 0xc4, 0xa0, 0x5b, 0x63, 0x39, 0x56, 0x8f, 0x6b,
+ 0x69, 0xe8, 0xbf, 0x6b, 0x59, 0xc3, 0x4f, 0xda, 0x52, 0x63, 0x86, 0xf2,
+ 0x5b, 0x4f, 0xea, 0x03, 0xdf, 0xd6, 0x53, 0x3f, 0x08, 0x4f, 0xe4, 0xd6,
+ 0xcc, 0x24, 0x26, 0x7e, 0x8e, 0x81, 0x88, 0xdd, 0xfc, 0xbb, 0xb9, 0xef,
+ 0x21, 0xa4, 0xf1, 0xef, 0xa8, 0x93, 0xd3, 0x09, 0x9e, 0x71, 0x32, 0xdc,
+ 0x2b, 0x6a, 0x11, 0xac, 0x01, 0xb7, 0xf3, 0x18, 0x25, 0xe3, 0x44, 0x3e,
+ 0xf8, 0xa5, 0xfd, 0x65, 0xaa, 0xb1, 0xe1, 0x31, 0xaa, 0x06, 0x59, 0x69,
+ 0xaf, 0x3a, 0x9b, 0x81, 0x1b, 0xdc, 0xdf, 0x1f, 0x71, 0x9a, 0x62, 0x0e,
+ 0x01, 0xb8, 0xcc, 0xa3, 0x2a, 0x20, 0x3e, 0x56, 0xc8, 0xd0, 0x57, 0x87,
+ 0xc6, 0x1b, 0x4a, 0xa9, 0x6e, 0x24, 0x74, 0x5d, 0xbd, 0x71, 0xa0, 0x05,
+ 0xd4, 0x3f, 0xba, 0x7b, 0xc9, 0x3d, 0xa4, 0x78, 0xdd, 0xbc, 0xdf, 0xee,
+ 0x1c, 0xad, 0x80, 0x40, 0x0e, 0xcb, 0x2d, 0xf7, 0x47, 0xd4, 0x83, 0x29,
+ 0x78, 0x1e, 0x0a, 0x2a, 0xb0, 0xf6, 0xe8, 0x85, 0x61, 0x72, 0x52, 0xe3,
+ 0x87, 0x15, 0xcf, 0xa5, 0xaf, 0x26, 0x97, 0x1a, 0x8b, 0x13, 0xbb, 0x7a,
+ 0x4e, 0xde, 0xc7, 0x26, 0x8c, 0xe0, 0x1b, 0x34, 0xad, 0x86, 0xc5, 0x97,
+ 0xef, 0xbd, 0xd3, 0x0b, 0x5a, 0xa0, 0xd9, 0x0b, 0xce, 0xd7, 0x8c, 0x65,
+ 0xb1, 0xf3, 0x4f, 0xc4, 0x63, 0x15, 0x47, 0x38, 0x6e, 0x9c, 0x8a, 0x84,
+ 0x30, 0x98, 0x93, 0xe3, 0xb1, 0xb0, 0x46, 0x9b, 0xa5, 0xc7, 0xa8, 0x72,
+ 0x83, 0xe8, 0xcd, 0x25, 0x1f, 0x41, 0xcc, 0xaa, 0x75, 0x0e, 0x3d, 0xc4,
+ 0x43, 0xbf, 0xb4, 0x32, 0x18, 0x90, 0x48, 0x38, 0x94, 0x7d, 0xae, 0xdb,
+ 0x5a, 0xb9, 0x39, 0x75, 0x41, 0x62, 0x73, 0xc4, 0x44, 0x26, 0xe6, 0x93,
+ 0x9c, 0xb4, 0x69, 0xda, 0x0e, 0x81, 0x7a, 0x3a, 0x28, 0x94, 0xea, 0x46,
+ 0x48, 0x8f, 0x83, 0x27, 0x75, 0x90, 0x19, 0x02, 0x32, 0x93, 0xe1, 0xc0,
+ 0x18, 0x80, 0x84, 0xa3, 0xd0, 0xf3, 0x8b, 0x4f, 0x27, 0x1e, 0x29, 0x17,
+ 0xd4, 0xc8, 0x7e, 0x6f, 0xb7, 0xc6, 0x4f, 0xb3, 0x91, 0xd3, 0x44, 0xb5,
+ 0xa6, 0xa6, 0x52, 0x39, 0x0a, 0x3a, 0xe5, 0xdf, 0xff, 0x4f, 0x15, 0x79,
+ 0x97, 0x03, 0xe5, 0xfd, 0xd6, 0x80, 0x6d, 0xfc, 0x66, 0x0b, 0x53, 0xde,
+ 0xdb, 0x4e, 0x85, 0x3b, 0x0e, 0xf8, 0xcb, 0x17, 0xf0, 0x91, 0xc6, 0xb5,
+ 0xfe, 0x09, 0xd0, 0xb7, 0x37, 0xbd, 0xdf, 0x53, 0x66, 0x90, 0x74, 0xe9,
+ 0x37, 0x96, 0xde, 0x98, 0x94, 0xf5, 0xc8, 0x94, 0xb5, 0xba, 0x70, 0xfe,
+ 0x89, 0xa2, 0x1e, 0x49, 0xb3, 0x8c, 0xd8, 0x9f, 0x0b, 0x8e, 0x6e, 0x5d,
+ 0x22, 0x81, 0x64, 0xe0, 0x33, 0xb8, 0xb0, 0x9b, 0x85, 0x78, 0x6a, 0xbc,
+ 0x99, 0xb4, 0xdc, 0x19, 0x00, 0x3b, 0x5d, 0x41, 0x54, 0x86, 0x98, 0x44,
+ 0xd7, 0x3a, 0x8f, 0xf9, 0x16, 0x6e, 0x70, 0x50, 0xc0, 0x01, 0xfe, 0xe1,
+ 0x08, 0x01, 0x04, 0xbe, 0x55, 0xab, 0xcf, 0x29, 0xa5, 0xb5, 0xfa, 0x90,
+ 0x2c, 0x98, 0xf0, 0xd7, 0xd5, 0xaa, 0x07, 0xd4, 0x19, 0xf4, 0xd2, 0x7c,
+ 0xbb, 0xc3, 0x8a, 0x6b, 0x2c, 0x89, 0xf0, 0x10, 0xa6, 0xb6, 0x51, 0xc9,
+ 0x92, 0x23, 0xa1, 0x22, 0x93, 0x97, 0xce, 0xd2, 0xd5, 0xb6, 0x3e, 0x1b,
+ 0x4a, 0x80, 0x6f, 0xac, 0x11, 0xca, 0x14, 0x73, 0xb5, 0xcb, 0xd9, 0x50,
+ 0xe3, 0x42, 0x6e, 0x8e, 0xe3, 0x3a, 0x7c, 0x30, 0x3e, 0x83, 0xec, 0x68,
+ 0x2c, 0x22, 0x16, 0x07, 0xaa, 0xc1, 0x72, 0xe1, 0xbd, 0x07, 0x58, 0xfe,
+ 0xc3, 0xbc, 0x9e, 0xf0, 0x74, 0xc6, 0x89, 0x85, 0x9e, 0x85, 0xc4, 0xec,
+ 0x99, 0xf7, 0x3c, 0xc9, 0x94, 0xdf, 0xb5, 0xc2, 0xf2, 0xb5, 0x6b, 0xa9,
+ 0x33, 0x0b, 0x01, 0x92, 0xfd, 0x20, 0x35, 0xa0, 0x37, 0x01, 0x85, 0xae,
+ 0x8d, 0xa1, 0x3e, 0x13, 0x12, 0x65, 0xa8, 0x13, 0xe6, 0x08, 0xfa, 0xbf,
+ 0x33, 0xf5, 0xc1, 0x6d, 0xf8, 0x33, 0x22, 0x79, 0xcb, 0x40, 0xb4, 0xe5,
+ 0xfe, 0xfc, 0xbe, 0x39, 0x25, 0xf7, 0x40, 0x96, 0xa7, 0xfd, 0x05, 0x97,
+ 0x93, 0x82, 0xc1, 0xa4, 0xa8, 0x74, 0xdd, 0xbb, 0xb4, 0x6d, 0x8a, 0x21,
+ 0xc9, 0xe8, 0x7e, 0x4b, 0x2c, 0x46, 0x06, 0x49, 0xa3, 0x1b, 0xbb, 0x85,
+ 0x66, 0x35, 0x61, 0x50, 0x2e, 0x45, 0x89, 0x0d, 0x32, 0xeb, 0xf3, 0xc1,
+ 0xec, 0x20, 0xc7, 0xf5, 0xce, 0x56, 0x35, 0x3d, 0x00, 0x48, 0xff, 0xa6,
+ 0x93, 0xc1, 0x37, 0xdf, 0x8a, 0xb0, 0x14, 0x39, 0x52, 0xfc, 0x62, 0x0e,
+ 0xc4, 0xf9, 0xc6, 0xe3, 0xb6, 0xa3, 0x7b, 0xb0, 0xf6, 0x71, 0x5c, 0x99,
+ 0x82, 0xd8, 0x51, 0x3c, 0x6d, 0x4e, 0x1f, 0x21, 0xd5, 0xd4, 0x39, 0x42,
+ 0x5a, 0xea, 0xcb, 0x13, 0x86, 0xfc, 0x78, 0xca, 0x3d, 0xaa, 0x42, 0x3c,
+ 0xdb, 0x41, 0x72, 0x07, 0x36, 0x45, 0xe3, 0xb1, 0xc0, 0x79, 0xda, 0x72,
+ 0x4f, 0xff, 0x6b, 0x72, 0x59, 0xee, 0xe0, 0x3b, 0x98, 0xf1, 0x0f, 0x9a,
+ 0x3d, 0x6f, 0x7b, 0x30, 0x36, 0x99, 0x11, 0xf3, 0x03, 0xa8, 0xcd, 0xaf,
+ 0x9c, 0xe4, 0x8b, 0x40, 0xc8, 0x3c, 0xc0, 0xbf, 0x17, 0x80, 0xbf, 0xc5,
+ 0x4b, 0x1f, 0xf9, 0x46, 0x78, 0xd0, 0xe6, 0x72, 0x73, 0xd6, 0xee, 0x27,
+ 0x47, 0x60, 0xe5, 0xe9, 0x09, 0x14, 0xfd, 0x56, 0xad, 0xf8, 0x7e, 0x34,
+ 0x98, 0xd1, 0x1e, 0xce, 0xd5, 0x16, 0x80, 0x3f, 0x47, 0xc4, 0x6e, 0xe3,
+ 0x7c, 0x63, 0x55, 0x20, 0xcf, 0x66, 0x42, 0x3d, 0xbd, 0x88, 0x95, 0x0a,
+ 0x2b, 0xd9, 0x63, 0xd2, 0x7b, 0xdd, 0x39, 0xb2, 0x79, 0xfd, 0xe8, 0xa8,
+ 0x94, 0x27, 0x3e, 0x7a, 0x50, 0x4b, 0x6f, 0x37, 0x6f, 0x0b, 0x11, 0x5c,
+ 0xb5, 0xfa, 0x23, 0xf2, 0xda, 0xce, 0x62, 0x4e, 0x1e, 0xb5, 0xdb, 0x16,
+ 0x37, 0x1e, 0x85, 0xde, 0x19, 0x05, 0x61, 0xcd, 0x8b, 0x77, 0xc1, 0x44,
+ 0x57, 0x34, 0x4e, 0x61, 0x79, 0x2b, 0xd7, 0xe7, 0x63, 0x57, 0x1d, 0x46,
+ 0x6c, 0x82, 0x9e, 0xc8, 0xb4, 0x84, 0xa7, 0x9f, 0x1c, 0x30, 0x7e, 0x0b,
+ 0x96, 0xd3, 0x1e, 0x50, 0x55, 0xea, 0x95, 0x02, 0xe6, 0xc1, 0x44, 0xb9,
+ 0x2b, 0x9d, 0x47, 0x77, 0x0a, 0xf2, 0x42, 0x0d, 0x33, 0x07, 0x12, 0x96,
+ 0x2d, 0x6f, 0x60, 0xa4, 0xcc, 0x23, 0x73, 0x53, 0x5f, 0xc8, 0x42, 0xba,
+ 0xa8, 0x73, 0x68, 0x2e, 0xef, 0x17, 0xd9, 0x99, 0x11, 0x8f, 0x0b, 0x48,
+ 0xe0, 0x6d, 0x4c, 0xea, 0xc4, 0x68, 0x57, 0x23, 0x2b, 0x47, 0x2d, 0x1a,
+ 0xe8, 0x00, 0x0f, 0x66, 0xf4, 0xa9, 0x1a, 0x65, 0xfa, 0x58, 0xc2, 0xb0,
+ 0x84, 0x2d, 0x47, 0xaa, 0x66, 0xa5, 0x2b, 0x98, 0xe8, 0x0c, 0x12, 0xc8,
+ 0xa4, 0x7f, 0x02, 0xca, 0x30, 0x2c, 0x7f, 0x4e, 0xf2, 0xd5, 0x1a, 0x1c,
+ 0xe4, 0xa6, 0x96, 0xff, 0x0d, 0x18, 0x12, 0x51, 0x92, 0x87, 0xb1, 0x0b,
+ 0x15, 0x04, 0x25, 0xd4, 0xf5, 0x47, 0xfd, 0xb9, 0x3c, 0x97, 0xb5, 0xd1,
+ 0xa4, 0x04, 0x51, 0xca, 0x6a, 0x9c, 0xf9, 0x07, 0x42, 0xf3, 0xa7, 0x48,
+ 0xf6, 0x62, 0x12, 0xe3, 0x21, 0x61, 0x78, 0x89, 0xd5, 0xbf, 0x00, 0xea,
+ 0xe3, 0x04, 0xb6, 0xd4, 0xbf, 0xe5, 0x92, 0xed, 0xa7, 0x3a, 0x47, 0xc2,
+ 0x77, 0x2d, 0x30, 0x60, 0x50, 0x69, 0xb3, 0x0f, 0x45, 0x32, 0x28, 0x25,
+ 0x59, 0x62, 0xf5, 0x36, 0x8c, 0x0b, 0xc1, 0xfb, 0xe6, 0x4b, 0x65, 0x90,
+ 0x3c, 0x25, 0x8d, 0xb8, 0x51, 0xd3, 0x94, 0xbe, 0xf8, 0x3f, 0xa5, 0xce,
+ 0xb7, 0x2f, 0x4e, 0xbe, 0x95, 0xf0, 0xb7, 0x79, 0xa8, 0xcb, 0xb3, 0x3c,
+ 0x31, 0xf9, 0xe7, 0x8d, 0x00, 0xd8, 0xc7, 0xf6, 0xca, 0x1d, 0xe1, 0x0b,
+ 0xa5, 0x92, 0x38, 0x80, 0xd2, 0x9f, 0x89, 0x6c, 0x66, 0x68, 0x3a, 0x03,
+ 0x11, 0x44, 0x41, 0x16, 0xc9, 0xa5, 0x13, 0x87, 0xcb, 0x13, 0x43, 0x4b,
+ 0x0c, 0x85, 0x0e, 0x7a, 0x01, 0x2a, 0xab, 0xc1, 0xf7, 0x6e, 0xe6, 0x61,
+ 0x84, 0xdb, 0xb4, 0x27, 0x6f, 0xc2, 0x90, 0x98, 0x3a, 0x12, 0xc8, 0x80,
+ 0x80, 0x64, 0x63, 0x1a, 0x14, 0x95, 0x8a, 0x68, 0x9d, 0xdb, 0x80, 0x8f,
+ 0xd6, 0x96, 0x51, 0xb4, 0x4d, 0x93, 0x10, 0xe2, 0xda, 0xec, 0x4a, 0xd9,
+ 0xb4, 0x8d, 0x80, 0x6f, 0xf1, 0x6c, 0x90, 0x46, 0x0c, 0x6b, 0xc2, 0x7a,
+ 0x5c, 0xd7, 0xa9, 0x06, 0x39, 0x40, 0xff, 0xfa, 0x23, 0xe5, 0x97, 0x38,
+ 0x48, 0xba, 0x82, 0x6d, 0xc7, 0x7d, 0xa4, 0x17, 0xe7, 0x61, 0x18, 0xf1,
+ 0x99, 0xa7, 0xc1, 0x2f, 0x4f, 0x5a, 0x88, 0xfd, 0x74, 0xe2, 0xaa, 0xa2,
+ 0xa3, 0x62, 0xf0, 0x62, 0x36, 0x2a, 0x9a, 0x76, 0x92, 0xed, 0x86, 0xc0,
+ 0x10, 0xc4, 0xe0, 0xa7, 0xa4, 0x2f, 0x5f, 0x8a, 0xbd, 0xfa, 0x10, 0x90,
+ 0x1b, 0xd4, 0xb1, 0xb6, 0xe7, 0x6a, 0xc2, 0xa6, 0xa3, 0xda, 0x66, 0xc9,
+ 0x5b, 0xbd, 0x83, 0x6c, 0xe8, 0xfe, 0x70, 0x8f, 0x55, 0x48, 0x8a, 0x81,
+ 0x6d, 0x2a, 0x7a, 0xfa, 0xcd, 0xd0, 0x08, 0x0c, 0xa7, 0x96, 0x33, 0xd3,
+ 0x46, 0x01, 0xe4, 0x3a, 0x05, 0x4f, 0xf3, 0x76, 0x1f, 0xcd, 0x66, 0xb7,
+ 0x2d, 0xda, 0x26, 0x84, 0x8c, 0x71, 0x36, 0x05, 0x5a, 0x21, 0xc8, 0xb0,
+ 0xc0, 0x34, 0x2e, 0xcd, 0x1d, 0xae, 0x47, 0x36, 0xfd, 0xbd, 0x9d, 0x51,
+ 0x5d, 0xb0, 0xfb, 0x0c, 0xff, 0x9c, 0xe1, 0xbc, 0xa1, 0x95, 0xa5, 0x5e,
+ 0xb0, 0x34, 0x1a, 0xdb, 0xce, 0x3c, 0x66, 0x86, 0x65, 0xf3, 0x9f, 0x86,
+ 0xb6, 0x54, 0x88, 0x4a, 0x07, 0x15, 0x51, 0x7c, 0x74, 0xea, 0x3b, 0x69,
+ 0xb5, 0x46, 0x7e, 0xa5, 0xed, 0x02, 0x81, 0x7c, 0x44, 0x3b, 0xab, 0xea,
+ 0x31, 0xbc, 0x3e, 0xe3, 0xf3, 0xef, 0xb1, 0xbe, 0xa6, 0x53, 0xec, 0xd5,
+ 0xc8, 0x95, 0x2a, 0x23, 0xb7, 0x3e, 0xb0, 0xa2, 0xa5, 0x77, 0x8c, 0x58,
+ 0xa8, 0x65, 0x4f, 0x83, 0x14, 0x79, 0xd6, 0x1c, 0xdd, 0xf5, 0x57, 0x45,
+ 0x79, 0xf5, 0x81, 0x4a, 0xe7, 0xec, 0x96, 0x10, 0x8c, 0x85, 0x2c, 0x51,
+ 0x09, 0x4d, 0x94, 0x7d, 0xd3, 0x14, 0x35, 0xc5, 0x62, 0x66, 0xb1, 0xf3,
+ 0x0e, 0x0f, 0x76, 0x80, 0x06, 0x58, 0x26, 0x67, 0xcb, 0x97, 0xfa, 0x97,
+ 0x3a, 0xf0, 0x8e, 0x02, 0x13, 0x07, 0x1f, 0xcc, 0x48, 0x85, 0x1b, 0xef,
+ 0x7c, 0xe2, 0x7d, 0xd7, 0xbd, 0xaf, 0xd2, 0x08, 0x42, 0xf5, 0x17, 0xcd,
+ 0xa9, 0xa9, 0xe4, 0x86, 0x50, 0x94, 0x23, 0xb4, 0xa0, 0x03, 0xd5, 0xb5,
+ 0x0f, 0x30, 0x78, 0x2d, 0x0e, 0xe4, 0xf9, 0xfb, 0xbb, 0x3d, 0x02, 0x1e,
+ 0x91, 0xdb, 0x1e, 0x19, 0xbf, 0x14, 0x95, 0x92, 0x45, 0x65, 0xd0, 0xf7,
+ 0x5e, 0x54, 0x85, 0x76, 0x0b, 0x3a, 0x18, 0x6e, 0x57, 0xb5, 0xe9, 0x87,
+ 0xef, 0x10, 0x9f, 0x08, 0x13, 0xde, 0x6a, 0xeb, 0x57, 0x76, 0x52, 0xd9,
+ 0x69, 0x5b, 0x30, 0x8a, 0xb3, 0xf0, 0x7f, 0x22, 0x53, 0xc4, 0xb9, 0x56,
+ 0xb5, 0x05, 0x41, 0xbf, 0x43, 0xcf, 0xbc, 0x39, 0xbc, 0x04, 0x13, 0x16,
+ 0xd6, 0xad, 0x5b, 0x24, 0x28, 0xc2, 0x51, 0xf0, 0x0b, 0x2c, 0x31, 0xfd,
+ 0x72, 0x99, 0xce, 0x3a, 0xd9, 0xa6, 0x96, 0x64, 0x32, 0xe2, 0x70, 0xcb,
+ 0xbc, 0xea, 0x07, 0x22, 0xd5, 0xd7, 0x14, 0x1a, 0x6f, 0xf6, 0x54, 0x4d,
+ 0x60, 0x45, 0x6f, 0x71, 0x8c, 0x73, 0x30, 0x7f, 0x75, 0x08, 0x41, 0x61,
+ 0x1f, 0x22, 0xaf, 0x3d, 0x3c, 0x9d, 0x62, 0x69, 0x1e, 0x58, 0x92, 0x39,
+ 0x22, 0x29, 0x56, 0xbc, 0x02, 0xc0, 0xeb, 0xba, 0xab, 0x7f, 0xed, 0x5a,
+ 0xfa, 0xcb, 0x6e, 0xea, 0x26, 0x97, 0x86, 0x08, 0x7c, 0x9b, 0xf5, 0xab,
+ 0xf1, 0x23, 0x58, 0xcf, 0xe0, 0xeb, 0x01, 0x6d, 0x8f, 0xf5, 0x5e, 0x8f,
+ 0x12, 0xa8, 0xbd, 0xe4, 0xbb, 0x0f, 0xa0, 0xf9, 0xbe, 0xbd, 0xd9, 0x24,
+ 0x88, 0x13, 0xa6, 0x5b, 0x5f, 0x2d, 0x1e, 0x13, 0xd5, 0x3a, 0xcc, 0x69,
+ 0x4a, 0x96, 0x5b, 0xf3, 0xb4, 0xde, 0xd4, 0x41, 0x62, 0x2e, 0x65, 0xdf,
+ 0x0d, 0xee, 0x06, 0xf3, 0x17, 0x07, 0x8d, 0x45, 0xfe, 0x57, 0xc8, 0x6c,
+ 0x8e, 0xfa, 0x9e, 0x24, 0x0d, 0x24, 0xfc, 0xff, 0x15, 0xba, 0x89, 0x9c,
+ 0x9c, 0x64, 0x06, 0x1f, 0xea, 0x7a, 0xf5, 0x9d, 0x41, 0x75, 0x15, 0x1f,
+ 0x58, 0x15, 0x7c, 0xbf, 0xa5, 0x2f, 0x88, 0xe4, 0x6c, 0x34, 0x08, 0xae,
+ 0x61, 0x05, 0x31, 0x2e, 0x36, 0xb6, 0x9c, 0xbb, 0x73, 0x61, 0x46, 0x84,
+ 0xee, 0x4c, 0x2b, 0xbd, 0x51, 0x61, 0x8d, 0x89, 0x0b, 0x7f, 0x2e, 0x42,
+ 0x9d, 0x2f, 0xf1, 0xd2, 0xae, 0x09, 0xd6, 0xf2, 0x59, 0x27, 0xe6, 0x64,
+ 0xfa, 0x54, 0xad, 0x83, 0x0f, 0xe0, 0x32, 0xc9, 0x13, 0xae, 0x75, 0x73,
+ 0xdf, 0x7a, 0x42, 0x47, 0xd8, 0xd2, 0x14, 0x56, 0x6c, 0x59, 0xe6, 0xd8,
+ 0x5b, 0x86, 0x82, 0x8e, 0xef, 0x5e, 0xaa, 0xa7, 0x99, 0x4e, 0x4d, 0x02,
+ 0x18, 0x13, 0x1e, 0xfa, 0x42, 0x11, 0x70, 0x55, 0x13, 0x97, 0x91, 0x20,
+ 0xf5, 0x98, 0xd3, 0xdf, 0xc2, 0x7b, 0x75, 0x74, 0x56, 0x77, 0x7c, 0x6b,
+ 0x9e, 0x8f, 0x55, 0x52, 0xad, 0xe8, 0x10, 0x02, 0x6a, 0xf7, 0xf5, 0xf9,
+ 0xc6, 0x3e, 0xd8, 0x28, 0x03, 0x33, 0xfd, 0xef, 0x3f, 0xb6, 0x40, 0x66,
+ 0x2d, 0xa6, 0x16, 0xbf, 0xee, 0x82, 0x13, 0x96, 0x0d, 0x46, 0xe8, 0x9a,
+ 0x9c, 0xdf, 0x98, 0x02, 0x58, 0xbb, 0x92, 0x55, 0x96, 0xb6, 0xde, 0x6e,
+ 0xaa, 0x49, 0xaf, 0x70, 0x84, 0x4d, 0xdc, 0x86, 0xe0, 0xd4, 0x60, 0x73,
+ 0xba, 0xcd, 0x84, 0x23, 0x43, 0xa2, 0x90, 0x68, 0xd7, 0x10, 0xc6, 0x88,
+ 0x5c, 0xea, 0xb3, 0x3b, 0x65, 0x45, 0x88, 0x05, 0x4a, 0x5f, 0x85, 0xbf,
+ 0xc1, 0xe9, 0xd1, 0x9f, 0xe8, 0x99, 0x47, 0xd3, 0x1c, 0x0d, 0x79, 0x49,
+ 0xe1, 0xb5, 0xe9, 0xcb, 0x24, 0x7b, 0xb4, 0x35, 0xd8, 0x35, 0x5c, 0xbf,
+ 0x58, 0xf1, 0xb9, 0x72, 0x55, 0xcb, 0x27, 0xc5, 0x43, 0xc9, 0x78, 0xce,
+ 0x49, 0x00, 0x2b, 0x9d, 0x55, 0x9d, 0xcf, 0xdd, 0x9c, 0xe7, 0xb8, 0xd8,
+ 0x91, 0x41, 0x74, 0xe8, 0x22, 0x65, 0xf1, 0x96, 0x41, 0x81, 0x6e, 0xad,
+ 0x66, 0x23, 0x71, 0x89, 0x65, 0x45, 0x9a, 0x1f, 0x1b, 0x43, 0x0f, 0xcd,
+ 0x4a, 0xd8, 0x6a, 0x2f, 0x48, 0x69, 0x50, 0x15, 0x6e, 0x67, 0x6b, 0x0a,
+ 0x0d, 0x29, 0x93, 0xe0, 0x1a, 0x68, 0x5f, 0x4c, 0xe2, 0x72, 0x59, 0x49,
+ 0x43, 0x49, 0x10, 0x71, 0x9c, 0xe0, 0x8d, 0x14, 0x8f, 0xac, 0xce, 0x1d,
+ 0xaf, 0xc7, 0x9c, 0x41, 0x9e, 0xb5, 0xe2, 0x61, 0x6b, 0x50, 0xbc, 0x83,
+ 0xb2, 0x4c, 0x05, 0x6e, 0x71, 0x6d, 0x63, 0xa5, 0x65, 0x87, 0xd5, 0x74,
+ 0x39, 0x16, 0xe9, 0xee, 0xc7, 0xc3, 0xec, 0x8c, 0x8c, 0x70, 0xb2, 0xa1,
+ 0x55, 0xee, 0xb3, 0xa3, 0x9f, 0x12, 0x02, 0x87, 0x30, 0xfc, 0x7e, 0x52,
+ 0xf8, 0x97, 0x82, 0x0a, 0x0f, 0x20, 0xd5, 0x8e, 0xfa, 0xe3, 0xa9, 0x17,
+ 0xa7, 0x9a, 0x65, 0x64, 0xbf, 0x66, 0x69, 0x2e, 0xe6, 0x7b, 0xd6, 0x9a,
+ 0x4b, 0x02, 0x10, 0x15, 0xb2, 0x60, 0x3a, 0x11, 0x9c, 0x4d, 0x87, 0xc6,
+ 0x70, 0x2d, 0x1b, 0xe8, 0xa9, 0xfc, 0xac, 0x91, 0x61, 0x94, 0x2f, 0x4a,
+ 0x55, 0x33, 0xfc, 0xd6, 0x73, 0x52, 0xee, 0x0f, 0xbc, 0x3b, 0xc0, 0x87,
+ 0x5a, 0x0b, 0x01, 0x97, 0x02, 0x13, 0x58, 0x77, 0x08, 0xf6, 0xe3, 0x3b,
+ 0xca, 0x22, 0x04, 0x82, 0x3f, 0x58, 0x7f, 0x98, 0xf2, 0x9b, 0xea, 0x0f,
+ 0x32, 0xf6, 0xa5, 0xf5, 0x21, 0x4e, 0x86, 0xfb, 0x76, 0x20, 0xb9, 0xea,
+ 0xee, 0xa2, 0x0a, 0x9f, 0x7b, 0x01, 0xe2, 0x17, 0xe1, 0x7b, 0x8f, 0x8a,
+ 0x92, 0xef, 0x06, 0x8d, 0x3c, 0x83, 0x71, 0x3f, 0x75, 0x10, 0xe7, 0x52,
+ 0xb7, 0x5b, 0xfb, 0x58, 0xc0, 0x8c, 0xe0, 0x33, 0x68, 0x1c, 0x07, 0xf2,
+ 0x55, 0x93, 0x2c, 0xb0, 0xb8, 0xb4, 0xa3, 0xef, 0x07, 0x11, 0xc0, 0x63,
+ 0x5a, 0x27, 0x87, 0x32, 0x2e, 0x88, 0x6f, 0xd6, 0x94, 0x94, 0xb4, 0x81,
+ 0x02, 0x16, 0x42, 0xe4, 0x0a, 0xd9, 0x71, 0x5f, 0x8a, 0xf4, 0xca, 0x9e,
+ 0x51, 0xd0, 0x23, 0x8a, 0x42, 0xd7, 0x39, 0xe7, 0x71, 0x3f, 0x41, 0x3d,
+ 0x7a, 0xd8, 0xd8, 0x23, 0xdb, 0xb3, 0x84, 0x55, 0x85, 0x05, 0x2e, 0xd1,
+ 0xcd, 0x4c, 0x5c, 0xff, 0xcb, 0xfb, 0xfc, 0x30, 0x59, 0x46, 0x0d, 0x16,
+ 0x49, 0x34, 0x09, 0x08, 0x27, 0x89, 0x5f, 0x77, 0x32, 0xce, 0x31, 0xf3,
+ 0xd0, 0x4c, 0x61, 0xe7, 0xc4, 0x56, 0x36, 0x46, 0x6b, 0xb5, 0xbb, 0x41,
+ 0x18, 0x71, 0xc9, 0x0d, 0x29, 0x56, 0x52, 0xf1, 0x37, 0x42, 0x8d, 0xf4,
+ 0xde, 0x1d, 0x42, 0xea, 0xde, 0x23, 0x88, 0xc1, 0x60, 0x0e, 0xaf, 0x79,
+ 0x42, 0x28, 0x1f, 0x5f, 0x53, 0x8a, 0x6f, 0x85, 0x99, 0x56, 0x41, 0x79,
+ 0xbe, 0x75, 0x3c, 0x70, 0xa9, 0x52, 0xf8, 0x88, 0x62, 0xf5, 0x06, 0x1b,
+ 0x19, 0x77, 0x24, 0x79, 0x83, 0x80, 0x6e, 0x61, 0x06, 0xbd, 0xc7, 0x36,
+ 0xf4, 0x4e, 0xc4, 0xb2, 0x4f, 0x6b, 0x68, 0x1d, 0xa6, 0xb1, 0xb1, 0xe1,
+ 0x37, 0x42, 0x53, 0x4c, 0xf4, 0x9c, 0x86, 0xb1, 0x06, 0x82, 0x90, 0x5d,
+ 0x84, 0xb3, 0xce, 0xd1, 0x1b, 0xf8, 0x60, 0xba, 0x8a, 0xdd, 0x7e, 0xf6,
+ 0x7f, 0xd1, 0xa4, 0xdb, 0x44, 0x0a, 0xef, 0xce, 0xd6, 0x6e, 0xc0, 0x12,
+ 0xf3, 0xee, 0xd3, 0x2e, 0x80, 0x53, 0xac, 0x0e, 0x22, 0xe0, 0x79, 0x9f,
+ 0x4d, 0x4f, 0xf7, 0xa8, 0x61, 0x55, 0xa0, 0x23, 0x36, 0xb6, 0x3b, 0xb4,
+ 0x11, 0x92, 0xdf, 0x1f, 0xe3, 0xb3, 0x80, 0xd0, 0x37, 0xe0, 0x16, 0x07,
+ 0x2c, 0xd7, 0xbe, 0x3b, 0x44, 0x40, 0xc2, 0xad, 0x59, 0xe3, 0x7e, 0x21,
+ 0xe6, 0x23, 0xf0, 0x7b, 0xa9, 0xba, 0x7e, 0x84, 0x7c, 0x02, 0x25, 0x5f,
+ 0x4a, 0xc5, 0x88, 0x3d, 0xab, 0xf0, 0xd0, 0xcf, 0xe7, 0xe9, 0x87, 0xd3,
+ 0x67, 0x04, 0x2e, 0x5d, 0x7a, 0x83, 0xc5, 0x54, 0x84, 0x1d, 0x0f, 0x96,
+ 0x1e, 0x99, 0x30, 0xb6, 0x89, 0xda, 0xba, 0x16, 0xa7, 0x42, 0xd4, 0xe7,
+ 0x04, 0xbe, 0x3a, 0x41, 0xc0, 0x8a, 0x98, 0xf5, 0x81, 0x21, 0xd3, 0xde,
+ 0xc7, 0x3b, 0xb7, 0x1f, 0x30, 0xe4, 0x34, 0x81, 0xfc, 0x23, 0x3b, 0xd6,
+ 0xe7, 0xe8, 0x17, 0x64, 0x5f, 0xae, 0xef, 0x02, 0x90, 0x56, 0x36, 0x1d,
+ 0x18, 0x6d, 0x45, 0x23, 0x15, 0x7f, 0x8f, 0x21, 0x0c, 0xa3, 0xaf, 0xf6,
+ 0xa5, 0xf3, 0x3b, 0xa1, 0x29, 0xf9, 0x19, 0x47, 0x2e, 0x1b, 0xbc, 0x92,
+ 0x4e, 0x5a, 0x37, 0xd5, 0xca, 0xe2, 0x6d, 0xe8, 0x9b, 0x56, 0x3e, 0x83,
+ 0xbb, 0xf7, 0x09, 0x37, 0x31, 0x5b, 0x60, 0xc4, 0xc5, 0x49, 0x0d, 0x2e,
+ 0xbe, 0x90, 0xa4, 0x12, 0x28, 0x13, 0x23, 0x0b, 0xa3, 0x08, 0x2d, 0x86,
+ 0x10, 0xb9, 0xef, 0x45, 0x1f, 0x4c, 0x84, 0xa5, 0xb5, 0xc5, 0x42, 0x7e,
+ 0x62, 0x8e, 0xd5, 0x96, 0x93, 0xed, 0xcf, 0xb0, 0x55, 0x1c, 0x84, 0xbc,
+ 0x5e, 0x41, 0x38, 0x3f, 0xe9, 0x1c, 0x2c, 0x1b, 0x4f, 0x7a, 0x52, 0x37,
+ 0xd0, 0xd2, 0x04, 0xeb, 0x1e, 0x06, 0xbb, 0xd0, 0x99, 0xda, 0x08, 0x25,
+ 0xf9, 0xc2, 0x4e, 0x53, 0xcf, 0x76, 0x6d, 0xf5, 0x57, 0x97, 0x6b, 0x46,
+ 0x3c, 0xbd, 0xe2, 0xec, 0xb4, 0x9a, 0xd1, 0x03, 0xe5, 0x44, 0x38, 0x4d,
+ 0x7c, 0x67, 0x30, 0x46, 0x8f, 0xc5, 0x3f, 0x4f, 0x46, 0x94, 0xd9, 0xc9,
+ 0x45, 0xac, 0x07, 0x36, 0xc4, 0x2a, 0x58, 0x70, 0x4a, 0x5c, 0xb9, 0xa0,
+ 0x0a, 0x61, 0xe5, 0xf2, 0xfb, 0xe2, 0x47, 0x45, 0xb5, 0x3a, 0xde, 0x96,
+ 0x9f, 0x21, 0xdf, 0xe7, 0x39, 0xed, 0xa6, 0x04, 0x0b, 0x80, 0x8a, 0x32,
+ 0x65, 0x63, 0xd5, 0x4f, 0x9c, 0x5d, 0x3c, 0x18, 0xbb, 0x20, 0x65, 0x29,
+ 0x24, 0xa8, 0xad, 0xca, 0x4e, 0x0f, 0xac, 0x75, 0xad, 0x3e, 0xc6, 0x26,
+ 0x3c, 0xc9, 0xd8, 0x91, 0x97, 0x16, 0x69, 0xd8, 0x77, 0x01, 0x16, 0x22,
+ 0x7f, 0xd6, 0x82, 0x47, 0x7f, 0xfd, 0x1c, 0x31, 0x20, 0x9f, 0xcd, 0x4e,
+ 0x90, 0xcf, 0x57, 0x78, 0xf7, 0x1d, 0x17, 0xe4, 0xa5, 0xb5, 0xe4, 0x33,
+ 0x7d, 0x06, 0x29, 0x58, 0x46, 0xf4, 0xcb, 0xf1, 0x7a, 0x74, 0x8f, 0xda,
+ 0x22, 0x83, 0x6f, 0x5b, 0x59, 0x09, 0x12, 0x7d, 0xa2, 0x64, 0x36, 0x01,
+ 0xee, 0x4e, 0xe1, 0x94, 0x1f, 0x7a, 0x3c, 0x05, 0x4c, 0x2a, 0x47, 0x4d,
+ 0x32, 0x7e, 0x5b, 0xcc, 0x86, 0x1d, 0xb7, 0x1d, 0xca, 0x48, 0xa0, 0x55,
+ 0x2f, 0x0e, 0x2d, 0x67, 0x54, 0xd6, 0x63, 0x7a, 0xb1, 0x7a, 0xae, 0x5c,
+ 0xfa, 0x08, 0x75, 0x8f, 0x45, 0x0d, 0x62, 0x99, 0xc0, 0xcb, 0x63, 0xe3,
+ 0x57, 0x22, 0xa9, 0xb2, 0xb2, 0x74, 0x75, 0xd3, 0xe6, 0x99, 0x18, 0x8e,
+ 0xfa, 0x26, 0x62, 0xb5, 0x01, 0xb0, 0xe9, 0x16, 0xb7, 0xe3, 0x17, 0x74,
+ 0x99, 0x00, 0x1a, 0xb6, 0x9f, 0xa6, 0x71, 0x6a, 0x56, 0x05, 0xc6, 0x1b,
+ 0xb1, 0x2a, 0xbd, 0x85, 0xe6, 0xdf, 0x1c, 0xa5, 0x26, 0x4a, 0xc1, 0xcd,
+ 0x0d, 0xbb, 0xa3, 0x60, 0xc3, 0x5f, 0x91, 0x5d, 0x90, 0x88, 0x1e, 0xe8,
+ 0x25, 0x4a, 0xb8, 0xbf, 0x88, 0xd8, 0xe6, 0xc6, 0x21, 0x87, 0x04, 0x89,
+ 0xdf, 0x95, 0x8c, 0x83, 0x70, 0x5b, 0x14, 0xd3, 0x98, 0x02, 0xaf, 0x2c,
+ 0xf0, 0x11, 0x62, 0x7b, 0x0d, 0xd2, 0xcd, 0x34, 0x8a, 0x57, 0x1d, 0x1e,
+ 0x2c, 0xe0, 0x6f, 0xd2, 0xd6, 0x50, 0x40, 0x65, 0x9e, 0x67, 0xd7, 0x74,
+ 0x58, 0xbc, 0x4d, 0x16, 0x3b, 0x54, 0xa1, 0x00, 0x3b, 0xb8, 0x1c, 0xce,
+ 0x2d, 0x01, 0x1b, 0x97, 0xe1, 0x67, 0x1a, 0xd4, 0xf7, 0xab, 0x6f, 0x42,
+ 0x2e, 0xa6, 0x72, 0x1e, 0x8a, 0x8c, 0xb3, 0xa5, 0x33, 0x80, 0xe6, 0xc0,
+ 0x1d, 0x43, 0x95, 0x84, 0x84, 0x6c, 0x72, 0x77, 0x5c, 0x70, 0xcc, 0x18,
+ 0xbd, 0x2f, 0xc0, 0x21, 0x23, 0xb4, 0x13, 0x93, 0x63, 0xde, 0x34, 0x0d,
+ 0xa0, 0x74, 0x26, 0xd4, 0x55, 0xfb, 0xdc, 0xf0, 0x59, 0xa8, 0xba, 0x07,
+ 0xc9, 0x21, 0xa8, 0x95, 0x52, 0xd0, 0xa0, 0x32, 0x23, 0x45, 0x6f, 0x00,
+ 0xf2, 0x80, 0xdd, 0x3a, 0xb2, 0xb9, 0x92, 0x7b, 0x6c, 0x5f, 0xa3, 0x34,
+ 0x60, 0x96, 0x2a, 0xff, 0x7e, 0x61, 0x73, 0x11, 0x1e, 0x29, 0xc5, 0xb5,
+ 0x45, 0xf3, 0xc6, 0x99, 0x6e, 0xfc, 0x79, 0x18, 0xe2, 0xb2, 0xbd, 0x75,
+ 0xd7, 0xeb, 0xdd, 0x57, 0x7c, 0x1b, 0xf0, 0x65, 0xd5, 0xd3, 0x9d, 0x9f,
+ 0xc9, 0x2a, 0x2f, 0xd8, 0xfb, 0xe2, 0x38, 0x2f, 0x20, 0x5e, 0xd2, 0x71,
+ 0x03, 0x8d, 0xbc, 0xff, 0x60, 0x2d, 0xa0, 0x1d, 0x18, 0x8a, 0x99, 0x4f,
+ 0xf1, 0x62, 0x94, 0xdb, 0xbc, 0xb1, 0xd8, 0xbf, 0xe0, 0x82, 0x33, 0x2c,
+ 0x51, 0x36, 0x38, 0xfd, 0x88, 0x46, 0x85, 0x1f, 0x5f, 0xb2, 0x5f, 0x20,
+ 0xd3, 0x85, 0xa8, 0xdf, 0x73, 0x1b, 0xe9, 0xb1, 0x3d, 0x3e, 0x15, 0x81,
+ 0xfc, 0xae, 0xdc, 0x1c, 0x44, 0x9e, 0xe6, 0x03, 0x47, 0x93, 0x22, 0x14,
+ 0x5b, 0xe7, 0x1e, 0xec, 0xee, 0xdc, 0x49, 0xb9, 0x11, 0x8b, 0x91, 0x02,
+ 0x85, 0x1f, 0xd0, 0xb6, 0x26, 0xb3, 0x16, 0x12, 0x85, 0x3d, 0xeb, 0xde,
+ 0x8f, 0xab, 0x74, 0xb7, 0x4a, 0xe8, 0xf2, 0x14, 0x26, 0x27, 0xfb, 0x4b,
+ 0x9a, 0xea, 0x97, 0xdc, 0x4a, 0x4a, 0x9b, 0xcf, 0x30, 0x5b, 0x00, 0x6a,
+ 0x2b, 0x7c, 0x55, 0xea, 0xb8, 0xfa, 0xa7, 0x77, 0xfa, 0x2e, 0xea, 0x91,
+ 0x92, 0x48, 0x16, 0x5e, 0xfa, 0x86, 0x6b, 0x76, 0xc2, 0xfc, 0x02, 0xf4,
+ 0x39, 0xeb, 0x9e, 0xdb, 0xbc, 0x53, 0x66, 0x27, 0x79, 0xa7, 0x1d, 0x40,
+ 0xc8, 0x19, 0xec, 0xfd, 0xf4, 0x71, 0x67, 0x27, 0x98, 0xf8, 0x63, 0xd1,
+ 0x90, 0xa5, 0x02, 0xfe, 0x60, 0x8c, 0x3e, 0xab, 0x13, 0x81, 0x76, 0x45,
+ 0x18, 0xa8, 0x81, 0x84, 0x25, 0x91, 0x16, 0x71, 0x5e, 0x0e, 0xd1, 0x2c,
+ 0xf2, 0x85, 0x06, 0xa8, 0x51, 0x92, 0xa8, 0x1a, 0x8e, 0xa3, 0x4b, 0xc6,
+ 0x3a, 0xea, 0x31, 0x9a, 0x0a, 0xc3, 0x7e, 0x3f, 0xf8, 0xd6, 0x00, 0x18,
+ 0xd1, 0xaa, 0x91, 0x0b, 0xc8, 0x5f, 0xde, 0x26, 0xba, 0x95, 0x02, 0x6e,
+ 0x92, 0xc8, 0x64, 0x23, 0xd5, 0x03, 0x20, 0x77, 0x6c, 0x78, 0xf3, 0xeb,
+ 0xe8, 0x31, 0xfc, 0x11, 0x61, 0x8a, 0x23, 0x4e, 0x18, 0x11, 0xe6, 0xe1,
+ 0x79, 0x6c, 0x65, 0xc5, 0x4b, 0x1f, 0xfb, 0x4f, 0x7b, 0xf9, 0xaf, 0xb2,
+ 0x7c, 0xbb, 0x9f, 0x1f, 0x5d, 0xec, 0x10, 0x94, 0x62, 0xe8, 0x50, 0x42,
+ 0xdd, 0x2a, 0x58, 0x10, 0x49, 0x7e, 0x85, 0x81, 0x9e, 0xc1, 0xa4, 0x64,
+ 0x6d, 0x9a, 0x6d, 0x32, 0xf7, 0x4d, 0x70, 0xd9, 0x0e, 0x0e, 0x3f, 0x76,
+ 0x2a, 0x7a, 0x8f, 0xea, 0xd9, 0xf7, 0xd8, 0x06, 0xd9, 0x32, 0x8f, 0x37,
+ 0x8f, 0xda, 0x5c, 0x02, 0x43, 0xad, 0x79, 0xda, 0xf8, 0xeb, 0x0c, 0x62,
+ 0x4f, 0x4c, 0x89, 0xef, 0xf0, 0x6c, 0xdc, 0x71, 0xbb, 0xea, 0xaa, 0x6c,
+ 0x34, 0x00, 0xa9, 0x38, 0xbd, 0xca, 0xda, 0xc5, 0x41, 0x41, 0xa5, 0x0b,
+ 0xd2, 0xa4, 0x4f, 0x2b, 0x4f, 0x84, 0xb9, 0x6d, 0xa3, 0xbd, 0xb9, 0xb5,
+ 0x6b, 0xcf, 0xdb, 0xa8, 0x15, 0xd7, 0xa7, 0xc3, 0x74, 0x47, 0x57, 0xa1,
+ 0xa7, 0x1e, 0x4e, 0xcd, 0xa0, 0x56, 0xd7, 0xfd, 0xc3, 0x12, 0xe9, 0xaf,
+ 0x2f, 0x4c, 0xa5, 0x76, 0xaa, 0xd3, 0x74, 0x19, 0xac, 0x71, 0xf2, 0xf7,
+ 0xf6, 0x26, 0x3d, 0x3f, 0x83, 0xb9, 0xf7, 0xec, 0x21, 0x6c, 0x8e, 0xe2,
+ 0x4d, 0x99, 0xd7, 0xf6, 0xca, 0xcd, 0x8d, 0xd6, 0x8f, 0x43, 0x78, 0xb2,
+ 0x2e, 0xdc, 0x7d, 0xf6, 0x39, 0x9d, 0x1b, 0xab, 0x13, 0x27, 0x51, 0x6a,
+ 0x31, 0xae, 0xf9, 0xec, 0x59, 0xbd, 0x85, 0x73, 0x53, 0xa6, 0x8e, 0x91,
+ 0x9a, 0xf1, 0x14, 0x84, 0x3b, 0xfa, 0x88, 0x5b, 0x32, 0x35, 0xe2, 0x66,
+ 0x55, 0x13, 0x5f, 0xef, 0x5c, 0x28, 0xfc, 0x59, 0x7c, 0x0b, 0x64, 0x58,
+ 0x6e, 0x4b, 0x4e, 0x10, 0x46, 0x28, 0x1f, 0x09, 0xaa, 0x17, 0x49, 0x84,
+ 0x25, 0x3b, 0x63, 0x2a, 0x24, 0xce, 0x4f, 0xea, 0xf9, 0xdc, 0xc9, 0x4b,
+ 0x15, 0xad, 0xe5, 0x2d, 0x1f, 0xb8, 0xc1, 0xae, 0x14, 0x39, 0x3c, 0x3a,
+ 0x63, 0x24, 0xcf, 0x62, 0xdb, 0xf8, 0x1f, 0x74, 0xa9, 0xff, 0x02, 0x76,
+ 0x87, 0x1f, 0x62, 0xa6, 0x8d, 0x43, 0x34, 0xe7, 0x7e, 0x80, 0xa1, 0x2f,
+ 0xf1, 0x82, 0x77, 0x49, 0x86, 0x73, 0x73, 0x77, 0x3a, 0xa3, 0xd7, 0xf1,
+ 0x01, 0x7b, 0xa4, 0xf0, 0xf8, 0x37, 0x64, 0x67, 0x6e, 0x98, 0x72, 0x96,
+ 0xc4, 0x33, 0xb7, 0xcd, 0x90, 0x19, 0x26, 0xf1, 0x96, 0xcf, 0x27, 0xae,
+ 0xef, 0x3d, 0x5f, 0xbb, 0x61, 0x56, 0x8f, 0x38, 0x7e, 0x57, 0x2b, 0xea,
+ 0x93, 0x88, 0x71, 0x1b, 0x7d, 0xd9, 0x8d, 0x0d, 0x96, 0x1b, 0x0c, 0x3b,
+ 0x6d, 0x66, 0x93, 0x75, 0x42, 0x96, 0xe5, 0xa5, 0xb9, 0xa2, 0xcc, 0xba,
+ 0x64, 0xec, 0x7c, 0x27, 0x59, 0xa8, 0x4d, 0xd0, 0x76, 0x56, 0x7b, 0x7c,
+ 0xc2, 0xa6, 0x19, 0x77, 0x54, 0x51, 0x83, 0xc8, 0xef, 0x2d, 0xaf, 0xeb,
+ 0x8d, 0xcb, 0xf9, 0xcb, 0x3e, 0xa8, 0xaa, 0x70, 0x3a, 0xe3, 0x26, 0x04,
+ 0xfe, 0xb1, 0x59, 0x85, 0x03, 0x24, 0x11, 0x33, 0x53, 0x5a, 0x0f, 0x5a,
+ 0x1a, 0x0f, 0xf6, 0x54, 0xc4, 0xdb, 0x43, 0x73, 0xec, 0x32, 0x22, 0x37,
+ 0xa5, 0xe7, 0x08, 0xeb, 0x69, 0x94, 0xd0, 0xed, 0xdc, 0x05, 0x07, 0x00,
+ 0x42, 0xdf, 0x01, 0x2b, 0x39, 0xd8, 0x3b, 0xbb, 0x57, 0x6a, 0xab, 0xb6,
+ 0xb4, 0x12, 0xc3, 0x32, 0x11, 0xf3, 0xdf, 0x81, 0x4e, 0x4e, 0x1f, 0x11,
+ 0x55, 0x26, 0x3a, 0x1d, 0x71, 0xd6, 0xbc, 0xbf, 0x33, 0x01, 0xc6, 0xa4,
+ 0x16, 0xce, 0x22, 0x13, 0xdb, 0xdb, 0x89, 0x32, 0x6d, 0x14, 0xed, 0xcb,
+ 0x1b, 0xf2, 0x85, 0x34, 0x2b, 0x60, 0x21, 0x6f, 0xb4, 0x80, 0x9b, 0x8f,
+ 0x84, 0x42, 0xf8, 0xd4, 0xc7, 0x28, 0x6a, 0x1f, 0x15, 0xee, 0x12, 0x04,
+ 0xd2, 0x7a, 0xb2, 0xdb, 0xa1, 0x85, 0x89, 0xbb, 0x73, 0x38, 0x5b, 0x95,
+ 0xe6, 0xb2, 0xda, 0xd8, 0x67, 0xe4, 0xed, 0x27, 0x6b, 0x74, 0x33, 0x10,
+ 0xff, 0xb0, 0x5a, 0x47, 0xf2, 0x90, 0x0b, 0xf1, 0xc3, 0xbf, 0x07, 0x23,
+ 0x07, 0xef, 0x30, 0x87, 0xe7, 0xe4, 0xee, 0x2e, 0x48, 0xbd, 0x25, 0x5f,
+ 0x9e, 0x6b, 0xff, 0xf0, 0xe1, 0x1d, 0xeb, 0x52, 0x85, 0xe9, 0x99, 0x31,
+ 0x5e, 0x3f, 0xbf, 0x0a, 0x16, 0x5e, 0x6f, 0x5b, 0x98, 0xe3, 0x87, 0x20,
+ 0x7b, 0xb6, 0x75, 0x10, 0xb3, 0xa1, 0xe7, 0xcc, 0xa0, 0x85, 0x7e, 0xd5,
+ 0x21, 0xe8, 0xcc, 0x2c, 0x63, 0x9a, 0x9b, 0xac, 0x6e, 0xa3, 0xad, 0x53,
+ 0x2a, 0xb4, 0xf7, 0x79, 0x0c, 0x7c, 0xb9, 0x64, 0xb6, 0x5c, 0x6c, 0x33,
+ 0xd0, 0x8f, 0x9a, 0x07, 0x49, 0x4c, 0x6a, 0x99, 0xf6, 0x89, 0x91, 0x5e,
+ 0xfd, 0xbc, 0xb7, 0x43, 0x99, 0x9c, 0xf4, 0x08, 0x02, 0x18, 0x23, 0xab,
+ 0x1d, 0x53, 0x64, 0x04, 0x5c, 0xb8, 0x21, 0xee, 0x59, 0x13, 0x5d, 0x7d,
+ 0xa0, 0xd1, 0x37, 0xb8, 0x35, 0x38, 0xb6, 0x90, 0x8b, 0x7c, 0x0a, 0x42,
+ 0x4c, 0x71, 0x21, 0x43, 0x07, 0x66, 0x36, 0x8f, 0xc6, 0x1a, 0xaa, 0xb6,
+ 0xa8, 0xda, 0x20, 0x6d, 0xcb, 0x61, 0xdc, 0xdd, 0xe5, 0xa7, 0x11, 0xed,
+ 0x98, 0x13, 0xf9, 0x87, 0xae, 0x17, 0x7a, 0x32, 0x78, 0xe8, 0x31, 0x99,
+ 0x46, 0x2c, 0x3a, 0xf5, 0x95, 0x5c, 0x90, 0xc9, 0xd0, 0xd9, 0xb5, 0xbd,
+ 0xf8, 0x74, 0x12, 0x5b, 0xfc, 0x5a, 0x97, 0xd6, 0x71, 0xd4, 0xee, 0x25,
+ 0x1d, 0x0d, 0x3d, 0xf8, 0x75, 0xfa, 0xda, 0x9d, 0x1f, 0x37, 0x80, 0x72,
+ 0x00, 0x37, 0xf8, 0x2c, 0x88, 0x01, 0x21, 0x72, 0xfd, 0x84, 0xf4, 0xda,
+ 0x69, 0xe4, 0xde, 0x52, 0x3c, 0xbe, 0x5f, 0x9d, 0xca, 0x9a, 0x61, 0x87,
+ 0xf9, 0xb5, 0x57, 0x81, 0x00, 0x2b, 0x7e, 0xb8, 0x8b, 0xa9, 0x76, 0xca,
+ 0xa4, 0xe4, 0x84, 0x20, 0x38, 0x03, 0x49, 0x85, 0x06, 0x9c, 0x91, 0x7a,
+ 0xcc, 0x21, 0x64, 0x15, 0xbe, 0x91, 0xdd, 0x00, 0x2e, 0x18, 0x9f, 0x42,
+ 0x9b, 0x7f, 0xa9, 0x64, 0x43, 0x98, 0xbc, 0xe1, 0x5d, 0x59, 0x3e, 0x87,
+ 0xe3, 0x7b, 0xd9, 0x34, 0x29, 0x0e, 0x61, 0x88, 0xb3, 0xea, 0xa4, 0x51,
+ 0xfb, 0x7e, 0x25, 0x11, 0xe3, 0x14, 0x5f, 0x16, 0x30, 0x0f, 0xcf, 0x53,
+ 0xab, 0x0a, 0x2b, 0x2d, 0x3f, 0x97, 0x41, 0xc0, 0x07, 0x61, 0x57, 0xb1,
+ 0xa0, 0x21, 0xa7, 0x1a, 0x2d, 0x6a, 0xc3, 0x9f, 0xf6, 0xda, 0x09, 0x5d,
+ 0xe3, 0x80, 0x4b, 0x59, 0xd9, 0xa8, 0x8f, 0xa1, 0x98, 0x60, 0x4c, 0xe1,
+ 0x3e, 0xac, 0x97, 0xa8, 0x13, 0x85, 0x41, 0xdf, 0x0c, 0x6a, 0xfc, 0xec,
+ 0x1b, 0xb6, 0x98, 0x89, 0x46, 0xeb, 0xba, 0x1b, 0xec, 0xd1, 0x1c, 0x2e,
+ 0x5c, 0xb9, 0x76, 0x44, 0x41, 0x3c, 0x4c, 0xa0, 0xdc, 0xd1, 0x80, 0xa5,
+ 0xfd, 0x1b, 0x4c, 0xf6, 0x20, 0xdb, 0xb4, 0xbb, 0x0e, 0xc1, 0x14, 0x85,
+ 0xad, 0x1b, 0x7f, 0x3e, 0xa3, 0x0b, 0xac, 0x5d, 0x69, 0x62, 0x83, 0x67,
+ 0xac, 0x9c, 0xf2, 0x46, 0xb2, 0x99, 0x6e, 0xe2, 0x40, 0xb8, 0xab, 0xe5,
+ 0x1f, 0xeb, 0xe0, 0xd6, 0x73, 0x6a, 0x53, 0x69, 0x42, 0xc8, 0x2d, 0x11,
+ 0x3a, 0x2f, 0xdf, 0x1d, 0x02, 0x92, 0x62, 0xe0, 0x78, 0xb1, 0x38, 0x27,
+ 0x94, 0xd8, 0x30, 0xeb, 0x50, 0xdd, 0xa7, 0xa2, 0xc6, 0x57, 0x10, 0x4b,
+ 0xcf, 0x15, 0xca, 0x7b, 0x80, 0xfd, 0x5c, 0x41, 0x15, 0x8d, 0x6d, 0x68,
+ 0x7e, 0xc0, 0x03, 0x8a, 0x70, 0xfa, 0x6d, 0xbb, 0x32, 0x04, 0xa4, 0x95,
+ 0x4d, 0x19, 0xce, 0x13, 0xb7, 0x29, 0x7b, 0x6d, 0x1f, 0xbc, 0xc4, 0x36,
+ 0x78, 0x55, 0x0b, 0x88, 0x75, 0xc4, 0x16, 0xd3, 0xa0, 0xf9, 0xfd, 0xf2,
+ 0xee, 0x23, 0xe6, 0x18, 0x13, 0x5c, 0xf2, 0x6d, 0x64, 0x62, 0x19, 0xef,
+ 0xdf, 0x80, 0xae, 0x4f, 0x07, 0x9a, 0x21, 0x58, 0xe1, 0xce, 0x28, 0xa8,
+ 0xfe, 0x8e, 0x6f, 0x39, 0x94, 0xaa, 0x9a, 0x06, 0xb9, 0x0c, 0xbb, 0x12,
+ 0x00, 0xb7, 0xab, 0x65, 0xf8, 0x42, 0x92, 0x99, 0x01, 0x48, 0x83, 0x70,
+ 0xc2, 0x89, 0xf2, 0xd1, 0xe4, 0x44, 0xb6, 0xf9, 0x14, 0x53, 0x9c, 0x6c,
+ 0x0a, 0x52, 0xe2, 0xce, 0x28, 0xda, 0x43, 0xbc, 0x21, 0x1e, 0xab, 0x39,
+ 0x1d, 0xfc, 0x0a, 0xb6, 0x89, 0xc9, 0x58, 0x26, 0x74, 0x96, 0x68, 0xde,
+ 0xe2, 0x1b, 0x1c, 0x15, 0x20, 0x7b, 0x72, 0xf5, 0x4f, 0x9b, 0x67, 0x7d,
+ 0x90, 0xb2, 0x79, 0xbf, 0xec, 0x78, 0x63, 0xcc, 0x9b, 0x88, 0xf6, 0x73,
+ 0x55, 0xe4, 0xde, 0x64, 0x2a, 0xab, 0xdc, 0xd0, 0xd0, 0xd9, 0xc5, 0xc2,
+ 0xd3, 0xae, 0x82, 0xb4, 0x5b, 0xd8, 0xc3, 0x39, 0xea, 0x34, 0xaa, 0x82,
+ 0xcb, 0xe3, 0xb8, 0xd4, 0x35, 0x8d, 0xf3, 0x08, 0x12, 0xbb, 0x51, 0x16,
+ 0x60, 0x24, 0xf9, 0x5c, 0xbf, 0x91, 0x06, 0x9a, 0x7c, 0x64, 0x27, 0xaf,
+ 0x53, 0x76, 0xf0, 0xd5, 0x4b, 0x2b, 0x0b, 0xe9, 0x29, 0xa0, 0x1f, 0x4d,
+ 0xb7, 0x07, 0x90, 0xf0, 0x81, 0x4b, 0x88, 0x63, 0x93, 0x81, 0x82, 0x1b,
+ 0xbe, 0x57, 0xa1, 0x49, 0xf8, 0x1f, 0x2e, 0x96, 0xe3, 0xd7, 0xb7, 0x81,
+ 0x44, 0x4b, 0x41, 0x7f, 0xc9, 0x1c, 0x38, 0x77, 0xc7, 0x38, 0x05, 0xcb,
+ 0x0c, 0x6a, 0x84, 0x74, 0x33, 0x30, 0xdb, 0xa4, 0xef, 0x4a, 0x63, 0xa2,
+ 0x58, 0x39, 0xe8, 0xaf, 0xb8, 0xf2, 0xdb, 0x12, 0xdb, 0x42, 0x56, 0xab,
+ 0xb7, 0x6d, 0xc3, 0xfd, 0xdc, 0x08, 0x80, 0xfd, 0xc5, 0xc5, 0x59, 0xab,
+ 0x72, 0xb9, 0x9e, 0x03, 0xc1, 0xf6, 0x3b, 0x92, 0x00, 0xa4, 0xba, 0x3d,
+ 0xb5, 0x9f, 0xed, 0xbe, 0xd7, 0xc5, 0x6a, 0x23, 0x1f, 0x62, 0x6f, 0x45,
+ 0x49, 0x43, 0xee, 0x49, 0x6d, 0x2c, 0xd5, 0x4c, 0x0f, 0x54, 0xb9, 0x57,
+ 0x39, 0x74, 0xad, 0x54, 0x31, 0x47, 0xed, 0x7f, 0x25, 0x07, 0x8a, 0x47,
+ 0xaf, 0x85, 0x5b, 0x54, 0xa9, 0xd1, 0x3d, 0x5d, 0x1f, 0x0b, 0x8d, 0xee,
+ 0x17, 0x50, 0xae, 0xb0, 0xfc, 0x5c, 0x75, 0x95, 0xad, 0xb8, 0xe5, 0xf8,
+ 0x50, 0xc5, 0xd3, 0x7a, 0xa3, 0xc1, 0x59, 0x17, 0xea, 0xa4, 0xd0, 0x87,
+ 0xcd, 0x0d, 0xc2, 0xb8, 0xbc, 0x8f, 0x8c, 0x5a, 0xb7, 0x33, 0x76, 0xf5,
+ 0x6b, 0xc3, 0xfc, 0x99, 0x65, 0x78, 0x91, 0x7b, 0x33, 0x73, 0x7c, 0x41,
+ 0x9c, 0xdf, 0xad, 0x41, 0x75, 0x76, 0xe9, 0xa9, 0xc4, 0x8d, 0x56, 0xb9,
+ 0x2a, 0x9e, 0xa3, 0x22, 0x2a, 0xed, 0x37, 0xad, 0xfa, 0x4f, 0x26, 0xb8,
+ 0x5a, 0x35, 0x57, 0x83, 0xc4, 0xcd, 0x5f, 0xbe, 0x75, 0xed, 0x2f, 0x62,
+ 0x9d, 0x58, 0x5f, 0x48, 0x4d, 0x48, 0x1f, 0x9e, 0x73, 0x6a, 0x5a, 0x85,
+ 0x12, 0xee, 0x47, 0xac, 0x84, 0x4f, 0x15, 0xb0, 0x5e, 0xe7, 0xbf, 0x35,
+ 0xde, 0xb2, 0xf7, 0x19, 0x45, 0x8f, 0x0a, 0xd7, 0x37, 0x7e, 0x38, 0xcc,
+ 0x75, 0x65, 0x70, 0xfb, 0xef, 0x1b, 0x24, 0x0e, 0x4a, 0xc6, 0x80, 0x5d,
+ 0x4c, 0x3a, 0xf6, 0x71, 0x61, 0x6a, 0x56, 0xe9, 0x0b, 0x6f, 0x5e, 0xb6,
+ 0x7f, 0x66, 0xd9, 0x53, 0x61, 0xfc, 0x43, 0x94, 0x1f, 0xeb, 0x74, 0x81,
+ 0x39, 0x03, 0xbe, 0xe5, 0xcc, 0x6d, 0xc2, 0xc2, 0x31, 0xd2, 0x15, 0x44,
+ 0xcb, 0x35, 0x90, 0x8b, 0xa7, 0x81, 0xc2, 0xb9, 0x4c, 0x6f, 0x40, 0x26,
+ 0x4b, 0xf8, 0x80, 0x05, 0x10, 0x9c, 0x90, 0x85, 0xb3, 0x17, 0xa1, 0x89,
+ 0xa6, 0x44, 0x36, 0xc5, 0xdf, 0x78, 0xb2, 0x82, 0xdb, 0x92, 0x7f, 0x6d,
+ 0x58, 0x1f, 0xa1, 0xf5, 0x52, 0xdc, 0xf2, 0x4f, 0x70, 0xfa, 0xad, 0x42,
+ 0xf5, 0x81, 0x38, 0x44, 0xfb, 0x29, 0x71, 0x97, 0xe6, 0xbb, 0xb2, 0x02,
+ 0x91, 0xe6, 0xc8, 0xd3, 0xfe, 0x95, 0x5e, 0x87, 0xb8, 0xbb, 0x8b, 0xdc,
+ 0xb5, 0x1a, 0x0d, 0x0b, 0xaa, 0x21, 0xac, 0xa2, 0x86, 0xa4, 0xc0, 0xe9,
+ 0x4d, 0xd8, 0xb9, 0x28, 0xa8, 0x82, 0xa3, 0xbb, 0xed, 0xbe, 0xed, 0xbc,
+ 0x6c, 0x54, 0x3b, 0x80, 0xf2, 0xe4, 0xe6, 0x0d, 0x9c, 0xf3, 0x8c, 0xe2,
+ 0x7d, 0xb1, 0xa6, 0xb0, 0x07, 0xae, 0x13, 0xca, 0x11, 0x83, 0xc8, 0x6b,
+ 0x59, 0x01, 0xb2, 0x44, 0xda, 0x80, 0xf7, 0xe5, 0x6a, 0xbd, 0xcc, 0x33,
+ 0x20, 0xe3, 0xac, 0x8b, 0x07, 0xd5, 0x3b, 0xc6, 0x5c, 0x18, 0xba, 0xac,
+ 0xe7, 0x90, 0x81, 0xd8, 0xcd, 0x4d, 0xc6, 0xfa, 0xb3, 0x4e, 0x05, 0xb1,
+ 0xcb, 0xc8, 0xb7, 0x90, 0x94, 0x17, 0x1f, 0xfc, 0x8b, 0xad, 0x8b, 0x35,
+ 0x1c, 0x33, 0x3f, 0x5a, 0x6d, 0xee, 0x5b, 0x48, 0x75, 0x8e, 0xbf, 0xc6,
+ 0xc2, 0xd9, 0xbc, 0x0c, 0xd8, 0x20, 0xd0, 0xe9, 0x68, 0x1a, 0x7d, 0xa9,
+ 0xcc, 0x03, 0x63, 0x2b, 0x67, 0x70, 0xd6, 0x41, 0x3b, 0xd7, 0xe2, 0x92,
+ 0x4d, 0x7b, 0xca, 0x18, 0x2b, 0x2e, 0xf7, 0x5e, 0x34, 0xb6, 0xe6, 0x5a,
+ 0xb3, 0xae, 0xc8, 0x3d, 0xbd, 0xf3, 0xfb, 0x02, 0x34, 0xc4, 0xd1, 0xb2,
+ 0xee, 0xe6, 0xcc, 0xfd, 0xbc, 0xe8, 0xaf, 0x80, 0x70, 0x34, 0x70, 0x45,
+ 0x8b, 0x33, 0x64, 0xd1, 0x60, 0xd3, 0x27, 0x4f, 0x2c, 0xf8, 0xb3, 0xa9,
+ 0xf6, 0x96, 0x75, 0x5f, 0x49, 0x4f, 0x64, 0xa5, 0x25, 0x9d, 0xa7, 0xc7,
+ 0x53, 0xc4, 0x54, 0xdb, 0x86, 0xaa, 0x9f, 0xc9, 0xf4, 0x60, 0xf9, 0xd7,
+ 0xf5, 0x45, 0xc2, 0x2d, 0xcf, 0x54, 0xe2, 0x1d, 0x1a, 0x52, 0xae, 0x3c,
+ 0xd0, 0x9e, 0x9a, 0xd5, 0x00, 0x63, 0xd5, 0xbd, 0x69, 0x79, 0xac, 0xe5,
+ 0xb3, 0xab, 0xb7, 0x98, 0xa9, 0x72, 0xb4, 0x03, 0x46, 0xc9, 0x16, 0x70,
+ 0x2b, 0x22, 0xc8, 0xbf, 0xd5, 0x7a, 0xe3, 0x74, 0xe5, 0x2e, 0xa4, 0x14,
+ 0x57, 0x62, 0x9e, 0x11, 0xf9, 0x58, 0xc4, 0x10, 0xcb, 0x6d, 0x90, 0x1a,
+ 0xe0, 0xe1, 0x36, 0x9d, 0x2c, 0xfb, 0x79, 0xad, 0xd0, 0x96, 0xa3, 0xe9,
+ 0x2a, 0x97, 0xd0, 0x54, 0xa3, 0xce, 0xf4, 0x8a, 0x90, 0xcf, 0x2e, 0xa9,
+ 0x73, 0x6a, 0x43, 0x87, 0xce, 0xf2, 0x9d, 0x61, 0xb3, 0x48, 0x2e, 0xa1,
+ 0x61, 0xe5, 0x66, 0xa6, 0x8f, 0xd1, 0x1d, 0x4c, 0xc5, 0xae, 0x61, 0xbc,
+ 0xf8, 0x12, 0x15, 0xc4, 0xe6, 0x22, 0x0b, 0x39, 0x9c, 0x1f, 0x03, 0x3f,
+ 0x54, 0xe1, 0x60, 0x1c, 0x94, 0x81, 0xae, 0x40, 0xdc, 0x42, 0xbe, 0x36,
+ 0x5a, 0x20, 0x1c, 0x57, 0x99, 0xbb, 0x28, 0xcd, 0x7c, 0x95, 0x9d, 0x14,
+ 0x01, 0x8f, 0x0a, 0x68, 0x32, 0x99, 0x67, 0xef, 0xd8, 0x76, 0xca, 0x99,
+ 0xd9, 0x41, 0x3a, 0x1f, 0x85, 0xb3, 0x3c, 0x2a, 0x53, 0xbf, 0x2f, 0x10,
+ 0xc9, 0xeb, 0x67, 0x2b, 0x08, 0x3f, 0x0b, 0xf9, 0x27, 0x72, 0xec, 0xc0,
+ 0x9d, 0x4a, 0x88, 0xdd, 0xe7, 0x8f, 0xd2, 0x5f, 0xb0, 0xf2, 0xd8, 0xa1,
+ 0x31, 0x2a, 0xa1, 0x5a, 0x8b, 0x06, 0xee, 0x32, 0x6f, 0xbb, 0x61, 0xf5,
+ 0xca, 0xe3, 0xbc, 0x50, 0xfa, 0x69, 0xee, 0xc1, 0x5b, 0x5b, 0x86, 0xa0,
+ 0xac, 0x59, 0x1c, 0xff, 0x28, 0x93, 0x00, 0x8a, 0x74, 0x98, 0x2e, 0xec,
+ 0x9d, 0x23, 0x13, 0xcf, 0xae, 0x98, 0x5f, 0x5e, 0xed, 0x6f, 0x19, 0xa6,
+ 0xce, 0xeb, 0x64, 0x89, 0x46, 0x55, 0x74, 0x3c, 0xb1, 0xfd, 0x0c, 0x80,
+ 0x43, 0xa2, 0x92, 0x5f, 0xb4, 0x7d, 0x35, 0x95, 0xdb, 0x69, 0x7a, 0xc0,
+ 0x5c, 0x51, 0x77, 0x0b, 0x9a, 0x68, 0x4f, 0xce, 0x82, 0xf4, 0x5f, 0x15,
+ 0xf2, 0x38, 0x45, 0x93, 0x0a, 0xf0, 0xab, 0xc0, 0x15, 0x9f, 0xa5, 0xcf,
+ 0xac, 0x97, 0x4d, 0x6e, 0xa7, 0xb6, 0x60, 0x75, 0x50, 0x96, 0x16, 0xf9,
+ 0x11, 0xa3, 0x0a, 0x7a, 0x60, 0x18, 0x37, 0x00, 0x4d, 0x70, 0x63, 0xf0,
+ 0x21, 0x26, 0x21, 0x01, 0xcf, 0xa2, 0x7e, 0x41, 0x38, 0x60, 0xdb, 0x7a,
+ 0x96, 0x5d, 0x90, 0xe8, 0x5d, 0xd7, 0xe1, 0x0f, 0x47, 0x1d, 0x60, 0x18,
+ 0x8d, 0x81, 0xb7, 0x24, 0x39, 0x3c, 0x5b, 0x54, 0xdd, 0x4e, 0xed, 0xb3,
+ 0xa6, 0xb0, 0xb0, 0x8d, 0x9d, 0x11, 0xcb, 0x81, 0x5d, 0xcd, 0x97, 0xe0,
+ 0xf2, 0x86, 0x4f, 0xa0, 0x8f, 0xc4, 0x18, 0xc5, 0x96, 0xfe, 0x12, 0x3a,
+ 0xac, 0x36, 0xe5, 0xee, 0xa4, 0x83, 0xb7, 0x5c, 0x7c, 0xc6, 0x3d, 0xa2,
+ 0x93, 0x72, 0xeb, 0xd0, 0x2b, 0x70, 0xa8, 0x7a, 0x44, 0xdc, 0x25, 0x8a,
+ 0xba, 0xcc, 0x32, 0xad, 0x98, 0xef, 0xab, 0x86, 0xcd, 0xdb, 0x23, 0xf0,
+ 0xf2, 0xf7, 0x78, 0x8a, 0x25, 0x38, 0x97, 0x5d, 0x8f, 0x88, 0xb7, 0x0b,
+ 0xaf, 0xc5, 0xe6, 0xf6, 0xa7, 0x18, 0xbf, 0x7d, 0x8c, 0x7f, 0x51, 0xb4,
+ 0x14, 0xe1, 0x03, 0x03, 0x02, 0xa6, 0x7a, 0xd6, 0xe1, 0xcd, 0xca, 0xc0,
+ 0x32, 0xa7, 0xc7, 0x2b, 0x3f, 0x71, 0x4a, 0x5e, 0x8a, 0x2c, 0x14, 0x3a,
+ 0x76, 0xe5, 0x50, 0x86, 0x62, 0xae, 0x17, 0x31, 0x96, 0x5e, 0x21, 0x90,
+ 0x00, 0xc8, 0x84, 0x41, 0x4a, 0x04, 0x06, 0x8b, 0x3d, 0xf5, 0xb2, 0x0c,
+ 0x47, 0xaf, 0x47, 0x55, 0x95, 0xa1, 0x40, 0x5a, 0xfe, 0x0e, 0x7f, 0x79,
+ 0x14, 0x7c, 0x67, 0xa2, 0x4c, 0xb8, 0xee, 0x36, 0x77, 0x52, 0x48, 0x2f,
+ 0x7d, 0x29, 0xb7, 0x1b, 0x65, 0x7e, 0xee, 0x20, 0xd6, 0x20, 0x9e, 0x77,
+ 0xeb, 0x9f, 0x58, 0xd9, 0xa5, 0x10, 0xe3, 0xf6, 0xd5, 0x3e, 0x33, 0xec,
+ 0xfd, 0x0a, 0xbb, 0x94, 0xb1, 0x14, 0x58, 0x1f, 0xae, 0x71, 0x4c, 0x4e,
+ 0x76, 0xbd, 0x1d, 0x05, 0x38, 0x8d, 0xf3, 0xa0, 0x43, 0xb1, 0x18, 0xd0,
+ 0xb8, 0xcf, 0xbf, 0x90, 0x2d, 0xf7, 0x91, 0xfd, 0xb6, 0x51, 0x3e, 0xd8,
+ 0x23, 0x40, 0x4d, 0x03, 0x64, 0x9c, 0x84, 0xa1, 0x80, 0x50, 0xb8, 0xcc,
+ 0x47, 0x82, 0x5d, 0xae, 0x4e, 0x39, 0x22, 0x64, 0xc3, 0x87, 0x5a, 0x55,
+ 0x46, 0x46, 0x8a, 0xbd, 0x63, 0xac, 0x96, 0x82, 0xc4, 0x2e, 0xbb, 0xf8,
+ 0x32, 0x74, 0x45, 0x56, 0xdb, 0x79, 0x78, 0xe9, 0xd1, 0xd6, 0x9d, 0x5f,
+ 0x57, 0x97, 0xa0, 0xee, 0x32, 0x09, 0xe8, 0x27, 0x02, 0xd5, 0xfe, 0xb1,
+ 0x88, 0xe6, 0x0a, 0xdb, 0x13, 0x16, 0x66, 0x0e, 0xe9, 0xa8, 0x39, 0x9c,
+ 0xcd, 0xe0, 0x55, 0xa3, 0x85, 0x11, 0x62, 0x12, 0xa0, 0xb2, 0xcc, 0xdb,
+ 0x83, 0x3c, 0xb9, 0x4f, 0x02, 0x7d, 0x03, 0x25, 0x09, 0x5f, 0x05, 0x64,
+ 0xb9, 0x1a, 0x54, 0xc9, 0x48, 0xc8, 0xde, 0x2e, 0xae, 0x13, 0x8e, 0x86,
+ 0x5c, 0xbb, 0x77, 0x95, 0xc4, 0x4d, 0xb7, 0x37, 0xbc, 0x1f, 0x08, 0x08,
+ 0xbb, 0xc7, 0x9d, 0x1c, 0x4c, 0x81, 0x72, 0xa8, 0x9e, 0x80, 0xba, 0xb0,
+ 0xe8, 0x37, 0x93, 0x85, 0xb5, 0x7d, 0x81, 0x04, 0xc0, 0xd8, 0x17, 0x2b,
+ 0x86, 0xbe, 0xeb, 0x91, 0x46, 0x01, 0x70, 0xc9, 0xa2, 0x35, 0xa9, 0x58,
+ 0x92, 0xe8, 0x3a, 0xc6, 0x5c, 0xf7, 0xc8, 0x0a, 0x85, 0x04, 0x49, 0x23,
+ 0x6c, 0xbf, 0xb4, 0x30, 0x2c, 0xf2, 0xe5, 0xc8, 0xbe, 0xc4, 0x97, 0xdd,
+ 0xeb, 0x18, 0xc5, 0xc7, 0xe7, 0x66, 0x1e, 0x75, 0xa1, 0x12, 0xea, 0xd0,
+ 0x57, 0xbc, 0x53, 0x01, 0x85, 0x85, 0x80, 0xac, 0x19, 0x5d, 0x1a, 0x00,
+ 0x42, 0x54, 0x23, 0xe1, 0x1d, 0x48, 0x5a, 0xcf, 0x00, 0xeb, 0x53, 0xc6,
+ 0x91, 0x66, 0xff, 0x5f, 0x26, 0x8e, 0xc3, 0x21, 0x29, 0xc4, 0xa6, 0xfa,
+ 0xc3, 0xa6, 0xf0, 0x45, 0x3a, 0x1e, 0x4e, 0x59, 0x7e, 0x4c, 0x1e, 0xec,
+ 0xc5, 0x49, 0x1f, 0x03, 0x3c, 0x1b, 0x77, 0xeb, 0x43, 0x9a, 0xc2, 0x09,
+ 0x59, 0xf8, 0x66, 0x57, 0x8a, 0x01, 0x40, 0x56, 0xfa, 0xcf, 0xb8, 0x24,
+ 0xc1, 0x7c, 0x41, 0xd0, 0xc2, 0x57, 0x61, 0xb6, 0xd9, 0x69, 0x21, 0x7e,
+ 0x2a, 0x04, 0xd8, 0xfc, 0x50, 0x52, 0x68, 0x53, 0x94, 0xe1, 0xde, 0x31,
+ 0xd5, 0xd6, 0xe7, 0x7c, 0xd7, 0x4d, 0x39, 0xab, 0x37, 0x8f, 0xa1, 0x2c,
+ 0x09, 0x39, 0xf2, 0x2f, 0x0f, 0xdd, 0x5b, 0xa2, 0x82, 0x5e, 0xd2, 0x7c,
+ 0x8e, 0x89, 0x8a, 0xfe, 0x9e, 0x6e, 0x77, 0xda, 0x9d, 0xe7, 0xc5, 0xd0,
+ 0x56, 0x17, 0xc2, 0xac, 0x9f, 0x92, 0x5d, 0xf4, 0x31, 0xea, 0x94, 0x4c,
+ 0xb7, 0x8c, 0xd5, 0x9d, 0xc4, 0xcb, 0xf2, 0x0f, 0x5a, 0xd0, 0x0b, 0x70,
+ 0x8c, 0x55, 0x2d, 0x8e, 0x84, 0x1f, 0x52, 0xd8, 0xdc, 0xd0, 0xa0, 0xe1,
+ 0x69, 0x4a, 0xcb, 0x29, 0x58, 0xd4, 0xd3, 0xcb, 0xa5, 0x4a, 0x97, 0x78,
+ 0xff, 0xf5, 0x83, 0x0b, 0x35, 0x50, 0x18, 0xcf, 0xa2, 0x70, 0x9a, 0xf8,
+ 0x7f, 0x73, 0x30, 0xd6, 0xba, 0xb8, 0x48, 0x14, 0x5d, 0x12, 0x11, 0x8f,
+ 0xdb, 0x23, 0x72, 0x0b, 0xfd, 0x73, 0x7a, 0xdb, 0xa2, 0xd4, 0x49, 0xb4,
+ 0x42, 0xa9, 0xb5, 0xd9, 0xcc, 0x06, 0x9c, 0x29, 0x7a, 0xdc, 0x46, 0xf9,
+ 0x03, 0x90, 0x90, 0x21, 0xb8, 0x9a, 0xb5, 0xf7, 0xb2, 0xfc, 0xe5, 0xcf,
+ 0xfd, 0x6d, 0x43, 0xd8, 0x53, 0x6f, 0x0e, 0xe1, 0x3e, 0xe0, 0x3c, 0x65,
+ 0xdd, 0xb0, 0xba, 0x65, 0x6e, 0xc2, 0x96, 0x01, 0x7b, 0x5a, 0xf1, 0x5e,
+ 0x0b, 0x44, 0x4a, 0x94, 0xfc, 0x93, 0x77, 0x64, 0x57, 0xef, 0xb3, 0xd2,
+ 0xc2, 0xc8, 0xb5, 0xa8, 0x27, 0xc6, 0xa5, 0x37, 0x88, 0x24, 0xf7, 0xd9,
+ 0xf9, 0x03, 0xfd, 0x3d, 0x8e, 0x6b, 0x6d, 0xd8, 0x31, 0x11, 0xd8, 0xb9,
+ 0x38, 0xc6, 0x0a, 0x6a, 0xa2, 0x4e, 0x84, 0x87, 0x07, 0xeb, 0x18, 0x8e,
+ 0xc7, 0x48, 0x0a, 0xd0, 0xe7, 0x86, 0xab, 0x29, 0xd5, 0xca, 0x7f, 0xe5,
+ 0xcd, 0x5f, 0xb1, 0xc6, 0x83, 0x6a, 0x32, 0xa7, 0xbb, 0xbd, 0xb8, 0x28,
+ 0x94, 0x08, 0xd7, 0x26, 0x3b, 0x3a, 0xdb, 0xd5, 0xfe, 0x7d, 0x1d, 0x05,
+ 0x14, 0x58, 0x43, 0xac, 0x07, 0x17, 0x7b, 0x2c, 0x9d, 0x35, 0xc8, 0x71,
+ 0xb6, 0x69, 0x2c, 0x15, 0xce, 0xd1, 0x6f, 0x67, 0x4d, 0x01, 0x49, 0xee,
+ 0x15, 0x0d, 0xce, 0xfb, 0x8d, 0x0f, 0xcd, 0xc9, 0xd3, 0x54, 0x41, 0x04,
+ 0xb4, 0xc9, 0xe5, 0x38, 0xf5, 0x1b, 0xed, 0x52, 0x55, 0xea, 0x69, 0x68,
+ 0x64, 0x96, 0x14, 0x2f, 0xa1, 0x0d, 0xd9, 0xe5, 0x4b, 0x60, 0x42, 0x8a,
+ 0xe7, 0xfb, 0x4f, 0xd7, 0x45, 0xa8, 0x11, 0x0c, 0xd0, 0xb8, 0x54, 0x98,
+ 0x87, 0x1c, 0x0a, 0xcb, 0x3d, 0x29, 0x4d, 0x3f, 0x9e, 0xd5, 0x1e, 0x07,
+ 0x68, 0xc2, 0x8e, 0xc4, 0x38, 0x68, 0x83, 0x07, 0x35, 0x45, 0x2c, 0x29,
+ 0xce, 0x4a, 0xf6, 0xc2, 0xe6, 0xb4, 0x14, 0xd1, 0x42, 0x66, 0x38, 0x48,
+ 0x02, 0x17, 0x11, 0x29, 0xa1, 0x7f, 0x4d, 0x4b, 0x03, 0x1f, 0x27, 0xb0,
+ 0x80, 0x99, 0xba, 0x94, 0x3e, 0xa1, 0x08, 0xd0, 0x78, 0x52, 0x64, 0x35,
+ 0x92, 0x77, 0xaa, 0xc3, 0x86, 0x7d, 0x9d, 0xcc, 0xd9, 0xb2, 0xf1, 0xa0,
+ 0x5f, 0x6e, 0x15, 0x9f, 0x9d, 0x74, 0x29, 0x8c, 0xce, 0x4c, 0x26, 0xac,
+ 0x65, 0xd4, 0x9f, 0x5b, 0x23, 0x3d, 0x4e, 0x0b, 0x44, 0xe1, 0x6e, 0xb4,
+ 0x8c, 0xc2, 0xa1, 0x95, 0x22, 0x67, 0x5e, 0x21, 0x02, 0x89, 0x48, 0x90,
+ 0x9e, 0x29, 0x23, 0x4f, 0xbb, 0xbb, 0x42, 0x9e, 0x9f, 0xd4, 0xb4, 0x18,
+ 0x45, 0xf8, 0xae, 0x8d, 0x13, 0x83, 0x1b, 0x93, 0x15, 0x89, 0xf2, 0x50,
+ 0x5b, 0x7d, 0x3e, 0x70, 0x32, 0xac, 0x26, 0x87, 0xa8, 0x77, 0x7a, 0x9e,
+ 0xe3, 0xcf, 0xce, 0xc7, 0x93, 0xcc, 0x4e, 0x14, 0x1c, 0xa5, 0xe0, 0x4a,
+ 0xaa, 0x52, 0x5f, 0xbb, 0x1f, 0xec, 0xca, 0x6e, 0x8c, 0x97, 0xd4, 0xb7,
+ 0x10, 0xf1, 0xee, 0x22, 0x84, 0x8a, 0x37, 0xe3, 0xec, 0xb4, 0x4d, 0xa3,
+ 0xbf, 0x6e, 0xd3, 0x1e, 0x3d, 0x92, 0x0a, 0x59, 0x0e, 0x66, 0x38, 0xf3,
+ 0xd9, 0x49, 0xbd, 0x33, 0x7b, 0x87, 0x86, 0x95, 0x10, 0xe7, 0xf6, 0x2d,
+ 0xd5, 0x3f, 0x09, 0x56, 0xf1, 0xeb, 0xed, 0x34, 0x97, 0xa2, 0x49, 0xd2,
+ 0xa0, 0x05, 0xa3, 0x20, 0xc6, 0x79, 0xec, 0x69, 0x2c, 0x16, 0x0f, 0x5b,
+ 0x6d, 0x6c, 0x82, 0x51, 0x51, 0x07, 0xdf, 0xfc, 0x65, 0xc0, 0x15, 0x29,
+ 0x72, 0xc8, 0x40, 0xe4, 0x3e, 0x31, 0xba, 0x6b, 0x6d, 0x7e, 0xf7, 0x4b,
+ 0xaa, 0x8b, 0x87, 0xe1, 0x30, 0xe6, 0x93, 0xb4, 0x0f, 0x1a, 0xcd, 0x36,
+ 0x94, 0xa2, 0xf1, 0x5e, 0x7f, 0x7f, 0x42, 0x75, 0x61, 0xa0, 0xb6, 0xda,
+ 0xa8, 0xa1, 0x8f, 0x40, 0x5e, 0xfe, 0x2c, 0x1b, 0x21, 0xb7, 0x92, 0xc6,
+ 0x9b, 0x9c, 0xe1, 0x6b, 0x63, 0x0e, 0x49, 0x09, 0x69, 0x57, 0x07, 0x11,
+ 0x6d, 0x5e, 0x07, 0x9a, 0x6c, 0xfa, 0x39, 0xc1, 0x04, 0x29, 0x86, 0x92,
+ 0x51, 0x1d, 0x59, 0xa8, 0x00, 0xc3, 0x85, 0x7d, 0xce, 0x06, 0x2b, 0x8a,
+ 0x3c, 0x02, 0x58, 0x32, 0x28, 0x2b, 0x2f, 0x9b, 0x12, 0x08, 0x15, 0x47,
+ 0x32, 0x73, 0xf4, 0x95, 0x27, 0x34, 0xe4, 0xd6, 0x70, 0xb4, 0x69, 0x1f,
+ 0x30, 0xb9, 0x71, 0x37, 0xe4, 0x48, 0x27, 0xd2, 0x39, 0xb4, 0x8d, 0x17,
+ 0x4d, 0xd4, 0x31, 0xa5, 0x95, 0x8c, 0x77, 0xaa, 0x5c, 0x7d, 0x9d, 0x10,
+ 0x37, 0xb8, 0xc7, 0x04, 0x27, 0xad, 0x0f, 0x11, 0x9e, 0x7a, 0x07, 0xad,
+ 0x8d, 0x54, 0x95, 0x4a, 0x8e, 0xf4, 0x8d, 0x92, 0x8f, 0x2c, 0x9d, 0x93,
+ 0x7a, 0xdd, 0x50, 0x38, 0x3f, 0xe2, 0xa3, 0x37, 0xd5, 0xb8, 0xa5, 0x90,
+ 0x14, 0x2b, 0x2f, 0x16, 0x2d, 0x0f, 0xbc, 0x56, 0xd8, 0x3c, 0xf5, 0x7f,
+ 0xf5, 0x77, 0xf1, 0x34, 0x5a, 0x74, 0x71, 0xad, 0x67, 0xae, 0xa3, 0x6b,
+ 0x39, 0x5f, 0xdb, 0xc0, 0xcb, 0x3e, 0xd8, 0x83, 0x21, 0x8b, 0x4b, 0x1c,
+ 0x5a, 0xf2, 0xb5, 0xc8, 0x7a, 0x58, 0x67, 0xf1, 0x52, 0x3a, 0x5b, 0x49,
+ 0xc3, 0x57, 0xa6, 0x58, 0xc6, 0x92, 0xa2, 0xac, 0xe0, 0xde, 0x6a, 0x28,
+ 0xc8, 0xb9, 0x07, 0x30, 0x58, 0x82, 0x64, 0x3a, 0x52, 0x5a, 0x08, 0xfe,
+ 0x43, 0xe3, 0xda, 0x1a, 0xa8, 0xce, 0x4d, 0x4b, 0xcc, 0x63, 0x60, 0x97,
+ 0x6b, 0xb2, 0xbd, 0x26, 0xa9, 0x08, 0x5e, 0xec, 0x4e, 0xaa, 0xd9, 0x54,
+ 0x76, 0x3c, 0x57, 0x2a, 0x15, 0x92, 0x87, 0xc9, 0xe3, 0xfa, 0x14, 0xa3,
+ 0x9b, 0xb7, 0x3b, 0xd1, 0x1d, 0x42, 0x5a, 0x98, 0x98, 0x67, 0x41, 0x17,
+ 0x8b, 0x96, 0x64, 0x07, 0xb8, 0x34, 0x32, 0x25, 0x20, 0x2a, 0x6d, 0x4b,
+ 0x34, 0x53, 0x4b, 0x28, 0x7b, 0x84, 0xbf, 0xc7, 0xcf, 0xee, 0x7f, 0x41,
+ 0x3c, 0xef, 0xca, 0x55, 0xfc, 0x82, 0x65, 0xe2, 0x28, 0x31, 0xcb, 0x24,
+ 0x8c, 0x0f, 0x1d, 0x40, 0x5d, 0xef, 0x79, 0xb3, 0x03, 0xdc, 0x8f, 0x1f,
+ 0x8e, 0xcb, 0xd7, 0x61, 0xfc, 0xf3, 0x41, 0x01, 0x6b, 0x20, 0xf5, 0x7f,
+ 0xc4, 0x85, 0x6c, 0x06, 0xf7, 0xbd, 0x50, 0xb1, 0xe0, 0x91, 0xee, 0x98,
+ 0xf4, 0x30, 0x7c, 0x3c, 0x2c, 0x5e, 0xb2, 0x66, 0xb9, 0xc6, 0x13, 0x24,
+ 0x36, 0x55, 0xcf, 0xa7, 0xb0, 0xfa, 0x16, 0x2c, 0x3c, 0x18, 0x21, 0xfe,
+ 0xe0, 0x28, 0xbe, 0x67, 0x05, 0x45, 0x7f, 0xcf, 0x64, 0x55, 0xdf, 0x59,
+ 0x0b, 0x68, 0x58, 0x41, 0x9e, 0xf0, 0xf4, 0x74, 0x52, 0x32, 0x51, 0x5a,
+ 0xa2, 0xa9, 0xc6, 0xdb, 0x9e, 0x52, 0x29, 0x67, 0xec, 0xe7, 0xeb, 0x12,
+ 0x06, 0x0d, 0x22, 0xc7, 0xfa, 0xda, 0x5e, 0x5f, 0xf4, 0x16, 0x11, 0xf0,
+ 0x61, 0x4d, 0x84, 0xe5, 0x77, 0x3e, 0x17, 0x0f, 0xcc, 0xc6, 0xcd, 0x13,
+ 0x69, 0x36, 0x99, 0x4f, 0x79, 0x1c, 0x67, 0x91, 0xa8, 0xd9, 0xf1, 0x17,
+ 0x13, 0xaa, 0x23, 0x89, 0x8e, 0x85, 0xb5, 0x01, 0x55, 0x35, 0x41, 0xf5,
+ 0xa2, 0x39, 0x8c, 0xa1, 0xac, 0x79, 0xcd, 0xf6, 0x27, 0xe5, 0x68, 0xa9,
+ 0x35, 0x77, 0xfc, 0x5a, 0x0c, 0x7d, 0x19, 0x85, 0x90, 0xee, 0x52, 0xaf,
+ 0x96, 0x3b, 0x15, 0xfb, 0xa7, 0xa1, 0x3f, 0xcc, 0xaa, 0x8e, 0x8d, 0x7e,
+ 0x30, 0x93, 0xe8, 0x5d, 0xa1, 0x7c, 0x11, 0x57, 0xb9, 0xf8, 0x26, 0x20,
+ 0xe6, 0xb0, 0xcf, 0xff, 0xe7, 0x8e, 0x95, 0xcb, 0x5d, 0x0d, 0x1b, 0xf4,
+ 0xa9, 0x09, 0xb0, 0x07, 0x1d, 0x77, 0x46, 0x5d, 0xcd, 0xb5, 0x28, 0x1a,
+ 0xd7, 0xe4, 0x7e, 0x02, 0xee, 0xcd, 0x66, 0x1f, 0x6f, 0x90, 0xdd, 0x4a,
+ 0xe6, 0x66, 0xaf, 0xa9, 0x25, 0xbe, 0xaf, 0xce, 0xea, 0xfa, 0x84, 0x26,
+ 0x54, 0x76, 0x8c, 0x8a, 0x25, 0xee, 0x8d, 0xf7, 0x25, 0xb6, 0x2f, 0x4e,
+ 0xdb, 0x46, 0x8d, 0xf2, 0xf9, 0xfe, 0xad, 0xae, 0x4a, 0x29, 0x85, 0x38,
+ 0x7a, 0xea, 0xf9, 0x8d, 0x15, 0x70, 0x10, 0xf5, 0x12, 0xbc, 0x9a, 0xb1,
+ 0x27, 0x9a, 0xb0, 0xe7, 0x2f, 0xe4, 0x3e, 0x91, 0x52, 0x3b, 0xed, 0x44,
+ 0xcc, 0xfe, 0xca, 0xc7, 0xa7, 0xf6, 0xac, 0xce, 0xba, 0x8c, 0x4f, 0xad,
+ 0x6d, 0xca, 0x20, 0x33, 0xeb, 0xfc, 0xd6, 0xe5, 0x5c, 0xb8, 0x33, 0x71,
+ 0x2b, 0x5d, 0x3f, 0x66, 0xf5, 0x5a, 0x0d, 0xa6, 0x71, 0x2c, 0x55, 0xf8,
+ 0xb5, 0x77, 0x79, 0xeb, 0xfd, 0x31, 0xea, 0xcb, 0xae, 0xfc, 0xb2, 0x09,
+ 0x6f, 0x8e, 0x3d, 0xa0, 0x7e, 0x9d, 0x75, 0x1f, 0x70, 0x93, 0x38, 0xb4,
+ 0x28, 0xa2, 0xce, 0x7b, 0x6a, 0x92, 0x74, 0xf5, 0xcf, 0xd4, 0x80, 0x9a,
+ 0x46, 0x07, 0x49, 0x1c, 0x46, 0x42, 0xbb, 0x17, 0x38, 0x51, 0xc0, 0x86,
+ 0xa4, 0x44, 0xc4, 0x6d, 0xf5, 0x6c, 0x03, 0x6a, 0xc1, 0x52, 0x34, 0xa6,
+ 0x87, 0x1a, 0x66, 0xb1, 0x90, 0xcc, 0x7f, 0x5f, 0x14, 0xc4, 0xab, 0xcc,
+ 0xa7, 0xdf, 0x81, 0x3f, 0x98, 0x94, 0x64, 0xfb, 0xc1, 0xb3, 0x04, 0x2c,
+ 0xb2, 0xf1, 0x00, 0xaf, 0xfc, 0x76, 0x7f, 0x95, 0x2a, 0x14, 0x4b, 0x52,
+ 0x47, 0x0f, 0xeb, 0xee, 0xda, 0x75, 0x0a, 0x31, 0x87, 0x1f, 0x3b, 0xa7,
+ 0x9f, 0x14, 0xcf, 0x2a, 0x43, 0xd2, 0x63, 0x8c, 0xff, 0x42, 0xea, 0x03,
+ 0x21, 0x2c, 0xfc, 0x96, 0x49, 0x98, 0x84, 0x9f, 0x91, 0x9a, 0xd7, 0x3f,
+ 0x95, 0x27, 0xf9, 0x3c, 0x82, 0xc9, 0x48, 0x66, 0xba, 0xb0, 0x90, 0xc2,
+ 0x31, 0xde, 0xa3, 0x14, 0x18, 0x4b, 0xf6, 0x6d, 0x62, 0x95, 0x16, 0xe7,
+ 0x84, 0x63, 0xa4, 0xec, 0xd7, 0x74, 0x65, 0xf7, 0x3a, 0x48, 0x1f, 0xf3,
+ 0x92, 0xf3, 0x3f, 0x5a, 0xea, 0x8f, 0x82, 0xb9, 0x39, 0x44, 0xdb, 0x71,
+ 0x73, 0x21, 0x9b, 0x53, 0xb2, 0x14, 0x07, 0x15, 0x04, 0x9a, 0x55, 0x17,
+ 0xc3, 0xdf, 0x7a, 0x2d, 0xc4, 0x7e, 0xa6, 0x0f, 0xb7, 0xf1, 0x47, 0xb9,
+ 0x62, 0x0d, 0xb1, 0x92, 0xf0, 0xde, 0x1d, 0xfe, 0xed, 0x90, 0xb3, 0x00,
+ 0x02, 0x1b, 0x0f, 0x22, 0x0a, 0x3e, 0x9f, 0xbb, 0x94, 0x55, 0xdf, 0x84,
+ 0x97, 0xe4, 0x03, 0x17, 0xc0, 0x5d, 0x5b, 0x89, 0x7d, 0x46, 0xf9, 0x15,
+ 0xdc, 0x76, 0x69, 0xfc, 0x98, 0xc9, 0x78, 0xbd, 0x9d, 0x85, 0xb4, 0xec,
+ 0x55, 0xbe, 0x5d, 0x3a, 0xc9, 0xc5, 0xf3, 0x0b, 0xb0, 0x3b, 0xf0, 0x38,
+ 0x94, 0x4c, 0x89, 0x4c, 0x9a, 0xc6, 0xd1, 0xe9, 0xe2, 0x8c, 0xde, 0xcf,
+ 0x46, 0x43, 0x25, 0x51, 0x9e, 0xf2, 0xa8, 0x72, 0xad, 0x11, 0xfe, 0xb4,
+ 0x44, 0x05, 0x3e, 0x06, 0x53, 0xb6, 0xb0, 0xe6, 0x3b, 0x71, 0x4f, 0x7c,
+ 0x08, 0x4d, 0xbe, 0xab, 0x42, 0xd6, 0xec, 0x7c, 0x6f, 0xae, 0x44, 0x63,
+ 0x94, 0xc9, 0x82, 0x09, 0x60, 0x54, 0xc6, 0x4a, 0x35, 0x27, 0x72, 0x1c,
+ 0x74, 0xb9, 0xc7, 0x4a, 0xc8, 0xe9, 0x47, 0x73, 0x65, 0xbf, 0x66, 0x60,
+ 0xc1, 0x1d, 0xc7, 0xbd, 0xe2, 0xdc, 0x44, 0xf1, 0xf9, 0xd3, 0x8c, 0x48,
+ 0x69, 0xc0, 0xf9, 0x02, 0xe5, 0xff, 0xbc, 0x5e, 0x1d, 0x66, 0xb7, 0x5b,
+ 0xbc, 0x95, 0x4c, 0xaa, 0x29, 0x1c, 0x53, 0x84, 0x6d, 0xbe, 0x0f, 0xda,
+ 0x40, 0x72, 0x5f, 0x0d, 0xe7, 0xae, 0xe3, 0x05, 0xa2, 0x16, 0x4f, 0x3d,
+ 0x4b, 0xbc, 0x84, 0x4c, 0xcf, 0xa5, 0x10, 0x72, 0xf1, 0x7e, 0x2c, 0xfa,
+ 0x48, 0x45, 0xb6, 0xa7, 0x57, 0xa7, 0xeb, 0x69, 0x54, 0xc0, 0x96, 0x9b,
+ 0xa5, 0xf7, 0x06, 0x3f, 0xdf, 0xe9, 0x78, 0x09, 0x24, 0x6e, 0x41, 0x49,
+ 0x81, 0x22, 0x11, 0x4e, 0xcd, 0xda, 0xfb, 0x92, 0x99, 0xe4, 0xd8, 0x86,
+ 0x8e, 0xe4, 0x0b, 0xdc, 0xa2, 0x7e, 0x8d, 0x99, 0x45, 0xed, 0x24, 0x40,
+ 0x2b, 0x34, 0x72, 0x4c, 0x27, 0x8e, 0xd0, 0x3d, 0x1a, 0x7c, 0x6a, 0x85,
+ 0xa7, 0x1d, 0x71, 0x05, 0xe7, 0xda, 0xf4, 0x48, 0xd6, 0x87, 0x0a, 0xb8,
+ 0xc0, 0x55, 0xe3, 0xed, 0xbb, 0xfd, 0x82, 0x42, 0xfa, 0x68, 0x55, 0x73,
+ 0x66, 0x93, 0x81, 0x6b, 0x33, 0xfe, 0xa3, 0x15, 0xf3, 0x92, 0x16, 0xcd,
+ 0x4a, 0xf3, 0x67, 0x26, 0x96, 0x1b, 0x15, 0x68, 0x20, 0x31, 0xfe, 0xc7,
+ 0x93, 0x67, 0x23, 0xeb, 0xa9, 0x8e, 0x79, 0xe2, 0xa0, 0x9a, 0xf1, 0x69,
+ 0xd1, 0x31, 0x61, 0x6d, 0x0b, 0x5e, 0xd7, 0x59, 0xac, 0xa3, 0x4a, 0x9e,
+ 0xff, 0x69, 0x24, 0xc1, 0x03, 0x76, 0x73, 0x27, 0x33, 0xce, 0xbd, 0x06,
+ 0xca, 0xbc, 0xf4, 0x4d, 0x6d, 0x6e, 0x48, 0x0a, 0x5b, 0x4f, 0xcd, 0xa0,
+ 0x06, 0xb2, 0xf6, 0x88, 0x06, 0x5e, 0xf5, 0x4d, 0xb5, 0x27, 0x6d, 0xd3,
+ 0x87, 0xa7, 0xc6, 0x49, 0xef, 0x52, 0x69, 0x98, 0x18, 0xf9, 0x07, 0x9b,
+ 0x72, 0x11, 0x87, 0x8d, 0x43, 0xb9, 0x2b, 0x07, 0xb1, 0x51, 0x4b, 0x91,
+ 0x52, 0x39, 0x96, 0x3f, 0x63, 0x83, 0x82, 0xa1, 0xbc, 0x27, 0x99, 0x77,
+ 0xff, 0xc8, 0xa1, 0x07, 0xd0, 0x87, 0x2a, 0x50, 0x56, 0x65, 0x64, 0x41,
+ 0x3f, 0x18, 0x95, 0xb1, 0xf2, 0xf1, 0xa8, 0x51, 0x72, 0x46, 0xd6, 0x49,
+ 0x96, 0xee, 0xbf, 0x11, 0xcf, 0xe6, 0x81, 0x8d, 0x3c, 0xc5, 0xf6, 0x1c,
+ 0xac, 0xf2, 0x37, 0x75, 0x2e, 0x53, 0xe2, 0xee, 0x54, 0x3b, 0x46, 0x7f,
+ 0x8e, 0x15, 0x46, 0xc0, 0x12, 0xf2, 0xf5, 0xe0, 0xa6, 0x48, 0x23, 0x95,
+ 0x64, 0x43, 0xe4, 0x76, 0x7d, 0x2b, 0x2b, 0xe7, 0x3d, 0x0a, 0x84, 0x7d,
+ 0x18, 0xf7, 0x70, 0x0d, 0x3d, 0x2b, 0xf7, 0xa7, 0x08, 0x5e, 0x28, 0x59,
+ 0xaa, 0x62, 0x6f, 0x56, 0x1c, 0x74, 0x8f, 0x57, 0x33, 0xb6, 0xf2, 0x2f,
+ 0x49, 0x18, 0x67, 0xb3, 0x93, 0x5f, 0x45, 0xcc, 0xb7, 0xa9, 0x2b, 0x16,
+ 0x5d, 0x4b, 0x6b, 0x98, 0xf2, 0x07, 0xe2, 0x60, 0xe9, 0x30, 0x8e, 0x29,
+ 0x7c, 0xb6, 0xca, 0x31, 0xfd, 0x3a, 0xff, 0x06, 0x06, 0x10, 0x0c, 0x4a,
+ 0x7c, 0x3c, 0x97, 0x10, 0x4f, 0x4d, 0x86, 0x2d, 0x8b, 0x66, 0x49, 0xd9,
+ 0x73, 0x49, 0x93, 0x7f, 0x0d, 0x95, 0x83, 0x7f, 0x0b, 0x85, 0x53, 0x85,
+ 0xf9, 0x3f, 0x29, 0x7f, 0x53, 0xd5, 0x6f, 0xe7, 0xf6, 0xf2, 0xec, 0x5b,
+ 0xb5, 0x86, 0x4f, 0xb5, 0xd5, 0x11, 0x18, 0xde, 0x35, 0xe8, 0x3d, 0x79,
+ 0x81, 0x8f, 0xa2, 0x05, 0x58, 0x40, 0x0d, 0x9b, 0x77, 0x22, 0x38, 0x06,
+ 0x5b, 0xac, 0xf7, 0xd0, 0x0e, 0x06, 0x06, 0x23, 0xd2, 0xff, 0xa0, 0xcb,
+ 0xff, 0x84, 0xb5, 0xf3, 0x7a, 0xe1, 0x8a, 0x76, 0xcd, 0x3b, 0x0b, 0xbc,
+ 0x23, 0x46, 0xb0, 0xc7, 0xfa, 0xa8, 0xd6, 0xf6, 0x56, 0x57, 0x72, 0xd2,
+ 0x49, 0x95, 0x6e, 0x32, 0x2e, 0x00, 0x3d, 0x0b, 0xab, 0x36, 0x05, 0x6e,
+ 0xc5, 0x11, 0x4a, 0xb5, 0x1c, 0x89, 0xb2, 0x81, 0xc8, 0x0b, 0x9f, 0x6a,
+ 0x9f, 0x0f, 0x75, 0x22, 0x79, 0x3c, 0xb7, 0xa6, 0xa1, 0x24, 0x02, 0xcc,
+ 0x98, 0x89, 0x27, 0x8d, 0xdc, 0xc4, 0xa9, 0x4a, 0xb5, 0x87, 0xb4, 0x5c,
+ 0x8c, 0x16, 0x2f, 0x63, 0x1a, 0x27, 0x68, 0xf4, 0x25, 0x9e, 0xa1, 0x6c,
+ 0x9e, 0x36, 0xc6, 0xc6, 0xa5, 0xab, 0x0e, 0x26, 0x22, 0x51, 0xc3, 0x8d,
+ 0xc8, 0xa2, 0x58, 0x27, 0x03, 0xe5, 0xe4, 0x72, 0xc2, 0x79, 0x4d, 0xa0,
+ 0xcb, 0x19, 0x37, 0x99, 0xca, 0x21, 0x67, 0x8c, 0xdf, 0x7c, 0xce, 0x8f,
+ 0xd6, 0xba, 0x78, 0x54, 0xda, 0xb4, 0x90, 0x70, 0xe1, 0x78, 0x81, 0x03,
+ 0x64, 0x28, 0xcc, 0x43, 0x31, 0xd7, 0xa6, 0xf6, 0xea, 0x34, 0x2c, 0x3e,
+ 0x24, 0xbc, 0x7d, 0x5c, 0x3a, 0x5b, 0x3e, 0x61, 0xdc, 0x32, 0x23, 0x30,
+ 0x64, 0x2f, 0x51, 0x15, 0x43, 0x04, 0xdd, 0xa2, 0xa2, 0x2c, 0x66, 0x94,
+ 0x9a, 0xb4, 0x6c, 0x7b, 0x99, 0x2e, 0xc3, 0x57, 0x6a, 0xaf, 0xe6, 0x61,
+ 0xdc, 0x66, 0x76, 0x8c, 0x36, 0xe2, 0x41, 0xe9, 0xea, 0xf3, 0x97, 0x68,
+ 0x8d, 0x22, 0x94, 0x93, 0x97, 0xb3, 0xc4, 0xd3, 0xfd, 0x25, 0x47, 0xb5,
+ 0x7c, 0x53, 0xb6, 0x23, 0xdd, 0xd0, 0x2f, 0x50, 0xf2, 0x20, 0xc7, 0xd1,
+ 0xf8, 0xca, 0xe8, 0xbf, 0xb8, 0x17, 0xff, 0xa9, 0xef, 0x07, 0x73, 0xcf,
+ 0xd0, 0x86, 0xb5, 0xae, 0xc9, 0x05, 0x86, 0x69, 0xd5, 0xf8, 0x8f, 0x3c,
+ 0xfe, 0xa6, 0xb7, 0x82, 0x6c, 0x63, 0x91, 0x18, 0xc6, 0x08, 0x19, 0xf5,
+ 0xa1, 0xe4, 0x12, 0xd7, 0x74, 0x94, 0x49, 0x8e, 0xa1, 0xcf, 0xd0, 0x2e,
+ 0x86, 0x98, 0xc3, 0x33, 0x16, 0x1b, 0x20, 0x13, 0x78, 0x58, 0x7e, 0x17,
+ 0x73, 0x91, 0x1c, 0x9a, 0xdf, 0x81, 0xd3, 0x2c, 0x46, 0xe8, 0x50, 0xaf,
+ 0x7f, 0x86, 0x9a, 0xaa, 0x1a, 0x09, 0xe6, 0x92, 0xf0, 0x1c, 0xdd, 0x78,
+ 0xc4, 0x29, 0xdf, 0x6d, 0xcc, 0x4c, 0x5a, 0x2f, 0xc1, 0xa5, 0x76, 0xcc,
+ 0x05, 0xed, 0xf3, 0xd6, 0xf9, 0x23, 0x45, 0x58, 0xa3, 0x5f, 0x4a, 0x25,
+ 0xcd, 0x4a, 0x84, 0xfc, 0x1a, 0xfb, 0xd6, 0xe2, 0xe3, 0x70, 0xf1, 0x31,
+ 0xea, 0x20, 0x56, 0x24, 0x99, 0xd3, 0xc9, 0x89, 0xcc, 0x2e, 0xd5, 0x22,
+ 0x57, 0xec, 0x58, 0xbb, 0x83, 0xae, 0x19, 0x15, 0xf5, 0x8c, 0xa0, 0xd7,
+ 0xaa, 0x1c, 0x79, 0x83, 0xdc, 0x29, 0xae, 0xd1, 0xfd, 0x60, 0x21, 0xb3,
+ 0xbf, 0x1b, 0x6f, 0x05, 0xb6, 0x9c, 0xf2, 0xa2, 0x98, 0xe2, 0xc5, 0x87,
+ 0xe8, 0xa8, 0xe4, 0x2c, 0x1d, 0x4f, 0x91, 0xde, 0xdf, 0x2c, 0x5b, 0x11,
+ 0x2d, 0x91, 0x3a, 0xa8, 0xc0, 0xf7, 0xc2, 0xd2, 0x77, 0x05, 0xe1, 0xfa,
+ 0x85, 0x30, 0x9d, 0xda, 0xf0, 0x6c, 0x10, 0xa2, 0xf5, 0x47, 0xcc, 0x29,
+ 0xae, 0xdf, 0xc1, 0x20, 0xfa, 0x1f, 0xf3, 0xae, 0xe4, 0x00, 0x38, 0xc8,
+ 0x0c, 0x18, 0x6f, 0x08, 0xcf, 0xc3, 0xe0, 0x3e, 0x01, 0x9d, 0x79, 0xa7,
+ 0xa6, 0xe2, 0x0a, 0x82, 0x58, 0xa4, 0x11, 0x48, 0xb5, 0x9b, 0xe2, 0x4b,
+ 0x42, 0x09, 0x17, 0x20, 0x09, 0xc3, 0x0e, 0xe7, 0x0f, 0xe4, 0xcd, 0x62,
+ 0x26, 0x7c, 0x12, 0xe7, 0x5b, 0x1e, 0xc4, 0xaa, 0x5d, 0x92, 0x0f, 0xbb,
+ 0x8c, 0x39, 0xfc, 0x57, 0x28, 0x75, 0x84, 0xf2, 0xa1, 0xb9, 0xa1, 0x38,
+ 0xde, 0xfc, 0xbc, 0x84, 0x96, 0x86, 0x6a, 0xdb, 0x0e, 0x87, 0x89, 0x6f,
+ 0x98, 0xb5, 0x83, 0x8d, 0x01, 0xaf, 0xf1, 0xd9, 0xd9, 0x0e, 0x04, 0xcd,
+ 0x5e, 0xda, 0x0a, 0xd6, 0x48, 0x7a, 0xc5, 0xaa, 0x7c, 0xcc, 0x4c, 0x20,
+ 0x48, 0xe4, 0xb8, 0x44, 0xca, 0x50, 0xa5, 0x9f, 0xc7, 0x27, 0xed, 0x1b,
+ 0x40, 0x2b, 0xdd, 0x1a, 0xae, 0xe1, 0x8d, 0xe0, 0x26, 0x31, 0xec, 0x2b,
+ 0xb6, 0xc6, 0xda, 0x43, 0x52, 0xc4, 0xfa, 0xc2, 0x35, 0x39, 0x2c, 0x63,
+ 0xef, 0x2b, 0x42, 0xc4, 0xfa, 0x53, 0x8c, 0x7d, 0xcd, 0x85, 0x84, 0x44,
+ 0x98, 0x17, 0x08, 0x63, 0x1f, 0xb9, 0xc8, 0x1e, 0x33, 0x1f, 0xf1, 0xab,
+ 0x83, 0x97, 0x22, 0x62, 0x22, 0x57, 0x7d, 0x8d, 0xa6, 0x41, 0x77, 0x38,
+ 0xdf, 0x5f, 0x45, 0xa1, 0xbb, 0x49, 0x82, 0x6e, 0x0a, 0xf9, 0x94, 0x00,
+ 0xea, 0x6f, 0x4a, 0xe8, 0x16, 0x4b, 0x78, 0x33, 0x26, 0x18, 0x3b, 0x3b,
+ 0x5f, 0x28, 0x58, 0x3f, 0xa7, 0x4e, 0xdc, 0x21, 0x31, 0xd4, 0x3b, 0xec,
+ 0x71, 0xf1, 0xd5, 0xb5, 0xa1, 0x0f, 0x91, 0xc9, 0xc4, 0xd3, 0xca, 0xbd,
+ 0x39, 0xd2, 0xef, 0x21, 0xdf, 0xba, 0xd9, 0xce, 0x65, 0xdd, 0x1a, 0xb5,
+ 0x66, 0xba, 0x7a, 0x80, 0x37, 0x68, 0x32, 0xc1, 0xb4, 0x2b, 0x4b, 0x44,
+ 0xc2, 0x35, 0x0e, 0x7e, 0xd9, 0x71, 0x93, 0xb9, 0xac, 0x6b, 0x7e, 0x63,
+ 0x9c, 0xa0, 0xab, 0x10, 0x7c, 0x62, 0xe8, 0xfc, 0x1c, 0x62, 0x79, 0x09,
+ 0x70, 0xa8, 0xe5, 0x67, 0x1f, 0x5b, 0xc0, 0x5c, 0x87, 0x1a, 0x90, 0x24,
+ 0x0c, 0xb4, 0x3c, 0x8d, 0xe4, 0xf6, 0x44, 0x62, 0xd0, 0x55, 0x9e, 0x05,
+ 0x75, 0xa3, 0xe2, 0xac, 0x10, 0x11, 0x7f, 0x5b, 0x96, 0x65, 0x38, 0xa7,
+ 0x2a, 0x0f, 0xbe, 0x5e, 0x01, 0x14, 0xb4, 0x8a, 0xa1, 0xa8, 0xe8, 0x5a,
+ 0xbc, 0x4b, 0x22, 0x67, 0xd6, 0x14, 0xc3, 0x60, 0xf2, 0x12, 0xd9, 0x6f,
+ 0x1a, 0x6d, 0xba, 0x17, 0xc7, 0x12, 0x93, 0x2e, 0xa7, 0x8d, 0x19, 0x86,
+ 0x65, 0x56, 0x2b, 0xf5, 0x10, 0x45, 0xda, 0xef, 0xc0, 0xdc, 0x92, 0x18,
+ 0xc4, 0xdd, 0x6c, 0xfc, 0xcb, 0x41, 0xfb, 0x04, 0x88, 0xfc, 0x1f, 0x7d,
+ 0xdf, 0xe6, 0x34, 0xab, 0x85, 0x56, 0x81, 0x43, 0x2e, 0xea, 0x45, 0x14,
+ 0xd8, 0x5e, 0x3e, 0xd4, 0xd0, 0x41, 0x47, 0x7c, 0x16, 0xf2, 0xa1, 0x15,
+ 0xdc, 0x09, 0x97, 0xd3, 0x6b, 0x4c, 0x26, 0x58, 0xa4, 0xb9, 0x5e, 0x7c,
+ 0x80, 0x55, 0x13, 0x50, 0xde, 0x11, 0x36, 0x60, 0xd4, 0x47, 0x15, 0xea,
+ 0x80, 0x6d, 0x55, 0x91, 0x02, 0x15, 0x6f, 0xe5, 0x4a, 0x11, 0xa6, 0x6e,
+ 0x30, 0xe0, 0x14, 0xd9, 0x9a, 0x9e, 0x8b, 0x85, 0x81, 0x7f, 0xd0, 0x17,
+ 0xb3, 0xdf, 0x8b, 0x3a, 0xcc, 0xaa, 0x65, 0x73, 0xcc, 0x15, 0xe1, 0x09,
+ 0x1a, 0x99, 0xa9, 0x03, 0x1e, 0x00, 0x5c, 0xc8, 0x67, 0xf4, 0x73, 0x03,
+ 0x0f, 0x78, 0x29, 0x37, 0x7d, 0x68, 0x1b, 0x86, 0x06, 0xf9, 0x27, 0x04,
+ 0xa6, 0xef, 0xf2, 0xe8, 0xbc, 0xa7, 0xc1, 0xf9, 0x08, 0x6a, 0x45, 0x89,
+ 0xea, 0x81, 0x86, 0x77, 0xa4, 0xea, 0x5b, 0x8c, 0xd6, 0x60, 0x23, 0x19,
+ 0x42, 0xc6, 0x42, 0x01, 0x7d, 0x33, 0x83, 0xd7, 0x07, 0x7e, 0xd9, 0x91,
+ 0x45, 0xf9, 0x28, 0x59, 0x37, 0x1a, 0x47, 0x98, 0x53, 0xcd, 0x3f, 0x3d,
+ 0x3d, 0xaa, 0xbc, 0x2b, 0x1c, 0x0e, 0x0a, 0x4f, 0x47, 0x35, 0x01, 0xbe,
+ 0x2c, 0xda, 0xd8, 0xa4, 0xa2, 0x50, 0x66, 0x99, 0x8c, 0x44, 0x59, 0x60,
+ 0xe8, 0xff, 0x9b, 0x65, 0x4c, 0x26, 0xcf, 0x43, 0x95, 0x27, 0x5d, 0xf4,
+ 0x73, 0x9f, 0x76, 0x04, 0x9e, 0xaf, 0xbb, 0x41, 0x55, 0xe6, 0xa6, 0x9a,
+ 0xa5, 0xd1, 0x0c, 0x55, 0x79, 0xf1, 0xba, 0x48, 0x37, 0x2a, 0x33, 0x82,
+ 0x77, 0x87, 0x05, 0xeb, 0x86, 0x77, 0x3a, 0x98, 0x30, 0xe9, 0xe0, 0x0f,
+ 0x28, 0x46, 0x3c, 0x94, 0xfa, 0x3c, 0x60, 0xbf, 0x82, 0xb9, 0xff, 0xf7,
+ 0x46, 0xa6, 0x2a, 0x4f, 0x4a, 0xe0, 0x95, 0x38, 0x4a, 0x97, 0x33, 0x15,
+ 0x51, 0xcd, 0xe7, 0xf9, 0x56, 0x4f, 0x0d, 0x59, 0x9f, 0x61, 0xdd, 0x36,
+ 0x6f, 0xf7, 0x78, 0x86, 0x16, 0xd0, 0x3b, 0x82, 0xc0, 0x59, 0xc1, 0xa8,
+ 0x8a, 0xcb, 0x6f, 0xc2, 0xce, 0x24, 0x1c, 0x0c, 0x50, 0x13, 0x1c, 0xe4,
+ 0xa7, 0xaf, 0x0c, 0xf7, 0x6e, 0xb9, 0x92, 0x44, 0xbb, 0xeb, 0xd9, 0x3b,
+ 0x3d, 0xff, 0xd2, 0xea, 0x9b, 0x52, 0x7b, 0x3f, 0x4f, 0x43, 0x0c, 0xa4,
+ 0x28, 0xbc, 0x46, 0x2e, 0xb0, 0xef, 0xbd, 0xeb, 0xa8, 0x7a, 0x2c, 0xf3,
+ 0xfb, 0x91, 0x9e, 0x46, 0xbc, 0x76, 0x53, 0x36, 0xe1, 0x6d, 0x76, 0xc6,
+ 0x2b, 0x58, 0x99, 0x28, 0xa6, 0xa3, 0x4e, 0xd7, 0xce, 0x18, 0xbc, 0x29,
+ 0x32, 0x9c, 0x06, 0xf7, 0x00, 0xca, 0xcb, 0x66, 0x38, 0xa6, 0x2e, 0xe9,
+ 0xa8, 0x18, 0x1a, 0x8c, 0x6e, 0x80, 0xe8, 0xc8, 0x89, 0x3d, 0xb9, 0xb3,
+ 0x41, 0x98, 0x62, 0x23, 0x73, 0x02, 0xb1, 0x05, 0x2e, 0xb1, 0xec, 0x1c,
+ 0x20, 0x82, 0xcd, 0x7b, 0xf3, 0xb1, 0x84, 0xaf, 0x8c, 0xf2, 0x2c, 0x0b,
+ 0x61, 0x6b, 0x76, 0xf7, 0xd4, 0xbf, 0x0d, 0x54, 0x99, 0x3a, 0xca, 0xf9,
+ 0x8d, 0x1e, 0x3a, 0xad, 0x02, 0xbc, 0x54, 0x75, 0x0c, 0x32, 0xe1, 0xa8,
+ 0xa3, 0xb2, 0xa9, 0xf6, 0x49, 0x70, 0x51, 0xcb, 0x9d, 0x91, 0xdd, 0x23,
+ 0x9e, 0xb0, 0x30, 0xb4, 0xf5, 0x3c, 0x93, 0xaa, 0x34, 0x7d, 0x51, 0x4f,
+ 0xb7, 0xb2, 0x47, 0xbc, 0x08, 0x83, 0x2f, 0x74, 0xc4, 0xcc, 0xfc, 0xda,
+ 0x06, 0x4a, 0xc3, 0x74, 0x38, 0x85, 0x55, 0x48, 0x7a, 0x1e, 0x61, 0x64,
+ 0x8f, 0x69, 0x51, 0x5b, 0xf9, 0x92, 0xd0, 0x64, 0x96, 0x14, 0x13, 0x61,
+ 0x9e, 0xfe, 0x00, 0x7b, 0xdc, 0x31, 0x12, 0x0f, 0x3e, 0x48, 0x3f, 0x16,
+ 0xb7, 0xc5, 0xa0, 0x19, 0x07, 0x66, 0xc6, 0xb5, 0xf0, 0xa1, 0x80, 0xf8,
+ 0xe0, 0x38, 0x74, 0x3b, 0x49, 0x0f, 0xbf, 0x61, 0x5c, 0x4a, 0x1f, 0x33,
+ 0xa2, 0x85, 0x17, 0xf9, 0xeb, 0x6b, 0x1e, 0x91, 0x98, 0x45, 0x96, 0x7a,
+ 0x55, 0xa5, 0x2d, 0x68, 0xcb, 0x72, 0x09, 0x22, 0x0f, 0xe3, 0x5c, 0x4f,
+ 0x43, 0x3f, 0xcb, 0xb4, 0xce, 0x37, 0xfa, 0x27, 0xe0, 0x5f, 0xc5, 0x44,
+ 0xd9, 0x9d, 0x8c, 0x0e, 0x97, 0x95, 0xb6, 0x81, 0xdf, 0xf2, 0x8e, 0xa5,
+ 0x0d, 0x8a, 0x94, 0x43, 0x8f, 0x3c, 0xb8, 0xfd, 0xdc, 0x7a, 0x4a, 0xe7,
+ 0xb5, 0xc0, 0x5a, 0xc0, 0xa4, 0x75, 0x48, 0x4c, 0xd5, 0xf4, 0x3b, 0x71,
+ 0x8c, 0x36, 0x6e, 0x28, 0xb0, 0xb2, 0x51, 0x3e, 0x2b, 0xe9, 0x79, 0x62,
+ 0xb1, 0x7b, 0x13, 0x4b, 0x9c, 0x19, 0x15, 0x40, 0xf6, 0x72, 0x2d, 0xdf,
+ 0x97, 0x21, 0x18, 0x11, 0xd6, 0xcc, 0xc0, 0xa2, 0xab, 0x58, 0xf1, 0x71,
+ 0x44, 0xca, 0xca, 0x1f, 0x36, 0x85, 0xba, 0x62, 0x93, 0x77, 0x36, 0xc4,
+ 0xed, 0x3d, 0x5d, 0x84, 0x64, 0x2c, 0x72, 0xc6, 0xa7, 0x1a, 0xdb, 0x8f,
+ 0xdb, 0xf9, 0xf5, 0xf2, 0x91, 0x79, 0x5f, 0xd5, 0xfc, 0x15, 0x6c, 0xc4,
+ 0x8d, 0x7e, 0x2b, 0x19, 0x0e, 0xb3, 0x2e, 0xa7, 0x84, 0x6a, 0xf2, 0xba,
+ 0x44, 0xa5, 0x51, 0x96, 0x31, 0xd4, 0x7e, 0x2e, 0x18, 0xc1, 0x20, 0xe1,
+ 0x69, 0xe6, 0x8b, 0xab, 0x00, 0x9d, 0x73, 0x5e, 0xa4, 0xe1, 0xf4, 0x27,
+ 0x7b, 0x25, 0x3f, 0x90, 0x13, 0x5d, 0xf5, 0xcb, 0x13, 0xbd, 0xcb, 0x06,
+ 0xa3, 0x04, 0x97, 0x0b, 0x0b, 0x38, 0x84, 0xe2, 0xc2, 0x7b, 0xe0, 0x59,
+ 0x35, 0x18, 0x7f, 0x89, 0x6d, 0x78, 0x0f, 0x63, 0xb4, 0x88, 0xd5, 0x93,
+ 0x80, 0xec, 0x88, 0x8c, 0xe0, 0xfa, 0x28, 0x11, 0x34, 0x7d, 0x71, 0xb8,
+ 0x07, 0xc8, 0xdb, 0x8f, 0x08, 0xda, 0xf3, 0x76, 0xa8, 0x75, 0x1b, 0x96,
+ 0x11, 0x48, 0xb4, 0x11, 0x70, 0xa2, 0x30, 0xb7, 0xdf, 0x98, 0xce, 0x31,
+ 0xa2, 0xeb, 0x6a, 0x27, 0xee, 0x0d, 0xea, 0xbc, 0x2d, 0x52, 0x81, 0x9b,
+ 0xe2, 0xca, 0x71, 0x59, 0x31, 0x34, 0x0d, 0xd8, 0x4b, 0x7e, 0x83, 0xb2,
+ 0xeb, 0x95, 0xa4, 0x19, 0xd5, 0xa4, 0xe7, 0xb1, 0xe4, 0x79, 0xcf, 0xb3,
+ 0x48, 0xcc, 0x24, 0xeb, 0xfe, 0x00, 0x9d, 0x92, 0x0c, 0x5b, 0xd7, 0x42,
+ 0x25, 0x2c, 0x67, 0xea, 0x20, 0x60, 0xee, 0x0b, 0x46, 0x74, 0xfe, 0xa0,
+ 0x6c, 0x07, 0x0e, 0x98, 0xb2, 0xf5, 0xa0, 0x27, 0x47, 0x35, 0xc8, 0xc4,
+ 0x08, 0x9a, 0xfc, 0x9f, 0x32, 0x21, 0x4f, 0x22, 0x04, 0xbf, 0x4c, 0x06,
+ 0x68, 0x3e, 0xc6, 0x93, 0xd1, 0x7e, 0x10, 0x83, 0x40, 0xfe, 0x1a, 0x69,
+ 0x12, 0x77, 0xb5, 0x00, 0x1e, 0x38, 0x90, 0xf7, 0xd8, 0xd7, 0x6f, 0x86,
+ 0xf5, 0xb4, 0x58, 0xa7, 0x66, 0x48, 0x26, 0xfd, 0x14, 0xfd, 0x8e, 0xe5,
+ 0xca, 0x94, 0x1c, 0x95, 0x10, 0x9c, 0x30, 0xa7, 0xd1, 0xd3, 0xe3, 0x1e,
+ 0x08, 0xf4, 0x80, 0xf0, 0x73, 0x09, 0x58, 0xe0, 0x5a, 0xf2, 0x23, 0x30,
+ 0xcf, 0x3c, 0x61, 0xbb, 0x08, 0x07, 0x89, 0x37, 0xad, 0x9d, 0x46, 0xca,
+ 0xbd, 0x03, 0x0c, 0xde, 0xe1, 0x94, 0xeb, 0xdb, 0x7d, 0x8c, 0x0e, 0x3b,
+ 0xe3, 0x24, 0x99, 0x23, 0x7c, 0x64, 0x79, 0x9f, 0x66, 0x5c, 0x83, 0xe7,
+ 0x8e, 0xb7, 0xf5, 0x8a, 0x98, 0xdc, 0x60, 0xa7, 0x67, 0x2d, 0x4e, 0xf5,
+ 0x0a, 0x45, 0x6e, 0x60, 0x9f, 0xfd, 0x28, 0x4d, 0xb4, 0x66, 0xed, 0xcd,
+ 0xb8, 0x50, 0x77, 0x7a, 0x89, 0xad, 0xc7, 0x42, 0xee, 0xe8, 0x3d, 0x73,
+ 0x68, 0xee, 0xd1, 0x80, 0x1b, 0x13, 0x10, 0x2f, 0xe5, 0x33, 0xd9, 0x12,
+ 0x1f, 0x08, 0x56, 0x10, 0x82, 0x32, 0x0e, 0x51, 0x18, 0x06, 0x91, 0x2c,
+ 0xce, 0x1b, 0x0a, 0x1d, 0x92, 0x89, 0xa9, 0xd3, 0x3c, 0x35, 0x1f, 0xe4,
+ 0x0a, 0x40, 0xea, 0x80, 0x8a, 0xdc, 0x2d, 0x86, 0x58, 0x6f, 0xd9, 0x1e,
+ 0x88, 0xc0, 0xad, 0x26, 0x95, 0xce, 0x84, 0xf8, 0xfc, 0x6a, 0x4a, 0x33,
+ 0x23, 0x11, 0xed, 0xea, 0x1a, 0xe8, 0x59, 0x1e, 0xa0, 0xb4, 0x71, 0x92,
+ 0x49, 0x43, 0x0b, 0x8d, 0xb4, 0x31, 0x33, 0x79, 0xfb, 0x49, 0x3b, 0xab,
+ 0x66, 0x58, 0x77, 0x4b, 0xdf, 0x6c, 0x11, 0xcb, 0x60, 0x09, 0x94, 0xd6,
+ 0xa5, 0xc9, 0xad, 0xe3, 0x73, 0xc0, 0x26, 0x44, 0xd9, 0xe8, 0x8e, 0x46,
+ 0x82, 0x3a, 0x58, 0x1d, 0x58, 0xb8, 0x40, 0x76, 0x2d, 0x0d, 0xc3, 0x26,
+ 0x70, 0x40, 0x6d, 0xd9, 0xe0, 0xc8, 0xca, 0xbe, 0x4c, 0x13, 0x40, 0x03,
+ 0x43, 0xc8, 0xa5, 0x8f, 0x85, 0xd5, 0xcb, 0x36, 0x81, 0x3d, 0xb2, 0xd1,
+ 0xfa, 0xce, 0xf9, 0x74, 0x07, 0xdb, 0xcf, 0x61, 0x28, 0x49, 0x44, 0xcb,
+ 0x72, 0x28, 0x15, 0xe9, 0x56, 0xd3, 0x0f, 0xd8, 0xc4, 0x07, 0xac, 0x63,
+ 0xff, 0xc6, 0x7f, 0xe1, 0x78, 0x94, 0xf9, 0xce, 0xaf, 0x94, 0x5b, 0x09,
+ 0x17, 0xa5, 0x45, 0x70, 0xc7, 0x61, 0xfb, 0x91, 0xbb, 0x0b, 0x5c, 0xe6,
+ 0xb8, 0x62, 0xb6, 0x1c, 0x95, 0xf9, 0x48, 0xa5, 0xe9, 0x25, 0x70, 0x35,
+ 0x65, 0x07, 0x06, 0x20, 0xca, 0x12, 0x54, 0x36, 0x9b, 0xda, 0x04, 0x8d,
+ 0x07, 0x6d, 0xb0, 0x57, 0x5b, 0x16, 0xc4, 0xd4, 0x33, 0x6a, 0xa6, 0x3b,
+ 0x57, 0x10, 0x63, 0x00, 0x50, 0x9e, 0x91, 0x1c, 0x28, 0xd7, 0x1a, 0x59,
+ 0x20, 0xa3, 0x87, 0x14, 0x3f, 0x26, 0x29, 0xa6, 0xf0, 0x73, 0x20, 0x54,
+ 0xfb, 0xa0, 0xc5, 0xf1, 0xd4, 0x8b, 0x01, 0x5e, 0xd4, 0x53, 0x78, 0x49,
+ 0x6f, 0x32, 0xfb, 0x42, 0xec, 0x69, 0x77, 0x28, 0xc1, 0x6f, 0xa9, 0xc4,
+ 0x5c, 0x94, 0x6b, 0x59, 0x59, 0xfd, 0xff, 0x8b, 0xf4, 0xd5, 0x42, 0x12,
+ 0xd1, 0xb1, 0x0d, 0x71, 0xbd, 0x54, 0x0d, 0xa6, 0xb6, 0x14, 0x03, 0x8b,
+ 0xe3, 0xf8, 0x89, 0x35, 0xd7, 0xdc, 0x62, 0x5b, 0x86, 0x0f, 0xc1, 0x52,
+ 0x06, 0x73, 0x68, 0xa3, 0xe3, 0x58, 0x2e, 0x85, 0x2e, 0xe7, 0xf7, 0xad,
+ 0xc5, 0x61, 0x39, 0xb6, 0xff, 0x00, 0xf3, 0xc6, 0x4e, 0x02, 0xc8, 0x2a,
+ 0x8b, 0x4f, 0x2e, 0x14, 0x61, 0xbf, 0xb9, 0x7b, 0xba, 0xf3, 0xac, 0x99,
+ 0xac, 0xb0, 0x08, 0xcc, 0x8b, 0x9a, 0xf1, 0xc9, 0x20, 0x89, 0x00, 0xd7,
+ 0xbb, 0x5c, 0xe4, 0x4b, 0x44, 0x4d, 0xff, 0x21, 0x4b, 0xb8, 0x8b, 0x05,
+ 0x91, 0x8c, 0x09, 0x2b, 0x3b, 0x1f, 0xbb, 0xeb, 0x4d, 0xd2, 0xe0, 0x92,
+ 0x00, 0x05, 0x91, 0x30, 0x01, 0x87, 0xa2, 0x92, 0x67, 0x21, 0xe0, 0x5c,
+ 0x2f, 0x5a, 0x56, 0x55, 0x11, 0x6d, 0x7c, 0x33, 0x26, 0xff, 0x93, 0xa0,
+ 0x40, 0xdd, 0xdd, 0x59, 0x05, 0x53, 0x6d, 0x95, 0x20, 0x27, 0xdb, 0xec,
+ 0x38, 0xb1, 0x4b, 0x76, 0x68, 0xd9, 0x7d, 0x49, 0x89, 0x60, 0x40, 0x97,
+ 0x79, 0xa9, 0xcd, 0x9a, 0x61, 0x2d, 0xac, 0x14, 0x9c, 0x20, 0x53, 0xea,
+ 0xa8, 0x17, 0xf8, 0xb2, 0x3a, 0x0e, 0x6c, 0x73, 0xe6, 0x93, 0x07, 0xd1,
+ 0x43, 0xa6, 0xc8, 0x42, 0x76, 0xe6, 0xf3, 0x46, 0x68, 0x56, 0xe0, 0xef,
+ 0x22, 0x07, 0xe6, 0x6d, 0x37, 0x2e, 0x6b, 0xba, 0xa9, 0x73, 0x1d, 0x43,
+ 0x5b, 0x7e, 0x46, 0x53, 0x6b, 0x28, 0x60, 0x45, 0x97, 0x2f, 0xc2, 0xea,
+ 0xbf, 0x1d, 0x23, 0x52, 0x57, 0x3d, 0x26, 0xf4, 0x16, 0x06, 0x72, 0x05,
+ 0xc4, 0xcd, 0xcb, 0xcd, 0x8c, 0xb7, 0x14, 0xb1, 0xbb, 0xb0, 0xcf, 0xb9,
+ 0xaa, 0xd0, 0x8b, 0x89, 0x91, 0x37, 0xdb, 0xeb, 0x0f, 0xbe, 0xcd, 0xc5,
+ 0xec, 0x31, 0x61, 0xca, 0xa4, 0x66, 0xa4, 0x7b, 0xe8, 0x8d, 0x96, 0xbd,
+ 0x4a, 0x11, 0xf6, 0xcf, 0xe9, 0x6c, 0xd5, 0xea, 0xc5, 0xfd, 0xe3, 0x04,
+ 0x27, 0x32, 0xc8, 0x21, 0xab, 0x16, 0xc1, 0x2b, 0xf1, 0x99, 0x4b, 0x8d,
+ 0x38, 0x9b, 0xd4, 0xb8, 0xa6, 0xef, 0x3e, 0x12, 0xc4, 0xf9, 0x7e, 0x4a,
+ 0x7c, 0x26, 0xcf, 0xc2, 0xac, 0x9c, 0xd5, 0xe7, 0x78, 0xba, 0x54, 0x00,
+ 0x7c, 0xa3, 0x51, 0x92, 0x4e, 0x62, 0x1b, 0xa4, 0xa2, 0xbd, 0x3b, 0xf7,
+ 0xb5, 0xfb, 0x0f, 0xef, 0x89, 0xef, 0x8b, 0xa0, 0x6c, 0x08, 0x44, 0xe0,
+ 0x4d, 0x00, 0x3c, 0x28, 0xda, 0x64, 0xde, 0xef, 0xa8, 0x22, 0x08, 0x72,
+ 0x5a, 0x67, 0x44, 0xb0, 0x9a, 0x18, 0xfb, 0x62, 0x54, 0xa7, 0xf4, 0x7f,
+ 0x9f, 0xc7, 0x1e, 0xb3, 0x8f, 0x28, 0xe1, 0x0f, 0x21, 0x16, 0x38, 0xb0,
+ 0xe4, 0xfc, 0xdd, 0x8a, 0x94, 0x09, 0xc0, 0x93, 0x28, 0x2f, 0x81, 0x8c,
+ 0x90, 0xd6, 0x26, 0x74, 0x14, 0xaa, 0x76, 0x49, 0x6a, 0xd4, 0x18, 0xb7,
+ 0x4d, 0x82, 0xfd, 0x4a, 0x5d, 0xb0, 0xd1, 0x05, 0xfd, 0xf8, 0x2f, 0xb2,
+ 0xf9, 0x69, 0x80, 0x44, 0xd2, 0x1b, 0x0a, 0x67, 0xe1, 0xd3, 0xf6, 0xe0,
+ 0x67, 0x66, 0x59, 0xf0, 0xcb, 0x3b, 0x91, 0x6c, 0x04, 0x05, 0xdd, 0x94,
+ 0xbb, 0x9d, 0x08, 0x27, 0x0a, 0x1b, 0xc9, 0x6d, 0x87, 0x3c, 0x6c, 0x36,
+ 0xed, 0x1b, 0x03, 0x18, 0x68, 0x81, 0xaa, 0x6d, 0x8c, 0xf1, 0xea, 0x7b,
+ 0x96, 0x47, 0x81, 0xb3, 0x24, 0x0f, 0x62, 0x5a, 0x59, 0x7e, 0x1f, 0x55,
+ 0x7c, 0x25, 0x23, 0x07, 0x3a, 0x42, 0xec, 0x9c, 0x73, 0x12, 0xc5, 0xa2,
+ 0x8f, 0x0d, 0x35, 0xe3, 0x01, 0xa3, 0x6f, 0x90, 0x04, 0x90, 0xee, 0xbc,
+ 0x8f, 0xc0, 0x46, 0x93, 0x21, 0x9e, 0xed, 0xf2, 0x9c, 0x2f, 0x85, 0x6f,
+ 0xee, 0x60, 0x01, 0x68, 0x89, 0x16, 0x33, 0x57, 0x73, 0x9e, 0xc9, 0x78,
+ 0xf1, 0xf5, 0xab, 0x2a, 0x62, 0x00, 0x07, 0xed, 0x6e, 0x30, 0xf1, 0xae,
+ 0xa5, 0x66, 0xfe, 0x54, 0xf3, 0x56, 0x77, 0x5d, 0x80, 0x79, 0x60, 0x11,
+ 0x69, 0xc4, 0x46, 0x5d, 0xfa, 0x96, 0x27, 0x8b, 0x2b, 0x19, 0x3b, 0x51,
+ 0x4a, 0x15, 0x12, 0xec, 0xc0, 0xf2, 0x05, 0xb1, 0x60, 0x54, 0x52, 0xe3,
+ 0x96, 0xbf, 0xc7, 0x45, 0xe9, 0x8e, 0x68, 0x57, 0x78, 0x91, 0x0e, 0x14,
+ 0x9e, 0xae, 0xfa, 0x7d, 0x2e, 0x06, 0x2e, 0x0b, 0xd4, 0x04, 0xfa, 0x07,
+ 0x9d, 0x62, 0x91, 0x0a, 0xc6, 0xdd, 0x68, 0x8f, 0x8c, 0xe7, 0x10, 0xf0,
+ 0xe9, 0xd1, 0x8a, 0x02, 0xf1, 0xde, 0x8e, 0xf7, 0xdf, 0x5f, 0x3e, 0xf9,
+ 0x59, 0x96, 0xb9, 0xa0, 0x3b, 0x6e, 0xc8, 0xad, 0x1e, 0x04, 0xa8, 0x8a,
+ 0xa9, 0x84, 0x0e, 0xc8, 0x2b, 0x2f, 0xf0, 0x1c, 0xf0, 0x0a, 0xb3, 0xaf,
+ 0xaa, 0x31, 0x5f, 0x98, 0xf8, 0xbc, 0xa2, 0x94, 0x5c, 0x4d, 0x72, 0xf6,
+ 0xfd, 0x30, 0x16, 0xd0, 0x00, 0x00, 0x00, 0x24, 0x83, 0x7d, 0x18, 0xb2,
+ 0x1e, 0xea, 0xe4, 0x5c, 0xe0, 0x5b, 0x31, 0x68, 0x13, 0x9d, 0x45, 0x46,
+ 0x45, 0x1a, 0x5e, 0xf5, 0x77, 0x1e, 0xa8, 0x21, 0xcb, 0x32, 0x50, 0xe1,
+ 0x60, 0xaa, 0xfc, 0xba, 0x26, 0x67, 0xe1, 0x9f, 0xd0, 0xaa, 0x14, 0xca,
+ 0x09, 0xe7, 0xf0, 0xf6, 0x83, 0x2a, 0xba, 0xa7, 0xc5, 0x4f, 0x71, 0x3c,
+ 0x96, 0x3c, 0x46, 0xb1, 0xf8, 0x3f, 0x2c, 0xa6, 0x6c, 0xb7, 0x2d, 0x7b,
+ 0xd0, 0x2f, 0x65, 0x88, 0x33, 0x20, 0xf3, 0x3c, 0x64, 0x85, 0xda, 0x4a,
+ 0x64, 0xa1, 0xcf, 0x0a, 0x41, 0x86, 0x05, 0xe1, 0x4d, 0x4d, 0x79, 0xc6,
+ 0x20, 0x47, 0x54, 0x65, 0xcd, 0x56, 0x10, 0x4f, 0xe1, 0x20, 0x5f, 0x5f,
+ 0x83, 0xf3, 0x8d, 0xcd, 0x93, 0x0e, 0xce, 0xfa, 0x2e, 0xf3, 0x06, 0xb3,
+ 0x95, 0x3a, 0xc4, 0xa4, 0xcd, 0x63, 0xf2, 0xe1, 0x64, 0x84, 0x1f, 0x38,
+ 0xce, 0x90, 0x0f, 0xd4, 0x75, 0xb9, 0xb6, 0x7f, 0xf1, 0x28, 0xfc, 0xbe,
+ 0xe2, 0xdd, 0xa7, 0x9a, 0xa1, 0xdf, 0x0a, 0x7c, 0xc3, 0xff, 0x7b, 0xc1,
+ 0xbf, 0x58, 0x8c, 0xfa, 0x7f, 0x7f, 0xa9, 0xe4, 0x10, 0x8b, 0x00, 0xc1,
+ 0x8b, 0xbd, 0xbd, 0xe6, 0xe2, 0x99, 0x57, 0x28, 0x40, 0x0f, 0x3b, 0x88,
+ 0xb8, 0xa9, 0x68, 0xfc, 0x2d, 0x2e, 0xf2, 0xb4, 0xea, 0x35, 0x57, 0x06,
+ 0x0c, 0x87, 0x05, 0xe9, 0xeb, 0x88, 0x78, 0xe6, 0x3e, 0x78, 0x61, 0xf7,
+ 0x38, 0xd3, 0x5d, 0x22, 0x3b, 0x60, 0x6d, 0x93, 0xdc, 0xe6, 0xc3, 0x2d,
+ 0x16, 0x3b, 0x8d, 0x9c, 0x8c, 0xd2, 0xd7, 0x38, 0x29, 0x8d, 0x5e, 0x83,
+ 0x4f, 0x4a, 0xe3, 0x5e, 0xd4, 0xba, 0xdb, 0x75, 0x85, 0x3c, 0x5b, 0x13,
+ 0xb7, 0x6f, 0xda, 0x59, 0x65, 0x62, 0x58, 0xe3, 0x09, 0x35, 0xac, 0x7e,
+ 0x50, 0xb4, 0x7b, 0x75, 0x54, 0x86, 0x62, 0x79, 0x28, 0xcc, 0xec, 0x8c,
+ 0x5c, 0x36, 0x1d, 0xe7, 0xdd, 0x4a, 0xd4, 0xb5, 0xa4, 0x8b, 0xf1, 0x67,
+ 0x50, 0xfd, 0x62, 0xcd, 0x61, 0xbc, 0xd5, 0xbe, 0xee, 0x16, 0xbf, 0x04,
+ 0xcc, 0x04, 0x01, 0x1e, 0x4c, 0x17, 0x41, 0xde, 0x99, 0x86, 0x80, 0x73,
+ 0xc5, 0x65, 0xcc, 0x4d, 0x09, 0x37, 0x23, 0x80, 0xb3, 0x61, 0xa7, 0xb3,
+ 0xeb, 0x62, 0x67, 0xc2, 0x19, 0x60, 0x68, 0x14, 0xea, 0x77, 0x10, 0x17,
+ 0x5e, 0xf7, 0x45, 0x3c, 0x1c, 0x26, 0xa7, 0x4a, 0x81, 0x5b, 0x78, 0x3b,
+ 0x8a, 0x19, 0x62, 0x90, 0x22, 0xe4, 0x5f, 0x6d, 0xdf, 0x4e, 0xde, 0x46,
+ 0x88, 0x03, 0x6a, 0xf1, 0x0a, 0x4c, 0x3d, 0x46, 0xa9, 0x99, 0xc0, 0x4c,
+ 0x1e, 0xa3, 0x70, 0x77, 0xf6, 0xc8, 0x03, 0xa3, 0x58, 0xd8, 0x8b, 0xf8,
+ 0x81, 0xec, 0x92, 0x0e, 0x1a, 0x24, 0x51, 0x13, 0x59, 0x04, 0x42, 0x3d,
+ 0x21, 0x73, 0x96, 0x56, 0xfe, 0x35, 0x73, 0xe7, 0x13, 0x31, 0xac, 0xbb,
+ 0xd3, 0xdd, 0xb9, 0xf7, 0xa7, 0xf5, 0x85, 0xe2, 0x8c, 0x49, 0x84, 0x7d,
+ 0x4b, 0xf4, 0x01, 0xc4, 0x59, 0x09, 0xd0, 0x6e, 0x66, 0xbe, 0x26, 0xc9,
+ 0xee, 0x13, 0x0b, 0x9a, 0x68, 0x0d, 0x1f, 0xc7, 0x6e, 0xfe, 0xc4, 0x8a,
+ 0xed, 0x6e, 0xbc, 0x2e, 0x47, 0x77, 0x14, 0xd5, 0x62, 0x69, 0x32, 0x5a,
+ 0x9c, 0x5e, 0x59, 0xc1, 0x11, 0xf2, 0x3b, 0x7b, 0x3c, 0xf5, 0x6f, 0x0a,
+ 0x25, 0x98, 0x19, 0x65, 0xf9, 0x86, 0xa1, 0x04, 0x74, 0x65, 0x98, 0x75,
+ 0x67, 0x13, 0x30, 0xc6, 0xef, 0xfc, 0xe7, 0xd0, 0xff, 0x05, 0x5c, 0xe6,
+ 0x94, 0xd0, 0x6e, 0x8a, 0x15, 0x1b, 0x68, 0x34, 0x6c, 0xf2, 0xfb, 0xe4,
+ 0xc3, 0xfe, 0xe1, 0x6c, 0xe9, 0x8f, 0x68, 0xcd, 0x1d, 0x5b, 0x62, 0xf8,
+ 0xe4, 0x0b, 0xb8, 0x2c, 0x36, 0xed, 0xb6, 0x89, 0x3c, 0xd4, 0x60, 0xa5,
+ 0xa1, 0x93, 0x39, 0x58, 0xe0, 0x62, 0xea, 0xde, 0x54, 0xdc, 0xb1, 0xf2,
+ 0x2e, 0x58, 0x9b, 0x00, 0xad, 0xec, 0x05, 0x5b, 0x71, 0x47, 0x20, 0x07,
+ 0xee, 0x5f, 0xc7, 0x51, 0x2c, 0xa8, 0x37, 0xd8, 0xc8, 0xb0, 0xf9, 0xd0,
+ 0x17, 0x22, 0xce, 0xce, 0x66, 0x8a, 0xbe, 0xd2, 0x2d, 0x72, 0xf1, 0x56,
+ 0x3c, 0x46, 0x4d, 0xa5, 0xa4, 0x60, 0x85, 0xde, 0x15, 0x35, 0x9c, 0x31,
+ 0xc6, 0x90, 0x73, 0xeb, 0xb2, 0xda, 0xf1, 0xb2, 0x35, 0x11, 0x20, 0xa6,
+ 0x7f, 0x3f, 0x11, 0x8a, 0xb5, 0x1c, 0x1a, 0x25, 0x24, 0xac, 0x7d, 0x3f,
+ 0x1b, 0xb3, 0x1c, 0xbb, 0x04, 0xa0, 0x5d, 0xc2, 0x19, 0x23, 0x49, 0x32,
+ 0x21, 0x51, 0x4a, 0xcd, 0x36, 0x2b, 0xac, 0x78, 0xd5, 0x9d, 0x0b, 0xa0,
+ 0x72, 0x3c, 0x39, 0xb3, 0xa3, 0xb9, 0xd6, 0xe3, 0x5c, 0x95, 0x52, 0xd1,
+ 0x74, 0x4d, 0xf0, 0x9c, 0xb3, 0x95, 0x06, 0x7f, 0x49, 0x2b, 0x26, 0xee,
+ 0xfc, 0xcd, 0x0b, 0x12, 0x0e, 0xec, 0x80, 0x16, 0x15, 0x5f, 0x2c, 0x6e,
+ 0x37, 0xc7, 0x88, 0x6d, 0x2d, 0x4f, 0xf3, 0x14, 0xf6, 0xdf, 0xcd, 0x24,
+ 0xc7, 0x8d, 0x81, 0x87, 0x30, 0xa2, 0xab, 0x23, 0xa5, 0x6c, 0x4e, 0x3c,
+ 0xf0, 0x75, 0xa0, 0x86, 0xae, 0x02, 0x04, 0x7f, 0x67, 0x89, 0x39, 0x92,
+ 0xc3, 0xfb, 0x19, 0xc3, 0x76, 0xb6, 0x39, 0x4f, 0xce, 0x35, 0x91, 0x07,
+ 0x6c, 0x98, 0xbd, 0x95, 0xc6, 0x5a, 0x91, 0xa1, 0x16, 0x3b, 0x8c, 0xb5,
+ 0x58, 0x0e, 0xdb, 0x02, 0x07, 0xd6, 0xa9, 0xf2, 0x2c, 0x77, 0x58, 0x87,
+ 0xbc, 0x47, 0x30, 0xd3, 0x51, 0x64, 0x28, 0xea, 0x7b, 0x8e, 0x01, 0x0b,
+ 0xed, 0x9c, 0xdc, 0xf2, 0x41, 0xb5, 0x5c, 0x5b, 0x8e, 0x29, 0x86, 0xaa,
+ 0x48, 0xd7, 0x21, 0x75, 0x34, 0x5c, 0xc1, 0xd0, 0x11, 0x91, 0x13, 0xee,
+ 0x4f, 0x72, 0xa2, 0x11, 0x9e, 0x56, 0xc2, 0xbe, 0x61, 0x91, 0x64, 0x6a,
+ 0x8b, 0x09, 0x6b, 0x37, 0x75, 0x97, 0x23, 0xf0, 0x45, 0x61, 0x94, 0xcc,
+ 0x28, 0x40, 0xa9, 0xb8, 0xfe, 0xa5, 0xce, 0x32, 0xe9, 0x02, 0x19, 0x7d,
+ 0xe9, 0x6f, 0x58, 0x93, 0x33, 0xb7, 0x2c, 0x3b, 0x28, 0x1d, 0xc8, 0x5c,
+ 0xb6, 0xaf, 0xe7, 0xcc, 0x05, 0xac, 0xcc, 0x59, 0xac, 0x1f, 0xd4, 0xca,
+ 0x42, 0x6b, 0xa6, 0xf6, 0xa3, 0x25, 0x11, 0x13, 0x86, 0x1e, 0xaf, 0xa6,
+ 0xb4, 0xcd, 0x0c, 0x5d, 0xf7, 0x50, 0xa0, 0x20, 0xad, 0xa7, 0xe2, 0x1b,
+ 0xe7, 0xb2, 0xca, 0xb6, 0x81, 0xd3, 0xb0, 0x13, 0xbf, 0xf4, 0xbc, 0x38,
+ 0x01, 0x65, 0x19, 0x83, 0x14, 0xbd, 0xf3, 0x74, 0x71, 0x81, 0x80, 0xa2,
+ 0x9a, 0x9f, 0xaa, 0x93, 0xec, 0xc2, 0xe2, 0xdb, 0xab, 0xb7, 0x95, 0x7d,
+ 0x95, 0xc0, 0x99, 0xcc, 0xa7, 0xd2, 0x01, 0x74, 0x5a, 0xee, 0x09, 0x16,
+ 0x07, 0x07, 0xca, 0xb4, 0x98, 0x4f, 0xa1, 0x19, 0x9d, 0x55, 0x7e, 0x7e,
+ 0xa0, 0xd6, 0x0a, 0x85, 0x73, 0x4e, 0xe1, 0xf2, 0x59, 0x0c, 0xd9, 0xf2,
+ 0xf1, 0xfc, 0xc1, 0x67, 0x18, 0x41, 0x9b, 0x86, 0x0c, 0xa1, 0xf1, 0x38,
+ 0x6c, 0x01, 0xaa, 0x38, 0x69, 0xa0, 0x9c, 0x37, 0x17, 0x59, 0xb4, 0xf1,
+ 0x48, 0xf5, 0x0c, 0xf9, 0x56, 0xe3, 0x94, 0xb8, 0xf7, 0x8b, 0x6a, 0x71,
+ 0x24, 0x88, 0x75, 0x94, 0x37, 0x9a, 0xeb, 0x79, 0x93, 0xff, 0xfb, 0xf5,
+ 0xc3, 0x90, 0x49, 0xc4, 0x02, 0x09, 0xb6, 0xfa, 0xbc, 0x68, 0xd6, 0xa9,
+ 0x7a, 0x59, 0xee, 0xde, 0xd6, 0x89, 0xaa, 0x71, 0xa9, 0xc0, 0xa0, 0xac,
+ 0x92, 0xa8, 0xc0, 0xfa, 0x24, 0x96, 0x55, 0x9d, 0x99, 0x66, 0x43, 0xc5,
+ 0xd0, 0xd1, 0x6c, 0x2a, 0xe4, 0x79, 0xb1, 0x63, 0x9a, 0xe9, 0x2b, 0x7b,
+ 0x00, 0x58, 0xf7, 0x33, 0x13, 0xd6, 0x25, 0xab, 0x36, 0xd0, 0x20, 0xb8,
+ 0x26, 0xd0, 0xfe, 0x76, 0x19, 0x9a, 0xdc, 0x6d, 0xdb, 0x85, 0x28, 0xe8,
+ 0x6a, 0x28, 0x2a, 0x3d, 0x86, 0xa2, 0xa6, 0xf1, 0x80, 0x85, 0xbb, 0xde,
+ 0xcb, 0x49, 0xb0, 0x63, 0x60, 0x15, 0x86, 0x08, 0x83, 0x27, 0x2d, 0xd8,
+ 0x31, 0x99, 0xb9, 0x87, 0x9a, 0x63, 0x0b, 0x34, 0x46, 0x6f, 0x11, 0x2b,
+ 0xdc, 0x8b, 0x08, 0x05, 0xdc, 0x2d, 0x95, 0x19, 0x75, 0xb4, 0xbd, 0x7d,
+ 0x1c, 0xb7, 0xf8, 0x39, 0x1c, 0xe0, 0x26, 0xd6, 0x86, 0x25, 0x71, 0x6a,
+ 0x7b, 0x35, 0x4e, 0x16, 0x43, 0x87, 0x7b, 0xd8, 0x27, 0x90, 0x3f, 0xeb,
+ 0x44, 0x82, 0x1d, 0x4f, 0x56, 0xae, 0x74, 0xc7, 0x5e, 0x7a, 0x4f, 0xed,
+ 0x98, 0x72, 0x74, 0x5d, 0xfd, 0xe0, 0x5d, 0x07, 0x5e, 0x36, 0xad, 0x46,
+ 0x87, 0x7f, 0xda, 0xd6, 0x1c, 0xaf, 0xe5, 0x5f, 0x38, 0x58, 0x78, 0x4b,
+ 0x03, 0x40, 0x44, 0x39, 0x67, 0x0f, 0x5c, 0xbe, 0x4f, 0x47, 0x8e, 0xb4,
+ 0xc1, 0x3e, 0x09, 0x79, 0x6b, 0x2f, 0xc8, 0xfe, 0x87, 0x30, 0x43, 0x99,
+ 0x11, 0xd5, 0x2e, 0x92, 0xe2, 0xa2, 0x79, 0x73, 0xff, 0xba, 0xed, 0xf6,
+ 0x77, 0x14, 0xc6, 0x4c, 0x6c, 0x90, 0x8a, 0x0c, 0x44, 0x74, 0x4b, 0x6c,
+ 0xd1, 0x82, 0x95, 0x78, 0xcd, 0x25, 0xbe, 0x12, 0x87, 0x0f, 0xb7, 0x27,
+ 0x28, 0x26, 0x83, 0xea, 0xa2, 0xcf, 0x9b, 0xcb, 0x53, 0x19, 0x7b, 0xa9,
+ 0xe2, 0xe2, 0x0d, 0x85, 0x31, 0xb5, 0xc7, 0x95, 0xcb, 0x0d, 0x47, 0x02,
+ 0x31, 0x6b, 0xd4, 0xa0, 0xdf, 0x22, 0xd2, 0x25, 0xc5, 0x79, 0x1f, 0x1e,
+ 0x26, 0x69, 0x01, 0x26, 0xe1, 0x1b, 0xca, 0xee, 0x66, 0x19, 0xc9, 0xf6,
+ 0xa6, 0x53, 0x8d, 0x9e, 0x03, 0x7e, 0x54, 0xa3, 0xa9, 0xb0, 0x79, 0x75,
+ 0xe1, 0x07, 0x23, 0x95, 0x21, 0x48, 0xb1, 0xa0, 0xc0, 0xb0, 0x20, 0xc2,
+ 0x56, 0xbd, 0x70, 0x4f, 0x09, 0x82, 0xcb, 0x4f, 0xb0, 0x97, 0xc6, 0xb5,
+ 0xe7, 0xff, 0xad, 0xd0, 0x5f, 0x69, 0x7e, 0x6f, 0xb4, 0x24, 0x91, 0x86,
+ 0x22, 0x30, 0xa7, 0x01, 0xdc, 0xda, 0x82, 0x92, 0x82, 0xf4, 0x88, 0x70,
+ 0x69, 0x21, 0x21, 0x07, 0xde, 0xe4, 0xec, 0x11, 0xff, 0x8c, 0xeb, 0xb7,
+ 0xf1, 0x45, 0x9d, 0xbc, 0x85, 0x9c, 0xe9, 0x61, 0xe6, 0xc9, 0xd0, 0xb4,
+ 0x78, 0xad, 0xad, 0xdd, 0x2e, 0x4e, 0x02, 0x35, 0xf7, 0xe8, 0xae, 0x8c,
+ 0x15, 0x71, 0x02, 0x21, 0xe4, 0x81, 0x72, 0x2c, 0x7c, 0x42, 0xb1, 0x0a,
+ 0x33, 0xae, 0x61, 0xc7, 0x62, 0x9e, 0x22, 0x96, 0xbf, 0xc3, 0xcf, 0xb5,
+ 0xd1, 0xd5, 0x92, 0xb2, 0xe7, 0xec, 0xa2, 0xc0, 0xa9, 0x79, 0x57, 0xa0,
+ 0x13, 0xd8, 0xcb, 0x16, 0x99, 0xe5, 0xac, 0x6e, 0xb1, 0xde, 0x54, 0xd0,
+ 0xc5, 0x6e, 0x9d, 0x6d, 0xe6, 0x87, 0xb1, 0xf6, 0x7a, 0xf4, 0x28, 0xaf,
+ 0xf3, 0x6b, 0x3d, 0x86, 0x44, 0xac, 0x09, 0xa9, 0x77, 0x97, 0x6c, 0xaf,
+ 0xef, 0x2b, 0xc6, 0x1e, 0x0c, 0x37, 0x5d, 0xba, 0xaa, 0xa6, 0x1f, 0x52,
+ 0x52, 0xe8, 0x78, 0x5e, 0x0d, 0x4d, 0x9a, 0xfe, 0xbe, 0x5d, 0x9c, 0x25,
+ 0x0a, 0x4c, 0x52, 0x2c, 0xbf, 0xcd, 0xd5, 0xf4, 0xf2, 0x17, 0xba, 0x07,
+ 0x95, 0xbe, 0x2c, 0x8b, 0x09, 0xe9, 0x78, 0x4c, 0x2c, 0x18, 0x2b, 0x6b,
+ 0xa2, 0x44, 0x41, 0x87, 0x71, 0xab, 0x65, 0x6e, 0xb3, 0x20, 0x7e, 0x9d,
+ 0x79, 0xa0, 0x61, 0x99, 0xdf, 0xe9, 0xa3, 0x35, 0x0c, 0x90, 0x2b, 0x65,
+ 0xca, 0xb6, 0xfb, 0x9e, 0xe9, 0x56, 0x3e, 0x73, 0x03, 0x08, 0x3a, 0xc6,
+ 0xc2, 0xd0, 0x14, 0xc7, 0x57, 0x35, 0x1f, 0xb9, 0xce, 0x26, 0x0b, 0x8d,
+ 0xb8, 0x48, 0xab, 0x85, 0x41, 0x15, 0x33, 0x0f, 0x50, 0x51, 0xba, 0x01,
+ 0xf6, 0xf1, 0x04, 0xd4, 0x30, 0xea, 0x88, 0xad, 0x9c, 0x96, 0x96, 0xa5,
+ 0x60, 0x2b, 0x7e, 0xdd, 0xc3, 0x44, 0x86, 0xa2, 0x6e, 0x66, 0x53, 0x3d,
+ 0x27, 0x6e, 0xf1, 0x6a, 0x82, 0xf1, 0x53, 0x39, 0x8a, 0x2b, 0x06, 0xdd,
+ 0x8a, 0x73, 0x06, 0x51, 0xe4, 0x37, 0x57, 0x2a, 0x19, 0x73, 0x7b, 0xa8,
+ 0xc0, 0x55, 0x4e, 0xd9, 0xa2, 0xa0, 0x5a, 0x79, 0x7f, 0xd3, 0xee, 0xab,
+ 0x01, 0xdd, 0x72, 0x39, 0xcc, 0x3d, 0xe4, 0xf7, 0x7c, 0x7d, 0x38, 0x97,
+ 0xaf, 0x07, 0x82, 0x9b, 0x36, 0x9d, 0x5e, 0x60, 0xf3, 0xe2, 0x3c, 0xcd,
+ 0x53, 0x00, 0x38, 0x82, 0x07, 0x01, 0x4b, 0x7c, 0x7e, 0x13, 0x2d, 0x66,
+ 0xaf, 0xea, 0xd6, 0x78, 0xf5, 0xce, 0xff, 0x95, 0x87, 0xe3, 0x9a, 0xd5,
+ 0x20, 0x90, 0x0d, 0x62, 0x94, 0x57, 0xaf, 0xf2, 0xc1, 0x4d, 0x06, 0xa4,
+ 0x77, 0x4a, 0xac, 0x55, 0x8d, 0xf1, 0x82, 0xc8, 0xce, 0xe1, 0x3a, 0xa9,
+ 0x0c, 0xea, 0xba, 0x12, 0xad, 0xcf, 0x0d, 0xe1, 0x1b, 0x53, 0x69, 0x3d,
+ 0xc3, 0xcd, 0xa6, 0xb9, 0xe7, 0x10, 0x4a, 0xdb, 0x54, 0x1f, 0x11, 0x0e,
+ 0xbf, 0xe0, 0x6b, 0x52, 0x3a, 0xd7, 0xf8, 0xe5, 0x8d, 0xba, 0x9c, 0x15,
+ 0x1d, 0x82, 0x8a, 0x56, 0x3b, 0x18, 0x61, 0x64, 0x9b, 0x21, 0x8c, 0x67,
+ 0xc7, 0xaa, 0xef, 0x85, 0x69, 0xb8, 0x34, 0x07, 0x37, 0x98, 0x90, 0x7d,
+ 0x57, 0xa2, 0x84, 0x6f, 0x72, 0x6c, 0x8a, 0xf0, 0x28, 0xaf, 0x1c, 0xbc,
+ 0x2b, 0x72, 0xb9, 0x43, 0xbe, 0x67, 0x56, 0x92, 0x37, 0x5f, 0x2c, 0x7c,
+ 0xff, 0x8f, 0x19, 0xce, 0x9b, 0x78, 0xda, 0x99, 0x92, 0xd5, 0xce, 0x3c,
+ 0xae, 0x70, 0x80, 0x71, 0x73, 0x59, 0x20, 0xbf, 0x7a, 0x0e, 0xf9, 0x2e,
+ 0x71, 0xa1, 0x74, 0x91, 0x3d, 0x21, 0x75, 0xa2, 0x68, 0xb5, 0xd8, 0x8f,
+ 0x6d, 0xe0, 0xdc, 0xf7, 0x18, 0xde, 0x02, 0xe0, 0x19, 0x42, 0x4b, 0x85,
+ 0x53, 0xc2, 0x75, 0x56, 0xca, 0x64, 0xf7, 0xe0, 0x71, 0x4c, 0x7f, 0xba,
+ 0x0a, 0x3d, 0xe3, 0x49, 0xed, 0xae, 0x9f, 0x5c, 0x7b, 0xfd, 0xf3, 0x6d,
+ 0xa9, 0x34, 0xc4, 0x5c, 0xbf, 0x28, 0x93, 0xe2, 0xbd, 0x6e, 0xb4, 0xe5,
+ 0x96, 0x11, 0xeb, 0x2d, 0xff, 0x95, 0x25, 0x25, 0xb6, 0xd7, 0x3b, 0xb5,
+ 0x51, 0xad, 0xa9, 0x60, 0xd1, 0xbc, 0xc5, 0x1d, 0xd5, 0x12, 0xaf, 0x55,
+ 0x3b, 0xa5, 0x93, 0x8a, 0x15, 0x3a, 0x36, 0x2f, 0xd7, 0x2d, 0xaf, 0xa9,
+ 0xf3, 0x2c, 0xff, 0x95, 0x2c, 0x49, 0xa4, 0x36, 0x06, 0x9d, 0x45, 0x6a,
+ 0x7f, 0xb1, 0x0d, 0x21, 0x7b, 0xa3, 0xb6, 0x4a, 0x5a, 0xae, 0xea, 0x41,
+ 0x08, 0x65, 0x88, 0xc2, 0x3c, 0x8f, 0xcd, 0xd7, 0xd4, 0x7c, 0x72, 0xd4,
+ 0xf2, 0x1d, 0x2a, 0xff, 0x88, 0xc3, 0x81, 0xed, 0x05, 0x9b, 0x4b, 0x17,
+ 0x3b, 0xc2, 0x48, 0x23, 0xb9, 0x17, 0x70, 0x57, 0xda, 0x10, 0xb9, 0xa0,
+ 0xb8, 0xa2, 0x61, 0x06, 0x6f, 0x48, 0x8b, 0xc5, 0x52, 0x09, 0x39, 0xb6,
+ 0x62, 0x78, 0x44, 0xc1, 0x34, 0x8a, 0x11, 0x70, 0x09, 0x7f, 0x1a, 0x77,
+ 0xe7, 0x1d, 0x1b, 0x86, 0x71, 0x9e, 0x7d, 0xd4, 0xdf, 0xea, 0x55, 0x87,
+ 0x27, 0xaf, 0x3c, 0x74, 0x26, 0xdb, 0x10, 0x4b, 0xf2, 0x49, 0xac, 0x9b,
+ 0x9d, 0x82, 0x4f, 0x37, 0x49, 0xff, 0x24, 0xb0, 0x87, 0xec, 0x12, 0x09,
+ 0x95, 0xb1, 0x95, 0x9c, 0xae, 0xd5, 0x6c, 0x80, 0xd4, 0x65, 0x7c, 0x1b,
+ 0xab, 0xd7, 0x99, 0x1f, 0xca, 0x91, 0xdc, 0x7d, 0x02, 0xdb, 0xd6, 0x02,
+ 0xcb, 0x11, 0x6c, 0x02, 0x8a, 0x2f, 0xec, 0xb0, 0x3a, 0xeb, 0x9b, 0x80,
+ 0x60, 0x62, 0x28, 0x36, 0x84, 0x7e, 0x4d, 0xa5, 0xa0, 0xc6, 0xb6, 0x28,
+ 0xc6, 0xa3, 0xda, 0xeb, 0x6d, 0x74, 0xb7, 0x99, 0x9f, 0xbb, 0x00, 0x33,
+ 0xea, 0x67, 0x9c, 0xd9, 0x8c, 0x6c, 0xc3, 0x3b, 0x0c, 0xc6, 0x26, 0xcc,
+ 0x47, 0x5c, 0x7a, 0xae, 0x64, 0x9e, 0x30, 0x31, 0xda, 0xd2, 0xe5, 0x9d,
+ 0xe9, 0xc4, 0xff, 0xd0, 0x2e, 0x1d, 0x89, 0xa5, 0xb8, 0x78, 0xab, 0xb0,
+ 0xc9, 0x8d, 0xe1, 0xef, 0x5d, 0x22, 0x5d, 0xc5, 0x15, 0x82, 0x0b, 0x35,
+ 0x06, 0xc0, 0xef, 0x81, 0x1a, 0x02, 0x17, 0x86, 0x41, 0xb6, 0xfd, 0x1d,
+ 0x3f, 0x58, 0x3f, 0xf8, 0x52, 0xf2, 0x4b, 0x96, 0x75, 0xb2, 0x01, 0x76,
+ 0x82, 0x1c, 0x6e, 0x2d, 0x0e, 0xf2, 0x32, 0xd0, 0x80, 0x05, 0xeb, 0xa3,
+ 0x50, 0x3e, 0xa0, 0x48, 0xd3, 0xd7, 0xed, 0xa3, 0x3a, 0xb6, 0x8d, 0x03,
+ 0xc5, 0x4c, 0xd6, 0xae, 0x7b, 0xf0, 0xb9, 0x51, 0x9c, 0xd7, 0xcd, 0x25,
+ 0x9d, 0xf7, 0x0f, 0x99, 0x6f, 0x8b, 0x4c, 0xcb, 0x31, 0x07, 0xb2, 0xbd,
+ 0x1e, 0x49, 0x6b, 0xd5, 0x26, 0x0c, 0xda, 0x01, 0x73, 0x78, 0x0e, 0xfd,
+ 0x57, 0xca, 0x3e, 0xc8, 0x20, 0x35, 0x05, 0xb7, 0x68, 0x5d, 0x22, 0xe9,
+ 0xc3, 0x7b, 0x13, 0xac, 0x90, 0xe1, 0x93, 0x2f, 0xcd, 0xad, 0x5f, 0x9a,
+ 0x1f, 0x25, 0xb3, 0xed, 0xb5, 0xe7, 0xa6, 0xb6, 0x76, 0x4f, 0xdc, 0xcb,
+ 0xff, 0x71, 0x59, 0x8e, 0x3d, 0xbb, 0x0f, 0xe7, 0x87, 0x88, 0x49, 0xf1,
+ 0x1e, 0x00, 0x3d, 0x0a, 0x80, 0x7c, 0x8e, 0x33, 0x39, 0x6a, 0xcb, 0x10,
+ 0x54, 0xd5, 0xcc, 0xa6, 0xb7, 0x67, 0x0a, 0x19, 0x0c, 0x04, 0x24, 0xf9,
+ 0x4f, 0xaa, 0x08, 0xf8, 0x81, 0x88, 0xe8, 0x82, 0xb0, 0xac, 0x1c, 0x19,
+ 0x23, 0x4f, 0xad, 0xa5, 0xb2, 0x2f, 0xa7, 0x23, 0xda, 0x73, 0xdf, 0xdf,
+ 0xad, 0x39, 0x3b, 0x1e, 0xb7, 0x96, 0xb3, 0x38, 0x0e, 0x70, 0x2f, 0xf6,
+ 0x85, 0xae, 0x0a, 0xa5, 0xe3, 0x41, 0x10, 0x7b, 0x00, 0x1c, 0x6f, 0xba,
+ 0x85, 0x3b, 0xf4, 0x29, 0xb3, 0x74, 0xb0, 0x08, 0x2c, 0x8d, 0xda, 0xf6,
+ 0x39, 0x7b, 0x08, 0xf2, 0x91, 0x3c, 0xb0, 0x74, 0x89, 0x3a, 0xea, 0xab,
+ 0x8f, 0x4f, 0x67, 0xb1, 0x49, 0x95, 0x08, 0x7d, 0x0b, 0xfb, 0x93, 0x3a,
+ 0x93, 0x1a, 0x80, 0x1c, 0xe0, 0x5a, 0x92, 0xc1, 0xe8, 0xfb, 0xbc, 0x73,
+ 0xc9, 0x53, 0xe3, 0xae, 0x92, 0x6d, 0x7c, 0x00, 0x0a, 0xc4, 0xb0, 0xc7,
+ 0x46, 0x78, 0xfc, 0xc5, 0x00, 0xf6, 0xbf, 0xa2, 0xee, 0xf9, 0x40, 0xdf,
+ 0xc3, 0xdd, 0x4d, 0xc0, 0xf6, 0x04, 0xcb, 0xb2, 0x69, 0x41, 0x08, 0xd8,
+ 0xe9, 0xd2, 0x43, 0xa5, 0xca, 0x04, 0x7d, 0x4c, 0xf4, 0x43, 0xcb, 0x2a,
+ 0x27, 0xb3, 0xf5, 0x0e, 0x3c, 0xaf, 0x69, 0x8e, 0x8e, 0x08, 0x66, 0xa3,
+ 0xf1, 0x80, 0x31, 0xf3, 0x71, 0x30, 0x59, 0xc1, 0x27, 0x10, 0xb7, 0x15,
+ 0x4e, 0x97, 0xe9, 0x46, 0x65, 0x89, 0xc2, 0xd9, 0x83, 0xea, 0xa2, 0x27,
+ 0x1e, 0x97, 0xa6, 0x58, 0xf6, 0xc9, 0x33, 0x75, 0x98, 0x1e, 0x03, 0xff,
+ 0x5e, 0x46, 0x01, 0x24, 0xdb, 0x7f, 0xed, 0xa9, 0x6a, 0xb5, 0xc4, 0x5f,
+ 0x48, 0xb7, 0x32, 0xc6, 0xb1, 0x7e, 0x65, 0x15, 0x01, 0x3a, 0x91, 0xa9,
+ 0xa8, 0xa1, 0x1f, 0x5a, 0x56, 0xe2, 0x70, 0xcb, 0xc3, 0xa1, 0x96, 0xc5,
+ 0x34, 0x6b, 0x31, 0x11, 0xe6, 0x8b, 0x42, 0xac, 0xea, 0x4c, 0xf0, 0x60,
+ 0x89, 0x54, 0x5b, 0x91, 0x02, 0x3d, 0xf5, 0x39, 0xfc, 0x6a, 0x0c, 0x8d,
+ 0xb7, 0x37, 0x02, 0x4c, 0xb6, 0x07, 0x50, 0x7d, 0xb8, 0xd6, 0xff, 0xe9,
+ 0x0e, 0x18, 0xd7, 0xff, 0x06, 0x73, 0x22, 0x95, 0x9c, 0x8f, 0x68, 0x2a,
+ 0x71, 0x73, 0xa4, 0x1f, 0xc6, 0x7a, 0x89, 0xaa, 0x9f, 0x44, 0xaf, 0x06,
+ 0xdc, 0x3b, 0x82, 0x3d, 0xcc, 0x60, 0xd9, 0x2d, 0xf9, 0xb7, 0xc1, 0x83,
+ 0x35, 0x9a, 0x00, 0x7c, 0xf7, 0x54, 0x71, 0x16, 0x3a, 0xf6, 0x61, 0x7d,
+ 0x80, 0xf5, 0x2b, 0xcf, 0x91, 0xf4, 0x4c, 0x63, 0xcd, 0xa2, 0xcb, 0x60,
+ 0x58, 0x67, 0xe8, 0x7f, 0xc3, 0x34, 0x61, 0x01, 0x46, 0x36, 0xcf, 0xda,
+ 0x11, 0x56, 0x06, 0x64, 0x2a, 0x59, 0xfe, 0xb3, 0x9a, 0xdd, 0x9d, 0xef,
+ 0x30, 0xbe, 0xc4, 0x92, 0x00, 0xd1, 0x4e, 0x34, 0x45, 0x3c, 0x33, 0x8f,
+ 0xa4, 0x0b, 0x7e, 0x83, 0xc4, 0xde, 0x44, 0x31, 0x1f, 0x69, 0xf1, 0x6a,
+ 0x94, 0x1f, 0xf4, 0x50, 0x7c, 0xe9, 0xdb, 0x68, 0xdb, 0x4d, 0x4e, 0xde,
+ 0x1d, 0xec, 0x50, 0x67, 0x96, 0x61, 0x93, 0x2c, 0x30, 0x56, 0x83, 0x9d,
+ 0x94, 0x08, 0xb1, 0x58, 0x4c, 0x23, 0x85, 0xaa, 0x5b, 0x14, 0x17, 0x5b,
+ 0x12, 0x38, 0xa6, 0x2f, 0x57, 0x0e, 0x44, 0xaf, 0xbc, 0xa5, 0xe7, 0x88,
+ 0x66, 0xbb, 0x9f, 0x50, 0xd6, 0xb8, 0x7b, 0xfc, 0x4b, 0x28, 0xbd, 0xd3,
+ 0x08, 0xf5, 0x28, 0xc6, 0xf5, 0xf3, 0x1e, 0xdb, 0xcf, 0x90, 0x6b, 0x03,
+ 0x75, 0x23, 0xbc, 0xe2, 0x56, 0x35, 0x21, 0x65, 0x7c, 0x77, 0x77, 0xe3,
+ 0x01, 0xf7, 0xac, 0xdd, 0x15, 0x1e, 0x13, 0xc8, 0x7c, 0x0a, 0xb9, 0xc1,
+ 0x64, 0xcf, 0xfd, 0xfd, 0x71, 0xce, 0x8a, 0x47, 0x53, 0xe3, 0x4b, 0x6c,
+ 0xa1, 0xcd, 0x22, 0x24, 0xeb, 0xda, 0xed, 0xfd, 0xc2, 0xe5, 0xde, 0x96,
+ 0x01, 0x1a, 0xb6, 0x39, 0x37, 0xd1, 0xe0, 0xce, 0xec, 0xb5, 0xee, 0xc5,
+ 0x89, 0xcb, 0x10, 0xcb, 0x70, 0x88, 0xfa, 0x17, 0x88, 0xf2, 0xad, 0xf8,
+ 0x39, 0xb4, 0x7e, 0x9f, 0xd4, 0xc0, 0x49, 0xd1, 0x5a, 0xc5, 0xbd, 0x8a,
+ 0xb2, 0x5d, 0xf4, 0x87, 0x35, 0xee, 0x74, 0xfe, 0x14, 0x79, 0xb0, 0xb9,
+ 0x16, 0x90, 0xbf, 0x1c, 0x48, 0x95, 0x18, 0x98, 0x8a, 0x41, 0xa4, 0x99,
+ 0x3d, 0x0f, 0xbe, 0x42, 0xa2, 0x78, 0xc4, 0xeb, 0xfd, 0xbd, 0x02, 0xd3,
+ 0x82, 0x4b, 0xaf, 0x3c, 0x5b, 0x0b, 0x23, 0x5f, 0xf3, 0x33, 0x1a, 0x08,
+ 0x91, 0xf9, 0xdb, 0x91, 0xdf, 0x41, 0x61, 0x66, 0x80, 0x57, 0xe7, 0x13,
+ 0x97, 0x2e, 0xdf, 0x74, 0xe7, 0xc1, 0xbf, 0xe3, 0xf7, 0xb0, 0xf8, 0xcd,
+ 0x1e, 0x67, 0xae, 0x53, 0x42, 0x0b, 0x51, 0x30, 0x4c, 0x66, 0xc2, 0x9e,
+ 0x83, 0x0d, 0x17, 0x16, 0x19, 0xcf, 0x68, 0x6e, 0x97, 0xf0, 0xa6, 0x69,
+ 0x24, 0xe1, 0x5a, 0xbd, 0x6e, 0x9c, 0x57, 0x51, 0x97, 0xa7, 0x3b, 0x28,
+ 0xfc, 0x41, 0xf5, 0xc3, 0x19, 0xb4, 0x90, 0x0d, 0x1f, 0x0d, 0xa2, 0x04,
+ 0x21, 0x39, 0x62, 0x6c, 0x01, 0x0d, 0xd8, 0xd7, 0x0b, 0x13, 0xd6, 0x29,
+ 0xf6, 0x89, 0x3f, 0x19, 0xc9, 0x00, 0xfb, 0xaf, 0x92, 0xa3, 0x9f, 0x22,
+ 0xcc, 0x5c, 0x45, 0xea, 0xd7, 0xca, 0x38, 0x0e, 0xc8, 0xd2, 0x32, 0x9c,
+ 0x2b, 0x10, 0xd0, 0xcd, 0xea, 0xc4, 0xc1, 0xe6, 0x6c, 0x72, 0xab, 0xd0,
+ 0x17, 0xc3, 0xdd, 0x4d, 0x4c, 0x10, 0xaf, 0xae, 0x42, 0x20, 0x2e, 0x17,
+ 0x9e, 0x67, 0xab, 0x34, 0xa5, 0x2a, 0xf8, 0x01, 0xec, 0xf6, 0x31, 0x22,
+ 0x3d, 0x42, 0x25, 0x63, 0x81, 0x14, 0x4f, 0xe9, 0xe3, 0x80, 0x72, 0x16,
+ 0x80, 0x75, 0x77, 0xf3, 0x06, 0x76, 0xa5, 0x34, 0xef, 0xc0, 0x30, 0x40,
+ 0xe0, 0x68, 0x70, 0x30, 0x9d, 0x65, 0x9d, 0xb3, 0x74, 0x79, 0x1b, 0xe3,
+ 0xc4, 0x79, 0xcd, 0xdc, 0xe3, 0x63, 0xa0, 0x45, 0x1a, 0x78, 0xd2, 0xf5,
+ 0xe8, 0xb6, 0x5a, 0x49, 0x92, 0x69, 0x58, 0x5f, 0x1a, 0xb9, 0x1e, 0x30,
+ 0xbe, 0xaf, 0xbb, 0x5b, 0xf5, 0xd2, 0x6a, 0x3b, 0x58, 0xb8, 0x15, 0xd8,
+ 0x93, 0x86, 0xe0, 0x24, 0xe1, 0x66, 0x91, 0x87, 0x0b, 0x07, 0x03, 0x95,
+ 0x58, 0xc8, 0xc0, 0x59, 0x16, 0xa9, 0x1d, 0x4b, 0xd8, 0x5e, 0xf2, 0xb7,
+ 0x8f, 0xb1, 0xb1, 0x2f, 0x72, 0xd7, 0xcb, 0x77, 0x26, 0xf6, 0x06, 0x93,
+ 0xa4, 0x1f, 0x40, 0x48, 0xad, 0xf9, 0x62, 0xf7, 0xf0, 0xab, 0x41, 0x02,
+ 0xc2, 0xcc, 0xc1, 0x92, 0x27, 0x65, 0x7e, 0xad, 0x59, 0x81, 0x16, 0xb9,
+ 0x85, 0x9b, 0xf6, 0x90, 0x27, 0xf0, 0xd6, 0x84, 0x83, 0x30, 0xda, 0x07,
+ 0x1f, 0x92, 0x49, 0xfc, 0xa3, 0x1b, 0xb4, 0x03, 0x18, 0xda, 0xde, 0x45,
+ 0x99, 0x7b, 0x67, 0x9c, 0x54, 0xcc, 0x5f, 0xb1, 0xe9, 0x32, 0x01, 0x0b,
+ 0xe0, 0x54, 0xd5, 0xcb, 0xfd, 0x3b, 0x49, 0x9d, 0x51, 0xee, 0xf1, 0xe1,
+ 0x62, 0x3e, 0x4e, 0x07, 0xf9, 0x2b, 0x70, 0x62, 0x76, 0x8b, 0x9a, 0x9a,
+ 0x47, 0xde, 0x10, 0x13, 0x74, 0x15, 0xc6, 0x0a, 0x69, 0xc3, 0xf1, 0x1e,
+ 0x9c, 0x7f, 0xba, 0xab, 0x1f, 0xb3, 0xc4, 0x1c, 0x26, 0x0c, 0x38, 0xdf,
+ 0x90, 0xb8, 0x15, 0x37, 0x67, 0x91, 0x7e, 0x11, 0x7a, 0x0f, 0xdc, 0xee,
+ 0x69, 0x8a, 0x73, 0xa1, 0x26, 0xc0, 0x0f, 0xcb, 0x41, 0xf7, 0x0b, 0xdc,
+ 0x95, 0x4a, 0x0e, 0x3e, 0x23, 0xdf, 0x7d, 0x4b, 0x82, 0xa4, 0x50, 0xad,
+ 0x9e, 0x49, 0x6b, 0xdd, 0x71, 0x18, 0x9a, 0x9f, 0x75, 0x40, 0x48, 0x50,
+ 0xbb, 0xfd, 0x84, 0x16, 0xc7, 0x20, 0x8f, 0x76, 0x6d, 0x5f, 0x4f, 0x74,
+ 0x45, 0xed, 0xf8, 0x58, 0x7d, 0xad, 0x80, 0x7c, 0xc2, 0x31, 0xe2, 0x10,
+ 0xef, 0xc8, 0xee, 0xbb, 0x27, 0xe3, 0xc9, 0x1e, 0x83, 0x2d, 0xc3, 0x1e,
+ 0x70, 0x1c, 0x73, 0x11, 0x56, 0x17, 0xb4, 0xbd, 0x73, 0xdd, 0x4c, 0x61,
+ 0x3e, 0xb8, 0x60, 0x83, 0xf6, 0x0c, 0xc0, 0xfe, 0x87, 0xc1, 0x34, 0xa0,
+ 0x9d, 0x34, 0x69, 0xa6, 0x81, 0x76, 0x7b, 0x5b, 0x47, 0xb0, 0xe9, 0xf2,
+ 0x52, 0x38, 0x04, 0x3a, 0x41, 0x98, 0x1a, 0x3d, 0xf9, 0x3a, 0x28, 0x0a,
+ 0x80, 0x9c, 0x73, 0x08, 0xfd, 0xcd, 0x95, 0xa8, 0xe2, 0x3b, 0xfa, 0x96,
+ 0xb5, 0xae, 0xfd, 0x82, 0xea, 0xcb, 0xeb, 0x8f, 0xeb, 0xe4, 0x69, 0x46,
+ 0x07, 0x33, 0xcf, 0x46, 0xd6, 0x27, 0x62, 0x9e, 0xad, 0x68, 0x89, 0xf9,
+ 0xa1, 0x9b, 0x42, 0x25, 0xfb, 0xe8, 0x67, 0xde, 0xf0, 0xc5, 0x16, 0x12,
+ 0x55, 0xc7, 0x9b, 0x45, 0x5b, 0xd0, 0xfc, 0xb7, 0xb9, 0xea, 0x3e, 0xb5,
+ 0x52, 0xf5, 0x2c, 0x68, 0x18, 0xae, 0xe9, 0x60, 0x40, 0x9e, 0xea, 0xdb,
+ 0xab, 0x8b, 0x93, 0x37, 0x07, 0x23, 0x1a, 0x42, 0x25, 0x68, 0x3a, 0xae,
+ 0x11, 0xb1, 0x41, 0x9f, 0xd5, 0xa5, 0x08, 0x58, 0xba, 0x7a, 0x8e, 0x82,
+ 0xce, 0x95, 0xbb, 0x27, 0x83, 0xab, 0xda, 0x8c, 0x5d, 0xf9, 0x85, 0xee,
+ 0x19, 0x6b, 0xbe, 0x71, 0x80, 0xd5, 0x79, 0x60, 0x2e, 0xa8, 0xd1, 0x96,
+ 0x92, 0xab, 0x40, 0x58, 0x9c, 0x4a, 0x15, 0x44, 0x72, 0xa3, 0x9e, 0x9e,
+ 0xa5, 0xe9, 0x1f, 0xc2, 0x33, 0x29, 0x73, 0x23, 0x3b, 0xed, 0x5d, 0xdc,
+ 0xce, 0x69, 0x43, 0xca, 0x96, 0x26, 0xcd, 0x58, 0xda, 0x78, 0x05, 0xe9,
+ 0xfa, 0x13, 0x60, 0x57, 0x96, 0x58, 0x1c, 0xea, 0x63, 0xb0, 0xb5, 0xcb,
+ 0x96, 0xa8, 0x2f, 0x28, 0x41, 0x5f, 0x7e, 0xcb, 0x76, 0x99, 0x31, 0xcc,
+ 0xc3, 0xec, 0xd4, 0x34, 0xf9, 0x18, 0x2f, 0x7c, 0xa0, 0x5a, 0xf2, 0xe0,
+ 0xdb, 0xea, 0xbb, 0x12, 0x9c, 0x55, 0xb9, 0x68, 0x9d, 0xd7, 0xe5, 0x93,
+ 0x88, 0x52, 0xef, 0xd5, 0x7f, 0x0a, 0x80, 0xf9, 0x68, 0xe3, 0xfb, 0x5e,
+ 0xb0, 0x3b, 0xb3, 0xdc, 0xe4, 0xc6, 0xe1, 0x23, 0xbe, 0x8b, 0xf0, 0xc3,
+ 0xa6, 0x1d, 0x56, 0x14, 0x2d, 0xa4, 0xa7, 0xe8, 0x08, 0x30, 0x29, 0xb8,
+ 0x1e, 0x0d, 0x77, 0xc6, 0x7c, 0xa3, 0x7c, 0x74, 0x34, 0xf3, 0xf8, 0x4e,
+ 0xac, 0x22, 0x35, 0xb0, 0x02, 0x2a, 0x46, 0xc0, 0x32, 0x83, 0x13, 0x80,
+ 0x5a, 0xc8, 0x56, 0xbd, 0x79, 0x79, 0x9d, 0xe1, 0xd6, 0x6e, 0xd7, 0x2a,
+ 0xc0, 0xf5, 0x17, 0xa8, 0x15, 0xe1, 0xf8, 0xd1, 0x50, 0x0b, 0xd6, 0x3f,
+ 0x6a, 0xc8, 0x39, 0xb1, 0x95, 0xab, 0x8c, 0x06, 0xe3, 0xa2, 0x4e, 0xd1,
+ 0x81, 0x06, 0xb5, 0x1b, 0x34, 0x06, 0xb4, 0x49, 0x7b, 0xe7, 0x07, 0x38,
+ 0xca, 0x05, 0xd9, 0x4c, 0x1a, 0x7c, 0x3a, 0xdc, 0xc5, 0xec, 0xb8, 0x29,
+ 0x19, 0xc9, 0x0d, 0x84, 0x22, 0x62, 0x2b, 0xcb, 0xd3, 0x30, 0xb5, 0xe1,
+ 0xeb, 0xdf, 0x59, 0x75, 0x61, 0xa7, 0x58, 0x83, 0xd9, 0x3a, 0x11, 0x14,
+ 0x5a, 0x26, 0x1b, 0x98, 0x27, 0xf9, 0x11, 0x64, 0xcd, 0xf1, 0xe9, 0xf2,
+ 0xf3, 0x2c, 0x71, 0x2d, 0x7b, 0xda, 0xde, 0xc1, 0x18, 0xe2, 0xb4, 0x7c,
+ 0xcf, 0x0c, 0xd6, 0x1a, 0x81, 0x89, 0xab, 0x24, 0x0c, 0xa0, 0x6f, 0xfd,
+ 0x9c, 0x70, 0x70, 0xcd, 0xad, 0x77, 0x30, 0xf0, 0x40, 0x65, 0xdc, 0x25,
+ 0xc2, 0xc2, 0x19, 0xa8, 0x2f, 0x4e, 0x2a, 0xa8, 0xc3, 0xee, 0xd2, 0x6e,
+ 0x4f, 0xc1, 0x8c, 0x06, 0x47, 0x60, 0x36, 0x12, 0x02, 0xbc, 0x96, 0x44,
+ 0x50, 0xc7, 0x1b, 0xcb, 0x52, 0x09, 0x4f, 0x44, 0xd2, 0xe3, 0x59, 0x77,
+ 0x82, 0x3c, 0x6e, 0x0f, 0x29, 0xa1, 0x91, 0xeb, 0xc0, 0xec, 0x04, 0x13,
+ 0x4f, 0x7f, 0xd9, 0xeb, 0x9d, 0xd1, 0x2a, 0xea, 0xf4, 0xee, 0xee, 0x93,
+ 0x85, 0x73, 0x93, 0x63, 0x99, 0x74, 0x6a, 0xbe, 0x8d, 0x4a, 0x64, 0xe0,
+ 0x1c, 0x89, 0x43, 0xfd, 0x6c, 0x02, 0xd5, 0xa9, 0xec, 0x62, 0xfc, 0xd8,
+ 0x61, 0x24, 0xe8, 0x58, 0x3d, 0x6e, 0x14, 0x63, 0x68, 0xa6, 0xea, 0x49,
+ 0xaa, 0xdd, 0x84, 0xcb, 0xe9, 0xc3, 0x8f, 0x83, 0x1e, 0x3b, 0x7b, 0x3a,
+ 0xd1, 0x71, 0x5e, 0x72, 0x5d, 0x60, 0x2c, 0xd8, 0xb0, 0x44, 0x19, 0x97,
+ 0x1b, 0x9f, 0x57, 0x28, 0xb8, 0xe4, 0x8e, 0xe2, 0x02, 0x2f, 0x38, 0x7f,
+ 0x86, 0xc6, 0xc3, 0x78, 0x1f, 0x87, 0x2f, 0xda, 0x13, 0x13, 0x49, 0x11,
+ 0x49, 0x36, 0x1c, 0xe2, 0x37, 0x5d, 0x6f, 0x4d, 0x86, 0xb4, 0x45, 0x6b,
+ 0xc1, 0x54, 0x26, 0x82, 0x72, 0x6d, 0x63, 0x4a, 0x3e, 0xbb, 0x96, 0x90,
+ 0x47, 0xb7, 0x0c, 0xc7, 0xd1, 0xfc, 0xbd, 0x0e, 0x15, 0x59, 0x80, 0xa7,
+ 0x47, 0xfe, 0x63, 0xd0, 0x3f, 0x9a, 0x24, 0x2a, 0x3c, 0xb9, 0xa8, 0x3f,
+ 0xa7, 0x67, 0x2c, 0xd7, 0xfb, 0x9f, 0x75, 0x56, 0x1b, 0xde, 0x73, 0x02,
+ 0x78, 0xbc, 0x4a, 0x2f, 0x39, 0x81, 0xf1, 0xee, 0x1d, 0xed, 0x36, 0xb7,
+ 0xb6, 0x91, 0x6b, 0xce, 0xff, 0x10, 0xe9, 0xf7, 0x3f, 0x69, 0x6b, 0x4d,
+ 0x3c, 0x74, 0xa1, 0x9f, 0x51, 0xcd, 0x12, 0xb0, 0x59, 0x10, 0x4e, 0xfe,
+ 0x83, 0x1f, 0x4e, 0x92, 0x2c, 0xfe, 0xaf, 0xcb, 0x9e, 0x17, 0x2f, 0xd9,
+ 0x05, 0x88, 0xf1, 0x25, 0x36, 0xcc, 0xeb, 0x6f, 0xbc, 0x47, 0xeb, 0x97,
+ 0x43, 0x8b, 0xd5, 0x2c, 0x50, 0x19, 0xdd, 0x33, 0x98, 0xd5, 0x86, 0xb6,
+ 0x3b, 0x1a, 0x5c, 0xb6, 0xdb, 0xe1, 0xc1, 0x6d, 0x84, 0x39, 0x23, 0x52,
+ 0x81, 0x21, 0x9c, 0xd5, 0x56, 0x71, 0xcb, 0xe1, 0xdc, 0x05, 0x81, 0xc1,
+ 0xa8, 0x92, 0x5c, 0x2d, 0xdf, 0xea, 0x30, 0x27, 0x82, 0x56, 0x26, 0x86,
+ 0xf5, 0x19, 0x7e, 0xed, 0xec, 0xda, 0xed, 0x80, 0x19, 0xdd, 0xe8, 0x31,
+ 0xbd, 0x18, 0x73, 0xea, 0x61, 0xd5, 0x48, 0x2e, 0x78, 0x21, 0x92, 0x88,
+ 0x0e, 0x9e, 0x82, 0xc0, 0xe0, 0x99, 0xf4, 0x6f, 0xfd, 0x6e, 0x88, 0x7c,
+ 0xbe, 0xeb, 0x2d, 0x89, 0x37, 0xa7, 0x03, 0xd0, 0x75, 0x5e, 0x69, 0x0d,
+ 0x63, 0x34, 0x51, 0x62, 0x51, 0x91, 0x88, 0x87, 0xb9, 0x7d, 0x3f, 0x90,
+ 0xc6, 0xb6, 0xd4, 0x8e, 0x8d, 0xe6, 0x55, 0xa8, 0x98, 0x8c, 0xa4, 0xd9,
+ 0xbb, 0x51, 0x4b, 0x85, 0x8c, 0x53, 0xef, 0xc7, 0x8d, 0xd9, 0x64, 0x92,
+ 0xde, 0x38, 0xb4, 0x70, 0x35, 0x04, 0xf2, 0x13, 0xb9, 0x7e, 0x61, 0x6e,
+ 0x91, 0x9c, 0x17, 0x2d, 0x05, 0x06, 0x9f, 0xe9, 0xaa, 0x86, 0x35, 0xcd,
+ 0x25, 0x9c, 0x59, 0x3e, 0x3c, 0x01, 0x67, 0x30, 0xbb, 0x32, 0x32, 0x27,
+ 0x0d, 0x01, 0x56, 0x1c, 0xd6, 0x1f, 0xd5, 0xa1, 0xc6, 0xc1, 0x73, 0xf1,
+ 0x7e, 0xa3, 0x66, 0xf0, 0xcc, 0x2b, 0x99, 0xe2, 0xf8, 0x96, 0x19, 0x25,
+ 0x5f, 0xa2, 0x50, 0x0f, 0xe2, 0xe1, 0x0f, 0xa7, 0x18, 0x28, 0x31, 0x1c,
+ 0x6e, 0xd4, 0xca, 0x7d, 0x77, 0x28, 0x63, 0x95, 0xff, 0x4a, 0xc0, 0x45,
+ 0x36, 0xf2, 0x0c, 0x19, 0x16, 0x8d, 0xfc, 0x93, 0x3a, 0xe0, 0x67, 0x08,
+ 0x05, 0x0f, 0xe2, 0xbd, 0xe9, 0xc1, 0x0b, 0xcc, 0x9c, 0xed, 0x5e, 0xbc,
+ 0x8c, 0x48, 0xaf, 0x74, 0x05, 0x96, 0xd7, 0x58, 0x66, 0x5e, 0x1f, 0x0e,
+ 0x95, 0x1f, 0xd3, 0xef, 0xa7, 0x45, 0xaf, 0x6d, 0xd0, 0x3b, 0xe3, 0x19,
+ 0x96, 0x45, 0x12, 0x32, 0xfd, 0x11, 0x6b, 0xd0, 0xe7, 0x44, 0x18, 0x2d,
+ 0x71, 0x71, 0x36, 0x99, 0x9f, 0x11, 0x67, 0x11, 0x0b, 0x4e, 0x79, 0xac,
+ 0x49, 0x79, 0x91, 0x35, 0x87, 0xdd, 0xc1, 0xa2, 0xb2, 0x76, 0xae, 0x90,
+ 0x76, 0x51, 0x60, 0x51, 0x8b, 0x5c, 0xff, 0x3b, 0xc9, 0x39, 0x55, 0x79,
+ 0xd3, 0xa9, 0x27, 0xe0, 0xc6, 0xb2, 0x17, 0x6a, 0x9a, 0x35, 0xdb, 0xb6,
+ 0x0e, 0x2a, 0xa0, 0x17, 0x53, 0xa3, 0x83, 0x3e, 0x3b, 0x15, 0xd0, 0x61,
+ 0xf6, 0x50, 0xc1, 0xa8, 0xf6, 0x86, 0x86, 0x22, 0x6e, 0x9b, 0x3e, 0xe1,
+ 0xdb, 0x04, 0x04, 0xa4, 0x6a, 0x96, 0x32, 0x02, 0xf1, 0xa5, 0xd3, 0xc0,
+ 0x39, 0xb7, 0xb6, 0x35, 0xaa, 0x5e, 0x0a, 0x75, 0x50, 0x9d, 0x20, 0x82,
+ 0x73, 0x3e, 0x6d, 0xde, 0x5b, 0x28, 0x11, 0xf5, 0x63, 0xab, 0xe5, 0x1a,
+ 0x55, 0x02, 0xd2, 0x64, 0xcb, 0x2c, 0x6b, 0x2e, 0x8c, 0x17, 0xdb, 0x8c,
+ 0x7c, 0xea, 0xa5, 0x43, 0xe2, 0xb4, 0xa8, 0x4f, 0xa9, 0x52, 0x9e, 0x45,
+ 0x59, 0xc3, 0x1b, 0x7d, 0xf9, 0x4a, 0xeb, 0x86, 0x0b, 0x56, 0xc5, 0x08,
+ 0xa8, 0xb6, 0xec, 0x2c, 0xc8, 0x22, 0x69, 0xe3, 0x0d, 0x49, 0xa3, 0x42,
+ 0x32, 0x55, 0xce, 0x33, 0x04, 0xeb, 0xb9, 0x85, 0x5f, 0x12, 0x1c, 0x97,
+ 0xc2, 0x2c, 0x9a, 0xac, 0x2e, 0x92, 0xe8, 0x67, 0xc1, 0x54, 0xd9, 0x24,
+ 0x1d, 0xc8, 0xe8, 0x34, 0x30, 0x65, 0xee, 0xb8, 0x03, 0xfb, 0xcd, 0xcf,
+ 0xfa, 0xca, 0x9d, 0xf8, 0x2d, 0x63, 0x69, 0x6f, 0x44, 0x9d, 0x8b, 0xb1,
+ 0xc6, 0x4e, 0x9a, 0xd5, 0xe0, 0xfc, 0xae, 0x28, 0xd8, 0xe2, 0xb6, 0x77,
+ 0x73, 0xd4, 0x17, 0x34, 0xb5, 0x30, 0x6e, 0x5c, 0x69, 0xc5, 0xcf, 0xa9,
+ 0x8d, 0x4f, 0x60, 0x52, 0x0e, 0xc2, 0x07, 0x6c, 0x3c, 0x6c, 0x6f, 0xc3,
+ 0xc8, 0xa1, 0xea, 0xc2, 0xbf, 0x36, 0xe3, 0xf1, 0x80, 0x0b, 0x30, 0x57,
+ 0x05, 0xa6, 0xe0, 0xcd, 0x0a, 0x68, 0x56, 0xcb, 0xfc, 0x18, 0xbf, 0xef,
+ 0xf9, 0x96, 0x10, 0x07, 0xd2, 0x77, 0xd4, 0x53, 0xcc, 0x50, 0x84, 0x39,
+ 0x1f, 0x04, 0x72, 0xb3, 0x02, 0x67, 0xb7, 0x8f, 0x32, 0xba, 0xd3, 0x4f,
+ 0x20, 0x2f, 0xbb, 0xbe, 0x38, 0xf7, 0x68, 0x5a, 0x75, 0x5a, 0x16, 0x30,
+ 0x35, 0x3e, 0x29, 0x5d, 0xc2, 0x94, 0x12, 0xb0, 0xeb, 0x6e, 0xa8, 0xd5,
+ 0x6f, 0xc8, 0xcb, 0xc6, 0x90, 0x85, 0x49, 0x6b, 0xd3, 0xa0, 0xa8, 0x6c,
+ 0x3c, 0x49, 0x89, 0x94, 0x66, 0xa7, 0xca, 0x83, 0xa5, 0xf3, 0xe3, 0x4a,
+ 0x46, 0x4f, 0x55, 0xc2, 0x35, 0x71, 0x76, 0xb5, 0xe2, 0xc0, 0x19, 0x9b,
+ 0x83, 0xad, 0xdf, 0x11, 0x7e, 0xd3, 0x01, 0xbf, 0x2e, 0xd5, 0x6d, 0xd2,
+ 0x66, 0x8b, 0xac, 0xb6, 0x02, 0xb8, 0xd8, 0xe0, 0xc0, 0xf4, 0x85, 0xd4,
+ 0x5f, 0xf4, 0xd9, 0x83, 0xb7, 0x83, 0x5b, 0xa9, 0x70, 0xe7, 0x32, 0xdc,
+ 0x22, 0x23, 0xa0, 0x12, 0x5a, 0xbe, 0x18, 0x1e, 0x85, 0x35, 0xd3, 0xa5,
+ 0x6d, 0x2b, 0x8c, 0x25, 0x75, 0xfc, 0x86, 0xb2, 0x92, 0xac, 0xd6, 0x76,
+ 0xaf, 0x5b, 0x3b, 0xd0, 0x9a, 0xae, 0xb7, 0xde, 0xa1, 0xac, 0x87, 0xa2,
+ 0x28, 0x07, 0x90, 0x76, 0x30, 0x3a, 0x81, 0x76, 0x30, 0xa7, 0x8b, 0x6b,
+ 0x48, 0x7b, 0xae, 0xd5, 0xdf, 0xf5, 0xb3, 0x3f, 0x2b, 0x02, 0x38, 0x07,
+ 0x5e, 0x7e, 0xab, 0x2d, 0xea, 0xb4, 0x66, 0x71, 0xad, 0x1e, 0xe6, 0x0f,
+ 0xaa, 0xe1, 0x14, 0x98, 0x2f, 0xef, 0x71, 0xa7, 0x2a, 0xa7, 0x7a, 0x1e,
+ 0x84, 0x06, 0xc9, 0xfc, 0x43, 0x33, 0xc0, 0x33, 0x30, 0xff, 0xcc, 0x21,
+ 0xc1, 0x82, 0x8b, 0x84, 0x9c, 0x55, 0x95, 0x29, 0x3a, 0xd4, 0x2a, 0x44,
+ 0x03, 0xe4, 0xbf, 0x89, 0x04, 0x6e, 0x8f, 0x8e, 0xf9, 0xf0, 0x11, 0x03,
+ 0x7f, 0x4b, 0xa8, 0x92, 0x96, 0x20, 0x24, 0x1d, 0xfd, 0xb9, 0x5d, 0xb7,
+ 0xff, 0x1b, 0x69, 0x52, 0x5f, 0x51, 0x9f, 0x8f, 0x71, 0x3c, 0x40, 0x20,
+ 0x49, 0xbf, 0x89, 0xfb, 0x07, 0x76, 0xdc, 0xa8, 0x81, 0xf8, 0xb7, 0xe5,
+ 0x1b, 0x98, 0x39, 0xe2, 0xc7, 0xe0, 0x68, 0xf2, 0x98, 0x4a, 0xa3, 0x96,
+ 0x7b, 0xae, 0x4d, 0xef, 0x3a, 0xe2, 0x0a, 0x83, 0x42, 0x60, 0x58, 0x66,
+ 0x8f, 0xe0, 0x05, 0x97, 0x0b, 0x77, 0x42, 0x91, 0x4b, 0x35, 0xfe, 0xac,
+ 0xa9, 0xec, 0x9f, 0x4c, 0xb5, 0x9d, 0xc1, 0xfc, 0xd0, 0x1c, 0xd0, 0x8e,
+ 0x1e, 0x51, 0xa3, 0x92, 0x90, 0xb5, 0xcc, 0x56, 0xbb, 0x4d, 0xe3, 0x8c,
+ 0x8c, 0xa5, 0x6a, 0x4e, 0x45, 0x94, 0xdf, 0xfa, 0xa9, 0x21, 0x4a, 0x2c,
+ 0xf9, 0xc1, 0xfd, 0xec, 0xf7, 0xe4, 0x40, 0xe4, 0xc0, 0xb4, 0x7f, 0xaa,
+ 0x26, 0x94, 0x27, 0x79, 0x69, 0x60, 0x16, 0xe3, 0x0b, 0xea, 0xf4, 0x48,
+ 0x1f, 0xbe, 0xab, 0x3c, 0xb3, 0xae, 0x35, 0x23, 0xf2, 0x7e, 0x74, 0xa8,
+ 0xdb, 0x80, 0x56, 0xcc, 0x31, 0x96, 0xa3, 0x86, 0x7e, 0x52, 0x56, 0x67,
+ 0x24, 0x93, 0x8b, 0xd0, 0xbc, 0xca, 0x9f, 0xf9, 0xf4, 0x36, 0x9c, 0x85,
+ 0xed, 0x26, 0x94, 0x88, 0xd7, 0x12, 0x5f, 0x6f, 0x78, 0x65, 0x12, 0xd4,
+ 0x8d, 0xf4, 0x4b, 0x63, 0xa0, 0x29, 0x6a, 0xc5, 0x2b, 0xbb, 0x68, 0xf9,
+ 0xf3, 0xb1, 0xdd, 0x96, 0x02, 0x48, 0x8d, 0x05, 0xbd, 0xc1, 0x5a, 0x9f,
+ 0x67, 0x82, 0x59, 0xe1, 0x43, 0xf8, 0xbd, 0x38, 0x35, 0x6c, 0xcc, 0xdf,
+ 0xa2, 0x50, 0x4e, 0x93, 0xb0, 0xab, 0x60, 0xd8, 0x4f, 0x25, 0xa3, 0xe7,
+ 0x16, 0xf4, 0xf2, 0xc8, 0x29, 0xd1, 0x37, 0x3a, 0xbc, 0xf6, 0xcc, 0x54,
+ 0xe6, 0xa3, 0xa7, 0xa6, 0x7d, 0xc7, 0x57, 0x1d, 0x7b, 0xe9, 0x09, 0x5c,
+ 0x2e, 0xa9, 0x8a, 0x56, 0x5f, 0x1a, 0xe4, 0xb1, 0x4a, 0xff, 0xd1, 0x1f,
+ 0x84, 0x71, 0x60, 0xcf, 0x82, 0x3c, 0x8f, 0x51, 0x04, 0xe5, 0xe3, 0xd2,
+ 0x9b, 0xaf, 0x6f, 0x3c, 0xb6, 0x15, 0xc0, 0x2d, 0xb0, 0x9b, 0xa5, 0x3f,
+ 0x53, 0xd2, 0xc9, 0x92, 0xa0, 0x59, 0x9a, 0xb2, 0x56, 0x57, 0x0b, 0xca,
+ 0x5f, 0x9a, 0x95, 0xe6, 0xa1, 0xad, 0xa2, 0x94, 0x27, 0x12, 0x09, 0x00,
+ 0x1b, 0x79, 0xb1, 0x19, 0x2d, 0x66, 0xd0, 0xed, 0x6e, 0xd1, 0x71, 0x14,
+ 0xfc, 0x78, 0x9f, 0x5b, 0x4a, 0xc1, 0x41, 0x89, 0xd1, 0x92, 0x87, 0xdb,
+ 0x83, 0x94, 0xc1, 0x5b, 0x56, 0x3d, 0xca, 0x16, 0x75, 0x78, 0x58, 0x03,
+ 0x40, 0x47, 0xf1, 0xb0, 0xec, 0x4d, 0x61, 0xe7, 0xa2, 0x2c, 0x42, 0x43,
+ 0xf0, 0xe4, 0xe5, 0xb2, 0x81, 0xf6, 0x34, 0xd1, 0x17, 0xf3, 0xff, 0x0f,
+ 0xad, 0x20, 0xb9, 0xd7, 0x45, 0x6b, 0xf1, 0x62, 0x99, 0x49, 0xdf, 0xa7,
+ 0xd4, 0xea, 0xc3, 0xd4, 0x41, 0x04, 0xc6, 0x6c, 0x0b, 0xf3, 0x55, 0x90,
+ 0x4f, 0x33, 0x49, 0xe0, 0xa1, 0x72, 0xd2, 0xd8, 0xb9, 0x4c, 0x53, 0x64,
+ 0xdf, 0x46, 0xff, 0x39, 0x09, 0x68, 0x10, 0x66, 0x28, 0x05, 0xa6, 0xc2,
+ 0x35, 0xb4, 0x44, 0x73, 0xac, 0x88, 0xf6, 0x45, 0x94, 0x34, 0xb9, 0x50,
+ 0x94, 0xc3, 0xc1, 0xac, 0xde, 0x15, 0x95, 0x54, 0xad, 0x51, 0xc6, 0xa0,
+ 0x40, 0xbc, 0xe1, 0xa9, 0x4e, 0x8c, 0x24, 0x74, 0x46, 0x03, 0xbb, 0xd8,
+ 0x69, 0xd1, 0x2d, 0x1a, 0x2a, 0xc4, 0xb4, 0xc8, 0xa4, 0x25, 0x00, 0x57,
+ 0xb4, 0x4a, 0x19, 0xbd, 0xf5, 0x2f, 0x63, 0x6a, 0x9b, 0xa9, 0x0a, 0x0a,
+ 0x05, 0x15, 0xff, 0x01, 0x0a, 0x93, 0x84, 0x1b, 0x6c, 0x21, 0x6b, 0x34,
+ 0x8f, 0xcc, 0x36, 0xe7, 0xab, 0x99, 0x7b, 0xbc, 0x25, 0xb5, 0x83, 0x66,
+ 0x8d, 0xec, 0x5f, 0x7d, 0xd5, 0x4b, 0xf1, 0xcc, 0x18, 0x39, 0xd0, 0xd6,
+ 0xb1, 0xfb, 0x22, 0x41, 0xb0, 0x91, 0x66, 0x14, 0x40, 0xae, 0xa3, 0x49,
+ 0x39, 0xe2, 0x62, 0xf3, 0x3f, 0x18, 0xe2, 0xdf, 0x9a, 0x01, 0x4a, 0xfc,
+ 0xd1, 0x93, 0x68, 0x5f, 0xfc, 0x3a, 0x0a, 0xbf, 0x37, 0x4e, 0x8d, 0x30,
+ 0x2c, 0x87, 0x30, 0xc2, 0xd1, 0xa9, 0xac, 0xb9, 0x51, 0xdd, 0xcf, 0x40,
+ 0x8f, 0xde, 0x25, 0xe8, 0xf1, 0xa4, 0xd0, 0x99, 0xad, 0x45, 0x20, 0xdf,
+ 0x32, 0xb5, 0x1c, 0xfa, 0xe6, 0x38, 0xd0, 0x2e, 0x46, 0x23, 0x52, 0xe1,
+ 0x4f, 0x00, 0x65, 0xa9, 0x9d, 0xe0, 0xc6, 0x4c, 0x3c, 0x00, 0x57, 0x60,
+ 0xe8, 0x8f, 0xf0, 0x0b, 0x70, 0x88, 0x1c, 0xa2, 0x49, 0x46, 0xb5, 0x4d,
+ 0x00, 0xbc, 0x2c, 0x5d, 0xb9, 0x35, 0xa0, 0x0a, 0xbb, 0xf2, 0xf7, 0x0b,
+ 0x1f, 0xa5, 0x5a, 0x5f, 0x08, 0x9c, 0xa9, 0x1a, 0xdb, 0x86, 0x42, 0x0b,
+ 0xb1, 0x83, 0x12, 0x98, 0x15, 0x1f, 0x77, 0x80, 0x2b, 0x2c, 0xe4, 0x87,
+ 0x2a, 0x05, 0x35, 0x22, 0xef, 0xd5, 0xc4, 0xc7, 0x2a, 0xa6, 0xe2, 0x0c,
+ 0x13, 0x69, 0x18, 0x7c, 0x0c, 0x0b, 0xba, 0x7a, 0x6f, 0xd3, 0xb1, 0x67,
+ 0x4d, 0x60, 0x94, 0x78, 0xfc, 0x26, 0x3d, 0xec, 0xb4, 0x7b, 0xd1, 0xea,
+ 0x50, 0x39, 0xb4, 0xdd, 0xff, 0xe6, 0x0f, 0xde, 0x24, 0x60, 0x47, 0xff,
+ 0xf1, 0x96, 0xb8, 0x68, 0x18, 0x42, 0xce, 0x98, 0x6e, 0x76, 0x94, 0x09,
+ 0x5f, 0x98, 0xc6, 0x08, 0xaf, 0x01, 0x19, 0x21, 0x0f, 0xbb, 0x63, 0xb7,
+ 0x94, 0xe9, 0x95, 0xb0, 0xa6, 0x25, 0x8d, 0x04, 0x04, 0x35, 0xfc, 0x81,
+ 0xbe, 0xc7, 0x3a, 0x6a, 0xb5, 0xb2, 0x7a, 0xe5, 0x10, 0xcd, 0x7f, 0xe3,
+ 0x40, 0x97, 0xa0, 0x41, 0x99, 0xd7, 0x6d, 0xb1, 0x1f, 0x41, 0x8e, 0x6c,
+ 0xa6, 0x69, 0xca, 0x39, 0x43, 0x94, 0x9f, 0xa1, 0x12, 0x4e, 0xd5, 0xa7,
+ 0x21, 0x2c, 0x96, 0x75, 0x20, 0x84, 0x24, 0x4a, 0xff, 0x82, 0x29, 0x7d,
+ 0x78, 0xd6, 0xeb, 0x76, 0x92, 0x1e, 0xcb, 0x10, 0xca, 0xde, 0x6c, 0x2a,
+ 0xed, 0x66, 0xff, 0x24, 0xd2, 0x42, 0x6a, 0xf5, 0x0b, 0x72, 0xa0, 0xb1,
+ 0x16, 0x76, 0x00, 0x45, 0x18, 0xa5, 0xf9, 0xce, 0x20, 0xf8, 0x1f, 0x25,
+ 0x7a, 0x00, 0x2e, 0x28, 0xab, 0xcd, 0x0a, 0xef, 0x71, 0x4f, 0xe9, 0x88,
+ 0xc5, 0x29, 0x13, 0x09, 0x66, 0x98, 0x3f, 0x71, 0x07, 0xd1, 0xff, 0xb8,
+ 0x01, 0xc8, 0x14, 0xe8, 0xef, 0x73, 0x9b, 0xbe, 0xe9, 0x8f, 0x17, 0x7d,
+ 0x0c, 0x48, 0x34, 0x96, 0xe1, 0xab, 0x9e, 0x3c, 0xf0, 0x27, 0x9b, 0xe4,
+ 0x26, 0xab, 0xfc, 0x28, 0xf9, 0x44, 0xe4, 0x1e, 0xce, 0xba, 0xd2, 0x7d,
+ 0x9d, 0x25, 0xb8, 0x2f, 0x81, 0x74, 0xea, 0x27, 0x90, 0xc4, 0x15, 0x20,
+ 0xe3, 0x30, 0x05, 0xac, 0xd9, 0x35, 0xc6, 0x3c, 0x06, 0xf2, 0x71, 0xfd,
+ 0xaa, 0x54, 0xab, 0x4e, 0x07, 0xb8, 0xd8, 0x82, 0xc7, 0x83, 0x43, 0x39,
+ 0xa9, 0xa3, 0x9c, 0xc0, 0xaf, 0x49, 0xa8, 0x5c, 0x74, 0x5f, 0x59, 0x12,
+ 0x1c, 0xa9, 0xbf, 0xeb, 0x81, 0x34, 0xce, 0x3c, 0x2e, 0x4d, 0x0c, 0xe7,
+ 0x0c, 0x86, 0x47, 0xc2, 0x4c, 0xe0, 0x38, 0x7d, 0xf6, 0x03, 0x0b, 0x58,
+ 0x30, 0x78, 0x2b, 0xb5, 0xa3, 0xcc, 0xf5, 0xd7, 0x1f, 0x36, 0x59, 0x4c,
+ 0x83, 0xff, 0xfd, 0x9f, 0x8c, 0xaf, 0x55, 0xcf, 0x01, 0x4c, 0x4d, 0x6f,
+ 0xd9, 0x18, 0x3d, 0xb3, 0xfd, 0x82, 0x00, 0x34, 0x34, 0xc9, 0x40, 0xe4,
+ 0xc5, 0x93, 0x56, 0x8d, 0x2c, 0xa5, 0x3d, 0xc3, 0xbd, 0xb6, 0x15, 0x82,
+ 0x4a, 0x59, 0xda, 0x40, 0x54, 0x5d, 0x8a, 0xe9, 0x73, 0x63, 0x28, 0xc1,
+ 0x33, 0x65, 0x43, 0x10, 0x52, 0xb2, 0x95, 0xbf, 0x17, 0x85, 0x01, 0xf3,
+ 0xab, 0x87, 0x67, 0xb1, 0xea, 0x9a, 0x08, 0x4d, 0xab, 0x41, 0xd9, 0xb7,
+ 0x7c, 0x08, 0x2d, 0x69, 0x70, 0x84, 0x42, 0x96, 0xd6, 0x9e, 0x0e, 0x75,
+ 0xbb, 0x28, 0xa1, 0x83, 0x25, 0x4c, 0x2e, 0x80, 0x33, 0x08, 0x39, 0xdb,
+ 0x27, 0x38, 0x96, 0x16, 0x51, 0x00, 0x32, 0xb4, 0x9b, 0x6c, 0x3e, 0x09,
+ 0x82, 0x31, 0xed, 0xfb, 0x28, 0xa4, 0x8b, 0x98, 0x78, 0x9d, 0xcd, 0xd9,
+ 0xa9, 0x12, 0x28, 0x1e, 0x55, 0x5b, 0x76, 0xd5, 0x45, 0x86, 0x78, 0x47,
+ 0x65, 0xc1, 0x01, 0x45, 0x05, 0x09, 0xcb, 0x15, 0xcd, 0x36, 0xbd, 0x01,
+ 0xcf, 0xe5, 0x92, 0x37, 0xca, 0x2d, 0x92, 0x56, 0x12, 0x54, 0x9c, 0xe2,
+ 0x4d, 0x55, 0xb3, 0xfe, 0xf7, 0x99, 0x78, 0x5c, 0xe8, 0xff, 0xcf, 0x62,
+ 0x94, 0x6b, 0x22, 0xf1, 0x13, 0x83, 0x78, 0x07, 0x73, 0x59, 0x26, 0x28,
+ 0x3b, 0xd2, 0x89, 0x89, 0x07, 0xe7, 0xef, 0xc1, 0x60, 0xf0, 0x35, 0xa0,
+ 0xd7, 0x51, 0xef, 0x81, 0xfd, 0x98, 0xbf, 0xe4, 0x07, 0x14, 0x25, 0x72,
+ 0x2d, 0xa9, 0x41, 0x97, 0x36, 0xa9, 0xbe, 0x02, 0x60, 0x9e, 0xe5, 0x8e,
+ 0x18, 0x6f, 0x6e, 0x04, 0xef, 0xb5, 0x4f, 0x96, 0xbf, 0xa6, 0x1a, 0xd4,
+ 0x6f, 0x7e, 0xd9, 0xd2, 0x15, 0x8b, 0x67, 0x57, 0x03, 0x89, 0x5a, 0x3e,
+ 0x8a, 0xf5, 0xfe, 0xd5, 0xb8, 0x9c, 0x89, 0x76, 0x5d, 0xca, 0x40, 0x0a,
+ 0xf4, 0x0b, 0xdc, 0xe3, 0x2e, 0xa4, 0xbc, 0xd7, 0x40, 0x89, 0x10, 0x9e,
+ 0xeb, 0x3e, 0x6e, 0x9e, 0x1b, 0xbb, 0xaf, 0x87, 0xba, 0x4a, 0x4f, 0x6b,
+ 0x4d, 0xa5, 0xd7, 0xba, 0x31, 0xbc, 0x73, 0xe4, 0x7a, 0x00, 0xd6, 0x2e,
+ 0x0d, 0xc1, 0x8f, 0x66, 0xc3, 0xbb, 0x0b, 0x6f, 0x5f, 0x8e, 0x23, 0xe5,
+ 0xa9, 0xf5, 0x22, 0x19, 0x68, 0xeb, 0x9b, 0xe5, 0x86, 0xf1, 0x79, 0x02,
+ 0x92, 0xc2, 0x43, 0x94, 0x9e, 0xc8, 0x65, 0x07, 0x0c, 0x13, 0x5a, 0x4e,
+ 0x08, 0x05, 0x97, 0x0c, 0x2c, 0x2f, 0x50, 0x07, 0x0d, 0x51, 0x93, 0x5b,
+ 0xf9, 0xf0, 0x48, 0xff, 0x0a, 0xf3, 0x66, 0x5c, 0xe6, 0x2c, 0xa1, 0xf9,
+ 0xab, 0x19, 0xa9, 0xf7, 0x58, 0xa0, 0xc5, 0xc2, 0xbf, 0x3a, 0x2e, 0xb1,
+ 0x3e, 0xbf, 0x72, 0xb0, 0x49, 0x81, 0xd6, 0x8f, 0xaf, 0xda, 0x32, 0xec,
+ 0x1e, 0x98, 0x4b, 0x94, 0xe7, 0x18, 0x0e, 0x63, 0x9a, 0x81, 0xc6, 0x2d,
+ 0xb4, 0xb8, 0x32, 0xf4, 0x6d, 0xdb, 0xca, 0x1c, 0x42, 0x9f, 0x1f, 0x7e,
+ 0x17, 0x2c, 0xf0, 0x90, 0xb3, 0xf5, 0x7c, 0xb3, 0x7a, 0x86, 0xd8, 0x9b,
+ 0xdc, 0xe8, 0x0d, 0xb7, 0xea, 0x0f, 0xd4, 0xeb, 0xf2, 0x93, 0x21, 0xbd,
+ 0xb6, 0x89, 0x95, 0xf3, 0x0f, 0xd3, 0xf4, 0x95, 0x24, 0xde, 0xb3, 0x2d,
+ 0x21, 0x36, 0xff, 0xee, 0xcd, 0x42, 0xcc, 0x09, 0x36, 0x56, 0x1b, 0xfb,
+ 0xa9, 0x9b, 0x55, 0x90, 0x6e, 0xd7, 0x2a, 0xab, 0x2e, 0x57, 0xb5, 0x4c,
+ 0xc2, 0x1e, 0x6e, 0x8f, 0x7e, 0x4d, 0x16, 0x07, 0xe9, 0x31, 0xb0, 0x18,
+ 0x76, 0x32, 0x3d, 0x0d, 0xe9, 0xde, 0x63, 0xde, 0x9f, 0xdf, 0x0e, 0x5b,
+ 0x6d, 0x33, 0x7f, 0xd7, 0x53, 0x14, 0x58, 0x12, 0x46, 0x51, 0x07, 0x2e,
+ 0x5a, 0xec, 0x5d, 0x1f, 0x36, 0x28, 0x73, 0x54, 0x3c, 0x8c, 0xdf, 0x0e,
+ 0xe5, 0x18, 0x6d, 0x7b, 0x2b, 0x0a, 0x94, 0x7d, 0xa3, 0x86, 0xc2, 0x66,
+ 0xf5, 0x86, 0x90, 0x21, 0x43, 0x51, 0x86, 0x96, 0x49, 0x91, 0xff, 0x26,
+ 0x16, 0x92, 0x82, 0x73, 0x80, 0x82, 0x93, 0xfd, 0x0f, 0x24, 0xcd, 0x1e,
+ 0x69, 0x75, 0x9f, 0x78, 0x89, 0x68, 0xf3, 0x2b, 0x8b, 0xaa, 0x2b, 0x4a,
+ 0x05, 0x06, 0x01, 0xb9, 0x41, 0x53, 0x49, 0x80, 0x09, 0x35, 0x55, 0x4d,
+ 0xea, 0x0a, 0xd6, 0x54, 0x3d, 0xf1, 0x53, 0xc4, 0xe9, 0xf4, 0x54, 0xbf,
+ 0xd3, 0xe4, 0x59, 0x61, 0xcb, 0x11, 0x86, 0x10, 0x63, 0x5c, 0xa5, 0xad,
+ 0x21, 0xcd, 0x4e, 0x64, 0xb1, 0x4f, 0x98, 0x7a, 0xb6, 0x75, 0x10, 0xb2,
+ 0x1d, 0x0f, 0x44, 0xef, 0x04, 0x88, 0xee, 0x80, 0x0f, 0xd1, 0x43, 0x9e,
+ 0xc0, 0xf9, 0xdc, 0xfa, 0xfd, 0x32, 0xfb, 0xb1, 0xfd, 0xa3, 0x02, 0xea,
+ 0x19, 0xd4, 0xde, 0xbd, 0x7d, 0x91, 0xf4, 0x11, 0x8a, 0xcf, 0x43, 0x5b,
+ 0x27, 0x96, 0x40, 0x0e, 0xa7, 0x98, 0x8b, 0x4e, 0x55, 0x9c, 0x03, 0xf5,
+ 0xc7, 0xb1, 0x2e, 0x5a, 0xca, 0xed, 0x47, 0x2a, 0x12, 0xbe, 0x90, 0x8f,
+ 0x52, 0x51, 0x16, 0x12, 0x7e, 0xa8, 0x59, 0x89, 0x5b, 0x30, 0x63, 0x89,
+ 0x28, 0x5b, 0x1d, 0x68, 0x83, 0xb3, 0x56, 0x98, 0x7e, 0xff, 0xfd, 0x87,
+ 0xd8, 0xc6, 0xd7, 0x16, 0x80, 0x67, 0xc9, 0x18, 0xbb, 0x67, 0x06, 0x25,
+ 0xa6, 0xb6, 0xc2, 0x01, 0x34, 0x7a, 0x95, 0xbf, 0x4d, 0x21, 0x08, 0xe1,
+ 0x3a, 0xab, 0xe4, 0x12, 0x98, 0x86, 0x1f, 0xd8, 0x95, 0x6e, 0xb9, 0xa8,
+ 0xcc, 0xcd, 0xa2, 0x36, 0x82, 0xe3, 0xf5, 0x39, 0x82, 0xec, 0xc5, 0x3b,
+ 0xb0, 0xb9, 0x26, 0xd2, 0x1f, 0x97, 0xcd, 0x21, 0xff, 0x57, 0xe1, 0x6f,
+ 0x67, 0x30, 0x50, 0x46, 0x4c, 0xdf, 0xcf, 0xbe, 0xea, 0xf7, 0x42, 0xe9,
+ 0x5a, 0xa1, 0x20, 0x75, 0xae, 0xa7, 0xc1, 0x45, 0xef, 0x4c, 0xab, 0xff,
+ 0x74, 0x3c, 0x11, 0xdd, 0x39, 0x68, 0x7e, 0x02, 0x53, 0xfb, 0x9c, 0xf7,
+ 0x7e, 0xd9, 0x80, 0x73, 0xae, 0xa5, 0x7a, 0x8f, 0x7c, 0xc9, 0xdc, 0xe1,
+ 0x76, 0xd1, 0xca, 0xc5, 0x73, 0x9c, 0xf0, 0x96, 0x31, 0x60, 0xca, 0x1b,
+ 0x4b, 0x7b, 0xbd, 0x41, 0xc2, 0xf4, 0x07, 0x28, 0xe2, 0x6c, 0xf6, 0xcb,
+ 0xf2, 0x2f, 0x03, 0x79, 0x61, 0xea, 0x39, 0x9a, 0x80, 0x88, 0x56, 0x26,
+ 0x9d, 0xab, 0x2b, 0x1d, 0x14, 0xcb, 0x9d, 0x54, 0xda, 0x6a, 0x60, 0x92,
+ 0x12, 0x82, 0x84, 0xd0, 0xd9, 0xd7, 0xa3, 0x78, 0x34, 0x7b, 0x12, 0x65,
+ 0x86, 0x9d, 0x8e, 0x4c, 0xde, 0x3c, 0xd9, 0x89, 0xcb, 0xe4, 0xb8, 0xd2,
+ 0xb7, 0x4a, 0x1e, 0x72, 0xfd, 0x03, 0x0d, 0x0e, 0xe4, 0xa0, 0x52, 0xd3,
+ 0x77, 0xea, 0x38, 0xb7, 0x30, 0x38, 0x2b, 0xe5, 0x92, 0xdd, 0x6f, 0xd0,
+ 0x8a, 0xe2, 0xc9, 0x2d, 0x5f, 0x77, 0x75, 0x3e, 0x8c, 0x9d, 0xcb, 0x3d,
+ 0xd3, 0xc2, 0xc6, 0x34, 0xa6, 0x5c, 0xc4, 0xb2, 0x38, 0x10, 0x9c, 0xff,
+ 0xf1, 0x8f, 0x05, 0x39, 0x23, 0xc4, 0x65, 0x12, 0xf2, 0x08, 0xfa, 0xaf,
+ 0xc5, 0xfa, 0x08, 0x91, 0xf0, 0xef, 0x92, 0xf3, 0xd7, 0x09, 0x04, 0xf2,
+ 0x6f, 0x54, 0x02, 0x0c, 0xe1, 0x0c, 0xad, 0x6c, 0xdf, 0xbc, 0x68, 0xd3,
+ 0xd4, 0xf3, 0xef, 0x71, 0xcf, 0x0e, 0x09, 0x74, 0x92, 0xa8, 0x3b, 0x39,
+ 0xb9, 0x8e, 0x05, 0x29, 0x87, 0xa3, 0x8f, 0x50, 0x28, 0xdc, 0x6e, 0x7f,
+ 0xdd, 0x76, 0xa0, 0x77, 0x3d, 0x82, 0x80, 0x5d, 0xa3, 0x5b, 0x6d, 0x0f,
+ 0x24, 0x6f, 0xb1, 0x1a, 0xea, 0xf5, 0x1c, 0x44, 0xb2, 0x47, 0xce, 0x97,
+ 0xae, 0xe4, 0x74, 0xfc, 0x4a, 0x46, 0x22, 0x9a, 0xb1, 0x27, 0xcf, 0xf8,
+ 0xc2, 0x87, 0xd3, 0x85, 0x77, 0xb2, 0xb3, 0x94, 0x27, 0x93, 0x22, 0x40,
+ 0x86, 0xe3, 0x90, 0x02, 0x4d, 0xb2, 0x76, 0x9e, 0x56, 0x53, 0x06, 0xa5,
+ 0xbf, 0x92, 0x6e, 0x57, 0xfb, 0x79, 0xed, 0x2b, 0xb2, 0x04, 0x0b, 0x89,
+ 0xd8, 0x11, 0x31, 0x1c, 0x2a, 0xe7, 0xdf, 0xa3, 0x2a, 0xb2, 0xda, 0xa1,
+ 0xd7, 0xc5, 0xe4, 0xb4, 0x50, 0x86, 0x3d, 0x49, 0x71, 0xc2, 0xae, 0xba,
+ 0x46, 0xd3, 0x17, 0x35, 0xe4, 0x5b, 0xc5, 0xb0, 0x23, 0x46, 0x24, 0x3a,
+ 0xb9, 0xc4, 0x62, 0x71, 0xbb, 0xce, 0x9c, 0xd4, 0xf3, 0x88, 0x01, 0x05,
+ 0x56, 0x60, 0x88, 0x01, 0x85, 0x15, 0xaa, 0xf3, 0x99, 0xa6, 0x1d, 0x97,
+ 0x48, 0xb2, 0x12, 0xfc, 0x6e, 0xd3, 0x63, 0x2b, 0x55, 0xea, 0x68, 0x56,
+ 0xa1, 0xbb, 0x94, 0x47, 0xef, 0x10, 0x02, 0xdc, 0xf1, 0x60, 0x92, 0x53,
+ 0xb4, 0x5c, 0x4d, 0xe3, 0x31, 0xa0, 0x4d, 0xa3, 0x34, 0xca, 0xe7, 0x66,
+ 0x87, 0xb3, 0x8a, 0x3e, 0xdb, 0xc7, 0xe7, 0x6b, 0x36, 0x8c, 0xd5, 0xa2,
+ 0x1e, 0x4c, 0xc5, 0x5d, 0x03, 0xb8, 0xcb, 0x66, 0x63, 0x19, 0xc0, 0x59,
+ 0x1b, 0x44, 0x94, 0x2a, 0x7e, 0xc0, 0x37, 0x44, 0x81, 0x41, 0x53, 0x66,
+ 0xc2, 0x80, 0x4a, 0x5b, 0xcd, 0xaf, 0xe8, 0xee, 0x58, 0xa5, 0x94, 0x33,
+ 0xda, 0xe8, 0x34, 0x0f, 0xee, 0x1a, 0xc3, 0xe5, 0x5e, 0xba, 0x98, 0x52,
+ 0xa1, 0x05, 0xa3, 0x4f, 0x30, 0x8d, 0xe3, 0x98, 0xaf, 0x22, 0xd3, 0x16,
+ 0x0a, 0x08, 0x49, 0x2c, 0x6a, 0xe4, 0x8f, 0x7f, 0x09, 0x67, 0x82, 0x08,
+ 0xfc, 0x3b, 0x5b, 0x92, 0x28, 0x8a, 0x09, 0xc7, 0x32, 0xa0, 0x94, 0x1b,
+ 0x51, 0xc5, 0x49, 0x43, 0xeb, 0xa8, 0xed, 0xed, 0xab, 0xae, 0xc5, 0xf7,
+ 0x77, 0x36, 0x48, 0x91, 0xaf, 0xd3, 0xfd, 0x16, 0xc8, 0x5d, 0xb5, 0x24,
+ 0xe9, 0xaf, 0x7e, 0xcf, 0xa1, 0x8e, 0x22, 0x01, 0xc5, 0xe1, 0x3a, 0xbe,
+ 0x91, 0x7f, 0xf6, 0x51, 0x88, 0x99, 0x7d, 0xf5, 0xfd, 0x0a, 0x1f, 0x05,
+ 0xa9, 0xa5, 0x5a, 0xd0, 0x33, 0x78, 0x12, 0x69, 0x0c, 0x07, 0xd3, 0x8c,
+ 0xb9, 0x09, 0xdb, 0x6f, 0xec, 0x8c, 0x38, 0x9f, 0xfb, 0x34, 0xd3, 0x5c,
+ 0x91, 0x4d, 0x06, 0x36, 0x21, 0x5e, 0x74, 0x5e, 0x2f, 0x03, 0xbf, 0x3a,
+ 0x1e, 0x90, 0x6b, 0x93, 0xac, 0x79, 0xe2, 0xad, 0x7d, 0xfc, 0xa5, 0x27,
+ 0x2d, 0x4d, 0xc1, 0xf1, 0x8d, 0x81, 0xfc, 0xec, 0x1a, 0xd8, 0x19, 0x3c,
+ 0x69, 0x58, 0xf9, 0x6c, 0x3b, 0x0a, 0x4b, 0xf8, 0x9c, 0xec, 0xec, 0xd4,
+ 0x35, 0x6c, 0x1a, 0x5b, 0x7e, 0x5a, 0x0d, 0x58, 0x61, 0x80, 0xd9, 0xbf,
+ 0x68, 0x40, 0x0b, 0x9b, 0xeb, 0x1b, 0x50, 0xe5, 0xf7, 0x63, 0x11, 0xb1,
+ 0x74, 0x12, 0x49, 0x9a, 0x47, 0xdb, 0x4d, 0x6c, 0xbf, 0xf4, 0x75, 0x82,
+ 0xc2, 0x68, 0x28, 0x08, 0x56, 0xe9, 0x28, 0x7f, 0x37, 0x90, 0x02, 0x81,
+ 0x11, 0xec, 0x98, 0x8c, 0x30, 0xc8, 0xe9, 0x11, 0x9a, 0xc2, 0x78, 0xfb,
+ 0x4f, 0x21, 0xe4, 0xeb, 0x67, 0x07, 0xae, 0xc3, 0x28, 0x89, 0x1c, 0x35,
+ 0xd7, 0xa8, 0xed, 0x3f, 0xb8, 0x2f, 0x94, 0xe7, 0x07, 0xa8, 0x26, 0x7f,
+ 0x47, 0x05, 0x26, 0xc7, 0xae, 0x3e, 0xb4, 0x4b, 0x1f, 0x58, 0xe0, 0xc2,
+ 0xd7, 0xc6, 0x70, 0x97, 0xde, 0xa2, 0xcd, 0xe1, 0xfc, 0x0c, 0x41, 0xb5,
+ 0xec, 0xb6, 0x96, 0x16, 0x31, 0x5b, 0x44, 0x9a, 0x96, 0x79, 0x63, 0xc0,
+ 0x6c, 0x07, 0x56, 0xef, 0x9a, 0x98, 0x0b, 0x84, 0xd5, 0x4d, 0x5f, 0x80,
+ 0xae, 0x97, 0x4d, 0x71, 0xb0, 0xb3, 0x2e, 0xdd, 0x30, 0xaa, 0xb6, 0x08,
+ 0xb5, 0x0c, 0x4e, 0xba, 0xd8, 0x6d, 0x6c, 0x7b, 0x09, 0xd0, 0x36, 0x3a,
+ 0x9e, 0xb5, 0x0d, 0x6c, 0xad, 0xc1, 0xc8, 0xe3, 0xd9, 0x83, 0x4d, 0xd9,
+ 0xde, 0x43, 0x7d, 0x10, 0x94, 0x58, 0x72, 0x23, 0xb1, 0xcc, 0xc3, 0x4d,
+ 0xf7, 0x2d, 0x29, 0xfb, 0x37, 0x7c, 0x79, 0x3e, 0xb8, 0xd3, 0x95, 0x70,
+ 0x04, 0xc6, 0x96, 0xcc, 0xf0, 0x38, 0xca, 0x15, 0x34, 0xf0, 0x05, 0x0f,
+ 0x96, 0x1c, 0x06, 0x4e, 0xab, 0x15, 0xb6, 0x8e, 0x63, 0xca, 0x46, 0xce,
+ 0x18, 0x76, 0x8f, 0xd0, 0x38, 0xfc, 0x65, 0x8b, 0x02, 0x83, 0xc8, 0xd2,
+ 0xa3, 0x27, 0x4a, 0xf6, 0xc5, 0xb3, 0x14, 0xb6, 0xe4, 0x43, 0xb9, 0x9f,
+ 0xc8, 0x6a, 0x29, 0x9b, 0xde, 0x9a, 0x3e, 0x94, 0xcb, 0x73, 0x71, 0xe3,
+ 0x21, 0xcd, 0x23, 0x55, 0x2a, 0xd2, 0x9d, 0x57, 0xdc, 0x83, 0x6e, 0xca,
+ 0x5a, 0x39, 0x92, 0x3d, 0x29, 0xd1, 0xf2, 0x69, 0x8c, 0x8d, 0xd4, 0x24,
+ 0x89, 0xe7, 0x4f, 0xba, 0xb9, 0x50, 0x0a, 0x76, 0x6a, 0xa3, 0x31, 0x9f,
+ 0xc8, 0x44, 0xf7, 0xf2, 0xdb, 0x8e, 0x22, 0xdf, 0x49, 0x16, 0x26, 0x99,
+ 0x52, 0xec, 0xca, 0x60, 0x02, 0x91, 0x59, 0x9d, 0x8d, 0x86, 0xfd, 0x7a,
+ 0xf9, 0x76, 0x0c, 0xeb, 0x12, 0x57, 0xf1, 0x03, 0xdd, 0x2c, 0x16, 0x1d,
+ 0xf7, 0xe8, 0x0b, 0x1a, 0x37, 0x37, 0xd1, 0x98, 0xdd, 0xe6, 0x1e, 0xfb,
+ 0xcc, 0xee, 0xdf, 0xd0, 0x9e, 0x0e, 0xf6, 0x99, 0x92, 0x31, 0x06, 0xd6,
+ 0x38, 0x68, 0x66, 0xc3, 0x9d, 0xc7, 0x06, 0x15, 0x68, 0x5e, 0xec, 0x82,
+ 0x5e, 0x4e, 0xa0, 0xb2, 0x59, 0xea, 0x93, 0xb5, 0x4e, 0x4e, 0x18, 0x13,
+ 0xc1, 0x0d, 0x7f, 0x4c, 0xaf, 0x1d, 0x31, 0x35, 0xac, 0xba, 0x99, 0x82,
+ 0x82, 0x1c, 0x1c, 0xf5, 0x21, 0xca, 0xde, 0x82, 0x00, 0x52, 0xde, 0xb4,
+ 0x59, 0xc2, 0xf0, 0xdb, 0x13, 0x37, 0xc5, 0x39, 0x95, 0x95, 0x86, 0x02,
+ 0x33, 0x00, 0x26, 0x40, 0xb0, 0x32, 0x0c, 0xd5, 0xd4, 0x9b, 0xc9, 0xe4,
+ 0xe4, 0x9b, 0x96, 0x94, 0x25, 0x9f, 0x54, 0xab, 0x2d, 0x0f, 0x19, 0x59,
+ 0x49, 0x53, 0x96, 0x3e, 0x20, 0xc5, 0x78, 0xde, 0x7e, 0x15, 0x8c, 0x53,
+ 0xa1, 0xf5, 0xd6, 0xe8, 0xa0, 0xaf, 0x11, 0x9d, 0xa3, 0x67, 0x5e, 0xcb,
+ 0x42, 0x39, 0x17, 0xf2, 0x8a, 0xfe, 0x91, 0x28, 0x03, 0x59, 0x96, 0x05,
+ 0xc6, 0x37, 0x19, 0x8d, 0x7b, 0xad, 0x16, 0x84, 0x39, 0xc8, 0xb5, 0xea,
+ 0x01, 0x5a, 0xd7, 0xce, 0x4c, 0x51, 0x8c, 0x7c, 0xb9, 0xc9, 0x1a, 0xcd,
+ 0x41, 0xe1, 0x13, 0x6c, 0x35, 0xc6, 0xb5, 0x3f, 0x3a, 0x4b, 0x60, 0x8b,
+ 0x06, 0x91, 0xca, 0x1c, 0x7c, 0xf4, 0x9e, 0x51, 0x04, 0x59, 0x42, 0x55,
+ 0x07, 0x45, 0x56, 0xca, 0x2f, 0xde, 0x39, 0x50, 0x17, 0x60, 0x38, 0x04,
+ 0xde, 0xb1, 0x96, 0xba, 0x2c, 0x1b, 0x7e, 0xd1, 0xbc, 0x58, 0x9d, 0x31,
+ 0xe0, 0x2d, 0xaf, 0xce, 0xbe, 0xcc, 0xd6, 0x3f, 0xe9, 0x11, 0xca, 0x7f,
+ 0x59, 0x9a, 0x05, 0xda, 0x46, 0xaf, 0xb0, 0xd3, 0x98, 0x69, 0xfe, 0x6e,
+ 0xa5, 0x10, 0xa7, 0x0d, 0x64, 0x34, 0xe2, 0xae, 0xeb, 0xef, 0xef, 0x72,
+ 0x04, 0xc3, 0x68, 0xa6, 0xe5, 0xde, 0xb3, 0x05, 0x52, 0x94, 0x5f, 0x26,
+ 0x5a, 0x5a, 0x5a, 0xbb, 0x1f, 0x2a, 0x97, 0x92, 0xc2, 0xbc, 0x20, 0x6d,
+ 0x3a, 0xae, 0xaf, 0x85, 0xd6, 0xec, 0x29, 0x5e, 0xfd, 0xe6, 0xd2, 0xec,
+ 0xb7, 0x92, 0xfe, 0x53, 0x3a, 0x11, 0x2f, 0x15, 0xf8, 0x90, 0x06, 0x9b,
+ 0xd1, 0xca, 0x86, 0xf3, 0x5b, 0x4e, 0x92, 0xa2, 0x7d, 0x71, 0x72, 0x7c,
+ 0xcc, 0x5e, 0xa2, 0x48, 0x3e, 0xab, 0xe1, 0x67, 0xa4, 0x3d, 0x0e, 0x15,
+ 0x67, 0x86, 0x07, 0xc6, 0xfa, 0x1d, 0x02, 0x24, 0x5e, 0x1f, 0x2e, 0x48,
+ 0x51, 0x9c, 0x20, 0x80, 0x3c, 0x9e, 0x41, 0xf7, 0xa3, 0x90, 0x5e, 0xd4,
+ 0xba, 0xd1, 0xd1, 0x33, 0x03, 0x6c, 0xc8, 0x7c, 0xca, 0x64, 0xe2, 0xe2,
+ 0x2f, 0x62, 0xec, 0xa3, 0x2e, 0x7d, 0xe5, 0x58, 0x4b, 0xb6, 0xb0, 0xa1,
+ 0xea, 0xc9, 0x9d, 0x9e, 0x2e, 0xbc, 0x87, 0xd1, 0x6f, 0x5d, 0xb0, 0x6f,
+ 0xf6, 0x27, 0x9b, 0x99, 0x55, 0xf8, 0x99, 0x3e, 0x49, 0x23, 0x06, 0xc8,
+ 0xbb, 0x28, 0xbf, 0x7b, 0xd1, 0x37, 0xe1, 0x2f, 0x40, 0x09, 0xe7, 0xc4,
+ 0x5b, 0x1c, 0x6e, 0x41, 0x8a, 0xe9, 0x67, 0x3e, 0x25, 0xfb, 0xf0, 0x1e,
+ 0xc2, 0x07, 0x69, 0x4b, 0x80, 0x8d, 0xc1, 0x4e, 0xb0, 0x2d, 0xc0, 0x3c,
+ 0x74, 0xa5, 0x6d, 0x9b, 0x41, 0xc6, 0x85, 0x19, 0x95, 0x91, 0xa3, 0xf3,
+ 0xe6, 0x2f, 0x7d, 0xce, 0x3e, 0x49, 0x91, 0xd6, 0x4d, 0x62, 0x31, 0xee,
+ 0x8d, 0x4e, 0x34, 0x25, 0x76, 0x64, 0x29, 0xbf, 0x1a, 0xa6, 0xb5, 0x4b,
+ 0x81, 0xb1, 0xea, 0x3a, 0xb0, 0x57, 0x43, 0xd5, 0xbb, 0x63, 0x84, 0xf9,
+ 0x0a, 0x97, 0xda, 0x69, 0xbb, 0x95, 0x23, 0x8d, 0x26, 0x4f, 0x48, 0xf4,
+ 0x62, 0x36, 0xab, 0x32, 0x3d, 0x92, 0x6f, 0xc6, 0xe0, 0xa7, 0x60, 0x17,
+ 0x79, 0xd2, 0xcd, 0x3b, 0xb9, 0xce, 0x43, 0x13, 0xf1, 0xd8, 0x07, 0x3a,
+ 0xa2, 0x91, 0x40, 0xe2, 0x9c, 0xeb, 0x91, 0x1a, 0xf0, 0x04, 0xae, 0xad,
+ 0x9c, 0x34, 0x49, 0xfa, 0x9d, 0x5f, 0xc9, 0xc3, 0x64, 0xc0, 0xd0, 0x6b,
+ 0x80, 0xa7, 0x37, 0x39, 0x80, 0xe9, 0x90, 0xa3, 0x19, 0x12, 0xa0, 0x12,
+ 0x61, 0x15, 0x2a, 0x94, 0xd6, 0x44, 0x2c, 0x97, 0x82, 0x7d, 0x55, 0x23,
+ 0x3a, 0x77, 0xb5, 0x37, 0xe4, 0xc9, 0x10, 0x7d, 0xda, 0xe8, 0x85, 0x04,
+ 0xe2, 0x7a, 0x1e, 0xfa, 0x9d, 0x18, 0x82, 0xb5, 0xa7, 0x4e, 0x66, 0xeb,
+ 0x27, 0xc5, 0xd6, 0xfe, 0xa6, 0xd8, 0xa4, 0x3e, 0x53, 0x29, 0x1d, 0xe5,
+ 0x67, 0x41, 0x76, 0x0a, 0x1a, 0x9d, 0x44, 0xac, 0x35, 0x25, 0xfe, 0xeb,
+ 0xb3, 0x42, 0xc0, 0x72, 0x01, 0x2e, 0xce, 0x03, 0xf5, 0x2c, 0x9d, 0x7c,
+ 0x26, 0x3e, 0x32, 0xa2, 0x1f, 0xad, 0xb3, 0xbe, 0x67, 0x92, 0xba, 0xf2,
+ 0xef, 0x9f, 0x3b, 0x29, 0x68, 0x93, 0x3b, 0x24, 0x77, 0x4c, 0x71, 0xe0,
+ 0xc0, 0x3d, 0x81, 0xf6, 0x9c, 0x3f, 0x41, 0x7f, 0x60, 0x89, 0x3d, 0x85,
+ 0x14, 0x32, 0x8c, 0x86, 0x9f, 0x67, 0x19, 0x00, 0x38, 0x85, 0x07, 0xf7,
+ 0x6f, 0x37, 0x1e, 0xf1, 0xa4, 0xb2, 0xe7, 0x54, 0x34, 0xf9, 0x33, 0xa0,
+ 0x18, 0xe1, 0x89, 0xe8, 0x67, 0x04, 0x02, 0x45, 0xf6, 0x1e, 0x82, 0xd3,
+ 0x81, 0xeb, 0xb7, 0xb4, 0xb9, 0x25, 0xd0, 0x09, 0x86, 0xf2, 0xf2, 0x06,
+ 0x66, 0x37, 0x78, 0x15, 0x28, 0x66, 0x52, 0xae, 0xa8, 0xaa, 0x52, 0xb3,
+ 0x12, 0xb7, 0xc2, 0x4e, 0x8b, 0x79, 0xe4, 0x36, 0xb4, 0x8b, 0x78, 0x48,
+ 0xa0, 0xc0, 0x0b, 0xba, 0xc0, 0x20, 0xc7, 0x37, 0x4a, 0x85, 0xd3, 0x41,
+ 0x25, 0x26, 0xb8, 0x0d, 0x05, 0xac, 0xa7, 0x4e, 0x67, 0xda, 0x3b, 0xac,
+ 0x04, 0x9e, 0x95, 0xf6, 0xba, 0xa4, 0xf4, 0x1a, 0x6e, 0x6f, 0x92, 0xfb,
+ 0x11, 0x98, 0xb0, 0x07, 0x6b, 0x1f, 0x2e, 0x59, 0x37, 0x6d, 0x27, 0xa8,
+ 0xde, 0x3e, 0x6a, 0xf1, 0xe0, 0x6a, 0x9a, 0x98, 0x98, 0x3b, 0xed, 0x08,
+ 0x95, 0x28, 0xbc, 0xd2, 0xf0, 0x59, 0x1b, 0xbf, 0xd6, 0x52, 0x8f, 0xdb,
+ 0xa5, 0x26, 0xf3, 0x06, 0xc9, 0xdc, 0xbc, 0x3c, 0x42, 0x70, 0x3d, 0xb8,
+ 0x1a, 0x64, 0xff, 0xff, 0x4b, 0xd0, 0x98, 0x7f, 0x5d, 0xbf, 0x2d, 0x0c,
+ 0x43, 0x38, 0xa7, 0xf6, 0x56, 0x10, 0x0f, 0xd4, 0x05, 0xba, 0xde, 0x83,
+ 0x92, 0xbc, 0x49, 0xc1, 0x6b, 0xad, 0xda, 0xaf, 0xd6, 0x53, 0x46, 0x61,
+ 0xec, 0x94, 0xfd, 0x46, 0xe5, 0x13, 0x6c, 0xd4, 0x91, 0xe0, 0x6b, 0x08,
+ 0xc6, 0x04, 0x8e, 0xdc, 0x0a, 0x93, 0x2c, 0xe2, 0xb6, 0xec, 0x7d, 0x8a,
+ 0x65, 0x9e, 0xfc, 0x0e, 0xe0, 0xae, 0x9f, 0xa3, 0x3d, 0x37, 0x30, 0x56,
+ 0xd1, 0x59, 0xed, 0x5b, 0x8a, 0x1f, 0xc6, 0x9c, 0x5f, 0xf4, 0xcb, 0x91,
+ 0x8a, 0x20, 0x92, 0x0c, 0x1c, 0x0f, 0x63, 0x0c, 0xa5, 0x9e, 0x23, 0xca,
+ 0xdb, 0xab, 0xd0, 0x1f, 0xd7, 0x69, 0x40, 0xb2, 0xfe, 0x30, 0x75, 0x89,
+ 0xa0, 0x7c, 0x21, 0xcb, 0x28, 0x06, 0x39, 0x33, 0xd3, 0xb0, 0xd7, 0x91,
+ 0x41, 0x36, 0x16, 0xa1, 0x46, 0xcc, 0x70, 0x42, 0x06, 0x4d, 0x8c, 0xb8,
+ 0x8c, 0xfc, 0x74, 0x10, 0xd6, 0x04, 0x3e, 0xa9, 0xfd, 0x3c, 0x61, 0x25,
+ 0xdd, 0xe9, 0xe6, 0x26, 0xe9, 0x33, 0x86, 0x33, 0x65, 0x05, 0x13, 0xc7,
+ 0x23, 0x50, 0xbe, 0x0c, 0x9f, 0xea, 0x7f, 0x9e, 0x3a, 0x10, 0x0b, 0x58,
+ 0x26, 0x1a, 0xdc, 0x8d, 0xed, 0x74, 0x0d, 0xc9, 0xe8, 0xb0, 0x4c, 0x70,
+ 0x59, 0x15, 0x44, 0x50, 0x6a, 0xef, 0x9c, 0xe6, 0x26, 0x6c, 0x0f, 0x5c,
+ 0xad, 0x20, 0x19, 0x99, 0x7c, 0x74, 0xc7, 0xc7, 0x99, 0x23, 0x48, 0xf2,
+ 0x2c, 0xb8, 0x4a, 0xf0, 0x4e, 0x92, 0xdd, 0xc9, 0x46, 0xb6, 0xb2, 0xa2,
+ 0x1e, 0x25, 0x35, 0x89, 0x2d, 0x42, 0x35, 0x1d, 0xc8, 0x8b, 0x10, 0x88,
+ 0x55, 0xee, 0x89, 0x83, 0x70, 0x62, 0x75, 0x7b, 0xd2, 0x28, 0x5b, 0xb9,
+ 0x25, 0xe0, 0xb6, 0x5a, 0xc7, 0x79, 0x4d, 0xed, 0x1d, 0x20, 0xc4, 0x72,
+ 0xe5, 0x75, 0xf8, 0x6f, 0xe8, 0x8d, 0xa6, 0x9e, 0xa2, 0x55, 0xfb, 0xd2,
+ 0xf3, 0x74, 0x70, 0x2c, 0x94, 0x89, 0x91, 0xb2, 0x78, 0xc1, 0x20, 0x17,
+ 0x73, 0xe5, 0xca, 0xe5, 0xf1, 0x7a, 0x11, 0x94, 0x0f, 0xce, 0xb9, 0x3a,
+ 0x8b, 0xf4, 0xe7, 0xd1, 0x62, 0x05, 0xb0, 0x13, 0xdb, 0xef, 0x66, 0x5f,
+ 0x47, 0xc7, 0x26, 0x3a, 0x96, 0xf4, 0x93, 0xf4, 0x14, 0xb9, 0x04, 0x70,
+ 0x2a, 0xbe, 0xb2, 0xf8, 0xfc, 0x62, 0x13, 0x08, 0x00, 0x2e, 0xf4, 0x12,
+ 0xdf, 0x2a, 0xd8, 0xc9, 0x08, 0x7b, 0x05, 0xc8, 0x3c, 0xee, 0x17, 0x76,
+ 0xcb, 0xb8, 0xb6, 0x84, 0x78, 0x27, 0x8a, 0xbc, 0x82, 0x0c, 0x89, 0x1c,
+ 0x89, 0xaa, 0xba, 0x90, 0x8c, 0x58, 0xe9, 0xa8, 0xcd, 0x72, 0x6e, 0xbb,
+ 0x45, 0xe8, 0x5a, 0x74, 0xcd, 0x15, 0x5b, 0x9b, 0xac, 0x4b, 0x69, 0xb8,
+ 0x60, 0x95, 0xf1, 0x49, 0xf7, 0x4e, 0x62, 0x91, 0x28, 0x6c, 0x30, 0x99,
+ 0x4d, 0x8c, 0x99, 0x48, 0xd8, 0x63, 0xe4, 0x56, 0x47, 0xae, 0x3d, 0xa3,
+ 0x1f, 0xb1, 0xb4, 0xca, 0x35, 0x1d, 0x7a, 0x9f, 0x4a, 0xde, 0xe8, 0x39,
+ 0xdd, 0x98, 0x18, 0xd1, 0x54, 0xa8, 0xab, 0xcb, 0xa5, 0x55, 0xfa, 0x35,
+ 0x8a, 0x8b, 0x87, 0xf3, 0xed, 0xbc, 0xfa, 0x9f, 0x82, 0xe5, 0x34, 0x04,
+ 0x1a, 0x20, 0x4a, 0xb7, 0x2e, 0xb0, 0x70, 0xdd, 0xd1, 0x5f, 0xc8, 0x82,
+ 0xa3, 0xdc, 0xf0, 0x55, 0x7c, 0xac, 0xa4, 0x99, 0xbb, 0xbd, 0x5b, 0x7d,
+ 0x55, 0x5b, 0xe8, 0xaf, 0x7a, 0x45, 0x1b, 0x41, 0xc9, 0x53, 0xdd, 0x38,
+ 0x46, 0xb1, 0x3b, 0xf5, 0xf9, 0x5c, 0xd6, 0x44, 0xbd, 0x57, 0x46, 0x42,
+ 0x5a, 0x39, 0xac, 0xe1, 0xa6, 0x18, 0x67, 0xf3, 0x49, 0xd9, 0x0d, 0x03,
+ 0xdb, 0x47, 0xda, 0x1d, 0xfe, 0x73, 0x95, 0x60, 0xb0, 0xe9, 0x87, 0x06,
+ 0x11, 0x28, 0x15, 0x35, 0x0a, 0xb0, 0xee, 0x43, 0x48, 0x62, 0x47, 0xb7,
+ 0x28, 0xb5, 0x7d, 0x0e, 0xd8, 0x7c, 0xd6, 0x4e, 0x7b, 0x9d, 0x4e, 0x1f,
+ 0x1b, 0x1b, 0xc8, 0x7c, 0x82, 0x3d, 0x6a, 0x56, 0x19, 0x49, 0x46, 0xdd,
+ 0x17, 0x3f, 0x5e, 0x94, 0x42, 0x40, 0x9d, 0x4e, 0x07, 0x84, 0xcf, 0x32,
+ 0x70, 0xf5, 0xfb, 0xef, 0xed, 0xcf, 0x06, 0xc9, 0x72, 0x08, 0xc7, 0x58,
+ 0xb3, 0x85, 0xfc, 0x0f, 0xeb, 0x1e, 0x47, 0x36, 0xbf, 0xbe, 0x10, 0x22,
+ 0x88, 0xa6, 0x52, 0x3f, 0x19, 0x32, 0x91, 0x56, 0x9f, 0x64, 0x46, 0x16,
+ 0x4c, 0x2d, 0x59, 0xe0, 0x7c, 0x01, 0xa4, 0x6b, 0x5b, 0x7c, 0xcb, 0x21,
+ 0xef, 0xbc, 0xe2, 0xdc, 0x03, 0x67, 0x83, 0x8a, 0xa6, 0x5c, 0x4c, 0xb7,
+ 0x66, 0x99, 0x4f, 0xde, 0xbf, 0x0d, 0x30, 0x93, 0x3c, 0x09, 0x62, 0x19,
+ 0xf7, 0xc2, 0xf2, 0x34, 0xa6, 0x61, 0xd2, 0x2b, 0x71, 0x02, 0x41, 0x7c,
+ 0xe4, 0xe7, 0xdb, 0x34, 0xc9, 0x43, 0xf6, 0x96, 0x97, 0xc2, 0x30, 0x1d,
+ 0x4a, 0x51, 0x06, 0xe4, 0xc8, 0xa8, 0x2e, 0x8d, 0x26, 0x9e, 0xdf, 0x88,
+ 0x16, 0x9a, 0x9d, 0x50, 0xb3, 0xc4, 0x81, 0x78, 0xcd, 0x90, 0x2f, 0x47,
+ 0x2f, 0x0f, 0x4b, 0x0c, 0x20, 0x9a, 0x6d, 0x53, 0x45, 0x37, 0xaf, 0x6a,
+ 0x1d, 0x00, 0x86, 0x7d, 0x0f, 0xa0, 0xe5, 0xc7, 0x69, 0xe3, 0x46, 0xaf,
+ 0x39, 0x13, 0x74, 0x66, 0x29, 0x65, 0x97, 0xbb, 0x9d, 0x1f, 0xd5, 0x18,
+ 0xfc, 0x40, 0xe5, 0x45, 0x49, 0xe8, 0xe6, 0x15, 0x88, 0x66, 0x6c, 0x4e,
+ 0xda, 0xda, 0x63, 0x38, 0x4d, 0xc1, 0x7d, 0x7b, 0x59, 0xf9, 0xc7, 0xca,
+ 0x12, 0x64, 0x8e, 0x7d, 0x04, 0x56, 0x5c, 0x2a, 0x08, 0x47, 0xd1, 0x98,
+ 0x10, 0x55, 0x43, 0xf5, 0x4c, 0xd3, 0xad, 0x74, 0xa0, 0x58, 0x9e, 0xa2,
+ 0x68, 0x4e, 0xa8, 0x8b, 0x39, 0xd1, 0xa1, 0x97, 0x32, 0x88, 0x41, 0x09,
+ 0x35, 0xd8, 0x32, 0xfe, 0xb5, 0xea, 0x8f, 0xb7, 0x8e, 0xec, 0xb1, 0x7c,
+ 0xc0, 0x69, 0x9c, 0x86, 0x57, 0xb3, 0xb7, 0x99, 0xd6, 0xb2, 0xc1, 0x60,
+ 0x47, 0x2a, 0xf3, 0x4e, 0x3b, 0x16, 0x13, 0x6b, 0xca, 0x6c, 0x31, 0x75,
+ 0xd7, 0xaf, 0xa4, 0xc0, 0xb5, 0x45, 0x72, 0xff, 0x18, 0xa3, 0x8c, 0x32,
+ 0x82, 0xd8, 0x48, 0x5a, 0x5b, 0x1f, 0xdf, 0x1f, 0x02, 0xd3, 0x75, 0xeb,
+ 0x40, 0x37, 0x71, 0x86, 0x9a, 0xd2, 0x13, 0x45, 0x60, 0xea, 0x06, 0x04,
+ 0x3c, 0x6e, 0x87, 0x40, 0x5c, 0xcd, 0x78, 0xf3, 0x39, 0x22, 0xe5, 0x46,
+ 0xc0, 0x43, 0xb6, 0x04, 0xb1, 0xd2, 0xc0, 0x5d, 0x0b, 0x46, 0x19, 0x61,
+ 0xf1, 0x38, 0x24, 0xa4, 0xa7, 0xa6, 0x28, 0xf0, 0xfa, 0x87, 0x54, 0xee,
+ 0xbe, 0xa7, 0xa4, 0x33, 0xcc, 0x05, 0x9e, 0x8b, 0x7b, 0xcd, 0xa3, 0xf5,
+ 0xe2, 0xe1, 0x2c, 0x0b, 0x2a, 0x3c, 0xa6, 0x69, 0x9a, 0x5b, 0xfd, 0x7b,
+ 0x72, 0x54, 0x8f, 0x65, 0xa2, 0x7c, 0x7e, 0xc7, 0x14, 0x43, 0x4c, 0xfe,
+ 0xed, 0x3b, 0xb1, 0x4a, 0x7b, 0x58, 0xe4, 0xae, 0x8b, 0x9b, 0x76, 0x3a,
+ 0x8a, 0xfc, 0x4b, 0x08, 0xd5, 0x5a, 0x09, 0xcd, 0xfe, 0xf0, 0x72, 0xd8,
+ 0xbd, 0x4d, 0x37, 0xb7, 0x10, 0x12, 0x92, 0xa2, 0x98, 0x84, 0x97, 0x5a,
+ 0x02, 0x95, 0xbd, 0x7b, 0x65, 0x80, 0x84, 0xf5, 0x26, 0x2d, 0x3f, 0xa6,
+ 0x28, 0xb3, 0x74, 0xcf, 0x55, 0x4b, 0xf0, 0x89, 0xec, 0x8b, 0x0a, 0xc8,
+ 0x28, 0x51, 0x53, 0x26, 0xb9, 0xf7, 0xac, 0x3e, 0xc3, 0x47, 0x51, 0x73,
+ 0x1f, 0x02, 0x68, 0x71, 0x5d, 0x52, 0x2e, 0xc2, 0x0a, 0xfd, 0xe5, 0xe4,
+ 0xaa, 0x8c, 0x68, 0xb6, 0x22, 0xdc, 0xb9, 0x05, 0x27, 0xd5, 0xd2, 0x8f,
+ 0x49, 0xb2, 0xcd, 0xac, 0x99, 0x72, 0xa8, 0x28, 0xf0, 0x9b, 0xc4, 0x9d,
+ 0xc7, 0x1b, 0xbb, 0x5a, 0x64, 0x49, 0xbd, 0x20, 0x7b, 0xab, 0x6d, 0xe5,
+ 0xa4, 0x4d, 0xbc, 0x2f, 0x62, 0xba, 0xf3, 0xce, 0x08, 0xff, 0x6e, 0x30,
+ 0x92, 0xd5, 0x2e, 0x85, 0x43, 0x7a, 0x36, 0xb7, 0x21, 0xf5, 0x55, 0x5f,
+ 0xce, 0x5c, 0x2d, 0x8d, 0x9a, 0x1a, 0x3e, 0xf5, 0xaf, 0x95, 0x46, 0xe5,
+ 0x7c, 0xc9, 0x83, 0x2b, 0xf9, 0x04, 0x3c, 0x32, 0xcf, 0x72, 0xa8, 0x57,
+ 0x08, 0x48, 0xf6, 0xda, 0x23, 0x65, 0xcb, 0xe7, 0xf4, 0xa7, 0x25, 0x68,
+ 0xf5, 0x66, 0x60, 0x5f, 0x32, 0x09, 0xbd, 0x75, 0x05, 0xa3, 0x63, 0x79,
+ 0x8f, 0x0e, 0x55, 0x9f, 0x48, 0xd8, 0xbc, 0xe7, 0x6c, 0x47, 0xe2, 0x48,
+ 0x6f, 0xde, 0x00, 0xd5, 0xe1, 0x41, 0x28, 0x0b, 0xc7, 0xbf, 0x54, 0x7e,
+ 0x61, 0x65, 0xaf, 0x31, 0x12, 0xc3, 0x44, 0x00, 0x00, 0x00, 0x11, 0x3a,
+ 0x72, 0x71, 0x9c, 0xc0, 0xcf, 0xf1, 0x49, 0x53, 0xba, 0xbe, 0xe4, 0x01,
+ 0xbf, 0x08, 0xc4, 0x2e, 0x5b, 0xf8, 0xa8, 0xd6, 0xc2, 0x70, 0x62, 0x50,
+ 0xa7, 0xf1, 0xa3, 0xb6, 0x68, 0x95, 0x1e, 0x0a, 0x3c, 0xee, 0x47, 0x75,
+ 0xb0, 0x75, 0xd3, 0xaf, 0x4e, 0x40, 0xe0, 0x8b, 0x8b, 0xc9, 0xfc, 0x13,
+ 0xe3, 0xce, 0xe3, 0xbc, 0x27, 0xb7, 0x6c, 0x24, 0x97, 0x71, 0xc2, 0x80,
+ 0x7d, 0x87, 0x45, 0x5c, 0x85, 0x58, 0x16, 0xfd, 0x4f, 0x98, 0x14, 0x7f,
+ 0x57, 0x87, 0xf3, 0x72, 0xba, 0x22, 0x16, 0x13, 0xbb, 0x17, 0xa3, 0x16,
+ 0x5d, 0xeb, 0xc6, 0xdb, 0x2b, 0x39, 0x49, 0xbc, 0x19, 0x96, 0x6f, 0x86,
+ 0x4b, 0x5a, 0xc9, 0x76, 0xbf, 0xe6, 0xda, 0x55, 0x7d, 0xc2, 0x2a, 0x0b,
+ 0xa9, 0x4a, 0x77, 0x80, 0x72, 0x76, 0x51, 0xe7, 0x2b, 0x3d, 0x62, 0xab,
+ 0xd9, 0xe6, 0x4d, 0x3d, 0x1f, 0x6b, 0x9d, 0x36, 0xff, 0x24, 0xab, 0x5a,
+ 0x40, 0x01, 0x4f, 0x95, 0x40, 0x89, 0x8d, 0x8f, 0xad, 0xcf, 0x29, 0x73,
+ 0x08, 0x97, 0x5d, 0xff, 0x7d, 0x9c, 0x5c, 0xc6, 0x5b, 0x40, 0xc4, 0x20,
+ 0x70, 0x6f, 0x5c, 0x19, 0xe7, 0x64, 0x13, 0x40, 0xc9, 0xa9, 0x93, 0xd2,
+ 0x5a, 0xbe, 0x36, 0x0e, 0x0e, 0x96, 0x8c, 0x23, 0xa6, 0x1a, 0xb1, 0x0f,
+ 0x74, 0x78, 0xb4, 0x23, 0x6b, 0x27, 0x40, 0xfa, 0xff, 0x2e, 0x79, 0xaa,
+ 0x46, 0x9a, 0x4a, 0x76, 0x10, 0xfd, 0xe0, 0xc8, 0xbc, 0x13, 0x7e, 0xff,
+ 0x5a, 0x6d, 0x86, 0x3c, 0x7f, 0x51, 0xa2, 0x6a, 0x19, 0xa5, 0xda, 0x45,
+ 0xce, 0x1d, 0xd3, 0xbf, 0x8e, 0xaa, 0x74, 0x3b, 0x3d, 0x35, 0x88, 0xf7,
+ 0x3f, 0x45, 0x40, 0x17, 0xa4, 0x04, 0x28, 0xd2, 0x63, 0x2e, 0xdd, 0x93,
+ 0x4c, 0x4e, 0xac, 0x90, 0x35, 0x03, 0x98, 0x8f, 0x13, 0x87, 0xac, 0xc0,
+ 0x30, 0x18, 0x16, 0x09, 0x90, 0x01, 0x2b, 0x2e, 0x8c, 0x82, 0x03, 0xf6,
+ 0x54, 0xda, 0x95, 0x72, 0x46, 0xf6, 0xb3, 0x3f, 0x40, 0x0a, 0xc5, 0x91,
+ 0x92, 0x65, 0x3b, 0xc8, 0xa7, 0x52, 0xa0, 0x41, 0x5e, 0x17, 0xd3, 0x7b,
+ 0x8a, 0xf2, 0x0d, 0xb7, 0xac, 0x1e, 0x49, 0xfd, 0xd0, 0x62, 0x79, 0x6c,
+ 0xb5, 0x8d, 0xce, 0xd0, 0x52, 0x9b, 0x2b, 0x44, 0x14, 0x9e, 0x98, 0x12,
+ 0x34, 0xfa, 0xca, 0x8a, 0x7c, 0x83, 0x49, 0x0a, 0x0e, 0xd5, 0xcc, 0x0d,
+ 0xba, 0xa0, 0x28, 0x00, 0xb5, 0x76, 0xb3, 0x5c, 0x81, 0x42, 0xe7, 0xd8,
+ 0x29, 0xea, 0xca, 0x9f, 0x4a, 0x21, 0xc1, 0x54, 0x03, 0x30, 0xb0, 0x4b,
+ 0x7e, 0xc5, 0x6a, 0xa9, 0xa7, 0xdc, 0xa4, 0xa8, 0x7d, 0x43, 0x52, 0xf5,
+ 0xe1, 0x19, 0x1d, 0xa4, 0xee, 0xf9, 0x5f, 0x86, 0xab, 0x25, 0x7c, 0x62,
+ 0x65, 0xb5, 0x20, 0x6e, 0x68, 0x41, 0x67, 0xde, 0x50, 0x02, 0x11, 0x4d,
+ 0x79, 0x32, 0x8f, 0x2a, 0x9f, 0x2e, 0x90, 0x71, 0x84, 0xd0, 0x71, 0xbb,
+ 0xa6, 0xc0, 0xf0, 0x99, 0xf5, 0x8a, 0x02, 0x3d, 0xb9, 0x42, 0x8b, 0x1a,
+ 0x06, 0xb9, 0x78, 0x87, 0xf7, 0x78, 0xbe, 0xdf, 0x28, 0x7b, 0xd5, 0xc4,
+ 0x12, 0x26, 0xb2, 0x15, 0xbe, 0xac, 0x28, 0x58, 0x8c, 0xe9, 0x88, 0xab,
+ 0x0e, 0x8d, 0x54, 0x96, 0x8b, 0x87, 0xa8, 0xfd, 0x84, 0x03, 0xf9, 0xd4,
+ 0xea, 0xb8, 0x89, 0xe3, 0xaa, 0xa3, 0x27, 0x18, 0x3f, 0x9c, 0x28, 0x9e,
+ 0xa3, 0x96, 0x7c, 0xb0, 0x40, 0x34, 0xc5, 0x33, 0x05, 0x2d, 0xb7, 0xae,
+ 0x8f, 0xfe, 0xcd, 0x2c, 0x71, 0x20, 0xa7, 0x81, 0xfe, 0xdb, 0xd3, 0xd8,
+ 0x4f, 0xf0, 0xa3, 0x02, 0x72, 0x18, 0x69, 0x2d, 0x03, 0x51, 0x41, 0xc6,
+ 0xe7, 0x8c, 0x8d, 0x55, 0xee, 0x6e, 0xc5, 0x62, 0xa5, 0x87, 0xcd, 0xb7,
+ 0xc4, 0x4b, 0xc4, 0xbc, 0x19, 0x07, 0xad, 0xb8, 0x29, 0xec, 0x4f, 0xba,
+ 0x09, 0x23, 0x13, 0x0b, 0xc7, 0xd2, 0x94, 0x9e, 0xa3, 0x32, 0xf0, 0x49,
+ 0xfc, 0x93, 0x50, 0xf3, 0xd5, 0x8f, 0x0e, 0x21, 0x9b, 0x48, 0x80, 0x4d,
+ 0x39, 0xd9, 0xc5, 0x92, 0xa8, 0xc6, 0xc2, 0xc6, 0x4e, 0x5d, 0xc6, 0xe7,
+ 0xa3, 0x43, 0x00, 0xf2, 0x58, 0xa6, 0xb5, 0x60, 0x01, 0xe6, 0x99, 0x38,
+ 0xa5, 0xb7, 0xd6, 0xa7, 0x84, 0xb3, 0x1d, 0xc3, 0x8f, 0xba, 0xf9, 0x45,
+ 0xf1, 0x87, 0xf9, 0xc4, 0xd8, 0x40, 0x58, 0x42, 0xe2, 0xce, 0x58, 0xc5,
+ 0x4b, 0xcf, 0xc0, 0x0d, 0x48, 0x12, 0xb9, 0x56, 0xb4, 0x54, 0x08, 0x74,
+ 0xe4, 0x80, 0x0b, 0xd9, 0xc0, 0xe1, 0x2f, 0xbf, 0x09, 0x1a, 0x80, 0xc9,
+ 0xbd, 0xc9, 0x37, 0x2c, 0x8e, 0x3e, 0xc4, 0x1c, 0x76, 0x59, 0x99, 0x8a,
+ 0x30, 0x84, 0x37, 0x24, 0xde, 0x14, 0x0d, 0x35, 0x9d, 0x5b, 0x76, 0x56,
+ 0x14, 0x05, 0xba, 0x53, 0x77, 0xd5, 0x69, 0x39, 0x3e, 0x4e, 0x71, 0x83,
+ 0xb2, 0x27, 0xdb, 0x7b, 0x7b, 0xc6, 0xaa, 0x1e, 0xa7, 0xf4, 0xaa, 0x4a,
+ 0x24, 0x46, 0x82, 0xf3, 0x5f, 0x2a, 0xf8, 0xde, 0x32, 0xb0, 0x0c, 0x66,
+ 0x7b, 0xa7, 0xdf, 0x84, 0x6d, 0xff, 0x0c, 0x4f, 0x2a, 0x8a, 0x65, 0xe8,
+ 0x83, 0xae, 0x6a, 0x82, 0xdb, 0x22, 0x03, 0xde, 0xdc, 0x3f, 0x46, 0xd3,
+ 0xee, 0x8d, 0xe9, 0x0f, 0x1f, 0xe3, 0xd1, 0x97, 0xa2, 0x75, 0x95, 0x14,
+ 0x6f, 0x0d, 0x60, 0x9c, 0x10, 0x3f, 0x71, 0x8c, 0xed, 0x13, 0x38, 0x89,
+ 0xa6, 0xfc, 0x0b, 0x9f, 0x51, 0xcd, 0x94, 0xa5, 0xe8, 0xa9, 0x09, 0x3a,
+ 0x2b, 0x25, 0x80, 0x06, 0xe8, 0xaf, 0x91, 0x06, 0xc7, 0xfb, 0x23, 0x49,
+ 0x04, 0x7d, 0xb5, 0x0e, 0xdf, 0x93, 0xe1, 0x4c, 0x37, 0x81, 0x88, 0x0d,
+ 0x5f, 0x57, 0x8d, 0xc7, 0x76, 0x5e, 0x65, 0x5d, 0xe6, 0xa4, 0x89, 0x97,
+ 0x74, 0x8d, 0x5a, 0x22, 0x35, 0x85, 0xc9, 0x50, 0x67, 0xf5, 0x58, 0xd7,
+ 0x19, 0x66, 0x00, 0x2f, 0x84, 0x8e, 0xb2, 0x50, 0xee, 0x61, 0x8a, 0x77,
+ 0x1a, 0x65, 0x86, 0x4e, 0x68, 0xa4, 0x95, 0xa4, 0xb7, 0xc1, 0x1c, 0xc9,
+ 0x1a, 0x60, 0xf5, 0x90, 0x40, 0x20, 0x03, 0xe4, 0x06, 0x50, 0x0b, 0x98,
+ 0x6f, 0x5f, 0x97, 0xe4, 0xc3, 0x52, 0x71, 0xfc, 0x3e, 0xf4, 0x57, 0x6a,
+ 0xe4, 0x5b, 0xda, 0x24, 0xa0, 0x1a, 0x9c, 0xb5, 0x9d, 0x85, 0x9b, 0xf9,
+ 0x4f, 0x31, 0xd9, 0x16, 0x05, 0x89, 0xd2, 0x7a, 0xe5, 0xb2, 0xbe, 0x56,
+ 0xe8, 0x72, 0xb1, 0x6c, 0xe0, 0x1c, 0x5d, 0xcf, 0xc4, 0x61, 0xf7, 0xf7,
+ 0x9e, 0x80, 0xd5, 0x71, 0xe9, 0xb5, 0x19, 0x43, 0x53, 0xb9, 0x65, 0x91,
+ 0x4c, 0x7f, 0x26, 0x30, 0x96, 0x33, 0x74, 0xdf, 0xca, 0xdf, 0x24, 0x1c,
+ 0xc0, 0x63, 0xda, 0x37, 0x49, 0x68, 0x71, 0x68, 0x52, 0x66, 0x80, 0x5d,
+ 0x24, 0x35, 0x24, 0x8e, 0x21, 0x43, 0xa4, 0x99, 0x49, 0xf1, 0xec, 0xf2,
+ 0x18, 0xac, 0x39, 0x22, 0x3f, 0xb1, 0x07, 0x46, 0xbe, 0x71, 0x51, 0x2a,
+ 0x24, 0x8e, 0x0a, 0xa0, 0x72, 0xb0, 0x6a, 0xd0, 0x60, 0x1f, 0xb2, 0x70,
+ 0xa1, 0xdb, 0x3b, 0xf9, 0x22, 0x8a, 0xbc, 0xec, 0x6c, 0xb2, 0x67, 0x9f,
+ 0x44, 0xbc, 0x53, 0x2d, 0x84, 0x49, 0x52, 0x80, 0x20, 0x3c, 0xa0, 0x97,
+ 0x64, 0x50, 0x61, 0x57, 0x23, 0x5b, 0xab, 0xbc, 0xc7, 0x69, 0x27, 0xe9,
+ 0x89, 0x55, 0x81, 0x93, 0xd0, 0xda, 0x3d, 0x23, 0xfa, 0xa5, 0x68, 0xdf,
+ 0x8e, 0xf2, 0x50, 0xd6, 0x34, 0x8f, 0x47, 0xd9, 0x52, 0xed, 0xda, 0xb3,
+ 0x70, 0xea, 0xd0, 0xe4, 0xb6, 0x83, 0x8a, 0x36, 0xc2, 0xf8, 0x33, 0x2f,
+ 0x18, 0xb5, 0x03, 0x9e, 0xfc, 0x5b, 0xb5, 0x23, 0xcb, 0xe3, 0xf0, 0x4f,
+ 0xab, 0x15, 0x37, 0x13, 0xd4, 0x99, 0xcf, 0x34, 0xb4, 0xac, 0xc2, 0xb1,
+ 0x74, 0xde, 0xf3, 0xd9, 0xd2, 0x21, 0x27, 0x92, 0x22, 0x3a, 0xa9, 0x1a,
+ 0x12, 0x0e, 0x33, 0x68, 0x6b, 0x40, 0x04, 0x86, 0x58, 0x6d, 0x2d, 0xb6,
+ 0x73, 0xc1, 0x67, 0xe2, 0x8f, 0x90, 0x3f, 0x03, 0x71, 0xaa, 0xb8, 0x5a,
+ 0x31, 0x32, 0x96, 0x7e, 0xb2, 0x52, 0xea, 0x94, 0xcc, 0xfd, 0x0f, 0xe9,
+ 0xbf, 0x8d, 0xaf, 0x09, 0x94, 0xe3, 0x03, 0xaf, 0xf7, 0x96, 0xb3, 0xda,
+ 0x08, 0x20, 0x06, 0x74, 0x28, 0x48, 0x60, 0x76, 0x19, 0x87, 0x1c, 0xb7,
+ 0xd2, 0x16, 0xd4, 0x12, 0xcc, 0x93, 0x45, 0x03, 0x74, 0x1a, 0x53, 0xf9,
+ 0xa8, 0xf3, 0x73, 0x3e, 0xc2, 0x51, 0x3e, 0x15, 0x39, 0x1e, 0x6e, 0xf5,
+ 0x15, 0x47, 0x59, 0x9e, 0x84, 0xcf, 0xc1, 0xda, 0xb3, 0xfd, 0xec, 0x81,
+ 0x5a, 0x4e, 0xa6, 0x82, 0x85, 0x19, 0x87, 0xdd, 0x18, 0xb9, 0xf2, 0x88,
+ 0x7d, 0x59, 0x85, 0x23, 0xac, 0x7d, 0x4a, 0x67, 0x1b, 0x1e, 0x74, 0xb0,
+ 0x3d, 0x31, 0xc0, 0x64, 0x7f, 0x2f, 0xfe, 0xca, 0xa9, 0x87, 0xc9, 0x1b,
+ 0x25, 0xe7, 0xcf, 0xa6, 0xcb, 0xba, 0x55, 0x44, 0x86, 0xd0, 0x97, 0x63,
+ 0x3c, 0x4c, 0xdf, 0x6d, 0x20, 0x6f, 0x3e, 0x6c, 0x95, 0xc9, 0x08, 0xe6,
+ 0x2d, 0xe2, 0x40, 0x62, 0xd8, 0xe4, 0xcc, 0xb8, 0xa9, 0xf5, 0x09, 0xc2,
+ 0x4b, 0x8a, 0xc7, 0x82, 0xbc, 0x3b, 0x40, 0x8d, 0x80, 0x23, 0xfe, 0x37,
+ 0x54, 0x6d, 0xc6, 0x5c, 0x30, 0xb5, 0x4a, 0x0e, 0xe0, 0xf6, 0x6e, 0x53,
+ 0x4d, 0x0f, 0x33, 0x87, 0x44, 0x97, 0xf7, 0xbf, 0x56, 0x08, 0xbe, 0xdb,
+ 0x39, 0xd4, 0xf5, 0x50, 0x63, 0x42, 0xfd, 0xd0, 0xd3, 0xe7, 0xa4, 0xdd,
+ 0x30, 0xc8, 0x34, 0x21, 0x3a, 0xc3, 0xc6, 0x4b, 0xab, 0x89, 0x78, 0x79,
+ 0x4b, 0xb1, 0xc2, 0xf2, 0x33, 0x08, 0xd9, 0xf0, 0x25, 0x15, 0x10, 0xd4,
+ 0xc6, 0x69, 0xb2, 0x55, 0x5f, 0x7a, 0x7c, 0x36, 0xd3, 0x95, 0x80, 0x03,
+ 0x88, 0xa6, 0xb3, 0xf4, 0x57, 0x91, 0x07, 0x3f, 0x61, 0x02, 0x38, 0xe9,
+ 0x0c, 0x71, 0xc2, 0x84, 0x66, 0xd9, 0x49, 0xf3, 0x70, 0xd1, 0xaf, 0x6a,
+ 0xdb, 0x73, 0xa4, 0x2b, 0xb0, 0xb9, 0x77, 0xe0, 0xe8, 0x9b, 0xb6, 0xe0,
+ 0xb4, 0x38, 0x2d, 0x0a, 0x26, 0xad, 0xb6, 0x0b, 0x3e, 0x9c, 0x24, 0x57,
+ 0x60, 0x00, 0x63, 0x98, 0xcc, 0xe8, 0x61, 0x11, 0xcc, 0x0c, 0xfb, 0xd1,
+ 0x19, 0xb3, 0x39, 0x63, 0x7a, 0xfe, 0x93, 0x5c, 0x6b, 0x57, 0x1c, 0xc9,
+ 0xe2, 0xa7, 0xf0, 0x3e, 0xa7, 0x99, 0xb4, 0xa3, 0x32, 0xa7, 0x7f, 0x9d,
+ 0x75, 0x03, 0x03, 0x01, 0xd6, 0x7e, 0x09, 0x32, 0xdf, 0x74, 0xf1, 0xaa,
+ 0x53, 0xbc, 0xeb, 0xb1, 0xb9, 0xeb, 0xa7, 0xe0, 0x47, 0x15, 0xe9, 0x64,
+ 0xe1, 0x63, 0x3e, 0xc7, 0x0e, 0x12, 0x16, 0xa0, 0x2a, 0xa3, 0xd6, 0x35,
+ 0xad, 0x01, 0x6a, 0xdd, 0x74, 0xa4, 0xbc, 0xe6, 0xfd, 0x00, 0xa8, 0x6b,
+ 0xd9, 0x13, 0x7f, 0x8b, 0xbb, 0x7b, 0xb6, 0x1e, 0x20, 0xf0, 0x8c, 0x5f,
+ 0x8b, 0x5e, 0x41, 0xf9, 0x11, 0xb5, 0x4c, 0xae, 0xda, 0xa5, 0x1e, 0x12,
+ 0xe5, 0x96, 0xd6, 0x9a, 0xc6, 0xed, 0xaa, 0x12, 0x12, 0x4c, 0x84, 0x88,
+ 0x24, 0xcb, 0x49, 0xa5, 0x0d, 0x31, 0x64, 0xf0, 0xf6, 0x99, 0xea, 0xb9,
+ 0xbe, 0xcf, 0xdc, 0x88, 0x76, 0xc4, 0xce, 0x2b, 0x92, 0x42, 0xdd, 0xee,
+ 0x91, 0xf4, 0x4d, 0xe4, 0x15, 0xb5, 0x79, 0x60, 0xe7, 0x53, 0xe8, 0x2b,
+ 0x7f, 0xd9, 0xbb, 0xbb, 0xca, 0x06, 0xf5, 0x3c, 0x63, 0xf7, 0x83, 0xe3,
+ 0x03, 0xba, 0x55, 0xdf, 0x3b, 0x11, 0x3e, 0x53, 0x18, 0xc7, 0xc9, 0x34,
+ 0x12, 0x10, 0xbc, 0x9f, 0x78, 0x59, 0x27, 0x6b, 0x05, 0xec, 0x8d, 0xb3,
+ 0x70, 0x16, 0x64, 0x92, 0x90, 0x98, 0x8f, 0x0b, 0x2c, 0x2b, 0x2d, 0x23,
+ 0x4f, 0xd6, 0x21, 0x3f, 0xc5, 0xa0, 0x71, 0xb0, 0x8f, 0x0e, 0x39, 0x3a,
+ 0x0c, 0xc3, 0x13, 0x03, 0x61, 0xab, 0xb3, 0x97, 0x20, 0x60, 0x8a, 0x9f,
+ 0x54, 0xd1, 0x3b, 0x44, 0x7d, 0xf9, 0xa4, 0x88, 0x41, 0xe4, 0x03, 0x64,
+ 0xb2, 0xf1, 0x82, 0x17, 0xde, 0x5f, 0x34, 0xee, 0x20, 0x42, 0xf5, 0x2d,
+ 0x01, 0x02, 0x28, 0x41, 0xbe, 0x5b, 0x12, 0x1f, 0xff, 0x0b, 0xa4, 0x8c,
+ 0x5f, 0x8a, 0x40, 0x8d, 0x46, 0x3e, 0xf5, 0x83, 0x13, 0x19, 0xfb, 0x7b,
+ 0x20, 0xbb, 0x2b, 0x1b, 0x3e, 0x31, 0x9e, 0x33, 0x6d, 0x3c, 0xd6, 0x6a,
+ 0x08, 0x99, 0x9a, 0x01, 0xad, 0x5c, 0x41, 0x3d, 0xb9, 0xf1, 0x15, 0xd1,
+ 0x03, 0xdb, 0x10, 0x91, 0xda, 0x7f, 0x5e, 0x78, 0x93, 0x94, 0x3f, 0xac,
+ 0xc0, 0xc3, 0x8b, 0x87, 0xe3, 0xed, 0x90, 0xbe, 0xc1, 0xc6, 0x09, 0x49,
+ 0xb3, 0x6a, 0x52, 0xeb, 0xcf, 0x85, 0xa4, 0x8d, 0x41, 0x42, 0x76, 0x17,
+ 0x3d, 0x2c, 0x42, 0x3b, 0xd7, 0xd7, 0x3e, 0x7c, 0xe0, 0xd6, 0x12, 0x1f,
+ 0xbb, 0x87, 0xe7, 0xc5, 0x50, 0x75, 0xa8, 0xe2, 0xf3, 0x15, 0x41, 0x6f,
+ 0xc0, 0x47, 0xf7, 0xf5, 0x9f, 0xd0, 0x8b, 0x23, 0x0a, 0x9c, 0xbc, 0x1a,
+ 0x33, 0x20, 0x30, 0x8a, 0xd1, 0x07, 0x6c, 0x84, 0x19, 0xb2, 0xdb, 0x0e,
+ 0xde, 0x9f, 0x39, 0x18, 0x8a, 0x75, 0x0f, 0x3e, 0x24, 0xcb, 0x50, 0x6f,
+ 0x90, 0x8a, 0x64, 0x0e, 0x23, 0x6e, 0x41, 0x56, 0xf3, 0x0f, 0xa2, 0x4d,
+ 0x29, 0x31, 0x3e, 0xcc, 0x5f, 0xc4, 0xa8, 0x52, 0x7a, 0x54, 0x43, 0x25,
+ 0x0d, 0x05, 0x6f, 0xea, 0x45, 0x3b, 0x09, 0x25, 0xa1, 0x24, 0xcd, 0x29,
+ 0x54, 0x86, 0xd4, 0xfe, 0x94, 0xbe, 0xe6, 0x73, 0x6e, 0xc7, 0x13, 0x0d,
+ 0x43, 0x2f, 0x86, 0xf1, 0x4a, 0x13, 0x2b, 0x86, 0x51, 0x8b, 0xaf, 0x81,
+ 0x6d, 0x95, 0xb4, 0x1f, 0x0d, 0x30, 0x44, 0x66, 0x96, 0x7e, 0xd2, 0xa5,
+ 0x74, 0x38, 0x03, 0x56, 0x1f, 0x99, 0x2a, 0xfe, 0x99, 0xcb, 0xa8, 0x35,
+ 0xf3, 0x5f, 0x2c, 0x3a, 0x06, 0xb3, 0x5c, 0x83, 0x91, 0x0a, 0x6a, 0x05,
+ 0x50, 0x72, 0x83, 0xc7, 0x9f, 0xbb, 0xcf, 0x50, 0x3d, 0xc2, 0x2a, 0x34,
+ 0x42, 0xc7, 0xb9, 0x2d, 0xba, 0xf5, 0xa1, 0xe4, 0x39, 0x63, 0xe4, 0x35,
+ 0x9b, 0xaa, 0xc6, 0x7b, 0x8b, 0x14, 0x25, 0x95, 0xba, 0x76, 0xa4, 0x89,
+ 0x2e, 0xbb, 0x3c, 0xf1, 0x30, 0xe7, 0xe6, 0xe2, 0x62, 0x59, 0xc5, 0x1e,
+ 0x86, 0xf1, 0xe1, 0x77, 0xfb, 0x04, 0x82, 0x2f, 0xa7, 0xca, 0x99, 0x7c,
+ 0xbc, 0x5b, 0x2f, 0xa8, 0x51, 0xc1, 0x10, 0x07, 0x70, 0x42, 0x20, 0x3a,
+ 0xec, 0xae, 0x92, 0x9d, 0x76, 0x8e, 0xc0, 0xa6, 0xb8, 0x3d, 0xb7, 0x0b,
+ 0x93, 0x2d, 0x35, 0x09, 0x66, 0x47, 0xc6, 0x3e, 0x53, 0x31, 0x34, 0x4f,
+ 0xa3, 0x7b, 0x23, 0x1f, 0xc8, 0x0a, 0x1d, 0xa8, 0x8e, 0xb4, 0xc4, 0xb7,
+ 0x03, 0x59, 0xbf, 0x0d, 0x03, 0xd3, 0x33, 0xd1, 0x29, 0x46, 0xaf, 0xb5,
+ 0xa5, 0x48, 0x9a, 0xdb, 0xc5, 0x5a, 0x6c, 0x86, 0xca, 0x7d, 0xa6, 0x16,
+ 0x21, 0x1e, 0x26, 0xe2, 0x98, 0x6a, 0xdb, 0x0f, 0xf8, 0xa9, 0x10, 0x7e,
+ 0xcf, 0x35, 0x5a, 0x36, 0xd9, 0x0b, 0x24, 0xef, 0x4f, 0x34, 0x7e, 0x0f,
+ 0x5a, 0x18, 0xb0, 0xb7, 0x21, 0xfd, 0xeb, 0xa5, 0x18, 0x02, 0x86, 0xfc,
+ 0x3d, 0x80, 0x19, 0x4b, 0x2c, 0xf7, 0xed, 0x75, 0xd0, 0x8d, 0xd8, 0x21,
+ 0xd3, 0x5e, 0x59, 0x5e, 0x30, 0x61, 0xee, 0xad, 0xf8, 0xd8, 0xb2, 0x3a,
+ 0x46, 0x7a, 0x59, 0x3a, 0x24, 0x3c, 0xda, 0xd8, 0xac, 0x8a, 0xb4, 0x9c,
+ 0xd7, 0xe0, 0x24, 0x64, 0x0d, 0x79, 0xe5, 0xc1, 0x69, 0xcf, 0x89, 0x24,
+ 0xad, 0x0b, 0xcf, 0xed, 0xc3, 0xe2, 0x83, 0xe5, 0x16, 0x5d, 0x8f, 0x46,
+ 0xca, 0x8f, 0x46, 0x4d, 0x92, 0x55, 0xea, 0x65, 0x01, 0xa2, 0x53, 0xbd,
+ 0xc6, 0x7c, 0x79, 0x1d, 0x06, 0x6c, 0x19, 0x2d, 0x35, 0x6d, 0xad, 0x1b,
+ 0x87, 0xf9, 0xdc, 0xa3, 0x69, 0x39, 0xe9, 0x1d, 0x9f, 0xdd, 0xe3, 0x90,
+ 0x83, 0x45, 0xfa, 0xa6, 0xf3, 0x37, 0xb7, 0x87, 0x18, 0x5b, 0x7c, 0xdc,
+ 0xe2, 0x55, 0x4d, 0x4d, 0x3f, 0x13, 0xa9, 0x9f, 0xbe, 0x9f, 0xb2, 0x30,
+ 0x8a, 0x1f, 0xa9, 0xa0, 0xba, 0x9b, 0x57, 0x8f, 0x9b, 0xa4, 0x84, 0x07,
+ 0xd7, 0x0c, 0x09, 0x1f, 0x2d, 0x21, 0xd0, 0xab, 0x46, 0xa7, 0xd8, 0x27,
+ 0x61, 0x90, 0x6b, 0x60, 0x9d, 0x3f, 0x89, 0xdf, 0x15, 0x64, 0x0d, 0x2c,
+ 0xca, 0x99, 0x7e, 0xbd, 0xed, 0x0f, 0xf6, 0xd7, 0x4e, 0x5b, 0x4c, 0x7d,
+ 0x1f, 0xfb, 0xb1, 0x50, 0x36, 0x6d, 0x73, 0x15, 0x63, 0xca, 0xa3, 0xf0,
+ 0xc4, 0x73, 0x16, 0x5e, 0x62, 0xa4, 0xae, 0xcf, 0x0b, 0x87, 0x3e, 0x9a,
+ 0xb2, 0x72, 0xb3, 0x60, 0x98, 0x39, 0xc0, 0x0b, 0x33, 0x48, 0x5d, 0x88,
+ 0xeb, 0x55, 0x44, 0xad, 0xa2, 0x47, 0xe5, 0x29, 0x45, 0x38, 0xed, 0xe7,
+ 0x82, 0x4c, 0xa1, 0xb1, 0x61, 0x41, 0x57, 0xd3, 0xce, 0x65, 0x15, 0x2f,
+ 0x5c, 0x7b, 0xc3, 0x80, 0xe2, 0xcc, 0x7c, 0xaf, 0xe5, 0xb9, 0xdc, 0x09,
+ 0x70, 0x09, 0x26, 0xd6, 0x70, 0x4d, 0xab, 0x7a, 0xce, 0x39, 0x32, 0x3e,
+ 0xd4, 0x34, 0x0c, 0x64, 0x78, 0xe9, 0x8e, 0xb7, 0x56, 0x0d, 0xea, 0xda,
+ 0x01, 0x70, 0xe9, 0x8e, 0xc1, 0xbc, 0x71, 0xd8, 0xcd, 0x44, 0x6c, 0x95,
+ 0x07, 0x26, 0xf5, 0x2f, 0x07, 0x12, 0x9c, 0xf3, 0x8c, 0x54, 0x97, 0x38,
+ 0x65, 0x9a, 0xc7, 0x54, 0xfc, 0x5b, 0x29, 0x14, 0x54, 0xa1, 0xe2, 0xe2,
+ 0x98, 0x3b, 0xbd, 0x96, 0x2d, 0x1f, 0xa6, 0xa2, 0x5b, 0xf9, 0xdd, 0x71,
+ 0xea, 0x0d, 0xc2, 0x4d, 0x44, 0xe7, 0xfc, 0x8e, 0xde, 0xe2, 0x73, 0xad,
+ 0x72, 0x99, 0x41, 0x19, 0x18, 0xc5, 0xc4, 0x12, 0x41, 0xb6, 0x55, 0x53,
+ 0x7c, 0x8c, 0x96, 0xf9, 0xd0, 0xad, 0xf0, 0xe2, 0x0e, 0xfe, 0x55, 0x3e,
+ 0x07, 0xb9, 0x82, 0x6b, 0xdb, 0xd9, 0x3e, 0x1f, 0x04, 0xe8, 0xeb, 0xeb,
+ 0x58, 0x27, 0x0c, 0x55, 0x61, 0x04, 0xf0, 0x89, 0x9d, 0x68, 0x54, 0xbb,
+ 0xbe, 0x40, 0x6d, 0x2b, 0x15, 0xaa, 0xe6, 0x68, 0x56, 0xfd, 0xee, 0x49,
+ 0x25, 0xe4, 0xd7, 0x36, 0x2c, 0x61, 0x91, 0xd0, 0x55, 0xaa, 0xcb, 0xb2,
+ 0x8c, 0xbd, 0x3a, 0x7b, 0x33, 0x85, 0x7a, 0xd6, 0x5f, 0xfb, 0x50, 0xd4,
+ 0xcf, 0xbe, 0x09, 0xe5, 0xc2, 0x82, 0x56, 0xba, 0x92, 0x9f, 0x4c, 0xea,
+ 0x94, 0xee, 0x97, 0x8b, 0x4a, 0xc0, 0x8f, 0xe2, 0x23, 0x24, 0xde, 0x7e,
+ 0x9c, 0xde, 0x5d, 0xb1, 0xf0, 0x38, 0x68, 0xab, 0xc9, 0x69, 0x54, 0xb5,
+ 0xfd, 0xa0, 0x87, 0x06, 0x68, 0x25, 0xbe, 0x07, 0x65, 0xca, 0xa2, 0x73,
+ 0x84, 0x3b, 0x93, 0xce, 0x13, 0x23, 0x76, 0x44, 0x9a, 0x28, 0x5a, 0x2d,
+ 0x32, 0xc9, 0xef, 0xc2, 0xd6, 0x68, 0x6b, 0xbb, 0xac, 0x50, 0x76, 0x0e,
+ 0xdd, 0x0e, 0x78, 0x1f, 0x74, 0x54, 0x65, 0xe7, 0x32, 0x18, 0x90, 0x8a,
+ 0xd8, 0x3c, 0xd5, 0x90, 0x00, 0x78, 0xf6, 0xda, 0x1a, 0x3e, 0x63, 0xf0,
+ 0x0e, 0x54, 0x1b, 0x70, 0xac, 0xf5, 0x79, 0x9a, 0x40, 0x12, 0x14, 0x2c,
+ 0x0f, 0xa5, 0xef, 0x91, 0x77, 0x4e, 0xef, 0x5e, 0x61, 0xbc, 0x71, 0x73,
+ 0xe7, 0x8f, 0x22, 0x13, 0x46, 0x8e, 0x86, 0xed, 0xdf, 0xfc, 0x39, 0xb2,
+ 0x86, 0x67, 0x90, 0x51, 0x7e, 0x69, 0x90, 0x9e, 0xa1, 0x54, 0x73, 0xd1,
+ 0x66, 0x89, 0xca, 0xf5, 0x12, 0xd0, 0xf6, 0x5c, 0x08, 0x62, 0x76, 0x0d,
+ 0x83, 0xc3, 0xb9, 0x2b, 0x0c, 0x14, 0x8b, 0x02, 0xa8, 0x11, 0x3a, 0x58,
+ 0xe5, 0x8a, 0xe4, 0x42, 0xe0, 0x14, 0xc4, 0x66, 0xf2, 0x8f, 0xce, 0x03,
+ 0x9f, 0x9d, 0xc7, 0x26, 0x01, 0x3d, 0x09, 0x83, 0x56, 0xd6, 0x36, 0x20,
+ 0xf5, 0xe2, 0xa3, 0xf4, 0x0a, 0xc0, 0xec, 0x44, 0x7c, 0x42, 0xf0, 0x00,
+ 0x79, 0x38, 0x8f, 0x20, 0xd0, 0xaa, 0xaf, 0x37, 0xd2, 0xb3, 0x63, 0xd4,
+ 0xf3, 0x04, 0xc7, 0x28, 0x37, 0x9e, 0x5a, 0x9b, 0x1d, 0xd4, 0xb6, 0x59,
+ 0x4b, 0x9d, 0x03, 0x60, 0x5c, 0x77, 0x8a, 0xc9, 0xff, 0xb2, 0x82, 0x19,
+ 0x4f, 0x87, 0xc5, 0x64, 0x0b, 0xc2, 0x1e, 0x4a, 0x0c, 0x01, 0x8a, 0xe6,
+ 0xc8, 0x9a, 0x8e, 0xbd, 0xd7, 0x14, 0x19, 0x54, 0x11, 0x2c, 0x23, 0x15,
+ 0x19, 0x01, 0xe7, 0xe9, 0xf1, 0x18, 0x3b, 0x4e, 0xa5, 0x0b, 0xec, 0x6f,
+ 0xa0, 0xda, 0xc0, 0x54, 0x6f, 0xf9, 0x35, 0x6a, 0xf4, 0x9e, 0x98, 0xb4,
+ 0x58, 0x18, 0x24, 0x93, 0x68, 0xa8, 0xa9, 0xd1, 0x18, 0x0f, 0x8c, 0xc4,
+ 0xea, 0xed, 0x93, 0x18, 0xd6, 0xeb, 0xc8, 0xc5, 0xb5, 0x15, 0x5f, 0xf3,
+ 0x16, 0xa3, 0xb9, 0xc6, 0x30, 0x43, 0xee, 0x57, 0xfb, 0x2d, 0x80, 0x60,
+ 0xac, 0x57, 0x9f, 0xde, 0x03, 0xf4, 0x4c, 0xf0, 0x0b, 0x12, 0x1e, 0x91,
+ 0xa3, 0x14, 0xa1, 0xaf, 0x4c, 0x87, 0x24, 0x93, 0x4d, 0x83, 0x5a, 0x2c,
+ 0x00, 0xd8, 0x5d, 0x7c, 0xbe, 0x06, 0x43, 0x2c, 0xd7, 0xc4, 0xc8, 0x1a,
+ 0x80, 0x71, 0xb6, 0x52, 0x90, 0xed, 0x10, 0x19, 0xbf, 0xab, 0x93, 0x58,
+ 0x02, 0x7e, 0xcd, 0x66, 0x4b, 0x15, 0x17, 0xa7, 0xb4, 0x75, 0x85, 0x7e,
+ 0x7d, 0x64, 0x2b, 0x38, 0xd6, 0x7e, 0x2f, 0xea, 0x26, 0xb3, 0x09, 0x0a,
+ 0x19, 0xaf, 0x0c, 0x96, 0x7d, 0x5f, 0x9c, 0xec, 0x30, 0xd0, 0xaf, 0x94,
+ 0xb0, 0x38, 0x2f, 0xd9, 0x3c, 0xcc, 0x7d, 0x53, 0xf1, 0x1d, 0x71, 0x2e,
+ 0x41, 0x2b, 0x3b, 0x03, 0x34, 0xa2, 0x4d, 0x6c, 0x54, 0xc7, 0x58, 0x4e,
+ 0x00, 0x5d, 0x71, 0x1d, 0x0e, 0x39, 0xdb, 0xf9, 0x5f, 0xc6, 0xb6, 0x70,
+ 0xa1, 0x41, 0xab, 0xd1, 0x00, 0x45, 0xad, 0x51, 0x3b, 0x48, 0xbd, 0x39,
+ 0x50, 0xf2, 0x2d, 0x6d, 0x30, 0x11, 0x33, 0xb3, 0xb6, 0x31, 0x15, 0xce,
+ 0x3a, 0x3d, 0x32, 0xda, 0x11, 0x57, 0xf6, 0x68, 0x5f, 0xeb, 0xde, 0xf3,
+ 0xb3, 0x51, 0x6d, 0xb2, 0x76, 0xda, 0xc3, 0x04, 0x24, 0x9b, 0xd7, 0xd9,
+ 0x09, 0x99, 0x31, 0xbd, 0x16, 0x50, 0xf5, 0xea, 0x38, 0x4c, 0xdc, 0x4c,
+ 0x12, 0xea, 0xe5, 0x63, 0x78, 0xe2, 0x7f, 0x4f, 0x03, 0x20, 0x42, 0xfc,
+ 0xe7, 0x4b, 0x1e, 0x64, 0x1a, 0xed, 0x72, 0x94, 0xa6, 0xae, 0xab, 0x99,
+ 0xf4, 0x25, 0x87, 0xe2, 0x82, 0xe1, 0xe0, 0x16, 0xdc, 0x67, 0x4e, 0xb7,
+ 0x06, 0xe9, 0x33, 0x12, 0x90, 0x10, 0x0d, 0x92, 0xe9, 0x66, 0x34, 0xb3,
+ 0xbb, 0x50, 0x22, 0x39, 0x9a, 0x9c, 0x5c, 0xa2, 0x13, 0xb5, 0x89, 0xb7,
+ 0x8f, 0xc1, 0xc1, 0x1a, 0xc9, 0x12, 0x63, 0x2a, 0x86, 0xa6, 0x37, 0xf5,
+ 0x37, 0x23, 0x91, 0xee, 0x97, 0xb0, 0x43, 0xcb, 0x8c, 0xad, 0x73, 0x81,
+ 0xad, 0xa2, 0x40, 0x56, 0xfb, 0x1e, 0x1a, 0xf9, 0xd7, 0x5f, 0xf4, 0xcf,
+ 0x30, 0x8e, 0x6c, 0xba, 0x99, 0x00, 0x7b, 0x8c, 0x75, 0xb7, 0xa2, 0x94,
+ 0xbf, 0x7a, 0x31, 0x9a, 0xec, 0xe9, 0x8f, 0xf0, 0xde, 0xf0, 0x5a, 0x47,
+ 0xc4, 0x58, 0x16, 0xdb, 0x9a, 0x9d, 0x0d, 0x9d, 0x7b, 0x11, 0x51, 0x97,
+ 0xd7, 0xe5, 0xff, 0x32, 0x69, 0xb7, 0x11, 0xab, 0xaa, 0x00, 0xa8, 0x44,
+ 0xe4, 0xd5, 0xa6, 0x85, 0xb8, 0x83, 0xa1, 0x86, 0x3f, 0x09, 0x7e, 0xf8,
+ 0x7f, 0x2e, 0x4c, 0xa6, 0x60, 0x10, 0xe4, 0x50, 0xa4, 0xca, 0xfc, 0xab,
+ 0xcc, 0x1a, 0x3c, 0xec, 0x16, 0xe9, 0x72, 0x7a, 0xee, 0xbb, 0x3b, 0xc7,
+ 0x1a, 0xce, 0xe4, 0x45, 0x6a, 0x60, 0x9d, 0xe5, 0x30, 0x04, 0x18, 0x10,
+ 0x82, 0x2c, 0x57, 0xad, 0x44, 0x3e, 0x5e, 0x59, 0x44, 0x66, 0xdb, 0x24,
+ 0x18, 0xa3, 0x9f, 0xa0, 0x46, 0xdf, 0x5b, 0xe8, 0xc8, 0x18, 0x4e, 0xc1,
+ 0x71, 0x0b, 0x62, 0xcf, 0x9b, 0xd4, 0xc0, 0x64, 0x12, 0xa7, 0x60, 0xe1,
+ 0x31, 0x4b, 0x6c, 0xea, 0x78, 0x2b, 0x36, 0x18, 0xff, 0xe3, 0x57, 0x3b,
+ 0xff, 0x2e, 0x9d, 0xb1, 0xcb, 0x9e, 0x5a, 0x75, 0x51, 0x11, 0xc9, 0xa1,
+ 0xb2, 0x7a, 0x04, 0x1c, 0x5b, 0xf9, 0x4e, 0xf6, 0x17, 0x34, 0x66, 0x69,
+ 0x24, 0xbe, 0x5f, 0xf2, 0x7e, 0x13, 0xff, 0x01, 0x47, 0xe8, 0xd4, 0x96,
+ 0x40, 0x32, 0x79, 0x6b, 0xf2, 0xaf, 0x00, 0xcd, 0xd5, 0xff, 0xc8, 0x05,
+ 0x12, 0xa6, 0x1d, 0x18, 0xb1, 0x83, 0x70, 0x01, 0xc9, 0x26, 0x72, 0xe8,
+ 0x23, 0x9d, 0x4d, 0x85, 0xb8, 0xa0, 0x3e, 0x01, 0x30, 0x3c, 0xf4, 0xf8,
+ 0xc1, 0xc2, 0xda, 0xe9, 0x70, 0xf5, 0xed, 0xc5, 0x7a, 0xf5, 0x86, 0x46,
+ 0x06, 0x05, 0x07, 0x71, 0x17, 0x6c, 0x53, 0xe8, 0x77, 0x8c, 0xbf, 0x3b,
+ 0x77, 0x62, 0x6b, 0x99, 0x00, 0x63, 0xee, 0x76, 0x98, 0x97, 0x86, 0x58,
+ 0x9e, 0xd7, 0x7b, 0xb5, 0x32, 0x63, 0xaf, 0xd4, 0x55, 0x2f, 0xa2, 0xb8,
+ 0x86, 0xb4, 0x13, 0xef, 0x9c, 0x1b, 0xc2, 0x46, 0x4e, 0x9e, 0x1e, 0xcd,
+ 0x0d, 0xab, 0x92, 0x50, 0xd2, 0x04, 0x7b, 0x2a, 0xc3, 0x50, 0x36, 0x47,
+ 0x9c, 0xab, 0x32, 0xc4, 0x55, 0x57, 0xbe, 0x21, 0xba, 0x47, 0x62, 0xf5,
+ 0x03, 0x63, 0xa6, 0x55, 0x84, 0x63, 0x75, 0x54, 0xe1, 0x93, 0xd5, 0x9b,
+ 0x92, 0x35, 0x3c, 0x71, 0xe0, 0xae, 0x97, 0x65, 0x30, 0x0a, 0x5e, 0x2e,
+ 0x1b, 0x95, 0xb7, 0xf2, 0xe9, 0x0f, 0x80, 0xe6, 0x6c, 0x4b, 0x36, 0xe1,
+ 0x83, 0x21, 0xfc, 0x78, 0x83, 0xe0, 0x93, 0xff, 0x03, 0x27, 0x14, 0x38,
+ 0x42, 0x98, 0x28, 0x51, 0x4b, 0x69, 0x0d, 0xc3, 0xe1, 0x92, 0x4b, 0xf2,
+ 0x5b, 0xc0, 0x8e, 0xa9, 0xb9, 0x89, 0x93, 0xa3, 0x3b, 0x49, 0x96, 0x3c,
+ 0x34, 0x00, 0x05, 0x3d, 0x37, 0x2a, 0x8c, 0x47, 0x13, 0x54, 0x8e, 0xd7,
+ 0xa6, 0xda, 0xcc, 0x89, 0x57, 0xe7, 0x40, 0x73, 0xc6, 0xe4, 0xd2, 0xe2,
+ 0x91, 0x2c, 0xe3, 0xfc, 0x03, 0x4e, 0xf0, 0xb2, 0x84, 0x7c, 0xb9, 0x61,
+ 0x9b, 0x63, 0x8b, 0x5c, 0xfe, 0x40, 0xf9, 0xe6, 0x32, 0x4e, 0x54, 0xfb,
+ 0x8f, 0x11, 0x45, 0x83, 0x23, 0xf6, 0x84, 0xd9, 0x4f, 0x34, 0xff, 0x8c,
+ 0xb5, 0x40, 0x67, 0xa8, 0x09, 0x16, 0x0b, 0xea, 0x43, 0xbe, 0xc2, 0xbb,
+ 0x43, 0xb1, 0xdc, 0xe7, 0x5b, 0xf7, 0xdb, 0x32, 0xdd, 0x85, 0xb4, 0x74,
+ 0xd5, 0x35, 0x41, 0x86, 0x0d, 0x26, 0x1f, 0x81, 0x1b, 0x13, 0xb0, 0xea,
+ 0x76, 0x06, 0x54, 0x76, 0xee, 0x6e, 0x07, 0x69, 0xbd, 0x5e, 0x13, 0xd5,
+ 0x54, 0x0b, 0xc5, 0xfd, 0xc6, 0x50, 0x36, 0x63, 0x3f, 0x47, 0x25, 0x09,
+ 0x96, 0x38, 0x34, 0x85, 0x21, 0x1e, 0xd8, 0x4d, 0xf2, 0x90, 0xe1, 0x3c,
+ 0xca, 0x3c, 0x96, 0x1b, 0x6d, 0x37, 0x1e, 0x71, 0xaf, 0x72, 0xa3, 0xd5,
+ 0xf6, 0x7b, 0x56, 0x97, 0x56, 0x79, 0xda, 0xf9, 0x98, 0x4d, 0x92, 0x02,
+ 0x15, 0x54, 0xbc, 0x06, 0xf9, 0x32, 0x64, 0x1c, 0x49, 0x44, 0x45, 0xe7,
+ 0x40, 0x13, 0xd2, 0xe1, 0x99, 0xcc, 0x58, 0x0b, 0xda, 0x21, 0x2e, 0x99,
+ 0x26, 0xc6, 0x5d, 0x40, 0xf3, 0xaf, 0x1a, 0x5a, 0x70, 0x7d, 0x79, 0x7d,
+ 0x47, 0x1f, 0x74, 0xc9, 0x1a, 0xe8, 0x18, 0x01, 0x46, 0x7a, 0x25, 0xdf,
+ 0xd1, 0xf6, 0xf5, 0x1b, 0x62, 0x8c, 0xf9, 0x85, 0xc1, 0xc9, 0x73, 0x94,
+ 0xfd, 0x52, 0xd3, 0x2a, 0xb0, 0x0f, 0xf7, 0x32, 0xc6, 0xc1, 0xc6, 0xce,
+ 0xea, 0xdd, 0x4d, 0x53, 0x86, 0x8c, 0x84, 0x8e, 0xd8, 0x03, 0xe7, 0x7f,
+ 0xfe, 0x62, 0x96, 0x20, 0xd7, 0xb2, 0xd3, 0x71, 0xc2, 0xac, 0xd6, 0x96,
+ 0x3b, 0x52, 0x34, 0x8d, 0x5f, 0xf4, 0xc9, 0xa4, 0x68, 0xdd, 0xd9, 0x54,
+ 0x06, 0x18, 0xd2, 0x98, 0x49, 0xc5, 0x5a, 0xd7, 0x6b, 0xfc, 0x43, 0x7a,
+ 0x44, 0x01, 0x45, 0x11, 0x4d, 0x44, 0x1a, 0x42, 0xcd, 0xf1, 0x8d, 0xae,
+ 0xaf, 0x91, 0x0a, 0xb3, 0xae, 0x07, 0xb6, 0xef, 0x74, 0x44, 0x9a, 0xbc,
+ 0x7b, 0x57, 0x4c, 0x70, 0x69, 0x65, 0xac, 0x88, 0x9d, 0x8c, 0x05, 0x22,
+ 0xe3, 0xdd, 0x5c, 0x46, 0xd3, 0x86, 0xd7, 0x42, 0x85, 0x9c, 0x76, 0x8e,
+ 0x96, 0x06, 0x18, 0x19, 0xbc, 0xb3, 0x2b, 0x7d, 0x92, 0x52, 0x6f, 0x07,
+ 0xbe, 0x7a, 0x49, 0xe3, 0x3a, 0xf9, 0x4f, 0x02, 0x9c, 0xd1, 0x54, 0x75,
+ 0xf0, 0xca, 0x03, 0x89, 0xc9, 0x3d, 0xba, 0x83, 0xc2, 0xf4, 0x77, 0xad,
+ 0x02, 0x1a, 0x7e, 0xcc, 0xa7, 0xba, 0x39, 0xbe, 0x32, 0x36, 0x75, 0x99,
+ 0x43, 0xa9, 0xf6, 0x63, 0xdd, 0xe9, 0xc3, 0x58, 0x10, 0x1e, 0xec, 0xd6,
+ 0x1d, 0x2d, 0x34, 0x71, 0x12, 0xec, 0x4c, 0xf2, 0xe8, 0x97, 0x72, 0x3f,
+ 0xc9, 0xa9, 0xb4, 0x3b, 0x57, 0x3a, 0xa4, 0xb3, 0xc0, 0x47, 0xc0, 0x7e,
+ 0x7a, 0xce, 0x19, 0x4b, 0x03, 0x22, 0xed, 0xc8, 0x7f, 0xd4, 0xc7, 0xe1,
+ 0x2a, 0x26, 0x15, 0xf8, 0x76, 0x69, 0xbe, 0xd6, 0x18, 0x28, 0x10, 0x68,
+ 0x51, 0xfb, 0x5d, 0x1b, 0x03, 0x63, 0xb8, 0x33, 0xb1, 0x90, 0x1f, 0x69,
+ 0x94, 0x51, 0xfb, 0x20, 0x5a, 0xa4, 0x3c, 0xee, 0x22, 0x2f, 0x83, 0x4f,
+ 0x5d, 0x26, 0x5f, 0x5e, 0xc7, 0x15, 0x3b, 0x90, 0x62, 0x0d, 0x48, 0x47,
+ 0x31, 0x18, 0x9c, 0xd3, 0xea, 0x46, 0x22, 0xbb, 0x4e, 0x44, 0xb1, 0x89,
+ 0xf0, 0x53, 0xdf, 0x63, 0x3d, 0x33, 0x2c, 0xca, 0xee, 0xfa, 0x55, 0x7c,
+ 0x3b, 0x9f, 0xaa, 0xdd, 0x68, 0xe5, 0x25, 0x46, 0x9d, 0xde, 0x49, 0x44,
+ 0x78, 0x4e, 0x0e, 0x9e, 0xba, 0x3b, 0xc4, 0x3d, 0xfb, 0x9c, 0x51, 0x05,
+ 0x06, 0x59, 0x20, 0xca, 0xda, 0x70, 0xb3, 0xa5, 0x91, 0xf5, 0x6d, 0xf8,
+ 0x42, 0x93, 0x9e, 0x39, 0x9a, 0xd1, 0x87, 0x49, 0xc8, 0x70, 0xf1, 0xc9,
+ 0x75, 0x2c, 0xf8, 0xdf, 0x15, 0x5d, 0x65, 0x92, 0x97, 0x2f, 0x77, 0x52,
+ 0x20, 0x9b, 0xec, 0xdb, 0xfb, 0x7b, 0xfc, 0x0e, 0x4c, 0x3d, 0xeb, 0x97,
+ 0xa3, 0x8e, 0x15, 0x78, 0xeb, 0x28, 0xde, 0xf0, 0xfd, 0x85, 0x09, 0x1b,
+ 0x60, 0x12, 0x98, 0xb0, 0x54, 0xc0, 0xdb, 0xcb, 0x84, 0x9b, 0xbe, 0x8f,
+ 0x61, 0x6e, 0xf1, 0x2c, 0xf5, 0xfa, 0x5e, 0x06, 0x42, 0xf7, 0xf3, 0xf4,
+ 0x9d, 0x05, 0xc2, 0x3f, 0xf7, 0x77, 0x26, 0xae, 0x49, 0xd4, 0x9e, 0x84,
+ 0x87, 0x01, 0xf4, 0xa0, 0x5c, 0x79, 0x44, 0x3d, 0xa9, 0xe4, 0xdf, 0x80,
+ 0xff, 0x8e, 0x6e, 0x0b, 0xba, 0xff, 0xc7, 0x8d, 0xee, 0x1a, 0x72, 0x87,
+ 0x07, 0xd2, 0xc4, 0x6b, 0xf9, 0x03, 0x0f, 0x04, 0x22, 0xe4, 0xeb, 0x8e,
+ 0xea, 0xfd, 0xbb, 0x91, 0x43, 0xa1, 0xeb, 0xda, 0x50, 0x3b, 0xbc, 0xda,
+ 0xf5, 0x25, 0xbb, 0x49, 0xda, 0xaa, 0x1c, 0x4b, 0x0b, 0xb7, 0x1c, 0xa3,
+ 0x4e, 0x5e, 0x72, 0x8e, 0xf1, 0x67, 0x5b, 0x4e, 0x34, 0x7f, 0x03, 0x1f,
+ 0x33, 0x59, 0x43, 0x45, 0x31, 0x50, 0x01, 0x46, 0xfd, 0x35, 0x04, 0x76,
+ 0x1e, 0x94, 0xfe, 0xf5, 0x27, 0xc7, 0x7d, 0xba, 0x54, 0x32, 0x27, 0x32,
+ 0xf1, 0x6f, 0xde, 0x53, 0xfd, 0x6a, 0x41, 0x6b, 0xa6, 0x25, 0xe8, 0xf8,
+ 0x9e, 0xba, 0xca, 0xd8, 0x68, 0xad, 0xde, 0xaf, 0xc1, 0xae, 0x3f, 0xa7,
+ 0xfa, 0x7f, 0xf2, 0xee, 0x5f, 0x4d, 0x69, 0x04, 0x1e, 0x15, 0xa7, 0xd6,
+ 0x5c, 0xcb, 0xf9, 0x34, 0xcf, 0x62, 0x39, 0xf0, 0xd3, 0x25, 0x83, 0x8d,
+ 0xad, 0x44, 0xaa, 0xd1, 0x6a, 0xd8, 0xbe, 0x81, 0xdc, 0x96, 0xa0, 0x39,
+ 0xf5, 0xe1, 0x50, 0x75, 0xef, 0x0c, 0x25, 0xc6, 0x24, 0x72, 0x1b, 0x25,
+ 0x4b, 0xb7, 0xc7, 0xab, 0xf4, 0xaf, 0x9c, 0xca, 0x2f, 0x3b, 0xbb, 0x9a,
+ 0xb9, 0xb1, 0xaf, 0x0b, 0xf6, 0xfa, 0xd5, 0x6e, 0x66, 0xf2, 0x92, 0xc4,
+ 0x38, 0xfa, 0x4a, 0x9a, 0x2d, 0xab, 0xf6, 0x14, 0x55, 0x3c, 0x7f, 0x7e,
+ 0xd7, 0xcb, 0x3b, 0xa5, 0xbe, 0x54, 0x1a, 0xa7, 0xac, 0xc2, 0x66, 0xa6,
+ 0xa5, 0xa9, 0x65, 0xdb, 0x98, 0x2a, 0x57, 0x66, 0x84, 0xae, 0x6f, 0x59,
+ 0xa8, 0xd4, 0x44, 0x0d, 0xcd, 0xbd, 0x2d, 0xb0, 0x60, 0x4b, 0x89, 0x1d,
+ 0xbe, 0x79, 0x15, 0x9f, 0xad, 0xde, 0xf1, 0x27, 0xe3, 0x42, 0x06, 0x12,
+ 0x37, 0x08, 0xd6, 0xca, 0xc6, 0xf3, 0x4f, 0xbc, 0xd4, 0x93, 0x51, 0xa8,
+ 0x97, 0x27, 0xc1, 0x12, 0x25, 0x7a, 0xb7, 0xb1, 0xb2, 0x03, 0x67, 0x21,
+ 0x3d, 0xf5, 0xd4, 0x37, 0x2e, 0xb5, 0x53, 0xc8, 0x6c, 0x5a, 0x0b, 0x2f,
+ 0xcc, 0xb7, 0xa1, 0x63, 0x17, 0x8c, 0x41, 0xb0, 0x8f, 0xd1, 0x39, 0x5e,
+ 0xba, 0x1d, 0xc5, 0x1b, 0xa0, 0x0e, 0xd0, 0xe6, 0x5a, 0xc2, 0xb0, 0x66,
+ 0x50, 0xfd, 0x2e, 0x99, 0x89, 0xcf, 0x57, 0x54, 0x81, 0xb4, 0x50, 0x44,
+ 0x46, 0x57, 0x87, 0x00, 0x82, 0xcc, 0x8a, 0xd5, 0xf8, 0x23, 0x07, 0xae,
+ 0x63, 0x6b, 0xec, 0xe2, 0x77, 0x9e, 0x79, 0xa5, 0xc5, 0x53, 0x33, 0xa1,
+ 0x29, 0x50, 0x57, 0x3c, 0xed, 0x95, 0x6a, 0xb3, 0x5f, 0xf5, 0x0a, 0xc5,
+ 0x80, 0x5d, 0x9f, 0x3a, 0xfe, 0x26, 0x79, 0xe7, 0xc1, 0x46, 0x6b, 0x38,
+ 0x58, 0xd1, 0x02, 0x7d, 0x5c, 0x60, 0xfb, 0xb8, 0xb7, 0x01, 0xc4, 0x58,
+ 0x3b, 0xd8, 0x33, 0xe5, 0xcf, 0x2c, 0xf2, 0x5b, 0xa1, 0x70, 0xc7, 0xde,
+ 0xac, 0x97, 0x5a, 0x6d, 0xf1, 0xb8, 0x0a, 0x1c, 0x81, 0xfe, 0x7e, 0x7f,
+ 0x24, 0x78, 0x49, 0xb9, 0xe4, 0x00, 0x7a, 0xe7, 0x9c, 0xfa, 0x88, 0x4e,
+ 0x73, 0x0b, 0x38, 0x0b, 0x0e, 0x87, 0x40, 0xe1, 0x86, 0x86, 0x44, 0x70,
+ 0x02, 0x48, 0xc3, 0x10, 0xc0, 0xe2, 0xad, 0xd8, 0x60, 0x64, 0xc6, 0x56,
+ 0xf2, 0x23, 0xb2, 0x99, 0xe3, 0xb5, 0xef, 0x24, 0x84, 0x20, 0x39, 0x2b,
+ 0xcc, 0x12, 0x1a, 0x7b, 0x30, 0xd2, 0xed, 0x2c, 0x23, 0xb2, 0x84, 0x5a,
+ 0xff, 0x4a, 0x6f, 0x9f, 0xfa, 0xcd, 0x34, 0xcc, 0x09, 0x1b, 0xdc, 0x2e,
+ 0x9a, 0x13, 0x7d, 0x4d, 0x87, 0x09, 0x37, 0x72, 0x82, 0x21, 0x09, 0xcf,
+ 0xce, 0xa8, 0x3b, 0x3b, 0x62, 0x67, 0xc5, 0x24, 0x2a, 0x6a, 0x70, 0xad,
+ 0x99, 0x56, 0xaa, 0x8e, 0xde, 0x9b, 0x56, 0xd1, 0x5c, 0xab, 0x4b, 0x13,
+ 0x9c, 0x6b, 0xea, 0xb3, 0xf0, 0x39, 0xd9, 0x4f, 0xc0, 0x45, 0xf2, 0xe0,
+ 0x52, 0x07, 0x11, 0x14, 0xb0, 0x0a, 0x81, 0x29, 0x16, 0x8a, 0x74, 0x79,
+ 0x1c, 0x3d, 0xfd, 0xfe, 0x42, 0x81, 0x98, 0x48, 0x91, 0x89, 0xb0, 0xc5,
+ 0x83, 0x6b, 0xe9, 0xa0, 0x09, 0x9e, 0x01, 0x27, 0xdf, 0x2f, 0x82, 0x28,
+ 0x40, 0xef, 0xcb, 0x49, 0xac, 0xa3, 0x87, 0x59, 0x3a, 0x34, 0x2c, 0x48,
+ 0x0f, 0x28, 0x9d, 0x44, 0x89, 0xde, 0xbb, 0x25, 0x8c, 0x72, 0x88, 0x5b,
+ 0x03, 0x2c, 0x39, 0x3f, 0xa3, 0xf7, 0xb3, 0x4d, 0xd7, 0x25, 0x69, 0xb0,
+ 0x99, 0x0c, 0x02, 0x09, 0xd4, 0x1d, 0xc1, 0xb4, 0x3a, 0x6d, 0x18, 0x69,
+ 0x18, 0xe7, 0x11, 0xc4, 0xc6, 0x53, 0xb3, 0x0d, 0xd2, 0xb9, 0x1f, 0x20,
+ 0x8c, 0x3f, 0xd5, 0xab, 0xfe, 0x14, 0x65, 0xc6, 0x79, 0x15, 0xc6, 0x38,
+ 0xec, 0xca, 0x2a, 0xb3, 0x47, 0x0a, 0xf7, 0x64, 0x6a, 0xd0, 0xe1, 0x27,
+ 0xcd, 0x36, 0x2e, 0xab, 0x96, 0xed, 0xf4, 0x99, 0x4b, 0x16, 0x93, 0x5e,
+ 0x31, 0x9b, 0x48, 0xf0, 0x70, 0xa6, 0x80, 0xff, 0xa0, 0xab, 0x8f, 0xe7,
+ 0xcb, 0x52, 0x04, 0xcd, 0xf5, 0x81, 0xa8, 0x97, 0xb0, 0xfa, 0xb4, 0x20,
+ 0x9e, 0x5f, 0xdd, 0x95, 0x2b, 0x6a, 0x35, 0x45, 0x3c, 0xfa, 0xa0, 0xd6,
+ 0x56, 0xc5, 0xf6, 0x65, 0xaf, 0x66, 0xb6, 0x56, 0xbc, 0x3b, 0x5d, 0x6b,
+ 0x5a, 0x5f, 0x19, 0x41, 0xf4, 0x6f, 0x9f, 0xbe, 0x75, 0x42, 0xa2, 0x2c,
+ 0x7a, 0x06, 0x4c, 0xdb, 0x43, 0x2d, 0x8a, 0x07, 0xc2, 0x7c, 0x6e, 0x6f,
+ 0x74, 0x2e, 0x83, 0xaa, 0xe4, 0x94, 0xfe, 0xba, 0x25, 0x2b, 0xc7, 0xbb,
+ 0xb3, 0xad, 0x88, 0x65, 0xaf, 0x1c, 0xb3, 0xc6, 0x12, 0x1a, 0x3c, 0x69,
+ 0xa6, 0x37, 0xfd, 0xf2, 0x5f, 0x77, 0x2b, 0xbb, 0xe6, 0x28, 0x66, 0xd0,
+ 0xcf, 0x2d, 0x9a, 0x36, 0x59, 0xa2, 0xb0, 0x99, 0x82, 0xf4, 0x09, 0x62,
+ 0x29, 0x95, 0x1a, 0xa7, 0x03, 0xa6, 0x6f, 0x7b, 0xfa, 0x7f, 0x23, 0xb7,
+ 0xaa, 0x78, 0xb8, 0x84, 0xe0, 0x6f, 0xff, 0xd1, 0x38, 0x63, 0x29, 0xd5,
+ 0x0f, 0x56, 0x1c, 0x49, 0xef, 0x56, 0xe3, 0x03, 0x7a, 0x90, 0x2b, 0x11,
+ 0xbe, 0xb9, 0x57, 0x16, 0xa2, 0xab, 0xc2, 0xb7, 0x89, 0x28, 0xa3, 0xd1,
+ 0x06, 0x54, 0xde, 0xac, 0xc1, 0xe5, 0x7d, 0x07, 0xad, 0xc3, 0x11, 0x61,
+ 0xd9, 0x45, 0xe8, 0x55, 0xb4, 0x0a, 0xf5, 0x1a, 0x77, 0xbd, 0x4a, 0x4c,
+ 0x28, 0xd0, 0x10, 0x42, 0xb8, 0x33, 0x0f, 0x5c, 0x87, 0xa5, 0xc5, 0x7d,
+ 0x86, 0xcf, 0x54, 0x45, 0x89, 0xf9, 0x4e, 0xb6, 0xcf, 0xe3, 0x57, 0xbb,
+ 0x47, 0x93, 0xd3, 0x3d, 0x2f, 0x29, 0x27, 0x99, 0x47, 0x22, 0x90, 0x5b,
+ 0xa6, 0xae, 0x50, 0x84, 0xac, 0x60, 0x5c, 0x59, 0x27, 0x3d, 0xe8, 0xfa,
+ 0x3c, 0x0c, 0x37, 0xef, 0xa3, 0x7f, 0x06, 0xd4, 0x68, 0x28, 0x81, 0xa2,
+ 0x5c, 0x35, 0x85, 0x0c, 0xb2, 0x89, 0x3d, 0xfd, 0x0e, 0x07, 0x29, 0x3d,
+ 0x2d, 0xa5, 0x20, 0x3e, 0xa0, 0x79, 0x1a, 0xb3, 0x56, 0x84, 0xab, 0x43,
+ 0x24, 0x9c, 0x4e, 0x11, 0xac, 0xe5, 0xec, 0xd4, 0xf3, 0x47, 0x96, 0x96,
+ 0x8d, 0x8e, 0x41, 0x62, 0x38, 0xf1, 0xaf, 0x8a, 0x1f, 0xb6, 0xec, 0x1c,
+ 0x56, 0xc4, 0x87, 0xc7, 0x1f, 0x7d, 0x1c, 0xd8, 0xaf, 0x96, 0xe2, 0xf9,
+ 0xb6, 0x2d, 0xb2, 0x7c, 0xe8, 0xeb, 0xf7, 0x13, 0x64, 0x7b, 0x22, 0x49,
+ 0xfe, 0x81, 0xeb, 0x67, 0x11, 0x2d, 0x73, 0x5d, 0xaa, 0x80, 0x82, 0x07,
+ 0x0a, 0x0f, 0x3d, 0x5a, 0x80, 0xdb, 0x59, 0xad, 0x56, 0x1f, 0x6a, 0xa6,
+ 0xad, 0xb9, 0x63, 0x87, 0xc6, 0x3d, 0xc6, 0xc1, 0x28, 0x21, 0xf7, 0xc2,
+ 0x78, 0xc3, 0xe2, 0x7c, 0x47, 0xba, 0x20, 0xab, 0x05, 0xbf, 0xf8, 0xa1,
+ 0xc3, 0x51, 0x30, 0xa3, 0x05, 0x4c, 0xd9, 0x43, 0x7a, 0xf9, 0xd0, 0x9f,
+ 0x14, 0x95, 0x12, 0xf6, 0xce, 0xfe, 0x92, 0x83, 0x09, 0x86, 0xb4, 0x67,
+ 0xd2, 0xe9, 0x02, 0x34, 0x5b, 0xf7, 0x79, 0x46, 0x7a, 0xab, 0x02, 0xcf,
+ 0x40, 0x0f, 0x7e, 0x7e, 0x46, 0x6f, 0x94, 0xce, 0x79, 0x70, 0x03, 0xcb,
+ 0x27, 0x85, 0x5a, 0x18, 0x41, 0xfc, 0x50, 0xf9, 0x85, 0x4c, 0xdb, 0xe6,
+ 0xc0, 0xb2, 0xd4, 0xa7, 0x01, 0xb0, 0xb5, 0x22, 0x93, 0x2b, 0x44, 0xc8,
+ 0xc9, 0x41, 0x9b, 0x2f, 0xd0, 0x3c, 0x67, 0x00, 0xf6, 0xcd, 0x5f, 0x04,
+ 0x3b, 0xef, 0x04, 0xb8, 0x97, 0xed, 0x40, 0x7f, 0x7c, 0x6f, 0x80, 0xc2,
+ 0xe5, 0x47, 0xb3, 0x84, 0xf2, 0x98, 0x1e, 0xb4, 0x19, 0xd8, 0xab, 0xaf,
+ 0x40, 0xf7, 0xfc, 0xcb, 0x7c, 0xd0, 0xf5, 0x2d, 0x7f, 0x48, 0x7f, 0xd0,
+ 0x01, 0x08, 0x47, 0xaa, 0xbe, 0xa0, 0xce, 0x26, 0x13, 0xf4, 0x9e, 0xce,
+ 0x82, 0x81, 0xec, 0xe8, 0x27, 0x23, 0x44, 0x51, 0x02, 0x93, 0xfe, 0x9c,
+ 0xff, 0x7c, 0x66, 0x2e, 0x48, 0xfc, 0x0e, 0x5a, 0xce, 0x3d, 0xe6, 0xe4,
+ 0x46, 0x72, 0x51, 0xba, 0x7d, 0xb9, 0xbd, 0x47, 0xbd, 0x09, 0xab, 0x6b,
+ 0xb6, 0x8f, 0xa0, 0x19, 0xa2, 0x03, 0xd7, 0xe6, 0x20, 0x1a, 0xb1, 0xd1,
+ 0x15, 0x79, 0x16, 0xac, 0x6d, 0xa5, 0x32, 0xa9, 0xe0, 0x01, 0xa7, 0x71,
+ 0x77, 0x65, 0x48, 0x90, 0xe0, 0x9f, 0xf1, 0xc6, 0x7f, 0xc7, 0x2c, 0x2a,
+ 0x50, 0xa2, 0xf8, 0x9d, 0x02, 0xc6, 0x11, 0xdc, 0x14, 0x07, 0xd8, 0x51,
+ 0xc9, 0x8f, 0xd9, 0x2f, 0x04, 0x8a, 0x3a, 0x13, 0x00, 0x31, 0xb6, 0x22,
+ 0xc9, 0xd9, 0x76, 0x27, 0x76, 0x8f, 0x09, 0x96, 0xf8, 0xf9, 0x0c, 0x64,
+ 0x02, 0xd8, 0x71, 0xf8, 0x56, 0xd2, 0xaf, 0x4b, 0x9e, 0x8b, 0xbe, 0x8b,
+ 0xa7, 0x4b, 0x33, 0xfa, 0xeb, 0x5a, 0x16, 0xe3, 0xe8, 0xb7, 0x4a, 0xb4,
+ 0x8a, 0xfb, 0x94, 0xcb, 0xeb, 0x45, 0x8e, 0x4e, 0xa8, 0x0d, 0x73, 0x48,
+ 0xca, 0x22, 0x6f, 0xc0, 0xab, 0xba, 0xaf, 0x6b, 0x30, 0x56, 0x0b, 0xa8,
+ 0x5c, 0x63, 0xd4, 0xdb, 0xe9, 0xbf, 0x3f, 0x43, 0x42, 0x67, 0x61, 0xef,
+ 0x65, 0x8d, 0x27, 0x2b, 0x5b, 0xd4, 0xa5, 0xf7, 0x6d, 0x6b, 0x90, 0xc0,
+ 0x5c, 0x57, 0xd8, 0x63, 0x74, 0xd0, 0xce, 0x26, 0x51, 0x77, 0x8d, 0xbc,
+ 0xc2, 0xe8, 0x76, 0xae, 0x0d, 0x90, 0xc1, 0x71, 0x78, 0x6c, 0xac, 0x71,
+ 0xa0, 0x80, 0x1f, 0xe4, 0xf6, 0x34, 0x8c, 0x24, 0x7c, 0x7f, 0x27, 0x98,
+ 0x52, 0xe5, 0x27, 0x01, 0x32, 0x9b, 0x7a, 0x53, 0x74, 0x68, 0x3c, 0x96,
+ 0x79, 0x8e, 0x5e, 0x6a, 0x76, 0x90, 0xf3, 0x05, 0xd2, 0xa4, 0xb1, 0x01,
+ 0xcb, 0x40, 0xaf, 0xc2, 0x76, 0xfa, 0xf1, 0x6b, 0xbd, 0x7d, 0xfe, 0x98,
+ 0xad, 0xf1, 0x80, 0x18, 0x79, 0x4d, 0x24, 0x3b, 0x71, 0xa5, 0xff, 0x4b,
+ 0x03, 0x75, 0xad, 0x73, 0x46, 0x29, 0xea, 0xec, 0x7b, 0xa7, 0xc8, 0x04,
+ 0xcf, 0x43, 0x4e, 0x17, 0x05, 0x82, 0xee, 0x89, 0xe1, 0xfd, 0x8c, 0x4a,
+ 0xe2, 0xc0, 0x14, 0xcc, 0x58, 0x7b, 0x9c, 0x0e, 0x59, 0x53, 0x0e, 0x52,
+ 0x60, 0xd3, 0x67, 0xb5, 0x64, 0x3c, 0x52, 0xae, 0x0c, 0x60, 0xbf, 0x05,
+ 0xc9, 0xfc, 0xe1, 0x68, 0x0d, 0x57, 0x25, 0xc7, 0x5b, 0x27, 0x2c, 0x3a,
+ 0xff, 0x6e, 0xf3, 0xea, 0xab, 0xb9, 0xbb, 0x1f, 0x6a, 0x7e, 0xd5, 0x4d,
+ 0x70, 0x24, 0x4d, 0x89, 0x8a, 0x6e, 0xb5, 0x37, 0x6b, 0xd2, 0x91, 0x3c,
+ 0x51, 0x62, 0x09, 0xfd, 0x95, 0xf4, 0x3c, 0xf5, 0xaa, 0xb0, 0xed, 0x78,
+ 0x09, 0x35, 0x76, 0x9f, 0x69, 0x0c, 0x47, 0xd1, 0x36, 0x97, 0x44, 0x79,
+ 0x47, 0x2c, 0x62, 0x57, 0x2f, 0xae, 0x2c, 0xfc, 0x4c, 0x26, 0xf9, 0x4a,
+ 0x0c, 0xc0, 0x9b, 0x64, 0xaa, 0x42, 0x7c, 0x62, 0xf0, 0xe7, 0xda, 0x92,
+ 0xad, 0x0f, 0x1f, 0x98, 0xc8, 0x8b, 0x55, 0x97, 0x66, 0xce, 0x10, 0xee,
+ 0x17, 0xd1, 0x43, 0x05, 0x59, 0xbe, 0x47, 0x49, 0xad, 0x7c, 0x25, 0xa3,
+ 0x5b, 0xa8, 0x9e, 0x6e, 0x82, 0xc6, 0xff, 0x54, 0xd4, 0xff, 0x61, 0xb3,
+ 0xa1, 0x13, 0x28, 0x29, 0x2b, 0x70, 0x10, 0x59, 0x28, 0x5e, 0x64, 0x53,
+ 0x58, 0x38, 0x15, 0xd8, 0x46, 0xe8, 0xad, 0x43, 0x37, 0xd7, 0x4a, 0x88,
+ 0xa1, 0x4a, 0x12, 0x8e, 0x77, 0x93, 0x34, 0xb9, 0x25, 0x73, 0x3d, 0x59,
+ 0x13, 0xe7, 0xcd, 0x8a, 0xb4, 0x36, 0xd8, 0xaf, 0x64, 0x34, 0x15, 0x3c,
+ 0x5e, 0xab, 0x62, 0x90, 0x40, 0x41, 0x6b, 0xdf, 0x2b, 0x7d, 0x2c, 0x30,
+ 0xd9, 0xe2, 0xf8, 0xb7, 0x87, 0x07, 0xc8, 0x35, 0xd9, 0x81, 0x00, 0x89,
+ 0x9e, 0xbb, 0xb3, 0x94, 0x83, 0xb0, 0xea, 0xfb, 0xfb, 0x2c, 0x51, 0x4a,
+ 0x10, 0xa5, 0xe2, 0xb5, 0x0e, 0x42, 0xcd, 0x08, 0xc4, 0x42, 0xac, 0x70,
+ 0x44, 0xa3, 0xa0, 0xdf, 0x42, 0x02, 0x5e, 0x61, 0xd7, 0x86, 0xe7, 0x10,
+ 0xca, 0xdf, 0x6d, 0x41, 0x8c, 0x7f, 0xa2, 0x62, 0x76, 0x97, 0xc0, 0x17,
+ 0x2c, 0x0f, 0xf1, 0x32, 0x6b, 0x56, 0xcb, 0x55, 0x5c, 0xcb, 0x9e, 0xd4,
+ 0xbc, 0x85, 0xf2, 0x3a, 0x64, 0x79, 0xee, 0x87, 0xfd, 0xb0, 0x53, 0x4a,
+ 0x69, 0xb0, 0x91, 0xa9, 0xed, 0x21, 0x41, 0x2b, 0xb0, 0x27, 0x1b, 0xa1,
+ 0xdf, 0x5e, 0x13, 0x8d, 0xe7, 0x25, 0xd2, 0xc8, 0x3f, 0xb1, 0x84, 0xae,
+ 0xb0, 0xa6, 0xe4, 0xe8, 0xa0, 0x7a, 0x4b, 0x89, 0xfe, 0x3d, 0x2b, 0x3a,
+ 0x9d, 0xd1, 0x98, 0xa2, 0xce, 0xeb, 0x31, 0x62, 0xa8, 0x3c, 0xe1, 0xcd,
+ 0xc0, 0xfa, 0xf1, 0xfb, 0x5d, 0xd3, 0x75, 0xbe, 0x0f, 0xb6, 0x60, 0x38,
+ 0xec, 0x84, 0x9a, 0x9c, 0xe4, 0xdd, 0xf8, 0xac, 0x05, 0x17, 0xe6, 0x4b,
+ 0xa4, 0x73, 0x37, 0x46, 0x7c, 0x2f, 0xc1, 0xff, 0xa6, 0x0a, 0xa4, 0xce,
+ 0xb3, 0x5e, 0x72, 0x80, 0xc1, 0xeb, 0xfe, 0x4f, 0x72, 0x00, 0x9e, 0xea,
+ 0x04, 0xba, 0x57, 0x27, 0xa7, 0xb2, 0x49, 0x47, 0x7f, 0xd5, 0x59, 0xf8,
+ 0x25, 0x43, 0x7c, 0xcb, 0xf7, 0xda, 0x56, 0xa7, 0x1b, 0x50, 0xbb, 0xd3,
+ 0xec, 0x54, 0xec, 0xce, 0x5c, 0xdd, 0x94, 0x96, 0x64, 0x92, 0x2f, 0x8d,
+ 0xaf, 0xb2, 0x85, 0x42, 0x50, 0x1e, 0xf3, 0x0b, 0x34, 0xa4, 0xbb, 0x4f,
+ 0xac, 0xb1, 0x5b, 0x87, 0xfe, 0x9d, 0x9a, 0xc9, 0x20, 0x23, 0xc9, 0x3e,
+ 0x4a, 0x12, 0xba, 0xd2, 0x4b, 0x6e, 0x81, 0xdb, 0xf8, 0xaf, 0xf6, 0xbd,
+ 0x15, 0x1d, 0xc5, 0xea, 0xa0, 0x55, 0xc1, 0x36, 0x8f, 0xd8, 0x94, 0xf6,
+ 0x62, 0x99, 0xeb, 0x72, 0xf7, 0xa4, 0xf8, 0x90, 0x31, 0x6d, 0xdb, 0x15,
+ 0xc3, 0xc0, 0x0a, 0x07, 0x40, 0xab, 0xeb, 0xb1, 0xd4, 0x10, 0x7c, 0x8d,
+ 0x46, 0x1c, 0x8f, 0xd2, 0xfb, 0xfb, 0x1e, 0xeb, 0x78, 0xcd, 0x19, 0xae,
+ 0xda, 0x9c, 0x09, 0xe0, 0x5d, 0xf4, 0xc0, 0xf4, 0x4f, 0xb4, 0xb0, 0x10,
+ 0xea, 0x57, 0x7d, 0xa3, 0x15, 0x57, 0x01, 0x13, 0x96, 0x99, 0xa6, 0x2b,
+ 0x44, 0x5e, 0x2c, 0x55, 0xfe, 0x28, 0xe9, 0x8a, 0x50, 0x85, 0x1f, 0x49,
+ 0x0c, 0xbe, 0x84, 0x25, 0x6d, 0x0b, 0xbf, 0x68, 0xb7, 0x57, 0x4d, 0x9c,
+ 0xf1, 0x47, 0xce, 0xec, 0x58, 0x91, 0xd5, 0x78, 0x9a, 0x13, 0xa5, 0x2d,
+ 0xa6, 0xbd, 0x5f, 0x7c, 0x28, 0x41, 0x27, 0x94, 0x91, 0x1a, 0x95, 0x26,
+ 0x7c, 0xb7, 0x67, 0x45, 0x6b, 0x53, 0x8c, 0x15, 0x7e, 0x53, 0x65, 0x7d,
+ 0xa5, 0x15, 0x35, 0x2b, 0x9b, 0x5c, 0x5f, 0x78, 0x2a, 0xca, 0x59, 0x73,
+ 0xb9, 0x4f, 0x85, 0xa8, 0x3a, 0xe9, 0x71, 0x8b, 0xd2, 0x55, 0x29, 0x35,
+ 0x8f, 0xdd, 0x46, 0xa8, 0x4e, 0x7f, 0xac, 0x67, 0x62, 0xec, 0x80, 0x48,
+ 0x83, 0x20, 0xae, 0x24, 0x20, 0xac, 0x11, 0xec, 0x84, 0x86, 0x08, 0xdc,
+ 0xba, 0xbb, 0xf9, 0xfe, 0xd0, 0x28, 0x28, 0x82, 0x1a, 0x4a, 0x7e, 0x2c,
+ 0x00, 0x3c, 0xf7, 0xfc, 0x40, 0x29, 0xdd, 0x4d, 0xa5, 0x76, 0x70, 0x1e,
+ 0x8e, 0x69, 0xe7, 0x81, 0x6a, 0xa0, 0xdf, 0xa4, 0x2b, 0x0f, 0x20, 0x06,
+ 0x52, 0xb7, 0x56, 0xcc, 0x2c, 0xe2, 0x34, 0x84, 0x50, 0x78, 0xfb, 0x83,
+ 0xb4, 0xb6, 0x50, 0x2e, 0x25, 0x52, 0xaa, 0xab, 0xf3, 0x4f, 0x44, 0x5b,
+ 0x06, 0xa1, 0x35, 0x9e, 0x1c, 0xf0, 0x85, 0x51, 0x88, 0xb0, 0x89, 0x04,
+ 0xdc, 0xac, 0x5f, 0x00, 0x3e, 0x2e, 0xf9, 0x8a, 0x0e, 0xc7, 0x5a, 0x02,
+ 0x95, 0xcd, 0x48, 0x28, 0x54, 0x99, 0xd3, 0x95, 0x2e, 0xe3, 0x70, 0x27,
+ 0x57, 0xad, 0x2c, 0x43, 0xf1, 0xc3, 0xe0, 0x04, 0xac, 0x81, 0x7d, 0x57,
+ 0xf7, 0x2c, 0xaf, 0x14, 0xc5, 0xf8, 0xba, 0x7e, 0x3a, 0x47, 0x33, 0x4d,
+ 0x0f, 0x91, 0x5c, 0x64, 0xd4, 0x7c, 0x81, 0x12, 0x5a, 0x05, 0x67, 0xe3,
+ 0x7b, 0x91, 0x46, 0xe4, 0x6a, 0xac, 0x73, 0xbe, 0x98, 0x08, 0x13, 0x71,
+ 0xf3, 0xaa, 0x0c, 0xcd, 0x1a, 0x26, 0xfd, 0x87, 0x0b, 0x37, 0x93, 0xc8,
+ 0x77, 0xae, 0x8a, 0x58, 0x69, 0xa6, 0x2e, 0xc6, 0xfd, 0x50, 0xd6, 0xcb,
+ 0x54, 0x74, 0xda, 0xfa, 0xa1, 0x92, 0xd0, 0x1c, 0x9f, 0x29, 0x46, 0x45,
+ 0x92, 0xdc, 0xd8, 0x1d, 0xad, 0x2d, 0xa0, 0x3c, 0xce, 0xd3, 0x2f, 0xe0,
+ 0xd5, 0x99, 0xc8, 0xe9, 0xcf, 0x00, 0x46, 0x7c, 0x80, 0x1d, 0x4f, 0x36,
+ 0xb1, 0x62, 0x7c, 0x9b, 0xc0, 0x15, 0xcb, 0x62, 0x17, 0x87, 0xf9, 0xcb,
+ 0x19, 0x6f, 0xfd, 0xb4, 0xb8, 0xb2, 0x40, 0x23, 0xdf, 0x68, 0x39, 0x07,
+ 0xc8, 0x11, 0xee, 0xcb, 0x29, 0xff, 0x22, 0x34, 0x23, 0x8b, 0x9e, 0x5b,
+ 0xc6, 0x28, 0x78, 0xc1, 0x2c, 0x42, 0xdf, 0x8a, 0x7f, 0x57, 0x14, 0x4b,
+ 0x88, 0x47, 0xe1, 0xfe, 0x94, 0x83, 0x18, 0x34, 0x2e, 0xc6, 0x6f, 0x91,
+ 0x32, 0xdf, 0x6d, 0x49, 0xe1, 0x32, 0x2d, 0x82, 0x08, 0xea, 0x42, 0x39,
+ 0x08, 0xe4, 0xef, 0x49, 0x6f, 0xe4, 0xb1, 0x3d, 0x76, 0x3f, 0x02, 0x57,
+ 0x24, 0x50, 0xb0, 0x1d, 0xcf, 0x4f, 0x2d, 0x19, 0x34, 0xb0, 0x15, 0x2e,
+ 0x01, 0xde, 0x58, 0x58, 0xe0, 0x44, 0x4d, 0x2c, 0x35, 0xbc, 0xcc, 0x7f,
+ 0xd5, 0x24, 0x04, 0x60, 0xa1, 0x94, 0x13, 0x87, 0xad, 0xd7, 0xbc, 0xd7,
+ 0x3c, 0xc3, 0x53, 0x68, 0x14, 0xae, 0xce, 0xa4, 0x60, 0x52, 0x3e, 0x1f,
+ 0xe4, 0xda, 0x02, 0x3b, 0x5b, 0x39, 0x95, 0x36, 0xfb, 0x8b, 0x6d, 0xbd,
+ 0xe2, 0x1b, 0xff, 0xce, 0x87, 0xb8, 0x44, 0xaa, 0xe0, 0x23, 0x0f, 0x40,
+ 0x6b, 0x4c, 0x58, 0xbf, 0xa0, 0x87, 0xbc, 0x19, 0x03, 0x2e, 0x58, 0x6d,
+ 0x1f, 0x05, 0xe8, 0x65, 0xb8, 0x88, 0xc9, 0x8b, 0x88, 0xae, 0xd3, 0x4b,
+ 0xc3, 0x23, 0x0c, 0x7f, 0x05, 0x4f, 0x93, 0x17, 0x84, 0x7c, 0x03, 0xcc,
+ 0xed, 0xb7, 0x60, 0xf6, 0xd4, 0xd6, 0x8b, 0x91, 0x7e, 0xb8, 0x14, 0x2c,
+ 0xb9, 0x8c, 0xf6, 0x0b, 0xcd, 0xbb, 0x02, 0xde, 0xc3, 0x8d, 0x28, 0xff,
+ 0xb6, 0x53, 0x56, 0x03, 0xce, 0xb0, 0xe1, 0xa5, 0x92, 0xf2, 0x9c, 0x2d,
+ 0x3f, 0x6a, 0x26, 0x72, 0xe2, 0xf7, 0x55, 0x16, 0x3e, 0x1b, 0x42, 0x44,
+ 0xad, 0x17, 0x09, 0xa7, 0x29, 0x25, 0x1f, 0x04, 0x80, 0xba, 0x3a, 0x29,
+ 0xc3, 0xf7, 0xe8, 0x7c, 0xf7, 0xf4, 0x32, 0x5b, 0x3a, 0xa2, 0xbd, 0xfd,
+ 0x85, 0xe6, 0xf3, 0x0d, 0x40, 0xed, 0xeb, 0x99, 0x73, 0x31, 0x82, 0x27,
+ 0x96, 0xea, 0x8f, 0x73, 0xa7, 0x77, 0x1f, 0x46, 0xe9, 0xe2, 0xff, 0x50,
+ 0xe0, 0xca, 0xb2, 0xa7, 0x63, 0xeb, 0xc7, 0x6c, 0x8f, 0x81, 0x05, 0x91,
+ 0xbe, 0x0a, 0x0c, 0x22, 0x34, 0xf6, 0xd5, 0x9d, 0x53, 0xe1, 0x8e, 0x22,
+ 0x04, 0xa7, 0x12, 0x9e, 0xc1, 0xef, 0xb6, 0x17, 0xb1, 0x18, 0xae, 0x0f,
+ 0x87, 0xe3, 0x96, 0x76, 0x72, 0xc6, 0xef, 0x0b, 0xbc, 0xce, 0xaf, 0x58,
+ 0x99, 0x9b, 0x72, 0xa2, 0xc1, 0x24, 0x91, 0x5c, 0xc7, 0xb7, 0x4a, 0x0f,
+ 0x39, 0x05, 0x5a, 0xf4, 0x66, 0x8c, 0x95, 0xd1, 0x5b, 0xff, 0x74, 0x16,
+ 0x9f, 0xa0, 0xa3, 0x2c, 0xfb, 0x85, 0x80, 0xe5, 0xf0, 0x33, 0x17, 0x38,
+ 0x01, 0x8b, 0x5f, 0x8b, 0xcd, 0x58, 0x22, 0x3e, 0xcf, 0x09, 0x1e, 0x76,
+ 0x3a, 0x0c, 0x7a, 0xc4, 0xf2, 0xff, 0x7c, 0x14, 0xca, 0x36, 0x6c, 0x26,
+ 0x39, 0xde, 0x23, 0x0d, 0xd3, 0xfa, 0x5c, 0x1a, 0xff, 0xe6, 0x98, 0xc5,
+ 0x86, 0x4c, 0xda, 0xb1, 0x6c, 0x27, 0x87, 0x54, 0x3b, 0xb7, 0x74, 0xb3,
+ 0x71, 0x3d, 0x17, 0x56, 0x11, 0xe7, 0xf4, 0x92, 0x6e, 0x2d, 0xe1, 0x05,
+ 0x53, 0xd9, 0x5f, 0x41, 0x36, 0xed, 0x0c, 0x10, 0xa4, 0xfa, 0xd8, 0x7e,
+ 0xb0, 0xce, 0x35, 0xd1, 0xf5, 0x14, 0x7e, 0x50, 0xed, 0x79, 0x44, 0x7e,
+ 0x1d, 0xde, 0xd3, 0xd8, 0xdf, 0xdf, 0xcf, 0x24, 0xf9, 0xee, 0xae, 0xfc,
+ 0x80, 0xa0, 0x59, 0x87, 0x67, 0x63, 0x69, 0x79, 0x4a, 0x70, 0x92, 0x3c,
+ 0x2d, 0xba, 0x38, 0xac, 0x5e, 0xff, 0xe9, 0x1a, 0x35, 0x92, 0x5d, 0x62,
+ 0x3d, 0xd9, 0xdc, 0x36, 0xaf, 0x85, 0x39, 0x35, 0xe4, 0x89, 0xa2, 0x78,
+ 0xfe, 0xb7, 0xf7, 0x7c, 0xa8, 0x95, 0xcf, 0xfe, 0xfe, 0x5d, 0xd0, 0x31,
+ 0x1d, 0x9d, 0xe0, 0xa3, 0x35, 0x63, 0xd5, 0x4a, 0xd5, 0xba, 0xa2, 0x99,
+ 0xba, 0x2a, 0xf1, 0xd6, 0x34, 0x46, 0x60, 0x43, 0x3a, 0xab, 0xbf, 0x41,
+ 0xe5, 0x6b, 0xbb, 0xb8, 0x0f, 0x04, 0xfc, 0x34, 0x55, 0x8d, 0x57, 0x93,
+ 0x0e, 0x3e, 0x27, 0xfb, 0x3d, 0x9f, 0x65, 0x97, 0xd8, 0x70, 0x93, 0xc2,
+ 0xa2, 0x15, 0x6c, 0x17, 0x66, 0xf7, 0xf6, 0x56, 0x4f, 0x21, 0x14, 0x5f,
+ 0x2f, 0x8d, 0x5b, 0xb2, 0xe5, 0x4f, 0xac, 0xc8, 0x02, 0x26, 0x20, 0xc5,
+ 0xa7, 0x52, 0xfb, 0x74, 0xc0, 0xcc, 0xcc, 0x3f, 0x36, 0x59, 0x87, 0x79,
+ 0x91, 0x05, 0x45, 0x59, 0x31, 0xff, 0xa8, 0x94, 0x7a, 0x19, 0xa2, 0xa5,
+ 0xfc, 0x5c, 0x4e, 0xbf, 0xfa, 0x35, 0x5b, 0x16, 0x4e, 0xfc, 0x3d, 0xcd,
+ 0x5d, 0x83, 0x31, 0x67, 0x58, 0x8b, 0xb7, 0x51, 0xfc, 0xb7, 0x07, 0x00,
+ 0xe8, 0xf9, 0xde, 0x60, 0x19, 0xab, 0xa3, 0x57, 0x3a, 0xaf, 0x62, 0x21,
+ 0x02, 0x58, 0xfd, 0xa0, 0x4a, 0x67, 0x71, 0xe2, 0x9f, 0x73, 0xe8, 0x8d,
+ 0x5a, 0x85, 0x2b, 0xdf, 0x38, 0x06, 0x9c, 0xb7, 0x86, 0x22, 0xec, 0xc2,
+ 0xd0, 0xc3, 0x92, 0xe3, 0xbe, 0x20, 0x69, 0xc0, 0xd8, 0x80, 0xfb, 0xfa,
+ 0xda, 0xb3, 0x4e, 0x4d, 0xda, 0xda, 0x7b, 0x0a, 0x5e, 0xa1, 0xac, 0xf6,
+ 0xb6, 0x94, 0xd6, 0x9b, 0x70, 0xdc, 0x91, 0x83, 0x77, 0xa9, 0x3f, 0xbf,
+ 0x27, 0x6b, 0xdd, 0x31, 0xd1, 0xad, 0x5b, 0xdb, 0x59, 0x06, 0xce, 0xb9,
+ 0x3e, 0x24, 0x3a, 0xd2, 0x6e, 0x1f, 0x3a, 0x31, 0xa6, 0x36, 0x59, 0x8e,
+ 0x4b, 0x3a, 0x2e, 0x3d, 0x6f, 0x28, 0xa8, 0xe6, 0xcd, 0x84, 0x74, 0x63,
+ 0xd1, 0xdd, 0x81, 0x7d, 0xbb, 0xad, 0x30, 0x01, 0x2b, 0x1b, 0xcf, 0x15,
+ 0x39, 0x28, 0xcb, 0x75, 0x55, 0xe7, 0x41, 0x08, 0xfa, 0x7e, 0x64, 0x6b,
+ 0xf7, 0x66, 0x51, 0xb4, 0xe2, 0x93, 0x8a, 0x10, 0xa5, 0x13, 0x0a, 0x3b,
+ 0x9e, 0xdd, 0xb1, 0x79, 0xf3, 0x43, 0x8d, 0xc8, 0x9b, 0x4e, 0xc5, 0x51,
+ 0x5c, 0x8d, 0xa7, 0x91, 0xdf, 0x39, 0x5a, 0x7b, 0x72, 0x53, 0xf9, 0x6c,
+ 0xa6, 0x89, 0x41, 0x81, 0xb5, 0xcf, 0xfb, 0x71, 0x08, 0x64, 0xc8, 0x77,
+ 0x3e, 0x5a, 0x84, 0x18, 0xb6, 0x5f, 0x42, 0xce, 0xb4, 0x46, 0xc9, 0x61,
+ 0x92, 0x13, 0x4a, 0xc9, 0xb0, 0xa6, 0x10, 0xaf, 0x4f, 0xdc, 0x00, 0x21,
+ 0xfa, 0x74, 0x9a, 0xdf, 0x21, 0x93, 0xe0, 0x5d, 0x1a, 0x3b, 0xa3, 0x43,
+ 0x2a, 0x67, 0x97, 0xfc, 0x16, 0xde, 0x4c, 0x69, 0xa3, 0xa5, 0x28, 0x74,
+ 0xd1, 0xcf, 0xa5, 0x1c, 0xff, 0x8e, 0xea, 0xfa, 0x16, 0x4a, 0xa0, 0xe5,
+ 0xb3, 0x42, 0x53, 0x78, 0xf4, 0xc0, 0xaa, 0x12, 0x52, 0xcb, 0x1e, 0x65,
+ 0x2d, 0x12, 0xa8, 0x92, 0x7e, 0xd4, 0x9f, 0x70, 0xb9, 0x28, 0x27, 0x69,
+ 0x12, 0xc2, 0x6b, 0xb6, 0x0e, 0xb4, 0x08, 0x82, 0x4e, 0xae, 0xf3, 0xba,
+ 0x3b, 0xea, 0xdb, 0xff, 0x90, 0xda, 0x58, 0xde, 0xac, 0xdd, 0xe6, 0xc5,
+ 0x9f, 0x1c, 0xdf, 0x4e, 0x8e, 0xa2, 0xf9, 0xef, 0x00, 0x5f, 0x63, 0x58,
+ 0x74, 0x8c, 0x58, 0x63, 0xe6, 0x74, 0xd7, 0x72, 0x59, 0x75, 0xcf, 0x21,
+ 0x3b, 0xbb, 0x5d, 0x4a, 0x19, 0x89, 0xb9, 0xd9, 0x16, 0x18, 0x20, 0x3d,
+ 0x1e, 0x68, 0xc5, 0xeb, 0x04, 0x7d, 0x3c, 0x3c, 0xa8, 0xc9, 0x35, 0x3d,
+ 0xda, 0x25, 0x0c, 0x73, 0xb9, 0x48, 0xf5, 0x43, 0x40, 0xa8, 0xff, 0x9a,
+ 0x1e, 0x88, 0xf1, 0x9d, 0x3f, 0xbf, 0x1a, 0xb2, 0xde, 0xec, 0x62, 0x75,
+ 0x36, 0xcf, 0xc6, 0x6e, 0x61, 0x1b, 0x39, 0x8b, 0xec, 0x22, 0x12, 0xec,
+ 0xf2, 0x05, 0x39, 0x45, 0x69, 0xf1, 0x65, 0x05, 0x35, 0x4e, 0xe4, 0x3b,
+ 0x9d, 0x6d, 0xb2, 0xf9, 0x9a, 0x6d, 0x5d, 0x06, 0x57, 0xc4, 0x6e, 0x84,
+ 0x55, 0xab, 0xf4, 0x83, 0xb4, 0x5b, 0xa1, 0x9f, 0x32, 0x4c, 0xc8, 0x84,
+ 0x07, 0xa6, 0x31, 0xa2, 0x26, 0xf3, 0x75, 0x49, 0x22, 0x77, 0xb9, 0xdc,
+ 0xb8, 0x6a, 0x79, 0x7e, 0x08, 0x9a, 0x45, 0xfd, 0x03, 0x40, 0x14, 0x4b,
+ 0x98, 0xff, 0x02, 0x0e, 0xf3, 0x78, 0x51, 0x94, 0x1e, 0x05, 0x45, 0xdb,
+ 0x91, 0x1e, 0xf5, 0x66, 0xc3, 0x70, 0xbd, 0x44, 0x55, 0xce, 0xd9, 0xec,
+ 0x98, 0x15, 0x45, 0x89, 0x12, 0x2e, 0x2c, 0x39, 0x8d, 0x94, 0x17, 0xf4,
+ 0x54, 0xaa, 0x91, 0xee, 0xef, 0x50, 0xb2, 0xde, 0xa0, 0xe6, 0xa8, 0xa0,
+ 0xf2, 0x4c, 0x46, 0x45, 0x48, 0x1d, 0xa9, 0x8c, 0xfc, 0x48, 0xd4, 0xc9,
+ 0x45, 0x65, 0x4d, 0x74, 0x57, 0x61, 0x3f, 0x22, 0xaf, 0x32, 0x60, 0x5b,
+ 0xd7, 0xb0, 0x0b, 0xbe, 0x26, 0xcc, 0x51, 0x52, 0x2c, 0x41, 0x2e, 0xc8,
+ 0xd0, 0xf1, 0x56, 0xf5, 0xf5, 0x7a, 0xa4, 0x4e, 0xb7, 0x69, 0xc2, 0x1b,
+ 0x71, 0x91, 0xe4, 0x52, 0xb5, 0xd2, 0x4c, 0xca, 0x29, 0xb9, 0x27, 0x17,
+ 0x97, 0x77, 0x72, 0x3a, 0x14, 0x30, 0x16, 0x88, 0x80, 0x86, 0x5a, 0xaa,
+ 0xc8, 0x99, 0x28, 0x55, 0x17, 0x63, 0xdf, 0x98, 0xfa, 0xe5, 0xc6, 0xa3,
+ 0x97, 0x40, 0x7a, 0x3c, 0x39, 0x13, 0x00, 0x27, 0xd6, 0x1d, 0x3a, 0x6b,
+ 0x47, 0xa8, 0x3e, 0xde, 0x25, 0x77, 0x1a, 0x3a, 0xd1, 0x66, 0x7f, 0x18,
+ 0x63, 0x0b, 0x96, 0xab, 0x33, 0x79, 0xc7, 0x61, 0xac, 0xea, 0x1f, 0x3c,
+ 0x95, 0xfc, 0x8d, 0xc7, 0x54, 0x2e, 0x9e, 0x77, 0xa3, 0x74, 0xbb, 0x84,
+ 0x40, 0xc9, 0x80, 0x4d, 0x8b, 0xe1, 0xa7, 0x75, 0x53, 0x7c, 0x88, 0x48,
+ 0x35, 0x4e, 0x64, 0xfc, 0xe2, 0x50, 0x0b, 0x7c, 0xc5, 0x03, 0xef, 0xf5,
+ 0xd9, 0x0a, 0x63, 0xc2, 0xc4, 0xed, 0xf1, 0x29, 0x3f, 0x87, 0x53, 0x11,
+ 0x81, 0x80, 0x2c, 0x3c, 0xcc, 0x69, 0x55, 0x11, 0x93, 0x5f, 0xe1, 0xe9,
+ 0xd9, 0xc4, 0x05, 0x95, 0x6a, 0x6f, 0xdd, 0xb0, 0x6a, 0xfc, 0x90, 0x3a,
+ 0xf7, 0x0a, 0x05, 0x64, 0xd3, 0x7d, 0xe4, 0xf3, 0x53, 0x3b, 0x72, 0x21,
+ 0xfe, 0x14, 0xd8, 0xff, 0x97, 0x93, 0xd4, 0x2b, 0x91, 0x2a, 0x30, 0x72,
+ 0x9f, 0x2b, 0xab, 0x5b, 0xe7, 0x81, 0xce, 0xce, 0x39, 0xc8, 0x5c, 0xd3,
+ 0xa7, 0xde, 0x05, 0xa5, 0xc7, 0xba, 0xe8, 0xa5, 0xca, 0xe6, 0xb4, 0xce,
+ 0x82, 0x2e, 0xd7, 0x83, 0xc2, 0x37, 0x01, 0x2d, 0x3b, 0x27, 0x64, 0x12,
+ 0x87, 0xc9, 0xf5, 0x4f, 0xa3, 0xbc, 0x08, 0x74, 0x9c, 0x1d, 0x9e, 0xb3,
+ 0xef, 0x12, 0xdc, 0x84, 0xe0, 0x4e, 0x62, 0xd2, 0xb4, 0x8e, 0xb1, 0x37,
+ 0x3c, 0x65, 0xc7, 0x7b, 0xc4, 0x98, 0x58, 0xff, 0xe4, 0xeb, 0x2f, 0x43,
+ 0x5f, 0x94, 0xff, 0x6e, 0x69, 0x0a, 0x17, 0x24, 0x82, 0x42, 0xae, 0xb2,
+ 0x80, 0xca, 0x86, 0xa9, 0xe2, 0x9d, 0x23, 0x3e, 0x07, 0x1a, 0xc6, 0x6b,
+ 0xe0, 0x96, 0xb8, 0xcd, 0x11, 0x63, 0x67, 0x12, 0xc9, 0xdf, 0x3e, 0xeb,
+ 0x2f, 0x45, 0xea, 0x04, 0x0d, 0xfd, 0x94, 0xbc, 0x15, 0xcb, 0xfc, 0x55,
+ 0xfc, 0x7d, 0x1a, 0x6d, 0xbc, 0x93, 0x41, 0xb6, 0x89, 0x4e, 0xa6, 0xfc,
+ 0x53, 0xd0, 0x72, 0xfa, 0xa0, 0xa2, 0xe7, 0x9f, 0xbe, 0xbe, 0xce, 0x56,
+ 0x24, 0x76, 0xd0, 0xfb, 0x8e, 0x21, 0xfe, 0x23, 0xb2, 0xbb, 0x79, 0xa8,
+ 0x83, 0x3b, 0x5c, 0xb2, 0x41, 0x85, 0x68, 0xb8, 0xdf, 0x7d, 0x17, 0xf8,
+ 0xb0, 0x64, 0xce, 0xbd, 0x75, 0xbd, 0x6e, 0xe1, 0xdf, 0xe6, 0x67, 0xcc,
+ 0xc1, 0x2b, 0x8c, 0x01, 0xdf, 0xc4, 0xd3, 0x53, 0xc2, 0x6c, 0x57, 0x16,
+ 0xc3, 0x52, 0x56, 0x18, 0xcc, 0x97, 0xfc, 0x1b, 0x2f, 0x86, 0x56, 0x0d,
+ 0x12, 0x86, 0x8d, 0x4f, 0x95, 0x88, 0x40, 0xaa, 0xa6, 0x51, 0xfa, 0x97,
+ 0x22, 0xb9, 0x6b, 0x13, 0x32, 0xfc, 0x6a, 0x20, 0x88, 0xbc, 0x28, 0xa5,
+ 0x34, 0x6e, 0x5c, 0x5a, 0x1e, 0x38, 0xbf, 0x19, 0x47, 0xfb, 0x44, 0x5e,
+ 0xba, 0x3f, 0x16, 0x06, 0x2a, 0x58, 0x30, 0xe7, 0x93, 0x49, 0xc9, 0x09,
+ 0xa0, 0x34, 0xb3, 0x1e, 0x9d, 0x15, 0x5e, 0xdb, 0x76, 0xfb, 0xa8, 0x2b,
+ 0x9a, 0x09, 0xd4, 0x89, 0x2e, 0x4b, 0x5d, 0x01, 0xa4, 0x45, 0xd4, 0xcc,
+ 0xd1, 0xb1, 0xb4, 0xa7, 0xb3, 0x54, 0xe9, 0x8a, 0xc2, 0x28, 0x8c, 0xcb,
+ 0x95, 0xa0, 0x23, 0x11, 0x02, 0x94, 0x7d, 0xfc, 0x3e, 0xa3, 0x23, 0x9c,
+ 0xde, 0xf1, 0x92, 0x8b, 0x3a, 0x1e, 0x8f, 0x0a, 0xbd, 0x93, 0x1a, 0x08,
+ 0x03, 0xad, 0x2d, 0x6f, 0x83, 0x5b, 0x32, 0x28, 0xff, 0x51, 0x58, 0x4f,
+ 0x1b, 0x64, 0xaa, 0x4e, 0x3c, 0x3d, 0x44, 0x04, 0x3a, 0x01, 0x3b, 0xfb,
+ 0x07, 0xa5, 0xc9, 0x1b, 0x07, 0x0f, 0xd3, 0x9f, 0x5e, 0xfd, 0x3d, 0x71,
+ 0x94, 0x54, 0x19, 0x85, 0x87, 0x88, 0x15, 0x08, 0x50, 0xdc, 0x26, 0xbd,
+ 0x22, 0x36, 0x14, 0x9f, 0xc1, 0x6d, 0x12, 0xf3, 0x2b, 0x18, 0x7b, 0xc9,
+ 0xf1, 0xe2, 0x25, 0xe6, 0xa7, 0x44, 0xa9, 0x9c, 0x37, 0x15, 0x11, 0xa2,
+ 0xbb, 0xa3, 0xc3, 0xb4, 0x7b, 0x09, 0x0a, 0x31, 0xed, 0x37, 0x98, 0xd3,
+ 0x7e, 0x7a, 0xcb, 0x0a, 0xc8, 0xed, 0x13, 0x05, 0x1e, 0x14, 0x9a, 0x3b,
+ 0xc4, 0xd2, 0x9d, 0x35, 0x60, 0xb7, 0x6f, 0x0b, 0x3d, 0x1e, 0xef, 0x34,
+ 0xcd, 0x40, 0x24, 0x7c, 0xf4, 0x2f, 0x99, 0xd2, 0x4f, 0x9f, 0xf6, 0x11,
+ 0xb5, 0x9e, 0xb8, 0x64, 0x55, 0xbf, 0xc1, 0x78, 0x3e, 0xe9, 0xbe, 0x15,
+ 0xf5, 0x1a, 0x86, 0xa0, 0x8e, 0x16, 0xda, 0x5f, 0x94, 0x9e, 0x2a, 0xdf,
+ 0x50, 0x97, 0x42, 0x30, 0x8c, 0xe3, 0x01, 0xe0, 0x95, 0x51, 0xa8, 0x54,
+ 0xd5, 0xee, 0xf0, 0x1a, 0xa4, 0x0d, 0x63, 0x8d, 0xdf, 0x32, 0xa2, 0x96,
+ 0x82, 0x94, 0xbf, 0xe7, 0xab, 0xb0, 0x0e, 0xec, 0x51, 0xa8, 0x9b, 0x53,
+ 0x25, 0x8e, 0x15, 0x78, 0xb2, 0xd2, 0xf7, 0x9c, 0x86, 0xbb, 0x9a, 0x9e,
+ 0xa6, 0xc8, 0x4b, 0x02, 0x47, 0x00, 0xfd, 0x1a, 0x0b, 0x40, 0x87, 0x84,
+ 0x9b, 0xf6, 0xaf, 0x22, 0x08, 0x3d, 0x89, 0x4b, 0xe8, 0x5f, 0x66, 0x06,
+ 0x62, 0xe3, 0x29, 0xbd, 0xb5, 0x39, 0xa7, 0x17, 0x7f, 0xb5, 0x8b, 0xe5,
+ 0x57, 0x6e, 0xbb, 0xa9, 0x3c, 0x41, 0x9b, 0x64, 0xf1, 0x44, 0x32, 0xb2,
+ 0x14, 0xd7, 0x4d, 0x9b, 0x03, 0x5c, 0x39, 0x3a, 0x72, 0x8f, 0x04, 0xd2,
+ 0x02, 0xcd, 0x9f, 0xd9, 0xf8, 0x67, 0xd2, 0x20, 0xc1, 0xe2, 0x15, 0x33,
+ 0x75, 0xe7, 0xd3, 0xa1, 0x65, 0xe7, 0xea, 0xf8, 0x28, 0xb8, 0xc5, 0x56,
+ 0xca, 0x82, 0xd8, 0x11, 0x1d, 0x3c, 0x98, 0x60, 0xd8, 0xe7, 0xe2, 0x7d,
+ 0x3d, 0xd4, 0x5e, 0x38, 0x6f, 0x6e, 0x83, 0x40, 0x6a, 0x2a, 0x72, 0x52,
+ 0xee, 0x05, 0x23, 0xee, 0x13, 0x6d, 0xfb, 0x81, 0x17, 0xda, 0xf3, 0x0c,
+ 0xab, 0xb4, 0x41, 0xca, 0x57, 0xe9, 0x3b, 0x26, 0x0e, 0x1d, 0x88, 0xe7,
+ 0xff, 0xc6, 0xee, 0xd0, 0x32, 0x78, 0x11, 0xb3, 0x93, 0xfc, 0xf6, 0x80,
+ 0x8c, 0xcf, 0xf6, 0x22, 0x1b, 0x9d, 0x7d, 0x45, 0x62, 0x16, 0xf7, 0x4b,
+ 0x20, 0xd1, 0x68, 0xcd, 0xe5, 0xe0, 0xb2, 0x15, 0x11, 0xa3, 0xac, 0x0b,
+ 0x06, 0x7b, 0x2a, 0x0a, 0xa8, 0x42, 0xdd, 0x93, 0xa3, 0xf9, 0xc5, 0xa8,
+ 0xb4, 0x2e, 0x4a, 0x2d, 0xa8, 0x2b, 0xbc, 0x44, 0x44, 0xe6, 0xae, 0xe4,
+ 0xb4, 0xb2, 0x85, 0x76, 0x89, 0xf1, 0xff, 0x55, 0x5b, 0xe9, 0x36, 0xdc,
+ 0xb6, 0xa6, 0xc6, 0x0c, 0xa0, 0x27, 0x7e, 0x58, 0x74, 0xb6, 0xcd, 0x45,
+ 0xd6, 0x88, 0x2a, 0x4c, 0xd5, 0x10, 0x99, 0xeb, 0x0b, 0x8e, 0x8a, 0x4a,
+ 0xd7, 0x93, 0x6b, 0xc3, 0xde, 0x07, 0xfc, 0x8d, 0xa8, 0xcf, 0x09, 0x51,
+ 0x8d, 0xf2, 0xba, 0x26, 0x51, 0xd0, 0xba, 0xdb, 0xbb, 0x74, 0xb4, 0x9f,
+ 0x09, 0xfb, 0x85, 0x53, 0xb5, 0x72, 0xfb, 0xa7, 0x44, 0xe3, 0x95, 0x83,
+ 0x65, 0x25, 0x53, 0x87, 0x5e, 0xf1, 0xcb, 0xf6, 0xd1, 0x03, 0x71, 0xed,
+ 0x97, 0x20, 0x32, 0x77, 0x06, 0x86, 0x1b, 0x78, 0x17, 0xa0, 0x2c, 0x93,
+ 0x3c, 0xb3, 0xc5, 0xc5, 0x9b, 0x9e, 0xb8, 0x18, 0x82, 0x62, 0x35, 0x8f,
+ 0x9d, 0x13, 0x58, 0x21, 0xd5, 0xf8, 0x51, 0x43, 0x12, 0xa8, 0x26, 0xf5,
+ 0x52, 0x3c, 0x2f, 0x26, 0x5a, 0x7e, 0x21, 0x11, 0x2d, 0x29, 0x5e, 0xe8,
+ 0x67, 0x41, 0x41, 0xc9, 0x0a, 0xda, 0xe1, 0xab, 0x11, 0xcd, 0xd4, 0x8e,
+ 0x8c, 0x47, 0x49, 0x1a, 0x4b, 0x2c, 0xc7, 0x1f, 0xab, 0x2d, 0x44, 0xb0,
+ 0xa4, 0x3a, 0xd7, 0xe8, 0x0b, 0x35, 0xfc, 0x8f, 0xe0, 0x44, 0x36, 0xc8,
+ 0xe2, 0x83, 0x81, 0xbf, 0xa5, 0x38, 0x91, 0x00, 0x05, 0x85, 0xab, 0x66,
+ 0xa2, 0x92, 0xa5, 0x6d, 0xda, 0xa6, 0x11, 0xa3, 0x24, 0x8a, 0xd8, 0x4d,
+ 0x0b, 0x0a, 0x8f, 0x5b, 0x17, 0xbe, 0xe5, 0x13, 0xe7, 0xd6, 0x9b, 0xc2,
+ 0x2c, 0x32, 0xba, 0x50, 0x6a, 0xf3, 0x63, 0x7f, 0x54, 0x64, 0x27, 0x3f,
+ 0xfb, 0x6f, 0x67, 0x0a, 0x23, 0xd6, 0x66, 0xbf, 0xf3, 0x9c, 0x58, 0x25,
+ 0x33, 0xe2, 0x1c, 0x46, 0x7e, 0x0b, 0x10, 0x5d, 0xd5, 0x5e, 0x37, 0x70,
+ 0x96, 0x11, 0x3b, 0x44, 0x9e, 0x68, 0x13, 0x53, 0x21, 0x2a, 0x60, 0x63,
+ 0x17, 0xe5, 0xc5, 0x8c, 0x3e, 0xda, 0x81, 0x26, 0xb0, 0x34, 0xff, 0x93,
+ 0xaf, 0xfc, 0x5c, 0x93, 0xbd, 0x9f, 0x82, 0xf0, 0x66, 0x59, 0xb2, 0x28,
+ 0xaa, 0xd3, 0xc5, 0xfc, 0x12, 0x5f, 0x13, 0x89, 0x8d, 0x49, 0x07, 0x2d,
+ 0x7b, 0x4b, 0xc9, 0x69, 0xf5, 0xaa, 0xbf, 0x94, 0xb5, 0x1f, 0xba, 0x36,
+ 0xa4, 0x49, 0x3e, 0x50, 0xed, 0x92, 0x57, 0x66, 0x32, 0xeb, 0x06, 0xb0,
+ 0xb3, 0x5f, 0xa6, 0xcd, 0x75, 0x92, 0xa0, 0x40, 0x13, 0xe2, 0x49, 0x54,
+ 0x8c, 0x92, 0x78, 0x1f, 0x2d, 0x1b, 0x9d, 0x67, 0xec, 0x87, 0x7e, 0x94,
+ 0xb0, 0x7f, 0x17, 0xfc, 0xc2, 0xec, 0x1d, 0xd3, 0x1a, 0xd7, 0x95, 0xc1,
+ 0x97, 0x5f, 0xc2, 0xd3, 0xf5, 0x13, 0xa8, 0x0b, 0xfe, 0xa6, 0x0a, 0xf5,
+ 0xe3, 0xe0, 0xd3, 0x1d, 0x3c, 0x73, 0x07, 0xbc, 0xb8, 0xef, 0x91, 0x6f,
+ 0x78, 0x79, 0xb0, 0x29, 0xcf, 0xc1, 0xc7, 0x84, 0x49, 0x26, 0x2f, 0x12,
+ 0xb5, 0x44, 0x65, 0xb9, 0xec, 0x6a, 0x65, 0x1d, 0x00, 0x45, 0xb4, 0x96,
+ 0x6b, 0xe4, 0x88, 0x81, 0x5a, 0x4d, 0x02, 0x5b, 0x3d, 0xfb, 0x55, 0x38,
+ 0xb5, 0x77, 0x62, 0x6b, 0xbf, 0x43, 0x4f, 0x73, 0x64, 0xce, 0x72, 0x4c,
+ 0xbf, 0x19, 0xab, 0x9a, 0xf0, 0x91, 0x93, 0xc1, 0x81, 0xf5, 0xd2, 0xd6,
+ 0x4f, 0xf5, 0x11, 0xbb, 0x4e, 0xc0, 0x42, 0x06, 0x75, 0xd1, 0x0a, 0x9b,
+ 0xe6, 0xef, 0x26, 0xbc, 0xc4, 0x7f, 0x9c, 0x53, 0xe6, 0x6c, 0x44, 0xa3,
+ 0xe9, 0xce, 0x79, 0x7f, 0xca, 0xb0, 0xef, 0xea, 0xd7, 0xd2, 0x2e, 0xea,
+ 0xa2, 0x46, 0x2a, 0xf6, 0xe1, 0xda, 0x29, 0x5b, 0xdc, 0x6a, 0x1b, 0xc1,
+ 0xc3, 0x25, 0xcc, 0x70, 0x64, 0x1c, 0x60, 0x61, 0xe2, 0x27, 0x9c, 0xaa,
+ 0xe4, 0x53, 0x1f, 0xfb, 0x57, 0xc7, 0xa2, 0xf7, 0x22, 0xd9, 0x07, 0x18,
+ 0xe0, 0x3d, 0x0c, 0xf6, 0xf1, 0xed, 0x72, 0xe6, 0x28, 0xf0, 0x1d, 0x96,
+ 0xfb, 0xcb, 0xe3, 0x69, 0x6e, 0x18, 0x4a, 0x86, 0x3f, 0x5b, 0xa4, 0x09,
+ 0x78, 0x50, 0x43, 0x8c, 0xba, 0xe7, 0x07, 0xb0, 0x0d, 0x32, 0xbe, 0xb9,
+ 0x2d, 0xc6, 0x48, 0x9b, 0x86, 0x29, 0xd3, 0xa5, 0x90, 0xee, 0xb3, 0x34,
+ 0x54, 0x1c, 0x5b, 0x88, 0x78, 0xe9, 0x9f, 0x25, 0x84, 0xd2, 0x4f, 0xc2,
+ 0x36, 0xdf, 0xdb, 0xf5, 0x09, 0xd3, 0x7c, 0x77, 0x33, 0x8a, 0x18, 0xf3,
+ 0x2a, 0x1c, 0xa6, 0xc6, 0x7e, 0x12, 0x3a, 0xf3, 0xb5, 0xe5, 0xba, 0x95,
+ 0x89, 0x54, 0xe0, 0x29, 0x90, 0xca, 0xdc, 0x6a, 0xcc, 0x1e, 0x7b, 0x44,
+ 0x16, 0xcb, 0x21, 0x64, 0xb0, 0xbf, 0x57, 0xbc, 0xd9, 0x5c, 0x17, 0xa8,
+ 0xbd, 0x41, 0xfa, 0xf1, 0x0d, 0x09, 0x11, 0x7d, 0x1b, 0x35, 0x6f, 0x71,
+ 0x2c, 0x40, 0xa5, 0xa6, 0x46, 0x4a, 0xe9, 0xa8, 0xbc, 0x12, 0xd9, 0xad,
+ 0x79, 0x8c, 0x92, 0xa2, 0x85, 0xee, 0x7e, 0xf9, 0xfc, 0xc3, 0xaa, 0xfa,
+ 0x7c, 0xec, 0x95, 0xc0, 0x8a, 0x92, 0xc4, 0x60, 0x97, 0x03, 0xf2, 0xe6,
+ 0xc4, 0x80, 0xf3, 0x5f, 0x4b, 0xfb, 0x52, 0xab, 0xc5, 0x2b, 0xfb, 0xdd,
+ 0x1a, 0x1e, 0x9d, 0x0a, 0x43, 0x50, 0x26, 0x5b, 0x06, 0xf7, 0xe8, 0x16,
+ 0x3d, 0xbe, 0x87, 0x2e, 0x14, 0xfe, 0xb6, 0x99, 0x29, 0x25, 0x3d, 0x8c,
+ 0x71, 0x20, 0x3e, 0xf8, 0x2d, 0xd0, 0xda, 0x6d, 0xc1, 0x2d, 0xe5, 0xfa,
+ 0xed, 0x84, 0x6b, 0x90, 0x0a, 0x8e, 0xd6, 0x88, 0x76, 0xb6, 0xbc, 0x18,
+ 0xe9, 0x9f, 0xef, 0xad, 0x15, 0xa3, 0x30, 0x0c, 0xe6, 0x29, 0x32, 0xba,
+ 0x39, 0x32, 0xbd, 0xfb, 0x38, 0xe5, 0xda, 0x60, 0x0e, 0x38, 0x90, 0x94,
+ 0x7d, 0x3c, 0x67, 0x5a, 0x7b, 0x28, 0x08, 0xec, 0x2b, 0x86, 0xe7, 0x68,
+ 0x1e, 0xa1, 0xe3, 0x8f, 0x36, 0xb9, 0x9e, 0xc7, 0x3d, 0xb7, 0x29, 0x39,
+ 0x45, 0xe7, 0xf8, 0xa0, 0x7b, 0x4e, 0x65, 0x47, 0x1e, 0xf7, 0xce, 0x2e,
+ 0x00, 0x14, 0xec, 0x8b, 0x32, 0xcb, 0x20, 0x0c, 0xc2, 0x97, 0x10, 0x3d,
+ 0x02, 0x3e, 0x86, 0x9b, 0x51, 0x69, 0xd9, 0xdc, 0xc7, 0x93, 0x74, 0x7d,
+ 0xaf, 0x61, 0x83, 0x8a, 0x78, 0xdc, 0x46, 0x2a, 0xdb, 0x07, 0x6c, 0x17,
+ 0xaa, 0x6c, 0x05, 0x44, 0xbe, 0xd9, 0xaa, 0x0c, 0x61, 0x6b, 0x3c, 0x12,
+ 0xf8, 0xb2, 0xbc, 0x67, 0x51, 0xb7, 0xc0, 0x0a, 0x49, 0xf1, 0x0a, 0x42,
+ 0x7b, 0xbd, 0xeb, 0x86, 0xc1, 0x56, 0x99, 0x40, 0x84, 0x6d, 0x8d, 0xdd,
+ 0x24, 0xc5, 0xee, 0x8d, 0xc8, 0xc9, 0xee, 0xe9, 0xba, 0x88, 0x3d, 0xcb,
+ 0xc0, 0x32, 0x6b, 0x1a, 0xe0, 0x13, 0x25, 0x47, 0x67, 0x24, 0xd1, 0xb4,
+ 0xde, 0xaf, 0xd4, 0x71, 0x10, 0xe8, 0x66, 0x61, 0x6a, 0x22, 0x36, 0xfe,
+ 0x44, 0xbe, 0x16, 0xa0, 0xab, 0xe4, 0x43, 0x6e, 0x25, 0xf6, 0xc7, 0x9a,
+ 0xbe, 0x14, 0x3e, 0x64, 0x61, 0x7f, 0x03, 0x57, 0x58, 0xa4, 0xcd, 0xf0,
+ 0x3a, 0x6c, 0x87, 0x75, 0xc3, 0x94, 0x5d, 0x58, 0x17, 0x9d, 0xc4, 0xba,
+ 0xc2, 0x31, 0xdf, 0x84, 0x8b, 0xf6, 0x59, 0xde, 0xa8, 0x7b, 0x41, 0x74,
+ 0x68, 0xb6, 0xac, 0xff, 0x83, 0xe3, 0x56, 0x46, 0xa9, 0xbe, 0xce, 0xf1,
+ 0x49, 0x86, 0x20, 0x6d, 0x64, 0x6a, 0x07, 0xb3, 0x9a, 0xf3, 0xbb, 0xf0,
+ 0xc6, 0x31, 0x94, 0x58, 0xe5, 0x69, 0x52, 0x6c, 0xcc, 0x35, 0x7c, 0xbf,
+ 0x13, 0xd9, 0x43, 0xa6, 0xe7, 0x0a, 0x0e, 0x51, 0xba, 0xff, 0x1c, 0x63,
+ 0xb8, 0x69, 0xb7, 0x77, 0xb5, 0x6b, 0x20, 0x7b, 0xf0, 0x00, 0xf9, 0xb9,
+ 0x07, 0x34, 0xc9, 0x9d, 0x22, 0xb6, 0xd6, 0xa6, 0x52, 0x0b, 0xed, 0xea,
+ 0x50, 0x6e, 0x2e, 0x63, 0x68, 0x67, 0x4a, 0x5b, 0xff, 0xe2, 0xd2, 0xb8,
+ 0xb1, 0x2d, 0xc8, 0xcf, 0x09, 0x5e, 0x9c, 0xfd, 0xff, 0x0d, 0xe4, 0xab,
+ 0xa5, 0xbd, 0x70, 0xad, 0xb0, 0x46, 0xbe, 0xee, 0x77, 0x57, 0x13, 0x55,
+ 0x30, 0x3d, 0x76, 0x17, 0x3d, 0x8c, 0x8d, 0x3f, 0x1a, 0x1e, 0x32, 0xcd,
+ 0xc4, 0xa0, 0x5c, 0xc0, 0xe6, 0x19, 0x37, 0x6d, 0x82, 0xce, 0x05, 0xe4,
+ 0x9c, 0x74, 0x60, 0x07, 0x0f, 0x77, 0x45, 0xd9, 0x92, 0x33, 0xe8, 0x87,
+ 0xcf, 0x83, 0x2a, 0x9c, 0xc1, 0xf0, 0xc6, 0x5c, 0x8f, 0xb3, 0x51, 0x4e,
+ 0x11, 0x9e, 0xb6, 0x8a, 0xaf, 0xf9, 0x11, 0x74, 0xab, 0x8f, 0xc4, 0x39,
+ 0x62, 0x82, 0x06, 0x3c, 0x1f, 0x9a, 0xde, 0xbd, 0x33, 0xc4, 0x3b, 0x7a,
+ 0x14, 0xcb, 0x8f, 0xeb, 0x5b, 0xc6, 0x9b, 0xa4, 0x4d, 0x20, 0xef, 0x41,
+ 0xf3, 0xe5, 0x35, 0x84, 0x55, 0xaa, 0x49, 0xc1, 0x70, 0x32, 0x85, 0x94,
+ 0x4c, 0x42, 0x93, 0xfd, 0xad, 0x70, 0xeb, 0xc0, 0xed, 0x95, 0xbe, 0x2a,
+ 0xa5, 0x0b, 0x2b, 0x46, 0xe9, 0x58, 0x90, 0x5c, 0x06, 0x84, 0xc1, 0xb5,
+ 0x40, 0x42, 0x0e, 0xfa, 0xac, 0xc7, 0xcd, 0x97, 0xc8, 0x86, 0x99, 0x9a,
+ 0x83, 0x29, 0x05, 0x49, 0x28, 0x55, 0x57, 0xa0, 0x8b, 0x4b, 0xe9, 0x27,
+ 0xf4, 0x67, 0xec, 0xb0, 0xe5, 0x71, 0xca, 0x84, 0x54, 0xca, 0xba, 0x94,
+ 0x04, 0xa8, 0x65, 0xef, 0xee, 0xb1, 0x2b, 0xda, 0xb1, 0x5c, 0x30, 0x08,
+ 0x70, 0xeb, 0xc3, 0x66, 0x72, 0xb9, 0xd0, 0x75, 0xd1, 0x89, 0x92, 0x3a,
+ 0x90, 0x16, 0xc5, 0xf4, 0xac, 0xab, 0xac, 0xd3, 0x63, 0x52, 0xea, 0x27,
+ 0xa9, 0xe7, 0x0a, 0x93, 0x27, 0x55, 0xf8, 0xc8, 0x8a, 0x99, 0x7f, 0x49,
+ 0xd4, 0x48, 0x1e, 0x54, 0xf7, 0xbe, 0x07, 0x1c, 0xcc, 0x1b, 0x06, 0xcb,
+ 0xee, 0xc8, 0x47, 0xfe, 0x0c, 0xe0, 0x90, 0xa9, 0xa1, 0x31, 0x4a, 0xe0,
+ 0x2d, 0x63, 0x55, 0xd1, 0x94, 0xca, 0x83, 0xda, 0xa7, 0x9e, 0xd0, 0xc6,
+ 0x24, 0x61, 0xd7, 0xe8, 0x1f, 0x41, 0xc4, 0xb8, 0xe2, 0x4f, 0x82, 0x77,
+ 0xfc, 0x5f, 0xd7, 0xc2, 0x35, 0x0c, 0x6a, 0x35, 0x8d, 0x4f, 0x65, 0x3c,
+ 0x89, 0x23, 0xb8, 0xf3, 0x69, 0x7b, 0x0b, 0x7b, 0x0e, 0x77, 0xc7, 0x4e,
+ 0x45, 0x26, 0x06, 0x5f, 0x44, 0x0c, 0x45, 0xc0, 0xbb, 0x5c, 0xa9, 0x7f,
+ 0xc6, 0xa7, 0x04, 0x6e, 0x1b, 0x80, 0x62, 0x9a, 0xf2, 0xa1, 0xb8, 0xe3,
+ 0x3b, 0x65, 0xe8, 0x7a, 0xe9, 0xbb, 0xdc, 0xa3, 0x3a, 0x4f, 0x47, 0xa8,
+ 0x8f, 0x07, 0x2a, 0xc2, 0xbe, 0xa5, 0x81, 0xbd, 0x61, 0x9c, 0xe2, 0x6c,
+ 0xf0, 0x99, 0x2b, 0x4f, 0x5e, 0xad, 0xb5, 0x48, 0x09, 0x58, 0x9b, 0x24,
+ 0xe8, 0x69, 0xac, 0xa9, 0xe3, 0x51, 0xfc, 0xa5, 0xa4, 0x50, 0x08, 0xa7,
+ 0x99, 0xb8, 0xce, 0x6c, 0x68, 0x73, 0xda, 0x18, 0x98, 0x25, 0xbc, 0x72,
+ 0x9f, 0x61, 0x6a, 0xf7, 0xa8, 0x3c, 0xdc, 0x84, 0x93, 0x88, 0x0f, 0xe0,
+ 0xfc, 0xde, 0xcc, 0xae, 0xf4, 0x98, 0x08, 0xb5, 0x8a, 0x95, 0x4b, 0x67,
+ 0x81, 0x2c, 0x6a, 0xf8, 0x7c, 0xd3, 0x59, 0x7b, 0x09, 0xbc, 0xd4, 0xe4,
+ 0x0e, 0xb6, 0x76, 0x6c, 0x0d, 0xa0, 0xb6, 0x27, 0x98, 0x75, 0x81, 0x2e,
+ 0x18, 0xc4, 0x54, 0xcc, 0xf8, 0xe3, 0x2c, 0x2b, 0xfa, 0xc1, 0xbe, 0x49,
+ 0x5d, 0xf7, 0x45, 0xdf, 0x06, 0xc2, 0xb1, 0xc5, 0x10, 0x3a, 0x1c, 0x12,
+ 0x37, 0x14, 0xf2, 0x6c, 0xd3, 0xa7, 0x4f, 0xfd, 0x05, 0x0f, 0xda, 0x4e,
+ 0xa4, 0xef, 0x56, 0x20, 0x0f, 0x62, 0x6f, 0xcf, 0xb5, 0xe6, 0xe7, 0x75,
+ 0x77, 0x9f, 0x5a, 0xa0, 0x7e, 0x8b, 0x1d, 0x15, 0xbe, 0x12, 0xf2, 0xcf,
+ 0xe9, 0x09, 0x8b, 0xcc, 0x2b, 0xfb, 0xfd, 0xb4, 0xef, 0x38, 0xde, 0xe0,
+ 0xe6, 0x93, 0xcb, 0x17, 0x78, 0x9e, 0x53, 0xfa, 0x76, 0x22, 0x75, 0x60,
+ 0x66, 0xd8, 0x23, 0x18, 0x95, 0xd4, 0x3f, 0x6d, 0xb7, 0x6b, 0x6b, 0x39,
+ 0xde, 0x54, 0xbb, 0x14, 0xe8, 0x73, 0x3f, 0x22, 0x6e, 0xca, 0x1d, 0x40,
+ 0x62, 0x70, 0x91, 0xc9, 0x45, 0xea, 0xe9, 0x3e, 0xfb, 0xd0, 0xa5, 0xb5,
+ 0x07, 0xd0, 0x45, 0x93, 0x6c, 0x55, 0x55, 0xdc, 0x2f, 0xbd, 0x27, 0x9a,
+ 0x13, 0xc5, 0xa5, 0x08, 0x2c, 0x26, 0x58, 0x73, 0x64, 0xf0, 0xf5, 0x27,
+ 0x2a, 0x72, 0xec, 0x07, 0xdc, 0xf3, 0xd1, 0x85, 0x67, 0xfb, 0xf7, 0x0e,
+ 0x19, 0xf5, 0xf0, 0x7d, 0x63, 0xac, 0x51, 0xbe, 0x87, 0x22, 0x00, 0xba,
+ 0x35, 0x56, 0x72, 0xc3, 0x4a, 0xa1, 0x0c, 0x03, 0xe5, 0x8d, 0xcc, 0x21,
+ 0x69, 0x8d, 0xe0, 0x54, 0x8f, 0x97, 0x4c, 0x07, 0x99, 0xef, 0x46, 0xf0,
+ 0x94, 0xea, 0x59, 0x54, 0x01, 0xa9, 0xcd, 0xbf, 0x48, 0x63, 0x99, 0x7d,
+ 0x53, 0x08, 0x03, 0xfa, 0x63, 0xb6, 0x2f, 0xcb, 0x41, 0xff, 0x83, 0x66,
+ 0xea, 0x45, 0x8b, 0x20, 0x0d, 0xb3, 0xa6, 0x29, 0x67, 0x56, 0x94, 0x07,
+ 0x58, 0x05, 0x72, 0x62, 0x79, 0xfa, 0xc6, 0x47, 0x96, 0xee, 0x65, 0x0b,
+ 0xbd, 0xcc, 0x54, 0x70, 0xaf, 0x44, 0x05, 0xfa, 0x1a, 0x09, 0xdd, 0xf4,
+ 0xf8, 0x9b, 0xad, 0xb2, 0x68, 0xe4, 0xf6, 0x87, 0x92, 0x5d, 0xcb, 0xc7,
+ 0xbb, 0x73, 0x99, 0xe8, 0x82, 0x4c, 0x91, 0x26, 0x66, 0xed, 0x10, 0x79,
+ 0xe0, 0x63, 0x8b, 0x45, 0xd9, 0x10, 0x68, 0x9e, 0xe6, 0x68, 0xee, 0x11,
+ 0x40, 0xdb, 0x02, 0x26, 0xa0, 0x07, 0xca, 0x7f, 0x07, 0x94, 0xca, 0x97,
+ 0x7e, 0x03, 0xf1, 0x13, 0x81, 0x3a, 0xe3, 0x94, 0xc8, 0x4c, 0x1f, 0xe7,
+ 0xda, 0x2f, 0xef, 0x7e, 0x18, 0x97, 0xbf, 0x51, 0x07, 0x16, 0x18, 0x08,
+ 0x15, 0x6b, 0x8a, 0xdc, 0xab, 0xb9, 0xb7, 0xce, 0x5c, 0x2c, 0x78, 0x4b,
+ 0x58, 0xc3, 0xe0, 0xde, 0x4d, 0x9d, 0x3e, 0x3d, 0xb9, 0xe5, 0x81, 0xb0,
+ 0x0c, 0xe2, 0x1a, 0xfe, 0xbe, 0x13, 0x0b, 0x45, 0x7e, 0x0f, 0xb1, 0x31,
+ 0xaa, 0x8d, 0x72, 0xbc, 0x99, 0xcb, 0x87, 0xe9, 0x20, 0x84, 0x83, 0xd0,
+ 0xb0, 0x2c, 0x39, 0x3e, 0xa9, 0x5e, 0x6c, 0x38, 0x3b, 0x52, 0x01, 0xde,
+ 0x26, 0x9d, 0x15, 0xec, 0x5e, 0x6b, 0x0b, 0x43, 0x8e, 0x1b, 0xdb, 0x36,
+ 0xfa, 0x02, 0x80, 0x68, 0x7e, 0x3e, 0xb5, 0x75, 0x4b, 0xae, 0xf0, 0x10,
+ 0xfa, 0x9b, 0x75, 0xa9, 0xa3, 0x82, 0xf1, 0x26, 0x3c, 0x8c, 0x35, 0x41,
+ 0x8b, 0x9c, 0x95, 0x66, 0x22, 0x8b, 0xa5, 0xaf, 0xe6, 0x91, 0xcb, 0x69,
+ 0x5f, 0x27, 0xe1, 0x3e, 0x80, 0x35, 0xac, 0xc7, 0xb2, 0xed, 0x13, 0xfc,
+ 0x20, 0xa8, 0x12, 0x6c, 0x0c, 0x50, 0xd3, 0xdb, 0xf7, 0xfe, 0x29, 0x64,
+ 0xb6, 0x76, 0xda, 0xc9, 0x63, 0x80, 0x37, 0x99, 0x50, 0x26, 0x2b, 0xe4,
+ 0x01, 0x55, 0xc6, 0x1c, 0xfa, 0x02, 0x94, 0xc2, 0x2d, 0x7d, 0xd6, 0x44,
+ 0x0c, 0x70, 0x4d, 0x8d, 0x6a, 0x14, 0x48, 0x9e, 0x52, 0x05, 0x1e, 0xf4,
+ 0x90, 0x68, 0xb3, 0xef, 0x7d, 0x3a, 0x66, 0x65, 0x46, 0x53, 0x91, 0x4a,
+ 0x31, 0x21, 0xa0, 0xed, 0xba, 0xf2, 0xff, 0x6e, 0x0f, 0x50, 0x86, 0x93,
+ 0x1c, 0x92, 0xa3, 0x45, 0x61, 0xe2, 0x17, 0xaa, 0xa6, 0x64, 0x4e, 0x4f,
+ 0xc3, 0x29, 0x9f, 0x15, 0x63, 0x75, 0x23, 0x01, 0xee, 0x50, 0x12, 0x89,
+ 0x08, 0x3f, 0x9a, 0x6f, 0x95, 0x37, 0x5d, 0x06, 0x23, 0x53, 0x6e, 0x64,
+ 0xa9, 0x29, 0xbc, 0x1a, 0x9b, 0xee, 0x17, 0x72, 0x54, 0x87, 0x4f, 0xc4,
+ 0x39, 0xb3, 0xa4, 0x0d, 0x52, 0x7a, 0x9b, 0xa2, 0x3a, 0xfc, 0x5a, 0xa1,
+ 0xd4, 0xda, 0x30, 0x05, 0xf4, 0x2c, 0x40, 0xb9, 0x61, 0x37, 0x83, 0xd8,
+ 0x0b, 0x71, 0xd4, 0x80, 0x9b, 0x5a, 0x07, 0x83, 0x80, 0xe3, 0xda, 0x61,
+ 0x82, 0x3d, 0x99, 0x35, 0x5c, 0x0f, 0x5d, 0x01, 0x16, 0x75, 0x79, 0x57,
+ 0xd6, 0x75, 0x86, 0x85, 0xfc, 0xb2, 0x7a, 0xfd, 0x82, 0x7e, 0x8e, 0x45,
+ 0x80, 0x01, 0xe2, 0x50, 0x14, 0xec, 0x5e, 0x74, 0x10, 0x35, 0x2f, 0xa9,
+ 0x47, 0x78, 0x1e, 0xc0, 0xe0, 0x2d, 0x00, 0xef, 0x27, 0xf1, 0x81, 0x62,
+ 0x88, 0x2f, 0x2e, 0x39, 0x14, 0x23, 0xb7, 0x76, 0x6e, 0x5a, 0xd2, 0xd4,
+ 0x71, 0x1a, 0x37, 0x8e, 0x96, 0x5f, 0x8f, 0x39, 0xef, 0x61, 0x77, 0xfb,
+ 0x73, 0x10, 0xc8, 0xef, 0xff, 0x65, 0x2e, 0xaa, 0xc6, 0xb0, 0x82, 0xe1,
+ 0xea, 0x2d, 0x6e, 0x18, 0x3f, 0x45, 0x40, 0x52, 0x5b, 0xcf, 0x3a, 0xc4,
+ 0x83, 0x69, 0x16, 0x86, 0x23, 0xb8, 0xd6, 0xc7, 0x83, 0x9a, 0x05, 0x57,
+ 0x9f, 0x21, 0x8e, 0x11, 0x39, 0x55, 0x8a, 0xa7, 0x5b, 0xc6, 0xdd, 0x79,
+ 0x1d, 0x2f, 0x93, 0x82, 0x5c, 0x6a, 0xc1, 0x65, 0x2d, 0x14, 0x14, 0xd4,
+ 0x02, 0xc6, 0x45, 0xba, 0x25, 0xee, 0x2b, 0x23, 0x55, 0xf5, 0x78, 0x1a,
+ 0x04, 0x1c, 0xe9, 0x06, 0x72, 0x75, 0xda, 0x03, 0xfd, 0x5d, 0xf0, 0x75,
+ 0xfe, 0xbd, 0xb2, 0x23, 0x1f, 0x8f, 0x7d, 0xeb, 0xf3, 0x14, 0x2a, 0xbb,
+ 0xd1, 0x4f, 0x96, 0xbe, 0x9e, 0xf5, 0xbe, 0x83, 0x1e, 0x94, 0x3b, 0x73,
+ 0xdf, 0x39, 0x0a, 0x6e, 0x1a, 0x36, 0xcc, 0xe3, 0xc0, 0x30, 0xa1, 0x34,
+ 0x02, 0xc9, 0xd6, 0x88, 0x81, 0x50, 0xea, 0x77, 0xff, 0xe3, 0xa2, 0x13,
+ 0xdc, 0x8a, 0xa4, 0xca, 0xdd, 0xa2, 0xde, 0x83, 0x38, 0xca, 0x85, 0xe1,
+ 0x1a, 0x6b, 0x82, 0x91, 0xa4, 0x84, 0x79, 0x27, 0x98, 0xae, 0x44, 0x63,
+ 0x49, 0x9b, 0xd8, 0x45, 0x77, 0x3b, 0xa5, 0x21, 0xe0, 0xb4, 0xae, 0x93,
+ 0x06, 0x38, 0xd6, 0x13, 0x6e, 0xa0, 0xb3, 0x67, 0xfd, 0xeb, 0x5a, 0xe0,
+ 0x6a, 0x9e, 0xa1, 0x39, 0x5e, 0x16, 0x7f, 0x7e, 0xee, 0x97, 0x7e, 0x67,
+ 0x2d, 0x6d, 0x7e, 0xa2, 0x6a, 0x39, 0xd6, 0xd3, 0xba, 0x2c, 0xa8, 0x50,
+ 0x03, 0x1b, 0xf8, 0x25, 0x4c, 0x03, 0x0e, 0xe6, 0x8d, 0x6e, 0xb4, 0xdb,
+ 0x0e, 0xcc, 0xb3, 0x31, 0xe7, 0x55, 0x91, 0xee, 0x5e, 0xc0, 0x52, 0x79,
+ 0x12, 0x06, 0xb3, 0x67, 0x51, 0xb3, 0xbe, 0x0a, 0xfa, 0x58, 0x28, 0x46,
+ 0x96, 0xac, 0x06, 0x17, 0xd0, 0xf1, 0xa0, 0x8c, 0x52, 0x5a, 0xa3, 0x8c,
+ 0x6f, 0xbd, 0x79, 0x91, 0xf8, 0x43, 0xdd, 0x46, 0x1e, 0xe2, 0x51, 0xb5,
+ 0x10, 0xba, 0x3f, 0x70, 0xf5, 0x78, 0x7f, 0x45, 0x1d, 0xea, 0xc9, 0x71,
+ 0xe1, 0xe3, 0xd1, 0x6b, 0xb7, 0xb6, 0xc7, 0x8a, 0x42, 0xbd, 0xe1, 0xa0,
+ 0x3e, 0x31, 0x1b, 0x05, 0xb9, 0xe8, 0xb9, 0xfa, 0xc7, 0xb3, 0xd8, 0x2e,
+ 0x7a, 0x9d, 0x61, 0x73, 0xcf, 0x43, 0x3b, 0x32, 0xaa, 0x6d, 0xda, 0x6f,
+ 0x2f, 0xce, 0x40, 0x9b, 0x60, 0xdc, 0xac, 0x6a, 0x37, 0xd6, 0x20, 0xee,
+ 0x80, 0xee, 0xdf, 0xc2, 0xd8, 0x4d, 0x25, 0x8e, 0x5b, 0x54, 0xee, 0x9b,
+ 0x99, 0x77, 0xd3, 0x70, 0xba, 0x6d, 0xde, 0x08, 0x0a, 0x04, 0xde, 0x1d,
+ 0xfb, 0x86, 0x63, 0x08, 0x70, 0x93, 0x47, 0x09, 0x06, 0x49, 0xce, 0x79,
+ 0x73, 0x9f, 0xd8, 0xd2, 0x4f, 0xca, 0xc3, 0x25, 0xb0, 0xb0, 0x94, 0x36,
+ 0xb5, 0x00, 0x3d, 0xf8, 0xab, 0x2a, 0x2e, 0xe4, 0x24, 0x73, 0x1f, 0xfc,
+ 0xae, 0xa2, 0x0b, 0x47, 0x17, 0xb3, 0x51, 0xe6, 0x4d, 0xdd, 0xb5, 0x3e,
+ 0x65, 0x92, 0x3f, 0xd4, 0xb3, 0x50, 0x56, 0xf8, 0x73, 0x00, 0x92, 0x93,
+ 0x3b, 0x6d, 0x6a, 0x97, 0xe5, 0x70, 0x64, 0xf0, 0x52, 0x12, 0x5f, 0x9a,
+ 0xfe, 0xba, 0x82, 0x99, 0x9d, 0x3f, 0xca, 0xca, 0x6e, 0x41, 0xcf, 0xfa,
+ 0x64, 0xa8, 0x4f, 0xe2, 0x68, 0xd0, 0x3b, 0x09, 0xd9, 0x5c, 0x01, 0x0c,
+ 0xd1, 0x6a, 0xa5, 0xd6, 0x7a, 0xcc, 0xa6, 0x60, 0x28, 0xb3, 0xbf, 0xfa,
+ 0xd1, 0x6e, 0x3d, 0x8b, 0xf7, 0x0a, 0x6b, 0xe7, 0x50, 0x31, 0x3c, 0x1e,
+ 0x16, 0x04, 0x29, 0x01, 0x51, 0x81, 0x9d, 0x67, 0x9d, 0x14, 0x69, 0xfb,
+ 0xd2, 0x52, 0x95, 0x98, 0x12, 0x6b, 0xc5, 0x8e, 0x42, 0xfa, 0x32, 0xff,
+ 0xc3, 0xa6, 0x30, 0x72, 0x95, 0x88, 0xa8, 0x2d, 0x7b, 0xdb, 0x36, 0x7b,
+ 0x1a, 0x8b, 0x2d, 0x09, 0x12, 0xb2, 0xe7, 0x49, 0x5c, 0x27, 0x60, 0x01,
+ 0xd6, 0xe0, 0x86, 0x89, 0xa6, 0x30, 0x89, 0x16, 0x6d, 0xc0, 0x8a, 0x59,
+ 0xb0, 0xa9, 0x41, 0xf7, 0x50, 0x6a, 0x6b, 0x6c, 0x1c, 0x92, 0xfd, 0x6e,
+ 0xae, 0x94, 0x4e, 0xee, 0x17, 0x77, 0xd7, 0xd4, 0x49, 0x02, 0x21, 0xeb,
+ 0x5b, 0x4c, 0xe2, 0xf0, 0x43, 0x4d, 0x7c, 0x56, 0x22, 0xb4, 0x0a, 0x26,
+ 0xd1, 0x03, 0xb6, 0x46, 0x55, 0x98, 0x4b, 0x6c, 0x71, 0xa8, 0x56, 0xea,
+ 0x7a, 0x0d, 0x48, 0x70, 0x06, 0x5b, 0xd4, 0x69, 0x91, 0xbb, 0x37, 0x93,
+ 0xea, 0x46, 0xfd, 0xd0, 0xab, 0xbf, 0xdd, 0xda, 0xc8, 0xb2, 0xba, 0x4e,
+ 0x7e, 0xc5, 0x76, 0x23, 0xf1, 0x72, 0xa1, 0x73, 0x59, 0xc2, 0x56, 0x9a,
+ 0x77, 0x20, 0x2d, 0xb7, 0x20, 0x9f, 0x23, 0x7f, 0x2b, 0x7c, 0x14, 0x67,
+ 0x95, 0xd0, 0x1b, 0x40, 0x40, 0xf9, 0xf2, 0x8f, 0x03, 0x5d, 0xcf, 0xbd,
+ 0x69, 0x02, 0x52, 0x3b, 0x3b, 0x09, 0x12, 0x56, 0x7e, 0xb9, 0x4e, 0x21,
+ 0x3f, 0x25, 0x13, 0x17, 0x91, 0x78, 0xda, 0xa2, 0x03, 0x70, 0xa2, 0xae,
+ 0x4f, 0x93, 0xbd, 0x9c, 0x59, 0xb4, 0x18, 0x87, 0xe1, 0xe8, 0x3b, 0xeb,
+ 0x39, 0x7f, 0x31, 0x20, 0x8a, 0x74, 0x19, 0x9b, 0x6c, 0x3e, 0x66, 0xde,
+ 0xe4, 0x10, 0x45, 0x8f, 0x2a, 0xf5, 0x18, 0x5e, 0x37, 0xe5, 0x44, 0xc9,
+ 0x0d, 0xa6, 0x11, 0x87, 0x06, 0x71, 0xbc, 0x4b, 0x58, 0x5b, 0x12, 0x0b,
+ 0x2b, 0x10, 0x2b, 0xe4, 0x4d, 0x58, 0xd1, 0x5f, 0x54, 0x7c, 0x3e, 0x69,
+ 0xad, 0xac, 0x01, 0xed, 0xf0, 0x42, 0xa5, 0x89, 0x1c, 0x72, 0x51, 0xf3,
+ 0x95, 0x8d, 0xf2, 0xe0, 0xa1, 0x95, 0x5a, 0x77, 0x51, 0x38, 0x26, 0xc9,
+ 0x2c, 0xea, 0x51, 0x06, 0xae, 0xf1, 0x40, 0xcf, 0x71, 0x53, 0xd6, 0x02,
+ 0x2d, 0xdf, 0xbb, 0x4f, 0xb3, 0xcb, 0x14, 0xb2, 0x9f, 0xb8, 0x5a, 0x39,
+ 0x96, 0xa2, 0x3c, 0xf7, 0xfb, 0x4c, 0x64, 0xca, 0x64, 0x7c, 0x26, 0x0c,
+ 0x6b, 0x27, 0xe4, 0xe7, 0xed, 0x33, 0x0d, 0xd2, 0x86, 0x81, 0x67, 0x12,
+ 0xd5, 0x13, 0x09, 0x6c, 0x2c, 0x97, 0x06, 0x7a, 0x07, 0xb3, 0x1f, 0x99,
+ 0xca, 0xc4, 0x97, 0x45, 0x14, 0xe9, 0x34, 0x9e, 0xac, 0x5a, 0xf7, 0x85,
+ 0x8f, 0x67, 0x28, 0x3e, 0x2a, 0xc4, 0x6c, 0x34, 0x25, 0x76, 0x70, 0xb7,
+ 0x41, 0x68, 0x24, 0xbb, 0xf7, 0x4b, 0x87, 0xf2, 0x71, 0xf2, 0xf0, 0x0c,
+ 0xc6, 0x8a, 0x63, 0x7e, 0x5a, 0x22, 0x73, 0xdc, 0xd4, 0xd6, 0xa8, 0x31,
+ 0xa5, 0x6f, 0x62, 0xc4, 0xc5, 0x6f, 0x5c, 0xee, 0x51, 0xe1, 0x1c, 0x91,
+ 0x27, 0x00, 0x6b, 0x72, 0x7d, 0x74, 0xa8, 0xb4, 0x5b, 0xf2, 0x90, 0xa6,
+ 0x42, 0x47, 0xcc, 0x41, 0x13, 0x6e, 0x10, 0xba, 0x44, 0x32, 0x33, 0x18,
+ 0x6f, 0xd6, 0x9a, 0xe9, 0x17, 0xf0, 0x35, 0xa2, 0x2f, 0xa0, 0xb2, 0x1b,
+ 0xed, 0x12, 0x67, 0x1a, 0x78, 0xb1, 0xc6, 0x63, 0x2b, 0x99, 0xa3, 0x99,
+ 0xb5, 0x75, 0x50, 0xdc, 0xf4, 0xd6, 0x19, 0xb2, 0xd7, 0x5f, 0xba, 0xfc,
+ 0xd3, 0xb1, 0x1b, 0x9d, 0x3c, 0xe1, 0x38, 0x51, 0xd5, 0x65, 0x85, 0xd4,
+ 0xc9, 0x56, 0x4a, 0xc0, 0x9e, 0x07, 0x2a, 0xb9, 0x64, 0x76, 0x4a, 0x0b,
+ 0x24, 0x42, 0xd2, 0x40, 0xca, 0x5c, 0x10, 0xdb, 0x55, 0xd8, 0xfe, 0x8f,
+ 0x2a, 0x1f, 0x22, 0x42, 0xe0, 0xe0, 0x52, 0xd2, 0xd8, 0xdf, 0xd6, 0x0e,
+ 0xb4, 0x9f, 0xa5, 0x5f, 0x2a, 0x5f, 0x88, 0x97, 0x5f, 0x88, 0x70, 0x4d,
+ 0xcc, 0x3e, 0x81, 0x80, 0x41, 0x88, 0x70, 0x19, 0xb9, 0xfa, 0xa1, 0x43,
+ 0xd0, 0x88, 0xed, 0x68, 0xc5, 0x65, 0x63, 0xb4, 0x54, 0x0d, 0x69, 0x03,
+ 0xb0, 0x6e, 0xc9, 0xc1, 0xdc, 0x28, 0xdd, 0x4a, 0x7d, 0xb0, 0x43, 0xf6,
+ 0x53, 0x68, 0xb4, 0xf8, 0x15, 0x43, 0x54, 0xa8, 0xc0, 0x5f, 0x63, 0xde,
+ 0xf0, 0x94, 0xc0, 0x17, 0xed, 0x7c, 0x3e, 0x16, 0xca, 0xc5, 0xa8, 0x0f,
+ 0x24, 0xf7, 0xa7, 0xb1, 0x4e, 0x31, 0x8c, 0x17, 0x39, 0x6d, 0xad, 0x69,
+ 0xb0, 0x4f, 0x6c, 0xf5, 0xc4, 0xcb, 0x59, 0x05, 0x30, 0x67, 0xa5, 0x71,
+ 0xa9, 0xf3, 0x23, 0xa4, 0x23, 0x2d, 0xea, 0x34, 0x4f, 0x4b, 0x21, 0xda,
+ 0xee, 0x33, 0x63, 0x19, 0x8c, 0x33, 0xcc, 0xa8, 0x59, 0xba, 0x5b, 0xd3,
+ 0x48, 0x6c, 0x24, 0x61, 0xdc, 0x0f, 0x87, 0xd7, 0x92, 0x8a, 0x59, 0xc0,
+ 0x25, 0xdc, 0xcb, 0x4d, 0x08, 0xa0, 0xb9, 0x8e, 0xdd, 0xd5, 0xca, 0x32,
+ 0x95, 0xeb, 0x22, 0xa9, 0x6d, 0x34, 0x7d, 0x98, 0x3d, 0xea, 0x38, 0x6a,
+ 0x4a, 0xc7, 0xbc, 0x0a, 0xe5, 0xa0, 0x97, 0x93, 0xe6, 0x61, 0xa9, 0x5e,
+ 0x43, 0xcb, 0x2b, 0xb4, 0x0a, 0xf7, 0xc5, 0x5d, 0x9e, 0xaf, 0xdf, 0x52,
+ 0x99, 0x65, 0x5c, 0x31, 0xec, 0xb6, 0x88, 0xec, 0xa7, 0x96, 0xcf, 0x64,
+ 0x17, 0x68, 0x9d, 0x1b, 0x6d, 0x9e, 0x4a, 0xdf, 0xae, 0x79, 0x0e, 0x39,
+ 0x72, 0x89, 0xb2, 0x99, 0x53, 0x9e, 0x12, 0x16, 0xc4, 0xfc, 0x71, 0xc3,
+ 0x96, 0x4d, 0x0e, 0x02, 0x1d, 0xf7, 0xf9, 0x20, 0xfe, 0x2d, 0xdb, 0xdf,
+ 0x10, 0x0b, 0x5a, 0x9b, 0xda, 0x46, 0xc8, 0xe9, 0xa5, 0x34, 0xad, 0x38,
+ 0x4b, 0xe9, 0x08, 0x11, 0xfd, 0xc7, 0xb9, 0x52, 0xbd, 0x31, 0x2f, 0x9b,
+ 0xdf, 0xf5, 0x0b, 0x79, 0xe1, 0x2c, 0x7a, 0xe8, 0xcd, 0x35, 0xa5, 0xf9,
+ 0x3b, 0x76, 0x86, 0xcf, 0x46, 0xf7, 0x2a, 0x6b, 0xec, 0x24, 0xed, 0x82,
+ 0x29, 0xee, 0xd3, 0x0f, 0xd0, 0x1b, 0xa3, 0xfd, 0x55, 0xa3, 0x57, 0x49,
+ 0xe0, 0x32, 0x32, 0xbe, 0x44, 0x05, 0x0b, 0x99, 0x04, 0x5c, 0xd5, 0xde,
+ 0x75, 0x6d, 0xcd, 0xf4, 0xc0, 0x28, 0x96, 0xa1, 0xd9, 0x0c, 0xb3, 0xc9,
+ 0x16, 0x3c, 0x44, 0x91, 0xd2, 0xab, 0xf2, 0x3d, 0x52, 0x0a, 0xaa, 0xf3,
+ 0x72, 0xb8, 0x81, 0x8c, 0x1f, 0xdc, 0x29, 0x86, 0x7e, 0x48, 0x6d, 0x39,
+ 0xa9, 0x92, 0xd9, 0x51, 0x44, 0x0e, 0x96, 0x46, 0xce, 0xf9, 0x6a, 0xfa,
+ 0xd1, 0xb5, 0xc8, 0xa3, 0xac, 0x97, 0xdf, 0x94, 0xa0, 0x10, 0xfc, 0x65,
+ 0xa6, 0xcf, 0x54, 0x27, 0x16, 0xca, 0xa8, 0xad, 0xee, 0x68, 0xf6, 0x13,
+ 0x12, 0x2b, 0x46, 0x78, 0xe4, 0x7a, 0x27, 0xa4, 0x38, 0x77, 0xdf, 0x35,
+ 0x08, 0x98, 0x11, 0x78, 0x67, 0xde, 0xd0, 0xb2, 0x1f, 0x67, 0xe3, 0x09,
+ 0xf6, 0xc9, 0xf4, 0xc8, 0x40, 0xb8, 0x69, 0x3b, 0xdb, 0x5c, 0xad, 0x87,
+ 0xcc, 0x46, 0xb2, 0xc4, 0x3e, 0x91, 0x57, 0xec, 0xe0, 0x23, 0x9a, 0x99,
+ 0x83, 0x73, 0x01, 0x40, 0x6e, 0x52, 0x73, 0xfa, 0x57, 0x62, 0xa8, 0x2f,
+ 0xab, 0x8a, 0x0f, 0xf5, 0x6c, 0xde, 0x79, 0x19, 0xae, 0x03, 0x46, 0xc2,
+ 0xc5, 0x3b, 0x8c, 0xa9, 0x79, 0x3d, 0xe4, 0xb2, 0x04, 0x3a, 0x96, 0xd9,
+ 0x0c, 0x9c, 0x78, 0xa6, 0x3e, 0x43, 0x05, 0x3e, 0x2d, 0x02, 0xa9, 0xec,
+ 0xc4, 0xa7, 0x4d, 0x6e, 0x56, 0x6b, 0x55, 0x14, 0x4d, 0x1b, 0x87, 0x7e,
+ 0xf1, 0x92, 0x6e, 0xe2, 0x3e, 0x41, 0x06, 0xc7, 0x8a, 0xe2, 0x9e, 0x7b,
+ 0xc6, 0x2f, 0x88, 0xc3, 0xa1, 0x84, 0xe1, 0x0a, 0xff, 0x94, 0xa2, 0xcd,
+ 0xd1, 0x93, 0xaf, 0x5c, 0x39, 0x81, 0x90, 0x6f, 0x43, 0x34, 0x26, 0xeb,
+ 0x72, 0x0f, 0x99, 0x07, 0xe2, 0xf8, 0xaa, 0xb9, 0x57, 0x36, 0xbc, 0xe9,
+ 0x7d, 0xa9, 0x9e, 0x19, 0xf5, 0x46, 0x3c, 0x18, 0x58, 0xdf, 0x23, 0xa2,
+ 0x87, 0x89, 0x5e, 0xd6, 0x91, 0x5d, 0xeb, 0x1f, 0x95, 0x6d, 0x3f, 0x8a,
+ 0xde, 0x5b, 0x5a, 0x9f, 0xd3, 0xf8, 0xab, 0xf8, 0x87, 0x77, 0xd4, 0xf1,
+ 0x44, 0xa5, 0x59, 0x93, 0x45, 0xdc, 0x67, 0xeb, 0x20, 0x94, 0x6b, 0x4c,
+ 0x44, 0xdf, 0x02, 0xe9, 0x4f, 0x72, 0x83, 0x5f, 0x90, 0x06, 0x6c, 0x41,
+ 0x56, 0x78, 0xb2, 0x51, 0x33, 0xc6, 0x70, 0xa9, 0x7a, 0x64, 0xe0, 0xb1,
+ 0xd6, 0x24, 0xdc, 0x75, 0xc6, 0xea, 0x5d, 0xcf, 0x2c, 0x2e, 0xc8, 0x50,
+ 0x43, 0x9c, 0x3c, 0x6c, 0xc8, 0x6c, 0x5b, 0xff, 0xdf, 0x1a, 0x47, 0x82,
+ 0x6e, 0xde, 0x23, 0x16, 0xca, 0x57, 0xa9, 0xfb, 0xe5, 0xb1, 0xf9, 0xff,
+ 0x53, 0xde, 0xa7, 0x15, 0xf6, 0x13, 0x18, 0xf9, 0x1f, 0x33, 0xd5, 0xad,
+ 0xf8, 0x0a, 0x0a, 0x0c, 0x2d, 0xc0, 0xd3, 0xbc, 0xc0, 0xa5, 0xe3, 0x95,
+ 0xb5, 0xf9, 0x76, 0xda, 0xb2, 0x12, 0xfa, 0x83, 0x65, 0xb6, 0x0a, 0x14,
+ 0x65, 0x8e, 0x75, 0x4b, 0x88, 0x71, 0x97, 0xb3, 0xcc, 0x2c, 0x91, 0x0d,
+ 0xbe, 0x98, 0x92, 0xca, 0x73, 0xe8, 0x0f, 0xe0, 0x58, 0x76, 0x03, 0x24,
+ 0xa0, 0x17, 0xc6, 0x35, 0x2f, 0x75, 0x7f, 0x88, 0x12, 0xa6, 0x36, 0x59,
+ 0x05, 0x72, 0x1f, 0xe1, 0x9c, 0x34, 0x70, 0xf0, 0x16, 0xe8, 0x6e, 0xe3,
+ 0x2d, 0xc9, 0x50, 0x49, 0x50, 0xb0, 0x51, 0xd9, 0x62, 0xf1, 0x0f, 0x2a,
+ 0x77, 0x69, 0x8d, 0x53, 0x39, 0x6b, 0xa4, 0xfd, 0xe1, 0xd0, 0x76, 0x67,
+ 0x62, 0x74, 0x0e, 0xc7, 0x3d, 0xf3, 0x3c, 0xee, 0xbb, 0xd9, 0x56, 0x42,
+ 0x90, 0xf5, 0xd1, 0x6f, 0xf7, 0x13, 0xd6, 0xdc, 0x5e, 0xd6, 0x7b, 0x9c,
+ 0x4a, 0x63, 0x78, 0x56, 0xd2, 0x03, 0xa2, 0x33, 0xb1, 0x5e, 0x54, 0xba,
+ 0xb3, 0x5c, 0xd4, 0xd2, 0x30, 0xb4, 0x59, 0x80, 0xe7, 0xeb, 0xd9, 0x4b,
+ 0xa8, 0x1d, 0x35, 0xd2, 0x33, 0x67, 0x6a, 0xc8, 0x3e, 0x71, 0x4c, 0xc2,
+ 0x8b, 0xe2, 0x56, 0x1c, 0x0a, 0xec, 0xb8, 0xb8, 0xe4, 0xef, 0x22, 0xcd,
+ 0xb9, 0xf7, 0x5b, 0xba, 0x3b, 0xf1, 0xb9, 0xba, 0xdb, 0xe7, 0xc7, 0xae,
+ 0x0f, 0x9f, 0xa5, 0x79, 0x4c, 0x84, 0x25, 0x2c, 0x50, 0x65, 0x64, 0x01,
+ 0x7c, 0xe4, 0xc3, 0xd5, 0x81, 0xe6, 0x06, 0x6f, 0x1e, 0x79, 0x3b, 0x2a,
+ 0x9f, 0x8e, 0x09, 0xb8, 0xab, 0x3b, 0xa7, 0xce, 0x17, 0x70, 0x64, 0x29,
+ 0xa3, 0x72, 0x0f, 0x61, 0x75, 0x77, 0xd1, 0xd7, 0x0d, 0x62, 0xc9, 0xad,
+ 0xe1, 0x19, 0xd9, 0x49, 0x0a, 0x49, 0x88, 0x34, 0xa2, 0xa6, 0x1a, 0x3d,
+ 0x1d, 0xd2, 0x95, 0x63, 0x88, 0x84, 0xaf, 0x92, 0x41, 0x50, 0x63, 0x6b,
+ 0x15, 0x13, 0xda, 0x65, 0xd6, 0x47, 0x3d, 0xf0, 0x7c, 0x7e, 0xa1, 0xe4,
+ 0x10, 0x63, 0xa3, 0xa3, 0xf5, 0x9d, 0x4f, 0xac, 0xb9, 0x48, 0x92, 0x37,
+ 0xcc, 0x6f, 0xc3, 0xfe, 0x55, 0xf1, 0xd5, 0x94, 0x4d, 0xf6, 0x5b, 0x49,
+ 0x5d, 0xbb, 0xc2, 0x2e, 0xd4, 0x2f, 0x2b, 0xe1, 0x08, 0xa1, 0x4c, 0x48,
+ 0xce, 0xf8, 0x3b, 0x56, 0x2d, 0xe6, 0xa3, 0xa0, 0xd1, 0xf8, 0xfc, 0x16,
+ 0x30, 0xd1, 0xaa, 0xbd, 0x7f, 0x95, 0xe4, 0xe5, 0x74, 0xe6, 0x34, 0x74,
+ 0xe1, 0x6d, 0xc9, 0xb4, 0xc3, 0x8f, 0xae, 0x04, 0xd9, 0x11, 0xd1, 0x26,
+ 0xdd, 0x46, 0x89, 0x1f, 0xf0, 0x78, 0xa6, 0x1d, 0xa0, 0xa1, 0x38, 0x23,
+ 0x33, 0xb1, 0x39, 0xde, 0x7b, 0x54, 0x51, 0xa4, 0xf4, 0x94, 0xe8, 0x47,
+ 0xac, 0xa9, 0xbe, 0xf7, 0x34, 0xad, 0x21, 0x32, 0xe6, 0x1a, 0x81, 0xf4,
+ 0x0d, 0x27, 0x7e, 0x64, 0x14, 0x66, 0xcb, 0x56, 0xff, 0x00, 0xcc, 0xf4,
+ 0x73, 0x54, 0xba, 0xe1, 0x27, 0x42, 0xbb, 0x8b, 0xce, 0x38, 0x2d, 0xc1,
+ 0x76, 0x05, 0xe6, 0x99, 0x03, 0x8d, 0x23, 0xd7, 0x9b, 0xa0, 0x7d, 0x13,
+ 0xdb, 0xba, 0xc7, 0x81, 0x81, 0x3c, 0x37, 0xba, 0x16, 0x23, 0x7e, 0x32,
+ 0x4e, 0xac, 0xaa, 0xf5, 0x67, 0xed, 0x43, 0xc3, 0x42, 0x80, 0xae, 0x54,
+ 0x1f, 0xc2, 0xa2, 0xfa, 0x48, 0xce, 0x6b, 0xbd, 0xce, 0x15, 0x6a, 0xc0,
+ 0xb3, 0x7c, 0x30, 0xa7, 0xdd, 0x37, 0x2b, 0xb9, 0xb5, 0xc0, 0x2b, 0xcb,
+ 0xf6, 0x97, 0x0d, 0x28, 0xbc, 0x66, 0x37, 0xe8, 0x01, 0xb6, 0xf8, 0x07,
+ 0x0c, 0xa9, 0x2e, 0xd5, 0x2d, 0x6e, 0xdd, 0x00, 0xad, 0x0a, 0x6b, 0x6c,
+ 0x63, 0xc8, 0xbc, 0x8e, 0xf0, 0x37, 0x1a, 0xb9, 0xb0, 0x00, 0x27, 0xce,
+ 0x49, 0x50, 0xaa, 0x20, 0xf9, 0xbd, 0xae, 0x10, 0x37, 0x69, 0x4d, 0x11,
+ 0xe8, 0x18, 0x7a, 0xfc, 0xcd, 0x91, 0x00, 0x0a, 0x4b, 0xe8, 0x71, 0x4e,
+ 0xe3, 0x27, 0x3e, 0x84, 0x8f, 0xcf, 0xd8, 0xa9, 0x6c, 0xd6, 0x78, 0xc0,
+ 0x06, 0x83, 0x60, 0x8a, 0x45, 0x78, 0x60, 0xf2, 0x6c, 0x61, 0x6f, 0xf1,
+ 0x2f, 0x3f, 0x7b, 0xa5, 0xd8, 0x5e, 0x7b, 0x13, 0xba, 0xfd, 0x1d, 0x3e,
+ 0xb3, 0x21, 0x26, 0xe4, 0x8f, 0x78, 0xd7, 0xa4, 0x80, 0x0b, 0x48, 0x96,
+ 0xbe, 0x02, 0x45, 0x14, 0xa9, 0xe7, 0x6b, 0xcd, 0xa0, 0xa1, 0x3c, 0x44,
+ 0x66, 0x7b, 0xba, 0xf5, 0xf2, 0x2a, 0xad, 0x71, 0x1a, 0x15, 0x6f, 0xda,
+ 0x86, 0x91, 0x4e, 0x80, 0x8f, 0xdf, 0x26, 0x6d, 0x56, 0x75, 0x0d, 0x48,
+ 0xd9, 0xea, 0xd5, 0xf8, 0xab, 0x03, 0x62, 0xa3, 0x78, 0x20, 0xe7, 0x16,
+ 0x3e, 0x32, 0x72, 0x1f, 0xfd, 0xbe, 0xda, 0xd6, 0x83, 0xcb, 0x1a, 0x3d,
+ 0x01, 0x41, 0x9b, 0x4e, 0x85, 0xbf, 0x35, 0xa1, 0xd5, 0xac, 0x08, 0xf7,
+ 0x9c, 0xfb, 0x1d, 0x0a, 0x98, 0x6f, 0x6e, 0x9a, 0x90, 0xae, 0x09, 0x8e,
+ 0x35, 0xda, 0x22, 0xc2, 0xc2, 0x71, 0xf3, 0x8e, 0x49, 0x4b, 0xd4, 0x9b,
+ 0x21, 0x76, 0x54, 0xf8, 0xca, 0x99, 0x3a, 0x7d, 0xc3, 0xe9, 0xef, 0xf7,
+ 0x69, 0x57, 0x4f, 0xfb, 0x61, 0x4a, 0x30, 0xd2, 0xdc, 0xd5, 0x97, 0x16,
+ 0xfe, 0x32, 0x4e, 0xa7, 0x57, 0x04, 0xda, 0x2d, 0x61, 0x90, 0xf9, 0x48,
+ 0xfe, 0x7a, 0x3d, 0x7a, 0xcb, 0x5e, 0x3b, 0xa8, 0x80, 0xce, 0x58, 0xb3,
+ 0x03, 0xbf, 0xe2, 0x1e, 0x39, 0xf6, 0x8f, 0x6d, 0x7e, 0xbd, 0x15, 0x7f,
+ 0xc2, 0xb1, 0x33, 0x9d, 0xd0, 0x9d, 0x30, 0xa7, 0x09, 0xef, 0xd6, 0x4d,
+ 0x84, 0xac, 0x55, 0x37, 0x07, 0x7b, 0x4f, 0xbb, 0x65, 0xed, 0x36, 0xf6,
+ 0x8f, 0x32, 0xf7, 0x89, 0xde, 0x7a, 0x7f, 0x2e, 0xfc, 0x59, 0xab, 0xaf,
+ 0xed, 0x09, 0x64, 0x38, 0x96, 0x66, 0xd6, 0xf9, 0x42, 0x90, 0x47, 0xbc,
+ 0x14, 0x04, 0xff, 0xdb, 0x0b, 0x27, 0xb2, 0x0b, 0xe7, 0x78, 0xba, 0x87,
+ 0x0c, 0x39, 0x13, 0xba, 0x02, 0x77, 0xee, 0x8f, 0xb9, 0xc9, 0x10, 0x35,
+ 0x1c, 0xf0, 0xcb, 0x8f, 0x77, 0xce, 0xd8, 0x8e, 0x5c, 0x39, 0x6c, 0x09,
+ 0x82, 0x0b, 0x98, 0x53, 0x8d, 0x88, 0x91, 0xb9, 0x36, 0x4d, 0x26, 0x8c,
+ 0xc2, 0xc9, 0xc9, 0x5c, 0x03, 0xae, 0x56, 0xf0, 0x63, 0x77, 0x38, 0x7c,
+ 0xf4, 0xae, 0xda, 0x54, 0x18, 0x15, 0xa3, 0x0a, 0x59, 0xf9, 0xa0, 0xdd,
+ 0x81, 0xfc, 0x10, 0x29, 0xf9, 0x92, 0x82, 0x5d, 0xff, 0x1f, 0x26, 0x79,
+ 0x84, 0x57, 0x7f, 0x27, 0xaa, 0x37, 0xf9, 0x94, 0x9b, 0xd1, 0x61, 0x70,
+ 0xf2, 0x03, 0xa8, 0x40, 0x4d, 0x44, 0x0b, 0xe5, 0x7f, 0x56, 0xdb, 0x4b,
+ 0xb2, 0xb9, 0xaf, 0x1c, 0x92, 0x01, 0x6e, 0x02, 0xdb, 0xa7, 0x44, 0xa7,
+ 0x4b, 0xb0, 0x28, 0x63, 0xec, 0x5d, 0x33, 0xe5, 0x46, 0x0b, 0x31, 0xad,
+ 0xd9, 0x31, 0x4a, 0x3a, 0xe8, 0x64, 0xed, 0xea, 0x76, 0x65, 0xa7, 0xf3,
+ 0x8d, 0x2c, 0x77, 0xbf, 0xcc, 0x0d, 0xd8, 0xa0, 0x87, 0x22, 0x1e, 0x60,
+ 0x30, 0x1e, 0xf4, 0x94, 0x3c, 0xdd, 0x31, 0x77, 0x61, 0x03, 0x09, 0xa2,
+ 0xac, 0x2d, 0x7c, 0x2b, 0x7b, 0xe3, 0x26, 0x65, 0x5d, 0xf3, 0xc8, 0x43,
+ 0x7f, 0x92, 0xea, 0x98, 0x74, 0xe9, 0x81, 0xc4, 0x89, 0xfa, 0xae, 0x2e,
+ 0xaf, 0x52, 0xa7, 0xd9, 0xb3, 0x88, 0x54, 0x8c, 0x57, 0x1c, 0xec, 0xf0,
+ 0x35, 0x70, 0x44, 0x48, 0x15, 0x13, 0xc8, 0x6e, 0xe2, 0x88, 0xac, 0xfc,
+ 0x2f, 0xff, 0xfe, 0xda, 0xd2, 0x38, 0xc4, 0x2a, 0xd4, 0xe6, 0x9e, 0x2b,
+ 0x26, 0x53, 0x8b, 0xa9, 0xc8, 0x98, 0x7f, 0xb8, 0x14, 0x4f, 0x5d, 0xef,
+ 0xd0, 0xd1, 0x20, 0xf9, 0x49, 0x78, 0xe5, 0x9d, 0xf0, 0x23, 0xa4, 0xc5,
+ 0x1b, 0x05, 0x93, 0x36, 0x66, 0x05, 0x34, 0xb3, 0xc5, 0xe9, 0xe3, 0x8f,
+ 0xad, 0xb0, 0x71, 0x3c, 0x7a, 0xbd, 0x94, 0x84, 0x87, 0xea, 0xb6, 0xb9,
+ 0xf1, 0x69, 0xf7, 0x3c, 0x70, 0x3d, 0x85, 0x35, 0x8d, 0x0b, 0xc6, 0x08,
+ 0x3f, 0x45, 0x97, 0xc5, 0xf8, 0x1b, 0x7a, 0x0c, 0x7e, 0x54, 0xaf, 0xfb,
+ 0x1d, 0xdc, 0x7a, 0x2f, 0x70, 0xc5, 0xa2, 0x6e, 0x33, 0x36, 0x0a, 0xd8,
+ 0xaa, 0x57, 0xa1, 0x51, 0xce, 0xa3, 0x42, 0x65, 0x93, 0x58, 0xa5, 0x81,
+ 0x06, 0x71, 0x4e, 0xf7, 0x88, 0x4e, 0xfa, 0xba, 0xc0, 0xa5, 0x57, 0x78,
+ 0x8c, 0xd8, 0x4c, 0x06, 0xf7, 0x20, 0xf1, 0x38, 0xfb, 0x22, 0xc0, 0x2d,
+ 0x1d, 0xa9, 0xf5, 0x75, 0xf1, 0x5f, 0x5b, 0x29, 0xe5, 0xd1, 0x41, 0xd8,
+ 0x89, 0x07, 0x3d, 0x05, 0xb8, 0xd0, 0xfb, 0xfc, 0x89, 0x99, 0x29, 0x17,
+ 0x80, 0xcc, 0xd3, 0xc3, 0x9e, 0x77, 0x12, 0xf1, 0x54, 0x6c, 0x41, 0xfe,
+ 0x1e, 0x8b, 0xe9, 0x14, 0x99, 0x22, 0x27, 0xdf, 0x04, 0x07, 0x9a, 0x7e,
+ 0xe4, 0xaa, 0xed, 0x48, 0xdd, 0x6d, 0xc3, 0xe8, 0x97, 0xb0, 0xa1, 0x33,
+ 0xb1, 0x0f, 0xde, 0xd9, 0x3f, 0xf1, 0x97, 0x9e, 0xc4, 0xd9, 0x13, 0xd0,
+ 0x09, 0xb7, 0xf1, 0x7f, 0xd5, 0xf3, 0xe6, 0x18, 0x14, 0x9e, 0xcb, 0x50,
+ 0x1e, 0x5d, 0x78, 0x24, 0x37, 0xb0, 0x67, 0x6f, 0x92, 0x18, 0xb1, 0x45,
+ 0xc3, 0x3c, 0x7c, 0xef, 0xe6, 0x43, 0x37, 0xd3, 0x0a, 0x92, 0xcb, 0x07,
+ 0x19, 0x11, 0xba, 0xa3, 0xe7, 0x26, 0xa6, 0xa7, 0x10, 0x0c, 0xb3, 0x16,
+ 0xce, 0x44, 0x81, 0x52, 0x3c, 0x13, 0xc6, 0xd7, 0xf6, 0x81, 0x5e, 0xa1,
+ 0x30, 0x95, 0xac, 0xce, 0x3b, 0x08, 0xbf, 0xff, 0x10, 0xc9, 0x08, 0xe6,
+ 0x95, 0x46, 0x28, 0x9b, 0x68, 0xa4, 0xc0, 0x01, 0xcb, 0x6d, 0x48, 0x53,
+ 0x7f, 0x31, 0xde, 0x25, 0xa0, 0x60, 0xd1, 0x22, 0x9a, 0x71, 0xf7, 0xf4,
+ 0x15, 0x37, 0x6a, 0x8e, 0x05, 0x26, 0x4b, 0x12, 0xe5, 0x67, 0x42, 0x7c,
+ 0x11, 0xc4, 0xd9, 0x79, 0xcc, 0x7c, 0x37, 0x7c, 0x82, 0x81, 0x3d, 0x54,
+ 0xc1, 0xff, 0xdd, 0x75, 0x9b, 0x10, 0x6a, 0x93, 0x46, 0xfa, 0x6b, 0x44,
+ 0xa8, 0x4b, 0x17, 0x93, 0x38, 0x95, 0xd6, 0xc7, 0x1b, 0x50, 0x64, 0x81,
+ 0x7e, 0x5e, 0x51, 0x93, 0xbe, 0x8a, 0x11, 0x46, 0x20, 0xfa, 0xc8, 0x32,
+ 0xd0, 0x78, 0x23, 0xa9, 0xb0, 0xba, 0xc4, 0xcd, 0x5c, 0xf3, 0xd8, 0xff,
+ 0xc0, 0x52, 0xe6, 0x3b, 0x99, 0xd1, 0xd4, 0x5d, 0xd1, 0x26, 0xfc, 0x8a,
+ 0x6a, 0x50, 0x50, 0x31, 0x8a, 0xd5, 0xbe, 0x8f, 0xd7, 0xc3, 0x66, 0xcb,
+ 0x6f, 0x8a, 0x92, 0x6d, 0x9e, 0x93, 0x92, 0xb4, 0xbf, 0x96, 0xf9, 0x08,
+ 0x7f, 0xe0, 0xa8, 0x0a, 0xc8, 0x4e, 0xb5, 0x70, 0x34, 0x08, 0xaa, 0xf4,
+ 0x1d, 0x3b, 0xef, 0x27, 0xab, 0x5a, 0xe7, 0xa7, 0x92, 0x65, 0x29, 0xaa,
+ 0x8d, 0x41, 0x42, 0x75, 0x35, 0x57, 0xcb, 0x0a, 0x39, 0x86, 0x04, 0x90,
+ 0xf3, 0xa2, 0x34, 0x1a, 0xfa, 0xd5, 0x48, 0x12, 0x46, 0x47, 0xf9, 0xd7,
+ 0xda, 0xda, 0x5e, 0xe8, 0xef, 0x0e, 0x1f, 0x1e, 0xc3, 0xe9, 0xd1, 0x9d,
+ 0xf8, 0x61, 0x99, 0xdf, 0x08, 0x70, 0x88, 0x0c, 0xf3, 0x9f, 0x74, 0x65,
+ 0x68, 0xd5, 0xf5, 0xe7, 0x4f, 0xc8, 0xc7, 0x79, 0x69, 0x75, 0x6b, 0xd9,
+ 0x13, 0xb4, 0x31, 0x88, 0x32, 0xd7, 0xba, 0xab, 0xe8, 0x4e, 0x77, 0x9e,
+ 0xb2, 0x9e, 0x68, 0xc5, 0xac, 0x7e, 0xca, 0xd7, 0x05, 0xd1, 0x9b, 0x3d,
+ 0x63, 0x6f, 0x55, 0xcc, 0xe6, 0x39, 0x09, 0x13, 0xe7, 0xfd, 0x99, 0x34,
+ 0x1f, 0x8e, 0xc4, 0x7f, 0x95, 0x5d, 0x79, 0x22, 0x3a, 0xc5, 0x23, 0x1c,
+ 0x39, 0xbe, 0x76, 0x7b, 0x37, 0x41, 0x0e, 0xcc, 0xd2, 0xc7, 0xc1, 0x9c,
+ 0x28, 0x9a, 0x29, 0xf9, 0x8c, 0x5a, 0x98, 0x4a, 0x13, 0xa5, 0x6c, 0xc6,
+ 0x77, 0x38, 0xb8, 0x31, 0x6c, 0x8f, 0xdc, 0x94, 0x4b, 0x1c, 0x1c, 0x7d,
+ 0x53, 0xad, 0xd4, 0x57, 0x4d, 0x6e, 0x90, 0x30, 0x83, 0x21, 0xf4, 0x4e,
+ 0x65, 0x77, 0x60, 0x8b, 0xf1, 0x2c, 0x66, 0x01, 0xcf, 0x58, 0x9f, 0x43,
+ 0x71, 0x76, 0x25, 0xe5, 0x9e, 0x09, 0x94, 0x5f, 0xca, 0x19, 0xe3, 0xe3,
+ 0x89, 0x44, 0xd6, 0x45, 0xe1, 0x92, 0x3b, 0x8d, 0xae, 0x38, 0xfe, 0x65,
+ 0x65, 0xf8, 0x48, 0xcc, 0x5d, 0x7d, 0xed, 0xd6, 0xe1, 0x47, 0x4b, 0x3a,
+ 0xec, 0xe3, 0x2d, 0xe9, 0x10, 0x8f, 0xa6, 0x78, 0xf9, 0x1c, 0xfe, 0x89,
+ 0x0d, 0x1c, 0x19, 0x45, 0x52, 0xb6, 0x02, 0x32, 0x92, 0x25, 0xc8, 0x88,
+ 0x8a, 0x9c, 0xc0, 0xcf, 0x9b, 0x27, 0x1c, 0x43, 0xb9, 0x04, 0xbc, 0x02,
+ 0xac, 0x34, 0xef, 0x6d, 0x7a, 0x5f, 0x58, 0x74, 0x1b, 0xa9, 0x98, 0x3e,
+ 0x92, 0x0f, 0x26, 0x11, 0x75, 0x9f, 0x45, 0xa9, 0xe1, 0x5c, 0x37, 0xbe,
+ 0xfd, 0xd7, 0x28, 0xcd, 0x72, 0xdc, 0xc6, 0x9b, 0x2c, 0xaa, 0x23, 0xb6,
+ 0x8e, 0x18, 0x0d, 0x8b, 0xe7, 0x1a, 0xe4, 0xba, 0x72, 0x0c, 0x75, 0xa8,
+ 0x04, 0xed, 0xbe, 0xce, 0xd4, 0xbd, 0x2e, 0xd5, 0x74, 0xd5, 0x46, 0xa1,
+ 0x27, 0xdf, 0x49, 0x7d, 0x4f, 0xf2, 0x93, 0x08, 0xbb, 0x18, 0x6f, 0xc8,
+ 0xde, 0x99, 0x50, 0x5a, 0x10, 0x6f, 0xaf, 0xbb, 0xb6, 0xc3, 0x10, 0x41,
+ 0xc1, 0xe4, 0xe4, 0x3c, 0x83, 0xdb, 0xee, 0x0d, 0xc0, 0x50, 0xe4, 0x93,
+ 0x1d, 0xd7, 0x9d, 0x7c, 0x6b, 0xc0, 0x62, 0xf1, 0x34, 0x39, 0xaa, 0xef,
+ 0xd9, 0x3c, 0x21, 0x2e, 0x78, 0xd3, 0x27, 0x3f, 0x74, 0x3d, 0x97, 0xa0,
+ 0x76, 0x0a, 0xdc, 0x91, 0xb1, 0x25, 0x71, 0x70, 0x83, 0xef, 0xbb, 0x7d,
+ 0x4d, 0xcb, 0xea, 0x63, 0xd9, 0x45, 0x9c, 0x4e, 0xca, 0x74, 0x9f, 0x68,
+ 0xa1, 0x3d, 0x51, 0x28, 0x94, 0x8f, 0x2a, 0xcc, 0x8c, 0x16, 0x22, 0x1e,
+ 0x8e, 0x0a, 0xcc, 0xe8, 0x82, 0x8e, 0x1d, 0xdd, 0xfe, 0x6f, 0x53, 0x5e,
+ 0xae, 0x05, 0xf4, 0x06, 0xb3, 0xe9, 0x2d, 0xa9, 0x35, 0xab, 0x97, 0xe0,
+ 0xaf, 0x85, 0xee, 0x08, 0xdc, 0x9a, 0x95, 0xce, 0x4d, 0x66, 0x1e, 0x47,
+ 0xdf, 0x7c, 0x5f, 0x99, 0x61, 0xad, 0x01, 0x0f, 0xfa, 0xf1, 0x92, 0x32,
+ 0x12, 0x7d, 0xa8, 0xf5, 0xb1, 0x8a, 0xfb, 0x0b, 0x32, 0xa9, 0xe5, 0x84,
+ 0x52, 0x50, 0xcd, 0x79, 0x01, 0x56, 0xf2, 0x2e, 0xba, 0xda, 0x8b, 0x70,
+ 0xd6, 0x05, 0x72, 0xee, 0xef, 0x2c, 0xbd, 0x26, 0x84, 0x34, 0x8a, 0x9d,
+ 0xcc, 0x02, 0x74, 0x18, 0x20, 0x27, 0xff, 0x0b, 0x2d, 0x38, 0x36, 0x0a,
+ 0x2f, 0xfd, 0xc6, 0xd8, 0x30, 0x4f, 0x51, 0x74, 0x78, 0xbf, 0x52, 0xff,
+ 0xee, 0x9f, 0xe7, 0xeb, 0xfc, 0xf9, 0xef, 0x69, 0x3c, 0xc5, 0xa6, 0xcc,
+ 0x14, 0x9a, 0x1d, 0x83, 0x94, 0xf6, 0x58, 0xd6, 0x0e, 0xe8, 0x51, 0xf7,
+ 0xce, 0x17, 0xcf, 0x23, 0x66, 0x9d, 0x1c, 0x17, 0x63, 0x2e, 0xcf, 0x3b,
+ 0x6c, 0xcb, 0xb9, 0x33, 0x03, 0x11, 0xc7, 0x3f, 0x4b, 0x8d, 0xee, 0xf8,
+ 0xe3, 0xf9, 0x49, 0x81, 0x5c, 0xb0, 0xb4, 0x3f, 0xd8, 0x3c, 0xe6, 0x6f,
+ 0x9d, 0xad, 0x2a, 0xc0, 0x24, 0xb1, 0xcf, 0x63, 0xdd, 0xc6, 0x32, 0x5f,
+ 0x14, 0x92, 0x34, 0x94, 0xd1, 0x2a, 0xb2, 0xfa, 0x96, 0x80, 0xe8, 0xf8,
+ 0xdc, 0x4b, 0x5b, 0x40, 0x05, 0x90, 0x21, 0x33, 0xd3, 0x3c, 0x34, 0x71,
+ 0x52, 0xfc, 0x07, 0x7b, 0x86, 0x5d, 0xbb, 0xca, 0x6d, 0xde, 0xad, 0x57,
+ 0x79, 0xaa, 0x21, 0x8e, 0x1e, 0x32, 0xc5, 0xce, 0xb8, 0x5f, 0xa8, 0xac,
+ 0x83, 0x62, 0x97, 0xde, 0xfc, 0x98, 0x67, 0x58, 0xe2, 0xd3, 0x41, 0xc5,
+ 0x5e, 0x7a, 0x22, 0x74, 0x12, 0x76, 0xca, 0xb4, 0x32, 0xb4, 0xb5, 0xe7,
+ 0x57, 0x36, 0x73, 0x82, 0xd1, 0x5c, 0x8f, 0xc9, 0x9b, 0x97, 0x05, 0x2b,
+ 0x79, 0x79, 0xed, 0xeb, 0x05, 0x3d, 0x07, 0xb7, 0xa8, 0x87, 0xab, 0x0e,
+ 0x63, 0x0f, 0x04, 0xf9, 0xa8, 0x38, 0xae, 0x9d, 0xcd, 0xd6, 0x47, 0xa3,
+ 0xab, 0xf9, 0x7d, 0x18, 0x3d, 0xa3, 0x06, 0x4f, 0x64, 0x9a, 0x17, 0x46,
+ 0x54, 0x24, 0xb3, 0xca, 0xa8, 0xb4, 0x3d, 0x4f, 0x67, 0x1f, 0x4a, 0xe5,
+ 0x4a, 0x5b, 0xf5, 0x1e, 0xd1, 0x3e, 0x3b, 0x0c, 0x5f, 0xc6, 0x88, 0x6d,
+ 0xd8, 0xc4, 0xb8, 0x34, 0x6b, 0xe9, 0xd0, 0xa4, 0x6d, 0xd2, 0x4d, 0x47,
+ 0x22, 0x15, 0xfe, 0x80, 0x53, 0xf4, 0xc4, 0x32, 0x87, 0xe4, 0x2b, 0x8c,
+ 0x7f, 0x5f, 0x00, 0x28, 0xa7, 0x03, 0x90, 0xb0, 0x9d, 0x18, 0x72, 0x05,
+ 0xc7, 0xcc, 0xf7, 0xb8, 0xd3, 0xfb, 0x01, 0xc8, 0xb8, 0x77, 0x9f, 0xae,
+ 0x4a, 0x36, 0xcd, 0x0e, 0x96, 0x79, 0x70, 0x71, 0x05, 0x4e, 0x00, 0x93,
+ 0x9d, 0x83, 0x8c, 0xe5, 0x0a, 0x9d, 0xb8, 0xcf, 0xad, 0xfd, 0xda, 0x69,
+ 0x0f, 0xf1, 0xb7, 0x3d, 0xa3, 0xfe, 0xcb, 0x71, 0xbf, 0x85, 0x66, 0x51,
+ 0x80, 0x37, 0xe7, 0x08, 0xf8, 0x91, 0xda, 0xfa, 0x93, 0x3f, 0xa1, 0xcc,
+ 0x2c, 0x91, 0x58, 0x36, 0x72, 0x6e, 0xdf, 0x7f, 0x1c, 0x8b, 0x08, 0x1b,
+ 0xeb, 0x13, 0x06, 0xcd, 0x36, 0x30, 0xc8, 0x96, 0x27, 0xc4, 0xb1, 0x33,
+ 0xce, 0x8b, 0xc6, 0x51, 0x1a, 0x55, 0x64, 0xfa, 0xd5, 0xd9, 0x7c, 0xc5,
+ 0xb5, 0x8b, 0x46, 0xbf, 0x8e, 0xed, 0x95, 0x2f, 0xb6, 0x81, 0xf1, 0x55,
+ 0x62, 0x52, 0xee, 0x97, 0x9b, 0xec, 0x2d, 0xf8, 0x7a, 0x9f, 0xc5, 0x7a,
+ 0xee, 0xc3, 0x10, 0xda, 0xf1, 0x67, 0x96, 0x78, 0xee, 0x37, 0x4a, 0x18,
+ 0xd8, 0xa9, 0xbd, 0x4a, 0x58, 0x75, 0x2a, 0xdd, 0xb6, 0xf2, 0x7f, 0xaf,
+ 0xff, 0xd6, 0x6d, 0x19, 0xe0, 0x7d, 0xb0, 0x2c, 0x9c, 0x69, 0x24, 0xb9,
+ 0x9b, 0x17, 0x53, 0xe5, 0x73, 0x99, 0xaf, 0xb7, 0xa2, 0x4d, 0x4f, 0xc0,
+ 0xcf, 0x7c, 0xee, 0x6e, 0x2e, 0xbe, 0xbb, 0xbc, 0x87, 0x04, 0x6a, 0xb8,
+ 0xa6, 0xba, 0xa1, 0x85, 0x87, 0x2e, 0xbe, 0x34, 0xd8, 0xa8, 0x28, 0x36,
+ 0x4b, 0x42, 0xbb, 0x56, 0x49, 0xda, 0x18, 0xf7, 0xd1, 0xb2, 0x3f, 0x1f,
+ 0x03, 0x66, 0x16, 0x5c, 0xd7, 0x65, 0x09, 0x91, 0x5f, 0xd2, 0x02, 0xa8,
+ 0x90, 0x14, 0x2c, 0x85, 0x51, 0x3b, 0x81, 0x46, 0x6f, 0x27, 0xd1, 0xc8,
+ 0x84, 0xc5, 0x4e, 0x0b, 0xc9, 0xd1, 0x2d, 0x02, 0xcd, 0x26, 0x26, 0x6f,
+ 0xa1, 0xfd, 0x13, 0xb4, 0x03, 0x1f, 0xa9, 0x53, 0x54, 0x29, 0xcd, 0x99,
+ 0x09, 0x63, 0x1a, 0x8a, 0x9d, 0x21, 0x82, 0x3a, 0x27, 0xe4, 0x8f, 0xfd,
+ 0xfd, 0x11, 0x14, 0xf0, 0x7d, 0xe7, 0x42, 0xee, 0x5b, 0x4a, 0x88, 0x8c,
+ 0x0a, 0x2b, 0xca, 0xa1, 0xea, 0x83, 0x69, 0xa9, 0xb8, 0xcc, 0x99, 0x1b,
+ 0x1b, 0x96, 0x86, 0x23, 0x8d, 0x92, 0xd3, 0xef, 0x55, 0x71, 0x1c, 0x9e,
+ 0x90, 0x4e, 0x34, 0x8b, 0x5c, 0xc7, 0x5a, 0x6d, 0x7e, 0xf8, 0xc9, 0x96,
+ 0x12, 0x5a, 0x41, 0x21, 0xf7, 0xcb, 0x0d, 0x9c, 0x3f, 0xf5, 0xff, 0xee,
+ 0x0c, 0xee, 0x66, 0x8a, 0x57, 0x8e, 0x3c, 0xc8, 0xf3, 0xdc, 0x06, 0x64,
+ 0x2b, 0x2f, 0xd2, 0x4c, 0x4b, 0xdb, 0x57, 0xd7, 0x3d, 0xde, 0xe2, 0xa3,
+ 0x53, 0xb0, 0x59, 0x4a, 0x54, 0x57, 0x22, 0x58, 0x28, 0x93, 0xf2, 0x4f,
+ 0x5d, 0xc9, 0x39, 0x88, 0xf5, 0xfe, 0x2e, 0x63, 0x0c, 0x13, 0xd4, 0x74,
+ 0xe7, 0x99, 0xa5, 0x3b, 0x19, 0x3b, 0x47, 0x4c, 0x0d, 0x53, 0xf9, 0x78,
+ 0x02, 0xf1, 0xce, 0xc0, 0x2e, 0x98, 0x44, 0xbd, 0x9b, 0xf0, 0x9e, 0x54,
+ 0x94, 0x6e, 0x85, 0x7a, 0xa4, 0x40, 0x4c, 0xe6, 0x71, 0x90, 0x28, 0x92,
+ 0x4e, 0x22, 0x9d, 0x5c, 0xec, 0x71, 0x69, 0xc7, 0xe3, 0x2f, 0x7c, 0x85,
+ 0x64, 0x69, 0x4b, 0xa8, 0x35, 0x9b, 0x00, 0x87, 0xeb, 0xa0, 0xfe, 0xaf,
+ 0xf8, 0x02, 0x61, 0x29, 0x01, 0xd8, 0x68, 0xce, 0x27, 0x83, 0x54, 0x47,
+ 0x53, 0xa9, 0xc3, 0x5e, 0x22, 0x36, 0xec, 0xbd, 0x60, 0xe1, 0xe3, 0xf1,
+ 0x35, 0x73, 0x90, 0x66, 0x2d, 0xc2, 0x86, 0xf0, 0x43, 0xc6, 0x7d, 0x18,
+ 0x9d, 0xab, 0xe6, 0xed, 0xdc, 0xcf, 0x48, 0x40, 0x44, 0xba, 0x80, 0x78,
+ 0x96, 0xd7, 0xe1, 0x10, 0xe1, 0x41, 0xa9, 0x21, 0x23, 0x50, 0xfc, 0x81,
+ 0x14, 0xe1, 0xb9, 0x49, 0xf8, 0xbc, 0x13, 0x4f, 0x3b, 0x39, 0x44, 0x22,
+ 0xf8, 0x0c, 0x36, 0x33, 0x35, 0xe0, 0x84, 0x75, 0x2e, 0x3e, 0x4e, 0x6b,
+ 0xd7, 0x3c, 0xc3, 0x67, 0x51, 0x7d, 0x3a, 0xb3, 0x06, 0x32, 0x60, 0x4b,
+ 0x61, 0x00, 0xaf, 0x15, 0xdd, 0xc2, 0xea, 0x69, 0x6f, 0xa9, 0x79, 0x4e,
+ 0x45, 0x3b, 0x52, 0xae, 0x5d, 0xfa, 0x7b, 0x38, 0xce, 0xed, 0x56, 0x14,
+ 0xc2, 0x58, 0xdb, 0xcf, 0x15, 0x04, 0xe4, 0xb3, 0x57, 0x1f, 0x83, 0x00,
+ 0xcc, 0x07, 0x4d, 0x3c, 0x55, 0xf5, 0x24, 0xe4, 0x97, 0x32, 0xd9, 0x54,
+ 0x0b, 0x58, 0xb2, 0x3e, 0xe1, 0x24, 0x8a, 0x32, 0xc2, 0x9f, 0x77, 0x1c,
+ 0x57, 0x5a, 0x19, 0x4d, 0x2d, 0x71, 0x72, 0xd9, 0xd7, 0x28, 0xde, 0xa4,
+ 0xf8, 0xa5, 0x07, 0x4a, 0x6a, 0xcc, 0x6a, 0x51, 0x7f, 0xca, 0x1c, 0x24,
+ 0xa4, 0x31, 0xc1, 0x81, 0x2a, 0x14, 0xa4, 0x47, 0x3a, 0x86, 0x80, 0x43,
+ 0xf1, 0x46, 0x32, 0xc0, 0x86, 0x01, 0xfa, 0x97, 0x08, 0x76, 0xd9, 0x63,
+ 0x64, 0x9f, 0x75, 0xc1, 0x1c, 0xe6, 0x6d, 0xec, 0x28, 0x48, 0xd0, 0xa4,
+ 0x11, 0x03, 0xc2, 0x36, 0x62, 0xe8, 0xaf, 0xcb, 0x7d, 0x64, 0xf7, 0xe9,
+ 0xbd, 0x03, 0x1b, 0x62, 0xe4, 0x5d, 0x2d, 0x79, 0x7d, 0xd6, 0xa6, 0xee,
+ 0xca, 0x9e, 0x99, 0xec, 0x43, 0xfd, 0xac, 0xa1, 0x7a, 0xb4, 0xbe, 0xbb,
+ 0x73, 0x13, 0x13, 0xaf, 0xbc, 0x86, 0xf8, 0x53, 0x3e, 0xbd, 0xb0, 0x2c,
+ 0x05, 0x14, 0xc6, 0xb7, 0xbb, 0xc7, 0x4b, 0x36, 0x24, 0xde, 0x6c, 0x38,
+ 0xbf, 0xd5, 0x7a, 0xbe, 0x0b, 0x7b, 0xd6, 0x2b, 0xea, 0x5a, 0x14, 0x09,
+ 0x0c, 0x2b, 0xa5, 0xda, 0xae, 0xe3, 0x42, 0xde, 0x5e, 0x49, 0x73, 0x3d,
+ 0x3f, 0x99, 0xa1, 0x33, 0x76, 0x25, 0x7a, 0x2c, 0x3f, 0xdf, 0x5a, 0x95,
+ 0x78, 0x79, 0x32, 0x55, 0xfe, 0xc4, 0xec, 0x2a, 0x61, 0x3c, 0xc8, 0x86,
+ 0xba, 0xc0, 0x63, 0x90, 0xfe, 0x6f, 0x5b, 0xc9, 0x7f, 0x22, 0xe7, 0xbf,
+ 0x8a, 0x8d, 0xab, 0x42, 0x1f, 0x54, 0x1b, 0x5d, 0x84, 0xc9, 0x58, 0xe2,
+ 0x7c, 0x24, 0x54, 0x09, 0x44, 0x3e, 0x7f, 0x64, 0xa7, 0x5c, 0x5f, 0xf3,
+ 0x31, 0x68, 0x0d, 0x17, 0xb5, 0xaf, 0x5b, 0xee, 0xd8, 0x4c, 0x65, 0xe5,
+ 0x46, 0xfc, 0x4f, 0xd2, 0x8b, 0xe9, 0x0c, 0x8f, 0xbd, 0x48, 0xe7, 0x89,
+ 0x07, 0x9b, 0x18, 0x03, 0x2b, 0x74, 0x3d, 0xbb, 0xea, 0x2c, 0x53, 0x49,
+ 0xad, 0x29, 0xc5, 0x84, 0x8e, 0x79, 0x2e, 0xd2, 0x42, 0xc9, 0xbc, 0x86,
+ 0x53, 0x42, 0x7c, 0xee, 0x7b, 0xc0, 0xb2, 0x6d, 0x24, 0xd9, 0x25, 0x20,
+ 0xb0, 0x7d, 0xf1, 0x0f, 0xe3, 0xe7, 0xad, 0xb4, 0x6e, 0x09, 0xea, 0x6c,
+ 0x5e, 0x93, 0x68, 0xb3, 0x3c, 0x27, 0xaf, 0xe9, 0x7e, 0xac, 0x9c, 0x02,
+ 0x1c, 0x36, 0xae, 0x4d, 0xbf, 0x7a, 0x5a, 0x1d, 0x28, 0x17, 0xb7, 0x6b,
+ 0x8c, 0x15, 0xed, 0xca, 0xb7, 0x59, 0xa8, 0x2b, 0x77, 0x61, 0x94, 0x58,
+ 0x98, 0xdf, 0x1f, 0xa9, 0x66, 0x06, 0x48, 0xce, 0xd5, 0x27, 0xd0, 0x16,
+ 0x57, 0xb0, 0xe4, 0x4d, 0xdf, 0xd8, 0x91, 0x42, 0xe8, 0x3b, 0x33, 0xb0,
+ 0xdb, 0xdf, 0xc8, 0xd5, 0x0f, 0xeb, 0xea, 0xc1, 0xfe, 0xa3, 0xc7, 0x07,
+ 0xb2, 0x23, 0x76, 0x5b, 0x83, 0xf5, 0x39, 0x88, 0xf1, 0x45, 0x24, 0xdf,
+ 0x90, 0xd8, 0x08, 0xb5, 0x7f, 0x17, 0x4d, 0xc2, 0x1b, 0xe8, 0xaa, 0xb5,
+ 0x9d, 0xfd, 0xf6, 0xbe, 0x50, 0x86, 0x1c, 0x3c, 0xba, 0x68, 0x98, 0xd6,
+ 0x95, 0x5c, 0x49, 0xb8, 0x79, 0x9b, 0x0d, 0xe0, 0xa7, 0x5a, 0xe3, 0x0d,
+ 0x28, 0x93, 0x16, 0xa6, 0x85, 0x23, 0x27, 0x4e, 0x10, 0x68, 0x18, 0xad,
+ 0x95, 0xb3, 0x57, 0xd0, 0xbd, 0xbe, 0x25, 0xd8, 0x2a, 0x15, 0x3b, 0x56,
+ 0x48, 0x16, 0x1b, 0x7d, 0x50, 0x09, 0xd4, 0xcd, 0x8d, 0xb8, 0x7a, 0x85,
+ 0x13, 0xbe, 0x36, 0x49, 0xa5, 0x25, 0x10, 0xdf, 0xc3, 0x08, 0xbc, 0x64,
+ 0x2c, 0x97, 0x38, 0x8d, 0x69, 0x8c, 0xb9, 0x5c, 0xe9, 0x07, 0x88, 0x5f,
+ 0xdd, 0xf5, 0x48, 0x74, 0x49, 0xd8, 0x88, 0xac, 0x7f, 0xdb, 0x0d, 0x22,
+ 0xac, 0x55, 0x40, 0x18, 0x7c, 0x04, 0x08, 0x7d, 0x05, 0x81, 0x71, 0x0f,
+ 0x65, 0x8f, 0x3b, 0x5f, 0x34, 0x8c, 0xbd, 0xbe, 0x7a, 0xf1, 0xf8, 0x48,
+ 0x67, 0xb1, 0x74, 0x8b, 0x37, 0xf4, 0xfd, 0x1a, 0x9f, 0x9b, 0x4a, 0x57,
+ 0xbd, 0x81, 0xf4, 0xf8, 0x56, 0x84, 0x92, 0x24, 0x96, 0x5c, 0x9a, 0x06,
+ 0x71, 0x4e, 0x2d, 0x61, 0xa2, 0x52, 0x6c, 0x96, 0x07, 0x19, 0x05, 0x02,
+ 0x58, 0xe6, 0x24, 0x42, 0x21, 0x5f, 0x0f, 0x0a, 0x92, 0x89, 0x6f, 0xf8,
+ 0x49, 0xa3, 0xd1, 0xf9, 0xd2, 0x22, 0xe4, 0x07, 0x76, 0xff, 0xcb, 0xd6,
+ 0xa3, 0xdd, 0x58, 0x50, 0x59, 0x18, 0x67, 0x8f, 0x68, 0xdd, 0xd4, 0x68,
+ 0x0e, 0x2a, 0x58, 0xb9, 0x2d, 0xb1, 0xa7, 0xf6, 0x4d, 0x41, 0x70, 0x39,
+ 0x23, 0xe5, 0x99, 0x4c, 0x05, 0x2f, 0x04, 0xb5, 0x6f, 0xfc, 0xc1, 0xf1,
+ 0xac, 0x2b, 0xf4, 0x02, 0x22, 0xce, 0x46, 0xa1, 0x38, 0xef, 0x50, 0xd1,
+ 0x6b, 0x1f, 0x34, 0xb5, 0x0c, 0x6a, 0xb3, 0x30, 0xe6, 0xa3, 0x91, 0x82,
+ 0x9a, 0x2d, 0x3c, 0x8f, 0xf6, 0x76, 0x97, 0xe9, 0xb7, 0x92, 0xb7, 0xb1,
+ 0x1e, 0x19, 0x97, 0xad, 0x1c, 0x6d, 0xd4, 0xe6, 0x2c, 0x5d, 0xe8, 0x33,
+ 0xf2, 0xc0, 0x17, 0xa2, 0x20, 0xdd, 0x0f, 0x5c, 0x32, 0xe2, 0x4c, 0x63,
+ 0xaa, 0x2e, 0x36, 0xf6, 0xf0, 0xde, 0x40, 0x41, 0x6d, 0xa8, 0xcb, 0x13,
+ 0xd4, 0xd9, 0xc4, 0xfb, 0xb3, 0xb3, 0xd6, 0xf2, 0xed, 0x24, 0x00, 0x1a,
+ 0xf8, 0xfa, 0xc9, 0x70, 0x60, 0x40, 0x72, 0x59, 0xea, 0x3f, 0x17, 0x04,
+ 0x46, 0xec, 0x5f, 0x9b, 0xab, 0x1f, 0x99, 0x9f, 0x46, 0x61, 0x79, 0x4c,
+ 0x6f, 0x94, 0xb4, 0xae, 0x8f, 0x81, 0xc6, 0xf1, 0x7a, 0x79, 0x4e, 0x8f,
+ 0xa5, 0x03, 0x92, 0xf7, 0xbb, 0xed, 0x91, 0x40, 0xff, 0x5e, 0xa2, 0xd4,
+ 0x32, 0x76, 0x2e, 0x25, 0xc6, 0xce, 0xc8, 0x64, 0x9f, 0xe1, 0x26, 0x81,
+ 0xe6, 0xd6, 0xbd, 0x80, 0xda, 0xc9, 0xc2, 0x1c, 0x9a, 0x5d, 0x5e, 0xce,
+ 0x51, 0x14, 0x79, 0x40, 0x04, 0x48, 0x57, 0x48, 0x13, 0xff, 0xdf, 0x81,
+ 0x10, 0xf5, 0x46, 0x0c, 0x23, 0xc6, 0xfa, 0x7c, 0xc3, 0x59, 0x34, 0x26,
+ 0x47, 0x16, 0x8a, 0x1b, 0x89, 0xbe, 0x34, 0x08, 0xe9, 0x45, 0x65, 0xff,
+ 0x4d, 0xc2, 0xf1, 0xfa, 0x4a, 0xf4, 0x72, 0x37, 0x9c, 0x9e, 0x57, 0x0b,
+ 0x0d, 0x57, 0x56, 0x84, 0xe9, 0xcb, 0xe4, 0x5c, 0xa1, 0x50, 0x77, 0x28,
+ 0x36, 0x82, 0xcf, 0x20, 0xee, 0x92, 0x0b, 0xe3, 0xba, 0x1e, 0x2a, 0x8b,
+ 0xa8, 0x72, 0x20, 0xc8, 0x80, 0xcb, 0x0d, 0x45, 0x34, 0x52, 0x10, 0xc3,
+ 0xe8, 0x33, 0x0b, 0xa5, 0xa3, 0x33, 0x90, 0xb2, 0xe0, 0xf5, 0x88, 0xfe,
+ 0xf7, 0xf3, 0xca, 0x3d, 0x32, 0x08, 0xd6, 0xa8, 0x41, 0x74, 0x8d, 0xcd,
+ 0x3b, 0x9b, 0xae, 0x97, 0x49, 0xe4, 0x60, 0x54, 0xd2, 0x96, 0x2c, 0xba,
+ 0xb6, 0x43, 0x8f, 0xb6, 0x40, 0x07, 0xf7, 0x5b, 0x64, 0xb1, 0x1a, 0x5b,
+ 0xdd, 0x96, 0xbf, 0x2d, 0x68, 0xe8, 0x3c, 0xe3, 0x93, 0xe6, 0x7e, 0x39,
+ 0xf6, 0xb2, 0x2e, 0x2c, 0xb8, 0xf1, 0x27, 0x3b, 0x91, 0xae, 0x01, 0x5f,
+ 0x4a, 0x4b, 0xd8, 0xf4, 0xee, 0xa9, 0x63, 0xf4, 0xb2, 0xd3, 0xef, 0x3a,
+ 0xcd, 0x40, 0x0e, 0x74, 0x11, 0xb0, 0xc5, 0x39, 0x46, 0xa7, 0x76, 0x38,
+ 0x98, 0xb7, 0xd5, 0x12, 0x93, 0x27, 0xd9, 0x0d, 0xae, 0xbd, 0x72, 0xde,
+ 0x28, 0xe7, 0x85, 0xd2, 0x17, 0x50, 0xc8, 0x84, 0x27, 0xe7, 0x3b, 0x6b,
+ 0x2b, 0x91, 0xcc, 0x36, 0x58, 0x73, 0xba, 0xe9, 0xe2, 0x16, 0x9d, 0xd0,
+ 0x43, 0x23, 0xf8, 0xf7, 0x3b, 0x4e, 0x63, 0x27, 0x9b, 0x85, 0xc3, 0x3d,
+ 0x4b, 0x98, 0xa9, 0x98, 0xb7, 0x4b, 0x62, 0x7c, 0xd8, 0x38, 0x89, 0xf3,
+ 0x78, 0x11, 0xed, 0x59, 0x99, 0xa9, 0x3a, 0x18, 0x59, 0xd4, 0xfc, 0x20,
+ 0xdd, 0x97, 0xe4, 0x91, 0x1b, 0xd6, 0x68, 0x87, 0xc4, 0x1d, 0xfb, 0x88,
+ 0xc0, 0x4f, 0x62, 0x3f, 0x99, 0x6d, 0xaf, 0xee, 0x9c, 0xd9, 0xb1, 0x31,
+ 0x08, 0x05, 0x45, 0x27, 0xee, 0xc0, 0x15, 0xb5, 0x53, 0xd6, 0xee, 0xa4,
+ 0x6f, 0x26, 0x82, 0x91, 0xba, 0xec, 0xff, 0xa2, 0x44, 0x3a, 0x8e, 0x73,
+ 0xb0, 0x92, 0xc9, 0xf2, 0xed, 0xd9, 0xb5, 0xfd, 0x5e, 0x0a, 0x50, 0x74,
+ 0xca, 0x63, 0x61, 0x89, 0x58, 0xb1, 0xfd, 0xa3, 0xfe, 0xe8, 0x5b, 0x37,
+ 0x8e, 0x92, 0x38, 0xde, 0xf2, 0xaa, 0x28, 0x25, 0x29, 0x4e, 0xe5, 0x32,
+ 0x43, 0xd8, 0x60, 0x25, 0xd6, 0x17, 0x3f, 0xbb, 0xa1, 0x20, 0x3e, 0x05,
+ 0x6b, 0xbe, 0x1c, 0x6a, 0x67, 0x6e, 0xa8, 0xf5, 0xd9, 0xe0, 0x98, 0x6e,
+ 0x5b, 0x9d, 0x53, 0x1e, 0x17, 0x64, 0x08, 0x38, 0x9a, 0xc4, 0xc5, 0x6b,
+ 0xeb, 0x8c, 0x02, 0x46, 0xc4, 0x35, 0xb2, 0xd5, 0x9d, 0x5d, 0x3a, 0x6a,
+ 0x69, 0x98, 0x1a, 0x7b, 0x36, 0x7b, 0x74, 0xa0, 0xb0, 0x4e, 0x40, 0x1a,
+ 0xd7, 0x56, 0xb5, 0x97, 0x96, 0xd7, 0xbc, 0x9b, 0x65, 0x83, 0xa6, 0xa3,
+ 0xb3, 0x11, 0x57, 0x9c, 0x4b, 0xd1, 0xd9, 0x5e, 0xe0, 0x5d, 0x35, 0xcf,
+ 0xdd, 0x9d, 0x73, 0xbb, 0x63, 0x93, 0x2e, 0x9e, 0xc2, 0x4b, 0xbb, 0xd9,
+ 0x88, 0xbe, 0xa0, 0xc4, 0xaf, 0xc5, 0xe2, 0x9a, 0xe1, 0xa8, 0x34, 0xd4,
+ 0xa9, 0xe7, 0xae, 0x38, 0x2e, 0x76, 0x6e, 0xea, 0xd2, 0xfa, 0x16, 0x74,
+ 0xc0, 0x6b, 0xec, 0xaf, 0x0f, 0x9f, 0x62, 0xd3, 0x37, 0xec, 0x8c, 0xf3,
+ 0xdd, 0x0c, 0x12, 0x9f, 0xf6, 0x8a, 0x96, 0x20, 0x25, 0x9f, 0x21, 0x72,
+ 0x6c, 0xcb, 0x84, 0x78, 0x3d, 0xe9, 0x65, 0x58, 0xb6, 0xf6, 0xc4, 0x5f,
+ 0x35, 0xe8, 0x1d, 0xe3, 0x0e, 0x77, 0x31, 0x13, 0xf3, 0xac, 0xb3, 0x0c,
+ 0x64, 0xcc, 0xa8, 0x35, 0x6a, 0xf4, 0xa0, 0x62, 0xda, 0x15, 0x5b, 0x14,
+ 0xfb, 0xd9, 0xbe, 0x1b, 0x5a, 0xc8, 0xd1, 0x58, 0x5a, 0xb5, 0xca, 0x9c,
+ 0x47, 0xaf, 0xf2, 0xdb, 0xc6, 0x29, 0x9d, 0x0d, 0x62, 0xcb, 0xb3, 0xd8,
+ 0xbb, 0x21, 0x7a, 0x70, 0xea, 0x0b, 0x7d, 0xb9, 0xa8, 0x6a, 0xf1, 0x19,
+ 0x88, 0x3f, 0x55, 0x18, 0xad, 0x4d, 0xc0, 0x01, 0x16, 0xed, 0xc4, 0x0c,
+ 0x84, 0xf9, 0xba, 0x5c, 0x60, 0x68, 0x63, 0x81, 0xee, 0x9b, 0xd3, 0xa9,
+ 0x22, 0x4d, 0x34, 0x35, 0x6d, 0x9d, 0x9f, 0x00, 0xbc, 0x21, 0x32, 0xda,
+ 0x58, 0x1a, 0x64, 0xad, 0x09, 0x2e, 0x0d, 0xed, 0xff, 0x79, 0x71, 0x73,
+ 0x7d, 0x3b, 0x69, 0x2e, 0x7f, 0x51, 0xc4, 0xdf, 0x60, 0xef, 0xeb, 0x23,
+ 0xd0, 0xd0, 0xcc, 0xc5, 0x7e, 0x02, 0x2b, 0x9b, 0xa8, 0x8b, 0x52, 0x6e,
+ 0x13, 0xfb, 0x49, 0x04, 0xdd, 0x39, 0x12, 0x60, 0x45, 0x5e, 0xe3, 0xe6,
+ 0x50, 0x97, 0x9c, 0x10, 0xf5, 0x55, 0x09, 0x16, 0xe8, 0x2a, 0xd2, 0x4f,
+ 0xe4, 0x88, 0x75, 0x5a, 0xb4, 0x25, 0x27, 0xe0, 0x6f, 0xc5, 0x14, 0xde,
+ 0xb6, 0x37, 0x97, 0xed, 0x46, 0x4f, 0x93, 0x9f, 0xd0, 0x64, 0x0b, 0xa3,
+ 0x78, 0xc8, 0x71, 0x93, 0xdf, 0x42, 0xa0, 0xe9, 0xc2, 0xdb, 0x8c, 0xdc,
+ 0x6f, 0x0d, 0x43, 0xd2, 0xd7, 0x95, 0x34, 0x8f, 0x39, 0xc0, 0x43, 0xed,
+ 0x97, 0x5d, 0x49, 0xfd, 0xac, 0x32, 0x55, 0x7a, 0x30, 0x15, 0xf3, 0x96,
+ 0xdc, 0xd9, 0x9d, 0x0b, 0x28, 0xa9, 0xd6, 0xa4, 0x38, 0x0c, 0x38, 0xb9,
+ 0x95, 0x24, 0x15, 0x4e, 0x44, 0xd8, 0x3e, 0x0a, 0xe5, 0x0c, 0x68, 0xba,
+ 0x18, 0x7d, 0x30, 0x2d, 0x11, 0x2f, 0xed, 0x45, 0x3c, 0x8c, 0xaa, 0xee,
+ 0xbc, 0xcc, 0x35, 0x59, 0xd9, 0xfc, 0x54, 0xb3, 0x4b, 0x63, 0x78, 0x14,
+ 0x5b, 0x8e, 0xc7, 0x5c, 0x72, 0xc0, 0x02, 0xc9, 0x52, 0x84, 0xf2, 0x13,
+ 0x87, 0x78, 0xf0, 0x50, 0xe8, 0xfe, 0x53, 0x46, 0xb6, 0x3f, 0xaf, 0xe2,
+ 0xf8, 0x0c, 0x94, 0x63, 0xd1, 0x06, 0xcf, 0x4c, 0xb8, 0xd1, 0xe8, 0x81,
+ 0x2a, 0x9d, 0xa3, 0x05, 0xdb, 0xda, 0x2c, 0x38, 0xe8, 0x02, 0x99, 0x33,
+ 0x5e, 0xc9, 0x63, 0x73, 0x79, 0x4d, 0xf5, 0xc1, 0xc3, 0xeb, 0x1a, 0x94,
+ 0x1c, 0x36, 0xfa, 0x1a, 0x8b, 0xee, 0x18, 0x2e, 0x36, 0xc3, 0x82, 0xdc,
+ 0x76, 0x29, 0x7f, 0xfc, 0x8a, 0xbc, 0x68, 0x63, 0xf4, 0x1b, 0x44, 0x0f,
+ 0x9b, 0x11, 0x5f, 0x8b, 0x30, 0x26, 0xac, 0x48, 0xef, 0x35, 0x77, 0xfa,
+ 0x97, 0xde, 0x22, 0xda, 0x4a, 0xfe, 0x06, 0xad, 0x14, 0xd7, 0x42, 0x92,
+ 0x08, 0xbd, 0x48, 0x85, 0x50, 0x8e, 0x92, 0xd5, 0x35, 0x32, 0xce, 0x00,
+ 0xb8, 0x5c, 0x8b, 0xac, 0x21, 0xf8, 0xf3, 0x5c, 0x02, 0x7e, 0x22, 0xf5,
+ 0x07, 0xbf, 0x31, 0x7e, 0x6c, 0x6a, 0x22, 0xbb, 0x99, 0x4b, 0x6b, 0xd4,
+ 0x8a, 0xc2, 0xfe, 0x2a, 0xf7, 0xc3, 0xce, 0xd7, 0x44, 0x96, 0x15, 0x51,
+ 0x1a, 0xfd, 0x06, 0xcb, 0x9f, 0xa3, 0xe4, 0x02, 0x2b, 0xae, 0x70, 0xff,
+ 0x20, 0x8b, 0xf2, 0xea, 0x5c, 0x09, 0xe8, 0x5f, 0x6b, 0xa9, 0x61, 0xbe,
+ 0x38, 0xd3, 0xb9, 0x79, 0x2c, 0x90, 0xfe, 0x84, 0x1c, 0x7e, 0x64, 0x66,
+ 0xc0, 0xf1, 0x4e, 0x44, 0xdd, 0xb5, 0x8c, 0x01, 0x19, 0x1d, 0x2a, 0xa7,
+ 0x42, 0x93, 0x44, 0x35, 0x6a, 0x15, 0x97, 0xa3, 0x8b, 0xc3, 0x10, 0xd5,
+ 0x2e, 0xa9, 0x62, 0x74, 0x65, 0xfd, 0xca, 0xc9, 0x84, 0x06, 0xfc, 0xbf,
+ 0xcf, 0x9c, 0xe4, 0x3e, 0xe9, 0x0f, 0xd5, 0xdf, 0xd6, 0x89, 0xb3, 0x68,
+ 0x28, 0x42, 0xe2, 0xd5, 0xa5, 0x92, 0x3f, 0xba, 0xf6, 0x42, 0x86, 0xd7,
+ 0xa8, 0xf9, 0x19, 0x25, 0x5f, 0x21, 0x95, 0xad, 0xc5, 0xe0, 0x4d, 0xde,
+ 0x9a, 0xea, 0xef, 0x77, 0x10, 0xbc, 0x38, 0xb4, 0x03, 0x33, 0x99, 0x5f,
+ 0x8c, 0x56, 0x4e, 0xba, 0x77, 0x8f, 0x8f, 0x84, 0x29, 0x6e, 0x98, 0x2a,
+ 0x2d, 0xd5, 0x4f, 0x8e, 0xae, 0xea, 0x19, 0xdf, 0xce, 0xe4, 0x88, 0x1a,
+ 0x07, 0x9f, 0x1e, 0xe6, 0xa9, 0x54, 0x64, 0xcc, 0x59, 0x5d, 0x47, 0xea,
+ 0x29, 0xcd, 0x7f, 0x6b, 0xf6, 0x0f, 0xf7, 0xce, 0xcc, 0x01, 0xf3, 0xf3,
+ 0x50, 0x3e, 0xd8, 0x35, 0x46, 0x3d, 0xbf, 0x49, 0x07, 0xb4, 0x5b, 0x03,
+ 0xe3, 0x69, 0xea, 0x1a, 0xdf, 0xb6, 0xbb, 0xdf, 0x24, 0xb2, 0xdb, 0x98,
+ 0x9b, 0xba, 0xf4, 0x85, 0xe4, 0xf1, 0x01, 0x7b, 0x8a, 0x83, 0x07, 0x51,
+ 0x68, 0x70, 0x59, 0xe8, 0xec, 0xb5, 0x53, 0x6c, 0xb0, 0x0d, 0xdb, 0x12,
+ 0x58, 0x99, 0x19, 0x75, 0x8f, 0x53, 0x74, 0x25, 0x63, 0xbe, 0x0b, 0xa4,
+ 0x97, 0xcb, 0x13, 0x4e, 0xdf, 0xd9, 0x39, 0xda, 0x52, 0xd6, 0x9c, 0x9d,
+ 0xe1, 0x31, 0x68, 0xcd, 0x28, 0xa6, 0x7a, 0x80, 0xd7, 0x50, 0xab, 0x98,
+ 0xa0, 0x9b, 0x38, 0x0d, 0x3c, 0x34, 0x27, 0xd3, 0x49, 0x65, 0x07, 0x64,
+ 0xec, 0x53, 0x18, 0xa3, 0xba, 0xf0, 0x97, 0x7c, 0x14, 0x18, 0x1a, 0x0b,
+ 0xae, 0xa6, 0x2c, 0xf6, 0x73, 0xef, 0xab, 0xed, 0x48, 0xfc, 0xd6, 0x3b,
+ 0xe6, 0xfd, 0x2d, 0xdc, 0xaa, 0xaf, 0x2f, 0xfa, 0xd9, 0x87, 0x1a, 0xec,
+ 0x08, 0xe6, 0x56, 0x01, 0x46, 0x32, 0xd7, 0x23, 0x16, 0x6d, 0xd1, 0x79,
+ 0x00, 0x55, 0xa5, 0xed, 0x2a, 0x24, 0x69, 0xf7, 0x9d, 0x59, 0xa2, 0x3b,
+ 0x86, 0xbc, 0x3f, 0x83, 0xcc, 0x92, 0x79, 0xcf, 0x3e, 0x3d, 0x0e, 0x2f,
+ 0x67, 0x9b, 0x09, 0x09, 0xdf, 0xa0, 0x78, 0x09, 0x16, 0x37, 0x6a, 0xc7,
+ 0xcf, 0x27, 0x8c, 0x23, 0x85, 0x68, 0xa4, 0xa9, 0xb0, 0x2f, 0x98, 0x22,
+ 0x53, 0xd4, 0x75, 0xc5, 0xd8, 0xfe, 0x39, 0xaa, 0x69, 0x0d, 0xea, 0x3a,
+ 0xdb, 0x0b, 0xaf, 0xc3, 0x4a, 0x7c, 0x88, 0x3f, 0xb4, 0x41, 0x80, 0x5e,
+ 0x8b, 0x71, 0x79, 0xd6, 0x77, 0xb1, 0xc5, 0xf9, 0x8a, 0x99, 0x67, 0xe8,
+ 0x2b, 0x85, 0x06, 0x93, 0x82, 0xa2, 0x08, 0xf7, 0x1f, 0x5b, 0xbd, 0xdb,
+ 0x53, 0xdc, 0x25, 0x65, 0x84, 0xf0, 0xf7, 0x8b, 0x87, 0xbc, 0xf0, 0x85,
+ 0xfc, 0x9d, 0xcd, 0x5d, 0x67, 0x0d, 0x9d, 0xef, 0x0c, 0x2b, 0x62, 0xc6,
+ 0xb8, 0x2b, 0x98, 0xfd, 0x81, 0x84, 0x19, 0xa9, 0x92, 0xa4, 0x2e, 0xac,
+ 0x9e, 0x35, 0x0e, 0x07, 0xd3, 0xd3, 0x75, 0x6a, 0x5d, 0xc3, 0x8c, 0xc1,
+ 0x87, 0x88, 0xab, 0x53, 0x9c, 0x2e, 0x22, 0x94, 0xfe, 0x18, 0x65, 0xc2,
+ 0x5c, 0x9d, 0x02, 0x3b, 0xc1, 0x7f, 0xfd, 0xa7, 0xb1, 0x4d, 0xae, 0xc9,
+ 0x75, 0x0c, 0x2a, 0x86, 0x6a, 0xd4, 0x3a, 0xb3, 0x49, 0x02, 0x6e, 0x43,
+ 0xe4, 0x61, 0xf7, 0x18, 0xcb, 0xad, 0x32, 0x78, 0xaf, 0xfe, 0x38, 0x8b,
+ 0xb3, 0xec, 0xef, 0x86, 0x68, 0xb5, 0xe3, 0xef, 0x53, 0x2e, 0x53, 0x87,
+ 0x7c, 0xe8, 0x55, 0x93, 0x8a, 0xb1, 0x2e, 0x68, 0x76, 0x24, 0xcc, 0xfa,
+ 0x2b, 0xdd, 0xd8, 0xb1, 0x77, 0x10, 0x19, 0x70, 0x47, 0xd8, 0xf7, 0xc6,
+ 0x52, 0xa0, 0x68, 0xf9, 0x78, 0x37, 0xf0, 0x48, 0x6d, 0xcd, 0xf5, 0x6e,
+ 0x4e, 0x51, 0xbf, 0xec, 0x68, 0x22, 0x5e, 0x84, 0x2b, 0x25, 0xfb, 0x05,
+ 0x04, 0x84, 0x41, 0xfd, 0x5c, 0x0b, 0x23, 0x2d, 0xd2, 0x0c, 0xa0, 0x08,
+ 0x5f, 0x9d, 0xfb, 0xf8, 0x43, 0x6f, 0xa4, 0x9e, 0x64, 0x2f, 0x4c, 0xeb,
+ 0xb5, 0xe5, 0x6e, 0x8a, 0x58, 0x35, 0x17, 0x27, 0x8f, 0x0e, 0xf8, 0x74,
+ 0x96, 0x7a, 0x6c, 0x0c, 0xd4, 0x27, 0x3b, 0xa9, 0xa3, 0x61, 0x51, 0xe6,
+ 0xfc, 0x5f, 0x7d, 0x4f, 0x31, 0xaf, 0x8f, 0xea, 0xef, 0xe0, 0x49, 0x50,
+ 0x31, 0x41, 0xbc, 0x25, 0x0e, 0x67, 0x43, 0x0f, 0x0f, 0x0e, 0x37, 0x72,
+ 0xf6, 0x98, 0x2d, 0x12, 0x89, 0x2a, 0x01, 0x27, 0xf1, 0x89, 0x63, 0x04,
+ 0x3a, 0x62, 0x1f, 0xa1, 0x2c, 0x81, 0xf7, 0x08, 0x1d, 0xa2, 0x33, 0xc8,
+ 0xd9, 0x26, 0xc9, 0x29, 0x14, 0x56, 0x4c, 0x34, 0xe9, 0x5b, 0x3c, 0xb9,
+ 0x2d, 0x0f, 0x16, 0x37, 0x8e, 0x31, 0x06, 0xda, 0x02, 0x35, 0x1c, 0xd6,
+ 0xc6, 0xe9, 0xda, 0x0c, 0x03, 0xed, 0xb7, 0xfa, 0xa3, 0x5a, 0x9e, 0xdd,
+ 0x5b, 0xe2, 0x10, 0x84, 0x19, 0xc8, 0x57, 0x44, 0x9f, 0x5d, 0xa6, 0x26,
+ 0x29, 0x65, 0xe0, 0xdd, 0x18, 0xc3, 0xd2, 0x79, 0x72, 0xf5, 0xeb, 0xea,
+ 0x91, 0xbb, 0x70, 0x6e, 0x68, 0x88, 0x65, 0xab, 0xfe, 0xba, 0x3f, 0xa0,
+ 0x45, 0xd9, 0xe4, 0x1a, 0xab, 0xd2, 0x7a, 0x1a, 0xe4, 0x80, 0xb5, 0x8b,
+ 0x2d, 0x26, 0x4a, 0xa7, 0xa5, 0x8b, 0x7e, 0x8e, 0x2d, 0x21, 0x67, 0xd4,
+ 0xdf, 0xd4, 0xf6, 0x8a, 0xea, 0xdb, 0xc0, 0xb3, 0x66, 0x7a, 0xe9, 0x00,
+ 0xa6, 0xe7, 0xce, 0x7d, 0xe1, 0xe2, 0x26, 0xe6, 0x85, 0xe5, 0x11, 0x7e,
+ 0x89, 0x6e, 0xe4, 0xda, 0xfb, 0x21, 0xf3, 0x3c, 0x25, 0x76, 0x22, 0x4f,
+ 0x37, 0xfd, 0xc2, 0x59, 0x1f, 0xc4, 0x8e, 0x45, 0x54, 0x23, 0x97, 0xa8,
+ 0x61, 0xcb, 0x2e, 0xce, 0x56, 0xf1, 0xc2, 0xcd, 0x65, 0x67, 0x44, 0x7b,
+ 0x43, 0x1e, 0xab, 0xc8, 0xdb, 0xed, 0xfc, 0xb4, 0x47, 0x8e, 0x8e, 0xd0,
+ 0x3c, 0xad, 0xd2, 0xdd, 0xf7, 0xb0, 0xa7, 0x47, 0x68, 0x61, 0x34, 0x33,
+ 0x99, 0xc7, 0x18, 0x0c, 0xdc, 0xda, 0xd3, 0xc1, 0xaf, 0x45, 0xc7, 0x6e,
+ 0xbe, 0x0a, 0x69, 0xf9, 0xb6, 0x21, 0x7c, 0xa1, 0xfa, 0x12, 0xd8, 0x39,
+ 0x24, 0xf2, 0x8f, 0x1c, 0x6d, 0x3b, 0x99, 0x1b, 0x73, 0xc8, 0x01, 0x05,
+ 0x17, 0xd0, 0x88, 0x5b, 0xa8, 0x55, 0xfd, 0x5f, 0xe8, 0x24, 0xf5, 0xcd,
+ 0x9c, 0xb4, 0x13, 0x5b, 0x16, 0x74, 0x91, 0xb4, 0x61, 0x80, 0x90, 0x65,
+ 0x33, 0x2f, 0x69, 0xc2, 0xa0, 0x64, 0xcc, 0x53, 0x54, 0x57, 0x13, 0xb1,
+ 0x23, 0xec, 0x78, 0x86, 0xb3, 0x0a, 0x75, 0xd1, 0xdd, 0x30, 0xb7, 0xab,
+ 0xf6, 0x24, 0x49, 0x68, 0x34, 0xe3, 0x89, 0xac, 0xa1, 0x95, 0xb3, 0x75,
+ 0xed, 0x21, 0xc2, 0xc0, 0x2d, 0x6c, 0xf5, 0x9e, 0xc7, 0x17, 0xba, 0xe3,
+ 0x4e, 0xf9, 0x78, 0xf2, 0x5c, 0x98, 0x12, 0xe5, 0x3d, 0x45, 0xc4, 0xc5,
+ 0x42, 0x90, 0x61, 0x59, 0x0c, 0x47, 0xa7, 0xcc, 0xd7, 0xcb, 0xa9, 0x3f,
+ 0xd9, 0xdb, 0xc7, 0x78, 0x8b, 0x0e, 0x5b, 0xab, 0x4c, 0x25, 0x2a, 0x41,
+ 0xae, 0x52, 0x3b, 0x15, 0xe1, 0x0a, 0x25, 0x07, 0x4a, 0x7f, 0xe4, 0x10,
+ 0x5a, 0x9d, 0x0d, 0x2c, 0x15, 0xcd, 0x6b, 0x18, 0xeb, 0xb5, 0x9d, 0x08,
+ 0x2c, 0x81, 0xcf, 0xc0, 0x7c, 0x58, 0xbe, 0x3b, 0x92, 0xc2, 0x85, 0xe2,
+ 0xce, 0xc7, 0x8b, 0x0a, 0x13, 0x8b, 0x82, 0x69, 0xac, 0x8b, 0xf2, 0x67,
+ 0xb5, 0x92, 0x63, 0x1e, 0x68, 0x8d, 0x4c, 0x5f, 0xad, 0x7f, 0xd3, 0x27,
+ 0x44, 0x73, 0x78, 0x0d, 0xdb, 0x4d, 0xd5, 0x62, 0x1a, 0x74, 0x68, 0x6a,
+ 0x6e, 0xb9, 0x6f, 0x8e, 0x09, 0x33, 0x8f, 0xac, 0xf4, 0x80, 0x3d, 0xba,
+ 0x41, 0x7e, 0xb7, 0xdc, 0xe6, 0x3d, 0x25, 0xb0, 0xfc, 0xee, 0x29, 0x03,
+ 0x08, 0x83, 0x22, 0xcf, 0x04, 0x16, 0x1a, 0x55, 0x09, 0x50, 0xc2, 0xfb,
+ 0xe5, 0xe9, 0xd1, 0xd6, 0x86, 0xbf, 0x3a, 0x25, 0x03, 0xd3, 0x4b, 0xaa,
+ 0x0a, 0xde, 0x6e, 0x2e, 0x9d, 0xdb, 0x70, 0x6a, 0xe4, 0x0b, 0xf1, 0x91,
+ 0x48, 0xf7, 0x37, 0xa0, 0xa1, 0xd4, 0x94, 0xad, 0xf7, 0x30, 0x30, 0x71,
+ 0x10, 0x49, 0x2f, 0xed, 0x59, 0xd4, 0x37, 0x5a, 0xbf, 0xce, 0x6d, 0x0e,
+ 0xf0, 0x86, 0x23, 0x17, 0x4e, 0xc3, 0x81, 0xbc, 0x31, 0xfb, 0xe3, 0xe2,
+ 0x29, 0xd6, 0xbc, 0xef, 0x0a, 0xa4, 0x90, 0x4b, 0x90, 0x26, 0x12, 0xd2,
+ 0x7f, 0x27, 0x62, 0x55, 0x57, 0x72, 0xe4, 0xb8, 0x63, 0x94, 0x7f, 0x79,
+ 0xbc, 0xc6, 0x1e, 0x65, 0x28, 0x4c, 0xd4, 0xaa, 0x2e, 0x2c, 0x35, 0x63,
+ 0x02, 0xaa, 0x6e, 0x82, 0x57, 0x53, 0x3b, 0x32, 0xf0, 0x2c, 0x93, 0xe8,
+ 0x68, 0x7a, 0x47, 0x12, 0x69, 0xd8, 0x5e, 0xff, 0x75, 0xe2, 0x64, 0xd1,
+ 0xbb, 0x54, 0x92, 0x96, 0xb3, 0x86, 0xc6, 0x26, 0xd4, 0x92, 0x02, 0xa6,
+ 0xec, 0xcd, 0x64, 0x7f, 0x15, 0xee, 0xcc, 0x1d, 0x9a, 0xfa, 0x95, 0xf0,
+ 0x82, 0x11, 0xb8, 0x04, 0xfb, 0x14, 0xd4, 0xdd, 0x37, 0x86, 0x80, 0x30,
+ 0x2b, 0xcb, 0x4b, 0x05, 0x2b, 0x97, 0x86, 0x35, 0xe5, 0x15, 0xb4, 0xa9,
+ 0xf9, 0x0d, 0xbe, 0x1f, 0x55, 0xfa, 0x9a, 0x93, 0xe1, 0x9a, 0x9a, 0x15,
+ 0x5f, 0x51, 0x31, 0x85, 0xd6, 0xfe, 0xb7, 0xad, 0x3f, 0xcf, 0x74, 0x17,
+ 0x9c, 0xc4, 0x62, 0xc7, 0x02, 0x95, 0x68, 0xed, 0xb0, 0x89, 0x4b, 0x0e,
+ 0x7a, 0x2d, 0x93, 0x19, 0x6b, 0x90, 0x57, 0x92, 0x01, 0x2f, 0x56, 0x98,
+ 0x58, 0x38, 0xb7, 0xb1, 0xaf, 0x45, 0x81, 0x03, 0xe4, 0xd9, 0x09, 0x60,
+ 0x1f, 0x77, 0xb3, 0xe3, 0x88, 0xd4, 0xaa, 0x13, 0x16, 0xad, 0x91, 0x01,
+ 0xc0, 0x3c, 0xe3, 0xb5, 0xc9, 0x4c, 0x7a, 0xb0, 0x81, 0x36, 0xaf, 0x4e,
+ 0x21, 0x12, 0xf4, 0xf1, 0xd6, 0xe8, 0x60, 0x90, 0xb6, 0x3b, 0x45, 0xe6,
+ 0xeb, 0x22, 0xc5, 0x7f, 0xb1, 0xae, 0xce, 0xc0, 0x6c, 0x04, 0xd6, 0xcc,
+ 0xfd, 0xa2, 0x1b, 0x7d, 0x8c, 0x61, 0x5b, 0x6b, 0x91, 0x92, 0x22, 0x71,
+ 0xa0, 0xea, 0x01, 0xc3, 0xcf, 0x46, 0x8a, 0x8f, 0xdd, 0x28, 0xd4, 0x9f,
+ 0x0f, 0xfb, 0xfc, 0x25, 0xf2, 0xfd, 0x04, 0x84, 0x1e, 0x42, 0x02, 0x26,
+ 0x03, 0x83, 0x5c, 0x20, 0xee, 0xfa, 0x20, 0xe4, 0x18, 0xe0, 0xb3, 0xc9,
+ 0xe0, 0x3c, 0x6f, 0x4d, 0x66, 0xd3, 0x2a, 0x81, 0x35, 0xbf, 0xd4, 0x9c,
+ 0xe8, 0x11, 0xec, 0xe4, 0x8b, 0x33, 0x9a, 0xb0, 0xf4, 0x6b, 0x66, 0x62,
+ 0xa1, 0xa8, 0x07, 0xc9, 0x52, 0x64, 0xc4, 0x4e, 0xa6, 0x36, 0xdf, 0x21,
+ 0x4f, 0xab, 0xbc, 0xd2, 0x83, 0x7d, 0x13, 0x88, 0x4a, 0xff, 0x87, 0xab,
+ 0x25, 0xab, 0xbf, 0x64, 0xb5, 0x90, 0x9b, 0x4a, 0x7a, 0xf1, 0x6c, 0xfa,
+ 0x1b, 0x57, 0x8d, 0x55, 0xc7, 0xe6, 0x0e, 0x63, 0x49, 0x94, 0x60, 0x75,
+ 0x1c, 0x82, 0xde, 0xb0, 0xe1, 0x6c, 0x52, 0xaa, 0xd2, 0x2f, 0x1c, 0x03,
+ 0xe2, 0x29, 0x8c, 0xc2, 0x55, 0xfb, 0x09, 0x59, 0xd0, 0x85, 0xe2, 0x38,
+ 0x01, 0xac, 0x50, 0xe0, 0x7f, 0x2d, 0xe8, 0x2d, 0xf1, 0x6d, 0x24, 0xf2,
+ 0xda, 0x15, 0x83, 0x03, 0xa4, 0x2d, 0xc4, 0x5f, 0xb9, 0xd0, 0x90, 0x56,
+ 0x3c, 0xad, 0x40, 0x30, 0x0d, 0x9e, 0xb6, 0xa1, 0x1a, 0x0b, 0x18, 0xad,
+ 0x51, 0x7c, 0x5f, 0xff, 0x01, 0x95, 0x03, 0xe7, 0x7e, 0xa1, 0x4a, 0xc8,
+ 0x66, 0x22, 0x8b, 0x0d, 0x65, 0x0b, 0xac, 0x3d, 0x48, 0x91, 0x82, 0x72,
+ 0x74, 0x76, 0x47, 0xec, 0xed, 0xb9, 0xd4, 0x26, 0xc1, 0x6c, 0xea, 0xf0,
+ 0x30, 0x34, 0x8f, 0x8d, 0x0c, 0x43, 0x0f, 0xd1, 0x6b, 0x9e, 0x6f, 0xeb,
+ 0xa5, 0x58, 0xf0, 0xde, 0x11, 0xa6, 0x6a, 0xde, 0xff, 0xdd, 0xc7, 0x24,
+ 0x5b, 0x75, 0xf1, 0x51, 0xe5, 0x3e, 0x30, 0x9f, 0x09, 0xc4, 0xdf, 0x97,
+ 0xed, 0xac, 0xa0, 0x1d, 0x94, 0x97, 0xca, 0x17, 0x80, 0xb2, 0x3c, 0x6f,
+ 0x67, 0xc8, 0x2a, 0x57, 0xbd, 0xff, 0xf7, 0x77, 0x76, 0x8e, 0xdc, 0x78,
+ 0xe7, 0xc1, 0xd7, 0xb9, 0x56, 0xd5, 0xf0, 0xf2, 0xd9, 0x95, 0x85, 0xdf,
+ 0xa5, 0x51, 0xb4, 0x58, 0x2b, 0x9b, 0x72, 0xac, 0x5b, 0x7e, 0x8b, 0xda,
+ 0x78, 0x55, 0x05, 0xe1, 0xb9, 0x0b, 0x97, 0x32, 0x95, 0x3a, 0xd8, 0xce,
+ 0x6b, 0xaf, 0x9a, 0xf6, 0x1b, 0x2a, 0xb5, 0xe5, 0x0b, 0xfc, 0x7b, 0xb9,
+ 0xb0, 0x97, 0xe6, 0x39, 0xac, 0xcb, 0x9a, 0xff, 0xc6, 0x32, 0x20, 0xa9,
+ 0xe5, 0x42, 0x8a, 0x3b, 0x21, 0xdd, 0x96, 0x5e, 0x78, 0xb0, 0x9c, 0x68,
+ 0xf6, 0x03, 0xfe, 0x5d, 0xac, 0x0b, 0x75, 0x68, 0x44, 0x22, 0x24, 0xf9,
+ 0x1d, 0x94, 0xef, 0xfd, 0xdd, 0x18, 0x03, 0x37, 0xff, 0x16, 0xc5, 0xd1,
+ 0x5d, 0x20, 0xb9, 0x87, 0xf7, 0x64, 0xcf, 0xe0, 0x8d, 0x25, 0xdb, 0x10,
+ 0xa1, 0x9a, 0x7e, 0xa7, 0xd5, 0x0f, 0x7d, 0x95, 0x3c, 0xdc, 0xa5, 0x72,
+ 0x57, 0xb6, 0x25, 0x7b, 0xd0, 0xe7, 0x07, 0x74, 0x38, 0xc8, 0x7a, 0x29,
+ 0xc2, 0xca, 0x21, 0x55, 0xd7, 0xd9, 0xeb, 0x27, 0x56, 0xae, 0xdd, 0xc5,
+ 0x68, 0x9e, 0xd3, 0x06, 0xe7, 0xe9, 0x5c, 0x9e, 0x0c, 0x32, 0x62, 0xb2,
+ 0x98, 0x97, 0xd2, 0x87, 0x3e, 0xcc, 0x60, 0x6f, 0x71, 0x67, 0xf5, 0xcf,
+ 0x7e, 0x08, 0x6c, 0xd4, 0x9e, 0xab, 0x4c, 0xa2, 0xfa, 0x7d, 0x4e, 0x57,
+ 0x00, 0x66, 0x93, 0x2a, 0xb6, 0x3c, 0x83, 0x1f, 0x32, 0xc0, 0x42, 0xdd,
+ 0x6e, 0xa9, 0xca, 0x5d, 0xb6, 0xc1, 0xee, 0xb2, 0x45, 0x51, 0xf4, 0xb3,
+ 0x8b, 0xb4, 0x7b, 0x89, 0x4d, 0x15, 0x11, 0x16, 0xe2, 0xf1, 0xc5, 0xb6,
+ 0x64, 0x00, 0x53, 0x90, 0x88, 0x80, 0xec, 0x25, 0x50, 0xef, 0xf1, 0x8a,
+ 0x27, 0x72, 0xad, 0xd6, 0x70, 0xfc, 0x36, 0x0d, 0x59, 0xb9, 0x25, 0x34,
+ 0xd3, 0x66, 0xa0, 0x7a, 0x49, 0x2b, 0xfe, 0x5a, 0xbf, 0x7f, 0x7e, 0x26,
+ 0x03, 0x51, 0xa2, 0x36, 0xc5, 0x06, 0xed, 0xc7, 0xea, 0x5c, 0xea, 0xa4,
+ 0x26, 0x47, 0xb7, 0xc8, 0x22, 0x62, 0x16, 0x5a, 0x56, 0xf5, 0xf6, 0x67,
+ 0xbd, 0x8a, 0xdd, 0x81, 0x6f, 0x90, 0xa9, 0xaa, 0x5a, 0x97, 0xc9, 0x03,
+ 0x36, 0x5c, 0x43, 0x2d, 0xbd, 0x90, 0x4a, 0x27, 0x62, 0x20, 0x1f, 0x9c,
+ 0x93, 0x86, 0xae, 0xd3, 0x5f, 0xe3, 0xd4, 0x95, 0x5b, 0x23, 0x50, 0x6d,
+ 0x01, 0xcd, 0x4b, 0x6a, 0x63, 0xf5, 0x32, 0x9c, 0xab, 0xfa, 0x42, 0xe5,
+ 0x42, 0x1a, 0x5d, 0xc6, 0x1c, 0x65, 0x71, 0xe1, 0x61, 0xcd, 0x0c, 0xc5,
+ 0x95, 0xe2, 0xb1, 0xf9, 0xeb, 0xa3, 0xfb, 0xe6, 0x2e, 0xdd, 0x0f, 0xd6,
+ 0xf1, 0x1b, 0xb2, 0x6e, 0x9d, 0xbb, 0xc9, 0x7c, 0x9a, 0x02, 0xce, 0xb1,
+ 0x78, 0x86, 0x66, 0x6e, 0x44, 0x11, 0xe9, 0x78, 0x4b, 0x43, 0x33, 0x3d,
+ 0xec, 0x5c, 0xd0, 0x4a, 0x47, 0x5e, 0xf3, 0x96, 0x9e, 0xef, 0x06, 0x00,
+ 0xa1, 0xe5, 0x38, 0xec, 0x89, 0xcf, 0xe6, 0xde, 0x5f, 0x0f, 0xb4, 0x7c,
+ 0xdd, 0xaf, 0xe8, 0xdc, 0x38, 0x36, 0xb6, 0xb4, 0x1d, 0xb3, 0xad, 0x86,
+ 0x52, 0x6d, 0xa0, 0xe6, 0xb5, 0x8c, 0x11, 0x4d, 0x64, 0xf6, 0x41, 0x8c,
+ 0xcd, 0xbc, 0x4b, 0xad, 0x53, 0x6e, 0xbc, 0xb1, 0xc7, 0xd5, 0xa6, 0xf9,
+ 0xdc, 0x2c, 0xc8, 0x18, 0xdd, 0x2f, 0x8d, 0xef, 0x9a, 0xa8, 0xa6, 0x3e,
+ 0x25, 0x65, 0xfd, 0xfb, 0xa4, 0xd4, 0x4c, 0x45, 0x54, 0xe9, 0x1b, 0x11,
+ 0x06, 0xc9, 0x67, 0x51, 0xc8, 0x1e, 0xc6, 0xcf, 0x92, 0xc1, 0xce, 0xcf,
+ 0x52, 0x9c, 0x29, 0x4e, 0x24, 0xfb, 0x30, 0xce, 0x9e, 0xda, 0xa9, 0xc8,
+ 0x69, 0x69, 0x16, 0xb2, 0x4e, 0x98, 0x4e, 0xf7, 0x9a, 0x1a, 0xf7, 0x75,
+ 0xcc, 0xe2, 0x57, 0x11, 0xcc, 0x5b, 0xf1, 0xfd, 0xd3, 0x57, 0xa9, 0xef,
+ 0x29, 0x20, 0x66, 0x41, 0x1b, 0x7e, 0x35, 0xc2, 0x0e, 0x69, 0xa2, 0x16,
+ 0xa1, 0x37, 0x2d, 0x5b, 0x86, 0x6b, 0x12, 0x0c, 0x9c, 0x8d, 0xb9, 0x15,
+ 0xe0, 0xb7, 0xd5, 0xfb, 0x40, 0x6c, 0xc5, 0x0a, 0x77, 0xe7, 0xfc, 0x89,
+ 0xe0, 0x41, 0xf7, 0x6b, 0xda, 0x93, 0x5d, 0xef, 0xc3, 0x35, 0x1e, 0xe3,
+ 0x4b, 0x40, 0x89, 0x96, 0x3a, 0x9e, 0x05, 0x8b, 0xc1, 0x6d, 0xe3, 0xd6,
+ 0xde, 0x61, 0x3c, 0xdd, 0x40, 0xac, 0xda, 0x3b, 0x5c, 0x43, 0x1d, 0xef,
+ 0x22, 0x6c, 0xee, 0x99, 0xd4, 0x3a, 0xc4, 0x56, 0xd1, 0x25, 0xba, 0x5d,
+ 0x88, 0xeb, 0xf4, 0xd3, 0x50, 0xef, 0xed, 0x1c, 0x17, 0x0c, 0x2c, 0x94,
+ 0xdf, 0xcb, 0x92, 0xcb, 0xc0, 0x9d, 0xbe, 0xaf, 0x5c, 0x83, 0xf6, 0x70,
+ 0x96, 0x7a, 0xac, 0x0e, 0x44, 0xd1, 0x6d, 0x9a, 0xd2, 0x24, 0x61, 0x12,
+ 0xda, 0x91, 0xbc, 0xce, 0x95, 0x6a, 0x4d, 0x7f, 0x5d, 0xf5, 0x2b, 0x10,
+ 0xa4, 0x25, 0x05, 0xf3, 0xcd, 0xf1, 0x1d, 0x14, 0x91, 0x73, 0xb9, 0xf3,
+ 0xf6, 0x50, 0xeb, 0x73, 0xf5, 0xb5, 0xff, 0xcc, 0xbd, 0xcb, 0x7d, 0x09,
+ 0xfb, 0x17, 0x06, 0x87, 0x6b, 0x84, 0x42, 0x91, 0x50, 0xf7, 0x4c, 0x07,
+ 0x5d, 0x44, 0x2f, 0x04, 0x68, 0x84, 0x71, 0x23, 0x8b, 0x11, 0x1b, 0x22,
+ 0xd1, 0xb8, 0xba, 0xab, 0x11, 0xd8, 0x08, 0xa0, 0x90, 0xda, 0xea, 0xb9,
+ 0xf3, 0x5b, 0x82, 0x5e, 0x26, 0x25, 0x53, 0xae, 0x89, 0x1b, 0x15, 0xf4,
+ 0x07, 0xc1, 0xc2, 0x94, 0x4c, 0x25, 0x95, 0x89, 0xd2, 0x09, 0x99, 0x10,
+ 0x8b, 0xda, 0x5f, 0xa8, 0xfd, 0x23, 0x4f, 0xad, 0xa3, 0xfa, 0x13, 0x41,
+ 0xf3, 0xbf, 0x2c, 0xbd, 0x29, 0xfc, 0x2c, 0xf6, 0x3c, 0x07, 0x2a, 0x12,
+ 0xcc, 0xf3, 0x36, 0xd4, 0xf5, 0x02, 0x2c, 0x63, 0x17, 0xd0, 0xf4, 0x16,
+ 0x0a, 0xca, 0x17, 0x40, 0x1c, 0xd4, 0x94, 0xdc, 0x9f, 0x27, 0x93, 0x28,
+ 0x39, 0x8e, 0x8f, 0x5e, 0x57, 0x0b, 0x9b, 0x60, 0x73, 0xa1, 0x2b, 0xd9,
+ 0xc3, 0x4e, 0x5e, 0x1b, 0x1c, 0xaa, 0x5a, 0x0c, 0x80, 0xec, 0x00, 0x15,
+ 0x0d, 0x36, 0xb7, 0xbc, 0x8b, 0xae, 0x1f, 0x24, 0x9b, 0xd8, 0xa8, 0x3b,
+ 0x1d, 0x51, 0xb4, 0x3b, 0x63, 0x33, 0xf1, 0x99, 0x17, 0xbf, 0xaf, 0x9e,
+ 0xd1, 0x25, 0xb2, 0x43, 0x18, 0x07, 0xc2, 0x27, 0xad, 0x5d, 0x77, 0x7a,
+ 0x87, 0x55, 0x83, 0xfc, 0xdd, 0x05, 0x70, 0x95, 0xab, 0xfe, 0x2a, 0x32,
+ 0x82, 0x9a, 0xb0, 0xd5, 0xd4, 0x17, 0x84, 0x97, 0x61, 0xb7, 0x86, 0x08,
+ 0x2c, 0x2c, 0xb5, 0x1a, 0x99, 0x7d, 0x68, 0xfc, 0xc6, 0x82, 0xea, 0x7c,
+ 0x43, 0x0f, 0xbe, 0x8d, 0x9c, 0xbf, 0x2a, 0x9f, 0x84, 0x88, 0x30, 0xc6,
+ 0x69, 0xf2, 0xca, 0x4c, 0x83, 0xef, 0x42, 0x43, 0x05, 0x2f, 0xee, 0xf9,
+ 0xe0, 0x5b, 0xef, 0xd8, 0x5c, 0x1f, 0x04, 0x2b, 0xf5, 0x2f, 0x9f, 0xf5,
+ 0x5c, 0x52, 0x53, 0x1e, 0x1e, 0xaa, 0xe2, 0xab, 0xdf, 0x19, 0x33, 0xbb,
+ 0x5b, 0x07, 0xa5, 0x79, 0x0d, 0xd4, 0xeb, 0x1b, 0xc6, 0x64, 0x24, 0x5d,
+ 0x9e, 0x2a, 0x22, 0x67, 0x08, 0xb6, 0x6f, 0x20, 0xb3, 0xf7, 0x34, 0xc9,
+ 0xac, 0xd3, 0x5f, 0xa6, 0xc2, 0x97, 0xcf, 0xe4, 0x74, 0x47, 0x60, 0x7d,
+ 0x5f, 0xde, 0x64, 0x52, 0x4f, 0xb6, 0x79, 0x2e, 0xad, 0x4d, 0xaa, 0x81,
+ 0x02, 0x7b, 0xce, 0x30, 0xdf, 0xb2, 0xd0, 0xa7, 0xbe, 0x60, 0x39, 0x41,
+ 0x6e, 0x63, 0x50, 0xc7, 0x41, 0x45, 0xcc, 0x62, 0x55, 0x98, 0x7c, 0x43,
+ 0x48, 0x3b, 0xe1, 0xfd, 0xb7, 0xd7, 0x4d, 0x9f, 0xf6, 0x4d, 0x53, 0xdb,
+ 0xcb, 0x48, 0x36, 0x1a, 0x1e, 0xb9, 0x16, 0x34, 0xa2, 0x4f, 0x44, 0x01,
+ 0xfb, 0x97, 0xe9, 0x35, 0x10, 0xf8, 0x9c, 0x74, 0x56, 0x8a, 0x94, 0x3c,
+ 0x31, 0x0e, 0x96, 0xa4, 0x36, 0x54, 0x6d, 0x0f, 0x4a, 0x57, 0x7b, 0xb2,
+ 0xf2, 0xe0, 0x12, 0x87, 0x69, 0xec, 0x0b, 0xa0, 0x0e, 0xdc, 0x7c, 0x60,
+ 0xcb, 0x88, 0x20, 0x5f, 0x57, 0x6f, 0xa3, 0xc8, 0x1a, 0x1c, 0x95, 0x8f,
+ 0x8d, 0xed, 0xd6, 0x90, 0x6a, 0x50, 0x6b, 0x78, 0x8b, 0x8b, 0x98, 0x01,
+ 0x21, 0xf7, 0xf5, 0x67, 0xf5, 0xa7, 0xb8, 0xd7, 0xbd, 0xf4, 0x0c, 0x77,
+ 0x12, 0x63, 0xe7, 0x4e, 0xde, 0x3d, 0x1f, 0x61, 0x2d, 0xb1, 0x3c, 0xc2,
+ 0x7e, 0x4e, 0x78, 0x8c, 0x30, 0x4a, 0x8b, 0xcf, 0xfb, 0x38, 0xcd, 0xc2,
+ 0x87, 0xd1, 0x27, 0xa0, 0x6d, 0xde, 0x71, 0x41, 0xc8, 0x0e, 0x44, 0xc5,
+ 0x60, 0xc9, 0x6d, 0xca, 0xee, 0xf9, 0xe5, 0x9b, 0xbc, 0xf7, 0x8f, 0x03,
+ 0x8d, 0x25, 0x19, 0xe9, 0xe6, 0xdf, 0xf4, 0x7e, 0xc1, 0x84, 0x9c, 0x2d,
+ 0x80, 0xfd, 0x55, 0xb0, 0x42, 0xd6, 0xd4, 0x09, 0xb6, 0x37, 0x7b, 0xee,
+ 0x2f, 0xa9, 0x81, 0xba, 0x6b, 0xd5, 0xc6, 0xd8, 0x38, 0xf5, 0x49, 0xed,
+ 0xa7, 0x18, 0x79, 0x7f, 0x8e, 0x36, 0x97, 0x8f, 0x3f, 0x83, 0x19, 0x49,
+ 0xea, 0x8d, 0x90, 0xb6, 0x59, 0x5c, 0xe4, 0x03, 0xe0, 0x2e, 0xbb, 0x3c,
+ 0xf4, 0x5a, 0xf0, 0x01, 0x16, 0xd1, 0x6b, 0x35, 0x40, 0x5b, 0x9d, 0x50,
+ 0xf2, 0xaf, 0xdc, 0xf1, 0x39, 0x23, 0xbd, 0xa4, 0xe4, 0x85, 0x19, 0x8f,
+ 0xc6, 0xdc, 0xa1, 0xf9, 0x03, 0x89, 0xea, 0x3a, 0x58, 0x35, 0x5e, 0xb5,
+ 0xa2, 0x7d, 0x42, 0x72, 0xcf, 0xa0, 0x4e, 0xdd, 0xdc, 0x0d, 0x34, 0x8c,
+ 0x0c, 0x5c, 0xc0, 0x2b, 0x53, 0x3e, 0x58, 0x91, 0xc0, 0xc0, 0x6d, 0xef,
+ 0x26, 0x57, 0xd9, 0x1e, 0x5f, 0xd7, 0xec, 0xc8, 0x6e, 0x4c, 0xec, 0xca,
+ 0xda, 0x9d, 0x17, 0x85, 0xd2, 0x74, 0xa3, 0xc0, 0x14, 0xf4, 0x16, 0xb7,
+ 0x53, 0x03, 0xc4, 0x0e, 0x0b, 0x5a, 0x6f, 0xad, 0x8f, 0xde, 0x6b, 0xc1,
+ 0x4b, 0xff, 0x9d, 0xbc, 0x9a, 0x24, 0xd8, 0xe1, 0x30, 0x91, 0x43, 0xdf,
+ 0xd1, 0x0a, 0xe8, 0x25, 0x6b, 0xc2, 0x8f, 0xc1, 0xc6, 0xcb, 0x43, 0xe4,
+ 0xef, 0x1b, 0xc3, 0xba, 0xf5, 0x09, 0xba, 0xbc, 0x06, 0x90, 0xa4, 0x0e,
+ 0x00, 0x7d, 0x54, 0x18, 0xe4, 0xfe, 0x3c, 0xef, 0x48, 0x25, 0x69, 0x3c,
+ 0x7c, 0x31, 0x6e, 0xde, 0x8f, 0xac, 0x47, 0x23, 0xc0, 0x93, 0xab, 0xa0,
+ 0xef, 0xfd, 0x9a, 0xfc, 0x54, 0xd9, 0x3d, 0x0c, 0xd5, 0x43, 0x1a, 0xa9,
+ 0x7a, 0xc2, 0x45, 0x5a, 0xff, 0xca, 0x27, 0x5a, 0x76, 0x3e, 0xb7, 0x48,
+ 0x30, 0x84, 0x9e, 0xc6, 0x09, 0x7c, 0xc1, 0x27, 0xd0, 0x46, 0xc5, 0xac,
+ 0x10, 0x50, 0x03, 0x94, 0xe2, 0xf1, 0x39, 0xb9, 0xf6, 0x44, 0x78, 0x8e,
+ 0xee, 0xaa, 0x20, 0xf0, 0xc0, 0x55, 0xc8, 0xe9, 0x39, 0xa2, 0x16, 0xb8,
+ 0x0b, 0xa8, 0xf1, 0x4d, 0x66, 0xda, 0x1d, 0xfd, 0xee, 0x96, 0x0a, 0x17,
+ 0x92, 0xa7, 0x3a, 0xf2, 0xa2, 0xac, 0xb8, 0x02, 0x40, 0x5d, 0x51, 0x19,
+ 0xd6, 0xad, 0x70, 0x56, 0x9d, 0x68, 0xb5, 0xa0, 0xc2, 0xb3, 0xfa, 0xfb,
+ 0x54, 0xc9, 0xc3, 0xad, 0xf6, 0xb8, 0x69, 0xd1, 0x42, 0x1d, 0x5c, 0x06,
+ 0x63, 0x41, 0x70, 0x5d, 0xd9, 0xaa, 0x31, 0x32, 0xa0, 0x9f, 0x55, 0xaf,
+ 0x0f, 0xfa, 0x0c, 0x01, 0x0f, 0xdd, 0xf4, 0x23, 0x3f, 0xa0, 0xd1, 0x0d,
+ 0x6a, 0xa2, 0xe2, 0xee, 0x9d, 0xfa, 0x5b, 0x74, 0xaa, 0xfe, 0x7c, 0x23,
+ 0x8c, 0x9c, 0xae, 0x89, 0x26, 0xfc, 0x13, 0xca, 0xc6, 0x09, 0xac, 0xc4,
+ 0x2a, 0x5b, 0x5d, 0xdc, 0x52, 0x10, 0xf0, 0x27, 0x4a, 0x98, 0xaa, 0x7f,
+ 0xa1, 0x3b, 0xbc, 0xd2, 0xaf, 0x8d, 0x5e, 0x3d, 0xbe, 0x51, 0xdf, 0x4e,
+ 0xf3, 0xf5, 0xc3, 0xe9, 0x31, 0x72, 0x20, 0x6b, 0xb0, 0x62, 0xe6, 0x80,
+ 0x70, 0x6a, 0x40, 0xa0, 0xe9, 0x79, 0x0d, 0x91, 0x2f, 0x1a, 0x8d, 0x81,
+ 0xb5, 0xe0, 0x2a, 0xc4, 0xec, 0x27, 0x26, 0x76, 0x49, 0x79, 0x5f, 0x69,
+ 0x50, 0x13, 0x1c, 0x31, 0xb3, 0x55, 0x59, 0xf2, 0x0f, 0x68, 0x4a, 0x3b,
+ 0x25, 0x44, 0x45, 0x3e, 0x56, 0x96, 0xb8, 0x21, 0xd5, 0x6c, 0x50, 0xe1,
+ 0x56, 0x47, 0x80, 0x22, 0xd6, 0xe5, 0x8c, 0xf5, 0x78, 0xdb, 0xd4, 0x0b,
+ 0xd3, 0xa9, 0x4d, 0x7b, 0xf4, 0x61, 0x49, 0x3e, 0xe3, 0xf2, 0xd7, 0x16,
+ 0x87, 0xd4, 0x56, 0xda, 0x06, 0x8c, 0xc4, 0x1c, 0xb7, 0xf4, 0x52, 0x4b,
+ 0x84, 0x26, 0xce, 0x78, 0x17, 0xa0, 0x25, 0xaa, 0x6a, 0x11, 0x68, 0x31,
+ 0xa5, 0xc8, 0x5b, 0xb8, 0x06, 0x39, 0xea, 0x0b, 0xf9, 0x79, 0x4d, 0xe0,
+ 0x75, 0x78, 0xb8, 0x43, 0x6d, 0xdd, 0x62, 0x74, 0xdd, 0x0a, 0x83, 0xc5,
+ 0x4c, 0x2e, 0xe4, 0x81, 0x58, 0x6c, 0xab, 0xfd, 0xb1, 0x46, 0x30, 0x74,
+ 0xcc, 0x6e, 0xa7, 0x52, 0xa5, 0x93, 0xe9, 0xf8, 0x9b, 0xb3, 0xc3, 0x28,
+ 0x4d, 0x81, 0xa9, 0x55, 0x74, 0x0e, 0xa2, 0x33, 0xa1, 0xd3, 0xe9, 0xa8,
+ 0x6a, 0xf5, 0x54, 0xaa, 0xc9, 0x2d, 0x31, 0xc1, 0x51, 0x25, 0x86, 0xaa,
+ 0x64, 0x7d, 0x81, 0x91, 0xd0, 0x7c, 0x6d, 0x42, 0xe7, 0x1c, 0x0f, 0xc7,
+ 0x13, 0xa0, 0x1d, 0xb0, 0x1c, 0xa5, 0xeb, 0xbc, 0x44, 0xbe, 0x54, 0x29,
+ 0x0a, 0x8b, 0x26, 0xee, 0xae, 0x88, 0xd0, 0x4b, 0x50, 0xd3, 0x43, 0x7b,
+ 0x3a, 0x4e, 0xd6, 0xe4, 0x6b, 0x41, 0x68, 0xba, 0xe7, 0x3b, 0xae, 0xb0,
+ 0x35, 0x23, 0x92, 0x52, 0xfe, 0x60, 0x31, 0xa2, 0xaf, 0xd2, 0x51, 0xca,
+ 0xb1, 0xa5, 0x1a, 0x04, 0xf3, 0x7e, 0x24, 0x78, 0x89, 0xda, 0xec, 0x2d,
+ 0xca, 0x88, 0x12, 0x5c, 0xf8, 0xab, 0xec, 0xbe, 0x50, 0xb9, 0x9e, 0x28,
+ 0x74, 0x10, 0x8b, 0x0c, 0x06, 0xad, 0xcc, 0x37, 0x57, 0x44, 0x57, 0x38,
+ 0x6b, 0x43, 0x65, 0xc1, 0xe8, 0x4e, 0x7c, 0x22, 0xa8, 0xe3, 0x2b, 0x45,
+ 0x48, 0xd3, 0xd5, 0xdd, 0x2b, 0x79, 0xbf, 0xc9, 0xe7, 0xd0, 0xe5, 0x61,
+ 0xb9, 0x31, 0xd9, 0xe5, 0xb8, 0xe1, 0x37, 0xaf, 0xf8, 0x8b, 0x60, 0xf6,
+ 0xc7, 0xcf, 0xff, 0x4e, 0xaa, 0xd5, 0xf0, 0x3c, 0x33, 0x01, 0x37, 0x54,
+ 0x99, 0x2e, 0xef, 0xbc, 0x05, 0x4b, 0xd1, 0x10, 0xb6, 0xbb, 0xc7, 0x3c,
+ 0x37, 0x6c, 0xb1, 0x95, 0x13, 0xb9, 0x04, 0x2c, 0x2f, 0xec, 0x3e, 0x9f,
+ 0xb1, 0x9b, 0x72, 0x11, 0xab, 0x40, 0xec, 0xee, 0x91, 0x8d, 0x56, 0x66,
+ 0x78, 0x7b, 0x40, 0xa7, 0xb6, 0x5d, 0x77, 0x28, 0xa7, 0x4f, 0x7d, 0x7f,
+ 0x83, 0x29, 0xa9, 0x0e, 0xe4, 0xcf, 0x18, 0x28, 0x95, 0x60, 0x0c, 0x89,
+ 0x3a, 0xb3, 0xb9, 0x52, 0x28, 0x16, 0x76, 0x26, 0x16, 0x40, 0xca, 0xc5,
+ 0x4c, 0x6f, 0xc6, 0x58, 0x61, 0xd0, 0x92, 0x3a, 0x91, 0x18, 0x94, 0x6e,
+ 0xb8, 0x12, 0xc2, 0xfd, 0x7c, 0xaa, 0x29, 0x67, 0x33, 0xb9, 0x12, 0x59,
+ 0x64, 0xe7, 0x0d, 0xd3, 0x05, 0x08, 0x4e, 0xd6, 0xd4, 0xaa, 0xaa, 0xc6,
+ 0x07, 0x6c, 0xa6, 0x57, 0x9d, 0x48, 0x95, 0x8a, 0x33, 0xe6, 0x22, 0x05,
+ 0xa2, 0x18, 0xcc, 0x52, 0x65, 0x2e, 0xc8, 0xfe, 0x28, 0x8e, 0x23, 0x1f,
+ 0x02, 0x4e, 0x5a, 0x07, 0xc0, 0xaf, 0x6c, 0x9b, 0x11, 0x97, 0xc1, 0xdd,
+ 0x4b, 0x6e, 0xc4, 0x90, 0x43, 0x0f, 0xcf, 0x90, 0x1d, 0x9d, 0xf6, 0x9e,
+ 0xf1, 0x77, 0xed, 0x4e, 0x69, 0x28, 0xac, 0x75, 0x7f, 0x7e, 0x9d, 0x76,
+ 0xd9, 0xb2, 0x5a, 0x69, 0x85, 0x21, 0xff, 0x14, 0xd2, 0x79, 0xc1, 0xa7,
+ 0x1f, 0x4a, 0xac, 0x0a, 0xf9, 0x31, 0x38, 0x63, 0x09, 0xfa, 0x4e, 0x84,
+ 0x99, 0xfc, 0x84, 0x40, 0xcc, 0x8f, 0x25, 0xbb, 0xbb, 0x77, 0x58, 0xb4,
+ 0x08, 0x66, 0x59, 0x5d, 0x31, 0xdf, 0xbe, 0x6a, 0xd7, 0xd1, 0xdf, 0x18,
+ 0x34, 0xfc, 0xab, 0x9c, 0xea, 0x5a, 0xd6, 0xb2, 0x31, 0x75, 0x43, 0xd2,
+ 0x80, 0x51, 0xa6, 0x84, 0xba, 0x37, 0xfd, 0x42, 0x00, 0x58, 0x85, 0xa9,
+ 0xa9, 0x57, 0xf2, 0x79, 0xce, 0x9d, 0x00, 0xe6, 0x55, 0xf4, 0x17, 0x14,
+ 0x0a, 0xed, 0x97, 0xdc, 0xb7, 0x4d, 0x7b, 0xed, 0xe4, 0x57, 0x13, 0xcd,
+ 0x92, 0xb3, 0x06, 0xd9, 0x8d, 0xff, 0x8a, 0x0b, 0x36, 0x83, 0x0b, 0x1b,
+ 0x61, 0x24, 0xb4, 0x74, 0x65, 0x93, 0xc8, 0x2a, 0x19, 0xa9, 0x25, 0x39,
+ 0x4b, 0x01, 0xfb, 0xf6, 0x16, 0xf3, 0xf9, 0x17, 0xf5, 0x9b, 0x53, 0xdf,
+ 0x21, 0xea, 0xd4, 0x18, 0x6a, 0xc3, 0x1e, 0x00, 0xfc, 0x1b, 0xd1, 0xd6,
+ 0x75, 0x6f, 0x09, 0x01, 0x53, 0x81, 0x78, 0x74, 0x5e, 0xd4, 0x6d, 0xc7,
+ 0xf2, 0xdf, 0x6d, 0xa2, 0xda, 0x4c, 0x8c, 0xbb, 0xac, 0x50, 0xc4, 0x9a,
+ 0x3a, 0x97, 0x83, 0xd7, 0xfe, 0xe6, 0x38, 0x06, 0x9b, 0xb4, 0x41, 0x00,
+ 0x1a, 0x3b, 0x22, 0x8f, 0x81, 0xcf, 0x65, 0x74, 0xd9, 0x17, 0x3d, 0xd0,
+ 0xe2, 0xe9, 0xbd, 0xf5, 0x3a, 0x19, 0xa1, 0xb6, 0x60, 0xcf, 0xdf, 0x90,
+ 0x06, 0xb5, 0x83, 0x44, 0xd2, 0x7b, 0x6f, 0xb2, 0xb3, 0x1d, 0x8f, 0xdc,
+ 0x8c, 0x26, 0x41, 0x3a, 0x24, 0x06, 0xd8, 0x25, 0x58, 0xa3, 0x16, 0x16,
+ 0xd0, 0x89, 0xa1, 0x33, 0x77, 0x19, 0x1e, 0xa8, 0xce, 0xd1, 0x94, 0xba,
+ 0xb8, 0x21, 0x8b, 0x42, 0x55, 0x26, 0x60, 0x2d, 0x7f, 0xc1, 0x69, 0xdd,
+ 0x2a, 0x24, 0x41, 0x31, 0x40, 0x88, 0x11, 0x24, 0xe0, 0xe7, 0x91, 0x69,
+ 0x12, 0xc2, 0xaa, 0xa6, 0x6e, 0xd6, 0xd2, 0x76, 0x52, 0x92, 0x22, 0x34,
+ 0x73, 0xe8, 0xae, 0xfa, 0x14, 0x0f, 0xb9, 0xb0, 0x40, 0x50, 0x28, 0xfa,
+ 0xb2, 0x6c, 0xa7, 0x2c, 0x2e, 0x79, 0x5d, 0xf8, 0x43, 0x39, 0x16, 0x01,
+ 0xf5, 0x9d, 0x07, 0x42, 0x90, 0xae, 0xac, 0x9d, 0xec, 0x8a, 0xc7, 0x59,
+ 0x56, 0x42, 0x9a, 0x1f, 0xb7, 0xd6, 0x71, 0x26, 0x4f, 0xf6, 0x44, 0xcd,
+ 0x16, 0xad, 0x2e, 0xa2, 0x9a, 0xee, 0xff, 0xf3, 0xaf, 0xdd, 0xdf, 0xf7,
+ 0x29, 0x1a, 0x35, 0x09, 0x35, 0xd0, 0x05, 0xd5, 0x5d, 0x56, 0xcc, 0x14,
+ 0x89, 0x56, 0x3b, 0x96, 0x1f, 0xfe, 0xcc, 0xec, 0x5e, 0x74, 0x61, 0x2e,
+ 0x8f, 0x52, 0xbf, 0x4b, 0x4a, 0xe4, 0x9c, 0x15, 0x3f, 0xcd, 0x47, 0xd6,
+ 0xda, 0x3e, 0x7c, 0x54, 0xad, 0x50, 0xe1, 0x67, 0x7a, 0x32, 0xbe, 0xc9,
+ 0xe0, 0x4f, 0xfe, 0x92, 0x07, 0xa2, 0xf9, 0xd5, 0xe2, 0xdf, 0x27, 0x99,
+ 0x33, 0xc9, 0xed, 0x8f, 0x63, 0x97, 0x8a, 0xdd, 0x44, 0x40, 0x50, 0x21,
+ 0xeb, 0xcf, 0x7c, 0x69, 0xd6, 0xe1, 0xdd, 0x74, 0xcd, 0x56, 0x9b, 0x92,
+ 0xd7, 0xac, 0xdd, 0x77, 0x4c, 0x09, 0x29, 0x19, 0xe3, 0x11, 0xa7, 0xf2,
+ 0x67, 0x46, 0x96, 0x5d, 0xae, 0xa7, 0xe0, 0x57, 0x36, 0x67, 0xd0, 0x96,
+ 0x22, 0x01, 0x05, 0xf7, 0xa2, 0x4c, 0x5e, 0x42, 0x0b, 0x47, 0xd1, 0xf1,
+ 0x69, 0xed, 0x12, 0x18, 0x62, 0x76, 0xde, 0x34, 0x45, 0x49, 0xd9, 0xb8,
+ 0xe4, 0x63, 0xbe, 0x8b, 0x19, 0x22, 0x56, 0xd5, 0xaf, 0xdf, 0x4f, 0x84,
+ 0x33, 0xf3, 0x29, 0xeb, 0xa3, 0x97, 0xd6, 0x74, 0xea, 0x97, 0x35, 0x89,
+ 0xb2, 0x95, 0xf3, 0x32, 0x60, 0xc2, 0x44, 0xdb, 0x3d, 0xba, 0xfa, 0xd3,
+ 0x28, 0x4b, 0x23, 0x7c, 0x41, 0xd3, 0x4f, 0xa9, 0xf4, 0x24, 0x06, 0x76,
+ 0xe9, 0x01, 0x0b, 0x91, 0xb7, 0xd8, 0x4c, 0x34, 0x49, 0x1b, 0xb5, 0xbf,
+ 0x4a, 0xea, 0x74, 0x0b, 0xeb, 0xda, 0x8c, 0x12, 0xc4, 0x96, 0xed, 0x95,
+ 0x29, 0x22, 0x77, 0x1d, 0x65, 0xea, 0x0d, 0xf0, 0x36, 0x47, 0xc8, 0xfc,
+ 0x9c, 0xc5, 0x92, 0x34, 0xba, 0xdb, 0x77, 0xcb, 0x29, 0xfb, 0x96, 0x70,
+ 0xd1, 0x1f, 0x8d, 0xf1, 0x2e, 0xa4, 0xf4, 0x9a, 0xe5, 0x34, 0x49, 0xc2,
+ 0xe0, 0xb1, 0xd3, 0xad, 0xef, 0x9d, 0x50, 0xd9, 0xeb, 0xd6, 0x4e, 0x91,
+ 0x62, 0x0e, 0x89, 0x41, 0x63, 0x85, 0x48, 0x9d, 0xc5, 0xb1, 0xf1, 0xe0,
+ 0x22, 0x87, 0x1a, 0xb8, 0xb8, 0x72, 0xc5, 0xea, 0xf4, 0x74, 0xe1, 0xd8,
+ 0xcc, 0x5b, 0x59, 0x3f, 0x65, 0x37, 0xaa, 0xe9, 0x40, 0x4a, 0x27, 0xae,
+ 0x51, 0xa0, 0x75, 0xd4, 0x13, 0x9b, 0x8c, 0x44, 0x5b, 0x06, 0xe5, 0x15,
+ 0xb5, 0x8f, 0x8a, 0xa4, 0xfa, 0x9e, 0x8a, 0xc2, 0x54, 0xa6, 0x75, 0xf1,
+ 0x3c, 0xf7, 0x62, 0x03, 0x4f, 0x9a, 0xd3, 0xf6, 0x93, 0x7b, 0x61, 0xdf,
+ 0x2f, 0xce, 0xf2, 0xa5, 0xdf, 0xf8, 0xba, 0x9d, 0xed, 0x73, 0x2a, 0xbb,
+ 0xef, 0xbc, 0xac, 0xa3, 0xc6, 0x5a, 0x4d, 0xee, 0x21, 0x8a, 0x5f, 0x9a,
+ 0xd0, 0xec, 0x43, 0x00, 0xa4, 0xf5, 0x03, 0x3a, 0x4f, 0xbc, 0xd2, 0x42,
+ 0xe7, 0x6a, 0x1a, 0x4c, 0x45, 0xb8, 0x3b, 0x31, 0xf1, 0x5a, 0x20, 0x84,
+ 0x3e, 0x9f, 0x4c, 0x14, 0x69, 0xef, 0xf2, 0x22, 0x2a, 0x42, 0x74, 0x14,
+ 0x98, 0x97, 0xb7, 0x21, 0xf6, 0x90, 0xf9, 0x87, 0x8b, 0x79, 0xc7, 0x93,
+ 0x52, 0x81, 0x8d, 0x30, 0x9a, 0x35, 0x3d, 0xc7, 0x87, 0x33, 0x0d, 0xdc,
+ 0xcf, 0x67, 0x11, 0xba, 0x9e, 0x6d, 0x81, 0x67, 0x76, 0x4b, 0x35, 0x75,
+ 0x07, 0x46, 0xc2, 0x6f, 0x45, 0xa6, 0xda, 0xb7, 0x04, 0xa0, 0x3b, 0xe1,
+ 0x60, 0x7c, 0x41, 0xb2, 0xc9, 0x15, 0x65, 0xab, 0xc0, 0xff, 0xf4, 0x31,
+ 0x5b, 0xcd, 0xd4, 0x5c, 0x9b, 0x11, 0xe4, 0x0c, 0x8b, 0x16, 0xc2, 0xbe,
+ 0x0a, 0x75, 0x11, 0x8a, 0x27, 0xaf, 0xe7, 0x8d, 0xf5, 0x3c, 0xe8, 0x33,
+ 0xb0, 0x82, 0x1b, 0x95, 0x25, 0x46, 0xbd, 0xc5, 0x41, 0x33, 0xca, 0x09,
+ 0x5e, 0xdb, 0x82, 0xd3, 0x71, 0x51, 0x4a, 0x15, 0xc1, 0xfd, 0x50, 0x06,
+ 0x31, 0x6b, 0x42, 0x8d, 0x07, 0x65, 0xcf, 0xfc, 0x9f, 0xd7, 0x7b, 0xcb,
+ 0x94, 0x3c, 0xf4, 0xe8, 0x3c, 0x5e, 0x44, 0x7f, 0xc2, 0xb8, 0x58, 0xa2,
+ 0xf7, 0xff, 0xcd, 0x9f, 0x00, 0x74, 0x4e, 0x82, 0xe2, 0xa2, 0x63, 0x53,
+ 0x12, 0x2b, 0x06, 0x0a, 0x57, 0x4b, 0xbf, 0x67, 0xa2, 0x5e, 0x11, 0x36,
+ 0x4a, 0x3a, 0x02, 0x95, 0x16, 0x38, 0xe6, 0x2f, 0x7b, 0x25, 0xe2, 0x9a,
+ 0xc2, 0xa9, 0x32, 0xf2, 0xeb, 0x8b, 0x48, 0xb1, 0xa6, 0xe7, 0xd9, 0xf0,
+ 0x5b, 0xf6, 0x90, 0x59, 0x49, 0xcc, 0xb5, 0x14, 0x53, 0x08, 0x60, 0xc0,
+ 0xd2, 0x89, 0x58, 0xf3, 0xd8, 0x24, 0x27, 0x11, 0xba, 0xda, 0x80, 0x8a,
+ 0xdd, 0x4c, 0x5c, 0x8d, 0xb5, 0x4b, 0xf4, 0x9d, 0xb7, 0xae, 0x2b, 0xc2,
+ 0xe2, 0xce, 0xdc, 0xa7, 0xaf, 0xfc, 0xac, 0x7b, 0x1d, 0xe7, 0x12, 0x2f,
+ 0x8f, 0x42, 0x69, 0x68, 0x55, 0xd9, 0x65, 0x1b, 0x0d, 0xa9, 0x73, 0xc1,
+ 0x79, 0x21, 0x7f, 0xff, 0xdc, 0x88, 0x7b, 0x10, 0x3b, 0x7e, 0x40, 0xab,
+ 0x58, 0x1b, 0x13, 0x8a, 0x2f, 0xfb, 0xe5, 0x27, 0x31, 0xad, 0xc8, 0x66,
+ 0x9c, 0xfd, 0x2c, 0x99, 0x83, 0xc4, 0xfd, 0xe0, 0x87, 0xcf, 0xa1, 0x87,
+ 0xb9, 0xf0, 0x23, 0x17, 0x54, 0xfa, 0x91, 0xaa, 0x8c, 0x54, 0x34, 0xba,
+ 0x1c, 0xae, 0xcb, 0x8e, 0xc0, 0x26, 0xa3, 0x10, 0xe6, 0x26, 0xef, 0xfb,
+ 0x4a, 0xec, 0x71, 0x03, 0x21, 0xd3, 0xa8, 0x78, 0x4b, 0xcc, 0xf2, 0xc4,
+ 0x7b, 0xd2, 0x89, 0x71, 0xe6, 0x4f, 0x09, 0x95, 0x92, 0x77, 0xcc, 0x35,
+ 0xc9, 0x14, 0x5d, 0x28, 0xfb, 0x93, 0xa7, 0xeb, 0x08, 0x5c, 0xd4, 0x01,
+ 0x2b, 0xa2, 0x9d, 0x1a, 0xf7, 0x8e, 0x19, 0x63, 0x95, 0x4f, 0x3d, 0xcd,
+ 0x28, 0xcb, 0x37, 0x1d, 0xd0, 0x99, 0x66, 0x29, 0x02, 0xbc, 0x03, 0x3f,
+ 0xf4, 0xdf, 0xe4, 0x99, 0x73, 0xb2, 0xea, 0x9d, 0xdb, 0xc6, 0x93, 0x3d,
+ 0xf0, 0x45, 0xba, 0x55, 0xdf, 0x3c, 0x44, 0x0a, 0xfc, 0xe9, 0x68, 0x9d,
+ 0x40, 0x71, 0x68, 0x95, 0xb2, 0x38, 0x87, 0x09, 0x3f, 0x2e, 0x58, 0x21,
+ 0x50, 0xca, 0x0f, 0x6a, 0x6e, 0x01, 0xe0, 0xcf, 0xd6, 0xb5, 0xc4, 0x18,
+ 0x43, 0xb3, 0x98, 0x50, 0xf9, 0x3f, 0x93, 0xaa, 0x1d, 0x0f, 0xbe, 0x2b,
+ 0x62, 0x1f, 0x41, 0x12, 0xe0, 0xbb, 0x2a, 0x8d, 0x51, 0x10, 0x50, 0x34,
+ 0x1a, 0xbc, 0x6d, 0x79, 0x04, 0x86, 0x2a, 0x5c, 0x35, 0xd5, 0x0d, 0x10,
+ 0x37, 0x77, 0xbc, 0xaf, 0x90, 0x1f, 0x8e, 0x6e, 0xf4, 0xa3, 0xb5, 0xfd,
+ 0xe8, 0x55, 0x10, 0xdc, 0x7e, 0x69, 0xce, 0x89, 0xbf, 0x29, 0x02, 0xc0,
+ 0x75, 0xd1, 0x97, 0x64, 0x2d, 0xbb, 0x7e, 0xa3, 0x27, 0xa9, 0xa1, 0xf1,
+ 0xcb, 0x8d, 0xb5, 0x0e, 0xe2, 0xa3, 0x30, 0x00, 0xed, 0x68, 0xac, 0xc6,
+ 0x73, 0x64, 0x76, 0x43, 0xc4, 0x09, 0xd5, 0xea, 0xef, 0x91, 0x3b, 0xd4,
+ 0x78, 0x7c, 0x0c, 0xcf, 0x9a, 0xce, 0x3f, 0x98, 0x7d, 0xdb, 0x3d, 0x9b,
+ 0xc5, 0x08, 0x5b, 0x58, 0x6b, 0x6e, 0x21, 0xdc, 0xd6, 0x78, 0x07, 0x1e,
+ 0x8a, 0x10, 0xb2, 0x08, 0x97, 0x0e, 0xf3, 0xc2, 0x2d, 0xdc, 0x76, 0x9f,
+ 0xa8, 0xd3, 0x15, 0x35, 0x35, 0xcd, 0xe5, 0x71, 0xf1, 0x0e, 0xd7, 0x30,
+ 0xca, 0x0e, 0x9a, 0xe7, 0xaa, 0x45, 0xb0, 0x29, 0x8e, 0x87, 0x8e, 0xca,
+ 0xd0, 0x3c, 0xd9, 0xd7, 0x00, 0x75, 0x34, 0xa4, 0xd1, 0xa8, 0x94, 0xb0,
+ 0xf6, 0xe8, 0xa5, 0x43, 0x66, 0xbb, 0x20, 0x98, 0xe6, 0x5c, 0xc6, 0x6a,
+ 0x81, 0x6c, 0xa3, 0xc5, 0xab, 0x38, 0xfc, 0x1a, 0x3b, 0x6c, 0x4a, 0xba,
+ 0x13, 0x38, 0xa7, 0x5a, 0x68, 0xaa, 0x38, 0x1c, 0x68, 0xeb, 0x3c, 0x79,
+ 0x6d, 0x79, 0x09, 0x02, 0xbe, 0x96, 0xd5, 0x9c, 0xf7, 0xc9, 0x42, 0xba,
+ 0x6b, 0x3f, 0xe2, 0x1f, 0x6d, 0x06, 0x61, 0xb8, 0x16, 0x25, 0x1d, 0x93,
+ 0xbd, 0x44, 0x55, 0xeb, 0x67, 0x83, 0xcc, 0x17, 0x71, 0xd6, 0x5d, 0xce,
+ 0x3d, 0x85, 0xc0, 0x0d, 0xba, 0xa3, 0x7d, 0x36, 0x43, 0x5f, 0xf9, 0x8c,
+ 0x9d, 0x30, 0x0e, 0x67, 0x3e, 0x94, 0x36, 0x13, 0x89, 0x75, 0xa0, 0xd7,
+ 0xd2, 0xdd, 0x29, 0x0f, 0xdf, 0x66, 0x2a, 0x2a, 0x06, 0x9c, 0x08, 0xe6,
+ 0xe1, 0x6f, 0xef, 0xea, 0x7a, 0xc7, 0xbd, 0xc7, 0x18, 0x6d, 0xf6, 0xec,
+ 0x1c, 0x40, 0x3d, 0x36, 0xa1, 0x9c, 0x2a, 0xe9, 0x08, 0x9d, 0x7d, 0x03,
+ 0x80, 0x94, 0x2a, 0xf7, 0x04, 0xcd, 0xc6, 0x46, 0x85, 0xdd, 0x5b, 0xc4,
+ 0x3b, 0x4b, 0x43, 0x80, 0x82, 0x05, 0x8d, 0x89, 0xb8, 0x78, 0x8d, 0xda,
+ 0x2c, 0x67, 0x65, 0x12, 0xbb, 0xcc, 0x40, 0x4c, 0x7e, 0xcb, 0x1d, 0x7f,
+ 0x49, 0x1b, 0x80, 0x8f, 0x63, 0x2c, 0x5d, 0x5e, 0x72, 0xe1, 0x44, 0x2c,
+ 0xe8, 0xd1, 0xa1, 0x9d, 0x3f, 0xe0, 0x7d, 0xc2, 0x48, 0x98, 0x6f, 0x94,
+ 0x0d, 0xb6, 0xb1, 0xad, 0xfa, 0xb7, 0x4f, 0x94, 0xef, 0xac, 0x4f, 0xc0,
+ 0xbf, 0xa0, 0x9e, 0x9e, 0x4c, 0xe5, 0x0c, 0x2e, 0x65, 0x60, 0x24, 0xef,
+ 0xa2, 0xec, 0x54, 0xfc, 0x78, 0x77, 0x3c, 0x46, 0x6e, 0x8d, 0xc1, 0xbd,
+ 0x20, 0x21, 0xf5, 0x5d, 0x8b, 0x66, 0x5d, 0xd7, 0x2e, 0x51, 0x52, 0xf5,
+ 0x01, 0x83, 0xa3, 0x10, 0xe3, 0x12, 0x88, 0x8a, 0x4f, 0xd1, 0xbc, 0x55,
+ 0xd0, 0x2f, 0x3c, 0xb6, 0xb7, 0x87, 0x07, 0xb3, 0x7f, 0xf6, 0x76, 0x90,
+ 0x18, 0xa1, 0xef, 0xee, 0xa6, 0x88, 0xbb, 0xb7, 0x24, 0x50, 0x78, 0x20,
+ 0xe5, 0x2e, 0xf7, 0xb5, 0x27, 0xbc, 0x4b, 0xa2, 0x5a, 0x8e, 0x2f, 0x87,
+ 0x7d, 0x57, 0xec, 0x74, 0x38, 0x2f, 0xc9, 0x48, 0x56, 0x28, 0xe3, 0xd3,
+ 0x3d, 0x4b, 0xb2, 0x9d, 0x92, 0x9b, 0xef, 0x57, 0x9b, 0x72, 0x96, 0x3e,
+ 0x9c, 0xd2, 0xf9, 0xf5, 0x10, 0x10, 0xac, 0x3e, 0xd7, 0x5d, 0x3b, 0xbc,
+ 0xf4, 0x55, 0x4b, 0x2b, 0x57, 0xf7, 0xe2, 0x06, 0xdf, 0x3c, 0x04, 0x2a,
+ 0x25, 0xda, 0xf3, 0x97, 0x6c, 0x3e, 0x1c, 0x0a, 0xf7, 0x81, 0xe8, 0xef,
+ 0x2b, 0xda, 0xa8, 0xcc, 0x0e, 0x3c, 0x26, 0xae, 0x18, 0x90, 0x9e, 0x47,
+ 0x93, 0xef, 0x7e, 0xfc, 0x1a, 0x68, 0x49, 0x75, 0x79, 0x59, 0xd6, 0xdd,
+ 0x1c, 0xbe, 0x20, 0x40, 0x0f, 0xca, 0xe3, 0xfa, 0x94, 0x84, 0x20, 0xcf,
+ 0x49, 0x02, 0x3d, 0xcc, 0x91, 0xae, 0xe0, 0x68, 0xfd, 0x33, 0x1d, 0xf7,
+ 0x96, 0x01, 0x6f, 0x7c, 0x46, 0x3c, 0x13, 0x50, 0x9b, 0xd9, 0xc9, 0xb5,
+ 0xb6, 0x3c, 0xce, 0x12, 0x73, 0x78, 0x55, 0x5f, 0x5f, 0x77, 0x40, 0xee,
+ 0xd9, 0x93, 0x99, 0x39, 0x9c, 0x11, 0x91, 0xbd, 0x3e, 0x64, 0xac, 0x4a,
+ 0xcd, 0xe9, 0xbe, 0x43, 0x8e, 0xf3, 0xe6, 0x50, 0x8c, 0x79, 0x8b, 0xf5,
+ 0xea, 0xd1, 0xf4, 0x34, 0xb9, 0x6f, 0x44, 0xb4, 0x21, 0xef, 0xd3, 0x05,
+ 0x92, 0xdd, 0x4c, 0x45, 0x2d, 0x6a, 0x3b, 0x45, 0x39, 0xce, 0xaf, 0xe4,
+ 0x4f, 0xd8, 0xe4, 0x08, 0xfa, 0xec, 0x8b, 0x24, 0xd7, 0x3f, 0x19, 0x12,
+ 0x85, 0x0d, 0x2b, 0x12, 0x33, 0x5c, 0x2d, 0xa1, 0xb1, 0xc0, 0x4c, 0x5c,
+ 0xb4, 0x7a, 0x3f, 0xf6, 0x68, 0xda, 0x2b, 0xaf, 0xe3, 0x79, 0xa1, 0x08,
+ 0xdd, 0xff, 0x3a, 0x31, 0x94, 0x77, 0x6b, 0x10, 0x23, 0x09, 0xe1, 0x43,
+ 0x1b, 0xbb, 0x86, 0xa3, 0x81, 0x41, 0x4a, 0xce, 0x90, 0x0f, 0x46, 0x6b,
+ 0x27, 0x61, 0xe5, 0x25, 0x67, 0x0c, 0xb8, 0xe9, 0x4b, 0x03, 0x40, 0x8c,
+ 0x7f, 0x5a, 0x01, 0xcd, 0x98, 0xb3, 0xd0, 0x21, 0x7b, 0x86, 0x4f, 0xc2,
+ 0x1f, 0x5e, 0x9b, 0x6a, 0x2d, 0x7f, 0x92, 0x23, 0xff, 0x0d, 0x6a, 0xa6,
+ 0x11, 0x86, 0xab, 0x6d, 0xb6, 0x7a, 0xe1, 0xd3, 0xbf, 0xce, 0x8b, 0x09,
+ 0x13, 0xb7, 0x06, 0x4d, 0xd4, 0xdd, 0x4f, 0xfc, 0x09, 0x20, 0x1a, 0xee,
+ 0x5d, 0xb8, 0x43, 0x80, 0x29, 0x5c, 0xe0, 0x69, 0xa2, 0x45, 0x4b, 0x02,
+ 0xe1, 0x84, 0x0b, 0x7e, 0xaf, 0x35, 0xe2, 0xd9, 0x79, 0xb2, 0x6c, 0x7b,
+ 0x5d, 0x38, 0x8a, 0x23, 0x62, 0x87, 0x27, 0x46, 0x3d, 0xf9, 0xe8, 0x22,
+ 0xf6, 0x8c, 0x8d, 0x8d, 0x75, 0xf3, 0xa6, 0x65, 0x75, 0xdd, 0x79, 0xc8,
+ 0xc2, 0x01, 0xf7, 0x1f, 0x54, 0x39, 0x9c, 0xe0, 0xbe, 0x99, 0x4e, 0xbc,
+ 0xcf, 0x12, 0x2f, 0x81, 0xdb, 0xc0, 0xef, 0x72, 0x07, 0x16, 0x92, 0x18,
+ 0xcf, 0x3d, 0xb9, 0x7f, 0x4e, 0x49, 0xa5, 0x22, 0x28, 0x2d, 0x4c, 0x0e,
+ 0x55, 0x3d, 0x4d, 0xa8, 0xb7, 0xf4, 0xf8, 0xc5, 0xfa, 0x24, 0xc7, 0xbf,
+ 0x72, 0x74, 0x61, 0x47, 0x72, 0xa0, 0xe3, 0x5e, 0x9d, 0x9f, 0xf6, 0x14,
+ 0x75, 0x14, 0x3b, 0x32, 0xd4, 0xad, 0x71, 0x25, 0x03, 0x28, 0x98, 0x61,
+ 0x9d, 0x9c, 0xf6, 0xf7, 0xc4, 0x38, 0xa3, 0xaa, 0xa0, 0x2a, 0x19, 0x34,
+ 0x23, 0x73, 0xd2, 0xfe, 0x0f, 0x42, 0x48, 0xec, 0xe2, 0xcb, 0xcb, 0xed,
+ 0xd7, 0x74, 0x72, 0xde, 0xb4, 0xeb, 0x68, 0x02, 0xa5, 0x7c, 0x10, 0x3e,
+ 0x58, 0x51, 0xa2, 0x8e, 0x79, 0x2f, 0x29, 0x45, 0x05, 0xa9, 0x99, 0xc0,
+ 0xa1, 0xe6, 0xd6, 0xae, 0xe6, 0xbd, 0x57, 0x7b, 0xa9, 0x25, 0x07, 0x8e,
+ 0x74, 0x58, 0x0c, 0x00, 0x8f, 0x8e, 0x58, 0x06, 0xb7, 0x8c, 0x7e, 0xfa,
+ 0x36, 0x0e, 0xc2, 0x7f, 0x37, 0x59, 0x45, 0x9e, 0x85, 0x21, 0x18, 0x48,
+ 0xe7, 0x79, 0x68, 0x42, 0x0c, 0x5e, 0x59, 0xe2, 0x6b, 0xe5, 0x10, 0xff,
+ 0x75, 0x16, 0x4e, 0x81, 0xc6, 0x29, 0x89, 0x60, 0xee, 0xb0, 0x56, 0x86,
+ 0x04, 0x0f, 0xfe, 0x93, 0x28, 0x92, 0x70, 0x52, 0x38, 0x5c, 0xcd, 0x9c,
+ 0xde, 0x13, 0x4e, 0x6a, 0x5e, 0x05, 0x5b, 0xeb, 0xeb, 0x0f, 0x22, 0x34,
+ 0x56, 0xac, 0x84, 0x64, 0xd9, 0x9c, 0x14, 0xbe, 0xe9, 0x6e, 0x2f, 0x5d,
+ 0xf5, 0xb7, 0x91, 0x95, 0x1a, 0x97, 0x62, 0xd6, 0xbd, 0x2a, 0xfe, 0x11,
+ 0x91, 0x69, 0x38, 0x08, 0x9c, 0x11, 0xe5, 0xe5, 0x46, 0xcf, 0x94, 0x0c,
+ 0x0d, 0xdb, 0x49, 0x67, 0x5a, 0x21, 0xd0, 0x19, 0xff, 0xd9, 0x4d, 0xfc,
+ 0x28, 0xa7, 0x2a, 0xac, 0x1f, 0x66, 0x11, 0xf7, 0x6e, 0x4d, 0x41, 0x6a,
+ 0x7f, 0x77, 0x08, 0xba, 0x5a, 0xfe, 0xe0, 0xa7, 0xed, 0xe4, 0xd0, 0x50,
+ 0xe6, 0x21, 0x5a, 0xa3, 0xcd, 0xb2, 0xa8, 0xff, 0x12, 0xf9, 0x1d, 0xad,
+ 0x7a, 0xd9, 0xa8, 0x22, 0xb6, 0xd2, 0x76, 0x75, 0xa5, 0x6c, 0xca, 0xf3,
+ 0x59, 0xe4, 0x25, 0x58, 0x9e, 0x1d, 0x05, 0xbf, 0x53, 0x45, 0x35, 0xd1,
+ 0x34, 0xaf, 0xe6, 0xac, 0x43, 0x53, 0xd4, 0xe4, 0x61, 0x2d, 0xf1, 0xf4,
+ 0xc7, 0x9c, 0xb5, 0xca, 0x1a, 0xc1, 0x32, 0x41, 0xe6, 0x43, 0x4b, 0xc9,
+ 0x02, 0xa5, 0x14, 0xf4, 0x72, 0x8c, 0xd4, 0x97, 0x2e, 0xbc, 0xee, 0xa8,
+ 0xd2, 0x53, 0xaf, 0xe1, 0x80, 0x58, 0xbd, 0xa9, 0x25, 0xa0, 0x0c, 0x4e,
+ 0x4c, 0x4d, 0x67, 0x27, 0x3b, 0x6b, 0xd0, 0xf6, 0x2c, 0x0f, 0x6e, 0xc8,
+ 0xbc, 0x0f, 0x12, 0xea, 0xce, 0x34, 0xe1, 0x1c, 0xe7, 0x36, 0x7a, 0x9b,
+ 0xe8, 0xa8, 0xb8, 0x23, 0xa8, 0x4b, 0x77, 0x5f, 0x77, 0x99, 0xde, 0x36,
+ 0x2b, 0x6a, 0x1d, 0x6a, 0xb5, 0x5d, 0x48, 0x40, 0x0a, 0x4d, 0x20, 0x89,
+ 0x1e, 0xf4, 0x14, 0x8e, 0x27, 0x9f, 0x74, 0x07, 0x10, 0x69, 0x59, 0xed,
+ 0xcb, 0x47, 0x64, 0x9a, 0x37, 0x26, 0x37, 0x03, 0x17, 0xaf, 0xc8, 0x6a,
+ 0x93, 0x4f, 0xce, 0xdf, 0x2c, 0x53, 0x6a, 0x36, 0x76, 0xe7, 0xc3, 0xbf,
+ 0x09, 0x38, 0x92, 0x3a, 0x53, 0xe8, 0x07, 0xe2, 0xf2, 0xe1, 0xc2, 0x9f,
+ 0xd8, 0x7e, 0x4c, 0x27, 0xf0, 0x44, 0xa4, 0x91, 0x3a, 0xc7, 0x62, 0xf6,
+ 0x86, 0x31, 0x3a, 0xaa, 0x38, 0x30, 0x41, 0xa7, 0x6b, 0xb2, 0x63, 0x83,
+ 0x99, 0xf1, 0x7e, 0x64, 0x47, 0xc1, 0x95, 0x53, 0x26, 0x15, 0x37, 0x06,
+ 0xa1, 0x30, 0x50, 0xb9, 0x24, 0x63, 0xf9, 0xd7, 0xca, 0x96, 0xeb, 0xf6,
+ 0xf3, 0x6a, 0xdb, 0x5e, 0x9b, 0x57, 0x1c, 0x47, 0x94, 0xfe, 0x92, 0xd3,
+ 0x4e, 0x35, 0x25, 0xb8, 0xa3, 0xb2, 0xc8, 0xa5, 0xda, 0xb8, 0x22, 0xc0,
+ 0xa5, 0x68, 0x5c, 0x16, 0x0b, 0xd2, 0x33, 0x1b, 0x89, 0x35, 0x1f, 0xf8,
+ 0x47, 0x86, 0x6b, 0x0d, 0xc4, 0x7c, 0x1a, 0x50, 0x48, 0x84, 0xc3, 0x8c,
+ 0x59, 0x88, 0x08, 0x26, 0x4e, 0x85, 0xd2, 0x8c, 0x37, 0x65, 0x86, 0x7d,
+ 0x47, 0x0b, 0xc3, 0x9f, 0xd2, 0x3e, 0x06, 0x1d, 0x05, 0x06, 0xf2, 0xa4,
+ 0xc3, 0x3b, 0xae, 0xd3, 0x02, 0xae, 0x44, 0xbb, 0xd0, 0xc7, 0x6e, 0xd2,
+ 0x82, 0x14, 0x4c, 0xfd, 0xf6, 0x69, 0x8a, 0x0c, 0x2e, 0x04, 0xc0, 0x28,
+ 0xd5, 0x20, 0x7d, 0xb0, 0x7d, 0x7c, 0xad, 0xb6, 0x6d, 0x36, 0x1a, 0x72,
+ 0xe8, 0x4f, 0x9f, 0x7b, 0x69, 0x8c, 0xaf, 0x45, 0x23, 0x5e, 0x37, 0xc5,
+ 0x97, 0x2c, 0xbd, 0x24, 0x54, 0x35, 0x6d, 0xec, 0x1a, 0xcc, 0x26, 0xdf,
+ 0xb3, 0x8a, 0xac, 0x71, 0xd0, 0x8c, 0x8c, 0xeb, 0xa7, 0x9b, 0x5d, 0x89,
+ 0xfd, 0x94, 0x67, 0x3a, 0x0a, 0x6e, 0xef, 0x95, 0x1c, 0xaa, 0xfc, 0x82,
+ 0xb7, 0xdb, 0xaa, 0x2c, 0xd5, 0x14, 0x58, 0xdd, 0xd7, 0x11, 0xa1, 0xed,
+ 0x75, 0x1f, 0x77, 0xf9, 0xb9, 0xf5, 0xbf, 0x24, 0x8b, 0xcc, 0x54, 0x89,
+ 0x1d, 0x04, 0x0d, 0x6a, 0x3d, 0xf8, 0xc1, 0xd4, 0xc1, 0xae, 0x1c, 0xcc,
+ 0xb1, 0xde, 0xfe, 0xf9, 0x45, 0xab, 0xd8, 0x37, 0xb1, 0x56, 0x66, 0x15,
+ 0xf4, 0x9d, 0x59, 0x16, 0xc8, 0x67, 0x8a, 0x0d, 0x25, 0x69, 0x3f, 0x8a,
+ 0x56, 0x16, 0x7d, 0xca, 0x69, 0x98, 0xac, 0x0e, 0x8c, 0x0e, 0xf6, 0x3a,
+ 0xb5, 0x5f, 0xd2, 0x3c, 0xe6, 0xa4, 0x3b, 0x67, 0x4a, 0xa5, 0x2d, 0xff,
+ 0xfd, 0x04, 0x04, 0xb3, 0xf1, 0x75, 0xbb, 0x8c, 0x9c, 0xf3, 0x39, 0x7d,
+ 0xfa, 0x9e, 0x9c, 0x55, 0x63, 0x76, 0xb2, 0x45, 0xf4, 0x18, 0x7b, 0xbf,
+ 0x31, 0xbc, 0xfa, 0x5d, 0xed, 0x9f, 0x97, 0x8a, 0x4c, 0xf1, 0x5b, 0xd9,
+ 0x44, 0xad, 0x7f, 0x14, 0xc6, 0x5c, 0xbb, 0x75, 0x0c, 0xe3, 0x5b, 0xd3,
+ 0xba, 0x57, 0x79, 0x5a, 0x99, 0x79, 0xad, 0xb4, 0x9e, 0x9c, 0x18, 0x7c,
+ 0x2f, 0x2b, 0x07, 0x8d, 0xa0, 0x9d, 0x98, 0xfc, 0xe3, 0xe5, 0x54, 0x51,
+ 0x17, 0xb8, 0xde, 0x5b, 0xd0, 0xf1, 0x43, 0x39, 0xae, 0x6d, 0xaf, 0xb5,
+ 0x77, 0xd8, 0x35, 0xa5, 0xbe, 0x57, 0x6d, 0xe2, 0xc8, 0x82, 0x59, 0x63,
+ 0xc8, 0x23, 0xd5, 0xc1, 0x86, 0x05, 0xd5, 0xdf, 0x2f, 0x70, 0x16, 0x2e,
+ 0x47, 0x42, 0x30, 0xab, 0x18, 0x4d, 0xc6, 0x9a, 0x54, 0x18, 0x9f, 0x86,
+ 0x4a, 0x02, 0x36, 0x47, 0x05, 0xd6, 0xce, 0x6a, 0x94, 0x88, 0xd5, 0xe8,
+ 0xc7, 0x48, 0xa1, 0x2a, 0x91, 0xc7, 0xf9, 0x97, 0x23, 0x06, 0xc6, 0xcb,
+ 0xad, 0xf2, 0x4e, 0x29, 0xb9, 0x84, 0x8c, 0x07, 0x4f, 0x46, 0x21, 0x0a,
+ 0xbe, 0x80, 0xc4, 0x24, 0xe8, 0x3e, 0x78, 0xbe, 0xd1, 0xd2, 0xa4, 0x32,
+ 0x1d, 0x59, 0xbc, 0x9e, 0x75, 0xbd, 0x84, 0x45, 0x34, 0xde, 0x6e, 0x66,
+ 0x69, 0x68, 0x83, 0xc1, 0x68, 0x8c, 0x59, 0xa3, 0xb6, 0xab, 0xe0, 0xb5,
+ 0x81, 0x22, 0x0e, 0x56, 0x7d, 0x55, 0x1e, 0xd0, 0xa4, 0x50, 0x7b, 0xe1,
+ 0x9a, 0xc3, 0xb1, 0x86, 0x0a, 0x8b, 0xcb, 0x9b, 0x85, 0x57, 0xc6, 0x81,
+ 0xfe, 0x32, 0xd1, 0x61, 0x47, 0xbc, 0xdf, 0x70, 0x94, 0xf5, 0x9c, 0xc4,
+ 0xb9, 0xc5, 0xe0, 0xab, 0x33, 0x30, 0xbb, 0xd1, 0x8f, 0xa3, 0xb4, 0x48,
+ 0x4e, 0x35, 0x60, 0x2c, 0x0a, 0x97, 0x9f, 0x0e, 0xbe, 0x15, 0xcf, 0x1a,
+ 0x95, 0x92, 0xfa, 0x16, 0x74, 0xce, 0x41, 0x0c, 0x8f, 0xcc, 0x6e, 0x4e,
+ 0x32, 0xb8, 0x40, 0x96, 0x4f, 0x5d, 0x4c, 0x6e, 0xb1, 0xd8, 0x28, 0x6f,
+ 0x69, 0x43, 0x08, 0x9d, 0xb3, 0xf5, 0x97, 0x7f, 0x13, 0xf1, 0xbf, 0x13,
+ 0x25, 0x03, 0xc0, 0x5a, 0xa0, 0x98, 0x1e, 0x75, 0xa8, 0xfd, 0x50, 0x1e,
+ 0xbc, 0x8a, 0x23, 0xa7, 0x41, 0x18, 0x10, 0x7c, 0x42, 0xb9, 0x5f, 0xa4,
+ 0x2b, 0xf4, 0x09, 0x05, 0xad, 0x10, 0xc0, 0x29, 0xa8, 0xeb, 0xce, 0x41,
+ 0xff, 0x4c, 0x45, 0x5f, 0x47, 0x7e, 0x7b, 0x4f, 0xeb, 0xf6, 0x5e, 0xbe,
+ 0xe6, 0xa5, 0x56, 0x72, 0x7c, 0x7b, 0x58, 0x43, 0x05, 0x20, 0x11, 0x0a,
+ 0x02, 0x0e, 0x86, 0xb1, 0x9a, 0x51, 0xb9, 0xa3, 0x2f, 0x14, 0x69, 0x5e,
+ 0x15, 0xe5, 0x30, 0x26, 0x56, 0xff, 0x3f, 0xeb, 0xae, 0x53, 0x2e, 0xc6,
+ 0x5c, 0x94, 0x1a, 0x78, 0xd4, 0xa1, 0x36, 0x27, 0xe6, 0x72, 0x1c, 0x11,
+ 0x70, 0xdb, 0xb6, 0x5f, 0x47, 0x13, 0xfe, 0xcf, 0xc4, 0x50, 0x92, 0x3d,
+ 0xda, 0x8f, 0x96, 0xe7, 0x00, 0xf7, 0x73, 0xc7, 0x52, 0xad, 0x42, 0x34,
+ 0x03, 0x5f, 0x5d, 0x2c, 0x4e, 0x37, 0xcc, 0xff, 0xad, 0x6f, 0x72, 0xb8,
+ 0x75, 0x23, 0x95, 0x2c, 0xb9, 0x89, 0x8e, 0xe7, 0xff, 0x7a, 0x99, 0x76,
+ 0xa6, 0x88, 0xa1, 0x39, 0xdc, 0x67, 0x5d, 0x90, 0xc8, 0x63, 0x3c, 0xa2,
+ 0x80, 0x31, 0xc1, 0x9b, 0x08, 0xc6, 0x48, 0x5e, 0x22, 0x4b, 0xb1, 0x54,
+ 0xeb, 0x59, 0x66, 0xc8, 0xe0, 0x95, 0x38, 0x53, 0x1d, 0x7b, 0x46, 0xd1,
+ 0xc9, 0x6e, 0xf9, 0x07, 0x62, 0xcb, 0xcf, 0xff, 0x4f, 0x29, 0xfb, 0xab,
+ 0x3c, 0x8f, 0x0c, 0x04, 0xaf, 0x9e, 0x25, 0x38, 0x50, 0x44, 0xfa, 0xdf,
+ 0xbd, 0x34, 0x1a, 0xf2, 0x21, 0x33, 0x77, 0xae, 0xf1, 0xe4, 0x64, 0x15,
+ 0x82, 0x1f, 0x78, 0x01, 0x5a, 0x6d, 0x80, 0xe5, 0xa3, 0x53, 0x54, 0xa6,
+ 0xfe, 0xa7, 0x82, 0x7c, 0x39, 0xb7, 0xc9, 0xcb, 0x22, 0x2c, 0x32, 0x9c,
+ 0x17, 0xf0, 0x9f, 0x5c, 0x9b, 0xde, 0x46, 0x82, 0x74, 0x88, 0x47, 0xb8,
+ 0xe4, 0x57, 0x88, 0x4d, 0xb5, 0x4c, 0x1c, 0x8f, 0x38, 0x9c, 0x9e, 0x42,
+ 0xb2, 0x10, 0x3c, 0x50, 0xcd, 0x6a, 0xc8, 0x80, 0x17, 0x24, 0x9a, 0xb9,
+ 0x8c, 0x4b, 0x16, 0x99, 0xa1, 0xf7, 0x96, 0xd1, 0x5c, 0xbc, 0x8e, 0x23,
+ 0xcb, 0x64, 0x7d, 0xd4, 0x1e, 0x3f, 0x97, 0xc9, 0x77, 0x0e, 0x95, 0x80,
+ 0x54, 0x53, 0x65, 0x91, 0x3e, 0x9c, 0xee, 0x3b, 0xd6, 0x91, 0x65, 0x46,
+ 0xee, 0x47, 0x07, 0x40, 0x0f, 0x4b, 0xa4, 0x21, 0xc2, 0x3b, 0x4a, 0x75,
+ 0xae, 0x3b, 0xef, 0x6a, 0x03, 0xa3, 0xcf, 0xb5, 0x29, 0x8d, 0xcc, 0x59,
+ 0xfc, 0xf6, 0xdf, 0x56, 0xe5, 0x4a, 0x93, 0x59, 0x06, 0x8e, 0x98, 0x62,
+ 0x15, 0xbd, 0xd2, 0x40, 0xac, 0xa0, 0xca, 0x21, 0x6d, 0xda, 0x4c, 0x2f,
+ 0x7e, 0x9b, 0xc7, 0xde, 0x5c, 0xf4, 0x13, 0x79, 0xfa, 0xea, 0x6c, 0x90,
+ 0x08, 0xed, 0x32, 0xa0, 0xb2, 0x5d, 0xed, 0x11, 0x1c, 0xeb, 0xe2, 0x32,
+ 0x48, 0x7f, 0xcb, 0x50, 0x6a, 0x64, 0xeb, 0xad, 0x86, 0x49, 0x71, 0x97,
+ 0xce, 0x07, 0xe5, 0x15, 0x86, 0x70, 0x04, 0xf5, 0xd7, 0xa7, 0x6f, 0x2b,
+ 0xb7, 0x4a, 0xff, 0x85, 0xc6, 0x90, 0xe2, 0x4d, 0x62, 0x9b, 0x0a, 0x77,
+ 0xae, 0xae, 0x86, 0x6a, 0xb6, 0x3a, 0x6d, 0x41, 0xd1, 0xfa, 0x6d, 0x5a,
+ 0x2d, 0x98, 0xd5, 0xab, 0x68, 0x12, 0x7e, 0x91, 0xfe, 0x8f, 0xca, 0xb5,
+ 0x1d, 0x2b, 0xbb, 0x99, 0x12, 0xbe, 0x55, 0x09, 0xf8, 0xfa, 0xa9, 0x6b,
+ 0x08, 0x46, 0x1d, 0x73, 0xfa, 0xcf, 0xd3, 0x07, 0x1e, 0x65, 0xa7, 0x9f,
+ 0xa7, 0xb4, 0xba, 0x6f, 0x4d, 0xbe, 0xf2, 0xf8, 0xe2, 0x70, 0xc4, 0x0e,
+ 0x09, 0xb5, 0xf6, 0xb9, 0xb0, 0xe2, 0xa6, 0x6f, 0x3d, 0x4e, 0x56, 0xf2,
+ 0xe2, 0x4d, 0xfa, 0x75, 0x16, 0x40, 0x00, 0xf2, 0x40, 0xb8, 0x70, 0xe3,
+ 0xd4, 0xb3, 0x43, 0x3b, 0x0e, 0x33, 0x03, 0xe3, 0xf8, 0x11, 0x15, 0x87,
+ 0xdb, 0x68, 0x14, 0x64, 0xd0, 0x3e, 0xac, 0x7a, 0x1c, 0xdf, 0x40, 0x92,
+ 0x80, 0x80, 0xb4, 0xcb, 0xf1, 0x75, 0x04, 0x29, 0x32, 0x59, 0xdd, 0x4d,
+ 0x7e, 0x7e, 0x96, 0x66, 0x02, 0x33, 0x1d, 0x0f, 0x4f, 0x8e, 0xa8, 0x64,
+ 0xaf, 0xc8, 0x1f, 0x8c, 0xd6, 0x35, 0x36, 0x62, 0x29, 0x5a, 0xd4, 0xad,
+ 0xd7, 0x9e, 0x49, 0x23, 0x01, 0xb4, 0xb1, 0xc8, 0x07, 0x46, 0x3c, 0x33,
+ 0x8d, 0x0f, 0xf3, 0x9e, 0x6f, 0x11, 0x37, 0x1f, 0x78, 0x57, 0xbe, 0xbc,
+ 0x8a, 0x9b, 0xe3, 0x33, 0x8f, 0xde, 0x1b, 0x8d, 0x2f, 0x9e, 0x5d, 0xec,
+ 0x6a, 0xd7, 0x6b, 0xad, 0xb1, 0x3a, 0xd0, 0x10, 0xb3, 0xe4, 0x4e, 0xc8,
+ 0xcf, 0x15, 0x49, 0xcb, 0x79, 0x13, 0x0c, 0xc7, 0x57, 0x51, 0x62, 0xdd,
+ 0xec, 0xff, 0x18, 0x6b, 0x72, 0x6d, 0x24, 0x90, 0xb8, 0x73, 0x38, 0x05,
+ 0x88, 0xba, 0x69, 0x47, 0x79, 0xc5, 0x53, 0xbf, 0xba, 0x96, 0x69, 0x81,
+ 0x32, 0xa1, 0xbf, 0x4f, 0x87, 0xdc, 0xd9, 0xa2, 0x46, 0x3f, 0xf1, 0xbe,
+ 0xa0, 0x67, 0x80, 0xc2, 0x82, 0xd4, 0x8a, 0x10, 0x10, 0xa5, 0x23, 0xe2,
+ 0xb8, 0xd1, 0x37, 0xe5, 0xd2, 0x6a, 0x6f, 0xf2, 0xc0, 0xd9, 0x6a, 0xdc,
+ 0x04, 0xda, 0xd2, 0xe6, 0x12, 0x6a, 0x81, 0xfb, 0xff, 0x90, 0x31, 0x30,
+ 0xfb, 0xf9, 0xb4, 0xed, 0x6a, 0xa4, 0x2b, 0x90, 0x6d, 0xcc, 0x9c, 0xba,
+ 0x2b, 0xd0, 0x63, 0x9f, 0x5c, 0xd3, 0xe7, 0x37, 0xb5, 0xdd, 0x6b, 0x0a,
+ 0xe8, 0xbd, 0x9e, 0xd2, 0x12, 0x61, 0x19, 0x6f, 0x2e, 0x31, 0x56, 0x63,
+ 0x5e, 0x47, 0xa4, 0x72, 0xa9, 0x9e, 0x4a, 0x6b, 0x37, 0x15, 0x1d, 0xfb,
+ 0xa9, 0x16, 0x49, 0xfc, 0x00, 0x33, 0x94, 0x75, 0xa6, 0x46, 0x58, 0x82,
+ 0x06, 0xc9, 0xba, 0xb4, 0xed, 0x7f, 0x2d, 0x8c, 0x0b, 0x70, 0xca, 0x77,
+ 0x66, 0x22, 0xf8, 0x75, 0x68, 0xb2, 0x17, 0x4a, 0x00, 0x2a, 0x3e, 0x29,
+ 0x04, 0x37, 0xdf, 0x9e, 0x8b, 0x09, 0x42, 0xdd, 0x84, 0xad, 0x85, 0x58,
+ 0xf9, 0xe7, 0x48, 0x3b, 0xcb, 0x1c, 0xa2, 0x5b, 0x1a, 0xda, 0x17, 0x2e,
+ 0x5c, 0xa0, 0x60, 0xb8, 0x62, 0x94, 0x31, 0x10, 0x99, 0xa1, 0x2d, 0xec,
+ 0x67, 0x41, 0xad, 0x5e, 0x87, 0x28, 0x86, 0x37, 0x91, 0xf1, 0x46, 0x74,
+ 0x9b, 0xa5, 0x57, 0xf7, 0x45, 0xd7, 0xe0, 0xcd, 0x73, 0xd3, 0x9e, 0x74,
+ 0x12, 0x35, 0x4c, 0xc5, 0x20, 0x28, 0x9c, 0x19, 0xe3, 0x36, 0x65, 0x65,
+ 0x28, 0xf9, 0x22, 0xc6, 0x6b, 0x7d, 0x33, 0x57, 0xd3, 0xda, 0x0b, 0xbb,
+ 0xbe, 0xba, 0xc1, 0x8a, 0x24, 0x8d, 0xf3, 0x02, 0xe7, 0x3f, 0x27, 0xec,
+ 0xb2, 0x2f, 0xf8, 0x67, 0x5a, 0x78, 0x4b, 0xb5, 0x20, 0xab, 0x1c, 0x01,
+ 0x83, 0x14, 0x06, 0xd4, 0x64, 0xc2, 0x45, 0x6c, 0x54, 0x1e, 0xa1, 0x0f,
+ 0x96, 0x5a, 0x83, 0x38, 0xe7, 0x45, 0x3d, 0xd7, 0x12, 0x8b, 0xd2, 0xf2,
+ 0x8a, 0xe2, 0x43, 0x61, 0x26, 0x64, 0xae, 0x61, 0x0b, 0x77, 0xdd, 0x5a,
+ 0x0d, 0x8a, 0x48, 0x86, 0x54, 0x21, 0xe9, 0x54, 0x74, 0x4e, 0x1f, 0x93,
+ 0xf2, 0x6b, 0x71, 0xe3, 0xe5, 0xaf, 0x56, 0x78, 0x99, 0xdd, 0xe5, 0xd2,
+ 0x8b, 0x03, 0x27, 0xfa, 0x80, 0xbe, 0x11, 0x9a, 0x9b, 0xe9, 0xaa, 0x1a,
+ 0x1e, 0xc3, 0xf9, 0x47, 0xa3, 0xbc, 0x19, 0x6d, 0x4c, 0x55, 0xac, 0x88,
+ 0x80, 0xaf, 0x07, 0x01, 0x22, 0xb2, 0xfd, 0xb6, 0xb1, 0x93, 0x18, 0xb6,
+ 0x16, 0xa1, 0x8b, 0x66, 0x92, 0x00, 0x43, 0xdf, 0x0b, 0x97, 0x80, 0x55,
+ 0x01, 0xb6, 0x58, 0xb8, 0x97, 0xcf, 0xc2, 0xe9, 0x8b, 0x2d, 0x94, 0x73,
+ 0xa6, 0xae, 0x52, 0x1b, 0x65, 0x13, 0x29, 0x0b, 0xad, 0x68, 0x5a, 0x60,
+ 0xa4, 0xed, 0x51, 0x61, 0x1f, 0xeb, 0x26, 0xfe, 0x6c, 0xf9, 0xe2, 0xbb,
+ 0x48, 0x47, 0xa5, 0xf3, 0x96, 0xdd, 0x77, 0x17, 0xed, 0x98, 0x5c, 0xc6,
+ 0x2c, 0xf3, 0x4e, 0x90, 0xb7, 0x8f, 0xf0, 0x84, 0x59, 0x00, 0x46, 0x7e,
+ 0x0b, 0xc4, 0x15, 0xa1, 0xe7, 0x1b, 0xfd, 0xd5, 0x8a, 0x45, 0x27, 0xf4,
+ 0xa7, 0x9a, 0x22, 0x92, 0x16, 0x0a, 0xb3, 0x65, 0xcf, 0xb3, 0x14, 0xe8,
+ 0x92, 0x48, 0x54, 0x5c, 0xc7, 0xa4, 0xd2, 0xfc, 0xf4, 0x8c, 0x61, 0x6f,
+ 0x3d, 0x64, 0x34, 0x8b, 0x13, 0x9b, 0x09, 0x3d, 0xef, 0xe0, 0x08, 0xfd,
+ 0x50, 0xbd, 0xe8, 0x4f, 0xdb, 0x1e, 0x6e, 0xfa, 0x80, 0x94, 0x5c, 0x69,
+ 0xb3, 0x7d, 0x24, 0xb2, 0xd9, 0x6a, 0x0a, 0x34, 0x97, 0xdb, 0x36, 0xf9,
+ 0xc8, 0x46, 0x61, 0x12, 0x0e, 0x43, 0xc1, 0x19, 0xf8, 0xc4, 0xa9, 0x54,
+ 0x10, 0x02, 0x0d, 0xc8, 0x1a, 0x42, 0xd8, 0xcc, 0x95, 0x3d, 0x87, 0x93,
+ 0x3c, 0x32, 0x72, 0xd3, 0x67, 0x70, 0x17, 0x59, 0x9f, 0x5b, 0xea, 0x11,
+ 0xa4, 0x3d, 0x64, 0x5c, 0xea, 0xfc, 0x6f, 0x4e, 0x97, 0x2e, 0x57, 0x43,
+ 0x26, 0x7e, 0x98, 0x21, 0x49, 0x4c, 0xfc, 0x63, 0x69, 0xff, 0xe0, 0xa8,
+ 0x2f, 0x87, 0x01, 0x03, 0x69, 0xca, 0x99, 0xa6, 0x3b, 0x8d, 0x86, 0xb4,
+ 0xdf, 0xb7, 0x10, 0xde, 0x9f, 0x53, 0x6e, 0x49, 0x06, 0x7f, 0x96, 0xd5,
+ 0x2c, 0x1c, 0xb7, 0xf3, 0x16, 0xf5, 0xd4, 0x63, 0x18, 0x61, 0x10, 0x6e,
+ 0x67, 0xb3, 0x81, 0x26, 0xf1, 0x64, 0x5a, 0xd2, 0xab, 0x57, 0x63, 0xe7,
+ 0xa6, 0x11, 0x09, 0xce, 0x19, 0xd0, 0x69, 0x73, 0xfd, 0xaa, 0x5a, 0xc8,
+ 0xa0, 0xc0, 0x55, 0xca, 0x08, 0x72, 0x7d, 0xaa, 0x06, 0x27, 0x22, 0x65,
+ 0x1c, 0xe0, 0x26, 0x86, 0xf2, 0x25, 0x9f, 0xdc, 0x28, 0x0a, 0xad, 0x30,
+ 0x0d, 0x71, 0x97, 0xfc, 0xef, 0x24, 0x6b, 0x80, 0x1f, 0x45, 0x84, 0x67,
+ 0xed, 0x80, 0x08, 0x5d, 0xc7, 0x16, 0xa7, 0x28, 0x5b, 0x96, 0xb7, 0xc4,
+ 0xd7, 0xa7, 0x05, 0xa6, 0x9b, 0xbf, 0xa7, 0x80, 0xf7, 0xae, 0x6c, 0xb9,
+ 0x2c, 0x24, 0x64, 0x3b, 0x59, 0xf1, 0xf9, 0x32, 0x97, 0x12, 0x18, 0x6b,
+ 0x95, 0x4c, 0x43, 0x3a, 0x57, 0xe0, 0x8c, 0xdb, 0x8e, 0x06, 0x87, 0xfc,
+ 0x20, 0x91, 0x05, 0xea, 0x71, 0x59, 0xe8, 0x95, 0xab, 0x6d, 0xd7, 0xe1,
+ 0xfe, 0x57, 0x99, 0xdd, 0xe8, 0x9e, 0x4d, 0x6c, 0x8a, 0xe3, 0x32, 0x00,
+ 0xb6, 0x6f, 0x6d, 0x2a, 0x56, 0xb6, 0x5d, 0x71, 0x97, 0xed, 0xbf, 0xcf,
+ 0xcc, 0x0f, 0xc5, 0xdc, 0x64, 0x94, 0x34, 0xe5, 0x08, 0xa6, 0x71, 0x65,
+ 0x08, 0x10, 0x9c, 0x2c, 0x52, 0xe5, 0x8d, 0x67, 0x5c, 0xe5, 0x44, 0xd8,
+ 0xb9, 0x18, 0xdd, 0x89, 0x36, 0x68, 0x74, 0x8c, 0x35, 0x5b, 0xa8, 0xe9,
+ 0xbe, 0x97, 0xc5, 0x8f, 0xfc, 0x40, 0x31, 0xd4, 0x62, 0xed, 0x81, 0xd8,
+ 0xf1, 0x7e, 0x12, 0x01, 0x66, 0x92, 0xb2, 0x25, 0x39, 0xcd, 0xde, 0xb6,
+ 0x9f, 0xd9, 0xf9, 0x8c, 0x2f, 0xe6, 0xbc, 0x57, 0x9d, 0x69, 0x2a, 0x98,
+ 0xdb, 0xfc, 0xf7, 0xfd, 0x89, 0xcd, 0xc4, 0xb6, 0x5c, 0x60, 0xc9, 0xdd,
+ 0x77, 0xf7, 0xda, 0x4c, 0x3a, 0x11, 0xd8, 0xf5, 0x8e, 0x7e, 0xfc, 0xff,
+ 0x3f, 0x8d, 0x00, 0x71, 0xf1, 0x6a, 0x5e, 0xcc, 0x94, 0x4f, 0x53, 0xf1,
+ 0x60, 0x19, 0x10, 0x56, 0x4e, 0xe9, 0x56, 0xff, 0x08, 0xa5, 0xda, 0xf8,
+ 0x0e, 0x76, 0x91, 0x19, 0x8b, 0x7a, 0x79, 0xde, 0x77, 0xb6, 0xda, 0xef,
+ 0x1d, 0x4c, 0x22, 0x44, 0x11, 0xfa, 0x5a, 0x98, 0x9e, 0xf1, 0x28, 0xd7,
+ 0xfa, 0xad, 0xb2, 0x17, 0x53, 0x79, 0x1a, 0x29, 0xaa, 0x0d, 0x64, 0xf8,
+ 0xf5, 0xf6, 0xd4, 0x2e, 0x90, 0x26, 0xde, 0xce, 0x98, 0xa2, 0x5a, 0x46,
+ 0xe5, 0x78, 0xf7, 0x17, 0x8b, 0xb6, 0xc8, 0xda, 0xa4, 0xcd, 0x99, 0xf1,
+ 0x3f, 0x4b, 0x85, 0x34, 0xce, 0x3b, 0xe4, 0x60, 0xa5, 0x08, 0xc5, 0x4a,
+ 0xfd, 0xf5, 0x4b, 0x29, 0xd4, 0xbb, 0x6e, 0x98, 0x5e, 0x0d, 0xf1, 0x32,
+ 0x76, 0x70, 0xac, 0x5e, 0x9f, 0xcb, 0x8d, 0x4c, 0xa9, 0xfd, 0x72, 0xc5,
+ 0x39, 0x4a, 0x23, 0x3c, 0xb3, 0xd9, 0x35, 0xee, 0xf3, 0x51, 0xbf, 0x7e,
+ 0x28, 0x82, 0x9d, 0xda, 0xfb, 0x0a, 0x35, 0x4f, 0x72, 0xd6, 0x10, 0xa1,
+ 0x1c, 0x84, 0x30, 0x6e, 0x40, 0x4f, 0x82, 0x54, 0xec, 0x00, 0x58, 0x24,
+ 0xea, 0xa3, 0xdb, 0x14, 0x9e, 0x29, 0xd2, 0x12, 0xc0, 0xd2, 0x23, 0xce,
+ 0x8b, 0xa1, 0x9d, 0x4b, 0xe4, 0x14, 0x92, 0xce, 0xe0, 0xaa, 0xc2, 0xeb,
+ 0xac, 0x26, 0x0c, 0x66, 0x49, 0x40, 0xd6, 0xba, 0x1d, 0x06, 0xc2, 0x43,
+ 0x51, 0x74, 0x7b, 0xcd, 0x10, 0x56, 0x35, 0xd9, 0x11, 0x9b, 0xed, 0x2a,
+ 0xa2, 0x3b, 0x94, 0x02, 0xd3, 0x1f, 0x60, 0xc4, 0x23, 0x63, 0x50, 0xe2,
+ 0x73, 0xbd, 0x2e, 0x0d, 0x1b, 0xee, 0xa2, 0x89, 0xfd, 0x84, 0x6b, 0x4c,
+ 0x00, 0xdd, 0x41, 0x2a, 0x07, 0x14, 0x99, 0x41, 0xb5, 0x72, 0x5e, 0xf7,
+ 0xe7, 0xb5, 0xfc, 0xe1, 0x4f, 0xc4, 0xa1, 0x57, 0x73, 0x10, 0xdd, 0x86,
+ 0xee, 0x21, 0x16, 0xb2, 0xe2, 0x74, 0x01, 0x04, 0x85, 0xc4, 0x8d, 0x9f,
+ 0xe9, 0x96, 0xb5, 0x0f, 0x29, 0xe0, 0x40, 0x9b, 0xc4, 0x69, 0xac, 0xe5,
+ 0xa0, 0xfd, 0x58, 0x81, 0xdf, 0x9f, 0x51, 0x5c, 0x98, 0x20, 0x4c, 0x86,
+ 0xc0, 0x8d, 0x6e, 0xfa, 0x96, 0x8b, 0xe7, 0xc1, 0xe1, 0x3b, 0x46, 0x5c,
+ 0xd2, 0x6a, 0x26, 0xf5, 0x88, 0xc9, 0xf0, 0x43, 0xa1, 0x04, 0x1d, 0xb9,
+ 0x7c, 0xbd, 0x4c, 0xfa, 0x7d, 0x88, 0x7e, 0xf4, 0x2f, 0xf5, 0x28, 0x25,
+ 0xcd, 0xfc, 0x6b, 0xb4, 0xba, 0xef, 0x52, 0xba, 0x6f, 0x7d, 0xb2, 0xb4,
+ 0x24, 0x26, 0xd5, 0x4d, 0x80, 0xa4, 0x98, 0x8c, 0x9b, 0x84, 0x46, 0xde,
+ 0xb6, 0x4d, 0x09, 0x38, 0x7f, 0xd1, 0xeb, 0x97, 0x97, 0xe8, 0x98, 0x1c,
+ 0xf8, 0x7b, 0x24, 0xb5, 0xd4, 0x95, 0xd4, 0x3e, 0x1b, 0x1e, 0xd0, 0x1f,
+ 0x1f, 0x90, 0x01, 0x45, 0xd9, 0x92, 0xb1, 0xc8, 0xed, 0x4e, 0x1e, 0xf9,
+ 0x0a, 0x67, 0xd1, 0xf6, 0x8e, 0xb9, 0x6c, 0x4c, 0x5a, 0x22, 0x09, 0x1f,
+ 0xfa, 0x4c, 0xc8, 0x5d, 0xdb, 0xca, 0xeb, 0x1a, 0x76, 0x79, 0xb5, 0x4a,
+ 0xa2, 0xcc, 0xf6, 0xe9, 0xff, 0x7d, 0x86, 0x2d, 0xee, 0x94, 0x83, 0x50,
+ 0xc3, 0x29, 0x38, 0x05, 0x56, 0x42, 0xd7, 0x19, 0x38, 0x6f, 0xef, 0xe9,
+ 0x0a, 0xeb, 0xf0, 0x83, 0xcb, 0x1f, 0x3b, 0x1a, 0x6c, 0xf1, 0x11, 0x50,
+ 0xef, 0x38, 0xdf, 0x5b, 0xd4, 0x5b, 0x2a, 0x18, 0x8c, 0x35, 0x57, 0xdb,
+ 0x57, 0xda, 0x3f, 0x76, 0xa8, 0x57, 0xb3, 0xee, 0x04, 0x39, 0x1c, 0x21,
+ 0x98, 0xc6, 0x41, 0x6d, 0xd7, 0xe0, 0xb0, 0x61, 0xa3, 0x9d, 0xb7, 0xb8,
+ 0x78, 0xf7, 0x39, 0x66, 0xba, 0x44, 0x4c, 0x69, 0xac, 0xa2, 0xdf, 0xca,
+ 0xd7, 0x8f, 0xee, 0x85, 0xa3, 0xb6, 0x42, 0xfa, 0x16, 0x08, 0x56, 0x6d,
+ 0x00, 0x41, 0xd0, 0x91, 0xcd, 0x72, 0x46, 0xad, 0x1d, 0xf4, 0xaa, 0xd0,
+ 0x1d, 0xb2, 0xcf, 0xbb, 0x4d, 0x5d, 0xf6, 0xda, 0xf6, 0x6d, 0xf4, 0x6d,
+ 0x91, 0xad, 0xc8, 0xe6, 0xbd, 0x89, 0x5d, 0x57, 0xc6, 0xbe, 0xad, 0x07,
+ 0x73, 0xda, 0xf1, 0xf7, 0x36, 0x53, 0xda, 0x84, 0x89, 0xc1, 0x44, 0xeb,
+ 0x88, 0x58, 0xc2, 0xcf, 0x9b, 0x90, 0x05, 0x9a, 0xba, 0xb2, 0x23, 0x95,
+ 0xf0, 0x61, 0xca, 0xcf, 0xa7, 0x4c, 0xdf, 0xc7, 0x17, 0x9f, 0x33, 0x51,
+ 0x0c, 0x4f, 0x8d, 0xab, 0xc6, 0x8f, 0x0a, 0xed, 0xf3, 0xd3, 0x85, 0x05,
+ 0xd7, 0x09, 0xec, 0x23, 0x56, 0x61, 0xd5, 0x65, 0x86, 0xa6, 0x7e, 0xdd,
+ 0x31, 0x63, 0x6e, 0x40, 0xf1, 0x59, 0xa4, 0x09, 0x8f, 0x47, 0x61, 0x4b,
+ 0xb0, 0x40, 0x29, 0x11, 0xed, 0xfa, 0xca, 0x67, 0x0b, 0xaf, 0x5b, 0xbb,
+ 0xd6, 0xda, 0x4f, 0xb5, 0x37, 0xc8, 0xe4, 0x5d, 0x1f, 0x46, 0xb8, 0x76,
+ 0xfb, 0xff, 0x5f, 0xa3, 0xab, 0x77, 0x63, 0x64, 0x54, 0xab, 0x48, 0x4f,
+ 0x70, 0x0d, 0x4b, 0x33, 0xcd, 0xf3, 0x98, 0xdf, 0xee, 0x15, 0xb1, 0x0e,
+ 0x3e, 0x44, 0x73, 0x5d, 0x5a, 0xdf, 0xfe, 0x94, 0x97, 0x13, 0xa8, 0x2c,
+ 0x32, 0x61, 0xcf, 0xba, 0x84, 0x8b, 0x2f, 0xd1, 0x30, 0x2b, 0xea, 0x13,
+ 0x0e, 0xed, 0x87, 0xbc, 0x7f, 0xd9, 0x73, 0x54, 0xbb, 0xfd, 0x9e, 0xd7,
+ 0x5a, 0x36, 0xfc, 0xfd, 0xbe, 0x36, 0x86, 0xc6, 0xc9, 0xf2, 0x18, 0x46,
+ 0x05, 0x80, 0x13, 0xbb, 0xe7, 0xe2, 0x7d, 0x33, 0x3a, 0xc6, 0x6e, 0x84,
+ 0x57, 0xef, 0x6f, 0x4a, 0xb9, 0x8e, 0x5e, 0x1e, 0xbf, 0xed, 0xd9, 0x6d,
+ 0xe7, 0xb9, 0x6f, 0x05, 0xe5, 0x5c, 0x5d, 0x4c, 0xd5, 0x7f, 0x24, 0xb8,
+ 0xe6, 0xa8, 0xee, 0xbe, 0x4f, 0x5a, 0xf1, 0xd5, 0xdc, 0xf1, 0x8f, 0xa8,
+ 0xe0, 0xbd, 0xa3, 0x0c, 0x63, 0xb5, 0x45, 0x0f, 0xbd, 0xd4, 0x1a, 0xcd,
+ 0xfe, 0x83, 0x78, 0x06, 0x35, 0xb6, 0x14, 0xaa, 0x54, 0xec, 0x73, 0x5a,
+ 0x7a, 0x1d, 0x5e, 0xec, 0xea, 0xe7, 0xc5, 0xe5, 0x16, 0x52, 0x45, 0x12,
+ 0xd3, 0x3d, 0xf6, 0x20, 0x43, 0x9e, 0xf9, 0x13, 0xb6, 0xcb, 0x95, 0x80,
+ 0xfc, 0xbc, 0xb1, 0x6a, 0x8d, 0x57, 0xcb, 0x45, 0x2c, 0x72, 0x6f, 0xb6,
+ 0x19, 0xbe, 0x0f, 0x01, 0xce, 0x06, 0xe7, 0xb9, 0x37, 0x78, 0xfa, 0x30,
+ 0x7e, 0x52, 0x14, 0x52, 0xcd, 0x2e, 0x0f, 0xc2, 0x8a, 0x77, 0xd9, 0xf2,
+ 0xbf, 0x05, 0x73, 0x67, 0x53, 0xc7, 0xfb, 0x79, 0xe1, 0x88, 0x10, 0xcf,
+ 0xab, 0x26, 0xf5, 0xe0, 0x76, 0xd4, 0x5f, 0xa3, 0x82, 0xc5, 0xe1, 0x77,
+ 0x50, 0xe5, 0x5c, 0xde, 0xe6, 0xd2, 0xf7, 0x7b, 0xf6, 0x41, 0xa2, 0xb9,
+ 0xe6, 0x4d, 0x89, 0x00, 0x30, 0xb4, 0x82, 0x35, 0xec, 0x85, 0x7c, 0x63,
+ 0x0f, 0x3d, 0xb9, 0x3d, 0xb1, 0x2d, 0x72, 0xaa, 0xc9, 0xa7, 0xdf, 0x48,
+ 0x1c, 0x0e, 0x0e, 0x16, 0xd4, 0x4e, 0x9a, 0xf5, 0x64, 0x25, 0xe3, 0x14,
+ 0xbe, 0xd3, 0xc4, 0xac, 0xd3, 0xfe, 0xf3, 0xcf, 0x07, 0x69, 0x83, 0xae,
+ 0xda, 0x7b, 0xc9, 0x0f, 0x14, 0xe7, 0xbb, 0xab, 0x9a, 0x08, 0x44, 0xd5,
+ 0xd7, 0x01, 0x18, 0x79, 0x85, 0xbc, 0x56, 0x0c, 0x8f, 0x87, 0x27, 0x52,
+ 0x96, 0x4b, 0x6f, 0x0e, 0x02, 0xc0, 0x81, 0xae, 0x65, 0x87, 0x63, 0xd2,
+ 0xac, 0x46, 0x51, 0xdb, 0x44, 0xba, 0xbf, 0x96, 0x43, 0x52, 0xf1, 0x64,
+ 0xc6, 0x73, 0x53, 0xf5, 0xa2, 0xe2, 0xe8, 0x28, 0x57, 0x4b, 0xe3, 0x25,
+ 0xeb, 0x7c, 0x9e, 0x58, 0x38, 0xe5, 0x1d, 0x10, 0xf1, 0x60, 0xdc, 0x0d,
+ 0xa7, 0x4c, 0xd6, 0x12, 0x3e, 0x18, 0x5c, 0x5d, 0x38, 0x38, 0x06, 0xf7,
+ 0x66, 0x13, 0xf8, 0x97, 0x90, 0x8c, 0x50, 0x37, 0xa5, 0xd3, 0x50, 0xfa,
+ 0xd7, 0x7e, 0xf9, 0x56, 0x20, 0xa5, 0x3e, 0x6b, 0x07, 0xc8, 0xfc, 0xc5,
+ 0x34, 0x93, 0x76, 0x6e, 0x32, 0x9d, 0xfa, 0x3d, 0x3f, 0x63, 0xc9, 0xf8,
+ 0x22, 0xf2, 0xf2, 0xbb, 0xfa, 0x21, 0x8f, 0xf2, 0x47, 0xd7, 0x59, 0x04,
+ 0xc8, 0x91, 0x61, 0xaa, 0x9f, 0x7f, 0x9f, 0x53, 0xce, 0xa7, 0x84, 0xf6,
+ 0x38, 0x79, 0x9e, 0xa2, 0x8b, 0x8d, 0x0f, 0x52, 0xab, 0xae, 0x5e, 0xb2,
+ 0x10, 0xd2, 0xaf, 0x30, 0x76, 0xb8, 0x04, 0xf0, 0xcd, 0x1b, 0x44, 0xef,
+ 0xd3, 0x62, 0xa1, 0x13, 0xbd, 0x26, 0x0d, 0x8e, 0x5f, 0x35, 0xd0, 0x38,
+ 0x37, 0xf0, 0x03, 0x26, 0x6f, 0x50, 0x20, 0x10, 0x28, 0xbe, 0xae, 0x3e,
+ 0x63, 0x8b, 0x38, 0xc0, 0x11, 0x2c, 0x4e, 0x32, 0x3d, 0xbe, 0x25, 0xaf,
+ 0x01, 0xc3, 0x66, 0x42, 0x6c, 0xbd, 0x00, 0x90, 0xcb, 0x50, 0x7b, 0x75,
+ 0xc8, 0x85, 0x99, 0x5c, 0xae, 0x94, 0x36, 0xbc, 0x98, 0x9f, 0xdb, 0x09,
+ 0x61, 0xd2, 0x30, 0x5f, 0x23, 0xf6, 0x5b, 0x41, 0x96, 0xb7, 0xcb, 0x7c,
+ 0x20, 0x26, 0x09, 0x0c, 0x0e, 0x57, 0x8b, 0x33, 0x66, 0x73, 0x2e, 0x58,
+ 0xd4, 0x7c, 0x6f, 0xe7, 0x94, 0x8b, 0x1c, 0xe9, 0x7b, 0xcb, 0x28, 0x73,
+ 0xce, 0xfd, 0xfb, 0x58, 0x8e, 0xbf, 0x51, 0x7f, 0x61, 0x4b, 0x4e, 0xaa,
+ 0x82, 0x3a, 0xcb, 0xe2, 0xd4, 0x2e, 0x30, 0x09, 0x6f, 0x25, 0xa5, 0x3a,
+ 0xe7, 0xfb, 0xac, 0x13, 0x1e, 0xb3, 0x16, 0xc8, 0x33, 0xfe, 0x6d, 0x65,
+ 0xa8, 0xb6, 0xf2, 0xf0, 0x00, 0x9f, 0xed, 0x36, 0xa7, 0xf6, 0xa9, 0xf7,
+ 0x0c, 0x42, 0x61, 0xe3, 0x49, 0x68, 0x5c, 0xdc, 0xc8, 0x51, 0x3c, 0x85,
+ 0xcf, 0xda, 0xe0, 0xac, 0x29, 0xa3, 0x65, 0xe7, 0x38, 0x3c, 0xba, 0x0c,
+ 0x7d, 0x12, 0xf9, 0x0a, 0x51, 0x96, 0x51, 0x01, 0x0f, 0xae, 0xf3, 0xbd,
+ 0x76, 0xd3, 0x06, 0x7a, 0x5d, 0x0e, 0x41, 0x53, 0x21, 0x3c, 0xc3, 0x4a,
+ 0x69, 0xdd, 0x5d, 0x39, 0x60, 0x80, 0x49, 0x76, 0xbe, 0x34, 0xaf, 0x28,
+ 0x37, 0x01, 0x17, 0xbb, 0x88, 0x21, 0xb5, 0x40, 0xfa, 0x0a, 0x2a, 0x9c,
+ 0xa5, 0xfe, 0xf6, 0x2a, 0x23, 0x49, 0xc5, 0xd7, 0x17, 0xa6, 0x98, 0x55,
+ 0xa7, 0x53, 0xe3, 0xe5, 0x48, 0xdb, 0xbc, 0x72, 0x0d, 0x69, 0xf0, 0xc1,
+ 0x40, 0xda, 0x1f, 0x37, 0x1c, 0x24, 0xb8, 0x0e, 0xd1, 0x47, 0xf7, 0x36,
+ 0x19, 0xc4, 0xa5, 0xdd, 0x46, 0x3d, 0x6c, 0x92, 0x76, 0x67, 0x1f, 0x3c,
+ 0x77, 0xaf, 0x14, 0x24, 0xf2, 0x09, 0x7a, 0x12, 0xaa, 0x3f, 0xf5, 0xe5,
+ 0x7d, 0x08, 0x3f, 0x80, 0xc5, 0xe6, 0x32, 0xc2, 0x46, 0x07, 0xa7, 0xc7,
+ 0xe1, 0xef, 0xca, 0x8d, 0x07, 0xed, 0x79, 0xa1, 0x42, 0x5a, 0xd3, 0x4a,
+ 0x90, 0xf6, 0x2d, 0x5d, 0x53, 0xa1, 0x7d, 0x30, 0xc0, 0xc7, 0x9f, 0x40,
+ 0xdc, 0x22, 0x5c, 0x8e, 0x18, 0x72, 0x85, 0x31, 0x3d, 0x86, 0x2c, 0x37,
+ 0xea, 0xd5, 0xd6, 0x1e, 0xa0, 0x1c, 0xaf, 0x18, 0x26, 0x60, 0xaf, 0x44,
+ 0xd3, 0x06, 0xef, 0x10, 0x32, 0xf2, 0x57, 0x1e, 0x97, 0xe5, 0x45, 0xbb,
+ 0x84, 0x14, 0x67, 0x0f, 0x29, 0x9d, 0x3a, 0x78, 0xa4, 0x95, 0x05, 0x8d,
+ 0xbf, 0x3d, 0xd0, 0x5d, 0x08, 0x98, 0xc8, 0xf4, 0xad, 0xa8, 0x65, 0xd1,
+ 0xf4, 0x5c, 0xa6, 0x5a, 0xc0, 0xd0, 0xfd, 0xe2, 0xed, 0x47, 0xe9, 0x98,
+ 0x43, 0xef, 0x97, 0x35, 0xbe, 0xff, 0xcb, 0x79, 0x50, 0x7d, 0x30, 0xcb,
+ 0xd8, 0x9f, 0x54, 0xf8, 0xc4, 0x1b, 0x27, 0x40, 0xa8, 0x33, 0x0f, 0xce,
+ 0x69, 0xf2, 0xcb, 0x82, 0x0b, 0x1f, 0x80, 0x9c, 0x69, 0xc4, 0x7f, 0xde,
+ 0x75, 0x88, 0x62, 0x3a, 0xfa, 0x69, 0x10, 0x5b, 0x26, 0x47, 0xd5, 0xcb,
+ 0xb5, 0xfc, 0x45, 0x21, 0x42, 0xe5, 0xf5, 0xa5, 0xf0, 0x26, 0x93, 0x76,
+ 0x6f, 0x2a, 0x3e, 0x4e, 0x9d, 0x3f, 0xeb, 0x85, 0xbf, 0x1c, 0x7f, 0x84,
+ 0x9f, 0xba, 0xc1, 0x18, 0x15, 0x96, 0x2e, 0x00, 0x61, 0x9b, 0x57, 0x8b,
+ 0x6d, 0x6d, 0xfd, 0x1d, 0x24, 0x7b, 0x72, 0x43, 0x6b, 0x38, 0xcd, 0x66,
+ 0x79, 0x02, 0x79, 0x76, 0x07, 0x52, 0x1f, 0x6b, 0x9d, 0xb0, 0x9b, 0x59,
+ 0x8a, 0x0e, 0x89, 0x86, 0xf3, 0x48, 0x08, 0xbf, 0xbf, 0x2b, 0x50, 0x87,
+ 0x1c, 0x22, 0x4e, 0x56, 0xbe, 0x85, 0x10, 0x57, 0x3a, 0x93, 0xbc, 0xf3,
+ 0xce, 0x2b, 0x3c, 0xa1, 0xdb, 0x44, 0x55, 0x2e, 0x6d, 0x63, 0x9f, 0x28,
+ 0x43, 0xe3, 0xbd, 0x0b, 0x99, 0x0c, 0xf8, 0x5d, 0x2e, 0x75, 0xeb, 0x86,
+ 0xb0, 0x5d, 0x0f, 0x48, 0xbb, 0x7f, 0x2c, 0xbd, 0xe0, 0x4b, 0x2f, 0xd9,
+ 0xb7, 0x36, 0x1a, 0x4c, 0xfe, 0x61, 0x6e, 0xe6, 0x38, 0x28, 0x27, 0xf6,
+ 0x74, 0xd9, 0xd7, 0xbf, 0xf3, 0x74, 0x20, 0x87, 0xb1, 0xa6, 0x21, 0xf2,
+ 0xa9, 0x57, 0xb5, 0xc2, 0x2e, 0x35, 0x53, 0x4b, 0x55, 0xbe, 0xc5, 0x4c,
+ 0x15, 0x84, 0x1f, 0xda, 0xf0, 0xa8, 0x4d, 0x79, 0xc7, 0x19, 0xb6, 0xac,
+ 0x98, 0x02, 0xc3, 0x3d, 0x95, 0x9a, 0x4c, 0x17, 0x7a, 0x8a, 0x4b, 0x84,
+ 0xb1, 0x87, 0x20, 0x01, 0x59, 0x79, 0x8e, 0x95, 0xe1, 0xf0, 0x02, 0x18,
+ 0x45, 0xcf, 0x0d, 0x26, 0xb0, 0x7d, 0xbd, 0x3d, 0x60, 0x34, 0xba, 0xdc,
+ 0x27, 0xb8, 0x9a, 0x0c, 0x22, 0x05, 0x9b, 0xe8, 0x60, 0xce, 0x50, 0x58,
+ 0xe1, 0xbd, 0xd0, 0x5e, 0x8e, 0xf7, 0x8c, 0x3d, 0x94, 0x72, 0x8c, 0x48,
+ 0x5b, 0x36, 0x87, 0x8f, 0x1a, 0xd4, 0x50, 0xc1, 0x3d, 0xa8, 0xf7, 0xc1,
+ 0xd9, 0x0c, 0x37, 0x22, 0xb5, 0xca, 0xf7, 0x52, 0x7c, 0xbe, 0x6d, 0x2f,
+ 0x0d, 0x4a, 0xa2, 0x1a, 0x6c, 0x47, 0xa5, 0x2b, 0x40, 0xf2, 0xc1, 0x99,
+ 0xfd, 0x75, 0xe1, 0xb6, 0xc2, 0x20, 0xa3, 0x0e, 0x65, 0x87, 0x1a, 0xfd,
+ 0x4d, 0x96, 0xea, 0x71, 0xf5, 0x84, 0x7a, 0xd2, 0x7c, 0x52, 0xb0, 0xef,
+ 0xba, 0x4c, 0x74, 0x99, 0xe2, 0x67, 0x2d, 0x76, 0x3f, 0xcc, 0x04, 0x2e,
+ 0x2f, 0x0b, 0x82, 0xf0, 0xa0, 0xd2, 0x76, 0x07, 0xe5, 0x5c, 0x43, 0xde,
+ 0x85, 0x92, 0xa4, 0x12, 0x03, 0x2d, 0xbf, 0xb1, 0x9e, 0x26, 0x43, 0xfa,
+ 0xf5, 0xe2, 0x6d, 0x7f, 0x5d, 0x8a, 0xf8, 0x58, 0xf9, 0x28, 0x60, 0xfa,
+ 0x0f, 0x79, 0x83, 0x2e, 0x81, 0x4a, 0xa7, 0xa7, 0x19, 0x54, 0x0b, 0x3c,
+ 0x83, 0x89, 0xf5, 0xfc, 0xc2, 0xa2, 0x8f, 0x87, 0x66, 0x70, 0x85, 0xbe,
+ 0xe3, 0xb8, 0x9f, 0xfe, 0xa5, 0xf9, 0x6e, 0x71, 0xa1, 0xb4, 0x52, 0x39,
+ 0x84, 0x83, 0x60, 0x22, 0x50, 0x77, 0x73, 0x31, 0x1c, 0xfb, 0x9f, 0x9d,
+ 0xb7, 0xab, 0x2a, 0x50, 0x19, 0x61, 0x31, 0xe1, 0xb5, 0xf5, 0x8e, 0x57,
+ 0xd3, 0xde, 0x99, 0x35, 0x09, 0x9b, 0xab, 0x68, 0x68, 0x12, 0x21, 0xbd,
+ 0x47, 0xc5, 0x02, 0xc4, 0xee, 0xf1, 0xa4, 0x53, 0x08, 0xd5, 0x85, 0xab,
+ 0x92, 0xbc, 0xbf, 0x4b, 0x7b, 0xba, 0x9d, 0x68, 0x2e, 0x29, 0x0e, 0x63,
+ 0xfa, 0x9c, 0xd5, 0xed, 0x17, 0xef, 0x7f, 0x38, 0x1e, 0x28, 0x78, 0x92,
+ 0x72, 0x21, 0x98, 0x9c, 0x6e, 0x57, 0xe5, 0x06, 0x0a, 0x53, 0x42, 0x92,
+ 0xb0, 0x25, 0x90, 0xcc, 0xbe, 0x47, 0xfd, 0x12, 0xd7, 0xa7, 0x3c, 0x39,
+ 0xe5, 0xdb, 0x4e, 0x54, 0xfa, 0x7b, 0xc4, 0x82, 0xd1, 0x21, 0xc8, 0x6d,
+ 0x72, 0x8f, 0x8f, 0xcd, 0x1a, 0xf4, 0xbb, 0xfb, 0x17, 0xbb, 0x05, 0xa6,
+ 0x3f, 0xc1, 0x2e, 0x08, 0x55, 0xc8, 0x5f, 0xfb, 0xd3, 0xbf, 0x2c, 0xdf,
+ 0xe0, 0x00, 0xdd, 0xca, 0x4f, 0x35, 0x40, 0xd1, 0xcc, 0x22, 0x55, 0x79,
+ 0x70, 0x69, 0x06, 0x75, 0x78, 0x3b, 0x1c, 0x35, 0x01, 0x96, 0xcd, 0xa0,
+ 0xd1, 0x1e, 0xca, 0x07, 0xe6, 0x2a, 0x1c, 0xa6, 0xc6, 0x55, 0x61, 0x30,
+ 0x06, 0xf8, 0x6a, 0xa3, 0x5f, 0xeb, 0x2d, 0x2a, 0xe2, 0x4f, 0xff, 0x8c,
+ 0x6c, 0x84, 0xd1, 0xad, 0x6a, 0x65, 0xf9, 0x3e, 0x1b, 0xa3, 0x0e, 0x3f,
+ 0x00, 0xd0, 0x82, 0xed, 0x39, 0x5c, 0x35, 0x41, 0x38, 0xc9, 0x05, 0xf9,
+ 0x21, 0x66, 0x29, 0x08, 0x06, 0x58, 0x60, 0x81, 0x49, 0xa1, 0xa2, 0xfb,
+ 0x78, 0x36, 0x0f, 0xb8, 0xc2, 0xf3, 0x3a, 0x25, 0xb5, 0x3b, 0xb3, 0x84,
+ 0xce, 0x9f, 0x95, 0x77, 0x03, 0x31, 0xd7, 0xfb, 0x06, 0xfb, 0x2d, 0xad,
+ 0xd4, 0x29, 0xa7, 0x7f, 0x12, 0xeb, 0x4e, 0x6a, 0x09, 0x71, 0x87, 0xf0,
+ 0x8a, 0x89, 0xb9, 0xc5, 0xae, 0xad, 0x54, 0xcc, 0x52, 0xe2, 0x45, 0x0f,
+ 0x32, 0xa9, 0x61, 0xf4, 0xd9, 0xac, 0x7a, 0x65, 0x81, 0xca, 0x8e, 0x07,
+ 0x3c, 0x7e, 0x17, 0x55, 0x55, 0x87, 0x11, 0xf2, 0x23, 0xc3, 0xbb, 0xe7,
+ 0x27, 0x51, 0xec, 0x1d, 0xc1, 0xfa, 0x8f, 0x05, 0x46, 0xe0, 0x05, 0x7b,
+ 0x81, 0x48, 0x43, 0x8a, 0x9f, 0x7e, 0xaa, 0x51, 0xfb, 0x39, 0x24, 0x64,
+ 0x04, 0x95, 0x12, 0xc0, 0xed, 0x7f, 0xc2, 0x9c, 0x90, 0x72, 0xaa, 0xa7,
+ 0xe0, 0x5e, 0x1e, 0xad, 0x7e, 0x01, 0x0b, 0x3a, 0x96, 0xb6, 0x5b, 0x2d,
+ 0x5e, 0xc8, 0xef, 0xe3, 0x9f, 0x08, 0xee, 0x81, 0x33, 0xc7, 0xe1, 0xa7,
+ 0x87, 0x14, 0x04, 0xe2, 0x3e, 0xd2, 0x95, 0x93, 0x37, 0x5a, 0xe0, 0x3f,
+ 0x13, 0x7c, 0x8e, 0x2c, 0xb7, 0x82, 0x59, 0x2a, 0x86, 0xd4, 0xf8, 0xd6,
+ 0x12, 0xbc, 0xa7, 0x61, 0x34, 0x4a, 0xf6, 0x50, 0xc6, 0xbe, 0x50, 0x3a,
+ 0x22, 0x4e, 0x53, 0x95, 0x18, 0xfc, 0x29, 0xab, 0x53, 0x22, 0xbe, 0x16,
+ 0x9a, 0xdd, 0xb5, 0xcd, 0x7a, 0xc1, 0xa9, 0x70, 0x5a, 0xa8, 0x1d, 0xf3,
+ 0x37, 0x54, 0x10, 0xd3, 0x6e, 0xa4, 0xe4, 0x69, 0x38, 0xaa, 0x3b, 0xde,
+ 0x62, 0x9e, 0xc8, 0x0a, 0x9a, 0x3b, 0x41, 0xc0, 0xfc, 0x2c, 0x1d, 0xd5,
+ 0x4d, 0xc2, 0x7f, 0x87, 0x9b, 0x4d, 0xa4, 0xf7, 0x06, 0x1d, 0xbd, 0xaf,
+ 0xa9, 0x77, 0x24, 0x79, 0x21, 0xb0, 0x1f, 0x3d, 0xce, 0x3e, 0x98, 0x32,
+ 0xbe, 0xae, 0xf4, 0xb8, 0x81, 0xbd, 0xbb, 0x54, 0x3c, 0x76, 0x93, 0x0f,
+ 0x7c, 0x8e, 0x9a, 0x07, 0x26, 0x6e, 0x96, 0xb7, 0xb8, 0xe8, 0xd8, 0x39,
+ 0x6d, 0xf0, 0x08, 0x42, 0x42, 0x29, 0x31, 0x4d, 0x0a, 0x5f, 0xdc, 0xf2,
+ 0x75, 0xb8, 0xbd, 0x13, 0xcd, 0xd1, 0xd6, 0xec, 0x83, 0xd9, 0x9b, 0x83,
+ 0xaf, 0x27, 0x91, 0xc5, 0x4d, 0x7e, 0x68, 0xd2, 0x22, 0x29, 0x08, 0x72,
+ 0xe6, 0xa0, 0xe7, 0x40, 0xac, 0x04, 0x8f, 0x19, 0x72, 0x24, 0xb8, 0xd4,
+ 0x90, 0x90, 0x99, 0x04, 0x96, 0x99, 0xd0, 0x87, 0xce, 0x98, 0x7d, 0x1c,
+ 0x40, 0x2f, 0x7f, 0xf1, 0x16, 0x5e, 0x57, 0xb4, 0xb6, 0x11, 0xf3, 0x6d,
+ 0xf6, 0x5e, 0x6f, 0x1d, 0xfb, 0x5d, 0xcf, 0x4f, 0x23, 0x6e, 0xd2, 0x91,
+ 0xae, 0x3d, 0x58, 0x0d, 0xed, 0xd7, 0x80, 0x4b, 0xea, 0xdd, 0x3e, 0x95,
+ 0xa5, 0x52, 0xd2, 0xd9, 0xc8, 0x39, 0xdb, 0x85, 0x98, 0xde, 0x01, 0x33,
+ 0x7b, 0xb7, 0xb3, 0x7d, 0x29, 0xe9, 0x47, 0xbe, 0x4d, 0x2d, 0xf8, 0x4c,
+ 0xae, 0x07, 0xf1, 0xc7, 0x75, 0x27, 0x76, 0xed, 0x3a, 0x40, 0xa6, 0xeb,
+ 0x2d, 0x37, 0xc4, 0xf7, 0xd1, 0xab, 0x0e, 0x50, 0x1b, 0xba, 0x88, 0x48,
+ 0x1c, 0x4f, 0xb6, 0xfe, 0x59, 0xe7, 0x5c, 0x44, 0xf1, 0xaf, 0x92, 0x3e,
+ 0x81, 0xa5, 0x9a, 0xbd, 0x3d, 0xdb, 0x57, 0xe2, 0xbf, 0x0c, 0x17, 0x61,
+ 0x2b, 0x58, 0xec, 0xda, 0xf1, 0xb9, 0xb5, 0x7f, 0x0f, 0x08, 0x25, 0xb2,
+ 0x60, 0xdb, 0x79, 0xd3, 0xee, 0x61, 0xd3, 0x9d, 0x1c, 0xd8, 0xb6, 0x78,
+ 0x2f, 0x08, 0x53, 0x91, 0xa2, 0xf1, 0x80, 0xd4, 0x62, 0xda, 0x60, 0xec,
+ 0x9a, 0xc2, 0xf0, 0xb4, 0x3a, 0xb5, 0x6e, 0x37, 0x1e, 0xae, 0x38, 0xae,
+ 0x0c, 0x1e, 0x08, 0x1b, 0xc3, 0x3b, 0x11, 0xd2, 0xce, 0x1d, 0x08, 0x11,
+ 0x48, 0x1c, 0x9c, 0x88, 0x19, 0x12, 0x0f, 0xf6, 0xb9, 0x7e, 0x81, 0x69,
+ 0x1c, 0x95, 0x76, 0xc7, 0x50, 0x30, 0xbd, 0x43, 0x13, 0xcd, 0x32, 0x7c,
+ 0xa9, 0xe9, 0xa3, 0xf9, 0x7b, 0x0a, 0x00, 0x39, 0x45, 0xbf, 0xfe, 0xb3,
+ 0x46, 0x17, 0x5b, 0x7a, 0x21, 0x1b, 0x40, 0x08, 0x06, 0xf0, 0x31, 0x91,
+ 0x87, 0xe4, 0x5c, 0x49, 0xd0, 0xbe, 0x65, 0x5e, 0x9d, 0xbf, 0xee, 0x92,
+ 0x11, 0x47, 0xd1, 0x21, 0x3d, 0x51, 0xe2, 0xe2, 0x29, 0x5e, 0x0e, 0x19,
+ 0xef, 0xad, 0x80, 0x73, 0x10, 0x5b, 0xa2, 0x21, 0xb9, 0x5a, 0xea, 0x99,
+ 0x81, 0x4e, 0x89, 0x31, 0x7b, 0xa8, 0x68, 0xa0, 0xa3, 0xd9, 0xba, 0xc6,
+ 0xf6, 0xf3, 0xcc, 0x2b, 0xab, 0x3f, 0x8e, 0x52, 0x03, 0x95, 0x9d, 0x4c,
+ 0x75, 0x36, 0xfe, 0x93, 0x18, 0xd1, 0x26, 0x12, 0x30, 0xc1, 0x80, 0x37,
+ 0x6f, 0x4a, 0xea, 0x96, 0xa7, 0x2e, 0xce, 0xbd, 0x4e, 0x2c, 0x92, 0x19,
+ 0x0d, 0x10, 0x06, 0xa0, 0xc9, 0x80, 0xcf, 0x50, 0xa0, 0xab, 0x5a, 0x23,
+ 0x42, 0xac, 0xc1, 0xb2, 0x49, 0x3f, 0x45, 0x46, 0x47, 0x01, 0x24, 0xf9,
+ 0xa8, 0xb0, 0xc7, 0x72, 0x4a, 0x7c, 0xfe, 0xd6, 0xd7, 0x42, 0xbd, 0x0f,
+ 0xcb, 0x8b, 0xd0, 0x3e, 0x1e, 0x2c, 0x72, 0x2a, 0x04, 0x26, 0xca, 0x69,
+ 0x13, 0x84, 0xaf, 0xd7, 0xbd, 0x24, 0xa8, 0xd9, 0x15, 0x16, 0x31, 0xd3,
+ 0x84, 0xd4, 0xc1, 0x55, 0xf2, 0xd0, 0x7e, 0x50, 0xaf, 0x26, 0x10, 0x47,
+ 0xb2, 0xf6, 0x94, 0xa4, 0x04, 0x27, 0x6e, 0xdf, 0xd0, 0x54, 0x9c, 0x31,
+ 0x88, 0xaa, 0xff, 0x52, 0x8a, 0x51, 0x99, 0x51, 0x5f, 0xe7, 0xa7, 0xf2,
+ 0xdc, 0x47, 0x68, 0x28, 0x7f, 0xb1, 0x95, 0xf1, 0xbb, 0x11, 0x50, 0x3a,
+ 0x74, 0x8a, 0xa6, 0x9a, 0xb8, 0x27, 0xc0, 0x78, 0x53, 0x3e, 0xbc, 0x83,
+ 0x6c, 0xf3, 0xb3, 0xab, 0xa3, 0x84, 0x44, 0xdb, 0x02, 0xb9, 0xe2, 0xb1,
+ 0xaa, 0x17, 0x3d, 0x0e, 0xfa, 0x72, 0x2f, 0x0b, 0x4f, 0x0f, 0x92, 0x13,
+ 0x4d, 0x6e, 0xad, 0x75, 0x21, 0xf6, 0xb7, 0x55, 0xac, 0x16, 0x3e, 0x4d,
+ 0xa8, 0x21, 0x1e, 0x96, 0xcf, 0xb7, 0x67, 0xcd, 0xa6, 0x89, 0xa4, 0x73,
+ 0xa8, 0xf8, 0xe4, 0x9d, 0xd3, 0xa4, 0xae, 0x2e, 0x6a, 0x34, 0x56, 0xdd,
+ 0xd2, 0x58, 0x52, 0x81, 0x71, 0x4d, 0x4a, 0xec, 0x3e, 0x2d, 0x70, 0xc8,
+ 0xd4, 0xd0, 0xdb, 0x7e, 0x58, 0xcb, 0xce, 0x9d, 0x2d, 0xa5, 0xeb, 0xba,
+ 0x46, 0x58, 0x7e, 0x02, 0x42, 0x8f, 0x56, 0xe9, 0xa2, 0x7e, 0x5c, 0x79,
+ 0xd1, 0xd2, 0x2e, 0x1e, 0x29, 0x60, 0xc8, 0x80, 0xcf, 0x0d, 0x8d, 0x8f,
+ 0xd0, 0xf6, 0x0b, 0x2a, 0xd0, 0x9d, 0x1a, 0xbe, 0xac, 0x55, 0x09, 0x77,
+ 0x92, 0x6a, 0x60, 0xa0, 0xb7, 0xef, 0x3a, 0xbd, 0x6c, 0x5f, 0x51, 0x82,
+ 0x06, 0x7c, 0x7a, 0x1f, 0x7b, 0xdf, 0x6d, 0xc3, 0xdf, 0x87, 0x2f, 0x32,
+ 0x9c, 0x9b, 0xaf, 0x46, 0x96, 0x9e, 0x3a, 0xda, 0x3b, 0x1e, 0x25, 0x8c,
+ 0x4f, 0x1d, 0x9f, 0x1f, 0x07, 0x5b, 0x93, 0x25, 0xa2, 0x50, 0x3f, 0xab,
+ 0xcf, 0x07, 0xd8, 0xc9, 0x3e, 0xc8, 0x48, 0x75, 0xb7, 0xa1, 0x03, 0x7a,
+ 0x7c, 0xfa, 0xf1, 0xde, 0x7e, 0xf3, 0x3c, 0xbb, 0x91, 0xb7, 0x9e, 0x51,
+ 0x4f, 0x17, 0x66, 0xb5, 0xf5, 0x3b, 0xe5, 0x88, 0x6d, 0x72, 0xb2, 0x0a,
+ 0xab, 0x38, 0xef, 0x21, 0x61, 0x26, 0x80, 0x8a, 0x4f, 0x1c, 0xc5, 0x70,
+ 0x17, 0xc0, 0x1d, 0x28, 0x88, 0x6b, 0x28, 0x54, 0x84, 0x49, 0x3e, 0x47,
+ 0xe8, 0xf4, 0x88, 0x24, 0xb5, 0x54, 0xfc, 0xe0, 0x88, 0x58, 0x20, 0xc9,
+ 0x9e, 0x57, 0x42, 0x95, 0x5b, 0x38, 0x8a, 0x0a, 0x77, 0xa5, 0x16, 0x1d,
+ 0x3a, 0x3f, 0xab, 0xbc, 0xf7, 0x66, 0x2a, 0xfa, 0x67, 0xd6, 0x2f, 0xae,
+ 0x84, 0x15, 0x8c, 0x75, 0x4f, 0xd5, 0x0c, 0x2b, 0x97, 0x30, 0xe5, 0xa7,
+ 0x66, 0xcf, 0xb2, 0x7d, 0xe9, 0xd8, 0x52, 0x64, 0x62, 0xbc, 0xde, 0x82,
+ 0x38, 0xbb, 0x9b, 0x41, 0x43, 0xa0, 0xd3, 0xad, 0x4b, 0xb8, 0x97, 0xd7,
+ 0x1b, 0x28, 0x27, 0xf4, 0x17, 0x4a, 0x55, 0xab, 0xb5, 0xe7, 0x4e, 0x8b,
+ 0xbc, 0x07, 0x25, 0x1d, 0xb1, 0xb2, 0xab, 0xa1, 0x50, 0xb4, 0x88, 0xd7,
+ 0x78, 0x41, 0xd7, 0x99, 0x9d, 0x81, 0xf6, 0x68, 0xc7, 0xd6, 0x9d, 0x8f,
+ 0xd7, 0x94, 0xac, 0x6a, 0x16, 0xe2, 0xba, 0xf9, 0xcd, 0x2b, 0x4a, 0xfd,
+ 0x6d, 0x7c, 0xcb, 0x2d, 0x67, 0xcb, 0xe0, 0xfe, 0xb6, 0x29, 0x84, 0xd2,
+ 0x2e, 0x17, 0x6a, 0xed, 0x25, 0xaa, 0xaf, 0xfd, 0xf2, 0x58, 0x3b, 0xe0,
+ 0x01, 0x77, 0x1d, 0x94, 0x8c, 0xf6, 0x2a, 0x69, 0x4e, 0xff, 0x9c, 0x2c,
+ 0x74, 0x2f, 0xed, 0x57, 0x5e, 0xfc, 0x47, 0xad, 0x64, 0x1f, 0x84, 0x96,
+ 0xf1, 0x7a, 0xdd, 0x4e, 0x1d, 0x02, 0x4f, 0x12, 0xf0, 0x12, 0x6a, 0x10,
+ 0x0a, 0x3b, 0x5b, 0xfb, 0x50, 0x6b, 0xa1, 0xfd, 0xe8, 0x08, 0xb9, 0x01,
+ 0x42, 0x79, 0x99, 0xc8, 0x8a, 0x3b, 0xb1, 0xd5, 0xc1, 0xd1, 0x03, 0x1e,
+ 0x9b, 0xce, 0x30, 0xd3, 0xb0, 0x1f, 0x3e, 0xec, 0x44, 0x72, 0x0b, 0xa8,
+ 0xb6, 0xd1, 0xce, 0x6f, 0x19, 0x38, 0xe7, 0xb4, 0x57, 0xec, 0xd0, 0x3c,
+ 0x4c, 0xaf, 0xf3, 0xb3, 0x4a, 0xd8, 0x13, 0x4d, 0x42, 0x5b, 0x64, 0xb6,
+ 0xd4, 0x00, 0x9c, 0x2b, 0x13, 0x63, 0x37, 0x1a, 0x81, 0xb6, 0x1f, 0x59,
+ 0x81, 0xe5, 0xf7, 0xa6, 0xa5, 0x00, 0xc7, 0xb0, 0xa9, 0xca, 0xbc, 0x6d,
+ 0xa5, 0xa1, 0x43, 0x60, 0x18, 0xde, 0x01, 0xf1, 0x7d, 0x32, 0xdd, 0xf4,
+ 0xac, 0xb0, 0xaf, 0xa2, 0x13, 0x9d, 0x08, 0xd1, 0x7c, 0x30, 0x7a, 0x3c,
+ 0x95, 0x8c, 0x64, 0x93, 0xec, 0x90, 0xb9, 0x22, 0xad, 0x36, 0xbd, 0x2c,
+ 0x3d, 0x0a, 0x1c, 0x07, 0x1a, 0x05, 0x61, 0x34, 0xea, 0x05, 0xf5, 0x8f,
+ 0xb1, 0x7d, 0x59, 0x21, 0xcf, 0x57, 0x8b, 0x68, 0xc4, 0x9c, 0x2f, 0x37,
+ 0xf5, 0x76, 0x62, 0xf6, 0xd1, 0x4e, 0xfd, 0xf1, 0xa0, 0x15, 0x15, 0x7c,
+ 0x4d, 0xb9, 0x8f, 0x23, 0x20, 0x6c, 0xc0, 0x6f, 0x2c, 0x71, 0x8e, 0x12,
+ 0x55, 0x06, 0xe3, 0x1a, 0xac, 0x43, 0x7f, 0x92, 0x0d, 0xbb, 0xac, 0x76,
+ 0xb6, 0x4b, 0x75, 0x47, 0x8c, 0x2b, 0x0e, 0x43, 0x73, 0x4f, 0x2d, 0x3b,
+ 0xfa, 0x5d, 0x60, 0x97, 0x48, 0x6d, 0xd4, 0x8b, 0xce, 0x2a, 0x4a, 0xf5,
+ 0x8a, 0x58, 0xfb, 0xb4, 0x8c, 0xae, 0xbc, 0xba, 0xa5, 0x12, 0x74, 0xc0,
+ 0x1d, 0x49, 0xed, 0x3a, 0x6e, 0x24, 0x0f, 0xdb, 0x94, 0x84, 0x3e, 0x73,
+ 0x96, 0xd3, 0x50, 0x3a, 0x21, 0x55, 0x49, 0x27, 0x32, 0x2b, 0x43, 0x22,
+ 0x0a, 0x32, 0x85, 0xbc, 0x7d, 0x15, 0x18, 0x95, 0xf6, 0xa2, 0x78, 0x9a,
+ 0x1f, 0xdf, 0x81, 0x03, 0xb6, 0x40, 0xb7, 0x18, 0xb0, 0x18, 0x2a, 0x59,
+ 0xdf, 0x8f, 0x15, 0x04, 0x65, 0xf7, 0x61, 0x86, 0x6e, 0x36, 0x5d, 0x02,
+ 0xf4, 0xe2, 0x41, 0x1a, 0x0d, 0xcc, 0xaf, 0x54, 0x76, 0x35, 0xb5, 0xb0,
+ 0xb3, 0xc2, 0x88, 0x97, 0x66, 0x17, 0xc3, 0xb2, 0xbf, 0x20, 0xb3, 0x54,
+ 0x27, 0x7b, 0xc3, 0x96, 0x5b, 0xd2, 0x06, 0x55, 0xbb, 0xbd, 0x5b, 0x74,
+ 0x5f, 0x88, 0x7f, 0xb6, 0xa8, 0x4d, 0x1b, 0x8e, 0xd1, 0x02, 0x92, 0x53,
+ 0xbb, 0x32, 0xab, 0xf0, 0xde, 0xc3, 0x21, 0xa4, 0x03, 0x7a, 0xc9, 0x20,
+ 0xbd, 0x84, 0xdd, 0xff, 0x1b, 0xc6, 0xfe, 0x1c, 0xbf, 0x96, 0x09, 0xa2,
+ 0x75, 0x43, 0x6c, 0x8f, 0xf8, 0x60, 0x14, 0x48, 0x2f, 0x98, 0x15, 0x1e,
+ 0x47, 0x11, 0x8c, 0x71, 0x57, 0xfe, 0x8e, 0x72, 0xe8, 0x37, 0x92, 0x6f,
+ 0xfd, 0x4d, 0x17, 0x7e, 0x13, 0xfe, 0xad, 0x9b, 0xac, 0xd0, 0xc0, 0xe2,
+ 0x30, 0xb9, 0xd7, 0xbb, 0x8a, 0xea, 0x3d, 0xee, 0x0e, 0xdc, 0xad, 0xc4,
+ 0xe1, 0xd7, 0x70, 0x67, 0x86, 0x44, 0x49, 0x4a, 0x91, 0x5d, 0xd3, 0x85,
+ 0x02, 0xdf, 0xbd, 0x4e, 0xd5, 0x00, 0x90, 0x67, 0x03, 0x8b, 0x52, 0xcd,
+ 0x06, 0xb1, 0x4e, 0xbe, 0xa9, 0xb0, 0x42, 0x55, 0xa3, 0xcb, 0xf3, 0xeb,
+ 0x8d, 0x4d, 0xe1, 0x68, 0x09, 0x5f, 0xd1, 0xd2, 0x99, 0xa7, 0xe9, 0xcc,
+ 0x22, 0xb7, 0x89, 0xef, 0xd9, 0x47, 0x2b, 0x79, 0x50, 0xbd, 0x95, 0xf5,
+ 0x37, 0x07, 0xce, 0x73, 0x81, 0x27, 0x42, 0x4d, 0xc4, 0x68, 0x33, 0xf3,
+ 0xd3, 0x99, 0xdd, 0x88, 0xff, 0xab, 0xee, 0x6f, 0x5f, 0x51, 0xe5, 0xf8,
+ 0xf6, 0xbc, 0x6a, 0xa6, 0x02, 0xff, 0x8b, 0xe3, 0xd2, 0xa0, 0xc6, 0x44,
+ 0xbc, 0x48, 0x0c, 0x6c, 0xc4, 0x0f, 0x43, 0xe0, 0xfc, 0x7f, 0xda, 0x9a,
+ 0x37, 0x59, 0x4d, 0x20, 0xf7, 0x96, 0x9c, 0x67, 0x8b, 0x94, 0x7a, 0xf2,
+ 0xd5, 0x77, 0x3e, 0xad, 0x49, 0x57, 0x58, 0x02, 0x66, 0x93, 0x51, 0x03,
+ 0x48, 0xf0, 0xb3, 0x69, 0xa5, 0x7d, 0x50, 0x1e, 0x46, 0x6e, 0x6f, 0xc3,
+ 0x36, 0xc0, 0xc6, 0x52, 0xc2, 0x47, 0xce, 0x85, 0xe9, 0xca, 0x68, 0x29,
+ 0xaf, 0xff, 0xa8, 0x24, 0x69, 0x98, 0x6a, 0xdb, 0x70, 0xc8, 0x1d, 0x35,
+ 0x62, 0xcf, 0x21, 0xfa, 0x72, 0xbf, 0x54, 0x05, 0x15, 0x48, 0x54, 0xee,
+ 0xe6, 0x78, 0xc1, 0x53, 0x13, 0x1b, 0xee, 0xd0, 0xd5, 0x44, 0xd1, 0xd1,
+ 0x5c, 0xe1, 0x41, 0xce, 0x3e, 0x1b, 0xd0, 0xe5, 0xc0, 0x3c, 0xd7, 0xa7,
+ 0x49, 0xdf, 0xb4, 0x1a, 0x77, 0xae, 0xa3, 0x18, 0xa8, 0x26, 0xc2, 0x11,
+ 0x11, 0x2c, 0x0e, 0x69, 0xa5, 0x07, 0x17, 0x62, 0x67, 0xb7, 0xbb, 0x58,
+ 0x8e, 0x40, 0x43, 0xab, 0x31, 0x36, 0x76, 0x17, 0x3c, 0x75, 0x1c, 0x8c,
+ 0x8c, 0x7b, 0x2d, 0x5c, 0xd1, 0x82, 0x0f, 0x37, 0x10, 0x4d, 0xa1, 0xe0,
+ 0x12, 0x5d, 0x9d, 0xb6, 0xb5, 0xa4, 0x15, 0xee, 0x18, 0xff, 0x85, 0x65,
+ 0x1a, 0xf0, 0xa3, 0x1d, 0xc2, 0xdf, 0x1a, 0x1f, 0x1f, 0xfc, 0xc5, 0x32,
+ 0x4f, 0xf2, 0xb0, 0xaf, 0x80, 0x28, 0xff, 0x28, 0xd2, 0x59, 0xee, 0x33,
+ 0x6e, 0x3d, 0x3c, 0x7c, 0x78, 0xe5, 0x8e, 0xf3, 0x0b, 0xcf, 0xec, 0x07,
+ 0xd0, 0xbb, 0xcd, 0xce, 0xa8, 0xea, 0xab, 0x6a, 0xd2, 0xea, 0x05, 0xda,
+ 0x08, 0xac, 0x96, 0xd7, 0xf9, 0xe3, 0xc7, 0x06, 0x09, 0xee, 0xc1, 0x65,
+ 0xd3, 0x3d, 0x97, 0x1d, 0x37, 0x24, 0x7b, 0x4e, 0xa4, 0x5b, 0x80, 0x49,
+ 0x5a, 0x31, 0x09, 0xe5, 0x60, 0xab, 0x8b, 0x5f, 0x76, 0x6b, 0x27, 0x4c,
+ 0x59, 0x03, 0x37, 0x1a, 0x7a, 0xb6, 0x35, 0x8d, 0xad, 0xf4, 0xcf, 0x70,
+ 0xc9, 0x6d, 0x87, 0x9e, 0xde, 0xe0, 0xba, 0x59, 0x65, 0xc1, 0x96, 0x7e,
+ 0x5d, 0x81, 0x04, 0x76, 0xa3, 0x49, 0x09, 0x0e, 0xdc, 0x8f, 0xfe, 0xe2,
+ 0x37, 0xbf, 0xd0, 0x7c, 0xa8, 0x31, 0x25, 0x3c, 0x79, 0xfb, 0x5d, 0x6a,
+ 0x80, 0x88, 0x92, 0xcb, 0xa2, 0xff, 0x26, 0x91, 0x6d, 0x90, 0xb4, 0x54,
+ 0xbf, 0xfb, 0x42, 0x0a, 0x20, 0xed, 0x75, 0xd8, 0x49, 0xed, 0xf1, 0xc1,
+ 0xe2, 0xc7, 0x5f, 0x9a, 0xf0, 0xe5, 0x5a, 0xbd, 0xde, 0x13, 0xd2, 0xaf,
+ 0x2a, 0x9b, 0x6b, 0x08, 0xda, 0x6a, 0xe4, 0x32, 0x50, 0xad, 0xbc, 0x88,
+ 0xdb, 0x2c, 0xb1, 0x3f, 0x1f, 0x23, 0x85, 0x41, 0xd0, 0xed, 0x19, 0x79,
+ 0x44, 0x79, 0x9d, 0xfb, 0xde, 0x58, 0x06, 0xff, 0x14, 0xc1, 0xbd, 0xe3,
+ 0x8d, 0x9b, 0x84, 0x26, 0xaa, 0x6f, 0xbe, 0x96, 0xb9, 0x1a, 0x52, 0xc9,
+ 0x4e, 0xfe, 0x64, 0xdf, 0xc2, 0x04, 0xc9, 0x6f, 0x25, 0x64, 0x66, 0xaf,
+ 0x49, 0x13, 0x68, 0x02, 0x8d, 0x62, 0x74, 0x17, 0x54, 0x15, 0x68, 0x55,
+ 0x15, 0x6f, 0x84, 0xe5, 0x79, 0x97, 0x0c, 0x1b, 0x54, 0x9a, 0x1e, 0xea,
+ 0x83, 0x57, 0xa9, 0x1f, 0xe7, 0xbe, 0x66, 0xe1, 0xd8, 0x2e, 0x69, 0x01,
+ 0xce, 0xbe, 0xdd, 0x63, 0x39, 0x0c, 0x9d, 0x3f, 0xa8, 0xa0, 0xd5, 0xb3,
+ 0x0f, 0xc6, 0x31, 0x62, 0xa9, 0xf3, 0x3e, 0x75, 0x90, 0x8f, 0x50, 0x73,
+ 0x68, 0x1c, 0xcc, 0x5f, 0xfb, 0x1f, 0x88, 0x69, 0x0e, 0x2d, 0xeb, 0x93,
+ 0x5e, 0xf6, 0xbb, 0x15, 0x03, 0xa7, 0xbf, 0x1e, 0x87, 0x08, 0x0b, 0x8b,
+ 0x26, 0x1a, 0xc7, 0xc3, 0xd3, 0x31, 0x49, 0x23, 0x46, 0xd8, 0x5d, 0x7b,
+ 0xb6, 0x56, 0x82, 0x4f, 0x26, 0x9a, 0x0b, 0xfb, 0x30, 0x44, 0x2c, 0xf2,
+ 0x93, 0xad, 0x74, 0xfc, 0x43, 0x03, 0xd0, 0x6d, 0xba, 0x28, 0x7a, 0x60,
+ 0x69, 0x9e, 0x95, 0xe5, 0x03, 0xbd, 0x37, 0x6a, 0x3e, 0xfd, 0x68, 0x2e,
+ 0xb4, 0x1e, 0xb6, 0x3c, 0x49, 0xae, 0x66, 0x7f, 0x0a, 0x4f, 0x34, 0xf2,
+ 0x6b, 0xe7, 0x00, 0xa3, 0xfd, 0x94, 0xd5, 0x18, 0xba, 0xa0, 0xeb, 0x81,
+ 0x47, 0x1b, 0x9f, 0x44, 0xaa, 0x82, 0x55, 0x79, 0xd6, 0x74, 0x7c, 0xc5,
+ 0xc4, 0x7a, 0x19, 0x90, 0x86, 0xf3, 0xab, 0x22, 0x02, 0xd6, 0x1f, 0x38,
+ 0x68, 0xfc, 0xaa, 0x42, 0x39, 0x9c, 0x72, 0x98, 0x0b, 0xef, 0x57, 0x12,
+ 0x17, 0xb2, 0x93, 0x29, 0xb9, 0x00, 0xb2, 0x5b, 0xd2, 0x12, 0x4f, 0xf6,
+ 0x0d, 0x2f, 0x44, 0x89, 0x00, 0x19, 0x9c, 0xa6, 0xea, 0xfe, 0xa0, 0xcb,
+ 0x57, 0x83, 0xf1, 0xba, 0x44, 0x7b, 0x68, 0x57, 0x5e, 0x71, 0x7c, 0x36,
+ 0x9b, 0x4c, 0x63, 0x12, 0x5f, 0xff, 0x6a, 0x39, 0xfe, 0x6e, 0x22, 0x4c,
+ 0xf4, 0x53, 0x50, 0x69, 0xe1, 0xc2, 0x91, 0xe3, 0xa3, 0x4b, 0x88, 0x00,
+ 0xbf, 0xc5, 0x3c, 0xe1, 0x22, 0x80, 0x0e, 0x53, 0x2b, 0x8e, 0xfc, 0xb1,
+ 0x42, 0x85, 0x21, 0xb5, 0xa3, 0xd8, 0xf8, 0x23, 0x70, 0xe4, 0x46, 0xe7,
+ 0xf2, 0x4f, 0xb0, 0x50, 0x35, 0xee, 0x30, 0x33, 0x0b, 0x05, 0x30, 0xac,
+ 0xe1, 0xf6, 0x07, 0x00, 0x51, 0xf3, 0x10, 0x24, 0x98, 0xa8, 0x5b, 0x66,
+ 0x61, 0xff, 0x4b, 0xa6, 0xee, 0xfe, 0x8c, 0x42, 0xae, 0xc1, 0xab, 0x9c,
+ 0x4e, 0x94, 0xe9, 0xc9, 0xc0, 0x18, 0xcb, 0x34, 0x27, 0xc0, 0x29, 0xb1,
+ 0x4b, 0x5f, 0x9a, 0x26, 0xc2, 0x01, 0xc1, 0x95, 0xea, 0x9a, 0xd7, 0x61,
+ 0xa6, 0xfc, 0x0f, 0x94, 0x8c, 0xe8, 0xb5, 0xdd, 0xe2, 0xb6, 0x2b, 0x98,
+ 0xb7, 0xf9, 0xd9, 0x7e, 0xd1, 0xe9, 0x67, 0xbb, 0xda, 0xe8, 0x9d, 0x7c,
+ 0xc9, 0x7f, 0xfe, 0xd0, 0x2a, 0x53, 0xc2, 0x1c, 0xbe, 0xfc, 0x14, 0x97,
+ 0x3f, 0x04, 0xd9, 0x59, 0x39, 0xeb, 0xb7, 0x8a, 0xed, 0x69, 0x8c, 0x87,
+ 0x30, 0x1b, 0xf9, 0xcb, 0x1f, 0xb4, 0xef, 0xac, 0x66, 0x4b, 0x9f, 0xa8,
+ 0x03, 0xdc, 0x01, 0x2f, 0xb2, 0xfa, 0x68, 0xfd, 0x2c, 0x3c, 0xa0, 0xba,
+ 0x63, 0xcb, 0x52, 0x44, 0xbf, 0x88, 0xab, 0xdd, 0xb4, 0x14, 0xa2, 0x25,
+ 0xe3, 0x09, 0xa8, 0xa4, 0xe8, 0x6a, 0x61, 0x0e, 0xcc, 0x05, 0x90, 0x3a,
+ 0xa5, 0x0a, 0x7a, 0x58, 0x3f, 0x45, 0x73, 0x84, 0x98, 0x72, 0xc6, 0xd3,
+ 0xdb, 0x57, 0xab, 0x65, 0x44, 0xcd, 0x0d, 0x0d, 0x45, 0xfd, 0xe8, 0x2e,
+ 0xa8, 0xa6, 0x52, 0x0c, 0x61, 0x73, 0xb2, 0x18, 0x65, 0x61, 0xa8, 0x68,
+ 0xc8, 0x78, 0xf3, 0xf4, 0x76, 0x5b, 0x48, 0x11, 0xaa, 0xa9, 0xa0, 0xc1,
+ 0xa9, 0x4a, 0xf5, 0x1f, 0xef, 0xcb, 0x64, 0x9e, 0x2e, 0x8e, 0xbd, 0x28,
+ 0x8c, 0x8e, 0x54, 0x63, 0x85, 0xda, 0xe7, 0x73, 0xae, 0xb5, 0x2b, 0x71,
+ 0x6f, 0x2b, 0x8d, 0x44, 0xb4, 0x16, 0x2d, 0xb0, 0xe7, 0x05, 0x30, 0x9c,
+ 0x00, 0x85, 0xb2, 0x1d, 0x2e, 0x04, 0xf6, 0xcf, 0x99, 0xd6, 0x0f, 0x70,
+ 0x08, 0xb6, 0x71, 0xba, 0x65, 0x59, 0xb0, 0x3e, 0xe8, 0x69, 0x27, 0xf3,
+ 0x13, 0x59, 0xf4, 0xef, 0xbd, 0xdf, 0x6a, 0xd9, 0x3e, 0xe8, 0x1f, 0x11,
+ 0xd2, 0x53, 0x75, 0x56, 0x52, 0x4b, 0x6c, 0x98, 0xef, 0x00, 0xdf, 0x21,
+ 0xeb, 0x3f, 0x54, 0x4b, 0x6a, 0xa8, 0x98, 0x5d, 0x26, 0x06, 0x0d, 0x2e,
+ 0xd0, 0x6e, 0xf6, 0x00, 0x22, 0xfc, 0xc2, 0x8d, 0x5c, 0x4b, 0xf6, 0x83,
+ 0x55, 0x02, 0x90, 0x04, 0xef, 0x37, 0x04, 0xc6, 0xb4, 0xd3, 0x6c, 0x48,
+ 0x0d, 0xeb, 0x39, 0x13, 0xf0, 0xda, 0x28, 0xe8, 0xf0, 0x96, 0x73, 0x0d,
+ 0x9b, 0xb9, 0x22, 0x55, 0x96, 0x9d, 0x38, 0x1b, 0xac, 0x18, 0x13, 0x04,
+ 0xf1, 0xe4, 0x53, 0x19, 0x76, 0x33, 0x40, 0x6d, 0xe4, 0xb2, 0x5e, 0x73,
+ 0x84, 0x83, 0xa1, 0xf0, 0xb3, 0x75, 0xeb, 0x70, 0x53, 0x19, 0xd1, 0x5c,
+ 0x5b, 0x57, 0x57, 0xfb, 0xce, 0x5d, 0x9b, 0xc8, 0xd9, 0xc6, 0x55, 0xca,
+ 0x20, 0x84, 0x87, 0xd7, 0x84, 0xa4, 0xb0, 0x03, 0x9d, 0x61, 0xcc, 0xc2,
+ 0x84, 0xe1, 0x91, 0x90, 0x44, 0x72, 0xbf, 0xb8, 0xed, 0xcb, 0x29, 0xd3,
+ 0xbe, 0x0d, 0x37, 0x2f, 0xf6, 0xe1, 0x5a, 0xd5, 0xaa, 0xf4, 0xc2, 0xc6,
+ 0x71, 0x7c, 0x7e, 0xcd, 0x4a, 0x64, 0x8c, 0xda, 0x12, 0x71, 0xa3, 0x59,
+ 0x04, 0x7d, 0xe2, 0xe3, 0x68, 0x42, 0x10, 0x1b, 0x3a, 0x5f, 0x92, 0x1f,
+ 0x06, 0x20, 0x9b, 0xb7, 0x73, 0x8b, 0x42, 0xbc, 0x76, 0xba, 0x24, 0x88,
+ 0xe8, 0xad, 0xfe, 0x3b, 0xef, 0x7d, 0x2c, 0x49, 0x8d, 0xa0, 0xc6, 0x2a,
+ 0x01, 0x41, 0xa6, 0x1c, 0x32, 0xae, 0xf7, 0xf5, 0x1f, 0xe1, 0x58, 0xcd,
+ 0xb4, 0x17, 0x63, 0x0b, 0x8a, 0x4b, 0x1e, 0x62, 0xae, 0x32, 0x33, 0xf8,
+ 0x1f, 0x14, 0x2b, 0x85, 0x53, 0xab, 0x09, 0x0b, 0x16, 0x81, 0x23, 0x5e,
+ 0x8b, 0x4c, 0x96, 0x0d, 0x7d, 0xa2, 0xd1, 0x22, 0x9d, 0x3e, 0x95, 0x5c,
+ 0xe4, 0x8b, 0xa4, 0x16, 0x6d, 0x2d, 0xec, 0xf1, 0x16, 0x4e, 0x7e, 0x36,
+ 0x18, 0x22, 0x8a, 0xfe, 0x9c, 0x3c, 0x6e, 0xf3, 0xe0, 0x3e, 0x96, 0xa5,
+ 0xb5, 0xc1, 0x2f, 0xe5, 0xeb, 0xf3, 0x44, 0xcb, 0xb1, 0x5e, 0xd6, 0xbe,
+ 0x79, 0x86, 0x44, 0x9a, 0x84, 0x02, 0x78, 0x1e, 0x58, 0xe9, 0x80, 0x6a,
+ 0xd6, 0x4f, 0xaa, 0x51, 0xec, 0xb4, 0xb6, 0xd0, 0x4f, 0xb2, 0x8c, 0x6e,
+ 0x2c, 0xa9, 0x16, 0xc0, 0x1b, 0x69, 0x6c, 0x28, 0x97, 0xcc, 0xb8, 0x3f,
+ 0x2f, 0x72, 0xdd, 0x1b, 0x29, 0x06, 0xff, 0xca, 0x2c, 0xe7, 0xd7, 0x20,
+ 0x61, 0x87, 0x39, 0x71, 0x8e, 0xe1, 0x6e, 0x2c, 0xbc, 0x3a, 0x3c, 0x43,
+ 0x6f, 0x6d, 0x18, 0x53, 0x4d, 0x41, 0xb3, 0xe8, 0x0c, 0xb3, 0x83, 0xcb,
+ 0xb4, 0x9a, 0xa8, 0x27, 0x1f, 0x0c, 0x84, 0xdb, 0x22, 0x61, 0x3f, 0xc3,
+ 0x2e, 0x42, 0x78, 0xd6, 0x5e, 0x3e, 0xd8, 0x5a, 0x67, 0x88, 0x5e, 0x16,
+ 0x23, 0xb4, 0x3a, 0x8d, 0x6b, 0x00, 0x2e, 0xf1, 0x01, 0x26, 0x56, 0x77,
+ 0x4f, 0xf5, 0xed, 0xbd, 0x2d, 0x05, 0x14, 0xd1, 0xa8, 0x11, 0x2b, 0x5b,
+ 0x64, 0x5e, 0xe7, 0xa3, 0x78, 0x15, 0x73, 0xce, 0x61, 0xaa, 0x03, 0x4f,
+ 0xa7, 0x70, 0xd6, 0x2a, 0x20, 0xa4, 0xb3, 0xe4, 0xb7, 0x09, 0xd0, 0xf1,
+ 0xfc, 0x55, 0x6a, 0x18, 0xcd, 0x1d, 0x7b, 0xda, 0x27, 0xcd, 0x5b, 0x68,
+ 0x77, 0x76, 0x75, 0x1b, 0x6e, 0xed, 0x80, 0x51, 0x62, 0x6e, 0x28, 0xcb,
+ 0x25, 0xaf, 0xdf, 0x0a, 0xf8, 0xfd, 0xf5, 0x2a, 0xde, 0x61, 0x54, 0x7b,
+ 0x11, 0x2b, 0x69, 0x6c, 0x95, 0x0c, 0x83, 0x84, 0x62, 0x3d, 0xb8, 0x8e,
+ 0x76, 0x58, 0xfa, 0x2e, 0x4e, 0xee, 0x1b, 0x01, 0xec, 0x82, 0xd9, 0xcc,
+ 0xa4, 0xa2, 0x36, 0x24, 0xfd, 0x71, 0xf0, 0x18, 0x27, 0x07, 0x2d, 0xd3,
+ 0xb6, 0xff, 0x46, 0x53, 0x76, 0xa8, 0xda, 0xb0, 0x8a, 0xae, 0x23, 0xc8,
+ 0xf6, 0xb2, 0x81, 0x1f, 0xb7, 0x33, 0x24, 0xe1, 0xe1, 0x4a, 0x6e, 0xd0,
+ 0x9f, 0x30, 0xe1, 0xc9, 0xff, 0x19, 0xf3, 0x47, 0x1c, 0x10, 0x86, 0xc0,
+ 0xaa, 0xab, 0x5c, 0x58, 0xa7, 0xc6, 0x37, 0x35, 0x01, 0xff, 0xd3, 0xe8,
+ 0xf9, 0xf4, 0x8e, 0x75, 0x88, 0x89, 0xf9, 0x89, 0x29, 0xee, 0x9f, 0xf0,
+ 0xe6, 0x93, 0x96, 0x39, 0xe8, 0x97, 0x89, 0xff, 0x89, 0x3a, 0x34, 0x00,
+ 0x6f, 0x66, 0x6f, 0x7c, 0xdc, 0xc1, 0xf6, 0x00, 0xa0, 0x86, 0x5d, 0xc5,
+ 0xdf, 0x0a, 0xc5, 0xac, 0xa9, 0xf1, 0x39, 0x1a, 0xe0, 0x73, 0x8b, 0x73,
+ 0x1e, 0x48, 0xe1, 0x9a, 0x11, 0xa4, 0x3f, 0xa4, 0xd2, 0x13, 0x21, 0xa1,
+ 0x1f, 0x64, 0x7e, 0x26, 0x16, 0x6e, 0x2b, 0x8e, 0x85, 0x52, 0x02, 0xe5,
+ 0xdc, 0x89, 0xa8, 0xcf, 0x1d, 0x1f, 0xe9, 0xd8, 0x51, 0x9f, 0x65, 0x98,
+ 0x2a, 0x39, 0x23, 0x69, 0x00, 0xb1, 0xf4, 0x8e, 0x00, 0xcb, 0xc5, 0x24,
+ 0x90, 0x74, 0x0e, 0x3b, 0xae, 0xd9, 0x1a, 0xa9, 0xb3, 0x3e, 0xc4, 0xeb,
+ 0xb3, 0xe6, 0x50, 0xf9, 0xa8, 0x33, 0xbd, 0x49, 0x83, 0xd2, 0x14, 0xee,
+ 0xfe, 0xca, 0x66, 0xfb, 0x1a, 0xf7, 0x37, 0xe4, 0x2b, 0xd6, 0x75, 0xbd,
+ 0xe2, 0x54, 0x6e, 0x14, 0xd6, 0xb6, 0x9b, 0x16, 0xd2, 0x2c, 0x5a, 0xa4,
+ 0x3e, 0xb0, 0x89, 0x57, 0xd7, 0x92, 0x96, 0xbb, 0xf5, 0xeb, 0xef, 0x69,
+ 0xbe, 0x10, 0xee, 0xb8, 0x49, 0x8c, 0xa8, 0x46, 0x5f, 0x55, 0xdc, 0xbe,
+ 0xfb, 0xbc, 0x32, 0xcd, 0x05, 0x37, 0x8a, 0x6b, 0xfe, 0xd1, 0xa4, 0x19,
+ 0xd5, 0x62, 0xe2, 0x70, 0x3d, 0x25, 0x6d, 0x52, 0xa1, 0xfc, 0xed, 0x6e,
+ 0x7c, 0x86, 0x75, 0x24, 0x5f, 0x5b, 0x4d, 0x9a, 0x8c, 0xba, 0x2e, 0x11,
+ 0xd5, 0x08, 0x48, 0x06, 0xa6, 0x8b, 0x16, 0x95, 0x4b, 0x13, 0xda, 0xeb,
+ 0xae, 0xb6, 0x12, 0x9f, 0x5e, 0xa4, 0x15, 0x75, 0x7f, 0xdc, 0xc7, 0x73,
+ 0x99, 0xe4, 0x20, 0xc7, 0x07, 0x06, 0xd7, 0x40, 0x27, 0xf0, 0x50, 0xc8,
+ 0x58, 0x05, 0x85, 0x62, 0x38, 0x4a, 0xaf, 0xcb, 0x69, 0x88, 0x95, 0x1b,
+ 0xa0, 0x1d, 0x57, 0x1c, 0xd6, 0x27, 0x35, 0x20, 0x9b, 0x1e, 0xb2, 0xdb,
+ 0xbc, 0xcf, 0x3d, 0xc2, 0x73, 0xea, 0x65, 0xb1, 0xe3, 0xcc, 0xb7, 0x17,
+ 0xdc, 0x7a, 0xad, 0xe7, 0xcd, 0x2e, 0xa7, 0x63, 0x44, 0xd1, 0x37, 0x07,
+ 0xbd, 0xa4, 0x76, 0xcb, 0xa8, 0x8f, 0x0f, 0x40, 0x3e, 0x3c, 0x69, 0x68,
+ 0x89, 0xba, 0xe5, 0x68, 0xf8, 0x61, 0xa5, 0xa8, 0xdc, 0xae, 0x63, 0x8a,
+ 0xef, 0xc6, 0x07, 0xcc, 0x3b, 0xd6, 0x53, 0x37, 0xee, 0xf2, 0x16, 0xf0,
+ 0x7a, 0xdf, 0xde, 0xb2, 0x42, 0xd2, 0xca, 0xcb, 0x95, 0xd3, 0x62, 0xbf,
+ 0x71, 0xa2, 0xd9, 0xd5, 0x7d, 0x3f, 0x8e, 0xde, 0x6c, 0xf2, 0xb7, 0xa4,
+ 0x77, 0xf5, 0xa8, 0xeb, 0x54, 0x88, 0x6e, 0xc0, 0xdc, 0x2e, 0x34, 0x00,
+ 0x53, 0xc4, 0xa4, 0x1e, 0x58, 0xc4, 0x9c, 0xfa, 0x69, 0xce, 0x3f, 0x12,
+ 0x38, 0x18, 0x47, 0x50, 0x50, 0x51, 0xd4, 0xbf, 0x25, 0xb8, 0xd3, 0x99,
+ 0xca, 0xb8, 0x47, 0x5d, 0x04, 0xb7, 0x5d, 0x9b, 0x7c, 0xad, 0x77, 0x0b,
+ 0xbb, 0xf6, 0xa1, 0x32, 0x61, 0xa7, 0x94, 0x3e, 0xeb, 0x97, 0xf3, 0x85,
+ 0x25, 0x07, 0x06, 0x69, 0x8b, 0x04, 0x56, 0xa9, 0xe1, 0x38, 0xbe, 0x95,
+ 0x92, 0x69, 0xa6, 0x40, 0xbf, 0xe7, 0xa8, 0xf0, 0x8f, 0xbd, 0x5a, 0xe0,
+ 0x7c, 0x33, 0x80, 0x1d, 0x37, 0x47, 0xfe, 0x7b, 0xe6, 0x63, 0x02, 0x1d,
+ 0x0e, 0x8e, 0x21, 0x76, 0x8a, 0xfe, 0xfc, 0x04, 0x54, 0x44, 0xc0, 0xda,
+ 0x40, 0xce, 0x27, 0x69, 0xa5, 0x37, 0x3c, 0xbc, 0x3a, 0x90, 0x88, 0x8d,
+ 0xd0, 0xc3, 0x5f, 0x88, 0x0c, 0x7f, 0x5a, 0xa4, 0x16, 0x1b, 0x1d, 0xa5,
+ 0x4e, 0x2d, 0x7b, 0x31, 0x8b, 0xef, 0x96, 0xf5, 0xa3, 0x84, 0x85, 0xb4,
+ 0x76, 0x1e, 0x9d, 0xa3, 0x1c, 0x40, 0xff, 0xd3, 0xdd, 0x99, 0x69, 0x58,
+ 0xfb, 0x0f, 0x98, 0x2d, 0xb4, 0xfb, 0xcc, 0xd3, 0x07, 0x85, 0xd2, 0xb7,
+ 0x24, 0xf2, 0xa1, 0x9c, 0xfd, 0x60, 0x7a, 0xa0, 0x40, 0xb2, 0x9d, 0x82,
+ 0x30, 0x68, 0x42, 0x66, 0x47, 0xba, 0x3c, 0xef, 0x80, 0x9b, 0x2d, 0xd2,
+ 0xb1, 0x1d, 0x93, 0xcb, 0x43, 0x4e, 0x64, 0x91, 0x64, 0x65, 0xad, 0x61,
+ 0x24, 0xce, 0xd6, 0xfc, 0xaf, 0xef, 0x02, 0x60, 0x7e, 0x4f, 0x57, 0x74,
+ 0x5c, 0x43, 0x42, 0x86, 0xd5, 0xac, 0xc7, 0xec, 0xb4, 0xb2, 0x2c, 0x73,
+ 0xd3, 0x74, 0x55, 0xa2, 0x80, 0xbb, 0xea, 0xaf, 0x51, 0xa9, 0xa8, 0xdb,
+ 0x48, 0x8b, 0xfe, 0xf6, 0x11, 0x83, 0x4d, 0x0c, 0xcd, 0x7b, 0x26, 0x71,
+ 0xe8, 0xf2, 0xf7, 0x87, 0x28, 0x98, 0x3c, 0xe6, 0xb5, 0xea, 0xea, 0x53,
+ 0x8c, 0x87, 0xdd, 0xf8, 0x96, 0x02, 0x94, 0xf9, 0x94, 0x19, 0xd3, 0x83,
+ 0x72, 0x71, 0x13, 0x86, 0x69, 0xb0, 0x7c, 0x5b, 0x36, 0x45, 0x2e, 0x6e,
+ 0x7d, 0x88, 0x80, 0xfb, 0x6c, 0x9b, 0xc6, 0x05, 0xe1, 0xa8, 0x74, 0x39,
+ 0x89, 0x51, 0xfc, 0x2e, 0x43, 0x10, 0xec, 0xc3, 0xdc, 0xfd, 0xc9, 0xa1,
+ 0x25, 0x36, 0xff, 0x7b, 0x7d, 0x47, 0x67, 0x98, 0xc6, 0x4f, 0xb4, 0x61,
+ 0x9d, 0x8d, 0x0b, 0x28, 0x64, 0x84, 0x69, 0x1f, 0xd6, 0x46, 0xc2, 0x3e,
+ 0x3a, 0xe2, 0x64, 0xa1, 0x3c, 0x60, 0xce, 0x73, 0xcf, 0xcd, 0xd0, 0x01,
+ 0x99, 0x1f, 0x17, 0xad, 0xfb, 0xcc, 0x38, 0x3f, 0xeb, 0x20, 0x84, 0xf7,
+ 0xd0, 0x72, 0x73, 0xa0, 0x57, 0xce, 0x38, 0x24, 0xa1, 0xc5, 0x59, 0x4f,
+ 0x49, 0x3a, 0x7f, 0xd9, 0x61, 0x0c, 0x85, 0xce, 0xa6, 0x5c, 0xb2, 0x65,
+ 0xbc, 0xd1, 0x79, 0x17, 0xc5, 0x5c, 0x3f, 0x79, 0xbe, 0xec, 0xe4, 0x22,
+ 0x81, 0xb8, 0x03, 0x24, 0x03, 0x9c, 0xb3, 0xf7, 0xeb, 0xaa, 0xf8, 0x1a,
+ 0x40, 0x0e, 0xcd, 0xb7, 0x17, 0xad, 0xc4, 0x9d, 0x15, 0x54, 0x5e, 0x15,
+ 0xf8, 0x58, 0x32, 0x8c, 0x52, 0x8b, 0x77, 0x84, 0x6b, 0xab, 0x88, 0xdf,
+ 0x82, 0x27, 0x7e, 0xfb, 0xea, 0xa5, 0x83, 0xec, 0x29, 0x4c, 0x7c, 0x2f,
+ 0x75, 0xf6, 0xad, 0xce, 0x21, 0x10, 0x0a, 0x64, 0x64, 0xf9, 0xab, 0x46,
+ 0x91, 0xfb, 0xf4, 0xb7, 0x9c, 0x3d, 0x72, 0x03, 0x79, 0x52, 0x71, 0x54,
+ 0x1d, 0xfe, 0x51, 0x57, 0xc5, 0xba, 0xf2, 0x2c, 0x0e, 0x41, 0x3a, 0x57,
+ 0xe6, 0xe9, 0x5b, 0x64, 0xac, 0xff, 0xc1, 0xc4, 0x2f, 0x9e, 0xe6, 0x29,
+ 0x95, 0x8e, 0xa0, 0xa0, 0x17, 0x8a, 0xf5, 0x32, 0x83, 0x5b, 0x57, 0x92,
+ 0x1f, 0x4c, 0xa8, 0x0e, 0xfb, 0x89, 0x05, 0xb6, 0xc6, 0xa5, 0x45, 0x52,
+ 0x61, 0xf2, 0x0f, 0x85, 0x27, 0xbf, 0x9d, 0xb8, 0x1f, 0x16, 0x05, 0x58,
+ 0x5f, 0x2b, 0x85, 0x0a, 0xd3, 0xbe, 0xa0, 0xbe, 0x68, 0xb5, 0xac, 0x87,
+ 0xd0, 0x34, 0x92, 0x9f, 0x18, 0x92, 0x11, 0x5f, 0xcb, 0x72, 0xa4, 0xd6,
+ 0xa1, 0x59, 0x06, 0xfe, 0x62, 0x13, 0x50, 0x56, 0x38, 0xba, 0x97, 0xbc,
+ 0x9d, 0xfb, 0xa6, 0xb0, 0x35, 0x3d, 0x22, 0x47, 0x52, 0x70, 0xea, 0xcb,
+ 0xa4, 0x75, 0x8e, 0xcd, 0xcb, 0x2e, 0x82, 0x1b, 0xfc, 0xf1, 0x31, 0xbd,
+ 0xbe, 0xba, 0x96, 0x17, 0x06, 0x2b, 0x09, 0x52, 0x8e, 0x30, 0x83, 0x3a,
+ 0x19, 0x8c, 0x2e, 0xec, 0x7a, 0x50, 0x53, 0x60, 0x13, 0xf8, 0x4a, 0x0a,
+ 0xe6, 0x23, 0xc7, 0xb2, 0x95, 0x24, 0x40, 0x9b, 0x4f, 0xfb, 0x68, 0xb2,
+ 0xc7, 0xce, 0xa1, 0x54, 0x14, 0x3c, 0x39, 0xc0, 0x7a, 0x65, 0x7c, 0x97,
+ 0x00, 0x27, 0xb8, 0xbc, 0x01, 0x8f, 0x88, 0x0e, 0x12, 0xfd, 0x33, 0xdd,
+ 0xaf, 0x30, 0x60, 0x45, 0x21, 0x5d, 0x9e, 0x50, 0xce, 0x69, 0x35, 0x8f,
+ 0x6b, 0xd3, 0xb4, 0xc4, 0x19, 0x03, 0x58, 0xd5, 0xad, 0x8c, 0xfe, 0xd0,
+ 0xac, 0x15, 0xaa, 0xd7, 0x90, 0x92, 0xcc, 0xb5, 0xb5, 0x79, 0xdc, 0x95,
+ 0x90, 0x51, 0x04, 0xb3, 0x62, 0xe3, 0xaf, 0xdd, 0xb6, 0xeb, 0xc3, 0x79,
+ 0x44, 0x9e, 0x21, 0xd5, 0x1d, 0xec, 0x93, 0x47, 0x7b, 0xa9, 0x30, 0x9b,
+ 0x80, 0xa0, 0x09, 0x6b, 0x95, 0x8b, 0x30, 0x46, 0x6a, 0xdf, 0xe5, 0x5c,
+ 0x54, 0x62, 0x21, 0x49, 0x8c, 0xbf, 0xc7, 0x57, 0x2e, 0xd8, 0x39, 0xe6,
+ 0x60, 0xac, 0x54, 0xe8, 0x97, 0x96, 0xba, 0x21, 0xba, 0x37, 0x47, 0x61,
+ 0x34, 0x73, 0xdf, 0xda, 0x27, 0x24, 0xa3, 0x25, 0x5f, 0xbb, 0xd1, 0xca,
+ 0xec, 0x17, 0xda, 0x76, 0xb4, 0x0b, 0x0d, 0x51, 0x8a, 0xd4, 0xdd, 0x94,
+ 0x30, 0xb4, 0x71, 0x28, 0xa5, 0x0a, 0x89, 0x80, 0xc8, 0xbe, 0x30, 0x79,
+ 0x32, 0xed, 0x6e, 0x1c, 0xd6, 0x16, 0xc2, 0x38, 0x4f, 0xd6, 0xf5, 0x30,
+ 0x92, 0x19, 0x35, 0xcd, 0x23, 0x41, 0xde, 0x59, 0x4f, 0xbf, 0x9a, 0x86,
+ 0xad, 0x86, 0x97, 0xa1, 0x22, 0x9e, 0x0e, 0xe2, 0xf0, 0xcc, 0x1e, 0x72,
+ 0xe6, 0x77, 0x8f, 0x21, 0x82, 0xa1, 0xf9, 0x7b, 0x4b, 0x89, 0x22, 0xc0,
+ 0x50, 0xbe, 0x75, 0x5f, 0x79, 0xca, 0x2d, 0x32, 0xf1, 0x13, 0x43, 0xec,
+ 0x5f, 0x9a, 0x8a, 0xe0, 0xda, 0xab, 0xb6, 0xdb, 0xfd, 0xc5, 0x39, 0x15,
+ 0x4c, 0x79, 0x10, 0x6c, 0x8b, 0x68, 0xb4, 0x37, 0x3b, 0x3e, 0x1c, 0x80,
+ 0xaf, 0x72, 0xb3, 0x43, 0x7b, 0x95, 0x7b, 0x5d, 0xa8, 0xde, 0x78, 0x99,
+ 0xba, 0x9e, 0xe7, 0xbd, 0x94, 0x71, 0xfb, 0x9c, 0xa6, 0x50, 0x76, 0xdb,
+ 0xbb, 0xa1, 0x07, 0x2f, 0x76, 0x91, 0x26, 0x08, 0xe3, 0x4c, 0xc8, 0xec,
+ 0xac, 0x8e, 0xed, 0x63, 0x7c, 0x8c, 0x1c, 0xf8, 0xb4, 0xd5, 0xb4, 0xda,
+ 0x0d, 0x9f, 0xcf, 0x8a, 0xc1, 0x68, 0x98, 0xd5, 0x5f, 0x73, 0x34, 0xc2,
+ 0xe0, 0xaf, 0x27, 0x78, 0xa9, 0xa6, 0x2f, 0x9a, 0x0b, 0x6a, 0xdc, 0xd3,
+ 0xb7, 0x66, 0x5b, 0xae, 0x1a, 0x23, 0x7e, 0xfb, 0xce, 0x4b, 0x6e, 0x01,
+ 0x97, 0x84, 0x09, 0x21, 0x89, 0x77, 0x21, 0xa2, 0xc4, 0xe5, 0xed, 0xb7,
+ 0xc7, 0x23, 0x9f, 0x34, 0x2b, 0xf9, 0x94, 0x83, 0xe3, 0xff, 0xf1, 0x2f,
+ 0x49, 0x8f, 0x34, 0xb3, 0x73, 0xa3, 0x83, 0x87, 0xfc, 0xaf, 0x54, 0x9d,
+ 0xb1, 0xbc, 0x51, 0x2a, 0x0b, 0x12, 0x49, 0xc0, 0xbd, 0xfc, 0x09, 0x20,
+ 0xd6, 0x52, 0x26, 0xc1, 0xb5, 0xbf, 0xed, 0xdb, 0xf1, 0x75, 0xde, 0x62,
+ 0xc2, 0x4c, 0xc7, 0xa2, 0x5a, 0x10, 0xf9, 0xa8, 0xba, 0x1c, 0x99, 0xe6,
+ 0x7c, 0x40, 0x70, 0x81, 0x09, 0xfd, 0x45, 0x8b, 0xb5, 0x05, 0x55, 0x2f,
+ 0x11, 0x1c, 0x41, 0xbd, 0x79, 0x19, 0x54, 0xdb, 0xd1, 0x79, 0xe0, 0x76,
+ 0xde, 0x6c, 0x56, 0x38, 0x0e, 0x5e, 0x87, 0x69, 0xb0, 0x88, 0x1a, 0xcf,
+ 0x3e, 0xf2, 0x02, 0x63, 0x7b, 0xc9, 0x61, 0x0e, 0xe9, 0xac, 0xf0, 0x0e,
+ 0xaf, 0x81, 0x99, 0xe6, 0x90, 0x6e, 0x5e, 0xc1, 0x5e, 0xbb, 0xff, 0xee,
+ 0xf2, 0xfb, 0xc4, 0x66, 0x03, 0xe4, 0xd4, 0xbd, 0xcc, 0x79, 0xd9, 0x8b,
+ 0xee, 0xe2, 0x2e, 0xac, 0x68, 0x29, 0x55, 0x9a, 0x9e, 0x7f, 0x0c, 0x51,
+ 0x19, 0x9e, 0x89, 0xf8, 0x72, 0xe8, 0x6e, 0xfe, 0x74, 0x17, 0x2c, 0x95,
+ 0xe3, 0x1e, 0xcf, 0x3e, 0xeb, 0x9e, 0xff, 0x68, 0xbd, 0xe6, 0xd0, 0x59,
+ 0x66, 0x1c, 0xc3, 0xed, 0x04, 0x0d, 0x35, 0xc1, 0x9e, 0x86, 0xbe, 0x26,
+ 0xc5, 0x59, 0x77, 0x6d, 0x63, 0xc4, 0x3d, 0xc4, 0x63, 0x6e, 0x24, 0xa6,
+ 0x0d, 0xf9, 0x73, 0xd6, 0x40, 0xaf, 0xa3, 0x13, 0xe6, 0x4e, 0x52, 0x02,
+ 0x27, 0x00, 0xf1, 0x9e, 0x4a, 0x32, 0x9b, 0x0e, 0xc7, 0x8d, 0x12, 0x2e,
+ 0x95, 0x2e, 0xff, 0xa6, 0xd4, 0xb0, 0xcc, 0x16, 0xe9, 0xd6, 0xf6, 0x99,
+ 0x13, 0xbf, 0x07, 0x94, 0x5e, 0x8f, 0xa5, 0xc5, 0x34, 0xca, 0x4a, 0x65,
+ 0xb9, 0x4a, 0x5d, 0x0e, 0xd6, 0xf7, 0x08, 0x8f, 0xdb, 0xcb, 0xdd, 0xcf,
+ 0x84, 0xff, 0x17, 0x90, 0xc8, 0xc4, 0x41, 0x06, 0x95, 0x5c, 0x43, 0x80,
+ 0xb6, 0x34, 0xfc, 0xfe, 0x37, 0xb8, 0xba, 0xd9, 0x0e, 0x5b, 0x6c, 0x35,
+ 0xcb, 0xe2, 0xd8, 0x5a, 0x8e, 0xe4, 0x76, 0x98, 0xc2, 0x6d, 0xb1, 0x28,
+ 0xc2, 0xa3, 0x4d, 0xed, 0xed, 0x77, 0x74, 0xe6, 0x15, 0x69, 0x46, 0xe9,
+ 0x87, 0xa7, 0x76, 0x54, 0x16, 0x5f, 0x3e, 0x5b, 0x2b, 0x64, 0xb7, 0xf7,
+ 0x0b, 0xe8, 0x69, 0x3b, 0x05, 0x91, 0x71, 0xea, 0x9b, 0x36, 0xa9, 0x46,
+ 0x19, 0x15, 0xdb, 0x4e, 0x16, 0x04, 0xf0, 0x27, 0x20, 0xf9, 0xca, 0x01,
+ 0x97, 0x6b, 0xe6, 0xe2, 0xb1, 0x74, 0xc6, 0x85, 0x3e, 0x76, 0x33, 0x49,
+ 0x59, 0xbe, 0x42, 0x40, 0x50, 0x38, 0x44, 0x75, 0x9c, 0xad, 0x80, 0xbf,
+ 0x55, 0x0f, 0x1b, 0xac, 0xd6, 0x3d, 0x55, 0x5e, 0xf6, 0x4c, 0x1d, 0x1d,
+ 0xf0, 0xde, 0xa2, 0xb7, 0x4d, 0x28, 0xc7, 0x4a, 0x12, 0xc3, 0x56, 0xb7,
+ 0x15, 0xcf, 0xbf, 0x63, 0x4c, 0x27, 0x9a, 0x6f, 0xdd, 0x20, 0x02, 0x4a,
+ 0x44, 0xbe, 0x90, 0x66, 0xfb, 0x4c, 0x3e, 0x2d, 0x13, 0x2b, 0x5c, 0x11,
+ 0x9e, 0x36, 0x2f, 0x5f, 0xcc, 0xd6, 0xe8, 0x19, 0xbc, 0x36, 0x73, 0x48,
+ 0x98, 0xb4, 0xe2, 0xf0, 0x9b, 0xfd, 0xdd, 0xe6, 0x16, 0x39, 0x9d, 0x95,
+ 0x93, 0x72, 0x7c, 0x37, 0x49, 0xc4, 0x7e, 0xea, 0x50, 0x3d, 0xc6, 0x50,
+ 0xcd, 0x54, 0x32, 0xa7, 0x77, 0xc7, 0x9a, 0x46, 0x9b, 0xb9, 0xf9, 0x75,
+ 0xa7, 0x7c, 0x8f, 0x20, 0xfa, 0xf9, 0x6a, 0xbe, 0x38, 0x55, 0x3f, 0xd7,
+ 0x8e, 0xa8, 0x3c, 0x08, 0x01, 0x7e, 0xa3, 0x4b, 0x0a, 0x93, 0xb1, 0x3d,
+ 0x87, 0xa7, 0xdb, 0x13, 0x9c, 0x7f, 0x93, 0xcd, 0x75, 0x12, 0x31, 0x2c,
+ 0x8e, 0xf1, 0xa8, 0x50, 0xc0, 0xda, 0x14, 0x01, 0x5e, 0x7d, 0x27, 0x3c,
+ 0xa5, 0x9d, 0x24, 0x6a, 0x6e, 0x35, 0x55, 0x38, 0x94, 0x0d, 0xcc, 0x44,
+ 0xf0, 0x4b, 0xb2, 0xe0, 0xab, 0x3b, 0x50, 0xf2, 0x98, 0xb1, 0x4c, 0x43,
+ 0xae, 0x1c, 0x12, 0xe8, 0x6b, 0xb3, 0x4d, 0x5a, 0x50, 0xc1, 0x61, 0x93,
+ 0x19, 0x7c, 0x32, 0xf1, 0x05, 0xf4, 0xe3, 0x02, 0xab, 0x41, 0x48, 0xb0,
+ 0xe8, 0xc4, 0x87, 0xee, 0xd7, 0x5f, 0xe1, 0xca, 0x4d, 0xe2, 0xa7, 0x4c,
+ 0xe3, 0xc7, 0xa5, 0xf9, 0x2c, 0x1b, 0xcb, 0xf2, 0xf1, 0xc8, 0x29, 0xa4,
+ 0xd3, 0xf5, 0x81, 0x3e, 0x2b, 0xe5, 0x9f, 0x95, 0x61, 0x97, 0xfa, 0xd6,
+ 0xe1, 0xe0, 0xd9, 0x9b, 0x00, 0x87, 0x0a, 0x65, 0x35, 0x7f, 0x33, 0x2f,
+ 0x78, 0x20, 0x2d, 0x92, 0x55, 0x34, 0xd5, 0x61, 0x9b, 0x2d, 0x6f, 0x8e,
+ 0xa6, 0xd7, 0x8f, 0x72, 0x64, 0x1f, 0xdf, 0xbe, 0xea, 0x1f, 0x64, 0x7c,
+ 0x4b, 0x06, 0x6e, 0xb3, 0xad, 0xad, 0xbd, 0xed, 0xb4, 0x97, 0x5c, 0xc8,
+ 0xce, 0xaa, 0x36, 0xd7, 0x51, 0xfa, 0x63, 0x99, 0x5e, 0x01, 0x5a, 0x3e,
+ 0x60, 0xaa, 0x74, 0x7b, 0x68, 0xf8, 0x80, 0xdf, 0xfb, 0x71, 0xde, 0xc4,
+ 0x49, 0x73, 0xdf, 0xee, 0xaa, 0xb9, 0x30, 0xa3, 0x8b, 0x46, 0x62, 0x4c,
+ 0xc4, 0x43, 0x04, 0xf9, 0xdf, 0x9d, 0x31, 0xbb, 0xa8, 0xc8, 0x3b, 0xb6,
+ 0xe9, 0x0c, 0x7d, 0x47, 0xa0, 0x41, 0x15, 0x9e, 0x06, 0x45, 0x14, 0xdc,
+ 0x66, 0xfe, 0x4a, 0x07, 0x46, 0xdd, 0x62, 0xd4, 0xfa, 0xa2, 0x46, 0x26,
+ 0x64, 0x5d, 0x1c, 0x9a, 0x39, 0xe6, 0x54, 0xa2, 0xc4, 0x7a, 0xdf, 0x5a,
+ 0x02, 0x74, 0x92, 0xe0, 0x7a, 0x61, 0xc6, 0x58, 0x47, 0xee, 0xa9, 0x25,
+ 0x8b, 0xe5, 0xb5, 0xc1, 0x54, 0x74, 0xd0, 0x5b, 0xfd, 0xac, 0x75, 0x00,
+ 0x3f, 0x46, 0x43, 0x97, 0x55, 0xcd, 0x1e, 0xe2, 0x27, 0x6c, 0xfe, 0x8c,
+ 0xd2, 0xd1, 0x0b, 0xc8, 0x11, 0x4c, 0x25, 0xfd, 0x2e, 0xa6, 0x2e, 0x7f,
+ 0x21, 0xa5, 0xd1, 0x42, 0x74, 0x58, 0x63, 0x71, 0xa6, 0x6f, 0xb4, 0x53,
+ 0x97, 0x70, 0x22, 0xf7, 0x2c, 0x76, 0x0e, 0x94, 0x08, 0x1e, 0xca, 0xdb,
+ 0x48, 0xb4, 0xe6, 0x44, 0x16, 0xf6, 0x04, 0xe0, 0xa5, 0xfb, 0x1a, 0x96,
+ 0xfd, 0xf5, 0xb7, 0x86, 0xd7, 0x87, 0x2d, 0xb1, 0x39, 0xb1, 0x1c, 0x52,
+ 0xf2, 0x91, 0x6b, 0x16, 0xdc, 0xf7, 0xf7, 0x1b, 0xac, 0xa5, 0x80, 0x76,
+ 0xa7, 0x96, 0x75, 0xa7, 0x95, 0xbf, 0xed, 0xa7, 0x20, 0x69, 0xd0, 0xc5,
+ 0xcc, 0x2d, 0xee, 0x31, 0xa5, 0x80, 0x31, 0x6d, 0x04, 0x77, 0x1e, 0xb0,
+ 0xdd, 0x30, 0x09, 0xc9, 0x8b, 0x59, 0x3a, 0x5a, 0x5f, 0x3f, 0xb0, 0x58,
+ 0xdd, 0x64, 0xa1, 0x8b, 0x80, 0x60, 0x8d, 0x28, 0x17, 0xec, 0x0a, 0x9b,
+ 0xad, 0x8f, 0x5f, 0xfc, 0x33, 0x3c, 0x2b, 0x57, 0xed, 0xcf, 0x5a, 0x6f,
+ 0xfe, 0x62, 0x45, 0x5c, 0x80, 0x57, 0x71, 0x58, 0x77, 0x6b, 0x29, 0xa8,
+ 0xd4, 0xd1, 0xdc, 0x15, 0x4a, 0x0e, 0xf6, 0x1b, 0x17, 0xb6, 0xa8, 0x58,
+ 0x89, 0x28, 0x03, 0xac, 0xe4, 0xba, 0x82, 0xb4, 0x37, 0x5e, 0x4f, 0x4f,
+ 0x45, 0xd6, 0x19, 0x2d, 0xe3, 0xc3, 0xde, 0xa0, 0x38, 0xe7, 0x72, 0xb6,
+ 0xb9, 0x36, 0x73, 0x6c, 0x65, 0x9a, 0xb3, 0xa8, 0x0e, 0x1c, 0xf0, 0xf1,
+ 0x96, 0x1a, 0x5b, 0xed, 0x82, 0xad, 0x4f, 0x2c, 0x3e, 0x5d, 0xaf, 0xab,
+ 0x31, 0x5b, 0x15, 0x96, 0x08, 0xb1, 0x64, 0xdb, 0x8e, 0x8f, 0xb7, 0x42,
+ 0x40, 0x93, 0x38, 0x99, 0x78, 0xcd, 0x23, 0xf1, 0x5b, 0xff, 0xad, 0x69,
+ 0x60, 0xce, 0x70, 0xdf, 0x9c, 0x95, 0x53, 0x82, 0x03, 0xf5, 0xdd, 0xd9,
+ 0x22, 0xbe, 0xb8, 0x0b, 0x3f, 0x55, 0x4d, 0x7a, 0x15, 0x88, 0xd4, 0xb1,
+ 0xbf, 0xc7, 0x78, 0x37, 0x62, 0xd0, 0x6d, 0xf4, 0x29, 0xbc, 0xb7, 0x7c,
+ 0xc5, 0x1c, 0x9e, 0xf8, 0xd2, 0x63, 0x47, 0x4e, 0x18, 0x6e, 0x05, 0x51,
+ 0xcc, 0x3f, 0xc8, 0x87, 0xb6, 0x04, 0xa5, 0x84, 0xff, 0xdc, 0xd4, 0x9d,
+ 0x4e, 0x94, 0xf8, 0x9c, 0x97, 0x76, 0xcc, 0xe4, 0xe5, 0xbe, 0x2c, 0xc4,
+ 0x23, 0x3e, 0xce, 0xa3, 0x97, 0x4a, 0x3f, 0xe2, 0x04, 0x3a, 0x44, 0xf9,
+ 0x7c, 0x07, 0x9d, 0x19, 0x4b, 0xad, 0x11, 0xfb, 0x66, 0x6b, 0x1a, 0x93,
+ 0x81, 0xca, 0x8c, 0x36, 0x08, 0x25, 0xb4, 0xb4, 0xe4, 0x03, 0x39, 0x31,
+ 0x74, 0x44, 0x90, 0x6e, 0x1b, 0xc0, 0xed, 0x7f, 0x83, 0xa3, 0x72, 0x48,
+ 0xb8, 0xae, 0x56, 0xfe, 0x19, 0xbc, 0xb0, 0xdb, 0x19, 0x82, 0x95, 0x17,
+ 0x0c, 0x97, 0x50, 0x71, 0x7c, 0xdb, 0x3d, 0xd5, 0x21, 0x57, 0xaa, 0x69,
+ 0x22, 0x75, 0xcc, 0x0c, 0x13, 0x46, 0x0f, 0x2c, 0x96, 0x76, 0xc0, 0x1e,
+ 0xae, 0x03, 0xc4, 0xf8, 0x42, 0xfd, 0x8a, 0xb1, 0xc0, 0x59, 0x6b, 0x91,
+ 0x54, 0xfb, 0xc2, 0x80, 0x0f, 0xaa, 0xcb, 0xc1, 0xea, 0xdb, 0x83, 0x57,
+ 0xe9, 0x51, 0x37, 0xe7, 0x35, 0xdc, 0x17, 0x06, 0x63, 0xdc, 0x6f, 0xf1,
+ 0xc6, 0x3d, 0x9b, 0x7d, 0x40, 0xbe, 0x45, 0x50, 0x19, 0x39, 0x9f, 0xa5,
+ 0x47, 0x3a, 0xfa, 0xde, 0x99, 0xa4, 0xd4, 0x0a, 0x3d, 0x8f, 0x54, 0xa7,
+ 0xe6, 0x59, 0x37, 0x08, 0x2c, 0xda, 0x44, 0x97, 0x35, 0x4e, 0x54, 0x84,
+ 0xff, 0x14, 0xeb, 0x1a, 0x07, 0x45, 0x70, 0x0a, 0x06, 0xc9, 0x24, 0xed,
+ 0x6f, 0x2e, 0x07, 0x57, 0x5b, 0xe8, 0xeb, 0x0f, 0xa9, 0xba, 0x3e, 0x6f,
+ 0x37, 0xef, 0xa5, 0xc4, 0x35, 0x43, 0xb3, 0x19, 0x27, 0xe5, 0x20, 0x78,
+ 0xdc, 0xb6, 0x58, 0x36, 0x17, 0xd8, 0x54, 0x1f, 0xdd, 0x10, 0x61, 0x8c,
+ 0x3c, 0xc9, 0x5d, 0x9c, 0xcc, 0xa4, 0xb8, 0x47, 0x42, 0x71, 0xc7, 0x9d,
+ 0xb9, 0x04, 0x42, 0xb4, 0xa8, 0x68, 0xe0, 0x77, 0xe7, 0x94, 0x4f, 0xab,
+ 0xf3, 0x83, 0x51, 0x0b, 0x61, 0x22, 0x6b, 0x90, 0xc9, 0x0d, 0x0c, 0xd6,
+ 0x4b, 0x84, 0xb4, 0x28, 0x7d, 0x15, 0xc2, 0x60, 0xe2, 0x93, 0xcf, 0x79,
+ 0x26, 0xdd, 0x76, 0x5b, 0x76, 0x32, 0x7d, 0x24, 0x84, 0x54, 0x45, 0x8d,
+ 0xfb, 0x77, 0xc4, 0x29, 0x71, 0x06, 0xa4, 0x0d, 0xce, 0xc5, 0x87, 0xa4,
+ 0x3a, 0x38, 0xfa, 0x4c, 0x9a, 0x09, 0x98, 0xb8, 0x8f, 0x94, 0xa4, 0xe9,
+ 0xc4, 0xb8, 0x26, 0xfe, 0xd9, 0x51, 0x57, 0x09, 0x20, 0x2d, 0x9a, 0xfc,
+ 0xdd, 0x93, 0x1d, 0x4b, 0x07, 0x02, 0x9f, 0x18, 0x9f, 0x43, 0x57, 0x6a,
+ 0x49, 0xe5, 0x9e, 0x56, 0x0c, 0x63, 0x4c, 0x29, 0xd8, 0x0d, 0x2b, 0xf3,
+ 0x80, 0xaa, 0xe0, 0xf2, 0x0b, 0x1b, 0x2e, 0x34, 0xf6, 0xc4, 0x61, 0x7c,
+ 0xf4, 0x5e, 0xf8, 0xea, 0x55, 0xf4, 0xfc, 0x00, 0xa3, 0x45, 0x7c, 0x81,
+ 0x00, 0x21, 0x00, 0x86, 0x00, 0x40, 0x96, 0xf0, 0x01, 0x1b, 0x06, 0x00,
+ 0x49, 0x73, 0xc0, 0x76, 0x6d, 0x74, 0xe2, 0xb4, 0x55, 0x3a, 0xf2, 0xc2,
+ 0x04, 0x9c, 0x97, 0x59, 0xb4, 0xb0, 0xbf, 0x43, 0xbf, 0x4f, 0x77, 0xbb,
+ 0x57, 0xbf, 0xf3, 0xd8, 0xc2, 0x25, 0xaf, 0xf1, 0xf6, 0x9e, 0xb9, 0xf5,
+ 0xc3, 0x09, 0xf3, 0xef, 0x7f, 0xe8, 0xb9, 0xb1, 0xc8, 0x1b, 0x33, 0x61,
+ 0x4c, 0xc3, 0x1a, 0x1b, 0xf5, 0x7e, 0xcf, 0xdb, 0xeb, 0xf8, 0x47, 0x27,
+ 0xd0, 0x9c, 0xfe, 0xdb, 0xcd, 0x87, 0x38, 0x5d, 0x4f, 0x9e, 0x75, 0x7e,
+ 0x2c, 0x00, 0x00, 0x00, 0x01, 0xa0, 0x7f, 0xef, 0x1a, 0x6d, 0xe9, 0x60,
+ 0xf0, 0x29, 0x98, 0x68, 0x36, 0xa6, 0x3b, 0x2c, 0x65, 0xfc, 0xea, 0x42,
+ 0x51, 0x61, 0x1c, 0xed, 0xb7, 0xb9, 0x39, 0x43, 0x70, 0xa1, 0x03, 0x6e,
+ 0x82, 0x6b, 0x80, 0x55, 0x68, 0x5a, 0x3c, 0x49, 0x21, 0xb7, 0x05, 0x0c,
+ 0xe3, 0x74, 0xcd, 0xfa, 0x47, 0xbc, 0x74, 0x51, 0xc3, 0x68, 0x3b, 0xc8,
+ 0xd9, 0x0a, 0x68, 0x37, 0xc6, 0xe2, 0x56, 0xb5, 0x7e, 0x76, 0x49, 0x1e,
+ 0x37, 0x06, 0x58, 0x5a, 0xf4, 0xed, 0x00, 0xbd, 0x38, 0x5e, 0x3b, 0x6f,
+ 0x3c, 0x14, 0x29, 0xa0, 0x42, 0xcd, 0x3f, 0x9f, 0x56, 0x7e, 0x3b, 0xbb,
+ 0xef, 0xcc, 0x16, 0xd3, 0xab, 0xde, 0x0d, 0xd3, 0x61, 0x14, 0xaa, 0x7f,
+ 0x7c, 0x17, 0x64, 0x20, 0x68, 0xfe, 0xc8, 0xbb, 0x8b, 0x02, 0x3b, 0x0f,
+ 0x6d, 0xad, 0x15, 0x3d, 0x72, 0xe3, 0x2b, 0xa6, 0xe7, 0x53, 0x7c, 0x0f,
+ 0x92, 0x34, 0xb2, 0x47, 0xbd, 0x7b, 0xae, 0x9d, 0x38, 0xcc, 0x2e, 0xc9,
+ 0xdb, 0xe5, 0xce, 0xcb, 0x0b, 0x28, 0x0b, 0x76, 0xb9, 0x4e, 0xd9, 0xff,
+ 0x32, 0x9d, 0xf4, 0xe9, 0xc4, 0x01, 0x72, 0x49, 0x6e, 0xfb, 0x55, 0x14,
+ 0x30, 0xba, 0x41, 0xb3, 0xd9, 0x70, 0x4c, 0xe7, 0x4f, 0xf2, 0xa5, 0x10,
+ 0x96, 0x80, 0x20, 0xce, 0x01, 0xbc, 0x0a, 0x97, 0xbe, 0xb8, 0xc6, 0xfb,
+ 0xe8, 0x3e, 0xe1, 0xbd, 0x1a, 0xa2, 0xde, 0x94, 0x35, 0xa4, 0x3b, 0x1d,
+ 0x22, 0x12, 0xd3, 0xaf, 0xeb, 0x93, 0xfa, 0x3f, 0x8a, 0x47, 0x32, 0x91,
+ 0x87, 0x14, 0xde, 0xc6, 0xaa, 0x42, 0x3e, 0x68, 0xe8, 0x57, 0x4a, 0x36,
+ 0xc0, 0xda, 0xeb, 0x76, 0x71, 0x86, 0xaa, 0xfa, 0x5b, 0xf5, 0x85, 0xd7,
+ 0x0b, 0xd5, 0xee, 0xc0, 0x07, 0xf5, 0xbe, 0x1a, 0xc7, 0x4a, 0x87, 0x2b,
+ 0x27, 0x27, 0x9a, 0x42, 0x72, 0x16, 0xc3, 0xe0, 0x07, 0x97, 0x91, 0x06,
+ 0xcf, 0xcc, 0x02, 0xcc, 0x70, 0x6a, 0xbc, 0xb7, 0x8a, 0x4b, 0x20, 0x0c,
+ 0x1b, 0xb3, 0x98, 0xd1, 0xe6, 0x3b, 0x09, 0xcb, 0xa6, 0xb3, 0x40, 0x0b,
+ 0x77, 0xea, 0xb0, 0xcf, 0x54, 0x85, 0xc0, 0x4f, 0xaf, 0x54, 0x76, 0xca,
+ 0x22, 0x6b, 0xeb, 0x94, 0x0d, 0x22, 0x5b, 0x11, 0x61, 0x06, 0x3e, 0xed,
+ 0xcf, 0x6c, 0xc4, 0x0c, 0xf0, 0xda, 0xd6, 0xd0, 0x69, 0xde, 0xc7, 0x1a,
+ 0xbb, 0x76, 0x42, 0x1d, 0x3d, 0x7e, 0x39, 0xc0, 0xe3, 0x42, 0xc2, 0x43,
+ 0x68, 0x31, 0x04, 0xa0, 0x34, 0xec, 0xdd, 0xb4, 0x6b, 0x5e, 0x8d, 0xc2,
+ 0x7f, 0x21, 0x45, 0x4e, 0x14, 0xc2, 0x81, 0xc1, 0x4e, 0x83, 0xa7, 0x79,
+ 0xd7, 0x68, 0x3c, 0xca, 0x57, 0x6e, 0x9a, 0xcd, 0xfe, 0x0e, 0xd2, 0x6f,
+ 0x8a, 0xba, 0x4c, 0x8c, 0xf4, 0x41, 0xaa, 0x71, 0x96, 0x71, 0xca, 0x5f,
+ 0xea, 0xff, 0x69, 0x90, 0xb3, 0x5c, 0xd8, 0xa1, 0x18, 0x05, 0xdb, 0x33,
+ 0x17, 0x9b, 0x89, 0xb1, 0x6f, 0xce, 0x4b, 0x26, 0x6d, 0x19, 0x6f, 0x6a,
+ 0xf7, 0xa0, 0xbe, 0xb4, 0xc0, 0xa3, 0x0b, 0x96, 0x8b, 0x8f, 0x12, 0x97,
+ 0xfc, 0x40, 0x00, 0x00, 0x00, 0xd6, 0x5e, 0x4d, 0x99, 0x80, 0x3a, 0x02,
+ 0x0b, 0x9e, 0x5e, 0xf5, 0xe8, 0x5e, 0x83, 0x37, 0x34, 0x70, 0xc3, 0xc9,
+ 0x26, 0x09, 0x6f, 0x35, 0xd0, 0xcc, 0xc4, 0x2f, 0xce, 0x18, 0xae, 0x63,
+ 0xa9, 0xf1, 0xda, 0xb2, 0xa4, 0xa2, 0xd4, 0xd2, 0x23, 0xe1, 0xbb, 0xe7,
+ 0x21, 0xdb, 0xc3, 0xb8, 0xf4, 0x34, 0x0d, 0x04, 0xe5, 0x7b, 0xbb, 0x62,
+ 0xfe, 0x5e, 0x33, 0xca, 0xf2, 0x24, 0x73, 0xc3, 0x1e, 0x52, 0x42, 0xb1,
+ 0x87, 0xa5, 0x04, 0x67, 0x88, 0x14, 0x96, 0xe3, 0x8e, 0xb1, 0x10, 0x7a,
+ 0xf5, 0x28, 0xc2, 0x44, 0xf8, 0x22, 0x6c, 0x73, 0x09, 0x3a, 0xe2, 0x83,
+ 0xed, 0xd2, 0x4e, 0x0e, 0x34, 0x80, 0x38, 0xe4, 0x0b, 0x6c, 0xcc, 0x73,
+ 0x70, 0x58, 0x4c, 0xd4, 0x9c, 0x75, 0xfa, 0xd9, 0x45, 0x03, 0x71, 0xb2,
+ 0xe9, 0x70, 0xd6, 0xac, 0x67, 0xce, 0x01, 0x85, 0xf6, 0x09, 0xfd, 0x29,
+ 0x9d, 0xb2, 0xb9, 0xdd, 0xfd, 0xac, 0x10, 0x96, 0x6a, 0x73, 0xe2, 0x2a,
+ 0x5a, 0x76, 0x6b, 0xcf, 0x5d, 0x6c, 0x15, 0xb7, 0x86, 0x4e, 0x6a, 0xa9,
+ 0x36, 0x1b, 0xf2, 0x01, 0x26, 0x51, 0x9c, 0x4c, 0x0a, 0x85, 0x8f, 0x96,
+ 0xfc, 0x59, 0x0a, 0xec, 0x88, 0x1e, 0xcc, 0x57, 0x60, 0x0b, 0xfd, 0x15,
+ 0xab, 0x89, 0x50, 0x1f, 0x74, 0x37, 0xb1, 0x07, 0x7e, 0xd4, 0xf6, 0x57,
+ 0x04, 0x5f, 0xea, 0xc0, 0x9e, 0x63, 0x9d, 0xe4, 0xea, 0x49, 0xc9, 0xfa,
+ 0xca, 0xd3, 0x7c, 0xb9, 0x8e, 0xfa, 0x96, 0xbc, 0x10, 0x0b, 0x03, 0x84,
+ 0x38, 0x22, 0x0b, 0x80, 0x00, 0x00, 0x00, 0x63, 0x60, 0xd8, 0x8b, 0x8d,
+ 0x27, 0xa1, 0xbd, 0x83, 0xcf, 0x24, 0xff, 0x3b, 0xef, 0x20, 0x60, 0x48,
+ 0xf4, 0x50, 0x91, 0xe8, 0x1f, 0xde, 0x67, 0x18, 0xaa, 0x75, 0xa0, 0xdc,
+ 0x22, 0x15, 0x13, 0x07, 0xca, 0x9b, 0xc4, 0xc5, 0x7e, 0x95, 0xf0, 0xf4,
+ 0x6a, 0x03, 0x06, 0x08, 0x39, 0x23, 0xa8, 0xee, 0xca, 0x1f, 0x93, 0x3b,
+ 0xde, 0x1e, 0xb2, 0xc2, 0x8d, 0xa1, 0xd7, 0x09, 0x29, 0x15, 0x7b, 0x72,
+ 0x8d, 0x83, 0x9d, 0xd9, 0xd7, 0xee, 0x18, 0x57, 0x86, 0x13, 0x42, 0xa9,
+ 0x9a, 0xb6, 0x89, 0x57, 0x97, 0x3a, 0xba, 0x85, 0xb2, 0xa6, 0x65, 0xb9,
+ 0x9c, 0x39, 0x9b, 0x37, 0xd6, 0x46, 0xb9, 0x98, 0x59, 0xc6, 0x00, 0x7f,
+ 0x8f, 0x2f, 0xff, 0xc0, 0xa4, 0xb8, 0xbf, 0x11, 0xc3, 0xa6, 0x48, 0xab,
+ 0x86, 0x74, 0x98, 0x9f, 0xf5, 0x0b, 0x46, 0x73, 0xf1, 0x49, 0x69, 0xbb,
+ 0x25, 0x4f, 0xe4, 0xd3, 0xae, 0x3c, 0x10, 0xaa, 0xf1, 0x33, 0x27, 0x6d,
+ 0x41, 0x74, 0xaa, 0x67, 0xbb, 0x19, 0x78, 0xf6, 0x8c, 0xa6, 0xe1, 0x1a,
+ 0xf5, 0xb3, 0x3c, 0x69, 0x27, 0x25, 0x04, 0x35, 0xe0, 0x41, 0xff, 0xb2,
+ 0xdd, 0xb4, 0xf5, 0xcb, 0x47, 0xfd, 0x01, 0xea, 0x95, 0x40, 0x64, 0xaf,
+ 0x41, 0x52, 0xda, 0x34, 0xee, 0xc9, 0x2f, 0x14, 0x3f, 0x9c, 0xca, 0x9b,
+ 0xa1, 0x50, 0x7a, 0xac, 0x4c, 0xd7, 0x93, 0xcf, 0xf2, 0x42, 0xb2, 0x73,
+ 0xca, 0xe3, 0xf3, 0xd7, 0x17, 0xb5, 0xbb, 0x68, 0xb2, 0xc1, 0xe6, 0x51,
+ 0x06, 0xdc, 0xbf, 0x33, 0xa7, 0x47, 0x7c, 0x3c, 0x38, 0x61, 0x06, 0x2f,
+ 0x65, 0xb5, 0x18, 0xbb, 0xbb, 0x48, 0x86, 0x12, 0x99, 0x7b, 0x09, 0x68,
+ 0x55, 0xf4, 0x23, 0xbb, 0xba, 0x34, 0xa5, 0x81, 0x24, 0x8b, 0x21, 0x2c,
+ 0x2c, 0xb3, 0x13, 0xbc, 0xfb, 0x1e, 0x99, 0x10, 0xd3, 0xad, 0x0f, 0x84,
+ 0xa5, 0x45, 0xda, 0x91, 0x74, 0xbb, 0x5d, 0xcc, 0x6c, 0xa3, 0x60, 0xec,
+ 0x26, 0xcf, 0x86, 0xa1, 0x96, 0xf1, 0xe1, 0x06, 0x7d, 0x15, 0x92, 0x5d,
+ 0x70, 0xed, 0x7b, 0xb6, 0x0b, 0x62, 0xa0, 0xca, 0x98, 0x95, 0xa8, 0xff,
+ 0x14, 0xab, 0x1c, 0x35, 0x65, 0xed, 0x3c, 0x11, 0x9f, 0xb6, 0x1e, 0x41,
+ 0x55, 0xe2, 0x93, 0x1f, 0x97, 0x93, 0x75, 0x91, 0x93, 0x20, 0x19, 0x76,
+ 0xef, 0x52, 0x92, 0xa7, 0x39, 0xd9, 0x74, 0xb7, 0xef, 0x3a, 0x1d, 0xef,
+ 0x77, 0x37, 0x9a, 0x7f, 0x8d, 0xdb, 0xb3, 0xb9, 0x67, 0x89, 0xfc, 0x7d,
+ 0x1b, 0x9b, 0xa9, 0x0e, 0x45, 0x58, 0x35, 0x48, 0x79, 0x45, 0x6d, 0x3e,
+ 0x5a, 0x13, 0x80, 0xf6, 0x72, 0x3b, 0xf4, 0xbb, 0x0a, 0xaa, 0x62, 0xdd,
+ 0x55, 0x4e, 0x68, 0x80, 0xee, 0xb2, 0x8f, 0x8d, 0x2c, 0xb3, 0x9d, 0x5e,
+ 0x17, 0x80, 0x3b, 0x27, 0x2b, 0x33, 0x97, 0x96, 0x4f, 0xb1, 0x7b, 0xc9,
+ 0x63, 0xce, 0x65, 0xf4, 0x66, 0x0e, 0x51, 0x67, 0xaf, 0xc5, 0x3f, 0x17,
+ 0xdb, 0xe2, 0x44, 0x81, 0x2d, 0x41, 0x43, 0xd0, 0x75, 0xd7, 0x37, 0xef,
+ 0x65, 0x49, 0x80, 0x8b, 0x70, 0xff, 0xa5, 0x40, 0x3b, 0x72, 0x09, 0xa3,
+ 0x10, 0xc7, 0x1e, 0x08, 0xd0, 0x50, 0x5c, 0x33, 0xee, 0x08, 0x2c, 0x0c,
+ 0x18, 0x71, 0x37, 0xdf, 0xa3, 0x19, 0x3e, 0xc5, 0x3f, 0x47, 0xe0, 0x64,
+ 0xdf, 0x15, 0x0e, 0x37, 0xa8, 0xbd, 0xf2, 0x6f, 0xec, 0x56, 0xa5, 0x41,
+ 0x41, 0xff, 0xf8, 0xea, 0xba, 0x52, 0xf3, 0xc3, 0x05, 0x90, 0x06, 0x07,
+ 0x01, 0x58, 0xef, 0x58, 0xb1, 0xac, 0xc3, 0x33, 0x87, 0xa4, 0x5b, 0xfd,
+ 0xe3, 0xf3, 0x71, 0x5f, 0x3b, 0xcc, 0xb7, 0x92, 0xa8, 0x60, 0x30, 0x02,
+ 0xa0, 0x5b, 0xc4, 0x79, 0xfc, 0x2f, 0xb6, 0x83, 0x4a, 0xae, 0x54, 0xfe,
+ 0x7c, 0x57, 0x42, 0xd9, 0x37, 0xf4, 0xca, 0x65, 0x80, 0xd1, 0x3c, 0x01,
+ 0x37, 0xd3, 0x33, 0xd8, 0x03, 0x21, 0x83, 0x42, 0x63, 0x85, 0x52, 0x91,
+ 0xb2, 0x02, 0x58, 0x22, 0x10, 0x07, 0xa0, 0xda, 0x40, 0x68, 0xf4, 0x0a,
+ 0x94, 0x4c, 0x57, 0x55, 0x9c, 0x2b, 0xc6, 0xef, 0xf7, 0xe9, 0xa1, 0x70,
+ 0xba, 0x5a, 0x2a, 0xaa, 0xe5, 0xc6, 0x52, 0xd3, 0x32, 0xa9, 0xad, 0x48,
+ 0xf5, 0xe3, 0x96, 0x09, 0x12, 0xbd, 0xc0, 0xc9, 0x63, 0xa5, 0x3b, 0x98,
+ 0x07, 0x6f, 0x1e, 0x5d, 0x58, 0x61, 0x5a, 0xbc, 0x54, 0x9e, 0x1a, 0xf0,
+ 0xe0, 0xe7, 0x33, 0xc9, 0x0a, 0x13, 0x48, 0x7d, 0x1e, 0x9b, 0xe8, 0x4d,
+ 0x99, 0x70, 0xaf, 0x59, 0x1b, 0x7e, 0x20, 0x72, 0x53, 0x68, 0x07, 0xac,
+ 0x1e, 0x10, 0x52, 0x71, 0xd6, 0x16, 0x10, 0x6e, 0x4f, 0x73, 0xea, 0x42,
+ 0x66, 0xa8, 0x8b, 0xcf, 0x9c, 0x5d, 0xc7, 0x7b, 0x9f, 0xe2, 0x61, 0x3a,
+ 0x04, 0xdc, 0x57, 0xe7, 0x1a, 0x4a, 0xee, 0x26, 0x4b, 0x83, 0xbd, 0x63,
+ 0xe8, 0xc1, 0xa1, 0xcc, 0x28, 0x68, 0x8e, 0x64, 0xae, 0xaf, 0x5a, 0x6c,
+ 0x61, 0x55, 0xde, 0x4b, 0x33, 0xf8, 0x4a, 0xb1, 0x91, 0x5f, 0x00, 0xa3,
+ 0x49, 0xcf, 0x81, 0x00, 0x43, 0x00, 0x86, 0x00, 0x40, 0x96, 0xf0, 0x01,
+ 0x1b, 0x06, 0x00, 0x39, 0x76, 0x86, 0x6b, 0xa3, 0x0d, 0xbd, 0xd1, 0xea,
+ 0xb1, 0x15, 0xd3, 0x8c, 0x45, 0xdf, 0x4b, 0x25, 0x63, 0x2e, 0x8c, 0x78,
+ 0xff, 0xa3, 0x0d, 0x06, 0xf5, 0xdc, 0x1f, 0x8b, 0xf1, 0xfc, 0x3f, 0x4f,
+ 0x69, 0xaf, 0x4e, 0xef, 0x7f, 0x99, 0xd5, 0x3d, 0x2d, 0xc7, 0x1e, 0x6e,
+ 0xd9, 0xd8, 0xf4, 0xd7, 0x60, 0xeb, 0x2a, 0xf7, 0xf1, 0xaf, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0xa5, 0x73, 0x48, 0x16, 0xe6, 0xb4, 0xd1, 0xf1,
+ 0x65, 0x57, 0xc6, 0x3f, 0xef, 0x7e, 0x82, 0x70, 0x20, 0x11, 0x60, 0xcf,
+ 0xa3, 0x5b, 0x19, 0x4a, 0x9c, 0x7a, 0xd7, 0xe4, 0x5f, 0xf3, 0x00, 0xaf,
+ 0x44, 0xf0, 0xf4, 0xb7, 0xfb, 0x24, 0x4d, 0x0e, 0x48, 0xbf, 0x3d, 0xb8,
+ 0xa9, 0x8f, 0xe6, 0x22, 0xa4, 0xba, 0xad, 0xdb, 0xde, 0x1b, 0x2f, 0x3e,
+ 0x83, 0x10, 0xea, 0x7c, 0x38, 0xbb, 0xa8, 0x81, 0xbf, 0x07, 0xe3, 0x35,
+ 0x80, 0x04, 0xa4, 0xee, 0xa5, 0x58, 0x04, 0x1f, 0x33, 0x4c, 0x40, 0x36,
+ 0xd3, 0x2b, 0x77, 0x2e, 0xc0, 0x04, 0x52, 0xcf, 0x85, 0x27, 0xfc, 0x38,
+ 0xda, 0x58, 0x2d, 0x85, 0x70, 0xe6, 0xb7, 0x33, 0xb6, 0x29, 0xd8, 0xbc,
+ 0x50, 0xce, 0x3b, 0xe3, 0xa4, 0x04, 0x94, 0xca, 0x9f, 0xce, 0x40, 0x34,
+ 0x00, 0x8e, 0x86, 0x94, 0xf4, 0xea, 0x01, 0xf6, 0xdb, 0x72, 0x17, 0x08,
+ 0x5f, 0x02, 0x3e, 0x88, 0xd3, 0x89, 0xe4, 0x7d, 0xfa, 0x9a, 0x6f, 0x68,
+ 0xb0, 0x9d, 0xce, 0x55, 0xab, 0xe1, 0x66, 0x1e, 0x6f, 0x02, 0xc4, 0xb6,
+ 0x7c, 0x5b, 0x81, 0xf5, 0x62, 0xb8, 0x62, 0xe5, 0x03, 0xff, 0xbf, 0x1f,
+ 0xa4, 0xd6, 0x0d, 0x5e, 0xed, 0xc4, 0xe9, 0xe8, 0x14, 0x4a, 0x34, 0x7f,
+ 0xbf, 0x33, 0x71, 0x9e, 0x05, 0x9a, 0xb9, 0x0a, 0x9e, 0x63, 0xa4, 0xb7,
+ 0xae, 0xde, 0x01, 0xc0, 0x54, 0xfa, 0x21, 0x1f, 0xde, 0x09, 0x96, 0x05,
+ 0xc1, 0xc3, 0xaa, 0x73, 0xb2, 0x21, 0xf1, 0xc1, 0x36, 0x21, 0x8e, 0x41,
+ 0xb7, 0xc7, 0xe9, 0x40, 0x78, 0xde, 0xcf, 0xa6, 0x01, 0x1b, 0xed, 0xbf,
+ 0x47, 0xc9, 0xef, 0x61, 0x6c, 0x12, 0x1d, 0xb5, 0x03, 0x94, 0x5e, 0x6f,
+ 0xcc, 0x27, 0x73, 0xc0, 0x0b, 0xe5, 0x40, 0xf8, 0x06, 0xf1, 0x21, 0xba,
+ 0x31, 0x9c, 0xab, 0xd8, 0x43, 0x60, 0x27, 0x34, 0x57, 0xc4, 0x55, 0x7c,
+ 0xaf, 0x04, 0x18, 0xf4, 0xb5, 0xf7, 0x93, 0x43, 0xc7, 0x0a, 0x17, 0x8c,
+ 0x95, 0xe2, 0xec, 0x74, 0xc4, 0x93, 0x39, 0x64, 0xe9, 0x21, 0xfa, 0xcf,
+ 0x82, 0xc9, 0xcf, 0xe4, 0x2c, 0x56, 0x76, 0xe5, 0x02, 0x87, 0xf5, 0x79,
+ 0x95, 0xb6, 0x4d, 0xbb, 0xa9, 0xd4, 0x66, 0x94, 0x36, 0x05, 0x55, 0x59,
+ 0xb5, 0x0d, 0xf5, 0x20, 0xa5, 0xfc, 0x68, 0x5c, 0xb7, 0x3d, 0xf1, 0xf1,
+ 0x0f, 0x7f, 0x7f, 0x8d, 0x8b, 0xec, 0x34, 0xfa, 0xd8, 0x7e, 0xb9, 0x9a,
+ 0x91, 0xed, 0xe7, 0x9d, 0x6c, 0x62, 0xd3, 0xfd, 0x38, 0x6c, 0x14, 0x58,
+ 0xf4, 0x03, 0x01, 0xd5, 0x0a, 0x02, 0x19, 0x9d, 0x85, 0x69, 0x40, 0xa0,
+ 0x33, 0x24, 0x94, 0xde, 0x96, 0xc9, 0xfa, 0x0c, 0xc8, 0x28, 0xd7, 0x85,
+ 0xfa, 0x64, 0x97, 0x12, 0x2b, 0x95, 0x6a, 0x2f, 0x63, 0xc3, 0x50, 0x40,
+ 0x2f, 0x43, 0x61, 0x26, 0x82, 0x21, 0x5e, 0x1b, 0x53, 0x55, 0x9a, 0x15,
+ 0x8d, 0xad, 0x66, 0x7b, 0x99, 0x9b, 0x8a, 0x86, 0x75, 0xc6, 0xa8, 0xad,
+ 0x6c, 0x13, 0xfc, 0x8c, 0x86, 0xf3, 0x7a, 0x09, 0x93, 0xc4, 0x4a, 0x57,
+ 0x9f, 0x92, 0x0a, 0x1b, 0x0d, 0xd2, 0xde, 0x5d, 0xa1, 0x14, 0xc8, 0x01,
+ 0x86, 0x4f, 0x3e, 0xa3, 0xcf, 0x8b, 0xaf, 0x04, 0xee, 0x71, 0xa5, 0x0e,
+ 0xc5, 0x3d, 0xc7, 0xfd, 0xca, 0x5a, 0x27, 0xd1, 0x3a, 0x3e, 0xb5, 0x13,
+ 0x1c, 0xf5, 0x20, 0x91, 0xbe, 0x5f, 0x62, 0x04, 0xb3, 0x14, 0xb4, 0x03,
+ 0x82, 0x41, 0xab, 0x20, 0x11, 0xfc, 0xc9, 0xd1, 0x08, 0x33, 0xe1, 0x83,
+ 0xe8, 0xf7, 0x31, 0x7f, 0x89, 0x61, 0x13, 0xae, 0xce, 0x0e, 0x3e, 0xec,
+ 0x97, 0xe4, 0x76, 0xc3, 0x37, 0x8d, 0xac, 0xca, 0xfe, 0xd5, 0x27, 0xa0,
+ 0xbf, 0x9a, 0x31, 0x20, 0x09, 0x6f, 0xcf, 0x81, 0x69, 0xf9, 0x85, 0xb0,
+ 0x88, 0x80, 0x45, 0xed, 0x65, 0x1d, 0xc7, 0xc8, 0xd9, 0x87, 0x3a, 0x3b,
+ 0x58, 0x79, 0xbc, 0x8d, 0x23, 0xbe, 0xdc, 0x4c, 0x31, 0xed, 0x20, 0x8d,
+ 0xf7, 0x64, 0x7e, 0x8a, 0xbd, 0x0e, 0xdd, 0x19, 0x11, 0x64, 0xa9, 0x91,
+ 0x60, 0x92, 0xda, 0xb5, 0xfc, 0x3f, 0x32, 0x32, 0x23, 0xa6, 0x93, 0xd8,
+ 0x34, 0xd7, 0x56, 0xd6, 0xea, 0x1a, 0x00, 0x0b, 0xf3, 0x52, 0xbf, 0x99,
+ 0x0a, 0x88, 0x60, 0x9d, 0x3d, 0x42, 0x9d, 0xd5, 0xde, 0x5b, 0x17, 0x24,
+ 0x3b, 0xff, 0x26, 0xc2, 0x85, 0x4f, 0x90, 0x33, 0x4a, 0x80, 0xee, 0x2d,
+ 0xff, 0xf0, 0xb6, 0x7c, 0x24, 0x48, 0x74, 0x6d, 0x48, 0x6a, 0x27, 0x46,
+ 0x87, 0x9d, 0x56, 0x69, 0xa1, 0xf4, 0x7e, 0x77, 0xb0, 0x96, 0x5f, 0x52,
+ 0x95, 0x1f, 0xe8, 0x71, 0x53, 0x65, 0xe8, 0x2d, 0x45, 0x7d, 0x52, 0x95,
+ 0xa8, 0x4b, 0xc8, 0x94, 0x6c, 0x76, 0x7d, 0x72, 0xba, 0x7f, 0xc3, 0x16,
+ 0xe6, 0x68, 0xc3, 0xe9, 0xea, 0xac, 0xf6, 0x17, 0xbc, 0xd9, 0x75, 0x9c,
+ 0x39, 0x4c, 0x5f, 0x91, 0x86, 0xe5, 0x60, 0x93, 0x9f, 0xbd, 0xad, 0x97,
+ 0x64, 0x60, 0x16, 0x61, 0x03, 0xab, 0xf9, 0x93, 0x7b, 0xf0, 0x24, 0xbd,
+ 0x52, 0x8f, 0xab, 0xd9, 0x7d, 0x12, 0x11, 0x1b, 0xb1, 0x13, 0x51, 0x18,
+ 0x1a, 0x92, 0xff, 0x48, 0xa0, 0xaa, 0x46, 0xbf, 0xc2, 0xef, 0xf1, 0x8a,
+ 0xab, 0x61, 0x9d, 0xe1, 0xaf, 0x05, 0x68, 0xee, 0xec, 0xab, 0x5d, 0x7f,
+ 0x19, 0x50, 0x73, 0xeb, 0x54, 0x8a, 0x68, 0xf9, 0xe3, 0x50, 0xa9, 0x26,
+ 0xc0, 0xe3, 0x11, 0xe8, 0x2a, 0x09, 0xca, 0x5f, 0x07, 0xda, 0xcb, 0xca,
+ 0x3c, 0x56, 0xb0, 0xb2, 0xb3, 0x76, 0xef, 0x5a, 0x2d, 0xdd, 0xaf, 0x1d,
+ 0x1a, 0x9f, 0xd1, 0xdc, 0x80, 0x77, 0x15, 0x51, 0xa5, 0x07, 0x85, 0x75,
+ 0x08, 0xe8, 0xac, 0x79, 0xc0, 0xaa, 0x2d, 0x1c, 0x5b, 0x0f, 0x92, 0x27,
+ 0xf1, 0x1f, 0xed, 0xcb, 0xe9, 0xf2, 0xfa, 0x1c, 0xa4, 0xb2, 0x5d, 0xc4,
+ 0x4f, 0x74, 0xe8, 0x6b, 0x19, 0xcf, 0xed, 0x4b, 0xfc, 0xf4, 0x5f, 0xb4,
+ 0x82, 0x68, 0x9b, 0xbf, 0xa4, 0x3e, 0x26, 0x25, 0x51, 0x0d, 0x0d, 0xbc,
+ 0xfd, 0x05, 0x79, 0xe6, 0x40, 0x40, 0x17, 0x2a, 0x86, 0x85, 0x98, 0x27,
+ 0x8d, 0xae, 0xbb, 0xf1, 0x0c, 0x87, 0x9d, 0x33, 0x40, 0xfb, 0xff, 0x83,
+ 0x7a, 0x75, 0x9f, 0x2d, 0x36, 0x6d, 0x23, 0x53, 0xbc, 0x6c, 0xbb, 0x89,
+ 0x3a, 0x37, 0x26, 0x3d, 0xf5, 0xa7, 0xaf, 0xcb, 0x19, 0x8f, 0x16, 0x98,
+ 0xde, 0x1e, 0x78, 0x6d, 0x88, 0x82, 0x01, 0x2c, 0x71, 0xba, 0x50, 0xad,
+ 0x44, 0x1e, 0x35, 0x43, 0x8c, 0x97, 0x95, 0xd6, 0x0d, 0x6b, 0x09, 0xb0,
+ 0xa2, 0xdd, 0xae, 0x16, 0xb0, 0x5c, 0xe7, 0xba, 0x78, 0xe7, 0xf9, 0x2c,
+ 0x6e, 0x07, 0x4a, 0xbf, 0xbc, 0xe8, 0xcf, 0x5d, 0xc1, 0x20, 0x92, 0xd7,
+ 0x5c, 0x0d, 0x30, 0x04, 0x40, 0x4e, 0xd0, 0x41, 0x39, 0x4b, 0x60, 0x65,
+ 0x67, 0x71, 0x4e, 0x04, 0x94, 0x18, 0x99, 0xf3, 0x06, 0x72, 0xb6, 0xb8,
+ 0x6f, 0xa0, 0x00, 0x00, 0x01, 0x05, 0x7f, 0xc9, 0x47, 0x3d, 0x5b, 0xf8,
+ 0x17, 0x4c, 0x12, 0x41, 0x5e, 0x5d, 0x1a, 0xec, 0x4c, 0x8d, 0xbd, 0x17,
+ 0x62, 0xd2, 0xc0, 0xdf, 0xf0, 0x9c, 0xfe, 0x15, 0x66, 0xdc, 0xee, 0x5f,
+ 0x85, 0x1e, 0xf2, 0x4f, 0x19, 0xc3, 0x4e, 0xcf, 0x7d, 0xed, 0x3d, 0xe1,
+ 0xe4, 0x24, 0x55, 0xc3, 0xd3, 0xa7, 0x4e, 0xc8, 0x60, 0x91, 0x51, 0x10,
+ 0x1e, 0x20, 0x8d, 0x16, 0xc0, 0x4f, 0x0b, 0x7d, 0x99, 0xeb, 0x79, 0x20,
+ 0x9d, 0xf8, 0x54, 0xd9, 0x81, 0xbe, 0x6e, 0x78, 0xfc, 0xa9, 0x62, 0xcc,
+ 0x92, 0xc2, 0x69, 0x11, 0x3f, 0x7a, 0xfd, 0x68, 0x01, 0x71, 0x59, 0xa9,
+ 0xf3, 0x19, 0x81, 0x7d, 0x57, 0x4b, 0x9a, 0x2b, 0x52, 0x5e, 0x72, 0x04,
+ 0x46, 0x50, 0x42, 0x4f, 0x0e, 0x9f, 0xfc, 0x45, 0x77, 0x30, 0xa3, 0x6a,
+ 0x0b, 0x0b, 0xc3, 0xec, 0x81, 0x65, 0xa2, 0xfe, 0x24, 0x2f, 0x6a, 0x6f,
+ 0xc6, 0xbb, 0x28, 0x4b, 0x01, 0x16, 0x71, 0x9a, 0x1c, 0x45, 0x4b, 0x50,
+ 0x97, 0x45, 0x37, 0x76, 0x50, 0x7d, 0x6b, 0x82, 0x70, 0xbe, 0x77, 0x7a,
+ 0x71, 0x10, 0x6a, 0xfc, 0x4c, 0xf4, 0x7f, 0xfe, 0x97, 0x8b, 0x8c, 0x7e,
+ 0x6e, 0x58, 0x07, 0x25, 0xe1, 0xae, 0x9e, 0x8b, 0x18, 0x91, 0x16, 0x27,
+ 0x0c, 0x90, 0x55, 0xeb, 0x12, 0x5b, 0x01, 0x27, 0x07, 0xdb, 0xf0, 0xf4,
+ 0x3b, 0x8b, 0x9b, 0xce, 0x96, 0x2d, 0x08, 0xd6, 0x69, 0xcc, 0x1d, 0xaa,
+ 0x88, 0xc7, 0x07, 0x56, 0x6f, 0x6f, 0xd5, 0xa9, 0xa0, 0x82, 0x51, 0x53,
+ 0x28, 0x10, 0xb5, 0x61, 0x85, 0xd2, 0x4c, 0x99, 0x9f, 0xe5, 0xfa, 0xe8,
+ 0x1e, 0x2a, 0x06, 0xa9, 0x88, 0xfe, 0x5d, 0xe0, 0x0f, 0xce, 0xe1, 0xd5,
+ 0x37, 0x16, 0x30, 0xd8, 0x3b, 0x86, 0x25, 0x0a, 0x3c, 0xc0, 0x94, 0x83,
+ 0xab, 0xf9, 0x06, 0x5c, 0x29, 0xcc, 0x59, 0x33, 0x05, 0x8e, 0x59, 0x53,
+ 0x53, 0x8d, 0x26, 0x00, 0x00, 0x00, 0x84, 0x7f, 0x79, 0xae, 0x34, 0xd1,
+ 0x76, 0x9f, 0xa0, 0x36, 0x80, 0xf7, 0xb2, 0x30, 0x51, 0x02, 0xf2, 0x0f,
+ 0xc6, 0x05, 0xad, 0x85, 0x6e, 0x4a, 0x43, 0x53, 0xcf, 0xa8, 0x89, 0xa2,
+ 0x90, 0xd4, 0x64, 0x11, 0xfa, 0xe6, 0x0b, 0x08, 0x3a, 0x6c, 0x9c, 0xfc,
+ 0xf7, 0xe8, 0xc2, 0x53, 0xa1, 0x5b, 0x21, 0x51, 0x22, 0x3e, 0xd7, 0x7b,
+ 0xcf, 0x9f, 0x23, 0x2f, 0x59, 0xa6, 0xdb, 0x99, 0x8a, 0x9b, 0x66, 0xb7,
+ 0x1e, 0x86, 0xaf, 0x91, 0xd8, 0x06, 0x1c, 0xd8, 0xe8, 0x20, 0x91, 0x35,
+ 0xcd, 0x07, 0xf5, 0x94, 0x53, 0x20, 0xfe, 0x3c, 0xfd, 0x52, 0x30, 0x4f,
+ 0x77, 0xf6, 0x14, 0x1d, 0x7b, 0x58, 0xee, 0x7a, 0x45, 0xfa, 0xb9, 0xf8,
+ 0xab, 0xbf, 0x81, 0x5e, 0xaa, 0xeb, 0x01, 0x78, 0x59, 0xf6, 0xd3, 0x57,
+ 0x19, 0x8e, 0x3c, 0x68, 0x03, 0xf8, 0x86, 0xd9, 0x8b, 0x0d, 0xbd, 0x59,
+ 0xa5, 0x52, 0x62, 0xc2, 0x86, 0xc8, 0x00, 0x7e, 0x96, 0xfb, 0x17, 0x7e,
+ 0xaa, 0x21, 0xc0, 0x42, 0x7d, 0x2d, 0xb3, 0xd1, 0xc4, 0x10, 0xa2, 0x01,
+ 0x8b, 0xd5, 0xa2, 0x26, 0x38, 0x4d, 0xcc, 0xb6, 0x5c, 0xc4, 0x05, 0xbb,
+ 0xab, 0xf9, 0x36, 0x56, 0x79, 0xad, 0x0f, 0xa1, 0xcd, 0x95, 0xfe, 0x79,
+ 0xf4, 0x35, 0x27, 0x66, 0x06, 0x7b, 0x6b, 0xa1, 0xae, 0x75, 0x8e, 0xf4,
+ 0xd7, 0x38, 0x68, 0x20, 0x68, 0x20, 0x7e, 0xcf, 0x8a, 0x96, 0x34, 0x32,
+ 0xac, 0x3d, 0xc7, 0xd0, 0xdc, 0xa1, 0xa7, 0x12, 0x88, 0x93, 0xbc, 0xae,
+ 0xa1, 0x2e, 0xcf, 0x0b, 0xf6, 0x4f, 0x7f, 0x93, 0x2a, 0x62, 0x7c, 0x55,
+ 0xd0, 0xb2, 0x80, 0x98, 0xb0, 0x96, 0xf7, 0x09, 0x15, 0x5d, 0x8b, 0x4c,
+ 0x74, 0x6e, 0xd6, 0x9a, 0x9d, 0x24, 0x32, 0x17, 0x46, 0xc8, 0x9f, 0xaa,
+ 0x85, 0x57, 0x0e, 0xb7, 0xee, 0x54, 0x46, 0x6b, 0x8e, 0xf5, 0xf5, 0xe5,
+ 0xae, 0xe6, 0xad, 0x3b, 0x7c, 0xbb, 0x42, 0x50, 0x73, 0x8a, 0x85, 0xc2,
+ 0xdb, 0xc4, 0x94, 0x34, 0x86, 0x80, 0xc3, 0x72, 0x58, 0x56, 0xb3, 0xe8,
+ 0x11, 0xc5, 0xbb, 0x24, 0x5b, 0xd9, 0x71, 0x0e, 0xe1, 0x4d, 0xf2, 0xbf,
+ 0x31, 0xe1, 0x03, 0x20, 0x64, 0xe7, 0x9f, 0x16, 0xda, 0xd3, 0x42, 0xfb,
+ 0x60, 0x92, 0xfe, 0xe2, 0x71, 0xdc, 0x17, 0xa2, 0x96, 0x2e, 0xeb, 0x2e,
+ 0x73, 0xfe, 0x33, 0x30, 0xc4, 0xcc, 0x0f, 0x6d, 0x70, 0xab, 0x8a, 0x08,
+ 0x82, 0x33, 0x9f, 0x54, 0x6f, 0x4a, 0xa4, 0x7c, 0x8b, 0xfd, 0xd7, 0x05,
+ 0xd5, 0x10, 0x44, 0x58, 0xe7, 0xb6, 0xb6, 0xdb, 0x6f, 0xe8, 0x07, 0x6d,
+ 0xfe, 0x0b, 0xd2, 0xd9, 0x43, 0x6c, 0x2a, 0x87, 0xc8, 0xaf, 0x57, 0x3b,
+ 0xde, 0x36, 0xa2, 0xdb, 0xc0, 0x1b, 0x72, 0xe8, 0x56, 0x69, 0x51, 0xbb,
+ 0x46, 0xc6, 0x05, 0x3e, 0xa2, 0xb3, 0xef, 0xbe, 0xa3, 0x0c, 0x09, 0x46,
+ 0x16, 0xbb, 0xb5, 0x51, 0x47, 0x31, 0x47, 0x79, 0xa6, 0x52, 0xc9, 0x4d,
+ 0x07, 0x5a, 0x57, 0x32, 0xac, 0xc8, 0x2f, 0xaf, 0x5f, 0xf4, 0x67, 0x40,
+ 0x20, 0xb6, 0x92, 0xe1, 0x42, 0x5a, 0x19, 0x8a, 0x14, 0x39, 0x7a, 0x11,
+ 0xbb, 0x19, 0xd3, 0xd6, 0x37, 0xec, 0x6a, 0xae, 0x87, 0x5a, 0xd1, 0x46,
+ 0x86, 0x66, 0x12, 0x70, 0x70, 0x0a, 0x69, 0x33, 0xeb, 0x41, 0xcf, 0x4c,
+ 0x7c, 0x8c, 0xa1, 0x04, 0xfd, 0x46, 0x18, 0x18, 0x89, 0xb2, 0x97, 0x17,
+ 0x22, 0x34, 0x4d, 0xba, 0x82, 0xd3, 0xab, 0x06, 0x67, 0x83, 0x78, 0xbf,
+ 0x52, 0x33, 0xea, 0x41, 0xb7, 0x78, 0x6a, 0x55, 0x06, 0x85, 0xc5, 0x71,
+ 0x68, 0x8b, 0x7f, 0xfe, 0x9d, 0x8e, 0x96, 0x56, 0x93, 0x2f, 0xe9, 0x07,
+ 0xfe, 0x99, 0xa6, 0xec, 0x6e, 0xdd, 0xbf, 0x0a, 0x1d, 0x4d, 0x91, 0xdb,
+ 0xf8, 0xbe, 0x89, 0xce, 0x31, 0x28, 0xc2, 0xca, 0xae, 0xa1, 0xac, 0x74,
+ 0x18, 0xae, 0xe4, 0x22, 0x38, 0x5c, 0x23, 0x9f, 0xa9, 0x4e, 0xd9, 0x8e,
+ 0xff, 0x58, 0xa0, 0xb0, 0xf0, 0xb7, 0x7f, 0x2e, 0x8f, 0x5c, 0xb3, 0xb0,
+ 0xfe, 0x7e, 0x64, 0xb4, 0x73, 0x50, 0xb3, 0x6f, 0x8d, 0x69, 0xe6, 0xb9,
+ 0xe3, 0x7f, 0xe8, 0xea, 0x1c, 0x0f, 0xc2, 0xb3, 0x94, 0x2d, 0x7c, 0x7b,
+ 0x5a, 0x72, 0x37, 0x0e, 0x63, 0x17, 0xa5, 0x73, 0x16, 0x42, 0xc3, 0x87,
+ 0x23, 0x9a, 0x4e, 0x4e, 0x33, 0x9c, 0x46, 0x43, 0x54, 0x73, 0x41, 0x44,
+ 0x7c, 0x9e, 0x1a, 0x6b, 0xdb, 0x36, 0x74, 0x05, 0x51, 0x08, 0x9b, 0x88,
+ 0x71, 0x52, 0x20, 0x00, 0xac, 0xd3, 0x54, 0x94, 0xf8, 0x7a, 0x25, 0xe1,
+ 0x88, 0x77, 0x11, 0x75, 0x63, 0xc3, 0x2c, 0xdf, 0xa3, 0x2f, 0xd3, 0x0d,
+ 0x0a, 0xb1, 0x4b, 0x11, 0xc4, 0x5e, 0xb9, 0xbe, 0xfa, 0xa4, 0x28, 0xfd,
+ 0x93, 0x9e, 0x21, 0x0a, 0x3e, 0xf2, 0xad, 0x49, 0xc7, 0xd5, 0x14, 0x35,
+ 0x92, 0x58, 0x3e, 0x02, 0x38, 0xeb, 0x4d, 0x12, 0x9d, 0xe9, 0x7b, 0xf8,
+ 0x69, 0x5c, 0xc3, 0x77, 0x71, 0xf6, 0x5a, 0x50, 0xa7, 0x78, 0xbd, 0xe1,
+ 0x5b, 0xa9, 0x6d, 0x8f, 0xb2, 0xe2, 0xdd, 0x0b, 0x10, 0xa8, 0x72, 0xcf,
+ 0x5d, 0xe5, 0xf9, 0xfe, 0xf1, 0x95, 0x00, 0x97, 0xb5, 0xf5, 0x2a, 0x0c,
+ 0x41, 0x49, 0xf2, 0xb9, 0xba, 0x3b, 0xa2, 0x0d, 0xaa, 0x59, 0xd6, 0xf2,
+ 0x23, 0xfd, 0xe6, 0xac, 0x33, 0xaa, 0x7e, 0x11, 0x6e, 0xd8, 0x93, 0x5b,
+ 0x99, 0xd1, 0x73, 0x13, 0xe0, 0x4a, 0x53, 0xdf, 0x9c, 0x15, 0x80, 0xda,
+ 0x4e, 0xaf, 0x00, 0xc6, 0xc2, 0x1a, 0xac, 0xc1, 0x7e, 0xc8, 0xaf, 0x92,
+ 0x36, 0xb3, 0xd2, 0x61, 0xb0, 0xcd, 0x55, 0xf6, 0x7d, 0x28, 0xf2, 0x01,
+ 0xc1, 0x5b, 0x5b, 0xf1, 0x4c, 0xb8, 0xcf, 0x72, 0xf6, 0xae, 0x4b, 0x66,
+ 0x74, 0xc3, 0xaf, 0x77, 0x3c, 0xd8, 0x0f, 0xe4, 0x38, 0xcc, 0xa5, 0x06,
+ 0xfc, 0x5e, 0x15, 0xf8, 0x74, 0xb1, 0xd1, 0x37, 0x6f, 0xfb, 0x97, 0x2e,
+ 0x18, 0x64, 0x20, 0x17, 0x8d, 0x5e, 0xf7, 0xf6, 0x83, 0xfd, 0x5b, 0x80,
+ 0x82, 0x7a, 0xc9, 0x12, 0x37, 0x51, 0x19, 0x8d, 0x0f, 0x09, 0x12, 0x8e,
+ 0x76, 0x95, 0x54, 0xd8, 0x92, 0x21, 0xc5, 0xcc, 0x53, 0x46, 0xae, 0xd7,
+ 0x7e, 0xe4, 0xb7, 0x9b, 0x70, 0xa8, 0xf9, 0x4a, 0xa8, 0x07, 0x5c, 0x79,
+ 0x7b, 0xdf, 0x82, 0x6c, 0x14, 0xc3, 0x4a, 0x9b, 0x93, 0xed, 0x12, 0xbf,
+ 0x36, 0x86, 0x3a, 0x9f, 0xe5, 0xe3, 0x6d, 0xc7, 0xb0, 0x1c, 0x1c, 0x2a,
+ 0x0f, 0xd1, 0x34, 0xf4, 0xca, 0x6b, 0xf0, 0x92, 0xb8, 0xf9, 0x9a, 0x07,
+ 0x1c, 0x4b, 0xc8, 0x21, 0xed, 0x27, 0x96, 0xf7, 0x00, 0x2c, 0xb5, 0xa0,
+ 0x05, 0xf5, 0xf8, 0xab, 0xb1, 0x47, 0x6b, 0x9a, 0xf5, 0xed, 0xdb, 0x8e,
+ 0xba, 0x9b, 0xb7, 0xf6, 0xe2, 0x99, 0x8f, 0xc0, 0x29, 0x63, 0x31, 0x19,
+ 0xcb, 0x16, 0x2d, 0x7f, 0x12, 0x6f, 0x90, 0x24, 0x31, 0xbc, 0x89, 0xa4,
+ 0x39, 0xb1, 0x07, 0xab, 0x0a, 0x7f, 0x92, 0xaa, 0xc0, 0x00, 0xa0, 0xb3,
+ 0x73, 0x28, 0x3e, 0x14, 0xdc, 0xc5, 0x8a, 0xbe, 0x00, 0xc1, 0xc1, 0xc6,
+ 0x2b, 0x6f, 0x69, 0x36, 0x86, 0x05, 0xc2, 0x4b, 0xf7, 0xbe, 0x9c, 0x67,
+ 0x35, 0x06, 0x71, 0x2f, 0xcb, 0xc1, 0x67, 0xac, 0x64, 0xee, 0x57, 0xa6,
+ 0x6d, 0x68, 0xb2, 0xa4, 0xfb, 0xf1, 0x4d, 0x21, 0xcf, 0x74, 0xe9, 0x9d,
+ 0x25, 0x99, 0x57, 0x70, 0xc5, 0x41, 0xbf, 0x4c, 0xc3, 0xbc, 0x12, 0x51,
+ 0x7c, 0x91, 0x61, 0xa5, 0x46, 0x67, 0xc9, 0x24, 0xd1, 0x89, 0x04, 0x02,
+ 0xeb, 0xca, 0x12, 0xd4, 0xb7, 0xa8, 0x3e, 0xa4, 0xac, 0x1a, 0x6f, 0x07,
+ 0x91, 0x38, 0x05, 0x69, 0xba, 0x44, 0x97, 0x90, 0xb8, 0xfb, 0x4f, 0xc8,
+ 0x25, 0x2b, 0x00, 0x61, 0x05, 0xc7, 0x23, 0xb6, 0x96, 0x66, 0xb9, 0x06,
+ 0x22, 0x89, 0x52, 0xe5, 0x22, 0x4d, 0xa0, 0xc4, 0x98, 0x4d, 0x9c, 0xbd,
+ 0x29, 0xcc, 0xbf, 0x4b, 0xf5, 0x8c, 0x56, 0xfc, 0xae, 0x86, 0x7c, 0x48,
+ 0xb9, 0x72, 0x14, 0xca, 0x55, 0xac, 0x50, 0x5b, 0x62, 0x79, 0x15, 0xe9,
+ 0x6d, 0x52, 0xad, 0xca, 0x17, 0x18, 0xf0, 0x3e, 0xa8, 0xd9, 0x5d, 0x0b,
+ 0xbb, 0xa7, 0x71, 0xc9, 0x33, 0xf8, 0xa8, 0x36, 0x65, 0xc3, 0x6a, 0xad,
+ 0xb1, 0xea, 0x02, 0x45, 0x95, 0xcd, 0x7a, 0xe7, 0xef, 0xad, 0xfd, 0xc0,
+ 0x8c, 0xc1, 0x68, 0x83, 0x5e, 0x85, 0x20, 0x74, 0xec, 0x0f, 0xd2, 0x3f,
+ 0x1d, 0x2b, 0xac, 0x80, 0xe7, 0x8a, 0x3d, 0x6e, 0xab, 0xd4, 0xbe, 0xe6,
+ 0x07, 0xcc, 0x93, 0x5c, 0x36, 0xf6, 0x50, 0xf7, 0xff, 0x3b, 0x5d, 0x29,
+ 0xe3, 0x6e, 0xa0, 0x05, 0xda, 0x45, 0xa5, 0xba, 0x8a, 0x7e, 0xc3, 0xc0,
+ 0x11, 0xe4, 0xfa, 0xf2, 0xd8, 0x84, 0x5e, 0x7f, 0xb4, 0x13, 0x1e, 0xcb,
+ 0x54, 0x2e, 0x4d, 0x40, 0x63, 0x4d, 0xe7, 0x68, 0x12, 0xc0, 0x75, 0xb0,
+ 0x10, 0x04, 0xd9, 0x06, 0x41, 0x22, 0x2f, 0x35, 0x08, 0x12, 0xb4, 0x58,
+ 0x4b, 0x91, 0x0f, 0x8c, 0xa8, 0x6c, 0xa4, 0x7e, 0xea, 0x85, 0x8c, 0xac,
+ 0x9b, 0xcf, 0x93, 0xcf, 0x48, 0xf7, 0xfe, 0x62, 0x01, 0x84, 0x34, 0x18,
+ 0x25, 0xf1, 0xbe, 0x0c, 0x80, 0xa3, 0x4f, 0x71, 0x81, 0x00, 0x64, 0x00,
+ 0x86, 0x00, 0x40, 0x96, 0xf0, 0x01, 0x17, 0x86, 0x00, 0x37, 0x77, 0x6f,
+ 0x3d, 0x1a, 0xea, 0x85, 0x30, 0x98, 0x31, 0x5e, 0x78, 0xf0, 0xb6, 0xae,
+ 0xcb, 0x2c, 0x84, 0xbe, 0x35, 0xc9, 0x41, 0xcd, 0x98, 0xd1, 0x18, 0x0f,
+ 0x0d, 0xd0, 0x7f, 0x93, 0xd1, 0xfb, 0xbb, 0xde, 0x1f, 0x05, 0xd1, 0x3d,
+ 0x1f, 0xc4, 0xfd, 0x5f, 0x2f, 0xf2, 0xad, 0x68, 0xfc, 0xba, 0x3f, 0xfd,
+ 0x8e, 0x75, 0x6f, 0x64, 0x00, 0x00, 0x00, 0x05, 0x7a, 0x7f, 0x70, 0xd9,
+ 0xcd, 0x8a, 0x9c, 0x65, 0xac, 0xbc, 0x05, 0xc7, 0xac, 0x85, 0x8d, 0x79,
+ 0x14, 0xe6, 0x67, 0x0c, 0xb0, 0xf0, 0xd9, 0xc6, 0xeb, 0xa5, 0x01, 0x43,
+ 0x7f, 0x0d, 0xee, 0xae, 0xd8, 0xfc, 0xad, 0x34, 0x08, 0xb2, 0x0e, 0x95,
+ 0x6f, 0x1b, 0x91, 0x24, 0x11, 0xff, 0x37, 0x10, 0xe1, 0xaf, 0x64, 0xd5,
+ 0x10, 0xa8, 0x7a, 0xcb, 0x24, 0xae, 0x2d, 0x26, 0x98, 0x4a, 0x4e, 0x92,
+ 0x54, 0x85, 0x59, 0xf2, 0xa3, 0x2d, 0x64, 0xc3, 0x39, 0xde, 0x0e, 0x75,
+ 0xb5, 0x2b, 0xf5, 0x83, 0x49, 0x73, 0x95, 0xff, 0x05, 0xf6, 0x87, 0xa3,
+ 0x5f, 0xd7, 0x23, 0x55, 0xf8, 0x97, 0xef, 0x68, 0x33, 0xf2, 0xee, 0x03,
+ 0x70, 0xb3, 0x88, 0xef, 0x94, 0x01, 0x27, 0x06, 0xfc, 0xbf, 0xaf, 0x5d,
+ 0x44, 0xe2, 0x35, 0xe5, 0x24, 0x45, 0xc1, 0x49, 0x71, 0xf0, 0xbc, 0x47,
+ 0x81, 0xcd, 0x3f, 0x67, 0x67, 0x38, 0x3b, 0xf3, 0x3b, 0xbe, 0xcb, 0x2f,
+ 0x50, 0xc8, 0xc3, 0x32, 0x75, 0x2a, 0x4f, 0x90, 0x9f, 0xf5, 0x2b, 0x38,
+ 0xab, 0xca, 0x70, 0xf2, 0x5d, 0x93, 0xab, 0xea, 0xe5, 0xa3, 0x55, 0x86,
+ 0x2b, 0x69, 0xf5, 0x24, 0xd2, 0xb2, 0x48, 0x03, 0xbb, 0x02, 0xb1, 0xad,
+ 0xcb, 0xa1, 0xe5, 0xac, 0x80, 0x05, 0x88, 0xb9, 0xd1, 0xaa, 0x4f, 0x97,
+ 0xa7, 0x0e, 0x43, 0x6b, 0xf4, 0x92, 0x5a, 0xcb, 0xf9, 0xf9, 0xe6, 0x59,
+ 0xf2, 0x7c, 0x9a, 0xd0, 0x8e, 0x79, 0x79, 0x60, 0xdd, 0xf3, 0x0a, 0xf3,
+ 0x1e, 0x77, 0x9b, 0xcf, 0x1d, 0xca, 0x0c, 0x4a, 0x73, 0xf3, 0x97, 0xb7,
+ 0x35, 0xef, 0x99, 0x89, 0x72, 0x9a, 0x18, 0x28, 0x47, 0x84, 0xf6, 0x89,
+ 0x73, 0x85, 0x78, 0x80, 0x1f, 0x91, 0xfb, 0x9b, 0x61, 0x68, 0xec, 0x17,
+ 0x54, 0x99, 0xb6, 0xeb, 0xfc, 0xb6, 0xde, 0x3f, 0x6f, 0x2d, 0x4a, 0x63,
+ 0x74, 0xbe, 0x45, 0xe2, 0x54, 0xbe, 0xeb, 0x6a, 0x62, 0x4a, 0x6e, 0x83,
+ 0x09, 0x30, 0x74, 0x1a, 0x60, 0x8a, 0x4b, 0xfa, 0xf5, 0x1b, 0x67, 0x38,
+ 0xf1, 0x66, 0x75, 0x9f, 0x61, 0xde, 0xe1, 0x50, 0x98, 0x62, 0x0a, 0xc1,
+ 0x69, 0x6b, 0x54, 0x38, 0x62, 0x96, 0x48, 0x67, 0xd5, 0x64, 0x28, 0x2d,
+ 0x42, 0x17, 0xe7, 0xc4, 0x36, 0x21, 0xce, 0x67, 0x90, 0x5d, 0x9e, 0x67,
+ 0x2d, 0x4c, 0x8f, 0x9d, 0xf9, 0x29, 0x52, 0x1f, 0xa3, 0x20, 0xde, 0x52,
+ 0x4d, 0xc2, 0x03, 0x83, 0x20, 0xfc, 0x59, 0x48, 0x9b, 0x15, 0xfd, 0x12,
+ 0x4c, 0xb3, 0x2f, 0x47, 0x0f, 0x2e, 0xc8, 0xda, 0xc4, 0x9a, 0xba, 0x1f,
+ 0x0c, 0xcc, 0x6f, 0x0d, 0x44, 0x21, 0x8f, 0x32, 0x23, 0x80, 0x35, 0xbb,
+ 0x4d, 0x8b, 0x3f, 0xab, 0x75, 0xa7, 0x55, 0x74, 0x05, 0x54, 0xdb, 0xc8,
+ 0x91, 0x06, 0xf5, 0xdc, 0xbd, 0x0d, 0xcc, 0x89, 0x06, 0xbc, 0xae, 0x40,
+ 0xbf, 0x6d, 0x45, 0xb2, 0x36, 0x6b, 0x88, 0xb7, 0xa4, 0xd9, 0xcd, 0x7f,
+ 0xfb, 0xd5, 0xbc, 0x4d, 0x67, 0xdc, 0xe4, 0x12, 0x46, 0x54, 0x7c, 0x53,
+ 0xd2, 0x40, 0xb2, 0x35, 0xe5, 0x2b, 0x35, 0xcf, 0xc1, 0xf9, 0xe0, 0x06,
+ 0x9f, 0x55, 0xd1, 0x2a, 0x5c, 0x01, 0x6e, 0xab, 0xfb, 0xeb, 0xbb, 0x9c,
+ 0xb0, 0x40, 0x1e, 0x24, 0x85, 0x5d, 0x95, 0xb3, 0xf5, 0x0c, 0xf2, 0xd6,
+ 0x07, 0x23, 0xb4, 0x5b, 0xe3, 0xc2, 0x93, 0x9c, 0xa2, 0xf9, 0x6d, 0xe2,
+ 0x0a, 0x1d, 0xeb, 0xdc, 0xb7, 0xbc, 0x04, 0xf5, 0xa9, 0xa9, 0xea, 0xf3,
+ 0x82, 0x53, 0x92, 0x79, 0x23, 0xcc, 0xc6, 0xab, 0x3e, 0x56, 0xfc, 0xad,
+ 0xf7, 0x4f, 0x10, 0xef, 0x62, 0xf2, 0x87, 0x38, 0x9a, 0x8d, 0x54, 0xb2,
+ 0x62, 0x55, 0xb2, 0x05, 0x0a, 0x0e, 0xc0, 0x15, 0x71, 0xda, 0x8b, 0x27,
+ 0x09, 0x0f, 0x2b, 0x5f, 0x3f, 0xdc, 0x08, 0x72, 0x94, 0x79, 0x98, 0x5e,
+ 0x5e, 0xb0, 0xef, 0xe7, 0x7b, 0x25, 0x1a, 0xc2, 0x1d, 0x1a, 0x54, 0x85,
+ 0x60, 0x05, 0xf5, 0x59, 0x01, 0xfd, 0x38, 0x10, 0x2b, 0x4d, 0x84, 0x8d,
+ 0x30, 0x4e, 0xa0, 0x7b, 0xd3, 0x99, 0xc8, 0xe4, 0x15, 0x2b, 0x7b, 0xfa,
+ 0x98, 0xb4, 0xd3, 0x2d, 0x96, 0x99, 0xc0, 0xb6, 0x44, 0x8f, 0xdd, 0x9a,
+ 0x69, 0x0f, 0x69, 0x6d, 0xe5, 0x76, 0x1d, 0x76, 0xe0, 0x4f, 0x5d, 0xf5,
+ 0x8a, 0xf1, 0x00, 0x30, 0xe3, 0x6a, 0xe3, 0x03, 0x3e, 0xe2, 0x8d, 0x3c,
+ 0x4e, 0x71, 0x33, 0x31, 0xf8, 0xc1, 0xa1, 0x17, 0xd5, 0xc9, 0x88, 0xfb,
+ 0xf8, 0x83, 0xe2, 0x8a, 0xbd, 0xba, 0x87, 0xe1, 0x5f, 0x70, 0x3e, 0xe2,
+ 0x4e, 0xd6, 0x1c, 0xc2, 0x3e, 0x4e, 0xe1, 0xf5, 0x42, 0x8a, 0x3d, 0xa5,
+ 0x9c, 0xca, 0xbf, 0x2c, 0xcc, 0xf3, 0x4b, 0x2f, 0x15, 0x8f, 0xa7, 0x2b,
+ 0x35, 0xe7, 0x84, 0x31, 0x46, 0x51, 0xcf, 0xc8, 0x5c, 0x5c, 0xf3, 0xc6,
+ 0x19, 0xf1, 0xd7, 0x42, 0x61, 0x42, 0xb3, 0x7d, 0x90, 0x0b, 0x1d, 0xfd,
+ 0x52, 0xa3, 0x81, 0xa3, 0xf2, 0xe9, 0x36, 0x20, 0xdd, 0xe0, 0x91, 0xcd,
+ 0x8d, 0x38, 0x41, 0xc7, 0xe5, 0xfb, 0xad, 0xe4, 0xf0, 0x64, 0x19, 0xca,
+ 0x05, 0x71, 0xd8, 0xfc, 0x0e, 0xd1, 0xfa, 0x13, 0x58, 0x48, 0x2f, 0x14,
+ 0x31, 0xa5, 0xf0, 0xbc, 0x07, 0xe6, 0xb4, 0xc4, 0x85, 0x11, 0x5e, 0xb8,
+ 0xc4, 0x68, 0xfa, 0x29, 0x91, 0x63, 0x77, 0x83, 0x4f, 0xe8, 0x61, 0x4c,
+ 0xcb, 0x49, 0xda, 0xf9, 0x7f, 0xfd, 0x2f, 0x11, 0xb0, 0xc0, 0xfd, 0x74,
+ 0x5b, 0xa1, 0x07, 0x97, 0xd2, 0xa3, 0x99, 0xc2, 0x86, 0xee, 0xc9, 0x39,
+ 0x6a, 0xaa, 0x38, 0x3b, 0xd6, 0xa1, 0xba, 0xe8, 0x40, 0x96, 0x85, 0x8c,
+ 0x26, 0xf6, 0x8d, 0xbb, 0x91, 0xde, 0x9a, 0x08, 0xf9, 0x77, 0xba, 0x7a,
+ 0x55, 0xc8, 0xcf, 0xc6, 0x43, 0xf0, 0x00, 0x96, 0xd8, 0xb5, 0x1f, 0x8e,
+ 0xc2, 0x52, 0xd1, 0x2e, 0xe4, 0x0e, 0x4b, 0x07, 0xfb, 0xfc, 0x3e, 0xa1,
+ 0x6e, 0xa0, 0xa4, 0xc4, 0x03, 0xb6, 0x1b, 0x04, 0x72, 0x10, 0x48, 0x02,
+ 0xad, 0x5e, 0xa3, 0xfc, 0x0e, 0xb7, 0x44, 0x49, 0x3e, 0x2f, 0xac, 0xfe,
+ 0x9c, 0xcc, 0x84, 0x16, 0xd1, 0xf0, 0x5a, 0xa4, 0x9a, 0x4f, 0xf4, 0x0c,
+ 0xbf, 0xae, 0x7a, 0x3a, 0x5b, 0x39, 0x05, 0x2b, 0x00, 0x55, 0xfe, 0x8c,
+ 0x1a, 0x43, 0x78, 0x41, 0x42, 0x65, 0x80, 0x50, 0x76, 0xe5, 0xb7, 0x26,
+ 0x7b, 0x7e, 0xad, 0xe7, 0xd2, 0x37, 0xa0, 0xd2, 0xc7, 0x3f, 0xc4, 0x1d,
+ 0x4d, 0xdb, 0x7e, 0xeb, 0xff, 0xea, 0xeb, 0x41, 0xdb, 0x55, 0x11, 0xf7,
+ 0x6b, 0x38, 0xd0, 0xd7, 0xac, 0xee, 0x82, 0x00, 0x99, 0x69, 0x2a, 0xd3,
+ 0x74, 0x3d, 0x2f, 0x56, 0xe0, 0x32, 0xf0, 0xd7, 0xdc, 0x72, 0x2e, 0xd8,
+ 0x45, 0xf2, 0xd1, 0x9e, 0xab, 0xfb, 0xff, 0x0b, 0x16, 0x4c, 0x94, 0xc5,
+ 0x43, 0xd8, 0x44, 0xe7, 0x3c, 0x4a, 0x18, 0xd4, 0xf8, 0x2b, 0xa0, 0xe8,
+ 0x0e, 0x08, 0x1b, 0x58, 0x75, 0x71, 0xbb, 0xed, 0x1e, 0x91, 0xfa, 0x83,
+ 0x0f, 0xdf, 0x5e, 0xb2, 0x55, 0x16, 0x21, 0x67, 0xe1, 0xe1, 0xa8, 0xa8,
+ 0x93, 0x62, 0x4d, 0x82, 0xca, 0x7d, 0x04, 0x09, 0xe4, 0x7b, 0x78, 0x11,
+ 0xa9, 0x30, 0xcd, 0xfb, 0x62, 0xee, 0xbe, 0x47, 0x05, 0x13, 0x30, 0xe8,
+ 0xa1, 0x47, 0x11, 0xd7, 0x75, 0x8b, 0x1b, 0x15, 0xcc, 0xd5, 0x5a, 0xa5,
+ 0xb1, 0x05, 0x12, 0xc4, 0x20, 0xfe, 0x46, 0x17, 0x6a, 0x10, 0x8c, 0xd9,
+ 0xb4, 0x05, 0x6e, 0x1b, 0x16, 0xf5, 0xdd, 0x0e, 0x43, 0xd6, 0x54, 0x36,
+ 0x2b, 0x5d, 0x9c, 0x72, 0xca, 0xb7, 0xdb, 0xaa, 0xca, 0x18, 0x86, 0x57,
+ 0x11, 0x1a, 0x7d, 0xbb, 0x5d, 0xdf, 0x0b, 0xcf, 0x3d, 0x0e, 0x02, 0xd6,
+ 0x8c, 0x9f, 0xe6, 0x5c, 0xe3, 0xd3, 0x01, 0x12, 0x5c, 0x40, 0xe5, 0xa8,
+ 0x24, 0x40, 0xd7, 0xea, 0x33, 0x22, 0x23, 0xf1, 0xdc, 0x2e, 0x55, 0x6a,
+ 0x05, 0xbd, 0xc5, 0x90, 0xd0, 0xd9, 0x74, 0xff, 0x98, 0xa4, 0x59, 0x38,
+ 0x2b, 0x9a, 0xe4, 0x68, 0xf2, 0x7f, 0xc0, 0x53, 0x92, 0x0e, 0x49, 0x51,
+ 0x9f, 0x8b, 0x68, 0xe9, 0x42, 0x0f, 0x08, 0xb3, 0xb4, 0x8d, 0x3a, 0x7f,
+ 0x48, 0xaf, 0x6f, 0x31, 0x9c, 0x03, 0x3b, 0xe9, 0xab, 0x84, 0xf0, 0x5a,
+ 0x2a, 0x6d, 0xa7, 0x38, 0x91, 0x0e, 0x90, 0x35, 0x49, 0xc2, 0xd5, 0xb9,
+ 0xd2, 0x54, 0x14, 0x1b, 0x11, 0xe7, 0xe9, 0x4a, 0xc1, 0x6c, 0x4b, 0x6d,
+ 0x60, 0xe3, 0xa4, 0x0a, 0x1e, 0x3e, 0x41, 0x96, 0xae, 0x35, 0xef, 0xe1,
+ 0xca, 0x88, 0x4a, 0x07, 0xc2, 0xcb, 0xee, 0x2a, 0x6f, 0x08, 0x95, 0x3d,
+ 0x64, 0x76, 0xad, 0x31, 0xe1, 0xfb, 0x82, 0x2f, 0xbc, 0x59, 0x1c, 0x1f,
+ 0xcd, 0xf0, 0xa0, 0x96, 0x61, 0xfb, 0xde, 0xa2, 0x99, 0xe1, 0x90, 0xcc,
+ 0x43, 0x25, 0x4c, 0x8d, 0x9d, 0x5b, 0xe7, 0x34, 0xdb, 0xe9, 0x6a, 0x08,
+ 0x6f, 0x40, 0x78, 0x24, 0x25, 0x90, 0xd8, 0x7e, 0x76, 0x39, 0x9d, 0x00,
+ 0x86, 0x7c, 0xf4, 0xa2, 0xfa, 0x3b, 0x2d, 0x0e, 0xee, 0x25, 0x2b, 0x12,
+ 0x36, 0x10, 0x67, 0x84, 0xe7, 0xa9, 0xc4, 0xb0, 0xfb, 0x9e, 0x6c, 0xa4,
+ 0x53, 0x77, 0x68, 0xfc, 0x3b, 0xd5, 0x77, 0x65, 0x3c, 0xb8, 0x56, 0x9a,
+ 0x2c, 0x42, 0x64, 0x98, 0x53, 0x8f, 0x1d, 0x8c, 0xf7, 0x4c, 0xc5, 0xbe,
+ 0xad, 0xe9, 0x40, 0x0d, 0x4a, 0xd4, 0xad, 0x5e, 0xd9, 0x5e, 0x71, 0x9c,
+ 0xfb, 0x38, 0x73, 0x93, 0xb4, 0xa6, 0x1c, 0xa5, 0x48, 0x49, 0xb3, 0xa2,
+ 0x33, 0xf7, 0x54, 0x15, 0xfa, 0xc5, 0x2f, 0xda, 0x20, 0xaa, 0x95, 0x67,
+ 0xee, 0x47, 0x96, 0x6f, 0xce, 0x04, 0x9b, 0x75, 0xff, 0xfc, 0x3e, 0x96,
+ 0xc8, 0x56, 0x6d, 0x90, 0x04, 0xc0, 0x0e, 0x9b, 0x9b, 0x66, 0xff, 0x30,
+ 0xbc, 0x6f, 0xd1, 0x80, 0x34, 0xe7, 0x22, 0xfc, 0x2b, 0x9a, 0x36, 0x4b,
+ 0xcf, 0xf0, 0x3c, 0xa3, 0xd5, 0x7a, 0x3b, 0x91, 0xef, 0xcd, 0xd7, 0x25,
+ 0xd9, 0xa4, 0x43, 0xbc, 0x09, 0xb9, 0xf5, 0xc2, 0x35, 0xbd, 0x6c, 0x2d,
+ 0x04, 0x7a, 0xa0, 0xf7, 0xd3, 0xf4, 0x90, 0x2d, 0x53, 0xb4, 0x9e, 0x56,
+ 0xc6, 0x5e, 0x52, 0x36, 0x22, 0x7c, 0xac, 0xa3, 0xb7, 0xef, 0x59, 0xde,
+ 0x12, 0x83, 0x72, 0xba, 0x3d, 0x47, 0xd7, 0x9a, 0xd3, 0x03, 0x43, 0x01,
+ 0xed, 0x79, 0x60, 0x96, 0x4e, 0x34, 0xd9, 0x98, 0xdb, 0x06, 0xb9, 0x6f,
+ 0xc6, 0xca, 0x63, 0x5b, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x02, 0x1e, 0x7f,
+ 0xa2, 0x79, 0x45, 0x83, 0x11, 0xcb, 0xe3, 0x7a, 0x18, 0x46, 0x8d, 0xc0,
+ 0xce, 0xc5, 0x1c, 0x78, 0x39, 0xdb, 0x78, 0xff, 0x7b, 0xbf, 0xac, 0x52,
+ 0xc8, 0x56, 0xe6, 0x20, 0x76, 0xb2, 0xd6, 0x3f, 0x46, 0x0a, 0x67, 0x1d,
+ 0xc5, 0xb3, 0xd0, 0xd3, 0x16, 0xee, 0x18, 0x02, 0xdb, 0xb4, 0x11, 0xa7,
+ 0x2d, 0x12, 0x59, 0xab, 0xa8, 0xab, 0x3c, 0xb0, 0xe6, 0x2d, 0xed, 0x1b,
+ 0xe0, 0x84, 0xee, 0xd8, 0xdf, 0xf8, 0x5a, 0x0b, 0x58, 0x29, 0x1e, 0x24,
+ 0x0e, 0x0f, 0x1f, 0x71, 0x4b, 0x72, 0x3d, 0x99, 0x3f, 0x14, 0x92, 0xf2,
+ 0xb2, 0x7b, 0xc6, 0xa6, 0x69, 0x5c, 0xb6, 0x02, 0x1f, 0x19, 0x66, 0x91,
+ 0x6b, 0x7f, 0x56, 0x65, 0x67, 0x70, 0x43, 0xd4, 0x75, 0x8d, 0x77, 0x49,
+ 0xef, 0x24, 0xee, 0xb8, 0xd7, 0x28, 0x5c, 0x31, 0xdd, 0x73, 0x0d, 0x92,
+ 0x76, 0xe8, 0x12, 0x55, 0xfa, 0x5f, 0xc0, 0xa2, 0x3f, 0x95, 0xa2, 0x08,
+ 0xf8, 0x1b, 0xc0, 0x11, 0x31, 0xf1, 0x3e, 0x64, 0x7d, 0x40, 0x7c, 0xcb,
+ 0x59, 0xb6, 0x98, 0x73, 0x42, 0xdb, 0x08, 0xf9, 0xfe, 0xce, 0x6b, 0xa9,
+ 0x31, 0xec, 0xed, 0x8d, 0xc1, 0xd5, 0xb3, 0x9e, 0xcd, 0xff, 0xa7, 0x09,
+ 0xd8, 0x6f, 0x2a, 0x51, 0x6c, 0xa1, 0x1e, 0x04, 0x4c, 0x8a, 0x90, 0x11,
+ 0x29, 0xd0, 0xa1, 0xb4, 0xdb, 0x1d, 0xf3, 0xea, 0xe9, 0x86, 0xd7, 0xa5,
+ 0x65, 0xb8, 0x34, 0x8a, 0x1a, 0xb7, 0x37, 0xe2, 0xa2, 0x35, 0x50, 0x97,
+ 0x61, 0xc7, 0x2c, 0xb9, 0x62, 0x6f, 0x40, 0x3f, 0x53, 0xe2, 0x30, 0x9e,
+ 0x99, 0xc7, 0xd5, 0xa1, 0x79, 0xbf, 0xc3, 0x1c, 0x37, 0x64, 0x73, 0x19,
+ 0xc7, 0x2f, 0xab, 0x07, 0x9f, 0x4d, 0x90, 0xf8, 0x17, 0x38, 0x89, 0xa4,
+ 0x22, 0x60, 0x05, 0x25, 0xe1, 0x57, 0x95, 0xa9, 0x86, 0x7d, 0xa0, 0x7e,
+ 0x7d, 0x7f, 0x49, 0xe4, 0xd0, 0x25, 0x04, 0x2b, 0x7a, 0x60, 0xff, 0x42,
+ 0xbe, 0x10, 0x88, 0x78, 0x45, 0xd8, 0xb4, 0xf9, 0x82, 0x2f, 0x7d, 0xa7,
+ 0x30, 0xf0, 0xf9, 0xbc, 0x5d, 0x86, 0x57, 0x04, 0x55, 0x36, 0xbf, 0x94,
+ 0x07, 0xa1, 0x4f, 0x0a, 0xed, 0xc9, 0x6b, 0x32, 0xc1, 0x5c, 0x6b, 0x53,
+ 0x7c, 0x8c, 0x5c, 0x33, 0xc4, 0x9b, 0x58, 0x15, 0x1b, 0x85, 0x4d, 0x96,
+ 0x73, 0xc4, 0xb2, 0xec, 0x34, 0xea, 0x1b, 0x61, 0x3f, 0x78, 0xe3, 0xc1,
+ 0x99, 0x64, 0xf1, 0x06, 0x33, 0x5d, 0x58, 0xe8, 0xde, 0x74, 0xba, 0xc5,
+ 0x70, 0x07, 0xe0, 0xb0, 0xc5, 0x40, 0xc2, 0xe6, 0xcf, 0x5c, 0xcc, 0x06,
+ 0xbe, 0x3c, 0xe1, 0x6c, 0x5b, 0xf3, 0xc5, 0x5f, 0x77, 0x25, 0x70, 0x71,
+ 0x25, 0x22, 0xb4, 0x94, 0xf8, 0xc1, 0x23, 0x9d, 0xc7, 0x70, 0xd4, 0xbd,
+ 0x19, 0x54, 0xf9, 0x22, 0xd0, 0xee, 0xed, 0x1c, 0xec, 0x47, 0x25, 0xfe,
+ 0x02, 0x00, 0x46, 0x5e, 0x9f, 0xaf, 0x33, 0x9d, 0x94, 0x5c, 0xbb, 0x3e,
+ 0x56, 0xf8, 0xca, 0x73, 0xcb, 0x25, 0x98, 0xfe, 0xfe, 0x6c, 0x63, 0xf7,
+ 0x7f, 0x2e, 0xc2, 0x3c, 0x87, 0x13, 0x97, 0xdb, 0xd2, 0x50, 0xef, 0xfd,
+ 0xf6, 0x92, 0xde, 0x38, 0x9a, 0x06, 0x5c, 0xfe, 0xb3, 0x83, 0xf8, 0xbe,
+ 0x92, 0x77, 0x58, 0xef, 0xf7, 0x31, 0x25, 0xfa, 0x61, 0x24, 0x9b, 0x2c,
+ 0xaf, 0xae, 0x4e, 0xe9, 0xe9, 0xb5, 0x13, 0x11, 0x83, 0xfa, 0xe7, 0xa3,
+ 0x12, 0xa8, 0x9b, 0xe2, 0xe9, 0xfb, 0x18, 0xd8, 0x75, 0x94, 0x3a, 0xe9,
+ 0x3a, 0xb4, 0x73, 0x94, 0xf2, 0xda, 0xcb, 0xe0, 0x22, 0xf2, 0x7f, 0xe6,
+ 0x48, 0x60, 0x2a, 0xf9, 0xf1, 0xe0, 0xa0, 0x31, 0x89, 0xc6, 0x9e, 0x7f,
+ 0x38, 0xd6, 0xb5, 0x3e, 0x67, 0x47, 0xb2, 0xc1, 0xa2, 0xcf, 0xf4, 0x5d,
+ 0x33, 0x2b, 0x3b, 0x87, 0xd0, 0x3c, 0x32, 0xc6, 0xa5, 0xae, 0xda, 0xab,
+ 0x4e, 0x0c, 0x04, 0xf9, 0x33, 0x04, 0x9e, 0xfd, 0xb6, 0x95, 0x54, 0x02,
+ 0x3d, 0x77, 0x68, 0x9e, 0x02, 0x23, 0x7f, 0x62, 0x65, 0x07, 0xf6, 0xc7,
+ 0x80, 0x00, 0x00, 0x01, 0x4e, 0x7f, 0xa4, 0x01, 0xde, 0x65, 0xb9, 0x4c,
+ 0xc8, 0x2b, 0xa4, 0xd3, 0x7c, 0xf2, 0x87, 0x6d, 0x11, 0x12, 0x1c, 0x3f,
+ 0x22, 0xca, 0x14, 0xca, 0x91, 0x51, 0x22, 0x02, 0x77, 0xd7, 0x75, 0xdf,
+ 0x8a, 0x8d, 0x57, 0x5d, 0xd1, 0xd1, 0x87, 0xd3, 0x60, 0x3e, 0x51, 0xa2,
+ 0xe9, 0x2b, 0x1e, 0x9a, 0xbd, 0xa9, 0x9d, 0xf7, 0x74, 0x61, 0xf8, 0x6a,
+ 0xf1, 0xd0, 0x6f, 0xfa, 0x3d, 0xd0, 0x80, 0xa2, 0x00, 0x75, 0xa5, 0x41,
+ 0x14, 0xf2, 0x84, 0x34, 0x96, 0xe2, 0x1f, 0xea, 0x60, 0xf6, 0x1b, 0x30,
+ 0x7e, 0x8b, 0xee, 0xd1, 0xc5, 0x98, 0xb6, 0x8e, 0xaa, 0xd5, 0xb3, 0x45,
+ 0x27, 0x51, 0x1d, 0x23, 0x44, 0xc3, 0x0b, 0x86, 0x97, 0xf4, 0xa8, 0x9f,
+ 0xf2, 0x74, 0xaf, 0xb0, 0x58, 0x6b, 0x39, 0x98, 0xe5, 0xe1, 0xf5, 0x61,
+ 0xb4, 0x56, 0xc0, 0x26, 0xdc, 0xe2, 0x09, 0xdc, 0x16, 0xd9, 0xec, 0x81,
+ 0x3e, 0x8d, 0x3c, 0x79, 0x65, 0x9d, 0x56, 0x18, 0x6a, 0x30, 0x53, 0x60,
+ 0x0d, 0x3c, 0x06, 0x2d, 0xb6, 0x9a, 0x18, 0x0e, 0x81, 0xde, 0x2e, 0x02,
+ 0xba, 0x06, 0x5e, 0xe6, 0x9b, 0x42, 0xa8, 0x6c, 0x48, 0xd3, 0xcd, 0x95,
+ 0xb0, 0x9a, 0xc9, 0xa2, 0x6a, 0xbe, 0x45, 0xf9, 0x39, 0xb6, 0x5e, 0x64,
+ 0x7c, 0x40, 0x7d, 0x36, 0xa2, 0x8d, 0x16, 0xe2, 0x2d, 0x79, 0xda, 0x83,
+ 0x5a, 0xfa, 0x53, 0x00, 0x14, 0x36, 0xc3, 0xd8, 0x0b, 0x4f, 0xfa, 0x69,
+ 0x41, 0x5f, 0x7c, 0xf6, 0xd1, 0x10, 0x1b, 0xbd, 0x2e, 0x17, 0xad, 0x51,
+ 0x87, 0xaf, 0xe1, 0x98, 0xd6, 0x70, 0x76, 0x43, 0x34, 0x68, 0xae, 0xf9,
+ 0xe4, 0x12, 0x48, 0xf1, 0x0f, 0xe5, 0x50, 0x47, 0x81, 0x9d, 0xa6, 0xab,
+ 0x4a, 0xa3, 0x29, 0xb3, 0x55, 0x81, 0xf3, 0x34, 0xdf, 0x79, 0x56, 0x71,
+ 0x13, 0xd0, 0x18, 0xaf, 0xde, 0x5d, 0x32, 0xdd, 0x14, 0xc2, 0x5a, 0x4f,
+ 0xcf, 0x81, 0x59, 0x31, 0x17, 0xbf, 0xae, 0x77, 0x5e, 0x62, 0x57, 0x03,
+ 0xb2, 0x8c, 0xfd, 0xdf, 0x61, 0xe5, 0x5d, 0xc6, 0x95, 0xaa, 0x55, 0xbb,
+ 0x0d, 0x93, 0x7e, 0xb9, 0x55, 0xf1, 0x01, 0xeb, 0xa9, 0xb6, 0xdb, 0x78,
+ 0xfe, 0xbf, 0x61, 0xf6, 0xbd, 0x86, 0x52, 0x91, 0xa5, 0x51, 0xf4, 0xbd,
+ 0x96, 0x63, 0x9c, 0x08, 0x57, 0x0f, 0xcd, 0x13, 0x69, 0xa5, 0xa3, 0xd1,
+ 0xee, 0x2d, 0xa9, 0xe5, 0xc0, 0xd1, 0x3b, 0x5d, 0x26, 0x16, 0x75, 0x10,
+ 0x70, 0x08, 0x00, 0x7f, 0xd8, 0x34, 0x3a, 0x8c, 0xb2, 0x4a, 0x41, 0xaf,
+ 0x0f, 0x8c, 0x36, 0xa5, 0x47, 0x46, 0x68, 0x6b, 0x7b, 0x11, 0x71, 0xb1,
+ 0x9c, 0xd7, 0xa0, 0x83, 0x48, 0x02, 0x5a, 0xcc, 0x32, 0x6e, 0x38, 0x5a,
+ 0x2c, 0x26, 0xfb, 0xe7, 0x3d, 0xb5, 0x64, 0x81, 0xfa, 0x91, 0x1e, 0xfd,
+ 0x77, 0x7e, 0xe1, 0x9e, 0xab, 0x55, 0x44, 0x76, 0x22, 0x95, 0xff, 0xb3,
+ 0xa5, 0x67, 0xbd, 0xf5, 0x4d, 0x84, 0x34, 0xc2, 0x7b, 0xe6, 0x6f, 0xbf,
+ 0x55, 0x52, 0x27, 0x31, 0x8e, 0xa3, 0xf7, 0xad, 0xde, 0xb7, 0x7b, 0x77,
+ 0x06, 0xb2, 0xc8, 0xec, 0xf4, 0xd6, 0xdb, 0xad, 0xdf, 0x03, 0x9f, 0x09,
+ 0xc8, 0x4a, 0xaf, 0x1d, 0x8e, 0x01, 0x04, 0x8d, 0x68, 0xf2, 0xa8, 0xb5,
+ 0xb4, 0x33, 0xa1, 0xb0, 0x6a, 0x5a, 0x12, 0x7e, 0xfe, 0xe2, 0x7a, 0xd6,
+ 0x1c, 0x30, 0x81, 0xb7, 0x84, 0x8a, 0x5c, 0xbd, 0x63, 0x31, 0x7b, 0x50,
+ 0x8c, 0xf1, 0x45, 0x7f, 0x6e, 0xb7, 0x7f, 0x26, 0x0e, 0xdb, 0xa7, 0x42,
+ 0x7b, 0x0d, 0x06, 0x9f, 0x81, 0x79, 0x39, 0x38, 0x80, 0xd2, 0xe8, 0xe6,
+ 0xef, 0xdf, 0x39, 0x1b, 0x0d, 0x5d, 0x26, 0xd9, 0x71, 0x14, 0xb0, 0x9f,
+ 0xdc, 0x17, 0xa2, 0xa0, 0x8a, 0x70, 0x67, 0x28, 0x0e, 0x65, 0x6f, 0x0a,
+ 0x04, 0x4d, 0x69, 0xbb, 0x45, 0xf7, 0xcc, 0x7a, 0xc7, 0xb3, 0x38, 0x8c,
+ 0x0b, 0xab, 0x46, 0xc7, 0x4e, 0x62, 0x06, 0x65, 0x85, 0x06, 0xe8, 0x87,
+ 0x28, 0xe1, 0x99, 0x3d, 0x44, 0xc8, 0xcd, 0x05, 0xef, 0xc9, 0xa9, 0x9f,
+ 0x6d, 0xc9, 0x17, 0x2f, 0x9a, 0xa8, 0xb1, 0x78, 0x41, 0xf1, 0x09, 0x7a,
+ 0xe3, 0xd9, 0xc5, 0x3e, 0xf8, 0x18, 0xb3, 0xfb, 0x70, 0xef, 0x31, 0x01,
+ 0x0d, 0xc7, 0xd1, 0x28, 0x7d, 0xd2, 0x74, 0xe8, 0x50, 0x0c, 0x21, 0x3c,
+ 0x77, 0x3c, 0xa8, 0xec, 0x7f, 0x6d, 0x95, 0xd5, 0x18, 0x26, 0xfc, 0xe1,
+ 0x67, 0xa6, 0xb3, 0xe6, 0x27, 0x4b, 0x6a, 0x68, 0x46, 0x19, 0x4b, 0xa6,
+ 0xa4, 0x69, 0xa9, 0x51, 0x40, 0x44, 0x37, 0xc6, 0xd5, 0x47, 0x0e, 0xdc,
+ 0xb3, 0x27, 0x36, 0x75, 0x28, 0x66, 0x70, 0xc6, 0x41, 0x69, 0xd4, 0xa8,
+ 0xea, 0x97, 0x1b, 0x1c, 0xb2, 0xf3, 0x57, 0x78, 0x62, 0xfc, 0xc6, 0xad,
+ 0x02, 0xbe, 0x1a, 0xa0, 0x6c, 0x29, 0xd1, 0x40, 0x83, 0xa1, 0x39, 0x5b,
+ 0x21, 0x6d, 0xb9, 0x14, 0xd2, 0x53, 0xb6, 0x56, 0x41, 0x7d, 0x41, 0x21,
+ 0x38, 0x10, 0x4d, 0x28, 0x5f, 0xb6, 0xa0, 0xb4, 0x76, 0xcd, 0xdb, 0x6f,
+ 0xac, 0xfd, 0x7a, 0x29, 0x97, 0xe5, 0x14, 0x52, 0xc4, 0xc0, 0x97, 0x8d,
+ 0x81, 0xf3, 0xa6, 0x0e, 0x86, 0x83, 0xab, 0x04, 0x90, 0xc5, 0xfc, 0xd9,
+ 0xae, 0x00, 0xb7, 0xa3, 0x61, 0xd0, 0x29, 0x57, 0x56, 0xbf, 0xa7, 0xf9,
+ 0x8d, 0x7e, 0xc4, 0xb0, 0x64, 0xf4, 0x01, 0xf4, 0x6c, 0x27, 0xdb, 0x27,
+ 0x08, 0x52, 0xed, 0x44, 0xc7, 0x54, 0xc9, 0xaa, 0xbc, 0x16, 0x8f, 0xee,
+ 0x89, 0x17, 0xee, 0x70, 0x75, 0xaa, 0xa9, 0xb5, 0x62, 0x7f, 0x50, 0x35,
+ 0xc4, 0xae, 0xa3, 0x37, 0x6e, 0x48, 0x98, 0xa9, 0x89, 0x58, 0x4a, 0xcf,
+ 0x39, 0xad, 0x44, 0xbd, 0x71, 0x23, 0xe9, 0x0d, 0xc7, 0xbc, 0x55, 0xca,
+ 0x92, 0xd6, 0xaf, 0x4a, 0x47, 0x54, 0xd2, 0x76, 0xe2, 0x36, 0x6b, 0xb7,
+ 0x89, 0x2d, 0x5b, 0x55, 0x5c, 0xd5, 0xdf, 0xf0, 0xcd, 0xdf, 0x2f, 0xf6,
+ 0xab, 0xfa, 0x3f, 0x52, 0xc3, 0xa2, 0x91, 0x6b, 0x6d, 0xed, 0x30, 0x64,
+ 0xe7, 0x2e, 0x28, 0x8e, 0xff, 0xd0, 0x83, 0x88, 0x33, 0x4f, 0x51, 0x1a,
+ 0x9f, 0x1f, 0xa5, 0xd7, 0x05, 0xca, 0x43, 0x14, 0xde, 0xf7, 0x0c, 0x7d,
+ 0x50, 0x13, 0xd5, 0x42, 0x37, 0x1f, 0x92, 0xa5, 0x60, 0xb2, 0x5f, 0x06,
+ 0xe4, 0x55, 0xdb, 0x54, 0x63, 0xe2, 0xb1, 0x34, 0x89, 0xe5, 0xda, 0xae,
+ 0x95, 0x08, 0x87, 0xf1, 0xe0, 0x14, 0x7c, 0x28, 0x19, 0x8a, 0xce, 0xd2,
+ 0x18, 0xef, 0x3d, 0x95, 0x45, 0x17, 0xd1, 0xb3, 0x5c, 0x05, 0x74, 0x55,
+ 0x0d, 0x2a, 0xaa, 0x9c, 0x75, 0xab, 0xc8, 0xb8, 0x46, 0x7c, 0x2f, 0xec,
+ 0x36, 0x2d, 0xb5, 0xd1, 0xa2, 0x5e, 0xe7, 0xc9, 0xe5, 0xfe, 0x05, 0x00,
+ 0xba, 0x7f, 0xbc, 0x3a, 0x2b, 0x46, 0xb0, 0xa1, 0x15, 0x39, 0x45, 0xab,
+ 0x63, 0x42, 0x63, 0xd7, 0x5e, 0x11, 0xf2, 0xb0, 0xe6, 0x04, 0x7f, 0x52,
+ 0xa2, 0x43, 0xad, 0x5c, 0x3a, 0x60, 0xbf, 0x15, 0xe5, 0xd1, 0xb9, 0x97,
+ 0xf6, 0xf7, 0xf9, 0xd1, 0xf5, 0x43, 0xa4, 0x7d, 0x85, 0x2e, 0xad, 0x4e,
+ 0x16, 0x5f, 0xb4, 0x63, 0x44, 0x03, 0xe3, 0xcc, 0x8a, 0x4a, 0x39, 0x0e,
+ 0x61, 0x72, 0xef, 0xd2, 0x87, 0x7a, 0x2a, 0x59, 0x6a, 0xc1, 0x31, 0x96,
+ 0x1d, 0x70, 0xbb, 0x85, 0xe3, 0xb7, 0xb7, 0x61, 0x17, 0xc5, 0x43, 0x9b,
+ 0x7c, 0x79, 0x8f, 0x20, 0x12, 0x20, 0x28, 0x39, 0x61, 0x87, 0xfe, 0x71,
+ 0x08, 0xb1, 0x9a, 0x22, 0xdc, 0xa2, 0x90, 0x26, 0x80, 0x31, 0x36, 0xda,
+ 0xf3, 0x6a, 0xba, 0xac, 0x6a, 0x25, 0x8e, 0x77, 0xa2, 0x7a, 0x5b, 0xdf,
+ 0xf3, 0x11, 0x33, 0x8d, 0xe2, 0x00, 0xcc, 0xeb, 0x7f, 0x48, 0x94, 0x59,
+ 0xa7, 0xce, 0x97, 0x01, 0xb0, 0x53, 0x62, 0x8a, 0x82, 0x61, 0xd8, 0x62,
+ 0xfd, 0x80, 0x96, 0x0f, 0x34, 0x48, 0xe6, 0x04, 0xa3, 0x88, 0x36, 0x76,
+ 0xee, 0xe5, 0x9e, 0xec, 0xb4, 0x33, 0x96, 0xcc, 0xa3, 0x33, 0x15, 0x00,
+ 0x63, 0x67, 0x9e, 0x3c, 0x15, 0xe4, 0x5c, 0x58, 0xcd, 0xc6, 0x69, 0x30,
+ 0x85, 0x86, 0x32, 0x68, 0x09, 0x29, 0x6d, 0xec, 0xdd, 0x59, 0x46, 0xe0,
+ 0x6b, 0x86, 0x6a, 0x56, 0x28, 0x99, 0xab, 0xfc, 0xb9, 0x8f, 0x21, 0xc8,
+ 0x8f, 0xf2, 0xec, 0x33, 0x1b, 0xce, 0x4a, 0x33, 0xd5, 0x12, 0x5e, 0x9f,
+ 0x01, 0xde, 0x26, 0x49, 0x4e, 0xb1, 0xe3, 0x54, 0xdb, 0x13, 0x6f, 0x1b,
+ 0x23, 0x22, 0x4c, 0xd0, 0xd8, 0xe8, 0x13, 0xfb, 0x7e, 0xae, 0x49, 0x77,
+ 0xb4, 0x0d, 0x42, 0x59, 0xfa, 0x29, 0x7e, 0x13, 0xdb, 0x5e, 0xac, 0x11,
+ 0xa5, 0xfd, 0x91, 0x06, 0x0b, 0xbf, 0xe8, 0x13, 0x07, 0x55, 0xa4, 0x7c,
+ 0x48, 0xc4, 0x71, 0xe7, 0x13, 0x64, 0x93, 0xba, 0x39, 0xb4, 0xca, 0x97,
+ 0x10, 0x76, 0x99, 0x6b, 0x78, 0x8b, 0x23, 0x49, 0x03, 0xda, 0x12, 0xd5,
+ 0x9c, 0xcb, 0x19, 0x86, 0x1a, 0xb2, 0x3b, 0x80, 0x47, 0xa7, 0x50, 0x19,
+ 0x73, 0xfe, 0x06, 0x0c, 0xec, 0x99, 0xc3, 0x9a, 0x0b, 0x61, 0x9c, 0x16,
+ 0x8e, 0x83, 0xca, 0xa3, 0xc9, 0x7a, 0xd3, 0xad, 0x2a, 0xac, 0xb6, 0x5a,
+ 0x34, 0xf5, 0x9b, 0xb2, 0xfe, 0x3b, 0x2d, 0x7d, 0x6f, 0xd4, 0xa4, 0xd8,
+ 0xf2, 0xc0, 0xea, 0xef, 0x70, 0x96, 0x68, 0xfa, 0x6f, 0x77, 0xdc, 0xc5,
+ 0xfc, 0xb5, 0x07, 0x21, 0x18, 0xf5, 0xeb, 0x03, 0xb3, 0xa5, 0x00, 0xa9,
+ 0xdf, 0x58, 0xa2, 0xb0, 0xad, 0x0c, 0xc2, 0x5a, 0x0b, 0x87, 0x14, 0x6c,
+ 0x2e, 0xb5, 0x2b, 0xc6, 0xcc, 0xc8, 0x55, 0xbd, 0x63, 0xaa, 0xae, 0x15,
+ 0x2d, 0x31, 0x85, 0x89, 0xee, 0x1a, 0x82, 0xe0, 0x6e, 0x27, 0xa3, 0x46,
+ 0x50, 0x93, 0x1a, 0x90, 0xf6, 0x72, 0xb8, 0x34, 0x97, 0xfb, 0x31, 0x1f,
+ 0x47, 0x62, 0xcd, 0x2a, 0x51, 0x81, 0xc8, 0x77, 0x1c, 0xf5, 0xac, 0xe9,
+ 0x6a, 0x82, 0x00, 0x5a, 0x3d, 0xa0, 0xe1, 0xa6, 0x72, 0x1b, 0x36, 0x33,
+ 0x11, 0xd1, 0x72, 0xe4, 0x6d, 0x89, 0x8d, 0xc3, 0x46, 0x88, 0xbd, 0xf7,
+ 0x78, 0x32, 0x07, 0xca, 0xb4, 0x2b, 0x4c, 0x27, 0xf7, 0x2d, 0x64, 0x2d,
+ 0xbf, 0xc7, 0x8a, 0x3f, 0xed, 0x3a, 0x15, 0x0e, 0x61, 0x08, 0x4e, 0xca,
+ 0x76, 0x17, 0xaa, 0x4e, 0x45, 0x08, 0xce, 0xcc, 0x78, 0xe3, 0x5e, 0xce,
+ 0x90, 0x4d, 0xc5, 0x1f, 0xe4, 0x16, 0x67, 0xed, 0x2c, 0xf3, 0xf1, 0x5e,
+ 0xce, 0xeb, 0x29, 0x92, 0xc2, 0x1c, 0xe3, 0x7c, 0x4e, 0x7d, 0xe9, 0x6f,
+ 0xad, 0xfa, 0x30, 0x35, 0x86, 0x11, 0xab, 0x0b, 0xa8, 0xad, 0xa3, 0x88,
+ 0x47, 0xf5, 0x36, 0x5b, 0xbb, 0xa7, 0x5f, 0x88, 0xf6, 0xd9, 0x6b, 0x74,
+ 0xd6, 0xe9, 0x6c, 0x07, 0x64, 0x6f, 0xd5, 0x2f, 0xa3, 0xe4, 0xbc, 0xf6,
+ 0xc9, 0xe5, 0xde, 0x2b, 0x50, 0xac, 0xf7, 0x0c, 0x02, 0x5b, 0x3a, 0x0c,
+ 0x52, 0xc2, 0x76, 0x4b, 0xe1, 0xb1, 0x63, 0xcb, 0x44, 0xc9, 0x1a, 0xb6,
+ 0xbb, 0x91, 0xe2, 0x22, 0x75, 0x49, 0x6d, 0x84, 0x98, 0x70, 0xab, 0xb8,
+ 0x0a, 0x5b, 0x79, 0x64, 0xe8, 0xde, 0x52, 0xa0, 0x04, 0x1b, 0x78, 0x22,
+ 0xc0, 0xe9, 0xd0, 0x9d, 0xf1, 0x24, 0x79, 0x44, 0xe2, 0x11, 0xda, 0x21,
+ 0xcc, 0xc6, 0xf9, 0x13, 0x88, 0x19, 0xa3, 0x4b, 0xd2, 0x6b, 0x3d, 0x2a,
+ 0xfd, 0x01, 0xad, 0xa4, 0x80, 0x93, 0x5c, 0xea, 0xb6, 0x99, 0x27, 0x45,
+ 0x3d, 0x2b, 0xa7, 0x17, 0xa5, 0xb5, 0xbd, 0x27, 0xfb, 0x4e, 0xe3, 0x16,
+ 0x20, 0x7c, 0x81, 0xb3, 0x38, 0x8e, 0x0d, 0x80, 0x65, 0x7f, 0x26, 0x07,
+ 0x22, 0xe3, 0x80, 0x0c, 0x4a, 0x25, 0x23, 0xae, 0x65, 0x1a, 0xc9, 0x45,
+ 0xfc, 0xc7, 0x80, 0xf9, 0x55, 0x0f, 0xcd, 0xa3, 0xbe, 0xcb, 0x3c, 0x8a,
+ 0xe7, 0x92, 0xe6, 0xd8, 0x7a, 0x51, 0x3f, 0x99, 0x84, 0xfc, 0xa1, 0x32,
+ 0x33, 0x2b, 0x3d, 0x8c, 0x82, 0x7a, 0x5c, 0xe0, 0x2b, 0x91, 0xd8, 0xad,
+ 0x48, 0x39, 0xb6, 0xc9, 0x8f, 0xb2, 0x17, 0x08, 0xba, 0xb9, 0x6e, 0x81,
+ 0x67, 0x8a, 0x96, 0x51, 0x0c, 0xa7, 0xd9, 0xa9, 0x4a, 0x39, 0xe5, 0xc7,
+ 0x3b, 0x2c, 0xc4, 0xdf, 0x89, 0xa5, 0x39, 0x99, 0xa7, 0x40, 0x42, 0xde,
+ 0x0b, 0x38, 0xec, 0xb6, 0xce, 0x90, 0xf7, 0xeb, 0xe6, 0x27, 0x3f, 0xbe,
+ 0xfb, 0x6d, 0x8a, 0x05, 0x58, 0x1d, 0xbe, 0xbf, 0x9d, 0x26, 0x10, 0xe3,
+ 0x31, 0x7f, 0x02, 0x78, 0x51, 0x74, 0xdf, 0x12, 0x1f, 0xde, 0xc6, 0x92,
+ 0x53, 0x1e, 0x47, 0x4f, 0xa7, 0x04, 0x01, 0x1c, 0xea, 0x0b, 0x71, 0x4d,
+ 0xe0, 0x6d, 0xde, 0x89, 0x2e, 0x0d, 0x3b, 0x0d, 0xcc, 0xd6, 0xa3, 0x09,
+ 0xce, 0x0b, 0x71, 0x33, 0xf3, 0x85, 0x6d, 0x3a, 0xe7, 0x50, 0x40, 0x21,
+ 0x5d, 0x0b, 0x58, 0xfe, 0x60, 0xc8, 0xa8, 0xdf, 0x8e, 0xa3, 0x7e, 0xd8,
+ 0x07, 0x58, 0x0f, 0x95, 0xae, 0xdb, 0x1e, 0x13, 0x5d, 0x04, 0xdb, 0x16,
+ 0x13, 0x12, 0x41, 0x44, 0x16, 0x93, 0x8c, 0xff, 0xc6, 0xf3, 0x53, 0x3a,
+ 0x83, 0x00, 0x30, 0x21, 0x4b, 0xef, 0x08, 0x29, 0x98, 0xf0, 0x1f, 0x6d,
+ 0x66, 0xa7, 0x58, 0xe0, 0x4c, 0xd8, 0xae, 0x9d, 0xdb, 0x7a, 0x9b, 0xa6,
+ 0xb6, 0xa4, 0x8a, 0x92, 0x82, 0xa2, 0x03, 0x8d, 0xd9, 0x38, 0xd1, 0x84,
+ 0xe4, 0x38, 0x44, 0xb3, 0x2c, 0xdb, 0x66, 0xba, 0x47, 0x35, 0x4e, 0xf6,
+ 0xd9, 0x8a, 0x30, 0xe3, 0x48, 0x94, 0x59, 0xce, 0xb7, 0x22, 0xd7, 0x44,
+ 0xb1, 0x7e, 0x71, 0xf7, 0x1f, 0xdc, 0xd7, 0x6f, 0x85, 0x74, 0x08, 0x17,
+ 0x7a, 0xdb, 0xe1, 0x6f, 0x71, 0x6d, 0xb0, 0x33, 0x5c, 0xbb, 0x15, 0xaa,
+ 0xc5, 0xbc, 0x9f, 0xc9, 0x14, 0x2d, 0xb9, 0xe2, 0x22, 0x4b, 0x52, 0xa8,
+ 0xbc, 0x07, 0xd6, 0xfb, 0x5e, 0x35, 0x2c, 0xfb, 0xfc, 0x17, 0x87, 0x52,
+ 0x15, 0xa8, 0x3b, 0x25, 0x3c, 0x37, 0x0e, 0xa8, 0xf6, 0xed, 0x06, 0x8d,
+ 0x6c, 0x87, 0x94, 0xa3, 0xd8, 0x04, 0x55, 0x3c, 0xd6, 0xc9, 0xe5, 0x11,
+ 0xbb, 0xf9, 0xd1, 0x21, 0x67, 0x06, 0x74, 0xf2, 0x0e, 0x6c, 0x15, 0xca,
+ 0x7a, 0x27, 0xf4, 0x0c, 0xc5, 0x70, 0xb6, 0xbd, 0x3d, 0x34, 0x61, 0x8f,
+ 0x40, 0x7c, 0x86, 0x1f, 0x8a, 0x33, 0xe6, 0x81, 0x02, 0xd7, 0xf4, 0xfd,
+ 0xbd, 0x03, 0xb6, 0x8e, 0x7b, 0xe7, 0x0a, 0xe8, 0xb5, 0xba, 0x6a, 0xb9,
+ 0x40, 0xa3, 0x50, 0x98, 0x81, 0x00, 0x85, 0x00, 0x86, 0x00, 0x40, 0x96,
+ 0xf0, 0x01, 0x17, 0x86, 0x00, 0x48, 0x7f, 0x1a, 0xfe, 0xdf, 0x93, 0xdd,
+ 0x5a, 0x96, 0x15, 0x51, 0xf8, 0x02, 0x7e, 0x53, 0xe3, 0x75, 0x4f, 0x5d,
+ 0xd3, 0xbb, 0x36, 0xa0, 0xdf, 0x62, 0xf8, 0xee, 0xfc, 0x15, 0x75, 0x99,
+ 0x33, 0x4d, 0xd5, 0xbd, 0x37, 0xa6, 0xe9, 0x9f, 0x2b, 0x34, 0x5d, 0x4e,
+ 0x52, 0xf0, 0x83, 0xea, 0xf8, 0x61, 0xa1, 0xd7, 0xa9, 0xce, 0xf5, 0x11,
+ 0x3b, 0xf9, 0x66, 0x17, 0xb1, 0x9c, 0x59, 0xb7, 0x1d, 0xdc, 0x99, 0xce,
+ 0x3f, 0x94, 0xcd, 0xfa, 0x60, 0x00, 0x00, 0x00, 0x05, 0x30, 0x7f, 0x70,
+ 0xb9, 0x14, 0x96, 0x64, 0x7d, 0xfa, 0xfe, 0x53, 0x74, 0x3e, 0xcb, 0x80,
+ 0x5d, 0x04, 0xe0, 0x7a, 0x8a, 0xbe, 0x8c, 0xdf, 0x4d, 0xde, 0xfd, 0x1a,
+ 0xe1, 0xda, 0x61, 0x04, 0x5b, 0x50, 0xda, 0x5b, 0x7e, 0xc2, 0x5a, 0xb5,
+ 0xb7, 0x0d, 0x9a, 0xf8, 0xae, 0x47, 0x8e, 0x24, 0x6b, 0x46, 0x5a, 0xae,
+ 0x9e, 0xd2, 0x7d, 0xbf, 0x08, 0x0c, 0x31, 0x19, 0xf3, 0x60, 0x07, 0x8e,
+ 0xd9, 0x46, 0x88, 0x68, 0xe6, 0x66, 0x8e, 0xe6, 0x86, 0xd7, 0xaf, 0xf7,
+ 0x3e, 0x60, 0x3a, 0x9b, 0xe5, 0x1e, 0xa0, 0x00, 0xd6, 0xf8, 0x0f, 0xc6,
+ 0xb8, 0x50, 0x84, 0x76, 0x4e, 0x4e, 0x97, 0xf3, 0x28, 0x78, 0xd0, 0xbb,
+ 0x04, 0x6f, 0x79, 0xdf, 0x81, 0xbb, 0x0f, 0xe5, 0xad, 0xd7, 0xd7, 0xa1,
+ 0x78, 0x20, 0x6b, 0xe7, 0xff, 0xd7, 0xfa, 0x6d, 0xa0, 0xe8, 0x4b, 0xde,
+ 0x39, 0x60, 0x51, 0x1a, 0x03, 0xf4, 0xd2, 0xdd, 0xbb, 0xb7, 0xa1, 0x63,
+ 0x70, 0x1e, 0x10, 0x80, 0x40, 0xf2, 0x5f, 0x4c, 0x1c, 0xf3, 0xd6, 0xa5,
+ 0xd5, 0x5e, 0xba, 0xec, 0x08, 0xf8, 0x5b, 0x3f, 0x2f, 0xbd, 0x8a, 0xed,
+ 0x7b, 0x4b, 0xc8, 0xe3, 0x55, 0x71, 0x64, 0x68, 0x45, 0x2b, 0x13, 0x87,
+ 0x1f, 0xfa, 0xa8, 0x86, 0x92, 0xda, 0xa8, 0xf0, 0x02, 0x2b, 0x6b, 0xfb,
+ 0xb2, 0xb9, 0x3d, 0x3b, 0xbb, 0xb7, 0xed, 0x87, 0x3d, 0xc0, 0x81, 0xd6,
+ 0x30, 0x8a, 0xd8, 0x1f, 0xb9, 0x3e, 0xfa, 0xc4, 0x2f, 0xd6, 0xef, 0x50,
+ 0xc7, 0x40, 0xa4, 0x30, 0x41, 0xe1, 0xa5, 0xd6, 0x26, 0x5f, 0xac, 0xdb,
+ 0x44, 0x69, 0xdc, 0x66, 0x55, 0x5b, 0x59, 0xe3, 0xff, 0xc1, 0xd2, 0xc3,
+ 0xbb, 0x78, 0x04, 0x55, 0xd9, 0x5d, 0x64, 0x42, 0x87, 0x86, 0xcd, 0xc5,
+ 0xcf, 0xc9, 0xbd, 0x24, 0x77, 0x16, 0xbb, 0x1e, 0x8e, 0x92, 0x6e, 0x9e,
+ 0x72, 0xb6, 0xe3, 0xd0, 0x41, 0xac, 0x91, 0x49, 0xd2, 0x20, 0x38, 0x3a,
+ 0xcc, 0xcf, 0xf6, 0x81, 0x85, 0xee, 0x68, 0x6e, 0x90, 0xac, 0x5a, 0x9e,
+ 0x50, 0x41, 0x9d, 0xf8, 0xe8, 0xc4, 0x31, 0x05, 0x2a, 0x1c, 0x2e, 0x66,
+ 0x90, 0xd5, 0xcc, 0x76, 0xb3, 0x3d, 0x20, 0xd4, 0xd1, 0x84, 0x5c, 0x76,
+ 0xaa, 0x54, 0x5c, 0x89, 0xb7, 0xe8, 0x6c, 0x4b, 0x35, 0x24, 0x2d, 0xd9,
+ 0xe3, 0xdc, 0x18, 0x9b, 0xdf, 0x12, 0xdf, 0xe5, 0x3f, 0xe9, 0x07, 0x66,
+ 0x29, 0x7f, 0x09, 0x0f, 0x66, 0xc9, 0x4b, 0x25, 0xce, 0x51, 0xb4, 0x9e,
+ 0xea, 0x32, 0xef, 0xf1, 0x13, 0x60, 0xdd, 0xe8, 0xe7, 0x93, 0xf0, 0x56,
+ 0x46, 0x0b, 0x95, 0x47, 0xfe, 0x17, 0xd5, 0xc7, 0x7c, 0x7a, 0xae, 0xac,
+ 0x94, 0x2a, 0x63, 0x9f, 0x5f, 0x39, 0x3e, 0xae, 0xd7, 0xa1, 0x62, 0x5b,
+ 0xc8, 0xb1, 0x00, 0xd3, 0x22, 0x76, 0x9d, 0x37, 0x0c, 0x3d, 0x33, 0xa1,
+ 0xcc, 0xf0, 0x11, 0x1f, 0x1f, 0x7e, 0x74, 0x05, 0x9d, 0x45, 0xcc, 0xc7,
+ 0x30, 0xc7, 0x1a, 0xa7, 0x72, 0x18, 0x07, 0x22, 0x72, 0xd4, 0xbe, 0xaa,
+ 0xe0, 0xf1, 0x23, 0x2f, 0x15, 0x5e, 0xbd, 0x94, 0xcb, 0x98, 0x9d, 0xa0,
+ 0x81, 0xe1, 0x4a, 0x53, 0x91, 0x8f, 0x50, 0x58, 0x34, 0x2a, 0xce, 0x26,
+ 0xac, 0x4d, 0x1a, 0xbc, 0xca, 0x03, 0xd0, 0x4c, 0x42, 0x12, 0x9e, 0x20,
+ 0x61, 0xcf, 0xcf, 0x46, 0x31, 0xcb, 0x92, 0x25, 0xde, 0x5a, 0xcd, 0x64,
+ 0x52, 0xb5, 0xfc, 0xeb, 0x4e, 0x6f, 0xf6, 0xae, 0x72, 0x8b, 0x00, 0xac,
+ 0x7d, 0x2e, 0x5e, 0xfc, 0xd0, 0x91, 0xfa, 0x41, 0xf4, 0xbb, 0xbc, 0xd7,
+ 0xe9, 0x76, 0x57, 0xf3, 0xed, 0x16, 0x6f, 0xb1, 0xc9, 0xeb, 0x96, 0x09,
+ 0x02, 0x27, 0x7a, 0xcd, 0xd3, 0x6b, 0x82, 0x98, 0xd4, 0xb2, 0xca, 0x2b,
+ 0x58, 0x29, 0x0b, 0x11, 0xeb, 0xcb, 0xa7, 0xca, 0x29, 0x50, 0x43, 0xe4,
+ 0x2f, 0x67, 0xb3, 0x7c, 0xb7, 0xbc, 0xf8, 0xbb, 0xc2, 0x72, 0xac, 0x65,
+ 0xf8, 0x7c, 0x26, 0xf1, 0x33, 0x92, 0xd6, 0x2d, 0x26, 0xba, 0x99, 0x38,
+ 0xa2, 0x6d, 0xc8, 0xba, 0x13, 0x5f, 0x30, 0x6b, 0xe6, 0x90, 0x80, 0x86,
+ 0x90, 0xb1, 0x8a, 0x49, 0xdc, 0x97, 0x42, 0x3a, 0xaf, 0x17, 0x97, 0x3b,
+ 0xf9, 0xcb, 0x3a, 0x32, 0x61, 0x32, 0x24, 0x47, 0x94, 0xce, 0xf0, 0xfb,
+ 0x22, 0x87, 0x54, 0x4f, 0x6b, 0xf1, 0x8b, 0xaa, 0x97, 0xce, 0xa2, 0xc8,
+ 0xd7, 0x3f, 0x0d, 0x11, 0x32, 0xd1, 0x3f, 0xc5, 0x62, 0x69, 0x31, 0x1a,
+ 0xfd, 0x2e, 0x4b, 0xc3, 0xdf, 0xb6, 0xf5, 0x33, 0x93, 0x2c, 0x55, 0x10,
+ 0x83, 0xaf, 0xf2, 0xd4, 0xe2, 0x5c, 0x55, 0xc9, 0xf5, 0x5f, 0x71, 0xdc,
+ 0x10, 0xef, 0xf3, 0x3d, 0xfd, 0xa6, 0xd1, 0x61, 0x1f, 0x15, 0x5a, 0x89,
+ 0xd1, 0xb0, 0x6d, 0xc5, 0x7c, 0x1c, 0x94, 0x2a, 0xd5, 0xa8, 0xcd, 0x4e,
+ 0x0a, 0x74, 0x06, 0x8e, 0x41, 0x6e, 0x5e, 0x66, 0x6a, 0x1e, 0x30, 0xa6,
+ 0xba, 0x8c, 0x76, 0xbe, 0x06, 0x68, 0x9b, 0xcb, 0xa8, 0x42, 0x0f, 0x0d,
+ 0x73, 0x70, 0xb4, 0x67, 0x3d, 0xed, 0x61, 0x19, 0xbf, 0x95, 0xa3, 0x8f,
+ 0x7b, 0x9a, 0xa8, 0x47, 0xd5, 0x99, 0x8f, 0xc7, 0x2c, 0xcd, 0xf4, 0xd4,
+ 0x6b, 0xb8, 0xe7, 0xb2, 0xd5, 0xb6, 0xa8, 0x73, 0x60, 0x25, 0x4f, 0xab,
+ 0x41, 0x07, 0x7b, 0x45, 0x2f, 0x62, 0x0a, 0xb3, 0x78, 0xa4, 0x75, 0x53,
+ 0x4a, 0xe1, 0x1b, 0xee, 0x01, 0xd7, 0x95, 0x65, 0xfa, 0x12, 0x98, 0x1b,
+ 0xdb, 0x9d, 0xae, 0x1e, 0xd2, 0x86, 0xa1, 0x36, 0xc3, 0x73, 0x93, 0x79,
+ 0x40, 0x50, 0x4a, 0xd3, 0x49, 0x9f, 0x96, 0x0a, 0x92, 0xfe, 0xff, 0xd2,
+ 0x07, 0x96, 0xc0, 0x2d, 0xab, 0xde, 0xad, 0xaf, 0xc4, 0x96, 0xb7, 0x55,
+ 0x31, 0x7c, 0x61, 0x70, 0x6b, 0x32, 0xcd, 0x65, 0x72, 0x9c, 0xa8, 0x71,
+ 0x07, 0x36, 0xc2, 0x34, 0x19, 0xbe, 0x1a, 0x7d, 0x49, 0x89, 0x07, 0xb0,
+ 0xdf, 0xf2, 0x0c, 0xab, 0x64, 0x5a, 0x99, 0xf4, 0x26, 0xe9, 0x48, 0x95,
+ 0x7a, 0x6c, 0xda, 0xf7, 0x2b, 0x6d, 0x88, 0x07, 0x32, 0xc8, 0x02, 0x62,
+ 0x2c, 0xe4, 0xfe, 0xef, 0x4a, 0x4f, 0x98, 0xf4, 0xbb, 0x49, 0xd8, 0x2d,
+ 0x23, 0x77, 0x10, 0x03, 0x20, 0x13, 0x7a, 0x05, 0xc7, 0x99, 0x54, 0xec,
+ 0x3e, 0x48, 0x4f, 0x5a, 0xe3, 0xda, 0x66, 0xe4, 0xea, 0x4d, 0xbd, 0x57,
+ 0xb7, 0x9d, 0xce, 0x12, 0x5b, 0x3c, 0xa2, 0xb8, 0x24, 0x17, 0x4f, 0x7f,
+ 0x95, 0xbd, 0xfb, 0xaa, 0x59, 0xce, 0x7c, 0xfc, 0xb8, 0x30, 0xe2, 0x7f,
+ 0xbe, 0x3c, 0x04, 0xfe, 0x1c, 0x62, 0xa9, 0x48, 0x54, 0x90, 0xf2, 0x24,
+ 0x82, 0xdd, 0xd9, 0xc9, 0x69, 0x74, 0x17, 0xc9, 0x2e, 0xf5, 0x58, 0xdc,
+ 0xb5, 0xa4, 0x43, 0x74, 0x9c, 0x11, 0x29, 0x80, 0x23, 0x60, 0x19, 0x03,
+ 0xfe, 0xcb, 0x33, 0x98, 0x53, 0xb9, 0x10, 0xba, 0xc8, 0x7f, 0xa2, 0x95,
+ 0x57, 0x6b, 0x9b, 0x37, 0x5f, 0x52, 0x5e, 0x09, 0x65, 0x6d, 0x09, 0x74,
+ 0xdc, 0x6a, 0x03, 0xb3, 0x64, 0x01, 0x35, 0x19, 0xee, 0xb1, 0xe4, 0x82,
+ 0xba, 0xf0, 0x14, 0x05, 0x44, 0xfa, 0x81, 0x07, 0xd4, 0xd5, 0xc1, 0x4f,
+ 0xe8, 0xd0, 0xd1, 0xcb, 0xd9, 0xa2, 0x31, 0xa3, 0x53, 0x5d, 0x48, 0x24,
+ 0xbd, 0xd8, 0x38, 0xaa, 0x72, 0x92, 0x28, 0xdb, 0x8b, 0x65, 0x51, 0x05,
+ 0xf3, 0x50, 0xad, 0xa3, 0xa1, 0x57, 0xd3, 0x36, 0x4b, 0xbd, 0x50, 0xf0,
+ 0xe2, 0xf6, 0x11, 0xce, 0xc7, 0x97, 0x74, 0x5e, 0x2a, 0xf2, 0xde, 0x83,
+ 0xdf, 0xf2, 0xe8, 0x10, 0xe2, 0x02, 0x68, 0x4c, 0xfe, 0x55, 0x61, 0xf4,
+ 0x91, 0x4c, 0x56, 0x0a, 0x43, 0xbc, 0x49, 0xea, 0xf6, 0x9a, 0x63, 0x35,
+ 0xa1, 0x99, 0xa0, 0xfd, 0x2a, 0x19, 0xfc, 0x47, 0x82, 0x52, 0x03, 0x18,
+ 0xe5, 0xa7, 0xa6, 0xd1, 0x53, 0x7f, 0xc6, 0x7d, 0x04, 0x15, 0x81, 0xd4,
+ 0x67, 0x55, 0x07, 0x3b, 0x81, 0x5e, 0x85, 0x99, 0xf0, 0xbd, 0x29, 0x6e,
+ 0x38, 0x97, 0x34, 0x30, 0x30, 0xc3, 0x75, 0x55, 0x3d, 0xf2, 0x6a, 0xdb,
+ 0x25, 0x3e, 0x33, 0x82, 0xd0, 0x91, 0x19, 0x8c, 0x01, 0xeb, 0x56, 0x11,
+ 0x46, 0x28, 0x9a, 0x8c, 0xf8, 0x43, 0x1a, 0x60, 0x6c, 0x18, 0x55, 0x05,
+ 0x6c, 0x44, 0x20, 0xe0, 0x4b, 0x45, 0xf1, 0x18, 0x2c, 0x03, 0xf9, 0xce,
+ 0x77, 0x86, 0x91, 0x0e, 0xd3, 0xd9, 0x1a, 0x67, 0x60, 0x19, 0x52, 0xbc,
+ 0xa1, 0x0f, 0xbd, 0x2e, 0x0a, 0xba, 0xf7, 0x1d, 0x51, 0x4a, 0x16, 0xc6,
+ 0xf7, 0xc1, 0x40, 0x64, 0x50, 0x9b, 0xf2, 0x5a, 0x66, 0x4a, 0x6b, 0x04,
+ 0x56, 0x2f, 0x26, 0x7b, 0x11, 0x3f, 0xb9, 0xf0, 0xe8, 0xc2, 0xa5, 0x61,
+ 0x1c, 0xff, 0xff, 0x5b, 0xc5, 0x53, 0x32, 0x6c, 0xeb, 0xab, 0x2b, 0x4d,
+ 0x0d, 0xe3, 0x73, 0x87, 0xdc, 0x48, 0x54, 0xcf, 0xc3, 0x21, 0x98, 0x29,
+ 0xbb, 0x19, 0x29, 0x81, 0xd8, 0x71, 0xbe, 0xad, 0xa8, 0xab, 0xbd, 0x1e,
+ 0xc6, 0x82, 0x6f, 0x68, 0x37, 0x42, 0x5b, 0xa3, 0x1e, 0x87, 0xe2, 0x6d,
+ 0x51, 0x75, 0x4b, 0x6f, 0x92, 0x94, 0x31, 0xe6, 0xbe, 0xf9, 0xf7, 0x68,
+ 0x30, 0x68, 0x7d, 0x07, 0xe9, 0x56, 0x8b, 0xe8, 0x1c, 0x57, 0xaf, 0xe0,
+ 0xb4, 0x7f, 0x61, 0xea, 0x86, 0xa3, 0x4c, 0xdf, 0xe4, 0xc2, 0x71, 0xc2,
+ 0xd8, 0x19, 0x4d, 0x31, 0x2e, 0xd6, 0x43, 0x15, 0x49, 0xd9, 0x2e, 0x60,
+ 0x01, 0x64, 0x51, 0x12, 0x21, 0x11, 0x93, 0x13, 0x57, 0x18, 0xd1, 0x8b,
+ 0xa4, 0x1c, 0xe8, 0x3a, 0xdd, 0x63, 0x52, 0x41, 0x34, 0x35, 0x75, 0x20,
+ 0xc7, 0x03, 0x7d, 0x44, 0x8a, 0xd7, 0x51, 0x2a, 0x64, 0xb7, 0x29, 0x31,
+ 0xab, 0xab, 0x0c, 0x9c, 0x0d, 0x40, 0xd5, 0x57, 0x96, 0xee, 0x21, 0x96,
+ 0xa6, 0x23, 0x19, 0xd5, 0x62, 0x49, 0x47, 0xfa, 0x67, 0x5a, 0xaa, 0x07,
+ 0xcf, 0xce, 0x3f, 0x4b, 0x14, 0x00, 0x00, 0x00, 0x02, 0x04, 0x7f, 0x6e,
+ 0xb3, 0xbd, 0xea, 0x91, 0xf0, 0x1b, 0xe1, 0x32, 0x4f, 0xa1, 0xe2, 0xe9,
+ 0xbe, 0x34, 0x23, 0xf2, 0xb7, 0x11, 0x1b, 0x03, 0x5c, 0x46, 0x5c, 0xbd,
+ 0xc1, 0x41, 0x3f, 0x93, 0x49, 0xe4, 0xf8, 0xd0, 0xd0, 0x4a, 0x3a, 0x5c,
+ 0xf3, 0x20, 0x16, 0x81, 0xad, 0xa2, 0x55, 0xc3, 0xd1, 0x50, 0x4f, 0x2c,
+ 0x81, 0xe7, 0x35, 0xde, 0xa6, 0x9f, 0xa1, 0x49, 0xf4, 0x90, 0x9b, 0x19,
+ 0x6a, 0xb9, 0x2c, 0x95, 0x61, 0x21, 0xdc, 0x3b, 0x37, 0x1d, 0x3f, 0xab,
+ 0x40, 0x64, 0x6a, 0x8d, 0x76, 0x34, 0x17, 0xa0, 0x72, 0x11, 0x3d, 0x32,
+ 0xbf, 0xa6, 0xf9, 0xf6, 0xb3, 0x9c, 0xda, 0xd5, 0x32, 0x89, 0xf5, 0xbf,
+ 0xb8, 0x65, 0xb4, 0x4c, 0x87, 0xfd, 0x14, 0x47, 0x82, 0x84, 0x96, 0xde,
+ 0x9e, 0xd1, 0x3e, 0x2d, 0xfb, 0x3e, 0x13, 0xcd, 0xee, 0xba, 0x51, 0x6e,
+ 0x0d, 0x68, 0x85, 0xdc, 0xe3, 0x9e, 0xfd, 0xd7, 0x7d, 0xb0, 0x94, 0xc1,
+ 0x70, 0x7c, 0x6d, 0x85, 0x3d, 0x02, 0xc7, 0x84, 0xd3, 0xae, 0x86, 0x34,
+ 0x38, 0xfe, 0x80, 0x1e, 0xad, 0xc6, 0xba, 0xf1, 0x5f, 0xe2, 0x3b, 0x86,
+ 0x48, 0x49, 0x0e, 0x30, 0x9b, 0x83, 0xff, 0xe5, 0x89, 0xf3, 0x5b, 0xb7,
+ 0x7e, 0x12, 0x3b, 0x25, 0x61, 0x85, 0xbd, 0xaf, 0xb8, 0xaf, 0x91, 0xd1,
+ 0x99, 0xa4, 0xcb, 0x6c, 0x92, 0x4a, 0xf4, 0x94, 0xbf, 0x91, 0xa6, 0xc1,
+ 0x63, 0x40, 0xa7, 0x09, 0x7d, 0x47, 0xd4, 0x36, 0x71, 0x27, 0x8c, 0x2d,
+ 0x78, 0xf7, 0x41, 0x5c, 0x8f, 0xbc, 0x31, 0xf6, 0x9e, 0xd6, 0xdd, 0x50,
+ 0x81, 0x3a, 0x02, 0xf7, 0x8d, 0x9a, 0xfd, 0xd5, 0x64, 0xac, 0x42, 0xa7,
+ 0x87, 0xbd, 0xf5, 0xf0, 0x27, 0x0f, 0xf0, 0x0e, 0x22, 0x8f, 0x9c, 0x30,
+ 0xdc, 0xdc, 0x06, 0x35, 0xa1, 0xcd, 0x10, 0xc5, 0x84, 0xb5, 0x3a, 0x3c,
+ 0x7c, 0xa3, 0xa7, 0xc3, 0x5e, 0xaf, 0x69, 0xf2, 0xa4, 0xab, 0x8a, 0xf7,
+ 0xf4, 0x69, 0xfe, 0x41, 0x90, 0x5f, 0xa8, 0xc9, 0x49, 0xc1, 0x6e, 0x5f,
+ 0x10, 0x3a, 0x80, 0x7d, 0x76, 0x04, 0x08, 0x2f, 0x9f, 0x53, 0xf6, 0x51,
+ 0xd6, 0x41, 0x83, 0xc9, 0x34, 0x11, 0x47, 0x53, 0xc7, 0xae, 0xd7, 0xc4,
+ 0xb6, 0x3e, 0x16, 0x16, 0x0f, 0x60, 0x7f, 0xf6, 0x2e, 0xaf, 0x4b, 0xd0,
+ 0xdc, 0xab, 0xfe, 0x70, 0xba, 0xb9, 0xc4, 0x81, 0xd0, 0xbc, 0x88, 0xfa,
+ 0x71, 0xeb, 0x1b, 0xfe, 0x9a, 0x70, 0x9d, 0xfb, 0xbd, 0x73, 0x79, 0x44,
+ 0xcf, 0x49, 0xed, 0x20, 0x47, 0x48, 0x61, 0x82, 0x0c, 0xf6, 0x0a, 0x12,
+ 0x16, 0xcb, 0x08, 0xcf, 0xc8, 0x26, 0x2c, 0x1a, 0x1e, 0x6d, 0xa2, 0x86,
+ 0x6a, 0x0e, 0x63, 0x98, 0xa8, 0xcf, 0xb0, 0x5b, 0x07, 0x1d, 0x78, 0x57,
+ 0xc6, 0x6a, 0x73, 0x03, 0xb5, 0xa4, 0x47, 0x6c, 0xe5, 0x3d, 0x6e, 0x82,
+ 0xdd, 0x41, 0xca, 0x4e, 0xe1, 0x28, 0x9b, 0x2b, 0x5f, 0xdf, 0xa2, 0xba,
+ 0x5c, 0xaf, 0xae, 0x0b, 0xe0, 0xbb, 0x13, 0x7e, 0x0e, 0x49, 0x85, 0x10,
+ 0x06, 0xdd, 0xe6, 0x8d, 0x1a, 0x82, 0x5f, 0xd6, 0xf8, 0x8f, 0x13, 0xa6,
+ 0x1e, 0x26, 0xc7, 0x78, 0x18, 0x3f, 0xe4, 0xe2, 0xae, 0x26, 0x6d, 0xf9,
+ 0xae, 0xcd, 0xc4, 0xe1, 0x9f, 0x1a, 0x80, 0x3a, 0x92, 0x5b, 0x37, 0x0a,
+ 0xae, 0xc5, 0xee, 0x43, 0xd8, 0x1e, 0x2d, 0xbc, 0x2a, 0xb2, 0x34, 0xfe,
+ 0xd4, 0x41, 0xb1, 0xe7, 0xc5, 0x0f, 0xb3, 0xbf, 0x3a, 0xc2, 0x2d, 0xe5,
+ 0x4e, 0xd3, 0x1c, 0x6c, 0x18, 0xc0, 0x66, 0x52, 0x47, 0x2d, 0x2f, 0xf3,
+ 0x6d, 0x99, 0xbe, 0xc9, 0x67, 0xfe, 0xe2, 0x32, 0xd9, 0xff, 0x91, 0xa7,
+ 0x44, 0x3c, 0xe2, 0xe4, 0xde, 0x06, 0xce, 0x1f, 0x11, 0x7b, 0xaf, 0x18,
+ 0x6f, 0xdc, 0xc4, 0xeb, 0x93, 0x01, 0x6f, 0xb7, 0x04, 0x00, 0x00, 0x00,
+ 0x01, 0x1e, 0x7f, 0x70, 0xdb, 0x9b, 0x10, 0x21, 0x28, 0x18, 0x37, 0xd8,
+ 0x0a, 0xdb, 0x5a, 0x3e, 0xcd, 0xd8, 0x44, 0xa7, 0xd5, 0x17, 0x2a, 0x9a,
+ 0x10, 0x1b, 0xd7, 0xa8, 0x87, 0x6a, 0x02, 0xe3, 0x5d, 0x00, 0xf7, 0x88,
+ 0x66, 0xc8, 0xb6, 0x8c, 0xd5, 0x1f, 0xb2, 0x6b, 0x0a, 0x6f, 0x86, 0xc8,
+ 0x9e, 0x0a, 0x2a, 0x6b, 0x89, 0xaf, 0x45, 0x6b, 0x0b, 0x5d, 0xa1, 0xc8,
+ 0xc2, 0x92, 0xd4, 0xc1, 0x4f, 0x2e, 0xf1, 0x40, 0x30, 0x0b, 0x20, 0xf2,
+ 0x26, 0x69, 0x65, 0x09, 0xe0, 0x93, 0xe8, 0x8c, 0xe0, 0x74, 0x0f, 0x1a,
+ 0x1c, 0x0d, 0xcd, 0xaa, 0x2d, 0xec, 0x81, 0xe5, 0x1d, 0x2b, 0x95, 0xae,
+ 0x92, 0x7a, 0x6b, 0x12, 0x10, 0xfa, 0xe2, 0x4b, 0xfa, 0x52, 0x31, 0x1e,
+ 0xb0, 0xff, 0x61, 0x44, 0xd9, 0x1f, 0xad, 0x26, 0x90, 0x98, 0x08, 0x24,
+ 0x01, 0xfb, 0x2e, 0xd5, 0xf7, 0xe9, 0x6d, 0x43, 0xa8, 0x08, 0x9c, 0x0b,
+ 0xb2, 0x45, 0xac, 0x10, 0xc5, 0xf0, 0xc5, 0x20, 0x15, 0xdf, 0x86, 0x63,
+ 0x34, 0xfe, 0xbb, 0x66, 0x5c, 0x02, 0xf2, 0x81, 0x8e, 0x75, 0x2d, 0x78,
+ 0x97, 0xfc, 0x7e, 0x39, 0x66, 0x66, 0xd8, 0x2c, 0xcd, 0x58, 0x87, 0x8f,
+ 0x1f, 0x20, 0x47, 0x2b, 0x35, 0x51, 0x66, 0x74, 0x39, 0xca, 0x1e, 0xac,
+ 0xf5, 0xc4, 0x06, 0x1b, 0xb3, 0x6e, 0x76, 0x33, 0x03, 0x07, 0x5b, 0x4d,
+ 0x82, 0x87, 0xd6, 0x09, 0x7b, 0x5a, 0x60, 0xb3, 0x31, 0x3a, 0xbe, 0xb1,
+ 0x6b, 0xf2, 0x3f, 0x7e, 0xa3, 0xec, 0x06, 0x12, 0xb6, 0x13, 0x91, 0x9f,
+ 0x3b, 0xd7, 0xe8, 0x2d, 0xa5, 0xf3, 0x23, 0xcb, 0x26, 0xe2, 0x8d, 0xca,
+ 0x19, 0x68, 0x33, 0x77, 0xbe, 0x62, 0x2e, 0x23, 0x15, 0x3b, 0x9c, 0x5f,
+ 0xe2, 0x6d, 0x9d, 0xb1, 0x1d, 0x9b, 0x8c, 0xf1, 0xd0, 0x76, 0xcf, 0x77,
+ 0xeb, 0x7f, 0x5d, 0xae, 0xb8, 0xca, 0x58, 0xdc, 0x52, 0xdd, 0xfd, 0x7b,
+ 0xbe, 0x04, 0x92, 0x81, 0x51, 0x1b, 0x53, 0x9c, 0x46, 0x9b, 0x89, 0x0c,
+ 0xbc, 0x2d, 0x85, 0x41, 0x30, 0xb0, 0x6e, 0x5c, 0xa1, 0x6f, 0xdf, 0x00,
+ 0x7f, 0x6e, 0x24, 0x86, 0xc7, 0x8c, 0x85, 0xaa, 0xf1, 0x46, 0xbe, 0x07,
+ 0xde, 0x2d, 0x72, 0x14, 0xfd, 0xf9, 0x68, 0x60, 0x7b, 0xb4, 0x54, 0xe2,
+ 0x09, 0x07, 0x8a, 0x65, 0x5a, 0xf0, 0x83, 0xe1, 0x8c, 0x92, 0xc7, 0x20,
+ 0x6e, 0xdb, 0xb5, 0x11, 0xac, 0x21, 0x4c, 0xe7, 0xb6, 0xd3, 0x6e, 0xb9,
+ 0x7e, 0x85, 0x55, 0xd2, 0x79, 0xf5, 0x44, 0x67, 0x1b, 0x50, 0x87, 0xa7,
+ 0xac, 0x0a, 0x6c, 0x1d, 0x21, 0x03, 0x1a, 0xf0, 0x2a, 0x54, 0x0a, 0xc2,
+ 0x4e, 0x33, 0xca, 0x32, 0xf9, 0xca, 0x47, 0xc9, 0x90, 0x79, 0xc8, 0xbd,
+ 0xf1, 0x78, 0x24, 0xfa, 0xb8, 0x3c, 0xe8, 0xce, 0x6c, 0x00, 0xc9, 0x6d,
+ 0x72, 0xfa, 0x3d, 0x10, 0x7e, 0x63, 0x1b, 0x94, 0x54, 0xf1, 0x53, 0x9a,
+ 0xdc, 0x09, 0x89, 0xc7, 0x70, 0x5c, 0xf2, 0xb0, 0x1b, 0x1b, 0xb8, 0xfe,
+ 0xb9, 0x41, 0x10, 0x55, 0x8b, 0xdf, 0x97, 0x31, 0x11, 0xc7, 0x89, 0xd0,
+ 0x21, 0x40, 0x7b, 0x95, 0x84, 0x2e, 0x7a, 0x33, 0x8c, 0xb8, 0x85, 0xd1,
+ 0xff, 0xf3, 0x70, 0x44, 0x42, 0x46, 0x90, 0xba, 0xe9, 0xc8, 0xb6, 0x78,
+ 0xed, 0x9f, 0xfe, 0xab, 0x34, 0x8a, 0x19, 0x3a, 0xd5, 0x90, 0xf1, 0x5c,
+ 0x31, 0x36, 0x9d, 0x60, 0x97, 0xd5, 0x90, 0x72, 0x0c, 0xef, 0xe2, 0xc0,
+ 0xb4, 0xcf, 0x59, 0x76, 0xcf, 0xbf, 0x3b, 0xf0, 0x72, 0x5c, 0xee, 0x5b,
+ 0x5b, 0x9f, 0xeb, 0x8f, 0x09, 0xec, 0xe6, 0x82, 0x85, 0x82, 0xe2, 0x88,
+ 0xd6, 0xbd, 0xe5, 0x8e, 0x7f, 0x62, 0x8d, 0x8f, 0x5c, 0x15, 0x2b, 0x2d,
+ 0xf2, 0x96, 0xf1, 0x9b, 0x50, 0x61, 0xac, 0x22, 0x1b, 0xf7, 0xbb, 0xf2,
+ 0xda, 0xd2, 0x1f, 0xbb, 0x9a, 0x6a, 0x8c, 0xaa, 0x8e, 0xba, 0xdb, 0x3f,
+ 0xe2, 0xdc, 0x52, 0xee, 0xea, 0x79, 0x22, 0x2b, 0x9c, 0x04, 0x84, 0x05,
+ 0xc8, 0x99, 0x9e, 0x0e, 0x39, 0xcc, 0xb9, 0x3d, 0x15, 0x39, 0x43, 0x26,
+ 0xb5, 0xf7, 0x68, 0x26, 0x61, 0x04, 0xeb, 0x6d, 0x9a, 0x89, 0xcc, 0x2a,
+ 0xff, 0x40, 0x7c, 0xd7, 0xac, 0x78, 0xa5, 0xb5, 0x02, 0xa1, 0x83, 0x7b,
+ 0x6a, 0x2b, 0x1e, 0xdd, 0x32, 0x50, 0x98, 0x27, 0x4e, 0x9c, 0xc0, 0x36,
+ 0xc2, 0x7f, 0x31, 0x9d, 0x74, 0x1c, 0xea, 0xff, 0xea, 0x6d, 0xda, 0xe8,
+ 0x99, 0x7a, 0x7f, 0xe5, 0xb0, 0xe3, 0xd6, 0xcd, 0x68, 0x3b, 0x3b, 0xf5,
+ 0xeb, 0x80, 0x25, 0x23, 0x8d, 0x85, 0xd4, 0x7a, 0xaa, 0x2e, 0xdf, 0xab,
+ 0xb0, 0x6b, 0x2c, 0x35, 0x18, 0x76, 0xe7, 0x18, 0x63, 0xa6, 0x64, 0x9e,
+ 0x13, 0x7d, 0xe0, 0xc0, 0x80, 0xcf, 0x6f, 0x35, 0xa6, 0xf8, 0x3c, 0xef,
+ 0x65, 0xf4, 0xbf, 0xe4, 0x00, 0x00, 0x7b, 0x4a, 0xe9, 0xa6, 0x54, 0x71,
+ 0x9f, 0xfa, 0x88, 0xdf, 0xc1, 0x28, 0x7f, 0x39, 0x74, 0x9d, 0xdd, 0x4c,
+ 0x2d, 0xf2, 0x3c, 0x72, 0x8c, 0x4f, 0x2d, 0xe2, 0x86, 0xa0, 0xee, 0x3d,
+ 0xed, 0xac, 0x41, 0xbe, 0xa2, 0xda, 0xde, 0xdb, 0x2a, 0xa1, 0x53, 0xb2,
+ 0x04, 0xd8, 0xdd, 0xa7, 0xeb, 0x96, 0x2d, 0xd5, 0xc9, 0xd9, 0x1f, 0x46,
+ 0x15, 0x30, 0x53, 0xed, 0x49, 0x2d, 0xd1, 0xc1, 0x67, 0x24, 0x41, 0x01,
+ 0xd1, 0x4b, 0xb4, 0x6d, 0xb1, 0x61, 0x9b, 0xf9, 0x50, 0xd1, 0xcb, 0xde,
+ 0x2d, 0x8c, 0x99, 0xa8, 0x77, 0xc1, 0xee, 0xc3, 0x73, 0xc0, 0x37, 0x5f,
+ 0x80, 0x2c, 0x62, 0xd2, 0xf0, 0x2c, 0x09, 0xfd, 0x1b, 0xc6, 0x46, 0xc1,
+ 0xf7, 0xb0, 0x03, 0x70, 0x9f, 0x86, 0x2c, 0xe6, 0x12, 0x9a, 0xec, 0x4a,
+ 0x11, 0x98, 0x5d, 0x21, 0x1e, 0xc8, 0x07, 0x08, 0x98, 0x81, 0x91, 0x0f,
+ 0x60, 0xe6, 0x52, 0x44, 0x62, 0x25, 0xfb, 0x89, 0x3e, 0xb4, 0xff, 0x6e,
+ 0x45, 0xbb, 0x00, 0x5d, 0xbb, 0x07, 0x58, 0xdc, 0x76, 0x88, 0x34, 0xb6,
+ 0x23, 0x28, 0xe1, 0x0f, 0x50, 0xb1, 0xee, 0xef, 0x87, 0xae, 0xd6, 0x08,
+ 0x62, 0x47, 0xfc, 0x7a, 0x05, 0xfd, 0xe3, 0x3d, 0x3f, 0xd3, 0x91, 0xd6,
+ 0xfb, 0x21, 0xd9, 0xad, 0xad, 0x34, 0x01, 0x41, 0xda, 0xab, 0xd8, 0xbf,
+ 0x81, 0x08, 0x8a, 0x14, 0x83, 0x3b, 0xc1, 0xb8, 0xc5, 0xed, 0xa4, 0xab,
+ 0x72, 0x12, 0xc4, 0xd3, 0x1e, 0xc6, 0xdf, 0x07, 0xf8, 0xd7, 0x9f, 0x38,
+ 0x4f, 0xca, 0x2f, 0xc3, 0x8d, 0x28, 0x80, 0x52, 0xac, 0x4d, 0x59, 0x35,
+ 0x7c, 0x63, 0x1a, 0x49, 0xc9, 0x29, 0xcc, 0xed, 0xab, 0xfc, 0x4d, 0xae,
+ 0xc4, 0x4f, 0x8c, 0x91, 0x8b, 0x64, 0x1a, 0xdb, 0xdd, 0xcc, 0x05, 0xfb,
+ 0x8e, 0x15, 0x7e, 0x56, 0x0c, 0x6f, 0x17, 0x6e, 0xc7, 0xbe, 0x45, 0x8d,
+ 0xa0, 0xb5, 0xe1, 0x55, 0xe4, 0x4d, 0xd6, 0xb5, 0xb0, 0x6d, 0xd9, 0xb0,
+ 0x9c, 0xe4, 0xbe, 0x47, 0xa9, 0xfd, 0x08, 0x6c, 0x86, 0x50, 0x5e, 0x92,
+ 0xdb, 0xcd, 0xc3, 0xd1, 0xeb, 0x22, 0xf9, 0x7e, 0x86, 0x83, 0x05, 0xb0,
+ 0x2f, 0xd2, 0xe5, 0x9a, 0xbd, 0xf7, 0x3d, 0x67, 0x6a, 0x74, 0x3d, 0xd8,
+ 0xb8, 0xd2, 0x27, 0xe8, 0x72, 0xc9, 0xf0, 0xbf, 0xbd, 0xc8, 0x66, 0x7d,
+ 0x37, 0x40, 0x5c, 0x44, 0xf1, 0xf1, 0x17, 0xfe, 0x38, 0x4b, 0x55, 0x76,
+ 0xff, 0xea, 0xf9, 0xc4, 0x9b, 0x12, 0xca, 0x31, 0x90, 0x4c, 0x36, 0xc8,
+ 0x80, 0xf1, 0x3f, 0x94, 0x84, 0xca, 0x1a, 0xf3, 0xc6, 0xba, 0x76, 0x08,
+ 0x89, 0x38, 0x26, 0x92, 0x46, 0x00, 0xd2, 0x32, 0x91, 0x3e, 0x8d, 0x3e,
+ 0xa7, 0x39, 0xba, 0x6d, 0x8c, 0x20, 0xfe, 0xcc, 0x40, 0xee, 0xa7, 0xd8,
+ 0x5d, 0x93, 0xc9, 0x17, 0x13, 0x43, 0x5c, 0x87, 0xf5, 0x92, 0x2b, 0x8a,
+ 0x82, 0xd3, 0xbb, 0x80, 0x76, 0xd3, 0x13, 0x83, 0x65, 0x4e, 0x7d, 0x0b,
+ 0x37, 0xbb, 0xb2, 0x73, 0x8d, 0x4c, 0x54, 0x89, 0xd7, 0x5e, 0x6c, 0xc5,
+ 0x95, 0xa9, 0x15, 0x01, 0x85, 0x41, 0x69, 0x77, 0x0a, 0x52, 0x8a, 0x23,
+ 0xae, 0xf8, 0xd7, 0x26, 0x17, 0x02, 0xd8, 0xc0, 0x9c, 0x6b, 0x7a, 0x6f,
+ 0x90, 0x6d, 0x52, 0xb6, 0x80, 0xfc, 0x80, 0x01, 0x72, 0x5c, 0x4b, 0xab,
+ 0x70, 0x48, 0x73, 0xb8, 0x54, 0x2f, 0x9b, 0xbb, 0x97, 0xc7, 0xd8, 0x55,
+ 0xa9, 0x5a, 0x7d, 0x17, 0xd8, 0xf5, 0xb0, 0x2d, 0x82, 0x25, 0x7c, 0xad,
+ 0xfd, 0x59, 0x31, 0x60, 0xb5, 0xd1, 0xee, 0x9f, 0x2a, 0xe8, 0xd6, 0xc7,
+ 0x84, 0x3d, 0xd4, 0x42, 0x36, 0x99, 0x1e, 0xcf, 0xf1, 0x41, 0xa5, 0x6a,
+ 0x8e, 0x3b, 0x32, 0xe3, 0xcd, 0xf7, 0x27, 0x79, 0x82, 0x2e, 0x0f, 0xb2,
+ 0xf9, 0x8f, 0xc9, 0xa0, 0x47, 0xb2, 0x4d, 0x02, 0xa5, 0x8c, 0x33, 0x38,
+ 0xd2, 0x29, 0xbc, 0x69, 0xb5, 0xb7, 0x4e, 0xed, 0x60, 0x1a, 0x13, 0x7c,
+ 0xa1, 0x31, 0x66, 0x08, 0x37, 0xf8, 0x72, 0x01, 0xd1, 0xc9, 0xdc, 0xac,
+ 0x1e, 0xea, 0x03, 0x4a, 0xf8, 0x74, 0x92, 0xee, 0xa0, 0x69, 0x26, 0xaf,
+ 0x93, 0xf1, 0x05, 0xef, 0x38, 0x2f, 0xa4, 0xa6, 0x4c, 0x5d, 0xce, 0xfb,
+ 0x9f, 0x74, 0xd7, 0x9c, 0xcc, 0x81, 0x96, 0x6a, 0x53, 0x2c, 0x34, 0x66,
+ 0x9a, 0x44, 0xde, 0x7d, 0x35, 0x14, 0x9e, 0xe7, 0x80, 0x91, 0xf2, 0x9a,
+ 0x08, 0x7e, 0x28, 0xd1, 0x9c, 0x28, 0xd2, 0x9b, 0x63, 0x54, 0xce, 0xe7,
+ 0xd9, 0xb2, 0xf1, 0xc7, 0x49, 0x50, 0xcf, 0x59, 0xa6, 0xb6, 0x73, 0xdd,
+ 0x9b, 0xb5, 0x93, 0xa3, 0x27, 0x6f, 0x20, 0x95, 0x2f, 0x2e, 0xff, 0x29,
+ 0xef, 0x0b, 0x68, 0xce, 0x18, 0x5f, 0x11, 0x02, 0xb5, 0x2f, 0x22, 0x8b,
+ 0x25, 0x17, 0x29, 0xc3, 0x62, 0x68, 0x15, 0xb2, 0xec, 0x95, 0xf1, 0xd3,
+ 0x5a, 0xc8, 0x0c, 0x31, 0x9c, 0x1d, 0x8a, 0x44, 0xe5, 0xb5, 0x63, 0x8e,
+ 0xd7, 0x85, 0x93, 0x32, 0x0c, 0x53, 0xbc, 0x00, 0x80, 0xf9, 0x73, 0x41,
+ 0x2b, 0x44, 0xee, 0xbe, 0xbc, 0x66, 0x88, 0xcb, 0xf7, 0x40, 0xb6, 0x39,
+ 0xd3, 0xbe, 0xe0, 0x2a, 0x9b, 0x08, 0xdc, 0xa2, 0x91, 0x7c, 0xed, 0x50,
+ 0xdb, 0x14, 0x42, 0xbb, 0xc8, 0xce, 0x69, 0xe3, 0x99, 0x4e, 0x3e, 0x19,
+ 0x77, 0x98, 0xac, 0xce, 0x81, 0xac, 0xad, 0x59, 0x37, 0x10, 0x79, 0x7e,
+ 0x5e, 0x8a, 0x26, 0x71, 0x9c, 0xe6, 0xf1, 0xca, 0x7c, 0xf9, 0xb7, 0x5c,
+ 0xb7, 0x4b, 0x4e, 0xcd, 0x73, 0x96, 0x10, 0xb2, 0x7e, 0x66, 0xe2, 0x6a,
+ 0x65, 0x8e, 0x42, 0x23, 0xea, 0xba, 0x16, 0x7e, 0x1e, 0x41, 0x42, 0xbe,
+ 0x6e, 0xab, 0xb7, 0x90, 0x90, 0x8d, 0xee, 0x5e, 0xfa, 0xee, 0x3b, 0x6d,
+ 0x50, 0xde, 0x62, 0x5f, 0x22, 0x66, 0x34, 0x65, 0x24, 0x32, 0xe1, 0x9f,
+ 0x2e, 0x9d, 0x42, 0x04, 0xe0, 0x23, 0x12, 0x35, 0x30, 0xcf, 0x40, 0x9a,
+ 0x99, 0xda, 0xda, 0xbc, 0xe5, 0xfc, 0xb4, 0x81, 0x05, 0xe8, 0x70, 0xda,
+ 0x8b, 0x83, 0xae, 0xf7, 0xc4, 0xaf, 0x1a, 0x41, 0x7d, 0xf5, 0x49, 0xc3,
+ 0x9c, 0x28, 0x0f, 0x37, 0xd8, 0xee, 0x49, 0x86, 0x97, 0x24, 0xc1, 0xd7,
+ 0x8c, 0x7b, 0xcf, 0x95, 0xea, 0xcd, 0xe2, 0x26, 0xca, 0x89, 0xa2, 0xfa,
+ 0xa5, 0xc5, 0x83, 0x16, 0xf4, 0x67, 0xea, 0x64, 0x82, 0x2f, 0x6e, 0xab,
+ 0x18, 0x77, 0xdd, 0xbb, 0x93, 0x8f, 0xa8, 0x0f, 0x93, 0xed, 0x13, 0x48,
+ 0x37, 0xc7, 0x1e, 0x2c, 0x59, 0x8b, 0xf8, 0x53, 0x17, 0x0c, 0xbf, 0xda,
+ 0x02, 0x33, 0x1a, 0x30, 0x3d, 0x22, 0x99, 0x19, 0x51, 0x91, 0xf3, 0x68,
+ 0x24, 0x38, 0x7e, 0x68, 0x3e, 0x32, 0xa3, 0x28, 0x97, 0xdf, 0x07, 0x67,
+ 0x34, 0xa1, 0x5d, 0x29, 0xfb, 0x41, 0x6c, 0x5d, 0xc0, 0x67, 0xc4, 0xfa,
+ 0xb3, 0x94, 0x88, 0x7a, 0xa5, 0xec, 0x6a, 0x69, 0x36, 0x52, 0x19, 0xa8,
+ 0xb7, 0x89, 0x01, 0xce, 0x9b, 0x1c, 0xcf, 0x5e, 0x9e, 0x52, 0x33, 0x75,
+ 0x47, 0x8f, 0xc6, 0xbb, 0xa2, 0x08, 0x35, 0xd3, 0x92, 0x8b, 0xf9, 0x3b,
+ 0xd5, 0xbd, 0xa5, 0x2e, 0x11, 0x9b, 0x7c, 0x65, 0xcd, 0xfe, 0xc7, 0x2f,
+ 0xd2, 0xd4, 0x00, 0x9c, 0x63, 0x11, 0xc8, 0x7d, 0x7a, 0xa2, 0x5a, 0x82,
+ 0x2b, 0x01, 0xf1, 0xa9, 0xb5, 0x1c, 0xad, 0x50, 0x8b, 0x6b, 0x16, 0x42,
+ 0x7b, 0xd8, 0x99, 0x6c, 0xf3, 0x0f, 0xe9, 0xfb, 0xdf, 0xf5, 0xb2, 0x16,
+ 0x7b, 0x2a, 0xba, 0x2c, 0x49, 0x81, 0x1e, 0x2e, 0x04, 0x01, 0xc2, 0x07,
+ 0xd3, 0x54, 0x84, 0x81, 0xdc, 0x6f, 0xfb, 0x28, 0x07, 0x4f, 0x56, 0x1e,
+ 0x31, 0x68, 0x33, 0x9a, 0xed, 0xbf, 0x69, 0x31, 0x74, 0x28, 0x46, 0xf8,
+ 0x96, 0xef, 0xe5, 0x52, 0x1e, 0xc5, 0x21, 0x86, 0x63, 0x42, 0xff, 0xae,
+ 0x36, 0x79, 0xf4, 0x9c, 0x2d, 0x60, 0xc5, 0xe5, 0x9d, 0x9d, 0x32, 0x1c,
+ 0x82, 0x6b, 0xdc, 0x35, 0x39, 0x94, 0x31, 0xb4, 0xd0, 0x45, 0x16, 0xfe,
+ 0xe3, 0x3e, 0x77, 0x28, 0x3c, 0x3d, 0xc1, 0x41, 0x21, 0x4c, 0x42, 0xb3,
+ 0xa3, 0x3c, 0xf7, 0x33, 0x94, 0x7d, 0xf3, 0xe6, 0x87, 0x05, 0x98, 0xed,
+ 0xac, 0x6c, 0xb3, 0xb0, 0xb0, 0x73, 0x3d, 0x12, 0xda, 0x84, 0x7d, 0x9b,
+ 0x8f, 0x83, 0x40, 0xf7, 0x39, 0x6c, 0x38, 0x6c, 0x67, 0x4e, 0x8f, 0xbd,
+ 0xe5, 0xe3, 0x57, 0x6b, 0xa6, 0x5f, 0xcb, 0xe1, 0xa8, 0x15, 0x3e, 0xdc,
+ 0x67, 0xc5, 0x97, 0xc7, 0xe5, 0xe1, 0xf0, 0x80, 0xa0, 0x59, 0xae, 0x0e,
+ 0x9d, 0xd4, 0x70, 0x5c, 0x9c, 0x81, 0x5a, 0x98, 0x06, 0xf5, 0x72, 0x04,
+ 0x5c, 0xfc, 0x48, 0x1f, 0xf4, 0x73, 0x88, 0xae, 0x3e, 0xd6, 0x49, 0x47,
+ 0x00, 0x57, 0xbe, 0x1c, 0xcf, 0x72, 0x3d, 0xc5, 0xc2, 0xea, 0x60, 0x37,
+ 0xa2, 0xf6, 0x33, 0xdb, 0x27, 0xc3, 0x5a, 0xa7, 0x5a, 0xb5, 0x54, 0x44,
+ 0xd3, 0x25, 0xde, 0x21, 0x0d, 0x96, 0xda, 0x16, 0x9d, 0xde, 0x8e, 0xc1,
+ 0xf7, 0x1c, 0x6c, 0xc5, 0x4e, 0x6e, 0xae, 0xad, 0x4a, 0x52, 0x94, 0x67,
+ 0xf9, 0x85, 0xaf, 0x92, 0xf9, 0x30, 0x20, 0xaa, 0xfe, 0x83, 0x26, 0x1d,
+ 0xba, 0x3e, 0x45, 0x01, 0xcf, 0x99, 0xdd, 0xdd, 0x4d, 0x76, 0xd5, 0x63,
+ 0x88, 0x18, 0x79, 0xf3, 0xa4, 0x0b, 0xbf, 0xf6, 0x1c, 0x6e, 0x8f, 0x7e,
+ 0x20, 0x95, 0xc4, 0x9e, 0xf9, 0x94, 0x0d, 0x00, 0xc6, 0xb7, 0xb2, 0x27,
+ 0xa7, 0x90, 0x45, 0x50, 0x82, 0xac, 0xfa, 0xb9, 0x04, 0x66, 0xfc, 0xb8,
+ 0xaf, 0x8c, 0x80, 0x5b, 0xd5, 0xd7, 0xad, 0x15, 0x50, 0xa8, 0xa5, 0x7c,
+ 0x0a, 0x3d, 0x6b, 0x8a, 0xc6, 0x7f, 0xc2, 0xb5, 0x74, 0x2b, 0x00, 0xa8,
+ 0x38, 0x5d, 0x78, 0x11, 0x85, 0xc7, 0x71, 0x83, 0xd0, 0xc7, 0x0a, 0x56,
+ 0x95, 0x47, 0x05, 0x76, 0x81, 0xeb, 0xcd, 0x8e, 0xab, 0xd4, 0xcc, 0xc8,
+ 0xef, 0xaf, 0xe9, 0x89, 0xb8, 0x81, 0xc5, 0xf0, 0x8a, 0xf1, 0x0a, 0x3f,
+ 0x85, 0x2e, 0x9d, 0x43, 0x15, 0x21, 0x5c, 0x1c, 0xcf, 0x6b, 0x97, 0x92,
+ 0x4d, 0xa5, 0xfd, 0x3f, 0xcf, 0x26, 0x48, 0x81, 0x99, 0xb8, 0x15, 0x9f,
+ 0x4f, 0x08, 0x02, 0xa8, 0xf8, 0x3a, 0x48, 0x56, 0x20, 0x7b, 0x3a, 0xde,
+ 0xfc, 0x40, 0x22, 0x9e, 0x65, 0xc1, 0xcc, 0x1f, 0x22, 0xc2, 0x13, 0x84,
+ 0xb3, 0x8e, 0x37, 0x41, 0x5d, 0x96, 0xbc, 0x53, 0x3e, 0x8a, 0x75, 0xc6,
+ 0x2d, 0xb7, 0x48, 0x43, 0xe9, 0xb4, 0xb9, 0x02, 0x1f, 0x8e, 0x4e, 0xbb,
+ 0xd0, 0x3c, 0x06, 0x6d, 0xdb, 0xe1, 0x9b, 0x89, 0xe2, 0x76, 0xfd, 0x27,
+ 0x09, 0x12, 0x73, 0x50, 0x08, 0xe8, 0xc9, 0xbd, 0x56, 0x80, 0x8a, 0xad,
+ 0xf4, 0x72, 0xac, 0xa0, 0xfa, 0x74, 0x6c, 0x30, 0x31, 0x02, 0xca, 0x59,
+ 0xb2, 0x35, 0xdc, 0x4e, 0xd1, 0xc8, 0x29, 0xf0, 0x0f, 0xd5, 0xc3, 0xdf,
+ 0x60, 0xc9, 0x5a, 0x97, 0x30, 0xff, 0x94, 0xc5, 0x4d, 0x94, 0x44, 0x28,
+ 0x9d, 0x45, 0x94, 0x02, 0x5e, 0xfa, 0x3d, 0x37, 0x03, 0x0d, 0xc9, 0x96,
+ 0x37, 0xa4, 0x1b, 0x1f, 0x10, 0xa5, 0xce, 0x76, 0xf1, 0xc0, 0x08, 0x33,
+ 0x85, 0xbd, 0xe9, 0xf2, 0x65, 0x15, 0x58, 0xf8, 0x10, 0x18, 0xe6, 0xe3,
+ 0x2d, 0x07, 0x7e, 0x5d, 0x37, 0x1a, 0x2b, 0x38, 0xd4, 0x8d, 0x07, 0xc3,
+ 0x7a, 0x47, 0xd7, 0x96, 0x8e, 0x0e, 0x5e, 0xb3, 0x13, 0x8c, 0xc8, 0x2d,
+ 0x0b, 0xc9, 0x9e, 0x92, 0xfe, 0x81, 0x24, 0x94, 0xe1, 0x6f, 0x86, 0xb9,
+ 0xdb, 0x09, 0xaa, 0xf1, 0x3a, 0x75, 0x49, 0x00, 0xa3, 0xf8, 0x95, 0xdb,
+ 0x45, 0xad, 0xe1, 0x15, 0x2a, 0x61, 0x9d, 0x83, 0x25, 0xcd, 0xb9, 0x78,
+ 0x97, 0x00, 0x3f, 0xa1, 0x26, 0x83, 0x61, 0xaf, 0x29, 0xbf, 0x92, 0xde,
+ 0xbe, 0xf9, 0xbd, 0x91, 0x01, 0xf3, 0x97, 0xd7, 0x7f, 0xb5, 0xab, 0x51,
+ 0x18, 0x2b, 0x44, 0xb9, 0xf1, 0x73, 0x69, 0x3a, 0x89, 0xef, 0x4a, 0x90,
+ 0x3d, 0x28, 0x55, 0xfe, 0xc4, 0x3f, 0xbf, 0xa9, 0x6b, 0x25, 0x5a, 0xbc,
+ 0x9a, 0x56, 0x94, 0xb1, 0x81, 0x47, 0x0a, 0xb0, 0x89, 0x4d, 0x93, 0x89,
+ 0x83, 0xe5, 0x55, 0x39, 0xec, 0x4d, 0x6e, 0xd2, 0xb1, 0xce, 0xbe, 0x79,
+ 0xab, 0x49, 0xe7, 0xd5, 0x36, 0x43, 0x74, 0xb8, 0x68, 0x46, 0x3b, 0x09,
+ 0x83, 0xd1, 0x00, 0x00, 0xa3, 0x4e, 0xf9, 0x81, 0x00, 0xa7, 0x00, 0x86,
+ 0x00, 0x40, 0x96, 0xf0, 0x01, 0x17, 0x86, 0x00, 0x06, 0x70, 0x67, 0xbe,
+ 0x60, 0xf8, 0x00, 0x00, 0x00, 0x05, 0x05, 0x7c, 0x17, 0x3f, 0x4b, 0x06,
+ 0x6b, 0x82, 0xef, 0x6a, 0xef, 0x50, 0x9b, 0x12, 0x16, 0x71, 0x2d, 0x4f,
+ 0x23, 0xf4, 0xe9, 0x34, 0x4f, 0x5a, 0x6b, 0x04, 0xf5, 0x73, 0x96, 0x6c,
+ 0xc6, 0x70, 0x9c, 0xa9, 0x3c, 0xff, 0xf5, 0xe5, 0x36, 0x17, 0xd8, 0x4f,
+ 0x56, 0xd5, 0x99, 0xff, 0x62, 0x92, 0xef, 0x1d, 0x98, 0xab, 0x94, 0x50,
+ 0xfe, 0xdf, 0x70, 0xb7, 0x15, 0x40, 0x1f, 0x0a, 0x6b, 0x5e, 0xc4, 0xd8,
+ 0xba, 0x84, 0xb1, 0xe6, 0x44, 0x1e, 0xd5, 0x26, 0xc6, 0xde, 0xc5, 0xd4,
+ 0x68, 0xac, 0xb0, 0x37, 0xdb, 0x05, 0x02, 0x98, 0x08, 0xc3, 0xd2, 0xdc,
+ 0xc5, 0xe2, 0x5d, 0x9e, 0x13, 0xae, 0x56, 0x3d, 0xae, 0x21, 0xf8, 0x23,
+ 0xb6, 0x84, 0x5a, 0x0c, 0xf0, 0x79, 0x13, 0x9e, 0x24, 0x0e, 0x3d, 0xb6,
+ 0x2f, 0x4c, 0xc4, 0x30, 0x41, 0xa5, 0x56, 0x58, 0x47, 0x49, 0xe8, 0x42,
+ 0x74, 0xa5, 0xfb, 0x97, 0xfe, 0xfc, 0x2e, 0x8b, 0x07, 0x98, 0x36, 0x49,
+ 0x5d, 0x11, 0x88, 0xba, 0x23, 0xb4, 0x46, 0x8c, 0x42, 0xaf, 0xfb, 0xfb,
+ 0x8b, 0xcd, 0xd9, 0x90, 0xaa, 0xa0, 0x81, 0x37, 0x60, 0x02, 0xea, 0x5b,
+ 0xf2, 0xcb, 0xcb, 0x57, 0xaa, 0x07, 0x95, 0x06, 0x5e, 0xf6, 0xad, 0x34,
+ 0x53, 0xca, 0x3c, 0x73, 0xa9, 0x95, 0xa8, 0x4e, 0x27, 0xac, 0x26, 0x3a,
+ 0xed, 0xe5, 0x5e, 0xac, 0xdf, 0x91, 0xfc, 0x47, 0x1f, 0x33, 0xfd, 0xa9,
+ 0x3b, 0xe7, 0x21, 0x65, 0xb5, 0x90, 0xc7, 0xf0, 0xf6, 0x49, 0x8b, 0x0f,
+ 0xae, 0x4c, 0xf9, 0x5b, 0x68, 0x79, 0xd4, 0xb4, 0xff, 0x5d, 0x0e, 0xc1,
+ 0x71, 0x59, 0x6b, 0x9f, 0x27, 0x2e, 0x97, 0xf2, 0x08, 0xda, 0xe7, 0xe0,
+ 0xa3, 0x6a, 0x3f, 0xd6, 0x83, 0x5b, 0xc4, 0x88, 0x30, 0x5b, 0x17, 0xe7,
+ 0xbc, 0x78, 0x66, 0x57, 0x14, 0xcb, 0x8b, 0x73, 0x36, 0x73, 0xfe, 0xd4,
+ 0x13, 0x40, 0xcc, 0x18, 0xe9, 0xcb, 0x3b, 0x82, 0x0f, 0x50, 0xaa, 0x2f,
+ 0x45, 0x10, 0x15, 0x29, 0xb5, 0x52, 0xa7, 0xd5, 0x33, 0xcf, 0x72, 0xb2,
+ 0xbc, 0xf9, 0x15, 0xbb, 0xf1, 0xf2, 0x54, 0x3b, 0x5c, 0xc9, 0xd2, 0x94,
+ 0x4c, 0x7f, 0x2a, 0xd1, 0xd8, 0x70, 0xb6, 0x6b, 0x39, 0x5c, 0x91, 0x46,
+ 0x28, 0x17, 0xb1, 0x2b, 0x8e, 0xdc, 0xbb, 0xce, 0xc3, 0x8d, 0x72, 0x5a,
+ 0xb0, 0xb1, 0x6a, 0xa7, 0x84, 0x77, 0xed, 0xdd, 0x7e, 0x49, 0xce, 0x63,
+ 0x5d, 0xb5, 0x7c, 0xe9, 0x59, 0xbb, 0xfc, 0xe8, 0x9e, 0x68, 0x6b, 0x1b,
+ 0x8d, 0xaa, 0x33, 0xa1, 0xc0, 0x60, 0x03, 0xe4, 0xac, 0xf8, 0xa9, 0xe0,
+ 0x43, 0xc5, 0x66, 0x49, 0xe4, 0x83, 0x63, 0xc3, 0xe0, 0x78, 0xe1, 0xe6,
+ 0x1e, 0x47, 0xbd, 0xb0, 0xeb, 0x32, 0xa9, 0x7f, 0x8d, 0xdb, 0xe3, 0xce,
+ 0xab, 0x79, 0x71, 0x8e, 0x3b, 0x84, 0xc4, 0xcd, 0x33, 0x83, 0xa5, 0x20,
+ 0x0b, 0xeb, 0xcd, 0xcb, 0xb6, 0xf2, 0x50, 0x11, 0x5e, 0x68, 0x46, 0xa2,
+ 0x9a, 0x55, 0xc3, 0x0a, 0x7f, 0xe9, 0x49, 0x70, 0x77, 0xab, 0x81, 0x5b,
+ 0xe4, 0x9e, 0x95, 0x9a, 0xa8, 0xb3, 0xa4, 0x84, 0xcc, 0x02, 0x47, 0xfb,
+ 0x1b, 0x04, 0x5f, 0x73, 0x25, 0xea, 0xed, 0x54, 0xf5, 0x1b, 0x44, 0x54,
+ 0x4d, 0x68, 0x01, 0x4d, 0x7a, 0xc3, 0x13, 0x31, 0x85, 0xf5, 0x10, 0xca,
+ 0x57, 0xab, 0x36, 0x98, 0x53, 0xc2, 0x14, 0x45, 0x73, 0x4f, 0xb7, 0xac,
+ 0xd1, 0x6f, 0x3c, 0x1e, 0xa4, 0x92, 0x11, 0x2e, 0xe9, 0x0c, 0xa1, 0x25,
+ 0xf0, 0xab, 0x70, 0x00, 0xe6, 0x67, 0xf5, 0xbd, 0x52, 0x3d, 0x63, 0xa7,
+ 0xef, 0x36, 0x98, 0x9b, 0x04, 0xfc, 0x72, 0x73, 0x49, 0x2c, 0x38, 0x19,
+ 0xb9, 0xac, 0x71, 0x1d, 0xd9, 0x68, 0xd6, 0x0c, 0x68, 0xc3, 0xf3, 0xfa,
+ 0xad, 0xc4, 0xcd, 0x94, 0x30, 0x2f, 0x31, 0xfe, 0x7b, 0xfd, 0x7d, 0x34,
+ 0x79, 0xa9, 0x5f, 0x60, 0x28, 0xf4, 0xa3, 0xfc, 0xdc, 0x60, 0x1a, 0x82,
+ 0xbe, 0x6d, 0x26, 0xb9, 0x4b, 0x29, 0xec, 0x8c, 0x83, 0x5c, 0x06, 0x8a,
+ 0x5d, 0xd4, 0x34, 0xf0, 0x4e, 0x53, 0xe9, 0xfe, 0xdc, 0x93, 0x2a, 0xff,
+ 0x05, 0x4b, 0x06, 0x94, 0x59, 0xad, 0x5d, 0xdf, 0x87, 0x3e, 0x7d, 0xf2,
+ 0xb8, 0x96, 0x05, 0x3c, 0x07, 0xf9, 0xfa, 0xb5, 0x1f, 0x9c, 0x64, 0xbb,
+ 0x61, 0x8a, 0xea, 0x22, 0x3f, 0xbb, 0x1c, 0x6d, 0x1e, 0x00, 0xf5, 0x21,
+ 0x5a, 0x28, 0x1c, 0x06, 0xca, 0x18, 0x79, 0x46, 0x1c, 0x40, 0x7f, 0x08,
+ 0x50, 0x42, 0x08, 0x93, 0xa4, 0x75, 0x9e, 0x94, 0x44, 0x2b, 0x4b, 0x88,
+ 0x22, 0xc2, 0xd8, 0x58, 0xc3, 0x1b, 0x62, 0xf8, 0xc1, 0x22, 0x1e, 0xb0,
+ 0x7f, 0x3a, 0x2d, 0xfa, 0x74, 0x2c, 0xc7, 0x3f, 0x1c, 0x53, 0x89, 0x28,
+ 0xd2, 0x3c, 0xa6, 0x0a, 0x65, 0x7b, 0x3a, 0x01, 0x5c, 0xfc, 0x2f, 0x51,
+ 0xaf, 0x67, 0x61, 0x7a, 0xe0, 0x05, 0xfe, 0xfc, 0x7f, 0x32, 0x43, 0xf2,
+ 0xc6, 0x60, 0xb2, 0xcc, 0xbc, 0xc0, 0xd8, 0xdc, 0xc5, 0xb8, 0xc2, 0x91,
+ 0x9e, 0x10, 0x26, 0x76, 0x8c, 0xbc, 0xa9, 0xd9, 0x3a, 0x7a, 0xf0, 0xe6,
+ 0xd1, 0x3d, 0x0e, 0x31, 0x3d, 0x57, 0xe2, 0x18, 0x02, 0x24, 0xe6, 0xd2,
+ 0x27, 0x94, 0x37, 0x56, 0x81, 0xf3, 0x13, 0x39, 0xc6, 0x51, 0x02, 0xc5,
+ 0x8b, 0xdd, 0xae, 0xcb, 0x8b, 0x08, 0x6a, 0x71, 0xb1, 0x25, 0x1d, 0xdb,
+ 0x6c, 0x9b, 0x95, 0x4a, 0x8e, 0x9f, 0x6c, 0x0a, 0xe4, 0x9a, 0xb3, 0x3d,
+ 0x6f, 0xf4, 0x51, 0x88, 0xc1, 0x6a, 0x0a, 0xdb, 0xd1, 0xae, 0xd6, 0x68,
+ 0xe2, 0xf3, 0x17, 0x5c, 0xfa, 0xe8, 0xa3, 0x8a, 0x5a, 0xde, 0xb1, 0x28,
+ 0x27, 0xc6, 0xec, 0xa6, 0xa4, 0xc1, 0x85, 0x42, 0xa7, 0x1d, 0x61, 0xca,
+ 0x31, 0x3c, 0x62, 0x63, 0xdc, 0x96, 0x1b, 0x9f, 0x82, 0xe7, 0x41, 0x63,
+ 0x11, 0x1a, 0x56, 0x1c, 0x8d, 0x65, 0xd7, 0xe6, 0x50, 0xb9, 0x74, 0x12,
+ 0xd6, 0xa9, 0xca, 0x75, 0x36, 0x98, 0x17, 0x43, 0x1d, 0x0f, 0x64, 0x7f,
+ 0x9e, 0x98, 0xc8, 0x21, 0xd7, 0xe4, 0xec, 0xc7, 0xec, 0x88, 0x77, 0x67,
+ 0xfa, 0x0f, 0xc5, 0x27, 0x09, 0xed, 0x73, 0x64, 0x2c, 0x15, 0x4b, 0xa4,
+ 0x96, 0x7e, 0x2a, 0x33, 0xad, 0x5d, 0xe5, 0xf1, 0xf9, 0x96, 0xbf, 0xc2,
+ 0x63, 0x3b, 0x7c, 0xb9, 0x0a, 0xc7, 0xf4, 0x48, 0x6f, 0x42, 0xc8, 0xd1,
+ 0xf1, 0xe6, 0x54, 0xc0, 0xe2, 0x0b, 0xd2, 0x54, 0x88, 0x8e, 0xba, 0x0d,
+ 0x26, 0xfe, 0xb1, 0x5f, 0xc1, 0xa9, 0x33, 0x00, 0xef, 0x1b, 0xe3, 0x5f,
+ 0x38, 0x3b, 0xae, 0x17, 0x22, 0xe7, 0x79, 0xce, 0x7c, 0x8b, 0x36, 0x72,
+ 0x03, 0x95, 0x96, 0x1b, 0x8b, 0x6b, 0x21, 0xbb, 0x5e, 0x59, 0x5b, 0x05,
+ 0xb1, 0x00, 0xa9, 0x65, 0x30, 0xaf, 0x22, 0x93, 0x4e, 0x7d, 0x76, 0x96,
+ 0xb9, 0xdf, 0x86, 0x91, 0x4d, 0x8d, 0x8a, 0xb6, 0x9f, 0x8b, 0x35, 0xdd,
+ 0xab, 0xf5, 0x91, 0xf3, 0xdc, 0x1a, 0x9b, 0x6d, 0xfb, 0x9f, 0x4f, 0xdf,
+ 0x45, 0xbc, 0xfe, 0x0b, 0x2a, 0x20, 0xb9, 0x22, 0xbc, 0x99, 0x00, 0x05,
+ 0xc3, 0xd4, 0x40, 0x62, 0xc8, 0x4f, 0xb0, 0x0e, 0x69, 0xb7, 0x52, 0xcf,
+ 0x5a, 0x14, 0xa0, 0x81, 0xe0, 0x96, 0xd5, 0x98, 0x57, 0x00, 0x13, 0x80,
+ 0x98, 0x70, 0xa4, 0x1a, 0x0b, 0x46, 0x33, 0x02, 0xfa, 0x06, 0x20, 0x98,
+ 0x85, 0x3c, 0xda, 0x05, 0x2c, 0xae, 0xa5, 0xc0, 0xa6, 0x5e, 0x87, 0xe9,
+ 0xb1, 0xeb, 0xff, 0x74, 0xe2, 0xfc, 0xc5, 0xcc, 0x67, 0x49, 0x91, 0xb5,
+ 0x7e, 0xdd, 0x1f, 0xfb, 0x3b, 0x78, 0xa1, 0x40, 0x6c, 0x43, 0xe7, 0x97,
+ 0x00, 0x25, 0xb7, 0x92, 0x34, 0x4f, 0x49, 0x8a, 0xf8, 0x9f, 0x3e, 0x4d,
+ 0x8f, 0xa3, 0x7d, 0xe4, 0x66, 0xfd, 0x30, 0x4d, 0xe7, 0xc0, 0xf5, 0xbc,
+ 0xf3, 0x1f, 0x3e, 0x0b, 0x8f, 0x9b, 0x91, 0xc2, 0x4c, 0x8c, 0x8e, 0x27,
+ 0x11, 0x53, 0xcd, 0x0d, 0xdb, 0x48, 0xf3, 0x47, 0xdc, 0x23, 0xfc, 0xfc,
+ 0xdf, 0x2d, 0x75, 0xf4, 0xa4, 0x00, 0x11, 0x22, 0x83, 0x22, 0x64, 0x90,
+ 0xb5, 0xa5, 0x69, 0xb4, 0x26, 0x8b, 0xea, 0x4d, 0x5c, 0xb9, 0x5b, 0xb3,
+ 0xb0, 0x68, 0x6b, 0x6e, 0x28, 0x3c, 0xb8, 0x4f, 0xa0, 0x67, 0xfd, 0x10,
+ 0xc2, 0xe4, 0xe9, 0x3b, 0x06, 0x48, 0x01, 0x70, 0x67, 0xde, 0x7b, 0x7d,
+ 0x0e, 0xdf, 0x50, 0x2a, 0x1f, 0x6e, 0x0a, 0xe2, 0x89, 0x68, 0xf1, 0x45,
+ 0x90, 0xa3, 0xd1, 0x27, 0xe6, 0x96, 0xa5, 0x92, 0xa2, 0xf2, 0x87, 0x06,
+ 0x80, 0x85, 0xd5, 0x76, 0x46, 0x1b, 0x2f, 0x08, 0x75, 0x4e, 0x6d, 0x43,
+ 0x5c, 0x78, 0x17, 0x8e, 0x9d, 0x8c, 0xc3, 0xe8, 0x10, 0xcd, 0x2a, 0x88,
+ 0xfe, 0x6b, 0xbc, 0x61, 0x23, 0x35, 0x68, 0x82, 0x6c, 0x45, 0x7a, 0x38,
+ 0x51, 0xf8, 0x3e, 0xff, 0xd4, 0xc2, 0x80, 0x48, 0x2c, 0x6f, 0x03, 0xe9,
+ 0x85, 0x21, 0x04, 0x9b, 0x07, 0x61, 0x6c, 0xa4, 0x6f, 0xa2, 0xdd, 0x0f,
+ 0x4a, 0x61, 0x78, 0xcd, 0x70, 0xac, 0x47, 0xaf, 0x1b, 0xc0, 0xd9, 0x72,
+ 0x2a, 0xd6, 0xe4, 0xd6, 0x84, 0xec, 0xed, 0xc9, 0xf6, 0xba, 0x70, 0xaa,
+ 0xf8, 0xa1, 0xb9, 0x8b, 0x13, 0xcc, 0x50, 0x5f, 0x34, 0x57, 0xc2, 0xc0,
+ 0x0a, 0xd8, 0x39, 0xe4, 0xe0, 0xa8, 0xe8, 0x07, 0x92, 0x09, 0x48, 0xed,
+ 0xeb, 0x50, 0x48, 0x02, 0xe5, 0xde, 0x03, 0x39, 0x5f, 0x43, 0xff, 0xc5,
+ 0x22, 0x1c, 0xb9, 0x7a, 0xd9, 0x97, 0x27, 0x5a, 0x18, 0xe9, 0x02, 0xb3,
+ 0xd9, 0x6e, 0x52, 0x8e, 0xa1, 0x0f, 0xb4, 0x00, 0x00, 0x00, 0x01, 0x9f,
+ 0x7f, 0xa4, 0x48, 0xd9, 0xf2, 0x9b, 0x10, 0x81, 0xcf, 0x2e, 0x40, 0x8e,
+ 0x6d, 0x93, 0xaf, 0x84, 0xb5, 0x23, 0xef, 0x2a, 0x4c, 0x94, 0x69, 0x4c,
+ 0x10, 0x91, 0x6b, 0xb5, 0x0a, 0x6b, 0xe3, 0xe9, 0xcd, 0x5d, 0xad, 0x88,
+ 0x19, 0x4e, 0x0a, 0x52, 0xab, 0x62, 0x70, 0x28, 0x68, 0xa2, 0x28, 0xe1,
+ 0x62, 0xc3, 0x1c, 0x44, 0x26, 0x6a, 0x6c, 0xba, 0x0c, 0x95, 0xea, 0x99,
+ 0xc8, 0x94, 0x1f, 0xb2, 0x8b, 0xf2, 0xe7, 0x53, 0xca, 0xbc, 0x47, 0x56,
+ 0xe7, 0x88, 0xfb, 0x8b, 0xc7, 0xf1, 0xbd, 0x0a, 0xee, 0xc2, 0xc7, 0xf2,
+ 0x22, 0x6f, 0x44, 0x7c, 0x25, 0x6a, 0xda, 0xe0, 0x32, 0xc7, 0x2b, 0x99,
+ 0x57, 0xe5, 0xb2, 0xa8, 0x3d, 0x89, 0x32, 0xc0, 0xab, 0x99, 0xd5, 0xc1,
+ 0xff, 0xfd, 0x70, 0x57, 0x61, 0x68, 0x20, 0xb6, 0x07, 0xe3, 0x9a, 0x86,
+ 0xd5, 0x80, 0xb8, 0x6a, 0xc3, 0xf0, 0xf3, 0x90, 0x05, 0x46, 0x29, 0x5e,
+ 0x13, 0xae, 0x0c, 0x99, 0xfe, 0x51, 0x10, 0xb6, 0xf6, 0x03, 0x7d, 0xa7,
+ 0x5c, 0xf9, 0xf8, 0x0a, 0x37, 0x12, 0xbc, 0xf2, 0x5f, 0x3d, 0x66, 0xea,
+ 0x10, 0xfb, 0xd6, 0x5f, 0x43, 0x29, 0x91, 0xa8, 0xa9, 0x4c, 0x5e, 0xa3,
+ 0x1d, 0x2c, 0x19, 0xb0, 0xab, 0x4b, 0x17, 0xf9, 0x0a, 0x5a, 0x6a, 0x46,
+ 0x36, 0x6f, 0xfc, 0x06, 0x7d, 0xb3, 0x88, 0x4c, 0xc8, 0x14, 0xad, 0xc2,
+ 0xea, 0x32, 0x35, 0x13, 0xa7, 0x6a, 0xef, 0x09, 0x4e, 0x05, 0xf4, 0x7d,
+ 0xda, 0x32, 0x7c, 0x82, 0x4a, 0x9c, 0x02, 0x65, 0xd6, 0xf3, 0x3b, 0x7e,
+ 0xe4, 0x4a, 0xe9, 0x18, 0x9a, 0xde, 0x7e, 0x8a, 0x2c, 0x00, 0xf5, 0x58,
+ 0x4f, 0x61, 0xb0, 0x76, 0x98, 0x00, 0x5d, 0x2e, 0x91, 0x16, 0xf4, 0x2e,
+ 0x60, 0x83, 0x32, 0xd6, 0x28, 0x7b, 0xf8, 0x12, 0x72, 0x8c, 0xdd, 0xe4,
+ 0x56, 0x71, 0xb5, 0xdb, 0x5c, 0x88, 0x92, 0xe0, 0xbf, 0x5d, 0xd4, 0x9f,
+ 0xc5, 0x7e, 0x17, 0x92, 0x00, 0x38, 0xa6, 0xe0, 0x0d, 0xb1, 0x9f, 0xa9,
+ 0xbb, 0xad, 0x01, 0x25, 0xb6, 0x8d, 0x40, 0x87, 0x2f, 0x42, 0x24, 0xa2,
+ 0x42, 0xd2, 0x5f, 0xe0, 0xff, 0x49, 0x32, 0x74, 0x38, 0xea, 0x5c, 0x68,
+ 0x76, 0x45, 0xd9, 0x94, 0x93, 0xd4, 0x67, 0xd0, 0x21, 0x09, 0xe0, 0xb2,
+ 0x19, 0x1c, 0xa3, 0x04, 0x63, 0xec, 0x0d, 0x36, 0x60, 0xf3, 0x41, 0xce,
+ 0xc1, 0xc1, 0x19, 0x14, 0xd3, 0x8d, 0xc9, 0x00, 0xeb, 0xa6, 0xcf, 0x36,
+ 0xe2, 0xad, 0xa5, 0x73, 0x0b, 0x2a, 0x79, 0x14, 0x8c, 0x7d, 0xd8, 0x05,
+ 0x29, 0xe0, 0xd8, 0x2a, 0xbb, 0x29, 0xe3, 0x12, 0xbe, 0x1d, 0xbd, 0x6c,
+ 0xd4, 0x2a, 0x76, 0xc3, 0xb1, 0xfb, 0x5e, 0x10, 0x12, 0xf5, 0xe1, 0xb1,
+ 0xd5, 0x9b, 0x39, 0x35, 0xc8, 0x12, 0x0b, 0x92, 0xe0, 0x8e, 0x8c, 0x60,
+ 0x5d, 0x6c, 0x3f, 0x2c, 0xd5, 0x01, 0xb9, 0x83, 0x2f, 0x7f, 0xd0, 0xb1,
+ 0x67, 0xe6, 0xfc, 0x2c, 0xf9, 0x77, 0x32, 0x33, 0x2d, 0x08, 0xff, 0x4f,
+ 0xce, 0x61, 0x68, 0x2c, 0x02, 0x5e, 0x80, 0x00, 0x00, 0x00, 0xe9, 0x7f,
+ 0xe6, 0x9f, 0xae, 0x81, 0xa6, 0xd1, 0x24, 0xbd, 0x43, 0xb9, 0x42, 0x20,
+ 0x5b, 0xcc, 0xb7, 0x49, 0x69, 0x76, 0x42, 0x50, 0xb6, 0x8a, 0x7f, 0x31,
+ 0xc8, 0x15, 0xc3, 0x56, 0x73, 0xf6, 0x74, 0x1f, 0x51, 0xba, 0x34, 0x36,
+ 0xf1, 0xe7, 0xfa, 0xdf, 0x86, 0x59, 0x85, 0x09, 0x72, 0x58, 0x33, 0xf4,
+ 0x59, 0x3d, 0x4b, 0x2f, 0x76, 0x94, 0x20, 0x8a, 0x92, 0xb8, 0xf7, 0x3a,
+ 0x70, 0x1b, 0xb7, 0xbb, 0xfb, 0x12, 0xdb, 0x6b, 0x98, 0x5d, 0x76, 0xe8,
+ 0xf4, 0x1b, 0xff, 0x61, 0x10, 0xb1, 0x12, 0x17, 0x59, 0xbe, 0xe7, 0x7a,
+ 0xb6, 0x6b, 0x91, 0x61, 0x7c, 0x56, 0x93, 0xb6, 0xdf, 0xa2, 0x1b, 0x92,
+ 0xb7, 0x85, 0xac, 0x63, 0x76, 0x38, 0x13, 0x89, 0x88, 0xf6, 0x6d, 0xc0,
+ 0x9e, 0xbf, 0x09, 0x3e, 0x37, 0x17, 0xaa, 0x2c, 0x52, 0xcb, 0xc1, 0x73,
+ 0xca, 0xa7, 0xf8, 0xc5, 0x44, 0x0e, 0x82, 0x0f, 0xa0, 0xcc, 0xcc, 0x3f,
+ 0xb0, 0xae, 0x21, 0xc6, 0xc2, 0xdd, 0x20, 0x8f, 0x06, 0x8e, 0xee, 0x04,
+ 0xea, 0x55, 0x1e, 0xab, 0xa3, 0xf9, 0x38, 0xc7, 0x5a, 0x74, 0x35, 0xc0,
+ 0x9b, 0xc5, 0x85, 0x24, 0x81, 0x5a, 0x8b, 0x22, 0x7f, 0xc7, 0xd7, 0x3b,
+ 0x96, 0x3c, 0xf2, 0x89, 0x39, 0x84, 0x92, 0x87, 0xe6, 0x10, 0x78, 0x57,
+ 0xb3, 0x5c, 0xe9, 0x46, 0xa4, 0xb0, 0xb4, 0x83, 0x64, 0x87, 0x9b, 0xd2,
+ 0x67, 0x66, 0x87, 0x86, 0xe6, 0x0d, 0x14, 0xa8, 0x18, 0x15, 0x42, 0xad,
+ 0x6c, 0xf3, 0x98, 0x4c, 0x19, 0x11, 0xbc, 0x50, 0x8d, 0x96, 0x48, 0xee,
+ 0xe1, 0x16, 0x7d, 0xf0, 0x79, 0xc8, 0xa0, 0x79, 0x2e, 0x01, 0x02, 0x4e,
+ 0x7f, 0x56, 0xc2, 0x00, 0x7f, 0x6b, 0x82, 0x89, 0xf7, 0x05, 0x28, 0x2f,
+ 0x91, 0xb1, 0x70, 0x25, 0xf5, 0xaa, 0x06, 0xd5, 0xd5, 0x97, 0xa9, 0x76,
+ 0x0b, 0x35, 0x61, 0x95, 0xed, 0x08, 0xc7, 0x43, 0x69, 0xda, 0x89, 0x6e,
+ 0x83, 0x16, 0xdc, 0x64, 0xcf, 0x93, 0x6d, 0x08, 0x11, 0xd1, 0x3e, 0xed,
+ 0xdd, 0xb7, 0x8e, 0xd0, 0xfd, 0xed, 0x8e, 0x3d, 0x2c, 0x3c, 0x7a, 0x0c,
+ 0x0d, 0x1e, 0x87, 0xe0, 0x7e, 0x33, 0xcf, 0xbb, 0x5d, 0x8b, 0x79, 0x29,
+ 0xad, 0xab, 0x7e, 0x86, 0xaa, 0x04, 0x0e, 0xa0, 0x68, 0x80, 0x9c, 0xfe,
+ 0x46, 0xd4, 0xe7, 0x26, 0xe3, 0x52, 0xf6, 0x3e, 0xc6, 0xe7, 0x86, 0x0d,
+ 0x14, 0x56, 0xf7, 0xbd, 0xfe, 0x04, 0x2c, 0x66, 0xc5, 0x7d, 0xd8, 0xad,
+ 0xec, 0xbc, 0xf7, 0x0e, 0x2e, 0x6f, 0x06, 0x20, 0x2f, 0xc4, 0x22, 0xfa,
+ 0x89, 0x3c, 0x7a, 0xa3, 0x31, 0xa1, 0xa8, 0x8b, 0xcc, 0x53, 0xd4, 0x5c,
+ 0x1e, 0x9e, 0xbe, 0x91, 0x7b, 0x26, 0x42, 0x65, 0xfa, 0xbb, 0x71, 0xb8,
+ 0x9e, 0xc8, 0xb6, 0x5f, 0xb2, 0x43, 0xef, 0x2b, 0xa6, 0x36, 0xf3, 0x76,
+ 0x94, 0x6c, 0x4d, 0x03, 0x32, 0x1d, 0x3d, 0x8c, 0x88, 0x8b, 0x59, 0x75,
+ 0xb3, 0xca, 0x07, 0xeb, 0x46, 0x3f, 0x34, 0x03, 0xe3, 0xcb, 0xdf, 0xb2,
+ 0x3c, 0x2c, 0x42, 0x52, 0xd7, 0x8b, 0xa5, 0x32, 0x7a, 0x34, 0x88, 0x30,
+ 0xa8, 0x99, 0x40, 0x94, 0xcd, 0x98, 0x24, 0xf3, 0xe6, 0xaf, 0x27, 0x7c,
+ 0xe6, 0x45, 0x26, 0x4b, 0xc1, 0x3d, 0xda, 0x47, 0xad, 0xc0, 0x92, 0xf1,
+ 0xcf, 0x13, 0x37, 0x9d, 0xc0, 0xa6, 0xea, 0x7d, 0xc4, 0x8b, 0x6e, 0xbd,
+ 0x10, 0xa8, 0xcb, 0x2c, 0x8d, 0xac, 0xb7, 0xbf, 0xc7, 0x27, 0xb6, 0x67,
+ 0x9d, 0x01, 0x3d, 0xb4, 0xef, 0x6d, 0x10, 0xb1, 0xf8, 0x86, 0xba, 0x5c,
+ 0xae, 0x06, 0x35, 0x4b, 0x99, 0xe0, 0x4d, 0xf7, 0x07, 0x63, 0x07, 0x8d,
+ 0xf3, 0xa0, 0xb8, 0x06, 0x6b, 0xe4, 0xb0, 0xfe, 0x79, 0xa4, 0x2d, 0x28,
+ 0x6e, 0xd3, 0x9e, 0x7e, 0x92, 0xd7, 0x69, 0x0a, 0x6e, 0xb5, 0x12, 0xb7,
+ 0x79, 0x13, 0xd8, 0xf1, 0x82, 0x11, 0xf6, 0xe0, 0xb8, 0x05, 0x13, 0xf8,
+ 0x8b, 0xcf, 0xb3, 0xab, 0x17, 0xfe, 0xf4, 0x22, 0x1e, 0xbd, 0x88, 0x4e,
+ 0x95, 0x7d, 0x05, 0xf4, 0x2a, 0xba, 0xc9, 0x22, 0xaa, 0xb8, 0x96, 0x19,
+ 0x4b, 0xed, 0x2b, 0xfc, 0x21, 0x3f, 0xf8, 0x9c, 0xaf, 0xb4, 0x31, 0x3e,
+ 0xa0, 0x45, 0x3c, 0xce, 0xde, 0x94, 0x56, 0xc7, 0xd8, 0x24, 0xfc, 0xb7,
+ 0x22, 0x74, 0x62, 0x20, 0x3a, 0x47, 0xae, 0xdc, 0x05, 0x64, 0x27, 0x4b,
+ 0xab, 0xb5, 0xf1, 0x18, 0x43, 0xa4, 0x6c, 0x00, 0xdc, 0x61, 0xb6, 0xeb,
+ 0x14, 0x5e, 0xaf, 0xe8, 0xd2, 0x43, 0x67, 0x88, 0xc9, 0xb7, 0x1e, 0xd8,
+ 0x3b, 0x8a, 0xe1, 0x4c, 0xa5, 0x03, 0x6c, 0x8c, 0x38, 0xa8, 0x40, 0xe0,
+ 0xe9, 0xf8, 0x42, 0x58, 0x21, 0x7c, 0x85, 0x5d, 0x82, 0x9a, 0x9f, 0x11,
+ 0xf4, 0x72, 0x05, 0xe7, 0x6e, 0x04, 0x25, 0x18, 0x84, 0xf3, 0x3a, 0x1b,
+ 0xa0, 0x18, 0xe4, 0x5a, 0x58, 0xb7, 0xd2, 0x9b, 0xd3, 0xb9, 0x0e, 0xb8,
+ 0x93, 0x86, 0x91, 0x29, 0xa4, 0x1b, 0x60, 0xa7, 0x2d, 0x0d, 0x1d, 0xea,
+ 0x08, 0x90, 0x8a, 0x98, 0x02, 0xf8, 0x1b, 0x06, 0xb0, 0xef, 0x88, 0xbb,
+ 0xc4, 0xef, 0xfb, 0xbc, 0xf4, 0x74, 0x41, 0x28, 0xd0, 0x64, 0xdb, 0x47,
+ 0x2e, 0xa5, 0xfe, 0x01, 0x15, 0x4c, 0xb0, 0x0d, 0x80, 0x98, 0x1b, 0x17,
+ 0x8e, 0x50, 0xaf, 0x12, 0x5b, 0xd9, 0xf2, 0x41, 0xb4, 0x84, 0x33, 0x74,
+ 0xe9, 0x86, 0xf9, 0xb7, 0xae, 0x69, 0x7e, 0x52, 0x91, 0x27, 0xd3, 0xa5,
+ 0x85, 0x3c, 0xec, 0x2d, 0x39, 0x8f, 0xd8, 0xbb, 0x31, 0x42, 0xa1, 0xb6,
+ 0x27, 0x28, 0x4d, 0x72, 0x74, 0xbe, 0xca, 0xf5, 0xd8, 0xce, 0x42, 0x72,
+ 0x26, 0xcb, 0x68, 0x78, 0x1f, 0x35, 0xcc, 0x2d, 0xac, 0xb4, 0xbb, 0x7a,
+ 0xb6, 0x1f, 0x51, 0x09, 0x0e, 0xe4, 0xce, 0x92, 0x70, 0x36, 0x54, 0xa7,
+ 0x7f, 0x24, 0x60, 0xe8, 0x44, 0xcc, 0x19, 0x4e, 0x2d, 0xd7, 0x8d, 0x84,
+ 0x73, 0xd6, 0xbd, 0x0e, 0x3d, 0xea, 0x45, 0xbc, 0x70, 0xcb, 0x30, 0x28,
+ 0x83, 0x5d, 0x01, 0x9a, 0xe1, 0xb0, 0x21, 0x66, 0x88, 0xe7, 0xad, 0x46,
+ 0xbd, 0x1c, 0x50, 0xb2, 0x39, 0x08, 0x7c, 0x1d, 0x8d, 0xca, 0xcd, 0x9d,
+ 0xf9, 0x63, 0xc2, 0x0b, 0xdf, 0x01, 0xb0, 0x58, 0x49, 0xb9, 0x24, 0xe3,
+ 0xe9, 0x3d, 0xa3, 0xfc, 0x8a, 0x90, 0x9c, 0xbd, 0xe2, 0x0c, 0x74, 0xc3,
+ 0x12, 0x52, 0x6a, 0xa4, 0x67, 0xb2, 0x9b, 0xda, 0x81, 0xa1, 0x25, 0x53,
+ 0x0d, 0x87, 0xec, 0x1b, 0x44, 0x80, 0xe5, 0x94, 0x2c, 0xb9, 0xc4, 0xfc,
+ 0xf3, 0xa5, 0xdc, 0xb3, 0x88, 0x0f, 0x27, 0xc1, 0x8d, 0xe3, 0xfb, 0x4e,
+ 0x76, 0x57, 0xfd, 0x28, 0x02, 0x2b, 0x9a, 0x0e, 0x39, 0x78, 0x34, 0x34,
+ 0x10, 0xe8, 0x35, 0x07, 0x28, 0x69, 0xdc, 0x25, 0xa7, 0x3a, 0xa2, 0xa5,
+ 0x69, 0xe6, 0xaf, 0xad, 0x69, 0xbf, 0x07, 0x48, 0x48, 0xc9, 0x2b, 0xf0,
+ 0xcc, 0x7d, 0x60, 0x86, 0xa7, 0x56, 0xe2, 0x18, 0x23, 0x6e, 0x8f, 0xa4,
+ 0x4a, 0xf4, 0x8b, 0x1c, 0x16, 0xf8, 0x30, 0x60, 0xd5, 0xc4, 0x93, 0x66,
+ 0x31, 0x11, 0x2d, 0xa6, 0x8d, 0x2f, 0x34, 0x38, 0x66, 0xc2, 0x5e, 0xca,
+ 0xbd, 0x79, 0xeb, 0x42, 0xbb, 0x20, 0x88, 0x89, 0xcb, 0xd5, 0xbe, 0x22,
+ 0xa9, 0x31, 0x0e, 0x21, 0x9d, 0xd6, 0x27, 0x3b, 0xab, 0xa1, 0xf7, 0xd7,
+ 0xf3, 0x6a, 0x74, 0xe5, 0xab, 0xad, 0xd3, 0xc9, 0xc5, 0x85, 0x5a, 0x1d,
+ 0xd1, 0xc3, 0xb5, 0x85, 0xc2, 0xde, 0x51, 0x3b, 0x0b, 0x4a, 0x6e, 0x2b,
+ 0x35, 0x5a, 0xe5, 0xa6, 0x3a, 0xce, 0xe8, 0x77, 0x08, 0x91, 0x26, 0xe1,
+ 0x68, 0xa8, 0xf4, 0x01, 0x49, 0x6a, 0xca, 0x05, 0x19, 0x18, 0x2a, 0x55,
+ 0x7e, 0x56, 0x03, 0xd6, 0x6b, 0x07, 0xa4, 0xa2, 0x96, 0x4f, 0x7f, 0x73,
+ 0x89, 0x32, 0x09, 0xba, 0x76, 0xfc, 0x40, 0x7b, 0x77, 0x28, 0x8f, 0x81,
+ 0x84, 0x1d, 0x5a, 0xb3, 0x8a, 0xc3, 0xb2, 0x30, 0x69, 0xcf, 0xab, 0x1c,
+ 0x04, 0xcb, 0x79, 0x10, 0x3f, 0x6b, 0x42, 0xc0, 0xcb, 0x36, 0x96, 0xe6,
+ 0xde, 0xc2, 0x59, 0xca, 0x52, 0xdc, 0x41, 0x3d, 0xaf, 0xcd, 0xea, 0x83,
+ 0xa3, 0x9f, 0x25, 0xab, 0x19, 0x26, 0xef, 0x69, 0xb9, 0xd9, 0x1a, 0xfa,
+ 0x28, 0x61, 0x27, 0x07, 0x81, 0xf9, 0xc1, 0xc4, 0xf6, 0x34, 0x98, 0x72,
+ 0x11, 0x11, 0xf6, 0x95, 0x0c, 0x82, 0x02, 0xaa, 0xbb, 0xc2, 0xec, 0xcb,
+ 0x49, 0x8f, 0xa0, 0x22, 0x00, 0xf0, 0x96, 0xb5, 0xa3, 0x7b, 0xd1, 0x6a,
+ 0x91, 0x88, 0x88, 0x7a, 0x41, 0xdc, 0xb4, 0x1c, 0x37, 0xe6, 0x67, 0x78,
+ 0x8d, 0x30, 0xd1, 0xe2, 0x97, 0x5a, 0xab, 0xdc, 0xad, 0xdf, 0x84, 0x72,
+ 0x78, 0xfa, 0xed, 0x40, 0x5d, 0x16, 0x97, 0x6a, 0x17, 0xf2, 0x03, 0x6c,
+ 0x5b, 0xdc, 0x0b, 0x21, 0x35, 0x0d, 0x17, 0x2a, 0x72, 0x3d, 0x1b, 0xd5,
+ 0x9a, 0x5d, 0x97, 0x93, 0xe2, 0x84, 0x35, 0x91, 0xc3, 0xde, 0xa3, 0xb8,
+ 0x1f, 0x51, 0xf7, 0x15, 0xc9, 0x32, 0xe6, 0x47, 0x20, 0x15, 0x07, 0x2d,
+ 0x15, 0xb3, 0xce, 0xea, 0x19, 0xfa, 0xcc, 0x4e, 0xfa, 0x34, 0x0c, 0xcb,
+ 0x79, 0xb1, 0xbd, 0xf6, 0xc6, 0xac, 0x7b, 0x46, 0xc5, 0xfb, 0xb6, 0x5d,
+ 0x67, 0x99, 0x83, 0xa1, 0xba, 0x32, 0xa9, 0x58, 0x99, 0xb8, 0xb7, 0xe0,
+ 0x5e, 0x2a, 0xf9, 0x77, 0xc0, 0x44, 0x81, 0x5b, 0x97, 0x16, 0x49, 0x15,
+ 0x18, 0x20, 0x92, 0x5c, 0x4e, 0xeb, 0xf0, 0xc9, 0x39, 0x0a, 0x9a, 0x59,
+ 0xd3, 0x49, 0x25, 0x2a, 0xf1, 0xe9, 0x2f, 0x4a, 0x65, 0x40, 0x77, 0x1b,
+ 0x67, 0xb0, 0xff, 0x4e, 0xb9, 0x1e, 0x86, 0xac, 0x55, 0xc0, 0x1e, 0xeb,
+ 0xaf, 0x56, 0x4d, 0x8a, 0xc0, 0xe1, 0xb4, 0x77, 0x13, 0xc4, 0x98, 0x0e,
+ 0x3c, 0xb9, 0x8c, 0x2d, 0xe0, 0x3d, 0x23, 0xc7, 0x3b, 0x30, 0x7b, 0xc7,
+ 0xc2, 0x65, 0xd5, 0x8d, 0x0a, 0x28, 0xc1, 0x5f, 0xf4, 0x28, 0x3a, 0x70,
+ 0x57, 0xfd, 0xbb, 0x7c, 0x7b, 0x67, 0x25, 0x71, 0xa6, 0x36, 0x93, 0xff,
+ 0xef, 0xcd, 0x51, 0x1a, 0xfc, 0xc9, 0x87, 0x29, 0x11, 0xce, 0x75, 0x54,
+ 0x28, 0x50, 0xe2, 0x31, 0x9a, 0x87, 0x9a, 0xf0, 0x29, 0x6a, 0x3a, 0x19,
+ 0x89, 0xe1, 0x27, 0xd1, 0x70, 0x72, 0x1d, 0x14, 0x71, 0x6d, 0x5b, 0xad,
+ 0x58, 0xc3, 0xb1, 0xfe, 0xbd, 0x72, 0x11, 0x48, 0x0b, 0x06, 0xe8, 0x74,
+ 0x82, 0x1f, 0xd9, 0x96, 0xa6, 0x2c, 0x7d, 0x9f, 0x21, 0x3d, 0xcd, 0x57,
+ 0x5c, 0x5a, 0x78, 0xfd, 0x49, 0xd9, 0xf1, 0xdb, 0x31, 0xb8, 0xd8, 0xaa,
+ 0x73, 0x51, 0xba, 0x51, 0xcf, 0x22, 0x66, 0x78, 0x71, 0xb8, 0x11, 0xd2,
+ 0x7b, 0xd7, 0x84, 0x7e, 0x35, 0xe9, 0x2a, 0x40, 0x74, 0xb8, 0x3f, 0xda,
+ 0xe3, 0xf2, 0x5c, 0x00, 0x29, 0xb9, 0x60, 0xb8, 0x15, 0x50, 0xab, 0x08,
+ 0xa5, 0x76, 0x20, 0xb3, 0x6d, 0x93, 0x2e, 0x58, 0x9f, 0xc8, 0x51, 0xf4,
+ 0xba, 0x96, 0xc0, 0x3c, 0x39, 0x4d, 0xff, 0x46, 0x86, 0xc0, 0xdb, 0xd3,
+ 0x21, 0xa2, 0x1c, 0x7b, 0xce, 0x2e, 0x4a, 0x8c, 0x3b, 0x59, 0x81, 0xfb,
+ 0xa5, 0xcc, 0xd8, 0xe9, 0x07, 0x6b, 0xc1, 0xcc, 0x23, 0xbb, 0xfc, 0x8e,
+ 0x5c, 0xb8, 0x44, 0x68, 0x36, 0x34, 0x9c, 0x44, 0xd2, 0x9e, 0x0f, 0x53,
+ 0xc9, 0xfe, 0x41, 0xba, 0x55, 0x49, 0xad, 0x8e, 0x5b, 0x82, 0x9d, 0xcd,
+ 0xc4, 0xbc, 0x16, 0xa2, 0x0d, 0xfc, 0xaf, 0x6f, 0xe5, 0xb3, 0x63, 0x7c,
+ 0x47, 0x79, 0x07, 0x59, 0x8b, 0xfe, 0xf3, 0x00, 0x07, 0xf0, 0x50, 0x57,
+ 0xa6, 0xd7, 0xb8, 0xdd, 0x46, 0xb6, 0xa3, 0x80, 0x3b, 0x36, 0xbd, 0xaa,
+ 0xb3, 0x5b, 0xa0, 0xee, 0x02, 0x19, 0xf4, 0xd7, 0x7e, 0xaf, 0xbb, 0xa1,
+ 0xc4, 0xb3, 0x0f, 0xab, 0x57, 0x89, 0x66, 0x82, 0x4f, 0xdc, 0x15, 0xa0,
+ 0xf2, 0xe2, 0x6a, 0x49, 0x41, 0x86, 0xe4, 0x50, 0x06, 0xda, 0x49, 0xa2,
+ 0x06, 0xca, 0xf1, 0x2d, 0xbb, 0x8b, 0x83, 0xb7, 0x0e, 0xdd, 0x44, 0xd4,
+ 0xe7, 0xf2, 0xe6, 0x4e, 0xac, 0x8e, 0x61, 0xa3, 0x8a, 0x01, 0xba, 0x7b,
+ 0x88, 0xf4, 0xd7, 0x0f, 0xeb, 0xf6, 0x6c, 0x7f, 0x49, 0x4e, 0xd4, 0x9d,
+ 0xe7, 0x9e, 0xaf, 0xbb, 0x0a, 0x3b, 0x69, 0x7d, 0xbb, 0x2b, 0xbb, 0xf4,
+ 0x04, 0x4a, 0xe3, 0x57, 0xdc, 0x70, 0x7e, 0xec, 0x7a, 0xf0, 0xc5, 0x0c,
+ 0xb7, 0x1d, 0x1b, 0xa2, 0xae, 0xd5, 0xcd, 0xaf, 0xb1, 0xdc, 0x3b, 0x03,
+ 0x28, 0xec, 0xc2, 0x70, 0xf2, 0x7a, 0x4e, 0x47, 0x3b, 0x45, 0xb9, 0x8b,
+ 0x15, 0xed, 0xd9, 0x19, 0xbd, 0x6e, 0x56, 0x75, 0xf0, 0xe4, 0x49, 0x3b,
+ 0xc4, 0xb2, 0xfa, 0x5a, 0x44, 0x4c, 0x1a, 0xbb, 0xce, 0x64, 0xed, 0x7a,
+ 0x18, 0xc8, 0x02, 0x62, 0x43, 0x75, 0xfc, 0x20, 0x46, 0xf5, 0xf2, 0x5b,
+ 0xc5, 0xc8, 0xe7, 0xce, 0xe4, 0xf4, 0x9d, 0x28, 0xb9, 0x76, 0x46, 0xff,
+ 0xb3, 0x18, 0x8f, 0x72, 0x7b, 0x4a, 0xfa, 0x01, 0xdc, 0x38, 0x97, 0x10,
+ 0x46, 0x79, 0x15, 0x69, 0x4f, 0xb7, 0xed, 0xa6, 0xb5, 0x48, 0xa2, 0xf1,
+ 0xe3, 0x39, 0xec, 0x98, 0x07, 0x27, 0x3d, 0xcf, 0x52, 0x50, 0x77, 0x35,
+ 0x9c, 0xd2, 0x98, 0x82, 0x63, 0xeb, 0xed, 0x0e, 0x80, 0xe7, 0x02, 0x4b,
+ 0xfa, 0xb5, 0x67, 0x99, 0x32, 0x76, 0xd8, 0xae, 0x80, 0x6f, 0x44, 0xf7,
+ 0x26, 0x24, 0x1a, 0x07, 0xe2, 0x7f, 0x3d, 0xa7, 0x64, 0xa6, 0x62, 0x6b,
+ 0x8f, 0x85, 0xa9, 0x44, 0xf1, 0x1d, 0x48, 0x28, 0xdf, 0x74, 0xf0, 0x2e,
+ 0x92, 0x5e, 0x45, 0x32, 0x34, 0x43, 0x10, 0x9d, 0x4c, 0xcb, 0x58, 0x58,
+ 0xcf, 0xd6, 0xbb, 0x3a, 0xe7, 0xc9, 0x26, 0x9f, 0x82, 0x25, 0xe1, 0x56,
+ 0x83, 0x44, 0x73, 0x72, 0x34, 0x52, 0x70, 0x00, 0x00, 0xcc, 0xa6, 0xe0,
+ 0x39, 0xff, 0x70, 0x71, 0x9f, 0x2a, 0x41, 0x36, 0xca, 0x3c, 0xb7, 0x7c,
+ 0xb7, 0x68, 0x8c, 0x11, 0xb0, 0xf0, 0x0c, 0x63, 0x4e, 0x13, 0x60, 0xc7,
+ 0xca, 0x0a, 0xa0, 0xec, 0x69, 0x11, 0x7c, 0x81, 0xc1, 0x55, 0xba, 0x17,
+ 0x45, 0xeb, 0xc5, 0x39, 0x79, 0x39, 0xa6, 0x55, 0xc7, 0xa5, 0xb8, 0x01,
+ 0x9e, 0x92, 0x79, 0xeb, 0xd5, 0xe2, 0x94, 0x7d, 0x1c, 0x84, 0xd8, 0xd0,
+ 0x7f, 0xe7, 0x04, 0xed, 0xac, 0xca, 0x99, 0x1f, 0xa4, 0xe7, 0x29, 0x0d,
+ 0x66, 0x22, 0xb0, 0xb2, 0x9d, 0xb2, 0x4c, 0xe7, 0x85, 0xce, 0xc0, 0x9d,
+ 0xbb, 0x78, 0x4c, 0x37, 0x2c, 0x94, 0x7e, 0xc8, 0x05, 0x98, 0x22, 0x42,
+ 0xf3, 0x1b, 0x45, 0x69, 0x47, 0xc0, 0xff, 0xfe, 0xc7, 0x48, 0x9e, 0xc7,
+ 0xa4, 0xb8, 0x9f, 0xd1, 0x29, 0x76, 0x0e, 0x04, 0x79, 0xd5, 0x23, 0x55,
+ 0xad, 0x8a, 0x25, 0xfc, 0xad, 0x60, 0x98, 0x42, 0x0c, 0xa6, 0xe4, 0x64,
+ 0x30, 0xc4, 0xea, 0xbc, 0x5f, 0x6a, 0x07, 0x26, 0x7c, 0x8b, 0xdc, 0x36,
+ 0x1f, 0xf6, 0x4a, 0x36, 0x77, 0x42, 0x3c, 0xcd, 0x36, 0xd2, 0x4e, 0x8a,
+ 0x8e, 0x05, 0xb4, 0xa0, 0xab, 0x1e, 0x41, 0xb4, 0x82, 0xe4, 0xe9, 0x5e,
+ 0x6e, 0x27, 0xf0, 0xfe, 0x9f, 0x79, 0x41, 0x2a, 0xdf, 0x1d, 0xbe, 0x62,
+ 0xca, 0x1b, 0x3a, 0x5b, 0xcb, 0x86, 0x2b, 0xfd, 0xe6, 0x83, 0x94, 0xf5,
+ 0x65, 0x23, 0xff, 0x4d, 0xb6, 0xe2, 0x4a, 0x56, 0x89, 0x7e, 0x7d, 0xc3,
+ 0x2c, 0xd4, 0xa3, 0x69, 0x9a, 0x2f, 0x72, 0x25, 0x6e, 0x58, 0x00, 0xaa,
+ 0x2c, 0x66, 0x88, 0x86, 0xd2, 0xcc, 0x04, 0x19, 0xcb, 0x1e, 0xf0, 0x9b,
+ 0x25, 0x8a, 0x1c, 0xb3, 0x5f, 0x48, 0x51, 0x74, 0x84, 0xca, 0xae, 0x3d,
+ 0x99, 0x1f, 0xa3, 0x2d, 0xbf, 0x97, 0x56, 0x54, 0x61, 0xb3, 0x4e, 0x00,
+ 0xa3, 0x4c, 0xbd, 0x81, 0x00, 0xc8, 0x00, 0x86, 0x00, 0x40, 0x96, 0xf0,
+ 0x01, 0x17, 0x86, 0x00, 0x0c, 0x7f, 0x88, 0x15, 0x07, 0xf2, 0x2e, 0x0e,
+ 0x27, 0xcb, 0x0c, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x7e, 0xdd, 0x5f,
+ 0x17, 0xc9, 0x99, 0x69, 0x17, 0x29, 0xd6, 0xfd, 0xe0, 0x80, 0xc1, 0xa3,
+ 0xa0, 0x87, 0x0b, 0x49, 0xaa, 0xba, 0x18, 0xdf, 0xad, 0xb0, 0x55, 0xc1,
+ 0x56, 0x6f, 0xba, 0x53, 0x1d, 0x28, 0xec, 0x91, 0x2d, 0x57, 0x8c, 0x2c,
+ 0x58, 0x49, 0x16, 0x3c, 0xb6, 0x7b, 0x90, 0x8a, 0xee, 0xb0, 0xf1, 0x45,
+ 0x36, 0x10, 0x86, 0xea, 0xe2, 0x1f, 0x90, 0x99, 0x5a, 0x60, 0x6a, 0xbb,
+ 0x08, 0xc6, 0x90, 0xa9, 0x7c, 0x60, 0x06, 0x8c, 0x1e, 0xf3, 0x46, 0x34,
+ 0x0e, 0x2b, 0x75, 0xd5, 0xd8, 0x3e, 0x60, 0x0b, 0xa7, 0x12, 0x59, 0x93,
+ 0xa8, 0xef, 0xa0, 0x94, 0xc7, 0x89, 0x58, 0x6b, 0x99, 0x2f, 0x0c, 0xb1,
+ 0xef, 0x02, 0x89, 0x17, 0x49, 0xb9, 0x32, 0x8f, 0x8b, 0x8e, 0xfd, 0x06,
+ 0x00, 0x23, 0x81, 0xdc, 0x73, 0x2e, 0xce, 0x22, 0x57, 0xec, 0x20, 0xd2,
+ 0x64, 0x9f, 0x6f, 0x43, 0xad, 0xe0, 0x0c, 0x82, 0xe2, 0xa1, 0xc3, 0x2e,
+ 0x2b, 0x9e, 0xba, 0x93, 0xb6, 0x57, 0x75, 0xfc, 0x62, 0x0e, 0x63, 0x94,
+ 0x30, 0xf7, 0x0e, 0x3d, 0x6c, 0x6c, 0xdb, 0x28, 0xc6, 0xe3, 0x11, 0x52,
+ 0x2a, 0xf1, 0x81, 0x8f, 0xa6, 0xbd, 0xb9, 0xa8, 0x85, 0xda, 0x7f, 0x6c,
+ 0xe6, 0x02, 0x8d, 0x63, 0x41, 0x41, 0x0e, 0xb2, 0x49, 0x18, 0x1d, 0x3e,
+ 0x2a, 0xcf, 0xed, 0x36, 0x1c, 0x19, 0xb0, 0x13, 0x11, 0xcf, 0xf3, 0xdc,
+ 0x4d, 0x1b, 0xce, 0xf3, 0xac, 0xd8, 0xdb, 0x39, 0x5d, 0xb8, 0xd2, 0x3d,
+ 0xb4, 0xaf, 0x7f, 0xca, 0x44, 0xe8, 0xf4, 0x53, 0x73, 0xeb, 0xe2, 0x25,
+ 0x7c, 0x09, 0x6a, 0xa8, 0x42, 0xe9, 0xaf, 0x87, 0x7c, 0xfa, 0x2b, 0x70,
+ 0x2f, 0x60, 0xb7, 0x5b, 0x77, 0xa9, 0x37, 0x14, 0xae, 0xae, 0x6b, 0x33,
+ 0xc3, 0x0e, 0x23, 0x2c, 0xb7, 0xd5, 0x73, 0xa8, 0x90, 0xd8, 0xba, 0x39,
+ 0xdb, 0x56, 0x9d, 0x4a, 0x14, 0x0b, 0x5c, 0x74, 0xab, 0x72, 0x0e, 0x2a,
+ 0xb8, 0x0d, 0xc8, 0xb6, 0x53, 0x87, 0xd8, 0xb3, 0xd9, 0xf5, 0x41, 0xf9,
+ 0xfa, 0xf1, 0x6f, 0x2a, 0x28, 0x28, 0xde, 0xe4, 0x9d, 0xd6, 0xf7, 0x00,
+ 0xc1, 0xd4, 0x22, 0x03, 0x9d, 0x5e, 0x37, 0x93, 0x4a, 0x8a, 0x1a, 0xf1,
+ 0xb8, 0x8e, 0x86, 0xf3, 0x82, 0x4f, 0xd5, 0x9e, 0xb0, 0x2c, 0x4b, 0xba,
+ 0x96, 0x4b, 0x6a, 0xca, 0x0f, 0xd0, 0xf1, 0xfd, 0xd0, 0x1e, 0xe7, 0xa9,
+ 0xfd, 0x39, 0x1d, 0x15, 0xf5, 0x2b, 0x67, 0xef, 0x65, 0x8f, 0xe4, 0x15,
+ 0x91, 0x0e, 0xc1, 0x6c, 0xc2, 0xfa, 0xad, 0xe1, 0xfd, 0x4b, 0x0d, 0x95,
+ 0x39, 0x1d, 0xbf, 0xe7, 0x02, 0x7c, 0x32, 0x6d, 0x3c, 0x9b, 0x49, 0x05,
+ 0x7c, 0x89, 0xa6, 0x5a, 0xeb, 0x7e, 0x0e, 0xf8, 0x66, 0xd8, 0xdf, 0xb5,
+ 0x17, 0x25, 0x72, 0x72, 0xa9, 0x66, 0x15, 0x05, 0x17, 0xfd, 0x51, 0x1b,
+ 0x9c, 0xae, 0x02, 0x39, 0xf2, 0xec, 0x53, 0x45, 0x00, 0x1f, 0x89, 0x93,
+ 0x22, 0xf7, 0xed, 0xe4, 0xd5, 0x33, 0xb4, 0xf7, 0x0c, 0xf8, 0xc7, 0xa1,
+ 0x85, 0x3d, 0x03, 0xd1, 0x44, 0xf3, 0x36, 0xfc, 0x1d, 0x0c, 0xca, 0x47,
+ 0xa7, 0xe2, 0x5b, 0x1d, 0x1f, 0x1b, 0x29, 0x04, 0xe8, 0x11, 0xa2, 0x43,
+ 0xa9, 0x32, 0x76, 0xc3, 0x6a, 0x38, 0xe2, 0xac, 0xe9, 0xc4, 0xdb, 0x13,
+ 0x37, 0x5c, 0x2d, 0xd3, 0x02, 0x6a, 0x4b, 0x5f, 0xd7, 0x78, 0x74, 0x02,
+ 0xfb, 0x1a, 0x60, 0x56, 0x2b, 0xab, 0x7a, 0xa8, 0x89, 0xcc, 0x78, 0xb0,
+ 0x9a, 0xe4, 0x0a, 0x5b, 0x08, 0xca, 0x1d, 0x55, 0x2f, 0xbf, 0x46, 0xee,
+ 0xaa, 0x38, 0xcc, 0x85, 0x4e, 0x9c, 0x7e, 0x25, 0x22, 0x51, 0x84, 0x3a,
+ 0xda, 0x25, 0xfa, 0x6e, 0x32, 0x4a, 0xa3, 0xd4, 0x45, 0x92, 0xba, 0x46,
+ 0x87, 0x48, 0x48, 0x3b, 0xa8, 0xd8, 0x2c, 0xd0, 0x98, 0x2f, 0xe5, 0xe3,
+ 0xee, 0xd8, 0xf5, 0xba, 0x55, 0xf4, 0xe4, 0x4d, 0x74, 0xf5, 0x7e, 0xa0,
+ 0x8e, 0x31, 0x20, 0x30, 0xe0, 0x33, 0x10, 0xac, 0x22, 0x9f, 0xcb, 0xf9,
+ 0x7d, 0xef, 0x1c, 0x0a, 0x59, 0x79, 0x35, 0xa3, 0x50, 0x36, 0x42, 0x71,
+ 0x1a, 0x2b, 0x06, 0x2c, 0x90, 0xac, 0x16, 0x77, 0x66, 0x42, 0x84, 0xd3,
+ 0x68, 0xbc, 0xe7, 0x0b, 0x60, 0x33, 0x71, 0x09, 0xa2, 0xa8, 0xa8, 0x1a,
+ 0x5c, 0x15, 0xbe, 0xc7, 0xb9, 0x19, 0xc7, 0xcd, 0x00, 0xa1, 0x84, 0x57,
+ 0xe5, 0x59, 0xa1, 0x7e, 0xc2, 0xe6, 0x45, 0xa1, 0xec, 0x19, 0xf4, 0xd1,
+ 0x5d, 0x35, 0xc0, 0x0a, 0x0e, 0xd9, 0xce, 0x96, 0x74, 0x6a, 0x94, 0x5b,
+ 0x21, 0x02, 0xce, 0x86, 0xd3, 0x7e, 0x26, 0x84, 0x66, 0xe0, 0x40, 0xc9,
+ 0xa1, 0xe1, 0xfb, 0x4c, 0xab, 0x42, 0x7d, 0x52, 0x0e, 0x62, 0x6a, 0xaf,
+ 0xe8, 0xe0, 0x40, 0x00, 0xb0, 0x0c, 0xc5, 0xc9, 0x3d, 0xbb, 0x32, 0xe9,
+ 0x80, 0x28, 0xf2, 0xb5, 0x31, 0xf6, 0x36, 0x3d, 0xb7, 0xc4, 0x27, 0x6a,
+ 0x34, 0x3b, 0x3c, 0x4b, 0xc5, 0x25, 0x4f, 0x62, 0xdc, 0x2c, 0xfb, 0x22,
+ 0x0a, 0x54, 0x81, 0x16, 0x1f, 0xa2, 0x03, 0x61, 0xaf, 0x38, 0x04, 0x81,
+ 0x2f, 0x68, 0x52, 0xae, 0xb4, 0x85, 0x7e, 0x3c, 0xd7, 0xd2, 0xca, 0x73,
+ 0xc2, 0x48, 0x7a, 0xad, 0x05, 0x09, 0xfb, 0x7d, 0xd6, 0xed, 0xc8, 0x04,
+ 0xaf, 0x91, 0x7b, 0x5e, 0xa0, 0xbe, 0x19, 0x84, 0x98, 0xca, 0x00, 0x6f,
+ 0x14, 0x9c, 0xc6, 0x02, 0xbf, 0x40, 0xd1, 0x7e, 0x14, 0x31, 0xc7, 0xa3,
+ 0xf7, 0xbb, 0x8f, 0xd6, 0x6a, 0x38, 0xaf, 0x5b, 0x1f, 0x90, 0xa8, 0xff,
+ 0xc8, 0xe3, 0x5c, 0x95, 0x32, 0x88, 0x66, 0xbb, 0x36, 0x91, 0x04, 0xbc,
+ 0xfe, 0x15, 0x13, 0xce, 0x31, 0x17, 0x2a, 0x8b, 0xb4, 0x15, 0x1e, 0xc7,
+ 0xf0, 0xdf, 0x45, 0x3e, 0x22, 0x0e, 0x1d, 0x9e, 0xf2, 0x57, 0x38, 0x07,
+ 0x4f, 0xf6, 0x64, 0xb1, 0x31, 0xf5, 0xcc, 0x7f, 0xdb, 0x38, 0x80, 0x69,
+ 0x0c, 0xbc, 0x69, 0xbd, 0x6b, 0x40, 0x85, 0x21, 0x58, 0xb7, 0x89, 0x79,
+ 0xd3, 0x5d, 0xef, 0x34, 0xf6, 0xee, 0xee, 0x5f, 0x71, 0x0c, 0x65, 0x19,
+ 0x97, 0xcd, 0x41, 0x46, 0x93, 0x71, 0x32, 0x61, 0x84, 0xff, 0xd0, 0x84,
+ 0x3f, 0xa5, 0x97, 0xa5, 0x00, 0xb5, 0x4b, 0x88, 0x98, 0xaf, 0xfb, 0xe1,
+ 0x82, 0x1d, 0x9f, 0x6b, 0x8c, 0xbf, 0xeb, 0xee, 0xe8, 0x07, 0xaf, 0x92,
+ 0x6d, 0x3e, 0x6a, 0x12, 0xb2, 0x64, 0x6a, 0x6c, 0x07, 0xaa, 0x6b, 0x07,
+ 0x09, 0x7d, 0x30, 0x67, 0x17, 0xd5, 0x9c, 0x50, 0xd4, 0x51, 0x11, 0x52,
+ 0xeb, 0x2b, 0x44, 0x11, 0x80, 0x64, 0x1a, 0x24, 0xf5, 0xdd, 0xc5, 0x78,
+ 0xd0, 0x9c, 0x75, 0x32, 0x74, 0x41, 0xca, 0x89, 0x08, 0x87, 0xf8, 0xb5,
+ 0x09, 0x44, 0xd9, 0x18, 0x09, 0x27, 0x77, 0x7a, 0xb7, 0x83, 0x1b, 0x48,
+ 0xe6, 0x2c, 0x8d, 0xbe, 0x44, 0x21, 0xcf, 0xa5, 0x20, 0x01, 0x07, 0x9d,
+ 0xa4, 0x2b, 0x74, 0x32, 0x30, 0xc9, 0x46, 0x92, 0xde, 0x32, 0x3e, 0x49,
+ 0x7a, 0xfa, 0x30, 0xf4, 0x51, 0x64, 0x4a, 0xb6, 0x84, 0x75, 0x15, 0x9a,
+ 0x1a, 0xb8, 0x13, 0xb6, 0xe6, 0x00, 0x12, 0xcc, 0x16, 0x72, 0x5b, 0x73,
+ 0x70, 0xb8, 0x53, 0x5f, 0x77, 0x31, 0xad, 0xeb, 0x81, 0x4f, 0x12, 0xaa,
+ 0x4b, 0xeb, 0xd5, 0x73, 0x32, 0xa4, 0x9a, 0x56, 0xf7, 0xed, 0x5d, 0xcb,
+ 0xd7, 0xf6, 0xa3, 0x99, 0x51, 0xb8, 0xb6, 0x9d, 0x7c, 0x5d, 0x75, 0x06,
+ 0x94, 0x8d, 0x59, 0x47, 0x32, 0xd2, 0x3d, 0x11, 0x74, 0x0a, 0x84, 0x4a,
+ 0x8a, 0x72, 0xf8, 0x46, 0xfd, 0xe1, 0x00, 0x85, 0x90, 0x0d, 0xf0, 0xcb,
+ 0x9f, 0xb1, 0x7a, 0x6c, 0x01, 0x63, 0xc0, 0x34, 0xc5, 0x2e, 0xd5, 0x38,
+ 0x00, 0x00, 0x00, 0x01, 0x7a, 0x6e, 0xa3, 0xaa, 0xc7, 0xf5, 0xb1, 0x7f,
+ 0x7e, 0xec, 0x6e, 0x9f, 0x02, 0x11, 0x40, 0x10, 0xb5, 0xd0, 0x38, 0xc6,
+ 0xab, 0x56, 0x70, 0x30, 0x93, 0xf1, 0xde, 0x78, 0x21, 0x83, 0x8f, 0x78,
+ 0x4b, 0x78, 0xce, 0x82, 0xb6, 0x9b, 0x29, 0xe5, 0x8f, 0x49, 0x16, 0x0d,
+ 0x81, 0x37, 0x76, 0xbd, 0xf6, 0x9b, 0x07, 0xb9, 0x45, 0x74, 0xbd, 0x75,
+ 0x71, 0x9a, 0xe8, 0xde, 0x12, 0xd7, 0x9a, 0x44, 0xca, 0xcd, 0xa1, 0x8f,
+ 0xf0, 0xf5, 0x67, 0x8d, 0xbc, 0x62, 0x28, 0x59, 0x14, 0xd1, 0xdb, 0x95,
+ 0x18, 0xad, 0x27, 0xa5, 0x70, 0x13, 0x8d, 0x1a, 0x32, 0x56, 0xab, 0xcc,
+ 0xd3, 0x16, 0x4c, 0x68, 0x56, 0xbb, 0xe1, 0x6c, 0x33, 0x72, 0xc4, 0xc8,
+ 0x15, 0x9e, 0x8b, 0xe2, 0x0a, 0xd7, 0xac, 0xc5, 0x16, 0xe6, 0x68, 0xdb,
+ 0xeb, 0x6c, 0x38, 0x16, 0xf3, 0xea, 0x4e, 0x68, 0xe7, 0xe3, 0x1f, 0x89,
+ 0xf8, 0x4d, 0xa2, 0x5f, 0x33, 0x4c, 0x87, 0x3c, 0x74, 0x2d, 0x60, 0xd9,
+ 0x88, 0xe8, 0x75, 0x25, 0x11, 0xfa, 0x0f, 0x8f, 0x4f, 0xc3, 0x0f, 0x48,
+ 0x35, 0x46, 0xed, 0x47, 0x3c, 0x85, 0x8f, 0x93, 0x71, 0xa7, 0xa4, 0x04,
+ 0x06, 0xc6, 0x68, 0x41, 0x77, 0xd7, 0x6e, 0x36, 0x93, 0xd2, 0x57, 0x8e,
+ 0xd2, 0x8e, 0x6c, 0x4a, 0x15, 0x33, 0xee, 0x8c, 0xdf, 0xd7, 0xb8, 0x04,
+ 0x57, 0xb0, 0x34, 0xd9, 0x35, 0x59, 0x91, 0x46, 0x86, 0x9f, 0xf4, 0x8e,
+ 0x82, 0x88, 0x94, 0x7e, 0xc8, 0x6b, 0x25, 0x78, 0xdf, 0x2a, 0x80, 0x24,
+ 0x5e, 0x0b, 0x1e, 0x84, 0x53, 0xca, 0xd5, 0x43, 0x5f, 0xfc, 0xb7, 0xbd,
+ 0x81, 0xc9, 0xbf, 0x8d, 0xf9, 0xb5, 0xfe, 0xcd, 0x3b, 0x3e, 0x8e, 0xcb,
+ 0x34, 0xcc, 0xd8, 0xc4, 0xe5, 0xaf, 0x68, 0x18, 0x53, 0xac, 0x48, 0xbf,
+ 0x04, 0xb3, 0x38, 0x64, 0xf0, 0x9a, 0x3d, 0x7c, 0x8f, 0xc0, 0xb4, 0x7b,
+ 0x75, 0x48, 0x49, 0x72, 0x04, 0x2e, 0x28, 0x14, 0x90, 0xbc, 0x12, 0xc6,
+ 0xee, 0x2a, 0xa1, 0x90, 0xaf, 0x7f, 0xb7, 0xa9, 0x46, 0x2d, 0x40, 0xfd,
+ 0x4b, 0xf6, 0x5c, 0xf8, 0x6d, 0xd9, 0xd0, 0x8a, 0x58, 0xf1, 0xae, 0x9b,
+ 0xbc, 0xfd, 0xec, 0x17, 0xa0, 0x74, 0x94, 0x28, 0x6a, 0xf4, 0xf0, 0x47,
+ 0xe4, 0xf2, 0xe7, 0x2b, 0xfc, 0xcc, 0x83, 0x9c, 0xe7, 0xcf, 0xcb, 0x47,
+ 0xa2, 0x96, 0xca, 0x4f, 0xff, 0x79, 0xf7, 0x96, 0xd1, 0xfa, 0x10, 0x3d,
+ 0x93, 0x03, 0xe2, 0xbb, 0x03, 0x62, 0xdc, 0xf1, 0x53, 0xe0, 0x69, 0xe5,
+ 0xac, 0x45, 0xbb, 0x86, 0x7a, 0x0f, 0xb6, 0x79, 0xc9, 0xcf, 0x32, 0x04,
+ 0x5d, 0xce, 0x2b, 0xde, 0x58, 0x78, 0x3e, 0x24, 0x73, 0x07, 0xeb, 0xab,
+ 0x80, 0xed, 0x06, 0xe1, 0x2f, 0x72, 0x2b, 0xf0, 0x8d, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0xed, 0x7f, 0x76, 0xcd, 0x2f, 0x8f, 0xec, 0x04, 0x16, 0x1e,
+ 0x91, 0x73, 0xc7, 0x81, 0x80, 0x77, 0xf7, 0x4d, 0x29, 0x6b, 0x2f, 0x8c,
+ 0x8e, 0xb8, 0x97, 0xe9, 0x9e, 0xe5, 0xcb, 0x08, 0xe4, 0x67, 0x42, 0x31,
+ 0x8b, 0xd9, 0x23, 0x51, 0xa6, 0xc7, 0xfa, 0x2c, 0x30, 0x76, 0xfb, 0x66,
+ 0xfe, 0x39, 0x2f, 0xde, 0x53, 0x3f, 0x31, 0xf3, 0x81, 0x4f, 0x29, 0xb8,
+ 0x62, 0xa3, 0xc6, 0xc9, 0x19, 0x43, 0x03, 0x34, 0x5c, 0x35, 0x95, 0xb2,
+ 0x5a, 0x06, 0x8d, 0xe1, 0x05, 0x17, 0xb9, 0xfd, 0x78, 0xe6, 0xde, 0x8b,
+ 0x6c, 0x06, 0x4b, 0x61, 0xb8, 0x2f, 0x65, 0x3c, 0x37, 0x8d, 0x7d, 0x7a,
+ 0x67, 0x8e, 0xf1, 0x50, 0x70, 0x6a, 0xff, 0x7f, 0x6e, 0x35, 0x32, 0x2f,
+ 0x45, 0x8d, 0xb8, 0xdd, 0xca, 0x58, 0x68, 0x45, 0xbf, 0x5b, 0xf8, 0xb4,
+ 0xbc, 0x3c, 0x52, 0xfb, 0xa3, 0x78, 0x45, 0xea, 0x60, 0xe2, 0x37, 0xcd,
+ 0xb5, 0xc3, 0xca, 0x95, 0xe1, 0x72, 0x3f, 0x0f, 0xd5, 0x12, 0x7d, 0x2f,
+ 0x54, 0xd8, 0xea, 0x6c, 0x38, 0x36, 0x88, 0x46, 0xf8, 0x89, 0x61, 0xa7,
+ 0x6c, 0x10, 0xa8, 0xec, 0xa2, 0x6b, 0x4f, 0x36, 0x07, 0x71, 0xbf, 0x97,
+ 0x02, 0x65, 0xa0, 0x61, 0x18, 0x4a, 0x98, 0x40, 0xcb, 0xf1, 0xb3, 0x93,
+ 0x43, 0xc7, 0xb2, 0x09, 0x86, 0xe5, 0x23, 0x36, 0x37, 0x88, 0x04, 0xa5,
+ 0x3a, 0xef, 0xde, 0x03, 0x83, 0xba, 0x70, 0x1a, 0x9d, 0x1a, 0x8d, 0xac,
+ 0x3c, 0xa5, 0x22, 0x43, 0x89, 0x4f, 0x03, 0x9b, 0x6c, 0x7d, 0xe0, 0x45,
+ 0xe4, 0x84, 0x64, 0x1b, 0x4a, 0xc6, 0xee, 0x85, 0x69, 0xb7, 0xfb, 0x96,
+ 0xde, 0xd0, 0x29, 0xc0, 0xaf, 0xe4, 0x02, 0x7d, 0x57, 0x37, 0xa9, 0xb0,
+ 0x7f, 0xd7, 0x3c, 0xc3, 0x7d, 0x35, 0xa9, 0x1c, 0x4e, 0x9a, 0xdc, 0xae,
+ 0x33, 0xc5, 0xfe, 0x79, 0xb4, 0x9c, 0x57, 0x68, 0xe5, 0x2d, 0xe4, 0x13,
+ 0x7d, 0x5f, 0x66, 0xfa, 0xc8, 0xd2, 0x4b, 0x52, 0x99, 0x9d, 0x1c, 0x5c,
+ 0xee, 0x41, 0xa3, 0x59, 0x1c, 0xe6, 0xbf, 0x80, 0x00, 0x00, 0x0c, 0xa1,
+ 0x1a, 0x9a, 0x69, 0x82, 0x2d, 0x3c, 0x15, 0x90, 0x25, 0x28, 0x1f, 0xf3,
+ 0x3b, 0x35, 0xdf, 0x20, 0x8b, 0x36, 0x80, 0xa4, 0xe7, 0x7b, 0x42, 0x92,
+ 0xe6, 0xa2, 0x73, 0xbf, 0xa4, 0xfd, 0x58, 0xe6, 0xe9, 0xac, 0xd6, 0xd1,
+ 0xfe, 0x7d, 0xba, 0x8e, 0xaf, 0x31, 0x70, 0x2b, 0x96, 0x85, 0x98, 0x9c,
+ 0xd5, 0x29, 0xda, 0xb7, 0x43, 0x90, 0xbc, 0x04, 0x34, 0xe2, 0xa4, 0x6c,
+ 0x0a, 0xbf, 0x73, 0x86, 0xf1, 0x95, 0xfa, 0x8d, 0x19, 0x8c, 0xb9, 0xfa,
+ 0x8a, 0x36, 0x60, 0xaf, 0x7c, 0xd8, 0x7b, 0x9d, 0x3d, 0xbb, 0xed, 0xd7,
+ 0xef, 0xb8, 0x89, 0x84, 0xea, 0xf7, 0xf2, 0xef, 0x2f, 0x6c, 0xdc, 0xbc,
+ 0xb1, 0x9d, 0x56, 0x34, 0x9c, 0xe3, 0xfb, 0x08, 0xf9, 0xa8, 0xe6, 0xb6,
+ 0x94, 0x99, 0x41, 0xf3, 0x61, 0xc4, 0xe1, 0x44, 0xee, 0x9b, 0x29, 0xf1,
+ 0x94, 0x7e, 0xf9, 0x27, 0xc6, 0x7b, 0x00, 0x46, 0x6b, 0xd4, 0xd8, 0x5e,
+ 0x2b, 0xfa, 0x3a, 0xd4, 0x06, 0x1e, 0x83, 0x71, 0x04, 0xcf, 0x8f, 0x29,
+ 0x47, 0x92, 0x82, 0xd9, 0x0e, 0x2d, 0x33, 0x7f, 0x80, 0x1b, 0x20, 0x7b,
+ 0xde, 0x68, 0xac, 0xd9, 0x3c, 0xcd, 0x4c, 0x1f, 0xbe, 0xb4, 0x5d, 0x27,
+ 0x90, 0xbd, 0xdf, 0x95, 0x10, 0x44, 0x65, 0x58, 0x93, 0xc0, 0x1f, 0xe8,
+ 0x48, 0x14, 0x99, 0xd8, 0x65, 0x43, 0x51, 0xfa, 0xcb, 0x01, 0x2e, 0x43,
+ 0xe3, 0x79, 0x4b, 0x1b, 0x78, 0xac, 0x8e, 0x29, 0x16, 0x05, 0x05, 0x3a,
+ 0xaf, 0xfd, 0xca, 0x2c, 0x50, 0x89, 0x29, 0x38, 0x21, 0x1c, 0x6a, 0xc3,
+ 0xb2, 0x65, 0xfc, 0xe6, 0xd2, 0xfb, 0xdc, 0xfd, 0xc7, 0x62, 0x12, 0x97,
+ 0xd5, 0xdd, 0x72, 0xe1, 0xf7, 0x8d, 0x1b, 0x49, 0x3e, 0x49, 0x91, 0x66,
+ 0xeb, 0x8c, 0x94, 0x5e, 0x13, 0x44, 0xac, 0x44, 0x18, 0xc0, 0x2f, 0xe6,
+ 0xd7, 0xf9, 0x78, 0xbf, 0xb8, 0x65, 0xb6, 0x71, 0x44, 0xf6, 0xdc, 0x9d,
+ 0xd0, 0x12, 0xd1, 0x44, 0x1b, 0x4c, 0xb4, 0xb3, 0x83, 0xce, 0xf5, 0xee,
+ 0x9a, 0xf8, 0x8a, 0xeb, 0xaa, 0xc5, 0xc4, 0xe0, 0x9a, 0xec, 0x82, 0x3c,
+ 0x2b, 0x35, 0xe4, 0xe2, 0x20, 0x37, 0xcb, 0xc6, 0x4e, 0xb0, 0xbd, 0xd3,
+ 0x77, 0xdb, 0x0a, 0xf7, 0xd2, 0xc6, 0x22, 0xb2, 0x2d, 0x6b, 0x17, 0xd5,
+ 0xb1, 0xbf, 0x73, 0xc9, 0xe0, 0xc8, 0x9f, 0x41, 0x37, 0xd4, 0x26, 0xdb,
+ 0x33, 0xc0, 0x80, 0x41, 0xaa, 0x1e, 0x04, 0xed, 0x47, 0x68, 0x30, 0x51,
+ 0xf4, 0x90, 0x31, 0x6d, 0x86, 0x66, 0x8c, 0xb2, 0x96, 0xbf, 0x1c, 0x32,
+ 0xd9, 0x6e, 0x2e, 0x02, 0x61, 0x61, 0x27, 0x4a, 0x54, 0x8d, 0x49, 0x18,
+ 0x56, 0xd1, 0x5a, 0xc1, 0x56, 0x96, 0x9c, 0x5e, 0x9c, 0x09, 0xa3, 0x02,
+ 0x74, 0x83, 0x6a, 0x5e, 0xd3, 0xe5, 0x47, 0xd7, 0x5b, 0xff, 0x6d, 0x38,
+ 0x10, 0xd4, 0x6b, 0x0f, 0x18, 0xae, 0xfa, 0x8f, 0x68, 0xf2, 0x6a, 0x3c,
+ 0x70, 0x00, 0x18, 0x81, 0xb9, 0x5a, 0x94, 0x46, 0x99, 0x3e, 0xc2, 0x4d,
+ 0xae, 0x83, 0x0c, 0x9f, 0x3f, 0x3d, 0xe5, 0xac, 0x65, 0x28, 0xdc, 0xb9,
+ 0x61, 0x24, 0x11, 0xd5, 0x52, 0xc8, 0x29, 0xc2, 0xf3, 0xf5, 0x6f, 0x8a,
+ 0x6c, 0xa6, 0x38, 0xa9, 0xb0, 0x87, 0x79, 0x19, 0xc2, 0x8f, 0x77, 0x9a,
+ 0x73, 0x00, 0xba, 0x82, 0x4d, 0x18, 0x86, 0xb7, 0xf8, 0xc0, 0x56, 0xbe,
+ 0xdd, 0xf7, 0xdf, 0xc7, 0xec, 0x9f, 0xfa, 0x9a, 0x56, 0xd5, 0xbc, 0x35,
+ 0x6b, 0x73, 0xbf, 0xfb, 0x0a, 0xa9, 0xaa, 0x1b, 0x92, 0xcc, 0xfa, 0x42,
+ 0x40, 0xbb, 0x0c, 0x5d, 0xd2, 0x86, 0xbe, 0x0f, 0x1b, 0x1a, 0x77, 0x92,
+ 0x65, 0x95, 0x80, 0xa7, 0x4a, 0x13, 0x56, 0xed, 0x00, 0x78, 0xb5, 0x68,
+ 0x22, 0xac, 0x1c, 0x40, 0x5c, 0xac, 0xe0, 0xc8, 0xe8, 0xe6, 0xaa, 0x9d,
+ 0x44, 0xb0, 0x29, 0xc4, 0xbe, 0x1d, 0xd0, 0xee, 0x95, 0x2c, 0x6b, 0x29,
+ 0x64, 0xfe, 0x44, 0xb1, 0xa7, 0xde, 0x33, 0x0f, 0xb5, 0x74, 0x26, 0x6f,
+ 0x49, 0x2b, 0x48, 0x13, 0xec, 0xe6, 0xa5, 0xce, 0xd7, 0x87, 0x7a, 0x67,
+ 0x0c, 0x29, 0x50, 0x7b, 0x7d, 0x26, 0xc9, 0xf8, 0x3f, 0xf3, 0xe0, 0x48,
+ 0x8c, 0xa1, 0xec, 0x75, 0xd7, 0xe0, 0x61, 0xea, 0x0d, 0x85, 0x79, 0x7f,
+ 0x30, 0x85, 0xe4, 0x18, 0xa0, 0x46, 0x99, 0x6f, 0xce, 0xd7, 0x53, 0x1a,
+ 0xc5, 0x7d, 0x82, 0x3e, 0x3f, 0xe9, 0x99, 0x42, 0x51, 0x99, 0x5d, 0xf9,
+ 0x8f, 0xc5, 0x68, 0x1a, 0x94, 0x82, 0x21, 0xab, 0x46, 0x9e, 0x35, 0xe6,
+ 0xdf, 0xd3, 0x69, 0x98, 0x5d, 0xb1, 0xfb, 0x10, 0x2d, 0x6a, 0x48, 0x87,
+ 0xe0, 0x20, 0xe5, 0xae, 0xec, 0xda, 0x3d, 0x8e, 0xdb, 0x1b, 0x2a, 0x8b,
+ 0x5d, 0x61, 0xa4, 0x95, 0x25, 0x5d, 0x54, 0xf3, 0xfc, 0x14, 0x66, 0x3b,
+ 0x00, 0xdc, 0x59, 0x55, 0x67, 0x40, 0x13, 0xbe, 0x57, 0x67, 0x5f, 0xb4,
+ 0xdf, 0x90, 0x23, 0x08, 0x3f, 0x4a, 0x98, 0x3c, 0xb9, 0x4b, 0x4d, 0xc2,
+ 0x12, 0x68, 0x29, 0xd7, 0x0c, 0x5b, 0x43, 0x0f, 0x5a, 0x62, 0x6d, 0xe0,
+ 0x35, 0x9b, 0xb1, 0x63, 0x1a, 0x50, 0x3f, 0xd9, 0x19, 0xd8, 0x7c, 0x64,
+ 0xa6, 0xf1, 0x6a, 0x65, 0xbc, 0xe1, 0x66, 0x1f, 0x41, 0xb7, 0x6a, 0x27,
+ 0x11, 0xa0, 0x5c, 0x12, 0x4f, 0x97, 0xd5, 0xac, 0xb6, 0x1d, 0xcc, 0x9c,
+ 0xe2, 0xff, 0x13, 0xee, 0x61, 0x99, 0xcf, 0x48, 0x54, 0x24, 0x1f, 0x32,
+ 0x69, 0x98, 0x59, 0xfd, 0xe5, 0x56, 0xb6, 0x89, 0x9f, 0xf3, 0x12, 0x5a,
+ 0x92, 0x83, 0x92, 0x57, 0x55, 0x1f, 0xa5, 0xf5, 0x07, 0x6a, 0x00, 0xad,
+ 0xac, 0x80, 0x5d, 0x76, 0x42, 0xd4, 0x44, 0xcf, 0x2b, 0x48, 0x67, 0xdd,
+ 0x47, 0xd1, 0xbc, 0x7d, 0xd1, 0x41, 0x0a, 0xc9, 0x71, 0x4d, 0x83, 0xa1,
+ 0x4b, 0xf3, 0x70, 0x23, 0xe6, 0xef, 0x83, 0x33, 0x8c, 0x0c, 0x47, 0xcb,
+ 0x18, 0x6c, 0xef, 0xf1, 0x48, 0xf1, 0xbd, 0x2d, 0x22, 0xac, 0x5f, 0xfa,
+ 0x0b, 0x60, 0x44, 0xa4, 0x50, 0x60, 0x72, 0x2b, 0x4d, 0x13, 0xc6, 0xb7,
+ 0xb8, 0x55, 0xd5, 0xc1, 0xe1, 0x46, 0x34, 0xc3, 0x25, 0x1e, 0x71, 0xf2,
+ 0xf8, 0x61, 0xa4, 0x59, 0x09, 0xba, 0x4f, 0x6f, 0xd3, 0xac, 0xae, 0x65,
+ 0x38, 0xa8, 0x99, 0xfb, 0xfe, 0x7e, 0xf0, 0x7c, 0xdd, 0xca, 0xae, 0x70,
+ 0x17, 0xc4, 0x55, 0xd9, 0x8e, 0x24, 0xb5, 0x08, 0x0f, 0x85, 0xba, 0xff,
+ 0x8c, 0x5a, 0x41, 0x96, 0x6c, 0xdb, 0xfd, 0x24, 0x01, 0x17, 0xfb, 0x04,
+ 0x2c, 0xb6, 0x58, 0x0f, 0x48, 0x6b, 0xa8, 0x9b, 0xb3, 0x61, 0x39, 0x6e,
+ 0x19, 0x54, 0x5b, 0xe2, 0x83, 0x44, 0x39, 0x45, 0xfc, 0xf8, 0xca, 0xd4,
+ 0x24, 0xa3, 0x5c, 0x6d, 0x96, 0x35, 0x9b, 0x19, 0x85, 0xa8, 0xc9, 0xc4,
+ 0x1b, 0xf2, 0x0d, 0x59, 0xb9, 0x19, 0xb4, 0xdf, 0xd4, 0xcd, 0x55, 0xbb,
+ 0x8a, 0xce, 0x1a, 0xfe, 0xeb, 0x0e, 0x2b, 0x35, 0x74, 0x74, 0xeb, 0xd7,
+ 0xb5, 0xef, 0x43, 0x79, 0xa8, 0x9f, 0x3c, 0x7d, 0xde, 0x23, 0x3c, 0x72,
+ 0xab, 0xed, 0x8d, 0xb9, 0xa5, 0x19, 0x9d, 0x5f, 0xef, 0xf8, 0x2d, 0xc0,
+ 0xfe, 0xab, 0xc7, 0x01, 0x31, 0x20, 0x17, 0x22, 0xa5, 0x56, 0x10, 0x38,
+ 0x15, 0x69, 0x25, 0xd3, 0xf8, 0x3e, 0x14, 0x9c, 0xa0, 0x51, 0x9d, 0x1d,
+ 0xd3, 0xb5, 0x87, 0x94, 0x47, 0x09, 0xd7, 0x5f, 0x78, 0x9b, 0xd0, 0x4b,
+ 0xe9, 0x52, 0x5e, 0x9b, 0x51, 0x22, 0x48, 0xe4, 0x00, 0x96, 0xc4, 0x85,
+ 0x11, 0xb3, 0x19, 0xd4, 0x9f, 0x88, 0x0a, 0x6d, 0x14, 0xec, 0x5a, 0xd5,
+ 0xac, 0x4d, 0xf7, 0x1e, 0x16, 0xe1, 0x9b, 0x80, 0x82, 0x44, 0x76, 0x7c,
+ 0x21, 0xac, 0xe4, 0x39, 0xd3, 0xa3, 0x08, 0x8c, 0x10, 0xaa, 0xed, 0x15,
+ 0xb4, 0x27, 0xa6, 0xd0, 0xfe, 0x00, 0x8c, 0x73, 0x08, 0x5a, 0x12, 0x63,
+ 0x9c, 0xf5, 0x1b, 0x53, 0xf9, 0xbd, 0x4a, 0x00, 0x87, 0x2d, 0xe5, 0xf5,
+ 0xa3, 0xea, 0x84, 0xc1, 0x6f, 0xee, 0xc8, 0x71, 0x25, 0x64, 0xf7, 0xdc,
+ 0x77, 0x29, 0xf5, 0x8a, 0xfc, 0x93, 0x03, 0x0a, 0x9b, 0xaf, 0x44, 0xf7,
+ 0x7b, 0x56, 0xa6, 0x75, 0xd3, 0x3b, 0x35, 0xb2, 0x48, 0x35, 0xdd, 0x45,
+ 0x18, 0xf6, 0x85, 0x3d, 0x8f, 0x0d, 0x3c, 0x20, 0x02, 0x2d, 0x66, 0x63,
+ 0xb2, 0x31, 0x5d, 0xb0, 0x2e, 0x99, 0xaf, 0x2c, 0xd9, 0xa5, 0xe4, 0xae,
+ 0xc0, 0x28, 0x3e, 0x75, 0x52, 0xca, 0x4f, 0x3f, 0x66, 0x30, 0x08, 0xf9,
+ 0x97, 0xdd, 0x28, 0x07, 0x8f, 0x3c, 0x6d, 0x2e, 0xc1, 0xb0, 0x6c, 0x98,
+ 0x2e, 0x16, 0x36, 0x13, 0x4f, 0x33, 0x69, 0x74, 0x40, 0x54, 0x58, 0x90,
+ 0x9a, 0xbd, 0x84, 0xc1, 0xc5, 0x89, 0xbf, 0x8e, 0x9c, 0x96, 0x84, 0xd8,
+ 0x18, 0xdf, 0x41, 0xac, 0xdb, 0x0a, 0xc3, 0x39, 0x47, 0xf1, 0xe5, 0x1b,
+ 0xe9, 0xe4, 0xa6, 0x42, 0x4d, 0x14, 0x8e, 0x24, 0x0d, 0x14, 0x1e, 0xad,
+ 0x2c, 0x6f, 0xce, 0x1a, 0xd6, 0x23, 0xad, 0x18, 0x38, 0xbe, 0x63, 0xe1,
+ 0x11, 0xd8, 0x54, 0x2a, 0xca, 0x00, 0xf9, 0x0d, 0xd2, 0xb3, 0xca, 0x97,
+ 0x17, 0xd6, 0x44, 0xf4, 0x97, 0xcf, 0x4a, 0xa1, 0xd6, 0x3a, 0x09, 0xf2,
+ 0xc4, 0x98, 0xf6, 0x36, 0x1c, 0xa9, 0x68, 0x83, 0x06, 0x9d, 0xdb, 0x17,
+ 0x19, 0xd2, 0xa1, 0x5e, 0xbe, 0x11, 0x7b, 0x3a, 0x16, 0x39, 0x55, 0xdd,
+ 0xdc, 0x13, 0x30, 0xc2, 0xad, 0x5b, 0xb1, 0xb4, 0x17, 0x2a, 0x3b, 0xf2,
+ 0x9d, 0x96, 0x56, 0xcd, 0x20, 0xd4, 0xd9, 0xf4, 0xa8, 0x71, 0x14, 0xc9,
+ 0x4f, 0x8f, 0xc0, 0x0e, 0x43, 0xd6, 0x8c, 0xc3, 0x38, 0x58, 0xe8, 0x4c,
+ 0xa8, 0x68, 0x6c, 0x81, 0x9f, 0xbb, 0x00, 0xb6, 0x6e, 0x73, 0x6e, 0x65,
+ 0xfe, 0x73, 0x66, 0x6c, 0xae, 0xf3, 0x0e, 0x26, 0xd4, 0xf0, 0x2a, 0x1b,
+ 0xd0, 0xd4, 0x80, 0xf2, 0x2b, 0x8d, 0x36, 0xbb, 0x38, 0xc4, 0x00, 0x23,
+ 0xa0, 0x01, 0xd6, 0x1b, 0x17, 0x2a, 0x7d, 0x72, 0xa5, 0x1e, 0x89, 0x2a,
+ 0x14, 0x7b, 0xd1, 0x17, 0x51, 0x6f, 0x03, 0x8e, 0xce, 0x06, 0x6b, 0xe7,
+ 0x94, 0xf3, 0x15, 0xe5, 0x07, 0x89, 0xb8, 0x89, 0x04, 0x4d, 0x72, 0x30,
+ 0x78, 0xfc, 0xc0, 0x51, 0xac, 0x02, 0x68, 0x3a, 0x91, 0xde, 0xb7, 0x32,
+ 0xeb, 0x4f, 0x74, 0x09, 0x10, 0x9d, 0x74, 0xa2, 0x4f, 0x17, 0x95, 0x2a,
+ 0x75, 0x79, 0xad, 0x84, 0x3b, 0x98, 0xaa, 0xb8, 0xb1, 0x09, 0x25, 0x1d,
+ 0x6f, 0xd8, 0x35, 0xbe, 0xf0, 0x07, 0x03, 0xb8, 0xb1, 0xf8, 0x93, 0x72,
+ 0x33, 0xb8, 0xd2, 0xad, 0xcd, 0xd0, 0x6e, 0x99, 0x13, 0x00, 0x3b, 0x49,
+ 0x33, 0x7f, 0xec, 0x13, 0x71, 0xf6, 0x96, 0x45, 0xdf, 0xa3, 0x8b, 0x87,
+ 0x61, 0x47, 0x62, 0x6c, 0x91, 0x19, 0xe6, 0xbb, 0x8b, 0xc5, 0x46, 0x45,
+ 0xff, 0x57, 0xcf, 0xb6, 0x09, 0xa2, 0x6a, 0x80, 0x27, 0x8c, 0x1a, 0xea,
+ 0xa7, 0xca, 0x16, 0x0c, 0x66, 0x97, 0x00, 0x47, 0x2d, 0x34, 0x42, 0xad,
+ 0xfa, 0x41, 0x69, 0x85, 0x4c, 0x91, 0x23, 0x67, 0xd0, 0x6b, 0x4e, 0x27,
+ 0x5d, 0x75, 0xc5, 0x40, 0x39, 0xe2, 0xdf, 0x93, 0xe2, 0x23, 0x3a, 0x57,
+ 0xab, 0x36, 0xb7, 0x05, 0x31, 0x1b, 0x9c, 0xfd, 0x4e, 0x90, 0x26, 0xce,
+ 0xb4, 0x52, 0xff, 0x61, 0xc6, 0x76, 0x87, 0x58, 0x57, 0xf9, 0x39, 0x00,
+ 0x1c, 0x53, 0xbb, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0xbb, 0x8f, 0xb3, 0x81, 0x0e, 0xb7, 0x8a, 0xf7, 0x81, 0x01, 0xf1, 0x82,
+ 0x01, 0xa7, 0xf0, 0x81, 0x03
+};
diff --git a/dom/media/WebVTTListener.cpp b/dom/media/WebVTTListener.cpp
new file mode 100644
index 000000000..18692ca27
--- /dev/null
+++ b/dom/media/WebVTTListener.cpp
@@ -0,0 +1,191 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WebVTTListener.h"
+#include "mozilla/dom/TextTrackCue.h"
+#include "mozilla/dom/TextTrackRegion.h"
+#include "mozilla/dom/VTTRegionBinding.h"
+#include "mozilla/dom/HTMLTrackElement.h"
+#include "nsIInputStream.h"
+#include "nsIWebVTTParserWrapper.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIAsyncVerifyRedirectCallback.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION(WebVTTListener, mElement, mParserWrapper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebVTTListener)
+ NS_INTERFACE_MAP_ENTRY(nsIWebVTTListener)
+ NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
+ NS_INTERFACE_MAP_ENTRY(nsIChannelEventSink)
+ NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebVTTListener)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(WebVTTListener)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(WebVTTListener)
+
+LazyLogModule gTextTrackLog("TextTrack");
+# define VTT_LOG(...) MOZ_LOG(gTextTrackLog, LogLevel::Debug, (__VA_ARGS__))
+
+WebVTTListener::WebVTTListener(HTMLTrackElement* aElement)
+ : mElement(aElement)
+{
+ MOZ_ASSERT(mElement, "Must pass an element to the callback");
+ VTT_LOG("WebVTTListener created.");
+}
+
+WebVTTListener::~WebVTTListener()
+{
+ VTT_LOG("WebVTTListener destroyed.");
+}
+
+NS_IMETHODIMP
+WebVTTListener::GetInterface(const nsIID &aIID,
+ void** aResult)
+{
+ return QueryInterface(aIID, aResult);
+}
+
+nsresult
+WebVTTListener::LoadResource()
+{
+ nsresult rv;
+ mParserWrapper = do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsPIDOMWindowInner* window = mElement->OwnerDoc()->GetInnerWindow();
+ rv = mParserWrapper->LoadParser(window);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = mParserWrapper->Watch(this);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ mElement->SetReadyState(TextTrackReadyState::Loading);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebVTTListener::AsyncOnChannelRedirect(nsIChannel* aOldChannel,
+ nsIChannel* aNewChannel,
+ uint32_t aFlags,
+ nsIAsyncVerifyRedirectCallback* cb)
+{
+ if (mElement) {
+ mElement->OnChannelRedirect(aOldChannel, aNewChannel, aFlags);
+ }
+ cb->OnRedirectVerifyCallback(NS_OK);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebVTTListener::OnStartRequest(nsIRequest* aRequest,
+ nsISupports* aContext)
+{
+ VTT_LOG("WebVTTListener::OnStartRequest\n");
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebVTTListener::OnStopRequest(nsIRequest* aRequest,
+ nsISupports* aContext,
+ nsresult aStatus)
+{
+ VTT_LOG("WebVTTListener::OnStopRequest\n");
+ if (NS_FAILED(aStatus)) {
+ mElement->SetReadyState(TextTrackReadyState::FailedToLoad);
+ }
+ // Attempt to parse any final data the parser might still have.
+ mParserWrapper->Flush();
+ if (mElement->ReadyState() != TextTrackReadyState::FailedToLoad) {
+ mElement->SetReadyState(TextTrackReadyState::Loaded);
+ }
+
+ mElement->DropChannel();
+
+ return aStatus;
+}
+
+nsresult
+WebVTTListener::ParseChunk(nsIInputStream* aInStream, void* aClosure,
+ const char* aFromSegment, uint32_t aToOffset,
+ uint32_t aCount, uint32_t* aWriteCount)
+{
+ nsCString buffer(aFromSegment, aCount);
+ WebVTTListener* listener = static_cast<WebVTTListener*>(aClosure);
+
+ if (NS_FAILED(listener->mParserWrapper->Parse(buffer))) {
+ VTT_LOG("Unable to parse chunk of WEBVTT text. Aborting.");
+ *aWriteCount = 0;
+ return NS_ERROR_FAILURE;
+ }
+
+ *aWriteCount = aCount;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebVTTListener::OnDataAvailable(nsIRequest* aRequest,
+ nsISupports* aContext,
+ nsIInputStream* aStream,
+ uint64_t aOffset,
+ uint32_t aCount)
+{
+ VTT_LOG("WebVTTListener::OnDataAvailable\n");
+ uint32_t count = aCount;
+ while (count > 0) {
+ uint32_t read;
+ nsresult rv = aStream->ReadSegments(ParseChunk, this, count, &read);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!read) {
+ return NS_ERROR_FAILURE;
+ }
+ count -= read;
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebVTTListener::OnCue(JS::Handle<JS::Value> aCue, JSContext* aCx)
+{
+ if (!aCue.isObject()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ JS::Rooted<JSObject*> obj(aCx, &aCue.toObject());
+ TextTrackCue* cue = nullptr;
+ nsresult rv = UNWRAP_OBJECT(VTTCue, &obj, cue);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ cue->SetTrackElement(mElement);
+ mElement->mTrack->AddCue(*cue);
+
+ return NS_OK;
+}
+
+
+NS_IMETHODIMP
+WebVTTListener::OnRegion(JS::Handle<JS::Value> aRegion, JSContext* aCx)
+{
+ // Nothing for this callback to do.
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+WebVTTListener::OnParsingError(int32_t errorCode, JSContext* cx)
+{
+ // We only care about files that have a bad WebVTT file signature right now
+ // as that means the file failed to load.
+ if (errorCode == ErrorCodes::BadSignature) {
+ mElement->SetReadyState(TextTrackReadyState::FailedToLoad);
+ }
+ return NS_OK;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/WebVTTListener.h b/dom/media/WebVTTListener.h
new file mode 100644
index 000000000..67271664a
--- /dev/null
+++ b/dom/media/WebVTTListener.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_WebVTTLoadListener_h
+#define mozilla_dom_WebVTTLoadListener_h
+
+#include "nsIWebVTTListener.h"
+#include "nsIStreamListener.h"
+#include "nsIChannelEventSink.h"
+#include "nsIInterfaceRequestor.h"
+#include "nsCycleCollectionParticipant.h"
+
+class nsIWebVTTParserWrapper;
+
+namespace mozilla {
+namespace dom {
+
+class HTMLTrackElement;
+
+class WebVTTListener final : public nsIWebVTTListener,
+ public nsIStreamListener,
+ public nsIChannelEventSink,
+ public nsIInterfaceRequestor
+{
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_NSIWEBVTTLISTENER
+ NS_DECL_NSIREQUESTOBSERVER
+ NS_DECL_NSISTREAMLISTENER
+ NS_DECL_NSICHANNELEVENTSINK
+ NS_DECL_NSIINTERFACEREQUESTOR
+
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(WebVTTListener,
+ nsIStreamListener)
+
+public:
+ explicit WebVTTListener(HTMLTrackElement* aElement);
+
+ /**
+ * Loads the WebVTTListener. Must call this in order for the listener to be
+ * ready to parse data that is passed to it.
+ */
+ nsresult LoadResource();
+
+private:
+ ~WebVTTListener();
+
+ // List of error codes returned from the WebVTT parser that we care about.
+ enum ErrorCodes {
+ BadSignature = 0
+ };
+ static nsresult ParseChunk(nsIInputStream* aInStream, void* aClosure,
+ const char* aFromSegment, uint32_t aToOffset,
+ uint32_t aCount, uint32_t* aWriteCount);
+
+ RefPtr<HTMLTrackElement> mElement;
+ nsCOMPtr<nsIWebVTTParserWrapper> mParserWrapper;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_WebVTTListener_h
diff --git a/dom/media/XiphExtradata.cpp b/dom/media/XiphExtradata.cpp
new file mode 100644
index 000000000..6a5765a9e
--- /dev/null
+++ b/dom/media/XiphExtradata.cpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "XiphExtradata.h"
+
+namespace mozilla {
+
+bool XiphHeadersToExtradata(MediaByteBuffer* aCodecSpecificConfig,
+ const nsTArray<const unsigned char*>& aHeaders,
+ const nsTArray<size_t>& aHeaderLens)
+{
+ size_t nheaders = aHeaders.Length();
+ if (!nheaders || nheaders > 255) return false;
+ aCodecSpecificConfig->AppendElement(nheaders - 1);
+ for (size_t i = 0; i < nheaders - 1; i++) {
+ size_t headerLen;
+ for (headerLen = aHeaderLens[i]; headerLen >= 255; headerLen -= 255) {
+ aCodecSpecificConfig->AppendElement(255);
+ }
+ aCodecSpecificConfig->AppendElement(headerLen);
+ }
+ for (size_t i = 0; i < nheaders; i++) {
+ aCodecSpecificConfig->AppendElements(aHeaders[i], aHeaderLens[i]);
+ }
+ return true;
+}
+
+bool XiphExtradataToHeaders(nsTArray<unsigned char*>& aHeaders,
+ nsTArray<size_t>& aHeaderLens,
+ unsigned char* aData,
+ size_t aAvailable)
+{
+ size_t total = 0;
+ if (aAvailable < 1) {
+ return false;
+ }
+ aAvailable--;
+ int nHeaders = *aData++ + 1;
+ for (int i = 0; i < nHeaders - 1; i++) {
+ size_t headerLen = 0;
+ for (;;) {
+ // After this test, we know that (aAvailable - total > headerLen) and
+ // (headerLen >= 0) so (aAvailable - total > 0). The loop decrements
+ // aAvailable by 1 and total remains fixed, so we know that in the next
+ // iteration (aAvailable - total >= 0). Thus (aAvailable - total) can
+ // never underflow.
+ if (aAvailable - total <= headerLen) {
+ return false;
+ }
+ // Since we know (aAvailable > total + headerLen), this can't overflow
+ // unless total is near 0 and both aAvailable and headerLen are within
+ // 255 bytes of the maximum representable size. However, that is
+ // impossible, since we would have had to have gone through this loop
+ // more than 255 times to make headerLen that large, and thus decremented
+ // aAvailable more than 255 times.
+ headerLen += *aData;
+ aAvailable--;
+ if (*aData++ != 255) break;
+ }
+ // And this check ensures updating total won't cause (aAvailable - total)
+ // to underflow.
+ if (aAvailable - total < headerLen) {
+ return false;
+ }
+ aHeaderLens.AppendElement(headerLen);
+ // Since we know aAvailable >= total + headerLen, this can't overflow.
+ total += headerLen;
+ }
+ aHeaderLens.AppendElement(aAvailable - total);
+ for (int i = 0; i < nHeaders; i++) {
+ aHeaders.AppendElement(aData);
+ aData += aHeaderLens[i];
+ }
+ return true;
+}
+
+} // namespace mozilla
diff --git a/dom/media/XiphExtradata.h b/dom/media/XiphExtradata.h
new file mode 100644
index 000000000..5a9cbba78
--- /dev/null
+++ b/dom/media/XiphExtradata.h
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(XiphExtradata_h)
+#define XiphExtradata_h
+
+#include "MediaData.h"
+
+namespace mozilla {
+
+/* This converts a list of headers to the canonical form of extradata for Xiph
+ codecs in non-Ogg containers. We use it to pass those headers from demuxer
+ to decoder even when demuxing from an Ogg cotainer. */
+bool XiphHeadersToExtradata(MediaByteBuffer* aCodecSpecificConfig,
+ const nsTArray<const unsigned char*>& aHeaders,
+ const nsTArray<size_t>& aHeaderLens);
+
+/* This converts a set of extradata back into a list of headers. */
+bool XiphExtradataToHeaders(nsTArray<unsigned char*>& aHeaders,
+ nsTArray<size_t>& aHeaderLens,
+ unsigned char* aData,
+ size_t aAvailable);
+
+} // namespace mozilla
+
+#endif // XiphExtradata_h
diff --git a/dom/media/android/AndroidMediaDecoder.cpp b/dom/media/android/AndroidMediaDecoder.cpp
new file mode 100644
index 000000000..41ef3fcb0
--- /dev/null
+++ b/dom/media/android/AndroidMediaDecoder.cpp
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaDecoderStateMachine.h"
+#include "AndroidMediaDecoder.h"
+#include "AndroidMediaReader.h"
+
+namespace mozilla {
+
+AndroidMediaDecoder::AndroidMediaDecoder(MediaDecoderOwner* aOwner,
+ const nsACString& aType)
+ : MediaDecoder(aOwner), mType(aType)
+{
+}
+
+MediaDecoderStateMachine* AndroidMediaDecoder::CreateStateMachine()
+{
+ return new MediaDecoderStateMachine(this, new AndroidMediaReader(this, mType));
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/android/AndroidMediaDecoder.h b/dom/media/android/AndroidMediaDecoder.h
new file mode 100644
index 000000000..88b5a243f
--- /dev/null
+++ b/dom/media/android/AndroidMediaDecoder.h
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AndroidMediaDecoder_h_)
+#define AndroidMediaDecoder_h_
+
+#include "MediaDecoder.h"
+#include "AndroidMediaDecoder.h"
+
+namespace mozilla {
+
+class AndroidMediaDecoder : public MediaDecoder
+{
+ nsCString mType;
+public:
+ AndroidMediaDecoder(MediaDecoderOwner* aOwner, const nsACString& aType);
+
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override {
+ return new AndroidMediaDecoder(aOwner, mType);
+ }
+ MediaDecoderStateMachine* CreateStateMachine() override;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/android/AndroidMediaPluginHost.cpp b/dom/media/android/AndroidMediaPluginHost.cpp
new file mode 100644
index 000000000..d3dce2b93
--- /dev/null
+++ b/dom/media/android/AndroidMediaPluginHost.cpp
@@ -0,0 +1,311 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "mozilla/Preferences.h"
+#include "MediaResource.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/Services.h"
+#include "AndroidMediaPluginHost.h"
+#include "nsAutoPtr.h"
+#include "nsXPCOMStrings.h"
+#include "nsISeekableStream.h"
+#include "nsIGfxInfo.h"
+#include "gfxCrashReporterUtils.h"
+#include "prmem.h"
+#include "prlink.h"
+#include "AndroidMediaResourceServer.h"
+#include "nsServiceManagerUtils.h"
+
+#include "MPAPI.h"
+
+#include "nsIPropertyBag2.h"
+
+#if defined(ANDROID) || defined(MOZ_WIDGET_GONK)
+#include "android/log.h"
+#define ALOG(args...) __android_log_print(ANDROID_LOG_INFO, "AndroidMediaPluginHost" , ## args)
+#else
+#define ALOG(args...) /* do nothing */
+#endif
+
+using namespace MPAPI;
+
+Decoder::Decoder() :
+ mResource(nullptr), mPrivate(nullptr)
+{
+}
+
+namespace mozilla {
+
+static char* GetResource(Decoder *aDecoder)
+{
+ return static_cast<char*>(aDecoder->mResource);
+}
+
+class GetIntPrefEvent : public Runnable {
+public:
+ GetIntPrefEvent(const char* aPref, int32_t* aResult)
+ : mPref(aPref), mResult(aResult) {}
+ NS_IMETHOD Run() override {
+ return Preferences::GetInt(mPref, mResult);
+ }
+private:
+ const char* mPref;
+ int32_t* mResult;
+};
+
+static bool GetIntPref(const char* aPref, int32_t* aResult)
+{
+ // GetIntPref() is called on the decoder thread, but the Preferences API
+ // can only be called on the main thread. Post a runnable and wait.
+ NS_ENSURE_TRUE(aPref, false);
+ NS_ENSURE_TRUE(aResult, false);
+ nsCOMPtr<nsIRunnable> event = new GetIntPrefEvent(aPref, aResult);
+ return NS_SUCCEEDED(NS_DispatchToMainThread(event, NS_DISPATCH_SYNC));
+}
+
+static bool
+GetSystemInfoString(const char *aKey, char *aResult, size_t aResultLength)
+{
+ NS_ENSURE_TRUE(aKey, false);
+ NS_ENSURE_TRUE(aResult, false);
+
+ nsCOMPtr<nsIPropertyBag2> infoService = do_GetService("@mozilla.org/system-info;1");
+ NS_ASSERTION(infoService, "Could not find a system info service");
+
+ nsAutoCString key(aKey);
+ nsAutoCString info;
+ nsresult rv = infoService->GetPropertyAsACString(NS_ConvertUTF8toUTF16(key),
+ info);
+
+ NS_ENSURE_SUCCESS(rv, false);
+
+ strncpy(aResult, info.get(), aResultLength);
+
+ return true;
+}
+
+static PluginHost sPluginHost = {
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ GetIntPref,
+ GetSystemInfoString
+};
+
+// Return true if Omx decoding is supported on the device. This checks the
+// built in whitelist/blacklist and preferences to see if that is overridden.
+static bool IsOmxSupported()
+{
+ bool forceEnabled =
+ Preferences::GetBool("stagefright.force-enabled", false);
+ bool disabled =
+ Preferences::GetBool("stagefright.disabled", false);
+
+ if (disabled) {
+ NS_WARNING("XXX stagefright disabled\n");
+ return false;
+ }
+
+ ScopedGfxFeatureReporter reporter("Stagefright", forceEnabled);
+
+ if (!forceEnabled) {
+ nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
+ if (gfxInfo) {
+ int32_t status;
+ nsCString discardFailure;
+ if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_STAGEFRIGHT, discardFailure, &status))) {
+ if (status != nsIGfxInfo::FEATURE_STATUS_OK) {
+ NS_WARNING("XXX stagefright blacklisted\n");
+ return false;
+ }
+ }
+ }
+ }
+
+ reporter.SetSuccessful();
+ return true;
+}
+
+// Return the name of the shared library that implements Omx based decoding. This varies
+// depending on libstagefright version installed on the device and whether it is B2G vs Android.
+// nullptr is returned if Omx decoding is not supported on the device,
+static const char* GetOmxLibraryName()
+{
+#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
+ nsCOMPtr<nsIPropertyBag2> infoService = do_GetService("@mozilla.org/system-info;1");
+ NS_ASSERTION(infoService, "Could not find a system info service");
+
+ int32_t version;
+ nsresult rv = infoService->GetPropertyAsInt32(NS_LITERAL_STRING("version"), &version);
+ if (NS_SUCCEEDED(rv)) {
+ ALOG("Android Version is: %d", version);
+ }
+
+ nsAutoString release_version;
+ rv = infoService->GetPropertyAsAString(NS_LITERAL_STRING("release_version"), release_version);
+ if (NS_SUCCEEDED(rv)) {
+ ALOG("Android Release Version is: %s", NS_LossyConvertUTF16toASCII(release_version).get());
+ }
+
+ nsAutoString device;
+ rv = infoService->GetPropertyAsAString(NS_LITERAL_STRING("device"), device);
+ if (NS_SUCCEEDED(rv)) {
+ ALOG("Android Device is: %s", NS_LossyConvertUTF16toASCII(device).get());
+ }
+
+ nsAutoString manufacturer;
+ rv = infoService->GetPropertyAsAString(NS_LITERAL_STRING("manufacturer"), manufacturer);
+ if (NS_SUCCEEDED(rv)) {
+ ALOG("Android Manufacturer is: %s", NS_LossyConvertUTF16toASCII(manufacturer).get());
+ }
+
+ nsAutoString hardware;
+ rv = infoService->GetPropertyAsAString(NS_LITERAL_STRING("hardware"), hardware);
+ if (NS_SUCCEEDED(rv)) {
+ ALOG("Android Hardware is: %s", NS_LossyConvertUTF16toASCII(hardware).get());
+ }
+#endif
+
+ if (!IsOmxSupported())
+ return nullptr;
+
+#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
+ if (version >= 17) {
+ return "libomxpluginkk.so";
+ }
+
+ // Ice Cream Sandwich and Jellybean
+ return "libomxplugin.so";
+
+#elif defined(ANDROID) && defined(MOZ_WIDGET_GONK)
+ return "libomxplugin.so";
+#else
+ return nullptr;
+#endif
+}
+
+AndroidMediaPluginHost::AndroidMediaPluginHost() {
+ MOZ_COUNT_CTOR(AndroidMediaPluginHost);
+ MOZ_ASSERT(NS_IsMainThread());
+
+ mResourceServer = AndroidMediaResourceServer::Start();
+
+ const char* name = GetOmxLibraryName();
+ ALOG("Loading OMX Plugin: %s", name ? name : "nullptr");
+ if (name) {
+ char *path = PR_GetLibraryFilePathname("libxul.so", (PRFuncPtr) GetOmxLibraryName);
+ PRLibrary *lib = nullptr;
+ if (path) {
+ nsAutoCString libpath(path);
+ PR_Free(path);
+ int32_t slash = libpath.RFindChar('/');
+ if (slash != kNotFound) {
+ libpath.Truncate(slash + 1);
+ libpath.Append(name);
+ lib = PR_LoadLibrary(libpath.get());
+ }
+ }
+ if (!lib)
+ lib = PR_LoadLibrary(name);
+
+ if (lib) {
+ Manifest *manifest = static_cast<Manifest *>(PR_FindSymbol(lib, "MPAPI_MANIFEST"));
+ if (manifest) {
+ mPlugins.AppendElement(manifest);
+ ALOG("OMX plugin successfully loaded");
+ }
+ }
+ }
+}
+
+AndroidMediaPluginHost::~AndroidMediaPluginHost() {
+ mResourceServer->Stop();
+ MOZ_COUNT_DTOR(AndroidMediaPluginHost);
+}
+
+bool AndroidMediaPluginHost::FindDecoder(const nsACString& aMimeType, const char* const** aCodecs)
+{
+ const char *chars;
+ size_t len = NS_CStringGetData(aMimeType, &chars, nullptr);
+ for (size_t n = 0; n < mPlugins.Length(); ++n) {
+ Manifest *plugin = mPlugins[n];
+ const char* const *codecs;
+ if (plugin->CanDecode(chars, len, &codecs)) {
+ if (aCodecs)
+ *aCodecs = codecs;
+ return true;
+ }
+ }
+ return false;
+}
+
+MPAPI::Decoder *AndroidMediaPluginHost::CreateDecoder(MediaResource *aResource, const nsACString& aMimeType)
+{
+ NS_ENSURE_TRUE(aResource, nullptr);
+
+ nsAutoPtr<Decoder> decoder(new Decoder());
+ if (!decoder) {
+ return nullptr;
+ }
+
+ const char *chars;
+ size_t len = NS_CStringGetData(aMimeType, &chars, nullptr);
+ for (size_t n = 0; n < mPlugins.Length(); ++n) {
+ Manifest *plugin = mPlugins[n];
+ const char* const *codecs;
+ if (!plugin->CanDecode(chars, len, &codecs)) {
+ continue;
+ }
+
+ nsCString url;
+ nsresult rv = mResourceServer->AddResource(aResource, url);
+ if (NS_FAILED (rv)) continue;
+
+ decoder->mResource = strdup(url.get());
+ if (plugin->CreateDecoder(&sPluginHost, decoder, chars, len)) {
+ return decoder.forget();
+ }
+ }
+
+ return nullptr;
+}
+
+void AndroidMediaPluginHost::DestroyDecoder(Decoder *aDecoder)
+{
+ aDecoder->DestroyDecoder(aDecoder);
+ char* resource = GetResource(aDecoder);
+ if (resource) {
+ // resource *shouldn't* be null, but check anyway just in case the plugin
+ // decoder does something stupid.
+ mResourceServer->RemoveResource(nsCString(resource));
+ free(resource);
+ }
+ delete aDecoder;
+}
+
+AndroidMediaPluginHost *sAndroidMediaPluginHost = nullptr;
+AndroidMediaPluginHost *EnsureAndroidMediaPluginHost()
+{
+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread());
+ if (!sAndroidMediaPluginHost) {
+ sAndroidMediaPluginHost = new AndroidMediaPluginHost();
+ }
+ return sAndroidMediaPluginHost;
+}
+
+AndroidMediaPluginHost *GetAndroidMediaPluginHost()
+{
+ MOZ_ASSERT(sAndroidMediaPluginHost);
+ return sAndroidMediaPluginHost;
+}
+
+void AndroidMediaPluginHost::Shutdown()
+{
+ delete sAndroidMediaPluginHost;
+ sAndroidMediaPluginHost = nullptr;
+}
+
+} // namespace mozilla
diff --git a/dom/media/android/AndroidMediaPluginHost.h b/dom/media/android/AndroidMediaPluginHost.h
new file mode 100644
index 000000000..854b7f21e
--- /dev/null
+++ b/dom/media/android/AndroidMediaPluginHost.h
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AndroidMediaPluginHost_h_)
+#define AndroidMediaPluginHost_h_
+
+#include "nsTArray.h"
+#include "MediaResource.h"
+#include "MPAPI.h"
+#include "AndroidMediaResourceServer.h"
+
+namespace mozilla {
+
+class AndroidMediaPluginHost {
+ RefPtr<AndroidMediaResourceServer> mResourceServer;
+ nsTArray<MPAPI::Manifest *> mPlugins;
+
+ MPAPI::Manifest *FindPlugin(const nsACString& aMimeType);
+public:
+ AndroidMediaPluginHost();
+ ~AndroidMediaPluginHost();
+
+ static void Shutdown();
+
+ bool FindDecoder(const nsACString& aMimeType, const char* const** aCodecs);
+ MPAPI::Decoder *CreateDecoder(mozilla::MediaResource *aResource, const nsACString& aMimeType);
+ void DestroyDecoder(MPAPI::Decoder *aDecoder);
+};
+
+// Must be called on the main thread. Creates the plugin host if it doesn't
+// already exist.
+AndroidMediaPluginHost *EnsureAndroidMediaPluginHost();
+
+// May be called on any thread after EnsureAndroidMediaPluginHost has been called.
+AndroidMediaPluginHost *GetAndroidMediaPluginHost();
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/android/AndroidMediaReader.cpp b/dom/media/android/AndroidMediaReader.cpp
new file mode 100644
index 000000000..12afacbc9
--- /dev/null
+++ b/dom/media/android/AndroidMediaReader.cpp
@@ -0,0 +1,449 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "AndroidMediaReader.h"
+#include "mozilla/TimeStamp.h"
+#include "mozilla/gfx/Point.h"
+#include "MediaResource.h"
+#include "VideoUtils.h"
+#include "AndroidMediaDecoder.h"
+#include "AndroidMediaPluginHost.h"
+#include "MediaDecoderStateMachine.h"
+#include "ImageContainer.h"
+#include "AbstractMediaDecoder.h"
+#include "gfx2DGlue.h"
+#include "VideoFrameContainer.h"
+#include "mozilla/CheckedInt.h"
+
+namespace mozilla {
+
+using namespace mozilla::gfx;
+using namespace mozilla::media;
+
+typedef mozilla::layers::Image Image;
+typedef mozilla::layers::PlanarYCbCrImage PlanarYCbCrImage;
+
+AndroidMediaReader::AndroidMediaReader(AbstractMediaDecoder *aDecoder,
+ const nsACString& aContentType) :
+ MediaDecoderReader(aDecoder),
+ mType(aContentType),
+ mPlugin(nullptr),
+ mHasAudio(false),
+ mHasVideo(false),
+ mVideoSeekTimeUs(-1),
+ mAudioSeekTimeUs(-1)
+{
+}
+
+nsresult AndroidMediaReader::ReadMetadata(MediaInfo* aInfo,
+ MetadataTags** aTags)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (!mPlugin) {
+ mPlugin = GetAndroidMediaPluginHost()->CreateDecoder(mDecoder->GetResource(), mType);
+ if (!mPlugin) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+
+ // Set the total duration (the max of the audio and video track).
+ int64_t durationUs;
+ mPlugin->GetDuration(mPlugin, &durationUs);
+ if (durationUs) {
+ mInfo.mMetadataDuration.emplace(TimeUnit::FromMicroseconds(durationUs));
+ }
+
+ if (mPlugin->HasVideo(mPlugin)) {
+ int32_t width, height;
+ mPlugin->GetVideoParameters(mPlugin, &width, &height);
+ nsIntRect pictureRect(0, 0, width, height);
+
+ // Validate the container-reported frame and pictureRect sizes. This ensures
+ // that our video frame creation code doesn't overflow.
+ nsIntSize displaySize(width, height);
+ nsIntSize frameSize(width, height);
+ if (!IsValidVideoRegion(frameSize, pictureRect, displaySize)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Video track's frame sizes will not overflow. Activate the video track.
+ mHasVideo = true;
+ mInfo.mVideo.mDisplay = displaySize;
+ mPicture = pictureRect;
+ mInitialFrame = frameSize;
+ VideoFrameContainer* container = mDecoder->GetVideoFrameContainer();
+ if (container) {
+ container->ClearCurrentFrame(IntSize(displaySize.width, displaySize.height));
+ }
+ }
+
+ if (mPlugin->HasAudio(mPlugin)) {
+ int32_t numChannels, sampleRate;
+ mPlugin->GetAudioParameters(mPlugin, &numChannels, &sampleRate);
+ mHasAudio = true;
+ mInfo.mAudio.mChannels = numChannels;
+ mInfo.mAudio.mRate = sampleRate;
+ }
+
+ *aInfo = mInfo;
+ *aTags = nullptr;
+ return NS_OK;
+}
+
+RefPtr<ShutdownPromise>
+AndroidMediaReader::Shutdown()
+{
+ ResetDecode();
+ if (mPlugin) {
+ GetAndroidMediaPluginHost()->DestroyDecoder(mPlugin);
+ mPlugin = nullptr;
+ }
+
+ return MediaDecoderReader::Shutdown();
+}
+
+// Resets all state related to decoding, emptying all buffers etc.
+nsresult AndroidMediaReader::ResetDecode(TrackSet aTracks)
+{
+ if (mLastVideoFrame) {
+ mLastVideoFrame = nullptr;
+ }
+ mSeekRequest.DisconnectIfExists();
+ mSeekPromise.RejectIfExists(NS_OK, __func__);
+ return MediaDecoderReader::ResetDecode(aTracks);
+}
+
+bool AndroidMediaReader::DecodeVideoFrame(bool &aKeyframeSkip,
+ int64_t aTimeThreshold)
+{
+ // Record number of frames decoded and parsed. Automatically update the
+ // stats counters using the AutoNotifyDecoded stack-based class.
+ AbstractMediaDecoder::AutoNotifyDecoded a(mDecoder);
+
+ // Throw away the currently buffered frame if we are seeking.
+ if (mLastVideoFrame && mVideoSeekTimeUs != -1) {
+ mLastVideoFrame = nullptr;
+ }
+
+ ImageBufferCallback bufferCallback(mDecoder->GetImageContainer());
+ RefPtr<Image> currentImage;
+
+ // Read next frame
+ while (true) {
+ MPAPI::VideoFrame frame;
+ if (!mPlugin->ReadVideo(mPlugin, &frame, mVideoSeekTimeUs, &bufferCallback)) {
+ // We reached the end of the video stream. If we have a buffered
+ // video frame, push it the video queue using the total duration
+ // of the video as the end time.
+ if (mLastVideoFrame) {
+ int64_t durationUs;
+ mPlugin->GetDuration(mPlugin, &durationUs);
+ durationUs = std::max<int64_t>(durationUs - mLastVideoFrame->mTime, 0);
+ RefPtr<VideoData> data = VideoData::ShallowCopyUpdateDuration(mLastVideoFrame,
+ durationUs);
+ mVideoQueue.Push(data);
+ mLastVideoFrame = nullptr;
+ }
+ return false;
+ }
+ mVideoSeekTimeUs = -1;
+
+ if (aKeyframeSkip) {
+ // Disable keyframe skipping for now as
+ // stagefright doesn't seem to be telling us
+ // when a frame is a keyframe.
+#if 0
+ if (!frame.mKeyFrame) {
+ ++a.mStats.mParsedFrames;
+ ++a.mStats.mDroppedFrames;
+ continue;
+ }
+#endif
+ aKeyframeSkip = false;
+ }
+
+ if (frame.mSize == 0)
+ return true;
+
+ currentImage = bufferCallback.GetImage();
+ int64_t pos = mDecoder->GetResource()->Tell();
+ IntRect picture = mPicture;
+
+ RefPtr<VideoData> v;
+ if (currentImage) {
+ gfx::IntSize frameSize = currentImage->GetSize();
+ if (frameSize.width != mInitialFrame.width ||
+ frameSize.height != mInitialFrame.height) {
+ // Frame size is different from what the container reports. This is legal,
+ // and we will preserve the ratio of the crop rectangle as it
+ // was reported relative to the picture size reported by the container.
+ picture.x = (mPicture.x * frameSize.width) / mInitialFrame.width;
+ picture.y = (mPicture.y * frameSize.height) / mInitialFrame.height;
+ picture.width = (frameSize.width * mPicture.width) / mInitialFrame.width;
+ picture.height = (frameSize.height * mPicture.height) / mInitialFrame.height;
+ }
+
+ v = VideoData::CreateFromImage(mInfo.mVideo,
+ pos,
+ frame.mTimeUs,
+ 1, // We don't know the duration yet.
+ currentImage,
+ frame.mKeyFrame,
+ -1,
+ picture);
+ } else {
+ // Assume YUV
+ VideoData::YCbCrBuffer b;
+ b.mPlanes[0].mData = static_cast<uint8_t *>(frame.Y.mData);
+ b.mPlanes[0].mStride = frame.Y.mStride;
+ b.mPlanes[0].mHeight = frame.Y.mHeight;
+ b.mPlanes[0].mWidth = frame.Y.mWidth;
+ b.mPlanes[0].mOffset = frame.Y.mOffset;
+ b.mPlanes[0].mSkip = frame.Y.mSkip;
+
+ b.mPlanes[1].mData = static_cast<uint8_t *>(frame.Cb.mData);
+ b.mPlanes[1].mStride = frame.Cb.mStride;
+ b.mPlanes[1].mHeight = frame.Cb.mHeight;
+ b.mPlanes[1].mWidth = frame.Cb.mWidth;
+ b.mPlanes[1].mOffset = frame.Cb.mOffset;
+ b.mPlanes[1].mSkip = frame.Cb.mSkip;
+
+ b.mPlanes[2].mData = static_cast<uint8_t *>(frame.Cr.mData);
+ b.mPlanes[2].mStride = frame.Cr.mStride;
+ b.mPlanes[2].mHeight = frame.Cr.mHeight;
+ b.mPlanes[2].mWidth = frame.Cr.mWidth;
+ b.mPlanes[2].mOffset = frame.Cr.mOffset;
+ b.mPlanes[2].mSkip = frame.Cr.mSkip;
+
+ if (frame.Y.mWidth != mInitialFrame.width ||
+ frame.Y.mHeight != mInitialFrame.height) {
+
+ // Frame size is different from what the container reports. This is legal,
+ // and we will preserve the ratio of the crop rectangle as it
+ // was reported relative to the picture size reported by the container.
+ picture.x = (mPicture.x * frame.Y.mWidth) / mInitialFrame.width;
+ picture.y = (mPicture.y * frame.Y.mHeight) / mInitialFrame.height;
+ picture.width = (frame.Y.mWidth * mPicture.width) / mInitialFrame.width;
+ picture.height = (frame.Y.mHeight * mPicture.height) / mInitialFrame.height;
+ }
+
+ // This is the approximate byte position in the stream.
+ v = VideoData::CreateAndCopyData(mInfo.mVideo,
+ mDecoder->GetImageContainer(),
+ pos,
+ frame.mTimeUs,
+ 1, // We don't know the duration yet.
+ b,
+ frame.mKeyFrame,
+ -1,
+ picture);
+ }
+
+ if (!v) {
+ return false;
+ }
+ a.mStats.mParsedFrames++;
+ a.mStats.mDecodedFrames++;
+ NS_ASSERTION(a.mStats.mDecodedFrames <= a.mStats.mParsedFrames, "Expect to decode fewer frames than parsed in AndroidMedia...");
+
+ // Since MPAPI doesn't give us the end time of frames, we keep one frame
+ // buffered in AndroidMediaReader and push it into the queue as soon
+ // we read the following frame so we can use that frame's start time as
+ // the end time of the buffered frame.
+ if (!mLastVideoFrame) {
+ mLastVideoFrame = v;
+ continue;
+ }
+
+ // Calculate the duration as the timestamp of the current frame minus the
+ // timestamp of the previous frame. We can then return the previously
+ // decoded frame, and it will have a valid timestamp.
+ int64_t duration = v->mTime - mLastVideoFrame->mTime;
+ mLastVideoFrame = VideoData::ShallowCopyUpdateDuration(mLastVideoFrame, duration);
+
+ // We have the start time of the next frame, so we can push the previous
+ // frame into the queue, except if the end time is below the threshold,
+ // in which case it wouldn't be displayed anyway.
+ if (mLastVideoFrame->GetEndTime() < aTimeThreshold) {
+ mLastVideoFrame = nullptr;
+ continue;
+ }
+
+ // Buffer the current frame we just decoded.
+ mVideoQueue.Push(mLastVideoFrame);
+ mLastVideoFrame = v;
+
+ break;
+ }
+
+ return true;
+}
+
+bool AndroidMediaReader::DecodeAudioData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ // This is the approximate byte position in the stream.
+ int64_t pos = mDecoder->GetResource()->Tell();
+
+ // Read next frame
+ MPAPI::AudioFrame source;
+ if (!mPlugin->ReadAudio(mPlugin, &source, mAudioSeekTimeUs)) {
+ return false;
+ }
+ mAudioSeekTimeUs = -1;
+
+ // Ignore empty buffers which stagefright media read will sporadically return
+ if (source.mSize == 0)
+ return true;
+
+ uint32_t frames = source.mSize / (source.mAudioChannels *
+ sizeof(AudioDataValue));
+
+ typedef AudioCompactor::NativeCopy MPCopy;
+ return mAudioCompactor.Push(pos,
+ source.mTimeUs,
+ source.mAudioSampleRate,
+ frames,
+ source.mAudioChannels,
+ MPCopy(static_cast<uint8_t *>(source.mData),
+ source.mSize,
+ source.mAudioChannels));
+}
+
+RefPtr<MediaDecoderReader::SeekPromise>
+AndroidMediaReader::Seek(SeekTarget aTarget, int64_t aEndTime)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ RefPtr<SeekPromise> p = mSeekPromise.Ensure(__func__);
+ if (mHasAudio && mHasVideo) {
+ // The decoder seeks/demuxes audio and video streams separately. So if
+ // we seek both audio and video to aTarget, the audio stream can typically
+ // seek closer to the seek target, since typically every audio block is
+ // a sync point, whereas for video there are only keyframes once every few
+ // seconds. So if we have both audio and video, we must seek the video
+ // stream to the preceeding keyframe first, get the stream time, and then
+ // seek the audio stream to match the video stream's time. Otherwise, the
+ // audio and video streams won't be in sync after the seek.
+ mVideoSeekTimeUs = aTarget.GetTime().ToMicroseconds();
+
+ RefPtr<AndroidMediaReader> self = this;
+ mSeekRequest.Begin(DecodeToFirstVideoData()->Then(OwnerThread(), __func__, [self] (MediaData* v) {
+ self->mSeekRequest.Complete();
+ self->mAudioSeekTimeUs = v->mTime;
+ self->mSeekPromise.Resolve(media::TimeUnit::FromMicroseconds(self->mAudioSeekTimeUs), __func__);
+ }, [self, aTarget] () {
+ self->mSeekRequest.Complete();
+ self->mAudioSeekTimeUs = aTarget.GetTime().ToMicroseconds();
+ self->mSeekPromise.Resolve(aTarget.GetTime(), __func__);
+ }));
+ } else {
+ mAudioSeekTimeUs = mVideoSeekTimeUs = aTarget.GetTime().ToMicroseconds();
+ mSeekPromise.Resolve(aTarget.GetTime(), __func__);
+ }
+
+ return p;
+}
+
+AndroidMediaReader::ImageBufferCallback::ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer) :
+ mImageContainer(aImageContainer)
+{
+}
+
+void *
+AndroidMediaReader::ImageBufferCallback::operator()(size_t aWidth, size_t aHeight,
+ MPAPI::ColorFormat aColorFormat)
+{
+ if (!mImageContainer) {
+ NS_WARNING("No image container to construct an image");
+ return nullptr;
+ }
+
+ RefPtr<Image> image;
+ switch(aColorFormat) {
+ case MPAPI::RGB565:
+ image = mozilla::layers::CreateSharedRGBImage(mImageContainer,
+ nsIntSize(aWidth, aHeight),
+ SurfaceFormat::R5G6B5_UINT16);
+ if (!image) {
+ NS_WARNING("Could not create rgb image");
+ return nullptr;
+ }
+
+ mImage = image;
+ return image->GetBuffer();
+ case MPAPI::I420:
+ return CreateI420Image(aWidth, aHeight);
+ default:
+ NS_NOTREACHED("Color format not supported");
+ return nullptr;
+ }
+}
+
+uint8_t *
+AndroidMediaReader::ImageBufferCallback::CreateI420Image(size_t aWidth,
+ size_t aHeight)
+{
+ RefPtr<PlanarYCbCrImage> yuvImage = mImageContainer->CreatePlanarYCbCrImage();
+ mImage = yuvImage;
+
+ if (!yuvImage) {
+ NS_WARNING("Could not create I420 image");
+ return nullptr;
+ }
+
+ // Use uint32_t throughout to match AllocateAndGetNewBuffer's param
+ const auto checkedFrameSize =
+ CheckedInt<uint32_t>(aWidth) * aHeight;
+
+ // Allocate enough for one full resolution Y plane
+ // and two quarter resolution Cb/Cr planes.
+ const auto checkedBufferSize =
+ checkedFrameSize + checkedFrameSize / 2;
+
+ if (!checkedBufferSize.isValid()) { // checks checkedFrameSize too
+ NS_WARNING("Could not create I420 image");
+ return nullptr;
+ }
+
+ const auto frameSize = checkedFrameSize.value();
+
+ uint8_t *buffer =
+ yuvImage->AllocateAndGetNewBuffer(checkedBufferSize.value());
+
+ mozilla::layers::PlanarYCbCrData frameDesc;
+
+ frameDesc.mYChannel = buffer;
+ frameDesc.mCbChannel = buffer + frameSize;
+ frameDesc.mCrChannel = frameDesc.mCbChannel + frameSize / 4;
+
+ frameDesc.mYSize = IntSize(aWidth, aHeight);
+ frameDesc.mCbCrSize = IntSize(aWidth / 2, aHeight / 2);
+
+ frameDesc.mYStride = aWidth;
+ frameDesc.mCbCrStride = aWidth / 2;
+
+ frameDesc.mYSkip = 0;
+ frameDesc.mCbSkip = 0;
+ frameDesc.mCrSkip = 0;
+
+ frameDesc.mPicX = 0;
+ frameDesc.mPicY = 0;
+ frameDesc.mPicSize = IntSize(aWidth, aHeight);
+
+ yuvImage->AdoptData(frameDesc);
+
+ return buffer;
+}
+
+already_AddRefed<Image>
+AndroidMediaReader::ImageBufferCallback::GetImage()
+{
+ return mImage.forget();
+}
+
+} // namespace mozilla
diff --git a/dom/media/android/AndroidMediaReader.h b/dom/media/android/AndroidMediaReader.h
new file mode 100644
index 000000000..def85a343
--- /dev/null
+++ b/dom/media/android/AndroidMediaReader.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AndroidMediaReader_h_)
+#define AndroidMediaReader_h_
+
+#include "mozilla/Attributes.h"
+#include "MediaResource.h"
+#include "MediaDecoderReader.h"
+#include "ImageContainer.h"
+#include "mozilla/layers/SharedRGBImage.h"
+
+#include "MPAPI.h"
+
+class nsACString;
+
+namespace mozilla {
+
+class AbstractMediaDecoder;
+
+namespace layers {
+class ImageContainer;
+}
+
+class AndroidMediaReader : public MediaDecoderReader
+{
+ nsCString mType;
+ MPAPI::Decoder *mPlugin;
+ bool mHasAudio;
+ bool mHasVideo;
+ nsIntRect mPicture;
+ nsIntSize mInitialFrame;
+ int64_t mVideoSeekTimeUs;
+ int64_t mAudioSeekTimeUs;
+ RefPtr<VideoData> mLastVideoFrame;
+ MozPromiseHolder<MediaDecoderReader::SeekPromise> mSeekPromise;
+ MozPromiseRequestHolder<MediaDecoderReader::MediaDataPromise> mSeekRequest;
+public:
+ AndroidMediaReader(AbstractMediaDecoder* aDecoder,
+ const nsACString& aContentType);
+
+ nsresult ResetDecode(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
+ TrackInfo::kVideoTrack)) override;
+
+ bool DecodeAudioData() override;
+ bool DecodeVideoFrame(bool &aKeyframeSkip, int64_t aTimeThreshold) override;
+
+ nsresult ReadMetadata(MediaInfo* aInfo, MetadataTags** aTags) override;
+ RefPtr<SeekPromise> Seek(SeekTarget aTarget, int64_t aEndTime) override;
+
+ RefPtr<ShutdownPromise> Shutdown() override;
+
+ class ImageBufferCallback : public MPAPI::BufferCallback {
+ typedef mozilla::layers::Image Image;
+
+ public:
+ ImageBufferCallback(mozilla::layers::ImageContainer *aImageContainer);
+ void *operator()(size_t aWidth, size_t aHeight,
+ MPAPI::ColorFormat aColorFormat) override;
+ already_AddRefed<Image> GetImage();
+
+ private:
+ uint8_t *CreateI420Image(size_t aWidth, size_t aHeight);
+
+ mozilla::layers::ImageContainer *mImageContainer;
+ RefPtr<Image> mImage;
+ };
+
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/android/AndroidMediaResourceServer.cpp b/dom/media/android/AndroidMediaResourceServer.cpp
new file mode 100644
index 000000000..bd76a8c68
--- /dev/null
+++ b/dom/media/android/AndroidMediaResourceServer.cpp
@@ -0,0 +1,503 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "mozilla/Assertions.h"
+#include "mozilla/Base64.h"
+#include "mozilla/IntegerPrintfMacros.h"
+#include "mozilla/UniquePtr.h"
+#include "nsThreadUtils.h"
+#include "nsIServiceManager.h"
+#include "nsISocketTransport.h"
+#include "nsIOutputStream.h"
+#include "nsIInputStream.h"
+#include "nsIRandomGenerator.h"
+#include "nsReadLine.h"
+#include "nsNetCID.h"
+#include "VideoUtils.h"
+#include "MediaResource.h"
+#include "AndroidMediaResourceServer.h"
+
+#if defined(_MSC_VER)
+#define strtoll _strtoi64
+#endif
+
+using namespace mozilla;
+
+/*
+ ReadCRLF is a variant of NS_ReadLine from nsReadLine.h that deals
+ with the carriage return/line feed requirements of HTTP requests.
+*/
+template<typename CharT, class StreamType, class StringType>
+nsresult
+ReadCRLF (StreamType* aStream, nsLineBuffer<CharT> * aBuffer,
+ StringType & aLine, bool *aMore)
+{
+ // eollast is true if the last character in the buffer is a '\r',
+ // signaling a potential '\r\n' sequence split between reads.
+ bool eollast = false;
+
+ aLine.Truncate();
+
+ while (1) { // will be returning out of this loop on eol or eof
+ if (aBuffer->start == aBuffer->end) { // buffer is empty. Read into it.
+ uint32_t bytesRead;
+ nsresult rv = aStream->Read(aBuffer->buf, kLineBufferSize, &bytesRead);
+ if (NS_FAILED(rv) || bytesRead == 0) {
+ *aMore = false;
+ return rv;
+ }
+ aBuffer->start = aBuffer->buf;
+ aBuffer->end = aBuffer->buf + bytesRead;
+ *(aBuffer->end) = '\0';
+ }
+
+ /*
+ * Walk the buffer looking for an end-of-line.
+ * There are 4 cases to consider:
+ * 1. the CR char is the last char in the buffer
+ * 2. the CRLF sequence are the last characters in the buffer
+ * 3. the CRLF sequence + one or more chars at the end of the buffer
+ * we need at least one char after the first CRLF sequence to
+ * set |aMore| correctly.
+ * 4. The LF character is the first char in the buffer when eollast is
+ * true.
+ */
+ CharT* current = aBuffer->start;
+ if (eollast) { // Case 4
+ if (*current == '\n') {
+ aBuffer->start = ++current;
+ *aMore = true;
+ return NS_OK;
+ }
+ else {
+ eollast = false;
+ aLine.Append('\r');
+ }
+ }
+ // Cases 2 and 3
+ for ( ; current < aBuffer->end-1; ++current) {
+ if (*current == '\r' && *(current+1) == '\n') {
+ *current++ = '\0';
+ *current++ = '\0';
+ aLine.Append(aBuffer->start);
+ aBuffer->start = current;
+ *aMore = true;
+ return NS_OK;
+ }
+ }
+ // Case 1
+ if (*current == '\r') {
+ eollast = true;
+ *current++ = '\0';
+ }
+
+ aLine.Append(aBuffer->start);
+ aBuffer->start = aBuffer->end; // mark the buffer empty
+ }
+}
+
+// Each client HTTP request results in a thread being spawned to process it.
+// That thread has a single event dispatched to it which handles the HTTP
+// protocol. It parses the headers and forwards data from the MediaResource
+// associated with the URL back to client. When the request is complete it will
+// shutdown the thread.
+class ServeResourceEvent : public Runnable {
+private:
+ // Reading from this reads the data sent from the client.
+ nsCOMPtr<nsIInputStream> mInput;
+
+ // Writing to this sends data to the client.
+ nsCOMPtr<nsIOutputStream> mOutput;
+
+ // The AndroidMediaResourceServer that owns the MediaResource instances
+ // served. This is used to lookup the MediaResource from the URL.
+ RefPtr<AndroidMediaResourceServer> mServer;
+
+ // Write 'aBufferLength' bytes from 'aBuffer' to 'mOutput'. This
+ // method ensures all the data is written by checking the number
+ // of bytes returned from the output streams 'Write' method and
+ // looping until done.
+ nsresult WriteAll(char const* aBuffer, int32_t aBufferLength);
+
+public:
+ ServeResourceEvent(nsIInputStream* aInput, nsIOutputStream* aOutput,
+ AndroidMediaResourceServer* aServer)
+ : mInput(aInput), mOutput(aOutput), mServer(aServer) {}
+
+ // This method runs on the thread and exits when it has completed the
+ // HTTP request.
+ NS_IMETHOD Run();
+
+ // Given the first line of an HTTP request, parse the URL requested and
+ // return the MediaResource for that URL.
+ already_AddRefed<MediaResource> GetMediaResource(nsCString const& aHTTPRequest);
+
+ // Gracefully shutdown the thread and cleanup resources
+ void Shutdown();
+};
+
+nsresult
+ServeResourceEvent::WriteAll(char const* aBuffer, int32_t aBufferLength)
+{
+ while (aBufferLength > 0) {
+ uint32_t written = 0;
+ nsresult rv = mOutput->Write(aBuffer, aBufferLength, &written);
+ if (NS_FAILED (rv)) return rv;
+
+ aBufferLength -= written;
+ aBuffer += written;
+ }
+
+ return NS_OK;
+}
+
+already_AddRefed<MediaResource>
+ServeResourceEvent::GetMediaResource(nsCString const& aHTTPRequest)
+{
+ // Check that the HTTP method is GET
+ const char* HTTP_METHOD = "GET ";
+ if (strncmp(aHTTPRequest.get(), HTTP_METHOD, strlen(HTTP_METHOD)) != 0) {
+ return nullptr;
+ }
+
+ const char* url_start = strchr(aHTTPRequest.get(), ' ');
+ if (!url_start) {
+ return nullptr;
+ }
+
+ const char* url_end = strrchr(++url_start, ' ');
+ if (!url_end) {
+ return nullptr;
+ }
+
+ // The path extracted from the HTTP request is used as a key in hash
+ // table. It is not related to retrieving data from the filesystem so
+ // we don't need to do any sanity checking on ".." paths and similar
+ // exploits.
+ nsCString relative(url_start, url_end - url_start);
+ RefPtr<MediaResource> resource =
+ mServer->GetResource(mServer->GetURLPrefix() + relative);
+ return resource.forget();
+}
+
+NS_IMETHODIMP
+ServeResourceEvent::Run() {
+ bool more = false; // Are there HTTP headers to read after the first line
+ nsCString line; // Contains the current line read from input stream
+ nsLineBuffer<char>* buffer = new nsLineBuffer<char>();
+ nsresult rv = ReadCRLF(mInput.get(), buffer, line, &more);
+ if (NS_FAILED(rv)) { Shutdown(); return rv; }
+
+ // First line contains the HTTP GET request. Extract the URL and obtain
+ // the MediaResource for it.
+ RefPtr<MediaResource> resource = GetMediaResource(line);
+ if (!resource) {
+ const char* response_404 = "HTTP/1.1 404 Not Found\r\n"
+ "Content-Length: 0\r\n\r\n";
+ rv = WriteAll(response_404, strlen(response_404));
+ Shutdown();
+ return rv;
+ }
+
+ // Offset in bytes to start reading from resource.
+ // This is zero by default but can be set to another starting value if
+ // this HTTP request includes a byte range request header.
+ int64_t start = 0;
+
+ // Keep reading lines until we get a zero length line, which is the HTTP
+ // protocol's way of signifying the end of headers and start of body, or
+ // until we have no more data to read.
+ while (more && line.Length() > 0) {
+ rv = ReadCRLF(mInput.get(), buffer, line, &more);
+ if (NS_FAILED(rv)) { Shutdown(); return rv; }
+
+ // Look for a byte range request header. If there is one, set the
+ // media resource offset to start from to that requested. Here we
+ // only check for the range request format used by Android rather
+ // than implementing all possibilities in the HTTP specification.
+ // That is, the range request is of the form:
+ // Range: bytes=nnnn-
+ // Were 'nnnn' is an integer number.
+ // The end of the range is not checked, instead we return up to
+ // the end of the resource and the client is informed of this via
+ // the content-range header.
+ NS_NAMED_LITERAL_CSTRING(byteRange, "Range: bytes=");
+ const char* s = strstr(line.get(), byteRange.get());
+ if (s) {
+ start = strtoll(s+byteRange.Length(), nullptr, 10);
+
+ // Clamp 'start' to be between 0 and the resource length.
+ start = std::max(int64_t(0), std::min(resource->GetLength(), start));
+ }
+ }
+
+ // HTTP response to use if this is a non byte range request
+ const char* response_normal = "HTTP/1.1 200 OK\r\n";
+
+ // HTTP response to use if this is a byte range request
+ const char* response_range = "HTTP/1.1 206 Partial Content\r\n";
+
+ // End of HTTP reponse headers is indicated by an empty line.
+ const char* response_end = "\r\n";
+
+ // If the request was a byte range request, we need to read from the
+ // requested offset. If the resource is non-seekable, or the seek
+ // fails, then the start offset is set back to zero. This results in all
+ // HTTP response data being as if the byte range request was not made.
+ if (start > 0 && !resource->IsTransportSeekable()) {
+ start = 0;
+ }
+
+ const char* response_line = start > 0 ?
+ response_range :
+ response_normal;
+ rv = WriteAll(response_line, strlen(response_line));
+ if (NS_FAILED(rv)) { Shutdown(); return NS_OK; }
+
+ // Buffer used for reading from the input stream and writing to
+ // the output stream. The buffer size should be big enough for the
+ // HTTP response headers sent below. A static_assert ensures
+ // this where the buffer is used.
+ const int buffer_size = 32768;
+ auto b = MakeUnique<char[]>(buffer_size);
+
+ // If we know the length of the resource, send a Content-Length header.
+ int64_t contentlength = resource->GetLength() - start;
+ if (contentlength > 0) {
+ static_assert (buffer_size > 1024,
+ "buffer_size must be large enough "
+ "to hold response headers");
+ snprintf(b.get(), buffer_size, "Content-Length: %" PRId64 "\r\n", contentlength);
+ rv = WriteAll(b.get(), strlen(b.get()));
+ if (NS_FAILED(rv)) { Shutdown(); return NS_OK; }
+ }
+
+ // If the request was a byte range request, respond with a Content-Range
+ // header which details the extent of the data returned.
+ if (start > 0) {
+ static_assert (buffer_size > 1024,
+ "buffer_size must be large enough "
+ "to hold response headers");
+ snprintf(b.get(), buffer_size, "Content-Range: "
+ "bytes %" PRId64 "-%" PRId64 "/%" PRId64 "\r\n",
+ start, resource->GetLength() - 1, resource->GetLength());
+ rv = WriteAll(b.get(), strlen(b.get()));
+ if (NS_FAILED(rv)) { Shutdown(); return NS_OK; }
+ }
+
+ rv = WriteAll(response_end, strlen(response_end));
+ if (NS_FAILED(rv)) { Shutdown(); return NS_OK; }
+
+ rv = mOutput->Flush();
+ if (NS_FAILED(rv)) { Shutdown(); return NS_OK; }
+
+ // Read data from media resource
+ uint32_t bytesRead = 0; // Number of bytes read/written to streams
+ rv = resource->ReadAt(start, b.get(), buffer_size, &bytesRead);
+ while (NS_SUCCEEDED(rv) && bytesRead != 0) {
+ // Keep track of what we think the starting position for the next read
+ // is. This is used in subsequent ReadAt calls to ensure we are reading
+ // from the correct offset in the case where another thread is reading
+ // from th same MediaResource.
+ start += bytesRead;
+
+ // Write data obtained from media resource to output stream
+ rv = WriteAll(b.get(), bytesRead);
+ if (NS_FAILED (rv)) break;
+
+ rv = resource->ReadAt(start, b.get(), 32768, &bytesRead);
+ }
+
+ Shutdown();
+ return NS_OK;
+}
+
+void
+ServeResourceEvent::Shutdown()
+{
+ // Cleanup resources and exit.
+ mInput->Close();
+ mOutput->Close();
+
+ // To shutdown the current thread we need to first exit this event.
+ // The Shutdown event below is posted to the main thread to do this.
+ nsCOMPtr<nsIRunnable> event = new ShutdownThreadEvent(NS_GetCurrentThread());
+ NS_DispatchToMainThread(event);
+}
+
+/*
+ This is the listener attached to the server socket. When an HTTP
+ request is made by the client the OnSocketAccepted method is
+ called. This method will spawn a thread to process the request.
+ The thread receives a single event which does the parsing of
+ the HTTP request and forwarding the data from the MediaResource
+ to the output stream of the request.
+
+ The MediaResource used for providing the request data is obtained
+ from the AndroidMediaResourceServer that created this listener, using the
+ URL the client requested.
+*/
+class ResourceSocketListener : public nsIServerSocketListener
+{
+public:
+ // The AndroidMediaResourceServer used to look up the MediaResource
+ // on requests.
+ RefPtr<AndroidMediaResourceServer> mServer;
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSISERVERSOCKETLISTENER
+
+ ResourceSocketListener(AndroidMediaResourceServer* aServer) :
+ mServer(aServer)
+ {
+ }
+
+private:
+ virtual ~ResourceSocketListener() { }
+};
+
+NS_IMPL_ISUPPORTS(ResourceSocketListener, nsIServerSocketListener)
+
+NS_IMETHODIMP
+ResourceSocketListener::OnSocketAccepted(nsIServerSocket* aServ,
+ nsISocketTransport* aTrans)
+{
+ nsCOMPtr<nsIInputStream> input;
+ nsCOMPtr<nsIOutputStream> output;
+ nsresult rv;
+
+ rv = aTrans->OpenInputStream(nsITransport::OPEN_BLOCKING, 0, 0, getter_AddRefs(input));
+ if (NS_FAILED(rv)) return rv;
+
+ rv = aTrans->OpenOutputStream(nsITransport::OPEN_BLOCKING, 0, 0, getter_AddRefs(output));
+ if (NS_FAILED(rv)) return rv;
+
+ nsCOMPtr<nsIThread> thread;
+ rv = NS_NewThread(getter_AddRefs(thread));
+ if (NS_FAILED(rv)) return rv;
+
+ nsCOMPtr<nsIRunnable> event = new ServeResourceEvent(input.get(), output.get(), mServer);
+ return thread->Dispatch(event, NS_DISPATCH_NORMAL);
+}
+
+NS_IMETHODIMP
+ResourceSocketListener::OnStopListening(nsIServerSocket* aServ, nsresult aStatus)
+{
+ return NS_OK;
+}
+
+AndroidMediaResourceServer::AndroidMediaResourceServer() :
+ mMutex("AndroidMediaResourceServer")
+{
+}
+
+NS_IMETHODIMP
+AndroidMediaResourceServer::Run()
+{
+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread());
+ MutexAutoLock lock(mMutex);
+
+ nsresult rv;
+ mSocket = do_CreateInstance(NS_SERVERSOCKET_CONTRACTID, &rv);
+ if (NS_FAILED(rv)) return rv;
+
+ rv = mSocket->InitSpecialConnection(-1,
+ nsIServerSocket::LoopbackOnly
+ | nsIServerSocket::KeepWhenOffline,
+ -1);
+ if (NS_FAILED(rv)) return rv;
+
+ rv = mSocket->AsyncListen(new ResourceSocketListener(this));
+ if (NS_FAILED(rv)) return rv;
+
+ return NS_OK;
+}
+
+/* static */
+already_AddRefed<AndroidMediaResourceServer>
+AndroidMediaResourceServer::Start()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<AndroidMediaResourceServer> server = new AndroidMediaResourceServer();
+ server->Run();
+ return server.forget();
+}
+
+void
+AndroidMediaResourceServer::Stop()
+{
+ MutexAutoLock lock(mMutex);
+ mSocket->Close();
+ mSocket = nullptr;
+}
+
+nsresult
+AndroidMediaResourceServer::AppendRandomPath(nsCString& aUrl)
+{
+ // Use a cryptographic quality PRNG to generate raw random bytes
+ // and convert that to a base64 string for use as an URL path. This
+ // is based on code from nsExternalAppHandler::SetUpTempFile.
+ nsresult rv;
+ nsAutoCString salt;
+ rv = GenerateRandomPathName(salt, 16);
+ if (NS_FAILED(rv)) return rv;
+ aUrl += "/";
+ aUrl += salt;
+ return NS_OK;
+}
+
+nsresult
+AndroidMediaResourceServer::AddResource(mozilla::MediaResource* aResource, nsCString& aUrl)
+{
+ nsCString url = GetURLPrefix();
+ nsresult rv = AppendRandomPath(url);
+ if (NS_FAILED (rv)) return rv;
+
+ {
+ MutexAutoLock lock(mMutex);
+
+ // Adding a resource URL that already exists is considered an error.
+ if (mResources.find(url) != mResources.end()) return NS_ERROR_FAILURE;
+ mResources[url] = aResource;
+ }
+
+ aUrl = url;
+
+ return NS_OK;
+}
+
+void
+AndroidMediaResourceServer::RemoveResource(nsCString const& aUrl)
+{
+ MutexAutoLock lock(mMutex);
+ mResources.erase(aUrl);
+}
+
+nsCString
+AndroidMediaResourceServer::GetURLPrefix()
+{
+ MutexAutoLock lock(mMutex);
+
+ int32_t port = 0;
+ nsresult rv = mSocket->GetPort(&port);
+ if (NS_FAILED (rv) || port < 0) {
+ return nsCString("");
+ }
+
+ char buffer[256];
+ snprintf(buffer, sizeof(buffer), "http://127.0.0.1:%d", port >= 0 ? port : 0);
+ return nsCString(buffer);
+}
+
+already_AddRefed<MediaResource>
+AndroidMediaResourceServer::GetResource(nsCString const& aUrl)
+{
+ MutexAutoLock lock(mMutex);
+ ResourceMap::const_iterator it = mResources.find(aUrl);
+ if (it == mResources.end()) return nullptr;
+
+ RefPtr<MediaResource> resource = it->second;
+ return resource.forget();
+}
diff --git a/dom/media/android/AndroidMediaResourceServer.h b/dom/media/android/AndroidMediaResourceServer.h
new file mode 100644
index 000000000..68200f9c0
--- /dev/null
+++ b/dom/media/android/AndroidMediaResourceServer.h
@@ -0,0 +1,96 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AndroidMediaResourceServer_h_)
+#define AndroidMediaResourceServer_h_
+
+#include <map>
+#include "nsIServerSocket.h"
+#include "MediaResource.h"
+
+namespace mozilla {
+
+class MediaResource;
+
+/*
+ AndroidMediaResourceServer instantiates a socket server that understands
+ HTTP requests for MediaResource instances. The server runs on an
+ automatically selected port and MediaResource instances are registered.
+ The registration returns a string URL than can be used to fetch the
+ resource. That URL contains a randomly generated path to make it
+ difficult for other local applications on the device to guess it.
+
+ The HTTP protocol is limited in that it supports only what the
+ Android DataSource implementation uses to fetch media. It
+ understands HTTP GET and byte range requests.
+
+ The intent of this class is to be used in Media backends that
+ have a system component that does its own network requests. These
+ requests are made against this server which then uses standard
+ Gecko network requests and media cache usage.
+
+ The AndroidMediaResourceServer can be instantiated on any thread and
+ its methods are threadsafe - they can be called on any thread.
+ The server socket itself is always run on the main thread and
+ this is done by the Start() static method by synchronously
+ dispatching to the main thread.
+*/
+class AndroidMediaResourceServer : public Runnable
+{
+private:
+ // Mutex protecting private members of AndroidMediaResourceServer.
+ // All member variables below this point in the class definition
+ // must acquire the mutex before access.
+ mozilla::Mutex mMutex;
+
+ // Server socket used to listen for incoming connections
+ nsCOMPtr<nsIServerSocket> mSocket;
+
+ // Mapping between MediaResource URL's to the MediaResource
+ // object served at that URL.
+ typedef std::map<nsCString,
+ RefPtr<mozilla::MediaResource> > ResourceMap;
+ ResourceMap mResources;
+
+ // Create a AndroidMediaResourceServer that will listen on an automatically
+ // selected port when started. This is private as it should only be
+ // called internally from the public 'Start' method.
+ AndroidMediaResourceServer();
+ NS_IMETHOD Run();
+
+ // Append a random URL path to a string. This is used for creating a
+ // unique URl for a resource which helps prevent malicious software
+ // running on the same machine as the server from guessing the URL
+ // and accessing video data.
+ nsresult AppendRandomPath(nsCString& aURL);
+
+public:
+ // Create a AndroidMediaResourceServer and start it listening. This call will
+ // perform a synchronous request on the main thread.
+ static already_AddRefed<AndroidMediaResourceServer> Start();
+
+ // Stops the server from listening and accepting further connections.
+ void Stop();
+
+ // Add a MediaResource to be served by this server. Stores the
+ // absolute URL that can be used to access the resource in 'aUrl'.
+ nsresult AddResource(mozilla::MediaResource* aResource, nsCString& aUrl);
+
+ // Remove a MediaResource so it is no longer served by this server.
+ // The URL provided must match exactly that provided by a previous
+ // call to "AddResource".
+ void RemoveResource(nsCString const& aUrl);
+
+ // Returns the prefix for HTTP requests to the server. This plus
+ // the result of AddResource results in an Absolute URL.
+ nsCString GetURLPrefix();
+
+ // Returns the resource asociated with a given URL
+ already_AddRefed<mozilla::MediaResource> GetResource(nsCString const& aUrl);
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/android/MPAPI.h b/dom/media/android/MPAPI.h
new file mode 100644
index 000000000..9b289ca09
--- /dev/null
+++ b/dom/media/android/MPAPI.h
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(MPAPI_h_)
+#define MPAPI_h_
+
+#include <stdint.h>
+
+namespace MPAPI {
+
+enum ColorFormat {
+ I420,
+ RGB565
+};
+
+/*
+ * A callback for the plugin to use to request a buffer owned by gecko. This can
+ * save us a copy or two down the line.
+ */
+class BufferCallback {
+public:
+ virtual void *operator()(size_t aWidth, size_t aHeight,
+ ColorFormat aColorFormat) = 0;
+};
+
+struct VideoPlane {
+ VideoPlane() :
+ mData(0),
+ mStride(0),
+ mWidth(0),
+ mHeight(0),
+ mOffset(0),
+ mSkip(0)
+ {}
+
+ void *mData;
+ int32_t mStride;
+ int32_t mWidth;
+ int32_t mHeight;
+ int32_t mOffset;
+ int32_t mSkip;
+};
+
+struct VideoFrame {
+ int64_t mTimeUs;
+ bool mKeyFrame;
+ void *mData;
+ size_t mSize;
+ int32_t mStride;
+ int32_t mSliceHeight;
+ int32_t mRotation;
+ VideoPlane Y;
+ VideoPlane Cb;
+ VideoPlane Cr;
+
+ VideoFrame() :
+ mTimeUs(0),
+ mKeyFrame(false),
+ mData(0),
+ mSize(0),
+ mStride(0),
+ mSliceHeight(0),
+ mRotation(0)
+ {}
+
+ void Set(int64_t aTimeUs, bool aKeyFrame,
+ void *aData, size_t aSize, int32_t aStride, int32_t aSliceHeight, int32_t aRotation,
+ void *aYData, int32_t aYStride, int32_t aYWidth, int32_t aYHeight, int32_t aYOffset, int32_t aYSkip,
+ void *aCbData, int32_t aCbStride, int32_t aCbWidth, int32_t aCbHeight, int32_t aCbOffset, int32_t aCbSkip,
+ void *aCrData, int32_t aCrStride, int32_t aCrWidth, int32_t aCrHeight, int32_t aCrOffset, int32_t aCrSkip)
+ {
+ mTimeUs = aTimeUs;
+ mKeyFrame = aKeyFrame;
+ mData = aData;
+ mSize = aSize;
+ mStride = aStride;
+ mSliceHeight = aSliceHeight;
+ mRotation = aRotation;
+ Y.mData = aYData;
+ Y.mStride = aYStride;
+ Y.mWidth = aYWidth;
+ Y.mHeight = aYHeight;
+ Y.mOffset = aYOffset;
+ Y.mSkip = aYSkip;
+ Cb.mData = aCbData;
+ Cb.mStride = aCbStride;
+ Cb.mWidth = aCbWidth;
+ Cb.mHeight = aCbHeight;
+ Cb.mOffset = aCbOffset;
+ Cb.mSkip = aCbSkip;
+ Cr.mData = aCrData;
+ Cr.mStride = aCrStride;
+ Cr.mWidth = aCrWidth;
+ Cr.mHeight = aCrHeight;
+ Cr.mOffset = aCrOffset;
+ Cr.mSkip = aCrSkip;
+ }
+};
+
+struct AudioFrame {
+ int64_t mTimeUs;
+ void *mData; // 16PCM interleaved
+ size_t mSize; // Size of mData in bytes
+ int32_t mAudioChannels;
+ int32_t mAudioSampleRate;
+
+ AudioFrame() :
+ mTimeUs(0),
+ mData(0),
+ mSize(0),
+ mAudioChannels(0),
+ mAudioSampleRate(0)
+ {
+ }
+
+ void Set(int64_t aTimeUs,
+ void *aData, size_t aSize,
+ int32_t aAudioChannels, int32_t aAudioSampleRate)
+ {
+ mTimeUs = aTimeUs;
+ mData = aData;
+ mSize = aSize;
+ mAudioChannels = aAudioChannels;
+ mAudioSampleRate = aAudioSampleRate;
+ }
+};
+
+struct Decoder;
+
+struct PluginHost {
+ bool (*Read)(Decoder *aDecoder, char *aBuffer, int64_t aOffset, uint32_t aCount, uint32_t* aBytes);
+ uint64_t (*GetLength)(Decoder *aDecoder);
+ void (*SetMetaDataReadMode)(Decoder *aDecoder);
+ void (*SetPlaybackReadMode)(Decoder *aDecoder);
+ bool (*GetIntPref)(const char *aPref, int32_t *aResult);
+ bool (*GetSystemInfoString)(const char *aKey, char *aResult, size_t aResultLen);
+};
+
+struct Decoder {
+ void *mResource;
+ void *mPrivate;
+
+ Decoder();
+
+ void (*GetDuration)(Decoder *aDecoder, int64_t *durationUs);
+ void (*GetVideoParameters)(Decoder *aDecoder, int32_t *aWidth, int32_t *aHeight);
+ void (*GetAudioParameters)(Decoder *aDecoder, int32_t *aNumChannels, int32_t *aSampleRate);
+ bool (*HasVideo)(Decoder *aDecoder);
+ bool (*HasAudio)(Decoder *aDecoder);
+ bool (*ReadVideo)(Decoder *aDecoder, VideoFrame *aFrame, int64_t aSeekTimeUs, BufferCallback *aBufferCallback);
+ bool (*ReadAudio)(Decoder *aDecoder, AudioFrame *aFrame, int64_t aSeekTimeUs);
+ void (*DestroyDecoder)(Decoder *);
+};
+
+struct Manifest {
+ bool (*CanDecode)(const char *aMimeChars, size_t aMimeLen, const char* const**aCodecs);
+ bool (*CreateDecoder)(PluginHost *aPluginHost, Decoder *aDecoder,
+ const char *aMimeChars, size_t aMimeLen);
+};
+
+}
+
+#endif
diff --git a/dom/media/android/moz.build b/dom/media/android/moz.build
new file mode 100644
index 000000000..3ad43cd50
--- /dev/null
+++ b/dom/media/android/moz.build
@@ -0,0 +1,27 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'AndroidMediaDecoder.h',
+ 'AndroidMediaPluginHost.h',
+ 'AndroidMediaReader.h',
+ 'AndroidMediaResourceServer.h',
+ 'MPAPI.h',
+]
+
+UNIFIED_SOURCES += [
+ 'AndroidMediaDecoder.cpp',
+ 'AndroidMediaPluginHost.cpp',
+ 'AndroidMediaReader.cpp',
+ 'AndroidMediaResourceServer.cpp',
+]
+
+LOCAL_INCLUDES += [
+ '/dom/base',
+ '/dom/html',
+]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/benchmark/sample b/dom/media/benchmark/sample
new file mode 100755
index 000000000..4f4f7a56f
--- /dev/null
+++ b/dom/media/benchmark/sample
@@ -0,0 +1,7 @@
+#!/bin/bash -e
+wget http://people.mozilla.org/~ajones/frame-drop-test/bbb-31.webm -O bbb-31.webm
+ffmpeg -i bbb-31.webm -frames:v 8 -codec copy -map 0:0 sWebMSample.webm -y
+mv sWebMSample.webm sWebMSample
+xxd -i sWebMSample |head --lines=-1 | sed 's/unsigned char/static const uint8_t/' > ../WebMSample.h
+rm sWebMSample
+rm bbb-31.webm
diff --git a/dom/media/bridge/IPeerConnection.idl b/dom/media/bridge/IPeerConnection.idl
new file mode 100644
index 000000000..7251f84ad
--- /dev/null
+++ b/dom/media/bridge/IPeerConnection.idl
@@ -0,0 +1,71 @@
+#include "nsIThread.idl"
+#include "nsIDOMWindow.idl"
+#include "nsIPropertyBag2.idl"
+
+interface nsIDOMDataChannel;
+
+/*
+ * Manager interface to PeerConnection.js so it is accessible from C++.
+ */
+[scriptable, uuid(c2218bd2-2648-4701-8fa6-305d3379e9f8)]
+interface IPeerConnectionManager : nsISupports
+{
+ boolean hasActivePeerConnection(in unsigned long innerWindowID);
+};
+
+%{C++
+#define IPEERCONNECTION_MANAGER_CONTRACTID "@mozilla.org/dom/peerconnectionmanager;1"
+%}
+
+/* Do not confuse with nsIDOMRTCPeerConnection. This interface is purely for
+ * communication between the PeerConnection JS DOM binding and the C++
+ * implementation in SIPCC.
+ *
+ * See media/webrtc/signaling/include/PeerConnectionImpl.h
+ */
+[scriptable, uuid(d7dfe148-0416-446b-a128-66a7c71ae8d3)]
+interface IPeerConnectionObserver : nsISupports
+{
+};
+
+[scriptable, uuid(14afc8e7-e421-4d0c-99a5-69308d871481)]
+interface IPeerConnection : nsISupports
+{
+ const unsigned long kHintAudio = 0x00000001;
+ const unsigned long kHintVideo = 0x00000002;
+
+ const long kActionNone = -1;
+ const long kActionOffer = 0;
+ const long kActionAnswer = 1;
+ const long kActionPRAnswer = 2;
+ const long kActionRollback = 3;
+
+ const long kIceGathering = 0;
+ const long kIceWaiting = 1;
+ const long kIceChecking = 2;
+ const long kIceConnected = 3;
+ const long kIceFailed = 4;
+
+ /* for readyState on Peer Connection */
+ const long kNew = 0;
+ const long kNegotiating = 1;
+ const long kActive = 2;
+ const long kClosing = 3;
+ const long kClosed = 4;
+
+ /* for 'type' in DataChannelInit dictionary */
+ const unsigned short kDataChannelReliable = 0;
+ const unsigned short kDataChannelPartialReliableRexmit = 1;
+ const unsigned short kDataChannelPartialReliableTimed = 2;
+
+ /* Constants for 'name' in error callbacks */
+ const unsigned long kNoError = 0; // Test driver only
+ const unsigned long kInvalidCandidate = 2;
+ const unsigned long kInvalidMediastreamTrack = 3;
+ const unsigned long kInvalidState = 4;
+ const unsigned long kInvalidSessionDescription = 5;
+ const unsigned long kIncompatibleSessionDescription = 6;
+ const unsigned long kIncompatibleMediaStreamTrack = 8;
+ const unsigned long kInternalError = 9;
+ const unsigned long kMaxErrorType = 9; // Same as final error
+};
diff --git a/dom/media/bridge/MediaModule.cpp b/dom/media/bridge/MediaModule.cpp
new file mode 100644
index 000000000..92f57a70c
--- /dev/null
+++ b/dom/media/bridge/MediaModule.cpp
@@ -0,0 +1,57 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ModuleUtils.h"
+#include "nsIClassInfoImpl.h"
+
+#ifdef MOZ_WEBRTC
+
+#include "PeerConnectionImpl.h"
+
+#define PEERCONNECTION_CID \
+{0xb93af7a1, 0x3411, 0x44a8, {0xbd, 0x0a, 0x8a, 0xf3, 0xdd, 0xe4, 0xd8, 0xd8}}
+
+#define PEERCONNECTION_CONTRACTID "@mozilla.org/peerconnection;1"
+
+#include "stun_socket_filter.h"
+
+NS_DEFINE_NAMED_CID(NS_STUN_UDP_SOCKET_FILTER_HANDLER_CID)
+NS_DEFINE_NAMED_CID(NS_STUN_TCP_SOCKET_FILTER_HANDLER_CID)
+
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsStunUDPSocketFilterHandler)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsStunTCPSocketFilterHandler)
+
+
+namespace mozilla
+{
+// Factory defined in mozilla::, defines mozilla::PeerConnectionImplConstructor
+NS_GENERIC_FACTORY_CONSTRUCTOR(PeerConnectionImpl)
+}
+
+// Defines kPEERCONNECTION_CID
+NS_DEFINE_NAMED_CID(PEERCONNECTION_CID);
+
+static const mozilla::Module::CIDEntry kCIDs[] = {
+ { &kPEERCONNECTION_CID, false, nullptr, mozilla::PeerConnectionImplConstructor },
+ { &kNS_STUN_UDP_SOCKET_FILTER_HANDLER_CID, false, nullptr, nsStunUDPSocketFilterHandlerConstructor },
+ { &kNS_STUN_TCP_SOCKET_FILTER_HANDLER_CID, false, nullptr, nsStunTCPSocketFilterHandlerConstructor },
+ { nullptr }
+};
+
+static const mozilla::Module::ContractIDEntry kContracts[] = {
+ { PEERCONNECTION_CONTRACTID, &kPEERCONNECTION_CID },
+ { NS_STUN_UDP_SOCKET_FILTER_HANDLER_CONTRACTID, &kNS_STUN_UDP_SOCKET_FILTER_HANDLER_CID },
+ { NS_STUN_TCP_SOCKET_FILTER_HANDLER_CONTRACTID, &kNS_STUN_TCP_SOCKET_FILTER_HANDLER_CID },
+ { nullptr }
+};
+
+static const mozilla::Module kModule = {
+ mozilla::Module::kVersion,
+ kCIDs,
+ kContracts
+};
+
+NSMODULE_DEFN(peerconnection) = &kModule;
+
+#endif
diff --git a/dom/media/bridge/moz.build b/dom/media/bridge/moz.build
new file mode 100644
index 000000000..6d396c615
--- /dev/null
+++ b/dom/media/bridge/moz.build
@@ -0,0 +1,31 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+XPIDL_SOURCES += [
+ 'IPeerConnection.idl',
+]
+
+XPIDL_MODULE = 'peerconnection'
+
+SOURCES += [
+ 'MediaModule.cpp',
+]
+
+LOCAL_INCLUDES += [
+ '/ipc/chromium/src',
+ '/media/mtransport',
+ '/media/mtransport',
+ '/media/webrtc/',
+ '/media/webrtc/signaling/src/common/time_profiling',
+ '/media/webrtc/signaling/src/media-conduit',
+ '/media/webrtc/signaling/src/mediapipeline',
+ '/media/webrtc/signaling/src/peerconnection',
+]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/directshow/AudioSinkFilter.cpp b/dom/media/directshow/AudioSinkFilter.cpp
new file mode 100644
index 000000000..9f23c0e00
--- /dev/null
+++ b/dom/media/directshow/AudioSinkFilter.cpp
@@ -0,0 +1,285 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SampleSink.h"
+#include "AudioSinkFilter.h"
+#include "AudioSinkInputPin.h"
+#include "VideoUtils.h"
+#include "mozilla/Logging.h"
+
+
+#include <initguid.h>
+#include <wmsdkidl.h>
+
+#define DELETE_RESET(p) { delete (p) ; (p) = nullptr ;}
+
+DEFINE_GUID(CLSID_MozAudioSinkFilter, 0x1872d8c8, 0xea8d, 0x4c34, 0xae, 0x96, 0x69, 0xde,
+ 0xf1, 0x33, 0x7b, 0x33);
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+static LazyLogModule gDirectShowLog("DirectShowDecoder");
+#define LOG(...) MOZ_LOG(gDirectShowLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+AudioSinkFilter::AudioSinkFilter(const wchar_t* aObjectName, HRESULT* aOutResult)
+ : BaseFilter(aObjectName, CLSID_MozAudioSinkFilter),
+ mFilterCritSec("AudioSinkFilter::mFilterCritSec")
+{
+ (*aOutResult) = S_OK;
+ mInputPin = new AudioSinkInputPin(L"AudioSinkInputPin",
+ this,
+ &mFilterCritSec,
+ aOutResult);
+}
+
+AudioSinkFilter::~AudioSinkFilter()
+{
+}
+
+int
+AudioSinkFilter::GetPinCount()
+{
+ return 1;
+}
+
+BasePin*
+AudioSinkFilter::GetPin(int aIndex)
+{
+ CriticalSectionAutoEnter lockFilter(mFilterCritSec);
+ return (aIndex == 0) ? static_cast<BasePin*>(mInputPin) : nullptr;
+}
+
+HRESULT
+AudioSinkFilter::Pause()
+{
+ CriticalSectionAutoEnter lockFilter(mFilterCritSec);
+ if (mState == State_Stopped) {
+ // Change the state, THEN activate the input pin.
+ mState = State_Paused;
+ if (mInputPin && mInputPin->IsConnected()) {
+ mInputPin->Active();
+ }
+ } else if (mState == State_Running) {
+ mState = State_Paused;
+ }
+ return S_OK;
+}
+
+HRESULT
+AudioSinkFilter::Stop()
+{
+ CriticalSectionAutoEnter lockFilter(mFilterCritSec);
+ mState = State_Stopped;
+ if (mInputPin) {
+ mInputPin->Inactive();
+ }
+
+ GetSampleSink()->Flush();
+
+ return S_OK;
+}
+
+HRESULT
+AudioSinkFilter::Run(REFERENCE_TIME tStart)
+{
+ LOG("AudioSinkFilter::Run(%lld) [%4.2lf]",
+ RefTimeToUsecs(tStart),
+ double(RefTimeToUsecs(tStart)) / USECS_PER_S);
+ return media::BaseFilter::Run(tStart);
+}
+
+HRESULT
+AudioSinkFilter::GetClassID( OUT CLSID * pCLSID )
+{
+ (* pCLSID) = CLSID_MozAudioSinkFilter;
+ return S_OK;
+}
+
+HRESULT
+AudioSinkFilter::QueryInterface(REFIID aIId, void **aInterface)
+{
+ if (aIId == IID_IMediaSeeking) {
+ *aInterface = static_cast<IMediaSeeking*>(this);
+ AddRef();
+ return S_OK;
+ }
+ return mozilla::media::BaseFilter::QueryInterface(aIId, aInterface);
+}
+
+ULONG
+AudioSinkFilter::AddRef()
+{
+ return ::InterlockedIncrement(&mRefCnt);
+}
+
+ULONG
+AudioSinkFilter::Release()
+{
+ unsigned long newRefCnt = ::InterlockedDecrement(&mRefCnt);
+ if (!newRefCnt) {
+ delete this;
+ }
+ return newRefCnt;
+}
+
+SampleSink*
+AudioSinkFilter::GetSampleSink()
+{
+ return mInputPin->GetSampleSink();
+}
+
+
+// IMediaSeeking implementation.
+//
+// Calls to IMediaSeeking are forwarded to the output pin that the
+// AudioSinkInputPin is connected to, i.e. upstream towards the parser and
+// source filters, which actually implement seeking.
+#define ENSURE_CONNECTED_PIN_SEEKING \
+ if (!mInputPin) { \
+ return E_NOTIMPL; \
+ } \
+ RefPtr<IMediaSeeking> pinSeeking = mInputPin->GetConnectedPinSeeking(); \
+ if (!pinSeeking) { \
+ return E_NOTIMPL; \
+ }
+
+HRESULT
+AudioSinkFilter::GetCapabilities(DWORD* aCapabilities)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetCapabilities(aCapabilities);
+}
+
+HRESULT
+AudioSinkFilter::CheckCapabilities(DWORD* aCapabilities)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->CheckCapabilities(aCapabilities);
+}
+
+HRESULT
+AudioSinkFilter::IsFormatSupported(const GUID* aFormat)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->IsFormatSupported(aFormat);
+}
+
+HRESULT
+AudioSinkFilter::QueryPreferredFormat(GUID* aFormat)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->QueryPreferredFormat(aFormat);
+}
+
+HRESULT
+AudioSinkFilter::GetTimeFormat(GUID* aFormat)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetTimeFormat(aFormat);
+}
+
+HRESULT
+AudioSinkFilter::IsUsingTimeFormat(const GUID* aFormat)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->IsUsingTimeFormat(aFormat);
+}
+
+HRESULT
+AudioSinkFilter::SetTimeFormat(const GUID* aFormat)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->SetTimeFormat(aFormat);
+}
+
+HRESULT
+AudioSinkFilter::GetDuration(LONGLONG* aDuration)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetDuration(aDuration);
+}
+
+HRESULT
+AudioSinkFilter::GetStopPosition(LONGLONG* aStop)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetStopPosition(aStop);
+}
+
+HRESULT
+AudioSinkFilter::GetCurrentPosition(LONGLONG* aCurrent)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetCurrentPosition(aCurrent);
+}
+
+HRESULT
+AudioSinkFilter::ConvertTimeFormat(LONGLONG* aTarget,
+ const GUID* aTargetFormat,
+ LONGLONG aSource,
+ const GUID* aSourceFormat)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->ConvertTimeFormat(aTarget,
+ aTargetFormat,
+ aSource,
+ aSourceFormat);
+}
+
+HRESULT
+AudioSinkFilter::SetPositions(LONGLONG* aCurrent,
+ DWORD aCurrentFlags,
+ LONGLONG* aStop,
+ DWORD aStopFlags)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->SetPositions(aCurrent,
+ aCurrentFlags,
+ aStop,
+ aStopFlags);
+}
+
+HRESULT
+AudioSinkFilter::GetPositions(LONGLONG* aCurrent,
+ LONGLONG* aStop)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetPositions(aCurrent, aStop);
+}
+
+HRESULT
+AudioSinkFilter::GetAvailable(LONGLONG* aEarliest,
+ LONGLONG* aLatest)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetAvailable(aEarliest, aLatest);
+}
+
+HRESULT
+AudioSinkFilter::SetRate(double aRate)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->SetRate(aRate);
+}
+
+HRESULT
+AudioSinkFilter::GetRate(double* aRate)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetRate(aRate);
+}
+
+HRESULT
+AudioSinkFilter::GetPreroll(LONGLONG* aPreroll)
+{
+ ENSURE_CONNECTED_PIN_SEEKING
+ return pinSeeking->GetPreroll(aPreroll);
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/directshow/AudioSinkFilter.h b/dom/media/directshow/AudioSinkFilter.h
new file mode 100644
index 000000000..85abdfccf
--- /dev/null
+++ b/dom/media/directshow/AudioSinkFilter.h
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(AudioSinkFilter_h_)
+#define AudioSinkFilter_h_
+
+#include "BaseFilter.h"
+#include "DirectShowUtils.h"
+#include "nsAutoPtr.h"
+#include "mozilla/RefPtr.h"
+
+namespace mozilla {
+
+class AudioSinkInputPin;
+class SampleSink;
+
+// Filter that acts as the end of the graph. Audio samples input into
+// this filter block the calling thread, and the calling thread is
+// unblocked when the decode thread extracts the sample. The samples
+// input into this filter are stored in the SampleSink, where the blocking
+// is implemented. The input pin owns the SampleSink.
+class AudioSinkFilter: public mozilla::media::BaseFilter,
+ public IMediaSeeking
+{
+
+public:
+ AudioSinkFilter(const wchar_t* aObjectName, HRESULT* aOutResult);
+ virtual ~AudioSinkFilter();
+
+ // Gets the input pin's sample sink.
+ SampleSink* GetSampleSink();
+
+ // IUnknown implementation.
+ STDMETHODIMP QueryInterface(REFIID aIId, void **aInterface);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ // --------------------------------------------------------------------
+ // CBaseFilter methods
+ int GetPinCount ();
+ mozilla::media::BasePin* GetPin ( IN int Index);
+ STDMETHODIMP Pause ();
+ STDMETHODIMP Stop ();
+ STDMETHODIMP GetClassID ( OUT CLSID * pCLSID);
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
+ // IMediaSeeking Methods...
+
+ // We defer to SourceFilter, but we must expose the interface on
+ // the output pins. Seeking commands come upstream from the renderers,
+ // but they must be actioned at the source filters.
+ STDMETHODIMP GetCapabilities(DWORD* aCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* aCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* aFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* aFormat);
+ STDMETHODIMP GetTimeFormat(GUID* aFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* aFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* aFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* aCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* aTarget,
+ const GUID* aTargetFormat,
+ LONGLONG aSource,
+ const GUID* aSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* aCurrent,
+ DWORD aCurrentFlags,
+ LONGLONG* aStop,
+ DWORD aStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* aCurrent,
+ LONGLONG* aStop);
+ STDMETHODIMP GetAvailable(LONGLONG* aEarliest,
+ LONGLONG* aLatest);
+ STDMETHODIMP SetRate(double aRate);
+ STDMETHODIMP GetRate(double* aRate);
+ STDMETHODIMP GetPreroll(LONGLONG* aPreroll);
+
+ // --------------------------------------------------------------------
+ // class factory calls this
+ static IUnknown * CreateInstance (IN LPUNKNOWN punk, OUT HRESULT * phr);
+
+private:
+ CriticalSection mFilterCritSec;
+
+ // Note: The input pin defers its refcounting to the sink filter, so when
+ // the input pin is addrefed, what actually happens is the sink filter is
+ // addrefed.
+ nsAutoPtr<AudioSinkInputPin> mInputPin;
+};
+
+} // namespace mozilla
+
+#endif // AudioSinkFilter_h_
diff --git a/dom/media/directshow/AudioSinkInputPin.cpp b/dom/media/directshow/AudioSinkInputPin.cpp
new file mode 100644
index 000000000..85a6e3da3
--- /dev/null
+++ b/dom/media/directshow/AudioSinkInputPin.cpp
@@ -0,0 +1,195 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioSinkInputPin.h"
+#include "AudioSinkFilter.h"
+#include "SampleSink.h"
+#include "mozilla/Logging.h"
+
+#include <wmsdkidl.h>
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+static LazyLogModule gDirectShowLog("DirectShowDecoder");
+#define LOG(...) MOZ_LOG(gDirectShowLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+AudioSinkInputPin::AudioSinkInputPin(wchar_t* aObjectName,
+ AudioSinkFilter* aFilter,
+ mozilla::CriticalSection* aLock,
+ HRESULT* aOutResult)
+ : BaseInputPin(aObjectName, aFilter, aLock, aOutResult, aObjectName),
+ mSegmentStartTime(0)
+{
+ MOZ_COUNT_CTOR(AudioSinkInputPin);
+ mSampleSink = new SampleSink();
+}
+
+AudioSinkInputPin::~AudioSinkInputPin()
+{
+ MOZ_COUNT_DTOR(AudioSinkInputPin);
+}
+
+HRESULT
+AudioSinkInputPin::GetMediaType(int aPosition, MediaType* aOutMediaType)
+{
+ NS_ENSURE_TRUE(aPosition >= 0, E_INVALIDARG);
+ NS_ENSURE_TRUE(aOutMediaType, E_POINTER);
+
+ if (aPosition > 0) {
+ return S_FALSE;
+ }
+
+ // Note: We set output as PCM, as IEEE_FLOAT only works when using the
+ // MP3 decoder as an MFT, and we can't do that while using DirectShow.
+ aOutMediaType->SetType(&MEDIATYPE_Audio);
+ aOutMediaType->SetSubtype(&MEDIASUBTYPE_PCM);
+ aOutMediaType->SetType(&FORMAT_WaveFormatEx);
+ aOutMediaType->SetTemporalCompression(FALSE);
+
+ return S_OK;
+}
+
+HRESULT
+AudioSinkInputPin::CheckMediaType(const MediaType* aMediaType)
+{
+ if (!aMediaType) {
+ return E_INVALIDARG;
+ }
+
+ GUID majorType = *aMediaType->Type();
+ if (majorType != MEDIATYPE_Audio && majorType != WMMEDIATYPE_Audio) {
+ return E_INVALIDARG;
+ }
+
+ if (*aMediaType->Subtype() != MEDIASUBTYPE_PCM) {
+ return E_INVALIDARG;
+ }
+
+ if (*aMediaType->FormatType() != FORMAT_WaveFormatEx) {
+ return E_INVALIDARG;
+ }
+
+ // We accept the media type, stash its layout format!
+ WAVEFORMATEX* wfx = (WAVEFORMATEX*)(aMediaType->pbFormat);
+ GetSampleSink()->SetAudioFormat(wfx);
+
+ return S_OK;
+}
+
+AudioSinkFilter*
+AudioSinkInputPin::GetAudioSinkFilter()
+{
+ return reinterpret_cast<AudioSinkFilter*>(mFilter);
+}
+
+SampleSink*
+AudioSinkInputPin::GetSampleSink()
+{
+ return mSampleSink;
+}
+
+HRESULT
+AudioSinkInputPin::SetAbsoluteMediaTime(IMediaSample* aSample)
+{
+ HRESULT hr;
+ REFERENCE_TIME start = 0, end = 0;
+ hr = aSample->GetTime(&start, &end);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), E_FAIL);
+ {
+ CriticalSectionAutoEnter lock(*mLock);
+ start += mSegmentStartTime;
+ end += mSegmentStartTime;
+ }
+ hr = aSample->SetMediaTime(&start, &end);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), E_FAIL);
+ return S_OK;
+}
+
+HRESULT
+AudioSinkInputPin::Receive(IMediaSample* aSample )
+{
+ HRESULT hr;
+ NS_ENSURE_TRUE(aSample, E_POINTER);
+
+ hr = BaseInputPin::Receive(aSample);
+ if (SUCCEEDED(hr) && hr != S_FALSE) { // S_FALSE == flushing
+ // Set the timestamp of the sample after being adjusted for
+ // seeking/segments in the "media time" attribute. When we seek,
+ // DirectShow starts a new "segment", and starts labeling samples
+ // from time=0 again, so we need to correct for this to get the
+ // actual timestamps after seeking.
+ hr = SetAbsoluteMediaTime(aSample);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ hr = GetSampleSink()->Receive(aSample);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ }
+ return S_OK;
+}
+
+already_AddRefed<IMediaSeeking>
+AudioSinkInputPin::GetConnectedPinSeeking()
+{
+ RefPtr<IPin> peer = GetConnected();
+ if (!peer)
+ return nullptr;
+ RefPtr<IMediaSeeking> seeking;
+ peer->QueryInterface(static_cast<IMediaSeeking**>(getter_AddRefs(seeking)));
+ return seeking.forget();
+}
+
+HRESULT
+AudioSinkInputPin::BeginFlush()
+{
+ HRESULT hr = media::BaseInputPin::BeginFlush();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ GetSampleSink()->Flush();
+
+ return S_OK;
+}
+
+HRESULT
+AudioSinkInputPin::EndFlush()
+{
+ HRESULT hr = media::BaseInputPin::EndFlush();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // Reset the EOS flag, so that if we're called after a seek we still work.
+ GetSampleSink()->Reset();
+
+ return S_OK;
+}
+
+HRESULT
+AudioSinkInputPin::EndOfStream(void)
+{
+ HRESULT hr = media::BaseInputPin::EndOfStream();
+ if (FAILED(hr) || hr == S_FALSE) {
+ // Pin is stil flushing.
+ return hr;
+ }
+ GetSampleSink()->SetEOS();
+
+ return S_OK;
+}
+
+
+HRESULT
+AudioSinkInputPin::NewSegment(REFERENCE_TIME tStart,
+ REFERENCE_TIME tStop,
+ double dRate)
+{
+ CriticalSectionAutoEnter lock(*mLock);
+ // Record the start time of the new segment, so that we can store the
+ // correct absolute timestamp in the "media time" each incoming sample.
+ mSegmentStartTime = tStart;
+ return S_OK;
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/directshow/AudioSinkInputPin.h b/dom/media/directshow/AudioSinkInputPin.h
new file mode 100644
index 000000000..80503c641
--- /dev/null
+++ b/dom/media/directshow/AudioSinkInputPin.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(AudioSinkInputPin_h_)
+#define AudioSinkInputPin_h_
+
+#include "BaseInputPin.h"
+#include "DirectShowUtils.h"
+#include "mozilla/RefPtr.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+
+namespace media {
+ class MediaType;
+}
+
+class AudioSinkFilter;
+class SampleSink;
+
+
+// Input pin for capturing audio output of a DirectShow filter graph.
+// This is the input pin for the AudioSinkFilter.
+class AudioSinkInputPin: public mozilla::media::BaseInputPin
+{
+public:
+ AudioSinkInputPin(wchar_t* aObjectName,
+ AudioSinkFilter* aFilter,
+ mozilla::CriticalSection* aLock,
+ HRESULT* aOutResult);
+ virtual ~AudioSinkInputPin();
+
+ HRESULT GetMediaType (IN int iPos, OUT mozilla::media::MediaType * pmt);
+ HRESULT CheckMediaType (IN const mozilla::media::MediaType * pmt);
+ STDMETHODIMP Receive (IN IMediaSample *);
+ STDMETHODIMP BeginFlush() override;
+ STDMETHODIMP EndFlush() override;
+
+ // Called when we start decoding a new segment, that happens directly after
+ // a seek. This captures the segment's start time. Samples decoded by the
+ // MP3 decoder have their timestamps offset from the segment start time.
+ // Storing the segment start time enables us to set each sample's MediaTime
+ // as an offset in the stream relative to the start of the stream, rather
+ // than the start of the segment, i.e. its absolute time in the stream.
+ STDMETHODIMP NewSegment(REFERENCE_TIME tStart,
+ REFERENCE_TIME tStop,
+ double dRate) override;
+
+ STDMETHODIMP EndOfStream() override;
+
+ // Returns the IMediaSeeking interface of the connected output pin.
+ // We forward seeking requests upstream from the sink to the source
+ // filters.
+ already_AddRefed<IMediaSeeking> GetConnectedPinSeeking();
+
+ SampleSink* GetSampleSink();
+
+private:
+ AudioSinkFilter* GetAudioSinkFilter();
+
+ // Sets the media time on the media sample, relative to the segment
+ // start time.
+ HRESULT SetAbsoluteMediaTime(IMediaSample* aSample);
+
+ nsAutoPtr<SampleSink> mSampleSink;
+
+ // Synchronized by the filter lock; BaseInputPin::mLock.
+ REFERENCE_TIME mSegmentStartTime;
+};
+
+} // namespace mozilla
+
+#endif // AudioSinkInputPin_h_
diff --git a/dom/media/directshow/DirectShowDecoder.cpp b/dom/media/directshow/DirectShowDecoder.cpp
new file mode 100644
index 000000000..da68b4daa
--- /dev/null
+++ b/dom/media/directshow/DirectShowDecoder.cpp
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DirectShowDecoder.h"
+#include "DirectShowReader.h"
+#include "DirectShowUtils.h"
+#include "MediaDecoderStateMachine.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/WindowsVersion.h"
+
+namespace mozilla {
+
+MediaDecoderStateMachine* DirectShowDecoder::CreateStateMachine()
+{
+ return new MediaDecoderStateMachine(this, new DirectShowReader(this));
+}
+
+/* static */
+bool
+DirectShowDecoder::GetSupportedCodecs(const nsACString& aType,
+ char const *const ** aCodecList)
+{
+ if (!IsEnabled()) {
+ return false;
+ }
+
+ static char const *const mp3AudioCodecs[] = {
+ "mp3",
+ nullptr
+ };
+ if (aType.EqualsASCII("audio/mpeg") ||
+ aType.EqualsASCII("audio/mp3")) {
+ if (aCodecList) {
+ *aCodecList = mp3AudioCodecs;
+ }
+ return true;
+ }
+
+ return false;
+}
+
+/* static */
+bool
+DirectShowDecoder::IsEnabled()
+{
+ return CanDecodeMP3UsingDirectShow() &&
+ Preferences::GetBool("media.directshow.enabled");
+}
+
+DirectShowDecoder::DirectShowDecoder(MediaDecoderOwner* aOwner)
+ : MediaDecoder(aOwner)
+{
+ MOZ_COUNT_CTOR(DirectShowDecoder);
+}
+
+DirectShowDecoder::~DirectShowDecoder()
+{
+ MOZ_COUNT_DTOR(DirectShowDecoder);
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/directshow/DirectShowDecoder.h b/dom/media/directshow/DirectShowDecoder.h
new file mode 100644
index 000000000..c4d371fbf
--- /dev/null
+++ b/dom/media/directshow/DirectShowDecoder.h
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(DirectShowDecoder_h_)
+#define DirectShowDecoder_h_
+
+#include "MediaDecoder.h"
+
+namespace mozilla {
+
+// Decoder that uses DirectShow to playback MP3 files only.
+class DirectShowDecoder : public MediaDecoder
+{
+public:
+
+ explicit DirectShowDecoder(MediaDecoderOwner* aOwner);
+ virtual ~DirectShowDecoder();
+
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override {
+ if (!IsEnabled()) {
+ return nullptr;
+ }
+ return new DirectShowDecoder(aOwner);
+ }
+
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // Returns true if aType is a MIME type that we render with the
+ // DirectShow backend. If aCodecList is non null,
+ // it is filled with a (static const) null-terminated list of strings
+ // denoting the codecs we'll playback. Note that playback is strictly
+ // limited to MP3 only.
+ static bool GetSupportedCodecs(const nsACString& aType,
+ char const *const ** aCodecList);
+
+ // Returns true if the DirectShow backend is preffed on.
+ static bool IsEnabled();
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/directshow/DirectShowReader.cpp b/dom/media/directshow/DirectShowReader.cpp
new file mode 100644
index 000000000..cacf6f8de
--- /dev/null
+++ b/dom/media/directshow/DirectShowReader.cpp
@@ -0,0 +1,360 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DirectShowReader.h"
+#include "MediaDecoderReader.h"
+#include "mozilla/RefPtr.h"
+#include "DirectShowUtils.h"
+#include "AudioSinkFilter.h"
+#include "SourceFilter.h"
+#include "SampleSink.h"
+#include "VideoUtils.h"
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+// Windows XP's MP3 decoder filter. This is available on XP only, on Vista
+// and later we can use the DMO Wrapper filter and MP3 decoder DMO.
+const GUID DirectShowReader::CLSID_MPEG_LAYER_3_DECODER_FILTER =
+{ 0x38BE3000, 0xDBF4, 0x11D0, {0x86, 0x0E, 0x00, 0xA0, 0x24, 0xCF, 0xEF, 0x6D} };
+
+
+static LazyLogModule gDirectShowLog("DirectShowDecoder");
+#define LOG(...) MOZ_LOG(gDirectShowLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+DirectShowReader::DirectShowReader(AbstractMediaDecoder* aDecoder)
+ : MediaDecoderReader(aDecoder),
+ mMP3FrameParser(aDecoder->GetResource()->GetLength()),
+#ifdef DIRECTSHOW_REGISTER_GRAPH
+ mRotRegister(0),
+#endif
+ mNumChannels(0),
+ mAudioRate(0),
+ mBytesPerSample(0)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread.");
+ MOZ_COUNT_CTOR(DirectShowReader);
+}
+
+DirectShowReader::~DirectShowReader()
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread.");
+ MOZ_COUNT_DTOR(DirectShowReader);
+#ifdef DIRECTSHOW_REGISTER_GRAPH
+ if (mRotRegister) {
+ RemoveGraphFromRunningObjectTable(mRotRegister);
+ }
+#endif
+}
+
+// Try to parse the MP3 stream to make sure this is indeed an MP3, get the
+// estimated duration of the stream, and find the offset of the actual MP3
+// frames in the stream, as DirectShow doesn't like large ID3 sections.
+static nsresult
+ParseMP3Headers(MP3FrameParser *aParser, MediaResource *aResource)
+{
+ const uint32_t MAX_READ_SIZE = 4096;
+
+ uint64_t offset = 0;
+ while (aParser->NeedsData() && !aParser->ParsedHeaders()) {
+ uint32_t bytesRead;
+ char buffer[MAX_READ_SIZE];
+ nsresult rv = aResource->ReadAt(offset, buffer,
+ MAX_READ_SIZE, &bytesRead);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (!bytesRead) {
+ // End of stream.
+ return NS_ERROR_FAILURE;
+ }
+
+ aParser->Parse(reinterpret_cast<uint8_t*>(buffer), bytesRead, offset);
+ offset += bytesRead;
+ }
+
+ return aParser->IsMP3() ? NS_OK : NS_ERROR_FAILURE;
+}
+
+nsresult
+DirectShowReader::ReadMetadata(MediaInfo* aInfo,
+ MetadataTags** aTags)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ HRESULT hr;
+ nsresult rv;
+
+ // Create the filter graph, reference it by the GraphBuilder interface,
+ // to make graph building more convenient.
+ hr = CoCreateInstance(CLSID_FilterGraph,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IGraphBuilder,
+ reinterpret_cast<void**>(static_cast<IGraphBuilder**>(getter_AddRefs(mGraph))));
+ NS_ENSURE_TRUE(SUCCEEDED(hr) && mGraph, NS_ERROR_FAILURE);
+
+ rv = ParseMP3Headers(&mMP3FrameParser, mDecoder->GetResource());
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ #ifdef DIRECTSHOW_REGISTER_GRAPH
+ hr = AddGraphToRunningObjectTable(mGraph, &mRotRegister);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+ #endif
+
+ // Extract the interface pointers we'll need from the filter graph.
+ hr = mGraph->QueryInterface(static_cast<IMediaControl**>(getter_AddRefs(mControl)));
+ NS_ENSURE_TRUE(SUCCEEDED(hr) && mControl, NS_ERROR_FAILURE);
+
+ hr = mGraph->QueryInterface(static_cast<IMediaSeeking**>(getter_AddRefs(mMediaSeeking)));
+ NS_ENSURE_TRUE(SUCCEEDED(hr) && mMediaSeeking, NS_ERROR_FAILURE);
+
+ // Build the graph. Create the filters we need, and connect them. We
+ // build the entire graph ourselves to prevent other decoders installed
+ // on the system being created and used.
+
+ // Our source filters, wraps the MediaResource.
+ mSourceFilter = new SourceFilter(MEDIATYPE_Stream, MEDIASUBTYPE_MPEG1Audio);
+ NS_ENSURE_TRUE(mSourceFilter, NS_ERROR_FAILURE);
+
+ rv = mSourceFilter->Init(mDecoder->GetResource(), mMP3FrameParser.GetMP3Offset());
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ hr = mGraph->AddFilter(mSourceFilter, L"MozillaDirectShowSource");
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ // The MPEG demuxer.
+ RefPtr<IBaseFilter> demuxer;
+ hr = CreateAndAddFilter(mGraph,
+ CLSID_MPEG1Splitter,
+ L"MPEG1Splitter",
+ getter_AddRefs(demuxer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ // Platform MP3 decoder.
+ RefPtr<IBaseFilter> decoder;
+ // Firstly try to create the MP3 decoder filter that ships with WinXP
+ // directly. This filter doesn't normally exist on later versions of
+ // Windows.
+ hr = CreateAndAddFilter(mGraph,
+ CLSID_MPEG_LAYER_3_DECODER_FILTER,
+ L"MPEG Layer 3 Decoder",
+ getter_AddRefs(decoder));
+ if (FAILED(hr)) {
+ // Failed to create MP3 decoder filter. Try to instantiate
+ // the MP3 decoder DMO.
+ hr = AddMP3DMOWrapperFilter(mGraph, getter_AddRefs(decoder));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+ }
+
+ // Sink, captures audio samples and inserts them into our pipeline.
+ static const wchar_t* AudioSinkFilterName = L"MozAudioSinkFilter";
+ mAudioSinkFilter = new AudioSinkFilter(AudioSinkFilterName, &hr);
+ NS_ENSURE_TRUE(mAudioSinkFilter && SUCCEEDED(hr), NS_ERROR_FAILURE);
+ hr = mGraph->AddFilter(mAudioSinkFilter, AudioSinkFilterName);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ // Join the filters.
+ hr = ConnectFilters(mGraph, mSourceFilter, demuxer);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ hr = ConnectFilters(mGraph, demuxer, decoder);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ hr = ConnectFilters(mGraph, decoder, mAudioSinkFilter);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ WAVEFORMATEX format;
+ mAudioSinkFilter->GetSampleSink()->GetAudioFormat(&format);
+ NS_ENSURE_TRUE(format.wFormatTag == WAVE_FORMAT_PCM, NS_ERROR_FAILURE);
+
+ mInfo.mAudio.mChannels = mNumChannels = format.nChannels;
+ mInfo.mAudio.mRate = mAudioRate = format.nSamplesPerSec;
+ mInfo.mAudio.mBitDepth = format.wBitsPerSample;
+ mBytesPerSample = format.wBitsPerSample / 8;
+
+ // Begin decoding!
+ hr = mControl->Run();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ DWORD seekCaps = 0;
+ hr = mMediaSeeking->GetCapabilities(&seekCaps);
+ mInfo.mMediaSeekable = SUCCEEDED(hr) && (AM_SEEKING_CanSeekAbsolute & seekCaps);
+
+ int64_t duration = mMP3FrameParser.GetDuration();
+ if (SUCCEEDED(hr)) {
+ mInfo.mMetadataDuration.emplace(TimeUnit::FromMicroseconds(duration));
+ }
+
+ LOG("Successfully initialized DirectShow MP3 decoder.");
+ LOG("Channels=%u Hz=%u duration=%lld bytesPerSample=%d",
+ mInfo.mAudio.mChannels,
+ mInfo.mAudio.mRate,
+ RefTimeToUsecs(duration),
+ mBytesPerSample);
+
+ *aInfo = mInfo;
+ // Note: The SourceFilter strips ID3v2 tags out of the stream.
+ *aTags = nullptr;
+
+ return NS_OK;
+}
+
+inline float
+UnsignedByteToAudioSample(uint8_t aValue)
+{
+ return aValue * (2.0f / UINT8_MAX) - 1.0f;
+}
+
+bool
+DirectShowReader::Finish(HRESULT aStatus)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ LOG("DirectShowReader::Finish(0x%x)", aStatus);
+ // Notify the filter graph of end of stream.
+ RefPtr<IMediaEventSink> eventSink;
+ HRESULT hr = mGraph->QueryInterface(static_cast<IMediaEventSink**>(getter_AddRefs(eventSink)));
+ if (SUCCEEDED(hr) && eventSink) {
+ eventSink->Notify(EC_COMPLETE, aStatus, 0);
+ }
+ return false;
+}
+
+class DirectShowCopy
+{
+public:
+ DirectShowCopy(uint8_t *aSource, uint32_t aBytesPerSample,
+ uint32_t aSamples, uint32_t aChannels)
+ : mSource(aSource)
+ , mBytesPerSample(aBytesPerSample)
+ , mSamples(aSamples)
+ , mChannels(aChannels)
+ , mNextSample(0)
+ { }
+
+ uint32_t operator()(AudioDataValue *aBuffer, uint32_t aSamples)
+ {
+ uint32_t maxSamples = std::min(aSamples, mSamples - mNextSample);
+ uint32_t frames = maxSamples / mChannels;
+ size_t byteOffset = mNextSample * mBytesPerSample;
+ if (mBytesPerSample == 1) {
+ for (uint32_t i = 0; i < maxSamples; ++i) {
+ uint8_t *sample = mSource + byteOffset;
+ aBuffer[i] = UnsignedByteToAudioSample(*sample);
+ byteOffset += mBytesPerSample;
+ }
+ } else if (mBytesPerSample == 2) {
+ for (uint32_t i = 0; i < maxSamples; ++i) {
+ int16_t *sample = reinterpret_cast<int16_t *>(mSource + byteOffset);
+ aBuffer[i] = AudioSampleToFloat(*sample);
+ byteOffset += mBytesPerSample;
+ }
+ }
+ mNextSample += maxSamples;
+ return frames;
+ }
+
+private:
+ uint8_t * const mSource;
+ const uint32_t mBytesPerSample;
+ const uint32_t mSamples;
+ const uint32_t mChannels;
+ uint32_t mNextSample;
+};
+
+bool
+DirectShowReader::DecodeAudioData()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ HRESULT hr;
+
+ SampleSink* sink = mAudioSinkFilter->GetSampleSink();
+ if (sink->AtEOS()) {
+ // End of stream.
+ return Finish(S_OK);
+ }
+
+ // Get the next chunk of audio samples. This blocks until the sample
+ // arrives, or an error occurs (like the stream is shutdown).
+ RefPtr<IMediaSample> sample;
+ hr = sink->Extract(sample);
+ if (FAILED(hr) || hr == S_FALSE) {
+ return Finish(hr);
+ }
+
+ int64_t start = 0, end = 0;
+ sample->GetMediaTime(&start, &end);
+ LOG("DirectShowReader::DecodeAudioData [%4.2lf-%4.2lf]",
+ RefTimeToSeconds(start),
+ RefTimeToSeconds(end));
+
+ LONG length = sample->GetActualDataLength();
+ LONG numSamples = length / mBytesPerSample;
+ LONG numFrames = length / mBytesPerSample / mNumChannels;
+
+ BYTE* data = nullptr;
+ hr = sample->GetPointer(&data);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), Finish(hr));
+
+ mAudioCompactor.Push(mDecoder->GetResource()->Tell(),
+ RefTimeToUsecs(start),
+ mInfo.mAudio.mRate,
+ numFrames,
+ mNumChannels,
+ DirectShowCopy(reinterpret_cast<uint8_t *>(data),
+ mBytesPerSample,
+ numSamples,
+ mNumChannels));
+ return true;
+}
+
+bool
+DirectShowReader::DecodeVideoFrame(bool &aKeyframeSkip,
+ int64_t aTimeThreshold)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return false;
+}
+
+RefPtr<MediaDecoderReader::SeekPromise>
+DirectShowReader::Seek(SeekTarget aTarget, int64_t aEndTime)
+{
+ nsresult res = SeekInternal(aTarget.GetTime().ToMicroseconds());
+ if (NS_FAILED(res)) {
+ return SeekPromise::CreateAndReject(res, __func__);
+ } else {
+ return SeekPromise::CreateAndResolve(aTarget.GetTime(), __func__);
+ }
+}
+
+nsresult
+DirectShowReader::SeekInternal(int64_t aTargetUs)
+{
+ HRESULT hr;
+ MOZ_ASSERT(OnTaskQueue());
+
+ LOG("DirectShowReader::Seek() target=%lld", aTargetUs);
+
+ hr = mControl->Pause();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ nsresult rv = ResetDecode();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ LONGLONG seekPosition = UsecsToRefTime(aTargetUs);
+ hr = mMediaSeeking->SetPositions(&seekPosition,
+ AM_SEEKING_AbsolutePositioning,
+ nullptr,
+ AM_SEEKING_NoPositioning);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ hr = mControl->Run();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), NS_ERROR_FAILURE);
+
+ return NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/directshow/DirectShowReader.h b/dom/media/directshow/DirectShowReader.h
new file mode 100644
index 000000000..e1326d416
--- /dev/null
+++ b/dom/media/directshow/DirectShowReader.h
@@ -0,0 +1,110 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(DirectShowReader_h_)
+#define DirectShowReader_h_
+
+#include "windows.h" // HRESULT, DWORD
+#include "MediaDecoderReader.h"
+#include "MediaResource.h"
+#include "mozilla/RefPtr.h"
+#include "MP3FrameParser.h"
+
+// Add the graph to the Running Object Table so that we can connect
+// to this graph with GraphEdit/GraphStudio. Note: on Vista and up you must
+// also regsvr32 proppage.dll from the Windows SDK.
+// See: http://msdn.microsoft.com/en-us/library/ms787252(VS.85).aspx
+// #define DIRECTSHOW_REGISTER_GRAPH
+
+struct IGraphBuilder;
+struct IMediaControl;
+struct IMediaSeeking;
+
+namespace mozilla {
+
+class AudioSinkFilter;
+class SourceFilter;
+
+// Decoder backend for decoding MP3 using DirectShow. DirectShow operates as
+// a filter graph. The basic design of the DirectShowReader is that we have
+// a SourceFilter that wraps the MediaResource that connects to the
+// MP3 decoder filter. The MP3 decoder filter "pulls" data as it requires it
+// downstream on its own thread. When the MP3 decoder has produced a block of
+// decoded samples, its thread calls downstream into our AudioSinkFilter,
+// passing the decoded buffer in. The AudioSinkFilter inserts the samples into
+// a SampleSink object. The SampleSink blocks the MP3 decoder's thread until
+// the decode thread calls DecodeAudioData(), whereupon the SampleSink
+// releases the decoded samples to the decode thread, and unblocks the MP3
+// decoder's thread. The MP3 decoder can then request more data from the
+// SourceFilter, and decode more data. If the decode thread calls
+// DecodeAudioData() and there's no decoded samples waiting to be extracted
+// in the SampleSink, the SampleSink blocks the decode thread until the MP3
+// decoder produces a decoded sample.
+class DirectShowReader : public MediaDecoderReader
+{
+public:
+ DirectShowReader(AbstractMediaDecoder* aDecoder);
+
+ virtual ~DirectShowReader();
+
+ bool DecodeAudioData() override;
+ bool DecodeVideoFrame(bool &aKeyframeSkip,
+ int64_t aTimeThreshold) override;
+
+ nsresult ReadMetadata(MediaInfo* aInfo,
+ MetadataTags** aTags) override;
+
+ RefPtr<SeekPromise>
+ Seek(SeekTarget aTarget, int64_t aEndTime) override;
+
+ static const GUID CLSID_MPEG_LAYER_3_DECODER_FILTER;
+
+private:
+ // Notifies the filter graph that playback is complete. aStatus is
+ // the code to send to the filter graph. Always returns false, so
+ // that we can just "return Finish()" from DecodeAudioData().
+ bool Finish(HRESULT aStatus);
+
+ nsresult SeekInternal(int64_t aTime);
+
+ // DirectShow filter graph, and associated playback and seeking
+ // control interfaces.
+ RefPtr<IGraphBuilder> mGraph;
+ RefPtr<IMediaControl> mControl;
+ RefPtr<IMediaSeeking> mMediaSeeking;
+
+ // Wraps the MediaResource, and feeds undecoded data into the filter graph.
+ RefPtr<SourceFilter> mSourceFilter;
+
+ // Sits at the end of the graph, removing decoded samples from the graph.
+ // The graph will block while this is blocked, i.e. it will pause decoding.
+ RefPtr<AudioSinkFilter> mAudioSinkFilter;
+
+ // Some MP3s are variable bitrate, so DirectShow's duration estimation
+ // can make its duration estimation based on the wrong bitrate. So we parse
+ // the MP3 frames to get a more accuate estimate of the duration.
+ MP3FrameParser mMP3FrameParser;
+
+#ifdef DIRECTSHOW_REGISTER_GRAPH
+ // Used to add/remove the filter graph to the Running Object Table. You can
+ // connect GraphEdit/GraphStudio to the graph to observe and/or debug its
+ // topology and state.
+ DWORD mRotRegister;
+#endif
+
+ // Number of channels in the audio stream.
+ uint32_t mNumChannels;
+
+ // Samples per second in the audio stream.
+ uint32_t mAudioRate;
+
+ // Number of bytes per sample. Can be either 1 or 2.
+ uint32_t mBytesPerSample;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/directshow/DirectShowUtils.cpp b/dom/media/directshow/DirectShowUtils.cpp
new file mode 100644
index 000000000..b2afa7528
--- /dev/null
+++ b/dom/media/directshow/DirectShowUtils.cpp
@@ -0,0 +1,369 @@
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DirectShowUtils.h"
+#include "dmodshow.h"
+#include "wmcodecdsp.h"
+#include "dmoreg.h"
+#include "mozilla/ArrayUtils.h"
+#include "mozilla/RefPtr.h"
+#include "nsPrintfCString.h"
+
+#define WARN(...) NS_WARNING(nsPrintfCString(__VA_ARGS__).get())
+
+namespace mozilla {
+
+// Create a table which maps GUIDs to a string representation of the GUID.
+// This is useful for debugging purposes, for logging the GUIDs of media types.
+// This is only available when logging is enabled, i.e. not in release builds.
+struct GuidToName {
+ const char* name;
+ const GUID guid;
+};
+
+#pragma push_macro("OUR_GUID_ENTRY")
+#undef OUR_GUID_ENTRY
+#define OUR_GUID_ENTRY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+ { #name, {l, w1, w2, {b1, b2, b3, b4, b5, b6, b7, b8}} },
+
+static const GuidToName GuidToNameTable[] = {
+#include <uuids.h>
+};
+
+#pragma pop_macro("OUR_GUID_ENTRY")
+
+const char*
+GetDirectShowGuidName(const GUID& aGuid)
+{
+ const size_t len = ArrayLength(GuidToNameTable);
+ for (unsigned i = 0; i < len; i++) {
+ if (IsEqualGUID(aGuid, GuidToNameTable[i].guid)) {
+ return GuidToNameTable[i].name;
+ }
+ }
+ return "Unknown";
+}
+
+void
+RemoveGraphFromRunningObjectTable(DWORD aRotRegister)
+{
+ RefPtr<IRunningObjectTable> runningObjectTable;
+ if (SUCCEEDED(GetRunningObjectTable(0, getter_AddRefs(runningObjectTable)))) {
+ runningObjectTable->Revoke(aRotRegister);
+ }
+}
+
+HRESULT
+AddGraphToRunningObjectTable(IUnknown *aUnkGraph, DWORD *aOutRotRegister)
+{
+ HRESULT hr;
+
+ RefPtr<IMoniker> moniker;
+ RefPtr<IRunningObjectTable> runningObjectTable;
+
+ hr = GetRunningObjectTable(0, getter_AddRefs(runningObjectTable));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ const size_t STRING_LENGTH = 256;
+ WCHAR wsz[STRING_LENGTH];
+
+ StringCchPrintfW(wsz,
+ STRING_LENGTH,
+ L"FilterGraph %08x pid %08x",
+ (DWORD_PTR)aUnkGraph,
+ GetCurrentProcessId());
+
+ hr = CreateItemMoniker(L"!", wsz, getter_AddRefs(moniker));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = runningObjectTable->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,
+ aUnkGraph,
+ moniker,
+ aOutRotRegister);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return S_OK;
+}
+
+const char*
+GetGraphNotifyString(long evCode)
+{
+#define CASE(x) case x: return #x
+ switch(evCode) {
+ CASE(EC_ACTIVATE); // A video window is being activated or deactivated.
+ CASE(EC_BANDWIDTHCHANGE); // Not supported.
+ CASE(EC_BUFFERING_DATA); // The graph is buffering data, or has stopped buffering data.
+ CASE(EC_BUILT); // Send by the Video Control when a graph has been built. Not forwarded to applications.
+ CASE(EC_CLOCK_CHANGED); // The reference clock has changed.
+ CASE(EC_CLOCK_UNSET); // The clock provider was disconnected.
+ CASE(EC_CODECAPI_EVENT); // Sent by an encoder to signal an encoding event.
+ CASE(EC_COMPLETE); // All data from a particular stream has been rendered.
+ CASE(EC_CONTENTPROPERTY_CHANGED); // Not supported.
+ CASE(EC_DEVICE_LOST); // A Plug and Play device was removed or has become available again.
+ CASE(EC_DISPLAY_CHANGED); // The display mode has changed.
+ CASE(EC_END_OF_SEGMENT); // The end of a segment has been reached.
+ CASE(EC_EOS_SOON); // Not supported.
+ CASE(EC_ERROR_STILLPLAYING); // An asynchronous command to run the graph has failed.
+ CASE(EC_ERRORABORT); // An operation was aborted because of an error.
+ CASE(EC_ERRORABORTEX); // An operation was aborted because of an error.
+ CASE(EC_EXTDEVICE_MODE_CHANGE); // Not supported.
+ CASE(EC_FILE_CLOSED); // The source file was closed because of an unexpected event.
+ CASE(EC_FULLSCREEN_LOST); // The video renderer is switching out of full-screen mode.
+ CASE(EC_GRAPH_CHANGED); // The filter graph has changed.
+ CASE(EC_LENGTH_CHANGED); // The length of a source has changed.
+ CASE(EC_LOADSTATUS); // Notifies the application of progress when opening a network file.
+ CASE(EC_MARKER_HIT); // Not supported.
+ CASE(EC_NEED_RESTART); // A filter is requesting that the graph be restarted.
+ CASE(EC_NEW_PIN); // Not supported.
+ CASE(EC_NOTIFY_WINDOW); // Notifies a filter of the video renderer's window.
+ CASE(EC_OLE_EVENT); // A filter is passing a text string to the application.
+ CASE(EC_OPENING_FILE); // The graph is opening a file, or has finished opening a file.
+ CASE(EC_PALETTE_CHANGED); // The video palette has changed.
+ CASE(EC_PAUSED); // A pause request has completed.
+ CASE(EC_PLEASE_REOPEN); // The source file has changed.
+ CASE(EC_PREPROCESS_COMPLETE); // Sent by the WM ASF Writer filter when it completes the pre-processing for multipass encoding.
+ CASE(EC_PROCESSING_LATENCY); // Indicates the amount of time that a component is taking to process each sample.
+ CASE(EC_QUALITY_CHANGE); // The graph is dropping samples, for quality control.
+ //CASE(EC_RENDER_FINISHED); // Not supported.
+ CASE(EC_REPAINT); // A video renderer requires a repaint.
+ CASE(EC_SAMPLE_LATENCY); // Specifies how far behind schedule a component is for processing samples.
+ //CASE(EC_SAMPLE_NEEDED); // Requests a new input sample from the Enhanced Video Renderer (EVR) filter.
+ CASE(EC_SCRUB_TIME); // Specifies the time stamp for the most recent frame step.
+ CASE(EC_SEGMENT_STARTED); // A new segment has started.
+ CASE(EC_SHUTTING_DOWN); // The filter graph is shutting down, prior to being destroyed.
+ CASE(EC_SNDDEV_IN_ERROR); // A device error has occurred in an audio capture filter.
+ CASE(EC_SNDDEV_OUT_ERROR); // A device error has occurred in an audio renderer filter.
+ CASE(EC_STARVATION); // A filter is not receiving enough data.
+ CASE(EC_STATE_CHANGE); // The filter graph has changed state.
+ CASE(EC_STATUS); // Contains two arbitrary status strings.
+ CASE(EC_STEP_COMPLETE); // A filter performing frame stepping has stepped the specified number of frames.
+ CASE(EC_STREAM_CONTROL_STARTED); // A stream-control start command has taken effect.
+ CASE(EC_STREAM_CONTROL_STOPPED); // A stream-control stop command has taken effect.
+ CASE(EC_STREAM_ERROR_STILLPLAYING); // An error has occurred in a stream. The stream is still playing.
+ CASE(EC_STREAM_ERROR_STOPPED); // A stream has stopped because of an error.
+ CASE(EC_TIMECODE_AVAILABLE); // Not supported.
+ CASE(EC_UNBUILT); // Send by the Video Control when a graph has been torn down. Not forwarded to applications.
+ CASE(EC_USERABORT); // The user has terminated playback.
+ CASE(EC_VIDEO_SIZE_CHANGED); // The native video size has changed.
+ CASE(EC_VIDEOFRAMEREADY); // A video frame is ready for display.
+ CASE(EC_VMR_RECONNECTION_FAILED); // Sent by the VMR-7 and the VMR-9 when it was unable to accept a dynamic format change request from the upstream decoder.
+ CASE(EC_VMR_RENDERDEVICE_SET); // Sent when the VMR has selected its rendering mechanism.
+ CASE(EC_VMR_SURFACE_FLIPPED); // Sent when the VMR-7's allocator presenter has called the DirectDraw Flip method on the surface being presented.
+ CASE(EC_WINDOW_DESTROYED); // The video renderer was destroyed or removed from the graph.
+ CASE(EC_WMT_EVENT); // Sent by the WM ASF Reader filter when it reads ASF files protected by digital rights management (DRM).
+ CASE(EC_WMT_INDEX_EVENT); // Sent when an application uses the WM ASF Writer to index Windows Media Video files.
+ CASE(S_OK); // Success.
+ CASE(VFW_S_AUDIO_NOT_RENDERED); // Partial success; the audio was not rendered.
+ CASE(VFW_S_DUPLICATE_NAME); // Success; the Filter Graph Manager modified a filter name to avoid duplication.
+ CASE(VFW_S_PARTIAL_RENDER); // Partial success; some of the streams in this movie are in an unsupported format.
+ CASE(VFW_S_VIDEO_NOT_RENDERED); // Partial success; the video was not rendered.
+ CASE(E_ABORT); // Operation aborted.
+ CASE(E_OUTOFMEMORY); // Insufficient memory.
+ CASE(E_POINTER); // Null pointer argument.
+ CASE(VFW_E_CANNOT_CONNECT); // No combination of intermediate filters could be found to make the connection.
+ CASE(VFW_E_CANNOT_RENDER); // No combination of filters could be found to render the stream.
+ CASE(VFW_E_NO_ACCEPTABLE_TYPES); // There is no common media type between these pins.
+ CASE(VFW_E_NOT_IN_GRAPH);
+
+ default:
+ return "Unknown Code";
+ };
+#undef CASE
+}
+
+HRESULT
+CreateAndAddFilter(IGraphBuilder* aGraph,
+ REFGUID aFilterClsId,
+ LPCWSTR aFilterName,
+ IBaseFilter **aOutFilter)
+{
+ NS_ENSURE_TRUE(aGraph, E_POINTER);
+ NS_ENSURE_TRUE(aOutFilter, E_POINTER);
+ HRESULT hr;
+
+ RefPtr<IBaseFilter> filter;
+ hr = CoCreateInstance(aFilterClsId,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IBaseFilter,
+ getter_AddRefs(filter));
+ if (FAILED(hr)) {
+ // Object probably not available on this system.
+ WARN("CoCreateInstance failed, hr=%x", hr);
+ return hr;
+ }
+
+ hr = aGraph->AddFilter(filter, aFilterName);
+ if (FAILED(hr)) {
+ WARN("AddFilter failed, hr=%x", hr);
+ return hr;
+ }
+
+ filter.forget(aOutFilter);
+
+ return S_OK;
+}
+
+HRESULT
+CreateMP3DMOWrapperFilter(IBaseFilter **aOutFilter)
+{
+ NS_ENSURE_TRUE(aOutFilter, E_POINTER);
+ HRESULT hr;
+
+ // Create the wrapper filter.
+ RefPtr<IBaseFilter> filter;
+ hr = CoCreateInstance(CLSID_DMOWrapperFilter,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IBaseFilter,
+ getter_AddRefs(filter));
+ if (FAILED(hr)) {
+ WARN("CoCreateInstance failed, hr=%x", hr);
+ return hr;
+ }
+
+ // Query for IDMOWrapperFilter.
+ RefPtr<IDMOWrapperFilter> dmoWrapper;
+ hr = filter->QueryInterface(IID_IDMOWrapperFilter,
+ getter_AddRefs(dmoWrapper));
+ if (FAILED(hr)) {
+ WARN("QueryInterface failed, hr=%x", hr);
+ return hr;
+ }
+
+ hr = dmoWrapper->Init(CLSID_CMP3DecMediaObject, DMOCATEGORY_AUDIO_DECODER);
+ if (FAILED(hr)) {
+ // Can't instantiate MP3 DMO. It doesn't exist on Windows XP, we're
+ // probably hitting that. Don't log warning to console, this is an
+ // expected error.
+ WARN("dmoWrapper Init failed, hr=%x", hr);
+ return hr;
+ }
+
+ filter.forget(aOutFilter);
+
+ return S_OK;
+}
+
+HRESULT
+AddMP3DMOWrapperFilter(IGraphBuilder* aGraph,
+ IBaseFilter **aOutFilter)
+{
+ NS_ENSURE_TRUE(aGraph, E_POINTER);
+ NS_ENSURE_TRUE(aOutFilter, E_POINTER);
+ HRESULT hr;
+
+ // Create the wrapper filter.
+ RefPtr<IBaseFilter> filter;
+ hr = CreateMP3DMOWrapperFilter(getter_AddRefs(filter));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // Add the wrapper filter to graph.
+ hr = aGraph->AddFilter(filter, L"MP3 Decoder DMO");
+ if (FAILED(hr)) {
+ WARN("AddFilter failed, hr=%x", hr);
+ return hr;
+ }
+
+ filter.forget(aOutFilter);
+
+ return S_OK;
+}
+
+bool
+CanDecodeMP3UsingDirectShow()
+{
+ RefPtr<IBaseFilter> filter;
+
+ // Can we create the MP3 demuxer filter?
+ if (FAILED(CoCreateInstance(CLSID_MPEG1Splitter,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IBaseFilter,
+ getter_AddRefs(filter)))) {
+ return false;
+ }
+
+ // Can we create either the WinXP MP3 decoder filter or the MP3 DMO decoder?
+ if (FAILED(CoCreateInstance(DirectShowReader::CLSID_MPEG_LAYER_3_DECODER_FILTER,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IBaseFilter,
+ getter_AddRefs(filter))) &&
+ FAILED(CreateMP3DMOWrapperFilter(getter_AddRefs(filter)))) {
+ return false;
+ }
+
+ // Else, we can create all of the components we need. Assume
+ // DirectShow is going to work...
+ return true;
+}
+
+// Match a pin by pin direction and connection state.
+HRESULT
+MatchUnconnectedPin(IPin* aPin,
+ PIN_DIRECTION aPinDir,
+ bool *aOutMatches)
+{
+ NS_ENSURE_TRUE(aPin, E_POINTER);
+ NS_ENSURE_TRUE(aOutMatches, E_POINTER);
+
+ // Ensure the pin is unconnected.
+ RefPtr<IPin> peer;
+ HRESULT hr = aPin->ConnectedTo(getter_AddRefs(peer));
+ if (hr != VFW_E_NOT_CONNECTED) {
+ *aOutMatches = false;
+ return hr;
+ }
+
+ // Ensure the pin is of the specified direction.
+ PIN_DIRECTION pinDir;
+ hr = aPin->QueryDirection(&pinDir);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ *aOutMatches = (pinDir == aPinDir);
+ return S_OK;
+}
+
+// Return the first unconnected input pin or output pin.
+already_AddRefed<IPin>
+GetUnconnectedPin(IBaseFilter* aFilter, PIN_DIRECTION aPinDir)
+{
+ RefPtr<IEnumPins> enumPins;
+
+ HRESULT hr = aFilter->EnumPins(getter_AddRefs(enumPins));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
+
+ // Test each pin to see if it matches the direction we're looking for.
+ RefPtr<IPin> pin;
+ while (S_OK == enumPins->Next(1, getter_AddRefs(pin), nullptr)) {
+ bool matches = FALSE;
+ if (SUCCEEDED(MatchUnconnectedPin(pin, aPinDir, &matches)) &&
+ matches) {
+ return pin.forget();
+ }
+ }
+
+ return nullptr;
+}
+
+HRESULT
+ConnectFilters(IGraphBuilder* aGraph,
+ IBaseFilter* aOutputFilter,
+ IBaseFilter* aInputFilter)
+{
+ RefPtr<IPin> output = GetUnconnectedPin(aOutputFilter, PINDIR_OUTPUT);
+ NS_ENSURE_TRUE(output, E_FAIL);
+
+ RefPtr<IPin> input = GetUnconnectedPin(aInputFilter, PINDIR_INPUT);
+ NS_ENSURE_TRUE(output, E_FAIL);
+
+ return aGraph->Connect(output, input);
+}
+
+} // namespace mozilla
+
+// avoid redefined macro in unified build
+#undef WARN
diff --git a/dom/media/directshow/DirectShowUtils.h b/dom/media/directshow/DirectShowUtils.h
new file mode 100644
index 000000000..3bbc122fc
--- /dev/null
+++ b/dom/media/directshow/DirectShowUtils.h
@@ -0,0 +1,125 @@
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _DirectShowUtils_h_
+#define _DirectShowUtils_h_
+
+#include <stdint.h>
+#include "dshow.h"
+
+// XXXbz windowsx.h defines GetFirstChild, GetNextSibling,
+// GetPrevSibling are macros, apparently... Eeevil. We have functions
+// called that on some classes, so undef them.
+#undef GetFirstChild
+#undef GetNextSibling
+#undef GetPrevSibling
+
+#include "DShowTools.h"
+#include "mozilla/Logging.h"
+
+namespace mozilla {
+
+// Win32 "Event" wrapper. Must be paired with a CriticalSection to create a
+// Java-style "monitor".
+class Signal {
+public:
+
+ Signal(CriticalSection* aLock)
+ : mLock(aLock)
+ {
+ CriticalSectionAutoEnter lock(*mLock);
+ mEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
+ }
+
+ ~Signal() {
+ CriticalSectionAutoEnter lock(*mLock);
+ CloseHandle(mEvent);
+ }
+
+ // Lock must be held.
+ void Notify() {
+ SetEvent(mEvent);
+ }
+
+ // Lock must be held. Check the wait condition before waiting!
+ HRESULT Wait() {
+ mLock->Leave();
+ DWORD result = WaitForSingleObject(mEvent, INFINITE);
+ mLock->Enter();
+ return result == WAIT_OBJECT_0 ? S_OK : E_FAIL;
+ }
+
+private:
+ CriticalSection* mLock;
+ HANDLE mEvent;
+};
+
+HRESULT
+AddGraphToRunningObjectTable(IUnknown *aUnkGraph, DWORD *aOutRotRegister);
+
+void
+RemoveGraphFromRunningObjectTable(DWORD aRotRegister);
+
+const char*
+GetGraphNotifyString(long evCode);
+
+// Creates a filter and adds it to a graph.
+HRESULT
+CreateAndAddFilter(IGraphBuilder* aGraph,
+ REFGUID aFilterClsId,
+ LPCWSTR aFilterName,
+ IBaseFilter **aOutFilter);
+
+HRESULT
+AddMP3DMOWrapperFilter(IGraphBuilder* aGraph,
+ IBaseFilter **aOutFilter);
+
+// Connects the output pin on aOutputFilter to an input pin on
+// aInputFilter, in aGraph.
+HRESULT
+ConnectFilters(IGraphBuilder* aGraph,
+ IBaseFilter* aOutputFilter,
+ IBaseFilter* aInputFilter);
+
+HRESULT
+MatchUnconnectedPin(IPin* aPin,
+ PIN_DIRECTION aPinDir,
+ bool *aOutMatches);
+
+// Converts from microseconds to DirectShow "Reference Time"
+// (hundreds of nanoseconds).
+inline int64_t
+UsecsToRefTime(const int64_t aUsecs)
+{
+ return aUsecs * 10;
+}
+
+// Converts from DirectShow "Reference Time" (hundreds of nanoseconds)
+// to microseconds.
+inline int64_t
+RefTimeToUsecs(const int64_t hRefTime)
+{
+ return hRefTime / 10;
+}
+
+// Converts from DirectShow "Reference Time" (hundreds of nanoseconds)
+// to seconds.
+inline double
+RefTimeToSeconds(const REFERENCE_TIME aRefTime)
+{
+ return double(aRefTime) / 10000000;
+}
+
+const char*
+GetDirectShowGuidName(const GUID& aGuid);
+
+// Returns true if we can instantiate an MP3 demuxer and decoder filters.
+// Use this to detect whether MP3 support is installed.
+bool
+CanDecodeMP3UsingDirectShow();
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/directshow/SampleSink.cpp b/dom/media/directshow/SampleSink.cpp
new file mode 100644
index 000000000..fa5dc8d19
--- /dev/null
+++ b/dom/media/directshow/SampleSink.cpp
@@ -0,0 +1,159 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SampleSink.h"
+#include "AudioSinkFilter.h"
+#include "AudioSinkInputPin.h"
+#include "VideoUtils.h"
+#include "mozilla/Logging.h"
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+static LazyLogModule gDirectShowLog("DirectShowDecoder");
+#define LOG(...) MOZ_LOG(gDirectShowLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+SampleSink::SampleSink()
+ : mMonitor("SampleSink"),
+ mIsFlushing(false),
+ mAtEOS(false)
+{
+ MOZ_COUNT_CTOR(SampleSink);
+}
+
+SampleSink::~SampleSink()
+{
+ MOZ_COUNT_DTOR(SampleSink);
+}
+
+void
+SampleSink::SetAudioFormat(const WAVEFORMATEX* aInFormat)
+{
+ NS_ENSURE_TRUE(aInFormat, );
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ memcpy(&mAudioFormat, aInFormat, sizeof(WAVEFORMATEX));
+}
+
+void
+SampleSink::GetAudioFormat(WAVEFORMATEX* aOutFormat)
+{
+ MOZ_ASSERT(aOutFormat);
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ memcpy(aOutFormat, &mAudioFormat, sizeof(WAVEFORMATEX));
+}
+
+HRESULT
+SampleSink::Receive(IMediaSample* aSample)
+{
+ ReentrantMonitorAutoEnter mon(mMonitor);
+
+ while (true) {
+ if (mIsFlushing) {
+ return S_FALSE;
+ }
+ if (!mSample) {
+ break;
+ }
+ if (mAtEOS) {
+ return E_UNEXPECTED;
+ }
+ // Wait until the consumer thread consumes the sample.
+ mon.Wait();
+ }
+
+ if (MOZ_LOG_TEST(gDirectShowLog, LogLevel::Debug)) {
+ REFERENCE_TIME start = 0, end = 0;
+ HRESULT hr = aSample->GetMediaTime(&start, &end);
+ LOG("SampleSink::Receive() [%4.2lf-%4.2lf]",
+ (double)RefTimeToUsecs(start) / USECS_PER_S,
+ (double)RefTimeToUsecs(end) / USECS_PER_S);
+ }
+
+ mSample = aSample;
+ // Notify the signal, to awaken the consumer thread in WaitForSample()
+ // if necessary.
+ mon.NotifyAll();
+ return S_OK;
+}
+
+HRESULT
+SampleSink::Extract(RefPtr<IMediaSample>& aOutSample)
+{
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ // Loop until we have a sample, or we should abort.
+ while (true) {
+ if (mIsFlushing) {
+ return S_FALSE;
+ }
+ if (mSample) {
+ break;
+ }
+ if (mAtEOS) {
+ // Order is important here, if we have a sample, we should return it
+ // before reporting EOS.
+ return E_UNEXPECTED;
+ }
+ // Wait until the producer thread gives us a sample.
+ mon.Wait();
+ }
+ aOutSample = mSample;
+
+ if (MOZ_LOG_TEST(gDirectShowLog, LogLevel::Debug)) {
+ int64_t start = 0, end = 0;
+ mSample->GetMediaTime(&start, &end);
+ LOG("SampleSink::Extract() [%4.2lf-%4.2lf]",
+ (double)RefTimeToUsecs(start) / USECS_PER_S,
+ (double)RefTimeToUsecs(end) / USECS_PER_S);
+ }
+
+ mSample = nullptr;
+ // Notify the signal, to awaken the producer thread in Receive()
+ // if necessary.
+ mon.NotifyAll();
+ return S_OK;
+}
+
+void
+SampleSink::Flush()
+{
+ LOG("SampleSink::Flush()");
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ mIsFlushing = true;
+ mSample = nullptr;
+ mon.NotifyAll();
+}
+
+void
+SampleSink::Reset()
+{
+ LOG("SampleSink::Reset()");
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ mIsFlushing = false;
+ mAtEOS = false;
+}
+
+void
+SampleSink::SetEOS()
+{
+ LOG("SampleSink::SetEOS()");
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ mAtEOS = true;
+ // Notify to unblock any threads waiting for samples in
+ // Extract() or Receive(). Now that we're at EOS, no more samples
+ // will come!
+ mon.NotifyAll();
+}
+
+bool
+SampleSink::AtEOS()
+{
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ return mAtEOS && !mSample;
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/directshow/SampleSink.h b/dom/media/directshow/SampleSink.h
new file mode 100644
index 000000000..6a1af9fee
--- /dev/null
+++ b/dom/media/directshow/SampleSink.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(SampleSink_h_)
+#define SampleSink_h_
+
+#include "BaseFilter.h"
+#include "DirectShowUtils.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/ReentrantMonitor.h"
+
+namespace mozilla {
+
+class SampleSink {
+public:
+ SampleSink();
+ virtual ~SampleSink();
+
+ // Sets the audio format of the incoming samples. The upstream filter
+ // calls this. This makes a copy.
+ void SetAudioFormat(const WAVEFORMATEX* aInFormat);
+
+ // Copies the format of incoming audio samples into into *aOutFormat.
+ void GetAudioFormat(WAVEFORMATEX* aOutFormat);
+
+ // Called when a sample is delivered by the DirectShow graph to the sink.
+ // The decode thread retrieves the sample by calling WaitForSample().
+ // Blocks if there's already a sample waiting to be consumed by the decode
+ // thread.
+ HRESULT Receive(IMediaSample* aSample);
+
+ // Retrieves a sample from the sample queue, blocking until one becomes
+ // available, or until an error occurs. Returns S_FALSE on EOS.
+ HRESULT Extract(RefPtr<IMediaSample>& aOutSample);
+
+ // Unblocks any threads waiting in GetSample().
+ // Clears mSample, which unblocks upstream stream.
+ void Flush();
+
+ // Opens up the sink to receive more samples in PutSample().
+ // Clears EOS flag.
+ void Reset();
+
+ // Marks that we've reacehd the end of stream.
+ void SetEOS();
+
+ // Returns whether we're at end of stream.
+ bool AtEOS();
+
+private:
+ // All data in this class is syncronized by mMonitor.
+ ReentrantMonitor mMonitor;
+ RefPtr<IMediaSample> mSample;
+
+ // Format of the audio stream we're receiving.
+ WAVEFORMATEX mAudioFormat;
+
+ bool mIsFlushing;
+ bool mAtEOS;
+};
+
+} // namespace mozilla
+
+#endif // SampleSink_h_
diff --git a/dom/media/directshow/SourceFilter.cpp b/dom/media/directshow/SourceFilter.cpp
new file mode 100644
index 000000000..4c5a0882c
--- /dev/null
+++ b/dom/media/directshow/SourceFilter.cpp
@@ -0,0 +1,683 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SourceFilter.h"
+#include "MediaResource.h"
+#include "mozilla/RefPtr.h"
+#include "DirectShowUtils.h"
+#include "MP3FrameParser.h"
+#include "mozilla/Logging.h"
+#include <algorithm>
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+// Define to trace what's on...
+//#define DEBUG_SOURCE_TRACE 1
+
+#if defined (DEBUG_SOURCE_TRACE)
+static LazyLogModule gDirectShowLog("DirectShowDecoder");
+#define DIRECTSHOW_LOG(...) MOZ_LOG(gDirectShowLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+#else
+#define DIRECTSHOW_LOG(...)
+#endif
+
+static HRESULT
+DoGetInterface(IUnknown* aUnknown, void** aInterface)
+{
+ if (!aInterface)
+ return E_POINTER;
+ *aInterface = aUnknown;
+ aUnknown->AddRef();
+ return S_OK;
+}
+
+// Stores details of IAsyncReader::Request().
+class ReadRequest {
+public:
+
+ ReadRequest(IMediaSample* aSample,
+ DWORD_PTR aDwUser,
+ uint32_t aOffset,
+ uint32_t aCount)
+ : mSample(aSample),
+ mDwUser(aDwUser),
+ mOffset(aOffset),
+ mCount(aCount)
+ {
+ MOZ_COUNT_CTOR(ReadRequest);
+ }
+
+ ~ReadRequest() {
+ MOZ_COUNT_DTOR(ReadRequest);
+ }
+
+ RefPtr<IMediaSample> mSample;
+ DWORD_PTR mDwUser;
+ uint32_t mOffset;
+ uint32_t mCount;
+};
+
+// A wrapper around media resource that presents only a partition of the
+// underlying resource to the caller to use. The partition returned is from
+// an offset to the end of stream, and this object deals with ensuring
+// the offsets and lengths etc are translated from the reduced partition
+// exposed to the caller, to the absolute offsets of the underlying stream.
+class MediaResourcePartition {
+public:
+ MediaResourcePartition(MediaResource* aResource,
+ int64_t aDataStart)
+ : mResource(aResource),
+ mDataOffset(aDataStart)
+ {}
+
+ int64_t GetLength() {
+ int64_t len = mResource.GetLength();
+ if (len == -1) {
+ return len;
+ }
+ return std::max<int64_t>(0, len - mDataOffset);
+ }
+ nsresult ReadAt(int64_t aOffset, char* aBuffer,
+ uint32_t aCount, uint32_t* aBytes)
+ {
+ return mResource.ReadAt(aOffset + mDataOffset,
+ aBuffer,
+ aCount,
+ aBytes);
+ }
+ int64_t GetCachedDataEnd() {
+ int64_t tell = mResource.GetResource()->Tell();
+ int64_t dataEnd =
+ mResource.GetResource()->GetCachedDataEnd(tell) - mDataOffset;
+ return dataEnd;
+ }
+private:
+ // MediaResource from which we read data.
+ MediaResourceIndex mResource;
+ int64_t mDataOffset;
+};
+
+
+// Output pin for SourceFilter, which implements IAsyncReader, to
+// allow downstream filters to pull/read data from it. Downstream pins
+// register to read data using Request(), and asynchronously wait for the
+// reads to complete using WaitForNext(). They may also synchronously read
+// using SyncRead(). This class is a delegate (tear off) of
+// SourceFilter.
+//
+// We can expose only a segment of the MediaResource to the filter graph.
+// This is used to strip off the ID3v2 tags from the stream, as DirectShow
+// has trouble parsing some headers.
+//
+// Implements:
+// * IAsyncReader
+// * IPin
+// * IQualityControl
+// * IUnknown
+//
+class DECLSPEC_UUID("18e5cfb2-1015-440c-a65c-e63853235894")
+OutputPin : public IAsyncReader,
+ public BasePin
+{
+public:
+
+ OutputPin(MediaResource* aMediaResource,
+ SourceFilter* aParent,
+ CriticalSection& aFilterLock,
+ int64_t aMP3DataStart);
+ virtual ~OutputPin();
+
+ // IUnknown
+ // Defer to ref counting to BasePin, which defers to owning nsBaseFilter.
+ STDMETHODIMP_(ULONG) AddRef() override { return BasePin::AddRef(); }
+ STDMETHODIMP_(ULONG) Release() override { return BasePin::Release(); }
+ STDMETHODIMP QueryInterface(REFIID iid, void** ppv) override;
+
+ // BasePin Overrides.
+ // Determines if the pin accepts a specific media type.
+ HRESULT CheckMediaType(const MediaType* aMediaType) override;
+
+ // Retrieves a preferred media type, by index value.
+ HRESULT GetMediaType(int aPosition, MediaType* aMediaType) override;
+
+ // Releases the pin from a connection.
+ HRESULT BreakConnect(void) override;
+
+ // Determines whether a pin connection is suitable.
+ HRESULT CheckConnect(IPin* aPin) override;
+
+
+ // IAsyncReader overrides
+
+ // The RequestAllocator method requests an allocator during the
+ // pin connection.
+ STDMETHODIMP RequestAllocator(IMemAllocator* aPreferred,
+ ALLOCATOR_PROPERTIES* aProps,
+ IMemAllocator** aActual) override;
+
+ // The Request method queues an asynchronous request for data. Downstream
+ // will call WaitForNext() when they want to retrieve the result.
+ STDMETHODIMP Request(IMediaSample* aSample, DWORD_PTR aUserData) override;
+
+ // The WaitForNext method waits for the next pending read request
+ // to complete. This method fails if the graph is flushing.
+ // Defers to SyncRead/5.
+ STDMETHODIMP WaitForNext(DWORD aTimeout,
+ IMediaSample** aSamples,
+ DWORD_PTR* aUserData) override;
+
+ // The SyncReadAligned method performs a synchronous read. The method
+ // blocks until the request is completed. Defers to SyncRead/5. This
+ // method does not fail if the graph is flushing.
+ STDMETHODIMP SyncReadAligned(IMediaSample* aSample) override;
+
+ // The SyncRead method performs a synchronous read. The method blocks
+ // until the request is completed. Defers to SyncRead/5. This
+ // method does not fail if the graph is flushing.
+ STDMETHODIMP SyncRead(LONGLONG aPosition, LONG aLength, BYTE* aBuffer) override;
+
+ // The Length method retrieves the total length of the stream.
+ STDMETHODIMP Length(LONGLONG* aTotal, LONGLONG* aAvailable) override;
+
+ // IPin Overrides
+ STDMETHODIMP BeginFlush(void) override;
+ STDMETHODIMP EndFlush(void) override;
+
+ uint32_t GetAndResetBytesConsumedCount();
+
+private:
+
+ // Protects thread-shared data/structures (mFlushCount, mPendingReads).
+ // WaitForNext() also waits on this monitor
+ CriticalSection& mPinLock;
+
+ // Signal used with mPinLock to implement WaitForNext().
+ Signal mSignal;
+
+ // The filter that owns us. Weak reference, as we're a delegate (tear off).
+ SourceFilter* mParentSource;
+
+ MediaResourcePartition mResource;
+
+ // Counter, inc'd in BeginFlush(), dec'd in EndFlush(). Calls to this can
+ // come from multiple threads and can interleave, hence the counter.
+ int32_t mFlushCount;
+
+ // Number of bytes that have been read from the output pin since the last
+ // time GetAndResetBytesConsumedCount() was called.
+ uint32_t mBytesConsumed;
+
+ // Deque of ReadRequest* for reads that are yet to be serviced.
+ // nsReadRequest's are stored on the heap, popper must delete them.
+ nsDeque mPendingReads;
+
+ // Flags if the downstream pin has QI'd for IAsyncReader. We refuse
+ // connection if they don't query, as it means they're assuming that we're
+ // a push filter, and we're not.
+ bool mQueriedForAsyncReader;
+
+};
+
+// For mingw __uuidof support
+#ifdef __CRT_UUID_DECL
+}
+__CRT_UUID_DECL(mozilla::OutputPin, 0x18e5cfb2,0x1015,0x440c,0xa6,0x5c,0xe6,0x38,0x53,0x23,0x58,0x94);
+namespace mozilla {
+#endif
+
+OutputPin::OutputPin(MediaResource* aResource,
+ SourceFilter* aParent,
+ CriticalSection& aFilterLock,
+ int64_t aMP3DataStart)
+ : BasePin(static_cast<BaseFilter*>(aParent),
+ &aFilterLock,
+ L"MozillaOutputPin",
+ PINDIR_OUTPUT),
+ mPinLock(aFilterLock),
+ mSignal(&mPinLock),
+ mParentSource(aParent),
+ mResource(aResource, aMP3DataStart),
+ mFlushCount(0),
+ mBytesConsumed(0),
+ mQueriedForAsyncReader(false)
+{
+ MOZ_COUNT_CTOR(OutputPin);
+ DIRECTSHOW_LOG("OutputPin::OutputPin()");
+}
+
+OutputPin::~OutputPin()
+{
+ MOZ_COUNT_DTOR(OutputPin);
+ DIRECTSHOW_LOG("OutputPin::~OutputPin()");
+}
+
+HRESULT
+OutputPin::BreakConnect()
+{
+ mQueriedForAsyncReader = false;
+ return BasePin::BreakConnect();
+}
+
+STDMETHODIMP
+OutputPin::QueryInterface(REFIID aIId, void** aInterface)
+{
+ if (aIId == IID_IAsyncReader) {
+ mQueriedForAsyncReader = true;
+ return DoGetInterface(static_cast<IAsyncReader*>(this), aInterface);
+ }
+
+ if (aIId == __uuidof(OutputPin)) {
+ AddRef();
+ *aInterface = this;
+ return S_OK;
+ }
+
+ return BasePin::QueryInterface(aIId, aInterface);
+}
+
+HRESULT
+OutputPin::CheckConnect(IPin* aPin)
+{
+ // Our connection is only suitable if the downstream pin knows
+ // that we're asynchronous (i.e. it queried for IAsyncReader).
+ return mQueriedForAsyncReader ? S_OK : S_FALSE;
+}
+
+HRESULT
+OutputPin::CheckMediaType(const MediaType* aMediaType)
+{
+ const MediaType *myMediaType = mParentSource->GetMediaType();
+
+ if (IsEqualGUID(aMediaType->majortype, myMediaType->majortype) &&
+ IsEqualGUID(aMediaType->subtype, myMediaType->subtype) &&
+ IsEqualGUID(aMediaType->formattype, myMediaType->formattype))
+ {
+ DIRECTSHOW_LOG("OutputPin::CheckMediaType() Match: major=%s minor=%s TC=%d FSS=%d SS=%u",
+ GetDirectShowGuidName(aMediaType->majortype),
+ GetDirectShowGuidName(aMediaType->subtype),
+ aMediaType->TemporalCompression(),
+ aMediaType->bFixedSizeSamples,
+ aMediaType->SampleSize());
+ return S_OK;
+ }
+
+ DIRECTSHOW_LOG("OutputPin::CheckMediaType() Failed to match: major=%s minor=%s TC=%d FSS=%d SS=%u",
+ GetDirectShowGuidName(aMediaType->majortype),
+ GetDirectShowGuidName(aMediaType->subtype),
+ aMediaType->TemporalCompression(),
+ aMediaType->bFixedSizeSamples,
+ aMediaType->SampleSize());
+ return S_FALSE;
+}
+
+HRESULT
+OutputPin::GetMediaType(int aPosition, MediaType* aMediaType)
+{
+ if (!aMediaType)
+ return E_POINTER;
+
+ if (aPosition == 0) {
+ aMediaType->Assign(mParentSource->GetMediaType());
+ return S_OK;
+ }
+ return VFW_S_NO_MORE_ITEMS;
+}
+
+static inline bool
+IsPowerOf2(int32_t x) {
+ return ((-x & x) != x);
+}
+
+STDMETHODIMP
+OutputPin::RequestAllocator(IMemAllocator* aPreferred,
+ ALLOCATOR_PROPERTIES* aProps,
+ IMemAllocator** aActual)
+{
+ // Require the downstream pin to suggest what they want...
+ if (!aPreferred) return E_POINTER;
+ if (!aProps) return E_POINTER;
+ if (!aActual) return E_POINTER;
+
+ // We only care about alignment - our allocator will reject anything
+ // which isn't power-of-2 aligned, so so try a 4-byte aligned allocator.
+ ALLOCATOR_PROPERTIES props;
+ memcpy(&props, aProps, sizeof(ALLOCATOR_PROPERTIES));
+ if (aProps->cbAlign == 0 || IsPowerOf2(aProps->cbAlign)) {
+ props.cbAlign = 4;
+ }
+
+ // Limit allocator's number of buffers. We know that the media will most
+ // likely be bound by network speed, not by decoding speed. We also
+ // store the incoming data in a Gecko stream, if we don't limit buffers
+ // here we'll end up duplicating a lot of storage. We must have enough
+ // space for audio key frames to fit in the first batch of buffers however,
+ // else pausing may fail for some downstream decoders.
+ if (props.cBuffers > BaseFilter::sMaxNumBuffers) {
+ props.cBuffers = BaseFilter::sMaxNumBuffers;
+ }
+
+ // The allocator properties that are actually used. We don't store
+ // this, we need it for SetProperties() below to succeed.
+ ALLOCATOR_PROPERTIES actualProps;
+ HRESULT hr;
+
+ if (aPreferred) {
+ // Play nice and prefer the downstream pin's preferred allocator.
+ hr = aPreferred->SetProperties(&props, &actualProps);
+ if (SUCCEEDED(hr)) {
+ aPreferred->AddRef();
+ *aActual = aPreferred;
+ return S_OK;
+ }
+ }
+
+ // Else downstream hasn't requested a specific allocator, so create one...
+
+ // Just create a default allocator. It's highly unlikely that we'll use
+ // this anyway, as most parsers insist on using their own allocators.
+ RefPtr<IMemAllocator> allocator;
+ hr = CoCreateInstance(CLSID_MemoryAllocator,
+ 0,
+ CLSCTX_INPROC_SERVER,
+ IID_IMemAllocator,
+ getter_AddRefs(allocator));
+ if(FAILED(hr) || (allocator == nullptr)) {
+ NS_WARNING("Can't create our own DirectShow allocator.");
+ return hr;
+ }
+
+ // See if we can make it suitable
+ hr = allocator->SetProperties(&props, &actualProps);
+ if (SUCCEEDED(hr)) {
+ // We need to release our refcount on pAlloc, and addref
+ // it to pass a refcount to the caller - this is a net nothing.
+ allocator.forget(aActual);
+ return S_OK;
+ }
+
+ NS_WARNING("Failed to pick an allocator");
+ return hr;
+}
+
+STDMETHODIMP
+OutputPin::Request(IMediaSample* aSample, DWORD_PTR aDwUser)
+{
+ if (!aSample) return E_FAIL;
+
+ CriticalSectionAutoEnter lock(*mLock);
+ NS_ASSERTION(!mFlushCount, "Request() while flushing");
+
+ if (mFlushCount)
+ return VFW_E_WRONG_STATE;
+
+ REFERENCE_TIME refStart = 0, refEnd = 0;
+ if (FAILED(aSample->GetTime(&refStart, &refEnd))) {
+ NS_WARNING("Sample incorrectly timestamped");
+ return VFW_E_SAMPLE_TIME_NOT_SET;
+ }
+
+ // Convert reference time to bytes.
+ uint32_t start = (uint32_t)(refStart / 10000000);
+ uint32_t end = (uint32_t)(refEnd / 10000000);
+
+ uint32_t numBytes = end - start;
+
+ ReadRequest* request = new ReadRequest(aSample,
+ aDwUser,
+ start,
+ numBytes);
+ // Memory for |request| is free when it's popped from the completed
+ // reads list.
+
+ // Push this onto the queue of reads to be serviced.
+ mPendingReads.Push(request);
+
+ // Notify any threads blocked in WaitForNext() which are waiting for mPendingReads
+ // to become non-empty.
+ mSignal.Notify();
+
+ return S_OK;
+}
+
+STDMETHODIMP
+OutputPin::WaitForNext(DWORD aTimeout,
+ IMediaSample** aOutSample,
+ DWORD_PTR* aOutDwUser)
+{
+ NS_ASSERTION(aTimeout == 0 || aTimeout == INFINITE,
+ "Oops, we don't handle this!");
+
+ *aOutSample = nullptr;
+ *aOutDwUser = 0;
+
+ LONGLONG offset = 0;
+ LONG count = 0;
+ BYTE* buf = nullptr;
+
+ {
+ CriticalSectionAutoEnter lock(*mLock);
+
+ // Wait until there's a pending read to service.
+ while (aTimeout && mPendingReads.GetSize() == 0 && !mFlushCount) {
+ // Note: No need to guard against shutdown-during-wait here, as
+ // typically the thread doing the pull will have already called
+ // Request(), so we won't Wait() here anyway. SyncRead() will fail
+ // on shutdown.
+ mSignal.Wait();
+ }
+
+ nsAutoPtr<ReadRequest> request(reinterpret_cast<ReadRequest*>(mPendingReads.PopFront()));
+ if (!request)
+ return VFW_E_WRONG_STATE;
+
+ *aOutSample = request->mSample;
+ *aOutDwUser = request->mDwUser;
+
+ offset = request->mOffset;
+ count = request->mCount;
+ buf = nullptr;
+ request->mSample->GetPointer(&buf);
+ NS_ASSERTION(buf != nullptr, "Invalid buffer!");
+
+ if (mFlushCount) {
+ return VFW_E_TIMEOUT;
+ }
+ }
+
+ return SyncRead(offset, count, buf);
+}
+
+STDMETHODIMP
+OutputPin::SyncReadAligned(IMediaSample* aSample)
+{
+ {
+ // Ignore reads while flushing.
+ CriticalSectionAutoEnter lock(*mLock);
+ if (mFlushCount) {
+ return S_FALSE;
+ }
+ }
+
+ if (!aSample)
+ return E_FAIL;
+
+ REFERENCE_TIME lStart = 0, lEnd = 0;
+ if (FAILED(aSample->GetTime(&lStart, &lEnd))) {
+ NS_WARNING("Sample incorrectly timestamped");
+ return VFW_E_SAMPLE_TIME_NOT_SET;
+ }
+
+ // Convert reference time to bytes.
+ int32_t start = (int32_t)(lStart / 10000000);
+ int32_t end = (int32_t)(lEnd / 10000000);
+
+ int32_t numBytes = end - start;
+
+ // If the range extends off the end of stream, truncate to the end of stream
+ // as per IAsyncReader specificiation.
+ int64_t streamLength = mResource.GetLength();
+ if (streamLength != -1) {
+ // We know the exact length of the stream, fail if the requested offset
+ // is beyond it.
+ if (start > streamLength) {
+ return VFW_E_BADALIGN;
+ }
+
+ // If the end of the chunk to read is off the end of the stream,
+ // truncate it to the end of the stream.
+ if ((start + numBytes) > streamLength) {
+ numBytes = (uint32_t)(streamLength - start);
+ }
+ }
+
+ BYTE* buf=0;
+ aSample->GetPointer(&buf);
+
+ return SyncRead(start, numBytes, buf);
+}
+
+STDMETHODIMP
+OutputPin::SyncRead(LONGLONG aPosition,
+ LONG aLength,
+ BYTE* aBuffer)
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ NS_ENSURE_TRUE(aPosition >= 0, E_FAIL);
+ NS_ENSURE_TRUE(aLength > 0, E_FAIL);
+ NS_ENSURE_TRUE(aBuffer, E_POINTER);
+
+ DIRECTSHOW_LOG("OutputPin::SyncRead(%lld, %d)", aPosition, aLength);
+ {
+ // Ignore reads while flushing.
+ CriticalSectionAutoEnter lock(*mLock);
+ if (mFlushCount) {
+ return S_FALSE;
+ }
+ }
+
+ uint32_t totalBytesRead = 0;
+ nsresult rv = mResource.ReadAt(aPosition,
+ reinterpret_cast<char*>(aBuffer),
+ aLength,
+ &totalBytesRead);
+ if (NS_FAILED(rv)) {
+ return E_FAIL;
+ }
+ if (totalBytesRead > 0) {
+ CriticalSectionAutoEnter lock(*mLock);
+ mBytesConsumed += totalBytesRead;
+ }
+ return (totalBytesRead == aLength) ? S_OK : S_FALSE;
+}
+
+STDMETHODIMP
+OutputPin::Length(LONGLONG* aTotal, LONGLONG* aAvailable)
+{
+ HRESULT hr = S_OK;
+ int64_t length = mResource.GetLength();
+ if (length == -1) {
+ hr = VFW_S_ESTIMATED;
+ // Don't have a length. Just lie, it seems to work...
+ *aTotal = INT32_MAX;
+ } else {
+ *aTotal = length;
+ }
+ if (aAvailable) {
+ *aAvailable = mResource.GetCachedDataEnd();
+ }
+
+ DIRECTSHOW_LOG("OutputPin::Length() len=%lld avail=%lld", *aTotal, *aAvailable);
+
+ return hr;
+}
+
+STDMETHODIMP
+OutputPin::BeginFlush()
+{
+ CriticalSectionAutoEnter lock(*mLock);
+ mFlushCount++;
+ mSignal.Notify();
+ return S_OK;
+}
+
+STDMETHODIMP
+OutputPin::EndFlush(void)
+{
+ CriticalSectionAutoEnter lock(*mLock);
+ mFlushCount--;
+ return S_OK;
+}
+
+uint32_t
+OutputPin::GetAndResetBytesConsumedCount()
+{
+ CriticalSectionAutoEnter lock(*mLock);
+ uint32_t bytesConsumed = mBytesConsumed;
+ mBytesConsumed = 0;
+ return bytesConsumed;
+}
+
+SourceFilter::SourceFilter(const GUID& aMajorType,
+ const GUID& aSubType)
+ : BaseFilter(L"MozillaDirectShowSource", __uuidof(SourceFilter))
+{
+ MOZ_COUNT_CTOR(SourceFilter);
+ mMediaType.majortype = aMajorType;
+ mMediaType.subtype = aSubType;
+
+ DIRECTSHOW_LOG("SourceFilter Constructor(%s, %s)",
+ GetDirectShowGuidName(aMajorType),
+ GetDirectShowGuidName(aSubType));
+}
+
+SourceFilter::~SourceFilter()
+{
+ MOZ_COUNT_DTOR(SourceFilter);
+ DIRECTSHOW_LOG("SourceFilter Destructor()");
+}
+
+BasePin*
+SourceFilter::GetPin(int n)
+{
+ if (n == 0) {
+ NS_ASSERTION(mOutputPin != 0, "GetPin with no pin!");
+ return static_cast<BasePin*>(mOutputPin);
+ } else {
+ return nullptr;
+ }
+}
+
+// Get's the media type we're supplying.
+const MediaType*
+SourceFilter::GetMediaType() const
+{
+ return &mMediaType;
+}
+
+nsresult
+SourceFilter::Init(MediaResource* aResource, int64_t aMP3Offset)
+{
+ DIRECTSHOW_LOG("SourceFilter::Init()");
+
+ mOutputPin = new OutputPin(aResource,
+ this,
+ mLock,
+ aMP3Offset);
+ NS_ENSURE_TRUE(mOutputPin != nullptr, NS_ERROR_FAILURE);
+
+ return NS_OK;
+}
+
+uint32_t
+SourceFilter::GetAndResetBytesConsumedCount()
+{
+ return mOutputPin->GetAndResetBytesConsumedCount();
+}
+
+
+} // namespace mozilla
diff --git a/dom/media/directshow/SourceFilter.h b/dom/media/directshow/SourceFilter.h
new file mode 100644
index 000000000..d5ce2770e
--- /dev/null
+++ b/dom/media/directshow/SourceFilter.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(nsDirectShowSource_h___)
+#define nsDirectShowSource_h___
+
+#include "BaseFilter.h"
+#include "BasePin.h"
+#include "MediaType.h"
+
+#include "nsDeque.h"
+#include "nsAutoPtr.h"
+#include "DirectShowUtils.h"
+#include "mozilla/RefPtr.h"
+
+namespace mozilla {
+
+class MediaResource;
+class OutputPin;
+
+
+// SourceFilter is an asynchronous DirectShow source filter which
+// reads from an MediaResource, and supplies data via a pull model downstream
+// using OutputPin. It us used to supply a generic byte stream into
+// DirectShow.
+//
+// Implements:
+// * IBaseFilter
+// * IMediaFilter
+// * IPersist
+// * IUnknown
+//
+class DECLSPEC_UUID("5c2a7ad0-ba82-4659-9178-c4719a2765d6")
+SourceFilter : public media::BaseFilter
+{
+public:
+
+ // Constructs source filter to deliver given media type.
+ SourceFilter(const GUID& aMajorType, const GUID& aSubType);
+ ~SourceFilter();
+
+ nsresult Init(MediaResource *aResource, int64_t aMP3Offset);
+
+ // BaseFilter overrides.
+ // Only one output - the byte stream.
+ int GetPinCount() override { return 1; }
+
+ media::BasePin* GetPin(int n) override;
+
+ // Get's the media type we're supplying.
+ const media::MediaType* GetMediaType() const;
+
+ uint32_t GetAndResetBytesConsumedCount();
+
+protected:
+
+ // Our async pull output pin.
+ nsAutoPtr<OutputPin> mOutputPin;
+
+ // Type of byte stream we output.
+ media::MediaType mMediaType;
+
+};
+
+} // namespace mozilla
+
+// For mingw __uuidof support
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(mozilla::SourceFilter, 0x5c2a7ad0,0xba82,0x4659,0x91,0x78,0xc4,0x71,0x9a,0x27,0x65,0xd6);
+#endif
+
+#endif
diff --git a/dom/media/directshow/moz.build b/dom/media/directshow/moz.build
new file mode 100644
index 000000000..8a9b76200
--- /dev/null
+++ b/dom/media/directshow/moz.build
@@ -0,0 +1,41 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'AudioSinkFilter.h',
+ 'AudioSinkInputPin.h',
+ 'DirectShowDecoder.h',
+ 'DirectShowReader.h',
+ 'DirectShowUtils.h',
+]
+
+UNIFIED_SOURCES += [
+ 'DirectShowDecoder.cpp',
+ 'DirectShowUtils.cpp',
+ 'SourceFilter.cpp',
+]
+
+SOURCES += [
+ 'AudioSinkFilter.cpp',
+ 'AudioSinkInputPin.cpp',
+ 'DirectShowReader.cpp',
+ 'SampleSink.cpp',
+]
+
+# If WebRTC isn't being built, we need to compile the DirectShow base classes so that
+# they're available at link time.
+if not CONFIG['MOZ_WEBRTC']:
+ SOURCES += [
+ '/media/webrtc/trunk/webrtc/modules/video_capture/windows/BaseFilter.cpp',
+ '/media/webrtc/trunk/webrtc/modules/video_capture/windows/BaseInputPin.cpp',
+ '/media/webrtc/trunk/webrtc/modules/video_capture/windows/BasePin.cpp',
+ '/media/webrtc/trunk/webrtc/modules/video_capture/windows/MediaType.cpp',
+ ]
+
+FINAL_LIBRARY = 'xul'
+LOCAL_INCLUDES += [
+ '/media/webrtc/trunk/webrtc/modules/video_capture/windows',
+]
diff --git a/dom/media/eme/CDMCaps.cpp b/dom/media/eme/CDMCaps.cpp
new file mode 100644
index 000000000..20ff63bad
--- /dev/null
+++ b/dom/media/eme/CDMCaps.cpp
@@ -0,0 +1,170 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/CDMCaps.h"
+#include "mozilla/EMEUtils.h"
+#include "nsThreadUtils.h"
+#include "SamplesWaitingForKey.h"
+
+namespace mozilla {
+
+CDMCaps::CDMCaps()
+ : mMonitor("CDMCaps")
+{
+}
+
+CDMCaps::~CDMCaps()
+{
+}
+
+void
+CDMCaps::Lock()
+{
+ mMonitor.Lock();
+}
+
+void
+CDMCaps::Unlock()
+{
+ mMonitor.Unlock();
+}
+
+CDMCaps::AutoLock::AutoLock(CDMCaps& aInstance)
+ : mData(aInstance)
+{
+ mData.Lock();
+}
+
+CDMCaps::AutoLock::~AutoLock()
+{
+ mData.Unlock();
+}
+
+// Keys with MediaKeyStatus::Usable, MediaKeyStatus::Output_downscaled,
+// or MediaKeyStatus::Output_restricted status can be used by the CDM
+// to decrypt or decrypt-and-decode samples.
+static bool
+IsUsableStatus(dom::MediaKeyStatus aStatus)
+{
+ return aStatus == dom::MediaKeyStatus::Usable ||
+ aStatus == dom::MediaKeyStatus::Output_restricted ||
+ aStatus == dom::MediaKeyStatus::Output_downscaled;
+}
+
+bool
+CDMCaps::AutoLock::IsKeyUsable(const CencKeyId& aKeyId)
+{
+ mData.mMonitor.AssertCurrentThreadOwns();
+ for (const KeyStatus& keyStatus : mData.mKeyStatuses) {
+ if (keyStatus.mId == aKeyId) {
+ return IsUsableStatus(keyStatus.mStatus);
+ }
+ }
+ return false;
+}
+
+bool
+CDMCaps::AutoLock::SetKeyStatus(const CencKeyId& aKeyId,
+ const nsString& aSessionId,
+ const dom::Optional<dom::MediaKeyStatus>& aStatus)
+{
+ mData.mMonitor.AssertCurrentThreadOwns();
+
+ if (!aStatus.WasPassed()) {
+ // Called from ForgetKeyStatus.
+ // Return true if the element is found to notify key changes.
+ return mData.mKeyStatuses.RemoveElement(KeyStatus(aKeyId,
+ aSessionId,
+ dom::MediaKeyStatus::Internal_error));
+ }
+
+ KeyStatus key(aKeyId, aSessionId, aStatus.Value());
+ auto index = mData.mKeyStatuses.IndexOf(key);
+ if (index != mData.mKeyStatuses.NoIndex) {
+ if (mData.mKeyStatuses[index].mStatus == aStatus.Value()) {
+ // No change.
+ return false;
+ }
+ auto oldStatus = mData.mKeyStatuses[index].mStatus;
+ mData.mKeyStatuses[index].mStatus = aStatus.Value();
+ // The old key status was one for which we can decrypt media. We don't
+ // need to do the "notify usable" step below, as it should be impossible
+ // for us to have anything waiting on this key to become usable, since it
+ // was already usable.
+ if (IsUsableStatus(oldStatus)) {
+ return true;
+ }
+ } else {
+ mData.mKeyStatuses.AppendElement(key);
+ }
+
+ // Only call NotifyUsable() for a key when we are going from non-usable
+ // to usable state.
+ if (!IsUsableStatus(aStatus.Value())) {
+ return true;
+ }
+
+ auto& waiters = mData.mWaitForKeys;
+ size_t i = 0;
+ while (i < waiters.Length()) {
+ auto& w = waiters[i];
+ if (w.mKeyId == aKeyId) {
+ w.mListener->NotifyUsable(aKeyId);
+ waiters.RemoveElementAt(i);
+ } else {
+ i++;
+ }
+ }
+ return true;
+}
+
+void
+CDMCaps::AutoLock::NotifyWhenKeyIdUsable(const CencKeyId& aKey,
+ SamplesWaitingForKey* aListener)
+{
+ mData.mMonitor.AssertCurrentThreadOwns();
+ MOZ_ASSERT(!IsKeyUsable(aKey));
+ MOZ_ASSERT(aListener);
+ mData.mWaitForKeys.AppendElement(WaitForKeys(aKey, aListener));
+}
+
+void
+CDMCaps::AutoLock::GetKeyStatusesForSession(const nsAString& aSessionId,
+ nsTArray<KeyStatus>& aOutKeyStatuses)
+{
+ for (const KeyStatus& keyStatus : mData.mKeyStatuses) {
+ if (keyStatus.mSessionId.Equals(aSessionId)) {
+ aOutKeyStatuses.AppendElement(keyStatus);
+ }
+ }
+}
+
+void
+CDMCaps::AutoLock::GetSessionIdsForKeyId(const CencKeyId& aKeyId,
+ nsTArray<nsCString>& aOutSessionIds)
+{
+ for (const KeyStatus& keyStatus : mData.mKeyStatuses) {
+ if (keyStatus.mId == aKeyId) {
+ aOutSessionIds.AppendElement(NS_ConvertUTF16toUTF8(keyStatus.mSessionId));
+ }
+ }
+}
+
+bool
+CDMCaps::AutoLock::RemoveKeysForSession(const nsString& aSessionId)
+{
+ bool changed = false;
+ nsTArray<KeyStatus> statuses;
+ GetKeyStatusesForSession(aSessionId, statuses);
+ for (const KeyStatus& status : statuses) {
+ changed |= SetKeyStatus(status.mId,
+ aSessionId,
+ dom::Optional<dom::MediaKeyStatus>());
+ }
+ return changed;
+}
+
+} // namespace mozilla
diff --git a/dom/media/eme/CDMCaps.h b/dom/media/eme/CDMCaps.h
new file mode 100644
index 000000000..7749bdc67
--- /dev/null
+++ b/dom/media/eme/CDMCaps.h
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef CDMCaps_h_
+#define CDMCaps_h_
+
+#include "gmp-decryption.h"
+#include "nsIThread.h"
+#include "nsTArray.h"
+#include "nsString.h"
+#include "SamplesWaitingForKey.h"
+
+#include "mozilla/Monitor.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/MediaKeyStatusMapBinding.h" // For MediaKeyStatus
+#include "mozilla/dom/BindingDeclarations.h" // For Optional
+
+namespace mozilla {
+
+// CDM capabilities; what keys a CDMProxy can use.
+// Must be locked to access state.
+class CDMCaps {
+public:
+ CDMCaps();
+ ~CDMCaps();
+
+ struct KeyStatus {
+ KeyStatus(const CencKeyId& aId,
+ const nsString& aSessionId,
+ dom::MediaKeyStatus aStatus)
+ : mId(aId)
+ , mSessionId(aSessionId)
+ , mStatus(aStatus)
+ {}
+ KeyStatus(const KeyStatus& aOther)
+ : mId(aOther.mId)
+ , mSessionId(aOther.mSessionId)
+ , mStatus(aOther.mStatus)
+ {}
+ bool operator==(const KeyStatus& aOther) const {
+ return mId == aOther.mId &&
+ mSessionId == aOther.mSessionId;
+ };
+
+ CencKeyId mId;
+ nsString mSessionId;
+ dom::MediaKeyStatus mStatus;
+ };
+
+ // Locks the CDMCaps. It must be locked to access its shared state.
+ // Threadsafe when locked.
+ class MOZ_STACK_CLASS AutoLock {
+ public:
+ explicit AutoLock(CDMCaps& aKeyCaps);
+ ~AutoLock();
+
+ bool IsKeyUsable(const CencKeyId& aKeyId);
+
+ // Returns true if key status changed,
+ // i.e. the key status changed from usable to expired.
+ bool SetKeyStatus(const CencKeyId& aKeyId,
+ const nsString& aSessionId,
+ const dom::Optional<dom::MediaKeyStatus>& aStatus);
+
+ void GetKeyStatusesForSession(const nsAString& aSessionId,
+ nsTArray<KeyStatus>& aOutKeyStatuses);
+
+ void GetSessionIdsForKeyId(const CencKeyId& aKeyId,
+ nsTArray<nsCString>& aOutSessionIds);
+
+ // Ensures all keys for a session are marked as 'unknown', i.e. removed.
+ // Returns true if a key status was changed.
+ bool RemoveKeysForSession(const nsString& aSessionId);
+
+ // Notifies the SamplesWaitingForKey when key become usable.
+ void NotifyWhenKeyIdUsable(const CencKeyId& aKey,
+ SamplesWaitingForKey* aSamplesWaiting);
+ private:
+ // Not taking a strong ref, since this should be allocated on the stack.
+ CDMCaps& mData;
+ };
+
+private:
+ void Lock();
+ void Unlock();
+
+ struct WaitForKeys {
+ WaitForKeys(const CencKeyId& aKeyId,
+ SamplesWaitingForKey* aListener)
+ : mKeyId(aKeyId)
+ , mListener(aListener)
+ {}
+ CencKeyId mKeyId;
+ RefPtr<SamplesWaitingForKey> mListener;
+ };
+
+ Monitor mMonitor;
+
+ nsTArray<KeyStatus> mKeyStatuses;
+
+ nsTArray<WaitForKeys> mWaitForKeys;
+
+ // It is not safe to copy this object.
+ CDMCaps(const CDMCaps&) = delete;
+ CDMCaps& operator=(const CDMCaps&) = delete;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/eme/CDMProxy.h b/dom/media/eme/CDMProxy.h
new file mode 100644
index 000000000..f3f1add43
--- /dev/null
+++ b/dom/media/eme/CDMProxy.h
@@ -0,0 +1,279 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef CDMProxy_h_
+#define CDMProxy_h_
+
+#include "mozilla/CDMCaps.h"
+#include "mozilla/MozPromise.h"
+
+#include "mozilla/dom/MediaKeyMessageEvent.h"
+#include "mozilla/dom/MediaKeys.h"
+
+#include "nsIThread.h"
+
+namespace mozilla {
+class MediaRawData;
+
+enum DecryptStatus {
+ Ok = 0,
+ GenericErr = 1,
+ NoKeyErr = 2,
+ AbortedErr = 3,
+};
+
+struct DecryptResult {
+ DecryptResult(DecryptStatus aStatus, MediaRawData* aSample)
+ : mStatus(aStatus)
+ , mSample(aSample)
+ {}
+ DecryptStatus mStatus;
+ RefPtr<MediaRawData> mSample;
+};
+
+class CDMKeyInfo {
+public:
+ explicit CDMKeyInfo(const nsTArray<uint8_t>& aKeyId)
+ : mKeyId(aKeyId)
+ , mStatus()
+ {}
+
+ CDMKeyInfo(const nsTArray<uint8_t>& aKeyId,
+ const dom::Optional<dom::MediaKeyStatus>& aStatus)
+ : mKeyId(aKeyId)
+ , mStatus(aStatus.Value())
+ {}
+
+ // The copy-ctor and copy-assignment operator for Optional<T> are declared as
+ // delete, so override CDMKeyInfo copy-ctor for nsTArray operations.
+ CDMKeyInfo(const CDMKeyInfo& aKeyInfo)
+ {
+ mKeyId = aKeyInfo.mKeyId;
+ if (aKeyInfo.mStatus.WasPassed()) {
+ mStatus.Construct(aKeyInfo.mStatus.Value());
+ }
+ }
+
+ nsTArray<uint8_t> mKeyId;
+ dom::Optional<dom::MediaKeyStatus> mStatus;
+};
+
+typedef int64_t UnixTime;
+
+// Proxies calls CDM, and proxies calls back.
+// Note: Promises are passed in via a PromiseId, so that the ID can be
+// passed via IPC to the CDM, which can then signal when to reject or
+// resolve the promise using its PromiseId.
+class CDMProxy {
+protected:
+ typedef dom::PromiseId PromiseId;
+ typedef dom::MediaKeySessionType MediaKeySessionType;
+public:
+
+ NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0;
+ NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0;
+
+ typedef MozPromise<DecryptResult, DecryptResult, /* IsExclusive = */ true> DecryptPromise;
+
+ // Main thread only.
+ CDMProxy(dom::MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired)
+ : mKeys(aKeys)
+ , mKeySystem(aKeySystem)
+ , mDistinctiveIdentifierRequired(aDistinctiveIdentifierRequired)
+ , mPersistentStateRequired(aPersistentStateRequired)
+ {}
+
+ // Main thread only.
+ // Loads the CDM corresponding to mKeySystem.
+ // Calls MediaKeys::OnCDMCreated() when the CDM is created.
+ virtual void Init(PromiseId aPromiseId,
+ const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aName,
+ bool aInPrivateBrowsing) = 0;
+
+ virtual void OnSetDecryptorId(uint32_t aId) {}
+
+ // Main thread only.
+ // Uses the CDM to create a key session.
+ // Calls MediaKeys::OnSessionActivated() when session is created.
+ // Assumes ownership of (Move()s) aInitData's contents.
+ virtual void CreateSession(uint32_t aCreateSessionToken,
+ MediaKeySessionType aSessionType,
+ PromiseId aPromiseId,
+ const nsAString& aInitDataType,
+ nsTArray<uint8_t>& aInitData) = 0;
+
+ // Main thread only.
+ // Uses the CDM to load a presistent session stored on disk.
+ // Calls MediaKeys::OnSessionActivated() when session is loaded.
+ virtual void LoadSession(PromiseId aPromiseId,
+ const nsAString& aSessionId) = 0;
+
+ // Main thread only.
+ // Sends a new certificate to the CDM.
+ // Calls MediaKeys->ResolvePromise(aPromiseId) after the CDM has
+ // processed the request.
+ // Assumes ownership of (Move()s) aCert's contents.
+ virtual void SetServerCertificate(PromiseId aPromiseId,
+ nsTArray<uint8_t>& aCert) = 0;
+
+ // Main thread only.
+ // Sends an update to the CDM.
+ // Calls MediaKeys->ResolvePromise(aPromiseId) after the CDM has
+ // processed the request.
+ // Assumes ownership of (Move()s) aResponse's contents.
+ virtual void UpdateSession(const nsAString& aSessionId,
+ PromiseId aPromiseId,
+ nsTArray<uint8_t>& aResponse) = 0;
+
+ // Main thread only.
+ // Calls MediaKeys->ResolvePromise(aPromiseId) after the CDM has
+ // processed the request.
+ // If processing this operation results in the session actually closing,
+ // we also call MediaKeySession::OnClosed(), which in turn calls
+ // MediaKeys::OnSessionClosed().
+ virtual void CloseSession(const nsAString& aSessionId,
+ PromiseId aPromiseId) = 0;
+
+ // Main thread only.
+ // Removes all data for a persisent session.
+ // Calls MediaKeys->ResolvePromise(aPromiseId) after the CDM has
+ // processed the request.
+ virtual void RemoveSession(const nsAString& aSessionId,
+ PromiseId aPromiseId) = 0;
+
+ // Main thread only.
+ virtual void Shutdown() = 0;
+
+ // Main thread only.
+ virtual void Terminated() = 0;
+
+ // Threadsafe.
+ virtual const nsCString& GetNodeId() const = 0;
+
+ // Main thread only.
+ virtual void OnSetSessionId(uint32_t aCreateSessionToken,
+ const nsAString& aSessionId) = 0;
+
+ // Main thread only.
+ virtual void OnResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) = 0;
+
+ // Main thread only.
+ virtual void OnSessionMessage(const nsAString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ nsTArray<uint8_t>& aMessage) = 0;
+
+ // Main thread only.
+ virtual void OnExpirationChange(const nsAString& aSessionId,
+ UnixTime aExpiryTime) = 0;
+
+ // Main thread only.
+ virtual void OnSessionClosed(const nsAString& aSessionId) = 0;
+
+ // Main thread only.
+ virtual void OnSessionError(const nsAString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsAString& aMsg) = 0;
+
+ // Main thread only.
+ virtual void OnRejectPromise(uint32_t aPromiseId,
+ nsresult aDOMException,
+ const nsCString& aMsg) = 0;
+
+ virtual RefPtr<DecryptPromise> Decrypt(MediaRawData* aSample) = 0;
+
+ // Owner thread only.
+ virtual void OnDecrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) = 0;
+
+ // Reject promise with DOMException corresponding to aExceptionCode.
+ // Can be called from any thread.
+ virtual void RejectPromise(PromiseId aId,
+ nsresult aExceptionCode,
+ const nsCString& aReason) = 0;
+
+ // Resolves promise with "undefined".
+ // Can be called from any thread.
+ virtual void ResolvePromise(PromiseId aId) = 0;
+
+ // Threadsafe.
+ virtual const nsString& KeySystem() const = 0;
+
+ virtual CDMCaps& Capabilites() = 0;
+
+ // Main thread only.
+ virtual void OnKeyStatusesChange(const nsAString& aSessionId) = 0;
+
+ virtual void GetSessionIdsForKeyId(const nsTArray<uint8_t>& aKeyId,
+ nsTArray<nsCString>& aSessionIds) = 0;
+
+#ifdef DEBUG
+ virtual bool IsOnOwnerThread() = 0;
+#endif
+
+ virtual uint32_t GetDecryptorId() { return 0; }
+
+protected:
+ virtual ~CDMProxy() {}
+
+ // Helper to enforce that a raw pointer is only accessed on the main thread.
+ template<class Type>
+ class MainThreadOnlyRawPtr {
+ public:
+ explicit MainThreadOnlyRawPtr(Type* aPtr)
+ : mPtr(aPtr)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+
+ bool IsNull() const {
+ MOZ_ASSERT(NS_IsMainThread());
+ return !mPtr;
+ }
+
+ void Clear() {
+ MOZ_ASSERT(NS_IsMainThread());
+ mPtr = nullptr;
+ }
+
+ Type* operator->() const MOZ_NO_ADDREF_RELEASE_ON_RETURN {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mPtr;
+ }
+ private:
+ Type* mPtr;
+ };
+
+ // Our reference back to the MediaKeys object.
+ // WARNING: This is a non-owning reference that is cleared by MediaKeys
+ // destructor. only use on main thread, and always nullcheck before using!
+ MainThreadOnlyRawPtr<dom::MediaKeys> mKeys;
+
+ const nsString mKeySystem;
+
+ // Onwer specified thread. e.g. Gecko Media Plugin thread.
+ // All interactions with the out-of-process EME plugin must come from this thread.
+ RefPtr<nsIThread> mOwnerThread;
+
+ nsCString mNodeId;
+
+ CDMCaps mCapabilites;
+
+ const bool mDistinctiveIdentifierRequired;
+ const bool mPersistentStateRequired;
+};
+
+
+} // namespace mozilla
+
+#endif // CDMProxy_h_
diff --git a/dom/media/eme/DecryptorProxyCallback.h b/dom/media/eme/DecryptorProxyCallback.h
new file mode 100644
index 000000000..c1fcb49a4
--- /dev/null
+++ b/dom/media/eme/DecryptorProxyCallback.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DecryptorProxyCallback_h_
+#define DecryptorProxyCallback_h_
+
+#include "mozilla/dom/MediaKeyStatusMapBinding.h" // For MediaKeyStatus
+#include "mozilla/dom/MediaKeyMessageEventBinding.h" // For MediaKeyMessageType
+#include "mozilla/CDMProxy.h"
+
+class DecryptorProxyCallback {
+public:
+
+ virtual ~DecryptorProxyCallback() {}
+
+ virtual void SetDecryptorId(uint32_t aId) = 0;
+
+ virtual void SetSessionId(uint32_t aCreateSessionId,
+ const nsCString& aSessionId) = 0;
+
+ virtual void ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) = 0;
+
+ virtual void ResolvePromise(uint32_t aPromiseId) = 0;
+
+ virtual void RejectPromise(uint32_t aPromiseId,
+ nsresult aException,
+ const nsCString& aSessionId) = 0;
+
+ virtual void SessionMessage(const nsCString& aSessionId,
+ mozilla::dom::MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage) = 0;
+
+ virtual void ExpirationChange(const nsCString& aSessionId,
+ mozilla::UnixTime aExpiryTime) = 0;
+
+ virtual void SessionClosed(const nsCString& aSessionId) = 0;
+
+ virtual void SessionError(const nsCString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsCString& aMessage) = 0;
+
+ virtual void Decrypted(uint32_t aId,
+ mozilla::DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) = 0;
+
+ virtual void BatchedKeyStatusChanged(const nsCString& aSessionId,
+ const nsTArray<mozilla::CDMKeyInfo>& aKeyInfos) = 0;
+};
+
+#endif
diff --git a/dom/media/eme/DetailedPromise.cpp b/dom/media/eme/DetailedPromise.cpp
new file mode 100644
index 000000000..5893bea2e
--- /dev/null
+++ b/dom/media/eme/DetailedPromise.cpp
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DetailedPromise.h"
+#include "mozilla/dom/DOMException.h"
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+namespace dom {
+
+DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
+ const nsACString& aName)
+ : Promise(aGlobal)
+ , mName(aName)
+ , mResponded(false)
+ , mStartTime(TimeStamp::Now())
+{
+}
+
+DetailedPromise::DetailedPromise(nsIGlobalObject* aGlobal,
+ const nsACString& aName,
+ Telemetry::ID aSuccessLatencyProbe,
+ Telemetry::ID aFailureLatencyProbe)
+ : DetailedPromise(aGlobal, aName)
+{
+ mSuccessLatencyProbe.Construct(aSuccessLatencyProbe);
+ mFailureLatencyProbe.Construct(aFailureLatencyProbe);
+}
+
+DetailedPromise::~DetailedPromise()
+{
+ // It would be nice to assert that mResponded is identical to
+ // GetPromiseState() == PromiseState::Rejected. But by now we've been
+ // unlinked, so don't have a reference to our actual JS Promise object
+ // anymore.
+ MaybeReportTelemetry(Failed);
+}
+
+void
+DetailedPromise::MaybeReject(nsresult aArg, const nsACString& aReason)
+{
+ nsPrintfCString msg("%s promise rejected 0x%x '%s'", mName.get(), aArg,
+ PromiseFlatCString(aReason).get());
+ EME_LOG(msg.get());
+
+ MaybeReportTelemetry(Failed);
+
+ LogToBrowserConsole(NS_ConvertUTF8toUTF16(msg));
+
+ ErrorResult rv;
+ rv.ThrowDOMException(aArg, aReason);
+ Promise::MaybeReject(rv);
+}
+
+void
+DetailedPromise::MaybeReject(ErrorResult&, const nsACString& aReason)
+{
+ NS_NOTREACHED("nsresult expected in MaybeReject()");
+}
+
+/* static */ already_AddRefed<DetailedPromise>
+DetailedPromise::Create(nsIGlobalObject* aGlobal,
+ ErrorResult& aRv,
+ const nsACString& aName)
+{
+ RefPtr<DetailedPromise> promise = new DetailedPromise(aGlobal, aName);
+ promise->CreateWrapper(nullptr, aRv);
+ return aRv.Failed() ? nullptr : promise.forget();
+}
+
+/* static */ already_AddRefed<DetailedPromise>
+DetailedPromise::Create(nsIGlobalObject* aGlobal,
+ ErrorResult& aRv,
+ const nsACString& aName,
+ Telemetry::ID aSuccessLatencyProbe,
+ Telemetry::ID aFailureLatencyProbe)
+{
+ RefPtr<DetailedPromise> promise = new DetailedPromise(aGlobal, aName, aSuccessLatencyProbe, aFailureLatencyProbe);
+ promise->CreateWrapper(nullptr, aRv);
+ return aRv.Failed() ? nullptr : promise.forget();
+}
+
+void
+DetailedPromise::MaybeReportTelemetry(Status aStatus)
+{
+ if (mResponded) {
+ return;
+ }
+ mResponded = true;
+ if (!mSuccessLatencyProbe.WasPassed() || !mFailureLatencyProbe.WasPassed()) {
+ return;
+ }
+ uint32_t latency = (TimeStamp::Now() - mStartTime).ToMilliseconds();
+ EME_LOG("%s %s latency %ums reported via telemetry", mName.get(),
+ ((aStatus == Succeeded) ? "succcess" : "failure"), latency);
+ Telemetry::ID tid = (aStatus == Succeeded) ? mSuccessLatencyProbe.Value()
+ : mFailureLatencyProbe.Value();
+ Telemetry::Accumulate(tid, latency);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/DetailedPromise.h b/dom/media/eme/DetailedPromise.h
new file mode 100644
index 000000000..83e40c022
--- /dev/null
+++ b/dom/media/eme/DetailedPromise.h
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __DetailedPromise_h__
+#define __DetailedPromise_h__
+
+#include "mozilla/dom/Promise.h"
+#include "mozilla/Telemetry.h"
+#include "EMEUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+/*
+ * This is pretty horrible; bug 1160445.
+ * Extend Promise to add custom DOMException messages on rejection.
+ * Get rid of this once we've ironed out EME errors in the wild.
+ */
+class DetailedPromise : public Promise
+{
+public:
+ static already_AddRefed<DetailedPromise>
+ Create(nsIGlobalObject* aGlobal,
+ ErrorResult& aRv,
+ const nsACString& aName);
+
+ static already_AddRefed<DetailedPromise>
+ Create(nsIGlobalObject* aGlobal, ErrorResult& aRv,
+ const nsACString& aName,
+ Telemetry::ID aSuccessLatencyProbe,
+ Telemetry::ID aFailureLatencyProbe);
+
+ template <typename T>
+ void MaybeResolve(const T& aArg)
+ {
+ EME_LOG("%s promise resolved", mName.get());
+ MaybeReportTelemetry(Succeeded);
+ Promise::MaybeResolve<T>(aArg);
+ }
+
+ void MaybeReject(nsresult aArg) = delete;
+ void MaybeReject(nsresult aArg, const nsACString& aReason);
+
+ void MaybeReject(ErrorResult& aArg) = delete;
+ void MaybeReject(ErrorResult&, const nsACString& aReason);
+
+private:
+ explicit DetailedPromise(nsIGlobalObject* aGlobal,
+ const nsACString& aName);
+
+ explicit DetailedPromise(nsIGlobalObject* aGlobal,
+ const nsACString& aName,
+ Telemetry::ID aSuccessLatencyProbe,
+ Telemetry::ID aFailureLatencyProbe);
+ virtual ~DetailedPromise();
+
+ enum Status { Succeeded, Failed };
+ void MaybeReportTelemetry(Status aStatus);
+
+ nsCString mName;
+ bool mResponded;
+ TimeStamp mStartTime;
+ Optional<Telemetry::ID> mSuccessLatencyProbe;
+ Optional<Telemetry::ID> mFailureLatencyProbe;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // __DetailedPromise_h__
diff --git a/dom/media/eme/EMEUtils.cpp b/dom/media/eme/EMEUtils.cpp
new file mode 100644
index 000000000..c248b3a24
--- /dev/null
+++ b/dom/media/eme/EMEUtils.cpp
@@ -0,0 +1,97 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/EMEUtils.h"
+#include "mozilla/dom/UnionTypes.h"
+
+namespace mozilla {
+
+LogModule* GetEMELog() {
+ static LazyLogModule log("EME");
+ return log;
+}
+
+LogModule* GetEMEVerboseLog() {
+ static LazyLogModule log("EMEV");
+ return log;
+}
+
+ArrayData
+GetArrayBufferViewOrArrayBufferData(const dom::ArrayBufferViewOrArrayBuffer& aBufferOrView)
+{
+ MOZ_ASSERT(aBufferOrView.IsArrayBuffer() || aBufferOrView.IsArrayBufferView());
+ if (aBufferOrView.IsArrayBuffer()) {
+ const dom::ArrayBuffer& buffer = aBufferOrView.GetAsArrayBuffer();
+ buffer.ComputeLengthAndData();
+ return ArrayData(buffer.Data(), buffer.Length());
+ } else if (aBufferOrView.IsArrayBufferView()) {
+ const dom::ArrayBufferView& bufferview = aBufferOrView.GetAsArrayBufferView();
+ bufferview.ComputeLengthAndData();
+ return ArrayData(bufferview.Data(), bufferview.Length());
+ }
+ return ArrayData(nullptr, 0);
+}
+
+void
+CopyArrayBufferViewOrArrayBufferData(const dom::ArrayBufferViewOrArrayBuffer& aBufferOrView,
+ nsTArray<uint8_t>& aOutData)
+{
+ ArrayData data = GetArrayBufferViewOrArrayBufferData(aBufferOrView);
+ aOutData.Clear();
+ if (!data.IsValid()) {
+ return;
+ }
+ aOutData.AppendElements(data.mData, data.mLength);
+}
+
+bool
+IsClearkeyKeySystem(const nsAString& aKeySystem)
+{
+ return !CompareUTF8toUTF16(kEMEKeySystemClearkey, aKeySystem);
+}
+
+bool
+IsPrimetimeKeySystem(const nsAString& aKeySystem)
+{
+ return !CompareUTF8toUTF16(kEMEKeySystemPrimetime, aKeySystem);
+}
+
+bool
+IsWidevineKeySystem(const nsAString& aKeySystem)
+{
+ return !CompareUTF8toUTF16(kEMEKeySystemWidevine, aKeySystem);
+}
+
+nsString
+KeySystemToGMPName(const nsAString& aKeySystem)
+{
+ if (IsPrimetimeKeySystem(aKeySystem)) {
+ return NS_LITERAL_STRING("gmp-eme-adobe");
+ }
+ if (IsClearkeyKeySystem(aKeySystem)) {
+ return NS_LITERAL_STRING("gmp-clearkey");
+ }
+ if (IsWidevineKeySystem(aKeySystem)) {
+ return NS_LITERAL_STRING("gmp-widevinecdm");
+ }
+ MOZ_ASSERT(false, "We should only call this for known GMPs");
+ return EmptyString();
+}
+
+CDMType
+ToCDMTypeTelemetryEnum(const nsString& aKeySystem)
+{
+ if (IsWidevineKeySystem(aKeySystem)) {
+ return CDMType::eWidevine;
+ } else if (IsClearkeyKeySystem(aKeySystem)) {
+ return CDMType::eClearKey;
+ } else if (IsPrimetimeKeySystem(aKeySystem)) {
+ return CDMType::ePrimetime;
+ }
+ return CDMType::eUnknown;
+}
+
+} // namespace mozilla
diff --git a/dom/media/eme/EMEUtils.h b/dom/media/eme/EMEUtils.h
new file mode 100644
index 000000000..1794f8462
--- /dev/null
+++ b/dom/media/eme/EMEUtils.h
@@ -0,0 +1,107 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EME_LOG_H_
+#define EME_LOG_H_
+
+#include "VideoUtils.h"
+#include "mozilla/Logging.h"
+#include "nsString.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+namespace dom {
+class ArrayBufferViewOrArrayBuffer;
+}
+
+#ifndef EME_LOG
+ LogModule* GetEMELog();
+ #define EME_LOG(...) MOZ_LOG(GetEMELog(), mozilla::LogLevel::Debug, (__VA_ARGS__))
+ #define EME_LOG_ENABLED() MOZ_LOG_TEST(GetEMELog(), mozilla::LogLevel::Debug)
+#endif
+
+#ifndef EME_VERBOSE_LOG
+ LogModule* GetEMEVerboseLog();
+ #define EME_VERBOSE_LOG(...) MOZ_LOG(GetEMEVerboseLog(), mozilla::LogLevel::Debug, (__VA_ARGS__))
+#else
+ #ifndef EME_LOG
+ #define EME_LOG(...)
+ #endif
+
+ #ifndef EME_VERBOSE_LOG
+ #define EME_VERBOSE_LOG(...)
+ #endif
+#endif
+
+// Helper function to extract a copy of data coming in from JS in an
+// (ArrayBuffer or ArrayBufferView) IDL typed function argument.
+//
+// Only call this on a properly initialized ArrayBufferViewOrArrayBuffer.
+void
+CopyArrayBufferViewOrArrayBufferData(const dom::ArrayBufferViewOrArrayBuffer& aBufferOrView,
+ nsTArray<uint8_t>& aOutData);
+
+struct ArrayData {
+ explicit ArrayData(const uint8_t* aData, size_t aLength)
+ : mData(aData)
+ , mLength(aLength)
+ {
+ }
+ const uint8_t* mData;
+ const size_t mLength;
+ bool IsValid() const {
+ return mData != nullptr && mLength != 0;
+ }
+ bool operator== (const nsTArray<uint8_t>& aOther) const {
+ return mLength == aOther.Length() &&
+ memcmp(mData, aOther.Elements(), mLength) == 0;
+ }
+};
+
+// Helper function to extract data coming in from JS in an
+// (ArrayBuffer or ArrayBufferView) IDL typed function argument.
+//
+// Be *very* careful with this!
+//
+// Only use returned ArrayData inside the lifetime of the
+// ArrayBufferViewOrArrayBuffer; the ArrayData struct does not contain
+// a copy of the data!
+//
+// And do *not* call out to anything that could call into JavaScript,
+// while the ArrayData is live, as then all bets about the data not changing
+// are off! No calls into JS, no calls into JS-implemented WebIDL or XPIDL,
+// nothing. Beware!
+//
+// Only call this on a properly initialized ArrayBufferViewOrArrayBuffer.
+ArrayData
+GetArrayBufferViewOrArrayBufferData(const dom::ArrayBufferViewOrArrayBuffer& aBufferOrView);
+
+nsString
+KeySystemToGMPName(const nsAString& aKeySystem);
+
+bool
+IsClearkeyKeySystem(const nsAString& aKeySystem);
+
+bool
+IsPrimetimeKeySystem(const nsAString& aKeySystem);
+
+bool
+IsWidevineKeySystem(const nsAString& aKeySystem);
+
+enum CDMType {
+ eClearKey = 0,
+ ePrimetime = 1,
+ eWidevine = 2,
+ eUnknown = 3
+};
+
+CDMType
+ToCDMTypeTelemetryEnum(const nsString& aKeySystem);
+
+} // namespace mozilla
+
+#endif // EME_LOG_H_
diff --git a/dom/media/eme/MediaEncryptedEvent.cpp b/dom/media/eme/MediaEncryptedEvent.cpp
new file mode 100644
index 000000000..8e2595fcb
--- /dev/null
+++ b/dom/media/eme/MediaEncryptedEvent.cpp
@@ -0,0 +1,129 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaEncryptedEvent.h"
+#include "mozilla/dom/MediaEncryptedEventBinding.h"
+#include "nsContentUtils.h"
+#include "jsfriendapi.h"
+#include "nsINode.h"
+#include "mozilla/dom/MediaKeys.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaEncryptedEvent)
+
+NS_IMPL_ADDREF_INHERITED(MediaEncryptedEvent, Event)
+NS_IMPL_RELEASE_INHERITED(MediaEncryptedEvent, Event)
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaEncryptedEvent, Event)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(MediaEncryptedEvent, Event)
+ NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mInitData)
+NS_IMPL_CYCLE_COLLECTION_TRACE_END
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaEncryptedEvent, Event)
+ tmp->mInitData = nullptr;
+ mozilla::DropJSObjects(this);
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaEncryptedEvent)
+NS_INTERFACE_MAP_END_INHERITING(Event)
+
+MediaEncryptedEvent::MediaEncryptedEvent(EventTarget* aOwner)
+ : Event(aOwner, nullptr, nullptr)
+{
+ mozilla::HoldJSObjects(this);
+}
+
+MediaEncryptedEvent::~MediaEncryptedEvent()
+{
+ mInitData = nullptr;
+ mozilla::DropJSObjects(this);
+}
+
+JSObject*
+MediaEncryptedEvent::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaEncryptedEventBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<MediaEncryptedEvent>
+MediaEncryptedEvent::Constructor(EventTarget* aOwner)
+{
+ RefPtr<MediaEncryptedEvent> e = new MediaEncryptedEvent(aOwner);
+ e->InitEvent(NS_LITERAL_STRING("encrypted"), false, false);
+ e->SetTrusted(true);
+ return e.forget();
+}
+
+already_AddRefed<MediaEncryptedEvent>
+MediaEncryptedEvent::Constructor(EventTarget* aOwner,
+ const nsAString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData)
+{
+ RefPtr<MediaEncryptedEvent> e = new MediaEncryptedEvent(aOwner);
+ e->InitEvent(NS_LITERAL_STRING("encrypted"), false, false);
+ e->mInitDataType = aInitDataType;
+ e->mRawInitData = aInitData;
+ e->SetTrusted(true);
+ return e.forget();
+}
+
+already_AddRefed<MediaEncryptedEvent>
+MediaEncryptedEvent::Constructor(const GlobalObject& aGlobal,
+ const nsAString& aType,
+ const MediaKeyNeededEventInit& aEventInitDict,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports());
+ RefPtr<MediaEncryptedEvent> e = new MediaEncryptedEvent(owner);
+ bool trusted = e->Init(owner);
+ e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable);
+ e->mInitDataType = aEventInitDict.mInitDataType;
+ if (!aEventInitDict.mInitData.IsNull()) {
+ const auto& a = aEventInitDict.mInitData.Value();
+ a.ComputeLengthAndData();
+ e->mInitData = ArrayBuffer::Create(aGlobal.Context(),
+ a.Length(),
+ a.Data());
+ if (!e->mInitData) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return nullptr;
+ }
+ }
+ e->SetTrusted(trusted);
+ return e.forget();
+}
+
+void
+MediaEncryptedEvent::GetInitDataType(nsString& aRetVal) const
+{
+ aRetVal = mInitDataType;
+}
+
+void
+MediaEncryptedEvent::GetInitData(JSContext* cx,
+ JS::MutableHandle<JSObject*> aData,
+ ErrorResult& aRv)
+{
+ if (mRawInitData.Length()) {
+ mInitData = ArrayBuffer::Create(cx,
+ this,
+ mRawInitData.Length(),
+ mRawInitData.Elements());
+ if (!mInitData) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return;
+ }
+ mRawInitData.Clear();
+ }
+ aData.set(mInitData);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaEncryptedEvent.h b/dom/media/eme/MediaEncryptedEvent.h
new file mode 100644
index 000000000..806fccad6
--- /dev/null
+++ b/dom/media/eme/MediaEncryptedEvent.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeyNeededEvent_h__
+#define mozilla_dom_MediaKeyNeededEvent_h__
+
+#include "mozilla/dom/MediaEncryptedEventBinding.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+#include "mozilla/dom/Event.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/BindingUtils.h"
+#include "js/TypeDecls.h"
+
+namespace mozilla {
+namespace dom {
+
+class MediaEncryptedEvent final : public Event
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(MediaEncryptedEvent, Event)
+protected:
+ virtual ~MediaEncryptedEvent();
+ explicit MediaEncryptedEvent(EventTarget* aOwner);
+
+ nsString mInitDataType;
+ JS::Heap<JSObject*> mInitData;
+
+public:
+
+ JSObject* WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static already_AddRefed<MediaEncryptedEvent>
+ Constructor(EventTarget* aOwner);
+
+ static already_AddRefed<MediaEncryptedEvent>
+ Constructor(EventTarget* aOwner,
+ const nsAString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData);
+
+ static already_AddRefed<MediaEncryptedEvent>
+ Constructor(const GlobalObject& aGlobal,
+ const nsAString& aType,
+ const MediaKeyNeededEventInit& aEventInitDict,
+ ErrorResult& aRv);
+
+ void GetInitDataType(nsString& aRetVal) const;
+
+ void GetInitData(JSContext* cx,
+ JS::MutableHandle<JSObject*> aData,
+ ErrorResult& aRv);
+private:
+ nsTArray<uint8_t> mRawInitData;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaKeyNeededEvent_h__
diff --git a/dom/media/eme/MediaKeyError.cpp b/dom/media/eme/MediaKeyError.cpp
new file mode 100644
index 000000000..635c34364
--- /dev/null
+++ b/dom/media/eme/MediaKeyError.cpp
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaKeyError.h"
+#include "mozilla/dom/MediaKeyErrorBinding.h"
+#include "nsContentUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+MediaKeyError::MediaKeyError(EventTarget* aOwner, uint32_t aSystemCode)
+ : Event(aOwner, nullptr, nullptr)
+ , mSystemCode(aSystemCode)
+{
+ InitEvent(NS_LITERAL_STRING("error"), false, false);
+}
+
+MediaKeyError::~MediaKeyError()
+{
+}
+
+uint32_t
+MediaKeyError::SystemCode() const
+{
+ return mSystemCode;
+}
+
+JSObject*
+MediaKeyError::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaKeyErrorBinding::Wrap(aCx, this, aGivenProto);
+}
+
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeyError.h b/dom/media/eme/MediaKeyError.h
new file mode 100644
index 000000000..df79b2c95
--- /dev/null
+++ b/dom/media/eme/MediaKeyError.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeyError_h
+#define mozilla_dom_MediaKeyError_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "nsWrapperCache.h"
+#include "mozilla/dom/Event.h"
+#include "js/TypeDecls.h"
+
+namespace mozilla {
+namespace dom {
+
+class MediaKeyError final : public Event
+{
+public:
+ NS_FORWARD_TO_EVENT
+
+ MediaKeyError(EventTarget* aOwner, uint32_t aSystemCode);
+ ~MediaKeyError();
+
+ JSObject* WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint32_t SystemCode() const;
+
+private:
+ uint32_t mSystemCode;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/eme/MediaKeyMessageEvent.cpp b/dom/media/eme/MediaKeyMessageEvent.cpp
new file mode 100644
index 000000000..37c509e67
--- /dev/null
+++ b/dom/media/eme/MediaKeyMessageEvent.cpp
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaKeyMessageEvent.h"
+#include "mozilla/dom/MediaKeyMessageEventBinding.h"
+#include "js/GCAPI.h"
+#include "jsfriendapi.h"
+#include "mozilla/dom/Nullable.h"
+#include "mozilla/dom/PrimitiveConversions.h"
+#include "mozilla/HoldDropJSObjects.h"
+#include "mozilla/dom/TypedArray.h"
+#include "nsContentUtils.h"
+#include "mozilla/dom/MediaKeys.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaKeyMessageEvent)
+
+NS_IMPL_ADDREF_INHERITED(MediaKeyMessageEvent, Event)
+NS_IMPL_RELEASE_INHERITED(MediaKeyMessageEvent, Event)
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaKeyMessageEvent, Event)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(MediaKeyMessageEvent, Event)
+ NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mMessage)
+NS_IMPL_CYCLE_COLLECTION_TRACE_END
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaKeyMessageEvent, Event)
+ tmp->mMessage = nullptr;
+ mozilla::DropJSObjects(this);
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaKeyMessageEvent)
+NS_INTERFACE_MAP_END_INHERITING(Event)
+
+MediaKeyMessageEvent::MediaKeyMessageEvent(EventTarget* aOwner)
+ : Event(aOwner, nullptr, nullptr)
+{
+ mozilla::HoldJSObjects(this);
+}
+
+MediaKeyMessageEvent::~MediaKeyMessageEvent()
+{
+ mMessage = nullptr;
+ mozilla::DropJSObjects(this);
+}
+
+MediaKeyMessageEvent*
+MediaKeyMessageEvent::AsMediaKeyMessageEvent()
+{
+ return this;
+}
+
+JSObject*
+MediaKeyMessageEvent::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaKeyMessageEventBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<MediaKeyMessageEvent>
+MediaKeyMessageEvent::Constructor(EventTarget* aOwner,
+ MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage)
+{
+ RefPtr<MediaKeyMessageEvent> e = new MediaKeyMessageEvent(aOwner);
+ e->InitEvent(NS_LITERAL_STRING("message"), false, false);
+ e->mMessageType = aMessageType;
+ e->mRawMessage = aMessage;
+ e->SetTrusted(true);
+ return e.forget();
+}
+
+already_AddRefed<MediaKeyMessageEvent>
+MediaKeyMessageEvent::Constructor(const GlobalObject& aGlobal,
+ const nsAString& aType,
+ const MediaKeyMessageEventInit& aEventInitDict,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<EventTarget> owner = do_QueryInterface(aGlobal.GetAsSupports());
+ RefPtr<MediaKeyMessageEvent> e = new MediaKeyMessageEvent(owner);
+ bool trusted = e->Init(owner);
+ e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable);
+ aEventInitDict.mMessage.ComputeLengthAndData();
+ e->mMessage = ArrayBuffer::Create(aGlobal.Context(),
+ aEventInitDict.mMessage.Length(),
+ aEventInitDict.mMessage.Data());
+ if (!e->mMessage) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return nullptr;
+ }
+ e->mMessageType = aEventInitDict.mMessageType;
+ e->SetTrusted(trusted);
+ e->SetComposed(aEventInitDict.mComposed);
+ return e.forget();
+}
+
+void
+MediaKeyMessageEvent::GetMessage(JSContext* cx,
+ JS::MutableHandle<JSObject*> aMessage,
+ ErrorResult& aRv)
+{
+ if (!mMessage) {
+ mMessage = ArrayBuffer::Create(cx,
+ this,
+ mRawMessage.Length(),
+ mRawMessage.Elements());
+ if (!mMessage) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return;
+ }
+ mRawMessage.Clear();
+ }
+ aMessage.set(mMessage);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeyMessageEvent.h b/dom/media/eme/MediaKeyMessageEvent.h
new file mode 100644
index 000000000..b6cc86dfa
--- /dev/null
+++ b/dom/media/eme/MediaKeyMessageEvent.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeyMessageEvent_h__
+#define mozilla_dom_MediaKeyMessageEvent_h__
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+#include "mozilla/dom/Event.h"
+#include "mozilla/dom/TypedArray.h"
+#include "js/TypeDecls.h"
+#include "mozilla/dom/MediaKeyMessageEventBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+struct MediaKeyMessageEventInit;
+
+class MediaKeyMessageEvent final : public Event
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(MediaKeyMessageEvent, Event)
+protected:
+ virtual ~MediaKeyMessageEvent();
+ explicit MediaKeyMessageEvent(EventTarget* aOwner);
+
+ MediaKeyMessageType mMessageType;
+ JS::Heap<JSObject*> mMessage;
+
+public:
+ virtual MediaKeyMessageEvent* AsMediaKeyMessageEvent();
+
+ JSObject* WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static already_AddRefed<MediaKeyMessageEvent>
+ Constructor(EventTarget* aOwner,
+ MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage);
+
+ static already_AddRefed<MediaKeyMessageEvent>
+ Constructor(const GlobalObject& aGlobal,
+ const nsAString& aType,
+ const MediaKeyMessageEventInit& aEventInitDict,
+ ErrorResult& aRv);
+
+ MediaKeyMessageType MessageType() const { return mMessageType; }
+
+ void GetMessage(JSContext* cx,
+ JS::MutableHandle<JSObject*> aMessage,
+ ErrorResult& aRv);
+
+private:
+ nsTArray<uint8_t> mRawMessage;
+};
+
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaKeyMessageEvent_h__
diff --git a/dom/media/eme/MediaKeySession.cpp b/dom/media/eme/MediaKeySession.cpp
new file mode 100644
index 000000000..d5eff3f77
--- /dev/null
+++ b/dom/media/eme/MediaKeySession.cpp
@@ -0,0 +1,674 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/MediaKeySession.h"
+#include "mozilla/dom/MediaKeyError.h"
+#include "mozilla/dom/MediaKeyMessageEvent.h"
+#include "mozilla/dom/MediaEncryptedEvent.h"
+#include "mozilla/dom/MediaKeyStatusMap.h"
+#include "mozilla/dom/MediaKeySystemAccess.h"
+#include "mozilla/dom/KeyIdsInitDataBinding.h"
+#include "nsCycleCollectionParticipant.h"
+#include "mozilla/CDMProxy.h"
+#include "mozilla/AsyncEventDispatcher.h"
+#include "mozilla/Move.h"
+#include "nsContentUtils.h"
+#include "mozilla/EMEUtils.h"
+#include "GMPUtils.h"
+#include "nsPrintfCString.h"
+#include "psshparser/PsshParser.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaKeySession,
+ DOMEventTargetHelper,
+ mMediaKeyError,
+ mKeys,
+ mKeyStatusMap,
+ mClosed)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaKeySession)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(MediaKeySession, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaKeySession, DOMEventTargetHelper)
+
+// Count of number of instances. Used to give each instance a
+// unique token.
+static uint32_t sMediaKeySessionNum = 0;
+
+// Max length of keyId in EME "keyIds" or WebM init data format, as enforced
+// by web platform tests.
+static const uint32_t MAX_KEY_ID_LENGTH = 512;
+
+// Max length of CENC PSSH init data tolerated, as enforced by web
+// platform tests.
+static const uint32_t MAX_CENC_INIT_DATA_LENGTH = 64 * 1024;
+
+
+MediaKeySession::MediaKeySession(JSContext* aCx,
+ nsPIDOMWindowInner* aParent,
+ MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ MediaKeySessionType aSessionType,
+ ErrorResult& aRv)
+ : DOMEventTargetHelper(aParent)
+ , mKeys(aKeys)
+ , mKeySystem(aKeySystem)
+ , mSessionType(aSessionType)
+ , mToken(sMediaKeySessionNum++)
+ , mIsClosed(false)
+ , mUninitialized(true)
+ , mKeyStatusMap(new MediaKeyStatusMap(aParent))
+ , mExpiration(JS::GenericNaN())
+{
+ EME_LOG("MediaKeySession[%p,''] ctor", this);
+
+ MOZ_ASSERT(aParent);
+ if (aRv.Failed()) {
+ return;
+ }
+ mClosed = MakePromise(aRv, NS_LITERAL_CSTRING("MediaKeys.createSession"));
+}
+
+void MediaKeySession::SetSessionId(const nsAString& aSessionId)
+{
+ EME_LOG("MediaKeySession[%p,'%s'] session Id set",
+ this, NS_ConvertUTF16toUTF8(aSessionId).get());
+
+ if (NS_WARN_IF(!mSessionId.IsEmpty())) {
+ return;
+ }
+ mSessionId = aSessionId;
+ mKeys->OnSessionIdReady(this);
+}
+
+MediaKeySession::~MediaKeySession()
+{
+}
+
+MediaKeyError*
+MediaKeySession::GetError() const
+{
+ return mMediaKeyError;
+}
+
+void
+MediaKeySession::GetKeySystem(nsString& aOutKeySystem) const
+{
+ aOutKeySystem.Assign(mKeySystem);
+}
+
+void
+MediaKeySession::GetSessionId(nsString& aSessionId) const
+{
+ aSessionId = GetSessionId();
+}
+
+const nsString&
+MediaKeySession::GetSessionId() const
+{
+ return mSessionId;
+}
+
+JSObject*
+MediaKeySession::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaKeySessionBinding::Wrap(aCx, this, aGivenProto);
+}
+
+double
+MediaKeySession::Expiration() const
+{
+ return mExpiration;
+}
+
+Promise*
+MediaKeySession::Closed() const
+{
+ return mClosed;
+}
+
+void
+MediaKeySession::UpdateKeyStatusMap()
+{
+ MOZ_ASSERT(!IsClosed());
+ if (!mKeys->GetCDMProxy()) {
+ return;
+ }
+
+ nsTArray<CDMCaps::KeyStatus> keyStatuses;
+ {
+ CDMCaps::AutoLock caps(mKeys->GetCDMProxy()->Capabilites());
+ caps.GetKeyStatusesForSession(mSessionId, keyStatuses);
+ }
+
+ mKeyStatusMap->Update(keyStatuses);
+
+ if (EME_LOG_ENABLED()) {
+ nsAutoCString message(
+ nsPrintfCString("MediaKeySession[%p,'%s'] key statuses change {",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get()));
+ using IntegerType = typename std::underlying_type<MediaKeyStatus>::type;
+ for (const CDMCaps::KeyStatus& status : keyStatuses) {
+ message.Append(nsPrintfCString(" (%s,%s)", ToBase64(status.mId).get(),
+ MediaKeyStatusValues::strings[static_cast<IntegerType>(status.mStatus)].value));
+ }
+ message.Append(" }");
+ EME_LOG(message.get());
+ }
+}
+
+MediaKeyStatusMap*
+MediaKeySession::KeyStatuses() const
+{
+ return mKeyStatusMap;
+}
+
+// The user agent MUST thoroughly validate the Initialization Data before
+// passing it to the CDM. This includes verifying that the length and
+// values of fields are reasonable, verifying that values are within
+// reasonable limits, and stripping irrelevant, unsupported, or unknown
+// data or fields. It is RECOMMENDED that user agents pre-parse, sanitize,
+// and/or generate a fully sanitized version of the Initialization Data.
+// If the Initialization Data format specified by initDataType supports
+// multiple entries, the user agent SHOULD remove entries that are not
+// needed by the CDM. The user agent MUST NOT re-order entries within
+// the Initialization Data.
+static bool
+ValidateInitData(const nsTArray<uint8_t>& aInitData, const nsAString& aInitDataType)
+{
+ if (aInitDataType.LowerCaseEqualsLiteral("webm")) {
+ // WebM initData consists of a single keyId. Ensure it's of reasonable length.
+ return aInitData.Length() <= MAX_KEY_ID_LENGTH;
+ } else if (aInitDataType.LowerCaseEqualsLiteral("cenc")) {
+ // Limit initData to less than 64KB.
+ if (aInitData.Length() > MAX_CENC_INIT_DATA_LENGTH) {
+ return false;
+ }
+ std::vector<std::vector<uint8_t>> keyIds;
+ return ParseCENCInitData(aInitData.Elements(), aInitData.Length(), keyIds);
+ } else if (aInitDataType.LowerCaseEqualsLiteral("keyids")) {
+ if (aInitData.Length() > MAX_KEY_ID_LENGTH) {
+ return false;
+ }
+ // Ensure that init data matches the expected JSON format.
+ mozilla::dom::KeyIdsInitData keyIds;
+ nsString json;
+ nsDependentCSubstring raw(reinterpret_cast<const char*>(aInitData.Elements()), aInitData.Length());
+ if (NS_FAILED(nsContentUtils::ConvertStringFromEncoding(NS_LITERAL_CSTRING("UTF-8"), raw, json))) {
+ return false;
+ }
+ if (!keyIds.Init(json)) {
+ return false;
+ }
+ if (keyIds.mKids.Length() == 0) {
+ return false;
+ }
+ for (const auto& kid : keyIds.mKids) {
+ if (kid.IsEmpty()) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+// Generates a license request based on the initData. A message of type
+// "license-request" or "individualization-request" will always be queued
+// if the algorithm succeeds and the promise is resolved.
+already_AddRefed<Promise>
+MediaKeySession::GenerateRequest(const nsAString& aInitDataType,
+ const ArrayBufferViewOrArrayBuffer& aInitData,
+ ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeySession.generateRequest")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ // If this object is closed, return a promise rejected with an InvalidStateError.
+ if (IsClosed()) {
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, closed",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Session is closed in MediaKeySession.generateRequest()"));
+ return promise.forget();
+ }
+
+ // If this object's uninitialized value is false, return a promise rejected
+ // with an InvalidStateError.
+ if (!mUninitialized) {
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, uninitialized",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Session is already initialized in MediaKeySession.generateRequest()"));
+ return promise.forget();
+ }
+
+ // Let this object's uninitialized value be false.
+ mUninitialized = false;
+
+ // If initDataType is the empty string, return a promise rejected
+ // with a newly created TypeError.
+ if (aInitDataType.IsEmpty()) {
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Empty initDataType passed to MediaKeySession.generateRequest()"));
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, empty initDataType",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+
+ // If initData is an empty array, return a promise rejected with
+ // a newly created TypeError.
+ nsTArray<uint8_t> data;
+ CopyArrayBufferViewOrArrayBufferData(aInitData, data);
+ if (data.IsEmpty()) {
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Empty initData passed to MediaKeySession.generateRequest()"));
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, empty initData",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+
+ // If the Key System implementation represented by this object's
+ // cdm implementation value does not support initDataType as an
+ // Initialization Data Type, return a promise rejected with a
+ // NotSupportedError. String comparison is case-sensitive.
+ if (!MediaKeySystemAccess::KeySystemSupportsInitDataType(mKeySystem, aInitDataType)) {
+ promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR,
+ NS_LITERAL_CSTRING("Unsupported initDataType passed to MediaKeySession.generateRequest()"));
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() failed, unsupported initDataType",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+
+ // Let init data be a copy of the contents of the initData parameter.
+ // Note: Handled by the CopyArrayBufferViewOrArrayBufferData call above.
+
+ // Let session type be this object's session type.
+
+ // Let promise be a new promise.
+
+ // Run the following steps in parallel:
+
+ // If the init data is not valid for initDataType, reject promise with
+ // a newly created TypeError.
+ if (!ValidateInitData(data, aInitDataType)) {
+ // If the preceding step failed, reject promise with a newly created TypeError.
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("initData sanitization failed in MediaKeySession.generateRequest()"));
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() initData sanitization failed",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+
+ // Let sanitized init data be a validated and sanitized version of init data.
+
+ // If sanitized init data is empty, reject promise with a NotSupportedError.
+
+ // Note: Remaining steps of generateRequest method continue in CDM.
+
+ Telemetry::Accumulate(Telemetry::VIDEO_CDM_GENERATE_REQUEST_CALLED,
+ ToCDMTypeTelemetryEnum(mKeySystem));
+
+ // Convert initData to base64 for easier logging.
+ // Note: CreateSession() Move()s the data out of the array, so we have
+ // to copy it here.
+ nsAutoCString base64InitData(ToBase64(data));
+ PromiseId pid = mKeys->StorePromise(promise);
+ mKeys->ConnectPendingPromiseIdWithToken(pid, Token());
+ mKeys->GetCDMProxy()->CreateSession(Token(),
+ mSessionType,
+ pid,
+ aInitDataType, data);
+
+ EME_LOG("MediaKeySession[%p,'%s'] GenerateRequest() sent, "
+ "promiseId=%d initData(base64)='%s' initDataType='%s'",
+ this,
+ NS_ConvertUTF16toUTF8(mSessionId).get(),
+ pid,
+ base64InitData.get(),
+ NS_ConvertUTF16toUTF8(aInitDataType).get());
+
+ return promise.forget();
+}
+
+already_AddRefed<Promise>
+MediaKeySession::Load(const nsAString& aSessionId, ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeySession.load")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ // 1. If this object is closed, return a promise rejected with an InvalidStateError.
+ if (IsClosed()) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Session is closed in MediaKeySession.load()"));
+ EME_LOG("MediaKeySession[%p,'%s'] Load() failed, closed",
+ this, NS_ConvertUTF16toUTF8(aSessionId).get());
+ return promise.forget();
+ }
+
+ // 2.If this object's uninitialized value is false, return a promise rejected
+ // with an InvalidStateError.
+ if (!mUninitialized) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Session is already initialized in MediaKeySession.load()"));
+ EME_LOG("MediaKeySession[%p,'%s'] Load() failed, uninitialized",
+ this, NS_ConvertUTF16toUTF8(aSessionId).get());
+ return promise.forget();
+ }
+
+ // 3.Let this object's uninitialized value be false.
+ mUninitialized = false;
+
+ // 4. If sessionId is the empty string, return a promise rejected with a newly created TypeError.
+ if (aSessionId.IsEmpty()) {
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Trying to load a session with empty session ID"));
+ // "The sessionId parameter is empty."
+ EME_LOG("MediaKeySession[%p,''] Load() failed, no sessionId", this);
+ return promise.forget();
+ }
+
+ // 5. If the result of running the Is persistent session type? algorithm
+ // on this object's session type is false, return a promise rejected with
+ // a newly created TypeError.
+ if (mSessionType == MediaKeySessionType::Temporary) {
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Trying to load() into a non-persistent session"));
+ EME_LOG("MediaKeySession[%p,''] Load() failed, can't load in a non-persistent session", this);
+ return promise.forget();
+ }
+
+ // Note: We don't support persistent sessions in any keysystem, so all calls
+ // to Load() should reject with a TypeError in the preceding check. Omitting
+ // implementing the rest of the specified MediaKeySession::Load() algorithm.
+
+ // We now know the sessionId being loaded into this session. Remove the
+ // session from its owning MediaKey's set of sessions awaiting a sessionId.
+ RefPtr<MediaKeySession> session(mKeys->GetPendingSession(Token()));
+ MOZ_ASSERT(session == this, "Session should be awaiting id on its own token");
+
+ // Associate with the known sessionId.
+ SetSessionId(aSessionId);
+
+ PromiseId pid = mKeys->StorePromise(promise);
+ mKeys->GetCDMProxy()->LoadSession(pid, aSessionId);
+
+ EME_LOG("MediaKeySession[%p,'%s'] Load() sent to CDM, promiseId=%d",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get(), pid);
+
+ return promise.forget();
+}
+
+already_AddRefed<Promise>
+MediaKeySession::Update(const ArrayBufferViewOrArrayBuffer& aResponse, ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeySession.update")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ if (!IsCallable()) {
+ // If this object's callable value is false, return a promise rejected
+ // with a new DOMException whose name is InvalidStateError.
+ EME_LOG("MediaKeySession[%p,''] Update() called before sessionId set by CDM", this);
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("MediaKeySession.Update() called before sessionId set by CDM"));
+ return promise.forget();
+ }
+
+ nsTArray<uint8_t> data;
+ if (IsClosed() || !mKeys->GetCDMProxy()) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Session is closed or was not properly initialized"));
+ EME_LOG("MediaKeySession[%p,'%s'] Update() failed, session is closed or was not properly initialised.",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+ CopyArrayBufferViewOrArrayBufferData(aResponse, data);
+ if (data.IsEmpty()) {
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Empty response buffer passed to MediaKeySession.update()"));
+ EME_LOG("MediaKeySession[%p,'%s'] Update() failed, empty response buffer",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+
+
+ // Convert response to base64 for easier logging.
+ // Note: UpdateSession() Move()s the data out of the array, so we have
+ // to copy it here.
+ nsAutoCString base64Response(ToBase64(data));
+
+ PromiseId pid = mKeys->StorePromise(promise);
+ mKeys->GetCDMProxy()->UpdateSession(mSessionId,
+ pid,
+ data);
+
+ EME_LOG("MediaKeySession[%p,'%s'] Update() sent to CDM, "
+ "promiseId=%d Response(base64)='%s'",
+ this,
+ NS_ConvertUTF16toUTF8(mSessionId).get(),
+ pid,
+ base64Response.get());
+
+ return promise.forget();
+}
+
+already_AddRefed<Promise>
+MediaKeySession::Close(ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeySession.close")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ // 1. Let session be the associated MediaKeySession object.
+ // 2. If session is closed, return a resolved promise.
+ if (IsClosed()) {
+ EME_LOG("MediaKeySession[%p,'%s'] Close() already closed",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ promise->MaybeResolveWithUndefined();
+ return promise.forget();
+ }
+ // 3. If session's callable value is false, return a promise rejected
+ // with an InvalidStateError.
+ if (!IsCallable()) {
+ EME_LOG("MediaKeySession[%p,''] Close() called before sessionId set by CDM", this);
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("MediaKeySession.Close() called before sessionId set by CDM"));
+ return promise.forget();
+ }
+ if (!mKeys->GetCDMProxy()) {
+ EME_LOG("MediaKeySession[%p,'%s'] Close() null CDMProxy",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("MediaKeySession.Close() lost reference to CDM"));
+ return promise.forget();
+ }
+ // 4. Let promise be a new promise.
+ PromiseId pid = mKeys->StorePromise(promise);
+ // 5. Run the following steps in parallel:
+ // 5.1 Let cdm be the CDM instance represented by session's cdm instance value.
+ // 5.2 Use cdm to close the session associated with session.
+ mKeys->GetCDMProxy()->CloseSession(mSessionId, pid);
+
+ EME_LOG("MediaKeySession[%p,'%s'] Close() sent to CDM, promiseId=%d",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get(), pid);
+
+ // Session Closed algorithm is run when CDM causes us to run OnSessionClosed().
+
+ // 6. Return promise.
+ return promise.forget();
+}
+
+void
+MediaKeySession::OnClosed()
+{
+ if (IsClosed()) {
+ return;
+ }
+ EME_LOG("MediaKeySession[%p,'%s'] session close operation complete.",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ mIsClosed = true;
+ mKeys->OnSessionClosed(this);
+ mKeys = nullptr;
+ mClosed->MaybeResolveWithUndefined();
+}
+
+bool
+MediaKeySession::IsClosed() const
+{
+ return mIsClosed;
+}
+
+already_AddRefed<Promise>
+MediaKeySession::Remove(ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeySession.remove")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ if (!IsCallable()) {
+ // If this object's callable value is false, return a promise rejected
+ // with a new DOMException whose name is InvalidStateError.
+ EME_LOG("MediaKeySession[%p,''] Remove() called before sessionId set by CDM", this);
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("MediaKeySession.Remove() called before sessionId set by CDM"));
+ return promise.forget();
+ }
+ if (mSessionType != MediaKeySessionType::Persistent_license) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR,
+ NS_LITERAL_CSTRING("Calling MediaKeySession.remove() on non-persistent session"));
+ // "The operation is not supported on session type sessions."
+ EME_LOG("MediaKeySession[%p,'%s'] Remove() failed, sesion not persisrtent.",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+ if (IsClosed() || !mKeys->GetCDMProxy()) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("MediaKeySesison.remove() called but session is not active"));
+ // "The session is closed."
+ EME_LOG("MediaKeySession[%p,'%s'] Remove() failed, already session closed.",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get());
+ return promise.forget();
+ }
+ PromiseId pid = mKeys->StorePromise(promise);
+ mKeys->GetCDMProxy()->RemoveSession(mSessionId, pid);
+ EME_LOG("MediaKeySession[%p,'%s'] Remove() sent to CDM, promiseId=%d.",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get(), pid);
+
+ return promise.forget();
+}
+
+void
+MediaKeySession::DispatchKeyMessage(MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage)
+{
+ if (EME_LOG_ENABLED()) {
+ EME_LOG("MediaKeySession[%p,'%s'] DispatchKeyMessage() type=%s message(base64)='%s'",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get(),
+ MediaKeyMessageTypeValues::strings[uint32_t(aMessageType)].value,
+ ToBase64(aMessage).get());
+ }
+
+ RefPtr<MediaKeyMessageEvent> event(
+ MediaKeyMessageEvent::Constructor(this, aMessageType, aMessage));
+ RefPtr<AsyncEventDispatcher> asyncDispatcher =
+ new AsyncEventDispatcher(this, event);
+ asyncDispatcher->PostDOMEvent();
+}
+
+void
+MediaKeySession::DispatchKeyError(uint32_t aSystemCode)
+{
+ EME_LOG("MediaKeySession[%p,'%s'] DispatchKeyError() systemCode=%u.",
+ this, NS_ConvertUTF16toUTF8(mSessionId).get(), aSystemCode);
+
+ RefPtr<MediaKeyError> event(new MediaKeyError(this, aSystemCode));
+ RefPtr<AsyncEventDispatcher> asyncDispatcher =
+ new AsyncEventDispatcher(this, event);
+ asyncDispatcher->PostDOMEvent();
+}
+
+void
+MediaKeySession::DispatchKeyStatusesChange()
+{
+ if (IsClosed()) {
+ return;
+ }
+
+ UpdateKeyStatusMap();
+
+ RefPtr<AsyncEventDispatcher> asyncDispatcher =
+ new AsyncEventDispatcher(this, NS_LITERAL_STRING("keystatuseschange"), false);
+ asyncDispatcher->PostDOMEvent();
+}
+
+uint32_t
+MediaKeySession::Token() const
+{
+ return mToken;
+}
+
+already_AddRefed<DetailedPromise>
+MediaKeySession::MakePromise(ErrorResult& aRv, const nsACString& aName)
+{
+ nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject());
+ if (!global) {
+ NS_WARNING("Passed non-global to MediaKeys ctor!");
+ aRv.Throw(NS_ERROR_UNEXPECTED);
+ return nullptr;
+ }
+ return DetailedPromise::Create(global, aRv, aName);
+}
+
+void
+MediaKeySession::SetExpiration(double aExpiration)
+{
+ EME_LOG("MediaKeySession[%p,'%s'] SetExpiry(%lf)",
+ this,
+ NS_ConvertUTF16toUTF8(mSessionId).get(),
+ aExpiration);
+ mExpiration = aExpiration;
+}
+
+EventHandlerNonNull*
+MediaKeySession::GetOnkeystatuseschange()
+{
+ return GetEventHandler(nsGkAtoms::onkeystatuseschange, EmptyString());
+}
+
+void
+MediaKeySession::SetOnkeystatuseschange(EventHandlerNonNull* aCallback)
+{
+ SetEventHandler(nsGkAtoms::onkeystatuseschange, EmptyString(), aCallback);
+}
+
+EventHandlerNonNull*
+MediaKeySession::GetOnmessage()
+{
+ return GetEventHandler(nsGkAtoms::onmessage, EmptyString());
+}
+
+void
+MediaKeySession::SetOnmessage(EventHandlerNonNull* aCallback)
+{
+ SetEventHandler(nsGkAtoms::onmessage, EmptyString(), aCallback);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeySession.h b/dom/media/eme/MediaKeySession.h
new file mode 100644
index 000000000..40481df99
--- /dev/null
+++ b/dom/media/eme/MediaKeySession.h
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeySession_h
+#define mozilla_dom_MediaKeySession_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "nsCycleCollectionParticipant.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "nsCOMPtr.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/dom/Date.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/DetailedPromise.h"
+#include "mozilla/dom/MediaKeySessionBinding.h"
+#include "mozilla/dom/MediaKeysBinding.h"
+#include "mozilla/dom/MediaKeyMessageEventBinding.h"
+
+struct JSContext;
+
+namespace mozilla {
+namespace dom {
+
+class ArrayBufferViewOrArrayBuffer;
+class MediaKeyError;
+class MediaKeyStatusMap;
+
+class MediaKeySession final : public DOMEventTargetHelper
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaKeySession,
+ DOMEventTargetHelper)
+public:
+ MediaKeySession(JSContext* aCx,
+ nsPIDOMWindowInner* aParent,
+ MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ MediaKeySessionType aSessionType,
+ ErrorResult& aRv);
+
+ void SetSessionId(const nsAString& aSessionId);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // Mark this as resultNotAddRefed to return raw pointers
+ MediaKeyError* GetError() const;
+
+ MediaKeyStatusMap* KeyStatuses() const;
+
+ void GetKeySystem(nsString& aRetval) const;
+
+ void GetSessionId(nsString& aRetval) const;
+
+ const nsString& GetSessionId() const;
+
+ // Number of ms since epoch at which expiration occurs, or NaN if unknown.
+ // TODO: The type of this attribute is still under contention.
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=25902
+ double Expiration() const;
+
+ Promise* Closed() const;
+
+ already_AddRefed<Promise> GenerateRequest(const nsAString& aInitDataType,
+ const ArrayBufferViewOrArrayBuffer& aInitData,
+ ErrorResult& aRv);
+
+ already_AddRefed<Promise> Load(const nsAString& aSessionId,
+ ErrorResult& aRv);
+
+ already_AddRefed<Promise> Update(const ArrayBufferViewOrArrayBuffer& response,
+ ErrorResult& aRv);
+
+ already_AddRefed<Promise> Close(ErrorResult& aRv);
+
+ already_AddRefed<Promise> Remove(ErrorResult& aRv);
+
+ void DispatchKeyMessage(MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage);
+
+ void DispatchKeyError(uint32_t system_code);
+
+ void DispatchKeyStatusesChange();
+
+ void OnClosed();
+
+ bool IsClosed() const;
+
+ void SetExpiration(double aExpiry);
+
+ mozilla::dom::EventHandlerNonNull* GetOnkeystatuseschange();
+ void SetOnkeystatuseschange(mozilla::dom::EventHandlerNonNull* aCallback);
+
+ mozilla::dom::EventHandlerNonNull* GetOnmessage();
+ void SetOnmessage(mozilla::dom::EventHandlerNonNull* aCallback);
+
+ // Process-unique identifier.
+ uint32_t Token() const;
+
+private:
+ ~MediaKeySession();
+
+ void UpdateKeyStatusMap();
+
+ bool IsCallable() const {
+ // The EME spec sets the "callable value" to true whenever the CDM sets
+ // the sessionId. When the session is initialized, sessionId is empty and
+ // callable is thus false.
+ return !mSessionId.IsEmpty();
+ }
+
+ already_AddRefed<DetailedPromise> MakePromise(ErrorResult& aRv,
+ const nsACString& aName);
+
+ RefPtr<DetailedPromise> mClosed;
+
+ RefPtr<MediaKeyError> mMediaKeyError;
+ RefPtr<MediaKeys> mKeys;
+ const nsString mKeySystem;
+ nsString mSessionId;
+ const MediaKeySessionType mSessionType;
+ const uint32_t mToken;
+ bool mIsClosed;
+ bool mUninitialized;
+ RefPtr<MediaKeyStatusMap> mKeyStatusMap;
+ double mExpiration;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/eme/MediaKeyStatusMap.cpp b/dom/media/eme/MediaKeyStatusMap.cpp
new file mode 100644
index 000000000..5af6ff535
--- /dev/null
+++ b/dom/media/eme/MediaKeyStatusMap.cpp
@@ -0,0 +1,121 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaKeyStatusMap.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/dom/UnionTypes.h"
+#include "mozilla/dom/ToJSValue.h"
+#include "mozilla/EMEUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaKeyStatusMap)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaKeyStatusMap)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeyStatusMap)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(MediaKeyStatusMap, mParent)
+
+MediaKeyStatusMap::MediaKeyStatusMap(nsPIDOMWindowInner* aParent)
+ : mParent(aParent)
+{
+}
+
+MediaKeyStatusMap::~MediaKeyStatusMap()
+{
+}
+
+JSObject*
+MediaKeyStatusMap::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaKeyStatusMapBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+MediaKeyStatusMap::GetParentObject() const
+{
+ return mParent;
+}
+
+void
+MediaKeyStatusMap::Get(JSContext* aCx,
+ const ArrayBufferViewOrArrayBuffer& aKey,
+ JS::MutableHandle<JS::Value> aOutValue,
+ ErrorResult& aOutRv) const
+{
+ ArrayData keyId = GetArrayBufferViewOrArrayBufferData(aKey);
+ if (!keyId.IsValid()) {
+ aOutValue.setUndefined();
+ return;
+ }
+ for (const KeyStatus& status : mStatuses) {
+ if (keyId == status.mKeyId) {
+ bool ok = ToJSValue(aCx, status.mStatus, aOutValue);
+ if (!ok) {
+ aOutRv.NoteJSContextException(aCx);
+ }
+ return;
+ }
+ }
+ aOutValue.setUndefined();
+}
+
+bool
+MediaKeyStatusMap::Has(const ArrayBufferViewOrArrayBuffer& aKey) const
+{
+ ArrayData keyId = GetArrayBufferViewOrArrayBufferData(aKey);
+ if (!keyId.IsValid()) {
+ return false;
+ }
+
+ for (const KeyStatus& status : mStatuses) {
+ if (keyId == status.mKeyId) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+uint32_t
+MediaKeyStatusMap::GetIterableLength() const
+{
+ return mStatuses.Length();
+}
+
+TypedArrayCreator<ArrayBuffer>
+MediaKeyStatusMap::GetKeyAtIndex(uint32_t aIndex) const
+{
+ MOZ_ASSERT(aIndex < GetIterableLength());
+ return TypedArrayCreator<ArrayBuffer>(mStatuses[aIndex].mKeyId);
+}
+
+MediaKeyStatus
+MediaKeyStatusMap::GetValueAtIndex(uint32_t aIndex) const
+{
+ MOZ_ASSERT(aIndex < GetIterableLength());
+ return mStatuses[aIndex].mStatus;
+}
+
+uint32_t
+MediaKeyStatusMap::Size() const
+{
+ return mStatuses.Length();
+}
+
+void
+MediaKeyStatusMap::Update(const nsTArray<CDMCaps::KeyStatus>& aKeys)
+{
+ mStatuses.Clear();
+ for (const auto& key : aKeys) {
+ mStatuses.InsertElementSorted(KeyStatus(key.mId, key.mStatus));
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeyStatusMap.h b/dom/media/eme/MediaKeyStatusMap.h
new file mode 100644
index 000000000..396ae500e
--- /dev/null
+++ b/dom/media/eme/MediaKeyStatusMap.h
@@ -0,0 +1,97 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeyStatuses_h
+#define mozilla_dom_MediaKeyStatuses_h
+
+#include "mozilla/ErrorResult.h"
+#include "mozilla/Attributes.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/dom/MediaKeyStatusMapBinding.h"
+#include "mozilla/CDMCaps.h"
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+namespace dom {
+
+class ArrayBufferViewOrArrayBuffer;
+
+// The MediaKeyStatusMap WebIDL interface; maps a keyId to its status.
+// Note that the underlying "map" is stored in an array, since we assume
+// that a MediaKeySession won't have many key statuses to report.
+class MediaKeyStatusMap final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MediaKeyStatusMap)
+
+public:
+ explicit MediaKeyStatusMap(nsPIDOMWindowInner* aParent);
+
+protected:
+ ~MediaKeyStatusMap();
+
+public:
+ nsPIDOMWindowInner* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void Get(JSContext* aCx,
+ const ArrayBufferViewOrArrayBuffer& aKey,
+ JS::MutableHandle<JS::Value> aOutValue,
+ ErrorResult& aOutRv) const;
+ bool Has(const ArrayBufferViewOrArrayBuffer& aKey) const;
+ uint32_t Size() const;
+
+ uint32_t GetIterableLength() const;
+ TypedArrayCreator<ArrayBuffer> GetKeyAtIndex(uint32_t aIndex) const;
+ MediaKeyStatus GetValueAtIndex(uint32_t aIndex) const;
+
+ void Update(const nsTArray<CDMCaps::KeyStatus>& keys);
+
+private:
+
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+
+ struct KeyStatus {
+ KeyStatus(const nsTArray<uint8_t>& aKeyId,
+ MediaKeyStatus aStatus)
+ : mKeyId(aKeyId)
+ , mStatus(aStatus)
+ {
+ }
+ bool operator== (const KeyStatus& aOther) const {
+ return aOther.mKeyId == mKeyId;
+ }
+ bool operator<(const KeyStatus& aOther) const {
+ // Copy chromium and compare keys' bytes.
+ // Update once https://github.com/w3c/encrypted-media/issues/69
+ // is resolved.
+ const nsTArray<uint8_t>& other = aOther.mKeyId;
+ const nsTArray<uint8_t>& self = mKeyId;
+ size_t length = std::min<size_t>(other.Length(), self.Length());
+ int cmp = memcmp(self.Elements(), other.Elements(), length);
+ if (cmp != 0) {
+ return cmp < 0;
+ }
+ return self.Length() <= other.Length();
+ }
+ nsTArray<uint8_t> mKeyId;
+ MediaKeyStatus mStatus;
+ };
+
+ nsTArray<KeyStatus> mStatuses;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/eme/MediaKeySystemAccess.cpp b/dom/media/eme/MediaKeySystemAccess.cpp
new file mode 100644
index 000000000..7007d3a03
--- /dev/null
+++ b/dom/media/eme/MediaKeySystemAccess.cpp
@@ -0,0 +1,1135 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaKeySystemAccess.h"
+#include "mozilla/dom/MediaKeySystemAccessBinding.h"
+#include "mozilla/Preferences.h"
+#include "MediaPrefs.h"
+#include "nsContentTypeParser.h"
+#ifdef MOZ_FMP4
+#include "MP4Decoder.h"
+#endif
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#include "WMFDecoderModule.h"
+#endif
+#include "nsContentCID.h"
+#include "nsServiceManagerUtils.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "VideoUtils.h"
+#include "mozilla/Services.h"
+#include "nsIObserverService.h"
+#include "mozilla/EMEUtils.h"
+#include "GMPUtils.h"
+#include "nsAppDirectoryServiceDefs.h"
+#include "nsDirectoryServiceUtils.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsXULAppAPI.h"
+#include "gmp-audio-decode.h"
+#include "gmp-video-decode.h"
+#include "DecoderDoctorDiagnostics.h"
+#include "WebMDecoder.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "nsUnicharUtils.h"
+#include "mozilla/dom/MediaSource.h"
+#ifdef MOZ_WIDGET_ANDROID
+#include "FennecJNIWrappers.h"
+#endif
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(MediaKeySystemAccess,
+ mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaKeySystemAccess)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaKeySystemAccess)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeySystemAccess)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+MediaKeySystemAccess::MediaKeySystemAccess(nsPIDOMWindowInner* aParent,
+ const nsAString& aKeySystem,
+ const MediaKeySystemConfiguration& aConfig)
+ : mParent(aParent)
+ , mKeySystem(aKeySystem)
+ , mConfig(aConfig)
+{
+}
+
+MediaKeySystemAccess::~MediaKeySystemAccess()
+{
+}
+
+JSObject*
+MediaKeySystemAccess::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaKeySystemAccessBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsPIDOMWindowInner*
+MediaKeySystemAccess::GetParentObject() const
+{
+ return mParent;
+}
+
+void
+MediaKeySystemAccess::GetKeySystem(nsString& aOutKeySystem) const
+{
+ aOutKeySystem.Assign(mKeySystem);
+}
+
+void
+MediaKeySystemAccess::GetConfiguration(MediaKeySystemConfiguration& aConfig)
+{
+ aConfig = mConfig;
+}
+
+already_AddRefed<Promise>
+MediaKeySystemAccess::CreateMediaKeys(ErrorResult& aRv)
+{
+ RefPtr<MediaKeys> keys(new MediaKeys(mParent,
+ mKeySystem,
+ mConfig));
+ return keys->Init(aRv);
+}
+
+static bool
+HavePluginForKeySystem(const nsCString& aKeySystem)
+{
+ bool havePlugin = HaveGMPFor(NS_LITERAL_CSTRING(GMP_API_DECRYPTOR),
+ { aKeySystem });
+#ifdef MOZ_WIDGET_ANDROID
+ // Check if we can use MediaDrm for this keysystem.
+ if (!havePlugin) {
+ havePlugin = mozilla::java::MediaDrmProxy::IsSchemeSupported(aKeySystem);
+ }
+#endif
+ return havePlugin;
+}
+
+static MediaKeySystemStatus
+EnsureCDMInstalled(const nsAString& aKeySystem,
+ nsACString& aOutMessage)
+{
+ if (!HavePluginForKeySystem(NS_ConvertUTF16toUTF8(aKeySystem))) {
+ aOutMessage = NS_LITERAL_CSTRING("CDM is not installed");
+ return MediaKeySystemStatus::Cdm_not_installed;
+ }
+
+ return MediaKeySystemStatus::Available;
+}
+
+/* static */
+MediaKeySystemStatus
+MediaKeySystemAccess::GetKeySystemStatus(const nsAString& aKeySystem,
+ nsACString& aOutMessage)
+{
+ MOZ_ASSERT(MediaPrefs::EMEEnabled() || IsClearkeyKeySystem(aKeySystem));
+
+ if (IsClearkeyKeySystem(aKeySystem)) {
+ return EnsureCDMInstalled(aKeySystem, aOutMessage);
+ }
+
+ if (Preferences::GetBool("media.gmp-eme-adobe.visible", false)) {
+ if (IsPrimetimeKeySystem(aKeySystem)) {
+ if (!Preferences::GetBool("media.gmp-eme-adobe.enabled", false)) {
+ aOutMessage = NS_LITERAL_CSTRING("Adobe EME disabled");
+ return MediaKeySystemStatus::Cdm_disabled;
+ }
+#ifdef XP_WIN
+ // Win Vista and later only.
+ if (!IsVistaOrLater()) {
+ aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Adobe EME");
+ return MediaKeySystemStatus::Cdm_not_supported;
+ }
+#endif
+ return EnsureCDMInstalled(aKeySystem, aOutMessage);
+ }
+ }
+
+ if (IsWidevineKeySystem(aKeySystem)) {
+ if (Preferences::GetBool("media.gmp-widevinecdm.visible", false)) {
+#ifdef XP_WIN
+ // Win Vista and later only.
+ if (!IsVistaOrLater()) {
+ aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Widevine EME");
+ return MediaKeySystemStatus::Cdm_not_supported;
+ }
+#endif
+ if (!Preferences::GetBool("media.gmp-widevinecdm.enabled", false)) {
+ aOutMessage = NS_LITERAL_CSTRING("Widevine EME disabled");
+ return MediaKeySystemStatus::Cdm_disabled;
+ }
+ return EnsureCDMInstalled(aKeySystem, aOutMessage);
+#ifdef MOZ_WIDGET_ANDROID
+ } else if (Preferences::GetBool("media.mediadrm-widevinecdm.visible", false)) {
+ nsCString keySystem = NS_ConvertUTF16toUTF8(aKeySystem);
+ bool supported = mozilla::java::MediaDrmProxy::IsSchemeSupported(keySystem);
+ if (!supported) {
+ aOutMessage = NS_LITERAL_CSTRING("Widevine CDM is not available");
+ return MediaKeySystemStatus::Cdm_not_installed;
+ }
+ return MediaKeySystemStatus::Available;
+#endif
+ }
+ }
+
+ return MediaKeySystemStatus::Cdm_not_supported;
+}
+
+typedef nsCString EMECodecString;
+
+static NS_NAMED_LITERAL_CSTRING(EME_CODEC_AAC, "aac");
+static NS_NAMED_LITERAL_CSTRING(EME_CODEC_OPUS, "opus");
+static NS_NAMED_LITERAL_CSTRING(EME_CODEC_VORBIS, "vorbis");
+static NS_NAMED_LITERAL_CSTRING(EME_CODEC_H264, "h264");
+static NS_NAMED_LITERAL_CSTRING(EME_CODEC_VP8, "vp8");
+static NS_NAMED_LITERAL_CSTRING(EME_CODEC_VP9, "vp9");
+
+EMECodecString
+ToEMEAPICodecString(const nsString& aCodec)
+{
+ if (IsAACCodecString(aCodec)) {
+ return EME_CODEC_AAC;
+ }
+ if (aCodec.EqualsLiteral("opus")) {
+ return EME_CODEC_OPUS;
+ }
+ if (aCodec.EqualsLiteral("vorbis")) {
+ return EME_CODEC_VORBIS;
+ }
+ if (IsH264CodecString(aCodec)) {
+ return EME_CODEC_H264;
+ }
+ if (IsVP8CodecString(aCodec)) {
+ return EME_CODEC_VP8;
+ }
+ if (IsVP9CodecString(aCodec)) {
+ return EME_CODEC_VP9;
+ }
+ return EmptyCString();
+}
+
+// A codec can be decrypted-and-decoded by the CDM, or only decrypted
+// by the CDM and decoded by Gecko. Not both.
+struct KeySystemContainerSupport
+{
+ bool IsSupported() const
+ {
+ return !mCodecsDecoded.IsEmpty() || !mCodecsDecrypted.IsEmpty();
+ }
+
+ // CDM decrypts and decodes using a DRM robust decoder, and passes decoded
+ // samples back to Gecko for rendering.
+ bool DecryptsAndDecodes(EMECodecString aCodec) const
+ {
+ return mCodecsDecoded.Contains(aCodec);
+ }
+
+ // CDM decrypts and passes the decrypted samples back to Gecko for decoding.
+ bool Decrypts(EMECodecString aCodec) const
+ {
+ return mCodecsDecrypted.Contains(aCodec);
+ }
+
+ void SetCanDecryptAndDecode(EMECodecString aCodec)
+ {
+ // Can't both decrypt and decrypt-and-decode a codec.
+ MOZ_ASSERT(!Decrypts(aCodec));
+ // Prevent duplicates.
+ MOZ_ASSERT(!DecryptsAndDecodes(aCodec));
+ mCodecsDecoded.AppendElement(aCodec);
+ }
+
+ void SetCanDecrypt(EMECodecString aCodec)
+ {
+ // Prevent duplicates.
+ MOZ_ASSERT(!Decrypts(aCodec));
+ // Can't both decrypt and decrypt-and-decode a codec.
+ MOZ_ASSERT(!DecryptsAndDecodes(aCodec));
+ mCodecsDecrypted.AppendElement(aCodec);
+ }
+
+private:
+ nsTArray<EMECodecString> mCodecsDecoded;
+ nsTArray<EMECodecString> mCodecsDecrypted;
+};
+
+enum class KeySystemFeatureSupport
+{
+ Prohibited = 1,
+ Requestable = 2,
+ Required = 3,
+};
+
+struct KeySystemConfig
+{
+ nsString mKeySystem;
+ nsTArray<nsString> mInitDataTypes;
+ KeySystemFeatureSupport mPersistentState = KeySystemFeatureSupport::Prohibited;
+ KeySystemFeatureSupport mDistinctiveIdentifier = KeySystemFeatureSupport::Prohibited;
+ nsTArray<MediaKeySessionType> mSessionTypes;
+ nsTArray<nsString> mVideoRobustness;
+ nsTArray<nsString> mAudioRobustness;
+ KeySystemContainerSupport mMP4;
+ KeySystemContainerSupport mWebM;
+};
+
+static nsTArray<KeySystemConfig>
+GetSupportedKeySystems()
+{
+ nsTArray<KeySystemConfig> keySystemConfigs;
+
+ {
+ if (HavePluginForKeySystem(kEMEKeySystemClearkey)) {
+ KeySystemConfig clearkey;
+ clearkey.mKeySystem = NS_ConvertUTF8toUTF16(kEMEKeySystemClearkey);
+ clearkey.mInitDataTypes.AppendElement(NS_LITERAL_STRING("cenc"));
+ clearkey.mInitDataTypes.AppendElement(NS_LITERAL_STRING("keyids"));
+ clearkey.mInitDataTypes.AppendElement(NS_LITERAL_STRING("webm"));
+ clearkey.mPersistentState = KeySystemFeatureSupport::Requestable;
+ clearkey.mDistinctiveIdentifier = KeySystemFeatureSupport::Prohibited;
+ clearkey.mSessionTypes.AppendElement(MediaKeySessionType::Temporary);
+ if (MediaPrefs::ClearKeyPersistentLicenseEnabled()) {
+ clearkey.mSessionTypes.AppendElement(MediaKeySessionType::Persistent_license);
+ }
+#if defined(XP_WIN)
+ // Clearkey CDM uses WMF decoders on Windows.
+ if (WMFDecoderModule::HasAAC()) {
+ clearkey.mMP4.SetCanDecryptAndDecode(EME_CODEC_AAC);
+ } else {
+ clearkey.mMP4.SetCanDecrypt(EME_CODEC_AAC);
+ }
+ if (WMFDecoderModule::HasH264()) {
+ clearkey.mMP4.SetCanDecryptAndDecode(EME_CODEC_H264);
+ } else {
+ clearkey.mMP4.SetCanDecrypt(EME_CODEC_H264);
+ }
+#else
+ clearkey.mMP4.SetCanDecrypt(EME_CODEC_AAC);
+ clearkey.mMP4.SetCanDecrypt(EME_CODEC_H264);
+#endif
+ clearkey.mWebM.SetCanDecrypt(EME_CODEC_VORBIS);
+ clearkey.mWebM.SetCanDecrypt(EME_CODEC_OPUS);
+ clearkey.mWebM.SetCanDecrypt(EME_CODEC_VP8);
+ clearkey.mWebM.SetCanDecrypt(EME_CODEC_VP9);
+ keySystemConfigs.AppendElement(Move(clearkey));
+ }
+ }
+ {
+ if (HavePluginForKeySystem(kEMEKeySystemWidevine)) {
+ KeySystemConfig widevine;
+ widevine.mKeySystem = NS_ConvertUTF8toUTF16(kEMEKeySystemWidevine);
+ widevine.mInitDataTypes.AppendElement(NS_LITERAL_STRING("cenc"));
+ widevine.mInitDataTypes.AppendElement(NS_LITERAL_STRING("keyids"));
+ widevine.mInitDataTypes.AppendElement(NS_LITERAL_STRING("webm"));
+ widevine.mPersistentState = KeySystemFeatureSupport::Requestable;
+ widevine.mDistinctiveIdentifier = KeySystemFeatureSupport::Prohibited;
+ widevine.mSessionTypes.AppendElement(MediaKeySessionType::Temporary);
+#ifdef MOZ_WIDGET_ANDROID
+ widevine.mSessionTypes.AppendElement(MediaKeySessionType::Persistent_license);
+#endif
+ widevine.mAudioRobustness.AppendElement(NS_LITERAL_STRING("SW_SECURE_CRYPTO"));
+ widevine.mVideoRobustness.AppendElement(NS_LITERAL_STRING("SW_SECURE_DECODE"));
+#if defined(XP_WIN)
+ // Widevine CDM doesn't include an AAC decoder. So if WMF can't
+ // decode AAC, and a codec wasn't specified, be conservative
+ // and reject the MediaKeys request, since our policy is to prevent
+ // the Adobe GMP's unencrypted AAC decoding path being used to
+ // decode content decrypted by the Widevine CDM.
+ if (WMFDecoderModule::HasAAC()) {
+ widevine.mMP4.SetCanDecrypt(EME_CODEC_AAC);
+ }
+#elif !defined(MOZ_WIDGET_ANDROID)
+ widevine.mMP4.SetCanDecrypt(EME_CODEC_AAC);
+#endif
+
+#if defined(MOZ_WIDGET_ANDROID)
+ using namespace mozilla::java;
+ // MediaDrm.isCryptoSchemeSupported only allows passing
+ // "video/mp4" or "video/webm" for mimetype string.
+ // See https://developer.android.com/reference/android/media/MediaDrm.html#isCryptoSchemeSupported(java.util.UUID, java.lang.String)
+ // for more detail.
+ typedef struct {
+ const nsCString& mMimeType;
+ const nsCString& mEMECodecType;
+ const char16_t* mCodecType;
+ KeySystemContainerSupport* mSupportType;
+ } DataForValidation;
+
+ DataForValidation validationList[] = {
+ { nsCString("video/mp4"), EME_CODEC_H264, MediaDrmProxy::AVC, &widevine.mMP4 },
+ { nsCString("audio/mp4"), EME_CODEC_AAC, MediaDrmProxy::AAC, &widevine.mMP4 },
+ { nsCString("video/webm"), EME_CODEC_VP8, MediaDrmProxy::VP8, &widevine.mWebM },
+ { nsCString("video/webm"), EME_CODEC_VP9, MediaDrmProxy::VP9, &widevine.mWebM},
+ { nsCString("audio/webm"), EME_CODEC_VORBIS, MediaDrmProxy::VORBIS, &widevine.mWebM},
+ { nsCString("audio/webm"), EME_CODEC_OPUS, MediaDrmProxy::OPUS, &widevine.mWebM},
+ };
+
+ for (const auto& data: validationList) {
+ if (MediaDrmProxy::IsCryptoSchemeSupported(kEMEKeySystemWidevine,
+ data.mMimeType)) {
+ if (MediaDrmProxy::CanDecode(data.mCodecType)) {
+ data.mSupportType->SetCanDecryptAndDecode(data.mEMECodecType);
+ } else {
+ data.mSupportType->SetCanDecrypt(data.mEMECodecType);
+ }
+ }
+ }
+#else
+ widevine.mMP4.SetCanDecryptAndDecode(EME_CODEC_H264);
+ widevine.mWebM.SetCanDecrypt(EME_CODEC_VORBIS);
+ widevine.mWebM.SetCanDecrypt(EME_CODEC_OPUS);
+ widevine.mWebM.SetCanDecryptAndDecode(EME_CODEC_VP8);
+ widevine.mWebM.SetCanDecryptAndDecode(EME_CODEC_VP9);
+#endif
+ keySystemConfigs.AppendElement(Move(widevine));
+ }
+ }
+ {
+ if (HavePluginForKeySystem(kEMEKeySystemPrimetime)) {
+ KeySystemConfig primetime;
+ primetime.mKeySystem = NS_ConvertUTF8toUTF16(kEMEKeySystemPrimetime);
+ primetime.mInitDataTypes.AppendElement(NS_LITERAL_STRING("cenc"));
+ primetime.mPersistentState = KeySystemFeatureSupport::Required;
+ primetime.mDistinctiveIdentifier = KeySystemFeatureSupport::Required;
+ primetime.mSessionTypes.AppendElement(MediaKeySessionType::Temporary);
+ primetime.mMP4.SetCanDecryptAndDecode(EME_CODEC_AAC);
+ primetime.mMP4.SetCanDecryptAndDecode(EME_CODEC_H264);
+ keySystemConfigs.AppendElement(Move(primetime));
+ }
+ }
+
+ return keySystemConfigs;
+}
+
+static bool
+GetKeySystemConfig(const nsAString& aKeySystem, KeySystemConfig& aOutKeySystemConfig)
+{
+ for (auto&& config : GetSupportedKeySystems()) {
+ if (config.mKeySystem.Equals(aKeySystem)) {
+ aOutKeySystemConfig = mozilla::Move(config);
+ return true;
+ }
+ }
+ // No matching key system found.
+ return false;
+}
+
+/* static */
+bool
+MediaKeySystemAccess::KeySystemSupportsInitDataType(const nsAString& aKeySystem,
+ const nsAString& aInitDataType)
+{
+ KeySystemConfig implementation;
+ return GetKeySystemConfig(aKeySystem, implementation) &&
+ implementation.mInitDataTypes.Contains(aInitDataType);
+}
+
+enum CodecType
+{
+ Audio,
+ Video,
+ Invalid
+};
+
+static bool
+CanDecryptAndDecode(const nsString& aKeySystem,
+ const nsString& aContentType,
+ CodecType aCodecType,
+ const KeySystemContainerSupport& aContainerSupport,
+ const nsTArray<EMECodecString>& aCodecs,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ MOZ_ASSERT(aCodecType != Invalid);
+ for (const EMECodecString& codec : aCodecs) {
+ MOZ_ASSERT(!codec.IsEmpty());
+
+ if (aContainerSupport.DecryptsAndDecodes(codec)) {
+ // GMP can decrypt-and-decode this codec.
+ continue;
+ }
+
+ if (aContainerSupport.Decrypts(codec) &&
+ NS_SUCCEEDED(MediaSource::IsTypeSupported(aContentType, aDiagnostics))) {
+ // GMP can decrypt and is allowed to return compressed samples to
+ // Gecko to decode, and Gecko has a decoder.
+ continue;
+ }
+
+ // Neither the GMP nor Gecko can both decrypt and decode. We don't
+ // support this codec.
+
+#if defined(XP_WIN)
+ // Widevine CDM doesn't include an AAC decoder. So if WMF can't
+ // decode AAC, and a codec wasn't specified, be conservative
+ // and reject the MediaKeys request, since our policy is to prevent
+ // the Adobe GMP's unencrypted AAC decoding path being used to
+ // decode content decrypted by the Widevine CDM.
+ if (codec == EME_CODEC_AAC &&
+ IsWidevineKeySystem(aKeySystem) &&
+ !WMFDecoderModule::HasAAC()) {
+ if (aDiagnostics) {
+ aDiagnostics->SetKeySystemIssue(
+ DecoderDoctorDiagnostics::eWidevineWithNoWMF);
+ }
+ }
+#endif
+ return false;
+ }
+ return true;
+}
+
+static bool
+ToSessionType(const nsAString& aSessionType, MediaKeySessionType& aOutType)
+{
+ using MediaKeySessionTypeValues::strings;
+ const char* temporary =
+ strings[static_cast<uint32_t>(MediaKeySessionType::Temporary)].value;
+ if (aSessionType.EqualsASCII(temporary)) {
+ aOutType = MediaKeySessionType::Temporary;
+ return true;
+ }
+ const char* persistentLicense =
+ strings[static_cast<uint32_t>(MediaKeySessionType::Persistent_license)].value;
+ if (aSessionType.EqualsASCII(persistentLicense)) {
+ aOutType = MediaKeySessionType::Persistent_license;
+ return true;
+ }
+ return false;
+}
+
+// 5.2.1 Is persistent session type?
+static bool
+IsPersistentSessionType(MediaKeySessionType aSessionType)
+{
+ return aSessionType == MediaKeySessionType::Persistent_license;
+}
+
+CodecType
+GetMajorType(const nsAString& aContentType)
+{
+ if (CaseInsensitiveFindInReadable(NS_LITERAL_STRING("audio/"), aContentType)) {
+ return Audio;
+ }
+ if (CaseInsensitiveFindInReadable(NS_LITERAL_STRING("video/"), aContentType)) {
+ return Video;
+ }
+ return Invalid;
+}
+
+static CodecType
+GetCodecType(const EMECodecString& aCodec)
+{
+ if (aCodec.Equals(EME_CODEC_AAC) ||
+ aCodec.Equals(EME_CODEC_OPUS) ||
+ aCodec.Equals(EME_CODEC_VORBIS)) {
+ return Audio;
+ }
+ if (aCodec.Equals(EME_CODEC_H264) ||
+ aCodec.Equals(EME_CODEC_VP8) ||
+ aCodec.Equals(EME_CODEC_VP9)) {
+ return Video;
+ }
+ return Invalid;
+}
+
+static bool
+AllCodecsOfType(const nsTArray<EMECodecString>& aCodecs, const CodecType aCodecType)
+{
+ for (const EMECodecString& codec : aCodecs) {
+ if (GetCodecType(codec) != aCodecType) {
+ return false;
+ }
+ }
+ return true;
+}
+
+static bool
+IsParameterUnrecognized(const nsAString& aContentType)
+{
+ nsAutoString contentType(aContentType);
+ contentType.StripWhitespace();
+
+ nsTArray<nsString> params;
+ nsAString::const_iterator start, end, semicolon, equalSign;
+ contentType.BeginReading(start);
+ contentType.EndReading(end);
+ semicolon = start;
+ // Find any substring between ';' & '='.
+ while (semicolon != end) {
+ if (FindCharInReadable(';', semicolon, end)) {
+ equalSign = ++semicolon;
+ if (FindCharInReadable('=', equalSign, end)) {
+ params.AppendElement(Substring(semicolon, equalSign));
+ semicolon = equalSign;
+ }
+ }
+ }
+
+ for (auto param : params) {
+ if (!param.LowerCaseEqualsLiteral("codecs") &&
+ !param.LowerCaseEqualsLiteral("profiles")) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// 3.1.2.3 Get Supported Capabilities for Audio/Video Type
+static Sequence<MediaKeySystemMediaCapability>
+GetSupportedCapabilities(const CodecType aCodecType,
+ const nsTArray<MediaKeySystemMediaCapability>& aRequestedCapabilities,
+ const MediaKeySystemConfiguration& aPartialConfig,
+ const KeySystemConfig& aKeySystem,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ // Let local accumulated configuration be a local copy of partial configuration.
+ // (Note: It's not necessary for us to maintain a local copy, as we don't need
+ // to test whether capabilites from previous calls to this algorithm work with
+ // the capabilities currently being considered in this call. )
+
+ // Let supported media capabilities be an empty sequence of
+ // MediaKeySystemMediaCapability dictionaries.
+ Sequence<MediaKeySystemMediaCapability> supportedCapabilities;
+
+ // For each requested media capability in requested media capabilities:
+ for (const MediaKeySystemMediaCapability& capabilities : aRequestedCapabilities) {
+ // Let content type be requested media capability's contentType member.
+ const nsString& contentType = capabilities.mContentType;
+ // Let robustness be requested media capability's robustness member.
+ const nsString& robustness = capabilities.mRobustness;
+ // If content type is the empty string, return null.
+ if (contentType.IsEmpty()) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') rejected; "
+ "audio or video capability has empty contentType.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ return Sequence<MediaKeySystemMediaCapability>();
+ }
+ // If content type is an invalid or unrecognized MIME type, continue
+ // to the next iteration.
+ nsAutoString container;
+ nsTArray<nsString> codecStrings;
+ if (!ParseMIMETypeString(contentType, container, codecStrings)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "failed to parse contentType as MIME type.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ bool invalid = false;
+ nsTArray<EMECodecString> codecs;
+ for (const nsString& codecString : codecStrings) {
+ EMECodecString emeCodec = ToEMEAPICodecString(codecString);
+ if (emeCodec.IsEmpty()) {
+ invalid = true;
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "'%s' is an invalid codec string.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get(),
+ NS_ConvertUTF16toUTF8(codecString).get());
+ break;
+ }
+ codecs.AppendElement(emeCodec);
+ }
+ if (invalid) {
+ continue;
+ }
+
+ // If the user agent does not support container, continue to the next iteration.
+ // The case-sensitivity of string comparisons is determined by the appropriate RFC.
+ // (Note: Per RFC 6838 [RFC6838], "Both top-level type and subtype names are
+ // case-insensitive."'. We're using nsContentTypeParser and that is
+ // case-insensitive and converts all its parameter outputs to lower case.)
+ NS_ConvertUTF16toUTF8 container_utf8(container);
+ const bool isMP4 = DecoderTraits::IsMP4TypeAndEnabled(container_utf8, aDiagnostics);
+ if (isMP4 && !aKeySystem.mMP4.IsSupported()) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "MP4 requested but unsupported.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ const bool isWebM = DecoderTraits::IsWebMTypeAndEnabled(container_utf8);
+ if (isWebM && !aKeySystem.mWebM.IsSupported()) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "WebM requested but unsupported.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ if (!isMP4 && !isWebM) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "Unsupported or unrecognized container requested.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+
+ // Let parameters be the RFC 6381[RFC6381] parameters, if any, specified by
+ // content type.
+ // If the user agent does not recognize one or more parameters, continue to
+ // the next iteration.
+ if (IsParameterUnrecognized(contentType)) {
+ continue;
+ }
+
+ // Let media types be the set of codecs and codec constraints specified by
+ // parameters. The case-sensitivity of string comparisons is determined by
+ // the appropriate RFC or other specification.
+ // (Note: codecs array is 'parameter').
+
+ // If media types is empty:
+ if (codecs.IsEmpty()) {
+ // If container normatively implies a specific set of codecs and codec constraints:
+ // Let parameters be that set.
+ if (isMP4) {
+ if (aCodecType == Audio) {
+ codecs.AppendElement(EME_CODEC_AAC);
+ } else if (aCodecType == Video) {
+ codecs.AppendElement(EME_CODEC_H264);
+ }
+ } else if (isWebM) {
+ if (aCodecType == Audio) {
+ codecs.AppendElement(EME_CODEC_VORBIS);
+ } else if (aCodecType == Video) {
+ codecs.AppendElement(EME_CODEC_VP8);
+ }
+ }
+ // Otherwise: Continue to the next iteration.
+ // (Note: all containers we support have implied codecs, so don't continue here.)
+ }
+
+ // If content type is not strictly a audio/video type, continue to the next iteration.
+ const auto majorType = GetMajorType(container);
+ if (majorType == Invalid) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "MIME type is not an audio or video MIME type.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ if (majorType != aCodecType || !AllCodecsOfType(codecs, aCodecType)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "MIME type mixes audio codecs in video capabilities "
+ "or video codecs in audio capabilities.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ // If robustness is not the empty string and contains an unrecognized
+ // value or a value not supported by implementation, continue to the
+ // next iteration. String comparison is case-sensitive.
+ if (!robustness.IsEmpty()) {
+ if (majorType == Audio && !aKeySystem.mAudioRobustness.Contains(robustness)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "unsupported robustness string.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ if (majorType == Video && !aKeySystem.mVideoRobustness.Contains(robustness)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "unsupported robustness string.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+ // Note: specified robustness requirements are satisfied.
+ }
+
+ // If the user agent and implementation definitely support playback of
+ // encrypted media data for the combination of container, media types,
+ // robustness and local accumulated configuration in combination with
+ // restrictions...
+ const auto& containerSupport = isMP4 ? aKeySystem.mMP4 : aKeySystem.mWebM;
+ if (!CanDecryptAndDecode(aKeySystem.mKeySystem,
+ contentType,
+ majorType,
+ containerSupport,
+ codecs,
+ aDiagnostics)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') "
+ "MediaKeySystemMediaCapability('%s','%s') unsupported; "
+ "codec unsupported by CDM requested.",
+ NS_ConvertUTF16toUTF8(aPartialConfig.mLabel).get(),
+ NS_ConvertUTF16toUTF8(contentType).get(),
+ NS_ConvertUTF16toUTF8(robustness).get());
+ continue;
+ }
+
+ // ... add requested media capability to supported media capabilities.
+ if (!supportedCapabilities.AppendElement(capabilities, mozilla::fallible)) {
+ NS_WARNING("GetSupportedCapabilities: Malloc failure");
+ return Sequence<MediaKeySystemMediaCapability>();
+ }
+
+ // Note: omitting steps 3.13.2, our robustness is not sophisticated enough
+ // to require considering all requirements together.
+ }
+ return Move(supportedCapabilities);
+}
+
+// "Get Supported Configuration and Consent" algorithm, steps 4-7 for
+// distinctive identifier, and steps 8-11 for persistent state. The steps
+// are the same for both requirements/features, so we factor them out into
+// a single function.
+static bool
+CheckRequirement(const MediaKeysRequirement aRequirement,
+ const KeySystemFeatureSupport aFeatureSupport,
+ MediaKeysRequirement& aOutRequirement)
+{
+ // Let requirement be the value of candidate configuration's member.
+ MediaKeysRequirement requirement = aRequirement;
+ // If requirement is "optional" and feature is not allowed according to
+ // restrictions, set requirement to "not-allowed".
+ if (aRequirement == MediaKeysRequirement::Optional &&
+ aFeatureSupport == KeySystemFeatureSupport::Prohibited) {
+ requirement = MediaKeysRequirement::Not_allowed;
+ }
+
+ // Follow the steps for requirement from the following list:
+ switch (requirement) {
+ case MediaKeysRequirement::Required: {
+ // If the implementation does not support use of requirement in combination
+ // with accumulated configuration and restrictions, return NotSupported.
+ if (aFeatureSupport == KeySystemFeatureSupport::Prohibited) {
+ return false;
+ }
+ break;
+ }
+ case MediaKeysRequirement::Optional: {
+ // Continue with the following steps.
+ break;
+ }
+ case MediaKeysRequirement::Not_allowed: {
+ // If the implementation requires use of feature in combination with
+ // accumulated configuration and restrictions, return NotSupported.
+ if (aFeatureSupport == KeySystemFeatureSupport::Required) {
+ return false;
+ }
+ break;
+ }
+ default: {
+ return false;
+ }
+ }
+
+ // Set the requirement member of accumulated configuration to equal
+ // calculated requirement.
+ aOutRequirement = requirement;
+
+ return true;
+}
+
+// 3.1.2.2, step 12
+// Follow the steps for the first matching condition from the following list:
+// If the sessionTypes member is present in candidate configuration.
+// Let session types be candidate configuration's sessionTypes member.
+// Otherwise let session types be ["temporary"].
+// Note: This returns an empty array on malloc failure.
+static Sequence<nsString>
+UnboxSessionTypes(const Optional<Sequence<nsString>>& aSessionTypes)
+{
+ Sequence<nsString> sessionTypes;
+ if (aSessionTypes.WasPassed()) {
+ sessionTypes = aSessionTypes.Value();
+ } else {
+ using MediaKeySessionTypeValues::strings;
+ const char* temporary = strings[static_cast<uint32_t>(MediaKeySessionType::Temporary)].value;
+ // Note: fallible. Results in an empty array.
+ sessionTypes.AppendElement(NS_ConvertUTF8toUTF16(nsDependentCString(temporary)), mozilla::fallible);
+ }
+ return sessionTypes;
+}
+
+// 3.1.2.2 Get Supported Configuration and Consent
+static bool
+GetSupportedConfig(const KeySystemConfig& aKeySystem,
+ const MediaKeySystemConfiguration& aCandidate,
+ MediaKeySystemConfiguration& aOutConfig,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ // Let accumulated configuration be a new MediaKeySystemConfiguration dictionary.
+ MediaKeySystemConfiguration config;
+ // Set the label member of accumulated configuration to equal the label member of
+ // candidate configuration.
+ config.mLabel = aCandidate.mLabel;
+ // If the initDataTypes member of candidate configuration is non-empty, run the
+ // following steps:
+ if (!aCandidate.mInitDataTypes.IsEmpty()) {
+ // Let supported types be an empty sequence of DOMStrings.
+ nsTArray<nsString> supportedTypes;
+ // For each value in candidate configuration's initDataTypes member:
+ for (const nsString& initDataType : aCandidate.mInitDataTypes) {
+ // Let initDataType be the value.
+ // If the implementation supports generating requests based on initDataType,
+ // add initDataType to supported types. String comparison is case-sensitive.
+ // The empty string is never supported.
+ if (aKeySystem.mInitDataTypes.Contains(initDataType)) {
+ supportedTypes.AppendElement(initDataType);
+ }
+ }
+ // If supported types is empty, return NotSupported.
+ if (supportedTypes.IsEmpty()) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "no supported initDataTypes provided.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+ // Set the initDataTypes member of accumulated configuration to supported types.
+ if (!config.mInitDataTypes.Assign(supportedTypes)) {
+ return false;
+ }
+ }
+
+ if (!CheckRequirement(aCandidate.mDistinctiveIdentifier,
+ aKeySystem.mDistinctiveIdentifier,
+ config.mDistinctiveIdentifier)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "distinctiveIdentifier requirement not satisfied.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+
+ if (!CheckRequirement(aCandidate.mPersistentState,
+ aKeySystem.mPersistentState,
+ config.mPersistentState)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "persistentState requirement not satisfied.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+
+ Sequence<nsString> sessionTypes(UnboxSessionTypes(aCandidate.mSessionTypes));
+ if (sessionTypes.IsEmpty()) {
+ // Malloc failure.
+ return false;
+ }
+
+ // For each value in session types:
+ for (const auto& sessionTypeString : sessionTypes) {
+ // Let session type be the value.
+ MediaKeySessionType sessionType;
+ if (!ToSessionType(sessionTypeString, sessionType)) {
+ // (Assume invalid sessionType is unsupported as per steps below).
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "invalid session type specified.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+ // If accumulated configuration's persistentState value is "not-allowed"
+ // and the Is persistent session type? algorithm returns true for session
+ // type return NotSupported.
+ if (config.mPersistentState == MediaKeysRequirement::Not_allowed &&
+ IsPersistentSessionType(sessionType)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "persistent session requested but keysystem doesn't"
+ "support persistent state.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+ // If the implementation does not support session type in combination
+ // with accumulated configuration and restrictions for other reasons,
+ // return NotSupported.
+ if (!aKeySystem.mSessionTypes.Contains(sessionType)) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "session type '%s' unsupported by keySystem.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get(),
+ NS_ConvertUTF16toUTF8(sessionTypeString).get());
+ return false;
+ }
+ // If accumulated configuration's persistentState value is "optional"
+ // and the result of running the Is persistent session type? algorithm
+ // on session type is true, change accumulated configuration's
+ // persistentState value to "required".
+ if (config.mPersistentState == MediaKeysRequirement::Optional &&
+ IsPersistentSessionType(sessionType)) {
+ config.mPersistentState = MediaKeysRequirement::Required;
+ }
+ }
+ // Set the sessionTypes member of accumulated configuration to session types.
+ config.mSessionTypes.Construct(Move(sessionTypes));
+
+ // If the videoCapabilities and audioCapabilities members in candidate
+ // configuration are both empty, return NotSupported.
+ // TODO: Most sites using EME still don't pass capabilities, so we
+ // can't reject on it yet without breaking them. So add this later.
+
+ // If the videoCapabilities member in candidate configuration is non-empty:
+ if (!aCandidate.mVideoCapabilities.IsEmpty()) {
+ // Let video capabilities be the result of executing the Get Supported
+ // Capabilities for Audio/Video Type algorithm on Video, candidate
+ // configuration's videoCapabilities member, accumulated configuration,
+ // and restrictions.
+ Sequence<MediaKeySystemMediaCapability> caps =
+ GetSupportedCapabilities(Video,
+ aCandidate.mVideoCapabilities,
+ config,
+ aKeySystem,
+ aDiagnostics);
+ // If video capabilities is null, return NotSupported.
+ if (caps.IsEmpty()) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "no supported video capabilities.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+ // Set the videoCapabilities member of accumulated configuration to video capabilities.
+ config.mVideoCapabilities = Move(caps);
+ } else {
+ // Otherwise:
+ // Set the videoCapabilities member of accumulated configuration to an empty sequence.
+ }
+
+ // If the audioCapabilities member in candidate configuration is non-empty:
+ if (!aCandidate.mAudioCapabilities.IsEmpty()) {
+ // Let audio capabilities be the result of executing the Get Supported Capabilities
+ // for Audio/Video Type algorithm on Audio, candidate configuration's audioCapabilities
+ // member, accumulated configuration, and restrictions.
+ Sequence<MediaKeySystemMediaCapability> caps =
+ GetSupportedCapabilities(Audio,
+ aCandidate.mAudioCapabilities,
+ config,
+ aKeySystem,
+ aDiagnostics);
+ // If audio capabilities is null, return NotSupported.
+ if (caps.IsEmpty()) {
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "no supported audio capabilities.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+ // Set the audioCapabilities member of accumulated configuration to audio capabilities.
+ config.mAudioCapabilities = Move(caps);
+ } else {
+ // Otherwise:
+ // Set the audioCapabilities member of accumulated configuration to an empty sequence.
+ }
+
+ // If accumulated configuration's distinctiveIdentifier value is "optional", follow the
+ // steps for the first matching condition from the following list:
+ if (config.mDistinctiveIdentifier == MediaKeysRequirement::Optional) {
+ // If the implementation requires use Distinctive Identifier(s) or
+ // Distinctive Permanent Identifier(s) for any of the combinations
+ // in accumulated configuration
+ if (aKeySystem.mDistinctiveIdentifier == KeySystemFeatureSupport::Required) {
+ // Change accumulated configuration's distinctiveIdentifier value to "required".
+ config.mDistinctiveIdentifier = MediaKeysRequirement::Required;
+ } else {
+ // Otherwise, change accumulated configuration's distinctiveIdentifier
+ // value to "not-allowed".
+ config.mDistinctiveIdentifier = MediaKeysRequirement::Not_allowed;
+ }
+ }
+
+ // If accumulated configuration's persistentState value is "optional", follow the
+ // steps for the first matching condition from the following list:
+ if (config.mPersistentState == MediaKeysRequirement::Optional) {
+ // If the implementation requires persisting state for any of the combinations
+ // in accumulated configuration
+ if (aKeySystem.mPersistentState == KeySystemFeatureSupport::Required) {
+ // Change accumulated configuration's persistentState value to "required".
+ config.mPersistentState = MediaKeysRequirement::Required;
+ } else {
+ // Otherwise, change accumulated configuration's persistentState
+ // value to "not-allowed".
+ config.mPersistentState = MediaKeysRequirement::Not_allowed;
+ }
+ }
+
+ // Note: Omitting steps 20-22. We don't ask for consent.
+
+#if defined(XP_WIN)
+ // Widevine CDM doesn't include an AAC decoder. So if WMF can't decode AAC,
+ // and a codec wasn't specified, be conservative and reject the MediaKeys request.
+ if (IsWidevineKeySystem(aKeySystem.mKeySystem) &&
+ (aCandidate.mAudioCapabilities.IsEmpty() ||
+ aCandidate.mVideoCapabilities.IsEmpty()) &&
+ !WMFDecoderModule::HasAAC()) {
+ if (aDiagnostics) {
+ aDiagnostics->SetKeySystemIssue(
+ DecoderDoctorDiagnostics::eWidevineWithNoWMF);
+ }
+ EME_LOG("MediaKeySystemConfiguration (label='%s') rejected; "
+ "WMF required for Widevine decoding, but it's not available.",
+ NS_ConvertUTF16toUTF8(aCandidate.mLabel).get());
+ return false;
+ }
+#endif
+
+ // Return accumulated configuration.
+ aOutConfig = config;
+
+ return true;
+}
+
+/* static */
+bool
+MediaKeySystemAccess::GetSupportedConfig(const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs,
+ MediaKeySystemConfiguration& aOutConfig,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ KeySystemConfig implementation;
+ if (!GetKeySystemConfig(aKeySystem, implementation)) {
+ return false;
+ }
+ for (const MediaKeySystemConfiguration& candidate : aConfigs) {
+ if (mozilla::dom::GetSupportedConfig(implementation,
+ candidate,
+ aOutConfig,
+ aDiagnostics)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+/* static */
+void
+MediaKeySystemAccess::NotifyObservers(nsPIDOMWindowInner* aWindow,
+ const nsAString& aKeySystem,
+ MediaKeySystemStatus aStatus)
+{
+ RequestMediaKeySystemAccessNotification data;
+ data.mKeySystem = aKeySystem;
+ data.mStatus = aStatus;
+ nsAutoString json;
+ data.ToJSON(json);
+ EME_LOG("MediaKeySystemAccess::NotifyObservers() %s", NS_ConvertUTF16toUTF8(json).get());
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ obs->NotifyObservers(aWindow, "mediakeys-request", json.get());
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeySystemAccess.h b/dom/media/eme/MediaKeySystemAccess.h
new file mode 100644
index 000000000..a166ac22e
--- /dev/null
+++ b/dom/media/eme/MediaKeySystemAccess.h
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeySystemAccess_h
+#define mozilla_dom_MediaKeySystemAccess_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+
+#include "mozilla/dom/Promise.h"
+#include "mozilla/dom/MediaKeySystemAccessBinding.h"
+#include "mozilla/dom/MediaKeysRequestStatusBinding.h"
+
+#include "js/TypeDecls.h"
+
+namespace mozilla {
+
+class DecoderDoctorDiagnostics;
+
+namespace dom {
+
+class MediaKeySystemAccess final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MediaKeySystemAccess)
+
+public:
+ explicit MediaKeySystemAccess(nsPIDOMWindowInner* aParent,
+ const nsAString& aKeySystem,
+ const MediaKeySystemConfiguration& aConfig);
+
+protected:
+ ~MediaKeySystemAccess();
+
+public:
+ nsPIDOMWindowInner* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void GetKeySystem(nsString& aRetVal) const;
+
+ void GetConfiguration(MediaKeySystemConfiguration& aConfig);
+
+ already_AddRefed<Promise> CreateMediaKeys(ErrorResult& aRv);
+
+ static MediaKeySystemStatus GetKeySystemStatus(const nsAString& aKeySystem,
+ nsACString& aOutExceptionMessage);
+
+ static bool IsSupported(const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs,
+ DecoderDoctorDiagnostics* aDiagnostics);
+
+ static void NotifyObservers(nsPIDOMWindowInner* aWindow,
+ const nsAString& aKeySystem,
+ MediaKeySystemStatus aStatus);
+
+ static bool GetSupportedConfig(const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs,
+ MediaKeySystemConfiguration& aOutConfig,
+ DecoderDoctorDiagnostics* aDiagnostics);
+
+ static bool KeySystemSupportsInitDataType(const nsAString& aKeySystem,
+ const nsAString& aInitDataType);
+
+private:
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+ const nsString mKeySystem;
+ const MediaKeySystemConfiguration mConfig;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_MediaKeySystemAccess_h
diff --git a/dom/media/eme/MediaKeySystemAccessManager.cpp b/dom/media/eme/MediaKeySystemAccessManager.cpp
new file mode 100644
index 000000000..8fefc62ec
--- /dev/null
+++ b/dom/media/eme/MediaKeySystemAccessManager.cpp
@@ -0,0 +1,340 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaKeySystemAccessManager.h"
+#include "DecoderDoctorDiagnostics.h"
+#include "MediaPrefs.h"
+#include "mozilla/EMEUtils.h"
+#include "nsServiceManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIObserverService.h"
+#include "mozilla/Services.h"
+#include "mozilla/DetailedPromise.h"
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
+#ifdef XP_MACOSX
+#include "nsCocoaFeatures.h"
+#endif
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeySystemAccessManager)
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaKeySystemAccessManager)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaKeySystemAccessManager)
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaKeySystemAccessManager)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaKeySystemAccessManager)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
+ for (size_t i = 0; i < tmp->mRequests.Length(); i++) {
+ tmp->mRequests[i].RejectPromise(NS_LITERAL_CSTRING("Promise still outstanding at MediaKeySystemAccessManager GC"));
+ tmp->mRequests[i].CancelTimer();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mRequests[i].mPromise)
+ }
+ tmp->mRequests.Clear();
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaKeySystemAccessManager)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
+ for (size_t i = 0; i < tmp->mRequests.Length(); i++) {
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRequests[i].mPromise)
+ }
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+MediaKeySystemAccessManager::MediaKeySystemAccessManager(nsPIDOMWindowInner* aWindow)
+ : mWindow(aWindow)
+ , mAddedObservers(false)
+{
+}
+
+MediaKeySystemAccessManager::~MediaKeySystemAccessManager()
+{
+ Shutdown();
+}
+
+void
+MediaKeySystemAccessManager::Request(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs)
+{
+ Request(aPromise, aKeySystem, aConfigs, RequestType::Initial);
+}
+
+void
+MediaKeySystemAccessManager::Request(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs,
+ RequestType aType)
+{
+ EME_LOG("MediaKeySystemAccessManager::Request %s", NS_ConvertUTF16toUTF8(aKeySystem).get());
+
+ if (aKeySystem.IsEmpty()) {
+ aPromise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Key system string is empty"));
+ // Don't notify DecoderDoctor, as there's nothing we or the user can
+ // do to fix this situation; the site is using the API wrong.
+ return;
+ }
+ if (aConfigs.IsEmpty()) {
+ aPromise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Candidate MediaKeySystemConfigs is empty"));
+ // Don't notify DecoderDoctor, as there's nothing we or the user can
+ // do to fix this situation; the site is using the API wrong.
+ return;
+ }
+
+ DecoderDoctorDiagnostics diagnostics;
+
+ // Ensure keysystem is supported.
+ if (!IsWidevineKeySystem(aKeySystem) &&
+ !IsClearkeyKeySystem(aKeySystem) &&
+ !IsPrimetimeKeySystem(aKeySystem)) {
+ // Not to inform user, because nothing to do if the keySystem is not
+ // supported.
+ aPromise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR,
+ NS_LITERAL_CSTRING("Key system is unsupported"));
+ diagnostics.StoreMediaKeySystemAccess(mWindow->GetExtantDoc(),
+ aKeySystem, false, __func__);
+ return;
+ }
+
+ if (!MediaPrefs::EMEEnabled() && !IsClearkeyKeySystem(aKeySystem)) {
+ // EME disabled by user, send notification to chrome so UI can inform user.
+ // Clearkey is allowed even when EME is disabled because we want the pref
+ // "media.eme.enabled" only taking effect on proprietary DRMs.
+ MediaKeySystemAccess::NotifyObservers(mWindow,
+ aKeySystem,
+ MediaKeySystemStatus::Api_disabled);
+ aPromise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR,
+ NS_LITERAL_CSTRING("EME has been preffed off"));
+ diagnostics.StoreMediaKeySystemAccess(mWindow->GetExtantDoc(),
+ aKeySystem, false, __func__);
+ return;
+ }
+
+ nsAutoCString message;
+ MediaKeySystemStatus status =
+ MediaKeySystemAccess::GetKeySystemStatus(aKeySystem, message);
+
+ nsPrintfCString msg("MediaKeySystemAccess::GetKeySystemStatus(%s) "
+ "result=%s msg='%s'",
+ NS_ConvertUTF16toUTF8(aKeySystem).get(),
+ MediaKeySystemStatusValues::strings[(size_t)status].value,
+ message.get());
+ LogToBrowserConsole(NS_ConvertUTF8toUTF16(msg));
+
+ if (status == MediaKeySystemStatus::Cdm_not_installed &&
+ (IsPrimetimeKeySystem(aKeySystem) || IsWidevineKeySystem(aKeySystem))) {
+ // These are cases which could be resolved by downloading a new(er) CDM.
+ // When we send the status to chrome, chrome's GMPProvider will attempt to
+ // download or update the CDM. In AwaitInstall() we add listeners to wait
+ // for the update to complete, and we'll call this function again with
+ // aType==Subsequent once the download has completed and the GMPService
+ // has had a new plugin added. AwaitInstall() sets a timer to fail if the
+ // update/download takes too long or fails.
+ if (aType == RequestType::Initial &&
+ AwaitInstall(aPromise, aKeySystem, aConfigs)) {
+ // Notify chrome that we're going to wait for the CDM to download/update.
+ // Note: If we're re-trying, we don't re-send the notification,
+ // as chrome is already displaying the "we can't play, updating"
+ // notification.
+ MediaKeySystemAccess::NotifyObservers(mWindow, aKeySystem, status);
+ } else {
+ // We waited or can't wait for an update and we still can't service
+ // the request. Give up. Chrome will still be showing a "I can't play,
+ // updating" notification.
+ aPromise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR,
+ NS_LITERAL_CSTRING("Gave up while waiting for a CDM update"));
+ }
+ diagnostics.StoreMediaKeySystemAccess(mWindow->GetExtantDoc(),
+ aKeySystem, false, __func__);
+ return;
+ }
+ if (status != MediaKeySystemStatus::Available) {
+ // Failed due to user disabling something, send a notification to
+ // chrome, so we can show some UI to explain how the user can rectify
+ // the situation.
+ MediaKeySystemAccess::NotifyObservers(mWindow, aKeySystem, status);
+ aPromise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR, message);
+ return;
+ }
+
+ MediaKeySystemConfiguration config;
+ if (MediaKeySystemAccess::GetSupportedConfig(aKeySystem, aConfigs, config, &diagnostics)) {
+ RefPtr<MediaKeySystemAccess> access(
+ new MediaKeySystemAccess(mWindow, aKeySystem, config));
+ aPromise->MaybeResolve(access);
+ diagnostics.StoreMediaKeySystemAccess(mWindow->GetExtantDoc(),
+ aKeySystem, true, __func__);
+ return;
+ }
+ // Not to inform user, because nothing to do if the corresponding keySystem
+ // configuration is not supported.
+ aPromise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR,
+ NS_LITERAL_CSTRING("Key system configuration is not supported"));
+ diagnostics.StoreMediaKeySystemAccess(mWindow->GetExtantDoc(),
+ aKeySystem, false, __func__);
+}
+
+MediaKeySystemAccessManager::PendingRequest::PendingRequest(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs,
+ nsITimer* aTimer)
+ : mPromise(aPromise)
+ , mKeySystem(aKeySystem)
+ , mConfigs(aConfigs)
+ , mTimer(aTimer)
+{
+ MOZ_COUNT_CTOR(MediaKeySystemAccessManager::PendingRequest);
+}
+
+MediaKeySystemAccessManager::PendingRequest::PendingRequest(const PendingRequest& aOther)
+ : mPromise(aOther.mPromise)
+ , mKeySystem(aOther.mKeySystem)
+ , mConfigs(aOther.mConfigs)
+ , mTimer(aOther.mTimer)
+{
+ MOZ_COUNT_CTOR(MediaKeySystemAccessManager::PendingRequest);
+}
+
+MediaKeySystemAccessManager::PendingRequest::~PendingRequest()
+{
+ MOZ_COUNT_DTOR(MediaKeySystemAccessManager::PendingRequest);
+}
+
+void
+MediaKeySystemAccessManager::PendingRequest::CancelTimer()
+{
+ if (mTimer) {
+ mTimer->Cancel();
+ }
+}
+
+void
+MediaKeySystemAccessManager::PendingRequest::RejectPromise(const nsCString& aReason)
+{
+ if (mPromise) {
+ mPromise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR, aReason);
+ }
+}
+
+bool
+MediaKeySystemAccessManager::AwaitInstall(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfigs)
+{
+ EME_LOG("MediaKeySystemAccessManager::AwaitInstall %s", NS_ConvertUTF16toUTF8(aKeySystem).get());
+
+ if (!EnsureObserversAdded()) {
+ NS_WARNING("Failed to add pref observer");
+ return false;
+ }
+
+ nsCOMPtr<nsITimer> timer(do_CreateInstance("@mozilla.org/timer;1"));
+ if (!timer || NS_FAILED(timer->Init(this, 60 * 1000, nsITimer::TYPE_ONE_SHOT))) {
+ NS_WARNING("Failed to create timer to await CDM install.");
+ return false;
+ }
+
+ mRequests.AppendElement(PendingRequest(aPromise, aKeySystem, aConfigs, timer));
+ return true;
+}
+
+void
+MediaKeySystemAccessManager::RetryRequest(PendingRequest& aRequest)
+{
+ aRequest.CancelTimer();
+ Request(aRequest.mPromise, aRequest.mKeySystem, aRequest.mConfigs, RequestType::Subsequent);
+}
+
+nsresult
+MediaKeySystemAccessManager::Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aData)
+{
+ EME_LOG("MediaKeySystemAccessManager::Observe %s", aTopic);
+
+ if (!strcmp(aTopic, "gmp-changed")) {
+ // Filter out the requests where the CDM's install-status is no longer
+ // "unavailable". This will be the CDMs which have downloaded since the
+ // initial request.
+ // Note: We don't have a way to communicate from chrome that the CDM has
+ // failed to download, so we'll just let the timeout fail us in that case.
+ nsTArray<PendingRequest> requests;
+ for (size_t i = mRequests.Length(); i-- > 0; ) {
+ PendingRequest& request = mRequests[i];
+ nsAutoCString message;
+ MediaKeySystemStatus status =
+ MediaKeySystemAccess::GetKeySystemStatus(request.mKeySystem, message);
+ if (status == MediaKeySystemStatus::Cdm_not_installed) {
+ // Not yet installed, don't retry. Keep waiting until timeout.
+ continue;
+ }
+ // Status has changed, retry request.
+ requests.AppendElement(Move(request));
+ mRequests.RemoveElementAt(i);
+ }
+ // Retry all pending requests, but this time fail if the CDM is not installed.
+ for (PendingRequest& request : requests) {
+ RetryRequest(request);
+ }
+ } else if (!strcmp(aTopic, "timer-callback")) {
+ // Find the timer that expired and re-run the request for it.
+ nsCOMPtr<nsITimer> timer(do_QueryInterface(aSubject));
+ for (size_t i = 0; i < mRequests.Length(); i++) {
+ if (mRequests[i].mTimer == timer) {
+ EME_LOG("MediaKeySystemAccessManager::AwaitInstall resuming request");
+ PendingRequest request = mRequests[i];
+ mRequests.RemoveElementAt(i);
+ RetryRequest(request);
+ break;
+ }
+ }
+ }
+ return NS_OK;
+}
+
+bool
+MediaKeySystemAccessManager::EnsureObserversAdded()
+{
+ if (mAddedObservers) {
+ return true;
+ }
+
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ if (NS_WARN_IF(!obsService)) {
+ return false;
+ }
+ mAddedObservers = NS_SUCCEEDED(obsService->AddObserver(this, "gmp-changed", false));
+ return mAddedObservers;
+}
+
+void
+MediaKeySystemAccessManager::Shutdown()
+{
+ EME_LOG("MediaKeySystemAccessManager::Shutdown");
+ nsTArray<PendingRequest> requests(Move(mRequests));
+ for (PendingRequest& request : requests) {
+ // Cancel all requests; we're shutting down.
+ request.CancelTimer();
+ request.RejectPromise(NS_LITERAL_CSTRING("Promise still outstanding at MediaKeySystemAccessManager shutdown"));
+ }
+ if (mAddedObservers) {
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ if (obsService) {
+ obsService->RemoveObserver(this, "gmp-changed");
+ mAddedObservers = false;
+ }
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeySystemAccessManager.h b/dom/media/eme/MediaKeySystemAccessManager.h
new file mode 100644
index 000000000..9c092248e
--- /dev/null
+++ b/dom/media/eme/MediaKeySystemAccessManager.h
@@ -0,0 +1,83 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaKeySystemAccessManager_h
+#define mozilla_dom_MediaKeySystemAccessManager_h
+
+#include "mozilla/dom/MediaKeySystemAccess.h"
+#include "nsIObserver.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsISupportsImpl.h"
+#include "nsITimer.h"
+
+namespace mozilla {
+namespace dom {
+
+class DetailedPromise;
+class TestGMPVideoDecoder;
+
+class MediaKeySystemAccessManager final : public nsIObserver
+{
+public:
+
+ explicit MediaKeySystemAccessManager(nsPIDOMWindowInner* aWindow);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(MediaKeySystemAccessManager, nsIObserver)
+ NS_DECL_NSIOBSERVER
+
+ void Request(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfig);
+
+ void Shutdown();
+
+ struct PendingRequest {
+ PendingRequest(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfig,
+ nsITimer* aTimer);
+ PendingRequest(const PendingRequest& aOther);
+ ~PendingRequest();
+ void CancelTimer();
+ void RejectPromise(const nsCString& aReason);
+
+ RefPtr<DetailedPromise> mPromise;
+ const nsString mKeySystem;
+ const Sequence<MediaKeySystemConfiguration> mConfigs;
+ nsCOMPtr<nsITimer> mTimer;
+ };
+
+private:
+
+ enum RequestType {
+ Initial,
+ Subsequent
+ };
+
+ void Request(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfig,
+ RequestType aType);
+
+ ~MediaKeySystemAccessManager();
+
+ bool EnsureObserversAdded();
+
+ bool AwaitInstall(DetailedPromise* aPromise,
+ const nsAString& aKeySystem,
+ const Sequence<MediaKeySystemConfiguration>& aConfig);
+
+ void RetryRequest(PendingRequest& aRequest);
+
+ nsTArray<PendingRequest> mRequests;
+
+ nsCOMPtr<nsPIDOMWindowInner> mWindow;
+ bool mAddedObservers;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/eme/MediaKeys.cpp b/dom/media/eme/MediaKeys.cpp
new file mode 100644
index 000000000..eedd675e4
--- /dev/null
+++ b/dom/media/eme/MediaKeys.cpp
@@ -0,0 +1,593 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaKeys.h"
+#include "GMPService.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/MediaKeysBinding.h"
+#include "mozilla/dom/MediaKeyMessageEvent.h"
+#include "mozilla/dom/MediaKeyError.h"
+#include "mozilla/dom/MediaKeySession.h"
+#include "mozilla/dom/DOMException.h"
+#include "mozilla/dom/UnionTypes.h"
+#include "mozilla/Telemetry.h"
+#include "GMPCDMProxy.h"
+#ifdef MOZ_WIDGET_ANDROID
+#include "mozilla/MediaDrmCDMProxy.h"
+#endif
+#include "mozilla/EMEUtils.h"
+#include "nsContentUtils.h"
+#include "nsIScriptObjectPrincipal.h"
+#include "nsContentTypeParser.h"
+#ifdef MOZ_FMP4
+#include "MP4Decoder.h"
+#endif
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
+#include "nsContentCID.h"
+#include "nsServiceManagerUtils.h"
+#include "mozilla/dom/MediaKeySystemAccess.h"
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(MediaKeys,
+ mElement,
+ mParent,
+ mKeySessions,
+ mPromises,
+ mPendingSessions);
+NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaKeys)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaKeys)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaKeys)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+MediaKeys::MediaKeys(nsPIDOMWindowInner* aParent,
+ const nsAString& aKeySystem,
+ const MediaKeySystemConfiguration& aConfig)
+ : mParent(aParent)
+ , mKeySystem(aKeySystem)
+ , mCreatePromiseId(0)
+ , mConfig(aConfig)
+{
+ EME_LOG("MediaKeys[%p] constructed keySystem=%s",
+ this, NS_ConvertUTF16toUTF8(mKeySystem).get());
+}
+
+MediaKeys::~MediaKeys()
+{
+ Shutdown();
+ EME_LOG("MediaKeys[%p] destroyed", this);
+}
+
+void
+MediaKeys::Terminated()
+{
+ EME_LOG("MediaKeys[%p] CDM crashed unexpectedly", this);
+
+ KeySessionHashMap keySessions;
+ // Remove entries during iteration will screw it. Make a copy first.
+ for (auto iter = mKeySessions.Iter(); !iter.Done(); iter.Next()) {
+ RefPtr<MediaKeySession>& session = iter.Data();
+ keySessions.Put(session->GetSessionId(), session);
+ }
+ for (auto iter = keySessions.Iter(); !iter.Done(); iter.Next()) {
+ RefPtr<MediaKeySession>& session = iter.Data();
+ session->OnClosed();
+ }
+ keySessions.Clear();
+ MOZ_ASSERT(mKeySessions.Count() == 0);
+
+ // Notify the element about that CDM has terminated.
+ if (mElement) {
+ mElement->DecodeError(NS_ERROR_DOM_MEDIA_CDM_ERR);
+ }
+
+ Shutdown();
+}
+
+void
+MediaKeys::Shutdown()
+{
+ if (mProxy) {
+ mProxy->Shutdown();
+ mProxy = nullptr;
+ }
+
+ RefPtr<MediaKeys> kungFuDeathGrip = this;
+
+ for (auto iter = mPromises.Iter(); !iter.Done(); iter.Next()) {
+ RefPtr<dom::DetailedPromise>& promise = iter.Data();
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Promise still outstanding at MediaKeys shutdown"));
+ Release();
+ }
+ mPromises.Clear();
+}
+
+nsPIDOMWindowInner*
+MediaKeys::GetParentObject() const
+{
+ return mParent;
+}
+
+JSObject*
+MediaKeys::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaKeysBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+MediaKeys::GetKeySystem(nsString& aOutKeySystem) const
+{
+ aOutKeySystem.Assign(mKeySystem);
+}
+
+already_AddRefed<DetailedPromise>
+MediaKeys::SetServerCertificate(const ArrayBufferViewOrArrayBuffer& aCert, ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeys.setServerCertificate")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ if (!mProxy) {
+ NS_WARNING("Tried to use a MediaKeys without a CDM");
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in MediaKeys.setServerCertificate()"));
+ return promise.forget();
+ }
+
+ nsTArray<uint8_t> data;
+ CopyArrayBufferViewOrArrayBufferData(aCert, data);
+ if (data.IsEmpty()) {
+ promise->MaybeReject(NS_ERROR_DOM_TYPE_ERR,
+ NS_LITERAL_CSTRING("Empty certificate passed to MediaKeys.setServerCertificate()"));
+ return promise.forget();
+ }
+
+ mProxy->SetServerCertificate(StorePromise(promise), data);
+ return promise.forget();
+}
+
+already_AddRefed<DetailedPromise>
+MediaKeys::MakePromise(ErrorResult& aRv, const nsACString& aName)
+{
+ nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetParentObject());
+ if (!global) {
+ NS_WARNING("Passed non-global to MediaKeys ctor!");
+ aRv.Throw(NS_ERROR_UNEXPECTED);
+ return nullptr;
+ }
+ return DetailedPromise::Create(global, aRv, aName);
+}
+
+PromiseId
+MediaKeys::StorePromise(DetailedPromise* aPromise)
+{
+ static uint32_t sEMEPromiseCount = 1;
+ MOZ_ASSERT(aPromise);
+ uint32_t id = sEMEPromiseCount++;
+
+ EME_LOG("MediaKeys[%p]::StorePromise() id=%d", this, id);
+
+ // Keep MediaKeys alive for the lifetime of its promises. Any still-pending
+ // promises are rejected in Shutdown().
+ AddRef();
+
+#ifdef DEBUG
+ // We should not have already stored this promise!
+ for (auto iter = mPromises.ConstIter(); !iter.Done(); iter.Next()) {
+ MOZ_ASSERT(iter.Data() != aPromise);
+ }
+#endif
+
+ mPromises.Put(id, aPromise);
+ return id;
+}
+
+void
+MediaKeys::ConnectPendingPromiseIdWithToken(PromiseId aId, uint32_t aToken)
+{
+ // Should only be called from MediaKeySession::GenerateRequest.
+ mPromiseIdToken.Put(aId, aToken);
+ EME_LOG("MediaKeys[%p]::ConnectPendingPromiseIdWithToken() id=%u => token(%u)",
+ this, aId, aToken);
+}
+
+already_AddRefed<DetailedPromise>
+MediaKeys::RetrievePromise(PromiseId aId)
+{
+ if (!mPromises.Contains(aId)) {
+ NS_WARNING(nsPrintfCString("Tried to retrieve a non-existent promise id=%d", aId).get());
+ return nullptr;
+ }
+ RefPtr<DetailedPromise> promise;
+ mPromises.Remove(aId, getter_AddRefs(promise));
+ Release();
+ return promise.forget();
+}
+
+void
+MediaKeys::RejectPromise(PromiseId aId, nsresult aExceptionCode,
+ const nsCString& aReason)
+{
+ EME_LOG("MediaKeys[%p]::RejectPromise(%d, 0x%x)", this, aId, aExceptionCode);
+
+ RefPtr<DetailedPromise> promise(RetrievePromise(aId));
+ if (!promise) {
+ return;
+ }
+
+ // This promise could be a createSession or loadSession promise,
+ // so we might have a pending session waiting to be resolved into
+ // the promise on success. We've been directed to reject to promise,
+ // so we can throw away the corresponding session object.
+ uint32_t token = 0;
+ if (mPromiseIdToken.Get(aId, &token)) {
+ MOZ_ASSERT(mPendingSessions.Contains(token));
+ mPendingSessions.Remove(token);
+ mPromiseIdToken.Remove(aId);
+ }
+
+ MOZ_ASSERT(NS_FAILED(aExceptionCode));
+ promise->MaybeReject(aExceptionCode, aReason);
+
+ if (mCreatePromiseId == aId) {
+ // Note: This will probably destroy the MediaKeys object!
+ Release();
+ }
+}
+
+void
+MediaKeys::OnSessionIdReady(MediaKeySession* aSession)
+{
+ if (!aSession) {
+ NS_WARNING("Invalid MediaKeySession passed to OnSessionIdReady()");
+ return;
+ }
+ if (mKeySessions.Contains(aSession->GetSessionId())) {
+ NS_WARNING("MediaKeySession's made ready multiple times!");
+ return;
+ }
+ if (mPendingSessions.Contains(aSession->Token())) {
+ NS_WARNING("MediaKeySession made ready when it wasn't waiting to be ready!");
+ return;
+ }
+ if (aSession->GetSessionId().IsEmpty()) {
+ NS_WARNING("MediaKeySession with invalid sessionId passed to OnSessionIdReady()");
+ return;
+ }
+ mKeySessions.Put(aSession->GetSessionId(), aSession);
+}
+
+void
+MediaKeys::ResolvePromise(PromiseId aId)
+{
+ EME_LOG("MediaKeys[%p]::ResolvePromise(%d)", this, aId);
+
+ RefPtr<DetailedPromise> promise(RetrievePromise(aId));
+ MOZ_ASSERT(!mPromises.Contains(aId));
+ if (!promise) {
+ return;
+ }
+
+ uint32_t token = 0;
+ if (!mPromiseIdToken.Get(aId, &token)) {
+ promise->MaybeResolveWithUndefined();
+ return;
+ } else if (!mPendingSessions.Contains(token)) {
+ // Pending session for CreateSession() should be removed when sessionId
+ // is ready.
+ promise->MaybeResolveWithUndefined();
+ mPromiseIdToken.Remove(aId);
+ return;
+ }
+ mPromiseIdToken.Remove(aId);
+
+ // We should only resolve LoadSession calls via this path,
+ // not CreateSession() promises.
+ RefPtr<MediaKeySession> session;
+ mPendingSessions.Remove(token, getter_AddRefs(session));
+ if (!session || session->GetSessionId().IsEmpty()) {
+ NS_WARNING("Received activation for non-existent session!");
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_ACCESS_ERR,
+ NS_LITERAL_CSTRING("CDM LoadSession() returned a different session ID than requested"));
+ return;
+ }
+ mKeySessions.Put(session->GetSessionId(), session);
+ promise->MaybeResolve(session);
+}
+
+class MediaKeysGMPCrashHelper : public GMPCrashHelper
+{
+public:
+ explicit MediaKeysGMPCrashHelper(MediaKeys* aMediaKeys)
+ : mMediaKeys(aMediaKeys)
+ {
+ MOZ_ASSERT(NS_IsMainThread()); // WeakPtr isn't thread safe.
+ }
+ already_AddRefed<nsPIDOMWindowInner>
+ GetPluginCrashedEventTarget() override
+ {
+ MOZ_ASSERT(NS_IsMainThread()); // WeakPtr isn't thread safe.
+ EME_LOG("MediaKeysGMPCrashHelper::GetPluginCrashedEventTarget()");
+ return (mMediaKeys && mMediaKeys->GetParentObject()) ?
+ do_AddRef(mMediaKeys->GetParentObject()) : nullptr;
+ }
+private:
+ WeakPtr<MediaKeys> mMediaKeys;
+};
+
+already_AddRefed<CDMProxy>
+MediaKeys::CreateCDMProxy()
+{
+ RefPtr<CDMProxy> proxy;
+#ifdef MOZ_WIDGET_ANDROID
+ if (IsWidevineKeySystem(mKeySystem)) {
+ proxy = new MediaDrmCDMProxy(this,
+ mKeySystem,
+ mConfig.mDistinctiveIdentifier == MediaKeysRequirement::Required,
+ mConfig.mPersistentState == MediaKeysRequirement::Required);
+ } else
+#endif
+ {
+ proxy = new GMPCDMProxy(this,
+ mKeySystem,
+ new MediaKeysGMPCrashHelper(this),
+ mConfig.mDistinctiveIdentifier == MediaKeysRequirement::Required,
+ mConfig.mPersistentState == MediaKeysRequirement::Required);
+ }
+ return proxy.forget();
+}
+
+already_AddRefed<DetailedPromise>
+MediaKeys::Init(ErrorResult& aRv)
+{
+ RefPtr<DetailedPromise> promise(MakePromise(aRv,
+ NS_LITERAL_CSTRING("MediaKeys::Init()")));
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ mProxy = CreateCDMProxy();
+
+ // Determine principal (at creation time) of the MediaKeys object.
+ nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(GetParentObject());
+ if (!sop) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get script principal in MediaKeys::Init"));
+ return promise.forget();
+ }
+ mPrincipal = sop->GetPrincipal();
+
+ // Determine principal of the "top-level" window; the principal of the
+ // page that will display in the URL bar.
+ nsCOMPtr<nsPIDOMWindowInner> window = GetParentObject();
+ if (!window) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get top-level window in MediaKeys::Init"));
+ return promise.forget();
+ }
+ nsCOMPtr<nsPIDOMWindowOuter> top = window->GetOuterWindow()->GetTop();
+ if (!top || !top->GetExtantDoc()) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get document in MediaKeys::Init"));
+ return promise.forget();
+ }
+
+ mTopLevelPrincipal = top->GetExtantDoc()->NodePrincipal();
+
+ if (!mPrincipal || !mTopLevelPrincipal) {
+ NS_WARNING("Failed to get principals when creating MediaKeys");
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get principal(s) in MediaKeys::Init"));
+ return promise.forget();
+ }
+
+ nsAutoCString origin;
+ nsresult rv = mPrincipal->GetOrigin(origin);
+ if (NS_FAILED(rv)) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get principal origin string in MediaKeys::Init"));
+ return promise.forget();
+ }
+ nsAutoCString topLevelOrigin;
+ rv = mTopLevelPrincipal->GetOrigin(topLevelOrigin);
+ if (NS_FAILED(rv)) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get top-level principal origin string in MediaKeys::Init"));
+ return promise.forget();
+ }
+
+ nsIDocument* doc = window->GetExtantDoc();
+ const bool inPrivateBrowsing = nsContentUtils::IsInPrivateBrowsing(doc);
+
+ EME_LOG("MediaKeys[%p]::Create() (%s, %s), %s",
+ this,
+ origin.get(),
+ topLevelOrigin.get(),
+ (inPrivateBrowsing ? "PrivateBrowsing" : "NonPrivateBrowsing"));
+
+ // The CDMProxy's initialization is asynchronous. The MediaKeys is
+ // refcounted, and its instance is returned to JS by promise once
+ // it's been initialized. No external refs exist to the MediaKeys while
+ // we're waiting for the promise to be resolved, so we must hold a
+ // reference to the new MediaKeys object until it's been created,
+ // or its creation has failed. Store the id of the promise returned
+ // here, and hold a self-reference until that promise is resolved or
+ // rejected.
+ MOZ_ASSERT(!mCreatePromiseId, "Should only be created once!");
+ mCreatePromiseId = StorePromise(promise);
+ AddRef();
+ mProxy->Init(mCreatePromiseId,
+ NS_ConvertUTF8toUTF16(origin),
+ NS_ConvertUTF8toUTF16(topLevelOrigin),
+ KeySystemToGMPName(mKeySystem),
+ inPrivateBrowsing);
+
+ return promise.forget();
+}
+
+void
+MediaKeys::OnCDMCreated(PromiseId aId, const nsACString& aNodeId, const uint32_t aPluginId)
+{
+ RefPtr<DetailedPromise> promise(RetrievePromise(aId));
+ if (!promise) {
+ return;
+ }
+ mNodeId = aNodeId;
+ RefPtr<MediaKeys> keys(this);
+ EME_LOG("MediaKeys[%p]::OnCDMCreated() resolve promise id=%d", this, aId);
+ promise->MaybeResolve(keys);
+ if (mCreatePromiseId == aId) {
+ Release();
+ }
+
+ MediaKeySystemAccess::NotifyObservers(mParent,
+ mKeySystem,
+ MediaKeySystemStatus::Cdm_created);
+
+ Telemetry::Accumulate(Telemetry::VIDEO_CDM_CREATED, ToCDMTypeTelemetryEnum(mKeySystem));
+}
+
+static bool
+IsSessionTypeSupported(const MediaKeySessionType aSessionType,
+ const MediaKeySystemConfiguration& aConfig)
+{
+ if (aSessionType == MediaKeySessionType::Temporary) {
+ // Temporary is always supported.
+ return true;
+ }
+ if (!aConfig.mSessionTypes.WasPassed()) {
+ // No other session types supported.
+ return false;
+ }
+ using MediaKeySessionTypeValues::strings;
+ const char* sessionType = strings[static_cast<uint32_t>(aSessionType)].value;
+ for (const nsString& s : aConfig.mSessionTypes.Value()) {
+ if (s.EqualsASCII(sessionType)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+already_AddRefed<MediaKeySession>
+MediaKeys::CreateSession(JSContext* aCx,
+ MediaKeySessionType aSessionType,
+ ErrorResult& aRv)
+{
+ if (!IsSessionTypeSupported(aSessionType, mConfig)) {
+ EME_LOG("MediaKeys[%p,'%s'] CreateSession() failed, unsupported session type", this);
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ if (!mProxy) {
+ NS_WARNING("Tried to use a MediaKeys which lost its CDM");
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+
+ EME_LOG("MediaKeys[%p] Creating session", this);
+
+ RefPtr<MediaKeySession> session = new MediaKeySession(aCx,
+ GetParentObject(),
+ this,
+ mKeySystem,
+ aSessionType,
+ aRv);
+
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ // Add session to the set of sessions awaiting their sessionId being ready.
+ mPendingSessions.Put(session->Token(), session);
+
+ return session.forget();
+}
+
+void
+MediaKeys::OnSessionLoaded(PromiseId aId, bool aSuccess)
+{
+ RefPtr<DetailedPromise> promise(RetrievePromise(aId));
+ if (!promise) {
+ return;
+ }
+ EME_LOG("MediaKeys[%p]::OnSessionLoaded() resolve promise id=%d", this, aId);
+
+ promise->MaybeResolve(aSuccess);
+}
+
+void
+MediaKeys::OnSessionClosed(MediaKeySession* aSession)
+{
+ nsAutoString id;
+ aSession->GetSessionId(id);
+ mKeySessions.Remove(id);
+}
+
+already_AddRefed<MediaKeySession>
+MediaKeys::GetSession(const nsAString& aSessionId)
+{
+ RefPtr<MediaKeySession> session;
+ mKeySessions.Get(aSessionId, getter_AddRefs(session));
+ return session.forget();
+}
+
+already_AddRefed<MediaKeySession>
+MediaKeys::GetPendingSession(uint32_t aToken)
+{
+ RefPtr<MediaKeySession> session;
+ mPendingSessions.Get(aToken, getter_AddRefs(session));
+ mPendingSessions.Remove(aToken);
+ return session.forget();
+}
+
+const nsCString&
+MediaKeys::GetNodeId() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mNodeId;
+}
+
+bool
+MediaKeys::IsBoundToMediaElement() const
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mElement != nullptr;
+}
+
+nsresult
+MediaKeys::Bind(HTMLMediaElement* aElement)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (IsBoundToMediaElement()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mElement = aElement;
+
+ return NS_OK;
+}
+
+void
+MediaKeys::Unbind()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mElement = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/eme/MediaKeys.h b/dom/media/eme/MediaKeys.h
new file mode 100644
index 000000000..a3dbf37df
--- /dev/null
+++ b/dom/media/eme/MediaKeys.h
@@ -0,0 +1,168 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_mediakeys_h__
+#define mozilla_dom_mediakeys_h__
+
+#include "nsWrapperCache.h"
+#include "nsISupports.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/RefPtr.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsRefPtrHashtable.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/dom/MediaKeysBinding.h"
+#include "mozilla/dom/MediaKeySystemAccessBinding.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "mozilla/DetailedPromise.h"
+#include "mozilla/WeakPtr.h"
+
+namespace mozilla {
+
+class CDMProxy;
+
+namespace dom {
+
+class ArrayBufferViewOrArrayBuffer;
+class MediaKeySession;
+class HTMLMediaElement;
+
+typedef nsRefPtrHashtable<nsStringHashKey, MediaKeySession> KeySessionHashMap;
+typedef nsRefPtrHashtable<nsUint32HashKey, dom::DetailedPromise> PromiseHashMap;
+typedef nsRefPtrHashtable<nsUint32HashKey, MediaKeySession> PendingKeySessionsHashMap;
+typedef nsDataHashtable<nsUint32HashKey, uint32_t> PendingPromiseIdTokenHashMap;
+typedef uint32_t PromiseId;
+
+// This class is used on the main thread only.
+// Note: its addref/release is not (and can't be) thread safe!
+class MediaKeys final : public nsISupports,
+ public nsWrapperCache,
+ public SupportsWeakPtr<MediaKeys>
+{
+ ~MediaKeys();
+
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MediaKeys)
+ MOZ_DECLARE_WEAKREFERENCE_TYPENAME(MediaKeys)
+
+ MediaKeys(nsPIDOMWindowInner* aParentWindow,
+ const nsAString& aKeySystem,
+ const MediaKeySystemConfiguration& aConfig);
+
+ already_AddRefed<DetailedPromise> Init(ErrorResult& aRv);
+
+ nsPIDOMWindowInner* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ nsresult Bind(HTMLMediaElement* aElement);
+ void Unbind();
+
+ // Javascript: readonly attribute DOMString keySystem;
+ void GetKeySystem(nsString& retval) const;
+
+ // JavaScript: MediaKeys.createSession()
+ already_AddRefed<MediaKeySession> CreateSession(JSContext* aCx,
+ MediaKeySessionType aSessionType,
+ ErrorResult& aRv);
+
+ // JavaScript: MediaKeys.SetServerCertificate()
+ already_AddRefed<DetailedPromise>
+ SetServerCertificate(const ArrayBufferViewOrArrayBuffer& aServerCertificate,
+ ErrorResult& aRv);
+
+ already_AddRefed<MediaKeySession> GetSession(const nsAString& aSessionId);
+
+ // Removes and returns MediaKeySession from the set of sessions awaiting
+ // their sessionId to be assigned.
+ already_AddRefed<MediaKeySession> GetPendingSession(uint32_t aToken);
+
+ // Called once a Init() operation succeeds.
+ void OnCDMCreated(PromiseId aId,
+ const nsACString& aNodeId, const uint32_t aPluginId);
+
+ // Called once the CDM generates a sessionId while servicing a
+ // MediaKeySession.generateRequest() or MediaKeySession.load() call,
+ // once the sessionId of a MediaKeySession is known.
+ void OnSessionIdReady(MediaKeySession* aSession);
+
+ // Called once a LoadSession succeeds.
+ void OnSessionLoaded(PromiseId aId, bool aSuccess);
+
+ // Called once a session has closed.
+ void OnSessionClosed(MediaKeySession* aSession);
+
+ CDMProxy* GetCDMProxy() { return mProxy; }
+
+ // Makes a new promise, or nullptr on failure.
+ already_AddRefed<DetailedPromise> MakePromise(ErrorResult& aRv,
+ const nsACString& aName);
+ // Stores promise in mPromises, returning an ID that can be used to retrieve
+ // it later. The ID is passed to the CDM, so that it can signal specific
+ // promises to be resolved.
+ PromiseId StorePromise(DetailedPromise* aPromise);
+
+ // Stores a map from promise id to pending session token. Using this
+ // mapping, when a promise is rejected via its ID, we can check if the
+ // promise corresponds to a pending session and retrieve that session
+ // via the mapped-to token, and remove the pending session from the
+ // list of sessions awaiting a session id.
+ void ConnectPendingPromiseIdWithToken(PromiseId aId, uint32_t aToken);
+
+ // Reject promise with DOMException corresponding to aExceptionCode.
+ void RejectPromise(PromiseId aId, nsresult aExceptionCode,
+ const nsCString& aReason);
+ // Resolves promise with "undefined".
+ void ResolvePromise(PromiseId aId);
+
+ const nsCString& GetNodeId() const;
+
+ void Shutdown();
+
+ // Called by CDMProxy when CDM crashes or shuts down. It is different from
+ // Shutdown which is called from the script/dom side.
+ void Terminated();
+
+ // Returns true if this MediaKeys has been bound to a media element.
+ bool IsBoundToMediaElement() const;
+
+private:
+
+ // Instantiate CDMProxy instance.
+ // It could be MediaDrmCDMProxy (Widevine on Fennec) or GMPCDMProxy (the rest).
+ already_AddRefed<CDMProxy> CreateCDMProxy();
+
+ // Removes promise from mPromises, and returns it.
+ already_AddRefed<DetailedPromise> RetrievePromise(PromiseId aId);
+
+ // Owning ref to proxy. The proxy has a weak reference back to the MediaKeys,
+ // and the MediaKeys destructor clears the proxy's reference to the MediaKeys.
+ RefPtr<CDMProxy> mProxy;
+
+ RefPtr<HTMLMediaElement> mElement;
+
+ nsCOMPtr<nsPIDOMWindowInner> mParent;
+ const nsString mKeySystem;
+ nsCString mNodeId;
+ KeySessionHashMap mKeySessions;
+ PromiseHashMap mPromises;
+ PendingKeySessionsHashMap mPendingSessions;
+ PromiseId mCreatePromiseId;
+
+ RefPtr<nsIPrincipal> mPrincipal;
+ RefPtr<nsIPrincipal> mTopLevelPrincipal;
+
+ const MediaKeySystemConfiguration mConfig;
+
+ PendingPromiseIdTokenHashMap mPromiseIdToken;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_mediakeys_h__
diff --git a/dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.cpp b/dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.cpp
new file mode 100644
index 000000000..ee57afae9
--- /dev/null
+++ b/dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.cpp
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaDrmCDMCallbackProxy.h"
+#include "mozilla/CDMProxy.h"
+#include "nsString.h"
+#include "mozilla/dom/MediaKeys.h"
+#include "mozilla/dom/MediaKeySession.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "nsContentCID.h"
+#include "nsServiceManagerUtils.h"
+#include "MainThreadUtils.h"
+#include "mozilla/EMEUtils.h"
+
+namespace mozilla {
+
+MediaDrmCDMCallbackProxy::MediaDrmCDMCallbackProxy(CDMProxy* aProxy)
+ : mProxy(aProxy)
+{
+
+}
+
+void
+MediaDrmCDMCallbackProxy::SetSessionId(uint32_t aToken,
+ const nsCString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mProxy->OnSetSessionId(aToken, NS_ConvertUTF8toUTF16(aSessionId));
+}
+
+void
+MediaDrmCDMCallbackProxy::ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mProxy->OnResolveLoadSessionPromise(aPromiseId, aSuccess);
+}
+
+void
+MediaDrmCDMCallbackProxy::ResolvePromise(uint32_t aPromiseId)
+{
+ // Note: CDMProxy proxies this from non-main threads to main thread.
+ mProxy->ResolvePromise(aPromiseId);
+}
+
+void
+MediaDrmCDMCallbackProxy::RejectPromise(uint32_t aPromiseId,
+ nsresult aException,
+ const nsCString& aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mProxy->OnRejectPromise(aPromiseId, aException, aMessage);
+}
+
+void
+MediaDrmCDMCallbackProxy::SessionMessage(const nsCString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // For removing constness
+ nsTArray<uint8_t> message(aMessage);
+ mProxy->OnSessionMessage(NS_ConvertUTF8toUTF16(aSessionId), aMessageType, message);
+}
+
+void
+MediaDrmCDMCallbackProxy::ExpirationChange(const nsCString& aSessionId,
+ UnixTime aExpiryTime)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mProxy->OnExpirationChange(NS_ConvertUTF8toUTF16(aSessionId), aExpiryTime);
+}
+
+void
+MediaDrmCDMCallbackProxy::SessionClosed(const nsCString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ bool keyStatusesChange = false;
+ {
+ CDMCaps::AutoLock caps(mProxy->Capabilites());
+ keyStatusesChange = caps.RemoveKeysForSession(NS_ConvertUTF8toUTF16(aSessionId));
+ }
+ if (keyStatusesChange) {
+ mProxy->OnKeyStatusesChange(NS_ConvertUTF8toUTF16(aSessionId));
+ }
+ mProxy->OnSessionClosed(NS_ConvertUTF8toUTF16(aSessionId));
+}
+
+void
+MediaDrmCDMCallbackProxy::SessionError(const nsCString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsCString& aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mProxy->OnSessionError(NS_ConvertUTF8toUTF16(aSessionId),
+ aException,
+ aSystemCode,
+ NS_ConvertUTF8toUTF16(aMessage));
+}
+
+void
+MediaDrmCDMCallbackProxy::BatchedKeyStatusChanged(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ BatchedKeyStatusChangedInternal(aSessionId, aKeyInfos);
+}
+
+void
+MediaDrmCDMCallbackProxy::BatchedKeyStatusChangedInternal(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos)
+{
+ bool keyStatusesChange = false;
+ {
+ CDMCaps::AutoLock caps(mProxy->Capabilites());
+ for (size_t i = 0; i < aKeyInfos.Length(); i++) {
+ keyStatusesChange |=
+ caps.SetKeyStatus(aKeyInfos[i].mKeyId,
+ NS_ConvertUTF8toUTF16(aSessionId),
+ aKeyInfos[i].mStatus);
+ }
+ }
+ if (keyStatusesChange) {
+ mProxy->OnKeyStatusesChange(NS_ConvertUTF8toUTF16(aSessionId));
+ }
+}
+
+void
+MediaDrmCDMCallbackProxy::Decrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData)
+{
+ MOZ_ASSERT_UNREACHABLE("Fennec could not handle decrypted event");
+}
+
+} // namespace mozilla \ No newline at end of file
diff --git a/dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.h b/dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.h
new file mode 100644
index 000000000..29f9c8192
--- /dev/null
+++ b/dom/media/eme/mediadrm/MediaDrmCDMCallbackProxy.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaDrmCDMCallbackProxy_h_
+#define MediaDrmCDMCallbackProxy_h_
+
+#include "mozilla/CDMProxy.h"
+#include "mozilla/DecryptorProxyCallback.h"
+
+namespace mozilla {
+class CDMProxy;
+// Proxies call backs from the MediaDrmProxy -> MediaDrmProxySupport back to the MediaKeys
+// object on the main thread.
+// We used annotation calledFrom = "gecko" to ensure running on main thread.
+class MediaDrmCDMCallbackProxy : public DecryptorProxyCallback {
+public:
+
+ void SetDecryptorId(uint32_t aId) override {}
+
+ void SetSessionId(uint32_t aCreateSessionToken,
+ const nsCString& aSessionId) override;
+
+ void ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) override;
+
+ void ResolvePromise(uint32_t aPromiseId) override;
+
+ void RejectPromise(uint32_t aPromiseId,
+ nsresult aException,
+ const nsCString& aSessionId) override;
+
+ void SessionMessage(const nsCString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage) override;
+
+ void ExpirationChange(const nsCString& aSessionId,
+ UnixTime aExpiryTime) override;
+
+ void SessionClosed(const nsCString& aSessionId) override;
+
+ void SessionError(const nsCString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsCString& aMessage) override;
+
+ void Decrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) override;
+
+ void BatchedKeyStatusChanged(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos) override;
+
+ ~MediaDrmCDMCallbackProxy() {}
+
+private:
+ friend class MediaDrmCDMProxy;
+ explicit MediaDrmCDMCallbackProxy(CDMProxy* aProxy);
+
+ void BatchedKeyStatusChangedInternal(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos);
+ // Warning: Weak ref.
+ CDMProxy* mProxy;
+};
+
+} // namespace mozilla
+#endif \ No newline at end of file
diff --git a/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp b/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp
new file mode 100644
index 000000000..a57d764e7
--- /dev/null
+++ b/dom/media/eme/mediadrm/MediaDrmCDMProxy.cpp
@@ -0,0 +1,467 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MediaKeySession.h"
+#include "mozilla/MediaDrmCDMProxy.h"
+#include "MediaDrmCDMCallbackProxy.h"
+
+using namespace mozilla::java::sdk;
+
+namespace mozilla {
+
+MediaDrmSessionType
+ToMediaDrmSessionType(dom::MediaKeySessionType aSessionType)
+{
+ switch (aSessionType) {
+ case dom::MediaKeySessionType::Temporary: return kKeyStreaming;
+ case dom::MediaKeySessionType::Persistent_license: return kKeyOffline;
+ default: return kKeyStreaming;
+ };
+}
+
+MediaDrmCDMProxy::MediaDrmCDMProxy(dom::MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired)
+ : CDMProxy(aKeys,
+ aKeySystem,
+ aDistinctiveIdentifierRequired,
+ aPersistentStateRequired)
+ , mCDM(nullptr)
+ , mShutdownCalled(false)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(MediaDrmCDMProxy);
+}
+
+MediaDrmCDMProxy::~MediaDrmCDMProxy()
+{
+ MOZ_COUNT_DTOR(MediaDrmCDMProxy);
+}
+
+void
+MediaDrmCDMProxy::Init(PromiseId aPromiseId,
+ const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aName,
+ bool aInPrivateBrowsing)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ EME_LOG("MediaDrmCDMProxy::Init (%s, %s) %s",
+ NS_ConvertUTF16toUTF8(aOrigin).get(),
+ NS_ConvertUTF16toUTF8(aTopLevelOrigin).get(),
+ (aInPrivateBrowsing ? "PrivateBrowsing" : "NonPrivateBrowsing"));
+
+ // Create a thread to work with cdm.
+ if (!mOwnerThread) {
+ nsresult rv = NS_NewNamedThread("MDCDMThread", getter_AddRefs(mOwnerThread));
+ if (NS_FAILED(rv)) {
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't create CDM thread MediaDrmCDMProxy::Init"));
+ return;
+ }
+ }
+
+ mCDM = mozilla::MakeUnique<MediaDrmProxySupport>(mKeySystem);
+ nsCOMPtr<nsIRunnable> task(NewRunnableMethod<uint32_t>(this,
+ &MediaDrmCDMProxy::md_Init,
+ aPromiseId));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+MediaDrmCDMProxy::CreateSession(uint32_t aCreateSessionToken,
+ MediaKeySessionType aSessionType,
+ PromiseId aPromiseId,
+ const nsAString& aInitDataType,
+ nsTArray<uint8_t>& aInitData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+
+ nsAutoPtr<CreateSessionData> data(new CreateSessionData());
+ data->mSessionType = aSessionType;
+ data->mCreateSessionToken = aCreateSessionToken;
+ data->mPromiseId = aPromiseId;
+ data->mInitDataType = NS_ConvertUTF16toUTF8(aInitDataType);
+ data->mInitData = Move(aInitData);
+
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<CreateSessionData>>(this,
+ &MediaDrmCDMProxy::md_CreateSession,
+ data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+MediaDrmCDMProxy::LoadSession(PromiseId aPromiseId,
+ const nsAString& aSessionId)
+{
+ // TODO: Implement LoadSession.
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Currently Fennec did not support LoadSession"));
+}
+
+void
+MediaDrmCDMProxy::SetServerCertificate(PromiseId aPromiseId,
+ nsTArray<uint8_t>& aCert)
+{
+ // TODO: Implement SetServerCertificate.
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Currently Fennec did not support SetServerCertificate"));
+}
+
+void
+MediaDrmCDMProxy::UpdateSession(const nsAString& aSessionId,
+ PromiseId aPromiseId,
+ nsTArray<uint8_t>& aResponse)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ nsAutoPtr<UpdateSessionData> data(new UpdateSessionData());
+ data->mPromiseId = aPromiseId;
+ data->mSessionId = NS_ConvertUTF16toUTF8(aSessionId);
+ data->mResponse = Move(aResponse);
+
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<UpdateSessionData>>(this,
+ &MediaDrmCDMProxy::md_UpdateSession,
+ data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+MediaDrmCDMProxy::CloseSession(const nsAString& aSessionId,
+ PromiseId aPromiseId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ nsAutoPtr<SessionOpData> data(new SessionOpData());
+ data->mPromiseId = aPromiseId;
+ data->mSessionId = NS_ConvertUTF16toUTF8(aSessionId);
+
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<SessionOpData>>(this,
+ &MediaDrmCDMProxy::md_CloseSession,
+ data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+MediaDrmCDMProxy::RemoveSession(const nsAString& aSessionId,
+ PromiseId aPromiseId)
+{
+ // TODO: Implement RemoveSession.
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Currently Fennec did not support RemoveSession"));
+}
+
+void
+MediaDrmCDMProxy::Shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod(this, &MediaDrmCDMProxy::md_Shutdown));
+
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+ mOwnerThread->Shutdown();
+ mOwnerThread = nullptr;
+}
+
+void
+MediaDrmCDMProxy::Terminated()
+{
+ // TODO: Implement Terminated.
+ // Should find a way to handle the case when remote side MediaDrm crashed.
+}
+
+const nsCString&
+MediaDrmCDMProxy::GetNodeId() const
+{
+ return mNodeId;
+}
+
+void
+MediaDrmCDMProxy::OnSetSessionId(uint32_t aCreateSessionToken,
+ const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+
+ RefPtr<dom::MediaKeySession> session(mKeys->GetPendingSession(aCreateSessionToken));
+ if (session) {
+ session->SetSessionId(aSessionId);
+ }
+}
+
+void
+MediaDrmCDMProxy::OnResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccess)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ mKeys->OnSessionLoaded(aPromiseId, aSuccess);
+}
+
+void
+MediaDrmCDMProxy::OnSessionMessage(const nsAString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ nsTArray<uint8_t>& aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->DispatchKeyMessage(aMessageType, aMessage);
+ }
+}
+
+void
+MediaDrmCDMProxy::OnExpirationChange(const nsAString& aSessionId,
+ UnixTime aExpiryTime)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->SetExpiration(static_cast<double>(aExpiryTime));
+ }
+}
+
+void
+MediaDrmCDMProxy::OnSessionClosed(const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->OnClosed();
+ }
+}
+
+void
+MediaDrmCDMProxy::OnSessionError(const nsAString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsAString& aMsg)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->DispatchKeyError(aSystemCode);
+ }
+}
+
+void
+MediaDrmCDMProxy::OnRejectPromise(uint32_t aPromiseId,
+ nsresult aDOMException,
+ const nsCString& aMsg)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RejectPromise(aPromiseId, aDOMException, aMsg);
+}
+
+RefPtr<MediaDrmCDMProxy::DecryptPromise>
+MediaDrmCDMProxy::Decrypt(MediaRawData* aSample)
+{
+ MOZ_ASSERT_UNREACHABLE("Fennec could not handle decrypting individually");
+ return nullptr;
+}
+
+void
+MediaDrmCDMProxy::OnDecrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData)
+{
+ MOZ_ASSERT_UNREACHABLE("Fennec could not handle decrypted event");
+}
+
+void
+MediaDrmCDMProxy::RejectPromise(PromiseId aId, nsresult aCode,
+ const nsCString& aReason)
+{
+ if (NS_IsMainThread()) {
+ if (!mKeys.IsNull()) {
+ mKeys->RejectPromise(aId, aCode, aReason);
+ }
+ } else {
+ nsCOMPtr<nsIRunnable> task(new RejectPromiseTask(this, aId, aCode,
+ aReason));
+ NS_DispatchToMainThread(task);
+ }
+}
+
+void
+MediaDrmCDMProxy::ResolvePromise(PromiseId aId)
+{
+ if (NS_IsMainThread()) {
+ if (!mKeys.IsNull()) {
+ mKeys->ResolvePromise(aId);
+ } else {
+ NS_WARNING("MediaDrmCDMProxy unable to resolve promise!");
+ }
+ } else {
+ nsCOMPtr<nsIRunnable> task;
+ task = NewRunnableMethod<PromiseId>(this,
+ &MediaDrmCDMProxy::ResolvePromise,
+ aId);
+ NS_DispatchToMainThread(task);
+ }
+}
+
+const nsString&
+MediaDrmCDMProxy::KeySystem() const
+{
+ return mKeySystem;
+}
+
+CDMCaps&
+MediaDrmCDMProxy::Capabilites()
+{
+ return mCapabilites;
+}
+
+void
+MediaDrmCDMProxy::OnKeyStatusesChange(const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->DispatchKeyStatusesChange();
+ }
+}
+
+void
+MediaDrmCDMProxy::GetSessionIdsForKeyId(const nsTArray<uint8_t>& aKeyId,
+ nsTArray<nsCString>& aSessionIds)
+{
+ CDMCaps::AutoLock caps(Capabilites());
+ caps.GetSessionIdsForKeyId(aKeyId, aSessionIds);
+}
+
+#ifdef DEBUG
+bool
+MediaDrmCDMProxy::IsOnOwnerThread()
+{
+ return NS_GetCurrentThread() == mOwnerThread;
+}
+#endif
+
+void
+MediaDrmCDMProxy::OnCDMCreated(uint32_t aPromiseId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+
+ if (mCDM) {
+ mKeys->OnCDMCreated(aPromiseId, GetNodeId(), 0);
+ return;
+ }
+
+ // No CDM? Just reject the promise.
+ mKeys->RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in OnCDMCreated()"));
+}
+
+void
+MediaDrmCDMProxy::md_Init(uint32_t aPromiseId)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ MOZ_ASSERT(mCDM);
+
+ mCallback = new MediaDrmCDMCallbackProxy(this);
+ mCDM->Init(mCallback);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<uint32_t>(this,
+ &MediaDrmCDMProxy::OnCDMCreated,
+ aPromiseId));
+ NS_DispatchToMainThread(task);
+}
+
+void
+MediaDrmCDMProxy::md_CreateSession(nsAutoPtr<CreateSessionData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in md_CreateSession"));
+ return;
+ }
+
+ mCDM->CreateSession(aData->mCreateSessionToken,
+ aData->mPromiseId,
+ aData->mInitDataType,
+ aData->mInitData,
+ ToMediaDrmSessionType(aData->mSessionType));
+}
+
+void
+MediaDrmCDMProxy::md_UpdateSession(nsAutoPtr<UpdateSessionData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in md_UpdateSession"));
+ return;
+ }
+ mCDM->UpdateSession(aData->mPromiseId,
+ aData->mSessionId,
+ aData->mResponse);
+}
+
+void
+MediaDrmCDMProxy::md_CloseSession(nsAutoPtr<SessionOpData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in md_CloseSession"));
+ return;
+ }
+ mCDM->CloseSession(aData->mPromiseId, aData->mSessionId);
+}
+
+void
+MediaDrmCDMProxy::md_Shutdown()
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ MOZ_ASSERT(mCDM);
+ if (mShutdownCalled) {
+ return;
+ }
+ mShutdownCalled = true;
+ mCDM->Shutdown();
+ mCDM = nullptr;
+}
+
+} // namespace mozilla \ No newline at end of file
diff --git a/dom/media/eme/mediadrm/MediaDrmCDMProxy.h b/dom/media/eme/mediadrm/MediaDrmCDMProxy.h
new file mode 100644
index 000000000..c7cb3000f
--- /dev/null
+++ b/dom/media/eme/mediadrm/MediaDrmCDMProxy.h
@@ -0,0 +1,184 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaDrmCDMProxy_h_
+#define MediaDrmCDMProxy_h_
+
+#include <jni.h>
+#include "mozilla/jni/Types.h"
+#include "GeneratedJNINatives.h"
+
+#include "mozilla/CDMProxy.h"
+#include "mozilla/CDMCaps.h"
+#include "mozilla/dom/MediaKeys.h"
+#include "mozilla/MediaDrmProxySupport.h"
+#include "mozilla/UniquePtr.h"
+
+#include "MediaCodec.h"
+#include "nsString.h"
+#include "nsAutoPtr.h"
+
+using namespace mozilla::java;
+
+namespace mozilla {
+class MediaDrmCDMCallbackProxy;
+class MediaDrmCDMProxy : public CDMProxy {
+public:
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDrmCDMProxy)
+
+ MediaDrmCDMProxy(dom::MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired);
+
+ void Init(PromiseId aPromiseId,
+ const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing) override;
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ MediaKeySessionType aSessionType,
+ PromiseId aPromiseId,
+ const nsAString& aInitDataType,
+ nsTArray<uint8_t>& aInitData) override;
+
+ void LoadSession(PromiseId aPromiseId,
+ const nsAString& aSessionId) override;
+
+ void SetServerCertificate(PromiseId aPromiseId,
+ nsTArray<uint8_t>& aCert) override;
+
+ void UpdateSession(const nsAString& aSessionId,
+ PromiseId aPromiseId,
+ nsTArray<uint8_t>& aResponse) override;
+
+ void CloseSession(const nsAString& aSessionId,
+ PromiseId aPromiseId) override;
+
+ void RemoveSession(const nsAString& aSessionId,
+ PromiseId aPromiseId) override;
+
+ void Shutdown() override;
+
+ void Terminated() override;
+
+ const nsCString& GetNodeId() const override;
+
+ void OnSetSessionId(uint32_t aCreateSessionToken,
+ const nsAString& aSessionId) override;
+
+ void OnResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccess) override;
+
+ void OnSessionMessage(const nsAString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ nsTArray<uint8_t>& aMessage) override;
+
+ void OnExpirationChange(const nsAString& aSessionId,
+ UnixTime aExpiryTime) override;
+
+ void OnSessionClosed(const nsAString& aSessionId) override;
+
+ void OnSessionError(const nsAString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsAString& aMsg) override;
+
+ void OnRejectPromise(uint32_t aPromiseId,
+ nsresult aCode,
+ const nsCString& aMsg) override;
+
+ RefPtr<DecryptPromise> Decrypt(MediaRawData* aSample) override;
+ void OnDecrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) override;
+
+ void RejectPromise(PromiseId aId, nsresult aCode,
+ const nsCString& aReason) override;
+
+ // Resolves promise with "undefined".
+ // Can be called from any thread.
+ void ResolvePromise(PromiseId aId) override;
+
+ // Threadsafe.
+ const nsString& KeySystem() const override;
+
+ CDMCaps& Capabilites() override;
+
+ void OnKeyStatusesChange(const nsAString& aSessionId) override;
+
+ void GetSessionIdsForKeyId(const nsTArray<uint8_t>& aKeyId,
+ nsTArray<nsCString>& aSessionIds) override;
+
+#ifdef DEBUG
+ bool IsOnOwnerThread() override;
+#endif
+
+private:
+ virtual ~MediaDrmCDMProxy();
+
+ void OnCDMCreated(uint32_t aPromiseId);
+
+ struct CreateSessionData {
+ MediaKeySessionType mSessionType;
+ uint32_t mCreateSessionToken;
+ PromiseId mPromiseId;
+ nsCString mInitDataType;
+ nsTArray<uint8_t> mInitData;
+ };
+
+ struct UpdateSessionData {
+ PromiseId mPromiseId;
+ nsCString mSessionId;
+ nsTArray<uint8_t> mResponse;
+ };
+
+ struct SessionOpData {
+ PromiseId mPromiseId;
+ nsCString mSessionId;
+ };
+
+ class RejectPromiseTask : public Runnable {
+ public:
+ RejectPromiseTask(MediaDrmCDMProxy* aProxy,
+ PromiseId aId,
+ nsresult aCode,
+ const nsCString& aReason)
+ : mProxy(aProxy)
+ , mId(aId)
+ , mCode(aCode)
+ , mReason(aReason)
+ {
+ }
+ NS_METHOD Run() {
+ mProxy->RejectPromise(mId, mCode, mReason);
+ return NS_OK;
+ }
+ private:
+ RefPtr<MediaDrmCDMProxy> mProxy;
+ PromiseId mId;
+ nsresult mCode;
+ nsCString mReason;
+ };
+
+ nsCString mNodeId;
+ mozilla::UniquePtr<MediaDrmProxySupport> mCDM;
+ nsAutoPtr<MediaDrmCDMCallbackProxy> mCallback;
+ bool mShutdownCalled;
+
+// =====================================================================
+// For MediaDrmProxySupport
+ void md_Init(uint32_t aPromiseId);
+ void md_CreateSession(nsAutoPtr<CreateSessionData> aData);
+ void md_UpdateSession(nsAutoPtr<UpdateSessionData> aData);
+ void md_CloseSession(nsAutoPtr<SessionOpData> aData);
+ void md_Shutdown();
+// =====================================================================
+};
+
+} // namespace mozilla
+#endif // MediaDrmCDMProxy_h_ \ No newline at end of file
diff --git a/dom/media/eme/mediadrm/MediaDrmProxySupport.cpp b/dom/media/eme/mediadrm/MediaDrmProxySupport.cpp
new file mode 100644
index 000000000..192769470
--- /dev/null
+++ b/dom/media/eme/mediadrm/MediaDrmProxySupport.cpp
@@ -0,0 +1,284 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaDrmProxySupport.h"
+#include "mozilla/EMEUtils.h"
+#include "FennecJNINatives.h"
+#include "MediaCodec.h" // For MediaDrm::KeyStatus
+#include "MediaPrefs.h"
+
+using namespace mozilla::java;
+
+namespace mozilla {
+
+LogModule* GetMDRMNLog() {
+ static LazyLogModule log("MediaDrmProxySupport");
+ return log;
+}
+
+class MediaDrmJavaCallbacksSupport
+ : public MediaDrmProxy::NativeMediaDrmProxyCallbacks::Natives<MediaDrmJavaCallbacksSupport>
+{
+public:
+ typedef MediaDrmProxy::NativeMediaDrmProxyCallbacks::Natives<MediaDrmJavaCallbacksSupport> MediaDrmProxyNativeCallbacks;
+ using MediaDrmProxyNativeCallbacks::DisposeNative;
+ using MediaDrmProxyNativeCallbacks::AttachNative;
+
+ MediaDrmJavaCallbacksSupport(DecryptorProxyCallback* aDecryptorProxyCallback)
+ : mDecryptorProxyCallback(aDecryptorProxyCallback)
+ {
+ MOZ_ASSERT(aDecryptorProxyCallback);
+ }
+ /*
+ * Native implementation, called by Java.
+ */
+ void OnSessionCreated(int aCreateSessionToken,
+ int aPromiseId,
+ jni::ByteArray::Param aSessionId,
+ jni::ByteArray::Param aRequest);
+
+ void OnSessionUpdated(int aPromiseId, jni::ByteArray::Param aSessionId);
+
+ void OnSessionClosed(int aPromiseId, jni::ByteArray::Param aSessionId);
+
+ void OnSessionMessage(jni::ByteArray::Param aSessionId,
+ int /*mozilla::dom::MediaKeyMessageType*/ aSessionMessageType,
+ jni::ByteArray::Param aRequest);
+
+ void OnSessionError(jni::ByteArray::Param aSessionId,
+ jni::String::Param aMessage);
+
+ void OnSessionBatchedKeyChanged(jni::ByteArray::Param,
+ jni::ObjectArray::Param);
+
+ void OnRejectPromise(int aPromiseId, jni::String::Param aMessage);
+
+private:
+ DecryptorProxyCallback* mDecryptorProxyCallback;
+}; // MediaDrmJavaCallbacksSupport
+
+void
+MediaDrmJavaCallbacksSupport::OnSessionCreated(int aCreateSessionToken,
+ int aPromiseId,
+ jni::ByteArray::Param aSessionId,
+ jni::ByteArray::Param aRequest)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ auto reqDataArray = aRequest->GetElements();
+ nsCString sessionId(reinterpret_cast<char*>(aSessionId->GetElements().Elements()),
+ aSessionId->Length());
+ MDRMN_LOG("SessionId(%s) closed", sessionId.get());
+
+ mDecryptorProxyCallback->SetSessionId(aCreateSessionToken, sessionId);
+ mDecryptorProxyCallback->ResolvePromise(aPromiseId);
+}
+
+void
+MediaDrmJavaCallbacksSupport::OnSessionUpdated(int aPromiseId,
+ jni::ByteArray::Param aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MDRMN_LOG("SessionId(%s) closed",
+ nsCString(reinterpret_cast<char*>(aSessionId->GetElements().Elements()),
+ aSessionId->Length()).get());
+ mDecryptorProxyCallback->ResolvePromise(aPromiseId);
+}
+
+void
+MediaDrmJavaCallbacksSupport::OnSessionClosed(int aPromiseId,
+ jni::ByteArray::Param aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCString sessionId(reinterpret_cast<char*>(aSessionId->GetElements().Elements()),
+ aSessionId->Length());
+ MDRMN_LOG("SessionId(%s) closed", sessionId.get());
+ mDecryptorProxyCallback->ResolvePromise(aPromiseId);
+ mDecryptorProxyCallback->SessionClosed(sessionId);
+}
+
+void
+MediaDrmJavaCallbacksSupport::OnSessionMessage(jni::ByteArray::Param aSessionId,
+ int /*mozilla::dom::MediaKeyMessageType*/ aMessageType,
+ jni::ByteArray::Param aRequest)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCString sessionId(reinterpret_cast<char*>(aSessionId->GetElements().Elements()),
+ aSessionId->Length());
+ auto reqDataArray = aRequest->GetElements();
+
+ nsTArray<uint8_t> retRequest;
+ retRequest.AppendElements(reinterpret_cast<uint8_t*>(reqDataArray.Elements()),
+ reqDataArray.Length());
+
+ mDecryptorProxyCallback->SessionMessage(sessionId,
+ static_cast<dom::MediaKeyMessageType>(aMessageType),
+ retRequest);
+}
+
+void
+MediaDrmJavaCallbacksSupport::OnSessionError(jni::ByteArray::Param aSessionId,
+ jni::String::Param aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCString sessionId(reinterpret_cast<char*>(aSessionId->GetElements().Elements()),
+ aSessionId->Length());
+ nsCString errorMessage = aMessage->ToCString();
+ MDRMN_LOG("SessionId(%s)", sessionId.get());
+ // TODO: We cannot get system error code from media drm API.
+ // Currently use -1 as an error code.
+ mDecryptorProxyCallback->SessionError(sessionId,
+ NS_ERROR_DOM_INVALID_STATE_ERR,
+ -1,
+ errorMessage);
+}
+
+// TODO: MediaDrm.KeyStatus defined the status code not included
+// dom::MediaKeyStatus::Released and dom::MediaKeyStatus::Output_downscaled.
+// Should keep tracking for this if it will be changed in the future.
+static dom::MediaKeyStatus
+MediaDrmKeyStatusToMediaKeyStatus(int aStatusCode)
+{
+ using mozilla::java::sdk::KeyStatus;
+ switch (aStatusCode) {
+ case KeyStatus::STATUS_USABLE: return dom::MediaKeyStatus::Usable;
+ case KeyStatus::STATUS_EXPIRED: return dom::MediaKeyStatus::Expired;
+ case KeyStatus::STATUS_OUTPUT_NOT_ALLOWED: return dom::MediaKeyStatus::Output_restricted;
+ case KeyStatus::STATUS_INTERNAL_ERROR: return dom::MediaKeyStatus::Internal_error;
+ case KeyStatus::STATUS_PENDING: return dom::MediaKeyStatus::Status_pending;
+ default: return dom::MediaKeyStatus::Internal_error;
+ }
+}
+
+void
+MediaDrmJavaCallbacksSupport::OnSessionBatchedKeyChanged(jni::ByteArray::Param aSessionId,
+ jni::ObjectArray::Param aKeyInfos)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCString sessionId(reinterpret_cast<char*>(aSessionId->GetElements().Elements()),
+ aSessionId->Length());
+ nsTArray<jni::Object::LocalRef> keyInfosObjectArray(aKeyInfos->GetElements());
+
+ nsTArray<CDMKeyInfo> keyInfosArray;
+
+ for (auto&& keyInfoObject : keyInfosObjectArray) {
+ java::SessionKeyInfo::LocalRef keyInfo(mozilla::Move(keyInfoObject));
+ mozilla::jni::ByteArray::LocalRef keyIdByteArray = keyInfo->KeyId();
+ nsTArray<int8_t> keyIdInt8Array = keyIdByteArray->GetElements();
+ // Cast nsTArray<int8_t> to nsTArray<uint8_t>
+ nsTArray<uint8_t>* keyId = reinterpret_cast<nsTArray<uint8_t>*>(&keyIdInt8Array);
+ auto keyStatus = keyInfo->Status(); // int32_t
+ keyInfosArray.AppendElement(CDMKeyInfo(*keyId,
+ dom::Optional<dom::MediaKeyStatus>(
+ MediaDrmKeyStatusToMediaKeyStatus(keyStatus)
+ )
+ )
+ );
+ }
+
+ mDecryptorProxyCallback->BatchedKeyStatusChanged(sessionId,
+ keyInfosArray);
+}
+
+void
+MediaDrmJavaCallbacksSupport::OnRejectPromise(int aPromiseId, jni::String::Param aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCString reason = aMessage->ToCString();
+ MDRMN_LOG("OnRejectPromise aMessage(%s) ", reason.get());
+ // Current implementation assume all the reject from MediaDrm is due to invalid state.
+ // Other cases should be handled before calling into MediaDrmProxy API.
+ mDecryptorProxyCallback->RejectPromise(aPromiseId,
+ NS_ERROR_DOM_INVALID_STATE_ERR,
+ reason);
+}
+
+MediaDrmProxySupport::MediaDrmProxySupport(const nsAString& aKeySystem)
+ : mKeySystem(aKeySystem), mDestroyed(false)
+{
+ mJavaCallbacks = MediaDrmProxy::NativeMediaDrmProxyCallbacks::New();
+
+ mBridgeProxy =
+ MediaDrmProxy::Create(mKeySystem,
+ mJavaCallbacks,
+ MediaPrefs::PDMAndroidRemoteCodecEnabled());
+}
+
+MediaDrmProxySupport::~MediaDrmProxySupport()
+{
+ MOZ_ASSERT(mDestroyed, "Shutdown() should be called before !!");
+ MediaDrmJavaCallbacksSupport::DisposeNative(mJavaCallbacks);
+}
+
+nsresult
+MediaDrmProxySupport::Init(DecryptorProxyCallback* aCallback)
+{
+ MOZ_ASSERT(mJavaCallbacks);
+
+ mCallback = aCallback;
+ MediaDrmJavaCallbacksSupport::AttachNative(mJavaCallbacks,
+ mozilla::MakeUnique<MediaDrmJavaCallbacksSupport>(mCallback));
+ return mBridgeProxy != nullptr ? NS_OK : NS_ERROR_FAILURE;
+}
+
+void
+MediaDrmProxySupport::CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const nsCString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData,
+ MediaDrmSessionType aSessionType)
+{
+ MOZ_ASSERT(mBridgeProxy);
+
+ auto initDataBytes =
+ mozilla::jni::ByteArray::New(reinterpret_cast<const int8_t*>(&aInitData[0]),
+ aInitData.Length());
+ // TODO: aSessionType is not used here.
+ // Refer to
+ // http://androidxref.com/5.1.1_r6/xref/external/chromium_org/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java#420
+ // it is hard code to streaming type.
+ mBridgeProxy->CreateSession(aCreateSessionToken,
+ aPromiseId,
+ NS_ConvertUTF8toUTF16(aInitDataType),
+ initDataBytes);
+}
+
+void
+MediaDrmProxySupport::UpdateSession(uint32_t aPromiseId,
+ const nsCString& aSessionId,
+ const nsTArray<uint8_t>& aResponse)
+{
+ MOZ_ASSERT(mBridgeProxy);
+
+ auto response =
+ mozilla::jni::ByteArray::New(reinterpret_cast<const int8_t*>(aResponse.Elements()),
+ aResponse.Length());
+ mBridgeProxy->UpdateSession(aPromiseId,
+ NS_ConvertUTF8toUTF16(aSessionId),
+ response);
+}
+
+void
+MediaDrmProxySupport::CloseSession(uint32_t aPromiseId,
+ const nsCString& aSessionId)
+{
+ MOZ_ASSERT(mBridgeProxy);
+
+ mBridgeProxy->CloseSession(aPromiseId, NS_ConvertUTF8toUTF16(aSessionId));
+}
+
+void
+MediaDrmProxySupport::Shutdown()
+{
+ MOZ_ASSERT(mBridgeProxy);
+
+ if (mDestroyed) {
+ return;
+ }
+ mBridgeProxy->Destroy();
+ mDestroyed = true;
+}
+
+} // namespace mozilla \ No newline at end of file
diff --git a/dom/media/eme/mediadrm/MediaDrmProxySupport.h b/dom/media/eme/mediadrm/MediaDrmProxySupport.h
new file mode 100644
index 000000000..e43b71bc1
--- /dev/null
+++ b/dom/media/eme/mediadrm/MediaDrmProxySupport.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaDrmProxySupport_H
+#define MediaDrmProxySupport_H
+
+#include "mozilla/DecryptorProxyCallback.h"
+#include "mozilla/Logging.h"
+#include "FennecJNIWrappers.h"
+#include "nsString.h"
+
+
+namespace mozilla {
+
+enum MediaDrmSessionType {
+ kKeyStreaming = 1,
+ kKeyOffline = 2,
+ kKeyRelease = 3,
+};
+
+#ifndef MDRMN_LOG
+ LogModule* GetMDRMNLog();
+ #define MDRMN_LOG(x, ...) MOZ_LOG(GetMDRMNLog(), mozilla::LogLevel::Debug,\
+ ("[MediaDrmProxySupport][%s]" x, __FUNCTION__, ##__VA_ARGS__))
+#endif
+
+class MediaDrmProxySupport final
+{
+public:
+
+ MediaDrmProxySupport(const nsAString& aKeySystem);
+ ~MediaDrmProxySupport();
+
+ /*
+ * APIs to act as GMPDecryptorAPI, discarding unnecessary calls.
+ */
+ nsresult Init(DecryptorProxyCallback* aCallback);
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const nsCString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData,
+ MediaDrmSessionType aSessionType);
+
+ void UpdateSession(uint32_t aPromiseId,
+ const nsCString& aSessionId,
+ const nsTArray<uint8_t>& aResponse);
+
+ void CloseSession(uint32_t aPromiseId,
+ const nsCString& aSessionId);
+
+ void Shutdown();
+
+private:
+ const nsString mKeySystem;
+ java::MediaDrmProxy::GlobalRef mBridgeProxy;
+ java::MediaDrmProxy::NativeMediaDrmProxyCallbacks::GlobalRef mJavaCallbacks;
+ DecryptorProxyCallback* mCallback;
+ bool mDestroyed;
+
+};
+
+} // namespace mozilla
+#endif // MediaDrmProxySupport_H \ No newline at end of file
diff --git a/dom/media/eme/mediadrm/moz.build b/dom/media/eme/mediadrm/moz.build
new file mode 100644
index 000000000..c01f7a52e
--- /dev/null
+++ b/dom/media/eme/mediadrm/moz.build
@@ -0,0 +1,19 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS.mozilla += [
+ 'MediaDrmCDMCallbackProxy.h',
+ 'MediaDrmCDMProxy.h',
+ 'MediaDrmProxySupport.h',
+]
+
+UNIFIED_SOURCES += [
+ 'MediaDrmCDMCallbackProxy.cpp',
+ 'MediaDrmCDMProxy.cpp',
+ 'MediaDrmProxySupport.cpp',
+]
+
+FINAL_LIBRARY = 'xul' \ No newline at end of file
diff --git a/dom/media/eme/moz.build b/dom/media/eme/moz.build
new file mode 100644
index 000000000..47e622ae3
--- /dev/null
+++ b/dom/media/eme/moz.build
@@ -0,0 +1,45 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS.mozilla.dom += [
+ 'MediaEncryptedEvent.h',
+ 'MediaKeyError.h',
+ 'MediaKeyMessageEvent.h',
+ 'MediaKeys.h',
+ 'MediaKeySession.h',
+ 'MediaKeyStatusMap.h',
+ 'MediaKeySystemAccess.h',
+ 'MediaKeySystemAccessManager.h',
+]
+
+EXPORTS.mozilla += [
+ 'CDMCaps.h',
+ 'CDMProxy.h',
+ 'DecryptorProxyCallback.h',
+ 'DetailedPromise.h',
+ 'EMEUtils.h',
+]
+
+UNIFIED_SOURCES += [
+ 'CDMCaps.cpp',
+ 'DetailedPromise.cpp',
+ 'EMEUtils.cpp',
+ 'MediaEncryptedEvent.cpp',
+ 'MediaKeyError.cpp',
+ 'MediaKeyMessageEvent.cpp',
+ 'MediaKeys.cpp',
+ 'MediaKeySession.cpp',
+ 'MediaKeyStatusMap.cpp',
+ 'MediaKeySystemAccess.cpp',
+ 'MediaKeySystemAccessManager.cpp',
+]
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
+ DIRS += ['mediadrm']
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/encoder/ContainerWriter.h b/dom/media/encoder/ContainerWriter.h
new file mode 100644
index 000000000..1bd66cbc6
--- /dev/null
+++ b/dom/media/encoder/ContainerWriter.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ContainerWriter_h_
+#define ContainerWriter_h_
+
+#include "nsTArray.h"
+#include "EncodedFrameContainer.h"
+#include "TrackMetadataBase.h"
+
+namespace mozilla {
+/**
+ * ContainerWriter packs encoded track data into a specific media container.
+ */
+class ContainerWriter {
+public:
+ ContainerWriter()
+ : mInitialized(false)
+ , mIsWritingComplete(false)
+ {}
+ virtual ~ContainerWriter() {}
+ // Mapping to DOMLocalMediaStream::TrackTypeHints
+ enum {
+ CREATE_AUDIO_TRACK = 1 << 0,
+ CREATE_VIDEO_TRACK = 1 << 1,
+ };
+ enum {
+ END_OF_STREAM = 1 << 0
+ };
+
+ /**
+ * Writes encoded track data from aBuffer to a packet, and insert this packet
+ * into the internal stream of container writer. aDuration is the playback
+ * duration of this packet in number of samples. aFlags is true with
+ * END_OF_STREAM if this is the last packet of track.
+ * Currently, WriteEncodedTrack doesn't support multiple tracks.
+ */
+ virtual nsresult WriteEncodedTrack(const EncodedFrameContainer& aData,
+ uint32_t aFlags = 0) = 0;
+
+ /**
+ * Set the meta data pointer into muxer
+ * This function will check the integrity of aMetadata.
+ * If the meta data isn't well format, this function will return NS_ERROR_FAILURE to caller,
+ * else save the pointer to mMetadata and return NS_OK.
+ */
+ virtual nsresult SetMetadata(TrackMetadataBase* aMetadata) = 0;
+
+ /**
+ * Indicate if the writer has finished to output data
+ */
+ virtual bool IsWritingComplete() { return mIsWritingComplete; }
+
+ enum {
+ FLUSH_NEEDED = 1 << 0,
+ GET_HEADER = 1 << 1
+ };
+
+ /**
+ * Copies the final container data to a buffer if it has accumulated enough
+ * packets from WriteEncodedTrack. This buffer of data is appended to
+ * aOutputBufs, and existing elements of aOutputBufs should not be modified.
+ * aFlags is true with FLUSH_NEEDED will force OggWriter to flush an ogg page
+ * even it is not full, and copy these container data to a buffer for
+ * aOutputBufs to append.
+ */
+ virtual nsresult GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ uint32_t aFlags = 0) = 0;
+protected:
+ bool mInitialized;
+ bool mIsWritingComplete;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/EncodedFrameContainer.h b/dom/media/encoder/EncodedFrameContainer.h
new file mode 100644
index 000000000..8b7512466
--- /dev/null
+++ b/dom/media/encoder/EncodedFrameContainer.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EncodedFrameContainer_H_
+#define EncodedFrameContainer_H_
+
+#include "nsTArray.h"
+
+namespace mozilla {
+
+class EncodedFrame;
+
+/*
+ * This container is used to carry video or audio encoded data from encoder to muxer.
+ * The media data object is created by encoder and recycle by the destructor.
+ * Only allow to store audio or video encoded data in EncodedData.
+ */
+class EncodedFrameContainer
+{
+public:
+ // Append encoded frame data
+ void AppendEncodedFrame(EncodedFrame* aEncodedFrame)
+ {
+ mEncodedFrames.AppendElement(aEncodedFrame);
+ }
+ // Retrieve all of the encoded frames
+ const nsTArray<RefPtr<EncodedFrame> >& GetEncodedFrames() const
+ {
+ return mEncodedFrames;
+ }
+private:
+ // This container is used to store the video or audio encoded packets.
+ // Muxer should check mFrameType and get the encoded data type from mEncodedFrames.
+ nsTArray<RefPtr<EncodedFrame> > mEncodedFrames;
+};
+
+// Represent one encoded frame
+class EncodedFrame final
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(EncodedFrame)
+public:
+ EncodedFrame() :
+ mTimeStamp(0),
+ mDuration(0),
+ mFrameType(UNKNOWN)
+ {}
+ enum FrameType {
+ VP8_I_FRAME, // VP8 intraframe
+ VP8_P_FRAME, // VP8 predicted frame
+ OPUS_AUDIO_FRAME, // Opus audio frame
+ VORBIS_AUDIO_FRAME,
+ AVC_I_FRAME,
+ AVC_P_FRAME,
+ AVC_B_FRAME,
+ AVC_CSD, // AVC codec specific data
+ AAC_AUDIO_FRAME,
+ AAC_CSD, // AAC codec specific data
+ AMR_AUDIO_CSD,
+ AMR_AUDIO_FRAME,
+ EVRC_AUDIO_CSD,
+ EVRC_AUDIO_FRAME,
+ UNKNOWN // FrameType not set
+ };
+ void SwapInFrameData(nsTArray<uint8_t>& aData)
+ {
+ mFrameData.SwapElements(aData);
+ }
+ nsresult SwapOutFrameData(nsTArray<uint8_t>& aData)
+ {
+ if (mFrameType != UNKNOWN) {
+ // Reset this frame type to UNKNOWN once the data is swapped out.
+ mFrameData.SwapElements(aData);
+ mFrameType = UNKNOWN;
+ return NS_OK;
+ }
+ return NS_ERROR_FAILURE;
+ }
+ const nsTArray<uint8_t>& GetFrameData() const
+ {
+ return mFrameData;
+ }
+ uint64_t GetTimeStamp() const { return mTimeStamp; }
+ void SetTimeStamp(uint64_t aTimeStamp) { mTimeStamp = aTimeStamp; }
+
+ uint64_t GetDuration() const { return mDuration; }
+ void SetDuration(uint64_t aDuration) { mDuration = aDuration; }
+
+ FrameType GetFrameType() const { return mFrameType; }
+ void SetFrameType(FrameType aFrameType) { mFrameType = aFrameType; }
+private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~EncodedFrame()
+ {
+ }
+
+ // Encoded data
+ nsTArray<uint8_t> mFrameData;
+ uint64_t mTimeStamp;
+ // The playback duration of this packet in number of samples
+ uint64_t mDuration;
+ // Represent what is in the FrameData
+ FrameType mFrameType;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/MediaEncoder.cpp b/dom/media/encoder/MediaEncoder.cpp
new file mode 100644
index 000000000..864b486e4
--- /dev/null
+++ b/dom/media/encoder/MediaEncoder.cpp
@@ -0,0 +1,404 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "MediaEncoder.h"
+#include "MediaDecoder.h"
+#include "nsIPrincipal.h"
+#include "nsMimeTypes.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/gfx/Point.h" // IntSize
+
+#include"GeckoProfiler.h"
+#include "OggWriter.h"
+#include "OpusTrackEncoder.h"
+
+#ifdef MOZ_WEBM_ENCODER
+#include "VP8TrackEncoder.h"
+#include "WebMWriter.h"
+#endif
+
+#ifdef LOG
+#undef LOG
+#endif
+
+mozilla::LazyLogModule gMediaEncoderLog("MediaEncoder");
+#define LOG(type, msg) MOZ_LOG(gMediaEncoderLog, type, msg)
+
+namespace mozilla {
+
+void
+MediaStreamVideoRecorderSink::SetCurrentFrames(const VideoSegment& aSegment)
+{
+ MOZ_ASSERT(mVideoEncoder);
+ mVideoEncoder->SetCurrentFrames(aSegment);
+}
+
+void
+MediaEncoder::SetDirectConnect(bool aConnected)
+{
+ mDirectConnected = aConnected;
+}
+
+void
+MediaEncoder::NotifyRealtimeData(MediaStreamGraph* aGraph,
+ TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aRealtimeMedia)
+{
+ if (mSuspended == RECORD_NOT_SUSPENDED) {
+ // Process the incoming raw track data from MediaStreamGraph, called on the
+ // thread of MediaStreamGraph.
+ if (mAudioEncoder && aRealtimeMedia.GetType() == MediaSegment::AUDIO) {
+ mAudioEncoder->NotifyQueuedTrackChanges(aGraph, aID,
+ aTrackOffset, aTrackEvents,
+ aRealtimeMedia);
+ } else if (mVideoEncoder &&
+ aRealtimeMedia.GetType() == MediaSegment::VIDEO &&
+ aTrackEvents != TrackEventCommand::TRACK_EVENT_NONE) {
+ mVideoEncoder->NotifyQueuedTrackChanges(aGraph, aID,
+ aTrackOffset, aTrackEvents,
+ aRealtimeMedia);
+ }
+ }
+}
+
+void
+MediaEncoder::NotifyQueuedTrackChanges(MediaStreamGraph* aGraph,
+ TrackID aID,
+ StreamTime aTrackOffset,
+ TrackEventCommand aTrackEvents,
+ const MediaSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID)
+{
+ if (!mDirectConnected) {
+ NotifyRealtimeData(aGraph, aID, aTrackOffset, aTrackEvents, aQueuedMedia);
+ } else {
+ if (aTrackEvents != TrackEventCommand::TRACK_EVENT_NONE) {
+ // forward events (TRACK_EVENT_ENDED) but not the media
+ if (aQueuedMedia.GetType() == MediaSegment::VIDEO) {
+ VideoSegment segment;
+ NotifyRealtimeData(aGraph, aID, aTrackOffset, aTrackEvents, segment);
+ } else {
+ AudioSegment segment;
+ NotifyRealtimeData(aGraph, aID, aTrackOffset, aTrackEvents, segment);
+ }
+ }
+ if (mSuspended == RECORD_RESUMED) {
+ if (mVideoEncoder) {
+ if (aQueuedMedia.GetType() == MediaSegment::VIDEO) {
+ // insert a null frame of duration equal to the first segment passed
+ // after Resume(), so it'll get added to one of the DirectListener frames
+ VideoSegment segment;
+ gfx::IntSize size(0,0);
+ segment.AppendFrame(nullptr, aQueuedMedia.GetDuration(), size,
+ PRINCIPAL_HANDLE_NONE);
+ mVideoEncoder->NotifyQueuedTrackChanges(aGraph, aID,
+ aTrackOffset, aTrackEvents,
+ segment);
+ mSuspended = RECORD_NOT_SUSPENDED;
+ }
+ } else {
+ mSuspended = RECORD_NOT_SUSPENDED; // no video
+ }
+ }
+ }
+}
+
+void
+MediaEncoder::NotifyQueuedAudioData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ const AudioSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID)
+{
+ if (!mDirectConnected) {
+ NotifyRealtimeData(aGraph, aID, aTrackOffset, 0, aQueuedMedia);
+ } else {
+ if (mSuspended == RECORD_RESUMED) {
+ if (!mVideoEncoder) {
+ mSuspended = RECORD_NOT_SUSPENDED; // no video
+ }
+ }
+ }
+}
+
+void
+MediaEncoder::NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event)
+{
+ // In case that MediaEncoder does not receive a TRACK_EVENT_ENDED event.
+ LOG(LogLevel::Debug, ("NotifyRemoved in [MediaEncoder]."));
+ if (mAudioEncoder) {
+ mAudioEncoder->NotifyEvent(aGraph, event);
+ }
+ if (mVideoEncoder) {
+ mVideoEncoder->NotifyEvent(aGraph, event);
+ }
+}
+
+/* static */
+already_AddRefed<MediaEncoder>
+MediaEncoder::CreateEncoder(const nsAString& aMIMEType, uint32_t aAudioBitrate,
+ uint32_t aVideoBitrate, uint32_t aBitrate,
+ uint8_t aTrackTypes,
+ TrackRate aTrackRate)
+{
+ PROFILER_LABEL("MediaEncoder", "CreateEncoder",
+ js::ProfileEntry::Category::OTHER);
+
+ nsAutoPtr<ContainerWriter> writer;
+ nsAutoPtr<AudioTrackEncoder> audioEncoder;
+ nsAutoPtr<VideoTrackEncoder> videoEncoder;
+ RefPtr<MediaEncoder> encoder;
+ nsString mimeType;
+ if (!aTrackTypes) {
+ LOG(LogLevel::Error, ("NO TrackTypes!!!"));
+ return nullptr;
+ }
+#ifdef MOZ_WEBM_ENCODER
+ else if (MediaEncoder::IsWebMEncoderEnabled() &&
+ (aMIMEType.EqualsLiteral(VIDEO_WEBM) ||
+ (aTrackTypes & ContainerWriter::CREATE_VIDEO_TRACK))) {
+ if (aTrackTypes & ContainerWriter::CREATE_AUDIO_TRACK
+ && MediaDecoder::IsOpusEnabled()) {
+ audioEncoder = new OpusTrackEncoder();
+ NS_ENSURE_TRUE(audioEncoder, nullptr);
+ }
+ videoEncoder = new VP8TrackEncoder(aTrackRate);
+ writer = new WebMWriter(aTrackTypes);
+ NS_ENSURE_TRUE(writer, nullptr);
+ NS_ENSURE_TRUE(videoEncoder, nullptr);
+ mimeType = NS_LITERAL_STRING(VIDEO_WEBM);
+ }
+#endif //MOZ_WEBM_ENCODER
+ else if (MediaDecoder::IsOggEnabled() && MediaDecoder::IsOpusEnabled() &&
+ (aMIMEType.EqualsLiteral(AUDIO_OGG) ||
+ (aTrackTypes & ContainerWriter::CREATE_AUDIO_TRACK))) {
+ writer = new OggWriter();
+ audioEncoder = new OpusTrackEncoder();
+ NS_ENSURE_TRUE(writer, nullptr);
+ NS_ENSURE_TRUE(audioEncoder, nullptr);
+ mimeType = NS_LITERAL_STRING(AUDIO_OGG);
+ }
+ else {
+ LOG(LogLevel::Error, ("Can not find any encoder to record this media stream"));
+ return nullptr;
+ }
+ LOG(LogLevel::Debug, ("Create encoder result:a[%d] v[%d] w[%d] mimeType = %s.",
+ audioEncoder != nullptr, videoEncoder != nullptr,
+ writer != nullptr, mimeType.get()));
+ if (videoEncoder && aVideoBitrate != 0) {
+ videoEncoder->SetBitrate(aVideoBitrate);
+ }
+ if (audioEncoder && aAudioBitrate != 0) {
+ audioEncoder->SetBitrate(aAudioBitrate);
+ }
+ encoder = new MediaEncoder(writer.forget(), audioEncoder.forget(),
+ videoEncoder.forget(), mimeType, aAudioBitrate,
+ aVideoBitrate, aBitrate);
+ return encoder.forget();
+}
+
+/**
+ * GetEncodedData() runs as a state machine, starting with mState set to
+ * GET_METADDATA, the procedure should be as follow:
+ *
+ * While non-stop
+ * If mState is GET_METADDATA
+ * Get the meta data from audio/video encoder
+ * If a meta data is generated
+ * Get meta data from audio/video encoder
+ * Set mState to ENCODE_TRACK
+ * Return the final container data
+ *
+ * If mState is ENCODE_TRACK
+ * Get encoded track data from audio/video encoder
+ * If a packet of track data is generated
+ * Insert encoded track data into the container stream of writer
+ * If the final container data is copied to aOutput
+ * Return the copy of final container data
+ * If this is the last packet of input stream
+ * Set mState to ENCODE_DONE
+ *
+ * If mState is ENCODE_DONE or ENCODE_ERROR
+ * Stop the loop
+ */
+void
+MediaEncoder::GetEncodedData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ nsAString& aMIMEType)
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+
+ aMIMEType = mMIMEType;
+ PROFILER_LABEL("MediaEncoder", "GetEncodedData",
+ js::ProfileEntry::Category::OTHER);
+
+ bool reloop = true;
+ while (reloop) {
+ switch (mState) {
+ case ENCODE_METADDATA: {
+ LOG(LogLevel::Debug, ("ENCODE_METADDATA TimeStamp = %f", GetEncodeTimeStamp()));
+ nsresult rv = CopyMetadataToMuxer(mAudioEncoder.get());
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error, ("Error! Fail to Set Audio Metadata"));
+ break;
+ }
+ rv = CopyMetadataToMuxer(mVideoEncoder.get());
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error, ("Error! Fail to Set Video Metadata"));
+ break;
+ }
+
+ rv = mWriter->GetContainerData(aOutputBufs,
+ ContainerWriter::GET_HEADER);
+ if (aOutputBufs != nullptr) {
+ mSizeOfBuffer = aOutputBufs->ShallowSizeOfExcludingThis(MallocSizeOf);
+ }
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error,("Error! writer fail to generate header!"));
+ mState = ENCODE_ERROR;
+ break;
+ }
+ LOG(LogLevel::Debug, ("Finish ENCODE_METADDATA TimeStamp = %f", GetEncodeTimeStamp()));
+ mState = ENCODE_TRACK;
+ break;
+ }
+
+ case ENCODE_TRACK: {
+ LOG(LogLevel::Debug, ("ENCODE_TRACK TimeStamp = %f", GetEncodeTimeStamp()));
+ EncodedFrameContainer encodedData;
+ nsresult rv = NS_OK;
+ // We're most likely to actually wait for a video frame, so do that first to minimize
+ // capture offset/lipsync issues
+ rv = WriteEncodedDataToMuxer(mVideoEncoder.get());
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error, ("Fail to write video encoder data to muxer"));
+ break;
+ }
+ rv = WriteEncodedDataToMuxer(mAudioEncoder.get());
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error, ("Error! Fail to write audio encoder data to muxer"));
+ break;
+ }
+ LOG(LogLevel::Debug, ("Audio encoded TimeStamp = %f", GetEncodeTimeStamp()));
+ LOG(LogLevel::Debug, ("Video encoded TimeStamp = %f", GetEncodeTimeStamp()));
+ // In audio only or video only case, let unavailable track's flag to be true.
+ bool isAudioCompleted = (mAudioEncoder && mAudioEncoder->IsEncodingComplete()) || !mAudioEncoder;
+ bool isVideoCompleted = (mVideoEncoder && mVideoEncoder->IsEncodingComplete()) || !mVideoEncoder;
+ rv = mWriter->GetContainerData(aOutputBufs,
+ isAudioCompleted && isVideoCompleted ?
+ ContainerWriter::FLUSH_NEEDED : 0);
+ if (aOutputBufs != nullptr) {
+ mSizeOfBuffer = aOutputBufs->ShallowSizeOfExcludingThis(MallocSizeOf);
+ }
+ if (NS_SUCCEEDED(rv)) {
+ // Successfully get the copy of final container data from writer.
+ reloop = false;
+ }
+ mState = (mWriter->IsWritingComplete()) ? ENCODE_DONE : ENCODE_TRACK;
+ LOG(LogLevel::Debug, ("END ENCODE_TRACK TimeStamp = %f "
+ "mState = %d aComplete %d vComplete %d",
+ GetEncodeTimeStamp(), mState, isAudioCompleted, isVideoCompleted));
+ break;
+ }
+
+ case ENCODE_DONE:
+ case ENCODE_ERROR:
+ LOG(LogLevel::Debug, ("MediaEncoder has been shutdown."));
+ mSizeOfBuffer = 0;
+ mShutdown = true;
+ reloop = false;
+ break;
+ default:
+ MOZ_CRASH("Invalid encode state");
+ }
+ }
+}
+
+nsresult
+MediaEncoder::WriteEncodedDataToMuxer(TrackEncoder *aTrackEncoder)
+{
+ if (aTrackEncoder == nullptr) {
+ return NS_OK;
+ }
+ if (aTrackEncoder->IsEncodingComplete()) {
+ return NS_OK;
+ }
+
+ PROFILER_LABEL("MediaEncoder", "WriteEncodedDataToMuxer",
+ js::ProfileEntry::Category::OTHER);
+
+ EncodedFrameContainer encodedVideoData;
+ nsresult rv = aTrackEncoder->GetEncodedTrack(encodedVideoData);
+ if (NS_FAILED(rv)) {
+ // Encoding might be canceled.
+ LOG(LogLevel::Error, ("Error! Fail to get encoded data from video encoder."));
+ mState = ENCODE_ERROR;
+ return rv;
+ }
+ rv = mWriter->WriteEncodedTrack(encodedVideoData,
+ aTrackEncoder->IsEncodingComplete() ?
+ ContainerWriter::END_OF_STREAM : 0);
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error, ("Error! Fail to write encoded video track to the media container."));
+ mState = ENCODE_ERROR;
+ }
+ return rv;
+}
+
+nsresult
+MediaEncoder::CopyMetadataToMuxer(TrackEncoder *aTrackEncoder)
+{
+ if (aTrackEncoder == nullptr) {
+ return NS_OK;
+ }
+
+ PROFILER_LABEL("MediaEncoder", "CopyMetadataToMuxer",
+ js::ProfileEntry::Category::OTHER);
+
+ RefPtr<TrackMetadataBase> meta = aTrackEncoder->GetMetadata();
+ if (meta == nullptr) {
+ LOG(LogLevel::Error, ("Error! metadata = null"));
+ mState = ENCODE_ERROR;
+ return NS_ERROR_ABORT;
+ }
+
+ nsresult rv = mWriter->SetMetadata(meta);
+ if (NS_FAILED(rv)) {
+ LOG(LogLevel::Error, ("Error! SetMetadata fail"));
+ mState = ENCODE_ERROR;
+ }
+ return rv;
+}
+
+#ifdef MOZ_WEBM_ENCODER
+bool
+MediaEncoder::IsWebMEncoderEnabled()
+{
+ return Preferences::GetBool("media.encoder.webm.enabled");
+}
+#endif
+
+/*
+ * SizeOfExcludingThis measures memory being used by the Media Encoder.
+ * Currently it measures the size of the Encoder buffer and memory occupied
+ * by mAudioEncoder and mVideoEncoder.
+ */
+size_t
+MediaEncoder::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+ if (mState == ENCODE_TRACK) {
+ amount = mSizeOfBuffer +
+ (mAudioEncoder != nullptr ? mAudioEncoder->SizeOfExcludingThis(aMallocSizeOf) : 0) +
+ (mVideoEncoder != nullptr ? mVideoEncoder->SizeOfExcludingThis(aMallocSizeOf) : 0);
+ }
+ return amount;
+}
+
+} // namespace mozilla
diff --git a/dom/media/encoder/MediaEncoder.h b/dom/media/encoder/MediaEncoder.h
new file mode 100644
index 000000000..41d7e71e2
--- /dev/null
+++ b/dom/media/encoder/MediaEncoder.h
@@ -0,0 +1,258 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaEncoder_h_
+#define MediaEncoder_h_
+
+#include "mozilla/DebugOnly.h"
+#include "TrackEncoder.h"
+#include "ContainerWriter.h"
+#include "CubebUtils.h"
+#include "MediaStreamGraph.h"
+#include "MediaStreamListener.h"
+#include "nsAutoPtr.h"
+#include "MediaStreamVideoSink.h"
+#include "nsIMemoryReporter.h"
+#include "mozilla/MemoryReporting.h"
+#include "mozilla/Atomics.h"
+
+namespace mozilla {
+
+class MediaStreamVideoRecorderSink : public MediaStreamVideoSink
+{
+public:
+ explicit MediaStreamVideoRecorderSink(VideoTrackEncoder* aEncoder)
+ : mVideoEncoder(aEncoder) {}
+
+ // MediaStreamVideoSink methods
+ virtual void SetCurrentFrames(const VideoSegment& aSegment) override;
+ virtual void ClearFrames() override {}
+
+private:
+ virtual ~MediaStreamVideoRecorderSink() {}
+ VideoTrackEncoder* mVideoEncoder;
+};
+
+/**
+ * MediaEncoder is the framework of encoding module, it controls and manages
+ * procedures between ContainerWriter and TrackEncoder. ContainerWriter packs
+ * the encoded track data with a specific container (e.g. ogg, mp4).
+ * AudioTrackEncoder and VideoTrackEncoder are subclasses of TrackEncoder, and
+ * are responsible for encoding raw data coming from MediaStreamGraph.
+ *
+ * Also, MediaEncoder is a type of MediaStreamListener, it starts to receive raw
+ * segments after itself is added to the source stream. In the mean time,
+ * encoded track data is pulled by its owner periodically on a worker thread. A
+ * reentrant monitor is used to protect the push and pull of resource.
+ *
+ * MediaEncoder is designed to be a passive component, neither it owns nor in
+ * charge of managing threads. However, a monitor is used in function
+ * TrackEncoder::GetEncodedTrack() for the purpose of thread safety (e.g.
+ * between callbacks of MediaStreamListener and others), a call to this function
+ * might block. Therefore, MediaEncoder should not run on threads that forbid
+ * blocking, such as main thread or I/O thread.
+ *
+ * For example, an usage from MediaRecorder of this component would be:
+ * 1) Create an encoder with a valid MIME type.
+ * => encoder = MediaEncoder::CreateEncoder(aMIMEType);
+ * It then generate a ContainerWriter according to the MIME type, and an
+ * AudioTrackEncoder (or a VideoTrackEncoder too) associated with the media
+ * type.
+ *
+ * 2) Dispatch the task GetEncodedData() to a worker thread.
+ *
+ * 3) To start encoding, add this component to its source stream.
+ * => sourceStream->AddListener(encoder);
+ *
+ * 4) To stop encoding, remove this component from its source stream.
+ * => sourceStream->RemoveListener(encoder);
+ */
+class MediaEncoder : public DirectMediaStreamListener
+{
+ friend class MediaStreamVideoRecorderSink;
+public :
+ enum {
+ ENCODE_METADDATA,
+ ENCODE_TRACK,
+ ENCODE_DONE,
+ ENCODE_ERROR,
+ };
+
+ MediaEncoder(ContainerWriter* aWriter,
+ AudioTrackEncoder* aAudioEncoder,
+ VideoTrackEncoder* aVideoEncoder,
+ const nsAString& aMIMEType,
+ uint32_t aAudioBitrate,
+ uint32_t aVideoBitrate,
+ uint32_t aBitrate)
+ : mWriter(aWriter)
+ , mAudioEncoder(aAudioEncoder)
+ , mVideoEncoder(aVideoEncoder)
+ , mVideoSink(new MediaStreamVideoRecorderSink(mVideoEncoder))
+ , mStartTime(TimeStamp::Now())
+ , mMIMEType(aMIMEType)
+ , mSizeOfBuffer(0)
+ , mState(MediaEncoder::ENCODE_METADDATA)
+ , mShutdown(false)
+ , mDirectConnected(false)
+ , mSuspended(false)
+{}
+
+ ~MediaEncoder() {};
+
+ enum SuspendState {
+ RECORD_NOT_SUSPENDED,
+ RECORD_SUSPENDED,
+ RECORD_RESUMED
+ };
+
+ /* Note - called from control code, not on MSG threads. */
+ void Suspend()
+ {
+ mSuspended = RECORD_SUSPENDED;
+ }
+
+ /**
+ * Note - called from control code, not on MSG threads.
+ * Arm to collect the Duration of the next video frame and give it
+ * to the next frame, in order to avoid any possible loss of sync. */
+ void Resume()
+ {
+ if (mSuspended == RECORD_SUSPENDED) {
+ mSuspended = RECORD_RESUMED;
+ }
+ }
+
+ /**
+ * Tells us which Notify to pay attention to for media
+ */
+ void SetDirectConnect(bool aConnected);
+
+ /**
+ * Notified by the AppendToTrack in MediaStreamGraph; aRealtimeMedia is the raw
+ * track data in form of MediaSegment.
+ */
+ void NotifyRealtimeData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aRealtimeMedia) override;
+
+ /**
+ * Notified by the control loop of MediaStreamGraph; aQueueMedia is the raw
+ * track data in form of MediaSegment.
+ */
+ void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ TrackEventCommand aTrackEvents,
+ const MediaSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID) override;
+
+ /**
+ * Notifed by the control loop of MediaStreamGraph; aQueueMedia is the audio
+ * data in the form of an AudioSegment.
+ */
+ void NotifyQueuedAudioData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ const AudioSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID) override;
+
+ /**
+ * * Notified the stream is being removed.
+ */
+ void NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event) override;
+
+ /**
+ * Creates an encoder with a given MIME type. Returns null if we are unable
+ * to create the encoder. For now, default aMIMEType to "audio/ogg" and use
+ * Ogg+Opus if it is empty.
+ */
+ static already_AddRefed<MediaEncoder> CreateEncoder(const nsAString& aMIMEType,
+ uint32_t aAudioBitrate, uint32_t aVideoBitrate,
+ uint32_t aBitrate,
+ uint8_t aTrackTypes = ContainerWriter::CREATE_AUDIO_TRACK,
+ TrackRate aTrackRate = CubebUtils::PreferredSampleRate());
+ /**
+ * Encodes the raw track data and returns the final container data. Assuming
+ * it is called on a single worker thread. The buffer of container data is
+ * allocated in ContainerWriter::GetContainerData(), and is appended to
+ * aOutputBufs. aMIMEType is the valid mime-type of this returned container
+ * data.
+ */
+ void GetEncodedData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ nsAString& aMIMEType);
+
+ /**
+ * Return true if MediaEncoder has been shutdown. Reasons are encoding
+ * complete, encounter an error, or being canceled by its caller.
+ */
+ bool IsShutdown()
+ {
+ return mShutdown;
+ }
+
+ /**
+ * Cancel the encoding, and wakes up the lock of reentrant monitor in encoder.
+ */
+ void Cancel()
+ {
+ if (mAudioEncoder) {
+ mAudioEncoder->NotifyCancel();
+ }
+ if (mVideoEncoder) {
+ mVideoEncoder->NotifyCancel();
+ }
+ }
+
+ bool HasError()
+ {
+ return mState == ENCODE_ERROR;
+ }
+
+#ifdef MOZ_WEBM_ENCODER
+ static bool IsWebMEncoderEnabled();
+#endif
+
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf)
+ /*
+ * Measure the size of the buffer, and memory occupied by mAudioEncoder
+ * and mVideoEncoder
+ */
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ MediaStreamVideoRecorderSink* GetVideoSink() {
+ return mVideoSink.get();
+ }
+
+private:
+ // Get encoded data from trackEncoder and write to muxer
+ nsresult WriteEncodedDataToMuxer(TrackEncoder *aTrackEncoder);
+ // Get metadata from trackEncoder and copy to muxer
+ nsresult CopyMetadataToMuxer(TrackEncoder* aTrackEncoder);
+ nsAutoPtr<ContainerWriter> mWriter;
+ nsAutoPtr<AudioTrackEncoder> mAudioEncoder;
+ nsAutoPtr<VideoTrackEncoder> mVideoEncoder;
+ RefPtr<MediaStreamVideoRecorderSink> mVideoSink;
+ TimeStamp mStartTime;
+ nsString mMIMEType;
+ int64_t mSizeOfBuffer;
+ int mState;
+ bool mShutdown;
+ bool mDirectConnected;
+ Atomic<int> mSuspended;
+ // Get duration from create encoder, for logging purpose
+ double GetEncodeTimeStamp()
+ {
+ TimeDuration decodeTime;
+ decodeTime = TimeStamp::Now() - mStartTime;
+ return decodeTime.ToMilliseconds();
+ }
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/OpusTrackEncoder.cpp b/dom/media/encoder/OpusTrackEncoder.cpp
new file mode 100644
index 000000000..c65d57788
--- /dev/null
+++ b/dom/media/encoder/OpusTrackEncoder.cpp
@@ -0,0 +1,462 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "OpusTrackEncoder.h"
+#include "nsString.h"
+#include "GeckoProfiler.h"
+
+#include <opus/opus.h>
+
+#undef LOG
+#ifdef MOZ_WIDGET_GONK
+#include <android/log.h>
+#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "MediaEncoder", ## args);
+#else
+#define LOG(args, ...)
+#endif
+
+namespace mozilla {
+
+// The Opus format supports up to 8 channels, and supports multitrack audio up
+// to 255 channels, but the current implementation supports only mono and
+// stereo, and downmixes any more than that.
+static const int MAX_SUPPORTED_AUDIO_CHANNELS = 8;
+
+// http://www.opus-codec.org/docs/html_api-1.0.2/group__opus__encoder.html
+// In section "opus_encoder_init", channels must be 1 or 2 of input signal.
+static const int MAX_CHANNELS = 2;
+
+// A maximum data bytes for Opus to encode.
+static const int MAX_DATA_BYTES = 4096;
+
+// http://tools.ietf.org/html/draft-ietf-codec-oggopus-00#section-4
+// Second paragraph, " The granule position of an audio data page is in units
+// of PCM audio samples at a fixed rate of 48 kHz."
+static const int kOpusSamplingRate = 48000;
+
+// The duration of an Opus frame, and it must be 2.5, 5, 10, 20, 40 or 60 ms.
+static const int kFrameDurationMs = 20;
+
+// The supported sampling rate of input signal (Hz),
+// must be one of the following. Will resampled to 48kHz otherwise.
+static const int kOpusSupportedInputSamplingRates[] =
+ {8000, 12000, 16000, 24000, 48000};
+
+namespace {
+
+// An endian-neutral serialization of integers. Serializing T in little endian
+// format to aOutput, where T is a 16 bits or 32 bits integer.
+template<typename T>
+static void
+SerializeToBuffer(T aValue, nsTArray<uint8_t>* aOutput)
+{
+ for (uint32_t i = 0; i < sizeof(T); i++) {
+ aOutput->AppendElement((uint8_t)(0x000000ff & (aValue >> (i * 8))));
+ }
+}
+
+static inline void
+SerializeToBuffer(const nsCString& aComment, nsTArray<uint8_t>* aOutput)
+{
+ // Format of serializing a string to buffer is, the length of string (32 bits,
+ // little endian), and the string.
+ SerializeToBuffer((uint32_t)(aComment.Length()), aOutput);
+ aOutput->AppendElements(aComment.get(), aComment.Length());
+}
+
+
+static void
+SerializeOpusIdHeader(uint8_t aChannelCount, uint16_t aPreskip,
+ uint32_t aInputSampleRate, nsTArray<uint8_t>* aOutput)
+{
+ // The magic signature, null terminator has to be stripped off from strings.
+ static const uint8_t magic[] = "OpusHead";
+ aOutput->AppendElements(magic, sizeof(magic) - 1);
+
+ // The version must always be 1 (8 bits, unsigned).
+ aOutput->AppendElement(1);
+
+ // Number of output channels (8 bits, unsigned).
+ aOutput->AppendElement(aChannelCount);
+
+ // Number of samples (at 48 kHz) to discard from the decoder output when
+ // starting playback (16 bits, unsigned, little endian).
+ SerializeToBuffer(aPreskip, aOutput);
+
+ // The sampling rate of input source (32 bits, unsigned, little endian).
+ SerializeToBuffer(aInputSampleRate, aOutput);
+
+ // Output gain, an encoder should set this field to zero (16 bits, signed,
+ // little endian).
+ SerializeToBuffer((int16_t)0, aOutput);
+
+ // Channel mapping family. Family 0 allows only 1 or 2 channels (8 bits,
+ // unsigned).
+ aOutput->AppendElement(0);
+}
+
+static void
+SerializeOpusCommentHeader(const nsCString& aVendor,
+ const nsTArray<nsCString>& aComments,
+ nsTArray<uint8_t>* aOutput)
+{
+ // The magic signature, null terminator has to be stripped off.
+ static const uint8_t magic[] = "OpusTags";
+ aOutput->AppendElements(magic, sizeof(magic) - 1);
+
+ // The vendor; Should append in the following order:
+ // vendor string length (32 bits, unsigned, little endian)
+ // vendor string.
+ SerializeToBuffer(aVendor, aOutput);
+
+ // Add comments; Should append in the following order:
+ // comment list length (32 bits, unsigned, little endian)
+ // comment #0 string length (32 bits, unsigned, little endian)
+ // comment #0 string
+ // comment #1 string length (32 bits, unsigned, little endian)
+ // comment #1 string ...
+ SerializeToBuffer((uint32_t)aComments.Length(), aOutput);
+ for (uint32_t i = 0; i < aComments.Length(); ++i) {
+ SerializeToBuffer(aComments[i], aOutput);
+ }
+}
+
+} // Anonymous namespace.
+
+OpusTrackEncoder::OpusTrackEncoder()
+ : AudioTrackEncoder()
+ , mEncoder(nullptr)
+ , mLookahead(0)
+ , mResampler(nullptr)
+ , mOutputTimeStamp(0)
+{
+}
+
+OpusTrackEncoder::~OpusTrackEncoder()
+{
+ if (mEncoder) {
+ opus_encoder_destroy(mEncoder);
+ }
+ if (mResampler) {
+ speex_resampler_destroy(mResampler);
+ mResampler = nullptr;
+ }
+}
+
+nsresult
+OpusTrackEncoder::Init(int aChannels, int aSamplingRate)
+{
+ // This monitor is used to wake up other methods that are waiting for encoder
+ // to be completely initialized.
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ NS_ENSURE_TRUE((aChannels <= MAX_SUPPORTED_AUDIO_CHANNELS) && (aChannels > 0),
+ NS_ERROR_FAILURE);
+
+ // This version of encoder API only support 1 or 2 channels,
+ // So set the mChannels less or equal 2 and
+ // let InterleaveTrackData downmix pcm data.
+ mChannels = aChannels > MAX_CHANNELS ? MAX_CHANNELS : aChannels;
+
+ // Reject non-audio sample rates.
+ NS_ENSURE_TRUE(aSamplingRate >= 8000, NS_ERROR_INVALID_ARG);
+ NS_ENSURE_TRUE(aSamplingRate <= 192000, NS_ERROR_INVALID_ARG);
+
+ // According to www.opus-codec.org, creating an opus encoder requires the
+ // sampling rate of source signal be one of 8000, 12000, 16000, 24000, or
+ // 48000. If this constraint is not satisfied, we resample the input to 48kHz.
+ nsTArray<int> supportedSamplingRates;
+ supportedSamplingRates.AppendElements(kOpusSupportedInputSamplingRates,
+ ArrayLength(kOpusSupportedInputSamplingRates));
+ if (!supportedSamplingRates.Contains(aSamplingRate)) {
+ int error;
+ mResampler = speex_resampler_init(mChannels,
+ aSamplingRate,
+ kOpusSamplingRate,
+ SPEEX_RESAMPLER_QUALITY_DEFAULT,
+ &error);
+
+ if (error != RESAMPLER_ERR_SUCCESS) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+ mSamplingRate = aSamplingRate;
+ NS_ENSURE_TRUE(mSamplingRate > 0, NS_ERROR_FAILURE);
+
+ int error = 0;
+ mEncoder = opus_encoder_create(GetOutputSampleRate(), mChannels,
+ OPUS_APPLICATION_AUDIO, &error);
+
+
+ mInitialized = (error == OPUS_OK);
+
+ if (mAudioBitrate) {
+ opus_encoder_ctl(mEncoder, OPUS_SET_BITRATE(static_cast<int>(mAudioBitrate)));
+ }
+
+ mReentrantMonitor.NotifyAll();
+
+ return error == OPUS_OK ? NS_OK : NS_ERROR_FAILURE;
+}
+
+int
+OpusTrackEncoder::GetOutputSampleRate()
+{
+ return mResampler ? kOpusSamplingRate : mSamplingRate;
+}
+
+int
+OpusTrackEncoder::GetPacketDuration()
+{
+ return GetOutputSampleRate() * kFrameDurationMs / 1000;
+}
+
+already_AddRefed<TrackMetadataBase>
+OpusTrackEncoder::GetMetadata()
+{
+ PROFILER_LABEL("OpusTrackEncoder", "GetMetadata",
+ js::ProfileEntry::Category::OTHER);
+ {
+ // Wait if mEncoder is not initialized.
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ while (!mCanceled && !mInitialized) {
+ mReentrantMonitor.Wait();
+ }
+ }
+
+ if (mCanceled || mEncodingComplete) {
+ return nullptr;
+ }
+
+ RefPtr<OpusMetadata> meta = new OpusMetadata();
+ meta->mChannels = mChannels;
+ meta->mSamplingFrequency = mSamplingRate;
+
+ mLookahead = 0;
+ int error = opus_encoder_ctl(mEncoder, OPUS_GET_LOOKAHEAD(&mLookahead));
+ if (error != OPUS_OK) {
+ mLookahead = 0;
+ }
+
+ // The ogg time stamping and pre-skip is always timed at 48000.
+ SerializeOpusIdHeader(mChannels, mLookahead * (kOpusSamplingRate /
+ GetOutputSampleRate()), mSamplingRate,
+ &meta->mIdHeader);
+
+ nsCString vendor;
+ vendor.AppendASCII(opus_get_version_string());
+
+ nsTArray<nsCString> comments;
+ comments.AppendElement(NS_LITERAL_CSTRING("ENCODER=Mozilla" MOZ_APP_UA_VERSION));
+
+ SerializeOpusCommentHeader(vendor, comments,
+ &meta->mCommentHeader);
+
+ return meta.forget();
+}
+
+nsresult
+OpusTrackEncoder::GetEncodedTrack(EncodedFrameContainer& aData)
+{
+ PROFILER_LABEL("OpusTrackEncoder", "GetEncodedTrack",
+ js::ProfileEntry::Category::OTHER);
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ // Wait until initialized or cancelled.
+ while (!mCanceled && !mInitialized) {
+ mReentrantMonitor.Wait();
+ }
+ if (mCanceled || mEncodingComplete) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+
+ // calculation below depends on the truth that mInitialized is true.
+ MOZ_ASSERT(mInitialized);
+
+ bool wait = true;
+ int result = 0;
+ // Only wait once, then loop until we run out of packets of input data
+ while (result >= 0 && !mEncodingComplete) {
+ // re-sampled frames left last time which didn't fit into an Opus packet duration.
+ const int framesLeft = mResampledLeftover.Length() / mChannels;
+ // When framesLeft is 0, (GetPacketDuration() - framesLeft) is a multiple
+ // of kOpusSamplingRate. There is not precision loss in the integer division
+ // in computing framesToFetch. If frameLeft > 0, we need to add 1 to
+ // framesToFetch to ensure there will be at least n frames after re-sampling.
+ const int frameRoundUp = framesLeft ? 1 : 0;
+
+ MOZ_ASSERT(GetPacketDuration() >= framesLeft);
+ // Try to fetch m frames such that there will be n frames
+ // where (n + frameLeft) >= GetPacketDuration() after re-sampling.
+ const int framesToFetch = !mResampler ? GetPacketDuration()
+ : (GetPacketDuration() - framesLeft) * mSamplingRate / kOpusSamplingRate
+ + frameRoundUp;
+ {
+ // Move all the samples from mRawSegment to mSourceSegment. We only hold
+ // the monitor in this block.
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ // Wait until enough raw data, end of stream or cancelled.
+ while (!mCanceled && mRawSegment.GetDuration() +
+ mSourceSegment.GetDuration() < framesToFetch &&
+ !mEndOfStream) {
+ if (wait) {
+ mReentrantMonitor.Wait();
+ wait = false;
+ } else {
+ goto done; // nested while's...
+ }
+ }
+
+ if (mCanceled) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mSourceSegment.AppendFrom(&mRawSegment);
+
+ // Pad |mLookahead| samples to the end of source stream to prevent lost of
+ // original data, the pcm duration will be calculated at rate 48K later.
+ if (mEndOfStream && !mEosSetInEncoder) {
+ mEosSetInEncoder = true;
+ mSourceSegment.AppendNullData(mLookahead);
+ }
+ }
+
+ // Start encoding data.
+ AutoTArray<AudioDataValue, 9600> pcm;
+ pcm.SetLength(GetPacketDuration() * mChannels);
+ AudioSegment::ChunkIterator iter(mSourceSegment);
+ int frameCopied = 0;
+
+ while (!iter.IsEnded() && frameCopied < framesToFetch) {
+ AudioChunk chunk = *iter;
+
+ // Chunk to the required frame size.
+ int frameToCopy = chunk.GetDuration();
+ if (frameCopied + frameToCopy > framesToFetch) {
+ frameToCopy = framesToFetch - frameCopied;
+ }
+
+ if (!chunk.IsNull()) {
+ // Append the interleaved data to the end of pcm buffer.
+ AudioTrackEncoder::InterleaveTrackData(chunk, frameToCopy, mChannels,
+ pcm.Elements() + frameCopied * mChannels);
+ } else {
+ memset(pcm.Elements() + frameCopied * mChannels, 0,
+ frameToCopy * mChannels * sizeof(AudioDataValue));
+ }
+
+ frameCopied += frameToCopy;
+ iter.Next();
+ }
+
+ RefPtr<EncodedFrame> audiodata = new EncodedFrame();
+ audiodata->SetFrameType(EncodedFrame::OPUS_AUDIO_FRAME);
+ int framesInPCM = frameCopied;
+ if (mResampler) {
+ AutoTArray<AudioDataValue, 9600> resamplingDest;
+ // We want to consume all the input data, so we slightly oversize the
+ // resampled data buffer so we can fit the output data in. We cannot really
+ // predict the output frame count at each call.
+ uint32_t outframes = frameCopied * kOpusSamplingRate / mSamplingRate + 1;
+ uint32_t inframes = frameCopied;
+
+ resamplingDest.SetLength(outframes * mChannels);
+
+#if MOZ_SAMPLE_TYPE_S16
+ short* in = reinterpret_cast<short*>(pcm.Elements());
+ short* out = reinterpret_cast<short*>(resamplingDest.Elements());
+ speex_resampler_process_interleaved_int(mResampler, in, &inframes,
+ out, &outframes);
+#else
+ float* in = reinterpret_cast<float*>(pcm.Elements());
+ float* out = reinterpret_cast<float*>(resamplingDest.Elements());
+ speex_resampler_process_interleaved_float(mResampler, in, &inframes,
+ out, &outframes);
+#endif
+
+ MOZ_ASSERT(pcm.Length() >= mResampledLeftover.Length());
+ PodCopy(pcm.Elements(), mResampledLeftover.Elements(),
+ mResampledLeftover.Length());
+
+ uint32_t outframesToCopy = std::min(outframes,
+ static_cast<uint32_t>(GetPacketDuration() - framesLeft));
+
+ MOZ_ASSERT(pcm.Length() - mResampledLeftover.Length() >=
+ outframesToCopy * mChannels);
+ PodCopy(pcm.Elements() + mResampledLeftover.Length(),
+ resamplingDest.Elements(), outframesToCopy * mChannels);
+ int frameLeftover = outframes - outframesToCopy;
+ mResampledLeftover.SetLength(frameLeftover * mChannels);
+ PodCopy(mResampledLeftover.Elements(),
+ resamplingDest.Elements() + outframesToCopy * mChannels,
+ mResampledLeftover.Length());
+ // This is always at 48000Hz.
+ framesInPCM = framesLeft + outframesToCopy;
+ audiodata->SetDuration(framesInPCM);
+ } else {
+ // The ogg time stamping and pre-skip is always timed at 48000.
+ audiodata->SetDuration(frameCopied * (kOpusSamplingRate / mSamplingRate));
+ }
+
+ // Remove the raw data which has been pulled to pcm buffer.
+ // The value of frameCopied should equal to (or smaller than, if eos)
+ // GetPacketDuration().
+ mSourceSegment.RemoveLeading(frameCopied);
+
+ // Has reached the end of input stream and all queued data has pulled for
+ // encoding.
+ if (mSourceSegment.GetDuration() == 0 && mEosSetInEncoder) {
+ mEncodingComplete = true;
+ LOG("[Opus] Done encoding.");
+ }
+
+ MOZ_ASSERT(mEosSetInEncoder || framesInPCM == GetPacketDuration());
+
+ // Append null data to pcm buffer if the leftover data is not enough for
+ // opus encoder.
+ if (framesInPCM < GetPacketDuration() && mEosSetInEncoder) {
+ PodZero(pcm.Elements() + framesInPCM * mChannels,
+ (GetPacketDuration() - framesInPCM) * mChannels);
+ }
+ nsTArray<uint8_t> frameData;
+ // Encode the data with Opus Encoder.
+ frameData.SetLength(MAX_DATA_BYTES);
+ // result is returned as opus error code if it is negative.
+ result = 0;
+#ifdef MOZ_SAMPLE_TYPE_S16
+ const opus_int16* pcmBuf = static_cast<opus_int16*>(pcm.Elements());
+ result = opus_encode(mEncoder, pcmBuf, GetPacketDuration(),
+ frameData.Elements(), MAX_DATA_BYTES);
+#else
+ const float* pcmBuf = static_cast<float*>(pcm.Elements());
+ result = opus_encode_float(mEncoder, pcmBuf, GetPacketDuration(),
+ frameData.Elements(), MAX_DATA_BYTES);
+#endif
+ frameData.SetLength(result >= 0 ? result : 0);
+
+ if (result < 0) {
+ LOG("[Opus] Fail to encode data! Result: %s.", opus_strerror(result));
+ }
+ if (mEncodingComplete) {
+ if (mResampler) {
+ speex_resampler_destroy(mResampler);
+ mResampler = nullptr;
+ }
+ mResampledLeftover.SetLength(0);
+ }
+
+ audiodata->SwapInFrameData(frameData);
+ // timestamp should be the time of the first sample
+ audiodata->SetTimeStamp(mOutputTimeStamp);
+ mOutputTimeStamp += FramesToUsecs(GetPacketDuration(), kOpusSamplingRate).value();
+ LOG("[Opus] mOutputTimeStamp %lld.",mOutputTimeStamp);
+ aData.AppendEncodedFrame(audiodata);
+ }
+done:
+ return result >= 0 ? NS_OK : NS_ERROR_FAILURE;
+}
+
+} // namespace mozilla
diff --git a/dom/media/encoder/OpusTrackEncoder.h b/dom/media/encoder/OpusTrackEncoder.h
new file mode 100644
index 000000000..8fd21d49b
--- /dev/null
+++ b/dom/media/encoder/OpusTrackEncoder.h
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef OpusTrackEncoder_h_
+#define OpusTrackEncoder_h_
+
+#include <stdint.h>
+#include <speex/speex_resampler.h>
+#include "TrackEncoder.h"
+
+struct OpusEncoder;
+
+namespace mozilla {
+
+// Opus meta data structure
+class OpusMetadata : public TrackMetadataBase
+{
+public:
+ // The ID Header of OggOpus. refer to http://wiki.xiph.org/OggOpus.
+ nsTArray<uint8_t> mIdHeader;
+ // The Comment Header of OggOpus.
+ nsTArray<uint8_t> mCommentHeader;
+ int32_t mChannels;
+ float mSamplingFrequency;
+ MetadataKind GetKind() const override { return METADATA_OPUS; }
+};
+
+class OpusTrackEncoder : public AudioTrackEncoder
+{
+public:
+ OpusTrackEncoder();
+ virtual ~OpusTrackEncoder();
+
+ already_AddRefed<TrackMetadataBase> GetMetadata() override;
+
+ nsresult GetEncodedTrack(EncodedFrameContainer& aData) override;
+
+protected:
+ int GetPacketDuration() override;
+
+ nsresult Init(int aChannels, int aSamplingRate) override;
+
+ /**
+ * Get the samplerate of the data to be fed to the Opus encoder. This might be
+ * different from the input samplerate if resampling occurs.
+ */
+ int GetOutputSampleRate();
+
+private:
+ /**
+ * The Opus encoder from libopus.
+ */
+ OpusEncoder* mEncoder;
+
+ /**
+ * A local segment queue which takes the raw data out from mRawSegment in the
+ * call of GetEncodedTrack(). Opus encoder only accepts GetPacketDuration()
+ * samples from mSourceSegment every encoding cycle, thus it needs to be
+ * global in order to store the leftover segments taken from mRawSegment.
+ */
+ AudioSegment mSourceSegment;
+
+ /**
+ * Total samples of delay added by codec, can be queried by the encoder. From
+ * the perspective of decoding, real data begins this many samples late, so
+ * the encoder needs to append this many null samples to the end of stream,
+ * in order to align the time of input and output.
+ */
+ int mLookahead;
+
+ /**
+ * If the input sample rate does not divide 48kHz evenly, the input data are
+ * resampled.
+ */
+ SpeexResamplerState* mResampler;
+
+ /**
+ * Store the resampled frames that don't fit into an Opus packet duration.
+ * They will be prepended to the resampled frames next encoding cycle.
+ */
+ nsTArray<AudioDataValue> mResampledLeftover;
+
+ // TimeStamp in microseconds.
+ uint64_t mOutputTimeStamp;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/TrackEncoder.cpp b/dom/media/encoder/TrackEncoder.cpp
new file mode 100644
index 000000000..ea39bb5a6
--- /dev/null
+++ b/dom/media/encoder/TrackEncoder.cpp
@@ -0,0 +1,342 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "TrackEncoder.h"
+#include "AudioChannelFormat.h"
+#include "MediaStreamGraph.h"
+#include "MediaStreamListener.h"
+#include "mozilla/Logging.h"
+#include "VideoUtils.h"
+
+#undef LOG
+#ifdef MOZ_WIDGET_GONK
+#include <android/log.h>
+#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "MediaEncoder", ## args);
+#else
+#define LOG(args, ...)
+#endif
+
+namespace mozilla {
+
+LazyLogModule gTrackEncoderLog("TrackEncoder");
+#define TRACK_LOG(type, msg) MOZ_LOG(gTrackEncoderLog, type, msg)
+
+static const int DEFAULT_CHANNELS = 1;
+static const int DEFAULT_SAMPLING_RATE = 16000;
+static const int DEFAULT_FRAME_WIDTH = 640;
+static const int DEFAULT_FRAME_HEIGHT = 480;
+static const int DEFAULT_TRACK_RATE = USECS_PER_S;
+// 30 seconds threshold if the encoder still can't not be initialized.
+static const int INIT_FAILED_DURATION = 30;
+
+TrackEncoder::TrackEncoder()
+ : mReentrantMonitor("media.TrackEncoder")
+ , mEncodingComplete(false)
+ , mEosSetInEncoder(false)
+ , mInitialized(false)
+ , mEndOfStream(false)
+ , mCanceled(false)
+ , mInitCounter(0)
+ , mNotInitDuration(0)
+{
+}
+
+void TrackEncoder::NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event)
+{
+ if (event == MediaStreamGraphEvent::EVENT_REMOVED) {
+ NotifyEndOfStream();
+ }
+}
+
+void
+AudioTrackEncoder::NotifyQueuedTrackChanges(MediaStreamGraph* aGraph,
+ TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aQueuedMedia)
+{
+ if (mCanceled) {
+ return;
+ }
+
+ const AudioSegment& audio = static_cast<const AudioSegment&>(aQueuedMedia);
+
+ // Check and initialize parameters for codec encoder.
+ if (!mInitialized) {
+ mInitCounter++;
+ TRACK_LOG(LogLevel::Debug, ("Init the audio encoder %d times", mInitCounter));
+ AudioSegment::ChunkIterator iter(const_cast<AudioSegment&>(audio));
+ while (!iter.IsEnded()) {
+ AudioChunk chunk = *iter;
+
+ // The number of channels is determined by the first non-null chunk, and
+ // thus the audio encoder is initialized at this time.
+ if (!chunk.IsNull()) {
+ nsresult rv = Init(chunk.mChannelData.Length(), aGraph->GraphRate());
+ if (NS_FAILED(rv)) {
+ LOG("[AudioTrackEncoder]: Fail to initialize the encoder!");
+ NotifyCancel();
+ }
+ break;
+ }
+
+ iter.Next();
+ }
+
+ mNotInitDuration += aQueuedMedia.GetDuration();
+ if (!mInitialized &&
+ (mNotInitDuration / aGraph->GraphRate() > INIT_FAILED_DURATION) &&
+ mInitCounter > 1) {
+ LOG("[AudioTrackEncoder]: Initialize failed for 30s.");
+ NotifyEndOfStream();
+ return;
+ }
+ }
+
+ // Append and consume this raw segment.
+ AppendAudioSegment(audio);
+
+
+ // The stream has stopped and reached the end of track.
+ if (aTrackEvents == TrackEventCommand::TRACK_EVENT_ENDED) {
+ LOG("[AudioTrackEncoder]: Receive TRACK_EVENT_ENDED .");
+ NotifyEndOfStream();
+ }
+}
+
+void
+AudioTrackEncoder::NotifyEndOfStream()
+{
+ // If source audio track is completely silent till the end of encoding,
+ // initialize the encoder with default channel counts and sampling rate.
+ if (!mCanceled && !mInitialized) {
+ Init(DEFAULT_CHANNELS, DEFAULT_SAMPLING_RATE);
+ }
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mEndOfStream = true;
+ mReentrantMonitor.NotifyAll();
+}
+
+nsresult
+AudioTrackEncoder::AppendAudioSegment(const AudioSegment& aSegment)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ AudioSegment::ChunkIterator iter(const_cast<AudioSegment&>(aSegment));
+ while (!iter.IsEnded()) {
+ AudioChunk chunk = *iter;
+ // Append and consume both non-null and null chunks.
+ mRawSegment.AppendAndConsumeChunk(&chunk);
+ iter.Next();
+ }
+
+ if (mRawSegment.GetDuration() >= GetPacketDuration()) {
+ mReentrantMonitor.NotifyAll();
+ }
+
+ return NS_OK;
+}
+
+/*static*/
+void
+AudioTrackEncoder::InterleaveTrackData(AudioChunk& aChunk,
+ int32_t aDuration,
+ uint32_t aOutputChannels,
+ AudioDataValue* aOutput)
+{
+ uint32_t numChannelsToCopy = std::min(aOutputChannels,
+ static_cast<uint32_t>(aChunk.mChannelData.Length()));
+ switch(aChunk.mBufferFormat) {
+ case AUDIO_FORMAT_S16: {
+ AutoTArray<const int16_t*, 2> array;
+ array.SetLength(numChannelsToCopy);
+ for (uint32_t i = 0; i < array.Length(); i++) {
+ array[i] = static_cast<const int16_t*>(aChunk.mChannelData[i]);
+ }
+ InterleaveTrackData(array, aDuration, aOutputChannels, aOutput, aChunk.mVolume);
+ break;
+ }
+ case AUDIO_FORMAT_FLOAT32: {
+ AutoTArray<const float*, 2> array;
+ array.SetLength(numChannelsToCopy);
+ for (uint32_t i = 0; i < array.Length(); i++) {
+ array[i] = static_cast<const float*>(aChunk.mChannelData[i]);
+ }
+ InterleaveTrackData(array, aDuration, aOutputChannels, aOutput, aChunk.mVolume);
+ break;
+ }
+ case AUDIO_FORMAT_SILENCE: {
+ MOZ_ASSERT(false, "To implement.");
+ }
+ };
+}
+
+/*static*/
+void
+AudioTrackEncoder::DeInterleaveTrackData(AudioDataValue* aInput,
+ int32_t aDuration,
+ int32_t aChannels,
+ AudioDataValue* aOutput)
+{
+ for (int32_t i = 0; i < aChannels; ++i) {
+ for(int32_t j = 0; j < aDuration; ++j) {
+ aOutput[i * aDuration + j] = aInput[i + j * aChannels];
+ }
+ }
+}
+
+size_t
+AudioTrackEncoder::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ return mRawSegment.SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+VideoTrackEncoder::Init(const VideoSegment& aSegment)
+{
+ if (mInitialized) {
+ return;
+ }
+
+ mInitCounter++;
+ TRACK_LOG(LogLevel::Debug, ("Init the video encoder %d times", mInitCounter));
+ VideoSegment::ConstChunkIterator iter(aSegment);
+ while (!iter.IsEnded()) {
+ VideoChunk chunk = *iter;
+ if (!chunk.IsNull()) {
+ gfx::IntSize imgsize = chunk.mFrame.GetImage()->GetSize();
+ gfx::IntSize intrinsicSize = chunk.mFrame.GetIntrinsicSize();
+ nsresult rv = Init(imgsize.width, imgsize.height,
+ intrinsicSize.width, intrinsicSize.height);
+
+ if (NS_FAILED(rv)) {
+ LOG("[VideoTrackEncoder]: Fail to initialize the encoder!");
+ NotifyCancel();
+ }
+ break;
+ }
+
+ iter.Next();
+ }
+
+ mNotInitDuration += aSegment.GetDuration();
+ if ((mNotInitDuration / mTrackRate > INIT_FAILED_DURATION) &&
+ mInitCounter > 1) {
+ LOG("[VideoTrackEncoder]: Initialize failed for %ds.", INIT_FAILED_DURATION);
+ NotifyEndOfStream();
+ return;
+ }
+
+}
+
+void
+VideoTrackEncoder::SetCurrentFrames(const VideoSegment& aSegment)
+{
+ if (mCanceled) {
+ return;
+ }
+
+ Init(aSegment);
+ AppendVideoSegment(aSegment);
+}
+
+void
+VideoTrackEncoder::NotifyQueuedTrackChanges(MediaStreamGraph* aGraph,
+ TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aQueuedMedia)
+{
+ if (mCanceled) {
+ return;
+ }
+
+ if (!(aTrackEvents == TRACK_EVENT_CREATED ||
+ aTrackEvents == TRACK_EVENT_ENDED)) {
+ return;
+ }
+
+ const VideoSegment& video = static_cast<const VideoSegment&>(aQueuedMedia);
+
+ // Check and initialize parameters for codec encoder.
+ Init(video);
+
+ AppendVideoSegment(video);
+
+ // The stream has stopped and reached the end of track.
+ if (aTrackEvents == TrackEventCommand::TRACK_EVENT_ENDED) {
+ LOG("[VideoTrackEncoder]: Receive TRACK_EVENT_ENDED .");
+ NotifyEndOfStream();
+ }
+
+}
+
+nsresult
+VideoTrackEncoder::AppendVideoSegment(const VideoSegment& aSegment)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ // Append all video segments from MediaStreamGraph, including null an
+ // non-null frames.
+ VideoSegment::ChunkIterator iter(const_cast<VideoSegment&>(aSegment));
+ while (!iter.IsEnded()) {
+ VideoChunk chunk = *iter;
+ mLastFrameDuration += chunk.GetDuration();
+ // Send only the unique video frames for encoding.
+ // Or if we got the same video chunks more than 1 seconds,
+ // force to send into encoder.
+ if ((mLastFrame != chunk.mFrame) ||
+ (mLastFrameDuration >= mTrackRate)) {
+ RefPtr<layers::Image> image = chunk.mFrame.GetImage();
+
+ // Because we may get chunks with a null image (due to input blocking),
+ // accumulate duration and give it to the next frame that arrives.
+ // Canonically incorrect - the duration should go to the previous frame
+ // - but that would require delaying until the next frame arrives.
+ // Best would be to do like OMXEncoder and pass an effective timestamp
+ // in with each frame.
+ if (image) {
+ mRawSegment.AppendFrame(image.forget(),
+ mLastFrameDuration,
+ chunk.mFrame.GetIntrinsicSize(),
+ PRINCIPAL_HANDLE_NONE,
+ chunk.mFrame.GetForceBlack());
+ mLastFrameDuration = 0;
+ }
+ }
+ mLastFrame.TakeFrom(&chunk.mFrame);
+ iter.Next();
+ }
+
+ if (mRawSegment.GetDuration() > 0) {
+ mReentrantMonitor.NotifyAll();
+ }
+
+ return NS_OK;
+}
+
+void
+VideoTrackEncoder::NotifyEndOfStream()
+{
+ // If source video track is muted till the end of encoding, initialize the
+ // encoder with default frame width, frame height, and track rate.
+ if (!mCanceled && !mInitialized) {
+ Init(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT,
+ DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT);
+ }
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mEndOfStream = true;
+ mReentrantMonitor.NotifyAll();
+}
+
+size_t
+VideoTrackEncoder::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ return mRawSegment.SizeOfExcludingThis(aMallocSizeOf);
+}
+
+} // namespace mozilla
diff --git a/dom/media/encoder/TrackEncoder.h b/dom/media/encoder/TrackEncoder.h
new file mode 100644
index 000000000..33f20e899
--- /dev/null
+++ b/dom/media/encoder/TrackEncoder.h
@@ -0,0 +1,364 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef TrackEncoder_h_
+#define TrackEncoder_h_
+
+#include "mozilla/ReentrantMonitor.h"
+
+#include "AudioSegment.h"
+#include "EncodedFrameContainer.h"
+#include "StreamTracks.h"
+#include "TrackMetadataBase.h"
+#include "VideoSegment.h"
+#include "MediaStreamGraph.h"
+
+namespace mozilla {
+
+/**
+ * Base class of AudioTrackEncoder and VideoTrackEncoder. Lifetimes managed by
+ * MediaEncoder. Most methods can only be called on the MediaEncoder's thread,
+ * but some subclass methods can be called on other threads when noted.
+ *
+ * NotifyQueuedTrackChanges is called on subclasses of this class from the
+ * MediaStreamGraph thread, and AppendAudioSegment/AppendVideoSegment is then
+ * called to store media data in the TrackEncoder. Later on, GetEncodedTrack is
+ * called on MediaEncoder's thread to encode and retrieve the encoded data.
+ */
+class TrackEncoder
+{
+public:
+ TrackEncoder();
+
+ virtual ~TrackEncoder() {}
+
+ /**
+ * Notified by the same callbcak of MediaEncoder when it has received a track
+ * change from MediaStreamGraph. Called on the MediaStreamGraph thread.
+ */
+ virtual void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aQueuedMedia) = 0;
+
+ /**
+ * Notified by the same callback of MediaEncoder when it has been removed from
+ * MediaStreamGraph. Called on the MediaStreamGraph thread.
+ */
+ void NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event);
+
+ /**
+ * Creates and sets up meta data for a specific codec, called on the worker
+ * thread.
+ */
+ virtual already_AddRefed<TrackMetadataBase> GetMetadata() = 0;
+
+ /**
+ * Encodes raw segments. Result data is returned in aData, and called on the
+ * worker thread.
+ */
+ virtual nsresult GetEncodedTrack(EncodedFrameContainer& aData) = 0;
+
+ /**
+ * True if the track encoder has encoded all source segments coming from
+ * MediaStreamGraph. Call on the worker thread.
+ */
+ bool IsEncodingComplete() { return mEncodingComplete; }
+
+ /**
+ * Notifies from MediaEncoder to cancel the encoding, and wakes up
+ * mReentrantMonitor if encoder is waiting on it.
+ */
+ void NotifyCancel()
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mCanceled = true;
+ mReentrantMonitor.NotifyAll();
+ }
+
+ virtual void SetBitrate(const uint32_t aBitrate) {}
+
+protected:
+ /**
+ * Notifies track encoder that we have reached the end of source stream, and
+ * wakes up mReentrantMonitor if encoder is waiting for any source data.
+ */
+ virtual void NotifyEndOfStream() = 0;
+
+ /**
+ * A ReentrantMonitor to protect the pushing and pulling of mRawSegment which
+ * is declared in its subclasses, and the following flags: mInitialized,
+ * EndOfStream and mCanceled. The control of protection is managed by its
+ * subclasses.
+ */
+ ReentrantMonitor mReentrantMonitor;
+
+ /**
+ * True if the track encoder has encoded all source data.
+ */
+ bool mEncodingComplete;
+
+ /**
+ * True if flag of EOS or any form of indicating EOS has set in the codec-
+ * encoder.
+ */
+ bool mEosSetInEncoder;
+
+ /**
+ * True if the track encoder has initialized successfully, protected by
+ * mReentrantMonitor.
+ */
+ bool mInitialized;
+
+ /**
+ * True if the TrackEncoder has received an event of TRACK_EVENT_ENDED from
+ * MediaStreamGraph, or the MediaEncoder is removed from its source stream,
+ * protected by mReentrantMonitor.
+ */
+ bool mEndOfStream;
+
+ /**
+ * True if a cancellation of encoding is sent from MediaEncoder, protected by
+ * mReentrantMonitor.
+ */
+ bool mCanceled;
+
+ // How many times we have tried to initialize the encoder.
+ uint32_t mInitCounter;
+ StreamTime mNotInitDuration;
+};
+
+class AudioTrackEncoder : public TrackEncoder
+{
+public:
+ AudioTrackEncoder()
+ : TrackEncoder()
+ , mChannels(0)
+ , mSamplingRate(0)
+ , mAudioBitrate(0)
+ {}
+
+ void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aQueuedMedia) override;
+
+ template<typename T>
+ static
+ void InterleaveTrackData(nsTArray<const T*>& aInput,
+ int32_t aDuration,
+ uint32_t aOutputChannels,
+ AudioDataValue* aOutput,
+ float aVolume)
+ {
+ if (aInput.Length() < aOutputChannels) {
+ // Up-mix. This might make the mChannelData have more than aChannels.
+ AudioChannelsUpMix(&aInput, aOutputChannels, SilentChannel::ZeroChannel<T>());
+ }
+
+ if (aInput.Length() > aOutputChannels) {
+ DownmixAndInterleave(aInput, aDuration,
+ aVolume, aOutputChannels, aOutput);
+ } else {
+ InterleaveAndConvertBuffer(aInput.Elements(), aDuration, aVolume,
+ aOutputChannels, aOutput);
+ }
+ }
+
+ /**
+ * Interleaves the track data and stores the result into aOutput. Might need
+ * to up-mix or down-mix the channel data if the channels number of this chunk
+ * is different from aOutputChannels. The channel data from aChunk might be
+ * modified by up-mixing.
+ */
+ static void InterleaveTrackData(AudioChunk& aChunk, int32_t aDuration,
+ uint32_t aOutputChannels,
+ AudioDataValue* aOutput);
+
+ /**
+ * De-interleaves the aInput data and stores the result into aOutput.
+ * No up-mix or down-mix operations inside.
+ */
+ static void DeInterleaveTrackData(AudioDataValue* aInput, int32_t aDuration,
+ int32_t aChannels, AudioDataValue* aOutput);
+ /**
+ * Measure size of mRawSegment
+ */
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ void SetBitrate(const uint32_t aBitrate) override
+ {
+ mAudioBitrate = aBitrate;
+ }
+protected:
+ /**
+ * Number of samples per channel in a pcm buffer. This is also the value of
+ * frame size required by audio encoder, and mReentrantMonitor will be
+ * notified when at least this much data has been added to mRawSegment.
+ */
+ virtual int GetPacketDuration() { return 0; }
+
+ /**
+ * Initializes the audio encoder. The call of this method is delayed until we
+ * have received the first valid track from MediaStreamGraph, and the
+ * mReentrantMonitor will be notified if other methods is waiting for encoder
+ * to be completely initialized. This method is called on the MediaStreamGraph
+ * thread.
+ */
+ virtual nsresult Init(int aChannels, int aSamplingRate) = 0;
+
+ /**
+ * Appends and consumes track data from aSegment, this method is called on
+ * the MediaStreamGraph thread. mReentrantMonitor will be notified when at
+ * least GetPacketDuration() data has been added to mRawSegment, wake up other
+ * method which is waiting for more data from mRawSegment.
+ */
+ nsresult AppendAudioSegment(const AudioSegment& aSegment);
+
+ /**
+ * Notifies the audio encoder that we have reached the end of source stream,
+ * and wakes up mReentrantMonitor if encoder is waiting for more track data.
+ */
+ void NotifyEndOfStream() override;
+
+ /**
+ * The number of channels are used for processing PCM data in the audio encoder.
+ * This value comes from the first valid audio chunk. If encoder can't support
+ * the channels in the chunk, downmix PCM stream can be performed.
+ * This value also be used to initialize the audio encoder.
+ */
+ int mChannels;
+
+ /**
+ * The sampling rate of source audio data.
+ */
+ int mSamplingRate;
+
+ /**
+ * A segment queue of audio track data, protected by mReentrantMonitor.
+ */
+ AudioSegment mRawSegment;
+
+ uint32_t mAudioBitrate;
+};
+
+class VideoTrackEncoder : public TrackEncoder
+{
+public:
+ explicit VideoTrackEncoder(TrackRate aTrackRate)
+ : TrackEncoder()
+ , mFrameWidth(0)
+ , mFrameHeight(0)
+ , mDisplayWidth(0)
+ , mDisplayHeight(0)
+ , mTrackRate(aTrackRate)
+ , mTotalFrameDuration(0)
+ , mLastFrameDuration(0)
+ , mVideoBitrate(0)
+ {}
+
+ /**
+ * Notified by the same callback of MediaEncoder when it has received a track
+ * change from MediaStreamGraph. Called on the MediaStreamGraph thread.
+ */
+ void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ uint32_t aTrackEvents,
+ const MediaSegment& aQueuedMedia) override;
+ /**
+ * Measure size of mRawSegment
+ */
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ void SetBitrate(const uint32_t aBitrate) override
+ {
+ mVideoBitrate = aBitrate;
+ }
+
+ void Init(const VideoSegment& aSegment);
+
+ void SetCurrentFrames(const VideoSegment& aSegment);
+
+ StreamTime SecondsToMediaTime(double aS) const
+ {
+ NS_ASSERTION(0 <= aS && aS <= TRACK_TICKS_MAX/TRACK_RATE_MAX,
+ "Bad seconds");
+ return mTrackRate * aS;
+ }
+
+protected:
+ /**
+ * Initialized the video encoder. In order to collect the value of width and
+ * height of source frames, this initialization is delayed until we have
+ * received the first valid video frame from MediaStreamGraph;
+ * mReentrantMonitor will be notified after it has successfully initialized,
+ * and this method is called on the MediaStramGraph thread.
+ */
+ virtual nsresult Init(int aWidth, int aHeight, int aDisplayWidth,
+ int aDisplayHeight) = 0;
+
+ /**
+ * Appends source video frames to mRawSegment. We only append the source chunk
+ * if it is unique to mLastChunk. Called on the MediaStreamGraph thread.
+ */
+ nsresult AppendVideoSegment(const VideoSegment& aSegment);
+
+ /**
+ * Tells the video track encoder that we've reached the end of source stream,
+ * and wakes up mReentrantMonitor if encoder is waiting for more track data.
+ * Called on the MediaStreamGraph thread.
+ */
+ void NotifyEndOfStream() override;
+
+ /**
+ * The width of source video frame, ceiled if the source width is odd.
+ */
+ int mFrameWidth;
+
+ /**
+ * The height of source video frame, ceiled if the source height is odd.
+ */
+ int mFrameHeight;
+
+ /**
+ * The display width of source video frame.
+ */
+ int mDisplayWidth;
+
+ /**
+ * The display height of source video frame.
+ */
+ int mDisplayHeight;
+
+ /**
+ * The track rate of source video.
+ */
+ TrackRate mTrackRate;
+
+ /**
+ * The total duration of frames in encoded video in StreamTime, kept track of
+ * in subclasses.
+ */
+ StreamTime mTotalFrameDuration;
+
+ /**
+ * The last unique frame and duration we've sent to track encoder,
+ * kept track of in subclasses.
+ */
+ VideoFrame mLastFrame;
+ StreamTime mLastFrameDuration;
+
+ /**
+ * A segment queue of audio track data, protected by mReentrantMonitor.
+ */
+ VideoSegment mRawSegment;
+
+ uint32_t mVideoBitrate;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/TrackMetadataBase.h b/dom/media/encoder/TrackMetadataBase.h
new file mode 100644
index 000000000..a8b818c09
--- /dev/null
+++ b/dom/media/encoder/TrackMetadataBase.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef TrackMetadataBase_h_
+#define TrackMetadataBase_h_
+
+#include "nsTArray.h"
+#include "nsCOMPtr.h"
+namespace mozilla {
+
+// A class represent meta data for various codec format. Only support one track information.
+class TrackMetadataBase
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TrackMetadataBase)
+ enum MetadataKind {
+ METADATA_OPUS, // Represent the Opus metadata
+ METADATA_VP8,
+ METADATA_VORBIS,
+ METADATA_AVC,
+ METADATA_AAC,
+ METADATA_AMR,
+ METADATA_EVRC,
+ METADATA_UNKNOWN // Metadata Kind not set
+ };
+ // Return the specific metadata kind
+ virtual MetadataKind GetKind() const = 0;
+
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~TrackMetadataBase() {}
+};
+
+// The base class for audio metadata.
+class AudioTrackMetadata : public TrackMetadataBase {
+public:
+ // The duration of each sample set generated by encoder. (counted by samples)
+ // If the duration is variant, this value should return 0.
+ virtual uint32_t GetAudioFrameDuration() = 0;
+
+ // The size of each sample set generated by encoder. (counted by byte)
+ // If the size is variant, this value should return 0.
+ virtual uint32_t GetAudioFrameSize() = 0;
+
+ // AudioSampleRate is the number of audio sample per second.
+ virtual uint32_t GetAudioSampleRate() = 0;
+
+ virtual uint32_t GetAudioChannels() = 0;
+};
+
+// The base class for video metadata.
+class VideoTrackMetadata : public TrackMetadataBase {
+public:
+ // VideoHeight and VideoWidth are the frame size of the elementary stream.
+ virtual uint32_t GetVideoHeight() = 0;
+ virtual uint32_t GetVideoWidth() = 0;
+
+ // VideoDisplayHeight and VideoDisplayWidth are the display frame size.
+ virtual uint32_t GetVideoDisplayHeight() = 0;
+ virtual uint32_t GetVideoDisplayWidth() = 0;
+
+ // VideoClockRate is the number of samples per second in video frame's
+ // timestamp.
+ // For example, if VideoClockRate is 90k Hz and VideoFrameRate is
+ // 30 fps, each frame's sample duration will be 3000 Hz.
+ virtual uint32_t GetVideoClockRate() = 0;
+
+ // VideoFrameRate is numner of frames per second.
+ virtual uint32_t GetVideoFrameRate() = 0;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/VP8TrackEncoder.cpp b/dom/media/encoder/VP8TrackEncoder.cpp
new file mode 100644
index 000000000..1e5451f0f
--- /dev/null
+++ b/dom/media/encoder/VP8TrackEncoder.cpp
@@ -0,0 +1,678 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VP8TrackEncoder.h"
+#include "GeckoProfiler.h"
+#include "LayersLogging.h"
+#include "libyuv.h"
+#include "mozilla/gfx/2D.h"
+#include "prsystem.h"
+#include "VideoSegment.h"
+#include "VideoUtils.h"
+#include "vpx/vp8cx.h"
+#include "vpx/vpx_encoder.h"
+#include "WebMWriter.h"
+#include "mozilla/media/MediaUtils.h"
+
+namespace mozilla {
+
+LazyLogModule gVP8TrackEncoderLog("VP8TrackEncoder");
+#define VP8LOG(msg, ...) MOZ_LOG(gVP8TrackEncoderLog, mozilla::LogLevel::Debug, \
+ (msg, ##__VA_ARGS__))
+// Debug logging macro with object pointer and class name.
+
+#define DEFAULT_BITRATE_BPS 2500000
+#define DEFAULT_ENCODE_FRAMERATE 30
+
+using namespace mozilla::gfx;
+using namespace mozilla::layers;
+
+VP8TrackEncoder::VP8TrackEncoder(TrackRate aTrackRate)
+ : VideoTrackEncoder(aTrackRate)
+ , mEncodedFrameDuration(0)
+ , mEncodedTimestamp(0)
+ , mRemainingTicks(0)
+ , mVPXContext(new vpx_codec_ctx_t())
+ , mVPXImageWrapper(new vpx_image_t())
+{
+ MOZ_COUNT_CTOR(VP8TrackEncoder);
+}
+
+VP8TrackEncoder::~VP8TrackEncoder()
+{
+ if (mInitialized) {
+ vpx_codec_destroy(mVPXContext);
+ }
+
+ if (mVPXImageWrapper) {
+ vpx_img_free(mVPXImageWrapper);
+ }
+ MOZ_COUNT_DTOR(VP8TrackEncoder);
+}
+
+nsresult
+VP8TrackEncoder::Init(int32_t aWidth, int32_t aHeight, int32_t aDisplayWidth,
+ int32_t aDisplayHeight)
+{
+ if (aWidth < 1 || aHeight < 1 || aDisplayWidth < 1 || aDisplayHeight < 1) {
+ return NS_ERROR_FAILURE;
+ }
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ mEncodedFrameRate = DEFAULT_ENCODE_FRAMERATE;
+ mEncodedFrameDuration = mTrackRate / mEncodedFrameRate;
+ mFrameWidth = aWidth;
+ mFrameHeight = aHeight;
+ mDisplayWidth = aDisplayWidth;
+ mDisplayHeight = aDisplayHeight;
+
+ // Encoder configuration structure.
+ vpx_codec_enc_cfg_t config;
+ memset(&config, 0, sizeof(vpx_codec_enc_cfg_t));
+ if (vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &config, 0)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Creating a wrapper to the image - setting image data to NULL. Actual
+ // pointer will be set in encode. Setting align to 1, as it is meaningless
+ // (actual memory is not allocated).
+ vpx_img_wrap(mVPXImageWrapper, VPX_IMG_FMT_I420,
+ mFrameWidth, mFrameHeight, 1, nullptr);
+
+ config.g_w = mFrameWidth;
+ config.g_h = mFrameHeight;
+ // TODO: Maybe we should have various aFrameRate bitrate pair for each devices?
+ // or for different platform
+
+ // rc_target_bitrate needs kbit/s
+ config.rc_target_bitrate = (mVideoBitrate != 0 ? mVideoBitrate : DEFAULT_BITRATE_BPS)/1000;
+
+ // Setting the time base of the codec
+ config.g_timebase.num = 1;
+ config.g_timebase.den = mTrackRate;
+
+ config.g_error_resilient = 0;
+
+ config.g_lag_in_frames = 0; // 0- no frame lagging
+
+ int32_t number_of_cores = PR_GetNumberOfProcessors();
+ if (mFrameWidth * mFrameHeight > 1280 * 960 && number_of_cores >= 6) {
+ config.g_threads = 3; // 3 threads for 1080p.
+ } else if (mFrameWidth * mFrameHeight > 640 * 480 && number_of_cores >= 3) {
+ config.g_threads = 2; // 2 threads for qHD/HD.
+ } else {
+ config.g_threads = 1; // 1 thread for VGA or less
+ }
+
+ // rate control settings
+ config.rc_dropframe_thresh = 0;
+ config.rc_end_usage = VPX_CBR;
+ config.g_pass = VPX_RC_ONE_PASS;
+ // ffmpeg doesn't currently support streams that use resize.
+ // Therefore, for safety, we should turn it off until it does.
+ config.rc_resize_allowed = 0;
+ config.rc_undershoot_pct = 100;
+ config.rc_overshoot_pct = 15;
+ config.rc_buf_initial_sz = 500;
+ config.rc_buf_optimal_sz = 600;
+ config.rc_buf_sz = 1000;
+
+ config.kf_mode = VPX_KF_AUTO;
+ // Ensure that we can output one I-frame per second.
+ config.kf_max_dist = mEncodedFrameRate;
+
+ vpx_codec_flags_t flags = 0;
+ flags |= VPX_CODEC_USE_OUTPUT_PARTITION;
+ if (vpx_codec_enc_init(mVPXContext, vpx_codec_vp8_cx(), &config, flags)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ vpx_codec_control(mVPXContext, VP8E_SET_STATIC_THRESHOLD, 1);
+ vpx_codec_control(mVPXContext, VP8E_SET_CPUUSED, -6);
+ vpx_codec_control(mVPXContext, VP8E_SET_TOKEN_PARTITIONS,
+ VP8_ONE_TOKENPARTITION);
+
+ mInitialized = true;
+ mon.NotifyAll();
+
+ return NS_OK;
+}
+
+already_AddRefed<TrackMetadataBase>
+VP8TrackEncoder::GetMetadata()
+{
+ PROFILER_LABEL("VP8TrackEncoder", "GetMetadata",
+ js::ProfileEntry::Category::OTHER);
+ {
+ // Wait if mEncoder is not initialized.
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ while (!mCanceled && !mInitialized) {
+ mon.Wait();
+ }
+ }
+
+ if (mCanceled || mEncodingComplete) {
+ return nullptr;
+ }
+
+ RefPtr<VP8Metadata> meta = new VP8Metadata();
+ meta->mWidth = mFrameWidth;
+ meta->mHeight = mFrameHeight;
+ meta->mDisplayWidth = mDisplayWidth;
+ meta->mDisplayHeight = mDisplayHeight;
+ meta->mEncodedFrameRate = mEncodedFrameRate;
+
+ return meta.forget();
+}
+
+bool
+VP8TrackEncoder::GetEncodedPartitions(EncodedFrameContainer& aData)
+{
+ vpx_codec_iter_t iter = nullptr;
+ EncodedFrame::FrameType frameType = EncodedFrame::VP8_P_FRAME;
+ nsTArray<uint8_t> frameData;
+ const vpx_codec_cx_pkt_t *pkt = nullptr;
+ while ((pkt = vpx_codec_get_cx_data(mVPXContext, &iter)) != nullptr) {
+ switch (pkt->kind) {
+ case VPX_CODEC_CX_FRAME_PKT: {
+ // Copy the encoded data from libvpx to frameData
+ frameData.AppendElements((uint8_t*)pkt->data.frame.buf,
+ pkt->data.frame.sz);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ // End of frame
+ if ((pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT) == 0) {
+ if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
+ frameType = EncodedFrame::VP8_I_FRAME;
+ }
+ break;
+ }
+ }
+
+ if (!frameData.IsEmpty()) {
+ // Copy the encoded data to aData.
+ EncodedFrame* videoData = new EncodedFrame();
+ videoData->SetFrameType(frameType);
+ // Convert the timestamp and duration to Usecs.
+ CheckedInt64 timestamp = FramesToUsecs(pkt->data.frame.pts, mTrackRate);
+ if (timestamp.isValid()) {
+ videoData->SetTimeStamp((uint64_t)timestamp.value());
+ }
+ CheckedInt64 duration = FramesToUsecs(pkt->data.frame.duration, mTrackRate);
+ if (duration.isValid()) {
+ videoData->SetDuration((uint64_t)duration.value());
+ }
+ videoData->SwapInFrameData(frameData);
+ VP8LOG("GetEncodedPartitions TimeStamp %lld Duration %lld\n",
+ videoData->GetTimeStamp(), videoData->GetDuration());
+ VP8LOG("frameType %d\n", videoData->GetFrameType());
+ aData.AppendEncodedFrame(videoData);
+ }
+
+ return !!pkt;
+}
+
+static bool isYUV420(const PlanarYCbCrImage::Data *aData)
+{
+ if (aData->mYSize == aData->mCbCrSize * 2) {
+ return true;
+ }
+ return false;
+}
+
+static bool isYUV422(const PlanarYCbCrImage::Data *aData)
+{
+ if ((aData->mYSize.width == aData->mCbCrSize.width * 2) &&
+ (aData->mYSize.height == aData->mCbCrSize.height)) {
+ return true;
+ }
+ return false;
+}
+
+static bool isYUV444(const PlanarYCbCrImage::Data *aData)
+{
+ if (aData->mYSize == aData->mCbCrSize) {
+ return true;
+ }
+ return false;
+}
+
+nsresult VP8TrackEncoder::PrepareRawFrame(VideoChunk &aChunk)
+{
+ RefPtr<Image> img;
+ if (aChunk.mFrame.GetForceBlack() || aChunk.IsNull()) {
+ if (!mMuteFrame) {
+ mMuteFrame = VideoFrame::CreateBlackImage(gfx::IntSize(mFrameWidth, mFrameHeight));
+ MOZ_ASSERT(mMuteFrame);
+ }
+ img = mMuteFrame;
+ } else {
+ img = aChunk.mFrame.GetImage();
+ }
+
+ if (img->GetSize() != IntSize(mFrameWidth, mFrameHeight)) {
+ VP8LOG("Dynamic resolution changes (was %dx%d, now %dx%d) are unsupported\n",
+ mFrameWidth, mFrameHeight, img->GetSize().width, img->GetSize().height);
+ return NS_ERROR_FAILURE;
+ }
+
+ ImageFormat format = img->GetFormat();
+ if (format == ImageFormat::PLANAR_YCBCR) {
+ PlanarYCbCrImage* yuv = static_cast<PlanarYCbCrImage *>(img.get());
+
+ MOZ_RELEASE_ASSERT(yuv);
+ if (!yuv->IsValid()) {
+ NS_WARNING("PlanarYCbCrImage is not valid");
+ return NS_ERROR_FAILURE;
+ }
+ const PlanarYCbCrImage::Data *data = yuv->GetData();
+
+ if (isYUV420(data) && !data->mCbSkip) {
+ // 420 planar, no need for conversions
+ mVPXImageWrapper->planes[VPX_PLANE_Y] = data->mYChannel;
+ mVPXImageWrapper->planes[VPX_PLANE_U] = data->mCbChannel;
+ mVPXImageWrapper->planes[VPX_PLANE_V] = data->mCrChannel;
+ mVPXImageWrapper->stride[VPX_PLANE_Y] = data->mYStride;
+ mVPXImageWrapper->stride[VPX_PLANE_U] = data->mCbCrStride;
+ mVPXImageWrapper->stride[VPX_PLANE_V] = data->mCbCrStride;
+
+ return NS_OK;
+ }
+ }
+
+ // Not 420 planar, have to convert
+ uint32_t yPlaneSize = mFrameWidth * mFrameHeight;
+ uint32_t halfWidth = (mFrameWidth + 1) / 2;
+ uint32_t halfHeight = (mFrameHeight + 1) / 2;
+ uint32_t uvPlaneSize = halfWidth * halfHeight;
+
+ if (mI420Frame.IsEmpty()) {
+ mI420Frame.SetLength(yPlaneSize + uvPlaneSize * 2);
+ }
+
+ uint8_t *y = mI420Frame.Elements();
+ uint8_t *cb = mI420Frame.Elements() + yPlaneSize;
+ uint8_t *cr = mI420Frame.Elements() + yPlaneSize + uvPlaneSize;
+
+ if (format == ImageFormat::PLANAR_YCBCR) {
+ PlanarYCbCrImage* yuv = static_cast<PlanarYCbCrImage *>(img.get());
+
+ MOZ_RELEASE_ASSERT(yuv);
+ if (!yuv->IsValid()) {
+ NS_WARNING("PlanarYCbCrImage is not valid");
+ return NS_ERROR_FAILURE;
+ }
+ const PlanarYCbCrImage::Data *data = yuv->GetData();
+
+ int rv;
+ std::string yuvFormat;
+ if (isYUV420(data) && data->mCbSkip) {
+ // If mCbSkip is set, we assume it's nv12 or nv21.
+ if (data->mCbChannel < data->mCrChannel) { // nv12
+ rv = libyuv::NV12ToI420(data->mYChannel, data->mYStride,
+ data->mCbChannel, data->mCbCrStride,
+ y, mFrameWidth,
+ cb, halfWidth,
+ cr, halfWidth,
+ mFrameWidth, mFrameHeight);
+ yuvFormat = "NV12";
+ } else { // nv21
+ rv = libyuv::NV21ToI420(data->mYChannel, data->mYStride,
+ data->mCrChannel, data->mCbCrStride,
+ y, mFrameWidth,
+ cb, halfWidth,
+ cr, halfWidth,
+ mFrameWidth, mFrameHeight);
+ yuvFormat = "NV21";
+ }
+ } else if (isYUV444(data) && !data->mCbSkip) {
+ rv = libyuv::I444ToI420(data->mYChannel, data->mYStride,
+ data->mCbChannel, data->mCbCrStride,
+ data->mCrChannel, data->mCbCrStride,
+ y, mFrameWidth,
+ cb, halfWidth,
+ cr, halfWidth,
+ mFrameWidth, mFrameHeight);
+ yuvFormat = "I444";
+ } else if (isYUV422(data) && !data->mCbSkip) {
+ rv = libyuv::I422ToI420(data->mYChannel, data->mYStride,
+ data->mCbChannel, data->mCbCrStride,
+ data->mCrChannel, data->mCbCrStride,
+ y, mFrameWidth,
+ cb, halfWidth,
+ cr, halfWidth,
+ mFrameWidth, mFrameHeight);
+ yuvFormat = "I422";
+ } else {
+ VP8LOG("Unsupported planar format\n");
+ NS_ASSERTION(false, "Unsupported planar format");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ if (rv != 0) {
+ VP8LOG("Converting an %s frame to I420 failed\n", yuvFormat.c_str());
+ return NS_ERROR_FAILURE;
+ }
+
+ VP8LOG("Converted an %s frame to I420\n", yuvFormat.c_str());
+ } else {
+ // Not YCbCr at all. Try to get access to the raw data and convert.
+
+ RefPtr<SourceSurface> surf = GetSourceSurface(img.forget());
+ if (!surf) {
+ VP8LOG("Getting surface from %s image failed\n", Stringify(format).c_str());
+ return NS_ERROR_FAILURE;
+ }
+
+ RefPtr<DataSourceSurface> data = surf->GetDataSurface();
+ if (!data) {
+ VP8LOG("Getting data surface from %s image with %s (%s) surface failed\n",
+ Stringify(format).c_str(), Stringify(surf->GetType()).c_str(),
+ Stringify(surf->GetFormat()).c_str());
+ return NS_ERROR_FAILURE;
+ }
+
+ DataSourceSurface::ScopedMap map(data, DataSourceSurface::READ);
+ if (!map.IsMapped()) {
+ VP8LOG("Reading DataSourceSurface from %s image with %s (%s) surface failed\n",
+ Stringify(format).c_str(), Stringify(surf->GetType()).c_str(),
+ Stringify(surf->GetFormat()).c_str());
+ return NS_ERROR_FAILURE;
+ }
+
+ int rv;
+ switch (surf->GetFormat()) {
+ case SurfaceFormat::B8G8R8A8:
+ case SurfaceFormat::B8G8R8X8:
+ rv = libyuv::ARGBToI420(static_cast<uint8*>(map.GetData()),
+ map.GetStride(),
+ y, mFrameWidth,
+ cb, halfWidth,
+ cr, halfWidth,
+ mFrameWidth, mFrameHeight);
+ break;
+ case SurfaceFormat::R5G6B5_UINT16:
+ rv = libyuv::RGB565ToI420(static_cast<uint8*>(map.GetData()),
+ map.GetStride(),
+ y, mFrameWidth,
+ cb, halfWidth,
+ cr, halfWidth,
+ mFrameWidth, mFrameHeight);
+ break;
+ default:
+ VP8LOG("Unsupported SourceSurface format %s\n",
+ Stringify(surf->GetFormat()).c_str());
+ NS_ASSERTION(false, "Unsupported SourceSurface format");
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ if (rv != 0) {
+ VP8LOG("%s to I420 conversion failed\n",
+ Stringify(surf->GetFormat()).c_str());
+ return NS_ERROR_FAILURE;
+ }
+
+ VP8LOG("Converted a %s frame to I420\n",
+ Stringify(surf->GetFormat()).c_str());
+ }
+
+ mVPXImageWrapper->planes[VPX_PLANE_Y] = y;
+ mVPXImageWrapper->planes[VPX_PLANE_U] = cb;
+ mVPXImageWrapper->planes[VPX_PLANE_V] = cr;
+ mVPXImageWrapper->stride[VPX_PLANE_Y] = mFrameWidth;
+ mVPXImageWrapper->stride[VPX_PLANE_U] = halfWidth;
+ mVPXImageWrapper->stride[VPX_PLANE_V] = halfWidth;
+
+ return NS_OK;
+}
+
+void
+VP8TrackEncoder::ReplyGetSourceSurface(already_AddRefed<gfx::SourceSurface> aSurf)
+{
+ mSourceSurface = aSurf;
+}
+
+already_AddRefed<gfx::SourceSurface>
+VP8TrackEncoder::GetSourceSurface(already_AddRefed<Image> aImg)
+{
+ RefPtr<Image> img = aImg;
+ mSourceSurface = nullptr;
+ if (img) {
+ if (img->AsGLImage() && !NS_IsMainThread()) {
+ // GLImage::GetAsSourceSurface() only support main thread
+ RefPtr<Runnable> getsourcesurface_runnable =
+ media::NewRunnableFrom([this, img]() -> nsresult {
+ // Due to the parameter DISPATCH_SYNC, encoder thread will stock at
+ // MediaRecorder::Session::Extract(bool). There is no chance
+ // that TrackEncoder will be destroyed during this period. So
+ // there is no need to use RefPtr to hold TrackEncoder.
+ ReplyGetSourceSurface(img->GetAsSourceSurface());
+ return NS_OK;
+ });
+ NS_DispatchToMainThread(getsourcesurface_runnable, NS_DISPATCH_SYNC);
+ } else {
+ mSourceSurface = img->GetAsSourceSurface();
+ }
+ }
+ return mSourceSurface.forget();
+}
+
+// These two define value used in GetNextEncodeOperation to determine the
+// EncodeOperation for next target frame.
+#define I_FRAME_RATIO (0.5)
+#define SKIP_FRAME_RATIO (0.75)
+
+/**
+ * Compares the elapsed time from the beginning of GetEncodedTrack and
+ * the processed frame duration in mSourceSegment
+ * in order to set the nextEncodeOperation for next target frame.
+ */
+VP8TrackEncoder::EncodeOperation
+VP8TrackEncoder::GetNextEncodeOperation(TimeDuration aTimeElapsed,
+ StreamTime aProcessedDuration)
+{
+ int64_t durationInUsec =
+ FramesToUsecs(aProcessedDuration + mEncodedFrameDuration,
+ mTrackRate).value();
+ if (aTimeElapsed.ToMicroseconds() > (durationInUsec * SKIP_FRAME_RATIO)) {
+ // The encoder is too slow.
+ // We should skip next frame to consume the mSourceSegment.
+ return SKIP_FRAME;
+ } else if (aTimeElapsed.ToMicroseconds() > (durationInUsec * I_FRAME_RATIO)) {
+ // The encoder is a little slow.
+ // We force the encoder to encode an I-frame to accelerate.
+ return ENCODE_I_FRAME;
+ } else {
+ return ENCODE_NORMAL_FRAME;
+ }
+}
+
+StreamTime
+VP8TrackEncoder::CalculateRemainingTicks(StreamTime aDurationCopied,
+ StreamTime aEncodedDuration)
+{
+ return mRemainingTicks + aEncodedDuration - aDurationCopied;
+}
+
+// Try to extend the encodedDuration as long as possible if the target frame
+// has a long duration.
+StreamTime
+VP8TrackEncoder::CalculateEncodedDuration(StreamTime aDurationCopied)
+{
+ StreamTime temp64 = aDurationCopied;
+ StreamTime encodedDuration = mEncodedFrameDuration;
+ temp64 -= mRemainingTicks;
+ while (temp64 > mEncodedFrameDuration) {
+ temp64 -= mEncodedFrameDuration;
+ encodedDuration += mEncodedFrameDuration;
+ }
+ return encodedDuration;
+}
+
+/**
+ * Encoding flow in GetEncodedTrack():
+ * 1: Check the mInitialized state and the packet duration.
+ * 2: Move the data from mRawSegment to mSourceSegment.
+ * 3: Encode the video chunks in mSourceSegment in a for-loop.
+ * 3.1: Pick the video chunk by mRemainingTicks.
+ * 3.2: Calculate the encoding duration for the parameter of vpx_codec_encode().
+ * The encoding duration is a multiple of mEncodedFrameDuration.
+ * 3.3: Setup the video chunk to mVPXImageWrapper by PrepareRawFrame().
+ * 3.4: Send frame into vp8 encoder by vpx_codec_encode().
+ * 3.5: Get the output frame from encoder by calling GetEncodedPartitions().
+ * 3.6: Calculate the mRemainingTicks for next target frame.
+ * 3.7: Set the nextEncodeOperation for the next target frame.
+ * There is a heuristic: If the frame duration we have processed in
+ * mSourceSegment is 100ms, means that we can't spend more than 100ms to
+ * encode it.
+ * 4. Remove the encoded chunks in mSourceSegment after for-loop.
+ *
+ * Ex1: Input frame rate is 100 => input frame duration is 10ms for each.
+ * mEncodedFrameRate is 30 => output frame duration is 33ms.
+ * In this case, the frame duration in mSourceSegment will be:
+ * 1st : 0~10ms
+ * 2nd : 10~20ms
+ * 3rd : 20~30ms
+ * 4th : 30~40ms
+ * ...
+ * The VP8 encoder will take the 1st and 4th frames to encode. At beginning
+ * mRemainingTicks is 0 for 1st frame, then the mRemainingTicks is set
+ * to 23 to pick the 4th frame. (mEncodedFrameDuration - 1st frame duration)
+ *
+ * Ex2: Input frame rate is 25 => frame duration is 40ms for each.
+ * mEncodedFrameRate is 30 => output frame duration is 33ms.
+ * In this case, the frame duration in mSourceSegment will be:
+ * 1st : 0~40ms
+ * 2nd : 40~80ms
+ * 3rd : 80~120ms
+ * 4th : 120~160ms
+ * ...
+ * Because the input frame duration is 40ms larger than 33ms, so the first
+ * encoded frame duration will be 66ms by calling CalculateEncodedDuration.
+ * And the mRemainingTicks will be set to 26
+ * (CalculateRemainingTicks 0+66-40) in order to pick the next frame(2nd)
+ * in mSourceSegment.
+ */
+nsresult
+VP8TrackEncoder::GetEncodedTrack(EncodedFrameContainer& aData)
+{
+ PROFILER_LABEL("VP8TrackEncoder", "GetEncodedTrack",
+ js::ProfileEntry::Category::OTHER);
+ bool EOS;
+ {
+ // Move all the samples from mRawSegment to mSourceSegment. We only hold
+ // the monitor in this block.
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ // Wait if mEncoder is not initialized, or when not enough raw data, but is
+ // not the end of stream nor is being canceled.
+ while (!mCanceled && (!mInitialized ||
+ (mRawSegment.GetDuration() + mSourceSegment.GetDuration() <
+ mEncodedFrameDuration && !mEndOfStream))) {
+ mon.Wait();
+ }
+ if (mCanceled || mEncodingComplete) {
+ return NS_ERROR_FAILURE;
+ }
+ mSourceSegment.AppendFrom(&mRawSegment);
+ EOS = mEndOfStream;
+ }
+
+ VideoSegment::ChunkIterator iter(mSourceSegment);
+ StreamTime durationCopied = 0;
+ StreamTime totalProcessedDuration = 0;
+ TimeStamp timebase = TimeStamp::Now();
+ EncodeOperation nextEncodeOperation = ENCODE_NORMAL_FRAME;
+
+ for (; !iter.IsEnded(); iter.Next()) {
+ VideoChunk &chunk = *iter;
+ // Accumulate chunk's duration to durationCopied until it reaches
+ // mRemainingTicks.
+ durationCopied += chunk.GetDuration();
+ MOZ_ASSERT(mRemainingTicks <= mEncodedFrameDuration);
+ VP8LOG("durationCopied %lld mRemainingTicks %lld\n",
+ durationCopied, mRemainingTicks);
+ if (durationCopied >= mRemainingTicks) {
+ VP8LOG("nextEncodeOperation is %d\n",nextEncodeOperation);
+ // Calculate encodedDuration for this target frame.
+ StreamTime encodedDuration = CalculateEncodedDuration(durationCopied);
+
+ // Encode frame.
+ if (nextEncodeOperation != SKIP_FRAME) {
+ nsresult rv = PrepareRawFrame(chunk);
+ NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
+
+ // Encode the data with VP8 encoder
+ int flags = (nextEncodeOperation == ENCODE_NORMAL_FRAME) ?
+ 0 : VPX_EFLAG_FORCE_KF;
+ if (vpx_codec_encode(mVPXContext, mVPXImageWrapper, mEncodedTimestamp,
+ (unsigned long)encodedDuration, flags,
+ VPX_DL_REALTIME)) {
+ return NS_ERROR_FAILURE;
+ }
+ // Get the encoded data from VP8 encoder.
+ GetEncodedPartitions(aData);
+ } else {
+ // SKIP_FRAME
+ // Extend the duration of the last encoded data in aData
+ // because this frame will be skip.
+ RefPtr<EncodedFrame> last = aData.GetEncodedFrames().LastElement();
+ if (last) {
+ CheckedInt64 skippedDuration = FramesToUsecs(chunk.mDuration, mTrackRate);
+ if (skippedDuration.isValid() && skippedDuration.value() > 0) {
+ last->SetDuration(last->GetDuration() +
+ (static_cast<uint64_t>(skippedDuration.value())));
+ }
+ }
+ }
+ // Move forward the mEncodedTimestamp.
+ mEncodedTimestamp += encodedDuration;
+ totalProcessedDuration += durationCopied;
+ // Calculate mRemainingTicks for next target frame.
+ mRemainingTicks = CalculateRemainingTicks(durationCopied,
+ encodedDuration);
+
+ // Check the remain data is enough for next target frame.
+ if (mSourceSegment.GetDuration() - totalProcessedDuration
+ >= mEncodedFrameDuration) {
+ TimeDuration elapsedTime = TimeStamp::Now() - timebase;
+ nextEncodeOperation = GetNextEncodeOperation(elapsedTime,
+ totalProcessedDuration);
+ // Reset durationCopied for next iteration.
+ durationCopied = 0;
+ } else {
+ // Process done, there is no enough data left for next iteration,
+ // break the for-loop.
+ break;
+ }
+ }
+ }
+ // Remove the chunks we have processed.
+ mSourceSegment.RemoveLeading(totalProcessedDuration);
+ VP8LOG("RemoveLeading %lld\n",totalProcessedDuration);
+
+ // End of stream, pull the rest frames in encoder.
+ if (EOS) {
+ VP8LOG("mEndOfStream is true\n");
+ mEncodingComplete = true;
+ // Bug 1243611, keep calling vpx_codec_encode and vpx_codec_get_cx_data
+ // until vpx_codec_get_cx_data return null.
+
+ do {
+ if (vpx_codec_encode(mVPXContext, nullptr, mEncodedTimestamp,
+ mEncodedFrameDuration, 0, VPX_DL_REALTIME)) {
+ return NS_ERROR_FAILURE;
+ }
+ } while(GetEncodedPartitions(aData));
+ }
+
+ return NS_OK ;
+}
+
+} // namespace mozilla
diff --git a/dom/media/encoder/VP8TrackEncoder.h b/dom/media/encoder/VP8TrackEncoder.h
new file mode 100644
index 000000000..5a046ee5d
--- /dev/null
+++ b/dom/media/encoder/VP8TrackEncoder.h
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VP8TrackEncoder_h_
+#define VP8TrackEncoder_h_
+
+#include "TrackEncoder.h"
+#include "vpx/vpx_codec.h"
+
+namespace mozilla {
+
+typedef struct vpx_codec_ctx vpx_codec_ctx_t;
+typedef struct vpx_codec_enc_cfg vpx_codec_enc_cfg_t;
+typedef struct vpx_image vpx_image_t;
+
+/**
+ * VP8TrackEncoder implements VideoTrackEncoder by using libvpx library.
+ * We implement a realtime and fixed FPS encoder. In order to achieve that,
+ * there is a pick target frame and drop frame encoding policy implemented in
+ * GetEncodedTrack.
+ */
+class VP8TrackEncoder : public VideoTrackEncoder
+{
+ enum EncodeOperation {
+ ENCODE_NORMAL_FRAME, // VP8 track encoder works normally.
+ ENCODE_I_FRAME, // The next frame will be encoded as I-Frame.
+ SKIP_FRAME, // Skip the next frame.
+ };
+public:
+ explicit VP8TrackEncoder(TrackRate aTrackRate);
+ virtual ~VP8TrackEncoder();
+
+ already_AddRefed<TrackMetadataBase> GetMetadata() final override;
+
+ nsresult GetEncodedTrack(EncodedFrameContainer& aData) final override;
+
+ void ReplyGetSourceSurface(already_AddRefed<gfx::SourceSurface> aSurf);
+protected:
+ nsresult Init(int32_t aWidth, int32_t aHeight,
+ int32_t aDisplayWidth, int32_t aDisplayHeight) final override;
+
+private:
+ // Calculate the target frame's encoded duration.
+ StreamTime CalculateEncodedDuration(StreamTime aDurationCopied);
+
+ // Calculate the mRemainingTicks for next target frame.
+ StreamTime CalculateRemainingTicks(StreamTime aDurationCopied,
+ StreamTime aEncodedDuration);
+
+ // Get the EncodeOperation for next target frame.
+ EncodeOperation GetNextEncodeOperation(TimeDuration aTimeElapsed,
+ StreamTime aProcessedDuration);
+
+ // Get the encoded data from encoder to aData.
+ // Return value: false if the vpx_codec_get_cx_data returns null
+ // for EOS detection.
+ bool GetEncodedPartitions(EncodedFrameContainer& aData);
+
+ // Prepare the input data to the mVPXImageWrapper for encoding.
+ nsresult PrepareRawFrame(VideoChunk &aChunk);
+
+ already_AddRefed<gfx::SourceSurface> GetSourceSurface(already_AddRefed<layers::Image> aImg);
+
+ // Output frame rate.
+ uint32_t mEncodedFrameRate;
+ // Duration for the output frame, reciprocal to mEncodedFrameRate.
+ StreamTime mEncodedFrameDuration;
+ // Encoded timestamp.
+ StreamTime mEncodedTimestamp;
+ // Duration to the next encode frame.
+ StreamTime mRemainingTicks;
+
+ // Muted frame, we only create it once.
+ RefPtr<layers::Image> mMuteFrame;
+
+ // I420 frame, for converting to I420.
+ nsTArray<uint8_t> mI420Frame;
+
+ /**
+ * A local segment queue which takes the raw data out from mRawSegment in the
+ * call of GetEncodedTrack(). Since we implement the fixed FPS encoding
+ * policy, it needs to be global in order to store the leftover segments
+ * taken from mRawSegment.
+ */
+ VideoSegment mSourceSegment;
+
+ // VP8 relative members.
+ // Codec context structure.
+ nsAutoPtr<vpx_codec_ctx_t> mVPXContext;
+ // Image Descriptor.
+ nsAutoPtr<vpx_image_t> mVPXImageWrapper;
+ RefPtr<gfx::SourceSurface> mSourceSurface;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/encoder/fmp4_muxer/AMRBox.cpp b/dom/media/encoder/fmp4_muxer/AMRBox.cpp
new file mode 100644
index 000000000..cd1a34fae
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/AMRBox.cpp
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ISOControl.h"
+#include "ISOMediaBoxes.h"
+#include "AMRBox.h"
+#include "ISOTrackMetadata.h"
+
+namespace mozilla {
+
+nsresult
+AMRSampleEntry::Generate(uint32_t* aBoxSize)
+{
+ uint32_t box_size;
+ nsresult rv = amr_special_box->Generate(&box_size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ size += box_size;
+
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+AMRSampleEntry::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ nsresult rv;
+ rv = AudioSampleEntry::Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = amr_special_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+AMRSampleEntry::AMRSampleEntry(ISOControl* aControl)
+ : AudioSampleEntry(NS_LITERAL_CSTRING("samr"), aControl)
+{
+ amr_special_box = new AMRSpecificBox(aControl);
+ MOZ_COUNT_CTOR(AMRSampleEntry);
+}
+
+AMRSampleEntry::~AMRSampleEntry()
+{
+ MOZ_COUNT_DTOR(AMRSampleEntry);
+}
+
+nsresult
+AMRSpecificBox::Generate(uint32_t* aBoxSize)
+{
+ nsresult rv;
+ FragmentBuffer* frag = mControl->GetFragment(Audio_Track);
+ rv = frag->GetCSD(amrDecSpecInfo);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ size += amrDecSpecInfo.Length();
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+AMRSpecificBox::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ Box::Write();
+ mControl->Write(amrDecSpecInfo.Elements(), amrDecSpecInfo.Length());
+ return NS_OK;
+}
+
+AMRSpecificBox::AMRSpecificBox(ISOControl* aControl)
+ : Box(NS_LITERAL_CSTRING("damr"), aControl)
+{
+ MOZ_COUNT_CTOR(AMRSpecificBox);
+}
+
+AMRSpecificBox::~AMRSpecificBox()
+{
+ MOZ_COUNT_DTOR(AMRSpecificBox);
+}
+
+}
diff --git a/dom/media/encoder/fmp4_muxer/AMRBox.h b/dom/media/encoder/fmp4_muxer/AMRBox.h
new file mode 100644
index 000000000..645d7f89c
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/AMRBox.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AMRBOX_h_
+#define AMRBOX_h_
+
+#include "nsTArray.h"
+#include "MuxerOperation.h"
+
+namespace mozilla {
+
+class ISOControl;
+
+// 3GPP TS 26.244 6.7 'AMRSpecificBox field for AMRSampleEntry box'
+// Box type: 'damr'
+class AMRSpecificBox : public Box {
+public:
+ // 3GPP members
+ nsTArray<uint8_t> amrDecSpecInfo;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // AMRSpecificBox methods
+ AMRSpecificBox(ISOControl* aControl);
+ ~AMRSpecificBox();
+};
+
+// 3GPP TS 26.244 6.5 'AMRSampleEntry box'
+// Box type: 'sawb'
+class AMRSampleEntry : public AudioSampleEntry {
+public:
+ // 3GPP members
+ RefPtr<AMRSpecificBox> amr_special_box;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // AMRSampleEntry methods
+ AMRSampleEntry(ISOControl* aControl);
+ ~AMRSampleEntry();
+};
+
+}
+
+#endif // AMRBOX_h_
diff --git a/dom/media/encoder/fmp4_muxer/AVCBox.cpp b/dom/media/encoder/fmp4_muxer/AVCBox.cpp
new file mode 100644
index 000000000..a45cda8b7
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/AVCBox.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <climits>
+#include "ISOControl.h"
+#include "ISOMediaBoxes.h"
+#include "AVCBox.h"
+
+namespace mozilla {
+
+nsresult
+AVCSampleEntry::Generate(uint32_t* aBoxSize)
+{
+ uint32_t avc_box_size = 0;
+ nsresult rv;
+ rv = avcConfigBox->Generate(&avc_box_size);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ size += avc_box_size;
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+AVCSampleEntry::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ nsresult rv;
+ rv = VisualSampleEntry::Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = avcConfigBox->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+AVCSampleEntry::AVCSampleEntry(ISOControl* aControl)
+ : VisualSampleEntry(NS_LITERAL_CSTRING("avc1"), aControl)
+{
+ avcConfigBox = new AVCConfigurationBox(aControl);
+ MOZ_COUNT_CTOR(AVCSampleEntry);
+}
+
+AVCSampleEntry::~AVCSampleEntry()
+{
+ MOZ_COUNT_DTOR(AVCSampleEntry);
+}
+
+AVCConfigurationBox::AVCConfigurationBox(ISOControl* aControl)
+ : Box(NS_LITERAL_CSTRING("avcC"), aControl)
+{
+ MOZ_COUNT_CTOR(AVCConfigurationBox);
+}
+
+AVCConfigurationBox::~AVCConfigurationBox()
+{
+ MOZ_COUNT_DTOR(AVCConfigurationBox);
+}
+
+nsresult
+AVCConfigurationBox::Generate(uint32_t* aBoxSize)
+{
+ nsresult rv;
+ FragmentBuffer* frag = mControl->GetFragment(Video_Track);
+ rv = frag->GetCSD(avcConfig);
+ NS_ENSURE_SUCCESS(rv, rv);
+ size += avcConfig.Length();
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+AVCConfigurationBox::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ Box::Write();
+
+ mControl->Write(avcConfig.Elements(), avcConfig.Length());
+
+ return NS_OK;
+}
+
+}
diff --git a/dom/media/encoder/fmp4_muxer/AVCBox.h b/dom/media/encoder/fmp4_muxer/AVCBox.h
new file mode 100644
index 000000000..9640d9e8f
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/AVCBox.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AVCBox_h_
+#define AVCBox_h_
+
+#include "nsTArray.h"
+#include "ISOMediaBoxes.h"
+
+namespace mozilla {
+
+class ISOControl;
+
+// 14496-12 8.5.2.2
+#define resolution_72_dpi 0x00480000
+#define video_depth 0x0018
+
+// 14496-15 5.3.4.1 'Sample description name and format'
+// Box type: 'avcC'
+class AVCConfigurationBox : public Box {
+public:
+ // ISO BMFF members
+
+ // avcConfig is CodecSpecificData from 14496-15 '5.3.4.1 Sample description
+ // name and format.
+ // These data are generated by encoder and we encapsulated the generated
+ // bitstream into box directly.
+ nsTArray<uint8_t> avcConfig;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // AVCConfigurationBox methods
+ AVCConfigurationBox(ISOControl* aControl);
+ ~AVCConfigurationBox();
+};
+
+// 14496-15 5.3.4.1 'Sample description name and format'
+// Box type: 'avc1'
+class AVCSampleEntry : public VisualSampleEntry {
+public:
+ // ISO BMFF members
+ RefPtr<AVCConfigurationBox> avcConfigBox;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // VisualSampleEntry methods
+ AVCSampleEntry(ISOControl* aControl);
+ ~AVCSampleEntry();
+};
+
+}
+
+#endif // AVCBox_h_
diff --git a/dom/media/encoder/fmp4_muxer/EVRCBox.cpp b/dom/media/encoder/fmp4_muxer/EVRCBox.cpp
new file mode 100644
index 000000000..096e4013d
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/EVRCBox.cpp
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ISOControl.h"
+#include "ISOMediaBoxes.h"
+#include "EVRCBox.h"
+#include "ISOTrackMetadata.h"
+
+namespace mozilla {
+
+nsresult
+EVRCSampleEntry::Generate(uint32_t* aBoxSize)
+{
+ uint32_t box_size;
+ nsresult rv = evrc_special_box->Generate(&box_size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ size += box_size;
+
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+EVRCSampleEntry::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ nsresult rv;
+ rv = AudioSampleEntry::Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = evrc_special_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+EVRCSampleEntry::EVRCSampleEntry(ISOControl* aControl)
+ : AudioSampleEntry(NS_LITERAL_CSTRING("sevc"), aControl)
+{
+ evrc_special_box = new EVRCSpecificBox(aControl);
+ MOZ_COUNT_CTOR(EVRCSampleEntry);
+}
+
+EVRCSampleEntry::~EVRCSampleEntry()
+{
+ MOZ_COUNT_DTOR(EVRCSampleEntry);
+}
+
+nsresult
+EVRCSpecificBox::Generate(uint32_t* aBoxSize)
+{
+ nsresult rv;
+ FragmentBuffer* frag = mControl->GetFragment(Audio_Track);
+ rv = frag->GetCSD(evrcDecSpecInfo);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ size += evrcDecSpecInfo.Length();
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+EVRCSpecificBox::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ Box::Write();
+ mControl->Write(evrcDecSpecInfo.Elements(), evrcDecSpecInfo.Length());
+ return NS_OK;
+}
+
+EVRCSpecificBox::EVRCSpecificBox(ISOControl* aControl)
+ : Box(NS_LITERAL_CSTRING("devc"), aControl)
+{
+ MOZ_COUNT_CTOR(EVRCSpecificBox);
+}
+
+EVRCSpecificBox::~EVRCSpecificBox()
+{
+ MOZ_COUNT_DTOR(EVRCSpecificBox);
+}
+
+}
diff --git a/dom/media/encoder/fmp4_muxer/EVRCBox.h b/dom/media/encoder/fmp4_muxer/EVRCBox.h
new file mode 100644
index 000000000..31355849a
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/EVRCBox.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EVRCBOX_h_
+#define EVRCBOX_h_
+
+#include "nsTArray.h"
+#include "MuxerOperation.h"
+
+namespace mozilla {
+
+class ISOControl;
+
+// 3GPP TS 26.244 6.7 'EVRCSpecificBox field for EVRCSampleEntry box'
+// Box type: 'devc'
+class EVRCSpecificBox : public Box {
+public:
+ // 3GPP members
+ nsTArray<uint8_t> evrcDecSpecInfo;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // EVRCSpecificBox methods
+ EVRCSpecificBox(ISOControl* aControl);
+ ~EVRCSpecificBox();
+};
+
+// 3GPP TS 26.244 6.5 'EVRCSampleEntry box'
+// Box type: 'sevc'
+class EVRCSampleEntry : public AudioSampleEntry {
+public:
+ // 3GPP members
+ RefPtr<EVRCSpecificBox> evrc_special_box;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // EVRCSampleEntry methods
+ EVRCSampleEntry(ISOControl* aControl);
+ ~EVRCSampleEntry();
+};
+
+}
+
+#endif // EVRCBOX_h_
diff --git a/dom/media/encoder/fmp4_muxer/ISOControl.cpp b/dom/media/encoder/fmp4_muxer/ISOControl.cpp
new file mode 100644
index 000000000..6addaeb30
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOControl.cpp
@@ -0,0 +1,415 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <time.h>
+#include "nsAutoPtr.h"
+#include "ISOControl.h"
+#include "ISOMediaBoxes.h"
+#include "EncodedFrameContainer.h"
+
+namespace mozilla {
+
+// For MP4 creation_time and modification_time offset from January 1, 1904 to
+// January 1, 1970.
+#define iso_time_offset 2082844800
+
+FragmentBuffer::FragmentBuffer(uint32_t aTrackType, uint32_t aFragDuration)
+ : mTrackType(aTrackType)
+ , mFragDuration(aFragDuration)
+ , mMediaStartTime(0)
+ , mFragmentNumber(0)
+ , mLastFrameTimeOfLastFragment(0)
+ , mEOS(false)
+{
+ mFragArray.AppendElement();
+ MOZ_COUNT_CTOR(FragmentBuffer);
+}
+
+FragmentBuffer::~FragmentBuffer()
+{
+ MOZ_COUNT_DTOR(FragmentBuffer);
+}
+
+bool
+FragmentBuffer::HasEnoughData()
+{
+ // Audio or video frame is enough to form a moof.
+ return (mFragArray.Length() > 1);
+}
+
+nsresult
+FragmentBuffer::GetCSD(nsTArray<uint8_t>& aCSD)
+{
+ if (!mCSDFrame) {
+ return NS_ERROR_FAILURE;
+ }
+ aCSD.AppendElements(mCSDFrame->GetFrameData().Elements(),
+ mCSDFrame->GetFrameData().Length());
+
+ return NS_OK;
+}
+
+nsresult
+FragmentBuffer::AddFrame(EncodedFrame* aFrame)
+{
+ // already EOS, it rejects all new data.
+ if (mEOS) {
+ MOZ_ASSERT(0);
+ return NS_OK;
+ }
+
+ EncodedFrame::FrameType type = aFrame->GetFrameType();
+ if (type == EncodedFrame::AAC_CSD || type == EncodedFrame::AVC_CSD ||
+ type == EncodedFrame::AMR_AUDIO_CSD || type == EncodedFrame::EVRC_AUDIO_CSD) {
+ mCSDFrame = aFrame;
+ // Use CSD's timestamp as the start time. Encoder should send CSD frame first
+ // and then data frames.
+ mMediaStartTime = aFrame->GetTimeStamp();
+ mFragmentNumber = 1;
+ return NS_OK;
+ }
+
+ // if the timestamp is incorrect, abort it.
+ if (aFrame->GetTimeStamp() < mMediaStartTime) {
+ MOZ_ASSERT(false);
+ return NS_ERROR_FAILURE;
+ }
+
+ mFragArray.LastElement().AppendElement(aFrame);
+
+ // check if current fragment is reach the fragment duration.
+ if ((aFrame->GetTimeStamp() - mMediaStartTime) >= (mFragDuration * mFragmentNumber)) {
+ mFragArray.AppendElement();
+ mFragmentNumber++;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+FragmentBuffer::GetFirstFragment(nsTArray<RefPtr<EncodedFrame>>& aFragment,
+ bool aFlush)
+{
+ // It should be called only if there is a complete fragment in mFragArray.
+ if (mFragArray.Length() <= 1 && !mEOS) {
+ MOZ_ASSERT(false);
+ return NS_ERROR_FAILURE;
+ }
+
+ if (aFlush) {
+ aFragment.SwapElements(mFragArray.ElementAt(0));
+ mFragArray.RemoveElementAt(0);
+ } else {
+ aFragment.AppendElements(mFragArray.ElementAt(0));
+ }
+ return NS_OK;
+}
+
+uint32_t
+FragmentBuffer::GetFirstFragmentSampleNumber()
+{
+ return mFragArray.ElementAt(0).Length();
+}
+
+uint32_t
+FragmentBuffer::GetFirstFragmentSampleSize()
+{
+ uint32_t size = 0;
+ uint32_t len = mFragArray.ElementAt(0).Length();
+ for (uint32_t i = 0; i < len; i++) {
+ size += mFragArray.ElementAt(0).ElementAt(i)->GetFrameData().Length();
+ }
+ return size;
+}
+
+ISOControl::ISOControl(uint32_t aMuxingType)
+ : mMuxingType(aMuxingType)
+ , mAudioFragmentBuffer(nullptr)
+ , mVideoFragmentBuffer(nullptr)
+ , mFragNum(0)
+ , mOutputSize(0)
+ , mBitCount(0)
+ , mBit(0)
+{
+ // Create a data array for first mp4 Box, ftyp.
+ mOutBuffers.SetLength(1);
+ MOZ_COUNT_CTOR(ISOControl);
+}
+
+ISOControl::~ISOControl()
+{
+ MOZ_COUNT_DTOR(ISOControl);
+}
+
+uint32_t
+ISOControl::GetNextTrackID()
+{
+ return (mMetaArray.Length() + 1);
+}
+
+uint32_t
+ISOControl::GetTrackID(TrackMetadataBase::MetadataKind aKind)
+{
+ for (uint32_t i = 0; i < mMetaArray.Length(); i++) {
+ if (mMetaArray[i]->GetKind() == aKind) {
+ return (i + 1);
+ }
+ }
+
+ // Track ID shouldn't be 0. It must be something wrong here.
+ MOZ_ASSERT(0);
+ return 0;
+}
+
+nsresult
+ISOControl::SetMetadata(TrackMetadataBase* aTrackMeta)
+{
+ if (aTrackMeta->GetKind() == TrackMetadataBase::METADATA_AAC ||
+ aTrackMeta->GetKind() == TrackMetadataBase::METADATA_AMR ||
+ aTrackMeta->GetKind() == TrackMetadataBase::METADATA_AVC ||
+ aTrackMeta->GetKind() == TrackMetadataBase::METADATA_EVRC) {
+ mMetaArray.AppendElement(aTrackMeta);
+ return NS_OK;
+ }
+ return NS_ERROR_FAILURE;
+}
+
+nsresult
+ISOControl::GetAudioMetadata(RefPtr<AudioTrackMetadata>& aAudMeta)
+{
+ for (uint32_t i = 0; i < mMetaArray.Length() ; i++) {
+ if (mMetaArray[i]->GetKind() == TrackMetadataBase::METADATA_AAC ||
+ mMetaArray[i]->GetKind() == TrackMetadataBase::METADATA_AMR ||
+ mMetaArray[i]->GetKind() == TrackMetadataBase::METADATA_EVRC) {
+ aAudMeta = static_cast<AudioTrackMetadata*>(mMetaArray[i].get());
+ return NS_OK;
+ }
+ }
+ return NS_ERROR_FAILURE;
+}
+
+nsresult
+ISOControl::GetVideoMetadata(RefPtr<VideoTrackMetadata>& aVidMeta)
+{
+ for (uint32_t i = 0; i < mMetaArray.Length() ; i++) {
+ if (mMetaArray[i]->GetKind() == TrackMetadataBase::METADATA_AVC) {
+ aVidMeta = static_cast<VideoTrackMetadata*>(mMetaArray[i].get());
+ return NS_OK;
+ }
+ }
+ return NS_ERROR_FAILURE;
+}
+
+bool
+ISOControl::HasAudioTrack()
+{
+ RefPtr<AudioTrackMetadata> audMeta;
+ GetAudioMetadata(audMeta);
+ return audMeta;
+}
+
+bool
+ISOControl::HasVideoTrack()
+{
+ RefPtr<VideoTrackMetadata> vidMeta;
+ GetVideoMetadata(vidMeta);
+ return vidMeta;
+}
+
+nsresult
+ISOControl::SetFragment(FragmentBuffer* aFragment)
+{
+ if (aFragment->GetType() == Audio_Track) {
+ mAudioFragmentBuffer = aFragment;
+ } else {
+ mVideoFragmentBuffer = aFragment;
+ }
+ return NS_OK;
+}
+
+FragmentBuffer*
+ISOControl::GetFragment(uint32_t aType)
+{
+ if (aType == Audio_Track) {
+ return mAudioFragmentBuffer;
+ } else if (aType == Video_Track){
+ return mVideoFragmentBuffer;
+ }
+ MOZ_ASSERT(0);
+ return nullptr;
+}
+
+nsresult
+ISOControl::GetBufs(nsTArray<nsTArray<uint8_t>>* aOutputBufs)
+{
+ uint32_t len = mOutBuffers.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ mOutBuffers[i].SwapElements(*aOutputBufs->AppendElement());
+ }
+ return FlushBuf();
+}
+
+nsresult
+ISOControl::FlushBuf()
+{
+ mOutBuffers.SetLength(1);
+ return NS_OK;
+}
+
+uint32_t
+ISOControl::WriteAVData(nsTArray<uint8_t>& aArray)
+{
+ MOZ_ASSERT(!mBitCount);
+
+ uint32_t len = aArray.Length();
+ if (!len) {
+ return 0;
+ }
+
+ mOutputSize += len;
+
+ // The last element already has data, allocated a new element for pointer
+ // swapping.
+ if (mOutBuffers.LastElement().Length()) {
+ mOutBuffers.AppendElement();
+ }
+ // Swap the video/audio data pointer.
+ mOutBuffers.LastElement().SwapElements(aArray);
+ // Following data could be boxes, so appending a new uint8_t array here.
+ mOutBuffers.AppendElement();
+
+ return len;
+}
+
+uint32_t
+ISOControl::WriteBits(uint64_t aBits, size_t aNumBits)
+{
+ uint8_t output_byte = 0;
+
+ MOZ_ASSERT(aNumBits <= 64);
+ // TODO: rewritten following with bitset?
+ for (size_t i = aNumBits; i > 0; i--) {
+ mBit |= (((aBits >> (i - 1)) & 1) << (8 - ++mBitCount));
+ if (mBitCount == 8) {
+ Write(&mBit, sizeof(uint8_t));
+ mBit = 0;
+ mBitCount = 0;
+ output_byte++;
+ }
+ }
+ return output_byte;
+}
+
+uint32_t
+ISOControl::Write(uint8_t* aBuf, uint32_t aSize)
+{
+ mOutBuffers.LastElement().AppendElements(aBuf, aSize);
+ mOutputSize += aSize;
+ return aSize;
+}
+
+uint32_t
+ISOControl::Write(uint8_t aData)
+{
+ MOZ_ASSERT(!mBitCount);
+ Write((uint8_t*)&aData, sizeof(uint8_t));
+ return sizeof(uint8_t);
+}
+
+uint32_t
+ISOControl::GetBufPos()
+{
+ uint32_t len = mOutBuffers.Length();
+ uint32_t pos = 0;
+ for (uint32_t i = 0; i < len; i++) {
+ pos += mOutBuffers.ElementAt(i).Length();
+ }
+ return pos;
+}
+
+uint32_t
+ISOControl::WriteFourCC(const char* aType)
+{
+ // Bit operation should be aligned to byte before writing any byte data.
+ MOZ_ASSERT(!mBitCount);
+
+ uint32_t size = strlen(aType);
+ if (size == 4) {
+ return Write((uint8_t*)aType, size);
+ }
+
+ return 0;
+}
+
+nsresult
+ISOControl::GenerateFtyp()
+{
+ nsresult rv;
+ uint32_t size;
+ nsAutoPtr<FileTypeBox> type_box(new FileTypeBox(this));
+ rv = type_box->Generate(&size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = type_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ return NS_OK;
+}
+
+nsresult
+ISOControl::GenerateMoov()
+{
+ nsresult rv;
+ uint32_t size;
+ nsAutoPtr<MovieBox> moov_box(new MovieBox(this));
+ rv = moov_box->Generate(&size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = moov_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ return NS_OK;
+}
+
+nsresult
+ISOControl::GenerateMoof(uint32_t aTrackType)
+{
+ mFragNum++;
+
+ nsresult rv;
+ uint32_t size;
+ uint64_t first_sample_offset = mOutputSize;
+ nsAutoPtr<MovieFragmentBox> moof_box(new MovieFragmentBox(aTrackType, this));
+ nsAutoPtr<MediaDataBox> mdat_box(new MediaDataBox(aTrackType, this));
+
+ rv = moof_box->Generate(&size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ first_sample_offset += size;
+ rv = mdat_box->Generate(&size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ first_sample_offset += mdat_box->FirstSampleOffsetInMediaDataBox();
+
+ // correct offset info
+ nsTArray<RefPtr<MuxerOperation>> tfhds;
+ rv = moof_box->Find(NS_LITERAL_CSTRING("tfhd"), tfhds);
+ NS_ENSURE_SUCCESS(rv, rv);
+ uint32_t len = tfhds.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ TrackFragmentHeaderBox* tfhd = (TrackFragmentHeaderBox*) tfhds.ElementAt(i).get();
+ rv = tfhd->UpdateBaseDataOffset(first_sample_offset);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ rv = moof_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = mdat_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+uint32_t
+ISOControl::GetTime()
+{
+ return (uint64_t)time(nullptr) + iso_time_offset;
+}
+
+}
diff --git a/dom/media/encoder/fmp4_muxer/ISOControl.h b/dom/media/encoder/fmp4_muxer/ISOControl.h
new file mode 100644
index 000000000..3c445caee
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOControl.h
@@ -0,0 +1,250 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ISOCOMPOSITOR_H_
+#define ISOCOMPOSITOR_H_
+
+#include "mozilla/EndianUtils.h"
+#include "nsTArray.h"
+#include "ISOTrackMetadata.h"
+#include "EncodedFrameContainer.h"
+
+namespace mozilla {
+
+class Box;
+class ISOControl;
+
+/**
+ * This class collects elementary stream data to form a fragment.
+ * ISOMediaWriter will check if the data is enough; if yes, the corresponding
+ * moof will be created and write to ISOControl.
+ * Each audio and video has its own fragment and only one during the whole
+ * life cycle, when a fragment is formed in ISOControl, Flush() needs to
+ * be called to reset it.
+ */
+class FragmentBuffer {
+public:
+ // aTrackType: it could be Audio_Track or Video_Track.
+ // aFragDuration: it is the fragment duration. (microsecond per unit)
+ // Audio and video have the same fragment duration.
+ FragmentBuffer(uint32_t aTrackType, uint32_t aFragDuration);
+ ~FragmentBuffer();
+
+ // Get samples of first fragment, that will swap all the elements in the
+ // mFragArray[0] when aFlush = true, and caller is responsible for drop
+ // EncodedFrame reference count.
+ nsresult GetFirstFragment(nsTArray<RefPtr<EncodedFrame>>& aFragment,
+ bool aFlush = false);
+
+ // Add sample frame to the last element fragment of mFragArray. If sample
+ // number is enough, it will append a new fragment element. And the new
+ // sample will be added to the new fragment element of mFragArray.
+ nsresult AddFrame(EncodedFrame* aFrame);
+
+ // Get total sample size of first complete fragment size.
+ uint32_t GetFirstFragmentSampleSize();
+
+ // Get sample number of first complete fragment.
+ uint32_t GetFirstFragmentSampleNumber();
+
+ // Check if it accumulates enough frame data.
+ // It returns true when data is enough to form a fragment.
+ bool HasEnoughData();
+
+ // Called by ISOMediaWriter when TrackEncoder has sent the last frame. The
+ // remains frame data will form the last moof and move the state machine to
+ // in ISOMediaWriter to last phrase.
+ nsresult SetEndOfStream() {
+ mEOS = true;
+ return NS_OK;
+ }
+ bool EOS() { return mEOS; }
+
+ // CSD (codec specific data), it is generated by encoder and the data depends
+ // on codec type. This data will be sent as a special frame from encoder to
+ // ISOMediaWriter and pass to this class via AddFrame().
+ nsresult GetCSD(nsTArray<uint8_t>& aCSD);
+
+ bool HasCSD() { return mCSDFrame; }
+
+ uint32_t GetType() { return mTrackType; }
+
+ void SetLastFragmentLastFrameTime(uint32_t aTime) {
+ mLastFrameTimeOfLastFragment = aTime;
+ }
+
+ uint32_t GetLastFragmentLastFrameTime() {
+ return mLastFrameTimeOfLastFragment;
+ }
+
+private:
+ uint32_t mTrackType;
+
+ // Fragment duration, microsecond per unit.
+ uint32_t mFragDuration;
+
+ // Media start time, microsecond per unit.
+ // Together with mFragDuration, mFragmentNumber and EncodedFrame->GetTimeStamp(),
+ // when the difference between current frame time and mMediaStartTime is
+ // exceeded current fragment ceiling timeframe, that means current fragment has
+ // enough data and a new element in mFragArray will be added.
+ uint64_t mMediaStartTime;
+
+ // Current fragment number. It will be increase when a new element of
+ // mFragArray is created.
+ // Note:
+ // It only means the fragment number of current accumulated frames, not
+ // the current 'creating' fragment mFragNum in ISOControl.
+ uint32_t mFragmentNumber;
+
+ // The last frame time stamp of last fragment. It is for calculating the
+ // play duration of first frame in current fragment. The frame duration is
+ // defined as "current frame timestamp - last frame timestamp" here. So it
+ // needs to keep the last timestamp of last fragment.
+ uint32_t mLastFrameTimeOfLastFragment;
+
+ // Array of fragments, each element has enough samples to form a
+ // complete fragment.
+ nsTArray<nsTArray<RefPtr<EncodedFrame>>> mFragArray;
+
+ // Codec specific data frame, it will be generated by encoder and send to
+ // ISOMediaWriter through WriteEncodedTrack(). The data will be vary depends
+ // on codec type.
+ RefPtr<EncodedFrame> mCSDFrame;
+
+ // END_OF_STREAM from ContainerWriter
+ bool mEOS;
+};
+
+/**
+ * ISOControl will be carried to each box when box is created. It is the main
+ * bridge for box to output stream to ContainerWriter and retrieve information.
+ * ISOControl acts 3 different roles:
+ * 1. Holds the pointer of audio metadata, video metadata, fragment and
+ * pass them to boxes.
+ * 2. Provide the functions to generate the base structure of MP4; they are
+ * GenerateFtyp, GenerateMoov, GenerateMoof, and GenerateMfra.
+ * 3. The actually writer used by MuxOperation::Write() in each box. It provides
+ * writing methods for different kind of data; they are Write, WriteArray,
+ * WriteBits...etc.
+ */
+class ISOControl {
+
+friend class Box;
+
+public:
+ ISOControl(uint32_t aMuxingType);
+ ~ISOControl();
+
+ nsresult GenerateFtyp();
+ nsresult GenerateMoov();
+ nsresult GenerateMoof(uint32_t aTrackType);
+
+ // Swap elementary stream pointer to output buffers.
+ uint32_t WriteAVData(nsTArray<uint8_t>& aArray);
+
+ uint32_t Write(uint8_t* aBuf, uint32_t aSize);
+
+ uint32_t Write(uint8_t aData);
+
+ template <typename T>
+ uint32_t Write(T aData) {
+ MOZ_ASSERT(!mBitCount);
+
+ aData = NativeEndian::swapToNetworkOrder(aData);
+ Write((uint8_t*)&aData, sizeof(T));
+ return sizeof(T);
+ }
+
+ template <typename T>
+ uint32_t WriteArray(const T &aArray, uint32_t aSize) {
+ MOZ_ASSERT(!mBitCount);
+
+ uint32_t size = 0;
+ for (uint32_t i = 0; i < aSize; i++) {
+ size += Write(aArray[i]);
+ }
+ return size;
+ }
+
+ uint32_t WriteFourCC(const char* aType);
+
+ // Bit writing. Note: it needs to be byte-boundary before using
+ // others non-bit writing function.
+ uint32_t WriteBits(uint64_t aBits, size_t aNumBits);
+
+ // This is called by GetContainerData and swap all the buffers to aOutputBuffers.
+ nsresult GetBufs(nsTArray<nsTArray<uint8_t>>* aOutputBufs);
+
+ // Presentation time in seconds since midnight, Jan. 1, 1904, in UTC time.
+ uint32_t GetTime();
+
+ // current fragment number
+ uint32_t GetCurFragmentNumber() { return mFragNum; }
+
+ nsresult SetFragment(FragmentBuffer* aFragment);
+ FragmentBuffer* GetFragment(uint32_t aType);
+
+ uint32_t GetMuxingType() { return mMuxingType; }
+
+ nsresult SetMetadata(TrackMetadataBase* aTrackMeta);
+ nsresult GetAudioMetadata(RefPtr<AudioTrackMetadata>& aAudMeta);
+ nsresult GetVideoMetadata(RefPtr<VideoTrackMetadata>& aVidMeta);
+
+ // Track ID is the Metadata index in mMetaArray. It allows only 1 audio
+ // track and 1 video track in this muxer. In this muxer, it is prohibt to have
+ // mutiple audio track or video track in the same file.
+ uint32_t GetTrackID(TrackMetadataBase::MetadataKind aKind);
+ uint32_t GetNextTrackID();
+
+ bool HasAudioTrack();
+ bool HasVideoTrack();
+
+private:
+ uint32_t GetBufPos();
+ nsresult FlushBuf();
+
+ // One of value in TYPE_XXX, defined in ISOMediaWriter.
+ uint32_t mMuxingType;
+
+ // Audio and video fragments are owned by ISOMediaWriter.
+ // They don't need to worry about pointer going stale because ISOMediaWriter's
+ // lifetime is longer than ISOControl.
+ FragmentBuffer* mAudioFragmentBuffer;
+ FragmentBuffer* mVideoFragmentBuffer;
+
+ // Generated fragment number
+ uint32_t mFragNum;
+
+ // The (index + 1) will be the track ID.
+ nsTArray<RefPtr<TrackMetadataBase>> mMetaArray;
+
+ // Array of output buffers.
+ // To save memory usage, audio/video sample will be swapped into a new element
+ // of this array.
+ //
+ // For example,
+ // mOutBuffers[0] --> boxes (allocated by muxer)
+ // mOutBuffers[1] --> video raw data (allocated by encoder)
+ // mOutBuffers[2] --> video raw data (allocated by encoder)
+ // mOutBuffers[3] --> video raw data (allocated by encoder)
+ // mOutBuffers[4] --> boxes (allocated by muxer)
+ // mOutBuffers[5] --> audio raw data (allocated by encoder)
+ // ...etc.
+ //
+ nsTArray<nsTArray<uint8_t>> mOutBuffers;
+
+ // Accumulate output size from Write().
+ uint64_t mOutputSize;
+
+ // Bit writing operation. Note: the mBitCount should be 0 before any
+ // byte-boundary writing method be called (Write(uint32_t), Write(uint16_t)...etc);
+ // otherwise, there will be assertion on these functions.
+ uint8_t mBitCount;
+ uint8_t mBit;
+};
+
+}
+#endif
diff --git a/dom/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp b/dom/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp
new file mode 100644
index 000000000..32a0c577b
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOMediaBoxes.cpp
@@ -0,0 +1,1550 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <climits>
+#include "TrackMetadataBase.h"
+#include "ISOMediaBoxes.h"
+#include "ISOControl.h"
+#include "ISOMediaWriter.h"
+#include "EncodedFrameContainer.h"
+#include "ISOTrackMetadata.h"
+#include "MP4ESDS.h"
+#include "AMRBox.h"
+#include "AVCBox.h"
+#include "EVRCBox.h"
+#include "VideoUtils.h"
+
+namespace mozilla {
+
+// 14496-12 6.2.2 'Data Types and fields'
+const uint32_t iso_matrix[] = { 0x00010000, 0, 0,
+ 0, 0x00010000, 0,
+ 0, 0, 0x40000000 };
+
+uint32_t
+set_sample_flags(bool aSync)
+{
+ std::bitset<32> flags;
+ flags.set(16, !aSync);
+ return flags.to_ulong();
+}
+
+Box::BoxSizeChecker::BoxSizeChecker(ISOControl* aControl, uint32_t aSize)
+{
+ mControl = aControl;
+ ori_size = mControl->GetBufPos();
+ box_size = aSize;
+ MOZ_COUNT_CTOR(BoxSizeChecker);
+}
+
+Box::BoxSizeChecker::~BoxSizeChecker()
+{
+ uint32_t cur_size = mControl->GetBufPos();
+ if ((cur_size - ori_size) != box_size) {
+ MOZ_ASSERT(false);
+ }
+
+ MOZ_COUNT_DTOR(BoxSizeChecker);
+}
+
+nsresult
+MediaDataBox::Generate(uint32_t* aBoxSize)
+{
+ mFirstSampleOffset = size;
+ mAllSampleSize = 0;
+
+ if (mTrackType & Audio_Track) {
+ FragmentBuffer* frag = mControl->GetFragment(Audio_Track);
+ mAllSampleSize += frag->GetFirstFragmentSampleSize();
+ }
+ if (mTrackType & Video_Track) {
+ FragmentBuffer* frag = mControl->GetFragment(Video_Track);
+ mAllSampleSize += frag->GetFirstFragmentSampleSize();
+ }
+
+ size += mAllSampleSize;
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+MediaDataBox::Write()
+{
+ nsresult rv;
+ BoxSizeChecker checker(mControl, size);
+ Box::Write();
+ nsTArray<uint32_t> types;
+ types.AppendElement(Audio_Track);
+ types.AppendElement(Video_Track);
+
+ for (uint32_t l = 0; l < types.Length(); l++) {
+ if (mTrackType & types[l]) {
+ FragmentBuffer* frag = mControl->GetFragment(types[l]);
+ nsTArray<RefPtr<EncodedFrame>> frames;
+
+ // Here is the last time we get fragment frames, flush it!
+ rv = frag->GetFirstFragment(frames, true);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ uint32_t len = frames.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ nsTArray<uint8_t> frame_buffer;
+ frames.ElementAt(i)->SwapOutFrameData(frame_buffer);
+ mControl->WriteAVData(frame_buffer);
+ }
+ }
+ }
+
+ return NS_OK;
+}
+
+MediaDataBox::MediaDataBox(uint32_t aTrackType, ISOControl* aControl)
+ : Box(NS_LITERAL_CSTRING("mdat"), aControl)
+ , mAllSampleSize(0)
+ , mFirstSampleOffset(0)
+ , mTrackType(aTrackType)
+{
+ MOZ_COUNT_CTOR(MediaDataBox);
+}
+
+MediaDataBox::~MediaDataBox()
+{
+ MOZ_COUNT_DTOR(MediaDataBox);
+}
+
+uint32_t
+TrackRunBox::fillSampleTable()
+{
+ uint32_t table_size = 0;
+ nsresult rv;
+ nsTArray<RefPtr<EncodedFrame>> frames;
+ FragmentBuffer* frag = mControl->GetFragment(mTrackType);
+
+ rv = frag->GetFirstFragment(frames);
+ if (NS_FAILED(rv)) {
+ return 0;
+ }
+ uint32_t len = frames.Length();
+ sample_info_table = MakeUnique<tbl[]>(len);
+ // Create sample table according to 14496-12 8.8.8.2.
+ for (uint32_t i = 0; i < len; i++) {
+ // Sample size.
+ sample_info_table[i].sample_size = 0;
+ if (flags.to_ulong() & flags_sample_size_present) {
+ sample_info_table[i].sample_size = frames.ElementAt(i)->GetFrameData().Length();
+ mAllSampleSize += sample_info_table[i].sample_size;
+ table_size += sizeof(uint32_t);
+ }
+
+ // Sample flags.
+ sample_info_table[i].sample_flags = 0;
+ if (flags.to_ulong() & flags_sample_flags_present) {
+ sample_info_table[i].sample_flags =
+ set_sample_flags(
+ (frames.ElementAt(i)->GetFrameType() == EncodedFrame::AVC_I_FRAME));
+ table_size += sizeof(uint32_t);
+ }
+
+ // Sample duration.
+ sample_info_table[i].sample_duration = 0;
+ if (flags.to_ulong() & flags_sample_duration_present) {
+ // Calculate each frame's duration, it is decided by "current frame
+ // timestamp - last frame timestamp".
+ uint64_t frame_time = 0;
+ if (i == 0) {
+ frame_time = frames.ElementAt(i)->GetTimeStamp() -
+ frag->GetLastFragmentLastFrameTime();
+ } else {
+ frame_time = frames.ElementAt(i)->GetTimeStamp() -
+ frames.ElementAt(i - 1)->GetTimeStamp();
+ // Keep the last frame time of current fagment, it will be used to calculate
+ // the first frame duration of next fragment.
+ if ((len - 1) == i) {
+ frag->SetLastFragmentLastFrameTime(frames.ElementAt(i)->GetTimeStamp());
+ }
+ }
+
+ // In TrackRunBox, there should be exactly one type, either audio or video.
+ MOZ_ASSERT((mTrackType & Video_Track) ^ (mTrackType & Audio_Track));
+ sample_info_table[i].sample_duration = (mTrackType & Video_Track ?
+ frame_time * mVideoMeta->GetVideoClockRate() / USECS_PER_S :
+ frame_time * mAudioMeta->GetAudioSampleRate() / USECS_PER_S);
+
+ table_size += sizeof(uint32_t);
+ }
+
+ sample_info_table[i].sample_composition_time_offset = 0;
+ }
+ return table_size;
+}
+
+nsresult
+TrackRunBox::Generate(uint32_t* aBoxSize)
+{
+ FragmentBuffer* frag = mControl->GetFragment(mTrackType);
+ sample_count = frag->GetFirstFragmentSampleNumber();
+ size += sizeof(sample_count);
+
+ // data_offset needs to be updated if there is other
+ // TrackRunBox before this one.
+ if (flags.to_ulong() & flags_data_offset_present) {
+ data_offset = 0;
+ size += sizeof(data_offset);
+ }
+ size += fillSampleTable();
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+TrackRunBox::SetDataOffset(uint32_t aOffset)
+{
+ data_offset = aOffset;
+ return NS_OK;
+}
+
+nsresult
+TrackRunBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(sample_count);
+ if (flags.to_ulong() & flags_data_offset_present) {
+ mControl->Write(data_offset);
+ }
+ for (uint32_t i = 0; i < sample_count; i++) {
+ if (flags.to_ulong() & flags_sample_duration_present) {
+ mControl->Write(sample_info_table[i].sample_duration);
+ }
+ if (flags.to_ulong() & flags_sample_size_present) {
+ mControl->Write(sample_info_table[i].sample_size);
+ }
+ if (flags.to_ulong() & flags_sample_flags_present) {
+ mControl->Write(sample_info_table[i].sample_flags);
+ }
+ }
+
+ return NS_OK;
+}
+
+TrackRunBox::TrackRunBox(uint32_t aType, uint32_t aFlags, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("trun"), 0, aFlags, aControl)
+ , sample_count(0)
+ , data_offset(0)
+ , first_sample_flags(0)
+ , mAllSampleSize(0)
+ , mTrackType(aType)
+{
+ MOZ_COUNT_CTOR(TrackRunBox);
+}
+
+TrackRunBox::~TrackRunBox()
+{
+ MOZ_COUNT_DTOR(TrackRunBox);
+}
+
+nsresult
+TrackFragmentHeaderBox::UpdateBaseDataOffset(uint64_t aOffset)
+{
+ base_data_offset = aOffset;
+ return NS_OK;
+}
+
+nsresult
+TrackFragmentHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ track_ID = (mTrackType == Audio_Track ?
+ mControl->GetTrackID(mAudioMeta->GetKind()) :
+ mControl->GetTrackID(mVideoMeta->GetKind()));
+ size += sizeof(track_ID);
+
+ if (flags.to_ulong() & base_data_offset_present) {
+ // base_data_offset needs to add size of 'trun', 'tfhd' and
+ // header of 'mdat' later.
+ base_data_offset = 0;
+ size += sizeof(base_data_offset);
+ }
+ if (flags.to_ulong() & default_sample_duration_present) {
+ if (mTrackType == Video_Track) {
+ if (!mVideoMeta->GetVideoFrameRate()) {
+ // 0 means frame rate is variant, so it is wrong to write
+ // default_sample_duration.
+ MOZ_ASSERT(0);
+ default_sample_duration = 0;
+ } else {
+ default_sample_duration = mVideoMeta->GetVideoClockRate() / mVideoMeta->GetVideoFrameRate();
+ }
+ } else if (mTrackType == Audio_Track) {
+ default_sample_duration = mAudioMeta->GetAudioFrameDuration();
+ } else {
+ MOZ_ASSERT(0);
+ return NS_ERROR_FAILURE;
+ }
+ size += sizeof(default_sample_duration);
+ }
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+TrackFragmentHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(track_ID);
+ if (flags.to_ulong() & base_data_offset_present) {
+ mControl->Write(base_data_offset);
+ }
+ if (flags.to_ulong() & default_sample_duration_present) {
+ mControl->Write(default_sample_duration);
+ }
+ return NS_OK;
+}
+
+TrackFragmentHeaderBox::TrackFragmentHeaderBox(uint32_t aType,
+ uint32_t aFlags,
+ ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("tfhd"), 0, aFlags, aControl)
+ , track_ID(0)
+ , base_data_offset(0)
+ , default_sample_duration(0)
+{
+ mTrackType = aType;
+ MOZ_COUNT_CTOR(TrackFragmentHeaderBox);
+}
+
+TrackFragmentHeaderBox::~TrackFragmentHeaderBox()
+{
+ MOZ_COUNT_DTOR(TrackFragmentHeaderBox);
+}
+
+TrackFragmentBox::TrackFragmentBox(uint32_t aType, ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("traf"), aControl)
+ , mTrackType(aType)
+{
+ // Flags in TrackFragmentHeaderBox.
+ uint32_t tf_flags = base_data_offset_present;
+
+ // Ideally, audio encoder generates audio frame in const rate. However, some
+ // audio encoders don't do it so the audio frame duration needs to be checked
+ // here.
+ if ((mTrackType & Audio_Track) && mAudioMeta->GetAudioFrameDuration()) {
+ tf_flags |= default_sample_duration_present;
+ }
+
+ boxes.AppendElement(new TrackFragmentHeaderBox(aType, tf_flags, aControl));
+
+ // Always adds flags_data_offset_present in each TrackRunBox, Android
+ // parser requires this flag to calculate the correct bitstream offset.
+ uint32_t tr_flags = flags_sample_size_present | flags_data_offset_present;
+
+ // Flags in TrackRunBox.
+ // If there is no default sample duration exists, each frame duration needs to
+ // be recored in the TrackRunBox.
+ tr_flags |= (tf_flags & default_sample_duration_present ? 0 : flags_sample_duration_present);
+
+ // For video, add sample_flags to record I frame.
+ tr_flags |= (mTrackType & Video_Track ? flags_sample_flags_present : 0);
+
+ boxes.AppendElement(new TrackRunBox(mTrackType, tr_flags, aControl));
+ MOZ_COUNT_CTOR(TrackFragmentBox);
+}
+
+TrackFragmentBox::~TrackFragmentBox()
+{
+ MOZ_COUNT_DTOR(TrackFragmentBox);
+}
+
+nsresult
+MovieFragmentHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ sequence_number = mControl->GetCurFragmentNumber();
+ size += sizeof(sequence_number);
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+MovieFragmentHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(sequence_number);
+ return NS_OK;
+}
+
+MovieFragmentHeaderBox::MovieFragmentHeaderBox(uint32_t aTrackType,
+ ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("mfhd"), 0, 0, aControl)
+ , sequence_number(0)
+ , mTrackType(aTrackType)
+{
+ MOZ_COUNT_CTOR(MovieFragmentHeaderBox);
+}
+
+MovieFragmentHeaderBox::~MovieFragmentHeaderBox()
+{
+ MOZ_COUNT_DTOR(MovieFragmentHeaderBox);
+}
+
+MovieFragmentBox::MovieFragmentBox(uint32_t aType, ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("moof"), aControl)
+ , mTrackType(aType)
+{
+ boxes.AppendElement(new MovieFragmentHeaderBox(mTrackType, aControl));
+
+ if (mTrackType & Audio_Track) {
+ boxes.AppendElement(
+ new TrackFragmentBox(Audio_Track, aControl));
+ }
+ if (mTrackType & Video_Track) {
+ boxes.AppendElement(
+ new TrackFragmentBox(Video_Track, aControl));
+ }
+ MOZ_COUNT_CTOR(MovieFragmentBox);
+}
+
+MovieFragmentBox::~MovieFragmentBox()
+{
+ MOZ_COUNT_DTOR(MovieFragmentBox);
+}
+
+nsresult
+MovieFragmentBox::Generate(uint32_t* aBoxSize)
+{
+ nsresult rv = DefaultContainerImpl::Generate(aBoxSize);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Correct data_offset if there are both audio and video track in
+ // this fragment. This offset means the offset in the MediaDataBox.
+ if (mTrackType & (Audio_Track | Video_Track)) {
+ nsTArray<RefPtr<MuxerOperation>> truns;
+ rv = Find(NS_LITERAL_CSTRING("trun"), truns);
+ NS_ENSURE_SUCCESS(rv, rv);
+ uint32_t len = truns.Length();
+ uint32_t data_offset = 0;
+ for (uint32_t i = 0; i < len; i++) {
+ TrackRunBox* trun = (TrackRunBox*) truns.ElementAt(i).get();
+ rv = trun->SetDataOffset(data_offset);
+ NS_ENSURE_SUCCESS(rv, rv);
+ data_offset += trun->GetAllSampleSize();
+ }
+ }
+
+ return NS_OK;
+}
+
+nsresult
+TrackExtendsBox::Generate(uint32_t* aBoxSize)
+{
+ track_ID = (mTrackType == Audio_Track ?
+ mControl->GetTrackID(mAudioMeta->GetKind()) :
+ mControl->GetTrackID(mVideoMeta->GetKind()));
+
+ if (mTrackType == Audio_Track) {
+ default_sample_description_index = 1;
+ default_sample_duration = mAudioMeta->GetAudioFrameDuration();
+ default_sample_size = mAudioMeta->GetAudioFrameSize();
+ default_sample_flags = set_sample_flags(1);
+ } else if (mTrackType == Video_Track) {
+ default_sample_description_index = 1;
+ // Video meta data has assigned framerate, it implies that this video's
+ // frame rate should be fixed.
+ if (mVideoMeta->GetVideoFrameRate()) {
+ default_sample_duration =
+ mVideoMeta->GetVideoClockRate() / mVideoMeta->GetVideoFrameRate();
+ }
+ default_sample_size = 0;
+ default_sample_flags = set_sample_flags(0);
+ } else {
+ MOZ_ASSERT(0);
+ return NS_ERROR_FAILURE;
+ }
+
+ size += sizeof(track_ID) +
+ sizeof(default_sample_description_index) +
+ sizeof(default_sample_duration) +
+ sizeof(default_sample_size) +
+ sizeof(default_sample_flags);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+TrackExtendsBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(track_ID);
+ mControl->Write(default_sample_description_index);
+ mControl->Write(default_sample_duration);
+ mControl->Write(default_sample_size);
+ mControl->Write(default_sample_flags);
+
+ return NS_OK;
+}
+
+TrackExtendsBox::TrackExtendsBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("trex"), 0, 0, aControl)
+ , track_ID(0)
+ , default_sample_description_index(0)
+ , default_sample_duration(0)
+ , default_sample_size(0)
+ , default_sample_flags(0)
+ , mTrackType(aType)
+{
+ MOZ_COUNT_CTOR(TrackExtendsBox);
+}
+
+TrackExtendsBox::~TrackExtendsBox()
+{
+ MOZ_COUNT_DTOR(TrackExtendsBox);
+}
+
+MovieExtendsBox::MovieExtendsBox(ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("mvex"), aControl)
+{
+ if (mAudioMeta) {
+ boxes.AppendElement(new TrackExtendsBox(Audio_Track, aControl));
+ }
+ if (mVideoMeta) {
+ boxes.AppendElement(new TrackExtendsBox(Video_Track, aControl));
+ }
+ MOZ_COUNT_CTOR(MovieExtendsBox);
+}
+
+MovieExtendsBox::~MovieExtendsBox()
+{
+ MOZ_COUNT_DTOR(MovieExtendsBox);
+}
+
+nsresult
+ChunkOffsetBox::Generate(uint32_t* aBoxSize)
+{
+ // We don't need time to sample table in fragmented mp4.
+ entry_count = 0;
+ size += sizeof(entry_count);
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+ChunkOffsetBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(entry_count);
+ return NS_OK;
+}
+
+ChunkOffsetBox::ChunkOffsetBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("stco"), 0, 0, aControl)
+ , entry_count(0)
+{
+ MOZ_COUNT_CTOR(ChunkOffsetBox);
+}
+
+ChunkOffsetBox::~ChunkOffsetBox()
+{
+ MOZ_COUNT_DTOR(ChunkOffsetBox);
+}
+
+nsresult
+SampleToChunkBox::Generate(uint32_t* aBoxSize)
+{
+ // We don't need time to sample table in fragmented mp4
+ entry_count = 0;
+ size += sizeof(entry_count);
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+SampleToChunkBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(entry_count);
+ return NS_OK;
+}
+
+SampleToChunkBox::SampleToChunkBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("stsc"), 0, 0, aControl)
+ , entry_count(0)
+{
+ MOZ_COUNT_CTOR(SampleToChunkBox);
+}
+
+SampleToChunkBox::~SampleToChunkBox()
+{
+ MOZ_COUNT_DTOR(SampleToChunkBox);
+}
+
+nsresult
+TimeToSampleBox::Generate(uint32_t* aBoxSize)
+{
+ // We don't need time to sample table in fragmented mp4.
+ entry_count = 0;
+ size += sizeof(entry_count);
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+TimeToSampleBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(entry_count);
+ return NS_OK;
+}
+
+TimeToSampleBox::TimeToSampleBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("stts"), 0, 0, aControl)
+ , entry_count(0)
+{
+ MOZ_COUNT_CTOR(TimeToSampleBox);
+}
+
+TimeToSampleBox::~TimeToSampleBox()
+{
+ MOZ_COUNT_DTOR(TimeToSampleBox);
+}
+
+nsresult
+SampleDescriptionBox::Generate(uint32_t* aBoxSize)
+{
+ entry_count = 1;
+ size += sizeof(entry_count);
+
+ nsresult rv;
+ uint32_t box_size;
+ rv = sample_entry_box->Generate(&box_size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ size += box_size;
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+SampleDescriptionBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ nsresult rv;
+ mControl->Write(entry_count);
+ rv = sample_entry_box->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+SampleDescriptionBox::SampleDescriptionBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("stsd"), 0, 0, aControl)
+ , entry_count(0)
+{
+ mTrackType = aType;
+
+ switch (mTrackType) {
+ case Audio_Track:
+ {
+ CreateAudioSampleEntry(sample_entry_box);
+ }
+ break;
+ case Video_Track:
+ {
+ CreateVideoSampleEntry(sample_entry_box);
+ }
+ break;
+ }
+ MOZ_ASSERT(sample_entry_box);
+ MOZ_COUNT_CTOR(SampleDescriptionBox);
+}
+
+nsresult
+SampleDescriptionBox::CreateAudioSampleEntry(RefPtr<SampleEntryBox>& aSampleEntry)
+{
+ if (mAudioMeta->GetKind() == TrackMetadataBase::METADATA_AMR) {
+ aSampleEntry = new AMRSampleEntry(mControl);
+ } else if (mAudioMeta->GetKind() == TrackMetadataBase::METADATA_AAC) {
+ aSampleEntry = new MP4AudioSampleEntry(mControl);
+ } else if (mAudioMeta->GetKind() == TrackMetadataBase::METADATA_EVRC) {
+ aSampleEntry = new EVRCSampleEntry(mControl);
+ } else {
+ MOZ_ASSERT(0);
+ }
+ return NS_OK;
+}
+
+nsresult
+SampleDescriptionBox::CreateVideoSampleEntry(RefPtr<SampleEntryBox>& aSampleEntry)
+{
+ if (mVideoMeta->GetKind() == TrackMetadataBase::METADATA_AVC) {
+ aSampleEntry = new AVCSampleEntry(mControl);
+ } else {
+ MOZ_ASSERT(0);
+ }
+ return NS_OK;
+}
+
+SampleDescriptionBox::~SampleDescriptionBox()
+{
+ MOZ_COUNT_DTOR(SampleDescriptionBox);
+}
+
+nsresult
+SampleSizeBox::Generate(uint32_t* aBoxSize)
+{
+ size += sizeof(sample_size) +
+ sizeof(sample_count);
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+SampleSizeBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(sample_size);
+ mControl->Write(sample_count);
+ return NS_OK;
+}
+
+SampleSizeBox::SampleSizeBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("stsz"), 0, 0, aControl)
+ , sample_size(0)
+ , sample_count(0)
+{
+ MOZ_COUNT_CTOR(SampleSizeBox);
+}
+
+SampleSizeBox::~SampleSizeBox()
+{
+ MOZ_COUNT_DTOR(SampleSizeBox);
+}
+
+SampleTableBox::SampleTableBox(uint32_t aType, ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("stbl"), aControl)
+{
+ boxes.AppendElement(new SampleDescriptionBox(aType, aControl));
+ boxes.AppendElement(new TimeToSampleBox(aType, aControl));
+ boxes.AppendElement(new SampleToChunkBox(aType, aControl));
+ boxes.AppendElement(new SampleSizeBox(aControl));
+ boxes.AppendElement(new ChunkOffsetBox(aType, aControl));
+ MOZ_COUNT_CTOR(SampleTableBox);
+}
+
+SampleTableBox::~SampleTableBox()
+{
+ MOZ_COUNT_DTOR(SampleTableBox);
+}
+
+nsresult
+DataEntryUrlBox::Generate(uint32_t* aBoxSize)
+{
+ // location is null here, do nothing
+ size += location.Length();
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+DataEntryUrlBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ return NS_OK;
+}
+
+DataEntryUrlBox::DataEntryUrlBox()
+ : FullBox(NS_LITERAL_CSTRING("url "), 0, 0, (ISOControl*) nullptr)
+{
+ MOZ_COUNT_CTOR(DataEntryUrlBox);
+}
+
+DataEntryUrlBox::DataEntryUrlBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("url "), 0, flags_media_at_the_same_file, aControl)
+{
+ MOZ_COUNT_CTOR(DataEntryUrlBox);
+}
+
+DataEntryUrlBox::DataEntryUrlBox(const DataEntryUrlBox& aBox)
+ : FullBox(aBox.boxType, aBox.version, aBox.flags.to_ulong(), aBox.mControl)
+{
+ location = aBox.location;
+ MOZ_COUNT_CTOR(DataEntryUrlBox);
+}
+
+DataEntryUrlBox::~DataEntryUrlBox()
+{
+ MOZ_COUNT_DTOR(DataEntryUrlBox);
+}
+
+nsresult DataReferenceBox::Generate(uint32_t* aBoxSize)
+{
+ entry_count = 1; // only allow on entry here
+ size += sizeof(uint32_t);
+
+ for (uint32_t i = 0; i < entry_count; i++) {
+ uint32_t box_size = 0;
+ DataEntryUrlBox* url = new DataEntryUrlBox(mControl);
+ url->Generate(&box_size);
+ size += box_size;
+ urls.AppendElement(url);
+ }
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult DataReferenceBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(entry_count);
+
+ for (uint32_t i = 0; i < entry_count; i++) {
+ urls[i]->Write();
+ }
+
+ return NS_OK;
+}
+
+DataReferenceBox::DataReferenceBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("dref"), 0, 0, aControl)
+ , entry_count(0)
+{
+ MOZ_COUNT_CTOR(DataReferenceBox);
+}
+
+DataReferenceBox::~DataReferenceBox()
+{
+ MOZ_COUNT_DTOR(DataReferenceBox);
+}
+
+DataInformationBox::DataInformationBox(ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("dinf"), aControl)
+{
+ boxes.AppendElement(new DataReferenceBox(aControl));
+ MOZ_COUNT_CTOR(DataInformationBox);
+}
+
+DataInformationBox::~DataInformationBox()
+{
+ MOZ_COUNT_DTOR(DataInformationBox);
+}
+
+nsresult
+VideoMediaHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ size += sizeof(graphicsmode) +
+ sizeof(opcolor);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+VideoMediaHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(graphicsmode);
+ mControl->WriteArray(opcolor, 3);
+ return NS_OK;
+}
+
+VideoMediaHeaderBox::VideoMediaHeaderBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("vmhd"), 0, 1, aControl)
+ , graphicsmode(0)
+{
+ memset(opcolor, 0 , sizeof(opcolor));
+ MOZ_COUNT_CTOR(VideoMediaHeaderBox);
+}
+
+VideoMediaHeaderBox::~VideoMediaHeaderBox()
+{
+ MOZ_COUNT_DTOR(VideoMediaHeaderBox);
+}
+
+nsresult
+SoundMediaHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ balance = 0;
+ reserved = 0;
+ size += sizeof(balance) +
+ sizeof(reserved);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+SoundMediaHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(balance);
+ mControl->Write(reserved);
+
+ return NS_OK;
+}
+
+SoundMediaHeaderBox::SoundMediaHeaderBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("smhd"), 0, 0, aControl)
+{
+ MOZ_COUNT_CTOR(SoundMediaHeaderBox);
+}
+
+SoundMediaHeaderBox::~SoundMediaHeaderBox()
+{
+ MOZ_COUNT_DTOR(SoundMediaHeaderBox);
+}
+
+MediaInformationBox::MediaInformationBox(uint32_t aType, ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("minf"), aControl)
+{
+ mTrackType = aType;
+
+ if (mTrackType == Audio_Track) {
+ boxes.AppendElement(new SoundMediaHeaderBox(aControl));
+ } else if (mTrackType == Video_Track) {
+ boxes.AppendElement(new VideoMediaHeaderBox(aControl));
+ } else {
+ MOZ_ASSERT(0);
+ }
+
+ boxes.AppendElement(new DataInformationBox(aControl));
+ boxes.AppendElement(new SampleTableBox(aType, aControl));
+ MOZ_COUNT_CTOR(MediaInformationBox);
+}
+
+MediaInformationBox::~MediaInformationBox()
+{
+ MOZ_COUNT_DTOR(MediaInformationBox);
+}
+
+nsresult
+HandlerBox::Generate(uint32_t* aBoxSize)
+{
+ pre_defined = 0;
+ if (mTrackType == Audio_Track) {
+ handler_type = FOURCC('s', 'o', 'u', 'n');
+ } else if (mTrackType == Video_Track) {
+ handler_type = FOURCC('v', 'i', 'd', 'e');
+ }
+
+ size += sizeof(pre_defined) +
+ sizeof(handler_type) +
+ sizeof(reserved);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+HandlerBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(pre_defined);
+ mControl->Write(handler_type);
+ mControl->WriteArray(reserved, 3);
+
+ return NS_OK;
+}
+
+HandlerBox::HandlerBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("hdlr"), 0, 0, aControl)
+ , pre_defined(0)
+ , handler_type(0)
+{
+ mTrackType = aType;
+ memset(reserved, 0 , sizeof(reserved));
+ MOZ_COUNT_CTOR(HandlerBox);
+}
+
+HandlerBox::~HandlerBox()
+{
+ MOZ_COUNT_DTOR(HandlerBox);
+}
+
+MediaHeaderBox::MediaHeaderBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("mdhd"), 0, 0, aControl)
+ , creation_time(0)
+ , modification_time(0)
+ , timescale(0)
+ , duration(0)
+ , pad(0)
+ , lang1(0)
+ , lang2(0)
+ , lang3(0)
+ , pre_defined(0)
+{
+ mTrackType = aType;
+ MOZ_COUNT_CTOR(MediaHeaderBox);
+}
+
+MediaHeaderBox::~MediaHeaderBox()
+{
+ MOZ_COUNT_DTOR(MediaHeaderBox);
+}
+
+uint32_t
+MediaHeaderBox::GetTimeScale()
+{
+ if (mTrackType == Audio_Track) {
+ return mAudioMeta->GetAudioSampleRate();
+ }
+
+ return mVideoMeta->GetVideoClockRate();
+}
+
+nsresult
+MediaHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ creation_time = mControl->GetTime();
+ modification_time = mControl->GetTime();
+ timescale = GetTimeScale();
+ duration = 0; // fragmented mp4
+
+ pad = 0;
+ lang1 = 'u' - 0x60; // "und" underdetermined language
+ lang2 = 'n' - 0x60;
+ lang3 = 'd' - 0x60;
+ size += (pad.size() + lang1.size() + lang2.size() + lang3.size()) / CHAR_BIT;
+
+ pre_defined = 0;
+ size += sizeof(creation_time) +
+ sizeof(modification_time) +
+ sizeof(timescale) +
+ sizeof(duration) +
+ sizeof(pre_defined);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+MediaHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(creation_time);
+ mControl->Write(modification_time);
+ mControl->Write(timescale);
+ mControl->Write(duration);
+ mControl->WriteBits(pad.to_ulong(), pad.size());
+ mControl->WriteBits(lang1.to_ulong(), lang1.size());
+ mControl->WriteBits(lang2.to_ulong(), lang2.size());
+ mControl->WriteBits(lang3.to_ulong(), lang3.size());
+ mControl->Write(pre_defined);
+
+ return NS_OK;
+}
+
+MovieBox::MovieBox(ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("moov"), aControl)
+{
+ boxes.AppendElement(new MovieHeaderBox(aControl));
+ if (aControl->HasAudioTrack()) {
+ boxes.AppendElement(new TrackBox(Audio_Track, aControl));
+ }
+ if (aControl->HasVideoTrack()) {
+ boxes.AppendElement(new TrackBox(Video_Track, aControl));
+ }
+ boxes.AppendElement(new MovieExtendsBox(aControl));
+ MOZ_COUNT_CTOR(MovieBox);
+}
+
+MovieBox::~MovieBox()
+{
+ MOZ_COUNT_DTOR(MovieBox);
+}
+
+nsresult
+MovieHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ creation_time = mControl->GetTime();
+ modification_time = mControl->GetTime();
+ timescale = GetTimeScale();
+ duration = 0; // The duration is always 0 in fragmented mp4.
+ next_track_ID = mControl->GetNextTrackID();
+
+ size += sizeof(next_track_ID) +
+ sizeof(creation_time) +
+ sizeof(modification_time) +
+ sizeof(timescale) +
+ sizeof(duration) +
+ sizeof(rate) +
+ sizeof(volume) +
+ sizeof(reserved16) +
+ sizeof(reserved32) +
+ sizeof(matrix) +
+ sizeof(pre_defined);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+MovieHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(creation_time);
+ mControl->Write(modification_time);
+ mControl->Write(timescale);
+ mControl->Write(duration);
+ mControl->Write(rate);
+ mControl->Write(volume);
+ mControl->Write(reserved16);
+ mControl->WriteArray(reserved32, 2);
+ mControl->WriteArray(matrix, 9);
+ mControl->WriteArray(pre_defined, 6);
+ mControl->Write(next_track_ID);
+
+ return NS_OK;
+}
+
+uint32_t
+MovieHeaderBox::GetTimeScale()
+{
+ // Only audio track in container.
+ if (mAudioMeta && !mVideoMeta) {
+ return mAudioMeta->GetAudioSampleRate();
+ }
+
+ // return video rate
+ return mVideoMeta->GetVideoClockRate();
+}
+
+MovieHeaderBox::~MovieHeaderBox()
+{
+ MOZ_COUNT_DTOR(MovieHeaderBox);
+}
+
+MovieHeaderBox::MovieHeaderBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("mvhd"), 0, 0, aControl)
+ , creation_time(0)
+ , modification_time(0)
+ , timescale(90000)
+ , duration(0)
+ , rate(0x00010000)
+ , volume(0x0100)
+ , reserved16(0)
+ , next_track_ID(1)
+{
+ memcpy(matrix, iso_matrix, sizeof(matrix));
+ memset(reserved32, 0, sizeof(reserved32));
+ memset(pre_defined, 0, sizeof(pre_defined));
+ MOZ_COUNT_CTOR(MovieHeaderBox);
+}
+
+TrackHeaderBox::TrackHeaderBox(uint32_t aType, ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("tkhd"), 0,
+ flags_track_enabled | flags_track_in_movie | flags_track_in_preview,
+ aControl)
+ , creation_time(0)
+ , modification_time(0)
+ , track_ID(0)
+ , reserved(0)
+ , duration(0)
+ , layer(0)
+ , alternate_group(0)
+ , volume(0)
+ , reserved3(0)
+ , width(0)
+ , height(0)
+{
+ mTrackType = aType;
+ memcpy(matrix, iso_matrix, sizeof(matrix));
+ memset(reserved2, 0, sizeof(reserved2));
+ MOZ_COUNT_CTOR(TrackHeaderBox);
+}
+
+TrackHeaderBox::~TrackHeaderBox()
+{
+ MOZ_COUNT_DTOR(TrackHeaderBox);
+}
+
+nsresult
+TrackHeaderBox::Generate(uint32_t* aBoxSize)
+{
+ creation_time = mControl->GetTime();
+ modification_time = mControl->GetTime();
+ track_ID = (mTrackType == Audio_Track ?
+ mControl->GetTrackID(mAudioMeta->GetKind()) :
+ mControl->GetTrackID(mVideoMeta->GetKind()));
+ // fragmented mp4
+ duration = 0;
+
+ // volume, audiotrack is always 0x0100 in 14496-12 8.3.2.2
+ volume = (mTrackType == Audio_Track ? 0x0100 : 0);
+
+ if (mTrackType == Video_Track) {
+ width = mVideoMeta->GetVideoDisplayWidth() << 16;
+ height = mVideoMeta->GetVideoDisplayHeight() << 16;
+ // Check display size, using the pixel size if any of them is invalid.
+ if (!width || !height) {
+ width = mVideoMeta->GetVideoWidth() << 16;
+ height = mVideoMeta->GetVideoHeight() << 16;
+ }
+ }
+
+ size += sizeof(creation_time) +
+ sizeof(modification_time) +
+ sizeof(track_ID) +
+ sizeof(reserved) +
+ sizeof(duration) +
+ sizeof(reserved2) +
+ sizeof(layer) +
+ sizeof(alternate_group) +
+ sizeof(volume) +
+ sizeof(reserved3) +
+ sizeof(matrix) +
+ sizeof(width) +
+ sizeof(height);
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+TrackHeaderBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ mControl->Write(creation_time);
+ mControl->Write(modification_time);
+ mControl->Write(track_ID);
+ mControl->Write(reserved);
+ mControl->Write(duration);
+ mControl->WriteArray(reserved2, 2);
+ mControl->Write(layer);
+ mControl->Write(alternate_group);
+ mControl->Write(volume);
+ mControl->Write(reserved3);
+ mControl->WriteArray(matrix, 9);
+ mControl->Write(width);
+ mControl->Write(height);
+
+ return NS_OK;
+}
+
+nsresult
+FileTypeBox::Generate(uint32_t* aBoxSize)
+{
+ minor_version = 0;
+
+ if (mControl->GetMuxingType() == ISOMediaWriter::TYPE_FRAG_MP4) {
+ if (!mControl->HasVideoTrack() && mControl->HasAudioTrack()) {
+ major_brand = "M4A ";
+ } else {
+ major_brand = "MP42";
+ }
+ compatible_brands.AppendElement("mp42");
+ compatible_brands.AppendElement("isom");
+ } else if (mControl->GetMuxingType() == ISOMediaWriter::TYPE_FRAG_3GP) {
+ major_brand = "3gp9";
+ // According to 3GPP TS 26.244 V12.2.0, section 5.3.4, it's recommended to
+ // list all compatible brands here. 3GP spec supports fragment from '3gp6'.
+ compatible_brands.AppendElement("3gp9");
+ compatible_brands.AppendElement("3gp8");
+ compatible_brands.AppendElement("3gp7");
+ compatible_brands.AppendElement("3gp6");
+ compatible_brands.AppendElement("isom");
+ } else if (mControl->GetMuxingType() == ISOMediaWriter::TYPE_FRAG_3G2) {
+ major_brand = "3g2a";
+ // 3GPP2 Release 0 and A and 3GPP Release 6 allow movie fragmentation
+ compatible_brands.AppendElement("3gp9");
+ compatible_brands.AppendElement("3gp8");
+ compatible_brands.AppendElement("3gp7");
+ compatible_brands.AppendElement("3gp6");
+ compatible_brands.AppendElement("isom");
+ compatible_brands.AppendElement("3g2c");
+ compatible_brands.AppendElement("3g2b");
+ compatible_brands.AppendElement("3g2a");
+ } else {
+ MOZ_ASSERT(0);
+ }
+
+ size += major_brand.Length() +
+ sizeof(minor_version) +
+ compatible_brands.Length() * 4;
+
+ *aBoxSize = size;
+
+ return NS_OK;
+}
+
+nsresult
+FileTypeBox::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ Box::Write();
+ mControl->WriteFourCC(major_brand.get());
+ mControl->Write(minor_version);
+ uint32_t len = compatible_brands.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ mControl->WriteFourCC(compatible_brands[i].get());
+ }
+
+ return NS_OK;
+}
+
+FileTypeBox::FileTypeBox(ISOControl* aControl)
+ : Box(NS_LITERAL_CSTRING("ftyp"), aControl)
+ , minor_version(0)
+{
+ MOZ_COUNT_CTOR(FileTypeBox);
+}
+
+FileTypeBox::~FileTypeBox()
+{
+ MOZ_COUNT_DTOR(FileTypeBox);
+}
+
+MediaBox::MediaBox(uint32_t aType, ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("mdia"), aControl)
+{
+ mTrackType = aType;
+ boxes.AppendElement(new MediaHeaderBox(aType, aControl));
+ boxes.AppendElement(new HandlerBox(aType, aControl));
+ boxes.AppendElement(new MediaInformationBox(aType, aControl));
+ MOZ_COUNT_CTOR(MediaBox);
+}
+
+MediaBox::~MediaBox()
+{
+ MOZ_COUNT_DTOR(MediaBox);
+}
+
+nsresult
+DefaultContainerImpl::Generate(uint32_t* aBoxSize)
+{
+ nsresult rv;
+ uint32_t box_size;
+ uint32_t len = boxes.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ rv = boxes.ElementAt(i)->Generate(&box_size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ size += box_size;
+ }
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+DefaultContainerImpl::Find(const nsACString& aType,
+ nsTArray<RefPtr<MuxerOperation>>& aOperations)
+{
+ nsresult rv = Box::Find(aType, aOperations);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ uint32_t len = boxes.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ rv = boxes.ElementAt(i)->Find(aType, aOperations);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ return NS_OK;
+}
+
+nsresult
+DefaultContainerImpl::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ Box::Write();
+
+ nsresult rv;
+ uint32_t len = boxes.Length();
+ for (uint32_t i = 0; i < len; i++) {
+ rv = boxes.ElementAt(i)->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ return NS_OK;
+}
+
+DefaultContainerImpl::DefaultContainerImpl(const nsACString& aType,
+ ISOControl* aControl)
+ : Box(aType, aControl)
+{
+}
+
+nsresult
+Box::Write()
+{
+ mControl->Write(size);
+ mControl->WriteFourCC(boxType.get());
+ return NS_OK;
+}
+
+nsresult
+Box::Find(const nsACString& aType, nsTArray<RefPtr<MuxerOperation>>& aOperations)
+{
+ if (boxType == aType) {
+ aOperations.AppendElement(this);
+ }
+ return NS_OK;
+}
+
+Box::Box(const nsACString& aType, ISOControl* aControl)
+ : size(8), mControl(aControl)
+{
+ MOZ_ASSERT(aType.Length() == 4);
+ boxType = aType;
+ aControl->GetAudioMetadata(mAudioMeta);
+ aControl->GetVideoMetadata(mVideoMeta);
+}
+
+FullBox::FullBox(const nsACString& aType, uint8_t aVersion, uint32_t aFlags,
+ ISOControl* aControl)
+ : Box(aType, aControl)
+{
+ std::bitset<24> tmp_flags(aFlags);
+ version = aVersion;
+ flags = tmp_flags;
+ size += sizeof(version) + flags.size() / CHAR_BIT;
+}
+
+nsresult
+FullBox::Write()
+{
+ Box::Write();
+ mControl->Write(version);
+ mControl->WriteBits(flags.to_ulong(), flags.size());
+ return NS_OK;
+}
+
+TrackBox::TrackBox(uint32_t aTrackType, ISOControl* aControl)
+ : DefaultContainerImpl(NS_LITERAL_CSTRING("trak"), aControl)
+{
+ boxes.AppendElement(new TrackHeaderBox(aTrackType, aControl));
+ boxes.AppendElement(new MediaBox(aTrackType, aControl));
+ MOZ_COUNT_CTOR(TrackBox);
+}
+
+TrackBox::~TrackBox()
+{
+ MOZ_COUNT_DTOR(TrackBox);
+}
+
+SampleEntryBox::SampleEntryBox(const nsACString& aFormat, ISOControl* aControl)
+ : Box(aFormat, aControl)
+ , data_reference_index(0)
+{
+ data_reference_index = 1; // There is only one data reference in each track.
+ size += sizeof(reserved) +
+ sizeof(data_reference_index);
+ memset(reserved, 0, sizeof(reserved));
+}
+
+nsresult
+SampleEntryBox::Write()
+{
+ Box::Write();
+ mControl->Write(reserved, sizeof(reserved));
+ mControl->Write(data_reference_index);
+ return NS_OK;
+}
+
+nsresult
+AudioSampleEntry::Write()
+{
+ SampleEntryBox::Write();
+ mControl->Write(sound_version);
+ mControl->Write(reserved2, sizeof(reserved2));
+ mControl->Write(channels);
+ mControl->Write(sample_size);
+ mControl->Write(compressionId);
+ mControl->Write(packet_size);
+ mControl->Write(timeScale);
+ return NS_OK;
+}
+
+AudioSampleEntry::AudioSampleEntry(const nsACString& aFormat, ISOControl* aControl)
+ : SampleEntryBox(aFormat, aControl)
+ , sound_version(0)
+ , channels(2)
+ , sample_size(16)
+ , compressionId(0)
+ , packet_size(0)
+ , timeScale(0)
+{
+ memset(reserved2, 0 , sizeof(reserved2));
+ channels = mAudioMeta->GetAudioChannels();
+ timeScale = mAudioMeta->GetAudioSampleRate() << 16;
+
+ size += sizeof(sound_version) +
+ sizeof(reserved2) +
+ sizeof(sample_size) +
+ sizeof(channels) +
+ sizeof(packet_size) +
+ sizeof(compressionId) +
+ sizeof(timeScale);
+
+ MOZ_COUNT_CTOR(AudioSampleEntry);
+}
+
+AudioSampleEntry::~AudioSampleEntry()
+{
+ MOZ_COUNT_DTOR(AudioSampleEntry);
+}
+
+nsresult
+VisualSampleEntry::Write()
+{
+ SampleEntryBox::Write();
+
+ mControl->Write(reserved, sizeof(reserved));
+ mControl->Write(width);
+ mControl->Write(height);
+ mControl->Write(horizresolution);
+ mControl->Write(vertresolution);
+ mControl->Write(reserved2);
+ mControl->Write(frame_count);
+ mControl->Write(compressorName, sizeof(compressorName));
+ mControl->Write(depth);
+ mControl->Write(pre_defined);
+
+ return NS_OK;
+}
+
+VisualSampleEntry::VisualSampleEntry(const nsACString& aFormat, ISOControl* aControl)
+ : SampleEntryBox(aFormat, aControl)
+ , width(0)
+ , height(0)
+ , horizresolution(resolution_72_dpi)
+ , vertresolution(resolution_72_dpi)
+ , reserved2(0)
+ , frame_count(1)
+ , depth(video_depth)
+ , pre_defined(-1)
+{
+ memset(reserved, 0 , sizeof(reserved));
+ memset(compressorName, 0 , sizeof(compressorName));
+
+ // both fields occupy 16 bits defined in 14496-2 6.2.3.
+ width = mVideoMeta->GetVideoWidth();
+ height = mVideoMeta->GetVideoHeight();
+
+ size += sizeof(reserved) +
+ sizeof(width) +
+ sizeof(height) +
+ sizeof(horizresolution) +
+ sizeof(vertresolution) +
+ sizeof(reserved2) +
+ sizeof(frame_count) +
+ sizeof(compressorName) +
+ sizeof(depth) +
+ sizeof(pre_defined);
+
+ MOZ_COUNT_CTOR(VisualSampleEntry);
+}
+
+VisualSampleEntry::~VisualSampleEntry()
+{
+ MOZ_COUNT_DTOR(VisualSampleEntry);
+}
+
+}
diff --git a/dom/media/encoder/fmp4_muxer/ISOMediaBoxes.h b/dom/media/encoder/fmp4_muxer/ISOMediaBoxes.h
new file mode 100644
index 000000000..a6dc1b046
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOMediaBoxes.h
@@ -0,0 +1,781 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ISOMediaBoxes_h_
+#define ISOMediaBoxes_h_
+
+#include <bitset>
+#include "nsString.h"
+#include "nsTArray.h"
+#include "nsAutoPtr.h"
+#include "MuxerOperation.h"
+#include "mozilla/UniquePtr.h"
+
+#define WRITE_FULLBOX(_compositor, _size) \
+ BoxSizeChecker checker(_compositor, _size); \
+ FullBox::Write();
+
+#define FOURCC(a, b, c, d) ( ((a) << 24) | ((b) << 16) | ((c) << 8) | (d) )
+
+namespace mozilla {
+
+/**
+ * track type from spec 8.4.3.3
+ */
+#define Audio_Track 0x01
+#define Video_Track 0x02
+
+class AudioTrackMetadata;
+class VideoTrackMetadata;
+class ISOControl;
+
+/**
+ * This is the base class for all ISO media format boxes.
+ * It provides the fields of box type(four CC) and size.
+ * The data members in the beginning of a Box (or its descendants)
+ * are the 14496-12 defined member. Other members prefix with 'm'
+ * are private control data.
+ *
+ * This class is for inherited only, it shouldn't be instanced directly.
+ */
+class Box : public MuxerOperation {
+protected:
+ // ISO BMFF members
+ uint32_t size; // 14496-12 4-2 'Object Structure'. Size of this box.
+ nsCString boxType; // four CC name, all table names are listed in
+ // 14496-12 table 1.
+
+public:
+ // MuxerOperation methods
+ nsresult Write() override;
+ nsresult Find(const nsACString& aType,
+ nsTArray<RefPtr<MuxerOperation>>& aOperations) override;
+
+ // This helper class will compare the written size in Write() and the size in
+ // Generate(). If their are not equal, it will assert.
+ class BoxSizeChecker {
+ public:
+ BoxSizeChecker(ISOControl* aControl, uint32_t aSize);
+ ~BoxSizeChecker();
+
+ uint32_t ori_size;
+ uint32_t box_size;
+ ISOControl* mControl;
+ };
+
+protected:
+ Box() = delete;
+ Box(const nsACString& aType, ISOControl* aControl);
+
+ ISOControl* mControl;
+ RefPtr<AudioTrackMetadata> mAudioMeta;
+ RefPtr<VideoTrackMetadata> mVideoMeta;
+};
+
+/**
+ * FullBox (and its descendants) is the box which contains the 'real' data
+ * members. It is the edge in the ISO box structure and it doesn't contain
+ * any box.
+ *
+ * This class is for inherited only, it shouldn't be instanced directly.
+ */
+class FullBox : public Box {
+public:
+ // ISO BMFF members
+ uint8_t version; // 14496-12 4.2 'Object Structure'
+ std::bitset<24> flags; //
+
+ // MuxerOperation methods
+ nsresult Write() override;
+
+protected:
+ // FullBox methods
+ FullBox(const nsACString& aType, uint8_t aVersion, uint32_t aFlags,
+ ISOControl* aControl);
+ FullBox() = delete;
+};
+
+/**
+ * The default implementation of the container box.
+ * Basically, the container box inherits this class and overrides the
+ * constructor only.
+ *
+ * According to 14496-12 3.1.1 'container box', a container box is
+ * 'box whose sole purpose is to contain and group a set of related boxes'
+ *
+ * This class is for inherited only, it shouldn't be instanced directly.
+ */
+class DefaultContainerImpl : public Box {
+public:
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+ nsresult Find(const nsACString& aType,
+ nsTArray<RefPtr<MuxerOperation>>& aOperations) override;
+
+protected:
+ // DefaultContainerImpl methods
+ DefaultContainerImpl(const nsACString& aType, ISOControl* aControl);
+ DefaultContainerImpl() = delete;
+
+ nsTArray<RefPtr<MuxerOperation>> boxes;
+};
+
+// 14496-12 4.3 'File Type Box'
+// Box type: 'ftyp'
+class FileTypeBox : public Box {
+public:
+ // ISO BMFF members
+ nsCString major_brand; // four chars
+ uint32_t minor_version;
+ nsTArray<nsCString> compatible_brands;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // FileTypeBox methods
+ FileTypeBox(ISOControl* aControl);
+ ~FileTypeBox();
+};
+
+// 14496-12 8.2.1 'Movie Box'
+// Box type: 'moov'
+// MovieBox contains MovieHeaderBox, TrackBox and MovieExtendsBox.
+class MovieBox : public DefaultContainerImpl {
+public:
+ MovieBox(ISOControl* aControl);
+ ~MovieBox();
+};
+
+// 14496-12 8.2.2 'Movie Header Box'
+// Box type: 'mvhd'
+class MovieHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t creation_time;
+ uint32_t modification_time;
+ uint32_t timescale;
+ uint32_t duration;
+ uint32_t rate;
+ uint16_t volume;
+ uint16_t reserved16;
+ uint32_t reserved32[2];
+ uint32_t matrix[9];
+ uint32_t pre_defined[6];
+ uint32_t next_track_ID;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // MovieHeaderBox methods
+ MovieHeaderBox(ISOControl* aControl);
+ ~MovieHeaderBox();
+ uint32_t GetTimeScale();
+};
+
+// 14496-12 8.4.2 'Media Header Box'
+// Box type: 'mdhd'
+class MediaHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t creation_time;
+ uint32_t modification_time;
+ uint32_t timescale;
+ uint32_t duration;
+ std::bitset<1> pad;
+ std::bitset<5> lang1;
+ std::bitset<5> lang2;
+ std::bitset<5> lang3;
+ uint16_t pre_defined;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // MediaHeaderBox methods
+ MediaHeaderBox(uint32_t aType, ISOControl* aControl);
+ ~MediaHeaderBox();
+ uint32_t GetTimeScale();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.3.1 'Track Box'
+// Box type: 'trak'
+// TrackBox contains TrackHeaderBox and MediaBox.
+class TrackBox : public DefaultContainerImpl {
+public:
+ TrackBox(uint32_t aTrackType, ISOControl* aControl);
+ ~TrackBox();
+};
+
+// 14496-12 8.1.1 'Media Data Box'
+// Box type: 'mdat'
+class MediaDataBox : public Box {
+public:
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // MediaDataBox methods
+ uint32_t GetAllSampleSize() { return mAllSampleSize; }
+ uint32_t FirstSampleOffsetInMediaDataBox() { return mFirstSampleOffset; }
+ MediaDataBox(uint32_t aTrackType, ISOControl* aControl);
+ ~MediaDataBox();
+
+protected:
+ uint32_t mAllSampleSize; // All audio and video sample size in this box.
+ uint32_t mFirstSampleOffset; // The offset of first sample in this box from
+ // the beginning of this mp4 file.
+ uint32_t mTrackType;
+};
+
+// flags for TrackRunBox::flags, 14496-12 8.8.8.1.
+#define flags_data_offset_present 0x000001
+#define flags_first_sample_flags_present 0x000002
+#define flags_sample_duration_present 0x000100
+#define flags_sample_size_present 0x000200
+#define flags_sample_flags_present 0x000400
+#define flags_sample_composition_time_offsets_present 0x000800
+
+// flag for TrackRunBox::tbl::sample_flags and TrackExtendsBox::default_sample_flags
+// which is defined in 14496-12 8.8.3.1.
+uint32_t set_sample_flags(bool aSync);
+
+// 14496-12 8.8.8 'Track Fragment Run Box'
+// Box type: 'trun'
+class TrackRunBox : public FullBox {
+public:
+ // ISO BMFF members
+ typedef struct {
+ uint32_t sample_duration;
+ uint32_t sample_size;
+ uint32_t sample_flags;
+ uint32_t sample_composition_time_offset;
+ } tbl;
+
+ uint32_t sample_count;
+ // the following are optional fields
+ uint32_t data_offset; // data offset exists when audio/video are present in file.
+ uint32_t first_sample_flags;
+ UniquePtr<tbl[]> sample_info_table;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // TrackRunBox methods
+ uint32_t GetAllSampleSize() { return mAllSampleSize; }
+ nsresult SetDataOffset(uint32_t aOffset);
+
+ TrackRunBox(uint32_t aType, uint32_t aFlags, ISOControl* aControl);
+ ~TrackRunBox();
+
+protected:
+ uint32_t fillSampleTable();
+
+ uint32_t mAllSampleSize;
+ uint32_t mTrackType;
+};
+
+// tf_flags in TrackFragmentHeaderBox, 14496-12 8.8.7.1.
+#define base_data_offset_present 0x000001
+#define sample_description_index_present 0x000002
+#define default_sample_duration_present 0x000008
+#define default_sample_size_present 0x000010
+#define default_sample_flags_present 0x000020
+#define duration_is_empty 0x010000
+#define default_base_is_moof 0x020000
+
+// 14496-12 8.8.7 'Track Fragment Header Box'
+// Box type: 'tfhd'
+class TrackFragmentHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t track_ID;
+ uint64_t base_data_offset;
+ uint32_t default_sample_duration;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // TrackFragmentHeaderBox methods
+ nsresult UpdateBaseDataOffset(uint64_t aOffset); // The offset of the first
+ // sample in file.
+
+ TrackFragmentHeaderBox(uint32_t aType, uint32_t aFlags, ISOControl* aControl);
+ ~TrackFragmentHeaderBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.8.6 'Track Fragment Box'
+// Box type: 'traf'
+// TrackFragmentBox cotains TrackFragmentHeaderBox and TrackRunBox.
+class TrackFragmentBox : public DefaultContainerImpl {
+public:
+ TrackFragmentBox(uint32_t aType, ISOControl* aControl);
+ ~TrackFragmentBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.8.5 'Movie Fragment Header Box'
+// Box type: 'mfhd'
+class MovieFragmentHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t sequence_number;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // MovieFragmentHeaderBox methods
+ MovieFragmentHeaderBox(uint32_t aType, ISOControl* aControl);
+ ~MovieFragmentHeaderBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.8.4 'Movie Fragment Box'
+// Box type: 'moof'
+// MovieFragmentBox contains MovieFragmentHeaderBox and TrackFragmentBox.
+class MovieFragmentBox : public DefaultContainerImpl {
+public:
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+
+ // MovieFragmentBox methods
+ MovieFragmentBox(uint32_t aType, ISOControl* aControl);
+ ~MovieFragmentBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.8.3 'Track Extends Box'
+// Box type: 'trex'
+class TrackExtendsBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t track_ID;
+ uint32_t default_sample_description_index;
+ uint32_t default_sample_duration;
+ uint32_t default_sample_size;
+ uint32_t default_sample_flags;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // TrackExtendsBox methods
+ TrackExtendsBox(uint32_t aType, ISOControl* aControl);
+ ~TrackExtendsBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.8.1 'Movie Extends Box'
+// Box type: 'mvex'
+// MovieExtendsBox contains TrackExtendsBox.
+class MovieExtendsBox : public DefaultContainerImpl {
+public:
+ MovieExtendsBox(ISOControl* aControl);
+ ~MovieExtendsBox();
+};
+
+// 14496-12 8.7.5 'Chunk Offset Box'
+// Box type: 'stco'
+class ChunkOffsetBox : public FullBox {
+public:
+ // ISO BMFF members
+ typedef struct {
+ uint32_t chunk_offset;
+ } tbl;
+
+ uint32_t entry_count;
+ UniquePtr<tbl[]> sample_tbl;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // ChunkOffsetBox methods
+ ChunkOffsetBox(uint32_t aType, ISOControl* aControl);
+ ~ChunkOffsetBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.7.4 'Sample To Chunk Box'
+// Box type: 'stsc'
+class SampleToChunkBox : public FullBox {
+public:
+ // ISO BMFF members
+ typedef struct {
+ uint32_t first_chunk;
+ uint32_t sample_per_chunk;
+ uint32_t sample_description_index;
+ } tbl;
+
+ uint32_t entry_count;
+ UniquePtr<tbl[]> sample_tbl;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // SampleToChunkBox methods
+ SampleToChunkBox(uint32_t aType, ISOControl* aControl);
+ ~SampleToChunkBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.6.1.2 'Decoding Time to Sample Box'
+// Box type: 'stts'
+class TimeToSampleBox : public FullBox {
+public:
+ // ISO BMFF members
+ typedef struct {
+ uint32_t sample_count;
+ uint32_t sample_delta;
+ } tbl;
+
+ uint32_t entry_count;
+ UniquePtr<tbl[]> sample_tbl;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // TimeToSampleBox methods
+ TimeToSampleBox(uint32_t aType, ISOControl* aControl);
+ ~TimeToSampleBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+/**
+ * 14496-12 8.5.2 'Sample Description Box'
+ * This is the base class for VisualSampleEntry and AudioSampleEntry.
+ *
+ * This class is for inherited only, it shouldn't be instanced directly.
+ *
+ * The inhertied tree of a codec box should be:
+ *
+ * +--> AVCSampleEntry
+ * +--> VisualSampleEntryBox +
+ * | +--> ...
+ * SampleEntryBox +
+ * | +--> MP4AudioSampleEntry
+ * +--> AudioSampleEntryBox +
+ * +--> AMRSampleEntry
+ * +
+ * +--> ...
+ *
+ */
+class SampleEntryBox : public Box {
+public:
+ // ISO BMFF members
+ uint8_t reserved[6];
+ uint16_t data_reference_index;
+
+ // sampleentrybox methods
+ SampleEntryBox(const nsACString& aFormat, ISOControl* aControl);
+
+ // MuxerOperation methods
+ nsresult Write() override;
+
+protected:
+ SampleEntryBox() = delete;
+};
+
+// 14496-12 8.5.2 'Sample Description Box'
+// Box type: 'stsd'
+class SampleDescriptionBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t entry_count;
+ RefPtr<SampleEntryBox> sample_entry_box;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // SampleDescriptionBox methods
+ SampleDescriptionBox(uint32_t aType, ISOControl* aControl);
+ ~SampleDescriptionBox();
+
+protected:
+ nsresult CreateAudioSampleEntry(RefPtr<SampleEntryBox>& aSampleEntry);
+ nsresult CreateVideoSampleEntry(RefPtr<SampleEntryBox>& aSampleEntry);
+
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.5.2.2
+// The base class for audio codec box.
+// This class is for inherited only, it shouldn't be instanced directly.
+class AudioSampleEntry : public SampleEntryBox {
+public:
+ // ISO BMFF members
+ uint16_t sound_version;
+ uint8_t reserved2[6];
+ uint16_t channels;
+ uint16_t sample_size;
+ uint16_t compressionId;
+ uint16_t packet_size;
+ uint32_t timeScale; // (sample rate of media) <<16
+
+ // MuxerOperation methods
+ nsresult Write() override;
+
+ ~AudioSampleEntry();
+
+protected:
+ AudioSampleEntry(const nsACString& aFormat, ISOControl* aControl);
+};
+
+// 14496-12 8.5.2.2
+// The base class for video codec box.
+// This class is for inherited only, it shouldn't be instanced directly.
+class VisualSampleEntry : public SampleEntryBox {
+public:
+ // ISO BMFF members
+ uint8_t reserved[16];
+ uint16_t width;
+ uint16_t height;
+
+ uint32_t horizresolution; // 72 dpi
+ uint32_t vertresolution; // 72 dpi
+ uint32_t reserved2;
+ uint16_t frame_count; // 1, defined in 14496-12 8.5.2.2
+
+ uint8_t compressorName[32];
+ uint16_t depth; // 0x0018, defined in 14496-12 8.5.2.2;
+ uint16_t pre_defined; // -1, defined in 14496-12 8.5.2.2;
+
+ // MuxerOperation methods
+ nsresult Write() override;
+
+ // VisualSampleEntry methods
+ ~VisualSampleEntry();
+
+protected:
+ VisualSampleEntry(const nsACString& aFormat, ISOControl* aControl);
+};
+
+// 14496-12 8.7.3.2 'Sample Size Box'
+// Box type: 'stsz'
+class SampleSizeBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t sample_size;
+ uint32_t sample_count;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // SampleSizeBox methods
+ SampleSizeBox(ISOControl* aControl);
+ ~SampleSizeBox();
+};
+
+// 14496-12 8.5.1 'Sample Table Box'
+// Box type: 'stbl'
+//
+// SampleTableBox contains SampleDescriptionBox,
+// TimeToSampleBox,
+// SampleToChunkBox,
+// SampleSizeBox and
+// ChunkOffsetBox.
+class SampleTableBox : public DefaultContainerImpl {
+public:
+ SampleTableBox(uint32_t aType, ISOControl* aControl);
+ ~SampleTableBox();
+};
+
+// 14496-12 8.7.2 'Data Reference Box'
+// Box type: 'url '
+class DataEntryUrlBox : public FullBox {
+public:
+ // ISO BMFF members
+ // flags in DataEntryUrlBox::flags
+ const static uint16_t flags_media_at_the_same_file = 0x0001;
+
+ nsCString location;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // DataEntryUrlBox methods
+ DataEntryUrlBox();
+ DataEntryUrlBox(ISOControl* aControl);
+ DataEntryUrlBox(const DataEntryUrlBox& aBox);
+ ~DataEntryUrlBox();
+};
+
+// 14496-12 8.7.2 'Data Reference Box'
+// Box type: 'dref'
+class DataReferenceBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t entry_count;
+ nsTArray<nsAutoPtr<DataEntryUrlBox>> urls;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // DataReferenceBox methods
+ DataReferenceBox(ISOControl* aControl);
+ ~DataReferenceBox();
+};
+
+// 14496-12 8.7.1 'Data Information Box'
+// Box type: 'dinf'
+// DataInformationBox contains DataReferenceBox.
+class DataInformationBox : public DefaultContainerImpl {
+public:
+ DataInformationBox(ISOControl* aControl);
+ ~DataInformationBox();
+};
+
+// 14496-12 8.4.5.2 'Video Media Header Box'
+// Box type: 'vmhd'
+class VideoMediaHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint16_t graphicsmode;
+ uint16_t opcolor[3];
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // VideoMediaHeaderBox methods
+ VideoMediaHeaderBox(ISOControl* aControl);
+ ~VideoMediaHeaderBox();
+};
+
+// 14496-12 8.4.5.3 'Sound Media Header Box'
+// Box type: 'smhd'
+class SoundMediaHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint16_t balance;
+ uint16_t reserved;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // SoundMediaHeaderBox methods
+ SoundMediaHeaderBox(ISOControl* aControl);
+ ~SoundMediaHeaderBox();
+};
+
+// 14496-12 8.4.4 'Media Information Box'
+// Box type: 'minf'
+// MediaInformationBox contains SoundMediaHeaderBox, DataInformationBox and
+// SampleTableBox.
+class MediaInformationBox : public DefaultContainerImpl {
+public:
+ MediaInformationBox(uint32_t aType, ISOControl* aControl);
+ ~MediaInformationBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// flags for TrackHeaderBox::flags.
+#define flags_track_enabled 0x000001
+#define flags_track_in_movie 0x000002
+#define flags_track_in_preview 0x000004
+
+// 14496-12 8.3.2 'Track Header Box'
+// Box type: 'tkhd'
+class TrackHeaderBox : public FullBox {
+public:
+ // ISO BMFF members
+ // version = 0
+ uint32_t creation_time;
+ uint32_t modification_time;
+ uint32_t track_ID;
+ uint32_t reserved;
+ uint32_t duration;
+
+ uint32_t reserved2[2];
+ uint16_t layer;
+ uint16_t alternate_group;
+ uint16_t volume;
+ uint16_t reserved3;
+ uint32_t matrix[9];
+ uint32_t width;
+ uint32_t height;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // TrackHeaderBox methods
+ TrackHeaderBox(uint32_t aType, ISOControl* aControl);
+ ~TrackHeaderBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.4.3 'Handler Reference Box'
+// Box type: 'hdlr'
+class HandlerBox : public FullBox {
+public:
+ // ISO BMFF members
+ uint32_t pre_defined;
+ uint32_t handler_type;
+ uint32_t reserved[3];
+ nsCString name;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // HandlerBox methods
+ HandlerBox(uint32_t aType, ISOControl* aControl);
+ ~HandlerBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+// 14496-12 8.4.1 'Media Box'
+// Box type: 'mdia'
+// MediaBox contains MediaHeaderBox, HandlerBox, and MediaInformationBox.
+class MediaBox : public DefaultContainerImpl {
+public:
+ MediaBox(uint32_t aType, ISOControl* aControl);
+ ~MediaBox();
+
+protected:
+ uint32_t mTrackType;
+};
+
+}
+#endif // ISOMediaBoxes_h_
diff --git a/dom/media/encoder/fmp4_muxer/ISOMediaWriter.cpp b/dom/media/encoder/fmp4_muxer/ISOMediaWriter.cpp
new file mode 100644
index 000000000..fa23616e9
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOMediaWriter.cpp
@@ -0,0 +1,234 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ISOMediaWriter.h"
+#include "ISOControl.h"
+#include "ISOMediaBoxes.h"
+#include "ISOTrackMetadata.h"
+#include "nsThreadUtils.h"
+#include "MediaEncoder.h"
+#include "VideoUtils.h"
+#include "GeckoProfiler.h"
+
+#undef LOG
+#ifdef MOZ_WIDGET_GONK
+#include <android/log.h>
+#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "MediaEncoder", ## args);
+#else
+#define LOG(args, ...)
+#endif
+
+namespace mozilla {
+
+const static uint32_t FRAG_DURATION = 2 * USECS_PER_S; // microsecond per unit
+
+ISOMediaWriter::ISOMediaWriter(uint32_t aType, uint32_t aHint)
+ : ContainerWriter()
+ , mState(MUXING_HEAD)
+ , mBlobReady(false)
+ , mType(0)
+{
+ if (aType & CREATE_AUDIO_TRACK) {
+ mType |= Audio_Track;
+ }
+ if (aType & CREATE_VIDEO_TRACK) {
+ mType |= Video_Track;
+ }
+ mControl = new ISOControl(aHint);
+ MOZ_COUNT_CTOR(ISOMediaWriter);
+}
+
+ISOMediaWriter::~ISOMediaWriter()
+{
+ MOZ_COUNT_DTOR(ISOMediaWriter);
+}
+
+nsresult
+ISOMediaWriter::RunState()
+{
+ nsresult rv;
+ switch (mState) {
+ case MUXING_HEAD:
+ {
+ rv = mControl->GenerateFtyp();
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = mControl->GenerateMoov();
+ NS_ENSURE_SUCCESS(rv, rv);
+ mState = MUXING_FRAG;
+ break;
+ }
+ case MUXING_FRAG:
+ {
+ rv = mControl->GenerateMoof(mType);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ bool EOS;
+ if (ReadyToRunState(EOS) && EOS) {
+ mState = MUXING_DONE;
+ }
+ break;
+ }
+ case MUXING_DONE:
+ {
+ break;
+ }
+ }
+ mBlobReady = true;
+ return NS_OK;
+}
+
+nsresult
+ISOMediaWriter::WriteEncodedTrack(const EncodedFrameContainer& aData,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("ISOMediaWriter", "WriteEncodedTrack",
+ js::ProfileEntry::Category::OTHER);
+ // Muxing complete, it doesn't allowed to reentry again.
+ if (mState == MUXING_DONE) {
+ MOZ_ASSERT(false);
+ return NS_ERROR_FAILURE;
+ }
+
+ FragmentBuffer* frag = nullptr;
+ uint32_t len = aData.GetEncodedFrames().Length();
+
+ if (!len) {
+ // no frame? why bother to WriteEncodedTrack
+ return NS_OK;
+ }
+ for (uint32_t i = 0; i < len; i++) {
+ RefPtr<EncodedFrame> frame(aData.GetEncodedFrames()[i]);
+ EncodedFrame::FrameType type = frame->GetFrameType();
+ if (type == EncodedFrame::AAC_AUDIO_FRAME ||
+ type == EncodedFrame::AAC_CSD ||
+ type == EncodedFrame::AMR_AUDIO_FRAME ||
+ type == EncodedFrame::AMR_AUDIO_CSD ||
+ type == EncodedFrame::EVRC_AUDIO_FRAME ||
+ type == EncodedFrame::EVRC_AUDIO_CSD) {
+ frag = mAudioFragmentBuffer;
+ } else if (type == EncodedFrame::AVC_I_FRAME ||
+ type == EncodedFrame::AVC_P_FRAME ||
+ type == EncodedFrame::AVC_B_FRAME ||
+ type == EncodedFrame::AVC_CSD) {
+ frag = mVideoFragmentBuffer;
+ } else {
+ MOZ_ASSERT(0);
+ return NS_ERROR_FAILURE;
+ }
+
+ frag->AddFrame(frame);
+ }
+
+ // Encoder should send CSD (codec specific data) frame before sending the
+ // audio/video frames. When CSD data is ready, it is sufficient to generate a
+ // moov data. If encoder doesn't send CSD yet, muxer needs to wait before
+ // generating anything.
+ if (mType & Audio_Track && (!mAudioFragmentBuffer ||
+ !mAudioFragmentBuffer->HasCSD())) {
+ return NS_OK;
+ }
+ if (mType & Video_Track && (!mVideoFragmentBuffer ||
+ !mVideoFragmentBuffer->HasCSD())) {
+ return NS_OK;
+ }
+
+ // Only one FrameType in EncodedFrameContainer so it doesn't need to be
+ // inside the for-loop.
+ if (frag && (aFlags & END_OF_STREAM)) {
+ frag->SetEndOfStream();
+ }
+
+ nsresult rv;
+ bool EOS;
+ if (ReadyToRunState(EOS)) {
+ // Because track encoder won't generate new data after EOS, it needs to make
+ // sure the state reaches MUXING_DONE when EOS is signaled.
+ do {
+ rv = RunState();
+ } while (EOS && mState != MUXING_DONE);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ return NS_OK;
+}
+
+bool
+ISOMediaWriter::ReadyToRunState(bool& aEOS)
+{
+ aEOS = false;
+ bool bReadyToMux = true;
+ if ((mType & Audio_Track) && (mType & Video_Track)) {
+ if (!mAudioFragmentBuffer->HasEnoughData()) {
+ bReadyToMux = false;
+ }
+ if (!mVideoFragmentBuffer->HasEnoughData()) {
+ bReadyToMux = false;
+ }
+
+ if (mAudioFragmentBuffer->EOS() && mVideoFragmentBuffer->EOS()) {
+ aEOS = true;
+ bReadyToMux = true;
+ }
+ } else if (mType == Audio_Track) {
+ if (!mAudioFragmentBuffer->HasEnoughData()) {
+ bReadyToMux = false;
+ }
+ if (mAudioFragmentBuffer->EOS()) {
+ aEOS = true;
+ bReadyToMux = true;
+ }
+ } else if (mType == Video_Track) {
+ if (!mVideoFragmentBuffer->HasEnoughData()) {
+ bReadyToMux = false;
+ }
+ if (mVideoFragmentBuffer->EOS()) {
+ aEOS = true;
+ bReadyToMux = true;
+ }
+ }
+
+ return bReadyToMux;
+}
+
+nsresult
+ISOMediaWriter::GetContainerData(nsTArray<nsTArray<uint8_t>>* aOutputBufs,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("ISOMediaWriter", "GetContainerData",
+ js::ProfileEntry::Category::OTHER);
+ if (mBlobReady) {
+ if (mState == MUXING_DONE) {
+ mIsWritingComplete = true;
+ }
+ mBlobReady = false;
+ return mControl->GetBufs(aOutputBufs);
+ }
+ return NS_OK;
+}
+
+nsresult
+ISOMediaWriter::SetMetadata(TrackMetadataBase* aMetadata)
+{
+ PROFILER_LABEL("ISOMediaWriter", "SetMetadata",
+ js::ProfileEntry::Category::OTHER);
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_AAC ||
+ aMetadata->GetKind() == TrackMetadataBase::METADATA_AMR ||
+ aMetadata->GetKind() == TrackMetadataBase::METADATA_EVRC) {
+ mControl->SetMetadata(aMetadata);
+ mAudioFragmentBuffer = new FragmentBuffer(Audio_Track, FRAG_DURATION);
+ mControl->SetFragment(mAudioFragmentBuffer);
+ return NS_OK;
+ }
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_AVC) {
+ mControl->SetMetadata(aMetadata);
+ mVideoFragmentBuffer = new FragmentBuffer(Video_Track, FRAG_DURATION);
+ mControl->SetFragment(mVideoFragmentBuffer);
+ return NS_OK;
+ }
+
+ return NS_ERROR_FAILURE;
+}
+
+} // namespace mozilla
diff --git a/dom/media/encoder/fmp4_muxer/ISOMediaWriter.h b/dom/media/encoder/fmp4_muxer/ISOMediaWriter.h
new file mode 100644
index 000000000..cccbbe3cb
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOMediaWriter.h
@@ -0,0 +1,108 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ISOMediaWriter_h_
+#define ISOMediaWriter_h_
+
+#include "ContainerWriter.h"
+#include "nsAutoPtr.h"
+#include "nsIRunnable.h"
+
+namespace mozilla {
+
+class ISOControl;
+class FragmentBuffer;
+
+class ISOMediaWriter : public ContainerWriter
+{
+public:
+ // Generate an fragmented MP4 stream, ISO/IEC 14496-12.
+ // Brand names in 'ftyp' box are 'isom' and 'mp42'.
+ const static uint32_t TYPE_FRAG_MP4 = 1 << 0;
+
+ // Generate an fragmented 3GP stream, 3GPP TS 26.244,
+ // '5.4.3 Basic profile'.
+ // Brand names in 'ftyp' box are '3gp9' and 'isom'.
+ const static uint32_t TYPE_FRAG_3GP = 1 << 1;
+
+ // Generate an fragmented 3G2 stream, 3GPP2 C.S0050-B
+ // Brand names in 'ftyp' box are '3g2c' and 'isom'
+ const static uint32_t TYPE_FRAG_3G2 = 1 << 2;
+
+ // aType is the combination of CREATE_AUDIO_TRACK and CREATE_VIDEO_TRACK.
+ // It is a hint to muxer that the output streaming contains audio, video
+ // or both.
+ //
+ // aHint is one of the value in TYPE_XXXXXXXX. It is a hint to muxer what kind
+ // of ISO format should be generated.
+ ISOMediaWriter(uint32_t aType, uint32_t aHint = TYPE_FRAG_MP4);
+ ~ISOMediaWriter();
+
+ // ContainerWriter methods
+ nsresult WriteEncodedTrack(const EncodedFrameContainer &aData,
+ uint32_t aFlags = 0) override;
+
+ nsresult GetContainerData(nsTArray<nsTArray<uint8_t>>* aOutputBufs,
+ uint32_t aFlags = 0) override;
+
+ nsresult SetMetadata(TrackMetadataBase* aMetadata) override;
+
+protected:
+ /**
+ * The state of each state will generate one or more blob.
+ * Each blob will be a moov, moof, moof... until receiving EOS.
+ * The generated sequence is:
+ *
+ * moov -> moof -> moof -> ... -> moof -> moof
+ *
+ * Following is the details of each state.
+ * MUXING_HEAD:
+ * It collects the metadata to generate a moov. The state transits to
+ * MUXING_HEAD after output moov blob.
+ *
+ * MUXING_FRAG:
+ * It collects enough audio/video data to generate a fragment blob. This
+ * will be repeated until END_OF_STREAM and then transiting to MUXING_DONE.
+ *
+ * MUXING_DONE:
+ * End of ISOMediaWriter life cycle.
+ */
+ enum MuxState {
+ MUXING_HEAD,
+ MUXING_FRAG,
+ MUXING_DONE,
+ };
+
+private:
+ nsresult RunState();
+
+ // True if one of following conditions hold:
+ // 1. Audio/Video accumulates enough data to generate a moof.
+ // 2. Get EOS signal.
+ // aEOS will be assigned to true if it gets EOS signal.
+ bool ReadyToRunState(bool& aEOS);
+
+ // The main class to generate and iso box. Its life time is same as
+ // ISOMediaWriter and deleted only if ISOMediaWriter is destroyed.
+ nsAutoPtr<ISOControl> mControl;
+
+ // Buffers to keep audio/video data frames, they are created when metadata is
+ // received. Only one instance for each media type is allowed and they will be
+ // deleted only if ISOMediaWriter is destroyed.
+ nsAutoPtr<FragmentBuffer> mAudioFragmentBuffer;
+ nsAutoPtr<FragmentBuffer> mVideoFragmentBuffer;
+
+ MuxState mState;
+
+ // A flag to indicate the output buffer is ready to blob out.
+ bool mBlobReady;
+
+ // Combination of Audio_Track or Video_Track.
+ uint32_t mType;
+};
+
+} // namespace mozilla
+
+#endif // ISOMediaWriter_h_
diff --git a/dom/media/encoder/fmp4_muxer/ISOTrackMetadata.h b/dom/media/encoder/fmp4_muxer/ISOTrackMetadata.h
new file mode 100644
index 000000000..3613e1e9e
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/ISOTrackMetadata.h
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ISOTrackMetadata_h_
+#define ISOTrackMetadata_h_
+
+#include "TrackMetadataBase.h"
+
+namespace mozilla {
+
+class AACTrackMetadata : public AudioTrackMetadata {
+public:
+ // AudioTrackMetadata members
+ uint32_t GetAudioFrameDuration() override { return mFrameDuration; }
+ uint32_t GetAudioFrameSize() override { return mFrameSize; }
+ uint32_t GetAudioSampleRate() override { return mSampleRate; }
+ uint32_t GetAudioChannels() override { return mChannels; }
+
+ // TrackMetadataBase member
+ MetadataKind GetKind() const override { return METADATA_AAC; }
+
+ // AACTrackMetadata members
+ AACTrackMetadata()
+ : mSampleRate(0)
+ , mFrameDuration(0)
+ , mFrameSize(0)
+ , mChannels(0) {
+ MOZ_COUNT_CTOR(AACTrackMetadata);
+ }
+ ~AACTrackMetadata() { MOZ_COUNT_DTOR(AACTrackMetadata); }
+
+ uint32_t mSampleRate; // From 14496-3 table 1.16, it could be 7350 ~ 96000.
+ uint32_t mFrameDuration; // Audio frame duration based on SampleRate.
+ uint32_t mFrameSize; // Audio frame size, 0 is variant size.
+ uint32_t mChannels; // Channel number, it should be 1 or 2.
+};
+
+// AVC clock rate is 90k Hz.
+#define AVC_CLOCK_RATE 90000
+
+class AVCTrackMetadata : public VideoTrackMetadata {
+public:
+ // VideoTrackMetadata members
+ uint32_t GetVideoHeight() override { return mHeight; }
+ uint32_t GetVideoWidth() override {return mWidth; }
+ uint32_t GetVideoDisplayHeight() override { return mDisplayHeight; }
+ uint32_t GetVideoDisplayWidth() override { return mDisplayWidth; }
+ uint32_t GetVideoClockRate() override { return AVC_CLOCK_RATE; }
+ uint32_t GetVideoFrameRate() override { return mFrameRate; }
+
+ // TrackMetadataBase member
+ MetadataKind GetKind() const override { return METADATA_AVC; }
+
+ // AVCTrackMetadata
+ AVCTrackMetadata()
+ : mHeight(0)
+ , mWidth(0)
+ , mDisplayHeight(0)
+ , mDisplayWidth(0)
+ , mFrameRate(0) {
+ MOZ_COUNT_CTOR(AVCTrackMetadata);
+ }
+ ~AVCTrackMetadata() { MOZ_COUNT_DTOR(AVCTrackMetadata); }
+
+ uint32_t mHeight;
+ uint32_t mWidth;
+ uint32_t mDisplayHeight;
+ uint32_t mDisplayWidth;
+ uint32_t mFrameRate; // frames per second
+};
+
+
+// AMR sample rate is 8000 samples/s.
+#define AMR_SAMPLE_RATE 8000
+
+// Channel number is always 1.
+#define AMR_CHANNELS 1
+
+// AMR speech codec, 3GPP TS 26.071. Encoder and continer support AMR-NB only
+// currently.
+class AMRTrackMetadata : public AudioTrackMetadata {
+public:
+ // AudioTrackMetadata members
+ //
+ // The number of sample sets generates by encoder is variant. So the
+ // frame duration and frame size are both 0.
+ uint32_t GetAudioFrameDuration() override { return 0; }
+ uint32_t GetAudioFrameSize() override { return 0; }
+ uint32_t GetAudioSampleRate() override { return AMR_SAMPLE_RATE; }
+ uint32_t GetAudioChannels() override { return AMR_CHANNELS; }
+
+ // TrackMetadataBase member
+ MetadataKind GetKind() const override { return METADATA_AMR; }
+
+ // AMRTrackMetadata members
+ AMRTrackMetadata() { MOZ_COUNT_CTOR(AMRTrackMetadata); }
+ ~AMRTrackMetadata() { MOZ_COUNT_DTOR(AMRTrackMetadata); }
+};
+
+// EVRC sample rate is 8000 samples/s.
+#define EVRC_SAMPLE_RATE 8000
+
+class EVRCTrackMetadata : public AudioTrackMetadata {
+public:
+ // AudioTrackMetadata members
+ //
+ // The number of sample sets generates by encoder is variant. So the
+ // frame duration and frame size are both 0.
+ uint32_t GetAudioFrameDuration() override { return 0; }
+ uint32_t GetAudioFrameSize() override { return 0; }
+ uint32_t GetAudioSampleRate() override { return EVRC_SAMPLE_RATE; }
+ uint32_t GetAudioChannels() override { return mChannels; }
+
+ // TrackMetadataBase member
+ MetadataKind GetKind() const override { return METADATA_EVRC; }
+
+ // EVRCTrackMetadata members
+ EVRCTrackMetadata()
+ : mChannels(0) {
+ MOZ_COUNT_CTOR(EVRCTrackMetadata);
+ }
+ ~EVRCTrackMetadata() { MOZ_COUNT_DTOR(EVRCTrackMetadata); }
+
+ uint32_t mChannels; // Channel number, it should be 1 or 2.
+};
+
+}
+
+#endif // ISOTrackMetadata_h_
diff --git a/dom/media/encoder/fmp4_muxer/MP4ESDS.cpp b/dom/media/encoder/fmp4_muxer/MP4ESDS.cpp
new file mode 100644
index 000000000..72880b5cb
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/MP4ESDS.cpp
@@ -0,0 +1,138 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <climits>
+#include "ISOControl.h"
+#include "ISOMediaBoxes.h"
+#include "MP4ESDS.h"
+
+namespace mozilla {
+
+nsresult
+MP4AudioSampleEntry::Generate(uint32_t* aBoxSize)
+{
+ uint32_t box_size;
+ nsresult rv = es->Generate(&box_size);
+ NS_ENSURE_SUCCESS(rv, rv);
+ size += box_size;
+
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+MP4AudioSampleEntry::Write()
+{
+ BoxSizeChecker checker(mControl, size);
+ nsresult rv;
+ rv = AudioSampleEntry::Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = es->Write();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+}
+
+MP4AudioSampleEntry::MP4AudioSampleEntry(ISOControl* aControl)
+ : AudioSampleEntry(NS_LITERAL_CSTRING("mp4a"), aControl)
+{
+ es = new ESDBox(aControl);
+ MOZ_COUNT_CTOR(MP4AudioSampleEntry);
+}
+
+MP4AudioSampleEntry::~MP4AudioSampleEntry()
+{
+ MOZ_COUNT_DTOR(MP4AudioSampleEntry);
+}
+
+nsresult
+ESDBox::Generate(uint32_t* aBoxSize)
+{
+ uint32_t box_size;
+ es_descriptor->Generate(&box_size);
+ size += box_size;
+ *aBoxSize = size;
+ return NS_OK;
+}
+
+nsresult
+ESDBox::Write()
+{
+ WRITE_FULLBOX(mControl, size)
+ es_descriptor->Write();
+ return NS_OK;
+}
+
+ESDBox::ESDBox(ISOControl* aControl)
+ : FullBox(NS_LITERAL_CSTRING("esds"), 0, 0, aControl)
+{
+ es_descriptor = new ES_Descriptor(aControl);
+ MOZ_COUNT_CTOR(ESDBox);
+}
+
+ESDBox::~ESDBox()
+{
+ MOZ_COUNT_DTOR(ESDBox);
+}
+
+nsresult
+ES_Descriptor::Find(const nsACString& aType,
+ nsTArray<RefPtr<MuxerOperation>>& aOperations)
+{
+ // ES_Descriptor is not a real ISOMediaBox, so we return nothing here.
+ return NS_OK;
+}
+
+nsresult
+ES_Descriptor::Write()
+{
+ mControl->Write(tag);
+ mControl->Write(length);
+ mControl->Write(ES_ID);
+ mControl->WriteBits(streamDependenceFlag.to_ulong(), streamDependenceFlag.size());
+ mControl->WriteBits(URL_Flag.to_ulong(), URL_Flag.size());
+ mControl->WriteBits(reserved.to_ulong(), reserved.size());
+ mControl->WriteBits(streamPriority.to_ulong(), streamPriority.size());
+ mControl->Write(DecodeSpecificInfo.Elements(), DecodeSpecificInfo.Length());
+
+ return NS_OK;
+}
+
+nsresult
+ES_Descriptor::Generate(uint32_t* aBoxSize)
+{
+ nsresult rv;
+ // 14496-1 '8.3.4 DecoderConfigDescriptor'
+ // 14496-1 '10.2.3 SL Packet Header Configuration'
+ FragmentBuffer* frag = mControl->GetFragment(Audio_Track);
+ rv = frag->GetCSD(DecodeSpecificInfo);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ length = sizeof(ES_ID) + 1;
+ length += DecodeSpecificInfo.Length();
+
+ *aBoxSize = sizeof(tag) + sizeof(length) + length;
+ return NS_OK;
+}
+
+ES_Descriptor::ES_Descriptor(ISOControl* aControl)
+ : tag(ESDescrTag)
+ , length(0)
+ , ES_ID(0)
+ , streamDependenceFlag(0)
+ , URL_Flag(0)
+ , reserved(0)
+ , streamPriority(0)
+ , mControl(aControl)
+{
+ MOZ_COUNT_CTOR(ES_Descriptor);
+}
+
+ES_Descriptor::~ES_Descriptor()
+{
+ MOZ_COUNT_DTOR(ES_Descriptor);
+}
+
+}
diff --git a/dom/media/encoder/fmp4_muxer/MP4ESDS.h b/dom/media/encoder/fmp4_muxer/MP4ESDS.h
new file mode 100644
index 000000000..ee91312c1
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/MP4ESDS.h
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MP4ESDS_h_
+#define MP4ESDS_h_
+
+#include "nsTArray.h"
+#include "MuxerOperation.h"
+
+namespace mozilla {
+
+class ISOControl;
+
+/**
+ * ESDS tag
+ */
+#define ESDescrTag 0x03
+
+/**
+ * 14496-1 '8.3.3 ES_Descriptor'.
+ * It will get DecoderConfigDescriptor and SLConfigDescriptor from
+ * AAC CSD data.
+ */
+class ES_Descriptor : public MuxerOperation {
+public:
+ // ISO BMFF members
+ uint8_t tag; // ESDescrTag
+ uint8_t length;
+ uint16_t ES_ID;
+ std::bitset<1> streamDependenceFlag;
+ std::bitset<1> URL_Flag;
+ std::bitset<1> reserved;
+ std::bitset<5> streamPriority;
+
+ nsTArray<uint8_t> DecodeSpecificInfo;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+ nsresult Find(const nsACString& aType,
+ nsTArray<RefPtr<MuxerOperation>>& aOperations) override;
+
+ // ES_Descriptor methods
+ ES_Descriptor(ISOControl* aControl);
+ ~ES_Descriptor();
+
+protected:
+ ISOControl* mControl;
+};
+
+// 14496-14 5.6 'Sample Description Boxes'
+// Box type: 'esds'
+class ESDBox : public FullBox {
+public:
+ // ISO BMFF members
+ RefPtr<ES_Descriptor> es_descriptor;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // ESDBox methods
+ ESDBox(ISOControl* aControl);
+ ~ESDBox();
+};
+
+// 14496-14 5.6 'Sample Description Boxes'
+// Box type: 'mp4a'
+class MP4AudioSampleEntry : public AudioSampleEntry {
+public:
+ // ISO BMFF members
+ RefPtr<ESDBox> es;
+
+ // MuxerOperation methods
+ nsresult Generate(uint32_t* aBoxSize) override;
+ nsresult Write() override;
+
+ // MP4AudioSampleEntry methods
+ MP4AudioSampleEntry(ISOControl* aControl);
+ ~MP4AudioSampleEntry();
+};
+
+}
+
+#endif // MP4ESDS_h_
diff --git a/dom/media/encoder/fmp4_muxer/MuxerOperation.h b/dom/media/encoder/fmp4_muxer/MuxerOperation.h
new file mode 100644
index 000000000..0b83c89b0
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/MuxerOperation.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsString.h"
+#include "nsTArray.h"
+
+#ifndef MuxerOperation_h_
+#define MuxerOperation_h_
+
+namespace mozilla {
+
+/**
+ * The interface for ISO box. All Boxes inherit from this interface.
+ * Generate() and Write() are needed to be called to produce a complete box.
+ *
+ * Generate() will generate all the data structures and their size.
+ *
+ * Write() will write all data into muxing output stream (ISOControl actually)
+ * and update the data which can't be known at Generate() (for example, the
+ * offset of the video data in mp4 file).
+ *
+ * ISO base media format is composed of several container boxes and the contained
+ * boxes. The container boxes hold a list of MuxerOperation which is implemented
+ * by contained boxes. The contained boxes will be called via the list.
+ * For example:
+ * MovieBox (container) ---> boxes (array of MuxerOperation)
+ * |---> MovieHeaderBox (full box)
+ * |---> TrakBox (container)
+ * |---> MovieExtendsBox (container)
+ *
+ * The complete box structure can be found at 14496-12 E.2 "The‘isom’brand".
+ */
+class MuxerOperation {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MuxerOperation)
+
+ // Generate data of this box and its contained box, and calculate box size.
+ virtual nsresult Generate(uint32_t* aBoxSize) = 0;
+
+ // Write data to stream.
+ virtual nsresult Write() = 0;
+
+ // Find the box type via its name (name is the box type defined in 14496-12;
+ // for example, 'moov' is the name of MovieBox).
+ // It can only look child boxes including itself and the box in the boxes
+ // list if exists. It can't look parent boxes.
+ virtual nsresult Find(const nsACString& aType,
+ nsTArray<RefPtr<MuxerOperation>>& aOperations) = 0;
+
+protected:
+ virtual ~MuxerOperation() {}
+};
+
+}
+#endif
diff --git a/dom/media/encoder/fmp4_muxer/moz.build b/dom/media/encoder/fmp4_muxer/moz.build
new file mode 100644
index 000000000..5ff274be5
--- /dev/null
+++ b/dom/media/encoder/fmp4_muxer/moz.build
@@ -0,0 +1,22 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'ISOMediaWriter.h',
+ 'ISOTrackMetadata.h',
+]
+
+UNIFIED_SOURCES += [
+ 'AMRBox.cpp',
+ 'AVCBox.cpp',
+ 'EVRCBox.cpp',
+ 'ISOControl.cpp',
+ 'ISOMediaBoxes.cpp',
+ 'ISOMediaWriter.cpp',
+ 'MP4ESDS.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/encoder/moz.build b/dom/media/encoder/moz.build
new file mode 100644
index 000000000..0d5cdc16f
--- /dev/null
+++ b/dom/media/encoder/moz.build
@@ -0,0 +1,56 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+with Files('*'):
+ BUG_COMPONENT = ('Core', 'Video/Audio: Recording')
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
+ DIRS += ['fmp4_muxer']
+
+EXPORTS += [
+ 'ContainerWriter.h',
+ 'EncodedFrameContainer.h',
+ 'MediaEncoder.h',
+ 'OpusTrackEncoder.h',
+ 'TrackEncoder.h',
+ 'TrackMetadataBase.h',
+]
+
+UNIFIED_SOURCES += [
+ 'MediaEncoder.cpp',
+ 'OpusTrackEncoder.cpp',
+ 'TrackEncoder.cpp',
+]
+
+if CONFIG['MOZ_WEBM_ENCODER']:
+ EXPORTS += ['VP8TrackEncoder.h',
+ ]
+ UNIFIED_SOURCES += ['VP8TrackEncoder.cpp',
+ ]
+ LOCAL_INCLUDES += ['/media/libyuv/include']
+
+FINAL_LIBRARY = 'xul'
+
+# These includes are from Android JB, for use of MediaCodec.
+LOCAL_INCLUDES += ['/ipc/chromium/src']
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and CONFIG['ANDROID_VERSION'] > '15':
+ LOCAL_INCLUDES += [
+ '%' + '%s/%s' % (CONFIG['ANDROID_SOURCE'], d) for d in [
+ 'frameworks/av/include/media',
+ 'frameworks/native/include',
+ 'frameworks/native/opengl/include',
+ ]
+
+ ]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+# Suppress some GCC warnings being treated as errors:
+# - about attributes on forward declarations for types that are already
+# defined, which complains about an important MOZ_EXPORT for android::AString
+if CONFIG['GNU_CC']:
+ CXXFLAGS += ['-Wno-error=attributes']
diff --git a/dom/media/flac/FlacDecoder.cpp b/dom/media/flac/FlacDecoder.cpp
new file mode 100644
index 000000000..3109713db
--- /dev/null
+++ b/dom/media/flac/FlacDecoder.cpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FlacDecoder.h"
+#include "FlacDemuxer.h"
+#include "MediaDecoderStateMachine.h"
+#include "MediaFormatReader.h"
+#include "MediaPrefs.h"
+
+namespace mozilla {
+
+MediaDecoder*
+FlacDecoder::Clone(MediaDecoderOwner* aOwner)
+{
+ if (!IsEnabled())
+ return nullptr;
+
+ return new FlacDecoder(aOwner);
+}
+
+MediaDecoderStateMachine*
+FlacDecoder::CreateStateMachine()
+{
+ RefPtr<MediaDecoderReader> reader =
+ new MediaFormatReader(this, new FlacDemuxer(GetResource()));
+ return new MediaDecoderStateMachine(this, reader);
+}
+
+/* static */ bool
+FlacDecoder::IsEnabled()
+{
+#ifdef MOZ_FFVPX
+ return MediaPrefs::FlacEnabled();
+#else
+ // Until bug 1295886 is fixed.
+ return false;
+#endif
+}
+
+/* static */ bool
+FlacDecoder::CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs)
+{
+ return IsEnabled() &&
+ (aType.EqualsASCII("audio/flac") || aType.EqualsASCII("audio/x-flac") ||
+ aType.EqualsASCII("application/x-flac"));
+}
+
+} // namespace mozilla
diff --git a/dom/media/flac/FlacDecoder.h b/dom/media/flac/FlacDecoder.h
new file mode 100644
index 000000000..304ee62f8
--- /dev/null
+++ b/dom/media/flac/FlacDecoder.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FLAC_DECODER_H_
+#define FLAC_DECODER_H_
+
+#include "MediaDecoder.h"
+
+namespace mozilla {
+
+class FlacDecoder : public MediaDecoder {
+public:
+ // MediaDecoder interface.
+ explicit FlacDecoder(MediaDecoderOwner* aOwner) : MediaDecoder(aOwner) {}
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override;
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // Returns true if the Flac backend is pref'ed on, and we're running on a
+ // platform that is likely to have decoders for the format.
+ static bool IsEnabled();
+ static bool CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs);
+};
+
+} // namespace mozilla
+
+#endif // !FLAC_DECODER_H_
diff --git a/dom/media/flac/FlacDemuxer.cpp b/dom/media/flac/FlacDemuxer.cpp
new file mode 100644
index 000000000..7a98edbee
--- /dev/null
+++ b/dom/media/flac/FlacDemuxer.cpp
@@ -0,0 +1,1074 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FlacDemuxer.h"
+
+#include "mozilla/Maybe.h"
+#include "mp4_demuxer/BitReader.h"
+#include "nsAutoPtr.h"
+#include "prenv.h"
+#include "FlacFrameParser.h"
+#include "VideoUtils.h"
+#include "TimeUnits.h"
+
+#ifdef PR_LOGGING
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+#define LOG(msg, ...) \
+ MOZ_LOG(gMediaDemuxerLog, LogLevel::Debug, ("FlacDemuxer " msg, ##__VA_ARGS__))
+#define LOGV(msg, ...) \
+ MOZ_LOG(gMediaDemuxerLog, LogLevel::Verbose, ("FlacDemuxer " msg, ##__VA_ARGS__))
+#else
+#define LOG(msg, ...) do {} while (false)
+#define LOGV(msg, ...) do {} while (false)
+#endif
+
+using namespace mozilla::media;
+
+namespace mozilla {
+namespace flac {
+
+// flac::FrameHeader - Holds the flac frame header and its parsing
+// state.
+
+#define FLAC_MAX_CHANNELS 8
+#define FLAC_MIN_BLOCKSIZE 16
+#define FLAC_MAX_BLOCKSIZE 65535
+#define FLAC_MIN_FRAME_SIZE 11
+#define FLAC_MAX_FRAME_HEADER_SIZE 16
+#define FLAC_MAX_FRAME_SIZE (FLAC_MAX_FRAME_HEADER_SIZE \
+ +FLAC_MAX_BLOCKSIZE*FLAC_MAX_CHANNELS*3)
+
+class FrameHeader {
+public:
+ const AudioInfo& Info() const { return mInfo; }
+
+ uint32_t Size() const { return mSize; }
+
+ bool IsValid() const { return mValid; }
+
+ // Return the index (in samples) from the beginning of the track.
+ int64_t Index() const { return mIndex; }
+
+ // Parse the current packet and check that it made a valid flac frame header.
+ // From https://xiph.org/flac/format.html#frame_header
+ // A valid header is one that can be decoded without error and that has a
+ // valid CRC.
+ // aPacket must points to a buffer that is at least FLAC_MAX_FRAME_HEADER_SIZE
+ // bytes.
+ bool Parse(const uint8_t* aPacket)
+ {
+ mp4_demuxer::BitReader br(aPacket, FLAC_MAX_FRAME_HEADER_SIZE);
+
+ // Frame sync code.
+ if ((br.ReadBits(15) & 0x7fff) != 0x7ffc) {
+ return false;
+ }
+
+ // Variable block size stream code.
+ mVariableBlockSize = br.ReadBit();
+
+ // Block size and sample rate codes.
+ int bs_code = br.ReadBits(4);
+ int sr_code = br.ReadBits(4);
+
+ // Channels and decorrelation.
+ int ch_mode = br.ReadBits(4);
+ if (ch_mode < FLAC_MAX_CHANNELS) {
+ mInfo.mChannels = ch_mode + 1;
+ } else if (ch_mode < FLAC_MAX_CHANNELS + FLAC_CHMODE_MID_SIDE) {
+ // This is a special flac channels, we can't handle those yet. Treat it
+ // as stereo.
+ mInfo.mChannels = 2;
+ } else {
+ // invalid channel mode
+ return false;
+ }
+
+ // Bits per sample.
+ int bps_code = br.ReadBits(3);
+ if (bps_code == 3 || bps_code == 7) {
+ // Invalid sample size code.
+ return false;
+ }
+ mInfo.mBitDepth = FlacSampleSizeTable[bps_code];
+
+ // Reserved bit, most be 1.
+ if (br.ReadBit()) {
+ // Broken stream, invalid padding.
+ return false;
+ }
+
+ // Sample or frame count.
+ int64_t frame_or_sample_num = br.ReadUTF8();
+ if (frame_or_sample_num < 0) {
+ // Sample/frame number invalid.
+ return false;
+ }
+
+ // Blocksize
+ if (bs_code == 0) {
+ // reserved blocksize code
+ return false;
+ } else if (bs_code == 6) {
+ mBlocksize = br.ReadBits(8) + 1;
+ } else if (bs_code == 7) {
+ mBlocksize = br.ReadBits(16) + 1;
+ } else {
+ mBlocksize = FlacBlocksizeTable[bs_code];
+ }
+
+ // The sample index is either:
+ // 1- coded sample number if blocksize is variable or
+ // 2- coded frame number if blocksize is known.
+ // A frame is made of Blocksize sample.
+ mIndex = mVariableBlockSize
+ ? frame_or_sample_num
+ : frame_or_sample_num * mBlocksize;
+
+ // Sample rate.
+ if (sr_code < 12) {
+ mInfo.mRate = FlacSampleRateTable[sr_code];
+ } else if (sr_code == 12) {
+ mInfo.mRate = br.ReadBits(8) * 1000;
+ } else if (sr_code == 13) {
+ mInfo.mRate = br.ReadBits(16);
+ } else if (sr_code == 14) {
+ mInfo.mRate = br.ReadBits(16) * 10;
+ } else {
+ // Illegal sample rate code.
+ return false;
+ }
+
+ // Header CRC-8 check.
+ uint8_t crc = 0;
+ for (uint32_t i = 0; i < br.BitCount() / 8; i++) {
+ crc = CRC8Table[crc ^ aPacket[i]];
+ }
+ mValid = crc == br.ReadBits(8);
+ mSize = br.BitCount() / 8;
+
+ if (mValid) {
+ // Set the mimetype to make it a valid AudioInfo.
+ mInfo.mMimeType = "audio/flac";
+ }
+
+ return mValid;
+ }
+
+private:
+ friend class Frame;
+ enum {
+ FLAC_CHMODE_INDEPENDENT = 0,
+ FLAC_CHMODE_LEFT_SIDE,
+ FLAC_CHMODE_RIGHT_SIDE,
+ FLAC_CHMODE_MID_SIDE,
+ };
+ AudioInfo mInfo;
+ // Index in samples from start;
+ int64_t mIndex = 0;
+ bool mVariableBlockSize = false;
+ uint32_t mBlocksize = 0;;
+ uint32_t mSize = 0;
+ bool mValid = false;
+
+ static const int FlacSampleRateTable[16];
+ static const int32_t FlacBlocksizeTable[16];
+ static const uint8_t FlacSampleSizeTable[8];
+ static const uint8_t CRC8Table[256];
+};
+
+const int FrameHeader::FlacSampleRateTable[16] =
+{ 0,
+ 88200, 176400, 192000,
+ 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
+ 0, 0, 0, 0
+};
+
+const int32_t FrameHeader::FlacBlocksizeTable[16] =
+{
+ 0 , 192 , 576<<0, 576<<1, 576<<2, 576<<3, 0, 0,
+ 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
+};
+
+const uint8_t FrameHeader::FlacSampleSizeTable[8] = { 0, 8, 12, 0, 16, 20, 24, 0 };
+
+const uint8_t FrameHeader::CRC8Table[256] =
+{
+ 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
+ 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
+ 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
+ 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
+ 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
+ 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
+ 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
+ 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
+ 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
+ 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
+ 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
+ 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
+ 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
+ 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
+ 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
+ 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
+ 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
+ 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
+ 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
+ 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
+ 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
+ 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
+ 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
+ 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
+ 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
+ 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
+ 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
+ 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
+ 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
+ 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
+ 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
+ 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
+};
+
+// flac::Frame - Frame meta container used to parse and hold a frame
+// header and side info.
+class Frame {
+public:
+
+ // The FLAC signature is made of 14 bits set to 1; however the 15th bit is
+ // mandatorily set to 0, so we need to find either of 0xfffc or 0xfffd 2-bytes
+ // signature. We first use a bitmask to see if 0xfc or 0xfd is present. And if
+ // so we check for the whole signature.
+ // aData must be pointing to a buffer at least
+ // aLength + FLAC_MAX_FRAME_HEADER_SIZE bytes.
+ int64_t FindNext(const uint8_t* aData, const uint32_t aLength)
+ {
+ uint32_t modOffset = aLength % 4;
+ uint32_t i, j;
+
+ for (i = 0; i < modOffset; i++) {
+ if ((BigEndian::readUint16(aData + i) & 0xfffe) == 0xfff8) {
+ if (mHeader.Parse(aData + i)) {
+ return i;
+ }
+ }
+ }
+
+ for (; i < aLength; i += 4) {
+ uint32_t x = BigEndian::readUint32(aData + i);
+ if (((x & ~(x + 0x01010101)) & 0x80808080)) {
+ for (j = 0; j < 4; j++) {
+ if ((BigEndian::readUint16(aData + i + j) & 0xfffe) == 0xfff8) {
+ if (mHeader.Parse(aData + i + j)) {
+ return i + j;
+ }
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ // Find the next frame start in the current resource.
+ // On exit return true, offset is set and resource points to the frame found.
+ bool FindNext(MediaResourceIndex& aResource)
+ {
+ static const int BUFFER_SIZE = 4096;
+
+ Reset();
+
+ nsTArray<char> buffer;
+ int64_t originalOffset = aResource.Tell();
+ int64_t offset = originalOffset;
+ uint32_t innerOffset = 0;
+
+ do {
+ uint32_t read = 0;
+ buffer.SetLength(BUFFER_SIZE + innerOffset);
+ nsresult rv =
+ aResource.Read(buffer.Elements() + innerOffset, BUFFER_SIZE, &read);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ if (read < FLAC_MAX_FRAME_HEADER_SIZE) {
+ // Assume that we can't have a valid frame in such small content, we
+ // must have reached EOS.
+ // So we're done.
+ mEOS = true;
+ return false;
+ }
+
+ const size_t bufSize = read + innerOffset - FLAC_MAX_FRAME_HEADER_SIZE;
+ int64_t foundOffset =
+ FindNext(reinterpret_cast<uint8_t*>(buffer.Elements()), bufSize);
+
+ if (foundOffset >= 0) {
+ SetOffset(aResource, foundOffset + offset);
+ return true;
+ }
+
+ // Scan the next block;
+ offset += bufSize;
+ buffer.RemoveElementsAt(0, bufSize);
+ innerOffset = buffer.Length();
+ } while (offset - originalOffset < FLAC_MAX_FRAME_SIZE);
+
+ return false;
+ }
+
+ int64_t Offset() const { return mOffset; }
+
+ const AudioInfo& Info() const { return Header().Info(); }
+
+ void SetEndOffset(int64_t aOffset) { mSize = aOffset - mOffset; }
+
+ void SetEndTime(int64_t aIndex)
+ {
+ if (aIndex > Header().mIndex) {
+ mDuration = aIndex - Header().mIndex;
+ }
+ }
+
+ uint32_t Size() const { return mSize; }
+
+ TimeUnit Time() const
+ {
+ if (!IsValid()) {
+ return TimeUnit::Invalid();
+ }
+ MOZ_ASSERT(Header().Info().mRate, "Invalid Frame. Need Header");
+ return FramesToTimeUnit(Header().mIndex, Header().Info().mRate);
+ }
+
+ TimeUnit Duration() const
+ {
+ if (!IsValid()) {
+ return TimeUnit();
+ }
+ MOZ_ASSERT(Header().Info().mRate, "Invalid Frame. Need Header");
+ return FramesToTimeUnit(mDuration, Header().Info().mRate);
+ }
+
+ // Returns the parsed frame header.
+ const FrameHeader& Header() const { return mHeader; }
+
+ bool IsValid() const { return mHeader.IsValid(); }
+
+ bool EOS() const { return mEOS; }
+
+ void SetRate(uint32_t aRate) { mHeader.mInfo.mRate = aRate; };
+
+ void SetBitDepth(uint32_t aBitDepth) { mHeader.mInfo.mBitDepth = aBitDepth; }
+
+ void SetInvalid() { mHeader.mValid = false; }
+
+ // Resets the frame header and data.
+ void Reset() { *this = Frame(); }
+
+private:
+ void SetOffset(MediaResourceIndex& aResource, int64_t aOffset)
+ {
+ mOffset = aOffset;
+ aResource.Seek(SEEK_SET, mOffset);
+ }
+
+ // The offset to the start of the header.
+ int64_t mOffset = 0;
+ uint32_t mSize = 0;
+ uint32_t mDuration = 0;
+ bool mEOS = false;
+
+ // The currently parsed frame header.
+ FrameHeader mHeader;
+
+};
+
+class FrameParser {
+public:
+
+ // Returns the currently parsed frame. Reset via EndFrameSession.
+ const Frame& CurrentFrame() const { return mFrame; }
+
+ // Returns the first parsed frame.
+ const Frame& FirstFrame() const { return mFirstFrame; }
+
+ // Clear the last parsed frame to allow for next frame parsing
+ void EndFrameSession()
+ {
+ mNextFrame.Reset();
+ mFrame.Reset();
+ }
+
+ // Attempt to find the next frame.
+ bool FindNextFrame(MediaResourceIndex& aResource)
+ {
+ mFrame = mNextFrame;
+ if (GetNextFrame(aResource)) {
+ if (!mFrame.IsValid()) {
+ mFrame = mNextFrame;
+ // We need two frames to be able to start playing (or have reached EOS).
+ GetNextFrame(aResource);
+ }
+ }
+
+ if (mFrame.IsValid()) {
+ if (mNextFrame.EOS()) {
+ mFrame.SetEndOffset(aResource.Tell());
+ } else if (mNextFrame.IsValid()) {
+ mFrame.SetEndOffset(mNextFrame.Offset());
+ mFrame.SetEndTime(mNextFrame.Header().Index());
+ }
+ }
+
+ if (!mFirstFrame.IsValid()) {
+ mFirstFrame = mFrame;
+ }
+ return mFrame.IsValid();
+ }
+
+ // Convenience methods to external FlacFrameParser ones.
+ bool IsHeaderBlock(const uint8_t* aPacket, size_t aLength) const
+ {
+ return mParser.IsHeaderBlock(aPacket, aLength);
+ }
+
+ uint32_t HeaderBlockLength(const uint8_t* aPacket) const
+ {
+ return mParser.HeaderBlockLength(aPacket);
+ }
+
+ bool DecodeHeaderBlock(const uint8_t* aPacket, size_t aLength)
+ {
+ return mParser.DecodeHeaderBlock(aPacket, aLength);
+ }
+
+ bool HasFullMetadata() const { return mParser.HasFullMetadata(); }
+
+ AudioInfo Info() const { return mParser.mInfo; }
+
+ // Return a hash table with tag metadata.
+ MetadataTags* GetTags() const { return mParser.GetTags(); }
+
+private:
+ bool GetNextFrame(MediaResourceIndex& aResource)
+ {
+ while (mNextFrame.FindNext(aResource)) {
+ // Move our offset slightly, so that we don't find the same frame at the
+ // next FindNext call.
+ aResource.Seek(SEEK_CUR, mNextFrame.Header().Size());
+ if (mFrame.IsValid()
+ && mNextFrame.Offset() - mFrame.Offset() < FLAC_MAX_FRAME_SIZE
+ && !CheckCRC16AtOffset(mFrame.Offset(),
+ mNextFrame.Offset(),
+ aResource)) {
+ // The frame doesn't match its CRC or would be too far, skip it..
+ continue;
+ }
+ CheckFrameData();
+ break;
+ }
+ return mNextFrame.IsValid();
+ }
+
+ bool CheckFrameData()
+ {
+ if (mNextFrame.Header().Info().mRate == 0
+ || mNextFrame.Header().Info().mBitDepth == 0) {
+ if (!Info().IsValid()) {
+ // We can only use the STREAMINFO data if we have one.
+ mNextFrame.SetInvalid();
+ } else {
+ if (mNextFrame.Header().Info().mRate == 0) {
+ mNextFrame.SetRate(Info().mRate);
+ }
+ if (mNextFrame.Header().Info().mBitDepth == 0) {
+ mNextFrame.SetBitDepth(Info().mBitDepth);
+ }
+ }
+ }
+ return mNextFrame.IsValid();
+ }
+
+ bool CheckCRC16AtOffset(int64_t aStart, int64_t aEnd,
+ MediaResourceIndex& aResource) const
+ {
+ int64_t size = aEnd - aStart;
+ if (size <= 0) {
+ return false;
+ }
+ UniquePtr<char[]> buffer(new char[size]);
+ uint32_t read = 0;
+ if (NS_FAILED(aResource.ReadAt(aStart, buffer.get(),
+ size, &read))
+ || read != size) {
+ NS_WARNING("Couldn't read frame content");
+ return false;
+ }
+
+ uint16_t crc = 0;
+ uint8_t* buf = reinterpret_cast<uint8_t*>(buffer.get());
+ const uint8_t *end = buf + size;
+ while (buf < end) {
+ crc = CRC16Table[((uint8_t)crc) ^ *buf++] ^ (crc >> 8);
+ }
+ return !crc;
+ }
+
+ const uint16_t CRC16Table[256] =
+ {
+ 0x0000, 0x0580, 0x0F80, 0x0A00, 0x1B80, 0x1E00, 0x1400, 0x1180,
+ 0x3380, 0x3600, 0x3C00, 0x3980, 0x2800, 0x2D80, 0x2780, 0x2200,
+ 0x6380, 0x6600, 0x6C00, 0x6980, 0x7800, 0x7D80, 0x7780, 0x7200,
+ 0x5000, 0x5580, 0x5F80, 0x5A00, 0x4B80, 0x4E00, 0x4400, 0x4180,
+ 0xC380, 0xC600, 0xCC00, 0xC980, 0xD800, 0xDD80, 0xD780, 0xD200,
+ 0xF000, 0xF580, 0xFF80, 0xFA00, 0xEB80, 0xEE00, 0xE400, 0xE180,
+ 0xA000, 0xA580, 0xAF80, 0xAA00, 0xBB80, 0xBE00, 0xB400, 0xB180,
+ 0x9380, 0x9600, 0x9C00, 0x9980, 0x8800, 0x8D80, 0x8780, 0x8200,
+ 0x8381, 0x8601, 0x8C01, 0x8981, 0x9801, 0x9D81, 0x9781, 0x9201,
+ 0xB001, 0xB581, 0xBF81, 0xBA01, 0xAB81, 0xAE01, 0xA401, 0xA181,
+ 0xE001, 0xE581, 0xEF81, 0xEA01, 0xFB81, 0xFE01, 0xF401, 0xF181,
+ 0xD381, 0xD601, 0xDC01, 0xD981, 0xC801, 0xCD81, 0xC781, 0xC201,
+ 0x4001, 0x4581, 0x4F81, 0x4A01, 0x5B81, 0x5E01, 0x5401, 0x5181,
+ 0x7381, 0x7601, 0x7C01, 0x7981, 0x6801, 0x6D81, 0x6781, 0x6201,
+ 0x2381, 0x2601, 0x2C01, 0x2981, 0x3801, 0x3D81, 0x3781, 0x3201,
+ 0x1001, 0x1581, 0x1F81, 0x1A01, 0x0B81, 0x0E01, 0x0401, 0x0181,
+ 0x0383, 0x0603, 0x0C03, 0x0983, 0x1803, 0x1D83, 0x1783, 0x1203,
+ 0x3003, 0x3583, 0x3F83, 0x3A03, 0x2B83, 0x2E03, 0x2403, 0x2183,
+ 0x6003, 0x6583, 0x6F83, 0x6A03, 0x7B83, 0x7E03, 0x7403, 0x7183,
+ 0x5383, 0x5603, 0x5C03, 0x5983, 0x4803, 0x4D83, 0x4783, 0x4203,
+ 0xC003, 0xC583, 0xCF83, 0xCA03, 0xDB83, 0xDE03, 0xD403, 0xD183,
+ 0xF383, 0xF603, 0xFC03, 0xF983, 0xE803, 0xED83, 0xE783, 0xE203,
+ 0xA383, 0xA603, 0xAC03, 0xA983, 0xB803, 0xBD83, 0xB783, 0xB203,
+ 0x9003, 0x9583, 0x9F83, 0x9A03, 0x8B83, 0x8E03, 0x8403, 0x8183,
+ 0x8002, 0x8582, 0x8F82, 0x8A02, 0x9B82, 0x9E02, 0x9402, 0x9182,
+ 0xB382, 0xB602, 0xBC02, 0xB982, 0xA802, 0xAD82, 0xA782, 0xA202,
+ 0xE382, 0xE602, 0xEC02, 0xE982, 0xF802, 0xFD82, 0xF782, 0xF202,
+ 0xD002, 0xD582, 0xDF82, 0xDA02, 0xCB82, 0xCE02, 0xC402, 0xC182,
+ 0x4382, 0x4602, 0x4C02, 0x4982, 0x5802, 0x5D82, 0x5782, 0x5202,
+ 0x7002, 0x7582, 0x7F82, 0x7A02, 0x6B82, 0x6E02, 0x6402, 0x6182,
+ 0x2002, 0x2582, 0x2F82, 0x2A02, 0x3B82, 0x3E02, 0x3402, 0x3182,
+ 0x1382, 0x1602, 0x1C02, 0x1982, 0x0802, 0x0D82, 0x0782, 0x0202,
+ };
+
+ FlacFrameParser mParser;
+ // We keep the first parsed frame around for static info access
+ // and the currently parsed frame.
+ Frame mFirstFrame;
+ Frame mNextFrame;
+ Frame mFrame;
+};
+
+} // namespace flac
+
+// FlacDemuxer
+
+FlacDemuxer::FlacDemuxer(MediaResource* aSource)
+ : mSource(aSource)
+{}
+
+bool
+FlacDemuxer::InitInternal()
+{
+ if (!mTrackDemuxer) {
+ mTrackDemuxer = new FlacTrackDemuxer(mSource);
+ }
+ return mTrackDemuxer->Init();
+}
+
+RefPtr<FlacDemuxer::InitPromise>
+FlacDemuxer::Init()
+{
+ if (!InitInternal()) {
+ LOG("Init() failure: waiting for data");
+
+ return InitPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ LOG("Init() successful");
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+bool
+FlacDemuxer::HasTrackType(TrackInfo::TrackType aType) const
+{
+ return aType == TrackInfo::kAudioTrack;
+}
+
+uint32_t
+FlacDemuxer::GetNumberTracks(TrackInfo::TrackType aType) const
+{
+ return (aType == TrackInfo::kAudioTrack) ? 1 : 0;
+}
+
+already_AddRefed<MediaTrackDemuxer>
+FlacDemuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber)
+{
+ if (!mTrackDemuxer) {
+ return nullptr;
+ }
+
+ return RefPtr<FlacTrackDemuxer>(mTrackDemuxer).forget();
+}
+
+bool
+FlacDemuxer::IsSeekable() const
+{
+ return mTrackDemuxer && mTrackDemuxer->IsSeekable();
+}
+
+// FlacTrackDemuxer
+FlacTrackDemuxer::FlacTrackDemuxer(MediaResource* aSource)
+ : mSource(aSource)
+ , mParser(new flac::FrameParser())
+ , mTotalFrameLen(0)
+{
+ Reset();
+}
+
+FlacTrackDemuxer::~FlacTrackDemuxer()
+{
+}
+
+bool
+FlacTrackDemuxer::Init()
+{
+ static const int BUFFER_SIZE = 4096;
+
+ // First check if we have a valid Flac start.
+ char buffer[BUFFER_SIZE];
+ const uint8_t* ubuffer = reinterpret_cast<uint8_t*>(buffer); // only needed due to type constraints of ReadAt.
+ int64_t offset = 0;
+
+ do {
+ uint32_t read = 0;
+ nsresult ret = mSource.ReadAt(offset, buffer, BUFFER_SIZE, &read);
+ if (NS_FAILED(ret) || read < BUFFER_SIZE) {
+ // Assume that if we can't read that many bytes while parsing the header,
+ // that something is wrong.
+ return false;
+ }
+ if (!mParser->IsHeaderBlock(ubuffer, BUFFER_SIZE)) {
+ // Not a header and we haven't reached the end of the metadata blocks.
+ // Will fall back to using the frames header instead.
+ break;
+ }
+ uint32_t sizeHeader = mParser->HeaderBlockLength(ubuffer);
+ RefPtr<MediaByteBuffer> block =
+ mSource.MediaReadAt(offset, sizeHeader);
+ if (!block || block->Length() != sizeHeader) {
+ break;
+ }
+ if (!mParser->DecodeHeaderBlock(block->Elements(), sizeHeader)) {
+ break;
+ }
+ offset += sizeHeader;
+ } while (!mParser->HasFullMetadata());
+
+ // First flac frame is found after the metadata.
+ // Can seek there immediately to avoid reparsing it all.
+ mSource.Seek(SEEK_SET, offset);
+
+ // Find the first frame to fully initialise our parser.
+ if (mParser->FindNextFrame(mSource)) {
+ // Ensure that the next frame returned will be the first.
+ mSource.Seek(SEEK_SET, mParser->FirstFrame().Offset());
+ mParser->EndFrameSession();
+ } else if (!mParser->Info().IsValid() || !mParser->FirstFrame().IsValid()) {
+ // We must find at least a frame to determine the metadata.
+ // We can't play this stream.
+ return false;
+ }
+
+ if (!mParser->Info().IsValid() || !mParser->Info().mDuration) {
+ // Check if we can look at the last frame for the end time to determine the
+ // duration when we don't have any.
+ TimeAtEnd();
+ }
+
+ return true;
+}
+
+UniquePtr<TrackInfo>
+FlacTrackDemuxer::GetInfo() const
+{
+ if (mParser->Info().IsValid()) {
+ // We have a proper metadata header.
+ UniquePtr<TrackInfo> info = mParser->Info().Clone();
+ nsAutoPtr<MetadataTags> tags(mParser->GetTags());
+ if (tags) {
+ for (auto iter = tags->Iter(); !iter.Done(); iter.Next()) {
+ info->mTags.AppendElement(MetadataTag(iter.Key(), iter.Data()));
+ }
+ }
+ return info;
+ } else if (mParser->FirstFrame().Info().IsValid()) {
+ // Use the first frame header.
+ UniquePtr<TrackInfo> info = mParser->FirstFrame().Info().Clone();
+ info->mDuration = Duration().ToMicroseconds();
+ return info;
+ }
+ return nullptr;
+}
+
+bool
+FlacTrackDemuxer::IsSeekable() const
+{
+ // For now we only allow seeking if a STREAMINFO block was found and with
+ // a known number of samples (duration is set).
+ return mParser->Info().IsValid() && mParser->Info().mDuration;
+}
+
+RefPtr<FlacTrackDemuxer::SeekPromise>
+FlacTrackDemuxer::Seek(TimeUnit aTime)
+{
+ // Efficiently seek to the position.
+ FastSeek(aTime);
+ // Correct seek position by scanning the next frames.
+ const TimeUnit seekTime = ScanUntil(aTime);
+
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+}
+
+TimeUnit
+FlacTrackDemuxer::FastSeek(const TimeUnit& aTime)
+{
+ LOG("FastSeek(%f) avgFrameLen=%f mParsedFramesDuration=%f offset=%lld",
+ aTime.ToSeconds(), AverageFrameLength(),
+ mParsedFramesDuration.ToSeconds(), GetResourceOffset());
+
+ // Invalidate current frames in the parser.
+ mParser->EndFrameSession();
+
+ if (!mParser->FirstFrame().IsValid()) {
+ // Something wrong, and there's nothing to seek to anyway, so we can
+ // do whatever here.
+ mSource.Seek(SEEK_SET, 0);
+ return TimeUnit();
+ }
+
+ if (aTime <= mParser->FirstFrame().Time()) {
+ // We're attempting to seek prior the first frame, return the first frame.
+ mSource.Seek(SEEK_SET, mParser->FirstFrame().Offset());
+ return mParser->FirstFrame().Time();
+ }
+
+ // We look for the seek position using a bisection search, starting where the
+ // estimated position might be using the average frame length.
+ // Typically, with flac such approximation is typically useless.
+
+ // Estimate where the position might be.
+ int64_t pivot =
+ aTime.ToSeconds() * AverageFrameLength() + mParser->FirstFrame().Offset();
+
+ // Time in seconds where we can stop seeking and will continue using ScanUntil.
+ static const int GAP_THRESHOLD = 5;
+ int64_t first = mParser->FirstFrame().Offset();
+ int64_t last = mSource.GetLength();
+ Maybe<int64_t> lastFoundOffset;
+ uint32_t iterations = 0;
+ TimeUnit timeSeekedTo;
+
+ do {
+ iterations++;
+ mSource.Seek(SEEK_SET, pivot);
+ flac::Frame frame;
+ if (!frame.FindNext(mSource)) {
+ NS_WARNING("We should have found a point");
+ break;
+ }
+ timeSeekedTo = frame.Time();
+
+ LOGV("FastSeek: interation:%u found:%f @ %lld",
+ iterations, timeSeekedTo.ToSeconds(), frame.Offset());
+
+ if (lastFoundOffset && lastFoundOffset.ref() == frame.Offset()) {
+ // Same frame found twice. We're done.
+ break;
+ }
+ lastFoundOffset = Some(frame.Offset());
+
+ if (frame.Time() == aTime) {
+ break;
+ }
+ if (aTime > frame.Time()
+ && aTime - frame.Time() <= TimeUnit::FromSeconds(GAP_THRESHOLD)) {
+ // We're close enough to the target, experimentation shows that bisection
+ // search doesn't help much after that.
+ break;
+ }
+ if (frame.Time() > aTime) {
+ last = pivot;
+ pivot -= (pivot - first) / 2;
+ } else {
+ first = pivot;
+ pivot += (last - pivot) / 2;
+ }
+ } while (true);
+
+ if (lastFoundOffset) {
+ mSource.Seek(SEEK_SET, lastFoundOffset.ref());
+ }
+
+ return timeSeekedTo;
+}
+
+TimeUnit
+FlacTrackDemuxer::ScanUntil(const TimeUnit& aTime)
+{
+ LOG("ScanUntil(%f avgFrameLen=%f mParsedFramesDuration=%f offset=%lld",
+ aTime.ToSeconds(), AverageFrameLength(),
+ mParsedFramesDuration.ToSeconds(), mParser->CurrentFrame().Offset());
+
+ if (!mParser->FirstFrame().IsValid()
+ || aTime <= mParser->FirstFrame().Time()) {
+ return FastSeek(aTime);
+ }
+
+ int64_t previousOffset = 0;
+ TimeUnit previousTime;
+ while (FindNextFrame().IsValid() && mParser->CurrentFrame().Time() < aTime) {
+ previousOffset = mParser->CurrentFrame().Offset();
+ previousTime = mParser->CurrentFrame().Time();
+ }
+
+ if (!mParser->CurrentFrame().IsValid()) {
+ // We reached EOS.
+ return Duration();
+ }
+
+ // Seek back to the last frame found prior the target.
+ mParser->EndFrameSession();
+ mSource.Seek(SEEK_SET, previousOffset);
+ return previousTime;
+}
+
+RefPtr<FlacTrackDemuxer::SamplesPromise>
+FlacTrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ LOGV("GetSamples(%d) Begin offset=%lld mParsedFramesDuration=%f"
+ " mTotalFrameLen=%llu",
+ aNumSamples, GetResourceOffset(), mParsedFramesDuration.ToSeconds(),
+ mTotalFrameLen);
+
+ if (!aNumSamples) {
+ return SamplesPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ RefPtr<SamplesHolder> frames = new SamplesHolder();
+
+ while (aNumSamples--) {
+ RefPtr<MediaRawData> frame(GetNextFrame(FindNextFrame()));
+ if (!frame)
+ break;
+
+ frames->mSamples.AppendElement(frame);
+ }
+
+ LOGV("GetSamples() End mSamples.Length=%u aNumSamples=%d offset=%lld"
+ " mParsedFramesDuration=%f mTotalFrameLen=%llu",
+ frames->mSamples.Length(), aNumSamples, GetResourceOffset(),
+ mParsedFramesDuration.ToSeconds(), mTotalFrameLen);
+
+ if (frames->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ }
+
+ return SamplesPromise::CreateAndResolve(frames, __func__);
+}
+
+void
+FlacTrackDemuxer::Reset()
+{
+ LOG("Reset()");
+ MOZ_ASSERT(mParser);
+ if (mParser->FirstFrame().IsValid()) {
+ mSource.Seek(SEEK_SET, mParser->FirstFrame().Offset());
+ } else {
+ mSource.Seek(SEEK_SET, 0);
+ }
+ mParser->EndFrameSession();
+}
+
+RefPtr<FlacTrackDemuxer::SkipAccessPointPromise>
+FlacTrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold)
+{
+ // Will not be called for audio-only resources.
+ return SkipAccessPointPromise::CreateAndReject(
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
+}
+
+int64_t
+FlacTrackDemuxer::GetResourceOffset() const
+{
+ return mSource.Tell();
+}
+
+TimeIntervals
+FlacTrackDemuxer::GetBuffered()
+{
+ TimeUnit duration = Duration();
+
+ if (duration <= TimeUnit()) {
+ return TimeIntervals();
+ }
+
+ // We could simply parse the cached data instead and read the timestamps.
+ // However, for now this will do.
+ AutoPinned<MediaResource> stream(mSource.GetResource());
+ return GetEstimatedBufferedTimeRanges(stream, duration.ToMicroseconds());
+}
+
+const flac::Frame&
+FlacTrackDemuxer::FindNextFrame()
+{
+ LOGV("FindNext() Begin offset=%lld mParsedFramesDuration=%f"
+ " mTotalFrameLen=%llu",
+ GetResourceOffset(), mParsedFramesDuration.ToSeconds(), mTotalFrameLen);
+
+ if (mParser->FindNextFrame(mSource)) {
+ // Update our current progress stats.
+ mParsedFramesDuration =
+ std::max(mParsedFramesDuration,
+ mParser->CurrentFrame().Time() - mParser->FirstFrame().Time()
+ + mParser->CurrentFrame().Duration());
+ mTotalFrameLen =
+ std::max<uint64_t>(mTotalFrameLen,
+ mParser->CurrentFrame().Offset()
+ - mParser->FirstFrame().Offset()
+ + mParser->CurrentFrame().Size());
+
+ LOGV("FindNext() End time=%f offset=%lld mParsedFramesDuration=%f"
+ " mTotalFrameLen=%llu",
+ mParser->CurrentFrame().Time().ToSeconds(), GetResourceOffset(),
+ mParsedFramesDuration.ToSeconds(), mTotalFrameLen);
+ }
+
+ return mParser->CurrentFrame();
+}
+
+already_AddRefed<MediaRawData>
+FlacTrackDemuxer::GetNextFrame(const flac::Frame& aFrame)
+{
+ if (!aFrame.IsValid()) {
+ LOG("GetNextFrame() EOS");
+ return nullptr;
+ }
+
+ LOG("GetNextFrame() Begin(time=%f offset=%lld size=%u)",
+ aFrame.Time().ToSeconds(), aFrame.Offset(), aFrame.Size());
+
+ const int64_t offset = aFrame.Offset();
+ const uint32_t size = aFrame.Size();
+
+ RefPtr<MediaRawData> frame = new MediaRawData();
+ frame->mOffset = offset;
+
+ nsAutoPtr<MediaRawDataWriter> frameWriter(frame->CreateWriter());
+ if (!frameWriter->SetSize(size)) {
+ LOG("GetNext() Exit failed to allocated media buffer");
+ return nullptr;
+ }
+
+ const uint32_t read = Read(frameWriter->Data(), offset, size);
+ if (read != size) {
+ LOG("GetNextFrame() Exit read=%u frame->Size=%u", read, frame->Size());
+ return nullptr;
+ }
+
+ frame->mTime = aFrame.Time().ToMicroseconds();
+ frame->mDuration = aFrame.Duration().ToMicroseconds();
+ frame->mTimecode = frame->mTime;
+ frame->mOffset = aFrame.Offset();
+ frame->mKeyframe = true;
+
+ MOZ_ASSERT(frame->mTime >= 0);
+ MOZ_ASSERT(frame->mDuration >= 0);
+
+ return frame.forget();
+}
+
+int32_t
+FlacTrackDemuxer::Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize)
+{
+ uint32_t read = 0;
+ const nsresult rv = mSource.ReadAt(aOffset, reinterpret_cast<char*>(aBuffer),
+ static_cast<uint32_t>(aSize), &read);
+ NS_ENSURE_SUCCESS(rv, 0);
+ return static_cast<int32_t>(read);
+}
+
+double
+FlacTrackDemuxer::AverageFrameLength() const
+{
+ if (mParsedFramesDuration.ToMicroseconds()) {
+ return mTotalFrameLen / mParsedFramesDuration.ToSeconds();
+ }
+
+ return 0.0;
+}
+
+TimeUnit
+FlacTrackDemuxer::Duration() const
+{
+ return std::max(mParsedFramesDuration,
+ TimeUnit::FromMicroseconds(mParser->Info().mDuration));
+}
+
+TimeUnit
+FlacTrackDemuxer::TimeAtEnd()
+{
+ // Scan the last 128kB if available to determine the last frame.
+ static const int OFFSET_FROM_END = 128 * 1024;
+
+ // Seek to the end of the file and attempt to find the last frame.
+ MediaResourceIndex source(mSource.GetResource());
+ TimeUnit previousDuration;
+ TimeUnit previousTime;
+
+ const int64_t streamLen = mSource.GetLength();
+ if (streamLen < 0) {
+ return TimeUnit::FromInfinity();
+ }
+
+ flac::FrameParser parser;
+
+ source.Seek(SEEK_SET, std::max<int64_t>(0LL, streamLen - OFFSET_FROM_END));
+ while (parser.FindNextFrame(source)) {
+ // FFmpeg flac muxer can generate a last frame with earlier than the others.
+ previousTime = std::max(previousTime, parser.CurrentFrame().Time());
+ if (parser.CurrentFrame().Duration() > TimeUnit()) {
+ // The last frame doesn't have a duration, so only update our duration
+ // if we do have one.
+ previousDuration = parser.CurrentFrame().Duration();
+ }
+ if (source.Tell() >= streamLen) {
+ // Limit the read, in case the length change half-way.
+ break;
+ }
+ }
+
+ // Update our current progress stats.
+ mParsedFramesDuration =
+ previousTime + previousDuration - mParser->FirstFrame().Time();
+ mTotalFrameLen = streamLen - mParser->FirstFrame().Offset();
+
+ return mParsedFramesDuration;
+}
+
+/* static */ bool
+FlacDemuxer::FlacSniffer(const uint8_t* aData, const uint32_t aLength)
+{
+ if (aLength < FLAC_MAX_FRAME_HEADER_SIZE) {
+ return false;
+ }
+
+ flac::Frame frame;
+ return frame.FindNext(aData, aLength - FLAC_MAX_FRAME_HEADER_SIZE) >= 0;
+}
+
+} // namespace mozilla
diff --git a/dom/media/flac/FlacDemuxer.h b/dom/media/flac/FlacDemuxer.h
new file mode 100644
index 000000000..fd0e35c94
--- /dev/null
+++ b/dom/media/flac/FlacDemuxer.h
@@ -0,0 +1,108 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FLAC_DEMUXER_H_
+#define FLAC_DEMUXER_H_
+
+#include "mozilla/Attributes.h"
+#include "MediaDataDemuxer.h"
+#include "MediaResource.h"
+namespace mozilla {
+
+namespace flac {
+class Frame;
+class FrameParser;
+}
+class FlacTrackDemuxer;
+
+
+class FlacDemuxer : public MediaDataDemuxer {
+public:
+ // MediaDataDemuxer interface.
+ explicit FlacDemuxer(MediaResource* aSource);
+ RefPtr<InitPromise> Init() override;
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(
+ TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
+ bool IsSeekable() const override;
+
+ // Return true if a valid flac frame header could be found.
+ static bool FlacSniffer(const uint8_t* aData, const uint32_t aLength);
+
+private:
+ bool InitInternal();
+
+ RefPtr<MediaResource> mSource;
+ RefPtr<FlacTrackDemuxer> mTrackDemuxer;
+};
+
+class FlacTrackDemuxer : public MediaTrackDemuxer {
+public:
+ explicit FlacTrackDemuxer(MediaResource* aSource);
+
+ // Initializes the track demuxer by reading the first frame for meta data.
+ // Returns initialization success state.
+ bool Init();
+
+ // MediaTrackDemuxer interface.
+ UniquePtr<TrackInfo> GetInfo() const override;
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+ void Reset() override;
+ int64_t GetResourceOffset() const override;
+ media::TimeIntervals GetBuffered() override;
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
+ media::TimeUnit aTimeThreshold) override;
+
+ bool IsSeekable() const;
+
+private:
+ // Destructor.
+ ~FlacTrackDemuxer();
+
+ // Returns the estimated stream duration, or a 0-duration if unknown.
+ media::TimeUnit Duration() const;
+ media::TimeUnit TimeAtEnd();
+
+ // Fast approximate seeking to given time.
+ media::TimeUnit FastSeek(const media::TimeUnit& aTime);
+
+ // Seeks by scanning the stream up to the given time for more accurate results.
+ media::TimeUnit ScanUntil(const media::TimeUnit& aTime);
+
+ // Finds the next valid frame and return it.
+ const flac::Frame& FindNextFrame();
+
+ // Returns the next ADTS frame, if available.
+ already_AddRefed<MediaRawData> GetNextFrame(const flac::Frame& aFrame);
+
+ // Reads aSize bytes into aBuffer from the source starting at aOffset.
+ // Returns the actual size read.
+ int32_t Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize);
+
+ // Returns the average frame length derived from the previously parsed frames.
+ double AverageFrameLength() const;
+
+ // The (hopefully) Flac resource.
+ MediaResourceIndex mSource;
+
+ // Flac frame parser used to detect frames and extract side info.
+ nsAutoPtr<flac::FrameParser> mParser;
+
+ // Total duration of parsed frames.
+ media::TimeUnit mParsedFramesDuration;
+
+ // Sum of parsed frames' lengths in bytes.
+ uint64_t mTotalFrameLen;
+
+ // Audio track config info.
+ UniquePtr<AudioInfo> mInfo;
+};
+
+} // mozilla
+
+#endif // !FLAC_DEMUXER_H_
diff --git a/dom/media/flac/FlacFrameParser.cpp b/dom/media/flac/FlacFrameParser.cpp
new file mode 100644
index 000000000..f2d6c1367
--- /dev/null
+++ b/dom/media/flac/FlacFrameParser.cpp
@@ -0,0 +1,251 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FlacFrameParser.h"
+#include "mp4_demuxer/ByteReader.h"
+#include "nsTArray.h"
+#include "OggCodecState.h"
+#include "OpusParser.h"
+#include "VideoUtils.h"
+
+using mp4_demuxer::ByteReader;
+
+namespace mozilla
+{
+
+#define OGG_FLAC_METADATA_TYPE_STREAMINFO 0x7F
+#define FLAC_STREAMINFO_SIZE 34
+
+#define BITMASK(x) ((1ULL << x)-1)
+
+enum
+{
+ FLAC_METADATA_TYPE_STREAMINFO = 0,
+ FLAC_METADATA_TYPE_PADDING,
+ FLAC_METADATA_TYPE_APPLICATION,
+ FLAC_METADATA_TYPE_SEEKTABLE,
+ FLAC_METADATA_TYPE_VORBIS_COMMENT,
+ FLAC_METADATA_TYPE_CUESHEET,
+ FLAC_METADATA_TYPE_PICTURE,
+ FLAC_METADATA_TYPE_INVALID = 127
+};
+
+FlacFrameParser::FlacFrameParser()
+ : mMinBlockSize(0)
+ , mMaxBlockSize(0)
+ , mMinFrameSize(0)
+ , mMaxFrameSize(0)
+ , mNumFrames(0)
+ , mFullMetadata(false)
+ , mPacketCount(0)
+{
+}
+
+FlacFrameParser::~FlacFrameParser()
+{
+}
+
+uint32_t
+FlacFrameParser::HeaderBlockLength(const uint8_t* aPacket) const
+{
+ uint32_t extra = 4;
+ if (aPacket[0] == 'f') {
+ // This must be the first block read, which contains the fLaC signature.
+ aPacket += 4;
+ extra += 4;
+ }
+ return (BigEndian::readUint32(aPacket) & BITMASK(24)) + extra;
+}
+
+bool
+FlacFrameParser::DecodeHeaderBlock(const uint8_t* aPacket, size_t aLength)
+{
+ if (aLength < 4 || aPacket[0] == 0xff) {
+ // Not a header block.
+ return false;
+ }
+ ByteReader br(aPacket, aLength);
+
+ mPacketCount++;
+
+ if (aPacket[0] == 'f') {
+ if (mPacketCount != 1 || memcmp(br.Read(4), "fLaC", 4) ||
+ br.Remaining() != FLAC_STREAMINFO_SIZE + 4) {
+ return false;
+ }
+ aPacket += 4;
+ aLength -= 4;
+ }
+ uint8_t blockHeader = br.ReadU8();
+ // blockType is a misnomer as it could indicate here either a packet type
+ // should it points to the start of a Flac in Ogg metadata, or an actual
+ // block type as per the flac specification.
+ uint32_t blockType = blockHeader & 0x7f;
+ bool lastBlock = blockHeader & 0x80;
+
+ if (blockType == OGG_FLAC_METADATA_TYPE_STREAMINFO) {
+ if (mPacketCount != 1 || memcmp(br.Read(4), "FLAC", 4) ||
+ br.Remaining() != FLAC_STREAMINFO_SIZE + 12) {
+ return false;
+ }
+ uint32_t major = br.ReadU8();
+ if (major != 1) {
+ // unsupported version;
+ return false;
+ }
+ br.ReadU8(); // minor version
+ mNumHeaders = Some(uint32_t(br.ReadU16()));
+ br.Read(4); // fLaC
+ blockType = br.ReadU8() & BITMASK(7);
+ // First METADATA_BLOCK_STREAMINFO
+ if (blockType != FLAC_METADATA_TYPE_STREAMINFO) {
+ // First block must be a stream info.
+ return false;
+ }
+ }
+
+ uint32_t blockDataSize = br.ReadU24();
+ const uint8_t* blockDataStart = br.Peek(blockDataSize);
+ if (!blockDataStart) {
+ // Incomplete block.
+ return false;
+ }
+
+ switch (blockType) {
+ case FLAC_METADATA_TYPE_STREAMINFO:
+ {
+ if (mPacketCount != 1 || blockDataSize != FLAC_STREAMINFO_SIZE) {
+ // STREAMINFO must be the first metadata block found, and its size
+ // is constant.
+ return false;
+ }
+
+ mMinBlockSize = br.ReadU16();
+ mMaxBlockSize = br.ReadU16();
+ mMinFrameSize = br.ReadU24();
+ mMaxFrameSize = br.ReadU24();
+
+ uint64_t blob = br.ReadU64();
+ uint32_t sampleRate = (blob >> 44) & BITMASK(20);
+ if (!sampleRate) {
+ return false;
+ }
+ uint32_t numChannels = ((blob >> 41) & BITMASK(3)) + 1;
+ if (numChannels > FLAC_MAX_CHANNELS) {
+ return false;
+ }
+ uint32_t bps = ((blob >> 36) & BITMASK(5)) + 1;
+ if (bps > 24) {
+ return false;
+ }
+ mNumFrames = blob & BITMASK(36);
+
+ mInfo.mMimeType = "audio/flac";
+ mInfo.mRate = sampleRate;
+ mInfo.mChannels = numChannels;
+ mInfo.mBitDepth = bps;
+ mInfo.mCodecSpecificConfig->AppendElements(blockDataStart, blockDataSize);
+ CheckedInt64 duration =
+ SaferMultDiv(mNumFrames, USECS_PER_S, sampleRate);
+ mInfo.mDuration = duration.isValid() ? duration.value() : 0;
+ mParser = new OpusParser;
+ break;
+ }
+ case FLAC_METADATA_TYPE_VORBIS_COMMENT:
+ {
+ if (!mParser) {
+ // We must have seen a valid streaminfo first.
+ return false;
+ }
+ nsTArray<uint8_t> comments(blockDataSize + 8);
+ comments.AppendElements("OpusTags", 8);
+ comments.AppendElements(blockDataStart, blockDataSize);
+ if (!mParser->DecodeTags(comments.Elements(), comments.Length())) {
+ return false;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (mNumHeaders && mPacketCount > mNumHeaders.ref() + 1) {
+ // Received too many header block. assuming invalid.
+ return false;
+ }
+
+ if (lastBlock || (mNumHeaders && mNumHeaders.ref() + 1 == mPacketCount)) {
+ mFullMetadata = true;
+ }
+
+ return true;
+}
+
+int64_t
+FlacFrameParser::BlockDuration(const uint8_t* aPacket, size_t aLength) const
+{
+ if (!mInfo.IsValid()) {
+ return -1;
+ }
+ if (mMinBlockSize == mMaxBlockSize) {
+ // block size is fixed, use this instead of looking at the frame header.
+ return mMinBlockSize;
+ }
+ // TODO
+ return 0;
+}
+
+bool
+FlacFrameParser::IsHeaderBlock(const uint8_t* aPacket, size_t aLength) const
+{
+ // Ogg Flac header
+ // The one-byte packet type 0x7F
+ // The four-byte ASCII signature "FLAC", i.e. 0x46, 0x4C, 0x41, 0x43
+
+ // Flac header:
+ // "fLaC", the FLAC stream marker in ASCII, meaning byte 0 of the stream is 0x66, followed by 0x4C 0x61 0x43
+
+ // If we detect either a ogg or plain flac header, then it must be valid.
+ if (aLength < 4 || aPacket[0] == 0xff) {
+ // A header is at least 4 bytes.
+ return false;
+ }
+ if (aPacket[0] == 0x7f) {
+ // Ogg packet
+ ByteReader br(aPacket + 1, aLength - 1);
+ const uint8_t* signature = br.Read(4);
+ return signature && !memcmp(signature, "FLAC", 4);
+ }
+ ByteReader br(aPacket, aLength - 1);
+ const uint8_t* signature = br.Read(4);
+ if (signature && !memcmp(signature, "fLaC", 4)) {
+ // Flac start header, must have STREAMINFO as first metadata block;
+ if (!br.CanRead8()) {
+ return false;
+ }
+ uint32_t blockType = br.ReadU8() & 0x7f;
+ return blockType == FLAC_METADATA_TYPE_STREAMINFO;
+ }
+ char type = aPacket[0] & 0x7f;
+ return type >= 1 && type <= 6;
+}
+
+MetadataTags*
+FlacFrameParser::GetTags() const
+{
+ MetadataTags* tags;
+
+ tags = new MetadataTags;
+ for (uint32_t i = 0; i < mParser->mTags.Length(); i++) {
+ OggCodecState::AddVorbisComment(tags,
+ mParser->mTags[i].Data(),
+ mParser->mTags[i].Length());
+ }
+
+ return tags;
+}
+
+} // namespace mozilla
diff --git a/dom/media/flac/FlacFrameParser.h b/dom/media/flac/FlacFrameParser.h
new file mode 100644
index 000000000..aa1a6e15b
--- /dev/null
+++ b/dom/media/flac/FlacFrameParser.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FLAC_FRAME_PARSER_H_
+#define FLAC_FRAME_PARSER_H_
+
+#include "mozilla/Maybe.h"
+#include "nsAutoPtr.h"
+#include "MediaDecoder.h" // For MetadataTags
+#include "MediaInfo.h"
+#include "MediaResource.h"
+
+namespace mozilla
+{
+
+class OpusParser;
+
+// Decode a Flac Metadata block contained in either a ogg packet
+// (https://xiph.org/flac/ogg_mapping.html) or in flac container
+// (https://xiph.org/flac/format.html#frame_header)
+
+class FlacFrameParser
+{
+public:
+ FlacFrameParser();
+ ~FlacFrameParser();
+
+ bool IsHeaderBlock(const uint8_t* aPacket, size_t aLength) const;
+ // Return the length of the block header (METADATA_BLOCK_HEADER+
+ // METADATA_BLOCK_DATA), aPacket must point to at least 4
+ // bytes and to a valid block header start (as determined by IsHeaderBlock).
+ uint32_t HeaderBlockLength(const uint8_t* aPacket) const;
+ bool DecodeHeaderBlock(const uint8_t* aPacket, size_t aLength);
+ bool HasFullMetadata() const { return mFullMetadata; }
+ // Return the duration in frames found in the block. -1 if error
+ // such as invalid packet.
+ int64_t BlockDuration(const uint8_t* aPacket, size_t aLength) const;
+
+ // Return a hash table with tag metadata.
+ MetadataTags* GetTags() const;
+
+ AudioInfo mInfo;
+
+private:
+ bool ReconstructFlacGranulepos(void);
+ Maybe<uint32_t> mNumHeaders;
+ uint32_t mMinBlockSize;
+ uint32_t mMaxBlockSize;
+ uint32_t mMinFrameSize;
+ uint32_t mMaxFrameSize;
+ uint64_t mNumFrames;
+ bool mFullMetadata;
+ uint32_t mPacketCount;
+
+ // Used to decode the vorbis comment metadata.
+ nsAutoPtr<OpusParser> mParser;
+};
+
+}
+
+#endif // FLAC_FRAME_PARSER_H_
diff --git a/dom/media/flac/moz.build b/dom/media/flac/moz.build
new file mode 100644
index 000000000..6933ded1f
--- /dev/null
+++ b/dom/media/flac/moz.build
@@ -0,0 +1,24 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'FlacDecoder.h',
+ 'FlacDemuxer.h',
+ 'FlacFrameParser.h',
+]
+
+UNIFIED_SOURCES += [
+ 'FlacDecoder.cpp',
+ 'FlacDemuxer.cpp',
+ 'FlacFrameParser.cpp',
+]
+
+CXXFLAGS += CONFIG['MOZ_LIBVPX_CFLAGS']
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/fmp4/MP4Decoder.cpp b/dom/media/fmp4/MP4Decoder.cpp
new file mode 100644
index 000000000..4cf07ddbd
--- /dev/null
+++ b/dom/media/fmp4/MP4Decoder.cpp
@@ -0,0 +1,307 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MP4Decoder.h"
+#include "MediaContentType.h"
+#include "MediaDecoderStateMachine.h"
+#include "MP4Demuxer.h"
+#include "mozilla/Preferences.h"
+#include "nsCharSeparatedTokenizer.h"
+#include "mozilla/CDMProxy.h"
+#include "mozilla/Logging.h"
+#include "mozilla/SharedThreadPool.h"
+#include "nsMimeTypes.h"
+#include "VideoUtils.h"
+
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
+#ifdef MOZ_WIDGET_ANDROID
+#include "nsIGfxInfo.h"
+#endif
+#include "mozilla/layers/LayersTypes.h"
+
+#include "PDMFactory.h"
+
+namespace mozilla {
+
+MP4Decoder::MP4Decoder(MediaDecoderOwner* aOwner)
+ : MediaDecoder(aOwner)
+{
+}
+
+MediaDecoderStateMachine* MP4Decoder::CreateStateMachine()
+{
+ mReader =
+ new MediaFormatReader(this,
+ new MP4Demuxer(GetResource()),
+ GetVideoFrameContainer());
+
+ return new MediaDecoderStateMachine(this, mReader);
+}
+
+static bool
+IsWhitelistedH264Codec(const nsAString& aCodec)
+{
+ int16_t profile = 0, level = 0;
+
+ if (!ExtractH264CodecDetails(aCodec, profile, level)) {
+ return false;
+ }
+
+#ifdef XP_WIN
+ // Disable 4k video on windows vista since it performs poorly.
+ if (!IsWin7OrLater() &&
+ level >= H264_LEVEL_5) {
+ return false;
+ }
+#endif
+
+ // Just assume what we can play on all platforms the codecs/formats that
+ // WMF can play, since we don't have documentation about what other
+ // platforms can play... According to the WMF documentation:
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/dd797815%28v=vs.85%29.aspx
+ // "The Media Foundation H.264 video decoder is a Media Foundation Transform
+ // that supports decoding of Baseline, Main, and High profiles, up to level
+ // 5.1.". We also report that we can play Extended profile, as there are
+ // bitstreams that are Extended compliant that are also Baseline compliant.
+ return level >= H264_LEVEL_1 &&
+ level <= H264_LEVEL_5_1 &&
+ (profile == H264_PROFILE_BASE ||
+ profile == H264_PROFILE_MAIN ||
+ profile == H264_PROFILE_EXTENDED ||
+ profile == H264_PROFILE_HIGH);
+}
+
+/* static */
+bool
+MP4Decoder::CanHandleMediaType(const MediaContentType& aType,
+ DecoderDoctorDiagnostics* aDiagnostics)
+{
+ if (!IsEnabled()) {
+ return false;
+ }
+
+ // Whitelist MP4 types, so they explicitly match what we encounter on
+ // the web, as opposed to what we use internally (i.e. what our demuxers
+ // etc output).
+ const bool isMP4Audio = aType.GetMIMEType().EqualsASCII("audio/mp4") ||
+ aType.GetMIMEType().EqualsASCII("audio/x-m4a");
+ const bool isMP4Video =
+ // On B2G, treat 3GPP as MP4 when Gonk PDM is available.
+#ifdef MOZ_GONK_MEDIACODEC
+ aType.GetMIMEType().EqualsASCII(VIDEO_3GPP) ||
+#endif
+ aType.GetMIMEType().EqualsASCII("video/mp4") ||
+ aType.GetMIMEType().EqualsASCII("video/quicktime") ||
+ aType.GetMIMEType().EqualsASCII("video/x-m4v");
+ if (!isMP4Audio && !isMP4Video) {
+ return false;
+ }
+
+ nsTArray<UniquePtr<TrackInfo>> trackInfos;
+ if (aType.GetCodecs().IsEmpty()) {
+ // No codecs specified. Assume H.264
+ if (isMP4Audio) {
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("audio/mp4a-latm"), aType));
+ } else {
+ MOZ_ASSERT(isMP4Video);
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("video/avc"), aType));
+ }
+ } else {
+ // Verify that all the codecs specified are ones that we expect that
+ // we can play.
+ nsTArray<nsString> codecs;
+ if (!ParseCodecsString(aType.GetCodecs(), codecs)) {
+ return false;
+ }
+ for (const nsString& codec : codecs) {
+ if (IsAACCodecString(codec)) {
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("audio/mp4a-latm"), aType));
+ continue;
+ }
+ if (codec.EqualsLiteral("mp3")) {
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("audio/mpeg"), aType));
+ continue;
+ }
+ if (codec.EqualsLiteral("opus")) {
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("audio/opus"), aType));
+ continue;
+ }
+ if (codec.EqualsLiteral("flac")) {
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("audio/flac"), aType));
+ continue;
+ }
+ // Note: Only accept H.264 in a video content type, not in an audio
+ // content type.
+ if (IsWhitelistedH264Codec(codec) && isMP4Video) {
+ trackInfos.AppendElement(
+ CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
+ NS_LITERAL_CSTRING("video/avc"), aType));
+ continue;
+ }
+ // Some unsupported codec.
+ return false;
+ }
+ }
+
+ // Verify that we have a PDM that supports the whitelisted types.
+ RefPtr<PDMFactory> platform = new PDMFactory();
+ for (const auto& trackInfo : trackInfos) {
+ if (!trackInfo || !platform->Supports(*trackInfo, aDiagnostics)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/* static */
+bool
+MP4Decoder::IsH264(const nsACString& aMimeType)
+{
+ return aMimeType.EqualsLiteral("video/mp4") ||
+ aMimeType.EqualsLiteral("video/avc");
+}
+
+/* static */
+bool
+MP4Decoder::IsAAC(const nsACString& aMimeType)
+{
+ return aMimeType.EqualsLiteral("audio/mp4a-latm");
+}
+
+/* static */
+bool
+MP4Decoder::IsEnabled()
+{
+ return Preferences::GetBool("media.mp4.enabled", true);
+}
+
+// sTestH264ExtraData represents the content of the avcC atom found in
+// an AVC1 h264 video. It contains the H264 SPS and PPS NAL.
+// the structure of the avcC atom is as follow:
+// write(0x1); // version, always 1
+// write(sps[0].data[1]); // profile
+// write(sps[0].data[2]); // compatibility
+// write(sps[0].data[3]); // level
+// write(0xFC | 3); // reserved (6 bits), NULA length size - 1 (2 bits)
+// write(0xE0 | 1); // reserved (3 bits), num of SPS (5 bits)
+// write_word(sps[0].size); // 2 bytes for length of SPS
+// for(size_t i=0 ; i < sps[0].size ; ++i)
+// write(sps[0].data[i]); // data of SPS
+// write(&b, pps.size()); // num of PPS
+// for(size_t i=0 ; i < pps.size() ; ++i) {
+// write_word(pps[i].size); // 2 bytes for length of PPS
+// for(size_t j=0 ; j < pps[i].size ; ++j)
+// write(pps[i].data[j]); // data of PPS
+// }
+// }
+// here we have a h264 Baseline, 640x360
+// We use a 640x360 extradata, as some video framework (Apple VT) will never
+// attempt to use hardware decoding for small videos.
+static const uint8_t sTestH264ExtraData[] = {
+ 0x01, 0x42, 0xc0, 0x1e, 0xff, 0xe1, 0x00, 0x17, 0x67, 0x42,
+ 0xc0, 0x1e, 0xbb, 0x40, 0x50, 0x17, 0xfc, 0xb8, 0x08, 0x80,
+ 0x00, 0x00, 0x32, 0x00, 0x00, 0x0b, 0xb5, 0x07, 0x8b, 0x17,
+ 0x50, 0x01, 0x00, 0x04, 0x68, 0xce, 0x32, 0xc8
+};
+
+static already_AddRefed<MediaDataDecoder>
+CreateTestH264Decoder(layers::KnowsCompositor* aKnowsCompositor,
+ VideoInfo& aConfig,
+ TaskQueue* aTaskQueue)
+{
+ aConfig.mMimeType = "video/avc";
+ aConfig.mId = 1;
+ aConfig.mDuration = 40000;
+ aConfig.mMediaTime = 0;
+ aConfig.mImage = aConfig.mDisplay = nsIntSize(640, 360);
+ aConfig.mExtraData = new MediaByteBuffer();
+ aConfig.mExtraData->AppendElements(sTestH264ExtraData,
+ MOZ_ARRAY_LENGTH(sTestH264ExtraData));
+
+ RefPtr<PDMFactory> platform = new PDMFactory();
+ RefPtr<MediaDataDecoder> decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aKnowsCompositor }));
+
+ return decoder.forget();
+}
+
+/* static */ already_AddRefed<dom::Promise>
+MP4Decoder::IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ ErrorResult rv;
+ RefPtr<dom::Promise> promise;
+ promise = dom::Promise::Create(aParent, rv);
+ if (rv.Failed()) {
+ rv.SuppressException();
+ return nullptr;
+ }
+
+ RefPtr<TaskQueue> taskQueue =
+ new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
+ VideoInfo config;
+ RefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aKnowsCompositor, config, taskQueue));
+ if (!decoder) {
+ taskQueue->BeginShutdown();
+ taskQueue->AwaitShutdownAndIdle();
+ promise->MaybeResolve(NS_LITERAL_STRING("No; Failed to create H264 decoder"));
+ return promise.forget();
+ }
+
+ decoder->Init()
+ ->Then(AbstractThread::MainThread(), __func__,
+ [promise, decoder, taskQueue] (TrackInfo::TrackType aTrack) {
+ nsCString failureReason;
+ bool ok = decoder->IsHardwareAccelerated(failureReason);
+ nsAutoString result;
+ if (ok) {
+ result.AssignLiteral("Yes");
+ } else {
+ result.AssignLiteral("No");
+ }
+ if (failureReason.Length()) {
+ result.AppendLiteral("; ");
+ AppendUTF8toUTF16(failureReason, result);
+ }
+ decoder->Shutdown();
+ taskQueue->BeginShutdown();
+ taskQueue->AwaitShutdownAndIdle();
+ promise->MaybeResolve(result);
+ },
+ [promise, decoder, taskQueue] (MediaResult aError) {
+ decoder->Shutdown();
+ taskQueue->BeginShutdown();
+ taskQueue->AwaitShutdownAndIdle();
+ promise->MaybeResolve(NS_LITERAL_STRING("No; Failed to initialize H264 decoder"));
+ });
+
+ return promise.forget();
+}
+
+void
+MP4Decoder::GetMozDebugReaderData(nsAString& aString)
+{
+ if (mReader) {
+ mReader->GetMozDebugReaderData(aString);
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/fmp4/MP4Decoder.h b/dom/media/fmp4/MP4Decoder.h
new file mode 100644
index 000000000..ad5fba7b5
--- /dev/null
+++ b/dom/media/fmp4/MP4Decoder.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(MP4Decoder_h_)
+#define MP4Decoder_h_
+
+#include "MediaDecoder.h"
+#include "MediaFormatReader.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/layers/KnowsCompositor.h"
+
+namespace mozilla {
+
+class MediaContentType;
+
+// Decoder that uses a bundled MP4 demuxer and platform decoders to play MP4.
+class MP4Decoder : public MediaDecoder
+{
+public:
+ explicit MP4Decoder(MediaDecoderOwner* aOwner);
+
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override {
+ if (!IsEnabled()) {
+ return nullptr;
+ }
+ return new MP4Decoder(aOwner);
+ }
+
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // Returns true if aType is a type that we think we can render with the
+ // a MP4 platform decoder backend.
+ static bool CanHandleMediaType(const MediaContentType& aType,
+ DecoderDoctorDiagnostics* aDiagnostics);
+
+ // Return true if aMimeType is a one of the strings used by our demuxers to
+ // identify H264. Does not parse general content type strings, i.e. white
+ // space matters.
+ static bool IsH264(const nsACString& aMimeType);
+
+ // Return true if aMimeType is a one of the strings used by our demuxers to
+ // identify AAC. Does not parse general content type strings, i.e. white
+ // space matters.
+ static bool IsAAC(const nsACString& aMimeType);
+
+ // Returns true if the MP4 backend is preffed on.
+ static bool IsEnabled();
+
+ static already_AddRefed<dom::Promise>
+ IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent);
+
+ void GetMozDebugReaderData(nsAString& aString) override;
+
+private:
+ RefPtr<MediaFormatReader> mReader;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/fmp4/MP4Demuxer.cpp b/dom/media/fmp4/MP4Demuxer.cpp
new file mode 100644
index 000000000..70b176699
--- /dev/null
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -0,0 +1,502 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <algorithm>
+#include <limits>
+#include <stdint.h>
+
+#include "MP4Demuxer.h"
+#include "mp4_demuxer/MoofParser.h"
+#include "mp4_demuxer/MP4Metadata.h"
+#include "mp4_demuxer/ResourceStream.h"
+#include "mp4_demuxer/BufferStream.h"
+#include "mp4_demuxer/Index.h"
+#include "nsPrintfCString.h"
+
+// Used for telemetry
+#include "mozilla/Telemetry.h"
+#include "mp4_demuxer/AnnexB.h"
+#include "mp4_demuxer/H264.h"
+
+#include "nsAutoPtr.h"
+
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+mozilla::LogModule* GetDemuxerLog() {
+ return gMediaDemuxerLog;
+}
+
+#define LOG(arg, ...) MOZ_LOG(gMediaDemuxerLog, mozilla::LogLevel::Debug, ("MP4Demuxer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+class MP4TrackDemuxer : public MediaTrackDemuxer
+{
+public:
+ MP4TrackDemuxer(MP4Demuxer* aParent,
+ UniquePtr<TrackInfo>&& aInfo,
+ const nsTArray<mp4_demuxer::Index::Indice>& indices);
+
+ UniquePtr<TrackInfo> GetInfo() const override;
+
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+
+ void Reset() override;
+
+ nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override;
+
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override;
+
+ media::TimeIntervals GetBuffered() override;
+
+ void BreakCycles() override;
+
+ void NotifyDataRemoved();
+
+private:
+ friend class MP4Demuxer;
+ void NotifyDataArrived();
+ already_AddRefed<MediaRawData> GetNextSample();
+ void EnsureUpToDateIndex();
+ void SetNextKeyFrameTime();
+ RefPtr<MP4Demuxer> mParent;
+ RefPtr<mp4_demuxer::ResourceStream> mStream;
+ UniquePtr<TrackInfo> mInfo;
+ RefPtr<mp4_demuxer::Index> mIndex;
+ UniquePtr<mp4_demuxer::SampleIterator> mIterator;
+ Maybe<media::TimeUnit> mNextKeyframeTime;
+ // Queued samples extracted by the demuxer, but not yet returned.
+ RefPtr<MediaRawData> mQueuedSample;
+ bool mNeedReIndex;
+ bool mNeedSPSForTelemetry;
+ bool mIsH264 = false;
+};
+
+
+// Returns true if no SPS was found and search for it should continue.
+bool
+AccumulateSPSTelemetry(const MediaByteBuffer* aExtradata)
+{
+ mp4_demuxer::SPSData spsdata;
+ if (mp4_demuxer::H264::DecodeSPSFromExtraData(aExtradata, spsdata)) {
+ uint8_t constraints = (spsdata.constraint_set0_flag ? (1 << 0) : 0) |
+ (spsdata.constraint_set1_flag ? (1 << 1) : 0) |
+ (spsdata.constraint_set2_flag ? (1 << 2) : 0) |
+ (spsdata.constraint_set3_flag ? (1 << 3) : 0) |
+ (spsdata.constraint_set4_flag ? (1 << 4) : 0) |
+ (spsdata.constraint_set5_flag ? (1 << 5) : 0);
+ Telemetry::Accumulate(Telemetry::VIDEO_DECODED_H264_SPS_CONSTRAINT_SET_FLAG,
+ constraints);
+
+ // Collect profile_idc values up to 244, otherwise 0 for unknown.
+ Telemetry::Accumulate(Telemetry::VIDEO_DECODED_H264_SPS_PROFILE,
+ spsdata.profile_idc <= 244 ? spsdata.profile_idc : 0);
+
+ // Make sure level_idc represents a value between levels 1 and 5.2,
+ // otherwise collect 0 for unknown level.
+ Telemetry::Accumulate(Telemetry::VIDEO_DECODED_H264_SPS_LEVEL,
+ (spsdata.level_idc >= 10 && spsdata.level_idc <= 52) ?
+ spsdata.level_idc : 0);
+
+ // max_num_ref_frames should be between 0 and 16, anything larger will
+ // be treated as invalid.
+ Telemetry::Accumulate(Telemetry::VIDEO_H264_SPS_MAX_NUM_REF_FRAMES,
+ std::min(spsdata.max_num_ref_frames, 17u));
+
+ return false;
+ }
+
+ return true;
+}
+
+MP4Demuxer::MP4Demuxer(MediaResource* aResource)
+ : mResource(aResource)
+ , mStream(new mp4_demuxer::ResourceStream(aResource))
+ , mInitData(new MediaByteBuffer)
+{
+}
+
+RefPtr<MP4Demuxer::InitPromise>
+MP4Demuxer::Init()
+{
+ AutoPinned<mp4_demuxer::ResourceStream> stream(mStream);
+
+ // Check that we have enough data to read the metadata.
+ if (!mp4_demuxer::MP4Metadata::HasCompleteMetadata(stream)) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ mInitData = mp4_demuxer::MP4Metadata::Metadata(stream);
+ if (!mInitData) {
+ // OOM
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ RefPtr<mp4_demuxer::BufferStream> bufferstream =
+ new mp4_demuxer::BufferStream(mInitData);
+
+ mMetadata = MakeUnique<mp4_demuxer::MP4Metadata>(bufferstream);
+
+ if (!mMetadata->GetNumberTracks(mozilla::TrackInfo::kAudioTrack) &&
+ !mMetadata->GetNumberTracks(mozilla::TrackInfo::kVideoTrack)) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+bool
+MP4Demuxer::HasTrackType(TrackInfo::TrackType aType) const
+{
+ return !!GetNumberTracks(aType);
+}
+
+uint32_t
+MP4Demuxer::GetNumberTracks(TrackInfo::TrackType aType) const
+{
+ return mMetadata->GetNumberTracks(aType);
+}
+
+already_AddRefed<MediaTrackDemuxer>
+MP4Demuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber)
+{
+ if (mMetadata->GetNumberTracks(aType) <= aTrackNumber) {
+ return nullptr;
+ }
+ UniquePtr<TrackInfo> info = mMetadata->GetTrackInfo(aType, aTrackNumber);
+ if (!info) {
+ return nullptr;
+ }
+ FallibleTArray<mp4_demuxer::Index::Indice> indices;
+ if (!mMetadata->ReadTrackIndex(indices, info->mTrackId)) {
+ return nullptr;
+ }
+ RefPtr<MP4TrackDemuxer> e = new MP4TrackDemuxer(this, Move(info), indices);
+ mDemuxers.AppendElement(e);
+
+ return e.forget();
+}
+
+bool
+MP4Demuxer::IsSeekable() const
+{
+ return mMetadata->CanSeek();
+}
+
+void
+MP4Demuxer::NotifyDataArrived()
+{
+ for (uint32_t i = 0; i < mDemuxers.Length(); i++) {
+ mDemuxers[i]->NotifyDataArrived();
+ }
+}
+
+void
+MP4Demuxer::NotifyDataRemoved()
+{
+ for (uint32_t i = 0; i < mDemuxers.Length(); i++) {
+ mDemuxers[i]->NotifyDataRemoved();
+ }
+}
+
+UniquePtr<EncryptionInfo>
+MP4Demuxer::GetCrypto()
+{
+ const mp4_demuxer::CryptoFile& cryptoFile = mMetadata->Crypto();
+ if (!cryptoFile.valid) {
+ return nullptr;
+ }
+
+ const nsTArray<mp4_demuxer::PsshInfo>& psshs = cryptoFile.pssh;
+ nsTArray<uint8_t> initData;
+ for (uint32_t i = 0; i < psshs.Length(); i++) {
+ initData.AppendElements(psshs[i].data);
+ }
+
+ if (initData.IsEmpty()) {
+ return nullptr;
+ }
+
+ auto crypto = MakeUnique<EncryptionInfo>();
+ crypto->AddInitData(NS_LITERAL_STRING("cenc"), Move(initData));
+
+ return crypto;
+}
+
+MP4TrackDemuxer::MP4TrackDemuxer(MP4Demuxer* aParent,
+ UniquePtr<TrackInfo>&& aInfo,
+ const nsTArray<mp4_demuxer::Index::Indice>& indices)
+ : mParent(aParent)
+ , mStream(new mp4_demuxer::ResourceStream(mParent->mResource))
+ , mInfo(Move(aInfo))
+ , mIndex(new mp4_demuxer::Index(indices,
+ mStream,
+ mInfo->mTrackId,
+ mInfo->IsAudio()))
+ , mIterator(MakeUnique<mp4_demuxer::SampleIterator>(mIndex))
+ , mNeedReIndex(true)
+{
+ EnsureUpToDateIndex(); // Force update of index
+
+ VideoInfo* videoInfo = mInfo->GetAsVideoInfo();
+ // Collect telemetry from h264 AVCC SPS.
+ if (videoInfo &&
+ (mInfo->mMimeType.EqualsLiteral("video/mp4") ||
+ mInfo->mMimeType.EqualsLiteral("video/avc"))) {
+ mIsH264 = true;
+ RefPtr<MediaByteBuffer> extraData = videoInfo->mExtraData;
+ mNeedSPSForTelemetry = AccumulateSPSTelemetry(extraData);
+ mp4_demuxer::SPSData spsdata;
+ if (mp4_demuxer::H264::DecodeSPSFromExtraData(extraData, spsdata) &&
+ spsdata.pic_width > 0 && spsdata.pic_height > 0 &&
+ mp4_demuxer::H264::EnsureSPSIsSane(spsdata)) {
+ videoInfo->mImage.width = spsdata.pic_width;
+ videoInfo->mImage.height = spsdata.pic_height;
+ videoInfo->mDisplay.width = spsdata.display_width;
+ videoInfo->mDisplay.height = spsdata.display_height;
+ }
+ } else {
+ // No SPS to be found.
+ mNeedSPSForTelemetry = false;
+ }
+}
+
+UniquePtr<TrackInfo>
+MP4TrackDemuxer::GetInfo() const
+{
+ return mInfo->Clone();
+}
+
+void
+MP4TrackDemuxer::EnsureUpToDateIndex()
+{
+ if (!mNeedReIndex) {
+ return;
+ }
+ AutoPinned<MediaResource> resource(mParent->mResource);
+ MediaByteRangeSet byteRanges;
+ nsresult rv = resource->GetCachedRanges(byteRanges);
+ if (NS_FAILED(rv)) {
+ return;
+ }
+ mIndex->UpdateMoofIndex(byteRanges);
+ mNeedReIndex = false;
+}
+
+RefPtr<MP4TrackDemuxer::SeekPromise>
+MP4TrackDemuxer::Seek(media::TimeUnit aTime)
+{
+ int64_t seekTime = aTime.ToMicroseconds();
+ mQueuedSample = nullptr;
+
+ mIterator->Seek(seekTime);
+
+ // Check what time we actually seeked to.
+ mQueuedSample = GetNextSample();
+ if (mQueuedSample) {
+ seekTime = mQueuedSample->mTime;
+ }
+
+ SetNextKeyFrameTime();
+
+ return SeekPromise::CreateAndResolve(media::TimeUnit::FromMicroseconds(seekTime), __func__);
+}
+
+already_AddRefed<MediaRawData>
+MP4TrackDemuxer::GetNextSample()
+{
+ RefPtr<MediaRawData> sample = mIterator->GetNext();
+ if (!sample) {
+ return nullptr;
+ }
+ if (mInfo->GetAsVideoInfo()) {
+ sample->mExtraData = mInfo->GetAsVideoInfo()->mExtraData;
+ if (mIsH264) {
+ mp4_demuxer::H264::FrameType type =
+ mp4_demuxer::H264::GetFrameType(sample);
+ switch (type) {
+ case mp4_demuxer::H264::FrameType::I_FRAME: MOZ_FALLTHROUGH;
+ case mp4_demuxer::H264::FrameType::OTHER:
+ {
+ bool keyframe = type == mp4_demuxer::H264::FrameType::I_FRAME;
+ if (sample->mKeyframe != keyframe) {
+ NS_WARNING(nsPrintfCString("Frame incorrectly marked as %skeyframe @ pts:%lld dur:%u dts:%lld",
+ keyframe ? "" : "non-",
+ sample->mTime,
+ sample->mDuration,
+ sample->mTimecode).get());
+ sample->mKeyframe = keyframe;
+ }
+ break;
+ }
+ case mp4_demuxer::H264::FrameType::INVALID:
+ NS_WARNING(nsPrintfCString("Invalid H264 frame @ pts:%lld dur:%u dts:%lld",
+ sample->mTime,
+ sample->mDuration,
+ sample->mTimecode).get());
+ // We could reject the sample now, however demuxer errors are fatal.
+ // So we keep the invalid frame, relying on the H264 decoder to
+ // handle the error later.
+ // TODO: make demuxer errors non-fatal.
+ break;
+ }
+ }
+ }
+ if (sample->mCrypto.mValid) {
+ nsAutoPtr<MediaRawDataWriter> writer(sample->CreateWriter());
+ writer->mCrypto.mMode = mInfo->mCrypto.mMode;
+ writer->mCrypto.mIVSize = mInfo->mCrypto.mIVSize;
+ writer->mCrypto.mKeyId.AppendElements(mInfo->mCrypto.mKeyId);
+ }
+ return sample.forget();
+}
+
+RefPtr<MP4TrackDemuxer::SamplesPromise>
+MP4TrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ EnsureUpToDateIndex();
+ RefPtr<SamplesHolder> samples = new SamplesHolder;
+ if (!aNumSamples) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ if (mQueuedSample) {
+ MOZ_ASSERT(mQueuedSample->mKeyframe,
+ "mQueuedSample must be a keyframe");
+ samples->mSamples.AppendElement(mQueuedSample);
+ mQueuedSample = nullptr;
+ aNumSamples--;
+ }
+ RefPtr<MediaRawData> sample;
+ while (aNumSamples && (sample = GetNextSample())) {
+ if (!sample->Size()) {
+ continue;
+ }
+ samples->mSamples.AppendElement(sample);
+ aNumSamples--;
+ }
+
+ if (samples->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ } else {
+ for (const auto& sample : samples->mSamples) {
+ // Collect telemetry from h264 Annex B SPS.
+ if (mNeedSPSForTelemetry && mp4_demuxer::AnnexB::HasSPS(sample)) {
+ RefPtr<MediaByteBuffer> extradata =
+ mp4_demuxer::AnnexB::ExtractExtraData(sample);
+ mNeedSPSForTelemetry = AccumulateSPSTelemetry(extradata);
+ }
+ }
+
+ if (mNextKeyframeTime.isNothing() ||
+ samples->mSamples.LastElement()->mTime >= mNextKeyframeTime.value().ToMicroseconds()) {
+ SetNextKeyFrameTime();
+ }
+ return SamplesPromise::CreateAndResolve(samples, __func__);
+ }
+}
+
+void
+MP4TrackDemuxer::SetNextKeyFrameTime()
+{
+ mNextKeyframeTime.reset();
+ mp4_demuxer::Microseconds frameTime = mIterator->GetNextKeyframeTime();
+ if (frameTime != -1) {
+ mNextKeyframeTime.emplace(
+ media::TimeUnit::FromMicroseconds(frameTime));
+ }
+}
+
+void
+MP4TrackDemuxer::Reset()
+{
+ mQueuedSample = nullptr;
+ // TODO, Seek to first frame available, which isn't always 0.
+ mIterator->Seek(0);
+ SetNextKeyFrameTime();
+}
+
+nsresult
+MP4TrackDemuxer::GetNextRandomAccessPoint(media::TimeUnit* aTime)
+{
+ if (mNextKeyframeTime.isNothing()) {
+ // There's no next key frame.
+ *aTime =
+ media::TimeUnit::FromMicroseconds(std::numeric_limits<int64_t>::max());
+ } else {
+ *aTime = mNextKeyframeTime.value();
+ }
+ return NS_OK;
+}
+
+RefPtr<MP4TrackDemuxer::SkipAccessPointPromise>
+MP4TrackDemuxer::SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold)
+{
+ mQueuedSample = nullptr;
+ // Loop until we reach the next keyframe after the threshold.
+ uint32_t parsed = 0;
+ bool found = false;
+ RefPtr<MediaRawData> sample;
+ while (!found && (sample = GetNextSample())) {
+ parsed++;
+ if (sample->mKeyframe && sample->mTime >= aTimeThreshold.ToMicroseconds()) {
+ found = true;
+ mQueuedSample = sample;
+ }
+ }
+ SetNextKeyFrameTime();
+ if (found) {
+ return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
+ } else {
+ SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
+ return SkipAccessPointPromise::CreateAndReject(Move(failure), __func__);
+ }
+}
+
+media::TimeIntervals
+MP4TrackDemuxer::GetBuffered()
+{
+ EnsureUpToDateIndex();
+ AutoPinned<MediaResource> resource(mParent->mResource);
+ MediaByteRangeSet byteRanges;
+ nsresult rv = resource->GetCachedRanges(byteRanges);
+
+ if (NS_FAILED(rv)) {
+ return media::TimeIntervals();
+ }
+
+ return mIndex->ConvertByteRangesToTimeRanges(byteRanges);
+}
+
+void
+MP4TrackDemuxer::NotifyDataArrived()
+{
+ mNeedReIndex = true;
+}
+
+void
+MP4TrackDemuxer::NotifyDataRemoved()
+{
+ AutoPinned<MediaResource> resource(mParent->mResource);
+ MediaByteRangeSet byteRanges;
+ nsresult rv = resource->GetCachedRanges(byteRanges);
+ if (NS_FAILED(rv)) {
+ return;
+ }
+ mIndex->UpdateMoofIndex(byteRanges, true /* can evict */);
+ mNeedReIndex = false;
+}
+
+void
+MP4TrackDemuxer::BreakCycles()
+{
+ mParent = nullptr;
+}
+
+} // namespace mozilla
+
+#undef LOG
diff --git a/dom/media/fmp4/MP4Demuxer.h b/dom/media/fmp4/MP4Demuxer.h
new file mode 100644
index 000000000..ab3f87c4b
--- /dev/null
+++ b/dom/media/fmp4/MP4Demuxer.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MP4Demuxer_h_)
+#define MP4Demuxer_h_
+
+#include "mozilla/Maybe.h"
+#include "mozilla/Monitor.h"
+#include "MediaDataDemuxer.h"
+#include "MediaResource.h"
+
+namespace mp4_demuxer {
+class MP4Metadata;
+class ResourceStream;
+class SampleIterator;
+} // namespace mp4_demuxer
+
+namespace mozilla {
+
+class MP4TrackDemuxer;
+
+class MP4Demuxer : public MediaDataDemuxer
+{
+public:
+ explicit MP4Demuxer(MediaResource* aResource);
+
+ RefPtr<InitPromise> Init() override;
+
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(TrackInfo::TrackType aType,
+ uint32_t aTrackNumber) override;
+
+ bool IsSeekable() const override;
+
+ UniquePtr<EncryptionInfo> GetCrypto() override;
+
+ void NotifyDataArrived() override;
+
+ void NotifyDataRemoved() override;
+
+private:
+ friend class MP4TrackDemuxer;
+ RefPtr<MediaResource> mResource;
+ RefPtr<mp4_demuxer::ResourceStream> mStream;
+ RefPtr<MediaByteBuffer> mInitData;
+ UniquePtr<mp4_demuxer::MP4Metadata> mMetadata;
+ nsTArray<RefPtr<MP4TrackDemuxer>> mDemuxers;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/fmp4/MP4Stream.cpp b/dom/media/fmp4/MP4Stream.cpp
new file mode 100644
index 000000000..615a7dc01
--- /dev/null
+++ b/dom/media/fmp4/MP4Stream.cpp
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MP4Stream.h"
+#include "MediaResource.h"
+
+namespace mozilla {
+
+MP4Stream::MP4Stream(MediaResource* aResource)
+ : mResource(aResource)
+ , mPinCount(0)
+{
+ MOZ_COUNT_CTOR(MP4Stream);
+ MOZ_ASSERT(aResource);
+}
+
+MP4Stream::~MP4Stream()
+{
+ MOZ_COUNT_DTOR(MP4Stream);
+ MOZ_ASSERT(mPinCount == 0);
+}
+
+bool
+MP4Stream::BlockingReadIntoCache(int64_t aOffset, size_t aCount, Monitor* aToUnlock)
+{
+ MOZ_ASSERT(mPinCount > 0);
+ CacheBlock block(aOffset, aCount);
+ if (!block.Init()) {
+ return false;
+ }
+
+ uint32_t bytesRead = 0;
+ {
+ MonitorAutoUnlock unlock(*aToUnlock);
+ nsresult rv = mResource.ReadAt(aOffset, block.Buffer(), aCount, &bytesRead);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+ }
+
+ MOZ_ASSERT(block.mCount >= bytesRead);
+ block.mCount = bytesRead;
+
+ mCache.AppendElement(Move(block));
+ return true;
+}
+
+// We surreptitiously reimplement the supposedly-blocking ReadAt as a non-
+// blocking CachedReadAt, and record when it fails. This allows MP4Reader
+// to retry the read as an actual blocking read without holding the lock.
+bool
+MP4Stream::ReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
+ size_t* aBytesRead)
+{
+ if (mFailedRead.isSome()) {
+ mFailedRead.reset();
+ }
+
+ if (!CachedReadAt(aOffset, aBuffer, aCount, aBytesRead)) {
+ mFailedRead.emplace(aOffset, aCount);
+ return false;
+ }
+
+ return true;
+}
+
+bool
+MP4Stream::CachedReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
+ size_t* aBytesRead)
+{
+ // First, check our local cache.
+ for (size_t i = 0; i < mCache.Length(); ++i) {
+ if (mCache[i].mOffset == aOffset && mCache[i].mCount >= aCount) {
+ memcpy(aBuffer, mCache[i].Buffer(), aCount);
+ *aBytesRead = aCount;
+ return true;
+ }
+ }
+
+ nsresult rv =
+ mResource.GetResource()->ReadFromCache(reinterpret_cast<char*>(aBuffer),
+ aOffset, aCount);
+ if (NS_FAILED(rv)) {
+ *aBytesRead = 0;
+ return false;
+ }
+ *aBytesRead = aCount;
+ return true;
+}
+
+bool
+MP4Stream::Length(int64_t* aSize)
+{
+ if (mResource.GetLength() < 0)
+ return false;
+ *aSize = mResource.GetLength();
+ return true;
+}
+
+} // namespace mozilla
diff --git a/dom/media/fmp4/MP4Stream.h b/dom/media/fmp4/MP4Stream.h
new file mode 100644
index 000000000..d7d8e6afc
--- /dev/null
+++ b/dom/media/fmp4/MP4Stream.h
@@ -0,0 +1,107 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MP4_STREAM_H_
+#define MP4_STREAM_H_
+
+#include "mp4_demuxer/Stream.h"
+
+#include "MediaResource.h"
+
+#include "mozilla/Maybe.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/UniquePtrExtensions.h"
+
+namespace mozilla {
+
+class Monitor;
+
+class MP4Stream : public mp4_demuxer::Stream {
+public:
+ explicit MP4Stream(MediaResource* aResource);
+ virtual ~MP4Stream();
+ bool BlockingReadIntoCache(int64_t aOffset, size_t aCount, Monitor* aToUnlock);
+ bool ReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
+ size_t* aBytesRead) override;
+ bool CachedReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
+ size_t* aBytesRead) override;
+ bool Length(int64_t* aSize) override;
+
+ struct ReadRecord {
+ ReadRecord(int64_t aOffset, size_t aCount) : mOffset(aOffset), mCount(aCount) {}
+ bool operator==(const ReadRecord& aOther) { return mOffset == aOther.mOffset && mCount == aOther.mCount; }
+ int64_t mOffset;
+ size_t mCount;
+ };
+ bool LastReadFailed(ReadRecord* aOut)
+ {
+ if (mFailedRead.isSome()) {
+ *aOut = mFailedRead.ref();
+ return true;
+ }
+
+ return false;
+ }
+
+ void ClearFailedRead() { mFailedRead.reset(); }
+
+ void Pin()
+ {
+ mResource.GetResource()->Pin();
+ ++mPinCount;
+ }
+
+ void Unpin()
+ {
+ mResource.GetResource()->Unpin();
+ MOZ_ASSERT(mPinCount);
+ --mPinCount;
+ if (mPinCount == 0) {
+ mCache.Clear();
+ }
+ }
+
+private:
+ MediaResourceIndex mResource;
+ Maybe<ReadRecord> mFailedRead;
+ uint32_t mPinCount;
+
+ struct CacheBlock {
+ CacheBlock(int64_t aOffset, size_t aCount)
+ : mOffset(aOffset), mCount(aCount), mBuffer(nullptr) {}
+ int64_t mOffset;
+ size_t mCount;
+
+ CacheBlock(CacheBlock&& aOther)
+ : mOffset(aOther.mOffset)
+ , mCount(aOther.mCount)
+ , mBuffer(Move(aOther.mBuffer))
+ {}
+
+ bool Init()
+ {
+ mBuffer = MakeUniqueFallible<char[]>(mCount);
+ return !!mBuffer;
+ }
+
+ char* Buffer()
+ {
+ MOZ_ASSERT(mBuffer.get());
+ return mBuffer.get();
+ }
+
+ private:
+ CacheBlock(const CacheBlock&) = delete;
+ CacheBlock& operator=(const CacheBlock&) = delete;
+
+ UniquePtr<char[]> mBuffer;
+ };
+ nsTArray<CacheBlock> mCache;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/fmp4/moz.build b/dom/media/fmp4/moz.build
new file mode 100644
index 000000000..6a249ae3e
--- /dev/null
+++ b/dom/media/fmp4/moz.build
@@ -0,0 +1,25 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'MP4Decoder.h',
+ 'MP4Demuxer.h',
+ 'MP4Stream.h',
+]
+
+UNIFIED_SOURCES += [
+ 'MP4Decoder.cpp',
+ 'MP4Stream.cpp',
+]
+
+SOURCES += [
+ 'MP4Demuxer.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['MOZ_GONK_MEDIACODEC']:
+ DEFINES['MOZ_GONK_MEDIACODEC'] = True
diff --git a/dom/media/gmp-plugin-openh264/fakeopenh264.info b/dom/media/gmp-plugin-openh264/fakeopenh264.info
new file mode 100644
index 000000000..814a96be3
--- /dev/null
+++ b/dom/media/gmp-plugin-openh264/fakeopenh264.info
@@ -0,0 +1,4 @@
+Name: fakeopenh264
+Description: Fake GMP Plugin
+Version: 1.0
+APIs: encode-video[h264:fake], decode-video[h264:fake]
diff --git a/dom/media/gmp-plugin-openh264/fakeopenh264.voucher b/dom/media/gmp-plugin-openh264/fakeopenh264.voucher
new file mode 100644
index 000000000..2104d73c7
--- /dev/null
+++ b/dom/media/gmp-plugin-openh264/fakeopenh264.voucher
@@ -0,0 +1 @@
+gmp-fakeopenh264 placeholder voucher
diff --git a/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp b/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp
new file mode 100644
index 000000000..7dbc85251
--- /dev/null
+++ b/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp
@@ -0,0 +1,429 @@
+/*!
+ * \copy
+ * Copyright (c) 2009-2014, Cisco Systems
+ * Copyright (c) 2014, Mozilla
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ *************************************************************************************
+ */
+
+#include <stdint.h>
+#include <time.h>
+#include <cstdio>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <memory>
+#include <assert.h>
+#include <limits.h>
+
+#include "gmp-platform.h"
+#include "gmp-video-host.h"
+#include "gmp-video-encode.h"
+#include "gmp-video-decode.h"
+#include "gmp-video-frame-i420.h"
+#include "gmp-video-frame-encoded.h"
+
+#if defined(GMP_FAKE_SUPPORT_DECRYPT)
+#include "gmp-decryption.h"
+#include "gmp-test-decryptor.h"
+#include "gmp-test-storage.h"
+#endif
+
+#if defined(_MSC_VER)
+#define PUBLIC_FUNC __declspec(dllexport)
+#else
+#define PUBLIC_FUNC
+#endif
+
+#define BIG_FRAME 10000
+
+static int g_log_level = 0;
+
+#define GMPLOG(l, x) do { \
+ if (l <= g_log_level) { \
+ const char *log_string = "unknown"; \
+ if ((l >= 0) && (l <= 3)) { \
+ log_string = kLogStrings[l]; \
+ } \
+ std::cerr << log_string << ": " << x << std::endl; \
+ } \
+ } while(0)
+
+#define GL_CRIT 0
+#define GL_ERROR 1
+#define GL_INFO 2
+#define GL_DEBUG 3
+
+const char* kLogStrings[] = {
+ "Critical",
+ "Error",
+ "Info",
+ "Debug"
+};
+
+
+GMPPlatformAPI* g_platform_api = NULL;
+
+class FakeVideoEncoder;
+class FakeVideoDecoder;
+
+struct EncodedFrame {
+ uint32_t length_;
+ uint8_t h264_compat_;
+ uint32_t magic_;
+ uint32_t width_;
+ uint32_t height_;
+ uint8_t y_;
+ uint8_t u_;
+ uint8_t v_;
+ uint32_t timestamp_;
+};
+
+#define ENCODED_FRAME_MAGIC 0x4652414d
+
+class FakeEncoderTask : public GMPTask {
+ public:
+ FakeEncoderTask(FakeVideoEncoder* encoder,
+ GMPVideoi420Frame* frame,
+ GMPVideoFrameType type)
+ : encoder_(encoder), frame_(frame), type_(type) {}
+
+ virtual void Run();
+ virtual void Destroy() { delete this; }
+
+ FakeVideoEncoder* encoder_;
+ GMPVideoi420Frame* frame_;
+ GMPVideoFrameType type_;
+};
+
+class FakeVideoEncoder : public GMPVideoEncoder {
+ public:
+ explicit FakeVideoEncoder (GMPVideoHost* hostAPI) :
+ host_ (hostAPI),
+ callback_ (NULL) {}
+
+ virtual void InitEncode (const GMPVideoCodec& codecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificSize,
+ GMPVideoEncoderCallback* callback,
+ int32_t numberOfCores,
+ uint32_t maxPayloadSize) {
+ callback_ = callback;
+
+ GMPLOG (GL_INFO, "Initialized encoder");
+ }
+
+ virtual void Encode (GMPVideoi420Frame* inputImage,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ const GMPVideoFrameType* aFrameTypes,
+ uint32_t aFrameTypesLength) {
+ GMPLOG (GL_DEBUG,
+ __FUNCTION__
+ << " size="
+ << inputImage->Width() << "x" << inputImage->Height());
+
+ assert (aFrameTypesLength != 0);
+
+ g_platform_api->runonmainthread(new FakeEncoderTask(this,
+ inputImage,
+ aFrameTypes[0]));
+ }
+
+ void Encode_m (GMPVideoi420Frame* inputImage,
+ GMPVideoFrameType frame_type) {
+ if (frame_type == kGMPKeyFrame) {
+ if (!inputImage)
+ return;
+ }
+ if (!inputImage) {
+ GMPLOG (GL_ERROR, "no input image");
+ return;
+ }
+
+ // Now return the encoded data back to the parent.
+ GMPVideoFrame* ftmp;
+ GMPErr err = host_->CreateFrame(kGMPEncodedVideoFrame, &ftmp);
+ if (err != GMPNoErr) {
+ GMPLOG (GL_ERROR, "Error creating encoded frame");
+ return;
+ }
+
+ GMPVideoEncodedFrame* f = static_cast<GMPVideoEncodedFrame*> (ftmp);
+
+ // Encode this in a frame that looks a little bit like H.264.
+ // Note that we don't do PPS or SPS.
+ // Copy the data. This really should convert this to network byte order.
+ EncodedFrame eframe;
+ eframe.length_ = sizeof(eframe) - sizeof(uint32_t);
+ eframe.h264_compat_ = 5; // Emulate a H.264 IDR NAL.
+ eframe.magic_ = ENCODED_FRAME_MAGIC;
+ eframe.width_ = inputImage->Width();
+ eframe.height_ = inputImage->Height();
+ eframe.y_ = AveragePlane(inputImage->Buffer(kGMPYPlane),
+ inputImage->AllocatedSize(kGMPYPlane));
+ eframe.u_ = AveragePlane(inputImage->Buffer(kGMPUPlane),
+ inputImage->AllocatedSize(kGMPUPlane));
+ eframe.v_ = AveragePlane(inputImage->Buffer(kGMPVPlane),
+ inputImage->AllocatedSize(kGMPVPlane));
+
+ eframe.timestamp_ = inputImage->Timestamp();
+
+ err = f->CreateEmptyFrame (sizeof(eframe) +
+ (frame_type == kGMPKeyFrame ? sizeof(uint32_t) + BIG_FRAME : 0));
+ if (err != GMPNoErr) {
+ GMPLOG (GL_ERROR, "Error allocating frame data");
+ f->Destroy();
+ return;
+ }
+ memcpy(f->Buffer(), &eframe, sizeof(eframe));
+ if (frame_type == kGMPKeyFrame) {
+ *((uint32_t*) f->Buffer() + sizeof(eframe)) = BIG_FRAME;
+ }
+
+ f->SetEncodedWidth (inputImage->Width());
+ f->SetEncodedHeight (inputImage->Height());
+ f->SetTimeStamp (inputImage->Timestamp());
+ f->SetFrameType (frame_type);
+ f->SetCompleteFrame (true);
+ f->SetBufferType(GMP_BufferLength32);
+
+ GMPLOG (GL_DEBUG, "Encoding complete. type= "
+ << f->FrameType()
+ << " length="
+ << f->Size()
+ << " timestamp="
+ << f->TimeStamp());
+
+ // Return the encoded frame.
+ GMPCodecSpecificInfo info;
+ memset (&info, 0, sizeof (info));
+ info.mCodecType = kGMPVideoCodecH264;
+ info.mBufferType = GMP_BufferLength32;
+ info.mCodecSpecific.mH264.mSimulcastIdx = 0;
+ GMPLOG (GL_DEBUG, "Calling callback");
+ callback_->Encoded (f, reinterpret_cast<uint8_t*> (&info), sizeof(info));
+ GMPLOG (GL_DEBUG, "Callback called");
+ }
+
+ virtual void SetChannelParameters (uint32_t aPacketLoss, uint32_t aRTT) {
+ }
+
+ virtual void SetRates (uint32_t aNewBitRate, uint32_t aFrameRate) {
+ }
+
+ virtual void SetPeriodicKeyFrames (bool aEnable) {
+ }
+
+ virtual void EncodingComplete() {
+ delete this;
+ }
+
+ private:
+ uint8_t AveragePlane(uint8_t* ptr, size_t len) {
+ uint64_t val = 0;
+
+ for (size_t i=0; i<len; ++i) {
+ val += ptr[i];
+ }
+
+ return (val / len) % 0xff;
+ }
+
+ GMPVideoHost* host_;
+ GMPVideoEncoderCallback* callback_;
+};
+
+void FakeEncoderTask::Run() {
+ encoder_->Encode_m(frame_, type_);
+ frame_->Destroy();
+}
+
+class FakeDecoderTask : public GMPTask {
+ public:
+ FakeDecoderTask(FakeVideoDecoder* decoder,
+ GMPVideoEncodedFrame* frame,
+ int64_t time)
+ : decoder_(decoder), frame_(frame), time_(time) {}
+
+ virtual void Run();
+ virtual void Destroy() { delete this; }
+
+ FakeVideoDecoder* decoder_;
+ GMPVideoEncodedFrame* frame_;
+ int64_t time_;
+};
+
+class FakeVideoDecoder : public GMPVideoDecoder {
+ public:
+ explicit FakeVideoDecoder (GMPVideoHost* hostAPI) :
+ host_ (hostAPI),
+ callback_ (NULL) {}
+
+ virtual ~FakeVideoDecoder() {
+ }
+
+ virtual void InitDecode (const GMPVideoCodec& codecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificSize,
+ GMPVideoDecoderCallback* callback,
+ int32_t coreCount) {
+ GMPLOG (GL_INFO, "InitDecode");
+
+ callback_ = callback;
+ }
+
+ virtual void Decode (GMPVideoEncodedFrame* inputFrame,
+ bool missingFrames,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ int64_t renderTimeMs = -1) {
+ GMPLOG (GL_DEBUG, __FUNCTION__
+ << "Decoding frame size=" << inputFrame->Size()
+ << " timestamp=" << inputFrame->TimeStamp());
+ g_platform_api->runonmainthread(new FakeDecoderTask(this, inputFrame, renderTimeMs));
+ }
+
+ virtual void Reset() {
+ }
+
+ virtual void Drain() {
+ }
+
+ virtual void DecodingComplete() {
+ delete this;
+ }
+
+ // Return the decoded data back to the parent.
+ void Decode_m (GMPVideoEncodedFrame* inputFrame,
+ int64_t renderTimeMs) {
+ EncodedFrame *eframe;
+ if (inputFrame->Size() != (sizeof(*eframe))) {
+ GMPLOG (GL_ERROR, "Couldn't decode frame. Size=" << inputFrame->Size());
+ return;
+ }
+ eframe = reinterpret_cast<EncodedFrame*>(inputFrame->Buffer());
+
+ if (eframe->magic_ != ENCODED_FRAME_MAGIC) {
+ GMPLOG (GL_ERROR, "Couldn't decode frame. Magic=" << eframe->magic_);
+ return;
+ }
+
+ int width = eframe->width_;
+ int height = eframe->height_;
+ int ystride = eframe->width_;
+ int uvstride = eframe->width_/2;
+
+ GMPLOG (GL_DEBUG, "Video frame ready for display "
+ << width
+ << "x"
+ << height
+ << " timestamp="
+ << inputFrame->TimeStamp());
+
+ GMPVideoFrame* ftmp = NULL;
+
+ // Translate the image.
+ GMPErr err = host_->CreateFrame (kGMPI420VideoFrame, &ftmp);
+ if (err != GMPNoErr) {
+ GMPLOG (GL_ERROR, "Couldn't allocate empty I420 frame");
+ return;
+ }
+
+ GMPVideoi420Frame* frame = static_cast<GMPVideoi420Frame*> (ftmp);
+ err = frame->CreateEmptyFrame (
+ width, height,
+ ystride, uvstride, uvstride);
+ if (err != GMPNoErr) {
+ GMPLOG (GL_ERROR, "Couldn't make decoded frame");
+ return;
+ }
+
+ memset(frame->Buffer(kGMPYPlane),
+ eframe->y_,
+ frame->AllocatedSize(kGMPYPlane));
+ memset(frame->Buffer(kGMPUPlane),
+ eframe->u_,
+ frame->AllocatedSize(kGMPUPlane));
+ memset(frame->Buffer(kGMPVPlane),
+ eframe->v_,
+ frame->AllocatedSize(kGMPVPlane));
+
+ GMPLOG (GL_DEBUG, "Allocated size = "
+ << frame->AllocatedSize (kGMPYPlane));
+ frame->SetTimestamp (inputFrame->TimeStamp());
+ frame->SetDuration (inputFrame->Duration());
+ callback_->Decoded (frame);
+
+ }
+
+ GMPVideoHost* host_;
+ GMPVideoDecoderCallback* callback_;
+};
+
+void FakeDecoderTask::Run() {
+ decoder_->Decode_m(frame_, time_);
+ frame_->Destroy();
+}
+
+extern "C" {
+
+ PUBLIC_FUNC GMPErr
+ GMPInit (GMPPlatformAPI* aPlatformAPI) {
+ g_platform_api = aPlatformAPI;
+ return GMPNoErr;
+ }
+
+ PUBLIC_FUNC GMPErr
+ GMPGetAPI (const char* aApiName, void* aHostAPI, void** aPluginApi) {
+ if (!strcmp (aApiName, GMP_API_VIDEO_DECODER)) {
+ *aPluginApi = new FakeVideoDecoder (static_cast<GMPVideoHost*> (aHostAPI));
+ return GMPNoErr;
+ } else if (!strcmp (aApiName, GMP_API_VIDEO_ENCODER)) {
+ *aPluginApi = new FakeVideoEncoder (static_cast<GMPVideoHost*> (aHostAPI));
+ return GMPNoErr;
+#if defined(GMP_FAKE_SUPPORT_DECRYPT)
+ } else if (!strcmp (aApiName, GMP_API_DECRYPTOR)) {
+ *aPluginApi = new FakeDecryptor(static_cast<GMPDecryptorHost*> (aHostAPI));
+ return GMPNoErr;
+ } else if (!strcmp (aApiName, GMP_API_ASYNC_SHUTDOWN)) {
+ *aPluginApi = new TestAsyncShutdown(static_cast<GMPAsyncShutdownHost*> (aHostAPI));
+ return GMPNoErr;
+#endif
+ }
+ return GMPGenericErr;
+ }
+
+ PUBLIC_FUNC void
+ GMPShutdown (void) {
+ g_platform_api = NULL;
+ }
+
+} // extern "C"
diff --git a/dom/media/gmp-plugin-openh264/moz.build b/dom/media/gmp-plugin-openh264/moz.build
new file mode 100644
index 000000000..5ae13a7e6
--- /dev/null
+++ b/dom/media/gmp-plugin-openh264/moz.build
@@ -0,0 +1,30 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# largely a copy of dom/media/gmp-fake/moz.build
+
+FINAL_TARGET = 'dist/bin/gmp-fakeopenh264/1.0'
+
+FINAL_TARGET_FILES += [
+ 'fakeopenh264.info',
+ 'fakeopenh264.voucher',
+]
+
+SOURCES += [
+ 'gmp-fake-openh264.cpp',
+]
+
+SharedLibrary("fakeopenh264")
+
+if CONFIG['OS_ARCH'] == 'WINNT':
+ OS_LIBS += [
+ 'ole32',
+ ]
+
+USE_STATIC_LIBS = True
+NO_VISIBILITY_FLAGS = True
+# Don't use STL wrappers; this isn't Gecko code
+DISABLE_STL_WRAPPING = True
diff --git a/dom/media/gmp-plugin/fake.info b/dom/media/gmp-plugin/fake.info
new file mode 100644
index 000000000..b0592ff63
--- /dev/null
+++ b/dom/media/gmp-plugin/fake.info
@@ -0,0 +1,5 @@
+Name: fake
+Description: Fake GMP Plugin, which deliberately uses GMP_API_DECRYPTOR_BACKWARDS_COMPAT for its decryptor.
+Version: 1.0
+APIs: decode-video[h264:broken], eme-decrypt-v7[fake]
+Libraries: dxva2.dll
diff --git a/dom/media/gmp-plugin/fake.voucher b/dom/media/gmp-plugin/fake.voucher
new file mode 100644
index 000000000..bb133701c
--- /dev/null
+++ b/dom/media/gmp-plugin/fake.voucher
@@ -0,0 +1 @@
+gmp-fake placeholder voucher \ No newline at end of file
diff --git a/dom/media/gmp-plugin/gmp-fake.cpp b/dom/media/gmp-plugin/gmp-fake.cpp
new file mode 100644
index 000000000..b67efe251
--- /dev/null
+++ b/dom/media/gmp-plugin/gmp-fake.cpp
@@ -0,0 +1,98 @@
+/*!
+ * \copy
+ * Copyright (c) 2009-2014, Cisco Systems
+ * Copyright (c) 2014, Mozilla
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ *************************************************************************************
+ */
+
+#include <stdint.h>
+#include <cstdio>
+#include <cstring>
+#include <string>
+#include <memory>
+
+#include "gmp-platform.h"
+#include "gmp-video-decode.h"
+
+#if defined(GMP_FAKE_SUPPORT_DECRYPT)
+#include "gmp-decryption.h"
+#include "gmp-test-decryptor.h"
+#include "gmp-test-storage.h"
+#endif
+
+#if defined(_MSC_VER)
+#define PUBLIC_FUNC __declspec(dllexport)
+#else
+#define PUBLIC_FUNC
+#endif
+
+GMPPlatformAPI* g_platform_api = NULL;
+
+extern "C" {
+
+ PUBLIC_FUNC GMPErr
+ GMPInit (GMPPlatformAPI* aPlatformAPI) {
+ g_platform_api = aPlatformAPI;
+ return GMPNoErr;
+ }
+
+ PUBLIC_FUNC GMPErr
+ GMPGetAPI (const char* aApiName, void* aHostAPI, void** aPluginApi) {
+ if (!strcmp (aApiName, GMP_API_VIDEO_DECODER)) {
+ // Note: Deliberately advertise in our .info file that we support
+ // video-decode, but we fail the "get" call here to simulate what
+ // happens when decoder init fails.
+ return GMPGenericErr;
+#if defined(GMP_FAKE_SUPPORT_DECRYPT)
+ } else if (!strcmp (aApiName, GMP_API_DECRYPTOR_BACKWARDS_COMPAT)) {
+ *aPluginApi = new FakeDecryptor(static_cast<GMPDecryptorHost*> (aHostAPI));
+ return GMPNoErr;
+ } else if (!strcmp (aApiName, GMP_API_ASYNC_SHUTDOWN)) {
+ *aPluginApi = new TestAsyncShutdown(static_cast<GMPAsyncShutdownHost*> (aHostAPI));
+ return GMPNoErr;
+#endif
+ }
+ return GMPGenericErr;
+ }
+
+ PUBLIC_FUNC void
+ GMPShutdown (void) {
+ g_platform_api = NULL;
+ }
+
+#if defined(GMP_FAKE_SUPPORT_DECRYPT)
+ PUBLIC_FUNC void
+ GMPSetNodeId(const char* aNodeId, uint32_t aLength) {
+ FakeDecryptor::SetNodeId(aNodeId, aLength);
+ }
+#endif
+
+} // extern "C"
diff --git a/dom/media/gmp-plugin/gmp-test-decryptor.cpp b/dom/media/gmp-plugin/gmp-test-decryptor.cpp
new file mode 100644
index 000000000..afa809602
--- /dev/null
+++ b/dom/media/gmp-plugin/gmp-test-decryptor.cpp
@@ -0,0 +1,608 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gmp-test-decryptor.h"
+#include "gmp-test-storage.h"
+#include "gmp-test-output-protection.h"
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <istream>
+#include <iterator>
+#include <sstream>
+#include <set>
+
+#include "mozilla/Assertions.h"
+#include "mozilla/Attributes.h"
+
+using namespace std;
+
+std::string FakeDecryptor::sNodeId;
+
+FakeDecryptor* FakeDecryptor::sInstance = nullptr;
+extern GMPPlatformAPI* g_platform_api; // Defined in gmp-fake.cpp
+
+class GMPMutexAutoLock
+{
+public:
+ explicit GMPMutexAutoLock(GMPMutex* aMutex) : mMutex(aMutex) {
+ mMutex->Acquire();
+ }
+ ~GMPMutexAutoLock() {
+ mMutex->Release();
+ }
+private:
+ GMPMutex* const mMutex;
+};
+
+class TestManager {
+public:
+ TestManager() : mMutex(CreateMutex()) {}
+
+ // Register a test with the test manager.
+ void BeginTest(const string& aTestID) {
+ GMPMutexAutoLock lock(mMutex);
+ auto found = mTestIDs.find(aTestID);
+ if (found == mTestIDs.end()) {
+ mTestIDs.insert(aTestID);
+ } else {
+ Error("FAIL BeginTest test already existed: " + aTestID);
+ }
+ }
+
+ // Notify the test manager that the test is finished. If all tests are done,
+ // test manager will send "test-storage complete" to notify the parent that
+ // all tests are finished and also delete itself.
+ void EndTest(const string& aTestID) {
+ bool isEmpty = false;
+ {
+ GMPMutexAutoLock lock(mMutex);
+ auto found = mTestIDs.find(aTestID);
+ if (found != mTestIDs.end()) {
+ mTestIDs.erase(aTestID);
+ isEmpty = mTestIDs.empty();
+ } else {
+ Error("FAIL EndTest test not existed: " + aTestID);
+ return;
+ }
+ }
+ if (isEmpty) {
+ Finish();
+ delete this;
+ }
+ }
+
+private:
+ ~TestManager() {
+ mMutex->Destroy();
+ }
+
+ static void Error(const string& msg) {
+ FakeDecryptor::Message(msg);
+ }
+
+ static void Finish() {
+ FakeDecryptor::Message("test-storage complete");
+ }
+
+ static GMPMutex* CreateMutex() {
+ GMPMutex* mutex = nullptr;
+ g_platform_api->createmutex(&mutex);
+ return mutex;
+ }
+
+ GMPMutex* const mMutex;
+ set<string> mTestIDs;
+};
+
+FakeDecryptor::FakeDecryptor(GMPDecryptorHost* aHost)
+ : mCallback(nullptr)
+ , mHost(aHost)
+{
+ MOZ_ASSERT(!sInstance);
+ sInstance = this;
+}
+
+void FakeDecryptor::DecryptingComplete()
+{
+ sInstance = nullptr;
+ delete this;
+}
+
+void
+FakeDecryptor::Message(const std::string& aMessage)
+{
+ MOZ_ASSERT(sInstance);
+ const static std::string sid("fake-session-id");
+ sInstance->mCallback->SessionMessage(sid.c_str(), sid.size(),
+ kGMPLicenseRequest,
+ (const uint8_t*)aMessage.c_str(), aMessage.size());
+}
+
+std::vector<std::string>
+Tokenize(const std::string& aString)
+{
+ std::stringstream strstr(aString);
+ std::istream_iterator<std::string> it(strstr), end;
+ return std::vector<std::string>(it, end);
+}
+
+static const string TruncateRecordId = "truncate-record-id";
+static const string TruncateRecordData = "I will soon be truncated";
+
+class ReadThenTask : public GMPTask {
+public:
+ ReadThenTask(string aId, ReadContinuation* aThen)
+ : mId(aId)
+ , mThen(aThen)
+ {}
+ void Run() override {
+ ReadRecord(mId, mThen);
+ }
+ void Destroy() override {
+ delete this;
+ }
+ string mId;
+ ReadContinuation* mThen;
+};
+
+class SendMessageTask : public GMPTask {
+public:
+ explicit SendMessageTask(const string& aMessage,
+ TestManager* aTestManager = nullptr,
+ const string& aTestID = "")
+ : mMessage(aMessage), mTestmanager(aTestManager), mTestID(aTestID) {}
+
+ void Run() override {
+ FakeDecryptor::Message(mMessage);
+ if (mTestmanager) {
+ mTestmanager->EndTest(mTestID);
+ }
+ }
+
+ void Destroy() override {
+ delete this;
+ }
+
+private:
+ string mMessage;
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+class TestEmptyContinuation : public ReadContinuation {
+public:
+ TestEmptyContinuation(TestManager* aTestManager, const string& aTestID)
+ : mTestmanager(aTestManager), mTestID(aTestID) {}
+
+ void ReadComplete(GMPErr aErr, const std::string& aData) override {
+ if (aData != "") {
+ FakeDecryptor::Message("FAIL TestEmptyContinuation record was not truncated");
+ }
+ mTestmanager->EndTest(mTestID);
+ delete this;
+ }
+
+private:
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+class TruncateContinuation : public ReadContinuation {
+public:
+ TruncateContinuation(const string& aID,
+ TestManager* aTestManager,
+ const string& aTestID)
+ : mID(aID), mTestmanager(aTestManager), mTestID(aTestID) {}
+
+ void ReadComplete(GMPErr aErr, const std::string& aData) override {
+ if (aData != TruncateRecordData) {
+ FakeDecryptor::Message("FAIL TruncateContinuation read data doesn't match written data");
+ }
+ auto cont = new TestEmptyContinuation(mTestmanager, mTestID);
+ auto msg = "FAIL in TruncateContinuation write.";
+ auto failTask = new SendMessageTask(msg, mTestmanager, mTestID);
+ WriteRecord(mID, nullptr, 0, new ReadThenTask(mID, cont), failTask);
+ delete this;
+ }
+
+private:
+ const string mID;
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+class VerifyAndFinishContinuation : public ReadContinuation {
+public:
+ explicit VerifyAndFinishContinuation(string aValue,
+ TestManager* aTestManager,
+ const string& aTestID)
+ : mValue(aValue), mTestmanager(aTestManager), mTestID(aTestID) {}
+
+ void ReadComplete(GMPErr aErr, const std::string& aData) override {
+ if (aData != mValue) {
+ FakeDecryptor::Message("FAIL VerifyAndFinishContinuation read data doesn't match expected data");
+ }
+ mTestmanager->EndTest(mTestID);
+ delete this;
+ }
+
+private:
+ string mValue;
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+class VerifyAndOverwriteContinuation : public ReadContinuation {
+public:
+ VerifyAndOverwriteContinuation(string aId, string aValue, string aOverwrite,
+ TestManager* aTestManager, const string& aTestID)
+ : mId(aId)
+ , mValue(aValue)
+ , mOverwrite(aOverwrite)
+ , mTestmanager(aTestManager)
+ , mTestID(aTestID)
+ {}
+
+ void ReadComplete(GMPErr aErr, const std::string& aData) override {
+ if (aData != mValue) {
+ FakeDecryptor::Message("FAIL VerifyAndOverwriteContinuation read data doesn't match expected data");
+ }
+ auto cont = new VerifyAndFinishContinuation(mOverwrite, mTestmanager, mTestID);
+ auto msg = "FAIL in VerifyAndOverwriteContinuation write.";
+ auto failTask = new SendMessageTask(msg, mTestmanager, mTestID);
+ WriteRecord(mId, mOverwrite, new ReadThenTask(mId, cont), failTask);
+ delete this;
+ }
+
+private:
+ string mId;
+ string mValue;
+ string mOverwrite;
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+static const string OpenAgainRecordId = "open-again-record-id";
+
+class OpenedSecondTimeContinuation : public OpenContinuation {
+public:
+ explicit OpenedSecondTimeContinuation(GMPRecord* aRecord,
+ TestManager* aTestManager,
+ const string& aTestID)
+ : mRecord(aRecord), mTestmanager(aTestManager), mTestID(aTestID) {
+ MOZ_ASSERT(aRecord);
+ }
+
+ virtual void OpenComplete(GMPErr aStatus, GMPRecord* aRecord) override {
+ if (GMP_SUCCEEDED(aStatus)) {
+ FakeDecryptor::Message("FAIL OpenSecondTimeContinuation should not be able to re-open record.");
+ }
+ if (aRecord) {
+ aRecord->Close();
+ }
+ // Succeeded, open should have failed.
+ mTestmanager->EndTest(mTestID);
+ mRecord->Close();
+ }
+
+private:
+ GMPRecord* mRecord;
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+class OpenedFirstTimeContinuation : public OpenContinuation {
+public:
+ OpenedFirstTimeContinuation(const string& aID,
+ TestManager* aTestManager,
+ const string& aTestID)
+ : mID(aID), mTestmanager(aTestManager), mTestID(aTestID) {}
+
+ virtual void OpenComplete(GMPErr aStatus, GMPRecord* aRecord) override {
+ if (GMP_FAILED(aStatus)) {
+ FakeDecryptor::Message("FAIL OpenAgainContinuation to open record initially.");
+ mTestmanager->EndTest(mTestID);
+ if (aRecord) {
+ aRecord->Close();
+ }
+ return;
+ }
+
+ auto cont = new OpenedSecondTimeContinuation(aRecord, mTestmanager, mTestID);
+ GMPOpenRecord(mID, cont);
+ }
+
+private:
+ const string mID;
+ TestManager* const mTestmanager;
+ const string mTestID;
+};
+
+static void
+DoTestStorage(const string& aPrefix, TestManager* aTestManager)
+{
+ // Basic I/O tests. We run three cases concurrently. The tests, like
+ // GMPStorage run asynchronously. When they've all passed, we send
+ // a message back to the parent process, or a failure message if not.
+
+ // Test 1: Basic I/O test, and test that writing 0 bytes in a record
+ // deletes record.
+ //
+ // Write data to truncate record, then
+ // read data, verify that we read what we wrote, then
+ // write 0 bytes to truncate record, then
+ // read data, verify that 0 bytes was read
+ const string id1 = aPrefix + TruncateRecordId;
+ const string testID1 = aPrefix + "write-test-1";
+ aTestManager->BeginTest(testID1);
+ auto cont1 = new TruncateContinuation(id1, aTestManager, testID1);
+ auto msg1 = "FAIL in TestStorage writing TruncateRecord.";
+ auto failTask1 = new SendMessageTask(msg1, aTestManager, testID1);
+ WriteRecord(id1, TruncateRecordData,
+ new ReadThenTask(id1, cont1), failTask1);
+
+ // Test 2: Test that overwriting a record with a shorter record truncates
+ // the record to the shorter record.
+ //
+ // Write record, then
+ // read and verify record, then
+ // write a shorter record to same record.
+ // read and verify
+ string id2 = aPrefix + "record1";
+ string record1 = "This is the first write to a record.";
+ string overwrite = "A shorter record";
+ const string testID2 = aPrefix + "write-test-2";
+ aTestManager->BeginTest(testID2);
+ auto task2 = new VerifyAndOverwriteContinuation(id2, record1, overwrite,
+ aTestManager, testID2);
+ auto msg2 = "FAIL in TestStorage writing record1.";
+ auto failTask2 = new SendMessageTask(msg2, aTestManager, testID2);
+ WriteRecord(id2, record1, new ReadThenTask(id2, task2), failTask2);
+
+ // Test 3: Test that opening a record while it's already open fails.
+ //
+ // Open record1, then
+ // open record1, should fail.
+ // close record1
+ const string id3 = aPrefix + OpenAgainRecordId;
+ const string testID3 = aPrefix + "open-test-1";
+ aTestManager->BeginTest(testID3);
+ auto task3 = new OpenedFirstTimeContinuation(id3, aTestManager, testID3);
+ GMPOpenRecord(id3, task3);
+}
+
+class TestStorageTask : public GMPTask {
+public:
+ TestStorageTask(const string& aPrefix, TestManager* aTestManager)
+ : mPrefix(aPrefix), mTestManager(aTestManager) {}
+ virtual void Destroy() { delete this; }
+ virtual void Run() {
+ DoTestStorage(mPrefix, mTestManager);
+ }
+private:
+ const string mPrefix;
+ TestManager* const mTestManager;
+};
+
+void
+FakeDecryptor::TestStorage()
+{
+ TestManager* testManager = new TestManager();
+ GMPThread* thread1 = nullptr;
+ GMPThread* thread2 = nullptr;
+
+ // Main thread tests.
+ DoTestStorage("mt1-", testManager);
+ DoTestStorage("mt2-", testManager);
+
+ // Off-main-thread tests.
+ if (GMP_SUCCEEDED(g_platform_api->createthread(&thread1))) {
+ thread1->Post(new TestStorageTask("thread1-", testManager));
+ } else {
+ FakeDecryptor::Message("FAIL to create thread1 for storage tests");
+ }
+
+ if (GMP_SUCCEEDED(g_platform_api->createthread(&thread2))) {
+ thread2->Post(new TestStorageTask("thread2-", testManager));
+ } else {
+ FakeDecryptor::Message("FAIL to create thread2 for storage tests");
+ }
+
+ if (thread1) {
+ thread1->Join();
+ }
+
+ if (thread2) {
+ thread2->Join();
+ }
+
+ // Note: Once all tests finish, TestManager will dispatch "test-pass" message,
+ // which ends the test for the parent.
+}
+
+class ReportWritten : public GMPTask {
+public:
+ ReportWritten(const string& aRecordId, const string& aValue)
+ : mRecordId(aRecordId)
+ , mValue(aValue)
+ {}
+ void Run() override {
+ FakeDecryptor::Message("stored " + mRecordId + " " + mValue);
+ }
+ void Destroy() override {
+ delete this;
+ }
+ const string mRecordId;
+ const string mValue;
+};
+
+class ReportReadStatusContinuation : public ReadContinuation {
+public:
+ explicit ReportReadStatusContinuation(const string& aRecordId)
+ : mRecordId(aRecordId)
+ {}
+ void ReadComplete(GMPErr aErr, const std::string& aData) override {
+ if (GMP_FAILED(aErr)) {
+ FakeDecryptor::Message("retrieve " + mRecordId + " failed");
+ } else {
+ stringstream ss;
+ ss << aData.size();
+ string len;
+ ss >> len;
+ FakeDecryptor::Message("retrieve " + mRecordId + " succeeded (length " +
+ len + " bytes)");
+ }
+ delete this;
+ }
+ string mRecordId;
+};
+
+class ReportReadRecordContinuation : public ReadContinuation {
+public:
+ explicit ReportReadRecordContinuation(const string& aRecordId)
+ : mRecordId(aRecordId)
+ {}
+ void ReadComplete(GMPErr aErr, const std::string& aData) override {
+ if (GMP_FAILED(aErr)) {
+ FakeDecryptor::Message("retrieved " + mRecordId + " failed");
+ } else {
+ FakeDecryptor::Message("retrieved " + mRecordId + " " + aData);
+ }
+ delete this;
+ }
+ string mRecordId;
+};
+
+static void
+RecvGMPRecordIterator(GMPRecordIterator* aRecordIterator,
+ void* aUserArg,
+ GMPErr aStatus)
+{
+ FakeDecryptor* decryptor = reinterpret_cast<FakeDecryptor*>(aUserArg);
+ decryptor->ProcessRecordNames(aRecordIterator, aStatus);
+}
+
+void
+FakeDecryptor::ProcessRecordNames(GMPRecordIterator* aRecordIterator,
+ GMPErr aStatus)
+{
+ if (sInstance != this) {
+ FakeDecryptor::Message("Error aUserArg was not passed through GetRecordIterator");
+ return;
+ }
+ if (GMP_FAILED(aStatus)) {
+ FakeDecryptor::Message("Error GetRecordIterator failed");
+ return;
+ }
+ std::string response("record-names ");
+ bool first = true;
+ const char* name = nullptr;
+ uint32_t len = 0;
+ while (GMP_SUCCEEDED(aRecordIterator->GetName(&name, &len))) {
+ std::string s(name, name+len);
+ if (!first) {
+ response += ",";
+ } else {
+ first = false;
+ }
+ response += s;
+ aRecordIterator->NextRecord();
+ }
+ aRecordIterator->Close();
+ FakeDecryptor::Message(response);
+}
+
+enum ShutdownMode {
+ ShutdownNormal,
+ ShutdownTimeout,
+ ShutdownStoreToken
+};
+
+static ShutdownMode sShutdownMode = ShutdownNormal;
+static string sShutdownToken = "";
+
+void
+FakeDecryptor::UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize)
+{
+ std::string response((const char*)aResponse, (const char*)(aResponse)+aResponseSize);
+ std::vector<std::string> tokens = Tokenize(response);
+ const string& task = tokens[0];
+ if (task == "test-storage") {
+ TestStorage();
+ } else if (task == "store") {
+ // send "stored record" message on complete.
+ const string& id = tokens[1];
+ const string& value = tokens[2];
+ WriteRecord(id,
+ value,
+ new ReportWritten(id, value),
+ new SendMessageTask("FAIL in writing record."));
+ } else if (task == "retrieve") {
+ const string& id = tokens[1];
+ ReadRecord(id, new ReportReadStatusContinuation(id));
+ } else if (task == "shutdown-mode") {
+ const string& mode = tokens[1];
+ if (mode == "timeout") {
+ sShutdownMode = ShutdownTimeout;
+ } else if (mode == "token") {
+ sShutdownMode = ShutdownStoreToken;
+ sShutdownToken = tokens[2];
+ Message("shutdown-token received " + sShutdownToken);
+ }
+ } else if (task == "retrieve-shutdown-token") {
+ ReadRecord("shutdown-token", new ReportReadRecordContinuation("shutdown-token"));
+ } else if (task == "test-op-apis") {
+ mozilla::gmptest::TestOuputProtectionAPIs();
+ } else if (task == "retrieve-plugin-voucher") {
+ const uint8_t* rawVoucher = nullptr;
+ uint32_t length = 0;
+ mHost->GetPluginVoucher(&rawVoucher, &length);
+ std::string voucher((const char*)rawVoucher, (const char*)(rawVoucher + length));
+ Message("retrieved plugin-voucher: " + voucher);
+ } else if (task == "retrieve-record-names") {
+ GMPEnumRecordNames(&RecvGMPRecordIterator, this);
+ } else if (task == "retrieve-node-id") {
+ Message("node-id " + sNodeId);
+ }
+}
+
+class CompleteShutdownTask : public GMPTask {
+public:
+ explicit CompleteShutdownTask(GMPAsyncShutdownHost* aHost)
+ : mHost(aHost)
+ {
+ }
+ virtual void Run() {
+ mHost->ShutdownComplete();
+ }
+ virtual void Destroy() { delete this; }
+ GMPAsyncShutdownHost* mHost;
+};
+
+void
+TestAsyncShutdown::BeginShutdown() {
+ switch (sShutdownMode) {
+ case ShutdownNormal:
+ mHost->ShutdownComplete();
+ break;
+ case ShutdownTimeout:
+ // Don't do anything; wait for timeout, Gecko should kill
+ // the plugin and recover.
+ break;
+ case ShutdownStoreToken:
+ // Store message, then shutdown.
+ WriteRecord("shutdown-token",
+ sShutdownToken,
+ new CompleteShutdownTask(mHost),
+ new SendMessageTask("FAIL writing shutdown-token."));
+ break;
+ }
+}
diff --git a/dom/media/gmp-plugin/gmp-test-decryptor.h b/dom/media/gmp-plugin/gmp-test-decryptor.h
new file mode 100644
index 000000000..3b17e42c5
--- /dev/null
+++ b/dom/media/gmp-plugin/gmp-test-decryptor.h
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FAKE_DECRYPTOR_H__
+#define FAKE_DECRYPTOR_H__
+
+#include "gmp-decryption.h"
+#include "gmp-async-shutdown.h"
+#include <string>
+#include "mozilla/Attributes.h"
+
+class FakeDecryptor : public GMPDecryptor7 {
+public:
+
+ explicit FakeDecryptor(GMPDecryptorHost* aHost);
+
+ void Init(GMPDecryptorCallback* aCallback) override {
+ mCallback = aCallback;
+ }
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const char* aInitDataType,
+ uint32_t aInitDataTypeSize,
+ const uint8_t* aInitData,
+ uint32_t aInitDataSize,
+ GMPSessionType aSessionType) override
+ {
+ }
+
+ void LoadSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override
+ {
+ }
+
+ void UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize) override;
+
+ void CloseSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override
+ {
+ }
+
+ void RemoveSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override
+ {
+ }
+
+ void SetServerCertificate(uint32_t aPromiseId,
+ const uint8_t* aServerCert,
+ uint32_t aServerCertSize) override
+ {
+ }
+
+ void Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata) override
+ {
+ }
+
+ void DecryptingComplete() override;
+
+ static void Message(const std::string& aMessage);
+
+ void ProcessRecordNames(GMPRecordIterator* aRecordIterator,
+ GMPErr aStatus);
+
+ static void SetNodeId(const char* aNodeId, uint32_t aLength) {
+ sNodeId = std::string(aNodeId, aNodeId + aLength);
+ }
+
+private:
+
+ virtual ~FakeDecryptor() {}
+ static FakeDecryptor* sInstance;
+ static std::string sNodeId;
+
+ void TestStorage();
+
+ GMPDecryptorCallback* mCallback;
+ GMPDecryptorHost* mHost;
+};
+
+class TestAsyncShutdown : public GMPAsyncShutdown {
+public:
+ explicit TestAsyncShutdown(GMPAsyncShutdownHost* aHost)
+ : mHost(aHost)
+ {
+ }
+ void BeginShutdown() override;
+private:
+ GMPAsyncShutdownHost* mHost;
+};
+
+#endif
diff --git a/dom/media/gmp-plugin/gmp-test-output-protection.h b/dom/media/gmp-plugin/gmp-test-output-protection.h
new file mode 100644
index 000000000..57855ca71
--- /dev/null
+++ b/dom/media/gmp-plugin/gmp-test-output-protection.h
@@ -0,0 +1,130 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if defined(XP_WIN)
+#include <d3d9.h> // needed to prevent re-definition of enums
+#include <stdio.h>
+#include <string>
+#include <vector>
+#include <windows.h>
+
+#include "opmapi.h"
+#endif
+
+namespace mozilla {
+namespace gmptest {
+
+#if defined(XP_WIN)
+typedef HRESULT(STDAPICALLTYPE * OPMGetVideoOutputsFromHMONITORProc)
+ (HMONITOR, OPM_VIDEO_OUTPUT_SEMANTICS, ULONG*, IOPMVideoOutput***);
+
+static OPMGetVideoOutputsFromHMONITORProc sOPMGetVideoOutputsFromHMONITORProc = nullptr;
+
+static BOOL CALLBACK EnumDisplayMonitorsCallback(HMONITOR hMonitor, HDC hdc,
+ LPRECT lprc, LPARAM pData)
+{
+ std::vector<std::string>* failureMsgs = (std::vector<std::string>*)pData;
+
+ MONITORINFOEXA miex;
+ ZeroMemory(&miex, sizeof(miex));
+ miex.cbSize = sizeof(miex);
+ if (!GetMonitorInfoA(hMonitor, &miex)) {
+ failureMsgs->push_back("FAIL GetMonitorInfoA call failed");
+ }
+
+ ULONG numVideoOutputs = 0;
+ IOPMVideoOutput** opmVideoOutputArray = nullptr;
+ HRESULT hr = sOPMGetVideoOutputsFromHMONITORProc(hMonitor,
+ OPM_VOS_OPM_SEMANTICS,
+ &numVideoOutputs,
+ &opmVideoOutputArray);
+ if (S_OK != hr) {
+ if (0x8007001f != hr && 0x80070032 != hr && 0xc02625e5 != hr) {
+ char msg[100];
+ sprintf(msg, "FAIL OPMGetVideoOutputsFromHMONITOR call failed: HRESULT=0x%08x", hr);
+ failureMsgs->push_back(msg);
+ }
+ return true;
+ }
+
+ DISPLAY_DEVICEA dd;
+ ZeroMemory(&dd, sizeof(dd));
+ dd.cb = sizeof(dd);
+ if (!EnumDisplayDevicesA(miex.szDevice, 0, &dd, 1)) {
+ failureMsgs->push_back("FAIL EnumDisplayDevicesA call failed");
+ }
+
+ for (ULONG i = 0; i < numVideoOutputs; ++i) {
+ OPM_RANDOM_NUMBER opmRandomNumber;
+ BYTE* certificate = nullptr;
+ ULONG certificateLength = 0;
+ hr = opmVideoOutputArray[i]->StartInitialization(&opmRandomNumber,
+ &certificate,
+ &certificateLength);
+ if (S_OK != hr) {
+ char msg[100];
+ sprintf(msg, "FAIL StartInitialization call failed: HRESULT=0x%08x", hr);
+ failureMsgs->push_back(msg);
+ }
+
+ if (certificate) {
+ CoTaskMemFree(certificate);
+ }
+
+ opmVideoOutputArray[i]->Release();
+ }
+
+ if (opmVideoOutputArray) {
+ CoTaskMemFree(opmVideoOutputArray);
+ }
+
+ return true;
+}
+#endif
+
+static void
+RunOutputProtectionAPITests()
+{
+#if defined(XP_WIN)
+ // Get hold of OPMGetVideoOutputsFromHMONITOR function.
+ HMODULE hDvax2DLL = GetModuleHandleW(L"dxva2.dll");
+ if (!hDvax2DLL) {
+ FakeDecryptor::Message("FAIL GetModuleHandleW call failed for dxva2.dll");
+ return;
+ }
+
+ sOPMGetVideoOutputsFromHMONITORProc = (OPMGetVideoOutputsFromHMONITORProc)
+ GetProcAddress(hDvax2DLL, "OPMGetVideoOutputsFromHMONITOR");
+ if (!sOPMGetVideoOutputsFromHMONITORProc) {
+ FakeDecryptor::Message("FAIL GetProcAddress call failed for OPMGetVideoOutputsFromHMONITOR");
+ return;
+ }
+
+ // Test EnumDisplayMonitors.
+ // Other APIs are tested in the callback function.
+ std::vector<std::string> failureMsgs;
+ if (!EnumDisplayMonitors(NULL, NULL, EnumDisplayMonitorsCallback,
+ (LPARAM) &failureMsgs)) {
+ FakeDecryptor::Message("FAIL EnumDisplayMonitors call failed");
+ }
+
+ // Report any failures in the callback function.
+ for (size_t i = 0; i < failureMsgs.size(); i++) {
+ FakeDecryptor::Message(failureMsgs[i]);
+ }
+#endif
+}
+
+static void
+TestOuputProtectionAPIs()
+{
+ RunOutputProtectionAPITests();
+ FakeDecryptor::Message("OP tests completed");
+ return;
+}
+
+} // namespace gmptest
+} // namespace mozilla
diff --git a/dom/media/gmp-plugin/gmp-test-storage.cpp b/dom/media/gmp-plugin/gmp-test-storage.cpp
new file mode 100644
index 000000000..e75b49f42
--- /dev/null
+++ b/dom/media/gmp-plugin/gmp-test-storage.cpp
@@ -0,0 +1,233 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gmp-test-storage.h"
+#include <vector>
+
+#include "mozilla/Assertions.h"
+#include "mozilla/Attributes.h"
+
+class WriteRecordClient : public GMPRecordClient {
+public:
+ GMPErr Init(GMPRecord* aRecord,
+ GMPTask* aOnSuccess,
+ GMPTask* aOnFailure,
+ const uint8_t* aData,
+ uint32_t aDataSize) {
+ mRecord = aRecord;
+ mOnSuccess = aOnSuccess;
+ mOnFailure = aOnFailure;
+ mData.insert(mData.end(), aData, aData + aDataSize);
+ return mRecord->Open();
+ }
+
+ void OpenComplete(GMPErr aStatus) override {
+ if (GMP_SUCCEEDED(aStatus)) {
+ mRecord->Write(mData.size() ? &mData.front() : nullptr, mData.size());
+ } else {
+ GMPRunOnMainThread(mOnFailure);
+ mOnSuccess->Destroy();
+ }
+ }
+
+ void ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize) override {}
+
+ void WriteComplete(GMPErr aStatus) override {
+ // Note: Call Close() before running continuation, in case the
+ // continuation tries to open the same record; if we call Close()
+ // after running the continuation, the Close() call will arrive
+ // just after the Open() call succeeds, immediately closing the
+ // record we just opened.
+ mRecord->Close();
+ if (GMP_SUCCEEDED(aStatus)) {
+ GMPRunOnMainThread(mOnSuccess);
+ mOnFailure->Destroy();
+ } else {
+ GMPRunOnMainThread(mOnFailure);
+ mOnSuccess->Destroy();
+ }
+ delete this;
+ }
+
+private:
+ GMPRecord* mRecord;
+ GMPTask* mOnSuccess;
+ GMPTask* mOnFailure;
+ std::vector<uint8_t> mData;
+};
+
+GMPErr
+WriteRecord(const std::string& aRecordName,
+ const uint8_t* aData,
+ uint32_t aNumBytes,
+ GMPTask* aOnSuccess,
+ GMPTask* aOnFailure)
+{
+ GMPRecord* record;
+ WriteRecordClient* client = new WriteRecordClient();
+ auto err = GMPOpenRecord(aRecordName.c_str(),
+ aRecordName.size(),
+ &record,
+ client);
+ if (GMP_FAILED(err)) {
+ GMPRunOnMainThread(aOnFailure);
+ aOnSuccess->Destroy();
+ return err;
+ }
+ return client->Init(record, aOnSuccess, aOnFailure, aData, aNumBytes);
+}
+
+GMPErr
+WriteRecord(const std::string& aRecordName,
+ const std::string& aData,
+ GMPTask* aOnSuccess,
+ GMPTask* aOnFailure)
+{
+ return WriteRecord(aRecordName,
+ (const uint8_t*)aData.c_str(),
+ aData.size(),
+ aOnSuccess,
+ aOnFailure);
+}
+
+class ReadRecordClient : public GMPRecordClient {
+public:
+ GMPErr Init(GMPRecord* aRecord,
+ ReadContinuation* aContinuation) {
+ mRecord = aRecord;
+ mContinuation = aContinuation;
+ return mRecord->Open();
+ }
+
+ void OpenComplete(GMPErr aStatus) override {
+ auto err = mRecord->Read();
+ if (GMP_FAILED(err)) {
+ mContinuation->ReadComplete(err, "");
+ delete this;
+ }
+ }
+
+ void ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize) override {
+ // Note: Call Close() before running continuation, in case the
+ // continuation tries to open the same record; if we call Close()
+ // after running the continuation, the Close() call will arrive
+ // just after the Open() call succeeds, immediately closing the
+ // record we just opened.
+ mRecord->Close();
+ std::string data((const char*)aData, aDataSize);
+ mContinuation->ReadComplete(GMPNoErr, data);
+ delete this;
+ }
+
+ void WriteComplete(GMPErr aStatus) override {
+ }
+
+private:
+ GMPRecord* mRecord;
+ ReadContinuation* mContinuation;
+};
+
+GMPErr
+ReadRecord(const std::string& aRecordName,
+ ReadContinuation* aContinuation)
+{
+ MOZ_ASSERT(aContinuation);
+ GMPRecord* record;
+ ReadRecordClient* client = new ReadRecordClient();
+ auto err = GMPOpenRecord(aRecordName.c_str(),
+ aRecordName.size(),
+ &record,
+ client);
+ if (GMP_FAILED(err)) {
+ return err;
+ }
+ return client->Init(record, aContinuation);
+}
+
+extern GMPPlatformAPI* g_platform_api; // Defined in gmp-fake.cpp
+
+GMPErr
+GMPOpenRecord(const char* aName,
+ uint32_t aNameLength,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient)
+{
+ MOZ_ASSERT(g_platform_api);
+ return g_platform_api->createrecord(aName, aNameLength, aOutRecord, aClient);
+}
+
+GMPErr
+GMPRunOnMainThread(GMPTask* aTask)
+{
+ MOZ_ASSERT(g_platform_api);
+ return g_platform_api->runonmainthread(aTask);
+}
+
+class OpenRecordClient : public GMPRecordClient {
+public:
+ /*
+ * This function will take the memory ownership of the parameters and
+ * delete them when done.
+ */
+ static void Open(const std::string& aRecordName,
+ OpenContinuation* aContinuation) {
+ MOZ_ASSERT(aContinuation);
+ (new OpenRecordClient(aContinuation))->Do(aRecordName);
+ }
+
+ void OpenComplete(GMPErr aStatus) override {
+ Done(aStatus);
+ }
+
+ void ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize) override {
+ MOZ_CRASH("Should not reach here.");
+ }
+
+ void WriteComplete(GMPErr aStatus) override {
+ MOZ_CRASH("Should not reach here.");
+ }
+
+private:
+ explicit OpenRecordClient(OpenContinuation* aContinuation)
+ : mRecord(nullptr), mContinuation(aContinuation) {}
+
+ void Do(const std::string& aName) {
+ auto err = GMPOpenRecord(aName.c_str(), aName.size(), &mRecord, this);
+ if (GMP_FAILED(err) ||
+ GMP_FAILED(err = mRecord->Open())) {
+ Done(err);
+ }
+ }
+
+ void Done(GMPErr err) {
+ // mContinuation is responsible for closing mRecord.
+ mContinuation->OpenComplete(err, mRecord);
+ delete mContinuation;
+ delete this;
+ }
+
+ GMPRecord* mRecord;
+ OpenContinuation* mContinuation;
+};
+
+void
+GMPOpenRecord(const std::string& aRecordName,
+ OpenContinuation* aContinuation)
+{
+ OpenRecordClient::Open(aRecordName, aContinuation);
+}
+
+GMPErr
+GMPEnumRecordNames(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg)
+{
+ return g_platform_api->getrecordenumerator(aRecvIteratorFunc, aUserArg);
+}
diff --git a/dom/media/gmp-plugin/gmp-test-storage.h b/dom/media/gmp-plugin/gmp-test-storage.h
new file mode 100644
index 000000000..d77f8ebb3
--- /dev/null
+++ b/dom/media/gmp-plugin/gmp-test-storage.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef TEST_GMP_STORAGE_H__
+#define TEST_GMP_STORAGE_H__
+
+#include "gmp-errors.h"
+#include "gmp-platform.h"
+#include <string>
+
+class ReadContinuation {
+public:
+ virtual ~ReadContinuation() {}
+ virtual void ReadComplete(GMPErr aErr, const std::string& aData) = 0;
+};
+
+// Reads a record to storage using GMPRecord.
+// Calls ReadContinuation with read data.
+GMPErr
+ReadRecord(const std::string& aRecordName,
+ ReadContinuation* aContinuation);
+
+// Writes a record to storage using GMPRecord.
+// Runs continuation when data is written.
+GMPErr
+WriteRecord(const std::string& aRecordName,
+ const std::string& aData,
+ GMPTask* aOnSuccess,
+ GMPTask* aOnFailure);
+
+GMPErr
+WriteRecord(const std::string& aRecordName,
+ const uint8_t* aData,
+ uint32_t aNumBytes,
+ GMPTask* aOnSuccess,
+ GMPTask* aOnFailure);
+
+GMPErr
+GMPOpenRecord(const char* aName,
+ uint32_t aNameLength,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient);
+
+GMPErr
+GMPRunOnMainThread(GMPTask* aTask);
+
+class OpenContinuation {
+public:
+ virtual ~OpenContinuation() {}
+ virtual void OpenComplete(GMPErr aStatus, GMPRecord* aRecord) = 0;
+};
+
+void
+GMPOpenRecord(const std::string& aRecordName,
+ OpenContinuation* aContinuation);
+
+GMPErr
+GMPEnumRecordNames(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg);
+
+#endif // TEST_GMP_STORAGE_H__
diff --git a/dom/media/gmp-plugin/moz.build b/dom/media/gmp-plugin/moz.build
new file mode 100644
index 000000000..432d842fc
--- /dev/null
+++ b/dom/media/gmp-plugin/moz.build
@@ -0,0 +1,32 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+FINAL_TARGET = 'dist/bin/gmp-fake/1.0'
+
+FINAL_TARGET_FILES += [
+ 'fake.info',
+ 'fake.voucher',
+]
+
+SOURCES += [
+ 'gmp-fake.cpp',
+ 'gmp-test-decryptor.cpp',
+ 'gmp-test-storage.cpp',
+]
+
+DEFINES['GMP_FAKE_SUPPORT_DECRYPT'] = True
+
+SharedLibrary("fake")
+
+if CONFIG['OS_ARCH'] == 'WINNT':
+ OS_LIBS += [
+ 'ole32',
+ ]
+
+USE_STATIC_LIBS = True
+NO_VISIBILITY_FLAGS = True
+# Don't use STL wrappers; this isn't Gecko code
+DISABLE_STL_WRAPPING = True
diff --git a/dom/media/gmp/GMPAudioDecoderChild.cpp b/dom/media/gmp/GMPAudioDecoderChild.cpp
new file mode 100644
index 000000000..53550d4a1
--- /dev/null
+++ b/dom/media/gmp/GMPAudioDecoderChild.cpp
@@ -0,0 +1,172 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPAudioDecoderChild.h"
+#include "GMPContentChild.h"
+#include "GMPAudioHost.h"
+#include "mozilla/Unused.h"
+#include <stdio.h>
+
+namespace mozilla {
+namespace gmp {
+
+GMPAudioDecoderChild::GMPAudioDecoderChild(GMPContentChild* aPlugin)
+ : mPlugin(aPlugin)
+ , mAudioDecoder(nullptr)
+{
+ MOZ_ASSERT(mPlugin);
+}
+
+GMPAudioDecoderChild::~GMPAudioDecoderChild()
+{
+}
+
+void
+GMPAudioDecoderChild::Init(GMPAudioDecoder* aDecoder)
+{
+ MOZ_ASSERT(aDecoder, "Cannot initialize Audio decoder child without a Audio decoder!");
+ mAudioDecoder = aDecoder;
+}
+
+GMPAudioHostImpl&
+GMPAudioDecoderChild::Host()
+{
+ return mAudioHost;
+}
+
+void
+GMPAudioDecoderChild::Decoded(GMPAudioSamples* aDecodedSamples)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ if (!aDecodedSamples) {
+ MOZ_CRASH("Not given decoded audio samples!");
+ }
+
+ GMPAudioDecodedSampleData samples;
+ samples.mData().AppendElements((int16_t*)aDecodedSamples->Buffer(),
+ aDecodedSamples->Size() / sizeof(int16_t));
+ samples.mTimeStamp() = aDecodedSamples->TimeStamp();
+ samples.mChannelCount() = aDecodedSamples->Channels();
+ samples.mSamplesPerSecond() = aDecodedSamples->Rate();
+
+ Unused << SendDecoded(samples);
+
+ aDecodedSamples->Destroy();
+}
+
+void
+GMPAudioDecoderChild::InputDataExhausted()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ Unused << SendInputDataExhausted();
+}
+
+void
+GMPAudioDecoderChild::DrainComplete()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ Unused << SendDrainComplete();
+}
+
+void
+GMPAudioDecoderChild::ResetComplete()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ Unused << SendResetComplete();
+}
+
+void
+GMPAudioDecoderChild::Error(GMPErr aError)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ Unused << SendError(aError);
+}
+
+bool
+GMPAudioDecoderChild::RecvInitDecode(const GMPAudioCodecData& a)
+{
+ MOZ_ASSERT(mAudioDecoder);
+ if (!mAudioDecoder) {
+ return false;
+ }
+
+ GMPAudioCodec codec;
+ codec.mCodecType = a.mCodecType();
+ codec.mChannelCount = a.mChannelCount();
+ codec.mBitsPerChannel = a.mBitsPerChannel();
+ codec.mSamplesPerSecond = a.mSamplesPerSecond();
+ codec.mExtraData = a.mExtraData().Elements();
+ codec.mExtraDataLen = a.mExtraData().Length();
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mAudioDecoder->InitDecode(codec, this);
+
+ return true;
+}
+
+bool
+GMPAudioDecoderChild::RecvDecode(const GMPAudioEncodedSampleData& aEncodedSamples)
+{
+ if (!mAudioDecoder) {
+ return false;
+ }
+
+ GMPAudioSamples* samples = new GMPAudioSamplesImpl(aEncodedSamples);
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mAudioDecoder->Decode(samples);
+
+ return true;
+}
+
+bool
+GMPAudioDecoderChild::RecvReset()
+{
+ if (!mAudioDecoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mAudioDecoder->Reset();
+
+ return true;
+}
+
+bool
+GMPAudioDecoderChild::RecvDrain()
+{
+ if (!mAudioDecoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mAudioDecoder->Drain();
+
+ return true;
+}
+
+bool
+GMPAudioDecoderChild::RecvDecodingComplete()
+{
+ if (mAudioDecoder) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mAudioDecoder->DecodingComplete();
+ mAudioDecoder = nullptr;
+ }
+
+ mPlugin = nullptr;
+
+ Unused << Send__delete__(this);
+
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPAudioDecoderChild.h b/dom/media/gmp/GMPAudioDecoderChild.h
new file mode 100644
index 000000000..0393fa573
--- /dev/null
+++ b/dom/media/gmp/GMPAudioDecoderChild.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPAudioDecoderChild_h_
+#define GMPAudioDecoderChild_h_
+
+#include "mozilla/gmp/PGMPAudioDecoderChild.h"
+#include "gmp-audio-decode.h"
+#include "GMPAudioHost.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentChild;
+
+class GMPAudioDecoderChild : public PGMPAudioDecoderChild,
+ public GMPAudioDecoderCallback
+{
+public:
+ explicit GMPAudioDecoderChild(GMPContentChild* aPlugin);
+ virtual ~GMPAudioDecoderChild();
+
+ void Init(GMPAudioDecoder* aDecoder);
+ GMPAudioHostImpl& Host();
+
+ // GMPAudioDecoderCallback
+ void Decoded(GMPAudioSamples* aEncodedSamples) override;
+ void InputDataExhausted() override;
+ void DrainComplete() override;
+ void ResetComplete() override;
+ void Error(GMPErr aError) override;
+
+private:
+ // PGMPAudioDecoderChild
+ bool RecvInitDecode(const GMPAudioCodecData& codecSettings) override;
+ bool RecvDecode(const GMPAudioEncodedSampleData& input) override;
+ bool RecvReset() override;
+ bool RecvDrain() override;
+ bool RecvDecodingComplete() override;
+
+ GMPContentChild* mPlugin;
+ GMPAudioDecoder* mAudioDecoder;
+ GMPAudioHostImpl mAudioHost;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPAudioDecoderChild_h_
diff --git a/dom/media/gmp/GMPAudioDecoderParent.cpp b/dom/media/gmp/GMPAudioDecoderParent.cpp
new file mode 100644
index 000000000..592c7719b
--- /dev/null
+++ b/dom/media/gmp/GMPAudioDecoderParent.cpp
@@ -0,0 +1,369 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPAudioDecoderParent.h"
+#include "GMPContentParent.h"
+#include <stdio.h>
+#include "mozilla/Unused.h"
+#include "GMPMessageUtils.h"
+#include "nsThreadUtils.h"
+#include "mozilla/Logging.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGV(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Verbose, msg)
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+namespace gmp {
+
+GMPAudioDecoderParent::GMPAudioDecoderParent(GMPContentParent* aPlugin)
+ : mIsOpen(false)
+ , mShuttingDown(false)
+ , mActorDestroyed(false)
+ , mIsAwaitingResetComplete(false)
+ , mIsAwaitingDrainComplete(false)
+ , mPlugin(aPlugin)
+ , mCallback(nullptr)
+{
+ MOZ_ASSERT(mPlugin);
+}
+
+GMPAudioDecoderParent::~GMPAudioDecoderParent()
+{
+}
+
+nsresult
+GMPAudioDecoderParent::InitDecode(GMPAudioCodecType aCodecType,
+ uint32_t aChannelCount,
+ uint32_t aBitsPerChannel,
+ uint32_t aSamplesPerSecond,
+ nsTArray<uint8_t>& aExtraData,
+ GMPAudioDecoderCallbackProxy* aCallback)
+{
+ LOGD(("GMPAudioDecoderParent[%p]::InitDecode()", this));
+
+ if (mIsOpen) {
+ NS_WARNING("Trying to re-init an in-use GMP audio decoder!");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!aCallback) {
+ return NS_ERROR_FAILURE;
+ }
+ mCallback = aCallback;
+
+ GMPAudioCodecData data;
+ data.mCodecType() = aCodecType;
+ data.mChannelCount() = aChannelCount;
+ data.mBitsPerChannel() = aBitsPerChannel;
+ data.mSamplesPerSecond() = aSamplesPerSecond;
+ data.mExtraData() = aExtraData;
+ if (!SendInitDecode(data)) {
+ return NS_ERROR_FAILURE;
+ }
+ mIsOpen = true;
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+nsresult
+GMPAudioDecoderParent::Decode(GMPAudioSamplesImpl& aEncodedSamples)
+{
+ LOGV(("GMPAudioDecoderParent[%p]::Decode() timestamp=%lld",
+ this, aEncodedSamples.TimeStamp()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP Audio decoder!");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ GMPAudioEncodedSampleData samples;
+ aEncodedSamples.RelinquishData(samples);
+
+ if (!SendDecode(samples)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+nsresult
+GMPAudioDecoderParent::Reset()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::Reset()", this));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP Audio decoder!");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendReset()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mIsAwaitingResetComplete = true;
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+nsresult
+GMPAudioDecoderParent::Drain()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::Drain()", this));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP Audio decoder!");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendDrain()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mIsAwaitingDrainComplete = true;
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+// Note: Consider keeping ActorDestroy sync'd up when making changes here.
+nsresult
+GMPAudioDecoderParent::Close()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::Close()", this));
+ MOZ_ASSERT(!mPlugin || mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ // Ensure if we've received a Close while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the close. This seems unlikely to happen, but better to be careful.
+ UnblockResetAndDrain();
+
+ // Consumer is done with us; we can shut down. No more callbacks should
+ // be made to mCallback. Note: do this before Shutdown()!
+ mCallback = nullptr;
+ // Let Shutdown mark us as dead so it knows if we had been alive
+
+ // In case this is the last reference
+ RefPtr<GMPAudioDecoderParent> kungfudeathgrip(this);
+ Release();
+ Shutdown();
+
+ return NS_OK;
+}
+
+// Note: Consider keeping ActorDestroy sync'd up when making changes here.
+nsresult
+GMPAudioDecoderParent::Shutdown()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::Shutdown()", this));
+ MOZ_ASSERT(!mPlugin || mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (mShuttingDown) {
+ return NS_OK;
+ }
+ mShuttingDown = true;
+
+ // Ensure if we've received a shutdown while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the shutdown.
+ UnblockResetAndDrain();
+
+ // Notify client we're gone! Won't occur after Close()
+ if (mCallback) {
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+
+ mIsOpen = false;
+ if (!mActorDestroyed) {
+ Unused << SendDecodingComplete();
+ }
+
+ return NS_OK;
+}
+
+// Note: Keep this sync'd up with DecodingComplete
+void
+GMPAudioDecoderParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD(("GMPAudioDecoderParent[%p]::ActorDestroy(reason=%d)", this, aWhy));
+
+ mIsOpen = false;
+ mActorDestroyed = true;
+
+ // Ensure if we've received a destroy while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the error.
+ UnblockResetAndDrain();
+
+ if (mCallback) {
+ // May call Close() (and Shutdown()) immediately or with a delay
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+ if (mPlugin) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mPlugin->AudioDecoderDestroyed(this);
+ mPlugin = nullptr;
+ }
+ MaybeDisconnect(aWhy == AbnormalShutdown);
+}
+
+bool
+GMPAudioDecoderParent::RecvDecoded(const GMPAudioDecodedSampleData& aDecoded)
+{
+ LOGV(("GMPAudioDecoderParent[%p]::RecvDecoded() timestamp=%lld",
+ this, aDecoded.mTimeStamp()));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ mCallback->Decoded(aDecoded.mData(),
+ aDecoded.mTimeStamp(),
+ aDecoded.mChannelCount(),
+ aDecoded.mSamplesPerSecond());
+
+ return true;
+}
+
+bool
+GMPAudioDecoderParent::RecvInputDataExhausted()
+{
+ LOGV(("GMPAudioDecoderParent[%p]::RecvInputDataExhausted()", this));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->InputDataExhausted();
+
+ return true;
+}
+
+bool
+GMPAudioDecoderParent::RecvDrainComplete()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::RecvDrainComplete()", this));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ if (!mIsAwaitingDrainComplete) {
+ return true;
+ }
+ mIsAwaitingDrainComplete = false;
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->DrainComplete();
+
+ return true;
+}
+
+bool
+GMPAudioDecoderParent::RecvResetComplete()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::RecvResetComplete()", this));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ if (!mIsAwaitingResetComplete) {
+ return true;
+ }
+ mIsAwaitingResetComplete = false;
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->ResetComplete();
+
+ return true;
+}
+
+bool
+GMPAudioDecoderParent::RecvError(const GMPErr& aError)
+{
+ LOGD(("GMPAudioDecoderParent[%p]::RecvError(error=%d)", this, aError));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ensure if we've received an error while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the error.
+ UnblockResetAndDrain();
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->Error(aError);
+
+ return true;
+}
+
+bool
+GMPAudioDecoderParent::RecvShutdown()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::RecvShutdown()", this));
+
+ Shutdown();
+ return true;
+}
+
+bool
+GMPAudioDecoderParent::Recv__delete__()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::Recv__delete__()", this));
+
+ if (mPlugin) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mPlugin->AudioDecoderDestroyed(this);
+ mPlugin = nullptr;
+ }
+
+ return true;
+}
+
+void
+GMPAudioDecoderParent::UnblockResetAndDrain()
+{
+ LOGD(("GMPAudioDecoderParent[%p]::UnblockResetAndDrain()", this));
+
+ if (!mCallback) {
+ MOZ_ASSERT(!mIsAwaitingResetComplete);
+ MOZ_ASSERT(!mIsAwaitingDrainComplete);
+ return;
+ }
+ if (mIsAwaitingResetComplete) {
+ mIsAwaitingResetComplete = false;
+ mCallback->ResetComplete();
+ }
+ if (mIsAwaitingDrainComplete) {
+ mIsAwaitingDrainComplete = false;
+ mCallback->DrainComplete();
+ }
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPAudioDecoderParent.h b/dom/media/gmp/GMPAudioDecoderParent.h
new file mode 100644
index 000000000..5ced5ca61
--- /dev/null
+++ b/dom/media/gmp/GMPAudioDecoderParent.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPAudioDecoderParent_h_
+#define GMPAudioDecoderParent_h_
+
+#include "mozilla/RefPtr.h"
+#include "gmp-audio-decode.h"
+#include "gmp-audio-codec.h"
+#include "mozilla/gmp/PGMPAudioDecoderParent.h"
+#include "GMPMessageUtils.h"
+#include "GMPAudioDecoderProxy.h"
+#include "GMPCrashHelperHolder.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentParent;
+
+class GMPAudioDecoderParent final : public GMPAudioDecoderProxy
+ , public PGMPAudioDecoderParent
+ , public GMPCrashHelperHolder
+{
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPAudioDecoderParent)
+
+ explicit GMPAudioDecoderParent(GMPContentParent *aPlugin);
+
+ nsresult Shutdown();
+
+ // GMPAudioDecoderProxy
+ nsresult InitDecode(GMPAudioCodecType aCodecType,
+ uint32_t aChannelCount,
+ uint32_t aBitsPerChannel,
+ uint32_t aSamplesPerSecond,
+ nsTArray<uint8_t>& aExtraData,
+ GMPAudioDecoderCallbackProxy* aCallback) override;
+ nsresult Decode(GMPAudioSamplesImpl& aInput) override;
+ nsresult Reset() override;
+ nsresult Drain() override;
+ nsresult Close() override;
+
+private:
+ ~GMPAudioDecoderParent();
+
+ // PGMPAudioDecoderParent
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ bool RecvDecoded(const GMPAudioDecodedSampleData& aDecoded) override;
+ bool RecvInputDataExhausted() override;
+ bool RecvDrainComplete() override;
+ bool RecvResetComplete() override;
+ bool RecvError(const GMPErr& aError) override;
+ bool RecvShutdown() override;
+ bool Recv__delete__() override;
+
+ void UnblockResetAndDrain();
+
+ bool mIsOpen;
+ bool mShuttingDown;
+ bool mActorDestroyed;
+ bool mIsAwaitingResetComplete;
+ bool mIsAwaitingDrainComplete;
+ RefPtr<GMPContentParent> mPlugin;
+ GMPAudioDecoderCallbackProxy* mCallback;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPAudioDecoderParent_h_
diff --git a/dom/media/gmp/GMPAudioDecoderProxy.h b/dom/media/gmp/GMPAudioDecoderProxy.h
new file mode 100644
index 000000000..6d71ba089
--- /dev/null
+++ b/dom/media/gmp/GMPAudioDecoderProxy.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPAudioDecoderProxy_h_
+#define GMPAudioDecoderProxy_h_
+
+#include "GMPCallbackBase.h"
+#include "gmp-audio-codec.h"
+#include "GMPAudioHost.h"
+#include "nsTArray.h"
+#include "mozilla/gmp/GMPTypes.h"
+
+class GMPAudioDecoderCallbackProxy : public GMPCallbackBase {
+public:
+ virtual ~GMPAudioDecoderCallbackProxy() {}
+ // Note: aChannelCount and aSamplesPerSecond may not be consistent from
+ // one invocation to the next.
+ virtual void Decoded(const nsTArray<int16_t>& aPCM,
+ uint64_t aTimeStamp,
+ uint32_t aChannelCount,
+ uint32_t aSamplesPerSecond) = 0;
+ virtual void InputDataExhausted() = 0;
+ virtual void DrainComplete() = 0;
+ virtual void ResetComplete() = 0;
+ virtual void Error(GMPErr aError) = 0;
+};
+
+class GMPAudioDecoderProxy {
+public:
+ virtual ~GMPAudioDecoderProxy() {}
+
+ virtual nsresult InitDecode(GMPAudioCodecType aCodecType,
+ uint32_t aChannelCount,
+ uint32_t aBitsPerChannel,
+ uint32_t aSamplesPerSecond,
+ nsTArray<uint8_t>& aExtraData,
+ GMPAudioDecoderCallbackProxy* aCallback) = 0;
+ virtual nsresult Decode(mozilla::gmp::GMPAudioSamplesImpl& aSamples) = 0;
+ virtual nsresult Reset() = 0;
+ virtual nsresult Drain() = 0;
+ // Call to tell GMP/plugin the consumer will no longer use this
+ // interface/codec.
+ virtual nsresult Close() = 0;
+};
+
+#endif // GMPAudioDecoderProxy_h_
diff --git a/dom/media/gmp/GMPAudioHost.cpp b/dom/media/gmp/GMPAudioHost.cpp
new file mode 100644
index 000000000..4e14fed0b
--- /dev/null
+++ b/dom/media/gmp/GMPAudioHost.cpp
@@ -0,0 +1,162 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPAudioHost.h"
+#include "gmp-audio-samples.h"
+#include "gmp-errors.h"
+#include "GMPEncryptedBufferDataImpl.h"
+#include "MediaData.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPAudioSamplesImpl::GMPAudioSamplesImpl(GMPAudioFormat aFormat)
+ : mFormat(aFormat)
+ , mTimeStamp(0)
+ , mChannels(0)
+ , mRate(0)
+{
+}
+
+GMPAudioSamplesImpl::GMPAudioSamplesImpl(const GMPAudioEncodedSampleData& aData)
+ : mFormat(kGMPAudioEncodedSamples)
+ , mBuffer(aData.mData())
+ , mTimeStamp(aData.mTimeStamp())
+ , mChannels(aData.mChannelCount())
+ , mRate(aData.mSamplesPerSecond())
+{
+ if (aData.mDecryptionData().mKeyId().Length() > 0) {
+ mCrypto = new GMPEncryptedBufferDataImpl(aData.mDecryptionData());
+ }
+}
+
+GMPAudioSamplesImpl::GMPAudioSamplesImpl(MediaRawData* aSample,
+ uint32_t aChannels,
+ uint32_t aRate)
+ : mFormat(kGMPAudioEncodedSamples)
+ , mTimeStamp(aSample->mTime)
+ , mChannels(aChannels)
+ , mRate(aRate)
+{
+ mBuffer.AppendElements(aSample->Data(), aSample->Size());
+ if (aSample->mCrypto.mValid) {
+ mCrypto = new GMPEncryptedBufferDataImpl(aSample->mCrypto);
+ }
+}
+
+GMPAudioSamplesImpl::~GMPAudioSamplesImpl()
+{
+}
+
+GMPAudioFormat
+GMPAudioSamplesImpl::GetFormat()
+{
+ return mFormat;
+}
+
+void
+GMPAudioSamplesImpl::Destroy()
+{
+ delete this;
+}
+
+GMPErr
+GMPAudioSamplesImpl::SetBufferSize(uint32_t aSize)
+{
+ mBuffer.SetLength(aSize);
+ return GMPNoErr;
+}
+
+uint32_t
+GMPAudioSamplesImpl::Size()
+{
+ return mBuffer.Length();
+}
+
+void
+GMPAudioSamplesImpl::SetTimeStamp(uint64_t aTimeStamp)
+{
+ mTimeStamp = aTimeStamp;
+}
+
+uint64_t
+GMPAudioSamplesImpl::TimeStamp()
+{
+ return mTimeStamp;
+}
+
+const uint8_t*
+GMPAudioSamplesImpl::Buffer() const
+{
+ return mBuffer.Elements();
+}
+
+uint8_t*
+GMPAudioSamplesImpl::Buffer()
+{
+ return mBuffer.Elements();
+}
+
+const GMPEncryptedBufferMetadata*
+GMPAudioSamplesImpl::GetDecryptionData() const
+{
+ return mCrypto;
+}
+
+void
+GMPAudioSamplesImpl::InitCrypto(const CryptoSample& aCrypto)
+{
+ if (!aCrypto.mValid) {
+ return;
+ }
+ mCrypto = new GMPEncryptedBufferDataImpl(aCrypto);
+}
+
+void
+GMPAudioSamplesImpl::RelinquishData(GMPAudioEncodedSampleData& aData)
+{
+ aData.mData() = Move(mBuffer);
+ aData.mTimeStamp() = TimeStamp();
+ if (mCrypto) {
+ mCrypto->RelinquishData(aData.mDecryptionData());
+ }
+}
+
+uint32_t
+GMPAudioSamplesImpl::Channels() const
+{
+ return mChannels;
+}
+
+void
+GMPAudioSamplesImpl::SetChannels(uint32_t aChannels)
+{
+ mChannels = aChannels;
+}
+
+uint32_t
+GMPAudioSamplesImpl::Rate() const
+{
+ return mRate;
+}
+
+void
+GMPAudioSamplesImpl::SetRate(uint32_t aRate)
+{
+ mRate = aRate;
+}
+
+
+GMPErr
+GMPAudioHostImpl::CreateSamples(GMPAudioFormat aFormat,
+ GMPAudioSamples** aSamples)
+{
+
+ *aSamples = new GMPAudioSamplesImpl(aFormat);
+ return GMPNoErr;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPAudioHost.h b/dom/media/gmp/GMPAudioHost.h
new file mode 100644
index 000000000..ed829b9c5
--- /dev/null
+++ b/dom/media/gmp/GMPAudioHost.h
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPAudioHost_h_
+#define GMPAudioHost_h_
+
+#include "gmp-audio-host.h"
+#include "gmp-audio-samples.h"
+#include "nsTArray.h"
+#include "gmp-decryption.h"
+#include "nsAutoPtr.h"
+#include "GMPEncryptedBufferDataImpl.h"
+#include "mozilla/gmp/GMPTypes.h"
+
+namespace mozilla {
+class CryptoSample;
+class MediaRawData;
+
+namespace gmp {
+
+class GMPAudioSamplesImpl : public GMPAudioSamples {
+public:
+ explicit GMPAudioSamplesImpl(GMPAudioFormat aFormat);
+ explicit GMPAudioSamplesImpl(const GMPAudioEncodedSampleData& aData);
+ GMPAudioSamplesImpl(MediaRawData* aSample,
+ uint32_t aChannels,
+ uint32_t aRate);
+ virtual ~GMPAudioSamplesImpl();
+
+ GMPAudioFormat GetFormat() override;
+ void Destroy() override;
+ GMPErr SetBufferSize(uint32_t aSize) override;
+ uint32_t Size() override;
+ void SetTimeStamp(uint64_t aTimeStamp) override;
+ uint64_t TimeStamp() override;
+ const uint8_t* Buffer() const override;
+ uint8_t* Buffer() override;
+ const GMPEncryptedBufferMetadata* GetDecryptionData() const override;
+
+ void InitCrypto(const CryptoSample& aCrypto);
+
+ void RelinquishData(GMPAudioEncodedSampleData& aData);
+
+ uint32_t Channels() const override;
+ void SetChannels(uint32_t aChannels) override;
+ uint32_t Rate() const override;
+ void SetRate(uint32_t aRate) override;
+
+private:
+ GMPAudioFormat mFormat;
+ nsTArray<uint8_t> mBuffer;
+ int64_t mTimeStamp;
+ nsAutoPtr<GMPEncryptedBufferDataImpl> mCrypto;
+ uint32_t mChannels;
+ uint32_t mRate;
+};
+
+class GMPAudioHostImpl : public GMPAudioHost
+{
+public:
+ GMPErr CreateSamples(GMPAudioFormat aFormat,
+ GMPAudioSamples** aSamples) override;
+private:
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPAudioHost_h_
diff --git a/dom/media/gmp/GMPCDMCallbackProxy.cpp b/dom/media/gmp/GMPCDMCallbackProxy.cpp
new file mode 100644
index 000000000..0cbc89fff
--- /dev/null
+++ b/dom/media/gmp/GMPCDMCallbackProxy.cpp
@@ -0,0 +1,251 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPCDMCallbackProxy.h"
+#include "mozilla/CDMProxy.h"
+#include "nsString.h"
+#include "mozilla/dom/MediaKeys.h"
+#include "mozilla/dom/MediaKeySession.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "nsContentCID.h"
+#include "nsServiceManagerUtils.h"
+#include "MainThreadUtils.h"
+#include "mozilla/EMEUtils.h"
+
+namespace mozilla {
+
+GMPCDMCallbackProxy::GMPCDMCallbackProxy(CDMProxy* aProxy)
+ : mProxy(aProxy)
+{}
+
+void
+GMPCDMCallbackProxy::SetDecryptorId(uint32_t aId)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy, aId] ()
+ {
+ proxy->OnSetDecryptorId(aId);
+ })
+ );}
+
+void
+GMPCDMCallbackProxy::SetSessionId(uint32_t aToken,
+ const nsCString& aSessionId)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ auto sid = NS_ConvertUTF8toUTF16(aSessionId);
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy,
+ aToken,
+ sid] ()
+ {
+ proxy->OnSetSessionId(aToken, sid);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy, aPromiseId, aSuccess] ()
+ {
+ proxy->OnResolveLoadSessionPromise(aPromiseId, aSuccess);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::ResolvePromise(uint32_t aPromiseId)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ // Note: CDMProxy proxies this from non-main threads to main thread.
+ mProxy->ResolvePromise(aPromiseId);
+}
+
+void
+GMPCDMCallbackProxy::RejectPromise(uint32_t aPromiseId,
+ nsresult aException,
+ const nsCString& aMessage)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy,
+ aPromiseId,
+ aException,
+ aMessage] ()
+ {
+ proxy->OnRejectPromise(aPromiseId, aException, aMessage);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::SessionMessage(const nsCString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ auto sid = NS_ConvertUTF8toUTF16(aSessionId);
+ nsTArray<uint8_t> msg(aMessage);
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy,
+ sid,
+ aMessageType,
+ msg] () mutable
+ {
+ proxy->OnSessionMessage(sid, aMessageType, msg);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::ExpirationChange(const nsCString& aSessionId,
+ GMPTimestamp aExpiryTime)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ auto sid = NS_ConvertUTF8toUTF16(aSessionId);
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy,
+ sid,
+ aExpiryTime] ()
+ {
+ proxy->OnExpirationChange(sid, aExpiryTime);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::SessionClosed(const nsCString& aSessionId)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ bool keyStatusesChange = false;
+ auto sid = NS_ConvertUTF8toUTF16(aSessionId);
+ {
+ CDMCaps::AutoLock caps(mProxy->Capabilites());
+ keyStatusesChange = caps.RemoveKeysForSession(NS_ConvertUTF8toUTF16(aSessionId));
+ }
+ if (keyStatusesChange) {
+ RefPtr<CDMProxy> proxy = mProxy;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy, sid] ()
+ {
+ proxy->OnKeyStatusesChange(sid);
+ })
+ );
+ }
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy, sid] ()
+ {
+ proxy->OnSessionClosed(sid);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::SessionError(const nsCString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsCString& aMessage)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ auto sid = NS_ConvertUTF8toUTF16(aSessionId);
+ auto msg = NS_ConvertUTF8toUTF16(aMessage);
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy,
+ sid,
+ aException,
+ aSystemCode,
+ msg] ()
+ {
+ proxy->OnSessionError(sid,
+ aException,
+ aSystemCode,
+ msg);
+ })
+ );
+}
+
+void
+GMPCDMCallbackProxy::BatchedKeyStatusChanged(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+ BatchedKeyStatusChangedInternal(aSessionId, aKeyInfos);
+}
+
+void
+GMPCDMCallbackProxy::BatchedKeyStatusChangedInternal(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos)
+{
+ bool keyStatusesChange = false;
+ {
+ CDMCaps::AutoLock caps(mProxy->Capabilites());
+ for (size_t i = 0; i < aKeyInfos.Length(); i++) {
+ keyStatusesChange |=
+ caps.SetKeyStatus(aKeyInfos[i].mKeyId,
+ NS_ConvertUTF8toUTF16(aSessionId),
+ aKeyInfos[i].mStatus);
+ }
+ }
+ if (keyStatusesChange) {
+ RefPtr<CDMProxy> proxy = mProxy;
+ auto sid = NS_ConvertUTF8toUTF16(aSessionId);
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy, sid] ()
+ {
+ proxy->OnKeyStatusesChange(sid);
+ })
+ );
+ }
+}
+
+void
+GMPCDMCallbackProxy::Decrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData)
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ mProxy->OnDecrypted(aId, aResult, aDecryptedData);
+}
+
+void
+GMPCDMCallbackProxy::Terminated()
+{
+ MOZ_ASSERT(mProxy->IsOnOwnerThread());
+
+ RefPtr<CDMProxy> proxy = mProxy;
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction([proxy] ()
+ {
+ proxy->Terminated();
+ })
+ );
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPCDMCallbackProxy.h b/dom/media/gmp/GMPCDMCallbackProxy.h
new file mode 100644
index 000000000..3f396f597
--- /dev/null
+++ b/dom/media/gmp/GMPCDMCallbackProxy.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPCDMCallbackProxy_h_
+#define GMPCDMCallbackProxy_h_
+
+#include "mozilla/CDMProxy.h"
+#include "gmp-decryption.h"
+#include "GMPDecryptorProxy.h"
+
+namespace mozilla {
+
+// Proxies call backs from the CDM on the GMP thread back to the MediaKeys
+// object on the main thread.
+class GMPCDMCallbackProxy : public GMPDecryptorProxyCallback {
+public:
+
+ void SetDecryptorId(uint32_t aId) override;
+
+ void SetSessionId(uint32_t aCreateSessionToken,
+ const nsCString& aSessionId) override;
+
+ void ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) override;
+
+ void ResolvePromise(uint32_t aPromiseId) override;
+
+ void RejectPromise(uint32_t aPromiseId,
+ nsresult aException,
+ const nsCString& aSessionId) override;
+
+ void SessionMessage(const nsCString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage) override;
+
+ void ExpirationChange(const nsCString& aSessionId,
+ UnixTime aExpiryTime) override;
+
+ void SessionClosed(const nsCString& aSessionId) override;
+
+ void SessionError(const nsCString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsCString& aMessage) override;
+
+ void Decrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) override;
+
+ void BatchedKeyStatusChanged(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos) override;
+
+ void Terminated() override;
+
+ ~GMPCDMCallbackProxy() {}
+
+private:
+ friend class GMPCDMProxy;
+ explicit GMPCDMCallbackProxy(CDMProxy* aProxy);
+
+ void BatchedKeyStatusChangedInternal(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos);
+ // Warning: Weak ref.
+ CDMProxy* mProxy;
+};
+
+} // namespace mozilla
+
+#endif // GMPCDMCallbackProxy_h_
diff --git a/dom/media/gmp/GMPCDMProxy.cpp b/dom/media/gmp/GMPCDMProxy.cpp
new file mode 100644
index 000000000..58c5596ee
--- /dev/null
+++ b/dom/media/gmp/GMPCDMProxy.cpp
@@ -0,0 +1,799 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPCDMProxy.h"
+#include "mozilla/EMEUtils.h"
+#include "mozilla/PodOperations.h"
+
+#include "mozilla/dom/MediaKeys.h"
+#include "mozilla/dom/MediaKeySession.h"
+
+#include "mozIGeckoMediaPluginService.h"
+#include "nsContentCID.h"
+#include "nsIConsoleService.h"
+#include "nsPrintfCString.h"
+#include "nsServiceManagerUtils.h"
+#include "nsString.h"
+#include "prenv.h"
+#include "GMPCDMCallbackProxy.h"
+#include "GMPService.h"
+#include "MainThreadUtils.h"
+#include "MediaData.h"
+
+namespace mozilla {
+
+GMPCDMProxy::GMPCDMProxy(dom::MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ GMPCrashHelper* aCrashHelper,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired)
+ : CDMProxy(aKeys,
+ aKeySystem,
+ aDistinctiveIdentifierRequired,
+ aPersistentStateRequired)
+ , mCrashHelper(aCrashHelper)
+ , mCDM(nullptr)
+ , mDecryptionJobCount(0)
+ , mShutdownCalled(false)
+ , mDecryptorId(0)
+ , mCreatePromiseId(0)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(GMPCDMProxy);
+}
+
+GMPCDMProxy::~GMPCDMProxy()
+{
+ MOZ_COUNT_DTOR(GMPCDMProxy);
+}
+
+void
+GMPCDMProxy::Init(PromiseId aPromiseId,
+ const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ EME_LOG("GMPCDMProxy::Init (%s, %s) %s",
+ NS_ConvertUTF16toUTF8(aOrigin).get(),
+ NS_ConvertUTF16toUTF8(aTopLevelOrigin).get(),
+ (aInPrivateBrowsing ? "PrivateBrowsing" : "NonPrivateBrowsing"));
+
+ nsCString pluginVersion;
+ if (!mOwnerThread) {
+ nsCOMPtr<mozIGeckoMediaPluginService> mps =
+ do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ if (!mps) {
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get MediaPluginService in GMPCDMProxy::Init"));
+ return;
+ }
+ mps->GetThread(getter_AddRefs(mOwnerThread));
+ if (!mOwnerThread) {
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get GMP thread GMPCDMProxy::Init"));
+ return;
+ }
+ }
+
+ if (aGMPName.IsEmpty()) {
+ RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ nsPrintfCString("Unknown GMP for keysystem '%s'", NS_ConvertUTF16toUTF8(mKeySystem).get()));
+ return;
+ }
+
+ nsAutoPtr<InitData> data(new InitData());
+ data->mPromiseId = aPromiseId;
+ data->mOrigin = aOrigin;
+ data->mTopLevelOrigin = aTopLevelOrigin;
+ data->mGMPName = aGMPName;
+ data->mInPrivateBrowsing = aInPrivateBrowsing;
+ data->mCrashHelper = mCrashHelper;
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<InitData>>(this,
+ &GMPCDMProxy::gmp_Init,
+ Move(data)));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+#ifdef DEBUG
+bool
+GMPCDMProxy::IsOnOwnerThread()
+{
+ return NS_GetCurrentThread() == mOwnerThread;
+}
+#endif
+
+void
+GMPCDMProxy::gmp_InitDone(GMPDecryptorProxy* aCDM, nsAutoPtr<InitData>&& aData)
+{
+ EME_LOG("GMPCDMProxy::gmp_InitDone");
+ if (mShutdownCalled) {
+ if (aCDM) {
+ aCDM->Close();
+ }
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("GMPCDMProxy was shut down before init could complete"));
+ return;
+ }
+ if (!aCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("GetGMPDecryptor failed to return a CDM"));
+ return;
+ }
+
+ mCDM = aCDM;
+ mCallback = new GMPCDMCallbackProxy(this);
+ mCDM->Init(mCallback,
+ mDistinctiveIdentifierRequired,
+ mPersistentStateRequired);
+
+ // Await the OnSetDecryptorId callback.
+ mCreatePromiseId = aData->mPromiseId;
+}
+
+void GMPCDMProxy::OnSetDecryptorId(uint32_t aId)
+{
+ MOZ_ASSERT(mCreatePromiseId);
+ mDecryptorId = aId;
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<uint32_t>(this,
+ &GMPCDMProxy::OnCDMCreated,
+ mCreatePromiseId));
+ NS_DispatchToMainThread(task);
+}
+
+class gmp_InitDoneCallback : public GetGMPDecryptorCallback
+{
+public:
+ gmp_InitDoneCallback(GMPCDMProxy* aGMPCDMProxy,
+ nsAutoPtr<GMPCDMProxy::InitData>&& aData)
+ : mGMPCDMProxy(aGMPCDMProxy),
+ mData(Move(aData))
+ {
+ }
+
+ void Done(GMPDecryptorProxy* aCDM)
+ {
+ mGMPCDMProxy->gmp_InitDone(aCDM, Move(mData));
+ }
+
+private:
+ RefPtr<GMPCDMProxy> mGMPCDMProxy;
+ nsAutoPtr<GMPCDMProxy::InitData> mData;
+};
+
+class gmp_InitGetGMPDecryptorCallback : public GetNodeIdCallback
+{
+public:
+ gmp_InitGetGMPDecryptorCallback(GMPCDMProxy* aGMPCDMProxy,
+ nsAutoPtr<GMPCDMProxy::InitData>&& aData)
+ : mGMPCDMProxy(aGMPCDMProxy),
+ mData(aData)
+ {
+ }
+
+ void Done(nsresult aResult, const nsACString& aNodeId)
+ {
+ mGMPCDMProxy->gmp_InitGetGMPDecryptor(aResult, aNodeId, Move(mData));
+ }
+
+private:
+ RefPtr<GMPCDMProxy> mGMPCDMProxy;
+ nsAutoPtr<GMPCDMProxy::InitData> mData;
+};
+
+void
+GMPCDMProxy::gmp_Init(nsAutoPtr<InitData>&& aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ nsCOMPtr<mozIGeckoMediaPluginService> mps =
+ do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ if (!mps) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get MediaPluginService in GMPCDMProxy::gmp_Init"));
+ return;
+ }
+
+ // Make a copy before we transfer ownership of aData to the
+ // gmp_InitGetGMPDecryptorCallback.
+ InitData data(*aData);
+ UniquePtr<GetNodeIdCallback> callback(
+ new gmp_InitGetGMPDecryptorCallback(this, Move(aData)));
+ nsresult rv = mps->GetNodeId(data.mOrigin,
+ data.mTopLevelOrigin,
+ data.mGMPName,
+ data.mInPrivateBrowsing,
+ Move(callback));
+ if (NS_FAILED(rv)) {
+ RejectPromise(data.mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Call to GetNodeId() failed early"));
+ }
+}
+
+void
+GMPCDMProxy::gmp_InitGetGMPDecryptor(nsresult aResult,
+ const nsACString& aNodeId,
+ nsAutoPtr<InitData>&& aData)
+{
+ uint32_t promiseID = aData->mPromiseId;
+ if (NS_FAILED(aResult)) {
+ RejectPromise(promiseID, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("GetNodeId() called back, but with a failure result"));
+ return;
+ }
+
+ mNodeId = aNodeId;
+ MOZ_ASSERT(!GetNodeId().IsEmpty());
+
+ nsCOMPtr<mozIGeckoMediaPluginService> mps =
+ do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ if (!mps) {
+ RejectPromise(promiseID, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Couldn't get MediaPluginService in GMPCDMProxy::gmp_InitGetGMPDecryptor"));
+ return;
+ }
+
+ EME_LOG("GMPCDMProxy::gmp_Init (%s, %s) %s NodeId=%s",
+ NS_ConvertUTF16toUTF8(aData->mOrigin).get(),
+ NS_ConvertUTF16toUTF8(aData->mTopLevelOrigin).get(),
+ (aData->mInPrivateBrowsing ? "PrivateBrowsing" : "NonPrivateBrowsing"),
+ GetNodeId().get());
+
+ nsTArray<nsCString> tags;
+ tags.AppendElement(NS_ConvertUTF16toUTF8(mKeySystem));
+
+ // Note: must capture helper refptr here, before the Move()
+ // when we create the GetGMPDecryptorCallback below.
+ RefPtr<GMPCrashHelper> crashHelper = Move(aData->mCrashHelper);
+ UniquePtr<GetGMPDecryptorCallback> callback(new gmp_InitDoneCallback(this,
+ Move(aData)));
+ nsresult rv = mps->GetGMPDecryptor(crashHelper,
+ &tags,
+ GetNodeId(),
+ Move(callback));
+ if (NS_FAILED(rv)) {
+ RejectPromise(promiseID, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Call to GetGMPDecryptor() failed early"));
+ }
+}
+
+void
+GMPCDMProxy::OnCDMCreated(uint32_t aPromiseId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ MOZ_ASSERT(!GetNodeId().IsEmpty());
+ if (mCDM) {
+ mKeys->OnCDMCreated(aPromiseId, GetNodeId(), mCDM->GetPluginId());
+ } else {
+ // No CDM? Just reject the promise.
+ mKeys->RejectPromise(aPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in OnCDMCreated()"));
+ }
+}
+
+void
+GMPCDMProxy::CreateSession(uint32_t aCreateSessionToken,
+ dom::MediaKeySessionType aSessionType,
+ PromiseId aPromiseId,
+ const nsAString& aInitDataType,
+ nsTArray<uint8_t>& aInitData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+
+ nsAutoPtr<CreateSessionData> data(new CreateSessionData());
+ data->mSessionType = aSessionType;
+ data->mCreateSessionToken = aCreateSessionToken;
+ data->mPromiseId = aPromiseId;
+ data->mInitDataType = NS_ConvertUTF16toUTF8(aInitDataType);
+ data->mInitData = Move(aInitData);
+
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<CreateSessionData>>(this, &GMPCDMProxy::gmp_CreateSession, data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+GMPSessionType
+ToGMPSessionType(dom::MediaKeySessionType aSessionType) {
+ switch (aSessionType) {
+ case dom::MediaKeySessionType::Temporary: return kGMPTemporySession;
+ case dom::MediaKeySessionType::Persistent_license: return kGMPPersistentSession;
+ default: return kGMPTemporySession;
+ };
+};
+
+void
+GMPCDMProxy::gmp_CreateSession(nsAutoPtr<CreateSessionData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in gmp_CreateSession"));
+ return;
+ }
+ mCDM->CreateSession(aData->mCreateSessionToken,
+ aData->mPromiseId,
+ aData->mInitDataType,
+ aData->mInitData,
+ ToGMPSessionType(aData->mSessionType));
+}
+
+void
+GMPCDMProxy::LoadSession(PromiseId aPromiseId,
+ const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+
+ nsAutoPtr<SessionOpData> data(new SessionOpData());
+ data->mPromiseId = aPromiseId;
+ data->mSessionId = NS_ConvertUTF16toUTF8(aSessionId);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<SessionOpData>>(this, &GMPCDMProxy::gmp_LoadSession, data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+GMPCDMProxy::gmp_LoadSession(nsAutoPtr<SessionOpData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in gmp_LoadSession"));
+ return;
+ }
+ mCDM->LoadSession(aData->mPromiseId, aData->mSessionId);
+}
+
+void
+GMPCDMProxy::SetServerCertificate(PromiseId aPromiseId,
+ nsTArray<uint8_t>& aCert)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+
+ nsAutoPtr<SetServerCertificateData> data(new SetServerCertificateData());
+ data->mPromiseId = aPromiseId;
+ data->mCert = Move(aCert);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<SetServerCertificateData>>(this, &GMPCDMProxy::gmp_SetServerCertificate, data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+GMPCDMProxy::gmp_SetServerCertificate(nsAutoPtr<SetServerCertificateData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in gmp_SetServerCertificate"));
+ return;
+ }
+ mCDM->SetServerCertificate(aData->mPromiseId, aData->mCert);
+}
+
+void
+GMPCDMProxy::UpdateSession(const nsAString& aSessionId,
+ PromiseId aPromiseId,
+ nsTArray<uint8_t>& aResponse)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mOwnerThread);
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ nsAutoPtr<UpdateSessionData> data(new UpdateSessionData());
+ data->mPromiseId = aPromiseId;
+ data->mSessionId = NS_ConvertUTF16toUTF8(aSessionId);
+ data->mResponse = Move(aResponse);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<UpdateSessionData>>(this, &GMPCDMProxy::gmp_UpdateSession, data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+GMPCDMProxy::gmp_UpdateSession(nsAutoPtr<UpdateSessionData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in gmp_UpdateSession"));
+ return;
+ }
+ mCDM->UpdateSession(aData->mPromiseId,
+ aData->mSessionId,
+ aData->mResponse);
+}
+
+void
+GMPCDMProxy::CloseSession(const nsAString& aSessionId,
+ PromiseId aPromiseId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ nsAutoPtr<SessionOpData> data(new SessionOpData());
+ data->mPromiseId = aPromiseId;
+ data->mSessionId = NS_ConvertUTF16toUTF8(aSessionId);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<SessionOpData>>(this, &GMPCDMProxy::gmp_CloseSession, data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+GMPCDMProxy::gmp_CloseSession(nsAutoPtr<SessionOpData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in gmp_CloseSession"));
+ return;
+ }
+ mCDM->CloseSession(aData->mPromiseId, aData->mSessionId);
+}
+
+void
+GMPCDMProxy::RemoveSession(const nsAString& aSessionId,
+ PromiseId aPromiseId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_ENSURE_TRUE_VOID(!mKeys.IsNull());
+
+ nsAutoPtr<SessionOpData> data(new SessionOpData());
+ data->mPromiseId = aPromiseId;
+ data->mSessionId = NS_ConvertUTF16toUTF8(aSessionId);
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<nsAutoPtr<SessionOpData>>(this, &GMPCDMProxy::gmp_RemoveSession, data));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+}
+
+void
+GMPCDMProxy::gmp_RemoveSession(nsAutoPtr<SessionOpData> aData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ if (!mCDM) {
+ RejectPromise(aData->mPromiseId, NS_ERROR_DOM_INVALID_STATE_ERR,
+ NS_LITERAL_CSTRING("Null CDM in gmp_RemoveSession"));
+ return;
+ }
+ mCDM->RemoveSession(aData->mPromiseId, aData->mSessionId);
+}
+
+void
+GMPCDMProxy::Shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mKeys.Clear();
+ // Note: This may end up being the last owning reference to the GMPCDMProxy.
+ nsCOMPtr<nsIRunnable> task(NewRunnableMethod(this, &GMPCDMProxy::gmp_Shutdown));
+ if (mOwnerThread) {
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+ }
+}
+
+void
+GMPCDMProxy::gmp_Shutdown()
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ mShutdownCalled = true;
+
+ // Abort any pending decrypt jobs, to awaken any clients waiting on a job.
+ for (size_t i = 0; i < mDecryptionJobs.Length(); i++) {
+ DecryptJob* job = mDecryptionJobs[i];
+ job->PostResult(AbortedErr);
+ }
+ mDecryptionJobs.Clear();
+
+ if (mCDM) {
+ mCDM->Close();
+ mCDM = nullptr;
+ }
+}
+
+void
+GMPCDMProxy::RejectPromise(PromiseId aId, nsresult aCode,
+ const nsCString& aReason)
+{
+ if (NS_IsMainThread()) {
+ if (!mKeys.IsNull()) {
+ mKeys->RejectPromise(aId, aCode, aReason);
+ }
+ } else {
+ nsCOMPtr<nsIRunnable> task(new RejectPromiseTask(this, aId, aCode,
+ aReason));
+ NS_DispatchToMainThread(task);
+ }
+}
+
+void
+GMPCDMProxy::ResolvePromise(PromiseId aId)
+{
+ if (NS_IsMainThread()) {
+ if (!mKeys.IsNull()) {
+ mKeys->ResolvePromise(aId);
+ } else {
+ NS_WARNING("GMPCDMProxy unable to resolve promise!");
+ }
+ } else {
+ nsCOMPtr<nsIRunnable> task;
+ task = NewRunnableMethod<PromiseId>(this,
+ &GMPCDMProxy::ResolvePromise,
+ aId);
+ NS_DispatchToMainThread(task);
+ }
+}
+
+const nsCString&
+GMPCDMProxy::GetNodeId() const
+{
+ return mNodeId;
+}
+
+void
+GMPCDMProxy::OnSetSessionId(uint32_t aCreateSessionToken,
+ const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+
+ RefPtr<dom::MediaKeySession> session(mKeys->GetPendingSession(aCreateSessionToken));
+ if (session) {
+ session->SetSessionId(aSessionId);
+ }
+}
+
+void
+GMPCDMProxy::OnResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccess)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ mKeys->OnSessionLoaded(aPromiseId, aSuccess);
+}
+
+void
+GMPCDMProxy::OnSessionMessage(const nsAString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ nsTArray<uint8_t>& aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->DispatchKeyMessage(aMessageType, aMessage);
+ }
+}
+
+void
+GMPCDMProxy::OnKeyStatusesChange(const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->DispatchKeyStatusesChange();
+ }
+}
+
+void
+GMPCDMProxy::OnExpirationChange(const nsAString& aSessionId,
+ GMPTimestamp aExpiryTime)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->SetExpiration(static_cast<double>(aExpiryTime));
+ }
+}
+
+void
+GMPCDMProxy::OnSessionClosed(const nsAString& aSessionId)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->OnClosed();
+ }
+}
+
+void
+GMPCDMProxy::OnDecrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+ gmp_Decrypted(aId, aResult, aDecryptedData);
+}
+
+static void
+LogToConsole(const nsAString& aMsg)
+{
+ nsCOMPtr<nsIConsoleService> console(
+ do_GetService("@mozilla.org/consoleservice;1"));
+ if (!console) {
+ NS_WARNING("Failed to log message to console.");
+ return;
+ }
+ nsAutoString msg(aMsg);
+ console->LogStringMessage(msg.get());
+}
+
+void
+GMPCDMProxy::OnSessionError(const nsAString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsAString& aMsg)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mKeys.IsNull()) {
+ return;
+ }
+ RefPtr<dom::MediaKeySession> session(mKeys->GetSession(aSessionId));
+ if (session) {
+ session->DispatchKeyError(aSystemCode);
+ }
+ LogToConsole(aMsg);
+}
+
+void
+GMPCDMProxy::OnRejectPromise(uint32_t aPromiseId,
+ nsresult aDOMException,
+ const nsCString& aMsg)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RejectPromise(aPromiseId, aDOMException, aMsg);
+}
+
+const nsString&
+GMPCDMProxy::KeySystem() const
+{
+ return mKeySystem;
+}
+
+CDMCaps&
+GMPCDMProxy::Capabilites() {
+ return mCapabilites;
+}
+
+RefPtr<GMPCDMProxy::DecryptPromise>
+GMPCDMProxy::Decrypt(MediaRawData* aSample)
+{
+ RefPtr<DecryptJob> job(new DecryptJob(aSample));
+ RefPtr<DecryptPromise> promise(job->Ensure());
+
+ nsCOMPtr<nsIRunnable> task(
+ NewRunnableMethod<RefPtr<DecryptJob>>(this, &GMPCDMProxy::gmp_Decrypt, job));
+ mOwnerThread->Dispatch(task, NS_DISPATCH_NORMAL);
+ return promise;
+}
+
+void
+GMPCDMProxy::gmp_Decrypt(RefPtr<DecryptJob> aJob)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+
+ if (!mCDM) {
+ aJob->PostResult(AbortedErr);
+ return;
+ }
+
+ aJob->mId = ++mDecryptionJobCount;
+ nsTArray<uint8_t> data;
+ data.AppendElements(aJob->mSample->Data(), aJob->mSample->Size());
+ mCDM->Decrypt(aJob->mId, aJob->mSample->mCrypto, data);
+ mDecryptionJobs.AppendElement(aJob.forget());
+}
+
+void
+GMPCDMProxy::gmp_Decrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData)
+{
+ MOZ_ASSERT(IsOnOwnerThread());
+#ifdef DEBUG
+ bool jobIdFound = false;
+#endif
+ for (size_t i = 0; i < mDecryptionJobs.Length(); i++) {
+ DecryptJob* job = mDecryptionJobs[i];
+ if (job->mId == aId) {
+#ifdef DEBUG
+ jobIdFound = true;
+#endif
+ job->PostResult(aResult, aDecryptedData);
+ mDecryptionJobs.RemoveElementAt(i);
+ }
+ }
+#ifdef DEBUG
+ if (!jobIdFound) {
+ NS_WARNING("GMPDecryptorChild returned incorrect job ID");
+ }
+#endif
+}
+
+void
+GMPCDMProxy::DecryptJob::PostResult(DecryptStatus aResult)
+{
+ nsTArray<uint8_t> empty;
+ PostResult(aResult, empty);
+}
+
+void
+GMPCDMProxy::DecryptJob::PostResult(DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData)
+{
+ if (aDecryptedData.Length() != mSample->Size()) {
+ NS_WARNING("CDM returned incorrect number of decrypted bytes");
+ }
+ if (aResult == Ok) {
+ nsAutoPtr<MediaRawDataWriter> writer(mSample->CreateWriter());
+ PodCopy(writer->Data(),
+ aDecryptedData.Elements(),
+ std::min<size_t>(aDecryptedData.Length(), mSample->Size()));
+ } else if (aResult == NoKeyErr) {
+ NS_WARNING("CDM returned NoKeyErr");
+ // We still have the encrypted sample, so we can re-enqueue it to be
+ // decrypted again once the key is usable again.
+ } else {
+ nsAutoCString str("CDM returned decode failure DecryptStatus=");
+ str.AppendInt(aResult);
+ NS_WARNING(str.get());
+ }
+ mPromise.Resolve(DecryptResult(aResult, mSample), __func__);
+}
+
+void
+GMPCDMProxy::GetSessionIdsForKeyId(const nsTArray<uint8_t>& aKeyId,
+ nsTArray<nsCString>& aSessionIds)
+{
+ CDMCaps::AutoLock caps(Capabilites());
+ caps.GetSessionIdsForKeyId(aKeyId, aSessionIds);
+}
+
+void
+GMPCDMProxy::Terminated()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ NS_WARNING("CDM terminated");
+ if (mCreatePromiseId) {
+ RejectPromise(mCreatePromiseId,
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ NS_LITERAL_CSTRING("Crashed waiting for CDM to initialize"));
+ mCreatePromiseId = 0;
+ }
+ if (!mKeys.IsNull()) {
+ mKeys->Terminated();
+ }
+}
+
+uint32_t
+GMPCDMProxy::GetDecryptorId()
+{
+ return mDecryptorId;
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPCDMProxy.h b/dom/media/gmp/GMPCDMProxy.h
new file mode 100644
index 000000000..84b59d9e4
--- /dev/null
+++ b/dom/media/gmp/GMPCDMProxy.h
@@ -0,0 +1,266 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPCDMProxy_h_
+#define GMPCDMProxy_h_
+
+#include "mozilla/CDMProxy.h"
+#include "GMPCDMCallbackProxy.h"
+#include "GMPDecryptorProxy.h"
+
+namespace mozilla {
+class MediaRawData;
+
+// Implementation of CDMProxy which is based on GMP architecture.
+class GMPCDMProxy : public CDMProxy {
+public:
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPCDMProxy, override)
+
+ typedef MozPromise<DecryptResult, DecryptResult, /* IsExclusive = */ true> DecryptPromise;
+
+ GMPCDMProxy(dom::MediaKeys* aKeys,
+ const nsAString& aKeySystem,
+ GMPCrashHelper* aCrashHelper,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired);
+
+ void Init(PromiseId aPromiseId,
+ const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing) override;
+
+ void OnSetDecryptorId(uint32_t aId) override;
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ dom::MediaKeySessionType aSessionType,
+ PromiseId aPromiseId,
+ const nsAString& aInitDataType,
+ nsTArray<uint8_t>& aInitData) override;
+
+ void LoadSession(PromiseId aPromiseId,
+ const nsAString& aSessionId) override;
+
+ void SetServerCertificate(PromiseId aPromiseId,
+ nsTArray<uint8_t>& aCert) override;
+
+ void UpdateSession(const nsAString& aSessionId,
+ PromiseId aPromiseId,
+ nsTArray<uint8_t>& aResponse) override;
+
+ void CloseSession(const nsAString& aSessionId,
+ PromiseId aPromiseId) override;
+
+ void RemoveSession(const nsAString& aSessionId,
+ PromiseId aPromiseId) override;
+
+ void Shutdown() override;
+
+ void Terminated() override;
+
+ const nsCString& GetNodeId() const override;
+
+ void OnSetSessionId(uint32_t aCreateSessionToken,
+ const nsAString& aSessionId) override;
+
+ void OnResolveLoadSessionPromise(uint32_t aPromiseId, bool aSuccess) override;
+
+ void OnSessionMessage(const nsAString& aSessionId,
+ dom::MediaKeyMessageType aMessageType,
+ nsTArray<uint8_t>& aMessage) override;
+
+ void OnExpirationChange(const nsAString& aSessionId,
+ GMPTimestamp aExpiryTime) override;
+
+ void OnSessionClosed(const nsAString& aSessionId) override;
+
+ void OnSessionError(const nsAString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsAString& aMsg) override;
+
+ void OnRejectPromise(uint32_t aPromiseId,
+ nsresult aDOMException,
+ const nsCString& aMsg) override;
+
+ RefPtr<DecryptPromise> Decrypt(MediaRawData* aSample) override;
+
+ void OnDecrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) override;
+
+ void RejectPromise(PromiseId aId, nsresult aExceptionCode,
+ const nsCString& aReason) override;
+
+ void ResolvePromise(PromiseId aId) override;
+
+ const nsString& KeySystem() const override;
+
+ CDMCaps& Capabilites() override;
+
+ void OnKeyStatusesChange(const nsAString& aSessionId) override;
+
+ void GetSessionIdsForKeyId(const nsTArray<uint8_t>& aKeyId,
+ nsTArray<nsCString>& aSessionIds) override;
+
+#ifdef DEBUG
+ bool IsOnOwnerThread() override;
+#endif
+
+ uint32_t GetDecryptorId() override;
+
+private:
+ friend class gmp_InitDoneCallback;
+ friend class gmp_InitGetGMPDecryptorCallback;
+
+ struct InitData {
+ uint32_t mPromiseId;
+ nsString mOrigin;
+ nsString mTopLevelOrigin;
+ nsString mGMPName;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+ bool mInPrivateBrowsing;
+ };
+
+ // GMP thread only.
+ void gmp_Init(nsAutoPtr<InitData>&& aData);
+ void gmp_InitDone(GMPDecryptorProxy* aCDM, nsAutoPtr<InitData>&& aData);
+ void gmp_InitGetGMPDecryptor(nsresult aResult,
+ const nsACString& aNodeId,
+ nsAutoPtr<InitData>&& aData);
+
+ // GMP thread only.
+ void gmp_Shutdown();
+
+ // Main thread only.
+ void OnCDMCreated(uint32_t aPromiseId);
+
+ struct CreateSessionData {
+ dom::MediaKeySessionType mSessionType;
+ uint32_t mCreateSessionToken;
+ PromiseId mPromiseId;
+ nsCString mInitDataType;
+ nsTArray<uint8_t> mInitData;
+ };
+ // GMP thread only.
+ void gmp_CreateSession(nsAutoPtr<CreateSessionData> aData);
+
+ struct SessionOpData {
+ PromiseId mPromiseId;
+ nsCString mSessionId;
+ };
+ // GMP thread only.
+ void gmp_LoadSession(nsAutoPtr<SessionOpData> aData);
+
+ struct SetServerCertificateData {
+ PromiseId mPromiseId;
+ nsTArray<uint8_t> mCert;
+ };
+ // GMP thread only.
+ void gmp_SetServerCertificate(nsAutoPtr<SetServerCertificateData> aData);
+
+ struct UpdateSessionData {
+ PromiseId mPromiseId;
+ nsCString mSessionId;
+ nsTArray<uint8_t> mResponse;
+ };
+ // GMP thread only.
+ void gmp_UpdateSession(nsAutoPtr<UpdateSessionData> aData);
+
+ // GMP thread only.
+ void gmp_CloseSession(nsAutoPtr<SessionOpData> aData);
+
+ // GMP thread only.
+ void gmp_RemoveSession(nsAutoPtr<SessionOpData> aData);
+
+ class DecryptJob {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DecryptJob)
+
+ explicit DecryptJob(MediaRawData* aSample)
+ : mId(0)
+ , mSample(aSample)
+ {
+ }
+
+ void PostResult(DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData);
+ void PostResult(DecryptStatus aResult);
+
+ RefPtr<DecryptPromise> Ensure() {
+ return mPromise.Ensure(__func__);
+ }
+
+ uint32_t mId;
+ RefPtr<MediaRawData> mSample;
+ private:
+ ~DecryptJob() {}
+ MozPromiseHolder<DecryptPromise> mPromise;
+ };
+ // GMP thread only.
+ void gmp_Decrypt(RefPtr<DecryptJob> aJob);
+
+ // GMP thread only.
+ void gmp_Decrypted(uint32_t aId,
+ DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData);
+
+ class RejectPromiseTask : public Runnable {
+ public:
+ RejectPromiseTask(GMPCDMProxy* aProxy,
+ PromiseId aId,
+ nsresult aCode,
+ const nsCString& aReason)
+ : mProxy(aProxy)
+ , mId(aId)
+ , mCode(aCode)
+ , mReason(aReason)
+ {
+ }
+ NS_IMETHOD Run() override {
+ mProxy->RejectPromise(mId, mCode, mReason);
+ return NS_OK;
+ }
+ private:
+ RefPtr<GMPCDMProxy> mProxy;
+ PromiseId mId;
+ nsresult mCode;
+ nsCString mReason;
+ };
+
+ ~GMPCDMProxy();
+
+ GMPCrashHelper* mCrashHelper;
+
+ GMPDecryptorProxy* mCDM;
+
+ nsAutoPtr<GMPCDMCallbackProxy> mCallback;
+
+ // Decryption jobs sent to CDM, awaiting result.
+ // GMP thread only.
+ nsTArray<RefPtr<DecryptJob>> mDecryptionJobs;
+
+ // Number of buffers we've decrypted. Used to uniquely identify
+ // decryption jobs sent to CDM. Note we can't just use the length of
+ // mDecryptionJobs as that shrinks as jobs are completed and removed
+ // from it.
+ // GMP thread only.
+ uint32_t mDecryptionJobCount;
+
+ // True if GMPCDMProxy::gmp_Shutdown was called.
+ // GMP thread only.
+ bool mShutdownCalled;
+
+ uint32_t mDecryptorId;
+
+ PromiseId mCreatePromiseId;
+};
+
+
+} // namespace mozilla
+
+#endif // GMPCDMProxy_h_
diff --git a/dom/media/gmp/GMPCallbackBase.h b/dom/media/gmp/GMPCallbackBase.h
new file mode 100644
index 000000000..3d96629ef
--- /dev/null
+++ b/dom/media/gmp/GMPCallbackBase.h
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPCallbackBase_h_
+#define GMPCallbackBase_h_
+
+class GMPCallbackBase
+{
+public:
+ virtual ~GMPCallbackBase() {}
+
+ // The GMP code will call this if the codec crashes or shuts down. It's
+ // expected that the consumer (destination of this callback) will respond
+ // by dropping their reference to the proxy, allowing the proxy/parent to
+ // be destroyed.
+ virtual void Terminated() = 0;
+};
+
+#endif
diff --git a/dom/media/gmp/GMPChild.cpp b/dom/media/gmp/GMPChild.cpp
new file mode 100644
index 000000000..953dae3c6
--- /dev/null
+++ b/dom/media/gmp/GMPChild.cpp
@@ -0,0 +1,646 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPChild.h"
+#include "GMPContentChild.h"
+#include "GMPProcessChild.h"
+#include "GMPLoader.h"
+#include "GMPVideoDecoderChild.h"
+#include "GMPVideoEncoderChild.h"
+#include "GMPAudioDecoderChild.h"
+#include "GMPDecryptorChild.h"
+#include "GMPVideoHost.h"
+#include "nsDebugImpl.h"
+#include "nsIFile.h"
+#include "nsXULAppAPI.h"
+#include "gmp-video-decode.h"
+#include "gmp-video-encode.h"
+#include "GMPPlatform.h"
+#include "mozilla/dom/CrashReporterChild.h"
+#include "mozilla/ipc/ProcessChild.h"
+#include "GMPUtils.h"
+#include "prio.h"
+#include "base/task.h"
+#include "widevine-adapter/WidevineAdapter.h"
+
+using namespace mozilla::ipc;
+using mozilla::dom::CrashReporterChild;
+
+static const int MAX_VOUCHER_LENGTH = 500000;
+
+#ifdef XP_WIN
+#include <stdlib.h> // for _exit()
+#else
+#include <unistd.h> // for _exit()
+#endif
+
+#if defined(MOZ_GMP_SANDBOX)
+#if defined(XP_MACOSX)
+#include "mozilla/Sandbox.h"
+#endif
+#endif
+
+namespace mozilla {
+
+#undef LOG
+#undef LOGD
+
+extern LogModule* GetGMPLog();
+#define LOG(level, x, ...) MOZ_LOG(GetGMPLog(), (level), (x, ##__VA_ARGS__))
+#define LOGD(x, ...) LOG(mozilla::LogLevel::Debug, "GMPChild[pid=%d] " x, (int)base::GetCurrentProcId(), ##__VA_ARGS__)
+
+namespace gmp {
+
+GMPChild::GMPChild()
+ : mAsyncShutdown(nullptr)
+ , mGMPMessageLoop(MessageLoop::current())
+ , mGMPLoader(nullptr)
+{
+ LOGD("GMPChild ctor");
+ nsDebugImpl::SetMultiprocessMode("GMP");
+}
+
+GMPChild::~GMPChild()
+{
+ LOGD("GMPChild dtor");
+}
+
+static bool
+GetFileBase(const nsAString& aPluginPath,
+ nsCOMPtr<nsIFile>& aLibDirectory,
+ nsCOMPtr<nsIFile>& aFileBase,
+ nsAutoString& aBaseName)
+{
+ nsresult rv = NS_NewLocalFile(aPluginPath,
+ true, getter_AddRefs(aFileBase));
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ if (NS_FAILED(aFileBase->Clone(getter_AddRefs(aLibDirectory)))) {
+ return false;
+ }
+
+ nsCOMPtr<nsIFile> parent;
+ rv = aFileBase->GetParent(getter_AddRefs(parent));
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ nsAutoString parentLeafName;
+ rv = parent->GetLeafName(parentLeafName);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ aBaseName = Substring(parentLeafName,
+ 4,
+ parentLeafName.Length() - 1);
+ return true;
+}
+
+static bool
+GetFileBase(const nsAString& aPluginPath,
+ nsCOMPtr<nsIFile>& aFileBase,
+ nsAutoString& aBaseName)
+{
+ nsCOMPtr<nsIFile> unusedLibDir;
+ return GetFileBase(aPluginPath, unusedLibDir, aFileBase, aBaseName);
+}
+
+static bool
+GetPluginFile(const nsAString& aPluginPath,
+ nsCOMPtr<nsIFile>& aLibDirectory,
+ nsCOMPtr<nsIFile>& aLibFile)
+{
+ nsAutoString baseName;
+ GetFileBase(aPluginPath, aLibDirectory, aLibFile, baseName);
+
+#if defined(XP_MACOSX)
+ nsAutoString binaryName = NS_LITERAL_STRING("lib") + baseName + NS_LITERAL_STRING(".dylib");
+#elif defined(OS_POSIX)
+ nsAutoString binaryName = NS_LITERAL_STRING("lib") + baseName + NS_LITERAL_STRING(".so");
+#elif defined(XP_WIN)
+ nsAutoString binaryName = baseName + NS_LITERAL_STRING(".dll");
+#else
+#error not defined
+#endif
+ aLibFile->AppendRelativePath(binaryName);
+ return true;
+}
+
+#if !defined(XP_MACOSX) || !defined(MOZ_GMP_SANDBOX)
+static bool
+GetPluginFile(const nsAString& aPluginPath,
+ nsCOMPtr<nsIFile>& aLibFile)
+{
+ nsCOMPtr<nsIFile> unusedlibDir;
+ return GetPluginFile(aPluginPath, unusedlibDir, aLibFile);
+}
+#endif
+
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+static nsCString
+GetNativeTarget(nsIFile* aFile)
+{
+ bool isLink;
+ nsCString path;
+ aFile->IsSymlink(&isLink);
+ if (isLink) {
+ aFile->GetNativeTarget(path);
+ } else {
+ aFile->GetNativePath(path);
+ }
+ return path;
+}
+
+static bool
+GetPluginPaths(const nsAString& aPluginPath,
+ nsCString &aPluginDirectoryPath,
+ nsCString &aPluginFilePath)
+{
+ nsCOMPtr<nsIFile> libDirectory, libFile;
+ if (!GetPluginFile(aPluginPath, libDirectory, libFile)) {
+ return false;
+ }
+
+ // Mac sandbox rules expect paths to actual files and directories -- not
+ // soft links.
+ libDirectory->Normalize();
+ aPluginDirectoryPath = GetNativeTarget(libDirectory);
+
+ libFile->Normalize();
+ aPluginFilePath = GetNativeTarget(libFile);
+
+ return true;
+}
+
+static bool
+GetAppPaths(nsCString &aAppPath, nsCString &aAppBinaryPath)
+{
+ nsAutoCString appPath;
+ nsAutoCString appBinaryPath(
+ (CommandLine::ForCurrentProcess()->argv()[0]).c_str());
+
+ nsAutoCString::const_iterator start, end;
+ appBinaryPath.BeginReading(start);
+ appBinaryPath.EndReading(end);
+ if (RFindInReadable(NS_LITERAL_CSTRING(".app/Contents/MacOS/"), start, end)) {
+ end = start;
+ ++end; ++end; ++end; ++end;
+ appBinaryPath.BeginReading(start);
+ appPath.Assign(Substring(start, end));
+ } else {
+ return false;
+ }
+
+ nsCOMPtr<nsIFile> app, appBinary;
+ nsresult rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(appPath),
+ true, getter_AddRefs(app));
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+ rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(appBinaryPath),
+ true, getter_AddRefs(appBinary));
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ // Mac sandbox rules expect paths to actual files and directories -- not
+ // soft links.
+ aAppPath = GetNativeTarget(app);
+ appBinaryPath = GetNativeTarget(appBinary);
+
+ return true;
+}
+
+bool
+GMPChild::SetMacSandboxInfo(MacSandboxPluginType aPluginType)
+{
+ if (!mGMPLoader) {
+ return false;
+ }
+ nsAutoCString pluginDirectoryPath, pluginFilePath;
+ if (!GetPluginPaths(mPluginPath, pluginDirectoryPath, pluginFilePath)) {
+ return false;
+ }
+ nsAutoCString appPath, appBinaryPath;
+ if (!GetAppPaths(appPath, appBinaryPath)) {
+ return false;
+ }
+
+ MacSandboxInfo info;
+ info.type = MacSandboxType_Plugin;
+ info.pluginInfo.type = aPluginType;
+ info.pluginInfo.pluginPath.assign(pluginDirectoryPath.get());
+ info.pluginInfo.pluginBinaryPath.assign(pluginFilePath.get());
+ info.appPath.assign(appPath.get());
+ info.appBinaryPath.assign(appBinaryPath.get());
+
+ mGMPLoader->SetSandboxInfo(&info);
+ return true;
+}
+#endif // XP_MACOSX && MOZ_GMP_SANDBOX
+
+bool
+GMPChild::Init(const nsAString& aPluginPath,
+ const nsAString& aVoucherPath,
+ base::ProcessId aParentPid,
+ MessageLoop* aIOLoop,
+ IPC::Channel* aChannel)
+{
+ LOGD("%s pluginPath=%s", __FUNCTION__, NS_ConvertUTF16toUTF8(aPluginPath).get());
+
+ if (NS_WARN_IF(!Open(aChannel, aParentPid, aIOLoop))) {
+ return false;
+ }
+
+#ifdef MOZ_CRASHREPORTER
+ SendPCrashReporterConstructor(CrashReporter::CurrentThreadId());
+#endif
+
+ mPluginPath = aPluginPath;
+ mSandboxVoucherPath = aVoucherPath;
+
+ return true;
+}
+
+bool
+GMPChild::RecvSetNodeId(const nsCString& aNodeId)
+{
+ LOGD("%s nodeId=%s", __FUNCTION__, aNodeId.Data());
+
+ // Store the per origin salt for the node id. Note: we do this in a
+ // separate message than RecvStartPlugin() so that the string is not
+ // sitting in a string on the IPC code's call stack.
+ mNodeId = aNodeId;
+ return true;
+}
+
+GMPErr
+GMPChild::GetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId)
+{
+ if (!mGMPLoader) {
+ return GMPGenericErr;
+ }
+ return mGMPLoader->GetAPI(aAPIName, aHostAPI, aPluginAPI, aDecryptorId);
+}
+
+bool
+GMPChild::RecvPreloadLibs(const nsCString& aLibs)
+{
+#ifdef XP_WIN
+ // Pre-load DLLs that need to be used by the EME plugin but that can't be
+ // loaded after the sandbox has started
+ // Items in this must be lowercase!
+ static const char* whitelist[] = {
+ "d3d9.dll", // Create an `IDirect3D9` to get adapter information
+ "dxva2.dll", // Get monitor information
+ "evr.dll", // MFGetStrideForBitmapInfoHeader
+ "mfh264dec.dll", // H.264 decoder (on Windows Vista)
+ "mfheaacdec.dll", // AAC decoder (on Windows Vista)
+ "mfplat.dll", // MFCreateSample, MFCreateAlignedMemoryBuffer, MFCreateMediaType
+ "msauddecmft.dll", // AAC decoder (on Windows 8)
+ "msmpeg2adec.dll", // AAC decoder (on Windows 7)
+ "msmpeg2vdec.dll", // H.264 decoder
+ };
+
+ nsTArray<nsCString> libs;
+ SplitAt(", ", aLibs, libs);
+ for (nsCString lib : libs) {
+ ToLowerCase(lib);
+ for (const char* whiteListedLib : whitelist) {
+ if (lib.EqualsASCII(whiteListedLib)) {
+ LoadLibraryA(lib.get());
+ break;
+ }
+ }
+ }
+#endif
+ return true;
+}
+
+bool
+GMPChild::GetUTF8LibPath(nsACString& aOutLibPath)
+{
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+ nsAutoCString pluginDirectoryPath, pluginFilePath;
+ if (!GetPluginPaths(mPluginPath, pluginDirectoryPath, pluginFilePath)) {
+ MOZ_CRASH("Error scanning plugin path");
+ }
+ aOutLibPath.Assign(pluginFilePath);
+ return true;
+#else
+ nsCOMPtr<nsIFile> libFile;
+ if (!GetPluginFile(mPluginPath, libFile)) {
+ return false;
+ }
+
+ if (!FileExists(libFile)) {
+ NS_WARNING("Can't find GMP library file!");
+ return false;
+ }
+
+ nsAutoString path;
+ libFile->GetPath(path);
+ aOutLibPath = NS_ConvertUTF16toUTF8(path);
+
+ return true;
+#endif
+}
+
+bool
+GMPChild::AnswerStartPlugin(const nsString& aAdapter)
+{
+ LOGD("%s", __FUNCTION__);
+
+ if (!PreLoadPluginVoucher()) {
+ NS_WARNING("Plugin voucher failed to load!");
+ return false;
+ }
+ PreLoadSandboxVoucher();
+
+ nsCString libPath;
+ if (!GetUTF8LibPath(libPath)) {
+ return false;
+ }
+
+ auto platformAPI = new GMPPlatformAPI();
+ InitPlatformAPI(*platformAPI, this);
+
+ mGMPLoader = GMPProcessChild::GetGMPLoader();
+ if (!mGMPLoader) {
+ NS_WARNING("Failed to get GMPLoader");
+ delete platformAPI;
+ return false;
+ }
+
+ bool isWidevine = aAdapter.EqualsLiteral("widevine");
+#if defined(MOZ_GMP_SANDBOX) && defined(XP_MACOSX)
+ MacSandboxPluginType pluginType = MacSandboxPluginType_GMPlugin_Default;
+ if (isWidevine) {
+ pluginType = MacSandboxPluginType_GMPlugin_EME_Widevine;
+ }
+ if (!SetMacSandboxInfo(pluginType)) {
+ NS_WARNING("Failed to set Mac GMP sandbox info");
+ delete platformAPI;
+ return false;
+ }
+#endif
+
+ GMPAdapter* adapter = (isWidevine) ? new WidevineAdapter() : nullptr;
+ if (!mGMPLoader->Load(libPath.get(),
+ libPath.Length(),
+ mNodeId.BeginWriting(),
+ mNodeId.Length(),
+ platformAPI,
+ adapter)) {
+ NS_WARNING("Failed to load GMP");
+ delete platformAPI;
+ return false;
+ }
+
+ void* sh = nullptr;
+ GMPAsyncShutdownHost* host = static_cast<GMPAsyncShutdownHost*>(this);
+ GMPErr err = GetAPI(GMP_API_ASYNC_SHUTDOWN, host, &sh);
+ if (err == GMPNoErr && sh) {
+ mAsyncShutdown = reinterpret_cast<GMPAsyncShutdown*>(sh);
+ SendAsyncShutdownRequired();
+ }
+
+ return true;
+}
+
+MessageLoop*
+GMPChild::GMPMessageLoop()
+{
+ return mGMPMessageLoop;
+}
+
+void
+GMPChild::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD("%s reason=%d", __FUNCTION__, aWhy);
+
+ for (uint32_t i = mGMPContentChildren.Length(); i > 0; i--) {
+ MOZ_ASSERT_IF(aWhy == NormalShutdown, !mGMPContentChildren[i - 1]->IsUsed());
+ mGMPContentChildren[i - 1]->Close();
+ }
+
+ if (mGMPLoader) {
+ mGMPLoader->Shutdown();
+ }
+ if (AbnormalShutdown == aWhy) {
+ NS_WARNING("Abnormal shutdown of GMP process!");
+ ProcessChild::QuickExit();
+ }
+
+ XRE_ShutdownChildProcess();
+}
+
+void
+GMPChild::ProcessingError(Result aCode, const char* aReason)
+{
+ switch (aCode) {
+ case MsgDropped:
+ _exit(0); // Don't trigger a crash report.
+ case MsgNotKnown:
+ MOZ_CRASH("aborting because of MsgNotKnown");
+ case MsgNotAllowed:
+ MOZ_CRASH("aborting because of MsgNotAllowed");
+ case MsgPayloadError:
+ MOZ_CRASH("aborting because of MsgPayloadError");
+ case MsgProcessingError:
+ MOZ_CRASH("aborting because of MsgProcessingError");
+ case MsgRouteError:
+ MOZ_CRASH("aborting because of MsgRouteError");
+ case MsgValueError:
+ MOZ_CRASH("aborting because of MsgValueError");
+ default:
+ MOZ_CRASH("not reached");
+ }
+}
+
+mozilla::dom::PCrashReporterChild*
+GMPChild::AllocPCrashReporterChild(const NativeThreadId& aThread)
+{
+ return new CrashReporterChild();
+}
+
+bool
+GMPChild::DeallocPCrashReporterChild(PCrashReporterChild* aCrashReporter)
+{
+ delete aCrashReporter;
+ return true;
+}
+
+PGMPTimerChild*
+GMPChild::AllocPGMPTimerChild()
+{
+ return new GMPTimerChild(this);
+}
+
+bool
+GMPChild::DeallocPGMPTimerChild(PGMPTimerChild* aActor)
+{
+ MOZ_ASSERT(mTimerChild == static_cast<GMPTimerChild*>(aActor));
+ mTimerChild = nullptr;
+ return true;
+}
+
+GMPTimerChild*
+GMPChild::GetGMPTimers()
+{
+ if (!mTimerChild) {
+ PGMPTimerChild* sc = SendPGMPTimerConstructor();
+ if (!sc) {
+ return nullptr;
+ }
+ mTimerChild = static_cast<GMPTimerChild*>(sc);
+ }
+ return mTimerChild;
+}
+
+PGMPStorageChild*
+GMPChild::AllocPGMPStorageChild()
+{
+ return new GMPStorageChild(this);
+}
+
+bool
+GMPChild::DeallocPGMPStorageChild(PGMPStorageChild* aActor)
+{
+ mStorage = nullptr;
+ return true;
+}
+
+GMPStorageChild*
+GMPChild::GetGMPStorage()
+{
+ if (!mStorage) {
+ PGMPStorageChild* sc = SendPGMPStorageConstructor();
+ if (!sc) {
+ return nullptr;
+ }
+ mStorage = static_cast<GMPStorageChild*>(sc);
+ }
+ return mStorage;
+}
+
+bool
+GMPChild::RecvCrashPluginNow()
+{
+ MOZ_CRASH();
+ return true;
+}
+
+bool
+GMPChild::RecvBeginAsyncShutdown()
+{
+ LOGD("%s AsyncShutdown=%d", __FUNCTION__, mAsyncShutdown!=nullptr);
+
+ MOZ_ASSERT(mGMPMessageLoop == MessageLoop::current());
+ if (mAsyncShutdown) {
+ mAsyncShutdown->BeginShutdown();
+ } else {
+ ShutdownComplete();
+ }
+ return true;
+}
+
+bool
+GMPChild::RecvCloseActive()
+{
+ for (uint32_t i = mGMPContentChildren.Length(); i > 0; i--) {
+ mGMPContentChildren[i - 1]->CloseActive();
+ }
+ return true;
+}
+
+void
+GMPChild::ShutdownComplete()
+{
+ LOGD("%s", __FUNCTION__);
+ MOZ_ASSERT(mGMPMessageLoop == MessageLoop::current());
+ mAsyncShutdown = nullptr;
+ SendAsyncShutdownComplete();
+}
+
+static void
+GetPluginVoucherFile(const nsAString& aPluginPath,
+ nsCOMPtr<nsIFile>& aOutVoucherFile)
+{
+ nsAutoString baseName;
+ GetFileBase(aPluginPath, aOutVoucherFile, baseName);
+ nsAutoString infoFileName = baseName + NS_LITERAL_STRING(".voucher");
+ aOutVoucherFile->AppendRelativePath(infoFileName);
+}
+
+bool
+GMPChild::PreLoadPluginVoucher()
+{
+ nsCOMPtr<nsIFile> voucherFile;
+ GetPluginVoucherFile(mPluginPath, voucherFile);
+ if (!FileExists(voucherFile)) {
+ // Assume missing file is not fatal; that would break OpenH264.
+ return true;
+ }
+ return ReadIntoArray(voucherFile, mPluginVoucher, MAX_VOUCHER_LENGTH);
+}
+
+void
+GMPChild::PreLoadSandboxVoucher()
+{
+ nsCOMPtr<nsIFile> f;
+ nsresult rv = NS_NewLocalFile(mSandboxVoucherPath, true, getter_AddRefs(f));
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Can't create nsIFile for sandbox voucher");
+ return;
+ }
+ if (!FileExists(f)) {
+ // Assume missing file is not fatal; that would break OpenH264.
+ return;
+ }
+
+ if (!ReadIntoArray(f, mSandboxVoucher, MAX_VOUCHER_LENGTH)) {
+ NS_WARNING("Failed to read sandbox voucher");
+ }
+}
+
+PGMPContentChild*
+GMPChild::AllocPGMPContentChild(Transport* aTransport,
+ ProcessId aOtherPid)
+{
+ GMPContentChild* child =
+ mGMPContentChildren.AppendElement(new GMPContentChild(this))->get();
+ child->Open(aTransport, aOtherPid, XRE_GetIOMessageLoop(), ipc::ChildSide);
+
+ return child;
+}
+
+void
+GMPChild::GMPContentChildActorDestroy(GMPContentChild* aGMPContentChild)
+{
+ for (uint32_t i = mGMPContentChildren.Length(); i > 0; i--) {
+ UniquePtr<GMPContentChild>& toDestroy = mGMPContentChildren[i - 1];
+ if (toDestroy.get() == aGMPContentChild) {
+ SendPGMPContentChildDestroyed();
+ RefPtr<DeleteTask<GMPContentChild>> task =
+ new DeleteTask<GMPContentChild>(toDestroy.release());
+ MessageLoop::current()->PostTask(task.forget());
+ mGMPContentChildren.RemoveElementAt(i - 1);
+ break;
+ }
+ }
+}
+
+} // namespace gmp
+} // namespace mozilla
+
+#undef LOG
+#undef LOGD
diff --git a/dom/media/gmp/GMPChild.h b/dom/media/gmp/GMPChild.h
new file mode 100644
index 000000000..d5314cf96
--- /dev/null
+++ b/dom/media/gmp/GMPChild.h
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPChild_h_
+#define GMPChild_h_
+
+#include "mozilla/gmp/PGMPChild.h"
+#include "GMPTimerChild.h"
+#include "GMPStorageChild.h"
+#include "GMPLoader.h"
+#include "gmp-async-shutdown.h"
+#include "gmp-entrypoints.h"
+#include "prlink.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentChild;
+
+class GMPChild : public PGMPChild
+ , public GMPAsyncShutdownHost
+{
+public:
+ GMPChild();
+ virtual ~GMPChild();
+
+ bool Init(const nsAString& aPluginPath,
+ const nsAString& aVoucherPath,
+ base::ProcessId aParentPid,
+ MessageLoop* aIOLoop,
+ IPC::Channel* aChannel);
+ MessageLoop* GMPMessageLoop();
+
+ // Main thread only.
+ GMPTimerChild* GetGMPTimers();
+ GMPStorageChild* GetGMPStorage();
+
+ // GMPAsyncShutdownHost
+ void ShutdownComplete() override;
+
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+ bool SetMacSandboxInfo(MacSandboxPluginType aPluginType);
+#endif
+
+private:
+ friend class GMPContentChild;
+
+ bool PreLoadPluginVoucher();
+ void PreLoadSandboxVoucher();
+
+ bool GetUTF8LibPath(nsACString& aOutLibPath);
+
+ bool RecvSetNodeId(const nsCString& aNodeId) override;
+ bool AnswerStartPlugin(const nsString& aAdapter) override;
+ bool RecvPreloadLibs(const nsCString& aLibs) override;
+
+ PCrashReporterChild* AllocPCrashReporterChild(const NativeThreadId& aThread) override;
+ bool DeallocPCrashReporterChild(PCrashReporterChild*) override;
+
+ PGMPTimerChild* AllocPGMPTimerChild() override;
+ bool DeallocPGMPTimerChild(PGMPTimerChild* aActor) override;
+
+ PGMPStorageChild* AllocPGMPStorageChild() override;
+ bool DeallocPGMPStorageChild(PGMPStorageChild* aActor) override;
+
+ PGMPContentChild* AllocPGMPContentChild(Transport* aTransport,
+ ProcessId aOtherPid) override;
+ void GMPContentChildActorDestroy(GMPContentChild* aGMPContentChild);
+
+ bool RecvCrashPluginNow() override;
+ bool RecvBeginAsyncShutdown() override;
+ bool RecvCloseActive() override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ void ProcessingError(Result aCode, const char* aReason) override;
+
+ GMPErr GetAPI(const char* aAPIName, void* aHostAPI, void** aPluginAPI, uint32_t aDecryptorId = 0);
+
+ nsTArray<UniquePtr<GMPContentChild>> mGMPContentChildren;
+
+ GMPAsyncShutdown* mAsyncShutdown;
+ RefPtr<GMPTimerChild> mTimerChild;
+ RefPtr<GMPStorageChild> mStorage;
+
+ MessageLoop* mGMPMessageLoop;
+ nsString mPluginPath;
+ nsString mSandboxVoucherPath;
+ nsCString mNodeId;
+ GMPLoader* mGMPLoader;
+ nsTArray<uint8_t> mPluginVoucher;
+ nsTArray<uint8_t> mSandboxVoucher;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPChild_h_
diff --git a/dom/media/gmp/GMPContentChild.cpp b/dom/media/gmp/GMPContentChild.cpp
new file mode 100644
index 000000000..415736e11
--- /dev/null
+++ b/dom/media/gmp/GMPContentChild.cpp
@@ -0,0 +1,320 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPContentChild.h"
+#include "GMPChild.h"
+#include "GMPAudioDecoderChild.h"
+#include "GMPDecryptorChild.h"
+#include "GMPVideoDecoderChild.h"
+#include "GMPVideoEncoderChild.h"
+#include "base/task.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPContentChild::GMPContentChild(GMPChild* aChild)
+ : mGMPChild(aChild)
+{
+ MOZ_COUNT_CTOR(GMPContentChild);
+}
+
+GMPContentChild::~GMPContentChild()
+{
+ MOZ_COUNT_DTOR(GMPContentChild);
+}
+
+MessageLoop*
+GMPContentChild::GMPMessageLoop()
+{
+ return mGMPChild->GMPMessageLoop();
+}
+
+void
+GMPContentChild::CheckThread()
+{
+ MOZ_ASSERT(mGMPChild->mGMPMessageLoop == MessageLoop::current());
+}
+
+void
+GMPContentChild::ActorDestroy(ActorDestroyReason aWhy)
+{
+ mGMPChild->GMPContentChildActorDestroy(this);
+}
+
+void
+GMPContentChild::ProcessingError(Result aCode, const char* aReason)
+{
+ mGMPChild->ProcessingError(aCode, aReason);
+}
+
+PGMPAudioDecoderChild*
+GMPContentChild::AllocPGMPAudioDecoderChild()
+{
+ return new GMPAudioDecoderChild(this);
+}
+
+bool
+GMPContentChild::DeallocPGMPAudioDecoderChild(PGMPAudioDecoderChild* aActor)
+{
+ delete aActor;
+ return true;
+}
+
+PGMPDecryptorChild*
+GMPContentChild::AllocPGMPDecryptorChild()
+{
+ GMPDecryptorChild* actor = new GMPDecryptorChild(this,
+ mGMPChild->mPluginVoucher,
+ mGMPChild->mSandboxVoucher);
+ actor->AddRef();
+ return actor;
+}
+
+bool
+GMPContentChild::DeallocPGMPDecryptorChild(PGMPDecryptorChild* aActor)
+{
+ static_cast<GMPDecryptorChild*>(aActor)->Release();
+ return true;
+}
+
+PGMPVideoDecoderChild*
+GMPContentChild::AllocPGMPVideoDecoderChild(const uint32_t& aDecryptorId)
+{
+ GMPVideoDecoderChild* actor = new GMPVideoDecoderChild(this);
+ actor->AddRef();
+ return actor;
+}
+
+bool
+GMPContentChild::DeallocPGMPVideoDecoderChild(PGMPVideoDecoderChild* aActor)
+{
+ static_cast<GMPVideoDecoderChild*>(aActor)->Release();
+ return true;
+}
+
+PGMPVideoEncoderChild*
+GMPContentChild::AllocPGMPVideoEncoderChild()
+{
+ GMPVideoEncoderChild* actor = new GMPVideoEncoderChild(this);
+ actor->AddRef();
+ return actor;
+}
+
+bool
+GMPContentChild::DeallocPGMPVideoEncoderChild(PGMPVideoEncoderChild* aActor)
+{
+ static_cast<GMPVideoEncoderChild*>(aActor)->Release();
+ return true;
+}
+
+// Adapts GMPDecryptor7 to the current GMPDecryptor version.
+class GMPDecryptor7BackwardsCompat : public GMPDecryptor {
+public:
+ explicit GMPDecryptor7BackwardsCompat(GMPDecryptor7* aDecryptorV7)
+ : mDecryptorV7(aDecryptorV7)
+ {
+ }
+
+ void Init(GMPDecryptorCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired) override
+ {
+ // Distinctive identifier and persistent state arguments not present
+ // in v7 interface.
+ mDecryptorV7->Init(aCallback);
+ }
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const char* aInitDataType,
+ uint32_t aInitDataTypeSize,
+ const uint8_t* aInitData,
+ uint32_t aInitDataSize,
+ GMPSessionType aSessionType) override
+ {
+ mDecryptorV7->CreateSession(aCreateSessionToken,
+ aPromiseId,
+ aInitDataType,
+ aInitDataTypeSize,
+ aInitData,
+ aInitDataSize,
+ aSessionType);
+ }
+
+ void LoadSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override
+ {
+ mDecryptorV7->LoadSession(aPromiseId, aSessionId, aSessionIdLength);
+ }
+
+ void UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize) override
+ {
+ mDecryptorV7->UpdateSession(aPromiseId,
+ aSessionId,
+ aSessionIdLength,
+ aResponse,
+ aResponseSize);
+ }
+
+ void CloseSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override
+ {
+ mDecryptorV7->CloseSession(aPromiseId, aSessionId, aSessionIdLength);
+ }
+
+ void RemoveSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override
+ {
+ mDecryptorV7->RemoveSession(aPromiseId, aSessionId, aSessionIdLength);
+ }
+
+ void SetServerCertificate(uint32_t aPromiseId,
+ const uint8_t* aServerCert,
+ uint32_t aServerCertSize) override
+ {
+ mDecryptorV7->SetServerCertificate(aPromiseId, aServerCert, aServerCertSize);
+ }
+
+ void Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata) override
+ {
+ mDecryptorV7->Decrypt(aBuffer, aMetadata);
+ }
+
+ void DecryptingComplete() override
+ {
+ mDecryptorV7->DecryptingComplete();
+ delete this;
+ }
+private:
+ GMPDecryptor7* mDecryptorV7;
+};
+
+bool
+GMPContentChild::RecvPGMPDecryptorConstructor(PGMPDecryptorChild* aActor)
+{
+ GMPDecryptorChild* child = static_cast<GMPDecryptorChild*>(aActor);
+ GMPDecryptorHost* host = static_cast<GMPDecryptorHost*>(child);
+
+ void* ptr = nullptr;
+ GMPErr err = mGMPChild->GetAPI(GMP_API_DECRYPTOR, host, &ptr, aActor->Id());
+ GMPDecryptor* decryptor = nullptr;
+ if (GMP_SUCCEEDED(err) && ptr) {
+ decryptor = static_cast<GMPDecryptor*>(ptr);
+ } else if (err != GMPNoErr) {
+ // We Adapt the previous GMPDecryptor version to the current, so that
+ // Gecko thinks it's only talking to the current version. v7 differs
+ // from v9 in its Init() function arguments, and v9 has extra enumeration
+ // members at the end of the key status enumerations.
+ err = mGMPChild->GetAPI(GMP_API_DECRYPTOR_BACKWARDS_COMPAT, host, &ptr);
+ if (err != GMPNoErr || !ptr) {
+ return false;
+ }
+ decryptor = new GMPDecryptor7BackwardsCompat(static_cast<GMPDecryptor7*>(ptr));
+ }
+
+ child->Init(decryptor);
+
+ return true;
+}
+
+bool
+GMPContentChild::RecvPGMPAudioDecoderConstructor(PGMPAudioDecoderChild* aActor)
+{
+ auto vdc = static_cast<GMPAudioDecoderChild*>(aActor);
+
+ void* vd = nullptr;
+ GMPErr err = mGMPChild->GetAPI(GMP_API_AUDIO_DECODER, &vdc->Host(), &vd);
+ if (err != GMPNoErr || !vd) {
+ return false;
+ }
+
+ vdc->Init(static_cast<GMPAudioDecoder*>(vd));
+
+ return true;
+}
+
+bool
+GMPContentChild::RecvPGMPVideoDecoderConstructor(PGMPVideoDecoderChild* aActor,
+ const uint32_t& aDecryptorId)
+{
+ auto vdc = static_cast<GMPVideoDecoderChild*>(aActor);
+
+ void* vd = nullptr;
+ GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_DECODER, &vdc->Host(), &vd, aDecryptorId);
+ if (err != GMPNoErr || !vd) {
+ NS_WARNING("GMPGetAPI call failed trying to construct decoder.");
+ return false;
+ }
+
+ vdc->Init(static_cast<GMPVideoDecoder*>(vd));
+
+ return true;
+}
+
+bool
+GMPContentChild::RecvPGMPVideoEncoderConstructor(PGMPVideoEncoderChild* aActor)
+{
+ auto vec = static_cast<GMPVideoEncoderChild*>(aActor);
+
+ void* ve = nullptr;
+ GMPErr err = mGMPChild->GetAPI(GMP_API_VIDEO_ENCODER, &vec->Host(), &ve);
+ if (err != GMPNoErr || !ve) {
+ NS_WARNING("GMPGetAPI call failed trying to construct encoder.");
+ return false;
+ }
+
+ vec->Init(static_cast<GMPVideoEncoder*>(ve));
+
+ return true;
+}
+
+void
+GMPContentChild::CloseActive()
+{
+ // Invalidate and remove any remaining API objects.
+ const ManagedContainer<PGMPAudioDecoderChild>& audioDecoders =
+ ManagedPGMPAudioDecoderChild();
+ for (auto iter = audioDecoders.ConstIter(); !iter.Done(); iter.Next()) {
+ iter.Get()->GetKey()->SendShutdown();
+ }
+
+ const ManagedContainer<PGMPDecryptorChild>& decryptors =
+ ManagedPGMPDecryptorChild();
+ for (auto iter = decryptors.ConstIter(); !iter.Done(); iter.Next()) {
+ iter.Get()->GetKey()->SendShutdown();
+ }
+
+ const ManagedContainer<PGMPVideoDecoderChild>& videoDecoders =
+ ManagedPGMPVideoDecoderChild();
+ for (auto iter = videoDecoders.ConstIter(); !iter.Done(); iter.Next()) {
+ iter.Get()->GetKey()->SendShutdown();
+ }
+
+ const ManagedContainer<PGMPVideoEncoderChild>& videoEncoders =
+ ManagedPGMPVideoEncoderChild();
+ for (auto iter = videoEncoders.ConstIter(); !iter.Done(); iter.Next()) {
+ iter.Get()->GetKey()->SendShutdown();
+ }
+}
+
+bool
+GMPContentChild::IsUsed()
+{
+ return !ManagedPGMPAudioDecoderChild().IsEmpty() ||
+ !ManagedPGMPDecryptorChild().IsEmpty() ||
+ !ManagedPGMPVideoDecoderChild().IsEmpty() ||
+ !ManagedPGMPVideoEncoderChild().IsEmpty();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPContentChild.h b/dom/media/gmp/GMPContentChild.h
new file mode 100644
index 000000000..714207608
--- /dev/null
+++ b/dom/media/gmp/GMPContentChild.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPContentChild_h_
+#define GMPContentChild_h_
+
+#include "mozilla/gmp/PGMPContentChild.h"
+#include "GMPSharedMemManager.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPChild;
+
+class GMPContentChild : public PGMPContentChild
+ , public GMPSharedMem
+{
+public:
+ explicit GMPContentChild(GMPChild* aChild);
+ virtual ~GMPContentChild();
+
+ MessageLoop* GMPMessageLoop();
+
+ bool RecvPGMPAudioDecoderConstructor(PGMPAudioDecoderChild* aActor) override;
+ bool RecvPGMPDecryptorConstructor(PGMPDecryptorChild* aActor) override;
+ bool RecvPGMPVideoDecoderConstructor(PGMPVideoDecoderChild* aActor, const uint32_t& aDecryptorId) override;
+ bool RecvPGMPVideoEncoderConstructor(PGMPVideoEncoderChild* aActor) override;
+
+ PGMPAudioDecoderChild* AllocPGMPAudioDecoderChild() override;
+ bool DeallocPGMPAudioDecoderChild(PGMPAudioDecoderChild* aActor) override;
+
+ PGMPDecryptorChild* AllocPGMPDecryptorChild() override;
+ bool DeallocPGMPDecryptorChild(PGMPDecryptorChild* aActor) override;
+
+ PGMPVideoDecoderChild* AllocPGMPVideoDecoderChild(const uint32_t& aDecryptorId) override;
+ bool DeallocPGMPVideoDecoderChild(PGMPVideoDecoderChild* aActor) override;
+
+ PGMPVideoEncoderChild* AllocPGMPVideoEncoderChild() override;
+ bool DeallocPGMPVideoEncoderChild(PGMPVideoEncoderChild* aActor) override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ void ProcessingError(Result aCode, const char* aReason) override;
+
+ // GMPSharedMem
+ void CheckThread() override;
+
+ void CloseActive();
+ bool IsUsed();
+
+ GMPChild* mGMPChild;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPContentChild_h_
diff --git a/dom/media/gmp/GMPContentParent.cpp b/dom/media/gmp/GMPContentParent.cpp
new file mode 100644
index 000000000..12f6f4c48
--- /dev/null
+++ b/dom/media/gmp/GMPContentParent.cpp
@@ -0,0 +1,298 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPContentParent.h"
+#include "GMPAudioDecoderParent.h"
+#include "GMPDecryptorParent.h"
+#include "GMPParent.h"
+#include "GMPServiceChild.h"
+#include "GMPVideoDecoderParent.h"
+#include "GMPVideoEncoderParent.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Unused.h"
+#include "base/task.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPContentParent"
+
+namespace gmp {
+
+GMPContentParent::GMPContentParent(GMPParent* aParent)
+ : mParent(aParent)
+{
+ if (mParent) {
+ SetDisplayName(mParent->GetDisplayName());
+ SetPluginId(mParent->GetPluginId());
+ }
+}
+
+GMPContentParent::~GMPContentParent()
+{
+}
+
+class ReleaseGMPContentParent : public Runnable
+{
+public:
+ explicit ReleaseGMPContentParent(GMPContentParent* aToRelease)
+ : mToRelease(aToRelease)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ return NS_OK;
+ }
+
+private:
+ RefPtr<GMPContentParent> mToRelease;
+};
+
+void
+GMPContentParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ MOZ_ASSERT(mAudioDecoders.IsEmpty() &&
+ mDecryptors.IsEmpty() &&
+ mVideoDecoders.IsEmpty() &&
+ mVideoEncoders.IsEmpty());
+ NS_DispatchToCurrentThread(new ReleaseGMPContentParent(this));
+}
+
+void
+GMPContentParent::CheckThread()
+{
+ MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
+}
+
+void
+GMPContentParent::AudioDecoderDestroyed(GMPAudioDecoderParent* aDecoder)
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ MOZ_ALWAYS_TRUE(mAudioDecoders.RemoveElement(aDecoder));
+ CloseIfUnused();
+}
+
+void
+GMPContentParent::VideoDecoderDestroyed(GMPVideoDecoderParent* aDecoder)
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ // If the constructor fails, we'll get called before it's added
+ Unused << NS_WARN_IF(!mVideoDecoders.RemoveElement(aDecoder));
+ CloseIfUnused();
+}
+
+void
+GMPContentParent::VideoEncoderDestroyed(GMPVideoEncoderParent* aEncoder)
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ // If the constructor fails, we'll get called before it's added
+ Unused << NS_WARN_IF(!mVideoEncoders.RemoveElement(aEncoder));
+ CloseIfUnused();
+}
+
+void
+GMPContentParent::DecryptorDestroyed(GMPDecryptorParent* aSession)
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ MOZ_ALWAYS_TRUE(mDecryptors.RemoveElement(aSession));
+ CloseIfUnused();
+}
+
+void
+GMPContentParent::CloseIfUnused()
+{
+ if (mAudioDecoders.IsEmpty() &&
+ mDecryptors.IsEmpty() &&
+ mVideoDecoders.IsEmpty() &&
+ mVideoEncoders.IsEmpty()) {
+ RefPtr<GMPContentParent> toClose;
+ if (mParent) {
+ toClose = mParent->ForgetGMPContentParent();
+ } else {
+ toClose = this;
+ RefPtr<GeckoMediaPluginServiceChild> gmp(
+ GeckoMediaPluginServiceChild::GetSingleton());
+ gmp->RemoveGMPContentParent(toClose);
+ }
+ NS_DispatchToCurrentThread(NewRunnableMethod(toClose,
+ &GMPContentParent::Close));
+ }
+}
+
+nsresult
+GMPContentParent::GetGMPDecryptor(GMPDecryptorParent** aGMPDP)
+{
+ PGMPDecryptorParent* pdp = SendPGMPDecryptorConstructor();
+ if (!pdp) {
+ return NS_ERROR_FAILURE;
+ }
+ GMPDecryptorParent* dp = static_cast<GMPDecryptorParent*>(pdp);
+ // This addref corresponds to the Proxy pointer the consumer is returned.
+ // It's dropped by calling Close() on the interface.
+ NS_ADDREF(dp);
+ mDecryptors.AppendElement(dp);
+ *aGMPDP = dp;
+
+ return NS_OK;
+}
+
+nsIThread*
+GMPContentParent::GMPThread()
+{
+ if (!mGMPThread) {
+ nsCOMPtr<mozIGeckoMediaPluginService> mps = do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ MOZ_ASSERT(mps);
+ if (!mps) {
+ return nullptr;
+ }
+ // Not really safe if we just grab to the mGMPThread, as we don't know
+ // what thread we're running on and other threads may be trying to
+ // access this without locks! However, debug only, and primary failure
+ // mode outside of compiler-helped TSAN is a leak. But better would be
+ // to use swap() under a lock.
+ mps->GetThread(getter_AddRefs(mGMPThread));
+ MOZ_ASSERT(mGMPThread);
+ }
+
+ return mGMPThread;
+}
+
+nsresult
+GMPContentParent::GetGMPAudioDecoder(GMPAudioDecoderParent** aGMPAD)
+{
+ PGMPAudioDecoderParent* pvap = SendPGMPAudioDecoderConstructor();
+ if (!pvap) {
+ return NS_ERROR_FAILURE;
+ }
+ GMPAudioDecoderParent* vap = static_cast<GMPAudioDecoderParent*>(pvap);
+ // This addref corresponds to the Proxy pointer the consumer is returned.
+ // It's dropped by calling Close() on the interface.
+ NS_ADDREF(vap);
+ *aGMPAD = vap;
+ mAudioDecoders.AppendElement(vap);
+
+ return NS_OK;
+}
+
+nsresult
+GMPContentParent::GetGMPVideoDecoder(GMPVideoDecoderParent** aGMPVD,
+ uint32_t aDecryptorId)
+{
+ // returned with one anonymous AddRef that locks it until Destroy
+ PGMPVideoDecoderParent* pvdp = SendPGMPVideoDecoderConstructor(aDecryptorId);
+ if (!pvdp) {
+ return NS_ERROR_FAILURE;
+ }
+ GMPVideoDecoderParent *vdp = static_cast<GMPVideoDecoderParent*>(pvdp);
+ // This addref corresponds to the Proxy pointer the consumer is returned.
+ // It's dropped by calling Close() on the interface.
+ NS_ADDREF(vdp);
+ *aGMPVD = vdp;
+ mVideoDecoders.AppendElement(vdp);
+
+ return NS_OK;
+}
+
+nsresult
+GMPContentParent::GetGMPVideoEncoder(GMPVideoEncoderParent** aGMPVE)
+{
+ // returned with one anonymous AddRef that locks it until Destroy
+ PGMPVideoEncoderParent* pvep = SendPGMPVideoEncoderConstructor();
+ if (!pvep) {
+ return NS_ERROR_FAILURE;
+ }
+ GMPVideoEncoderParent *vep = static_cast<GMPVideoEncoderParent*>(pvep);
+ // This addref corresponds to the Proxy pointer the consumer is returned.
+ // It's dropped by calling Close() on the interface.
+ NS_ADDREF(vep);
+ *aGMPVE = vep;
+ mVideoEncoders.AppendElement(vep);
+
+ return NS_OK;
+}
+
+PGMPVideoDecoderParent*
+GMPContentParent::AllocPGMPVideoDecoderParent(const uint32_t& aDecryptorId)
+{
+ GMPVideoDecoderParent* vdp = new GMPVideoDecoderParent(this);
+ NS_ADDREF(vdp);
+ return vdp;
+}
+
+bool
+GMPContentParent::DeallocPGMPVideoDecoderParent(PGMPVideoDecoderParent* aActor)
+{
+ GMPVideoDecoderParent* vdp = static_cast<GMPVideoDecoderParent*>(aActor);
+ NS_RELEASE(vdp);
+ return true;
+}
+
+PGMPVideoEncoderParent*
+GMPContentParent::AllocPGMPVideoEncoderParent()
+{
+ GMPVideoEncoderParent* vep = new GMPVideoEncoderParent(this);
+ NS_ADDREF(vep);
+ return vep;
+}
+
+bool
+GMPContentParent::DeallocPGMPVideoEncoderParent(PGMPVideoEncoderParent* aActor)
+{
+ GMPVideoEncoderParent* vep = static_cast<GMPVideoEncoderParent*>(aActor);
+ NS_RELEASE(vep);
+ return true;
+}
+
+PGMPDecryptorParent*
+GMPContentParent::AllocPGMPDecryptorParent()
+{
+ GMPDecryptorParent* ksp = new GMPDecryptorParent(this);
+ NS_ADDREF(ksp);
+ return ksp;
+}
+
+bool
+GMPContentParent::DeallocPGMPDecryptorParent(PGMPDecryptorParent* aActor)
+{
+ GMPDecryptorParent* ksp = static_cast<GMPDecryptorParent*>(aActor);
+ NS_RELEASE(ksp);
+ return true;
+}
+
+PGMPAudioDecoderParent*
+GMPContentParent::AllocPGMPAudioDecoderParent()
+{
+ GMPAudioDecoderParent* vdp = new GMPAudioDecoderParent(this);
+ NS_ADDREF(vdp);
+ return vdp;
+}
+
+bool
+GMPContentParent::DeallocPGMPAudioDecoderParent(PGMPAudioDecoderParent* aActor)
+{
+ GMPAudioDecoderParent* vdp = static_cast<GMPAudioDecoderParent*>(aActor);
+ NS_RELEASE(vdp);
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPContentParent.h b/dom/media/gmp/GMPContentParent.h
new file mode 100644
index 000000000..81f79bc73
--- /dev/null
+++ b/dom/media/gmp/GMPContentParent.h
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPContentParent_h_
+#define GMPContentParent_h_
+
+#include "mozilla/gmp/PGMPContentParent.h"
+#include "GMPSharedMemManager.h"
+#include "nsISupportsImpl.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPAudioDecoderParent;
+class GMPDecryptorParent;
+class GMPParent;
+class GMPVideoDecoderParent;
+class GMPVideoEncoderParent;
+
+class GMPContentParent final : public PGMPContentParent,
+ public GMPSharedMem
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPContentParent)
+
+ explicit GMPContentParent(GMPParent* aParent = nullptr);
+
+ nsresult GetGMPVideoDecoder(GMPVideoDecoderParent** aGMPVD,
+ uint32_t aDecryptorId);
+ void VideoDecoderDestroyed(GMPVideoDecoderParent* aDecoder);
+
+ nsresult GetGMPVideoEncoder(GMPVideoEncoderParent** aGMPVE);
+ void VideoEncoderDestroyed(GMPVideoEncoderParent* aEncoder);
+
+ nsresult GetGMPDecryptor(GMPDecryptorParent** aGMPKS);
+ void DecryptorDestroyed(GMPDecryptorParent* aSession);
+
+ nsresult GetGMPAudioDecoder(GMPAudioDecoderParent** aGMPAD);
+ void AudioDecoderDestroyed(GMPAudioDecoderParent* aDecoder);
+
+ nsIThread* GMPThread();
+
+ // GMPSharedMem
+ void CheckThread() override;
+
+ void SetDisplayName(const nsCString& aDisplayName)
+ {
+ mDisplayName = aDisplayName;
+ }
+ const nsCString& GetDisplayName()
+ {
+ return mDisplayName;
+ }
+ void SetPluginId(const uint32_t aPluginId)
+ {
+ mPluginId = aPluginId;
+ }
+ uint32_t GetPluginId() const
+ {
+ return mPluginId;
+ }
+
+private:
+ ~GMPContentParent();
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ PGMPVideoDecoderParent* AllocPGMPVideoDecoderParent(const uint32_t& aDecryptorId) override;
+ bool DeallocPGMPVideoDecoderParent(PGMPVideoDecoderParent* aActor) override;
+
+ PGMPVideoEncoderParent* AllocPGMPVideoEncoderParent() override;
+ bool DeallocPGMPVideoEncoderParent(PGMPVideoEncoderParent* aActor) override;
+
+ PGMPDecryptorParent* AllocPGMPDecryptorParent() override;
+ bool DeallocPGMPDecryptorParent(PGMPDecryptorParent* aActor) override;
+
+ PGMPAudioDecoderParent* AllocPGMPAudioDecoderParent() override;
+ bool DeallocPGMPAudioDecoderParent(PGMPAudioDecoderParent* aActor) override;
+
+ void CloseIfUnused();
+ // Needed because NewRunnableMethod tried to use the class that the method
+ // lives on to store the receiver, but PGMPContentParent isn't refcounted.
+ void Close()
+ {
+ PGMPContentParent::Close();
+ }
+
+ nsTArray<RefPtr<GMPVideoDecoderParent>> mVideoDecoders;
+ nsTArray<RefPtr<GMPVideoEncoderParent>> mVideoEncoders;
+ nsTArray<RefPtr<GMPDecryptorParent>> mDecryptors;
+ nsTArray<RefPtr<GMPAudioDecoderParent>> mAudioDecoders;
+ nsCOMPtr<nsIThread> mGMPThread;
+ RefPtr<GMPParent> mParent;
+ nsCString mDisplayName;
+ uint32_t mPluginId;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPParent_h_
diff --git a/dom/media/gmp/GMPCrashHelperHolder.h b/dom/media/gmp/GMPCrashHelperHolder.h
new file mode 100644
index 000000000..ea6f36c83
--- /dev/null
+++ b/dom/media/gmp/GMPCrashHelperHolder.h
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPCrashHelperHolder_h_
+#define GMPCrashHelperHolder_h_
+
+#include "GMPService.h"
+#include "mozilla/RefPtr.h"
+#include "nsPIDOMWindow.h"
+#include "mozilla/ipc/ProtocolUtils.h"
+
+class GMPCrashHelper;
+
+namespace mozilla {
+
+// Disconnecting the GMPCrashHelpers at the right time is hard. We need to
+// ensure that in the crashing case that we stay connected until the
+// "gmp-plugin-crashed" message is processed in the content process.
+//
+// We have two channels connecting to the GMP; PGMP which connects from
+// chrome to GMP process, and PGMPContent, which bridges between the content
+// and GMP process. If the GMP crashes both PGMP and PGMPContent receive
+// ActorDestroy messages and begin to shutdown at the same time.
+//
+// However the crash report mini dump must be generated in the chrome
+// process' ActorDestroy, before the "gmp-plugin-crashed" message can be sent
+// to the content process. We fire the "PluginCrashed" event when we handle
+// the "gmp-plugin-crashed" message in the content process, and we need the
+// crash helpers to do that.
+//
+// The PGMPContent's managed actors' ActorDestroy messages are the only shutdown
+// notification we get in the content process, but we can't disconnect the
+// crash handlers there in the crashing case, as ActorDestroy happens before
+// we've received the "gmp-plugin-crashed" message and had a chance for the
+// crash helpers to generate the window to dispatch PluginCrashed to initiate
+// the crash report submission notification box.
+//
+// So we need to ensure that in the content process, the GMPCrashHelpers stay
+// connected to the GMPService until after ActorDestroy messages are received
+// if there's an abnormal shutdown. In the case where the GMP doesn't crash,
+// we do actually want to disconnect GMPCrashHandlers in ActorDestroy, since
+// we don't have any other signal that a GMP actor is shutting down. If we don't
+// disconnect the crash helper there in the normal shutdown case, the helper
+// will stick around forever and leak.
+//
+// In the crashing case, the GMPCrashHelpers are deallocated when the crash
+// report is processed in GeckoMediaPluginService::RunPluginCrashCallbacks().
+//
+// It's a bit yuck that we have to have two paths for disconnecting the crash
+// helpers, but there aren't really any better options.
+class GMPCrashHelperHolder
+{
+public:
+
+ void SetCrashHelper(GMPCrashHelper* aHelper)
+ {
+ mCrashHelper = aHelper;
+ }
+
+ GMPCrashHelper* GetCrashHelper()
+ {
+ return mCrashHelper;
+ }
+
+ void MaybeDisconnect(bool aAbnormalShutdown)
+ {
+ if (!aAbnormalShutdown) {
+ RefPtr<gmp::GeckoMediaPluginService> service(gmp::GeckoMediaPluginService::GetGeckoMediaPluginService());
+ service->DisconnectCrashHelper(GetCrashHelper());
+ }
+ }
+
+private:
+ RefPtr<GMPCrashHelper> mCrashHelper;
+};
+
+}
+
+#endif // GMPCrashHelperHolder_h_
diff --git a/dom/media/gmp/GMPDecryptorChild.cpp b/dom/media/gmp/GMPDecryptorChild.cpp
new file mode 100644
index 000000000..6da3c6c43
--- /dev/null
+++ b/dom/media/gmp/GMPDecryptorChild.cpp
@@ -0,0 +1,403 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPDecryptorChild.h"
+#include "GMPContentChild.h"
+#include "GMPChild.h"
+#include "base/task.h"
+#include "mozilla/TimeStamp.h"
+#include "mozilla/Unused.h"
+#include "runnable_utils.h"
+#include <ctime>
+
+#define ON_GMP_THREAD() (mPlugin->GMPMessageLoop() == MessageLoop::current())
+
+#define CALL_ON_GMP_THREAD(_func, ...) \
+ CallOnGMPThread(&GMPDecryptorChild::_func, __VA_ARGS__)
+
+namespace mozilla {
+namespace gmp {
+
+GMPDecryptorChild::GMPDecryptorChild(GMPContentChild* aPlugin,
+ const nsTArray<uint8_t>& aPluginVoucher,
+ const nsTArray<uint8_t>& aSandboxVoucher)
+ : mSession(nullptr)
+ , mPlugin(aPlugin)
+ , mPluginVoucher(aPluginVoucher)
+ , mSandboxVoucher(aSandboxVoucher)
+{
+ MOZ_ASSERT(mPlugin);
+}
+
+GMPDecryptorChild::~GMPDecryptorChild()
+{
+}
+
+template <typename MethodType, typename... ParamType>
+void
+GMPDecryptorChild::CallMethod(MethodType aMethod, ParamType&&... aParams)
+{
+ MOZ_ASSERT(ON_GMP_THREAD());
+ // Don't send IPC messages after tear-down.
+ if (mSession) {
+ (this->*aMethod)(Forward<ParamType>(aParams)...);
+ }
+}
+
+template<typename T>
+struct AddConstReference {
+ typedef const typename RemoveReference<T>::Type& Type;
+};
+
+template<typename MethodType, typename... ParamType>
+void
+GMPDecryptorChild::CallOnGMPThread(MethodType aMethod, ParamType&&... aParams)
+{
+ if (ON_GMP_THREAD()) {
+ // Use forwarding reference when we can.
+ CallMethod(aMethod, Forward<ParamType>(aParams)...);
+ } else {
+ // Use const reference when we have to.
+ auto m = &GMPDecryptorChild::CallMethod<
+ decltype(aMethod), typename AddConstReference<ParamType>::Type...>;
+ RefPtr<mozilla::Runnable> t =
+ dont_add_new_uses_of_this::NewRunnableMethod(this, m, aMethod, Forward<ParamType>(aParams)...);
+ mPlugin->GMPMessageLoop()->PostTask(t.forget());
+ }
+}
+
+void
+GMPDecryptorChild::Init(GMPDecryptor* aSession)
+{
+ MOZ_ASSERT(aSession);
+ mSession = aSession;
+ // The ID of this decryptor is the IPDL actor ID. Note it's unique inside
+ // the child process, but not necessarily across all gecko processes. However,
+ // since GMPDecryptors are segregated by node ID/origin, we shouldn't end up
+ // with clashes in the content process.
+ SendSetDecryptorId(Id());
+}
+
+void
+GMPDecryptorChild::SetSessionId(uint32_t aCreateSessionToken,
+ const char* aSessionId,
+ uint32_t aSessionIdLength)
+{
+ CALL_ON_GMP_THREAD(SendSetSessionId,
+ aCreateSessionToken, nsCString(aSessionId, aSessionIdLength));
+}
+
+void
+GMPDecryptorChild::ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess)
+{
+ CALL_ON_GMP_THREAD(SendResolveLoadSessionPromise, aPromiseId, aSuccess);
+}
+
+void
+GMPDecryptorChild::ResolvePromise(uint32_t aPromiseId)
+{
+ CALL_ON_GMP_THREAD(SendResolvePromise, aPromiseId);
+}
+
+void
+GMPDecryptorChild::RejectPromise(uint32_t aPromiseId,
+ GMPDOMException aException,
+ const char* aMessage,
+ uint32_t aMessageLength)
+{
+ CALL_ON_GMP_THREAD(SendRejectPromise,
+ aPromiseId, aException, nsCString(aMessage, aMessageLength));
+}
+
+void
+GMPDecryptorChild::SessionMessage(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPSessionMessageType aMessageType,
+ const uint8_t* aMessage,
+ uint32_t aMessageLength)
+{
+ nsTArray<uint8_t> msg;
+ msg.AppendElements(aMessage, aMessageLength);
+ CALL_ON_GMP_THREAD(SendSessionMessage,
+ nsCString(aSessionId, aSessionIdLength),
+ aMessageType, Move(msg));
+}
+
+void
+GMPDecryptorChild::ExpirationChange(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPTimestamp aExpiryTime)
+{
+ CALL_ON_GMP_THREAD(SendExpirationChange,
+ nsCString(aSessionId, aSessionIdLength), aExpiryTime);
+}
+
+void
+GMPDecryptorChild::SessionClosed(const char* aSessionId,
+ uint32_t aSessionIdLength)
+{
+ CALL_ON_GMP_THREAD(SendSessionClosed,
+ nsCString(aSessionId, aSessionIdLength));
+}
+
+void
+GMPDecryptorChild::SessionError(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPDOMException aException,
+ uint32_t aSystemCode,
+ const char* aMessage,
+ uint32_t aMessageLength)
+{
+ CALL_ON_GMP_THREAD(SendSessionError,
+ nsCString(aSessionId, aSessionIdLength),
+ aException, aSystemCode,
+ nsCString(aMessage, aMessageLength));
+}
+
+void
+GMPDecryptorChild::KeyStatusChanged(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aKeyId,
+ uint32_t aKeyIdLength,
+ GMPMediaKeyStatus aStatus)
+{
+ AutoTArray<uint8_t, 16> kid;
+ kid.AppendElements(aKeyId, aKeyIdLength);
+
+ nsTArray<GMPKeyInformation> keyInfos;
+ keyInfos.AppendElement(GMPKeyInformation(kid, aStatus));
+ CALL_ON_GMP_THREAD(SendBatchedKeyStatusChanged,
+ nsCString(aSessionId, aSessionIdLength),
+ keyInfos);
+}
+
+void
+GMPDecryptorChild::BatchedKeyStatusChanged(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const GMPMediaKeyInfo* aKeyInfos,
+ uint32_t aKeyInfosLength)
+{
+ nsTArray<GMPKeyInformation> keyInfos;
+ for (uint32_t i = 0; i < aKeyInfosLength; i++) {
+ nsTArray<uint8_t> keyId;
+ keyId.AppendElements(aKeyInfos[i].keyid, aKeyInfos[i].keyid_size);
+ keyInfos.AppendElement(GMPKeyInformation(keyId, aKeyInfos[i].status));
+ }
+ CALL_ON_GMP_THREAD(SendBatchedKeyStatusChanged,
+ nsCString(aSessionId, aSessionIdLength),
+ keyInfos);
+}
+
+void
+GMPDecryptorChild::Decrypted(GMPBuffer* aBuffer, GMPErr aResult)
+{
+ if (!ON_GMP_THREAD()) {
+ // We should run this whole method on the GMP thread since the buffer needs
+ // to be deleted after the SendDecrypted call.
+ mPlugin->GMPMessageLoop()->PostTask(NewRunnableMethod
+ <GMPBuffer*, GMPErr>(this,
+ &GMPDecryptorChild::Decrypted,
+ aBuffer, aResult));
+ return;
+ }
+
+ if (!aBuffer) {
+ NS_WARNING("GMPDecryptorCallback passed bull GMPBuffer");
+ return;
+ }
+
+ auto buffer = static_cast<GMPBufferImpl*>(aBuffer);
+ if (mSession) {
+ SendDecrypted(buffer->mId, aResult, buffer->mData);
+ }
+ delete buffer;
+}
+
+void
+GMPDecryptorChild::SetCapabilities(uint64_t aCaps)
+{
+ // Deprecated.
+}
+
+void
+GMPDecryptorChild::GetSandboxVoucher(const uint8_t** aVoucher,
+ uint32_t* aVoucherLength)
+{
+ if (!aVoucher || !aVoucherLength) {
+ return;
+ }
+ *aVoucher = mSandboxVoucher.Elements();
+ *aVoucherLength = mSandboxVoucher.Length();
+}
+
+void
+GMPDecryptorChild::GetPluginVoucher(const uint8_t** aVoucher,
+ uint32_t* aVoucherLength)
+{
+ if (!aVoucher || !aVoucherLength) {
+ return;
+ }
+ *aVoucher = mPluginVoucher.Elements();
+ *aVoucherLength = mPluginVoucher.Length();
+}
+
+bool
+GMPDecryptorChild::RecvInit(const bool& aDistinctiveIdentifierRequired,
+ const bool& aPersistentStateRequired)
+{
+ if (!mSession) {
+ return false;
+ }
+ mSession->Init(this, aDistinctiveIdentifierRequired, aPersistentStateRequired);
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvCreateSession(const uint32_t& aCreateSessionToken,
+ const uint32_t& aPromiseId,
+ const nsCString& aInitDataType,
+ InfallibleTArray<uint8_t>&& aInitData,
+ const GMPSessionType& aSessionType)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ mSession->CreateSession(aCreateSessionToken,
+ aPromiseId,
+ aInitDataType.get(),
+ aInitDataType.Length(),
+ aInitData.Elements(),
+ aInitData.Length(),
+ aSessionType);
+
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvLoadSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ mSession->LoadSession(aPromiseId,
+ aSessionId.get(),
+ aSessionId.Length());
+
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvUpdateSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId,
+ InfallibleTArray<uint8_t>&& aResponse)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ mSession->UpdateSession(aPromiseId,
+ aSessionId.get(),
+ aSessionId.Length(),
+ aResponse.Elements(),
+ aResponse.Length());
+
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvCloseSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ mSession->CloseSession(aPromiseId,
+ aSessionId.get(),
+ aSessionId.Length());
+
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvRemoveSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ mSession->RemoveSession(aPromiseId,
+ aSessionId.get(),
+ aSessionId.Length());
+
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvSetServerCertificate(const uint32_t& aPromiseId,
+ InfallibleTArray<uint8_t>&& aServerCert)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ mSession->SetServerCertificate(aPromiseId,
+ aServerCert.Elements(),
+ aServerCert.Length());
+
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvDecrypt(const uint32_t& aId,
+ InfallibleTArray<uint8_t>&& aBuffer,
+ const GMPDecryptionData& aMetadata)
+{
+ if (!mSession) {
+ return false;
+ }
+
+ // Note: the GMPBufferImpl created here is deleted when the GMP passes
+ // it back in the Decrypted() callback above.
+ GMPBufferImpl* buffer = new GMPBufferImpl(aId, aBuffer);
+
+ // |metadata| lifetime is managed by |buffer|.
+ GMPEncryptedBufferDataImpl* metadata = new GMPEncryptedBufferDataImpl(aMetadata);
+ buffer->SetMetadata(metadata);
+
+ mSession->Decrypt(buffer, metadata);
+ return true;
+}
+
+bool
+GMPDecryptorChild::RecvDecryptingComplete()
+{
+ // Reset |mSession| before calling DecryptingComplete(). We should not send
+ // any IPC messages during tear-down.
+ auto session = mSession;
+ mSession = nullptr;
+
+ if (!session) {
+ return false;
+ }
+
+ session->DecryptingComplete();
+
+ Unused << Send__delete__(this);
+
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
+
+// avoid redefined macro in unified build
+#undef ON_GMP_THREAD
+#undef CALL_ON_GMP_THREAD
diff --git a/dom/media/gmp/GMPDecryptorChild.h b/dom/media/gmp/GMPDecryptorChild.h
new file mode 100644
index 000000000..434da774f
--- /dev/null
+++ b/dom/media/gmp/GMPDecryptorChild.h
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPDecryptorChild_h_
+#define GMPDecryptorChild_h_
+
+#include "mozilla/gmp/PGMPDecryptorChild.h"
+#include "gmp-decryption.h"
+#include "mozilla/gmp/GMPTypes.h"
+#include "GMPEncryptedBufferDataImpl.h"
+#include <string>
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentChild;
+
+class GMPDecryptorChild : public GMPDecryptorCallback
+ , public GMPDecryptorHost
+ , public PGMPDecryptorChild
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPDecryptorChild);
+
+ explicit GMPDecryptorChild(GMPContentChild* aPlugin,
+ const nsTArray<uint8_t>& aPluginVoucher,
+ const nsTArray<uint8_t>& aSandboxVoucher);
+
+ void Init(GMPDecryptor* aSession);
+
+ // GMPDecryptorCallback
+ void SetSessionId(uint32_t aCreateSessionToken,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override;
+ void ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) override;
+ void ResolvePromise(uint32_t aPromiseId) override;
+
+ void RejectPromise(uint32_t aPromiseId,
+ GMPDOMException aException,
+ const char* aMessage,
+ uint32_t aMessageLength) override;
+
+ void SessionMessage(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPSessionMessageType aMessageType,
+ const uint8_t* aMessage,
+ uint32_t aMessageLength) override;
+
+ void ExpirationChange(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPTimestamp aExpiryTime) override;
+
+ void SessionClosed(const char* aSessionId,
+ uint32_t aSessionIdLength) override;
+
+ void SessionError(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPDOMException aException,
+ uint32_t aSystemCode,
+ const char* aMessage,
+ uint32_t aMessageLength) override;
+
+ void KeyStatusChanged(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aKeyId,
+ uint32_t aKeyIdLength,
+ GMPMediaKeyStatus aStatus) override;
+
+ void SetCapabilities(uint64_t aCaps) override;
+
+ void Decrypted(GMPBuffer* aBuffer, GMPErr aResult) override;
+
+ void BatchedKeyStatusChanged(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const GMPMediaKeyInfo* aKeyInfos,
+ uint32_t aKeyInfosLength) override;
+
+ // GMPDecryptorHost
+ void GetSandboxVoucher(const uint8_t** aVoucher,
+ uint32_t* aVoucherLength) override;
+
+ void GetPluginVoucher(const uint8_t** aVoucher,
+ uint32_t* aVoucherLength) override;
+private:
+ ~GMPDecryptorChild();
+
+ // GMPDecryptorChild
+ bool RecvInit(const bool& aDistinctiveIdentifierRequired,
+ const bool& aPersistentStateRequired) override;
+
+ bool RecvCreateSession(const uint32_t& aCreateSessionToken,
+ const uint32_t& aPromiseId,
+ const nsCString& aInitDataType,
+ InfallibleTArray<uint8_t>&& aInitData,
+ const GMPSessionType& aSessionType) override;
+
+ bool RecvLoadSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId) override;
+
+ bool RecvUpdateSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId,
+ InfallibleTArray<uint8_t>&& aResponse) override;
+
+ bool RecvCloseSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId) override;
+
+ bool RecvRemoveSession(const uint32_t& aPromiseId,
+ const nsCString& aSessionId) override;
+
+ bool RecvDecrypt(const uint32_t& aId,
+ InfallibleTArray<uint8_t>&& aBuffer,
+ const GMPDecryptionData& aMetadata) override;
+
+ // Resolve/reject promise on completion.
+ bool RecvSetServerCertificate(const uint32_t& aPromiseId,
+ InfallibleTArray<uint8_t>&& aServerCert) override;
+
+ bool RecvDecryptingComplete() override;
+
+ template <typename MethodType, typename... ParamType>
+ void CallMethod(MethodType, ParamType&&...);
+
+ template<typename MethodType, typename... ParamType>
+ void CallOnGMPThread(MethodType, ParamType&&...);
+
+ // GMP's GMPDecryptor implementation.
+ // Only call into this on the (GMP process) main thread.
+ GMPDecryptor* mSession;
+ GMPContentChild* mPlugin;
+
+ // Reference to the vouchers owned by the GMPChild.
+ const nsTArray<uint8_t>& mPluginVoucher;
+ const nsTArray<uint8_t>& mSandboxVoucher;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPDecryptorChild_h_
diff --git a/dom/media/gmp/GMPDecryptorParent.cpp b/dom/media/gmp/GMPDecryptorParent.cpp
new file mode 100644
index 000000000..1f8b9a7a8
--- /dev/null
+++ b/dom/media/gmp/GMPDecryptorParent.cpp
@@ -0,0 +1,508 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPDecryptorParent.h"
+#include "GMPContentParent.h"
+#include "MediaData.h"
+#include "mozilla/Unused.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGV(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Verbose, msg)
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+namespace gmp {
+
+GMPDecryptorParent::GMPDecryptorParent(GMPContentParent* aPlugin)
+ : mIsOpen(false)
+ , mShuttingDown(false)
+ , mActorDestroyed(false)
+ , mPlugin(aPlugin)
+ , mPluginId(aPlugin->GetPluginId())
+ , mCallback(nullptr)
+#ifdef DEBUG
+ , mGMPThread(aPlugin->GMPThread())
+#endif
+{
+ MOZ_ASSERT(mPlugin && mGMPThread);
+}
+
+GMPDecryptorParent::~GMPDecryptorParent()
+{
+}
+
+bool
+GMPDecryptorParent::RecvSetDecryptorId(const uint32_t& aId)
+{
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->SetDecryptorId(aId);
+ return true;
+}
+
+nsresult
+GMPDecryptorParent::Init(GMPDecryptorProxyCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired)
+{
+ LOGD(("GMPDecryptorParent[%p]::Init()", this));
+
+ if (mIsOpen) {
+ NS_WARNING("Trying to re-use an in-use GMP decrypter!");
+ return NS_ERROR_FAILURE;
+ }
+ mCallback = aCallback;
+ if (!SendInit(aDistinctiveIdentifierRequired, aPersistentStateRequired)) {
+ return NS_ERROR_FAILURE;
+ }
+ mIsOpen = true;
+ return NS_OK;
+}
+
+void
+GMPDecryptorParent::CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const nsCString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData,
+ GMPSessionType aSessionType)
+{
+ LOGD(("GMPDecryptorParent[%p]::CreateSession(token=%u, promiseId=%u, aInitData='%s')",
+ this, aCreateSessionToken, aPromiseId, ToBase64(aInitData).get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+ // Caller should ensure parameters passed in from JS are valid.
+ MOZ_ASSERT(!aInitDataType.IsEmpty() && !aInitData.IsEmpty());
+ Unused << SendCreateSession(aCreateSessionToken, aPromiseId, aInitDataType, aInitData, aSessionType);
+}
+
+void
+GMPDecryptorParent::LoadSession(uint32_t aPromiseId,
+ const nsCString& aSessionId)
+{
+ LOGD(("GMPDecryptorParent[%p]::LoadSession(sessionId='%s', promiseId=%u)",
+ this, aSessionId.get(), aPromiseId));
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+ // Caller should ensure parameters passed in from JS are valid.
+ MOZ_ASSERT(!aSessionId.IsEmpty());
+ Unused << SendLoadSession(aPromiseId, aSessionId);
+}
+
+void
+GMPDecryptorParent::UpdateSession(uint32_t aPromiseId,
+ const nsCString& aSessionId,
+ const nsTArray<uint8_t>& aResponse)
+{
+ LOGD(("GMPDecryptorParent[%p]::UpdateSession(sessionId='%s', promiseId=%u response='%s')",
+ this, aSessionId.get(), aPromiseId, ToBase64(aResponse).get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+ // Caller should ensure parameters passed in from JS are valid.
+ MOZ_ASSERT(!aSessionId.IsEmpty() && !aResponse.IsEmpty());
+ Unused << SendUpdateSession(aPromiseId, aSessionId, aResponse);
+}
+
+void
+GMPDecryptorParent::CloseSession(uint32_t aPromiseId,
+ const nsCString& aSessionId)
+{
+ LOGD(("GMPDecryptorParent[%p]::CloseSession(sessionId='%s', promiseId=%u)",
+ this, aSessionId.get(), aPromiseId));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+ // Caller should ensure parameters passed in from JS are valid.
+ MOZ_ASSERT(!aSessionId.IsEmpty());
+ Unused << SendCloseSession(aPromiseId, aSessionId);
+}
+
+void
+GMPDecryptorParent::RemoveSession(uint32_t aPromiseId,
+ const nsCString& aSessionId)
+{
+ LOGD(("GMPDecryptorParent[%p]::RemoveSession(sessionId='%s', promiseId=%u)",
+ this, aSessionId.get(), aPromiseId));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+ // Caller should ensure parameters passed in from JS are valid.
+ MOZ_ASSERT(!aSessionId.IsEmpty());
+ Unused << SendRemoveSession(aPromiseId, aSessionId);
+}
+
+void
+GMPDecryptorParent::SetServerCertificate(uint32_t aPromiseId,
+ const nsTArray<uint8_t>& aServerCert)
+{
+ LOGD(("GMPDecryptorParent[%p]::SetServerCertificate(promiseId=%u)",
+ this, aPromiseId));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+ // Caller should ensure parameters passed in from JS are valid.
+ MOZ_ASSERT(!aServerCert.IsEmpty());
+ Unused << SendSetServerCertificate(aPromiseId, aServerCert);
+}
+
+void
+GMPDecryptorParent::Decrypt(uint32_t aId,
+ const CryptoSample& aCrypto,
+ const nsTArray<uint8_t>& aBuffer)
+{
+ LOGV(("GMPDecryptorParent[%p]::Decrypt(id=%d)", this, aId));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return;
+ }
+
+ // Caller should ensure parameters passed in are valid.
+ MOZ_ASSERT(!aBuffer.IsEmpty());
+
+ if (aCrypto.mValid) {
+ GMPDecryptionData data(aCrypto.mKeyId,
+ aCrypto.mIV,
+ aCrypto.mPlainSizes,
+ aCrypto.mEncryptedSizes,
+ aCrypto.mSessionIds);
+
+ Unused << SendDecrypt(aId, aBuffer, data);
+ } else {
+ GMPDecryptionData data;
+ Unused << SendDecrypt(aId, aBuffer, data);
+ }
+}
+
+bool
+GMPDecryptorParent::RecvSetSessionId(const uint32_t& aCreateSessionId,
+ const nsCString& aSessionId)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvSetSessionId(token=%u, sessionId='%s')",
+ this, aCreateSessionId, aSessionId.get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->SetSessionId(aCreateSessionId, aSessionId);
+ return true;
+}
+
+bool
+GMPDecryptorParent::RecvResolveLoadSessionPromise(const uint32_t& aPromiseId,
+ const bool& aSuccess)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvResolveLoadSessionPromise(promiseId=%u)",
+ this, aPromiseId));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->ResolveLoadSessionPromise(aPromiseId, aSuccess);
+ return true;
+}
+
+bool
+GMPDecryptorParent::RecvResolvePromise(const uint32_t& aPromiseId)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvResolvePromise(promiseId=%u)",
+ this, aPromiseId));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->ResolvePromise(aPromiseId);
+ return true;
+}
+
+nsresult
+GMPExToNsresult(GMPDOMException aDomException) {
+ switch (aDomException) {
+ case kGMPNoModificationAllowedError: return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR;
+ case kGMPNotFoundError: return NS_ERROR_DOM_NOT_FOUND_ERR;
+ case kGMPNotSupportedError: return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ case kGMPInvalidStateError: return NS_ERROR_DOM_INVALID_STATE_ERR;
+ case kGMPSyntaxError: return NS_ERROR_DOM_SYNTAX_ERR;
+ case kGMPInvalidModificationError: return NS_ERROR_DOM_INVALID_MODIFICATION_ERR;
+ case kGMPInvalidAccessError: return NS_ERROR_DOM_INVALID_ACCESS_ERR;
+ case kGMPSecurityError: return NS_ERROR_DOM_SECURITY_ERR;
+ case kGMPAbortError: return NS_ERROR_DOM_ABORT_ERR;
+ case kGMPQuotaExceededError: return NS_ERROR_DOM_QUOTA_EXCEEDED_ERR;
+ case kGMPTimeoutError: return NS_ERROR_DOM_TIMEOUT_ERR;
+ case kGMPTypeError: return NS_ERROR_DOM_TYPE_ERR;
+ default: return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+}
+
+bool
+GMPDecryptorParent::RecvRejectPromise(const uint32_t& aPromiseId,
+ const GMPDOMException& aException,
+ const nsCString& aMessage)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvRejectPromise(promiseId=%u, exception=%d, msg='%s')",
+ this, aPromiseId, aException, aMessage.get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->RejectPromise(aPromiseId, GMPExToNsresult(aException), aMessage);
+ return true;
+}
+
+
+static dom::MediaKeyMessageType
+ToMediaKeyMessageType(GMPSessionMessageType aMessageType) {
+ switch (aMessageType) {
+ case kGMPLicenseRequest: return dom::MediaKeyMessageType::License_request;
+ case kGMPLicenseRenewal: return dom::MediaKeyMessageType::License_renewal;
+ case kGMPLicenseRelease: return dom::MediaKeyMessageType::License_release;
+ case kGMPIndividualizationRequest: return dom::MediaKeyMessageType::Individualization_request;
+ default: return dom::MediaKeyMessageType::License_request;
+ };
+};
+
+bool
+GMPDecryptorParent::RecvSessionMessage(const nsCString& aSessionId,
+ const GMPSessionMessageType& aMessageType,
+ nsTArray<uint8_t>&& aMessage)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvSessionMessage(sessionId='%s', type=%d, msg='%s')",
+ this, aSessionId.get(), aMessageType, ToBase64(aMessage).get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->SessionMessage(aSessionId, ToMediaKeyMessageType(aMessageType), aMessage);
+ return true;
+}
+
+bool
+GMPDecryptorParent::RecvExpirationChange(const nsCString& aSessionId,
+ const double& aExpiryTime)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvExpirationChange(sessionId='%s', expiry=%lf)",
+ this, aSessionId.get(), aExpiryTime));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->ExpirationChange(aSessionId, aExpiryTime);
+ return true;
+}
+
+bool
+GMPDecryptorParent::RecvSessionClosed(const nsCString& aSessionId)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvSessionClosed(sessionId='%s')",
+ this, aSessionId.get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->SessionClosed(aSessionId);
+ return true;
+}
+
+bool
+GMPDecryptorParent::RecvSessionError(const nsCString& aSessionId,
+ const GMPDOMException& aException,
+ const uint32_t& aSystemCode,
+ const nsCString& aMessage)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvSessionError(sessionId='%s', exception=%d, sysCode=%d, msg='%s')",
+ this, aSessionId.get(),
+ aException, aSystemCode, aMessage.get()));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->SessionError(aSessionId,
+ GMPExToNsresult(aException),
+ aSystemCode,
+ aMessage);
+ return true;
+}
+
+static dom::MediaKeyStatus
+ToMediaKeyStatus(GMPMediaKeyStatus aStatus) {
+ switch (aStatus) {
+ case kGMPUsable: return dom::MediaKeyStatus::Usable;
+ case kGMPExpired: return dom::MediaKeyStatus::Expired;
+ case kGMPOutputDownscaled: return dom::MediaKeyStatus::Output_downscaled;
+ case kGMPOutputRestricted: return dom::MediaKeyStatus::Output_restricted;
+ case kGMPInternalError: return dom::MediaKeyStatus::Internal_error;
+ case kGMPReleased: return dom::MediaKeyStatus::Released;
+ case kGMPStatusPending: return dom::MediaKeyStatus::Status_pending;
+ default: return dom::MediaKeyStatus::Internal_error;
+ }
+}
+
+bool
+GMPDecryptorParent::RecvBatchedKeyStatusChanged(const nsCString& aSessionId,
+ InfallibleTArray<GMPKeyInformation>&& aKeyInfos)
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvBatchedKeyStatusChanged(sessionId='%s', KeyInfos len='%d')",
+ this, aSessionId.get(), aKeyInfos.Length()));
+
+ if (mIsOpen) {
+ nsTArray<CDMKeyInfo> cdmKeyInfos(aKeyInfos.Length());
+ for (uint32_t i = 0; i < aKeyInfos.Length(); i++) {
+ LOGD(("GMPDecryptorParent[%p]::RecvBatchedKeyStatusChanged(keyId=%s, gmp-status=%d)",
+ this, ToBase64(aKeyInfos[i].keyId()).get(), aKeyInfos[i].status()));
+ // If the status is kGMPUnknown, we're going to forget(remove) that key info.
+ if (aKeyInfos[i].status() != kGMPUnknown) {
+ auto status = ToMediaKeyStatus(aKeyInfos[i].status());
+ cdmKeyInfos.AppendElement(CDMKeyInfo(aKeyInfos[i].keyId(),
+ dom::Optional<dom::MediaKeyStatus>(status)));
+ } else {
+ cdmKeyInfos.AppendElement(CDMKeyInfo(aKeyInfos[i].keyId()));
+ }
+ }
+ mCallback->BatchedKeyStatusChanged(aSessionId, cdmKeyInfos);
+ }
+ return true;
+}
+
+DecryptStatus
+ToDecryptStatus(GMPErr aError)
+{
+ switch (aError) {
+ case GMPNoErr: return Ok;
+ case GMPNoKeyErr: return NoKeyErr;
+ case GMPAbortedErr: return AbortedErr;
+ default: return GenericErr;
+ }
+}
+
+bool
+GMPDecryptorParent::RecvDecrypted(const uint32_t& aId,
+ const GMPErr& aErr,
+ InfallibleTArray<uint8_t>&& aBuffer)
+{
+ LOGV(("GMPDecryptorParent[%p]::RecvDecrypted(id=%d, err=%d)",
+ this, aId, aErr));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use a dead GMP decrypter!");
+ return false;
+ }
+ mCallback->Decrypted(aId, ToDecryptStatus(aErr), aBuffer);
+ return true;
+}
+
+bool
+GMPDecryptorParent::RecvShutdown()
+{
+ LOGD(("GMPDecryptorParent[%p]::RecvShutdown()", this));
+
+ Shutdown();
+ return true;
+}
+
+// Note: may be called via Terminated()
+void
+GMPDecryptorParent::Close()
+{
+ LOGD(("GMPDecryptorParent[%p]::Close()", this));
+ MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
+
+ // Consumer is done with us; we can shut down. No more callbacks should
+ // be made to mCallback. Note: do this before Shutdown()!
+ mCallback = nullptr;
+ // Let Shutdown mark us as dead so it knows if we had been alive
+
+ // In case this is the last reference
+ RefPtr<GMPDecryptorParent> kungfudeathgrip(this);
+ this->Release();
+ Shutdown();
+}
+
+void
+GMPDecryptorParent::Shutdown()
+{
+ LOGD(("GMPDecryptorParent[%p]::Shutdown()", this));
+ MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
+
+ if (mShuttingDown) {
+ return;
+ }
+ mShuttingDown = true;
+
+ // Notify client we're gone! Won't occur after Close()
+ if (mCallback) {
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+
+ mIsOpen = false;
+ if (!mActorDestroyed) {
+ Unused << SendDecryptingComplete();
+ }
+}
+
+// Note: Keep this sync'd up with Shutdown
+void
+GMPDecryptorParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD(("GMPDecryptorParent[%p]::ActorDestroy(reason=%d)", this, aWhy));
+
+ mIsOpen = false;
+ mActorDestroyed = true;
+ if (mCallback) {
+ // May call Close() (and Shutdown()) immediately or with a delay
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+ if (mPlugin) {
+ mPlugin->DecryptorDestroyed(this);
+ mPlugin = nullptr;
+ }
+ MaybeDisconnect(aWhy == AbnormalShutdown);
+}
+
+bool
+GMPDecryptorParent::Recv__delete__()
+{
+ LOGD(("GMPDecryptorParent[%p]::Recv__delete__()", this));
+
+ if (mPlugin) {
+ mPlugin->DecryptorDestroyed(this);
+ mPlugin = nullptr;
+ }
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPDecryptorParent.h b/dom/media/gmp/GMPDecryptorParent.h
new file mode 100644
index 000000000..30ff24690
--- /dev/null
+++ b/dom/media/gmp/GMPDecryptorParent.h
@@ -0,0 +1,129 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPDecryptorParent_h_
+#define GMPDecryptorParent_h_
+
+#include "mozilla/gmp/PGMPDecryptorParent.h"
+#include "mozilla/RefPtr.h"
+#include "gmp-decryption.h"
+#include "GMPDecryptorProxy.h"
+#include "GMPCrashHelperHolder.h"
+
+namespace mozilla {
+
+class CryptoSample;
+
+namespace gmp {
+
+class GMPContentParent;
+
+class GMPDecryptorParent final : public GMPDecryptorProxy
+ , public PGMPDecryptorParent
+ , public GMPCrashHelperHolder
+{
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPDecryptorParent)
+
+ explicit GMPDecryptorParent(GMPContentParent *aPlugin);
+
+ // GMPDecryptorProxy
+
+ uint32_t GetPluginId() const override { return mPluginId; }
+
+ nsresult Init(GMPDecryptorProxyCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired) override;
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const nsCString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData,
+ GMPSessionType aSessionType) override;
+
+ void LoadSession(uint32_t aPromiseId,
+ const nsCString& aSessionId) override;
+
+ void UpdateSession(uint32_t aPromiseId,
+ const nsCString& aSessionId,
+ const nsTArray<uint8_t>& aResponse) override;
+
+ void CloseSession(uint32_t aPromiseId,
+ const nsCString& aSessionId) override;
+
+ void RemoveSession(uint32_t aPromiseId,
+ const nsCString& aSessionId) override;
+
+ void SetServerCertificate(uint32_t aPromiseId,
+ const nsTArray<uint8_t>& aServerCert) override;
+
+ void Decrypt(uint32_t aId,
+ const CryptoSample& aCrypto,
+ const nsTArray<uint8_t>& aBuffer) override;
+
+ void Close() override;
+
+ void Shutdown();
+
+private:
+ ~GMPDecryptorParent();
+
+ // PGMPDecryptorParent
+
+ bool RecvSetDecryptorId(const uint32_t& aId) override;
+
+ bool RecvSetSessionId(const uint32_t& aCreateSessionToken,
+ const nsCString& aSessionId) override;
+
+ bool RecvResolveLoadSessionPromise(const uint32_t& aPromiseId,
+ const bool& aSuccess) override;
+
+ bool RecvResolvePromise(const uint32_t& aPromiseId) override;
+
+ bool RecvRejectPromise(const uint32_t& aPromiseId,
+ const GMPDOMException& aException,
+ const nsCString& aMessage) override;
+
+ bool RecvSessionMessage(const nsCString& aSessionId,
+ const GMPSessionMessageType& aMessageType,
+ nsTArray<uint8_t>&& aMessage) override;
+
+ bool RecvExpirationChange(const nsCString& aSessionId,
+ const double& aExpiryTime) override;
+
+ bool RecvSessionClosed(const nsCString& aSessionId) override;
+
+ bool RecvSessionError(const nsCString& aSessionId,
+ const GMPDOMException& aException,
+ const uint32_t& aSystemCode,
+ const nsCString& aMessage) override;
+
+ bool RecvDecrypted(const uint32_t& aId,
+ const GMPErr& aErr,
+ InfallibleTArray<uint8_t>&& aBuffer) override;
+
+ bool RecvBatchedKeyStatusChanged(const nsCString& aSessionId,
+ InfallibleTArray<GMPKeyInformation>&& aKeyInfos) override;
+
+ bool RecvShutdown() override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ bool Recv__delete__() override;
+
+ bool mIsOpen;
+ bool mShuttingDown;
+ bool mActorDestroyed;
+ RefPtr<GMPContentParent> mPlugin;
+ uint32_t mPluginId;
+ GMPDecryptorProxyCallback* mCallback;
+#ifdef DEBUG
+ nsIThread* const mGMPThread;
+#endif
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPDecryptorChild_h_
diff --git a/dom/media/gmp/GMPDecryptorProxy.h b/dom/media/gmp/GMPDecryptorProxy.h
new file mode 100644
index 000000000..0ef31fd92
--- /dev/null
+++ b/dom/media/gmp/GMPDecryptorProxy.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPDecryptorProxy_h_
+#define GMPDecryptorProxy_h_
+
+#include "mozilla/DecryptorProxyCallback.h"
+#include "GMPCallbackBase.h"
+#include "gmp-decryption.h"
+#include "nsString.h"
+
+namespace mozilla {
+class CryptoSample;
+} // namespace mozilla
+
+class GMPDecryptorProxyCallback : public DecryptorProxyCallback,
+ public GMPCallbackBase {
+public:
+ virtual ~GMPDecryptorProxyCallback() {}
+};
+
+class GMPDecryptorProxy {
+public:
+ ~GMPDecryptorProxy() {}
+
+ virtual uint32_t GetPluginId() const = 0;
+
+ virtual nsresult Init(GMPDecryptorProxyCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired) = 0;
+
+ virtual void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const nsCString& aInitDataType,
+ const nsTArray<uint8_t>& aInitData,
+ GMPSessionType aSessionType) = 0;
+
+ virtual void LoadSession(uint32_t aPromiseId,
+ const nsCString& aSessionId) = 0;
+
+ virtual void UpdateSession(uint32_t aPromiseId,
+ const nsCString& aSessionId,
+ const nsTArray<uint8_t>& aResponse) = 0;
+
+ virtual void CloseSession(uint32_t aPromiseId,
+ const nsCString& aSessionId) = 0;
+
+ virtual void RemoveSession(uint32_t aPromiseId,
+ const nsCString& aSessionId) = 0;
+
+ virtual void SetServerCertificate(uint32_t aPromiseId,
+ const nsTArray<uint8_t>& aServerCert) = 0;
+
+ virtual void Decrypt(uint32_t aId,
+ const mozilla::CryptoSample& aCrypto,
+ const nsTArray<uint8_t>& aBuffer) = 0;
+
+ virtual void Close() = 0;
+};
+
+#endif // GMPDecryptorProxy_h_
diff --git a/dom/media/gmp/GMPDiskStorage.cpp b/dom/media/gmp/GMPDiskStorage.cpp
new file mode 100644
index 000000000..11f49c8fe
--- /dev/null
+++ b/dom/media/gmp/GMPDiskStorage.cpp
@@ -0,0 +1,499 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "plhash.h"
+#include "nsDirectoryServiceUtils.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsAppDirectoryServiceDefs.h"
+#include "GMPParent.h"
+#include "gmp-storage.h"
+#include "mozilla/Unused.h"
+#include "mozilla/EndianUtils.h"
+#include "nsClassHashtable.h"
+#include "prio.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "nsContentCID.h"
+#include "nsServiceManagerUtils.h"
+#include "nsISimpleEnumerator.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+namespace gmp {
+
+// We store the records for a given GMP as files in the profile dir.
+// $profileDir/gmp/$platform/$gmpName/storage/$nodeId/
+static nsresult
+GetGMPStorageDir(nsIFile** aTempDir,
+ const nsString& aGMPName,
+ const nsCString& aNodeId)
+{
+ if (NS_WARN_IF(!aTempDir)) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
+ nsCOMPtr<mozIGeckoMediaPluginChromeService> mps =
+ do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ if (NS_WARN_IF(!mps)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsCOMPtr<nsIFile> tmpFile;
+ nsresult rv = mps->GetStorageDir(getter_AddRefs(tmpFile));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = tmpFile->Append(aGMPName);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = tmpFile->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = tmpFile->AppendNative(NS_LITERAL_CSTRING("storage"));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = tmpFile->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = tmpFile->AppendNative(aNodeId);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = tmpFile->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ tmpFile.forget(aTempDir);
+
+ return NS_OK;
+}
+
+// Disk-backed GMP storage. Records are stored in files on disk in
+// the profile directory. The record name is a hash of the filename,
+// and we resolve hash collisions by just adding 1 to the hash code.
+// The format of records on disk is:
+// 4 byte, uint32_t $recordNameLength, in little-endian byte order,
+// record name (i.e. $recordNameLength bytes, no null terminator)
+// record bytes (entire remainder of file)
+class GMPDiskStorage : public GMPStorage {
+public:
+ explicit GMPDiskStorage(const nsCString& aNodeId,
+ const nsString& aGMPName)
+ : mNodeId(aNodeId)
+ , mGMPName(aGMPName)
+ {
+ }
+
+ ~GMPDiskStorage() {
+ // Close all open file handles.
+ for (auto iter = mRecords.ConstIter(); !iter.Done(); iter.Next()) {
+ Record* record = iter.UserData();
+ if (record->mFileDesc) {
+ PR_Close(record->mFileDesc);
+ record->mFileDesc = nullptr;
+ }
+ }
+ }
+
+ nsresult Init() {
+ // Build our index of records on disk.
+ nsCOMPtr<nsIFile> storageDir;
+ nsresult rv = GetGMPStorageDir(getter_AddRefs(storageDir), mGMPName, mNodeId);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ DirectoryEnumerator iter(storageDir, DirectoryEnumerator::FilesAndDirs);
+ for (nsCOMPtr<nsIFile> dirEntry; (dirEntry = iter.Next()) != nullptr;) {
+ PRFileDesc* fd = nullptr;
+ if (NS_FAILED(dirEntry->OpenNSPRFileDesc(PR_RDONLY, 0, &fd))) {
+ continue;
+ }
+ int32_t recordLength = 0;
+ nsCString recordName;
+ nsresult err = ReadRecordMetadata(fd, recordLength, recordName);
+ PR_Close(fd);
+ if (NS_FAILED(err)) {
+ // File is not a valid storage file. Don't index it. Delete the file,
+ // to make our indexing faster in future.
+ dirEntry->Remove(false);
+ continue;
+ }
+
+ nsAutoString filename;
+ rv = dirEntry->GetLeafName(filename);
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ mRecords.Put(recordName, new Record(filename, recordName));
+ }
+
+ return NS_OK;
+ }
+
+ GMPErr Open(const nsCString& aRecordName) override
+ {
+ MOZ_ASSERT(!IsOpen(aRecordName));
+ nsresult rv;
+ Record* record = nullptr;
+ if (!mRecords.Get(aRecordName, &record)) {
+ // New file.
+ nsAutoString filename;
+ rv = GetUnusedFilename(aRecordName, filename);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return GMPGenericErr;
+ }
+ record = new Record(filename, aRecordName);
+ mRecords.Put(aRecordName, record);
+ }
+
+ MOZ_ASSERT(record);
+ if (record->mFileDesc) {
+ NS_WARNING("Tried to open already open record");
+ return GMPRecordInUse;
+ }
+
+ rv = OpenStorageFile(record->mFilename, ReadWrite, &record->mFileDesc);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return GMPGenericErr;
+ }
+
+ MOZ_ASSERT(IsOpen(aRecordName));
+
+ return GMPNoErr;
+ }
+
+ bool IsOpen(const nsCString& aRecordName) const override {
+ // We are open if we have a record indexed, and it has a valid
+ // file descriptor.
+ const Record* record = mRecords.Get(aRecordName);
+ return record && !!record->mFileDesc;
+ }
+
+ GMPErr Read(const nsCString& aRecordName,
+ nsTArray<uint8_t>& aOutBytes) override
+ {
+ if (!IsOpen(aRecordName)) {
+ return GMPClosedErr;
+ }
+
+ Record* record = nullptr;
+ mRecords.Get(aRecordName, &record);
+ MOZ_ASSERT(record && !!record->mFileDesc); // IsOpen() guarantees this.
+
+ // Our error strategy is to report records with invalid contents as
+ // containing 0 bytes. Zero length records are considered "deleted" by
+ // the GMPStorage API.
+ aOutBytes.SetLength(0);
+
+ int32_t recordLength = 0;
+ nsCString recordName;
+ nsresult err = ReadRecordMetadata(record->mFileDesc,
+ recordLength,
+ recordName);
+ if (NS_FAILED(err) || recordLength == 0) {
+ // We failed to read the record metadata. Or the record is 0 length.
+ // Treat damaged records as empty.
+ // ReadRecordMetadata() could fail if the GMP opened a new record and
+ // tried to read it before anything was written to it..
+ return GMPNoErr;
+ }
+
+ if (!aRecordName.Equals(recordName)) {
+ NS_WARNING("Record file contains some other record's contents!");
+ return GMPRecordCorrupted;
+ }
+
+ // After calling ReadRecordMetadata, we should be ready to read the
+ // record data.
+ if (PR_Available(record->mFileDesc) != recordLength) {
+ NS_WARNING("Record file length mismatch!");
+ return GMPRecordCorrupted;
+ }
+
+ aOutBytes.SetLength(recordLength);
+ int32_t bytesRead = PR_Read(record->mFileDesc, aOutBytes.Elements(), recordLength);
+ return (bytesRead == recordLength) ? GMPNoErr : GMPRecordCorrupted;
+ }
+
+ GMPErr Write(const nsCString& aRecordName,
+ const nsTArray<uint8_t>& aBytes) override
+ {
+ if (!IsOpen(aRecordName)) {
+ return GMPClosedErr;
+ }
+
+ Record* record = nullptr;
+ mRecords.Get(aRecordName, &record);
+ MOZ_ASSERT(record && !!record->mFileDesc); // IsOpen() guarantees this.
+
+ // Write operations overwrite the entire record. So close it now.
+ PR_Close(record->mFileDesc);
+ record->mFileDesc = nullptr;
+
+ // Writing 0 bytes means removing (deleting) the file.
+ if (aBytes.Length() == 0) {
+ nsresult rv = RemoveStorageFile(record->mFilename);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ // Could not delete file -> Continue with trying to erase the contents.
+ } else {
+ return GMPNoErr;
+ }
+ }
+
+ // Write operations overwrite the entire record. So re-open the file
+ // in truncate mode, to clear its contents.
+ if (NS_FAILED(OpenStorageFile(record->mFilename,
+ Truncate,
+ &record->mFileDesc))) {
+ return GMPGenericErr;
+ }
+
+ // Store the length of the record name followed by the record name
+ // at the start of the file.
+ int32_t bytesWritten = 0;
+ char buf[sizeof(uint32_t)] = {0};
+ LittleEndian::writeUint32(buf, aRecordName.Length());
+ bytesWritten = PR_Write(record->mFileDesc, buf, MOZ_ARRAY_LENGTH(buf));
+ if (bytesWritten != MOZ_ARRAY_LENGTH(buf)) {
+ NS_WARNING("Failed to write GMPStorage record name length.");
+ return GMPRecordCorrupted;
+ }
+ bytesWritten = PR_Write(record->mFileDesc,
+ aRecordName.get(),
+ aRecordName.Length());
+ if (bytesWritten != (int32_t)aRecordName.Length()) {
+ NS_WARNING("Failed to write GMPStorage record name.");
+ return GMPRecordCorrupted;
+ }
+
+ bytesWritten = PR_Write(record->mFileDesc, aBytes.Elements(), aBytes.Length());
+ if (bytesWritten != (int32_t)aBytes.Length()) {
+ NS_WARNING("Failed to write GMPStorage record data.");
+ return GMPRecordCorrupted;
+ }
+
+ // Try to sync the file to disk, so that in the event of a crash,
+ // the record is less likely to be corrupted.
+ PR_Sync(record->mFileDesc);
+
+ return GMPNoErr;
+ }
+
+ GMPErr GetRecordNames(nsTArray<nsCString>& aOutRecordNames) const override
+ {
+ for (auto iter = mRecords.ConstIter(); !iter.Done(); iter.Next()) {
+ aOutRecordNames.AppendElement(iter.UserData()->mRecordName);
+ }
+ return GMPNoErr;
+ }
+
+ void Close(const nsCString& aRecordName) override
+ {
+ Record* record = nullptr;
+ mRecords.Get(aRecordName, &record);
+ if (record && !!record->mFileDesc) {
+ PR_Close(record->mFileDesc);
+ record->mFileDesc = nullptr;
+ }
+ MOZ_ASSERT(!IsOpen(aRecordName));
+ }
+
+private:
+
+ // We store records in a file which is a hash of the record name.
+ // If there is a hash collision, we just keep adding 1 to the hash
+ // code, until we find a free slot.
+ nsresult GetUnusedFilename(const nsACString& aRecordName,
+ nsString& aOutFilename)
+ {
+ nsCOMPtr<nsIFile> storageDir;
+ nsresult rv = GetGMPStorageDir(getter_AddRefs(storageDir), mGMPName, mNodeId);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ uint64_t recordNameHash = HashString(PromiseFlatCString(aRecordName).get());
+ for (int i = 0; i < 1000000; i++) {
+ nsCOMPtr<nsIFile> f;
+ rv = storageDir->Clone(getter_AddRefs(f));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ nsAutoString hashStr;
+ hashStr.AppendInt(recordNameHash);
+ rv = f->Append(hashStr);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ bool exists = false;
+ f->Exists(&exists);
+ if (!exists) {
+ // Filename not in use, we can write into this file.
+ aOutFilename = hashStr;
+ return NS_OK;
+ } else {
+ // Hash collision; just increment the hash name and try that again.
+ ++recordNameHash;
+ continue;
+ }
+ }
+ // Somehow, we've managed to completely fail to find a vacant file name.
+ // Give up.
+ NS_WARNING("GetUnusedFilename had extreme hash collision!");
+ return NS_ERROR_FAILURE;
+ }
+
+ enum OpenFileMode { ReadWrite, Truncate };
+
+ nsresult OpenStorageFile(const nsAString& aFileLeafName,
+ const OpenFileMode aMode,
+ PRFileDesc** aOutFD)
+ {
+ MOZ_ASSERT(aOutFD);
+
+ nsCOMPtr<nsIFile> f;
+ nsresult rv = GetGMPStorageDir(getter_AddRefs(f), mGMPName, mNodeId);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ f->Append(aFileLeafName);
+
+ auto mode = PR_RDWR | PR_CREATE_FILE;
+ if (aMode == Truncate) {
+ mode |= PR_TRUNCATE;
+ }
+
+ return f->OpenNSPRFileDesc(mode, PR_IRWXU, aOutFD);
+ }
+
+ nsresult ReadRecordMetadata(PRFileDesc* aFd,
+ int32_t& aOutRecordLength,
+ nsACString& aOutRecordName)
+ {
+ int32_t offset = PR_Seek(aFd, 0, PR_SEEK_END);
+ PR_Seek(aFd, 0, PR_SEEK_SET);
+
+ if (offset < 0 || offset > GMP_MAX_RECORD_SIZE) {
+ // Refuse to read big records, or records where we can't get a length.
+ return NS_ERROR_FAILURE;
+ }
+ const uint32_t fileLength = static_cast<uint32_t>(offset);
+
+ // At the start of the file the length of the record name is stored in a
+ // uint32_t (little endian byte order) followed by the record name at the
+ // start of the file. The record name is not null terminated. The remainder
+ // of the file is the record's data.
+
+ if (fileLength < sizeof(uint32_t)) {
+ // Record file doesn't have enough contents to store the record name
+ // length. Fail.
+ return NS_ERROR_FAILURE;
+ }
+
+ // Read length, and convert to host byte order.
+ uint32_t recordNameLength = 0;
+ char buf[sizeof(recordNameLength)] = { 0 };
+ int32_t bytesRead = PR_Read(aFd, &buf, sizeof(recordNameLength));
+ recordNameLength = LittleEndian::readUint32(buf);
+ if (sizeof(recordNameLength) != bytesRead ||
+ recordNameLength == 0 ||
+ recordNameLength + sizeof(recordNameLength) > fileLength ||
+ recordNameLength > GMP_MAX_RECORD_NAME_SIZE) {
+ // Record file has invalid contents. Fail.
+ return NS_ERROR_FAILURE;
+ }
+
+ nsCString recordName;
+ recordName.SetLength(recordNameLength);
+ bytesRead = PR_Read(aFd, recordName.BeginWriting(), recordNameLength);
+ if ((uint32_t)bytesRead != recordNameLength) {
+ // Read failed.
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(fileLength >= sizeof(recordNameLength) + recordNameLength);
+ int32_t recordLength = fileLength - (sizeof(recordNameLength) + recordNameLength);
+
+ aOutRecordLength = recordLength;
+ aOutRecordName = recordName;
+
+ // Read cursor should be positioned after the record name, before the record contents.
+ if (PR_Seek(aFd, 0, PR_SEEK_CUR) != (int32_t)(sizeof(recordNameLength) + recordNameLength)) {
+ NS_WARNING("Read cursor mismatch after ReadRecordMetadata()");
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+ }
+
+ nsresult RemoveStorageFile(const nsString& aFilename)
+ {
+ nsCOMPtr<nsIFile> f;
+ nsresult rv = GetGMPStorageDir(getter_AddRefs(f), mGMPName, mNodeId);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ rv = f->Append(aFilename);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ return f->Remove(/* bool recursive= */ false);
+ }
+
+ struct Record {
+ Record(const nsAString& aFilename,
+ const nsACString& aRecordName)
+ : mFilename(aFilename)
+ , mRecordName(aRecordName)
+ , mFileDesc(0)
+ {}
+ ~Record() {
+ MOZ_ASSERT(!mFileDesc);
+ }
+ nsString mFilename;
+ nsCString mRecordName;
+ PRFileDesc* mFileDesc;
+ };
+
+ // Hash record name to record data.
+ nsClassHashtable<nsCStringHashKey, Record> mRecords;
+ const nsCString mNodeId;
+ const nsString mGMPName;
+};
+
+already_AddRefed<GMPStorage> CreateGMPDiskStorage(const nsCString& aNodeId,
+ const nsString& aGMPName)
+{
+ RefPtr<GMPDiskStorage> storage(new GMPDiskStorage(aNodeId, aGMPName));
+ if (NS_FAILED(storage->Init())) {
+ NS_WARNING("Failed to initialize on disk GMP storage");
+ return nullptr;
+ }
+ return storage.forget();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPEncryptedBufferDataImpl.cpp b/dom/media/gmp/GMPEncryptedBufferDataImpl.cpp
new file mode 100644
index 000000000..206d7b42a
--- /dev/null
+++ b/dom/media/gmp/GMPEncryptedBufferDataImpl.cpp
@@ -0,0 +1,132 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPEncryptedBufferDataImpl.h"
+#include "mozilla/gmp/GMPTypes.h"
+#include "MediaData.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPEncryptedBufferDataImpl::GMPEncryptedBufferDataImpl(const CryptoSample& aCrypto)
+ : mKeyId(aCrypto.mKeyId)
+ , mIV(aCrypto.mIV)
+ , mClearBytes(aCrypto.mPlainSizes)
+ , mCipherBytes(aCrypto.mEncryptedSizes)
+ , mSessionIdList(aCrypto.mSessionIds)
+{
+}
+
+GMPEncryptedBufferDataImpl::GMPEncryptedBufferDataImpl(const GMPDecryptionData& aData)
+ : mKeyId(aData.mKeyId())
+ , mIV(aData.mIV())
+ , mClearBytes(aData.mClearBytes())
+ , mCipherBytes(aData.mCipherBytes())
+ , mSessionIdList(aData.mSessionIds())
+{
+ MOZ_ASSERT(mClearBytes.Length() == mCipherBytes.Length());
+}
+
+GMPEncryptedBufferDataImpl::~GMPEncryptedBufferDataImpl()
+{
+}
+
+void
+GMPEncryptedBufferDataImpl::RelinquishData(GMPDecryptionData& aData)
+{
+ aData.mKeyId() = Move(mKeyId);
+ aData.mIV() = Move(mIV);
+ aData.mClearBytes() = Move(mClearBytes);
+ aData.mCipherBytes() = Move(mCipherBytes);
+ mSessionIdList.RelinquishData(aData.mSessionIds());
+}
+
+const uint8_t*
+GMPEncryptedBufferDataImpl::KeyId() const
+{
+ return mKeyId.Elements();
+}
+
+uint32_t
+GMPEncryptedBufferDataImpl::KeyIdSize() const
+{
+ return mKeyId.Length();
+}
+
+const uint8_t*
+GMPEncryptedBufferDataImpl::IV() const
+{
+ return mIV.Elements();
+}
+
+uint32_t
+GMPEncryptedBufferDataImpl::IVSize() const
+{
+ return mIV.Length();
+}
+
+const uint16_t*
+GMPEncryptedBufferDataImpl::ClearBytes() const
+{
+ return mClearBytes.Elements();
+}
+
+const uint32_t*
+GMPEncryptedBufferDataImpl::CipherBytes() const
+{
+ return mCipherBytes.Elements();
+}
+
+const GMPStringList*
+GMPEncryptedBufferDataImpl::SessionIds() const
+{
+ return &mSessionIdList;
+}
+
+uint32_t
+GMPEncryptedBufferDataImpl::NumSubsamples() const
+{
+ MOZ_ASSERT(mClearBytes.Length() == mCipherBytes.Length());
+ // Return the min of the two, to ensure there's not chance of array index
+ // out-of-bounds shenanigans.
+ return std::min<uint32_t>(mClearBytes.Length(), mCipherBytes.Length());
+}
+
+GMPStringListImpl::GMPStringListImpl(const nsTArray<nsCString>& aStrings)
+ : mStrings(aStrings)
+{
+}
+
+uint32_t
+GMPStringListImpl::Size() const
+{
+ return mStrings.Length();
+}
+
+void
+GMPStringListImpl::StringAt(uint32_t aIndex,
+ const char** aOutString,
+ uint32_t *aOutLength) const
+{
+ if (NS_WARN_IF(aIndex >= Size())) {
+ return;
+ }
+
+ *aOutString = mStrings[aIndex].BeginReading();
+ *aOutLength = mStrings[aIndex].Length();
+}
+
+void
+GMPStringListImpl::RelinquishData(nsTArray<nsCString>& aStrings)
+{
+ aStrings = Move(mStrings);
+}
+
+GMPStringListImpl::~GMPStringListImpl()
+{
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPEncryptedBufferDataImpl.h b/dom/media/gmp/GMPEncryptedBufferDataImpl.h
new file mode 100644
index 000000000..f0d5728df
--- /dev/null
+++ b/dom/media/gmp/GMPEncryptedBufferDataImpl.h
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPEncryptedBufferDataImpl_h_
+#define GMPEncryptedBufferDataImpl_h_
+
+#include "gmp-decryption.h"
+#include "nsAutoPtr.h"
+#include "nsTArray.h"
+#include "mozilla/gmp/GMPTypes.h"
+
+namespace mozilla {
+class CryptoSample;
+
+namespace gmp {
+
+class GMPStringListImpl : public GMPStringList
+{
+public:
+ explicit GMPStringListImpl(const nsTArray<nsCString>& aStrings);
+ uint32_t Size() const override;
+ void StringAt(uint32_t aIndex,
+ const char** aOutString, uint32_t *aOutLength) const override;
+ virtual ~GMPStringListImpl() override;
+ void RelinquishData(nsTArray<nsCString>& aStrings);
+
+private:
+ nsTArray<nsCString> mStrings;
+};
+
+class GMPEncryptedBufferDataImpl : public GMPEncryptedBufferMetadata {
+public:
+ explicit GMPEncryptedBufferDataImpl(const CryptoSample& aCrypto);
+ explicit GMPEncryptedBufferDataImpl(const GMPDecryptionData& aData);
+ virtual ~GMPEncryptedBufferDataImpl();
+
+ void RelinquishData(GMPDecryptionData& aData);
+
+ const uint8_t* KeyId() const override;
+ uint32_t KeyIdSize() const override;
+ const uint8_t* IV() const override;
+ uint32_t IVSize() const override;
+ uint32_t NumSubsamples() const override;
+ const uint16_t* ClearBytes() const override;
+ const uint32_t* CipherBytes() const override;
+ const GMPStringList* SessionIds() const override;
+
+private:
+ nsTArray<uint8_t> mKeyId;
+ nsTArray<uint8_t> mIV;
+ nsTArray<uint16_t> mClearBytes;
+ nsTArray<uint32_t> mCipherBytes;
+
+ GMPStringListImpl mSessionIdList;
+};
+
+class GMPBufferImpl : public GMPBuffer {
+public:
+ GMPBufferImpl(uint32_t aId, const nsTArray<uint8_t>& aData)
+ : mId(aId)
+ , mData(aData)
+ {
+ }
+ uint32_t Id() const override {
+ return mId;
+ }
+ uint8_t* Data() override {
+ return mData.Elements();
+ }
+ uint32_t Size() const override {
+ return mData.Length();
+ }
+ void Resize(uint32_t aSize) override {
+ mData.SetLength(aSize);
+ }
+
+ // Set metadata object to be freed when this buffer is destroyed.
+ void SetMetadata(GMPEncryptedBufferDataImpl* aMetadata) {
+ mMetadata = aMetadata;
+ }
+
+ uint32_t mId;
+ nsTArray<uint8_t> mData;
+ nsAutoPtr<GMPEncryptedBufferDataImpl> mMetadata;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPEncryptedBufferDataImpl_h_
diff --git a/dom/media/gmp/GMPLoader.cpp b/dom/media/gmp/GMPLoader.cpp
new file mode 100644
index 000000000..c10208a49
--- /dev/null
+++ b/dom/media/gmp/GMPLoader.cpp
@@ -0,0 +1,222 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPLoader.h"
+#include <stdio.h>
+#include "mozilla/Attributes.h"
+#include "gmp-entrypoints.h"
+#include "prlink.h"
+#include "prenv.h"
+
+#include <string>
+
+#ifdef XP_WIN
+#include "windows.h"
+#endif
+
+#include "GMPDeviceBinding.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPLoaderImpl : public GMPLoader {
+public:
+ explicit GMPLoaderImpl(SandboxStarter* aStarter)
+ : mSandboxStarter(aStarter)
+ , mAdapter(nullptr)
+ {}
+ virtual ~GMPLoaderImpl() {}
+
+ bool Load(const char* aUTF8LibPath,
+ uint32_t aUTF8LibPathLen,
+ char* aOriginSalt,
+ uint32_t aOriginSaltLen,
+ const GMPPlatformAPI* aPlatformAPI,
+ GMPAdapter* aAdapter) override;
+
+ GMPErr GetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId) override;
+
+ void Shutdown() override;
+
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+ void SetSandboxInfo(MacSandboxInfo* aSandboxInfo) override;
+#endif
+
+private:
+ SandboxStarter* mSandboxStarter;
+ UniquePtr<GMPAdapter> mAdapter;
+};
+
+UniquePtr<GMPLoader> CreateGMPLoader(SandboxStarter* aStarter) {
+ return MakeUnique<GMPLoaderImpl>(aStarter);
+}
+
+class PassThroughGMPAdapter : public GMPAdapter {
+public:
+ ~PassThroughGMPAdapter() {
+ // Ensure we're always shutdown, even if caller forgets to call GMPShutdown().
+ GMPShutdown();
+ }
+
+ void SetAdaptee(PRLibrary* aLib) override
+ {
+ mLib = aLib;
+ }
+
+ GMPErr GMPInit(const GMPPlatformAPI* aPlatformAPI) override
+ {
+ if (!mLib) {
+ return GMPGenericErr;
+ }
+ GMPInitFunc initFunc = reinterpret_cast<GMPInitFunc>(PR_FindFunctionSymbol(mLib, "GMPInit"));
+ if (!initFunc) {
+ return GMPNotImplementedErr;
+ }
+ return initFunc(aPlatformAPI);
+ }
+
+ GMPErr GMPGetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId) override
+ {
+ if (!mLib) {
+ return GMPGenericErr;
+ }
+ GMPGetAPIFunc getapiFunc = reinterpret_cast<GMPGetAPIFunc>(PR_FindFunctionSymbol(mLib, "GMPGetAPI"));
+ if (!getapiFunc) {
+ return GMPNotImplementedErr;
+ }
+ return getapiFunc(aAPIName, aHostAPI, aPluginAPI);
+ }
+
+ void GMPShutdown() override
+ {
+ if (mLib) {
+ GMPShutdownFunc shutdownFunc = reinterpret_cast<GMPShutdownFunc>(PR_FindFunctionSymbol(mLib, "GMPShutdown"));
+ if (shutdownFunc) {
+ shutdownFunc();
+ }
+ PR_UnloadLibrary(mLib);
+ mLib = nullptr;
+ }
+ }
+
+ void GMPSetNodeId(const char* aNodeId, uint32_t aLength) override
+ {
+ if (!mLib) {
+ return;
+ }
+ GMPSetNodeIdFunc setNodeIdFunc = reinterpret_cast<GMPSetNodeIdFunc>(PR_FindFunctionSymbol(mLib, "GMPSetNodeId"));
+ if (setNodeIdFunc) {
+ setNodeIdFunc(aNodeId, aLength);
+ }
+ }
+
+private:
+ PRLibrary* mLib = nullptr;
+};
+
+bool
+GMPLoaderImpl::Load(const char* aUTF8LibPath,
+ uint32_t aUTF8LibPathLen,
+ char* aOriginSalt,
+ uint32_t aOriginSaltLen,
+ const GMPPlatformAPI* aPlatformAPI,
+ GMPAdapter* aAdapter)
+{
+ std::string nodeId;
+ if (!CalculateGMPDeviceId(aOriginSalt, aOriginSaltLen, nodeId)) {
+ return false;
+ }
+
+ // Start the sandbox now that we've generated the device bound node id.
+ // This must happen after the node id is bound to the device id, as
+ // generating the device id requires privileges.
+ if (mSandboxStarter && !mSandboxStarter->Start(aUTF8LibPath)) {
+ return false;
+ }
+
+ // Load the GMP.
+ PRLibSpec libSpec;
+#ifdef XP_WIN
+ int pathLen = MultiByteToWideChar(CP_UTF8, 0, aUTF8LibPath, -1, nullptr, 0);
+ if (pathLen == 0) {
+ return false;
+ }
+
+ auto widePath = MakeUnique<wchar_t[]>(pathLen);
+ if (MultiByteToWideChar(CP_UTF8, 0, aUTF8LibPath, -1, widePath.get(), pathLen) == 0) {
+ return false;
+ }
+
+ libSpec.value.pathname_u = widePath.get();
+ libSpec.type = PR_LibSpec_PathnameU;
+#else
+ libSpec.value.pathname = aUTF8LibPath;
+ libSpec.type = PR_LibSpec_Pathname;
+#endif
+ PRLibrary* lib = PR_LoadLibraryWithFlags(libSpec, 0);
+ if (!lib) {
+ return false;
+ }
+
+ GMPInitFunc initFunc = reinterpret_cast<GMPInitFunc>(PR_FindFunctionSymbol(lib, "GMPInit"));
+ if ((initFunc && aAdapter) ||
+ (!initFunc && !aAdapter)) {
+ // Ensure that if we're dealing with a GMP we do *not* use an adapter
+ // provided from the outside world. This is important as it means we
+ // don't call code not covered by Adobe's plugin-container voucher
+ // before we pass the node Id to Adobe's GMP.
+ return false;
+ }
+
+ // Note: PassThroughGMPAdapter's code must remain in this file so that it's
+ // covered by Adobe's plugin-container voucher.
+ mAdapter.reset((!aAdapter) ? new PassThroughGMPAdapter() : aAdapter);
+ mAdapter->SetAdaptee(lib);
+
+ if (mAdapter->GMPInit(aPlatformAPI) != GMPNoErr) {
+ return false;
+ }
+
+ mAdapter->GMPSetNodeId(nodeId.c_str(), nodeId.size());
+
+ return true;
+}
+
+GMPErr
+GMPLoaderImpl::GetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId)
+{
+ return mAdapter->GMPGetAPI(aAPIName, aHostAPI, aPluginAPI, aDecryptorId);
+}
+
+void
+GMPLoaderImpl::Shutdown()
+{
+ if (mAdapter) {
+ mAdapter->GMPShutdown();
+ }
+}
+
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+void
+GMPLoaderImpl::SetSandboxInfo(MacSandboxInfo* aSandboxInfo)
+{
+ if (mSandboxStarter) {
+ mSandboxStarter->SetSandboxInfo(aSandboxInfo);
+ }
+}
+#endif
+} // namespace gmp
+} // namespace mozilla
+
diff --git a/dom/media/gmp/GMPLoader.h b/dom/media/gmp/GMPLoader.h
new file mode 100644
index 000000000..60581be2d
--- /dev/null
+++ b/dom/media/gmp/GMPLoader.h
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMP_LOADER_H__
+#define GMP_LOADER_H__
+
+#include <stdint.h>
+#include "prlink.h"
+#include "gmp-entrypoints.h"
+#include "mozilla/UniquePtr.h"
+
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+#include "mozilla/Sandbox.h"
+#endif
+
+namespace mozilla {
+namespace gmp {
+
+class SandboxStarter {
+public:
+ virtual ~SandboxStarter() {}
+ virtual bool Start(const char* aLibPath) = 0;
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+ // On OS X we need to set Mac-specific sandbox info just before we start the
+ // sandbox, which we don't yet know when the GMPLoader and SandboxStarter
+ // objects are created.
+ virtual void SetSandboxInfo(MacSandboxInfo* aSandboxInfo) = 0;
+#endif
+};
+
+// Interface that adapts a plugin to the GMP API.
+class GMPAdapter {
+public:
+ virtual ~GMPAdapter() {}
+ // Sets the adapted to plugin library module.
+ // Note: the GMPAdapter is responsible for calling PR_UnloadLibrary on aLib
+ // when it's finished with it.
+ virtual void SetAdaptee(PRLibrary* aLib) = 0;
+
+ // These are called in place of the corresponding GMP API functions.
+ virtual GMPErr GMPInit(const GMPPlatformAPI* aPlatformAPI) = 0;
+ virtual GMPErr GMPGetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId) = 0;
+ virtual void GMPShutdown() = 0;
+ virtual void GMPSetNodeId(const char* aNodeId, uint32_t aLength) = 0;
+};
+
+// Encapsulates generating the device-bound node id, activating the sandbox,
+// loading the GMP, and passing the node id to the GMP (in that order).
+//
+// In Desktop Gecko, the implementation of this lives in plugin-container,
+// and is passed into XUL code from on startup. The GMP IPC child protocol actor
+// uses this interface to load and retrieve interfaces from the GMPs.
+//
+// In Desktop Gecko the implementation lives in the plugin-container so that
+// it can be covered by DRM vendor's voucher.
+//
+// On Android the GMPLoader implementation lives in libxul (because for the time
+// being GMPLoader relies upon NSPR, which we can't use in plugin-container
+// on Android).
+//
+// There is exactly one GMPLoader per GMP child process, and only one GMP
+// per child process (so the GMPLoader only loads one GMP).
+//
+// Load() takes an optional GMPAdapter which can be used to adapt non-GMPs
+// to adhere to the GMP API.
+class GMPLoader {
+public:
+ virtual ~GMPLoader() {}
+
+ // Calculates the device-bound node id, then activates the sandbox,
+ // then loads the GMP library and (if applicable) passes the bound node id
+ // to the GMP. If aAdapter is non-null, the lib path is assumed to be
+ // a non-GMP, and the adapter is initialized with the lib and the adapter
+ // is used to interact with the plugin.
+ virtual bool Load(const char* aUTF8LibPath,
+ uint32_t aLibPathLen,
+ char* aOriginSalt,
+ uint32_t aOriginSaltLen,
+ const GMPPlatformAPI* aPlatformAPI,
+ GMPAdapter* aAdapter = nullptr) = 0;
+
+ // Retrieves an interface pointer from the GMP.
+ virtual GMPErr GetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId) = 0;
+
+ // Calls the GMPShutdown function exported by the GMP lib, and unloads the
+ // plugin library.
+ virtual void Shutdown() = 0;
+
+#if defined(XP_MACOSX) && defined(MOZ_GMP_SANDBOX)
+ // On OS X we need to set Mac-specific sandbox info just before we start the
+ // sandbox, which we don't yet know when the GMPLoader and SandboxStarter
+ // objects are created.
+ virtual void SetSandboxInfo(MacSandboxInfo* aSandboxInfo) = 0;
+#endif
+};
+
+// On Desktop, this function resides in plugin-container.
+// On Mobile, this function resides in XUL.
+UniquePtr<GMPLoader> CreateGMPLoader(SandboxStarter* aStarter);
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMP_LOADER_H__
diff --git a/dom/media/gmp/GMPMemoryStorage.cpp b/dom/media/gmp/GMPMemoryStorage.cpp
new file mode 100644
index 000000000..dc799caa1
--- /dev/null
+++ b/dom/media/gmp/GMPMemoryStorage.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPStorage.h"
+#include "nsClassHashtable.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPMemoryStorage : public GMPStorage {
+public:
+ GMPErr Open(const nsCString& aRecordName) override
+ {
+ MOZ_ASSERT(!IsOpen(aRecordName));
+
+ Record* record = nullptr;
+ if (!mRecords.Get(aRecordName, &record)) {
+ record = new Record();
+ mRecords.Put(aRecordName, record);
+ }
+ record->mIsOpen = true;
+ return GMPNoErr;
+ }
+
+ bool IsOpen(const nsCString& aRecordName) const override {
+ const Record* record = mRecords.Get(aRecordName);
+ if (!record) {
+ return false;
+ }
+ return record->mIsOpen;
+ }
+
+ GMPErr Read(const nsCString& aRecordName,
+ nsTArray<uint8_t>& aOutBytes) override
+ {
+ const Record* record = mRecords.Get(aRecordName);
+ if (!record) {
+ return GMPGenericErr;
+ }
+ aOutBytes = record->mData;
+ return GMPNoErr;
+ }
+
+ GMPErr Write(const nsCString& aRecordName,
+ const nsTArray<uint8_t>& aBytes) override
+ {
+ Record* record = nullptr;
+ if (!mRecords.Get(aRecordName, &record)) {
+ return GMPClosedErr;
+ }
+ record->mData = aBytes;
+ return GMPNoErr;
+ }
+
+ GMPErr GetRecordNames(nsTArray<nsCString>& aOutRecordNames) const override
+ {
+ for (auto iter = mRecords.ConstIter(); !iter.Done(); iter.Next()) {
+ aOutRecordNames.AppendElement(iter.Key());
+ }
+ return GMPNoErr;
+ }
+
+ void Close(const nsCString& aRecordName) override
+ {
+ Record* record = nullptr;
+ if (!mRecords.Get(aRecordName, &record)) {
+ return;
+ }
+ if (!record->mData.Length()) {
+ // Record is empty, delete.
+ mRecords.Remove(aRecordName);
+ } else {
+ record->mIsOpen = false;
+ }
+ }
+
+private:
+
+ struct Record {
+ nsTArray<uint8_t> mData;
+ bool mIsOpen = false;
+ };
+
+ nsClassHashtable<nsCStringHashKey, Record> mRecords;
+};
+
+already_AddRefed<GMPStorage> CreateGMPMemoryStorage()
+{
+ return RefPtr<GMPStorage>(new GMPMemoryStorage()).forget();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPMessageUtils.h b/dom/media/gmp/GMPMessageUtils.h
new file mode 100644
index 000000000..13f6127f3
--- /dev/null
+++ b/dom/media/gmp/GMPMessageUtils.h
@@ -0,0 +1,253 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPMessageUtils_h_
+#define GMPMessageUtils_h_
+
+#include "gmp-video-codec.h"
+#include "gmp-video-frame-encoded.h"
+#include "gmp-audio-codec.h"
+#include "gmp-decryption.h"
+
+namespace IPC {
+
+template <>
+struct ParamTraits<GMPErr>
+: public ContiguousEnumSerializer<GMPErr,
+ GMPNoErr,
+ GMPLastErr>
+{};
+
+struct GMPDomExceptionValidator {
+ static bool IsLegalValue(GMPDOMException aValue) {
+ switch (aValue) {
+ case kGMPNoModificationAllowedError:
+ case kGMPNotFoundError:
+ case kGMPNotSupportedError:
+ case kGMPInvalidStateError:
+ case kGMPSyntaxError:
+ case kGMPInvalidModificationError:
+ case kGMPInvalidAccessError:
+ case kGMPSecurityError:
+ case kGMPAbortError:
+ case kGMPQuotaExceededError:
+ case kGMPTimeoutError:
+ case kGMPTypeError:
+ return true;
+ default:
+ return false;
+ }
+ }
+};
+
+template <>
+struct ParamTraits<GMPVideoFrameType>
+: public ContiguousEnumSerializer<GMPVideoFrameType,
+ kGMPKeyFrame,
+ kGMPVideoFrameInvalid>
+{};
+
+template<>
+struct ParamTraits<GMPDOMException>
+: public EnumSerializer<GMPDOMException, GMPDomExceptionValidator>
+{};
+
+template <>
+struct ParamTraits<GMPSessionMessageType>
+: public ContiguousEnumSerializer<GMPSessionMessageType,
+ kGMPLicenseRequest,
+ kGMPMessageInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPMediaKeyStatus>
+: public ContiguousEnumSerializer<GMPMediaKeyStatus,
+ kGMPUsable,
+ kGMPMediaKeyStatusInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPSessionType>
+: public ContiguousEnumSerializer<GMPSessionType,
+ kGMPTemporySession,
+ kGMPSessionInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPAudioCodecType>
+: public ContiguousEnumSerializer<GMPAudioCodecType,
+ kGMPAudioCodecAAC,
+ kGMPAudioCodecInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPVideoCodecComplexity>
+: public ContiguousEnumSerializer<GMPVideoCodecComplexity,
+ kGMPComplexityNormal,
+ kGMPComplexityInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPVP8ResilienceMode>
+: public ContiguousEnumSerializer<GMPVP8ResilienceMode,
+ kResilienceOff,
+ kResilienceInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPVideoCodecType>
+: public ContiguousEnumSerializer<GMPVideoCodecType,
+ kGMPVideoCodecVP8,
+ kGMPVideoCodecInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPVideoCodecMode>
+: public ContiguousEnumSerializer<GMPVideoCodecMode,
+ kGMPRealtimeVideo,
+ kGMPCodecModeInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPBufferType>
+: public ContiguousEnumSerializer<GMPBufferType,
+ GMP_BufferSingle,
+ GMP_BufferInvalid>
+{};
+
+template <>
+struct ParamTraits<GMPSimulcastStream>
+{
+ typedef GMPSimulcastStream paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mWidth);
+ WriteParam(aMsg, aParam.mHeight);
+ WriteParam(aMsg, aParam.mNumberOfTemporalLayers);
+ WriteParam(aMsg, aParam.mMaxBitrate);
+ WriteParam(aMsg, aParam.mTargetBitrate);
+ WriteParam(aMsg, aParam.mMinBitrate);
+ WriteParam(aMsg, aParam.mQPMax);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (ReadParam(aMsg, aIter, &(aResult->mWidth)) &&
+ ReadParam(aMsg, aIter, &(aResult->mHeight)) &&
+ ReadParam(aMsg, aIter, &(aResult->mNumberOfTemporalLayers)) &&
+ ReadParam(aMsg, aIter, &(aResult->mMaxBitrate)) &&
+ ReadParam(aMsg, aIter, &(aResult->mTargetBitrate)) &&
+ ReadParam(aMsg, aIter, &(aResult->mMinBitrate)) &&
+ ReadParam(aMsg, aIter, &(aResult->mQPMax))) {
+ return true;
+ }
+ return false;
+ }
+
+ static void Log(const paramType& aParam, std::wstring* aLog)
+ {
+ aLog->append(StringPrintf(L"[%u, %u, %u, %u, %u, %u, %u]", aParam.mWidth, aParam.mHeight,
+ aParam.mNumberOfTemporalLayers, aParam.mMaxBitrate,
+ aParam.mTargetBitrate, aParam.mMinBitrate, aParam.mQPMax));
+ }
+};
+
+template <>
+struct ParamTraits<GMPVideoCodec>
+{
+ typedef GMPVideoCodec paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mGMPApiVersion);
+ WriteParam(aMsg, aParam.mCodecType);
+ WriteParam(aMsg, static_cast<const nsCString&>(nsDependentCString(aParam.mPLName)));
+ WriteParam(aMsg, aParam.mPLType);
+ WriteParam(aMsg, aParam.mWidth);
+ WriteParam(aMsg, aParam.mHeight);
+ WriteParam(aMsg, aParam.mStartBitrate);
+ WriteParam(aMsg, aParam.mMaxBitrate);
+ WriteParam(aMsg, aParam.mMinBitrate);
+ WriteParam(aMsg, aParam.mMaxFramerate);
+ WriteParam(aMsg, aParam.mFrameDroppingOn);
+ WriteParam(aMsg, aParam.mKeyFrameInterval);
+ WriteParam(aMsg, aParam.mQPMax);
+ WriteParam(aMsg, aParam.mNumberOfSimulcastStreams);
+ for (uint32_t i = 0; i < aParam.mNumberOfSimulcastStreams; i++) {
+ WriteParam(aMsg, aParam.mSimulcastStream[i]);
+ }
+ WriteParam(aMsg, aParam.mMode);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ // NOTE: make sure this matches any versions supported
+ if (!ReadParam(aMsg, aIter, &(aResult->mGMPApiVersion)) ||
+ aResult->mGMPApiVersion != kGMPVersion33) {
+ return false;
+ }
+ if (!ReadParam(aMsg, aIter, &(aResult->mCodecType))) {
+ return false;
+ }
+
+ nsAutoCString plName;
+ if (!ReadParam(aMsg, aIter, &plName) ||
+ plName.Length() > kGMPPayloadNameSize - 1) {
+ return false;
+ }
+ memcpy(aResult->mPLName, plName.get(), plName.Length());
+ memset(aResult->mPLName + plName.Length(), 0, kGMPPayloadNameSize - plName.Length());
+
+ if (!ReadParam(aMsg, aIter, &(aResult->mPLType)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mWidth)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mHeight)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mStartBitrate)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMaxBitrate)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMinBitrate)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMaxFramerate)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFrameDroppingOn)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mKeyFrameInterval))) {
+ return false;
+ }
+
+ if (!ReadParam(aMsg, aIter, &(aResult->mQPMax)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mNumberOfSimulcastStreams))) {
+ return false;
+ }
+
+ if (aResult->mNumberOfSimulcastStreams > kGMPMaxSimulcastStreams) {
+ return false;
+ }
+
+ for (uint32_t i = 0; i < aResult->mNumberOfSimulcastStreams; i++) {
+ if (!ReadParam(aMsg, aIter, &(aResult->mSimulcastStream[i]))) {
+ return false;
+ }
+ }
+
+ if (!ReadParam(aMsg, aIter, &(aResult->mMode))) {
+ return false;
+ }
+
+ return true;
+ }
+
+ static void Log(const paramType& aParam, std::wstring* aLog)
+ {
+ const char* codecName = nullptr;
+ if (aParam.mCodecType == kGMPVideoCodecVP8) {
+ codecName = "VP8";
+ }
+ aLog->append(StringPrintf(L"[%s, %u, %u]",
+ codecName,
+ aParam.mWidth,
+ aParam.mHeight));
+ }
+};
+
+} // namespace IPC
+
+#endif // GMPMessageUtils_h_
diff --git a/dom/media/gmp/GMPParent.cpp b/dom/media/gmp/GMPParent.cpp
new file mode 100644
index 000000000..75468ea9a
--- /dev/null
+++ b/dom/media/gmp/GMPParent.cpp
@@ -0,0 +1,1167 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPParent.h"
+#include "mozilla/Logging.h"
+#include "nsComponentManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsThreadUtils.h"
+#include "nsIRunnable.h"
+#include "nsIWritablePropertyBag2.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "mozilla/ipc/GeckoChildProcessHost.h"
+#include "mozilla/SSE.h"
+#include "mozilla/SyncRunnable.h"
+#include "mozilla/Unused.h"
+#include "nsIObserverService.h"
+#include "GMPTimerParent.h"
+#include "runnable_utils.h"
+#if defined(XP_LINUX) && defined(MOZ_GMP_SANDBOX)
+#include "mozilla/SandboxInfo.h"
+#endif
+#include "GMPContentParent.h"
+#include "MediaPrefs.h"
+#include "VideoUtils.h"
+
+#include "mozilla/dom/CrashReporterParent.h"
+using mozilla::dom::CrashReporterParent;
+using mozilla::ipc::GeckoChildProcessHost;
+
+#ifdef MOZ_CRASHREPORTER
+#include "nsPrintfCString.h"
+using CrashReporter::AnnotationTable;
+using CrashReporter::GetIDFromMinidump;
+#endif
+
+#include "mozilla/Telemetry.h"
+
+#ifdef XP_WIN
+#include "WMFDecoderModule.h"
+#endif
+
+#include "mozilla/dom/WidevineCDMManifestBinding.h"
+#include "widevine-adapter/WidevineAdapter.h"
+
+namespace mozilla {
+
+#undef LOG
+#undef LOGD
+
+extern LogModule* GetGMPLog();
+#define LOG(level, x, ...) MOZ_LOG(GetGMPLog(), (level), (x, ##__VA_ARGS__))
+#define LOGD(x, ...) LOG(mozilla::LogLevel::Debug, "GMPParent[%p|childPid=%d] " x, this, mChildPid, ##__VA_ARGS__)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPParent"
+
+namespace gmp {
+
+GMPParent::GMPParent()
+ : mState(GMPStateNotLoaded)
+ , mProcess(nullptr)
+ , mDeleteProcessOnlyOnUnload(false)
+ , mAbnormalShutdownInProgress(false)
+ , mIsBlockingDeletion(false)
+ , mCanDecrypt(false)
+ , mGMPContentChildCount(0)
+ , mAsyncShutdownRequired(false)
+ , mAsyncShutdownInProgress(false)
+ , mChildPid(0)
+ , mHoldingSelfRef(false)
+{
+ mPluginId = GeckoChildProcessHost::GetUniqueID();
+ LOGD("GMPParent ctor id=%u", mPluginId);
+}
+
+GMPParent::~GMPParent()
+{
+ LOGD("GMPParent dtor id=%u", mPluginId);
+ MOZ_ASSERT(!mProcess);
+}
+
+nsresult
+GMPParent::CloneFrom(const GMPParent* aOther)
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+ MOZ_ASSERT(aOther->mDirectory && aOther->mService, "null plugin directory");
+
+ mService = aOther->mService;
+ mDirectory = aOther->mDirectory;
+ mName = aOther->mName;
+ mVersion = aOther->mVersion;
+ mDescription = aOther->mDescription;
+ mDisplayName = aOther->mDisplayName;
+#ifdef XP_WIN
+ mLibs = aOther->mLibs;
+#endif
+ for (const GMPCapability& cap : aOther->mCapabilities) {
+ mCapabilities.AppendElement(cap);
+ }
+ mAdapter = aOther->mAdapter;
+ return NS_OK;
+}
+
+RefPtr<GenericPromise>
+GMPParent::Init(GeckoMediaPluginServiceParent* aService, nsIFile* aPluginDir)
+{
+ MOZ_ASSERT(aPluginDir);
+ MOZ_ASSERT(aService);
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ mService = aService;
+ mDirectory = aPluginDir;
+
+ // aPluginDir is <profile-dir>/<gmp-plugin-id>/<version>
+ // where <gmp-plugin-id> should be gmp-gmpopenh264
+ nsCOMPtr<nsIFile> parent;
+ nsresult rv = aPluginDir->GetParent(getter_AddRefs(parent));
+ if (NS_FAILED(rv)) {
+ return GenericPromise::CreateAndReject(rv, __func__);
+ }
+ nsAutoString parentLeafName;
+ rv = parent->GetLeafName(parentLeafName);
+ if (NS_FAILED(rv)) {
+ return GenericPromise::CreateAndReject(rv, __func__);
+ }
+ LOGD("%s: for %s", __FUNCTION__, NS_LossyConvertUTF16toASCII(parentLeafName).get());
+
+ MOZ_ASSERT(parentLeafName.Length() > 4);
+ mName = Substring(parentLeafName, 4);
+
+ return ReadGMPMetaData();
+}
+
+void
+GMPParent::Crash()
+{
+ if (mState != GMPStateNotLoaded) {
+ Unused << SendCrashPluginNow();
+ }
+}
+
+nsresult
+GMPParent::LoadProcess()
+{
+ MOZ_ASSERT(mDirectory, "Plugin directory cannot be NULL!");
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+ MOZ_ASSERT(mState == GMPStateNotLoaded);
+
+ nsAutoString path;
+ if (NS_FAILED(mDirectory->GetPath(path))) {
+ return NS_ERROR_FAILURE;
+ }
+ LOGD("%s: for %s", __FUNCTION__, NS_ConvertUTF16toUTF8(path).get());
+
+ if (!mProcess) {
+ mProcess = new GMPProcessParent(NS_ConvertUTF16toUTF8(path).get());
+ if (!mProcess->Launch(30 * 1000)) {
+ LOGD("%s: Failed to launch new child process", __FUNCTION__);
+ mProcess->Delete();
+ mProcess = nullptr;
+ return NS_ERROR_FAILURE;
+ }
+
+ mChildPid = base::GetProcId(mProcess->GetChildProcessHandle());
+ LOGD("%s: Launched new child process", __FUNCTION__);
+
+ bool opened = Open(mProcess->GetChannel(),
+ base::GetProcId(mProcess->GetChildProcessHandle()));
+ if (!opened) {
+ LOGD("%s: Failed to open channel to new child process", __FUNCTION__);
+ mProcess->Delete();
+ mProcess = nullptr;
+ return NS_ERROR_FAILURE;
+ }
+ LOGD("%s: Opened channel to new child process", __FUNCTION__);
+
+ bool ok = SendSetNodeId(mNodeId);
+ if (!ok) {
+ LOGD("%s: Failed to send node id to child process", __FUNCTION__);
+ return NS_ERROR_FAILURE;
+ }
+ LOGD("%s: Sent node id to child process", __FUNCTION__);
+
+#ifdef XP_WIN
+ if (!mLibs.IsEmpty()) {
+ bool ok = SendPreloadLibs(mLibs);
+ if (!ok) {
+ LOGD("%s: Failed to send preload-libs to child process", __FUNCTION__);
+ return NS_ERROR_FAILURE;
+ }
+ LOGD("%s: Sent preload-libs ('%s') to child process", __FUNCTION__, mLibs.get());
+ }
+#endif
+
+ // Intr call to block initialization on plugin load.
+ ok = CallStartPlugin(mAdapter);
+ if (!ok) {
+ LOGD("%s: Failed to send start to child process", __FUNCTION__);
+ return NS_ERROR_FAILURE;
+ }
+ LOGD("%s: Sent StartPlugin to child process", __FUNCTION__);
+ }
+
+ mState = GMPStateLoaded;
+
+ // Hold a self ref while the child process is alive. This ensures that
+ // during shutdown the GMPParent stays alive long enough to
+ // terminate the child process.
+ MOZ_ASSERT(!mHoldingSelfRef);
+ mHoldingSelfRef = true;
+ AddRef();
+
+ return NS_OK;
+}
+
+// static
+void
+GMPParent::AbortWaitingForGMPAsyncShutdown(nsITimer* aTimer, void* aClosure)
+{
+ NS_WARNING("Timed out waiting for GMP async shutdown!");
+ GMPParent* parent = reinterpret_cast<GMPParent*>(aClosure);
+ MOZ_ASSERT(parent->mService);
+#if defined(MOZ_CRASHREPORTER)
+ parent->mService->SetAsyncShutdownPluginState(parent, 'G',
+ NS_LITERAL_CSTRING("Timed out waiting for async shutdown"));
+#endif
+ parent->mService->AsyncShutdownComplete(parent);
+}
+
+nsresult
+GMPParent::EnsureAsyncShutdownTimeoutSet()
+{
+ MOZ_ASSERT(mAsyncShutdownRequired);
+ if (mAsyncShutdownTimeout) {
+ return NS_OK;
+ }
+
+ nsresult rv;
+ mAsyncShutdownTimeout = do_CreateInstance(NS_TIMER_CONTRACTID, &rv);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ // Set timer to abort waiting for plugin to shutdown if it takes
+ // too long.
+ rv = mAsyncShutdownTimeout->SetTarget(mGMPThread);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ int32_t timeout = MediaPrefs::GMPAsyncShutdownTimeout();
+ RefPtr<GeckoMediaPluginServiceParent> service =
+ GeckoMediaPluginServiceParent::GetSingleton();
+ if (service) {
+ timeout = service->AsyncShutdownTimeoutMs();
+ }
+ rv = mAsyncShutdownTimeout->InitWithFuncCallback(
+ &AbortWaitingForGMPAsyncShutdown, this, timeout,
+ nsITimer::TYPE_ONE_SHOT);
+ Unused << NS_WARN_IF(NS_FAILED(rv));
+ return rv;
+}
+
+bool
+GMPParent::RecvPGMPContentChildDestroyed()
+{
+ --mGMPContentChildCount;
+ if (!IsUsed()) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'E',
+ NS_LITERAL_CSTRING("Last content child destroyed"));
+ }
+#endif
+ CloseIfUnused();
+ }
+#if defined(MOZ_CRASHREPORTER)
+ else {
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'F',
+ nsPrintfCString("Content child destroyed, remaining: %u", mGMPContentChildCount));
+ }
+ }
+#endif
+ return true;
+}
+
+void
+GMPParent::CloseIfUnused()
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+ LOGD("%s: mAsyncShutdownRequired=%d", __FUNCTION__, mAsyncShutdownRequired);
+
+ if ((mDeleteProcessOnlyOnUnload ||
+ mState == GMPStateLoaded ||
+ mState == GMPStateUnloading) &&
+ !IsUsed()) {
+ // Ensure all timers are killed.
+ for (uint32_t i = mTimers.Length(); i > 0; i--) {
+ mTimers[i - 1]->Shutdown();
+ }
+
+ if (mAsyncShutdownRequired) {
+ if (!mAsyncShutdownInProgress) {
+ LOGD("%s: sending async shutdown notification", __FUNCTION__);
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'H',
+ NS_LITERAL_CSTRING("Sent BeginAsyncShutdown"));
+ }
+#endif
+ mAsyncShutdownInProgress = true;
+ if (!SendBeginAsyncShutdown()) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'I',
+ NS_LITERAL_CSTRING("Could not send BeginAsyncShutdown - Aborting async shutdown"));
+ }
+#endif
+ AbortAsyncShutdown();
+ } else if (NS_FAILED(EnsureAsyncShutdownTimeoutSet())) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'J',
+ NS_LITERAL_CSTRING("Could not start timer after sending BeginAsyncShutdown - Aborting async shutdown"));
+ }
+#endif
+ AbortAsyncShutdown();
+ }
+ }
+ } else {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'K',
+ NS_LITERAL_CSTRING("No (more) async-shutdown required"));
+ }
+#endif
+ // No async-shutdown, kill async-shutdown timer started in CloseActive().
+ AbortAsyncShutdown();
+ // Any async shutdown must be complete. Shutdown GMPStorage.
+ for (size_t i = mStorage.Length(); i > 0; i--) {
+ mStorage[i - 1]->Shutdown();
+ }
+ Shutdown();
+ }
+ }
+}
+
+void
+GMPParent::AbortAsyncShutdown()
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+ LOGD("%s", __FUNCTION__);
+
+ if (mAsyncShutdownTimeout) {
+ mAsyncShutdownTimeout->Cancel();
+ mAsyncShutdownTimeout = nullptr;
+ }
+
+ if (!mAsyncShutdownRequired || !mAsyncShutdownInProgress) {
+ return;
+ }
+
+ RefPtr<GMPParent> kungFuDeathGrip(this);
+ mService->AsyncShutdownComplete(this);
+ mAsyncShutdownRequired = false;
+ mAsyncShutdownInProgress = false;
+ CloseIfUnused();
+}
+
+void
+GMPParent::CloseActive(bool aDieWhenUnloaded)
+{
+ LOGD("%s: state %d", __FUNCTION__, mState);
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ if (aDieWhenUnloaded) {
+ mDeleteProcessOnlyOnUnload = true; // don't allow this to go back...
+ }
+ if (mState == GMPStateLoaded) {
+ mState = GMPStateUnloading;
+ }
+ if (mState != GMPStateNotLoaded && IsUsed()) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'A',
+ nsPrintfCString("Sent CloseActive, content children to close: %u", mGMPContentChildCount));
+ }
+#endif
+ if (!SendCloseActive()) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'B',
+ NS_LITERAL_CSTRING("Could not send CloseActive - Aborting async shutdown"));
+ }
+#endif
+ AbortAsyncShutdown();
+ } else if (IsUsed()) {
+ // We're expecting RecvPGMPContentChildDestroyed's -> Start async-shutdown timer now if needed.
+ if (mAsyncShutdownRequired && NS_FAILED(EnsureAsyncShutdownTimeoutSet())) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'C',
+ NS_LITERAL_CSTRING("Could not start timer after sending CloseActive - Aborting async shutdown"));
+ }
+#endif
+ AbortAsyncShutdown();
+ }
+ } else {
+ // We're not expecting any RecvPGMPContentChildDestroyed
+ // -> Call CloseIfUnused() now, to run async shutdown if necessary.
+ // Note that CloseIfUnused() may have already been called from a prior
+ // RecvPGMPContentChildDestroyed(), however depending on the state at
+ // that time, it might not have proceeded with shutdown; And calling it
+ // again after shutdown is fine because after the first one we'll be in
+ // GMPStateNotLoaded.
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'D',
+ NS_LITERAL_CSTRING("Content children already destroyed"));
+ }
+#endif
+ CloseIfUnused();
+ }
+ }
+}
+
+void
+GMPParent::MarkForDeletion()
+{
+ mDeleteProcessOnlyOnUnload = true;
+ mIsBlockingDeletion = true;
+}
+
+bool
+GMPParent::IsMarkedForDeletion()
+{
+ return mIsBlockingDeletion;
+}
+
+void
+GMPParent::Shutdown()
+{
+ LOGD("%s", __FUNCTION__);
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ MOZ_ASSERT(!mAsyncShutdownTimeout, "Should have canceled shutdown timeout");
+
+ if (mAbnormalShutdownInProgress) {
+ return;
+ }
+
+ MOZ_ASSERT(!IsUsed());
+ if (mState == GMPStateNotLoaded || mState == GMPStateClosing) {
+ return;
+ }
+
+ RefPtr<GMPParent> self(this);
+ DeleteProcess();
+
+ // XXX Get rid of mDeleteProcessOnlyOnUnload and this code when
+ // Bug 1043671 is fixed
+ if (!mDeleteProcessOnlyOnUnload) {
+ // Destroy ourselves and rise from the fire to save memory
+ mService->ReAddOnGMPThread(self);
+ } // else we've been asked to die and stay dead
+ MOZ_ASSERT(mState == GMPStateNotLoaded);
+}
+
+class NotifyGMPShutdownTask : public Runnable {
+public:
+ explicit NotifyGMPShutdownTask(const nsAString& aNodeId)
+ : mNodeId(aNodeId)
+ {
+ }
+ NS_IMETHOD Run() override {
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ MOZ_ASSERT(obsService);
+ if (obsService) {
+ obsService->NotifyObservers(nullptr, "gmp-shutdown", mNodeId.get());
+ }
+ return NS_OK;
+ }
+ nsString mNodeId;
+};
+
+void
+GMPParent::ChildTerminated()
+{
+ RefPtr<GMPParent> self(this);
+ nsIThread* gmpThread = GMPThread();
+
+ if (!gmpThread) {
+ // Bug 1163239 - this can happen on shutdown.
+ // PluginTerminated removes the GMP from the GMPService.
+ // On shutdown we can have this case where it is already been
+ // removed so there is no harm in not trying to remove it again.
+ LOGD("%s::%s: GMPThread() returned nullptr.", __CLASS__, __FUNCTION__);
+ } else {
+ gmpThread->Dispatch(NewRunnableMethod<RefPtr<GMPParent>>(
+ mService,
+ &GeckoMediaPluginServiceParent::PluginTerminated,
+ self),
+ NS_DISPATCH_NORMAL);
+ }
+}
+
+void
+GMPParent::DeleteProcess()
+{
+ LOGD("%s", __FUNCTION__);
+
+ if (mState != GMPStateClosing) {
+ // Don't Close() twice!
+ // Probably remove when bug 1043671 is resolved
+ mState = GMPStateClosing;
+ Close();
+ }
+ mProcess->Delete(NewRunnableMethod(this, &GMPParent::ChildTerminated));
+ LOGD("%s: Shut down process", __FUNCTION__);
+ mProcess = nullptr;
+ mState = GMPStateNotLoaded;
+
+ NS_DispatchToMainThread(
+ new NotifyGMPShutdownTask(NS_ConvertUTF8toUTF16(mNodeId)),
+ NS_DISPATCH_NORMAL);
+
+ if (mHoldingSelfRef) {
+ Release();
+ mHoldingSelfRef = false;
+ }
+}
+
+GMPState
+GMPParent::State() const
+{
+ return mState;
+}
+
+// Not changing to use mService since we'll be removing it
+nsIThread*
+GMPParent::GMPThread()
+{
+ if (!mGMPThread) {
+ nsCOMPtr<mozIGeckoMediaPluginService> mps = do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ MOZ_ASSERT(mps);
+ if (!mps) {
+ return nullptr;
+ }
+ // Not really safe if we just grab to the mGMPThread, as we don't know
+ // what thread we're running on and other threads may be trying to
+ // access this without locks! However, debug only, and primary failure
+ // mode outside of compiler-helped TSAN is a leak. But better would be
+ // to use swap() under a lock.
+ mps->GetThread(getter_AddRefs(mGMPThread));
+ MOZ_ASSERT(mGMPThread);
+ }
+
+ return mGMPThread;
+}
+
+/* static */
+bool
+GMPCapability::Supports(const nsTArray<GMPCapability>& aCapabilities,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags)
+{
+ for (const nsCString& tag : aTags) {
+ if (!GMPCapability::Supports(aCapabilities, aAPI, tag)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/* static */
+bool
+GMPCapability::Supports(const nsTArray<GMPCapability>& aCapabilities,
+ const nsCString& aAPI,
+ const nsCString& aTag)
+{
+ for (const GMPCapability& capabilities : aCapabilities) {
+ if (!capabilities.mAPIName.Equals(aAPI)) {
+ continue;
+ }
+ for (const nsCString& tag : capabilities.mAPITags) {
+ if (tag.Equals(aTag)) {
+#ifdef XP_WIN
+ // Clearkey on Windows advertises that it can decode in its GMP info
+ // file, but uses Windows Media Foundation to decode. That's not present
+ // on Windows XP, and on some Vista, Windows N, and KN variants without
+ // certain services packs.
+ if (tag.Equals(kEMEKeySystemClearkey)) {
+ if (capabilities.mAPIName.EqualsLiteral(GMP_API_VIDEO_DECODER)) {
+ if (!WMFDecoderModule::HasH264()) {
+ continue;
+ }
+ } else if (capabilities.mAPIName.EqualsLiteral(GMP_API_AUDIO_DECODER)) {
+ if (!WMFDecoderModule::HasAAC()) {
+ continue;
+ }
+ }
+ }
+#endif
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool
+GMPParent::EnsureProcessLoaded()
+{
+ if (mState == GMPStateLoaded) {
+ return true;
+ }
+ if (mState == GMPStateClosing ||
+ mState == GMPStateUnloading) {
+ return false;
+ }
+
+ nsresult rv = LoadProcess();
+
+ return NS_SUCCEEDED(rv);
+}
+
+#ifdef MOZ_CRASHREPORTER
+void
+GMPParent::WriteExtraDataForMinidump(CrashReporter::AnnotationTable& notes)
+{
+ notes.Put(NS_LITERAL_CSTRING("GMPPlugin"), NS_LITERAL_CSTRING("1"));
+ notes.Put(NS_LITERAL_CSTRING("PluginFilename"),
+ NS_ConvertUTF16toUTF8(mName));
+ notes.Put(NS_LITERAL_CSTRING("PluginName"), mDisplayName);
+ notes.Put(NS_LITERAL_CSTRING("PluginVersion"), mVersion);
+}
+
+void
+GMPParent::GetCrashID(nsString& aResult)
+{
+ CrashReporterParent* cr =
+ static_cast<CrashReporterParent*>(LoneManagedOrNullAsserts(ManagedPCrashReporterParent()));
+ if (NS_WARN_IF(!cr)) {
+ return;
+ }
+
+ AnnotationTable notes(4);
+ WriteExtraDataForMinidump(notes);
+ nsCOMPtr<nsIFile> dumpFile;
+ TakeMinidump(getter_AddRefs(dumpFile), nullptr);
+ if (!dumpFile) {
+ NS_WARNING("GMP crash without crash report");
+ aResult = mName;
+ aResult += '-';
+ AppendUTF8toUTF16(mVersion, aResult);
+ return;
+ }
+ GetIDFromMinidump(dumpFile, aResult);
+ cr->GenerateCrashReportForMinidump(dumpFile, &notes);
+}
+
+static void
+GMPNotifyObservers(const uint32_t aPluginID, const nsACString& aPluginName, const nsAString& aPluginDumpID)
+{
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ nsCOMPtr<nsIWritablePropertyBag2> propbag =
+ do_CreateInstance("@mozilla.org/hash-property-bag;1");
+ if (obs && propbag) {
+ propbag->SetPropertyAsUint32(NS_LITERAL_STRING("pluginID"), aPluginID);
+ propbag->SetPropertyAsACString(NS_LITERAL_STRING("pluginName"), aPluginName);
+ propbag->SetPropertyAsAString(NS_LITERAL_STRING("pluginDumpID"), aPluginDumpID);
+ obs->NotifyObservers(propbag, "gmp-plugin-crash", nullptr);
+ }
+
+ RefPtr<gmp::GeckoMediaPluginService> service =
+ gmp::GeckoMediaPluginService::GetGeckoMediaPluginService();
+ if (service) {
+ service->RunPluginCrashCallbacks(aPluginID, aPluginName);
+ }
+}
+#endif
+void
+GMPParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD("%s: (%d)", __FUNCTION__, (int)aWhy);
+#ifdef MOZ_CRASHREPORTER
+ if (AbnormalShutdown == aWhy) {
+ Telemetry::Accumulate(Telemetry::SUBPROCESS_ABNORMAL_ABORT,
+ NS_LITERAL_CSTRING("gmplugin"), 1);
+ nsString dumpID;
+ GetCrashID(dumpID);
+
+ // NotifyObservers is mainthread-only
+ NS_DispatchToMainThread(WrapRunnableNM(&GMPNotifyObservers,
+ mPluginId, mDisplayName, dumpID),
+ NS_DISPATCH_NORMAL);
+ }
+#endif
+ // warn us off trying to close again
+ mState = GMPStateClosing;
+ mAbnormalShutdownInProgress = true;
+ CloseActive(false);
+
+ // Normal Shutdown() will delete the process on unwind.
+ if (AbnormalShutdown == aWhy) {
+ RefPtr<GMPParent> self(this);
+ if (mAsyncShutdownRequired) {
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'M',
+ NS_LITERAL_CSTRING("Actor destroyed"));
+ }
+#endif
+ mService->AsyncShutdownComplete(this);
+ mAsyncShutdownRequired = false;
+ }
+ // Must not call Close() again in DeleteProcess(), as we'll recurse
+ // infinitely if we do.
+ MOZ_ASSERT(mState == GMPStateClosing);
+ DeleteProcess();
+ // Note: final destruction will be Dispatched to ourself
+ mService->ReAddOnGMPThread(self);
+ }
+}
+
+mozilla::dom::PCrashReporterParent*
+GMPParent::AllocPCrashReporterParent(const NativeThreadId& aThread)
+{
+#ifndef MOZ_CRASHREPORTER
+ MOZ_ASSERT(false, "Should only be sent if crash reporting is enabled.");
+#endif
+ CrashReporterParent* cr = new CrashReporterParent();
+ cr->SetChildData(aThread, GeckoProcessType_GMPlugin);
+ return cr;
+}
+
+bool
+GMPParent::DeallocPCrashReporterParent(PCrashReporterParent* aCrashReporter)
+{
+ delete aCrashReporter;
+ return true;
+}
+
+PGMPStorageParent*
+GMPParent::AllocPGMPStorageParent()
+{
+ GMPStorageParent* p = new GMPStorageParent(mNodeId, this);
+ mStorage.AppendElement(p); // Addrefs, released in DeallocPGMPStorageParent.
+ return p;
+}
+
+bool
+GMPParent::DeallocPGMPStorageParent(PGMPStorageParent* aActor)
+{
+ GMPStorageParent* p = static_cast<GMPStorageParent*>(aActor);
+ p->Shutdown();
+ mStorage.RemoveElement(p);
+ return true;
+}
+
+bool
+GMPParent::RecvPGMPStorageConstructor(PGMPStorageParent* aActor)
+{
+ GMPStorageParent* p = (GMPStorageParent*)aActor;
+ if (NS_WARN_IF(NS_FAILED(p->Init()))) {
+ return false;
+ }
+ return true;
+}
+
+bool
+GMPParent::RecvPGMPTimerConstructor(PGMPTimerParent* actor)
+{
+ return true;
+}
+
+PGMPTimerParent*
+GMPParent::AllocPGMPTimerParent()
+{
+ GMPTimerParent* p = new GMPTimerParent(GMPThread());
+ mTimers.AppendElement(p); // Released in DeallocPGMPTimerParent, or on shutdown.
+ return p;
+}
+
+bool
+GMPParent::DeallocPGMPTimerParent(PGMPTimerParent* aActor)
+{
+ GMPTimerParent* p = static_cast<GMPTimerParent*>(aActor);
+ p->Shutdown();
+ mTimers.RemoveElement(p);
+ return true;
+}
+
+bool
+ReadInfoField(GMPInfoFileParser& aParser, const nsCString& aKey, nsACString& aOutValue)
+{
+ if (!aParser.Contains(aKey) || aParser.Get(aKey).IsEmpty()) {
+ return false;
+ }
+ aOutValue = aParser.Get(aKey);
+ return true;
+}
+
+RefPtr<GenericPromise>
+GMPParent::ReadGMPMetaData()
+{
+ MOZ_ASSERT(mDirectory, "Plugin directory cannot be NULL!");
+ MOZ_ASSERT(!mName.IsEmpty(), "Plugin mName cannot be empty!");
+
+ nsCOMPtr<nsIFile> infoFile;
+ nsresult rv = mDirectory->Clone(getter_AddRefs(infoFile));
+ if (NS_FAILED(rv)) {
+ return GenericPromise::CreateAndReject(rv, __func__);
+ }
+ infoFile->AppendRelativePath(mName + NS_LITERAL_STRING(".info"));
+
+ if (FileExists(infoFile)) {
+ return ReadGMPInfoFile(infoFile);
+ }
+
+ // Maybe this is the Widevine adapted plugin?
+ nsCOMPtr<nsIFile> manifestFile;
+ rv = mDirectory->Clone(getter_AddRefs(manifestFile));
+ if (NS_FAILED(rv)) {
+ return GenericPromise::CreateAndReject(rv, __func__);
+ }
+ manifestFile->AppendRelativePath(NS_LITERAL_STRING("manifest.json"));
+ return ReadChromiumManifestFile(manifestFile);
+}
+
+RefPtr<GenericPromise>
+GMPParent::ReadGMPInfoFile(nsIFile* aFile)
+{
+ GMPInfoFileParser parser;
+ if (!parser.Init(aFile)) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ nsAutoCString apis;
+ if (!ReadInfoField(parser, NS_LITERAL_CSTRING("name"), mDisplayName) ||
+ !ReadInfoField(parser, NS_LITERAL_CSTRING("description"), mDescription) ||
+ !ReadInfoField(parser, NS_LITERAL_CSTRING("version"), mVersion) ||
+ !ReadInfoField(parser, NS_LITERAL_CSTRING("apis"), apis)) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+#ifdef XP_WIN
+ // "Libraries" field is optional.
+ ReadInfoField(parser, NS_LITERAL_CSTRING("libraries"), mLibs);
+#endif
+
+ nsTArray<nsCString> apiTokens;
+ SplitAt(", ", apis, apiTokens);
+ for (nsCString api : apiTokens) {
+ int32_t tagsStart = api.FindChar('[');
+ if (tagsStart == 0) {
+ // Not allowed to be the first character.
+ // API name must be at least one character.
+ continue;
+ }
+
+ GMPCapability cap;
+ if (tagsStart == -1) {
+ // No tags.
+ cap.mAPIName.Assign(api);
+ } else {
+ auto tagsEnd = api.FindChar(']');
+ if (tagsEnd == -1 || tagsEnd < tagsStart) {
+ // Invalid syntax, skip whole capability.
+ continue;
+ }
+
+ cap.mAPIName.Assign(Substring(api, 0, tagsStart));
+
+ if ((tagsEnd - tagsStart) > 1) {
+ const nsDependentCSubstring ts(Substring(api, tagsStart + 1, tagsEnd - tagsStart - 1));
+ nsTArray<nsCString> tagTokens;
+ SplitAt(":", ts, tagTokens);
+ for (nsCString tag : tagTokens) {
+ cap.mAPITags.AppendElement(tag);
+ }
+ }
+ }
+
+ // We support the current GMPDecryptor version, and the previous.
+ // We Adapt the previous to the current in the GMPContentChild.
+ if (cap.mAPIName.EqualsLiteral(GMP_API_DECRYPTOR_BACKWARDS_COMPAT)) {
+ cap.mAPIName.AssignLiteral(GMP_API_DECRYPTOR);
+ }
+
+ if (cap.mAPIName.EqualsLiteral(GMP_API_DECRYPTOR)) {
+ mCanDecrypt = true;
+
+#if defined(XP_LINUX) && defined(MOZ_GMP_SANDBOX)
+ if (!mozilla::SandboxInfo::Get().CanSandboxMedia()) {
+ printf_stderr("GMPParent::ReadGMPMetaData: Plugin \"%s\" is an EME CDM"
+ " but this system can't sandbox it; not loading.\n",
+ mDisplayName.get());
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+#endif
+#ifdef XP_WIN
+ // Adobe GMP doesn't work without SSE2. Check the tags to see if
+ // the decryptor is for the Adobe GMP, and refuse to load it if
+ // SSE2 isn't supported.
+ if (cap.mAPITags.Contains(kEMEKeySystemPrimetime) &&
+ !mozilla::supports_sse2()) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+#endif // XP_WIN
+ }
+
+ mCapabilities.AppendElement(Move(cap));
+ }
+
+ if (mCapabilities.IsEmpty()) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ return GenericPromise::CreateAndResolve(true, __func__);
+}
+
+RefPtr<GenericPromise>
+GMPParent::ReadChromiumManifestFile(nsIFile* aFile)
+{
+ nsAutoCString json;
+ if (!ReadIntoString(aFile, json, 5 * 1024)) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ // DOM JSON parsing needs to run on the main thread.
+ return InvokeAsync(AbstractThread::MainThread(), this, __func__,
+ &GMPParent::ParseChromiumManifest, NS_ConvertUTF8toUTF16(json));
+}
+
+RefPtr<GenericPromise>
+GMPParent::ParseChromiumManifest(nsString aJSON)
+{
+ LOGD("%s: for '%s'", __FUNCTION__, NS_LossyConvertUTF16toASCII(aJSON).get());
+
+ MOZ_ASSERT(NS_IsMainThread());
+ mozilla::dom::WidevineCDMManifest m;
+ if (!m.Init(aJSON)) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ nsresult ignored; // Note: ToInteger returns 0 on failure.
+ if (!WidevineAdapter::Supports(m.mX_cdm_module_versions.ToInteger(&ignored),
+ m.mX_cdm_interface_versions.ToInteger(&ignored),
+ m.mX_cdm_host_versions.ToInteger(&ignored))) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ mDisplayName = NS_ConvertUTF16toUTF8(m.mName);
+ mDescription = NS_ConvertUTF16toUTF8(m.mDescription);
+ mVersion = NS_ConvertUTF16toUTF8(m.mVersion);
+
+ GMPCapability video(NS_LITERAL_CSTRING(GMP_API_VIDEO_DECODER));
+ video.mAPITags.AppendElement(NS_LITERAL_CSTRING("h264"));
+ video.mAPITags.AppendElement(NS_LITERAL_CSTRING("vp8"));
+ video.mAPITags.AppendElement(NS_LITERAL_CSTRING("vp9"));
+ video.mAPITags.AppendElement(kEMEKeySystemWidevine);
+ mCapabilities.AppendElement(Move(video));
+
+ GMPCapability decrypt(NS_LITERAL_CSTRING(GMP_API_DECRYPTOR));
+ decrypt.mAPITags.AppendElement(kEMEKeySystemWidevine);
+ mCapabilities.AppendElement(Move(decrypt));
+
+ MOZ_ASSERT(mName.EqualsLiteral("widevinecdm"));
+ mAdapter = NS_LITERAL_STRING("widevine");
+#ifdef XP_WIN
+ mLibs = NS_LITERAL_CSTRING("dxva2.dll");
+#endif
+
+ return GenericPromise::CreateAndResolve(true, __func__);
+}
+
+bool
+GMPParent::CanBeSharedCrossNodeIds() const
+{
+ return !mAsyncShutdownInProgress &&
+ mNodeId.IsEmpty() &&
+ // XXX bug 1159300 hack -- maybe remove after openh264 1.4
+ // We don't want to use CDM decoders for non-encrypted playback
+ // just yet; especially not for WebRTC. Don't allow CDMs to be used
+ // without a node ID.
+ !mCanDecrypt;
+}
+
+bool
+GMPParent::CanBeUsedFrom(const nsACString& aNodeId) const
+{
+ return !mAsyncShutdownInProgress && mNodeId == aNodeId;
+}
+
+void
+GMPParent::SetNodeId(const nsACString& aNodeId)
+{
+ MOZ_ASSERT(!aNodeId.IsEmpty());
+ mNodeId = aNodeId;
+}
+
+const nsCString&
+GMPParent::GetDisplayName() const
+{
+ return mDisplayName;
+}
+
+const nsCString&
+GMPParent::GetVersion() const
+{
+ return mVersion;
+}
+
+uint32_t
+GMPParent::GetPluginId() const
+{
+ return mPluginId;
+}
+
+bool
+GMPParent::RecvAsyncShutdownRequired()
+{
+ LOGD("%s", __FUNCTION__);
+ if (mAsyncShutdownRequired) {
+ NS_WARNING("Received AsyncShutdownRequired message more than once!");
+ return true;
+ }
+ mAsyncShutdownRequired = true;
+ mService->AsyncShutdownNeeded(this);
+ return true;
+}
+
+bool
+GMPParent::RecvAsyncShutdownComplete()
+{
+ LOGD("%s", __FUNCTION__);
+
+ MOZ_ASSERT(mAsyncShutdownRequired);
+#if defined(MOZ_CRASHREPORTER)
+ if (mService) {
+ mService->SetAsyncShutdownPluginState(this, 'L',
+ NS_LITERAL_CSTRING("Received AsyncShutdownComplete"));
+ }
+#endif
+ AbortAsyncShutdown();
+ return true;
+}
+
+class RunCreateContentParentCallbacks : public Runnable
+{
+public:
+ explicit RunCreateContentParentCallbacks(GMPContentParent* aGMPContentParent)
+ : mGMPContentParent(aGMPContentParent)
+ {
+ }
+
+ void TakeCallbacks(nsTArray<UniquePtr<GetGMPContentParentCallback>>& aCallbacks)
+ {
+ mCallbacks.SwapElements(aCallbacks);
+ }
+
+ NS_IMETHOD
+ Run() override
+ {
+ for (uint32_t i = 0, length = mCallbacks.Length(); i < length; ++i) {
+ mCallbacks[i]->Done(mGMPContentParent);
+ }
+ return NS_OK;
+ }
+
+private:
+ RefPtr<GMPContentParent> mGMPContentParent;
+ nsTArray<UniquePtr<GetGMPContentParentCallback>> mCallbacks;
+};
+
+PGMPContentParent*
+GMPParent::AllocPGMPContentParent(Transport* aTransport, ProcessId aOtherPid)
+{
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+ MOZ_ASSERT(!mGMPContentParent);
+
+ mGMPContentParent = new GMPContentParent(this);
+ mGMPContentParent->Open(aTransport, aOtherPid, XRE_GetIOMessageLoop(),
+ ipc::ParentSide);
+
+ RefPtr<RunCreateContentParentCallbacks> runCallbacks =
+ new RunCreateContentParentCallbacks(mGMPContentParent);
+ runCallbacks->TakeCallbacks(mCallbacks);
+ NS_DispatchToCurrentThread(runCallbacks);
+ MOZ_ASSERT(mCallbacks.IsEmpty());
+
+ return mGMPContentParent;
+}
+
+bool
+GMPParent::GetGMPContentParent(UniquePtr<GetGMPContentParentCallback>&& aCallback)
+{
+ LOGD("%s %p", __FUNCTION__, this);
+ MOZ_ASSERT(GMPThread() == NS_GetCurrentThread());
+
+ if (mGMPContentParent) {
+ aCallback->Done(mGMPContentParent);
+ } else {
+ mCallbacks.AppendElement(Move(aCallback));
+ // If we don't have a GMPContentParent and we try to get one for the first
+ // time (mCallbacks.Length() == 1) then call PGMPContent::Open. If more
+ // calls to GetGMPContentParent happen before mGMPContentParent has been
+ // set then we should just store them, so that they get called when we set
+ // mGMPContentParent as a result of the PGMPContent::Open call.
+ if (mCallbacks.Length() == 1) {
+ if (!EnsureProcessLoaded() || !PGMPContent::Open(this)) {
+ return false;
+ }
+ // We want to increment this as soon as possible, to avoid that we'd try
+ // to shut down the GMP process while we're still trying to get a
+ // PGMPContentParent actor.
+ ++mGMPContentChildCount;
+ }
+ }
+ return true;
+}
+
+already_AddRefed<GMPContentParent>
+GMPParent::ForgetGMPContentParent()
+{
+ MOZ_ASSERT(mCallbacks.IsEmpty());
+ return Move(mGMPContentParent.forget());
+}
+
+bool
+GMPParent::EnsureProcessLoaded(base::ProcessId* aID)
+{
+ if (!EnsureProcessLoaded()) {
+ return false;
+ }
+ *aID = OtherPid();
+ return true;
+}
+
+bool
+GMPParent::Bridge(GMPServiceParent* aGMPServiceParent)
+{
+ if (NS_FAILED(PGMPContent::Bridge(aGMPServiceParent, this))) {
+ return false;
+ }
+ ++mGMPContentChildCount;
+ return true;
+}
+
+nsString
+GMPParent::GetPluginBaseName() const
+{
+ return NS_LITERAL_STRING("gmp-") + mName;
+}
+
+} // namespace gmp
+} // namespace mozilla
+
+#undef LOG
+#undef LOGD
diff --git a/dom/media/gmp/GMPParent.h b/dom/media/gmp/GMPParent.h
new file mode 100644
index 000000000..91a6fb429
--- /dev/null
+++ b/dom/media/gmp/GMPParent.h
@@ -0,0 +1,260 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPParent_h_
+#define GMPParent_h_
+
+#include "GMPProcessParent.h"
+#include "GMPServiceParent.h"
+#include "GMPAudioDecoderParent.h"
+#include "GMPDecryptorParent.h"
+#include "GMPVideoDecoderParent.h"
+#include "GMPVideoEncoderParent.h"
+#include "GMPTimerParent.h"
+#include "GMPStorageParent.h"
+#include "mozilla/gmp/PGMPParent.h"
+#include "nsCOMPtr.h"
+#include "nscore.h"
+#include "nsISupports.h"
+#include "nsString.h"
+#include "nsTArray.h"
+#include "nsIFile.h"
+#include "mozilla/MozPromise.h"
+
+class nsIThread;
+
+#ifdef MOZ_CRASHREPORTER
+#include "nsExceptionHandler.h"
+
+namespace mozilla {
+namespace dom {
+class PCrashReporterParent;
+class CrashReporterParent;
+}
+}
+#endif
+
+namespace mozilla {
+namespace gmp {
+
+class GMPCapability
+{
+public:
+ explicit GMPCapability() {}
+ GMPCapability(GMPCapability&& aOther)
+ : mAPIName(Move(aOther.mAPIName))
+ , mAPITags(Move(aOther.mAPITags))
+ {
+ }
+ explicit GMPCapability(const nsCString& aAPIName)
+ : mAPIName(aAPIName)
+ {}
+ explicit GMPCapability(const GMPCapability& aOther) = default;
+ nsCString mAPIName;
+ nsTArray<nsCString> mAPITags;
+
+ static bool Supports(const nsTArray<GMPCapability>& aCapabilities,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags);
+
+ static bool Supports(const nsTArray<GMPCapability>& aCapabilities,
+ const nsCString& aAPI,
+ const nsCString& aTag);
+};
+
+enum GMPState {
+ GMPStateNotLoaded,
+ GMPStateLoaded,
+ GMPStateUnloading,
+ GMPStateClosing
+};
+
+class GMPContentParent;
+
+class GetGMPContentParentCallback
+{
+public:
+ GetGMPContentParentCallback()
+ {
+ MOZ_COUNT_CTOR(GetGMPContentParentCallback);
+ };
+ virtual ~GetGMPContentParentCallback()
+ {
+ MOZ_COUNT_DTOR(GetGMPContentParentCallback);
+ };
+ virtual void Done(GMPContentParent* aGMPContentParent) = 0;
+};
+
+class GMPParent final : public PGMPParent
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPParent)
+
+ GMPParent();
+
+ RefPtr<GenericPromise> Init(GeckoMediaPluginServiceParent* aService, nsIFile* aPluginDir);
+ nsresult CloneFrom(const GMPParent* aOther);
+
+ void Crash();
+
+ nsresult LoadProcess();
+
+ // Called internally to close this if we don't need it
+ void CloseIfUnused();
+
+ // Notify all active de/encoders that we are closing, either because of
+ // normal shutdown or unexpected shutdown/crash.
+ void CloseActive(bool aDieWhenUnloaded);
+
+ // Tell the plugin to die after shutdown.
+ void MarkForDeletion();
+ bool IsMarkedForDeletion();
+
+ // Called by the GMPService to forcibly close active de/encoders at shutdown
+ void Shutdown();
+
+ // This must not be called while we're in the middle of abnormal ActorDestroy
+ void DeleteProcess();
+
+ GMPState State() const;
+ nsIThread* GMPThread();
+
+ // A GMP can either be a single instance shared across all NodeIds (like
+ // in the OpenH264 case), or we can require a new plugin instance for every
+ // NodeIds running the plugin (as in the EME plugin case).
+ //
+ // A NodeId is a hash of the ($urlBarOrigin, $ownerDocOrigin) pair.
+ //
+ // Plugins are associated with an NodeIds by calling SetNodeId() before
+ // loading.
+ //
+ // If a plugin has no NodeId specified and it is loaded, it is assumed to
+ // be shared across NodeIds.
+
+ // Specifies that a GMP can only work with the specified NodeIds.
+ void SetNodeId(const nsACString& aNodeId);
+ const nsACString& GetNodeId() const { return mNodeId; }
+
+ const nsCString& GetDisplayName() const;
+ const nsCString& GetVersion() const;
+ uint32_t GetPluginId() const;
+ nsString GetPluginBaseName() const;
+
+ // Returns true if a plugin can be or is being used across multiple NodeIds.
+ bool CanBeSharedCrossNodeIds() const;
+
+ // A GMP can be used from a NodeId if it's already been set to work with
+ // that NodeId, or if it's not been set to work with any NodeId and has
+ // not yet been loaded (i.e. it's not shared across NodeIds).
+ bool CanBeUsedFrom(const nsACString& aNodeId) const;
+
+ already_AddRefed<nsIFile> GetDirectory() {
+ return nsCOMPtr<nsIFile>(mDirectory).forget();
+ }
+
+ void AbortAsyncShutdown();
+
+ // Called when the child process has died.
+ void ChildTerminated();
+
+ bool GetGMPContentParent(UniquePtr<GetGMPContentParentCallback>&& aCallback);
+ already_AddRefed<GMPContentParent> ForgetGMPContentParent();
+
+ bool EnsureProcessLoaded(base::ProcessId* aID);
+
+ bool Bridge(GMPServiceParent* aGMPServiceParent);
+
+ const nsTArray<GMPCapability>& GetCapabilities() const { return mCapabilities; }
+
+private:
+ ~GMPParent();
+
+ RefPtr<GeckoMediaPluginServiceParent> mService;
+ bool EnsureProcessLoaded();
+ RefPtr<GenericPromise> ReadGMPMetaData();
+ RefPtr<GenericPromise> ReadGMPInfoFile(nsIFile* aFile);
+ RefPtr<GenericPromise> ParseChromiumManifest(nsString aJSON); // Main thread.
+ RefPtr<GenericPromise> ReadChromiumManifestFile(nsIFile* aFile); // GMP thread.
+#ifdef MOZ_CRASHREPORTER
+ void WriteExtraDataForMinidump(CrashReporter::AnnotationTable& notes);
+ void GetCrashID(nsString& aResult);
+#endif
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ PCrashReporterParent* AllocPCrashReporterParent(const NativeThreadId& aThread) override;
+ bool DeallocPCrashReporterParent(PCrashReporterParent* aCrashReporter) override;
+
+ bool RecvPGMPStorageConstructor(PGMPStorageParent* actor) override;
+ PGMPStorageParent* AllocPGMPStorageParent() override;
+ bool DeallocPGMPStorageParent(PGMPStorageParent* aActor) override;
+
+ PGMPContentParent* AllocPGMPContentParent(Transport* aTransport,
+ ProcessId aOtherPid) override;
+
+ bool RecvPGMPTimerConstructor(PGMPTimerParent* actor) override;
+ PGMPTimerParent* AllocPGMPTimerParent() override;
+ bool DeallocPGMPTimerParent(PGMPTimerParent* aActor) override;
+
+ bool RecvAsyncShutdownComplete() override;
+ bool RecvAsyncShutdownRequired() override;
+
+ bool RecvPGMPContentChildDestroyed() override;
+ bool IsUsed()
+ {
+ return mGMPContentChildCount > 0;
+ }
+
+
+ static void AbortWaitingForGMPAsyncShutdown(nsITimer* aTimer, void* aClosure);
+ nsresult EnsureAsyncShutdownTimeoutSet();
+
+ GMPState mState;
+ nsCOMPtr<nsIFile> mDirectory; // plugin directory on disk
+ nsString mName; // base name of plugin on disk, UTF-16 because used for paths
+ nsCString mDisplayName; // name of plugin displayed to users
+ nsCString mDescription; // description of plugin for display to users
+ nsCString mVersion;
+#ifdef XP_WIN
+ nsCString mLibs;
+#endif
+ nsString mAdapter;
+ uint32_t mPluginId;
+ nsTArray<GMPCapability> mCapabilities;
+ GMPProcessParent* mProcess;
+ bool mDeleteProcessOnlyOnUnload;
+ bool mAbnormalShutdownInProgress;
+ bool mIsBlockingDeletion;
+
+ bool mCanDecrypt;
+
+ nsTArray<RefPtr<GMPTimerParent>> mTimers;
+ nsTArray<RefPtr<GMPStorageParent>> mStorage;
+ nsCOMPtr<nsIThread> mGMPThread;
+ nsCOMPtr<nsITimer> mAsyncShutdownTimeout; // GMP Thread only.
+ // NodeId the plugin is assigned to, or empty if the the plugin is not
+ // assigned to a NodeId.
+ nsCString mNodeId;
+ // This is used for GMP content in the parent, there may be more of these in
+ // the content processes.
+ RefPtr<GMPContentParent> mGMPContentParent;
+ nsTArray<UniquePtr<GetGMPContentParentCallback>> mCallbacks;
+ uint32_t mGMPContentChildCount;
+
+ bool mAsyncShutdownRequired;
+ bool mAsyncShutdownInProgress;
+
+ int mChildPid;
+
+ // We hold a self reference to ourself while the child process is alive.
+ // This ensures that if the GMPService tries to shut us down and drops
+ // its reference to us, we stay alive long enough for the child process
+ // to terminate gracefully.
+ bool mHoldingSelfRef;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPParent_h_
diff --git a/dom/media/gmp/GMPPlatform.cpp b/dom/media/gmp/GMPPlatform.cpp
new file mode 100644
index 000000000..71fa03468
--- /dev/null
+++ b/dom/media/gmp/GMPPlatform.cpp
@@ -0,0 +1,300 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPPlatform.h"
+#include "GMPStorageChild.h"
+#include "GMPTimerChild.h"
+#include "mozilla/Monitor.h"
+#include "GMPChild.h"
+#include <ctime>
+
+namespace mozilla {
+namespace gmp {
+
+static MessageLoop* sMainLoop = nullptr;
+static GMPChild* sChild = nullptr;
+
+static bool
+IsOnChildMainThread()
+{
+ return sMainLoop && sMainLoop == MessageLoop::current();
+}
+
+// We just need a refcounted wrapper for GMPTask objects.
+class GMPRunnable final
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPRunnable)
+
+ explicit GMPRunnable(GMPTask* aTask)
+ : mTask(aTask)
+ {
+ MOZ_ASSERT(mTask);
+ }
+
+ void Run()
+ {
+ mTask->Run();
+ mTask->Destroy();
+ mTask = nullptr;
+ }
+
+private:
+ ~GMPRunnable()
+ {
+ }
+
+ GMPTask* mTask;
+};
+
+class GMPSyncRunnable final
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPSyncRunnable)
+
+ GMPSyncRunnable(GMPTask* aTask, MessageLoop* aMessageLoop)
+ : mDone(false)
+ , mTask(aTask)
+ , mMessageLoop(aMessageLoop)
+ , mMonitor("GMPSyncRunnable")
+ {
+ MOZ_ASSERT(mTask);
+ MOZ_ASSERT(mMessageLoop);
+ }
+
+ void Post()
+ {
+ // We assert here for two reasons.
+ // 1) Nobody should be blocking the main thread.
+ // 2) This prevents deadlocks when doing sync calls to main which if the
+ // main thread tries to do a sync call back to the calling thread.
+ MOZ_ASSERT(!IsOnChildMainThread());
+
+ mMessageLoop->PostTask(NewRunnableMethod(this, &GMPSyncRunnable::Run));
+ MonitorAutoLock lock(mMonitor);
+ while (!mDone) {
+ lock.Wait();
+ }
+ }
+
+ void Run()
+ {
+ mTask->Run();
+ mTask->Destroy();
+ mTask = nullptr;
+ MonitorAutoLock lock(mMonitor);
+ mDone = true;
+ lock.Notify();
+ }
+
+private:
+ ~GMPSyncRunnable()
+ {
+ }
+
+ bool mDone;
+ GMPTask* mTask;
+ MessageLoop* mMessageLoop;
+ Monitor mMonitor;
+};
+
+GMPErr
+CreateThread(GMPThread** aThread)
+{
+ if (!aThread) {
+ return GMPGenericErr;
+ }
+
+ *aThread = new GMPThreadImpl();
+
+ return GMPNoErr;
+}
+
+GMPErr
+RunOnMainThread(GMPTask* aTask)
+{
+ if (!aTask || !sMainLoop) {
+ return GMPGenericErr;
+ }
+
+ RefPtr<GMPRunnable> r = new GMPRunnable(aTask);
+ sMainLoop->PostTask(NewRunnableMethod(r, &GMPRunnable::Run));
+
+ return GMPNoErr;
+}
+
+GMPErr
+SyncRunOnMainThread(GMPTask* aTask)
+{
+ if (!aTask || !sMainLoop || IsOnChildMainThread()) {
+ return GMPGenericErr;
+ }
+
+ RefPtr<GMPSyncRunnable> r = new GMPSyncRunnable(aTask, sMainLoop);
+
+ r->Post();
+
+ return GMPNoErr;
+}
+
+GMPErr
+CreateMutex(GMPMutex** aMutex)
+{
+ if (!aMutex) {
+ return GMPGenericErr;
+ }
+
+ *aMutex = new GMPMutexImpl();
+
+ return GMPNoErr;
+}
+
+GMPErr
+CreateRecord(const char* aRecordName,
+ uint32_t aRecordNameSize,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient)
+{
+ if (aRecordNameSize > GMP_MAX_RECORD_NAME_SIZE ||
+ aRecordNameSize == 0) {
+ NS_WARNING("GMP tried to CreateRecord with too long or 0 record name");
+ return GMPGenericErr;
+ }
+ GMPStorageChild* storage = sChild->GetGMPStorage();
+ if (!storage) {
+ return GMPGenericErr;
+ }
+ MOZ_ASSERT(storage);
+ return storage->CreateRecord(nsDependentCString(aRecordName, aRecordNameSize),
+ aOutRecord,
+ aClient);
+}
+
+GMPErr
+SetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS)
+{
+ if (!aTask || !sMainLoop || !IsOnChildMainThread()) {
+ return GMPGenericErr;
+ }
+ GMPTimerChild* timers = sChild->GetGMPTimers();
+ NS_ENSURE_TRUE(timers, GMPGenericErr);
+ return timers->SetTimer(aTask, aTimeoutMS);
+}
+
+GMPErr
+GetClock(GMPTimestamp* aOutTime)
+{
+ *aOutTime = time(0) * 1000;
+ return GMPNoErr;
+}
+
+GMPErr
+CreateRecordIterator(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg)
+{
+ if (!aRecvIteratorFunc) {
+ return GMPInvalidArgErr;
+ }
+ GMPStorageChild* storage = sChild->GetGMPStorage();
+ if (!storage) {
+ return GMPGenericErr;
+ }
+ MOZ_ASSERT(storage);
+ return storage->EnumerateRecords(aRecvIteratorFunc, aUserArg);
+}
+
+void
+InitPlatformAPI(GMPPlatformAPI& aPlatformAPI, GMPChild* aChild)
+{
+ if (!sMainLoop) {
+ sMainLoop = MessageLoop::current();
+ }
+ if (!sChild) {
+ sChild = aChild;
+ }
+
+ aPlatformAPI.version = 0;
+ aPlatformAPI.createthread = &CreateThread;
+ aPlatformAPI.runonmainthread = &RunOnMainThread;
+ aPlatformAPI.syncrunonmainthread = &SyncRunOnMainThread;
+ aPlatformAPI.createmutex = &CreateMutex;
+ aPlatformAPI.createrecord = &CreateRecord;
+ aPlatformAPI.settimer = &SetTimerOnMainThread;
+ aPlatformAPI.getcurrenttime = &GetClock;
+ aPlatformAPI.getrecordenumerator = &CreateRecordIterator;
+}
+
+GMPThreadImpl::GMPThreadImpl()
+: mMutex("GMPThreadImpl"),
+ mThread("GMPThread")
+{
+ MOZ_COUNT_CTOR(GMPThread);
+}
+
+GMPThreadImpl::~GMPThreadImpl()
+{
+ MOZ_COUNT_DTOR(GMPThread);
+}
+
+void
+GMPThreadImpl::Post(GMPTask* aTask)
+{
+ MutexAutoLock lock(mMutex);
+
+ if (!mThread.IsRunning()) {
+ bool started = mThread.Start();
+ if (!started) {
+ NS_WARNING("Unable to start GMPThread!");
+ return;
+ }
+ }
+
+ RefPtr<GMPRunnable> r = new GMPRunnable(aTask);
+ mThread.message_loop()->PostTask(NewRunnableMethod(r.get(), &GMPRunnable::Run));
+}
+
+void
+GMPThreadImpl::Join()
+{
+ {
+ MutexAutoLock lock(mMutex);
+ if (mThread.IsRunning()) {
+ mThread.Stop();
+ }
+ }
+ delete this;
+}
+
+GMPMutexImpl::GMPMutexImpl()
+: mMonitor("gmp-mutex")
+{
+ MOZ_COUNT_CTOR(GMPMutexImpl);
+}
+
+GMPMutexImpl::~GMPMutexImpl()
+{
+ MOZ_COUNT_DTOR(GMPMutexImpl);
+}
+
+void
+GMPMutexImpl::Destroy()
+{
+ delete this;
+}
+
+void
+GMPMutexImpl::Acquire()
+{
+ mMonitor.Enter();
+}
+
+void
+GMPMutexImpl::Release()
+{
+ mMonitor.Exit();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPPlatform.h b/dom/media/gmp/GMPPlatform.h
new file mode 100644
index 000000000..79079c327
--- /dev/null
+++ b/dom/media/gmp/GMPPlatform.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPPlatform_h_
+#define GMPPlatform_h_
+
+#include "mozilla/Mutex.h"
+#include "gmp-platform.h"
+#include "base/thread.h"
+#include "mozilla/ReentrantMonitor.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPChild;
+
+void InitPlatformAPI(GMPPlatformAPI& aPlatformAPI, GMPChild* aChild);
+
+GMPErr RunOnMainThread(GMPTask* aTask);
+
+class GMPThreadImpl : public GMPThread
+{
+public:
+ GMPThreadImpl();
+ virtual ~GMPThreadImpl();
+
+ // GMPThread
+ void Post(GMPTask* aTask) override;
+ void Join() override;
+
+private:
+ Mutex mMutex;
+ base::Thread mThread;
+};
+
+class GMPMutexImpl : public GMPMutex
+{
+public:
+ GMPMutexImpl();
+ virtual ~GMPMutexImpl();
+
+ // GMPMutex
+ void Acquire() override;
+ void Release() override;
+ void Destroy() override;
+
+private:
+ ReentrantMonitor mMonitor;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPPlatform_h_
diff --git a/dom/media/gmp/GMPProcessChild.cpp b/dom/media/gmp/GMPProcessChild.cpp
new file mode 100644
index 000000000..294cabb42
--- /dev/null
+++ b/dom/media/gmp/GMPProcessChild.cpp
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPProcessChild.h"
+
+#include "base/command_line.h"
+#include "base/string_util.h"
+#include "mozilla/ipc/IOThreadChild.h"
+#include "mozilla/BackgroundHangMonitor.h"
+
+using mozilla::ipc::IOThreadChild;
+
+namespace mozilla {
+namespace gmp {
+
+GMPProcessChild::GMPProcessChild(ProcessId aParentPid)
+: ProcessChild(aParentPid)
+{
+}
+
+GMPProcessChild::~GMPProcessChild()
+{
+}
+
+bool
+GMPProcessChild::Init()
+{
+ nsAutoString pluginFilename;
+ nsAutoString voucherFilename;
+
+#if defined(OS_POSIX)
+ // NB: need to be very careful in ensuring that the first arg
+ // (after the binary name) here is indeed the plugin module path.
+ // Keep in sync with dom/plugins/PluginModuleParent.
+ std::vector<std::string> values = CommandLine::ForCurrentProcess()->argv();
+ MOZ_ASSERT(values.size() >= 3, "not enough args");
+ pluginFilename = NS_ConvertUTF8toUTF16(nsDependentCString(values[1].c_str()));
+ voucherFilename = NS_ConvertUTF8toUTF16(nsDependentCString(values[2].c_str()));
+#elif defined(OS_WIN)
+ std::vector<std::wstring> values = CommandLine::ForCurrentProcess()->GetLooseValues();
+ MOZ_ASSERT(values.size() >= 2, "not enough loose args");
+ pluginFilename = nsDependentString(values[0].c_str());
+ voucherFilename = nsDependentString(values[1].c_str());
+#else
+#error Not implemented
+#endif
+
+ BackgroundHangMonitor::Startup();
+
+ return mPlugin.Init(pluginFilename,
+ voucherFilename,
+ ParentPid(),
+ IOThreadChild::message_loop(),
+ IOThreadChild::channel());
+}
+
+void
+GMPProcessChild::CleanUp()
+{
+ BackgroundHangMonitor::Shutdown();
+}
+
+GMPLoader* GMPProcessChild::mLoader = nullptr;
+
+/* static */
+void
+GMPProcessChild::SetGMPLoader(GMPLoader* aLoader)
+{
+ mLoader = aLoader;
+}
+
+/* static */
+GMPLoader*
+GMPProcessChild::GetGMPLoader()
+{
+ return mLoader;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPProcessChild.h b/dom/media/gmp/GMPProcessChild.h
new file mode 100644
index 000000000..1a8df7653
--- /dev/null
+++ b/dom/media/gmp/GMPProcessChild.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPProcessChild_h_
+#define GMPProcessChild_h_
+
+#include "mozilla/ipc/ProcessChild.h"
+#include "GMPChild.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPLoader;
+
+class GMPProcessChild final : public mozilla::ipc::ProcessChild {
+protected:
+ typedef mozilla::ipc::ProcessChild ProcessChild;
+
+public:
+ explicit GMPProcessChild(ProcessId aParentPid);
+ ~GMPProcessChild();
+
+ bool Init() override;
+ void CleanUp() override;
+
+ // Set/get the GMPLoader singleton for this child process.
+ // Note: The GMPLoader is not deleted by this object, the caller of
+ // SetGMPLoader() must manage the GMPLoader's lifecycle.
+ static void SetGMPLoader(GMPLoader* aHost);
+ static GMPLoader* GetGMPLoader();
+
+private:
+ GMPChild mPlugin;
+ static GMPLoader* mLoader;
+ DISALLOW_COPY_AND_ASSIGN(GMPProcessChild);
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPProcessChild_h_
diff --git a/dom/media/gmp/GMPProcessParent.cpp b/dom/media/gmp/GMPProcessParent.cpp
new file mode 100644
index 000000000..2fe7306a4
--- /dev/null
+++ b/dom/media/gmp/GMPProcessParent.cpp
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: sw=2 ts=2 et :
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPProcessParent.h"
+#include "GMPUtils.h"
+#include "nsIFile.h"
+#include "nsIRunnable.h"
+#if defined(XP_WIN) && defined(MOZ_SANDBOX)
+#include "WinUtils.h"
+#endif
+
+#include "base/string_util.h"
+#include "base/process_util.h"
+
+#include <string>
+
+using std::vector;
+using std::string;
+
+using mozilla::gmp::GMPProcessParent;
+using mozilla::ipc::GeckoChildProcessHost;
+using base::ProcessArchitecture;
+
+namespace mozilla {
+
+extern LogModule* GetGMPLog();
+#define GMP_LOG(msg, ...) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, (msg, ##__VA_ARGS__))
+
+namespace gmp {
+
+GMPProcessParent::GMPProcessParent(const std::string& aGMPPath)
+: GeckoChildProcessHost(GeckoProcessType_GMPlugin),
+ mGMPPath(aGMPPath)
+{
+ MOZ_COUNT_CTOR(GMPProcessParent);
+}
+
+GMPProcessParent::~GMPProcessParent()
+{
+ MOZ_COUNT_DTOR(GMPProcessParent);
+}
+
+bool
+GMPProcessParent::Launch(int32_t aTimeoutMs)
+{
+ nsCOMPtr<nsIFile> path;
+ if (!GetEMEVoucherPath(getter_AddRefs(path))) {
+ NS_WARNING("GMPProcessParent can't get EME voucher path!");
+ return false;
+ }
+ nsAutoCString voucherPath;
+ path->GetNativePath(voucherPath);
+
+ vector<string> args;
+
+#if defined(XP_WIN) && defined(MOZ_SANDBOX)
+ std::wstring wGMPPath = UTF8ToWide(mGMPPath.c_str());
+
+ // The sandbox doesn't allow file system rules where the paths contain
+ // symbolic links or junction points. Sometimes the Users folder has been
+ // moved to another drive using a junction point, so allow for this specific
+ // case. See bug 1236680 for details.
+ if (!widget::WinUtils::ResolveJunctionPointsAndSymLinks(wGMPPath)) {
+ GMP_LOG("ResolveJunctionPointsAndSymLinks failed for GMP path=%S",
+ wGMPPath.c_str());
+ NS_WARNING("ResolveJunctionPointsAndSymLinks failed for GMP path.");
+ return false;
+ }
+ GMP_LOG("GMPProcessParent::Launch() resolved path to %S", wGMPPath.c_str());
+
+ // If the GMP path is a network path that is not mapped to a drive letter,
+ // then we need to fix the path format for the sandbox rule.
+ wchar_t volPath[MAX_PATH];
+ if (::GetVolumePathNameW(wGMPPath.c_str(), volPath, MAX_PATH) &&
+ ::GetDriveTypeW(volPath) == DRIVE_REMOTE &&
+ wGMPPath.compare(0, 2, L"\\\\") == 0) {
+ std::wstring sandboxGMPPath(wGMPPath);
+ sandboxGMPPath.insert(1, L"??\\UNC");
+ mAllowedFilesRead.push_back(sandboxGMPPath + L"\\*");
+ } else {
+ mAllowedFilesRead.push_back(wGMPPath + L"\\*");
+ }
+
+ args.push_back(WideToUTF8(wGMPPath));
+#else
+ args.push_back(mGMPPath);
+#endif
+
+ args.push_back(string(voucherPath.BeginReading(), voucherPath.EndReading()));
+
+ return SyncLaunch(args, aTimeoutMs, base::GetCurrentProcessArchitecture());
+}
+
+void
+GMPProcessParent::Delete(nsCOMPtr<nsIRunnable> aCallback)
+{
+ mDeletedCallback = aCallback;
+ XRE_GetIOMessageLoop()->PostTask(NewNonOwningRunnableMethod(this, &GMPProcessParent::DoDelete));
+}
+
+void
+GMPProcessParent::DoDelete()
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+ Join();
+
+ if (mDeletedCallback) {
+ mDeletedCallback->Run();
+ }
+
+ delete this;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPProcessParent.h b/dom/media/gmp/GMPProcessParent.h
new file mode 100644
index 000000000..b94f203cf
--- /dev/null
+++ b/dom/media/gmp/GMPProcessParent.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=4 ts=4 et :
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPProcessParent_h
+#define GMPProcessParent_h 1
+
+#include "mozilla/Attributes.h"
+#include "base/basictypes.h"
+#include "base/file_path.h"
+#include "base/thread.h"
+#include "chrome/common/child_process_host.h"
+#include "mozilla/ipc/GeckoChildProcessHost.h"
+
+class nsIRunnable;
+
+namespace mozilla {
+namespace gmp {
+
+class GMPProcessParent final : public mozilla::ipc::GeckoChildProcessHost
+{
+public:
+ explicit GMPProcessParent(const std::string& aGMPPath);
+ ~GMPProcessParent();
+
+ // Synchronously launch the plugin process. If the process fails to launch
+ // after timeoutMs, this method will return false.
+ bool Launch(int32_t aTimeoutMs);
+
+ void Delete(nsCOMPtr<nsIRunnable> aCallback = nullptr);
+
+ bool CanShutdown() override { return true; }
+ const std::string& GetPluginFilePath() { return mGMPPath; }
+
+ using mozilla::ipc::GeckoChildProcessHost::GetChannel;
+ using mozilla::ipc::GeckoChildProcessHost::GetChildProcessHandle;
+
+private:
+ void DoDelete();
+
+ std::string mGMPPath;
+ nsCOMPtr<nsIRunnable> mDeletedCallback;
+
+ DISALLOW_COPY_AND_ASSIGN(GMPProcessParent);
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // ifndef GMPProcessParent_h
diff --git a/dom/media/gmp/GMPService.cpp b/dom/media/gmp/GMPService.cpp
new file mode 100644
index 000000000..65f4037ee
--- /dev/null
+++ b/dom/media/gmp/GMPService.cpp
@@ -0,0 +1,568 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPService.h"
+#include "GMPServiceParent.h"
+#include "GMPServiceChild.h"
+#include "GMPContentParent.h"
+#include "prio.h"
+#include "mozilla/Logging.h"
+#include "GMPParent.h"
+#include "GMPVideoDecoderParent.h"
+#include "nsIObserverService.h"
+#include "GeckoChildProcessHost.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/SyncRunnable.h"
+#include "nsXPCOMPrivate.h"
+#include "mozilla/Services.h"
+#include "nsNativeCharsetUtils.h"
+#include "nsIConsoleService.h"
+#include "mozilla/Unused.h"
+#include "GMPDecryptorParent.h"
+#include "GMPAudioDecoderParent.h"
+#include "nsComponentManagerUtils.h"
+#include "runnable_utils.h"
+#include "VideoUtils.h"
+#if defined(XP_LINUX) && defined(MOZ_GMP_SANDBOX)
+#include "mozilla/SandboxInfo.h"
+#endif
+#include "nsAppDirectoryServiceDefs.h"
+#include "nsDirectoryServiceUtils.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsHashKeys.h"
+#include "nsIFile.h"
+#include "nsISimpleEnumerator.h"
+#include "nsThreadUtils.h"
+
+#include "mozilla/dom/PluginCrashedEvent.h"
+#include "mozilla/EventDispatcher.h"
+#include "mozilla/Attributes.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+LogModule*
+GetGMPLog()
+{
+ static LazyLogModule sLog("GMP");
+ return sLog;
+}
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPService"
+
+namespace gmp {
+
+static StaticRefPtr<GeckoMediaPluginService> sSingletonService;
+
+class GMPServiceCreateHelper final : public mozilla::Runnable
+{
+ RefPtr<GeckoMediaPluginService> mService;
+
+public:
+ static already_AddRefed<GeckoMediaPluginService>
+ GetOrCreate()
+ {
+ RefPtr<GeckoMediaPluginService> service;
+
+ if (NS_IsMainThread()) {
+ service = GetOrCreateOnMainThread();
+ } else {
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ MOZ_ASSERT(mainThread);
+
+ RefPtr<GMPServiceCreateHelper> createHelper = new GMPServiceCreateHelper();
+
+ mozilla::SyncRunnable::DispatchToThread(mainThread, createHelper, true);
+
+ service = createHelper->mService.forget();
+ }
+
+ return service.forget();
+ }
+
+private:
+ GMPServiceCreateHelper()
+ {
+ }
+
+ ~GMPServiceCreateHelper()
+ {
+ MOZ_ASSERT(!mService);
+ }
+
+ static already_AddRefed<GeckoMediaPluginService>
+ GetOrCreateOnMainThread()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!sSingletonService) {
+ if (XRE_IsParentProcess()) {
+ RefPtr<GeckoMediaPluginServiceParent> service =
+ new GeckoMediaPluginServiceParent();
+ service->Init();
+ sSingletonService = service;
+ } else {
+ RefPtr<GeckoMediaPluginServiceChild> service =
+ new GeckoMediaPluginServiceChild();
+ service->Init();
+ sSingletonService = service;
+ }
+
+ ClearOnShutdown(&sSingletonService);
+ }
+
+ RefPtr<GeckoMediaPluginService> service = sSingletonService.get();
+ return service.forget();
+ }
+
+ NS_IMETHOD
+ Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ mService = GetOrCreateOnMainThread();
+ return NS_OK;
+ }
+};
+
+already_AddRefed<GeckoMediaPluginService>
+GeckoMediaPluginService::GetGeckoMediaPluginService()
+{
+ return GMPServiceCreateHelper::GetOrCreate();
+}
+
+NS_IMPL_ISUPPORTS(GeckoMediaPluginService, mozIGeckoMediaPluginService, nsIObserver)
+
+GeckoMediaPluginService::GeckoMediaPluginService()
+ : mMutex("GeckoMediaPluginService::mMutex")
+ , mGMPThreadShutdown(false)
+ , mShuttingDownOnGMPThread(false)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+GeckoMediaPluginService::~GeckoMediaPluginService()
+{
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginService::RunPluginCrashCallbacks(uint32_t aPluginId,
+ const nsACString& aPluginName)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ LOGD(("%s::%s(%i)", __CLASS__, __FUNCTION__, aPluginId));
+
+ nsAutoPtr<nsTArray<RefPtr<GMPCrashHelper>>> helpers;
+ {
+ MutexAutoLock lock(mMutex);
+ mPluginCrashHelpers.RemoveAndForget(aPluginId, helpers);
+ }
+ if (!helpers) {
+ LOGD(("%s::%s(%i) No crash helpers, not handling crash.", __CLASS__, __FUNCTION__, aPluginId));
+ return NS_OK;
+ }
+
+ for (const auto& helper : *helpers) {
+ nsCOMPtr<nsPIDOMWindowInner> window = helper->GetPluginCrashedEventTarget();
+ if (NS_WARN_IF(!window)) {
+ continue;
+ }
+ nsCOMPtr<nsIDocument> document(window->GetExtantDoc());
+ if (NS_WARN_IF(!document)) {
+ continue;
+ }
+
+ dom::PluginCrashedEventInit init;
+ init.mPluginID = aPluginId;
+ init.mBubbles = true;
+ init.mCancelable = true;
+ init.mGmpPlugin = true;
+ CopyUTF8toUTF16(aPluginName, init.mPluginName);
+ init.mSubmittedCrashReport = false;
+ RefPtr<dom::PluginCrashedEvent> event =
+ dom::PluginCrashedEvent::Constructor(document,
+ NS_LITERAL_STRING("PluginCrashed"),
+ init);
+ event->SetTrusted(true);
+ event->WidgetEventPtr()->mFlags.mOnlyChromeDispatch = true;
+
+ EventDispatcher::DispatchDOMEvent(window, nullptr, event, nullptr, nullptr);
+ }
+
+ return NS_OK;
+}
+
+nsresult
+GeckoMediaPluginService::Init()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ MOZ_ASSERT(obsService);
+ MOZ_ALWAYS_SUCCEEDS(obsService->AddObserver(this, NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID, false));
+
+ // Kick off scanning for plugins
+ nsCOMPtr<nsIThread> thread;
+ return GetThread(getter_AddRefs(thread));
+}
+
+void
+GeckoMediaPluginService::ShutdownGMPThread()
+{
+ LOGD(("%s::%s", __CLASS__, __FUNCTION__));
+ nsCOMPtr<nsIThread> gmpThread;
+ {
+ MutexAutoLock lock(mMutex);
+ mGMPThreadShutdown = true;
+ mGMPThread.swap(gmpThread);
+ mAbstractGMPThread = nullptr;
+ }
+
+ if (gmpThread) {
+ gmpThread->Shutdown();
+ }
+}
+
+nsresult
+GeckoMediaPluginService::GMPDispatch(nsIRunnable* event,
+ uint32_t flags)
+{
+ nsCOMPtr<nsIRunnable> r(event);
+ return GMPDispatch(r.forget());
+}
+
+nsresult
+GeckoMediaPluginService::GMPDispatch(already_AddRefed<nsIRunnable> event,
+ uint32_t flags)
+{
+ nsCOMPtr<nsIRunnable> r(event);
+ nsCOMPtr<nsIThread> thread;
+ nsresult rv = GetThread(getter_AddRefs(thread));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ return thread->Dispatch(r, flags);
+}
+
+// always call with getter_AddRefs, because it does
+NS_IMETHODIMP
+GeckoMediaPluginService::GetThread(nsIThread** aThread)
+{
+ MOZ_ASSERT(aThread);
+
+ // This can be called from any thread.
+ MutexAutoLock lock(mMutex);
+
+ if (!mGMPThread) {
+ // Don't allow the thread to be created after shutdown has started.
+ if (mGMPThreadShutdown) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult rv = NS_NewNamedThread("GMPThread", getter_AddRefs(mGMPThread));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ mAbstractGMPThread = AbstractThread::CreateXPCOMThreadWrapper(mGMPThread, false);
+
+ // Tell the thread to initialize plugins
+ InitializePlugins(mAbstractGMPThread.get());
+ }
+
+ nsCOMPtr<nsIThread> copy = mGMPThread;
+ copy.forget(aThread);
+
+ return NS_OK;
+}
+
+RefPtr<AbstractThread>
+GeckoMediaPluginService::GetAbstractGMPThread()
+{
+ MutexAutoLock lock(mMutex);
+ return mAbstractGMPThread;
+}
+
+class GetGMPContentParentForAudioDecoderDone : public GetGMPContentParentCallback
+{
+public:
+ explicit GetGMPContentParentForAudioDecoderDone(UniquePtr<GetGMPAudioDecoderCallback>&& aCallback,
+ GMPCrashHelper* aHelper)
+ : mCallback(Move(aCallback))
+ , mHelper(aHelper)
+ {
+ }
+
+ void Done(GMPContentParent* aGMPParent) override
+ {
+ GMPAudioDecoderParent* gmpADP = nullptr;
+ if (aGMPParent && NS_SUCCEEDED(aGMPParent->GetGMPAudioDecoder(&gmpADP))) {
+ gmpADP->SetCrashHelper(mHelper);
+ }
+ mCallback->Done(gmpADP);
+ }
+
+private:
+ UniquePtr<GetGMPAudioDecoderCallback> mCallback;
+ RefPtr<GMPCrashHelper> mHelper;
+};
+
+NS_IMETHODIMP
+GeckoMediaPluginService::GetGMPAudioDecoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPAudioDecoderCallback>&& aCallback)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ NS_ENSURE_ARG(aTags && aTags->Length() > 0);
+ NS_ENSURE_ARG(aCallback);
+
+ if (mShuttingDownOnGMPThread) {
+ return NS_ERROR_FAILURE;
+ }
+
+ UniquePtr<GetGMPContentParentCallback> callback(
+ new GetGMPContentParentForAudioDecoderDone(Move(aCallback), aHelper));
+ if (!GetContentParentFrom(aHelper,
+ aNodeId,
+ NS_LITERAL_CSTRING(GMP_API_AUDIO_DECODER),
+ *aTags,
+ Move(callback))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+class GetGMPContentParentForVideoDecoderDone : public GetGMPContentParentCallback
+{
+public:
+ explicit GetGMPContentParentForVideoDecoderDone(UniquePtr<GetGMPVideoDecoderCallback>&& aCallback,
+ GMPCrashHelper* aHelper,
+ uint32_t aDecryptorId)
+ : mCallback(Move(aCallback))
+ , mHelper(aHelper)
+ , mDecryptorId(aDecryptorId)
+ {
+ }
+
+ void Done(GMPContentParent* aGMPParent) override
+ {
+ GMPVideoDecoderParent* gmpVDP = nullptr;
+ GMPVideoHostImpl* videoHost = nullptr;
+ if (aGMPParent && NS_SUCCEEDED(aGMPParent->GetGMPVideoDecoder(&gmpVDP, mDecryptorId))) {
+ videoHost = &gmpVDP->Host();
+ gmpVDP->SetCrashHelper(mHelper);
+ }
+ mCallback->Done(gmpVDP, videoHost);
+ }
+
+private:
+ UniquePtr<GetGMPVideoDecoderCallback> mCallback;
+ RefPtr<GMPCrashHelper> mHelper;
+ const uint32_t mDecryptorId;
+};
+
+NS_IMETHODIMP
+GeckoMediaPluginService::GetDecryptingGMPVideoDecoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPVideoDecoderCallback>&& aCallback,
+ uint32_t aDecryptorId)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ NS_ENSURE_ARG(aTags && aTags->Length() > 0);
+ NS_ENSURE_ARG(aCallback);
+
+ if (mShuttingDownOnGMPThread) {
+ return NS_ERROR_FAILURE;
+ }
+
+ UniquePtr<GetGMPContentParentCallback> callback(
+ new GetGMPContentParentForVideoDecoderDone(Move(aCallback), aHelper, aDecryptorId));
+ if (!GetContentParentFrom(aHelper,
+ aNodeId,
+ NS_LITERAL_CSTRING(GMP_API_VIDEO_DECODER),
+ *aTags,
+ Move(callback))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+class GetGMPContentParentForVideoEncoderDone : public GetGMPContentParentCallback
+{
+public:
+ explicit GetGMPContentParentForVideoEncoderDone(UniquePtr<GetGMPVideoEncoderCallback>&& aCallback,
+ GMPCrashHelper* aHelper)
+ : mCallback(Move(aCallback))
+ , mHelper(aHelper)
+ {
+ }
+
+ void Done(GMPContentParent* aGMPParent) override
+ {
+ GMPVideoEncoderParent* gmpVEP = nullptr;
+ GMPVideoHostImpl* videoHost = nullptr;
+ if (aGMPParent && NS_SUCCEEDED(aGMPParent->GetGMPVideoEncoder(&gmpVEP))) {
+ videoHost = &gmpVEP->Host();
+ gmpVEP->SetCrashHelper(mHelper);
+ }
+ mCallback->Done(gmpVEP, videoHost);
+ }
+
+private:
+ UniquePtr<GetGMPVideoEncoderCallback> mCallback;
+ RefPtr<GMPCrashHelper> mHelper;
+};
+
+NS_IMETHODIMP
+GeckoMediaPluginService::GetGMPVideoEncoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPVideoEncoderCallback>&& aCallback)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ NS_ENSURE_ARG(aTags && aTags->Length() > 0);
+ NS_ENSURE_ARG(aCallback);
+
+ if (mShuttingDownOnGMPThread) {
+ return NS_ERROR_FAILURE;
+ }
+
+ UniquePtr<GetGMPContentParentCallback> callback(
+ new GetGMPContentParentForVideoEncoderDone(Move(aCallback), aHelper));
+ if (!GetContentParentFrom(aHelper,
+ aNodeId,
+ NS_LITERAL_CSTRING(GMP_API_VIDEO_ENCODER),
+ *aTags,
+ Move(callback))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+class GetGMPContentParentForDecryptorDone : public GetGMPContentParentCallback
+{
+public:
+ explicit GetGMPContentParentForDecryptorDone(UniquePtr<GetGMPDecryptorCallback>&& aCallback,
+ GMPCrashHelper* aHelper)
+ : mCallback(Move(aCallback))
+ , mHelper(aHelper)
+ {
+ }
+
+ void Done(GMPContentParent* aGMPParent) override
+ {
+ GMPDecryptorParent* ksp = nullptr;
+ if (aGMPParent && NS_SUCCEEDED(aGMPParent->GetGMPDecryptor(&ksp))) {
+ ksp->SetCrashHelper(mHelper);
+ }
+ mCallback->Done(ksp);
+ }
+
+private:
+ UniquePtr<GetGMPDecryptorCallback> mCallback;
+ RefPtr<GMPCrashHelper> mHelper;
+};
+
+NS_IMETHODIMP
+GeckoMediaPluginService::GetGMPDecryptor(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPDecryptorCallback>&& aCallback)
+{
+#if defined(XP_LINUX) && defined(MOZ_GMP_SANDBOX)
+ if (!SandboxInfo::Get().CanSandboxMedia()) {
+ NS_WARNING("GeckoMediaPluginService::GetGMPDecryptor: "
+ "EME decryption not available without sandboxing support.");
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+#endif
+
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ NS_ENSURE_ARG(aTags && aTags->Length() > 0);
+ NS_ENSURE_ARG(aCallback);
+
+ if (mShuttingDownOnGMPThread) {
+ return NS_ERROR_FAILURE;
+ }
+
+ UniquePtr<GetGMPContentParentCallback> callback(
+ new GetGMPContentParentForDecryptorDone(Move(aCallback), aHelper));
+ if (!GetContentParentFrom(aHelper,
+ aNodeId,
+ NS_LITERAL_CSTRING(GMP_API_DECRYPTOR),
+ *aTags,
+ Move(callback))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+void
+GeckoMediaPluginService::ConnectCrashHelper(uint32_t aPluginId, GMPCrashHelper* aHelper)
+{
+ if (!aHelper) {
+ return;
+ }
+ MutexAutoLock lock(mMutex);
+ nsTArray<RefPtr<GMPCrashHelper>>* helpers;
+ if (!mPluginCrashHelpers.Get(aPluginId, &helpers)) {
+ helpers = new nsTArray<RefPtr<GMPCrashHelper>>();
+ mPluginCrashHelpers.Put(aPluginId, helpers);
+ } else if (helpers->Contains(aHelper)) {
+ return;
+ }
+ helpers->AppendElement(aHelper);
+}
+
+void GeckoMediaPluginService::DisconnectCrashHelper(GMPCrashHelper* aHelper)
+{
+ if (!aHelper) {
+ return;
+ }
+ MutexAutoLock lock(mMutex);
+ for (auto iter = mPluginCrashHelpers.Iter(); !iter.Done(); iter.Next()) {
+ nsTArray<RefPtr<GMPCrashHelper>>* helpers = iter.Data();
+ if (!helpers->Contains(aHelper)) {
+ continue;
+ }
+ helpers->RemoveElement(aHelper);
+ MOZ_ASSERT(!helpers->Contains(aHelper)); // Ensure there aren't duplicates.
+ if (helpers->IsEmpty()) {
+ iter.Remove();
+ }
+ }
+}
+
+} // namespace gmp
+} // namespace mozilla
+
+NS_IMPL_ADDREF(GMPCrashHelper)
+NS_IMPL_RELEASE_WITH_DESTROY(GMPCrashHelper, Destroy())
+
+void
+GMPCrashHelper::Destroy()
+{
+ if (NS_IsMainThread()) {
+ delete this;
+ } else {
+ // Don't addref, as then we'd end up releasing after the detele runs!
+ NS_DispatchToMainThread(mozilla::NewNonOwningRunnableMethod(this, &GMPCrashHelper::Destroy));
+ }
+}
diff --git a/dom/media/gmp/GMPService.h b/dom/media/gmp/GMPService.h
new file mode 100644
index 000000000..7ed318a25
--- /dev/null
+++ b/dom/media/gmp/GMPService.h
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPService_h_
+#define GMPService_h_
+
+#include "nsString.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "nsIObserver.h"
+#include "nsTArray.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/Monitor.h"
+#include "nsString.h"
+#include "nsCOMPtr.h"
+#include "nsIThread.h"
+#include "nsThreadUtils.h"
+#include "nsPIDOMWindow.h"
+#include "nsIDocument.h"
+#include "nsIWeakReference.h"
+#include "mozilla/AbstractThread.h"
+#include "nsClassHashtable.h"
+#include "nsISupportsImpl.h"
+
+template <class> struct already_AddRefed;
+
+// For every GMP actor requested, the caller can specify a crash helper,
+// which is an object which supplies the nsPIDOMWindowInner to which we'll
+// dispatch the PluginCrashed event if the GMP crashes.
+// GMPCrashHelper has threadsafe refcounting. Its release method ensures
+// that instances are destroyed on the main thread.
+class GMPCrashHelper
+{
+public:
+ NS_METHOD_(MozExternalRefCountType) AddRef(void);
+ NS_METHOD_(MozExternalRefCountType) Release(void);
+
+ // Called on the main thread.
+ virtual already_AddRefed<nsPIDOMWindowInner> GetPluginCrashedEventTarget() = 0;
+
+protected:
+ virtual ~GMPCrashHelper()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+ void Destroy();
+ mozilla::ThreadSafeAutoRefCnt mRefCnt;
+ NS_DECL_OWNINGTHREAD
+};
+
+namespace mozilla {
+
+extern LogModule* GetGMPLog();
+
+namespace gmp {
+
+class GetGMPContentParentCallback;
+
+class GeckoMediaPluginService : public mozIGeckoMediaPluginService
+ , public nsIObserver
+{
+public:
+ static already_AddRefed<GeckoMediaPluginService> GetGeckoMediaPluginService();
+
+ virtual nsresult Init();
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // mozIGeckoMediaPluginService
+ NS_IMETHOD GetThread(nsIThread** aThread) override;
+ NS_IMETHOD GetDecryptingGMPVideoDecoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPVideoDecoderCallback>&& aCallback,
+ uint32_t aDecryptorId)
+ override;
+ NS_IMETHOD GetGMPVideoEncoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPVideoEncoderCallback>&& aCallback)
+ override;
+ NS_IMETHOD GetGMPAudioDecoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPAudioDecoderCallback>&& aCallback)
+ override;
+ NS_IMETHOD GetGMPDecryptor(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPDecryptorCallback>&& aCallback)
+ override;
+
+ // Helper for backwards compatibility with WebRTC/tests.
+ NS_IMETHOD
+ GetGMPVideoDecoder(GMPCrashHelper* aHelper,
+ nsTArray<nsCString>* aTags,
+ const nsACString& aNodeId,
+ UniquePtr<GetGMPVideoDecoderCallback>&& aCallback) override
+ {
+ return GetDecryptingGMPVideoDecoder(aHelper, aTags, aNodeId, Move(aCallback), 0);
+ }
+
+ int32_t AsyncShutdownTimeoutMs();
+
+ NS_IMETHOD RunPluginCrashCallbacks(uint32_t aPluginId,
+ const nsACString& aPluginName) override;
+
+ RefPtr<AbstractThread> GetAbstractGMPThread();
+
+ void ConnectCrashHelper(uint32_t aPluginId, GMPCrashHelper* aHelper);
+ void DisconnectCrashHelper(GMPCrashHelper* aHelper);
+
+protected:
+ GeckoMediaPluginService();
+ virtual ~GeckoMediaPluginService();
+
+ virtual void InitializePlugins(AbstractThread* aAbstractGMPThread) = 0;
+ virtual bool GetContentParentFrom(GMPCrashHelper* aHelper,
+ const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ UniquePtr<GetGMPContentParentCallback>&& aCallback) = 0;
+
+ nsresult GMPDispatch(nsIRunnable* event, uint32_t flags = NS_DISPATCH_NORMAL);
+ nsresult GMPDispatch(already_AddRefed<nsIRunnable> event, uint32_t flags = NS_DISPATCH_NORMAL);
+ void ShutdownGMPThread();
+
+ Mutex mMutex; // Protects mGMPThread, mAbstractGMPThread, mPluginCrashHelpers,
+ // mGMPThreadShutdown and some members in derived classes.
+ nsCOMPtr<nsIThread> mGMPThread;
+ RefPtr<AbstractThread> mAbstractGMPThread;
+ bool mGMPThreadShutdown;
+ bool mShuttingDownOnGMPThread;
+
+ nsClassHashtable<nsUint32HashKey, nsTArray<RefPtr<GMPCrashHelper>>> mPluginCrashHelpers;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPService_h_
diff --git a/dom/media/gmp/GMPServiceChild.cpp b/dom/media/gmp/GMPServiceChild.cpp
new file mode 100644
index 000000000..08599039f
--- /dev/null
+++ b/dom/media/gmp/GMPServiceChild.cpp
@@ -0,0 +1,478 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPServiceChild.h"
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/StaticPtr.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "mozIGeckoMediaPluginChromeService.h"
+#include "nsCOMPtr.h"
+#include "GMPParent.h"
+#include "GMPContentParent.h"
+#include "nsXPCOMPrivate.h"
+#include "mozilla/SyncRunnable.h"
+#include "mozilla/StaticMutex.h"
+#include "runnable_utils.h"
+#include "base/task.h"
+#include "nsIObserverService.h"
+#include "nsComponentManagerUtils.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPService"
+
+namespace gmp {
+
+already_AddRefed<GeckoMediaPluginServiceChild>
+GeckoMediaPluginServiceChild::GetSingleton()
+{
+ MOZ_ASSERT(!XRE_IsParentProcess());
+ RefPtr<GeckoMediaPluginService> service(
+ GeckoMediaPluginService::GetGeckoMediaPluginService());
+#ifdef DEBUG
+ if (service) {
+ nsCOMPtr<mozIGeckoMediaPluginChromeService> chromeService;
+ CallQueryInterface(service.get(), getter_AddRefs(chromeService));
+ MOZ_ASSERT(!chromeService);
+ }
+#endif
+ return service.forget().downcast<GeckoMediaPluginServiceChild>();
+}
+
+class GetContentParentFromDone : public GetServiceChildCallback
+{
+public:
+ GetContentParentFromDone(GMPCrashHelper* aHelper, const nsACString& aNodeId, const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ UniquePtr<GetGMPContentParentCallback>&& aCallback)
+ : mHelper(aHelper),
+ mNodeId(aNodeId),
+ mAPI(aAPI),
+ mTags(aTags),
+ mCallback(Move(aCallback))
+ {
+ }
+
+ void Done(GMPServiceChild* aGMPServiceChild) override
+ {
+ if (!aGMPServiceChild) {
+ mCallback->Done(nullptr);
+ return;
+ }
+
+ uint32_t pluginId;
+ nsresult rv;
+ bool ok = aGMPServiceChild->SendSelectGMP(mNodeId, mAPI, mTags, &pluginId, &rv);
+ if (!ok || rv == NS_ERROR_ILLEGAL_DURING_SHUTDOWN) {
+ mCallback->Done(nullptr);
+ return;
+ }
+
+ if (mHelper) {
+ RefPtr<GeckoMediaPluginService> gmps(GeckoMediaPluginService::GetGeckoMediaPluginService());
+ gmps->ConnectCrashHelper(pluginId, mHelper);
+ }
+
+ nsTArray<base::ProcessId> alreadyBridgedTo;
+ aGMPServiceChild->GetAlreadyBridgedTo(alreadyBridgedTo);
+
+ base::ProcessId otherProcess;
+ nsCString displayName;
+ ok = aGMPServiceChild->SendLaunchGMP(pluginId, alreadyBridgedTo, &otherProcess,
+ &displayName, &rv);
+ if (!ok || rv == NS_ERROR_ILLEGAL_DURING_SHUTDOWN) {
+ mCallback->Done(nullptr);
+ return;
+ }
+
+ RefPtr<GMPContentParent> parent;
+ aGMPServiceChild->GetBridgedGMPContentParent(otherProcess,
+ getter_AddRefs(parent));
+ if (!alreadyBridgedTo.Contains(otherProcess)) {
+ parent->SetDisplayName(displayName);
+ parent->SetPluginId(pluginId);
+ }
+
+ mCallback->Done(parent);
+ }
+
+private:
+ RefPtr<GMPCrashHelper> mHelper;
+ nsCString mNodeId;
+ nsCString mAPI;
+ const nsTArray<nsCString> mTags;
+ UniquePtr<GetGMPContentParentCallback> mCallback;
+};
+
+bool
+GeckoMediaPluginServiceChild::GetContentParentFrom(GMPCrashHelper* aHelper,
+ const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ UniquePtr<GetGMPContentParentCallback>&& aCallback)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+
+ UniquePtr<GetServiceChildCallback> callback(
+ new GetContentParentFromDone(aHelper, aNodeId, aAPI, aTags, Move(aCallback)));
+ GetServiceChild(Move(callback));
+
+ return true;
+}
+
+typedef mozilla::dom::GMPCapabilityData GMPCapabilityData;
+typedef mozilla::dom::GMPAPITags GMPAPITags;
+
+struct GMPCapabilityAndVersion
+{
+ explicit GMPCapabilityAndVersion(const GMPCapabilityData& aCapabilities)
+ : mName(aCapabilities.name())
+ , mVersion(aCapabilities.version())
+ {
+ for (const GMPAPITags& tags : aCapabilities.capabilities()) {
+ GMPCapability cap;
+ cap.mAPIName = tags.api();
+ for (const nsCString& tag : tags.tags()) {
+ cap.mAPITags.AppendElement(tag);
+ }
+ mCapabilities.AppendElement(Move(cap));
+ }
+ }
+
+ nsCString ToString() const
+ {
+ nsCString s;
+ s.Append(mName);
+ s.Append(" version=");
+ s.Append(mVersion);
+ s.Append(" tags=[");
+ nsCString tags;
+ for (const GMPCapability& cap : mCapabilities) {
+ if (!tags.IsEmpty()) {
+ tags.Append(" ");
+ }
+ tags.Append(cap.mAPIName);
+ for (const nsCString& tag : cap.mAPITags) {
+ tags.Append(":");
+ tags.Append(tag);
+ }
+ }
+ s.Append(tags);
+ s.Append("]");
+ return s;
+ }
+
+ nsCString mName;
+ nsCString mVersion;
+ nsTArray<GMPCapability> mCapabilities;
+};
+
+StaticMutex sGMPCapabilitiesMutex;
+StaticAutoPtr<nsTArray<GMPCapabilityAndVersion>> sGMPCapabilities;
+
+static nsCString
+GMPCapabilitiesToString()
+{
+ nsCString s;
+ for (const GMPCapabilityAndVersion& gmp : *sGMPCapabilities) {
+ if (!s.IsEmpty()) {
+ s.Append(", ");
+ }
+ s.Append(gmp.ToString());
+ }
+ return s;
+}
+
+/* static */
+void
+GeckoMediaPluginServiceChild::UpdateGMPCapabilities(nsTArray<GMPCapabilityData>&& aCapabilities)
+{
+ {
+ // The mutex should unlock before sending the "gmp-changed" observer service notification.
+ StaticMutexAutoLock lock(sGMPCapabilitiesMutex);
+ if (!sGMPCapabilities) {
+ sGMPCapabilities = new nsTArray<GMPCapabilityAndVersion>();
+ ClearOnShutdown(&sGMPCapabilities);
+ }
+ sGMPCapabilities->Clear();
+ for (const GMPCapabilityData& plugin : aCapabilities) {
+ sGMPCapabilities->AppendElement(GMPCapabilityAndVersion(plugin));
+ }
+
+ LOGD(("UpdateGMPCapabilities {%s}", GMPCapabilitiesToString().get()));
+ }
+
+ // Fire a notification so that any MediaKeySystemAccess
+ // requests waiting on a CDM to download will retry.
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ MOZ_ASSERT(obsService);
+ if (obsService) {
+ obsService->NotifyObservers(nullptr, "gmp-changed", nullptr);
+ }
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceChild::HasPluginForAPI(const nsACString& aAPI,
+ nsTArray<nsCString>* aTags,
+ bool* aHasPlugin)
+{
+ StaticMutexAutoLock lock(sGMPCapabilitiesMutex);
+ if (!sGMPCapabilities) {
+ *aHasPlugin = false;
+ return NS_OK;
+ }
+
+ nsCString api(aAPI);
+ for (const GMPCapabilityAndVersion& plugin : *sGMPCapabilities) {
+ if (GMPCapability::Supports(plugin.mCapabilities, api, *aTags)) {
+ *aHasPlugin = true;
+ return NS_OK;
+ }
+ }
+
+ *aHasPlugin = false;
+ return NS_OK;
+}
+
+class GetNodeIdDone : public GetServiceChildCallback
+{
+public:
+ GetNodeIdDone(const nsAString& aOrigin, const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing, UniquePtr<GetNodeIdCallback>&& aCallback)
+ : mOrigin(aOrigin),
+ mTopLevelOrigin(aTopLevelOrigin),
+ mGMPName(aGMPName),
+ mInPrivateBrowsing(aInPrivateBrowsing),
+ mCallback(Move(aCallback))
+ {
+ }
+
+ void Done(GMPServiceChild* aGMPServiceChild) override
+ {
+ if (!aGMPServiceChild) {
+ mCallback->Done(NS_ERROR_FAILURE, EmptyCString());
+ return;
+ }
+
+ nsCString outId;
+ if (!aGMPServiceChild->SendGetGMPNodeId(mOrigin, mTopLevelOrigin,
+ mGMPName,
+ mInPrivateBrowsing, &outId)) {
+ mCallback->Done(NS_ERROR_FAILURE, EmptyCString());
+ return;
+ }
+
+ mCallback->Done(NS_OK, outId);
+ }
+
+private:
+ nsString mOrigin;
+ nsString mTopLevelOrigin;
+ nsString mGMPName;
+ bool mInPrivateBrowsing;
+ UniquePtr<GetNodeIdCallback> mCallback;
+};
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceChild::GetNodeId(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing,
+ UniquePtr<GetNodeIdCallback>&& aCallback)
+{
+ UniquePtr<GetServiceChildCallback> callback(
+ new GetNodeIdDone(aOrigin, aTopLevelOrigin, aGMPName, aInPrivateBrowsing, Move(aCallback)));
+ GetServiceChild(Move(callback));
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceChild::Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aSomeData)
+{
+ LOGD(("%s::%s: %s", __CLASS__, __FUNCTION__, aTopic));
+ if (!strcmp(NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID, aTopic)) {
+ if (mServiceChild) {
+ mozilla::SyncRunnable::DispatchToThread(mGMPThread,
+ WrapRunnable(mServiceChild.get(),
+ &PGMPServiceChild::Close));
+ mServiceChild = nullptr;
+ }
+ ShutdownGMPThread();
+ }
+
+ return NS_OK;
+}
+
+void
+GeckoMediaPluginServiceChild::GetServiceChild(UniquePtr<GetServiceChildCallback>&& aCallback)
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+
+ if (!mServiceChild) {
+ dom::ContentChild* contentChild = dom::ContentChild::GetSingleton();
+ if (!contentChild) {
+ return;
+ }
+ mGetServiceChildCallbacks.AppendElement(Move(aCallback));
+ if (mGetServiceChildCallbacks.Length() == 1) {
+ NS_DispatchToMainThread(WrapRunnable(contentChild,
+ &dom::ContentChild::SendCreateGMPService));
+ }
+ return;
+ }
+
+ aCallback->Done(mServiceChild.get());
+}
+
+void
+GeckoMediaPluginServiceChild::SetServiceChild(UniquePtr<GMPServiceChild>&& aServiceChild)
+{
+ mServiceChild = Move(aServiceChild);
+ nsTArray<UniquePtr<GetServiceChildCallback>> getServiceChildCallbacks;
+ getServiceChildCallbacks.SwapElements(mGetServiceChildCallbacks);
+ for (uint32_t i = 0, length = getServiceChildCallbacks.Length(); i < length; ++i) {
+ getServiceChildCallbacks[i]->Done(mServiceChild.get());
+ }
+}
+
+void
+GeckoMediaPluginServiceChild::RemoveGMPContentParent(GMPContentParent* aGMPContentParent)
+{
+ if (mServiceChild) {
+ mServiceChild->RemoveGMPContentParent(aGMPContentParent);
+ }
+}
+
+GMPServiceChild::GMPServiceChild()
+{
+}
+
+GMPServiceChild::~GMPServiceChild()
+{
+}
+
+PGMPContentParent*
+GMPServiceChild::AllocPGMPContentParent(Transport* aTransport,
+ ProcessId aOtherPid)
+{
+ MOZ_ASSERT(!mContentParents.GetWeak(aOtherPid));
+
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ MOZ_ASSERT(mainThread);
+
+ RefPtr<GMPContentParent> parent = new GMPContentParent();
+
+ DebugOnly<bool> ok = parent->Open(aTransport, aOtherPid,
+ XRE_GetIOMessageLoop(),
+ mozilla::ipc::ParentSide);
+ MOZ_ASSERT(ok);
+
+ mContentParents.Put(aOtherPid, parent);
+ return parent;
+}
+
+void
+GMPServiceChild::GetBridgedGMPContentParent(ProcessId aOtherPid,
+ GMPContentParent** aGMPContentParent)
+{
+ mContentParents.Get(aOtherPid, aGMPContentParent);
+}
+
+void
+GMPServiceChild::RemoveGMPContentParent(GMPContentParent* aGMPContentParent)
+{
+ for (auto iter = mContentParents.Iter(); !iter.Done(); iter.Next()) {
+ RefPtr<GMPContentParent>& parent = iter.Data();
+ if (parent == aGMPContentParent) {
+ iter.Remove();
+ break;
+ }
+ }
+}
+
+void
+GMPServiceChild::GetAlreadyBridgedTo(nsTArray<base::ProcessId>& aAlreadyBridgedTo)
+{
+ aAlreadyBridgedTo.SetCapacity(mContentParents.Count());
+ for (auto iter = mContentParents.Iter(); !iter.Done(); iter.Next()) {
+ const uint64_t& id = iter.Key();
+ aAlreadyBridgedTo.AppendElement(id);
+ }
+}
+
+class OpenPGMPServiceChild : public mozilla::Runnable
+{
+public:
+ OpenPGMPServiceChild(UniquePtr<GMPServiceChild>&& aGMPServiceChild,
+ mozilla::ipc::Transport* aTransport,
+ base::ProcessId aOtherPid)
+ : mGMPServiceChild(Move(aGMPServiceChild)),
+ mTransport(aTransport),
+ mOtherPid(aOtherPid)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<GeckoMediaPluginServiceChild> gmp =
+ GeckoMediaPluginServiceChild::GetSingleton();
+ MOZ_ASSERT(!gmp->mServiceChild);
+ if (mGMPServiceChild->Open(mTransport, mOtherPid, XRE_GetIOMessageLoop(),
+ ipc::ChildSide)) {
+ gmp->SetServiceChild(Move(mGMPServiceChild));
+ } else {
+ gmp->SetServiceChild(nullptr);
+ }
+ return NS_OK;
+ }
+
+private:
+ UniquePtr<GMPServiceChild> mGMPServiceChild;
+ mozilla::ipc::Transport* mTransport;
+ base::ProcessId mOtherPid;
+};
+
+/* static */
+PGMPServiceChild*
+GMPServiceChild::Create(Transport* aTransport, ProcessId aOtherPid)
+{
+ RefPtr<GeckoMediaPluginServiceChild> gmp =
+ GeckoMediaPluginServiceChild::GetSingleton();
+ MOZ_ASSERT(!gmp->mServiceChild);
+
+ UniquePtr<GMPServiceChild> serviceChild(new GMPServiceChild());
+
+ nsCOMPtr<nsIThread> gmpThread;
+ nsresult rv = gmp->GetThread(getter_AddRefs(gmpThread));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+
+ GMPServiceChild* result = serviceChild.get();
+ rv = gmpThread->Dispatch(new OpenPGMPServiceChild(Move(serviceChild),
+ aTransport,
+ aOtherPid),
+ NS_DISPATCH_NORMAL);
+ if (NS_FAILED(rv)) {
+ return nullptr;
+ }
+
+ return result;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPServiceChild.h b/dom/media/gmp/GMPServiceChild.h
new file mode 100644
index 000000000..63b1325bb
--- /dev/null
+++ b/dom/media/gmp/GMPServiceChild.h
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPServiceChild_h_
+#define GMPServiceChild_h_
+
+#include "GMPService.h"
+#include "base/process.h"
+#include "mozilla/ipc/Transport.h"
+#include "mozilla/gmp/PGMPServiceChild.h"
+#include "nsRefPtrHashtable.h"
+#include "mozilla/dom/ContentChild.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentParent;
+class GMPServiceChild;
+
+class GetServiceChildCallback
+{
+public:
+ GetServiceChildCallback()
+ {
+ MOZ_COUNT_CTOR(GetServiceChildCallback);
+ }
+ virtual ~GetServiceChildCallback()
+ {
+ MOZ_COUNT_DTOR(GetServiceChildCallback);
+ }
+ virtual void Done(GMPServiceChild* aGMPServiceChild) = 0;
+};
+
+class GeckoMediaPluginServiceChild : public GeckoMediaPluginService
+{
+ friend class GMPServiceChild;
+
+public:
+ static already_AddRefed<GeckoMediaPluginServiceChild> GetSingleton();
+
+ NS_IMETHOD HasPluginForAPI(const nsACString& aAPI,
+ nsTArray<nsCString>* aTags,
+ bool *aRetVal) override;
+ NS_IMETHOD GetNodeId(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsingMode,
+ UniquePtr<GetNodeIdCallback>&& aCallback) override;
+
+ NS_DECL_NSIOBSERVER
+
+ void SetServiceChild(UniquePtr<GMPServiceChild>&& aServiceChild);
+
+ void RemoveGMPContentParent(GMPContentParent* aGMPContentParent);
+
+ static void UpdateGMPCapabilities(nsTArray<mozilla::dom::GMPCapabilityData>&& aCapabilities);
+
+protected:
+ void InitializePlugins(AbstractThread*) override
+ {
+ // Nothing to do here.
+ }
+ bool GetContentParentFrom(GMPCrashHelper* aHelper,
+ const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ UniquePtr<GetGMPContentParentCallback>&& aCallback)
+ override;
+
+private:
+ friend class OpenPGMPServiceChild;
+
+ void GetServiceChild(UniquePtr<GetServiceChildCallback>&& aCallback);
+
+ UniquePtr<GMPServiceChild> mServiceChild;
+ nsTArray<UniquePtr<GetServiceChildCallback>> mGetServiceChildCallbacks;
+};
+
+class GMPServiceChild : public PGMPServiceChild
+{
+public:
+ explicit GMPServiceChild();
+ virtual ~GMPServiceChild();
+
+ PGMPContentParent* AllocPGMPContentParent(Transport* aTransport,
+ ProcessId aOtherPid) override;
+
+ void GetBridgedGMPContentParent(ProcessId aOtherPid,
+ GMPContentParent** aGMPContentParent);
+ void RemoveGMPContentParent(GMPContentParent* aGMPContentParent);
+
+ void GetAlreadyBridgedTo(nsTArray<ProcessId>& aAlreadyBridgedTo);
+
+ static PGMPServiceChild* Create(Transport* aTransport, ProcessId aOtherPid);
+
+private:
+ nsRefPtrHashtable<nsUint64HashKey, GMPContentParent> mContentParents;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPServiceChild_h_
diff --git a/dom/media/gmp/GMPServiceParent.cpp b/dom/media/gmp/GMPServiceParent.cpp
new file mode 100644
index 000000000..8741989e3
--- /dev/null
+++ b/dom/media/gmp/GMPServiceParent.cpp
@@ -0,0 +1,2135 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPServiceParent.h"
+#include "GMPService.h"
+#include "prio.h"
+#include "base/task.h"
+#include "mozilla/Logging.h"
+#include "mozilla/dom/ContentParent.h"
+#include "GMPParent.h"
+#include "GMPVideoDecoderParent.h"
+#include "nsAutoPtr.h"
+#include "nsIObserverService.h"
+#include "GeckoChildProcessHost.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/SyncRunnable.h"
+#include "nsXPCOMPrivate.h"
+#include "mozilla/Services.h"
+#include "nsNativeCharsetUtils.h"
+#include "nsIConsoleService.h"
+#include "mozilla/Unused.h"
+#include "GMPDecryptorParent.h"
+#include "GMPAudioDecoderParent.h"
+#include "nsComponentManagerUtils.h"
+#include "runnable_utils.h"
+#include "VideoUtils.h"
+#if defined(XP_LINUX) && defined(MOZ_GMP_SANDBOX)
+#include "mozilla/SandboxInfo.h"
+#endif
+#include "nsAppDirectoryServiceDefs.h"
+#include "nsDirectoryServiceUtils.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsHashKeys.h"
+#include "nsIFile.h"
+#include "nsISimpleEnumerator.h"
+#if defined(MOZ_CRASHREPORTER)
+#include "nsExceptionHandler.h"
+#include "nsPrintfCString.h"
+#endif
+#include "nsIXULRuntime.h"
+#include "GMPDecoderModule.h"
+#include <limits>
+#include "MediaPrefs.h"
+
+using mozilla::ipc::Transport;
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPService"
+
+namespace gmp {
+
+static const uint32_t NodeIdSaltLength = 32;
+
+already_AddRefed<GeckoMediaPluginServiceParent>
+GeckoMediaPluginServiceParent::GetSingleton()
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+ RefPtr<GeckoMediaPluginService> service(
+ GeckoMediaPluginServiceParent::GetGeckoMediaPluginService());
+#ifdef DEBUG
+ if (service) {
+ nsCOMPtr<mozIGeckoMediaPluginChromeService> chromeService;
+ CallQueryInterface(service.get(), getter_AddRefs(chromeService));
+ MOZ_ASSERT(chromeService);
+ }
+#endif
+ return service.forget().downcast<GeckoMediaPluginServiceParent>();
+}
+
+NS_IMPL_ISUPPORTS_INHERITED(GeckoMediaPluginServiceParent,
+ GeckoMediaPluginService,
+ mozIGeckoMediaPluginChromeService,
+ nsIAsyncShutdownBlocker)
+
+GeckoMediaPluginServiceParent::GeckoMediaPluginServiceParent()
+ : mShuttingDown(false)
+#ifdef MOZ_CRASHREPORTER
+ , mAsyncShutdownPluginStatesMutex("GeckoMediaPluginService::mAsyncShutdownPluginStatesMutex")
+#endif
+ , mScannedPluginOnDisk(false)
+ , mWaitingForPluginsSyncShutdown(false)
+ , mInitPromiseMonitor("GeckoMediaPluginServiceParent::mInitPromiseMonitor")
+ , mLoadPluginsFromDiskComplete(false)
+ , mServiceUserCount(0)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mInitPromise.SetMonitor(&mInitPromiseMonitor);
+}
+
+GeckoMediaPluginServiceParent::~GeckoMediaPluginServiceParent()
+{
+ MOZ_ASSERT(mPlugins.IsEmpty());
+ MOZ_ASSERT(mAsyncShutdownPlugins.IsEmpty());
+}
+
+int32_t
+GeckoMediaPluginServiceParent::AsyncShutdownTimeoutMs()
+{
+ return MediaPrefs::GMPAsyncShutdownTimeout();
+}
+
+nsresult
+GeckoMediaPluginServiceParent::Init()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ MOZ_ASSERT(obsService);
+ MOZ_ALWAYS_SUCCEEDS(obsService->AddObserver(this, "profile-change-teardown", false));
+ MOZ_ALWAYS_SUCCEEDS(obsService->AddObserver(this, "last-pb-context-exited", false));
+ MOZ_ALWAYS_SUCCEEDS(obsService->AddObserver(this, "browser:purge-session-history", false));
+
+#ifdef DEBUG
+ MOZ_ALWAYS_SUCCEEDS(obsService->AddObserver(this, "mediakeys-request", false));
+#endif
+
+ nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
+ if (prefs) {
+ prefs->AddObserver("media.gmp.plugin.crash", this, false);
+ }
+
+ nsresult rv = InitStorage();
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ // Kick off scanning for plugins
+ nsCOMPtr<nsIThread> thread;
+ rv = GetThread(getter_AddRefs(thread));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ // Detect if GMP storage has an incompatible version, and if so nuke it.
+ int32_t version = Preferences::GetInt("media.gmp.storage.version.observed", 0);
+ int32_t expected = Preferences::GetInt("media.gmp.storage.version.expected", 0);
+ if (version != expected) {
+ Preferences::SetInt("media.gmp.storage.version.observed", expected);
+ return GMPDispatch(NewRunnableMethod(
+ this, &GeckoMediaPluginServiceParent::ClearStorage));
+ }
+ return NS_OK;
+}
+
+already_AddRefed<nsIFile>
+CloneAndAppend(nsIFile* aFile, const nsAString& aDir)
+{
+ nsCOMPtr<nsIFile> f;
+ nsresult rv = aFile->Clone(getter_AddRefs(f));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return nullptr;
+ }
+
+ rv = f->Append(aDir);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return nullptr;
+ }
+ return f.forget();
+}
+
+static void
+MoveAndOverwrite(nsIFile* aOldParentDir,
+ nsIFile* aNewParentDir,
+ const nsAString& aSubDir)
+{
+ nsresult rv;
+
+ nsCOMPtr<nsIFile> srcDir(CloneAndAppend(aOldParentDir, aSubDir));
+ if (NS_WARN_IF(!srcDir)) {
+ return;
+ }
+
+ if (!FileExists(srcDir)) {
+ // No sub-directory to be migrated.
+ return;
+ }
+
+ // Ensure destination parent directory exists.
+ rv = aNewParentDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ nsCOMPtr<nsIFile> dstDir(CloneAndAppend(aNewParentDir, aSubDir));
+ if (FileExists(dstDir)) {
+ // We must have migrated before already, and then ran an old version
+ // of Gecko again which created storage at the old location. Overwrite
+ // the previously migrated storage.
+ rv = dstDir->Remove(true);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ // MoveTo will fail.
+ return;
+ }
+ }
+
+ rv = srcDir->MoveTo(aNewParentDir, EmptyString());
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+}
+
+static void
+MigratePreGecko42StorageDir(nsIFile* aOldStorageDir,
+ nsIFile* aNewStorageDir)
+{
+ MoveAndOverwrite(aOldStorageDir, aNewStorageDir, NS_LITERAL_STRING("id"));
+ MoveAndOverwrite(aOldStorageDir, aNewStorageDir, NS_LITERAL_STRING("storage"));
+}
+
+static void
+MigratePreGecko45StorageDir(nsIFile* aStorageDirBase)
+{
+ nsCOMPtr<nsIFile> adobeStorageDir(CloneAndAppend(aStorageDirBase, NS_LITERAL_STRING("gmp-eme-adobe")));
+ if (NS_WARN_IF(!adobeStorageDir)) {
+ return;
+ }
+
+ // The base storage dir in pre-45 contained "id" and "storage" subdirs.
+ // We assume all storage in the base storage dir that aren't known to GMP
+ // storage are records for the Adobe GMP.
+ MoveAndOverwrite(aStorageDirBase, adobeStorageDir, NS_LITERAL_STRING("id"));
+ MoveAndOverwrite(aStorageDirBase, adobeStorageDir, NS_LITERAL_STRING("storage"));
+}
+
+static nsresult
+GMPPlatformString(nsAString& aOutPlatform)
+{
+ // Append the OS and arch so that we don't reuse the storage if the profile is
+ // copied or used under a different bit-ness, or copied to another platform.
+ nsCOMPtr<nsIXULRuntime> runtime = do_GetService("@mozilla.org/xre/runtime;1");
+ if (!runtime) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsAutoCString OS;
+ nsresult rv = runtime->GetOS(OS);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ nsAutoCString arch;
+ rv = runtime->GetXPCOMABI(arch);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ nsCString platform;
+ platform.Append(OS);
+ platform.AppendLiteral("_");
+ platform.Append(arch);
+
+ aOutPlatform = NS_ConvertUTF8toUTF16(platform);
+
+ return NS_OK;
+}
+
+nsresult
+GeckoMediaPluginServiceParent::InitStorage()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // GMP storage should be used in the chrome process only.
+ if (!XRE_IsParentProcess()) {
+ return NS_OK;
+ }
+
+ // Directory service is main thread only, so cache the profile dir here
+ // so that we can use it off main thread.
+#ifdef MOZ_WIDGET_GONK
+ nsresult rv = NS_NewLocalFile(NS_LITERAL_STRING("/data/b2g/mozilla"), false, getter_AddRefs(mStorageBaseDir));
+#else
+ nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(mStorageBaseDir));
+#endif
+
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = mStorageBaseDir->AppendNative(NS_LITERAL_CSTRING("gmp"));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = mStorageBaseDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (NS_WARN_IF(NS_FAILED(rv) && rv != NS_ERROR_FILE_ALREADY_EXISTS)) {
+ return rv;
+ }
+
+ nsCOMPtr<nsIFile> gmpDirWithoutPlatform;
+ rv = mStorageBaseDir->Clone(getter_AddRefs(gmpDirWithoutPlatform));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ nsAutoString platform;
+ rv = GMPPlatformString(platform);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ rv = mStorageBaseDir->Append(platform);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = mStorageBaseDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (NS_WARN_IF(NS_FAILED(rv) && rv != NS_ERROR_FILE_ALREADY_EXISTS)) {
+ return rv;
+ }
+
+ // Prior to 42, GMP storage was stored in $profileDir/gmp/. After 42, it's
+ // stored in $profileDir/gmp/$platform/. So we must migrate any old records
+ // from the old location to the new location, for forwards compatibility.
+ MigratePreGecko42StorageDir(gmpDirWithoutPlatform, mStorageBaseDir);
+
+ // Prior to 45, GMP storage was not separated by plugin. In 45 and after,
+ // it's stored in $profile/gmp/$platform/$gmpName. So we must migrate old
+ // records from the old location to the new location, for forwards
+ // compatibility. We assume all directories in the base storage dir that
+ // aren't known to GMP storage are records for the Adobe GMP, since it
+ // was first.
+ MigratePreGecko45StorageDir(mStorageBaseDir);
+
+ return GeckoMediaPluginService::Init();
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aSomeData)
+{
+ LOGD(("%s::%s topic='%s' data='%s'", __CLASS__, __FUNCTION__,
+ aTopic, NS_ConvertUTF16toUTF8(aSomeData).get()));
+ if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
+ nsCOMPtr<nsIPrefBranch> branch( do_QueryInterface(aSubject) );
+ if (branch) {
+ bool crashNow = false;
+ if (NS_LITERAL_STRING("media.gmp.plugin.crash").Equals(aSomeData)) {
+ branch->GetBoolPref("media.gmp.plugin.crash", &crashNow);
+ }
+ if (crashNow) {
+ nsCOMPtr<nsIThread> gmpThread;
+ {
+ MutexAutoLock lock(mMutex);
+ gmpThread = mGMPThread;
+ }
+ if (gmpThread) {
+ gmpThread->Dispatch(WrapRunnable(this,
+ &GeckoMediaPluginServiceParent::CrashPlugins),
+ NS_DISPATCH_NORMAL);
+ }
+ }
+ }
+ } else if (!strcmp("profile-change-teardown", aTopic)) {
+
+ // How shutdown works:
+ //
+ // Some GMPs require time to do bookkeeping upon shutdown. These GMPs
+ // need to be given time to access storage during shutdown. To signal
+ // that time to shutdown is required, those GMPs implement the
+ // GMPAsyncShutdown interface.
+ //
+ // When we startup the child process, we query the GMP for the
+ // GMPAsyncShutdown interface, and if it's present, we send a message
+ // back to the GMPParent, which then registers the GMPParent by calling
+ // GMPService::AsyncShutdownNeeded().
+ //
+ // On shutdown, we set mWaitingForPluginsSyncShutdown to true, and then
+ // call UnloadPlugins on the GMPThread, and process events on the main
+ // thread until 1. An event sets mWaitingForPluginsSyncShutdown=false on
+ // the main thread; then 2. All async-shutdown plugins have indicated
+ // they have completed shutdown.
+ //
+ // UnloadPlugins() sends close messages for all plugins' API objects to
+ // the GMP interfaces in the child process, and then sends the async
+ // shutdown notifications to child GMPs. When a GMP has completed its
+ // shutdown, it calls GMPAsyncShutdownHost::ShutdownComplete(), which
+ // sends a message back to the parent, which calls
+ // GMPService::AsyncShutdownComplete(). If all plugins requiring async
+ // shutdown have called AsyncShutdownComplete() we stick a dummy event on
+ // the main thread, where the list of pending plugins is checked. We must
+ // use an event to do this, as we must ensure the main thread processes an
+ // event to run its loop. This will unblock the main thread, and shutdown
+ // of other components will proceed.
+ //
+ // During shutdown, each GMPParent starts a timer, and pretends shutdown
+ // is complete if it is taking too long.
+ //
+ // We shutdown in "profile-change-teardown", as the profile dir is
+ // still writable then, and it's required for GMPStorage. We block the
+ // shutdown process by spinning the main thread event loop until all GMPs
+ // have shutdown, or timeout has occurred.
+ //
+ // GMPStorage needs to work up until the shutdown-complete notification
+ // arrives from the GMP process.
+
+ mWaitingForPluginsSyncShutdown = true;
+
+ nsCOMPtr<nsIThread> gmpThread;
+ {
+ MutexAutoLock lock(mMutex);
+ MOZ_ASSERT(!mShuttingDown);
+ mShuttingDown = true;
+ gmpThread = mGMPThread;
+ }
+
+ if (gmpThread) {
+ LOGD(("%s::%s Starting to unload plugins, waiting for first sync shutdown..."
+ , __CLASS__, __FUNCTION__));
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(nullptr, '0',
+ NS_LITERAL_CSTRING("Dispatching UnloadPlugins"));
+#endif
+ gmpThread->Dispatch(
+ NewRunnableMethod(this,
+ &GeckoMediaPluginServiceParent::UnloadPlugins),
+ NS_DISPATCH_NORMAL);
+
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(nullptr, '1',
+ NS_LITERAL_CSTRING("Waiting for sync shutdown"));
+#endif
+ // Wait for UnloadPlugins() to do initial sync shutdown...
+ while (mWaitingForPluginsSyncShutdown) {
+ NS_ProcessNextEvent(NS_GetCurrentThread(), true);
+ }
+
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(nullptr, '4',
+ NS_LITERAL_CSTRING("Waiting for async shutdown"));
+#endif
+ // Wait for other plugins (if any) to do async shutdown...
+ auto syncShutdownPluginsRemaining =
+ std::numeric_limits<decltype(mAsyncShutdownPlugins.Length())>::max();
+ for (;;) {
+ {
+ MutexAutoLock lock(mMutex);
+ if (mAsyncShutdownPlugins.IsEmpty()) {
+ LOGD(("%s::%s Finished unloading all plugins"
+ , __CLASS__, __FUNCTION__));
+#if defined(MOZ_CRASHREPORTER)
+ CrashReporter::RemoveCrashReportAnnotation(
+ NS_LITERAL_CSTRING("AsyncPluginShutdown"));
+#endif
+ break;
+ } else if (mAsyncShutdownPlugins.Length() < syncShutdownPluginsRemaining) {
+ // First time here, or number of pending plugins has decreased.
+ // -> Update list of pending plugins in crash report.
+ syncShutdownPluginsRemaining = mAsyncShutdownPlugins.Length();
+ LOGD(("%s::%s Still waiting for %d plugins to shutdown..."
+ , __CLASS__, __FUNCTION__, (int)syncShutdownPluginsRemaining));
+#if defined(MOZ_CRASHREPORTER)
+ nsAutoCString names;
+ for (const auto& plugin : mAsyncShutdownPlugins) {
+ if (!names.IsEmpty()) { names.Append(NS_LITERAL_CSTRING(", ")); }
+ names.Append(plugin->GetDisplayName());
+ }
+ CrashReporter::AnnotateCrashReport(
+ NS_LITERAL_CSTRING("AsyncPluginShutdown"),
+ names);
+#endif
+ }
+ }
+ NS_ProcessNextEvent(NS_GetCurrentThread(), true);
+ }
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(nullptr, '5',
+ NS_LITERAL_CSTRING("Async shutdown complete"));
+#endif
+ } else {
+ // GMP thread has already shutdown.
+ MOZ_ASSERT(mPlugins.IsEmpty());
+ mWaitingForPluginsSyncShutdown = false;
+ }
+
+ } else if (!strcmp(NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID, aTopic)) {
+ MOZ_ASSERT(mShuttingDown);
+ ShutdownGMPThread();
+ } else if (!strcmp("last-pb-context-exited", aTopic)) {
+ // When Private Browsing mode exits, all we need to do is clear
+ // mTempNodeIds. This drops all the node ids we've cached in memory
+ // for PB origin-pairs. If we try to open an origin-pair for non-PB
+ // mode, we'll get the NodeId salt stored on-disk, and if we try to
+ // open a PB mode origin-pair, we'll re-generate new salt.
+ mTempNodeIds.Clear();
+ } else if (!strcmp("browser:purge-session-history", aTopic)) {
+ // Clear everything!
+ if (!aSomeData || nsDependentString(aSomeData).IsEmpty()) {
+ return GMPDispatch(NewRunnableMethod(
+ this, &GeckoMediaPluginServiceParent::ClearStorage));
+ }
+
+ // Clear nodeIds/records modified after |t|.
+ nsresult rv;
+ PRTime t = nsDependentString(aSomeData).ToInteger64(&rv, 10);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ return GMPDispatch(NewRunnableMethod<PRTime>(
+ this, &GeckoMediaPluginServiceParent::ClearRecentHistoryOnGMPThread,
+ t));
+ }
+
+ return NS_OK;
+}
+
+RefPtr<GenericPromise>
+GeckoMediaPluginServiceParent::EnsureInitialized() {
+ MonitorAutoLock lock(mInitPromiseMonitor);
+ if (mLoadPluginsFromDiskComplete) {
+ return GenericPromise::CreateAndResolve(true, __func__);
+ }
+ // We should have an init promise in flight.
+ MOZ_ASSERT(!mInitPromise.IsEmpty());
+ return mInitPromise.Ensure(__func__);
+}
+
+bool
+GeckoMediaPluginServiceParent::GetContentParentFrom(GMPCrashHelper* aHelper,
+ const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ UniquePtr<GetGMPContentParentCallback>&& aCallback)
+{
+ RefPtr<AbstractThread> thread(GetAbstractGMPThread());
+ if (!thread) {
+ return false;
+ }
+
+ RefPtr<GeckoMediaPluginServiceParent> self(this);
+ nsCString nodeId(aNodeId);
+ nsTArray<nsCString> tags(aTags);
+ nsCString api(aAPI);
+ GetGMPContentParentCallback* rawCallback = aCallback.release();
+ RefPtr<GMPCrashHelper> helper(aHelper);
+ EnsureInitialized()->Then(thread, __func__,
+ [self, tags, api, nodeId, rawCallback, helper]() -> void {
+ UniquePtr<GetGMPContentParentCallback> callback(rawCallback);
+ RefPtr<GMPParent> gmp = self->SelectPluginForAPI(nodeId, api, tags);
+ LOGD(("%s: %p returning %p for api %s", __FUNCTION__, (void *)self, (void *)gmp, api.get()));
+ if (!gmp) {
+ NS_WARNING("GeckoMediaPluginServiceParent::GetContentParentFrom failed");
+ callback->Done(nullptr);
+ return;
+ }
+ self->ConnectCrashHelper(gmp->GetPluginId(), helper);
+ gmp->GetGMPContentParent(Move(callback));
+ },
+ [rawCallback]() -> void {
+ UniquePtr<GetGMPContentParentCallback> callback(rawCallback);
+ NS_WARNING("GMPService::EnsureInitialized failed.");
+ callback->Done(nullptr);
+ });
+ return true;
+}
+
+void
+GeckoMediaPluginServiceParent::InitializePlugins(
+ AbstractThread* aAbstractGMPThread)
+{
+ MOZ_ASSERT(aAbstractGMPThread);
+ MonitorAutoLock lock(mInitPromiseMonitor);
+ if (mLoadPluginsFromDiskComplete) {
+ return;
+ }
+
+ RefPtr<GeckoMediaPluginServiceParent> self(this);
+ RefPtr<GenericPromise> p = mInitPromise.Ensure(__func__);
+ InvokeAsync(aAbstractGMPThread, this, __func__,
+ &GeckoMediaPluginServiceParent::LoadFromEnvironment)
+ ->Then(aAbstractGMPThread, __func__,
+ [self]() -> void {
+ MonitorAutoLock lock(self->mInitPromiseMonitor);
+ self->mLoadPluginsFromDiskComplete = true;
+ self->mInitPromise.Resolve(true, __func__);
+ },
+ [self]() -> void {
+ MonitorAutoLock lock(self->mInitPromiseMonitor);
+ self->mLoadPluginsFromDiskComplete = true;
+ self->mInitPromise.Reject(NS_ERROR_FAILURE, __func__);
+ });
+}
+
+void
+GeckoMediaPluginServiceParent::AsyncShutdownNeeded(GMPParent* aParent)
+{
+ LOGD(("%s::%s %p", __CLASS__, __FUNCTION__, aParent));
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+
+ MutexAutoLock lock(mMutex);
+ MOZ_ASSERT(!mAsyncShutdownPlugins.Contains(aParent));
+ mAsyncShutdownPlugins.AppendElement(aParent);
+}
+
+void
+GeckoMediaPluginServiceParent::AsyncShutdownComplete(GMPParent* aParent)
+{
+ LOGD(("%s::%s %p '%s'", __CLASS__, __FUNCTION__,
+ aParent, aParent->GetDisplayName().get()));
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+
+ {
+ MutexAutoLock lock(mMutex);
+ mAsyncShutdownPlugins.RemoveElement(aParent);
+ }
+
+ if (mShuttingDownOnGMPThread) {
+ // The main thread may be waiting for async shutdown of plugins,
+ // one of which has completed. Wake up the main thread by sending a task.
+ nsCOMPtr<nsIRunnable> task(NewRunnableMethod(
+ this, &GeckoMediaPluginServiceParent::NotifyAsyncShutdownComplete));
+ NS_DispatchToMainThread(task);
+ }
+}
+
+#ifdef MOZ_CRASHREPORTER
+void
+GeckoMediaPluginServiceParent::SetAsyncShutdownPluginState(GMPParent* aGMPParent,
+ char aId,
+ const nsCString& aState)
+{
+ MutexAutoLock lock(mAsyncShutdownPluginStatesMutex);
+ if (!aGMPParent) {
+ mAsyncShutdownPluginStates.Update(NS_LITERAL_CSTRING("-"),
+ NS_LITERAL_CSTRING("-"),
+ aId,
+ aState);
+ return;
+ }
+ mAsyncShutdownPluginStates.Update(aGMPParent->GetDisplayName(),
+ nsPrintfCString("%p", aGMPParent),
+ aId,
+ aState);
+}
+
+void
+GeckoMediaPluginServiceParent::AsyncShutdownPluginStates::Update(const nsCString& aPlugin,
+ const nsCString& aInstance,
+ char aId,
+ const nsCString& aState)
+{
+ nsCString note;
+ StatesByInstance* instances = mStates.LookupOrAdd(aPlugin);
+ if (!instances) { return; }
+ State* state = instances->LookupOrAdd(aInstance);
+ if (!state) { return; }
+ state->mStateSequence += aId;
+ state->mLastStateDescription = aState;
+ note += '{';
+ bool firstPlugin = true;
+ for (auto pluginIt = mStates.ConstIter(); !pluginIt.Done(); pluginIt.Next()) {
+ if (!firstPlugin) { note += ','; } else { firstPlugin = false; }
+ note += pluginIt.Key();
+ note += ":{";
+ bool firstInstance = true;
+ for (auto instanceIt = pluginIt.UserData()->ConstIter(); !instanceIt.Done(); instanceIt.Next()) {
+ if (!firstInstance) { note += ','; } else { firstInstance = false; }
+ note += instanceIt.Key();
+ note += ":\"";
+ note += instanceIt.UserData()->mStateSequence;
+ note += '=';
+ note += instanceIt.UserData()->mLastStateDescription;
+ note += '"';
+ }
+ note += '}';
+ }
+ note += '}';
+ LOGD(("%s::%s states[%s][%s]='%c'/'%s' -> %s", __CLASS__, __FUNCTION__,
+ aPlugin.get(), aInstance.get(), aId, aState.get(), note.get()));
+ CrashReporter::AnnotateCrashReport(
+ NS_LITERAL_CSTRING("AsyncPluginShutdownStates"),
+ note);
+}
+#endif // MOZ_CRASHREPORTER
+
+void
+GeckoMediaPluginServiceParent::NotifyAsyncShutdownComplete()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Nothing to do, this task is just used to wake up the event loop in Observe().
+}
+
+void
+GeckoMediaPluginServiceParent::NotifySyncShutdownComplete()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mWaitingForPluginsSyncShutdown = false;
+}
+
+bool
+GeckoMediaPluginServiceParent::IsShuttingDown()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ return mShuttingDownOnGMPThread;
+}
+
+void
+GeckoMediaPluginServiceParent::UnloadPlugins()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ MOZ_ASSERT(!mShuttingDownOnGMPThread);
+ mShuttingDownOnGMPThread = true;
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(nullptr, '2',
+ NS_LITERAL_CSTRING("Starting to unload plugins"));
+#endif
+
+ nsTArray<RefPtr<GMPParent>> plugins;
+ {
+ MutexAutoLock lock(mMutex);
+ // Move all plugins references to a local array. This way mMutex won't be
+ // locked when calling CloseActive (to avoid inter-locking).
+ Swap(plugins, mPlugins);
+ }
+
+ LOGD(("%s::%s plugins:%u including async:%u", __CLASS__, __FUNCTION__,
+ plugins.Length(), mAsyncShutdownPlugins.Length()));
+#ifdef DEBUG
+ for (const auto& plugin : plugins) {
+ LOGD(("%s::%s plugin: '%s'", __CLASS__, __FUNCTION__,
+ plugin->GetDisplayName().get()));
+ }
+ for (const auto& plugin : mAsyncShutdownPlugins) {
+ LOGD(("%s::%s async plugin: '%s'", __CLASS__, __FUNCTION__,
+ plugin->GetDisplayName().get()));
+ }
+#endif
+ // Note: CloseActive may be async; it could actually finish
+ // shutting down when all the plugins have unloaded.
+ for (const auto& plugin : plugins) {
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(plugin, 'S',
+ NS_LITERAL_CSTRING("CloseActive"));
+#endif
+ plugin->CloseActive(true);
+ }
+
+#ifdef MOZ_CRASHREPORTER
+ SetAsyncShutdownPluginState(nullptr, '3',
+ NS_LITERAL_CSTRING("Dispatching sync-shutdown-complete"));
+#endif
+ nsCOMPtr<nsIRunnable> task(NewRunnableMethod(
+ this, &GeckoMediaPluginServiceParent::NotifySyncShutdownComplete));
+ NS_DispatchToMainThread(task);
+}
+
+void
+GeckoMediaPluginServiceParent::CrashPlugins()
+{
+ LOGD(("%s::%s", __CLASS__, __FUNCTION__));
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+
+ MutexAutoLock lock(mMutex);
+ for (size_t i = 0; i < mPlugins.Length(); i++) {
+ mPlugins[i]->Crash();
+ }
+}
+
+RefPtr<GenericPromise::AllPromiseType>
+GeckoMediaPluginServiceParent::LoadFromEnvironment()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ RefPtr<AbstractThread> thread(GetAbstractGMPThread());
+ if (!thread) {
+ return GenericPromise::AllPromiseType::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ const char* env = PR_GetEnv("MOZ_GMP_PATH");
+ if (!env || !*env) {
+ return GenericPromise::AllPromiseType::CreateAndResolve(true, __func__);
+ }
+
+ nsString allpaths;
+ if (NS_WARN_IF(NS_FAILED(NS_CopyNativeToUnicode(nsDependentCString(env), allpaths)))) {
+ return GenericPromise::AllPromiseType::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ nsTArray<RefPtr<GenericPromise>> promises;
+ uint32_t pos = 0;
+ while (pos < allpaths.Length()) {
+ // Loop over multiple path entries separated by colons (*nix) or
+ // semicolons (Windows)
+ int32_t next = allpaths.FindChar(XPCOM_ENV_PATH_SEPARATOR[0], pos);
+ if (next == -1) {
+ promises.AppendElement(AddOnGMPThread(nsString(Substring(allpaths, pos))));
+ break;
+ } else {
+ promises.AppendElement(AddOnGMPThread(nsString(Substring(allpaths, pos, next - pos))));
+ pos = next + 1;
+ }
+ }
+
+ mScannedPluginOnDisk = true;
+ return GenericPromise::All(thread, promises);
+}
+
+class NotifyObserversTask final : public mozilla::Runnable {
+public:
+ explicit NotifyObserversTask(const char* aTopic, nsString aData = EmptyString())
+ : mTopic(aTopic)
+ , mData(aData)
+ {}
+ NS_IMETHOD Run() override {
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ MOZ_ASSERT(obsService);
+ if (obsService) {
+ obsService->NotifyObservers(nullptr, mTopic, mData.get());
+ }
+ return NS_OK;
+ }
+private:
+ ~NotifyObserversTask() {}
+ const char* mTopic;
+ const nsString mData;
+};
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::PathRunnable::Run()
+{
+ mService->RemoveOnGMPThread(mPath,
+ mOperation == REMOVE_AND_DELETE_FROM_DISK,
+ mDefer);
+
+ mService->UpdateContentProcessGMPCapabilities();
+ return NS_OK;
+}
+
+void
+GeckoMediaPluginServiceParent::UpdateContentProcessGMPCapabilities()
+{
+ if (!NS_IsMainThread()) {
+ nsCOMPtr<nsIRunnable> task =
+ NewRunnableMethod(this, &GeckoMediaPluginServiceParent::UpdateContentProcessGMPCapabilities);
+ NS_DispatchToMainThread(task);
+ return;
+ }
+
+ typedef mozilla::dom::GMPCapabilityData GMPCapabilityData;
+ typedef mozilla::dom::GMPAPITags GMPAPITags;
+ typedef mozilla::dom::ContentParent ContentParent;
+
+ nsTArray<GMPCapabilityData> caps;
+ {
+ MutexAutoLock lock(mMutex);
+ for (const RefPtr<GMPParent>& gmp : mPlugins) {
+ // We have multiple instances of a GMPParent for a given GMP in the
+ // list, one per origin. So filter the list so that we don't include
+ // the same GMP's capabilities twice.
+ NS_ConvertUTF16toUTF8 name(gmp->GetPluginBaseName());
+ bool found = false;
+ for (const GMPCapabilityData& cap : caps) {
+ if (cap.name().Equals(name)) {
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ continue;
+ }
+ GMPCapabilityData x;
+ x.name() = name;
+ x.version() = gmp->GetVersion();
+ for (const GMPCapability& tag : gmp->GetCapabilities()) {
+ x.capabilities().AppendElement(GMPAPITags(tag.mAPIName, tag.mAPITags));
+ }
+ caps.AppendElement(Move(x));
+ }
+ }
+ for (auto* cp : ContentParent::AllProcesses(ContentParent::eLive)) {
+ Unused << cp->SendGMPsChanged(caps);
+ }
+
+ // For non-e10s, we must fire a notification so that any MediaKeySystemAccess
+ // requests waiting on a CDM to download will retry.
+ nsCOMPtr<nsIObserverService> obsService = mozilla::services::GetObserverService();
+ MOZ_ASSERT(obsService);
+ if (obsService) {
+ obsService->NotifyObservers(nullptr, "gmp-changed", nullptr);
+ }
+}
+
+RefPtr<GenericPromise>
+GeckoMediaPluginServiceParent::AsyncAddPluginDirectory(const nsAString& aDirectory)
+{
+ RefPtr<AbstractThread> thread(GetAbstractGMPThread());
+ if (!thread) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ nsString dir(aDirectory);
+ RefPtr<GeckoMediaPluginServiceParent> self = this;
+ return InvokeAsync(thread, this, __func__, &GeckoMediaPluginServiceParent::AddOnGMPThread, dir)
+ ->Then(AbstractThread::MainThread(), __func__,
+ [dir, self]() -> void {
+ LOGD(("GeckoMediaPluginServiceParent::AsyncAddPluginDirectory %s succeeded",
+ NS_ConvertUTF16toUTF8(dir).get()));
+ MOZ_ASSERT(NS_IsMainThread());
+ self->UpdateContentProcessGMPCapabilities();
+ },
+ [dir]() -> void {
+ LOGD(("GeckoMediaPluginServiceParent::AsyncAddPluginDirectory %s failed",
+ NS_ConvertUTF16toUTF8(dir).get()));
+ })
+ ->CompletionPromise();
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::AddPluginDirectory(const nsAString& aDirectory)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<GenericPromise> p = AsyncAddPluginDirectory(aDirectory);
+ Unused << p;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::RemovePluginDirectory(const nsAString& aDirectory)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return GMPDispatch(new PathRunnable(this, aDirectory,
+ PathRunnable::EOperation::REMOVE));
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::RemoveAndDeletePluginDirectory(
+ const nsAString& aDirectory, const bool aDefer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return GMPDispatch(
+ new PathRunnable(this, aDirectory,
+ PathRunnable::EOperation::REMOVE_AND_DELETE_FROM_DISK,
+ aDefer));
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::HasPluginForAPI(const nsACString& aAPI,
+ nsTArray<nsCString>* aTags,
+ bool* aHasPlugin)
+{
+ NS_ENSURE_ARG(aTags && aTags->Length() > 0);
+ NS_ENSURE_ARG(aHasPlugin);
+
+ nsresult rv = EnsurePluginsOnDiskScanned();
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Failed to load GMPs from disk.");
+ return rv;
+ }
+
+ {
+ MutexAutoLock lock(mMutex);
+ nsCString api(aAPI);
+ size_t index = 0;
+ RefPtr<GMPParent> gmp = FindPluginForAPIFrom(index, api, *aTags, &index);
+ *aHasPlugin = !!gmp;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+GeckoMediaPluginServiceParent::EnsurePluginsOnDiskScanned()
+{
+ const char* env = nullptr;
+ if (!mScannedPluginOnDisk && (env = PR_GetEnv("MOZ_GMP_PATH")) && *env) {
+ // We have a MOZ_GMP_PATH environment variable which may specify the
+ // location of plugins to load, and we haven't yet scanned the disk to
+ // see if there are plugins there. Get the GMP thread, which will
+ // cause an event to be dispatched to which scans for plugins. We
+ // dispatch a sync event to the GMP thread here in order to wait until
+ // after the GMP thread has scanned any paths in MOZ_GMP_PATH.
+ nsresult rv = GMPDispatch(new mozilla::Runnable(), NS_DISPATCH_SYNC);
+ NS_ENSURE_SUCCESS(rv, rv);
+ MOZ_ASSERT(mScannedPluginOnDisk, "Should have scanned MOZ_GMP_PATH by now");
+ }
+
+ return NS_OK;
+}
+
+already_AddRefed<GMPParent>
+GeckoMediaPluginServiceParent::FindPluginForAPIFrom(size_t aSearchStartIndex,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ size_t* aOutPluginIndex)
+{
+ mMutex.AssertCurrentThreadOwns();
+ for (size_t i = aSearchStartIndex; i < mPlugins.Length(); i++) {
+ RefPtr<GMPParent> gmp = mPlugins[i];
+ if (!GMPCapability::Supports(gmp->GetCapabilities(), aAPI, aTags)) {
+ continue;
+ }
+ if (aOutPluginIndex) {
+ *aOutPluginIndex = i;
+ }
+ return gmp.forget();
+ }
+ return nullptr;
+}
+
+already_AddRefed<GMPParent>
+GeckoMediaPluginServiceParent::SelectPluginForAPI(const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread,
+ "Can't clone GMP plugins on non-GMP threads.");
+
+ GMPParent* gmpToClone = nullptr;
+ {
+ MutexAutoLock lock(mMutex);
+ size_t index = 0;
+ RefPtr<GMPParent> gmp;
+ while ((gmp = FindPluginForAPIFrom(index, aAPI, aTags, &index))) {
+ if (aNodeId.IsEmpty()) {
+ if (gmp->CanBeSharedCrossNodeIds()) {
+ return gmp.forget();
+ }
+ } else if (gmp->CanBeUsedFrom(aNodeId)) {
+ return gmp.forget();
+ }
+
+ if (!gmpToClone ||
+ (gmpToClone->IsMarkedForDeletion() && !gmp->IsMarkedForDeletion())) {
+ // This GMP has the correct type but has the wrong nodeId; hold on to it
+ // in case we need to clone it.
+ // Prefer GMPs in-use for the case where an upgraded plugin version is
+ // waiting for the old one to die. If the old plugin is in use, we
+ // should continue using it so that any persistent state remains
+ // consistent. Otherwise, just check that the plugin isn't scheduled
+ // for deletion.
+ gmpToClone = gmp;
+ }
+ // Loop around and try the next plugin; it may be usable from aNodeId.
+ index++;
+ }
+ }
+
+ // Plugin exists, but we can't use it due to cross-origin separation. Create a
+ // new one.
+ if (gmpToClone) {
+ RefPtr<GMPParent> clone = ClonePlugin(gmpToClone);
+ {
+ MutexAutoLock lock(mMutex);
+ mPlugins.AppendElement(clone);
+ }
+ if (!aNodeId.IsEmpty()) {
+ clone->SetNodeId(aNodeId);
+ }
+ return clone.forget();
+ }
+
+ return nullptr;
+}
+
+RefPtr<GMPParent>
+CreateGMPParent()
+{
+#if defined(XP_LINUX) && defined(MOZ_GMP_SANDBOX)
+ if (!SandboxInfo::Get().CanSandboxMedia()) {
+ if (!MediaPrefs::GMPAllowInsecure()) {
+ NS_WARNING("Denying media plugin load due to lack of sandboxing.");
+ return nullptr;
+ }
+ NS_WARNING("Loading media plugin despite lack of sandboxing.");
+ }
+#endif
+ return new GMPParent();
+}
+
+already_AddRefed<GMPParent>
+GeckoMediaPluginServiceParent::ClonePlugin(const GMPParent* aOriginal)
+{
+ MOZ_ASSERT(aOriginal);
+
+ RefPtr<GMPParent> gmp = CreateGMPParent();
+ nsresult rv = gmp ? gmp->CloneFrom(aOriginal) : NS_ERROR_NOT_AVAILABLE;
+
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Can't Create GMPParent");
+ return nullptr;
+ }
+
+ return gmp.forget();
+}
+
+RefPtr<GenericPromise>
+GeckoMediaPluginServiceParent::AddOnGMPThread(nsString aDirectory)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ nsCString dir = NS_ConvertUTF16toUTF8(aDirectory);
+ RefPtr<AbstractThread> thread(GetAbstractGMPThread());
+ if (!thread) {
+ LOGD(("%s::%s: %s No GMP Thread", __CLASS__, __FUNCTION__, dir.get()));
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+ LOGD(("%s::%s: %s", __CLASS__, __FUNCTION__, dir.get()));
+
+ nsCOMPtr<nsIFile> directory;
+ nsresult rv = NS_NewLocalFile(aDirectory, false, getter_AddRefs(directory));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ RefPtr<GMPParent> gmp = CreateGMPParent();
+ if (!gmp) {
+ NS_WARNING("Can't Create GMPParent");
+ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+
+ RefPtr<GeckoMediaPluginServiceParent> self(this);
+ return gmp->Init(this, directory)->Then(thread, __func__,
+ [gmp, self, dir]() -> void {
+ LOGD(("%s::%s: %s Succeeded", __CLASS__, __FUNCTION__, dir.get()));
+ {
+ MutexAutoLock lock(self->mMutex);
+ self->mPlugins.AppendElement(gmp);
+ }
+ },
+ [dir]() -> void {
+ LOGD(("%s::%s: %s Failed", __CLASS__, __FUNCTION__, dir.get()));
+ })
+ ->CompletionPromise();
+}
+
+void
+GeckoMediaPluginServiceParent::RemoveOnGMPThread(const nsAString& aDirectory,
+ const bool aDeleteFromDisk,
+ const bool aCanDefer)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ LOGD(("%s::%s: %s", __CLASS__, __FUNCTION__, NS_LossyConvertUTF16toASCII(aDirectory).get()));
+
+ nsCOMPtr<nsIFile> directory;
+ nsresult rv = NS_NewLocalFile(aDirectory, false, getter_AddRefs(directory));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ // Plugin destruction can modify |mPlugins|. Put them aside for now and
+ // destroy them once we're done with |mPlugins|.
+ nsTArray<RefPtr<GMPParent>> deadPlugins;
+
+ bool inUse = false;
+ MutexAutoLock lock(mMutex);
+ for (size_t i = mPlugins.Length(); i-- > 0; ) {
+ nsCOMPtr<nsIFile> pluginpath = mPlugins[i]->GetDirectory();
+ bool equals;
+ if (NS_FAILED(directory->Equals(pluginpath, &equals)) || !equals) {
+ continue;
+ }
+
+ RefPtr<GMPParent> gmp = mPlugins[i];
+ if (aDeleteFromDisk && gmp->State() != GMPStateNotLoaded) {
+ // We have to wait for the child process to release its lib handle
+ // before we can delete the GMP.
+ inUse = true;
+ gmp->MarkForDeletion();
+
+ if (!mPluginsWaitingForDeletion.Contains(aDirectory)) {
+ mPluginsWaitingForDeletion.AppendElement(aDirectory);
+ }
+ }
+
+ if (gmp->State() == GMPStateNotLoaded || !aCanDefer) {
+ // GMP not in use or shutdown is being forced; can shut it down now.
+ deadPlugins.AppendElement(gmp);
+ mPlugins.RemoveElementAt(i);
+ }
+ }
+
+ {
+ MutexAutoUnlock unlock(mMutex);
+ for (auto& gmp : deadPlugins) {
+ gmp->AbortAsyncShutdown();
+ gmp->CloseActive(true);
+ }
+ }
+
+ if (aDeleteFromDisk && !inUse) {
+ // Ensure the GMP dir and all files in it are writable, so we have
+ // permission to delete them.
+ directory->SetPermissions(0700);
+ DirectoryEnumerator iter(directory, DirectoryEnumerator::FilesAndDirs);
+ for (nsCOMPtr<nsIFile> dirEntry; (dirEntry = iter.Next()) != nullptr;) {
+ dirEntry->SetPermissions(0700);
+ }
+ if (NS_SUCCEEDED(directory->Remove(true))) {
+ mPluginsWaitingForDeletion.RemoveElement(aDirectory);
+ NS_DispatchToMainThread(new NotifyObserversTask("gmp-directory-deleted",
+ nsString(aDirectory)),
+ NS_DISPATCH_NORMAL);
+ }
+ }
+}
+
+// May remove when Bug 1043671 is fixed
+static void Dummy(RefPtr<GMPParent>& aOnDeathsDoor)
+{
+ // exists solely to do nothing and let the Runnable kill the GMPParent
+ // when done.
+}
+
+void
+GeckoMediaPluginServiceParent::PluginTerminated(const RefPtr<GMPParent>& aPlugin)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+
+ if (aPlugin->IsMarkedForDeletion()) {
+ nsCString path8;
+ RefPtr<nsIFile> dir = aPlugin->GetDirectory();
+ nsresult rv = dir->GetNativePath(path8);
+ NS_ENSURE_SUCCESS_VOID(rv);
+
+ nsString path = NS_ConvertUTF8toUTF16(path8);
+ if (mPluginsWaitingForDeletion.Contains(path)) {
+ RemoveOnGMPThread(path, true /* delete */, true /* can defer */);
+ }
+ }
+}
+
+void
+GeckoMediaPluginServiceParent::ReAddOnGMPThread(const RefPtr<GMPParent>& aOld)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ LOGD(("%s::%s: %p", __CLASS__, __FUNCTION__, (void*) aOld));
+
+ RefPtr<GMPParent> gmp;
+ if (!mShuttingDownOnGMPThread) {
+ // We're not shutting down, so replace the old plugin in the list with a
+ // clone which is in a pristine state. Note: We place the plugin in
+ // the same slot in the array as a hack to ensure if we re-request with
+ // the same capabilities we get an instance of the same plugin.
+ gmp = ClonePlugin(aOld);
+ MutexAutoLock lock(mMutex);
+ MOZ_ASSERT(mPlugins.Contains(aOld));
+ if (mPlugins.Contains(aOld)) {
+ mPlugins[mPlugins.IndexOf(aOld)] = gmp;
+ }
+ } else {
+ // We're shutting down; don't re-add plugin, let the old plugin die.
+ MutexAutoLock lock(mMutex);
+ mPlugins.RemoveElement(aOld);
+ }
+ // Schedule aOld to be destroyed. We can't destroy it from here since we
+ // may be inside ActorDestroyed() for it.
+ NS_DispatchToCurrentThread(WrapRunnableNM(&Dummy, aOld));
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::GetStorageDir(nsIFile** aOutFile)
+{
+ if (NS_WARN_IF(!mStorageBaseDir)) {
+ return NS_ERROR_FAILURE;
+ }
+ return mStorageBaseDir->Clone(aOutFile);
+}
+
+static nsresult
+WriteToFile(nsIFile* aPath,
+ const nsCString& aFileName,
+ const nsCString& aData)
+{
+ nsCOMPtr<nsIFile> path;
+ nsresult rv = aPath->Clone(getter_AddRefs(path));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = path->AppendNative(aFileName);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ PRFileDesc* f = nullptr;
+ rv = path->OpenNSPRFileDesc(PR_WRONLY | PR_CREATE_FILE, PR_IRWXU, &f);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ int32_t len = PR_Write(f, aData.get(), aData.Length());
+ PR_Close(f);
+ if (NS_WARN_IF(len < 0 || (size_t)len != aData.Length())) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+static nsresult
+ReadFromFile(nsIFile* aPath,
+ const nsACString& aFileName,
+ nsACString& aOutData,
+ int32_t aMaxLength)
+{
+ nsCOMPtr<nsIFile> path;
+ nsresult rv = aPath->Clone(getter_AddRefs(path));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = path->AppendNative(aFileName);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ PRFileDesc* f = nullptr;
+ rv = path->OpenNSPRFileDesc(PR_RDONLY | PR_CREATE_FILE, PR_IRWXU, &f);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ auto size = PR_Seek(f, 0, PR_SEEK_END);
+ PR_Seek(f, 0, PR_SEEK_SET);
+
+ if (size > aMaxLength) {
+ return NS_ERROR_FAILURE;
+ }
+ aOutData.SetLength(size);
+
+ auto len = PR_Read(f, aOutData.BeginWriting(), size);
+ PR_Close(f);
+ if (NS_WARN_IF(len != size)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+ReadSalt(nsIFile* aPath, nsACString& aOutData)
+{
+ return ReadFromFile(aPath, NS_LITERAL_CSTRING("salt"),
+ aOutData, NodeIdSaltLength);
+
+}
+
+already_AddRefed<GMPStorage>
+GeckoMediaPluginServiceParent::GetMemoryStorageFor(const nsACString& aNodeId)
+{
+ RefPtr<GMPStorage> s;
+ if (!mTempGMPStorage.Get(aNodeId, getter_AddRefs(s))) {
+ s = CreateGMPMemoryStorage();
+ mTempGMPStorage.Put(aNodeId, s);
+ }
+ return s.forget();
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::IsPersistentStorageAllowed(const nsACString& aNodeId,
+ bool* aOutAllowed)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ NS_ENSURE_ARG(aOutAllowed);
+ // We disallow persistent storage for the NodeId used for shared GMP
+ // decoding, to prevent GMP decoding being used to track what a user
+ // watches somehow.
+ *aOutAllowed = !aNodeId.Equals(SHARED_GMP_DECODING_NODE_ID) &&
+ mPersistentStorageAllowed.Get(aNodeId);
+ return NS_OK;
+}
+
+nsresult
+GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing,
+ nsACString& aOutId)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ LOGD(("%s::%s: (%s, %s), %s", __CLASS__, __FUNCTION__,
+ NS_ConvertUTF16toUTF8(aOrigin).get(),
+ NS_ConvertUTF16toUTF8(aTopLevelOrigin).get(),
+ (aInPrivateBrowsing ? "PrivateBrowsing" : "NonPrivateBrowsing")));
+
+ nsresult rv;
+
+ if (aOrigin.EqualsLiteral("null") ||
+ aOrigin.IsEmpty() ||
+ aTopLevelOrigin.EqualsLiteral("null") ||
+ aTopLevelOrigin.IsEmpty()) {
+ // (origin, topLevelOrigin) is null or empty; this is for an anonymous
+ // origin, probably a local file, for which we don't provide persistent storage.
+ // Generate a random node id, and don't store it so that the GMP's storage
+ // is temporary and the process for this GMP is not shared with GMP
+ // instances that have the same nodeId.
+ nsAutoCString salt;
+ rv = GenerateRandomPathName(salt, NodeIdSaltLength);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ aOutId = salt;
+ mPersistentStorageAllowed.Put(salt, false);
+ return NS_OK;
+ }
+
+ const uint32_t hash = AddToHash(HashString(aOrigin),
+ HashString(aTopLevelOrigin));
+
+ if (aInPrivateBrowsing) {
+ // For PB mode, we store the node id, indexed by the origin pair and GMP name,
+ // so that if the same origin pair is opened for the same GMP in this session,
+ // it gets the same node id.
+ const uint32_t pbHash = AddToHash(HashString(aGMPName), hash);
+ nsCString* salt = nullptr;
+ if (!(salt = mTempNodeIds.Get(pbHash))) {
+ // No salt stored, generate and temporarily store some for this id.
+ nsAutoCString newSalt;
+ rv = GenerateRandomPathName(newSalt, NodeIdSaltLength);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ salt = new nsCString(newSalt);
+ mTempNodeIds.Put(pbHash, salt);
+ mPersistentStorageAllowed.Put(*salt, false);
+ }
+ aOutId = *salt;
+ return NS_OK;
+ }
+
+ // Otherwise, try to see if we've previously generated and stored salt
+ // for this origin pair.
+ nsCOMPtr<nsIFile> path; // $profileDir/gmp/$platform/
+ rv = GetStorageDir(getter_AddRefs(path));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = path->Append(aGMPName);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ // $profileDir/gmp/$platform/$gmpName/
+ rv = path->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = path->AppendNative(NS_LITERAL_CSTRING("id"));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ // $profileDir/gmp/$platform/$gmpName/id/
+ rv = path->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ nsAutoCString hashStr;
+ hashStr.AppendInt((int64_t)hash);
+
+ // $profileDir/gmp/$platform/$gmpName/id/$hash
+ rv = path->AppendNative(hashStr);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = path->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ if (rv != NS_ERROR_FILE_ALREADY_EXISTS && NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ nsCOMPtr<nsIFile> saltFile;
+ rv = path->Clone(getter_AddRefs(saltFile));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ rv = saltFile->AppendNative(NS_LITERAL_CSTRING("salt"));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ nsAutoCString salt;
+ bool exists = false;
+ rv = saltFile->Exists(&exists);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ if (!exists) {
+ // No stored salt for this origin. Generate salt, and store it and
+ // the origin on disk.
+ nsresult rv = GenerateRandomPathName(salt, NodeIdSaltLength);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ MOZ_ASSERT(salt.Length() == NodeIdSaltLength);
+
+ // $profileDir/gmp/$platform/$gmpName/id/$hash/salt
+ rv = WriteToFile(path, NS_LITERAL_CSTRING("salt"), salt);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ // $profileDir/gmp/$platform/$gmpName/id/$hash/origin
+ rv = WriteToFile(path,
+ NS_LITERAL_CSTRING("origin"),
+ NS_ConvertUTF16toUTF8(aOrigin));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ // $profileDir/gmp/$platform/$gmpName/id/$hash/topLevelOrigin
+ rv = WriteToFile(path,
+ NS_LITERAL_CSTRING("topLevelOrigin"),
+ NS_ConvertUTF16toUTF8(aTopLevelOrigin));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ } else {
+ rv = ReadSalt(path, salt);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ }
+
+ aOutId = salt;
+ mPersistentStorageAllowed.Put(salt, true);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::GetNodeId(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing,
+ UniquePtr<GetNodeIdCallback>&& aCallback)
+{
+ nsCString nodeId;
+ nsresult rv = GetNodeId(aOrigin, aTopLevelOrigin, aGMPName, aInPrivateBrowsing, nodeId);
+ aCallback->Done(rv, nodeId);
+ return rv;
+}
+
+static bool
+ExtractHostName(const nsACString& aOrigin, nsACString& aOutData)
+{
+ nsCString str;
+ str.Assign(aOrigin);
+ int begin = str.Find("://");
+ // The scheme is missing!
+ if (begin == -1) {
+ return false;
+ }
+
+ int end = str.RFind(":");
+ // Remove the port number
+ if (end != begin) {
+ str.SetLength(end);
+ }
+
+ nsDependentCSubstring host(str, begin + 3);
+ aOutData.Assign(host);
+ return true;
+}
+
+bool
+MatchOrigin(nsIFile* aPath,
+ const nsACString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern)
+{
+ // http://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_syntax
+ static const uint32_t MaxDomainLength = 253;
+
+ nsresult rv;
+ nsCString str;
+ nsCString originNoSuffix;
+ mozilla::PrincipalOriginAttributes originAttributes;
+
+ rv = ReadFromFile(aPath, NS_LITERAL_CSTRING("origin"), str, MaxDomainLength);
+ if (!originAttributes.PopulateFromOrigin(str, originNoSuffix)) {
+ // Fails on parsing the originAttributes, treat this as a non-match.
+ return false;
+ }
+
+ if (NS_SUCCEEDED(rv) && ExtractHostName(originNoSuffix, str) && str.Equals(aSite) &&
+ aPattern.Matches(originAttributes)) {
+ return true;
+ }
+
+ mozilla::PrincipalOriginAttributes topLevelOriginAttributes;
+ rv = ReadFromFile(aPath, NS_LITERAL_CSTRING("topLevelOrigin"), str, MaxDomainLength);
+ if (!topLevelOriginAttributes.PopulateFromOrigin(str, originNoSuffix)) {
+ // Fails on paring the originAttributes, treat this as a non-match.
+ return false;
+ }
+
+ if (NS_SUCCEEDED(rv) && ExtractHostName(originNoSuffix, str) && str.Equals(aSite) &&
+ aPattern.Matches(topLevelOriginAttributes)) {
+ return true;
+ }
+ return false;
+}
+
+template<typename T> static void
+KillPlugins(const nsTArray<RefPtr<GMPParent>>& aPlugins,
+ Mutex& aMutex, T&& aFilter)
+{
+ // Shutdown the plugins when |aFilter| evaluates to true.
+ // After we clear storage data, node IDs will become invalid and shouldn't be
+ // used anymore. We need to kill plugins with such nodeIDs.
+ // Note: we can't shut them down while holding the lock,
+ // as the lock is not re-entrant and shutdown requires taking the lock.
+ // The plugin list is only edited on the GMP thread, so this should be OK.
+ nsTArray<RefPtr<GMPParent>> pluginsToKill;
+ {
+ MutexAutoLock lock(aMutex);
+ for (size_t i = 0; i < aPlugins.Length(); i++) {
+ RefPtr<GMPParent> parent(aPlugins[i]);
+ if (aFilter(parent)) {
+ pluginsToKill.AppendElement(parent);
+ }
+ }
+ }
+
+ for (size_t i = 0; i < pluginsToKill.Length(); i++) {
+ pluginsToKill[i]->CloseActive(false);
+ // Abort async shutdown because we're going to wipe the plugin's storage,
+ // so we don't want it writing more data in its async shutdown path.
+ pluginsToKill[i]->AbortAsyncShutdown();
+ }
+}
+
+static nsresult
+DeleteDir(nsIFile* aPath)
+{
+ bool exists = false;
+ nsresult rv = aPath->Exists(&exists);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ if (exists) {
+ return aPath->Remove(true);
+ }
+ return NS_OK;
+}
+
+struct NodeFilter {
+ explicit NodeFilter(const nsTArray<nsCString>& nodeIDs) : mNodeIDs(nodeIDs) {}
+ bool operator()(GMPParent* aParent) {
+ return mNodeIDs.Contains(aParent->GetNodeId());
+ }
+private:
+ const nsTArray<nsCString>& mNodeIDs;
+};
+
+void
+GeckoMediaPluginServiceParent::ClearNodeIdAndPlugin(DirectoryFilter& aFilter)
+{
+ // $profileDir/gmp/$platform/
+ nsCOMPtr<nsIFile> path;
+ nsresult rv = GetStorageDir(getter_AddRefs(path));
+ if (NS_FAILED(rv)) {
+ return;
+ }
+
+ // Iterate all sub-folders of $profileDir/gmp/$platform/, i.e. the dirs in which
+ // specific GMPs store their data.
+ DirectoryEnumerator iter(path, DirectoryEnumerator::DirsOnly);
+ for (nsCOMPtr<nsIFile> pluginDir; (pluginDir = iter.Next()) != nullptr;) {
+ ClearNodeIdAndPlugin(pluginDir, aFilter);
+ }
+}
+
+void
+GeckoMediaPluginServiceParent::ClearNodeIdAndPlugin(nsIFile* aPluginStorageDir,
+ DirectoryFilter& aFilter)
+{
+ // $profileDir/gmp/$platform/$gmpName/id/
+ nsCOMPtr<nsIFile> path = CloneAndAppend(aPluginStorageDir, NS_LITERAL_STRING("id"));
+ if (!path) {
+ return;
+ }
+
+ // Iterate all sub-folders of $profileDir/gmp/$platform/$gmpName/id/
+ nsTArray<nsCString> nodeIDsToClear;
+ DirectoryEnumerator iter(path, DirectoryEnumerator::DirsOnly);
+ for (nsCOMPtr<nsIFile> dirEntry; (dirEntry = iter.Next()) != nullptr;) {
+ // dirEntry is the hash of origins, i.e.:
+ // $profileDir/gmp/$platform/$gmpName/id/$originHash/
+ if (!aFilter(dirEntry)) {
+ continue;
+ }
+ nsAutoCString salt;
+ if (NS_SUCCEEDED(ReadSalt(dirEntry, salt))) {
+ // Keep node IDs to clear data/plugins associated with them later.
+ nodeIDsToClear.AppendElement(salt);
+ // Also remove node IDs from the table.
+ mPersistentStorageAllowed.Remove(salt);
+ }
+ // Now we can remove the directory for the origin pair.
+ if (NS_FAILED(dirEntry->Remove(true))) {
+ NS_WARNING("Failed to delete the directory for the origin pair");
+ }
+ }
+
+ // Kill plugin instances that have node IDs being cleared.
+ KillPlugins(mPlugins, mMutex, NodeFilter(nodeIDsToClear));
+
+ // Clear all storage in $profileDir/gmp/$platform/$gmpName/storage/$nodeId/
+ path = CloneAndAppend(aPluginStorageDir, NS_LITERAL_STRING("storage"));
+ if (!path) {
+ return;
+ }
+
+ for (const nsCString& nodeId : nodeIDsToClear) {
+ nsCOMPtr<nsIFile> dirEntry;
+ nsresult rv = path->Clone(getter_AddRefs(dirEntry));
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ rv = dirEntry->AppendNative(nodeId);
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ if (NS_FAILED(DeleteDir(dirEntry))) {
+ NS_WARNING("Failed to delete GMP storage directory for the node");
+ }
+ }
+}
+
+void
+GeckoMediaPluginServiceParent::ForgetThisSiteOnGMPThread(const nsACString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ LOGD(("%s::%s: origin=%s", __CLASS__, __FUNCTION__, aSite.Data()));
+
+ struct OriginFilter : public DirectoryFilter {
+ explicit OriginFilter(const nsACString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern)
+ : mSite(aSite)
+ , mPattern(aPattern)
+ { }
+ bool operator()(nsIFile* aPath) override {
+ return MatchOrigin(aPath, mSite, mPattern);
+ }
+ private:
+ const nsACString& mSite;
+ const mozilla::OriginAttributesPattern& mPattern;
+ } filter(aSite, aPattern);
+
+ ClearNodeIdAndPlugin(filter);
+}
+
+void
+GeckoMediaPluginServiceParent::ClearRecentHistoryOnGMPThread(PRTime aSince)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ LOGD(("%s::%s: since=%lld", __CLASS__, __FUNCTION__, (int64_t)aSince));
+
+ struct MTimeFilter : public DirectoryFilter {
+ explicit MTimeFilter(PRTime aSince)
+ : mSince(aSince) {}
+
+ // Return true if any files under aPath is modified after |mSince|.
+ bool IsModifiedAfter(nsIFile* aPath) {
+ PRTime lastModified;
+ nsresult rv = aPath->GetLastModifiedTime(&lastModified);
+ if (NS_SUCCEEDED(rv) && lastModified >= mSince) {
+ return true;
+ }
+ DirectoryEnumerator iter(aPath, DirectoryEnumerator::FilesAndDirs);
+ for (nsCOMPtr<nsIFile> dirEntry; (dirEntry = iter.Next()) != nullptr;) {
+ if (IsModifiedAfter(dirEntry)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // |aPath| is $profileDir/gmp/$platform/$gmpName/id/$originHash/
+ bool operator()(nsIFile* aPath) override {
+ if (IsModifiedAfter(aPath)) {
+ return true;
+ }
+
+ nsAutoCString salt;
+ if (NS_FAILED(ReadSalt(aPath, salt))) {
+ return false;
+ }
+
+ // $profileDir/gmp/$platform/$gmpName/id/
+ nsCOMPtr<nsIFile> idDir;
+ if (NS_FAILED(aPath->GetParent(getter_AddRefs(idDir)))) {
+ return false;
+ }
+ // $profileDir/gmp/$platform/$gmpName/
+ nsCOMPtr<nsIFile> temp;
+ if (NS_FAILED(idDir->GetParent(getter_AddRefs(temp)))) {
+ return false;
+ }
+
+ // $profileDir/gmp/$platform/$gmpName/storage/
+ if (NS_FAILED(temp->Append(NS_LITERAL_STRING("storage")))) {
+ return false;
+ }
+ // $profileDir/gmp/$platform/$gmpName/storage/$originSalt
+ return NS_SUCCEEDED(temp->AppendNative(salt)) && IsModifiedAfter(temp);
+ }
+ private:
+ const PRTime mSince;
+ } filter(aSince);
+
+ ClearNodeIdAndPlugin(filter);
+
+ NS_DispatchToMainThread(new NotifyObserversTask("gmp-clear-storage-complete"), NS_DISPATCH_NORMAL);
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::ForgetThisSite(const nsAString& aSite,
+ const nsAString& aPattern)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ mozilla::OriginAttributesPattern pattern;
+
+ if (!pattern.Init(aPattern)) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
+ return ForgetThisSiteNative(aSite, pattern);
+}
+
+nsresult
+GeckoMediaPluginServiceParent::ForgetThisSiteNative(const nsAString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ return GMPDispatch(NewRunnableMethod<nsCString, mozilla::OriginAttributesPattern>(
+ this, &GeckoMediaPluginServiceParent::ForgetThisSiteOnGMPThread,
+ NS_ConvertUTF16toUTF8(aSite), aPattern));
+}
+
+static bool IsNodeIdValid(GMPParent* aParent) {
+ return !aParent->GetNodeId().IsEmpty();
+}
+
+static nsCOMPtr<nsIAsyncShutdownClient>
+GetShutdownBarrier()
+{
+ nsCOMPtr<nsIAsyncShutdownService> svc = services::GetAsyncShutdown();
+ MOZ_RELEASE_ASSERT(svc);
+
+ nsCOMPtr<nsIAsyncShutdownClient> barrier;
+ nsresult rv = svc->GetXpcomWillShutdown(getter_AddRefs(barrier));
+
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ MOZ_RELEASE_ASSERT(barrier);
+ return barrier.forget();
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::GetName(nsAString& aName)
+{
+ aName = NS_LITERAL_STRING("GeckoMediaPluginServiceParent: shutdown");
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::GetState(nsIPropertyBag**)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+GeckoMediaPluginServiceParent::BlockShutdown(nsIAsyncShutdownClient*)
+{
+ return NS_OK;
+}
+
+void
+GeckoMediaPluginServiceParent::ServiceUserCreated()
+{
+ MOZ_ASSERT(mServiceUserCount >= 0);
+ if (++mServiceUserCount == 1) {
+ nsresult rv = GetShutdownBarrier()->AddBlocker(
+ this, NS_LITERAL_STRING(__FILE__), __LINE__,
+ NS_LITERAL_STRING("GeckoMediaPluginServiceParent shutdown"));
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ }
+}
+
+void
+GeckoMediaPluginServiceParent::ServiceUserDestroyed()
+{
+ MOZ_ASSERT(mServiceUserCount > 0);
+ if (--mServiceUserCount == 0) {
+ nsresult rv = GetShutdownBarrier()->RemoveBlocker(this);
+ MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv));
+ }
+}
+
+void
+GeckoMediaPluginServiceParent::ClearStorage()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
+ LOGD(("%s::%s", __CLASS__, __FUNCTION__));
+
+ // Kill plugins with valid nodeIDs.
+ KillPlugins(mPlugins, mMutex, &IsNodeIdValid);
+
+ nsCOMPtr<nsIFile> path; // $profileDir/gmp/$platform/
+ nsresult rv = GetStorageDir(getter_AddRefs(path));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ if (NS_FAILED(DeleteDir(path))) {
+ NS_WARNING("Failed to delete GMP storage directory");
+ }
+
+ // Clear private-browsing storage.
+ mTempGMPStorage.Clear();
+
+ NS_DispatchToMainThread(new NotifyObserversTask("gmp-clear-storage-complete"), NS_DISPATCH_NORMAL);
+}
+
+already_AddRefed<GMPParent>
+GeckoMediaPluginServiceParent::GetById(uint32_t aPluginId)
+{
+ MutexAutoLock lock(mMutex);
+ for (const RefPtr<GMPParent>& gmp : mPlugins) {
+ if (gmp->GetPluginId() == aPluginId) {
+ return do_AddRef(gmp);
+ }
+ }
+ return nullptr;
+}
+
+GMPServiceParent::~GMPServiceParent()
+{
+ NS_DispatchToMainThread(
+ NewRunnableMethod(mService.get(),
+ &GeckoMediaPluginServiceParent::ServiceUserDestroyed));
+}
+
+bool
+GMPServiceParent::RecvSelectGMP(const nsCString& aNodeId,
+ const nsCString& aAPI,
+ nsTArray<nsCString>&& aTags,
+ uint32_t* aOutPluginId,
+ nsresult* aOutRv)
+{
+ if (mService->IsShuttingDown()) {
+ *aOutRv = NS_ERROR_ILLEGAL_DURING_SHUTDOWN;
+ return true;
+ }
+
+ RefPtr<GMPParent> gmp = mService->SelectPluginForAPI(aNodeId, aAPI, aTags);
+ if (gmp) {
+ *aOutPluginId = gmp->GetPluginId();
+ *aOutRv = NS_OK;
+ } else {
+ *aOutRv = NS_ERROR_FAILURE;
+ }
+
+ nsCString api = aTags[0];
+ LOGD(("%s: %p returning %p for api %s", __FUNCTION__, (void *)this, (void *)gmp, api.get()));
+
+ return true;
+}
+
+bool
+GMPServiceParent::RecvLaunchGMP(const uint32_t& aPluginId,
+ nsTArray<ProcessId>&& aAlreadyBridgedTo,
+ ProcessId* aOutProcessId,
+ nsCString* aOutDisplayName,
+ nsresult* aOutRv)
+{
+ *aOutRv = NS_OK;
+ if (mService->IsShuttingDown()) {
+ *aOutRv = NS_ERROR_ILLEGAL_DURING_SHUTDOWN;
+ return true;
+ }
+
+ RefPtr<GMPParent> gmp(mService->GetById(aPluginId));
+ if (!gmp) {
+ *aOutRv = NS_ERROR_FAILURE;
+ return true;
+ }
+
+ if (!gmp->EnsureProcessLoaded(aOutProcessId)) {
+ return false;
+ }
+
+ *aOutDisplayName = gmp->GetDisplayName();
+
+ return aAlreadyBridgedTo.Contains(*aOutProcessId) || gmp->Bridge(this);
+}
+
+bool
+GMPServiceParent::RecvGetGMPNodeId(const nsString& aOrigin,
+ const nsString& aTopLevelOrigin,
+ const nsString& aGMPName,
+ const bool& aInPrivateBrowsing,
+ nsCString* aID)
+{
+ nsresult rv = mService->GetNodeId(aOrigin, aTopLevelOrigin, aGMPName,
+ aInPrivateBrowsing, *aID);
+ return NS_SUCCEEDED(rv);
+}
+
+class DeleteGMPServiceParent : public mozilla::Runnable
+{
+public:
+ explicit DeleteGMPServiceParent(GMPServiceParent* aToDelete)
+ : mToDelete(aToDelete)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ return NS_OK;
+ }
+
+private:
+ nsAutoPtr<GMPServiceParent> mToDelete;
+};
+
+void GMPServiceParent::CloseTransport(Monitor* aSyncMonitor, bool* aCompleted)
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+
+ MonitorAutoLock lock(*aSyncMonitor);
+
+ // This deletes the transport.
+ SetTransport(nullptr);
+
+ *aCompleted = true;
+ lock.NotifyAll();
+}
+
+void
+GMPServiceParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ Monitor monitor("DeleteGMPServiceParent");
+ bool completed = false;
+
+ // Make sure the IPC channel is closed before destroying mToDelete.
+ MonitorAutoLock lock(monitor);
+ RefPtr<Runnable> task =
+ NewNonOwningRunnableMethod<Monitor*, bool*>(this,
+ &GMPServiceParent::CloseTransport,
+ &monitor,
+ &completed);
+ XRE_GetIOMessageLoop()->PostTask(Move(task.forget()));
+
+ while (!completed) {
+ lock.Wait();
+ }
+
+ NS_DispatchToCurrentThread(new DeleteGMPServiceParent(this));
+}
+
+class OpenPGMPServiceParent : public mozilla::Runnable
+{
+public:
+ OpenPGMPServiceParent(GMPServiceParent* aGMPServiceParent,
+ mozilla::ipc::Transport* aTransport,
+ base::ProcessId aOtherPid,
+ bool* aResult)
+ : mGMPServiceParent(aGMPServiceParent),
+ mTransport(aTransport),
+ mOtherPid(aOtherPid),
+ mResult(aResult)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ *mResult = mGMPServiceParent->Open(mTransport, mOtherPid,
+ XRE_GetIOMessageLoop(), ipc::ParentSide);
+ return NS_OK;
+ }
+
+private:
+ GMPServiceParent* mGMPServiceParent;
+ mozilla::ipc::Transport* mTransport;
+ base::ProcessId mOtherPid;
+ bool* mResult;
+};
+
+/* static */
+PGMPServiceParent*
+GMPServiceParent::Create(Transport* aTransport, ProcessId aOtherPid)
+{
+ RefPtr<GeckoMediaPluginServiceParent> gmp =
+ GeckoMediaPluginServiceParent::GetSingleton();
+
+ if (gmp->mShuttingDown) {
+ // Shutdown is initiated. There is no point creating a new actor.
+ return nullptr;
+ }
+
+ nsCOMPtr<nsIThread> gmpThread;
+ nsresult rv = gmp->GetThread(getter_AddRefs(gmpThread));
+ NS_ENSURE_SUCCESS(rv, nullptr);
+
+ nsAutoPtr<GMPServiceParent> serviceParent(new GMPServiceParent(gmp));
+
+ bool ok;
+ rv = gmpThread->Dispatch(new OpenPGMPServiceParent(serviceParent,
+ aTransport,
+ aOtherPid, &ok),
+ NS_DISPATCH_SYNC);
+ if (NS_FAILED(rv) || !ok) {
+ return nullptr;
+ }
+
+ return serviceParent.forget();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPServiceParent.h b/dom/media/gmp/GMPServiceParent.h
new file mode 100644
index 000000000..f3f43e215
--- /dev/null
+++ b/dom/media/gmp/GMPServiceParent.h
@@ -0,0 +1,279 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPServiceParent_h_
+#define GMPServiceParent_h_
+
+#include "GMPService.h"
+#include "mozilla/gmp/PGMPServiceParent.h"
+#include "mozIGeckoMediaPluginChromeService.h"
+#include "nsClassHashtable.h"
+#include "nsDataHashtable.h"
+#include "mozilla/Atomics.h"
+#include "nsIAsyncShutdown.h"
+#include "nsThreadUtils.h"
+#include "mozilla/MozPromise.h"
+#include "GMPStorage.h"
+
+template <class> struct already_AddRefed;
+
+namespace mozilla {
+namespace gmp {
+
+class GMPParent;
+
+class GeckoMediaPluginServiceParent final : public GeckoMediaPluginService
+ , public mozIGeckoMediaPluginChromeService
+ , public nsIAsyncShutdownBlocker
+{
+public:
+ static already_AddRefed<GeckoMediaPluginServiceParent> GetSingleton();
+
+ GeckoMediaPluginServiceParent();
+ nsresult Init() override;
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_NSIASYNCSHUTDOWNBLOCKER
+
+ // mozIGeckoMediaPluginService
+ NS_IMETHOD HasPluginForAPI(const nsACString& aAPI,
+ nsTArray<nsCString>* aTags,
+ bool *aRetVal) override;
+ NS_IMETHOD GetNodeId(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsingMode,
+ UniquePtr<GetNodeIdCallback>&& aCallback) override;
+
+ NS_DECL_MOZIGECKOMEDIAPLUGINCHROMESERVICE
+ NS_DECL_NSIOBSERVER
+
+ void AsyncShutdownNeeded(GMPParent* aParent);
+ void AsyncShutdownComplete(GMPParent* aParent);
+
+ int32_t AsyncShutdownTimeoutMs();
+#ifdef MOZ_CRASHREPORTER
+ void SetAsyncShutdownPluginState(GMPParent* aGMPParent, char aId, const nsCString& aState);
+#endif // MOZ_CRASHREPORTER
+ RefPtr<GenericPromise> EnsureInitialized();
+ RefPtr<GenericPromise> AsyncAddPluginDirectory(const nsAString& aDirectory);
+
+ // GMP thread access only
+ bool IsShuttingDown();
+
+ already_AddRefed<GMPStorage> GetMemoryStorageFor(const nsACString& aNodeId);
+ nsresult ForgetThisSiteNative(const nsAString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern);
+
+ // Notifies that some user of this class is created/destroyed.
+ void ServiceUserCreated();
+ void ServiceUserDestroyed();
+
+ void UpdateContentProcessGMPCapabilities();
+
+private:
+ friend class GMPServiceParent;
+
+ virtual ~GeckoMediaPluginServiceParent();
+
+ void ClearStorage();
+
+ already_AddRefed<GMPParent> SelectPluginForAPI(const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags);
+
+ already_AddRefed<GMPParent> FindPluginForAPIFrom(size_t aSearchStartIndex,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ size_t* aOutPluginIndex);
+
+ nsresult GetNodeId(const nsAString& aOrigin, const nsAString& aTopLevelOrigin,
+ const nsAString& aGMPName,
+ bool aInPrivateBrowsing, nsACString& aOutId);
+
+ void UnloadPlugins();
+ void CrashPlugins();
+ void NotifySyncShutdownComplete();
+ void NotifyAsyncShutdownComplete();
+
+ void ProcessPossiblePlugin(nsIFile* aDir);
+
+ void RemoveOnGMPThread(const nsAString& aDirectory,
+ const bool aDeleteFromDisk,
+ const bool aCanDefer);
+
+ nsresult SetAsyncShutdownTimeout();
+
+ struct DirectoryFilter {
+ virtual bool operator()(nsIFile* aPath) = 0;
+ ~DirectoryFilter() {}
+ };
+ void ClearNodeIdAndPlugin(DirectoryFilter& aFilter);
+ void ClearNodeIdAndPlugin(nsIFile* aPluginStorageDir,
+ DirectoryFilter& aFilter);
+ void ForgetThisSiteOnGMPThread(const nsACString& aOrigin,
+ const mozilla::OriginAttributesPattern& aPattern);
+ void ClearRecentHistoryOnGMPThread(PRTime aSince);
+
+ already_AddRefed<GMPParent> GetById(uint32_t aPluginId);
+
+protected:
+ friend class GMPParent;
+ void ReAddOnGMPThread(const RefPtr<GMPParent>& aOld);
+ void PluginTerminated(const RefPtr<GMPParent>& aOld);
+ void InitializePlugins(AbstractThread* aAbstractGMPThread) override;
+ RefPtr<GenericPromise::AllPromiseType> LoadFromEnvironment();
+ RefPtr<GenericPromise> AddOnGMPThread(nsString aDirectory);
+ bool GetContentParentFrom(GMPCrashHelper* aHelper,
+ const nsACString& aNodeId,
+ const nsCString& aAPI,
+ const nsTArray<nsCString>& aTags,
+ UniquePtr<GetGMPContentParentCallback>&& aCallback)
+ override;
+private:
+ // Creates a copy of aOriginal. Note that the caller is responsible for
+ // adding this to GeckoMediaPluginServiceParent::mPlugins.
+ already_AddRefed<GMPParent> ClonePlugin(const GMPParent* aOriginal);
+ nsresult EnsurePluginsOnDiskScanned();
+ nsresult InitStorage();
+
+ class PathRunnable : public Runnable
+ {
+ public:
+ enum EOperation {
+ REMOVE,
+ REMOVE_AND_DELETE_FROM_DISK,
+ };
+
+ PathRunnable(GeckoMediaPluginServiceParent* aService, const nsAString& aPath,
+ EOperation aOperation, bool aDefer = false)
+ : mService(aService)
+ , mPath(aPath)
+ , mOperation(aOperation)
+ , mDefer(aDefer)
+ { }
+
+ NS_DECL_NSIRUNNABLE
+
+ private:
+ RefPtr<GeckoMediaPluginServiceParent> mService;
+ nsString mPath;
+ EOperation mOperation;
+ bool mDefer;
+ };
+
+ // Protected by mMutex from the base class.
+ nsTArray<RefPtr<GMPParent>> mPlugins;
+ bool mShuttingDown;
+ nsTArray<RefPtr<GMPParent>> mAsyncShutdownPlugins;
+
+#ifdef MOZ_CRASHREPORTER
+ Mutex mAsyncShutdownPluginStatesMutex; // Protects mAsyncShutdownPluginStates.
+ class AsyncShutdownPluginStates
+ {
+ public:
+ void Update(const nsCString& aPlugin, const nsCString& aInstance,
+ char aId, const nsCString& aState);
+ private:
+ struct State { nsCString mStateSequence; nsCString mLastStateDescription; };
+ typedef nsClassHashtable<nsCStringHashKey, State> StatesByInstance;
+ typedef nsClassHashtable<nsCStringHashKey, StatesByInstance> StateInstancesByPlugin;
+ StateInstancesByPlugin mStates;
+ } mAsyncShutdownPluginStates;
+#endif // MOZ_CRASHREPORTER
+
+ // True if we've inspected MOZ_GMP_PATH on the GMP thread and loaded any
+ // plugins found there into mPlugins.
+ Atomic<bool> mScannedPluginOnDisk;
+
+ template<typename T>
+ class MainThreadOnly {
+ public:
+ MOZ_IMPLICIT MainThreadOnly(T aValue)
+ : mValue(aValue)
+ {}
+ operator T&() {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mValue;
+ }
+
+ private:
+ T mValue;
+ };
+
+ MainThreadOnly<bool> mWaitingForPluginsSyncShutdown;
+
+ nsTArray<nsString> mPluginsWaitingForDeletion;
+
+ nsCOMPtr<nsIFile> mStorageBaseDir;
+
+ // Hashes of (origin,topLevelOrigin) to the node id for
+ // non-persistent sessions.
+ nsClassHashtable<nsUint32HashKey, nsCString> mTempNodeIds;
+
+ // Hashes node id to whether that node id is allowed to store data
+ // persistently on disk.
+ nsDataHashtable<nsCStringHashKey, bool> mPersistentStorageAllowed;
+
+ // Synchronization for barrier that ensures we've loaded GMPs from
+ // MOZ_GMP_PATH before allowing GetContentParentFrom() to proceed.
+ Monitor mInitPromiseMonitor;
+ MozPromiseHolder<GenericPromise> mInitPromise;
+ bool mLoadPluginsFromDiskComplete;
+
+ // Hashes nodeId to the hashtable of storage for that nodeId.
+ nsRefPtrHashtable<nsCStringHashKey, GMPStorage> mTempGMPStorage;
+
+ // Tracks how many users are running (on the GMP thread). Only when this count
+ // drops to 0 can we safely shut down the thread.
+ MainThreadOnly<int32_t> mServiceUserCount;
+};
+
+nsresult ReadSalt(nsIFile* aPath, nsACString& aOutData);
+bool MatchOrigin(nsIFile* aPath,
+ const nsACString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern);
+
+class GMPServiceParent final : public PGMPServiceParent
+{
+public:
+ explicit GMPServiceParent(GeckoMediaPluginServiceParent* aService)
+ : mService(aService)
+ {
+ mService->ServiceUserCreated();
+ }
+ virtual ~GMPServiceParent();
+
+ bool RecvGetGMPNodeId(const nsString& aOrigin,
+ const nsString& aTopLevelOrigin,
+ const nsString& aGMPName,
+ const bool& aInPrivateBrowsing,
+ nsCString* aID) override;
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ static PGMPServiceParent* Create(Transport* aTransport, ProcessId aOtherPid);
+
+ bool RecvSelectGMP(const nsCString& aNodeId,
+ const nsCString& aAPI,
+ nsTArray<nsCString>&& aTags,
+ uint32_t* aOutPluginId,
+ nsresult* aOutRv) override;
+
+ bool RecvLaunchGMP(const uint32_t& aPluginId,
+ nsTArray<ProcessId>&& aAlreadyBridgedTo,
+ ProcessId* aOutID,
+ nsCString* aOutDisplayName,
+ nsresult* aOutRv) override;
+
+private:
+ void CloseTransport(Monitor* aSyncMonitor, bool* aCompleted);
+
+ RefPtr<GeckoMediaPluginServiceParent> mService;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPServiceParent_h_
diff --git a/dom/media/gmp/GMPSharedMemManager.cpp b/dom/media/gmp/GMPSharedMemManager.cpp
new file mode 100644
index 000000000..86b5f9810
--- /dev/null
+++ b/dom/media/gmp/GMPSharedMemManager.cpp
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPSharedMemManager.h"
+#include "GMPMessageUtils.h"
+#include "mozilla/ipc/SharedMemory.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/ClearOnShutdown.h"
+
+namespace mozilla {
+namespace gmp {
+
+// Really one set of pools on each side of the plugin API.
+
+// YUV buffers go from Encoder parent to child; pool there, and then return
+// with Decoded() frames to the Decoder parent and goes into the parent pool.
+// Compressed (encoded) data goes from the Decoder parent to the child;
+// pool there, and then return with Encoded() frames and goes into the parent
+// pool.
+bool
+GMPSharedMemManager::MgrAllocShmem(GMPSharedMem::GMPMemoryClasses aClass, size_t aSize,
+ ipc::Shmem::SharedMemory::SharedMemoryType aType,
+ ipc::Shmem* aMem)
+{
+ mData->CheckThread();
+
+ // first look to see if we have a free buffer large enough
+ for (uint32_t i = 0; i < GetGmpFreelist(aClass).Length(); i++) {
+ MOZ_ASSERT(GetGmpFreelist(aClass)[i].IsWritable());
+ if (aSize <= GetGmpFreelist(aClass)[i].Size<uint8_t>()) {
+ *aMem = GetGmpFreelist(aClass)[i];
+ GetGmpFreelist(aClass).RemoveElementAt(i);
+ return true;
+ }
+ }
+
+ // Didn't find a buffer free with enough space; allocate one
+ size_t pagesize = ipc::SharedMemory::SystemPageSize();
+ aSize = (aSize + (pagesize-1)) & ~(pagesize-1); // round up to page size
+ bool retval = Alloc(aSize, aType, aMem);
+ if (retval) {
+ // The allocator (or NeedsShmem call) should never return less than we ask for...
+ MOZ_ASSERT(aMem->Size<uint8_t>() >= aSize);
+ mData->mGmpAllocated[aClass]++;
+ }
+ return retval;
+}
+
+bool
+GMPSharedMemManager::MgrDeallocShmem(GMPSharedMem::GMPMemoryClasses aClass, ipc::Shmem& aMem)
+{
+ mData->CheckThread();
+
+ size_t size = aMem.Size<uint8_t>();
+ size_t total = 0;
+
+ // XXX Bug NNNNNNN Until we put better guards on ipc::shmem, verify we
+ // weren't fed an shmem we already had.
+ for (uint32_t i = 0; i < GetGmpFreelist(aClass).Length(); i++) {
+ if (NS_WARN_IF(aMem == GetGmpFreelist(aClass)[i])) {
+ // Safest to crash in this case; should never happen in normal
+ // operation.
+ MOZ_CRASH("Deallocating Shmem we already have in our cache!");
+ //return true;
+ }
+ }
+
+ // XXX This works; there are better pool algorithms. We need to avoid
+ // "falling off a cliff" with too low a number
+ if (GetGmpFreelist(aClass).Length() > 10) {
+ Dealloc(GetGmpFreelist(aClass)[0]);
+ GetGmpFreelist(aClass).RemoveElementAt(0);
+ // The allocation numbers will be fubar on the Child!
+ mData->mGmpAllocated[aClass]--;
+ }
+ for (uint32_t i = 0; i < GetGmpFreelist(aClass).Length(); i++) {
+ MOZ_ASSERT(GetGmpFreelist(aClass)[i].IsWritable());
+ total += GetGmpFreelist(aClass)[i].Size<uint8_t>();
+ if (size < GetGmpFreelist(aClass)[i].Size<uint8_t>()) {
+ GetGmpFreelist(aClass).InsertElementAt(i, aMem);
+ return true;
+ }
+ }
+ GetGmpFreelist(aClass).AppendElement(aMem);
+
+ return true;
+}
+
+uint32_t
+GMPSharedMemManager::NumInUse(GMPSharedMem::GMPMemoryClasses aClass)
+{
+ return mData->mGmpAllocated[aClass] - GetGmpFreelist(aClass).Length();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPSharedMemManager.h b/dom/media/gmp/GMPSharedMemManager.h
new file mode 100644
index 000000000..cc36f3fc0
--- /dev/null
+++ b/dom/media/gmp/GMPSharedMemManager.h
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPSharedMemManager_h_
+#define GMPSharedMemManager_h_
+
+#include "mozilla/ipc/Shmem.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPSharedMemManager;
+
+class GMPSharedMem
+{
+public:
+ typedef enum {
+ kGMPFrameData = 0,
+ kGMPEncodedData,
+ kGMPNumTypes
+ } GMPMemoryClasses;
+
+ // This is a heuristic - max of 10 free in the Child pool, plus those
+ // in-use for the encoder and decoder at the given moment and not yet
+ // returned to the parent pool (which is not included). If more than
+ // this are needed, we presume the client has either crashed or hung
+ // (perhaps temporarily).
+ static const uint32_t kGMPBufLimit = 20;
+
+ GMPSharedMem()
+ {
+ for (size_t i = 0; i < sizeof(mGmpAllocated)/sizeof(mGmpAllocated[0]); i++) {
+ mGmpAllocated[i] = 0;
+ }
+ }
+ virtual ~GMPSharedMem() {}
+
+ // Parent and child impls will differ here
+ virtual void CheckThread() = 0;
+
+protected:
+ friend class GMPSharedMemManager;
+
+ nsTArray<ipc::Shmem> mGmpFreelist[GMPSharedMem::kGMPNumTypes];
+ uint32_t mGmpAllocated[GMPSharedMem::kGMPNumTypes];
+};
+
+class GMPSharedMemManager
+{
+public:
+ explicit GMPSharedMemManager(GMPSharedMem *aData) : mData(aData) {}
+ virtual ~GMPSharedMemManager() {}
+
+ virtual bool MgrAllocShmem(GMPSharedMem::GMPMemoryClasses aClass, size_t aSize,
+ ipc::Shmem::SharedMemory::SharedMemoryType aType,
+ ipc::Shmem* aMem);
+ virtual bool MgrDeallocShmem(GMPSharedMem::GMPMemoryClasses aClass, ipc::Shmem& aMem);
+
+ // So we can know if data is "piling up" for the plugin - I.e. it's hung or crashed
+ virtual uint32_t NumInUse(GMPSharedMem::GMPMemoryClasses aClass);
+
+ // These have to be implemented using the AllocShmem/etc provided by the IPDL-generated interfaces,
+ // so have the Parent/Child implement them.
+ virtual bool Alloc(size_t aSize, ipc::Shmem::SharedMemory::SharedMemoryType aType, ipc::Shmem* aMem) = 0;
+ virtual void Dealloc(ipc::Shmem& aMem) = 0;
+
+private:
+ nsTArray<ipc::Shmem>& GetGmpFreelist(GMPSharedMem::GMPMemoryClasses aTypes)
+ {
+ return mData->mGmpFreelist[aTypes];
+ }
+
+ GMPSharedMem *mData;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPSharedMemManager_h_
diff --git a/dom/media/gmp/GMPStorage.h b/dom/media/gmp/GMPStorage.h
new file mode 100644
index 000000000..db3aebc8c
--- /dev/null
+++ b/dom/media/gmp/GMPStorage.h
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPStorage_h_
+#define GMPStorage_h_
+
+#include "gmp-storage.h"
+#include "mozilla/AlreadyAddRefed.h"
+#include "nsISupportsImpl.h"
+#include "nsString.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPStorage {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPStorage)
+
+ virtual GMPErr Open(const nsCString& aRecordName) = 0;
+ virtual bool IsOpen(const nsCString& aRecordName) const = 0;
+ virtual GMPErr Read(const nsCString& aRecordName,
+ nsTArray<uint8_t>& aOutBytes) = 0;
+ virtual GMPErr Write(const nsCString& aRecordName,
+ const nsTArray<uint8_t>& aBytes) = 0;
+ virtual GMPErr GetRecordNames(nsTArray<nsCString>& aOutRecordNames) const = 0;
+ virtual void Close(const nsCString& aRecordName) = 0;
+protected:
+ virtual ~GMPStorage() {}
+};
+
+already_AddRefed<GMPStorage> CreateGMPMemoryStorage();
+already_AddRefed<GMPStorage> CreateGMPDiskStorage(const nsCString& aNodeId,
+ const nsString& aGMPName);
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif \ No newline at end of file
diff --git a/dom/media/gmp/GMPStorageChild.cpp b/dom/media/gmp/GMPStorageChild.cpp
new file mode 100644
index 000000000..052b56d1b
--- /dev/null
+++ b/dom/media/gmp/GMPStorageChild.cpp
@@ -0,0 +1,380 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPStorageChild.h"
+#include "GMPChild.h"
+#include "gmp-storage.h"
+#include "base/task.h"
+
+#define ON_GMP_THREAD() (mPlugin->GMPMessageLoop() == MessageLoop::current())
+
+#define CALL_ON_GMP_THREAD(_func, ...) \
+ do { \
+ if (ON_GMP_THREAD()) { \
+ _func(__VA_ARGS__); \
+ } else { \
+ mPlugin->GMPMessageLoop()->PostTask( \
+ dont_add_new_uses_of_this::NewRunnableMethod(this, &GMPStorageChild::_func, ##__VA_ARGS__) \
+ ); \
+ } \
+ } while(false)
+
+static nsTArray<uint8_t>
+ToArray(const uint8_t* aData, uint32_t aDataSize)
+{
+ nsTArray<uint8_t> data;
+ data.AppendElements(aData, aDataSize);
+ return mozilla::Move(data);
+}
+
+namespace mozilla {
+namespace gmp {
+
+GMPRecordImpl::GMPRecordImpl(GMPStorageChild* aOwner,
+ const nsCString& aName,
+ GMPRecordClient* aClient)
+ : mName(aName)
+ , mClient(aClient)
+ , mOwner(aOwner)
+{
+}
+
+GMPErr
+GMPRecordImpl::Open()
+{
+ return mOwner->Open(this);
+}
+
+void
+GMPRecordImpl::OpenComplete(GMPErr aStatus)
+{
+ mClient->OpenComplete(aStatus);
+}
+
+GMPErr
+GMPRecordImpl::Read()
+{
+ return mOwner->Read(this);
+}
+
+void
+GMPRecordImpl::ReadComplete(GMPErr aStatus,
+ const uint8_t* aBytes,
+ uint32_t aLength)
+{
+ mClient->ReadComplete(aStatus, aBytes, aLength);
+}
+
+GMPErr
+GMPRecordImpl::Write(const uint8_t* aData, uint32_t aDataSize)
+{
+ return mOwner->Write(this, aData, aDataSize);
+}
+
+void
+GMPRecordImpl::WriteComplete(GMPErr aStatus)
+{
+ mClient->WriteComplete(aStatus);
+}
+
+GMPErr
+GMPRecordImpl::Close()
+{
+ RefPtr<GMPRecordImpl> kungfuDeathGrip(this);
+ // Delete our self reference.
+ Release();
+ mOwner->Close(this->Name());
+ return GMPNoErr;
+}
+
+GMPStorageChild::GMPStorageChild(GMPChild* aPlugin)
+ : mMonitor("GMPStorageChild")
+ , mPlugin(aPlugin)
+ , mShutdown(false)
+{
+ MOZ_ASSERT(ON_GMP_THREAD());
+}
+
+GMPErr
+GMPStorageChild::CreateRecord(const nsCString& aRecordName,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient)
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (mShutdown) {
+ NS_WARNING("GMPStorage used after it's been shutdown!");
+ return GMPClosedErr;
+ }
+
+ MOZ_ASSERT(aRecordName.Length() && aOutRecord);
+
+ if (HasRecord(aRecordName)) {
+ return GMPRecordInUse;
+ }
+
+ RefPtr<GMPRecordImpl> record(new GMPRecordImpl(this, aRecordName, aClient));
+ mRecords.Put(aRecordName, record); // Addrefs
+
+ // The GMPRecord holds a self reference until the GMP calls Close() on
+ // it. This means the object is always valid (even if neutered) while
+ // the GMP expects it to be.
+ record.forget(aOutRecord);
+
+ return GMPNoErr;
+}
+
+bool
+GMPStorageChild::HasRecord(const nsCString& aRecordName)
+{
+ mMonitor.AssertCurrentThreadOwns();
+ return mRecords.Contains(aRecordName);
+}
+
+already_AddRefed<GMPRecordImpl>
+GMPStorageChild::GetRecord(const nsCString& aRecordName)
+{
+ MonitorAutoLock lock(mMonitor);
+ RefPtr<GMPRecordImpl> record;
+ mRecords.Get(aRecordName, getter_AddRefs(record));
+ return record.forget();
+}
+
+GMPErr
+GMPStorageChild::Open(GMPRecordImpl* aRecord)
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (mShutdown) {
+ NS_WARNING("GMPStorage used after it's been shutdown!");
+ return GMPClosedErr;
+ }
+
+ if (!HasRecord(aRecord->Name())) {
+ // Trying to re-open a record that has already been closed.
+ return GMPClosedErr;
+ }
+
+ CALL_ON_GMP_THREAD(SendOpen, aRecord->Name());
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPStorageChild::Read(GMPRecordImpl* aRecord)
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (mShutdown) {
+ NS_WARNING("GMPStorage used after it's been shutdown!");
+ return GMPClosedErr;
+ }
+
+ if (!HasRecord(aRecord->Name())) {
+ // Record not opened.
+ return GMPClosedErr;
+ }
+
+ CALL_ON_GMP_THREAD(SendRead, aRecord->Name());
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPStorageChild::Write(GMPRecordImpl* aRecord,
+ const uint8_t* aData,
+ uint32_t aDataSize)
+{
+ if (aDataSize > GMP_MAX_RECORD_SIZE) {
+ return GMPQuotaExceededErr;
+ }
+
+ MonitorAutoLock lock(mMonitor);
+
+ if (mShutdown) {
+ NS_WARNING("GMPStorage used after it's been shutdown!");
+ return GMPClosedErr;
+ }
+
+ if (!HasRecord(aRecord->Name())) {
+ // Record not opened.
+ return GMPClosedErr;
+ }
+
+ CALL_ON_GMP_THREAD(SendWrite, aRecord->Name(), ToArray(aData, aDataSize));
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPStorageChild::Close(const nsCString& aRecordName)
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (!HasRecord(aRecordName)) {
+ // Already closed.
+ return GMPClosedErr;
+ }
+
+ mRecords.Remove(aRecordName);
+
+ if (!mShutdown) {
+ CALL_ON_GMP_THREAD(SendClose, aRecordName);
+ }
+
+ return GMPNoErr;
+}
+
+bool
+GMPStorageChild::RecvOpenComplete(const nsCString& aRecordName,
+ const GMPErr& aStatus)
+{
+ // We don't need a lock to read |mShutdown| since it is only changed in
+ // the GMP thread.
+ if (mShutdown) {
+ return true;
+ }
+ RefPtr<GMPRecordImpl> record = GetRecord(aRecordName);
+ if (!record) {
+ // Not fatal.
+ return true;
+ }
+ record->OpenComplete(aStatus);
+ return true;
+}
+
+bool
+GMPStorageChild::RecvReadComplete(const nsCString& aRecordName,
+ const GMPErr& aStatus,
+ InfallibleTArray<uint8_t>&& aBytes)
+{
+ if (mShutdown) {
+ return true;
+ }
+ RefPtr<GMPRecordImpl> record = GetRecord(aRecordName);
+ if (!record) {
+ // Not fatal.
+ return true;
+ }
+ record->ReadComplete(aStatus, aBytes.Elements(), aBytes.Length());
+ return true;
+}
+
+bool
+GMPStorageChild::RecvWriteComplete(const nsCString& aRecordName,
+ const GMPErr& aStatus)
+{
+ if (mShutdown) {
+ return true;
+ }
+ RefPtr<GMPRecordImpl> record = GetRecord(aRecordName);
+ if (!record) {
+ // Not fatal.
+ return true;
+ }
+ record->WriteComplete(aStatus);
+ return true;
+}
+
+GMPErr
+GMPStorageChild::EnumerateRecords(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg)
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (mShutdown) {
+ NS_WARNING("GMPStorage used after it's been shutdown!");
+ return GMPClosedErr;
+ }
+
+ MOZ_ASSERT(aRecvIteratorFunc);
+ mPendingRecordIterators.push(RecordIteratorContext(aRecvIteratorFunc, aUserArg));
+
+ CALL_ON_GMP_THREAD(SendGetRecordNames);
+
+ return GMPNoErr;
+}
+
+class GMPRecordIteratorImpl : public GMPRecordIterator {
+public:
+ explicit GMPRecordIteratorImpl(const InfallibleTArray<nsCString>& aRecordNames)
+ : mRecordNames(aRecordNames)
+ , mIndex(0)
+ {
+ mRecordNames.Sort();
+ }
+
+ GMPErr GetName(const char** aOutName, uint32_t* aOutNameLength) override {
+ if (!aOutName || !aOutNameLength) {
+ return GMPInvalidArgErr;
+ }
+ if (mIndex == mRecordNames.Length()) {
+ return GMPEndOfEnumeration;
+ }
+ *aOutName = mRecordNames[mIndex].get();
+ *aOutNameLength = mRecordNames[mIndex].Length();
+ return GMPNoErr;
+ }
+
+ GMPErr NextRecord() override {
+ if (mIndex < mRecordNames.Length()) {
+ mIndex++;
+ }
+ return (mIndex < mRecordNames.Length()) ? GMPNoErr
+ : GMPEndOfEnumeration;
+ }
+
+ void Close() override {
+ delete this;
+ }
+
+private:
+ nsTArray<nsCString> mRecordNames;
+ size_t mIndex;
+};
+
+bool
+GMPStorageChild::RecvRecordNames(InfallibleTArray<nsCString>&& aRecordNames,
+ const GMPErr& aStatus)
+{
+ RecordIteratorContext ctx;
+ {
+ MonitorAutoLock lock(mMonitor);
+ if (mShutdown || mPendingRecordIterators.empty()) {
+ return true;
+ }
+ ctx = mPendingRecordIterators.front();
+ mPendingRecordIterators.pop();
+ }
+
+ if (GMP_FAILED(aStatus)) {
+ ctx.mFunc(nullptr, ctx.mUserArg, aStatus);
+ } else {
+ ctx.mFunc(new GMPRecordIteratorImpl(aRecordNames), ctx.mUserArg, GMPNoErr);
+ }
+
+ return true;
+}
+
+bool
+GMPStorageChild::RecvShutdown()
+{
+ // Block any new storage requests, and thus any messages back to the
+ // parent. We don't delete any objects here, as that may invalidate
+ // GMPRecord pointers held by the GMP.
+ MonitorAutoLock lock(mMonitor);
+ mShutdown = true;
+ while (!mPendingRecordIterators.empty()) {
+ mPendingRecordIterators.pop();
+ }
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
+
+// avoid redefined macro in unified build
+#undef ON_GMP_THREAD
+#undef CALL_ON_GMP_THREAD
diff --git a/dom/media/gmp/GMPStorageChild.h b/dom/media/gmp/GMPStorageChild.h
new file mode 100644
index 000000000..3c5948a30
--- /dev/null
+++ b/dom/media/gmp/GMPStorageChild.h
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPStorageChild_h_
+#define GMPStorageChild_h_
+
+#include "mozilla/gmp/PGMPStorageChild.h"
+#include "gmp-storage.h"
+#include "nsTHashtable.h"
+#include "nsRefPtrHashtable.h"
+#include "gmp-platform.h"
+
+#include <queue>
+
+namespace mozilla {
+namespace gmp {
+
+class GMPChild;
+class GMPStorageChild;
+
+class GMPRecordImpl : public GMPRecord
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPRecordImpl)
+
+ GMPRecordImpl(GMPStorageChild* aOwner,
+ const nsCString& aName,
+ GMPRecordClient* aClient);
+
+ // GMPRecord.
+ GMPErr Open() override;
+ GMPErr Read() override;
+ GMPErr Write(const uint8_t* aData,
+ uint32_t aDataSize) override;
+ GMPErr Close() override;
+
+ const nsCString& Name() const { return mName; }
+
+ void OpenComplete(GMPErr aStatus);
+ void ReadComplete(GMPErr aStatus, const uint8_t* aBytes, uint32_t aLength);
+ void WriteComplete(GMPErr aStatus);
+
+private:
+ ~GMPRecordImpl() {}
+ const nsCString mName;
+ GMPRecordClient* const mClient;
+ GMPStorageChild* const mOwner;
+};
+
+class GMPStorageChild : public PGMPStorageChild
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPStorageChild)
+
+ explicit GMPStorageChild(GMPChild* aPlugin);
+
+ GMPErr CreateRecord(const nsCString& aRecordName,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient);
+
+ GMPErr Open(GMPRecordImpl* aRecord);
+
+ GMPErr Read(GMPRecordImpl* aRecord);
+
+ GMPErr Write(GMPRecordImpl* aRecord,
+ const uint8_t* aData,
+ uint32_t aDataSize);
+
+ GMPErr Close(const nsCString& aRecordName);
+
+ GMPErr EnumerateRecords(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg);
+
+private:
+ bool HasRecord(const nsCString& aRecordName);
+ already_AddRefed<GMPRecordImpl> GetRecord(const nsCString& aRecordName);
+
+protected:
+ ~GMPStorageChild() {}
+
+ // PGMPStorageChild
+ bool RecvOpenComplete(const nsCString& aRecordName,
+ const GMPErr& aStatus) override;
+ bool RecvReadComplete(const nsCString& aRecordName,
+ const GMPErr& aStatus,
+ InfallibleTArray<uint8_t>&& aBytes) override;
+ bool RecvWriteComplete(const nsCString& aRecordName,
+ const GMPErr& aStatus) override;
+ bool RecvRecordNames(InfallibleTArray<nsCString>&& aRecordNames,
+ const GMPErr& aStatus) override;
+ bool RecvShutdown() override;
+
+private:
+ Monitor mMonitor;
+ nsRefPtrHashtable<nsCStringHashKey, GMPRecordImpl> mRecords;
+ GMPChild* mPlugin;
+
+ struct RecordIteratorContext {
+ explicit RecordIteratorContext(RecvGMPRecordIteratorPtr aFunc,
+ void* aUserArg)
+ : mFunc(aFunc)
+ , mUserArg(aUserArg)
+ {}
+ RecordIteratorContext() {}
+ RecvGMPRecordIteratorPtr mFunc;
+ void* mUserArg;
+ };
+
+ std::queue<RecordIteratorContext> mPendingRecordIterators;
+ bool mShutdown;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPStorageChild_h_
diff --git a/dom/media/gmp/GMPStorageParent.cpp b/dom/media/gmp/GMPStorageParent.cpp
new file mode 100644
index 000000000..e3eadeccf
--- /dev/null
+++ b/dom/media/gmp/GMPStorageParent.cpp
@@ -0,0 +1,220 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPStorageParent.h"
+#include "GMPParent.h"
+#include "gmp-storage.h"
+#include "mozilla/Unused.h"
+#include "mozIGeckoMediaPluginService.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+namespace gmp {
+
+GMPStorageParent::GMPStorageParent(const nsCString& aNodeId,
+ GMPParent* aPlugin)
+ : mNodeId(aNodeId)
+ , mPlugin(aPlugin)
+ , mShutdown(true)
+{
+}
+
+nsresult
+GMPStorageParent::Init()
+{
+ LOGD(("GMPStorageParent[%p]::Init()", this));
+
+ if (NS_WARN_IF(mNodeId.IsEmpty())) {
+ return NS_ERROR_FAILURE;
+ }
+ RefPtr<GeckoMediaPluginServiceParent> mps(GeckoMediaPluginServiceParent::GetSingleton());
+ if (NS_WARN_IF(!mps)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ bool persistent = false;
+ if (NS_WARN_IF(NS_FAILED(mps->IsPersistentStorageAllowed(mNodeId, &persistent)))) {
+ return NS_ERROR_FAILURE;
+ }
+ if (persistent) {
+ mStorage = CreateGMPDiskStorage(mNodeId, mPlugin->GetPluginBaseName());
+ } else {
+ mStorage = mps->GetMemoryStorageFor(mNodeId);
+ }
+ if (!mStorage) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mShutdown = false;
+ return NS_OK;
+}
+
+bool
+GMPStorageParent::RecvOpen(const nsCString& aRecordName)
+{
+ LOGD(("GMPStorageParent[%p]::RecvOpen(record='%s')",
+ this, aRecordName.get()));
+
+ if (mShutdown) {
+ return false;
+ }
+
+ if (mNodeId.EqualsLiteral("null")) {
+ // Refuse to open storage if the page is opened from local disk,
+ // or shared across origin.
+ LOGD(("GMPStorageParent[%p]::RecvOpen(record='%s') failed; null nodeId",
+ this, aRecordName.get()));
+ Unused << SendOpenComplete(aRecordName, GMPGenericErr);
+ return true;
+ }
+
+ if (aRecordName.IsEmpty()) {
+ LOGD(("GMPStorageParent[%p]::RecvOpen(record='%s') failed; record name empty",
+ this, aRecordName.get()));
+ Unused << SendOpenComplete(aRecordName, GMPGenericErr);
+ return true;
+ }
+
+ if (mStorage->IsOpen(aRecordName)) {
+ LOGD(("GMPStorageParent[%p]::RecvOpen(record='%s') failed; record in use",
+ this, aRecordName.get()));
+ Unused << SendOpenComplete(aRecordName, GMPRecordInUse);
+ return true;
+ }
+
+ auto err = mStorage->Open(aRecordName);
+ MOZ_ASSERT(GMP_FAILED(err) || mStorage->IsOpen(aRecordName));
+ LOGD(("GMPStorageParent[%p]::RecvOpen(record='%s') complete; rv=%d",
+ this, aRecordName.get(), err));
+ Unused << SendOpenComplete(aRecordName, err);
+
+ return true;
+}
+
+bool
+GMPStorageParent::RecvRead(const nsCString& aRecordName)
+{
+ LOGD(("GMPStorageParent[%p]::RecvRead(record='%s')",
+ this, aRecordName.get()));
+
+ if (mShutdown) {
+ return false;
+ }
+
+ nsTArray<uint8_t> data;
+ if (!mStorage->IsOpen(aRecordName)) {
+ LOGD(("GMPStorageParent[%p]::RecvRead(record='%s') failed; record not open",
+ this, aRecordName.get()));
+ Unused << SendReadComplete(aRecordName, GMPClosedErr, data);
+ } else {
+ GMPErr rv = mStorage->Read(aRecordName, data);
+ LOGD(("GMPStorageParent[%p]::RecvRead(record='%s') read %d bytes rv=%d",
+ this, aRecordName.get(), data.Length(), rv));
+ Unused << SendReadComplete(aRecordName, rv, data);
+ }
+
+ return true;
+}
+
+bool
+GMPStorageParent::RecvWrite(const nsCString& aRecordName,
+ InfallibleTArray<uint8_t>&& aBytes)
+{
+ LOGD(("GMPStorageParent[%p]::RecvWrite(record='%s') %d bytes",
+ this, aRecordName.get(), aBytes.Length()));
+
+ if (mShutdown) {
+ return false;
+ }
+
+ if (!mStorage->IsOpen(aRecordName)) {
+ LOGD(("GMPStorageParent[%p]::RecvWrite(record='%s') failed record not open",
+ this, aRecordName.get()));
+ Unused << SendWriteComplete(aRecordName, GMPClosedErr);
+ return true;
+ }
+
+ if (aBytes.Length() > GMP_MAX_RECORD_SIZE) {
+ LOGD(("GMPStorageParent[%p]::RecvWrite(record='%s') failed record too big",
+ this, aRecordName.get()));
+ Unused << SendWriteComplete(aRecordName, GMPQuotaExceededErr);
+ return true;
+ }
+
+ GMPErr rv = mStorage->Write(aRecordName, aBytes);
+ LOGD(("GMPStorageParent[%p]::RecvWrite(record='%s') write complete rv=%d",
+ this, aRecordName.get(), rv));
+
+ Unused << SendWriteComplete(aRecordName, rv);
+
+ return true;
+}
+
+bool
+GMPStorageParent::RecvGetRecordNames()
+{
+ if (mShutdown) {
+ return true;
+ }
+
+ nsTArray<nsCString> recordNames;
+ GMPErr status = mStorage->GetRecordNames(recordNames);
+
+ LOGD(("GMPStorageParent[%p]::RecvGetRecordNames() status=%d numRecords=%d",
+ this, status, recordNames.Length()));
+
+ Unused << SendRecordNames(recordNames, status);
+
+ return true;
+}
+
+bool
+GMPStorageParent::RecvClose(const nsCString& aRecordName)
+{
+ LOGD(("GMPStorageParent[%p]::RecvClose(record='%s')",
+ this, aRecordName.get()));
+
+ if (mShutdown) {
+ return true;
+ }
+
+ mStorage->Close(aRecordName);
+
+ return true;
+}
+
+void
+GMPStorageParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD(("GMPStorageParent[%p]::ActorDestroy(reason=%d)", this, aWhy));
+ Shutdown();
+}
+
+void
+GMPStorageParent::Shutdown()
+{
+ LOGD(("GMPStorageParent[%p]::Shutdown()", this));
+
+ if (mShutdown) {
+ return;
+ }
+ mShutdown = true;
+ Unused << SendShutdown();
+
+ mStorage = nullptr;
+
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPStorageParent.h b/dom/media/gmp/GMPStorageParent.h
new file mode 100644
index 000000000..3d2ea69ac
--- /dev/null
+++ b/dom/media/gmp/GMPStorageParent.h
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPStorageParent_h_
+#define GMPStorageParent_h_
+
+#include "mozilla/gmp/PGMPStorageParent.h"
+#include "GMPStorage.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPParent;
+
+class GMPStorageParent : public PGMPStorageParent {
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPStorageParent)
+ GMPStorageParent(const nsCString& aNodeId,
+ GMPParent* aPlugin);
+
+ nsresult Init();
+ void Shutdown();
+
+protected:
+ bool RecvOpen(const nsCString& aRecordName) override;
+ bool RecvRead(const nsCString& aRecordName) override;
+ bool RecvWrite(const nsCString& aRecordName,
+ InfallibleTArray<uint8_t>&& aBytes) override;
+ bool RecvGetRecordNames() override;
+ bool RecvClose(const nsCString& aRecordName) override;
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+private:
+ ~GMPStorageParent() {}
+
+ RefPtr<GMPStorage> mStorage;
+
+ const nsCString mNodeId;
+ RefPtr<GMPParent> mPlugin;
+ // True after Shutdown(), or if Init() has not completed successfully.
+ bool mShutdown;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPStorageParent_h_
diff --git a/dom/media/gmp/GMPTimerChild.cpp b/dom/media/gmp/GMPTimerChild.cpp
new file mode 100644
index 000000000..0b2b55c79
--- /dev/null
+++ b/dom/media/gmp/GMPTimerChild.cpp
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPTimerChild.h"
+#include "GMPPlatform.h"
+#include "GMPChild.h"
+
+#define MAX_NUM_TIMERS 1000
+
+namespace mozilla {
+namespace gmp {
+
+GMPTimerChild::GMPTimerChild(GMPChild* aPlugin)
+ : mTimerCount(1)
+ , mPlugin(aPlugin)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+}
+
+GMPTimerChild::~GMPTimerChild()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+}
+
+GMPErr
+GMPTimerChild::SetTimer(GMPTask* aTask, int64_t aTimeoutMS)
+{
+ if (!aTask) {
+ NS_WARNING("Tried to set timer with null task!");
+ return GMPGenericErr;
+ }
+
+ if (mPlugin->GMPMessageLoop() != MessageLoop::current()) {
+ NS_WARNING("Tried to set GMP timer on non-main thread.");
+ return GMPGenericErr;
+ }
+
+ if (mTimers.Count() > MAX_NUM_TIMERS) {
+ return GMPQuotaExceededErr;
+ }
+ uint32_t timerId = mTimerCount;
+ mTimers.Put(timerId, aTask);
+ mTimerCount++;
+
+ if (!SendSetTimer(timerId, aTimeoutMS)) {
+ return GMPGenericErr;
+ }
+ return GMPNoErr;
+}
+
+bool
+GMPTimerChild::RecvTimerExpired(const uint32_t& aTimerId)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ GMPTask* task = mTimers.Get(aTimerId);
+ mTimers.Remove(aTimerId);
+ if (task) {
+ RunOnMainThread(task);
+ }
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPTimerChild.h b/dom/media/gmp/GMPTimerChild.h
new file mode 100644
index 000000000..c63a49480
--- /dev/null
+++ b/dom/media/gmp/GMPTimerChild.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPTimerChild_h_
+#define GMPTimerChild_h_
+
+#include "mozilla/gmp/PGMPTimerChild.h"
+#include "mozilla/Monitor.h"
+#include "nsDataHashtable.h"
+#include "nsHashKeys.h"
+#include "gmp-errors.h"
+#include "gmp-platform.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPChild;
+
+class GMPTimerChild : public PGMPTimerChild
+{
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPTimerChild)
+
+ explicit GMPTimerChild(GMPChild* aPlugin);
+
+ GMPErr SetTimer(GMPTask* aTask, int64_t aTimeoutMS);
+
+protected:
+ // GMPTimerChild
+ bool RecvTimerExpired(const uint32_t& aTimerId) override;
+
+private:
+ ~GMPTimerChild();
+
+ nsDataHashtable<nsUint32HashKey, GMPTask*> mTimers;
+ uint32_t mTimerCount;
+
+ GMPChild* mPlugin;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPTimerChild_h_
diff --git a/dom/media/gmp/GMPTimerParent.cpp b/dom/media/gmp/GMPTimerParent.cpp
new file mode 100644
index 000000000..50861b97f
--- /dev/null
+++ b/dom/media/gmp/GMPTimerParent.cpp
@@ -0,0 +1,123 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPTimerParent.h"
+#include "nsComponentManagerUtils.h"
+#include "mozilla/Unused.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPParent"
+
+namespace gmp {
+
+GMPTimerParent::GMPTimerParent(nsIThread* aGMPThread)
+ : mGMPThread(aGMPThread)
+ , mIsOpen(true)
+{
+}
+
+bool
+GMPTimerParent::RecvSetTimer(const uint32_t& aTimerId,
+ const uint32_t& aTimeoutMs)
+{
+ LOGD(("%s::%s: %p mIsOpen=%d", __CLASS__, __FUNCTION__, this, mIsOpen));
+
+ MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
+
+ if (!mIsOpen) {
+ return true;
+ }
+
+ nsresult rv;
+ nsAutoPtr<Context> ctx(new Context());
+ ctx->mTimer = do_CreateInstance("@mozilla.org/timer;1", &rv);
+ NS_ENSURE_SUCCESS(rv, true);
+
+ ctx->mId = aTimerId;
+ rv = ctx->mTimer->SetTarget(mGMPThread);
+ NS_ENSURE_SUCCESS(rv, true);
+ ctx->mParent = this;
+
+ rv = ctx->mTimer->InitWithFuncCallback(&GMPTimerParent::GMPTimerExpired,
+ ctx,
+ aTimeoutMs,
+ nsITimer::TYPE_ONE_SHOT);
+ NS_ENSURE_SUCCESS(rv, true);
+
+ mTimers.PutEntry(ctx.forget());
+
+ return true;
+}
+
+void
+GMPTimerParent::Shutdown()
+{
+ LOGD(("%s::%s: %p mIsOpen=%d", __CLASS__, __FUNCTION__, this, mIsOpen));
+
+ MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
+
+ for (auto iter = mTimers.Iter(); !iter.Done(); iter.Next()) {
+ Context* context = iter.Get()->GetKey();
+ context->mTimer->Cancel();
+ delete context;
+ }
+
+ mTimers.Clear();
+ mIsOpen = false;
+}
+
+void
+GMPTimerParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD(("%s::%s: %p mIsOpen=%d", __CLASS__, __FUNCTION__, this, mIsOpen));
+
+ Shutdown();
+}
+
+/* static */
+void
+GMPTimerParent::GMPTimerExpired(nsITimer *aTimer, void *aClosure)
+{
+ MOZ_ASSERT(aClosure);
+ nsAutoPtr<Context> ctx(static_cast<Context*>(aClosure));
+ MOZ_ASSERT(ctx->mParent);
+ if (ctx->mParent) {
+ ctx->mParent->TimerExpired(ctx);
+ }
+}
+
+void
+GMPTimerParent::TimerExpired(Context* aContext)
+{
+ LOGD(("%s::%s: %p mIsOpen=%d", __CLASS__, __FUNCTION__, this, mIsOpen));
+ MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
+
+ if (!mIsOpen) {
+ return;
+ }
+
+ uint32_t id = aContext->mId;
+ mTimers.RemoveEntry(aContext);
+ if (id) {
+ Unused << SendTimerExpired(id);
+ }
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPTimerParent.h b/dom/media/gmp/GMPTimerParent.h
new file mode 100644
index 000000000..0aad36121
--- /dev/null
+++ b/dom/media/gmp/GMPTimerParent.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPTimerParent_h_
+#define GMPTimerParent_h_
+
+#include "mozilla/gmp/PGMPTimerParent.h"
+#include "nsITimer.h"
+#include "nsCOMPtr.h"
+#include "nsClassHashtable.h"
+#include "nsHashKeys.h"
+#include "mozilla/Monitor.h"
+#include "nsIThread.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPTimerParent : public PGMPTimerParent {
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPTimerParent)
+ explicit GMPTimerParent(nsIThread* aGMPThread);
+
+ void Shutdown();
+
+protected:
+ bool RecvSetTimer(const uint32_t& aTimerId,
+ const uint32_t& aTimeoutMs) override;
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+private:
+ ~GMPTimerParent() {}
+
+ static void GMPTimerExpired(nsITimer *aTimer, void *aClosure);
+
+ struct Context {
+ Context() {
+ MOZ_COUNT_CTOR(Context);
+ }
+ ~Context() {
+ MOZ_COUNT_DTOR(Context);
+ }
+ nsCOMPtr<nsITimer> mTimer;
+ RefPtr<GMPTimerParent> mParent; // Note: live timers keep the GMPTimerParent alive.
+ uint32_t mId;
+ };
+
+ void TimerExpired(Context* aContext);
+
+ nsTHashtable<nsPtrHashKey<Context>> mTimers;
+
+ nsCOMPtr<nsIThread> mGMPThread;
+
+ bool mIsOpen;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPTimerParent_h_
diff --git a/dom/media/gmp/GMPTypes.ipdlh b/dom/media/gmp/GMPTypes.ipdlh
new file mode 100644
index 000000000..44df5fc3d
--- /dev/null
+++ b/dom/media/gmp/GMPTypes.ipdlh
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+using GMPBufferType from "gmp-video-codec.h";
+using GMPAudioCodecType from "gmp-audio-codec.h";
+using GMPMediaKeyStatus from "gmp-decryption.h";
+
+namespace mozilla {
+namespace gmp {
+
+struct GMPDecryptionData {
+ uint8_t[] mKeyId;
+ uint8_t[] mIV;
+ uint16_t[] mClearBytes;
+ uint32_t[] mCipherBytes;
+ nsCString[] mSessionIds;
+};
+
+struct GMPVideoEncodedFrameData
+{
+ uint32_t mEncodedWidth;
+ uint32_t mEncodedHeight;
+ uint64_t mTimestamp; // microseconds
+ uint64_t mDuration; // microseconds
+ uint32_t mFrameType;
+ uint32_t mSize;
+ GMPBufferType mBufferType;
+ Shmem mBuffer;
+ bool mCompleteFrame;
+ GMPDecryptionData mDecryptionData;
+};
+
+struct GMPPlaneData
+{
+ int32_t mSize;
+ int32_t mStride;
+ Shmem mBuffer;
+};
+
+struct GMPVideoi420FrameData
+{
+ GMPPlaneData mYPlane;
+ GMPPlaneData mUPlane;
+ GMPPlaneData mVPlane;
+ int32_t mWidth;
+ int32_t mHeight;
+ uint64_t mTimestamp; // microseconds
+ uint64_t mDuration; // microseconds
+};
+
+struct GMPAudioCodecData
+{
+ GMPAudioCodecType mCodecType;
+ uint32_t mChannelCount;
+ uint32_t mBitsPerChannel;
+ uint32_t mSamplesPerSecond;
+
+ uint8_t[] mExtraData;
+};
+
+struct GMPAudioEncodedSampleData
+{
+ uint8_t[] mData;
+ uint64_t mTimeStamp; // microseconds.
+ GMPDecryptionData mDecryptionData;
+ uint32_t mChannelCount;
+ uint32_t mSamplesPerSecond;
+};
+
+struct GMPAudioDecodedSampleData
+{
+ int16_t[] mData;
+ uint64_t mTimeStamp; // microseconds.
+ uint32_t mChannelCount;
+ uint32_t mSamplesPerSecond;
+};
+
+struct GMPKeyInformation {
+ uint8_t[] keyId;
+ GMPMediaKeyStatus status;
+};
+
+}
+}
diff --git a/dom/media/gmp/GMPUtils.cpp b/dom/media/gmp/GMPUtils.cpp
new file mode 100644
index 000000000..d27523760
--- /dev/null
+++ b/dom/media/gmp/GMPUtils.cpp
@@ -0,0 +1,229 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPUtils.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsIFile.h"
+#include "nsCOMPtr.h"
+#include "nsLiteralString.h"
+#include "nsCRTGlue.h"
+#include "mozilla/Base64.h"
+#include "nsISimpleEnumerator.h"
+
+namespace mozilla {
+
+bool
+GetEMEVoucherPath(nsIFile** aPath)
+{
+ nsCOMPtr<nsIFile> path;
+ NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(path));
+ if (!path) {
+ NS_WARNING("GetEMEVoucherPath can't get NS_GRE_DIR!");
+ return false;
+ }
+ path->AppendNative(NS_LITERAL_CSTRING("voucher.bin"));
+ path.forget(aPath);
+ return true;
+}
+
+bool
+EMEVoucherFileExists()
+{
+ nsCOMPtr<nsIFile> path;
+ bool exists;
+ return GetEMEVoucherPath(getter_AddRefs(path)) &&
+ NS_SUCCEEDED(path->Exists(&exists)) &&
+ exists;
+}
+
+void
+SplitAt(const char* aDelims,
+ const nsACString& aInput,
+ nsTArray<nsCString>& aOutTokens)
+{
+ nsAutoCString str(aInput);
+ char* end = str.BeginWriting();
+ const char* start = nullptr;
+ while (!!(start = NS_strtok(aDelims, &end))) {
+ aOutTokens.AppendElement(nsCString(start));
+ }
+}
+
+nsCString
+ToBase64(const nsTArray<uint8_t>& aBytes)
+{
+ nsAutoCString base64;
+ nsDependentCSubstring raw(reinterpret_cast<const char*>(aBytes.Elements()),
+ aBytes.Length());
+ nsresult rv = Base64Encode(raw, base64);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return NS_LITERAL_CSTRING("[Base64EncodeFailed]");
+ }
+ return base64;
+}
+
+bool
+FileExists(nsIFile* aFile)
+{
+ bool exists = false;
+ return aFile && NS_SUCCEEDED(aFile->Exists(&exists)) && exists;
+}
+
+DirectoryEnumerator::DirectoryEnumerator(nsIFile* aPath, Mode aMode)
+ : mMode(aMode)
+{
+ aPath->GetDirectoryEntries(getter_AddRefs(mIter));
+}
+
+already_AddRefed<nsIFile>
+DirectoryEnumerator::Next()
+{
+ if (!mIter) {
+ return nullptr;
+ }
+ bool hasMore = false;
+ while (NS_SUCCEEDED(mIter->HasMoreElements(&hasMore)) && hasMore) {
+ nsCOMPtr<nsISupports> supports;
+ nsresult rv = mIter->GetNext(getter_AddRefs(supports));
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ nsCOMPtr<nsIFile> path(do_QueryInterface(supports, &rv));
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ if (mMode == DirsOnly) {
+ bool isDirectory = false;
+ rv = path->IsDirectory(&isDirectory);
+ if (NS_FAILED(rv) || !isDirectory) {
+ continue;
+ }
+ }
+ return path.forget();
+ }
+ return nullptr;
+}
+
+bool
+ReadIntoArray(nsIFile* aFile,
+ nsTArray<uint8_t>& aOutDst,
+ size_t aMaxLength)
+{
+ if (!FileExists(aFile)) {
+ return false;
+ }
+
+ PRFileDesc* fd = nullptr;
+ nsresult rv = aFile->OpenNSPRFileDesc(PR_RDONLY, 0, &fd);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ int32_t length = PR_Seek(fd, 0, PR_SEEK_END);
+ PR_Seek(fd, 0, PR_SEEK_SET);
+
+ if (length < 0 || (size_t)length > aMaxLength) {
+ NS_WARNING("EME file is longer than maximum allowed length");
+ PR_Close(fd);
+ return false;
+ }
+ aOutDst.SetLength(length);
+ int32_t bytesRead = PR_Read(fd, aOutDst.Elements(), length);
+ PR_Close(fd);
+ return (bytesRead == length);
+}
+
+bool
+ReadIntoString(nsIFile* aFile,
+ nsCString& aOutDst,
+ size_t aMaxLength)
+{
+ nsTArray<uint8_t> buf;
+ bool rv = ReadIntoArray(aFile, buf, aMaxLength);
+ if (rv) {
+ buf.AppendElement(0); // Append null terminator, required by nsC*String.
+ aOutDst = nsDependentCString((const char*)buf.Elements(), buf.Length() - 1);
+ }
+ return rv;
+}
+
+bool
+GMPInfoFileParser::Init(nsIFile* aInfoFile)
+{
+ nsTArray<nsCString> lines;
+ static const size_t MAX_GMP_INFO_FILE_LENGTH = 5 * 1024;
+
+ nsAutoCString info;
+ if (!ReadIntoString(aInfoFile, info, MAX_GMP_INFO_FILE_LENGTH)) {
+ NS_WARNING("Failed to read info file in GMP process.");
+ return false;
+ }
+
+ // Note: we pass "\r\n" to SplitAt so that we'll split lines delimited
+ // by \n (Unix), \r\n (Windows) and \r (old MacOSX).
+ SplitAt("\r\n", info, lines);
+
+ for (nsCString line : lines) {
+ // Field name is the string up to but not including the first ':'
+ // character on the line.
+ int32_t colon = line.FindChar(':');
+ if (colon <= 0) {
+ // Not allowed to be the first character.
+ // Info field name must be at least one character.
+ continue;
+ }
+ nsAutoCString key(Substring(line, 0, colon));
+ ToLowerCase(key);
+ key.Trim(" ");
+
+ nsCString* value = new nsCString(Substring(line, colon + 1));
+ value->Trim(" ");
+ mValues.Put(key, value); // Hashtable assumes ownership of value.
+ }
+
+ return true;
+}
+
+bool
+GMPInfoFileParser::Contains(const nsCString& aKey) const {
+ nsCString key(aKey);
+ ToLowerCase(key);
+ return mValues.Contains(key);
+}
+
+nsCString
+GMPInfoFileParser::Get(const nsCString& aKey) const {
+ MOZ_ASSERT(Contains(aKey));
+ nsCString key(aKey);
+ ToLowerCase(key);
+ nsCString* p = nullptr;
+ if (mValues.Get(key, &p)) {
+ return nsCString(*p);
+ }
+ return EmptyCString();
+}
+
+bool
+HaveGMPFor(const nsCString& aAPI,
+ nsTArray<nsCString>&& aTags)
+{
+ nsCOMPtr<mozIGeckoMediaPluginService> mps =
+ do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ if (NS_WARN_IF(!mps)) {
+ return false;
+ }
+
+ bool hasPlugin = false;
+ if (NS_FAILED(mps->HasPluginForAPI(aAPI, &aTags, &hasPlugin))) {
+ return false;
+ }
+ return hasPlugin;
+}
+
+
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPUtils.h b/dom/media/gmp/GMPUtils.h
new file mode 100644
index 000000000..7e7b9f26f
--- /dev/null
+++ b/dom/media/gmp/GMPUtils.h
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPUtils_h_
+#define GMPUtils_h_
+
+#include "mozilla/UniquePtr.h"
+#include "nsTArray.h"
+#include "nsCOMPtr.h"
+#include "nsClassHashtable.h"
+
+class nsIFile;
+class nsCString;
+class nsISimpleEnumerator;
+
+namespace mozilla {
+
+template<typename T>
+struct DestroyPolicy
+{
+ void operator()(T* aGMPObject) const {
+ aGMPObject->Destroy();
+ }
+};
+
+template<typename T>
+using GMPUniquePtr = mozilla::UniquePtr<T, DestroyPolicy<T>>;
+
+bool GetEMEVoucherPath(nsIFile** aPath);
+
+bool EMEVoucherFileExists();
+
+void
+SplitAt(const char* aDelims,
+ const nsACString& aInput,
+ nsTArray<nsCString>& aOutTokens);
+
+nsCString
+ToBase64(const nsTArray<uint8_t>& aBytes);
+
+bool
+FileExists(nsIFile* aFile);
+
+// Enumerate directory entries for a specified path.
+class DirectoryEnumerator {
+public:
+
+ enum Mode {
+ DirsOnly, // Enumeration only includes directories.
+ FilesAndDirs // Enumeration includes directories and non-directory files.
+ };
+
+ DirectoryEnumerator(nsIFile* aPath, Mode aMode);
+
+ already_AddRefed<nsIFile> Next();
+
+private:
+ Mode mMode;
+ nsCOMPtr<nsISimpleEnumerator> mIter;
+};
+
+class GMPInfoFileParser {
+public:
+ bool Init(nsIFile* aFile);
+ bool Contains(const nsCString& aKey) const;
+ nsCString Get(const nsCString& aKey) const;
+private:
+ nsClassHashtable<nsCStringHashKey, nsCString> mValues;
+};
+
+bool
+ReadIntoArray(nsIFile* aFile,
+ nsTArray<uint8_t>& aOutDst,
+ size_t aMaxLength);
+
+bool
+ReadIntoString(nsIFile* aFile,
+ nsCString& aOutDst,
+ size_t aMaxLength);
+
+bool
+HaveGMPFor(const nsCString& aAPI,
+ nsTArray<nsCString>&& aTags);
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/gmp/GMPVideoDecoderChild.cpp b/dom/media/gmp/GMPVideoDecoderChild.cpp
new file mode 100644
index 000000000..f9c1956e7
--- /dev/null
+++ b/dom/media/gmp/GMPVideoDecoderChild.cpp
@@ -0,0 +1,254 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoDecoderChild.h"
+#include "GMPVideoi420FrameImpl.h"
+#include "GMPContentChild.h"
+#include <stdio.h>
+#include "mozilla/Unused.h"
+#include "GMPVideoEncodedFrameImpl.h"
+#include "runnable_utils.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPVideoDecoderChild::GMPVideoDecoderChild(GMPContentChild* aPlugin)
+ : GMPSharedMemManager(aPlugin)
+ , mPlugin(aPlugin)
+ , mVideoDecoder(nullptr)
+ , mVideoHost(this)
+ , mNeedShmemIntrCount(0)
+ , mPendingDecodeComplete(false)
+{
+ MOZ_ASSERT(mPlugin);
+}
+
+GMPVideoDecoderChild::~GMPVideoDecoderChild()
+{
+ MOZ_ASSERT(!mNeedShmemIntrCount);
+}
+
+void
+GMPVideoDecoderChild::Init(GMPVideoDecoder* aDecoder)
+{
+ MOZ_ASSERT(aDecoder, "Cannot initialize video decoder child without a video decoder!");
+ mVideoDecoder = aDecoder;
+}
+
+GMPVideoHostImpl&
+GMPVideoDecoderChild::Host()
+{
+ return mVideoHost;
+}
+
+void
+GMPVideoDecoderChild::Decoded(GMPVideoi420Frame* aDecodedFrame)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ if (!aDecodedFrame) {
+ MOZ_CRASH("Not given a decoded frame!");
+ }
+
+ auto df = static_cast<GMPVideoi420FrameImpl*>(aDecodedFrame);
+
+ GMPVideoi420FrameData frameData;
+ df->InitFrameData(frameData);
+ SendDecoded(frameData);
+
+ aDecodedFrame->Destroy();
+}
+
+void
+GMPVideoDecoderChild::ReceivedDecodedReferenceFrame(const uint64_t aPictureId)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendReceivedDecodedReferenceFrame(aPictureId);
+}
+
+void
+GMPVideoDecoderChild::ReceivedDecodedFrame(const uint64_t aPictureId)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendReceivedDecodedFrame(aPictureId);
+}
+
+void
+GMPVideoDecoderChild::InputDataExhausted()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendInputDataExhausted();
+}
+
+void
+GMPVideoDecoderChild::DrainComplete()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendDrainComplete();
+}
+
+void
+GMPVideoDecoderChild::ResetComplete()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendResetComplete();
+}
+
+void
+GMPVideoDecoderChild::Error(GMPErr aError)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendError(aError);
+}
+
+bool
+GMPVideoDecoderChild::RecvInitDecode(const GMPVideoCodec& aCodecSettings,
+ InfallibleTArray<uint8_t>&& aCodecSpecific,
+ const int32_t& aCoreCount)
+{
+ if (!mVideoDecoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoDecoder->InitDecode(aCodecSettings,
+ aCodecSpecific.Elements(),
+ aCodecSpecific.Length(),
+ this,
+ aCoreCount);
+ return true;
+}
+
+bool
+GMPVideoDecoderChild::RecvDecode(const GMPVideoEncodedFrameData& aInputFrame,
+ const bool& aMissingFrames,
+ InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
+ const int64_t& aRenderTimeMs)
+{
+ if (!mVideoDecoder) {
+ return false;
+ }
+
+ auto f = new GMPVideoEncodedFrameImpl(aInputFrame, &mVideoHost);
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoDecoder->Decode(f,
+ aMissingFrames,
+ aCodecSpecificInfo.Elements(),
+ aCodecSpecificInfo.Length(),
+ aRenderTimeMs);
+
+ return true;
+}
+
+bool
+GMPVideoDecoderChild::RecvChildShmemForPool(Shmem&& aFrameBuffer)
+{
+ if (aFrameBuffer.IsWritable()) {
+ mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPFrameData,
+ aFrameBuffer);
+ }
+ return true;
+}
+
+bool
+GMPVideoDecoderChild::RecvReset()
+{
+ if (!mVideoDecoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoDecoder->Reset();
+
+ return true;
+}
+
+bool
+GMPVideoDecoderChild::RecvDrain()
+{
+ if (!mVideoDecoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoDecoder->Drain();
+
+ return true;
+}
+
+bool
+GMPVideoDecoderChild::RecvDecodingComplete()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ if (mNeedShmemIntrCount) {
+ // There's a GMP blocked in Alloc() waiting for the CallNeedShem() to
+ // return a frame they can use. Don't call the GMP's DecodingComplete()
+ // now and don't delete the GMPVideoDecoderChild, defer processing the
+ // DecodingComplete() until once the Alloc() finishes.
+ mPendingDecodeComplete = true;
+ return true;
+ }
+ if (mVideoDecoder) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoDecoder->DecodingComplete();
+ mVideoDecoder = nullptr;
+ }
+
+ mVideoHost.DoneWithAPI();
+
+ mPlugin = nullptr;
+
+ Unused << Send__delete__(this);
+
+ return true;
+}
+
+bool
+GMPVideoDecoderChild::Alloc(size_t aSize,
+ Shmem::SharedMemory::SharedMemoryType aType,
+ Shmem* aMem)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ bool rv;
+#ifndef SHMEM_ALLOC_IN_CHILD
+ ++mNeedShmemIntrCount;
+ rv = CallNeedShmem(aSize, aMem);
+ --mNeedShmemIntrCount;
+ if (mPendingDecodeComplete && mNeedShmemIntrCount == 0) {
+ mPendingDecodeComplete = false;
+ mPlugin->GMPMessageLoop()->PostTask(
+ NewRunnableMethod(this, &GMPVideoDecoderChild::RecvDecodingComplete));
+ }
+#else
+#ifdef GMP_SAFE_SHMEM
+ rv = AllocShmem(aSize, aType, aMem);
+#else
+ rv = AllocUnsafeShmem(aSize, aType, aMem);
+#endif
+#endif
+ return rv;
+}
+
+void
+GMPVideoDecoderChild::Dealloc(Shmem& aMem)
+{
+#ifndef SHMEM_ALLOC_IN_CHILD
+ SendParentShmemForPool(aMem);
+#else
+ DeallocShmem(aMem);
+#endif
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoDecoderChild.h b/dom/media/gmp/GMPVideoDecoderChild.h
new file mode 100644
index 000000000..2271a70a1
--- /dev/null
+++ b/dom/media/gmp/GMPVideoDecoderChild.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoDecoderChild_h_
+#define GMPVideoDecoderChild_h_
+
+#include "nsString.h"
+#include "mozilla/gmp/PGMPVideoDecoderChild.h"
+#include "gmp-video-decode.h"
+#include "GMPSharedMemManager.h"
+#include "GMPVideoHost.h"
+#include "mozilla/gmp/GMPTypes.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentChild;
+
+class GMPVideoDecoderChild : public PGMPVideoDecoderChild,
+ public GMPVideoDecoderCallback,
+ public GMPSharedMemManager
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPVideoDecoderChild);
+
+ explicit GMPVideoDecoderChild(GMPContentChild* aPlugin);
+
+ void Init(GMPVideoDecoder* aDecoder);
+ GMPVideoHostImpl& Host();
+
+ // GMPVideoDecoderCallback
+ void Decoded(GMPVideoi420Frame* decodedFrame) override;
+ void ReceivedDecodedReferenceFrame(const uint64_t pictureId) override;
+ void ReceivedDecodedFrame(const uint64_t pictureId) override;
+ void InputDataExhausted() override;
+ void DrainComplete() override;
+ void ResetComplete() override;
+ void Error(GMPErr aError) override;
+
+ // GMPSharedMemManager
+ bool Alloc(size_t aSize, Shmem::SharedMemory::SharedMemoryType aType, Shmem* aMem) override;
+ void Dealloc(Shmem& aMem) override;
+
+private:
+ virtual ~GMPVideoDecoderChild();
+
+ // PGMPVideoDecoderChild
+ bool RecvInitDecode(const GMPVideoCodec& aCodecSettings,
+ InfallibleTArray<uint8_t>&& aCodecSpecific,
+ const int32_t& aCoreCount) override;
+ bool RecvDecode(const GMPVideoEncodedFrameData& aInputFrame,
+ const bool& aMissingFrames,
+ InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
+ const int64_t& aRenderTimeMs) override;
+ bool RecvChildShmemForPool(Shmem&& aFrameBuffer) override;
+ bool RecvReset() override;
+ bool RecvDrain() override;
+ bool RecvDecodingComplete() override;
+
+ GMPContentChild* mPlugin;
+ GMPVideoDecoder* mVideoDecoder;
+ GMPVideoHostImpl mVideoHost;
+
+ // Non-zero when a GMP is blocked spinning the IPC message loop while
+ // waiting on an NeedShmem to complete.
+ int mNeedShmemIntrCount;
+ bool mPendingDecodeComplete;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPVideoDecoderChild_h_
diff --git a/dom/media/gmp/GMPVideoDecoderParent.cpp b/dom/media/gmp/GMPVideoDecoderParent.cpp
new file mode 100644
index 000000000..bd5408adb
--- /dev/null
+++ b/dom/media/gmp/GMPVideoDecoderParent.cpp
@@ -0,0 +1,513 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoDecoderParent.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Unused.h"
+#include "nsAutoRef.h"
+#include "nsThreadUtils.h"
+#include "GMPUtils.h"
+#include "GMPVideoEncodedFrameImpl.h"
+#include "GMPVideoi420FrameImpl.h"
+#include "GMPContentParent.h"
+#include "GMPMessageUtils.h"
+#include "mozilla/gmp/GMPTypes.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGV(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Verbose, msg)
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOGE(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Error, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+namespace gmp {
+
+// States:
+// Initial: mIsOpen == false
+// on InitDecode success -> Open
+// on Shutdown -> Dead
+// Open: mIsOpen == true
+// on Close -> Dead
+// on ActorDestroy -> Dead
+// on Shutdown -> Dead
+// Dead: mIsOpen == false
+
+GMPVideoDecoderParent::GMPVideoDecoderParent(GMPContentParent* aPlugin)
+ : GMPSharedMemManager(aPlugin)
+ , mIsOpen(false)
+ , mShuttingDown(false)
+ , mActorDestroyed(false)
+ , mIsAwaitingResetComplete(false)
+ , mIsAwaitingDrainComplete(false)
+ , mPlugin(aPlugin)
+ , mCallback(nullptr)
+ , mVideoHost(this)
+ , mPluginId(aPlugin->GetPluginId())
+ , mFrameCount(0)
+{
+ MOZ_ASSERT(mPlugin);
+}
+
+GMPVideoDecoderParent::~GMPVideoDecoderParent()
+{
+}
+
+GMPVideoHostImpl&
+GMPVideoDecoderParent::Host()
+{
+ return mVideoHost;
+}
+
+// Note: may be called via Terminated()
+void
+GMPVideoDecoderParent::Close()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::Close()", this));
+ MOZ_ASSERT(!mPlugin || mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ // Ensure if we've received a Close while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the close. This seems unlikely to happen, but better to be careful.
+ UnblockResetAndDrain();
+
+ // Consumer is done with us; we can shut down. No more callbacks should
+ // be made to mCallback. Note: do this before Shutdown()!
+ mCallback = nullptr;
+ // Let Shutdown mark us as dead so it knows if we had been alive
+
+ // In case this is the last reference
+ RefPtr<GMPVideoDecoderParent> kungfudeathgrip(this);
+ Release();
+ Shutdown();
+}
+
+nsresult
+GMPVideoDecoderParent::InitDecode(const GMPVideoCodec& aCodecSettings,
+ const nsTArray<uint8_t>& aCodecSpecific,
+ GMPVideoDecoderCallbackProxy* aCallback,
+ int32_t aCoreCount)
+{
+ LOGD(("GMPVideoDecoderParent[%p]::InitDecode()", this));
+
+ if (mActorDestroyed) {
+ NS_WARNING("Trying to use a destroyed GMP video decoder!");
+ return NS_ERROR_FAILURE;
+ }
+ if (mIsOpen) {
+ NS_WARNING("Trying to re-init an in-use GMP video decoder!");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!aCallback) {
+ return NS_ERROR_FAILURE;
+ }
+ mCallback = aCallback;
+
+ if (!SendInitDecode(aCodecSettings, aCodecSpecific, aCoreCount)) {
+ return NS_ERROR_FAILURE;
+ }
+ mIsOpen = true;
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+nsresult
+GMPVideoDecoderParent::Decode(GMPUniquePtr<GMPVideoEncodedFrame> aInputFrame,
+ bool aMissingFrames,
+ const nsTArray<uint8_t>& aCodecSpecificInfo,
+ int64_t aRenderTimeMs)
+{
+ LOGV(("GMPVideoDecoderParent[%p]::Decode() timestamp=%lld keyframe=%d",
+ this, aInputFrame->TimeStamp(),
+ aInputFrame->FrameType() == kGMPKeyFrame));
+
+ if (!mIsOpen) {
+ LOGE(("GMPVideoDecoderParent[%p]::Decode() ERROR; dead GMPVideoDecoder", this));
+ NS_WARNING("Trying to use an dead GMP video decoder");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ GMPUniquePtr<GMPVideoEncodedFrameImpl> inputFrameImpl(
+ static_cast<GMPVideoEncodedFrameImpl*>(aInputFrame.release()));
+
+ // Very rough kill-switch if the plugin stops processing. If it's merely
+ // hung and continues, we'll come back to life eventually.
+ // 3* is because we're using 3 buffers per frame for i420 data for now.
+ if ((NumInUse(GMPSharedMem::kGMPFrameData) > 3*GMPSharedMem::kGMPBufLimit) ||
+ (NumInUse(GMPSharedMem::kGMPEncodedData) > GMPSharedMem::kGMPBufLimit)) {
+ LOGE(("GMPVideoDecoderParent[%p]::Decode() ERROR; shmem buffer limit hit frame=%d encoded=%d",
+ this, NumInUse(GMPSharedMem::kGMPFrameData), NumInUse(GMPSharedMem::kGMPEncodedData)));
+ return NS_ERROR_FAILURE;
+ }
+
+ GMPVideoEncodedFrameData frameData;
+ inputFrameImpl->RelinquishFrameData(frameData);
+
+ if (!SendDecode(frameData,
+ aMissingFrames,
+ aCodecSpecificInfo,
+ aRenderTimeMs)) {
+ LOGE(("GMPVideoDecoderParent[%p]::Decode() ERROR; SendDecode() failure.", this));
+ return NS_ERROR_FAILURE;
+ }
+ mFrameCount++;
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+nsresult
+GMPVideoDecoderParent::Reset()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::Reset()", this));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an dead GMP video decoder");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendReset()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mIsAwaitingResetComplete = true;
+
+ RefPtr<GMPVideoDecoderParent> self(this);
+ nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([self]() -> void
+ {
+ LOGD(("GMPVideoDecoderParent[%p]::ResetCompleteTimeout() timed out waiting for ResetComplete", self.get()));
+ self->mResetCompleteTimeout = nullptr;
+ LogToBrowserConsole(NS_LITERAL_STRING("GMPVideoDecoderParent timed out waiting for ResetComplete()"));
+ });
+ CancelResetCompleteTimeout();
+ mResetCompleteTimeout = SimpleTimer::Create(task, 5000, mPlugin->GMPThread());
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+void
+GMPVideoDecoderParent::CancelResetCompleteTimeout()
+{
+ if (mResetCompleteTimeout) {
+ mResetCompleteTimeout->Cancel();
+ mResetCompleteTimeout = nullptr;
+ }
+}
+
+nsresult
+GMPVideoDecoderParent::Drain()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::Drain() frameCount=%d", this, mFrameCount));
+
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an dead GMP video decoder");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendDrain()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mIsAwaitingDrainComplete = true;
+
+ // Async IPC, we don't have access to a return value.
+ return NS_OK;
+}
+
+const nsCString&
+GMPVideoDecoderParent::GetDisplayName() const
+{
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an dead GMP video decoder");
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ return mPlugin->GetDisplayName();
+}
+
+// Note: Consider keeping ActorDestroy sync'd up when making changes here.
+nsresult
+GMPVideoDecoderParent::Shutdown()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::Shutdown()", this));
+ MOZ_ASSERT(!mPlugin || mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (mShuttingDown) {
+ return NS_OK;
+ }
+ mShuttingDown = true;
+
+ // Ensure if we've received a shutdown while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the shutdown.
+ UnblockResetAndDrain();
+
+ // Notify client we're gone! Won't occur after Close()
+ if (mCallback) {
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+
+ mIsOpen = false;
+ if (!mActorDestroyed) {
+ Unused << SendDecodingComplete();
+ }
+
+ return NS_OK;
+}
+
+// Note: Keep this sync'd up with Shutdown
+void
+GMPVideoDecoderParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD(("GMPVideoDecoderParent[%p]::ActorDestroy reason=%d", this, aWhy));
+
+ mIsOpen = false;
+ mActorDestroyed = true;
+
+ // Ensure if we've received a destroy while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the error.
+ UnblockResetAndDrain();
+
+ if (mCallback) {
+ // May call Close() (and Shutdown()) immediately or with a delay
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+ if (mPlugin) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mPlugin->VideoDecoderDestroyed(this);
+ mPlugin = nullptr;
+ }
+ mVideoHost.ActorDestroyed();
+ MaybeDisconnect(aWhy == AbnormalShutdown);
+}
+
+bool
+GMPVideoDecoderParent::RecvDecoded(const GMPVideoi420FrameData& aDecodedFrame)
+{
+ --mFrameCount;
+ LOGV(("GMPVideoDecoderParent[%p]::RecvDecoded() timestamp=%lld frameCount=%d",
+ this, aDecodedFrame.mTimestamp(), mFrameCount));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ if (!GMPVideoi420FrameImpl::CheckFrameData(aDecodedFrame)) {
+ LOGE(("GMPVideoDecoderParent[%p]::RecvDecoded() "
+ "timestamp=%lld decoded frame corrupt, ignoring"));
+ return false;
+ }
+ auto f = new GMPVideoi420FrameImpl(aDecodedFrame, &mVideoHost);
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->Decoded(f);
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvReceivedDecodedReferenceFrame(const uint64_t& aPictureId)
+{
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->ReceivedDecodedReferenceFrame(aPictureId);
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvReceivedDecodedFrame(const uint64_t& aPictureId)
+{
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->ReceivedDecodedFrame(aPictureId);
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvInputDataExhausted()
+{
+ LOGV(("GMPVideoDecoderParent[%p]::RecvInputDataExhausted()", this));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->InputDataExhausted();
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvDrainComplete()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::RecvDrainComplete() frameCount=%d", this, mFrameCount));
+ nsAutoString msg;
+ msg.AppendLiteral("GMPVideoDecoderParent::RecvDrainComplete() outstanding frames=");
+ msg.AppendInt(mFrameCount);
+ LogToBrowserConsole(msg);
+ if (!mCallback) {
+ return false;
+ }
+
+ if (!mIsAwaitingDrainComplete) {
+ return true;
+ }
+ mIsAwaitingDrainComplete = false;
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->DrainComplete();
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvResetComplete()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::RecvResetComplete()", this));
+
+ CancelResetCompleteTimeout();
+
+ if (!mCallback) {
+ return false;
+ }
+
+ if (!mIsAwaitingResetComplete) {
+ return true;
+ }
+ mIsAwaitingResetComplete = false;
+ mFrameCount = 0;
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->ResetComplete();
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvError(const GMPErr& aError)
+{
+ LOGD(("GMPVideoDecoderParent[%p]::RecvError(error=%d)", this, aError));
+
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ensure if we've received an error while waiting for a ResetComplete
+ // or DrainComplete notification, we'll unblock the caller before processing
+ // the error.
+ UnblockResetAndDrain();
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->Error(aError);
+
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvShutdown()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::RecvShutdown()", this));
+
+ Shutdown();
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::RecvParentShmemForPool(Shmem&& aEncodedBuffer)
+{
+ if (aEncodedBuffer.IsWritable()) {
+ mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData,
+ aEncodedBuffer);
+ }
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::AnswerNeedShmem(const uint32_t& aFrameBufferSize,
+ Shmem* aMem)
+{
+ ipc::Shmem mem;
+
+ if (!mVideoHost.SharedMemMgr()->MgrAllocShmem(GMPSharedMem::kGMPFrameData,
+ aFrameBufferSize,
+ ipc::SharedMemory::TYPE_BASIC, &mem))
+ {
+ LOGE(("%s: Failed to get a shared mem buffer for Child! size %u",
+ __FUNCTION__, aFrameBufferSize));
+ return false;
+ }
+ *aMem = mem;
+ mem = ipc::Shmem();
+ return true;
+}
+
+bool
+GMPVideoDecoderParent::Recv__delete__()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::Recv__delete__()", this));
+
+ if (mPlugin) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mPlugin->VideoDecoderDestroyed(this);
+ mPlugin = nullptr;
+ }
+
+ return true;
+}
+
+void
+GMPVideoDecoderParent::UnblockResetAndDrain()
+{
+ LOGD(("GMPVideoDecoderParent[%p]::UnblockResetAndDrain() "
+ "awaitingResetComplete=%d awaitingDrainComplete=%d",
+ this, mIsAwaitingResetComplete, mIsAwaitingDrainComplete));
+
+ if (!mCallback) {
+ MOZ_ASSERT(!mIsAwaitingResetComplete);
+ MOZ_ASSERT(!mIsAwaitingDrainComplete);
+ return;
+ }
+ if (mIsAwaitingResetComplete) {
+ mIsAwaitingResetComplete = false;
+ mCallback->ResetComplete();
+ }
+ if (mIsAwaitingDrainComplete) {
+ mIsAwaitingDrainComplete = false;
+ mCallback->DrainComplete();
+ }
+ CancelResetCompleteTimeout();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoDecoderParent.h b/dom/media/gmp/GMPVideoDecoderParent.h
new file mode 100644
index 000000000..215c784c1
--- /dev/null
+++ b/dom/media/gmp/GMPVideoDecoderParent.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoDecoderParent_h_
+#define GMPVideoDecoderParent_h_
+
+#include "mozilla/RefPtr.h"
+#include "gmp-video-decode.h"
+#include "mozilla/gmp/PGMPVideoDecoderParent.h"
+#include "GMPMessageUtils.h"
+#include "GMPSharedMemManager.h"
+#include "GMPUtils.h"
+#include "GMPVideoHost.h"
+#include "GMPVideoDecoderProxy.h"
+#include "VideoUtils.h"
+#include "GMPCrashHelperHolder.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentParent;
+
+class GMPVideoDecoderParent final : public PGMPVideoDecoderParent
+ , public GMPVideoDecoderProxy
+ , public GMPSharedMemManager
+ , public GMPCrashHelperHolder
+{
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPVideoDecoderParent)
+
+ explicit GMPVideoDecoderParent(GMPContentParent *aPlugin);
+
+ GMPVideoHostImpl& Host();
+ nsresult Shutdown();
+
+ // GMPVideoDecoder
+ void Close() override;
+ nsresult InitDecode(const GMPVideoCodec& aCodecSettings,
+ const nsTArray<uint8_t>& aCodecSpecific,
+ GMPVideoDecoderCallbackProxy* aCallback,
+ int32_t aCoreCount) override;
+ nsresult Decode(GMPUniquePtr<GMPVideoEncodedFrame> aInputFrame,
+ bool aMissingFrames,
+ const nsTArray<uint8_t>& aCodecSpecificInfo,
+ int64_t aRenderTimeMs = -1) override;
+ nsresult Reset() override;
+ nsresult Drain() override;
+ uint32_t GetPluginId() const override { return mPluginId; }
+ const nsCString& GetDisplayName() const override;
+
+ // GMPSharedMemManager
+ bool Alloc(size_t aSize, Shmem::SharedMemory::SharedMemoryType aType, Shmem* aMem) override
+ {
+#ifdef GMP_SAFE_SHMEM
+ return AllocShmem(aSize, aType, aMem);
+#else
+ return AllocUnsafeShmem(aSize, aType, aMem);
+#endif
+ }
+ void Dealloc(Shmem& aMem) override
+ {
+ DeallocShmem(aMem);
+ }
+
+private:
+ ~GMPVideoDecoderParent();
+
+ // PGMPVideoDecoderParent
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ bool RecvDecoded(const GMPVideoi420FrameData& aDecodedFrame) override;
+ bool RecvReceivedDecodedReferenceFrame(const uint64_t& aPictureId) override;
+ bool RecvReceivedDecodedFrame(const uint64_t& aPictureId) override;
+ bool RecvInputDataExhausted() override;
+ bool RecvDrainComplete() override;
+ bool RecvResetComplete() override;
+ bool RecvError(const GMPErr& aError) override;
+ bool RecvShutdown() override;
+ bool RecvParentShmemForPool(Shmem&& aEncodedBuffer) override;
+ bool AnswerNeedShmem(const uint32_t& aFrameBufferSize,
+ Shmem* aMem) override;
+ bool Recv__delete__() override;
+
+ void UnblockResetAndDrain();
+ void CancelResetCompleteTimeout();
+
+ bool mIsOpen;
+ bool mShuttingDown;
+ bool mActorDestroyed;
+ bool mIsAwaitingResetComplete;
+ bool mIsAwaitingDrainComplete;
+ RefPtr<GMPContentParent> mPlugin;
+ GMPVideoDecoderCallbackProxy* mCallback;
+ GMPVideoHostImpl mVideoHost;
+ const uint32_t mPluginId;
+ int32_t mFrameCount;
+ RefPtr<SimpleTimer> mResetCompleteTimeout;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPVideoDecoderParent_h_
diff --git a/dom/media/gmp/GMPVideoDecoderProxy.h b/dom/media/gmp/GMPVideoDecoderProxy.h
new file mode 100644
index 000000000..b9596fd21
--- /dev/null
+++ b/dom/media/gmp/GMPVideoDecoderProxy.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoDecoderProxy_h_
+#define GMPVideoDecoderProxy_h_
+
+#include "nsTArray.h"
+#include "gmp-video-decode.h"
+#include "gmp-video-frame-i420.h"
+#include "gmp-video-frame-encoded.h"
+
+#include "GMPCallbackBase.h"
+#include "GMPUtils.h"
+
+class GMPVideoDecoderCallbackProxy : public GMPCallbackBase,
+ public GMPVideoDecoderCallback
+{
+public:
+ virtual ~GMPVideoDecoderCallbackProxy() {}
+};
+
+// A proxy to GMPVideoDecoder in the child process.
+// GMPVideoDecoderParent exposes this to users the GMP.
+// This enables Gecko to pass nsTArrays to the child GMP and avoid
+// an extra copy when doing so.
+
+// The consumer must call Close() when done with the codec, or when
+// Terminated() is called by the GMP plugin indicating an abnormal shutdown
+// of the underlying plugin. After calling Close(), the consumer must
+// not access this again.
+
+// This interface is not thread-safe and must only be used from GMPThread.
+class GMPVideoDecoderProxy {
+public:
+ virtual nsresult InitDecode(const GMPVideoCodec& aCodecSettings,
+ const nsTArray<uint8_t>& aCodecSpecific,
+ GMPVideoDecoderCallbackProxy* aCallback,
+ int32_t aCoreCount) = 0;
+ virtual nsresult Decode(mozilla::GMPUniquePtr<GMPVideoEncodedFrame> aInputFrame,
+ bool aMissingFrames,
+ const nsTArray<uint8_t>& aCodecSpecificInfo,
+ int64_t aRenderTimeMs = -1) = 0;
+ virtual nsresult Reset() = 0;
+ virtual nsresult Drain() = 0;
+ virtual uint32_t GetPluginId() const = 0;
+
+ // Call to tell GMP/plugin the consumer will no longer use this
+ // interface/codec.
+ virtual void Close() = 0;
+
+ virtual const nsCString& GetDisplayName() const = 0;
+};
+
+#endif
diff --git a/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp b/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp
new file mode 100644
index 000000000..7725c5521
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncodedFrameImpl.cpp
@@ -0,0 +1,324 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoEncodedFrameImpl.h"
+#include "GMPVideoHost.h"
+#include "mozilla/gmp/GMPTypes.h"
+#include "GMPSharedMemManager.h"
+#include "GMPEncryptedBufferDataImpl.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPVideoEncodedFrameImpl::GMPVideoEncodedFrameImpl(GMPVideoHostImpl* aHost)
+: mEncodedWidth(0),
+ mEncodedHeight(0),
+ mTimeStamp(0ll),
+ mDuration(0ll),
+ mFrameType(kGMPDeltaFrame),
+ mSize(0),
+ mCompleteFrame(false),
+ mHost(aHost),
+ mBufferType(GMP_BufferSingle)
+{
+ MOZ_ASSERT(aHost);
+ aHost->EncodedFrameCreated(this);
+}
+
+GMPVideoEncodedFrameImpl::GMPVideoEncodedFrameImpl(const GMPVideoEncodedFrameData& aFrameData,
+ GMPVideoHostImpl* aHost)
+: mEncodedWidth(aFrameData.mEncodedWidth()),
+ mEncodedHeight(aFrameData.mEncodedHeight()),
+ mTimeStamp(aFrameData.mTimestamp()),
+ mDuration(aFrameData.mDuration()),
+ mFrameType(static_cast<GMPVideoFrameType>(aFrameData.mFrameType())),
+ mSize(aFrameData.mSize()),
+ mCompleteFrame(aFrameData.mCompleteFrame()),
+ mHost(aHost),
+ mBuffer(aFrameData.mBuffer()),
+ mBufferType(aFrameData.mBufferType())
+{
+ MOZ_ASSERT(aHost);
+ if (aFrameData.mDecryptionData().mKeyId().Length() > 0) {
+ mCrypto = new GMPEncryptedBufferDataImpl(aFrameData.mDecryptionData());
+ }
+ aHost->EncodedFrameCreated(this);
+}
+
+GMPVideoEncodedFrameImpl::~GMPVideoEncodedFrameImpl()
+{
+ DestroyBuffer();
+ if (mHost) {
+ mHost->EncodedFrameDestroyed(this);
+ }
+}
+
+void
+GMPVideoEncodedFrameImpl::InitCrypto(const CryptoSample& aCrypto)
+{
+ mCrypto = new GMPEncryptedBufferDataImpl(aCrypto);
+}
+
+const GMPEncryptedBufferMetadata*
+GMPVideoEncodedFrameImpl::GetDecryptionData() const
+{
+ return mCrypto;
+}
+
+GMPVideoFrameFormat
+GMPVideoEncodedFrameImpl::GetFrameFormat()
+{
+ return kGMPEncodedVideoFrame;
+}
+
+void
+GMPVideoEncodedFrameImpl::DoneWithAPI()
+{
+ DestroyBuffer();
+
+ // Do this after destroying the buffer because destruction
+ // involves deallocation, which requires a host.
+ mHost = nullptr;
+}
+
+void
+GMPVideoEncodedFrameImpl::ActorDestroyed()
+{
+ // Simply clear out Shmem reference, do not attempt to
+ // properly free it. It has already been freed.
+ mBuffer = ipc::Shmem();
+ // No more host.
+ mHost = nullptr;
+}
+
+bool
+GMPVideoEncodedFrameImpl::RelinquishFrameData(GMPVideoEncodedFrameData& aFrameData)
+{
+ aFrameData.mEncodedWidth() = mEncodedWidth;
+ aFrameData.mEncodedHeight() = mEncodedHeight;
+ aFrameData.mTimestamp() = mTimeStamp;
+ aFrameData.mDuration() = mDuration;
+ aFrameData.mFrameType() = mFrameType;
+ aFrameData.mSize() = mSize;
+ aFrameData.mCompleteFrame() = mCompleteFrame;
+ aFrameData.mBuffer() = mBuffer;
+ aFrameData.mBufferType() = mBufferType;
+ if (mCrypto) {
+ mCrypto->RelinquishData(aFrameData.mDecryptionData());
+ }
+
+ // This method is called right before Shmem is sent to another process.
+ // We need to effectively zero out our member copy so that we don't
+ // try to delete Shmem we don't own later.
+ mBuffer = ipc::Shmem();
+
+ return true;
+}
+
+void
+GMPVideoEncodedFrameImpl::DestroyBuffer()
+{
+ if (mHost && mBuffer.IsWritable()) {
+ mHost->SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData, mBuffer);
+ }
+ mBuffer = ipc::Shmem();
+}
+
+GMPErr
+GMPVideoEncodedFrameImpl::CreateEmptyFrame(uint32_t aSize)
+{
+ if (aSize == 0) {
+ DestroyBuffer();
+ } else if (aSize > AllocatedSize()) {
+ DestroyBuffer();
+ if (!mHost->SharedMemMgr()->MgrAllocShmem(GMPSharedMem::kGMPEncodedData, aSize,
+ ipc::SharedMemory::TYPE_BASIC, &mBuffer) ||
+ !Buffer()) {
+ return GMPAllocErr;
+ }
+ }
+ mSize = aSize;
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoEncodedFrameImpl::CopyFrame(const GMPVideoEncodedFrame& aFrame)
+{
+ auto& f = static_cast<const GMPVideoEncodedFrameImpl&>(aFrame);
+
+ if (f.mSize != 0) {
+ GMPErr err = CreateEmptyFrame(f.mSize);
+ if (err != GMPNoErr) {
+ return err;
+ }
+ memcpy(Buffer(), f.Buffer(), f.mSize);
+ }
+ mEncodedWidth = f.mEncodedWidth;
+ mEncodedHeight = f.mEncodedHeight;
+ mTimeStamp = f.mTimeStamp;
+ mDuration = f.mDuration;
+ mFrameType = f.mFrameType;
+ mSize = f.mSize; // already set...
+ mCompleteFrame = f.mCompleteFrame;
+ mBufferType = f.mBufferType;
+ mCrypto = new GMPEncryptedBufferDataImpl(*(f.mCrypto));
+ // Don't copy host, that should have been set properly on object creation via host.
+
+ return GMPNoErr;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetEncodedWidth(uint32_t aEncodedWidth)
+{
+ mEncodedWidth = aEncodedWidth;
+}
+
+uint32_t
+GMPVideoEncodedFrameImpl::EncodedWidth()
+{
+ return mEncodedWidth;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetEncodedHeight(uint32_t aEncodedHeight)
+{
+ mEncodedHeight = aEncodedHeight;
+}
+
+uint32_t
+GMPVideoEncodedFrameImpl::EncodedHeight()
+{
+ return mEncodedHeight;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetTimeStamp(uint64_t aTimeStamp)
+{
+ mTimeStamp = aTimeStamp;
+}
+
+uint64_t
+GMPVideoEncodedFrameImpl::TimeStamp()
+{
+ return mTimeStamp;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetDuration(uint64_t aDuration)
+{
+ mDuration = aDuration;
+}
+
+uint64_t
+GMPVideoEncodedFrameImpl::Duration() const
+{
+ return mDuration;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetFrameType(GMPVideoFrameType aFrameType)
+{
+ mFrameType = aFrameType;
+}
+
+GMPVideoFrameType
+GMPVideoEncodedFrameImpl::FrameType()
+{
+ return mFrameType;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetAllocatedSize(uint32_t aNewSize)
+{
+ if (aNewSize <= AllocatedSize()) {
+ return;
+ }
+
+ if (!mHost) {
+ return;
+ }
+
+ ipc::Shmem new_mem;
+ if (!mHost->SharedMemMgr()->MgrAllocShmem(GMPSharedMem::kGMPEncodedData, aNewSize,
+ ipc::SharedMemory::TYPE_BASIC, &new_mem) ||
+ !new_mem.get<uint8_t>()) {
+ return;
+ }
+
+ if (mBuffer.IsReadable()) {
+ memcpy(new_mem.get<uint8_t>(), Buffer(), mSize);
+ }
+
+ DestroyBuffer();
+
+ mBuffer = new_mem;
+}
+
+uint32_t
+GMPVideoEncodedFrameImpl::AllocatedSize()
+{
+ if (mBuffer.IsWritable()) {
+ return mBuffer.Size<uint8_t>();
+ }
+ return 0;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetSize(uint32_t aSize)
+{
+ mSize = aSize;
+}
+
+uint32_t
+GMPVideoEncodedFrameImpl::Size()
+{
+ return mSize;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetCompleteFrame(bool aCompleteFrame)
+{
+ mCompleteFrame = aCompleteFrame;
+}
+
+bool
+GMPVideoEncodedFrameImpl::CompleteFrame()
+{
+ return mCompleteFrame;
+}
+
+const uint8_t*
+GMPVideoEncodedFrameImpl::Buffer() const
+{
+ return mBuffer.get<uint8_t>();
+}
+
+uint8_t*
+GMPVideoEncodedFrameImpl::Buffer()
+{
+ return mBuffer.get<uint8_t>();
+}
+
+void
+GMPVideoEncodedFrameImpl::Destroy()
+{
+ delete this;
+}
+
+GMPBufferType
+GMPVideoEncodedFrameImpl::BufferType() const
+{
+ return mBufferType;
+}
+
+void
+GMPVideoEncodedFrameImpl::SetBufferType(GMPBufferType aBufferType)
+{
+ mBufferType = aBufferType;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoEncodedFrameImpl.h b/dom/media/gmp/GMPVideoEncodedFrameImpl.h
new file mode 100644
index 000000000..69858f1c6
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncodedFrameImpl.h
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2014, Mozilla Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMPVideoEncodedFrameImpl_h_
+#define GMPVideoEncodedFrameImpl_h_
+
+#include "gmp-errors.h"
+#include "gmp-video-frame.h"
+#include "gmp-video-frame-encoded.h"
+#include "gmp-decryption.h"
+#include "mozilla/ipc/Shmem.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+class CryptoSample;
+
+namespace gmp {
+
+class GMPVideoHostImpl;
+class GMPVideoEncodedFrameData;
+class GMPEncryptedBufferDataImpl;
+
+class GMPVideoEncodedFrameImpl: public GMPVideoEncodedFrame
+{
+ friend struct IPC::ParamTraits<mozilla::gmp::GMPVideoEncodedFrameImpl>;
+public:
+ explicit GMPVideoEncodedFrameImpl(GMPVideoHostImpl* aHost);
+ GMPVideoEncodedFrameImpl(const GMPVideoEncodedFrameData& aFrameData, GMPVideoHostImpl* aHost);
+ virtual ~GMPVideoEncodedFrameImpl();
+
+ void InitCrypto(const CryptoSample& aCrypto);
+
+ // This is called during a normal destroy sequence, which is
+ // when a consumer is finished or during XPCOM shutdown.
+ void DoneWithAPI();
+ // Does not attempt to release Shmem, as the Shmem has already been released.
+ void ActorDestroyed();
+
+ bool RelinquishFrameData(GMPVideoEncodedFrameData& aFrameData);
+
+ // GMPVideoFrame
+ GMPVideoFrameFormat GetFrameFormat() override;
+ void Destroy() override;
+
+ // GMPVideoEncodedFrame
+ GMPErr CreateEmptyFrame(uint32_t aSize) override;
+ GMPErr CopyFrame(const GMPVideoEncodedFrame& aFrame) override;
+ void SetEncodedWidth(uint32_t aEncodedWidth) override;
+ uint32_t EncodedWidth() override;
+ void SetEncodedHeight(uint32_t aEncodedHeight) override;
+ uint32_t EncodedHeight() override;
+ // Microseconds
+ void SetTimeStamp(uint64_t aTimeStamp) override;
+ uint64_t TimeStamp() override;
+ // Set frame duration (microseconds)
+ // NOTE: next-frame's Timestamp() != this-frame's TimeStamp()+Duration()
+ // depending on rounding to avoid having to track roundoff errors
+ // and dropped/missing frames(!) (which may leave a large gap)
+ void SetDuration(uint64_t aDuration) override;
+ uint64_t Duration() const override;
+ void SetFrameType(GMPVideoFrameType aFrameType) override;
+ GMPVideoFrameType FrameType() override;
+ void SetAllocatedSize(uint32_t aNewSize) override;
+ uint32_t AllocatedSize() override;
+ void SetSize(uint32_t aSize) override;
+ uint32_t Size() override;
+ void SetCompleteFrame(bool aCompleteFrame) override;
+ bool CompleteFrame() override;
+ const uint8_t* Buffer() const override;
+ uint8_t* Buffer() override;
+ GMPBufferType BufferType() const override;
+ void SetBufferType(GMPBufferType aBufferType) override;
+ const GMPEncryptedBufferMetadata* GetDecryptionData() const override;
+
+private:
+ void DestroyBuffer();
+
+ uint32_t mEncodedWidth;
+ uint32_t mEncodedHeight;
+ uint64_t mTimeStamp;
+ uint64_t mDuration;
+ GMPVideoFrameType mFrameType;
+ uint32_t mSize;
+ bool mCompleteFrame;
+ GMPVideoHostImpl* mHost;
+ ipc::Shmem mBuffer;
+ GMPBufferType mBufferType;
+ nsAutoPtr<GMPEncryptedBufferDataImpl> mCrypto;
+};
+
+} // namespace gmp
+
+} // namespace mozilla
+
+#endif // GMPVideoEncodedFrameImpl_h_
diff --git a/dom/media/gmp/GMPVideoEncoderChild.cpp b/dom/media/gmp/GMPVideoEncoderChild.cpp
new file mode 100644
index 000000000..f5c3dda95
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncoderChild.cpp
@@ -0,0 +1,235 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoEncoderChild.h"
+#include "GMPContentChild.h"
+#include <stdio.h>
+#include "mozilla/Unused.h"
+#include "GMPVideoEncodedFrameImpl.h"
+#include "GMPVideoi420FrameImpl.h"
+#include "runnable_utils.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPVideoEncoderChild::GMPVideoEncoderChild(GMPContentChild* aPlugin)
+ : GMPSharedMemManager(aPlugin)
+ , mPlugin(aPlugin)
+ , mVideoEncoder(nullptr)
+ , mVideoHost(this)
+ , mNeedShmemIntrCount(0)
+ , mPendingEncodeComplete(false)
+{
+ MOZ_ASSERT(mPlugin);
+}
+
+GMPVideoEncoderChild::~GMPVideoEncoderChild()
+{
+ MOZ_ASSERT(!mNeedShmemIntrCount);
+}
+
+void
+GMPVideoEncoderChild::Init(GMPVideoEncoder* aEncoder)
+{
+ MOZ_ASSERT(aEncoder, "Cannot initialize video encoder child without a video encoder!");
+ mVideoEncoder = aEncoder;
+}
+
+GMPVideoHostImpl&
+GMPVideoEncoderChild::Host()
+{
+ return mVideoHost;
+}
+
+void
+GMPVideoEncoderChild::Encoded(GMPVideoEncodedFrame* aEncodedFrame,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ auto ef = static_cast<GMPVideoEncodedFrameImpl*>(aEncodedFrame);
+
+ GMPVideoEncodedFrameData frameData;
+ ef->RelinquishFrameData(frameData);
+
+ nsTArray<uint8_t> codecSpecific;
+ codecSpecific.AppendElements(aCodecSpecificInfo, aCodecSpecificInfoLength);
+ SendEncoded(frameData, codecSpecific);
+
+ aEncodedFrame->Destroy();
+}
+
+void
+GMPVideoEncoderChild::Error(GMPErr aError)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ SendError(aError);
+}
+
+bool
+GMPVideoEncoderChild::RecvInitEncode(const GMPVideoCodec& aCodecSettings,
+ InfallibleTArray<uint8_t>&& aCodecSpecific,
+ const int32_t& aNumberOfCores,
+ const uint32_t& aMaxPayloadSize)
+{
+ if (!mVideoEncoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoEncoder->InitEncode(aCodecSettings,
+ aCodecSpecific.Elements(),
+ aCodecSpecific.Length(),
+ this,
+ aNumberOfCores,
+ aMaxPayloadSize);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::RecvEncode(const GMPVideoi420FrameData& aInputFrame,
+ InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
+ InfallibleTArray<GMPVideoFrameType>&& aFrameTypes)
+{
+ if (!mVideoEncoder) {
+ return false;
+ }
+
+ auto f = new GMPVideoi420FrameImpl(aInputFrame, &mVideoHost);
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoEncoder->Encode(f,
+ aCodecSpecificInfo.Elements(),
+ aCodecSpecificInfo.Length(),
+ aFrameTypes.Elements(),
+ aFrameTypes.Length());
+
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::RecvChildShmemForPool(Shmem&& aEncodedBuffer)
+{
+ if (aEncodedBuffer.IsWritable()) {
+ mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData,
+ aEncodedBuffer);
+ }
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::RecvSetChannelParameters(const uint32_t& aPacketLoss,
+ const uint32_t& aRTT)
+{
+ if (!mVideoEncoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoEncoder->SetChannelParameters(aPacketLoss, aRTT);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::RecvSetRates(const uint32_t& aNewBitRate,
+ const uint32_t& aFrameRate)
+{
+ if (!mVideoEncoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoEncoder->SetRates(aNewBitRate, aFrameRate);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::RecvSetPeriodicKeyFrames(const bool& aEnable)
+{
+ if (!mVideoEncoder) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoEncoder->SetPeriodicKeyFrames(aEnable);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::RecvEncodingComplete()
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ if (mNeedShmemIntrCount) {
+ // There's a GMP blocked in Alloc() waiting for the CallNeedShem() to
+ // return a frame they can use. Don't call the GMP's EncodingComplete()
+ // now and don't delete the GMPVideoEncoderChild, defer processing the
+ // EncodingComplete() until once the Alloc() finishes.
+ mPendingEncodeComplete = true;
+ return true;
+ }
+
+ if (!mVideoEncoder) {
+ Unused << Send__delete__(this);
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mVideoEncoder->EncodingComplete();
+
+ mVideoHost.DoneWithAPI();
+
+ mPlugin = nullptr;
+
+ Unused << Send__delete__(this);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderChild::Alloc(size_t aSize,
+ Shmem::SharedMemory::SharedMemoryType aType,
+ Shmem* aMem)
+{
+ MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current());
+
+ bool rv;
+#ifndef SHMEM_ALLOC_IN_CHILD
+ ++mNeedShmemIntrCount;
+ rv = CallNeedShmem(aSize, aMem);
+ --mNeedShmemIntrCount;
+ if (mPendingEncodeComplete && mNeedShmemIntrCount == 0) {
+ mPendingEncodeComplete = false;
+ mPlugin->GMPMessageLoop()->PostTask(
+ NewRunnableMethod(this, &GMPVideoEncoderChild::RecvEncodingComplete));
+ }
+#else
+#ifdef GMP_SAFE_SHMEM
+ rv = AllocShmem(aSize, aType, aMem);
+#else
+ rv = AllocUnsafeShmem(aSize, aType, aMem);
+#endif
+#endif
+ return rv;
+}
+
+void
+GMPVideoEncoderChild::Dealloc(Shmem& aMem)
+{
+#ifndef SHMEM_ALLOC_IN_CHILD
+ SendParentShmemForPool(aMem);
+#else
+ DeallocShmem(aMem);
+#endif
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoEncoderChild.h b/dom/media/gmp/GMPVideoEncoderChild.h
new file mode 100644
index 000000000..44e2fe605
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncoderChild.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoEncoderChild_h_
+#define GMPVideoEncoderChild_h_
+
+#include "nsString.h"
+#include "mozilla/gmp/PGMPVideoEncoderChild.h"
+#include "gmp-video-encode.h"
+#include "GMPSharedMemManager.h"
+#include "GMPVideoHost.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentChild;
+
+class GMPVideoEncoderChild : public PGMPVideoEncoderChild,
+ public GMPVideoEncoderCallback,
+ public GMPSharedMemManager
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPVideoEncoderChild);
+
+ explicit GMPVideoEncoderChild(GMPContentChild* aPlugin);
+
+ void Init(GMPVideoEncoder* aEncoder);
+ GMPVideoHostImpl& Host();
+
+ // GMPVideoEncoderCallback
+ void Encoded(GMPVideoEncodedFrame* aEncodedFrame,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength) override;
+ void Error(GMPErr aError) override;
+
+ // GMPSharedMemManager
+ bool Alloc(size_t aSize, Shmem::SharedMemory::SharedMemoryType aType,
+ Shmem* aMem) override;
+ void Dealloc(Shmem& aMem) override;
+
+private:
+ virtual ~GMPVideoEncoderChild();
+
+ // PGMPVideoEncoderChild
+ bool RecvInitEncode(const GMPVideoCodec& aCodecSettings,
+ InfallibleTArray<uint8_t>&& aCodecSpecific,
+ const int32_t& aNumberOfCores,
+ const uint32_t& aMaxPayloadSize) override;
+ bool RecvEncode(const GMPVideoi420FrameData& aInputFrame,
+ InfallibleTArray<uint8_t>&& aCodecSpecificInfo,
+ InfallibleTArray<GMPVideoFrameType>&& aFrameTypes) override;
+ bool RecvChildShmemForPool(Shmem&& aEncodedBuffer) override;
+ bool RecvSetChannelParameters(const uint32_t& aPacketLoss,
+ const uint32_t& aRTT) override;
+ bool RecvSetRates(const uint32_t& aNewBitRate,
+ const uint32_t& aFrameRate) override;
+ bool RecvSetPeriodicKeyFrames(const bool& aEnable) override;
+ bool RecvEncodingComplete() override;
+
+ GMPContentChild* mPlugin;
+ GMPVideoEncoder* mVideoEncoder;
+ GMPVideoHostImpl mVideoHost;
+
+ // Non-zero when a GMP is blocked spinning the IPC message loop while
+ // waiting on an NeedShmem to complete.
+ int mNeedShmemIntrCount;
+ bool mPendingEncodeComplete;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPVideoEncoderChild_h_
diff --git a/dom/media/gmp/GMPVideoEncoderParent.cpp b/dom/media/gmp/GMPVideoEncoderParent.cpp
new file mode 100644
index 000000000..95583cd6e
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncoderParent.cpp
@@ -0,0 +1,382 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoEncoderParent.h"
+#include "mozilla/Logging.h"
+#include "GMPVideoi420FrameImpl.h"
+#include "GMPVideoEncodedFrameImpl.h"
+#include "mozilla/Unused.h"
+#include "GMPMessageUtils.h"
+#include "nsAutoRef.h"
+#include "GMPContentParent.h"
+#include "mozilla/gmp/GMPTypes.h"
+#include "nsThread.h"
+#include "nsThreadUtils.h"
+#include "runnable_utils.h"
+#include "GMPUtils.h"
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetGMPLog();
+
+#define LOGD(msg) MOZ_LOG(GetGMPLog(), mozilla::LogLevel::Debug, msg)
+#define LOG(level, msg) MOZ_LOG(GetGMPLog(), (level), msg)
+
+#ifdef __CLASS__
+#undef __CLASS__
+#endif
+#define __CLASS__ "GMPVideoEncoderParent"
+
+namespace gmp {
+
+// States:
+// Initial: mIsOpen == false
+// on InitDecode success -> Open
+// on Shutdown -> Dead
+// Open: mIsOpen == true
+// on Close -> Dead
+// on ActorDestroy -> Dead
+// on Shutdown -> Dead
+// Dead: mIsOpen == false
+
+GMPVideoEncoderParent::GMPVideoEncoderParent(GMPContentParent *aPlugin)
+: GMPSharedMemManager(aPlugin),
+ mIsOpen(false),
+ mShuttingDown(false),
+ mActorDestroyed(false),
+ mPlugin(aPlugin),
+ mCallback(nullptr),
+ mVideoHost(this),
+ mPluginId(aPlugin->GetPluginId())
+{
+ MOZ_ASSERT(mPlugin);
+
+ nsresult rv = NS_NewNamedThread("GMPEncoded", getter_AddRefs(mEncodedThread));
+ if (NS_FAILED(rv)) {
+ MOZ_CRASH();
+ }
+}
+
+GMPVideoEncoderParent::~GMPVideoEncoderParent()
+{
+ if (mEncodedThread) {
+ mEncodedThread->Shutdown();
+ }
+}
+
+GMPVideoHostImpl&
+GMPVideoEncoderParent::Host()
+{
+ return mVideoHost;
+}
+
+// Note: may be called via Terminated()
+void
+GMPVideoEncoderParent::Close()
+{
+ LOGD(("%s::%s: %p", __CLASS__, __FUNCTION__, this));
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+ // Consumer is done with us; we can shut down. No more callbacks should
+ // be made to mCallback. Note: do this before Shutdown()!
+ mCallback = nullptr;
+ // Let Shutdown mark us as dead so it knows if we had been alive
+
+ // In case this is the last reference
+ RefPtr<GMPVideoEncoderParent> kungfudeathgrip(this);
+ Release();
+ Shutdown();
+}
+
+GMPErr
+GMPVideoEncoderParent::InitEncode(const GMPVideoCodec& aCodecSettings,
+ const nsTArray<uint8_t>& aCodecSpecific,
+ GMPVideoEncoderCallbackProxy* aCallback,
+ int32_t aNumberOfCores,
+ uint32_t aMaxPayloadSize)
+{
+ LOGD(("%s::%s: %p", __CLASS__, __FUNCTION__, this));
+ if (mIsOpen) {
+ NS_WARNING("Trying to re-init an in-use GMP video encoder!");
+ return GMPGenericErr;;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!aCallback) {
+ return GMPGenericErr;
+ }
+ mCallback = aCallback;
+
+ if (!SendInitEncode(aCodecSettings, aCodecSpecific, aNumberOfCores, aMaxPayloadSize)) {
+ return GMPGenericErr;
+ }
+ mIsOpen = true;
+
+ // Async IPC, we don't have access to a return value.
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoEncoderParent::Encode(GMPUniquePtr<GMPVideoi420Frame> aInputFrame,
+ const nsTArray<uint8_t>& aCodecSpecificInfo,
+ const nsTArray<GMPVideoFrameType>& aFrameTypes)
+{
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an dead GMP video encoder");
+ return GMPGenericErr;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ GMPUniquePtr<GMPVideoi420FrameImpl> inputFrameImpl(
+ static_cast<GMPVideoi420FrameImpl*>(aInputFrame.release()));
+
+ // Very rough kill-switch if the plugin stops processing. If it's merely
+ // hung and continues, we'll come back to life eventually.
+ // 3* is because we're using 3 buffers per frame for i420 data for now.
+ if ((NumInUse(GMPSharedMem::kGMPFrameData) > 3*GMPSharedMem::kGMPBufLimit) ||
+ (NumInUse(GMPSharedMem::kGMPEncodedData) > GMPSharedMem::kGMPBufLimit)) {
+ return GMPGenericErr;
+ }
+
+ GMPVideoi420FrameData frameData;
+ inputFrameImpl->InitFrameData(frameData);
+
+ if (!SendEncode(frameData,
+ aCodecSpecificInfo,
+ aFrameTypes)) {
+ return GMPGenericErr;
+ }
+
+ // Async IPC, we don't have access to a return value.
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoEncoderParent::SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT)
+{
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an invalid GMP video encoder!");
+ return GMPGenericErr;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendSetChannelParameters(aPacketLoss, aRTT)) {
+ return GMPGenericErr;
+ }
+
+ // Async IPC, we don't have access to a return value.
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoEncoderParent::SetRates(uint32_t aNewBitRate, uint32_t aFrameRate)
+{
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an dead GMP video decoder");
+ return GMPGenericErr;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendSetRates(aNewBitRate, aFrameRate)) {
+ return GMPGenericErr;
+ }
+
+ // Async IPC, we don't have access to a return value.
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoEncoderParent::SetPeriodicKeyFrames(bool aEnable)
+{
+ if (!mIsOpen) {
+ NS_WARNING("Trying to use an invalid GMP video encoder!");
+ return GMPGenericErr;
+ }
+
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (!SendSetPeriodicKeyFrames(aEnable)) {
+ return GMPGenericErr;
+ }
+
+ // Async IPC, we don't have access to a return value.
+ return GMPNoErr;
+}
+
+// Note: Consider keeping ActorDestroy sync'd up when making changes here.
+void
+GMPVideoEncoderParent::Shutdown()
+{
+ LOGD(("%s::%s: %p", __CLASS__, __FUNCTION__, this));
+ MOZ_ASSERT(mPlugin->GMPThread() == NS_GetCurrentThread());
+
+ if (mShuttingDown) {
+ return;
+ }
+ mShuttingDown = true;
+
+ // Notify client we're gone! Won't occur after Close()
+ if (mCallback) {
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+
+ mIsOpen = false;
+ if (!mActorDestroyed) {
+ Unused << SendEncodingComplete();
+ }
+}
+
+static void
+ShutdownEncodedThread(nsCOMPtr<nsIThread>& aThread)
+{
+ aThread->Shutdown();
+}
+
+// Note: Keep this sync'd up with Shutdown
+void
+GMPVideoEncoderParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ LOGD(("%s::%s: %p (%d)", __CLASS__, __FUNCTION__, this, (int) aWhy));
+ mIsOpen = false;
+ mActorDestroyed = true;
+ if (mCallback) {
+ // May call Close() (and Shutdown()) immediately or with a delay
+ mCallback->Terminated();
+ mCallback = nullptr;
+ }
+ // Must be shut down before VideoEncoderDestroyed(), since this can recurse
+ // the GMPThread event loop. See bug 1049501
+ if (mEncodedThread) {
+ // Can't get it to allow me to use WrapRunnable with a nsCOMPtr<nsIThread>()
+ NS_DispatchToMainThread(
+ WrapRunnableNM<decltype(&ShutdownEncodedThread),
+ nsCOMPtr<nsIThread> >(&ShutdownEncodedThread, mEncodedThread));
+ mEncodedThread = nullptr;
+ }
+ if (mPlugin) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mPlugin->VideoEncoderDestroyed(this);
+ mPlugin = nullptr;
+ }
+ mVideoHost.ActorDestroyed(); // same as DoneWithAPI
+ MaybeDisconnect(aWhy == AbnormalShutdown);
+}
+
+static void
+EncodedCallback(GMPVideoEncoderCallbackProxy* aCallback,
+ GMPVideoEncodedFrame* aEncodedFrame,
+ nsTArray<uint8_t>* aCodecSpecificInfo,
+ nsCOMPtr<nsIThread> aThread)
+{
+ aCallback->Encoded(aEncodedFrame, *aCodecSpecificInfo);
+ delete aCodecSpecificInfo;
+ // Ugh. Must destroy the frame on GMPThread.
+ // XXX add locks to the ShmemManager instead?
+ aThread->Dispatch(WrapRunnable(aEncodedFrame,
+ &GMPVideoEncodedFrame::Destroy),
+ NS_DISPATCH_NORMAL);
+}
+
+bool
+GMPVideoEncoderParent::RecvEncoded(const GMPVideoEncodedFrameData& aEncodedFrame,
+ InfallibleTArray<uint8_t>&& aCodecSpecificInfo)
+{
+ if (!mCallback) {
+ return false;
+ }
+
+ auto f = new GMPVideoEncodedFrameImpl(aEncodedFrame, &mVideoHost);
+ nsTArray<uint8_t> *codecSpecificInfo = new nsTArray<uint8_t>;
+ codecSpecificInfo->AppendElements((uint8_t*)aCodecSpecificInfo.Elements(), aCodecSpecificInfo.Length());
+ nsCOMPtr<nsIThread> thread = NS_GetCurrentThread();
+
+ mEncodedThread->Dispatch(WrapRunnableNM(&EncodedCallback,
+ mCallback, f, codecSpecificInfo, thread),
+ NS_DISPATCH_NORMAL);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderParent::RecvError(const GMPErr& aError)
+{
+ if (!mCallback) {
+ return false;
+ }
+
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mCallback->Error(aError);
+
+ return true;
+}
+
+bool
+GMPVideoEncoderParent::RecvShutdown()
+{
+ Shutdown();
+ return true;
+}
+
+bool
+GMPVideoEncoderParent::RecvParentShmemForPool(Shmem&& aFrameBuffer)
+{
+ if (aFrameBuffer.IsWritable()) {
+ // This test may be paranoia now that we don't shut down the VideoHost
+ // in ::Shutdown, but doesn't hurt
+ if (mVideoHost.SharedMemMgr()) {
+ mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPFrameData,
+ aFrameBuffer);
+ } else {
+ LOGD(("%s::%s: %p Called in shutdown, ignoring and freeing directly", __CLASS__, __FUNCTION__, this));
+ DeallocShmem(aFrameBuffer);
+ }
+ }
+ return true;
+}
+
+bool
+GMPVideoEncoderParent::AnswerNeedShmem(const uint32_t& aEncodedBufferSize,
+ Shmem* aMem)
+{
+ ipc::Shmem mem;
+
+ // This test may be paranoia now that we don't shut down the VideoHost
+ // in ::Shutdown, but doesn't hurt
+ if (!mVideoHost.SharedMemMgr() ||
+ !mVideoHost.SharedMemMgr()->MgrAllocShmem(GMPSharedMem::kGMPEncodedData,
+ aEncodedBufferSize,
+ ipc::SharedMemory::TYPE_BASIC, &mem))
+ {
+ LOG(LogLevel::Error, ("%s::%s: Failed to get a shared mem buffer for Child! size %u",
+ __CLASS__, __FUNCTION__, aEncodedBufferSize));
+ return false;
+ }
+ *aMem = mem;
+ mem = ipc::Shmem();
+ return true;
+}
+
+bool
+GMPVideoEncoderParent::Recv__delete__()
+{
+ if (mPlugin) {
+ // Ignore any return code. It is OK for this to fail without killing the process.
+ mPlugin->VideoEncoderDestroyed(this);
+ mPlugin = nullptr;
+ }
+
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoEncoderParent.h b/dom/media/gmp/GMPVideoEncoderParent.h
new file mode 100644
index 000000000..e7dade692
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncoderParent.h
@@ -0,0 +1,93 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoEncoderParent_h_
+#define GMPVideoEncoderParent_h_
+
+#include "mozilla/RefPtr.h"
+#include "gmp-video-encode.h"
+#include "mozilla/gmp/PGMPVideoEncoderParent.h"
+#include "GMPMessageUtils.h"
+#include "GMPSharedMemManager.h"
+#include "GMPUtils.h"
+#include "GMPVideoHost.h"
+#include "GMPVideoEncoderProxy.h"
+#include "GMPCrashHelperHolder.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPContentParent;
+
+class GMPVideoEncoderParent : public GMPVideoEncoderProxy,
+ public PGMPVideoEncoderParent,
+ public GMPSharedMemManager,
+ public GMPCrashHelperHolder
+{
+public:
+ NS_INLINE_DECL_REFCOUNTING(GMPVideoEncoderParent)
+
+ explicit GMPVideoEncoderParent(GMPContentParent *aPlugin);
+
+ GMPVideoHostImpl& Host();
+ void Shutdown();
+
+ // GMPVideoEncoderProxy
+ void Close() override;
+ GMPErr InitEncode(const GMPVideoCodec& aCodecSettings,
+ const nsTArray<uint8_t>& aCodecSpecific,
+ GMPVideoEncoderCallbackProxy* aCallback,
+ int32_t aNumberOfCores,
+ uint32_t aMaxPayloadSize) override;
+ GMPErr Encode(GMPUniquePtr<GMPVideoi420Frame> aInputFrame,
+ const nsTArray<uint8_t>& aCodecSpecificInfo,
+ const nsTArray<GMPVideoFrameType>& aFrameTypes) override;
+ GMPErr SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT) override;
+ GMPErr SetRates(uint32_t aNewBitRate, uint32_t aFrameRate) override;
+ GMPErr SetPeriodicKeyFrames(bool aEnable) override;
+ uint32_t GetPluginId() const override { return mPluginId; }
+
+ // GMPSharedMemManager
+ bool Alloc(size_t aSize, Shmem::SharedMemory::SharedMemoryType aType, Shmem* aMem) override
+ {
+#ifdef GMP_SAFE_SHMEM
+ return AllocShmem(aSize, aType, aMem);
+#else
+ return AllocUnsafeShmem(aSize, aType, aMem);
+#endif
+ }
+ void Dealloc(Shmem& aMem) override
+ {
+ DeallocShmem(aMem);
+ }
+
+private:
+ virtual ~GMPVideoEncoderParent();
+
+ // PGMPVideoEncoderParent
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ bool RecvEncoded(const GMPVideoEncodedFrameData& aEncodedFrame,
+ InfallibleTArray<uint8_t>&& aCodecSpecificInfo) override;
+ bool RecvError(const GMPErr& aError) override;
+ bool RecvShutdown() override;
+ bool RecvParentShmemForPool(Shmem&& aFrameBuffer) override;
+ bool AnswerNeedShmem(const uint32_t& aEncodedBufferSize,
+ Shmem* aMem) override;
+ bool Recv__delete__() override;
+
+ bool mIsOpen;
+ bool mShuttingDown;
+ bool mActorDestroyed;
+ RefPtr<GMPContentParent> mPlugin;
+ GMPVideoEncoderCallbackProxy* mCallback;
+ GMPVideoHostImpl mVideoHost;
+ nsCOMPtr<nsIThread> mEncodedThread;
+ const uint32_t mPluginId;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPVideoEncoderParent_h_
diff --git a/dom/media/gmp/GMPVideoEncoderProxy.h b/dom/media/gmp/GMPVideoEncoderProxy.h
new file mode 100644
index 000000000..655b1e9ae
--- /dev/null
+++ b/dom/media/gmp/GMPVideoEncoderProxy.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoEncoderProxy_h_
+#define GMPVideoEncoderProxy_h_
+
+#include "nsTArray.h"
+#include "gmp-video-encode.h"
+#include "gmp-video-frame-i420.h"
+#include "gmp-video-frame-encoded.h"
+
+#include "GMPCallbackBase.h"
+#include "GMPUtils.h"
+
+class GMPVideoEncoderCallbackProxy : public GMPCallbackBase {
+public:
+ virtual ~GMPVideoEncoderCallbackProxy() {}
+ virtual void Encoded(GMPVideoEncodedFrame* aEncodedFrame,
+ const nsTArray<uint8_t>& aCodecSpecificInfo) = 0;
+ virtual void Error(GMPErr aError) = 0;
+};
+
+// A proxy to GMPVideoEncoder in the child process.
+// GMPVideoEncoderParent exposes this to users the GMP.
+// This enables Gecko to pass nsTArrays to the child GMP and avoid
+// an extra copy when doing so.
+
+// The consumer must call Close() when done with the codec, or when
+// Terminated() is called by the GMP plugin indicating an abnormal shutdown
+// of the underlying plugin. After calling Close(), the consumer must
+// not access this again.
+
+// This interface is not thread-safe and must only be used from GMPThread.
+class GMPVideoEncoderProxy {
+public:
+ virtual GMPErr InitEncode(const GMPVideoCodec& aCodecSettings,
+ const nsTArray<uint8_t>& aCodecSpecific,
+ GMPVideoEncoderCallbackProxy* aCallback,
+ int32_t aNumberOfCores,
+ uint32_t aMaxPayloadSize) = 0;
+ virtual GMPErr Encode(mozilla::GMPUniquePtr<GMPVideoi420Frame> aInputFrame,
+ const nsTArray<uint8_t>& aCodecSpecificInfo,
+ const nsTArray<GMPVideoFrameType>& aFrameTypes) = 0;
+ virtual GMPErr SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT) = 0;
+ virtual GMPErr SetRates(uint32_t aNewBitRate, uint32_t aFrameRate) = 0;
+ virtual GMPErr SetPeriodicKeyFrames(bool aEnable) = 0;
+ virtual uint32_t GetPluginId() const = 0;
+
+ // Call to tell GMP/plugin the consumer will no longer use this
+ // interface/codec.
+ virtual void Close() = 0;
+};
+
+#endif // GMPVideoEncoderProxy_h_
diff --git a/dom/media/gmp/GMPVideoHost.cpp b/dom/media/gmp/GMPVideoHost.cpp
new file mode 100644
index 000000000..db40ebdae
--- /dev/null
+++ b/dom/media/gmp/GMPVideoHost.cpp
@@ -0,0 +1,120 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoHost.h"
+#include "mozilla/Assertions.h"
+#include "GMPVideoi420FrameImpl.h"
+#include "GMPVideoEncodedFrameImpl.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPVideoHostImpl::GMPVideoHostImpl(GMPSharedMemManager* aSharedMemMgr)
+: mSharedMemMgr(aSharedMemMgr)
+{
+}
+
+GMPVideoHostImpl::~GMPVideoHostImpl()
+{
+}
+
+GMPErr
+GMPVideoHostImpl::CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame)
+{
+ if (!mSharedMemMgr) {
+ return GMPGenericErr;
+ }
+
+ if (!aFrame) {
+ return GMPGenericErr;
+ }
+ *aFrame = nullptr;
+
+ switch (aFormat) {
+ case kGMPI420VideoFrame:
+ *aFrame = new GMPVideoi420FrameImpl(this);
+ return GMPNoErr;
+ case kGMPEncodedVideoFrame:
+ *aFrame = new GMPVideoEncodedFrameImpl(this);
+ return GMPNoErr;
+ default:
+ NS_NOTREACHED("Unknown frame format!");
+ }
+
+ return GMPGenericErr;
+}
+
+GMPErr
+GMPVideoHostImpl::CreatePlane(GMPPlane** aPlane)
+{
+ if (!mSharedMemMgr) {
+ return GMPGenericErr;
+ }
+
+ if (!aPlane) {
+ return GMPGenericErr;
+ }
+ *aPlane = nullptr;
+
+ auto p = new GMPPlaneImpl(this);
+
+ *aPlane = p;
+
+ return GMPNoErr;
+}
+
+GMPSharedMemManager*
+GMPVideoHostImpl::SharedMemMgr()
+{
+ return mSharedMemMgr;
+}
+
+// XXX This should merge with ActorDestroyed
+void
+GMPVideoHostImpl::DoneWithAPI()
+{
+ ActorDestroyed();
+}
+
+void
+GMPVideoHostImpl::ActorDestroyed()
+{
+ for (uint32_t i = mPlanes.Length(); i > 0; i--) {
+ mPlanes[i - 1]->DoneWithAPI();
+ mPlanes.RemoveElementAt(i - 1);
+ }
+ for (uint32_t i = mEncodedFrames.Length(); i > 0; i--) {
+ mEncodedFrames[i - 1]->DoneWithAPI();
+ mEncodedFrames.RemoveElementAt(i - 1);
+ }
+ mSharedMemMgr = nullptr;
+}
+
+void
+GMPVideoHostImpl::PlaneCreated(GMPPlaneImpl* aPlane)
+{
+ mPlanes.AppendElement(aPlane);
+}
+
+void
+GMPVideoHostImpl::PlaneDestroyed(GMPPlaneImpl* aPlane)
+{
+ MOZ_ALWAYS_TRUE(mPlanes.RemoveElement(aPlane));
+}
+
+void
+GMPVideoHostImpl::EncodedFrameCreated(GMPVideoEncodedFrameImpl* aEncodedFrame)
+{
+ mEncodedFrames.AppendElement(aEncodedFrame);
+}
+
+void
+GMPVideoHostImpl::EncodedFrameDestroyed(GMPVideoEncodedFrameImpl* aFrame)
+{
+ MOZ_ALWAYS_TRUE(mEncodedFrames.RemoveElement(aFrame));
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoHost.h b/dom/media/gmp/GMPVideoHost.h
new file mode 100644
index 000000000..b3e42f08e
--- /dev/null
+++ b/dom/media/gmp/GMPVideoHost.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoHost_h_
+#define GMPVideoHost_h_
+
+#include "gmp-video-host.h"
+#include "gmp-video-plane.h"
+#include "gmp-video-frame.h"
+#include "gmp-video-host.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPSharedMemManager;
+class GMPPlaneImpl;
+class GMPVideoEncodedFrameImpl;
+
+class GMPVideoHostImpl : public GMPVideoHost
+{
+public:
+ explicit GMPVideoHostImpl(GMPSharedMemManager* aSharedMemMgr);
+ virtual ~GMPVideoHostImpl();
+
+ // Used for shared memory allocation and deallocation.
+ GMPSharedMemManager* SharedMemMgr();
+ void DoneWithAPI();
+ void ActorDestroyed();
+ void PlaneCreated(GMPPlaneImpl* aPlane);
+ void PlaneDestroyed(GMPPlaneImpl* aPlane);
+ void EncodedFrameCreated(GMPVideoEncodedFrameImpl* aEncodedFrame);
+ void EncodedFrameDestroyed(GMPVideoEncodedFrameImpl* aFrame);
+
+ // GMPVideoHost
+ GMPErr CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame) override;
+ GMPErr CreatePlane(GMPPlane** aPlane) override;
+
+private:
+ // All shared memory allocations have to be made by an IPDL actor.
+ // This is a reference to the owning actor. If this reference is
+ // null then the actor has died and all allocations must fail.
+ GMPSharedMemManager* mSharedMemMgr;
+
+ // We track all of these things because they need to handle further
+ // allocations through us and we need to notify them when they
+ // can't use us any more.
+ nsTArray<GMPPlaneImpl*> mPlanes;
+ nsTArray<GMPVideoEncodedFrameImpl*> mEncodedFrames;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPVideoHost_h_
diff --git a/dom/media/gmp/GMPVideoPlaneImpl.cpp b/dom/media/gmp/GMPVideoPlaneImpl.cpp
new file mode 100644
index 000000000..074a965e8
--- /dev/null
+++ b/dom/media/gmp/GMPVideoPlaneImpl.cpp
@@ -0,0 +1,225 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoPlaneImpl.h"
+#include "mozilla/gmp/GMPTypes.h"
+#include "GMPVideoHost.h"
+#include "GMPSharedMemManager.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPPlaneImpl::GMPPlaneImpl(GMPVideoHostImpl* aHost)
+: mSize(0),
+ mStride(0),
+ mHost(aHost)
+{
+ MOZ_ASSERT(mHost);
+ mHost->PlaneCreated(this);
+}
+
+GMPPlaneImpl::GMPPlaneImpl(const GMPPlaneData& aPlaneData, GMPVideoHostImpl* aHost)
+: mBuffer(aPlaneData.mBuffer()),
+ mSize(aPlaneData.mSize()),
+ mStride(aPlaneData.mStride()),
+ mHost(aHost)
+{
+ MOZ_ASSERT(mHost);
+ mHost->PlaneCreated(this);
+}
+
+GMPPlaneImpl::~GMPPlaneImpl()
+{
+ DestroyBuffer();
+ if (mHost) {
+ mHost->PlaneDestroyed(this);
+ }
+}
+
+void
+GMPPlaneImpl::DoneWithAPI()
+{
+ DestroyBuffer();
+
+ // Do this after destroying the buffer because destruction
+ // involves deallocation, which requires a host.
+ mHost = nullptr;
+}
+
+void
+GMPPlaneImpl::ActorDestroyed()
+{
+ // Simply clear out Shmem reference, do not attempt to
+ // properly free it. It has already been freed.
+ mBuffer = ipc::Shmem();
+ // No more host.
+ mHost = nullptr;
+}
+
+bool
+GMPPlaneImpl::InitPlaneData(GMPPlaneData& aPlaneData)
+{
+ aPlaneData.mBuffer() = mBuffer;
+ aPlaneData.mSize() = mSize;
+ aPlaneData.mStride() = mStride;
+
+ // This method is called right before Shmem is sent to another process.
+ // We need to effectively zero out our member copy so that we don't
+ // try to delete memory we don't own later.
+ mBuffer = ipc::Shmem();
+
+ return true;
+}
+
+GMPErr
+GMPPlaneImpl::MaybeResize(int32_t aNewSize) {
+ if (aNewSize <= AllocatedSize()) {
+ return GMPNoErr;
+ }
+
+ if (!mHost) {
+ return GMPGenericErr;
+ }
+
+ ipc::Shmem new_mem;
+ if (!mHost->SharedMemMgr()->MgrAllocShmem(GMPSharedMem::kGMPFrameData, aNewSize,
+ ipc::SharedMemory::TYPE_BASIC, &new_mem) ||
+ !new_mem.get<uint8_t>()) {
+ return GMPAllocErr;
+ }
+
+ if (mBuffer.IsReadable()) {
+ memcpy(new_mem.get<uint8_t>(), Buffer(), mSize);
+ }
+
+ DestroyBuffer();
+
+ mBuffer = new_mem;
+
+ return GMPNoErr;
+}
+
+void
+GMPPlaneImpl::DestroyBuffer()
+{
+ if (mHost && mBuffer.IsWritable()) {
+ mHost->SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPFrameData, mBuffer);
+ }
+ mBuffer = ipc::Shmem();
+}
+
+GMPErr
+GMPPlaneImpl::CreateEmptyPlane(int32_t aAllocatedSize, int32_t aStride, int32_t aPlaneSize)
+{
+ if (aAllocatedSize < 1 || aStride < 1 || aPlaneSize < 1) {
+ return GMPGenericErr;
+ }
+
+ GMPErr err = MaybeResize(aAllocatedSize);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ mSize = aPlaneSize;
+ mStride = aStride;
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPPlaneImpl::Copy(const GMPPlane& aPlane)
+{
+ auto& planeimpl = static_cast<const GMPPlaneImpl&>(aPlane);
+
+ GMPErr err = MaybeResize(planeimpl.mSize);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ if (planeimpl.Buffer() && planeimpl.mSize > 0) {
+ memcpy(Buffer(), planeimpl.Buffer(), mSize);
+ }
+
+ mSize = planeimpl.mSize;
+ mStride = planeimpl.mStride;
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPPlaneImpl::Copy(int32_t aSize, int32_t aStride, const uint8_t* aBuffer)
+{
+ GMPErr err = MaybeResize(aSize);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ if (aBuffer && aSize > 0) {
+ memcpy(Buffer(), aBuffer, aSize);
+ }
+
+ mSize = aSize;
+ mStride = aStride;
+
+ return GMPNoErr;
+}
+
+void
+GMPPlaneImpl::Swap(GMPPlane& aPlane)
+{
+ auto& planeimpl = static_cast<GMPPlaneImpl&>(aPlane);
+
+ std::swap(mStride, planeimpl.mStride);
+ std::swap(mSize, planeimpl.mSize);
+ std::swap(mBuffer, planeimpl.mBuffer);
+}
+
+int32_t
+GMPPlaneImpl::AllocatedSize() const
+{
+ if (mBuffer.IsWritable()) {
+ return mBuffer.Size<uint8_t>();
+ }
+ return 0;
+}
+
+void
+GMPPlaneImpl::ResetSize()
+{
+ mSize = 0;
+}
+
+bool
+GMPPlaneImpl::IsZeroSize() const
+{
+ return (mSize == 0);
+}
+
+int32_t
+GMPPlaneImpl::Stride() const
+{
+ return mStride;
+}
+
+const uint8_t*
+GMPPlaneImpl::Buffer() const
+{
+ return mBuffer.get<uint8_t>();
+}
+
+uint8_t*
+GMPPlaneImpl::Buffer()
+{
+ return mBuffer.get<uint8_t>();
+}
+
+void
+GMPPlaneImpl::Destroy()
+{
+ delete this;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoPlaneImpl.h b/dom/media/gmp/GMPVideoPlaneImpl.h
new file mode 100644
index 000000000..d3a0d753a
--- /dev/null
+++ b/dom/media/gmp/GMPVideoPlaneImpl.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoPlaneImpl_h_
+#define GMPVideoPlaneImpl_h_
+
+#include "gmp-video-plane.h"
+#include "mozilla/ipc/Shmem.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPVideoHostImpl;
+class GMPPlaneData;
+
+class GMPPlaneImpl : public GMPPlane
+{
+ friend struct IPC::ParamTraits<mozilla::gmp::GMPPlaneImpl>;
+public:
+ explicit GMPPlaneImpl(GMPVideoHostImpl* aHost);
+ GMPPlaneImpl(const GMPPlaneData& aPlaneData, GMPVideoHostImpl* aHost);
+ virtual ~GMPPlaneImpl();
+
+ // This is called during a normal destroy sequence, which is
+ // when a consumer is finished or during XPCOM shutdown.
+ void DoneWithAPI();
+ // This is called when something has gone wrong - specicifically,
+ // a child process has crashed. Does not attempt to release Shmem,
+ // as the Shmem has already been released.
+ void ActorDestroyed();
+
+ bool InitPlaneData(GMPPlaneData& aPlaneData);
+
+ // GMPPlane
+ GMPErr CreateEmptyPlane(int32_t aAllocatedSize,
+ int32_t aStride,
+ int32_t aPlaneSize) override;
+ GMPErr Copy(const GMPPlane& aPlane) override;
+ GMPErr Copy(int32_t aSize,
+ int32_t aStride,
+ const uint8_t* aBuffer) override;
+ void Swap(GMPPlane& aPlane) override;
+ int32_t AllocatedSize() const override;
+ void ResetSize() override;
+ bool IsZeroSize() const override;
+ int32_t Stride() const override;
+ const uint8_t* Buffer() const override;
+ uint8_t* Buffer() override;
+ void Destroy() override;
+
+private:
+ GMPErr MaybeResize(int32_t aNewSize);
+ void DestroyBuffer();
+
+ ipc::Shmem mBuffer;
+ int32_t mSize;
+ int32_t mStride;
+ GMPVideoHostImpl* mHost;
+};
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMPVideoPlaneImpl_h_
diff --git a/dom/media/gmp/GMPVideoi420FrameImpl.cpp b/dom/media/gmp/GMPVideoi420FrameImpl.cpp
new file mode 100644
index 000000000..fdbb9a962
--- /dev/null
+++ b/dom/media/gmp/GMPVideoi420FrameImpl.cpp
@@ -0,0 +1,365 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoi420FrameImpl.h"
+#include "mozilla/gmp/GMPTypes.h"
+#include "mozilla/CheckedInt.h"
+
+namespace mozilla {
+namespace gmp {
+
+GMPVideoi420FrameImpl::GMPVideoi420FrameImpl(GMPVideoHostImpl* aHost)
+: mYPlane(aHost),
+ mUPlane(aHost),
+ mVPlane(aHost),
+ mWidth(0),
+ mHeight(0),
+ mTimestamp(0ll),
+ mDuration(0ll)
+{
+ MOZ_ASSERT(aHost);
+}
+
+GMPVideoi420FrameImpl::GMPVideoi420FrameImpl(const GMPVideoi420FrameData& aFrameData,
+ GMPVideoHostImpl* aHost)
+: mYPlane(aFrameData.mYPlane(), aHost),
+ mUPlane(aFrameData.mUPlane(), aHost),
+ mVPlane(aFrameData.mVPlane(), aHost),
+ mWidth(aFrameData.mWidth()),
+ mHeight(aFrameData.mHeight()),
+ mTimestamp(aFrameData.mTimestamp()),
+ mDuration(aFrameData.mDuration())
+{
+ MOZ_ASSERT(aHost);
+}
+
+GMPVideoi420FrameImpl::~GMPVideoi420FrameImpl()
+{
+}
+
+bool
+GMPVideoi420FrameImpl::InitFrameData(GMPVideoi420FrameData& aFrameData)
+{
+ mYPlane.InitPlaneData(aFrameData.mYPlane());
+ mUPlane.InitPlaneData(aFrameData.mUPlane());
+ mVPlane.InitPlaneData(aFrameData.mVPlane());
+ aFrameData.mWidth() = mWidth;
+ aFrameData.mHeight() = mHeight;
+ aFrameData.mTimestamp() = mTimestamp;
+ aFrameData.mDuration() = mDuration;
+ return true;
+}
+
+GMPVideoFrameFormat
+GMPVideoi420FrameImpl::GetFrameFormat()
+{
+ return kGMPI420VideoFrame;
+}
+
+void
+GMPVideoi420FrameImpl::Destroy()
+{
+ delete this;
+}
+
+/* static */ bool
+GMPVideoi420FrameImpl::CheckFrameData(const GMPVideoi420FrameData& aFrameData)
+{
+ // We may be passed the "wrong" shmem (one smaller than the actual size).
+ // This implies a bug or serious error on the child size. Ignore this frame if so.
+ // Note: Size() greater than expected is also an error, but with no negative consequences
+ int32_t half_width = (aFrameData.mWidth() + 1) / 2;
+ if ((aFrameData.mYPlane().mStride() <= 0) || (aFrameData.mYPlane().mSize() <= 0) ||
+ (aFrameData.mUPlane().mStride() <= 0) || (aFrameData.mUPlane().mSize() <= 0) ||
+ (aFrameData.mVPlane().mStride() <= 0) || (aFrameData.mVPlane().mSize() <= 0) ||
+ (aFrameData.mYPlane().mSize() > (int32_t) aFrameData.mYPlane().mBuffer().Size<uint8_t>()) ||
+ (aFrameData.mUPlane().mSize() > (int32_t) aFrameData.mUPlane().mBuffer().Size<uint8_t>()) ||
+ (aFrameData.mVPlane().mSize() > (int32_t) aFrameData.mVPlane().mBuffer().Size<uint8_t>()) ||
+ (aFrameData.mYPlane().mStride() < aFrameData.mWidth()) ||
+ (aFrameData.mUPlane().mStride() < half_width) ||
+ (aFrameData.mVPlane().mStride() < half_width) ||
+ (aFrameData.mYPlane().mSize() < aFrameData.mYPlane().mStride() * aFrameData.mHeight()) ||
+ (aFrameData.mUPlane().mSize() < aFrameData.mUPlane().mStride() * ((aFrameData.mHeight()+1)/2)) ||
+ (aFrameData.mVPlane().mSize() < aFrameData.mVPlane().mStride() * ((aFrameData.mHeight()+1)/2)))
+ {
+ return false;
+ }
+ return true;
+}
+
+bool
+GMPVideoi420FrameImpl::CheckDimensions(int32_t aWidth, int32_t aHeight,
+ int32_t aStride_y, int32_t aStride_u, int32_t aStride_v)
+{
+ int32_t half_width = (aWidth + 1) / 2;
+ if (aWidth < 1 || aHeight < 1 ||
+ aStride_y < aWidth || aStride_u < half_width || aStride_v < half_width ||
+ !(CheckedInt<int32_t>(aHeight) * aStride_y
+ + ((CheckedInt<int32_t>(aHeight) + 1) / 2)
+ * (CheckedInt<int32_t>(aStride_u) + aStride_v)).isValid()) {
+ return false;
+ }
+ return true;
+}
+
+const GMPPlaneImpl*
+GMPVideoi420FrameImpl::GetPlane(GMPPlaneType aType) const {
+ switch (aType) {
+ case kGMPYPlane:
+ return &mYPlane;
+ case kGMPUPlane:
+ return &mUPlane;
+ case kGMPVPlane:
+ return &mVPlane;
+ default:
+ MOZ_CRASH("Unknown plane type!");
+ }
+ return nullptr;
+}
+
+GMPPlaneImpl*
+GMPVideoi420FrameImpl::GetPlane(GMPPlaneType aType) {
+ switch (aType) {
+ case kGMPYPlane :
+ return &mYPlane;
+ case kGMPUPlane :
+ return &mUPlane;
+ case kGMPVPlane :
+ return &mVPlane;
+ default:
+ MOZ_CRASH("Unknown plane type!");
+ }
+ return nullptr;
+}
+
+GMPErr
+GMPVideoi420FrameImpl::CreateEmptyFrame(int32_t aWidth, int32_t aHeight,
+ int32_t aStride_y, int32_t aStride_u, int32_t aStride_v)
+{
+ if (!CheckDimensions(aWidth, aHeight, aStride_y, aStride_u, aStride_v)) {
+ return GMPGenericErr;
+ }
+
+ int32_t size_y = aStride_y * aHeight;
+ int32_t half_height = (aHeight + 1) / 2;
+ int32_t size_u = aStride_u * half_height;
+ int32_t size_v = aStride_v * half_height;
+
+ GMPErr err = mYPlane.CreateEmptyPlane(size_y, aStride_y, size_y);
+ if (err != GMPNoErr) {
+ return err;
+ }
+ err = mUPlane.CreateEmptyPlane(size_u, aStride_u, size_u);
+ if (err != GMPNoErr) {
+ return err;
+ }
+ err = mVPlane.CreateEmptyPlane(size_v, aStride_v, size_v);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ mWidth = aWidth;
+ mHeight = aHeight;
+ mTimestamp = 0ll;
+ mDuration = 0ll;
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoi420FrameImpl::CreateFrame(int32_t aSize_y, const uint8_t* aBuffer_y,
+ int32_t aSize_u, const uint8_t* aBuffer_u,
+ int32_t aSize_v, const uint8_t* aBuffer_v,
+ int32_t aWidth, int32_t aHeight,
+ int32_t aStride_y, int32_t aStride_u, int32_t aStride_v)
+{
+ MOZ_ASSERT(aBuffer_y);
+ MOZ_ASSERT(aBuffer_u);
+ MOZ_ASSERT(aBuffer_v);
+
+ if (aSize_y < 1 || aSize_u < 1 || aSize_v < 1) {
+ return GMPGenericErr;
+ }
+
+ if (!CheckDimensions(aWidth, aHeight, aStride_y, aStride_u, aStride_v)) {
+ return GMPGenericErr;
+ }
+
+ GMPErr err = mYPlane.Copy(aSize_y, aStride_y, aBuffer_y);
+ if (err != GMPNoErr) {
+ return err;
+ }
+ err = mUPlane.Copy(aSize_u, aStride_u, aBuffer_u);
+ if (err != GMPNoErr) {
+ return err;
+ }
+ err = mVPlane.Copy(aSize_v, aStride_v, aBuffer_v);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ mWidth = aWidth;
+ mHeight = aHeight;
+
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoi420FrameImpl::CopyFrame(const GMPVideoi420Frame& aFrame)
+{
+ auto& f = static_cast<const GMPVideoi420FrameImpl&>(aFrame);
+
+ GMPErr err = mYPlane.Copy(f.mYPlane);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ err = mUPlane.Copy(f.mUPlane);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ err = mVPlane.Copy(f.mVPlane);
+ if (err != GMPNoErr) {
+ return err;
+ }
+
+ mWidth = f.mWidth;
+ mHeight = f.mHeight;
+ mTimestamp = f.mTimestamp;
+ mDuration = f.mDuration;
+
+ return GMPNoErr;
+}
+
+void
+GMPVideoi420FrameImpl::SwapFrame(GMPVideoi420Frame* aFrame)
+{
+ auto f = static_cast<GMPVideoi420FrameImpl*>(aFrame);
+ mYPlane.Swap(f->mYPlane);
+ mUPlane.Swap(f->mUPlane);
+ mVPlane.Swap(f->mVPlane);
+ std::swap(mWidth, f->mWidth);
+ std::swap(mHeight, f->mHeight);
+ std::swap(mTimestamp, f->mTimestamp);
+ std::swap(mDuration, f->mDuration);
+}
+
+uint8_t*
+GMPVideoi420FrameImpl::Buffer(GMPPlaneType aType)
+{
+ GMPPlane* p = GetPlane(aType);
+ if (p) {
+ return p->Buffer();
+ }
+ return nullptr;
+}
+
+const uint8_t*
+GMPVideoi420FrameImpl::Buffer(GMPPlaneType aType) const
+{
+ const GMPPlane* p = GetPlane(aType);
+ if (p) {
+ return p->Buffer();
+ }
+ return nullptr;
+}
+
+int32_t
+GMPVideoi420FrameImpl::AllocatedSize(GMPPlaneType aType) const
+{
+ const GMPPlane* p = GetPlane(aType);
+ if (p) {
+ return p->AllocatedSize();
+ }
+ return -1;
+}
+
+int32_t
+GMPVideoi420FrameImpl::Stride(GMPPlaneType aType) const
+{
+ const GMPPlane* p = GetPlane(aType);
+ if (p) {
+ return p->Stride();
+ }
+ return -1;
+}
+
+GMPErr
+GMPVideoi420FrameImpl::SetWidth(int32_t aWidth)
+{
+ if (!CheckDimensions(aWidth, mHeight,
+ mYPlane.Stride(), mUPlane.Stride(),
+ mVPlane.Stride())) {
+ return GMPGenericErr;
+ }
+ mWidth = aWidth;
+ return GMPNoErr;
+}
+
+GMPErr
+GMPVideoi420FrameImpl::SetHeight(int32_t aHeight)
+{
+ if (!CheckDimensions(mWidth, aHeight,
+ mYPlane.Stride(), mUPlane.Stride(),
+ mVPlane.Stride())) {
+ return GMPGenericErr;
+ }
+ mHeight = aHeight;
+ return GMPNoErr;
+}
+
+int32_t
+GMPVideoi420FrameImpl::Width() const
+{
+ return mWidth;
+}
+
+int32_t
+GMPVideoi420FrameImpl::Height() const
+{
+ return mHeight;
+}
+
+void
+GMPVideoi420FrameImpl::SetTimestamp(uint64_t aTimestamp)
+{
+ mTimestamp = aTimestamp;
+}
+
+uint64_t
+GMPVideoi420FrameImpl::Timestamp() const
+{
+ return mTimestamp;
+}
+
+void
+GMPVideoi420FrameImpl::SetDuration(uint64_t aDuration)
+{
+ mDuration = aDuration;
+}
+
+uint64_t
+GMPVideoi420FrameImpl::Duration() const
+{
+ return mDuration;
+}
+
+bool
+GMPVideoi420FrameImpl::IsZeroSize() const
+{
+ return (mYPlane.IsZeroSize() && mUPlane.IsZeroSize() && mVPlane.IsZeroSize());
+}
+
+void
+GMPVideoi420FrameImpl::ResetSize()
+{
+ mYPlane.ResetSize();
+ mUPlane.ResetSize();
+ mVPlane.ResetSize();
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/GMPVideoi420FrameImpl.h b/dom/media/gmp/GMPVideoi420FrameImpl.h
new file mode 100644
index 000000000..f5cb0254b
--- /dev/null
+++ b/dom/media/gmp/GMPVideoi420FrameImpl.h
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMPVideoi420FrameImpl_h_
+#define GMPVideoi420FrameImpl_h_
+
+#include "gmp-video-frame-i420.h"
+#include "mozilla/ipc/Shmem.h"
+#include "GMPVideoPlaneImpl.h"
+
+namespace mozilla {
+namespace gmp {
+
+class GMPVideoi420FrameData;
+
+class GMPVideoi420FrameImpl : public GMPVideoi420Frame
+{
+ friend struct IPC::ParamTraits<mozilla::gmp::GMPVideoi420FrameImpl>;
+public:
+ explicit GMPVideoi420FrameImpl(GMPVideoHostImpl* aHost);
+ GMPVideoi420FrameImpl(const GMPVideoi420FrameData& aFrameData, GMPVideoHostImpl* aHost);
+ virtual ~GMPVideoi420FrameImpl();
+
+ static bool CheckFrameData(const GMPVideoi420FrameData& aFrameData);
+
+ bool InitFrameData(GMPVideoi420FrameData& aFrameData);
+ const GMPPlaneImpl* GetPlane(GMPPlaneType aType) const;
+ GMPPlaneImpl* GetPlane(GMPPlaneType aType);
+
+ // GMPVideoFrame
+ GMPVideoFrameFormat GetFrameFormat() override;
+ void Destroy() override;
+
+ // GMPVideoi420Frame
+ GMPErr CreateEmptyFrame(int32_t aWidth,
+ int32_t aHeight,
+ int32_t aStride_y,
+ int32_t aStride_u,
+ int32_t aStride_v) override;
+ GMPErr CreateFrame(int32_t aSize_y, const uint8_t* aBuffer_y,
+ int32_t aSize_u, const uint8_t* aBuffer_u,
+ int32_t aSize_v, const uint8_t* aBuffer_v,
+ int32_t aWidth,
+ int32_t aHeight,
+ int32_t aStride_y,
+ int32_t aStride_u,
+ int32_t aStride_v) override;
+ GMPErr CopyFrame(const GMPVideoi420Frame& aFrame) override;
+ void SwapFrame(GMPVideoi420Frame* aFrame) override;
+ uint8_t* Buffer(GMPPlaneType aType) override;
+ const uint8_t* Buffer(GMPPlaneType aType) const override;
+ int32_t AllocatedSize(GMPPlaneType aType) const override;
+ int32_t Stride(GMPPlaneType aType) const override;
+ GMPErr SetWidth(int32_t aWidth) override;
+ GMPErr SetHeight(int32_t aHeight) override;
+ int32_t Width() const override;
+ int32_t Height() const override;
+ void SetTimestamp(uint64_t aTimestamp) override;
+ uint64_t Timestamp() const override;
+ void SetDuration(uint64_t aDuration) override;
+ uint64_t Duration() const override;
+ bool IsZeroSize() const override;
+ void ResetSize() override;
+
+private:
+ bool CheckDimensions(int32_t aWidth, int32_t aHeight,
+ int32_t aStride_y, int32_t aStride_u, int32_t aStride_v);
+
+ GMPPlaneImpl mYPlane;
+ GMPPlaneImpl mUPlane;
+ GMPPlaneImpl mVPlane;
+ int32_t mWidth;
+ int32_t mHeight;
+ uint64_t mTimestamp;
+ uint64_t mDuration;
+};
+
+} // namespace gmp
+
+} // namespace mozilla
+
+#endif // GMPVideoi420FrameImpl_h_
diff --git a/dom/media/gmp/PGMP.ipdl b/dom/media/gmp/PGMP.ipdl
new file mode 100644
index 000000000..b421f0280
--- /dev/null
+++ b/dom/media/gmp/PGMP.ipdl
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PCrashReporter;
+include protocol PGMPContent;
+include protocol PGMPTimer;
+include protocol PGMPStorage;
+
+using mozilla::dom::NativeThreadId from "mozilla/dom/TabMessageUtils.h";
+
+namespace mozilla {
+namespace gmp {
+
+intr protocol PGMP
+{
+ parent opens PGMPContent;
+
+ manages PCrashReporter;
+ manages PGMPTimer;
+ manages PGMPStorage;
+
+parent:
+ async PCrashReporter(NativeThreadId tid);
+ async PGMPTimer();
+ async PGMPStorage();
+
+ async PGMPContentChildDestroyed();
+
+ async AsyncShutdownComplete();
+ async AsyncShutdownRequired();
+
+child:
+ async BeginAsyncShutdown();
+ async CrashPluginNow();
+ intr StartPlugin(nsString adapter);
+ async SetNodeId(nsCString nodeId);
+ async PreloadLibs(nsCString libs);
+ async CloseActive();
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPAudioDecoder.ipdl b/dom/media/gmp/PGMPAudioDecoder.ipdl
new file mode 100644
index 000000000..9af9415c8
--- /dev/null
+++ b/dom/media/gmp/PGMPAudioDecoder.ipdl
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMPContent;
+include GMPTypes;
+
+using GMPCodecSpecificInfo from "gmp-audio-codec.h";
+using GMPErr from "gmp-errors.h";
+
+include "GMPMessageUtils.h";
+
+namespace mozilla {
+namespace gmp {
+
+async protocol PGMPAudioDecoder
+{
+ manager PGMPContent;
+child:
+ async InitDecode(GMPAudioCodecData aCodecSettings);
+ async Decode(GMPAudioEncodedSampleData aInput);
+ async Reset();
+ async Drain();
+ async DecodingComplete();
+parent:
+ async __delete__();
+ async Decoded(GMPAudioDecodedSampleData aDecoded);
+ async InputDataExhausted();
+ async DrainComplete();
+ async ResetComplete();
+ async Error(GMPErr aErr);
+ async Shutdown();
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPContent.ipdl b/dom/media/gmp/PGMPContent.ipdl
new file mode 100644
index 000000000..00e16c02f
--- /dev/null
+++ b/dom/media/gmp/PGMPContent.ipdl
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMP;
+include protocol PGMPService;
+include protocol PGMPVideoDecoder;
+include protocol PGMPVideoEncoder;
+include protocol PGMPDecryptor;
+include protocol PGMPAudioDecoder;
+
+namespace mozilla {
+namespace gmp {
+
+intr protocol PGMPContent
+{
+ bridges PGMPService, PGMP;
+
+ manages PGMPAudioDecoder;
+ manages PGMPDecryptor;
+ manages PGMPVideoDecoder;
+ manages PGMPVideoEncoder;
+
+child:
+ async PGMPAudioDecoder();
+ async PGMPDecryptor();
+ async PGMPVideoDecoder(uint32_t aDecryptorId);
+ async PGMPVideoEncoder();
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPDecryptor.ipdl b/dom/media/gmp/PGMPDecryptor.ipdl
new file mode 100644
index 000000000..06b9b9cb6
--- /dev/null
+++ b/dom/media/gmp/PGMPDecryptor.ipdl
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMPContent;
+include GMPTypes;
+
+using GMPSessionMessageType from "gmp-decryption.h";
+using GMPSessionType from "gmp-decryption.h";
+using GMPDOMException from "gmp-decryption.h";
+using GMPErr from "gmp-errors.h";
+
+namespace mozilla {
+namespace gmp {
+
+async protocol PGMPDecryptor
+{
+ manager PGMPContent;
+child:
+
+ async Init(bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired);
+
+ async CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ nsCString aInitDataType,
+ uint8_t[] aInitData,
+ GMPSessionType aSessionType);
+
+ async LoadSession(uint32_t aPromiseId,
+ nsCString aSessionId);
+
+ async UpdateSession(uint32_t aPromiseId,
+ nsCString aSessionId,
+ uint8_t[] aResponse);
+
+ async CloseSession(uint32_t aPromiseId,
+ nsCString aSessionId);
+
+ async RemoveSession(uint32_t aPromiseId,
+ nsCString aSessionId);
+
+ async SetServerCertificate(uint32_t aPromiseId,
+ uint8_t[] aServerCert);
+
+ async Decrypt(uint32_t aId,
+ uint8_t[] aBuffer,
+ GMPDecryptionData aMetadata);
+
+ async DecryptingComplete();
+
+parent:
+ async __delete__();
+
+ async SetDecryptorId(uint32_t aId);
+
+ async SetSessionId(uint32_t aCreateSessionToken,
+ nsCString aSessionId);
+
+ async ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess);
+
+ async ResolvePromise(uint32_t aPromiseId);
+
+ async RejectPromise(uint32_t aPromiseId,
+ GMPDOMException aDOMExceptionCode,
+ nsCString aMessage);
+
+ async SessionMessage(nsCString aSessionId,
+ GMPSessionMessageType aMessageType,
+ uint8_t[] aMessage);
+
+ async ExpirationChange(nsCString aSessionId, double aExpiryTime);
+
+ async SessionClosed(nsCString aSessionId);
+
+ async SessionError(nsCString aSessionId,
+ GMPDOMException aDOMExceptionCode,
+ uint32_t aSystemCode,
+ nsCString aMessage);
+
+ async Decrypted(uint32_t aId, GMPErr aResult, uint8_t[] aBuffer);
+
+ async Shutdown();
+
+ async BatchedKeyStatusChanged(nsCString aSessionId,
+ GMPKeyInformation[] aKeyInfos);
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPService.ipdl b/dom/media/gmp/PGMPService.ipdl
new file mode 100644
index 000000000..db3fb6388
--- /dev/null
+++ b/dom/media/gmp/PGMPService.ipdl
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMP;
+
+using base::ProcessId from "base/process.h";
+
+namespace mozilla {
+namespace gmp {
+
+sync protocol PGMPService
+{
+ parent spawns PGMP as child;
+
+parent:
+
+ sync SelectGMP(nsCString nodeId, nsCString api, nsCString[] tags)
+ returns (uint32_t pluginId, nsresult aResult);
+
+ sync LaunchGMP(uint32_t pluginId, ProcessId[] alreadyBridgedTo)
+ returns (ProcessId id, nsCString displayName, nsresult aResult);
+
+ sync GetGMPNodeId(nsString origin, nsString topLevelOrigin,
+ nsString gmpName,
+ bool inPrivateBrowsing)
+ returns (nsCString id);
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPStorage.ipdl b/dom/media/gmp/PGMPStorage.ipdl
new file mode 100644
index 000000000..4d858312a
--- /dev/null
+++ b/dom/media/gmp/PGMPStorage.ipdl
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMP;
+include GMPTypes;
+
+using GMPErr from "gmp-errors.h";
+
+namespace mozilla {
+namespace gmp {
+
+async protocol PGMPStorage
+{
+ manager PGMP;
+
+child:
+ async OpenComplete(nsCString aRecordName, GMPErr aStatus);
+ async ReadComplete(nsCString aRecordName, GMPErr aStatus, uint8_t[] aBytes);
+ async WriteComplete(nsCString aRecordName, GMPErr aStatus);
+ async RecordNames(nsCString[] aRecordNames, GMPErr aStatus);
+ async Shutdown();
+
+parent:
+ async Open(nsCString aRecordName);
+ async Read(nsCString aRecordName);
+ async Write(nsCString aRecordName, uint8_t[] aBytes);
+ async Close(nsCString aRecordName);
+ async GetRecordNames();
+ async __delete__();
+
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPTimer.ipdl b/dom/media/gmp/PGMPTimer.ipdl
new file mode 100644
index 000000000..7a486bc3a
--- /dev/null
+++ b/dom/media/gmp/PGMPTimer.ipdl
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMP;
+
+namespace mozilla {
+namespace gmp {
+
+async protocol PGMPTimer
+{
+ manager PGMP;
+child:
+ async TimerExpired(uint32_t aTimerId);
+parent:
+ async SetTimer(uint32_t aTimerId, uint32_t aTimeoutMs);
+ async __delete__();
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPVideoDecoder.ipdl b/dom/media/gmp/PGMPVideoDecoder.ipdl
new file mode 100644
index 000000000..83ad8f700
--- /dev/null
+++ b/dom/media/gmp/PGMPVideoDecoder.ipdl
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMPContent;
+include GMPTypes;
+
+using GMPVideoCodec from "gmp-video-codec.h";
+using GMPErr from "gmp-errors.h";
+
+include "GMPMessageUtils.h";
+
+namespace mozilla {
+namespace gmp {
+
+intr protocol PGMPVideoDecoder
+{
+ manager PGMPContent;
+child:
+ async InitDecode(GMPVideoCodec aCodecSettings,
+ uint8_t[] aCodecSpecific,
+ int32_t aCoreCount);
+ async Decode(GMPVideoEncodedFrameData aInputFrame,
+ bool aMissingFrames,
+ uint8_t[] aCodecSpecificInfo,
+ int64_t aRenderTimeMs);
+ async Reset();
+ async Drain();
+ async DecodingComplete();
+ async ChildShmemForPool(Shmem aFrameBuffer);
+
+parent:
+ async __delete__();
+ async Decoded(GMPVideoi420FrameData aDecodedFrame);
+ async ReceivedDecodedReferenceFrame(uint64_t aPictureId);
+ async ReceivedDecodedFrame(uint64_t aPictureId);
+ async InputDataExhausted();
+ async DrainComplete();
+ async ResetComplete();
+ async Error(GMPErr aErr);
+ async Shutdown();
+ async ParentShmemForPool(Shmem aEncodedBuffer);
+ // MUST be intr - if sync and we create a new Shmem, when the returned
+ // Shmem is received in the Child it will fail to Deserialize
+ intr NeedShmem(uint32_t aFrameBufferSize) returns (Shmem aMem);
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/PGMPVideoEncoder.ipdl b/dom/media/gmp/PGMPVideoEncoder.ipdl
new file mode 100644
index 000000000..ef013352a
--- /dev/null
+++ b/dom/media/gmp/PGMPVideoEncoder.ipdl
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PGMPContent;
+include GMPTypes;
+
+using GMPVideoCodec from "gmp-video-codec.h";
+using GMPVideoFrameType from "gmp-video-frame-encoded.h";
+using GMPErr from "gmp-errors.h";
+
+include "GMPMessageUtils.h";
+
+namespace mozilla {
+namespace gmp {
+
+intr protocol PGMPVideoEncoder
+{
+ manager PGMPContent;
+child:
+ async InitEncode(GMPVideoCodec aCodecSettings,
+ uint8_t[] aCodecSpecific,
+ int32_t aNumberOfCores,
+ uint32_t aMaxPayloadSize);
+ async Encode(GMPVideoi420FrameData aInputFrame,
+ uint8_t[] aCodecSpecificInfo,
+ GMPVideoFrameType[] aFrameTypes);
+ async SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT);
+ async SetRates(uint32_t aNewBitRate, uint32_t aFrameRate);
+ async SetPeriodicKeyFrames(bool aEnable);
+ async EncodingComplete();
+ async ChildShmemForPool(Shmem aEncodedBuffer);
+
+parent:
+ async __delete__();
+ async Encoded(GMPVideoEncodedFrameData aEncodedFrame,
+ uint8_t[] aCodecSpecificInfo);
+ async Error(GMPErr aErr);
+ async Shutdown();
+ async ParentShmemForPool(Shmem aFrameBuffer);
+ // MUST be intr - if sync and we create a new Shmem, when the returned
+ // Shmem is received in the Child it will fail to Deserialize
+ intr NeedShmem(uint32_t aEncodedBufferSize) returns (Shmem aMem);
+};
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/README.txt b/dom/media/gmp/README.txt
new file mode 100644
index 000000000..189cf3b30
--- /dev/null
+++ b/dom/media/gmp/README.txt
@@ -0,0 +1 @@
+This directory contains code supporting Gecko Media Plugins (GMPs). The GMP API is not the same thing as the Media Plugin API (MPAPI).
diff --git a/dom/media/gmp/gmp-api/gmp-async-shutdown.h b/dom/media/gmp/gmp-api/gmp-async-shutdown.h
new file mode 100644
index 000000000..42268668f
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-async-shutdown.h
@@ -0,0 +1,54 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_ASYNC_SHUTDOWN_H_
+#define GMP_ASYNC_SHUTDOWN_H_
+
+#define GMP_API_ASYNC_SHUTDOWN "async-shutdown"
+
+// API exposed by the plugin library to manage asynchronous shutdown.
+// Some plugins require special cleanup which may need to make calls
+// to host services and wait for async responses.
+//
+// To enable a plugins to block shutdown until its async shutdown is
+// complete, implement the GMPAsyncShutdown interface and return it when
+// your plugin's GMPGetAPI function is called with "async-shutdown".
+// When your GMPAsyncShutdown's BeginShutdown() implementation is called
+// by the GMP host, you should initate your async shutdown process.
+// Once you have completed shutdown, call the ShutdownComplete() function
+// of the GMPAsyncShutdownHost that is passed as the host argument to the
+// GMPGetAPI() call.
+//
+// Note: Your GMP's GMPShutdown function will still be called after your
+// call to ShutdownComplete().
+//
+// API name macro: GMP_API_ASYNC_SHUTDOWN
+// Host API: GMPAsyncShutdownHost
+class GMPAsyncShutdown {
+public:
+ virtual ~GMPAsyncShutdown() {}
+
+ virtual void BeginShutdown() = 0;
+};
+
+class GMPAsyncShutdownHost {
+public:
+ virtual ~GMPAsyncShutdownHost() {}
+
+ virtual void ShutdownComplete() = 0;
+};
+
+#endif // GMP_ASYNC_SHUTDOWN_H_
diff --git a/dom/media/gmp/gmp-api/gmp-audio-codec.h b/dom/media/gmp/gmp-api/gmp-audio-codec.h
new file mode 100644
index 000000000..5a5c17bb9
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-audio-codec.h
@@ -0,0 +1,43 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_AUDIO_CODEC_h_
+#define GMP_AUDIO_CODEC_h_
+
+#include <stdint.h>
+
+enum GMPAudioCodecType
+{
+ kGMPAudioCodecAAC,
+ kGMPAudioCodecVorbis,
+ kGMPAudioCodecInvalid // Should always be last.
+};
+
+struct GMPAudioCodec
+{
+ GMPAudioCodecType mCodecType;
+ uint32_t mChannelCount;
+ uint32_t mBitsPerChannel;
+ uint32_t mSamplesPerSecond;
+
+ // Codec extra data, such as vorbis setup header, or
+ // AAC AudioSpecificConfig.
+ // These are null/0 if not externally negotiated
+ const uint8_t* mExtraData;
+ uint32_t mExtraDataLen;
+};
+
+#endif // GMP_AUDIO_CODEC_h_
diff --git a/dom/media/gmp/gmp-api/gmp-audio-decode.h b/dom/media/gmp/gmp-api/gmp-audio-decode.h
new file mode 100644
index 000000000..8b017c0af
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-audio-decode.h
@@ -0,0 +1,84 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_AUDIO_DECODE_h_
+#define GMP_AUDIO_DECODE_h_
+
+#include "gmp-errors.h"
+#include "gmp-audio-samples.h"
+#include "gmp-audio-codec.h"
+#include <stdint.h>
+
+// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
+class GMPAudioDecoderCallback
+{
+public:
+ virtual ~GMPAudioDecoderCallback() {}
+
+ virtual void Decoded(GMPAudioSamples* aDecodedSamples) = 0;
+
+ virtual void InputDataExhausted() = 0;
+
+ virtual void DrainComplete() = 0;
+
+ virtual void ResetComplete() = 0;
+
+ // Called when the decoder encounters a catestrophic error and cannot
+ // continue. Gecko will not send any more input for decoding.
+ virtual void Error(GMPErr aError) = 0;
+};
+
+#define GMP_API_AUDIO_DECODER "decode-audio"
+
+// Audio decoding for a single stream. A GMP may be asked to create multiple
+// decoders concurrently.
+//
+// API name macro: GMP_API_AUDIO_DECODER
+// Host API: GMPAudioHost
+//
+// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
+class GMPAudioDecoder
+{
+public:
+ virtual ~GMPAudioDecoder() {}
+
+ // aCallback: Subclass should retain reference to it until DecodingComplete
+ // is called. Do not attempt to delete it, host retains ownership.
+ // TODO: Pass AudioHost so decoder can create GMPAudioEncodedFrame objects?
+ virtual void InitDecode(const GMPAudioCodec& aCodecSettings,
+ GMPAudioDecoderCallback* aCallback) = 0;
+
+ // Decode encoded audio frames (as a part of an audio stream). The decoded
+ // frames must be returned to the user through the decode complete callback.
+ virtual void Decode(GMPAudioSamples* aEncodedSamples) = 0;
+
+ // Reset decoder state and prepare for a new call to Decode(...).
+ // Flushes the decoder pipeline.
+ // The decoder should enqueue a task to run ResetComplete() on the main
+ // thread once the reset has finished.
+ virtual void Reset() = 0;
+
+ // Output decoded frames for any data in the pipeline, regardless of ordering.
+ // All remaining decoded frames should be immediately returned via callback.
+ // The decoder should enqueue a task to run DrainComplete() on the main
+ // thread once the reset has finished.
+ virtual void Drain() = 0;
+
+ // May free decoder memory.
+ virtual void DecodingComplete() = 0;
+};
+
+#endif // GMP_VIDEO_DECODE_h_
diff --git a/dom/media/gmp/gmp-api/gmp-audio-host.h b/dom/media/gmp/gmp-api/gmp-audio-host.h
new file mode 100644
index 000000000..fe3641938
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-audio-host.h
@@ -0,0 +1,32 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_AUDIO_HOST_h_
+#define GMP_AUDIO_HOST_h_
+
+#include "gmp-errors.h"
+#include "gmp-audio-samples.h"
+
+class GMPAudioHost
+{
+public:
+ // Construct various Audio API objects. Host does not retain reference,
+ // caller is owner and responsible for deleting.
+ virtual GMPErr CreateSamples(GMPAudioFormat aFormat,
+ GMPAudioSamples** aSamples) = 0;
+};
+
+#endif // GMP_AUDIO_HOST_h_
diff --git a/dom/media/gmp/gmp-api/gmp-audio-samples.h b/dom/media/gmp/gmp-api/gmp-audio-samples.h
new file mode 100644
index 000000000..a47fc74b9
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-audio-samples.h
@@ -0,0 +1,74 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_AUDIO_FRAME_h_
+#define GMP_AUDIO_FRAME_h_
+
+#include <stdint.h>
+#include "gmp-errors.h"
+#include "gmp-decryption.h"
+
+enum GMPAudioFormat
+{
+ kGMPAudioEncodedSamples, // Raw compressed data, i.e. an AAC/Vorbis packet.
+ kGMPAudioIS16Samples, // Interleaved int16_t PCM samples.
+ kGMPAudioSamplesFormatInvalid // Should always be last.
+};
+
+class GMPAudioSamples {
+public:
+ // The format of the buffer.
+ virtual GMPAudioFormat GetFormat() = 0;
+ virtual void Destroy() = 0;
+
+ // MAIN THREAD ONLY
+ // Buffer size must be exactly what's required to contain all samples in
+ // the buffer; every byte is assumed to be part of a sample.
+ virtual GMPErr SetBufferSize(uint32_t aSize) = 0;
+
+ // Size of the buffer in bytes.
+ virtual uint32_t Size() = 0;
+
+ // Timestamps are in microseconds, and are the playback start time of the
+ // first sample in the buffer.
+ virtual void SetTimeStamp(uint64_t aTimeStamp) = 0;
+ virtual uint64_t TimeStamp() = 0;
+ virtual const uint8_t* Buffer() const = 0;
+ virtual uint8_t* Buffer() = 0;
+
+ // Get metadata describing how this frame is encrypted, or nullptr if the
+ // buffer is not encrypted.
+ virtual const GMPEncryptedBufferMetadata* GetDecryptionData() const = 0;
+
+ virtual uint32_t Channels() const = 0;
+ virtual void SetChannels(uint32_t aChannels) = 0;
+
+ // Rate; the number of frames per second, where a "frame" is one sample for
+ // each channel.
+ //
+ // For IS16 samples, the number of samples should be:
+ // Size() / (Channels() * sizeof(int16_t)).
+ //
+ // Note: Channels() and Rate() may not be constant across a decoding
+ // session. For example the rate for decoded samples may be different
+ // than the rate advertised by the MP4 container for encoded samples
+ // for HE-AAC streams with SBR/PS, and an EME-GMP may need to downsample
+ // to satisfy DRM requirements.
+ virtual uint32_t Rate() const = 0;
+ virtual void SetRate(uint32_t aRate) = 0;
+};
+
+#endif // GMP_AUDIO_FRAME_h_
diff --git a/dom/media/gmp/gmp-api/gmp-decryption.h b/dom/media/gmp/gmp-api/gmp-decryption.h
new file mode 100644
index 000000000..046a05759
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-decryption.h
@@ -0,0 +1,459 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_DECRYPTION_h_
+#define GMP_DECRYPTION_h_
+
+#include "gmp-platform.h"
+
+class GMPStringList {
+public:
+ virtual uint32_t Size() const = 0;
+
+ virtual void StringAt(uint32_t aIndex,
+ const char** aOutString, uint32_t* aOutLength) const = 0;
+
+ virtual ~GMPStringList() { }
+};
+
+class GMPEncryptedBufferMetadata {
+public:
+ // Key ID to identify the decryption key.
+ virtual const uint8_t* KeyId() const = 0;
+
+ // Size (in bytes) of |KeyId()|.
+ virtual uint32_t KeyIdSize() const = 0;
+
+ // Initialization vector.
+ virtual const uint8_t* IV() const = 0;
+
+ // Size (in bytes) of |IV|.
+ virtual uint32_t IVSize() const = 0;
+
+ // Number of entries returned by ClearBytes() and CipherBytes().
+ virtual uint32_t NumSubsamples() const = 0;
+
+ virtual const uint16_t* ClearBytes() const = 0;
+
+ virtual const uint32_t* CipherBytes() const = 0;
+
+ virtual ~GMPEncryptedBufferMetadata() {}
+
+ // The set of MediaKeySession IDs associated with this decryption key in
+ // the current stream.
+ virtual const GMPStringList* SessionIds() const = 0;
+};
+
+class GMPBuffer {
+public:
+ virtual uint32_t Id() const = 0;
+ virtual uint8_t* Data() = 0;
+ virtual uint32_t Size() const = 0;
+ virtual void Resize(uint32_t aSize) = 0;
+ virtual ~GMPBuffer() {}
+};
+
+// These match to the DOMException codes as per:
+// http://www.w3.org/TR/dom/#domexception
+enum GMPDOMException {
+ kGMPNoModificationAllowedError = 7,
+ kGMPNotFoundError = 8,
+ kGMPNotSupportedError = 9,
+ kGMPInvalidStateError = 11,
+ kGMPSyntaxError = 12,
+ kGMPInvalidModificationError = 13,
+ kGMPInvalidAccessError = 15,
+ kGMPSecurityError = 18,
+ kGMPAbortError = 20,
+ kGMPQuotaExceededError = 22,
+ kGMPTimeoutError = 23,
+ kGMPTypeError = 52
+};
+
+enum GMPSessionMessageType {
+ kGMPLicenseRequest = 0,
+ kGMPLicenseRenewal = 1,
+ kGMPLicenseRelease = 2,
+ kGMPIndividualizationRequest = 3,
+ kGMPMessageInvalid = 4 // Must always be last.
+};
+
+enum GMPMediaKeyStatus {
+ kGMPUsable = 0,
+ kGMPExpired = 1,
+ kGMPOutputDownscaled = 2,
+ kGMPOutputRestricted = 3,
+ kGMPInternalError = 4,
+ kGMPUnknown = 5, // Removes key from MediaKeyStatusMap
+ kGMPReleased = 6,
+ kGMPStatusPending = 7,
+ kGMPMediaKeyStatusInvalid = 8 // Must always be last.
+};
+
+struct GMPMediaKeyInfo {
+ GMPMediaKeyInfo() {}
+ GMPMediaKeyInfo(const uint8_t* aKeyId,
+ uint32_t aKeyIdSize,
+ GMPMediaKeyStatus aStatus)
+ : keyid(aKeyId)
+ , keyid_size(aKeyIdSize)
+ , status(aStatus)
+ {}
+ const uint8_t* keyid;
+ uint32_t keyid_size;
+ GMPMediaKeyStatus status;
+};
+
+// Time in milliseconds, as offset from epoch, 1 Jan 1970.
+typedef int64_t GMPTimestamp;
+
+// Callbacks to be called from the CDM. Threadsafe.
+class GMPDecryptorCallback {
+public:
+
+ // The GMPDecryptor should call this in response to a call to
+ // GMPDecryptor::CreateSession(). The GMP host calls CreateSession() when
+ // MediaKeySession.generateRequest() is called by JavaScript.
+ // After CreateSession() is called, the GMPDecryptor should call
+ // GMPDecryptorCallback::SetSessionId() to set the sessionId exposed to
+ // JavaScript on the MediaKeySession on which the generateRequest() was
+ // called. SetSessionId() must be called before
+ // GMPDecryptorCallback::SessionMessage() will work.
+ // aSessionId must be null terminated.
+ // Note: pass the aCreateSessionToken from the CreateSession() call,
+ // and then once the session has sent any messages required for the
+ // license request to be sent, then resolve the aPromiseId that was passed
+ // to GMPDecryptor::CreateSession().
+ // Note: GMPDecryptor::LoadSession() does *not* need to call SetSessionId()
+ // for GMPDecryptorCallback::SessionMessage() to work.
+ virtual void SetSessionId(uint32_t aCreateSessionToken,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Resolves a promise for a session loaded.
+ // Resolves to false if we don't have any session data stored for the given
+ // session ID.
+ // Must be called before SessionMessage().
+ virtual void ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) = 0;
+
+ // Called to resolve a specified promise with "undefined".
+ virtual void ResolvePromise(uint32_t aPromiseId) = 0;
+
+ // Called to reject a promise with a DOMException.
+ // aMessage is logged to the WebConsole.
+ // aMessage is optional, but if present must be null terminated.
+ virtual void RejectPromise(uint32_t aPromiseId,
+ GMPDOMException aException,
+ const char* aMessage,
+ uint32_t aMessageLength) = 0;
+
+ // Called by the CDM when it has a message for a session.
+ // Length parameters should not include null termination.
+ // aSessionId must be null terminated.
+ virtual void SessionMessage(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPSessionMessageType aMessageType,
+ const uint8_t* aMessage,
+ uint32_t aMessageLength) = 0;
+
+ // aSessionId must be null terminated.
+ virtual void ExpirationChange(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPTimestamp aExpiryTime) = 0;
+
+ // Called by the GMP when a session is closed. All file IO
+ // that a session requires should be complete before calling this.
+ // aSessionId must be null terminated.
+ virtual void SessionClosed(const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Called by the GMP when an error occurs in a session.
+ // aSessionId must be null terminated.
+ // aMessage is logged to the WebConsole.
+ // aMessage is optional, but if present must be null terminated.
+ virtual void SessionError(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ GMPDOMException aException,
+ uint32_t aSystemCode,
+ const char* aMessage,
+ uint32_t aMessageLength) = 0;
+
+ // Notifies the status of a key. Gecko will not call into the CDM to decrypt
+ // or decode content encrypted with a key unless the CDM has marked it
+ // usable first. So a CDM *MUST* mark its usable keys as usable!
+ virtual void KeyStatusChanged(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aKeyId,
+ uint32_t aKeyIdLength,
+ GMPMediaKeyStatus aStatus) = 0;
+
+ // DEPRECATED; this function has no affect.
+ virtual void SetCapabilities(uint64_t aCaps) = 0;
+
+ // Returns decrypted buffer to Gecko, or reports failure.
+ virtual void Decrypted(GMPBuffer* aBuffer, GMPErr aResult) = 0;
+
+ // To aggregate KeyStatusChanged into single callback per session id.
+ virtual void BatchedKeyStatusChanged(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const GMPMediaKeyInfo* aKeyInfos,
+ uint32_t aKeyInfosLength) = 0;
+
+ virtual ~GMPDecryptorCallback() {}
+};
+
+// Host interface, passed to GetAPIFunc(), with "decrypt".
+class GMPDecryptorHost {
+public:
+ virtual void GetSandboxVoucher(const uint8_t** aVoucher,
+ uint32_t* aVoucherLength) = 0;
+
+ virtual void GetPluginVoucher(const uint8_t** aVoucher,
+ uint32_t* aVoucherLength) = 0;
+
+ virtual ~GMPDecryptorHost() {}
+};
+
+enum GMPSessionType {
+ kGMPTemporySession = 0,
+ kGMPPersistentSession = 1,
+ kGMPSessionInvalid = 2 // Must always be last.
+};
+
+// Gecko supports the current GMPDecryptor version, and the obsolete
+// version that the Adobe GMP still uses.
+#define GMP_API_DECRYPTOR "eme-decrypt-v9"
+#define GMP_API_DECRYPTOR_BACKWARDS_COMPAT "eme-decrypt-v7"
+
+// API exposed by plugin library to manage decryption sessions.
+// When the Host requests this by calling GMPGetAPIFunc().
+//
+// API name macro: GMP_API_DECRYPTOR
+// Host API: GMPDecryptorHost
+class GMPDecryptor {
+public:
+
+ // Sets the callback to use with the decryptor to return results
+ // to Gecko.
+ virtual void Init(GMPDecryptorCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired) = 0;
+
+ // Initiates the creation of a session given |aType| and |aInitData|, and
+ // the generation of a license request message.
+ //
+ // This corresponds to a MediaKeySession.generateRequest() call in JS.
+ //
+ // The GMPDecryptor must do the following, in order, upon this method
+ // being called:
+ //
+ // 1. Generate a sessionId to expose to JS, and call
+ // GMPDecryptorCallback::SetSessionId(aCreateSessionToken, sessionId...)
+ // with the sessionId to be exposed to JS/EME on the MediaKeySession
+ // object on which generateRequest() was called, and then
+ // 2. send any messages to JS/EME required to generate a license request
+ // given the supplied initData, and then
+ // 3. generate a license request message, and send it to JS/EME, and then
+ // 4. call GMPDecryptorCallback::ResolvePromise().
+ //
+ // Note: GMPDecryptorCallback::SetSessionId(aCreateSessionToken, sessionId, ...)
+ // *must* be called before GMPDecryptorCallback::SendMessage(sessionId, ...)
+ // will work.
+ //
+ // If generating the request fails, reject aPromiseId by calling
+ // GMPDecryptorCallback::RejectPromise().
+ virtual void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const char* aInitDataType,
+ uint32_t aInitDataTypeSize,
+ const uint8_t* aInitData,
+ uint32_t aInitDataSize,
+ GMPSessionType aSessionType) = 0;
+
+ // Loads a previously loaded persistent session.
+ //
+ // This corresponds to a MediaKeySession.load() call in JS.
+ //
+ // The GMPDecryptor must do the following, in order, upon this method
+ // being called:
+ //
+ // 1. Send any messages to JS/EME, or read from storage, whatever is
+ // required to load the session, and then
+ // 2. if there is no session with the given sessionId loadable, call
+ // ResolveLoadSessionPromise(aPromiseId, false), otherwise
+ // 2. mark the session's keys as usable, and then
+ // 3. update the session's expiration, and then
+ // 4. call GMPDecryptorCallback::ResolveLoadSessionPromise(aPromiseId, true).
+ //
+ // If loading the session fails due to error, reject aPromiseId by calling
+ // GMPDecryptorCallback::RejectPromise().
+ virtual void LoadSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Updates the session with |aResponse|.
+ // This corresponds to a MediaKeySession.update() call in JS.
+ virtual void UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize) = 0;
+
+ // Releases the resources (keys) for the specified session.
+ // This corresponds to a MediaKeySession.close() call in JS.
+ virtual void CloseSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Removes the resources (keys) for the specified session.
+ // This corresponds to a MediaKeySession.remove() call in JS.
+ virtual void RemoveSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Resolve/reject promise on completion.
+ // This corresponds to a MediaKeySession.setServerCertificate() call in JS.
+ virtual void SetServerCertificate(uint32_t aPromiseId,
+ const uint8_t* aServerCert,
+ uint32_t aServerCertSize) = 0;
+
+ // Asynchronously decrypts aBuffer in place. When the decryption is
+ // complete, GMPDecryptor should write the decrypted data back into the
+ // same GMPBuffer object and return it to Gecko by calling Decrypted(),
+ // with the GMPNoErr successcode. If decryption fails, call Decrypted()
+ // with a failure code, and an error event will fire on the media element.
+ // Note: When Decrypted() is called and aBuffer is passed back, aBuffer
+ // is deleted. Don't forget to call Decrypted(), as otherwise aBuffer's
+ // memory will leak!
+ virtual void Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata) = 0;
+
+ // Called when the decryption operations are complete.
+ // Do not call the GMPDecryptorCallback's functions after this is called.
+ virtual void DecryptingComplete() = 0;
+
+ virtual ~GMPDecryptor() {}
+};
+
+// v7 is the latest decryptor version supported by the Adobe GMP.
+//
+// API name macro: GMP_API_DECRYPTOR_BACKWARDS_COMPAT
+// Host API: GMPDecryptorHost
+class GMPDecryptor7 {
+public:
+
+ // Sets the callback to use with the decryptor to return results
+ // to Gecko.
+ virtual void Init(GMPDecryptorCallback* aCallback) = 0;
+
+ // Initiates the creation of a session given |aType| and |aInitData|, and
+ // the generation of a license request message.
+ //
+ // This corresponds to a MediaKeySession.generateRequest() call in JS.
+ //
+ // The GMPDecryptor must do the following, in order, upon this method
+ // being called:
+ //
+ // 1. Generate a sessionId to expose to JS, and call
+ // GMPDecryptorCallback::SetSessionId(aCreateSessionToken, sessionId...)
+ // with the sessionId to be exposed to JS/EME on the MediaKeySession
+ // object on which generateRequest() was called, and then
+ // 2. send any messages to JS/EME required to generate a license request
+ // given the supplied initData, and then
+ // 3. generate a license request message, and send it to JS/EME, and then
+ // 4. call GMPDecryptorCallback::ResolvePromise().
+ //
+ // Note: GMPDecryptorCallback::SetSessionId(aCreateSessionToken, sessionId, ...)
+ // *must* be called before GMPDecryptorCallback::SendMessage(sessionId, ...)
+ // will work.
+ //
+ // If generating the request fails, reject aPromiseId by calling
+ // GMPDecryptorCallback::RejectPromise().
+ virtual void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const char* aInitDataType,
+ uint32_t aInitDataTypeSize,
+ const uint8_t* aInitData,
+ uint32_t aInitDataSize,
+ GMPSessionType aSessionType) = 0;
+
+ // Loads a previously loaded persistent session.
+ //
+ // This corresponds to a MediaKeySession.load() call in JS.
+ //
+ // The GMPDecryptor must do the following, in order, upon this method
+ // being called:
+ //
+ // 1. Send any messages to JS/EME, or read from storage, whatever is
+ // required to load the session, and then
+ // 2. if there is no session with the given sessionId loadable, call
+ // ResolveLoadSessionPromise(aPromiseId, false), otherwise
+ // 2. mark the session's keys as usable, and then
+ // 3. update the session's expiration, and then
+ // 4. call GMPDecryptorCallback::ResolveLoadSessionPromise(aPromiseId, true).
+ //
+ // If loading the session fails due to error, reject aPromiseId by calling
+ // GMPDecryptorCallback::RejectPromise().
+ virtual void LoadSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Updates the session with |aResponse|.
+ // This corresponds to a MediaKeySession.update() call in JS.
+ virtual void UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize) = 0;
+
+ // Releases the resources (keys) for the specified session.
+ // This corresponds to a MediaKeySession.close() call in JS.
+ virtual void CloseSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Removes the resources (keys) for the specified session.
+ // This corresponds to a MediaKeySession.remove() call in JS.
+ virtual void RemoveSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) = 0;
+
+ // Resolve/reject promise on completion.
+ // This corresponds to a MediaKeySession.setServerCertificate() call in JS.
+ virtual void SetServerCertificate(uint32_t aPromiseId,
+ const uint8_t* aServerCert,
+ uint32_t aServerCertSize) = 0;
+
+ // Asynchronously decrypts aBuffer in place. When the decryption is
+ // complete, GMPDecryptor should write the decrypted data back into the
+ // same GMPBuffer object and return it to Gecko by calling Decrypted(),
+ // with the GMPNoErr successcode. If decryption fails, call Decrypted()
+ // with a failure code, and an error event will fire on the media element.
+ // Note: When Decrypted() is called and aBuffer is passed back, aBuffer
+ // is deleted. Don't forget to call Decrypted(), as otherwise aBuffer's
+ // memory will leak!
+ virtual void Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata) = 0;
+
+ // Called when the decryption operations are complete.
+ // Do not call the GMPDecryptorCallback's functions after this is called.
+ virtual void DecryptingComplete() = 0;
+
+ virtual ~GMPDecryptor7() {}
+};
+
+#endif // GMP_DECRYPTION_h_
diff --git a/dom/media/gmp/gmp-api/gmp-entrypoints.h b/dom/media/gmp/gmp-api/gmp-entrypoints.h
new file mode 100644
index 000000000..214c9dbfc
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-entrypoints.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_ENTRYPOINTS_h_
+#define GMP_ENTRYPOINTS_h_
+
+#include "gmp-errors.h"
+#include "gmp-platform.h"
+
+/* C functions exposed by Gecko Media Plugin shared library. */
+
+// GMPInit
+// - Called once after plugin library is loaded, before GMPGetAPI or GMPShutdown are called.
+// - Called on main thread.
+// - 'aPlatformAPI' is a structure containing platform-provided APIs. It is valid until
+// 'GMPShutdown' is called. Owned and must be deleted by plugin.
+typedef GMPErr (*GMPInitFunc)(const GMPPlatformAPI* aPlatformAPI);
+
+// GMPGetAPI
+// - Called when host wants to use an API.
+// - Called on main thread.
+// - 'aAPIName' is a string indicating the API being requested. This should
+// match one of the GMP_API_* macros. Subsequent iterations of the GMP_APIs
+// may change the value of the GMP_API_* macros when ABI changes occur. So
+// make sure you compare aAPIName against the corresponding GMP_API_* macro!
+// - 'aHostAPI' is the host API which is specific to the API being requested
+// from the plugin. It is valid so long as the API object requested from the
+// plugin is valid. It is owned by the host, plugin should not attempt to delete.
+// May be null.
+// - 'aPluginAPI' is for returning the requested API. Destruction of the requsted
+// API object is defined by the API.
+typedef GMPErr (*GMPGetAPIFunc)(const char* aAPIName, void* aHostAPI, void** aPluginAPI);
+
+// GMPShutdown
+// - Called once before exiting process (unloading library).
+// - Called on main thread.
+typedef void (*GMPShutdownFunc)(void);
+
+// GMPSetNodeId
+// - Optional, not required to be implemented. Only useful for EME plugins.
+// - Called after GMPInit to set the device-bound origin-specific node id
+// that this GMP instance is running under.
+typedef void (*GMPSetNodeIdFunc)(const char* aNodeId, uint32_t aLength);
+
+#endif // GMP_ENTRYPOINTS_h_
diff --git a/dom/media/gmp/gmp-api/gmp-errors.h b/dom/media/gmp/gmp-api/gmp-errors.h
new file mode 100644
index 000000000..7f20e2a79
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-errors.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_ERRORS_h_
+#define GMP_ERRORS_h_
+
+typedef enum {
+ GMPNoErr = 0,
+ GMPGenericErr = 1,
+ GMPClosedErr = 2,
+ GMPAllocErr = 3,
+ GMPNotImplementedErr = 4,
+ GMPRecordInUse = 5,
+ GMPQuotaExceededErr = 6,
+ GMPDecodeErr = 7,
+ GMPEncodeErr = 8,
+ GMPNoKeyErr = 9,
+ GMPCryptoErr = 10,
+ GMPEndOfEnumeration = 11,
+ GMPInvalidArgErr = 12,
+ GMPAbortedErr = 13,
+ GMPRecordCorrupted = 14,
+ GMPLastErr // Placeholder, must be last. This enum's values must remain consecutive!
+} GMPErr;
+
+#define GMP_SUCCEEDED(x) ((x) == GMPNoErr)
+#define GMP_FAILED(x) ((x) != GMPNoErr)
+
+#endif // GMP_ERRORS_h_
diff --git a/dom/media/gmp/gmp-api/gmp-platform.h b/dom/media/gmp/gmp-api/gmp-platform.h
new file mode 100644
index 000000000..f915050b3
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-platform.h
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_PLATFORM_h_
+#define GMP_PLATFORM_h_
+
+#include "gmp-errors.h"
+#include "gmp-storage.h"
+#include <stdint.h>
+
+/* Platform helper API. */
+
+class GMPTask {
+public:
+ virtual void Destroy() = 0; // Deletes object.
+ virtual ~GMPTask() {}
+ virtual void Run() = 0;
+};
+
+class GMPThread {
+public:
+ virtual ~GMPThread() {}
+ virtual void Post(GMPTask* aTask) = 0;
+ virtual void Join() = 0; // Deletes object after join completes.
+};
+
+// A re-entrant monitor; can be locked from the same thread multiple times.
+// Must be unlocked the same number of times it's locked.
+class GMPMutex {
+public:
+ virtual ~GMPMutex() {}
+ virtual void Acquire() = 0;
+ virtual void Release() = 0;
+ virtual void Destroy() = 0; // Deletes object.
+};
+
+// Time is defined as the number of milliseconds since the
+// Epoch (00:00:00 UTC, January 1, 1970).
+typedef int64_t GMPTimestamp;
+
+typedef GMPErr (*GMPCreateThreadPtr)(GMPThread** aThread);
+typedef GMPErr (*GMPRunOnMainThreadPtr)(GMPTask* aTask);
+typedef GMPErr (*GMPSyncRunOnMainThreadPtr)(GMPTask* aTask);
+typedef GMPErr (*GMPCreateMutexPtr)(GMPMutex** aMutex);
+
+// Call on main thread only.
+typedef GMPErr (*GMPCreateRecordPtr)(const char* aRecordName,
+ uint32_t aRecordNameSize,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient);
+
+// Call on main thread only.
+typedef GMPErr (*GMPSetTimerOnMainThreadPtr)(GMPTask* aTask, int64_t aTimeoutMS);
+typedef GMPErr (*GMPGetCurrentTimePtr)(GMPTimestamp* aOutTime);
+
+typedef void (*RecvGMPRecordIteratorPtr)(GMPRecordIterator* aRecordIterator,
+ void* aUserArg,
+ GMPErr aStatus);
+
+// Creates a GMPCreateRecordIterator to enumerate the records in storage.
+// When the iterator is ready, the function at aRecvIteratorFunc
+// is called with the GMPRecordIterator as an argument. If the operation
+// fails, RecvGMPRecordIteratorPtr is called with a failure aStatus code.
+// The list that the iterator is covering is fixed when
+// GMPCreateRecordIterator is called, it is *not* updated when changes are
+// made to storage.
+// Iterator begins pointing at first record.
+// aUserArg is passed to the aRecvIteratorFunc upon completion.
+typedef GMPErr (*GMPCreateRecordIteratorPtr)(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg);
+
+struct GMPPlatformAPI {
+ // Increment the version when things change. Can only add to the struct,
+ // do not change what already exists. Pointers to functions may be NULL
+ // when passed to plugins, but beware backwards compat implications of
+ // doing that.
+ uint16_t version; // Currently version 0
+
+ GMPCreateThreadPtr createthread;
+ GMPRunOnMainThreadPtr runonmainthread;
+ GMPSyncRunOnMainThreadPtr syncrunonmainthread;
+ GMPCreateMutexPtr createmutex;
+ GMPCreateRecordPtr createrecord;
+ GMPSetTimerOnMainThreadPtr settimer;
+ GMPGetCurrentTimePtr getcurrenttime;
+ GMPCreateRecordIteratorPtr getrecordenumerator;
+};
+
+#endif // GMP_PLATFORM_h_
diff --git a/dom/media/gmp/gmp-api/gmp-storage.h b/dom/media/gmp/gmp-api/gmp-storage.h
new file mode 100644
index 000000000..43ad12b01
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-storage.h
@@ -0,0 +1,141 @@
+/*
+* Copyright 2013, Mozilla Foundation and contributors
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef GMP_STORAGE_h_
+#define GMP_STORAGE_h_
+
+#include "gmp-errors.h"
+#include <stdint.h>
+
+// Maximum size of a record, in bytes; 10 megabytes.
+#define GMP_MAX_RECORD_SIZE (10 * 1024 * 1024)
+
+// Maximum length of a record name in bytes.
+#define GMP_MAX_RECORD_NAME_SIZE 2000
+
+// Provides basic per-origin storage for CDMs. GMPRecord instances can be
+// retrieved by calling GMPPlatformAPI->openstorage. Multiple GMPRecords
+// with different names can be open at once, but a single record can only
+// be opened by one client at a time. This interface is asynchronous, with
+// results being returned via callbacks to the GMPRecordClient pointer
+// provided to the GMPPlatformAPI->openstorage call, on the main thread.
+//
+// Lifecycle: Once opened, the GMPRecord object remains allocated until
+// GMPRecord::Close() is called. If any GMPRecord function, either
+// synchronously or asynchronously through a GMPRecordClient callback,
+// returns an error, the GMP is responsible for calling Close() on the
+// GMPRecord to delete the GMPRecord object's memory. If your GMP does not
+// call Close(), the GMPRecord's memory will leak.
+class GMPRecord {
+public:
+
+ // Opens the record. Calls OpenComplete() once the record is open.
+ // Note: Only work when GMP is loading content from a webserver.
+ // Does not work for web pages on loaded from disk.
+ // Note: OpenComplete() is only called if this returns GMPNoErr.
+ virtual GMPErr Open() = 0;
+
+ // Reads the entire contents of the record, and calls
+ // GMPRecordClient::ReadComplete() once the operation is complete.
+ // Note: ReadComplete() is only called if this returns GMPNoErr.
+ virtual GMPErr Read() = 0;
+
+ // Writes aDataSize bytes of aData into the record, overwriting the
+ // contents of the record, truncating it to aDataSize length.
+ // Overwriting with 0 bytes "deletes" the record.
+ // Note: WriteComplete is only called if this returns GMPNoErr.
+ virtual GMPErr Write(const uint8_t* aData, uint32_t aDataSize) = 0;
+
+ // Closes a record, deletes the GMPRecord object. The GMPRecord object
+ // must not be used after this is called, request a new one with
+ // GMPPlatformAPI->openstorage to re-open this record. Cancels all
+ // callbacks.
+ virtual GMPErr Close() = 0;
+
+ virtual ~GMPRecord() {}
+};
+
+// Callback object that receives the results of GMPRecord calls. Callbacks
+// run asynchronously to the GMPRecord call, on the main thread.
+class GMPRecordClient {
+ public:
+
+ // Response to a GMPRecord::Open() call with the open |status|.
+ // aStatus values:
+ // - GMPNoErr - Record opened successfully. Record may be empty.
+ // - GMPRecordInUse - This record is in use by another client.
+ // - GMPGenericErr - Unspecified error.
+ // If aStatus is not GMPNoErr, the GMPRecord is unusable, and you must
+ // call Close() on the GMPRecord to dispose of it.
+ virtual void OpenComplete(GMPErr aStatus) = 0;
+
+ // Response to a GMPRecord::Read() call, where aData is the record contents,
+ // of length aDataSize.
+ // aData is only valid for the duration of the call to ReadComplete.
+ // Copy it if you want to hang onto it!
+ // aStatus values:
+ // - GMPNoErr - Record contents read successfully, aDataSize 0 means record
+ // is empty.
+ // - GMPRecordInUse - There are other operations or clients in use on
+ // this record.
+ // - GMPGenericErr - Unspecified error.
+ // If aStatus is not GMPNoErr, the GMPRecord is unusable, and you must
+ // call Close() on the GMPRecord to dispose of it.
+ virtual void ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize) = 0;
+
+ // Response to a GMPRecord::Write() call.
+ // - GMPNoErr - File contents written successfully.
+ // - GMPRecordInUse - There are other operations or clients in use on
+ // this record.
+ // - GMPGenericErr - Unspecified error.
+ // If aStatus is not GMPNoErr, the GMPRecord is unusable, and you must
+ // call Close() on the GMPRecord to dispose of it.
+ virtual void WriteComplete(GMPErr aStatus) = 0;
+
+ virtual ~GMPRecordClient() {}
+};
+
+// Iterates over the records that are available. Note: this list maintains
+// a snapshot of the records that were present when the iterator was created.
+// Create by calling the GMPCreateRecordIteratorPtr function on the
+// GMPPlatformAPI struct.
+// Iteration is in alphabetical order.
+class GMPRecordIterator {
+public:
+ // Retrieve the name for the current record.
+ // aOutName is null terminated at character at index (*aOutNameLength).
+ // Returns GMPNoErr if successful, or GMPEndOfEnumeration if iteration has
+ // reached the end.
+ virtual GMPErr GetName(const char ** aOutName, uint32_t * aOutNameLength) = 0;
+
+ // Advance iteration to the next record.
+ // Returns GMPNoErr if successful, or GMPEndOfEnumeration if iteration has
+ // reached the end.
+ virtual GMPErr NextRecord() = 0;
+
+ // Signals to the GMP host that the GMP is finished with the
+ // GMPRecordIterator. GMPs must call this to release memory held by
+ // the GMPRecordIterator. Do not access the GMPRecordIterator pointer
+ // after calling this!
+ // Memory retrieved by GetName is *not* valid after calling Close()!
+ virtual void Close() = 0;
+
+ virtual ~GMPRecordIterator() {}
+};
+
+#endif // GMP_STORAGE_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-codec.h b/dom/media/gmp/gmp-api/gmp-video-codec.h
new file mode 100644
index 000000000..e068ab43d
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-codec.h
@@ -0,0 +1,226 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_CODEC_h_
+#define GMP_VIDEO_CODEC_h_
+
+#include <stdint.h>
+#include <stddef.h>
+
+enum { kGMPPayloadNameSize = 32};
+enum { kGMPMaxSimulcastStreams = 4};
+
+enum GMPVideoCodecComplexity
+{
+ kGMPComplexityNormal = 0,
+ kGMPComplexityHigh = 1,
+ kGMPComplexityHigher = 2,
+ kGMPComplexityMax = 3,
+ kGMPComplexityInvalid // Should always be last
+};
+
+enum GMPVP8ResilienceMode {
+ kResilienceOff, // The stream produced by the encoder requires a
+ // recovery frame (typically a key frame) to be
+ // decodable after a packet loss.
+ kResilientStream, // A stream produced by the encoder is resilient to
+ // packet losses, but packets within a frame subsequent
+ // to a loss can't be decoded.
+ kResilientFrames, // Same as kResilientStream but with added resilience
+ // within a frame.
+ kResilienceInvalid // Should always be last.
+};
+
+// VP8 specific
+struct GMPVideoCodecVP8
+{
+ bool mPictureLossIndicationOn;
+ bool mFeedbackModeOn;
+ GMPVideoCodecComplexity mComplexity;
+ GMPVP8ResilienceMode mResilience;
+ uint32_t mNumberOfTemporalLayers;
+ bool mDenoisingOn;
+ bool mErrorConcealmentOn;
+ bool mAutomaticResizeOn;
+};
+
+// H264 specific
+
+// Needs to match a binary spec for this structure.
+// Note: the mSPS at the end of this structure is variable length.
+struct GMPVideoCodecH264AVCC
+{
+ uint8_t mVersion; // == 0x01
+ uint8_t mProfile; // these 3 are profile_level_id
+ uint8_t mConstraints;
+ uint8_t mLevel;
+ uint8_t mLengthSizeMinusOne; // lower 2 bits (== GMPBufferType-1). Top 6 reserved (1's)
+
+ // SPS/PPS will not generally be present for interactive use unless SDP
+ // parameter-sets are used.
+ uint8_t mNumSPS; // lower 5 bits; top 5 reserved (1's)
+
+ /*** uint8_t mSPS[]; (Not defined due to compiler warnings and warnings-as-errors ...) **/
+ // Following mNumSPS is a variable number of bytes, which is the SPS and PPS.
+ // Each SPS == 16 bit size, ("N"), then "N" bytes,
+ // then uint8_t mNumPPS, then each PPS == 16 bit size ("N"), then "N" bytes.
+};
+
+// Codec specific data for H.264 decoding/encoding.
+// Cast the "aCodecSpecific" parameter of GMPVideoDecoder::InitDecode() and
+// GMPVideoEncoder::InitEncode() to this structure.
+struct GMPVideoCodecH264
+{
+ uint8_t mPacketizationMode; // 0 or 1
+ struct GMPVideoCodecH264AVCC mAVCC; // holds a variable-sized struct GMPVideoCodecH264AVCC mAVCC;
+};
+
+enum GMPVideoCodecType
+{
+ kGMPVideoCodecVP8,
+
+ // Encoded frames are in AVCC format; NAL length field of 4 bytes, followed
+ // by frame data. May be multiple NALUs per sample. Codec specific extra data
+ // is the AVCC extra data (in AVCC format).
+ kGMPVideoCodecH264,
+ kGMPVideoCodecVP9,
+ kGMPVideoCodecInvalid // Should always be last.
+};
+
+// Simulcast is when the same stream is encoded multiple times with different
+// settings such as resolution.
+struct GMPSimulcastStream
+{
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mNumberOfTemporalLayers;
+ uint32_t mMaxBitrate; // kilobits/sec.
+ uint32_t mTargetBitrate; // kilobits/sec.
+ uint32_t mMinBitrate; // kilobits/sec.
+ uint32_t mQPMax; // minimum quality
+};
+
+enum GMPVideoCodecMode {
+ kGMPRealtimeVideo,
+ kGMPScreensharing,
+ kGMPStreamingVideo,
+ kGMPCodecModeInvalid // Should always be last.
+};
+
+enum GMPApiVersion {
+ kGMPVersion32 = 1, // leveraging that V32 had mCodecType first, and only supported H264
+ kGMPVersion33 = 33,
+};
+
+struct GMPVideoCodec
+{
+ uint32_t mGMPApiVersion;
+
+ GMPVideoCodecType mCodecType;
+ char mPLName[kGMPPayloadNameSize]; // Must be NULL-terminated!
+ uint32_t mPLType;
+
+ uint32_t mWidth;
+ uint32_t mHeight;
+
+ uint32_t mStartBitrate; // kilobits/sec.
+ uint32_t mMaxBitrate; // kilobits/sec.
+ uint32_t mMinBitrate; // kilobits/sec.
+ uint32_t mMaxFramerate;
+
+ bool mFrameDroppingOn;
+ int32_t mKeyFrameInterval;
+
+ uint32_t mQPMax;
+ uint32_t mNumberOfSimulcastStreams;
+ GMPSimulcastStream mSimulcastStream[kGMPMaxSimulcastStreams];
+
+ GMPVideoCodecMode mMode;
+};
+
+// Either single encoded unit, or multiple units separated by 8/16/24/32
+// bit lengths, all with the same timestamp. Note there is no final 0-length
+// entry; one should check the overall end-of-buffer against where the next
+// length would be.
+enum GMPBufferType {
+ GMP_BufferSingle = 0,
+ GMP_BufferLength8,
+ GMP_BufferLength16,
+ GMP_BufferLength24,
+ GMP_BufferLength32,
+ GMP_BufferInvalid,
+};
+
+struct GMPCodecSpecificInfoGeneric {
+ uint8_t mSimulcastIdx;
+};
+
+struct GMPCodecSpecificInfoH264 {
+ uint8_t mSimulcastIdx;
+};
+
+// Note: if any pointers are added to this struct, it must be fitted
+// with a copy-constructor. See below.
+struct GMPCodecSpecificInfoVP8
+{
+ bool mHasReceivedSLI;
+ uint8_t mPictureIdSLI;
+ bool mHasReceivedRPSI;
+ uint64_t mPictureIdRPSI;
+ int16_t mPictureId; // negative value to skip pictureId
+ bool mNonReference;
+ uint8_t mSimulcastIdx;
+ uint8_t mTemporalIdx;
+ bool mLayerSync;
+ int32_t mTL0PicIdx; // negative value to skip tl0PicIdx
+ int8_t mKeyIdx; // negative value to skip keyIdx
+};
+
+union GMPCodecSpecificInfoUnion
+{
+ GMPCodecSpecificInfoGeneric mGeneric;
+ GMPCodecSpecificInfoVP8 mVP8;
+ GMPCodecSpecificInfoH264 mH264;
+};
+
+// Note: if any pointers are added to this struct or its sub-structs, it
+// must be fitted with a copy-constructor. This is because it is copied
+// in the copy-constructor of VCMEncodedFrame.
+struct GMPCodecSpecificInfo
+{
+ GMPVideoCodecType mCodecType;
+ GMPBufferType mBufferType;
+ GMPCodecSpecificInfoUnion mCodecSpecific;
+};
+
+#endif // GMP_VIDEO_CODEC_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-decode.h b/dom/media/gmp/gmp-api/gmp-video-decode.h
new file mode 100644
index 000000000..e07a7525e
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-decode.h
@@ -0,0 +1,127 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_DECODE_h_
+#define GMP_VIDEO_DECODE_h_
+
+#include "gmp-errors.h"
+#include "gmp-video-frame-i420.h"
+#include "gmp-video-frame-encoded.h"
+#include "gmp-video-codec.h"
+#include <stdint.h>
+
+// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
+class GMPVideoDecoderCallback
+{
+public:
+ virtual ~GMPVideoDecoderCallback() {}
+
+ virtual void Decoded(GMPVideoi420Frame* aDecodedFrame) = 0;
+
+ virtual void ReceivedDecodedReferenceFrame(const uint64_t aPictureId) = 0;
+
+ virtual void ReceivedDecodedFrame(const uint64_t aPictureId) = 0;
+
+ virtual void InputDataExhausted() = 0;
+
+ virtual void DrainComplete() = 0;
+
+ virtual void ResetComplete() = 0;
+
+ // Called when the decoder encounters a catestrophic error and cannot
+ // continue. Gecko will not send any more input for decoding.
+ virtual void Error(GMPErr aError) = 0;
+};
+
+#define GMP_API_VIDEO_DECODER "decode-video"
+
+// Video decoding for a single stream. A GMP may be asked to create multiple
+// decoders concurrently.
+//
+// API name macro: GMP_API_VIDEO_DECODER
+// Host API: GMPVideoHost
+//
+// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
+class GMPVideoDecoder
+{
+public:
+ virtual ~GMPVideoDecoder() {}
+
+ // - aCodecSettings: Details of decoder to create.
+ // - aCodecSpecific: codec specific data, cast to a GMPVideoCodecXXX struct
+ // to get codec specific config data.
+ // - aCodecSpecificLength: number of bytes in aCodecSpecific.
+ // - aCallback: Subclass should retain reference to it until DecodingComplete
+ // is called. Do not attempt to delete it, host retains ownership.
+ // aCoreCount: number of CPU cores.
+ virtual void InitDecode(const GMPVideoCodec& aCodecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificLength,
+ GMPVideoDecoderCallback* aCallback,
+ int32_t aCoreCount) = 0;
+
+ // Decode encoded frame (as a part of a video stream). The decoded frame
+ // will be returned to the user through the decode complete callback.
+ //
+ // - aInputFrame: Frame to decode. Call Destroy() on frame when it's decoded.
+ // - aMissingFrames: True if one or more frames have been lost since the
+ // previous decode call.
+ // - aCodecSpecificInfo : codec specific data, pointer to a
+ // GMPCodecSpecificInfo structure appropriate for
+ // this codec type.
+ // - aCodecSpecificInfoLength : number of bytes in aCodecSpecificInfo
+ // - renderTimeMs : System time to render in milliseconds. Only used by
+ // decoders with internal rendering.
+ virtual void Decode(GMPVideoEncodedFrame* aInputFrame,
+ bool aMissingFrames,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ int64_t aRenderTimeMs = -1) = 0;
+
+ // Reset decoder state and prepare for a new call to Decode(...).
+ // Flushes the decoder pipeline.
+ // The decoder should enqueue a task to run ResetComplete() on the main
+ // thread once the reset has finished.
+ virtual void Reset() = 0;
+
+ // Output decoded frames for any data in the pipeline, regardless of ordering.
+ // All remaining decoded frames should be immediately returned via callback.
+ // The decoder should enqueue a task to run DrainComplete() on the main
+ // thread once the reset has finished.
+ virtual void Drain() = 0;
+
+ // May free decoder memory.
+ virtual void DecodingComplete() = 0;
+};
+
+#endif // GMP_VIDEO_DECODE_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-encode.h b/dom/media/gmp/gmp-api/gmp-video-encode.h
new file mode 100644
index 000000000..5c9cde39c
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-encode.h
@@ -0,0 +1,135 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_ENCODE_h_
+#define GMP_VIDEO_ENCODE_h_
+
+#include <vector>
+#include <stdint.h>
+
+#include "gmp-errors.h"
+#include "gmp-video-frame-i420.h"
+#include "gmp-video-frame-encoded.h"
+#include "gmp-video-codec.h"
+
+// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
+class GMPVideoEncoderCallback
+{
+public:
+ virtual ~GMPVideoEncoderCallback() {}
+
+ virtual void Encoded(GMPVideoEncodedFrame* aEncodedFrame,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength) = 0;
+
+ // Called when the encoder encounters a catestrophic error and cannot
+ // continue. Gecko will not send any more input for encoding.
+ virtual void Error(GMPErr aError) = 0;
+};
+
+#define GMP_API_VIDEO_ENCODER "encode-video"
+
+// Video encoding for a single stream. A GMP may be asked to create multiple
+// encoders concurrently.
+//
+// API name macro: GMP_API_VIDEO_ENCODER
+// Host API: GMPVideoHost
+//
+// ALL METHODS MUST BE CALLED ON THE MAIN THREAD
+class GMPVideoEncoder
+{
+public:
+ virtual ~GMPVideoEncoder() {}
+
+ // Initialize the encoder with the information from the VideoCodec.
+ //
+ // Input:
+ // - codecSettings : Codec settings
+ // - aCodecSpecific : codec specific data, pointer to a
+ // GMPCodecSpecific structure appropriate for
+ // this codec type.
+ // - aCodecSpecificLength : number of bytes in aCodecSpecific
+ // - aCallback: Subclass should retain reference to it until EncodingComplete
+ // is called. Do not attempt to delete it, host retains ownership.
+ // - aNnumberOfCores : Number of cores available for the encoder
+ // - aMaxPayloadSize : The maximum size each payload is allowed
+ // to have. Usually MTU - overhead.
+ virtual void InitEncode(const GMPVideoCodec& aCodecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificLength,
+ GMPVideoEncoderCallback* aCallback,
+ int32_t aNumberOfCores,
+ uint32_t aMaxPayloadSize) = 0;
+
+ // Encode an I420 frame (as a part of a video stream). The encoded frame
+ // will be returned to the user through the encode complete callback.
+ //
+ // Input:
+ // - aInputFrame : Frame to be encoded
+ // - aCodecSpecificInfo : codec specific data, pointer to a
+ // GMPCodecSpecificInfo structure appropriate for
+ // this codec type.
+ // - aCodecSpecificInfoLength : number of bytes in aCodecSpecific
+ // - aFrameTypes : The frame type to encode
+ // - aFrameTypesLength : The number of elements in aFrameTypes array.
+ virtual void Encode(GMPVideoi420Frame* aInputFrame,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ const GMPVideoFrameType* aFrameTypes,
+ uint32_t aFrameTypesLength) = 0;
+
+ // Inform the encoder about the packet loss and round trip time on the
+ // network used to decide the best pattern and signaling.
+ //
+ // - packetLoss : Fraction lost (loss rate in percent =
+ // 100 * packetLoss / 255)
+ // - rtt : Round-trip time in milliseconds
+ virtual void SetChannelParameters(uint32_t aPacketLoss, uint32_t aRTT) = 0;
+
+ // Inform the encoder about the new target bit rate.
+ //
+ // - newBitRate : New target bit rate
+ // - frameRate : The target frame rate
+ virtual void SetRates(uint32_t aNewBitRate, uint32_t aFrameRate) = 0;
+
+ // Use this function to enable or disable periodic key frames. Can be useful for codecs
+ // which have other ways of stopping error propagation.
+ //
+ // - enable : Enable or disable periodic key frames
+ virtual void SetPeriodicKeyFrames(bool aEnable) = 0;
+
+ // May free Encoder memory.
+ virtual void EncodingComplete() = 0;
+};
+
+#endif // GMP_VIDEO_ENCODE_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-frame-encoded.h b/dom/media/gmp/gmp-api/gmp-video-frame-encoded.h
new file mode 100644
index 000000000..76af7349f
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-frame-encoded.h
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_FRAME_ENCODED_h_
+#define GMP_VIDEO_FRAME_ENCODED_h_
+
+#include <stdint.h>
+#include "gmp-decryption.h"
+#include "gmp-video-frame.h"
+#include "gmp-video-codec.h"
+
+enum GMPVideoFrameType
+{
+ kGMPKeyFrame = 0,
+ kGMPDeltaFrame = 1,
+ kGMPGoldenFrame = 2,
+ kGMPAltRefFrame = 3,
+ kGMPSkipFrame = 4,
+ kGMPVideoFrameInvalid = 5 // Must always be last.
+};
+
+// The implementation backing this interface uses shared memory for the
+// buffer(s). This means it can only be used by the "owning" process.
+// At first the process which created the object owns it. When the object
+// is passed to an interface the creator loses ownership and must Destroy()
+// the object. Further attempts to use it may fail due to not being able to
+// access the underlying buffer(s).
+//
+// Methods that create or destroy shared memory must be called on the main
+// thread. They are marked below.
+class GMPVideoEncodedFrame : public GMPVideoFrame
+{
+public:
+ // MAIN THREAD ONLY
+ virtual GMPErr CreateEmptyFrame(uint32_t aSize) = 0;
+ // MAIN THREAD ONLY
+ virtual GMPErr CopyFrame(const GMPVideoEncodedFrame& aVideoFrame) = 0;
+ virtual void SetEncodedWidth(uint32_t aEncodedWidth) = 0;
+ virtual uint32_t EncodedWidth() = 0;
+ virtual void SetEncodedHeight(uint32_t aEncodedHeight) = 0;
+ virtual uint32_t EncodedHeight() = 0;
+ // Microseconds
+ virtual void SetTimeStamp(uint64_t aTimeStamp) = 0;
+ virtual uint64_t TimeStamp() = 0;
+ // Set frame duration (microseconds)
+ // NOTE: next-frame's Timestamp() != this-frame's TimeStamp()+Duration()
+ // depending on rounding to avoid having to track roundoff errors
+ // and dropped/missing frames(!) (which may leave a large gap)
+ virtual void SetDuration(uint64_t aDuration) = 0;
+ virtual uint64_t Duration() const = 0;
+ virtual void SetFrameType(GMPVideoFrameType aFrameType) = 0;
+ virtual GMPVideoFrameType FrameType() = 0;
+ virtual void SetAllocatedSize(uint32_t aNewSize) = 0;
+ virtual uint32_t AllocatedSize() = 0;
+ virtual void SetSize(uint32_t aSize) = 0;
+ virtual uint32_t Size() = 0;
+ virtual void SetCompleteFrame(bool aCompleteFrame) = 0;
+ virtual bool CompleteFrame() = 0;
+ virtual const uint8_t* Buffer() const = 0;
+ virtual uint8_t* Buffer() = 0;
+ virtual GMPBufferType BufferType() const = 0;
+ virtual void SetBufferType(GMPBufferType aBufferType) = 0;
+
+ // Get metadata describing how this frame is encrypted, or nullptr if the
+ // frame is not encrypted.
+ virtual const GMPEncryptedBufferMetadata* GetDecryptionData() const = 0;
+};
+
+#endif // GMP_VIDEO_FRAME_ENCODED_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-frame-i420.h b/dom/media/gmp/gmp-api/gmp-video-frame-i420.h
new file mode 100644
index 000000000..14c2c33cd
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-frame-i420.h
@@ -0,0 +1,132 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_FRAME_I420_h_
+#define GMP_VIDEO_FRAME_I420_h_
+
+#include "gmp-errors.h"
+#include "gmp-video-frame.h"
+#include "gmp-video-plane.h"
+
+#include <stdint.h>
+
+enum GMPPlaneType {
+ kGMPYPlane = 0,
+ kGMPUPlane = 1,
+ kGMPVPlane = 2,
+ kGMPNumOfPlanes = 3
+};
+
+// The implementation backing this interface uses shared memory for the
+// buffer(s). This means it can only be used by the "owning" process.
+// At first the process which created the object owns it. When the object
+// is passed to an interface the creator loses ownership and must Destroy()
+// the object. Further attempts to use it may fail due to not being able to
+// access the underlying buffer(s).
+//
+// Methods that create or destroy shared memory must be called on the main
+// thread. They are marked below.
+class GMPVideoi420Frame : public GMPVideoFrame {
+public:
+ // MAIN THREAD ONLY
+ // CreateEmptyFrame: Sets frame dimensions and allocates buffers based
+ // on set dimensions - height and plane stride.
+ // If required size is bigger than the allocated one, new buffers of adequate
+ // size will be allocated.
+ virtual GMPErr CreateEmptyFrame(int32_t aWidth, int32_t aHeight,
+ int32_t aStride_y, int32_t aStride_u, int32_t aStride_v) = 0;
+
+ // MAIN THREAD ONLY
+ // CreateFrame: Sets the frame's members and buffers. If required size is
+ // bigger than allocated one, new buffers of adequate size will be allocated.
+ virtual GMPErr CreateFrame(int32_t aSize_y, const uint8_t* aBuffer_y,
+ int32_t aSize_u, const uint8_t* aBuffer_u,
+ int32_t aSize_v, const uint8_t* aBuffer_v,
+ int32_t aWidth, int32_t aHeight,
+ int32_t aStride_y, int32_t aStride_u, int32_t aStride_v) = 0;
+
+ // MAIN THREAD ONLY
+ // Copy frame: If required size is bigger than allocated one, new buffers of
+ // adequate size will be allocated.
+ virtual GMPErr CopyFrame(const GMPVideoi420Frame& aVideoFrame) = 0;
+
+ // Swap Frame.
+ virtual void SwapFrame(GMPVideoi420Frame* aVideoFrame) = 0;
+
+ // Get pointer to buffer per plane.
+ virtual uint8_t* Buffer(GMPPlaneType aType) = 0;
+
+ // Overloading with const.
+ virtual const uint8_t* Buffer(GMPPlaneType aType) const = 0;
+
+ // Get allocated size per plane.
+ virtual int32_t AllocatedSize(GMPPlaneType aType) const = 0;
+
+ // Get allocated stride per plane.
+ virtual int32_t Stride(GMPPlaneType aType) const = 0;
+
+ // Set frame width.
+ virtual GMPErr SetWidth(int32_t aWidth) = 0;
+
+ // Set frame height.
+ virtual GMPErr SetHeight(int32_t aHeight) = 0;
+
+ // Get frame width.
+ virtual int32_t Width() const = 0;
+
+ // Get frame height.
+ virtual int32_t Height() const = 0;
+
+ // Set frame timestamp (microseconds)
+ virtual void SetTimestamp(uint64_t aTimestamp) = 0;
+
+ // Get frame timestamp (microseconds)
+ virtual uint64_t Timestamp() const = 0;
+
+ // Set frame duration (microseconds)
+ // NOTE: next-frame's Timestamp() != this-frame's TimeStamp()+Duration()
+ // depending on rounding to avoid having to track roundoff errors
+ // and dropped/missing frames(!) (which may leave a large gap)
+ virtual void SetDuration(uint64_t aDuration) = 0;
+
+ // Get frame duration (microseconds)
+ virtual uint64_t Duration() const = 0;
+
+ // Return true if underlying plane buffers are of zero size, false if not.
+ virtual bool IsZeroSize() const = 0;
+
+ // Reset underlying plane buffers sizes to 0. This function doesn't clear memory.
+ virtual void ResetSize() = 0;
+};
+
+#endif // GMP_VIDEO_FRAME_I420_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-frame.h b/dom/media/gmp/gmp-api/gmp-video-frame.h
new file mode 100644
index 000000000..b3c9f53ab
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-frame.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_FRAME_h_
+#define GMP_VIDEO_FRAME_h_
+
+#include "gmp-video-plane.h"
+
+enum GMPVideoFrameFormat {
+ kGMPEncodedVideoFrame = 0,
+ kGMPI420VideoFrame = 1
+};
+
+class GMPVideoFrame {
+public:
+ virtual GMPVideoFrameFormat GetFrameFormat() = 0;
+ // MAIN THREAD ONLY IF OWNING PROCESS
+ virtual void Destroy() = 0;
+};
+
+#endif // GMP_VIDEO_FRAME_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-host.h b/dom/media/gmp/gmp-api/gmp-video-host.h
new file mode 100644
index 000000000..cf20e3f46
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-host.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_HOST_h_
+#define GMP_VIDEO_HOST_h_
+
+#include "gmp-errors.h"
+#include "gmp-video-frame-i420.h"
+#include "gmp-video-frame-encoded.h"
+#include "gmp-video-codec.h"
+
+// This interface must be called on the main thread only.
+class GMPVideoHost
+{
+public:
+ // Construct various video API objects. Host does not retain reference,
+ // caller is owner and responsible for deleting.
+ // MAIN THREAD ONLY
+ virtual GMPErr CreateFrame(GMPVideoFrameFormat aFormat, GMPVideoFrame** aFrame) = 0;
+ virtual GMPErr CreatePlane(GMPPlane** aPlane) = 0;
+};
+
+#endif // GMP_VIDEO_HOST_h_
diff --git a/dom/media/gmp/gmp-api/gmp-video-plane.h b/dom/media/gmp/gmp-api/gmp-video-plane.h
new file mode 100644
index 000000000..777cc2495
--- /dev/null
+++ b/dom/media/gmp/gmp-api/gmp-video-plane.h
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+ * Copyright (c) 2014, Mozilla
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ ** Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ ** Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ ** Neither the name of Google nor the names of its contributors may
+ * be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GMP_VIDEO_PLANE_h_
+#define GMP_VIDEO_PLANE_h_
+
+#include "gmp-errors.h"
+#include <stdint.h>
+
+// The implementation backing this interface uses shared memory for the
+// buffer(s). This means it can only be used by the "owning" process.
+// At first the process which created the object owns it. When the object
+// is passed to an interface the creator loses ownership and must Destroy()
+// the object. Further attempts to use it may fail due to not being able to
+// access the underlying buffer(s).
+//
+// Methods that create or destroy shared memory must be called on the main
+// thread. They are marked below.
+class GMPPlane {
+public:
+ // MAIN THREAD ONLY
+ // CreateEmptyPlane - set allocated size, actual plane size and stride:
+ // If current size is smaller than current size, then a buffer of sufficient
+ // size will be allocated.
+ virtual GMPErr CreateEmptyPlane(int32_t aAllocatedSize,
+ int32_t aStride,
+ int32_t aPlaneSize) = 0;
+
+ // MAIN THREAD ONLY
+ // Copy the entire plane data.
+ virtual GMPErr Copy(const GMPPlane& aPlane) = 0;
+
+ // MAIN THREAD ONLY
+ // Copy buffer: If current size is smaller
+ // than current size, then a buffer of sufficient size will be allocated.
+ virtual GMPErr Copy(int32_t aSize, int32_t aStride, const uint8_t* aBuffer) = 0;
+
+ // Swap plane data.
+ virtual void Swap(GMPPlane& aPlane) = 0;
+
+ // Get allocated size.
+ virtual int32_t AllocatedSize() const = 0;
+
+ // Set actual size.
+ virtual void ResetSize() = 0;
+
+ // Return true is plane size is zero, false if not.
+ virtual bool IsZeroSize() const = 0;
+
+ // Get stride value.
+ virtual int32_t Stride() const = 0;
+
+ // Return data pointer.
+ virtual const uint8_t* Buffer() const = 0;
+
+ // Overloading with non-const.
+ virtual uint8_t* Buffer() = 0;
+
+ // MAIN THREAD ONLY IF OWNING PROCESS
+ // Call this when done with the object. This may delete it.
+ virtual void Destroy() = 0;
+};
+
+#endif // GMP_VIDEO_PLANE_h_
diff --git a/dom/media/gmp/moz.build b/dom/media/gmp/moz.build
new file mode 100644
index 000000000..3b67fb5c9
--- /dev/null
+++ b/dom/media/gmp/moz.build
@@ -0,0 +1,156 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+XPIDL_MODULE = 'content_geckomediaplugins'
+
+XPIDL_SOURCES += [
+ 'mozIGeckoMediaPluginChromeService.idl',
+ 'mozIGeckoMediaPluginService.idl',
+]
+
+EXPORTS += [
+ 'gmp-api/gmp-async-shutdown.h',
+ 'gmp-api/gmp-audio-codec.h',
+ 'gmp-api/gmp-audio-decode.h',
+ 'gmp-api/gmp-audio-host.h',
+ 'gmp-api/gmp-audio-samples.h',
+ 'gmp-api/gmp-decryption.h',
+ 'gmp-api/gmp-entrypoints.h',
+ 'gmp-api/gmp-errors.h',
+ 'gmp-api/gmp-platform.h',
+ 'gmp-api/gmp-storage.h',
+ 'gmp-api/gmp-video-codec.h',
+ 'gmp-api/gmp-video-decode.h',
+ 'gmp-api/gmp-video-encode.h',
+ 'gmp-api/gmp-video-frame-encoded.h',
+ 'gmp-api/gmp-video-frame-i420.h',
+ 'gmp-api/gmp-video-frame.h',
+ 'gmp-api/gmp-video-host.h',
+ 'gmp-api/gmp-video-plane.h',
+ 'GMPAudioDecoderChild.h',
+ 'GMPAudioDecoderParent.h',
+ 'GMPAudioDecoderProxy.h',
+ 'GMPAudioHost.h',
+ 'GMPCallbackBase.h',
+ 'GMPCDMCallbackProxy.h',
+ 'GMPCDMProxy.h',
+ 'GMPChild.h',
+ 'GMPContentChild.h',
+ 'GMPContentParent.h',
+ 'GMPCrashHelperHolder.h',
+ 'GMPDecryptorChild.h',
+ 'GMPDecryptorParent.h',
+ 'GMPDecryptorProxy.h',
+ 'GMPEncryptedBufferDataImpl.h',
+ 'GMPLoader.h',
+ 'GMPMessageUtils.h',
+ 'GMPParent.h',
+ 'GMPPlatform.h',
+ 'GMPProcessChild.h',
+ 'GMPProcessParent.h',
+ 'GMPService.h',
+ 'GMPServiceChild.h',
+ 'GMPServiceParent.h',
+ 'GMPSharedMemManager.h',
+ 'GMPStorage.h',
+ 'GMPStorageChild.h',
+ 'GMPStorageParent.h',
+ 'GMPTimerChild.h',
+ 'GMPTimerParent.h',
+ 'GMPUtils.h',
+ 'GMPVideoDecoderChild.h',
+ 'GMPVideoDecoderParent.h',
+ 'GMPVideoDecoderProxy.h',
+ 'GMPVideoEncodedFrameImpl.h',
+ 'GMPVideoEncoderChild.h',
+ 'GMPVideoEncoderParent.h',
+ 'GMPVideoEncoderProxy.h',
+ 'GMPVideoHost.h',
+ 'GMPVideoi420FrameImpl.h',
+ 'GMPVideoPlaneImpl.h',
+]
+
+# We link GMPLoader into xul on B2G/Fennec as its code does not need to be
+# covered by a DRM vendor's voucher.
+if CONFIG['OS_TARGET'] == 'Android':
+ SOURCES += [
+ 'GMPLoader.cpp',
+ ]
+ USE_LIBS += [
+ 'rlz',
+ ]
+
+UNIFIED_SOURCES += [
+ 'GMPAudioDecoderChild.cpp',
+ 'GMPAudioDecoderParent.cpp',
+ 'GMPAudioHost.cpp',
+ 'GMPCDMCallbackProxy.cpp',
+ 'GMPCDMProxy.cpp',
+ 'GMPChild.cpp',
+ 'GMPContentChild.cpp',
+ 'GMPContentParent.cpp',
+ 'GMPDecryptorChild.cpp',
+ 'GMPDecryptorParent.cpp',
+ 'GMPDiskStorage.cpp',
+ 'GMPEncryptedBufferDataImpl.cpp',
+ 'GMPMemoryStorage.cpp',
+ 'GMPParent.cpp',
+ 'GMPPlatform.cpp',
+ 'GMPProcessChild.cpp',
+ 'GMPProcessParent.cpp',
+ 'GMPService.cpp',
+ 'GMPServiceChild.cpp',
+ 'GMPServiceParent.cpp',
+ 'GMPSharedMemManager.cpp',
+ 'GMPStorageChild.cpp',
+ 'GMPStorageParent.cpp',
+ 'GMPTimerChild.cpp',
+ 'GMPTimerParent.cpp',
+ 'GMPUtils.cpp',
+ 'GMPVideoDecoderChild.cpp',
+ 'GMPVideoDecoderParent.cpp',
+ 'GMPVideoEncodedFrameImpl.cpp',
+ 'GMPVideoEncoderChild.cpp',
+ 'GMPVideoEncoderParent.cpp',
+ 'GMPVideoHost.cpp',
+ 'GMPVideoi420FrameImpl.cpp',
+ 'GMPVideoPlaneImpl.cpp',
+]
+
+DIRS += [
+ 'rlz',
+ 'widevine-adapter',
+]
+
+IPDL_SOURCES += [
+ 'GMPTypes.ipdlh',
+ 'PGMP.ipdl',
+ 'PGMPAudioDecoder.ipdl',
+ 'PGMPContent.ipdl',
+ 'PGMPDecryptor.ipdl',
+ 'PGMPService.ipdl',
+ 'PGMPStorage.ipdl',
+ 'PGMPTimer.ipdl',
+ 'PGMPVideoDecoder.ipdl',
+ 'PGMPVideoEncoder.ipdl',
+]
+
+# comment this out to use Unsafe Shmem for more performance
+DEFINES['GMP_SAFE_SHMEM'] = True
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+# media/mtransport so we work with --disable-webrtc
+LOCAL_INCLUDES += [
+ '/media/mtransport',
+ '/xpcom/base',
+ '/xpcom/build',
+ '/xpcom/threads',
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/gmp/mozIGeckoMediaPluginChromeService.idl b/dom/media/gmp/mozIGeckoMediaPluginChromeService.idl
new file mode 100644
index 000000000..9e3286485
--- /dev/null
+++ b/dom/media/gmp/mozIGeckoMediaPluginChromeService.idl
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+#include "nsIFile.idl"
+
+[scriptable, uuid(32d35d21-181f-4630-8caa-a431e2ebad72)]
+interface mozIGeckoMediaPluginChromeService : nsISupports
+{
+ /**
+ * Add a directory to scan for gecko media plugins.
+ * @note Main-thread API.
+ */
+ void addPluginDirectory(in AString directory);
+
+ /**
+ * Remove a directory for gecko media plugins.
+ * @note Main-thread API.
+ */
+ void removePluginDirectory(in AString directory);
+
+ /**
+ * Remove a directory for gecko media plugins and delete it from disk.
+ * If |defer| is true, wait until the plugin is unused before removing.
+ * @note Main-thread API.
+ */
+ void removeAndDeletePluginDirectory(in AString directory,
+ [optional] in bool defer);
+
+ /**
+ * Clears storage data associated with the site and the originAttributes
+ * pattern in JSON format.
+ */
+ void forgetThisSite(in AString site,
+ in DOMString aPattern);
+
+ /**
+ * Returns true if the given node id is allowed to store things
+ * persistently on disk. Private Browsing and local content are not
+ * allowed to store persistent data.
+ */
+ bool isPersistentStorageAllowed(in ACString nodeId);
+
+ /**
+ * Returns the directory to use as the base for storing data about GMPs.
+ */
+ nsIFile getStorageDir();
+
+};
diff --git a/dom/media/gmp/mozIGeckoMediaPluginService.idl b/dom/media/gmp/mozIGeckoMediaPluginService.idl
new file mode 100644
index 000000000..388c58142
--- /dev/null
+++ b/dom/media/gmp/mozIGeckoMediaPluginService.idl
@@ -0,0 +1,169 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+#include "nsIThread.idl"
+
+%{C++
+#include "mozilla/UniquePtr.h"
+#include "nsTArray.h"
+#include "nsStringGlue.h"
+class GMPAudioDecoderProxy;
+class GMPDecryptorProxy;
+class GMPVideoDecoderProxy;
+class GMPVideoEncoderProxy;
+class GMPVideoHost;
+class GMPCrashHelper;
+
+template<class T>
+class GMPGetterCallback
+{
+public:
+ GMPGetterCallback() { MOZ_COUNT_CTOR(GMPGetterCallback<T>); }
+ virtual ~GMPGetterCallback() { MOZ_COUNT_DTOR(GMPGetterCallback<T>); }
+ virtual void Done(T*) = 0;
+};
+template<class T>
+class GMPVideoGetterCallback
+{
+public:
+ GMPVideoGetterCallback() { MOZ_COUNT_CTOR(GMPVideoGetterCallback<T>); }
+ virtual ~GMPVideoGetterCallback() { MOZ_COUNT_DTOR(GMPVideoGetterCallback<T>); }
+ virtual void Done(T*, GMPVideoHost*) = 0;
+};
+typedef GMPGetterCallback<GMPDecryptorProxy> GetGMPDecryptorCallback;
+typedef GMPGetterCallback<GMPAudioDecoderProxy> GetGMPAudioDecoderCallback;
+typedef GMPVideoGetterCallback<GMPVideoDecoderProxy> GetGMPVideoDecoderCallback;
+typedef GMPVideoGetterCallback<GMPVideoEncoderProxy> GetGMPVideoEncoderCallback;
+class GetNodeIdCallback
+{
+public:
+ GetNodeIdCallback() { MOZ_COUNT_CTOR(GetNodeIdCallback); }
+ virtual ~GetNodeIdCallback() { MOZ_COUNT_DTOR(GetNodeIdCallback); }
+ virtual void Done(nsresult aResult, const nsACString& aNodeId) = 0;
+};
+%}
+
+[ptr] native TagArray(nsTArray<nsCString>);
+native GetGMPDecryptorCallback(mozilla::UniquePtr<GetGMPDecryptorCallback>&&);
+native GetGMPAudioDecoderCallback(mozilla::UniquePtr<GetGMPAudioDecoderCallback>&&);
+native GetGMPVideoDecoderCallback(mozilla::UniquePtr<GetGMPVideoDecoderCallback>&&);
+native GetGMPVideoEncoderCallback(mozilla::UniquePtr<GetGMPVideoEncoderCallback>&&);
+native GetNodeIdCallback(mozilla::UniquePtr<GetNodeIdCallback>&&);
+native GMPCrashHelperPtr(GMPCrashHelper*);
+
+[scriptable, uuid(44d362ae-937a-4803-bee6-f2512a0149d1)]
+interface mozIGeckoMediaPluginService : nsISupports
+{
+
+ /**
+ * The GMP thread. Callable from any thread.
+ */
+ readonly attribute nsIThread thread;
+
+ /**
+ * Run through windows registered registered for pluginId, sending
+ * 'PluginCrashed' chrome-only event
+ */
+ void RunPluginCrashCallbacks(in unsigned long pluginId, in ACString pluginName);
+
+ /**
+ * Get a plugin that supports the specified tags.
+ * Callable on any thread
+ */
+ [noscript]
+ boolean hasPluginForAPI(in ACString api, in TagArray tags);
+
+ /**
+ * Get a video decoder that supports the specified tags.
+ * The array of tags should at least contain a codec tag, and optionally
+ * other tags such as for EME keysystem.
+ * Callable only on GMP thread.
+ * This is an asynchronous operation, the Done method of the callback object
+ * will be called on the GMP thread with the result (which might be null in
+ * the case of failure). This method always takes ownership of the callback
+ * object, but if this method returns an error then the Done method of the
+ * callback object will not be called at all.
+ */
+ [noscript]
+ void getGMPVideoDecoder(in GMPCrashHelperPtr helper,
+ in TagArray tags,
+ [optional] in ACString nodeId,
+ in GetGMPVideoDecoderCallback callback);
+
+ /**
+ * Gets a video decoder as per getGMPVideoDecoder, except it is linked to
+ * with a corresponding GMPDecryptor via the decryptor's ID.
+ * This is a temporary measure, until we can implement a Chromium CDM
+ * GMP protocol which does both decryption and decoding.
+ */
+ [noscript]
+ void getDecryptingGMPVideoDecoder(in GMPCrashHelperPtr helper,
+ in TagArray tags,
+ in ACString nodeId,
+ in GetGMPVideoDecoderCallback callback,
+ in uint32_t decryptorId);
+
+ /**
+ * Get a video encoder that supports the specified tags.
+ * The array of tags should at least contain a codec tag, and optionally
+ * other tags.
+ * Callable only on GMP thread.
+ * This is an asynchronous operation, the Done method of the callback object
+ * will be called on the GMP thread with the result (which might be null in
+ * the case of failure). This method always takes ownership of the callback
+ * object, but if this method returns an error then the Done method of the
+ * callback object will not be called at all.
+ */
+ [noscript]
+ void getGMPVideoEncoder(in GMPCrashHelperPtr helper,
+ in TagArray tags,
+ [optional] in ACString nodeId,
+ in GetGMPVideoEncoderCallback callback);
+
+ /**
+ * Returns an audio decoder that supports the specified tags.
+ * The array of tags should at least contain a codec tag, and optionally
+ * other tags such as for EME keysystem.
+ * Callable only on GMP thread.
+ * This is an asynchronous operation, the Done method of the callback object
+ * will be called on the GMP thread with the result (which might be null in
+ * the case of failure). This method always takes ownership of the callback
+ * object, but if this method returns an error then the Done method of the
+ * callback object will not be called at all.
+ */
+ [noscript]
+ void getGMPAudioDecoder(in GMPCrashHelperPtr helper,
+ in TagArray tags,
+ [optional] in ACString nodeId,
+ in GetGMPAudioDecoderCallback callback);
+
+ /**
+ * Returns a decryption session manager that supports the specified tags.
+ * The array of tags should at least contain a key system tag, and optionally
+ * other tags.
+ * Callable only on GMP thread.
+ * This is an asynchronous operation, the Done method of the callback object
+ * will be called on the GMP thread with the result (which might be null in
+ * the case of failure). This method always takes ownership of the callback
+ * object, but if this method returns an error then the Done method of the
+ * callback object will not be called at all.
+ */
+ [noscript]
+ void getGMPDecryptor(in GMPCrashHelperPtr helper,
+ in TagArray tags,
+ in ACString nodeId,
+ in GetGMPDecryptorCallback callback);
+
+ /**
+ * Gets the NodeId for a (origin, urlbarOrigin, isInprivateBrowsing) tuple.
+ */
+ [noscript]
+ void getNodeId(in AString origin,
+ in AString topLevelOrigin,
+ in AString gmpName,
+ in bool inPrivateBrowsingMode,
+ in GetNodeIdCallback callback);
+};
diff --git a/dom/media/gmp/rlz/COPYING b/dom/media/gmp/rlz/COPYING
new file mode 100644
index 000000000..b89042ace
--- /dev/null
+++ b/dom/media/gmp/rlz/COPYING
@@ -0,0 +1,14 @@
+Copyright 2010 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
diff --git a/dom/media/gmp/rlz/GMPDeviceBinding.cpp b/dom/media/gmp/rlz/GMPDeviceBinding.cpp
new file mode 100644
index 000000000..c8aee2bcd
--- /dev/null
+++ b/dom/media/gmp/rlz/GMPDeviceBinding.cpp
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this file,
+* You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPDeviceBinding.h"
+#include "mozilla/Attributes.h"
+#include "prenv.h"
+
+#include <string>
+
+#ifdef XP_WIN
+#include "windows.h"
+#ifdef MOZ_SANDBOX
+#include <intrin.h>
+#include <assert.h>
+#endif
+#endif
+
+#if defined(HASH_NODE_ID_WITH_DEVICE_ID)
+
+// In order to provide EME plugins with a "device binding" capability,
+// in the parent we generate and store some random bytes as salt for every
+// (origin, urlBarOrigin) pair that uses EME. We store these bytes so
+// that every time we revisit the same origin we get the same salt.
+// We send this salt to the child on startup. The child collects some
+// device specific data and munges that with the salt to create the
+// "node id" that we expose to EME plugins. It then overwrites the device
+// specific data, and activates the sandbox.
+
+#include "rlz/lib/machine_id.h"
+#include "rlz/lib/string_utils.h"
+#include "sha256.h"
+
+#ifdef XP_WIN
+#include "windows.h"
+#ifdef MOZ_SANDBOX
+#include <intrin.h>
+#include <assert.h>
+#endif
+#endif
+
+#ifdef XP_MACOSX
+#include <assert.h>
+#ifdef HASH_NODE_ID_WITH_DEVICE_ID
+#include <unistd.h>
+#include <mach/mach.h>
+#include <mach/mach_vm.h>
+#endif
+#endif
+
+#endif // HASH_NODE_ID_WITH_DEVICE_ID
+
+namespace mozilla {
+namespace gmp {
+
+#if defined(XP_WIN) && defined(HASH_NODE_ID_WITH_DEVICE_ID)
+MOZ_NEVER_INLINE
+static bool
+GetStackAfterCurrentFrame(uint8_t** aOutTop, uint8_t** aOutBottom)
+{
+ // "Top" of the free space on the stack is directly after the memory
+ // holding our return address.
+ uint8_t* top = (uint8_t*)_AddressOfReturnAddress();
+
+ // Look down the stack until we find the guard page...
+ MEMORY_BASIC_INFORMATION memInfo = {0};
+ uint8_t* bottom = top;
+ while (1) {
+ if (!VirtualQuery(bottom, &memInfo, sizeof(memInfo))) {
+ return false;
+ }
+ if ((memInfo.Protect & PAGE_GUARD) == PAGE_GUARD) {
+ bottom = (uint8_t*)memInfo.BaseAddress + memInfo.RegionSize;
+#ifdef DEBUG
+ if (!VirtualQuery(bottom, &memInfo, sizeof(memInfo))) {
+ return false;
+ }
+ assert(!(memInfo.Protect & PAGE_GUARD)); // Should have found boundary.
+#endif
+ break;
+ } else if (memInfo.State != MEM_COMMIT ||
+ (memInfo.AllocationProtect & PAGE_READWRITE) != PAGE_READWRITE) {
+ return false;
+ }
+ bottom = (uint8_t*)memInfo.BaseAddress - 1;
+ }
+ *aOutTop = top;
+ *aOutBottom = bottom;
+ return true;
+}
+#endif
+
+#if defined(XP_MACOSX) && defined(HASH_NODE_ID_WITH_DEVICE_ID)
+static mach_vm_address_t
+RegionContainingAddress(mach_vm_address_t aAddress)
+{
+ mach_port_t task;
+ kern_return_t kr = task_for_pid(mach_task_self(), getpid(), &task);
+ if (kr != KERN_SUCCESS) {
+ return 0;
+ }
+
+ mach_vm_address_t address = aAddress;
+ mach_vm_size_t size;
+ vm_region_basic_info_data_64_t info;
+ mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;
+ mach_port_t object_name;
+ kr = mach_vm_region(task, &address, &size, VM_REGION_BASIC_INFO_64,
+ reinterpret_cast<vm_region_info_t>(&info), &count,
+ &object_name);
+ if (kr != KERN_SUCCESS || size == 0
+ || address > aAddress || address + size <= aAddress) {
+ // mach_vm_region failed, or couldn't find region at given address.
+ return 0;
+ }
+
+ return address;
+}
+
+MOZ_NEVER_INLINE
+static bool
+GetStackAfterCurrentFrame(uint8_t** aOutTop, uint8_t** aOutBottom)
+{
+ mach_vm_address_t stackFrame =
+ reinterpret_cast<mach_vm_address_t>(__builtin_frame_address(0));
+ *aOutTop = reinterpret_cast<uint8_t*>(stackFrame);
+ // Kernel code shows that stack is always a single region.
+ *aOutBottom = reinterpret_cast<uint8_t*>(RegionContainingAddress(stackFrame));
+ return *aOutBottom && (*aOutBottom < *aOutTop);
+}
+#endif
+
+#ifdef HASH_NODE_ID_WITH_DEVICE_ID
+static void SecureMemset(void* start, uint8_t value, size_t size)
+{
+ // Inline instructions equivalent to RtlSecureZeroMemory().
+ for (size_t i = 0; i < size; ++i) {
+ volatile uint8_t* p = static_cast<volatile uint8_t*>(start) + i;
+ *p = value;
+ }
+}
+#endif
+
+bool
+CalculateGMPDeviceId(char* aOriginSalt,
+ uint32_t aOriginSaltLen,
+ std::string& aOutNodeId)
+{
+#ifdef HASH_NODE_ID_WITH_DEVICE_ID
+ if (aOriginSaltLen > 0) {
+ std::vector<uint8_t> deviceId;
+ int volumeId;
+ if (!rlz_lib::GetRawMachineId(&deviceId, &volumeId)) {
+ return false;
+ }
+
+ SHA256Context ctx;
+ SHA256_Begin(&ctx);
+ SHA256_Update(&ctx, (const uint8_t*)aOriginSalt, aOriginSaltLen);
+ SHA256_Update(&ctx, deviceId.data(), deviceId.size());
+ SHA256_Update(&ctx, (const uint8_t*)&volumeId, sizeof(int));
+ uint8_t digest[SHA256_LENGTH] = {0};
+ unsigned int digestLen = 0;
+ SHA256_End(&ctx, digest, &digestLen, SHA256_LENGTH);
+
+ // Overwrite all data involved in calculation as it could potentially
+ // identify the user, so there's no chance a GMP can read it and use
+ // it for identity tracking.
+ SecureMemset(&ctx, 0, sizeof(ctx));
+ SecureMemset(aOriginSalt, 0, aOriginSaltLen);
+ SecureMemset(&volumeId, 0, sizeof(volumeId));
+ SecureMemset(deviceId.data(), '*', deviceId.size());
+ deviceId.clear();
+
+ if (!rlz_lib::BytesToString(digest, SHA256_LENGTH, &aOutNodeId)) {
+ return false;
+ }
+
+ if (!PR_GetEnv("MOZ_GMP_DISABLE_NODE_ID_CLEANUP")) {
+ // We've successfully bound the origin salt to node id.
+ // rlz_lib::GetRawMachineId and/or the system functions it
+ // called could have left user identifiable data on the stack,
+ // so carefully zero the stack down to the guard page.
+ uint8_t* top;
+ uint8_t* bottom;
+ if (!GetStackAfterCurrentFrame(&top, &bottom)) {
+ return false;
+ }
+ assert(top >= bottom);
+ // Inline instructions equivalent to RtlSecureZeroMemory().
+ // We can't just use RtlSecureZeroMemory here directly, as in debug
+ // builds, RtlSecureZeroMemory() can't be inlined, and the stack
+ // memory it uses would get wiped by itself running, causing crashes.
+ for (volatile uint8_t* p = (volatile uint8_t*)bottom; p < top; p++) {
+ *p = 0;
+ }
+ }
+ } else
+#endif
+ {
+ aOutNodeId = std::string(aOriginSalt, aOriginSalt + aOriginSaltLen);
+ }
+ return true;
+}
+
+} // namespace gmp
+} // namespace mozilla
diff --git a/dom/media/gmp/rlz/GMPDeviceBinding.h b/dom/media/gmp/rlz/GMPDeviceBinding.h
new file mode 100644
index 000000000..835704054
--- /dev/null
+++ b/dom/media/gmp/rlz/GMPDeviceBinding.h
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this file,
+* You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GMP_DEVICE_BINDING_h_
+#define GMP_DEVICE_BINDING_h_
+
+#include <string>
+
+namespace mozilla {
+namespace gmp {
+
+bool CalculateGMPDeviceId(char* aOriginSalt,
+ uint32_t aOriginSaltLen,
+ std::string& aOutNodeId);
+
+} // namespace gmp
+} // namespace mozilla
+
+#endif // GMP_DEVICE_BINDING_h_
diff --git a/dom/media/gmp/rlz/README.mozilla b/dom/media/gmp/rlz/README.mozilla
new file mode 100644
index 000000000..fffc5deb5
--- /dev/null
+++ b/dom/media/gmp/rlz/README.mozilla
@@ -0,0 +1,6 @@
+Code taken from rlz project: https://code.google.com/p/rlz/
+
+Revision: 134, then with unused code stripped out.
+
+Note: base/ contains wrappers/dummies to provide implementations of the
+Chromium APIs that this code relies upon.
diff --git a/dom/media/gmp/rlz/lib/assert.h b/dom/media/gmp/rlz/lib/assert.h
new file mode 100644
index 000000000..68737b1e2
--- /dev/null
+++ b/dom/media/gmp/rlz/lib/assert.h
@@ -0,0 +1,14 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FAKE_ASSERT_H_
+#define FAKE_ASSERT_H_
+
+#include <assert.h>
+
+#define ASSERT_STRING(x) { assert(false); }
+#define VERIFY(x) { assert(x); };
+
+#endif
diff --git a/dom/media/gmp/rlz/lib/machine_id.h b/dom/media/gmp/rlz/lib/machine_id.h
new file mode 100644
index 000000000..67661cfce
--- /dev/null
+++ b/dom/media/gmp/rlz/lib/machine_id.h
@@ -0,0 +1,19 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+// Use of this source code is governed by an Apache-style license that can be
+// found in the COPYING file.
+
+#ifndef RLZ_LIB_MACHINE_ID_H_
+#define RLZ_LIB_MACHINE_ID_H_
+
+#include <vector>
+
+namespace rlz_lib {
+
+// Retrieves a raw machine identifier string and a machine-specific
+// 4 byte value. GetMachineId() will SHA1 |data|, append |more_data|, compute
+// the Crc8 of that, and return a hex-encoded string of that data.
+bool GetRawMachineId(std::vector<uint8_t>* data, int* more_data);
+
+} // namespace rlz_lib
+
+#endif // RLZ_LIB_MACHINE_ID_H_
diff --git a/dom/media/gmp/rlz/lib/string_utils.cc b/dom/media/gmp/rlz/lib/string_utils.cc
new file mode 100644
index 000000000..b6a71acdb
--- /dev/null
+++ b/dom/media/gmp/rlz/lib/string_utils.cc
@@ -0,0 +1,34 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+// Use of this source code is governed by an Apache-style license that can be
+// found in the COPYING file.
+//
+// String manipulation functions used in the RLZ library.
+
+#include "rlz/lib/string_utils.h"
+
+namespace rlz_lib {
+
+bool BytesToString(const unsigned char* data,
+ int data_len,
+ std::string* string) {
+ if (!string)
+ return false;
+
+ string->clear();
+ if (data_len < 1 || !data)
+ return false;
+
+ static const char kHex[] = "0123456789ABCDEF";
+
+ // Fix the buffer size to begin with to avoid repeated re-allocation.
+ string->resize(data_len * 2);
+ int index = data_len;
+ while (index--) {
+ string->at(2 * index) = kHex[data[index] >> 4]; // high digit
+ string->at(2 * index + 1) = kHex[data[index] & 0x0F]; // low digit
+ }
+
+ return true;
+}
+
+} // namespace rlz_lib
diff --git a/dom/media/gmp/rlz/lib/string_utils.h b/dom/media/gmp/rlz/lib/string_utils.h
new file mode 100644
index 000000000..294f1b2d9
--- /dev/null
+++ b/dom/media/gmp/rlz/lib/string_utils.h
@@ -0,0 +1,20 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+// Use of this source code is governed by an Apache-style license that can be
+// found in the COPYING file.
+//
+// String manipulation functions used in the RLZ library.
+
+#ifndef RLZ_LIB_STRING_UTILS_H_
+#define RLZ_LIB_STRING_UTILS_H_
+
+#include <string>
+
+namespace rlz_lib {
+
+bool BytesToString(const unsigned char* data,
+ int data_len,
+ std::string* string);
+
+}; // namespace
+
+#endif // RLZ_LIB_STRING_UTILS_H_
diff --git a/dom/media/gmp/rlz/mac/lib/machine_id_mac.cc b/dom/media/gmp/rlz/mac/lib/machine_id_mac.cc
new file mode 100644
index 000000000..2bea0f55f
--- /dev/null
+++ b/dom/media/gmp/rlz/mac/lib/machine_id_mac.cc
@@ -0,0 +1,320 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <IOKit/IOKitLib.h>
+#include <IOKit/network/IOEthernetController.h>
+#include <IOKit/network/IOEthernetInterface.h>
+#include <IOKit/network/IONetworkInterface.h>
+#include <vector>
+#include <string>
+
+// Note: The original machine_id_mac.cc code is in namespace rlz_lib below.
+// It depends on some external files, which would bring in a log of Chromium
+// code if imported as well.
+// Instead only the necessary code has been extracted from the relevant files,
+// and further combined and reduced to limit the maintenance burden.
+
+// [Extracted from base/logging.h]
+#define DCHECK assert
+
+namespace base {
+
+// [Extracted from base/mac/scoped_typeref.h and base/mac/scoped_cftyperef.h]
+template<typename T>
+class ScopedCFTypeRef {
+ public:
+ typedef T element_type;
+
+ explicit ScopedCFTypeRef(T object)
+ : object_(object) {
+ }
+
+ ScopedCFTypeRef(const ScopedCFTypeRef<T>& that) = delete;
+ ScopedCFTypeRef(ScopedCFTypeRef<T>&& that) = delete;
+
+ ~ScopedCFTypeRef() {
+ if (object_)
+ CFRelease(object_);
+ }
+
+ ScopedCFTypeRef& operator=(const ScopedCFTypeRef<T>& that) = delete;
+ ScopedCFTypeRef& operator=(ScopedCFTypeRef<T>&& that) = delete;
+
+ operator T() const {
+ return object_;
+ }
+
+ // ScopedCFTypeRef<>::release() is like scoped_ptr<>::release. It is NOT
+ // a wrapper for CFRelease().
+ T release() {
+ T temp = object_;
+ object_ = NULL;
+ return temp;
+ }
+
+ private:
+ T object_;
+};
+
+namespace mac {
+
+// [Extracted from base/mac/scoped_ioobject.h]
+// Just like ScopedCFTypeRef but for io_object_t and subclasses.
+template<typename IOT>
+class ScopedIOObject {
+ public:
+ typedef IOT element_type;
+
+ explicit ScopedIOObject(IOT object = IO_OBJECT_NULL)
+ : object_(object) {
+ }
+
+ ~ScopedIOObject() {
+ if (object_)
+ IOObjectRelease(object_);
+ }
+
+ ScopedIOObject(const ScopedIOObject&) = delete;
+ void operator=(const ScopedIOObject&) = delete;
+
+ void reset(IOT object = IO_OBJECT_NULL) {
+ if (object_)
+ IOObjectRelease(object_);
+ object_ = object;
+ }
+
+ operator IOT() const {
+ return object_;
+ }
+
+ private:
+ IOT object_;
+};
+
+// [Extracted from base/mac/foundation_util.h]
+template<typename T>
+T CFCast(const CFTypeRef& cf_val);
+
+template<>
+CFDataRef
+CFCast<CFDataRef>(const CFTypeRef& cf_val) {
+ if (cf_val == NULL) {
+ return NULL;
+ }
+ if (CFGetTypeID(cf_val) == CFDataGetTypeID()) {
+ return (CFDataRef)(cf_val);
+ }
+ return NULL;
+}
+
+template<>
+CFStringRef
+CFCast<CFStringRef>(const CFTypeRef& cf_val) {
+ if (cf_val == NULL) {
+ return NULL;
+ }
+ if (CFGetTypeID(cf_val) == CFStringGetTypeID()) {
+ return (CFStringRef)(cf_val);
+ }
+ return NULL;
+}
+
+} // namespace mac
+
+// [Extracted from base/strings/sys_string_conversions_mac.mm]
+static const CFStringEncoding kNarrowStringEncoding = kCFStringEncodingUTF8;
+
+template<typename StringType>
+static StringType CFStringToSTLStringWithEncodingT(CFStringRef cfstring,
+ CFStringEncoding encoding) {
+ CFIndex length = CFStringGetLength(cfstring);
+ if (length == 0)
+ return StringType();
+
+ CFRange whole_string = CFRangeMake(0, length);
+ CFIndex out_size;
+ CFIndex converted = CFStringGetBytes(cfstring,
+ whole_string,
+ encoding,
+ 0, // lossByte
+ false, // isExternalRepresentation
+ NULL, // buffer
+ 0, // maxBufLen
+ &out_size);
+ if (converted == 0 || out_size == 0)
+ return StringType();
+
+ // out_size is the number of UInt8-sized units needed in the destination.
+ // A buffer allocated as UInt8 units might not be properly aligned to
+ // contain elements of StringType::value_type. Use a container for the
+ // proper value_type, and convert out_size by figuring the number of
+ // value_type elements per UInt8. Leave room for a NUL terminator.
+ typename StringType::size_type elements =
+ out_size * sizeof(UInt8) / sizeof(typename StringType::value_type) + 1;
+
+ std::vector<typename StringType::value_type> out_buffer(elements);
+ converted = CFStringGetBytes(cfstring,
+ whole_string,
+ encoding,
+ 0, // lossByte
+ false, // isExternalRepresentation
+ reinterpret_cast<UInt8*>(&out_buffer[0]),
+ out_size,
+ NULL); // usedBufLen
+ if (converted == 0)
+ return StringType();
+
+ out_buffer[elements - 1] = '\0';
+ return StringType(&out_buffer[0], elements - 1);
+}
+
+std::string SysCFStringRefToUTF8(CFStringRef ref)
+{
+ return CFStringToSTLStringWithEncodingT<std::string>(ref,
+ kNarrowStringEncoding);
+}
+
+} // namespace base
+
+
+namespace rlz_lib {
+
+namespace {
+
+// See http://developer.apple.com/library/mac/#technotes/tn1103/_index.html
+
+// The caller is responsible for freeing |matching_services|.
+bool FindEthernetInterfaces(io_iterator_t* matching_services) {
+ base::ScopedCFTypeRef<CFMutableDictionaryRef> matching_dict(
+ IOServiceMatching(kIOEthernetInterfaceClass));
+ if (!matching_dict)
+ return false;
+
+ base::ScopedCFTypeRef<CFMutableDictionaryRef> primary_interface(
+ CFDictionaryCreateMutable(kCFAllocatorDefault,
+ 0,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks));
+ if (!primary_interface)
+ return false;
+
+ CFDictionarySetValue(
+ primary_interface, CFSTR(kIOPrimaryInterface), kCFBooleanTrue);
+ CFDictionarySetValue(
+ matching_dict, CFSTR(kIOPropertyMatchKey), primary_interface);
+
+ kern_return_t kern_result = IOServiceGetMatchingServices(
+ kIOMasterPortDefault, matching_dict.release(), matching_services);
+
+ return kern_result == KERN_SUCCESS;
+}
+
+bool GetMACAddressFromIterator(io_iterator_t primary_interface_iterator,
+ uint8_t* buffer, size_t buffer_size) {
+ if (buffer_size < kIOEthernetAddressSize)
+ return false;
+
+ bool success = false;
+
+ bzero(buffer, buffer_size);
+ base::mac::ScopedIOObject<io_object_t> primary_interface;
+ while (primary_interface.reset(IOIteratorNext(primary_interface_iterator)),
+ primary_interface) {
+ io_object_t primary_interface_parent;
+ kern_return_t kern_result = IORegistryEntryGetParentEntry(
+ primary_interface, kIOServicePlane, &primary_interface_parent);
+ base::mac::ScopedIOObject<io_object_t> primary_interface_parent_deleter(
+ primary_interface_parent);
+ success = kern_result == KERN_SUCCESS;
+
+ if (!success)
+ continue;
+
+ base::ScopedCFTypeRef<CFTypeRef> mac_data(
+ IORegistryEntryCreateCFProperty(primary_interface_parent,
+ CFSTR(kIOMACAddress),
+ kCFAllocatorDefault,
+ 0));
+ CFDataRef mac_data_data = base::mac::CFCast<CFDataRef>(mac_data);
+ if (mac_data_data) {
+ CFDataGetBytes(
+ mac_data_data, CFRangeMake(0, kIOEthernetAddressSize), buffer);
+ }
+ }
+
+ return success;
+}
+
+bool GetMacAddress(unsigned char* buffer, size_t size) {
+ io_iterator_t primary_interface_iterator;
+ if (!FindEthernetInterfaces(&primary_interface_iterator))
+ return false;
+ bool result = GetMACAddressFromIterator(
+ primary_interface_iterator, buffer, size);
+ IOObjectRelease(primary_interface_iterator);
+ return result;
+}
+
+CFStringRef CopySerialNumber() {
+ base::mac::ScopedIOObject<io_service_t> expert_device(
+ IOServiceGetMatchingService(kIOMasterPortDefault,
+ IOServiceMatching("IOPlatformExpertDevice")));
+ if (!expert_device)
+ return NULL;
+
+ base::ScopedCFTypeRef<CFTypeRef> serial_number(
+ IORegistryEntryCreateCFProperty(expert_device,
+ CFSTR(kIOPlatformSerialNumberKey),
+ kCFAllocatorDefault,
+ 0));
+ CFStringRef serial_number_cfstring =
+ base::mac::CFCast<CFStringRef>(serial_number.release());
+ if (!serial_number_cfstring)
+ return NULL;
+
+ return serial_number_cfstring;
+}
+
+} // namespace
+
+bool GetRawMachineId(std::vector<uint8_t>* data, int* more_data) {
+ uint8_t mac_address[kIOEthernetAddressSize];
+
+ std::string id;
+ if (GetMacAddress(mac_address, sizeof(mac_address))) {
+ id += "mac:";
+ static const char hex[] =
+ { '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+ for (int i = 0; i < kIOEthernetAddressSize; ++i) {
+ uint8_t byte = mac_address[i];
+ id += hex[byte >> 4];
+ id += hex[byte & 0xF];
+ }
+ }
+
+ // A MAC address is enough to uniquely identify a machine, but it's only 6
+ // bytes, 3 of which are manufacturer-determined. To make brute-forcing the
+ // SHA1 of this harder, also append the system's serial number.
+ CFStringRef serial = CopySerialNumber();
+ if (serial) {
+ if (!id.empty()) {
+ id += ' ';
+ }
+ id += "serial:";
+ id += base::SysCFStringRefToUTF8(serial);
+ CFRelease(serial);
+ }
+
+ // Get the contents of the string 'id' as a bunch of bytes.
+ data->assign(&id[0], &id[id.size()]);
+
+ // On windows, this is set to the volume id. Since it's not scrambled before
+ // being sent, just set it to 1.
+ *more_data = 1;
+ return true;
+}
+
+} // namespace rlz_lib
diff --git a/dom/media/gmp/rlz/moz.build b/dom/media/gmp/rlz/moz.build
new file mode 100644
index 000000000..f366c2b5d
--- /dev/null
+++ b/dom/media/gmp/rlz/moz.build
@@ -0,0 +1,42 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Note: build rlz in its own moz.build, so it doesn't pickup any of
+# Chromium IPC's headers used in the moz.build of the parent file.
+
+Library('rlz')
+
+UNIFIED_SOURCES += [
+ 'GMPDeviceBinding.cpp',
+]
+
+if CONFIG['MOZ_SANDBOX'] and CONFIG['OS_TARGET'] in ['WINNT', 'Darwin']:
+ DEFINES['HASH_NODE_ID_WITH_DEVICE_ID'] = 1;
+ UNIFIED_SOURCES += [
+ 'lib/string_utils.cc',
+ 'sha256.c',
+ ]
+
+if CONFIG['OS_TARGET'] == 'WINNT':
+ UNIFIED_SOURCES += [
+ 'win/lib/machine_id_win.cc',
+ ]
+
+if CONFIG['OS_TARGET'] == 'Darwin':
+ UNIFIED_SOURCES += [
+ 'mac/lib/machine_id_mac.cc',
+ ]
+ OS_LIBS += [
+ '-framework IOKit',
+ ]
+
+LOCAL_INCLUDES += [
+ '..',
+]
+
+EXPORTS += [
+ 'GMPDeviceBinding.h',
+]
diff --git a/dom/media/gmp/rlz/sha256.c b/dom/media/gmp/rlz/sha256.c
new file mode 100644
index 000000000..072de5195
--- /dev/null
+++ b/dom/media/gmp/rlz/sha256.c
@@ -0,0 +1,469 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Stripped down version of security/nss/lib/freebl/sha512.c
+// and related headers.
+
+#include "sha256.h"
+#include "string.h"
+#include "prcpucfg.h"
+#if defined(NSS_X86) || defined(SHA_NO_LONG_LONG)
+#define NOUNROLL512 1
+#undef HAVE_LONG_LONG
+#endif
+
+#define SHA256_BLOCK_LENGTH 64 /* bytes */
+
+typedef enum _SECStatus {
+ SECWouldBlock = -2,
+ SECFailure = -1,
+ SECSuccess = 0
+} SECStatus;
+
+/* ============= Common constants and defines ======================= */
+
+#define W ctx->u.w
+#define B ctx->u.b
+#define H ctx->h
+
+#define SHR(x,n) (x >> n)
+#define SHL(x,n) (x << n)
+#define Ch(x,y,z) ((x & y) ^ (~x & z))
+#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
+#define SHA_MIN(a,b) (a < b ? a : b)
+
+/* Padding used with all flavors of SHA */
+static const PRUint8 pad[240] = {
+0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ /* compiler will fill the rest in with zeros */
+};
+
+/* ============= SHA256 implementation ================================== */
+
+/* SHA-256 constants, K256. */
+static const PRUint32 K256[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+/* SHA-256 initial hash values */
+static const PRUint32 H256[8] = {
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
+ 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
+};
+
+#if defined(_MSC_VER)
+#include <stdlib.h>
+#pragma intrinsic(_byteswap_ulong)
+#define SHA_HTONL(x) _byteswap_ulong(x)
+#define BYTESWAP4(x) x = SHA_HTONL(x)
+#elif defined(__GNUC__) && defined(NSS_X86_OR_X64)
+static __inline__ PRUint32 swap4b(PRUint32 value)
+{
+ __asm__("bswap %0" : "+r" (value));
+ return (value);
+}
+#define SHA_HTONL(x) swap4b(x)
+#define BYTESWAP4(x) x = SHA_HTONL(x)
+
+#elif defined(__GNUC__) && (defined(__thumb2__) || \
+ (!defined(__thumb__) && \
+ (defined(__ARM_ARCH_6__) || \
+ defined(__ARM_ARCH_6J__) || \
+ defined(__ARM_ARCH_6K__) || \
+ defined(__ARM_ARCH_6Z__) || \
+ defined(__ARM_ARCH_6ZK__) || \
+ defined(__ARM_ARCH_6T2__) || \
+ defined(__ARM_ARCH_7__) || \
+ defined(__ARM_ARCH_7A__) || \
+ defined(__ARM_ARCH_7R__))))
+static __inline__ PRUint32 swap4b(PRUint32 value)
+{
+ PRUint32 ret;
+ __asm__("rev %0, %1" : "=r" (ret) : "r"(value));
+ return ret;
+}
+#define SHA_HTONL(x) swap4b(x)
+#define BYTESWAP4(x) x = SHA_HTONL(x)
+
+#else
+#define SWAP4MASK 0x00FF00FF
+#define SHA_HTONL(x) (t1 = (x), t1 = (t1 << 16) | (t1 >> 16), \
+ ((t1 & SWAP4MASK) << 8) | ((t1 >> 8) & SWAP4MASK))
+#define BYTESWAP4(x) x = SHA_HTONL(x)
+#endif
+
+#if defined(_MSC_VER)
+#pragma intrinsic (_lrotr, _lrotl)
+#define ROTR32(x,n) _lrotr(x,n)
+#define ROTL32(x,n) _lrotl(x,n)
+#else
+#define ROTR32(x,n) ((x >> n) | (x << ((8 * sizeof x) - n)))
+#define ROTL32(x,n) ((x << n) | (x >> ((8 * sizeof x) - n)))
+#endif
+
+/* Capitol Sigma and lower case sigma functions */
+#define S0(x) (ROTR32(x, 2) ^ ROTR32(x,13) ^ ROTR32(x,22))
+#define S1(x) (ROTR32(x, 6) ^ ROTR32(x,11) ^ ROTR32(x,25))
+#define s0(x) (t1 = x, ROTR32(t1, 7) ^ ROTR32(t1,18) ^ SHR(t1, 3))
+#define s1(x) (t2 = x, ROTR32(t2,17) ^ ROTR32(t2,19) ^ SHR(t2,10))
+
+void
+SHA256_Begin(SHA256Context *ctx)
+{
+ memset(ctx, 0, sizeof *ctx);
+ memcpy(H, H256, sizeof H256);
+}
+
+static void
+SHA256_Compress(SHA256Context *ctx)
+{
+ {
+ register PRUint32 t1, t2;
+
+#if defined(IS_LITTLE_ENDIAN)
+ BYTESWAP4(W[0]);
+ BYTESWAP4(W[1]);
+ BYTESWAP4(W[2]);
+ BYTESWAP4(W[3]);
+ BYTESWAP4(W[4]);
+ BYTESWAP4(W[5]);
+ BYTESWAP4(W[6]);
+ BYTESWAP4(W[7]);
+ BYTESWAP4(W[8]);
+ BYTESWAP4(W[9]);
+ BYTESWAP4(W[10]);
+ BYTESWAP4(W[11]);
+ BYTESWAP4(W[12]);
+ BYTESWAP4(W[13]);
+ BYTESWAP4(W[14]);
+ BYTESWAP4(W[15]);
+#endif
+
+#define INITW(t) W[t] = (s1(W[t-2]) + W[t-7] + s0(W[t-15]) + W[t-16])
+
+ /* prepare the "message schedule" */
+#ifdef NOUNROLL256
+ {
+ int t;
+ for (t = 16; t < 64; ++t) {
+ INITW(t);
+ }
+ }
+#else
+ INITW(16);
+ INITW(17);
+ INITW(18);
+ INITW(19);
+
+ INITW(20);
+ INITW(21);
+ INITW(22);
+ INITW(23);
+ INITW(24);
+ INITW(25);
+ INITW(26);
+ INITW(27);
+ INITW(28);
+ INITW(29);
+
+ INITW(30);
+ INITW(31);
+ INITW(32);
+ INITW(33);
+ INITW(34);
+ INITW(35);
+ INITW(36);
+ INITW(37);
+ INITW(38);
+ INITW(39);
+
+ INITW(40);
+ INITW(41);
+ INITW(42);
+ INITW(43);
+ INITW(44);
+ INITW(45);
+ INITW(46);
+ INITW(47);
+ INITW(48);
+ INITW(49);
+
+ INITW(50);
+ INITW(51);
+ INITW(52);
+ INITW(53);
+ INITW(54);
+ INITW(55);
+ INITW(56);
+ INITW(57);
+ INITW(58);
+ INITW(59);
+
+ INITW(60);
+ INITW(61);
+ INITW(62);
+ INITW(63);
+
+#endif
+#undef INITW
+ }
+ {
+ PRUint32 a, b, c, d, e, f, g, h;
+
+ a = H[0];
+ b = H[1];
+ c = H[2];
+ d = H[3];
+ e = H[4];
+ f = H[5];
+ g = H[6];
+ h = H[7];
+
+#define ROUND(n,a,b,c,d,e,f,g,h) \
+ h += S1(e) + Ch(e,f,g) + K256[n] + W[n]; \
+ d += h; \
+ h += S0(a) + Maj(a,b,c);
+
+#ifdef NOUNROLL256
+ {
+ int t;
+ for (t = 0; t < 64; t+= 8) {
+ ROUND(t+0,a,b,c,d,e,f,g,h)
+ ROUND(t+1,h,a,b,c,d,e,f,g)
+ ROUND(t+2,g,h,a,b,c,d,e,f)
+ ROUND(t+3,f,g,h,a,b,c,d,e)
+ ROUND(t+4,e,f,g,h,a,b,c,d)
+ ROUND(t+5,d,e,f,g,h,a,b,c)
+ ROUND(t+6,c,d,e,f,g,h,a,b)
+ ROUND(t+7,b,c,d,e,f,g,h,a)
+ }
+ }
+#else
+ ROUND( 0,a,b,c,d,e,f,g,h)
+ ROUND( 1,h,a,b,c,d,e,f,g)
+ ROUND( 2,g,h,a,b,c,d,e,f)
+ ROUND( 3,f,g,h,a,b,c,d,e)
+ ROUND( 4,e,f,g,h,a,b,c,d)
+ ROUND( 5,d,e,f,g,h,a,b,c)
+ ROUND( 6,c,d,e,f,g,h,a,b)
+ ROUND( 7,b,c,d,e,f,g,h,a)
+
+ ROUND( 8,a,b,c,d,e,f,g,h)
+ ROUND( 9,h,a,b,c,d,e,f,g)
+ ROUND(10,g,h,a,b,c,d,e,f)
+ ROUND(11,f,g,h,a,b,c,d,e)
+ ROUND(12,e,f,g,h,a,b,c,d)
+ ROUND(13,d,e,f,g,h,a,b,c)
+ ROUND(14,c,d,e,f,g,h,a,b)
+ ROUND(15,b,c,d,e,f,g,h,a)
+
+ ROUND(16,a,b,c,d,e,f,g,h)
+ ROUND(17,h,a,b,c,d,e,f,g)
+ ROUND(18,g,h,a,b,c,d,e,f)
+ ROUND(19,f,g,h,a,b,c,d,e)
+ ROUND(20,e,f,g,h,a,b,c,d)
+ ROUND(21,d,e,f,g,h,a,b,c)
+ ROUND(22,c,d,e,f,g,h,a,b)
+ ROUND(23,b,c,d,e,f,g,h,a)
+
+ ROUND(24,a,b,c,d,e,f,g,h)
+ ROUND(25,h,a,b,c,d,e,f,g)
+ ROUND(26,g,h,a,b,c,d,e,f)
+ ROUND(27,f,g,h,a,b,c,d,e)
+ ROUND(28,e,f,g,h,a,b,c,d)
+ ROUND(29,d,e,f,g,h,a,b,c)
+ ROUND(30,c,d,e,f,g,h,a,b)
+ ROUND(31,b,c,d,e,f,g,h,a)
+
+ ROUND(32,a,b,c,d,e,f,g,h)
+ ROUND(33,h,a,b,c,d,e,f,g)
+ ROUND(34,g,h,a,b,c,d,e,f)
+ ROUND(35,f,g,h,a,b,c,d,e)
+ ROUND(36,e,f,g,h,a,b,c,d)
+ ROUND(37,d,e,f,g,h,a,b,c)
+ ROUND(38,c,d,e,f,g,h,a,b)
+ ROUND(39,b,c,d,e,f,g,h,a)
+
+ ROUND(40,a,b,c,d,e,f,g,h)
+ ROUND(41,h,a,b,c,d,e,f,g)
+ ROUND(42,g,h,a,b,c,d,e,f)
+ ROUND(43,f,g,h,a,b,c,d,e)
+ ROUND(44,e,f,g,h,a,b,c,d)
+ ROUND(45,d,e,f,g,h,a,b,c)
+ ROUND(46,c,d,e,f,g,h,a,b)
+ ROUND(47,b,c,d,e,f,g,h,a)
+
+ ROUND(48,a,b,c,d,e,f,g,h)
+ ROUND(49,h,a,b,c,d,e,f,g)
+ ROUND(50,g,h,a,b,c,d,e,f)
+ ROUND(51,f,g,h,a,b,c,d,e)
+ ROUND(52,e,f,g,h,a,b,c,d)
+ ROUND(53,d,e,f,g,h,a,b,c)
+ ROUND(54,c,d,e,f,g,h,a,b)
+ ROUND(55,b,c,d,e,f,g,h,a)
+
+ ROUND(56,a,b,c,d,e,f,g,h)
+ ROUND(57,h,a,b,c,d,e,f,g)
+ ROUND(58,g,h,a,b,c,d,e,f)
+ ROUND(59,f,g,h,a,b,c,d,e)
+ ROUND(60,e,f,g,h,a,b,c,d)
+ ROUND(61,d,e,f,g,h,a,b,c)
+ ROUND(62,c,d,e,f,g,h,a,b)
+ ROUND(63,b,c,d,e,f,g,h,a)
+#endif
+
+ H[0] += a;
+ H[1] += b;
+ H[2] += c;
+ H[3] += d;
+ H[4] += e;
+ H[5] += f;
+ H[6] += g;
+ H[7] += h;
+ }
+#undef ROUND
+}
+
+#undef s0
+#undef s1
+#undef S0
+#undef S1
+
+void
+SHA256_Update(SHA256Context *ctx, const unsigned char *input,
+ unsigned int inputLen)
+{
+ unsigned int inBuf = ctx->sizeLo & 0x3f;
+ if (!inputLen)
+ return;
+
+ /* Add inputLen into the count of bytes processed, before processing */
+ if ((ctx->sizeLo += inputLen) < inputLen)
+ ctx->sizeHi++;
+
+ /* if data already in buffer, attemp to fill rest of buffer */
+ if (inBuf) {
+ unsigned int todo = SHA256_BLOCK_LENGTH - inBuf;
+ if (inputLen < todo)
+ todo = inputLen;
+ memcpy(B + inBuf, input, todo);
+ input += todo;
+ inputLen -= todo;
+ if (inBuf + todo == SHA256_BLOCK_LENGTH)
+ SHA256_Compress(ctx);
+ }
+
+ /* if enough data to fill one or more whole buffers, process them. */
+ while (inputLen >= SHA256_BLOCK_LENGTH) {
+ memcpy(B, input, SHA256_BLOCK_LENGTH);
+ input += SHA256_BLOCK_LENGTH;
+ inputLen -= SHA256_BLOCK_LENGTH;
+ SHA256_Compress(ctx);
+ }
+ /* if data left over, fill it into buffer */
+ if (inputLen)
+ memcpy(B, input, inputLen);
+}
+
+void
+SHA256_End(SHA256Context *ctx, unsigned char *digest,
+ unsigned int *digestLen, unsigned int maxDigestLen)
+{
+ unsigned int inBuf = ctx->sizeLo & 0x3f;
+ unsigned int padLen = (inBuf < 56) ? (56 - inBuf) : (56 + 64 - inBuf);
+ PRUint32 hi, lo;
+#ifdef SWAP4MASK
+ PRUint32 t1;
+#endif
+
+ hi = (ctx->sizeHi << 3) | (ctx->sizeLo >> 29);
+ lo = (ctx->sizeLo << 3);
+
+ SHA256_Update(ctx, pad, padLen);
+
+#if defined(IS_LITTLE_ENDIAN)
+ W[14] = SHA_HTONL(hi);
+ W[15] = SHA_HTONL(lo);
+#else
+ W[14] = hi;
+ W[15] = lo;
+#endif
+ SHA256_Compress(ctx);
+
+ /* now output the answer */
+#if defined(IS_LITTLE_ENDIAN)
+ BYTESWAP4(H[0]);
+ BYTESWAP4(H[1]);
+ BYTESWAP4(H[2]);
+ BYTESWAP4(H[3]);
+ BYTESWAP4(H[4]);
+ BYTESWAP4(H[5]);
+ BYTESWAP4(H[6]);
+ BYTESWAP4(H[7]);
+#endif
+ padLen = PR_MIN(SHA256_LENGTH, maxDigestLen);
+ memcpy(digest, H, padLen);
+ if (digestLen)
+ *digestLen = padLen;
+}
+
+void
+SHA256_EndRaw(SHA256Context *ctx, unsigned char *digest,
+ unsigned int *digestLen, unsigned int maxDigestLen)
+{
+ PRUint32 h[8];
+ unsigned int len;
+#ifdef SWAP4MASK
+ PRUint32 t1;
+#endif
+
+ memcpy(h, ctx->h, sizeof(h));
+
+#if defined(IS_LITTLE_ENDIAN)
+ BYTESWAP4(h[0]);
+ BYTESWAP4(h[1]);
+ BYTESWAP4(h[2]);
+ BYTESWAP4(h[3]);
+ BYTESWAP4(h[4]);
+ BYTESWAP4(h[5]);
+ BYTESWAP4(h[6]);
+ BYTESWAP4(h[7]);
+#endif
+
+ len = PR_MIN(SHA256_LENGTH, maxDigestLen);
+ memcpy(digest, h, len);
+ if (digestLen)
+ *digestLen = len;
+}
+
+SECStatus
+SHA256_HashBuf(unsigned char *dest, const unsigned char *src,
+ PRUint32 src_length)
+{
+ SHA256Context ctx;
+ unsigned int outLen;
+
+ SHA256_Begin(&ctx);
+ SHA256_Update(&ctx, src, src_length);
+ SHA256_End(&ctx, dest, &outLen, SHA256_LENGTH);
+ memset(&ctx, 0, sizeof ctx);
+
+ return SECSuccess;
+}
diff --git a/dom/media/gmp/rlz/sha256.h b/dom/media/gmp/rlz/sha256.h
new file mode 100644
index 000000000..6958e382c
--- /dev/null
+++ b/dom/media/gmp/rlz/sha256.h
@@ -0,0 +1,46 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Stripped down version of security/nss/lib/freebl/blapi.h
+// and related headers.
+
+#ifndef _SHA256_H_
+#define _SHA256_H_
+
+#define SHA256_LENGTH 32
+
+#include "prtypes.h" /* for PRUintXX */
+#include "prlong.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct SHA256Context {
+ union {
+ PRUint32 w[64]; /* message schedule, input buffer, plus 48 words */
+ PRUint8 b[256];
+ } u;
+ PRUint32 h[8]; /* 8 state variables */
+ PRUint32 sizeHi,sizeLo; /* 64-bit count of hashed bytes. */
+};
+
+typedef struct SHA256Context SHA256Context;
+
+extern void
+SHA256_Begin(SHA256Context *ctx);
+
+extern void
+SHA256_Update(SHA256Context *ctx, const unsigned char *input,
+ unsigned int inputLen);
+
+extern void
+SHA256_End(SHA256Context *ctx, unsigned char *digest,
+ unsigned int *digestLen, unsigned int maxDigestLen);
+
+#ifdef __cplusplus
+} /* extern C */
+#endif
+
+#endif /* _SHA256_H_ */
diff --git a/dom/media/gmp/rlz/win/lib/machine_id_win.cc b/dom/media/gmp/rlz/win/lib/machine_id_win.cc
new file mode 100644
index 000000000..0a636ebd3
--- /dev/null
+++ b/dom/media/gmp/rlz/win/lib/machine_id_win.cc
@@ -0,0 +1,134 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+// Use of this source code is governed by an Apache-style license that can be
+// found in the COPYING file.
+
+#include <windows.h>
+#include <sddl.h> // For ConvertSidToStringSidW.
+#include <string>
+#include <vector>
+#include "mozilla/ArrayUtils.h"
+
+#include "rlz/lib/assert.h"
+
+namespace rlz_lib {
+
+namespace {
+
+bool GetSystemVolumeSerialNumber(int* number) {
+ if (!number)
+ return false;
+
+ *number = 0;
+
+ // Find the system root path (e.g: C:\).
+ wchar_t system_path[MAX_PATH + 1];
+ if (!GetSystemDirectoryW(system_path, MAX_PATH))
+ return false;
+
+ wchar_t* first_slash = wcspbrk(system_path, L"\\/");
+ if (first_slash != NULL)
+ *(first_slash + 1) = 0;
+
+ DWORD number_local = 0;
+ if (!GetVolumeInformationW(system_path, NULL, 0, &number_local, NULL, NULL,
+ NULL, 0))
+ return false;
+
+ *number = (int)number_local;
+ return true;
+}
+
+bool GetComputerSid(const wchar_t* account_name, SID* sid, DWORD sid_size) {
+ static const DWORD kStartDomainLength = 128; // reasonable to start with
+
+ std::vector<wchar_t> domain_buffer(kStartDomainLength, 0);
+ DWORD domain_size = kStartDomainLength;
+ DWORD sid_dword_size = sid_size;
+ SID_NAME_USE sid_name_use;
+
+ BOOL success = ::LookupAccountNameW(NULL, account_name, sid,
+ &sid_dword_size, &domain_buffer.front(),
+ &domain_size, &sid_name_use);
+ if (!success && ::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ // We could have gotten the insufficient buffer error because
+ // one or both of sid and szDomain was too small. Check for that
+ // here.
+ if (sid_dword_size > sid_size)
+ return false;
+
+ if (domain_size > kStartDomainLength)
+ domain_buffer.resize(domain_size);
+
+ success = ::LookupAccountNameW(NULL, account_name, sid, &sid_dword_size,
+ &domain_buffer.front(), &domain_size,
+ &sid_name_use);
+ }
+
+ return success != FALSE;
+}
+
+std::vector<uint8_t> ConvertSidToBytes(SID* sid) {
+ std::wstring sid_string;
+#if _WIN32_WINNT >= 0x500
+ wchar_t* sid_buffer = NULL;
+ if (ConvertSidToStringSidW(sid, &sid_buffer)) {
+ sid_string = sid_buffer;
+ LocalFree(sid_buffer);
+ }
+#else
+ SID_IDENTIFIER_AUTHORITY* sia = ::GetSidIdentifierAuthority(sid);
+
+ if(sia->Value[0] || sia->Value[1]) {
+ base::SStringPrintf(
+ &sid_string, L"S-%d-0x%02hx%02hx%02hx%02hx%02hx%02hx",
+ SID_REVISION, (USHORT)sia->Value[0], (USHORT)sia->Value[1],
+ (USHORT)sia->Value[2], (USHORT)sia->Value[3], (USHORT)sia->Value[4],
+ (USHORT)sia->Value[5]);
+ } else {
+ ULONG authority = 0;
+ for (int i = 2; i < 6; ++i) {
+ authority <<= 8;
+ authority |= sia->Value[i];
+ }
+ base::SStringPrintf(&sid_string, L"S-%d-%lu", SID_REVISION, authority);
+ }
+
+ int sub_auth_count = *::GetSidSubAuthorityCount(sid);
+ for(int i = 0; i < sub_auth_count; ++i)
+ base::StringAppendF(&sid_string, L"-%lu", *::GetSidSubAuthority(sid, i));
+#endif
+
+ // Get the contents of the string as a bunch of bytes.
+ return std::vector<uint8_t>(
+ reinterpret_cast<uint8_t*>(&sid_string[0]),
+ reinterpret_cast<uint8_t*>(&sid_string[sid_string.size()]));
+}
+
+} // namespace
+
+bool GetRawMachineId(std::vector<uint8_t>* sid_bytes, int* volume_id) {
+ // Calculate the Windows SID.
+
+ wchar_t computer_name[MAX_COMPUTERNAME_LENGTH + 1] = {0};
+ DWORD size = mozilla::ArrayLength(computer_name);
+
+ if (!GetComputerNameW(computer_name, &size)) {
+ return false;
+ }
+ char sid_buffer[SECURITY_MAX_SID_SIZE];
+ SID* sid = reinterpret_cast<SID*>(sid_buffer);
+ if (GetComputerSid(computer_name, sid, SECURITY_MAX_SID_SIZE)) {
+ *sid_bytes = ConvertSidToBytes(sid);
+ }
+
+ // Get the system drive volume serial number.
+ *volume_id = 0;
+ if (!GetSystemVolumeSerialNumber(volume_id)) {
+ ASSERT_STRING("GetMachineId: Failed to retrieve volume serial number");
+ *volume_id = 0;
+ }
+
+ return true;
+}
+
+} // namespace rlz_lib
diff --git a/dom/media/gmp/widevine-adapter/WidevineAdapter.cpp b/dom/media/gmp/widevine-adapter/WidevineAdapter.cpp
new file mode 100644
index 000000000..74b5c38e8
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineAdapter.cpp
@@ -0,0 +1,168 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WidevineAdapter.h"
+#include "content_decryption_module.h"
+#include "VideoUtils.h"
+#include "WidevineDecryptor.h"
+#include "WidevineUtils.h"
+#include "WidevineVideoDecoder.h"
+#include "gmp-api/gmp-entrypoints.h"
+#include "gmp-api/gmp-decryption.h"
+#include "gmp-api/gmp-video-codec.h"
+#include "gmp-api/gmp-platform.h"
+
+static const GMPPlatformAPI* sPlatform = nullptr;
+
+namespace mozilla {
+
+GMPErr GMPGetCurrentTime(GMPTimestamp* aOutTime) {
+ return sPlatform->getcurrenttime(aOutTime);
+}
+
+// Call on main thread only.
+GMPErr GMPSetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS) {
+ return sPlatform->settimer(aTask, aTimeoutMS);
+}
+
+GMPErr GMPCreateRecord(const char* aRecordName,
+ uint32_t aRecordNameSize,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient)
+{
+ return sPlatform->createrecord(aRecordName, aRecordNameSize, aOutRecord, aClient);
+}
+
+void
+WidevineAdapter::SetAdaptee(PRLibrary* aLib)
+{
+ mLib = aLib;
+}
+
+void* GetCdmHost(int aHostInterfaceVersion, void* aUserData)
+{
+ Log("GetCdmHostFunc(%d, %p)", aHostInterfaceVersion, aUserData);
+ WidevineDecryptor* decryptor = reinterpret_cast<WidevineDecryptor*>(aUserData);
+ MOZ_ASSERT(decryptor);
+ return static_cast<cdm::Host_8*>(decryptor);
+}
+
+#define STRINGIFY(s) _STRINGIFY(s)
+#define _STRINGIFY(s) #s
+
+GMPErr
+WidevineAdapter::GMPInit(const GMPPlatformAPI* aPlatformAPI)
+{
+#ifdef ENABLE_WIDEVINE_LOG
+ if (getenv("GMP_LOG_FILE")) {
+ // Clear log file.
+ FILE* f = fopen(getenv("GMP_LOG_FILE"), "w");
+ if (f) {
+ fclose(f);
+ }
+ }
+#endif
+
+ sPlatform = aPlatformAPI;
+ if (!mLib) {
+ return GMPGenericErr;
+ }
+
+ auto init = reinterpret_cast<decltype(::INITIALIZE_CDM_MODULE)*>(
+ PR_FindFunctionSymbol(mLib, STRINGIFY(INITIALIZE_CDM_MODULE)));
+ if (!init) {
+ return GMPGenericErr;
+ }
+
+ Log(STRINGIFY(INITIALIZE_CDM_MODULE)"()");
+ init();
+
+ return GMPNoErr;
+}
+
+GMPErr
+WidevineAdapter::GMPGetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId)
+{
+ Log("WidevineAdapter::GMPGetAPI(%s, 0x%p, 0x%p, %u) this=0x%p",
+ aAPIName, aHostAPI, aPluginAPI, this, aDecryptorId);
+ if (!strcmp(aAPIName, GMP_API_DECRYPTOR)) {
+ if (WidevineDecryptor::GetInstance(aDecryptorId)) {
+ // We only support one CDM instance per PGMPDecryptor. Fail!
+ Log("WidevineAdapter::GMPGetAPI() Tried to create more than once CDM per IPDL actor! FAIL!");
+ return GMPQuotaExceededErr;
+ }
+ auto create = reinterpret_cast<decltype(::CreateCdmInstance)*>(
+ PR_FindFunctionSymbol(mLib, "CreateCdmInstance"));
+ if (!create) {
+ Log("WidevineAdapter::GMPGetAPI(%s, 0x%p, 0x%p, %u) this=0x%p FAILED to find CreateCdmInstance",
+ aAPIName, aHostAPI, aPluginAPI, this, aDecryptorId);
+ return GMPGenericErr;
+ }
+
+ WidevineDecryptor* decryptor = new WidevineDecryptor();
+
+ auto cdm = reinterpret_cast<cdm::ContentDecryptionModule*>(
+ create(cdm::ContentDecryptionModule::kVersion,
+ kEMEKeySystemWidevine.get(),
+ kEMEKeySystemWidevine.Length(),
+ &GetCdmHost,
+ decryptor));
+ if (!cdm) {
+ Log("WidevineAdapter::GMPGetAPI(%s, 0x%p, 0x%p, %u) this=0x%p FAILED to create cdm",
+ aAPIName, aHostAPI, aPluginAPI, this, aDecryptorId);
+ return GMPGenericErr;
+ }
+ Log("cdm: 0x%x", cdm);
+ RefPtr<CDMWrapper> wrapper(new CDMWrapper(cdm, decryptor));
+ decryptor->SetCDM(wrapper, aDecryptorId);
+ *aPluginAPI = decryptor;
+
+ } else if (!strcmp(aAPIName, GMP_API_VIDEO_DECODER)) {
+ RefPtr<CDMWrapper> wrapper = WidevineDecryptor::GetInstance(aDecryptorId);
+ if (!wrapper) {
+ Log("WidevineAdapter::GMPGetAPI(%s, 0x%p, 0x%p, %u) this=0x%p No cdm for video decoder",
+ aAPIName, aHostAPI, aPluginAPI, thiss, aDecryptorId);
+ return GMPGenericErr;
+ }
+ *aPluginAPI = new WidevineVideoDecoder(static_cast<GMPVideoHost*>(aHostAPI),
+ wrapper);
+ }
+ return *aPluginAPI ? GMPNoErr : GMPNotImplementedErr;
+}
+
+void
+WidevineAdapter::GMPShutdown()
+{
+ Log("WidevineAdapter::GMPShutdown()");
+
+ decltype(::DeinitializeCdmModule)* deinit;
+ deinit = (decltype(deinit))(PR_FindFunctionSymbol(mLib, "DeinitializeCdmModule"));
+ if (deinit) {
+ Log("DeinitializeCdmModule()");
+ deinit();
+ }
+}
+
+void
+WidevineAdapter::GMPSetNodeId(const char* aNodeId, uint32_t aLength)
+{
+
+}
+
+/* static */
+bool
+WidevineAdapter::Supports(int32_t aModuleVersion,
+ int32_t aInterfaceVersion,
+ int32_t aHostVersion)
+{
+ return aModuleVersion == CDM_MODULE_VERSION &&
+ aInterfaceVersion == cdm::ContentDecryptionModule::kVersion &&
+ aHostVersion == cdm::Host_8::kVersion;
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/widevine-adapter/WidevineAdapter.h b/dom/media/gmp/widevine-adapter/WidevineAdapter.h
new file mode 100644
index 000000000..714e041be
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineAdapter.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WidevineAdapter_h_
+#define WidevineAdapter_h_
+
+#include "GMPLoader.h"
+#include "prlink.h"
+#include "GMPUtils.h"
+
+struct GMPPlatformAPI;
+
+namespace mozilla {
+
+class WidevineAdapter : public gmp::GMPAdapter {
+public:
+
+ void SetAdaptee(PRLibrary* aLib) override;
+
+ // These are called in place of the corresponding GMP API functions.
+ GMPErr GMPInit(const GMPPlatformAPI* aPlatformAPI) override;
+ GMPErr GMPGetAPI(const char* aAPIName,
+ void* aHostAPI,
+ void** aPluginAPI,
+ uint32_t aDecryptorId) override;
+ void GMPShutdown() override;
+ void GMPSetNodeId(const char* aNodeId, uint32_t aLength) override;
+
+ static bool Supports(int32_t aModuleVersion,
+ int32_t aInterfaceVersion,
+ int32_t aHostVersion);
+
+private:
+ PRLibrary* mLib = nullptr;
+};
+
+GMPErr GMPCreateThread(GMPThread** aThread);
+GMPErr GMPRunOnMainThread(GMPTask* aTask);
+GMPErr GMPCreateMutex(GMPMutex** aMutex);
+
+// Call on main thread only.
+GMPErr GMPCreateRecord(const char* aRecordName,
+ uint32_t aRecordNameSize,
+ GMPRecord** aOutRecord,
+ GMPRecordClient* aClient);
+
+// Call on main thread only.
+GMPErr GMPSetTimerOnMainThread(GMPTask* aTask, int64_t aTimeoutMS);
+
+GMPErr GMPGetCurrentTime(GMPTimestamp* aOutTime);
+
+GMPErr GMPCreateRecordIterator(RecvGMPRecordIteratorPtr aRecvIteratorFunc,
+ void* aUserArg);
+
+} // namespace mozilla
+
+#endif // WidevineAdapter_h_
diff --git a/dom/media/gmp/widevine-adapter/WidevineDecryptor.cpp b/dom/media/gmp/widevine-adapter/WidevineDecryptor.cpp
new file mode 100644
index 000000000..149fa1701
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineDecryptor.cpp
@@ -0,0 +1,541 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WidevineDecryptor.h"
+
+#include "WidevineAdapter.h"
+#include "WidevineUtils.h"
+#include "WidevineFileIO.h"
+#include <mozilla/SizePrintfMacros.h>
+#include <stdarg.h>
+#include "base/time.h"
+
+using namespace cdm;
+using namespace std;
+
+namespace mozilla {
+
+static map<uint32_t, RefPtr<CDMWrapper>> sDecryptors;
+
+/* static */
+RefPtr<CDMWrapper>
+WidevineDecryptor::GetInstance(uint32_t aInstanceId)
+{
+ auto itr = sDecryptors.find(aInstanceId);
+ if (itr != sDecryptors.end()) {
+ return itr->second;
+ }
+ return nullptr;
+}
+
+
+WidevineDecryptor::WidevineDecryptor()
+ : mCallback(nullptr)
+{
+ Log("WidevineDecryptor created this=%p", this);
+ AddRef(); // Released in DecryptingComplete().
+}
+
+WidevineDecryptor::~WidevineDecryptor()
+{
+ Log("WidevineDecryptor destroyed this=%p", this);
+}
+
+void
+WidevineDecryptor::SetCDM(RefPtr<CDMWrapper> aCDM, uint32_t aInstanceId)
+{
+ mCDM = aCDM;
+ mInstanceId = aInstanceId;
+ sDecryptors[mInstanceId] = aCDM;
+}
+
+void
+WidevineDecryptor::Init(GMPDecryptorCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired)
+{
+ Log("WidevineDecryptor::Init() this=%p distinctiveId=%d persistentState=%d",
+ this, aDistinctiveIdentifierRequired, aPersistentStateRequired);
+ MOZ_ASSERT(aCallback);
+ mCallback = aCallback;
+ MOZ_ASSERT(mCDM);
+ mDistinctiveIdentifierRequired = aDistinctiveIdentifierRequired;
+ mPersistentStateRequired = aPersistentStateRequired;
+ if (CDM()) {
+ CDM()->Initialize(aDistinctiveIdentifierRequired,
+ aPersistentStateRequired);
+ }
+}
+
+static SessionType
+ToCDMSessionType(GMPSessionType aSessionType)
+{
+ switch (aSessionType) {
+ case kGMPTemporySession: return kTemporary;
+ case kGMPPersistentSession: return kPersistentLicense;
+ case kGMPSessionInvalid: return kTemporary;
+ // TODO: kPersistentKeyRelease
+ }
+ MOZ_ASSERT(false); // Not supposed to get here.
+ return kTemporary;
+}
+
+void
+WidevineDecryptor::CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const char* aInitDataType,
+ uint32_t aInitDataTypeSize,
+ const uint8_t* aInitData,
+ uint32_t aInitDataSize,
+ GMPSessionType aSessionType)
+{
+ Log("Decryptor::CreateSession(token=%d, pid=%d)", aCreateSessionToken, aPromiseId);
+ InitDataType initDataType;
+ if (!strcmp(aInitDataType, "cenc")) {
+ initDataType = kCenc;
+ } else if (!strcmp(aInitDataType, "webm")) {
+ initDataType = kWebM;
+ } else if (!strcmp(aInitDataType, "keyids")) {
+ initDataType = kKeyIds;
+ } else {
+ // Invalid init data type
+ const char* errorMsg = "Invalid init data type when creating session.";
+ OnRejectPromise(aPromiseId, kNotSupportedError, 0, errorMsg, sizeof(errorMsg));
+ return;
+ }
+ mPromiseIdToNewSessionTokens[aPromiseId] = aCreateSessionToken;
+ CDM()->CreateSessionAndGenerateRequest(aPromiseId,
+ ToCDMSessionType(aSessionType),
+ initDataType,
+ aInitData, aInitDataSize);
+}
+
+void
+WidevineDecryptor::LoadSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength)
+{
+ Log("Decryptor::LoadSession(pid=%d, %s)", aPromiseId, aSessionId);
+ // TODO: session type??
+ CDM()->LoadSession(aPromiseId, kPersistentLicense, aSessionId, aSessionIdLength);
+}
+
+void
+WidevineDecryptor::UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize)
+{
+ Log("Decryptor::UpdateSession(pid=%d, session=%s)", aPromiseId, aSessionId);
+ CDM()->UpdateSession(aPromiseId, aSessionId, aSessionIdLength, aResponse, aResponseSize);
+}
+
+void
+WidevineDecryptor::CloseSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength)
+{
+ Log("Decryptor::CloseSession(pid=%d, session=%s)", aPromiseId, aSessionId);
+ CDM()->CloseSession(aPromiseId, aSessionId, aSessionIdLength);
+}
+
+void
+WidevineDecryptor::RemoveSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength)
+{
+ Log("Decryptor::RemoveSession(%s)", aSessionId);
+ CDM()->RemoveSession(aPromiseId, aSessionId, aSessionIdLength);
+}
+
+void
+WidevineDecryptor::SetServerCertificate(uint32_t aPromiseId,
+ const uint8_t* aServerCert,
+ uint32_t aServerCertSize)
+{
+ Log("Decryptor::SetServerCertificate()");
+ CDM()->SetServerCertificate(aPromiseId, aServerCert, aServerCertSize);
+}
+
+class WidevineDecryptedBlock : public cdm::DecryptedBlock {
+public:
+
+ WidevineDecryptedBlock()
+ : mBuffer(nullptr)
+ , mTimestamp(0)
+ {
+ }
+
+ ~WidevineDecryptedBlock() {
+ if (mBuffer) {
+ mBuffer->Destroy();
+ mBuffer = nullptr;
+ }
+ }
+
+ void SetDecryptedBuffer(cdm::Buffer* aBuffer) override {
+ mBuffer = aBuffer;
+ }
+
+ cdm::Buffer* DecryptedBuffer() override {
+ return mBuffer;
+ }
+
+ void SetTimestamp(int64_t aTimestamp) override {
+ mTimestamp = aTimestamp;
+ }
+
+ int64_t Timestamp() const override {
+ return mTimestamp;
+ }
+
+private:
+ cdm::Buffer* mBuffer;
+ int64_t mTimestamp;
+};
+
+void
+WidevineDecryptor::Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata)
+{
+ if (!mCallback) {
+ Log("WidevineDecryptor::Decrypt() this=%p FAIL; !mCallback", this);
+ return;
+ }
+ const GMPEncryptedBufferMetadata* crypto = aMetadata;
+ InputBuffer sample;
+ nsTArray<SubsampleEntry> subsamples;
+ InitInputBuffer(crypto, aBuffer->Id(), aBuffer->Data(), aBuffer->Size(), sample, subsamples);
+ WidevineDecryptedBlock decrypted;
+ Status rv = CDM()->Decrypt(sample, &decrypted);
+ Log("Decryptor::Decrypt(timestamp=%lld) rv=%d sz=%d",
+ sample.timestamp, rv, decrypted.DecryptedBuffer()->Size());
+ if (rv == kSuccess) {
+ aBuffer->Resize(decrypted.DecryptedBuffer()->Size());
+ memcpy(aBuffer->Data(),
+ decrypted.DecryptedBuffer()->Data(),
+ decrypted.DecryptedBuffer()->Size());
+ }
+ mCallback->Decrypted(aBuffer, ToGMPErr(rv));
+}
+
+void
+WidevineDecryptor::DecryptingComplete()
+{
+ Log("WidevineDecryptor::DecryptingComplete() this=%p", this);
+ // Drop our references to the CDMWrapper. When any other references
+ // held elsewhere are dropped (for example references held by a
+ // WidevineVideoDecoder, or a runnable), the CDMWrapper destroys
+ // the CDM.
+ mCDM = nullptr;
+ sDecryptors.erase(mInstanceId);
+ mCallback = nullptr;
+ Release();
+}
+
+class WidevineBuffer : public cdm::Buffer {
+public:
+ explicit WidevineBuffer(size_t aSize) {
+ Log("WidevineBuffer(size=" PRIuSIZE ") created", aSize);
+ mBuffer.SetLength(aSize);
+ }
+ ~WidevineBuffer() {
+ Log("WidevineBuffer(size=" PRIuSIZE ") destroyed", Size());
+ }
+ void Destroy() override { delete this; }
+ uint32_t Capacity() const override { return mBuffer.Length(); };
+ uint8_t* Data() override { return mBuffer.Elements(); }
+ void SetSize(uint32_t aSize) override { mBuffer.SetLength(aSize); }
+ uint32_t Size() const override { return mBuffer.Length(); }
+
+private:
+ WidevineBuffer(const WidevineBuffer&);
+ void operator=(const WidevineBuffer&);
+
+ nsTArray<uint8_t> mBuffer;
+};
+
+Buffer*
+WidevineDecryptor::Allocate(uint32_t aCapacity)
+{
+ Log("Decryptor::Allocate(capacity=%u)", aCapacity);
+ return new WidevineBuffer(aCapacity);
+}
+
+class TimerTask : public GMPTask {
+public:
+ TimerTask(WidevineDecryptor* aDecryptor,
+ RefPtr<CDMWrapper> aCDM,
+ void* aContext)
+ : mDecryptor(aDecryptor)
+ , mCDM(aCDM)
+ , mContext(aContext)
+ {
+ }
+ ~TimerTask() override {}
+ void Run() override {
+ mCDM->GetCDM()->TimerExpired(mContext);
+ }
+ void Destroy() override { delete this; }
+private:
+ RefPtr<WidevineDecryptor> mDecryptor;
+ RefPtr<CDMWrapper> mCDM;
+ void* mContext;
+};
+
+void
+WidevineDecryptor::SetTimer(int64_t aDelayMs, void* aContext)
+{
+ Log("Decryptor::SetTimer(delay_ms=%lld, context=0x%x)", aDelayMs, aContext);
+ if (mCDM) {
+ GMPSetTimerOnMainThread(new TimerTask(this, mCDM, aContext), aDelayMs);
+ }
+}
+
+Time
+WidevineDecryptor::GetCurrentWallTime()
+{
+ return base::Time::Now().ToDoubleT();
+}
+
+void
+WidevineDecryptor::OnResolveNewSessionPromise(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdSize)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnResolveNewSessionPromise(aPromiseId=0x%d) FAIL; !mCallback", aPromiseId);
+ return;
+ }
+ Log("Decryptor::OnResolveNewSessionPromise(aPromiseId=0x%d)", aPromiseId);
+ auto iter = mPromiseIdToNewSessionTokens.find(aPromiseId);
+ if (iter == mPromiseIdToNewSessionTokens.end()) {
+ Log("FAIL: Decryptor::OnResolveNewSessionPromise(aPromiseId=%d) unknown aPromiseId", aPromiseId);
+ return;
+ }
+ mCallback->SetSessionId(iter->second, aSessionId, aSessionIdSize);
+ mCallback->ResolvePromise(aPromiseId);
+ mPromiseIdToNewSessionTokens.erase(iter);
+}
+
+void
+WidevineDecryptor::OnResolvePromise(uint32_t aPromiseId)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnResolvePromise(aPromiseId=0x%d) FAIL; !mCallback", aPromiseId);
+ return;
+ }
+ Log("Decryptor::OnResolvePromise(aPromiseId=%d)", aPromiseId);
+ mCallback->ResolvePromise(aPromiseId);
+}
+
+static GMPDOMException
+ToGMPDOMException(cdm::Error aError)
+{
+ switch (aError) {
+ case kNotSupportedError: return kGMPNotSupportedError;
+ case kInvalidStateError: return kGMPInvalidStateError;
+ case kInvalidAccessError:
+ // Note: Chrome converts kInvalidAccessError to TypeError, since the
+ // Chromium CDM API doesn't have a type error enum value. The EME spec
+ // requires TypeError in some places, so we do the same conversion.
+ // See bug 1313202.
+ return kGMPTypeError;
+ case kQuotaExceededError: return kGMPQuotaExceededError;
+ case kUnknownError: return kGMPInvalidModificationError; // Note: Unique placeholder.
+ case kClientError: return kGMPAbortError; // Note: Unique placeholder.
+ case kOutputError: return kGMPSecurityError; // Note: Unique placeholder.
+ };
+ return kGMPTimeoutError; // Note: Unique placeholder.
+}
+
+void
+WidevineDecryptor::OnRejectPromise(uint32_t aPromiseId,
+ Error aError,
+ uint32_t aSystemCode,
+ const char* aErrorMessage,
+ uint32_t aErrorMessageSize)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnRejectPromise(aPromiseId=%d, err=%d, sysCode=%u, msg=%s) FAIL; !mCallback",
+ aPromiseId, (int)aError, aSystemCode, aErrorMessage);
+ return;
+ }
+ Log("Decryptor::OnRejectPromise(aPromiseId=%d, err=%d, sysCode=%u, msg=%s)",
+ aPromiseId, (int)aError, aSystemCode, aErrorMessage);
+ mCallback->RejectPromise(aPromiseId,
+ ToGMPDOMException(aError),
+ !aErrorMessageSize ? "" : aErrorMessage,
+ aErrorMessageSize);
+}
+
+static GMPSessionMessageType
+ToGMPMessageType(MessageType message_type)
+{
+ switch (message_type) {
+ case kLicenseRequest: return kGMPLicenseRequest;
+ case kLicenseRenewal: return kGMPLicenseRenewal;
+ case kLicenseRelease: return kGMPLicenseRelease;
+ }
+ return kGMPMessageInvalid;
+}
+
+void
+WidevineDecryptor::OnSessionMessage(const char* aSessionId,
+ uint32_t aSessionIdSize,
+ MessageType aMessageType,
+ const char* aMessage,
+ uint32_t aMessageSize,
+ const char* aLegacyDestinationUrl,
+ uint32_t aLegacyDestinationUrlLength)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnSessionMessage() FAIL; !mCallback");
+ return;
+ }
+ Log("Decryptor::OnSessionMessage()");
+ mCallback->SessionMessage(aSessionId,
+ aSessionIdSize,
+ ToGMPMessageType(aMessageType),
+ reinterpret_cast<const uint8_t*>(aMessage),
+ aMessageSize);
+}
+
+static GMPMediaKeyStatus
+ToGMPKeyStatus(KeyStatus aStatus)
+{
+ switch (aStatus) {
+ case kUsable: return kGMPUsable;
+ case kInternalError: return kGMPInternalError;
+ case kExpired: return kGMPExpired;
+ case kOutputRestricted: return kGMPOutputRestricted;
+ case kOutputDownscaled: return kGMPOutputDownscaled;
+ case kStatusPending: return kGMPStatusPending;
+ case kReleased: return kGMPReleased;
+ }
+ return kGMPUnknown;
+}
+
+void
+WidevineDecryptor::OnSessionKeysChange(const char* aSessionId,
+ uint32_t aSessionIdSize,
+ bool aHasAdditionalUsableKey,
+ const KeyInformation* aKeysInfo,
+ uint32_t aKeysInfoCount)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnSessionKeysChange() FAIL; !mCallback");
+ return;
+ }
+ Log("Decryptor::OnSessionKeysChange()");
+
+ nsTArray<GMPMediaKeyInfo> key_infos;
+ for (uint32_t i = 0; i < aKeysInfoCount; i++) {
+ key_infos.AppendElement(GMPMediaKeyInfo(aKeysInfo[i].key_id,
+ aKeysInfo[i].key_id_size,
+ ToGMPKeyStatus(aKeysInfo[i].status)));
+ }
+ mCallback->BatchedKeyStatusChanged(aSessionId, aSessionIdSize,
+ key_infos.Elements(), key_infos.Length());
+}
+
+static GMPTimestamp
+ToGMPTime(Time aCDMTime)
+{
+ return static_cast<GMPTimestamp>(aCDMTime * 1000);
+}
+
+void
+WidevineDecryptor::OnExpirationChange(const char* aSessionId,
+ uint32_t aSessionIdSize,
+ Time aNewExpiryTime)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnExpirationChange(sid=%s) t=%lf FAIL; !mCallback",
+ aSessionId, aNewExpiryTime);
+ return;
+ }
+ Log("Decryptor::OnExpirationChange(sid=%s) t=%lf", aSessionId, aNewExpiryTime);
+ GMPTimestamp expiry = ToGMPTime(aNewExpiryTime);
+ if (aNewExpiryTime == 0) {
+ return;
+ }
+ mCallback->ExpirationChange(aSessionId, aSessionIdSize, expiry);
+}
+
+void
+WidevineDecryptor::OnSessionClosed(const char* aSessionId,
+ uint32_t aSessionIdSize)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnSessionClosed(sid=%s) FAIL; !mCallback", aSessionId);
+ return;
+ }
+ Log("Decryptor::OnSessionClosed(sid=%s)", aSessionId);
+ mCallback->SessionClosed(aSessionId, aSessionIdSize);
+}
+
+void
+WidevineDecryptor::OnLegacySessionError(const char* aSessionId,
+ uint32_t aSessionIdLength,
+ Error aError,
+ uint32_t aSystemCode,
+ const char* aErrorMessage,
+ uint32_t aErrorMessageLength)
+{
+ if (!mCallback) {
+ Log("Decryptor::OnLegacySessionError(sid=%s, error=%d) FAIL; !mCallback",
+ aSessionId, (int)aError);
+ return;
+ }
+ Log("Decryptor::OnLegacySessionError(sid=%s, error=%d)", aSessionId, (int)aError);
+ mCallback->SessionError(aSessionId,
+ aSessionIdLength,
+ ToGMPDOMException(aError),
+ aSystemCode,
+ aErrorMessage,
+ aErrorMessageLength);
+}
+
+void
+WidevineDecryptor::SendPlatformChallenge(const char* aServiceId,
+ uint32_t aServiceIdSize,
+ const char* aChallenge,
+ uint32_t aChallengeSize)
+{
+ Log("Decryptor::SendPlatformChallenge(service_id=%s)", aServiceId);
+}
+
+void
+WidevineDecryptor::EnableOutputProtection(uint32_t aDesiredProtectionMask)
+{
+ Log("Decryptor::EnableOutputProtection(mask=0x%x)", aDesiredProtectionMask);
+}
+
+void
+WidevineDecryptor::QueryOutputProtectionStatus()
+{
+ Log("Decryptor::QueryOutputProtectionStatus()");
+}
+
+void
+WidevineDecryptor::OnDeferredInitializationDone(StreamType aStreamType,
+ Status aDecoderStatus)
+{
+ Log("Decryptor::OnDeferredInitializationDone()");
+}
+
+FileIO*
+WidevineDecryptor::CreateFileIO(FileIOClient* aClient)
+{
+ Log("Decryptor::CreateFileIO()");
+ if (!mPersistentStateRequired) {
+ return nullptr;
+ }
+ return new WidevineFileIO(aClient);
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/widevine-adapter/WidevineDecryptor.h b/dom/media/gmp/widevine-adapter/WidevineDecryptor.h
new file mode 100644
index 000000000..d5185192b
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineDecryptor.h
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WidevineDecryptor_h_
+#define WidevineDecryptor_h_
+
+#include "stddef.h"
+#include "content_decryption_module.h"
+#include "gmp-api/gmp-decryption.h"
+#include "mozilla/RefPtr.h"
+#include "WidevineUtils.h"
+#include <map>
+
+namespace mozilla {
+
+class WidevineDecryptor : public GMPDecryptor
+ , public cdm::Host_8
+{
+public:
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WidevineDecryptor)
+
+ WidevineDecryptor();
+
+ void SetCDM(RefPtr<CDMWrapper> aCDM, uint32_t aDecryptorId);
+
+ static RefPtr<CDMWrapper> GetInstance(uint32_t aDecryptorId);
+
+ // GMPDecryptor
+ void Init(GMPDecryptorCallback* aCallback,
+ bool aDistinctiveIdentifierRequired,
+ bool aPersistentStateRequired) override;
+
+ void CreateSession(uint32_t aCreateSessionToken,
+ uint32_t aPromiseId,
+ const char* aInitDataType,
+ uint32_t aInitDataTypeSize,
+ const uint8_t* aInitData,
+ uint32_t aInitDataSize,
+ GMPSessionType aSessionType) override;
+
+ void LoadSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override;
+
+ void UpdateSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength,
+ const uint8_t* aResponse,
+ uint32_t aResponseSize) override;
+
+ void CloseSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override;
+
+ void RemoveSession(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdLength) override;
+
+ void SetServerCertificate(uint32_t aPromiseId,
+ const uint8_t* aServerCert,
+ uint32_t aServerCertSize) override;
+
+ void Decrypt(GMPBuffer* aBuffer,
+ GMPEncryptedBufferMetadata* aMetadata) override;
+
+ void DecryptingComplete() override;
+
+
+ // cdm::Host_8
+ cdm::Buffer* Allocate(uint32_t aCapacity) override;
+ void SetTimer(int64_t aDelayMs, void* aContext) override;
+ cdm::Time GetCurrentWallTime() override;
+ void OnResolveNewSessionPromise(uint32_t aPromiseId,
+ const char* aSessionId,
+ uint32_t aSessionIdSize) override;
+ void OnResolvePromise(uint32_t aPromiseId) override;
+ void OnRejectPromise(uint32_t aPromiseId,
+ cdm::Error aError,
+ uint32_t aSystemCode,
+ const char* aErrorMessage,
+ uint32_t aErrorMessageSize) override;
+ void OnSessionMessage(const char* aSessionId,
+ uint32_t aSessionIdSize,
+ cdm::MessageType aMessageType,
+ const char* aMessage,
+ uint32_t aMessageSize,
+ const char* aLegacyDestinationUrl,
+ uint32_t aLegacyDestinationUrlLength) override;
+ void OnSessionKeysChange(const char* aSessionId,
+ uint32_t aSessionIdSize,
+ bool aHasAdditionalUsableKey,
+ const cdm::KeyInformation* aKeysInfo,
+ uint32_t aKeysInfoCount) override;
+ void OnExpirationChange(const char* aSessionId,
+ uint32_t aSessionIdSize,
+ cdm::Time aNewExpiryTime) override;
+ void OnSessionClosed(const char* aSessionId,
+ uint32_t aSessionIdSize) override;
+ void OnLegacySessionError(const char* aSessionId,
+ uint32_t aSessionId_length,
+ cdm::Error aError,
+ uint32_t aSystemCode,
+ const char* aErrorMessage,
+ uint32_t aErrorMessageLength) override;
+ void SendPlatformChallenge(const char* aServiceId,
+ uint32_t aServiceIdSize,
+ const char* aChallenge,
+ uint32_t aChallengeSize) override;
+ void EnableOutputProtection(uint32_t aDesiredProtectionMask) override;
+ void QueryOutputProtectionStatus() override;
+ void OnDeferredInitializationDone(cdm::StreamType aStreamType,
+ cdm::Status aDecoderStatus) override;
+ cdm::FileIO* CreateFileIO(cdm::FileIOClient* aClient) override;
+
+ GMPDecryptorCallback* Callback() const { return mCallback; }
+ RefPtr<CDMWrapper> GetCDMWrapper() const { return mCDM; }
+private:
+ ~WidevineDecryptor();
+ RefPtr<CDMWrapper> mCDM;
+ cdm::ContentDecryptionModule_8* CDM() { return mCDM->GetCDM(); }
+
+ GMPDecryptorCallback* mCallback;
+ std::map<uint32_t, uint32_t> mPromiseIdToNewSessionTokens;
+ bool mDistinctiveIdentifierRequired = false;
+ bool mPersistentStateRequired = false;
+ uint32_t mInstanceId = 0;
+};
+
+} // namespace mozilla
+
+#endif // WidevineDecryptor_h_
diff --git a/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp b/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp
new file mode 100644
index 000000000..b5fb1d705
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineFileIO.cpp
@@ -0,0 +1,97 @@
+#include "WidevineFileIO.h"
+#include "WidevineUtils.h"
+#include "WidevineAdapter.h"
+
+using namespace cdm;
+
+namespace mozilla {
+
+void
+WidevineFileIO::Open(const char* aFilename, uint32_t aFilenameLength)
+{
+ mName = std::string(aFilename, aFilename + aFilenameLength);
+ GMPRecord* record = nullptr;
+ GMPErr err = GMPCreateRecord(aFilename, aFilenameLength, &record, static_cast<GMPRecordClient*>(this));
+ if (GMP_FAILED(err)) {
+ Log("WidevineFileIO::Open() '%s' GMPCreateRecord failed", mName.c_str());
+ mClient->OnOpenComplete(FileIOClient::kError);
+ return;
+ }
+ if (GMP_FAILED(record->Open())) {
+ Log("WidevineFileIO::Open() '%s' record open failed", mName.c_str());
+ mClient->OnOpenComplete(FileIOClient::kError);
+ return;
+ }
+
+ Log("WidevineFileIO::Open() '%s'", mName.c_str());
+ mRecord = record;
+}
+
+void
+WidevineFileIO::Read()
+{
+ if (!mRecord) {
+ Log("WidevineFileIO::Read() '%s' used uninitialized!", mName.c_str());
+ mClient->OnReadComplete(FileIOClient::kError, nullptr, 0);
+ return;
+ }
+ Log("WidevineFileIO::Read() '%s'", mName.c_str());
+ mRecord->Read();
+}
+
+void
+WidevineFileIO::Write(const uint8_t* aData, uint32_t aDataSize)
+{
+ if (!mRecord) {
+ Log("WidevineFileIO::Write() '%s' used uninitialized!", mName.c_str());
+ mClient->OnWriteComplete(FileIOClient::kError);
+ return;
+ }
+ mRecord->Write(aData, aDataSize);
+}
+
+void
+WidevineFileIO::Close()
+{
+ Log("WidevineFileIO::Close() '%s'", mName.c_str());
+ if (mRecord) {
+ mRecord->Close();
+ mRecord = nullptr;
+ }
+ delete this;
+}
+
+static FileIOClient::Status
+GMPToWidevineFileStatus(GMPErr aStatus)
+{
+ switch (aStatus) {
+ case GMPRecordInUse: return FileIOClient::kInUse;
+ case GMPNoErr: return FileIOClient::kSuccess;
+ default: return FileIOClient::kError;
+ }
+}
+
+void
+WidevineFileIO::OpenComplete(GMPErr aStatus)
+{
+ Log("WidevineFileIO::OpenComplete() '%s' status=%d", mName.c_str(), aStatus);
+ mClient->OnOpenComplete(GMPToWidevineFileStatus(aStatus));
+}
+
+void
+WidevineFileIO::ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize)
+{
+ Log("WidevineFileIO::OnReadComplete() '%s' status=%d", mName.c_str(), aStatus);
+ mClient->OnReadComplete(GMPToWidevineFileStatus(aStatus), aData, aDataSize);
+}
+
+void
+WidevineFileIO::WriteComplete(GMPErr aStatus)
+{
+ Log("WidevineFileIO::WriteComplete() '%s' status=%d", mName.c_str(), aStatus);
+ mClient->OnWriteComplete(GMPToWidevineFileStatus(aStatus));
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/widevine-adapter/WidevineFileIO.h b/dom/media/gmp/widevine-adapter/WidevineFileIO.h
new file mode 100644
index 000000000..63003d9b6
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineFileIO.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WidevineFileIO_h_
+#define WidevineFileIO_h_
+
+#include <stddef.h>
+#include "content_decryption_module.h"
+#include "gmp-api/gmp-storage.h"
+#include <string>
+
+namespace mozilla {
+
+class WidevineFileIO : public cdm::FileIO
+ , public GMPRecordClient
+{
+public:
+ explicit WidevineFileIO(cdm::FileIOClient* aClient)
+ : mClient(aClient)
+ , mRecord(nullptr)
+ {}
+
+ // cdm::FileIO
+ void Open(const char* aFilename, uint32_t aFilenameLength) override;
+ void Read() override;
+ void Write(const uint8_t* aData, uint32_t aDataSize) override;
+ void Close() override;
+
+ // GMPRecordClient
+ void OpenComplete(GMPErr aStatus) override;
+ void ReadComplete(GMPErr aStatus,
+ const uint8_t* aData,
+ uint32_t aDataSize) override;
+ void WriteComplete(GMPErr aStatus) override;
+
+private:
+ cdm::FileIOClient* mClient;
+ GMPRecord* mRecord;
+ std::string mName;
+};
+
+} // namespace mozilla
+
+#endif // WidevineFileIO_h_ \ No newline at end of file
diff --git a/dom/media/gmp/widevine-adapter/WidevineUtils.cpp b/dom/media/gmp/widevine-adapter/WidevineUtils.cpp
new file mode 100644
index 000000000..925dfe1a1
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineUtils.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WidevineUtils.h"
+#include "WidevineDecryptor.h"
+
+#include "gmp-api/gmp-errors.h"
+#include <stdarg.h>
+#include <stdio.h>
+
+namespace mozilla {
+
+#ifdef ENABLE_WIDEVINE_LOG
+void
+Log(const char* aFormat, ...)
+{
+ va_list ap;
+ va_start(ap, aFormat);
+ const size_t len = 1024;
+ char buf[len];
+ vsnprintf(buf, len, aFormat, ap);
+ va_end(ap);
+ if (getenv("GMP_LOG_FILE")) {
+ FILE* f = fopen(getenv("GMP_LOG_FILE"), "a");
+ if (f) {
+ fprintf(f, "%s\n", buf);
+ fflush(f);
+ fclose(f);
+ f = nullptr;
+ }
+ } else {
+ printf("LOG: %s\n", buf);
+ }
+}
+#endif // ENABLE_WIDEVINE_LOG
+
+GMPErr
+ToGMPErr(cdm::Status aStatus)
+{
+ switch (aStatus) {
+ case cdm::kSuccess: return GMPNoErr;
+ case cdm::kNeedMoreData: return GMPGenericErr;
+ case cdm::kNoKey: return GMPNoKeyErr;
+ case cdm::kSessionError: return GMPGenericErr;
+ case cdm::kDecryptError: return GMPCryptoErr;
+ case cdm::kDecodeError: return GMPDecodeErr;
+ case cdm::kDeferredInitialization: return GMPGenericErr;
+ default: return GMPGenericErr;
+ }
+}
+
+void InitInputBuffer(const GMPEncryptedBufferMetadata* aCrypto,
+ int64_t aTimestamp,
+ const uint8_t* aData,
+ size_t aDataSize,
+ cdm::InputBuffer &aInputBuffer,
+ nsTArray<cdm::SubsampleEntry> &aSubsamples)
+{
+ if (aCrypto) {
+ aInputBuffer.key_id = aCrypto->KeyId();
+ aInputBuffer.key_id_size = aCrypto->KeyIdSize();
+ aInputBuffer.iv = aCrypto->IV();
+ aInputBuffer.iv_size = aCrypto->IVSize();
+ aInputBuffer.num_subsamples = aCrypto->NumSubsamples();
+ aSubsamples.SetCapacity(aInputBuffer.num_subsamples);
+ const uint16_t* clear = aCrypto->ClearBytes();
+ const uint32_t* cipher = aCrypto->CipherBytes();
+ for (size_t i = 0; i < aCrypto->NumSubsamples(); i++) {
+ aSubsamples.AppendElement(cdm::SubsampleEntry(clear[i], cipher[i]));
+ }
+ }
+ aInputBuffer.data = aData;
+ aInputBuffer.data_size = aDataSize;
+ aInputBuffer.subsamples = aSubsamples.Elements();
+ aInputBuffer.timestamp = aTimestamp;
+}
+
+CDMWrapper::CDMWrapper(cdm::ContentDecryptionModule_8* aCDM,
+ WidevineDecryptor* aDecryptor)
+ : mCDM(aCDM)
+ , mDecryptor(aDecryptor)
+{
+ MOZ_ASSERT(mCDM);
+}
+
+CDMWrapper::~CDMWrapper()
+{
+ Log("CDMWrapper destroying CDM=%p", mCDM);
+ mCDM->Destroy();
+ mCDM = nullptr;
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/widevine-adapter/WidevineUtils.h b/dom/media/gmp/widevine-adapter/WidevineUtils.h
new file mode 100644
index 000000000..57c004a87
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineUtils.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WidevineUtils_h_
+#define WidevineUtils_h_
+
+#include "stddef.h"
+#include "content_decryption_module.h"
+#include "gmp-api/gmp-decryption.h"
+#include "gmp-api/gmp-platform.h"
+#include "nsISupportsImpl.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+// Uncomment for logging...
+//#define ENABLE_WIDEVINE_LOG 1
+#ifdef ENABLE_WIDEVINE_LOG
+void
+Log(const char* aFormat, ...);
+#else
+#define Log(...)
+#endif // ENABLE_WIDEVINE_LOG
+
+
+#define ENSURE_TRUE(condition, rv) { \
+ if (!(condition)) {\
+ Log("ENSURE_TRUE FAILED %s:%d", __FILE__, __LINE__); \
+ return rv; \
+ } \
+} \
+
+#define ENSURE_GMP_SUCCESS(err, rv) { \
+ if (GMP_FAILED(err)) {\
+ Log("ENSURE_GMP_SUCCESS FAILED %s:%d", __FILE__, __LINE__); \
+ return rv; \
+ } \
+} \
+
+GMPErr
+ToGMPErr(cdm::Status aStatus);
+
+class WidevineDecryptor;
+
+class CDMWrapper {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CDMWrapper)
+
+ explicit CDMWrapper(cdm::ContentDecryptionModule_8* aCDM,
+ WidevineDecryptor* aDecryptor);
+ cdm::ContentDecryptionModule_8* GetCDM() const { return mCDM; }
+private:
+ ~CDMWrapper();
+ cdm::ContentDecryptionModule_8* mCDM;
+ RefPtr<WidevineDecryptor> mDecryptor;
+};
+
+void InitInputBuffer(const GMPEncryptedBufferMetadata* aCrypto,
+ int64_t aTimestamp,
+ const uint8_t* aData,
+ size_t aDataSize,
+ cdm::InputBuffer &aInputBuffer,
+ nsTArray<cdm::SubsampleEntry> &aSubsamples);
+
+} // namespace mozilla
+
+#endif // WidevineUtils_h_
diff --git a/dom/media/gmp/widevine-adapter/WidevineVideoDecoder.cpp b/dom/media/gmp/widevine-adapter/WidevineVideoDecoder.cpp
new file mode 100644
index 000000000..70d2fd8e0
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineVideoDecoder.cpp
@@ -0,0 +1,400 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WidevineVideoDecoder.h"
+
+#include "mp4_demuxer/AnnexB.h"
+#include "WidevineUtils.h"
+#include "WidevineVideoFrame.h"
+#include "mozilla/Move.h"
+
+using namespace cdm;
+
+namespace mozilla {
+
+WidevineVideoDecoder::WidevineVideoDecoder(GMPVideoHost* aVideoHost,
+ RefPtr<CDMWrapper> aCDMWrapper)
+ : mVideoHost(aVideoHost)
+ , mCDMWrapper(Move(aCDMWrapper))
+ , mExtraData(new MediaByteBuffer())
+ , mSentInput(false)
+ , mCodecType(kGMPVideoCodecInvalid)
+ , mReturnOutputCallDepth(0)
+ , mDrainPending(false)
+ , mResetInProgress(false)
+{
+ // Expect to start with a CDM wrapper, will release it in DecodingComplete().
+ MOZ_ASSERT(mCDMWrapper);
+ Log("WidevineVideoDecoder created this=%p", this);
+
+ // Corresponding Release is in DecodingComplete().
+ AddRef();
+}
+
+WidevineVideoDecoder::~WidevineVideoDecoder()
+{
+ Log("WidevineVideoDecoder destroyed this=%p", this);
+}
+
+static
+VideoDecoderConfig::VideoCodecProfile
+ToCDMH264Profile(uint8_t aProfile)
+{
+ switch (aProfile) {
+ case 66: return VideoDecoderConfig::kH264ProfileBaseline;
+ case 77: return VideoDecoderConfig::kH264ProfileMain;
+ case 88: return VideoDecoderConfig::kH264ProfileExtended;
+ case 100: return VideoDecoderConfig::kH264ProfileHigh;
+ case 110: return VideoDecoderConfig::kH264ProfileHigh10;
+ case 122: return VideoDecoderConfig::kH264ProfileHigh422;
+ case 144: return VideoDecoderConfig::kH264ProfileHigh444Predictive;
+ }
+ return VideoDecoderConfig::kUnknownVideoCodecProfile;
+}
+
+void
+WidevineVideoDecoder::InitDecode(const GMPVideoCodec& aCodecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificLength,
+ GMPVideoDecoderCallback* aCallback,
+ int32_t aCoreCount)
+{
+ mCallback = aCallback;
+ VideoDecoderConfig config;
+ mCodecType = aCodecSettings.mCodecType;
+ if (mCodecType == kGMPVideoCodecH264) {
+ config.codec = VideoDecoderConfig::kCodecH264;
+ const GMPVideoCodecH264* h264 = (const GMPVideoCodecH264*)(aCodecSpecific);
+ config.profile = ToCDMH264Profile(h264->mAVCC.mProfile);
+ } else if (mCodecType == kGMPVideoCodecVP8) {
+ config.codec = VideoDecoderConfig::kCodecVp8;
+ config.profile = VideoDecoderConfig::kProfileNotNeeded;
+ } else if (mCodecType == kGMPVideoCodecVP9) {
+ config.codec = VideoDecoderConfig::kCodecVp9;
+ config.profile = VideoDecoderConfig::kProfileNotNeeded;
+ } else {
+ mCallback->Error(GMPInvalidArgErr);
+ return;
+ }
+ config.format = kYv12;
+ config.coded_size = Size(aCodecSettings.mWidth, aCodecSettings.mHeight);
+ mExtraData->AppendElements(aCodecSpecific + 1, aCodecSpecificLength);
+ config.extra_data = mExtraData->Elements();
+ config.extra_data_size = mExtraData->Length();
+ Status rv = CDM()->InitializeVideoDecoder(config);
+ if (rv != kSuccess) {
+ mCallback->Error(ToGMPErr(rv));
+ return;
+ }
+ Log("WidevineVideoDecoder::InitDecode() rv=%d", rv);
+ mAnnexB = mp4_demuxer::AnnexB::ConvertExtraDataToAnnexB(mExtraData);
+}
+
+void
+WidevineVideoDecoder::Decode(GMPVideoEncodedFrame* aInputFrame,
+ bool aMissingFrames,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ int64_t aRenderTimeMs)
+{
+ // We should not be given new input if a drain has been initiated
+ MOZ_ASSERT(!mDrainPending);
+ // We may not get the same out of the CDM decoder as we put in, and there
+ // may be some latency, i.e. we may need to input (say) 30 frames before
+ // we receive output. So we need to store the durations of the frames input,
+ // and retrieve them on output.
+ mFrameDurations[aInputFrame->TimeStamp()] = aInputFrame->Duration();
+
+ mSentInput = true;
+ InputBuffer sample;
+
+ RefPtr<MediaRawData> raw(
+ new MediaRawData(aInputFrame->Buffer(), aInputFrame->Size()));
+ if (aInputFrame->Size() && !raw->Data()) {
+ // OOM.
+ mCallback->Error(GMPAllocErr);
+ return;
+ }
+ raw->mExtraData = mExtraData;
+ raw->mKeyframe = (aInputFrame->FrameType() == kGMPKeyFrame);
+ if (mCodecType == kGMPVideoCodecH264) {
+ // Convert input from AVCC, which GMPAPI passes in, to AnnexB, which
+ // Chromium uses internally.
+ mp4_demuxer::AnnexB::ConvertSampleToAnnexB(raw);
+ }
+
+ const GMPEncryptedBufferMetadata* crypto = aInputFrame->GetDecryptionData();
+ nsTArray<SubsampleEntry> subsamples;
+ InitInputBuffer(crypto, aInputFrame->TimeStamp(), raw->Data(), raw->Size(), sample, subsamples);
+
+ // For keyframes, ConvertSampleToAnnexB will stick the AnnexB extra data
+ // at the start of the input. So we need to account for that as clear data
+ // in the subsamples.
+ if (raw->mKeyframe && !subsamples.IsEmpty() && mCodecType == kGMPVideoCodecH264) {
+ subsamples[0].clear_bytes += mAnnexB->Length();
+ }
+
+ WidevineVideoFrame frame;
+ Status rv = CDM()->DecryptAndDecodeFrame(sample, &frame);
+ Log("WidevineVideoDecoder::Decode(timestamp=%lld) rv=%d", sample.timestamp, rv);
+
+ // Destroy frame, so that the shmem is now free to be used to return
+ // output to the Gecko process.
+ aInputFrame->Destroy();
+ aInputFrame = nullptr;
+
+ if (rv == kSuccess) {
+ if (!ReturnOutput(frame)) {
+ Log("WidevineVideoDecoder::Decode() Failed in ReturnOutput()");
+ mCallback->Error(GMPDecodeErr);
+ return;
+ }
+ // A reset should only be started at most at level mReturnOutputCallDepth 1,
+ // and if it's started it should be finished by that call by the time
+ // the it returns, so it should always be false by this point.
+ MOZ_ASSERT(!mResetInProgress);
+ // Only request more data if we don't have pending samples.
+ if (mFrameAllocationQueue.empty()) {
+ MOZ_ASSERT(mCDMWrapper);
+ mCallback->InputDataExhausted();
+ }
+ } else if (rv == kNeedMoreData) {
+ MOZ_ASSERT(mCDMWrapper);
+ mCallback->InputDataExhausted();
+ } else {
+ mCallback->Error(ToGMPErr(rv));
+ }
+ // Finish a drain if pending and we have no pending ReturnOutput calls on the stack.
+ if (mDrainPending && mReturnOutputCallDepth == 0) {
+ Drain();
+ }
+}
+
+// Util class to assist with counting mReturnOutputCallDepth.
+class CounterHelper {
+public:
+ // RAII, increment counter
+ explicit CounterHelper(int32_t& counter)
+ : mCounter(counter)
+ {
+ mCounter++;
+ }
+
+ // RAII, decrement counter
+ ~CounterHelper()
+ {
+ mCounter--;
+ }
+
+private:
+ int32_t& mCounter;
+};
+
+// Util class to make sure GMP frames are freed. Holds a GMPVideoi420Frame*
+// and will destroy it when the helper is destroyed unless the held frame
+// if forgotten with ForgetFrame.
+class FrameDestroyerHelper {
+public:
+ explicit FrameDestroyerHelper(GMPVideoi420Frame*& frame)
+ : frame(frame)
+ {
+ }
+
+ // RAII, destroy frame if held.
+ ~FrameDestroyerHelper()
+ {
+ if (frame) {
+ frame->Destroy();
+ }
+ frame = nullptr;
+ }
+
+ // Forget the frame without destroying it.
+ void ForgetFrame()
+ {
+ frame = nullptr;
+ }
+
+private:
+ GMPVideoi420Frame* frame;
+};
+
+
+// Special handing is needed around ReturnOutput as it spins the IPC message
+// queue when creating an empty frame and can end up with reentrant calls into
+// the class methods.
+bool
+WidevineVideoDecoder::ReturnOutput(WidevineVideoFrame& aCDMFrame)
+{
+ MOZ_ASSERT(mReturnOutputCallDepth >= 0);
+ CounterHelper counterHelper(mReturnOutputCallDepth);
+ mFrameAllocationQueue.push_back(Move(aCDMFrame));
+ if (mReturnOutputCallDepth > 1) {
+ // In a reentrant call.
+ return true;
+ }
+ while (!mFrameAllocationQueue.empty()) {
+ MOZ_ASSERT(mReturnOutputCallDepth == 1);
+ // If we're at call level 1 a reset should not have been started. A
+ // reset may be received during CreateEmptyFrame below, but we should not
+ // be in a reset at this stage -- this would indicate receiving decode
+ // messages before completing our reset, which we should not.
+ MOZ_ASSERT(!mResetInProgress);
+ WidevineVideoFrame currentCDMFrame = Move(mFrameAllocationQueue.front());
+ mFrameAllocationQueue.pop_front();
+ GMPVideoFrame* f = nullptr;
+ auto err = mVideoHost->CreateFrame(kGMPI420VideoFrame, &f);
+ if (GMP_FAILED(err) || !f) {
+ Log("Failed to create i420 frame!\n");
+ return false;
+ }
+ auto gmpFrame = static_cast<GMPVideoi420Frame*>(f);
+ FrameDestroyerHelper frameDestroyerHelper(gmpFrame);
+ Size size = currentCDMFrame.Size();
+ const int32_t yStride = currentCDMFrame.Stride(VideoFrame::kYPlane);
+ const int32_t uStride = currentCDMFrame.Stride(VideoFrame::kUPlane);
+ const int32_t vStride = currentCDMFrame.Stride(VideoFrame::kVPlane);
+ const int32_t halfHeight = size.height / 2;
+ // This call can cause a shmem alloc, during this alloc other calls
+ // may be made to this class and placed on the stack. ***WARNING***:
+ // other IPC calls can happen during this call, resulting in calls
+ // being made to the CDM. After this call state can have changed,
+ // and should be reevaluated.
+ err = gmpFrame->CreateEmptyFrame(size.width,
+ size.height,
+ yStride,
+ uStride,
+ vStride);
+ // Assert possible reentrant calls or resets haven't altered level unexpectedly.
+ MOZ_ASSERT(mReturnOutputCallDepth == 1);
+ ENSURE_GMP_SUCCESS(err, false);
+
+ // If a reset started we need to dump the current frame and complete the reset.
+ if (mResetInProgress) {
+ MOZ_ASSERT(mCDMWrapper);
+ MOZ_ASSERT(mFrameAllocationQueue.empty());
+ CompleteReset();
+ return true;
+ }
+
+ err = gmpFrame->SetWidth(size.width);
+ ENSURE_GMP_SUCCESS(err, false);
+
+ err = gmpFrame->SetHeight(size.height);
+ ENSURE_GMP_SUCCESS(err, false);
+
+ Buffer* buffer = currentCDMFrame.FrameBuffer();
+ uint8_t* outBuffer = gmpFrame->Buffer(kGMPYPlane);
+ ENSURE_TRUE(outBuffer != nullptr, false);
+ MOZ_ASSERT(gmpFrame->AllocatedSize(kGMPYPlane) >= yStride*size.height);
+ memcpy(outBuffer,
+ buffer->Data() + currentCDMFrame.PlaneOffset(VideoFrame::kYPlane),
+ yStride * size.height);
+
+ outBuffer = gmpFrame->Buffer(kGMPUPlane);
+ ENSURE_TRUE(outBuffer != nullptr, false);
+ MOZ_ASSERT(gmpFrame->AllocatedSize(kGMPUPlane) >= uStride * halfHeight);
+ memcpy(outBuffer,
+ buffer->Data() + currentCDMFrame.PlaneOffset(VideoFrame::kUPlane),
+ uStride * halfHeight);
+
+ outBuffer = gmpFrame->Buffer(kGMPVPlane);
+ ENSURE_TRUE(outBuffer != nullptr, false);
+ MOZ_ASSERT(gmpFrame->AllocatedSize(kGMPVPlane) >= vStride * halfHeight);
+ memcpy(outBuffer,
+ buffer->Data() + currentCDMFrame.PlaneOffset(VideoFrame::kVPlane),
+ vStride * halfHeight);
+
+ gmpFrame->SetTimestamp(currentCDMFrame.Timestamp());
+
+ auto d = mFrameDurations.find(currentCDMFrame.Timestamp());
+ if (d != mFrameDurations.end()) {
+ gmpFrame->SetDuration(d->second);
+ mFrameDurations.erase(d);
+ }
+
+ // Forget frame so it's not deleted, call back taking ownership.
+ frameDestroyerHelper.ForgetFrame();
+ mCallback->Decoded(gmpFrame);
+ }
+
+ return true;
+}
+
+void
+WidevineVideoDecoder::Reset()
+{
+ Log("WidevineVideoDecoder::Reset() mSentInput=%d", mSentInput);
+ // We shouldn't reset if a drain is pending.
+ MOZ_ASSERT(!mDrainPending);
+ mResetInProgress = true;
+ if (mSentInput) {
+ CDM()->ResetDecoder(kStreamTypeVideo);
+ }
+ // Remove queued frames, but do not reset mReturnOutputCallDepth, let the
+ // ReturnOutput calls unwind and decrement the counter as needed.
+ mFrameAllocationQueue.clear();
+ mFrameDurations.clear();
+ // Only if no ReturnOutput calls are in progress can we complete, otherwise
+ // ReturnOutput needs to finalize the reset.
+ if (mReturnOutputCallDepth == 0) {
+ CompleteReset();
+ }
+}
+
+void
+WidevineVideoDecoder::CompleteReset()
+{
+ mCallback->ResetComplete();
+ mSentInput = false;
+ mResetInProgress = false;
+}
+
+void
+WidevineVideoDecoder::Drain()
+{
+ Log("WidevineVideoDecoder::Drain()");
+ if (mReturnOutputCallDepth > 0) {
+ Log("Drain call is reentrant, postponing drain");
+ mDrainPending = true;
+ return;
+ }
+
+ Status rv = kSuccess;
+ while (rv == kSuccess) {
+ WidevineVideoFrame frame;
+ InputBuffer sample;
+ Status rv = CDM()->DecryptAndDecodeFrame(sample, &frame);
+ Log("WidevineVideoDecoder::Drain(); DecryptAndDecodeFrame() rv=%d", rv);
+ if (frame.Format() == kUnknownVideoFormat) {
+ break;
+ }
+ if (rv == kSuccess) {
+ if (!ReturnOutput(frame)) {
+ Log("WidevineVideoDecoder::Decode() Failed in ReturnOutput()");
+ }
+ }
+ }
+ // Shouldn't be reset while draining.
+ MOZ_ASSERT(!mResetInProgress);
+
+ CDM()->ResetDecoder(kStreamTypeVideo);
+ mDrainPending = false;
+ mCallback->DrainComplete();
+}
+
+void
+WidevineVideoDecoder::DecodingComplete()
+{
+ Log("WidevineVideoDecoder::DecodingComplete()");
+ if (mCDMWrapper) {
+ CDM()->DeinitializeDecoder(kStreamTypeVideo);
+ mCDMWrapper = nullptr;
+ }
+ // Release that corresponds to AddRef() in constructor.
+ Release();
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/widevine-adapter/WidevineVideoDecoder.h b/dom/media/gmp/widevine-adapter/WidevineVideoDecoder.h
new file mode 100644
index 000000000..b143f75f7
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineVideoDecoder.h
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WidevineVideoDecoder_h_
+#define WidevineVideoDecoder_h_
+
+#include "stddef.h"
+#include "content_decryption_module.h"
+#include "gmp-api/gmp-video-decode.h"
+#include "gmp-api/gmp-video-host.h"
+#include "MediaData.h"
+#include "nsISupportsImpl.h"
+#include "nsTArray.h"
+#include "WidevineDecryptor.h"
+#include "WidevineVideoFrame.h"
+#include <map>
+#include <deque>
+
+namespace mozilla {
+
+class WidevineVideoDecoder : public GMPVideoDecoder {
+public:
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WidevineVideoDecoder)
+
+ WidevineVideoDecoder(GMPVideoHost* aVideoHost,
+ RefPtr<CDMWrapper> aCDMWrapper);
+ void InitDecode(const GMPVideoCodec& aCodecSettings,
+ const uint8_t* aCodecSpecific,
+ uint32_t aCodecSpecificLength,
+ GMPVideoDecoderCallback* aCallback,
+ int32_t aCoreCount) override;
+ void Decode(GMPVideoEncodedFrame* aInputFrame,
+ bool aMissingFrames,
+ const uint8_t* aCodecSpecificInfo,
+ uint32_t aCodecSpecificInfoLength,
+ int64_t aRenderTimeMs = -1) override;
+ void Reset() override;
+ void Drain() override;
+ void DecodingComplete() override;
+
+private:
+
+ ~WidevineVideoDecoder();
+
+ cdm::ContentDecryptionModule_8* CDM() const {
+ // CDM should only be accessed before 'DecodingComplete'.
+ MOZ_ASSERT(mCDMWrapper);
+ // CDMWrapper ensure the CDM is non-null, no need to check again.
+ return mCDMWrapper->GetCDM();
+ }
+
+ bool ReturnOutput(WidevineVideoFrame& aFrame);
+ void CompleteReset();
+
+ GMPVideoHost* mVideoHost;
+ RefPtr<CDMWrapper> mCDMWrapper;
+ RefPtr<MediaByteBuffer> mExtraData;
+ RefPtr<MediaByteBuffer> mAnnexB;
+ GMPVideoDecoderCallback* mCallback;
+ std::map<uint64_t, uint64_t> mFrameDurations;
+ bool mSentInput;
+ GMPVideoCodecType mCodecType;
+ // Frames waiting on allocation
+ std::deque<WidevineVideoFrame> mFrameAllocationQueue;
+ // Number of calls of ReturnOutput currently in progress.
+ int32_t mReturnOutputCallDepth;
+ // If we're waiting to drain. Used to prevent drain completing while
+ // ReturnOutput calls are still on the stack.
+ bool mDrainPending;
+ // If a reset is being performed. Used to track if ReturnOutput should
+ // dump current frame.
+ bool mResetInProgress;
+};
+
+} // namespace mozilla
+
+#endif // WidevineVideoDecoder_h_
diff --git a/dom/media/gmp/widevine-adapter/WidevineVideoFrame.cpp b/dom/media/gmp/widevine-adapter/WidevineVideoFrame.cpp
new file mode 100644
index 000000000..4221bf15b
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineVideoFrame.cpp
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WidevineVideoFrame.h"
+
+#include "WidevineUtils.h"
+
+using namespace cdm;
+
+namespace mozilla {
+
+WidevineVideoFrame::WidevineVideoFrame()
+ : mFormat(kUnknownVideoFormat)
+ , mSize(0,0)
+ , mBuffer(nullptr)
+ , mTimestamp(0)
+{
+ Log("WidevineVideoFrame::WidevineVideoFrame() this=%p", this);
+ memset(mPlaneOffsets, 0, sizeof(mPlaneOffsets));
+ memset(mPlaneStrides, 0, sizeof(mPlaneStrides));
+}
+
+WidevineVideoFrame::WidevineVideoFrame(WidevineVideoFrame&& aOther)
+ : mFormat(aOther.mFormat)
+ , mSize(aOther.mSize)
+ , mBuffer(aOther.mBuffer)
+ , mTimestamp(aOther.mTimestamp)
+{
+ Log("WidevineVideoFrame::WidevineVideoFrame(WidevineVideoFrame&&) this=%p, other=%p",
+ this, &aOther);
+ memcpy(mPlaneOffsets, aOther.mPlaneOffsets, sizeof(mPlaneOffsets));
+ memcpy(mPlaneStrides, aOther.mPlaneStrides, sizeof(mPlaneStrides));
+ aOther.mBuffer = nullptr;
+}
+
+WidevineVideoFrame::~WidevineVideoFrame()
+{
+ if (mBuffer) {
+ mBuffer->Destroy();
+ mBuffer = nullptr;
+ }
+}
+
+void
+WidevineVideoFrame::SetFormat(cdm::VideoFormat aFormat)
+{
+ Log("WidevineVideoFrame::SetFormat(%d) this=%p", aFormat, this);
+ mFormat = aFormat;
+}
+
+cdm::VideoFormat
+WidevineVideoFrame::Format() const
+{
+ return mFormat;
+}
+
+void
+WidevineVideoFrame::SetSize(cdm::Size aSize)
+{
+ Log("WidevineVideoFrame::SetSize(%d,%d) this=%p", aSize.width, aSize.height, this);
+ mSize.width = aSize.width;
+ mSize.height = aSize.height;
+}
+
+cdm::Size
+WidevineVideoFrame::Size() const
+{
+ return mSize;
+}
+
+void
+WidevineVideoFrame::SetFrameBuffer(cdm::Buffer* aFrameBuffer)
+{
+ Log("WidevineVideoFrame::SetFrameBuffer(%p) this=%p", aFrameBuffer, this);
+ MOZ_ASSERT(!mBuffer);
+ mBuffer = aFrameBuffer;
+}
+
+cdm::Buffer*
+WidevineVideoFrame::FrameBuffer()
+{
+ return mBuffer;
+}
+
+void
+WidevineVideoFrame::SetPlaneOffset(cdm::VideoFrame::VideoPlane aPlane, uint32_t aOffset)
+{
+ Log("WidevineVideoFrame::SetPlaneOffset(%d, %d) this=%p", aPlane, aOffset, this);
+ mPlaneOffsets[aPlane] = aOffset;
+}
+
+uint32_t
+WidevineVideoFrame::PlaneOffset(cdm::VideoFrame::VideoPlane aPlane)
+{
+ return mPlaneOffsets[aPlane];
+}
+
+void
+WidevineVideoFrame::SetStride(cdm::VideoFrame::VideoPlane aPlane, uint32_t aStride)
+{
+ Log("WidevineVideoFrame::SetStride(%d, %d) this=%p", aPlane, aStride, this);
+ mPlaneStrides[aPlane] = aStride;
+}
+
+uint32_t
+WidevineVideoFrame::Stride(cdm::VideoFrame::VideoPlane aPlane)
+{
+ return mPlaneStrides[aPlane];
+}
+
+void
+WidevineVideoFrame::SetTimestamp(int64_t timestamp)
+{
+ Log("WidevineVideoFrame::SetTimestamp(%lld) this=%p", timestamp, this);
+ mTimestamp = timestamp;
+}
+
+int64_t
+WidevineVideoFrame::Timestamp() const
+{
+ return mTimestamp;
+}
+
+} // namespace mozilla
diff --git a/dom/media/gmp/widevine-adapter/WidevineVideoFrame.h b/dom/media/gmp/widevine-adapter/WidevineVideoFrame.h
new file mode 100644
index 000000000..96d4f20f8
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/WidevineVideoFrame.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WidevineVideoFrame_h_
+#define WidevineVideoFrame_h_
+
+#include "stddef.h"
+#include "content_decryption_module.h"
+#include <vector>
+
+namespace mozilla {
+
+class WidevineVideoFrame : public cdm::VideoFrame {
+public:
+ WidevineVideoFrame();
+ WidevineVideoFrame(WidevineVideoFrame&& other);
+ ~WidevineVideoFrame();
+
+ void SetFormat(cdm::VideoFormat aFormat) override;
+ cdm::VideoFormat Format() const override;
+
+ void SetSize(cdm::Size aSize) override;
+ cdm::Size Size() const override;
+
+ void SetFrameBuffer(cdm::Buffer* aFrameBuffer) override;
+ cdm::Buffer* FrameBuffer() override;
+
+ void SetPlaneOffset(cdm::VideoFrame::VideoPlane aPlane, uint32_t aOffset) override;
+ uint32_t PlaneOffset(cdm::VideoFrame::VideoPlane aPlane) override;
+
+ void SetStride(cdm::VideoFrame::VideoPlane aPlane, uint32_t aStride) override;
+ uint32_t Stride(cdm::VideoFrame::VideoPlane aPlane) override;
+
+ void SetTimestamp(int64_t aTimestamp) override;
+ int64_t Timestamp() const override;
+
+protected:
+ cdm::VideoFormat mFormat;
+ cdm::Size mSize;
+ cdm::Buffer* mBuffer;
+ uint32_t mPlaneOffsets[kMaxPlanes];
+ uint32_t mPlaneStrides[kMaxPlanes];
+ int64_t mTimestamp;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/gmp/widevine-adapter/content_decryption_module.h b/dom/media/gmp/widevine-adapter/content_decryption_module.h
new file mode 100644
index 000000000..512ca9768
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/content_decryption_module.h
@@ -0,0 +1,1199 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CDM_CONTENT_DECRYPTION_MODULE_H_
+#define CDM_CONTENT_DECRYPTION_MODULE_H_
+
+#if defined(_MSC_VER)
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef int int32_t;
+typedef __int64 int64_t;
+#else
+#include <stdint.h>
+#endif
+
+// Define CDM_EXPORT so that functionality implemented by the CDM module
+// can be exported to consumers.
+#if defined(WIN32)
+
+#if defined(CDM_IMPLEMENTATION)
+#define CDM_EXPORT __declspec(dllexport)
+#else
+#define CDM_EXPORT __declspec(dllimport)
+#endif // defined(CDM_IMPLEMENTATION)
+
+#else // defined(WIN32)
+
+#if defined(CDM_IMPLEMENTATION)
+#define CDM_EXPORT __attribute__((visibility("default")))
+#else
+#define CDM_EXPORT
+#endif
+
+#endif // defined(WIN32)
+
+// The version number must be rolled when the exported functions are updated!
+// If the CDM and the adapter use different versions of these functions, the
+// adapter will fail to load or crash!
+#define CDM_MODULE_VERSION 4
+
+// Build the versioned entrypoint name.
+// The extra macros are necessary to expand version to an actual value.
+#define INITIALIZE_CDM_MODULE \
+ BUILD_ENTRYPOINT(InitializeCdmModule, CDM_MODULE_VERSION)
+#define BUILD_ENTRYPOINT(name, version) \
+ BUILD_ENTRYPOINT_NO_EXPANSION(name, version)
+#define BUILD_ENTRYPOINT_NO_EXPANSION(name, version) name##_##version
+
+extern "C" {
+CDM_EXPORT void INITIALIZE_CDM_MODULE();
+
+CDM_EXPORT void DeinitializeCdmModule();
+
+// Returns a pointer to the requested CDM Host interface upon success.
+// Returns NULL if the requested CDM Host interface is not supported.
+// The caller should cast the returned pointer to the type matching
+// |host_interface_version|.
+typedef void* (*GetCdmHostFunc)(int host_interface_version, void* user_data);
+
+// Returns a pointer to the requested CDM upon success.
+// Returns NULL if an error occurs or the requested |cdm_interface_version| or
+// |key_system| is not supported or another error occurs.
+// The caller should cast the returned pointer to the type matching
+// |cdm_interface_version|.
+// Caller retains ownership of arguments and must call Destroy() on the returned
+// object.
+CDM_EXPORT void* CreateCdmInstance(
+ int cdm_interface_version,
+ const char* key_system, uint32_t key_system_size,
+ GetCdmHostFunc get_cdm_host_func, void* user_data);
+
+CDM_EXPORT const char* GetCdmVersion();
+}
+
+namespace cdm {
+
+class AudioFrames;
+class DecryptedBlock;
+class VideoFrame;
+
+class Host_7;
+class Host_8;
+
+enum Status {
+ kSuccess = 0,
+ kNeedMoreData, // Decoder needs more data to produce a decoded frame/sample.
+ kNoKey, // The required decryption key is not available.
+ kSessionError, // Session management error.
+ kDecryptError, // Decryption failed.
+ kDecodeError, // Error decoding audio or video.
+ kDeferredInitialization // Decoder is not ready for initialization.
+};
+
+// This must at least contain the exceptions defined in the spec:
+// https://w3c.github.io/encrypted-media/#exceptions
+// The following starts with the list of DOM4 exceptions from:
+// http://www.w3.org/TR/dom/#domexception
+// Some DOM4 exceptions are not included as they are not expected to be used.
+enum Error {
+ kNotSupportedError = 9,
+ kInvalidStateError = 11,
+ kInvalidAccessError = 15,
+ kQuotaExceededError = 22,
+
+ // Additional exceptions that do not have assigned codes.
+ // There are other non-EME-specific values, not included in this list.
+ kUnknownError = 30,
+
+ // Additional values from previous EME versions. They currently have no
+ // matching DOMException.
+ kClientError = 100,
+ kOutputError = 101
+};
+
+// Time is defined as the number of seconds since the
+// Epoch (00:00:00 UTC, January 1, 1970).
+typedef double Time;
+
+// An input buffer can be split into several continuous subsamples.
+// A SubsampleEntry specifies the number of clear and cipher bytes in each
+// subsample. For example, the following buffer has three subsamples:
+//
+// |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
+// | clear1 | cipher1 | clear2 | cipher2 | clear3 | cipher3 |
+//
+// For decryption, all of the cipher bytes in a buffer should be concatenated
+// (in the subsample order) into a single logical stream. The clear bytes should
+// not be considered as part of decryption.
+//
+// Stream to decrypt: | cipher1 | cipher2 | cipher3 |
+// Decrypted stream: | decrypted1| decrypted2 | decrypted3 |
+//
+// After decryption, the decrypted bytes should be copied over the position
+// of the corresponding cipher bytes in the original buffer to form the output
+// buffer. Following the above example, the decrypted buffer should be:
+//
+// |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
+// | clear1 | decrypted1| clear2 | decrypted2 | clear3 | decrypted3 |
+//
+struct SubsampleEntry {
+ SubsampleEntry(uint32_t clear_bytes, uint32_t cipher_bytes)
+ : clear_bytes(clear_bytes), cipher_bytes(cipher_bytes) {}
+
+ uint32_t clear_bytes;
+ uint32_t cipher_bytes;
+};
+
+// Represents an input buffer to be decrypted (and possibly decoded). It does
+// not own any pointers in this struct. If |iv_size| = 0, the data is
+// unencrypted.
+struct InputBuffer {
+ InputBuffer()
+ : data(NULL),
+ data_size(0),
+ key_id(NULL),
+ key_id_size(0),
+ iv(NULL),
+ iv_size(0),
+ subsamples(NULL),
+ num_subsamples(0),
+ timestamp(0) {}
+
+ const uint8_t* data; // Pointer to the beginning of the input data.
+ uint32_t data_size; // Size (in bytes) of |data|.
+
+ const uint8_t* key_id; // Key ID to identify the decryption key.
+ uint32_t key_id_size; // Size (in bytes) of |key_id|.
+
+ const uint8_t* iv; // Initialization vector.
+ uint32_t iv_size; // Size (in bytes) of |iv|.
+
+ const struct SubsampleEntry* subsamples;
+ uint32_t num_subsamples; // Number of subsamples in |subsamples|.
+
+ int64_t timestamp; // Presentation timestamp in microseconds.
+};
+
+struct AudioDecoderConfig {
+ enum AudioCodec {
+ kUnknownAudioCodec = 0,
+ kCodecVorbis,
+ kCodecAac
+ };
+
+ AudioDecoderConfig()
+ : codec(kUnknownAudioCodec),
+ channel_count(0),
+ bits_per_channel(0),
+ samples_per_second(0),
+ extra_data(NULL),
+ extra_data_size(0) {}
+
+ AudioCodec codec;
+ int32_t channel_count;
+ int32_t bits_per_channel;
+ int32_t samples_per_second;
+
+ // Optional byte data required to initialize audio decoders, such as the
+ // vorbis setup header.
+ uint8_t* extra_data;
+ uint32_t extra_data_size;
+};
+
+// Supported sample formats for AudioFrames.
+enum AudioFormat {
+ kUnknownAudioFormat = 0, // Unknown format value. Used for error reporting.
+ kAudioFormatU8, // Interleaved unsigned 8-bit w/ bias of 128.
+ kAudioFormatS16, // Interleaved signed 16-bit.
+ kAudioFormatS32, // Interleaved signed 32-bit.
+ kAudioFormatF32, // Interleaved float 32-bit.
+ kAudioFormatPlanarS16, // Signed 16-bit planar.
+ kAudioFormatPlanarF32, // Float 32-bit planar.
+};
+
+// Surface formats based on FOURCC labels, see: http://www.fourcc.org/yuv.php
+enum VideoFormat {
+ kUnknownVideoFormat = 0, // Unknown format value. Used for error reporting.
+ kYv12, // 12bpp YVU planar 1x1 Y, 2x2 VU samples.
+ kI420 // 12bpp YVU planar 1x1 Y, 2x2 UV samples.
+};
+
+struct Size {
+ Size() : width(0), height(0) {}
+ Size(int32_t width, int32_t height) : width(width), height(height) {}
+
+ int32_t width;
+ int32_t height;
+};
+
+struct VideoDecoderConfig {
+ enum VideoCodec {
+ kUnknownVideoCodec = 0,
+ kCodecVp8,
+ kCodecH264,
+ kCodecVp9
+ };
+
+ enum VideoCodecProfile {
+ kUnknownVideoCodecProfile = 0,
+ kProfileNotNeeded,
+ kH264ProfileBaseline,
+ kH264ProfileMain,
+ kH264ProfileExtended,
+ kH264ProfileHigh,
+ kH264ProfileHigh10,
+ kH264ProfileHigh422,
+ kH264ProfileHigh444Predictive
+ };
+
+ VideoDecoderConfig()
+ : codec(kUnknownVideoCodec),
+ profile(kUnknownVideoCodecProfile),
+ format(kUnknownVideoFormat),
+ extra_data(NULL),
+ extra_data_size(0) {}
+
+ VideoCodec codec;
+ VideoCodecProfile profile;
+ VideoFormat format;
+
+ // Width and height of video frame immediately post-decode. Not all pixels
+ // in this region are valid.
+ Size coded_size;
+
+ // Optional byte data required to initialize video decoders, such as H.264
+ // AAVC data.
+ uint8_t* extra_data;
+ uint32_t extra_data_size;
+};
+
+enum StreamType {
+ kStreamTypeAudio = 0,
+ kStreamTypeVideo = 1
+};
+
+// Structure provided to ContentDecryptionModule::OnPlatformChallengeResponse()
+// after a platform challenge was initiated via Host::SendPlatformChallenge().
+// All values will be NULL / zero in the event of a challenge failure.
+struct PlatformChallengeResponse {
+ // |challenge| provided during Host::SendPlatformChallenge() combined with
+ // nonce data and signed with the platform's private key.
+ const uint8_t* signed_data;
+ uint32_t signed_data_length;
+
+ // RSASSA-PKCS1-v1_5-SHA256 signature of the |signed_data| block.
+ const uint8_t* signed_data_signature;
+ uint32_t signed_data_signature_length;
+
+ // X.509 device specific certificate for the |service_id| requested.
+ const uint8_t* platform_key_certificate;
+ uint32_t platform_key_certificate_length;
+};
+
+// Used when passing arrays of binary data. Does not own the referenced data.
+struct BinaryData {
+ BinaryData() : data(NULL), length(0) {}
+ const uint8_t* data;
+ uint32_t length;
+};
+
+// The current status of the associated key. The valid types are defined in the
+// spec: https://w3c.github.io/encrypted-media/#idl-def-MediaKeyStatus
+enum KeyStatus {
+ kUsable = 0,
+ kInternalError = 1,
+ kExpired = 2,
+ kOutputRestricted = 3,
+ kOutputDownscaled = 4,
+ kStatusPending = 5,
+ kReleased = 6
+};
+
+// Used when passing arrays of key information. Does not own the referenced
+// data. |system_code| is an additional error code for unusable keys and
+// should be 0 when |status| == kUsable.
+struct KeyInformation {
+ KeyInformation()
+ : key_id(NULL), key_id_size(0), status(kInternalError), system_code(0) {}
+ const uint8_t* key_id;
+ uint32_t key_id_size;
+ KeyStatus status;
+ uint32_t system_code;
+};
+
+// Supported output protection methods for use with EnableOutputProtection() and
+// returned by OnQueryOutputProtectionStatus().
+enum OutputProtectionMethods {
+ kProtectionNone = 0,
+ kProtectionHDCP = 1 << 0
+};
+
+// Connected output link types returned by OnQueryOutputProtectionStatus().
+enum OutputLinkTypes {
+ kLinkTypeNone = 0,
+ kLinkTypeUnknown = 1 << 0,
+ kLinkTypeInternal = 1 << 1,
+ kLinkTypeVGA = 1 << 2,
+ kLinkTypeHDMI = 1 << 3,
+ kLinkTypeDVI = 1 << 4,
+ kLinkTypeDisplayPort = 1 << 5,
+ kLinkTypeNetwork = 1 << 6
+};
+
+// Result of the QueryOutputProtectionStatus() call.
+enum QueryResult {
+ kQuerySucceeded = 0,
+ kQueryFailed
+};
+
+// The Initialization Data Type. The valid types are defined in the spec:
+// http://w3c.github.io/encrypted-media/initdata-format-registry.html#registry
+enum InitDataType {
+ kCenc = 0,
+ kKeyIds = 1,
+ kWebM = 2
+};
+
+// The type of session to create. The valid types are defined in the spec:
+// https://w3c.github.io/encrypted-media/#idl-def-SessionType
+enum SessionType {
+ kTemporary = 0,
+ kPersistentLicense = 1,
+ kPersistentKeyRelease = 2
+};
+
+// The type of the message event. The valid types are defined in the spec:
+// https://w3c.github.io/encrypted-media/#idl-def-MediaKeyMessageType
+enum MessageType {
+ kLicenseRequest = 0,
+ kLicenseRenewal = 1,
+ kLicenseRelease = 2
+};
+
+// FileIO interface provides a way for the CDM to store data in a file in
+// persistent storage. This interface aims only at providing basic read/write
+// capabilities and should not be used as a full fledged file IO API.
+// Each CDM and origin (e.g. HTTPS, "foo.example.com", 443) combination has
+// its own persistent storage. All instances of a given CDM associated with a
+// given origin share the same persistent storage.
+// Note to implementors of this interface:
+// Per-origin storage and the ability for users to clear it are important.
+// See http://www.w3.org/TR/encrypted-media/#privacy-storedinfo.
+class FileIO {
+ public:
+ // Opens the file with |file_name| for read and write.
+ // FileIOClient::OnOpenComplete() will be called after the opening
+ // operation finishes.
+ // - When the file is opened by a CDM instance, it will be classified as "in
+ // use". In this case other CDM instances in the same domain may receive
+ // kInUse status when trying to open it.
+ // - |file_name| must not contain forward slash ('/') or backslash ('\'), and
+ // must not start with an underscore ('_').
+ virtual void Open(const char* file_name, uint32_t file_name_size) = 0;
+
+ // Reads the contents of the file. FileIOClient::OnReadComplete() will be
+ // called with the read status. Read() should not be called if a previous
+ // Read() or Write() call is still pending; otherwise OnReadComplete() will
+ // be called with kInUse.
+ virtual void Read() = 0;
+
+ // Writes |data_size| bytes of |data| into the file.
+ // FileIOClient::OnWriteComplete() will be called with the write status.
+ // All existing contents in the file will be overwritten. Calling Write() with
+ // NULL |data| will clear all contents in the file. Write() should not be
+ // called if a previous Write() or Read() call is still pending; otherwise
+ // OnWriteComplete() will be called with kInUse.
+ virtual void Write(const uint8_t* data, uint32_t data_size) = 0;
+
+ // Closes the file if opened, destroys this FileIO object and releases any
+ // resources allocated. The CDM must call this method when it finished using
+ // this object. A FileIO object must not be used after Close() is called.
+ virtual void Close() = 0;
+
+ protected:
+ FileIO() {}
+ virtual ~FileIO() {}
+};
+
+// Responses to FileIO calls. All responses will be called asynchronously.
+// When kError is returned, the FileIO object could be in an error state. All
+// following calls (other than Close()) could return kError. The CDM should
+// still call Close() to destroy the FileIO object.
+class FileIOClient {
+ public:
+ enum Status {
+ kSuccess = 0,
+ kInUse,
+ kError
+ };
+
+ // Response to a FileIO::Open() call with the open |status|.
+ virtual void OnOpenComplete(Status status) = 0;
+
+ // Response to a FileIO::Read() call to provide |data_size| bytes of |data|
+ // read from the file.
+ // - kSuccess indicates that all contents of the file has been successfully
+ // read. In this case, 0 |data_size| means that the file is empty.
+ // - kInUse indicates that there are other read/write operations pending.
+ // - kError indicates read failure, e.g. the storage is not open or cannot be
+ // fully read.
+ virtual void OnReadComplete(Status status,
+ const uint8_t* data, uint32_t data_size) = 0;
+
+ // Response to a FileIO::Write() call.
+ // - kSuccess indicates that all the data has been written into the file
+ // successfully.
+ // - kInUse indicates that there are other read/write operations pending.
+ // - kError indicates write failure, e.g. the storage is not open or cannot be
+ // fully written. Upon write failure, the contents of the file should be
+ // regarded as corrupt and should not used.
+ virtual void OnWriteComplete(Status status) = 0;
+
+ protected:
+ FileIOClient() {}
+ virtual ~FileIOClient() {}
+};
+
+// ContentDecryptionModule interface that all CDMs need to implement.
+// The interface is versioned for backward compatibility.
+// Note: ContentDecryptionModule implementations must use the allocator
+// provided in CreateCdmInstance() to allocate any Buffer that needs to
+// be passed back to the caller. Implementations must call Buffer::Destroy()
+// when a Buffer is created that will never be returned to the caller.
+class ContentDecryptionModule_7 {
+ public:
+ static const int kVersion = 7;
+ typedef Host_7 Host;
+
+ // SetServerCertificate(), CreateSessionAndGenerateRequest(), LoadSession(),
+ // UpdateSession(), CloseSession(), and RemoveSession() all accept a
+ // |promise_id|, which must be passed to the completion Host method
+ // (e.g. Host::OnResolveNewSessionPromise()).
+
+ // Provides a server certificate to be used to encrypt messages to the
+ // license server. The CDM must respond by calling either
+ // Host::OnResolvePromise() or Host::OnRejectPromise().
+ virtual void SetServerCertificate(uint32_t promise_id,
+ const uint8_t* server_certificate_data,
+ uint32_t server_certificate_data_size) = 0;
+
+ // Creates a session given |session_type|, |init_data_type|, and |init_data|.
+ // The CDM must respond by calling either Host::OnResolveNewSessionPromise()
+ // or Host::OnRejectPromise().
+ virtual void CreateSessionAndGenerateRequest(uint32_t promise_id,
+ SessionType session_type,
+ const char* init_data_type,
+ uint32_t init_data_type_size,
+ const uint8_t* init_data,
+ uint32_t init_data_size) = 0;
+
+ // Loads the session of type |session_type| specified by |session_id|.
+ // The CDM must respond by calling either Host::OnResolveNewSessionPromise()
+ // or Host::OnRejectPromise(). If the session is not found, call
+ // Host::OnResolveNewSessionPromise() with session_id = NULL.
+ virtual void LoadSession(uint32_t promise_id,
+ SessionType session_type,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Updates the session with |response|. The CDM must respond by calling
+ // either Host::OnResolvePromise() or Host::OnRejectPromise().
+ virtual void UpdateSession(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size,
+ const uint8_t* response,
+ uint32_t response_size) = 0;
+
+ // Requests that the CDM close the session. The CDM must respond by calling
+ // either Host::OnResolvePromise() or Host::OnRejectPromise() when the request
+ // has been processed. This may be before the session is closed. Once the
+ // session is closed, Host::OnSessionClosed() must also be called.
+ virtual void CloseSession(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Removes any stored session data associated with this session. Will only be
+ // called for persistent sessions. The CDM must respond by calling either
+ // Host::OnResolvePromise() or Host::OnRejectPromise() when the request has
+ // been processed.
+ virtual void RemoveSession(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Performs scheduled operation with |context| when the timer fires.
+ virtual void TimerExpired(void* context) = 0;
+
+ // Decrypts the |encrypted_buffer|.
+ //
+ // Returns kSuccess if decryption succeeded, in which case the callee
+ // should have filled the |decrypted_buffer| and passed the ownership of
+ // |data| in |decrypted_buffer| to the caller.
+ // Returns kNoKey if the CDM did not have the necessary decryption key
+ // to decrypt.
+ // Returns kDecryptError if any other error happened.
+ // If the return value is not kSuccess, |decrypted_buffer| should be ignored
+ // by the caller.
+ virtual Status Decrypt(const InputBuffer& encrypted_buffer,
+ DecryptedBlock* decrypted_buffer) = 0;
+
+ // Initializes the CDM audio decoder with |audio_decoder_config|. This
+ // function must be called before DecryptAndDecodeSamples() is called.
+ //
+ // Returns kSuccess if the |audio_decoder_config| is supported and the CDM
+ // audio decoder is successfully initialized.
+ // Returns kSessionError if |audio_decoder_config| is not supported. The CDM
+ // may still be able to do Decrypt().
+ // Returns kDeferredInitialization if the CDM is not ready to initialize the
+ // decoder at this time. Must call Host::OnDeferredInitializationDone() once
+ // initialization is complete.
+ virtual Status InitializeAudioDecoder(
+ const AudioDecoderConfig& audio_decoder_config) = 0;
+
+ // Initializes the CDM video decoder with |video_decoder_config|. This
+ // function must be called before DecryptAndDecodeFrame() is called.
+ //
+ // Returns kSuccess if the |video_decoder_config| is supported and the CDM
+ // video decoder is successfully initialized.
+ // Returns kSessionError if |video_decoder_config| is not supported. The CDM
+ // may still be able to do Decrypt().
+ // Returns kDeferredInitialization if the CDM is not ready to initialize the
+ // decoder at this time. Must call Host::OnDeferredInitializationDone() once
+ // initialization is complete.
+ virtual Status InitializeVideoDecoder(
+ const VideoDecoderConfig& video_decoder_config) = 0;
+
+ // De-initializes the CDM decoder and sets it to an uninitialized state. The
+ // caller can initialize the decoder again after this call to re-initialize
+ // it. This can be used to reconfigure the decoder if the configuration
+ // changes.
+ virtual void DeinitializeDecoder(StreamType decoder_type) = 0;
+
+ // Resets the CDM decoder to an initialized clean state. All internal buffers
+ // MUST be flushed.
+ virtual void ResetDecoder(StreamType decoder_type) = 0;
+
+ // Decrypts the |encrypted_buffer| and decodes the decrypted buffer into a
+ // |video_frame|. Upon end-of-stream, the caller should call this function
+ // repeatedly with empty |encrypted_buffer| (|data| == NULL) until only empty
+ // |video_frame| (|format| == kEmptyVideoFrame) is produced.
+ //
+ // Returns kSuccess if decryption and decoding both succeeded, in which case
+ // the callee will have filled the |video_frame| and passed the ownership of
+ // |frame_buffer| in |video_frame| to the caller.
+ // Returns kNoKey if the CDM did not have the necessary decryption key
+ // to decrypt.
+ // Returns kNeedMoreData if more data was needed by the decoder to generate
+ // a decoded frame (e.g. during initialization and end-of-stream).
+ // Returns kDecryptError if any decryption error happened.
+ // Returns kDecodeError if any decoding error happened.
+ // If the return value is not kSuccess, |video_frame| should be ignored by
+ // the caller.
+ virtual Status DecryptAndDecodeFrame(const InputBuffer& encrypted_buffer,
+ VideoFrame* video_frame) = 0;
+
+ // Decrypts the |encrypted_buffer| and decodes the decrypted buffer into
+ // |audio_frames|. Upon end-of-stream, the caller should call this function
+ // repeatedly with empty |encrypted_buffer| (|data| == NULL) until only empty
+ // |audio_frames| is produced.
+ //
+ // Returns kSuccess if decryption and decoding both succeeded, in which case
+ // the callee will have filled |audio_frames| and passed the ownership of
+ // |data| in |audio_frames| to the caller.
+ // Returns kNoKey if the CDM did not have the necessary decryption key
+ // to decrypt.
+ // Returns kNeedMoreData if more data was needed by the decoder to generate
+ // audio samples (e.g. during initialization and end-of-stream).
+ // Returns kDecryptError if any decryption error happened.
+ // Returns kDecodeError if any decoding error happened.
+ // If the return value is not kSuccess, |audio_frames| should be ignored by
+ // the caller.
+ virtual Status DecryptAndDecodeSamples(const InputBuffer& encrypted_buffer,
+ AudioFrames* audio_frames) = 0;
+
+ // Called by the host after a platform challenge was initiated via
+ // Host::SendPlatformChallenge().
+ virtual void OnPlatformChallengeResponse(
+ const PlatformChallengeResponse& response) = 0;
+
+ // Called by the host after a call to Host::QueryOutputProtectionStatus(). The
+ // |link_mask| is a bit mask of OutputLinkTypes and |output_protection_mask|
+ // is a bit mask of OutputProtectionMethods. If |result| is kQueryFailed,
+ // then |link_mask| and |output_protection_mask| are undefined and should
+ // be ignored.
+ virtual void OnQueryOutputProtectionStatus(
+ QueryResult result,
+ uint32_t link_mask,
+ uint32_t output_protection_mask) = 0;
+
+ // Destroys the object in the same context as it was created.
+ virtual void Destroy() = 0;
+
+ protected:
+ ContentDecryptionModule_7() {}
+ virtual ~ContentDecryptionModule_7() {}
+};
+
+// ContentDecryptionModule interface that all CDMs need to implement.
+// The interface is versioned for backward compatibility.
+// Note: ContentDecryptionModule implementations must use the allocator
+// provided in CreateCdmInstance() to allocate any Buffer that needs to
+// be passed back to the caller. Implementations must call Buffer::Destroy()
+// when a Buffer is created that will never be returned to the caller.
+class ContentDecryptionModule_8 {
+ public:
+ static const int kVersion = 8;
+ typedef Host_8 Host;
+
+ // Initializes the CDM instance, providing information about permitted
+ // functionalities.
+ // If |allow_distinctive_identifier| is false, messages from the CDM,
+ // such as message events, must not contain a Distinctive Identifier,
+ // even in an encrypted form.
+ // If |allow_persistent_state| is false, the CDM must not attempt to
+ // persist state. Calls to CreateFileIO() will fail.
+ virtual void Initialize(bool allow_distinctive_identifier,
+ bool allow_persistent_state) = 0;
+
+ // SetServerCertificate(), CreateSessionAndGenerateRequest(), LoadSession(),
+ // UpdateSession(), CloseSession(), and RemoveSession() all accept a
+ // |promise_id|, which must be passed to the completion Host method
+ // (e.g. Host::OnResolveNewSessionPromise()).
+
+ // Provides a server certificate to be used to encrypt messages to the
+ // license server. The CDM must respond by calling either
+ // Host::OnResolvePromise() or Host::OnRejectPromise().
+ virtual void SetServerCertificate(uint32_t promise_id,
+ const uint8_t* server_certificate_data,
+ uint32_t server_certificate_data_size) = 0;
+
+ // Creates a session given |session_type|, |init_data_type|, and |init_data|.
+ // The CDM must respond by calling either Host::OnResolveNewSessionPromise()
+ // or Host::OnRejectPromise().
+ virtual void CreateSessionAndGenerateRequest(uint32_t promise_id,
+ SessionType session_type,
+ InitDataType init_data_type,
+ const uint8_t* init_data,
+ uint32_t init_data_size) = 0;
+
+ // Loads the session of type |session_type| specified by |session_id|.
+ // The CDM must respond by calling either Host::OnResolveNewSessionPromise()
+ // or Host::OnRejectPromise(). If the session is not found, call
+ // Host::OnResolveNewSessionPromise() with session_id = NULL.
+ virtual void LoadSession(uint32_t promise_id,
+ SessionType session_type,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Updates the session with |response|. The CDM must respond by calling
+ // either Host::OnResolvePromise() or Host::OnRejectPromise().
+ virtual void UpdateSession(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size,
+ const uint8_t* response,
+ uint32_t response_size) = 0;
+
+ // Requests that the CDM close the session. The CDM must respond by calling
+ // either Host::OnResolvePromise() or Host::OnRejectPromise() when the request
+ // has been processed. This may be before the session is closed. Once the
+ // session is closed, Host::OnSessionClosed() must also be called.
+ virtual void CloseSession(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Removes any stored session data associated with this session. Will only be
+ // called for persistent sessions. The CDM must respond by calling either
+ // Host::OnResolvePromise() or Host::OnRejectPromise() when the request has
+ // been processed.
+ virtual void RemoveSession(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Performs scheduled operation with |context| when the timer fires.
+ virtual void TimerExpired(void* context) = 0;
+
+ // Decrypts the |encrypted_buffer|.
+ //
+ // Returns kSuccess if decryption succeeded, in which case the callee
+ // should have filled the |decrypted_buffer| and passed the ownership of
+ // |data| in |decrypted_buffer| to the caller.
+ // Returns kNoKey if the CDM did not have the necessary decryption key
+ // to decrypt.
+ // Returns kDecryptError if any other error happened.
+ // If the return value is not kSuccess, |decrypted_buffer| should be ignored
+ // by the caller.
+ virtual Status Decrypt(const InputBuffer& encrypted_buffer,
+ DecryptedBlock* decrypted_buffer) = 0;
+
+ // Initializes the CDM audio decoder with |audio_decoder_config|. This
+ // function must be called before DecryptAndDecodeSamples() is called.
+ //
+ // Returns kSuccess if the |audio_decoder_config| is supported and the CDM
+ // audio decoder is successfully initialized.
+ // Returns kSessionError if |audio_decoder_config| is not supported. The CDM
+ // may still be able to do Decrypt().
+ // Returns kDeferredInitialization if the CDM is not ready to initialize the
+ // decoder at this time. Must call Host::OnDeferredInitializationDone() once
+ // initialization is complete.
+ virtual Status InitializeAudioDecoder(
+ const AudioDecoderConfig& audio_decoder_config) = 0;
+
+ // Initializes the CDM video decoder with |video_decoder_config|. This
+ // function must be called before DecryptAndDecodeFrame() is called.
+ //
+ // Returns kSuccess if the |video_decoder_config| is supported and the CDM
+ // video decoder is successfully initialized.
+ // Returns kSessionError if |video_decoder_config| is not supported. The CDM
+ // may still be able to do Decrypt().
+ // Returns kDeferredInitialization if the CDM is not ready to initialize the
+ // decoder at this time. Must call Host::OnDeferredInitializationDone() once
+ // initialization is complete.
+ virtual Status InitializeVideoDecoder(
+ const VideoDecoderConfig& video_decoder_config) = 0;
+
+ // De-initializes the CDM decoder and sets it to an uninitialized state. The
+ // caller can initialize the decoder again after this call to re-initialize
+ // it. This can be used to reconfigure the decoder if the configuration
+ // changes.
+ virtual void DeinitializeDecoder(StreamType decoder_type) = 0;
+
+ // Resets the CDM decoder to an initialized clean state. All internal buffers
+ // MUST be flushed.
+ virtual void ResetDecoder(StreamType decoder_type) = 0;
+
+ // Decrypts the |encrypted_buffer| and decodes the decrypted buffer into a
+ // |video_frame|. Upon end-of-stream, the caller should call this function
+ // repeatedly with empty |encrypted_buffer| (|data| == NULL) until only empty
+ // |video_frame| (|format| == kEmptyVideoFrame) is produced.
+ //
+ // Returns kSuccess if decryption and decoding both succeeded, in which case
+ // the callee will have filled the |video_frame| and passed the ownership of
+ // |frame_buffer| in |video_frame| to the caller.
+ // Returns kNoKey if the CDM did not have the necessary decryption key
+ // to decrypt.
+ // Returns kNeedMoreData if more data was needed by the decoder to generate
+ // a decoded frame (e.g. during initialization and end-of-stream).
+ // Returns kDecryptError if any decryption error happened.
+ // Returns kDecodeError if any decoding error happened.
+ // If the return value is not kSuccess, |video_frame| should be ignored by
+ // the caller.
+ virtual Status DecryptAndDecodeFrame(const InputBuffer& encrypted_buffer,
+ VideoFrame* video_frame) = 0;
+
+ // Decrypts the |encrypted_buffer| and decodes the decrypted buffer into
+ // |audio_frames|. Upon end-of-stream, the caller should call this function
+ // repeatedly with empty |encrypted_buffer| (|data| == NULL) until only empty
+ // |audio_frames| is produced.
+ //
+ // Returns kSuccess if decryption and decoding both succeeded, in which case
+ // the callee will have filled |audio_frames| and passed the ownership of
+ // |data| in |audio_frames| to the caller.
+ // Returns kNoKey if the CDM did not have the necessary decryption key
+ // to decrypt.
+ // Returns kNeedMoreData if more data was needed by the decoder to generate
+ // audio samples (e.g. during initialization and end-of-stream).
+ // Returns kDecryptError if any decryption error happened.
+ // Returns kDecodeError if any decoding error happened.
+ // If the return value is not kSuccess, |audio_frames| should be ignored by
+ // the caller.
+ virtual Status DecryptAndDecodeSamples(const InputBuffer& encrypted_buffer,
+ AudioFrames* audio_frames) = 0;
+
+ // Called by the host after a platform challenge was initiated via
+ // Host::SendPlatformChallenge().
+ virtual void OnPlatformChallengeResponse(
+ const PlatformChallengeResponse& response) = 0;
+
+ // Called by the host after a call to Host::QueryOutputProtectionStatus(). The
+ // |link_mask| is a bit mask of OutputLinkTypes and |output_protection_mask|
+ // is a bit mask of OutputProtectionMethods. If |result| is kQueryFailed,
+ // then |link_mask| and |output_protection_mask| are undefined and should
+ // be ignored.
+ virtual void OnQueryOutputProtectionStatus(
+ QueryResult result,
+ uint32_t link_mask,
+ uint32_t output_protection_mask) = 0;
+
+ // Destroys the object in the same context as it was created.
+ virtual void Destroy() = 0;
+
+ protected:
+ ContentDecryptionModule_8() {}
+ virtual ~ContentDecryptionModule_8() {}
+};
+
+typedef ContentDecryptionModule_8 ContentDecryptionModule;
+
+// Represents a buffer created by Allocator implementations.
+class Buffer {
+ public:
+ // Destroys the buffer in the same context as it was created.
+ virtual void Destroy() = 0;
+
+ virtual uint32_t Capacity() const = 0;
+ virtual uint8_t* Data() = 0;
+ virtual void SetSize(uint32_t size) = 0;
+ virtual uint32_t Size() const = 0;
+
+ protected:
+ Buffer() {}
+ virtual ~Buffer() {}
+
+ private:
+ Buffer(const Buffer&);
+ void operator=(const Buffer&);
+};
+
+class Host_7 {
+ public:
+ static const int kVersion = 7;
+
+ // Returns a Buffer* containing non-zero members upon success, or NULL on
+ // failure. The caller owns the Buffer* after this call. The buffer is not
+ // guaranteed to be zero initialized. The capacity of the allocated Buffer
+ // is guaranteed to be not less than |capacity|.
+ virtual Buffer* Allocate(uint32_t capacity) = 0;
+
+ // Requests the host to call ContentDecryptionModule::TimerFired() |delay_ms|
+ // from now with |context|.
+ virtual void SetTimer(int64_t delay_ms, void* context) = 0;
+
+ // Returns the current wall time in seconds.
+ virtual Time GetCurrentWallTime() = 0;
+
+ // Called by the CDM when a session is created or loaded and the value for the
+ // MediaKeySession's sessionId attribute is available (|session_id|).
+ // This must be called before OnSessionMessage() or
+ // OnSessionKeysChange() is called for the same session. |session_id_size|
+ // should not include null termination.
+ // When called in response to LoadSession(), the |session_id| must be the
+ // same as the |session_id| passed in LoadSession(), or NULL if the
+ // session could not be loaded.
+ virtual void OnResolveNewSessionPromise(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Called by the CDM when a session is updated or released.
+ virtual void OnResolvePromise(uint32_t promise_id) = 0;
+
+ // Called by the CDM when an error occurs as a result of one of the
+ // ContentDecryptionModule calls that accept a |promise_id|.
+ // |error| must be specified, |error_message| and |system_code|
+ // are optional. |error_message_size| should not include null termination.
+ virtual void OnRejectPromise(uint32_t promise_id,
+ Error error,
+ uint32_t system_code,
+ const char* error_message,
+ uint32_t error_message_size) = 0;
+
+ // Called by the CDM when it has a message for session |session_id|.
+ // Size parameters should not include null termination.
+ // |legacy_destination_url| is only for supporting the prefixed EME API and
+ // is ignored by unprefixed EME. It should only be non-null if |message_type|
+ // is kLicenseRenewal.
+ virtual void OnSessionMessage(const char* session_id,
+ uint32_t session_id_size,
+ MessageType message_type,
+ const char* message,
+ uint32_t message_size,
+ const char* legacy_destination_url,
+ uint32_t legacy_destination_url_length) = 0;
+
+ // Called by the CDM when there has been a change in keys or their status for
+ // session |session_id|. |has_additional_usable_key| should be set if a
+ // key is newly usable (e.g. new key available, previously expired key has
+ // been renewed, etc.) and the browser should attempt to resume playback.
+ // |key_ids| is the list of key ids for this session along with their
+ // current status. |key_ids_count| is the number of entries in |key_ids|.
+ // Size parameter for |session_id| should not include null termination.
+ virtual void OnSessionKeysChange(const char* session_id,
+ uint32_t session_id_size,
+ bool has_additional_usable_key,
+ const KeyInformation* keys_info,
+ uint32_t keys_info_count) = 0;
+
+ // Called by the CDM when there has been a change in the expiration time for
+ // session |session_id|. This can happen as the result of an Update() call
+ // or some other event. If this happens as a result of a call to Update(),
+ // it must be called before resolving the Update() promise. |new_expiry_time|
+ // can be 0 to represent "undefined". Size parameter should not include
+ // null termination.
+ virtual void OnExpirationChange(const char* session_id,
+ uint32_t session_id_size,
+ Time new_expiry_time) = 0;
+
+ // Called by the CDM when session |session_id| is closed. Size
+ // parameter should not include null termination.
+ virtual void OnSessionClosed(const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Called by the CDM when an error occurs in session |session_id|
+ // unrelated to one of the ContentDecryptionModule calls that accept a
+ // |promise_id|. |error| must be specified, |error_message| and
+ // |system_code| are optional. Length parameters should not include null
+ // termination.
+ // Note:
+ // - This method is only for supporting prefixed EME API.
+ // - This method will be ignored by unprefixed EME. All errors reported
+ // in this method should probably also be reported by one of other methods.
+ virtual void OnLegacySessionError(
+ const char* session_id, uint32_t session_id_length,
+ Error error,
+ uint32_t system_code,
+ const char* error_message, uint32_t error_message_length) = 0;
+
+ // The following are optional methods that may not be implemented on all
+ // platforms.
+
+ // Sends a platform challenge for the given |service_id|. |challenge| is at
+ // most 256 bits of data to be signed. Once the challenge has been completed,
+ // the host will call ContentDecryptionModule::OnPlatformChallengeResponse()
+ // with the signed challenge response and platform certificate. Size
+ // parameters should not include null termination.
+ virtual void SendPlatformChallenge(const char* service_id,
+ uint32_t service_id_size,
+ const char* challenge,
+ uint32_t challenge_size) = 0;
+
+ // Attempts to enable output protection (e.g. HDCP) on the display link. The
+ // |desired_protection_mask| is a bit mask of OutputProtectionMethods. No
+ // status callback is issued, the CDM must call QueryOutputProtectionStatus()
+ // periodically to ensure the desired protections are applied.
+ virtual void EnableOutputProtection(uint32_t desired_protection_mask) = 0;
+
+ // Requests the current output protection status. Once the host has the status
+ // it will call ContentDecryptionModule::OnQueryOutputProtectionStatus().
+ virtual void QueryOutputProtectionStatus() = 0;
+
+ // Must be called by the CDM if it returned kDeferredInitialization during
+ // InitializeAudioDecoder() or InitializeVideoDecoder().
+ virtual void OnDeferredInitializationDone(StreamType stream_type,
+ Status decoder_status) = 0;
+
+ // Creates a FileIO object from the host to do file IO operation. Returns NULL
+ // if a FileIO object cannot be obtained. Once a valid FileIO object is
+ // returned, |client| must be valid until FileIO::Close() is called. The
+ // CDM can call this method multiple times to operate on different files.
+ virtual FileIO* CreateFileIO(FileIOClient* client) = 0;
+
+ protected:
+ Host_7() {}
+ virtual ~Host_7() {}
+};
+
+class Host_8 {
+ public:
+ static const int kVersion = 8;
+
+ // Returns a Buffer* containing non-zero members upon success, or NULL on
+ // failure. The caller owns the Buffer* after this call. The buffer is not
+ // guaranteed to be zero initialized. The capacity of the allocated Buffer
+ // is guaranteed to be not less than |capacity|.
+ virtual Buffer* Allocate(uint32_t capacity) = 0;
+
+ // Requests the host to call ContentDecryptionModule::TimerFired() |delay_ms|
+ // from now with |context|.
+ virtual void SetTimer(int64_t delay_ms, void* context) = 0;
+
+ // Returns the current wall time in seconds.
+ virtual Time GetCurrentWallTime() = 0;
+
+ // Called by the CDM when a session is created or loaded and the value for the
+ // MediaKeySession's sessionId attribute is available (|session_id|).
+ // This must be called before OnSessionMessage() or
+ // OnSessionKeysChange() is called for the same session. |session_id_size|
+ // should not include null termination.
+ // When called in response to LoadSession(), the |session_id| must be the
+ // same as the |session_id| passed in LoadSession(), or NULL if the
+ // session could not be loaded.
+ virtual void OnResolveNewSessionPromise(uint32_t promise_id,
+ const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Called by the CDM when a session is updated or released.
+ virtual void OnResolvePromise(uint32_t promise_id) = 0;
+
+ // Called by the CDM when an error occurs as a result of one of the
+ // ContentDecryptionModule calls that accept a |promise_id|.
+ // |error| must be specified, |error_message| and |system_code|
+ // are optional. |error_message_size| should not include null termination.
+ virtual void OnRejectPromise(uint32_t promise_id,
+ Error error,
+ uint32_t system_code,
+ const char* error_message,
+ uint32_t error_message_size) = 0;
+
+ // Called by the CDM when it has a message for session |session_id|.
+ // Size parameters should not include null termination.
+ // |legacy_destination_url| is only for supporting the prefixed EME API and
+ // is ignored by unprefixed EME. It should only be non-null if |message_type|
+ // is kLicenseRenewal.
+ virtual void OnSessionMessage(const char* session_id,
+ uint32_t session_id_size,
+ MessageType message_type,
+ const char* message,
+ uint32_t message_size,
+ const char* legacy_destination_url,
+ uint32_t legacy_destination_url_length) = 0;
+
+ // Called by the CDM when there has been a change in keys or their status for
+ // session |session_id|. |has_additional_usable_key| should be set if a
+ // key is newly usable (e.g. new key available, previously expired key has
+ // been renewed, etc.) and the browser should attempt to resume playback.
+ // |key_ids| is the list of key ids for this session along with their
+ // current status. |key_ids_count| is the number of entries in |key_ids|.
+ // Size parameter for |session_id| should not include null termination.
+ virtual void OnSessionKeysChange(const char* session_id,
+ uint32_t session_id_size,
+ bool has_additional_usable_key,
+ const KeyInformation* keys_info,
+ uint32_t keys_info_count) = 0;
+
+ // Called by the CDM when there has been a change in the expiration time for
+ // session |session_id|. This can happen as the result of an Update() call
+ // or some other event. If this happens as a result of a call to Update(),
+ // it must be called before resolving the Update() promise. |new_expiry_time|
+ // can be 0 to represent "undefined". Size parameter should not include
+ // null termination.
+ virtual void OnExpirationChange(const char* session_id,
+ uint32_t session_id_size,
+ Time new_expiry_time) = 0;
+
+ // Called by the CDM when session |session_id| is closed. Size
+ // parameter should not include null termination.
+ virtual void OnSessionClosed(const char* session_id,
+ uint32_t session_id_size) = 0;
+
+ // Called by the CDM when an error occurs in session |session_id|
+ // unrelated to one of the ContentDecryptionModule calls that accept a
+ // |promise_id|. |error| must be specified, |error_message| and
+ // |system_code| are optional. Length parameters should not include null
+ // termination.
+ // Note:
+ // - This method is only for supporting prefixed EME API.
+ // - This method will be ignored by unprefixed EME. All errors reported
+ // in this method should probably also be reported by one of other methods.
+ virtual void OnLegacySessionError(
+ const char* session_id, uint32_t session_id_length,
+ Error error,
+ uint32_t system_code,
+ const char* error_message, uint32_t error_message_length) = 0;
+
+ // The following are optional methods that may not be implemented on all
+ // platforms.
+
+ // Sends a platform challenge for the given |service_id|. |challenge| is at
+ // most 256 bits of data to be signed. Once the challenge has been completed,
+ // the host will call ContentDecryptionModule::OnPlatformChallengeResponse()
+ // with the signed challenge response and platform certificate. Size
+ // parameters should not include null termination.
+ virtual void SendPlatformChallenge(const char* service_id,
+ uint32_t service_id_size,
+ const char* challenge,
+ uint32_t challenge_size) = 0;
+
+ // Attempts to enable output protection (e.g. HDCP) on the display link. The
+ // |desired_protection_mask| is a bit mask of OutputProtectionMethods. No
+ // status callback is issued, the CDM must call QueryOutputProtectionStatus()
+ // periodically to ensure the desired protections are applied.
+ virtual void EnableOutputProtection(uint32_t desired_protection_mask) = 0;
+
+ // Requests the current output protection status. Once the host has the status
+ // it will call ContentDecryptionModule::OnQueryOutputProtectionStatus().
+ virtual void QueryOutputProtectionStatus() = 0;
+
+ // Must be called by the CDM if it returned kDeferredInitialization during
+ // InitializeAudioDecoder() or InitializeVideoDecoder().
+ virtual void OnDeferredInitializationDone(StreamType stream_type,
+ Status decoder_status) = 0;
+
+ // Creates a FileIO object from the host to do file IO operation. Returns NULL
+ // if a FileIO object cannot be obtained. Once a valid FileIO object is
+ // returned, |client| must be valid until FileIO::Close() is called. The
+ // CDM can call this method multiple times to operate on different files.
+ virtual FileIO* CreateFileIO(FileIOClient* client) = 0;
+
+ protected:
+ Host_8() {}
+ virtual ~Host_8() {}
+};
+
+// Represents a decrypted block that has not been decoded.
+class DecryptedBlock {
+ public:
+ virtual void SetDecryptedBuffer(Buffer* buffer) = 0;
+ virtual Buffer* DecryptedBuffer() = 0;
+
+ // TODO(tomfinegan): Figure out if timestamp is really needed. If it is not,
+ // we can just pass Buffer pointers around.
+ virtual void SetTimestamp(int64_t timestamp) = 0;
+ virtual int64_t Timestamp() const = 0;
+
+ protected:
+ DecryptedBlock() {}
+ virtual ~DecryptedBlock() {}
+};
+
+class VideoFrame {
+ public:
+ enum VideoPlane {
+ kYPlane = 0,
+ kUPlane = 1,
+ kVPlane = 2,
+ kMaxPlanes = 3,
+ };
+
+ virtual void SetFormat(VideoFormat format) = 0;
+ virtual VideoFormat Format() const = 0;
+
+ virtual void SetSize(cdm::Size size) = 0;
+ virtual cdm::Size Size() const = 0;
+
+ virtual void SetFrameBuffer(Buffer* frame_buffer) = 0;
+ virtual Buffer* FrameBuffer() = 0;
+
+ virtual void SetPlaneOffset(VideoPlane plane, uint32_t offset) = 0;
+ virtual uint32_t PlaneOffset(VideoPlane plane) = 0;
+
+ virtual void SetStride(VideoPlane plane, uint32_t stride) = 0;
+ virtual uint32_t Stride(VideoPlane plane) = 0;
+
+ virtual void SetTimestamp(int64_t timestamp) = 0;
+ virtual int64_t Timestamp() const = 0;
+
+ protected:
+ VideoFrame() {}
+ virtual ~VideoFrame() {}
+};
+
+// Represents decrypted and decoded audio frames. AudioFrames can contain
+// multiple audio output buffers, which are serialized into this format:
+//
+// |<------------------- serialized audio buffer ------------------->|
+// | int64_t timestamp | int64_t length | length bytes of audio data |
+//
+// For example, with three audio output buffers, the AudioFrames will look
+// like this:
+//
+// |<----------------- AudioFrames ------------------>|
+// | audio buffer 0 | audio buffer 1 | audio buffer 2 |
+class AudioFrames {
+ public:
+ virtual void SetFrameBuffer(Buffer* buffer) = 0;
+ virtual Buffer* FrameBuffer() = 0;
+
+ // The CDM must call this method, providing a valid format, when providing
+ // frame buffers. Planar data should be stored end to end; e.g.,
+ // |ch1 sample1||ch1 sample2|....|ch1 sample_last||ch2 sample1|...
+ virtual void SetFormat(AudioFormat format) = 0;
+ virtual AudioFormat Format() const = 0;
+
+ protected:
+ AudioFrames() {}
+ virtual ~AudioFrames() {}
+};
+
+} // namespace cdm
+
+#endif // CDM_CONTENT_DECRYPTION_MODULE_H_
diff --git a/dom/media/gmp/widevine-adapter/moz.build b/dom/media/gmp/widevine-adapter/moz.build
new file mode 100644
index 000000000..a689a6393
--- /dev/null
+++ b/dom/media/gmp/widevine-adapter/moz.build
@@ -0,0 +1,25 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+SOURCES += [
+ 'WidevineAdapter.cpp',
+ 'WidevineDecryptor.cpp',
+ 'WidevineFileIO.cpp',
+ 'WidevineUtils.cpp',
+ 'WidevineVideoDecoder.cpp',
+ 'WidevineVideoFrame.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
+
+LOCAL_INCLUDES += [
+ '/dom/media/gmp',
+]
+
+if CONFIG['CLANG_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
+
+include('/ipc/chromium/chromium-config.mozbuild')
diff --git a/dom/media/gtest/Cargo.toml b/dom/media/gtest/Cargo.toml
new file mode 100644
index 000000000..a55f8fb68
--- /dev/null
+++ b/dom/media/gtest/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "mp4parse-gtest"
+version = "0.1.0"
+authors = ["nobody@mozilla.org"]
+
+[lib]
+path = "hello.rs"
diff --git a/dom/media/gtest/GMPTestMonitor.h b/dom/media/gtest/GMPTestMonitor.h
new file mode 100644
index 000000000..8ce6f8ddd
--- /dev/null
+++ b/dom/media/gtest/GMPTestMonitor.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsThreadUtils.h"
+
+#ifndef __GMPTestMonitor_h__
+#define __GMPTestMonitor_h__
+
+class GMPTestMonitor
+{
+public:
+ GMPTestMonitor()
+ : mFinished(false)
+ {
+ }
+
+ void AwaitFinished()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ while (!mFinished) {
+ NS_ProcessNextEvent(nullptr, true);
+ }
+ mFinished = false;
+ }
+
+private:
+ void MarkFinished()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mFinished = true;
+ }
+
+public:
+ void SetFinished()
+ {
+ NS_DispatchToMainThread(mozilla::NewNonOwningRunnableMethod(this,
+ &GMPTestMonitor::MarkFinished));
+ }
+
+private:
+ bool mFinished;
+};
+
+#endif // __GMPTestMonitor_h__
diff --git a/dom/media/gtest/MockMediaDecoderOwner.h b/dom/media/gtest/MockMediaDecoderOwner.h
new file mode 100644
index 000000000..324f18141
--- /dev/null
+++ b/dom/media/gtest/MockMediaDecoderOwner.h
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOCK_MEDIA_DECODER_OWNER_H_
+#define MOCK_MEDIA_DECODER_OWNER_H_
+
+#include "MediaDecoderOwner.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla
+{
+
+class MockMediaDecoderOwner : public MediaDecoderOwner
+{
+public:
+ nsresult DispatchAsyncEvent(const nsAString& aName) override
+ {
+ return NS_OK;
+ }
+ void FireTimeUpdate(bool aPeriodic) override {}
+ bool GetPaused() override { return false; }
+ void MetadataLoaded(const MediaInfo* aInfo,
+ nsAutoPtr<const MetadataTags> aTags) override
+ {
+ }
+ void NetworkError() override {}
+ void DecodeError(const MediaResult& aError) override {}
+ bool HasError() const override { return false; }
+ void LoadAborted() override {}
+ void PlaybackEnded() override {}
+ void SeekStarted() override {}
+ void SeekCompleted() override {}
+ void DownloadProgressed() override {}
+ void UpdateReadyState() override {}
+ void FirstFrameLoaded() override {}
+ void DispatchEncrypted(const nsTArray<uint8_t>& aInitData,
+ const nsAString& aInitDataType) override {}
+ bool IsActive() const override { return true; }
+ bool IsHidden() const override { return false; }
+ void DownloadSuspended() override {}
+ void DownloadResumed(bool aForceNetworkLoading) override {}
+ void NotifySuspendedByCache(bool aIsSuspended) override {}
+ void NotifyDecoderPrincipalChanged() override {}
+ VideoFrameContainer* GetVideoFrameContainer() override
+ {
+ return nullptr;
+ }
+ void SetAudibleState(bool aAudible) override {}
+ void NotifyXPCOMShutdown() override {}
+};
+}
+
+#endif
diff --git a/dom/media/gtest/MockMediaResource.cpp b/dom/media/gtest/MockMediaResource.cpp
new file mode 100644
index 000000000..4e75f8d9d
--- /dev/null
+++ b/dom/media/gtest/MockMediaResource.cpp
@@ -0,0 +1,116 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MockMediaResource.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+namespace mozilla
+{
+
+MockMediaResource::MockMediaResource(const char* aFileName, const nsACString& aContentType)
+ : mFileHandle(nullptr)
+ , mFileName(aFileName)
+ , mContentType(aContentType)
+{
+}
+
+nsresult
+MockMediaResource::Open(nsIStreamListener** aStreamListener)
+{
+ mFileHandle = fopen(mFileName, "rb");
+ if (mFileHandle == nullptr) {
+ printf_stderr("Can't open %s\n", mFileName);
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+MockMediaResource::~MockMediaResource()
+{
+ if (mFileHandle != nullptr) {
+ fclose(mFileHandle);
+ }
+}
+
+nsresult
+MockMediaResource::ReadAt(int64_t aOffset, char* aBuffer, uint32_t aCount,
+ uint32_t* aBytes)
+{
+ if (mFileHandle == nullptr) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Make it fail if we're re-entrant
+ if (mEntry++) {
+ MOZ_ASSERT(false);
+ return NS_ERROR_FAILURE;
+ }
+
+ fseek(mFileHandle, aOffset, SEEK_SET);
+ size_t objectsRead = fread(aBuffer, aCount, 1, mFileHandle);
+ *aBytes = objectsRead == 1 ? aCount : 0;
+
+ mEntry--;
+
+ return ferror(mFileHandle) ? NS_ERROR_FAILURE : NS_OK;
+}
+
+int64_t
+MockMediaResource::GetLength()
+{
+ if (mFileHandle == nullptr) {
+ return -1;
+ }
+ fseek(mFileHandle, 0, SEEK_END);
+ return ftell(mFileHandle);
+}
+
+void
+MockMediaResource::MockClearBufferedRanges()
+{
+ mRanges.Clear();
+}
+
+void
+MockMediaResource::MockAddBufferedRange(int64_t aStart, int64_t aEnd)
+{
+ mRanges += MediaByteRange(aStart, aEnd);
+}
+
+int64_t
+MockMediaResource::GetNextCachedData(int64_t aOffset)
+{
+ if (!aOffset) {
+ return mRanges.Length() ? mRanges[0].mStart : -1;
+ }
+ for (size_t i = 0; i < mRanges.Length(); i++) {
+ if (aOffset == mRanges[i].mStart) {
+ ++i;
+ return i < mRanges.Length() ? mRanges[i].mStart : -1;
+ }
+ }
+ return -1;
+}
+
+int64_t
+MockMediaResource::GetCachedDataEnd(int64_t aOffset)
+{
+ for (size_t i = 0; i < mRanges.Length(); i++) {
+ if (aOffset == mRanges[i].mStart) {
+ return mRanges[i].mEnd;
+ }
+ }
+ return -1;
+}
+
+nsresult
+MockMediaResource::GetCachedRanges(MediaByteRangeSet& aRanges)
+{
+ aRanges = mRanges;
+ return NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/gtest/MockMediaResource.h b/dom/media/gtest/MockMediaResource.h
new file mode 100644
index 000000000..129ba1b72
--- /dev/null
+++ b/dom/media/gtest/MockMediaResource.h
@@ -0,0 +1,83 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOCK_MEDIA_RESOURCE_H_
+#define MOCK_MEDIA_RESOURCE_H_
+
+#include "MediaResource.h"
+#include "nsTArray.h"
+#include "mozilla/Atomics.h"
+
+namespace mozilla
+{
+
+class MockMediaResource : public MediaResource
+{
+public:
+ explicit MockMediaResource(const char* aFileName, const nsACString& aMimeType = NS_LITERAL_CSTRING("video/mp4"));
+ nsIURI* URI() const override { return nullptr; }
+ nsresult Close() override { return NS_OK; }
+ void Suspend(bool aCloseImmediately) override {}
+ void Resume() override {}
+ already_AddRefed<nsIPrincipal> GetCurrentPrincipal() override
+ {
+ return nullptr;
+ }
+ bool CanClone() override { return false; }
+ already_AddRefed<MediaResource> CloneData(MediaResourceCallback*)
+ override
+ {
+ return nullptr;
+ }
+ void SetReadMode(MediaCacheStream::ReadMode aMode) override {}
+ void SetPlaybackRate(uint32_t aBytesPerSecond) override {}
+ nsresult ReadAt(int64_t aOffset, char* aBuffer, uint32_t aCount,
+ uint32_t* aBytes) override;
+ int64_t Tell() override { return 0; }
+ void Pin() override {}
+ void Unpin() override {}
+ double GetDownloadRate(bool* aIsReliable) override { return 0; }
+ int64_t GetLength() override;
+ int64_t GetNextCachedData(int64_t aOffset) override;
+ int64_t GetCachedDataEnd(int64_t aOffset) override;
+ bool IsDataCachedToEndOfResource(int64_t aOffset) override
+ {
+ return false;
+ }
+ bool IsSuspendedByCache() override { return false; }
+ bool IsSuspended() override { return false; }
+ nsresult ReadFromCache(char* aBuffer, int64_t aOffset,
+ uint32_t aCount) override
+ {
+ uint32_t bytesRead = 0;
+ nsresult rv = ReadAt(aOffset, aBuffer, aCount, &bytesRead);
+ NS_ENSURE_SUCCESS(rv, rv);
+ return bytesRead == aCount ? NS_OK : NS_ERROR_FAILURE;
+ }
+
+ bool IsTransportSeekable() override { return true; }
+ nsresult Open(nsIStreamListener** aStreamListener) override;
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override;
+ const nsCString& GetContentType() const override
+ {
+ return mContentType;
+ }
+
+ void MockClearBufferedRanges();
+ void MockAddBufferedRange(int64_t aStart, int64_t aEnd);
+
+protected:
+ virtual ~MockMediaResource();
+
+private:
+ FILE* mFileHandle;
+ const char* mFileName;
+ MediaByteRangeSet mRanges;
+ Atomic<int> mEntry;
+ const nsCString mContentType;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/gtest/TestAudioBuffers.cpp b/dom/media/gtest/TestAudioBuffers.cpp
new file mode 100644
index 000000000..b03886cec
--- /dev/null
+++ b/dom/media/gtest/TestAudioBuffers.cpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <stdint.h>
+#include "AudioBufferUtils.h"
+#include "gtest/gtest.h"
+
+const uint32_t FRAMES = 256;
+const uint32_t CHANNELS = 2;
+const uint32_t SAMPLES = CHANNELS * FRAMES;
+
+TEST(AudioBuffers, Test)
+{
+ mozilla::AudioCallbackBufferWrapper<float, CHANNELS> mBuffer;
+ mozilla::SpillBuffer<float, 128, CHANNELS> b;
+ float fromCallback[SAMPLES];
+ float other[SAMPLES];
+
+ for (uint32_t i = 0; i < SAMPLES; i++) {
+ other[i] = 1.0;
+ fromCallback[i] = 0.0;
+ }
+
+ // Set the buffer in the wrapper from the callback
+ mBuffer.SetBuffer(fromCallback, FRAMES);
+
+ // Fill the SpillBuffer with data.
+ ASSERT_TRUE(b.Fill(other, 15) == 15);
+ ASSERT_TRUE(b.Fill(other, 17) == 17);
+ for (uint32_t i = 0; i < 32 * CHANNELS; i++) {
+ other[i] = 0.0;
+ }
+
+ // Empty it in the AudioCallbackBufferWrapper
+ ASSERT_TRUE(b.Empty(mBuffer) == 32);
+
+ // Check available return something reasonnable
+ ASSERT_TRUE(mBuffer.Available() == FRAMES - 32);
+
+ // Fill the buffer with the rest of the data
+ mBuffer.WriteFrames(other + 32 * CHANNELS, FRAMES - 32);
+
+ // Check the buffer is now full
+ ASSERT_TRUE(mBuffer.Available() == 0);
+
+ for (uint32_t i = 0 ; i < SAMPLES; i++) {
+ ASSERT_TRUE(fromCallback[i] == 1.0) <<
+ "Difference at " << i << " (" << fromCallback[i] << " != " << 1.0 <<
+ ")\n";
+ }
+
+ ASSERT_TRUE(b.Fill(other, FRAMES) == 128);
+ ASSERT_TRUE(b.Fill(other, FRAMES) == 0);
+ ASSERT_TRUE(b.Empty(mBuffer) == 0);
+}
diff --git a/dom/media/gtest/TestAudioCompactor.cpp b/dom/media/gtest/TestAudioCompactor.cpp
new file mode 100644
index 000000000..9a28254b3
--- /dev/null
+++ b/dom/media/gtest/TestAudioCompactor.cpp
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "gtest/gtest.h"
+#include "AudioCompactor.h"
+#include "MediaDecoderReader.h"
+
+using mozilla::AudioCompactor;
+using mozilla::AudioData;
+using mozilla::AudioDataValue;
+using mozilla::MediaDecoderReader;
+using mozilla::MediaQueue;
+
+class MemoryFunctor : public nsDequeFunctor {
+public:
+ MemoryFunctor() : mSize(0) {}
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf);
+
+ void* operator()(void* aObject) override {
+ const AudioData* audioData = static_cast<const AudioData*>(aObject);
+ mSize += audioData->SizeOfIncludingThis(MallocSizeOf);
+ return nullptr;
+ }
+
+ size_t mSize;
+};
+
+class TestCopy
+{
+public:
+ TestCopy(uint32_t aFrames, uint32_t aChannels,
+ uint32_t &aCallCount, uint32_t &aFrameCount)
+ : mFrames(aFrames)
+ , mChannels(aChannels)
+ , mCallCount(aCallCount)
+ , mFrameCount(aFrameCount)
+ { }
+
+ uint32_t operator()(AudioDataValue *aBuffer, uint32_t aSamples)
+ {
+ mCallCount += 1;
+ uint32_t frames = std::min(mFrames - mFrameCount, aSamples / mChannels);
+ mFrameCount += frames;
+ return frames;
+ }
+
+private:
+ const uint32_t mFrames;
+ const uint32_t mChannels;
+ uint32_t &mCallCount;
+ uint32_t &mFrameCount;
+};
+
+static void TestAudioCompactor(size_t aBytes)
+{
+ MediaQueue<AudioData> queue;
+ AudioCompactor compactor(queue);
+
+ uint64_t offset = 0;
+ uint64_t time = 0;
+ uint32_t sampleRate = 44000;
+ uint32_t channels = 2;
+ uint32_t frames = aBytes / (channels * sizeof(AudioDataValue));
+ size_t maxSlop = aBytes / AudioCompactor::MAX_SLOP_DIVISOR;
+
+ uint32_t callCount = 0;
+ uint32_t frameCount = 0;
+
+ compactor.Push(offset, time, sampleRate, frames, channels,
+ TestCopy(frames, channels, callCount, frameCount));
+
+ EXPECT_GT(callCount, 0U) << "copy functor never called";
+ EXPECT_EQ(frames, frameCount) << "incorrect number of frames copied";
+
+ MemoryFunctor memoryFunc;
+ queue.LockedForEach(memoryFunc);
+ size_t allocSize = memoryFunc.mSize - (callCount * sizeof(AudioData));
+ size_t slop = allocSize - aBytes;
+ EXPECT_LE(slop, maxSlop) << "allowed too much allocation slop";
+}
+
+TEST(Media, AudioCompactor_4000)
+{
+ TestAudioCompactor(4000);
+}
+
+TEST(Media, AudioCompactor_4096)
+{
+ TestAudioCompactor(4096);
+}
+
+TEST(Media, AudioCompactor_5000)
+{
+ TestAudioCompactor(5000);
+}
+
+TEST(Media, AudioCompactor_5256)
+{
+ TestAudioCompactor(5256);
+}
+
+TEST(Media, AudioCompactor_NativeCopy)
+{
+ const uint32_t channels = 2;
+ const size_t srcBytes = 32;
+ const uint32_t srcSamples = srcBytes / sizeof(AudioDataValue);
+ const uint32_t srcFrames = srcSamples / channels;
+ uint8_t src[srcBytes];
+
+ for (uint32_t i = 0; i < srcBytes; ++i) {
+ src[i] = i;
+ }
+
+ AudioCompactor::NativeCopy copy(src, srcBytes, channels);
+
+ const uint32_t dstSamples = srcSamples * 2;
+ AudioDataValue dst[dstSamples];
+
+ const AudioDataValue notCopied = 0xffff;
+ for (uint32_t i = 0; i < dstSamples; ++i) {
+ dst[i] = notCopied;
+ }
+
+ const uint32_t copyCount = 8;
+ uint32_t copiedFrames = 0;
+ uint32_t nextSample = 0;
+ for (uint32_t i = 0; i < copyCount; ++i) {
+ uint32_t copySamples = dstSamples / copyCount;
+ copiedFrames += copy(dst + nextSample, copySamples);
+ nextSample += copySamples;
+ }
+
+ EXPECT_EQ(srcFrames, copiedFrames) << "copy exact number of source frames";
+
+ // Verify that the only the correct bytes were copied.
+ for (uint32_t i = 0; i < dstSamples; ++i) {
+ if (i < srcSamples) {
+ EXPECT_NE(notCopied, dst[i]) << "should have copied over these bytes";
+ } else {
+ EXPECT_EQ(notCopied, dst[i]) << "should not have copied over these bytes";
+ }
+ }
+}
diff --git a/dom/media/gtest/TestAudioMixer.cpp b/dom/media/gtest/TestAudioMixer.cpp
new file mode 100644
index 000000000..4e075a599
--- /dev/null
+++ b/dom/media/gtest/TestAudioMixer.cpp
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioMixer.h"
+#include "gtest/gtest.h"
+
+using mozilla::AudioDataValue;
+using mozilla::AudioSampleFormat;
+
+namespace audio_mixer {
+
+struct MixerConsumer : public mozilla::MixerCallbackReceiver
+{
+/* In this test, the different audio stream and channels are always created to
+ * cancel each other. */
+ void MixerCallback(AudioDataValue* aData, AudioSampleFormat aFormat, uint32_t aChannels, uint32_t aFrames, uint32_t aSampleRate)
+ {
+ bool silent = true;
+ for (uint32_t i = 0; i < aChannels * aFrames; i++) {
+ if (aData[i] != 0.0) {
+ if (aFormat == mozilla::AUDIO_FORMAT_S16) {
+ fprintf(stderr, "Sample at %d is not silent: %d\n", i, (short)aData[i]);
+ } else {
+ fprintf(stderr, "Sample at %d is not silent: %f\n", i, (float)aData[i]);
+ }
+ silent = false;
+ }
+ }
+ ASSERT_TRUE(silent);
+ }
+};
+
+/* Helper function to give us the maximum and minimum value that don't clip,
+ * for a given sample format (integer or floating-point). */
+template<typename T>
+T GetLowValue();
+
+template<typename T>
+T GetHighValue();
+
+template<>
+float GetLowValue<float>() {
+ return -1.0;
+}
+
+template<>
+short GetLowValue<short>() {
+ return -INT16_MAX;
+}
+
+template<>
+float GetHighValue<float>() {
+ return 1.0;
+}
+
+template<>
+short GetHighValue<short>() {
+ return INT16_MAX;
+}
+
+void FillBuffer(AudioDataValue* aBuffer, uint32_t aLength, AudioDataValue aValue)
+{
+ AudioDataValue* end = aBuffer + aLength;
+ while (aBuffer != end) {
+ *aBuffer++ = aValue;
+ }
+}
+
+TEST(AudioMixer, Test)
+{
+ const uint32_t CHANNEL_LENGTH = 256;
+ const uint32_t AUDIO_RATE = 44100;
+ MixerConsumer consumer;
+ AudioDataValue a[CHANNEL_LENGTH * 2];
+ AudioDataValue b[CHANNEL_LENGTH * 2];
+ FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
+ FillBuffer(a + CHANNEL_LENGTH, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
+ FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
+ FillBuffer(b + CHANNEL_LENGTH, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
+
+ {
+ int iterations = 2;
+ mozilla::AudioMixer mixer;
+ mixer.AddCallback(&consumer);
+
+ fprintf(stderr, "Test AudioMixer constant buffer length.\n");
+
+ while (iterations--) {
+ mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ }
+ }
+
+ {
+ mozilla::AudioMixer mixer;
+ mixer.AddCallback(&consumer);
+
+ fprintf(stderr, "Test AudioMixer variable buffer length.\n");
+
+ FillBuffer(a, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
+ FillBuffer(a + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
+ FillBuffer(b, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
+ FillBuffer(b + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
+ mixer.Mix(a, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
+ mixer.FinishMixing();
+ FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
+ FillBuffer(a + CHANNEL_LENGTH, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
+ FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
+ FillBuffer(b + CHANNEL_LENGTH, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
+ mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ FillBuffer(a, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
+ FillBuffer(a + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
+ FillBuffer(b, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
+ FillBuffer(b + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
+ mixer.Mix(a, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
+ mixer.FinishMixing();
+ }
+
+ FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
+ FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
+
+ {
+ mozilla::AudioMixer mixer;
+ mixer.AddCallback(&consumer);
+
+ fprintf(stderr, "Test AudioMixer variable channel count.\n");
+
+ mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ }
+
+ {
+ mozilla::AudioMixer mixer;
+ mixer.AddCallback(&consumer);
+ fprintf(stderr, "Test AudioMixer variable stream count.\n");
+
+ mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
+ mixer.FinishMixing();
+ }
+}
+
+} // namespace audio_mixer
diff --git a/dom/media/gtest/TestAudioPacketizer.cpp b/dom/media/gtest/TestAudioPacketizer.cpp
new file mode 100644
index 000000000..86615eb10
--- /dev/null
+++ b/dom/media/gtest/TestAudioPacketizer.cpp
@@ -0,0 +1,167 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <stdint.h>
+#include <math.h>
+#include "../AudioPacketizer.h"
+#include "gtest/gtest.h"
+
+using namespace mozilla;
+
+template<typename T>
+class AutoBuffer
+{
+public:
+ explicit AutoBuffer(size_t aLength)
+ {
+ mStorage = new T[aLength];
+ }
+ ~AutoBuffer() {
+ delete [] mStorage;
+ }
+ T* Get() {
+ return mStorage;
+ }
+private:
+ T* mStorage;
+};
+
+int16_t Sequence(int16_t* aBuffer, uint32_t aSize, uint32_t aStart = 0)
+{
+ uint32_t i;
+ for (i = 0; i < aSize; i++) {
+ aBuffer[i] = aStart + i;
+ }
+ return aStart + i;
+}
+
+void IsSequence(int16_t* aBuffer, uint32_t aSize, uint32_t aStart = 0)
+{
+ for (uint32_t i = 0; i < aSize; i++) {
+ ASSERT_TRUE(aBuffer[i] == static_cast<int64_t>(aStart + i)) <<
+ "Buffer is not a sequence at offset " << i << std::endl;
+ }
+ // Buffer is a sequence.
+}
+
+void Zero(int16_t* aBuffer, uint32_t aSize)
+{
+ for (uint32_t i = 0; i < aSize; i++) {
+ ASSERT_TRUE(aBuffer[i] == 0) <<
+ "Buffer is not null at offset " << i << std::endl;
+ }
+}
+
+double sine(uint32_t aPhase) {
+ return sin(aPhase * 2 * M_PI * 440 / 44100);
+}
+
+TEST(AudioPacketizer, Test)
+{
+ for (int16_t channels = 1; channels < 2; channels++) {
+ // Test that the packetizer returns zero on underrun
+ {
+ AudioPacketizer<int16_t, int16_t> ap(441, channels);
+ for (int16_t i = 0; i < 10; i++) {
+ int16_t* out = ap.Output();
+ Zero(out, 441);
+ delete[] out;
+ }
+ }
+ // Simple test, with input/output buffer size aligned on the packet size,
+ // alternating Input and Output calls.
+ {
+ AudioPacketizer<int16_t, int16_t> ap(441, channels);
+ int16_t seqEnd = 0;
+ for (int16_t i = 0; i < 10; i++) {
+ AutoBuffer<int16_t> b(441 * channels);
+ int16_t prevEnd = seqEnd;
+ seqEnd = Sequence(b.Get(), channels * 441, prevEnd);
+ ap.Input(b.Get(), 441);
+ int16_t* out = ap.Output();
+ IsSequence(out, 441 * channels, prevEnd);
+ delete[] out;
+ }
+ }
+ // Simple test, with input/output buffer size aligned on the packet size,
+ // alternating two Input and Output calls.
+ {
+ AudioPacketizer<int16_t, int16_t> ap(441, channels);
+ int16_t seqEnd = 0;
+ for (int16_t i = 0; i < 10; i++) {
+ AutoBuffer<int16_t> b(441 * channels);
+ AutoBuffer<int16_t> b1(441 * channels);
+ int16_t prevEnd0 = seqEnd;
+ seqEnd = Sequence(b.Get(), 441 * channels, prevEnd0);
+ int16_t prevEnd1 = seqEnd;
+ seqEnd = Sequence(b1.Get(), 441 * channels, seqEnd);
+ ap.Input(b.Get(), 441);
+ ap.Input(b1.Get(), 441);
+ int16_t* out = ap.Output();
+ int16_t* out2 = ap.Output();
+ IsSequence(out, 441 * channels, prevEnd0);
+ IsSequence(out2, 441 * channels, prevEnd1);
+ delete[] out;
+ delete[] out2;
+ }
+ }
+ // Input/output buffer size not aligned on the packet size,
+ // alternating two Input and Output calls.
+ {
+ AudioPacketizer<int16_t, int16_t> ap(441, channels);
+ int16_t prevEnd = 0;
+ int16_t prevSeq = 0;
+ for (int16_t i = 0; i < 10; i++) {
+ AutoBuffer<int16_t> b(480 * channels);
+ AutoBuffer<int16_t> b1(480 * channels);
+ prevSeq = Sequence(b.Get(), 480 * channels, prevSeq);
+ prevSeq = Sequence(b1.Get(), 480 * channels, prevSeq);
+ ap.Input(b.Get(), 480);
+ ap.Input(b1.Get(), 480);
+ int16_t* out = ap.Output();
+ int16_t* out2 = ap.Output();
+ IsSequence(out, 441 * channels, prevEnd);
+ prevEnd += 441 * channels;
+ IsSequence(out2, 441 * channels, prevEnd);
+ prevEnd += 441 * channels;
+ delete[] out;
+ delete[] out2;
+ }
+ printf("Available: %d\n", ap.PacketsAvailable());
+ }
+
+ // "Real-life" test case: streaming a sine wave through a packetizer, and
+ // checking that we have the right output.
+ // 128 is, for example, the size of a Web Audio API block, and 441 is the
+ // size of a webrtc.org packet when the sample rate is 44100 (10ms)
+ {
+ AudioPacketizer<int16_t, int16_t> ap(441, channels);
+ AutoBuffer<int16_t> b(128 * channels);
+ uint32_t phase = 0;
+ uint32_t outPhase = 0;
+ for (int16_t i = 0; i < 1000; i++) {
+ for (int32_t j = 0; j < 128; j++) {
+ for (int32_t c = 0; c < channels; c++) {
+ // int16_t sinewave at 440Hz/44100Hz sample rate
+ b.Get()[j * channels + c] = (2 << 14) * sine(phase);
+ }
+ phase++;
+ }
+ ap.Input(b.Get(), 128);
+ while (ap.PacketsAvailable()) {
+ int16_t* packet = ap.Output();
+ for (uint32_t k = 0; k < ap.PacketSize(); k++) {
+ for (int32_t c = 0; c < channels; c++) {
+ ASSERT_TRUE(packet[k * channels + c] ==
+ static_cast<int16_t>(((2 << 14) * sine(outPhase))));
+ }
+ outPhase++;
+ }
+ delete [] packet;
+ }
+ }
+ }
+ }
+}
diff --git a/dom/media/gtest/TestAudioSegment.cpp b/dom/media/gtest/TestAudioSegment.cpp
new file mode 100644
index 000000000..968b4b5a1
--- /dev/null
+++ b/dom/media/gtest/TestAudioSegment.cpp
@@ -0,0 +1,257 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioSegment.h"
+#include <iostream>
+#include "gtest/gtest.h"
+
+using namespace mozilla;
+
+namespace audio_segment {
+
+/* Helper function to give us the maximum and minimum value that don't clip,
+ * for a given sample format (integer or floating-point). */
+template<typename T>
+T GetLowValue();
+
+template<typename T>
+T GetHighValue();
+
+template<typename T>
+T GetSilentValue();
+
+template<>
+float GetLowValue<float>() {
+ return -1.0;
+}
+
+template<>
+int16_t GetLowValue<short>() {
+ return -INT16_MAX;
+}
+
+template<>
+float GetHighValue<float>() {
+ return 1.0;
+}
+
+template<>
+int16_t GetHighValue<short>() {
+ return INT16_MAX;
+}
+
+template<>
+float GetSilentValue() {
+ return 0.0;
+}
+
+template<>
+int16_t GetSilentValue() {
+ return 0;
+}
+
+
+// Get an array of planar audio buffers that has the inverse of the index of the
+// channel (1-indexed) as samples.
+template<typename T>
+const T* const* GetPlanarChannelArray(size_t aChannels, size_t aSize)
+{
+ T** channels = new T*[aChannels];
+ for (size_t c = 0; c < aChannels; c++) {
+ channels[c] = new T[aSize];
+ for (size_t i = 0; i < aSize; i++) {
+ channels[c][i] = FloatToAudioSample<T>(1. / (c + 1));
+ }
+ }
+ return channels;
+}
+
+template<typename T>
+void DeletePlanarChannelsArray(const T* const* aArrays, size_t aChannels)
+{
+ for (size_t channel = 0; channel < aChannels; channel++) {
+ delete [] aArrays[channel];
+ }
+ delete [] aArrays;
+}
+
+template<typename T>
+T** GetPlanarArray(size_t aChannels, size_t aSize)
+{
+ T** channels = new T*[aChannels];
+ for (size_t c = 0; c < aChannels; c++) {
+ channels[c] = new T[aSize];
+ for (size_t i = 0; i < aSize; i++) {
+ channels[c][i] = 0.0f;
+ }
+ }
+ return channels;
+}
+
+template<typename T>
+void DeletePlanarArray(T** aArrays, size_t aChannels)
+{
+ for (size_t channel = 0; channel < aChannels; channel++) {
+ delete [] aArrays[channel];
+ }
+ delete [] aArrays;
+}
+
+// Get an array of audio samples that have the inverse of the index of the
+// channel (1-indexed) as samples.
+template<typename T>
+const T* GetInterleavedChannelArray(size_t aChannels, size_t aSize)
+{
+ size_t sampleCount = aChannels * aSize;
+ T* samples = new T[sampleCount];
+ for (size_t i = 0; i < sampleCount; i++) {
+ uint32_t channel = (i % aChannels) + 1;
+ samples[i] = FloatToAudioSample<T>(1. / channel);
+ }
+ return samples;
+}
+
+template<typename T>
+void DeleteInterleavedChannelArray(const T* aArray)
+{
+ delete [] aArray;
+}
+
+bool FuzzyEqual(float aLhs, float aRhs) {
+ return std::abs(aLhs - aRhs) < 0.01;
+}
+
+template<typename SrcT, typename DstT>
+void TestInterleaveAndConvert()
+{
+ size_t arraySize = 1024;
+ size_t maxChannels = 8; // 7.1
+ for (uint32_t channels = 1; channels < maxChannels; channels++) {
+ const SrcT* const* src = GetPlanarChannelArray<SrcT>(channels, arraySize);
+ DstT* dst = new DstT[channels * arraySize];
+
+ InterleaveAndConvertBuffer(src, arraySize, 1.0, channels, dst);
+
+ uint32_t channelIndex = 0;
+ for (size_t i = 0; i < arraySize * channels; i++) {
+ ASSERT_TRUE(FuzzyEqual(dst[i],
+ FloatToAudioSample<DstT>(1. / (channelIndex + 1))));
+ channelIndex++;
+ channelIndex %= channels;
+ }
+
+ DeletePlanarChannelsArray(src, channels);
+ delete [] dst;
+ }
+}
+
+template<typename SrcT, typename DstT>
+void TestDeinterleaveAndConvert()
+{
+ size_t arraySize = 1024;
+ size_t maxChannels = 8; // 7.1
+ for (uint32_t channels = 1; channels < maxChannels; channels++) {
+ const SrcT* src = GetInterleavedChannelArray<SrcT>(channels, arraySize);
+ DstT** dst = GetPlanarArray<DstT>(channels, arraySize);
+
+ DeinterleaveAndConvertBuffer(src, arraySize, channels, dst);
+
+ for (size_t channel = 0; channel < channels; channel++) {
+ for (size_t i = 0; i < arraySize; i++) {
+ ASSERT_TRUE(FuzzyEqual(dst[channel][i],
+ FloatToAudioSample<DstT>(1. / (channel + 1))));
+ }
+ }
+
+ DeleteInterleavedChannelArray(src);
+ DeletePlanarArray(dst, channels);
+ }
+}
+
+uint8_t gSilence[4096] = {0};
+
+template<typename T>
+T* SilentChannel()
+{
+ return reinterpret_cast<T*>(gSilence);
+}
+
+template<typename T>
+void TestUpmixStereo()
+{
+ size_t arraySize = 1024;
+ nsTArray<T*> channels;
+ nsTArray<const T*> channelsptr;
+
+ channels.SetLength(1);
+ channelsptr.SetLength(1);
+
+ channels[0] = new T[arraySize];
+
+ for (size_t i = 0; i < arraySize; i++) {
+ channels[0][i] = GetHighValue<T>();
+ }
+ channelsptr[0] = channels[0];
+
+ AudioChannelsUpMix(&channelsptr, 2, SilentChannel<T>());
+
+ for (size_t channel = 0; channel < 2; channel++) {
+ for (size_t i = 0; i < arraySize; i++) {
+ ASSERT_TRUE(channelsptr[channel][i] == GetHighValue<T>());
+ }
+ }
+ delete channels[0];
+}
+
+template<typename T>
+void TestDownmixStereo()
+{
+ const size_t arraySize = 1024;
+ nsTArray<const T*> inputptr;
+ nsTArray<T*> input;
+ T** output;
+
+ output = new T*[1];
+ output[0] = new T[arraySize];
+
+ input.SetLength(2);
+ inputptr.SetLength(2);
+
+ for (size_t channel = 0; channel < input.Length(); channel++) {
+ input[channel] = new T[arraySize];
+ for (size_t i = 0; i < arraySize; i++) {
+ input[channel][i] = channel == 0 ? GetLowValue<T>() : GetHighValue<T>();
+ }
+ inputptr[channel] = input[channel];
+ }
+
+ AudioChannelsDownMix(inputptr, output, 1, arraySize);
+
+ for (size_t i = 0; i < arraySize; i++) {
+ ASSERT_TRUE(output[0][i] == GetSilentValue<T>());
+ ASSERT_TRUE(output[0][i] == GetSilentValue<T>());
+ }
+
+ delete output[0];
+ delete output;
+}
+
+TEST(AudioSegment, Test)
+{
+ TestInterleaveAndConvert<float, float>();
+ TestInterleaveAndConvert<float, int16_t>();
+ TestInterleaveAndConvert<int16_t, float>();
+ TestInterleaveAndConvert<int16_t, int16_t>();
+ TestDeinterleaveAndConvert<float, float>();
+ TestDeinterleaveAndConvert<float, int16_t>();
+ TestDeinterleaveAndConvert<int16_t, float>();
+ TestDeinterleaveAndConvert<int16_t, int16_t>();
+ TestUpmixStereo<float>();
+ TestUpmixStereo<int16_t>();
+ TestDownmixStereo<float>();
+ TestDownmixStereo<int16_t>();
+}
+
+} // namespace audio_segment
diff --git a/dom/media/gtest/TestGMPCrossOrigin.cpp b/dom/media/gtest/TestGMPCrossOrigin.cpp
new file mode 100644
index 000000000..036282153
--- /dev/null
+++ b/dom/media/gtest/TestGMPCrossOrigin.cpp
@@ -0,0 +1,1552 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "nsAutoPtr.h"
+#include "nsIObserverService.h"
+#include "mozilla/Services.h"
+#include "mozilla/StaticPtr.h"
+#include "GMPTestMonitor.h"
+#include "GMPVideoDecoderProxy.h"
+#include "GMPVideoEncoderProxy.h"
+#include "GMPDecryptorProxy.h"
+#include "GMPServiceParent.h"
+#include "MediaPrefs.h"
+#include "nsAppDirectoryServiceDefs.h"
+#include "nsIFile.h"
+#include "nsISimpleEnumerator.h"
+#include "mozilla/Atomics.h"
+#include "nsNSSComponent.h"
+#include "mozilla/DebugOnly.h"
+#include "GMPDeviceBinding.h"
+#include "mozilla/dom/MediaKeyStatusMapBinding.h" // For MediaKeyStatus
+#include "mozilla/dom/MediaKeyMessageEventBinding.h" // For MediaKeyMessageType
+
+#if defined(XP_WIN)
+#include "mozilla/WindowsVersion.h"
+#endif
+
+using namespace std;
+
+using namespace mozilla;
+using namespace mozilla::gmp;
+
+struct GMPTestRunner
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPTestRunner)
+
+ GMPTestRunner() { MediaPrefs::GetSingleton(); }
+ void DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&));
+ void RunTestGMPTestCodec1(GMPTestMonitor& aMonitor);
+ void RunTestGMPTestCodec2(GMPTestMonitor& aMonitor);
+ void RunTestGMPTestCodec3(GMPTestMonitor& aMonitor);
+ void RunTestGMPCrossOrigin1(GMPTestMonitor& aMonitor);
+ void RunTestGMPCrossOrigin2(GMPTestMonitor& aMonitor);
+ void RunTestGMPCrossOrigin3(GMPTestMonitor& aMonitor);
+ void RunTestGMPCrossOrigin4(GMPTestMonitor& aMonitor);
+
+private:
+ ~GMPTestRunner() { }
+};
+
+template<class T, class Base,
+ nsresult (NS_STDCALL GeckoMediaPluginService::*Getter)(GMPCrashHelper*,
+ nsTArray<nsCString>*,
+ const nsACString&,
+ UniquePtr<Base>&&)>
+class RunTestGMPVideoCodec : public Base
+{
+public:
+ void Done(T* aGMP, GMPVideoHost* aHost) override
+ {
+ EXPECT_TRUE(aGMP);
+ EXPECT_TRUE(aHost);
+ if (aGMP) {
+ aGMP->Close();
+ }
+ mMonitor.SetFinished();
+ }
+
+ static void Run(GMPTestMonitor& aMonitor, const nsCString& aOrigin)
+ {
+ UniquePtr<GMPCallbackType> callback(new RunTestGMPVideoCodec(aMonitor));
+ Get(aOrigin, Move(callback));
+ }
+
+protected:
+ typedef T GMPCodecType;
+ typedef Base GMPCallbackType;
+
+ explicit RunTestGMPVideoCodec(GMPTestMonitor& aMonitor)
+ : mMonitor(aMonitor)
+ {
+ }
+
+ static nsresult Get(const nsACString& aNodeId, UniquePtr<Base>&& aCallback)
+ {
+ nsTArray<nsCString> tags;
+ tags.AppendElement(NS_LITERAL_CSTRING("h264"));
+ tags.AppendElement(NS_LITERAL_CSTRING("fake"));
+
+ RefPtr<GeckoMediaPluginService> service =
+ GeckoMediaPluginService::GetGeckoMediaPluginService();
+ return ((*service).*Getter)(nullptr, &tags, aNodeId, Move(aCallback));
+ }
+
+protected:
+ GMPTestMonitor& mMonitor;
+};
+
+typedef RunTestGMPVideoCodec<GMPVideoDecoderProxy,
+ GetGMPVideoDecoderCallback,
+ &GeckoMediaPluginService::GetGMPVideoDecoder>
+ RunTestGMPVideoDecoder;
+typedef RunTestGMPVideoCodec<GMPVideoEncoderProxy,
+ GetGMPVideoEncoderCallback,
+ &GeckoMediaPluginService::GetGMPVideoEncoder>
+ RunTestGMPVideoEncoder;
+
+void
+GMPTestRunner::RunTestGMPTestCodec1(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoDecoder::Run(aMonitor, NS_LITERAL_CSTRING("o"));
+}
+
+void
+GMPTestRunner::RunTestGMPTestCodec2(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoDecoder::Run(aMonitor, NS_LITERAL_CSTRING(""));
+}
+
+void
+GMPTestRunner::RunTestGMPTestCodec3(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoEncoder::Run(aMonitor, NS_LITERAL_CSTRING(""));
+}
+
+template<class Base>
+class RunTestGMPCrossOrigin : public Base
+{
+public:
+ void Done(typename Base::GMPCodecType* aGMP, GMPVideoHost* aHost) override
+ {
+ EXPECT_TRUE(aGMP);
+
+ UniquePtr<typename Base::GMPCallbackType> callback(
+ new Step2(Base::mMonitor, aGMP, mShouldBeEqual));
+ nsresult rv = Base::Get(mOrigin2, Move(callback));
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ if (NS_FAILED(rv)) {
+ Base::mMonitor.SetFinished();
+ }
+ }
+
+ static void Run(GMPTestMonitor& aMonitor, const nsCString& aOrigin1,
+ const nsCString& aOrigin2)
+ {
+ UniquePtr<typename Base::GMPCallbackType> callback(
+ new RunTestGMPCrossOrigin<Base>(aMonitor, aOrigin1, aOrigin2));
+ nsresult rv = Base::Get(aOrigin1, Move(callback));
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ if (NS_FAILED(rv)) {
+ aMonitor.SetFinished();
+ }
+ }
+
+private:
+ RunTestGMPCrossOrigin(GMPTestMonitor& aMonitor, const nsCString& aOrigin1,
+ const nsCString& aOrigin2)
+ : Base(aMonitor),
+ mGMP(nullptr),
+ mOrigin2(aOrigin2),
+ mShouldBeEqual(aOrigin1.Equals(aOrigin2))
+ {
+ }
+
+ class Step2 : public Base
+ {
+ public:
+ Step2(GMPTestMonitor& aMonitor,
+ typename Base::GMPCodecType* aGMP,
+ bool aShouldBeEqual)
+ : Base(aMonitor),
+ mGMP(aGMP),
+ mShouldBeEqual(aShouldBeEqual)
+ {
+ }
+ void Done(typename Base::GMPCodecType* aGMP, GMPVideoHost* aHost) override
+ {
+ EXPECT_TRUE(aGMP);
+ if (aGMP) {
+ EXPECT_TRUE(mGMP &&
+ (mGMP->GetPluginId() == aGMP->GetPluginId()) == mShouldBeEqual);
+ }
+ if (mGMP) {
+ mGMP->Close();
+ }
+ Base::Done(aGMP, aHost);
+ }
+
+ private:
+ typename Base::GMPCodecType* mGMP;
+ bool mShouldBeEqual;
+ };
+
+ typename Base::GMPCodecType* mGMP;
+ nsCString mOrigin2;
+ bool mShouldBeEqual;
+};
+
+typedef RunTestGMPCrossOrigin<RunTestGMPVideoDecoder>
+ RunTestGMPVideoDecoderCrossOrigin;
+typedef RunTestGMPCrossOrigin<RunTestGMPVideoEncoder>
+ RunTestGMPVideoEncoderCrossOrigin;
+
+void
+GMPTestRunner::RunTestGMPCrossOrigin1(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoDecoderCrossOrigin::Run(
+ aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin2"));
+}
+
+void
+GMPTestRunner::RunTestGMPCrossOrigin2(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoEncoderCrossOrigin::Run(
+ aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin2"));
+}
+
+void
+GMPTestRunner::RunTestGMPCrossOrigin3(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoDecoderCrossOrigin::Run(
+ aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin1"));
+}
+
+void
+GMPTestRunner::RunTestGMPCrossOrigin4(GMPTestMonitor& aMonitor)
+{
+ RunTestGMPVideoEncoderCrossOrigin::Run(
+ aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin1"));
+}
+
+static already_AddRefed<nsIThread>
+GetGMPThread()
+{
+ RefPtr<GeckoMediaPluginService> service =
+ GeckoMediaPluginService::GetGeckoMediaPluginService();
+ nsCOMPtr<nsIThread> thread;
+ EXPECT_TRUE(NS_SUCCEEDED(service->GetThread(getter_AddRefs(thread))));
+ return thread.forget();
+}
+
+/**
+ * Enumerate files under |aPath| (non-recursive).
+ */
+template<typename T>
+static nsresult
+EnumerateDir(nsIFile* aPath, T&& aDirIter)
+{
+ nsCOMPtr<nsISimpleEnumerator> iter;
+ nsresult rv = aPath->GetDirectoryEntries(getter_AddRefs(iter));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ bool hasMore = false;
+ while (NS_SUCCEEDED(iter->HasMoreElements(&hasMore)) && hasMore) {
+ nsCOMPtr<nsISupports> supports;
+ rv = iter->GetNext(getter_AddRefs(supports));
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ nsCOMPtr<nsIFile> entry(do_QueryInterface(supports, &rv));
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ aDirIter(entry);
+ }
+ return NS_OK;
+}
+
+/**
+ * Enumerate files under $profileDir/gmp/$platform/gmp-fake/$aDir/ (non-recursive).
+ */
+template<typename T>
+static nsresult
+EnumerateGMPStorageDir(const nsACString& aDir, T&& aDirIter)
+{
+ RefPtr<GeckoMediaPluginServiceParent> service =
+ GeckoMediaPluginServiceParent::GetSingleton();
+ MOZ_ASSERT(service);
+
+ // $profileDir/gmp/$platform/
+ nsCOMPtr<nsIFile> path;
+ nsresult rv = service->GetStorageDir(getter_AddRefs(path));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+
+ // $profileDir/gmp/$platform/gmp-fake/
+ rv = path->Append(NS_LITERAL_STRING("gmp-fake"));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ // $profileDir/gmp/$platform/gmp-fake/$aDir/
+ rv = path->AppendNative(aDir);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ return EnumerateDir(path, aDirIter);
+}
+
+class GMPShutdownObserver : public nsIRunnable
+ , public nsIObserver {
+public:
+ GMPShutdownObserver(already_AddRefed<nsIRunnable> aShutdownTask,
+ already_AddRefed<nsIRunnable> Continuation,
+ const nsACString& aNodeId)
+ : mShutdownTask(aShutdownTask)
+ , mContinuation(Continuation)
+ , mNodeId(NS_ConvertUTF8toUTF16(aNodeId))
+ {}
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ NS_IMETHOD Run() override {
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ EXPECT_TRUE(observerService);
+ observerService->AddObserver(this, "gmp-shutdown", false);
+
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+ thread->Dispatch(mShutdownTask, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ }
+
+ NS_IMETHOD Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aSomeData) override
+ {
+ if (!strcmp(aTopic, "gmp-shutdown") &&
+ mNodeId.Equals(nsDependentString(aSomeData))) {
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ EXPECT_TRUE(observerService);
+ observerService->RemoveObserver(this, "gmp-shutdown");
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+ thread->Dispatch(mContinuation, NS_DISPATCH_NORMAL);
+ }
+ return NS_OK;
+ }
+
+private:
+ virtual ~GMPShutdownObserver() {}
+ nsCOMPtr<nsIRunnable> mShutdownTask;
+ nsCOMPtr<nsIRunnable> mContinuation;
+ const nsString mNodeId;
+};
+
+NS_IMPL_ISUPPORTS(GMPShutdownObserver, nsIRunnable, nsIObserver)
+
+class NotifyObserversTask : public Runnable {
+public:
+ explicit NotifyObserversTask(const char* aTopic)
+ : mTopic(aTopic)
+ {}
+ NS_IMETHOD Run() override {
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ if (observerService) {
+ observerService->NotifyObservers(nullptr, mTopic, nullptr);
+ }
+ return NS_OK;
+ }
+ const char* mTopic;
+};
+
+class ClearGMPStorageTask : public nsIRunnable
+ , public nsIObserver {
+public:
+ ClearGMPStorageTask(already_AddRefed<nsIRunnable> Continuation,
+ nsIThread* aTarget, PRTime aSince)
+ : mContinuation(Continuation)
+ , mTarget(aTarget)
+ , mSince(aSince)
+ {}
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ NS_IMETHOD Run() override {
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ EXPECT_TRUE(observerService);
+ observerService->AddObserver(this, "gmp-clear-storage-complete", false);
+ if (observerService) {
+ nsAutoString str;
+ if (mSince >= 0) {
+ str.AppendInt(static_cast<int64_t>(mSince));
+ }
+ observerService->NotifyObservers(
+ nullptr, "browser:purge-session-history", str.Data());
+ }
+ return NS_OK;
+ }
+
+ NS_IMETHOD Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aSomeData) override
+ {
+ if (!strcmp(aTopic, "gmp-clear-storage-complete")) {
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ EXPECT_TRUE(observerService);
+ observerService->RemoveObserver(this, "gmp-clear-storage-complete");
+ mTarget->Dispatch(mContinuation, NS_DISPATCH_NORMAL);
+ }
+ return NS_OK;
+ }
+
+private:
+ virtual ~ClearGMPStorageTask() {}
+ nsCOMPtr<nsIRunnable> mContinuation;
+ nsCOMPtr<nsIThread> mTarget;
+ const PRTime mSince;
+};
+
+NS_IMPL_ISUPPORTS(ClearGMPStorageTask, nsIRunnable, nsIObserver)
+
+static void
+ClearGMPStorage(already_AddRefed<nsIRunnable> aContinuation,
+ nsIThread* aTarget, PRTime aSince = -1)
+{
+ RefPtr<ClearGMPStorageTask> task(
+ new ClearGMPStorageTask(Move(aContinuation), aTarget, aSince));
+ NS_DispatchToMainThread(task, NS_DISPATCH_NORMAL);
+}
+
+static void
+SimulatePBModeExit()
+{
+ NS_DispatchToMainThread(new NotifyObserversTask("last-pb-context-exited"), NS_DISPATCH_SYNC);
+}
+
+class TestGetNodeIdCallback : public GetNodeIdCallback
+{
+public:
+ TestGetNodeIdCallback(nsCString& aNodeId, nsresult& aResult)
+ : mNodeId(aNodeId),
+ mResult(aResult)
+ {
+ }
+
+ void Done(nsresult aResult, const nsACString& aNodeId)
+ {
+ mResult = aResult;
+ mNodeId = aNodeId;
+ }
+
+private:
+ nsCString& mNodeId;
+ nsresult& mResult;
+};
+
+static nsCString
+GetNodeId(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ bool aInPBMode)
+{
+ RefPtr<GeckoMediaPluginServiceParent> service =
+ GeckoMediaPluginServiceParent::GetSingleton();
+ EXPECT_TRUE(service);
+ nsCString nodeId;
+ nsresult result;
+ UniquePtr<GetNodeIdCallback> callback(new TestGetNodeIdCallback(nodeId,
+ result));
+ // We rely on the fact that the GetNodeId implementation for
+ // GeckoMediaPluginServiceParent is synchronous.
+ nsresult rv = service->GetNodeId(aOrigin,
+ aTopLevelOrigin,
+ NS_LITERAL_STRING("gmp-fake"),
+ aInPBMode,
+ Move(callback));
+ EXPECT_TRUE(NS_SUCCEEDED(rv) && NS_SUCCEEDED(result));
+ return nodeId;
+}
+
+static bool
+IsGMPStorageIsEmpty()
+{
+ RefPtr<GeckoMediaPluginServiceParent> service =
+ GeckoMediaPluginServiceParent::GetSingleton();
+ MOZ_ASSERT(service);
+ nsCOMPtr<nsIFile> storage;
+ nsresult rv = service->GetStorageDir(getter_AddRefs(storage));
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ bool exists = false;
+ if (storage) {
+ storage->Exists(&exists);
+ }
+ return !exists;
+}
+
+static void
+AssertIsOnGMPThread()
+{
+ RefPtr<GeckoMediaPluginService> service =
+ GeckoMediaPluginService::GetGeckoMediaPluginService();
+ MOZ_ASSERT(service);
+ nsCOMPtr<nsIThread> thread;
+ service->GetThread(getter_AddRefs(thread));
+ MOZ_ASSERT(thread);
+ nsCOMPtr<nsIThread> currentThread;
+ DebugOnly<nsresult> rv = NS_GetCurrentThread(getter_AddRefs(currentThread));
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ MOZ_ASSERT(currentThread == thread);
+}
+
+class GMPStorageTest : public GMPDecryptorProxyCallback
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPStorageTest)
+
+ void DoTest(void (GMPStorageTest::*aTestMethod)()) {
+ EnsureNSSInitializedChromeOrContent();
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+ ClearGMPStorage(NewRunnableMethod(this, aTestMethod), thread);
+ AwaitFinished();
+ }
+
+ GMPStorageTest()
+ : mDecryptor(nullptr)
+ , mMonitor("GMPStorageTest")
+ , mFinished(false)
+ {
+ }
+
+ void
+ Update(const nsCString& aMessage)
+ {
+ nsTArray<uint8_t> msg;
+ msg.AppendElements(aMessage.get(), aMessage.Length());
+ mDecryptor->UpdateSession(1, NS_LITERAL_CSTRING("fake-session-id"), msg);
+ }
+
+ void TestGetNodeId()
+ {
+ AssertIsOnGMPThread();
+
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ const nsString origin1 = NS_LITERAL_STRING("http://example1.com");
+ const nsString origin2 = NS_LITERAL_STRING("http://example2.org");
+
+ nsCString PBnodeId1 = GetNodeId(origin1, origin2, true);
+ nsCString PBnodeId2 = GetNodeId(origin1, origin2, true);
+
+ // Node ids for the same origins should be the same in PB mode.
+ EXPECT_TRUE(PBnodeId1.Equals(PBnodeId2));
+
+ nsCString PBnodeId3 = GetNodeId(origin2, origin1, true);
+
+ // Node ids with origin and top level origin swapped should be different.
+ EXPECT_TRUE(!PBnodeId3.Equals(PBnodeId1));
+
+ // Getting node ids in PB mode should not result in the node id being stored.
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ nsCString nodeId1 = GetNodeId(origin1, origin2, false);
+ nsCString nodeId2 = GetNodeId(origin1, origin2, false);
+
+ // NodeIds for the same origin pair in non-pb mode should be the same.
+ EXPECT_TRUE(nodeId1.Equals(nodeId2));
+
+ // Node ids for a given origin pair should be different for the PB origins should be the same in PB mode.
+ EXPECT_TRUE(!PBnodeId1.Equals(nodeId1));
+ EXPECT_TRUE(!PBnodeId2.Equals(nodeId2));
+
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+ ClearGMPStorage(NewRunnableMethod<nsCString>(
+ this, &GMPStorageTest::TestGetNodeId_Continuation, nodeId1), thread);
+ }
+
+ void TestGetNodeId_Continuation(nsCString aNodeId1) {
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ // Once we clear storage, the node ids generated for the same origin-pair
+ // should be different.
+ const nsString origin1 = NS_LITERAL_STRING("http://example1.com");
+ const nsString origin2 = NS_LITERAL_STRING("http://example2.org");
+ nsCString nodeId3 = GetNodeId(origin1, origin2, false);
+ EXPECT_TRUE(!aNodeId1.Equals(nodeId3));
+
+ SetFinished();
+ }
+
+ class CreateDecryptorDone : public GetGMPDecryptorCallback
+ {
+ public:
+ explicit CreateDecryptorDone(GMPStorageTest* aRunner)
+ : mRunner(aRunner)
+ {
+ }
+
+ void Done(GMPDecryptorProxy* aDecryptor) override
+ {
+ mRunner->mDecryptor = aDecryptor;
+ EXPECT_TRUE(!!mRunner->mDecryptor);
+
+ if (mRunner->mDecryptor) {
+ mRunner->mDecryptor->Init(mRunner, false, true);
+ }
+ }
+
+ private:
+ RefPtr<GMPStorageTest> mRunner;
+ };
+
+ void CreateDecryptor(const nsCString& aNodeId,
+ const nsCString& aUpdate)
+ {
+ nsTArray<nsCString> updates;
+ updates.AppendElement(aUpdate);
+ nsCOMPtr<nsIRunnable> continuation(new Updates(this, Move(updates)));
+ CreateDecryptor(aNodeId, continuation);
+ }
+
+ void CreateDecryptor(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ bool aInPBMode,
+ const nsCString& aUpdate)
+ {
+ nsTArray<nsCString> updates;
+ updates.AppendElement(aUpdate);
+ CreateDecryptor(aOrigin, aTopLevelOrigin, aInPBMode, Move(updates));
+ }
+ class Updates : public Runnable
+ {
+ public:
+ Updates(GMPStorageTest* aRunner, nsTArray<nsCString>&& aUpdates)
+ : mRunner(aRunner),
+ mUpdates(Move(aUpdates))
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ for (auto& update : mUpdates) {
+ mRunner->Update(update);
+ }
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<GMPStorageTest> mRunner;
+ nsTArray<nsCString> mUpdates;
+ };
+ void CreateDecryptor(const nsAString& aOrigin,
+ const nsAString& aTopLevelOrigin,
+ bool aInPBMode,
+ nsTArray<nsCString>&& aUpdates) {
+ nsCOMPtr<nsIRunnable> updates(new Updates(this, Move(aUpdates)));
+ CreateDecryptor(GetNodeId(aOrigin, aTopLevelOrigin, aInPBMode), updates);
+ }
+
+ void CreateDecryptor(const nsCString& aNodeId,
+ nsIRunnable* aContinuation) {
+ RefPtr<GeckoMediaPluginService> service =
+ GeckoMediaPluginService::GetGeckoMediaPluginService();
+ EXPECT_TRUE(service);
+
+ mNodeId = aNodeId;
+ EXPECT_TRUE(!mNodeId.IsEmpty());
+
+ nsTArray<nsCString> tags;
+ tags.AppendElement(NS_LITERAL_CSTRING("fake"));
+
+ UniquePtr<GetGMPDecryptorCallback> callback(
+ new CreateDecryptorDone(this));
+
+ // Continue after the OnSetDecryptorId message, so that we don't
+ // get warnings in the async shutdown tests due to receiving the
+ // SetDecryptorId message after we've started shutdown.
+ mSetDecryptorIdContinuation = aContinuation;
+
+ nsresult rv =
+ service->GetGMPDecryptor(nullptr, &tags, mNodeId, Move(callback));
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ }
+
+ void TestBasicStorage() {
+ AssertIsOnGMPThread();
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ RefPtr<GeckoMediaPluginService> service =
+ GeckoMediaPluginService::GetGeckoMediaPluginService();
+
+ // Send a message to the fake GMP for it to run its own tests internally.
+ // It sends us a "test-storage complete" message when its passed, or
+ // some other message if its tests fail.
+ Expect(NS_LITERAL_CSTRING("test-storage complete"),
+ NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example1.com"),
+ NS_LITERAL_STRING("http://example2.com"),
+ false,
+ NS_LITERAL_CSTRING("test-storage"));
+ }
+
+ /**
+ * 1. Generate storage data for some sites.
+ * 2. Forget about one of the sites.
+ * 3. Check if the storage data for the forgotten site are erased correctly.
+ * 4. Check if the storage data for other sites remain unchanged.
+ */
+ void TestForgetThisSite() {
+ AssertIsOnGMPThread();
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ // Generate storage data for some site.
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestForgetThisSite_AnotherSite);
+ Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget());
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example1.com"),
+ NS_LITERAL_STRING("http://example2.com"),
+ false,
+ NS_LITERAL_CSTRING("test-storage"));
+ }
+
+ void TestForgetThisSite_AnotherSite() {
+ Shutdown();
+
+ // Generate storage data for another site.
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestForgetThisSite_CollectSiteInfo);
+ Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget());
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example3.com"),
+ NS_LITERAL_STRING("http://example4.com"),
+ false,
+ NS_LITERAL_CSTRING("test-storage"));
+ }
+
+ struct NodeInfo {
+ explicit NodeInfo(const nsACString& aSite,
+ const mozilla::OriginAttributesPattern& aPattern)
+ : siteToForget(aSite)
+ , mPattern(aPattern)
+ { }
+ nsCString siteToForget;
+ mozilla::OriginAttributesPattern mPattern;
+ nsTArray<nsCString> expectedRemainingNodeIds;
+ };
+
+ class NodeIdCollector {
+ public:
+ explicit NodeIdCollector(NodeInfo* aInfo) : mNodeInfo(aInfo) {}
+ void operator()(nsIFile* aFile) {
+ nsCString salt;
+ nsresult rv = ReadSalt(aFile, salt);
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+ if (!MatchOrigin(aFile, mNodeInfo->siteToForget, mNodeInfo->mPattern)) {
+ mNodeInfo->expectedRemainingNodeIds.AppendElement(salt);
+ }
+ }
+ private:
+ NodeInfo* mNodeInfo;
+ };
+
+ void TestForgetThisSite_CollectSiteInfo() {
+ mozilla::OriginAttributesPattern pattern;
+
+ nsAutoPtr<NodeInfo> siteInfo(
+ new NodeInfo(NS_LITERAL_CSTRING("http://example1.com"),
+ pattern));
+ // Collect nodeIds that are expected to remain for later comparison.
+ EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), NodeIdCollector(siteInfo));
+ // Invoke "Forget this site" on the main thread.
+ NS_DispatchToMainThread(NewRunnableMethod<nsAutoPtr<NodeInfo>>(
+ this, &GMPStorageTest::TestForgetThisSite_Forget, siteInfo));
+ }
+
+ void TestForgetThisSite_Forget(nsAutoPtr<NodeInfo> aSiteInfo) {
+ RefPtr<GeckoMediaPluginServiceParent> service =
+ GeckoMediaPluginServiceParent::GetSingleton();
+ service->ForgetThisSiteNative(NS_ConvertUTF8toUTF16(aSiteInfo->siteToForget),
+ aSiteInfo->mPattern);
+
+ nsCOMPtr<nsIThread> thread;
+ service->GetThread(getter_AddRefs(thread));
+
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod<nsAutoPtr<NodeInfo>>(
+ this, &GMPStorageTest::TestForgetThisSite_Verify, aSiteInfo);
+ thread->Dispatch(r, NS_DISPATCH_NORMAL);
+
+ nsCOMPtr<nsIRunnable> f = NewRunnableMethod(
+ this, &GMPStorageTest::SetFinished);
+ thread->Dispatch(f, NS_DISPATCH_NORMAL);
+ }
+
+ class NodeIdVerifier {
+ public:
+ explicit NodeIdVerifier(const NodeInfo* aInfo)
+ : mNodeInfo(aInfo)
+ , mExpectedRemainingNodeIds(aInfo->expectedRemainingNodeIds) {}
+ void operator()(nsIFile* aFile) {
+ nsCString salt;
+ nsresult rv = ReadSalt(aFile, salt);
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+ // Shouldn't match the origin if we clear correctly.
+ EXPECT_FALSE(MatchOrigin(aFile, mNodeInfo->siteToForget, mNodeInfo->mPattern));
+ // Check if remaining nodeIDs are as expected.
+ EXPECT_TRUE(mExpectedRemainingNodeIds.RemoveElement(salt));
+ }
+ ~NodeIdVerifier() {
+ EXPECT_TRUE(mExpectedRemainingNodeIds.IsEmpty());
+ }
+ private:
+ const NodeInfo* mNodeInfo;
+ nsTArray<nsCString> mExpectedRemainingNodeIds;
+ };
+
+ class StorageVerifier {
+ public:
+ explicit StorageVerifier(const NodeInfo* aInfo)
+ : mExpectedRemainingNodeIds(aInfo->expectedRemainingNodeIds) {}
+ void operator()(nsIFile* aFile) {
+ nsCString salt;
+ nsresult rv = aFile->GetNativeLeafName(salt);
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+ EXPECT_TRUE(mExpectedRemainingNodeIds.RemoveElement(salt));
+ }
+ ~StorageVerifier() {
+ EXPECT_TRUE(mExpectedRemainingNodeIds.IsEmpty());
+ }
+ private:
+ nsTArray<nsCString> mExpectedRemainingNodeIds;
+ };
+
+ void TestForgetThisSite_Verify(nsAutoPtr<NodeInfo> aSiteInfo) {
+ nsresult rv = EnumerateGMPStorageDir(
+ NS_LITERAL_CSTRING("id"), NodeIdVerifier(aSiteInfo));
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+
+ rv = EnumerateGMPStorageDir(
+ NS_LITERAL_CSTRING("storage"), StorageVerifier(aSiteInfo));
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ }
+
+ /**
+ * 1. Generate some storage data.
+ * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/id/.
+ * 3. Pass |t| to clear recent history.
+ * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and
+ * $profileDir/gmp/$platform/gmp-fake/storage are removed.
+ */
+ void TestClearRecentHistory1() {
+ AssertIsOnGMPThread();
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ // Generate storage data for some site.
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestClearRecentHistory1_Clear);
+ Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget());
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example1.com"),
+ NS_LITERAL_STRING("http://example2.com"),
+ false,
+ NS_LITERAL_CSTRING("test-storage"));
+}
+
+ /**
+ * 1. Generate some storage data.
+ * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/storage/.
+ * 3. Pass |t| to clear recent history.
+ * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and
+ * $profileDir/gmp/$platform/gmp-fake/storage are removed.
+ */
+ void TestClearRecentHistory2() {
+ AssertIsOnGMPThread();
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ // Generate storage data for some site.
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestClearRecentHistory2_Clear);
+ Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget());
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example1.com"),
+ NS_LITERAL_STRING("http://example2.com"),
+ false,
+ NS_LITERAL_CSTRING("test-storage"));
+ }
+
+ /**
+ * 1. Generate some storage data.
+ * 2. Find the max mtime |t| in $profileDir/gmp/$platform/gmp-fake/storage/.
+ * 3. Pass |t+1| to clear recent history.
+ * 4. Check if all directories in $profileDir/gmp/$platform/gmp-fake/id/ and
+ * $profileDir/gmp/$platform/gmp-fake/storage remain unchanged.
+ */
+ void TestClearRecentHistory3() {
+ AssertIsOnGMPThread();
+ EXPECT_TRUE(IsGMPStorageIsEmpty());
+
+ // Generate storage data for some site.
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestClearRecentHistory3_Clear);
+ Expect(NS_LITERAL_CSTRING("test-storage complete"), r.forget());
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example1.com"),
+ NS_LITERAL_STRING("http://example2.com"),
+ false,
+ NS_LITERAL_CSTRING("test-storage"));
+ }
+
+ class MaxMTimeFinder {
+ public:
+ MaxMTimeFinder() : mMaxTime(0) {}
+ void operator()(nsIFile* aFile) {
+ PRTime lastModified;
+ nsresult rv = aFile->GetLastModifiedTime(&lastModified);
+ if (NS_SUCCEEDED(rv) && lastModified > mMaxTime) {
+ mMaxTime = lastModified;
+ }
+ EnumerateDir(aFile, *this);
+ }
+ PRTime GetResult() const { return mMaxTime; }
+ private:
+ PRTime mMaxTime;
+ };
+
+ void TestClearRecentHistory1_Clear() {
+ MaxMTimeFinder f;
+ nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), f);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestClearRecentHistory_CheckEmpty);
+ nsCOMPtr<nsIThread> t(GetGMPThread());
+ ClearGMPStorage(r.forget(), t, f.GetResult());
+ }
+
+ void TestClearRecentHistory2_Clear() {
+ MaxMTimeFinder f;
+ nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), f);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestClearRecentHistory_CheckEmpty);
+ nsCOMPtr<nsIThread> t(GetGMPThread());
+ ClearGMPStorage(r.forget(), t, f.GetResult());
+ }
+
+ void TestClearRecentHistory3_Clear() {
+ MaxMTimeFinder f;
+ nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), f);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(
+ this, &GMPStorageTest::TestClearRecentHistory_CheckNonEmpty);
+ nsCOMPtr<nsIThread> t(GetGMPThread());
+ ClearGMPStorage(r.forget(), t, f.GetResult() + 1);
+ }
+
+ class FileCounter {
+ public:
+ FileCounter() : mCount(0) {}
+ void operator()(nsIFile* aFile) {
+ ++mCount;
+ }
+ int GetCount() const { return mCount; }
+ private:
+ int mCount;
+ };
+
+ void TestClearRecentHistory_CheckEmpty() {
+ FileCounter c1;
+ nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), c1);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ // There should be no files under $profileDir/gmp/$platform/gmp-fake/id/
+ EXPECT_EQ(c1.GetCount(), 0);
+
+ FileCounter c2;
+ rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), c2);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ // There should be no files under $profileDir/gmp/$platform/gmp-fake/storage/
+ EXPECT_EQ(c2.GetCount(), 0);
+
+ SetFinished();
+ }
+
+ void TestClearRecentHistory_CheckNonEmpty() {
+ FileCounter c1;
+ nsresult rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("id"), c1);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ // There should be one directory under $profileDir/gmp/$platform/gmp-fake/id/
+ EXPECT_EQ(c1.GetCount(), 1);
+
+ FileCounter c2;
+ rv = EnumerateGMPStorageDir(NS_LITERAL_CSTRING("storage"), c2);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+ // There should be one directory under $profileDir/gmp/$platform/gmp-fake/storage/
+ EXPECT_EQ(c2.GetCount(), 1);
+
+ SetFinished();
+ }
+
+ void TestCrossOriginStorage() {
+ EXPECT_TRUE(!mDecryptor);
+
+ // Send the decryptor the message "store recordid $time"
+ // Wait for the decrytor to send us "stored recordid $time"
+ auto t = time(0);
+ nsCString response("stored crossOriginTestRecordId ");
+ response.AppendInt((int64_t)t);
+ Expect(response, NewRunnableMethod(this,
+ &GMPStorageTest::TestCrossOriginStorage_RecordStoredContinuation));
+
+ nsCString update("store crossOriginTestRecordId ");
+ update.AppendInt((int64_t)t);
+
+ // Open decryptor on one, origin, write a record, and test that that
+ // record can't be read on another origin.
+ CreateDecryptor(NS_LITERAL_STRING("http://example3.com"),
+ NS_LITERAL_STRING("http://example4.com"),
+ false,
+ update);
+ }
+
+ void TestCrossOriginStorage_RecordStoredContinuation() {
+ // Close the old decryptor, and create a new one on a different origin,
+ // and try to read the record.
+ Shutdown();
+
+ Expect(NS_LITERAL_CSTRING("retrieve crossOriginTestRecordId succeeded (length 0 bytes)"),
+ NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example5.com"),
+ NS_LITERAL_STRING("http://example6.com"),
+ false,
+ NS_LITERAL_CSTRING("retrieve crossOriginTestRecordId"));
+ }
+
+ void TestPBStorage() {
+ // Send the decryptor the message "store recordid $time"
+ // Wait for the decrytor to send us "stored recordid $time"
+ nsCString response("stored pbdata test-pb-data");
+ Expect(response, NewRunnableMethod(this,
+ &GMPStorageTest::TestPBStorage_RecordStoredContinuation));
+
+ // Open decryptor on one, origin, write a record, close decryptor,
+ // open another, and test that record can be read, close decryptor,
+ // then send pb-last-context-closed notification, then open decryptor
+ // and check that it can't read that data; it should have been purged.
+ CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"),
+ NS_LITERAL_STRING("http://pb2.com"),
+ true,
+ NS_LITERAL_CSTRING("store pbdata test-pb-data"));
+ }
+
+ void TestPBStorage_RecordStoredContinuation() {
+ Shutdown();
+
+ Expect(NS_LITERAL_CSTRING("retrieve pbdata succeeded (length 12 bytes)"),
+ NewRunnableMethod(this,
+ &GMPStorageTest::TestPBStorage_RecordRetrievedContinuation));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"),
+ NS_LITERAL_STRING("http://pb2.com"),
+ true,
+ NS_LITERAL_CSTRING("retrieve pbdata"));
+ }
+
+ void TestPBStorage_RecordRetrievedContinuation() {
+ Shutdown();
+ SimulatePBModeExit();
+
+ Expect(NS_LITERAL_CSTRING("retrieve pbdata succeeded (length 0 bytes)"),
+ NewRunnableMethod(this,
+ &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://pb1.com"),
+ NS_LITERAL_STRING("http://pb2.com"),
+ true,
+ NS_LITERAL_CSTRING("retrieve pbdata"));
+ }
+
+ void NextAsyncShutdownTimeoutTest(nsIRunnable* aContinuation)
+ {
+ if (mDecryptor) {
+ Update(NS_LITERAL_CSTRING("shutdown-mode timeout"));
+ Shutdown();
+ }
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+ thread->Dispatch(aContinuation, NS_DISPATCH_NORMAL);
+ }
+
+ void CreateAsyncShutdownTimeoutGMP(const nsAString& aOrigin1,
+ const nsAString& aOrigin2,
+ void (GMPStorageTest::*aCallback)()) {
+ nsCOMPtr<nsIRunnable> continuation(
+ NewRunnableMethod<nsCOMPtr<nsIRunnable>>(
+ this,
+ &GMPStorageTest::NextAsyncShutdownTimeoutTest,
+ NewRunnableMethod(this, aCallback)));
+
+ CreateDecryptor(GetNodeId(aOrigin1, aOrigin2, false), continuation);
+ }
+
+ void TestAsyncShutdownTimeout() {
+ // Create decryptors that timeout in their async shutdown.
+ // If the gtest hangs on shutdown, test fails!
+ CreateAsyncShutdownTimeoutGMP(NS_LITERAL_STRING("http://example7.com"),
+ NS_LITERAL_STRING("http://example8.com"),
+ &GMPStorageTest::TestAsyncShutdownTimeout2);
+ };
+
+ void TestAsyncShutdownTimeout2() {
+ CreateAsyncShutdownTimeoutGMP(NS_LITERAL_STRING("http://example9.com"),
+ NS_LITERAL_STRING("http://example10.com"),
+ &GMPStorageTest::TestAsyncShutdownTimeout3);
+ };
+
+ void TestAsyncShutdownTimeout3() {
+ CreateAsyncShutdownTimeoutGMP(NS_LITERAL_STRING("http://example11.com"),
+ NS_LITERAL_STRING("http://example12.com"),
+ &GMPStorageTest::SetFinished);
+ };
+
+ void TestAsyncShutdownStorage() {
+ // Instruct the GMP to write a token (the current timestamp, so it's
+ // unique) during async shutdown, then shutdown the plugin, re-create
+ // it, and check that the token was successfully stored.
+ auto t = time(0);
+ nsCString update("shutdown-mode token ");
+ nsCString token;
+ token.AppendInt((int64_t)t);
+ update.Append(token);
+
+ // Wait for a response from the GMP, so we know it's had time to receive
+ // the token.
+ nsCString response("shutdown-token received ");
+ response.Append(token);
+ Expect(response, NewRunnableMethod<nsCString>(this,
+ &GMPStorageTest::TestAsyncShutdownStorage_ReceivedShutdownToken, token));
+
+ // Test that a GMP can write to storage during shutdown, and retrieve
+ // that written data in a subsequent session.
+ CreateDecryptor(NS_LITERAL_STRING("http://example13.com"),
+ NS_LITERAL_STRING("http://example14.com"),
+ false,
+ update);
+ }
+
+ void TestAsyncShutdownStorage_ReceivedShutdownToken(const nsCString& aToken) {
+ ShutdownThen(NewRunnableMethod<nsCString>(this,
+ &GMPStorageTest::TestAsyncShutdownStorage_AsyncShutdownComplete, aToken));
+ }
+
+ void TestAsyncShutdownStorage_AsyncShutdownComplete(const nsCString& aToken) {
+ // Create a new instance of the plugin, retrieve the token written
+ // during shutdown and verify it is correct.
+ nsCString response("retrieved shutdown-token ");
+ response.Append(aToken);
+ Expect(response,
+ NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example13.com"),
+ NS_LITERAL_STRING("http://example14.com"),
+ false,
+ NS_LITERAL_CSTRING("retrieve-shutdown-token"));
+ }
+
+#if defined(XP_WIN)
+ void TestOutputProtection() {
+ Shutdown();
+
+ Expect(NS_LITERAL_CSTRING("OP tests completed"),
+ NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example15.com"),
+ NS_LITERAL_STRING("http://example16.com"),
+ false,
+ NS_LITERAL_CSTRING("test-op-apis"));
+ }
+#endif
+
+ void TestPluginVoucher() {
+ Expect(NS_LITERAL_CSTRING("retrieved plugin-voucher: gmp-fake placeholder voucher"),
+ NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(NS_LITERAL_STRING("http://example17.com"),
+ NS_LITERAL_STRING("http://example18.com"),
+ false,
+ NS_LITERAL_CSTRING("retrieve-plugin-voucher"));
+ }
+
+ void TestGetRecordNamesInMemoryStorage() {
+ TestGetRecordNames(true);
+ }
+
+ nsCString mRecordNames;
+
+ void AppendIntPadded(nsACString& aString, uint32_t aInt) {
+ if (aInt > 0 && aInt < 10) {
+ aString.AppendLiteral("0");
+ }
+ aString.AppendInt(aInt);
+ }
+
+ void TestGetRecordNames(bool aPrivateBrowsing) {
+ // Create a number of records of different names.
+ const uint32_t num = 100;
+ nsTArray<nsCString> updates(num);
+ for (uint32_t i = 0; i < num; i++) {
+ nsAutoCString response;
+ response.AppendLiteral("stored data");
+ AppendIntPadded(response, i);
+ response.AppendLiteral(" test-data");
+ AppendIntPadded(response, i);
+
+ if (i != 0) {
+ mRecordNames.AppendLiteral(",");
+ }
+ mRecordNames.AppendLiteral("data");
+ AppendIntPadded(mRecordNames, i);
+
+ nsCString& update = *updates.AppendElement();
+ update.AppendLiteral("store data");
+ AppendIntPadded(update, i);
+ update.AppendLiteral(" test-data");
+ AppendIntPadded(update, i);
+
+ nsCOMPtr<nsIRunnable> continuation;
+ if (i + 1 == num) {
+ continuation =
+ NewRunnableMethod(this, &GMPStorageTest::TestGetRecordNames_QueryNames);
+ }
+ Expect(response, continuation.forget());
+ }
+
+ CreateDecryptor(NS_LITERAL_STRING("http://foo.com"),
+ NS_LITERAL_STRING("http://bar.com"),
+ aPrivateBrowsing,
+ Move(updates));
+ }
+
+ void TestGetRecordNames_QueryNames() {
+ nsCString response("record-names ");
+ response.Append(mRecordNames);
+ Expect(response,
+ NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+ Update(NS_LITERAL_CSTRING("retrieve-record-names"));
+ }
+
+ void GetRecordNamesPersistentStorage() {
+ TestGetRecordNames(false);
+ }
+
+ void TestLongRecordNames() {
+ NS_NAMED_LITERAL_CSTRING(longRecordName,
+ "A_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_"
+ "long_record_name");
+
+ NS_NAMED_LITERAL_CSTRING(data, "Just_some_arbitrary_data.");
+
+ MOZ_ASSERT(longRecordName.Length() < GMP_MAX_RECORD_NAME_SIZE);
+ MOZ_ASSERT(longRecordName.Length() > 260); // Windows MAX_PATH
+
+ nsCString response("stored ");
+ response.Append(longRecordName);
+ response.AppendLiteral(" ");
+ response.Append(data);
+ Expect(response, NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ nsCString update("store ");
+ update.Append(longRecordName);
+ update.AppendLiteral(" ");
+ update.Append(data);
+ CreateDecryptor(NS_LITERAL_STRING("http://fuz.com"),
+ NS_LITERAL_STRING("http://baz.com"),
+ false,
+ update);
+ }
+
+ void TestNodeId() {
+ // Calculate the nodeId, and the device bound nodeId. Start a GMP, and
+ // have it return the device bound nodeId that it's been passed. Assert
+ // they have the same value.
+ const nsString origin = NS_LITERAL_STRING("http://example-fuz-baz.com");
+ nsCString originSalt1 = GetNodeId(origin, origin, false);
+
+ nsCString salt = originSalt1;
+ std::string nodeId;
+ EXPECT_TRUE(CalculateGMPDeviceId(salt.BeginWriting(), salt.Length(), nodeId));
+
+ std::string expected = "node-id " + nodeId;
+ Expect(nsDependentCString(expected.c_str()), NewRunnableMethod(this, &GMPStorageTest::SetFinished));
+
+ CreateDecryptor(originSalt1,
+ NS_LITERAL_CSTRING("retrieve-node-id"));
+ }
+
+ void Expect(const nsCString& aMessage, already_AddRefed<nsIRunnable> aContinuation) {
+ mExpected.AppendElement(ExpectedMessage(aMessage, Move(aContinuation)));
+ }
+
+ void AwaitFinished() {
+ while (!mFinished) {
+ NS_ProcessNextEvent(nullptr, true);
+ }
+ mFinished = false;
+ }
+
+ void ShutdownThen(already_AddRefed<nsIRunnable> aContinuation) {
+ EXPECT_TRUE(!!mDecryptor);
+ if (!mDecryptor) {
+ return;
+ }
+ EXPECT_FALSE(mNodeId.IsEmpty());
+ RefPtr<GMPShutdownObserver> task(
+ new GMPShutdownObserver(NewRunnableMethod(this, &GMPStorageTest::Shutdown),
+ Move(aContinuation), mNodeId));
+ NS_DispatchToMainThread(task, NS_DISPATCH_NORMAL);
+ }
+
+ void Shutdown() {
+ if (mDecryptor) {
+ mDecryptor->Close();
+ mDecryptor = nullptr;
+ mNodeId = EmptyCString();
+ }
+ }
+
+ void Dummy() {
+ }
+
+ void SetFinished() {
+ mFinished = true;
+ Shutdown();
+ NS_DispatchToMainThread(NewRunnableMethod(this, &GMPStorageTest::Dummy));
+ }
+
+ void SessionMessage(const nsCString& aSessionId,
+ mozilla::dom::MediaKeyMessageType aMessageType,
+ const nsTArray<uint8_t>& aMessage) override
+ {
+ MonitorAutoLock mon(mMonitor);
+
+ nsCString msg((const char*)aMessage.Elements(), aMessage.Length());
+ EXPECT_TRUE(mExpected.Length() > 0);
+ bool matches = mExpected[0].mMessage.Equals(msg);
+ EXPECT_STREQ(mExpected[0].mMessage.get(), msg.get());
+ if (mExpected.Length() > 0 && matches) {
+ nsCOMPtr<nsIRunnable> continuation = mExpected[0].mContinuation;
+ mExpected.RemoveElementAt(0);
+ if (continuation) {
+ NS_DispatchToCurrentThread(continuation);
+ }
+ }
+ }
+
+ void SetDecryptorId(uint32_t aId) override
+ {
+ if (!mSetDecryptorIdContinuation) {
+ return;
+ }
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+ thread->Dispatch(mSetDecryptorIdContinuation, NS_DISPATCH_NORMAL);
+ mSetDecryptorIdContinuation = nullptr;
+ }
+
+ void SetSessionId(uint32_t aCreateSessionToken,
+ const nsCString& aSessionId) override { }
+ void ResolveLoadSessionPromise(uint32_t aPromiseId,
+ bool aSuccess) override {}
+ void ResolvePromise(uint32_t aPromiseId) override {}
+ void RejectPromise(uint32_t aPromiseId,
+ nsresult aException,
+ const nsCString& aSessionId) override { }
+ void ExpirationChange(const nsCString& aSessionId,
+ UnixTime aExpiryTime) override {}
+ void SessionClosed(const nsCString& aSessionId) override {}
+ void SessionError(const nsCString& aSessionId,
+ nsresult aException,
+ uint32_t aSystemCode,
+ const nsCString& aMessage) override {}
+ void Decrypted(uint32_t aId,
+ mozilla::DecryptStatus aResult,
+ const nsTArray<uint8_t>& aDecryptedData) override { }
+
+ void BatchedKeyStatusChanged(const nsCString& aSessionId,
+ const nsTArray<CDMKeyInfo>& aKeyInfos) override { }
+
+ void Terminated() override {
+ if (mDecryptor) {
+ mDecryptor->Close();
+ mDecryptor = nullptr;
+ }
+ }
+
+private:
+ ~GMPStorageTest() { }
+
+ struct ExpectedMessage {
+ ExpectedMessage(const nsCString& aMessage, already_AddRefed<nsIRunnable> aContinuation)
+ : mMessage(aMessage)
+ , mContinuation(aContinuation)
+ {}
+ nsCString mMessage;
+ nsCOMPtr<nsIRunnable> mContinuation;
+ };
+
+ nsTArray<ExpectedMessage> mExpected;
+
+ RefPtr<nsIRunnable> mSetDecryptorIdContinuation;
+
+ GMPDecryptorProxy* mDecryptor;
+ Monitor mMonitor;
+ Atomic<bool> mFinished;
+ nsCString mNodeId;
+};
+
+void
+GMPTestRunner::DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&))
+{
+ nsCOMPtr<nsIThread> thread(GetGMPThread());
+
+ GMPTestMonitor monitor;
+ thread->Dispatch(NewRunnableMethod<GMPTestMonitor&>(this,
+ aTestMethod,
+ monitor),
+ NS_DISPATCH_NORMAL);
+ monitor.AwaitFinished();
+}
+
+TEST(GeckoMediaPlugins, GMPTestCodec) {
+ RefPtr<GMPTestRunner> runner = new GMPTestRunner();
+ runner->DoTest(&GMPTestRunner::RunTestGMPTestCodec1);
+ runner->DoTest(&GMPTestRunner::RunTestGMPTestCodec2);
+ runner->DoTest(&GMPTestRunner::RunTestGMPTestCodec3);
+}
+
+TEST(GeckoMediaPlugins, GMPCrossOrigin) {
+ RefPtr<GMPTestRunner> runner = new GMPTestRunner();
+ runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin1);
+ runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin2);
+ runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin3);
+ runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin4);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageGetNodeId) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestGetNodeId);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageBasic) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestBasicStorage);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageForgetThisSite) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestForgetThisSite);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageClearRecentHistory1) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestClearRecentHistory1);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageClearRecentHistory2) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestClearRecentHistory2);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageClearRecentHistory3) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestClearRecentHistory3);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageCrossOrigin) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestCrossOriginStorage);
+}
+
+TEST(GeckoMediaPlugins, GMPStoragePrivateBrowsing) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestPBStorage);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageAsyncShutdownTimeout) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestAsyncShutdownTimeout);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageAsyncShutdownStorage) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestAsyncShutdownStorage);
+}
+
+TEST(GeckoMediaPlugins, GMPPluginVoucher) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestPluginVoucher);
+}
+
+#if defined(XP_WIN)
+TEST(GeckoMediaPlugins, GMPOutputProtection) {
+ // Output Protection is not available pre-Vista.
+ if (!IsVistaOrLater()) {
+ return;
+ }
+
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestOutputProtection);
+}
+#endif
+
+TEST(GeckoMediaPlugins, GMPStorageGetRecordNamesInMemoryStorage) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestGetRecordNamesInMemoryStorage);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageGetRecordNamesPersistentStorage) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::GetRecordNamesPersistentStorage);
+}
+
+TEST(GeckoMediaPlugins, GMPStorageLongRecordNames) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestLongRecordNames);
+}
+
+TEST(GeckoMediaPlugins, GMPNodeId) {
+ RefPtr<GMPStorageTest> runner = new GMPStorageTest();
+ runner->DoTest(&GMPStorageTest::TestNodeId);
+}
diff --git a/dom/media/gtest/TestGMPRemoveAndDelete.cpp b/dom/media/gtest/TestGMPRemoveAndDelete.cpp
new file mode 100644
index 000000000..4ac92e34e
--- /dev/null
+++ b/dom/media/gtest/TestGMPRemoveAndDelete.cpp
@@ -0,0 +1,491 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPService.h"
+#include "GMPTestMonitor.h"
+#include "gmp-api/gmp-video-host.h"
+#include "gtest/gtest.h"
+#include "mozilla/Services.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsIObserverService.h"
+#include "GMPVideoDecoderProxy.h"
+#include "GMPServiceParent.h"
+#include "GMPService.h"
+#include "GMPUtils.h"
+#include "mozilla/StaticPtr.h"
+#include "MediaPrefs.h"
+
+#define GMP_DIR_NAME NS_LITERAL_STRING("gmp-fakeopenh264")
+#define GMP_OLD_VERSION NS_LITERAL_STRING("1.0")
+#define GMP_NEW_VERSION NS_LITERAL_STRING("1.1")
+
+#define GMP_DELETED_TOPIC "gmp-directory-deleted"
+
+#define EXPECT_OK(X) EXPECT_TRUE(NS_SUCCEEDED(X))
+
+using namespace mozilla;
+using namespace mozilla::gmp;
+
+class GMPRemoveTest : public nsIObserver
+ , public GMPVideoDecoderCallbackProxy
+{
+public:
+ GMPRemoveTest();
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // Called when a GMP plugin directory has been successfully deleted.
+ // |aData| will contain the directory path.
+ NS_IMETHOD Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData) override;
+
+ // Create a new GMP plugin directory that we can trash and add it to the GMP
+ // service. Remove the original plugin directory. Original plugin directory
+ // gets re-added at destruction.
+ void Setup();
+
+ bool CreateVideoDecoder(nsCString aNodeId = EmptyCString());
+ void CloseVideoDecoder();
+
+ void DeletePluginDirectory(bool aCanDefer);
+
+ // Decode a dummy frame.
+ GMPErr Decode();
+
+ // Wait until TestMonitor has been signaled.
+ void Wait();
+
+ // Did we get a Terminated() callback from the plugin?
+ bool IsTerminated();
+
+ // From GMPVideoDecoderCallbackProxy
+ // Set mDecodeResult; unblock TestMonitor.
+ virtual void Decoded(GMPVideoi420Frame* aDecodedFrame) override;
+ virtual void Error(GMPErr aError) override;
+
+ // From GMPVideoDecoderCallbackProxy
+ // We expect this to be called when a plugin has been forcibly closed.
+ virtual void Terminated() override;
+
+ // Ignored GMPVideoDecoderCallbackProxy members
+ virtual void ReceivedDecodedReferenceFrame(const uint64_t aPictureId) override {}
+ virtual void ReceivedDecodedFrame(const uint64_t aPictureId) override {}
+ virtual void InputDataExhausted() override {}
+ virtual void DrainComplete() override {}
+ virtual void ResetComplete() override {}
+
+private:
+ virtual ~GMPRemoveTest();
+
+ void gmp_Decode();
+ void gmp_GetVideoDecoder(nsCString aNodeId,
+ GMPVideoDecoderProxy** aOutDecoder,
+ GMPVideoHost** aOutHost);
+ void GeneratePlugin();
+
+ GMPTestMonitor mTestMonitor;
+ nsCOMPtr<nsIThread> mGMPThread;
+
+ bool mIsTerminated;
+
+ // Path to the cloned GMP we have created.
+ nsString mTmpPath;
+ nsCOMPtr<nsIFile> mTmpDir;
+
+ // Path to the original GMP. Store so that we can re-add it after we're done
+ // testing.
+ nsString mOriginalPath;
+
+ GMPVideoDecoderProxy* mDecoder;
+ GMPVideoHost* mHost;
+ GMPErr mDecodeResult;
+};
+
+/*
+ * Simple test that the plugin is deleted when forcibly removed and deleted.
+ */
+TEST(GeckoMediaPlugins, RemoveAndDeleteForcedSimple)
+{
+ RefPtr<GMPRemoveTest> test(new GMPRemoveTest());
+
+ test->Setup();
+ test->DeletePluginDirectory(false /* force immediate */);
+ test->Wait();
+}
+
+/*
+ * Simple test that the plugin is deleted when deferred deletion is allowed.
+ */
+TEST(GeckoMediaPlugins, RemoveAndDeleteDeferredSimple)
+{
+ RefPtr<GMPRemoveTest> test(new GMPRemoveTest());
+
+ test->Setup();
+ test->DeletePluginDirectory(true /* can defer */);
+ test->Wait();
+}
+
+/*
+ * Test that the plugin is unavailable immediately after a forced
+ * RemoveAndDelete, and that the plugin is deleted afterwards.
+ */
+TEST(GeckoMediaPlugins, RemoveAndDeleteForcedInUse)
+{
+ RefPtr<GMPRemoveTest> test(new GMPRemoveTest());
+
+ test->Setup();
+ EXPECT_TRUE(test->CreateVideoDecoder(NS_LITERAL_CSTRING("thisOrigin")));
+
+ // Test that we can decode a frame.
+ GMPErr err = test->Decode();
+ EXPECT_EQ(err, GMPNoErr);
+
+ test->DeletePluginDirectory(false /* force immediate */);
+ test->Wait();
+
+ // Test that the VideoDecoder is no longer available.
+ EXPECT_FALSE(test->CreateVideoDecoder(NS_LITERAL_CSTRING("thisOrigin")));
+
+ // Test that we were notified of the plugin's destruction.
+ EXPECT_TRUE(test->IsTerminated());
+}
+
+/*
+ * Test that the plugin is still usable after a deferred RemoveAndDelete, and
+ * that the plugin is deleted afterwards.
+ */
+TEST(GeckoMediaPlugins, RemoveAndDeleteDeferredInUse)
+{
+ RefPtr<GMPRemoveTest> test(new GMPRemoveTest());
+
+ test->Setup();
+ EXPECT_TRUE(test->CreateVideoDecoder(NS_LITERAL_CSTRING("thisOrigin")));
+
+ // Make sure decoding works before we do anything.
+ GMPErr err = test->Decode();
+ EXPECT_EQ(err, GMPNoErr);
+
+ test->DeletePluginDirectory(true /* can defer */);
+
+ // Test that decoding still works.
+ err = test->Decode();
+ EXPECT_EQ(err, GMPNoErr);
+
+ // Test that this origin is still able to fetch the video decoder.
+ EXPECT_TRUE(test->CreateVideoDecoder(NS_LITERAL_CSTRING("thisOrigin")));
+
+ test->CloseVideoDecoder();
+ test->Wait();
+}
+
+static StaticRefPtr<GeckoMediaPluginService> gService;
+static StaticRefPtr<GeckoMediaPluginServiceParent> gServiceParent;
+
+static GeckoMediaPluginService*
+GetService()
+{
+ if (!gService) {
+ RefPtr<GeckoMediaPluginService> service =
+ GeckoMediaPluginService::GetGeckoMediaPluginService();
+ gService = service;
+ }
+
+ return gService.get();
+}
+
+static GeckoMediaPluginServiceParent*
+GetServiceParent()
+{
+ if (!gServiceParent) {
+ RefPtr<GeckoMediaPluginServiceParent> parent =
+ GeckoMediaPluginServiceParent::GetSingleton();
+ gServiceParent = parent;
+ }
+
+ return gServiceParent.get();
+}
+
+NS_IMPL_ISUPPORTS(GMPRemoveTest, nsIObserver)
+
+GMPRemoveTest::GMPRemoveTest()
+ : mIsTerminated(false)
+ , mDecoder(nullptr)
+ , mHost(nullptr)
+{
+}
+
+GMPRemoveTest::~GMPRemoveTest()
+{
+ bool exists;
+ EXPECT_TRUE(NS_SUCCEEDED(mTmpDir->Exists(&exists)) && !exists);
+
+ EXPECT_OK(GetServiceParent()->AddPluginDirectory(mOriginalPath));
+}
+
+void
+GMPRemoveTest::Setup()
+{
+ // Initialize media preferences.
+ MediaPrefs::GetSingleton();
+ GeneratePlugin();
+ GetService()->GetThread(getter_AddRefs(mGMPThread));
+
+ // Spin the event loop until the GMP service has had a chance to complete
+ // adding GMPs from MOZ_GMP_PATH. Otherwise, the RemovePluginDirectory()
+ // below may complete before we're finished adding GMPs from MOZ_GMP_PATH,
+ // and we'll end up not removing the GMP, and the test will fail.
+ RefPtr<AbstractThread> thread(GetServiceParent()->GetAbstractGMPThread());
+ EXPECT_TRUE(thread);
+ GMPTestMonitor* mon = &mTestMonitor;
+ GetServiceParent()->EnsureInitialized()->Then(thread, __func__,
+ [mon]() { mon->SetFinished(); },
+ [mon]() { mon->SetFinished(); }
+ );
+ mTestMonitor.AwaitFinished();
+
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ obs->AddObserver(this, GMP_DELETED_TOPIC, false /* strong ref */);
+ EXPECT_OK(GetServiceParent()->RemovePluginDirectory(mOriginalPath));
+
+ GetServiceParent()->AsyncAddPluginDirectory(mTmpPath)->Then(thread, __func__,
+ [mon]() { mon->SetFinished(); },
+ [mon]() { mon->SetFinished(); }
+ );
+ mTestMonitor.AwaitFinished();
+}
+
+bool
+GMPRemoveTest::CreateVideoDecoder(nsCString aNodeId)
+{
+ GMPVideoHost* host;
+ GMPVideoDecoderProxy* decoder = nullptr;
+
+ mGMPThread->Dispatch(
+ NewNonOwningRunnableMethod<nsCString, GMPVideoDecoderProxy**, GMPVideoHost**>(
+ this, &GMPRemoveTest::gmp_GetVideoDecoder, aNodeId, &decoder, &host),
+ NS_DISPATCH_NORMAL);
+
+ mTestMonitor.AwaitFinished();
+
+ if (!decoder) {
+ return false;
+ }
+
+ GMPVideoCodec codec;
+ memset(&codec, 0, sizeof(codec));
+ codec.mGMPApiVersion = 33;
+
+ nsTArray<uint8_t> empty;
+ mGMPThread->Dispatch(
+ NewNonOwningRunnableMethod<const GMPVideoCodec&, const nsTArray<uint8_t>&, GMPVideoDecoderCallbackProxy*, int32_t>(
+ decoder, &GMPVideoDecoderProxy::InitDecode,
+ codec, empty, this, 1 /* core count */),
+ NS_DISPATCH_SYNC);
+
+ if (mDecoder) {
+ CloseVideoDecoder();
+ }
+
+ mDecoder = decoder;
+ mHost = host;
+
+ return true;
+}
+
+void
+GMPRemoveTest::gmp_GetVideoDecoder(nsCString aNodeId,
+ GMPVideoDecoderProxy** aOutDecoder,
+ GMPVideoHost** aOutHost)
+{
+ nsTArray<nsCString> tags;
+ tags.AppendElement(NS_LITERAL_CSTRING("h264"));
+ tags.AppendElement(NS_LITERAL_CSTRING("fake"));
+
+ class Callback : public GetGMPVideoDecoderCallback
+ {
+ public:
+ Callback(GMPTestMonitor* aMonitor, GMPVideoDecoderProxy** aDecoder, GMPVideoHost** aHost)
+ : mMonitor(aMonitor), mDecoder(aDecoder), mHost(aHost) { }
+ virtual void Done(GMPVideoDecoderProxy* aDecoder, GMPVideoHost* aHost) override {
+ *mDecoder = aDecoder;
+ *mHost = aHost;
+ mMonitor->SetFinished();
+ }
+ private:
+ GMPTestMonitor* mMonitor;
+ GMPVideoDecoderProxy** mDecoder;
+ GMPVideoHost** mHost;
+ };
+
+ UniquePtr<GetGMPVideoDecoderCallback>
+ cb(new Callback(&mTestMonitor, aOutDecoder, aOutHost));
+
+ if (NS_FAILED(GetService()->GetGMPVideoDecoder(nullptr, &tags, aNodeId, Move(cb)))) {
+ mTestMonitor.SetFinished();
+ }
+}
+
+void
+GMPRemoveTest::CloseVideoDecoder()
+{
+ mGMPThread->Dispatch(
+ NewNonOwningRunnableMethod(mDecoder, &GMPVideoDecoderProxy::Close),
+ NS_DISPATCH_SYNC);
+
+ mDecoder = nullptr;
+ mHost = nullptr;
+}
+
+void
+GMPRemoveTest::DeletePluginDirectory(bool aCanDefer)
+{
+ GetServiceParent()->RemoveAndDeletePluginDirectory(mTmpPath, aCanDefer);
+}
+
+GMPErr
+GMPRemoveTest::Decode()
+{
+ mGMPThread->Dispatch(
+ NewNonOwningRunnableMethod(this, &GMPRemoveTest::gmp_Decode),
+ NS_DISPATCH_NORMAL);
+
+ mTestMonitor.AwaitFinished();
+ return mDecodeResult;
+}
+
+void
+GMPRemoveTest::gmp_Decode()
+{
+ // from gmp-fake.cpp
+ struct EncodedFrame {
+ uint32_t length_;
+ uint8_t h264_compat_;
+ uint32_t magic_;
+ uint32_t width_;
+ uint32_t height_;
+ uint8_t y_;
+ uint8_t u_;
+ uint8_t v_;
+ uint32_t timestamp_;
+ };
+
+ GMPVideoFrame* absFrame;
+ GMPErr err = mHost->CreateFrame(kGMPEncodedVideoFrame, &absFrame);
+ EXPECT_EQ(err, GMPNoErr);
+
+ GMPUniquePtr<GMPVideoEncodedFrame>
+ frame(static_cast<GMPVideoEncodedFrame*>(absFrame));
+ err = frame->CreateEmptyFrame(sizeof(EncodedFrame) /* size */);
+ EXPECT_EQ(err, GMPNoErr);
+
+ EncodedFrame* frameData = reinterpret_cast<EncodedFrame*>(frame->Buffer());
+ frameData->magic_ = 0x4652414d;
+ frameData->width_ = frameData->height_ = 16;
+
+ nsTArray<uint8_t> empty;
+ nsresult rv = mDecoder->Decode(Move(frame), false /* aMissingFrames */, empty);
+ EXPECT_OK(rv);
+}
+
+void
+GMPRemoveTest::Wait()
+{
+ mTestMonitor.AwaitFinished();
+}
+
+bool
+GMPRemoveTest::IsTerminated()
+{
+ return mIsTerminated;
+}
+
+// nsIObserver
+NS_IMETHODIMP
+GMPRemoveTest::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ EXPECT_TRUE(!strcmp(GMP_DELETED_TOPIC, aTopic));
+
+ nsString data(aData);
+ if (mTmpPath.Equals(data)) {
+ mTestMonitor.SetFinished();
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ obs->RemoveObserver(this, GMP_DELETED_TOPIC);
+ }
+
+ return NS_OK;
+}
+
+// GMPVideoDecoderCallbackProxy
+void
+GMPRemoveTest::Decoded(GMPVideoi420Frame* aDecodedFrame)
+{
+ aDecodedFrame->Destroy();
+ mDecodeResult = GMPNoErr;
+ mTestMonitor.SetFinished();
+}
+
+// GMPVideoDecoderCallbackProxy
+void
+GMPRemoveTest::Error(GMPErr aError)
+{
+ mDecodeResult = aError;
+ mTestMonitor.SetFinished();
+}
+
+// GMPVideoDecoderCallbackProxy
+void
+GMPRemoveTest::Terminated()
+{
+ mIsTerminated = true;
+ if (mDecoder) {
+ mDecoder->Close();
+ mDecoder = nullptr;
+ }
+}
+
+void
+GMPRemoveTest::GeneratePlugin()
+{
+ nsresult rv;
+ nsCOMPtr<nsIFile> gmpDir;
+ nsCOMPtr<nsIFile> origDir;
+ nsCOMPtr<nsIFile> tmpDir;
+
+ rv = NS_GetSpecialDirectory(NS_GRE_DIR,
+ getter_AddRefs(gmpDir));
+ EXPECT_OK(rv);
+ rv = gmpDir->Append(GMP_DIR_NAME);
+ EXPECT_OK(rv);
+
+ rv = gmpDir->Clone(getter_AddRefs(origDir));
+ EXPECT_OK(rv);
+ rv = origDir->Append(GMP_OLD_VERSION);
+ EXPECT_OK(rv);
+
+ rv = gmpDir->Clone(getter_AddRefs(tmpDir));
+ EXPECT_OK(rv);
+ rv = tmpDir->Append(GMP_NEW_VERSION);
+ EXPECT_OK(rv);
+ bool exists = false;
+ rv = tmpDir->Exists(&exists);
+ EXPECT_OK(rv);
+ if (exists) {
+ rv = tmpDir->Remove(true);
+ EXPECT_OK(rv);
+ }
+ rv = origDir->CopyTo(gmpDir, GMP_NEW_VERSION);
+ EXPECT_OK(rv);
+
+ rv = gmpDir->Clone(getter_AddRefs(tmpDir));
+ EXPECT_OK(rv);
+ rv = tmpDir->Append(GMP_NEW_VERSION);
+ EXPECT_OK(rv);
+
+ EXPECT_OK(origDir->GetPath(mOriginalPath));
+ EXPECT_OK(tmpDir->GetPath(mTmpPath));
+ mTmpDir = tmpDir;
+}
diff --git a/dom/media/gtest/TestGMPUtils.cpp b/dom/media/gtest/TestGMPUtils.cpp
new file mode 100644
index 000000000..75d7eba53
--- /dev/null
+++ b/dom/media/gtest/TestGMPUtils.cpp
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "GMPUtils.h"
+#include "nsString.h"
+#include "MediaPrefs.h"
+
+#include <string>
+#include <vector>
+
+using namespace std;
+using namespace mozilla;
+
+void TestSplitAt(const char* aInput,
+ const char* aDelims,
+ size_t aNumExpectedTokens,
+ const char* aExpectedTokens[])
+{
+ // Initialize media preferences.
+ MediaPrefs::GetSingleton();
+ nsCString input(aInput);
+ nsTArray<nsCString> tokens;
+ SplitAt(aDelims, input, tokens);
+ EXPECT_EQ(tokens.Length(), aNumExpectedTokens) << "Should get expected number of tokens";
+ for (size_t i = 0; i < tokens.Length(); i++) {
+ EXPECT_TRUE(tokens[i].EqualsASCII(aExpectedTokens[i]))
+ << "Tokenize fail; expected=" << aExpectedTokens[i] << " got=" <<
+ tokens[i].BeginReading();
+ }
+}
+
+TEST(GeckoMediaPlugins, GMPUtils) {
+ {
+ const char* input = "1,2,3,4";
+ const char* delims = ",";
+ const char* tokens[] = { "1", "2", "3", "4" };
+ TestSplitAt(input, delims, MOZ_ARRAY_LENGTH(tokens), tokens);
+ }
+
+ {
+ const char* input = "a simple, comma, seperated, list";
+ const char* delims = ",";
+ const char* tokens[] = { "a simple", " comma", " seperated", " list" };
+ TestSplitAt(input, delims, MOZ_ARRAY_LENGTH(tokens), tokens);
+ }
+
+ {
+ const char* input = // Various platform line endings...
+ "line1\r\n" // Windows
+ "line2\r" // Old MacOSX
+ "line3\n" // Unix
+ "line4";
+ const char* delims = "\r\n";
+ const char* tokens[] = { "line1", "line2", "line3", "line4" };
+ TestSplitAt(input, delims, MOZ_ARRAY_LENGTH(tokens), tokens);
+ }
+}
diff --git a/dom/media/gtest/TestIntervalSet.cpp b/dom/media/gtest/TestIntervalSet.cpp
new file mode 100644
index 000000000..b054ba1d2
--- /dev/null
+++ b/dom/media/gtest/TestIntervalSet.cpp
@@ -0,0 +1,821 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "mozilla/dom/TimeRanges.h"
+#include "TimeUnits.h"
+#include "Intervals.h"
+#include <algorithm>
+#include <vector>
+
+using namespace mozilla;
+
+typedef media::Interval<uint8_t> ByteInterval;
+typedef media::Interval<int> IntInterval;
+typedef media::IntervalSet<int> IntIntervals;
+
+ByteInterval CreateByteInterval(int32_t aStart, int32_t aEnd)
+{
+ ByteInterval test(aStart, aEnd);
+ return test;
+}
+
+media::IntervalSet<uint8_t> CreateByteIntervalSet(int32_t aStart, int32_t aEnd)
+{
+ media::IntervalSet<uint8_t> test;
+ test += ByteInterval(aStart, aEnd);
+ return test;
+}
+
+TEST(IntervalSet, Constructors)
+{
+ const int32_t start = 1;
+ const int32_t end = 2;
+ const int32_t fuzz = 0;
+
+ // Compiler exercise.
+ ByteInterval test1(start, end);
+ ByteInterval test2(test1);
+ ByteInterval test3(start, end, fuzz);
+ ByteInterval test4(test3);
+ ByteInterval test5 = CreateByteInterval(start, end);
+
+ media::IntervalSet<uint8_t> blah1(test1);
+ media::IntervalSet<uint8_t> blah2 = blah1;
+ media::IntervalSet<uint8_t> blah3 = blah1 + test1;
+ media::IntervalSet<uint8_t> blah4 = test1 + blah1;
+ media::IntervalSet<uint8_t> blah5 = CreateByteIntervalSet(start, end);
+ (void)test1; (void)test2; (void)test3; (void)test4; (void)test5;
+ (void)blah1; (void)blah2; (void)blah3; (void)blah4; (void)blah5;
+}
+
+media::TimeInterval CreateTimeInterval(int32_t aStart, int32_t aEnd)
+{
+ // Copy constructor test
+ media::Microseconds startus(aStart);
+ media::TimeUnit start(startus);
+ media::TimeUnit end;
+ // operator= test
+ end = media::Microseconds(aEnd);
+ media::TimeInterval ti(start, end);
+ return ti;
+}
+
+media::TimeIntervals CreateTimeIntervals(int32_t aStart, int32_t aEnd)
+{
+ media::TimeIntervals test;
+ test += CreateTimeInterval(aStart, aEnd);
+ return test;
+}
+
+TEST(IntervalSet, TimeIntervalsConstructors)
+{
+ const media::Microseconds start(1);
+ const media::Microseconds end(2);
+ const media::Microseconds fuzz;
+
+ // Compiler exercise.
+ media::TimeInterval test1(start, end);
+ media::TimeInterval test2(test1);
+ media::TimeInterval test3(start, end, fuzz);
+ media::TimeInterval test4(test3);
+ media::TimeInterval test5 = CreateTimeInterval(start.mValue, end.mValue);
+
+ media::TimeIntervals blah1(test1);
+ media::TimeIntervals blah2(blah1);
+ media::TimeIntervals blah3 = blah1 + test1;
+ media::TimeIntervals blah4 = test1 + blah1;
+ media::TimeIntervals blah5 = CreateTimeIntervals(start.mValue, end.mValue);
+ (void)test1; (void)test2; (void)test3; (void)test4; (void)test5;
+ (void)blah1; (void)blah2; (void)blah3; (void)blah4; (void)blah5;
+
+ media::TimeIntervals i0{media::TimeInterval(media::TimeUnit::FromSeconds(0),
+ media::TimeUnit::FromSeconds(0))};
+ EXPECT_EQ(0u, i0.Length()); // Constructing with an empty time interval.
+}
+
+TEST(IntervalSet, Length)
+{
+ IntInterval i(15, 25);
+ EXPECT_EQ(10, i.Length());
+}
+
+TEST(IntervalSet, Intersects)
+{
+ EXPECT_TRUE(IntInterval(1,5).Intersects(IntInterval(3,4)));
+ EXPECT_TRUE(IntInterval(1,5).Intersects(IntInterval(3,7)));
+ EXPECT_TRUE(IntInterval(1,5).Intersects(IntInterval(-1,3)));
+ EXPECT_TRUE(IntInterval(1,5).Intersects(IntInterval(-1,7)));
+ EXPECT_FALSE(IntInterval(1,5).Intersects(IntInterval(6,7)));
+ EXPECT_FALSE(IntInterval(1,5).Intersects(IntInterval(-1,0)));
+ // End boundary is exclusive of the interval.
+ EXPECT_FALSE(IntInterval(1,5).Intersects(IntInterval(5,7)));
+ EXPECT_FALSE(IntInterval(1,5).Intersects(IntInterval(0,1)));
+ // Empty identical interval do not intersect.
+ EXPECT_FALSE(IntInterval(1,1).Intersects(IntInterval(1,1)));
+ // Empty interval do not intersect.
+ EXPECT_FALSE(IntInterval(1,1).Intersects(IntInterval(2,2)));
+}
+
+TEST(IntervalSet, Intersection)
+{
+ IntInterval i0(10, 20);
+ IntInterval i1(15, 25);
+ IntInterval i = i0.Intersection(i1);
+ EXPECT_EQ(15, i.mStart);
+ EXPECT_EQ(20, i.mEnd);
+ IntInterval j0(10, 20);
+ IntInterval j1(20, 25);
+ IntInterval j = j0.Intersection(j1);
+ EXPECT_TRUE(j.IsEmpty());
+ IntInterval k0(2, 2);
+ IntInterval k1(2, 2);
+ IntInterval k = k0.Intersection(k1);
+ EXPECT_TRUE(k.IsEmpty());
+}
+
+TEST(IntervalSet, Equals)
+{
+ IntInterval i0(10, 20);
+ IntInterval i1(10, 20);
+ EXPECT_EQ(i0, i1);
+
+ IntInterval i2(5, 20);
+ EXPECT_NE(i0, i2);
+
+ IntInterval i3(10, 15);
+ EXPECT_NE(i0, i2);
+}
+
+TEST(IntervalSet, IntersectionIntervalSet)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+
+ IntIntervals i1;
+ i1.Add(IntInterval(7, 15));
+ i1.Add(IntInterval(16, 27));
+ i1.Add(IntInterval(45, 50));
+ i1.Add(IntInterval(53, 57));
+
+ IntIntervals i = media::Intersection(i0, i1);
+
+ EXPECT_EQ(4u, i.Length());
+
+ EXPECT_EQ(7, i[0].mStart);
+ EXPECT_EQ(10, i[0].mEnd);
+
+ EXPECT_EQ(20, i[1].mStart);
+ EXPECT_EQ(25, i[1].mEnd);
+
+ EXPECT_EQ(45, i[2].mStart);
+ EXPECT_EQ(50, i[2].mEnd);
+
+ EXPECT_EQ(53, i[3].mStart);
+ EXPECT_EQ(57, i[3].mEnd);
+}
+
+template<typename T>
+static void Compare(const media::IntervalSet<T>& aI1,
+ const media::IntervalSet<T>& aI2)
+{
+ EXPECT_EQ(aI1.Length(), aI2.Length());
+ if (aI1.Length() != aI2.Length()) {
+ return;
+ }
+ for (uint32_t i = 0; i < aI1.Length(); i++) {
+ EXPECT_EQ(aI1[i].mStart, aI2[i].mStart);
+ EXPECT_EQ(aI1[i].mEnd, aI2[i].mEnd);
+ }
+}
+
+static void GeneratePermutations(IntIntervals aI1,
+ IntIntervals aI2)
+{
+ IntIntervals i_ref = media::Intersection(aI1, aI2);
+ // Test all permutations possible
+ std::vector<uint32_t> comb1;
+ for (uint32_t i = 0; i < aI1.Length(); i++) {
+ comb1.push_back(i);
+ }
+ std::vector<uint32_t> comb2;
+ for (uint32_t i = 0; i < aI2.Length(); i++) {
+ comb2.push_back(i);
+ }
+
+ do {
+ do {
+ // Create intervals according to new indexes.
+ IntIntervals i_0;
+ for (uint32_t i = 0; i < comb1.size(); i++) {
+ i_0 += aI1[comb1[i]];
+ }
+ // Test that intervals are always normalized.
+ Compare(aI1, i_0);
+ IntIntervals i_1;
+ for (uint32_t i = 0; i < comb2.size(); i++) {
+ i_1 += aI2[comb2[i]];
+ }
+ Compare(aI2, i_1);
+ // Check intersections yield the same result.
+ Compare(i_0.Intersection(i_1), i_ref);
+ } while (std::next_permutation(comb2.begin(), comb2.end()));
+ } while (std::next_permutation(comb1.begin(), comb1.end()));
+}
+
+TEST(IntervalSet, IntersectionNormalizedIntervalSet)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+
+ IntIntervals i1;
+ i1.Add(IntInterval(7, 15));
+ i1.Add(IntInterval(16, 27));
+ i1.Add(IntInterval(45, 50));
+ i1.Add(IntInterval(53, 57));
+
+ GeneratePermutations(i0, i1);
+}
+
+TEST(IntervalSet, IntersectionUnorderedNonNormalizedIntervalSet)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(8, 25);
+ i0 += IntInterval(24, 60);
+
+ IntIntervals i1;
+ i1.Add(IntInterval(7, 15));
+ i1.Add(IntInterval(10, 27));
+ i1.Add(IntInterval(45, 50));
+ i1.Add(IntInterval(53, 57));
+
+ GeneratePermutations(i0, i1);
+}
+
+TEST(IntervalSet, IntersectionNonNormalizedInterval)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(8, 25);
+ i0 += IntInterval(30, 60);
+
+ media::Interval<int> i1(9, 15);
+ i0.Intersection(i1);
+ EXPECT_EQ(1u, i0.Length());
+ EXPECT_EQ(i0[0].mStart, i1.mStart);
+ EXPECT_EQ(i0[0].mEnd, i1.mEnd);
+}
+
+TEST(IntervalSet, IntersectionUnorderedNonNormalizedInterval)
+{
+ IntIntervals i0;
+ i0 += IntInterval(1, 3);
+ i0 += IntInterval(1, 10);
+ i0 += IntInterval(9, 12);
+ i0 += IntInterval(12, 15);
+ i0 += IntInterval(8, 25);
+ i0 += IntInterval(30, 60);
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(30, 60);
+
+ media::Interval<int> i1(9, 15);
+ i0.Intersection(i1);
+ EXPECT_EQ(1u, i0.Length());
+ EXPECT_EQ(i0[0].mStart, i1.mStart);
+ EXPECT_EQ(i0[0].mEnd, i1.mEnd);
+}
+
+static IntIntervals Duplicate(const IntIntervals& aValue)
+{
+ IntIntervals value(aValue);
+ return value;
+}
+
+TEST(IntervalSet, Normalize)
+{
+ IntIntervals i;
+ // Test IntervalSet<T> + Interval<T> operator.
+ i = i + IntInterval(20, 30);
+ // Test Internal<T> + IntervalSet<T> operator.
+ i = IntInterval(2, 7) + i;
+ // Test Interval<T> + IntervalSet<T> operator
+ i = IntInterval(1, 8) + i;
+ IntIntervals interval;
+ interval += IntInterval(5, 10);
+ // Test += with rval move.
+ i += Duplicate(interval);
+ // Test = with move and add with move.
+ i = Duplicate(interval) + i;
+
+ EXPECT_EQ(2u, i.Length());
+
+ EXPECT_EQ(1, i[0].mStart);
+ EXPECT_EQ(10, i[0].mEnd);
+
+ EXPECT_EQ(20, i[1].mStart);
+ EXPECT_EQ(30, i[1].mEnd);
+
+ media::TimeIntervals ti;
+ ti += media::TimeInterval(media::TimeUnit::FromSeconds(0.0),
+ media::TimeUnit::FromSeconds(3.203333));
+ ti += media::TimeInterval(media::TimeUnit::FromSeconds(3.203366),
+ media::TimeUnit::FromSeconds(10.010065));
+ EXPECT_EQ(2u, ti.Length());
+ ti += media::TimeInterval(ti.Start(0), ti.End(0), media::TimeUnit::FromMicroseconds(35000));
+ EXPECT_EQ(1u, ti.Length());
+}
+
+TEST(IntervalSet, ContainValue)
+{
+ IntIntervals i0;
+ i0 += IntInterval(0, 10);
+ i0 += IntInterval(15, 20);
+ i0 += IntInterval(30, 50);
+ EXPECT_TRUE(i0.Contains(0)); // start is inclusive.
+ EXPECT_TRUE(i0.Contains(17));
+ EXPECT_FALSE(i0.Contains(20)); // end boundary is exclusive.
+ EXPECT_FALSE(i0.Contains(25));
+}
+
+TEST(IntervalSet, ContainValueWithFuzz)
+{
+ IntIntervals i0;
+ i0 += IntInterval(0, 10);
+ i0 += IntInterval(15, 20, 1);
+ i0 += IntInterval(30, 50);
+ EXPECT_TRUE(i0.Contains(0)); // start is inclusive.
+ EXPECT_TRUE(i0.Contains(17));
+ EXPECT_TRUE(i0.Contains(20)); // end boundary is exclusive but we have a fuzz of 1.
+ EXPECT_FALSE(i0.Contains(25));
+}
+
+TEST(IntervalSet, ContainInterval)
+{
+ IntIntervals i0;
+ i0 += IntInterval(0, 10);
+ i0 += IntInterval(15, 20);
+ i0 += IntInterval(30, 50);
+ EXPECT_TRUE(i0.Contains(IntInterval(2, 8)));
+ EXPECT_TRUE(i0.Contains(IntInterval(31, 50)));
+ EXPECT_TRUE(i0.Contains(IntInterval(0, 10)));
+ EXPECT_FALSE(i0.Contains(IntInterval(0, 11)));
+ EXPECT_TRUE(i0.Contains(IntInterval(0, 5)));
+ EXPECT_FALSE(i0.Contains(IntInterval(8, 15)));
+ EXPECT_FALSE(i0.Contains(IntInterval(15, 30)));
+ EXPECT_FALSE(i0.Contains(IntInterval(30, 55)));
+}
+
+TEST(IntervalSet, ContainIntervalWithFuzz)
+{
+ IntIntervals i0;
+ i0 += IntInterval(0, 10);
+ i0 += IntInterval(15, 20);
+ i0 += IntInterval(30, 50);
+ EXPECT_TRUE(i0.Contains(IntInterval(2, 8)));
+ EXPECT_TRUE(i0.Contains(IntInterval(31, 50)));
+ EXPECT_TRUE(i0.Contains(IntInterval(0, 11, 1)));
+ EXPECT_TRUE(i0.Contains(IntInterval(0, 5)));
+ EXPECT_FALSE(i0.Contains(IntInterval(8, 15)));
+ EXPECT_FALSE(i0.Contains(IntInterval(15, 21)));
+ EXPECT_FALSE(i0.Contains(IntInterval(15, 30)));
+ EXPECT_FALSE(i0.Contains(IntInterval(30, 55)));
+
+ IntIntervals i1;
+ i1 += IntInterval(0, 10, 1);
+ i1 += IntInterval(15, 20, 1);
+ i1 += IntInterval(30, 50, 1);
+ EXPECT_TRUE(i1.Contains(IntInterval(2, 8)));
+ EXPECT_TRUE(i1.Contains(IntInterval(29, 51)));
+ EXPECT_TRUE(i1.Contains(IntInterval(0, 11, 1)));
+ EXPECT_TRUE(i1.Contains(IntInterval(15, 21)));
+}
+
+TEST(IntervalSet, Span)
+{
+ IntInterval i0(0,10);
+ IntInterval i1(20,30);
+ IntInterval i{i0.Span(i1)};
+
+ EXPECT_EQ(i.mStart, 0);
+ EXPECT_EQ(i.mEnd, 30);
+}
+
+TEST(IntervalSet, Union)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+
+ IntIntervals i1;
+ i1.Add(IntInterval(7, 15));
+ i1.Add(IntInterval(16, 27));
+ i1.Add(IntInterval(45, 50));
+ i1.Add(IntInterval(53, 57));
+
+ IntIntervals i = media::Union(i0, i1);
+
+ EXPECT_EQ(3u, i.Length());
+
+ EXPECT_EQ(5, i[0].mStart);
+ EXPECT_EQ(15, i[0].mEnd);
+
+ EXPECT_EQ(16, i[1].mStart);
+ EXPECT_EQ(27, i[1].mEnd);
+
+ EXPECT_EQ(40, i[2].mStart);
+ EXPECT_EQ(60, i[2].mEnd);
+}
+
+TEST(IntervalSet, UnionNotOrdered)
+{
+ IntIntervals i0;
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+ i0 += IntInterval(5, 10);
+
+ IntIntervals i1;
+ i1.Add(IntInterval(16, 27));
+ i1.Add(IntInterval(7, 15));
+ i1.Add(IntInterval(53, 57));
+ i1.Add(IntInterval(45, 50));
+
+ IntIntervals i = media::Union(i0, i1);
+
+ EXPECT_EQ(3u, i.Length());
+
+ EXPECT_EQ(5, i[0].mStart);
+ EXPECT_EQ(15, i[0].mEnd);
+
+ EXPECT_EQ(16, i[1].mStart);
+ EXPECT_EQ(27, i[1].mEnd);
+
+ EXPECT_EQ(40, i[2].mStart);
+ EXPECT_EQ(60, i[2].mEnd);
+}
+
+TEST(IntervalSet, NormalizeFuzz)
+{
+ IntIntervals i0;
+ i0 += IntInterval(11, 25, 0);
+ i0 += IntInterval(5, 10, 1);
+ i0 += IntInterval(40, 60, 1);
+
+ EXPECT_EQ(2u, i0.Length());
+
+ EXPECT_EQ(5, i0[0].mStart);
+ EXPECT_EQ(25, i0[0].mEnd);
+
+ EXPECT_EQ(40, i0[1].mStart);
+ EXPECT_EQ(60, i0[1].mEnd);
+}
+
+TEST(IntervalSet, UnionFuzz)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10, 1);
+ i0 += IntInterval(11, 25, 0);
+ i0 += IntInterval(40, 60, 1);
+ EXPECT_EQ(2u, i0.Length());
+ EXPECT_EQ(5, i0[0].mStart);
+ EXPECT_EQ(25, i0[0].mEnd);
+ EXPECT_EQ(40, i0[1].mStart);
+ EXPECT_EQ(60, i0[1].mEnd);
+
+ IntIntervals i1;
+ i1.Add(IntInterval(7, 15, 1));
+ i1.Add(IntInterval(16, 27, 1));
+ i1.Add(IntInterval(45, 50, 1));
+ i1.Add(IntInterval(53, 57, 1));
+ EXPECT_EQ(3u, i1.Length());
+ EXPECT_EQ(7, i1[0].mStart);
+ EXPECT_EQ(27, i1[0].mEnd);
+ EXPECT_EQ(45, i1[1].mStart);
+ EXPECT_EQ(50, i1[1].mEnd);
+ EXPECT_EQ(53, i1[2].mStart);
+ EXPECT_EQ(57, i1[2].mEnd);
+
+ IntIntervals i = media::Union(i0, i1);
+
+ EXPECT_EQ(2u, i.Length());
+
+ EXPECT_EQ(5, i[0].mStart);
+ EXPECT_EQ(27, i[0].mEnd);
+
+ EXPECT_EQ(40, i[1].mStart);
+ EXPECT_EQ(60, i[1].mEnd);
+}
+
+TEST(IntervalSet, Contiguous)
+{
+ EXPECT_FALSE(IntInterval(5, 10).Contiguous(IntInterval(11, 25)));
+ EXPECT_TRUE(IntInterval(5, 10).Contiguous(IntInterval(10, 25)));
+ EXPECT_TRUE(IntInterval(5, 10, 1).Contiguous(IntInterval(11, 25)));
+ EXPECT_TRUE(IntInterval(5, 10).Contiguous(IntInterval(11, 25, 1)));
+}
+
+TEST(IntervalSet, TimeRangesSeconds)
+{
+ media::TimeIntervals i0;
+ i0 += media::TimeInterval(media::TimeUnit::FromSeconds(20), media::TimeUnit::FromSeconds(25));
+ i0 += media::TimeInterval(media::TimeUnit::FromSeconds(40), media::TimeUnit::FromSeconds(60));
+ i0 += media::TimeInterval(media::TimeUnit::FromSeconds(5), media::TimeUnit::FromSeconds(10));
+
+ media::TimeIntervals i1;
+ i1.Add(media::TimeInterval(media::TimeUnit::FromSeconds(16), media::TimeUnit::FromSeconds(27)));
+ i1.Add(media::TimeInterval(media::TimeUnit::FromSeconds(7), media::TimeUnit::FromSeconds(15)));
+ i1.Add(media::TimeInterval(media::TimeUnit::FromSeconds(53), media::TimeUnit::FromSeconds(57)));
+ i1.Add(media::TimeInterval(media::TimeUnit::FromSeconds(45), media::TimeUnit::FromSeconds(50)));
+
+ media::TimeIntervals i(i0 + i1);
+ RefPtr<dom::TimeRanges> tr = new dom::TimeRanges();
+ i.ToTimeRanges(tr);
+ EXPECT_EQ(tr->Length(), i.Length());
+ for (dom::TimeRanges::index_type index = 0; index < tr->Length(); index++) {
+ ErrorResult rv;
+ EXPECT_EQ(tr->Start(index, rv), i[index].mStart.ToSeconds());
+ EXPECT_EQ(tr->Start(index, rv), i.Start(index).ToSeconds());
+ EXPECT_EQ(tr->End(index, rv), i[index].mEnd.ToSeconds());
+ EXPECT_EQ(tr->End(index, rv), i.End(index).ToSeconds());
+ }
+}
+
+static void CheckTimeRanges(dom::TimeRanges* aTr, const media::TimeIntervals& aTi)
+{
+ RefPtr<dom::TimeRanges> tr = new dom::TimeRanges;
+ tr->Union(aTr, 0); // This will normalize the time range.
+ EXPECT_EQ(tr->Length(), aTi.Length());
+ for (dom::TimeRanges::index_type i = 0; i < tr->Length(); i++) {
+ ErrorResult rv;
+ EXPECT_EQ(tr->Start(i, rv), aTi[i].mStart.ToSeconds());
+ EXPECT_EQ(tr->Start(i, rv), aTi.Start(i).ToSeconds());
+ EXPECT_EQ(tr->End(i, rv), aTi[i].mEnd.ToSeconds());
+ EXPECT_EQ(tr->End(i, rv), aTi.End(i).ToSeconds());
+ }
+}
+
+TEST(IntervalSet, TimeRangesConversion)
+{
+ RefPtr<dom::TimeRanges> tr = new dom::TimeRanges();
+ tr->Add(20, 25);
+ tr->Add(40, 60);
+ tr->Add(5, 10);
+ tr->Add(16, 27);
+ tr->Add(53, 57);
+ tr->Add(45, 50);
+
+ // explicit copy constructor
+ media::TimeIntervals i1(tr);
+ CheckTimeRanges(tr, i1);
+
+ // static FromTimeRanges
+ media::TimeIntervals i2 = media::TimeIntervals::FromTimeRanges(tr);
+ CheckTimeRanges(tr, i2);
+
+ media::TimeIntervals i3;
+ // operator=(TimeRanges*)
+ i3 = tr;
+ CheckTimeRanges(tr, i3);
+
+ // operator= test
+ i1 = tr.get();
+ CheckTimeRanges(tr, i1);
+}
+
+TEST(IntervalSet, TimeRangesMicroseconds)
+{
+ media::TimeIntervals i0;
+
+ // Test media::Microseconds and TimeUnit interchangeability (compilation only)
+ media::TimeUnit time1{media::Microseconds(5)};
+ media::Microseconds microseconds(5);
+ media::TimeUnit time2 = media::TimeUnit(microseconds);
+ EXPECT_EQ(time1, time2);
+
+ i0 += media::TimeInterval(media::Microseconds(20), media::Microseconds(25));
+ i0 += media::TimeInterval(media::Microseconds(40), media::Microseconds(60));
+ i0 += media::TimeInterval(media::Microseconds(5), media::Microseconds(10));
+
+ media::TimeIntervals i1;
+ i1.Add(media::TimeInterval(media::Microseconds(16), media::Microseconds(27)));
+ i1.Add(media::TimeInterval(media::Microseconds(7), media::Microseconds(15)));
+ i1.Add(media::TimeInterval(media::Microseconds(53), media::Microseconds(57)));
+ i1.Add(media::TimeInterval(media::Microseconds(45), media::Microseconds(50)));
+
+ media::TimeIntervals i(i0 + i1);
+ RefPtr<dom::TimeRanges> tr = new dom::TimeRanges();
+ i.ToTimeRanges(tr);
+ EXPECT_EQ(tr->Length(), i.Length());
+ for (dom::TimeRanges::index_type index = 0; index < tr->Length(); index++) {
+ ErrorResult rv;
+ EXPECT_EQ(tr->Start(index, rv), i[index].mStart.ToSeconds());
+ EXPECT_EQ(tr->Start(index, rv), i.Start(index).ToSeconds());
+ EXPECT_EQ(tr->End(index, rv), i[index].mEnd.ToSeconds());
+ EXPECT_EQ(tr->End(index, rv), i.End(index).ToSeconds());
+ }
+
+ tr->Normalize();
+ EXPECT_EQ(tr->Length(), i.Length());
+ for (dom::TimeRanges::index_type index = 0; index < tr->Length(); index++) {
+ ErrorResult rv;
+ EXPECT_EQ(tr->Start(index, rv), i[index].mStart.ToSeconds());
+ EXPECT_EQ(tr->Start(index, rv), i.Start(index).ToSeconds());
+ EXPECT_EQ(tr->End(index, rv), i[index].mEnd.ToSeconds());
+ EXPECT_EQ(tr->End(index, rv), i.End(index).ToSeconds());
+ }
+
+ // Check infinity values aren't lost in the conversion.
+ tr = new dom::TimeRanges();
+ tr->Add(0, 30);
+ tr->Add(50, std::numeric_limits<double>::infinity());
+ media::TimeIntervals i_oo{media::TimeIntervals::FromTimeRanges(tr)};
+ RefPtr<dom::TimeRanges> tr2 = new dom::TimeRanges();
+ i_oo.ToTimeRanges(tr2);
+ EXPECT_EQ(tr->Length(), tr2->Length());
+ for (dom::TimeRanges::index_type index = 0; index < tr->Length(); index++) {
+ ErrorResult rv;
+ EXPECT_EQ(tr->Start(index, rv), tr2->Start(index, rv));
+ EXPECT_EQ(tr->End(index, rv), tr2->End(index, rv));
+ }
+}
+
+template<typename T>
+class Foo
+{
+public:
+ Foo()
+ : mArg1(1)
+ , mArg2(2)
+ , mArg3(3)
+ {}
+
+ Foo(T a1, T a2, T a3)
+ : mArg1(a1)
+ , mArg2(a2)
+ , mArg3(a3)
+ {}
+
+ Foo<T> operator+ (const Foo<T>& aOther) const
+ {
+ Foo<T> blah;
+ blah.mArg1 += aOther.mArg1;
+ blah.mArg2 += aOther.mArg2;
+ blah.mArg3 += aOther.mArg3;
+ return blah;
+ }
+ Foo<T> operator- (const Foo<T>& aOther) const
+ {
+ Foo<T> blah;
+ blah.mArg1 -= aOther.mArg1;
+ blah.mArg2 -= aOther.mArg2;
+ blah.mArg3 -= aOther.mArg3;
+ return blah;
+ }
+ bool operator< (const Foo<T>& aOther) const
+ {
+ return mArg1 < aOther.mArg1;
+ }
+ bool operator== (const Foo<T>& aOther) const
+ {
+ return mArg1 == aOther.mArg1;
+ }
+ bool operator<= (const Foo<T>& aOther) const
+ {
+ return mArg1 <= aOther.mArg1;
+ }
+
+private:
+ int32_t mArg1;
+ int32_t mArg2;
+ int32_t mArg3;
+};
+
+TEST(IntervalSet, FooIntervalSet)
+{
+ media::Interval<Foo<int>> i(Foo<int>(), Foo<int>(4,5,6));
+ media::IntervalSet<Foo<int>> is;
+ is += i;
+ is += i;
+ is.Add(i);
+ is = is + i;
+ is = i + is;
+ EXPECT_EQ(1u, is.Length());
+ EXPECT_EQ(Foo<int>(), is[0].mStart);
+ EXPECT_EQ(Foo<int>(4,5,6), is[0].mEnd);
+}
+
+TEST(IntervalSet, StaticAssert)
+{
+ media::Interval<int> i;
+
+ static_assert(mozilla::IsSame<nsTArray_CopyChooser<IntIntervals>::Type, nsTArray_CopyWithConstructors<IntIntervals>>::value, "Must use copy constructor");
+ static_assert(mozilla::IsSame<nsTArray_CopyChooser<media::TimeIntervals>::Type, nsTArray_CopyWithConstructors<media::TimeIntervals>>::value, "Must use copy constructor");
+}
+
+TEST(IntervalSet, Substraction)
+{
+ IntIntervals i0;
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+
+ IntInterval i1(8, 15);
+ i0 -= i1;
+
+ EXPECT_EQ(3u, i0.Length());
+ EXPECT_EQ(5, i0[0].mStart);
+ EXPECT_EQ(8, i0[0].mEnd);
+ EXPECT_EQ(20, i0[1].mStart);
+ EXPECT_EQ(25, i0[1].mEnd);
+ EXPECT_EQ(40, i0[2].mStart);
+ EXPECT_EQ(60, i0[2].mEnd);
+
+ i0 = IntIntervals();
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+ i1 = IntInterval(0, 60);
+ i0 -= i1;
+ EXPECT_EQ(0u, i0.Length());
+
+ i0 = IntIntervals();
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+ i1 = IntInterval(0, 45);
+ i0 -= i1;
+ EXPECT_EQ(1u, i0.Length());
+ EXPECT_EQ(45, i0[0].mStart);
+ EXPECT_EQ(60, i0[0].mEnd);
+
+ i0 = IntIntervals();
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+ i1 = IntInterval(8, 45);
+ i0 -= i1;
+ EXPECT_EQ(2u, i0.Length());
+ EXPECT_EQ(5, i0[0].mStart);
+ EXPECT_EQ(8, i0[0].mEnd);
+ EXPECT_EQ(45, i0[1].mStart);
+ EXPECT_EQ(60, i0[1].mEnd);
+
+ i0 = IntIntervals();
+ i0 += IntInterval(5, 10);
+ i0 += IntInterval(20, 25);
+ i0 += IntInterval(40, 60);
+ i1 = IntInterval(8, 70);
+ i0 -= i1;
+ EXPECT_EQ(1u, i0.Length());
+ EXPECT_EQ(5, i0[0].mStart);
+ EXPECT_EQ(8, i0[0].mEnd);
+
+ i0 = IntIntervals();
+ i0 += IntInterval(0, 10);
+ IntIntervals i2;
+ i2 += IntInterval(4, 6);
+ i0 -= i2;
+ EXPECT_EQ(2u, i0.Length());
+ EXPECT_EQ(0, i0[0].mStart);
+ EXPECT_EQ(4, i0[0].mEnd);
+ EXPECT_EQ(6, i0[1].mStart);
+ EXPECT_EQ(10, i0[1].mEnd);
+
+ i0 = IntIntervals();
+ i0 += IntInterval(0, 1);
+ i0 += IntInterval(3, 10);
+ EXPECT_EQ(2u, i0.Length());
+ // This fuzz should collapse i0 into [0,10).
+ i0.SetFuzz(1);
+ EXPECT_EQ(1u, i0.Length());
+ EXPECT_EQ(1, i0[0].mFuzz);
+ i2 = IntInterval(4, 6);
+ i0 -= i2;
+ EXPECT_EQ(2u, i0.Length());
+ EXPECT_EQ(0, i0[0].mStart);
+ EXPECT_EQ(4, i0[0].mEnd);
+ EXPECT_EQ(6, i0[1].mStart);
+ EXPECT_EQ(10, i0[1].mEnd);
+ EXPECT_EQ(1, i0[0].mFuzz);
+ EXPECT_EQ(1, i0[1].mFuzz);
+
+ i0 = IntIntervals();
+ i0 += IntInterval(0, 10);
+ // [4,6) with fuzz 1 used to fail because the complementary interval set
+ // [0,4)+[6,10) would collapse into [0,10).
+ i2 = IntInterval(4, 6);
+ i2.SetFuzz(1);
+ i0 -= i2;
+ EXPECT_EQ(2u, i0.Length());
+ EXPECT_EQ(0, i0[0].mStart);
+ EXPECT_EQ(4, i0[0].mEnd);
+ EXPECT_EQ(6, i0[1].mStart);
+ EXPECT_EQ(10, i0[1].mEnd);
+}
diff --git a/dom/media/gtest/TestMP3Demuxer.cpp b/dom/media/gtest/TestMP3Demuxer.cpp
new file mode 100644
index 000000000..8d2109f00
--- /dev/null
+++ b/dom/media/gtest/TestMP3Demuxer.cpp
@@ -0,0 +1,454 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <gtest/gtest.h>
+#include <vector>
+
+#include "MP3Demuxer.h"
+#include "mozilla/ArrayUtils.h"
+#include "MockMediaResource.h"
+
+using namespace mozilla;
+using namespace mozilla::mp3;
+using media::TimeUnit;
+
+
+// Regular MP3 file mock resource.
+class MockMP3MediaResource : public MockMediaResource {
+public:
+ explicit MockMP3MediaResource(const char* aFileName)
+ : MockMediaResource(aFileName)
+ {}
+
+protected:
+ virtual ~MockMP3MediaResource() {}
+};
+
+// MP3 stream mock resource.
+class MockMP3StreamMediaResource : public MockMP3MediaResource {
+public:
+ explicit MockMP3StreamMediaResource(const char* aFileName)
+ : MockMP3MediaResource(aFileName)
+ {}
+
+ int64_t GetLength() override { return -1; }
+
+protected:
+ virtual ~MockMP3StreamMediaResource() {}
+};
+
+struct MP3Resource {
+ const char* mFilePath;
+ bool mIsVBR;
+ int64_t mFileSize;
+ int32_t mMPEGLayer;
+ int32_t mMPEGVersion;
+ uint8_t mID3MajorVersion;
+ uint8_t mID3MinorVersion;
+ uint8_t mID3Flags;
+ uint32_t mID3Size;
+
+ int64_t mDuration;
+ float mDurationError;
+ float mSeekError;
+ int32_t mSampleRate;
+ int32_t mSamplesPerFrame;
+ uint32_t mNumSamples;
+ // TODO: temp solution, we could parse them instead or account for them
+ // otherwise.
+ int32_t mNumTrailingFrames;
+ int32_t mBitrate;
+ int32_t mSlotSize;
+ int32_t mPrivate;
+
+ // The first n frame offsets.
+ std::vector<int32_t> mSyncOffsets;
+ RefPtr<MockMP3MediaResource> mResource;
+ RefPtr<MP3TrackDemuxer> mDemuxer;
+};
+
+class MP3DemuxerTest : public ::testing::Test {
+protected:
+ void SetUp() override {
+ {
+ MP3Resource res;
+ res.mFilePath = "noise.mp3";
+ res.mIsVBR = false;
+ res.mFileSize = 965257;
+ res.mMPEGLayer = 3;
+ res.mMPEGVersion = 1;
+ res.mID3MajorVersion = 3;
+ res.mID3MinorVersion = 0;
+ res.mID3Flags = 0;
+ res.mID3Size = 2141;
+ res.mDuration = 30067000;
+ res.mDurationError = 0.001f;
+ res.mSeekError = 0.02f;
+ res.mSampleRate = 44100;
+ res.mSamplesPerFrame = 1152;
+ res.mNumSamples = 1325952;
+ res.mNumTrailingFrames = 2;
+ res.mBitrate = 256000;
+ res.mSlotSize = 1;
+ res.mPrivate = 0;
+ const int syncs[] = { 2151, 2987, 3823, 4659, 5495, 6331 };
+ res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 6);
+
+ // No content length can be estimated for CBR stream resources.
+ MP3Resource streamRes = res;
+ streamRes.mFileSize = -1;
+ streamRes.mDuration = -1;
+ streamRes.mDurationError = 0.0f;
+
+ res.mResource = new MockMP3MediaResource(res.mFilePath);
+ res.mDemuxer = new MP3TrackDemuxer(res.mResource);
+ mTargets.push_back(res);
+
+ streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
+ streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
+ mTargets.push_back(streamRes);
+ }
+
+ {
+ MP3Resource res;
+ // This file trips up the MP3 demuxer if ID3v2 tags aren't properly skipped. If skipping is
+ // not properly implemented, depending on the strictness of the MPEG frame parser a false
+ // sync will be detected somewhere within the metadata at or after 112087, or failing
+ // that, at the artificially added extraneous header at 114532.
+ res.mFilePath = "id3v2header.mp3";
+ res.mIsVBR = false;
+ res.mFileSize = 191302;
+ res.mMPEGLayer = 3;
+ res.mMPEGVersion = 1;
+ res.mID3MajorVersion = 3;
+ res.mID3MinorVersion = 0;
+ res.mID3Flags = 0;
+ res.mID3Size = 115304;
+ res.mDuration = 3160816;
+ res.mDurationError = 0.001f;
+ res.mSeekError = 0.02f;
+ res.mSampleRate = 44100;
+ res.mSamplesPerFrame = 1152;
+ res.mNumSamples = 139392;
+ res.mNumTrailingFrames = 0;
+ res.mBitrate = 192000;
+ res.mSlotSize = 1;
+ res.mPrivate = 1;
+ const int syncs[] = { 115314, 115941, 116568, 117195, 117822, 118449 };
+ res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 6);
+
+ // No content length can be estimated for CBR stream resources.
+ MP3Resource streamRes = res;
+ streamRes.mFileSize = -1;
+ streamRes.mDuration = -1;
+ streamRes.mDurationError = 0.0f;
+
+ res.mResource = new MockMP3MediaResource(res.mFilePath);
+ res.mDemuxer = new MP3TrackDemuxer(res.mResource);
+ mTargets.push_back(res);
+
+ streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
+ streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
+ mTargets.push_back(streamRes);
+ }
+
+ {
+ MP3Resource res;
+ res.mFilePath = "noise_vbr.mp3";
+ res.mIsVBR = true;
+ res.mFileSize = 583679;
+ res.mMPEGLayer = 3;
+ res.mMPEGVersion = 1;
+ res.mID3MajorVersion = 3;
+ res.mID3MinorVersion = 0;
+ res.mID3Flags = 0;
+ res.mID3Size = 2221;
+ res.mDuration = 30081000;
+ res.mDurationError = 0.005f;
+ res.mSeekError = 0.02f;
+ res.mSampleRate = 44100;
+ res.mSamplesPerFrame = 1152;
+ res.mNumSamples = 1326575;
+ res.mNumTrailingFrames = 3;
+ res.mBitrate = 154000;
+ res.mSlotSize = 1;
+ res.mPrivate = 0;
+ const int syncs[] = { 2231, 2648, 2752, 3796, 4318, 4735 };
+ res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 6);
+
+ // VBR stream resources contain header info on total frames numbers, which
+ // is used to estimate the total duration.
+ MP3Resource streamRes = res;
+ streamRes.mFileSize = -1;
+
+ res.mResource = new MockMP3MediaResource(res.mFilePath);
+ res.mDemuxer = new MP3TrackDemuxer(res.mResource);
+ mTargets.push_back(res);
+
+ streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
+ streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
+ mTargets.push_back(streamRes);
+ }
+
+ {
+ MP3Resource res;
+ res.mFilePath = "small-shot.mp3";
+ res.mIsVBR = true;
+ res.mFileSize = 6825;
+ res.mMPEGLayer = 3;
+ res.mMPEGVersion = 1;
+ res.mID3MajorVersion = 4;
+ res.mID3MinorVersion = 0;
+ res.mID3Flags = 0;
+ res.mID3Size = 24;
+ res.mDuration = 336686;
+ res.mDurationError = 0.01f;
+ res.mSeekError = 0.2f;
+ res.mSampleRate = 44100;
+ res.mSamplesPerFrame = 1152;
+ res.mNumSamples = 12;
+ res.mNumTrailingFrames = 0;
+ res.mBitrate = 256000;
+ res.mSlotSize = 1;
+ res.mPrivate = 0;
+ const int syncs[] = { 34, 556, 1078, 1601, 2123, 2646, 3168, 3691, 4213,
+ 4736, 5258, 5781, 6303 };
+ res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 13);
+
+ // No content length can be estimated for CBR stream resources.
+ MP3Resource streamRes = res;
+ streamRes.mFileSize = -1;
+
+ res.mResource = new MockMP3MediaResource(res.mFilePath);
+ res.mDemuxer = new MP3TrackDemuxer(res.mResource);
+ mTargets.push_back(res);
+
+ streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
+ streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
+ mTargets.push_back(streamRes);
+ }
+
+ {
+ MP3Resource res;
+ // This file contains a false frame sync at 34, just after the ID3 tag,
+ // which should be identified as a false positive and skipped.
+ res.mFilePath = "small-shot-false-positive.mp3";
+ res.mIsVBR = true;
+ res.mFileSize = 6845;
+ res.mMPEGLayer = 3;
+ res.mMPEGVersion = 1;
+ res.mID3MajorVersion = 4;
+ res.mID3MinorVersion = 0;
+ res.mID3Flags = 0;
+ res.mID3Size = 24;
+ res.mDuration = 336686;
+ res.mDurationError = 0.01f;
+ res.mSeekError = 0.2f;
+ res.mSampleRate = 44100;
+ res.mSamplesPerFrame = 1152;
+ res.mNumSamples = 12;
+ res.mNumTrailingFrames = 0;
+ res.mBitrate = 256000;
+ res.mSlotSize = 1;
+ res.mPrivate = 0;
+ const int syncs[] = { 54, 576, 1098, 1621, 2143, 2666, 3188, 3711, 4233,
+ 4756, 5278, 5801, 6323 };
+ res.mSyncOffsets.insert(res.mSyncOffsets.begin(), syncs, syncs + 13);
+
+ // No content length can be estimated for CBR stream resources.
+ MP3Resource streamRes = res;
+ streamRes.mFileSize = -1;
+
+ res.mResource = new MockMP3MediaResource(res.mFilePath);
+ res.mDemuxer = new MP3TrackDemuxer(res.mResource);
+ mTargets.push_back(res);
+
+ streamRes.mResource = new MockMP3StreamMediaResource(streamRes.mFilePath);
+ streamRes.mDemuxer = new MP3TrackDemuxer(streamRes.mResource);
+ mTargets.push_back(streamRes);
+ }
+
+ for (auto& target: mTargets) {
+ ASSERT_EQ(NS_OK, target.mResource->Open(nullptr));
+ ASSERT_TRUE(target.mDemuxer->Init());
+ }
+ }
+
+ std::vector<MP3Resource> mTargets;
+};
+
+TEST_F(MP3DemuxerTest, ID3Tags) {
+ for (const auto& target: mTargets) {
+ RefPtr<MediaRawData> frame(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frame);
+
+ const auto& id3 = target.mDemuxer->ID3Header();
+ ASSERT_TRUE(id3.IsValid());
+
+ EXPECT_EQ(target.mID3MajorVersion, id3.MajorVersion());
+ EXPECT_EQ(target.mID3MinorVersion, id3.MinorVersion());
+ EXPECT_EQ(target.mID3Flags, id3.Flags());
+ EXPECT_EQ(target.mID3Size, id3.Size());
+ }
+}
+
+TEST_F(MP3DemuxerTest, VBRHeader) {
+ for (const auto& target: mTargets) {
+ RefPtr<MediaRawData> frame(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frame);
+
+ const auto& vbr = target.mDemuxer->VBRInfo();
+
+ if (target.mIsVBR) {
+ EXPECT_EQ(FrameParser::VBRHeader::XING, vbr.Type());
+ // TODO: find reference number which accounts for trailing headers.
+ // EXPECT_EQ(target.mNumSamples / target.mSamplesPerFrame, vbr.NumAudioFrames().value());
+ } else {
+ EXPECT_EQ(FrameParser::VBRHeader::NONE, vbr.Type());
+ EXPECT_FALSE(vbr.NumAudioFrames());
+ }
+ }
+}
+
+TEST_F(MP3DemuxerTest, FrameParsing) {
+ for (const auto& target: mTargets) {
+ RefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frameData);
+ EXPECT_EQ(target.mFileSize, target.mDemuxer->StreamLength());
+
+ const auto& id3 = target.mDemuxer->ID3Header();
+ ASSERT_TRUE(id3.IsValid());
+
+ int64_t parsedLength = id3.Size();
+ int64_t bitrateSum = 0;
+ int32_t numFrames = 0;
+ int32_t numSamples = 0;
+
+ while (frameData) {
+ if (static_cast<int64_t>(target.mSyncOffsets.size()) > numFrames) {
+ // Test sync offsets.
+ EXPECT_EQ(target.mSyncOffsets[numFrames], frameData->mOffset);
+ }
+
+ ++numFrames;
+ parsedLength += frameData->Size();
+
+ const auto& frame = target.mDemuxer->LastFrame();
+ const auto& header = frame.Header();
+ ASSERT_TRUE(header.IsValid());
+
+ numSamples += header.SamplesPerFrame();
+
+ EXPECT_EQ(target.mMPEGLayer, header.Layer());
+ EXPECT_EQ(target.mSampleRate, header.SampleRate());
+ EXPECT_EQ(target.mSamplesPerFrame, header.SamplesPerFrame());
+ EXPECT_EQ(target.mSlotSize, header.SlotSize());
+ EXPECT_EQ(target.mPrivate, header.Private());
+
+ if (target.mIsVBR) {
+ // Used to compute the average bitrate for VBR streams.
+ bitrateSum += target.mBitrate;
+ } else {
+ EXPECT_EQ(target.mBitrate, header.Bitrate());
+ }
+
+ frameData = target.mDemuxer->DemuxSample();
+ }
+
+ // TODO: find reference number which accounts for trailing headers.
+ // EXPECT_EQ(target.mNumSamples / target.mSamplesPerFrame, numFrames);
+ // EXPECT_EQ(target.mNumSamples, numSamples);
+
+ // There may be trailing headers which we don't parse, so the stream length
+ // is the upper bound.
+ if (target.mFileSize > 0) {
+ EXPECT_GE(target.mFileSize, parsedLength);
+ }
+
+ if (target.mIsVBR) {
+ ASSERT_TRUE(numFrames);
+ EXPECT_EQ(target.mBitrate, static_cast<int32_t>(bitrateSum / numFrames));
+ }
+ }
+}
+
+TEST_F(MP3DemuxerTest, Duration) {
+ for (const auto& target: mTargets) {
+ RefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frameData);
+ EXPECT_EQ(target.mFileSize, target.mDemuxer->StreamLength());
+
+ while (frameData) {
+ EXPECT_NEAR(target.mDuration, target.mDemuxer->Duration().ToMicroseconds(),
+ target.mDurationError * target.mDuration);
+
+ frameData = target.mDemuxer->DemuxSample();
+ }
+ }
+
+ // Seek out of range tests.
+ for (const auto& target: mTargets) {
+ // Skip tests for stream media resources because of lacking duration.
+ if (target.mFileSize <= 0) {
+ continue;
+ }
+
+ target.mDemuxer->Reset();
+ RefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frameData);
+
+ const int64_t duration = target.mDemuxer->Duration().ToMicroseconds();
+ const int64_t pos = duration + 1e6;
+
+ // Attempt to seek 1 second past the end of stream.
+ target.mDemuxer->Seek(TimeUnit::FromMicroseconds(pos));
+ // The seek should bring us to the end of the stream.
+ EXPECT_NEAR(duration, target.mDemuxer->SeekPosition().ToMicroseconds(),
+ target.mSeekError * duration);
+
+ // Since we're at the end of the stream, there should be no frames left.
+ frameData = target.mDemuxer->DemuxSample();
+ ASSERT_FALSE(frameData);
+ }
+}
+
+TEST_F(MP3DemuxerTest, Seek) {
+ for (const auto& target: mTargets) {
+ RefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frameData);
+
+ const int64_t seekTime = TimeUnit::FromSeconds(1).ToMicroseconds();
+ int64_t pos = target.mDemuxer->SeekPosition().ToMicroseconds();
+
+ while (frameData) {
+ EXPECT_NEAR(pos, target.mDemuxer->SeekPosition().ToMicroseconds(),
+ target.mSeekError * pos);
+
+ pos += seekTime;
+ target.mDemuxer->Seek(TimeUnit::FromMicroseconds(pos));
+ frameData = target.mDemuxer->DemuxSample();
+ }
+ }
+
+ // Seeking should work with in-between resets, too.
+ for (const auto& target: mTargets) {
+ target.mDemuxer->Reset();
+ RefPtr<MediaRawData> frameData(target.mDemuxer->DemuxSample());
+ ASSERT_TRUE(frameData);
+
+ const int64_t seekTime = TimeUnit::FromSeconds(1).ToMicroseconds();
+ int64_t pos = target.mDemuxer->SeekPosition().ToMicroseconds();
+
+ while (frameData) {
+ EXPECT_NEAR(pos, target.mDemuxer->SeekPosition().ToMicroseconds(),
+ target.mSeekError * pos);
+
+ pos += seekTime;
+ target.mDemuxer->Reset();
+ target.mDemuxer->Seek(TimeUnit::FromMicroseconds(pos));
+ frameData = target.mDemuxer->DemuxSample();
+ }
+ }
+}
diff --git a/dom/media/gtest/TestMP4Demuxer.cpp b/dom/media/gtest/TestMP4Demuxer.cpp
new file mode 100644
index 000000000..f1210fde7
--- /dev/null
+++ b/dom/media/gtest/TestMP4Demuxer.cpp
@@ -0,0 +1,463 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "MP4Demuxer.h"
+#include "MP4Stream.h"
+#include "mozilla/MozPromise.h"
+#include "MediaDataDemuxer.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/TaskQueue.h"
+#include "mozilla/ArrayUtils.h"
+#include "MockMediaResource.h"
+#include "VideoUtils.h"
+
+using namespace mozilla;
+using namespace mp4_demuxer;
+
+class AutoTaskQueue;
+
+#define DO_FAIL [binding]()->void { EXPECT_TRUE(false); binding->mTaskQueue->BeginShutdown(); }
+
+class MP4DemuxerBinding
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MP4DemuxerBinding);
+
+ RefPtr<MockMediaResource> resource;
+ RefPtr<MP4Demuxer> mDemuxer;
+ RefPtr<TaskQueue> mTaskQueue;
+ RefPtr<MediaTrackDemuxer> mAudioTrack;
+ RefPtr<MediaTrackDemuxer> mVideoTrack;
+ uint32_t mIndex;
+ nsTArray<RefPtr<MediaRawData>> mSamples;
+ nsTArray<int64_t> mKeyFrameTimecodes;
+ MozPromiseHolder<GenericPromise> mCheckTrackKeyFramePromise;
+ MozPromiseHolder<GenericPromise> mCheckTrackSamples;
+
+ explicit MP4DemuxerBinding(const char* aFileName = "dash_dashinit.mp4")
+ : resource(new MockMediaResource(aFileName))
+ , mDemuxer(new MP4Demuxer(resource))
+ , mTaskQueue(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK)))
+ , mIndex(0)
+ {
+ EXPECT_EQ(NS_OK, resource->Open(nullptr));
+ }
+
+ template<typename Function>
+ void RunTestAndWait(const Function& aFunction)
+ {
+ Function func(aFunction);
+ RefPtr<MP4DemuxerBinding> binding = this;
+ mDemuxer->Init()->Then(mTaskQueue, __func__, Move(func), DO_FAIL);
+ mTaskQueue->AwaitShutdownAndIdle();
+ }
+
+ RefPtr<GenericPromise>
+ CheckTrackKeyFrame(MediaTrackDemuxer* aTrackDemuxer)
+ {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ RefPtr<MediaTrackDemuxer> track = aTrackDemuxer;
+ RefPtr<MP4DemuxerBinding> binding = this;
+
+ int64_t time = -1;
+ while (mIndex < mSamples.Length()) {
+ uint32_t i = mIndex++;
+ if (mSamples[i]->mKeyframe) {
+ time = mSamples[i]->mTime;
+ break;
+ }
+ }
+
+ RefPtr<GenericPromise> p = mCheckTrackKeyFramePromise.Ensure(__func__);
+
+ if (time == -1) {
+ mCheckTrackKeyFramePromise.Resolve(true, __func__);
+ return p;
+ }
+
+
+ DispatchTask(
+ [track, time, binding] () {
+ track->Seek(media::TimeUnit::FromMicroseconds(time))->Then(binding->mTaskQueue, __func__,
+ [track, time, binding] () {
+ track->GetSamples()->Then(binding->mTaskQueue, __func__,
+ [track, time, binding] (RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
+ EXPECT_EQ(time, aSamples->mSamples[0]->mTime);
+ binding->CheckTrackKeyFrame(track);
+ },
+ DO_FAIL
+ );
+ },
+ DO_FAIL
+ );
+ }
+ );
+
+ return p;
+ }
+
+ RefPtr<GenericPromise>
+ CheckTrackSamples(MediaTrackDemuxer* aTrackDemuxer)
+ {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ RefPtr<MediaTrackDemuxer> track = aTrackDemuxer;
+ RefPtr<MP4DemuxerBinding> binding = this;
+
+ RefPtr<GenericPromise> p = mCheckTrackSamples.Ensure(__func__);
+
+ DispatchTask(
+ [track, binding] () {
+ track->GetSamples()->Then(binding->mTaskQueue, __func__,
+ [track, binding] (RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
+ if (aSamples->mSamples.Length()) {
+ binding->mSamples.AppendElements(aSamples->mSamples);
+ binding->CheckTrackSamples(track);
+ }
+ },
+ [binding] (const MediaResult& aError) {
+ if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ EXPECT_TRUE(binding->mSamples.Length() > 1);
+ for (uint32_t i = 0; i < (binding->mSamples.Length() - 1); i++) {
+ EXPECT_LT(binding->mSamples[i]->mTimecode, binding->mSamples[i + 1]->mTimecode);
+ if (binding->mSamples[i]->mKeyframe) {
+ binding->mKeyFrameTimecodes.AppendElement(binding->mSamples[i]->mTimecode);
+ }
+ }
+ binding->mCheckTrackSamples.Resolve(true, __func__);
+ } else {
+ EXPECT_TRUE(false);
+ binding->mCheckTrackSamples.Reject(aError, __func__);
+ }
+ }
+ );
+ }
+ );
+
+ return p;
+ }
+
+private:
+
+ template<typename FunctionType>
+ void
+ DispatchTask(FunctionType aFun)
+ {
+ RefPtr<Runnable> r = NS_NewRunnableFunction(aFun);
+ mTaskQueue->Dispatch(r.forget());
+ }
+
+ virtual ~MP4DemuxerBinding()
+ {
+ }
+};
+
+TEST(MP4Demuxer, Seek)
+{
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding();
+
+ binding->RunTestAndWait([binding] () {
+ binding->mVideoTrack = binding->mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ binding->CheckTrackSamples(binding->mVideoTrack)
+ ->Then(binding->mTaskQueue, __func__,
+ [binding] () {
+ binding->CheckTrackKeyFrame(binding->mVideoTrack)
+ ->Then(binding->mTaskQueue, __func__,
+ [binding] () {
+ binding->mTaskQueue->BeginShutdown();
+ }, DO_FAIL);
+ }, DO_FAIL);
+ });
+}
+
+static nsCString
+ToCryptoString(const CryptoSample& aCrypto)
+{
+ nsCString res;
+ if (aCrypto.mValid) {
+ res.AppendPrintf("%d %d ", aCrypto.mMode, aCrypto.mIVSize);
+ for (size_t i = 0; i < aCrypto.mKeyId.Length(); i++) {
+ res.AppendPrintf("%02x", aCrypto.mKeyId[i]);
+ }
+ res.Append(" ");
+ for (size_t i = 0; i < aCrypto.mIV.Length(); i++) {
+ res.AppendPrintf("%02x", aCrypto.mIV[i]);
+ }
+ EXPECT_EQ(aCrypto.mPlainSizes.Length(), aCrypto.mEncryptedSizes.Length());
+ for (size_t i = 0; i < aCrypto.mPlainSizes.Length(); i++) {
+ res.AppendPrintf(" %d,%d", aCrypto.mPlainSizes[i],
+ aCrypto.mEncryptedSizes[i]);
+ }
+ } else {
+ res.Append("no crypto");
+ }
+ return res;
+}
+
+#ifndef XP_WIN // VC2013 doesn't support C++11 array initialization.
+
+TEST(MP4Demuxer, CENCFragVideo)
+{
+ const char* video[] = {
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000000 5,684 5,16980",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000450 5,1826",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000004c3 5,1215",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000050f 5,1302",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000561 5,939",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000059c 5,763",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000005cc 5,672",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000005f6 5,748",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000625 5,1025",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000666 5,730",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000694 5,897",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000006cd 5,643",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000006f6 5,556",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000719 5,527",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000073a 5,606",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000760 5,701",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000078c 5,531",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000007ae 5,562",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000007d2 5,576",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000007f6 5,514",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000817 5,404",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000831 5,635",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000859 5,433",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000875 5,478",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000893 5,474",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000008b1 5,462",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000008ce 5,473",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000008ec 5,437",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000908 5,418",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000923 5,475",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000941 5,23133",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000ee7 5,475",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f05 5,402",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f1f 5,415",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f39 5,408",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f53 5,442",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f6f 5,385",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f88 5,368",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000f9f 5,354",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000fb6 5,400",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000fcf 5,399",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000000fe8 5,1098",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000102d 5,1508",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000108c 5,1345",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000010e1 5,1945",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000115b 5,1824",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000011cd 5,2133",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000001253 5,2486",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000012ef 5,1739",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000135c 5,1836",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000013cf 5,2367",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000001463 5,2571",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000001504 5,3008",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000015c0 5,3255",
+ "1 16 7e571d037e571d037e571d037e571d03 0000000000000000000000000000168c 5,3225",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000001756 5,3118",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000001819 5,2407",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000018b0 5,2400",
+ "1 16 7e571d037e571d037e571d037e571d03 00000000000000000000000000001946 5,2158",
+ "1 16 7e571d037e571d037e571d037e571d03 000000000000000000000000000019cd 5,2392",
+ };
+
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding("gizmo-frag.mp4");
+
+ binding->RunTestAndWait([binding, video] () {
+ // grab all video samples.
+ binding->mVideoTrack = binding->mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ binding->CheckTrackSamples(binding->mVideoTrack)
+ ->Then(binding->mTaskQueue, __func__,
+ [binding, video] () {
+ for (uint32_t i = 0; i < binding->mSamples.Length(); i++) {
+ nsCString text = ToCryptoString(binding->mSamples[i]->mCrypto);
+ EXPECT_STREQ(video[i++], text.get());
+ }
+ EXPECT_EQ(ArrayLength(video), binding->mSamples.Length());
+ binding->mTaskQueue->BeginShutdown();
+ }, DO_FAIL);
+ });
+}
+
+TEST(MP4Demuxer, CENCFragAudio)
+{
+ const char* audio[] = {
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000000 0,281",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000012 0,257",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000023 0,246",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000033 0,257",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000044 0,260",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000055 0,260",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000066 0,272",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000077 0,280",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000089 0,284",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000009b 0,290",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000000ae 0,278",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000000c0 0,268",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000000d1 0,307",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000000e5 0,290",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000000f8 0,304",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000010b 0,316",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000011f 0,308",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000133 0,301",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000146 0,318",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000015a 0,311",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000016e 0,303",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000181 0,325",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000196 0,334",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000001ab 0,344",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000001c1 0,344",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000001d7 0,387",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000001f0 0,396",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000209 0,368",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000220 0,373",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000238 0,425",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000253 0,428",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000026e 0,426",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000289 0,427",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000002a4 0,424",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000002bf 0,447",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000002db 0,446",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000002f7 0,442",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000313 0,444",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000032f 0,374",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000347 0,405",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000361 0,372",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000379 0,395",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000392 0,435",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000003ae 0,426",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000003c9 0,430",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000003e4 0,390",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000003fd 0,335",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000412 0,339",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000428 0,352",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000043e 0,364",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000455 0,398",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000046e 0,451",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000048b 0,448",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000004a7 0,436",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000004c3 0,424",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000004de 0,428",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000004f9 0,413",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000513 0,430",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000052e 0,450",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000054b 0,386",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000564 0,320",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000578 0,347",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000058e 0,382",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000005a6 0,437",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000005c2 0,387",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000005db 0,340",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000005f1 0,337",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000607 0,389",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000620 0,428",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000063b 0,426",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000656 0,446",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000672 0,456",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000068f 0,468",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000006ad 0,468",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000006cb 0,463",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000006e8 0,467",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000706 0,460",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000723 0,446",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000073f 0,453",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000075c 0,448",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000778 0,446",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000794 0,439",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000007b0 0,436",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000007cc 0,441",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000007e8 0,465",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000806 0,448",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000822 0,448",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000083e 0,469",
+ "1 16 7e571d047e571d047e571d047e571d04 0000000000000000000000000000085c 0,431",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000877 0,437",
+ "1 16 7e571d047e571d047e571d047e571d04 00000000000000000000000000000893 0,474",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000008b1 0,436",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000008cd 0,433",
+ "1 16 7e571d047e571d047e571d047e571d04 000000000000000000000000000008e9 0,481",
+ };
+
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding("gizmo-frag.mp4");
+
+ binding->RunTestAndWait([binding, audio] () {
+ // grab all audio samples.
+ binding->mAudioTrack = binding->mDemuxer->GetTrackDemuxer(TrackInfo::kAudioTrack, 0);
+ binding->CheckTrackSamples(binding->mAudioTrack)
+ ->Then(binding->mTaskQueue, __func__,
+ [binding, audio] () {
+ EXPECT_TRUE(binding->mSamples.Length() > 1);
+ for (uint32_t i = 0; i < binding->mSamples.Length(); i++) {
+ nsCString text = ToCryptoString(binding->mSamples[i]->mCrypto);
+ EXPECT_STREQ(audio[i++], text.get());
+ }
+ EXPECT_EQ(ArrayLength(audio), binding->mSamples.Length());
+ binding->mTaskQueue->BeginShutdown();
+ }, DO_FAIL);
+ });
+}
+
+#endif
+
+TEST(MP4Demuxer, GetNextKeyframe)
+{
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding("gizmo-frag.mp4");
+
+ binding->RunTestAndWait([binding] () {
+ // Insert a [0,end] buffered range, to simulate Moof's being buffered
+ // via MSE.
+ auto len = binding->resource->GetLength();
+ binding->resource->MockAddBufferedRange(0, len);
+
+ // gizmp-frag has two keyframes; one at dts=cts=0, and another at
+ // dts=cts=1000000. Verify we get expected results.
+ media::TimeUnit time;
+ binding->mVideoTrack = binding->mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ binding->mVideoTrack->Reset();
+ binding->mVideoTrack->GetNextRandomAccessPoint(&time);
+ EXPECT_EQ(time.ToMicroseconds(), 0);
+ binding->mVideoTrack->GetSamples()->Then(binding->mTaskQueue, __func__,
+ [binding] () {
+ media::TimeUnit time;
+ binding->mVideoTrack->GetNextRandomAccessPoint(&time);
+ EXPECT_EQ(time.ToMicroseconds(), 1000000);
+ binding->mTaskQueue->BeginShutdown();
+ },
+ DO_FAIL
+ );
+ });
+}
+
+TEST(MP4Demuxer, ZeroInLastMoov)
+{
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding("short-zero-in-moov.mp4");
+ binding->RunTestAndWait([binding] () {
+ // It demuxes without error. That is sufficient.
+ binding->mTaskQueue->BeginShutdown();
+ });
+}
+
+
+TEST(MP4Demuxer, ZeroInMoovQuickTime)
+{
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding("short-zero-inband.mov");
+ binding->RunTestAndWait([binding] () {
+ // It demuxes without error. That is sufficient.
+ binding->mTaskQueue->BeginShutdown();
+ });
+}
+
+TEST(MP4Demuxer, IgnoreMinus1Duration)
+{
+ RefPtr<MP4DemuxerBinding> binding = new MP4DemuxerBinding("negative_duration.mp4");
+ binding->RunTestAndWait([binding] () {
+ // It demuxes without error. That is sufficient.
+ binding->mTaskQueue->BeginShutdown();
+ });
+}
+
+#undef DO_FAIL
diff --git a/dom/media/gtest/TestMP4Reader.cpp b/dom/media/gtest/TestMP4Reader.cpp
new file mode 100644
index 000000000..f08f7a40d
--- /dev/null
+++ b/dom/media/gtest/TestMP4Reader.cpp
@@ -0,0 +1,217 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "MP4Reader.h"
+#include "MP4Decoder.h"
+#include "mozilla/SharedThreadPool.h"
+#include "MockMediaResource.h"
+#include "MockMediaDecoderOwner.h"
+#include "mozilla/Preferences.h"
+#include "TimeUnits.h"
+
+using namespace mozilla;
+using namespace mozilla::dom;
+
+class TestBinding
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestBinding);
+
+ RefPtr<MP4Decoder> decoder;
+ RefPtr<MockMediaResource> resource;
+ RefPtr<MP4Reader> reader;
+
+ explicit TestBinding(const char* aFileName = "gizmo.mp4")
+ : decoder(new MP4Decoder())
+ , resource(new MockMediaResource(aFileName))
+ , reader(new MP4Reader(decoder))
+ {
+ EXPECT_EQ(NS_OK, Preferences::SetBool(
+ "media.use-blank-decoder", true));
+
+ EXPECT_EQ(NS_OK, resource->Open(nullptr));
+ decoder->SetResource(resource);
+
+ reader->Init(nullptr);
+ // This needs to be done before invoking GetBuffered. This is normally
+ // done by MediaDecoderStateMachine.
+ reader->DispatchSetStartTime(0);
+ }
+
+ void Init() {
+ nsCOMPtr<nsIThread> thread;
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(this, &TestBinding::ReadMetadata);
+ nsresult rv = NS_NewThread(getter_AddRefs(thread), r);
+ EXPECT_EQ(NS_OK, rv);
+ thread->Shutdown();
+ }
+
+private:
+ virtual ~TestBinding()
+ {
+ {
+ RefPtr<TaskQueue> queue = reader->OwnerThread();
+ nsCOMPtr<nsIRunnable> task = NewRunnableMethod(reader, &MP4Reader::Shutdown);
+ // Hackily bypass the tail dispatcher so that we can AwaitShutdownAndIdle.
+ // In production code we'd use BeginShutdown + promises.
+ queue->Dispatch(task.forget(), AbstractThread::AssertDispatchSuccess,
+ AbstractThread::TailDispatch);
+ queue->AwaitShutdownAndIdle();
+ }
+ decoder = nullptr;
+ resource = nullptr;
+ reader = nullptr;
+ SharedThreadPool::SpinUntilEmpty();
+ }
+
+ void ReadMetadata()
+ {
+ MediaInfo info;
+ MetadataTags* tags;
+ EXPECT_EQ(NS_OK, reader->ReadMetadata(&info, &tags));
+ }
+};
+
+TEST(MP4Reader, BufferedRange)
+{
+ RefPtr<TestBinding> b = new TestBinding();
+ b->Init();
+
+ // Video 3-4 sec, audio 2.986666-4.010666 sec
+ b->resource->MockAddBufferedRange(248400, 327455);
+
+ media::TimeIntervals ranges = b->reader->GetBuffered();
+ EXPECT_EQ(1U, ranges.Length());
+ EXPECT_NEAR(270000 / 90000.0, ranges.Start(0).ToSeconds(), 0.000001);
+ EXPECT_NEAR(360000 / 90000.0, ranges.End(0).ToSeconds(), 0.000001);
+}
+
+TEST(MP4Reader, BufferedRangeMissingLastByte)
+{
+ RefPtr<TestBinding> b = new TestBinding();
+ b->Init();
+
+ // Dropping the last byte of the video
+ b->resource->MockClearBufferedRanges();
+ b->resource->MockAddBufferedRange(248400, 324912);
+ b->resource->MockAddBufferedRange(324913, 327455);
+
+ media::TimeIntervals ranges = b->reader->GetBuffered();
+ EXPECT_EQ(1U, ranges.Length());
+ EXPECT_NEAR(270000.0 / 90000.0, ranges.Start(0).ToSeconds(), 0.000001);
+ EXPECT_NEAR(357000 / 90000.0, ranges.End(0).ToSeconds(), 0.000001);
+}
+
+TEST(MP4Reader, BufferedRangeSyncFrame)
+{
+ RefPtr<TestBinding> b = new TestBinding();
+ b->Init();
+
+ // Check that missing the first byte at 2 seconds skips right through to 3
+ // seconds because of a missing sync frame
+ b->resource->MockClearBufferedRanges();
+ b->resource->MockAddBufferedRange(146336, 327455);
+
+ media::TimeIntervals ranges = b->reader->GetBuffered();
+ EXPECT_EQ(1U, ranges.Length());
+ EXPECT_NEAR(270000.0 / 90000.0, ranges.Start(0).ToSeconds(), 0.000001);
+ EXPECT_NEAR(360000 / 90000.0, ranges.End(0).ToSeconds(), 0.000001);
+}
+
+TEST(MP4Reader, CompositionOrder)
+{
+ RefPtr<TestBinding> b = new TestBinding("mediasource_test.mp4");
+ b->Init();
+
+ // The first 5 video samples of this file are:
+ // Video timescale=2500
+ // Frame Start Size Time Duration Sync
+ // 1 48 5455 166 83 Yes
+ // 2 5503 145 249 83
+ // 3 6228 575 581 83
+ // 4 7383 235 415 83
+ // 5 8779 183 332 83
+ // 6 9543 191 498 83
+ //
+ // Audio timescale=44100
+ // 1 5648 580 0 1024 Yes
+ // 2 6803 580 1024 1058 Yes
+ // 3 7618 581 2082 1014 Yes
+ // 4 8199 580 3096 1015 Yes
+ // 5 8962 581 4111 1014 Yes
+ // 6 9734 580 5125 1014 Yes
+ // 7 10314 581 6139 1059 Yes
+ // 8 11207 580 7198 1014 Yes
+ // 9 12035 581 8212 1014 Yes
+ // 10 12616 580 9226 1015 Yes
+ // 11 13220 581 10241 1014 Yes
+
+ b->resource->MockClearBufferedRanges();
+ // First two frames in decoding + first audio frame
+ b->resource->MockAddBufferedRange(48, 5503); // Video 1
+ b->resource->MockAddBufferedRange(5503, 5648); // Video 2
+ b->resource->MockAddBufferedRange(6228, 6803); // Video 3
+
+ // Audio - 5 frames; 0 - 139206 us
+ b->resource->MockAddBufferedRange(5648, 6228);
+ b->resource->MockAddBufferedRange(6803, 7383);
+ b->resource->MockAddBufferedRange(7618, 8199);
+ b->resource->MockAddBufferedRange(8199, 8779);
+ b->resource->MockAddBufferedRange(8962, 9563);
+ b->resource->MockAddBufferedRange(9734, 10314);
+ b->resource->MockAddBufferedRange(10314, 10895);
+ b->resource->MockAddBufferedRange(11207, 11787);
+ b->resource->MockAddBufferedRange(12035, 12616);
+ b->resource->MockAddBufferedRange(12616, 13196);
+ b->resource->MockAddBufferedRange(13220, 13901);
+
+ media::TimeIntervals ranges = b->reader->GetBuffered();
+ EXPECT_EQ(2U, ranges.Length());
+
+ EXPECT_NEAR(166.0 / 2500.0, ranges.Start(0).ToSeconds(), 0.000001);
+ EXPECT_NEAR(332.0 / 2500.0, ranges.End(0).ToSeconds(), 0.000001);
+
+ EXPECT_NEAR(581.0 / 2500.0, ranges.Start(1).ToSeconds(), 0.000001);
+ EXPECT_NEAR(11255.0 / 44100.0, ranges.End(1).ToSeconds(), 0.000001);
+}
+
+TEST(MP4Reader, Normalised)
+{
+ RefPtr<TestBinding> b = new TestBinding("mediasource_test.mp4");
+ b->Init();
+
+ // The first 5 video samples of this file are:
+ // Video timescale=2500
+ // Frame Start Size Time Duration Sync
+ // 1 48 5455 166 83 Yes
+ // 2 5503 145 249 83
+ // 3 6228 575 581 83
+ // 4 7383 235 415 83
+ // 5 8779 183 332 83
+ // 6 9543 191 498 83
+ //
+ // Audio timescale=44100
+ // 1 5648 580 0 1024 Yes
+ // 2 6803 580 1024 1058 Yes
+ // 3 7618 581 2082 1014 Yes
+ // 4 8199 580 3096 1015 Yes
+ // 5 8962 581 4111 1014 Yes
+ // 6 9734 580 5125 1014 Yes
+ // 7 10314 581 6139 1059 Yes
+ // 8 11207 580 7198 1014 Yes
+ // 9 12035 581 8212 1014 Yes
+ // 10 12616 580 9226 1015 Yes
+ // 11 13220 581 10241 1014 Yes
+
+ b->resource->MockClearBufferedRanges();
+ b->resource->MockAddBufferedRange(48, 13901);
+
+ media::TimeIntervals ranges = b->reader->GetBuffered();
+ EXPECT_EQ(1U, ranges.Length());
+
+ EXPECT_NEAR(166.0 / 2500.0, ranges.Start(0).ToSeconds(), 0.000001);
+ EXPECT_NEAR(11255.0 / 44100.0, ranges.End(0).ToSeconds(), 0.000001);
+}
diff --git a/dom/media/gtest/TestMediaDataDecoder.cpp b/dom/media/gtest/TestMediaDataDecoder.cpp
new file mode 100644
index 000000000..47e78bf7e
--- /dev/null
+++ b/dom/media/gtest/TestMediaDataDecoder.cpp
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "Benchmark.h"
+#include "MockMediaResource.h"
+#include "DecoderTraits.h"
+#include "MP4Demuxer.h"
+#include "WebMDemuxer.h"
+
+using namespace mozilla;
+
+class BenchmarkRunner
+{
+public:
+ explicit BenchmarkRunner(Benchmark* aBenchmark)
+ : mBenchmark(aBenchmark) {}
+
+ uint32_t Run()
+ {
+ bool done = false;
+ uint32_t result = 0;
+
+ mBenchmark->Init();
+ mBenchmark->Run()->Then(
+ AbstractThread::MainThread(), __func__,
+ [&](uint32_t aDecodeFps) { result = aDecodeFps; done = true; },
+ [&]() { done = true; });
+
+ // Wait until benchmark completes.
+ while (!done) {
+ NS_ProcessNextEvent();
+ }
+ return result;
+ }
+
+private:
+ RefPtr<Benchmark> mBenchmark;
+};
+
+TEST(MediaDataDecoder, H264)
+{
+ if (!DecoderTraits::IsMP4TypeAndEnabled(NS_LITERAL_CSTRING("video/mp4")
+ , /* DecoderDoctorDiagnostics* */ nullptr)) {
+ EXPECT_TRUE(true);
+ } else {
+ RefPtr<MediaResource> resource =
+ new MockMediaResource("gizmo.mp4", NS_LITERAL_CSTRING("video/mp4"));
+ nsresult rv = resource->Open(nullptr);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+
+ BenchmarkRunner runner(new Benchmark(new MP4Demuxer(resource)));
+ EXPECT_GT(runner.Run(), 0u);
+ }
+}
+
+TEST(MediaDataDecoder, VP9)
+{
+ if (!DecoderTraits::IsWebMTypeAndEnabled(NS_LITERAL_CSTRING("video/webm"))) {
+ EXPECT_TRUE(true);
+ } else {
+ RefPtr<MediaResource> resource =
+ new MockMediaResource("vp9cake.webm", NS_LITERAL_CSTRING("video/webm"));
+ nsresult rv = resource->Open(nullptr);
+ EXPECT_TRUE(NS_SUCCEEDED(rv));
+
+ BenchmarkRunner runner(new Benchmark(new WebMDemuxer(resource)));
+ EXPECT_GT(runner.Run(), 0u);
+ }
+}
diff --git a/dom/media/gtest/TestMediaEventSource.cpp b/dom/media/gtest/TestMediaEventSource.cpp
new file mode 100644
index 000000000..75fb09f20
--- /dev/null
+++ b/dom/media/gtest/TestMediaEventSource.cpp
@@ -0,0 +1,337 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/TaskQueue.h"
+#include "mozilla/UniquePtr.h"
+#include "MediaEventSource.h"
+#include "VideoUtils.h"
+
+using namespace mozilla;
+
+/*
+ * Test if listeners receive the event data correctly.
+ */
+TEST(MediaEventSource, SingleListener)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<int> source;
+ int i = 0;
+
+ auto func = [&] (int j) { i += j; };
+ MediaEventListener listener = source.Connect(queue, func);
+
+ // Call Notify 3 times. The listener should be also called 3 times.
+ source.Notify(3);
+ source.Notify(5);
+ source.Notify(7);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ // Verify the event data is passed correctly to the listener.
+ EXPECT_EQ(i, 15); // 3 + 5 + 7
+ listener.Disconnect();
+}
+
+TEST(MediaEventSource, MultiListener)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<int> source;
+ int i = 0;
+ int j = 0;
+
+ auto func1 = [&] (int k) { i = k * 2; };
+ auto func2 = [&] (int k) { j = k * 3; };
+ MediaEventListener listener1 = source.Connect(queue, func1);
+ MediaEventListener listener2 = source.Connect(queue, func2);
+
+ // Both listeners should receive the event.
+ source.Notify(11);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ // Verify the event data is passed correctly to the listener.
+ EXPECT_EQ(i, 22); // 11 * 2
+ EXPECT_EQ(j, 33); // 11 * 3
+
+ listener1.Disconnect();
+ listener2.Disconnect();
+}
+
+/*
+ * Test if disconnecting a listener prevents events from coming.
+ */
+TEST(MediaEventSource, DisconnectAfterNotification)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<int> source;
+ int i = 0;
+
+ MediaEventListener listener;
+ auto func = [&] (int j) { i += j; listener.Disconnect(); };
+ listener = source.Connect(queue, func);
+
+ // Call Notify() twice. Since we disconnect the listener when receiving
+ // the 1st event, the 2nd event should not reach the listener.
+ source.Notify(11);
+ source.Notify(11);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ // Check only the 1st event is received.
+ EXPECT_EQ(i, 11);
+}
+
+TEST(MediaEventSource, DisconnectBeforeNotification)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<int> source;
+ int i = 0;
+ int j = 0;
+
+ auto func1 = [&] (int k) { i = k * 2; };
+ auto func2 = [&] (int k) { j = k * 3; };
+ MediaEventListener listener1 = source.Connect(queue, func1);
+ MediaEventListener listener2 = source.Connect(queue, func2);
+
+ // Disconnect listener2 before notification. Only listener1 should receive
+ // the event.
+ listener2.Disconnect();
+ source.Notify(11);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ EXPECT_EQ(i, 22); // 11 * 2
+ EXPECT_EQ(j, 0); // event not received
+
+ listener1.Disconnect();
+}
+
+/*
+ * Test we don't hit the assertion when calling Connect() and Disconnect()
+ * repeatedly.
+ */
+TEST(MediaEventSource, DisconnectAndConnect)
+{
+ RefPtr<TaskQueue> queue;
+ MediaEventProducerExc<int> source;
+ MediaEventListener listener = source.Connect(queue, [](){});
+ listener.Disconnect();
+ listener = source.Connect(queue, [](){});
+ listener.Disconnect();
+}
+
+/*
+ * Test void event type.
+ */
+TEST(MediaEventSource, VoidEventType)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<void> source;
+ int i = 0;
+
+ // Test function object.
+ auto func = [&] () { ++i; };
+ MediaEventListener listener1 = source.Connect(queue, func);
+
+ // Test member function.
+ struct Foo {
+ Foo() : j(1) {}
+ void OnNotify() {
+ j *= 2;
+ }
+ int j;
+ } foo;
+ MediaEventListener listener2 = source.Connect(queue, &foo, &Foo::OnNotify);
+
+ // Call Notify 2 times. The listener should be also called 2 times.
+ source.Notify();
+ source.Notify();
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ // Verify the event data is passed correctly to the listener.
+ EXPECT_EQ(i, 2); // ++i called twice
+ EXPECT_EQ(foo.j, 4); // |j *= 2| called twice
+ listener1.Disconnect();
+ listener2.Disconnect();
+}
+
+/*
+ * Test listeners can take various event types (T, T&&, const T& and void).
+ */
+TEST(MediaEventSource, ListenerType1)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<int> source;
+ int i = 0;
+
+ // Test various argument types.
+ auto func1 = [&] (int&& j) { i += j; };
+ auto func2 = [&] (const int& j) { i += j; };
+ auto func3 = [&] () { i += 1; };
+ MediaEventListener listener1 = source.Connect(queue, func1);
+ MediaEventListener listener2 = source.Connect(queue, func2);
+ MediaEventListener listener3 = source.Connect(queue, func3);
+
+ source.Notify(1);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ EXPECT_EQ(i, 3);
+
+ listener1.Disconnect();
+ listener2.Disconnect();
+ listener3.Disconnect();
+}
+
+TEST(MediaEventSource, ListenerType2)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<int> source;
+
+ struct Foo {
+ Foo() : mInt(0) {}
+ void OnNotify1(int&& i) { mInt += i; }
+ void OnNotify2(const int& i) { mInt += i; }
+ void OnNotify3() { mInt += 1; }
+ void OnNotify4(int i) const { mInt += i; }
+ void OnNotify5(int i) volatile { mInt += i; }
+ mutable int mInt;
+ } foo;
+
+ // Test member functions which might be CV qualified.
+ MediaEventListener listener1 = source.Connect(queue, &foo, &Foo::OnNotify1);
+ MediaEventListener listener2 = source.Connect(queue, &foo, &Foo::OnNotify2);
+ MediaEventListener listener3 = source.Connect(queue, &foo, &Foo::OnNotify3);
+ MediaEventListener listener4 = source.Connect(queue, &foo, &Foo::OnNotify4);
+ MediaEventListener listener5 = source.Connect(queue, &foo, &Foo::OnNotify5);
+
+ source.Notify(1);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+
+ EXPECT_EQ(foo.mInt, 5);
+
+ listener1.Disconnect();
+ listener2.Disconnect();
+ listener3.Disconnect();
+ listener4.Disconnect();
+ listener5.Disconnect();
+}
+
+struct SomeEvent {
+ explicit SomeEvent(int& aCount) : mCount(aCount) {}
+ // Increment mCount when copy constructor is called to know how many times
+ // the event data is copied.
+ SomeEvent(const SomeEvent& aOther) : mCount(aOther.mCount) {
+ ++mCount;
+ }
+ int& mCount;
+};
+
+/*
+ * Test we don't have unnecessary copies of the event data.
+ */
+TEST(MediaEventSource, CopyEvent1)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<SomeEvent> source;
+ int i = 0;
+
+ auto func = [] (SomeEvent&& aEvent) {};
+ struct Foo {
+ void OnNotify(SomeEvent&& aEvent) {}
+ } foo;
+
+ MediaEventListener listener1 = source.Connect(queue, func);
+ MediaEventListener listener2 = source.Connect(queue, &foo, &Foo::OnNotify);
+
+ // We expect i to be 2 since SomeEvent should be copied only once when
+ // passing to each listener.
+ source.Notify(SomeEvent(i));
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+ EXPECT_EQ(i, 2);
+ listener1.Disconnect();
+ listener2.Disconnect();
+}
+
+TEST(MediaEventSource, CopyEvent2)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducer<SomeEvent> source;
+ int i = 0;
+
+ auto func = [] () {};
+ struct Foo {
+ void OnNotify() {}
+ } foo;
+
+ MediaEventListener listener1 = source.Connect(queue, func);
+ MediaEventListener listener2 = source.Connect(queue, &foo, &Foo::OnNotify);
+
+ // SomeEvent won't be copied at all since the listeners take no arguments.
+ source.Notify(SomeEvent(i));
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+ EXPECT_EQ(i, 0);
+ listener1.Disconnect();
+ listener2.Disconnect();
+}
+
+/*
+ * Test move-only types.
+ */
+TEST(MediaEventSource, MoveOnly)
+{
+ RefPtr<TaskQueue> queue = new TaskQueue(
+ GetMediaThreadPool(MediaThreadType::PLAYBACK));
+
+ MediaEventProducerExc<UniquePtr<int>> source;
+
+ auto func = [] (UniquePtr<int>&& aEvent) {
+ EXPECT_EQ(*aEvent, 20);
+ };
+ MediaEventListener listener = source.Connect(queue, func);
+
+ // It is OK to pass an rvalue which is move-only.
+ source.Notify(UniquePtr<int>(new int(20)));
+ // It is an error to pass an lvalue which is move-only.
+ // UniquePtr<int> event(new int(30));
+ // source.Notify(event);
+
+ queue->BeginShutdown();
+ queue->AwaitShutdownAndIdle();
+ listener.Disconnect();
+}
diff --git a/dom/media/gtest/TestMediaFormatReader.cpp b/dom/media/gtest/TestMediaFormatReader.cpp
new file mode 100644
index 000000000..ad222e8b8
--- /dev/null
+++ b/dom/media/gtest/TestMediaFormatReader.cpp
@@ -0,0 +1,248 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/TaskQueue.h"
+#include "ImageContainer.h"
+#include "Layers.h"
+#include "MediaData.h"
+#include "MediaFormatReader.h"
+#include "MP4Decoder.h"
+#include "MockMediaDecoderOwner.h"
+#include "MockMediaResource.h"
+#include "VideoFrameContainer.h"
+
+using namespace mozilla;
+using namespace mozilla::dom;
+
+class MockMP4Decoder : public MP4Decoder
+{
+public:
+ MockMP4Decoder()
+ : MP4Decoder(new MockMediaDecoderOwner())
+ {}
+
+ // Avoid the assertion.
+ AbstractCanonical<media::NullableTimeUnit>* CanonicalDurationOrNull() override
+ {
+ return nullptr;
+ }
+};
+
+class MediaFormatReaderBinding
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaFormatReaderBinding);
+ RefPtr<MockMP4Decoder> mDecoder;
+ RefPtr<MockMediaResource> mResource;
+ RefPtr<MediaDecoderReader> mReader;
+ RefPtr<TaskQueue> mTaskQueue;
+ explicit MediaFormatReaderBinding(const char* aFileName = "gizmo.mp4")
+ : mDecoder(new MockMP4Decoder())
+ , mResource(new MockMediaResource(aFileName))
+ , mReader(new MediaFormatReader(mDecoder,
+ new MP4Demuxer(mResource),
+ new VideoFrameContainer(
+ (HTMLMediaElement*)(0x1),
+ layers::LayerManager::CreateImageContainer(
+ layers::ImageContainer::ASYNCHRONOUS))
+ ))
+ , mTaskQueue(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK)))
+ {
+ }
+
+ bool Init() {
+ // Init Resource.
+ nsresult rv = mResource->Open(nullptr);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+ mDecoder->SetResource(mResource);
+ // Init Reader.
+ rv = mReader->Init();
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+ return true;
+ }
+
+ void OnMetadataReadAudio(MetadataHolder* aMetadata)
+ {
+ EXPECT_TRUE(aMetadata);
+ mReader->RequestAudioData()
+ ->Then(mReader->OwnerThread(), __func__, this,
+ &MediaFormatReaderBinding::OnAudioRawDataDemuxed,
+ &MediaFormatReaderBinding::OnNotDemuxed);
+ }
+
+ void OnMetadataReadVideo(MetadataHolder* aMetadata)
+ {
+ EXPECT_TRUE(aMetadata);
+ mReader->RequestVideoData(true, 0)
+ ->Then(mReader->OwnerThread(), __func__, this,
+ &MediaFormatReaderBinding::OnVideoRawDataDemuxed,
+ &MediaFormatReaderBinding::OnNotDemuxed);
+ }
+
+ void OnMetadataNotRead(const MediaResult& aError) {
+ EXPECT_TRUE(false);
+ ReaderShutdown();
+ }
+
+ void OnAudioRawDataDemuxed(MediaData* aAudioSample)
+ {
+ EXPECT_TRUE(aAudioSample);
+ EXPECT_EQ(MediaData::RAW_DATA, aAudioSample->mType);
+ ReaderShutdown();
+ }
+
+ void OnVideoRawDataDemuxed(MediaData* aVideoSample)
+ {
+ EXPECT_TRUE(aVideoSample);
+ EXPECT_EQ(MediaData::RAW_DATA, aVideoSample->mType);
+ ReaderShutdown();
+ }
+
+ void OnNotDemuxed(const MediaResult& aReason)
+ {
+ EXPECT_TRUE(false);
+ ReaderShutdown();
+ }
+
+ void ReaderShutdown()
+ {
+ RefPtr<MediaFormatReaderBinding> self = this;
+ mReader->Shutdown()
+ ->Then(mTaskQueue, __func__,
+ [self]() {
+ self->mTaskQueue->BeginShutdown();
+ },
+ [self]() {
+ EXPECT_TRUE(false);
+ self->mTaskQueue->BeginShutdown();
+ }); //Then
+ }
+ template<class Function>
+ void RunTestAndWait(Function&& aFunction)
+ {
+ RefPtr<Runnable> r = NS_NewRunnableFunction(Forward<Function>(aFunction));
+ mTaskQueue->Dispatch(r.forget());
+ mTaskQueue->AwaitShutdownAndIdle();
+ }
+private:
+ ~MediaFormatReaderBinding()
+ {
+ mDecoder->Shutdown();
+ }
+};
+
+
+template <typename T>
+T GetPref(const char* aPrefKey);
+
+template <>
+bool GetPref<bool>(const char* aPrefKey)
+{
+ return Preferences::GetBool(aPrefKey);
+}
+
+template <typename T>
+void SetPref(const char* a, T value);
+
+template <>
+void SetPref<bool>(const char* aPrefKey, bool aValue)
+{
+ Unused << Preferences::SetBool(aPrefKey, aValue);
+}
+
+template <typename T>
+class PreferencesRAII
+{
+public:
+ explicit PreferencesRAII(const char* aPrefKey, T aValue)
+ : mPrefKey(aPrefKey)
+ {
+ mDefaultPref = GetPref<T>(aPrefKey);
+ SetPref(aPrefKey, aValue);
+ }
+ ~PreferencesRAII()
+ {
+ SetPref(mPrefKey, mDefaultPref);
+ }
+private:
+ T mDefaultPref;
+ const char* mPrefKey;
+};
+
+TEST(MediaFormatReader, RequestAudioRawData)
+{
+ PreferencesRAII<bool> pref =
+ PreferencesRAII<bool>("media.use-blank-decoder",
+ true);
+ RefPtr<MediaFormatReaderBinding> b = new MediaFormatReaderBinding();
+ if (!b->Init())
+ {
+ EXPECT_TRUE(false);
+ // Stop the test since initialization failed.
+ return;
+ }
+ if (!b->mReader->IsDemuxOnlySupported())
+ {
+ EXPECT_TRUE(false);
+ // Stop the test since the reader cannot support demuxed-only demand.
+ return;
+ }
+ // Switch to demuxed-only mode.
+ b->mReader->SetDemuxOnly(true);
+ // To ensure the MediaDecoderReader::InitializationTask and
+ // MediaDecoderReader::SetDemuxOnly can be done.
+ NS_ProcessNextEvent();
+ auto testCase = [b]() {
+ InvokeAsync(b->mReader->OwnerThread(),
+ b->mReader.get(),
+ __func__,
+ &MediaDecoderReader::AsyncReadMetadata)
+ ->Then(b->mReader->OwnerThread(), __func__, b.get(),
+ &MediaFormatReaderBinding::OnMetadataReadAudio,
+ &MediaFormatReaderBinding::OnMetadataNotRead);
+ };
+ b->RunTestAndWait(testCase);
+}
+TEST(MediaFormatReader, RequestVideoRawData)
+{
+ PreferencesRAII<bool> pref =
+ PreferencesRAII<bool>("media.use-blank-decoder",
+ true);
+ RefPtr<MediaFormatReaderBinding> b = new MediaFormatReaderBinding();
+ if (!b->Init())
+ {
+ EXPECT_TRUE(false);
+ // Stop the test since initialization failed.
+ return;
+ }
+ if (!b->mReader->IsDemuxOnlySupported())
+ {
+ EXPECT_TRUE(false);
+ // Stop the test since the reader cannot support demuxed-only demand.
+ return;
+ }
+ // Switch to demuxed-only mode.
+ b->mReader->SetDemuxOnly(true);
+ // To ensure the MediaDecoderReader::InitializationTask and
+ // MediaDecoderReader::SetDemuxOnly can be done.
+ NS_ProcessNextEvent();
+ auto testCase = [b]() {
+ InvokeAsync(b->mReader->OwnerThread(),
+ b->mReader.get(),
+ __func__,
+ &MediaDecoderReader::AsyncReadMetadata)
+ ->Then(b->mReader->OwnerThread(), __func__, b.get(),
+ &MediaFormatReaderBinding::OnMetadataReadVideo,
+ &MediaFormatReaderBinding::OnMetadataNotRead);
+ };
+ b->RunTestAndWait(testCase);
+}
diff --git a/dom/media/gtest/TestMozPromise.cpp b/dom/media/gtest/TestMozPromise.cpp
new file mode 100644
index 000000000..b1d363bd5
--- /dev/null
+++ b/dom/media/gtest/TestMozPromise.cpp
@@ -0,0 +1,257 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/TaskQueue.h"
+#include "mozilla/MozPromise.h"
+
+#include "nsISupportsImpl.h"
+#include "mozilla/SharedThreadPool.h"
+#include "VideoUtils.h"
+
+using namespace mozilla;
+
+typedef MozPromise<int, double, false> TestPromise;
+typedef TestPromise::ResolveOrRejectValue RRValue;
+
+class MOZ_STACK_CLASS AutoTaskQueue
+{
+public:
+ AutoTaskQueue()
+ : mTaskQueue(new TaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK)))
+ {}
+
+ ~AutoTaskQueue()
+ {
+ mTaskQueue->AwaitShutdownAndIdle();
+ }
+
+ TaskQueue* Queue() { return mTaskQueue; }
+private:
+ RefPtr<TaskQueue> mTaskQueue;
+};
+
+class DelayedResolveOrReject : public Runnable
+{
+public:
+ DelayedResolveOrReject(TaskQueue* aTaskQueue,
+ TestPromise::Private* aPromise,
+ TestPromise::ResolveOrRejectValue aValue,
+ int aIterations)
+ : mTaskQueue(aTaskQueue)
+ , mPromise(aPromise)
+ , mValue(aValue)
+ , mIterations(aIterations)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (!mPromise) {
+ // Canceled.
+ return NS_OK;
+ }
+
+ if (--mIterations == 0) {
+ mPromise->ResolveOrReject(mValue, __func__);
+ } else {
+ nsCOMPtr<nsIRunnable> r = this;
+ mTaskQueue->Dispatch(r.forget());
+ }
+
+ return NS_OK;
+ }
+
+ void Cancel() {
+ mPromise = nullptr;
+ }
+
+protected:
+ ~DelayedResolveOrReject() {}
+
+private:
+ RefPtr<TaskQueue> mTaskQueue;
+ RefPtr<TestPromise::Private> mPromise;
+ TestPromise::ResolveOrRejectValue mValue;
+ int mIterations;
+};
+
+template<typename FunctionType>
+void
+RunOnTaskQueue(TaskQueue* aQueue, FunctionType aFun)
+{
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(aFun);
+ aQueue->Dispatch(r.forget());
+}
+
+// std::function can't come soon enough. :-(
+#define DO_FAIL []()->void { EXPECT_TRUE(false); }
+
+TEST(MozPromise, BasicResolve)
+{
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ RunOnTaskQueue(queue, [queue] () -> void {
+ TestPromise::CreateAndResolve(42, __func__)->Then(queue, __func__,
+ [queue] (int aResolveValue) -> void { EXPECT_EQ(aResolveValue, 42); queue->BeginShutdown(); },
+ DO_FAIL);
+ });
+}
+
+TEST(MozPromise, BasicReject)
+{
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ RunOnTaskQueue(queue, [queue] () -> void {
+ TestPromise::CreateAndReject(42.0, __func__)->Then(queue, __func__,
+ DO_FAIL,
+ [queue] (int aRejectValue) -> void { EXPECT_EQ(aRejectValue, 42.0); queue->BeginShutdown(); });
+ });
+}
+
+TEST(MozPromise, AsyncResolve)
+{
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ RunOnTaskQueue(queue, [queue] () -> void {
+ RefPtr<TestPromise::Private> p = new TestPromise::Private(__func__);
+
+ // Kick off three racing tasks, and make sure we get the one that finishes earliest.
+ RefPtr<DelayedResolveOrReject> a = new DelayedResolveOrReject(queue, p, RRValue::MakeResolve(32), 10);
+ RefPtr<DelayedResolveOrReject> b = new DelayedResolveOrReject(queue, p, RRValue::MakeResolve(42), 5);
+ RefPtr<DelayedResolveOrReject> c = new DelayedResolveOrReject(queue, p, RRValue::MakeReject(32.0), 7);
+
+ nsCOMPtr<nsIRunnable> ref = a.get();
+ queue->Dispatch(ref.forget());
+ ref = b.get();
+ queue->Dispatch(ref.forget());
+ ref = c.get();
+ queue->Dispatch(ref.forget());
+
+ p->Then(queue, __func__, [queue, a, b, c] (int aResolveValue) -> void {
+ EXPECT_EQ(aResolveValue, 42);
+ a->Cancel();
+ b->Cancel();
+ c->Cancel();
+ queue->BeginShutdown();
+ }, DO_FAIL);
+ });
+}
+
+TEST(MozPromise, CompletionPromises)
+{
+ bool invokedPass = false;
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ RunOnTaskQueue(queue, [queue, &invokedPass] () -> void {
+ TestPromise::CreateAndResolve(40, __func__)
+ ->Then(queue, __func__,
+ [] (int aVal) -> RefPtr<TestPromise> { return TestPromise::CreateAndResolve(aVal + 10, __func__); },
+ DO_FAIL)
+ ->CompletionPromise()
+ ->Then(queue, __func__, [&invokedPass] () -> void { invokedPass = true; }, DO_FAIL)
+ ->CompletionPromise()
+ ->Then(queue, __func__,
+ [queue] (int aVal) -> RefPtr<TestPromise> {
+ RefPtr<TestPromise::Private> p = new TestPromise::Private(__func__);
+ nsCOMPtr<nsIRunnable> resolver = new DelayedResolveOrReject(queue, p, RRValue::MakeResolve(aVal - 8), 10);
+ queue->Dispatch(resolver.forget());
+ return RefPtr<TestPromise>(p);
+ },
+ DO_FAIL)
+ ->CompletionPromise()
+ ->Then(queue, __func__,
+ [queue] (int aVal) -> RefPtr<TestPromise> { return TestPromise::CreateAndReject(double(aVal - 42) + 42.0, __func__); },
+ DO_FAIL)
+ ->CompletionPromise()
+ ->Then(queue, __func__,
+ DO_FAIL,
+ [queue, &invokedPass] (double aVal) -> void { EXPECT_EQ(aVal, 42.0); EXPECT_TRUE(invokedPass); queue->BeginShutdown(); });
+ });
+}
+
+TEST(MozPromise, PromiseAllResolve)
+{
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ RunOnTaskQueue(queue, [queue] () -> void {
+
+ nsTArray<RefPtr<TestPromise>> promises;
+ promises.AppendElement(TestPromise::CreateAndResolve(22, __func__));
+ promises.AppendElement(TestPromise::CreateAndResolve(32, __func__));
+ promises.AppendElement(TestPromise::CreateAndResolve(42, __func__));
+
+ TestPromise::All(queue, promises)->Then(queue, __func__,
+ [queue] (const nsTArray<int>& aResolveValues) -> void {
+ EXPECT_EQ(aResolveValues.Length(), 3UL);
+ EXPECT_EQ(aResolveValues[0], 22);
+ EXPECT_EQ(aResolveValues[1], 32);
+ EXPECT_EQ(aResolveValues[2], 42);
+ queue->BeginShutdown();
+ },
+ DO_FAIL
+ );
+ });
+}
+
+TEST(MozPromise, PromiseAllReject)
+{
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ RunOnTaskQueue(queue, [queue] () -> void {
+
+ nsTArray<RefPtr<TestPromise>> promises;
+ promises.AppendElement(TestPromise::CreateAndResolve(22, __func__));
+ promises.AppendElement(TestPromise::CreateAndReject(32.0, __func__));
+ promises.AppendElement(TestPromise::CreateAndResolve(42, __func__));
+ // Ensure that more than one rejection doesn't cause a crash (bug #1207312)
+ promises.AppendElement(TestPromise::CreateAndReject(52.0, __func__));
+
+ TestPromise::All(queue, promises)->Then(queue, __func__,
+ DO_FAIL,
+ [queue] (float aRejectValue) -> void {
+ EXPECT_EQ(aRejectValue, 32.0);
+ queue->BeginShutdown();
+ }
+ );
+ });
+}
+
+// Test we don't hit the assertions in MozPromise when exercising promise
+// chaining upon task queue shutdown.
+TEST(MozPromise, Chaining)
+{
+ AutoTaskQueue atq;
+ RefPtr<TaskQueue> queue = atq.Queue();
+ MozPromiseRequestHolder<TestPromise> holder;
+
+ RunOnTaskQueue(queue, [queue, &holder] () {
+ auto p = TestPromise::CreateAndResolve(42, __func__);
+ const size_t kIterations = 100;
+ for (size_t i = 0; i < kIterations; ++i) {
+ p = p->Then(queue, __func__,
+ [] (int aVal) {
+ EXPECT_EQ(aVal, 42);
+ },
+ [] () {}
+ )->CompletionPromise();
+
+ if (i == kIterations / 2) {
+ p->Then(queue, __func__,
+ [queue, &holder] () {
+ holder.Disconnect();
+ queue->BeginShutdown();
+ },
+ DO_FAIL);
+ }
+ }
+ // We will hit the assertion if we don't disconnect the leaf Request
+ // in the promise chain.
+ holder.Begin(p->Then(queue, __func__, [] () {}, [] () {}));
+ });
+}
+
+#undef DO_FAIL
diff --git a/dom/media/gtest/TestRust.cpp b/dom/media/gtest/TestRust.cpp
new file mode 100644
index 000000000..86d0e99b8
--- /dev/null
+++ b/dom/media/gtest/TestRust.cpp
@@ -0,0 +1,9 @@
+#include <stdint.h>
+#include "gtest/gtest.h"
+
+extern "C" uint8_t* test_rust();
+
+TEST(rust, CallFromCpp) {
+ auto greeting = test_rust();
+ EXPECT_STREQ(reinterpret_cast<char*>(greeting), "hello from rust.");
+}
diff --git a/dom/media/gtest/TestTimeUnit.cpp b/dom/media/gtest/TestTimeUnit.cpp
new file mode 100644
index 000000000..605e0e90c
--- /dev/null
+++ b/dom/media/gtest/TestTimeUnit.cpp
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "TimeUnits.h"
+#include <algorithm>
+#include <vector>
+
+using namespace mozilla;
+
+TEST(TimeUnit, Rounding)
+{
+ int64_t usecs = 66261715;
+ double seconds = media::TimeUnit::FromMicroseconds(usecs).ToSeconds();
+ EXPECT_EQ(media::TimeUnit::FromSeconds(seconds).ToMicroseconds(), usecs);
+
+ seconds = 4.169470;
+ usecs = 4169470;
+ EXPECT_EQ(media::TimeUnit::FromSeconds(seconds).ToMicroseconds(), usecs);
+}
diff --git a/dom/media/gtest/TestTrackEncoder.cpp b/dom/media/gtest/TestTrackEncoder.cpp
new file mode 100644
index 000000000..01d5c86e9
--- /dev/null
+++ b/dom/media/gtest/TestTrackEncoder.cpp
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "OpusTrackEncoder.h"
+
+using namespace mozilla;
+
+class TestOpusTrackEncoder : public OpusTrackEncoder
+{
+public:
+ // Return true if it has successfully initialized the Opus encoder.
+ bool TestOpusCreation(int aChannels, int aSamplingRate)
+ {
+ if (Init(aChannels, aSamplingRate) == NS_OK) {
+ if (GetPacketDuration()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Return the sample rate of data to be fed to the Opus encoder, could be
+ // re-sampled if it was not one of the Opus supported sampling rates.
+ // Init() is expected to be called first.
+ int TestGetOutputSampleRate()
+ {
+ return mInitialized ? GetOutputSampleRate() : 0;
+ }
+};
+
+static bool
+TestOpusInit(int aChannels, int aSamplingRate)
+{
+ TestOpusTrackEncoder encoder;
+ return encoder.TestOpusCreation(aChannels, aSamplingRate);
+}
+
+static int
+TestOpusResampler(int aChannels, int aSamplingRate)
+{
+ TestOpusTrackEncoder encoder;
+ EXPECT_TRUE(encoder.TestOpusCreation(aChannels, aSamplingRate));
+ return encoder.TestGetOutputSampleRate();
+}
+
+TEST(Media, OpusEncoder_Init)
+{
+ // Expect false with 0 or negative channels of input signal.
+ EXPECT_FALSE(TestOpusInit(0, 16000));
+ EXPECT_FALSE(TestOpusInit(-1, 16000));
+
+ // The Opus format supports up to 8 channels, and supports multitrack audio up
+ // to 255 channels, but the current implementation supports only mono and
+ // stereo, and downmixes any more than that.
+ // Expect false with channels of input signal exceed the max supported number.
+ EXPECT_FALSE(TestOpusInit(8 + 1, 16000));
+
+ // Should accept channels within valid range.
+ for (int i = 1; i <= 8; i++) {
+ EXPECT_TRUE(TestOpusInit(i, 16000));
+ }
+
+ // Expect false with 0 or negative sampling rate of input signal.
+ EXPECT_FALSE(TestOpusInit(1, 0));
+ EXPECT_FALSE(TestOpusInit(1, -1));
+
+ // Verify sample rate bounds checking.
+ EXPECT_FALSE(TestOpusInit(2, 2000));
+ EXPECT_FALSE(TestOpusInit(2, 4000));
+ EXPECT_FALSE(TestOpusInit(2, 7999));
+ EXPECT_TRUE(TestOpusInit(2, 8000));
+ EXPECT_TRUE(TestOpusInit(2, 192000));
+ EXPECT_FALSE(TestOpusInit(2, 192001));
+ EXPECT_FALSE(TestOpusInit(2, 200000));
+}
+
+TEST(Media, OpusEncoder_Resample)
+{
+ // Sampling rates of data to be fed to Opus encoder, should remain unchanged
+ // if it is one of Opus supported rates (8000, 12000, 16000, 24000 and 48000
+ // (kHz)) at initialization.
+ EXPECT_TRUE(TestOpusResampler(1, 8000) == 8000);
+ EXPECT_TRUE(TestOpusResampler(1, 12000) == 12000);
+ EXPECT_TRUE(TestOpusResampler(1, 16000) == 16000);
+ EXPECT_TRUE(TestOpusResampler(1, 24000) == 24000);
+ EXPECT_TRUE(TestOpusResampler(1, 48000) == 48000);
+
+ // Otherwise, it should be resampled to 48kHz by resampler.
+ EXPECT_FALSE(TestOpusResampler(1, 9600) == 9600);
+ EXPECT_FALSE(TestOpusResampler(1, 44100) == 44100);
+}
diff --git a/dom/media/gtest/TestVPXDecoding.cpp b/dom/media/gtest/TestVPXDecoding.cpp
new file mode 100644
index 000000000..d14c4d24e
--- /dev/null
+++ b/dom/media/gtest/TestVPXDecoding.cpp
@@ -0,0 +1,103 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "mozilla/ArrayUtils.h"
+#include "nsTArray.h"
+#include "VPXDecoder.h"
+
+#include <stdio.h>
+
+using namespace mozilla;
+
+static void
+ReadVPXFile(const char* aPath, nsTArray<uint8_t>& aBuffer)
+{
+ FILE* f = fopen(aPath, "rb");
+ ASSERT_NE(f, (FILE *) nullptr);
+
+ int r = fseek(f, 0, SEEK_END);
+ ASSERT_EQ(r, 0);
+
+ long size = ftell(f);
+ ASSERT_NE(size, -1);
+ aBuffer.SetLength(size);
+
+ r = fseek(f, 0, SEEK_SET);
+ ASSERT_EQ(r, 0);
+
+ size_t got = fread(aBuffer.Elements(), 1, size, f);
+ ASSERT_EQ(got, size_t(size));
+
+ r = fclose(f);
+ ASSERT_EQ(r, 0);
+}
+
+static
+vpx_codec_iface_t*
+ParseIVFConfig(nsTArray<uint8_t>& data, vpx_codec_dec_cfg_t& config)
+{
+ if (data.Length() < 32 + 12) {
+ // Not enough data for file & first frame headers.
+ return nullptr;
+ }
+ if (data[0] != 'D' || data[1] != 'K' || data[2] != 'I' || data[3] != 'F') {
+ // Expect 'DKIP'
+ return nullptr;
+ }
+ if (data[4] != 0 || data[5] != 0) {
+ // Expect version==0.
+ return nullptr;
+ }
+ if (data[8] != 'V' || data[9] != 'P'
+ || (data[10] != '8' && data[10] != '9')
+ || data[11] != '0') {
+ // Expect 'VP80' or 'VP90'.
+ return nullptr;
+ }
+ config.w = uint32_t(data[12]) || (uint32_t(data[13]) << 8);
+ config.h = uint32_t(data[14]) || (uint32_t(data[15]) << 8);
+ vpx_codec_iface_t* codec = (data[10] == '8')
+ ? vpx_codec_vp8_dx()
+ : vpx_codec_vp9_dx();
+ // Remove headers, to just leave raw VPx data to be decoded.
+ data.RemoveElementsAt(0, 32 + 12);
+ return codec;
+}
+
+struct TestFileData {
+ const char* mFilename;
+ vpx_codec_err_t mDecodeResult;
+};
+static const TestFileData testFiles[] = {
+ { "test_case_1224361.vp8.ivf", VPX_CODEC_OK },
+ { "test_case_1224363.vp8.ivf", VPX_CODEC_CORRUPT_FRAME },
+ { "test_case_1224369.vp8.ivf", VPX_CODEC_CORRUPT_FRAME }
+};
+
+TEST(libvpx, test_cases)
+{
+ for (size_t test = 0; test < ArrayLength(testFiles); ++test) {
+ nsTArray<uint8_t> data;
+ ReadVPXFile(testFiles[test].mFilename, data);
+ ASSERT_GT(data.Length(), 0u);
+
+ vpx_codec_dec_cfg_t config;
+ vpx_codec_iface_t* dx = ParseIVFConfig(data, config);
+ ASSERT_TRUE(dx);
+ config.threads = 2;
+
+ vpx_codec_ctx_t ctx;
+ PodZero(&ctx);
+ vpx_codec_err_t r = vpx_codec_dec_init(&ctx, dx, &config, 0);
+ ASSERT_EQ(VPX_CODEC_OK, r);
+
+ r = vpx_codec_decode(&ctx, data.Elements(), data.Length(), nullptr, 0);
+ // This test case is known to be corrupt.
+ EXPECT_EQ(testFiles[test].mDecodeResult, r);
+
+ r = vpx_codec_destroy(&ctx);
+ EXPECT_EQ(VPX_CODEC_OK, r);
+ }
+}
diff --git a/dom/media/gtest/TestVideoSegment.cpp b/dom/media/gtest/TestVideoSegment.cpp
new file mode 100644
index 000000000..f7d5aed21
--- /dev/null
+++ b/dom/media/gtest/TestVideoSegment.cpp
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "VideoSegment.h"
+
+using namespace mozilla;
+
+namespace mozilla {
+ namespace layer {
+ class Image;
+ } // namespace layer
+} // namespace mozilla
+
+TEST(VideoSegment, TestAppendFrameForceBlack)
+{
+ RefPtr<layers::Image> testImage = nullptr;
+
+ VideoSegment segment;
+ segment.AppendFrame(testImage.forget(),
+ mozilla::StreamTime(90000),
+ mozilla::gfx::IntSize(640, 480),
+ PRINCIPAL_HANDLE_NONE,
+ true);
+
+ VideoSegment::ChunkIterator iter(segment);
+ while (!iter.IsEnded()) {
+ VideoChunk chunk = *iter;
+ EXPECT_TRUE(chunk.mFrame.GetForceBlack());
+ iter.Next();
+ }
+}
+
+TEST(VideoSegment, TestAppendFrameNotForceBlack)
+{
+ RefPtr<layers::Image> testImage = nullptr;
+
+ VideoSegment segment;
+ segment.AppendFrame(testImage.forget(),
+ mozilla::StreamTime(90000),
+ mozilla::gfx::IntSize(640, 480),
+ PRINCIPAL_HANDLE_NONE);
+
+ VideoSegment::ChunkIterator iter(segment);
+ while (!iter.IsEnded()) {
+ VideoChunk chunk = *iter;
+ EXPECT_FALSE(chunk.mFrame.GetForceBlack());
+ iter.Next();
+ }
+}
diff --git a/dom/media/gtest/TestVideoTrackEncoder.cpp b/dom/media/gtest/TestVideoTrackEncoder.cpp
new file mode 100644
index 000000000..65826c9b4
--- /dev/null
+++ b/dom/media/gtest/TestVideoTrackEncoder.cpp
@@ -0,0 +1,351 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include <algorithm>
+
+#include "mozilla/ArrayUtils.h"
+#include "VP8TrackEncoder.h"
+#include "ImageContainer.h"
+#include "MediaStreamGraph.h"
+#include "MediaStreamListener.h"
+#include "WebMWriter.h" // TODO: it's weird to include muxer header to get the class definition of VP8 METADATA
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+
+using namespace mozilla::layers;
+using namespace mozilla;
+
+// A helper object to generate of different YUV planes.
+class YUVBufferGenerator {
+public:
+ YUVBufferGenerator() {}
+
+ void Init(const mozilla::gfx::IntSize &aSize)
+ {
+ mImageSize = aSize;
+
+ int yPlaneLen = aSize.width * aSize.height;
+ int cbcrPlaneLen = (yPlaneLen + 1) / 2;
+ int frameLen = yPlaneLen + cbcrPlaneLen;
+
+ // Generate source buffer.
+ mSourceBuffer.SetLength(frameLen);
+
+ // Fill Y plane.
+ memset(mSourceBuffer.Elements(), 0x10, yPlaneLen);
+
+ // Fill Cb/Cr planes.
+ memset(mSourceBuffer.Elements() + yPlaneLen, 0x80, cbcrPlaneLen);
+ }
+
+ mozilla::gfx::IntSize GetSize() const
+ {
+ return mImageSize;
+ }
+
+ void Generate(nsTArray<RefPtr<Image> > &aImages)
+ {
+ aImages.AppendElement(CreateI420Image());
+ aImages.AppendElement(CreateNV12Image());
+ aImages.AppendElement(CreateNV21Image());
+ }
+
+private:
+ Image *CreateI420Image()
+ {
+ PlanarYCbCrImage *image = new RecyclingPlanarYCbCrImage(new BufferRecycleBin());
+ PlanarYCbCrData data;
+ data.mPicSize = mImageSize;
+
+ const uint32_t yPlaneSize = mImageSize.width * mImageSize.height;
+ const uint32_t halfWidth = (mImageSize.width + 1) / 2;
+ const uint32_t halfHeight = (mImageSize.height + 1) / 2;
+ const uint32_t uvPlaneSize = halfWidth * halfHeight;
+
+ // Y plane.
+ uint8_t *y = mSourceBuffer.Elements();
+ data.mYChannel = y;
+ data.mYSize.width = mImageSize.width;
+ data.mYSize.height = mImageSize.height;
+ data.mYStride = mImageSize.width;
+ data.mYSkip = 0;
+
+ // Cr plane.
+ uint8_t *cr = y + yPlaneSize + uvPlaneSize;
+ data.mCrChannel = cr;
+ data.mCrSkip = 0;
+
+ // Cb plane
+ uint8_t *cb = y + yPlaneSize;
+ data.mCbChannel = cb;
+ data.mCbSkip = 0;
+
+ // CrCb plane vectors.
+ data.mCbCrStride = halfWidth;
+ data.mCbCrSize.width = halfWidth;
+ data.mCbCrSize.height = halfHeight;
+
+ image->CopyData(data);
+ return image;
+ }
+
+ Image *CreateNV12Image()
+ {
+ PlanarYCbCrImage *image = new RecyclingPlanarYCbCrImage(new BufferRecycleBin());
+ PlanarYCbCrData data;
+ data.mPicSize = mImageSize;
+
+ const uint32_t yPlaneSize = mImageSize.width * mImageSize.height;
+ const uint32_t halfWidth = (mImageSize.width + 1) / 2;
+ const uint32_t halfHeight = (mImageSize.height + 1) / 2;
+
+ // Y plane.
+ uint8_t *y = mSourceBuffer.Elements();
+ data.mYChannel = y;
+ data.mYSize.width = mImageSize.width;
+ data.mYSize.height = mImageSize.height;
+ data.mYStride = mImageSize.width;
+ data.mYSkip = 0;
+
+ // Cr plane.
+ uint8_t *cr = y + yPlaneSize;
+ data.mCrChannel = cr;
+ data.mCrSkip = 1;
+
+ // Cb plane
+ uint8_t *cb = y + yPlaneSize + 1;
+ data.mCbChannel = cb;
+ data.mCbSkip = 1;
+
+ // 4:2:0.
+ data.mCbCrStride = mImageSize.width;
+ data.mCbCrSize.width = halfWidth;
+ data.mCbCrSize.height = halfHeight;
+
+ image->CopyData(data);
+ return image;
+ }
+
+ Image *CreateNV21Image()
+ {
+ PlanarYCbCrImage *image = new RecyclingPlanarYCbCrImage(new BufferRecycleBin());
+ PlanarYCbCrData data;
+ data.mPicSize = mImageSize;
+
+ const uint32_t yPlaneSize = mImageSize.width * mImageSize.height;
+ const uint32_t halfWidth = (mImageSize.width + 1) / 2;
+ const uint32_t halfHeight = (mImageSize.height + 1) / 2;
+
+ // Y plane.
+ uint8_t *y = mSourceBuffer.Elements();
+ data.mYChannel = y;
+ data.mYSize.width = mImageSize.width;
+ data.mYSize.height = mImageSize.height;
+ data.mYStride = mImageSize.width;
+ data.mYSkip = 0;
+
+ // Cr plane.
+ uint8_t *cr = y + yPlaneSize + 1;
+ data.mCrChannel = cr;
+ data.mCrSkip = 1;
+
+ // Cb plane
+ uint8_t *cb = y + yPlaneSize;
+ data.mCbChannel = cb;
+ data.mCbSkip = 1;
+
+ // 4:2:0.
+ data.mCbCrStride = mImageSize.width;
+ data.mCbCrSize.width = halfWidth;
+ data.mCbCrSize.height = halfHeight;
+
+ image->CopyData(data);
+ return image;
+ }
+
+private:
+ mozilla::gfx::IntSize mImageSize;
+ nsTArray<uint8_t> mSourceBuffer;
+};
+
+struct InitParam {
+ bool mShouldSucceed; // This parameter should cause success or fail result
+ int mWidth; // frame width
+ int mHeight; // frame height
+};
+
+class TestVP8TrackEncoder: public VP8TrackEncoder
+{
+public:
+ explicit TestVP8TrackEncoder(TrackRate aTrackRate = 90000)
+ : VP8TrackEncoder(aTrackRate) {}
+
+ ::testing::AssertionResult TestInit(const InitParam &aParam)
+ {
+ nsresult result = Init(aParam.mWidth, aParam.mHeight, aParam.mWidth, aParam.mHeight);
+
+ if (((NS_FAILED(result) && aParam.mShouldSucceed)) || (NS_SUCCEEDED(result) && !aParam.mShouldSucceed))
+ {
+ return ::testing::AssertionFailure()
+ << " width = " << aParam.mWidth
+ << " height = " << aParam.mHeight;
+ }
+ else
+ {
+ return ::testing::AssertionSuccess();
+ }
+ }
+};
+
+// Init test
+TEST(VP8VideoTrackEncoder, Initialization)
+{
+ InitParam params[] = {
+ // Failure cases.
+ { false, 0, 0}, // Height/ width should be larger than 1.
+ { false, 0, 1}, // Height/ width should be larger than 1.
+ { false, 1, 0}, // Height/ width should be larger than 1.
+
+ // Success cases
+ { true, 640, 480}, // Standard VGA
+ { true, 800, 480}, // Standard WVGA
+ { true, 960, 540}, // Standard qHD
+ { true, 1280, 720} // Standard HD
+ };
+
+ for (size_t i = 0; i < ArrayLength(params); i++)
+ {
+ TestVP8TrackEncoder encoder;
+ EXPECT_TRUE(encoder.TestInit(params[i]));
+ }
+}
+
+// Get MetaData test
+TEST(VP8VideoTrackEncoder, FetchMetaData)
+{
+ InitParam params[] = {
+ // Success cases
+ { true, 640, 480}, // Standard VGA
+ { true, 800, 480}, // Standard WVGA
+ { true, 960, 540}, // Standard qHD
+ { true, 1280, 720} // Standard HD
+ };
+
+ for (size_t i = 0; i < ArrayLength(params); i++)
+ {
+ TestVP8TrackEncoder encoder;
+ EXPECT_TRUE(encoder.TestInit(params[i]));
+
+ RefPtr<TrackMetadataBase> meta = encoder.GetMetadata();
+ RefPtr<VP8Metadata> vp8Meta(static_cast<VP8Metadata*>(meta.get()));
+
+ // METADATA should be depend on how to initiate encoder.
+ EXPECT_TRUE(vp8Meta->mWidth == params[i].mWidth);
+ EXPECT_TRUE(vp8Meta->mHeight == params[i].mHeight);
+ }
+}
+
+// Encode test
+TEST(VP8VideoTrackEncoder, FrameEncode)
+{
+ // Initiate VP8 encoder
+ TestVP8TrackEncoder encoder;
+ InitParam param = {true, 640, 480};
+ encoder.TestInit(param);
+
+ // Create YUV images as source.
+ nsTArray<RefPtr<Image>> images;
+ YUVBufferGenerator generator;
+ generator.Init(mozilla::gfx::IntSize(640, 480));
+ generator.Generate(images);
+
+ // Put generated YUV frame into video segment.
+ // Duration of each frame is 1 second.
+ VideoSegment segment;
+ for (nsTArray<RefPtr<Image>>::size_type i = 0; i < images.Length(); i++)
+ {
+ RefPtr<Image> image = images[i];
+ segment.AppendFrame(image.forget(),
+ mozilla::StreamTime(90000),
+ generator.GetSize(),
+ PRINCIPAL_HANDLE_NONE);
+ }
+
+ // track change notification.
+ encoder.SetCurrentFrames(segment);
+
+ // Pull Encoded Data back from encoder.
+ EncodedFrameContainer container;
+ EXPECT_TRUE(NS_SUCCEEDED(encoder.GetEncodedTrack(container)));
+}
+
+// Test encoding a track that has to skip frames.
+TEST(VP8VideoTrackEncoder, SkippedFrames)
+{
+ // Initiate VP8 encoder
+ TestVP8TrackEncoder encoder;
+ InitParam param = {true, 640, 480};
+ encoder.TestInit(param);
+ nsTArray<RefPtr<Image>> images;
+ YUVBufferGenerator generator;
+ generator.Init(mozilla::gfx::IntSize(640, 480));
+ TimeStamp now = TimeStamp::Now();
+ VideoSegment segment;
+
+ while (images.Length() < 100) {
+ generator.Generate(images);
+ }
+
+ // Pass 100 frames of the shortest possible duration where we don't get
+ // rounding errors between input/output rate.
+ for (uint32_t i = 0; i < 100; ++i) {
+ segment.AppendFrame(images[i].forget(),
+ mozilla::StreamTime(90), // 1ms
+ generator.GetSize(),
+ PRINCIPAL_HANDLE_NONE,
+ false,
+ now + TimeDuration::FromMilliseconds(i));
+ }
+
+ encoder.SetCurrentFrames(segment);
+
+ // End the track.
+ segment.Clear();
+ encoder.NotifyQueuedTrackChanges(nullptr, 0, 0, TrackEventCommand::TRACK_EVENT_ENDED, segment);
+
+ EncodedFrameContainer container;
+ ASSERT_TRUE(NS_SUCCEEDED(encoder.GetEncodedTrack(container)));
+
+ EXPECT_TRUE(encoder.IsEncodingComplete());
+
+ // Verify total duration being 100 * 1ms = 100ms in terms of 30fps frame
+ // durations (3 * 1/30s).
+ uint64_t totalDuration = 0;
+ for (auto& frame : container.GetEncodedFrames()) {
+ totalDuration += frame->GetDuration();
+ }
+ const uint64_t threeFrames = (PR_USEC_PER_SEC / 30) * 3;
+ EXPECT_EQ(threeFrames, totalDuration);
+}
+
+// EOS test
+TEST(VP8VideoTrackEncoder, EncodeComplete)
+{
+ // Initiate VP8 encoder
+ TestVP8TrackEncoder encoder;
+ InitParam param = {true, 640, 480};
+ encoder.TestInit(param);
+
+ // track end notification.
+ VideoSegment segment;
+ encoder.NotifyQueuedTrackChanges(nullptr, 0, 0, TrackEventCommand::TRACK_EVENT_ENDED, segment);
+
+ // Pull Encoded Data back from encoder. Since we have sent
+ // EOS to encoder, encoder.GetEncodedTrack should return
+ // NS_OK immidiately.
+ EncodedFrameContainer container;
+ EXPECT_TRUE(NS_SUCCEEDED(encoder.GetEncodedTrack(container)));
+}
diff --git a/dom/media/gtest/TestVideoUtils.cpp b/dom/media/gtest/TestVideoUtils.cpp
new file mode 100644
index 000000000..f803cbb1d
--- /dev/null
+++ b/dom/media/gtest/TestVideoUtils.cpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "nsString.h"
+#include "VideoUtils.h"
+
+using namespace mozilla;
+
+TEST(StringListRange, MakeStringListRange)
+{
+ static const struct
+ {
+ const char* mList;
+ const char* mExpected;
+ } tests[] =
+ {
+ { "", "" },
+ { " ", "" },
+ { ",", "" },
+ { " , ", "" },
+ { "a", "a|" },
+ { " a ", "a|" },
+ { "aa,bb", "aa|bb|" },
+ { " a a , b b ", "a a|b b|" },
+ { " , ,a 1,, ,b 2,", "a 1|b 2|" }
+ };
+
+ for (const auto& test : tests) {
+ nsCString list(test.mList);
+ nsCString out;
+ for (const auto& item : MakeStringListRange(list)) {
+ out += item;
+ out += "|";
+ }
+ EXPECT_STREQ(test.mExpected, out.Data());
+ }
+}
+
+TEST(StringListRange, StringListContains)
+{
+ static const struct
+ {
+ const char* mList;
+ const char* mItemToSearch;
+ bool mExpected;
+ } tests[] =
+ {
+ { "", "", false },
+ { "", "a", false },
+ { " ", "a", false },
+ { ",", "a", false },
+ { " , ", "", false },
+ { " , ", "a", false },
+ { "a", "a", true },
+ { "a", "b", false },
+ { " a ", "a", true },
+ { "aa,bb", "aa", true },
+ { "aa,bb", "bb", true },
+ { "aa,bb", "cc", false },
+ { "aa,bb", " aa ", false },
+ { " a a , b b ", "a a", true },
+ { " , ,a 1,, ,b 2,", "a 1", true },
+ { " , ,a 1,, ,b 2,", "b 2", true },
+ { " , ,a 1,, ,b 2,", "", false },
+ { " , ,a 1,, ,b 2,", " ", false },
+ { " , ,a 1,, ,b 2,", "A 1", false },
+ { " , ,A 1,, ,b 2,", "a 1", false }
+ };
+
+ for (const auto& test : tests) {
+ nsCString list(test.mList);
+ nsCString itemToSearch(test.mItemToSearch);
+ EXPECT_EQ(test.mExpected, StringListContains(list, itemToSearch))
+ << "trying to find \"" << itemToSearch.Data()
+ << "\" in \"" << list.Data() << "\"";
+ }
+}
diff --git a/dom/media/gtest/TestWebMBuffered.cpp b/dom/media/gtest/TestWebMBuffered.cpp
new file mode 100644
index 000000000..4572c5767
--- /dev/null
+++ b/dom/media/gtest/TestWebMBuffered.cpp
@@ -0,0 +1,119 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "mozilla/ArrayUtils.h"
+#include <stdio.h>
+#include "nsTArray.h"
+#include "WebMBufferedParser.h"
+
+using namespace mozilla;
+
+// "test.webm" contains 8 SimpleBlocks in a single Cluster. The blocks with
+// timecodes 100000000 and are 133000000 skipped by WebMBufferedParser
+// because they occur after a block with timecode 160000000 and the parser
+// expects in-order timecodes per the WebM spec. The remaining 6
+// SimpleBlocks have the following attributes:
+static const uint64_t gTimecodes[] = { 66000000, 160000000, 166000000, 200000000, 233000000, 320000000 };
+static const int64_t gEndOffsets[] = { 501, 772, 1244, 1380, 1543, 2015 };
+
+TEST(WebMBuffered, BasicTests)
+{
+ ReentrantMonitor dummy("dummy");
+ WebMBufferedParser parser(0);
+
+ nsTArray<WebMTimeDataOffset> mapping;
+ parser.Append(nullptr, 0, mapping, dummy);
+ EXPECT_TRUE(mapping.IsEmpty());
+ EXPECT_EQ(parser.mStartOffset, 0);
+ EXPECT_EQ(parser.mCurrentOffset, 0);
+
+ unsigned char buf[] = { 0x1a, 0x45, 0xdf, 0xa3 };
+ parser.Append(buf, ArrayLength(buf), mapping, dummy);
+ EXPECT_TRUE(mapping.IsEmpty());
+ EXPECT_EQ(parser.mStartOffset, 0);
+ EXPECT_EQ(parser.mCurrentOffset, 4);
+}
+
+static void
+ReadFile(const char* aPath, nsTArray<uint8_t>& aBuffer)
+{
+ FILE* f = fopen(aPath, "rb");
+ ASSERT_NE(f, (FILE *) nullptr);
+
+ int r = fseek(f, 0, SEEK_END);
+ ASSERT_EQ(r, 0);
+
+ long size = ftell(f);
+ ASSERT_NE(size, -1);
+ aBuffer.SetLength(size);
+
+ r = fseek(f, 0, SEEK_SET);
+ ASSERT_EQ(r, 0);
+
+ size_t got = fread(aBuffer.Elements(), 1, size, f);
+ ASSERT_EQ(got, size_t(size));
+
+ r = fclose(f);
+ ASSERT_EQ(r, 0);
+}
+
+TEST(WebMBuffered, RealData)
+{
+ ReentrantMonitor dummy("dummy");
+ WebMBufferedParser parser(0);
+
+ nsTArray<uint8_t> webmData;
+ ReadFile("test.webm", webmData);
+
+ nsTArray<WebMTimeDataOffset> mapping;
+ parser.Append(webmData.Elements(), webmData.Length(), mapping, dummy);
+ EXPECT_EQ(mapping.Length(), 6u);
+ EXPECT_EQ(parser.mStartOffset, 0);
+ EXPECT_EQ(parser.mCurrentOffset, int64_t(webmData.Length()));
+ EXPECT_EQ(parser.GetTimecodeScale(), 500000u);
+
+ for (uint32_t i = 0; i < mapping.Length(); ++i) {
+ EXPECT_EQ(mapping[i].mEndOffset, gEndOffsets[i]);
+ EXPECT_EQ(mapping[i].mSyncOffset, 361);
+ EXPECT_EQ(mapping[i].mTimecode, gTimecodes[i]);
+ }
+}
+
+TEST(WebMBuffered, RealDataAppend)
+{
+ ReentrantMonitor dummy("dummy");
+ WebMBufferedParser parser(0);
+ nsTArray<WebMTimeDataOffset> mapping;
+
+ nsTArray<uint8_t> webmData;
+ ReadFile("test.webm", webmData);
+
+ uint32_t arrayEntries = mapping.Length();
+ size_t offset = 0;
+ while (offset < webmData.Length()) {
+ parser.Append(webmData.Elements() + offset, 1, mapping, dummy);
+ offset += 1;
+ EXPECT_EQ(parser.mCurrentOffset, int64_t(offset));
+ if (mapping.Length() != arrayEntries) {
+ arrayEntries = mapping.Length();
+ ASSERT_LE(arrayEntries, 6u);
+ uint32_t i = arrayEntries - 1;
+ EXPECT_EQ(mapping[i].mEndOffset, gEndOffsets[i]);
+ EXPECT_EQ(mapping[i].mSyncOffset, 361);
+ EXPECT_EQ(mapping[i].mTimecode, gTimecodes[i]);
+ EXPECT_EQ(parser.GetTimecodeScale(), 500000u);
+ }
+ }
+ EXPECT_EQ(mapping.Length(), 6u);
+ EXPECT_EQ(parser.mStartOffset, 0);
+ EXPECT_EQ(parser.mCurrentOffset, int64_t(webmData.Length()));
+ EXPECT_EQ(parser.GetTimecodeScale(), 500000u);
+
+ for (uint32_t i = 0; i < mapping.Length(); ++i) {
+ EXPECT_EQ(mapping[i].mEndOffset, gEndOffsets[i]);
+ EXPECT_EQ(mapping[i].mSyncOffset, 361);
+ EXPECT_EQ(mapping[i].mTimecode, gTimecodes[i]);
+ }
+}
diff --git a/dom/media/gtest/TestWebMWriter.cpp b/dom/media/gtest/TestWebMWriter.cpp
new file mode 100644
index 000000000..e5fd8c771
--- /dev/null
+++ b/dom/media/gtest/TestWebMWriter.cpp
@@ -0,0 +1,376 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "mozilla/CheckedInt.h"
+#include "mozilla/MathAlgorithms.h"
+#include "nestegg/nestegg.h"
+#include "OpusTrackEncoder.h"
+#include "VP8TrackEncoder.h"
+#include "WebMWriter.h"
+
+using namespace mozilla;
+
+class WebMOpusTrackEncoder : public OpusTrackEncoder
+{
+public:
+ bool TestOpusCreation(int aChannels, int aSamplingRate)
+ {
+ if (NS_SUCCEEDED(Init(aChannels, aSamplingRate))) {
+ return true;
+ }
+ return false;
+ }
+};
+
+class WebMVP8TrackEncoder: public VP8TrackEncoder
+{
+public:
+ explicit WebMVP8TrackEncoder(TrackRate aTrackRate = 90000)
+ : VP8TrackEncoder(aTrackRate) {}
+
+ bool TestVP8Creation(int32_t aWidth, int32_t aHeight, int32_t aDisplayWidth,
+ int32_t aDisplayHeight)
+ {
+ if (NS_SUCCEEDED(Init(aWidth, aHeight, aDisplayWidth, aDisplayHeight))) {
+ return true;
+ }
+ return false;
+ }
+};
+
+const uint64_t FIXED_DURATION = 1000000;
+const uint32_t FIXED_FRAMESIZE = 500;
+
+class TestWebMWriter: public WebMWriter
+{
+public:
+ explicit TestWebMWriter(int aTrackTypes)
+ : WebMWriter(aTrackTypes),
+ mTimestamp(0)
+ {}
+
+ void SetOpusMetadata(int aChannels, int aSampleRate) {
+ WebMOpusTrackEncoder opusEncoder;
+ EXPECT_TRUE(opusEncoder.TestOpusCreation(aChannels, aSampleRate));
+ RefPtr<TrackMetadataBase> opusMeta = opusEncoder.GetMetadata();
+ SetMetadata(opusMeta);
+ }
+ void SetVP8Metadata(int32_t aWidth, int32_t aHeight, int32_t aDisplayWidth,
+ int32_t aDisplayHeight,TrackRate aTrackRate) {
+ WebMVP8TrackEncoder vp8Encoder;
+ EXPECT_TRUE(vp8Encoder.TestVP8Creation(aWidth, aHeight, aDisplayWidth,
+ aDisplayHeight));
+ RefPtr<TrackMetadataBase> vp8Meta = vp8Encoder.GetMetadata();
+ SetMetadata(vp8Meta);
+ }
+
+ // When we append an I-Frame into WebM muxer, the muxer will treat previous
+ // data as "a cluster".
+ // In these test cases, we will call the function many times to enclose the
+ // previous cluster so that we can retrieve data by |GetContainerData|.
+ void AppendDummyFrame(EncodedFrame::FrameType aFrameType,
+ uint64_t aDuration) {
+ EncodedFrameContainer encodedVideoData;
+ nsTArray<uint8_t> frameData;
+ RefPtr<EncodedFrame> videoData = new EncodedFrame();
+ // Create dummy frame data.
+ frameData.SetLength(FIXED_FRAMESIZE);
+ videoData->SetFrameType(aFrameType);
+ videoData->SetTimeStamp(mTimestamp);
+ videoData->SetDuration(aDuration);
+ videoData->SwapInFrameData(frameData);
+ encodedVideoData.AppendEncodedFrame(videoData);
+ WriteEncodedTrack(encodedVideoData, 0);
+ mTimestamp += aDuration;
+ }
+
+ bool HaveValidCluster() {
+ nsTArray<nsTArray<uint8_t> > encodedBuf;
+ GetContainerData(&encodedBuf, 0);
+ return (encodedBuf.Length() > 0) ? true : false;
+ }
+
+ // Timestamp accumulator that increased by AppendDummyFrame.
+ // Keep it public that we can do some testcases about it.
+ uint64_t mTimestamp;
+};
+
+TEST(WebMWriter, Metadata)
+{
+ TestWebMWriter writer(ContainerWriter::CREATE_AUDIO_TRACK |
+ ContainerWriter::CREATE_VIDEO_TRACK);
+
+ // The output should be empty since we didn't set any metadata in writer.
+ nsTArray<nsTArray<uint8_t> > encodedBuf;
+ writer.GetContainerData(&encodedBuf, ContainerWriter::GET_HEADER);
+ EXPECT_TRUE(encodedBuf.Length() == 0);
+ writer.GetContainerData(&encodedBuf, ContainerWriter::FLUSH_NEEDED);
+ EXPECT_TRUE(encodedBuf.Length() == 0);
+
+ // Set opus metadata.
+ int channel = 1;
+ int sampleRate = 44100;
+ writer.SetOpusMetadata(channel, sampleRate);
+
+ // No output data since we didn't set both audio/video
+ // metadata in writer.
+ writer.GetContainerData(&encodedBuf, ContainerWriter::GET_HEADER);
+ EXPECT_TRUE(encodedBuf.Length() == 0);
+ writer.GetContainerData(&encodedBuf, ContainerWriter::FLUSH_NEEDED);
+ EXPECT_TRUE(encodedBuf.Length() == 0);
+
+ // Set vp8 metadata
+ int32_t width = 640;
+ int32_t height = 480;
+ int32_t displayWidth = 640;
+ int32_t displayHeight = 480;
+ TrackRate aTrackRate = 90000;
+ writer.SetVP8Metadata(width, height, displayWidth,
+ displayHeight, aTrackRate);
+
+ writer.GetContainerData(&encodedBuf, ContainerWriter::GET_HEADER);
+ EXPECT_TRUE(encodedBuf.Length() > 0);
+}
+
+TEST(WebMWriter, Cluster)
+{
+ TestWebMWriter writer(ContainerWriter::CREATE_AUDIO_TRACK |
+ ContainerWriter::CREATE_VIDEO_TRACK);
+ // Set opus metadata.
+ int channel = 1;
+ int sampleRate = 48000;
+ writer.SetOpusMetadata(channel, sampleRate);
+ // Set vp8 metadata
+ int32_t width = 320;
+ int32_t height = 240;
+ int32_t displayWidth = 320;
+ int32_t displayHeight = 240;
+ TrackRate aTrackRate = 90000;
+ writer.SetVP8Metadata(width, height, displayWidth,
+ displayHeight, aTrackRate);
+
+ nsTArray<nsTArray<uint8_t> > encodedBuf;
+ writer.GetContainerData(&encodedBuf, ContainerWriter::GET_HEADER);
+ EXPECT_TRUE(encodedBuf.Length() > 0);
+ encodedBuf.Clear();
+
+ // write the first I-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+ // No data because the cluster is not closed.
+ EXPECT_FALSE(writer.HaveValidCluster());
+
+ // The second I-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+ // Should have data because the first cluster is closed.
+ EXPECT_TRUE(writer.HaveValidCluster());
+
+ // P-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_P_FRAME, FIXED_DURATION);
+ // No data because the cluster is not closed.
+ EXPECT_FALSE(writer.HaveValidCluster());
+
+ // The third I-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+ // Should have data because the second cluster is closed.
+ EXPECT_TRUE(writer.HaveValidCluster());
+}
+
+TEST(WebMWriter, FLUSH_NEEDED)
+{
+ TestWebMWriter writer(ContainerWriter::CREATE_AUDIO_TRACK |
+ ContainerWriter::CREATE_VIDEO_TRACK);
+ // Set opus metadata.
+ int channel = 2;
+ int sampleRate = 44100;
+ writer.SetOpusMetadata(channel, sampleRate);
+ // Set vp8 metadata
+ int32_t width = 176;
+ int32_t height = 352;
+ int32_t displayWidth = 176;
+ int32_t displayHeight = 352;
+ TrackRate aTrackRate = 100000;
+ writer.SetVP8Metadata(width, height, displayWidth,
+ displayHeight, aTrackRate);
+
+ // write the first I-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+
+ // P-Frame
+ writer.AppendDummyFrame(EncodedFrame::VP8_P_FRAME, FIXED_DURATION);
+ // Have data because the metadata is finished.
+ EXPECT_TRUE(writer.HaveValidCluster());
+ // No data because the cluster is not closed and the metatdata had been
+ // retrieved
+ EXPECT_FALSE(writer.HaveValidCluster());
+
+ nsTArray<nsTArray<uint8_t> > encodedBuf;
+ // Have data because the flag ContainerWriter::FLUSH_NEEDED
+ writer.GetContainerData(&encodedBuf, ContainerWriter::FLUSH_NEEDED);
+ EXPECT_TRUE(encodedBuf.Length() > 0);
+ encodedBuf.Clear();
+
+ // P-Frame
+ writer.AppendDummyFrame(EncodedFrame::VP8_P_FRAME, FIXED_DURATION);
+ // No data because there is no cluster right now. The I-Frame had been
+ // flushed out.
+ EXPECT_FALSE(writer.HaveValidCluster());
+
+ // I-Frame
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+ // No data because a cluster must starts form I-Frame and the
+ // cluster is not closed.
+ EXPECT_FALSE(writer.HaveValidCluster());
+
+ // I-Frame
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+ // Have data because the previous cluster is closed.
+ EXPECT_TRUE(writer.HaveValidCluster());
+}
+
+struct WebMioData {
+ nsTArray<uint8_t> data;
+ CheckedInt<size_t> offset;
+};
+
+static int webm_read(void* aBuffer, size_t aLength, void* aUserData)
+{
+ NS_ASSERTION(aUserData, "aUserData must point to a valid WebMioData");
+ WebMioData* ioData = static_cast<WebMioData*>(aUserData);
+
+ // Check the read length.
+ if (aLength > ioData->data.Length()) {
+ return 0;
+ }
+
+ // Check eos.
+ if (ioData->offset.value() >= ioData->data.Length()) {
+ return 0;
+ }
+
+ size_t oldOffset = ioData->offset.value();
+ ioData->offset += aLength;
+ if (!ioData->offset.isValid() ||
+ (ioData->offset.value() > ioData->data.Length())) {
+ return -1;
+ }
+ memcpy(aBuffer, ioData->data.Elements()+oldOffset, aLength);
+ return 1;
+}
+
+static int webm_seek(int64_t aOffset, int aWhence, void* aUserData)
+{
+ NS_ASSERTION(aUserData, "aUserData must point to a valid WebMioData");
+ WebMioData* ioData = static_cast<WebMioData*>(aUserData);
+
+ if (Abs(aOffset) > ioData->data.Length()) {
+ NS_ERROR("Invalid aOffset");
+ return -1;
+ }
+
+ switch (aWhence) {
+ case NESTEGG_SEEK_END:
+ {
+ CheckedInt<size_t> tempOffset = ioData->data.Length();
+ ioData->offset = tempOffset + aOffset;
+ break;
+ }
+ case NESTEGG_SEEK_CUR:
+ ioData->offset += aOffset;
+ break;
+ case NESTEGG_SEEK_SET:
+ ioData->offset = aOffset;
+ break;
+ default:
+ NS_ERROR("Unknown whence");
+ return -1;
+ }
+
+ if (!ioData->offset.isValid()) {
+ NS_ERROR("Invalid offset");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int64_t webm_tell(void* aUserData)
+{
+ NS_ASSERTION(aUserData, "aUserData must point to a valid WebMioData");
+ WebMioData* ioData = static_cast<WebMioData*>(aUserData);
+ return ioData->offset.isValid() ? ioData->offset.value() : -1;
+}
+
+TEST(WebMWriter, bug970774_aspect_ratio)
+{
+ TestWebMWriter writer(ContainerWriter::CREATE_AUDIO_TRACK |
+ ContainerWriter::CREATE_VIDEO_TRACK);
+ // Set opus metadata.
+ int channel = 1;
+ int sampleRate = 44100;
+ writer.SetOpusMetadata(channel, sampleRate);
+ // Set vp8 metadata
+ int32_t width = 640;
+ int32_t height = 480;
+ int32_t displayWidth = 1280;
+ int32_t displayHeight = 960;
+ TrackRate aTrackRate = 90000;
+ writer.SetVP8Metadata(width, height, displayWidth,
+ displayHeight, aTrackRate);
+
+ // write the first I-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+
+ // write the second I-Frame.
+ writer.AppendDummyFrame(EncodedFrame::VP8_I_FRAME, FIXED_DURATION);
+
+ // Get the metadata and the first cluster.
+ nsTArray<nsTArray<uint8_t> > encodedBuf;
+ writer.GetContainerData(&encodedBuf, 0);
+ // Flatten the encodedBuf.
+ WebMioData ioData;
+ ioData.offset = 0;
+ for(uint32_t i = 0 ; i < encodedBuf.Length(); ++i) {
+ ioData.data.AppendElements(encodedBuf[i]);
+ }
+
+ // Use nestegg to verify the information in metadata.
+ nestegg* context = nullptr;
+ nestegg_io io;
+ io.read = webm_read;
+ io.seek = webm_seek;
+ io.tell = webm_tell;
+ io.userdata = static_cast<void*>(&ioData);
+ int rv = nestegg_init(&context, io, nullptr, -1);
+ EXPECT_EQ(rv, 0);
+ unsigned int ntracks = 0;
+ rv = nestegg_track_count(context, &ntracks);
+ EXPECT_EQ(rv, 0);
+ EXPECT_EQ(ntracks, (unsigned int)2);
+ for (unsigned int track = 0; track < ntracks; ++track) {
+ int id = nestegg_track_codec_id(context, track);
+ EXPECT_NE(id, -1);
+ int type = nestegg_track_type(context, track);
+ if (type == NESTEGG_TRACK_VIDEO) {
+ nestegg_video_params params;
+ rv = nestegg_track_video_params(context, track, &params);
+ EXPECT_EQ(rv, 0);
+ EXPECT_EQ(width, static_cast<int32_t>(params.width));
+ EXPECT_EQ(height, static_cast<int32_t>(params.height));
+ EXPECT_EQ(displayWidth, static_cast<int32_t>(params.display_width));
+ EXPECT_EQ(displayHeight, static_cast<int32_t>(params.display_height));
+ } else if (type == NESTEGG_TRACK_AUDIO) {
+ nestegg_audio_params params;
+ rv = nestegg_track_audio_params(context, track, &params);
+ EXPECT_EQ(rv, 0);
+ EXPECT_EQ(channel, static_cast<int>(params.channels));
+ EXPECT_EQ(static_cast<double>(sampleRate), params.rate);
+ }
+ }
+ if (context) {
+ nestegg_destroy(context);
+ }
+}
+
diff --git a/dom/media/gtest/dash_dashinit.mp4 b/dom/media/gtest/dash_dashinit.mp4
new file mode 100644
index 000000000..d19068f36
--- /dev/null
+++ b/dom/media/gtest/dash_dashinit.mp4
Binary files differ
diff --git a/dom/media/gtest/hello.rs b/dom/media/gtest/hello.rs
new file mode 100644
index 000000000..cd111882a
--- /dev/null
+++ b/dom/media/gtest/hello.rs
@@ -0,0 +1,6 @@
+#[no_mangle]
+pub extern fn test_rust() -> *const u8 {
+ // NB: rust &str aren't null terminated.
+ let greeting = "hello from rust.\0";
+ greeting.as_ptr()
+}
diff --git a/dom/media/gtest/id3v2header.mp3 b/dom/media/gtest/id3v2header.mp3
new file mode 100644
index 000000000..2f5585d02
--- /dev/null
+++ b/dom/media/gtest/id3v2header.mp3
Binary files differ
diff --git a/dom/media/gtest/mediasource_test.mp4 b/dom/media/gtest/mediasource_test.mp4
new file mode 100644
index 000000000..63707a914
--- /dev/null
+++ b/dom/media/gtest/mediasource_test.mp4
Binary files differ
diff --git a/dom/media/gtest/moz.build b/dom/media/gtest/moz.build
new file mode 100644
index 000000000..fc92d5ef3
--- /dev/null
+++ b/dom/media/gtest/moz.build
@@ -0,0 +1,80 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'MockMediaResource.cpp',
+ 'TestAudioBuffers.cpp',
+ 'TestAudioCompactor.cpp',
+ 'TestAudioMixer.cpp',
+ 'TestAudioPacketizer.cpp',
+ 'TestAudioSegment.cpp',
+ 'TestGMPCrossOrigin.cpp',
+ 'TestGMPRemoveAndDelete.cpp',
+ 'TestGMPUtils.cpp',
+ 'TestIntervalSet.cpp',
+ 'TestMediaDataDecoder.cpp',
+ 'TestMediaEventSource.cpp',
+ 'TestMediaFormatReader.cpp',
+ 'TestMozPromise.cpp',
+ 'TestMP3Demuxer.cpp',
+ 'TestMP4Demuxer.cpp',
+ # 'TestMP4Reader.cpp', disabled so we can turn check tests back on (bug 1175752)
+ 'TestTrackEncoder.cpp',
+ 'TestVideoSegment.cpp',
+ 'TestVideoUtils.cpp',
+ 'TestVPXDecoding.cpp',
+ 'TestWebMBuffered.cpp',
+]
+
+if CONFIG['MOZ_WEBM_ENCODER']:
+ UNIFIED_SOURCES += [
+ 'TestVideoTrackEncoder.cpp',
+ 'TestWebMWriter.cpp',
+ ]
+
+if CONFIG['MOZ_RUST']:
+ UNIFIED_SOURCES += ['TestRust.cpp',]
+
+
+TEST_HARNESS_FILES.gtest += [
+ '../test/gizmo-frag.mp4',
+ '../test/gizmo.mp4',
+ '../test/vp9cake.webm',
+ 'dash_dashinit.mp4',
+ 'id3v2header.mp3',
+ 'mediasource_test.mp4',
+ 'negative_duration.mp4',
+ 'noise.mp3',
+ 'noise_vbr.mp3',
+ 'short-zero-in-moov.mp4',
+ 'short-zero-inband.mov',
+ 'small-shot-false-positive.mp3',
+ 'small-shot.mp3',
+ 'test.webm',
+ 'test_case_1224361.vp8.ivf',
+ 'test_case_1224363.vp8.ivf',
+ 'test_case_1224369.vp8.ivf',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+LOCAL_INCLUDES += [
+ '/dom/media',
+ '/dom/media/encoder',
+ '/dom/media/fmp4',
+ '/dom/media/gmp',
+ '/security/certverifier',
+ '/security/pkix/include',
+]
+
+FINAL_LIBRARY = 'xul-gtest'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
+
+USE_LIBS += [
+ 'rlz',
+]
diff --git a/dom/media/gtest/negative_duration.mp4 b/dom/media/gtest/negative_duration.mp4
new file mode 100644
index 000000000..de86bf497
--- /dev/null
+++ b/dom/media/gtest/negative_duration.mp4
Binary files differ
diff --git a/dom/media/gtest/noise.mp3 b/dom/media/gtest/noise.mp3
new file mode 100644
index 000000000..e76b50350
--- /dev/null
+++ b/dom/media/gtest/noise.mp3
Binary files differ
diff --git a/dom/media/gtest/noise_vbr.mp3 b/dom/media/gtest/noise_vbr.mp3
new file mode 100644
index 000000000..284ebe40b
--- /dev/null
+++ b/dom/media/gtest/noise_vbr.mp3
Binary files differ
diff --git a/dom/media/gtest/short-zero-in-moov.mp4 b/dom/media/gtest/short-zero-in-moov.mp4
new file mode 100644
index 000000000..577318c8f
--- /dev/null
+++ b/dom/media/gtest/short-zero-in-moov.mp4
Binary files differ
diff --git a/dom/media/gtest/short-zero-inband.mov b/dom/media/gtest/short-zero-inband.mov
new file mode 100644
index 000000000..9c1864286
--- /dev/null
+++ b/dom/media/gtest/short-zero-inband.mov
Binary files differ
diff --git a/dom/media/gtest/small-shot-false-positive.mp3 b/dom/media/gtest/small-shot-false-positive.mp3
new file mode 100644
index 000000000..2f1e79405
--- /dev/null
+++ b/dom/media/gtest/small-shot-false-positive.mp3
Binary files differ
diff --git a/dom/media/gtest/small-shot.mp3 b/dom/media/gtest/small-shot.mp3
new file mode 100644
index 000000000..f9397a510
--- /dev/null
+++ b/dom/media/gtest/small-shot.mp3
Binary files differ
diff --git a/dom/media/gtest/test.webm b/dom/media/gtest/test.webm
new file mode 100644
index 000000000..487914c4a
--- /dev/null
+++ b/dom/media/gtest/test.webm
Binary files differ
diff --git a/dom/media/gtest/test_case_1224361.vp8.ivf b/dom/media/gtest/test_case_1224361.vp8.ivf
new file mode 100644
index 000000000..e2fe942f0
--- /dev/null
+++ b/dom/media/gtest/test_case_1224361.vp8.ivf
Binary files differ
diff --git a/dom/media/gtest/test_case_1224363.vp8.ivf b/dom/media/gtest/test_case_1224363.vp8.ivf
new file mode 100644
index 000000000..6d2e4e020
--- /dev/null
+++ b/dom/media/gtest/test_case_1224363.vp8.ivf
Binary files differ
diff --git a/dom/media/gtest/test_case_1224369.vp8.ivf b/dom/media/gtest/test_case_1224369.vp8.ivf
new file mode 100644
index 000000000..2f8deb114
--- /dev/null
+++ b/dom/media/gtest/test_case_1224369.vp8.ivf
Binary files differ
diff --git a/dom/media/imagecapture/CaptureTask.cpp b/dom/media/imagecapture/CaptureTask.cpp
new file mode 100644
index 000000000..589ba5a42
--- /dev/null
+++ b/dom/media/imagecapture/CaptureTask.cpp
@@ -0,0 +1,197 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "CaptureTask.h"
+#include "mozilla/dom/ImageCapture.h"
+#include "mozilla/dom/ImageCaptureError.h"
+#include "mozilla/dom/ImageEncoder.h"
+#include "mozilla/dom/MediaStreamTrack.h"
+#include "mozilla/dom/VideoStreamTrack.h"
+#include "gfxUtils.h"
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+
+class CaptureTask::MediaStreamEventListener : public MediaStreamTrackListener
+{
+public:
+ explicit MediaStreamEventListener(CaptureTask* aCaptureTask)
+ : mCaptureTask(aCaptureTask) {};
+
+ // MediaStreamListener methods.
+ void NotifyEnded() override
+ {
+ if(!mCaptureTask->mImageGrabbedOrTrackEnd) {
+ mCaptureTask->PostTrackEndEvent();
+ }
+ }
+
+private:
+ CaptureTask* mCaptureTask;
+};
+
+CaptureTask::CaptureTask(dom::ImageCapture* aImageCapture)
+ : mImageCapture(aImageCapture)
+ , mEventListener(new MediaStreamEventListener(this))
+ , mImageGrabbedOrTrackEnd(false)
+ , mPrincipalChanged(false)
+{
+}
+
+nsresult
+CaptureTask::TaskComplete(already_AddRefed<dom::Blob> aBlob, nsresult aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ DetachTrack();
+
+ nsresult rv;
+ RefPtr<dom::Blob> blob(aBlob);
+
+ // We have to set the parent because the blob has been generated with a valid one.
+ if (blob) {
+ blob = dom::Blob::Create(mImageCapture->GetParentObject(), blob->Impl());
+ }
+
+ if (mPrincipalChanged) {
+ aRv = NS_ERROR_DOM_SECURITY_ERR;
+ IC_LOG("MediaStream principal should not change during TakePhoto().");
+ }
+
+ if (NS_SUCCEEDED(aRv)) {
+ rv = mImageCapture->PostBlobEvent(blob);
+ } else {
+ rv = mImageCapture->PostErrorEvent(dom::ImageCaptureError::PHOTO_ERROR, aRv);
+ }
+
+ // Ensure ImageCapture dereference on main thread here because the TakePhoto()
+ // sequences stopped here.
+ mImageCapture = nullptr;
+
+ return rv;
+}
+
+void
+CaptureTask::AttachTrack()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ dom::VideoStreamTrack* track = mImageCapture->GetVideoStreamTrack();
+ track->AddPrincipalChangeObserver(this);
+ track->AddListener(mEventListener.get());
+ track->AddDirectListener(this);
+}
+
+void
+CaptureTask::DetachTrack()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ dom::VideoStreamTrack* track = mImageCapture->GetVideoStreamTrack();
+ track->RemovePrincipalChangeObserver(this);
+ track->RemoveListener(mEventListener.get());
+ track->RemoveDirectListener(this);
+}
+
+void
+CaptureTask::PrincipalChanged(dom::MediaStreamTrack* aMediaStreamTrack)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mPrincipalChanged = true;
+}
+
+void
+CaptureTask::SetCurrentFrames(const VideoSegment& aSegment)
+{
+ if (mImageGrabbedOrTrackEnd) {
+ return;
+ }
+
+ // Callback for encoding complete, it calls on main thread.
+ class EncodeComplete : public dom::EncodeCompleteCallback
+ {
+ public:
+ explicit EncodeComplete(CaptureTask* aTask) : mTask(aTask) {}
+
+ nsresult ReceiveBlob(already_AddRefed<dom::Blob> aBlob) override
+ {
+ RefPtr<dom::Blob> blob(aBlob);
+ mTask->TaskComplete(blob.forget(), NS_OK);
+ mTask = nullptr;
+ return NS_OK;
+ }
+
+ protected:
+ RefPtr<CaptureTask> mTask;
+ };
+
+ VideoSegment::ConstChunkIterator iter(aSegment);
+
+
+
+ while (!iter.IsEnded()) {
+ VideoChunk chunk = *iter;
+
+ // Extract the first valid video frame.
+ VideoFrame frame;
+ if (!chunk.IsNull()) {
+ RefPtr<layers::Image> image;
+ if (chunk.mFrame.GetForceBlack()) {
+ // Create a black image.
+ image = VideoFrame::CreateBlackImage(chunk.mFrame.GetIntrinsicSize());
+ } else {
+ image = chunk.mFrame.GetImage();
+ }
+ MOZ_ASSERT(image);
+ mImageGrabbedOrTrackEnd = true;
+
+ // Encode image.
+ nsresult rv;
+ nsAutoString type(NS_LITERAL_STRING("image/jpeg"));
+ nsAutoString options;
+ rv = dom::ImageEncoder::ExtractDataFromLayersImageAsync(
+ type,
+ options,
+ false,
+ image,
+ new EncodeComplete(this));
+ if (NS_FAILED(rv)) {
+ PostTrackEndEvent();
+ }
+ return;
+ }
+ iter.Next();
+ }
+}
+
+void
+CaptureTask::PostTrackEndEvent()
+{
+ mImageGrabbedOrTrackEnd = true;
+
+ // Got track end or finish event, stop the task.
+ class TrackEndRunnable : public Runnable
+ {
+ public:
+ explicit TrackEndRunnable(CaptureTask* aTask)
+ : mTask(aTask) {}
+
+ NS_IMETHOD Run() override
+ {
+ mTask->TaskComplete(nullptr, NS_ERROR_FAILURE);
+ mTask = nullptr;
+ return NS_OK;
+ }
+
+ protected:
+ RefPtr<CaptureTask> mTask;
+ };
+
+ IC_LOG("Got MediaStream track removed or finished event.");
+ NS_DispatchToMainThread(new TrackEndRunnable(this));
+}
+
+} // namespace mozilla
diff --git a/dom/media/imagecapture/CaptureTask.h b/dom/media/imagecapture/CaptureTask.h
new file mode 100644
index 000000000..2b4f0a04c
--- /dev/null
+++ b/dom/media/imagecapture/CaptureTask.h
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef CAPTURETASK_H
+#define CAPTURETASK_H
+
+#include "MediaStreamGraph.h"
+#include "MediaStreamListener.h"
+#include "PrincipalChangeObserver.h"
+#include "MediaStreamVideoSink.h"
+
+namespace mozilla {
+
+namespace dom {
+class Blob;
+class ImageCapture;
+class MediaStreamTrack;
+} // namespace dom
+
+/**
+ * CaptureTask retrieves image from MediaStream and encodes the image to jpeg in
+ * ImageEncoder. The whole procedures start at AttachTrack(), it will add this
+ * class into MediaStream and retrieves an image in MediaStreamGraph thread.
+ * Once the image is retrieved, it will be sent to ImageEncoder and the encoded
+ * blob will be sent out via encoder callback in main thread.
+ *
+ * CaptureTask holds a reference of ImageCapture to ensure ImageCapture won't be
+ * released during the period of the capturing process described above.
+ */
+class CaptureTask : public MediaStreamVideoSink,
+ public dom::PrincipalChangeObserver<dom::MediaStreamTrack>
+{
+public:
+ class MediaStreamEventListener;
+
+ // MediaStreamVideoSink methods.
+ void SetCurrentFrames(const VideoSegment& aSegment) override;
+ void ClearFrames() override {}
+
+ // PrincipalChangeObserver<MediaStreamTrack> method.
+ void PrincipalChanged(dom::MediaStreamTrack* aMediaStreamTrack) override;
+
+ // CaptureTask methods.
+
+ // It is called when aBlob is ready to post back to script in company with
+ // aRv == NS_OK. If aRv is not NS_OK, it will post an error event to script.
+ //
+ // Note:
+ // this function should be called on main thread.
+ nsresult TaskComplete(already_AddRefed<dom::Blob> aBlob, nsresult aRv);
+
+ // Add listeners into MediaStreamTrack and PrincipalChangeObserver.
+ // It should be on main thread only.
+ void AttachTrack();
+
+ // Remove listeners from MediaStreamTrack and PrincipalChangeObserver.
+ // It should be on main thread only.
+ void DetachTrack();
+
+ // CaptureTask should be created on main thread.
+ explicit CaptureTask(dom::ImageCapture* aImageCapture);
+
+protected:
+ virtual ~CaptureTask() {}
+
+ // Post a runnable on main thread to end this task and call TaskComplete to post
+ // error event to script. It is called off-main-thread.
+ void PostTrackEndEvent();
+
+ // The ImageCapture associates with this task. This reference count should not
+ // change in this class unless it clears this reference after a blob or error
+ // event to script.
+ RefPtr<dom::ImageCapture> mImageCapture;
+
+ RefPtr<MediaStreamEventListener> mEventListener;
+
+ // True when an image is retrieved from MediaStreamGraph or MediaStreamGraph
+ // sends a track finish, end, or removed event.
+ bool mImageGrabbedOrTrackEnd;
+
+ // True after MediaStreamTrack principal changes while waiting for a photo
+ // to finish and we should raise a security error.
+ bool mPrincipalChanged;
+};
+
+} // namespace mozilla
+
+#endif // CAPTURETASK_H
diff --git a/dom/media/imagecapture/ImageCapture.cpp b/dom/media/imagecapture/ImageCapture.cpp
new file mode 100644
index 000000000..243fcbcc8
--- /dev/null
+++ b/dom/media/imagecapture/ImageCapture.cpp
@@ -0,0 +1,232 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ImageCapture.h"
+#include "mozilla/dom/BlobEvent.h"
+#include "mozilla/dom/DOMException.h"
+#include "mozilla/dom/File.h"
+#include "mozilla/dom/ImageCaptureError.h"
+#include "mozilla/dom/ImageCaptureErrorEvent.h"
+#include "mozilla/dom/ImageCaptureErrorEventBinding.h"
+#include "mozilla/dom/VideoStreamTrack.h"
+#include "nsIDocument.h"
+#include "CaptureTask.h"
+#include "MediaEngine.h"
+
+namespace mozilla {
+
+LogModule* GetICLog()
+{
+ static LazyLogModule log("ImageCapture");
+ return log;
+}
+
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(ImageCapture, DOMEventTargetHelper,
+ mVideoStreamTrack)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ImageCapture)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(ImageCapture, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(ImageCapture, DOMEventTargetHelper)
+
+ImageCapture::ImageCapture(VideoStreamTrack* aVideoStreamTrack,
+ nsPIDOMWindowInner* aOwnerWindow)
+ : DOMEventTargetHelper(aOwnerWindow)
+{
+ MOZ_ASSERT(aOwnerWindow);
+ MOZ_ASSERT(aVideoStreamTrack);
+
+ mVideoStreamTrack = aVideoStreamTrack;
+}
+
+ImageCapture::~ImageCapture()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+already_AddRefed<ImageCapture>
+ImageCapture::Constructor(const GlobalObject& aGlobal,
+ VideoStreamTrack& aTrack,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!win) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<ImageCapture> object = new ImageCapture(&aTrack, win);
+
+ return object.forget();
+}
+
+VideoStreamTrack*
+ImageCapture::GetVideoStreamTrack() const
+{
+ return mVideoStreamTrack;
+}
+
+nsresult
+ImageCapture::TakePhotoByMediaEngine()
+{
+ // Callback for TakPhoto(), it also monitor the principal. If principal
+ // changes, it returns PHOTO_ERROR with security error.
+ class TakePhotoCallback : public MediaEnginePhotoCallback,
+ public PrincipalChangeObserver<MediaStreamTrack>
+ {
+ public:
+ TakePhotoCallback(VideoStreamTrack* aVideoTrack, ImageCapture* aImageCapture)
+ : mVideoTrack(aVideoTrack)
+ , mImageCapture(aImageCapture)
+ , mPrincipalChanged(false)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mVideoTrack->AddPrincipalChangeObserver(this);
+ }
+
+ void PrincipalChanged(MediaStreamTrack* aMediaStream) override
+ {
+ mPrincipalChanged = true;
+ }
+
+ nsresult PhotoComplete(already_AddRefed<Blob> aBlob) override
+ {
+ RefPtr<Blob> blob = aBlob;
+
+ if (mPrincipalChanged) {
+ return PhotoError(NS_ERROR_DOM_SECURITY_ERR);
+ }
+ return mImageCapture->PostBlobEvent(blob);
+ }
+
+ nsresult PhotoError(nsresult aRv) override
+ {
+ return mImageCapture->PostErrorEvent(ImageCaptureError::PHOTO_ERROR, aRv);
+ }
+
+ protected:
+ ~TakePhotoCallback()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mVideoTrack->RemovePrincipalChangeObserver(this);
+ }
+
+ RefPtr<VideoStreamTrack> mVideoTrack;
+ RefPtr<ImageCapture> mImageCapture;
+ bool mPrincipalChanged;
+ };
+
+ RefPtr<MediaEnginePhotoCallback> callback =
+ new TakePhotoCallback(mVideoStreamTrack, this);
+ return mVideoStreamTrack->GetSource().TakePhoto(callback);
+}
+
+void
+ImageCapture::TakePhoto(ErrorResult& aResult)
+{
+ // According to spec, VideoStreamTrack.readyState must be "live"; however
+ // gecko doesn't implement it yet (bug 910249). Instead of readyState, we
+ // check VideoStreamTrack.enable before bug 910249 is fixed.
+ // The error code should be INVALID_TRACK, but spec doesn't define it in
+ // ImageCaptureError. So it returns PHOTO_ERROR here before spec updates.
+ if (!mVideoStreamTrack->Enabled()) {
+ PostErrorEvent(ImageCaptureError::PHOTO_ERROR, NS_ERROR_FAILURE);
+ return;
+ }
+
+ // Try if MediaEngine supports taking photo.
+ nsresult rv = TakePhotoByMediaEngine();
+
+ // It falls back to MediaStreamGraph image capture if MediaEngine doesn't
+ // support TakePhoto().
+ if (rv == NS_ERROR_NOT_IMPLEMENTED) {
+ IC_LOG("MediaEngine doesn't support TakePhoto(), it falls back to MediaStreamGraph.");
+ RefPtr<CaptureTask> task = new CaptureTask(this);
+
+ // It adds itself into MediaStreamGraph, so ImageCapture doesn't need to hold
+ // the reference.
+ task->AttachTrack();
+ }
+}
+
+nsresult
+ImageCapture::PostBlobEvent(Blob* aBlob)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!CheckPrincipal()) {
+ // Media is not same-origin, don't allow the data out.
+ return PostErrorEvent(ImageCaptureError::PHOTO_ERROR, NS_ERROR_DOM_SECURITY_ERR);
+ }
+
+ BlobEventInit init;
+ init.mBubbles = false;
+ init.mCancelable = false;
+ init.mData = aBlob;
+
+ RefPtr<BlobEvent> blob_event =
+ BlobEvent::Constructor(this, NS_LITERAL_STRING("photo"), init);
+
+ return DispatchTrustedEvent(blob_event);
+}
+
+nsresult
+ImageCapture::PostErrorEvent(uint16_t aErrorCode, nsresult aReason)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsresult rv = CheckInnerWindowCorrectness();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsString errorMsg;
+ if (NS_FAILED(aReason)) {
+ nsCString name, message;
+ rv = NS_GetNameAndMessageForDOMNSResult(aReason, name, message);
+ if (NS_SUCCEEDED(rv)) {
+ CopyASCIItoUTF16(message, errorMsg);
+ }
+ }
+
+ RefPtr<ImageCaptureError> error =
+ new ImageCaptureError(this, aErrorCode, errorMsg);
+
+ ImageCaptureErrorEventInit init;
+ init.mBubbles = false;
+ init.mCancelable = false;
+ init.mImageCaptureError = error;
+
+ nsCOMPtr<nsIDOMEvent> event =
+ ImageCaptureErrorEvent::Constructor(this, NS_LITERAL_STRING("error"), init);
+
+ return DispatchTrustedEvent(event);
+}
+
+bool
+ImageCapture::CheckPrincipal()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsCOMPtr<nsIPrincipal> principal = mVideoStreamTrack->GetPrincipal();
+
+ if (!GetOwner()) {
+ return false;
+ }
+ nsCOMPtr<nsIDocument> doc = GetOwner()->GetExtantDoc();
+ if (!doc || !principal) {
+ return false;
+ }
+
+ bool subsumes;
+ if (NS_FAILED(doc->NodePrincipal()->Subsumes(principal, &subsumes))) {
+ return false;
+ }
+
+ return subsumes;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/imagecapture/ImageCapture.h b/dom/media/imagecapture/ImageCapture.h
new file mode 100644
index 000000000..f3256f59b
--- /dev/null
+++ b/dom/media/imagecapture/ImageCapture.h
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef IMAGECAPTURE_H
+#define IMAGECAPTURE_H
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/ImageCaptureBinding.h"
+#include "mozilla/Logging.h"
+
+namespace mozilla {
+
+#ifndef IC_LOG
+LogModule* GetICLog();
+#define IC_LOG(...) MOZ_LOG(GetICLog(), mozilla::LogLevel::Debug, (__VA_ARGS__))
+#endif
+
+namespace dom {
+
+class Blob;
+class VideoStreamTrack;
+
+/**
+ * Implementation of https://dvcs.w3.org/hg/dap/raw-file/default/media-stream-
+ * capture/ImageCapture.html.
+ * The ImageCapture accepts a VideoStreamTrack as input source. The image will
+ * be sent back as a JPG format via Blob event.
+ *
+ * All the functions in ImageCapture are run in main thread.
+ *
+ * There are two ways to capture image, MediaEngineSource and MediaStreamGraph.
+ * When the implementation of MediaEngineSource supports TakePhoto(),
+ * it uses the platform camera to grab image. Otherwise, it falls back
+ * to the MediaStreamGraph way.
+ */
+
+class ImageCapture final : public DOMEventTargetHelper
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ImageCapture, DOMEventTargetHelper)
+
+ IMPL_EVENT_HANDLER(photo)
+ IMPL_EVENT_HANDLER(error)
+
+ // WebIDL members.
+ void TakePhoto(ErrorResult& aResult);
+
+ // The MediaStream passed into the constructor.
+ VideoStreamTrack* GetVideoStreamTrack() const;
+
+ // nsWrapperCache member
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override
+ {
+ return ImageCaptureBinding::Wrap(aCx, this, aGivenProto);
+ }
+
+ // ImageCapture class members
+ nsPIDOMWindowInner* GetParentObject() { return GetOwner(); }
+
+ static already_AddRefed<ImageCapture> Constructor(const GlobalObject& aGlobal,
+ VideoStreamTrack& aTrack,
+ ErrorResult& aRv);
+
+ ImageCapture(VideoStreamTrack* aVideoStreamTrack,
+ nsPIDOMWindowInner* aOwnerWindow);
+
+ // Post a Blob event to script.
+ nsresult PostBlobEvent(Blob* aBlob);
+
+ // Post an error event to script.
+ // aErrorCode should be one of error codes defined in ImageCaptureError.h.
+ // aReason is the nsresult which maps to a error string in dom/base/domerr.msg.
+ nsresult PostErrorEvent(uint16_t aErrorCode, nsresult aReason = NS_OK);
+
+ bool CheckPrincipal();
+
+protected:
+ virtual ~ImageCapture();
+
+ // Capture image by MediaEngine. If it's not support taking photo, this function
+ // should return NS_ERROR_NOT_IMPLEMENTED.
+ nsresult TakePhotoByMediaEngine();
+
+ RefPtr<VideoStreamTrack> mVideoStreamTrack;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // IMAGECAPTURE_H
diff --git a/dom/media/imagecapture/moz.build b/dom/media/imagecapture/moz.build
new file mode 100644
index 000000000..f47649c5e
--- /dev/null
+++ b/dom/media/imagecapture/moz.build
@@ -0,0 +1,16 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS.mozilla.dom += [
+ 'ImageCapture.h'
+]
+
+UNIFIED_SOURCES += [
+ 'CaptureTask.cpp',
+ 'ImageCapture.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/ipc/MediaIPCUtils.h b/dom/media/ipc/MediaIPCUtils.h
new file mode 100644
index 000000000..14b8ee751
--- /dev/null
+++ b/dom/media/ipc/MediaIPCUtils.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_media_MediaIPCUtils_h
+#define mozilla_dom_media_MediaIPCUtils_h
+
+#include "ipc/IPCMessageUtils.h"
+#include "mozilla/GfxMessageUtils.h"
+#include "PlatformDecoderModule.h"
+
+namespace IPC {
+ template<>
+ struct ParamTraits<mozilla::VideoInfo>
+ {
+ typedef mozilla::VideoInfo paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ // TrackInfo
+ WriteParam(aMsg, aParam.mMimeType);
+
+ // VideoInfo
+ WriteParam(aMsg, aParam.mDisplay);
+ WriteParam(aMsg, aParam.mStereoMode);
+ WriteParam(aMsg, aParam.mImage);
+ WriteParam(aMsg, aParam.ImageRect());
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ nsIntRect imageRect;
+ if (ReadParam(aMsg, aIter, &aResult->mMimeType) &&
+ ReadParam(aMsg, aIter, &aResult->mDisplay) &&
+ ReadParam(aMsg, aIter, &aResult->mStereoMode) &&
+ ReadParam(aMsg, aIter, &aResult->mImage) &&
+ ReadParam(aMsg, aIter, &imageRect)) {
+ aResult->SetImageRect(imageRect);
+ return true;
+ }
+ return false;
+ }
+ };
+} // namespace IPC
+
+#endif // mozilla_dom_media_MediaIPCUtils_h
diff --git a/dom/media/ipc/PVideoDecoder.ipdl b/dom/media/ipc/PVideoDecoder.ipdl
new file mode 100644
index 000000000..cc2b803b2
--- /dev/null
+++ b/dom/media/ipc/PVideoDecoder.ipdl
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include "mozilla/dom/MediaIPCUtils.h";
+
+include protocol PVideoDecoderManager;
+include LayersSurfaces;
+using VideoInfo from "MediaInfo.h";
+using mozilla::layers::LayersBackend from "mozilla/layers/LayersTypes.h";
+using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h";
+
+namespace mozilla {
+namespace dom {
+
+struct MediaDataIPDL
+{
+ int64_t offset;
+ int64_t time;
+ int64_t timecode;
+ int64_t duration;
+ uint32_t frames;
+ bool keyframe;
+};
+
+struct VideoDataIPDL
+{
+ MediaDataIPDL base;
+ IntSize display;
+ SurfaceDescriptorGPUVideo sd;
+ int32_t frameID;
+};
+
+struct MediaRawDataIPDL
+{
+ MediaDataIPDL base;
+ Shmem buffer;
+};
+
+// This protocol provides a way to use MediaDataDecoder/MediaDataDecoderCallback
+// across processes. The parent side currently is only implemented to work with
+// Window Media Foundation, but can be extended easily to support other backends.
+// The child side runs in the content process, and the parent side runs in the
+// GPU process. We run a separate IPDL thread for both sides.
+async protocol PVideoDecoder
+{
+ manager PVideoDecoderManager;
+parent:
+ async Init(VideoInfo info, TextureFactoryIdentifier identifier);
+
+ async Input(MediaRawDataIPDL data);
+
+ async Flush();
+ async Drain();
+ async Shutdown();
+
+ async SetSeekThreshold(int64_t time);
+
+ async __delete__();
+
+child:
+
+ async InitComplete(bool hardware, nsCString hardwareReason);
+ async InitFailed(nsresult reason);
+
+ // Each output includes a SurfaceDescriptorGPUVideo that represents the decoded
+ // frame. This SurfaceDescriptor can be used on the Layers IPDL protocol, but
+ // must be released explicitly using DeallocateSurfaceDescriptorGPUVideo
+ // on the manager protocol.
+ async Output(VideoDataIPDL data);
+ async InputExhausted();
+ async DrainComplete();
+ async Error(nsresult error);
+};
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/PVideoDecoderManager.ipdl b/dom/media/ipc/PVideoDecoderManager.ipdl
new file mode 100644
index 000000000..340207bc5
--- /dev/null
+++ b/dom/media/ipc/PVideoDecoderManager.ipdl
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PVideoDecoder;
+include LayersSurfaces;
+include "mozilla/dom/MediaIPCUtils.h";
+
+namespace mozilla {
+namespace dom {
+
+sync protocol PVideoDecoderManager
+{
+ manages PVideoDecoder;
+parent:
+ async PVideoDecoder();
+
+ sync Readback(SurfaceDescriptorGPUVideo sd) returns (SurfaceDescriptor aResult);
+
+ async DeallocateSurfaceDescriptorGPUVideo(SurfaceDescriptorGPUVideo sd);
+};
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/RemoteVideoDecoder.cpp b/dom/media/ipc/RemoteVideoDecoder.cpp
new file mode 100644
index 000000000..c6131bb91
--- /dev/null
+++ b/dom/media/ipc/RemoteVideoDecoder.cpp
@@ -0,0 +1,176 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "RemoteVideoDecoder.h"
+#include "VideoDecoderChild.h"
+#include "VideoDecoderManagerChild.h"
+#include "mozilla/layers/TextureClient.h"
+#include "base/thread.h"
+#include "MediaInfo.h"
+#include "MediaPrefs.h"
+#include "ImageContainer.h"
+#include "mozilla/layers/SynchronousTask.h"
+
+namespace mozilla {
+namespace dom {
+
+using base::Thread;
+using namespace ipc;
+using namespace layers;
+using namespace gfx;
+
+RemoteVideoDecoder::RemoteVideoDecoder(MediaDataDecoderCallback* aCallback)
+ : mActor(new VideoDecoderChild())
+{
+#ifdef DEBUG
+ mCallback = aCallback;
+#endif
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+}
+
+RemoteVideoDecoder::~RemoteVideoDecoder()
+{
+ // We're about to be destroyed and drop our ref to
+ // VideoDecoderChild. Make sure we put a ref into the
+ // task queue for the VideoDecoderChild thread to keep
+ // it alive until we send the delete message.
+ RefPtr<VideoDecoderChild> actor = mActor;
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([actor]() {
+ MOZ_ASSERT(actor);
+ actor->DestroyIPDL();
+ }), NS_DISPATCH_NORMAL);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+RemoteVideoDecoder::Init()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ return InvokeAsync(VideoDecoderManagerChild::GetManagerAbstractThread(),
+ this, __func__, &RemoteVideoDecoder::InitInternal);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+RemoteVideoDecoder::InitInternal()
+{
+ MOZ_ASSERT(mActor);
+ MOZ_ASSERT(NS_GetCurrentThread() == VideoDecoderManagerChild::GetManagerThread());
+ return mActor->Init();
+}
+
+void
+RemoteVideoDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ RefPtr<RemoteVideoDecoder> self = this;
+ RefPtr<MediaRawData> sample = aSample;
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([self, sample]() {
+ MOZ_ASSERT(self->mActor);
+ self->mActor->Input(sample);
+ }), NS_DISPATCH_NORMAL);
+}
+
+void
+RemoteVideoDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ RefPtr<RemoteVideoDecoder> self = this;
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([self]() {
+ MOZ_ASSERT(self->mActor);
+ self->mActor->Flush();
+ }), NS_DISPATCH_NORMAL);
+}
+
+void
+RemoteVideoDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ RefPtr<RemoteVideoDecoder> self = this;
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([self]() {
+ MOZ_ASSERT(self->mActor);
+ self->mActor->Drain();
+ }), NS_DISPATCH_NORMAL);
+}
+
+void
+RemoteVideoDecoder::Shutdown()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ SynchronousTask task("Shutdown");
+ RefPtr<RemoteVideoDecoder> self = this;
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([&]() {
+ AutoCompleteTask complete(&task);
+ MOZ_ASSERT(self->mActor);
+ self->mActor->Shutdown();
+ }), NS_DISPATCH_NORMAL);
+ task.Wait();
+}
+
+bool
+RemoteVideoDecoder::IsHardwareAccelerated(nsACString& aFailureReason) const
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ return mActor->IsHardwareAccelerated(aFailureReason);
+}
+
+void
+RemoteVideoDecoder::SetSeekThreshold(const media::TimeUnit& aTime)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ RefPtr<RemoteVideoDecoder> self = this;
+ media::TimeUnit time = aTime;
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([=]() {
+ MOZ_ASSERT(self->mActor);
+ self->mActor->SetSeekThreshold(time);
+ }), NS_DISPATCH_NORMAL);
+
+}
+
+nsresult
+RemoteDecoderModule::Startup()
+{
+ if (!VideoDecoderManagerChild::GetManagerThread()) {
+ return NS_ERROR_FAILURE;
+ }
+ return mWrapped->Startup();
+}
+
+bool
+RemoteDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ return mWrapped->SupportsMimeType(aMimeType, aDiagnostics);
+}
+
+PlatformDecoderModule::ConversionRequired
+RemoteDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ return mWrapped->DecoderNeedsConversion(aConfig);
+}
+
+already_AddRefed<MediaDataDecoder>
+RemoteDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ if (!MediaPrefs::PDMUseGPUDecoder() ||
+ !aParams.mKnowsCompositor ||
+ aParams.mKnowsCompositor->GetTextureFactoryIdentifier().mParentProcessType != GeckoProcessType_GPU) {
+ return mWrapped->CreateVideoDecoder(aParams);
+ }
+
+ MediaDataDecoderCallback* callback = aParams.mCallback;
+ MOZ_ASSERT(callback->OnReaderTaskQueue());
+ RefPtr<RemoteVideoDecoder> object = new RemoteVideoDecoder(callback);
+
+ VideoInfo info = aParams.VideoConfig();
+
+ TextureFactoryIdentifier ident = aParams.mKnowsCompositor->GetTextureFactoryIdentifier();
+ VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([=]() {
+ object->mActor->InitIPDL(callback, info, ident);
+ }), NS_DISPATCH_NORMAL);
+
+ return object.forget();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/RemoteVideoDecoder.h b/dom/media/ipc/RemoteVideoDecoder.h
new file mode 100644
index 000000000..3c8e86bba
--- /dev/null
+++ b/dom/media/ipc/RemoteVideoDecoder.h
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef include_dom_ipc_RemoteVideoDecoder_h
+#define include_dom_ipc_RemoteVideoDecoder_h
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/DebugOnly.h"
+#include "MediaData.h"
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+namespace dom {
+
+class VideoDecoderChild;
+class RemoteDecoderModule;
+
+// A MediaDataDecoder implementation that proxies through IPDL
+// to a 'real' decoder in the GPU process.
+// All requests get forwarded to a VideoDecoderChild instance that
+// operates solely on the VideoDecoderManagerChild thread.
+class RemoteVideoDecoder : public MediaDataDecoder
+{
+public:
+ friend class RemoteDecoderModule;
+
+ // MediaDataDecoder
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
+ void SetSeekThreshold(const media::TimeUnit& aTime) override;
+
+ const char* GetDescriptionName() const override { return "RemoteVideoDecoder"; }
+
+private:
+ explicit RemoteVideoDecoder(MediaDataDecoderCallback* aCallback);
+ ~RemoteVideoDecoder();
+
+ RefPtr<InitPromise> InitInternal();
+
+ // Only ever written to from the reader task queue (during the constructor and destructor
+ // when we can guarantee no other threads are accessing it). Only read from the manager
+ // thread.
+ RefPtr<VideoDecoderChild> mActor;
+#ifdef DEBUG
+ MediaDataDecoderCallback* mCallback;
+#endif
+};
+
+// A PDM implementation that creates RemoteVideoDecoders.
+// We currently require a 'wrapped' PDM in order to be able to answer SupportsMimeType
+// and DecoderNeedsConversion. Ideally we'd check these over IPDL using the manager
+// protocol
+class RemoteDecoderModule : public PlatformDecoderModule
+{
+public:
+ explicit RemoteDecoderModule(PlatformDecoderModule* aWrapped)
+ : mWrapped(aWrapped)
+ {}
+
+ nsresult Startup() override;
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ ConversionRequired DecoderNeedsConversion(
+ const TrackInfo& aConfig) const override;
+
+ already_AddRefed<MediaDataDecoder> CreateVideoDecoder(
+ const CreateDecoderParams& aParams) override;
+
+ already_AddRefed<MediaDataDecoder> CreateAudioDecoder(
+ const CreateDecoderParams& aParams) override
+ {
+ return nullptr;
+ }
+
+private:
+ RefPtr<PlatformDecoderModule> mWrapped;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // include_dom_ipc_RemoteVideoDecoder_h
diff --git a/dom/media/ipc/VideoDecoderChild.cpp b/dom/media/ipc/VideoDecoderChild.cpp
new file mode 100644
index 000000000..d1b1d23fc
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderChild.cpp
@@ -0,0 +1,275 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "VideoDecoderChild.h"
+#include "VideoDecoderManagerChild.h"
+#include "mozilla/layers/TextureClient.h"
+#include "base/thread.h"
+#include "MediaInfo.h"
+#include "ImageContainer.h"
+#include "GPUVideoImage.h"
+
+namespace mozilla {
+namespace dom {
+
+using base::Thread;
+using namespace ipc;
+using namespace layers;
+using namespace gfx;
+
+VideoDecoderChild::VideoDecoderChild()
+ : mThread(VideoDecoderManagerChild::GetManagerThread())
+ , mCanSend(false)
+ , mInitialized(false)
+ , mIsHardwareAccelerated(false)
+{
+}
+
+VideoDecoderChild::~VideoDecoderChild()
+{
+ AssertOnManagerThread();
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+}
+
+bool
+VideoDecoderChild::RecvOutput(const VideoDataIPDL& aData)
+{
+ AssertOnManagerThread();
+ VideoInfo info(aData.display().width, aData.display().height);
+
+ // The Image here creates a TextureData object that takes ownership
+ // of the SurfaceDescriptor, and is responsible for making sure that
+ // it gets deallocated.
+ RefPtr<Image> image = new GPUVideoImage(GetManager(), aData.sd(), aData.display());
+
+ RefPtr<VideoData> video = VideoData::CreateFromImage(info,
+ aData.base().offset(),
+ aData.base().time(),
+ aData.base().duration(),
+ image,
+ aData.base().keyframe(),
+ aData.base().timecode(),
+ IntRect());
+ if (mCallback) {
+ mCallback->Output(video);
+ }
+ return true;
+}
+
+bool
+VideoDecoderChild::RecvInputExhausted()
+{
+ AssertOnManagerThread();
+ if (mCallback) {
+ mCallback->InputExhausted();
+ }
+ return true;
+}
+
+bool
+VideoDecoderChild::RecvDrainComplete()
+{
+ AssertOnManagerThread();
+ if (mCallback) {
+ mCallback->DrainComplete();
+ }
+ return true;
+}
+
+bool
+VideoDecoderChild::RecvError(const nsresult& aError)
+{
+ AssertOnManagerThread();
+ if (mCallback) {
+ mCallback->Error(aError);
+ }
+ return true;
+}
+
+bool
+VideoDecoderChild::RecvInitComplete(const bool& aHardware, const nsCString& aHardwareReason)
+{
+ AssertOnManagerThread();
+ mInitPromise.Resolve(TrackInfo::kVideoTrack, __func__);
+ mInitialized = true;
+ mIsHardwareAccelerated = aHardware;
+ mHardwareAcceleratedReason = aHardwareReason;
+ return true;
+}
+
+bool
+VideoDecoderChild::RecvInitFailed(const nsresult& aReason)
+{
+ AssertOnManagerThread();
+ mInitPromise.Reject(aReason, __func__);
+ return true;
+}
+
+void
+VideoDecoderChild::ActorDestroy(ActorDestroyReason aWhy)
+{
+ if (aWhy == AbnormalShutdown) {
+ // Defer reporting an error until we've recreated the manager so that
+ // it'll be safe for MediaFormatReader to recreate decoders
+ RefPtr<VideoDecoderChild> ref = this;
+ GetManager()->RunWhenRecreated(NS_NewRunnableFunction([=]() {
+ if (ref->mInitialized && ref->mCallback) {
+ ref->mCallback->Error(NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER);
+ } else {
+ ref->mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER, __func__);
+ }
+ }));
+ }
+ mCanSend = false;
+}
+
+void
+VideoDecoderChild::InitIPDL(MediaDataDecoderCallback* aCallback,
+ const VideoInfo& aVideoInfo,
+ const layers::TextureFactoryIdentifier& aIdentifier)
+{
+ RefPtr<VideoDecoderManagerChild> manager = VideoDecoderManagerChild::GetSingleton();
+ // If the manager isn't available, then don't initialize mIPDLSelfRef and leave
+ // us in an error state. We'll then immediately reject the promise when Init()
+ // is called and the caller can try again. Hopefully by then the new manager is
+ // ready, or we've notified the caller of it being no longer available.
+ // If not, then the cycle repeats until we're ready.
+ if (!manager || !manager->CanSend()) {
+ return;
+ }
+
+ mIPDLSelfRef = this;
+ mCallback = aCallback;
+ mVideoInfo = aVideoInfo;
+ mIdentifier = aIdentifier;
+ if (manager->SendPVideoDecoderConstructor(this)) {
+ mCanSend = true;
+ }
+}
+
+void
+VideoDecoderChild::DestroyIPDL()
+{
+ if (mCanSend) {
+ PVideoDecoderChild::Send__delete__(this);
+ }
+}
+
+void
+VideoDecoderChild::IPDLActorDestroyed()
+{
+ mIPDLSelfRef = nullptr;
+}
+
+// MediaDataDecoder methods
+
+RefPtr<MediaDataDecoder::InitPromise>
+VideoDecoderChild::Init()
+{
+ AssertOnManagerThread();
+
+ if (!mIPDLSelfRef) {
+ return MediaDataDecoder::InitPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_DECODE_ERR, __func__);
+ }
+ // If we failed to send this, then we'll still resolve the Init promise
+ // as ActorDestroy handles it.
+ if (mCanSend) {
+ SendInit(mVideoInfo, mIdentifier);
+ }
+ return mInitPromise.Ensure(__func__);
+}
+
+void
+VideoDecoderChild::Input(MediaRawData* aSample)
+{
+ AssertOnManagerThread();
+ if (!mCanSend) {
+ return;
+ }
+
+ // TODO: It would be nice to add an allocator method to
+ // MediaDataDecoder so that the demuxer could write directly
+ // into shmem rather than requiring a copy here.
+ Shmem buffer;
+ if (!AllocShmem(aSample->Size(), Shmem::SharedMemory::TYPE_BASIC, &buffer)) {
+ mCallback->Error(NS_ERROR_DOM_MEDIA_DECODE_ERR);
+ return;
+ }
+
+ memcpy(buffer.get<uint8_t>(), aSample->Data(), aSample->Size());
+
+ MediaRawDataIPDL sample(MediaDataIPDL(aSample->mOffset,
+ aSample->mTime,
+ aSample->mTimecode,
+ aSample->mDuration,
+ aSample->mFrames,
+ aSample->mKeyframe),
+ buffer);
+ SendInput(sample);
+}
+
+void
+VideoDecoderChild::Flush()
+{
+ AssertOnManagerThread();
+ if (mCanSend) {
+ SendFlush();
+ }
+}
+
+void
+VideoDecoderChild::Drain()
+{
+ AssertOnManagerThread();
+ if (mCanSend) {
+ SendDrain();
+ }
+}
+
+void
+VideoDecoderChild::Shutdown()
+{
+ AssertOnManagerThread();
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ if (mCanSend) {
+ SendShutdown();
+ }
+ mInitialized = false;
+}
+
+bool
+VideoDecoderChild::IsHardwareAccelerated(nsACString& aFailureReason) const
+{
+ aFailureReason = mHardwareAcceleratedReason;
+ return mIsHardwareAccelerated;
+}
+
+void
+VideoDecoderChild::SetSeekThreshold(const media::TimeUnit& aTime)
+{
+ AssertOnManagerThread();
+ if (mCanSend) {
+ SendSetSeekThreshold(aTime.ToMicroseconds());
+ }
+}
+
+void
+VideoDecoderChild::AssertOnManagerThread()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == mThread);
+}
+
+VideoDecoderManagerChild*
+VideoDecoderChild::GetManager()
+{
+ if (!mCanSend) {
+ return nullptr;
+ }
+ return static_cast<VideoDecoderManagerChild*>(Manager());
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/VideoDecoderChild.h b/dom/media/ipc/VideoDecoderChild.h
new file mode 100644
index 000000000..a38e3e31c
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderChild.h
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef include_dom_ipc_VideoDecoderChild_h
+#define include_dom_ipc_VideoDecoderChild_h
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/dom/PVideoDecoderChild.h"
+#include "MediaData.h"
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+namespace dom {
+
+class RemoteVideoDecoder;
+class RemoteDecoderModule;
+class VideoDecoderManagerChild;
+
+class VideoDecoderChild final : public PVideoDecoderChild
+{
+public:
+ explicit VideoDecoderChild();
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoDecoderChild)
+
+ // PVideoDecoderChild
+ bool RecvOutput(const VideoDataIPDL& aData) override;
+ bool RecvInputExhausted() override;
+ bool RecvDrainComplete() override;
+ bool RecvError(const nsresult& aError) override;
+ bool RecvInitComplete(const bool& aHardware, const nsCString& aHardwareReason) override;
+ bool RecvInitFailed(const nsresult& aReason) override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ RefPtr<MediaDataDecoder::InitPromise> Init();
+ void Input(MediaRawData* aSample);
+ void Flush();
+ void Drain();
+ void Shutdown();
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const;
+ void SetSeekThreshold(const media::TimeUnit& aTime);
+
+ MOZ_IS_CLASS_INIT
+ void InitIPDL(MediaDataDecoderCallback* aCallback,
+ const VideoInfo& aVideoInfo,
+ const layers::TextureFactoryIdentifier& aIdentifier);
+ void DestroyIPDL();
+
+ // Called from IPDL when our actor has been destroyed
+ void IPDLActorDestroyed();
+
+ VideoDecoderManagerChild* GetManager();
+
+private:
+ ~VideoDecoderChild();
+
+ void AssertOnManagerThread();
+
+ RefPtr<VideoDecoderChild> mIPDLSelfRef;
+ RefPtr<nsIThread> mThread;
+
+ MediaDataDecoderCallback* mCallback;
+
+ MozPromiseHolder<MediaDataDecoder::InitPromise> mInitPromise;
+
+ VideoInfo mVideoInfo;
+ layers::TextureFactoryIdentifier mIdentifier;
+ nsCString mHardwareAcceleratedReason;
+ bool mCanSend;
+ bool mInitialized;
+ bool mIsHardwareAccelerated;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // include_dom_ipc_VideoDecoderChild_h
diff --git a/dom/media/ipc/VideoDecoderManagerChild.cpp b/dom/media/ipc/VideoDecoderManagerChild.cpp
new file mode 100644
index 000000000..e444fae15
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderManagerChild.cpp
@@ -0,0 +1,267 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "VideoDecoderManagerChild.h"
+#include "VideoDecoderChild.h"
+#include "mozilla/dom/ContentChild.h"
+#include "MediaPrefs.h"
+#include "nsThreadUtils.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/ipc/ProtocolUtils.h"
+#include "mozilla/layers/SynchronousTask.h"
+#include "mozilla/gfx/DataSurfaceHelpers.h"
+#include "mozilla/layers/ISurfaceAllocator.h"
+#include "base/task.h"
+
+namespace mozilla {
+namespace dom {
+
+using namespace ipc;
+using namespace layers;
+using namespace gfx;
+
+// Only modified on the main-thread
+StaticRefPtr<nsIThread> sVideoDecoderChildThread;
+StaticRefPtr<AbstractThread> sVideoDecoderChildAbstractThread;
+
+// Only accessed from sVideoDecoderChildThread
+static StaticRefPtr<VideoDecoderManagerChild> sDecoderManager;
+static UniquePtr<nsTArray<RefPtr<Runnable>>> sRecreateTasks;
+
+/* static */ void
+VideoDecoderManagerChild::InitializeThread()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!sVideoDecoderChildThread) {
+ RefPtr<nsIThread> childThread;
+ nsresult rv = NS_NewNamedThread("VideoChild", getter_AddRefs(childThread));
+ NS_ENSURE_SUCCESS_VOID(rv);
+ sVideoDecoderChildThread = childThread;
+
+ sVideoDecoderChildAbstractThread =
+ AbstractThread::CreateXPCOMThreadWrapper(childThread, false);
+
+ sRecreateTasks = MakeUnique<nsTArray<RefPtr<Runnable>>>();
+ }
+}
+
+/* static */ void
+VideoDecoderManagerChild::InitForContent(Endpoint<PVideoDecoderManagerChild>&& aVideoManager)
+{
+ InitializeThread();
+ sVideoDecoderChildThread->Dispatch(NewRunnableFunction(&Open, Move(aVideoManager)), NS_DISPATCH_NORMAL);
+}
+
+/* static */ void
+VideoDecoderManagerChild::Shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (sVideoDecoderChildThread) {
+ sVideoDecoderChildThread->Dispatch(NS_NewRunnableFunction([]() {
+ if (sDecoderManager && sDecoderManager->CanSend()) {
+ sDecoderManager->Close();
+ sDecoderManager = nullptr;
+ }
+ }), NS_DISPATCH_NORMAL);
+
+ sVideoDecoderChildAbstractThread = nullptr;
+ sVideoDecoderChildThread->Shutdown();
+ sVideoDecoderChildThread = nullptr;
+
+ sRecreateTasks = nullptr;
+ }
+}
+
+void
+VideoDecoderManagerChild::RunWhenRecreated(already_AddRefed<Runnable> aTask)
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == GetManagerThread());
+
+ // If we've already been recreated, then run the task immediately.
+ if (sDecoderManager && sDecoderManager != this && sDecoderManager->CanSend()) {
+ RefPtr<Runnable> task = aTask;
+ task->Run();
+ } else {
+ sRecreateTasks->AppendElement(aTask);
+ }
+}
+
+
+/* static */ VideoDecoderManagerChild*
+VideoDecoderManagerChild::GetSingleton()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == GetManagerThread());
+ return sDecoderManager;
+}
+
+/* static */ nsIThread*
+VideoDecoderManagerChild::GetManagerThread()
+{
+ return sVideoDecoderChildThread;
+}
+
+/* static */ AbstractThread*
+VideoDecoderManagerChild::GetManagerAbstractThread()
+{
+ return sVideoDecoderChildAbstractThread;
+}
+
+PVideoDecoderChild*
+VideoDecoderManagerChild::AllocPVideoDecoderChild()
+{
+ return new VideoDecoderChild();
+}
+
+bool
+VideoDecoderManagerChild::DeallocPVideoDecoderChild(PVideoDecoderChild* actor)
+{
+ VideoDecoderChild* child = static_cast<VideoDecoderChild*>(actor);
+ child->IPDLActorDestroyed();
+ return true;
+}
+
+void
+VideoDecoderManagerChild::Open(Endpoint<PVideoDecoderManagerChild>&& aEndpoint)
+{
+ // Make sure we always dispatch everything in sRecreateTasks, even if we
+ // fail since this is as close to being recreated as we will ever be.
+ sDecoderManager = nullptr;
+ if (aEndpoint.IsValid()) {
+ RefPtr<VideoDecoderManagerChild> manager = new VideoDecoderManagerChild();
+ if (aEndpoint.Bind(manager)) {
+ sDecoderManager = manager;
+ manager->InitIPDL();
+ }
+ }
+ for (Runnable* task : *sRecreateTasks) {
+ task->Run();
+ }
+ sRecreateTasks->Clear();
+}
+
+void
+VideoDecoderManagerChild::InitIPDL()
+{
+ mCanSend = true;
+ mIPDLSelfRef = this;
+}
+
+void
+VideoDecoderManagerChild::ActorDestroy(ActorDestroyReason aWhy)
+{
+ mCanSend = false;
+}
+
+void
+VideoDecoderManagerChild::DeallocPVideoDecoderManagerChild()
+{
+ mIPDLSelfRef = nullptr;
+}
+
+bool
+VideoDecoderManagerChild::CanSend()
+{
+ MOZ_ASSERT(NS_GetCurrentThread() == GetManagerThread());
+ return mCanSend;
+}
+
+bool
+VideoDecoderManagerChild::DeallocShmem(mozilla::ipc::Shmem& aShmem)
+{
+ if (NS_GetCurrentThread() != sVideoDecoderChildThread) {
+ RefPtr<VideoDecoderManagerChild> self = this;
+ mozilla::ipc::Shmem shmem = aShmem;
+ sVideoDecoderChildThread->Dispatch(NS_NewRunnableFunction([self, shmem]() {
+ if (self->CanSend()) {
+ mozilla::ipc::Shmem shmemCopy = shmem;
+ self->DeallocShmem(shmemCopy);
+ }
+ }), NS_DISPATCH_NORMAL);
+ return true;
+ }
+ return PVideoDecoderManagerChild::DeallocShmem(aShmem);
+}
+
+struct SurfaceDescriptorUserData
+{
+ SurfaceDescriptorUserData(VideoDecoderManagerChild* aAllocator, SurfaceDescriptor& aSD)
+ : mAllocator(aAllocator)
+ , mSD(aSD)
+ {}
+ ~SurfaceDescriptorUserData()
+ {
+ DestroySurfaceDescriptor(mAllocator, &mSD);
+ }
+
+ RefPtr<VideoDecoderManagerChild> mAllocator;
+ SurfaceDescriptor mSD;
+};
+
+void DeleteSurfaceDescriptorUserData(void* aClosure)
+{
+ SurfaceDescriptorUserData* sd = reinterpret_cast<SurfaceDescriptorUserData*>(aClosure);
+ delete sd;
+}
+
+already_AddRefed<SourceSurface>
+VideoDecoderManagerChild::Readback(const SurfaceDescriptorGPUVideo& aSD)
+{
+ // We can't use NS_DISPATCH_SYNC here since that can spin the event
+ // loop while it waits. This function can be called from JS and we
+ // don't want that to happen.
+ SynchronousTask task("Readback sync");
+
+ RefPtr<VideoDecoderManagerChild> ref = this;
+ SurfaceDescriptor sd;
+ sVideoDecoderChildThread->Dispatch(NS_NewRunnableFunction([&]() {
+ AutoCompleteTask complete(&task);
+ if (ref->CanSend()) {
+ ref->SendReadback(aSD, &sd);
+ }
+ }), NS_DISPATCH_NORMAL);
+
+ task.Wait();
+
+ if (!IsSurfaceDescriptorValid(sd)) {
+ return nullptr;
+ }
+
+ RefPtr<DataSourceSurface> source = GetSurfaceForDescriptor(sd);
+ if (!source) {
+ DestroySurfaceDescriptor(this, &sd);
+ NS_WARNING("Failed to map SurfaceDescriptor in Readback");
+ return nullptr;
+ }
+
+ static UserDataKey sSurfaceDescriptor;
+ source->AddUserData(&sSurfaceDescriptor,
+ new SurfaceDescriptorUserData(this, sd),
+ DeleteSurfaceDescriptorUserData);
+
+ return source.forget();
+}
+
+void
+VideoDecoderManagerChild::DeallocateSurfaceDescriptorGPUVideo(const SurfaceDescriptorGPUVideo& aSD)
+{
+ RefPtr<VideoDecoderManagerChild> ref = this;
+ SurfaceDescriptorGPUVideo sd = Move(aSD);
+ sVideoDecoderChildThread->Dispatch(NS_NewRunnableFunction([ref, sd]() {
+ if (ref->CanSend()) {
+ ref->SendDeallocateSurfaceDescriptorGPUVideo(sd);
+ }
+ }), NS_DISPATCH_NORMAL);
+}
+
+void
+VideoDecoderManagerChild::HandleFatalError(const char* aName, const char* aMsg) const
+{
+ dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid());
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/VideoDecoderManagerChild.h b/dom/media/ipc/VideoDecoderManagerChild.h
new file mode 100644
index 000000000..1e67a590e
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderManagerChild.h
@@ -0,0 +1,96 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef include_dom_ipc_VideoDecoderManagerChild_h
+#define include_dom_ipc_VideoDecoderManagerChild_h
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/dom/PVideoDecoderManagerChild.h"
+
+namespace mozilla {
+namespace gfx {
+class SourceSurface;
+}
+namespace dom {
+
+class VideoDecoderManagerChild final : public PVideoDecoderManagerChild
+ , public mozilla::ipc::IShmemAllocator
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoDecoderManagerChild)
+
+ // Can only be called from the manager thread
+ static VideoDecoderManagerChild* GetSingleton();
+
+ // Can be called from any thread.
+ static nsIThread* GetManagerThread();
+ static AbstractThread* GetManagerAbstractThread();
+
+ // Can be called from any thread, dispatches the request to the IPDL thread internally
+ // and will be ignored if the IPDL actor has been destroyed.
+ already_AddRefed<gfx::SourceSurface> Readback(const SurfaceDescriptorGPUVideo& aSD);
+ void DeallocateSurfaceDescriptorGPUVideo(const SurfaceDescriptorGPUVideo& aSD);
+
+ bool AllocShmem(size_t aSize,
+ mozilla::ipc::SharedMemory::SharedMemoryType aShmType,
+ mozilla::ipc::Shmem* aShmem) override
+ {
+ return PVideoDecoderManagerChild::AllocShmem(aSize, aShmType, aShmem);
+ }
+ bool AllocUnsafeShmem(size_t aSize,
+ mozilla::ipc::SharedMemory::SharedMemoryType aShmType,
+ mozilla::ipc::Shmem* aShmem) override
+ {
+ return PVideoDecoderManagerChild::AllocUnsafeShmem(aSize, aShmType, aShmem);
+ }
+
+ // Can be called from any thread, dispatches the request to the IPDL thread internally
+ // and will be ignored if the IPDL actor has been destroyed.
+ bool DeallocShmem(mozilla::ipc::Shmem& aShmem) override;
+
+ // Main thread only
+ static void InitForContent(Endpoint<PVideoDecoderManagerChild>&& aVideoManager);
+ static void Shutdown();
+
+ // Run aTask (on the manager thread) when we next attempt to create a new manager
+ // (even if creation fails). Intended to be called from ActorDestroy when we get
+ // notified that the old manager is being destroyed.
+ // Can only be called from the manager thread.
+ void RunWhenRecreated(already_AddRefed<Runnable> aTask);
+
+ bool CanSend();
+
+protected:
+ void InitIPDL();
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ void DeallocPVideoDecoderManagerChild() override;
+
+ void HandleFatalError(const char* aName, const char* aMsg) const override;
+
+ PVideoDecoderChild* AllocPVideoDecoderChild() override;
+ bool DeallocPVideoDecoderChild(PVideoDecoderChild* actor) override;
+
+private:
+ // Main thread only
+ static void InitializeThread();
+
+ VideoDecoderManagerChild()
+ : mCanSend(false)
+ {}
+ ~VideoDecoderManagerChild() {}
+
+ static void Open(Endpoint<PVideoDecoderManagerChild>&& aEndpoint);
+
+ RefPtr<VideoDecoderManagerChild> mIPDLSelfRef;
+
+ // Should only ever be accessed on the manager thread.
+ bool mCanSend;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // include_dom_ipc_VideoDecoderManagerChild_h
diff --git a/dom/media/ipc/VideoDecoderManagerParent.cpp b/dom/media/ipc/VideoDecoderManagerParent.cpp
new file mode 100644
index 000000000..a111b5e53
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderManagerParent.cpp
@@ -0,0 +1,238 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "VideoDecoderManagerParent.h"
+#include "VideoDecoderParent.h"
+#include "base/thread.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/Services.h"
+#include "mozilla/Observer.h"
+#include "nsIObserverService.h"
+#include "nsIObserver.h"
+#include "nsIEventTarget.h"
+#include "nsThreadUtils.h"
+#include "ImageContainer.h"
+#include "mozilla/layers/VideoBridgeChild.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/layers/ImageDataSerializer.h"
+#include "mozilla/SyncRunnable.h"
+
+#if XP_WIN
+#include <objbase.h>
+#endif
+
+namespace mozilla {
+namespace dom {
+
+using base::Thread;
+using namespace ipc;
+using namespace layers;
+using namespace gfx;
+
+SurfaceDescriptorGPUVideo
+VideoDecoderManagerParent::StoreImage(Image* aImage, TextureClient* aTexture)
+{
+ mImageMap[aTexture->GetSerial()] = aImage;
+ mTextureMap[aTexture->GetSerial()] = aTexture;
+ return SurfaceDescriptorGPUVideo(aTexture->GetSerial());
+}
+
+StaticRefPtr<nsIThread> sVideoDecoderManagerThread;
+StaticRefPtr<TaskQueue> sManagerTaskQueue;
+
+class ManagerThreadShutdownObserver : public nsIObserver
+{
+ virtual ~ManagerThreadShutdownObserver() {}
+public:
+ ManagerThreadShutdownObserver() {}
+
+ NS_DECL_ISUPPORTS
+
+ NS_IMETHOD Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData) override
+ {
+ MOZ_ASSERT(strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0);
+
+ VideoDecoderManagerParent::ShutdownThreads();
+ return NS_OK;
+ }
+};
+NS_IMPL_ISUPPORTS(ManagerThreadShutdownObserver, nsIObserver);
+
+void
+VideoDecoderManagerParent::StartupThreads()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (sVideoDecoderManagerThread) {
+ return;
+ }
+
+ nsCOMPtr<nsIObserverService> observerService = services::GetObserverService();
+ if (!observerService) {
+ return;
+ }
+
+ RefPtr<nsIThread> managerThread;
+ nsresult rv = NS_NewNamedThread("VideoParent", getter_AddRefs(managerThread));
+ if (NS_FAILED(rv)) {
+ return;
+ }
+ sVideoDecoderManagerThread = managerThread;
+#if XP_WIN
+ sVideoDecoderManagerThread->Dispatch(NS_NewRunnableFunction([]() {
+ HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
+ MOZ_ASSERT(hr == S_OK);
+ }), NS_DISPATCH_NORMAL);
+#endif
+ sVideoDecoderManagerThread->Dispatch(NS_NewRunnableFunction([]() {
+ layers::VideoBridgeChild::Startup();
+ }), NS_DISPATCH_NORMAL);
+
+ sManagerTaskQueue = new TaskQueue(managerThread.forget());
+
+ ManagerThreadShutdownObserver* obs = new ManagerThreadShutdownObserver();
+ observerService->AddObserver(obs, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
+}
+
+void
+VideoDecoderManagerParent::ShutdownThreads()
+{
+ sManagerTaskQueue->BeginShutdown();
+ sManagerTaskQueue->AwaitShutdownAndIdle();
+ sManagerTaskQueue = nullptr;
+
+ sVideoDecoderManagerThread->Shutdown();
+ sVideoDecoderManagerThread = nullptr;
+}
+
+void
+VideoDecoderManagerParent::ShutdownVideoBridge()
+{
+ if (sVideoDecoderManagerThread) {
+ RefPtr<Runnable> task = NS_NewRunnableFunction([]() {
+ VideoBridgeChild::Shutdown();
+ });
+ SyncRunnable::DispatchToThread(sVideoDecoderManagerThread, task);
+ }
+}
+
+bool
+VideoDecoderManagerParent::OnManagerThread()
+{
+ return NS_GetCurrentThread() == sVideoDecoderManagerThread;
+}
+
+bool
+VideoDecoderManagerParent::CreateForContent(Endpoint<PVideoDecoderManagerParent>&& aEndpoint)
+{
+ MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU);
+ MOZ_ASSERT(NS_IsMainThread());
+
+ StartupThreads();
+ if (!sVideoDecoderManagerThread) {
+ return false;
+ }
+
+ RefPtr<VideoDecoderManagerParent> parent = new VideoDecoderManagerParent();
+
+ RefPtr<Runnable> task = NewRunnableMethod<Endpoint<PVideoDecoderManagerParent>&&>(
+ parent, &VideoDecoderManagerParent::Open, Move(aEndpoint));
+ sVideoDecoderManagerThread->Dispatch(task.forget(), NS_DISPATCH_NORMAL);
+ return true;
+}
+
+VideoDecoderManagerParent::VideoDecoderManagerParent()
+{
+ MOZ_COUNT_CTOR(VideoDecoderManagerParent);
+}
+
+VideoDecoderManagerParent::~VideoDecoderManagerParent()
+{
+ MOZ_COUNT_DTOR(VideoDecoderManagerParent);
+}
+
+PVideoDecoderParent*
+VideoDecoderManagerParent::AllocPVideoDecoderParent()
+{
+ return new VideoDecoderParent(this, sManagerTaskQueue, new TaskQueue(SharedThreadPool::Get(NS_LITERAL_CSTRING("VideoDecoderParent"), 4)));
+}
+
+bool
+VideoDecoderManagerParent::DeallocPVideoDecoderParent(PVideoDecoderParent* actor)
+{
+ VideoDecoderParent* parent = static_cast<VideoDecoderParent*>(actor);
+ parent->Destroy();
+ return true;
+}
+
+void
+VideoDecoderManagerParent::Open(Endpoint<PVideoDecoderManagerParent>&& aEndpoint)
+{
+ if (!aEndpoint.Bind(this)) {
+ // We can't recover from this.
+ MOZ_CRASH("Failed to bind VideoDecoderManagerParent to endpoint");
+ }
+ AddRef();
+}
+
+void
+VideoDecoderManagerParent::DeallocPVideoDecoderManagerParent()
+{
+ Release();
+}
+
+bool
+VideoDecoderManagerParent::RecvReadback(const SurfaceDescriptorGPUVideo& aSD, SurfaceDescriptor* aResult)
+{
+ RefPtr<Image> image = mImageMap[aSD.handle()];
+ if (!image) {
+ *aResult = null_t();
+ return true;
+ }
+
+ RefPtr<SourceSurface> source = image->GetAsSourceSurface();
+ if (!image) {
+ *aResult = null_t();
+ return true;
+ }
+
+ SurfaceFormat format = source->GetFormat();
+ IntSize size = source->GetSize();
+ size_t length = ImageDataSerializer::ComputeRGBBufferSize(size, format);
+
+ Shmem buffer;
+ if (!length || !AllocShmem(length, Shmem::SharedMemory::TYPE_BASIC, &buffer)) {
+ *aResult = null_t();
+ return true;
+ }
+
+ RefPtr<DrawTarget> dt = Factory::CreateDrawTargetForData(gfx::BackendType::CAIRO,
+ buffer.get<uint8_t>(), size,
+ ImageDataSerializer::ComputeRGBStride(format, size.width),
+ format);
+ if (!dt) {
+ DeallocShmem(buffer);
+ *aResult = null_t();
+ return true;
+ }
+
+ dt->CopySurface(source, IntRect(0, 0, size.width, size.height), IntPoint());
+ dt->Flush();
+
+ *aResult = SurfaceDescriptorBuffer(RGBDescriptor(size, format, true), MemoryOrShmem(buffer));
+ return true;
+}
+
+bool
+VideoDecoderManagerParent::RecvDeallocateSurfaceDescriptorGPUVideo(const SurfaceDescriptorGPUVideo& aSD)
+{
+ mImageMap.erase(aSD.handle());
+ mTextureMap.erase(aSD.handle());
+ return true;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/VideoDecoderManagerParent.h b/dom/media/ipc/VideoDecoderManagerParent.h
new file mode 100644
index 000000000..b140c7ce3
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderManagerParent.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef include_dom_ipc_VideoDecoderManagerParent_h
+#define include_dom_ipc_VideoDecoderManagerParent_h
+
+#include "mozilla/dom/PVideoDecoderManagerParent.h"
+
+namespace mozilla {
+namespace dom {
+
+class VideoDecoderManagerParent final : public PVideoDecoderManagerParent
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoDecoderManagerParent)
+
+ static bool CreateForContent(Endpoint<PVideoDecoderManagerParent>&& aEndpoint);
+
+ // Can be called from any thread
+ SurfaceDescriptorGPUVideo StoreImage(layers::Image* aImage, layers::TextureClient* aTexture);
+
+ static void StartupThreads();
+ static void ShutdownThreads();
+
+ static void ShutdownVideoBridge();
+
+ bool OnManagerThread();
+
+protected:
+ PVideoDecoderParent* AllocPVideoDecoderParent() override;
+ bool DeallocPVideoDecoderParent(PVideoDecoderParent* actor) override;
+
+ bool RecvReadback(const SurfaceDescriptorGPUVideo& aSD, SurfaceDescriptor* aResult) override;
+ bool RecvDeallocateSurfaceDescriptorGPUVideo(const SurfaceDescriptorGPUVideo& aSD) override;
+
+ void ActorDestroy(mozilla::ipc::IProtocol::ActorDestroyReason) override {}
+
+ void DeallocPVideoDecoderManagerParent() override;
+
+ private:
+ VideoDecoderManagerParent();
+ ~VideoDecoderManagerParent();
+
+ void Open(Endpoint<PVideoDecoderManagerParent>&& aEndpoint);
+
+ std::map<uint64_t, RefPtr<layers::Image>> mImageMap;
+ std::map<uint64_t, RefPtr<layers::TextureClient>> mTextureMap;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // include_dom_ipc_VideoDecoderManagerParent_h
diff --git a/dom/media/ipc/VideoDecoderParent.cpp b/dom/media/ipc/VideoDecoderParent.cpp
new file mode 100644
index 000000000..c96edb044
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderParent.cpp
@@ -0,0 +1,280 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "VideoDecoderParent.h"
+#include "mozilla/Unused.h"
+#include "mozilla/layers/CompositorThread.h"
+#include "base/thread.h"
+#include "mozilla/layers/TextureClient.h"
+#include "mozilla/layers/VideoBridgeChild.h"
+#include "mozilla/layers/ImageClient.h"
+#include "MediaInfo.h"
+#include "VideoDecoderManagerParent.h"
+#ifdef XP_WIN
+#include "WMFDecoderModule.h"
+#endif
+
+namespace mozilla {
+namespace dom {
+
+using base::Thread;
+using namespace ipc;
+using namespace layers;
+using namespace gfx;
+
+class KnowsCompositorVideo : public layers::KnowsCompositor
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(KnowsCompositorVideo, override)
+
+ layers::TextureForwarder* GetTextureForwarder() override
+ {
+ return VideoBridgeChild::GetSingleton();
+ }
+ layers::LayersIPCActor* GetLayersIPCActor() override
+ {
+ return VideoBridgeChild::GetSingleton();
+ }
+private:
+ virtual ~KnowsCompositorVideo() {}
+};
+
+VideoDecoderParent::VideoDecoderParent(VideoDecoderManagerParent* aParent,
+ TaskQueue* aManagerTaskQueue,
+ TaskQueue* aDecodeTaskQueue)
+ : mParent(aParent)
+ , mManagerTaskQueue(aManagerTaskQueue)
+ , mDecodeTaskQueue(aDecodeTaskQueue)
+ , mKnowsCompositor(new KnowsCompositorVideo)
+ , mDestroyed(false)
+{
+ MOZ_COUNT_CTOR(VideoDecoderParent);
+ // We hold a reference to ourselves to keep us alive until IPDL
+ // explictly destroys us. There may still be refs held by
+ // tasks, but no new ones should be added after we're
+ // destroyed.
+ mIPDLSelfRef = this;
+}
+
+VideoDecoderParent::~VideoDecoderParent()
+{
+ MOZ_COUNT_DTOR(VideoDecoderParent);
+}
+
+void
+VideoDecoderParent::Destroy()
+{
+ mDecodeTaskQueue->AwaitShutdownAndIdle();
+ mDestroyed = true;
+ mIPDLSelfRef = nullptr;
+}
+
+bool
+VideoDecoderParent::RecvInit(const VideoInfo& aInfo, const layers::TextureFactoryIdentifier& aIdentifier)
+{
+ mKnowsCompositor->IdentifyTextureHost(aIdentifier);
+
+#ifdef XP_WIN
+ // TODO: Ideally we wouldn't hardcode the WMF PDM, and we'd use the normal PDM
+ // factory logic for picking a decoder.
+ WMFDecoderModule::Init();
+ RefPtr<WMFDecoderModule> pdm(new WMFDecoderModule());
+ pdm->Startup();
+
+ CreateDecoderParams params(aInfo);
+ params.mTaskQueue = mDecodeTaskQueue;
+ params.mCallback = this;
+ params.mKnowsCompositor = mKnowsCompositor;
+ params.mImageContainer = new layers::ImageContainer();
+
+ mDecoder = pdm->CreateVideoDecoder(params);
+ if (!mDecoder) {
+ Unused << SendInitFailed(NS_ERROR_DOM_MEDIA_FATAL_ERR);
+ return true;
+ }
+#else
+ MOZ_ASSERT(false, "Can't use RemoteVideoDecoder on non-Windows platforms yet");
+#endif
+
+ RefPtr<VideoDecoderParent> self = this;
+ mDecoder->Init()->Then(mManagerTaskQueue, __func__,
+ [self] (TrackInfo::TrackType aTrack) {
+ if (!self->mDestroyed) {
+ nsCString hardwareReason;
+ bool hardwareAccelerated = self->mDecoder->IsHardwareAccelerated(hardwareReason);
+ Unused << self->SendInitComplete(hardwareAccelerated, hardwareReason);
+ }
+ },
+ [self] (MediaResult aReason) {
+ if (!self->mDestroyed) {
+ Unused << self->SendInitFailed(aReason);
+ }
+ });
+ return true;
+}
+
+bool
+VideoDecoderParent::RecvInput(const MediaRawDataIPDL& aData)
+{
+ // XXX: This copies the data into a buffer owned by the MediaRawData. Ideally we'd just take ownership
+ // of the shmem.
+ RefPtr<MediaRawData> data = new MediaRawData(aData.buffer().get<uint8_t>(),
+ aData.buffer().Size<uint8_t>());
+ if (aData.buffer().Size<uint8_t>() && !data->Data()) {
+ // OOM
+ Error(NS_ERROR_OUT_OF_MEMORY);
+ return true;
+ }
+ data->mOffset = aData.base().offset();
+ data->mTime = aData.base().time();
+ data->mTimecode = aData.base().timecode();
+ data->mDuration = aData.base().duration();
+ data->mKeyframe = aData.base().keyframe();
+
+ DeallocShmem(aData.buffer());
+
+ mDecoder->Input(data);
+ return true;
+}
+
+bool
+VideoDecoderParent::RecvFlush()
+{
+ MOZ_ASSERT(!mDestroyed);
+ if (mDecoder) {
+ mDecoder->Flush();
+ }
+ return true;
+}
+
+bool
+VideoDecoderParent::RecvDrain()
+{
+ MOZ_ASSERT(!mDestroyed);
+ mDecoder->Drain();
+ return true;
+}
+
+bool
+VideoDecoderParent::RecvShutdown()
+{
+ MOZ_ASSERT(!mDestroyed);
+ if (mDecoder) {
+ mDecoder->Shutdown();
+ }
+ mDecoder = nullptr;
+ return true;
+}
+
+bool
+VideoDecoderParent::RecvSetSeekThreshold(const int64_t& aTime)
+{
+ MOZ_ASSERT(!mDestroyed);
+ mDecoder->SetSeekThreshold(media::TimeUnit::FromMicroseconds(aTime));
+ return true;
+}
+
+void
+VideoDecoderParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ MOZ_ASSERT(!mDestroyed);
+ if (mDecoder) {
+ mDecoder->Shutdown();
+ mDecoder = nullptr;
+ }
+ if (mDecodeTaskQueue) {
+ mDecodeTaskQueue->BeginShutdown();
+ }
+}
+
+void
+VideoDecoderParent::Output(MediaData* aData)
+{
+ MOZ_ASSERT(mDecodeTaskQueue->IsCurrentThreadIn());
+ RefPtr<VideoDecoderParent> self = this;
+ RefPtr<KnowsCompositor> knowsCompositor = mKnowsCompositor;
+ RefPtr<MediaData> data = aData;
+ mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self, knowsCompositor, data]() {
+ if (self->mDestroyed) {
+ return;
+ }
+
+ MOZ_ASSERT(data->mType == MediaData::VIDEO_DATA, "Can only decode videos using VideoDecoderParent!");
+ VideoData* video = static_cast<VideoData*>(data.get());
+
+ MOZ_ASSERT(video->mImage, "Decoded video must output a layer::Image to be used with VideoDecoderParent");
+
+ RefPtr<TextureClient> texture = video->mImage->GetTextureClient(knowsCompositor);
+
+ if (!texture) {
+ texture = ImageClient::CreateTextureClientForImage(video->mImage, knowsCompositor);
+ }
+
+ if (texture && !texture->IsAddedToCompositableClient()) {
+ texture->InitIPDLActor(knowsCompositor);
+ texture->SetAddedToCompositableClient();
+ }
+
+ VideoDataIPDL output(MediaDataIPDL(data->mOffset,
+ data->mTime,
+ data->mTimecode,
+ data->mDuration,
+ data->mFrames,
+ data->mKeyframe),
+ video->mDisplay,
+ texture ? self->mParent->StoreImage(video->mImage, texture) : SurfaceDescriptorGPUVideo(0),
+ video->mFrameID);
+ Unused << self->SendOutput(output);
+ }));
+}
+
+void
+VideoDecoderParent::Error(const MediaResult& aError)
+{
+ MOZ_ASSERT(mDecodeTaskQueue->IsCurrentThreadIn());
+ RefPtr<VideoDecoderParent> self = this;
+ MediaResult error = aError;
+ mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self, error]() {
+ if (!self->mDestroyed) {
+ Unused << self->SendError(error);
+ }
+ }));
+}
+
+void
+VideoDecoderParent::InputExhausted()
+{
+ MOZ_ASSERT(mDecodeTaskQueue->IsCurrentThreadIn());
+ RefPtr<VideoDecoderParent> self = this;
+ mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self]() {
+ if (!self->mDestroyed) {
+ Unused << self->SendInputExhausted();
+ }
+ }));
+}
+
+void
+VideoDecoderParent::DrainComplete()
+{
+ MOZ_ASSERT(mDecodeTaskQueue->IsCurrentThreadIn());
+ RefPtr<VideoDecoderParent> self = this;
+ mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self]() {
+ if (!self->mDestroyed) {
+ Unused << self->SendDrainComplete();
+ }
+ }));
+}
+
+bool
+VideoDecoderParent::OnReaderTaskQueue()
+{
+ // Most of our calls into mDecoder come directly from IPDL so are on
+ // the right thread, but not actually on the task queue. We only ever
+ // run a single thread, not a pool, so this should work fine.
+ return mParent->OnManagerThread();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/ipc/VideoDecoderParent.h b/dom/media/ipc/VideoDecoderParent.h
new file mode 100644
index 000000000..ea99d0a10
--- /dev/null
+++ b/dom/media/ipc/VideoDecoderParent.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef include_dom_ipc_VideoDecoderParent_h
+#define include_dom_ipc_VideoDecoderParent_h
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/dom/PVideoDecoderParent.h"
+#include "mozilla/layers/TextureForwarder.h"
+#include "VideoDecoderManagerParent.h"
+#include "MediaData.h"
+#include "ImageContainer.h"
+
+namespace mozilla {
+namespace dom {
+
+class KnowsCompositorVideo;
+
+class VideoDecoderParent final : public PVideoDecoderParent,
+ public MediaDataDecoderCallback
+{
+public:
+ // We refcount this class since the task queue can have runnables
+ // that reference us.
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoDecoderParent)
+
+ VideoDecoderParent(VideoDecoderManagerParent* aParent,
+ TaskQueue* aManagerTaskQueue,
+ TaskQueue* aDecodeTaskQueue);
+
+ void Destroy();
+
+ // PVideoDecoderParent
+ bool RecvInit(const VideoInfo& aVideoInfo, const layers::TextureFactoryIdentifier& aIdentifier) override;
+ bool RecvInput(const MediaRawDataIPDL& aData) override;
+ bool RecvFlush() override;
+ bool RecvDrain() override;
+ bool RecvShutdown() override;
+ bool RecvSetSeekThreshold(const int64_t& aTime) override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ // MediaDataDecoderCallback
+ void Output(MediaData* aData) override;
+ void Error(const MediaResult& aError) override;
+ void InputExhausted() override;
+ void DrainComplete() override;
+ bool OnReaderTaskQueue() override;
+
+private:
+ ~VideoDecoderParent();
+
+ RefPtr<VideoDecoderManagerParent> mParent;
+ RefPtr<VideoDecoderParent> mIPDLSelfRef;
+ RefPtr<TaskQueue> mManagerTaskQueue;
+ RefPtr<TaskQueue> mDecodeTaskQueue;
+ RefPtr<MediaDataDecoder> mDecoder;
+ RefPtr<KnowsCompositorVideo> mKnowsCompositor;
+
+ // Can only be accessed from the manager thread
+ bool mDestroyed;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // include_dom_ipc_VideoDecoderParent_h
diff --git a/dom/media/ipc/moz.build b/dom/media/ipc/moz.build
new file mode 100644
index 000000000..2e78460b5
--- /dev/null
+++ b/dom/media/ipc/moz.build
@@ -0,0 +1,31 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+IPDL_SOURCES += [
+ 'PVideoDecoder.ipdl',
+ 'PVideoDecoderManager.ipdl',
+]
+
+EXPORTS.mozilla.dom += [
+ 'MediaIPCUtils.h',
+ 'RemoteVideoDecoder.h',
+ 'VideoDecoderManagerChild.h',
+ 'VideoDecoderManagerParent.h',
+]
+
+SOURCES += [
+ 'RemoteVideoDecoder.cpp',
+ 'VideoDecoderChild.cpp',
+ 'VideoDecoderManagerChild.cpp',
+ 'VideoDecoderManagerParent.cpp',
+ 'VideoDecoderParent.cpp',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/mediasink/AudioSink.h b/dom/media/mediasink/AudioSink.h
new file mode 100644
index 000000000..4f124d31f
--- /dev/null
+++ b/dom/media/mediasink/AudioSink.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(AudioSink_h__)
+#define AudioSink_h__
+
+#include "mozilla/MozPromise.h"
+#include "mozilla/RefPtr.h"
+#include "nsISupportsImpl.h"
+
+#include "MediaSink.h"
+
+namespace mozilla {
+
+class MediaData;
+template <class T> class MediaQueue;
+
+namespace media {
+
+/*
+ * Define basic APIs for derived class instance to operate or obtain
+ * information from it.
+ */
+class AudioSink {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioSink)
+ AudioSink(MediaQueue<MediaData>& aAudioQueue)
+ : mAudioQueue(aAudioQueue)
+ {}
+
+ typedef MediaSink::PlaybackParams PlaybackParams;
+
+ // Return a promise which will be resolved when AudioSink finishes playing,
+ // or rejected if any error.
+ virtual RefPtr<GenericPromise> Init(const PlaybackParams& aParams) = 0;
+
+ virtual int64_t GetEndTime() const = 0;
+ virtual int64_t GetPosition() = 0;
+
+ // Check whether we've pushed more frames to the audio
+ // hardware than it has played.
+ virtual bool HasUnplayedFrames() = 0;
+
+ // Shut down the AudioSink's resources.
+ virtual void Shutdown() = 0;
+
+ // Change audio playback setting.
+ virtual void SetVolume(double aVolume) = 0;
+ virtual void SetPlaybackRate(double aPlaybackRate) = 0;
+ virtual void SetPreservesPitch(bool aPreservesPitch) = 0;
+
+ // Change audio playback status pause/resume.
+ virtual void SetPlaying(bool aPlaying) = 0;
+
+protected:
+ virtual ~AudioSink() {}
+
+ virtual MediaQueue<MediaData>& AudioQueue() const {
+ return mAudioQueue;
+ }
+
+ // To queue audio data (no matter it's plain or encoded or encrypted, depends
+ // on the subclass)
+ MediaQueue<MediaData>& mAudioQueue;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/mediasink/AudioSinkWrapper.cpp b/dom/media/mediasink/AudioSinkWrapper.cpp
new file mode 100644
index 000000000..a2dfcd8fb
--- /dev/null
+++ b/dom/media/mediasink/AudioSinkWrapper.cpp
@@ -0,0 +1,248 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioSink.h"
+#include "AudioSinkWrapper.h"
+
+namespace mozilla {
+namespace media {
+
+AudioSinkWrapper::~AudioSinkWrapper()
+{
+}
+
+void
+AudioSinkWrapper::Shutdown()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mIsStarted, "Must be called after playback stopped.");
+ mCreator = nullptr;
+}
+
+const MediaSink::PlaybackParams&
+AudioSinkWrapper::GetPlaybackParams() const
+{
+ AssertOwnerThread();
+ return mParams;
+}
+
+void
+AudioSinkWrapper::SetPlaybackParams(const PlaybackParams& aParams)
+{
+ AssertOwnerThread();
+ if (mAudioSink) {
+ mAudioSink->SetVolume(aParams.mVolume);
+ mAudioSink->SetPlaybackRate(aParams.mPlaybackRate);
+ mAudioSink->SetPreservesPitch(aParams.mPreservesPitch);
+ }
+ mParams = aParams;
+}
+
+RefPtr<GenericPromise>
+AudioSinkWrapper::OnEnded(TrackType aType)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsStarted, "Must be called after playback starts.");
+ if (aType == TrackInfo::kAudioTrack) {
+ return mEndPromise;
+ }
+ return nullptr;
+}
+
+int64_t
+AudioSinkWrapper::GetEndTime(TrackType aType) const
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsStarted, "Must be called after playback starts.");
+ if (aType == TrackInfo::kAudioTrack && mAudioSink) {
+ return mAudioSink->GetEndTime();
+ }
+ return -1;
+}
+
+int64_t
+AudioSinkWrapper::GetVideoPosition(TimeStamp aNow) const
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mPlayStartTime.IsNull());
+ // Time elapsed since we started playing.
+ int64_t delta = (aNow - mPlayStartTime).ToMicroseconds();
+ // Take playback rate into account.
+ return mPlayDuration + delta * mParams.mPlaybackRate;
+}
+
+int64_t
+AudioSinkWrapper::GetPosition(TimeStamp* aTimeStamp) const
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsStarted, "Must be called after playback starts.");
+
+ int64_t pos = -1;
+ TimeStamp t = TimeStamp::Now();
+
+ if (!mAudioEnded) {
+ // Rely on the audio sink to report playback position when it is not ended.
+ pos = mAudioSink->GetPosition();
+ } else if (!mPlayStartTime.IsNull()) {
+ // Calculate playback position using system clock if we are still playing.
+ pos = GetVideoPosition(t);
+ } else {
+ // Return how long we've played if we are not playing.
+ pos = mPlayDuration;
+ }
+
+ if (aTimeStamp) {
+ *aTimeStamp = t;
+ }
+
+ return pos;
+}
+
+bool
+AudioSinkWrapper::HasUnplayedFrames(TrackType aType) const
+{
+ AssertOwnerThread();
+ return mAudioSink ? mAudioSink->HasUnplayedFrames() : false;
+}
+
+void
+AudioSinkWrapper::SetVolume(double aVolume)
+{
+ AssertOwnerThread();
+ mParams.mVolume = aVolume;
+ if (mAudioSink) {
+ mAudioSink->SetVolume(aVolume);
+ }
+}
+
+void
+AudioSinkWrapper::SetPlaybackRate(double aPlaybackRate)
+{
+ AssertOwnerThread();
+ if (!mAudioEnded) {
+ // Pass the playback rate to the audio sink. The underlying AudioStream
+ // will handle playback rate changes and report correct audio position.
+ mAudioSink->SetPlaybackRate(aPlaybackRate);
+ } else if (!mPlayStartTime.IsNull()) {
+ // Adjust playback duration and start time when we are still playing.
+ TimeStamp now = TimeStamp::Now();
+ mPlayDuration = GetVideoPosition(now);
+ mPlayStartTime = now;
+ }
+ // mParams.mPlaybackRate affects GetVideoPosition(). It should be updated
+ // after the calls to GetVideoPosition();
+ mParams.mPlaybackRate = aPlaybackRate;
+
+ // Do nothing when not playing. Changes in playback rate will be taken into
+ // account by GetVideoPosition().
+}
+
+void
+AudioSinkWrapper::SetPreservesPitch(bool aPreservesPitch)
+{
+ AssertOwnerThread();
+ mParams.mPreservesPitch = aPreservesPitch;
+ if (mAudioSink) {
+ mAudioSink->SetPreservesPitch(aPreservesPitch);
+ }
+}
+
+void
+AudioSinkWrapper::SetPlaying(bool aPlaying)
+{
+ AssertOwnerThread();
+
+ // Resume/pause matters only when playback started.
+ if (!mIsStarted) {
+ return;
+ }
+
+ if (mAudioSink) {
+ mAudioSink->SetPlaying(aPlaying);
+ }
+
+ if (aPlaying) {
+ MOZ_ASSERT(mPlayStartTime.IsNull());
+ mPlayStartTime = TimeStamp::Now();
+ } else {
+ // Remember how long we've played.
+ mPlayDuration = GetPosition();
+ // mPlayStartTime must be updated later since GetPosition()
+ // depends on the value of mPlayStartTime.
+ mPlayStartTime = TimeStamp();
+ }
+}
+
+void
+AudioSinkWrapper::Start(int64_t aStartTime, const MediaInfo& aInfo)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mIsStarted, "playback already started.");
+
+ mIsStarted = true;
+ mPlayDuration = aStartTime;
+ mPlayStartTime = TimeStamp::Now();
+
+ // no audio is equivalent to audio ended before video starts.
+ mAudioEnded = !aInfo.HasAudio();
+
+ if (aInfo.HasAudio()) {
+ mAudioSink = mCreator->Create();
+ mEndPromise = mAudioSink->Init(mParams);
+
+ mAudioSinkPromise.Begin(mEndPromise->Then(
+ mOwnerThread.get(), __func__, this,
+ &AudioSinkWrapper::OnAudioEnded,
+ &AudioSinkWrapper::OnAudioEnded));
+ }
+}
+
+void
+AudioSinkWrapper::Stop()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mIsStarted, "playback not started.");
+
+ mIsStarted = false;
+ mAudioEnded = true;
+
+ if (mAudioSink) {
+ mAudioSinkPromise.DisconnectIfExists();
+ mAudioSink->Shutdown();
+ mAudioSink = nullptr;
+ mEndPromise = nullptr;
+ }
+}
+
+bool
+AudioSinkWrapper::IsStarted() const
+{
+ AssertOwnerThread();
+ return mIsStarted;
+}
+
+bool
+AudioSinkWrapper::IsPlaying() const
+{
+ AssertOwnerThread();
+ return IsStarted() && !mPlayStartTime.IsNull();
+}
+
+void
+AudioSinkWrapper::OnAudioEnded()
+{
+ AssertOwnerThread();
+ mAudioSinkPromise.Complete();
+ mPlayDuration = GetPosition();
+ if (!mPlayStartTime.IsNull()) {
+ mPlayStartTime = TimeStamp::Now();
+ }
+ mAudioEnded = true;
+}
+
+} // namespace media
+} // namespace mozilla
+
diff --git a/dom/media/mediasink/AudioSinkWrapper.h b/dom/media/mediasink/AudioSinkWrapper.h
new file mode 100644
index 000000000..46d402ee6
--- /dev/null
+++ b/dom/media/mediasink/AudioSinkWrapper.h
@@ -0,0 +1,108 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioSinkWrapper_h_
+#define AudioSinkWrapper_h_
+
+#include "mozilla/AbstractThread.h"
+#include "mozilla/dom/AudioChannelBinding.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/TimeStamp.h"
+#include "mozilla/UniquePtr.h"
+
+#include "MediaSink.h"
+
+namespace mozilla {
+
+class MediaData;
+template <class T> class MediaQueue;
+
+namespace media {
+
+class AudioSink;
+
+/**
+ * A wrapper around AudioSink to provide the interface of MediaSink.
+ */
+class AudioSinkWrapper : public MediaSink {
+ // An AudioSink factory.
+ class Creator {
+ public:
+ virtual ~Creator() {}
+ virtual AudioSink* Create() = 0;
+ };
+
+ // Wrap around a function object which creates AudioSinks.
+ template <typename Function>
+ class CreatorImpl : public Creator {
+ public:
+ explicit CreatorImpl(const Function& aFunc) : mFunction(aFunc) {}
+ AudioSink* Create() override { return mFunction(); }
+ private:
+ Function mFunction;
+ };
+
+public:
+ template <typename Function>
+ AudioSinkWrapper(AbstractThread* aOwnerThread, const Function& aFunc)
+ : mOwnerThread(aOwnerThread)
+ , mCreator(new CreatorImpl<Function>(aFunc))
+ , mIsStarted(false)
+ // Give an insane value to facilitate debug if used before playback starts.
+ , mPlayDuration(INT64_MAX)
+ , mAudioEnded(true)
+ {}
+
+ const PlaybackParams& GetPlaybackParams() const override;
+ void SetPlaybackParams(const PlaybackParams& aParams) override;
+
+ RefPtr<GenericPromise> OnEnded(TrackType aType) override;
+ int64_t GetEndTime(TrackType aType) const override;
+ int64_t GetPosition(TimeStamp* aTimeStamp = nullptr) const override;
+ bool HasUnplayedFrames(TrackType aType) const override;
+
+ void SetVolume(double aVolume) override;
+ void SetPlaybackRate(double aPlaybackRate) override;
+ void SetPreservesPitch(bool aPreservesPitch) override;
+ void SetPlaying(bool aPlaying) override;
+
+ void Start(int64_t aStartTime, const MediaInfo& aInfo) override;
+ void Stop() override;
+ bool IsStarted() const override;
+ bool IsPlaying() const override;
+
+ void Shutdown() override;
+
+private:
+ virtual ~AudioSinkWrapper();
+
+ void AssertOwnerThread() const {
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ }
+
+ int64_t GetVideoPosition(TimeStamp aNow) const;
+
+ void OnAudioEnded();
+
+ const RefPtr<AbstractThread> mOwnerThread;
+ UniquePtr<Creator> mCreator;
+ RefPtr<AudioSink> mAudioSink;
+ RefPtr<GenericPromise> mEndPromise;
+
+ bool mIsStarted;
+ PlaybackParams mParams;
+
+ TimeStamp mPlayStartTime;
+ int64_t mPlayDuration;
+
+ bool mAudioEnded;
+ MozPromiseRequestHolder<GenericPromise> mAudioSinkPromise;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif //AudioSinkWrapper_h_
diff --git a/dom/media/mediasink/DecodedAudioDataSink.cpp b/dom/media/mediasink/DecodedAudioDataSink.cpp
new file mode 100644
index 000000000..e7fcffe4f
--- /dev/null
+++ b/dom/media/mediasink/DecodedAudioDataSink.cpp
@@ -0,0 +1,561 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsPrintfCString.h"
+#include "MediaQueue.h"
+#include "DecodedAudioDataSink.h"
+#include "VideoUtils.h"
+#include "AudioConverter.h"
+
+#include "mozilla/CheckedInt.h"
+#include "mozilla/DebugOnly.h"
+#include "MediaPrefs.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+#define SINK_LOG(msg, ...) \
+ MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, \
+ ("DecodedAudioDataSink=%p " msg, this, ##__VA_ARGS__))
+#define SINK_LOG_V(msg, ...) \
+ MOZ_LOG(gMediaDecoderLog, LogLevel::Verbose, \
+ ("DecodedAudioDataSink=%p " msg, this, ##__VA_ARGS__))
+
+namespace media {
+
+// The amount of audio frames that is used to fuzz rounding errors.
+static const int64_t AUDIO_FUZZ_FRAMES = 1;
+
+// Amount of audio frames we will be processing ahead of use
+static const int32_t LOW_AUDIO_USECS = 300000;
+
+DecodedAudioDataSink::DecodedAudioDataSink(AbstractThread* aThread,
+ MediaQueue<MediaData>& aAudioQueue,
+ int64_t aStartTime,
+ const AudioInfo& aInfo,
+ dom::AudioChannel aChannel)
+ : AudioSink(aAudioQueue)
+ , mStartTime(aStartTime)
+ , mLastGoodPosition(0)
+ , mInfo(aInfo)
+ , mChannel(aChannel)
+ , mPlaying(true)
+ , mMonitor("DecodedAudioDataSink")
+ , mWritten(0)
+ , mErrored(false)
+ , mPlaybackComplete(false)
+ , mOwnerThread(aThread)
+ , mProcessedQueueLength(0)
+ , mFramesParsed(0)
+ , mLastEndTime(0)
+ , mIsAudioDataAudible(false)
+{
+ bool resampling = MediaPrefs::AudioSinkResampling();
+
+ if (resampling) {
+ mOutputRate = MediaPrefs::AudioSinkResampleRate();
+ } else if (mInfo.mRate == 44100 || mInfo.mRate == 48000) {
+ // The original rate is of good quality and we want to minimize unecessary
+ // resampling. The common scenario being that the sampling rate is one or
+ // the other, this allows to minimize audio quality regression and hoping
+ // content provider want change from those rates mid-stream.
+ mOutputRate = mInfo.mRate;
+ } else {
+ // We will resample all data to match cubeb's preferred sampling rate.
+ mOutputRate = AudioStream::GetPreferredRate();
+ }
+ MOZ_DIAGNOSTIC_ASSERT(mOutputRate, "output rate can't be 0.");
+
+ bool monoAudioEnabled = MediaPrefs::MonoAudio();
+
+ mOutputChannels = monoAudioEnabled
+ ? 1 : (MediaPrefs::AudioSinkForceStereo() ? 2 : mInfo.mChannels);
+}
+
+DecodedAudioDataSink::~DecodedAudioDataSink()
+{
+}
+
+RefPtr<GenericPromise>
+DecodedAudioDataSink::Init(const PlaybackParams& aParams)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+
+ mAudioQueueListener = mAudioQueue.PushEvent().Connect(
+ mOwnerThread, this, &DecodedAudioDataSink::OnAudioPushed);
+ mAudioQueueFinishListener = mAudioQueue.FinishEvent().Connect(
+ mOwnerThread, this, &DecodedAudioDataSink::NotifyAudioNeeded);
+ mProcessedQueueListener = mProcessedQueue.PopEvent().Connect(
+ mOwnerThread, this, &DecodedAudioDataSink::OnAudioPopped);
+
+ // To ensure at least one audio packet will be popped from AudioQueue and
+ // ready to be played.
+ NotifyAudioNeeded();
+ RefPtr<GenericPromise> p = mEndPromise.Ensure(__func__);
+ nsresult rv = InitializeAudioStream(aParams);
+ if (NS_FAILED(rv)) {
+ mEndPromise.Reject(rv, __func__);
+ }
+ return p;
+}
+
+int64_t
+DecodedAudioDataSink::GetPosition()
+{
+ int64_t pos;
+ if (mAudioStream &&
+ (pos = mAudioStream->GetPosition()) >= 0) {
+ NS_ASSERTION(pos >= mLastGoodPosition,
+ "AudioStream position shouldn't go backward");
+ // Update the last good position when we got a good one.
+ if (pos >= mLastGoodPosition) {
+ mLastGoodPosition = pos;
+ }
+ }
+
+ return mStartTime + mLastGoodPosition;
+}
+
+bool
+DecodedAudioDataSink::HasUnplayedFrames()
+{
+ // Experimentation suggests that GetPositionInFrames() is zero-indexed,
+ // so we need to add 1 here before comparing it to mWritten.
+ int64_t total;
+ {
+ MonitorAutoLock mon(mMonitor);
+ total = mWritten + (mCursor.get() ? mCursor->Available() : 0);
+ }
+ return mProcessedQueue.GetSize() ||
+ (mAudioStream && mAudioStream->GetPositionInFrames() + 1 < total);
+}
+
+void
+DecodedAudioDataSink::Shutdown()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+
+ mAudioQueueListener.Disconnect();
+ mAudioQueueFinishListener.Disconnect();
+ mProcessedQueueListener.Disconnect();
+
+ if (mAudioStream) {
+ mAudioStream->Shutdown();
+ mAudioStream = nullptr;
+ }
+ mProcessedQueue.Reset();
+ mProcessedQueue.Finish();
+ mEndPromise.ResolveIfExists(true, __func__);
+}
+
+void
+DecodedAudioDataSink::SetVolume(double aVolume)
+{
+ if (mAudioStream) {
+ mAudioStream->SetVolume(aVolume);
+ }
+}
+
+void
+DecodedAudioDataSink::SetPlaybackRate(double aPlaybackRate)
+{
+ MOZ_ASSERT(aPlaybackRate != 0, "Don't set the playbackRate to 0 on AudioStream");
+ if (mAudioStream) {
+ mAudioStream->SetPlaybackRate(aPlaybackRate);
+ }
+}
+
+void
+DecodedAudioDataSink::SetPreservesPitch(bool aPreservesPitch)
+{
+ if (mAudioStream) {
+ mAudioStream->SetPreservesPitch(aPreservesPitch);
+ }
+}
+
+void
+DecodedAudioDataSink::SetPlaying(bool aPlaying)
+{
+ if (!mAudioStream || mPlaying == aPlaying || mPlaybackComplete) {
+ return;
+ }
+ // pause/resume AudioStream as necessary.
+ if (!aPlaying) {
+ mAudioStream->Pause();
+ } else if (aPlaying) {
+ mAudioStream->Resume();
+ }
+ mPlaying = aPlaying;
+}
+
+nsresult
+DecodedAudioDataSink::InitializeAudioStream(const PlaybackParams& aParams)
+{
+ mAudioStream = new AudioStream(*this);
+ nsresult rv = mAudioStream->Init(mOutputChannels, mOutputRate, mChannel);
+ if (NS_FAILED(rv)) {
+ mAudioStream->Shutdown();
+ mAudioStream = nullptr;
+ return rv;
+ }
+
+ // Set playback params before calling Start() so they can take effect
+ // as soon as the 1st DataCallback of the AudioStream fires.
+ mAudioStream->SetVolume(aParams.mVolume);
+ mAudioStream->SetPlaybackRate(aParams.mPlaybackRate);
+ mAudioStream->SetPreservesPitch(aParams.mPreservesPitch);
+ mAudioStream->Start();
+
+ return NS_OK;
+}
+
+int64_t
+DecodedAudioDataSink::GetEndTime() const
+{
+ int64_t written;
+ {
+ MonitorAutoLock mon(mMonitor);
+ written = mWritten;
+ }
+ CheckedInt64 playedUsecs = FramesToUsecs(written, mOutputRate) + mStartTime;
+ if (!playedUsecs.isValid()) {
+ NS_WARNING("Int overflow calculating audio end time");
+ return -1;
+ }
+ // As we may be resampling, rounding errors may occur. Ensure we never get
+ // past the original end time.
+ return std::min<int64_t>(mLastEndTime, playedUsecs.value());
+}
+
+UniquePtr<AudioStream::Chunk>
+DecodedAudioDataSink::PopFrames(uint32_t aFrames)
+{
+ class Chunk : public AudioStream::Chunk {
+ public:
+ Chunk(AudioData* aBuffer, uint32_t aFrames, AudioDataValue* aData)
+ : mBuffer(aBuffer), mFrames(aFrames), mData(aData) {}
+ Chunk() : mFrames(0), mData(nullptr) {}
+ const AudioDataValue* Data() const { return mData; }
+ uint32_t Frames() const { return mFrames; }
+ uint32_t Channels() const { return mBuffer ? mBuffer->mChannels: 0; }
+ uint32_t Rate() const { return mBuffer ? mBuffer->mRate : 0; }
+ AudioDataValue* GetWritable() const { return mData; }
+ private:
+ const RefPtr<AudioData> mBuffer;
+ const uint32_t mFrames;
+ AudioDataValue* const mData;
+ };
+
+ class SilentChunk : public AudioStream::Chunk {
+ public:
+ SilentChunk(uint32_t aFrames, uint32_t aChannels, uint32_t aRate)
+ : mFrames(aFrames)
+ , mChannels(aChannels)
+ , mRate(aRate)
+ , mData(MakeUnique<AudioDataValue[]>(aChannels * aFrames)) {
+ memset(mData.get(), 0, aChannels * aFrames * sizeof(AudioDataValue));
+ }
+ const AudioDataValue* Data() const { return mData.get(); }
+ uint32_t Frames() const { return mFrames; }
+ uint32_t Channels() const { return mChannels; }
+ uint32_t Rate() const { return mRate; }
+ AudioDataValue* GetWritable() const { return mData.get(); }
+ private:
+ const uint32_t mFrames;
+ const uint32_t mChannels;
+ const uint32_t mRate;
+ UniquePtr<AudioDataValue[]> mData;
+ };
+
+ bool needPopping = false;
+ if (!mCurrentData) {
+ // No data in the queue. Return an empty chunk.
+ if (!mProcessedQueue.GetSize()) {
+ return MakeUnique<Chunk>();
+ }
+
+ // We need to update our values prior popping the processed queue in
+ // order to prevent the pop event to fire too early (prior
+ // mProcessedQueueLength being updated) or prevent HasUnplayedFrames
+ // to incorrectly return true during the time interval betweeen the
+ // when mProcessedQueue is read and mWritten is updated.
+ needPopping = true;
+ mCurrentData = mProcessedQueue.PeekFront();
+ {
+ MonitorAutoLock mon(mMonitor);
+ mCursor = MakeUnique<AudioBufferCursor>(mCurrentData->mAudioData.get(),
+ mCurrentData->mChannels,
+ mCurrentData->mFrames);
+ }
+ MOZ_ASSERT(mCurrentData->mFrames > 0);
+ mProcessedQueueLength -=
+ FramesToUsecs(mCurrentData->mFrames, mOutputRate).value();
+ }
+
+ auto framesToPop = std::min(aFrames, mCursor->Available());
+
+ SINK_LOG_V("playing audio at time=%lld offset=%u length=%u",
+ mCurrentData->mTime, mCurrentData->mFrames - mCursor->Available(), framesToPop);
+
+ UniquePtr<AudioStream::Chunk> chunk =
+ MakeUnique<Chunk>(mCurrentData, framesToPop, mCursor->Ptr());
+
+ {
+ MonitorAutoLock mon(mMonitor);
+ mWritten += framesToPop;
+ mCursor->Advance(framesToPop);
+ }
+
+ // All frames are popped. Reset mCurrentData so we can pop new elements from
+ // the audio queue in next calls to PopFrames().
+ if (!mCursor->Available()) {
+ mCurrentData = nullptr;
+ }
+
+ if (needPopping) {
+ // We can now safely pop the audio packet from the processed queue.
+ // This will fire the popped event, triggering a call to NotifyAudioNeeded.
+ RefPtr<AudioData> releaseMe = mProcessedQueue.PopFront();
+ CheckIsAudible(releaseMe);
+ }
+
+ return chunk;
+}
+
+bool
+DecodedAudioDataSink::Ended() const
+{
+ // Return true when error encountered so AudioStream can start draining.
+ return mProcessedQueue.IsFinished() || mErrored;
+}
+
+void
+DecodedAudioDataSink::Drained()
+{
+ SINK_LOG("Drained");
+ mPlaybackComplete = true;
+ mEndPromise.ResolveIfExists(true, __func__);
+}
+
+void
+DecodedAudioDataSink::CheckIsAudible(const AudioData* aData)
+{
+ MOZ_ASSERT(aData);
+
+ bool isAudible = aData->IsAudible();
+ if (isAudible != mIsAudioDataAudible) {
+ mIsAudioDataAudible = isAudible;
+ mAudibleEvent.Notify(mIsAudioDataAudible);
+ }
+}
+
+void
+DecodedAudioDataSink::OnAudioPopped(const RefPtr<MediaData>& aSample)
+{
+ SINK_LOG_V("AudioStream has used an audio packet.");
+ NotifyAudioNeeded();
+}
+
+void
+DecodedAudioDataSink::OnAudioPushed(const RefPtr<MediaData>& aSample)
+{
+ SINK_LOG_V("One new audio packet available.");
+ NotifyAudioNeeded();
+}
+
+void
+DecodedAudioDataSink::NotifyAudioNeeded()
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn(),
+ "Not called from the owner's thread");
+
+ // Always ensure we have two processed frames pending to allow for processing
+ // latency.
+ while (AudioQueue().GetSize() && (AudioQueue().IsFinished() ||
+ mProcessedQueueLength < LOW_AUDIO_USECS ||
+ mProcessedQueue.GetSize() < 2)) {
+ RefPtr<AudioData> data =
+ dont_AddRef(AudioQueue().PopFront().take()->As<AudioData>());
+
+ // Ignore the element with 0 frames and try next.
+ if (!data->mFrames) {
+ continue;
+ }
+
+ if (!mConverter ||
+ (data->mRate != mConverter->InputConfig().Rate() ||
+ data->mChannels != mConverter->InputConfig().Channels())) {
+ SINK_LOG_V("Audio format changed from %u@%uHz to %u@%uHz",
+ mConverter? mConverter->InputConfig().Channels() : 0,
+ mConverter ? mConverter->InputConfig().Rate() : 0,
+ data->mChannels, data->mRate);
+
+ DrainConverter();
+
+ // mFramesParsed indicates the current playtime in frames at the current
+ // input sampling rate. Recalculate it per the new sampling rate.
+ if (mFramesParsed) {
+ // We minimize overflow.
+ uint32_t oldRate = mConverter->InputConfig().Rate();
+ uint32_t newRate = data->mRate;
+ CheckedInt64 result = SaferMultDiv(mFramesParsed, newRate, oldRate);
+ if (!result.isValid()) {
+ NS_WARNING("Int overflow in DecodedAudioDataSink");
+ mErrored = true;
+ return;
+ }
+ mFramesParsed = result.value();
+ }
+
+ mConverter =
+ MakeUnique<AudioConverter>(
+ AudioConfig(data->mChannels, data->mRate),
+ AudioConfig(mOutputChannels, mOutputRate));
+ }
+
+ // See if there's a gap in the audio. If there is, push silence into the
+ // audio hardware, so we can play across the gap.
+ // Calculate the timestamp of the next chunk of audio in numbers of
+ // samples.
+ CheckedInt64 sampleTime = UsecsToFrames(data->mTime - mStartTime,
+ data->mRate);
+ // Calculate the number of frames that have been pushed onto the audio hardware.
+ CheckedInt64 missingFrames = sampleTime - mFramesParsed;
+
+ if (!missingFrames.isValid()) {
+ NS_WARNING("Int overflow in DecodedAudioDataSink");
+ mErrored = true;
+ return;
+ }
+
+ if (missingFrames.value() > AUDIO_FUZZ_FRAMES) {
+ // The next audio packet begins some time after the end of the last packet
+ // we pushed to the audio hardware. We must push silence into the audio
+ // hardware so that the next audio packet begins playback at the correct
+ // time.
+ missingFrames = std::min<int64_t>(INT32_MAX, missingFrames.value());
+ mFramesParsed += missingFrames.value();
+
+ // We need to calculate how many frames are missing at the output rate.
+ missingFrames =
+ SaferMultDiv(missingFrames.value(), mOutputRate, data->mRate);
+ if (!missingFrames.isValid()) {
+ NS_WARNING("Int overflow in DecodedAudioDataSink");
+ mErrored = true;
+ return;
+ }
+
+ // We need to insert silence, first use drained frames if any.
+ missingFrames -= DrainConverter(missingFrames.value());
+ // Insert silence if still needed.
+ if (missingFrames.value()) {
+ AlignedAudioBuffer silenceData(missingFrames.value() * mOutputChannels);
+ if (!silenceData) {
+ NS_WARNING("OOM in DecodedAudioDataSink");
+ mErrored = true;
+ return;
+ }
+ RefPtr<AudioData> silence = CreateAudioFromBuffer(Move(silenceData), data);
+ PushProcessedAudio(silence);
+ }
+ }
+
+ mLastEndTime = data->GetEndTime();
+ mFramesParsed += data->mFrames;
+
+ if (mConverter->InputConfig() != mConverter->OutputConfig()) {
+ // We must ensure that the size in the buffer contains exactly the number
+ // of frames, in case one of the audio producer over allocated the buffer.
+ AlignedAudioBuffer buffer(Move(data->mAudioData));
+ buffer.SetLength(size_t(data->mFrames) * data->mChannels);
+
+ AlignedAudioBuffer convertedData =
+ mConverter->Process(AudioSampleBuffer(Move(buffer))).Forget();
+ data = CreateAudioFromBuffer(Move(convertedData), data);
+ }
+ if (PushProcessedAudio(data)) {
+ mLastProcessedPacket = Some(data);
+ }
+ }
+
+ if (AudioQueue().IsFinished()) {
+ // We have reached the end of the data, drain the resampler.
+ DrainConverter();
+ mProcessedQueue.Finish();
+ }
+}
+
+uint32_t
+DecodedAudioDataSink::PushProcessedAudio(AudioData* aData)
+{
+ if (!aData || !aData->mFrames) {
+ return 0;
+ }
+ mProcessedQueue.Push(aData);
+ mProcessedQueueLength += FramesToUsecs(aData->mFrames, mOutputRate).value();
+ return aData->mFrames;
+}
+
+already_AddRefed<AudioData>
+DecodedAudioDataSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer,
+ AudioData* aReference)
+{
+ uint32_t frames = aBuffer.Length() / mOutputChannels;
+ if (!frames) {
+ return nullptr;
+ }
+ CheckedInt64 duration = FramesToUsecs(frames, mOutputRate);
+ if (!duration.isValid()) {
+ NS_WARNING("Int overflow in DecodedAudioDataSink");
+ mErrored = true;
+ return nullptr;
+ }
+ RefPtr<AudioData> data =
+ new AudioData(aReference->mOffset,
+ aReference->mTime,
+ duration.value(),
+ frames,
+ Move(aBuffer),
+ mOutputChannels,
+ mOutputRate);
+ return data.forget();
+}
+
+uint32_t
+DecodedAudioDataSink::DrainConverter(uint32_t aMaxFrames)
+{
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+
+ if (!mConverter || !mLastProcessedPacket || !aMaxFrames) {
+ // nothing to drain.
+ return 0;
+ }
+
+ RefPtr<AudioData> lastPacket = mLastProcessedPacket.ref();
+ mLastProcessedPacket.reset();
+
+ // To drain we simply provide an empty packet to the audio converter.
+ AlignedAudioBuffer convertedData =
+ mConverter->Process(AudioSampleBuffer(AlignedAudioBuffer())).Forget();
+
+ uint32_t frames = convertedData.Length() / mOutputChannels;
+ if (!convertedData.SetLength(std::min(frames, aMaxFrames) * mOutputChannels)) {
+ // This can never happen as we were reducing the length of convertData.
+ mErrored = true;
+ return 0;
+ }
+
+ RefPtr<AudioData> data =
+ CreateAudioFromBuffer(Move(convertedData), lastPacket);
+ if (!data) {
+ return 0;
+ }
+ mProcessedQueue.Push(data);
+ return data->mFrames;
+}
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/mediasink/DecodedAudioDataSink.h b/dom/media/mediasink/DecodedAudioDataSink.h
new file mode 100644
index 000000000..36412984a
--- /dev/null
+++ b/dom/media/mediasink/DecodedAudioDataSink.h
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(DecodedAudioDataSink_h__)
+#define DecodedAudioDataSink_h__
+
+#include "AudioSink.h"
+#include "AudioStream.h"
+#include "MediaEventSource.h"
+#include "MediaQueue.h"
+#include "MediaInfo.h"
+#include "mozilla/RefPtr.h"
+#include "nsISupportsImpl.h"
+
+#include "mozilla/dom/AudioChannelBinding.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/Monitor.h"
+
+namespace mozilla {
+
+class AudioConverter;
+
+namespace media {
+
+class DecodedAudioDataSink : public AudioSink,
+ private AudioStream::DataSource {
+public:
+ DecodedAudioDataSink(AbstractThread* aThread,
+ MediaQueue<MediaData>& aAudioQueue,
+ int64_t aStartTime,
+ const AudioInfo& aInfo,
+ dom::AudioChannel aChannel);
+
+ // Return a promise which will be resolved when DecodedAudioDataSink
+ // finishes playing, or rejected if any error.
+ RefPtr<GenericPromise> Init(const PlaybackParams& aParams) override;
+
+ /*
+ * All public functions are not thread-safe.
+ * Called on the task queue of MDSM only.
+ */
+ int64_t GetPosition() override;
+ int64_t GetEndTime() const override;
+
+ // Check whether we've pushed more frames to the audio hardware than it has
+ // played.
+ bool HasUnplayedFrames() override;
+
+ // Shut down the DecodedAudioDataSink's resources.
+ void Shutdown() override;
+
+ void SetVolume(double aVolume) override;
+ void SetPlaybackRate(double aPlaybackRate) override;
+ void SetPreservesPitch(bool aPreservesPitch) override;
+ void SetPlaying(bool aPlaying) override;
+
+ MediaEventSource<bool>& AudibleEvent() {
+ return mAudibleEvent;
+ }
+
+private:
+ virtual ~DecodedAudioDataSink();
+
+ // Allocate and initialize mAudioStream. Returns NS_OK on success.
+ nsresult InitializeAudioStream(const PlaybackParams& aParams);
+
+ // Interface of AudioStream::DataSource.
+ // Called on the callback thread of cubeb.
+ UniquePtr<AudioStream::Chunk> PopFrames(uint32_t aFrames) override;
+ bool Ended() const override;
+ void Drained() override;
+
+ void CheckIsAudible(const AudioData* aData);
+
+ // The audio stream resource. Used on the task queue of MDSM only.
+ RefPtr<AudioStream> mAudioStream;
+
+ // The presentation time of the first audio frame that was played in
+ // microseconds. We can add this to the audio stream position to determine
+ // the current audio time.
+ const int64_t mStartTime;
+
+ // Keep the last good position returned from the audio stream. Used to ensure
+ // position returned by GetPosition() is mono-increasing in spite of audio
+ // stream error. Used on the task queue of MDSM only.
+ int64_t mLastGoodPosition;
+
+ const AudioInfo mInfo;
+
+ const dom::AudioChannel mChannel;
+
+ // Used on the task queue of MDSM only.
+ bool mPlaying;
+
+ MozPromiseHolder<GenericPromise> mEndPromise;
+
+ /*
+ * Members to implement AudioStream::DataSource.
+ * Used on the callback thread of cubeb.
+ */
+ // The AudioData at which AudioStream::DataSource is reading.
+ RefPtr<AudioData> mCurrentData;
+
+ // Monitor protecting access to mCursor and mWritten.
+ // mCursor is created/destroyed on the cubeb thread, while we must also
+ // ensure that mWritten and mCursor::Available() get modified simultaneously.
+ // (written on cubeb thread, and read on MDSM task queue).
+ mutable Monitor mMonitor;
+ // Keep track of the read position of mCurrentData.
+ UniquePtr<AudioBufferCursor> mCursor;
+
+ // PCM frames written to the stream so far.
+ int64_t mWritten;
+
+ // True if there is any error in processing audio data like overflow.
+ Atomic<bool> mErrored;
+
+ // Set on the callback thread of cubeb once the stream has drained.
+ Atomic<bool> mPlaybackComplete;
+
+ const RefPtr<AbstractThread> mOwnerThread;
+
+ // Audio Processing objects and methods
+ void OnAudioPopped(const RefPtr<MediaData>& aSample);
+ void OnAudioPushed(const RefPtr<MediaData>& aSample);
+ void NotifyAudioNeeded();
+ // Drain the converter and add the output to the processed audio queue.
+ // A maximum of aMaxFrames will be added.
+ uint32_t DrainConverter(uint32_t aMaxFrames = UINT32_MAX);
+ already_AddRefed<AudioData> CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer,
+ AudioData* aReference);
+ // Add data to the processsed queue, update mProcessedQueueLength and
+ // return the number of frames added.
+ uint32_t PushProcessedAudio(AudioData* aData);
+ UniquePtr<AudioConverter> mConverter;
+ MediaQueue<AudioData> mProcessedQueue;
+ // Length in microseconds of the ProcessedQueue
+ Atomic<int32_t> mProcessedQueueLength;
+ MediaEventListener mAudioQueueListener;
+ MediaEventListener mAudioQueueFinishListener;
+ MediaEventListener mProcessedQueueListener;
+ // Number of frames processed from AudioQueue(). Used to determine gaps in
+ // the input stream. It indicates the time in frames since playback started
+ // at the current input framerate.
+ int64_t mFramesParsed;
+ Maybe<RefPtr<AudioData>> mLastProcessedPacket;
+ int64_t mLastEndTime;
+ // Never modifed after construction.
+ uint32_t mOutputRate;
+ uint32_t mOutputChannels;
+
+ // True when audio is producing audible sound, false when audio is silent.
+ bool mIsAudioDataAudible;
+
+ MediaEventProducer<bool> mAudibleEvent;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/mediasink/DecodedStream.cpp b/dom/media/mediasink/DecodedStream.cpp
new file mode 100644
index 000000000..9501a6cde
--- /dev/null
+++ b/dom/media/mediasink/DecodedStream.cpp
@@ -0,0 +1,781 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/CheckedInt.h"
+#include "mozilla/gfx/Point.h"
+#include "mozilla/SyncRunnable.h"
+
+#include "AudioSegment.h"
+#include "DecodedStream.h"
+#include "MediaData.h"
+#include "MediaQueue.h"
+#include "MediaStreamGraph.h"
+#include "MediaStreamListener.h"
+#include "OutputStreamManager.h"
+#include "SharedBuffer.h"
+#include "VideoSegment.h"
+#include "VideoUtils.h"
+
+namespace mozilla {
+
+#undef DUMP_LOG
+#define DUMP_LOG(x, ...) NS_DebugBreak(NS_DEBUG_WARNING, nsPrintfCString(x, ##__VA_ARGS__).get(), nullptr, nullptr, -1)
+
+/*
+ * A container class to make it easier to pass the playback info all the
+ * way to DecodedStreamGraphListener from DecodedStream.
+ */
+struct PlaybackInfoInit {
+ int64_t mStartTime;
+ MediaInfo mInfo;
+};
+
+class DecodedStreamGraphListener : public MediaStreamListener {
+public:
+ DecodedStreamGraphListener(MediaStream* aStream,
+ MozPromiseHolder<GenericPromise>&& aPromise)
+ : mMutex("DecodedStreamGraphListener::mMutex")
+ , mStream(aStream)
+ {
+ mFinishPromise = Move(aPromise);
+ }
+
+ void NotifyOutput(MediaStreamGraph* aGraph, GraphTime aCurrentTime) override
+ {
+ MutexAutoLock lock(mMutex);
+ if (mStream) {
+ int64_t t = mStream->StreamTimeToMicroseconds(
+ mStream->GraphTimeToStreamTime(aCurrentTime));
+ mOnOutput.Notify(t);
+ }
+ }
+
+ void NotifyEvent(MediaStreamGraph* aGraph, MediaStreamGraphEvent event) override
+ {
+ if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
+ nsCOMPtr<nsIRunnable> event =
+ NewRunnableMethod(this, &DecodedStreamGraphListener::DoNotifyFinished);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
+ }
+ }
+
+ void DoNotifyFinished()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mFinishPromise.ResolveIfExists(true, __func__);
+ }
+
+ void Forget()
+ {
+ RefPtr<DecodedStreamGraphListener> self = this;
+ AbstractThread::MainThread()->Dispatch(NS_NewRunnableFunction([self] () {
+ MOZ_ASSERT(NS_IsMainThread());
+ self->mFinishPromise.ResolveIfExists(true, __func__);
+ }));
+ MutexAutoLock lock(mMutex);
+ mStream = nullptr;
+ }
+
+ MediaEventSource<int64_t>& OnOutput()
+ {
+ return mOnOutput;
+ }
+
+private:
+ MediaEventProducer<int64_t> mOnOutput;
+
+ Mutex mMutex;
+ // Members below are protected by mMutex.
+ RefPtr<MediaStream> mStream;
+ // Main thread only.
+ MozPromiseHolder<GenericPromise> mFinishPromise;
+};
+
+static void
+UpdateStreamSuspended(MediaStream* aStream, bool aBlocking)
+{
+ if (NS_IsMainThread()) {
+ if (aBlocking) {
+ aStream->Suspend();
+ } else {
+ aStream->Resume();
+ }
+ } else {
+ nsCOMPtr<nsIRunnable> r;
+ if (aBlocking) {
+ r = NewRunnableMethod(aStream, &MediaStream::Suspend);
+ } else {
+ r = NewRunnableMethod(aStream, &MediaStream::Resume);
+ }
+ AbstractThread::MainThread()->Dispatch(r.forget());
+ }
+}
+
+/*
+ * All MediaStream-related data is protected by the decoder's monitor.
+ * We have at most one DecodedStreamDaata per MediaDecoder. Its stream
+ * is used as the input for each ProcessedMediaStream created by calls to
+ * captureStream(UntilEnded). Seeking creates a new source stream, as does
+ * replaying after the input as ended. In the latter case, the new source is
+ * not connected to streams created by captureStreamUntilEnded.
+ */
+class DecodedStreamData {
+public:
+ DecodedStreamData(OutputStreamManager* aOutputStreamManager,
+ PlaybackInfoInit&& aInit,
+ MozPromiseHolder<GenericPromise>&& aPromise);
+ ~DecodedStreamData();
+ void SetPlaying(bool aPlaying);
+ MediaEventSource<int64_t>& OnOutput();
+ void Forget();
+ void DumpDebugInfo();
+
+ /* The following group of fields are protected by the decoder's monitor
+ * and can be read or written on any thread.
+ */
+ // Count of audio frames written to the stream
+ int64_t mAudioFramesWritten;
+ // mNextVideoTime is the end timestamp for the last packet sent to the stream.
+ // Therefore video packets starting at or after this time need to be copied
+ // to the output stream.
+ int64_t mNextVideoTime; // microseconds
+ int64_t mNextAudioTime; // microseconds
+ // The last video image sent to the stream. Useful if we need to replicate
+ // the image.
+ RefPtr<layers::Image> mLastVideoImage;
+ gfx::IntSize mLastVideoImageDisplaySize;
+ bool mHaveSentFinish;
+ bool mHaveSentFinishAudio;
+ bool mHaveSentFinishVideo;
+
+ // The decoder is responsible for calling Destroy() on this stream.
+ const RefPtr<SourceMediaStream> mStream;
+ const RefPtr<DecodedStreamGraphListener> mListener;
+ bool mPlaying;
+ // True if we need to send a compensation video frame to ensure the
+ // StreamTime going forward.
+ bool mEOSVideoCompensation;
+
+ const RefPtr<OutputStreamManager> mOutputStreamManager;
+};
+
+DecodedStreamData::DecodedStreamData(OutputStreamManager* aOutputStreamManager,
+ PlaybackInfoInit&& aInit,
+ MozPromiseHolder<GenericPromise>&& aPromise)
+ : mAudioFramesWritten(0)
+ , mNextVideoTime(aInit.mStartTime)
+ , mNextAudioTime(aInit.mStartTime)
+ , mHaveSentFinish(false)
+ , mHaveSentFinishAudio(false)
+ , mHaveSentFinishVideo(false)
+ , mStream(aOutputStreamManager->Graph()->CreateSourceStream())
+ // DecodedStreamGraphListener will resolve this promise.
+ , mListener(new DecodedStreamGraphListener(mStream, Move(aPromise)))
+ // mPlaying is initially true because MDSM won't start playback until playing
+ // becomes true. This is consistent with the settings of AudioSink.
+ , mPlaying(true)
+ , mEOSVideoCompensation(false)
+ , mOutputStreamManager(aOutputStreamManager)
+{
+ mStream->AddListener(mListener);
+ mOutputStreamManager->Connect(mStream);
+
+ // Initialize tracks.
+ if (aInit.mInfo.HasAudio()) {
+ mStream->AddAudioTrack(aInit.mInfo.mAudio.mTrackId,
+ aInit.mInfo.mAudio.mRate,
+ 0, new AudioSegment());
+ }
+ if (aInit.mInfo.HasVideo()) {
+ mStream->AddTrack(aInit.mInfo.mVideo.mTrackId, 0, new VideoSegment());
+ }
+}
+
+DecodedStreamData::~DecodedStreamData()
+{
+ mOutputStreamManager->Disconnect();
+ mStream->Destroy();
+}
+
+MediaEventSource<int64_t>&
+DecodedStreamData::OnOutput()
+{
+ return mListener->OnOutput();
+}
+
+void
+DecodedStreamData::SetPlaying(bool aPlaying)
+{
+ if (mPlaying != aPlaying) {
+ mPlaying = aPlaying;
+ UpdateStreamSuspended(mStream, !mPlaying);
+ }
+}
+
+void
+DecodedStreamData::Forget()
+{
+ mListener->Forget();
+}
+
+void
+DecodedStreamData::DumpDebugInfo()
+{
+ DUMP_LOG(
+ "DecodedStreamData=%p mPlaying=%d mAudioFramesWritten=%lld"
+ "mNextAudioTime=%lld mNextVideoTime=%lld mHaveSentFinish=%d"
+ "mHaveSentFinishAudio=%d mHaveSentFinishVideo=%d",
+ this, mPlaying, mAudioFramesWritten, mNextAudioTime, mNextVideoTime,
+ mHaveSentFinish, mHaveSentFinishAudio, mHaveSentFinishVideo);
+}
+
+DecodedStream::DecodedStream(AbstractThread* aOwnerThread,
+ MediaQueue<MediaData>& aAudioQueue,
+ MediaQueue<MediaData>& aVideoQueue,
+ OutputStreamManager* aOutputStreamManager,
+ const bool& aSameOrigin,
+ const PrincipalHandle& aPrincipalHandle)
+ : mOwnerThread(aOwnerThread)
+ , mOutputStreamManager(aOutputStreamManager)
+ , mPlaying(false)
+ , mSameOrigin(aSameOrigin)
+ , mPrincipalHandle(aPrincipalHandle)
+ , mAudioQueue(aAudioQueue)
+ , mVideoQueue(aVideoQueue)
+{
+}
+
+DecodedStream::~DecodedStream()
+{
+ MOZ_ASSERT(mStartTime.isNothing(), "playback should've ended.");
+}
+
+const media::MediaSink::PlaybackParams&
+DecodedStream::GetPlaybackParams() const
+{
+ AssertOwnerThread();
+ return mParams;
+}
+
+void
+DecodedStream::SetPlaybackParams(const PlaybackParams& aParams)
+{
+ AssertOwnerThread();
+ mParams = aParams;
+}
+
+RefPtr<GenericPromise>
+DecodedStream::OnEnded(TrackType aType)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mStartTime.isSome());
+
+ if (aType == TrackInfo::kAudioTrack && mInfo.HasAudio()) {
+ // TODO: we should return a promise which is resolved when the audio track
+ // is finished. For now this promise is resolved when the whole stream is
+ // finished.
+ return mFinishPromise;
+ } else if (aType == TrackInfo::kVideoTrack && mInfo.HasVideo()) {
+ return mFinishPromise;
+ }
+ return nullptr;
+}
+
+void
+DecodedStream::Start(int64_t aStartTime, const MediaInfo& aInfo)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mStartTime.isNothing(), "playback already started.");
+
+ mStartTime.emplace(aStartTime);
+ mLastOutputTime = 0;
+ mInfo = aInfo;
+ mPlaying = true;
+ ConnectListener();
+
+ class R : public Runnable {
+ typedef MozPromiseHolder<GenericPromise> Promise;
+ public:
+ R(PlaybackInfoInit&& aInit, Promise&& aPromise, OutputStreamManager* aManager)
+ : mInit(Move(aInit)), mOutputStreamManager(aManager)
+ {
+ mPromise = Move(aPromise);
+ }
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ // No need to create a source stream when there are no output streams. This
+ // happens when RemoveOutput() is called immediately after StartPlayback().
+ if (!mOutputStreamManager->Graph()) {
+ // Resolve the promise to indicate the end of playback.
+ mPromise.Resolve(true, __func__);
+ return NS_OK;
+ }
+ mData = MakeUnique<DecodedStreamData>(
+ mOutputStreamManager, Move(mInit), Move(mPromise));
+ return NS_OK;
+ }
+ UniquePtr<DecodedStreamData> ReleaseData()
+ {
+ return Move(mData);
+ }
+ private:
+ PlaybackInfoInit mInit;
+ Promise mPromise;
+ RefPtr<OutputStreamManager> mOutputStreamManager;
+ UniquePtr<DecodedStreamData> mData;
+ };
+
+ MozPromiseHolder<GenericPromise> promise;
+ mFinishPromise = promise.Ensure(__func__);
+ PlaybackInfoInit init {
+ aStartTime, aInfo
+ };
+ nsCOMPtr<nsIRunnable> r = new R(Move(init), Move(promise), mOutputStreamManager);
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ SyncRunnable::DispatchToThread(mainThread, r);
+ mData = static_cast<R*>(r.get())->ReleaseData();
+
+ if (mData) {
+ mOutputListener = mData->OnOutput().Connect(
+ mOwnerThread, this, &DecodedStream::NotifyOutput);
+ mData->SetPlaying(mPlaying);
+ SendData();
+ }
+}
+
+void
+DecodedStream::Stop()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mStartTime.isSome(), "playback not started.");
+
+ mStartTime.reset();
+ DisconnectListener();
+ mFinishPromise = nullptr;
+
+ // Clear mData immediately when this playback session ends so we won't
+ // send data to the wrong stream in SendData() in next playback session.
+ DestroyData(Move(mData));
+}
+
+bool
+DecodedStream::IsStarted() const
+{
+ AssertOwnerThread();
+ return mStartTime.isSome();
+}
+
+bool
+DecodedStream::IsPlaying() const
+{
+ AssertOwnerThread();
+ return IsStarted() && mPlaying;
+}
+
+void
+DecodedStream::DestroyData(UniquePtr<DecodedStreamData> aData)
+{
+ AssertOwnerThread();
+
+ if (!aData) {
+ return;
+ }
+
+ mOutputListener.Disconnect();
+
+ DecodedStreamData* data = aData.release();
+ data->Forget();
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
+ delete data;
+ });
+ AbstractThread::MainThread()->Dispatch(r.forget());
+}
+
+void
+DecodedStream::SetPlaying(bool aPlaying)
+{
+ AssertOwnerThread();
+
+ // Resume/pause matters only when playback started.
+ if (mStartTime.isNothing()) {
+ return;
+ }
+
+ mPlaying = aPlaying;
+ if (mData) {
+ mData->SetPlaying(aPlaying);
+ }
+}
+
+void
+DecodedStream::SetVolume(double aVolume)
+{
+ AssertOwnerThread();
+ mParams.mVolume = aVolume;
+}
+
+void
+DecodedStream::SetPlaybackRate(double aPlaybackRate)
+{
+ AssertOwnerThread();
+ mParams.mPlaybackRate = aPlaybackRate;
+}
+
+void
+DecodedStream::SetPreservesPitch(bool aPreservesPitch)
+{
+ AssertOwnerThread();
+ mParams.mPreservesPitch = aPreservesPitch;
+}
+
+static void
+SendStreamAudio(DecodedStreamData* aStream, int64_t aStartTime,
+ MediaData* aData, AudioSegment* aOutput, uint32_t aRate,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ // The amount of audio frames that is used to fuzz rounding errors.
+ static const int64_t AUDIO_FUZZ_FRAMES = 1;
+
+ MOZ_ASSERT(aData);
+ AudioData* audio = aData->As<AudioData>();
+ // This logic has to mimic AudioSink closely to make sure we write
+ // the exact same silences
+ CheckedInt64 audioWrittenOffset = aStream->mAudioFramesWritten +
+ UsecsToFrames(aStartTime, aRate);
+ CheckedInt64 frameOffset = UsecsToFrames(audio->mTime, aRate);
+
+ if (!audioWrittenOffset.isValid() ||
+ !frameOffset.isValid() ||
+ // ignore packet that we've already processed
+ audio->GetEndTime() <= aStream->mNextAudioTime) {
+ return;
+ }
+
+ if (audioWrittenOffset.value() + AUDIO_FUZZ_FRAMES < frameOffset.value()) {
+ int64_t silentFrames = frameOffset.value() - audioWrittenOffset.value();
+ // Write silence to catch up
+ AudioSegment silence;
+ silence.InsertNullDataAtStart(silentFrames);
+ aStream->mAudioFramesWritten += silentFrames;
+ audioWrittenOffset += silentFrames;
+ aOutput->AppendFrom(&silence);
+ }
+
+ // Always write the whole sample without truncation to be consistent with
+ // DecodedAudioDataSink::PlayFromAudioQueue()
+ audio->EnsureAudioBuffer();
+ RefPtr<SharedBuffer> buffer = audio->mAudioBuffer;
+ AudioDataValue* bufferData = static_cast<AudioDataValue*>(buffer->Data());
+ AutoTArray<const AudioDataValue*, 2> channels;
+ for (uint32_t i = 0; i < audio->mChannels; ++i) {
+ channels.AppendElement(bufferData + i * audio->mFrames);
+ }
+ aOutput->AppendFrames(buffer.forget(), channels, audio->mFrames, aPrincipalHandle);
+ aStream->mAudioFramesWritten += audio->mFrames;
+
+ aStream->mNextAudioTime = audio->GetEndTime();
+}
+
+void
+DecodedStream::SendAudio(double aVolume, bool aIsSameOrigin,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ AssertOwnerThread();
+
+ if (!mInfo.HasAudio()) {
+ return;
+ }
+
+ AudioSegment output;
+ uint32_t rate = mInfo.mAudio.mRate;
+ AutoTArray<RefPtr<MediaData>,10> audio;
+ TrackID audioTrackId = mInfo.mAudio.mTrackId;
+ SourceMediaStream* sourceStream = mData->mStream;
+
+ // It's OK to hold references to the AudioData because AudioData
+ // is ref-counted.
+ mAudioQueue.GetElementsAfter(mData->mNextAudioTime, &audio);
+ for (uint32_t i = 0; i < audio.Length(); ++i) {
+ SendStreamAudio(mData.get(), mStartTime.ref(), audio[i], &output, rate,
+ aPrincipalHandle);
+ }
+
+ output.ApplyVolume(aVolume);
+
+ if (!aIsSameOrigin) {
+ output.ReplaceWithDisabled();
+ }
+
+ // |mNextAudioTime| is updated as we process each audio sample in
+ // SendStreamAudio(). This is consistent with how |mNextVideoTime|
+ // is updated for video samples.
+ if (output.GetDuration() > 0) {
+ sourceStream->AppendToTrack(audioTrackId, &output);
+ }
+
+ if (mAudioQueue.IsFinished() && !mData->mHaveSentFinishAudio) {
+ sourceStream->EndTrack(audioTrackId);
+ mData->mHaveSentFinishAudio = true;
+ }
+}
+
+static void
+WriteVideoToMediaStream(MediaStream* aStream,
+ layers::Image* aImage,
+ int64_t aEndMicroseconds,
+ int64_t aStartMicroseconds,
+ const mozilla::gfx::IntSize& aIntrinsicSize,
+ const TimeStamp& aTimeStamp,
+ VideoSegment* aOutput,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ RefPtr<layers::Image> image = aImage;
+ StreamTime duration =
+ aStream->MicrosecondsToStreamTimeRoundDown(aEndMicroseconds) -
+ aStream->MicrosecondsToStreamTimeRoundDown(aStartMicroseconds);
+ aOutput->AppendFrame(image.forget(), duration, aIntrinsicSize,
+ aPrincipalHandle, false, aTimeStamp);
+}
+
+static bool
+ZeroDurationAtLastChunk(VideoSegment& aInput)
+{
+ // Get the last video frame's start time in VideoSegment aInput.
+ // If the start time is equal to the duration of aInput, means the last video
+ // frame's duration is zero.
+ StreamTime lastVideoStratTime;
+ aInput.GetLastFrame(&lastVideoStratTime);
+ return lastVideoStratTime == aInput.GetDuration();
+}
+
+void
+DecodedStream::SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle)
+{
+ AssertOwnerThread();
+
+ if (!mInfo.HasVideo()) {
+ return;
+ }
+
+ VideoSegment output;
+ TrackID videoTrackId = mInfo.mVideo.mTrackId;
+ AutoTArray<RefPtr<MediaData>, 10> video;
+ SourceMediaStream* sourceStream = mData->mStream;
+
+ // It's OK to hold references to the VideoData because VideoData
+ // is ref-counted.
+ mVideoQueue.GetElementsAfter(mData->mNextVideoTime, &video);
+
+ // tracksStartTimeStamp might be null when the SourceMediaStream not yet
+ // be added to MediaStreamGraph.
+ TimeStamp tracksStartTimeStamp = sourceStream->GetStreamTracksStrartTimeStamp();
+ if (tracksStartTimeStamp.IsNull()) {
+ tracksStartTimeStamp = TimeStamp::Now();
+ }
+
+ for (uint32_t i = 0; i < video.Length(); ++i) {
+ VideoData* v = video[i]->As<VideoData>();
+
+ if (mData->mNextVideoTime < v->mTime) {
+ // Write last video frame to catch up. mLastVideoImage can be null here
+ // which is fine, it just means there's no video.
+
+ // TODO: |mLastVideoImage| should come from the last image rendered
+ // by the state machine. This will avoid the black frame when capture
+ // happens in the middle of playback (especially in th middle of a
+ // video frame). E.g. if we have a video frame that is 30 sec long
+ // and capture happens at 15 sec, we'll have to append a black frame
+ // that is 15 sec long.
+ WriteVideoToMediaStream(sourceStream, mData->mLastVideoImage, v->mTime,
+ mData->mNextVideoTime, mData->mLastVideoImageDisplaySize,
+ tracksStartTimeStamp + TimeDuration::FromMicroseconds(v->mTime),
+ &output, aPrincipalHandle);
+ mData->mNextVideoTime = v->mTime;
+ }
+
+ if (mData->mNextVideoTime < v->GetEndTime()) {
+ WriteVideoToMediaStream(sourceStream, v->mImage, v->GetEndTime(),
+ mData->mNextVideoTime, v->mDisplay,
+ tracksStartTimeStamp + TimeDuration::FromMicroseconds(v->GetEndTime()),
+ &output, aPrincipalHandle);
+ mData->mNextVideoTime = v->GetEndTime();
+ mData->mLastVideoImage = v->mImage;
+ mData->mLastVideoImageDisplaySize = v->mDisplay;
+ }
+ }
+
+ // Check the output is not empty.
+ if (output.GetLastFrame()) {
+ mData->mEOSVideoCompensation = ZeroDurationAtLastChunk(output);
+ }
+
+ if (!aIsSameOrigin) {
+ output.ReplaceWithDisabled();
+ }
+
+ if (output.GetDuration() > 0) {
+ sourceStream->AppendToTrack(videoTrackId, &output);
+ }
+
+ if (mVideoQueue.IsFinished() && !mData->mHaveSentFinishVideo) {
+ if (mData->mEOSVideoCompensation) {
+ VideoSegment endSegment;
+ // Calculate the deviation clock time from DecodedStream.
+ int64_t deviation_usec = sourceStream->StreamTimeToMicroseconds(1);
+ WriteVideoToMediaStream(sourceStream, mData->mLastVideoImage,
+ mData->mNextVideoTime + deviation_usec, mData->mNextVideoTime,
+ mData->mLastVideoImageDisplaySize,
+ tracksStartTimeStamp + TimeDuration::FromMicroseconds(mData->mNextVideoTime + deviation_usec),
+ &endSegment, aPrincipalHandle);
+ mData->mNextVideoTime += deviation_usec;
+ MOZ_ASSERT(endSegment.GetDuration() > 0);
+ if (!aIsSameOrigin) {
+ endSegment.ReplaceWithDisabled();
+ }
+ sourceStream->AppendToTrack(videoTrackId, &endSegment);
+ }
+ sourceStream->EndTrack(videoTrackId);
+ mData->mHaveSentFinishVideo = true;
+ }
+}
+
+void
+DecodedStream::AdvanceTracks()
+{
+ AssertOwnerThread();
+
+ StreamTime endPosition = 0;
+
+ if (mInfo.HasAudio()) {
+ StreamTime audioEnd = mData->mStream->TicksToTimeRoundDown(
+ mInfo.mAudio.mRate, mData->mAudioFramesWritten);
+ endPosition = std::max(endPosition, audioEnd);
+ }
+
+ if (mInfo.HasVideo()) {
+ StreamTime videoEnd = mData->mStream->MicrosecondsToStreamTimeRoundDown(
+ mData->mNextVideoTime - mStartTime.ref());
+ endPosition = std::max(endPosition, videoEnd);
+ }
+
+ if (!mData->mHaveSentFinish) {
+ mData->mStream->AdvanceKnownTracksTime(endPosition);
+ }
+}
+
+void
+DecodedStream::SendData()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mStartTime.isSome(), "Must be called after StartPlayback()");
+
+ // Not yet created on the main thread. MDSM will try again later.
+ if (!mData) {
+ return;
+ }
+
+ // Nothing to do when the stream is finished.
+ if (mData->mHaveSentFinish) {
+ return;
+ }
+
+ SendAudio(mParams.mVolume, mSameOrigin, mPrincipalHandle);
+ SendVideo(mSameOrigin, mPrincipalHandle);
+ AdvanceTracks();
+
+ bool finished = (!mInfo.HasAudio() || mAudioQueue.IsFinished()) &&
+ (!mInfo.HasVideo() || mVideoQueue.IsFinished());
+
+ if (finished && !mData->mHaveSentFinish) {
+ mData->mHaveSentFinish = true;
+ mData->mStream->Finish();
+ }
+}
+
+int64_t
+DecodedStream::GetEndTime(TrackType aType) const
+{
+ AssertOwnerThread();
+ if (aType == TrackInfo::kAudioTrack && mInfo.HasAudio() && mData) {
+ CheckedInt64 t = mStartTime.ref() +
+ FramesToUsecs(mData->mAudioFramesWritten, mInfo.mAudio.mRate);
+ if (t.isValid()) {
+ return t.value();
+ }
+ } else if (aType == TrackInfo::kVideoTrack && mData) {
+ return mData->mNextVideoTime;
+ }
+ return -1;
+}
+
+int64_t
+DecodedStream::GetPosition(TimeStamp* aTimeStamp) const
+{
+ AssertOwnerThread();
+ // This is only called after MDSM starts playback. So mStartTime is
+ // guaranteed to be something.
+ MOZ_ASSERT(mStartTime.isSome());
+ if (aTimeStamp) {
+ *aTimeStamp = TimeStamp::Now();
+ }
+ return mStartTime.ref() + mLastOutputTime;
+}
+
+void
+DecodedStream::NotifyOutput(int64_t aTime)
+{
+ AssertOwnerThread();
+ mLastOutputTime = aTime;
+ int64_t currentTime = GetPosition();
+
+ // Remove audio samples that have been played by MSG from the queue.
+ RefPtr<MediaData> a = mAudioQueue.PeekFront();
+ for (; a && a->mTime < currentTime;) {
+ RefPtr<MediaData> releaseMe = mAudioQueue.PopFront();
+ a = mAudioQueue.PeekFront();
+ }
+}
+
+void
+DecodedStream::ConnectListener()
+{
+ AssertOwnerThread();
+
+ mAudioPushListener = mAudioQueue.PushEvent().Connect(
+ mOwnerThread, this, &DecodedStream::SendData);
+ mAudioFinishListener = mAudioQueue.FinishEvent().Connect(
+ mOwnerThread, this, &DecodedStream::SendData);
+ mVideoPushListener = mVideoQueue.PushEvent().Connect(
+ mOwnerThread, this, &DecodedStream::SendData);
+ mVideoFinishListener = mVideoQueue.FinishEvent().Connect(
+ mOwnerThread, this, &DecodedStream::SendData);
+}
+
+void
+DecodedStream::DisconnectListener()
+{
+ AssertOwnerThread();
+
+ mAudioPushListener.Disconnect();
+ mVideoPushListener.Disconnect();
+ mAudioFinishListener.Disconnect();
+ mVideoFinishListener.Disconnect();
+}
+
+void
+DecodedStream::DumpDebugInfo()
+{
+ AssertOwnerThread();
+ DUMP_LOG(
+ "DecodedStream=%p mStartTime=%lld mLastOutputTime=%lld mPlaying=%d mData=%p",
+ this, mStartTime.valueOr(-1), mLastOutputTime, mPlaying, mData.get());
+ if (mData) {
+ mData->DumpDebugInfo();
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/mediasink/DecodedStream.h b/dom/media/mediasink/DecodedStream.h
new file mode 100644
index 000000000..f2c606bc4
--- /dev/null
+++ b/dom/media/mediasink/DecodedStream.h
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DecodedStream_h_
+#define DecodedStream_h_
+
+#include "MediaEventSource.h"
+#include "MediaInfo.h"
+#include "MediaSink.h"
+
+#include "mozilla/AbstractThread.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/UniquePtr.h"
+
+namespace mozilla {
+
+class DecodedStreamData;
+class MediaData;
+class MediaStream;
+class OutputStreamManager;
+struct PlaybackInfoInit;
+class ProcessedMediaStream;
+class TimeStamp;
+
+template <class T> class MediaQueue;
+
+class DecodedStream : public media::MediaSink {
+ using media::MediaSink::PlaybackParams;
+
+public:
+ DecodedStream(AbstractThread* aOwnerThread,
+ MediaQueue<MediaData>& aAudioQueue,
+ MediaQueue<MediaData>& aVideoQueue,
+ OutputStreamManager* aOutputStreamManager,
+ const bool& aSameOrigin,
+ const PrincipalHandle& aPrincipalHandle);
+
+ // MediaSink functions.
+ const PlaybackParams& GetPlaybackParams() const override;
+ void SetPlaybackParams(const PlaybackParams& aParams) override;
+
+ RefPtr<GenericPromise> OnEnded(TrackType aType) override;
+ int64_t GetEndTime(TrackType aType) const override;
+ int64_t GetPosition(TimeStamp* aTimeStamp = nullptr) const override;
+ bool HasUnplayedFrames(TrackType aType) const override
+ {
+ // TODO: implement this.
+ return false;
+ }
+
+ void SetVolume(double aVolume) override;
+ void SetPlaybackRate(double aPlaybackRate) override;
+ void SetPreservesPitch(bool aPreservesPitch) override;
+ void SetPlaying(bool aPlaying) override;
+
+ void Start(int64_t aStartTime, const MediaInfo& aInfo) override;
+ void Stop() override;
+ bool IsStarted() const override;
+ bool IsPlaying() const override;
+
+ void DumpDebugInfo() override;
+
+protected:
+ virtual ~DecodedStream();
+
+private:
+ void DestroyData(UniquePtr<DecodedStreamData> aData);
+ void AdvanceTracks();
+ void SendAudio(double aVolume, bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
+ void SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
+ void SendData();
+ void NotifyOutput(int64_t aTime);
+
+ void AssertOwnerThread() const {
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ }
+
+ void ConnectListener();
+ void DisconnectListener();
+
+ const RefPtr<AbstractThread> mOwnerThread;
+
+ /*
+ * Main thread only members.
+ */
+ // Data about MediaStreams that are being fed by the decoder.
+ const RefPtr<OutputStreamManager> mOutputStreamManager;
+
+ /*
+ * Worker thread only members.
+ */
+ UniquePtr<DecodedStreamData> mData;
+ RefPtr<GenericPromise> mFinishPromise;
+
+ bool mPlaying;
+ const bool& mSameOrigin; // valid until Shutdown() is called.
+ const PrincipalHandle& mPrincipalHandle; // valid until Shutdown() is called.
+
+ PlaybackParams mParams;
+
+ Maybe<int64_t> mStartTime;
+ int64_t mLastOutputTime = 0; // microseconds
+ MediaInfo mInfo;
+
+ MediaQueue<MediaData>& mAudioQueue;
+ MediaQueue<MediaData>& mVideoQueue;
+
+ MediaEventListener mAudioPushListener;
+ MediaEventListener mVideoPushListener;
+ MediaEventListener mAudioFinishListener;
+ MediaEventListener mVideoFinishListener;
+ MediaEventListener mOutputListener;
+};
+
+} // namespace mozilla
+
+#endif // DecodedStream_h_
diff --git a/dom/media/mediasink/MediaSink.h b/dom/media/mediasink/MediaSink.h
new file mode 100644
index 000000000..09b79149e
--- /dev/null
+++ b/dom/media/mediasink/MediaSink.h
@@ -0,0 +1,133 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaSink_h_
+#define MediaSink_h_
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/MozPromise.h"
+#include "nsISupportsImpl.h"
+#include "MediaInfo.h"
+
+namespace mozilla {
+
+class TimeStamp;
+
+namespace media {
+
+/**
+ * A consumer of audio/video data which plays audio and video tracks and
+ * manages A/V sync between them.
+ *
+ * A typical sink sends audio/video outputs to the speaker and screen.
+ * However, there are also sinks which capture the output of an media element
+ * and send the output to a MediaStream.
+ *
+ * This class is used to move A/V sync management and audio/video rendering
+ * out of MDSM so it is possible for subclasses to do external rendering using
+ * specific hardware which is required by TV projects and CDM.
+ *
+ * Note this class is not thread-safe and should be called from the state
+ * machine thread only.
+ */
+class MediaSink {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSink);
+ typedef mozilla::TrackInfo::TrackType TrackType;
+
+ struct PlaybackParams {
+ PlaybackParams()
+ : mVolume(1.0) , mPlaybackRate(1.0) , mPreservesPitch(true) {}
+ double mVolume;
+ double mPlaybackRate;
+ bool mPreservesPitch;
+ };
+
+ // Return the playback parameters of this sink.
+ // Can be called in any state.
+ virtual const PlaybackParams& GetPlaybackParams() const = 0;
+
+ // Set the playback parameters of this sink.
+ // Can be called in any state.
+ virtual void SetPlaybackParams(const PlaybackParams& aParams) = 0;
+
+ // Return a promise which is resolved when the track finishes
+ // or null if no such track.
+ // Must be called after playback starts.
+ virtual RefPtr<GenericPromise> OnEnded(TrackType aType) = 0;
+
+ // Return the end time of the audio/video data that has been consumed
+ // or -1 if no such track.
+ // Must be called after playback starts.
+ virtual int64_t GetEndTime(TrackType aType) const = 0;
+
+ // Return playback position of the media.
+ // Since A/V sync is always maintained by this sink, there is no need to
+ // specify whether we want to get audio or video position.
+ // aTimeStamp returns the timeStamp corresponding to the returned position
+ // which is used by the compositor to derive the render time of video frames.
+ // Must be called after playback starts.
+ virtual int64_t GetPosition(TimeStamp* aTimeStamp = nullptr) const = 0;
+
+ // Return true if there are data consumed but not played yet.
+ // Can be called in any state.
+ virtual bool HasUnplayedFrames(TrackType aType) const = 0;
+
+ // Set volume of the audio track.
+ // Do nothing if this sink has no audio track.
+ // Can be called in any state.
+ virtual void SetVolume(double aVolume) {}
+
+ // Set the playback rate.
+ // Can be called in any state.
+ virtual void SetPlaybackRate(double aPlaybackRate) {}
+
+ // Whether to preserve pitch of the audio track.
+ // Do nothing if this sink has no audio track.
+ // Can be called in any state.
+ virtual void SetPreservesPitch(bool aPreservesPitch) {}
+
+ // Pause/resume the playback. Only work after playback starts.
+ virtual void SetPlaying(bool aPlaying) = 0;
+
+ // Single frame rendering operation may need to be done before playback
+ // started (1st frame) or right after seek completed or playback stopped.
+ // Do nothing if this sink has no video track. Can be called in any state.
+ virtual void Redraw(const VideoInfo& aInfo) {};
+
+ // Begin a playback session with the provided start time and media info.
+ // Must be called when playback is stopped.
+ virtual void Start(int64_t aStartTime, const MediaInfo& aInfo) = 0;
+
+ // Finish a playback session.
+ // Must be called after playback starts.
+ virtual void Stop() = 0;
+
+ // Return true if playback has started.
+ // Can be called in any state.
+ virtual bool IsStarted() const = 0;
+
+ // Return true if playback is started and not paused otherwise false.
+ // Can be called in any state.
+ virtual bool IsPlaying() const = 0;
+
+ // Called on the state machine thread to shut down the sink. All resources
+ // allocated by this sink should be released.
+ // Must be called after playback stopped.
+ virtual void Shutdown() {}
+
+ // Dump debugging information to the logs.
+ // Can be called in any phase.
+ virtual void DumpDebugInfo() {}
+
+protected:
+ virtual ~MediaSink() {}
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif //MediaSink_h_
diff --git a/dom/media/mediasink/OutputStreamManager.cpp b/dom/media/mediasink/OutputStreamManager.cpp
new file mode 100644
index 000000000..d5685837a
--- /dev/null
+++ b/dom/media/mediasink/OutputStreamManager.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamGraph.h"
+#include "OutputStreamManager.h"
+
+namespace mozilla {
+
+OutputStreamData::~OutputStreamData()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Break the connection to the input stream if necessary.
+ if (mPort) {
+ mPort->Destroy();
+ }
+}
+
+void
+OutputStreamData::Init(OutputStreamManager* aOwner, ProcessedMediaStream* aStream)
+{
+ mOwner = aOwner;
+ mStream = aStream;
+}
+
+bool
+OutputStreamData::Connect(MediaStream* aStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!mPort, "Already connected?");
+
+ if (mStream->IsDestroyed()) {
+ return false;
+ }
+
+ mPort = mStream->AllocateInputPort(aStream);
+ return true;
+}
+
+bool
+OutputStreamData::Disconnect()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // During cycle collection, DOMMediaStream can be destroyed and send
+ // its Destroy message before this decoder is destroyed. So we have to
+ // be careful not to send any messages after the Destroy().
+ if (mStream->IsDestroyed()) {
+ return false;
+ }
+
+ // Disconnect the existing port if necessary.
+ if (mPort) {
+ mPort->Destroy();
+ mPort = nullptr;
+ }
+ return true;
+}
+
+bool
+OutputStreamData::Equals(MediaStream* aStream) const
+{
+ return mStream == aStream;
+}
+
+MediaStreamGraph*
+OutputStreamData::Graph() const
+{
+ return mStream->Graph();
+}
+
+void
+OutputStreamManager::Add(ProcessedMediaStream* aStream, bool aFinishWhenEnded)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // All streams must belong to the same graph.
+ MOZ_ASSERT(!Graph() || Graph() == aStream->Graph());
+
+ // Ensure that aStream finishes the moment mDecodedStream does.
+ if (aFinishWhenEnded) {
+ aStream->SetAutofinish(true);
+ }
+
+ OutputStreamData* p = mStreams.AppendElement();
+ p->Init(this, aStream);
+
+ // Connect to the input stream if we have one. Otherwise the output stream
+ // will be connected in Connect().
+ if (mInputStream) {
+ p->Connect(mInputStream);
+ }
+}
+
+void
+OutputStreamManager::Remove(MediaStream* aStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ for (int32_t i = mStreams.Length() - 1; i >= 0; --i) {
+ if (mStreams[i].Equals(aStream)) {
+ mStreams.RemoveElementAt(i);
+ break;
+ }
+ }
+}
+
+void
+OutputStreamManager::Connect(MediaStream* aStream)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mInputStream = aStream;
+ for (int32_t i = mStreams.Length() - 1; i >= 0; --i) {
+ if (!mStreams[i].Connect(aStream)) {
+ // Probably the DOMMediaStream was GCed. Clean up.
+ mStreams.RemoveElementAt(i);
+ }
+ }
+}
+
+void
+OutputStreamManager::Disconnect()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mInputStream = nullptr;
+ for (int32_t i = mStreams.Length() - 1; i >= 0; --i) {
+ if (!mStreams[i].Disconnect()) {
+ // Probably the DOMMediaStream was GCed. Clean up.
+ mStreams.RemoveElementAt(i);
+ }
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/mediasink/OutputStreamManager.h b/dom/media/mediasink/OutputStreamManager.h
new file mode 100644
index 000000000..7f91a60c1
--- /dev/null
+++ b/dom/media/mediasink/OutputStreamManager.h
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef OutputStreamManager_h
+#define OutputStreamManager_h
+
+#include "mozilla/RefPtr.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+class MediaInputPort;
+class MediaStream;
+class MediaStreamGraph;
+class OutputStreamManager;
+class ProcessedMediaStream;
+
+class OutputStreamData {
+public:
+ ~OutputStreamData();
+ void Init(OutputStreamManager* aOwner, ProcessedMediaStream* aStream);
+
+ // Connect mStream to the input stream.
+ // Return false is mStream is already destroyed, otherwise true.
+ bool Connect(MediaStream* aStream);
+ // Disconnect mStream from its input stream.
+ // Return false is mStream is already destroyed, otherwise true.
+ bool Disconnect();
+ // Return true if aStream points to the same object as mStream.
+ // Used by OutputStreamManager to remove an output stream.
+ bool Equals(MediaStream* aStream) const;
+ // Return the graph mStream belongs to.
+ MediaStreamGraph* Graph() const;
+
+private:
+ OutputStreamManager* mOwner;
+ RefPtr<ProcessedMediaStream> mStream;
+ // mPort connects our mStream to an input stream.
+ RefPtr<MediaInputPort> mPort;
+};
+
+class OutputStreamManager {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(OutputStreamManager);
+
+public:
+ // Add the output stream to the collection.
+ void Add(ProcessedMediaStream* aStream, bool aFinishWhenEnded);
+ // Remove the output stream from the collection.
+ void Remove(MediaStream* aStream);
+ // Return true if the collection empty.
+ bool IsEmpty() const
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mStreams.IsEmpty();
+ }
+ // Connect all output streams in the collection to the input stream.
+ void Connect(MediaStream* aStream);
+ // Disconnect all output streams from the input stream.
+ void Disconnect();
+ // Return the graph these streams belong to or null if empty.
+ MediaStreamGraph* Graph() const
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return !IsEmpty() ? mStreams[0].Graph() : nullptr;
+ }
+
+private:
+ ~OutputStreamManager() {}
+ // Keep the input stream so we can connect the output streams that
+ // are added after Connect().
+ RefPtr<MediaStream> mInputStream;
+ nsTArray<OutputStreamData> mStreams;
+};
+
+} // namespace mozilla
+
+#endif // OutputStreamManager_h
diff --git a/dom/media/mediasink/VideoSink.cpp b/dom/media/mediasink/VideoSink.cpp
new file mode 100644
index 000000000..18c0b22ad
--- /dev/null
+++ b/dom/media/mediasink/VideoSink.cpp
@@ -0,0 +1,486 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaQueue.h"
+#include "VideoSink.h"
+#include "MediaPrefs.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+
+#undef FMT
+#undef DUMP_LOG
+
+#define FMT(x, ...) "VideoSink=%p " x, this, ##__VA_ARGS__
+#define VSINK_LOG(x, ...) MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, (FMT(x, ##__VA_ARGS__)))
+#define VSINK_LOG_V(x, ...) MOZ_LOG(gMediaDecoderLog, LogLevel::Verbose, (FMT(x, ##__VA_ARGS__)))
+#define DUMP_LOG(x, ...) NS_DebugBreak(NS_DEBUG_WARNING, nsPrintfCString(FMT(x, ##__VA_ARGS__)).get(), nullptr, nullptr, -1)
+
+using namespace mozilla::layers;
+
+namespace media {
+
+// Minimum update frequency is 1/120th of a second, i.e. half the
+// duration of a 60-fps frame.
+static const int64_t MIN_UPDATE_INTERVAL_US = 1000000 / (60 * 2);
+
+VideoSink::VideoSink(AbstractThread* aThread,
+ MediaSink* aAudioSink,
+ MediaQueue<MediaData>& aVideoQueue,
+ VideoFrameContainer* aContainer,
+ FrameStatistics& aFrameStats,
+ uint32_t aVQueueSentToCompositerSize)
+ : mOwnerThread(aThread)
+ , mAudioSink(aAudioSink)
+ , mVideoQueue(aVideoQueue)
+ , mContainer(aContainer)
+ , mProducerID(ImageContainer::AllocateProducerID())
+ , mFrameStats(aFrameStats)
+ , mVideoFrameEndTime(-1)
+ , mHasVideo(false)
+ , mUpdateScheduler(aThread)
+ , mVideoQueueSendToCompositorSize(aVQueueSentToCompositerSize)
+ , mMinVideoQueueSize(MediaPrefs::RuinAvSync() ? 1 : 0)
+{
+ MOZ_ASSERT(mAudioSink, "AudioSink should exist.");
+}
+
+VideoSink::~VideoSink()
+{
+}
+
+const MediaSink::PlaybackParams&
+VideoSink::GetPlaybackParams() const
+{
+ AssertOwnerThread();
+
+ return mAudioSink->GetPlaybackParams();
+}
+
+void
+VideoSink::SetPlaybackParams(const PlaybackParams& aParams)
+{
+ AssertOwnerThread();
+
+ mAudioSink->SetPlaybackParams(aParams);
+}
+
+RefPtr<GenericPromise>
+VideoSink::OnEnded(TrackType aType)
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mAudioSink->IsStarted(), "Must be called after playback starts.");
+
+ if (aType == TrackInfo::kAudioTrack) {
+ return mAudioSink->OnEnded(aType);
+ } else if (aType == TrackInfo::kVideoTrack) {
+ return mEndPromise;
+ }
+ return nullptr;
+}
+
+int64_t
+VideoSink::GetEndTime(TrackType aType) const
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mAudioSink->IsStarted(), "Must be called after playback starts.");
+
+ if (aType == TrackInfo::kVideoTrack) {
+ return mVideoFrameEndTime;
+ } else if (aType == TrackInfo::kAudioTrack) {
+ return mAudioSink->GetEndTime(aType);
+ }
+ return -1;
+}
+
+int64_t
+VideoSink::GetPosition(TimeStamp* aTimeStamp) const
+{
+ AssertOwnerThread();
+
+ return mAudioSink->GetPosition(aTimeStamp);
+}
+
+bool
+VideoSink::HasUnplayedFrames(TrackType aType) const
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(aType == TrackInfo::kAudioTrack, "Not implemented for non audio tracks.");
+
+ return mAudioSink->HasUnplayedFrames(aType);
+}
+
+void
+VideoSink::SetPlaybackRate(double aPlaybackRate)
+{
+ AssertOwnerThread();
+
+ mAudioSink->SetPlaybackRate(aPlaybackRate);
+}
+
+void
+VideoSink::SetVolume(double aVolume)
+{
+ AssertOwnerThread();
+
+ mAudioSink->SetVolume(aVolume);
+}
+
+void
+VideoSink::SetPreservesPitch(bool aPreservesPitch)
+{
+ AssertOwnerThread();
+
+ mAudioSink->SetPreservesPitch(aPreservesPitch);
+}
+
+void
+VideoSink::SetPlaying(bool aPlaying)
+{
+ AssertOwnerThread();
+ VSINK_LOG_V(" playing (%d) -> (%d)", mAudioSink->IsPlaying(), aPlaying);
+
+ if (!aPlaying) {
+ // Reset any update timer if paused.
+ mUpdateScheduler.Reset();
+ // Since playback is paused, tell compositor to render only current frame.
+ RenderVideoFrames(1);
+ if (mContainer) {
+ mContainer->ClearCachedResources();
+ }
+ }
+
+ mAudioSink->SetPlaying(aPlaying);
+
+ if (mHasVideo && aPlaying) {
+ // There's no thread in VideoSink for pulling video frames, need to trigger
+ // rendering while becoming playing status. because the VideoQueue may be
+ // full already.
+ TryUpdateRenderedVideoFrames();
+ }
+}
+
+void
+VideoSink::Start(int64_t aStartTime, const MediaInfo& aInfo)
+{
+ AssertOwnerThread();
+ VSINK_LOG("[%s]", __func__);
+
+ mAudioSink->Start(aStartTime, aInfo);
+
+ mHasVideo = aInfo.HasVideo();
+
+ if (mHasVideo) {
+ mEndPromise = mEndPromiseHolder.Ensure(__func__);
+
+ // If the underlying MediaSink has an end promise for the video track (which
+ // happens when mAudioSink refers to a DecodedStream), we must wait for it
+ // to complete before resolving our own end promise. Otherwise, MDSM might
+ // stop playback before DecodedStream plays to the end and cause
+ // test_streams_element_capture.html to time out.
+ RefPtr<GenericPromise> p = mAudioSink->OnEnded(TrackInfo::kVideoTrack);
+ if (p) {
+ RefPtr<VideoSink> self = this;
+ mVideoSinkEndRequest.Begin(p->Then(mOwnerThread, __func__,
+ [self] () {
+ self->mVideoSinkEndRequest.Complete();
+ self->TryUpdateRenderedVideoFrames();
+ // It is possible the video queue size is 0 and we have no frames to
+ // render. However, we need to call MaybeResolveEndPromise() to ensure
+ // mEndPromiseHolder is resolved.
+ self->MaybeResolveEndPromise();
+ }, [self] () {
+ self->mVideoSinkEndRequest.Complete();
+ self->TryUpdateRenderedVideoFrames();
+ self->MaybeResolveEndPromise();
+ }));
+ }
+
+ ConnectListener();
+ // Run the render loop at least once so we can resolve the end promise
+ // when video duration is 0.
+ UpdateRenderedVideoFrames();
+ }
+}
+
+void
+VideoSink::Stop()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mAudioSink->IsStarted(), "playback not started.");
+ VSINK_LOG("[%s]", __func__);
+
+ mAudioSink->Stop();
+
+ mUpdateScheduler.Reset();
+ if (mHasVideo) {
+ DisconnectListener();
+ mVideoSinkEndRequest.DisconnectIfExists();
+ mEndPromiseHolder.ResolveIfExists(true, __func__);
+ mEndPromise = nullptr;
+ }
+ mVideoFrameEndTime = -1;
+}
+
+bool
+VideoSink::IsStarted() const
+{
+ AssertOwnerThread();
+
+ return mAudioSink->IsStarted();
+}
+
+bool
+VideoSink::IsPlaying() const
+{
+ AssertOwnerThread();
+
+ return mAudioSink->IsPlaying();
+}
+
+void
+VideoSink::Shutdown()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(!mAudioSink->IsStarted(), "must be called after playback stops.");
+ VSINK_LOG("[%s]", __func__);
+
+ mAudioSink->Shutdown();
+}
+
+void
+VideoSink::OnVideoQueuePushed(RefPtr<MediaData>&& aSample)
+{
+ AssertOwnerThread();
+ // Listen to push event, VideoSink should try rendering ASAP if first frame
+ // arrives but update scheduler is not triggered yet.
+ VideoData* v = aSample->As<VideoData>();
+ if (!v->mSentToCompositor) {
+ // Since we push rendered frames back to the queue, we will receive
+ // push events for them. We only need to trigger render loop
+ // when this frame is not rendered yet.
+ TryUpdateRenderedVideoFrames();
+ }
+}
+
+void
+VideoSink::OnVideoQueueFinished()
+{
+ AssertOwnerThread();
+ // Run render loop if the end promise is not resolved yet.
+ if (!mUpdateScheduler.IsScheduled() &&
+ mAudioSink->IsPlaying() &&
+ !mEndPromiseHolder.IsEmpty()) {
+ UpdateRenderedVideoFrames();
+ }
+}
+
+void
+VideoSink::Redraw(const VideoInfo& aInfo)
+{
+ AssertOwnerThread();
+
+ // No video track, nothing to draw.
+ if (!aInfo.IsValid() || !mContainer) {
+ return;
+ }
+
+ if (VideoQueue().GetSize() > 0) {
+ RenderVideoFrames(1);
+ return;
+ }
+
+ // When we reach here, it means there are no frames in this video track.
+ // Draw a blank frame to ensure there is something in the image container
+ // to fire 'loadeddata'.
+ RefPtr<Image> blank =
+ mContainer->GetImageContainer()->CreatePlanarYCbCrImage();
+ mContainer->SetCurrentFrame(aInfo.mDisplay, blank, TimeStamp::Now());
+}
+
+void
+VideoSink::TryUpdateRenderedVideoFrames()
+{
+ AssertOwnerThread();
+ if (!mUpdateScheduler.IsScheduled() && VideoQueue().GetSize() >= 1 &&
+ mAudioSink->IsPlaying()) {
+ UpdateRenderedVideoFrames();
+ }
+}
+
+void
+VideoSink::UpdateRenderedVideoFramesByTimer()
+{
+ AssertOwnerThread();
+ mUpdateScheduler.CompleteRequest();
+ UpdateRenderedVideoFrames();
+}
+
+void
+VideoSink::ConnectListener()
+{
+ AssertOwnerThread();
+ mPushListener = VideoQueue().PushEvent().Connect(
+ mOwnerThread, this, &VideoSink::OnVideoQueuePushed);
+ mFinishListener = VideoQueue().FinishEvent().Connect(
+ mOwnerThread, this, &VideoSink::OnVideoQueueFinished);
+}
+
+void
+VideoSink::DisconnectListener()
+{
+ AssertOwnerThread();
+ mPushListener.Disconnect();
+ mFinishListener.Disconnect();
+}
+
+void
+VideoSink::RenderVideoFrames(int32_t aMaxFrames,
+ int64_t aClockTime,
+ const TimeStamp& aClockTimeStamp)
+{
+ AssertOwnerThread();
+
+ AutoTArray<RefPtr<MediaData>,16> frames;
+ VideoQueue().GetFirstElements(aMaxFrames, &frames);
+ if (frames.IsEmpty() || !mContainer) {
+ return;
+ }
+
+ AutoTArray<ImageContainer::NonOwningImage,16> images;
+ TimeStamp lastFrameTime;
+ MediaSink::PlaybackParams params = mAudioSink->GetPlaybackParams();
+ for (uint32_t i = 0; i < frames.Length(); ++i) {
+ VideoData* frame = frames[i]->As<VideoData>();
+
+ frame->mSentToCompositor = true;
+
+ if (!frame->mImage || !frame->mImage->IsValid() ||
+ !frame->mImage->GetSize().width || !frame->mImage->GetSize().height) {
+ continue;
+ }
+
+ int64_t frameTime = frame->mTime;
+ if (frameTime < 0) {
+ // Frame times before the start time are invalid; drop such frames
+ continue;
+ }
+
+ TimeStamp t;
+ if (aMaxFrames > 1) {
+ MOZ_ASSERT(!aClockTimeStamp.IsNull());
+ int64_t delta = frame->mTime - aClockTime;
+ t = aClockTimeStamp +
+ TimeDuration::FromMicroseconds(delta / params.mPlaybackRate);
+ if (!lastFrameTime.IsNull() && t <= lastFrameTime) {
+ // Timestamps out of order; drop the new frame. In theory we should
+ // probably replace the previous frame with the new frame if the
+ // timestamps are equal, but this is a corrupt video file already so
+ // never mind.
+ continue;
+ }
+ lastFrameTime = t;
+ }
+
+ ImageContainer::NonOwningImage* img = images.AppendElement();
+ img->mTimeStamp = t;
+ img->mImage = frame->mImage;
+ img->mFrameID = frame->mFrameID;
+ img->mProducerID = mProducerID;
+
+ VSINK_LOG_V("playing video frame %lld (id=%x) (vq-queued=%i)",
+ frame->mTime, frame->mFrameID, VideoQueue().GetSize());
+ }
+ mContainer->SetCurrentFrames(frames[0]->As<VideoData>()->mDisplay, images);
+}
+
+void
+VideoSink::UpdateRenderedVideoFrames()
+{
+ AssertOwnerThread();
+ MOZ_ASSERT(mAudioSink->IsPlaying(), "should be called while playing.");
+
+ // Get the current playback position.
+ TimeStamp nowTime;
+ const int64_t clockTime = mAudioSink->GetPosition(&nowTime);
+ NS_ASSERTION(clockTime >= 0, "Should have positive clock time.");
+
+ // Skip frames up to the playback position.
+ int64_t lastFrameEndTime = 0;
+ while (VideoQueue().GetSize() > mMinVideoQueueSize &&
+ clockTime >= VideoQueue().PeekFront()->GetEndTime()) {
+ RefPtr<MediaData> frame = VideoQueue().PopFront();
+ lastFrameEndTime = frame->GetEndTime();
+ if (frame->As<VideoData>()->mSentToCompositor) {
+ mFrameStats.NotifyPresentedFrame();
+ } else {
+ mFrameStats.NotifyDecodedFrames({ 0, 0, 1 });
+ VSINK_LOG_V("discarding video frame mTime=%lld clock_time=%lld",
+ frame->mTime, clockTime);
+ }
+ }
+
+ // The presentation end time of the last video frame displayed is either
+ // the end time of the current frame, or if we dropped all frames in the
+ // queue, the end time of the last frame we removed from the queue.
+ RefPtr<MediaData> currentFrame = VideoQueue().PeekFront();
+ mVideoFrameEndTime = std::max(mVideoFrameEndTime,
+ currentFrame ? currentFrame->GetEndTime() : lastFrameEndTime);
+
+ MaybeResolveEndPromise();
+
+ RenderVideoFrames(mVideoQueueSendToCompositorSize, clockTime, nowTime);
+
+ // Get the timestamp of the next frame. Schedule the next update at
+ // the start time of the next frame. If we don't have a next frame,
+ // we will run render loops again upon incoming frames.
+ nsTArray<RefPtr<MediaData>> frames;
+ VideoQueue().GetFirstElements(2, &frames);
+ if (frames.Length() < 2) {
+ return;
+ }
+
+ int64_t nextFrameTime = frames[1]->mTime;
+ int64_t delta = std::max<int64_t>((nextFrameTime - clockTime), MIN_UPDATE_INTERVAL_US);
+ TimeStamp target = nowTime + TimeDuration::FromMicroseconds(
+ delta / mAudioSink->GetPlaybackParams().mPlaybackRate);
+
+ RefPtr<VideoSink> self = this;
+ mUpdateScheduler.Ensure(target, [self] () {
+ self->UpdateRenderedVideoFramesByTimer();
+ }, [self] () {
+ self->UpdateRenderedVideoFramesByTimer();
+ });
+}
+
+void
+VideoSink::MaybeResolveEndPromise()
+{
+ AssertOwnerThread();
+ // All frames are rendered, Let's resolve the promise.
+ if (VideoQueue().IsFinished() &&
+ VideoQueue().GetSize() <= 1 &&
+ !mVideoSinkEndRequest.Exists()) {
+ mEndPromiseHolder.ResolveIfExists(true, __func__);
+ }
+}
+
+void
+VideoSink::DumpDebugInfo()
+{
+ AssertOwnerThread();
+ DUMP_LOG(
+ "IsStarted=%d IsPlaying=%d, VideoQueue: finished=%d size=%d, "
+ "mVideoFrameEndTime=%lld mHasVideo=%d mVideoSinkEndRequest.Exists()=%d "
+ "mEndPromiseHolder.IsEmpty()=%d",
+ IsStarted(), IsPlaying(), VideoQueue().IsFinished(), VideoQueue().GetSize(),
+ mVideoFrameEndTime, mHasVideo, mVideoSinkEndRequest.Exists(), mEndPromiseHolder.IsEmpty());
+ mAudioSink->DumpDebugInfo();
+}
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/mediasink/VideoSink.h b/dom/media/mediasink/VideoSink.h
new file mode 100644
index 000000000..2612f0e07
--- /dev/null
+++ b/dom/media/mediasink/VideoSink.h
@@ -0,0 +1,160 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef VideoSink_h_
+#define VideoSink_h_
+
+#include "FrameStatistics.h"
+#include "ImageContainer.h"
+#include "MediaEventSource.h"
+#include "MediaSink.h"
+#include "MediaTimer.h"
+#include "mozilla/AbstractThread.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/TimeStamp.h"
+#include "VideoFrameContainer.h"
+
+namespace mozilla {
+
+class VideoFrameContainer;
+template <class T> class MediaQueue;
+
+namespace media {
+
+class VideoSink : public MediaSink
+{
+ typedef mozilla::layers::ImageContainer::ProducerID ProducerID;
+public:
+ VideoSink(AbstractThread* aThread,
+ MediaSink* aAudioSink,
+ MediaQueue<MediaData>& aVideoQueue,
+ VideoFrameContainer* aContainer,
+ FrameStatistics& aFrameStats,
+ uint32_t aVQueueSentToCompositerSize);
+
+ const PlaybackParams& GetPlaybackParams() const override;
+
+ void SetPlaybackParams(const PlaybackParams& aParams) override;
+
+ RefPtr<GenericPromise> OnEnded(TrackType aType) override;
+
+ int64_t GetEndTime(TrackType aType) const override;
+
+ int64_t GetPosition(TimeStamp* aTimeStamp = nullptr) const override;
+
+ bool HasUnplayedFrames(TrackType aType) const override;
+
+ void SetPlaybackRate(double aPlaybackRate) override;
+
+ void SetVolume(double aVolume) override;
+
+ void SetPreservesPitch(bool aPreservesPitch) override;
+
+ void SetPlaying(bool aPlaying) override;
+
+ void Redraw(const VideoInfo& aInfo) override;
+
+ void Start(int64_t aStartTime, const MediaInfo& aInfo) override;
+
+ void Stop() override;
+
+ bool IsStarted() const override;
+
+ bool IsPlaying() const override;
+
+ void Shutdown() override;
+
+ void DumpDebugInfo() override;
+
+private:
+ virtual ~VideoSink();
+
+ // VideoQueue listener related.
+ void OnVideoQueuePushed(RefPtr<MediaData>&& aSample);
+ void OnVideoQueueFinished();
+ void ConnectListener();
+ void DisconnectListener();
+
+ // Sets VideoQueue images into the VideoFrameContainer. Called on the shared
+ // state machine thread. The first aMaxFrames (at most) are set.
+ // aClockTime and aClockTimeStamp are used as the baseline for deriving
+ // timestamps for the frames; when omitted, aMaxFrames must be 1 and
+ // a null timestamp is passed to the VideoFrameContainer.
+ // If the VideoQueue is empty, this does nothing.
+ void RenderVideoFrames(int32_t aMaxFrames, int64_t aClockTime = 0,
+ const TimeStamp& aClickTimeStamp = TimeStamp());
+
+ // Triggered while videosink is started, videosink becomes "playing" status,
+ // or VideoQueue event arrived.
+ void TryUpdateRenderedVideoFrames();
+
+ // If we have video, display a video frame if it's time for display has
+ // arrived, otherwise sleep until it's time for the next frame. Update the
+ // current frame time as appropriate, and trigger ready state update.
+ // Called on the shared state machine thread.
+ void UpdateRenderedVideoFrames();
+ void UpdateRenderedVideoFramesByTimer();
+
+ void MaybeResolveEndPromise();
+
+ void AssertOwnerThread() const
+ {
+ MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
+ }
+
+ MediaQueue<MediaData>& VideoQueue() const {
+ return mVideoQueue;
+ }
+
+ const RefPtr<AbstractThread> mOwnerThread;
+ RefPtr<MediaSink> mAudioSink;
+ MediaQueue<MediaData>& mVideoQueue;
+ VideoFrameContainer* mContainer;
+
+ // Producer ID to help ImageContainer distinguish different streams of
+ // FrameIDs. A unique and immutable value per VideoSink.
+ const ProducerID mProducerID;
+
+ // Used to notify MediaDecoder's frame statistics
+ FrameStatistics& mFrameStats;
+
+ RefPtr<GenericPromise> mEndPromise;
+ MozPromiseHolder<GenericPromise> mEndPromiseHolder;
+ MozPromiseRequestHolder<GenericPromise> mVideoSinkEndRequest;
+
+ // The presentation end time of the last video frame which has been displayed
+ // in microseconds.
+ int64_t mVideoFrameEndTime;
+
+ // Event listeners for VideoQueue
+ MediaEventListener mPushListener;
+ MediaEventListener mFinishListener;
+
+ // True if this sink is going to handle video track.
+ bool mHasVideo;
+
+ // Used to trigger another update of rendered frames in next round.
+ DelayedScheduler mUpdateScheduler;
+
+ // Max frame number sent to compositor at a time.
+ // Based on the pref value obtained in MDSM.
+ const uint32_t mVideoQueueSendToCompositorSize;
+
+ // Talos tests for the compositor require at least one frame in the
+ // video queue so that the compositor has something to composit during
+ // the talos test when the decode is stressed. We have a minimum size
+ // on the video queue in order to facilitate this talos test.
+ // Note: Normal playback should not have a queue size of more than 0,
+ // otherwise A/V sync will be ruined! *Only* make this non-zero for
+ // testing purposes.
+ const uint32_t mMinVideoQueueSize;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/mediasink/moz.build b/dom/media/mediasink/moz.build
new file mode 100644
index 000000000..c09341374
--- /dev/null
+++ b/dom/media/mediasink/moz.build
@@ -0,0 +1,18 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'AudioSinkWrapper.cpp',
+ 'DecodedAudioDataSink.cpp',
+ 'DecodedStream.cpp',
+ 'OutputStreamManager.cpp',
+ 'VideoSink.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/mediasource/AsyncEventRunner.h b/dom/media/mediasource/AsyncEventRunner.h
new file mode 100644
index 000000000..a1b6265f7
--- /dev/null
+++ b/dom/media/mediasource/AsyncEventRunner.h
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_ASYNCEVENTRUNNER_H_
+#define MOZILLA_ASYNCEVENTRUNNER_H_
+
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+
+template <typename T>
+class AsyncEventRunner : public Runnable
+{
+public:
+ AsyncEventRunner(T* aTarget, const char* aName)
+ : mTarget(aTarget)
+ , mName(aName)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ mTarget->DispatchSimpleEvent(mName);
+ return NS_OK;
+ }
+
+private:
+ RefPtr<T> mTarget;
+ const char* mName;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_ASYNCEVENTRUNNER_H_ */
diff --git a/dom/media/mediasource/AutoTaskQueue.h b/dom/media/mediasource/AutoTaskQueue.h
new file mode 100644
index 000000000..1726ad5be
--- /dev/null
+++ b/dom/media/mediasource/AutoTaskQueue.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUTOTASKQUEUE_H_
+#define MOZILLA_AUTOTASKQUEUE_H_
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/TaskQueue.h"
+
+namespace mozilla {
+
+// A convenience TaskQueue not requiring explicit shutdown.
+class AutoTaskQueue : public AbstractThread
+{
+public:
+ explicit AutoTaskQueue(already_AddRefed<SharedThreadPool> aPool, bool aSupportsTailDispatch = false)
+ : AbstractThread(aSupportsTailDispatch)
+ , mTaskQueue(new TaskQueue(Move(aPool), aSupportsTailDispatch))
+ {}
+
+ TaskDispatcher& TailDispatcher() override
+ {
+ return mTaskQueue->TailDispatcher();
+ }
+
+ void Dispatch(already_AddRefed<nsIRunnable> aRunnable,
+ DispatchFailureHandling aFailureHandling = AssertDispatchSuccess,
+ DispatchReason aReason = NormalDispatch) override
+ {
+ mTaskQueue->Dispatch(Move(aRunnable), aFailureHandling, aReason);
+ }
+
+ // Blocks until all tasks finish executing.
+ void AwaitIdle() { mTaskQueue->AwaitIdle(); }
+
+ bool IsEmpty() { return mTaskQueue->IsEmpty(); }
+
+ // Returns true if the current thread is currently running a Runnable in
+ // the task queue.
+ bool IsCurrentThreadIn() override { return mTaskQueue->IsCurrentThreadIn(); }
+
+private:
+ ~AutoTaskQueue()
+ {
+ RefPtr<TaskQueue> taskqueue = mTaskQueue;
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([taskqueue]() { taskqueue->BeginShutdown(); });
+ AbstractThread::MainThread()->Dispatch(task.forget());
+ }
+ RefPtr<TaskQueue> mTaskQueue;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp
new file mode 100644
index 000000000..5267e9315
--- /dev/null
+++ b/dom/media/mediasource/ContainerParser.cpp
@@ -0,0 +1,716 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ContainerParser.h"
+
+#include "WebMBufferedParser.h"
+#include "mozilla/EndianUtils.h"
+#include "mozilla/ErrorResult.h"
+#include "mp4_demuxer/MoofParser.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Maybe.h"
+#include "MediaData.h"
+#ifdef MOZ_FMP4
+#include "MP4Stream.h"
+#include "mp4_demuxer/AtomType.h"
+#include "mp4_demuxer/ByteReader.h"
+#endif
+#include "nsAutoPtr.h"
+#include "SourceBufferResource.h"
+#include <algorithm>
+
+extern mozilla::LogModule* GetMediaSourceSamplesLog();
+
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+#define MSE_DEBUG(name, arg, ...) MOZ_LOG(GetMediaSourceSamplesLog(), mozilla::LogLevel::Debug, (TOSTRING(name) "(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+#define MSE_DEBUGV(name, arg, ...) MOZ_LOG(GetMediaSourceSamplesLog(), mozilla::LogLevel::Verbose, (TOSTRING(name) "(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+ContainerParser::ContainerParser(const nsACString& aType)
+ : mHasInitData(false)
+ , mType(aType)
+{
+}
+
+ContainerParser::~ContainerParser() = default;
+
+MediaResult
+ContainerParser::IsInitSegmentPresent(MediaByteBuffer* aData)
+{
+ MSE_DEBUG(ContainerParser, "aLength=%u [%x%x%x%x]",
+ aData->Length(),
+ aData->Length() > 0 ? (*aData)[0] : 0,
+ aData->Length() > 1 ? (*aData)[1] : 0,
+ aData->Length() > 2 ? (*aData)[2] : 0,
+ aData->Length() > 3 ? (*aData)[3] : 0);
+ return NS_ERROR_NOT_AVAILABLE;
+}
+
+MediaResult
+ContainerParser::IsMediaSegmentPresent(MediaByteBuffer* aData)
+{
+ MSE_DEBUG(ContainerParser, "aLength=%u [%x%x%x%x]",
+ aData->Length(),
+ aData->Length() > 0 ? (*aData)[0] : 0,
+ aData->Length() > 1 ? (*aData)[1] : 0,
+ aData->Length() > 2 ? (*aData)[2] : 0,
+ aData->Length() > 3 ? (*aData)[3] : 0);
+ return NS_ERROR_NOT_AVAILABLE;
+}
+
+MediaResult
+ContainerParser::ParseStartAndEndTimestamps(MediaByteBuffer* aData,
+ int64_t& aStart, int64_t& aEnd)
+{
+ return NS_ERROR_NOT_AVAILABLE;
+}
+
+bool
+ContainerParser::TimestampsFuzzyEqual(int64_t aLhs, int64_t aRhs)
+{
+ return llabs(aLhs - aRhs) <= GetRoundingError();
+}
+
+int64_t
+ContainerParser::GetRoundingError()
+{
+ NS_WARNING("Using default ContainerParser::GetRoundingError implementation");
+ return 0;
+}
+
+bool
+ContainerParser::HasCompleteInitData()
+{
+ return mHasInitData && !!mInitData->Length();
+}
+
+MediaByteBuffer*
+ContainerParser::InitData()
+{
+ return mInitData;
+}
+
+MediaByteRange
+ContainerParser::InitSegmentRange()
+{
+ return mCompleteInitSegmentRange;
+}
+
+MediaByteRange
+ContainerParser::MediaHeaderRange()
+{
+ return mCompleteMediaHeaderRange;
+}
+
+MediaByteRange
+ContainerParser::MediaSegmentRange()
+{
+ return mCompleteMediaSegmentRange;
+}
+
+class WebMContainerParser : public ContainerParser {
+public:
+ explicit WebMContainerParser(const nsACString& aType)
+ : ContainerParser(aType)
+ , mParser(0)
+ , mOffset(0)
+ {}
+
+ static const unsigned NS_PER_USEC = 1000;
+ static const unsigned USEC_PER_SEC = 1000000;
+
+ MediaResult IsInitSegmentPresent(MediaByteBuffer* aData) override
+ {
+ ContainerParser::IsInitSegmentPresent(aData);
+ // XXX: This is overly primitive, needs to collect data as it's appended
+ // to the SB and handle, rather than assuming everything is present in a
+ // single aData segment.
+ // 0x1a45dfa3 // EBML
+ // ...
+ // DocType == "webm"
+ // ...
+ // 0x18538067 // Segment (must be "unknown" size or contain a value large
+ // enough to include the Segment Information and Tracks
+ // elements that follow)
+ // 0x1549a966 // -> Segment Info
+ // 0x1654ae6b // -> One or more Tracks
+
+ // 0x1a45dfa3 // EBML
+ if (aData->Length() < 4) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if ((*aData)[0] == 0x1a && (*aData)[1] == 0x45 && (*aData)[2] == 0xdf &&
+ (*aData)[3] == 0xa3) {
+ return NS_OK;
+ }
+ return MediaResult(NS_ERROR_FAILURE, RESULT_DETAIL("Invalid webm content"));
+ }
+
+ MediaResult IsMediaSegmentPresent(MediaByteBuffer* aData) override
+ {
+ ContainerParser::IsMediaSegmentPresent(aData);
+ // XXX: This is overly primitive, needs to collect data as it's appended
+ // to the SB and handle, rather than assuming everything is present in a
+ // single aData segment.
+ // 0x1a45dfa3 // EBML
+ // ...
+ // DocType == "webm"
+ // ...
+ // 0x18538067 // Segment (must be "unknown" size)
+ // 0x1549a966 // -> Segment Info
+ // 0x1654ae6b // -> One or more Tracks
+
+ // 0x1f43b675 // Cluster
+ if (aData->Length() < 4) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if ((*aData)[0] == 0x1f && (*aData)[1] == 0x43 && (*aData)[2] == 0xb6 &&
+ (*aData)[3] == 0x75) {
+ return NS_OK;
+ }
+ // 0x1c53bb6b // Cues
+ if ((*aData)[0] == 0x1c && (*aData)[1] == 0x53 && (*aData)[2] == 0xbb &&
+ (*aData)[3] == 0x6b) {
+ return NS_OK;
+ }
+ return MediaResult(NS_ERROR_FAILURE, RESULT_DETAIL("Invalid webm content"));
+ }
+
+ MediaResult ParseStartAndEndTimestamps(MediaByteBuffer* aData,
+ int64_t& aStart,
+ int64_t& aEnd) override
+ {
+ bool initSegment = NS_SUCCEEDED(IsInitSegmentPresent(aData));
+
+ if (mLastMapping &&
+ (initSegment || NS_SUCCEEDED(IsMediaSegmentPresent(aData)))) {
+ // The last data contained a complete cluster but we can only detect it
+ // now that a new one is starting.
+ // We use mOffset as end position to ensure that any blocks not reported
+ // by WebMBufferParser are properly skipped.
+ mCompleteMediaSegmentRange = MediaByteRange(mLastMapping.ref().mSyncOffset,
+ mOffset);
+ mLastMapping.reset();
+ MSE_DEBUG(WebMContainerParser, "New cluster found at start, ending previous one");
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ if (initSegment) {
+ mOffset = 0;
+ mParser = WebMBufferedParser(0);
+ mOverlappedMapping.Clear();
+ mInitData = new MediaByteBuffer();
+ mResource = new SourceBufferResource(NS_LITERAL_CSTRING("video/webm"));
+ mCompleteMediaHeaderRange = MediaByteRange();
+ mCompleteMediaSegmentRange = MediaByteRange();
+ }
+
+ // XXX if it only adds new mappings, overlapped but not available
+ // (e.g. overlap < 0) frames are "lost" from the reported mappings here.
+ nsTArray<WebMTimeDataOffset> mapping;
+ mapping.AppendElements(mOverlappedMapping);
+ mOverlappedMapping.Clear();
+ ReentrantMonitor dummy("dummy");
+ mParser.Append(aData->Elements(), aData->Length(), mapping, dummy);
+ if (mResource) {
+ mResource->AppendData(aData);
+ }
+
+ // XXX This is a bit of a hack. Assume if there are no timecodes
+ // present and it's an init segment that it's _just_ an init segment.
+ // We should be more precise.
+ if (initSegment || !HasCompleteInitData()) {
+ if (mParser.mInitEndOffset > 0) {
+ MOZ_ASSERT(mParser.mInitEndOffset <= mResource->GetLength());
+ if (!mInitData->SetLength(mParser.mInitEndOffset, fallible)) {
+ // Super unlikely OOM
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ mCompleteInitSegmentRange = MediaByteRange(0, mParser.mInitEndOffset);
+ char* buffer = reinterpret_cast<char*>(mInitData->Elements());
+ mResource->ReadFromCache(buffer, 0, mParser.mInitEndOffset);
+ MSE_DEBUG(WebMContainerParser, "Stashed init of %u bytes.",
+ mParser.mInitEndOffset);
+ mResource = nullptr;
+ } else {
+ MSE_DEBUG(WebMContainerParser, "Incomplete init found.");
+ }
+ mHasInitData = true;
+ }
+ mOffset += aData->Length();
+
+ if (mapping.IsEmpty()) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ // Calculate media range for first media segment.
+
+ // Check if we have a cluster finishing in the current data.
+ uint32_t endIdx = mapping.Length() - 1;
+ bool foundNewCluster = false;
+ while (mapping[0].mSyncOffset != mapping[endIdx].mSyncOffset) {
+ endIdx -= 1;
+ foundNewCluster = true;
+ }
+
+ int32_t completeIdx = endIdx;
+ while (completeIdx >= 0 && mOffset < mapping[completeIdx].mEndOffset) {
+ MSE_DEBUG(WebMContainerParser, "block is incomplete, missing: %lld",
+ mapping[completeIdx].mEndOffset - mOffset);
+ completeIdx -= 1;
+ }
+
+ // Save parsed blocks for which we do not have all data yet.
+ mOverlappedMapping.AppendElements(mapping.Elements() + completeIdx + 1,
+ mapping.Length() - completeIdx - 1);
+
+ if (completeIdx < 0) {
+ mLastMapping.reset();
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ if (mCompleteMediaHeaderRange.IsEmpty()) {
+ mCompleteMediaHeaderRange = MediaByteRange(mapping[0].mSyncOffset,
+ mapping[0].mEndOffset);
+ }
+
+ if (foundNewCluster && mOffset >= mapping[endIdx].mEndOffset) {
+ // We now have all information required to delimit a complete cluster.
+ int64_t endOffset = mapping[endIdx+1].mSyncOffset;
+ if (mapping[endIdx+1].mInitOffset > mapping[endIdx].mInitOffset) {
+ // We have a new init segment before this cluster.
+ endOffset = mapping[endIdx+1].mInitOffset;
+ }
+ mCompleteMediaSegmentRange = MediaByteRange(mapping[endIdx].mSyncOffset,
+ endOffset);
+ } else if (mapping[endIdx].mClusterEndOffset >= 0 &&
+ mOffset >= mapping[endIdx].mClusterEndOffset) {
+ mCompleteMediaSegmentRange = MediaByteRange(mapping[endIdx].mSyncOffset,
+ mParser.EndSegmentOffset(mapping[endIdx].mClusterEndOffset));
+ }
+
+ Maybe<WebMTimeDataOffset> previousMapping;
+ if (completeIdx) {
+ previousMapping = Some(mapping[completeIdx - 1]);
+ } else {
+ previousMapping = mLastMapping;
+ }
+
+ mLastMapping = Some(mapping[completeIdx]);
+
+ if (!previousMapping && completeIdx + 1u >= mapping.Length()) {
+ // We have no previous nor next block available,
+ // so we can't estimate this block's duration.
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ uint64_t frameDuration = (completeIdx + 1u < mapping.Length())
+ ? mapping[completeIdx + 1].mTimecode - mapping[completeIdx].mTimecode
+ : mapping[completeIdx].mTimecode - previousMapping.ref().mTimecode;
+ aStart = mapping[0].mTimecode / NS_PER_USEC;
+ aEnd = (mapping[completeIdx].mTimecode + frameDuration) / NS_PER_USEC;
+
+ MSE_DEBUG(WebMContainerParser, "[%lld, %lld] [fso=%lld, leo=%lld, l=%u processedIdx=%u fs=%lld]",
+ aStart, aEnd, mapping[0].mSyncOffset,
+ mapping[completeIdx].mEndOffset, mapping.Length(), completeIdx,
+ mCompleteMediaSegmentRange.mEnd);
+
+ return NS_OK;
+ }
+
+ int64_t GetRoundingError() override
+ {
+ int64_t error = mParser.GetTimecodeScale() / NS_PER_USEC;
+ return error * 2;
+ }
+
+private:
+ WebMBufferedParser mParser;
+ nsTArray<WebMTimeDataOffset> mOverlappedMapping;
+ int64_t mOffset;
+ Maybe<WebMTimeDataOffset> mLastMapping;
+};
+
+#ifdef MOZ_FMP4
+class MP4ContainerParser : public ContainerParser {
+public:
+ explicit MP4ContainerParser(const nsACString& aType)
+ : ContainerParser(aType)
+ {}
+
+ MediaResult IsInitSegmentPresent(MediaByteBuffer* aData) override
+ {
+ ContainerParser::IsInitSegmentPresent(aData);
+ // Each MP4 atom has a chunk size and chunk type. The root chunk in an MP4
+ // file is the 'ftyp' atom followed by a file type. We just check for a
+ // vaguely valid 'ftyp' atom.
+ if (aData->Length() < 8) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ AtomParser parser(mType, aData);
+ if (!parser.IsValid()) {
+ return MediaResult(
+ NS_ERROR_FAILURE,
+ RESULT_DETAIL("Invalid Top-Level Box:%s", parser.LastInvalidBox()));
+ }
+ return parser.StartWithInitSegment() ? NS_OK : NS_ERROR_NOT_AVAILABLE;
+ }
+
+ MediaResult IsMediaSegmentPresent(MediaByteBuffer* aData) override
+ {
+ if (aData->Length() < 8) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ AtomParser parser(mType, aData);
+ if (!parser.IsValid()) {
+ return MediaResult(
+ NS_ERROR_FAILURE,
+ RESULT_DETAIL("Invalid Box:%s", parser.LastInvalidBox()));
+ }
+ return parser.StartWithMediaSegment() ? NS_OK : NS_ERROR_NOT_AVAILABLE;
+ }
+
+private:
+ class AtomParser {
+ public:
+ AtomParser(const nsACString& aType, const MediaByteBuffer* aData)
+ {
+ const nsCString mType(aType); // for logging macro.
+ mp4_demuxer::ByteReader reader(aData);
+ mp4_demuxer::AtomType initAtom("ftyp");
+ mp4_demuxer::AtomType mediaAtom("moof");
+
+ // Valid top-level boxes defined in ISO/IEC 14496-12 (Table 1)
+ static const mp4_demuxer::AtomType validBoxes[] = {
+ "ftyp", "moov", // init segment
+ "pdin", "free", "sidx", // optional prior moov box
+ "styp", "moof", "mdat", // media segment
+ "mfra", "skip", "meta", "meco", "ssix", "prft" // others.
+ "pssh", // optional with encrypted EME, though ignored.
+ "emsg", // ISO23009-1:2014 Section 5.10.3.3
+ "bloc", "uuid" // boxes accepted by chrome.
+ };
+
+ while (reader.Remaining() >= 8) {
+ uint64_t size = reader.ReadU32();
+ const uint8_t* typec = reader.Peek(4);
+ mp4_demuxer::AtomType type(reader.ReadU32());
+ MSE_DEBUGV(AtomParser ,"Checking atom:'%c%c%c%c' @ %u",
+ typec[0], typec[1], typec[2], typec[3],
+ (uint32_t)reader.Offset() - 8);
+ if (std::find(std::begin(validBoxes), std::end(validBoxes), type)
+ == std::end(validBoxes)) {
+ // No valid box found, no point continuing.
+ mLastInvalidBox[0] = typec[0];
+ mLastInvalidBox[1] = typec[1];
+ mLastInvalidBox[2] = typec[2];
+ mLastInvalidBox[3] = typec[3];
+ mLastInvalidBox[4] = '\0';
+ mValid = false;
+ break;
+ }
+ if (mInitOffset.isNothing() &&
+ mp4_demuxer::AtomType(type) == initAtom) {
+ mInitOffset = Some(reader.Offset());
+ }
+ if (mMediaOffset.isNothing() &&
+ mp4_demuxer::AtomType(type) == mediaAtom) {
+ mMediaOffset = Some(reader.Offset());
+ }
+ if (mInitOffset.isSome() && mMediaOffset.isSome()) {
+ // We have everything we need.
+ break;
+ }
+ if (size == 1) {
+ // 64 bits size.
+ if (!reader.CanReadType<uint64_t>()) {
+ break;
+ }
+ size = reader.ReadU64();
+ } else if (size == 0) {
+ // Atom extends to the end of the buffer, it can't have what we're
+ // looking for.
+ break;
+ }
+ if (reader.Remaining() < size - 8) {
+ // Incomplete atom.
+ break;
+ }
+ reader.Read(size - 8);
+ }
+ }
+
+ bool StartWithInitSegment() const
+ {
+ return mInitOffset.isSome() &&
+ (mMediaOffset.isNothing() || mInitOffset.ref() < mMediaOffset.ref());
+ }
+ bool StartWithMediaSegment() const
+ {
+ return mMediaOffset.isSome() &&
+ (mInitOffset.isNothing() || mMediaOffset.ref() < mInitOffset.ref());
+ }
+ bool IsValid() const { return mValid; }
+ const char* LastInvalidBox() const { return mLastInvalidBox; }
+ private:
+ Maybe<size_t> mInitOffset;
+ Maybe<size_t> mMediaOffset;
+ bool mValid = true;
+ char mLastInvalidBox[5];
+ };
+
+public:
+ MediaResult ParseStartAndEndTimestamps(MediaByteBuffer* aData,
+ int64_t& aStart,
+ int64_t& aEnd) override
+ {
+ bool initSegment = NS_SUCCEEDED(IsInitSegmentPresent(aData));
+ if (initSegment) {
+ mResource = new SourceBufferResource(NS_LITERAL_CSTRING("video/mp4"));
+ mStream = new MP4Stream(mResource);
+ // We use a timestampOffset of 0 for ContainerParser, and require
+ // consumers of ParseStartAndEndTimestamps to add their timestamp offset
+ // manually. This allows the ContainerParser to be shared across different
+ // timestampOffsets.
+ mParser = new mp4_demuxer::MoofParser(mStream, 0, /* aIsAudio = */ false);
+ mInitData = new MediaByteBuffer();
+ } else if (!mStream || !mParser) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mResource->AppendData(aData);
+ MediaByteRangeSet byteRanges;
+ byteRanges +=
+ MediaByteRange(int64_t(mParser->mOffset), mResource->GetLength());
+ mParser->RebuildFragmentedIndex(byteRanges);
+
+ if (initSegment || !HasCompleteInitData()) {
+ MediaByteRange& range = mParser->mInitRange;
+ if (range.Length()) {
+ mCompleteInitSegmentRange = range;
+ if (!mInitData->SetLength(range.Length(), fallible)) {
+ // Super unlikely OOM
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ char* buffer = reinterpret_cast<char*>(mInitData->Elements());
+ mResource->ReadFromCache(buffer, range.mStart, range.Length());
+ MSE_DEBUG(MP4ContainerParser ,"Stashed init of %u bytes.",
+ range.Length());
+ } else {
+ MSE_DEBUG(MP4ContainerParser, "Incomplete init found.");
+ }
+ mHasInitData = true;
+ }
+
+ mp4_demuxer::Interval<mp4_demuxer::Microseconds> compositionRange =
+ mParser->GetCompositionRange(byteRanges);
+
+ mCompleteMediaHeaderRange = mParser->FirstCompleteMediaHeader();
+ mCompleteMediaSegmentRange = mParser->FirstCompleteMediaSegment();
+ ErrorResult rv;
+ if (HasCompleteInitData()) {
+ mResource->EvictData(mParser->mOffset, mParser->mOffset, rv);
+ }
+ if (NS_WARN_IF(rv.Failed())) {
+ rv.SuppressException();
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+ if (compositionRange.IsNull()) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ aStart = compositionRange.start;
+ aEnd = compositionRange.end;
+ MSE_DEBUG(MP4ContainerParser, "[%lld, %lld]",
+ aStart, aEnd);
+ return NS_OK;
+ }
+
+ // Gaps of up to 35ms (marginally longer than a single frame at 30fps) are considered
+ // to be sequential frames.
+ int64_t GetRoundingError() override
+ {
+ return 35000;
+ }
+
+private:
+ RefPtr<MP4Stream> mStream;
+ nsAutoPtr<mp4_demuxer::MoofParser> mParser;
+};
+#endif // MOZ_FMP4
+
+#ifdef MOZ_FMP4
+class ADTSContainerParser : public ContainerParser {
+public:
+ explicit ADTSContainerParser(const nsACString& aType)
+ : ContainerParser(aType)
+ {}
+
+ typedef struct {
+ size_t header_length; // Length of just the initialization data.
+ size_t frame_length; // Includes header_length;
+ uint8_t aac_frames; // Number of AAC frames in the ADTS frame.
+ bool have_crc;
+ } Header;
+
+ /// Helper to parse the ADTS header, returning data we care about.
+ /// Returns true if the header is parsed successfully.
+ /// Returns false if the header is invalid or incomplete,
+ /// without modifying the passed-in Header object.
+ bool Parse(MediaByteBuffer* aData, Header& header)
+ {
+ MOZ_ASSERT(aData);
+
+ // ADTS initialization segments are just the packet header.
+ if (aData->Length() < 7) {
+ MSE_DEBUG(ADTSContainerParser, "buffer too short for header.");
+ return false;
+ }
+ // Check 0xfffx sync word plus layer 0.
+ if (((*aData)[0] != 0xff) || (((*aData)[1] & 0xf6) != 0xf0)) {
+ MSE_DEBUG(ADTSContainerParser, "no syncword.");
+ return false;
+ }
+ bool have_crc = !((*aData)[1] & 0x01);
+ if (have_crc && aData->Length() < 9) {
+ MSE_DEBUG(ADTSContainerParser, "buffer too short for header with crc.");
+ return false;
+ }
+ uint8_t frequency_index = ((*aData)[2] & 0x3c) >> 2;
+ MOZ_ASSERT(frequency_index < 16);
+ if (frequency_index == 15) {
+ MSE_DEBUG(ADTSContainerParser, "explicit frequency disallowed.");
+ return false;
+ }
+ size_t header_length = have_crc ? 9 : 7;
+ size_t data_length = (((*aData)[3] & 0x03) << 11) ||
+ (((*aData)[4] & 0xff) << 3) ||
+ (((*aData)[5] & 0xe0) >> 5);
+ uint8_t frames = ((*aData)[6] & 0x03) + 1;
+ MOZ_ASSERT(frames > 0);
+ MOZ_ASSERT(frames < 4);
+
+ // Return successfully parsed data.
+ header.header_length = header_length;
+ header.frame_length = header_length + data_length;
+ header.aac_frames = frames;
+ header.have_crc = have_crc;
+ return true;
+ }
+
+ MediaResult IsInitSegmentPresent(MediaByteBuffer* aData) override
+ {
+ // Call superclass for logging.
+ ContainerParser::IsInitSegmentPresent(aData);
+
+ Header header;
+ if (!Parse(aData, header)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ MSE_DEBUGV(ADTSContainerParser, "%llu byte frame %d aac frames%s",
+ (unsigned long long)header.frame_length, (int)header.aac_frames,
+ header.have_crc ? " crc" : "");
+
+ return NS_OK;
+ }
+
+ MediaResult IsMediaSegmentPresent(MediaByteBuffer* aData) override
+ {
+ // Call superclass for logging.
+ ContainerParser::IsMediaSegmentPresent(aData);
+
+ // Make sure we have a header so we know how long the frame is.
+ // NB this assumes the media segment buffer starts with an
+ // initialization segment. Since every frame has an ADTS header
+ // this is a normal place to divide packets, but we can re-parse
+ // mInitData if we need to handle separate media segments.
+ Header header;
+ if (!Parse(aData, header)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ // We're supposed to return true as long as aData contains the
+ // start of a media segment, whether or not it's complete. So
+ // return true if we have any data beyond the header.
+ if (aData->Length() <= header.header_length) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ // We should have at least a partial frame.
+ return NS_OK;
+ }
+
+ MediaResult ParseStartAndEndTimestamps(MediaByteBuffer* aData,
+ int64_t& aStart,
+ int64_t& aEnd) override
+ {
+ // ADTS header.
+ Header header;
+ if (!Parse(aData, header)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ mHasInitData = true;
+ mCompleteInitSegmentRange = MediaByteRange(0, int64_t(header.header_length));
+
+ // Cache raw header in case the caller wants a copy.
+ mInitData = new MediaByteBuffer(header.header_length);
+ mInitData->AppendElements(aData->Elements(), header.header_length);
+
+ // Check that we have enough data for the frame body.
+ if (aData->Length() < header.frame_length) {
+ MSE_DEBUGV(ADTSContainerParser, "Not enough data for %llu byte frame"
+ " in %llu byte buffer.",
+ (unsigned long long)header.frame_length,
+ (unsigned long long)(aData->Length()));
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ mCompleteMediaSegmentRange = MediaByteRange(header.header_length,
+ header.frame_length);
+ // The ADTS MediaSource Byte Stream Format document doesn't
+ // define media header. Just treat it the same as the whole
+ // media segment.
+ mCompleteMediaHeaderRange = mCompleteMediaSegmentRange;
+
+ MSE_DEBUG(ADTSContainerParser, "[%lld, %lld]",
+ aStart, aEnd);
+ // We don't update timestamps, regardless.
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ // Audio shouldn't have gaps.
+ // Especially when we generate the timestamps ourselves.
+ int64_t GetRoundingError() override
+ {
+ return 0;
+ }
+};
+#endif // MOZ_FMP4
+
+/*static*/ ContainerParser*
+ContainerParser::CreateForMIMEType(const nsACString& aType)
+{
+ if (aType.LowerCaseEqualsLiteral("video/webm") || aType.LowerCaseEqualsLiteral("audio/webm")) {
+ return new WebMContainerParser(aType);
+ }
+
+#ifdef MOZ_FMP4
+ if (aType.LowerCaseEqualsLiteral("video/mp4") || aType.LowerCaseEqualsLiteral("audio/mp4")) {
+ return new MP4ContainerParser(aType);
+ }
+ if (aType.LowerCaseEqualsLiteral("audio/aac")) {
+ return new ADTSContainerParser(aType);
+ }
+#endif
+
+ return new ContainerParser(aType);
+}
+
+#undef MSE_DEBUG
+#undef MSE_DEBUGV
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/ContainerParser.h b/dom/media/mediasource/ContainerParser.h
new file mode 100644
index 000000000..e31ed7579
--- /dev/null
+++ b/dom/media/mediasource/ContainerParser.h
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_CONTAINERPARSER_H_
+#define MOZILLA_CONTAINERPARSER_H_
+
+#include "mozilla/RefPtr.h"
+#include "nsString.h"
+#include "MediaResource.h"
+#include "MediaResult.h"
+
+namespace mozilla {
+
+class MediaByteBuffer;
+class SourceBufferResource;
+
+class ContainerParser {
+public:
+ explicit ContainerParser(const nsACString& aType);
+ virtual ~ContainerParser();
+
+ // Return true if aData starts with an initialization segment.
+ // The base implementation exists only for debug logging and is expected
+ // to be called first from the overriding implementation.
+ // Return NS_OK if segment is present, NS_ERROR_NOT_AVAILABLE if no sufficient
+ // data is currently available to make a determination. Any other value
+ // indicates an error.
+ virtual MediaResult IsInitSegmentPresent(MediaByteBuffer* aData);
+
+ // Return true if aData starts with a media segment.
+ // The base implementation exists only for debug logging and is expected
+ // to be called first from the overriding implementation.
+ // Return NS_OK if segment is present, NS_ERROR_NOT_AVAILABLE if no sufficient
+ // data is currently available to make a determination. Any other value
+ // indicates an error.
+ virtual MediaResult IsMediaSegmentPresent(MediaByteBuffer* aData);
+
+ // Parse aData to extract the start and end frame times from the media
+ // segment. aData may not start on a parser sync boundary. Return NS_OK
+ // if aStart and aEnd have been updated and NS_ERROR_NOT_AVAILABLE otherwise
+ // when no error were encountered.
+ virtual MediaResult ParseStartAndEndTimestamps(MediaByteBuffer* aData,
+ int64_t& aStart, int64_t& aEnd);
+
+ // Compare aLhs and rHs, considering any error that may exist in the
+ // timestamps from the format's base representation. Return true if aLhs
+ // == aRhs within the error epsilon.
+ bool TimestampsFuzzyEqual(int64_t aLhs, int64_t aRhs);
+
+ virtual int64_t GetRoundingError();
+
+ MediaByteBuffer* InitData();
+
+ bool HasInitData()
+ {
+ return mHasInitData;
+ }
+
+ // Return true if a complete initialization segment has been passed
+ // to ParseStartAndEndTimestamps(). The calls below to retrieve
+ // MediaByteRanges will be valid from when this call first succeeds.
+ bool HasCompleteInitData();
+ // Returns the byte range of the first complete init segment, or an empty
+ // range if not complete.
+ MediaByteRange InitSegmentRange();
+ // Returns the byte range of the first complete media segment header,
+ // or an empty range if not complete.
+ MediaByteRange MediaHeaderRange();
+ // Returns the byte range of the first complete media segment or an empty
+ // range if not complete.
+ MediaByteRange MediaSegmentRange();
+
+ static ContainerParser* CreateForMIMEType(const nsACString& aType);
+
+protected:
+ RefPtr<MediaByteBuffer> mInitData;
+ RefPtr<SourceBufferResource> mResource;
+ bool mHasInitData;
+ MediaByteRange mCompleteInitSegmentRange;
+ MediaByteRange mCompleteMediaHeaderRange;
+ MediaByteRange mCompleteMediaSegmentRange;
+ const nsCString mType;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_CONTAINERPARSER_H_ */
diff --git a/dom/media/mediasource/MediaSource.cpp b/dom/media/mediasource/MediaSource.cpp
new file mode 100644
index 000000000..af541bbbb
--- /dev/null
+++ b/dom/media/mediasource/MediaSource.cpp
@@ -0,0 +1,591 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaSource.h"
+
+#include "AsyncEventRunner.h"
+#include "DecoderTraits.h"
+#include "Benchmark.h"
+#include "DecoderDoctorDiagnostics.h"
+#include "MediaContentType.h"
+#include "MediaResult.h"
+#include "MediaSourceUtils.h"
+#include "SourceBuffer.h"
+#include "SourceBufferList.h"
+#include "mozilla/ErrorResult.h"
+#include "mozilla/FloatingPoint.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/mozalloc.h"
+#include "nsDebug.h"
+#include "nsError.h"
+#include "nsIRunnable.h"
+#include "nsIScriptObjectPrincipal.h"
+#include "nsPIDOMWindow.h"
+#include "nsString.h"
+#include "nsThreadUtils.h"
+#include "mozilla/Logging.h"
+#include "nsServiceManagerUtils.h"
+#include "mozilla/gfx/gfxVars.h"
+#include "mozilla/Sprintf.h"
+
+#ifdef MOZ_WIDGET_ANDROID
+#include "AndroidBridge.h"
+#endif
+
+struct JSContext;
+class JSObject;
+
+mozilla::LogModule* GetMediaSourceLog()
+{
+ static mozilla::LazyLogModule sLogModule("MediaSource");
+ return sLogModule;
+}
+
+mozilla::LogModule* GetMediaSourceAPILog()
+{
+ static mozilla::LazyLogModule sLogModule("MediaSource");
+ return sLogModule;
+}
+
+#define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("MediaSource(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define MSE_API(arg, ...) MOZ_LOG(GetMediaSourceAPILog(), mozilla::LogLevel::Debug, ("MediaSource(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+// Arbitrary limit.
+static const unsigned int MAX_SOURCE_BUFFERS = 16;
+
+namespace mozilla {
+
+// Returns true if we should enable MSE webm regardless of preferences.
+// 1. If MP4/H264 isn't supported:
+// * Windows XP
+// * Windows Vista and Server 2008 without the optional "Platform Update Supplement"
+// * N/KN editions (Europe and Korea) of Windows 7/8/8.1/10 without the
+// optional "Windows Media Feature Pack"
+// 2. If H264 hardware acceleration is not available.
+// 3. The CPU is considered to be fast enough
+static bool
+IsWebMForced(DecoderDoctorDiagnostics* aDiagnostics)
+{
+ bool mp4supported =
+ DecoderTraits::IsMP4TypeAndEnabled(NS_LITERAL_CSTRING("video/mp4"),
+ aDiagnostics);
+ bool hwsupported = gfx::gfxVars::CanUseHardwareVideoDecoding();
+#ifdef MOZ_WIDGET_ANDROID
+ return !mp4supported || !hwsupported || VP9Benchmark::IsVP9DecodeFast() ||
+ java::HardwareCodecCapabilityUtils::HasHWVP9();
+#else
+ return !mp4supported || !hwsupported || VP9Benchmark::IsVP9DecodeFast();
+#endif
+}
+
+namespace dom {
+
+/* static */
+nsresult
+MediaSource::IsTypeSupported(const nsAString& aType, DecoderDoctorDiagnostics* aDiagnostics)
+{
+ if (aType.IsEmpty()) {
+ return NS_ERROR_DOM_TYPE_ERR;
+ }
+
+ MediaContentType contentType{aType};
+ if (!contentType.IsValid()) {
+ return NS_ERROR_DOM_TYPE_ERR;
+ }
+
+ if (DecoderTraits::CanHandleContentType(contentType, aDiagnostics)
+ == CANPLAY_NO) {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+
+ // Now we know that this media type could be played.
+ // MediaSource imposes extra restrictions, and some prefs.
+ const nsACString& mimeType = contentType.GetMIMEType();
+ if (mimeType.EqualsASCII("video/mp4") || mimeType.EqualsASCII("audio/mp4")) {
+ if (!Preferences::GetBool("media.mediasource.mp4.enabled", false)) {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+ return NS_OK;
+ }
+ if (mimeType.EqualsASCII("video/webm")) {
+ if (!(Preferences::GetBool("media.mediasource.webm.enabled", false) ||
+ IsWebMForced(aDiagnostics))) {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+ return NS_OK;
+ }
+ if (mimeType.EqualsASCII("audio/webm")) {
+ if (!(Preferences::GetBool("media.mediasource.webm.enabled", false) ||
+ Preferences::GetBool("media.mediasource.webm.audio.enabled", true))) {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+ return NS_OK;
+ }
+
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+}
+
+/* static */ already_AddRefed<MediaSource>
+MediaSource::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_UNEXPECTED);
+ return nullptr;
+ }
+
+ RefPtr<MediaSource> mediaSource = new MediaSource(window);
+ return mediaSource.forget();
+}
+
+MediaSource::~MediaSource()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("");
+ if (mDecoder) {
+ mDecoder->DetachMediaSource();
+ }
+}
+
+SourceBufferList*
+MediaSource::SourceBuffers()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT_IF(mReadyState == MediaSourceReadyState::Closed, mSourceBuffers->IsEmpty());
+ return mSourceBuffers;
+}
+
+SourceBufferList*
+MediaSource::ActiveSourceBuffers()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT_IF(mReadyState == MediaSourceReadyState::Closed, mActiveSourceBuffers->IsEmpty());
+ return mActiveSourceBuffers;
+}
+
+MediaSourceReadyState
+MediaSource::ReadyState()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mReadyState;
+}
+
+double
+MediaSource::Duration()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mReadyState == MediaSourceReadyState::Closed) {
+ return UnspecifiedNaN<double>();
+ }
+ MOZ_ASSERT(mDecoder);
+ return mDecoder->GetDuration();
+}
+
+void
+MediaSource::SetDuration(double aDuration, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("SetDuration(aDuration=%f, ErrorResult)", aDuration);
+ if (aDuration < 0 || IsNaN(aDuration)) {
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ return;
+ }
+ if (mReadyState != MediaSourceReadyState::Open ||
+ mSourceBuffers->AnyUpdating()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ DurationChange(aDuration, aRv);
+}
+
+void
+MediaSource::SetDuration(double aDuration)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("SetDuration(aDuration=%f)", aDuration);
+ mDecoder->SetMediaSourceDuration(aDuration);
+}
+
+already_AddRefed<SourceBuffer>
+MediaSource::AddSourceBuffer(const nsAString& aType, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DecoderDoctorDiagnostics diagnostics;
+ nsresult rv = IsTypeSupported(aType, &diagnostics);
+ diagnostics.StoreFormatDiagnostics(GetOwner()
+ ? GetOwner()->GetExtantDoc()
+ : nullptr,
+ aType, NS_SUCCEEDED(rv), __func__);
+ MSE_API("AddSourceBuffer(aType=%s)%s",
+ NS_ConvertUTF16toUTF8(aType).get(),
+ rv == NS_OK ? "" : " [not supported]");
+ if (NS_FAILED(rv)) {
+ aRv.Throw(rv);
+ return nullptr;
+ }
+ if (mSourceBuffers->Length() >= MAX_SOURCE_BUFFERS) {
+ aRv.Throw(NS_ERROR_DOM_QUOTA_EXCEEDED_ERR);
+ return nullptr;
+ }
+ if (mReadyState != MediaSourceReadyState::Open) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+ MediaContentType contentType{aType};
+ if (!contentType.IsValid()) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+ const nsACString& mimeType = contentType.GetMIMEType();
+ RefPtr<SourceBuffer> sourceBuffer = new SourceBuffer(this, mimeType);
+ if (!sourceBuffer) {
+ aRv.Throw(NS_ERROR_FAILURE); // XXX need a better error here
+ return nullptr;
+ }
+ mSourceBuffers->Append(sourceBuffer);
+ MSE_DEBUG("sourceBuffer=%p", sourceBuffer.get());
+ return sourceBuffer.forget();
+}
+
+void
+MediaSource::SourceBufferIsActive(SourceBuffer* aSourceBuffer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mActiveSourceBuffers->ClearSimple();
+ bool found = false;
+ for (uint32_t i = 0; i < mSourceBuffers->Length(); i++) {
+ SourceBuffer* sourceBuffer = mSourceBuffers->IndexedGetter(i, found);
+ MOZ_ALWAYS_TRUE(found);
+ if (sourceBuffer == aSourceBuffer) {
+ mActiveSourceBuffers->Append(aSourceBuffer);
+ } else if (sourceBuffer->IsActive()) {
+ mActiveSourceBuffers->AppendSimple(sourceBuffer);
+ }
+ }
+}
+
+void
+MediaSource::RemoveSourceBuffer(SourceBuffer& aSourceBuffer, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ SourceBuffer* sourceBuffer = &aSourceBuffer;
+ MSE_API("RemoveSourceBuffer(aSourceBuffer=%p)", sourceBuffer);
+ if (!mSourceBuffers->Contains(sourceBuffer)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
+ return;
+ }
+
+ sourceBuffer->AbortBufferAppend();
+ // TODO:
+ // abort stream append loop (if running)
+
+ // TODO:
+ // For all sourceBuffer audioTracks, videoTracks, textTracks:
+ // set sourceBuffer to null
+ // remove sourceBuffer video, audio, text Tracks from MediaElement tracks
+ // remove sourceBuffer video, audio, text Tracks and fire "removetrack" at affected lists
+ // fire "removetrack" at modified MediaElement track lists
+ // If removed enabled/selected, fire "change" at affected MediaElement list.
+ if (mActiveSourceBuffers->Contains(sourceBuffer)) {
+ mActiveSourceBuffers->Remove(sourceBuffer);
+ }
+ mSourceBuffers->Remove(sourceBuffer);
+ // TODO: Free all resources associated with sourceBuffer
+}
+
+void
+MediaSource::EndOfStream(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("EndOfStream(aError=%d)",
+ aError.WasPassed() ? uint32_t(aError.Value()) : 0);
+ if (mReadyState != MediaSourceReadyState::Open ||
+ mSourceBuffers->AnyUpdating()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ SetReadyState(MediaSourceReadyState::Ended);
+ mSourceBuffers->Ended();
+ if (!aError.WasPassed()) {
+ DurationChange(mSourceBuffers->GetHighestBufferedEndTime(), aRv);
+ // Notify reader that all data is now available.
+ mDecoder->Ended(true);
+ return;
+ }
+ switch (aError.Value()) {
+ case MediaSourceEndOfStreamError::Network:
+ mDecoder->NetworkError();
+ break;
+ case MediaSourceEndOfStreamError::Decode:
+ mDecoder->DecodeError(NS_ERROR_DOM_MEDIA_FATAL_ERR);
+ break;
+ default:
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ }
+}
+
+void
+MediaSource::EndOfStream(const MediaResult& aError)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("EndOfStream(aError=%d)", aError.Code());
+
+ SetReadyState(MediaSourceReadyState::Ended);
+ mSourceBuffers->Ended();
+ mDecoder->DecodeError(aError);
+}
+
+/* static */ bool
+MediaSource::IsTypeSupported(const GlobalObject& aOwner, const nsAString& aType)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ DecoderDoctorDiagnostics diagnostics;
+ nsresult rv = IsTypeSupported(aType, &diagnostics);
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aOwner.GetAsSupports());
+ diagnostics.StoreFormatDiagnostics(window ? window->GetExtantDoc() : nullptr,
+ aType, NS_SUCCEEDED(rv), __func__);
+#define this nullptr
+ MSE_API("IsTypeSupported(aType=%s)%s ",
+ NS_ConvertUTF16toUTF8(aType).get(), rv == NS_OK ? "OK" : "[not supported]");
+#undef this // don't ever remove this line !
+ return NS_SUCCEEDED(rv);
+}
+
+/* static */ bool
+MediaSource::Enabled(JSContext* cx, JSObject* aGlobal)
+{
+ return Preferences::GetBool("media.mediasource.enabled");
+}
+
+void
+MediaSource::SetLiveSeekableRange(double aStart, double aEnd, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // 1. If the readyState attribute is not "open" then throw an InvalidStateError
+ // exception and abort these steps.
+ if (mReadyState != MediaSourceReadyState::Open) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ // 2. If start is negative or greater than end, then throw a TypeError
+ // exception and abort these steps.
+ if (aStart < 0 || aStart > aEnd) {
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ return;
+ }
+
+ // 3. Set live seekable range to be a new normalized TimeRanges object
+ // containing a single range whose start position is start and end position is
+ // end.
+ mLiveSeekableRange =
+ Some(media::TimeInterval(media::TimeUnit::FromSeconds(aStart),
+ media::TimeUnit::FromSeconds(aEnd)));
+}
+
+void
+MediaSource::ClearLiveSeekableRange(ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // 1. If the readyState attribute is not "open" then throw an InvalidStateError
+ // exception and abort these steps.
+ if (mReadyState != MediaSourceReadyState::Open) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ // 2. If live seekable range contains a range, then set live seekable range to
+ // be a new empty TimeRanges object.
+ mLiveSeekableRange.reset();
+}
+
+bool
+MediaSource::Attach(MediaSourceDecoder* aDecoder)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("Attach(aDecoder=%p) owner=%p", aDecoder, aDecoder->GetOwner());
+ MOZ_ASSERT(aDecoder);
+ MOZ_ASSERT(aDecoder->GetOwner());
+ if (mReadyState != MediaSourceReadyState::Closed) {
+ return false;
+ }
+ MOZ_ASSERT(!mMediaElement);
+ mMediaElement = aDecoder->GetOwner()->GetMediaElement();
+ MOZ_ASSERT(!mDecoder);
+ mDecoder = aDecoder;
+ mDecoder->AttachMediaSource(this);
+ SetReadyState(MediaSourceReadyState::Open);
+ return true;
+}
+
+void
+MediaSource::Detach()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("mDecoder=%p owner=%p",
+ mDecoder.get(), mDecoder ? mDecoder->GetOwner() : nullptr);
+ if (!mDecoder) {
+ MOZ_ASSERT(mReadyState == MediaSourceReadyState::Closed);
+ MOZ_ASSERT(mActiveSourceBuffers->IsEmpty() && mSourceBuffers->IsEmpty());
+ return;
+ }
+ mMediaElement = nullptr;
+ SetReadyState(MediaSourceReadyState::Closed);
+ if (mActiveSourceBuffers) {
+ mActiveSourceBuffers->Clear();
+ }
+ if (mSourceBuffers) {
+ mSourceBuffers->Clear();
+ }
+ mDecoder->DetachMediaSource();
+ mDecoder = nullptr;
+}
+
+MediaSource::MediaSource(nsPIDOMWindowInner* aWindow)
+ : DOMEventTargetHelper(aWindow)
+ , mDecoder(nullptr)
+ , mPrincipal(nullptr)
+ , mReadyState(MediaSourceReadyState::Closed)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSourceBuffers = new SourceBufferList(this);
+ mActiveSourceBuffers = new SourceBufferList(this);
+
+ nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
+ if (sop) {
+ mPrincipal = sop->GetPrincipal();
+ }
+
+ MSE_API("MediaSource(aWindow=%p) mSourceBuffers=%p mActiveSourceBuffers=%p",
+ aWindow, mSourceBuffers.get(), mActiveSourceBuffers.get());
+}
+
+void
+MediaSource::SetReadyState(MediaSourceReadyState aState)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aState != mReadyState);
+ MSE_DEBUG("SetReadyState(aState=%d) mReadyState=%d", aState, mReadyState);
+
+ MediaSourceReadyState oldState = mReadyState;
+ mReadyState = aState;
+
+ if (mReadyState == MediaSourceReadyState::Open &&
+ (oldState == MediaSourceReadyState::Closed ||
+ oldState == MediaSourceReadyState::Ended)) {
+ QueueAsyncSimpleEvent("sourceopen");
+ if (oldState == MediaSourceReadyState::Ended) {
+ // Notify reader that more data may come.
+ mDecoder->Ended(false);
+ }
+ return;
+ }
+
+ if (mReadyState == MediaSourceReadyState::Ended &&
+ oldState == MediaSourceReadyState::Open) {
+ QueueAsyncSimpleEvent("sourceended");
+ return;
+ }
+
+ if (mReadyState == MediaSourceReadyState::Closed &&
+ (oldState == MediaSourceReadyState::Open ||
+ oldState == MediaSourceReadyState::Ended)) {
+ QueueAsyncSimpleEvent("sourceclose");
+ return;
+ }
+
+ NS_WARNING("Invalid MediaSource readyState transition");
+}
+
+void
+MediaSource::DispatchSimpleEvent(const char* aName)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("Dispatch event '%s'", aName);
+ DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName));
+}
+
+void
+MediaSource::QueueAsyncSimpleEvent(const char* aName)
+{
+ MSE_DEBUG("Queuing event '%s'", aName);
+ nsCOMPtr<nsIRunnable> event = new AsyncEventRunner<MediaSource>(this, aName);
+ NS_DispatchToMainThread(event);
+}
+
+void
+MediaSource::DurationChange(double aNewDuration, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("DurationChange(aNewDuration=%f)", aNewDuration);
+
+ // 1. If the current value of duration is equal to new duration, then return.
+ if (mDecoder->GetDuration() == aNewDuration) {
+ return;
+ }
+
+ // 2. If new duration is less than the highest starting presentation timestamp
+ // of any buffered coded frames for all SourceBuffer objects in sourceBuffers,
+ // then throw an InvalidStateError exception and abort these steps.
+ if (aNewDuration < mSourceBuffers->HighestStartTime()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ // 3. Let highest end time be the largest track buffer ranges end time across
+ // all the track buffers across all SourceBuffer objects in sourceBuffers.
+ double highestEndTime = mSourceBuffers->HighestEndTime();
+ // 4. If new duration is less than highest end time, then
+ // 4.1 Update new duration to equal highest end time.
+ aNewDuration =
+ std::max(aNewDuration, highestEndTime);
+
+ // 5. Update the media duration to new duration and run the HTMLMediaElement
+ // duration change algorithm.
+ mDecoder->SetMediaSourceDuration(aNewDuration);
+}
+
+void
+MediaSource::GetMozDebugReaderData(nsAString& aString)
+{
+ mDecoder->GetMozDebugReaderData(aString);
+}
+
+nsPIDOMWindowInner*
+MediaSource::GetParentObject() const
+{
+ return GetOwner();
+}
+
+JSObject*
+MediaSource::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaSourceBinding::Wrap(aCx, this, aGivenProto);
+}
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaSource, DOMEventTargetHelper,
+ mMediaElement,
+ mSourceBuffers, mActiveSourceBuffers)
+
+NS_IMPL_ADDREF_INHERITED(MediaSource, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(MediaSource, DOMEventTargetHelper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaSource)
+ NS_INTERFACE_MAP_ENTRY(mozilla::dom::MediaSource)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+#undef MSE_DEBUG
+#undef MSE_API
+
+} // namespace dom
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/MediaSource.h b/dom/media/mediasource/MediaSource.h
new file mode 100644
index 000000000..0d2dc0588
--- /dev/null
+++ b/dom/media/mediasource/MediaSource.h
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_MediaSource_h_
+#define mozilla_dom_MediaSource_h_
+
+#include "MediaSourceDecoder.h"
+#include "js/RootingAPI.h"
+#include "mozilla/Assertions.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/MediaSourceBinding.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionNoteChild.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsID.h"
+#include "nsISupports.h"
+#include "nscore.h"
+#include "TimeUnits.h"
+
+struct JSContext;
+class JSObject;
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class ErrorResult;
+template <typename T> class AsyncEventRunner;
+class MediaResult;
+
+namespace dom {
+
+class GlobalObject;
+class SourceBuffer;
+class SourceBufferList;
+template <typename T> class Optional;
+
+#define MOZILLA_DOM_MEDIASOURCE_IMPLEMENTATION_IID \
+ { 0x3839d699, 0x22c5, 0x439f, \
+ { 0x94, 0xca, 0x0e, 0x0b, 0x26, 0xf9, 0xca, 0xbf } }
+
+class MediaSource final : public DOMEventTargetHelper
+{
+public:
+ /** WebIDL Methods. */
+ static already_AddRefed<MediaSource>
+ Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv);
+
+ SourceBufferList* SourceBuffers();
+ SourceBufferList* ActiveSourceBuffers();
+ MediaSourceReadyState ReadyState();
+
+ double Duration();
+ void SetDuration(double aDuration, ErrorResult& aRv);
+
+ already_AddRefed<SourceBuffer> AddSourceBuffer(const nsAString& aType, ErrorResult& aRv);
+ void RemoveSourceBuffer(SourceBuffer& aSourceBuffer, ErrorResult& aRv);
+
+ void EndOfStream(const Optional<MediaSourceEndOfStreamError>& aError, ErrorResult& aRv);
+ void EndOfStream(const MediaResult& aError);
+
+ void SetLiveSeekableRange(double aStart, double aEnd, ErrorResult& aRv);
+ void ClearLiveSeekableRange(ErrorResult& aRv);
+
+ static bool IsTypeSupported(const GlobalObject&, const nsAString& aType);
+ static nsresult IsTypeSupported(const nsAString& aType, DecoderDoctorDiagnostics* aDiagnostics);
+
+ static bool Enabled(JSContext* cx, JSObject* aGlobal);
+
+ IMPL_EVENT_HANDLER(sourceopen);
+ IMPL_EVENT_HANDLER(sourceended);
+ IMPL_EVENT_HANDLER(sourceclosed);
+
+ /** End WebIDL Methods. */
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaSource, DOMEventTargetHelper)
+ NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOM_MEDIASOURCE_IMPLEMENTATION_IID)
+
+ nsPIDOMWindowInner* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // Attach this MediaSource to Decoder aDecoder. Returns false if already attached.
+ bool Attach(MediaSourceDecoder* aDecoder);
+ void Detach();
+
+ // Set mReadyState to aState and fire the required events at the MediaSource.
+ void SetReadyState(MediaSourceReadyState aState);
+
+ // Used by SourceBuffer to call CreateSubDecoder.
+ MediaSourceDecoder* GetDecoder()
+ {
+ return mDecoder;
+ }
+
+ nsIPrincipal* GetPrincipal()
+ {
+ return mPrincipal;
+ }
+
+ // Returns a string describing the state of the MediaSource internal
+ // buffered data. Used for debugging purposes.
+ void GetMozDebugReaderData(nsAString& aString);
+
+ bool HasLiveSeekableRange() const { return mLiveSeekableRange.isSome(); }
+ media::TimeInterval LiveSeekableRange() const
+ {
+ return mLiveSeekableRange.value();
+ }
+
+private:
+ // SourceBuffer uses SetDuration and SourceBufferIsActive
+ friend class mozilla::dom::SourceBuffer;
+
+ ~MediaSource();
+
+ explicit MediaSource(nsPIDOMWindowInner* aWindow);
+
+ friend class AsyncEventRunner<MediaSource>;
+ void DispatchSimpleEvent(const char* aName);
+ void QueueAsyncSimpleEvent(const char* aName);
+
+ void DurationChange(double aNewDuration, ErrorResult& aRv);
+
+ // SetDuration with no checks.
+ void SetDuration(double aDuration);
+
+ // Mark SourceBuffer as active and rebuild ActiveSourceBuffers.
+ void SourceBufferIsActive(SourceBuffer* aSourceBuffer);
+
+ RefPtr<SourceBufferList> mSourceBuffers;
+ RefPtr<SourceBufferList> mActiveSourceBuffers;
+
+ RefPtr<MediaSourceDecoder> mDecoder;
+ // Ensures the media element remains alive to dispatch progress and
+ // durationchanged events.
+ RefPtr<HTMLMediaElement> mMediaElement;
+
+ RefPtr<nsIPrincipal> mPrincipal;
+
+ MediaSourceReadyState mReadyState;
+
+ Maybe<media::TimeInterval> mLiveSeekableRange;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(MediaSource, MOZILLA_DOM_MEDIASOURCE_IMPLEMENTATION_IID)
+
+} // namespace dom
+
+} // namespace mozilla
+
+#endif /* mozilla_dom_MediaSource_h_ */
diff --git a/dom/media/mediasource/MediaSourceDecoder.cpp b/dom/media/mediasource/MediaSourceDecoder.cpp
new file mode 100644
index 000000000..2e83bfd23
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceDecoder.cpp
@@ -0,0 +1,361 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "MediaSourceDecoder.h"
+
+#include "mozilla/Logging.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "MediaDecoderStateMachine.h"
+#include "MediaShutdownManager.h"
+#include "MediaSource.h"
+#include "MediaSourceResource.h"
+#include "MediaSourceUtils.h"
+#include "VideoUtils.h"
+#include "MediaSourceDemuxer.h"
+#include "SourceBufferList.h"
+#include <algorithm>
+
+extern mozilla::LogModule* GetMediaSourceLog();
+
+#define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("MediaSourceDecoder(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define MSE_DEBUGV(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Verbose, ("MediaSourceDecoder(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+using namespace mozilla::media;
+
+namespace mozilla {
+
+MediaSourceDecoder::MediaSourceDecoder(dom::HTMLMediaElement* aElement)
+ : MediaDecoder(aElement)
+ , mMediaSource(nullptr)
+ , mEnded(false)
+{
+ mExplicitDuration.Set(Some(UnspecifiedNaN<double>()));
+}
+
+MediaDecoder*
+MediaSourceDecoder::Clone(MediaDecoderOwner* aOwner)
+{
+ // TODO: Sort out cloning.
+ return nullptr;
+}
+
+MediaDecoderStateMachine*
+MediaSourceDecoder::CreateStateMachine()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mDemuxer = new MediaSourceDemuxer();
+ mReader = new MediaFormatReader(this, mDemuxer, GetVideoFrameContainer());
+ return new MediaDecoderStateMachine(this, mReader);
+}
+
+nsresult
+MediaSourceDecoder::Load(nsIStreamListener**)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!GetStateMachine());
+
+ nsresult rv = MediaShutdownManager::Instance().Register(this);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ SetStateMachine(CreateStateMachine());
+ if (!GetStateMachine()) {
+ NS_WARNING("Failed to create state machine!");
+ return NS_ERROR_FAILURE;
+ }
+
+ rv = GetStateMachine()->Init(this);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ SetStateMachineParameters();
+ return NS_OK;
+}
+
+media::TimeIntervals
+MediaSourceDecoder::GetSeekable()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!mMediaSource) {
+ NS_WARNING("MediaSource element isn't attached");
+ return media::TimeIntervals::Invalid();
+ }
+
+ media::TimeIntervals seekable;
+ double duration = mMediaSource->Duration();
+ if (IsNaN(duration)) {
+ // Return empty range.
+ } else if (duration > 0 && mozilla::IsInfinite(duration)) {
+ media::TimeIntervals buffered = GetBuffered();
+
+ // 1. If live seekable range is not empty:
+ if (mMediaSource->HasLiveSeekableRange()) {
+ // 1. Let union ranges be the union of live seekable range and the
+ // HTMLMediaElement.buffered attribute.
+ media::TimeIntervals unionRanges =
+ buffered + mMediaSource->LiveSeekableRange();
+ // 2. Return a single range with a start time equal to the earliest start
+ // time in union ranges and an end time equal to the highest end time in
+ // union ranges and abort these steps.
+ seekable +=
+ media::TimeInterval(unionRanges.GetStart(), unionRanges.GetEnd());
+ return seekable;
+ }
+
+ if (buffered.Length()) {
+ seekable +=
+ media::TimeInterval(media::TimeUnit::FromSeconds(0), buffered.GetEnd());
+ }
+ } else {
+ seekable += media::TimeInterval(media::TimeUnit::FromSeconds(0),
+ media::TimeUnit::FromSeconds(duration));
+ }
+ MSE_DEBUG("ranges=%s", DumpTimeRanges(seekable).get());
+ return seekable;
+}
+
+media::TimeIntervals
+MediaSourceDecoder::GetBuffered()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mMediaSource) {
+ NS_WARNING("MediaSource element isn't attached");
+ return media::TimeIntervals::Invalid();
+ }
+ dom::SourceBufferList* sourceBuffers = mMediaSource->ActiveSourceBuffers();
+ if (!sourceBuffers) {
+ // Media source object is shutting down.
+ return TimeIntervals();
+ }
+ media::TimeUnit highestEndTime;
+ nsTArray<media::TimeIntervals> activeRanges;
+ media::TimeIntervals buffered;
+
+ for (uint32_t i = 0; i < sourceBuffers->Length(); i++) {
+ bool found;
+ dom::SourceBuffer* sb = sourceBuffers->IndexedGetter(i, found);
+ MOZ_ASSERT(found);
+
+ activeRanges.AppendElement(sb->GetTimeIntervals());
+ highestEndTime =
+ std::max(highestEndTime, activeRanges.LastElement().GetEnd());
+ }
+
+ buffered +=
+ media::TimeInterval(media::TimeUnit::FromMicroseconds(0), highestEndTime);
+
+ for (auto& range : activeRanges) {
+ if (mEnded && range.Length()) {
+ // Set the end time on the last range to highestEndTime by adding a
+ // new range spanning the current end time to highestEndTime, which
+ // Normalize() will then merge with the old last range.
+ range +=
+ media::TimeInterval(range.GetEnd(), highestEndTime);
+ }
+ buffered.Intersection(range);
+ }
+
+ MSE_DEBUG("ranges=%s", DumpTimeRanges(buffered).get());
+ return buffered;
+}
+
+void
+MediaSourceDecoder::Shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("Shutdown");
+ // Detach first so that TrackBuffers are unused on the main thread when
+ // shut down on the decode task queue.
+ if (mMediaSource) {
+ mMediaSource->Detach();
+ }
+ mDemuxer = nullptr;
+
+ MediaDecoder::Shutdown();
+}
+
+/*static*/
+already_AddRefed<MediaResource>
+MediaSourceDecoder::CreateResource(nsIPrincipal* aPrincipal)
+{
+ return RefPtr<MediaResource>(new MediaSourceResource(aPrincipal)).forget();
+}
+
+void
+MediaSourceDecoder::AttachMediaSource(dom::MediaSource* aMediaSource)
+{
+ MOZ_ASSERT(!mMediaSource && !GetStateMachine() && NS_IsMainThread());
+ mMediaSource = aMediaSource;
+}
+
+void
+MediaSourceDecoder::DetachMediaSource()
+{
+ MOZ_ASSERT(mMediaSource && NS_IsMainThread());
+ mMediaSource = nullptr;
+}
+
+void
+MediaSourceDecoder::Ended(bool aEnded)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ static_cast<MediaSourceResource*>(GetResource())->SetEnded(aEnded);
+ if (aEnded) {
+ // We want the MediaSourceReader to refresh its buffered range as it may
+ // have been modified (end lined up).
+ NotifyDataArrived();
+ }
+ mEnded = aEnded;
+}
+
+void
+MediaSourceDecoder::AddSizeOfResources(ResourceSizes* aSizes)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (GetDemuxer()) {
+ GetDemuxer()->AddSizeOfResources(aSizes);
+ }
+}
+
+void
+MediaSourceDecoder::SetInitialDuration(int64_t aDuration)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Only use the decoded duration if one wasn't already
+ // set.
+ if (!mMediaSource || !IsNaN(ExplicitDuration())) {
+ return;
+ }
+ double duration = aDuration;
+ // A duration of -1 is +Infinity.
+ if (aDuration >= 0) {
+ duration /= USECS_PER_S;
+ }
+ SetMediaSourceDuration(duration);
+}
+
+void
+MediaSourceDecoder::SetMediaSourceDuration(double aDuration)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!IsShutdown());
+ if (aDuration >= 0) {
+ int64_t checkedDuration;
+ if (NS_FAILED(SecondsToUsecs(aDuration, checkedDuration))) {
+ // INT64_MAX is used as infinity by the state machine.
+ // We want a very bigger number, but not infinity.
+ checkedDuration = INT64_MAX - 1;
+ }
+ SetExplicitDuration(aDuration);
+ } else {
+ SetExplicitDuration(PositiveInfinity<double>());
+ }
+}
+
+void
+MediaSourceDecoder::GetMozDebugReaderData(nsAString& aString)
+{
+ if (mReader && mDemuxer) {
+ mReader->GetMozDebugReaderData(aString);
+ mDemuxer->GetMozDebugReaderData(aString);
+ }
+}
+
+double
+MediaSourceDecoder::GetDuration()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return ExplicitDuration();
+}
+
+MediaDecoderOwner::NextFrameStatus
+MediaSourceDecoder::NextFrameBufferedStatus()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mMediaSource ||
+ mMediaSource->ReadyState() == dom::MediaSourceReadyState::Closed) {
+ return MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
+ }
+
+ // Next frame hasn't been decoded yet.
+ // Use the buffered range to consider if we have the next frame available.
+ TimeUnit currentPosition = TimeUnit::FromMicroseconds(CurrentPosition());
+ TimeIntervals buffered = GetBuffered();
+ buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
+ TimeInterval interval(
+ currentPosition,
+ currentPosition
+ + media::TimeUnit::FromMicroseconds(DEFAULT_NEXT_FRAME_AVAILABLE_BUFFERED));
+ return buffered.ContainsStrict(ClampIntervalToEnd(interval))
+ ? MediaDecoderOwner::NEXT_FRAME_AVAILABLE
+ : MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
+}
+
+bool
+MediaSourceDecoder::CanPlayThrough()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (NextFrameBufferedStatus() == MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE) {
+ return false;
+ }
+
+ if (IsNaN(mMediaSource->Duration())) {
+ // Don't have any data yet.
+ return false;
+ }
+ TimeUnit duration = TimeUnit::FromSeconds(mMediaSource->Duration());
+ TimeUnit currentPosition = TimeUnit::FromMicroseconds(CurrentPosition());
+ if (duration.IsInfinite()) {
+ // We can't make an informed decision and just assume that it's a live stream
+ return true;
+ } else if (duration <= currentPosition) {
+ return true;
+ }
+ // If we have data up to the mediasource's duration or 30s ahead, we can
+ // assume that we can play without interruption.
+ TimeIntervals buffered = GetBuffered();
+ buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
+ TimeUnit timeAhead =
+ std::min(duration, currentPosition + TimeUnit::FromSeconds(30));
+ TimeInterval interval(currentPosition, timeAhead);
+ return buffered.ContainsStrict(ClampIntervalToEnd(interval));
+}
+
+void
+MediaSourceDecoder::NotifyWaitingForKey()
+{
+ mWaitingForKeyEvent.Notify();
+}
+
+MediaEventSource<void>*
+MediaSourceDecoder::WaitingForKeyEvent()
+{
+ return &mWaitingForKeyEvent;
+}
+
+TimeInterval
+MediaSourceDecoder::ClampIntervalToEnd(const TimeInterval& aInterval)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mEnded) {
+ return aInterval;
+ }
+ TimeUnit duration = TimeUnit::FromSeconds(GetDuration());
+ if (duration < aInterval.mStart) {
+ return aInterval;
+ }
+ return TimeInterval(aInterval.mStart,
+ std::min(aInterval.mEnd, duration),
+ aInterval.mFuzz);
+}
+
+#undef MSE_DEBUG
+#undef MSE_DEBUGV
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/MediaSourceDecoder.h b/dom/media/mediasource/MediaSourceDecoder.h
new file mode 100644
index 000000000..2bf0ad831
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceDecoder.h
@@ -0,0 +1,96 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASOURCEDECODER_H_
+#define MOZILLA_MEDIASOURCEDECODER_H_
+
+#include "mozilla/Atomics.h"
+#include "mozilla/Attributes.h"
+#include "nsCOMPtr.h"
+#include "nsError.h"
+#include "MediaDecoder.h"
+#include "MediaFormatReader.h"
+
+class nsIStreamListener;
+
+namespace mozilla {
+
+class MediaResource;
+class MediaDecoderStateMachine;
+class SourceBufferDecoder;
+class TrackBuffer;
+enum MSRangeRemovalAction : uint8_t;
+class MediaSourceDemuxer;
+
+namespace dom {
+
+class HTMLMediaElement;
+class MediaSource;
+
+} // namespace dom
+
+class MediaSourceDecoder : public MediaDecoder
+{
+public:
+ explicit MediaSourceDecoder(dom::HTMLMediaElement* aElement);
+
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override;
+ MediaDecoderStateMachine* CreateStateMachine() override;
+ nsresult Load(nsIStreamListener**) override;
+ media::TimeIntervals GetSeekable() override;
+ media::TimeIntervals GetBuffered() override;
+
+ void Shutdown() override;
+
+ static already_AddRefed<MediaResource> CreateResource(nsIPrincipal* aPrincipal = nullptr);
+
+ void AttachMediaSource(dom::MediaSource* aMediaSource);
+ void DetachMediaSource();
+
+ void Ended(bool aEnded);
+
+ // Return the duration of the video in seconds.
+ double GetDuration() override;
+
+ void SetInitialDuration(int64_t aDuration);
+ void SetMediaSourceDuration(double aDuration);
+
+ MediaSourceDemuxer* GetDemuxer()
+ {
+ return mDemuxer;
+ }
+
+ // Returns a string describing the state of the MediaSource internal
+ // buffered data. Used for debugging purposes.
+ void GetMozDebugReaderData(nsAString& aString) override;
+
+ void AddSizeOfResources(ResourceSizes* aSizes) override;
+
+ MediaDecoderOwner::NextFrameStatus NextFrameBufferedStatus() override;
+ bool CanPlayThrough() override;
+
+ void NotifyWaitingForKey() override;
+
+ MediaEventSource<void>* WaitingForKeyEvent() override;
+
+private:
+ void DoSetMediaSourceDuration(double aDuration);
+ media::TimeInterval ClampIntervalToEnd(const media::TimeInterval& aInterval);
+
+ // The owning MediaSource holds a strong reference to this decoder, and
+ // calls Attach/DetachMediaSource on this decoder to set and clear
+ // mMediaSource.
+ dom::MediaSource* mMediaSource;
+ RefPtr<MediaSourceDemuxer> mDemuxer;
+ RefPtr<MediaFormatReader> mReader;
+ MediaEventProducer<void> mWaitingForKeyEvent;
+
+ bool mEnded;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_MEDIASOURCEDECODER_H_ */
diff --git a/dom/media/mediasource/MediaSourceDemuxer.cpp b/dom/media/mediasource/MediaSourceDemuxer.cpp
new file mode 100644
index 000000000..73950e1a8
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceDemuxer.cpp
@@ -0,0 +1,499 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <algorithm>
+#include <limits>
+#include <stdint.h>
+
+#include "MediaSourceDemuxer.h"
+#include "MediaSourceUtils.h"
+#include "SourceBufferList.h"
+#include "nsPrintfCString.h"
+#include "OpusDecoder.h"
+
+namespace mozilla {
+
+typedef TrackInfo::TrackType TrackType;
+using media::TimeUnit;
+using media::TimeIntervals;
+
+MediaSourceDemuxer::MediaSourceDemuxer()
+ : mTaskQueue(new AutoTaskQueue(GetMediaThreadPool(MediaThreadType::PLAYBACK),
+ /* aSupportsTailDispatch = */ false))
+ , mMonitor("MediaSourceDemuxer")
+{
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+// Due to inaccuracies in determining buffer end
+// frames (Bug 1065207). This value is based on videos seen in the wild.
+const TimeUnit MediaSourceDemuxer::EOS_FUZZ = media::TimeUnit::FromMicroseconds(500000);
+
+RefPtr<MediaSourceDemuxer::InitPromise>
+MediaSourceDemuxer::Init()
+{
+ return InvokeAsync(GetTaskQueue(), this, __func__,
+ &MediaSourceDemuxer::AttemptInit);
+}
+
+RefPtr<MediaSourceDemuxer::InitPromise>
+MediaSourceDemuxer::AttemptInit()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (ScanSourceBuffersForContent()) {
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+ }
+
+ RefPtr<InitPromise> p = mInitPromise.Ensure(__func__);
+
+ return p;
+}
+
+void
+MediaSourceDemuxer::AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // NB: The track buffers must only be accessed on the TaskQueue.
+ RefPtr<MediaSourceDemuxer> self = this;
+ RefPtr<MediaSourceDecoder::ResourceSizes> sizes = aSizes;
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([self, sizes] () {
+ for (TrackBuffersManager* manager : self->mSourceBuffers) {
+ manager->AddSizeOfResources(sizes);
+ }
+ });
+
+ GetTaskQueue()->Dispatch(task.forget());
+}
+
+void MediaSourceDemuxer::NotifyDataArrived()
+{
+ RefPtr<MediaSourceDemuxer> self = this;
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([self] () {
+ if (self->mInitPromise.IsEmpty()) {
+ return;
+ }
+ if (self->ScanSourceBuffersForContent()) {
+ self->mInitPromise.ResolveIfExists(NS_OK, __func__);
+ }
+ });
+ GetTaskQueue()->Dispatch(task.forget());
+}
+
+bool
+MediaSourceDemuxer::ScanSourceBuffersForContent()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ if (mSourceBuffers.IsEmpty()) {
+ return false;
+ }
+
+ MonitorAutoLock mon(mMonitor);
+
+ bool haveEmptySourceBuffer = false;
+ for (const auto& sourceBuffer : mSourceBuffers) {
+ MediaInfo info = sourceBuffer->GetMetadata();
+ if (!info.HasAudio() && !info.HasVideo()) {
+ haveEmptySourceBuffer = true;
+ }
+ if (info.HasAudio() && !mAudioTrack) {
+ mInfo.mAudio = info.mAudio;
+ mAudioTrack = sourceBuffer;
+ }
+ if (info.HasVideo() && !mVideoTrack) {
+ mInfo.mVideo = info.mVideo;
+ mVideoTrack = sourceBuffer;
+ }
+ if (info.IsEncrypted() && !mInfo.IsEncrypted()) {
+ mInfo.mCrypto = info.mCrypto;
+ }
+ }
+ if (mInfo.HasAudio() && mInfo.HasVideo()) {
+ // We have both audio and video. We can ignore non-ready source buffer.
+ return true;
+ }
+ return !haveEmptySourceBuffer;
+}
+
+bool
+MediaSourceDemuxer::HasTrackType(TrackType aType) const
+{
+ MonitorAutoLock mon(mMonitor);
+
+ switch (aType) {
+ case TrackType::kAudioTrack:
+ return mInfo.HasAudio();
+ case TrackType::kVideoTrack:
+ return mInfo.HasVideo();
+ default:
+ return false;
+ }
+}
+
+uint32_t
+MediaSourceDemuxer::GetNumberTracks(TrackType aType) const
+{
+ return HasTrackType(aType) ? 1u : 0;
+}
+
+already_AddRefed<MediaTrackDemuxer>
+MediaSourceDemuxer::GetTrackDemuxer(TrackType aType, uint32_t aTrackNumber)
+{
+ RefPtr<TrackBuffersManager> manager = GetManager(aType);
+ if (!manager) {
+ return nullptr;
+ }
+ RefPtr<MediaSourceTrackDemuxer> e =
+ new MediaSourceTrackDemuxer(this, aType, manager);
+ mDemuxers.AppendElement(e);
+ return e.forget();
+}
+
+bool
+MediaSourceDemuxer::IsSeekable() const
+{
+ return true;
+}
+
+UniquePtr<EncryptionInfo>
+MediaSourceDemuxer::GetCrypto()
+{
+ MonitorAutoLock mon(mMonitor);
+ auto crypto = MakeUnique<EncryptionInfo>();
+ *crypto = mInfo.mCrypto;
+ return crypto;
+}
+
+void
+MediaSourceDemuxer::AttachSourceBuffer(TrackBuffersManager* aSourceBuffer)
+{
+ nsCOMPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackBuffersManager*>(
+ this, &MediaSourceDemuxer::DoAttachSourceBuffer,
+ aSourceBuffer);
+ GetTaskQueue()->Dispatch(task.forget());
+}
+
+void
+MediaSourceDemuxer::DoAttachSourceBuffer(mozilla::TrackBuffersManager* aSourceBuffer)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mSourceBuffers.AppendElement(aSourceBuffer);
+ ScanSourceBuffersForContent();
+}
+
+void
+MediaSourceDemuxer::DetachSourceBuffer(TrackBuffersManager* aSourceBuffer)
+{
+ nsCOMPtr<nsIRunnable> task =
+ NewRunnableMethod<TrackBuffersManager*>(
+ this, &MediaSourceDemuxer::DoDetachSourceBuffer,
+ aSourceBuffer);
+ GetTaskQueue()->Dispatch(task.forget());
+}
+
+void
+MediaSourceDemuxer::DoDetachSourceBuffer(TrackBuffersManager* aSourceBuffer)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ for (uint32_t i = 0; i < mSourceBuffers.Length(); i++) {
+ if (mSourceBuffers[i].get() == aSourceBuffer) {
+ mSourceBuffers.RemoveElementAt(i);
+ }
+ }
+ if (aSourceBuffer == mAudioTrack) {
+ mAudioTrack = nullptr;
+ }
+ if (aSourceBuffer == mVideoTrack) {
+ mVideoTrack = nullptr;
+ }
+ ScanSourceBuffersForContent();
+}
+
+TrackInfo*
+MediaSourceDemuxer::GetTrackInfo(TrackType aTrack)
+{
+ MonitorAutoLock mon(mMonitor);
+ switch (aTrack) {
+ case TrackType::kAudioTrack:
+ return &mInfo.mAudio;
+ case TrackType::kVideoTrack:
+ return &mInfo.mVideo;
+ default:
+ return nullptr;
+ }
+}
+
+TrackBuffersManager*
+MediaSourceDemuxer::GetManager(TrackType aTrack)
+{
+ MonitorAutoLock mon(mMonitor);
+ switch (aTrack) {
+ case TrackType::kAudioTrack:
+ return mAudioTrack;
+ case TrackType::kVideoTrack:
+ return mVideoTrack;
+ default:
+ return nullptr;
+ }
+}
+
+MediaSourceDemuxer::~MediaSourceDemuxer()
+{
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+}
+
+void
+MediaSourceDemuxer::GetMozDebugReaderData(nsAString& aString)
+{
+ MonitorAutoLock mon(mMonitor);
+ nsAutoCString result;
+ result += nsPrintfCString("Dumping data for demuxer %p:\n", this);
+ if (mAudioTrack) {
+ result += nsPrintfCString("\tDumping Audio Track Buffer(%s): - mLastAudioTime: %f\n"
+ "\t\tNumSamples:%u Size:%u Evictable:%u NextGetSampleIndex:%u NextInsertionIndex:%d\n",
+ mAudioTrack->mAudioTracks.mInfo->mMimeType.get(),
+ mAudioTrack->mAudioTracks.mNextSampleTime.ToSeconds(),
+ mAudioTrack->mAudioTracks.mBuffers[0].Length(),
+ mAudioTrack->mAudioTracks.mSizeBuffer,
+ mAudioTrack->Evictable(TrackInfo::kAudioTrack),
+ mAudioTrack->mAudioTracks.mNextGetSampleIndex.valueOr(-1),
+ mAudioTrack->mAudioTracks.mNextInsertionIndex.valueOr(-1));
+
+ result += nsPrintfCString("\t\tBuffered: ranges=%s\n",
+ DumpTimeRanges(mAudioTrack->SafeBuffered(TrackInfo::kAudioTrack)).get());
+ }
+ if (mVideoTrack) {
+ result += nsPrintfCString("\tDumping Video Track Buffer(%s) - mLastVideoTime: %f\n"
+ "\t\tNumSamples:%u Size:%u Evictable:%u NextGetSampleIndex:%u NextInsertionIndex:%d\n",
+ mVideoTrack->mVideoTracks.mInfo->mMimeType.get(),
+ mVideoTrack->mVideoTracks.mNextSampleTime.ToSeconds(),
+ mVideoTrack->mVideoTracks.mBuffers[0].Length(),
+ mVideoTrack->mVideoTracks.mSizeBuffer,
+ mVideoTrack->Evictable(TrackInfo::kVideoTrack),
+ mVideoTrack->mVideoTracks.mNextGetSampleIndex.valueOr(-1),
+ mVideoTrack->mVideoTracks.mNextInsertionIndex.valueOr(-1));
+
+ result += nsPrintfCString("\t\tBuffered: ranges=%s\n",
+ DumpTimeRanges(mVideoTrack->SafeBuffered(TrackInfo::kVideoTrack)).get());
+ }
+ aString += NS_ConvertUTF8toUTF16(result);
+}
+
+MediaSourceTrackDemuxer::MediaSourceTrackDemuxer(MediaSourceDemuxer* aParent,
+ TrackInfo::TrackType aType,
+ TrackBuffersManager* aManager)
+ : mParent(aParent)
+ , mManager(aManager)
+ , mType(aType)
+ , mMonitor("MediaSourceTrackDemuxer")
+ , mReset(true)
+ , mPreRoll(
+ TimeUnit::FromMicroseconds(
+ OpusDataDecoder::IsOpus(mParent->GetTrackInfo(mType)->mMimeType)
+ ? 80000 : 0))
+{
+}
+
+UniquePtr<TrackInfo>
+MediaSourceTrackDemuxer::GetInfo() const
+{
+ return mParent->GetTrackInfo(mType)->Clone();
+}
+
+RefPtr<MediaSourceTrackDemuxer::SeekPromise>
+MediaSourceTrackDemuxer::Seek(media::TimeUnit aTime)
+{
+ MOZ_ASSERT(mParent, "Called after BreackCycle()");
+ return InvokeAsync(mParent->GetTaskQueue(), this, __func__,
+ &MediaSourceTrackDemuxer::DoSeek, aTime);
+}
+
+RefPtr<MediaSourceTrackDemuxer::SamplesPromise>
+MediaSourceTrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ MOZ_ASSERT(mParent, "Called after BreackCycle()");
+ return InvokeAsync(mParent->GetTaskQueue(), this, __func__,
+ &MediaSourceTrackDemuxer::DoGetSamples, aNumSamples);
+}
+
+void
+MediaSourceTrackDemuxer::Reset()
+{
+ MOZ_ASSERT(mParent, "Called after BreackCycle()");
+ RefPtr<MediaSourceTrackDemuxer> self = this;
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([self] () {
+ self->mNextSample.reset();
+ self->mReset = true;
+ self->mManager->Seek(self->mType, TimeUnit(), TimeUnit());
+ {
+ MonitorAutoLock mon(self->mMonitor);
+ self->mNextRandomAccessPoint =
+ self->mManager->GetNextRandomAccessPoint(self->mType,
+ MediaSourceDemuxer::EOS_FUZZ);
+ }
+ });
+ mParent->GetTaskQueue()->Dispatch(task.forget());
+}
+
+nsresult
+MediaSourceTrackDemuxer::GetNextRandomAccessPoint(media::TimeUnit* aTime)
+{
+ MonitorAutoLock mon(mMonitor);
+ *aTime = mNextRandomAccessPoint;
+ return NS_OK;
+}
+
+RefPtr<MediaSourceTrackDemuxer::SkipAccessPointPromise>
+MediaSourceTrackDemuxer::SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold)
+{
+ return InvokeAsync(mParent->GetTaskQueue(), this, __func__,
+ &MediaSourceTrackDemuxer::DoSkipToNextRandomAccessPoint,
+ aTimeThreshold);
+}
+
+media::TimeIntervals
+MediaSourceTrackDemuxer::GetBuffered()
+{
+ return mManager->Buffered();
+}
+
+void
+MediaSourceTrackDemuxer::BreakCycles()
+{
+ RefPtr<MediaSourceTrackDemuxer> self = this;
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([self]() {
+ self->mParent = nullptr;
+ self->mManager = nullptr;
+ } );
+ mParent->GetTaskQueue()->Dispatch(task.forget());
+}
+
+RefPtr<MediaSourceTrackDemuxer::SeekPromise>
+MediaSourceTrackDemuxer::DoSeek(media::TimeUnit aTime)
+{
+ TimeIntervals buffered = mManager->Buffered(mType);
+ // Fuzz factor represents a +/- threshold. So when seeking it allows the gap
+ // to be twice as big as the fuzz value. We only want to allow EOS_FUZZ gap.
+ buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
+ TimeUnit seekTime = std::max(aTime - mPreRoll, TimeUnit::FromMicroseconds(0));
+
+ if (mManager->IsEnded() && seekTime >= buffered.GetEnd()) {
+ // We're attempting to seek past the end time. Cap seekTime so that we seek
+ // to the last sample instead.
+ seekTime =
+ std::max(mManager->HighestStartTime(mType) - mPreRoll,
+ TimeUnit::FromMicroseconds(0));
+ }
+ if (!buffered.ContainsWithStrictEnd(seekTime)) {
+ if (!buffered.ContainsWithStrictEnd(aTime)) {
+ // We don't have the data to seek to.
+ return SeekPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA,
+ __func__);
+ }
+ // Theoretically we should reject the promise with WAITING_FOR_DATA,
+ // however, to avoid unwanted regressions we assume that if at this time
+ // we don't have the wanted data it won't come later.
+ // Instead of using the pre-rolled time, use the earliest time available in
+ // the interval.
+ TimeIntervals::IndexType index = buffered.Find(aTime);
+ MOZ_ASSERT(index != TimeIntervals::NoIndex);
+ seekTime = buffered[index].mStart;
+ }
+ seekTime = mManager->Seek(mType, seekTime, MediaSourceDemuxer::EOS_FUZZ);
+ MediaResult result = NS_OK;
+ RefPtr<MediaRawData> sample =
+ mManager->GetSample(mType,
+ media::TimeUnit(),
+ result);
+ MOZ_ASSERT(NS_SUCCEEDED(result) && sample);
+ mNextSample = Some(sample);
+ mReset = false;
+ {
+ MonitorAutoLock mon(mMonitor);
+ mNextRandomAccessPoint =
+ mManager->GetNextRandomAccessPoint(mType, MediaSourceDemuxer::EOS_FUZZ);
+ }
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+}
+
+RefPtr<MediaSourceTrackDemuxer::SamplesPromise>
+MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples)
+{
+ if (mReset) {
+ // If a seek (or reset) was recently performed, we ensure that the data
+ // we are about to retrieve is still available.
+ TimeIntervals buffered = mManager->Buffered(mType);
+ buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
+
+ if (!buffered.Length() && mManager->IsEnded()) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM,
+ __func__);
+ }
+ if (!buffered.ContainsWithStrictEnd(TimeUnit::FromMicroseconds(0))) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA,
+ __func__);
+ }
+ mReset = false;
+ }
+ RefPtr<MediaRawData> sample;
+ if (mNextSample) {
+ sample = mNextSample.ref();
+ mNextSample.reset();
+ } else {
+ MediaResult result = NS_OK;
+ sample = mManager->GetSample(mType, MediaSourceDemuxer::EOS_FUZZ, result);
+ if (!sample) {
+ if (result == NS_ERROR_DOM_MEDIA_END_OF_STREAM ||
+ result == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
+ return SamplesPromise::CreateAndReject(
+ (result == NS_ERROR_DOM_MEDIA_END_OF_STREAM && mManager->IsEnded())
+ ? NS_ERROR_DOM_MEDIA_END_OF_STREAM
+ : NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
+ }
+ return SamplesPromise::CreateAndReject(result, __func__);
+ }
+ }
+ RefPtr<SamplesHolder> samples = new SamplesHolder;
+ samples->mSamples.AppendElement(sample);
+ if (mNextRandomAccessPoint.ToMicroseconds() <= sample->mTime) {
+ MonitorAutoLock mon(mMonitor);
+ mNextRandomAccessPoint =
+ mManager->GetNextRandomAccessPoint(mType, MediaSourceDemuxer::EOS_FUZZ);
+ }
+ return SamplesPromise::CreateAndResolve(samples, __func__);
+}
+
+RefPtr<MediaSourceTrackDemuxer::SkipAccessPointPromise>
+MediaSourceTrackDemuxer::DoSkipToNextRandomAccessPoint(media::TimeUnit aTimeThreadshold)
+{
+ uint32_t parsed = 0;
+ // Ensure that the data we are about to skip to is still available.
+ TimeIntervals buffered = mManager->Buffered(mType);
+ buffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
+ if (buffered.ContainsWithStrictEnd(aTimeThreadshold)) {
+ bool found;
+ parsed = mManager->SkipToNextRandomAccessPoint(mType,
+ aTimeThreadshold,
+ MediaSourceDemuxer::EOS_FUZZ,
+ found);
+ if (found) {
+ return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
+ }
+ }
+ SkipFailureHolder holder(
+ mManager->IsEnded() ? NS_ERROR_DOM_MEDIA_END_OF_STREAM :
+ NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, parsed);
+ return SkipAccessPointPromise::CreateAndReject(holder, __func__);
+}
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/MediaSourceDemuxer.h b/dom/media/mediasource/MediaSourceDemuxer.h
new file mode 100644
index 000000000..02c91e3bc
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceDemuxer.h
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSourceDemuxer_h_)
+#define MediaSourceDemuxer_h_
+
+#include "mozilla/Atomics.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/Monitor.h"
+#include "AutoTaskQueue.h"
+
+#include "MediaDataDemuxer.h"
+#include "MediaDecoderReader.h"
+#include "MediaResource.h"
+#include "MediaSource.h"
+#include "TrackBuffersManager.h"
+
+namespace mozilla {
+
+class MediaResult;
+class MediaSourceTrackDemuxer;
+
+class MediaSourceDemuxer : public MediaDataDemuxer
+{
+public:
+ explicit MediaSourceDemuxer();
+
+ RefPtr<InitPromise> Init() override;
+
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(TrackInfo::TrackType aType,
+ uint32_t aTrackNumber) override;
+
+ bool IsSeekable() const override;
+
+ UniquePtr<EncryptionInfo> GetCrypto() override;
+
+ bool ShouldComputeStartTime() const override { return false; }
+
+ void NotifyDataArrived() override;
+
+ /* interface for TrackBuffersManager */
+ void AttachSourceBuffer(TrackBuffersManager* aSourceBuffer);
+ void DetachSourceBuffer(TrackBuffersManager* aSourceBuffer);
+ AutoTaskQueue* GetTaskQueue() { return mTaskQueue; }
+
+ // Returns a string describing the state of the MediaSource internal
+ // buffered data. Used for debugging purposes.
+ void GetMozDebugReaderData(nsAString& aString);
+
+ void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes);
+
+ // Gap allowed between frames.
+ static const media::TimeUnit EOS_FUZZ;
+
+private:
+ ~MediaSourceDemuxer();
+ friend class MediaSourceTrackDemuxer;
+ // Scan source buffers and update information.
+ bool ScanSourceBuffersForContent();
+ RefPtr<InitPromise> AttemptInit();
+ TrackBuffersManager* GetManager(TrackInfo::TrackType aType);
+ TrackInfo* GetTrackInfo(TrackInfo::TrackType);
+ void DoAttachSourceBuffer(TrackBuffersManager* aSourceBuffer);
+ void DoDetachSourceBuffer(TrackBuffersManager* aSourceBuffer);
+ bool OnTaskQueue()
+ {
+ return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn();
+ }
+
+ RefPtr<AutoTaskQueue> mTaskQueue;
+ nsTArray<RefPtr<MediaSourceTrackDemuxer>> mDemuxers;
+
+ nsTArray<RefPtr<TrackBuffersManager>> mSourceBuffers;
+
+ MozPromiseHolder<InitPromise> mInitPromise;
+
+ // Monitor to protect members below across multiple threads.
+ mutable Monitor mMonitor;
+ RefPtr<TrackBuffersManager> mAudioTrack;
+ RefPtr<TrackBuffersManager> mVideoTrack;
+ MediaInfo mInfo;
+};
+
+class MediaSourceTrackDemuxer : public MediaTrackDemuxer
+{
+public:
+ MediaSourceTrackDemuxer(MediaSourceDemuxer* aParent,
+ TrackInfo::TrackType aType,
+ TrackBuffersManager* aManager);
+
+ UniquePtr<TrackInfo> GetInfo() const override;
+
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+
+ void Reset() override;
+
+ nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override;
+
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override;
+
+ media::TimeIntervals GetBuffered() override;
+
+ void BreakCycles() override;
+
+ bool GetSamplesMayBlock() const override
+ {
+ return false;
+ }
+
+private:
+ RefPtr<SeekPromise> DoSeek(media::TimeUnit aTime);
+ RefPtr<SamplesPromise> DoGetSamples(int32_t aNumSamples);
+ RefPtr<SkipAccessPointPromise> DoSkipToNextRandomAccessPoint(media::TimeUnit aTimeThreadshold);
+ already_AddRefed<MediaRawData> GetSample(MediaResult& aError);
+ // Return the timestamp of the next keyframe after mLastSampleIndex.
+ media::TimeUnit GetNextRandomAccessPoint();
+
+ RefPtr<MediaSourceDemuxer> mParent;
+ RefPtr<TrackBuffersManager> mManager;
+ TrackInfo::TrackType mType;
+ // Monitor protecting members below accessed from multiple threads.
+ Monitor mMonitor;
+ media::TimeUnit mNextRandomAccessPoint;
+ Maybe<RefPtr<MediaRawData>> mNextSample;
+ // Set to true following a reset. Ensure that the next sample demuxed
+ // is available at position 0.
+ bool mReset;
+
+ // Amount of pre-roll time when seeking.
+ // Set to 80ms if track is Opus.
+ const media::TimeUnit mPreRoll;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/mediasource/MediaSourceResource.h b/dom/media/mediasource/MediaSourceResource.h
new file mode 100644
index 000000000..3ce4ebb52
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceResource.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASOURCERESOURCE_H_
+#define MOZILLA_MEDIASOURCERESOURCE_H_
+
+#include "MediaResource.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/Logging.h"
+
+extern mozilla::LogModule* GetMediaSourceLog();
+
+#define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("MediaSourceResource(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+
+#define UNIMPLEMENTED() MSE_DEBUG("UNIMPLEMENTED FUNCTION at %s:%d", __FILE__, __LINE__)
+
+namespace mozilla {
+
+class MediaSourceResource final : public MediaResource
+{
+public:
+ explicit MediaSourceResource(nsIPrincipal* aPrincipal = nullptr)
+ : mPrincipal(aPrincipal)
+ , mMonitor("MediaSourceResource")
+ , mEnded(false)
+ {}
+
+ nsresult Close() override { return NS_OK; }
+ void Suspend(bool aCloseImmediately) override { UNIMPLEMENTED(); }
+ void Resume() override { UNIMPLEMENTED(); }
+ bool CanClone() override { UNIMPLEMENTED(); return false; }
+ already_AddRefed<MediaResource> CloneData(MediaResourceCallback*) override { UNIMPLEMENTED(); return nullptr; }
+ void SetReadMode(MediaCacheStream::ReadMode aMode) override { UNIMPLEMENTED(); }
+ void SetPlaybackRate(uint32_t aBytesPerSecond) override { UNIMPLEMENTED(); }
+ nsresult ReadAt(int64_t aOffset, char* aBuffer, uint32_t aCount, uint32_t* aBytes) override { UNIMPLEMENTED(); return NS_ERROR_FAILURE; }
+ int64_t Tell() override { UNIMPLEMENTED(); return -1; }
+ void Pin() override { UNIMPLEMENTED(); }
+ void Unpin() override { UNIMPLEMENTED(); }
+ double GetDownloadRate(bool* aIsReliable) override { UNIMPLEMENTED(); *aIsReliable = false; return 0; }
+ int64_t GetLength() override { UNIMPLEMENTED(); return -1; }
+ int64_t GetNextCachedData(int64_t aOffset) override { UNIMPLEMENTED(); return -1; }
+ int64_t GetCachedDataEnd(int64_t aOffset) override { UNIMPLEMENTED(); return -1; }
+ bool IsDataCachedToEndOfResource(int64_t aOffset) override { UNIMPLEMENTED(); return false; }
+ bool IsSuspendedByCache() override { UNIMPLEMENTED(); return false; }
+ bool IsSuspended() override { UNIMPLEMENTED(); return false; }
+ nsresult ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount) override { UNIMPLEMENTED(); return NS_ERROR_FAILURE; }
+ nsresult Open(nsIStreamListener** aStreamListener) override { UNIMPLEMENTED(); return NS_ERROR_FAILURE; }
+
+ already_AddRefed<nsIPrincipal> GetCurrentPrincipal() override
+ {
+ return RefPtr<nsIPrincipal>(mPrincipal).forget();
+ }
+
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override
+ {
+ UNIMPLEMENTED();
+ aRanges += MediaByteRange(0, GetLength());
+ return NS_OK;
+ }
+
+ bool IsTransportSeekable() override { return true; }
+ const nsCString& GetContentType() const override { return mType; }
+
+ bool IsLiveStream() override
+ {
+ MonitorAutoLock mon(mMonitor);
+ return !mEnded;
+ }
+ void SetEnded(bool aEnded)
+ {
+ MonitorAutoLock mon(mMonitor);
+ mEnded = aEnded;
+ }
+
+ bool IsExpectingMoreData() override
+ {
+ MonitorAutoLock mon(mMonitor);
+ return !mEnded;
+ }
+
+private:
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t size = MediaResource::SizeOfExcludingThis(aMallocSizeOf);
+ size += mType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+
+ return size;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ RefPtr<nsIPrincipal> mPrincipal;
+ const nsCString mType;
+ Monitor mMonitor;
+ bool mEnded; // protected by mMonitor
+};
+
+} // namespace mozilla
+
+#undef MSE_DEBUG
+#undef UNIMPLEMENTED
+
+#endif /* MOZILLA_MEDIASOURCERESOURCE_H_ */
diff --git a/dom/media/mediasource/MediaSourceUtils.cpp b/dom/media/mediasource/MediaSourceUtils.cpp
new file mode 100644
index 000000000..49cb39a18
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceUtils.cpp
@@ -0,0 +1,34 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "MediaSourceUtils.h"
+
+#include "mozilla/Logging.h"
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+
+nsCString
+DumpTimeRanges(const media::TimeIntervals& aRanges)
+{
+ nsCString dump;
+
+ dump = "[";
+
+ for (uint32_t i = 0; i < aRanges.Length(); ++i) {
+ if (i > 0) {
+ dump += ", ";
+ }
+ dump += nsPrintfCString("(%f, %f)",
+ aRanges.Start(i).ToSeconds(),
+ aRanges.End(i).ToSeconds());
+ }
+
+ dump += "]";
+
+ return dump;
+}
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/MediaSourceUtils.h b/dom/media/mediasource/MediaSourceUtils.h
new file mode 100644
index 000000000..2bda99f1b
--- /dev/null
+++ b/dom/media/mediasource/MediaSourceUtils.h
@@ -0,0 +1,19 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_MEDIASOURCEUTILS_H_
+#define MOZILLA_MEDIASOURCEUTILS_H_
+
+#include "nsString.h"
+#include "TimeUnits.h"
+
+namespace mozilla {
+
+nsCString DumpTimeRanges(const media::TimeIntervals& aRanges);
+
+} // namespace mozilla
+
+#endif /* MOZILLA_MEDIASOURCEUTILS_H_ */
diff --git a/dom/media/mediasource/ResourceQueue.cpp b/dom/media/mediasource/ResourceQueue.cpp
new file mode 100644
index 000000000..5ca29ad37
--- /dev/null
+++ b/dom/media/mediasource/ResourceQueue.cpp
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ResourceQueue.h"
+#include "nsDeque.h"
+#include "MediaData.h"
+#include "mozilla/ErrorResult.h"
+#include "mozilla/Logging.h"
+#include "mozilla/Sprintf.h"
+
+extern mozilla::LogModule* GetSourceBufferResourceLog();
+
+#define SBR_DEBUG(arg, ...) MOZ_LOG(GetSourceBufferResourceLog(), mozilla::LogLevel::Debug, ("ResourceQueue(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define SBR_DEBUGV(arg, ...) MOZ_LOG(GetSourceBufferResourceLog(), mozilla::LogLevel::Verbose, ("ResourceQueue(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+ResourceItem::ResourceItem(MediaByteBuffer* aData)
+ : mData(aData)
+{
+}
+
+size_t
+ResourceItem::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ // size including this
+ size_t size = aMallocSizeOf(this);
+
+ // size excluding this
+ size += mData->ShallowSizeOfExcludingThis(aMallocSizeOf);
+
+ return size;
+}
+
+class ResourceQueueDeallocator : public nsDequeFunctor {
+ void* operator() (void* aObject) override {
+ delete static_cast<ResourceItem*>(aObject);
+ return nullptr;
+ }
+};
+
+ResourceQueue::ResourceQueue()
+ : nsDeque(new ResourceQueueDeallocator())
+ , mLogicalLength(0)
+ , mOffset(0)
+{
+}
+
+uint64_t
+ResourceQueue::GetOffset()
+{
+ return mOffset;
+}
+
+uint64_t
+ResourceQueue::GetLength()
+{
+ return mLogicalLength;
+}
+
+void
+ResourceQueue::CopyData(uint64_t aOffset, uint32_t aCount, char* aDest)
+{
+ uint32_t offset = 0;
+ uint32_t start = GetAtOffset(aOffset, &offset);
+ uint32_t end = std::min(GetAtOffset(aOffset + aCount, nullptr) + 1, uint32_t(GetSize()));
+ for (uint32_t i = start; i < end; ++i) {
+ ResourceItem* item = ResourceAt(i);
+ uint32_t bytes = std::min(aCount, uint32_t(item->mData->Length() - offset));
+ if (bytes != 0) {
+ memcpy(aDest, &(*item->mData)[offset], bytes);
+ offset = 0;
+ aCount -= bytes;
+ aDest += bytes;
+ }
+ }
+}
+
+void
+ResourceQueue::AppendItem(MediaByteBuffer* aData)
+{
+ mLogicalLength += aData->Length();
+ Push(new ResourceItem(aData));
+}
+
+uint32_t
+ResourceQueue::Evict(uint64_t aOffset, uint32_t aSizeToEvict,
+ ErrorResult& aRv)
+{
+ SBR_DEBUG("Evict(aOffset=%llu, aSizeToEvict=%u)",
+ aOffset, aSizeToEvict);
+ return EvictBefore(std::min(aOffset, mOffset + (uint64_t)aSizeToEvict), aRv);
+}
+
+uint32_t ResourceQueue::EvictBefore(uint64_t aOffset, ErrorResult& aRv)
+{
+ SBR_DEBUG("EvictBefore(%llu)", aOffset);
+ uint32_t evicted = 0;
+ while (ResourceItem* item = ResourceAt(0)) {
+ SBR_DEBUG("item=%p length=%d offset=%llu",
+ item, item->mData->Length(), mOffset);
+ if (item->mData->Length() + mOffset >= aOffset) {
+ if (aOffset <= mOffset) {
+ break;
+ }
+ uint32_t offset = aOffset - mOffset;
+ mOffset += offset;
+ evicted += offset;
+ RefPtr<MediaByteBuffer> data = new MediaByteBuffer;
+ if (!data->AppendElements(item->mData->Elements() + offset,
+ item->mData->Length() - offset,
+ fallible)) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
+
+ item->mData = data;
+ break;
+ }
+ mOffset += item->mData->Length();
+ evicted += item->mData->Length();
+ delete PopFront();
+ }
+ return evicted;
+}
+
+uint32_t
+ResourceQueue::EvictAll()
+{
+ SBR_DEBUG("EvictAll()");
+ uint32_t evicted = 0;
+ while (ResourceItem* item = ResourceAt(0)) {
+ SBR_DEBUG("item=%p length=%d offset=%llu",
+ item, item->mData->Length(), mOffset);
+ mOffset += item->mData->Length();
+ evicted += item->mData->Length();
+ delete PopFront();
+ }
+ return evicted;
+}
+
+size_t
+ResourceQueue::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ // Calculate the size of the internal deque.
+ size_t size = nsDeque::SizeOfExcludingThis(aMallocSizeOf);
+
+ // Sum the ResourceItems.
+ for (uint32_t i = 0; i < uint32_t(GetSize()); ++i) {
+ const ResourceItem* item = ResourceAt(i);
+ size += item->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return size;
+}
+
+#if defined(DEBUG)
+void
+ResourceQueue::Dump(const char* aPath)
+{
+ for (uint32_t i = 0; i < uint32_t(GetSize()); ++i) {
+ ResourceItem* item = ResourceAt(i);
+
+ char buf[255];
+ SprintfLiteral(buf, "%s/%08u.bin", aPath, i);
+ FILE* fp = fopen(buf, "wb");
+ if (!fp) {
+ return;
+ }
+ fwrite(item->mData->Elements(), item->mData->Length(), 1, fp);
+ fclose(fp);
+ }
+}
+#endif
+
+ResourceItem*
+ResourceQueue::ResourceAt(uint32_t aIndex) const
+{
+ return static_cast<ResourceItem*>(ObjectAt(aIndex));
+}
+
+uint32_t
+ResourceQueue::GetAtOffset(uint64_t aOffset, uint32_t *aResourceOffset)
+{
+ MOZ_RELEASE_ASSERT(aOffset >= mOffset);
+ uint64_t offset = mOffset;
+ for (uint32_t i = 0; i < uint32_t(GetSize()); ++i) {
+ ResourceItem* item = ResourceAt(i);
+ // If the item contains the start of the offset we want to
+ // break out of the loop.
+ if (item->mData->Length() + offset > aOffset) {
+ if (aResourceOffset) {
+ *aResourceOffset = aOffset - offset;
+ }
+ return i;
+ }
+ offset += item->mData->Length();
+ }
+ return GetSize();
+}
+
+ResourceItem*
+ResourceQueue::PopFront()
+{
+ return static_cast<ResourceItem*>(nsDeque::PopFront());
+}
+
+#undef SBR_DEBUG
+#undef SBR_DEBUGV
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/ResourceQueue.h b/dom/media/mediasource/ResourceQueue.h
new file mode 100644
index 000000000..0617890c8
--- /dev/null
+++ b/dom/media/mediasource/ResourceQueue.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_RESOURCEQUEUE_H_
+#define MOZILLA_RESOURCEQUEUE_H_
+
+#include "nsDeque.h"
+#include "MediaData.h"
+
+namespace mozilla {
+
+class ErrorResult;
+
+// A SourceBufferResource has a queue containing the data that is appended
+// to it. The queue holds instances of ResourceItem which is an array of the
+// bytes. Appending data to the SourceBufferResource pushes this onto the
+// queue.
+
+// Data is evicted once it reaches a size threshold. This pops the items off
+// the front of the queue and deletes it. If an eviction happens then the
+// MediaSource is notified (done in SourceBuffer::AppendData) which then
+// requests all SourceBuffers to evict data up to approximately the same
+// timepoint.
+
+struct ResourceItem {
+ explicit ResourceItem(MediaByteBuffer* aData);
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+ RefPtr<MediaByteBuffer> mData;
+};
+
+class ResourceQueue : private nsDeque {
+public:
+ ResourceQueue();
+
+ // Returns the logical byte offset of the start of the data.
+ uint64_t GetOffset();
+
+ // Returns the length of all items in the queue plus the offset.
+ // This is the logical length of the resource.
+ uint64_t GetLength();
+
+ // Copies aCount bytes from aOffset in the queue into aDest.
+ void CopyData(uint64_t aOffset, uint32_t aCount, char* aDest);
+
+ void AppendItem(MediaByteBuffer* aData);
+
+ // Tries to evict at least aSizeToEvict from the queue up until
+ // aOffset. Returns amount evicted.
+ uint32_t Evict(uint64_t aOffset, uint32_t aSizeToEvict,
+ ErrorResult& aRv);
+
+ uint32_t EvictBefore(uint64_t aOffset, ErrorResult& aRv);
+
+ uint32_t EvictAll();
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
+
+#if defined(DEBUG)
+ void Dump(const char* aPath);
+#endif
+
+private:
+ ResourceItem* ResourceAt(uint32_t aIndex) const;
+
+ // Returns the index of the resource that contains the given
+ // logical offset. aResourceOffset will contain the offset into
+ // the resource at the given index returned if it is not null. If
+ // no such resource exists, returns GetSize() and aOffset is
+ // untouched.
+ uint32_t GetAtOffset(uint64_t aOffset, uint32_t *aResourceOffset);
+
+ ResourceItem* PopFront();
+
+ // Logical length of the resource.
+ uint64_t mLogicalLength;
+
+ // Logical offset into the resource of the first element in the queue.
+ uint64_t mOffset;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_RESOURCEQUEUE_H_ */
diff --git a/dom/media/mediasource/SourceBuffer.cpp b/dom/media/mediasource/SourceBuffer.cpp
new file mode 100644
index 000000000..de14efb58
--- /dev/null
+++ b/dom/media/mediasource/SourceBuffer.cpp
@@ -0,0 +1,596 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SourceBuffer.h"
+
+#include "AsyncEventRunner.h"
+#include "MediaData.h"
+#include "MediaSourceDemuxer.h"
+#include "MediaSourceUtils.h"
+#include "mozilla/ErrorResult.h"
+#include "mozilla/FloatingPoint.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/dom/MediaSourceBinding.h"
+#include "mozilla/dom/TimeRanges.h"
+#include "nsError.h"
+#include "nsIEventTarget.h"
+#include "nsIRunnable.h"
+#include "nsThreadUtils.h"
+#include "mozilla/Logging.h"
+#include <time.h>
+#include "TimeUnits.h"
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with MediaDecoder::GetCurrentTime implementation.
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+struct JSContext;
+class JSObject;
+
+extern mozilla::LogModule* GetMediaSourceLog();
+extern mozilla::LogModule* GetMediaSourceAPILog();
+
+#define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("SourceBuffer(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+#define MSE_DEBUGV(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Verbose, ("SourceBuffer(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+#define MSE_API(arg, ...) MOZ_LOG(GetMediaSourceAPILog(), mozilla::LogLevel::Debug, ("SourceBuffer(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+using media::TimeUnit;
+typedef SourceBufferAttributes::AppendState AppendState;
+
+namespace dom {
+
+void
+SourceBuffer::SetMode(SourceBufferAppendMode aMode, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("SetMode(aMode=%d)", aMode);
+ if (!IsAttached() || mUpdating) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (mCurrentAttributes.mGenerateTimestamps &&
+ aMode == SourceBufferAppendMode::Segments) {
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ return;
+ }
+ MOZ_ASSERT(mMediaSource->ReadyState() != MediaSourceReadyState::Closed);
+ if (mMediaSource->ReadyState() == MediaSourceReadyState::Ended) {
+ mMediaSource->SetReadyState(MediaSourceReadyState::Open);
+ }
+ if (mCurrentAttributes.GetAppendState() == AppendState::PARSING_MEDIA_SEGMENT){
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (aMode == SourceBufferAppendMode::Sequence) {
+ // Will set GroupStartTimestamp to GroupEndTimestamp.
+ mCurrentAttributes.RestartGroupStartTimestamp();
+ }
+
+ mCurrentAttributes.SetAppendMode(aMode);
+}
+
+void
+SourceBuffer::SetTimestampOffset(double aTimestampOffset, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("SetTimestampOffset(aTimestampOffset=%f)", aTimestampOffset);
+ if (!IsAttached() || mUpdating) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ MOZ_ASSERT(mMediaSource->ReadyState() != MediaSourceReadyState::Closed);
+ if (mMediaSource->ReadyState() == MediaSourceReadyState::Ended) {
+ mMediaSource->SetReadyState(MediaSourceReadyState::Open);
+ }
+ if (mCurrentAttributes.GetAppendState() == AppendState::PARSING_MEDIA_SEGMENT){
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ mCurrentAttributes.SetApparentTimestampOffset(aTimestampOffset);
+ if (mCurrentAttributes.GetAppendMode() == SourceBufferAppendMode::Sequence) {
+ mCurrentAttributes.SetGroupStartTimestamp(mCurrentAttributes.GetTimestampOffset());
+ }
+}
+
+TimeRanges*
+SourceBuffer::GetBuffered(ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // http://w3c.github.io/media-source/index.html#widl-SourceBuffer-buffered
+ // 1. If this object has been removed from the sourceBuffers attribute of the parent media source then throw an InvalidStateError exception and abort these steps.
+ if (!IsAttached()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+ bool rangeChanged = true;
+ media::TimeIntervals intersection = mTrackBuffersManager->Buffered();
+ MSE_DEBUGV("intersection=%s", DumpTimeRanges(intersection).get());
+ if (mBuffered) {
+ media::TimeIntervals currentValue(mBuffered);
+ rangeChanged = (intersection != currentValue);
+ MSE_DEBUGV("currentValue=%s", DumpTimeRanges(currentValue).get());
+ }
+ // 5. If intersection ranges does not contain the exact same range information as the current value of this attribute, then update the current value of this attribute to intersection ranges.
+ if (rangeChanged) {
+ mBuffered = new TimeRanges(ToSupports(this));
+ intersection.ToTimeRanges(mBuffered);
+ }
+ // 6. Return the current value of this attribute.
+ return mBuffered;
+}
+
+media::TimeIntervals
+SourceBuffer::GetTimeIntervals()
+{
+ return mTrackBuffersManager->Buffered();
+}
+
+void
+SourceBuffer::SetAppendWindowStart(double aAppendWindowStart, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("SetAppendWindowStart(aAppendWindowStart=%f)", aAppendWindowStart);
+ if (!IsAttached() || mUpdating) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (aAppendWindowStart < 0 ||
+ aAppendWindowStart >= mCurrentAttributes.GetAppendWindowEnd()) {
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ return;
+ }
+ mCurrentAttributes.SetAppendWindowStart(aAppendWindowStart);
+}
+
+void
+SourceBuffer::SetAppendWindowEnd(double aAppendWindowEnd, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("SetAppendWindowEnd(aAppendWindowEnd=%f)", aAppendWindowEnd);
+ if (!IsAttached() || mUpdating) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (IsNaN(aAppendWindowEnd) ||
+ aAppendWindowEnd <= mCurrentAttributes.GetAppendWindowStart()) {
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ return;
+ }
+ mCurrentAttributes.SetAppendWindowEnd(aAppendWindowEnd);
+}
+
+void
+SourceBuffer::AppendBuffer(const ArrayBuffer& aData, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("AppendBuffer(ArrayBuffer)");
+ aData.ComputeLengthAndData();
+ AppendData(aData.Data(), aData.Length(), aRv);
+}
+
+void
+SourceBuffer::AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("AppendBuffer(ArrayBufferView)");
+ aData.ComputeLengthAndData();
+ AppendData(aData.Data(), aData.Length(), aRv);
+}
+
+void
+SourceBuffer::Abort(ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("Abort()");
+ if (!IsAttached()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (mMediaSource->ReadyState() != MediaSourceReadyState::Open) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (mPendingRemoval.Exists()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ AbortBufferAppend();
+ ResetParserState();
+ mCurrentAttributes.SetAppendWindowStart(0);
+ mCurrentAttributes.SetAppendWindowEnd(PositiveInfinity<double>());
+}
+
+void
+SourceBuffer::AbortBufferAppend()
+{
+ if (mUpdating) {
+ if (mPendingAppend.Exists()) {
+ mPendingAppend.Disconnect();
+ mTrackBuffersManager->AbortAppendData();
+ }
+ AbortUpdating();
+ }
+}
+
+void
+SourceBuffer::ResetParserState()
+{
+ mTrackBuffersManager->ResetParserState(mCurrentAttributes);
+}
+
+void
+SourceBuffer::Remove(double aStart, double aEnd, ErrorResult& aRv)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("Remove(aStart=%f, aEnd=%f)", aStart, aEnd);
+ if (!IsAttached()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (mUpdating) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ if (IsNaN(mMediaSource->Duration()) ||
+ aStart < 0 || aStart > mMediaSource->Duration() ||
+ aEnd <= aStart || IsNaN(aEnd)) {
+ aRv.Throw(NS_ERROR_DOM_TYPE_ERR);
+ return;
+ }
+ if (mMediaSource->ReadyState() == MediaSourceReadyState::Ended) {
+ mMediaSource->SetReadyState(MediaSourceReadyState::Open);
+ }
+
+ RangeRemoval(aStart, aEnd);
+}
+
+void
+SourceBuffer::RangeRemoval(double aStart, double aEnd)
+{
+ StartUpdating();
+
+ RefPtr<SourceBuffer> self = this;
+ mPendingRemoval.Begin(
+ mTrackBuffersManager->RangeRemoval(TimeUnit::FromSeconds(aStart),
+ TimeUnit::FromSeconds(aEnd))
+ ->Then(AbstractThread::MainThread(), __func__,
+ [self] (bool) {
+ self->mPendingRemoval.Complete();
+ self->StopUpdating();
+ },
+ []() { MOZ_ASSERT(false); }));
+}
+
+void
+SourceBuffer::Detach()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("Detach");
+ if (!mMediaSource) {
+ MSE_DEBUG("Already detached");
+ return;
+ }
+ AbortBufferAppend();
+ if (mTrackBuffersManager) {
+ mTrackBuffersManager->Detach();
+ mMediaSource->GetDecoder()->GetDemuxer()->DetachSourceBuffer(
+ mTrackBuffersManager.get());
+ }
+ mTrackBuffersManager = nullptr;
+ mMediaSource = nullptr;
+}
+
+void
+SourceBuffer::Ended()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(IsAttached());
+ MSE_DEBUG("Ended");
+ mTrackBuffersManager->Ended();
+}
+
+SourceBuffer::SourceBuffer(MediaSource* aMediaSource, const nsACString& aType)
+ : DOMEventTargetHelper(aMediaSource->GetParentObject())
+ , mMediaSource(aMediaSource)
+ , mCurrentAttributes(aType.LowerCaseEqualsLiteral("audio/mpeg") ||
+ aType.LowerCaseEqualsLiteral("audio/aac"))
+ , mUpdating(false)
+ , mActive(false)
+ , mType(aType)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aMediaSource);
+
+ mTrackBuffersManager =
+ new TrackBuffersManager(aMediaSource->GetDecoder(), aType);
+
+ MSE_DEBUG("Create mTrackBuffersManager=%p",
+ mTrackBuffersManager.get());
+
+ ErrorResult dummy;
+ if (mCurrentAttributes.mGenerateTimestamps) {
+ SetMode(SourceBufferAppendMode::Sequence, dummy);
+ } else {
+ SetMode(SourceBufferAppendMode::Segments, dummy);
+ }
+ mMediaSource->GetDecoder()->GetDemuxer()->AttachSourceBuffer(
+ mTrackBuffersManager.get());
+}
+
+SourceBuffer::~SourceBuffer()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!mMediaSource);
+ MSE_DEBUG("");
+}
+
+MediaSource*
+SourceBuffer::GetParentObject() const
+{
+ return mMediaSource;
+}
+
+JSObject*
+SourceBuffer::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SourceBufferBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+SourceBuffer::DispatchSimpleEvent(const char* aName)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("Dispatch event '%s'", aName);
+ DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName));
+}
+
+void
+SourceBuffer::QueueAsyncSimpleEvent(const char* aName)
+{
+ MSE_DEBUG("Queuing event '%s'", aName);
+ nsCOMPtr<nsIRunnable> event = new AsyncEventRunner<SourceBuffer>(this, aName);
+ NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
+}
+
+void
+SourceBuffer::StartUpdating()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(!mUpdating);
+ mUpdating = true;
+ QueueAsyncSimpleEvent("updatestart");
+}
+
+void
+SourceBuffer::StopUpdating()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!mUpdating) {
+ // The buffer append or range removal algorithm has been interrupted by
+ // abort().
+ return;
+ }
+ mUpdating = false;
+ QueueAsyncSimpleEvent("update");
+ QueueAsyncSimpleEvent("updateend");
+}
+
+void
+SourceBuffer::AbortUpdating()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mUpdating = false;
+ QueueAsyncSimpleEvent("abort");
+ QueueAsyncSimpleEvent("updateend");
+}
+
+void
+SourceBuffer::CheckEndTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ // Check if we need to update mMediaSource duration
+ double endTime = mCurrentAttributes.GetGroupEndTimestamp().ToSeconds();
+ double duration = mMediaSource->Duration();
+ if (endTime > duration) {
+ mMediaSource->SetDuration(endTime);
+ }
+}
+
+void
+SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aRv)
+{
+ MSE_DEBUG("AppendData(aLength=%u)", aLength);
+
+ RefPtr<MediaByteBuffer> data = PrepareAppend(aData, aLength, aRv);
+ if (!data) {
+ return;
+ }
+ StartUpdating();
+
+ mPendingAppend.Begin(mTrackBuffersManager->AppendData(data, mCurrentAttributes)
+ ->Then(AbstractThread::MainThread(), __func__, this,
+ &SourceBuffer::AppendDataCompletedWithSuccess,
+ &SourceBuffer::AppendDataErrored));
+}
+
+void
+SourceBuffer::AppendDataCompletedWithSuccess(SourceBufferTask::AppendBufferResult aResult)
+{
+ MOZ_ASSERT(mUpdating);
+ mPendingAppend.Complete();
+
+ if (aResult.first()) {
+ if (!mActive) {
+ mActive = true;
+ mMediaSource->SourceBufferIsActive(this);
+ }
+ }
+ if (mActive) {
+ // Tell our parent decoder that we have received new data.
+ mMediaSource->GetDecoder()->NotifyDataArrived();
+ // Send progress event.
+ mMediaSource->GetDecoder()->NotifyBytesDownloaded();
+ }
+
+ mCurrentAttributes = aResult.second();
+
+ CheckEndTime();
+
+ StopUpdating();
+}
+
+void
+SourceBuffer::AppendDataErrored(const MediaResult& aError)
+{
+ MOZ_ASSERT(mUpdating);
+ mPendingAppend.Complete();
+
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_CANCELED:
+ // Nothing further to do as the trackbuffer has been shutdown.
+ // or append was aborted and abort() has handled all the events.
+ break;
+ default:
+ AppendError(aError);
+ break;
+ }
+}
+
+void
+SourceBuffer::AppendError(const MediaResult& aDecodeError)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ ResetParserState();
+
+ mUpdating = false;
+
+ QueueAsyncSimpleEvent("error");
+ QueueAsyncSimpleEvent("updateend");
+
+ MOZ_ASSERT(NS_FAILED(aDecodeError));
+
+ mMediaSource->EndOfStream(aDecodeError);
+}
+
+already_AddRefed<MediaByteBuffer>
+SourceBuffer::PrepareAppend(const uint8_t* aData, uint32_t aLength, ErrorResult& aRv)
+{
+ typedef TrackBuffersManager::EvictDataResult Result;
+
+ if (!IsAttached() || mUpdating) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+
+ // If the HTMLMediaElement.error attribute is not null, then throw an
+ // InvalidStateError exception and abort these steps.
+ if (!mMediaSource->GetDecoder() ||
+ mMediaSource->GetDecoder()->OwnerHasError()) {
+ MSE_DEBUG("HTMLMediaElement.error is not null");
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+
+ if (mMediaSource->ReadyState() == MediaSourceReadyState::Ended) {
+ mMediaSource->SetReadyState(MediaSourceReadyState::Open);
+ }
+
+ // Eviction uses a byte threshold. If the buffer is greater than the
+ // number of bytes then data is evicted.
+ // TODO: Drive evictions off memory pressure notifications.
+ // TODO: Consider a global eviction threshold rather than per TrackBuffer.
+ // Give a chance to the TrackBuffersManager to evict some data if needed.
+ Result evicted =
+ mTrackBuffersManager->EvictData(TimeUnit::FromSeconds(mMediaSource->GetDecoder()->GetCurrentTime()),
+ aLength);
+
+ // See if we have enough free space to append our new data.
+ if (evicted == Result::BUFFER_FULL) {
+ aRv.Throw(NS_ERROR_DOM_QUOTA_EXCEEDED_ERR);
+ return nullptr;
+ }
+
+ RefPtr<MediaByteBuffer> data = new MediaByteBuffer();
+ if (!data->AppendElements(aData, aLength, fallible)) {
+ aRv.Throw(NS_ERROR_DOM_QUOTA_EXCEEDED_ERR);
+ return nullptr;
+ }
+ return data.forget();
+}
+
+double
+SourceBuffer::GetBufferedStart()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ ErrorResult dummy;
+ RefPtr<TimeRanges> ranges = GetBuffered(dummy);
+ return ranges->Length() > 0 ? ranges->GetStartTime() : 0;
+}
+
+double
+SourceBuffer::GetBufferedEnd()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ ErrorResult dummy;
+ RefPtr<TimeRanges> ranges = GetBuffered(dummy);
+ return ranges->Length() > 0 ? ranges->GetEndTime() : 0;
+}
+
+double
+SourceBuffer::HighestStartTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mTrackBuffersManager
+ ? mTrackBuffersManager->HighestStartTime().ToSeconds()
+ : 0.0;
+}
+
+double
+SourceBuffer::HighestEndTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mTrackBuffersManager
+ ? mTrackBuffersManager->HighestEndTime().ToSeconds()
+ : 0.0;
+}
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(SourceBuffer)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(SourceBuffer)
+ // Tell the TrackBuffer to end its current SourceBufferResource.
+ TrackBuffersManager* manager = tmp->mTrackBuffersManager;
+ if (manager) {
+ manager->Detach();
+ }
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mMediaSource)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mBuffered)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(DOMEventTargetHelper)
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(SourceBuffer,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMediaSource)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBuffered)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_ADDREF_INHERITED(SourceBuffer, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SourceBuffer, DOMEventTargetHelper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SourceBuffer)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+#undef MSE_DEBUG
+#undef MSE_DEBUGV
+#undef MSE_API
+
+} // namespace dom
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/SourceBuffer.h b/dom/media/mediasource/SourceBuffer.h
new file mode 100644
index 000000000..440e8f60e
--- /dev/null
+++ b/dom/media/mediasource/SourceBuffer.h
@@ -0,0 +1,189 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SourceBuffer_h_
+#define mozilla_dom_SourceBuffer_h_
+
+#include "mozilla/MozPromise.h"
+#include "MediaSource.h"
+#include "js/RootingAPI.h"
+#include "mozilla/Assertions.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/dom/SourceBufferBinding.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/mozalloc.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionNoteChild.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsISupports.h"
+#include "nsString.h"
+#include "nscore.h"
+#include "TrackBuffersManager.h"
+#include "SourceBufferTask.h"
+
+class JSObject;
+struct JSContext;
+
+namespace mozilla {
+
+class ErrorResult;
+class MediaByteBuffer;
+template <typename T> class AsyncEventRunner;
+
+namespace dom {
+
+class TimeRanges;
+
+class SourceBuffer final : public DOMEventTargetHelper
+{
+public:
+ /** WebIDL Methods. */
+ SourceBufferAppendMode Mode() const
+ {
+ return mCurrentAttributes.GetAppendMode();
+ }
+
+ void SetMode(SourceBufferAppendMode aMode, ErrorResult& aRv);
+
+ bool Updating() const
+ {
+ return mUpdating;
+ }
+
+ TimeRanges* GetBuffered(ErrorResult& aRv);
+ media::TimeIntervals GetTimeIntervals();
+
+ double TimestampOffset() const
+ {
+ return mCurrentAttributes.GetApparentTimestampOffset();
+ }
+
+ void SetTimestampOffset(double aTimestampOffset, ErrorResult& aRv);
+
+ double AppendWindowStart() const
+ {
+ return mCurrentAttributes.GetAppendWindowStart();
+ }
+
+ void SetAppendWindowStart(double aAppendWindowStart, ErrorResult& aRv);
+
+ double AppendWindowEnd() const
+ {
+ return mCurrentAttributes.GetAppendWindowEnd();
+ }
+
+ void SetAppendWindowEnd(double aAppendWindowEnd, ErrorResult& aRv);
+
+ void AppendBuffer(const ArrayBuffer& aData, ErrorResult& aRv);
+ void AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv);
+
+ void Abort(ErrorResult& aRv);
+ void AbortBufferAppend();
+
+ void Remove(double aStart, double aEnd, ErrorResult& aRv);
+
+ IMPL_EVENT_HANDLER(updatestart);
+ IMPL_EVENT_HANDLER(update);
+ IMPL_EVENT_HANDLER(updateend);
+ IMPL_EVENT_HANDLER(error);
+ IMPL_EVENT_HANDLER(abort);
+
+ /** End WebIDL Methods. */
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBuffer, DOMEventTargetHelper)
+
+ SourceBuffer(MediaSource* aMediaSource, const nsACString& aType);
+
+ MediaSource* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // Notify the SourceBuffer that it has been detached from the
+ // MediaSource's sourceBuffer list.
+ void Detach();
+ bool IsAttached() const
+ {
+ return mMediaSource != nullptr;
+ }
+
+ void Ended();
+
+ double GetBufferedStart();
+ double GetBufferedEnd();
+ double HighestStartTime();
+ double HighestEndTime();
+
+ // Runs the range removal algorithm as defined by the MSE spec.
+ void RangeRemoval(double aStart, double aEnd);
+
+ bool IsActive() const
+ {
+ return mActive;
+ }
+
+private:
+ ~SourceBuffer();
+
+ friend class AsyncEventRunner<SourceBuffer>;
+ friend class BufferAppendRunnable;
+ friend class mozilla::TrackBuffersManager;
+ void DispatchSimpleEvent(const char* aName);
+ void QueueAsyncSimpleEvent(const char* aName);
+
+ // Update mUpdating and fire the appropriate events.
+ void StartUpdating();
+ void StopUpdating();
+ void AbortUpdating();
+ void ResetParserState();
+
+ // If the media segment contains data beyond the current duration,
+ // then run the duration change algorithm with new duration set to the
+ // maximum of the current duration and the group end timestamp.
+ void CheckEndTime();
+
+ // Shared implementation of AppendBuffer overloads.
+ void AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aRv);
+
+ // Implement the "Append Error Algorithm".
+ // Will call endOfStream() with "decode" error if aDecodeError is true.
+ // 3.5.3 Append Error Algorithm
+ // http://w3c.github.io/media-source/#sourcebuffer-append-error
+ void AppendError(const MediaResult& aDecodeError);
+
+ // Implements the "Prepare Append Algorithm". Returns MediaByteBuffer object
+ // on success or nullptr (with aRv set) on error.
+ already_AddRefed<MediaByteBuffer> PrepareAppend(const uint8_t* aData,
+ uint32_t aLength,
+ ErrorResult& aRv);
+
+ void AppendDataCompletedWithSuccess(SourceBufferTask::AppendBufferResult aResult);
+ void AppendDataErrored(const MediaResult& aError);
+
+ RefPtr<MediaSource> mMediaSource;
+
+ RefPtr<TrackBuffersManager> mTrackBuffersManager;
+ SourceBufferAttributes mCurrentAttributes;
+
+ bool mUpdating;
+
+ mozilla::Atomic<bool> mActive;
+
+ MozPromiseRequestHolder<SourceBufferTask::AppendPromise> mPendingAppend;
+ MozPromiseRequestHolder<SourceBufferTask::RangeRemovalPromise> mPendingRemoval;
+ const nsCString mType;
+
+ RefPtr<TimeRanges> mBuffered;
+};
+
+} // namespace dom
+
+} // namespace mozilla
+
+#endif /* mozilla_dom_SourceBuffer_h_ */
diff --git a/dom/media/mediasource/SourceBufferAttributes.h b/dom/media/mediasource/SourceBufferAttributes.h
new file mode 100644
index 000000000..0af80a4fe
--- /dev/null
+++ b/dom/media/mediasource/SourceBufferAttributes.h
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_SourceBufferAttributes_h_
+#define mozilla_SourceBufferAttributes_h_
+
+#include "TimeUnits.h"
+#include "mozilla/dom/SourceBufferBinding.h"
+#include "mozilla/Maybe.h"
+
+namespace mozilla {
+
+class SourceBufferAttributes {
+public:
+
+ // Current state as per Segment Parser Loop Algorithm
+ // http://w3c.github.io/media-source/index.html#sourcebuffer-segment-parser-loop
+ enum class AppendState
+ {
+ WAITING_FOR_SEGMENT,
+ PARSING_INIT_SEGMENT,
+ PARSING_MEDIA_SEGMENT,
+ };
+
+ explicit SourceBufferAttributes(bool aGenerateTimestamp)
+ : mGenerateTimestamps(aGenerateTimestamp)
+ , mAppendWindowStart(0)
+ , mAppendWindowEnd(PositiveInfinity<double>())
+ , mAppendMode(dom::SourceBufferAppendMode::Segments)
+ , mApparentTimestampOffset(0)
+ , mAppendState(AppendState::WAITING_FOR_SEGMENT)
+ {}
+
+ SourceBufferAttributes(const SourceBufferAttributes& aOther) = default;
+
+ double GetAppendWindowStart() const
+ {
+ return mAppendWindowStart;
+ }
+
+ double GetAppendWindowEnd() const
+ {
+ return mAppendWindowEnd;
+ }
+
+ void SetAppendWindowStart(double aWindowStart)
+ {
+ mAppendWindowStart = aWindowStart;
+ }
+
+ void SetAppendWindowEnd(double aWindowEnd)
+ {
+ mAppendWindowEnd = aWindowEnd;
+ }
+
+ double GetApparentTimestampOffset() const
+ {
+ return mApparentTimestampOffset;
+ }
+
+ void SetApparentTimestampOffset(double aTimestampOffset)
+ {
+ mApparentTimestampOffset = aTimestampOffset;
+ mTimestampOffset = media::TimeUnit::FromSeconds(aTimestampOffset);
+ }
+
+ media::TimeUnit GetTimestampOffset() const
+ {
+ return mTimestampOffset;
+ }
+
+ void SetTimestampOffset(const media::TimeUnit& aTimestampOffset)
+ {
+ mTimestampOffset = aTimestampOffset;
+ mApparentTimestampOffset = aTimestampOffset.ToSeconds();
+ }
+
+ dom::SourceBufferAppendMode GetAppendMode() const
+ {
+ return mAppendMode;
+ }
+
+ void SetAppendMode(dom::SourceBufferAppendMode aAppendMode)
+ {
+ mAppendMode = aAppendMode;
+ }
+
+ void SetGroupStartTimestamp(const media::TimeUnit& aGroupStartTimestamp)
+ {
+ mGroupStartTimestamp = Some(aGroupStartTimestamp);
+ }
+
+ media::TimeUnit GetGroupStartTimestamp() const
+ {
+ return mGroupStartTimestamp.ref();
+ }
+
+ bool HaveGroupStartTimestamp() const
+ {
+ return mGroupStartTimestamp.isSome();
+ }
+
+ void ResetGroupStartTimestamp()
+ {
+ mGroupStartTimestamp.reset();
+ }
+
+ void RestartGroupStartTimestamp()
+ {
+ mGroupStartTimestamp = Some(mGroupEndTimestamp);
+ }
+
+ media::TimeUnit GetGroupEndTimestamp() const
+ {
+ return mGroupEndTimestamp;
+ }
+
+ void SetGroupEndTimestamp(const media::TimeUnit& aGroupEndTimestamp)
+ {
+ mGroupEndTimestamp = aGroupEndTimestamp;
+ }
+
+ AppendState GetAppendState() const
+ {
+ return mAppendState;
+ }
+
+ void SetAppendState(AppendState aState)
+ {
+ mAppendState = aState;
+ }
+
+ // mGenerateTimestamp isn't mutable once the source buffer has been constructed
+ bool mGenerateTimestamps;
+
+ SourceBufferAttributes& operator=(const SourceBufferAttributes& aOther) = default;
+
+private:
+ SourceBufferAttributes() = delete;
+
+ double mAppendWindowStart;
+ double mAppendWindowEnd;
+ dom::SourceBufferAppendMode mAppendMode;
+ double mApparentTimestampOffset;
+ media::TimeUnit mTimestampOffset;
+ Maybe<media::TimeUnit> mGroupStartTimestamp;
+ media::TimeUnit mGroupEndTimestamp;
+ // The current append state as per https://w3c.github.io/media-source/#sourcebuffer-append-state
+ AppendState mAppendState;
+};
+
+} // end namespace mozilla
+
+#endif /* mozilla_SourceBufferAttributes_h_ */
diff --git a/dom/media/mediasource/SourceBufferList.cpp b/dom/media/mediasource/SourceBufferList.cpp
new file mode 100644
index 000000000..cf7a7ed9d
--- /dev/null
+++ b/dom/media/mediasource/SourceBufferList.cpp
@@ -0,0 +1,225 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SourceBufferList.h"
+
+#include "AsyncEventRunner.h"
+#include "mozilla/ErrorResult.h"
+#include "mozilla/dom/SourceBufferListBinding.h"
+#include "mozilla/mozalloc.h"
+#include "nsCOMPtr.h"
+#include "nsIRunnable.h"
+#include "nsString.h"
+#include "nsThreadUtils.h"
+#include "mozilla/Logging.h"
+
+extern mozilla::LogModule* GetMediaSourceLog();
+extern mozilla::LogModule* GetMediaSourceAPILog();
+
+#define MSE_API(arg, ...) MOZ_LOG(GetMediaSourceAPILog(), mozilla::LogLevel::Debug, ("SourceBufferList(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("SourceBufferList(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+struct JSContext;
+class JSObject;
+
+namespace mozilla {
+
+namespace dom {
+
+SourceBufferList::~SourceBufferList()
+{
+}
+
+SourceBuffer*
+SourceBufferList::IndexedGetter(uint32_t aIndex, bool& aFound)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ aFound = aIndex < mSourceBuffers.Length();
+
+ if (!aFound) {
+ return nullptr;
+ }
+ return mSourceBuffers[aIndex];
+}
+
+uint32_t
+SourceBufferList::Length()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mSourceBuffers.Length();
+}
+
+void
+SourceBufferList::Append(SourceBuffer* aSourceBuffer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSourceBuffers.AppendElement(aSourceBuffer);
+ QueueAsyncSimpleEvent("addsourcebuffer");
+}
+
+void
+SourceBufferList::AppendSimple(SourceBuffer* aSourceBuffer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSourceBuffers.AppendElement(aSourceBuffer);
+}
+
+void
+SourceBufferList::Remove(SourceBuffer* aSourceBuffer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ALWAYS_TRUE(mSourceBuffers.RemoveElement(aSourceBuffer));
+ aSourceBuffer->Detach();
+ QueueAsyncSimpleEvent("removesourcebuffer");
+}
+
+bool
+SourceBufferList::Contains(SourceBuffer* aSourceBuffer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mSourceBuffers.Contains(aSourceBuffer);
+}
+
+void
+SourceBufferList::Clear()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
+ mSourceBuffers[i]->Detach();
+ }
+ mSourceBuffers.Clear();
+ QueueAsyncSimpleEvent("removesourcebuffer");
+}
+
+void
+SourceBufferList::ClearSimple()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSourceBuffers.Clear();
+}
+
+bool
+SourceBufferList::IsEmpty()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ return mSourceBuffers.IsEmpty();
+}
+
+bool
+SourceBufferList::AnyUpdating()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
+ if (mSourceBuffers[i]->Updating()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void
+SourceBufferList::RangeRemoval(double aStart, double aEnd)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("RangeRemoval(aStart=%f, aEnd=%f)", aStart, aEnd);
+ for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
+ mSourceBuffers[i]->RangeRemoval(aStart, aEnd);
+ }
+}
+
+void
+SourceBufferList::Ended()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
+ mSourceBuffers[i]->Ended();
+ }
+}
+
+double
+SourceBufferList::GetHighestBufferedEndTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ double highestEndTime = 0;
+ for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) {
+ highestEndTime = std::max(highestEndTime, mSourceBuffers[i]->GetBufferedEnd());
+ }
+ return highestEndTime;
+}
+
+void
+SourceBufferList::DispatchSimpleEvent(const char* aName)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_API("Dispatch event '%s'", aName);
+ DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName));
+}
+
+void
+SourceBufferList::QueueAsyncSimpleEvent(const char* aName)
+{
+ MSE_DEBUG("Queue event '%s'", aName);
+ nsCOMPtr<nsIRunnable> event = new AsyncEventRunner<SourceBufferList>(this, aName);
+ NS_DispatchToMainThread(event);
+}
+
+SourceBufferList::SourceBufferList(MediaSource* aMediaSource)
+ : DOMEventTargetHelper(aMediaSource->GetParentObject())
+ , mMediaSource(aMediaSource)
+{
+ MOZ_ASSERT(aMediaSource);
+}
+
+MediaSource*
+SourceBufferList::GetParentObject() const
+{
+ return mMediaSource;
+}
+
+double
+SourceBufferList::HighestStartTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ double highestStartTime = 0;
+ for (auto& sourceBuffer : mSourceBuffers) {
+ highestStartTime =
+ std::max(sourceBuffer->HighestStartTime(), highestStartTime);
+ }
+ return highestStartTime;
+}
+
+double
+SourceBufferList::HighestEndTime()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ double highestEndTime = 0;
+ for (auto& sourceBuffer : mSourceBuffers) {
+ highestEndTime =
+ std::max(sourceBuffer->HighestEndTime(), highestEndTime);
+ }
+ return highestEndTime;
+}
+
+JSObject*
+SourceBufferList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SourceBufferListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(SourceBufferList, DOMEventTargetHelper,
+ mMediaSource, mSourceBuffers)
+
+NS_IMPL_ADDREF_INHERITED(SourceBufferList, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SourceBufferList, DOMEventTargetHelper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SourceBufferList)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+#undef MSE_API
+#undef MSE_DEBUG
+} // namespace dom
+
+} // namespace mozilla
diff --git a/dom/media/mediasource/SourceBufferList.h b/dom/media/mediasource/SourceBufferList.h
new file mode 100644
index 000000000..03dc5c80b
--- /dev/null
+++ b/dom/media/mediasource/SourceBufferList.h
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SourceBufferList_h_
+#define mozilla_dom_SourceBufferList_h_
+
+#include "SourceBuffer.h"
+#include "js/RootingAPI.h"
+#include "mozilla/Assertions.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "nsCycleCollectionNoteChild.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsISupports.h"
+#include "nsTArray.h"
+
+struct JSContext;
+class JSObject;
+
+namespace mozilla {
+
+template <typename T> class AsyncEventRunner;
+
+namespace dom {
+
+class MediaSource;
+
+class SourceBufferList final : public DOMEventTargetHelper
+{
+public:
+ /** WebIDL Methods. */
+ SourceBuffer* IndexedGetter(uint32_t aIndex, bool& aFound);
+
+ uint32_t Length();
+
+ IMPL_EVENT_HANDLER(addsourcebuffer);
+ IMPL_EVENT_HANDLER(removesourcebuffer);
+
+ /** End WebIDL methods. */
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SourceBufferList,
+ DOMEventTargetHelper)
+
+ explicit SourceBufferList(MediaSource* aMediaSource);
+
+ MediaSource* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // Append a SourceBuffer and fire "addsourcebuffer" at the list.
+ void Append(SourceBuffer* aSourceBuffer);
+
+ // Remove a SourceBuffer and fire "removesourcebuffer" at the list.
+ void Remove(SourceBuffer* aSourceBuffer);
+
+ // Returns true if aSourceBuffer is present in the list.
+ bool Contains(SourceBuffer* aSourceBuffer);
+
+ // Remove all SourceBuffers and fire a single "removesourcebuffer" at the list.
+ void Clear();
+
+ // True if list has zero entries.
+ bool IsEmpty();
+
+ // Returns true if updating is true on any SourceBuffers in the list.
+ bool AnyUpdating();
+
+ // Runs the range removal steps from the MSE specification on each SourceBuffer.
+ void RangeRemoval(double aStart, double aEnd);
+
+ // Mark all SourceBuffers input buffers as ended.
+ void Ended();
+
+ // Returns the highest end time of any of the Sourcebuffers.
+ double GetHighestBufferedEndTime();
+
+ // Append a SourceBuffer to the list. No event is fired.
+ void AppendSimple(SourceBuffer* aSourceBuffer);
+
+ // Remove all SourceBuffers from mSourceBuffers.
+ // No event is fired and no action is performed on the sourcebuffers.
+ void ClearSimple();
+
+ double HighestStartTime();
+ double HighestEndTime();
+
+private:
+ ~SourceBufferList();
+
+ friend class AsyncEventRunner<SourceBufferList>;
+ void DispatchSimpleEvent(const char* aName);
+ void QueueAsyncSimpleEvent(const char* aName);
+
+ RefPtr<MediaSource> mMediaSource;
+ nsTArray<RefPtr<SourceBuffer> > mSourceBuffers;
+};
+
+} // namespace dom
+
+} // namespace mozilla
+
+#endif /* mozilla_dom_SourceBufferList_h_ */
diff --git a/dom/media/mediasource/SourceBufferResource.cpp b/dom/media/mediasource/SourceBufferResource.cpp
new file mode 100644
index 000000000..bb11072ae
--- /dev/null
+++ b/dom/media/mediasource/SourceBufferResource.cpp
@@ -0,0 +1,185 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SourceBufferResource.h"
+
+#include <algorithm>
+
+#include "nsISeekableStream.h"
+#include "nsISupports.h"
+#include "mozilla/Logging.h"
+#include "MediaData.h"
+
+mozilla::LogModule* GetSourceBufferResourceLog()
+{
+ static mozilla::LazyLogModule sLogModule("SourceBufferResource");
+ return sLogModule;
+}
+
+#define SBR_DEBUG(arg, ...) MOZ_LOG(GetSourceBufferResourceLog(), mozilla::LogLevel::Debug, ("SourceBufferResource(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+#define SBR_DEBUGV(arg, ...) MOZ_LOG(GetSourceBufferResourceLog(), mozilla::LogLevel::Verbose, ("SourceBufferResource(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+nsresult
+SourceBufferResource::Close()
+{
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ SBR_DEBUG("Close");
+ //MOZ_ASSERT(!mClosed);
+ mClosed = true;
+ mon.NotifyAll();
+ return NS_OK;
+}
+
+nsresult
+SourceBufferResource::ReadAt(int64_t aOffset, char* aBuffer, uint32_t aCount, uint32_t* aBytes)
+{
+ SBR_DEBUG("ReadAt(aOffset=%lld, aBuffer=%p, aCount=%u, aBytes=%p)",
+ aOffset, aBytes, aCount, aBytes);
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ return ReadAtInternal(aOffset, aBuffer, aCount, aBytes, /* aMayBlock = */ true);
+}
+
+nsresult
+SourceBufferResource::ReadAtInternal(int64_t aOffset, char* aBuffer, uint32_t aCount, uint32_t* aBytes,
+ bool aMayBlock)
+{
+ mMonitor.AssertCurrentThreadIn();
+
+ MOZ_ASSERT_IF(!aMayBlock, aBytes);
+
+ if (mClosed ||
+ aOffset < 0 ||
+ uint64_t(aOffset) < mInputBuffer.GetOffset() ||
+ aOffset > GetLength()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ while (aMayBlock &&
+ !mEnded &&
+ aOffset + aCount > GetLength()) {
+ SBR_DEBUGV("waiting for data");
+ mMonitor.Wait();
+ // The callers of this function should have checked this, but it's
+ // possible that we had an eviction while waiting on the monitor.
+ if (uint64_t(aOffset) < mInputBuffer.GetOffset()) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+
+ uint32_t available = GetLength() - aOffset;
+ uint32_t count = std::min(aCount, available);
+
+ // Keep the position of the last read to have Tell() approximately give us
+ // the position we're up to in the stream.
+ mOffset = aOffset + count;
+
+ SBR_DEBUGV("offset=%llu GetLength()=%u available=%u count=%u mEnded=%d",
+ aOffset, GetLength(), available, count, mEnded);
+ if (available == 0) {
+ SBR_DEBUGV("reached EOF");
+ *aBytes = 0;
+ return NS_OK;
+ }
+
+ mInputBuffer.CopyData(aOffset, count, aBuffer);
+ *aBytes = count;
+
+ return NS_OK;
+}
+
+nsresult
+SourceBufferResource::ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount)
+{
+ SBR_DEBUG("ReadFromCache(aBuffer=%p, aOffset=%lld, aCount=%u)",
+ aBuffer, aOffset, aCount);
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ uint32_t bytesRead;
+ nsresult rv = ReadAtInternal(aOffset, aBuffer, aCount, &bytesRead, /* aMayBlock = */ false);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // ReadFromCache return failure if not all the data is cached.
+ return bytesRead == aCount ? NS_OK : NS_ERROR_FAILURE;
+}
+
+uint32_t
+SourceBufferResource::EvictData(uint64_t aPlaybackOffset, int64_t aThreshold,
+ ErrorResult& aRv)
+{
+ SBR_DEBUG("EvictData(aPlaybackOffset=%llu,"
+ "aThreshold=%u)", aPlaybackOffset, aThreshold);
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ uint32_t result = mInputBuffer.Evict(aPlaybackOffset, aThreshold, aRv);
+ if (result > 0) {
+ // Wake up any waiting threads in case a ReadInternal call
+ // is now invalid.
+ mon.NotifyAll();
+ }
+ return result;
+}
+
+void
+SourceBufferResource::EvictBefore(uint64_t aOffset, ErrorResult& aRv)
+{
+ SBR_DEBUG("EvictBefore(aOffset=%llu)", aOffset);
+ ReentrantMonitorAutoEnter mon(mMonitor);
+
+ mInputBuffer.EvictBefore(aOffset, aRv);
+
+ // Wake up any waiting threads in case a ReadInternal call
+ // is now invalid.
+ mon.NotifyAll();
+}
+
+uint32_t
+SourceBufferResource::EvictAll()
+{
+ SBR_DEBUG("EvictAll()");
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ return mInputBuffer.EvictAll();
+}
+
+void
+SourceBufferResource::AppendData(MediaByteBuffer* aData)
+{
+ SBR_DEBUG("AppendData(aData=%p, aLength=%u)",
+ aData->Elements(), aData->Length());
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ mInputBuffer.AppendItem(aData);
+ mEnded = false;
+ mon.NotifyAll();
+}
+
+void
+SourceBufferResource::Ended()
+{
+ SBR_DEBUG("");
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ mEnded = true;
+ mon.NotifyAll();
+}
+
+SourceBufferResource::~SourceBufferResource()
+{
+ SBR_DEBUG("");
+ MOZ_COUNT_DTOR(SourceBufferResource);
+}
+
+SourceBufferResource::SourceBufferResource(const nsACString& aType)
+ : mType(aType)
+ , mMonitor("mozilla::SourceBufferResource::mMonitor")
+ , mOffset(0)
+ , mClosed(false)
+ , mEnded(false)
+{
+ SBR_DEBUG("");
+ MOZ_COUNT_CTOR(SourceBufferResource);
+}
+
+#undef SBR_DEBUG
+#undef SBR_DEBUGV
+} // namespace mozilla
diff --git a/dom/media/mediasource/SourceBufferResource.h b/dom/media/mediasource/SourceBufferResource.h
new file mode 100644
index 000000000..26ed74602
--- /dev/null
+++ b/dom/media/mediasource/SourceBufferResource.h
@@ -0,0 +1,161 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_SOURCEBUFFERRESOURCE_H_
+#define MOZILLA_SOURCEBUFFERRESOURCE_H_
+
+#include "MediaCache.h"
+#include "MediaResource.h"
+#include "ResourceQueue.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "nsCOMPtr.h"
+#include "nsError.h"
+#include "nsIPrincipal.h"
+#include "nsString.h"
+#include "nsTArray.h"
+#include "nscore.h"
+#include "mozilla/Logging.h"
+
+#define UNIMPLEMENTED() { /* Logging this is too spammy to do by default */ }
+
+class nsIStreamListener;
+
+namespace mozilla {
+
+class MediaDecoder;
+class MediaByteBuffer;
+
+namespace dom {
+
+class SourceBuffer;
+
+} // namespace dom
+
+class SourceBufferResource final : public MediaResource
+{
+public:
+ explicit SourceBufferResource(const nsACString& aType);
+ nsresult Close() override;
+ void Suspend(bool aCloseImmediately) override { UNIMPLEMENTED(); }
+ void Resume() override { UNIMPLEMENTED(); }
+ already_AddRefed<nsIPrincipal> GetCurrentPrincipal() override { UNIMPLEMENTED(); return nullptr; }
+ already_AddRefed<MediaResource> CloneData(MediaResourceCallback*) override { UNIMPLEMENTED(); return nullptr; }
+ void SetReadMode(MediaCacheStream::ReadMode aMode) override { UNIMPLEMENTED(); }
+ void SetPlaybackRate(uint32_t aBytesPerSecond) override { UNIMPLEMENTED(); }
+ nsresult ReadAt(int64_t aOffset, char* aBuffer, uint32_t aCount, uint32_t* aBytes) override;
+ int64_t Tell() override { return mOffset; }
+ void Pin() override { UNIMPLEMENTED(); }
+ void Unpin() override { UNIMPLEMENTED(); }
+ double GetDownloadRate(bool* aIsReliable) override { UNIMPLEMENTED(); *aIsReliable = false; return 0; }
+ int64_t GetLength() override { return mInputBuffer.GetLength(); }
+ int64_t GetNextCachedData(int64_t aOffset) override {
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ MOZ_ASSERT(aOffset >= 0);
+ if (uint64_t(aOffset) < mInputBuffer.GetOffset()) {
+ return mInputBuffer.GetOffset();
+ } else if (aOffset == GetLength()) {
+ return -1;
+ }
+ return aOffset;
+ }
+ int64_t GetCachedDataEnd(int64_t aOffset) override { UNIMPLEMENTED(); return -1; }
+ bool IsDataCachedToEndOfResource(int64_t aOffset) override { return false; }
+ bool IsSuspendedByCache() override { UNIMPLEMENTED(); return false; }
+ bool IsSuspended() override { UNIMPLEMENTED(); return false; }
+ nsresult ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount) override;
+ bool IsTransportSeekable() override { UNIMPLEMENTED(); return true; }
+ nsresult Open(nsIStreamListener** aStreamListener) override { UNIMPLEMENTED(); return NS_ERROR_FAILURE; }
+
+ nsresult GetCachedRanges(MediaByteRangeSet& aRanges) override
+ {
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ if (mInputBuffer.GetLength()) {
+ aRanges += MediaByteRange(mInputBuffer.GetOffset(),
+ mInputBuffer.GetLength());
+ }
+ return NS_OK;
+ }
+
+ const nsCString& GetContentType() const override { return mType; }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ ReentrantMonitorAutoEnter mon(mMonitor);
+
+ size_t size = MediaResource::SizeOfExcludingThis(aMallocSizeOf);
+ size += mType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+ size += mInputBuffer.SizeOfExcludingThis(aMallocSizeOf);
+
+ return size;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ bool IsExpectingMoreData() override
+ {
+ return false;
+ }
+
+ // Used by SourceBuffer.
+ void AppendData(MediaByteBuffer* aData);
+ void Ended();
+ bool IsEnded()
+ {
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ return mEnded;
+ }
+ // Remove data from resource if it holds more than the threshold reduced by
+ // the given number of bytes. Returns amount evicted.
+ uint32_t EvictData(uint64_t aPlaybackOffset, int64_t aThresholdReduct,
+ ErrorResult& aRv);
+
+ // Remove data from resource before the given offset.
+ void EvictBefore(uint64_t aOffset, ErrorResult& aRv);
+
+ // Remove all data from the resource
+ uint32_t EvictAll();
+
+ // Returns the amount of data currently retained by this resource.
+ int64_t GetSize() {
+ ReentrantMonitorAutoEnter mon(mMonitor);
+ return mInputBuffer.GetLength() - mInputBuffer.GetOffset();
+ }
+
+#if defined(DEBUG)
+ void Dump(const char* aPath) {
+ mInputBuffer.Dump(aPath);
+ }
+#endif
+
+private:
+ virtual ~SourceBufferResource();
+ nsresult ReadAtInternal(int64_t aOffset, char* aBuffer, uint32_t aCount, uint32_t* aBytes, bool aMayBlock);
+
+ const nsCString mType;
+
+ // Provides synchronization between SourceBuffers and InputAdapters.
+ // Protects all of the member variables below. Read() will await a
+ // Notify() (from Seek, AppendData, Ended, or Close) when insufficient
+ // data is available in mData.
+ mutable ReentrantMonitor mMonitor;
+
+ // The buffer holding resource data.
+ ResourceQueue mInputBuffer;
+
+ uint64_t mOffset;
+ bool mClosed;
+ bool mEnded;
+};
+
+} // namespace mozilla
+
+#undef UNIMPLEMENTED
+
+#endif /* MOZILLA_SOURCEBUFFERRESOURCE_H_ */
diff --git a/dom/media/mediasource/SourceBufferTask.h b/dom/media/mediasource/SourceBufferTask.h
new file mode 100644
index 000000000..868b60859
--- /dev/null
+++ b/dom/media/mediasource/SourceBufferTask.h
@@ -0,0 +1,111 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_SOURCEBUFFERTASK_H_
+#define MOZILLA_SOURCEBUFFERTASK_H_
+
+#include "mozilla/MozPromise.h"
+#include "mozilla/Pair.h"
+#include "mozilla/RefPtr.h"
+#include "SourceBufferAttributes.h"
+#include "TimeUnits.h"
+#include "MediaResult.h"
+
+namespace mozilla {
+
+class SourceBufferTask {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SourceBufferTask);
+ enum class Type {
+ AppendBuffer,
+ Abort,
+ Reset,
+ RangeRemoval,
+ EvictData,
+ Detach
+ };
+
+ typedef Pair<bool, SourceBufferAttributes> AppendBufferResult;
+ typedef MozPromise<AppendBufferResult, MediaResult, /* IsExclusive = */ true> AppendPromise;
+ typedef MozPromise<bool, nsresult, /* IsExclusive = */ true> RangeRemovalPromise;
+
+ virtual Type GetType() const = 0;
+
+ template<typename ReturnType>
+ ReturnType* As()
+ {
+ MOZ_ASSERT(this->GetType() == ReturnType::sType);
+ return static_cast<ReturnType*>(this);
+ }
+
+protected:
+ virtual ~SourceBufferTask() {}
+};
+
+class AppendBufferTask : public SourceBufferTask {
+public:
+ AppendBufferTask(MediaByteBuffer* aData,
+ SourceBufferAttributes aAttributes)
+ : mBuffer(aData)
+ , mAttributes(aAttributes)
+ {}
+
+ static const Type sType = Type::AppendBuffer;
+ Type GetType() const override { return Type::AppendBuffer; }
+
+ RefPtr<MediaByteBuffer> mBuffer;
+ SourceBufferAttributes mAttributes;
+ MozPromiseHolder<AppendPromise> mPromise;
+};
+
+class AbortTask : public SourceBufferTask {
+public:
+ static const Type sType = Type::Abort;
+ Type GetType() const override { return Type::Abort; }
+};
+
+class ResetTask : public SourceBufferTask {
+public:
+ static const Type sType = Type::Reset;
+ Type GetType() const override { return Type::Reset; }
+};
+
+class RangeRemovalTask : public SourceBufferTask {
+public:
+ explicit RangeRemovalTask(const media::TimeInterval& aRange)
+ : mRange(aRange)
+ {}
+
+ static const Type sType = Type::RangeRemoval;
+ Type GetType() const override { return Type::RangeRemoval; }
+
+ media::TimeInterval mRange;
+ MozPromiseHolder<RangeRemovalPromise> mPromise;
+};
+
+class EvictDataTask : public SourceBufferTask {
+public:
+ EvictDataTask(const media::TimeUnit& aPlaybackTime, int64_t aSizetoEvict)
+ : mPlaybackTime(aPlaybackTime)
+ , mSizeToEvict(aSizetoEvict)
+ {}
+
+ static const Type sType = Type::EvictData;
+ Type GetType() const override { return Type::EvictData; }
+
+ media::TimeUnit mPlaybackTime;
+ int64_t mSizeToEvict;
+};
+
+class DetachTask : public SourceBufferTask {
+public:
+ static const Type sType = Type::Detach;
+ Type GetType() const override { return Type::Detach; }
+};
+
+} // end mozilla namespace
+
+#endif \ No newline at end of file
diff --git a/dom/media/mediasource/TrackBuffersManager.cpp b/dom/media/mediasource/TrackBuffersManager.cpp
new file mode 100644
index 000000000..4265aed81
--- /dev/null
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -0,0 +1,2505 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "TrackBuffersManager.h"
+#include "ContainerParser.h"
+#include "MediaSourceDemuxer.h"
+#include "MediaSourceUtils.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/StateMirroring.h"
+#include "SourceBufferResource.h"
+#include "SourceBuffer.h"
+#include "WebMDemuxer.h"
+#include "SourceBufferTask.h"
+
+#ifdef MOZ_FMP4
+#include "MP4Demuxer.h"
+#endif
+
+#include <limits>
+
+extern mozilla::LogModule* GetMediaSourceLog();
+
+#define MSE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Debug, ("TrackBuffersManager(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+#define MSE_DEBUGV(arg, ...) MOZ_LOG(GetMediaSourceLog(), mozilla::LogLevel::Verbose, ("TrackBuffersManager(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+
+mozilla::LogModule* GetMediaSourceSamplesLog()
+{
+ static mozilla::LazyLogModule sLogModule("MediaSourceSamples");
+ return sLogModule;
+}
+#define SAMPLE_DEBUG(arg, ...) MOZ_LOG(GetMediaSourceSamplesLog(), mozilla::LogLevel::Debug, ("TrackBuffersManager(%p:%s)::%s: " arg, this, mType.get(), __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+using dom::SourceBufferAppendMode;
+using media::TimeUnit;
+using media::TimeInterval;
+using media::TimeIntervals;
+typedef SourceBufferTask::AppendBufferResult AppendBufferResult;
+
+static const char*
+AppendStateToStr(SourceBufferAttributes::AppendState aState)
+{
+ switch (aState) {
+ case SourceBufferAttributes::AppendState::WAITING_FOR_SEGMENT:
+ return "WAITING_FOR_SEGMENT";
+ case SourceBufferAttributes::AppendState::PARSING_INIT_SEGMENT:
+ return "PARSING_INIT_SEGMENT";
+ case SourceBufferAttributes::AppendState::PARSING_MEDIA_SEGMENT:
+ return "PARSING_MEDIA_SEGMENT";
+ default:
+ return "IMPOSSIBLE";
+ }
+}
+
+static Atomic<uint32_t> sStreamSourceID(0u);
+
+class DispatchKeyNeededEvent : public Runnable {
+public:
+ DispatchKeyNeededEvent(AbstractMediaDecoder* aDecoder,
+ nsTArray<uint8_t>& aInitData,
+ const nsString& aInitDataType)
+ : mDecoder(aDecoder)
+ , mInitData(aInitData)
+ , mInitDataType(aInitDataType)
+ {
+ }
+ NS_IMETHOD Run() override {
+ // Note: Null check the owner, as the decoder could have been shutdown
+ // since this event was dispatched.
+ MediaDecoderOwner* owner = mDecoder->GetOwner();
+ if (owner) {
+ owner->DispatchEncrypted(mInitData, mInitDataType);
+ }
+ mDecoder = nullptr;
+ return NS_OK;
+ }
+private:
+ RefPtr<AbstractMediaDecoder> mDecoder;
+ nsTArray<uint8_t> mInitData;
+ nsString mInitDataType;
+};
+
+TrackBuffersManager::TrackBuffersManager(MediaSourceDecoder* aParentDecoder,
+ const nsACString& aType)
+ : mInputBuffer(new MediaByteBuffer)
+ , mBufferFull(false)
+ , mFirstInitializationSegmentReceived(false)
+ , mNewMediaSegmentStarted(false)
+ , mActiveTrack(false)
+ , mType(aType)
+ , mParser(ContainerParser::CreateForMIMEType(aType))
+ , mProcessedInput(0)
+ , mTaskQueue(aParentDecoder->GetDemuxer()->GetTaskQueue())
+ , mParentDecoder(new nsMainThreadPtrHolder<MediaSourceDecoder>(aParentDecoder, false /* strict */))
+ , mEnded(false)
+ , mVideoEvictionThreshold(Preferences::GetUint("media.mediasource.eviction_threshold.video",
+ 100 * 1024 * 1024))
+ , mAudioEvictionThreshold(Preferences::GetUint("media.mediasource.eviction_threshold.audio",
+ 20 * 1024 * 1024))
+ , mEvictionState(EvictionState::NO_EVICTION_NEEDED)
+ , mMonitor("TrackBuffersManager")
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Must be instanciated on the main thread");
+}
+
+TrackBuffersManager::~TrackBuffersManager()
+{
+ ShutdownDemuxers();
+}
+
+RefPtr<TrackBuffersManager::AppendPromise>
+TrackBuffersManager::AppendData(MediaByteBuffer* aData,
+ const SourceBufferAttributes& aAttributes)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("Appending %lld bytes", aData->Length());
+
+ mEnded = false;
+
+ RefPtr<MediaByteBuffer> buffer = aData;
+
+ return InvokeAsync(GetTaskQueue(), this,
+ __func__, &TrackBuffersManager::DoAppendData,
+ buffer, aAttributes);
+}
+
+RefPtr<TrackBuffersManager::AppendPromise>
+TrackBuffersManager::DoAppendData(RefPtr<MediaByteBuffer> aData,
+ SourceBufferAttributes aAttributes)
+{
+ RefPtr<AppendBufferTask> task = new AppendBufferTask(aData, aAttributes);
+ RefPtr<AppendPromise> p = task->mPromise.Ensure(__func__);
+ QueueTask(task);
+
+ return p;
+}
+
+void
+TrackBuffersManager::QueueTask(SourceBufferTask* aTask)
+{
+ if (!OnTaskQueue()) {
+ GetTaskQueue()->Dispatch(NewRunnableMethod<RefPtr<SourceBufferTask>>(
+ this, &TrackBuffersManager::QueueTask, aTask));
+ return;
+ }
+ MOZ_ASSERT(OnTaskQueue());
+ mQueue.Push(aTask);
+ ProcessTasks();
+}
+
+void
+TrackBuffersManager::ProcessTasks()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ typedef SourceBufferTask::Type Type;
+
+ if (mCurrentTask) {
+ // Already have a task pending. ProcessTask will be scheduled once the
+ // current task complete.
+ return;
+ }
+ RefPtr<SourceBufferTask> task = mQueue.Pop();
+ if (!task) {
+ // nothing to do.
+ return;
+ }
+ switch (task->GetType()) {
+ case Type::AppendBuffer:
+ mCurrentTask = task;
+ if (!mInputBuffer) {
+ mInputBuffer = task->As<AppendBufferTask>()->mBuffer;
+ } else if (!mInputBuffer->AppendElements(*task->As<AppendBufferTask>()->mBuffer, fallible)) {
+ RejectAppend(NS_ERROR_OUT_OF_MEMORY, __func__);
+ return;
+ }
+ mSourceBufferAttributes =
+ MakeUnique<SourceBufferAttributes>(task->As<AppendBufferTask>()->mAttributes);
+ mAppendWindow =
+ TimeInterval(TimeUnit::FromSeconds(mSourceBufferAttributes->GetAppendWindowStart()),
+ TimeUnit::FromSeconds(mSourceBufferAttributes->GetAppendWindowEnd()));
+ ScheduleSegmentParserLoop();
+ break;
+ case Type::RangeRemoval:
+ {
+ bool rv = CodedFrameRemoval(task->As<RangeRemovalTask>()->mRange);
+ task->As<RangeRemovalTask>()->mPromise.Resolve(rv, __func__);
+ break;
+ }
+ case Type::EvictData:
+ DoEvictData(task->As<EvictDataTask>()->mPlaybackTime,
+ task->As<EvictDataTask>()->mSizeToEvict);
+ break;
+ case Type::Abort:
+ // not handled yet, and probably never.
+ break;
+ case Type::Reset:
+ CompleteResetParserState();
+ break;
+ case Type::Detach:
+ mTaskQueue = nullptr;
+ MOZ_DIAGNOSTIC_ASSERT(mQueue.Length() == 0,
+ "Detach task must be the last");
+ return;
+ default:
+ NS_WARNING("Invalid Task");
+ }
+ GetTaskQueue()->Dispatch(NewRunnableMethod(this, &TrackBuffersManager::ProcessTasks));
+}
+
+// The MSE spec requires that we abort the current SegmentParserLoop
+// which is then followed by a call to ResetParserState.
+// However due to our asynchronous design this causes inherent difficulties.
+// As the spec behaviour is non deterministic anyway, we instead process all
+// pending frames found in the input buffer.
+void
+TrackBuffersManager::AbortAppendData()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("");
+
+ QueueTask(new AbortTask());
+}
+
+void
+TrackBuffersManager::ResetParserState(SourceBufferAttributes& aAttributes)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("");
+
+ // Spec states:
+ // 1. If the append state equals PARSING_MEDIA_SEGMENT and the input buffer contains some complete coded frames, then run the coded frame processing algorithm until all of these complete coded frames have been processed.
+ // However, we will wait until all coded frames have been processed regardless
+ // of the value of append state.
+ QueueTask(new ResetTask());
+
+ // ResetParserState has some synchronous steps that much be performed now.
+ // The remaining steps will be performed once the ResetTask gets executed.
+
+ // 6. If the mode attribute equals "sequence", then set the group start timestamp to the group end timestamp
+ if (aAttributes.GetAppendMode() == SourceBufferAppendMode::Sequence) {
+ aAttributes.SetGroupStartTimestamp(aAttributes.GetGroupEndTimestamp());
+ }
+ // 8. Set append state to WAITING_FOR_SEGMENT.
+ aAttributes.SetAppendState(AppendState::WAITING_FOR_SEGMENT);
+}
+
+RefPtr<TrackBuffersManager::RangeRemovalPromise>
+TrackBuffersManager::RangeRemoval(TimeUnit aStart, TimeUnit aEnd)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("From %.2f to %.2f", aStart.ToSeconds(), aEnd.ToSeconds());
+
+ mEnded = false;
+
+ return InvokeAsync(GetTaskQueue(), this, __func__,
+ &TrackBuffersManager::CodedFrameRemovalWithPromise,
+ TimeInterval(aStart, aEnd));
+}
+
+TrackBuffersManager::EvictDataResult
+TrackBuffersManager::EvictData(const TimeUnit& aPlaybackTime, int64_t aSize)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (aSize > EvictionThreshold()) {
+ // We're adding more data than we can hold.
+ return EvictDataResult::BUFFER_FULL;
+ }
+ const int64_t toEvict = GetSize() + aSize - EvictionThreshold();
+
+ const uint32_t canEvict =
+ Evictable(HasVideo() ? TrackInfo::kVideoTrack : TrackInfo::kAudioTrack);
+
+ MSE_DEBUG("currentTime=%lld buffered=%lldkB, eviction threshold=%ukB, "
+ "evict=%lldkB canevict=%ukB",
+ aPlaybackTime.ToMicroseconds(), GetSize() / 1024,
+ EvictionThreshold() / 1024, toEvict / 1024, canEvict / 1024);
+
+ if (toEvict <= 0) {
+ mEvictionState = EvictionState::NO_EVICTION_NEEDED;
+ return EvictDataResult::NO_DATA_EVICTED;
+ }
+
+ EvictDataResult result;
+
+ if (mBufferFull && mEvictionState == EvictionState::EVICTION_COMPLETED &&
+ canEvict < uint32_t(toEvict)) {
+ // Our buffer is currently full. We will make another eviction attempt.
+ // However, the current appendBuffer will fail as we can't know ahead of
+ // time if the eviction will later succeed.
+ result = EvictDataResult::BUFFER_FULL;
+ } else {
+ mEvictionState = EvictionState::EVICTION_NEEDED;
+ result = EvictDataResult::NO_DATA_EVICTED;
+ }
+ MSE_DEBUG(
+ "Reached our size limit, schedule eviction of %lld bytes (%s)", toEvict,
+ result == EvictDataResult::BUFFER_FULL ? "buffer full" : "no data evicted");
+ QueueTask(new EvictDataTask(aPlaybackTime, toEvict));
+
+ return result;
+}
+
+TimeIntervals
+TrackBuffersManager::Buffered() const
+{
+ MSE_DEBUG("");
+
+ // http://w3c.github.io/media-source/index.html#widl-SourceBuffer-buffered
+
+ MonitorAutoLock mon(mMonitor);
+ nsTArray<const TimeIntervals*> tracks;
+ if (HasVideo()) {
+ tracks.AppendElement(&mVideoBufferedRanges);
+ }
+ if (HasAudio()) {
+ tracks.AppendElement(&mAudioBufferedRanges);
+ }
+
+ // 2. Let highest end time be the largest track buffer ranges end time across all the track buffers managed by this SourceBuffer object.
+ TimeUnit highestEndTime = HighestEndTime(tracks);
+
+ // 3. Let intersection ranges equal a TimeRange object containing a single range from 0 to highest end time.
+ TimeIntervals intersection{TimeInterval(TimeUnit::FromSeconds(0), highestEndTime)};
+
+ // 4. For each track buffer managed by this SourceBuffer, run the following steps:
+ // 1. Let track ranges equal the track buffer ranges for the current track buffer.
+ for (const TimeIntervals* trackRanges : tracks) {
+ // 2. If readyState is "ended", then set the end time on the last range in track ranges to highest end time.
+ // 3. Let new intersection ranges equal the intersection between the intersection ranges and the track ranges.
+ if (mEnded) {
+ TimeIntervals tR = *trackRanges;
+ tR.Add(TimeInterval(tR.GetEnd(), highestEndTime));
+ intersection.Intersection(tR);
+ } else {
+ intersection.Intersection(*trackRanges);
+ }
+ }
+ return intersection;
+}
+
+int64_t
+TrackBuffersManager::GetSize() const
+{
+ return mSizeSourceBuffer;
+}
+
+void
+TrackBuffersManager::Ended()
+{
+ mEnded = true;
+}
+
+void
+TrackBuffersManager::Detach()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MSE_DEBUG("");
+ QueueTask(new DetachTask());
+}
+
+void
+TrackBuffersManager::CompleteResetParserState()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MSE_DEBUG("");
+
+ // We shouldn't change mInputDemuxer while a demuxer init/reset request is
+ // being processed. See bug 1239983.
+ MOZ_DIAGNOSTIC_ASSERT(!mDemuxerInitRequest.Exists(), "Previous AppendBuffer didn't complete");
+
+ for (auto& track : GetTracksList()) {
+ // 2. Unset the last decode timestamp on all track buffers.
+ // 3. Unset the last frame duration on all track buffers.
+ // 4. Unset the highest end timestamp on all track buffers.
+ // 5. Set the need random access point flag on all track buffers to true.
+ track->ResetAppendState();
+
+ // if we have been aborted, we may have pending frames that we are going
+ // to discard now.
+ track->mQueuedSamples.Clear();
+ }
+
+ // 7. Remove all bytes from the input buffer.
+ mInputBuffer = nullptr;
+ if (mCurrentInputBuffer) {
+ mCurrentInputBuffer->EvictAll();
+ // The demuxer will be recreated during the next run of SegmentParserLoop.
+ // As such we don't need to notify it that data has been removed.
+ mCurrentInputBuffer = new SourceBufferResource(mType);
+ }
+
+ // We could be left with a demuxer in an unusable state. It needs to be
+ // recreated. We store in the InputBuffer an init segment which will be parsed
+ // during the next Segment Parser Loop and a new demuxer will be created and
+ // initialized.
+ if (mFirstInitializationSegmentReceived) {
+ MOZ_ASSERT(mInitData && mInitData->Length(), "we must have an init segment");
+ // The aim here is really to destroy our current demuxer.
+ CreateDemuxerforMIMEType();
+ // Recreate our input buffer. We can't directly assign the initData buffer
+ // to mInputBuffer as it will get modified in the Segment Parser Loop.
+ mInputBuffer = new MediaByteBuffer;
+ mInputBuffer->AppendElements(*mInitData);
+ }
+ RecreateParser(true);
+}
+
+int64_t
+TrackBuffersManager::EvictionThreshold() const
+{
+ if (HasVideo()) {
+ return mVideoEvictionThreshold;
+ }
+ return mAudioEvictionThreshold;
+}
+
+void
+TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime,
+ int64_t aSizeToEvict)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ mEvictionState = EvictionState::EVICTION_COMPLETED;
+
+ // Video is what takes the most space, only evict there if we have video.
+ auto& track = HasVideo() ? mVideoTracks : mAudioTracks;
+ const auto& buffer = track.GetTrackBuffer();
+ // Remove any data we've already played, or before the next sample to be
+ // demuxed whichever is lowest.
+ TimeUnit lowerLimit = std::min(track.mNextSampleTime, aPlaybackTime);
+ uint32_t lastKeyFrameIndex = 0;
+ int64_t toEvict = aSizeToEvict;
+ int64_t partialEvict = 0;
+ for (uint32_t i = 0; i < buffer.Length(); i++) {
+ const auto& frame = buffer[i];
+ if (frame->mKeyframe) {
+ lastKeyFrameIndex = i;
+ toEvict -= partialEvict;
+ if (toEvict < 0) {
+ break;
+ }
+ partialEvict = 0;
+ }
+ if (frame->GetEndTime() >= lowerLimit.ToMicroseconds()) {
+ break;
+ }
+ partialEvict += frame->ComputedSizeOfIncludingThis();
+ }
+
+ const int64_t finalSize = mSizeSourceBuffer - aSizeToEvict;
+
+ if (lastKeyFrameIndex > 0) {
+ MSE_DEBUG("Step1. Evicting %lld bytes prior currentTime",
+ aSizeToEvict - toEvict);
+ CodedFrameRemoval(
+ TimeInterval(TimeUnit::FromMicroseconds(0),
+ TimeUnit::FromMicroseconds(buffer[lastKeyFrameIndex]->mTime - 1)));
+ }
+
+ if (mSizeSourceBuffer <= finalSize) {
+ return;
+ }
+
+ toEvict = mSizeSourceBuffer - finalSize;
+
+ // See if we can evict data into the future.
+ // We do not evict data from the currently used buffered interval.
+
+ TimeUnit currentPosition = std::max(aPlaybackTime, track.mNextSampleTime);
+ TimeIntervals futureBuffered(TimeInterval(currentPosition, TimeUnit::FromInfinity()));
+ futureBuffered.Intersection(track.mBufferedRanges);
+ futureBuffered.SetFuzz(MediaSourceDemuxer::EOS_FUZZ / 2);
+ if (futureBuffered.Length() <= 1) {
+ // We have one continuous segment ahead of us:
+ // nothing further can be evicted.
+ return;
+ }
+
+ // Don't evict before the end of the current segment
+ TimeUnit upperLimit = futureBuffered[0].mEnd;
+ uint32_t evictedFramesStartIndex = buffer.Length();
+ for (int32_t i = buffer.Length() - 1; i >= 0; i--) {
+ const auto& frame = buffer[i];
+ if (frame->mTime <= upperLimit.ToMicroseconds() || toEvict < 0) {
+ // We've reached a frame that shouldn't be evicted -> Evict after it -> i+1.
+ // Or the previous loop reached the eviction threshold -> Evict from it -> i+1.
+ evictedFramesStartIndex = i + 1;
+ break;
+ }
+ toEvict -= frame->ComputedSizeOfIncludingThis();
+ }
+ if (evictedFramesStartIndex < buffer.Length()) {
+ MSE_DEBUG("Step2. Evicting %lld bytes from trailing data",
+ mSizeSourceBuffer - finalSize - toEvict);
+ CodedFrameRemoval(
+ TimeInterval(TimeUnit::FromMicroseconds(buffer[evictedFramesStartIndex]->mTime),
+ TimeUnit::FromInfinity()));
+ }
+}
+
+RefPtr<TrackBuffersManager::RangeRemovalPromise>
+TrackBuffersManager::CodedFrameRemovalWithPromise(TimeInterval aInterval)
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ RefPtr<RangeRemovalTask> task = new RangeRemovalTask(aInterval);
+ RefPtr<RangeRemovalPromise> p = task->mPromise.Ensure(__func__);
+ QueueTask(task);
+
+ return p;
+}
+
+bool
+TrackBuffersManager::CodedFrameRemoval(TimeInterval aInterval)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MSE_DEBUG("From %.2fs to %.2f",
+ aInterval.mStart.ToSeconds(), aInterval.mEnd.ToSeconds());
+
+#if DEBUG
+ if (HasVideo()) {
+ MSE_DEBUG("before video ranges=%s",
+ DumpTimeRanges(mVideoTracks.mBufferedRanges).get());
+ }
+ if (HasAudio()) {
+ MSE_DEBUG("before audio ranges=%s",
+ DumpTimeRanges(mAudioTracks.mBufferedRanges).get());
+ }
+#endif
+
+ // 1. Let start be the starting presentation timestamp for the removal range.
+ TimeUnit start = aInterval.mStart;
+ // 2. Let end be the end presentation timestamp for the removal range.
+ TimeUnit end = aInterval.mEnd;
+
+ bool dataRemoved = false;
+
+ // 3. For each track buffer in this source buffer, run the following steps:
+ for (auto track : GetTracksList()) {
+ MSE_DEBUGV("Processing %s track", track->mInfo->mMimeType.get());
+ // 1. Let remove end timestamp be the current value of duration
+ // See bug: https://www.w3.org/Bugs/Public/show_bug.cgi?id=28727
+ // At worse we will remove all frames until the end, unless a key frame is
+ // found between the current interval's end and the trackbuffer's end.
+ TimeUnit removeEndTimestamp = track->mBufferedRanges.GetEnd();
+
+ if (start > removeEndTimestamp) {
+ // Nothing to remove.
+ continue;
+ }
+
+ // 2. If this track buffer has a random access point timestamp that is greater than or equal to end,
+ // then update remove end timestamp to that random access point timestamp.
+ if (end < track->mBufferedRanges.GetEnd()) {
+ for (auto& frame : track->GetTrackBuffer()) {
+ if (frame->mKeyframe && frame->mTime >= end.ToMicroseconds()) {
+ removeEndTimestamp = TimeUnit::FromMicroseconds(frame->mTime);
+ break;
+ }
+ }
+ }
+
+ // 3. Remove all media data, from this track buffer, that contain starting
+ // timestamps greater than or equal to start and less than the remove end timestamp.
+ // 4. Remove decoding dependencies of the coded frames removed in the previous step:
+ // Remove all coded frames between the coded frames removed in the previous step and the next random access point after those removed frames.
+ TimeIntervals removedInterval{TimeInterval(start, removeEndTimestamp)};
+ RemoveFrames(removedInterval, *track, 0);
+
+ // 5. If this object is in activeSourceBuffers, the current playback position
+ // is greater than or equal to start and less than the remove end timestamp,
+ // and HTMLMediaElement.readyState is greater than HAVE_METADATA, then set the
+ // HTMLMediaElement.readyState attribute to HAVE_METADATA and stall playback.
+ // This will be done by the MDSM during playback.
+ // TODO properly, so it works even if paused.
+ }
+
+ UpdateBufferedRanges();
+
+ // Update our reported total size.
+ mSizeSourceBuffer = mVideoTracks.mSizeBuffer + mAudioTracks.mSizeBuffer;
+
+ // 4. If buffer full flag equals true and this object is ready to accept more bytes, then set the buffer full flag to false.
+ if (mBufferFull && mSizeSourceBuffer < EvictionThreshold()) {
+ mBufferFull = false;
+ }
+
+ return dataRemoved;
+}
+
+void
+TrackBuffersManager::UpdateBufferedRanges()
+{
+ MonitorAutoLock mon(mMonitor);
+
+ mVideoBufferedRanges = mVideoTracks.mSanitizedBufferedRanges;
+ mAudioBufferedRanges = mAudioTracks.mSanitizedBufferedRanges;
+
+#if DEBUG
+ if (HasVideo()) {
+ MSE_DEBUG("after video ranges=%s",
+ DumpTimeRanges(mVideoTracks.mBufferedRanges).get());
+ }
+ if (HasAudio()) {
+ MSE_DEBUG("after audio ranges=%s",
+ DumpTimeRanges(mAudioTracks.mBufferedRanges).get());
+ }
+#endif
+}
+
+void
+TrackBuffersManager::SegmentParserLoop()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ while (true) {
+ // 1. If the input buffer is empty, then jump to the need more data step below.
+ if (!mInputBuffer || mInputBuffer->IsEmpty()) {
+ NeedMoreData();
+ return;
+ }
+ // 2. If the input buffer contains bytes that violate the SourceBuffer
+ // byte stream format specification, then run the append error algorithm with
+ // the decode error parameter set to true and abort this algorithm.
+ // TODO
+
+ // 3. Remove any bytes that the byte stream format specifications say must be
+ // ignored from the start of the input buffer.
+ // We do not remove bytes from our input buffer. Instead we enforce that
+ // our ContainerParser is able to skip over all data that is supposed to be
+ // ignored.
+
+ // 4. If the append state equals WAITING_FOR_SEGMENT, then run the following
+ // steps:
+ if (mSourceBufferAttributes->GetAppendState() == AppendState::WAITING_FOR_SEGMENT) {
+ MediaResult haveInitSegment = mParser->IsInitSegmentPresent(mInputBuffer);
+ if (NS_SUCCEEDED(haveInitSegment)) {
+ SetAppendState(AppendState::PARSING_INIT_SEGMENT);
+ if (mFirstInitializationSegmentReceived) {
+ // This is a new initialization segment. Obsolete the old one.
+ RecreateParser(false);
+ }
+ continue;
+ }
+ MediaResult haveMediaSegment =
+ mParser->IsMediaSegmentPresent(mInputBuffer);
+ if (NS_SUCCEEDED(haveMediaSegment)) {
+ SetAppendState(AppendState::PARSING_MEDIA_SEGMENT);
+ mNewMediaSegmentStarted = true;
+ continue;
+ }
+ // We have neither an init segment nor a media segment.
+ // Check if it was invalid data.
+ if (haveInitSegment != NS_ERROR_NOT_AVAILABLE) {
+ MSE_DEBUG("Found invalid data.");
+ RejectAppend(haveInitSegment, __func__);
+ return;
+ }
+ if (haveMediaSegment != NS_ERROR_NOT_AVAILABLE) {
+ MSE_DEBUG("Found invalid data.");
+ RejectAppend(haveMediaSegment, __func__);
+ return;
+ }
+ MSE_DEBUG("Found incomplete data.");
+ NeedMoreData();
+ return;
+ }
+
+ int64_t start, end;
+ MediaResult newData =
+ mParser->ParseStartAndEndTimestamps(mInputBuffer, start, end);
+ if (!NS_SUCCEEDED(newData) && newData.Code() != NS_ERROR_NOT_AVAILABLE) {
+ RejectAppend(newData, __func__);
+ return;
+ }
+ mProcessedInput += mInputBuffer->Length();
+
+ // 5. If the append state equals PARSING_INIT_SEGMENT, then run the
+ // following steps:
+ if (mSourceBufferAttributes->GetAppendState() == AppendState::PARSING_INIT_SEGMENT) {
+ if (mParser->InitSegmentRange().IsEmpty()) {
+ mInputBuffer = nullptr;
+ NeedMoreData();
+ return;
+ }
+ InitializationSegmentReceived();
+ return;
+ }
+ if (mSourceBufferAttributes->GetAppendState() == AppendState::PARSING_MEDIA_SEGMENT) {
+ // 1. If the first initialization segment received flag is false, then run the append error algorithm with the decode error parameter set to true and abort this algorithm.
+ if (!mFirstInitializationSegmentReceived) {
+ RejectAppend(NS_ERROR_FAILURE, __func__);
+ return;
+ }
+
+ // We can't feed some demuxers (WebMDemuxer) with data that do not have
+ // monotonizally increasing timestamps. So we check if we have a
+ // discontinuity from the previous segment parsed.
+ // If so, recreate a new demuxer to ensure that the demuxer is only fed
+ // monotonically increasing data.
+ if (mNewMediaSegmentStarted) {
+ if (NS_SUCCEEDED(newData) && mLastParsedEndTime.isSome() &&
+ start < mLastParsedEndTime.ref().ToMicroseconds()) {
+ MSE_DEBUG("Re-creating demuxer");
+ ResetDemuxingState();
+ return;
+ }
+ if (NS_SUCCEEDED(newData) || !mParser->MediaSegmentRange().IsEmpty()) {
+ if (mPendingInputBuffer) {
+ // We now have a complete media segment header. We can resume parsing
+ // the data.
+ AppendDataToCurrentInputBuffer(mPendingInputBuffer);
+ mPendingInputBuffer = nullptr;
+ }
+ mNewMediaSegmentStarted = false;
+ } else {
+ // We don't have any data to demux yet, stash aside the data.
+ // This also handles the case:
+ // 2. If the input buffer does not contain a complete media segment header yet, then jump to the need more data step below.
+ if (!mPendingInputBuffer) {
+ mPendingInputBuffer = mInputBuffer;
+ } else {
+ mPendingInputBuffer->AppendElements(*mInputBuffer);
+ }
+ mInputBuffer = nullptr;
+ NeedMoreData();
+ return;
+ }
+ }
+
+ // 3. If the input buffer contains one or more complete coded frames, then run the coded frame processing algorithm.
+ RefPtr<TrackBuffersManager> self = this;
+ mProcessingRequest.Begin(CodedFrameProcessing()
+ ->Then(GetTaskQueue(), __func__,
+ [self] (bool aNeedMoreData) {
+ self->mProcessingRequest.Complete();
+ if (aNeedMoreData) {
+ self->NeedMoreData();
+ } else {
+ self->ScheduleSegmentParserLoop();
+ }
+ },
+ [self] (const MediaResult& aRejectValue) {
+ self->mProcessingRequest.Complete();
+ self->RejectAppend(aRejectValue, __func__);
+ }));
+ return;
+ }
+ }
+}
+
+void
+TrackBuffersManager::NeedMoreData()
+{
+ MSE_DEBUG("");
+ MOZ_DIAGNOSTIC_ASSERT(mCurrentTask && mCurrentTask->GetType() == SourceBufferTask::Type::AppendBuffer);
+ MOZ_DIAGNOSTIC_ASSERT(mSourceBufferAttributes);
+
+ mCurrentTask->As<AppendBufferTask>()->mPromise.Resolve(
+ SourceBufferTask::AppendBufferResult(mActiveTrack,
+ *mSourceBufferAttributes),
+ __func__);
+ mSourceBufferAttributes = nullptr;
+ mCurrentTask = nullptr;
+ ProcessTasks();
+}
+
+void
+TrackBuffersManager::RejectAppend(const MediaResult& aRejectValue, const char* aName)
+{
+ MSE_DEBUG("rv=%u", aRejectValue.Code());
+ MOZ_DIAGNOSTIC_ASSERT(mCurrentTask && mCurrentTask->GetType() == SourceBufferTask::Type::AppendBuffer);
+
+ mCurrentTask->As<AppendBufferTask>()->mPromise.Reject(aRejectValue, __func__);
+ mSourceBufferAttributes = nullptr;
+ mCurrentTask = nullptr;
+ ProcessTasks();
+}
+
+void
+TrackBuffersManager::ScheduleSegmentParserLoop()
+{
+ GetTaskQueue()->Dispatch(NewRunnableMethod(this, &TrackBuffersManager::SegmentParserLoop));
+}
+
+void
+TrackBuffersManager::ShutdownDemuxers()
+{
+ if (mVideoTracks.mDemuxer) {
+ mVideoTracks.mDemuxer->BreakCycles();
+ mVideoTracks.mDemuxer = nullptr;
+ }
+ if (mAudioTracks.mDemuxer) {
+ mAudioTracks.mDemuxer->BreakCycles();
+ mAudioTracks.mDemuxer = nullptr;
+ }
+ // We shouldn't change mInputDemuxer while a demuxer init/reset request is
+ // being processed. See bug 1239983.
+ MOZ_DIAGNOSTIC_ASSERT(!mDemuxerInitRequest.Exists());
+ mInputDemuxer = nullptr;
+ mLastParsedEndTime.reset();
+}
+
+void
+TrackBuffersManager::CreateDemuxerforMIMEType()
+{
+ ShutdownDemuxers();
+
+ if (mType.LowerCaseEqualsLiteral("video/webm") ||
+ mType.LowerCaseEqualsLiteral("audio/webm")) {
+ mInputDemuxer = new WebMDemuxer(mCurrentInputBuffer, true /* IsMediaSource*/ );
+ return;
+ }
+
+#ifdef MOZ_FMP4
+ if (mType.LowerCaseEqualsLiteral("video/mp4") ||
+ mType.LowerCaseEqualsLiteral("audio/mp4")) {
+ mInputDemuxer = new MP4Demuxer(mCurrentInputBuffer);
+ return;
+ }
+#endif
+ NS_WARNING("Not supported (yet)");
+ return;
+}
+
+// We reset the demuxer by creating a new one and initializing it.
+void
+TrackBuffersManager::ResetDemuxingState()
+{
+ MOZ_ASSERT(mParser && mParser->HasInitData());
+ RecreateParser(true);
+ mCurrentInputBuffer = new SourceBufferResource(mType);
+ // The demuxer isn't initialized yet ; we don't want to notify it
+ // that data has been appended yet ; so we simply append the init segment
+ // to the resource.
+ mCurrentInputBuffer->AppendData(mParser->InitData());
+ CreateDemuxerforMIMEType();
+ if (!mInputDemuxer) {
+ RejectAppend(NS_ERROR_FAILURE, __func__);
+ return;
+ }
+ mDemuxerInitRequest.Begin(mInputDemuxer->Init()
+ ->Then(GetTaskQueue(), __func__,
+ this,
+ &TrackBuffersManager::OnDemuxerResetDone,
+ &TrackBuffersManager::OnDemuxerInitFailed));
+}
+
+void
+TrackBuffersManager::OnDemuxerResetDone(nsresult)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mDemuxerInitRequest.Complete();
+ // mInputDemuxer shouldn't have been destroyed while a demuxer init/reset
+ // request was being processed. See bug 1239983.
+ MOZ_DIAGNOSTIC_ASSERT(mInputDemuxer);
+
+ // Recreate track demuxers.
+ uint32_t numVideos = mInputDemuxer->GetNumberTracks(TrackInfo::kVideoTrack);
+ if (numVideos) {
+ // We currently only handle the first video track.
+ mVideoTracks.mDemuxer =
+ mInputDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ MOZ_ASSERT(mVideoTracks.mDemuxer);
+ }
+
+ uint32_t numAudios = mInputDemuxer->GetNumberTracks(TrackInfo::kAudioTrack);
+ if (numAudios) {
+ // We currently only handle the first audio track.
+ mAudioTracks.mDemuxer =
+ mInputDemuxer->GetTrackDemuxer(TrackInfo::kAudioTrack, 0);
+ MOZ_ASSERT(mAudioTracks.mDemuxer);
+ }
+
+ if (mPendingInputBuffer) {
+ // We had a partial media segment header stashed aside.
+ // Reparse its content so we can continue parsing the current input buffer.
+ int64_t start, end;
+ mParser->ParseStartAndEndTimestamps(mPendingInputBuffer, start, end);
+ mProcessedInput += mPendingInputBuffer->Length();
+ }
+
+ SegmentParserLoop();
+}
+
+void
+TrackBuffersManager::AppendDataToCurrentInputBuffer(MediaByteBuffer* aData)
+{
+ MOZ_ASSERT(mCurrentInputBuffer);
+ mCurrentInputBuffer->AppendData(aData);
+ mInputDemuxer->NotifyDataArrived();
+}
+
+void
+TrackBuffersManager::InitializationSegmentReceived()
+{
+ MOZ_ASSERT(mParser->HasCompleteInitData());
+
+ int64_t endInit = mParser->InitSegmentRange().mEnd;
+ if (mInputBuffer->Length() > mProcessedInput ||
+ int64_t(mProcessedInput - mInputBuffer->Length()) > endInit) {
+ // Something is not quite right with the data appended. Refuse it.
+ RejectAppend(MediaResult(NS_ERROR_FAILURE,
+ "Invalid state following initialization segment"),
+ __func__);
+ return;
+ }
+
+ mCurrentInputBuffer = new SourceBufferResource(mType);
+ // The demuxer isn't initialized yet ; we don't want to notify it
+ // that data has been appended yet ; so we simply append the init segment
+ // to the resource.
+ mCurrentInputBuffer->AppendData(mParser->InitData());
+ uint32_t length = endInit - (mProcessedInput - mInputBuffer->Length());
+ if (mInputBuffer->Length() == length) {
+ mInputBuffer = nullptr;
+ } else {
+ MOZ_RELEASE_ASSERT(length <= mInputBuffer->Length());
+ mInputBuffer->RemoveElementsAt(0, length);
+ }
+ CreateDemuxerforMIMEType();
+ if (!mInputDemuxer) {
+ NS_WARNING("TODO type not supported");
+ RejectAppend(NS_ERROR_DOM_NOT_SUPPORTED_ERR, __func__);
+ return;
+ }
+ mDemuxerInitRequest.Begin(mInputDemuxer->Init()
+ ->Then(GetTaskQueue(), __func__,
+ this,
+ &TrackBuffersManager::OnDemuxerInitDone,
+ &TrackBuffersManager::OnDemuxerInitFailed));
+}
+
+void
+TrackBuffersManager::OnDemuxerInitDone(nsresult)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(mInputDemuxer, "mInputDemuxer has been destroyed");
+
+ mDemuxerInitRequest.Complete();
+
+ MediaInfo info;
+
+ uint32_t numVideos = mInputDemuxer->GetNumberTracks(TrackInfo::kVideoTrack);
+ if (numVideos) {
+ // We currently only handle the first video track.
+ mVideoTracks.mDemuxer =
+ mInputDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
+ MOZ_ASSERT(mVideoTracks.mDemuxer);
+ info.mVideo = *mVideoTracks.mDemuxer->GetInfo()->GetAsVideoInfo();
+ info.mVideo.mTrackId = 2;
+ }
+
+ uint32_t numAudios = mInputDemuxer->GetNumberTracks(TrackInfo::kAudioTrack);
+ if (numAudios) {
+ // We currently only handle the first audio track.
+ mAudioTracks.mDemuxer =
+ mInputDemuxer->GetTrackDemuxer(TrackInfo::kAudioTrack, 0);
+ MOZ_ASSERT(mAudioTracks.mDemuxer);
+ info.mAudio = *mAudioTracks.mDemuxer->GetInfo()->GetAsAudioInfo();
+ info.mAudio.mTrackId = 1;
+ }
+
+ int64_t videoDuration = numVideos ? info.mVideo.mDuration : 0;
+ int64_t audioDuration = numAudios ? info.mAudio.mDuration : 0;
+
+ int64_t duration = std::max(videoDuration, audioDuration);
+ // 1. Update the duration attribute if it currently equals NaN.
+ // Those steps are performed by the MediaSourceDecoder::SetInitialDuration
+ AbstractThread::MainThread()->Dispatch(NewRunnableMethod<int64_t>
+ (mParentDecoder,
+ &MediaSourceDecoder::SetInitialDuration,
+ duration ? duration : -1));
+
+ // 2. If the initialization segment has no audio, video, or text tracks, then
+ // run the append error algorithm with the decode error parameter set to true
+ // and abort these steps.
+ if (!numVideos && !numAudios) {
+ RejectAppend(NS_ERROR_FAILURE, __func__);
+ return;
+ }
+
+ // 3. If the first initialization segment received flag is true, then run the following steps:
+ if (mFirstInitializationSegmentReceived) {
+ if (numVideos != mVideoTracks.mNumTracks ||
+ numAudios != mAudioTracks.mNumTracks ||
+ (numVideos && info.mVideo.mMimeType != mVideoTracks.mInfo->mMimeType) ||
+ (numAudios && info.mAudio.mMimeType != mAudioTracks.mInfo->mMimeType)) {
+ RejectAppend(NS_ERROR_FAILURE, __func__);
+ return;
+ }
+ // 1. If more than one track for a single type are present (ie 2 audio tracks),
+ // then the Track IDs match the ones in the first initialization segment.
+ // TODO
+ // 2. Add the appropriate track descriptions from this initialization
+ // segment to each of the track buffers.
+ // TODO
+ // 3. Set the need random access point flag on all track buffers to true.
+ mVideoTracks.mNeedRandomAccessPoint = true;
+ mAudioTracks.mNeedRandomAccessPoint = true;
+ }
+
+ // 4. Let active track flag equal false.
+ bool activeTrack = false;
+
+ // Increase our stream id.
+ uint32_t streamID = sStreamSourceID++;
+
+ // 5. If the first initialization segment received flag is false, then run the following steps:
+ if (!mFirstInitializationSegmentReceived) {
+ mAudioTracks.mNumTracks = numAudios;
+ // TODO:
+ // 1. If the initialization segment contains tracks with codecs the user agent
+ // does not support, then run the append error algorithm with the decode
+ // error parameter set to true and abort these steps.
+
+ // 2. For each audio track in the initialization segment, run following steps:
+ // for (uint32_t i = 0; i < numAudios; i++) {
+ if (numAudios) {
+ // 1. Let audio byte stream track ID be the Track ID for the current track being processed.
+ // 2. Let audio language be a BCP 47 language tag for the language specified in the initialization segment for this track or an empty string if no language info is present.
+ // 3. If audio language equals an empty string or the 'und' BCP 47 value, then run the default track language algorithm with byteStreamTrackID set to audio byte stream track ID and type set to "audio" and assign the value returned by the algorithm to audio language.
+ // 4. Let audio label be a label specified in the initialization segment for this track or an empty string if no label info is present.
+ // 5. If audio label equals an empty string, then run the default track label algorithm with byteStreamTrackID set to audio byte stream track ID and type set to "audio" and assign the value returned by the algorithm to audio label.
+ // 6. Let audio kinds be an array of kind strings specified in the initialization segment for this track or an empty array if no kind information is provided.
+ // 7. If audio kinds equals an empty array, then run the default track kinds algorithm with byteStreamTrackID set to audio byte stream track ID and type set to "audio" and assign the value returned by the algorithm to audio kinds.
+ // 8. For each value in audio kinds, run the following steps:
+ // 1. Let current audio kind equal the value from audio kinds for this iteration of the loop.
+ // 2. Let new audio track be a new AudioTrack object.
+ // 3. Generate a unique ID and assign it to the id property on new audio track.
+ // 4. Assign audio language to the language property on new audio track.
+ // 5. Assign audio label to the label property on new audio track.
+ // 6. Assign current audio kind to the kind property on new audio track.
+ // 7. If audioTracks.length equals 0, then run the following steps:
+ // 1. Set the enabled property on new audio track to true.
+ // 2. Set active track flag to true.
+ activeTrack = true;
+ // 8. Add new audio track to the audioTracks attribute on this SourceBuffer object.
+ // 9. Queue a task to fire a trusted event named addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the AudioTrackList object referenced by the audioTracks attribute on this SourceBuffer object.
+ // 10. Add new audio track to the audioTracks attribute on the HTMLMediaElement.
+ // 11. Queue a task to fire a trusted event named addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the AudioTrackList object referenced by the audioTracks attribute on the HTMLMediaElement.
+ mAudioTracks.mBuffers.AppendElement(TrackBuffer());
+ // 10. Add the track description for this track to the track buffer.
+ mAudioTracks.mInfo = new SharedTrackInfo(info.mAudio, streamID);
+ mAudioTracks.mLastInfo = mAudioTracks.mInfo;
+ }
+
+ mVideoTracks.mNumTracks = numVideos;
+ // 3. For each video track in the initialization segment, run following steps:
+ // for (uint32_t i = 0; i < numVideos; i++) {
+ if (numVideos) {
+ // 1. Let video byte stream track ID be the Track ID for the current track being processed.
+ // 2. Let video language be a BCP 47 language tag for the language specified in the initialization segment for this track or an empty string if no language info is present.
+ // 3. If video language equals an empty string or the 'und' BCP 47 value, then run the default track language algorithm with byteStreamTrackID set to video byte stream track ID and type set to "video" and assign the value returned by the algorithm to video language.
+ // 4. Let video label be a label specified in the initialization segment for this track or an empty string if no label info is present.
+ // 5. If video label equals an empty string, then run the default track label algorithm with byteStreamTrackID set to video byte stream track ID and type set to "video" and assign the value returned by the algorithm to video label.
+ // 6. Let video kinds be an array of kind strings specified in the initialization segment for this track or an empty array if no kind information is provided.
+ // 7. If video kinds equals an empty array, then run the default track kinds algorithm with byteStreamTrackID set to video byte stream track ID and type set to "video" and assign the value returned by the algorithm to video kinds.
+ // 8. For each value in video kinds, run the following steps:
+ // 1. Let current video kind equal the value from video kinds for this iteration of the loop.
+ // 2. Let new video track be a new VideoTrack object.
+ // 3. Generate a unique ID and assign it to the id property on new video track.
+ // 4. Assign video language to the language property on new video track.
+ // 5. Assign video label to the label property on new video track.
+ // 6. Assign current video kind to the kind property on new video track.
+ // 7. If videoTracks.length equals 0, then run the following steps:
+ // 1. Set the selected property on new video track to true.
+ // 2. Set active track flag to true.
+ activeTrack = true;
+ // 8. Add new video track to the videoTracks attribute on this SourceBuffer object.
+ // 9. Queue a task to fire a trusted event named addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the VideoTrackList object referenced by the videoTracks attribute on this SourceBuffer object.
+ // 10. Add new video track to the videoTracks attribute on the HTMLMediaElement.
+ // 11. Queue a task to fire a trusted event named addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent interface, at the VideoTrackList object referenced by the videoTracks attribute on the HTMLMediaElement.
+ mVideoTracks.mBuffers.AppendElement(TrackBuffer());
+ // 10. Add the track description for this track to the track buffer.
+ mVideoTracks.mInfo = new SharedTrackInfo(info.mVideo, streamID);
+ mVideoTracks.mLastInfo = mVideoTracks.mInfo;
+ }
+ // 4. For each text track in the initialization segment, run following steps:
+ // 5. If active track flag equals true, then run the following steps:
+ // This is handled by SourceBuffer once the promise is resolved.
+ if (activeTrack) {
+ mActiveTrack = true;
+ }
+
+ // 6. Set first initialization segment received flag to true.
+ mFirstInitializationSegmentReceived = true;
+ } else {
+ mAudioTracks.mLastInfo = new SharedTrackInfo(info.mAudio, streamID);
+ mVideoTracks.mLastInfo = new SharedTrackInfo(info.mVideo, streamID);
+ }
+
+ UniquePtr<EncryptionInfo> crypto = mInputDemuxer->GetCrypto();
+ if (crypto && crypto->IsEncrypted()) {
+ // Try and dispatch 'encrypted'. Won't go if ready state still HAVE_NOTHING.
+ for (uint32_t i = 0; i < crypto->mInitDatas.Length(); i++) {
+ NS_DispatchToMainThread(
+ new DispatchKeyNeededEvent(mParentDecoder, crypto->mInitDatas[i].mInitData,
+ crypto->mInitDatas[i].mType));
+ }
+ info.mCrypto = *crypto;
+ // We clear our crypto init data array, so the MediaFormatReader will
+ // not emit an encrypted event for the same init data again.
+ info.mCrypto.mInitDatas.Clear();
+ }
+
+ {
+ MonitorAutoLock mon(mMonitor);
+ mInfo = info;
+ }
+
+ // We now have a valid init data ; we can store it for later use.
+ mInitData = mParser->InitData();
+
+ // 3. Remove the initialization segment bytes from the beginning of the input buffer.
+ // This step has already been done in InitializationSegmentReceived when we
+ // transferred the content into mCurrentInputBuffer.
+ mCurrentInputBuffer->EvictAll();
+ mInputDemuxer->NotifyDataRemoved();
+ RecreateParser(true);
+
+ // 4. Set append state to WAITING_FOR_SEGMENT.
+ SetAppendState(AppendState::WAITING_FOR_SEGMENT);
+ // 5. Jump to the loop top step above.
+ ScheduleSegmentParserLoop();
+}
+
+void
+TrackBuffersManager::OnDemuxerInitFailed(const MediaResult& aError)
+{
+ MOZ_ASSERT(aError != NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA);
+ mDemuxerInitRequest.Complete();
+
+ RejectAppend(aError, __func__);
+}
+
+RefPtr<TrackBuffersManager::CodedFrameProcessingPromise>
+TrackBuffersManager::CodedFrameProcessing()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MOZ_ASSERT(mProcessingPromise.IsEmpty());
+
+ MediaByteRange mediaRange = mParser->MediaSegmentRange();
+ if (mediaRange.IsEmpty()) {
+ AppendDataToCurrentInputBuffer(mInputBuffer);
+ mInputBuffer = nullptr;
+ } else {
+ MOZ_ASSERT(mProcessedInput >= mInputBuffer->Length());
+ if (int64_t(mProcessedInput - mInputBuffer->Length()) > mediaRange.mEnd) {
+ // Something is not quite right with the data appended. Refuse it.
+ // This would typically happen if the previous media segment was partial
+ // yet a new complete media segment was added.
+ return CodedFrameProcessingPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
+ }
+ // The mediaRange is offset by the init segment position previously added.
+ uint32_t length =
+ mediaRange.mEnd - (mProcessedInput - mInputBuffer->Length());
+ if (!length) {
+ // We've completed our earlier media segment and no new data is to be
+ // processed. This happens with some containers that can't detect that a
+ // media segment is ending until a new one starts.
+ RefPtr<CodedFrameProcessingPromise> p = mProcessingPromise.Ensure(__func__);
+ CompleteCodedFrameProcessing();
+ return p;
+ }
+ RefPtr<MediaByteBuffer> segment = new MediaByteBuffer;
+ if (!segment->AppendElements(mInputBuffer->Elements(), length, fallible)) {
+ return CodedFrameProcessingPromise::CreateAndReject(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ AppendDataToCurrentInputBuffer(segment);
+ mInputBuffer->RemoveElementsAt(0, length);
+ }
+
+ RefPtr<CodedFrameProcessingPromise> p = mProcessingPromise.Ensure(__func__);
+
+ DoDemuxVideo();
+
+ return p;
+}
+
+void
+TrackBuffersManager::OnDemuxFailed(TrackType aTrack,
+ const MediaResult& aError)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MSE_DEBUG("Failed to demux %s, failure:%u",
+ aTrack == TrackType::kVideoTrack ? "video" : "audio", aError.Code());
+ switch (aError.Code()) {
+ case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
+ case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
+ if (aTrack == TrackType::kVideoTrack) {
+ DoDemuxAudio();
+ } else {
+ CompleteCodedFrameProcessing();
+ }
+ break;
+ default:
+ RejectProcessing(aError, __func__);
+ break;
+ }
+}
+
+void
+TrackBuffersManager::DoDemuxVideo()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (!HasVideo()) {
+ DoDemuxAudio();
+ return;
+ }
+ mVideoTracks.mDemuxRequest.Begin(mVideoTracks.mDemuxer->GetSamples(-1)
+ ->Then(GetTaskQueue(), __func__, this,
+ &TrackBuffersManager::OnVideoDemuxCompleted,
+ &TrackBuffersManager::OnVideoDemuxFailed));
+}
+
+void
+TrackBuffersManager::OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MSE_DEBUG("%d video samples demuxed", aSamples->mSamples.Length());
+ mVideoTracks.mDemuxRequest.Complete();
+ mVideoTracks.mQueuedSamples.AppendElements(aSamples->mSamples);
+ DoDemuxAudio();
+}
+
+void
+TrackBuffersManager::DoDemuxAudio()
+{
+ MOZ_ASSERT(OnTaskQueue());
+ if (!HasAudio()) {
+ CompleteCodedFrameProcessing();
+ return;
+ }
+ mAudioTracks.mDemuxRequest.Begin(mAudioTracks.mDemuxer->GetSamples(-1)
+ ->Then(GetTaskQueue(), __func__, this,
+ &TrackBuffersManager::OnAudioDemuxCompleted,
+ &TrackBuffersManager::OnAudioDemuxFailed));
+}
+
+void
+TrackBuffersManager::OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ MSE_DEBUG("%d audio samples demuxed", aSamples->mSamples.Length());
+ mAudioTracks.mDemuxRequest.Complete();
+ mAudioTracks.mQueuedSamples.AppendElements(aSamples->mSamples);
+ CompleteCodedFrameProcessing();
+}
+
+void
+TrackBuffersManager::CompleteCodedFrameProcessing()
+{
+ MOZ_ASSERT(OnTaskQueue());
+
+ // 1. For each coded frame in the media segment run the following steps:
+ // Coded Frame Processing steps 1.1 to 1.21.
+
+ if (mSourceBufferAttributes->GetAppendMode() == SourceBufferAppendMode::Sequence &&
+ mVideoTracks.mQueuedSamples.Length() && mAudioTracks.mQueuedSamples.Length()) {
+ // When we are in sequence mode, the order in which we process the frames is
+ // important as it determines the future value of timestampOffset.
+ // So we process the earliest sample first. See bug 1293576.
+ TimeInterval videoInterval =
+ PresentationInterval(mVideoTracks.mQueuedSamples);
+ TimeInterval audioInterval =
+ PresentationInterval(mAudioTracks.mQueuedSamples);
+ if (audioInterval.mStart < videoInterval.mStart) {
+ ProcessFrames(mAudioTracks.mQueuedSamples, mAudioTracks);
+ ProcessFrames(mVideoTracks.mQueuedSamples, mVideoTracks);
+ } else {
+ ProcessFrames(mVideoTracks.mQueuedSamples, mVideoTracks);
+ ProcessFrames(mAudioTracks.mQueuedSamples, mAudioTracks);
+ }
+ } else {
+ ProcessFrames(mVideoTracks.mQueuedSamples, mVideoTracks);
+ ProcessFrames(mAudioTracks.mQueuedSamples, mAudioTracks);
+ }
+
+#if defined(DEBUG)
+ if (HasVideo()) {
+ const auto& track = mVideoTracks.GetTrackBuffer();
+ MOZ_ASSERT(track.IsEmpty() || track[0]->mKeyframe);
+ for (uint32_t i = 1; i < track.Length(); i++) {
+ MOZ_ASSERT((track[i-1]->mTrackInfo->GetID() == track[i]->mTrackInfo->GetID() && track[i-1]->mTimecode <= track[i]->mTimecode) ||
+ track[i]->mKeyframe);
+ }
+ }
+ if (HasAudio()) {
+ const auto& track = mAudioTracks.GetTrackBuffer();
+ MOZ_ASSERT(track.IsEmpty() || track[0]->mKeyframe);
+ for (uint32_t i = 1; i < track.Length(); i++) {
+ MOZ_ASSERT((track[i-1]->mTrackInfo->GetID() == track[i]->mTrackInfo->GetID() && track[i-1]->mTimecode <= track[i]->mTimecode) ||
+ track[i]->mKeyframe);
+ }
+ }
+#endif
+
+ mVideoTracks.mQueuedSamples.Clear();
+ mAudioTracks.mQueuedSamples.Clear();
+
+ UpdateBufferedRanges();
+
+ // Update our reported total size.
+ mSizeSourceBuffer = mVideoTracks.mSizeBuffer + mAudioTracks.mSizeBuffer;
+
+ // Return to step 6.4 of Segment Parser Loop algorithm
+ // 4. If this SourceBuffer is full and cannot accept more media data, then set the buffer full flag to true.
+ if (mSizeSourceBuffer >= EvictionThreshold()) {
+ mBufferFull = true;
+ }
+
+ // 5. If the input buffer does not contain a complete media segment, then jump to the need more data step below.
+ if (mParser->MediaSegmentRange().IsEmpty()) {
+ ResolveProcessing(true, __func__);
+ return;
+ }
+
+ mLastParsedEndTime = Some(std::max(mAudioTracks.mLastParsedEndTime,
+ mVideoTracks.mLastParsedEndTime));
+
+ // 6. Remove the media segment bytes from the beginning of the input buffer.
+ // Clear our demuxer from any already processed data.
+ int64_t safeToEvict = std::min(
+ HasVideo()
+ ? mVideoTracks.mDemuxer->GetEvictionOffset(mVideoTracks.mLastParsedEndTime)
+ : INT64_MAX,
+ HasAudio()
+ ? mAudioTracks.mDemuxer->GetEvictionOffset(mAudioTracks.mLastParsedEndTime)
+ : INT64_MAX);
+ ErrorResult rv;
+ mCurrentInputBuffer->EvictBefore(safeToEvict, rv);
+ if (rv.Failed()) {
+ rv.SuppressException();
+ RejectProcessing(NS_ERROR_OUT_OF_MEMORY, __func__);
+ return;
+ }
+
+ mInputDemuxer->NotifyDataRemoved();
+ RecreateParser(true);
+
+ // 7. Set append state to WAITING_FOR_SEGMENT.
+ SetAppendState(AppendState::WAITING_FOR_SEGMENT);
+
+ // 8. Jump to the loop top step above.
+ ResolveProcessing(false, __func__);
+}
+
+void
+TrackBuffersManager::RejectProcessing(const MediaResult& aRejectValue, const char* aName)
+{
+ mProcessingPromise.RejectIfExists(aRejectValue, __func__);
+}
+
+void
+TrackBuffersManager::ResolveProcessing(bool aResolveValue, const char* aName)
+{
+ mProcessingPromise.ResolveIfExists(aResolveValue, __func__);
+}
+
+void
+TrackBuffersManager::CheckSequenceDiscontinuity(const TimeUnit& aPresentationTime)
+{
+ if (mSourceBufferAttributes->GetAppendMode() == SourceBufferAppendMode::Sequence &&
+ mSourceBufferAttributes->HaveGroupStartTimestamp()) {
+ mSourceBufferAttributes->SetTimestampOffset(
+ mSourceBufferAttributes->GetGroupStartTimestamp() - aPresentationTime);
+ mSourceBufferAttributes->SetGroupEndTimestamp(
+ mSourceBufferAttributes->GetGroupStartTimestamp());
+ mVideoTracks.mNeedRandomAccessPoint = true;
+ mAudioTracks.mNeedRandomAccessPoint = true;
+ mSourceBufferAttributes->ResetGroupStartTimestamp();
+ }
+}
+
+TimeInterval
+TrackBuffersManager::PresentationInterval(const TrackBuffer& aSamples) const
+{
+ TimeInterval presentationInterval =
+ TimeInterval(TimeUnit::FromMicroseconds(aSamples[0]->mTime),
+ TimeUnit::FromMicroseconds(aSamples[0]->GetEndTime()));
+
+ for (uint32_t i = 1; i < aSamples.Length(); i++) {
+ auto& sample = aSamples[i];
+ presentationInterval = presentationInterval.Span(
+ TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
+ TimeUnit::FromMicroseconds(sample->GetEndTime())));
+ }
+ return presentationInterval;
+}
+
+void
+TrackBuffersManager::ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData)
+{
+ if (!aSamples.Length()) {
+ return;
+ }
+
+ // 1. If generate timestamps flag equals true
+ // Let presentation timestamp equal 0.
+ // Otherwise
+ // Let presentation timestamp be a double precision floating point representation of the coded frame's presentation timestamp in seconds.
+ TimeUnit presentationTimestamp = mSourceBufferAttributes->mGenerateTimestamps
+ ? TimeUnit() : TimeUnit::FromMicroseconds(aSamples[0]->mTime);
+
+ // 3. If mode equals "sequence" and group start timestamp is set, then run the following steps:
+ CheckSequenceDiscontinuity(presentationTimestamp);
+
+ // 5. Let track buffer equal the track buffer that the coded frame will be added to.
+ auto& trackBuffer = aTrackData;
+
+ // Some videos do not exactly start at 0, but instead a small negative value.
+ // To avoid evicting the starting frame of those videos, we allow a leeway
+ // of +- mLongestFrameDuration on the append window start.
+ // We only apply the leeway with the default append window start of 0
+ // otherwise do as per spec.
+ TimeInterval targetWindow = mAppendWindow.mStart != TimeUnit::FromSeconds(0)
+ ? mAppendWindow
+ : TimeInterval(mAppendWindow.mStart, mAppendWindow.mEnd,
+ trackBuffer.mLastFrameDuration.isSome()
+ ? trackBuffer.mLongestFrameDuration
+ : TimeUnit::FromMicroseconds(aSamples[0]->mDuration));
+
+ TimeIntervals samplesRange;
+ uint32_t sizeNewSamples = 0;
+ TrackBuffer samples; // array that will contain the frames to be added
+ // to our track buffer.
+
+ // We assume that no frames are contiguous within a media segment and as such
+ // don't need to check for discontinuity except for the first frame and should
+ // a frame be ignored due to the target window.
+ bool needDiscontinuityCheck = true;
+
+ // Highest presentation time seen in samples block.
+ TimeUnit highestSampleTime;
+
+ if (aSamples.Length()) {
+ aTrackData.mLastParsedEndTime = TimeUnit();
+ }
+
+ for (auto& sample : aSamples) {
+ SAMPLE_DEBUG("Processing %s frame(pts:%lld end:%lld, dts:%lld, duration:%lld, "
+ "kf:%d)",
+ aTrackData.mInfo->mMimeType.get(),
+ sample->mTime,
+ sample->GetEndTime(),
+ sample->mTimecode,
+ sample->mDuration,
+ sample->mKeyframe);
+
+ const TimeUnit sampleEndTime =
+ TimeUnit::FromMicroseconds(sample->GetEndTime());
+ if (sampleEndTime > aTrackData.mLastParsedEndTime) {
+ aTrackData.mLastParsedEndTime = sampleEndTime;
+ }
+
+ // We perform step 10 right away as we can't do anything should a keyframe
+ // be needed until we have one.
+
+ // 10. If the need random access point flag on track buffer equals true, then run the following steps:
+ if (trackBuffer.mNeedRandomAccessPoint) {
+ // 1. If the coded frame is not a random access point, then drop the coded frame and jump to the top of the loop to start processing the next coded frame.
+ if (!sample->mKeyframe) {
+ continue;
+ }
+ // 2. Set the need random access point flag on track buffer to false.
+ trackBuffer.mNeedRandomAccessPoint = false;
+ }
+
+ // We perform step 1,2 and 4 at once:
+ // 1. If generate timestamps flag equals true:
+ // Let presentation timestamp equal 0.
+ // Let decode timestamp equal 0.
+ // Otherwise:
+ // Let presentation timestamp be a double precision floating point representation of the coded frame's presentation timestamp in seconds.
+ // Let decode timestamp be a double precision floating point representation of the coded frame's decode timestamp in seconds.
+
+ // 2. Let frame duration be a double precision floating point representation of the coded frame's duration in seconds.
+ // Step 3 is performed earlier or when a discontinuity has been detected.
+ // 4. If timestampOffset is not 0, then run the following steps:
+
+ TimeUnit sampleTime = TimeUnit::FromMicroseconds(sample->mTime);
+ TimeUnit sampleTimecode = TimeUnit::FromMicroseconds(sample->mTimecode);
+ TimeUnit sampleDuration = TimeUnit::FromMicroseconds(sample->mDuration);
+ TimeUnit timestampOffset = mSourceBufferAttributes->GetTimestampOffset();
+
+ TimeInterval sampleInterval =
+ mSourceBufferAttributes->mGenerateTimestamps
+ ? TimeInterval(timestampOffset, timestampOffset + sampleDuration)
+ : TimeInterval(timestampOffset + sampleTime,
+ timestampOffset + sampleTime + sampleDuration);
+ TimeUnit decodeTimestamp =
+ mSourceBufferAttributes->mGenerateTimestamps
+ ? timestampOffset
+ : timestampOffset + sampleTimecode;
+
+ // 6. If last decode timestamp for track buffer is set and decode timestamp is less than last decode timestamp:
+ // OR
+ // If last decode timestamp for track buffer is set and the difference between decode timestamp and last decode timestamp is greater than 2 times last frame duration:
+
+ if (needDiscontinuityCheck && trackBuffer.mLastDecodeTimestamp.isSome() &&
+ (decodeTimestamp < trackBuffer.mLastDecodeTimestamp.ref() ||
+ (decodeTimestamp - trackBuffer.mLastDecodeTimestamp.ref()
+ > 2 * trackBuffer.mLongestFrameDuration))) {
+ MSE_DEBUG("Discontinuity detected.");
+ SourceBufferAppendMode appendMode = mSourceBufferAttributes->GetAppendMode();
+
+ // 1a. If mode equals "segments":
+ if (appendMode == SourceBufferAppendMode::Segments) {
+ // Set group end timestamp to presentation timestamp.
+ mSourceBufferAttributes->SetGroupEndTimestamp(sampleInterval.mStart);
+ }
+ // 1b. If mode equals "sequence":
+ if (appendMode == SourceBufferAppendMode::Sequence) {
+ // Set group start timestamp equal to the group end timestamp.
+ mSourceBufferAttributes->SetGroupStartTimestamp(
+ mSourceBufferAttributes->GetGroupEndTimestamp());
+ }
+ for (auto& track : GetTracksList()) {
+ // 2. Unset the last decode timestamp on all track buffers.
+ // 3. Unset the last frame duration on all track buffers.
+ // 4. Unset the highest end timestamp on all track buffers.
+ // 5. Set the need random access point flag on all track buffers to true.
+ track->ResetAppendState();
+ }
+ // 6. Jump to the Loop Top step above to restart processing of the current coded frame.
+ // Rather that restarting the process for the frame, we run the first
+ // steps again instead.
+ // 3. If mode equals "sequence" and group start timestamp is set, then run the following steps:
+ TimeUnit presentationTimestamp = mSourceBufferAttributes->mGenerateTimestamps
+ ? TimeUnit() : sampleTime;
+ CheckSequenceDiscontinuity(presentationTimestamp);
+
+ if (!sample->mKeyframe) {
+ continue;
+ }
+ if (appendMode == SourceBufferAppendMode::Sequence) {
+ // mSourceBufferAttributes->GetTimestampOffset() was modified during CheckSequenceDiscontinuity.
+ // We need to update our variables.
+ timestampOffset = mSourceBufferAttributes->GetTimestampOffset();
+ sampleInterval =
+ mSourceBufferAttributes->mGenerateTimestamps
+ ? TimeInterval(timestampOffset, timestampOffset + sampleDuration)
+ : TimeInterval(timestampOffset + sampleTime,
+ timestampOffset + sampleTime + sampleDuration);
+ decodeTimestamp =
+ mSourceBufferAttributes->mGenerateTimestamps
+ ? timestampOffset
+ : timestampOffset + sampleTimecode;
+ }
+ trackBuffer.mNeedRandomAccessPoint = false;
+ needDiscontinuityCheck = false;
+ }
+
+ // 7. Let frame end timestamp equal the sum of presentation timestamp and frame duration.
+ // This is sampleInterval.mEnd
+
+ // 8. If presentation timestamp is less than appendWindowStart, then set the need random access point flag to true, drop the coded frame, and jump to the top of the loop to start processing the next coded frame.
+ // 9. If frame end timestamp is greater than appendWindowEnd, then set the need random access point flag to true, drop the coded frame, and jump to the top of the loop to start processing the next coded frame.
+ if (!targetWindow.ContainsWithStrictEnd(sampleInterval)) {
+ if (samples.Length()) {
+ // We are creating a discontinuity in the samples.
+ // Insert the samples processed so far.
+ InsertFrames(samples, samplesRange, trackBuffer);
+ samples.Clear();
+ samplesRange = TimeIntervals();
+ trackBuffer.mSizeBuffer += sizeNewSamples;
+ sizeNewSamples = 0;
+ UpdateHighestTimestamp(trackBuffer, highestSampleTime);
+ }
+ trackBuffer.mNeedRandomAccessPoint = true;
+ needDiscontinuityCheck = true;
+ continue;
+ }
+
+ samplesRange += sampleInterval;
+ sizeNewSamples += sample->ComputedSizeOfIncludingThis();
+ sample->mTime = sampleInterval.mStart.ToMicroseconds();
+ sample->mTimecode = decodeTimestamp.ToMicroseconds();
+ sample->mTrackInfo = trackBuffer.mLastInfo;
+ samples.AppendElement(sample);
+
+ // Steps 11,12,13,14, 15 and 16 will be done in one block in InsertFrames.
+
+ trackBuffer.mLongestFrameDuration =
+ trackBuffer.mLastFrameDuration.isSome()
+ ? sample->mKeyframe
+ ? sampleDuration
+ : std::max(sampleDuration, trackBuffer.mLongestFrameDuration)
+ : sampleDuration;
+
+ // 17. Set last decode timestamp for track buffer to decode timestamp.
+ trackBuffer.mLastDecodeTimestamp = Some(decodeTimestamp);
+ // 18. Set last frame duration for track buffer to frame duration.
+ trackBuffer.mLastFrameDuration = Some(sampleDuration);
+
+ // 19. If highest end timestamp for track buffer is unset or frame end timestamp is greater than highest end timestamp, then set highest end timestamp for track buffer to frame end timestamp.
+ if (trackBuffer.mHighestEndTimestamp.isNothing() ||
+ sampleInterval.mEnd > trackBuffer.mHighestEndTimestamp.ref()) {
+ trackBuffer.mHighestEndTimestamp = Some(sampleInterval.mEnd);
+ }
+ if (sampleInterval.mStart > highestSampleTime) {
+ highestSampleTime = sampleInterval.mStart;
+ }
+ // 20. If frame end timestamp is greater than group end timestamp, then set group end timestamp equal to frame end timestamp.
+ if (sampleInterval.mEnd > mSourceBufferAttributes->GetGroupEndTimestamp()) {
+ mSourceBufferAttributes->SetGroupEndTimestamp(sampleInterval.mEnd);
+ }
+ // 21. If generate timestamps flag equals true, then set timestampOffset equal to frame end timestamp.
+ if (mSourceBufferAttributes->mGenerateTimestamps) {
+ mSourceBufferAttributes->SetTimestampOffset(sampleInterval.mEnd);
+ }
+ }
+
+ if (samples.Length()) {
+ InsertFrames(samples, samplesRange, trackBuffer);
+ trackBuffer.mSizeBuffer += sizeNewSamples;
+ UpdateHighestTimestamp(trackBuffer, highestSampleTime);
+ }
+}
+
+bool
+TrackBuffersManager::CheckNextInsertionIndex(TrackData& aTrackData,
+ const TimeUnit& aSampleTime)
+{
+ if (aTrackData.mNextInsertionIndex.isSome()) {
+ return true;
+ }
+
+ const TrackBuffer& data = aTrackData.GetTrackBuffer();
+
+ if (data.IsEmpty() || aSampleTime < aTrackData.mBufferedRanges.GetStart()) {
+ aTrackData.mNextInsertionIndex = Some(0u);
+ return true;
+ }
+
+ // Find which discontinuity we should insert the frame before.
+ TimeInterval target;
+ for (const auto& interval : aTrackData.mBufferedRanges) {
+ if (aSampleTime < interval.mStart) {
+ target = interval;
+ break;
+ }
+ }
+ if (target.IsEmpty()) {
+ // No target found, it will be added at the end of the track buffer.
+ aTrackData.mNextInsertionIndex = Some(uint32_t(data.Length()));
+ return true;
+ }
+ // We now need to find the first frame of the searched interval.
+ // We will insert our new frames right before.
+ for (uint32_t i = 0; i < data.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = data[i];
+ if (sample->mTime >= target.mStart.ToMicroseconds() ||
+ sample->GetEndTime() > target.mStart.ToMicroseconds()) {
+ aTrackData.mNextInsertionIndex = Some(i);
+ return true;
+ }
+ }
+ NS_ASSERTION(false, "Insertion Index Not Found");
+ return false;
+}
+
+void
+TrackBuffersManager::InsertFrames(TrackBuffer& aSamples,
+ const TimeIntervals& aIntervals,
+ TrackData& aTrackData)
+{
+ // 5. Let track buffer equal the track buffer that the coded frame will be added to.
+ auto& trackBuffer = aTrackData;
+
+ MSE_DEBUGV("Processing %d %s frames(start:%lld end:%lld)",
+ aSamples.Length(),
+ aTrackData.mInfo->mMimeType.get(),
+ aIntervals.GetStart().ToMicroseconds(),
+ aIntervals.GetEnd().ToMicroseconds());
+
+ // TODO: Handle splicing of audio (and text) frames.
+ // 11. Let spliced audio frame be an unset variable for holding audio splice information
+ // 12. Let spliced timed text frame be an unset variable for holding timed text splice information
+
+ // 13. If last decode timestamp for track buffer is unset and presentation timestamp falls within the presentation interval of a coded frame in track buffer,then run the following steps:
+ // For now we only handle replacing existing frames with the new ones. So we
+ // skip this step.
+
+ // 14. Remove existing coded frames in track buffer:
+ // a) If highest end timestamp for track buffer is not set:
+ // Remove all coded frames from track buffer that have a presentation timestamp greater than or equal to presentation timestamp and less than frame end timestamp.
+ // b) If highest end timestamp for track buffer is set and less than or equal to presentation timestamp:
+ // Remove all coded frames from track buffer that have a presentation timestamp greater than or equal to highest end timestamp and less than frame end timestamp
+
+ // There is an ambiguity on how to remove frames, which was lodged with:
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28710, implementing as per
+ // bug description.
+
+ // 15. Remove decoding dependencies of the coded frames removed in the previous step:
+ // Remove all coded frames between the coded frames removed in the previous step and the next random access point after those removed frames.
+
+ TimeIntervals intersection = trackBuffer.mBufferedRanges;
+ intersection.Intersection(aIntervals);
+
+ if (intersection.Length()) {
+ if (aSamples[0]->mKeyframe &&
+ (mType.LowerCaseEqualsLiteral("video/webm") ||
+ mType.LowerCaseEqualsLiteral("audio/webm"))) {
+ // We are starting a new GOP, we do not have to worry about breaking an
+ // existing current coded frame group. Reset the next insertion index
+ // so the search for when to start our frames removal can be exhaustive.
+ // This is a workaround for bug 1276184 and only until either bug 1277733
+ // or bug 1209386 is fixed.
+ // With the webm container, we can't always properly determine the
+ // duration of the last frame, which may cause the last frame of a cluster
+ // to overlap the following frame.
+ trackBuffer.mNextInsertionIndex.reset();
+ }
+ uint32_t index =
+ RemoveFrames(aIntervals, trackBuffer, trackBuffer.mNextInsertionIndex.refOr(0));
+ if (index) {
+ trackBuffer.mNextInsertionIndex = Some(index);
+ }
+ }
+
+ // 16. Add the coded frame with the presentation timestamp, decode timestamp, and frame duration to the track buffer.
+ if (!CheckNextInsertionIndex(aTrackData,
+ TimeUnit::FromMicroseconds(aSamples[0]->mTime))) {
+ RejectProcessing(NS_ERROR_FAILURE, __func__);
+ return;
+ }
+
+ // Adjust our demuxing index if necessary.
+ if (trackBuffer.mNextGetSampleIndex.isSome()) {
+ if (trackBuffer.mNextInsertionIndex.ref() == trackBuffer.mNextGetSampleIndex.ref() &&
+ aIntervals.GetEnd() >= trackBuffer.mNextSampleTime) {
+ MSE_DEBUG("Next sample to be played got overwritten");
+ trackBuffer.mNextGetSampleIndex.reset();
+ ResetEvictionIndex(trackBuffer);
+ } else if (trackBuffer.mNextInsertionIndex.ref() <= trackBuffer.mNextGetSampleIndex.ref()) {
+ trackBuffer.mNextGetSampleIndex.ref() += aSamples.Length();
+ // We could adjust the eviction index so that the new data gets added to
+ // the evictable amount (as it is prior currentTime). However, considering
+ // new data is being added prior the current playback, it's likely that
+ // this data will be played next, and as such we probably don't want to
+ // have it evicted too early. So instead reset the eviction index instead.
+ ResetEvictionIndex(trackBuffer);
+ }
+ }
+
+ TrackBuffer& data = trackBuffer.GetTrackBuffer();
+ data.InsertElementsAt(trackBuffer.mNextInsertionIndex.ref(), aSamples);
+ trackBuffer.mNextInsertionIndex.ref() += aSamples.Length();
+
+ // Update our buffered range with new sample interval.
+ trackBuffer.mBufferedRanges += aIntervals;
+ // We allow a fuzz factor in our interval of half a frame length,
+ // as fuzz is +/- value, giving an effective leeway of a full frame
+ // length.
+ if (aIntervals.Length()) {
+ TimeIntervals range(aIntervals);
+ range.SetFuzz(trackBuffer.mLongestFrameDuration / 2);
+ trackBuffer.mSanitizedBufferedRanges += range;
+ }
+}
+
+void
+TrackBuffersManager::UpdateHighestTimestamp(TrackData& aTrackData,
+ const media::TimeUnit& aHighestTime)
+{
+ if (aHighestTime > aTrackData.mHighestStartTimestamp) {
+ MonitorAutoLock mon(mMonitor);
+ aTrackData.mHighestStartTimestamp = aHighestTime;
+ }
+}
+
+uint32_t
+TrackBuffersManager::RemoveFrames(const TimeIntervals& aIntervals,
+ TrackData& aTrackData,
+ uint32_t aStartIndex)
+{
+ TrackBuffer& data = aTrackData.GetTrackBuffer();
+ Maybe<uint32_t> firstRemovedIndex;
+ uint32_t lastRemovedIndex = 0;
+
+ // We loop from aStartIndex to avoid removing frames that we inserted earlier
+ // and part of the current coded frame group. This is allows to handle step
+ // 14 of the coded frame processing algorithm without having to check the value
+ // of highest end timestamp:
+ // "Remove existing coded frames in track buffer:
+ // If highest end timestamp for track buffer is not set:
+ // Remove all coded frames from track buffer that have a presentation timestamp greater than or equal to presentation timestamp and less than frame end timestamp.
+ // If highest end timestamp for track buffer is set and less than or equal to presentation timestamp:
+ // Remove all coded frames from track buffer that have a presentation timestamp greater than or equal to highest end timestamp and less than frame end timestamp"
+ TimeUnit intervalsEnd = aIntervals.GetEnd();
+ bool mayBreakLoop = false;
+ for (uint32_t i = aStartIndex; i < data.Length(); i++) {
+ const RefPtr<MediaRawData> sample = data[i];
+ TimeInterval sampleInterval =
+ TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
+ TimeUnit::FromMicroseconds(sample->GetEndTime()));
+ if (aIntervals.Contains(sampleInterval)) {
+ if (firstRemovedIndex.isNothing()) {
+ firstRemovedIndex = Some(i);
+ }
+ lastRemovedIndex = i;
+ mayBreakLoop = false;
+ continue;
+ }
+ if (sample->mKeyframe && mayBreakLoop) {
+ break;
+ }
+ if (sampleInterval.mStart > intervalsEnd) {
+ mayBreakLoop = true;
+ }
+ }
+
+ if (firstRemovedIndex.isNothing()) {
+ return 0;
+ }
+
+ // Remove decoding dependencies of the coded frames removed in the previous step:
+ // Remove all coded frames between the coded frames removed in the previous step and the next random access point after those removed frames.
+ for (uint32_t i = lastRemovedIndex + 1; i < data.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = data[i];
+ if (sample->mKeyframe) {
+ break;
+ }
+ lastRemovedIndex = i;
+ }
+
+ int64_t maxSampleDuration = 0;
+ uint32_t sizeRemoved = 0;
+ TimeIntervals removedIntervals;
+ for (uint32_t i = firstRemovedIndex.ref(); i <= lastRemovedIndex; i++) {
+ const RefPtr<MediaRawData> sample = data[i];
+ TimeInterval sampleInterval =
+ TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
+ TimeUnit::FromMicroseconds(sample->GetEndTime()));
+ removedIntervals += sampleInterval;
+ if (sample->mDuration > maxSampleDuration) {
+ maxSampleDuration = sample->mDuration;
+ }
+ sizeRemoved += sample->ComputedSizeOfIncludingThis();
+ }
+ aTrackData.mSizeBuffer -= sizeRemoved;
+
+ MSE_DEBUG("Removing frames from:%u (frames:%u) ([%f, %f))",
+ firstRemovedIndex.ref(),
+ lastRemovedIndex - firstRemovedIndex.ref() + 1,
+ removedIntervals.GetStart().ToSeconds(),
+ removedIntervals.GetEnd().ToSeconds());
+
+ if (aTrackData.mNextGetSampleIndex.isSome()) {
+ if (aTrackData.mNextGetSampleIndex.ref() >= firstRemovedIndex.ref() &&
+ aTrackData.mNextGetSampleIndex.ref() <= lastRemovedIndex) {
+ MSE_DEBUG("Next sample to be played got evicted");
+ aTrackData.mNextGetSampleIndex.reset();
+ ResetEvictionIndex(aTrackData);
+ } else if (aTrackData.mNextGetSampleIndex.ref() > lastRemovedIndex) {
+ uint32_t samplesRemoved = lastRemovedIndex - firstRemovedIndex.ref() + 1;
+ aTrackData.mNextGetSampleIndex.ref() -= samplesRemoved;
+ if (aTrackData.mEvictionIndex.mLastIndex > lastRemovedIndex) {
+ MOZ_DIAGNOSTIC_ASSERT(
+ aTrackData.mEvictionIndex.mLastIndex >= samplesRemoved &&
+ aTrackData.mEvictionIndex.mEvictable >= sizeRemoved,
+ "Invalid eviction index");
+ MonitorAutoLock mon(mMonitor);
+ aTrackData.mEvictionIndex.mLastIndex -= samplesRemoved;
+ aTrackData.mEvictionIndex.mEvictable -= sizeRemoved;
+ } else {
+ ResetEvictionIndex(aTrackData);
+ }
+ }
+ }
+
+ if (aTrackData.mNextInsertionIndex.isSome()) {
+ if (aTrackData.mNextInsertionIndex.ref() > firstRemovedIndex.ref() &&
+ aTrackData.mNextInsertionIndex.ref() <= lastRemovedIndex + 1) {
+ aTrackData.ResetAppendState();
+ MSE_DEBUG("NextInsertionIndex got reset.");
+ } else if (aTrackData.mNextInsertionIndex.ref() > lastRemovedIndex + 1) {
+ aTrackData.mNextInsertionIndex.ref() -=
+ lastRemovedIndex - firstRemovedIndex.ref() + 1;
+ }
+ }
+
+ // Update our buffered range to exclude the range just removed.
+ aTrackData.mBufferedRanges -= removedIntervals;
+
+ // Recalculate sanitized buffered ranges.
+ aTrackData.mSanitizedBufferedRanges = aTrackData.mBufferedRanges;
+ aTrackData.mSanitizedBufferedRanges.SetFuzz(TimeUnit::FromMicroseconds(maxSampleDuration/2));
+
+ data.RemoveElementsAt(firstRemovedIndex.ref(),
+ lastRemovedIndex - firstRemovedIndex.ref() + 1);
+
+ if (aIntervals.GetEnd() >= aTrackData.mHighestStartTimestamp) {
+ // The sample with the highest presentation time got removed.
+ // Rescan the trackbuffer to determine the new one.
+ int64_t highestStartTime = 0;
+ for (const auto& sample : data) {
+ if (sample->mTime > highestStartTime) {
+ highestStartTime = sample->mTime;
+ }
+ }
+ MonitorAutoLock mon(mMonitor);
+ aTrackData.mHighestStartTimestamp =
+ TimeUnit::FromMicroseconds(highestStartTime);
+ }
+
+ return firstRemovedIndex.ref();
+}
+
+void
+TrackBuffersManager::RecreateParser(bool aReuseInitData)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ // Recreate our parser for only the data remaining. This is required
+ // as it has parsed the entire InputBuffer provided.
+ // Once the old TrackBuffer/MediaSource implementation is removed
+ // we can optimize this part. TODO
+ mParser = ContainerParser::CreateForMIMEType(mType);
+ if (aReuseInitData && mInitData) {
+ int64_t start, end;
+ mParser->ParseStartAndEndTimestamps(mInitData, start, end);
+ mProcessedInput = mInitData->Length();
+ } else {
+ mProcessedInput = 0;
+ }
+}
+
+nsTArray<TrackBuffersManager::TrackData*>
+TrackBuffersManager::GetTracksList()
+{
+ nsTArray<TrackData*> tracks;
+ if (HasVideo()) {
+ tracks.AppendElement(&mVideoTracks);
+ }
+ if (HasAudio()) {
+ tracks.AppendElement(&mAudioTracks);
+ }
+ return tracks;
+}
+
+nsTArray<const TrackBuffersManager::TrackData*>
+TrackBuffersManager::GetTracksList() const
+{
+ nsTArray<const TrackData*> tracks;
+ if (HasVideo()) {
+ tracks.AppendElement(&mVideoTracks);
+ }
+ if (HasAudio()) {
+ tracks.AppendElement(&mAudioTracks);
+ }
+ return tracks;
+}
+
+void
+TrackBuffersManager::SetAppendState(SourceBufferAttributes::AppendState aAppendState)
+{
+ MSE_DEBUG("AppendState changed from %s to %s",
+ AppendStateToStr(mSourceBufferAttributes->GetAppendState()), AppendStateToStr(aAppendState));
+ mSourceBufferAttributes->SetAppendState(aAppendState);
+}
+
+MediaInfo
+TrackBuffersManager::GetMetadata() const
+{
+ MonitorAutoLock mon(mMonitor);
+ return mInfo;
+}
+
+const TimeIntervals&
+TrackBuffersManager::Buffered(TrackInfo::TrackType aTrack) const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return GetTracksData(aTrack).mBufferedRanges;
+}
+
+const media::TimeUnit&
+TrackBuffersManager::HighestStartTime(TrackInfo::TrackType aTrack) const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return GetTracksData(aTrack).mHighestStartTimestamp;
+}
+
+TimeIntervals
+TrackBuffersManager::SafeBuffered(TrackInfo::TrackType aTrack) const
+{
+ MonitorAutoLock mon(mMonitor);
+ return aTrack == TrackInfo::kVideoTrack
+ ? mVideoBufferedRanges
+ : mAudioBufferedRanges;
+}
+
+TimeUnit
+TrackBuffersManager::HighestStartTime() const
+{
+ MonitorAutoLock mon(mMonitor);
+ TimeUnit highestStartTime;
+ for (auto& track : GetTracksList()) {
+ highestStartTime =
+ std::max(track->mHighestStartTimestamp, highestStartTime);
+ }
+ return highestStartTime;
+}
+
+TimeUnit
+TrackBuffersManager::HighestEndTime() const
+{
+ MonitorAutoLock mon(mMonitor);
+
+ nsTArray<const TimeIntervals*> tracks;
+ if (HasVideo()) {
+ tracks.AppendElement(&mVideoBufferedRanges);
+ }
+ if (HasAudio()) {
+ tracks.AppendElement(&mAudioBufferedRanges);
+ }
+ return HighestEndTime(tracks);
+}
+
+TimeUnit
+TrackBuffersManager::HighestEndTime(
+ nsTArray<const TimeIntervals*>& aTracks) const
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ TimeUnit highestEndTime;
+
+ for (const auto& trackRanges : aTracks) {
+ highestEndTime = std::max(trackRanges->GetEnd(), highestEndTime);
+ }
+ return highestEndTime;
+}
+
+void
+TrackBuffersManager::ResetEvictionIndex(TrackData& aTrackData)
+{
+ MonitorAutoLock mon(mMonitor);
+ aTrackData.mEvictionIndex.Reset();
+}
+
+void
+TrackBuffersManager::UpdateEvictionIndex(TrackData& aTrackData,
+ uint32_t currentIndex)
+{
+ uint32_t evictable = 0;
+ TrackBuffer& data = aTrackData.GetTrackBuffer();
+ MOZ_DIAGNOSTIC_ASSERT(currentIndex >= aTrackData.mEvictionIndex.mLastIndex,
+ "Invalid call");
+ MOZ_DIAGNOSTIC_ASSERT(currentIndex == data.Length() ||
+ data[currentIndex]->mKeyframe,"Must stop at keyframe");
+
+ for (uint32_t i = aTrackData.mEvictionIndex.mLastIndex; i < currentIndex;
+ i++) {
+ evictable += data[i]->ComputedSizeOfIncludingThis();
+ }
+ aTrackData.mEvictionIndex.mLastIndex = currentIndex;
+ MonitorAutoLock mon(mMonitor);
+ aTrackData.mEvictionIndex.mEvictable += evictable;
+}
+
+const TrackBuffersManager::TrackBuffer&
+TrackBuffersManager::GetTrackBuffer(TrackInfo::TrackType aTrack) const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ return GetTracksData(aTrack).GetTrackBuffer();
+}
+
+uint32_t TrackBuffersManager::FindSampleIndex(const TrackBuffer& aTrackBuffer,
+ const TimeInterval& aInterval)
+{
+ TimeUnit target = aInterval.mStart - aInterval.mFuzz;
+
+ for (uint32_t i = 0; i < aTrackBuffer.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = aTrackBuffer[i];
+ if (sample->mTime >= target.ToMicroseconds() ||
+ sample->GetEndTime() > target.ToMicroseconds()) {
+ return i;
+ }
+ }
+ NS_ASSERTION(false, "FindSampleIndex called with invalid arguments");
+
+ return 0;
+}
+
+TimeUnit
+TrackBuffersManager::Seek(TrackInfo::TrackType aTrack,
+ const TimeUnit& aTime,
+ const TimeUnit& aFuzz)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& trackBuffer = GetTracksData(aTrack);
+ const TrackBuffersManager::TrackBuffer& track = GetTrackBuffer(aTrack);
+
+ if (!track.Length()) {
+ // This a reset. It will be followed by another valid seek.
+ trackBuffer.mNextGetSampleIndex = Some(uint32_t(0));
+ trackBuffer.mNextSampleTimecode = TimeUnit();
+ trackBuffer.mNextSampleTime = TimeUnit();
+ ResetEvictionIndex(trackBuffer);
+ return TimeUnit();
+ }
+
+ uint32_t i = 0;
+
+ if (aTime != TimeUnit()) {
+ // Determine the interval of samples we're attempting to seek to.
+ TimeIntervals buffered = trackBuffer.mBufferedRanges;
+ // Fuzz factor is +/- aFuzz; as we want to only eliminate gaps
+ // that are less than aFuzz wide, we set a fuzz factor aFuzz/2.
+ buffered.SetFuzz(aFuzz / 2);
+ TimeIntervals::IndexType index = buffered.Find(aTime);
+ MOZ_ASSERT(index != TimeIntervals::NoIndex,
+ "We shouldn't be called if aTime isn't buffered");
+ TimeInterval target = buffered[index];
+ target.mFuzz = aFuzz;
+ i = FindSampleIndex(track, target);
+ }
+
+ Maybe<TimeUnit> lastKeyFrameTime;
+ TimeUnit lastKeyFrameTimecode;
+ uint32_t lastKeyFrameIndex = 0;
+ for (; i < track.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = track[i];
+ TimeUnit sampleTime = TimeUnit::FromMicroseconds(sample->mTime);
+ if (sampleTime > aTime && lastKeyFrameTime.isSome()) {
+ break;
+ }
+ if (sample->mKeyframe) {
+ lastKeyFrameTimecode = TimeUnit::FromMicroseconds(sample->mTimecode);
+ lastKeyFrameTime = Some(sampleTime);
+ lastKeyFrameIndex = i;
+ }
+ if (sampleTime == aTime ||
+ (sampleTime > aTime && lastKeyFrameTime.isSome())) {
+ break;
+ }
+ }
+ MSE_DEBUG("Keyframe %s found at %lld @ %u",
+ lastKeyFrameTime.isSome() ? "" : "not",
+ lastKeyFrameTime.refOr(TimeUnit()).ToMicroseconds(),
+ lastKeyFrameIndex);
+
+ trackBuffer.mNextGetSampleIndex = Some(lastKeyFrameIndex);
+ trackBuffer.mNextSampleTimecode = lastKeyFrameTimecode;
+ trackBuffer.mNextSampleTime = lastKeyFrameTime.refOr(TimeUnit());
+ ResetEvictionIndex(trackBuffer);
+ UpdateEvictionIndex(trackBuffer, lastKeyFrameIndex);
+
+ return lastKeyFrameTime.refOr(TimeUnit());
+}
+
+uint32_t
+TrackBuffersManager::SkipToNextRandomAccessPoint(TrackInfo::TrackType aTrack,
+ const TimeUnit& aTimeThreadshold,
+ const media::TimeUnit& aFuzz,
+ bool& aFound)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ uint32_t parsed = 0;
+ auto& trackData = GetTracksData(aTrack);
+ const TrackBuffer& track = GetTrackBuffer(aTrack);
+ aFound = false;
+
+ // SkipToNextRandomAccessPoint can only be called if aTimeThreadshold is known
+ // to be buffered.
+
+ // So first determine the current position in the track buffer if necessary.
+ if (trackData.mNextGetSampleIndex.isNothing()) {
+ if (trackData.mNextSampleTimecode == TimeUnit()) {
+ // First demux, get first sample.
+ trackData.mNextGetSampleIndex = Some(0u);
+ } else {
+ int32_t pos = FindCurrentPosition(aTrack, aFuzz);
+ if (pos < 0) {
+ return 0;
+ }
+ trackData.mNextGetSampleIndex = Some(uint32_t(pos));
+ }
+ }
+
+ TimeUnit nextSampleTimecode = trackData.mNextSampleTimecode;
+ TimeUnit nextSampleTime = trackData.mNextSampleTime;
+ uint32_t i = trackData.mNextGetSampleIndex.ref();
+ int32_t originalPos = i;
+
+ for (; i < track.Length(); i++) {
+ const MediaRawData* sample =
+ GetSample(aTrack,
+ i,
+ nextSampleTimecode,
+ nextSampleTime,
+ aFuzz);
+ if (!sample) {
+ break;
+ }
+ if (sample->mKeyframe &&
+ sample->mTime >= aTimeThreadshold.ToMicroseconds()) {
+ aFound = true;
+ break;
+ }
+ nextSampleTimecode =
+ TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
+ nextSampleTime = TimeUnit::FromMicroseconds(sample->GetEndTime());
+ parsed++;
+ }
+
+ // Adjust the next demux time and index so that the next call to
+ // SkipToNextRandomAccessPoint will not count again the parsed sample as
+ // skipped.
+ if (aFound) {
+ trackData.mNextSampleTimecode =
+ TimeUnit::FromMicroseconds(track[i]->mTimecode);
+ trackData.mNextSampleTime =
+ TimeUnit::FromMicroseconds(track[i]->mTime);
+ trackData.mNextGetSampleIndex = Some(i);
+ } else if (i > 0) {
+ // Go back to the previous keyframe or the original position so the next
+ // demux can succeed and be decoded.
+ for (int j = i - 1; j >= originalPos; j--) {
+ const RefPtr<MediaRawData>& sample = track[j];
+ if (sample->mKeyframe) {
+ trackData.mNextSampleTimecode =
+ TimeUnit::FromMicroseconds(sample->mTimecode);
+ trackData.mNextSampleTime = TimeUnit::FromMicroseconds(sample->mTime);
+ trackData.mNextGetSampleIndex = Some(uint32_t(j));
+ // We are unable to skip to a keyframe past aTimeThreshold, however
+ // we are speeding up decoding by dropping the unplayable frames.
+ // So we can mark aFound as true.
+ aFound = true;
+ break;
+ }
+ parsed--;
+ }
+ }
+
+ if (aFound) {
+ UpdateEvictionIndex(trackData, trackData.mNextGetSampleIndex.ref());
+ }
+
+ return parsed;
+}
+
+const MediaRawData*
+TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
+ uint32_t aIndex,
+ const TimeUnit& aExpectedDts,
+ const TimeUnit& aExpectedPts,
+ const TimeUnit& aFuzz)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ const TrackBuffer& track = GetTrackBuffer(aTrack);
+
+ if (aIndex >= track.Length()) {
+ // reached the end.
+ return nullptr;
+ }
+
+ const RefPtr<MediaRawData>& sample = track[aIndex];
+ if (!aIndex || sample->mTimecode <= (aExpectedDts + aFuzz).ToMicroseconds() ||
+ sample->mTime <= (aExpectedPts + aFuzz).ToMicroseconds()) {
+ return sample;
+ }
+
+ // Gap is too big. End of Stream or Waiting for Data.
+ // TODO, check that we have continuous data based on the sanitized buffered
+ // range instead.
+ return nullptr;
+}
+
+already_AddRefed<MediaRawData>
+TrackBuffersManager::GetSample(TrackInfo::TrackType aTrack,
+ const TimeUnit& aFuzz,
+ MediaResult& aResult)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& trackData = GetTracksData(aTrack);
+ const TrackBuffer& track = GetTrackBuffer(aTrack);
+
+ aResult = NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA;
+
+ if (!track.Length()) {
+ aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
+ return nullptr;
+ }
+
+ if (trackData.mNextGetSampleIndex.isNothing() &&
+ trackData.mNextSampleTimecode == TimeUnit()) {
+ // First demux, get first sample.
+ trackData.mNextGetSampleIndex = Some(0u);
+ }
+
+ if (trackData.mNextGetSampleIndex.isSome()) {
+ if (trackData.mNextGetSampleIndex.ref() >= track.Length()) {
+ aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
+ return nullptr;
+ }
+ const MediaRawData* sample =
+ GetSample(aTrack,
+ trackData.mNextGetSampleIndex.ref(),
+ trackData.mNextSampleTimecode,
+ trackData.mNextSampleTime,
+ aFuzz);
+ if (!sample) {
+ return nullptr;
+ }
+
+ RefPtr<MediaRawData> p = sample->Clone();
+ if (!p) {
+ aResult = MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ return nullptr;
+ }
+ if (p->mKeyframe) {
+ UpdateEvictionIndex(trackData, trackData.mNextGetSampleIndex.ref());
+ }
+ trackData.mNextGetSampleIndex.ref()++;
+ // Estimate decode timestamp and timestamp of the next sample.
+ TimeUnit nextSampleTimecode =
+ TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
+ TimeUnit nextSampleTime =
+ TimeUnit::FromMicroseconds(sample->GetEndTime());
+ const MediaRawData* nextSample =
+ GetSample(aTrack,
+ trackData.mNextGetSampleIndex.ref(),
+ nextSampleTimecode,
+ nextSampleTime,
+ aFuzz);
+ if (nextSample) {
+ // We have a valid next sample, can use exact values.
+ trackData.mNextSampleTimecode =
+ TimeUnit::FromMicroseconds(nextSample->mTimecode);
+ trackData.mNextSampleTime =
+ TimeUnit::FromMicroseconds(nextSample->mTime);
+ } else {
+ // Next sample isn't available yet. Use estimates.
+ trackData.mNextSampleTimecode = nextSampleTimecode;
+ trackData.mNextSampleTime = nextSampleTime;
+ }
+ aResult = NS_OK;
+ return p.forget();
+ }
+
+ if (trackData.mNextSampleTimecode.ToMicroseconds() >
+ track.LastElement()->mTimecode + track.LastElement()->mDuration) {
+ // The next element is past our last sample. We're done.
+ trackData.mNextGetSampleIndex = Some(uint32_t(track.Length()));
+ aResult = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
+ return nullptr;
+ }
+
+ // Our previous index has been overwritten, attempt to find the new one.
+ int32_t pos = FindCurrentPosition(aTrack, aFuzz);
+ if (pos < 0) {
+ MSE_DEBUG("Couldn't find sample (pts:%lld dts:%lld)",
+ trackData.mNextSampleTime.ToMicroseconds(),
+ trackData.mNextSampleTimecode.ToMicroseconds());
+ return nullptr;
+ }
+
+ const RefPtr<MediaRawData>& sample = track[pos];
+ RefPtr<MediaRawData> p = sample->Clone();
+ if (!p) {
+ // OOM
+ aResult = MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ return nullptr;
+ }
+
+ // Find the previous keyframe to calculate the evictable amount.
+ int32_t i = pos;
+ for (; !track[i]->mKeyframe; i--) {
+ }
+ UpdateEvictionIndex(trackData, i);
+
+ trackData.mNextGetSampleIndex = Some(uint32_t(pos)+1);
+ trackData.mNextSampleTimecode =
+ TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
+ trackData.mNextSampleTime =
+ TimeUnit::FromMicroseconds(sample->GetEndTime());
+ aResult = NS_OK;
+ return p.forget();
+}
+
+int32_t
+TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack,
+ const TimeUnit& aFuzz) const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& trackData = GetTracksData(aTrack);
+ const TrackBuffer& track = GetTrackBuffer(aTrack);
+
+ // Perform an exact search first.
+ for (uint32_t i = 0; i < track.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = track[i];
+ TimeInterval sampleInterval{
+ TimeUnit::FromMicroseconds(sample->mTimecode),
+ TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration)};
+
+ if (sampleInterval.ContainsStrict(trackData.mNextSampleTimecode)) {
+ return i;
+ }
+ if (sampleInterval.mStart > trackData.mNextSampleTimecode) {
+ // Samples are ordered by timecode. There's no need to search
+ // any further.
+ break;
+ }
+ }
+
+ for (uint32_t i = 0; i < track.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = track[i];
+ TimeInterval sampleInterval{
+ TimeUnit::FromMicroseconds(sample->mTimecode),
+ TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration),
+ aFuzz};
+
+ if (sampleInterval.ContainsWithStrictEnd(trackData.mNextSampleTimecode)) {
+ return i;
+ }
+ if (sampleInterval.mStart - aFuzz > trackData.mNextSampleTimecode) {
+ // Samples are ordered by timecode. There's no need to search
+ // any further.
+ break;
+ }
+ }
+
+ // We couldn't find our sample by decode timestamp. Attempt to find it using
+ // presentation timestamp. There will likely be small jerkiness.
+ for (uint32_t i = 0; i < track.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = track[i];
+ TimeInterval sampleInterval{
+ TimeUnit::FromMicroseconds(sample->mTime),
+ TimeUnit::FromMicroseconds(sample->GetEndTime()),
+ aFuzz};
+
+ if (sampleInterval.ContainsWithStrictEnd(trackData.mNextSampleTimecode)) {
+ return i;
+ }
+ }
+
+ // Still not found.
+ return -1;
+}
+
+uint32_t
+TrackBuffersManager::Evictable(TrackInfo::TrackType aTrack) const
+{
+ MonitorAutoLock mon(mMonitor);
+ return GetTracksData(aTrack).mEvictionIndex.mEvictable;
+}
+
+TimeUnit
+TrackBuffersManager::GetNextRandomAccessPoint(TrackInfo::TrackType aTrack,
+ const TimeUnit& aFuzz)
+{
+ MOZ_ASSERT(OnTaskQueue());
+ auto& trackData = GetTracksData(aTrack);
+ MOZ_ASSERT(trackData.mNextGetSampleIndex.isSome());
+ const TrackBuffersManager::TrackBuffer& track = GetTrackBuffer(aTrack);
+
+ uint32_t i = trackData.mNextGetSampleIndex.ref();
+ TimeUnit nextSampleTimecode = trackData.mNextSampleTimecode;
+ TimeUnit nextSampleTime = trackData.mNextSampleTime;
+
+ for (; i < track.Length(); i++) {
+ const MediaRawData* sample =
+ GetSample(aTrack, i, nextSampleTimecode, nextSampleTime, aFuzz);
+ if (!sample) {
+ break;
+ }
+ if (sample->mKeyframe) {
+ return TimeUnit::FromMicroseconds(sample->mTime);
+ }
+ nextSampleTimecode =
+ TimeUnit::FromMicroseconds(sample->mTimecode + sample->mDuration);
+ nextSampleTime = TimeUnit::FromMicroseconds(sample->GetEndTime());
+ }
+ return TimeUnit::FromInfinity();
+}
+
+void
+TrackBuffersManager::TrackData::AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes) const
+{
+ for (const TrackBuffer& buffer : mBuffers) {
+ for (const MediaRawData* data : buffer) {
+ aSizes->mByteSize += data->SizeOfIncludingThis(aSizes->mMallocSizeOf);
+ }
+ }
+}
+
+void
+TrackBuffersManager::AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes) const
+{
+ MOZ_ASSERT(OnTaskQueue());
+ mVideoTracks.AddSizeOfResources(aSizes);
+ mAudioTracks.AddSizeOfResources(aSizes);
+}
+
+} // namespace mozilla
+#undef MSE_DEBUG
+#undef MSE_DEBUGV
+#undef SAMPLE_DEBUG
diff --git a/dom/media/mediasource/TrackBuffersManager.h b/dom/media/mediasource/TrackBuffersManager.h
new file mode 100644
index 000000000..de6b115f5
--- /dev/null
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -0,0 +1,500 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_TRACKBUFFERSMANAGER_H_
+#define MOZILLA_TRACKBUFFERSMANAGER_H_
+
+#include "mozilla/Atomics.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/Monitor.h"
+#include "AutoTaskQueue.h"
+#include "mozilla/dom/SourceBufferBinding.h"
+
+#include "MediaData.h"
+#include "MediaDataDemuxer.h"
+#include "MediaResult.h"
+#include "MediaSourceDecoder.h"
+#include "SourceBufferTask.h"
+#include "TimeUnits.h"
+#include "nsAutoPtr.h"
+#include "nsProxyRelease.h"
+#include "nsString.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+class ContainerParser;
+class MediaByteBuffer;
+class MediaRawData;
+class MediaSourceDemuxer;
+class SourceBufferResource;
+
+class SourceBufferTaskQueue
+{
+public:
+ SourceBufferTaskQueue()
+ : mMonitor("SourceBufferTaskQueue")
+ {}
+ ~SourceBufferTaskQueue()
+ {
+ MOZ_ASSERT(mQueue.IsEmpty(), "All tasks must have been processed");
+ }
+
+ void Push(SourceBufferTask* aTask)
+ {
+ MonitorAutoLock mon(mMonitor);
+ mQueue.AppendElement(aTask);
+ }
+
+ already_AddRefed<SourceBufferTask> Pop()
+ {
+ MonitorAutoLock mon(mMonitor);
+ if (!mQueue.Length()) {
+ return nullptr;
+ }
+ RefPtr<SourceBufferTask> task = Move(mQueue[0]);
+ mQueue.RemoveElementAt(0);
+ return task.forget();
+ }
+
+ nsTArray<SourceBufferTask>::size_type Length() const
+ {
+ MonitorAutoLock mon(mMonitor);
+ return mQueue.Length();
+ }
+
+private:
+ mutable Monitor mMonitor;
+ nsTArray<RefPtr<SourceBufferTask>> mQueue;
+};
+
+class TrackBuffersManager
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TrackBuffersManager);
+
+ enum class EvictDataResult : int8_t
+ {
+ NO_DATA_EVICTED,
+ CANT_EVICT,
+ BUFFER_FULL,
+ };
+
+ typedef TrackInfo::TrackType TrackType;
+ typedef MediaData::Type MediaType;
+ typedef nsTArray<RefPtr<MediaRawData>> TrackBuffer;
+ typedef SourceBufferTask::AppendPromise AppendPromise;
+ typedef SourceBufferTask::RangeRemovalPromise RangeRemovalPromise;
+
+ // Interface for SourceBuffer
+ TrackBuffersManager(MediaSourceDecoder* aParentDecoder,
+ const nsACString& aType);
+
+ // Queue a task to add data to the end of the input buffer and run the MSE
+ // Buffer Append Algorithm
+ // 3.5.5 Buffer Append Algorithm.
+ // http://w3c.github.io/media-source/index.html#sourcebuffer-buffer-append
+ RefPtr<AppendPromise> AppendData(MediaByteBuffer* aData,
+ const SourceBufferAttributes& aAttributes);
+
+ // Queue a task to abort any pending AppendData.
+ // Does nothing at this stage.
+ void AbortAppendData();
+
+ // Queue a task to run MSE Reset Parser State Algorithm.
+ // 3.5.2 Reset Parser State
+ void ResetParserState(SourceBufferAttributes& aAttributes);
+
+ // Queue a task to run the MSE range removal algorithm.
+ // http://w3c.github.io/media-source/#sourcebuffer-coded-frame-removal
+ RefPtr<RangeRemovalPromise> RangeRemoval(media::TimeUnit aStart,
+ media::TimeUnit aEnd);
+
+ // Schedule data eviction if necessary as the next call to AppendData will
+ // add aSize bytes.
+ // Eviction is done in two steps, first remove data up to aPlaybackTime
+ // and if still more space is needed remove from the end.
+ EvictDataResult EvictData(const media::TimeUnit& aPlaybackTime, int64_t aSize);
+
+ // Returns the buffered range currently managed.
+ // This may be called on any thread.
+ // Buffered must conform to http://w3c.github.io/media-source/index.html#widl-SourceBuffer-buffered
+ media::TimeIntervals Buffered() const;
+ media::TimeUnit HighestStartTime() const;
+ media::TimeUnit HighestEndTime() const;
+
+ // Return the size of the data managed by this SourceBufferContentManager.
+ int64_t GetSize() const;
+
+ // Indicate that the MediaSource parent object got into "ended" state.
+ void Ended();
+
+ // The parent SourceBuffer is about to be destroyed.
+ void Detach();
+
+ int64_t EvictionThreshold() const;
+
+ // Interface for MediaSourceDemuxer
+ MediaInfo GetMetadata() const;
+ const TrackBuffer& GetTrackBuffer(TrackInfo::TrackType aTrack) const;
+ const media::TimeIntervals& Buffered(TrackInfo::TrackType) const;
+ const media::TimeUnit& HighestStartTime(TrackInfo::TrackType) const;
+ media::TimeIntervals SafeBuffered(TrackInfo::TrackType) const;
+ bool IsEnded() const
+ {
+ return mEnded;
+ }
+ uint32_t Evictable(TrackInfo::TrackType aTrack) const;
+ media::TimeUnit Seek(TrackInfo::TrackType aTrack,
+ const media::TimeUnit& aTime,
+ const media::TimeUnit& aFuzz);
+ uint32_t SkipToNextRandomAccessPoint(TrackInfo::TrackType aTrack,
+ const media::TimeUnit& aTimeThreadshold,
+ const media::TimeUnit& aFuzz,
+ bool& aFound);
+
+ already_AddRefed<MediaRawData> GetSample(TrackInfo::TrackType aTrack,
+ const media::TimeUnit& aFuzz,
+ MediaResult& aResult);
+ int32_t FindCurrentPosition(TrackInfo::TrackType aTrack,
+ const media::TimeUnit& aFuzz) const;
+ media::TimeUnit GetNextRandomAccessPoint(TrackInfo::TrackType aTrack,
+ const media::TimeUnit& aFuzz);
+
+ void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes) const;
+
+private:
+ typedef MozPromise<bool, MediaResult, /* IsExclusive = */ true> CodedFrameProcessingPromise;
+
+ // for MediaSourceDemuxer::GetMozDebugReaderData
+ friend class MediaSourceDemuxer;
+ ~TrackBuffersManager();
+ // All following functions run on the taskqueue.
+ RefPtr<AppendPromise> DoAppendData(RefPtr<MediaByteBuffer> aData,
+ SourceBufferAttributes aAttributes);
+ void ScheduleSegmentParserLoop();
+ void SegmentParserLoop();
+ void InitializationSegmentReceived();
+ void ShutdownDemuxers();
+ void CreateDemuxerforMIMEType();
+ void ResetDemuxingState();
+ void NeedMoreData();
+ void RejectAppend(const MediaResult& aRejectValue, const char* aName);
+ // Will return a promise that will be resolved once all frames of the current
+ // media segment have been processed.
+ RefPtr<CodedFrameProcessingPromise> CodedFrameProcessing();
+ void CompleteCodedFrameProcessing();
+ // Called by ResetParserState.
+ void CompleteResetParserState();
+ RefPtr<RangeRemovalPromise>
+ CodedFrameRemovalWithPromise(media::TimeInterval aInterval);
+ bool CodedFrameRemoval(media::TimeInterval aInterval);
+ void SetAppendState(SourceBufferAttributes::AppendState aAppendState);
+
+ bool HasVideo() const
+ {
+ return mVideoTracks.mNumTracks > 0;
+ }
+ bool HasAudio() const
+ {
+ return mAudioTracks.mNumTracks > 0;
+ }
+
+ // The input buffer as per http://w3c.github.io/media-source/index.html#sourcebuffer-input-buffer
+ RefPtr<MediaByteBuffer> mInputBuffer;
+ // Buffer full flag as per https://w3c.github.io/media-source/#sourcebuffer-buffer-full-flag.
+ // Accessed on both the main thread and the task queue.
+ Atomic<bool> mBufferFull;
+ bool mFirstInitializationSegmentReceived;
+ // Set to true once a new segment is started.
+ bool mNewMediaSegmentStarted;
+ bool mActiveTrack;
+ nsCString mType;
+
+ // ContainerParser objects and methods.
+ // Those are used to parse the incoming input buffer.
+
+ // Recreate the ContainerParser and if aReuseInitData is true then
+ // feed it with the previous init segment found.
+ void RecreateParser(bool aReuseInitData);
+ nsAutoPtr<ContainerParser> mParser;
+
+ // Demuxer objects and methods.
+ void AppendDataToCurrentInputBuffer(MediaByteBuffer* aData);
+ RefPtr<MediaByteBuffer> mInitData;
+ // Temporary input buffer to handle partial media segment header.
+ // We store the current input buffer content into it should we need to
+ // reinitialize the demuxer once we have some samples and a discontinuity is
+ // detected.
+ RefPtr<MediaByteBuffer> mPendingInputBuffer;
+ RefPtr<SourceBufferResource> mCurrentInputBuffer;
+ RefPtr<MediaDataDemuxer> mInputDemuxer;
+ // Length already processed in current media segment.
+ uint64_t mProcessedInput;
+ Maybe<media::TimeUnit> mLastParsedEndTime;
+
+ void OnDemuxerInitDone(nsresult);
+ void OnDemuxerInitFailed(const MediaResult& aFailure);
+ void OnDemuxerResetDone(nsresult);
+ MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest;
+
+ void OnDemuxFailed(TrackType aTrack, const MediaResult& aError);
+ void DoDemuxVideo();
+ void OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
+ void OnVideoDemuxFailed(const MediaResult& aError)
+ {
+ mVideoTracks.mDemuxRequest.Complete();
+ OnDemuxFailed(TrackType::kVideoTrack, aError);
+ }
+ void DoDemuxAudio();
+ void OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
+ void OnAudioDemuxFailed(const MediaResult& aError)
+ {
+ mAudioTracks.mDemuxRequest.Complete();
+ OnDemuxFailed(TrackType::kAudioTrack, aError);
+ }
+
+ void DoEvictData(const media::TimeUnit& aPlaybackTime, int64_t aSizeToEvict);
+
+ struct TrackData
+ {
+ TrackData()
+ : mNumTracks(0)
+ , mNeedRandomAccessPoint(true)
+ , mSizeBuffer(0)
+ {}
+ uint32_t mNumTracks;
+ // Definition of variables:
+ // https://w3c.github.io/media-source/#track-buffers
+ // Last decode timestamp variable that stores the decode timestamp of the
+ // last coded frame appended in the current coded frame group.
+ // The variable is initially unset to indicate that no coded frames have
+ // been appended yet.
+ Maybe<media::TimeUnit> mLastDecodeTimestamp;
+ // Last frame duration variable that stores the coded frame duration of the
+ // last coded frame appended in the current coded frame group.
+ // The variable is initially unset to indicate that no coded frames have
+ // been appended yet.
+ Maybe<media::TimeUnit> mLastFrameDuration;
+ // Highest end timestamp variable that stores the highest coded frame end
+ // timestamp across all coded frames in the current coded frame group that
+ // were appended to this track buffer.
+ // The variable is initially unset to indicate that no coded frames have
+ // been appended yet.
+ Maybe<media::TimeUnit> mHighestEndTimestamp;
+ // Highest presentation timestamp in track buffer.
+ // Protected by global monitor, except when reading on the task queue as it
+ // is only written there.
+ media::TimeUnit mHighestStartTimestamp;
+ // Longest frame duration seen since last random access point.
+ // Only ever accessed when mLastDecodeTimestamp and mLastFrameDuration are
+ // set.
+ media::TimeUnit mLongestFrameDuration;
+ // Need random access point flag variable that keeps track of whether the
+ // track buffer is waiting for a random access point coded frame.
+ // The variable is initially set to true to indicate that random access
+ // point coded frame is needed before anything can be added to the track
+ // buffer.
+ bool mNeedRandomAccessPoint;
+ RefPtr<MediaTrackDemuxer> mDemuxer;
+ MozPromiseRequestHolder<MediaTrackDemuxer::SamplesPromise> mDemuxRequest;
+ // Highest end timestamp of the last media segment demuxed.
+ media::TimeUnit mLastParsedEndTime;
+
+ // If set, position where the next contiguous frame will be inserted.
+ // If a discontinuity is detected, it will be unset and recalculated upon
+ // the next insertion.
+ Maybe<uint32_t> mNextInsertionIndex;
+ // Samples just demuxed, but not yet parsed.
+ TrackBuffer mQueuedSamples;
+ const TrackBuffer& GetTrackBuffer() const
+ {
+ MOZ_RELEASE_ASSERT(mBuffers.Length(),
+ "TrackBuffer must have been created");
+ return mBuffers.LastElement();
+ }
+ TrackBuffer& GetTrackBuffer()
+ {
+ MOZ_RELEASE_ASSERT(mBuffers.Length(),
+ "TrackBuffer must have been created");
+ return mBuffers.LastElement();
+ }
+ // We only manage a single track of each type at this time.
+ nsTArray<TrackBuffer> mBuffers;
+ // Track buffer ranges variable that represents the presentation time ranges
+ // occupied by the coded frames currently stored in the track buffer.
+ media::TimeIntervals mBufferedRanges;
+ // Sanitized mBufferedRanges with a fuzz of half a sample's duration applied
+ // This buffered ranges is the basis of what is exposed to the JS.
+ media::TimeIntervals mSanitizedBufferedRanges;
+ // Byte size of all samples contained in this track buffer.
+ uint32_t mSizeBuffer;
+ // TrackInfo of the first metadata received.
+ RefPtr<SharedTrackInfo> mInfo;
+ // TrackInfo of the last metadata parsed (updated with each init segment.
+ RefPtr<SharedTrackInfo> mLastInfo;
+
+ // If set, position of the next sample to be retrieved by GetSample().
+ // If the position is equal to the TrackBuffer's length, it indicates that
+ // we've reached EOS.
+ Maybe<uint32_t> mNextGetSampleIndex;
+ // Approximation of the next sample's decode timestamp.
+ media::TimeUnit mNextSampleTimecode;
+ // Approximation of the next sample's presentation timestamp.
+ media::TimeUnit mNextSampleTime;
+
+ struct EvictionIndex
+ {
+ EvictionIndex() { Reset(); }
+ void Reset()
+ {
+ mEvictable = 0;
+ mLastIndex = 0;
+ }
+ uint32_t mEvictable;
+ uint32_t mLastIndex;
+ };
+ // Size of data that can be safely evicted during the next eviction
+ // cycle.
+ // We consider as evictable all frames up to the last keyframe prior to
+ // mNextGetSampleIndex. If mNextGetSampleIndex isn't set, then we assume
+ // that we can't yet evict data.
+ // Protected by global monitor, except when reading on the task queue as it
+ // is only written there.
+ EvictionIndex mEvictionIndex;
+
+ void ResetAppendState()
+ {
+ mLastDecodeTimestamp.reset();
+ mLastFrameDuration.reset();
+ mHighestEndTimestamp.reset();
+ mNeedRandomAccessPoint = true;
+
+ mNextInsertionIndex.reset();
+ }
+
+ void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes) const;
+ };
+
+ void CheckSequenceDiscontinuity(const media::TimeUnit& aPresentationTime);
+ void ProcessFrames(TrackBuffer& aSamples, TrackData& aTrackData);
+ media::TimeInterval PresentationInterval(const TrackBuffer& aSamples) const;
+ bool CheckNextInsertionIndex(TrackData& aTrackData,
+ const media::TimeUnit& aSampleTime);
+ void InsertFrames(TrackBuffer& aSamples,
+ const media::TimeIntervals& aIntervals,
+ TrackData& aTrackData);
+ void UpdateHighestTimestamp(TrackData& aTrackData,
+ const media::TimeUnit& aHighestTime);
+ // Remove all frames and their dependencies contained in aIntervals.
+ // Return the index at which frames were first removed or 0 if no frames
+ // removed.
+ uint32_t RemoveFrames(const media::TimeIntervals& aIntervals,
+ TrackData& aTrackData,
+ uint32_t aStartIndex);
+ // Recalculate track's evictable amount.
+ void ResetEvictionIndex(TrackData& aTrackData);
+ void UpdateEvictionIndex(TrackData& aTrackData, uint32_t aCurrentIndex);
+ // Find index of sample. Return a negative value if not found.
+ uint32_t FindSampleIndex(const TrackBuffer& aTrackBuffer,
+ const media::TimeInterval& aInterval);
+ const MediaRawData* GetSample(TrackInfo::TrackType aTrack,
+ uint32_t aIndex,
+ const media::TimeUnit& aExpectedDts,
+ const media::TimeUnit& aExpectedPts,
+ const media::TimeUnit& aFuzz);
+ void UpdateBufferedRanges();
+ void RejectProcessing(const MediaResult& aRejectValue, const char* aName);
+ void ResolveProcessing(bool aResolveValue, const char* aName);
+ MozPromiseRequestHolder<CodedFrameProcessingPromise> mProcessingRequest;
+ MozPromiseHolder<CodedFrameProcessingPromise> mProcessingPromise;
+
+ // Trackbuffers definition.
+ nsTArray<const TrackData*> GetTracksList() const;
+ nsTArray<TrackData*> GetTracksList();
+ TrackData& GetTracksData(TrackType aTrack)
+ {
+ switch(aTrack) {
+ case TrackType::kVideoTrack:
+ return mVideoTracks;
+ case TrackType::kAudioTrack:
+ default:
+ return mAudioTracks;
+ }
+ }
+ const TrackData& GetTracksData(TrackType aTrack) const
+ {
+ switch(aTrack) {
+ case TrackType::kVideoTrack:
+ return mVideoTracks;
+ case TrackType::kAudioTrack:
+ default:
+ return mAudioTracks;
+ }
+ }
+ TrackData mVideoTracks;
+ TrackData mAudioTracks;
+
+ // TaskQueue methods and objects.
+ AbstractThread* GetTaskQueue() const
+ {
+ return mTaskQueue;
+ }
+ bool OnTaskQueue() const
+ {
+ return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn();
+ }
+ RefPtr<AutoTaskQueue> mTaskQueue;
+
+ // SourceBuffer Queues and running context.
+ SourceBufferTaskQueue mQueue;
+ void QueueTask(SourceBufferTask* aTask);
+ void ProcessTasks();
+ // Set if the TrackBuffersManager is currently processing a task.
+ // At this stage, this task is always a AppendBufferTask.
+ RefPtr<SourceBufferTask> mCurrentTask;
+ // Current SourceBuffer state for ongoing task.
+ // Its content is returned to the SourceBuffer once the AppendBufferTask has
+ // completed.
+ UniquePtr<SourceBufferAttributes> mSourceBufferAttributes;
+ // The current sourcebuffer append window. It's content is equivalent to
+ // mSourceBufferAttributes.mAppendWindowStart/End
+ media::TimeInterval mAppendWindow;
+
+ // Strong references to external objects.
+ nsMainThreadPtrHandle<MediaSourceDecoder> mParentDecoder;
+
+ // Return public highest end time across all aTracks.
+ // Monitor must be held.
+ media::TimeUnit HighestEndTime(nsTArray<const media::TimeIntervals*>& aTracks) const;
+
+ // Set to true if mediasource state changed to ended.
+ Atomic<bool> mEnded;
+
+ // Global size of this source buffer content.
+ Atomic<int64_t> mSizeSourceBuffer;
+ const int64_t mVideoEvictionThreshold;
+ const int64_t mAudioEvictionThreshold;
+ enum class EvictionState
+ {
+ NO_EVICTION_NEEDED,
+ EVICTION_NEEDED,
+ EVICTION_COMPLETED,
+ };
+ Atomic<EvictionState> mEvictionState;
+
+ // Monitor to protect following objects accessed across multiple threads.
+ mutable Monitor mMonitor;
+ // Stable audio and video track time ranges.
+ media::TimeIntervals mVideoBufferedRanges;
+ media::TimeIntervals mAudioBufferedRanges;
+ // MediaInfo of the first init segment read.
+ MediaInfo mInfo;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_TRACKBUFFERSMANAGER_H_ */
diff --git a/dom/media/mediasource/gtest/TestContainerParser.cpp b/dom/media/mediasource/gtest/TestContainerParser.cpp
new file mode 100644
index 000000000..d51da83af
--- /dev/null
+++ b/dom/media/mediasource/gtest/TestContainerParser.cpp
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <gtest/gtest.h>
+#include <stdint.h>
+
+#include "ContainerParser.h"
+#include "mozilla/ArrayUtils.h"
+#include "nsAutoPtr.h"
+
+using namespace mozilla;
+
+TEST(ContainerParser, MIMETypes) {
+ const char* content_types[] = {
+ "video/webm",
+ "audio/webm",
+ "video/mp4",
+ "audio/mp4",
+ "audio/aac"
+ };
+ nsAutoPtr<ContainerParser> parser;
+ for (size_t i = 0; i < ArrayLength(content_types); ++i) {
+ nsAutoCString content_type(content_types[i]);
+ parser = ContainerParser::CreateForMIMEType(content_type);
+ ASSERT_NE(parser, nullptr);
+ }
+}
+
+
+already_AddRefed<MediaByteBuffer> make_adts_header()
+{
+ const uint8_t test[] = { 0xff, 0xf1, 0x50, 0x80, 0x03, 0x1f, 0xfc };
+ RefPtr<MediaByteBuffer> buffer(new MediaByteBuffer);
+ buffer->AppendElements(test, ArrayLength(test));
+ return buffer.forget();
+}
+
+TEST(ContainerParser, ADTSHeader) {
+ nsAutoPtr<ContainerParser> parser;
+ parser = ContainerParser::CreateForMIMEType(NS_LITERAL_CSTRING("audio/aac"));
+ ASSERT_NE(parser, nullptr);
+
+ // Audio data should have no gaps.
+ EXPECT_EQ(parser->GetRoundingError(), 0);
+
+ // Test a valid header.
+ RefPtr<MediaByteBuffer> header = make_adts_header();
+ EXPECT_TRUE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)));
+
+ // Test variations.
+ uint8_t save = header->ElementAt(1);
+ for (uint8_t i = 1; i < 3; ++i) {
+ // Set non-zero layer.
+ header->ReplaceElementAt(1, (header->ElementAt(1) & 0xf9) | (i << 1));
+ EXPECT_FALSE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
+ << "Accepted non-zero layer in header.";
+ }
+ header->ReplaceElementAt(1, save);
+ save = header->ElementAt(2);
+ header->ReplaceElementAt(2, (header->ElementAt(2) & 0x3b) | (15 << 2));
+ EXPECT_FALSE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
+ << "Accepted explicit frequency in header.";
+ header->ReplaceElementAt(2, save);
+
+ // Test a short header.
+ header->SetLength(6);
+ EXPECT_FALSE(NS_SUCCEEDED(parser->IsInitSegmentPresent(header)))
+ << "Accepted too-short header.";
+ EXPECT_FALSE(NS_SUCCEEDED(parser->IsMediaSegmentPresent(header)))
+ << "Found media segment when there was just a partial header.";
+
+ // Test parse results.
+ header = make_adts_header();
+ EXPECT_FALSE(NS_SUCCEEDED(parser->IsMediaSegmentPresent(header)))
+ << "Found media segment when there was just a header.";
+ int64_t start = 0;
+ int64_t end = 0;
+ EXPECT_TRUE(NS_FAILED(parser->ParseStartAndEndTimestamps(header, start, end)));
+
+ EXPECT_TRUE(parser->HasInitData());
+ EXPECT_TRUE(parser->HasCompleteInitData());
+ MediaByteBuffer* init = parser->InitData();
+ ASSERT_NE(init, nullptr);
+ EXPECT_EQ(init->Length(), header->Length());
+
+ EXPECT_EQ(parser->InitSegmentRange(), MediaByteRange(0, int64_t(header->Length())));
+ // Media segment range should be empty here.
+ EXPECT_EQ(parser->MediaHeaderRange(), MediaByteRange());
+ EXPECT_EQ(parser->MediaSegmentRange(), MediaByteRange());
+}
diff --git a/dom/media/mediasource/gtest/moz.build b/dom/media/mediasource/gtest/moz.build
new file mode 100644
index 000000000..5aa597d8d
--- /dev/null
+++ b/dom/media/mediasource/gtest/moz.build
@@ -0,0 +1,16 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'TestContainerParser.cpp',
+]
+
+LOCAL_INCLUDES += [
+ '/dom/media',
+ '/dom/media/mediasource',
+]
+
+FINAL_LIBRARY = 'xul-gtest'
diff --git a/dom/media/mediasource/moz.build b/dom/media/mediasource/moz.build
new file mode 100644
index 000000000..6ded1875d
--- /dev/null
+++ b/dom/media/mediasource/moz.build
@@ -0,0 +1,49 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+MOCHITEST_MANIFESTS += ['test/mochitest.ini']
+
+EXPORTS += [
+ 'AsyncEventRunner.h',
+ 'AutoTaskQueue.h',
+ 'MediaSourceDecoder.h',
+ 'MediaSourceDemuxer.h',
+ 'SourceBufferAttributes.h',
+ 'SourceBufferTask.h',
+ 'TrackBuffersManager.h',
+]
+
+EXPORTS.mozilla.dom += [
+ 'MediaSource.h',
+ 'SourceBuffer.h',
+ 'SourceBufferList.h',
+]
+
+UNIFIED_SOURCES += [
+ 'ContainerParser.cpp',
+ 'MediaSource.cpp',
+ 'MediaSourceDecoder.cpp',
+ 'MediaSourceDemuxer.cpp',
+ 'MediaSourceUtils.cpp',
+ 'ResourceQueue.cpp',
+ 'SourceBuffer.cpp',
+ 'SourceBufferList.cpp',
+ 'SourceBufferResource.cpp',
+ 'TrackBuffersManager.cpp',
+]
+
+TEST_DIRS += [
+ 'gtest',
+]
+
+if CONFIG['MOZ_GONK_MEDIACODEC']:
+ DEFINES['MOZ_GONK_MEDIACODEC'] = True
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/mediasource/test/aac20-48000-64000-1.m4s b/dom/media/mediasource/test/aac20-48000-64000-1.m4s
new file mode 100644
index 000000000..56506e1f2
--- /dev/null
+++ b/dom/media/mediasource/test/aac20-48000-64000-1.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/aac20-48000-64000-1.m4s^headers^ b/dom/media/mediasource/test/aac20-48000-64000-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/aac20-48000-64000-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/aac20-48000-64000-2.m4s b/dom/media/mediasource/test/aac20-48000-64000-2.m4s
new file mode 100644
index 000000000..3faff17eb
--- /dev/null
+++ b/dom/media/mediasource/test/aac20-48000-64000-2.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/aac20-48000-64000-2.m4s^headers^ b/dom/media/mediasource/test/aac20-48000-64000-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/aac20-48000-64000-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/aac20-48000-64000-init.mp4 b/dom/media/mediasource/test/aac20-48000-64000-init.mp4
new file mode 100644
index 000000000..b70e01651
--- /dev/null
+++ b/dom/media/mediasource/test/aac20-48000-64000-init.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/aac20-48000-64000-init.mp4^headers^ b/dom/media/mediasource/test/aac20-48000-64000-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/aac20-48000-64000-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/aac51-48000-128000-1.m4s b/dom/media/mediasource/test/aac51-48000-128000-1.m4s
new file mode 100644
index 000000000..3424acfec
--- /dev/null
+++ b/dom/media/mediasource/test/aac51-48000-128000-1.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/aac51-48000-128000-1.m4s^headers^ b/dom/media/mediasource/test/aac51-48000-128000-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/aac51-48000-128000-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/aac51-48000-128000-2.m4s b/dom/media/mediasource/test/aac51-48000-128000-2.m4s
new file mode 100644
index 000000000..b02bfd043
--- /dev/null
+++ b/dom/media/mediasource/test/aac51-48000-128000-2.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/aac51-48000-128000-2.m4s^headers^ b/dom/media/mediasource/test/aac51-48000-128000-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/aac51-48000-128000-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/aac51-48000-128000-init.mp4 b/dom/media/mediasource/test/aac51-48000-128000-init.mp4
new file mode 100644
index 000000000..7d62401f2
--- /dev/null
+++ b/dom/media/mediasource/test/aac51-48000-128000-init.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/aac51-48000-128000-init.mp4^headers^ b/dom/media/mediasource/test/aac51-48000-128000-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/aac51-48000-128000-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop1.m4s b/dom/media/mediasource/test/bipbop/bipbop1.m4s
new file mode 100644
index 000000000..a237f2e91
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop1.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop1.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop10.m4s b/dom/media/mediasource/test/bipbop/bipbop10.m4s
new file mode 100644
index 000000000..d1f5e6a0b
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop10.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop10.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop10.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop10.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop11.m4s b/dom/media/mediasource/test/bipbop/bipbop11.m4s
new file mode 100644
index 000000000..57232fb35
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop11.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop11.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop11.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop11.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop12.m4s b/dom/media/mediasource/test/bipbop/bipbop12.m4s
new file mode 100644
index 000000000..f9b18713e
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop12.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop12.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop12.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop12.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop13.m4s b/dom/media/mediasource/test/bipbop/bipbop13.m4s
new file mode 100644
index 000000000..f2a876946
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop13.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop13.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop13.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop13.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop2.m4s b/dom/media/mediasource/test/bipbop/bipbop2.m4s
new file mode 100644
index 000000000..baa0d8578
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop2.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop2.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop2s.mp4 b/dom/media/mediasource/test/bipbop/bipbop2s.mp4
new file mode 100644
index 000000000..4fd8b9cb6
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop2s.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop2s.mp4^headers^ b/dom/media/mediasource/test/bipbop/bipbop2s.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop2s.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop3.m4s b/dom/media/mediasource/test/bipbop/bipbop3.m4s
new file mode 100644
index 000000000..ed313e668
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop3.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop3.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop4.m4s b/dom/media/mediasource/test/bipbop/bipbop4.m4s
new file mode 100644
index 000000000..7709ac08c
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop4.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop4.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop5.m4s b/dom/media/mediasource/test/bipbop/bipbop5.m4s
new file mode 100644
index 000000000..6d36788e4
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop5.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop5.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop5.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop5.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop6.m4s b/dom/media/mediasource/test/bipbop/bipbop6.m4s
new file mode 100644
index 000000000..64f475c70
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop6.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop6.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop6.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop6.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop7.m4s b/dom/media/mediasource/test/bipbop/bipbop7.m4s
new file mode 100644
index 000000000..c148918d6
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop7.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop7.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop7.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop7.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop8.m4s b/dom/media/mediasource/test/bipbop/bipbop8.m4s
new file mode 100644
index 000000000..707dd4848
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop8.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop8.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop8.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop8.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop9.m4s b/dom/media/mediasource/test/bipbop/bipbop9.m4s
new file mode 100644
index 000000000..538cf72a4
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop9.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop9.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop9.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop9.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s
new file mode 100755
index 000000000..3dad336e8
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s
new file mode 100755
index 000000000..dd7491241
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-video2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4 b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4
new file mode 100755
index 000000000..b1a2d4405
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4^headers^ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_480_624kbps-videoinit.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio1.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio1.m4s
new file mode 100644
index 000000000..33da98b5a
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio1.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio1.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio10.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio10.m4s
new file mode 100644
index 000000000..36a98afd2
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio10.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio10.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio10.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio10.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio11.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio11.m4s
new file mode 100644
index 000000000..23d4aa8d8
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio11.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio11.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio11.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio11.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio2.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio2.m4s
new file mode 100644
index 000000000..96f4bcc34
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio2.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio2.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio3.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio3.m4s
new file mode 100644
index 000000000..7de4bd0ca
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio3.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio3.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio4.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio4.m4s
new file mode 100644
index 000000000..494c71eb9
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio4.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio4.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio5.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio5.m4s
new file mode 100644
index 000000000..b50496b6c
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio5.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio5.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio5.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio5.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio6.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio6.m4s
new file mode 100644
index 000000000..02cf4d363
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio6.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio6.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio6.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio6.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio7.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio7.m4s
new file mode 100644
index 000000000..bb2252889
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio7.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio7.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio7.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio7.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio8.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio8.m4s
new file mode 100644
index 000000000..04a6a7af9
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio8.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio8.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio8.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio8.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio9.m4s b/dom/media/mediasource/test/bipbop/bipbop_audio9.m4s
new file mode 100644
index 000000000..cb94b529a
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio9.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audio9.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audio9.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audio9.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4 b/dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4
new file mode 100644
index 000000000..bbf272197
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4^headers^ b/dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_audioinit.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_dash.mpd b/dom/media/mediasource/test/bipbop/bipbop_dash.mpd
new file mode 100644
index 000000000..532cdc65d
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_dash.mpd
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M9.98S" profiles="urn:mpeg:dash:profile:full:2011">
+ <ProgramInformation moreInformationURL="http://gpac.sourceforge.net">
+ <Title>bipbop_dash.mpd handcrafted by JYA</Title>
+ </ProgramInformation>
+
+ <Period duration="PT0H0M9.98S">
+ <AdaptationSet segmentAlignment="true" maxWidth="400" maxHeight="300" maxFrameRate="90000" par="4:3" lang="und">
+ <Representation id="1" mimeType="video/mp4" codecs="avc1.4d4015" width="400" height="300" frameRate="90000" sar="1:1" startWithSAP="1" bandwidth="226425">
+ <SegmentList timescale="90000" duration="69043">
+ <Initialization sourceURL="bipbop_videoinit.mp4"/>
+ <SegmentURL media="bipbop_video1.m4s"/>
+ <SegmentURL media="bipbop_video2.m4s"/>
+ <SegmentURL media="bipbop_video3.m4s"/>
+ <SegmentURL media="bipbop_video4.m4s"/>
+ <SegmentURL media="bipbop_video5.m4s"/>
+ <SegmentURL media="bipbop_video6.m4s"/>
+ <SegmentURL media="bipbop_video7.m4s"/>
+ <SegmentURL media="bipbop_video8.m4s"/>
+ <SegmentURL media="bipbop_video9.m4s"/>
+ <SegmentURL media="bipbop_video10.m4s"/>
+ <SegmentURL media="bipbop_video11.m4s"/>
+ <SegmentURL media="bipbop_video12.m4s"/>
+ <SegmentURL media="bipbop_video13.m4s"/>
+ </SegmentList>
+ </Representation>
+ </AdaptationSet>
+ <AdaptationSet segmentAlignment="true" lang="und">
+ <Representation id="1" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="22050" startWithSAP="1" bandwidth="7206">
+ <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
+ <SegmentList timescale="22050" duration="20101">
+ <Initialization sourceURL="bipbop_audioinit.mp4"/>
+ <SegmentURL media="bipbop_audio1.m4s"/>
+ <SegmentURL media="bipbop_audio2.m4s"/>
+ <SegmentURL media="bipbop_audio3.m4s"/>
+ <SegmentURL media="bipbop_audio4.m4s"/>
+ <SegmentURL media="bipbop_audio5.m4s"/>
+ <SegmentURL media="bipbop_audio6.m4s"/>
+ <SegmentURL media="bipbop_audio7.m4s"/>
+ <SegmentURL media="bipbop_audio8.m4s"/>
+ <SegmentURL media="bipbop_audio9.m4s"/>
+ <SegmentURL media="bipbop_audio10.m4s"/>
+ <SegmentURL media="bipbop_audio11.m4s"/>
+ </SegmentList>
+ </Representation>
+ </AdaptationSet>
+ </Period>
+</MPD>
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video1.m4s b/dom/media/mediasource/test/bipbop/bipbop_video1.m4s
new file mode 100644
index 000000000..929118251
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video1.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video1.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video10.m4s b/dom/media/mediasource/test/bipbop/bipbop_video10.m4s
new file mode 100644
index 000000000..72c7afaca
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video10.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video10.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video10.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video10.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video11.m4s b/dom/media/mediasource/test/bipbop/bipbop_video11.m4s
new file mode 100644
index 000000000..e6109f5e7
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video11.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video11.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video11.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video11.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video12.m4s b/dom/media/mediasource/test/bipbop/bipbop_video12.m4s
new file mode 100644
index 000000000..5c54a510f
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video12.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video12.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video12.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video12.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video13.m4s b/dom/media/mediasource/test/bipbop/bipbop_video13.m4s
new file mode 100644
index 000000000..c64f38a33
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video13.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video13.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video13.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video13.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video2.m4s b/dom/media/mediasource/test/bipbop/bipbop_video2.m4s
new file mode 100644
index 000000000..cd34fae56
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video2.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video2.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video3.m4s b/dom/media/mediasource/test/bipbop/bipbop_video3.m4s
new file mode 100644
index 000000000..5a1334004
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video3.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video3.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video4.m4s b/dom/media/mediasource/test/bipbop/bipbop_video4.m4s
new file mode 100644
index 000000000..e8d96b6ed
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video4.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video4.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video5.m4s b/dom/media/mediasource/test/bipbop/bipbop_video5.m4s
new file mode 100644
index 000000000..ca6a82046
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video5.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video5.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video5.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video5.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video6.m4s b/dom/media/mediasource/test/bipbop/bipbop_video6.m4s
new file mode 100644
index 000000000..fe9824355
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video6.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video6.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video6.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video6.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video7.m4s b/dom/media/mediasource/test/bipbop/bipbop_video7.m4s
new file mode 100644
index 000000000..3351fa685
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video7.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video7.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video7.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video7.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video8.m4s b/dom/media/mediasource/test/bipbop/bipbop_video8.m4s
new file mode 100644
index 000000000..af26ae5f9
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video8.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video8.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video8.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video8.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video9.m4s b/dom/media/mediasource/test/bipbop/bipbop_video9.m4s
new file mode 100644
index 000000000..25be672c1
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video9.m4s
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_video9.m4s^headers^ b/dom/media/mediasource/test/bipbop/bipbop_video9.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_video9.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4 b/dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4
new file mode 100644
index 000000000..7c9c533c3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4^headers^ b/dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbop_videoinit.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/bipbop/bipbopinit.mp4 b/dom/media/mediasource/test/bipbop/bipbopinit.mp4
new file mode 100644
index 000000000..39f0575a7
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbopinit.mp4
Binary files differ
diff --git a/dom/media/mediasource/test/bipbop/bipbopinit.mp4^headers^ b/dom/media/mediasource/test/bipbop/bipbopinit.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/bipbop/bipbopinit.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/crashtests/1005366.html b/dom/media/mediasource/test/crashtests/1005366.html
new file mode 100644
index 000000000..aa8b7f652
--- /dev/null
+++ b/dom/media/mediasource/test/crashtests/1005366.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+
+/*
+user_pref("media.mediasource.enabled", true);
+*/
+
+function boom()
+{
+ var source = new window.MediaSource();
+ var videoElement = document.createElementNS('http://www.w3.org/1999/xhtml', 'video');
+ videoElement.src = URL.createObjectURL(source);
+
+ setTimeout(function() {
+ var buf = source.addSourceBuffer("video/webm");
+ buf.abort();
+ buf.appendBuffer(new Float32Array(203));
+ }, 0);
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/mediasource/test/crashtests/1059035.html b/dom/media/mediasource/test/crashtests/1059035.html
new file mode 100644
index 000000000..9dfda34b8
--- /dev/null
+++ b/dom/media/mediasource/test/crashtests/1059035.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+/*
+user_pref("media.mediasource.enabled", true);
+*/
+
+function boom()
+{
+ var mediaSource = new MediaSource();
+ var htmlAudio = document.createElement("audio");
+ htmlAudio.src = URL.createObjectURL(mediaSource);
+
+ setTimeout(function() {
+ var sourceBuffer = mediaSource.addSourceBuffer("video/webm");
+ mediaSource.removeSourceBuffer(sourceBuffer);
+ sourceBuffer.remove(0, 0);
+ }, 0);
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/mediasource/test/crashtests/926665.html b/dom/media/mediasource/test/crashtests/926665.html
new file mode 100644
index 000000000..a8247b27e
--- /dev/null
+++ b/dom/media/mediasource/test/crashtests/926665.html
@@ -0,0 +1,26 @@
+<html>
+<head>
+<meta charset="UTF-8">
+<script style="display: none;" id="fuzz1" type="text/javascript;version=1.7">
+
+function boom()
+{
+ var mediaSource = new window.MediaSource();
+ var mediaSourceURL = URL.createObjectURL(mediaSource);
+ var v1 = document.createElement('video');
+ v1.src = mediaSourceURL;
+ mediaSource.addEventListener("sourceopen", function (e) {
+ var v2 = document.createElement('video');
+ v2.src = mediaSourceURL;
+ setTimeout(function () {
+ v2.src = "data:text/plain,1";
+ v1.src = "data:text/plain,2";
+ }, 0);
+ });
+}
+
+</script>
+</head>
+
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/mediasource/test/crashtests/931388.html b/dom/media/mediasource/test/crashtests/931388.html
new file mode 100644
index 000000000..cdb5bd9ad
--- /dev/null
+++ b/dom/media/mediasource/test/crashtests/931388.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+
+function boom()
+{
+ var v = document.createElement('video');
+ v.src = URL.createObjectURL(new MediaSource());
+ v.play();
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/mediasource/test/crashtests/crashtests.list b/dom/media/mediasource/test/crashtests/crashtests.list
new file mode 100644
index 000000000..e16ec261d
--- /dev/null
+++ b/dom/media/mediasource/test/crashtests/crashtests.list
@@ -0,0 +1,4 @@
+test-pref(media.mediasource.enabled,true) load 926665.html
+test-pref(media.mediasource.enabled,true) load 931388.html
+test-pref(media.mediasource.enabled,true) load 1005366.html
+test-pref(media.mediasource.enabled,true) load 1059035.html
diff --git a/dom/media/mediasource/test/mediasource.js b/dom/media/mediasource/test/mediasource.js
new file mode 100644
index 000000000..6a464096a
--- /dev/null
+++ b/dom/media/mediasource/test/mediasource.js
@@ -0,0 +1,130 @@
+// Helpers for Media Source Extensions tests
+
+function runWithMSE(testFunction) {
+ function bootstrapTest() {
+ var ms = new MediaSource();
+
+ var el = document.createElement("video");
+ el.src = URL.createObjectURL(ms);
+ el.preload = "auto";
+
+ document.body.appendChild(el);
+ SimpleTest.registerCleanupFunction(function () {
+ el.parentNode.removeChild(el);
+ });
+
+ testFunction(ms, el);
+ }
+
+ addLoadEvent(function () {
+ SpecialPowers.pushPrefEnv({"set": [
+ [ "media.mediasource.enabled", true ],
+ ]},
+ bootstrapTest);
+ });
+}
+
+function fetchWithXHR(uri, onLoadFunction) {
+ var p = new Promise(function(resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", uri, true);
+ xhr.responseType = "arraybuffer";
+ xhr.addEventListener("load", function () {
+ is(xhr.status, 200, "fetchWithXHR load uri='" + uri + "' status=" + xhr.status);
+ resolve(xhr.response);
+ });
+ xhr.send();
+ });
+
+ if (onLoadFunction) {
+ p.then(onLoadFunction);
+ }
+
+ return p;
+};
+
+function range(start, end) {
+ var rv = [];
+ for (var i = start; i < end; ++i) {
+ rv.push(i);
+ }
+ return rv;
+}
+
+function once(target, name, cb) {
+ var p = new Promise(function(resolve, reject) {
+ target.addEventListener(name, function onceEvent() {
+ target.removeEventListener(name, onceEvent);
+ resolve();
+ });
+ });
+ if (cb) {
+ p.then(cb);
+ }
+ return p;
+}
+
+function timeRangeToString(r) {
+ var str = "TimeRanges: ";
+ for (var i = 0; i < r.length; i++) {
+ str += "[" + r.start(i) + ", " + r.end(i) + ")";
+ }
+ return str;
+}
+
+function loadSegment(sb, typedArrayOrArrayBuffer) {
+ var typedArray = (typedArrayOrArrayBuffer instanceof ArrayBuffer) ? new Uint8Array(typedArrayOrArrayBuffer)
+ : typedArrayOrArrayBuffer;
+ info(`Loading buffer: [${typedArray.byteOffset}, ${typedArray.byteOffset + typedArray.byteLength})`);
+ var beforeBuffered = timeRangeToString(sb.buffered);
+ return new Promise(function(resolve, reject) {
+ once(sb, 'update').then(function() {
+ var afterBuffered = timeRangeToString(sb.buffered);
+ info(`SourceBuffer buffered ranges grew from ${beforeBuffered} to ${afterBuffered}`);
+ resolve();
+ });
+ sb.appendBuffer(typedArray);
+ });
+}
+
+function fetchAndLoad(sb, prefix, chunks, suffix) {
+
+ // Fetch the buffers in parallel.
+ var buffers = {};
+ var fetches = [];
+ for (var chunk of chunks) {
+ fetches.push(fetchWithXHR(prefix + chunk + suffix).then(((c, x) => buffers[c] = x).bind(null, chunk)));
+ }
+
+ // Load them in series, as required per spec.
+ return Promise.all(fetches).then(function() {
+ var rv = Promise.resolve();
+ for (var chunk of chunks) {
+ rv = rv.then(loadSegment.bind(null, sb, buffers[chunk]));
+ }
+ return rv;
+ });
+}
+
+//Register timeout function to dump debugging logs.
+SimpleTest.registerTimeoutFunction(function() {
+ for (var v of document.getElementsByTagName("video")) {
+ v.mozDumpDebugInfo();
+ }
+ for (var a of document.getElementsByTagName("audio")) {
+ a.mozDumpDebugInfo();
+ }
+});
+
+function waitUntilTime(target, targetTime) {
+ return new Promise(function(resolve, reject) {
+ target.addEventListener("waiting", function onwaiting() {
+ info("Got a waiting event at " + target.currentTime);
+ if (target.currentTime >= targetTime) {
+ ok(true, "Reached target time of: " + targetTime);
+ target.removeEventListener("waiting", onwaiting);
+ resolve();
+ }
+ });
+ });
+}
diff --git a/dom/media/mediasource/test/mochitest.ini b/dom/media/mediasource/test/mochitest.ini
new file mode 100644
index 000000000..89ed35382
--- /dev/null
+++ b/dom/media/mediasource/test/mochitest.ini
@@ -0,0 +1,137 @@
+[DEFAULT]
+subsuite = media
+support-files =
+ mediasource.js
+ seek.webm seek.webm^headers^
+ seek_lowres.webm seek_lowres.webm^headers^
+ bipbop/bipbop2s.mp4 bipbop/bipbop2s.mp4^headers^
+ bipbop/bipbopinit.mp4 bipbop/bipbop_audioinit.mp4 bipbop/bipbop_videoinit.mp4
+ bipbop/bipbop1.m4s bipbop/bipbop_audio1.m4s bipbop/bipbop_video1.m4s
+ bipbop/bipbop2.m4s bipbop/bipbop_audio2.m4s bipbop/bipbop_video2.m4s
+ bipbop/bipbop3.m4s bipbop/bipbop_audio3.m4s bipbop/bipbop_video3.m4s
+ bipbop/bipbop4.m4s bipbop/bipbop_audio4.m4s bipbop/bipbop_video4.m4s
+ bipbop/bipbop5.m4s bipbop/bipbop_audio5.m4s bipbop/bipbop_video5.m4s
+ bipbop/bipbop6.m4s bipbop/bipbop_audio6.m4s bipbop/bipbop_video6.m4s
+ bipbop/bipbop7.m4s bipbop/bipbop_audio7.m4s bipbop/bipbop_video7.m4s
+ bipbop/bipbop8.m4s bipbop/bipbop_audio8.m4s bipbop/bipbop_video8.m4s
+ bipbop/bipbop9.m4s bipbop/bipbop_audio9.m4s bipbop/bipbop_video9.m4s
+ bipbop/bipbop10.m4s bipbop/bipbop_audio10.m4s bipbop/bipbop_video10.m4s
+ bipbop/bipbop11.m4s bipbop/bipbop_audio11.m4s bipbop/bipbop_video11.m4s
+ bipbop/bipbop12.m4s bipbop/bipbop_video12.m4s
+ bipbop/bipbop13.m4s bipbop/bipbop_video13.m4s
+ bipbop/bipbopinit.mp4^headers^ bipbop/bipbop_audioinit.mp4^headers^ bipbop/bipbop_videoinit.mp4^headers^
+ bipbop/bipbop1.m4s^headers^ bipbop/bipbop_audio1.m4s^headers^ bipbop/bipbop_video1.m4s^headers^
+ bipbop/bipbop2.m4s^headers^ bipbop/bipbop_audio2.m4s^headers^ bipbop/bipbop_video2.m4s^headers^
+ bipbop/bipbop3.m4s^headers^ bipbop/bipbop_audio3.m4s^headers^ bipbop/bipbop_video3.m4s^headers^
+ bipbop/bipbop4.m4s^headers^ bipbop/bipbop_audio4.m4s^headers^ bipbop/bipbop_video4.m4s^headers^
+ bipbop/bipbop5.m4s^headers^ bipbop/bipbop_audio5.m4s^headers^ bipbop/bipbop_video5.m4s^headers^
+ bipbop/bipbop6.m4s^headers^ bipbop/bipbop_audio6.m4s^headers^ bipbop/bipbop_video6.m4s^headers^
+ bipbop/bipbop7.m4s^headers^ bipbop/bipbop_audio7.m4s^headers^ bipbop/bipbop_video7.m4s^headers^
+ bipbop/bipbop8.m4s^headers^ bipbop/bipbop_audio8.m4s^headers^ bipbop/bipbop_video8.m4s^headers^
+ bipbop/bipbop9.m4s^headers^ bipbop/bipbop_audio9.m4s^headers^ bipbop/bipbop_video9.m4s^headers^
+ bipbop/bipbop10.m4s^headers^ bipbop/bipbop_audio10.m4s^headers^ bipbop/bipbop_video10.m4s^headers^
+ bipbop/bipbop11.m4s^headers^ bipbop/bipbop_audio11.m4s^headers^ bipbop/bipbop_video11.m4s^headers^
+ bipbop/bipbop12.m4s^headers^ bipbop/bipbop_video12.m4s^headers^
+ bipbop/bipbop13.m4s^headers^ bipbop/bipbop_video13.m4s^headers^
+ aac20-48000-64000-init.mp4 aac20-48000-64000-init.mp4^headers^
+ aac20-48000-64000-1.m4s aac20-48000-64000-1.m4s^headers^
+ aac20-48000-64000-2.m4s aac20-48000-64000-2.m4s^headers^
+ aac51-48000-128000-init.mp4 aac51-48000-128000-init.mp4^headers^
+ aac51-48000-128000-1.m4s aac51-48000-128000-1.m4s^headers^
+ aac51-48000-128000-2.m4s aac51-48000-128000-2.m4s^headers^
+ bipbop/bipbop_480_624kbps-videoinit.mp4 bipbop/bipbop_480_624kbps-videoinit.mp4^headers^
+ bipbop/bipbop_480_624kbps-video1.m4s bipbop/bipbop_480_624kbps-video1.m4s^headers^
+ bipbop/bipbop_480_624kbps-video2.m4s bipbop/bipbop_480_624kbps-video2.m4s^headers^
+
+[test_AudioChange_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_AutoRevocation.html]
+tags = firstpartyisolation
+[test_BufferedSeek.html]
+[test_BufferedSeek_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_BufferingWait.html]
+skip-if = toolkit == 'android' #timeout android bug 1199531
+[test_BufferingWait_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_DrainOnMissingData_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_DurationChange.html]
+[test_DurationUpdated.html]
+[test_DurationUpdated_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_EndOfStream.html]
+[test_EndOfStream_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_Eviction_mp4.html]
+skip-if = (os == "win" && os_version == "5.1") # Not supported on xp.
+[test_FrameSelection.html]
+[test_FrameSelection_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_HaveMetadataUnbufferedSeek.html]
+[test_HaveMetadataUnbufferedSeek_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_LiveSeekable.html]
+[test_LoadedDataFired_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_LoadedMetadataFired.html]
+[test_LoadedMetadataFired_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_MediaSource.html]
+[test_MediaSource_memory_reporting.html]
+[test_MediaSource_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_MediaSource_disabled.html]
+[test_MultipleInitSegments.html]
+[test_MultipleInitSegments_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_OnEvents.html]
+[test_PlayEvents.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_ResumeAfterClearing_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekableAfterEndOfStream.html]
+[test_SeekableAfterEndOfStream_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekableAfterEndOfStreamSplit.html]
+[test_SeekableAfterEndOfStreamSplit_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekableBeforeEndOfStream.html]
+[test_SeekableBeforeEndOfStream_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekableBeforeEndOfStreamSplit.html]
+[test_SeekableBeforeEndOfStreamSplit_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekNoData_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekedEvent_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekToEnd_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SeekTwice_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_Sequence_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SetModeThrows.html]
+[test_SplitAppendDelay.html]
+[test_SplitAppendDelay_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_SplitAppend.html]
+[test_SplitAppend_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_Threshold_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_TimestampOffset_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_TruncatedDuration.html]
+[test_TruncatedDuration_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_WaitingOnMissingData.html]
+skip-if = (toolkit == 'android') #timeout android only bug 1101187
+[test_WaitingOnMissingData_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_WaitingOnMissingDataEnded_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+[test_WaitingToEndedTransition_mp4.html]
+skip-if = ((os == "win" && os_version == "5.1") || (toolkit == 'android')) # Not supported on xp and android 2.3
+
diff --git a/dom/media/mediasource/test/seek.webm b/dom/media/mediasource/test/seek.webm
new file mode 100644
index 000000000..72b029723
--- /dev/null
+++ b/dom/media/mediasource/test/seek.webm
Binary files differ
diff --git a/dom/media/mediasource/test/seek.webm^headers^ b/dom/media/mediasource/test/seek.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/seek.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/seek_lowres.webm b/dom/media/mediasource/test/seek_lowres.webm
new file mode 100644
index 000000000..8a76e0647
--- /dev/null
+++ b/dom/media/mediasource/test/seek_lowres.webm
Binary files differ
diff --git a/dom/media/mediasource/test/seek_lowres.webm^headers^ b/dom/media/mediasource/test/seek_lowres.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/mediasource/test/seek_lowres.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/mediasource/test/test_AudioChange_mp4.html b/dom/media/mediasource/test/test_AudioChange_mp4.html
new file mode 100644
index 000000000..95f48cadf
--- /dev/null
+++ b/dom/media/mediasource/test/test_AudioChange_mp4.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// This test checks loading a stereo segment, followed by a 5.1 segment plays without error.
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause", "durationchange", "seeking", "seeked"];
+ function logEvent(e) {
+ var v = e.target;
+ info("got " + e.type + " event");
+ }
+ events.forEach(function(e) {
+ el.addEventListener(e, logEvent, false);
+ });
+
+ ok(true, "Receive a sourceopen event");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+ el.addEventListener("error", function(e) {
+ ok(false, "should not fire '" + e.type + "' event");
+ SimpleTest.finish();
+ });
+ is(el.readyState, el.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ fetchAndLoad(audiosb, 'aac20-48000-64000-', ['init'], '.mp4')
+ .then(once.bind(null, el, 'loadedmetadata'))
+ .then(function() {
+ ok(true, "got loadedmetadata event");
+ var promises = [];
+ promises.push(once(el, 'loadeddata'));
+ promises.push(once(el, 'canplay'));
+ promises.push(fetchAndLoad(audiosb, 'aac20-48000-64000-', ['1'], '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got canplay event");
+ el.play();
+ return fetchAndLoad(audiosb, 'aac51-48000-128000-', ['init'], '.mp4');
+ })
+ .then(fetchAndLoad.bind(null, audiosb, 'aac51-48000-128000-', ['2'], '.m4s'))
+ .then(function() {
+ var promises = [];
+ ms.endOfStream();
+ promises.push(once(el, 'ended'));
+ promises.push(once(audiosb, 'updateend'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(el.currentTime >= 6, "played to the end");
+ SimpleTest.finish();
+ })
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_AutoRevocation.html b/dom/media/mediasource/test/test_AutoRevocation.html
new file mode 100644
index 000000000..15474367e
--- /dev/null
+++ b/dom/media/mediasource/test/test_AutoRevocation.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: auto-revocation</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function () {
+ var ms = new MediaSource();
+ var o = URL.createObjectURL(ms);
+ var v = document.createElement("video");
+
+ v.addEventListener("error", function (e) {
+ ok(true, "ObjectURL should be auto-revoked");
+ SimpleTest.finish();
+ });
+
+ v.addEventListener("stalled", function (e) {
+ ok(false, "If auto-revocation is gone, please turn on TODOs in browser_mediaSourceURL.js");
+ SimpleTest.finish();
+ });
+
+ setTimeout(function() {
+ v.src = o;
+ v.preload = "auto";
+ document.body.appendChild(v);
+ }, 0);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_BufferedSeek.html b/dom/media/mediasource/test/test_BufferedSeek.html
new file mode 100644
index 000000000..949fee773
--- /dev/null
+++ b/dom/media/mediasource/test/test_BufferedSeek.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seeking in buffered range</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ /* Ensure that we endOfStream on the first update event only as endOfStream can
+ raise more if the duration of the last buffered range and the intial duration
+ differ. See bug 1065207 */
+ if (updateCount == 1) {
+ ms.endOfStream();
+ };
+ });
+ });
+
+ var target = 2;
+
+ v.addEventListener("loadedmetadata", function () {
+ if (v.currentTime != target &&
+ v.buffered.length &&
+ target >= v.buffered.start(0) &&
+ target < v.buffered.end(0)) {
+ v.currentTime = target;
+ }
+ });
+
+ var wasSeeking = false;
+
+ v.addEventListener("seeking", function () {
+ wasSeeking = true;
+ is(v.currentTime, target, "Video currentTime at target");
+ });
+
+ v.addEventListener("seeked", function () {
+ ok(wasSeeking, "Received expected seeking and seeked events");
+ is(v.currentTime, target, "Video currentTime at target");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_BufferedSeek_mp4.html b/dom/media/mediasource/test/test_BufferedSeek_mp4.html
new file mode 100644
index 000000000..7c5d992f3
--- /dev/null
+++ b/dom/media/mediasource/test/test_BufferedSeek_mp4.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seeking in buffered range</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ /* Ensure that we endOfStream on the first update event only as endOfStream can
+ raise more if the duration of the last buffered range and the intial duration
+ differ. See bug 1065207 */
+ if (updateCount == 1) {
+ ms.endOfStream();
+ };
+ });
+ });
+
+ var target = 1.3;
+
+ v.addEventListener("loadedmetadata", function () {
+ if (v.currentTime != target &&
+ v.buffered.length &&
+ target >= v.buffered.start(0) &&
+ target < v.buffered.end(0)) {
+ v.currentTime = target;
+ }
+ });
+
+ var wasSeeking = false;
+
+ v.addEventListener("seeking", function () {
+ wasSeeking = true;
+ is(v.currentTime, target, "Video currentTime at target");
+ });
+
+ v.addEventListener("seeked", function () {
+ ok(wasSeeking, "Received expected seeking and seeked events");
+ is(v.currentTime, target, "Video currentTime at target");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_BufferingWait.html b/dom/media/mediasource/test/test_BufferingWait.html
new file mode 100644
index 000000000..8d45132b4
--- /dev/null
+++ b/dom/media/mediasource/test/test_BufferingWait.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Don't get stuck buffering for too long when we have frames to show</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var receivedSourceOpen = false;
+runWithMSE(function(ms, v) {
+ ms.addEventListener("sourceopen", function() {
+ ok(true, "Receive a sourceopen event");
+ ok(!receivedSourceOpen, "Should only receive one sourceopen for this test");
+ receivedSourceOpen = true;
+ var sb = ms.addSourceBuffer("video/webm");
+ ok(sb, "Create a SourceBuffer");
+
+ fetchWithXHR("seek.webm", function(arrayBuffer) {
+ sb.addEventListener('error', (e) => { ok(false, "Got Error: " + e); SimpleTest.finish(); });
+ loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 0, 318))().then(
+ loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 318, 25523-318))).then(
+ loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 25523, 46712-25523))).then(
+ /* Note - Missing |46712, 67833 - 46712| segment here corresponding to (0.8, 1.2] */
+ /* Note - Missing |67833, 88966 - 67833| segment here corresponding to (1.2, 1.6] */
+ loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 88966))).then(function() {
+ // 0.767 is the time of the last video sample +- 40ms.
+ var promise = waitUntilTime(v, .767-0.04);
+ info("Playing video. It should play for a bit, then fire 'waiting'");
+ v.play();
+ return promise;
+ }).then(function() {
+ window.firstStop = Date.now();
+ loadSegment(sb, new Uint8Array(arrayBuffer, 46712, 67833 - 46712));
+ return waitUntilTime(v, 1.167-0.04);
+ }).then(function() {
+ var waitDuration = (Date.now() - window.firstStop) / 1000;
+ ok(waitDuration < 15, "Should not spend an inordinate amount of time buffering: " + waitDuration);
+ SimpleTest.finish();
+ /* If we allow the rest of the stream to be played, we get stuck at
+ around 2s. See bug 1093133.
+ once(v, 'ended', SimpleTest.finish.bind(SimpleTest));
+ return loadSegment(sb, new Uint8Array(arrayBuffer, 67833, 88966 - 67833));
+ */
+ });
+ });
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_BufferingWait_mp4.html b/dom/media/mediasource/test/test_BufferingWait_mp4.html
new file mode 100644
index 000000000..cb262b525
--- /dev/null
+++ b/dom/media/mediasource/test/test_BufferingWait_mp4.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Don't get stuck buffering for too long when we have frames to show</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var receivedSourceOpen = false;
+runWithMSE(function(ms, v) {
+ ms.addEventListener("sourceopen", function() {
+ ok(true, "Receive a sourceopen event");
+ ok(!receivedSourceOpen, "Should only receive one sourceopen for this test");
+ receivedSourceOpen = true;
+ var sb = ms.addSourceBuffer("video/mp4");
+ ok(sb, "Create a SourceBuffer");
+
+ sb.addEventListener('error', (e) => { ok(false, "Got Error: " + e); SimpleTest.finish(); });
+ fetchAndLoad(sb, 'bipbop/bipbop', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, sb, 'bipbop/bipbop', ['1'], '.m4s'))
+ .then(fetchAndLoad.bind(null, sb, 'bipbop/bipbop', ['2'], '.m4s'))
+ /* Note - Missing |bipbop3| segment here corresponding to (1.62, 2.41] */
+ /* Note - Missing |bipbop4| segment here corresponding to (2.41, 3.20] */
+ .then(fetchAndLoad.bind(null, sb, 'bipbop/bipbop', ['5'], '.m4s'))
+ .then(function() {
+ // last audio sample has a start time of 1.578956s
+ var promise = waitUntilTime(v, 1.57895);
+ info("Playing video. It should play for a bit, then fire 'waiting'");
+ v.play();
+ return promise;
+ }).then(function() {
+ window.firstStop = Date.now();
+ fetchAndLoad(sb, 'bipbop/bipbop', ['3'], '.m4s');
+ // last audio sample has a start time of 2.368435
+ return waitUntilTime(v, 2.36843);
+ }).then(function() {
+ var waitDuration = (Date.now() - window.firstStop) / 1000;
+ ok(waitDuration < 15, "Should not spend an inordinate amount of time buffering: " + waitDuration);
+ once(v, 'ended', SimpleTest.finish.bind(SimpleTest));
+ return fetchAndLoad(sb, 'bipbop/bipbop', ['4'], '.m4s');
+ }).then(function() {
+ ms.endOfStream();
+ });;
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_DrainOnMissingData_mp4.html b/dom/media/mediasource/test/test_DrainOnMissingData_mp4.html
new file mode 100644
index 000000000..f2284377f
--- /dev/null
+++ b/dom/media/mediasource/test/test_DrainOnMissingData_mp4.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: |waiting| event when source data is missing</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(function() {
+ // Set appendWindowEnd to ensure we only have about 6 frames worth.
+ // We must feed at least 6 frames to pass the MDSM pre-roll.
+ videosb.appendWindowEnd = .4;
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', ['1'], '.m4s');
+ })
+ .then(function() {
+ info("Invoking play()");
+ var promises = [];
+ promises.push(once(el, 'playing'));
+ el.play();
+ return Promise.all(promises);
+ })
+ .then(function() {
+ info("got playing");
+ return once(el, 'waiting');
+ }).then(function() {
+ info("got waiting");
+ info("Loading more data");
+ // Waiting will be fired on the last frame +- 40ms.
+ isfuzzy(el.currentTime, videosb.buffered.end(0) - 1/30,
+ 0.04, "Got a waiting event at " + el.currentTime);
+ videosb.appendWindowEnd = 1;
+ var p = once(el, 'ended');
+ var loads = fetchAndLoad(videosb, 'bipbop/bipbop_video', [1], '.m4s');
+ loads.then(() => ms.endOfStream());
+ return p;
+ }).then(function() {
+ // These fuzz factors are bigger than they should be. We should investigate
+ // and fix them in bug 1137574.
+ is(el.duration, 0.801666, "Video has correct duration: " + el.duration);
+ is(el.currentTime, el.duration, "Video has correct currentTime.");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_DurationChange.html b/dom/media/mediasource/test/test_DurationChange.html
new file mode 100644
index 000000000..58c58be15
--- /dev/null
+++ b/dom/media/mediasource/test/test_DurationChange.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: check that duration change behaves properly</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 318));
+ once(v, "loadedmetadata")
+ .then(function() {
+ is(v.duration, ms.duration, "video duration is mediasource one");
+ try {
+ ms.duration = 0;
+ } catch (e) { ok(false, "must not throw as operation is valid"); }
+ is(v.duration, 0, "reducing duration with no data buffered is valid");
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 318));
+ // Adding more data will fire durationchange.
+ once(sb, "updateend")
+ .then(function() {
+ ok(true, "got updateend");
+ // XXX: Duration should be exactly 4.0, see bug 1065207.
+ ok(Math.abs(v.duration - 4) <= 0.002, "Video has correct duration");
+ var error = false;
+ try {
+ ms.duration = 0;
+ } catch (e) {
+ ok(true, "must use remove for range removal");
+ is(e.name, "InvalidStateError", "Error is InvalidStateError");
+ error = true;
+ }
+ ok(error, "got an error");
+ ok(Math.abs(v.duration - 4) <= 0.002, "Video has correct duration");
+ try {
+ ms.duration = 10;
+ } catch (e) { ok(false, "must not throw as setting duration past data is valid"); }
+ is(v.duration, 10, "extending duration is always valid");
+ // The last sample has a start time of 3.967000s and a end time of 4.001 (see bug 1065207).
+ try {
+ ms.duration = 3.967000;
+ } catch (e) { ok(false, "setting duration with >= highest frame presentation time is valid"); }
+ is(v.duration, sb.buffered.end(0), "duration is the highest end time reported by the buffered attribute ");
+ try {
+ ms.duration = 3.97;
+ } catch (e) { ok(false, "setting duration with >= highest frame presentation time is valid"); }
+ is(v.duration, sb.buffered.end(0), "duration is the highest end time reported by the buffered attribute ");
+ error = false;
+ try {
+ ms.duration = 3.96;
+ } catch (e) {
+ ok(true, "setting duration with < highest frame presentation time is not valid");
+ is(e.name, "InvalidStateError", "Error is InvalidStateError");
+ error = true;
+ }
+ ok(error, "got an error");
+ is(v.duration, sb.buffered.end(0), "duration is the highest end time reported by the buffered attribute ");
+ error = false;
+ try {
+ ms.duration = -1;
+ } catch (e) {
+ ok(true, "can't set a negative duration");
+ is(e.name, "TypeError", "Error is TypeError");
+ error = true;
+ }
+ ok(error, "got an error");
+ sb.remove(sb.buffered.end(0), Infinity);
+ is(sb.updating, true, "updating is true")
+ error = false;
+ try {
+ ms.duration = Infinity;
+ } catch (e) {
+ ok(true, "setting the duration while updating is not allowed");
+ is(e.name, "InvalidStateError", "Error is InvalidStateError");
+ error = true;
+ }
+ ok(error, "got an error");
+ error = false;
+ try {
+ sb.abort();
+ } catch (e) {
+ ok(true, "Can't use abort while range removal is in progress");
+ is(e.name, "InvalidStateError", "Error is InvalidStateError");
+ error = true;
+ }
+ ok(error, "got an error");
+ is(v.duration, sb.buffered.end(0), "duration is the highest end time reported by the buffered attribute ");
+ once(sb, "updateend", () => ms.endOfStream());
+ });
+ });
+ });
+ });
+ ms.addEventListener("sourceended", function () {
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_DurationUpdated.html b/dom/media/mediasource/test/test_DurationUpdated.html
new file mode 100644
index 000000000..0ee6a5459
--- /dev/null
+++ b/dom/media/mediasource/test/test_DurationUpdated.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append data and check that mediasource duration got updated</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var durationChangeCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ v.addEventListener("durationchange", function () {
+ durationChangeCount++;
+ });
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 318));
+ // Adding the first init segment will fire a durationchange.
+ once(v, "loadedmetadata")
+ .then(function() {
+ ok(true, "got loadedmetadata");
+ // Set mediasource duration to 0, so future appendBuffer
+ // will update the mediasource duration.
+ // Changing the duration will fire a durationchange.
+ ms.duration = 0;
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 318));
+ // Adding more data will fire durationchange.
+ once(sb, "updateend")
+ .then(function() {
+ ok(true, "got updateend");
+ // this will not fire durationchange as new duration == old duration
+ ms.endOfStream();
+ });
+ });
+ });
+ });
+ ms.addEventListener("sourceended", function () {
+ is(durationChangeCount, 3, "durationchange not fired as many times as expected");
+ // XXX: Duration should be exactly 4.0, see bug 1065207.
+ ok(Math.abs(v.duration - 4) <= 0.002, "Video has correct duration");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_DurationUpdated_mp4.html b/dom/media/mediasource/test/test_DurationUpdated_mp4.html
new file mode 100644
index 000000000..da14267eb
--- /dev/null
+++ b/dom/media/mediasource/test/test_DurationUpdated_mp4.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append data and check that mediasource duration got updated</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var durationChangeCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ v.addEventListener("durationchange", function () {
+ durationChangeCount++;
+ });
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 1395));
+ // Adding the first init segment will fire a durationchange.
+ once(v, "loadedmetadata")
+ .then(function() {
+ ok(true, "got loadedmetadata");
+ // Set mediasource duration to 0, so future appendBuffer
+ // will update the mediasource duration.
+ // Changing the duration will fire a durationchange.
+ ms.duration = 0;
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 1395));
+ // Adding more data will fire durationchange.
+ once(sb, "updateend")
+ .then(function() {
+ ok(true, "got updateend");
+ // this will not fire durationchange as new duration == old duration
+ ms.endOfStream();
+ });
+ });
+ });
+ });
+ ms.addEventListener("sourceended", function () {
+ is(durationChangeCount, 3, "durationchange not fired as many times as expected");
+ is(v.duration, 1.696666, "Video has correct duration");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_EndOfStream.html b/dom/media/mediasource/test/test_EndOfStream.html
new file mode 100644
index 000000000..655d21cd3
--- /dev/null
+++ b/dom/media/mediasource/test/test_EndOfStream.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: endOfStream call after an appendBuffer</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function () {
+ var ms = new MediaSource();
+
+ var v = document.createElement("video");
+ v.src = URL.createObjectURL(ms);
+ document.body.appendChild(v);
+
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 88966));
+ var count = 0;
+ sb.addEventListener("updateend", function () {
+ ++count;
+ if (count == 1) {
+ setTimeout(function() {
+ var fail = false;
+ try {
+ ms.endOfStream();
+ } catch (e) {
+ fail = true;
+ }
+ ok(!fail, "MediaSource.endOfStream succeeded");
+ SimpleTest.finish();
+ }, 0);
+ }
+ });
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_EndOfStream_mp4.html b/dom/media/mediasource/test/test_EndOfStream_mp4.html
new file mode 100644
index 000000000..1f703f2b6
--- /dev/null
+++ b/dom/media/mediasource/test/test_EndOfStream_mp4.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: endOfStream call after an appendBuffer</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function () {
+ var ms = new MediaSource();
+
+ var v = document.createElement("video");
+ v.src = URL.createObjectURL(ms);
+ document.body.appendChild(v);
+
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ var count = 0;
+ sb.addEventListener("updateend", function () {
+ ++count;
+ if (count == 1) {
+ setTimeout(function() {
+ var fail = false;
+ try {
+ ms.endOfStream();
+ } catch (e) {
+ fail = true;
+ }
+ ok(!fail, "MediaSource.endOfStream succeeded");
+ SimpleTest.finish();
+ }, 0);
+ }
+ });
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_Eviction_mp4.html b/dom/media/mediasource/test/test_Eviction_mp4.html
new file mode 100644
index 000000000..c702cc3bb
--- /dev/null
+++ b/dom/media/mediasource/test/test_Eviction_mp4.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: QuotaExceededError when source buffer is full</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+// We fill up the source buffer with audio data until the buffer is full.
+// We ensure that QuotaExceededError is thrown once the buffer is full.
+// We then seek to half the content. By that time, another appendBuffer must succeed
+// as the auto-eviction would succeed (removing all data prior currentTime)
+
+// Fill up the SourceBuffer by appending data repeatedly via doAppendDataFunc until
+// an exception is thrown.
+function fillUpSourceBuffer(sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback) {
+ // We are appending data repeatedly in sequence mode, there should be no gaps.
+ ok(sourceBuffer.buffered.length <= 1, "there should be no gap in buffered ranges.");
+ try {
+ doAppendDataFunc();
+ } catch(ex) {
+ onCaughtExceptionCallback(ex);
+ return;
+ }
+ once(sourceBuffer, 'updateend', () => {
+ fillUpSourceBuffer(sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback);
+ });
+}
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ SpecialPowers.pushPrefEnv({
+ "set": [
+ ["media.mediasource.eviction_threshold.audio", 524288],
+ ]
+ }, function() {
+ let audiosb = ms.addSourceBuffer("audio/mp4");
+ audiosb.mode = "sequence";
+ fetchAndLoad(audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4')
+ .then(function() {
+ fetchWithXHR('bipbop/bipbop_audio1.m4s', function(audioBuffer) {
+ fillUpSourceBuffer(audiosb,
+ function() { // doAppendDataFunc
+ audiosb.appendBuffer(audioBuffer);
+ },
+ function(ex) { // onCaughtExceptionCallback
+ is(ex.name, 'QuotaExceededError', "QuotaExceededError thrown");
+ is(audiosb.buffered.end(0), el.duration, "Duration is end of buffered range");
+ let seekTime = audiosb.buffered.end(0) / 2;
+ el.currentTime = seekTime;
+ once(el, 'seeked', () => {
+ is(el.currentTime, seekTime, "correctly seeked to " + seekTime);
+ try {
+ audiosb.appendBuffer(audioBuffer);
+ } catch(ex) {
+ ok(false, "Shouldn't throw another time when data can be evicted");
+ el.mozDumpDebugInfo();
+ SimpleTest.finish();
+ return;
+ }
+ once(audiosb, 'update', () => {
+ ok(true, "appendBuffer succeeded");
+ SimpleTest.finish();
+ });
+ });
+ });
+ });
+ });
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_FrameSelection.html b/dom/media/mediasource/test/test_FrameSelection.html
new file mode 100644
index 000000000..f9190af9c
--- /dev/null
+++ b/dom/media/mediasource/test/test_FrameSelection.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: verify correct frames selected for given position</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+ var targets = [{ currentTime: 3, videoWidth: 160, videoHeight: 120 },
+ { currentTime: 2, videoWidth: 160, videoHeight: 120 },
+ { currentTime: 0, videoWidth: 320, videoHeight: 240 }];
+ var target;
+
+var lowResBuffer;
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm")
+ .then(function (arrayBuffer) {
+ var p = once(v, 'loadedmetadata');
+ // Append entire file covering range [0, 4].
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ return p;
+ }).then(function() {
+ is(v.currentTime, 0, "currentTime has correct initial value");
+ is(v.videoWidth, 320, "videoWidth has correct initial value");
+ is(v.videoHeight, 240, "videoHeight has correct initial value");
+ return fetchWithXHR("seek_lowres.webm");
+ }).then(function (arrayBuffer) {
+ // Append initialization segment.
+ var p = once(sb, 'updateend');
+ info("Appending low-res init segment");
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 438));
+ lowResBuffer = arrayBuffer;
+ return p;
+ }).then(function() {
+ var p = once(sb, 'updateend');
+ info("Appending low-res range [2,4]");
+ // Append media segment covering range [2, 4].
+ sb.appendBuffer(new Uint8Array(lowResBuffer, 51003));
+ return p;
+ }).then(function() {
+ ms.endOfStream();
+ var p = Promise.all([once(v, 'seeked'), once(v, 'resize')]);
+ info("Seeking to t=3");
+ v.currentTime = 3;
+ return p;
+ }).then(function() {
+ is(v.currentTime, 3, "Video currentTime at target");
+ is(v.videoWidth, 160, "videoWidth has correct low-res value");
+ is(v.videoHeight, 120, "videoHeight has correct low-res value");
+
+ var p = Promise.all([once(v, 'seeked'), once(v, 'resize')]);
+ info("Seeking to t=1");
+ v.currentTime = 1;
+ return p;
+ }).then(function() {
+ is(v.currentTime, 1, "Video currentTime at target");
+ is(v.videoWidth, 320, "videoWidth has correct high-res value");
+ is(v.videoHeight, 240, "videoHeight has correct high-res value");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_FrameSelection_mp4.html b/dom/media/mediasource/test/test_FrameSelection_mp4.html
new file mode 100644
index 000000000..a5b8fa290
--- /dev/null
+++ b/dom/media/mediasource/test/test_FrameSelection_mp4.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Don't get stuck buffering for too long when we have frames to show</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// This test loads partial video, plays and waits until playback stalls.
+// It then loads only 3 frames of a video at higher resolution.
+
+var receivedSourceOpen = false;
+runWithMSE(function(ms, v) {
+ ms.addEventListener("sourceopen", function() {
+ ok(true, "Receive a sourceopen event");
+ ok(!receivedSourceOpen, "Should only receive one sourceopen for this test");
+ receivedSourceOpen = true;
+ var sb = ms.addSourceBuffer("video/mp4");
+ ok(sb, "Create a SourceBuffer");
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause", "durationchange", "seeking", "seeked"];
+ function logEvent(e) {
+ var v = e.target;
+ info("got " + e.type + " event");
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ });
+
+ sb.addEventListener('error', (e) => { ok(false, "Got Error: " + e); SimpleTest.finish(); });
+ fetchAndLoad(sb, 'bipbop/bipbop', ['init'], '.mp4')
+ .then(function() {
+ var promises = [];
+ promises.push(fetchAndLoad(sb, 'bipbop/bipbop', range(1,3), '.m4s'));
+ promises.push(once(v, "loadeddata"));
+ return Promise.all(promises);
+ }).then(function() {
+ is(sb.buffered.length, 1, "continuous range");
+ v.play();
+ // We have nothing to play, waiting will be fired.
+ return waitUntilTime(v, 1.5);
+ }).then(function() {
+ return fetchAndLoad(sb, 'bipbop/bipbop_480_624kbps-video', ['init'], '.mp4');
+ }).then(function() {
+ sb.timestampOffset = 1.601666; // End of the video track buffered - time of first video sample (0.095).
+ sb.appendWindowEnd = 1.796677; // Only allow room for three extra video frames (we need 3 as this video has b-frames).
+ return fetchAndLoad(sb, 'bipbop/bipbop_480_624kbps-video', ['1'], '.m4s');
+ }).then(function() {
+ ms.endOfStream();
+ var promises = [];
+ promises.push(once(ms, "sourceended"));
+ promises.push(once(v, "playing"));
+ promises.push(once(v, "ended"));
+ return Promise.all(promises);
+ }).then(function() {
+ if(v.width, 640, "has proper width");
+ if(v.height, 480, "has proper height");
+ SimpleTest.finish();
+ });
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html b/dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html
new file mode 100644
index 000000000..f6192074a
--- /dev/null
+++ b/dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute before end of stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 67833));
+ });
+
+ var target = 2;
+
+ v.addEventListener("loadeddata", function onloadeddata() {
+ v.removeEventListener("loadeddata", onloadeddata);
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "readyState is >= CURRENT_DATA");
+ v.currentTime = target;
+ });
+
+ v.addEventListener("seeking", function () {
+ is(v.readyState, v.HAVE_METADATA, "readyState is HAVE_METADATA");
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 67833));
+ });
+ });
+
+ v.addEventListener("seeked", function () {
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek_mp4.html b/dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek_mp4.html
new file mode 100644
index 000000000..fc3ef06eb
--- /dev/null
+++ b/dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek_mp4.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute before end of stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ // 25819 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 25819));
+ });
+
+ var target = 1.3;
+
+ v.addEventListener("loadeddata", function onloadeddata() {
+ v.removeEventListener("loadeddata", onloadeddata);
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "readyState is >= CURRENT_DATA");
+ v.currentTime = target;
+ });
+
+ v.addEventListener("seeking", function () {
+ is(v.readyState, v.HAVE_METADATA, "readyState is HAVE_METADATA");
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ // 25819 is the offset of the first media segment's end
+ sb.addEventListener("updateend", function () {
+ ms.endOfStream();
+ });
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 25819));
+ });
+ });
+
+ v.addEventListener("seeked", function () {
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_LiveSeekable.html b/dom/media/mediasource/test/test_LiveSeekable.html
new file mode 100644
index 000000000..6abc42450
--- /dev/null
+++ b/dom/media/mediasource/test/test_LiveSeekable.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: live seekable range</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+ // Load data with a +2 offset so that we can distinguish buffered range start
+ // and seekable range start.
+ sb.timestampOffset = 2;
+ var promises = [];
+ promises.push(fetchAndLoad(sb, 'seek', [''], '.webm'));
+ promises.push(once(v, "loadedmetadata"));
+ Promise.all(promises)
+ .then(function() {
+ ms.duration = Infinity;
+ sb.abort();
+ is(sb.buffered.length, 1, "continuous buffered range");
+ is(sb.buffered.start(0), 2, "buffered range start at timestamp offset");
+ is(sb.buffered.end(0), 6.001, "buffered range end at original duration + timestamp offset");
+ is(v.seekable.length, 1, "continuous seekable range");
+ is(v.seekable.start(0), 0, "seekable range start at 0");
+ is(v.seekable.end(0), sb.buffered.end(0), "seekable range end at buffered end");
+
+ // LiveSeekableRange.start < buffered.start
+ ms.setLiveSeekableRange(1, 5);
+ is(v.seekable.length, 1, "continuous seekable range");
+ is(v.seekable.start(0), 1, "seekable range start at live range start");
+ is(v.seekable.end(0), sb.buffered.end(0), "seekable range end at buffered end");
+
+ ms.clearLiveSeekableRange();
+ ok(v.seekable.length, 1, "continuous seekable range");
+ is(v.seekable.start(0), 0, "seekable range start at 0");
+ is(v.seekable.end(0), sb.buffered.end(0), "seekable range end at buffered end");
+
+ // LiveSeekableRange.end > buffered.end
+ ms.setLiveSeekableRange(1, 8);
+ is(v.seekable.start(0), 1, "seekable range start at live range start");
+ is(v.seekable.end(0), 8, "seekable range end at live range end");
+
+ // LiveSeekableRange.start > buffered.start
+ // LiveSeekableRange.end < buffered.end
+ ms.setLiveSeekableRange(3, 5);
+ is(v.seekable.start(0), sb.buffered.start(0), "seekable range start at buffered start");
+ is(v.seekable.end(0), sb.buffered.end(0), "seekable range end at live range end");
+
+ // LiveSeekableRange.start > buffered.end
+ ms.setLiveSeekableRange(8, 10);
+ is(v.seekable.start(0), sb.buffered.start(0), "seekable range start at buffered start");
+ is(v.seekable.end(0), 10, "seekable range end at live range end");
+
+ // LiveSeekableRange.end < buffered.start
+ ms.setLiveSeekableRange(0, 2);
+ is(v.seekable.start(0), 0, "seekable range start at live range start");
+ is(v.seekable.end(0), sb.buffered.end(0), "seekable range end at buffered end");
+
+ try {
+ ms.setLiveSeekableRange(2, 0);
+ ok(false, "start > end");
+ } catch (e) { ok(true, "must thow if start > end"); }
+
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_LoadedDataFired_mp4.html b/dom/media/mediasource/test/test_LoadedDataFired_mp4.html
new file mode 100644
index 000000000..9b15c8063
--- /dev/null
+++ b/dom/media/mediasource/test/test_LoadedDataFired_mp4.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: Check that playback only starts once we have data at time = 0</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ el.addEventListener("loadeddata", function() {
+ ok(el.buffered.length > 0, "data is buffered");
+ is(el.buffered.start(0), 0, "must fire loadeddata when data has been loaded");
+ is(el.currentTime, 0, "must fire loadeddata at start");
+ });
+ el.addEventListener("playing", function() {
+ ok(el.buffered.length > 0, "data is buffered");
+ is(el.buffered.start(0), 0, "must fire playing when data has been loaded");
+ ok(el.currentTime >= 0, "must have started playback");
+ });
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ is(el.readyState, el.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(once.bind(null, el, "loadedmetadata"))
+ .then(function() {
+ videosb.appendWindowStart = 2;
+ videosb.appendWindowEnd = 4;
+ is(el.readyState, el.HAVE_METADATA, "readyState is HAVE_METADATA");
+ // Load [2.4, 3.968344). 2.4 as it's the first keyframe after 2s and
+ // 3.968344 as the last frame ends after 4s.
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(1, 8), '.m4s');
+ })
+ .then(function() {
+ is(el.readyState, el.HAVE_METADATA, "readyState is HAVE_METADATA");
+ // test that appendWindowEnd did its job.
+ ok(el.buffered.start(0) >= 2, "no data can be found prior appendWindowStart");
+ ok(el.buffered.end(el.buffered.length-1) <= 4, "no data can be found beyond appendWindowEnd");
+ el.play();
+ return once(el, "play");
+ })
+ .then(function() {
+ videosb.appendWindowStart = 0;
+ var promises = [];
+ // Load [0, 3.971666).
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(1, 8), '.m4s'));
+ // playback can only start now.
+ promises.push(once(el, "playing"));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "playing");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_LoadedMetadataFired.html b/dom/media/mediasource/test/test_LoadedMetadataFired.html
new file mode 100644
index 000000000..a26590537
--- /dev/null
+++ b/dom/media/mediasource/test/test_LoadedMetadataFired.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append initialization only</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(true, "Got loadedmetadata event");
+ is(v.videoWidth, 320, "videoWidth has correct initial value");
+ is(v.videoHeight, 240, "videoHeight has correct initial value");
+ SimpleTest.finish();
+ });
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 318));
+ v.play();
+ });
+ });
+
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_LoadedMetadataFired_mp4.html b/dom/media/mediasource/test/test_LoadedMetadataFired_mp4.html
new file mode 100644
index 000000000..6d7547cf1
--- /dev/null
+++ b/dom/media/mediasource/test/test_LoadedMetadataFired_mp4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append initialization only</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(true, "Got loadedmetadata event");
+ is(v.videoWidth, 400, "videoWidth has correct initial value");
+ is(v.videoHeight, 300, "videoHeight has correct initial value");
+ SimpleTest.finish();
+ });
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 1395));
+ v.play();
+ });
+ });
+
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_MediaSource.html b/dom/media/mediasource/test/test_MediaSource.html
new file mode 100644
index 000000000..6acd243e1
--- /dev/null
+++ b/dom/media/mediasource/test/test_MediaSource.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function () {
+ SimpleTest.doesThrow(() => new SourceBuffer, "new SourceBuffer should fail");
+ SimpleTest.doesThrow(() => new SourceBufferList, "new SourceBufferList direct should fail");
+
+ var ms = new MediaSource();
+ ok(ms, "Create a MediaSource object");
+ ok(ms instanceof EventTarget, "MediaSource must be an EventTarget");
+ is(ms.readyState, "closed", "New MediaSource must be in closed state");
+
+ // Wrapper creation, tests for leaks.
+ SpecialPowers.wrap(ms);
+
+ // Set an expando to force wrapper creation, tests for leaks.
+ ms.foo = null;
+
+ var o = URL.createObjectURL(ms);
+ ok(o, "Create an objectURL from the MediaSource");
+
+ var v = document.createElement("video");
+ v.preload = "auto";
+ v.src = o;
+ document.body.appendChild(v);
+
+ var loadedmetadataCount = 0;
+ var updatestartCount = 0;
+ var updateendCount = 0;
+ var updateCount = 0;
+
+ ms.addEventListener("sourceopen", function () {
+ ok(true, "Receive a sourceopen event");
+ is(ms.readyState, "open", "MediaSource must be in open state after sourceopen");
+ var sb = ms.addSourceBuffer("video/webm");
+ ok(sb, "Create a SourceBuffer");
+ is(ms.sourceBuffers.length, 1, "MediaSource.sourceBuffers is expected length");
+ is(ms.sourceBuffers[0], sb, "SourceBuffer in list matches our SourceBuffer");
+ is(ms.activeSourceBuffers.length, 0, "MediaSource.activeSourceBuffers is expected length");
+
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ is(sb.updating, true, "SourceBuffer.updating is expected value after appendBuffer");
+ });
+
+ sb.addEventListener("update", function () {
+ is(sb.updating, false, "SourceBuffer.updating is expected value in update event");
+ updateCount++;
+ /* Ensure that we endOfStream on the first update event only as endOfStream can
+ raise more if the duration of the last buffered range and the intial duration
+ differ. See bug 1065207 */
+ if (updateCount == 1) {
+ ms.endOfStream();
+ }
+ });
+
+ sb.addEventListener("updatestart", function () {
+ updatestartCount++;
+ });
+
+ sb.addEventListener("updateend", function () {
+ is(ms.activeSourceBuffers[0], sb, "SourceBuffer in active list matches our SourceBuffer");
+ is(sb.updating, false, "SourceBuffer.updating is expected value in updateend event");
+ updateendCount++;
+ v.play();
+ });
+ });
+
+ ms.addEventListener("sourceended", function () {
+ ok(true, "Receive a sourceended event");
+ is(ms.readyState, "ended", "MediaSource must be in ended state after sourceended");
+ });
+
+ v.addEventListener("loadedmetadata", function () {
+ loadedmetadataCount++;
+ });
+
+ v.addEventListener("ended", function () {
+ // XXX: Duration should be exactly 4.0, see bug 1065207.
+ ok(Math.abs(v.duration - 4) <= 0.002, "Video has correct duration");
+ ok(Math.abs(v.currentTime - 4) <= 0.002, "Video has played to end");
+ // XXX: 2 update events can be received dueto duration differences, see bug 1065207.
+ ok(updateCount == 1 || updateCount == 2, "update event received");
+ ok(updateendCount == 1 || updateendCount == 2, "updateend event received");
+ ok(updatestartCount == 1 || updatestartCount == 2, "updatestart event received");
+ is(loadedmetadataCount, 1, "loadedmetadata event received");
+ v.parentNode.removeChild(v);
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_MediaSource_disabled.html b/dom/media/mediasource/test/test_MediaSource_disabled.html
new file mode 100644
index 000000000..ccf36914a
--- /dev/null
+++ b/dom/media/mediasource/test/test_MediaSource_disabled.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: disabling via pref</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function test() {
+ ok(!window.MediaSource && !window.SourceBuffer && !window.SourceBufferList,
+ "MediaSource should be hidden behind a pref");
+ SimpleTest.doesThrow(() => new MediaSource,
+ "MediaSource should be hidden behind a pref");
+ SimpleTest.finish();
+}
+
+SpecialPowers.pushPrefEnv({"set":
+ [
+ ["media.mediasource.enabled", false],
+ ]
+ },
+ test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_MediaSource_memory_reporting.html b/dom/media/mediasource/test/test_MediaSource_memory_reporting.html
new file mode 100644
index 000000000..278b8760d
--- /dev/null
+++ b/dom/media/mediasource/test/test_MediaSource_memory_reporting.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: memory reporting</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ // Test that memory reporting works once we've played a video.
+ once(v, "stalled", () => {
+ // Grab a memory report.
+ var mgr = SpecialPowers.Cc["@mozilla.org/memory-reporter-manager;1"]
+ .getService(SpecialPowers.Ci.nsIMemoryReporterManager);
+
+ var amount = 0;
+ var resourcesPathSeen = false;
+ var handleReport = function(aProcess, aPath, aKind, aUnits, aAmount, aDesc) {
+ if (aPath == "explicit/media/resources") {
+ resourcePathSeen = true;
+ amount += aAmount;
+ }
+ }
+
+ var finished = function () {
+ ok(true, "Yay didn't crash!");
+ ok(resourcePathSeen, "Got media resources amount");
+ ok(amount > 0, "Non-zero amount reported for media resources");
+ SimpleTest.finish();
+ }
+
+ mgr.getReports(handleReport, null, finished, null, /* anonymized = */ false);
+ });
+
+ // Load a webm video and play it.
+ ms.addEventListener("sourceopen", () => {
+ var sb = ms.addSourceBuffer("video/webm");
+ fetchAndLoad(sb, 'seek', [''], '.webm').then(() => v.play());
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_MediaSource_mp4.html b/dom/media/mediasource/test/test_MediaSource_mp4.html
new file mode 100644
index 000000000..fc5ac2895
--- /dev/null
+++ b/dom/media/mediasource/test/test_MediaSource_mp4.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function () {
+ SimpleTest.doesThrow(() => new SourceBuffer, "new SourceBuffer should fail");
+ SimpleTest.doesThrow(() => new SourceBufferList, "new SourceBufferList direct should fail");
+
+ var ms = new MediaSource();
+ ok(ms, "Create a MediaSource object");
+ ok(ms instanceof EventTarget, "MediaSource must be an EventTarget");
+ is(ms.readyState, "closed", "New MediaSource must be in closed state");
+
+ // Wrapper creation, tests for leaks.
+ SpecialPowers.wrap(ms);
+
+ // Set an expando to force wrapper creation, tests for leaks.
+ ms.foo = null;
+
+ var o = URL.createObjectURL(ms);
+ ok(o, "Create an objectURL from the MediaSource");
+
+ var v = document.createElement("video");
+ v.preload = "auto";
+ v.src = o;
+ document.body.appendChild(v);
+
+ var loadedmetadataCount = 0;
+ var updatestartCount = 0;
+ var updateendCount = 0;
+ var updateCount = 0;
+
+ ms.addEventListener("sourceopen", function () {
+ ok(true, "Receive a sourceopen event");
+ is(ms.readyState, "open", "MediaSource must be in open state after sourceopen");
+ var sb = ms.addSourceBuffer("video/mp4");
+ ok(sb, "Create a SourceBuffer");
+ is(ms.sourceBuffers.length, 1, "MediaSource.sourceBuffers is expected length");
+ is(ms.sourceBuffers[0], sb, "SourceBuffer in list matches our SourceBuffer");
+ is(ms.activeSourceBuffers.length, 0, "MediaSource.activeSourceBuffers is expected length");
+
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ is(sb.updating, true, "SourceBuffer.updating is expected value after appendBuffer");
+ });
+
+ sb.addEventListener("update", function () {
+ is(sb.updating, false, "SourceBuffer.updating is expected value in update event");
+ updateCount++;
+ /* Ensure that we endOfStream on the first update event only as endOfStream can
+ raise more if the duration of the last buffered range and the intial duration
+ differ. See bug 1065207 */
+ if (updateCount == 1) {
+ ms.endOfStream();
+ }
+ });
+
+ sb.addEventListener("updatestart", function () {
+ updatestartCount++;
+ });
+
+ sb.addEventListener("updateend", function () {
+ is(ms.activeSourceBuffers[0], sb, "SourceBuffer in active list matches our SourceBuffer");
+ is(sb.updating, false, "SourceBuffer.updating is expected value in updateend event");
+ updateendCount++;
+ v.play();
+ });
+ });
+
+ ms.addEventListener("sourceended", function () {
+ ok(true, "Receive a sourceended event");
+ is(ms.readyState, "ended", "MediaSource must be in ended state after sourceended");
+ });
+
+ v.addEventListener("loadedmetadata", function () {
+ loadedmetadataCount++;
+ });
+
+ v.addEventListener("ended", function () {
+ // The bipbop video doesn't start at 0. The old MSE code adjust the
+ // timestamps and ignore the audio track. The new one doesn't.
+ isfuzzy(v.duration, 1.696, 0.166, "Video has correct duration");
+ isfuzzy(v.currentTime, 1.696, 0.166, "Video has correct duration");
+ // XXX: 2 update events can be received dueto duration differences, see bug 1065207.
+ ok(updateCount == 1 || updateCount == 2, "update event received");
+ ok(updateendCount == 1 || updateendCount == 2, "updateend event received");
+ ok(updatestartCount == 1 || updatestartCount == 2, "updatestart event received");
+ is(loadedmetadataCount, 1, "loadedmetadata event received");
+ v.parentNode.removeChild(v);
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_MultipleInitSegments.html b/dom/media/mediasource/test/test_MultipleInitSegments.html
new file mode 100644
index 000000000..d97d72dae
--- /dev/null
+++ b/dom/media/mediasource/test/test_MultipleInitSegments.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Append buffer with multiple init segments</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+ fetchWithXHR("seek_lowres.webm", function (seek_lowres) {
+ fetchWithXHR("seek.webm", function (seek) {
+ var data = [
+ [seek_lowres, 0, 438], // lowres init segment
+ [seek_lowres, 438, 25950], // lowres media segment 0-1
+ [seek, 0, 318], // init segment
+ [seek, 46712, 67833] // media segment 0.8-1.201
+ ];
+ var length = data.map(d => d[2] - d[1]).reduce((a, b) => a + b);
+ var arrayBuffer = new Uint8Array(length);
+ var pos = 0;
+ data.forEach(function(d) {
+ var buffer = new Uint8Array(d[0], d[1], d[2]-d[1]);
+ arrayBuffer.set(buffer, pos);
+ pos += buffer.byteLength;
+ });
+ loadSegment.bind(null, sb, arrayBuffer)().then(function() {
+ // Since we are passing multiple segments in one buffer,
+ // the first durationchange event from parsing the init
+ // segment will be fired before updateend.
+ v.addEventListener("durationchange", function () {
+ ok(v.duration, 1.201);
+ SimpleTest.finish();
+ });
+ ms.endOfStream();
+ });
+ });
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_MultipleInitSegments_mp4.html b/dom/media/mediasource/test/test_MultipleInitSegments_mp4.html
new file mode 100644
index 000000000..8b1a8c7b7
--- /dev/null
+++ b/dom/media/mediasource/test/test_MultipleInitSegments_mp4.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Append buffer with multiple init segments</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+ fetchWithXHR("bipbop/bipbop_videoinit.mp4", function (init) {
+ init = new Uint8Array(init);
+ fetchWithXHR("bipbop/bipbop_video1.m4s", function (segment1) {
+ segment1 = new Uint8Array(segment1);
+ fetchWithXHR("bipbop/bipbop_video2.m4s", function (segment2) {
+ segment2 = new Uint8Array(segment2);
+ var data = [init, segment1, init, segment2];
+ var length = data.map(d => d.byteLength).reduce((a, b) => a + b);
+ var arrayBuffer = new Uint8Array(length);
+ var pos = 0;
+ data.forEach(function(buffer) {
+ arrayBuffer.set(buffer, pos);
+ pos += buffer.byteLength;
+ });
+ loadSegment.bind(null, sb, arrayBuffer)().then(function() {
+ // Since we are passing multiple segments in one buffer,
+ // the first durationchange event from parsing the init
+ // segment will be fired before updateend.
+ v.addEventListener("durationchange", function () {
+ ok(v.duration, 1.601666);
+ SimpleTest.finish();
+ });
+ ms.endOfStream();
+ });
+ });
+ });
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_OnEvents.html b/dom/media/mediasource/test/test_OnEvents.html
new file mode 100644
index 000000000..1290e33f1
--- /dev/null
+++ b/dom/media/mediasource/test/test_OnEvents.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: live seekable range</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ function initEvent(e) {
+ v['got' + e] = false;
+ }
+ function receiveEvent(e) {
+ v['got' + e] = true;
+ }
+ var msevents = ["onsourceopen", "onsourceended"];
+ msevents.forEach(function(e) {
+ initEvent(e);
+ ms[e] = function() { receiveEvent(e); };
+ });
+
+ var sblistevents = ["onaddsourcebuffer", "onremovesourcebuffer"];
+ sblistevents.forEach(function(e) {
+ initEvent(e);
+ ms.sourceBuffers[e] = function() { receiveEvent(e); };
+ });
+
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ var sbevents = ["onupdatestart", "onupdate", "onupdateend", "onabort"];
+ sbevents.forEach(function(e) {
+ initEvent(e);
+ sb[e] = function() { receiveEvent(e); };
+ });
+
+ fetchAndLoad(sb, 'seek', [''], '.webm')
+ .then(function() {
+ fetchWithXHR('seek.webm')
+ .then(function(arrayBuffer) {
+ sb.appendBuffer(arrayBuffer);
+ ms.removeSourceBuffer(sb); // will fire abort and removesourcebuffer
+ ms.endOfStream(); // will fire sourceended
+ once(ms, "sourceended").then(function() {
+ var events = ["onsourceopen", "onsourceended", "onupdatestart", "onupdate", "onupdateend", "onabort", "onaddsourcebuffer", "onremovesourcebuffer"];
+ events.forEach(function(e) {
+ ok(v['got' + e], "got " + e);
+ });
+ SimpleTest.finish();
+ });
+ });
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_PlayEvents.html b/dom/media/mediasource/test/test_PlayEvents.html
new file mode 100644
index 000000000..a390ae247
--- /dev/null
+++ b/dom/media/mediasource/test/test_PlayEvents.html
@@ -0,0 +1,165 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// This test checks that readyState is properly set and the appropriate events are being fired accordingly:
+// 1. Load 1.6s of data and ensure that canplay event is fired.
+// 2. Load data to have a complete buffered range from 0 to duration and ensure that canplaythrough is fired.
+// 3. Seek to an area with no buffered data, and ensure that readyState goes back to HAVE_METADATA
+// 4. Load 1.6s of data at the seek position and ensure that canplay is fired and that readyState is now HAVE_FUTURE_DATA
+// 5. Start playing video and check that once it reaches a position with no data, readyState goes back to HAVE_CURRENT_DATA and waiting event is fired.
+// 6. Add 1.6s of data once video element fired waiting, that canplay is fired once readyState is HAVE_FUTURE_DATA.
+// 7. Finally load data to the end and ensure that canplaythrough is fired and that readyState is now HAVE_ENOUGH_DATA
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause", "durationchange", "seeking", "seeked"];
+ function logEvent(e) {
+ var v = e.target;
+ info("got " + e.type + " event");
+ }
+ events.forEach(function(e) {
+ el.addEventListener(e, logEvent, false);
+ });
+
+ ok(true, "Receive a sourceopen event");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ el.addEventListener("error", function(e) {
+ ok(false, "should not fire '" + e + "' event");
+ });
+ is(el.readyState, el.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(once.bind(null, el, 'loadedmetadata'))
+ .then(function() {
+ ok(true, "got loadedmetadata event");
+ var promises = [];
+ promises.push(once(el, 'loadeddata'));
+ promises.push(once(el, 'canplay'));
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(1, 3), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got canplay event");
+ // set element duration to 3.203333s. We do so in order to guarantee that
+ // the end of the buffered range will be equal to duration, causing
+ // canplaythrough to be fired later.
+ ms.duration = 3.203333;
+ return once(el, 'durationchange');
+ })
+ .then(function() {
+ ok(true, "got durationchange event");
+ var promises = [];
+ promises.push(once(el, 'canplaythrough'));
+ // Load [0.801666, 3.203333]
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(3, 5), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got canplaythrough event");
+ // set element duration to 9.203333s, this value is set to coincide with
+ // data added later (we now have an empty range from 6s to 9.203333s).
+ ms.duration = 9.203333;
+ return once(el, 'durationchange');
+ })
+ .then(function() {
+ ok(true, "got durationchange event");
+ // An arbitrary value, so we are guaranteed to be in a range with no data.
+ el.currentTime = 6;
+ videosb.timestampOffset = 6;
+ ok(el.seeking, "seeking started");
+ return once(el, 'seeking');
+ })
+ .then(function() {
+ ok(true, "got seeking event");
+ is(el.readyState, el.HAVE_METADATA, "readyState is HAVE_METADATA");
+ var promises = [];
+ promises.push(once(el, 'seeked'));
+ promises.push(once(el, 'canplay'));
+ // Load [6+0, 6+1.601666)
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(1, 3), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got seeked and canplay event");
+ is(el.currentTime, 6, "seeked to 6s");
+ is(el.readyState, el.HAVE_FUTURE_DATA, "readyState is HAVE_FUTURE_DATA");
+ var promises = [];
+ promises.push(once(el, 'canplaythrough'));
+ // Load [6+1.60166, 6+3.203333]
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(3, 5), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got canplaythrough event");
+ // set element duration to 19.805s, this value is set to coincide with
+ // data added later (we now have an empty range from 15 to 19.805).
+ ms.duration = 19.805;
+ return once(el, 'durationchange');
+ })
+ .then(function() {
+ ok(true, "got durationchange event");
+ el.currentTime = 15;
+ videosb.timestampOffset = 15;
+ ok(el.seeking, "seeking started");
+ return once(el, 'seeking');
+ })
+ .then(function() {
+ ok(true, "got seeking event");
+ var promises = [];
+ promises.push(once(el, 'seeked'));
+ // Load [15+0, 15+1.601666)
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(1, 3), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got seeked event");
+ // Load [15+1.60166, 15+3.203333]
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(3, 5), '.m4s');
+ })
+ .then(function() {
+ ok(true, "data loaded");
+ // Playback we play for a little while then stall.
+ var promises = [];
+ promises.push(once(el, 'playing'));
+ promises.push(once(el, 'waiting'));
+ el.play();
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got playing and waiting event");
+ // Playback has stalled, readyState is back to HAVE_CURRENT_DATA.
+ is(el.readyState, el.HAVE_CURRENT_DATA, "readyState is HAVE_CURRENT_DATA");
+ var promises = [];
+ promises.push(once(el, 'playing'));
+ promises.push(once(el, 'canplay'));
+ promises.push(once(el, 'canplaythrough'));
+ // Load [15+3.203333, 15+4.805)
+ // Our final buffered range will now be [0, 3.203333)[6, 9.203333)[15, 19.805)
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(5, 7), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "got playing, canplay and canplaythrough event");
+ SimpleTest.finish();
+ })
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html b/dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html
new file mode 100644
index 000000000..b6769cb1b
--- /dev/null
+++ b/dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Don't get stuck buffering for too long when we have frames to show</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var receivedSourceOpen = false;
+runWithMSE(function(ms, v) {
+ ms.addEventListener("sourceopen", function() {
+ ok(true, "Receive a sourceopen event");
+ ok(!receivedSourceOpen, "Should only receive one sourceopen for this test");
+ receivedSourceOpen = true;
+ var sb = ms.addSourceBuffer("video/mp4");
+ ok(sb, "Create a SourceBuffer");
+
+ sb.addEventListener('error', (e) => { ok(false, "Got Error: " + e); SimpleTest.finish(); });
+ fetchAndLoad(sb, 'bipbop/bipbop', ['init'], '.mp4')
+ .then(function() {
+ var promises = [];
+ promises.push(fetchAndLoad(sb, 'bipbop/bipbop', range(1,3), '.m4s'));
+ promises.push(once(v, "loadeddata"));
+ return Promise.all(promises);
+ }).then(function() {
+ // clear the entire sourcebuffer.
+ sb.remove(0, 5);
+ return once(sb, "updateend");
+ }).then(function() {
+ v.play();
+ // We have nothing to play, waiting will be fired.
+ return once(v, "waiting");
+ }).then(function() {
+ var promises = [];
+ promises.push(once(v, "playing"));
+ promises.push(fetchAndLoad(sb, 'bipbop/bipbop', range(1,4), '.m4s'));
+ return Promise.all(promises);
+ }).then(function() {
+ ms.endOfStream();
+ var promises = [];
+ promises.push(once(ms, "sourceended"));
+ promises.push(once(v, "ended"));
+ return Promise.all(promises);
+ }).then(SimpleTest.finish.bind(SimpleTest));
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekNoData_mp4.html b/dom/media/mediasource/test/test_SeekNoData_mp4.html
new file mode 100644
index 000000000..efebff954
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekNoData_mp4.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// Avoid making trouble for people who fix rounding bugs.
+function fuzzyEquals(a, b) {
+ return Math.abs(a - b) < 0.01;
+}
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ el.addEventListener("error", function(e) {
+ ok(false, "should not fire '" + e + "' event");
+ });
+ is(el.readyState, el.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ try {
+ el.currentTime = 3;
+ } catch (e) {
+ ok(false, "should not throw '" + e + "' exception");
+ }
+ is(el.currentTime, 3, "currentTime is default playback start position");
+ is(el.seeking, false, "seek not started with HAVE_NOTHING");
+ fetchAndLoad(audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', ['init'], '.mp4'))
+ .then(once.bind(null, el, 'loadedmetadata'))
+ .then(function() {
+ var p = once(el, 'seeking');
+ el.play();
+ el.currentTime = 5;
+ is(el.readyState, el.HAVE_METADATA, "readyState is HAVE_METADATA");
+ is(el.seeking, true, "seek not started with HAVE_METADATA");
+ is(el.currentTime, 5, "currentTime is seek position");
+ return p;
+ })
+ .then(function() {
+ ok(true, "Got seeking event");
+ var promises = [];
+ promises.push(once(el, 'seeked'));
+ promises.push(fetchAndLoad(audiosb, 'bipbop/bipbop_audio', range(5, 9), '.m4s'));
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', range(6, 10), '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "Got seeked event");
+ ok(el.currentTime >= 5, "Time >= 5");
+ once(el, 'ended').then(SimpleTest.finish.bind(SimpleTest));
+ ms.endOfStream();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekToEnd_mp4.html b/dom/media/mediasource/test/test_SeekToEnd_mp4.html
new file mode 100644
index 000000000..2ffa53898
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekToEnd_mp4.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seeking to end of data with data gap.</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 6), '.m4s'))
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4'))
+ .then(function() {
+ is(videosb.buffered.length, 1, "continuous buffered range");
+ // Ensure we have at least 2s less audio than video.
+ audiosb.appendWindowEnd = videosb.buffered.end(0) - 2;
+ return fetchAndLoad(audiosb, 'bipbop/bipbop_audio', range(1, 6), '.m4s');
+ }).then(function() {
+ ms.endOfStream();
+ return Promise.all([once(el, "durationchange"), once(ms, "sourceended")]);
+ }).then(function() {
+ ok(true, "endOfStream completed");
+ // Seek to the middle of the gap where audio is missing. As we are in readyState = ended
+ // seeking must complete.
+ el.currentTime = videosb.buffered.end(0) / 2 + audiosb.buffered.end(0) / 2;
+ ok(el.currentTime - audiosb.buffered.end(0) > 1, "gap is big enough");
+ is(el.buffered.length, 1, "continuous buffered range");
+ is(el.buffered.end(0), videosb.buffered.end(0), "buffered range end is aligned with longest track");
+ ok(el.seeking, "element is now seeking");
+ ok(el.currentTime >= el.buffered.start(0) && el.currentTime <= el.buffered.end(0), "seeking time is in buffered range");
+ ok(el.currentTime > audiosb.buffered.end(0), "seeking point is not buffered in audio track");
+ return once(el, 'seeked');
+ }).then(function() {
+ ok(true, "we have successfully seeked");
+ // Now ensure that we can play to the end, even though we are missing data in one track.
+ el.play();
+ once(el, 'ended').then(SimpleTest.finish.bind(SimpleTest));
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekTwice_mp4.html b/dom/media/mediasource/test/test_SeekTwice_mp4.html
new file mode 100644
index 000000000..dd250185f
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekTwice_mp4.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// Avoid making trouble for people who fix rounding bugs.
+function fuzzyEquals(a, b) {
+ return Math.abs(a - b) < 0.01;
+}
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ fetchAndLoad(audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', range(1, 5), '.m4s'))
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', range(6, 12), '.m4s'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', ['init'], '.mp4'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 6), '.m4s'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(7, 14), '.m4s'))
+ .then(function() {
+ var p = once(el, 'seeking');
+ el.play();
+ el.currentTime = 4.5; // Seek to a gap in the video
+ return p;
+ }).then(function() {
+ ok(true, "Got seeking event");
+ var p = once(el, 'seeked');
+ el.currentTime = 6; // Seek past the gap.
+ return p;
+ }).then(function() {
+ ok(true, "Got seeked event");
+ ok(el.currentTime >= 6, "Time >= 6");
+ once(el, 'ended').then(SimpleTest.finish.bind(SimpleTest));
+ ms.endOfStream();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableAfterEndOfStream.html b/dom/media/mediasource/test/test_SeekableAfterEndOfStream.html
new file mode 100644
index 000000000..850434429
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableAfterEndOfStream.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute after end of stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ /* Ensure that we endOfStream on the first update event only as endOfStream can
+ raise more if the duration of the last buffered range and the intial duration
+ differ. See bug 1065207 */
+ if (updateCount == 1) {
+ ms.endOfStream();
+ };
+ });
+ });
+
+ var target = 2;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit.html b/dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit.html
new file mode 100644
index 000000000..3aad2a0af
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute after end of stream with split appendBuffer</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ // 25523 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 25523));
+ var updateCount = 0;
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ if (updateCount == 1) {
+ // 25523 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 25523));
+ }
+ else if (updateCount == 2) {
+ ms.endOfStream();
+ }
+ });
+ });
+
+ var target = 2;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit_mp4.html b/dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit_mp4.html
new file mode 100644
index 000000000..0933087a7
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableAfterEndOfStreamSplit_mp4.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute after end of stream with split appendBuffer</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ // 25819 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 25819));
+ var updateCount = 0;
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ if (updateCount == 1) {
+ // 25819 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 25819));
+ }
+ else if (updateCount == 2) {
+ ms.endOfStream();
+ }
+ });
+ });
+
+ var target = 1.3;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableAfterEndOfStream_mp4.html b/dom/media/mediasource/test/test_SeekableAfterEndOfStream_mp4.html
new file mode 100644
index 000000000..7adadad85
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableAfterEndOfStream_mp4.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute after end of stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ /* Ensure that we endOfStream on the first update event only as endOfStream can
+ raise more if the duration of the last buffered range and the intial duration
+ differ. See bug 1065207 */
+ if (updateCount == 1) {
+ ms.endOfStream();
+ };
+ });
+ });
+
+ var target = 1.3;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableBeforeEndOfStream.html b/dom/media/mediasource/test/test_SeekableBeforeEndOfStream.html
new file mode 100644
index 000000000..49401d213
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableBeforeEndOfStream.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute before end of stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ });
+
+ var target = 2;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html b/dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html
new file mode 100644
index 000000000..2013fb4e6
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute before end of stream with split appendBuffer</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 25523));
+ sb.addEventListener("updateend", function () {
+ sb.removeEventListener('updateend', arguments.callee);
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 25523));
+ });
+ });
+
+ var target = 2;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit_mp4.html b/dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit_mp4.html
new file mode 100644
index 000000000..f14669665
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit_mp4.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute before end of stream with split appendBuffer</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ // 25819 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 25819));
+ sb.addEventListener("updateend", function () {
+ sb.removeEventListener('updateend', arguments.callee);
+ // 25819 is the offset of the first media segment's end
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 25819));
+ });
+ });
+
+ var target = 1.3;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekableBeforeEndOfStream_mp4.html b/dom/media/mediasource/test/test_SeekableBeforeEndOfStream_mp4.html
new file mode 100644
index 000000000..cc06ff00d
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekableBeforeEndOfStream_mp4.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: seekable attribute before end of stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ });
+
+ var target = 1.3;
+
+ v.addEventListener("loadedmetadata", function () {
+ ok(v.seekable.length, "Resource is seekable");
+ ok(v.seekable.length &&
+ target >= v.seekable.start(0) &&
+ target < v.seekable.end(0), "Target is within seekable range");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SeekedEvent_mp4.html b/dom/media/mediasource/test/test_SeekedEvent_mp4.html
new file mode 100644
index 000000000..f80ae86f5
--- /dev/null
+++ b/dom/media/mediasource/test/test_SeekedEvent_mp4.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: Check that seeked event is fired prior loadeddata</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ el._seeked = false;
+ el._loadeddata = false;
+ el._playing = false;
+ el.addEventListener("seeked", function() {
+ ok(true, "got seeked event");
+ is(el._loadeddata, false, "can't have received loadeddata prior seeked");
+ is(el._playing, false, "can't be playing prior seeked");
+ el._seeked = true;
+ });
+ el.addEventListener("loadeddata", function() {
+ ok(true, "got loadeddata event");
+ is(el._seeked, true, "must have received seeked prior loadeddata");
+ is(el._playing, false, "can't be playing prior playing");
+ el._loadeddata = true;
+ });
+ el.addEventListener("playing", function() {
+ ok(true, "got playing");
+ is(el._seeked, true, "must have received seeked prior playing");
+ is(el._loadeddata, true, "must have received loadeddata prior playing");
+ el._playing = true;
+ });
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ is(el.readyState, el.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(once.bind(null, el, "loadedmetadata"))
+ .then(function() {
+ el.play();
+ videosb.timestampOffset = 2;
+ is(el.readyState, el.HAVE_METADATA, "readyState is HAVE_METADATA");
+ // Load [2, 3.606).
+ var promises = [];
+ promises.push(once(el, "play"));
+ promises.push(fetchAndLoad(videosb, 'bipbop/bipbop_video', ['1'], '.m4s'));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', ['2'], '.m4s');
+ })
+ .then(function() {
+ is(el.readyState, el.HAVE_METADATA, "readyState is HAVE_METADATA");
+ el.currentTime = 2;
+ var promises = [];
+ promises.push(once(el, "seeked"));
+ promises.push(once(el, "playing"));
+ return Promise.all(promises);
+ })
+ .then(function() {
+ ok(true, "completed seek");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_Sequence_mp4.html b/dom/media/mediasource/test/test_Sequence_mp4.html
new file mode 100644
index 000000000..a68393547
--- /dev/null
+++ b/dom/media/mediasource/test/test_Sequence_mp4.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: Don't get stuck buffering for too long when we have frames to show</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var receivedSourceOpen = false;
+runWithMSE(function(ms, v) {
+ ms.addEventListener("sourceopen", function() {
+ ok(true, "Receive a sourceopen event");
+ ok(!receivedSourceOpen, "Should only receive one sourceopen for this test");
+ receivedSourceOpen = true;
+ var sb = ms.addSourceBuffer("video/mp4");
+ ok(sb, "Create a SourceBuffer");
+ sb.addEventListener('error', (e) => { ok(false, "Got Error: " + e); SimpleTest.finish(); });
+ sb.mode = 'sequence';
+
+ fetchAndLoad(sb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, sb, 'bipbop/bipbop_video', ['5'], '.m4s'))
+ .then(fetchAndLoad.bind(null, sb, 'bipbop/bipbop_video', ['2'], '.m4s'))
+ .then(function() {
+ is(v.buffered.length, 1, "Continuous buffered range");
+ is(v.buffered.start(0), 0, "Buffered range starts at 0");
+ ok(sb.timestampOffset > 0, "SourceBuffer.timestampOffset set to allow continuous range");
+ SimpleTest.finish();
+ });
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SetModeThrows.html b/dom/media/mediasource/test/test_SetModeThrows.html
new file mode 100644
index 000000000..ce8f955cd
--- /dev/null
+++ b/dom/media/mediasource/test/test_SetModeThrows.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append initialization</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// MSE supports setting mode now. make sure it does not throw.
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ sb.mode = "segments";
+ ok("true", "Setting to segments does not throw");
+ try {
+ sb.mode = "sequence";
+ ok("true", "Setting to sequence does not throw");
+ } catch (e) { ok(false, "Should not throw setting mode to sequence: " + e); }
+
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SplitAppend.html b/dom/media/mediasource/test/test_SplitAppend.html
new file mode 100644
index 000000000..e87bd00ed
--- /dev/null
+++ b/dom/media/mediasource/test/test_SplitAppend.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append initialization and media segment separately</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 318));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ if (updateCount == 1) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 318));
+ }
+ else if (updateCount == 2) {
+ ms.endOfStream();
+ }
+ });
+ v.play();
+ });
+ });
+
+ v.addEventListener("ended", function () {
+ // XXX: Duration should be exactly 4.0, see bug 1065207.
+ ok(Math.abs(v.duration - 4) <= 0.002, "Video has correct duration");
+ ok(Math.abs(v.currentTime - 4) <= 0.002, "Video has played to end");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SplitAppendDelay.html b/dom/media/mediasource/test/test_SplitAppendDelay.html
new file mode 100644
index 000000000..c5d443e80
--- /dev/null
+++ b/dom/media/mediasource/test/test_SplitAppendDelay.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append segments with delay</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("untriaged");
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 318));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ if (updateCount == 1) {
+ window.setTimeout(function () {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 318));
+ }, 1000);
+ }
+ else if (updateCount == 2) {
+ ms.endOfStream();
+ }
+ });
+ v.play();
+ });
+ });
+
+ v.addEventListener("ended", function () {
+ // XXX: Duration should be exactly 4.0, see bug 1065207.
+ ok(Math.abs(v.duration - 4) <= 0.002, "Video has correct duration");
+ ok(Math.abs(v.currentTime - 4) <= 0.002, "Video has played to end");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SplitAppendDelay_mp4.html b/dom/media/mediasource/test/test_SplitAppendDelay_mp4.html
new file mode 100644
index 000000000..d48e63324
--- /dev/null
+++ b/dom/media/mediasource/test/test_SplitAppendDelay_mp4.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append segments with delay</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("untriaged");
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 1395));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ if (updateCount == 1) {
+ window.setTimeout(function () {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 1395));
+ }, 1000);
+ }
+ else if (updateCount == 2) {
+ ms.endOfStream();
+ }
+ });
+ v.play();
+ });
+ });
+
+ v.addEventListener("ended", function () {
+ // The bipbop video doesn't start at 0. The old MSE code adjust the
+ // timestamps and ignore the audio track. The new one doesn't.
+ isfuzzy(v.duration, 1.696, 0.166, "Video has correct duration");
+ isfuzzy(v.currentTime, 1.696, 0.166, "Video has played to end");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_SplitAppend_mp4.html b/dom/media/mediasource/test/test_SplitAppend_mp4.html
new file mode 100644
index 000000000..9e006e699
--- /dev/null
+++ b/dom/media/mediasource/test/test_SplitAppend_mp4.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: append initialization and media segment separately</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var updateCount = 0;
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 1395));
+ sb.addEventListener("updateend", function () {
+ updateCount++;
+ if (updateCount == 1) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer, 1395));
+ }
+ else if (updateCount == 2) {
+ ms.endOfStream();
+ }
+ });
+ v.play();
+ });
+ });
+
+ v.addEventListener("ended", function () {
+ // The bipbop video doesn't start at 0. The old MSE code adjust the
+ // timestamps and ignore the audio track. The new one doesn't.
+ isfuzzy(v.duration, 1.696, 0.166, "Video has correct duration");
+ isfuzzy(v.currentTime, 1.696, 0.166, "Video has played to end");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_Threshold_mp4.html b/dom/media/mediasource/test/test_Threshold_mp4.html
new file mode 100644
index 000000000..a33dc08ec
--- /dev/null
+++ b/dom/media/mediasource/test/test_Threshold_mp4.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: data gap detection</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+
+var threshold = 0.5; // gap threshold in seconds.
+var fuzz = 0.000001; // fuzz when comparing double.
+
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ var vchunks = [ {start: 0, end: 3.203333}, { start: 3.203333, end: 6.406666}];
+
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 5), '.m4s'))
+ .then(function() {
+ // We will insert a gap of threshold
+ videosb.timestampOffset = threshold;
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(5, 9), '.m4s');
+ }).then(function() {
+ // HTMLMediaElement fires 'waiting' if somebody invokes |play()| before the MDSM
+ // has notified it of available data. Make sure that we get 'playing' before
+ // we starting waiting for 'waiting'.
+ info("Invoking play()");
+ var p = once(el, 'playing');
+ el.play();
+ return p;
+ }).then(function() {
+ return once(el, 'waiting');
+ }).then(function() {
+ // We're waiting for data after the start of the last frame.
+ // 0.033333 is the duration of the last frame.
+ ok(el.currentTime >= vchunks[1].end - 0.033333 + threshold - fuzz
+ && el.currentTime <= vchunks[1].end + threshold + fuzz, "skipped the gap properly: " + el.currentTime + " " + (vchunks[1].end + threshold));
+ is(el.buffered.length, 2, "buffered range has right length");
+ // Now we test that seeking will succeed despite the gap.
+ el.currentTime = el.buffered.end(0) + (threshold / 2);
+ return once(el, 'seeked');
+ }).then(function() {
+ // Now we test that we don't pass the gap.
+ // Clean up our sourcebuffer by removing all data.
+ videosb.timestampOffset = 0;
+ videosb.remove(0, Infinity);
+ el.currentTime = 0;
+ el.pause();
+ return once(videosb, "updateend");
+ }).then(function() {
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(1, 5), '.m4s');
+ }).then(function() {
+ // We will insert a gap of threshold + 1ms
+ videosb.timestampOffset = threshold + 1/1000;
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(5, 9), '.m4s');
+ }).then(function() {
+ info("Invoking play()");
+ var p = once(el, 'playing');
+ el.play();
+ return p;
+ }).then(function() {
+ return once(el, 'waiting');
+ }).then(function() {
+ // We're waiting for data after the start of the last frame.
+ // 0.033333 is the duration of the last frame.
+ ok(el.currentTime >= vchunks[0].end - 0.033333 - fuzz
+ && el.currentTime <= vchunks[0].end + fuzz, "stopped at the gap properly: " + el.currentTime + " " + vchunks[0].end);
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_TimestampOffset_mp4.html b/dom/media/mediasource/test/test_TimestampOffset_mp4.html
new file mode 100644
index 000000000..2a80e3e5c
--- /dev/null
+++ b/dom/media/mediasource/test/test_TimestampOffset_mp4.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: basic functionality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function range(start, end) {
+ var rv = [];
+ for (var i = start; i < end; ++i) {
+ rv.push(i);
+ }
+ return rv;
+}
+
+var eps = 0.01;
+runWithMSE(function(ms, el) {
+
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ // We divide the video into 3 chunks:
+ // chunk 0: segments 1-4
+ // chunk 1: segments 5-8
+ // chunk 2: segments 9-13
+ // We then fill the timeline so that it seamlessly plays the chunks in order 0, 2, 1.
+ var vchunks = [ {start: 0, end: 3.2033}, { start: 3.2033, end: 6.4066}, { start: 6.4066, end: 10.01} ];
+ var firstvoffset = vchunks[2].end - vchunks[2].start; // Duration of chunk 2
+ var secondvoffset = -(vchunks[1].end - vchunks[1].start); // -(Duration of chunk 1)
+
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 5), '.m4s'))
+ .then(function() {
+ is(videosb.buffered.length, 1, "No discontinuity");
+ isfuzzy(videosb.buffered.start(0), vchunks[0].start, eps, "Chunk start");
+ isfuzzy(videosb.buffered.end(0), vchunks[0].end, eps, "Chunk end");
+ videosb.timestampOffset = firstvoffset;
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(5, 9), '.m4s');
+ })
+ .then(function(data) {
+ is(videosb.buffered.length, 2, "One discontinuity");
+ isfuzzy(videosb.buffered.start(0), vchunks[0].start, eps, "First Chunk start");
+ isfuzzy(videosb.buffered.end(0), vchunks[0].end, eps, "First chunk end");
+ isfuzzy(videosb.buffered.start(1), vchunks[1].start + firstvoffset, eps, "Second chunk start");
+ isfuzzy(videosb.buffered.end(1), vchunks[1].end + firstvoffset, eps, "Second chunk end");
+ videosb.timestampOffset = secondvoffset;
+ return fetchAndLoad(videosb, 'bipbop/bipbop_video', range(9, 14), '.m4s');
+ })
+ .then(function() {
+ is(videosb.buffered.length, 1, "No discontinuity (end)");
+ isfuzzy(videosb.buffered.start(0), vchunks[0].start, eps, "Chunk start");
+ isfuzzy(videosb.buffered.end(0), vchunks[2].end, eps, "Chunk end");
+ audiosb.timestampOffset = 3;
+ }).then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4'))
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', range(1, 12), '.m4s'))
+ .then(function() {
+ is(audiosb.buffered.length, 1, "No audio discontinuity");
+ isfuzzy(audiosb.buffered.start(0), 3, eps, "Audio starts at 3");
+
+ // Trim the rest of the audio.
+ audiosb.remove(videosb.buffered.end(0), Infinity);
+ videosb.remove(videosb.buffered.end(0), Infinity);
+ return Promise.all([audiosb.updating ? once(audiosb, 'updateend') : Promise.resolve(),
+ videosb.updating ? once(videosb, 'updateend') : Promise.resolve()]);
+ }).then(function() {
+ info("waiting for play to complete");
+ el.play();
+ el.currentTime = el.buffered.start(0);
+ ms.endOfStream();
+ Promise.all([once(el, 'ended'), once(el, 'seeked')]).then(SimpleTest.finish.bind(SimpleTest));
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_TruncatedDuration.html b/dom/media/mediasource/test/test_TruncatedDuration.html
new file mode 100644
index 000000000..cf25de395
--- /dev/null
+++ b/dom/media/mediasource/test/test_TruncatedDuration.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: truncating the media seeks to end of media and update buffered range</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// This test append data to a mediasource and then seek to half the duration
+// of the video.
+// We then shorten the video to 1/3rd of its original size by modifying the
+// mediasource.duration attribute.
+// We ensure that the buffered range immediately reflect the truncation
+// and that we've seeked to the new end of the media as per W3C spec and
+// video.currentTime got updated.
+
+SimpleTest.waitForExplicitFinish();
+
+function round(n) {
+ return Math.round(n * 1000) / 1000;
+}
+
+function do_seeking(e) {
+ var v = e.target;
+ v.removeEventListener("seeking", do_seeking, false);
+ SimpleTest.finish();
+}
+
+function do_seeked(e) {
+ var v = e.target;
+ v.removeEventListener("seeked", do_seeked, false);
+ var duration = round(v.duration / 3);
+ is(v._sb.updating, false, "sourcebuffer isn't updating");
+ v._sb.remove(duration, Infinity);
+ once(v._sb, "updateend", function() {
+ v._ms.duration = duration
+ // frames aren't truncated, so duration may be slightly more.
+ isfuzzy(v.duration, duration, 1/30, "element duration was updated");
+ v._sb.abort(); // this shouldn't abort updating the duration (bug 1130826).
+ ok(v.seeking, "seeking is true");
+ // test playback position was updated (bug 1130839).
+ is(v.currentTime, v.duration, "current time was updated");
+ is(v._sb.buffered.length, 1, "One buffered range");
+ // Truncated mediasource duration will cause the video element to seek.
+ v.addEventListener("seeking", do_seeking, false);
+ });
+}
+
+function do_loaded(e) {
+ var v = e.target;
+ v.removeEventListener("loadeddata", do_loaded, false);
+ v.currentTime = v.duration / 2;
+ is(v.currentTime, v.duration / 2, "current time was updated");
+ ok(v.seeking, "seeking is true");
+ v.addEventListener("seeked", do_seeked, false);
+}
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/webm");
+ v._sb = sb;
+ v._ms = ms;
+
+ fetchWithXHR("seek.webm", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ v.addEventListener("loadeddata", do_loaded, false);
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_TruncatedDuration_mp4.html b/dom/media/mediasource/test/test_TruncatedDuration_mp4.html
new file mode 100644
index 000000000..f226093de
--- /dev/null
+++ b/dom/media/mediasource/test/test_TruncatedDuration_mp4.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>MSE: truncating the media seeks to end of media and update buffered range</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// This test append data to a mediasource and then seek to half the duration
+// of the video.
+// We then shorten the video to 1/3rd of its original size.
+// We ensure that the buffered range immediately reflect the truncation
+// and that we've seeked to the new end of the media as per W3C spec and
+// video.currentTime got updated.
+
+SimpleTest.waitForExplicitFinish();
+
+function round(n) {
+ return Math.round(n * 1000) / 1000;
+}
+
+function do_seeking(e) {
+ var v = e.target;
+ v.removeEventListener("seeking", do_seeking, false);
+ SimpleTest.finish();
+}
+
+function do_seeked(e) {
+ var v = e.target;
+ v.removeEventListener("seeked", do_seeked, false);
+ var duration = round(v.duration / 3);
+ is(v._sb.updating, false, "sourcebuffer isn't updating");
+ v._sb.remove(duration, Infinity);
+ once(v._sb, "updateend", function() {
+ v._ms.duration = duration
+ // frames aren't truncated, so duration may be slightly more.
+ isfuzzy(v.duration, duration, 1/30, "element duration was updated");
+ v._sb.abort(); // this shouldn't abort updating the duration (bug 1130826).
+ ok(v.seeking, "seeking is true");
+ // test playback position was updated (bug 1130839).
+ is(v.currentTime, v.duration, "current time was updated");
+ is(v._sb.buffered.length, 1, "One buffered range");
+ // Truncated mediasource duration will cause the video element to seek.
+ v.addEventListener("seeking", do_seeking, false);
+ });
+}
+
+function do_loaded(e) {
+ var v = e.target;
+ v.removeEventListener("loadeddata", do_loaded, false);
+ // mp4 metadata states 10s when we only have 1.6s worth of video.
+ v._sb.remove(v._sb.buffered.end(0), Infinity);
+ once(v._sb, "updateend", function() {
+ v._ms.duration = v._sb.buffered.end(0);
+ is(v.duration, v._ms.duration, "current time updated with mediasource duration");
+ v.currentTime = v.duration / 2;
+ is(v.currentTime, v.duration / 2, "current time was updated");
+ ok(v.seeking, "seeking is true");
+ v.addEventListener("seeked", do_seeked, false);
+ });
+}
+
+runWithMSE(function (ms, v) {
+ ms.addEventListener("sourceopen", function () {
+ var sb = ms.addSourceBuffer("video/mp4");
+ v._sb = sb;
+ v._ms = ms;
+
+ fetchWithXHR("bipbop/bipbop2s.mp4", function (arrayBuffer) {
+ sb.appendBuffer(new Uint8Array(arrayBuffer));
+ v.addEventListener("loadeddata", do_loaded, false);
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_WaitingOnMissingData.html b/dom/media/mediasource/test/test_WaitingOnMissingData.html
new file mode 100644
index 000000000..a67441045
--- /dev/null
+++ b/dom/media/mediasource/test/test_WaitingOnMissingData.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: |waiting| event when source data is missing</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var sb = ms.addSourceBuffer("video/webm");
+ fetchWithXHR("seek.webm", function(arrayBuffer) {
+ sb.addEventListener('error', (e) => { ok(false, "Got Error: " + e); SimpleTest.finish(); });
+ loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 0, 318))()
+ .then(loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 318, 25223-318)))
+ .then(loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 25223, 46712-25223)))
+ /* Note - Missing |46712, 67833 - 46712| segment here */
+ .then(loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 67833, 88966 - 67833)))
+ .then(loadSegment.bind(null, sb, new Uint8Array(arrayBuffer, 88966)))
+ .then(function() {
+ // HTMLMediaElement fires 'waiting' if somebody invokes |play()| before the MDSM
+ // has notified it of available data. Make sure that we get 'playing' before
+ // we starting waiting for 'waiting'.
+ info("Invoking play()");
+ var p = once(el, 'playing');
+ el.play();
+ return p;
+ }).then(function() {
+ ok(true, "Video playing. It should play for a bit, then fire 'waiting'");
+ var p = once(el, 'waiting');
+ el.play();
+ return p;
+ }).then(function() {
+ // currentTime is based on the current video frame, so if the audio ends just before
+ // the next video frame, currentTime can be up to 1 frame's worth earlier than
+ // min(audioEnd, videoEnd).
+ // 0.0465 is the length of the last audio frame.
+ ok(el.currentTime >= (sb.buffered.end(0) - 0.0465),
+ "Got a waiting event at " + el.currentTime);
+ info("Loading more data");
+ var p = once(el, 'ended');
+ loadSegment(sb, new Uint8Array(arrayBuffer, 46712, 67833 - 46712)).then(() => ms.endOfStream());
+ return p;
+ }).then(function() {
+ // These fuzz factors are bigger than they should be. We should investigate
+ // and fix them in bug 1137574.
+ isfuzzy(el.duration, 4.001, 0.1, "Video has correct duration: " + el.duration);
+ isfuzzy(el.currentTime, el.duration, 0.1, "Video has correct currentTime.");
+ SimpleTest.finish();
+ });
+ });
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html b/dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html
new file mode 100644
index 000000000..6e1560d01
--- /dev/null
+++ b/dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: |waiting| event when source data is missing</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ el.addEventListener("ended", function () {
+ ok(false, "ended should never fire");
+ SimpleTest.finish();
+ });
+ var videosb = ms.addSourceBuffer("video/mp4");
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 5), '.m4s'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(6, 8), '.m4s'))
+ .then(function() {
+ is(el.buffered.length, 2, "discontinuous buffered range");
+ ms.endOfStream();
+ return Promise.all([once(el, "durationchange"), once(ms, "sourceended")]);
+ }).then(function() {
+ // HTMLMediaElement fires 'waiting' if somebody invokes |play()| before the MDSM
+ // has notified it of available data. Make sure that we get 'playing' before
+ // we starting waiting for 'waiting'.
+ info("Invoking play()");
+ el.play();
+ return once(el, 'playing');
+ }).then(function() {
+ ok(true, "Video playing. It should play for a bit, then fire 'waiting'");
+ return once(el, 'waiting');
+ }).then(function() {
+ // waiting is fired when we start to play the last frame.
+ // 0.033334 is the duration of the last frame, + 0.000001 of fuzz.
+ // the next video frame, currentTime can be up to 1 frame's worth earlier than end of video.
+ isfuzzy(el.currentTime, videosb.buffered.end(0), 0.033334, "waiting was fired on gap");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html b/dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html
new file mode 100644
index 000000000..79344c772
--- /dev/null
+++ b/dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: |waiting| event when source data is missing</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ fetchAndLoad(audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', range(1, 5), '.m4s'))
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', range(6, 12), '.m4s'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', ['init'], '.mp4'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 6), '.m4s'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(7, 14), '.m4s'))
+ .then(function() {
+ // HTMLMediaElement fires 'waiting' if somebody invokes |play()| before the MDSM
+ // has notified it of available data. Make sure that we get 'playing' before
+ // we starting waiting for 'waiting'.
+ info("Invoking play()");
+ var p = once(el, 'playing');
+ el.play();
+ return p;
+ }).then(function() {
+ ok(true, "Video playing. It should play for a bit, then fire 'waiting'");
+ var p = once(el, 'waiting');
+ el.play();
+ return p;
+ }).then(function() {
+ // currentTime is based on the current video frame, so if the audio ends just before
+ // the next video frame, currentTime can be up to 1 frame's worth earlier than
+ // min(audioEnd, videoEnd).
+ // 0.0465 is the length of the last audio frame.
+ ok(el.currentTime >= (Math.min(audiosb.buffered.end(0), videosb.buffered.end(0)) - 0.0465),
+ "Got a waiting event at " + el.currentTime);
+ info("Loading more data");
+ var p = once(el, 'ended');
+ var loads = Promise.all([fetchAndLoad(audiosb, 'bipbop/bipbop_audio', [5], '.m4s'),
+ fetchAndLoad(videosb, 'bipbop/bipbop_video', [6], '.m4s')]);
+ loads.then(() => ms.endOfStream());
+ return p;
+ }).then(function() {
+ // These fuzz factors are bigger than they should be. We should investigate
+ // and fix them in bug 1137574.
+ isfuzzy(el.duration, 10.1, 0.1, "Video has correct duration: " + el.duration);
+ isfuzzy(el.currentTime, el.duration, 0.1, "Video has correct currentTime.");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html b/dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html
new file mode 100644
index 000000000..f932b3d4e
--- /dev/null
+++ b/dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1252">
+ <title>MSE: |waiting| event when source data is missing</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="mediasource.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test"><script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+runWithMSE(function(ms, el) {
+ el.controls = true;
+ once(ms, 'sourceopen').then(function() {
+ ok(true, "Receive a sourceopen event");
+ var audiosb = ms.addSourceBuffer("audio/mp4");
+ var videosb = ms.addSourceBuffer("video/mp4");
+ // ensure tracks end at approximately the same time to ensure ended event is
+ // always fired (bug 1233639).
+ audiosb.appendWindowEnd = 3.9;
+ videosb.appendWindowEnd = 3.9;
+ fetchAndLoad(audiosb, 'bipbop/bipbop_audio', ['init'], '.mp4')
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', ['init'], '.mp4'))
+ .then(fetchAndLoad.bind(null, audiosb, 'bipbop/bipbop_audio', range(1, 5), '.m4s'))
+ .then(fetchAndLoad.bind(null, videosb, 'bipbop/bipbop_video', range(1, 6), '.m4s'))
+ .then(function() {
+ // HTMLMediaElement fires 'waiting' if somebody invokes |play()| before the MDSM
+ // has notified it of available data. Make sure that we get 'playing' before
+ // we starting waiting for 'waiting'.
+ info("Invoking play()");
+ var p = once(el, 'playing');
+ el.play();
+ return p;
+ }).then(function() {
+ ok(true, "Video playing. It should play for a bit, then fire 'waiting'");
+ var p = once(el, 'waiting');
+ el.play();
+ return p;
+ }).then(function() {
+ var p = once(el, 'ended');
+ ms.endOfStream();
+ return p;
+ }).then(function() {
+ is(el.duration, 3.854512, "Video has correct duration: " + el.duration);
+ is(el.currentTime, el.duration, "Video has correct currentTime.");
+ SimpleTest.finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/moz.build b/dom/media/moz.build
new file mode 100644
index 000000000..d1885793b
--- /dev/null
+++ b/dom/media/moz.build
@@ -0,0 +1,347 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+with Files('*'):
+ BUG_COMPONENT = ('Core', 'Video/Audio')
+
+component_signaling = ('Core', 'WebRTC: Signaling')
+with Files('IdpSandbox.jsm'):
+ BUG_COMPONENT = component_signaling
+with Files('PeerConnection*'):
+ BUG_COMPONENT = component_signaling
+with Files('RTC*'):
+ BUG_COMPONENT = component_signaling
+
+component_av = ('Core', 'WebRTC: Audio/Video')
+with Files('GetUserMedia*'):
+ BUG_COMPONENT = component_av
+
+DIRS += [
+ 'eme',
+ 'encoder',
+ 'flac',
+ 'gmp',
+ 'gmp-plugin',
+ 'gmp-plugin-openh264',
+ 'imagecapture',
+ 'ipc',
+ 'mediasink',
+ 'mediasource',
+ 'ogg',
+ 'platforms',
+ 'systemservices',
+ 'wave',
+ 'webaudio',
+ 'webm',
+ 'webrtc',
+ 'webspeech',
+ 'webvtt',
+ 'standalone',
+]
+
+if CONFIG['MOZ_DIRECTSHOW']:
+ DIRS += ['directshow']
+
+if CONFIG['MOZ_ANDROID_OMX']:
+ DIRS += ['android']
+
+if CONFIG['MOZ_FMP4']:
+ DIRS += ['fmp4']
+
+if CONFIG['MOZ_WEBRTC']:
+ DIRS += ['bridge']
+
+TEST_DIRS += [
+ 'gtest',
+]
+
+MOCHITEST_MANIFESTS += [
+ 'test/mochitest.ini',
+ 'tests/mochitest/identity/mochitest.ini',
+]
+
+if CONFIG['MOZ_WEBRTC']:
+ MOCHITEST_MANIFESTS += ['tests/mochitest/mochitest.ini']
+ WEBRTC_SIGNALLING_TEST_MANIFESTS += ['tests/mochitest/steeplechase.ini']
+ WEBRTC_SIGNALLING_TEST_MANIFESTS += ['tests/mochitest/steeplechase_long/steeplechase_long.ini']
+
+XPIDL_SOURCES += [
+ 'nsIDOMNavigatorUserMedia.idl',
+ 'nsIMediaManager.idl',
+]
+
+XPIDL_MODULE = 'dom_media'
+
+EXPORTS += [
+ 'AbstractMediaDecoder.h',
+ 'AccurateSeekTask.h',
+ 'ADTSDecoder.h',
+ 'ADTSDemuxer.h',
+ 'AudioBufferUtils.h',
+ 'AudioChannelFormat.h',
+ 'AudioCompactor.h',
+ 'AudioConverter.h',
+ 'AudioMixer.h',
+ 'AudioPacketizer.h',
+ 'AudioSampleFormat.h',
+ 'AudioSegment.h',
+ 'AudioStream.h',
+ 'Benchmark.h',
+ 'BufferMediaResource.h',
+ 'CubebUtils.h',
+ 'DecoderDoctorDiagnostics.h',
+ 'DecoderTraits.h',
+ 'DOMMediaStream.h',
+ 'EncodedBufferCache.h',
+ 'FileBlockCache.h',
+ 'FrameStatistics.h',
+ 'Intervals.h',
+ 'Latency.h',
+ 'MediaCache.h',
+ 'MediaContentType.h',
+ 'MediaData.h',
+ 'MediaDataDemuxer.h',
+ 'MediaDecoder.h',
+ 'MediaDecoderOwner.h',
+ 'MediaDecoderReader.h',
+ 'MediaDecoderReaderWrapper.h',
+ 'MediaDecoderStateMachine.h',
+ 'MediaEventSource.h',
+ 'MediaFormatReader.h',
+ 'MediaInfo.h',
+ 'MediaMetadataManager.h',
+ 'MediaPrefs.h',
+ 'MediaQueue.h',
+ 'MediaRecorder.h',
+ 'MediaResource.h',
+ 'MediaResourceCallback.h',
+ 'MediaResult.h',
+ 'MediaSegment.h',
+ 'MediaShutdownManager.h',
+ 'MediaStatistics.h',
+ 'MediaStreamGraph.h',
+ 'MediaStreamListener.h',
+ 'MediaStreamVideoSink.h',
+ 'MediaTimer.h',
+ 'MediaTrack.h',
+ 'MediaTrackList.h',
+ 'MP3Decoder.h',
+ 'MP3Demuxer.h',
+ 'MP3FrameParser.h',
+ 'NextFrameSeekTask.h',
+ 'nsIDocumentActivity.h',
+ 'PrincipalChangeObserver.h',
+ 'QueueObject.h',
+ 'SeekJob.h',
+ 'SeekTarget.h',
+ 'SeekTask.h',
+ 'SelfRef.h',
+ 'SharedBuffer.h',
+ 'StreamTracks.h',
+ 'ThreadPoolCOMListener.h',
+ 'TimeUnits.h',
+ 'TrackUnionStream.h',
+ 'VideoFrameContainer.h',
+ 'VideoLimits.h',
+ 'VideoSegment.h',
+ 'VideoUtils.h',
+ 'VorbisUtils.h',
+ 'XiphExtradata.h',
+]
+
+EXPORTS.mozilla += [
+ 'MediaManager.h',
+]
+
+EXPORTS.mozilla.media.webrtc += [
+ 'webrtc/WebrtcGlobal.h',
+]
+
+if not CONFIG['MOZ_WEBRTC']:
+ EXPORTS.mtransport += [
+ '../../media/mtransport/runnable_utils.h',
+ ]
+
+IPDL_SOURCES += [
+ 'webrtc/PWebrtcGlobal.ipdl'
+]
+
+if CONFIG['MOZ_B2G']:
+ EXPORTS.mozilla += [
+ 'MediaPermissionGonk.h',
+ ]
+
+EXPORTS.mozilla.dom += [
+ 'AudioStreamTrack.h',
+ 'AudioTrack.h',
+ 'AudioTrackList.h',
+ 'CanvasCaptureMediaStream.h',
+ 'GetUserMediaRequest.h',
+ 'MediaDeviceInfo.h',
+ 'MediaDevices.h',
+ 'MediaStreamError.h',
+ 'MediaStreamTrack.h',
+ 'TextTrack.h',
+ 'TextTrackCue.h',
+ 'TextTrackCueList.h',
+ 'TextTrackList.h',
+ 'TextTrackRegion.h',
+ 'VideoPlaybackQuality.h',
+ 'VideoStreamTrack.h',
+ 'VideoTrack.h',
+ 'VideoTrackList.h',
+]
+
+UNIFIED_SOURCES += [
+ 'AccurateSeekTask.cpp',
+ 'ADTSDecoder.cpp',
+ 'ADTSDemuxer.cpp',
+ 'AudioCaptureStream.cpp',
+ 'AudioChannelFormat.cpp',
+ 'AudioCompactor.cpp',
+ 'AudioConverter.cpp',
+ 'AudioSegment.cpp',
+ 'AudioStream.cpp',
+ 'AudioStreamTrack.cpp',
+ 'AudioTrack.cpp',
+ 'AudioTrackList.cpp',
+ 'Benchmark.cpp',
+ 'CanvasCaptureMediaStream.cpp',
+ 'CubebUtils.cpp',
+ 'DecoderDoctorDiagnostics.cpp',
+ 'DOMMediaStream.cpp',
+ 'EncodedBufferCache.cpp',
+ 'FileBlockCache.cpp',
+ 'GetUserMediaRequest.cpp',
+ 'GraphDriver.cpp',
+ 'Latency.cpp',
+ 'MediaCache.cpp',
+ 'MediaContentType.cpp',
+ 'MediaData.cpp',
+ 'MediaDecoder.cpp',
+ 'MediaDecoderReader.cpp',
+ 'MediaDecoderReaderWrapper.cpp',
+ 'MediaDecoderStateMachine.cpp',
+ 'MediaDeviceInfo.cpp',
+ 'MediaDevices.cpp',
+ 'MediaFormatReader.cpp',
+ 'MediaInfo.cpp',
+ 'MediaManager.cpp',
+ 'MediaPrefs.cpp',
+ 'MediaRecorder.cpp',
+ 'MediaResource.cpp',
+ 'MediaShutdownManager.cpp',
+ 'MediaStreamError.cpp',
+ 'MediaStreamGraph.cpp',
+ 'MediaStreamListener.cpp',
+ 'MediaStreamTrack.cpp',
+ 'MediaStreamVideoSink.cpp',
+ 'MediaTimer.cpp',
+ 'MediaTrack.cpp',
+ 'MediaTrackList.cpp',
+ 'MP3Decoder.cpp',
+ 'MP3Demuxer.cpp',
+ 'MP3FrameParser.cpp',
+ 'NextFrameSeekTask.cpp',
+ 'QueueObject.cpp',
+ 'SeekJob.cpp',
+ 'SeekTask.cpp',
+ 'StreamTracks.cpp',
+ 'TextTrack.cpp',
+ 'TextTrackCue.cpp',
+ 'TextTrackCueList.cpp',
+ 'TextTrackList.cpp',
+ 'TextTrackRegion.cpp',
+ 'TrackUnionStream.cpp',
+ 'VideoFrameContainer.cpp',
+ 'VideoPlaybackQuality.cpp',
+ 'VideoSegment.cpp',
+ 'VideoStreamTrack.cpp',
+ 'VideoTrack.cpp',
+ 'VideoTrackList.cpp',
+ 'VideoUtils.cpp',
+ 'WebVTTListener.cpp',
+ 'XiphExtradata.cpp',
+]
+
+if CONFIG['OS_TARGET'] == 'WINNT':
+ SOURCES += [ 'ThreadPoolCOMListener.cpp' ]
+
+if CONFIG['MOZ_B2G']:
+ SOURCES += [
+ 'MediaPermissionGonk.cpp',
+ ]
+
+# DecoderTraits.cpp needs to be built separately because of Mac OS X headers.
+SOURCES += [
+ 'DecoderTraits.cpp',
+]
+
+# Some codec-related code uses multi-character constants, which GCC and clang
+# warn about. Suppress turning this warning into an error.
+if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
+ SOURCES['DecoderTraits.cpp'].flags += ['-Wno-error=multichar']
+
+EXTRA_COMPONENTS += [
+ 'PeerConnection.js',
+ 'PeerConnection.manifest',
+]
+
+EXTRA_JS_MODULES.media += [
+ 'IdpSandbox.jsm',
+ 'PeerConnectionIdp.jsm',
+ 'RTCStatsReport.jsm',
+]
+
+LOCAL_INCLUDES += [
+ '/caps',
+ '/dom/base',
+ '/layout/generic',
+ '/layout/xul',
+ '/netwerk/base',
+]
+
+if CONFIG['MOZ_DIRECTSHOW']:
+ LOCAL_INCLUDES += [
+ '/media/webrtc/trunk/webrtc/modules/video_capture/windows',
+ ]
+
+if CONFIG['MOZ_WEBRTC']:
+ LOCAL_INCLUDES += [
+ '/media/webrtc/signaling/src/common',
+ '/media/webrtc/trunk',
+ ]
+
+DEFINES['MOZILLA_INTERNAL_API'] = True
+
+if CONFIG['OS_TARGET'] == 'WINNT':
+ DEFINES['WEBRTC_WIN'] = True
+else:
+ DEFINES['WEBRTC_POSIX'] = True
+
+if CONFIG['ANDROID_VERSION'] > '15':
+ DEFINES['MOZ_OMX_WEBM_DECODER'] = True
+
+if CONFIG['MOZ_GONK_MEDIACODEC']:
+ DEFINES['MOZ_GONK_MEDIACODEC'] = True
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+# Suppress some GCC warnings being treated as errors:
+# - about attributes on forward declarations for types that are already
+# defined, which complains about an important MOZ_EXPORT for android::AString
+if CONFIG['GNU_CC']:
+ CXXFLAGS += [
+ '-Wno-error=attributes',
+ '-Wno-error=shadow',
+ ]
+
+if CONFIG['_MSC_VER']:
+ # This is intended as a temporary workaround to unblock compilation
+ # on VS2015 in warnings as errors mode.
+ CXXFLAGS += ['-wd4312']
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/nsIDOMNavigatorUserMedia.idl b/dom/media/nsIDOMNavigatorUserMedia.idl
new file mode 100644
index 000000000..991d44e72
--- /dev/null
+++ b/dom/media/nsIDOMNavigatorUserMedia.idl
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+#include "nsIVariant.idl"
+
+[scriptable, builtinclass, uuid(ba3b2e08-1c07-4cd3-8822-f4d7e35ff2ae)]
+interface nsIMediaDevice : nsISupports
+{
+ readonly attribute DOMString type;
+ readonly attribute DOMString name;
+ readonly attribute DOMString id;
+ readonly attribute DOMString mediaSource;
+ readonly attribute DOMString rawId;
+ readonly attribute boolean scary;
+};
+
+[scriptable, function, uuid(24544878-d35e-4962-8c5f-fb84e97bdfee)]
+interface nsIGetUserMediaDevicesSuccessCallback : nsISupports
+{
+ void onSuccess(in nsIVariant devices);
+};
+
+[scriptable, function, uuid(f2a144fc-3534-4761-8c5d-989ae720f89a)]
+interface nsIDOMGetUserMediaSuccessCallback : nsISupports
+{
+ /*
+ * value must be a nsIDOMBlob if picture is true and a
+ * DOMLocalMediaStream if either audio or video are true.
+ */
+ void onSuccess(in nsISupports value);
+};
+
+[scriptable, function, uuid(39e96c61-2636-4f0e-918e-9bb64276492a)]
+interface nsIDOMGetUserMediaErrorCallback : nsISupports
+{
+ void onError(in nsISupports error);
+};
diff --git a/dom/media/nsIDocumentActivity.h b/dom/media/nsIDocumentActivity.h
new file mode 100644
index 000000000..4fab6af2d
--- /dev/null
+++ b/dom/media/nsIDocumentActivity.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsIDocumentActivity_h__
+#define nsIDocumentActivity_h__
+
+#include "nsISupports.h"
+
+#define NS_IDOCUMENTACTIVITY_IID \
+{ 0x9b9f584e, 0xefa8, 0x11e3, \
+ { 0xbb, 0x74, 0x5e, 0xdd, 0x1d, 0x5d, 0x46, 0xb0 } }
+
+class nsIDocumentActivity : public nsISupports
+{
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_IDOCUMENTACTIVITY_IID)
+
+ virtual void NotifyOwnerDocumentActivityChanged() = 0;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsIDocumentActivity, NS_IDOCUMENTACTIVITY_IID)
+
+/* Use this macro when declaring classes that implement this interface. */
+#define NS_DECL_NSIDOCUMENTACTIVITY \
+ virtual void NotifyOwnerDocumentActivityChanged() override;
+
+#endif /* nsIDocumentActivity_h__ */
diff --git a/dom/media/nsIMediaManager.idl b/dom/media/nsIMediaManager.idl
new file mode 100644
index 000000000..6eadbe02d
--- /dev/null
+++ b/dom/media/nsIMediaManager.idl
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+interface nsIArray;
+interface nsIDOMWindow;
+
+%{C++
+#define NS_MEDIAMANAGERSERVICE_CID {0xabc622ea, 0x9655, 0x4123, {0x80, 0xd9, 0x22, 0x62, 0x1b, 0xdd, 0x54, 0x65}}
+#define MEDIAMANAGERSERVICE_CONTRACTID "@mozilla.org/mediaManagerService;1"
+%}
+
+[scriptable, builtinclass, uuid(24b23e01-33fd-401f-ba25-6e52658750b0)]
+interface nsIMediaManagerService : nsISupports
+{
+ /* return a array of inner windows that have active captures */
+ readonly attribute nsIArray activeMediaCaptureWindows;
+
+ /* Get the capture state for the given window and all descendant windows (iframes, etc) */
+ void mediaCaptureWindowState(in nsIDOMWindow aWindow, out boolean aVideo, out boolean aAudio,
+ [optional] out boolean aScreenShare, [optional] out boolean aWindowShare,
+ [optional] out boolean aAppShare, [optional] out boolean aBrowserShare);
+
+ /* Clear per-orgin list of persistent DeviceIds stored for enumerateDevices
+ sinceTime is milliseconds since 1 January 1970 00:00:00 UTC. 0 = clear all */
+ void sanitizeDeviceIds(in long long sinceWhen);
+};
diff --git a/dom/media/ogg/OggCodecState.cpp b/dom/media/ogg/OggCodecState.cpp
new file mode 100644
index 000000000..6830639e8
--- /dev/null
+++ b/dom/media/ogg/OggCodecState.cpp
@@ -0,0 +1,1839 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <string.h>
+
+#include "mozilla/EndianUtils.h"
+#include <stdint.h>
+
+#include "nsDebug.h"
+#include "OggCodecState.h"
+#include "OpusParser.h"
+#include "VideoUtils.h"
+#include <algorithm>
+
+#include <opus/opus.h>
+#include "opus/opus_multistream.h"
+
+// On Android JellyBean, the hardware.h header redefines version_major and
+// version_minor, which breaks our build. See:
+// https://bugzilla.mozilla.org/show_bug.cgi?id=912702#c6
+#ifdef MOZ_WIDGET_GONK
+#ifdef version_major
+#undef version_major
+#endif
+#ifdef version_minor
+#undef version_minor
+#endif
+#endif
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+#define LOG(type, msg) MOZ_LOG(gMediaDecoderLog, type, msg)
+
+/** Decoder base class for Ogg-encapsulated streams. */
+OggCodecState*
+OggCodecState::Create(ogg_page* aPage)
+{
+ NS_ASSERTION(ogg_page_bos(aPage), "Only call on BOS page!");
+ nsAutoPtr<OggCodecState> codecState;
+ if (aPage->body_len > 6 && memcmp(aPage->body+1, "theora", 6) == 0) {
+ codecState = new TheoraState(aPage);
+ } else if (aPage->body_len > 6 && memcmp(aPage->body+1, "vorbis", 6) == 0) {
+ codecState = new VorbisState(aPage);
+ } else if (aPage->body_len > 8 && memcmp(aPage->body, "OpusHead", 8) == 0) {
+ codecState = new OpusState(aPage);
+ } else if (aPage->body_len > 8 && memcmp(aPage->body, "fishead\0", 8) == 0) {
+ codecState = new SkeletonState(aPage);
+ } else if (aPage->body_len > 5 && memcmp(aPage->body, "\177FLAC", 5) == 0) {
+ codecState = new FlacState(aPage);
+ } else {
+ codecState = new OggCodecState(aPage, false);
+ }
+ return codecState->OggCodecState::InternalInit() ? codecState.forget() : nullptr;
+}
+
+OggCodecState::OggCodecState(ogg_page* aBosPage, bool aActive)
+ : mPacketCount(0)
+ , mSerial(ogg_page_serialno(aBosPage))
+ , mActive(aActive)
+ , mDoneReadingHeaders(!aActive)
+{
+ MOZ_COUNT_CTOR(OggCodecState);
+ memset(&mState, 0, sizeof(ogg_stream_state));
+}
+
+OggCodecState::~OggCodecState()
+{
+ MOZ_COUNT_DTOR(OggCodecState);
+ Reset();
+#ifdef DEBUG
+ int ret =
+#endif
+ ogg_stream_clear(&mState);
+ NS_ASSERTION(ret == 0, "ogg_stream_clear failed");
+}
+
+nsresult
+OggCodecState::Reset()
+{
+ if (ogg_stream_reset(&mState) != 0) {
+ return NS_ERROR_FAILURE;
+ }
+ mPackets.Erase();
+ ClearUnstamped();
+ return NS_OK;
+}
+
+void
+OggCodecState::ClearUnstamped()
+{
+ for (uint32_t i = 0; i < mUnstamped.Length(); ++i) {
+ OggCodecState::ReleasePacket(mUnstamped[i]);
+ }
+ mUnstamped.Clear();
+}
+
+bool
+OggCodecState::InternalInit()
+{
+ int ret = ogg_stream_init(&mState, mSerial);
+ return ret == 0;
+}
+
+bool
+OggCodecState::IsValidVorbisTagName(nsCString& aName)
+{
+ // Tag names must consist of ASCII 0x20 through 0x7D,
+ // excluding 0x3D '=' which is the separator.
+ uint32_t length = aName.Length();
+ const char* data = aName.Data();
+ for (uint32_t i = 0; i < length; i++) {
+ if (data[i] < 0x20 || data[i] > 0x7D || data[i] == '=') {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool
+OggCodecState::AddVorbisComment(MetadataTags* aTags,
+ const char* aComment,
+ uint32_t aLength)
+{
+ const char* div = (const char*)memchr(aComment, '=', aLength);
+ if (!div) {
+ LOG(LogLevel::Debug, ("Skipping comment: no separator"));
+ return false;
+ }
+ nsCString key = nsCString(aComment, div-aComment);
+ if (!IsValidVorbisTagName(key)) {
+ LOG(LogLevel::Debug, ("Skipping comment: invalid tag name"));
+ return false;
+ }
+ uint32_t valueLength = aLength - (div-aComment);
+ nsCString value = nsCString(div + 1, valueLength);
+ if (!IsUTF8(value)) {
+ LOG(LogLevel::Debug, ("Skipping comment: invalid UTF-8 in value"));
+ return false;
+ }
+ aTags->Put(key, value);
+ return true;
+}
+
+void
+VorbisState::RecordVorbisPacketSamples(ogg_packet* aPacket, long aSamples)
+{
+#ifdef VALIDATE_VORBIS_SAMPLE_CALCULATION
+ mVorbisPacketSamples[aPacket] = aSamples;
+#endif
+}
+
+void
+VorbisState::ValidateVorbisPacketSamples(ogg_packet* aPacket, long aSamples)
+{
+#ifdef VALIDATE_VORBIS_SAMPLE_CALCULATION
+ NS_ASSERTION(mVorbisPacketSamples[aPacket] == aSamples,
+ "Decoded samples for Vorbis packet don't match expected!");
+ mVorbisPacketSamples.erase(aPacket);
+#endif
+}
+
+void
+VorbisState::AssertHasRecordedPacketSamples(ogg_packet* aPacket)
+{
+#ifdef VALIDATE_VORBIS_SAMPLE_CALCULATION
+ NS_ASSERTION(mVorbisPacketSamples.count(aPacket) == 1,
+ "Must have recorded packet samples");
+#endif
+}
+
+static ogg_packet*
+Clone(ogg_packet* aPacket)
+{
+ ogg_packet* p = new ogg_packet();
+ memcpy(p, aPacket, sizeof(ogg_packet));
+ p->packet = new unsigned char[p->bytes];
+ memcpy(p->packet, aPacket->packet, p->bytes);
+ return p;
+}
+
+void
+OggCodecState::ReleasePacket(ogg_packet* aPacket)
+{
+ if (aPacket)
+ delete [] aPacket->packet;
+ delete aPacket;
+}
+
+void
+OggPacketQueue::Append(ogg_packet* aPacket)
+{
+ nsDeque::Push(aPacket);
+}
+
+bool
+OggCodecState::IsPacketReady()
+{
+ return !mPackets.IsEmpty();
+}
+
+ogg_packet*
+OggCodecState::PacketOut()
+{
+ if (mPackets.IsEmpty()) {
+ return nullptr;
+ }
+ return mPackets.PopFront();
+}
+
+ogg_packet*
+OggCodecState::PacketPeek()
+{
+ if (mPackets.IsEmpty()) {
+ return nullptr;
+ }
+ return mPackets.PeekFront();
+}
+
+void
+OggCodecState::PushFront(OggPacketQueue &&aOther)
+{
+ while (!aOther.IsEmpty()) {
+ mPackets.PushFront(aOther.Pop());
+ }
+}
+
+already_AddRefed<MediaRawData>
+OggCodecState::PacketOutAsMediaRawData()
+{
+ ogg_packet* packet = PacketOut();
+ if (!packet) {
+ return nullptr;
+ }
+
+ NS_ASSERTION(!IsHeader(packet), "PacketOutAsMediaRawData can only be called on non-header packets");
+ RefPtr<MediaRawData> sample = new MediaRawData(packet->packet, packet->bytes);
+ if (packet->bytes && !sample->Data()) {
+ // OOM.
+ ReleasePacket(packet);
+ return nullptr;
+ }
+
+ int64_t end_tstamp = Time(packet->granulepos);
+ NS_ASSERTION(end_tstamp >= 0, "timestamp invalid");
+
+ int64_t duration = PacketDuration(packet);
+ NS_ASSERTION(duration >= 0, "duration invalid");
+
+ sample->mTimecode = packet->granulepos;
+ sample->mTime = end_tstamp - duration;
+ sample->mDuration = duration;
+ sample->mKeyframe = IsKeyframe(packet);
+ sample->mEOS = packet->e_o_s;
+
+ ReleasePacket(packet);
+
+ return sample.forget();
+}
+
+nsresult
+OggCodecState::PageIn(ogg_page* aPage)
+{
+ if (!mActive) {
+ return NS_OK;
+ }
+ NS_ASSERTION(static_cast<uint32_t>(ogg_page_serialno(aPage)) == mSerial,
+ "Page must be for this stream!");
+ if (ogg_stream_pagein(&mState, aPage) == -1) {
+ return NS_ERROR_FAILURE;
+ }
+ int r;
+ do {
+ ogg_packet packet;
+ r = ogg_stream_packetout(&mState, &packet);
+ if (r == 1) {
+ mPackets.Append(Clone(&packet));
+ }
+ } while (r != 0);
+ if (ogg_stream_check(&mState)) {
+ NS_WARNING("Unrecoverable error in ogg_stream_packetout");
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+nsresult
+OggCodecState::PacketOutUntilGranulepos(bool& aFoundGranulepos)
+{
+ int r;
+ aFoundGranulepos = false;
+ // Extract packets from the sync state until either no more packets
+ // come out, or we get a data packet with non -1 granulepos.
+ do {
+ ogg_packet packet;
+ r = ogg_stream_packetout(&mState, &packet);
+ if (r == 1) {
+ ogg_packet* clone = Clone(&packet);
+ if (IsHeader(&packet)) {
+ // Header packets go straight into the packet queue.
+ mPackets.Append(clone);
+ } else {
+ // We buffer data packets until we encounter a granulepos. We'll
+ // then use the granulepos to figure out the granulepos of the
+ // preceeding packets.
+ mUnstamped.AppendElement(clone);
+ aFoundGranulepos = packet.granulepos > 0;
+ }
+ }
+ } while (r != 0 && !aFoundGranulepos);
+ if (ogg_stream_check(&mState)) {
+ NS_WARNING("Unrecoverable error in ogg_stream_packetout");
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+TheoraState::TheoraState(ogg_page* aBosPage)
+ : OggCodecState(aBosPage, true)
+ , mSetup(0)
+ , mCtx(0)
+ , mPixelAspectRatio(0)
+{
+ MOZ_COUNT_CTOR(TheoraState);
+ th_info_init(&mInfo);
+ th_comment_init(&mComment);
+}
+
+TheoraState::~TheoraState()
+{
+ MOZ_COUNT_DTOR(TheoraState);
+ th_setup_free(mSetup);
+ th_decode_free(mCtx);
+ th_comment_clear(&mComment);
+ th_info_clear(&mInfo);
+}
+
+bool
+TheoraState::Init()
+{
+ if (!mActive) {
+ return false;
+ }
+
+ int64_t n = mInfo.aspect_numerator;
+ int64_t d = mInfo.aspect_denominator;
+
+ mPixelAspectRatio = (n == 0 || d == 0)
+ ? 1.0f : static_cast<float>(n) / static_cast<float>(d);
+
+ // Ensure the frame and picture regions aren't larger than our prescribed
+ // maximum, or zero sized.
+ nsIntSize frame(mInfo.frame_width, mInfo.frame_height);
+ nsIntRect picture(mInfo.pic_x, mInfo.pic_y, mInfo.pic_width, mInfo.pic_height);
+ if (!IsValidVideoRegion(frame, picture, frame)) {
+ return mActive = false;
+ }
+
+ mCtx = th_decode_alloc(&mInfo, mSetup);
+ if (!mCtx) {
+ return mActive = false;
+ }
+
+ return true;
+}
+
+bool
+TheoraState::DecodeHeader(ogg_packet* aPacket)
+{
+ nsAutoRef<ogg_packet> autoRelease(aPacket);
+ mPacketCount++;
+ int ret = th_decode_headerin(&mInfo,
+ &mComment,
+ &mSetup,
+ aPacket);
+
+ // We must determine when we've read the last header packet.
+ // th_decode_headerin() does not tell us when it's read the last header, so
+ // we must keep track of the headers externally.
+ //
+ // There are 3 header packets, the Identification, Comment, and Setup
+ // headers, which must be in that order. If they're out of order, the file
+ // is invalid. If we've successfully read a header, and it's the setup
+ // header, then we're done reading headers. The first byte of each packet
+ // determines it's type as follows:
+ // 0x80 -> Identification header
+ // 0x81 -> Comment header
+ // 0x82 -> Setup header
+ // See http://www.theora.org/doc/Theora.pdf Chapter 6, "Bitstream Headers",
+ // for more details of the Ogg/Theora containment scheme.
+ bool isSetupHeader = aPacket->bytes > 0 && aPacket->packet[0] == 0x82;
+ if (ret < 0 || mPacketCount > 3) {
+ // We've received an error, or the first three packets weren't valid
+ // header packets. Assume bad input.
+ // Our caller will deactivate the bitstream.
+ return false;
+ } else if (ret > 0 && isSetupHeader && mPacketCount == 3) {
+ // Successfully read the three header packets.
+ mDoneReadingHeaders = true;
+ }
+ return true;
+}
+
+int64_t
+TheoraState::Time(int64_t granulepos)
+{
+ if (!mActive) {
+ return -1;
+ }
+ return TheoraState::Time(&mInfo, granulepos);
+}
+
+bool
+TheoraState::IsHeader(ogg_packet* aPacket)
+{
+ return th_packet_isheader(aPacket);
+}
+
+# define TH_VERSION_CHECK(_info,_maj,_min,_sub) \
+ (((_info)->version_major>(_maj)||(_info)->version_major==(_maj))&& \
+ (((_info)->version_minor>(_min)||(_info)->version_minor==(_min))&& \
+ (_info)->version_subminor>=(_sub)))
+
+int64_t
+TheoraState::Time(th_info* aInfo, int64_t aGranulepos)
+{
+ if (aGranulepos < 0 || aInfo->fps_numerator == 0) {
+ return -1;
+ }
+ // Implementation of th_granule_frame inlined here to operate
+ // on the th_info structure instead of the theora_state.
+ int shift = aInfo->keyframe_granule_shift;
+ ogg_int64_t iframe = aGranulepos >> shift;
+ ogg_int64_t pframe = aGranulepos - (iframe << shift);
+ int64_t frameno = iframe + pframe - TH_VERSION_CHECK(aInfo, 3, 2, 1);
+ CheckedInt64 t =
+ ((CheckedInt64(frameno) + 1) * USECS_PER_S) * aInfo->fps_denominator;
+ if (!t.isValid()) {
+ return -1;
+ }
+ t /= aInfo->fps_numerator;
+ return t.isValid() ? t.value() : -1;
+}
+
+int64_t TheoraState::StartTime(int64_t granulepos)
+{
+ if (granulepos < 0 || !mActive || mInfo.fps_numerator == 0) {
+ return -1;
+ }
+ CheckedInt64 t =
+ (CheckedInt64(th_granule_frame(mCtx, granulepos)) * USECS_PER_S)
+ * mInfo.fps_denominator;
+ if (!t.isValid()) {
+ return -1;
+ }
+ return t.value() / mInfo.fps_numerator;
+}
+
+int64_t
+TheoraState::PacketDuration(ogg_packet* aPacket)
+{
+ if (!mActive || mInfo.fps_numerator == 0) {
+ return -1;
+ }
+ CheckedInt64 t =
+ SaferMultDiv(mInfo.fps_denominator, USECS_PER_S, mInfo.fps_numerator);
+ return t.isValid() ? t.value() : -1;
+}
+
+int64_t
+TheoraState::MaxKeyframeOffset()
+{
+ // Determine the maximum time in microseconds by which a key frame could
+ // offset for the theora bitstream. Theora granulepos encode time as:
+ // ((key_frame_number << granule_shift) + frame_offset).
+ // Therefore the maximum possible time by which any frame could be offset
+ // from a keyframe is the duration of (1 << granule_shift) - 1) frames.
+ int64_t frameDuration;
+
+ // Max number of frames keyframe could possibly be offset.
+ int64_t keyframeDiff = (1 << mInfo.keyframe_granule_shift) - 1;
+
+ // Length of frame in usecs.
+ frameDuration = (mInfo.fps_denominator * USECS_PER_S) / mInfo.fps_numerator;
+
+ // Total time in usecs keyframe can be offset from any given frame.
+ return frameDuration * keyframeDiff;
+}
+
+bool
+TheoraState::IsKeyframe(ogg_packet* pkt)
+{
+ // first bit of packet is 1 for header, 0 for data
+ // second bit of packet is 1 for inter frame, 0 for intra frame
+ return (pkt->bytes >= 1 && (pkt->packet[0] & 0x40) == 0x00);
+}
+
+nsresult
+TheoraState::PageIn(ogg_page* aPage)
+{
+ if (!mActive)
+ return NS_OK;
+ NS_ASSERTION(static_cast<uint32_t>(ogg_page_serialno(aPage)) == mSerial,
+ "Page must be for this stream!");
+ if (ogg_stream_pagein(&mState, aPage) == -1)
+ return NS_ERROR_FAILURE;
+ bool foundGp;
+ nsresult res = PacketOutUntilGranulepos(foundGp);
+ if (NS_FAILED(res))
+ return res;
+ if (foundGp && mDoneReadingHeaders) {
+ // We've found a packet with a granulepos, and we've loaded our metadata
+ // and initialized our decoder. Determine granulepos of buffered packets.
+ ReconstructTheoraGranulepos();
+ for (uint32_t i = 0; i < mUnstamped.Length(); ++i) {
+ ogg_packet* packet = mUnstamped[i];
+#ifdef DEBUG
+ NS_ASSERTION(!IsHeader(packet), "Don't try to recover header packet gp");
+ NS_ASSERTION(packet->granulepos != -1, "Packet must have gp by now");
+#endif
+ mPackets.Append(packet);
+ }
+ mUnstamped.Clear();
+ }
+ return NS_OK;
+}
+
+// Returns 1 if the Theora info struct is decoding a media of Theora
+// version (maj,min,sub) or later, otherwise returns 0.
+int
+TheoraVersion(th_info* info,
+ unsigned char maj,
+ unsigned char min,
+ unsigned char sub)
+{
+ ogg_uint32_t ver = (maj << 16) + (min << 8) + sub;
+ ogg_uint32_t th_ver = (info->version_major << 16) +
+ (info->version_minor << 8) +
+ info->version_subminor;
+ return (th_ver >= ver) ? 1 : 0;
+}
+
+void
+TheoraState::ReconstructTheoraGranulepos()
+{
+ if (mUnstamped.Length() == 0) {
+ return;
+ }
+ ogg_int64_t lastGranulepos = mUnstamped[mUnstamped.Length() - 1]->granulepos;
+ NS_ASSERTION(lastGranulepos != -1, "Must know last granulepos");
+
+ // Reconstruct the granulepos (and thus timestamps) of the decoded
+ // frames. Granulepos are stored as ((keyframe<<shift)+offset). We
+ // know the granulepos of the last frame in the list, so we can infer
+ // the granulepos of the intermediate frames using their frame numbers.
+ ogg_int64_t shift = mInfo.keyframe_granule_shift;
+ ogg_int64_t version_3_2_1 = TheoraVersion(&mInfo,3,2,1);
+ ogg_int64_t lastFrame = th_granule_frame(mCtx,
+ lastGranulepos) + version_3_2_1;
+ ogg_int64_t firstFrame = lastFrame - mUnstamped.Length() + 1;
+
+ // Until we encounter a keyframe, we'll assume that the "keyframe"
+ // segment of the granulepos is the first frame, or if that causes
+ // the "offset" segment to overflow, we assume the required
+ // keyframe is maximumally offset. Until we encounter a keyframe
+ // the granulepos will probably be wrong, but we can't decode the
+ // frame anyway (since we don't have its keyframe) so it doesn't really
+ // matter.
+ ogg_int64_t keyframe = lastGranulepos >> shift;
+
+ // The lastFrame, firstFrame, keyframe variables, as well as the frame
+ // variable in the loop below, store the frame number for Theora
+ // version >= 3.2.1 streams, and store the frame index for Theora
+ // version < 3.2.1 streams.
+ for (uint32_t i = 0; i < mUnstamped.Length() - 1; ++i) {
+ ogg_int64_t frame = firstFrame + i;
+ ogg_int64_t granulepos;
+ ogg_packet* packet = mUnstamped[i];
+ bool isKeyframe = th_packet_iskeyframe(packet) == 1;
+
+ if (isKeyframe) {
+ granulepos = frame << shift;
+ keyframe = frame;
+ } else if (frame >= keyframe &&
+ frame - keyframe < ((ogg_int64_t)1 << shift))
+ {
+ // (frame - keyframe) won't overflow the "offset" segment of the
+ // granulepos, so it's safe to calculate the granulepos.
+ granulepos = (keyframe << shift) + (frame - keyframe);
+ } else {
+ // (frame - keyframeno) will overflow the "offset" segment of the
+ // granulepos, so we take "keyframe" to be the max possible offset
+ // frame instead.
+ ogg_int64_t k = std::max(frame - (((ogg_int64_t)1 << shift) - 1), version_3_2_1);
+ granulepos = (k << shift) + (frame - k);
+ }
+ // Theora 3.2.1+ granulepos store frame number [1..N], so granulepos
+ // should be > 0.
+ // Theora 3.2.0 granulepos store the frame index [0..(N-1)], so
+ // granulepos should be >= 0.
+ NS_ASSERTION(granulepos >= version_3_2_1,
+ "Invalid granulepos for Theora version");
+
+ // Check that the frame's granule number is one more than the
+ // previous frame's.
+ NS_ASSERTION(i == 0 ||
+ th_granule_frame(mCtx, granulepos) ==
+ th_granule_frame(mCtx, mUnstamped[i-1]->granulepos) + 1,
+ "Granulepos calculation is incorrect!");
+
+ packet->granulepos = granulepos;
+ }
+
+ // Check that the second to last frame's granule number is one less than
+ // the last frame's (the known granule number). If not our granulepos
+ // recovery missed a beat.
+ NS_ASSERTION(mUnstamped.Length() < 2 ||
+ th_granule_frame(mCtx, mUnstamped[mUnstamped.Length()-2]->granulepos) + 1 ==
+ th_granule_frame(mCtx, lastGranulepos),
+ "Granulepos recovery should catch up with packet->granulepos!");
+}
+
+nsresult
+VorbisState::Reset()
+{
+ nsresult res = NS_OK;
+ if (mActive && vorbis_synthesis_restart(&mDsp) != 0) {
+ res = NS_ERROR_FAILURE;
+ }
+ if (NS_FAILED(OggCodecState::Reset())) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mGranulepos = 0;
+ mPrevVorbisBlockSize = 0;
+
+ return res;
+}
+
+VorbisState::VorbisState(ogg_page* aBosPage)
+ : OggCodecState(aBosPage, true)
+ , mPrevVorbisBlockSize(0)
+ , mGranulepos(0)
+{
+ MOZ_COUNT_CTOR(VorbisState);
+ vorbis_info_init(&mInfo);
+ vorbis_comment_init(&mComment);
+ memset(&mDsp, 0, sizeof(vorbis_dsp_state));
+ memset(&mBlock, 0, sizeof(vorbis_block));
+}
+
+VorbisState::~VorbisState()
+{
+ MOZ_COUNT_DTOR(VorbisState);
+ Reset();
+ vorbis_block_clear(&mBlock);
+ vorbis_dsp_clear(&mDsp);
+ vorbis_info_clear(&mInfo);
+ vorbis_comment_clear(&mComment);
+}
+
+bool
+VorbisState::DecodeHeader(ogg_packet* aPacket)
+{
+ nsAutoRef<ogg_packet> autoRelease(aPacket);
+ mPacketCount++;
+ int ret = vorbis_synthesis_headerin(&mInfo,
+ &mComment,
+ aPacket);
+ // We must determine when we've read the last header packet.
+ // vorbis_synthesis_headerin() does not tell us when it's read the last
+ // header, so we must keep track of the headers externally.
+ //
+ // There are 3 header packets, the Identification, Comment, and Setup
+ // headers, which must be in that order. If they're out of order, the file
+ // is invalid. If we've successfully read a header, and it's the setup
+ // header, then we're done reading headers. The first byte of each packet
+ // determines it's type as follows:
+ // 0x1 -> Identification header
+ // 0x3 -> Comment header
+ // 0x5 -> Setup header
+ // For more details of the Vorbis/Ogg containment scheme, see the Vorbis I
+ // Specification, Chapter 4, Codec Setup and Packet Decode:
+ // http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-580004
+
+ bool isSetupHeader = aPacket->bytes > 0 && aPacket->packet[0] == 0x5;
+
+ if (ret < 0 || mPacketCount > 3) {
+ // We've received an error, or the first three packets weren't valid
+ // header packets. Assume bad input. Our caller will deactivate the
+ // bitstream.
+ return false;
+ } else if (ret == 0 && isSetupHeader && mPacketCount == 3) {
+ // Successfully read the three header packets.
+ // The bitstream remains active.
+ mDoneReadingHeaders = true;
+ }
+ return true;
+}
+
+bool
+VorbisState::Init()
+{
+ if (!mActive) {
+ return false;
+ }
+
+ int ret = vorbis_synthesis_init(&mDsp, &mInfo);
+ if (ret != 0) {
+ NS_WARNING("vorbis_synthesis_init() failed initializing vorbis bitstream");
+ return mActive = false;
+ }
+ ret = vorbis_block_init(&mDsp, &mBlock);
+ if (ret != 0) {
+ NS_WARNING("vorbis_block_init() failed initializing vorbis bitstream");
+ if (mActive) {
+ vorbis_dsp_clear(&mDsp);
+ }
+ return mActive = false;
+ }
+ return true;
+}
+
+int64_t
+VorbisState::Time(int64_t granulepos)
+{
+ if (!mActive) {
+ return -1;
+ }
+
+ return VorbisState::Time(&mInfo, granulepos);
+}
+
+int64_t
+VorbisState::Time(vorbis_info* aInfo, int64_t aGranulepos)
+{
+ if (aGranulepos == -1 || aInfo->rate == 0) {
+ return -1;
+ }
+ CheckedInt64 t = SaferMultDiv(aGranulepos, USECS_PER_S, aInfo->rate);
+ return t.isValid() ? t.value() : 0;
+}
+
+int64_t
+VorbisState::PacketDuration(ogg_packet* aPacket)
+{
+ if (!mActive) {
+ return -1;
+ }
+ if (aPacket->granulepos == -1) {
+ return -1;
+ }
+ // @FIXME store these in a more stable place
+ if (mVorbisPacketSamples.count(aPacket) == 0) {
+ // We haven't seen this packet, don't know its size?
+ return -1;
+ }
+
+ long samples = mVorbisPacketSamples[aPacket];
+ return Time(samples);
+}
+
+bool
+VorbisState::IsHeader(ogg_packet* aPacket)
+{
+ // The first byte in each Vorbis header packet is either 0x01, 0x03, or 0x05,
+ // i.e. the first bit is odd. Audio data packets have their first bit as 0x0.
+ // Any packet with its first bit set cannot be a data packet, it's a
+ // (possibly invalid) header packet.
+ // See: http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-610004.2.1
+ return aPacket->bytes > 0 ? (aPacket->packet[0] & 0x1) : false;
+}
+
+MetadataTags*
+VorbisState::GetTags()
+{
+ MetadataTags* tags;
+ NS_ASSERTION(mComment.user_comments, "no vorbis comment strings!");
+ NS_ASSERTION(mComment.comment_lengths, "no vorbis comment lengths!");
+ tags = new MetadataTags;
+ for (int i = 0; i < mComment.comments; i++) {
+ AddVorbisComment(tags, mComment.user_comments[i],
+ mComment.comment_lengths[i]);
+ }
+ return tags;
+}
+
+nsresult
+VorbisState::PageIn(ogg_page* aPage)
+{
+ if (!mActive) {
+ return NS_OK;
+ }
+ NS_ASSERTION(static_cast<uint32_t>(ogg_page_serialno(aPage)) == mSerial,
+ "Page must be for this stream!");
+ if (ogg_stream_pagein(&mState, aPage) == -1)
+ return NS_ERROR_FAILURE;
+ bool foundGp;
+ nsresult res = PacketOutUntilGranulepos(foundGp);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+ if (foundGp && mDoneReadingHeaders) {
+ // We've found a packet with a granulepos, and we've loaded our metadata
+ // and initialized our decoder. Determine granulepos of buffered packets.
+ ReconstructVorbisGranulepos();
+ for (uint32_t i = 0; i < mUnstamped.Length(); ++i) {
+ ogg_packet* packet = mUnstamped[i];
+ AssertHasRecordedPacketSamples(packet);
+ NS_ASSERTION(!IsHeader(packet), "Don't try to recover header packet gp");
+ NS_ASSERTION(packet->granulepos != -1, "Packet must have gp by now");
+ mPackets.Append(packet);
+ }
+ mUnstamped.Clear();
+ }
+ return NS_OK;
+}
+
+nsresult
+VorbisState::ReconstructVorbisGranulepos()
+{
+ // The number of samples in a Vorbis packet is:
+ // window_blocksize(previous_packet)/4+window_blocksize(current_packet)/4
+ // See: http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-230001.3.2
+ // So we maintain mPrevVorbisBlockSize, the block size of the last packet
+ // encountered. We also maintain mGranulepos, which is the granulepos of
+ // the last encountered packet. This enables us to give granulepos to
+ // packets when the last packet in mUnstamped doesn't have a granulepos
+ // (for example if the stream was truncated).
+ //
+ // We validate our prediction of the number of samples decoded when
+ // VALIDATE_VORBIS_SAMPLE_CALCULATION is defined by recording the predicted
+ // number of samples, and verifing we extract that many when decoding
+ // each packet.
+
+ NS_ASSERTION(mUnstamped.Length() > 0, "Length must be > 0");
+ ogg_packet* last = mUnstamped.LastElement();
+ NS_ASSERTION(last->e_o_s || last->granulepos >= 0,
+ "Must know last granulepos!");
+ if (mUnstamped.Length() == 1) {
+ ogg_packet* packet = mUnstamped[0];
+ long blockSize = vorbis_packet_blocksize(&mInfo, packet);
+ if (blockSize < 0) {
+ // On failure vorbis_packet_blocksize returns < 0. If we've got
+ // a bad packet, we just assume that decode will have to skip this
+ // packet, i.e. assume 0 samples are decodable from this packet.
+ blockSize = 0;
+ mPrevVorbisBlockSize = 0;
+ }
+ long samples = mPrevVorbisBlockSize / 4 + blockSize / 4;
+ mPrevVorbisBlockSize = blockSize;
+ if (packet->granulepos == -1) {
+ packet->granulepos = mGranulepos + samples;
+ }
+
+ // Account for a partial last frame
+ if (packet->e_o_s && packet->granulepos >= mGranulepos) {
+ samples = packet->granulepos - mGranulepos;
+ }
+
+ mGranulepos = packet->granulepos;
+ RecordVorbisPacketSamples(packet, samples);
+ return NS_OK;
+ }
+
+ bool unknownGranulepos = last->granulepos == -1;
+ int totalSamples = 0;
+ for (int32_t i = mUnstamped.Length() - 1; i > 0; i--) {
+ ogg_packet* packet = mUnstamped[i];
+ ogg_packet* prev = mUnstamped[i-1];
+ ogg_int64_t granulepos = packet->granulepos;
+ NS_ASSERTION(granulepos != -1, "Must know granulepos!");
+ long prevBlockSize = vorbis_packet_blocksize(&mInfo, prev);
+ long blockSize = vorbis_packet_blocksize(&mInfo, packet);
+
+ if (blockSize < 0 || prevBlockSize < 0) {
+ // On failure vorbis_packet_blocksize returns < 0. If we've got
+ // a bad packet, we just assume that decode will have to skip this
+ // packet, i.e. assume 0 samples are decodable from this packet.
+ blockSize = 0;
+ prevBlockSize = 0;
+ }
+
+ long samples = prevBlockSize / 4 + blockSize / 4;
+ totalSamples += samples;
+ prev->granulepos = granulepos - samples;
+ RecordVorbisPacketSamples(packet, samples);
+ }
+
+ if (unknownGranulepos) {
+ for (uint32_t i = 0; i < mUnstamped.Length(); i++) {
+ ogg_packet* packet = mUnstamped[i];
+ packet->granulepos += mGranulepos + totalSamples + 1;
+ }
+ }
+
+ ogg_packet* first = mUnstamped[0];
+ long blockSize = vorbis_packet_blocksize(&mInfo, first);
+ if (blockSize < 0) {
+ mPrevVorbisBlockSize = 0;
+ blockSize = 0;
+ }
+
+ long samples = (mPrevVorbisBlockSize == 0) ? 0 :
+ mPrevVorbisBlockSize / 4 + blockSize / 4;
+ int64_t start = first->granulepos - samples;
+ RecordVorbisPacketSamples(first, samples);
+
+ if (last->e_o_s && start < mGranulepos) {
+ // We've calculated that there are more samples in this page than its
+ // granulepos claims, and it's the last page in the stream. This is legal,
+ // and we will need to prune the trailing samples when we come to decode it.
+ // We must correct the timestamps so that they follow the last Vorbis page's
+ // samples.
+ int64_t pruned = mGranulepos - start;
+ for (uint32_t i = 0; i < mUnstamped.Length() - 1; i++) {
+ mUnstamped[i]->granulepos += pruned;
+ }
+#ifdef VALIDATE_VORBIS_SAMPLE_CALCULATION
+ mVorbisPacketSamples[last] -= pruned;
+#endif
+ }
+
+ mPrevVorbisBlockSize = vorbis_packet_blocksize(&mInfo, last);
+ mPrevVorbisBlockSize = std::max(static_cast<long>(0), mPrevVorbisBlockSize);
+ mGranulepos = last->granulepos;
+
+ return NS_OK;
+}
+
+OpusState::OpusState(ogg_page* aBosPage)
+ : OggCodecState(aBosPage, true)
+ , mParser(nullptr)
+ , mDecoder(nullptr)
+ , mSkip(0)
+ , mPrevPacketGranulepos(0)
+ , mPrevPageGranulepos(0)
+{
+ MOZ_COUNT_CTOR(OpusState);
+}
+
+OpusState::~OpusState()
+{
+ MOZ_COUNT_DTOR(OpusState);
+ Reset();
+
+ if (mDecoder) {
+ opus_multistream_decoder_destroy(mDecoder);
+ mDecoder = nullptr;
+ }
+}
+
+nsresult
+OpusState::Reset()
+{
+ return Reset(false);
+}
+
+nsresult
+OpusState::Reset(bool aStart)
+{
+ nsresult res = NS_OK;
+
+ if (mActive && mDecoder) {
+ // Reset the decoder.
+ opus_multistream_decoder_ctl(mDecoder, OPUS_RESET_STATE);
+ // Let the seek logic handle pre-roll if we're not seeking to the start.
+ mSkip = aStart ? mParser->mPreSkip : 0;
+ // This lets us distinguish the first page being the last page vs. just
+ // not having processed the previous page when we encounter the last page.
+ mPrevPageGranulepos = aStart ? 0 : -1;
+ mPrevPacketGranulepos = aStart ? 0 : -1;
+ }
+
+ // Clear queued data.
+ if (NS_FAILED(OggCodecState::Reset())) {
+ return NS_ERROR_FAILURE;
+ }
+
+ LOG(LogLevel::Debug, ("Opus decoder reset, to skip %d", mSkip));
+
+ return res;
+}
+
+bool
+OpusState::Init(void)
+{
+ if (!mActive) {
+ return false;
+ }
+
+ int error;
+
+ NS_ASSERTION(mDecoder == nullptr, "leaking OpusDecoder");
+
+ mDecoder = opus_multistream_decoder_create(mParser->mRate,
+ mParser->mChannels,
+ mParser->mStreams,
+ mParser->mCoupledStreams,
+ mParser->mMappingTable,
+ &error);
+
+ mSkip = mParser->mPreSkip;
+
+ LOG(LogLevel::Debug, ("Opus decoder init, to skip %d", mSkip));
+
+ return error == OPUS_OK;
+}
+
+bool
+OpusState::DecodeHeader(ogg_packet* aPacket)
+{
+ nsAutoRef<ogg_packet> autoRelease(aPacket);
+ switch(mPacketCount++) {
+ // Parse the id header.
+ case 0:
+ mParser = new OpusParser;
+ if (!mParser->DecodeHeader(aPacket->packet, aPacket->bytes)) {
+ return false;
+ }
+ mRate = mParser->mRate;
+ mChannels = mParser->mChannels;
+ mPreSkip = mParser->mPreSkip;
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ mGain = mParser->mGain;
+#else
+ mGain_Q16 = mParser->mGain_Q16;
+#endif
+ break;
+
+ // Parse the metadata header.
+ case 1:
+ if (!mParser->DecodeTags(aPacket->packet, aPacket->bytes)) {
+ return false;
+ }
+ break;
+
+ // We made it to the first data packet (which includes reconstructing
+ // timestamps for it in PageIn). Success!
+ default:
+ mDoneReadingHeaders = true;
+ // Put it back on the queue so we can decode it.
+ mPackets.PushFront(autoRelease.disown());
+ break;
+ }
+ return true;
+}
+
+/* Construct and return a tags hashmap from our internal array */
+MetadataTags*
+OpusState::GetTags()
+{
+ MetadataTags* tags;
+
+ tags = new MetadataTags;
+ for (uint32_t i = 0; i < mParser->mTags.Length(); i++) {
+ AddVorbisComment(tags, mParser->mTags[i].Data(), mParser->mTags[i].Length());
+ }
+
+ return tags;
+}
+
+/* Return the timestamp (in microseconds) equivalent to a granulepos. */
+int64_t
+OpusState::Time(int64_t aGranulepos)
+{
+ if (!mActive) {
+ return -1;
+ }
+
+ return Time(mParser->mPreSkip, aGranulepos);
+}
+
+int64_t
+OpusState::Time(int aPreSkip, int64_t aGranulepos)
+{
+ if (aGranulepos < 0) {
+ return -1;
+ }
+
+ // Ogg Opus always runs at a granule rate of 48 kHz.
+ CheckedInt64 t = SaferMultDiv(aGranulepos - aPreSkip, USECS_PER_S, 48000);
+ return t.isValid() ? t.value() : -1;
+}
+
+bool
+OpusState::IsHeader(ogg_packet* aPacket)
+{
+ return aPacket->bytes >= 16 &&
+ (!memcmp(aPacket->packet, "OpusHead", 8) ||
+ !memcmp(aPacket->packet, "OpusTags", 8));
+}
+
+nsresult
+OpusState::PageIn(ogg_page* aPage)
+{
+ if (!mActive) {
+ return NS_OK;
+ }
+ NS_ASSERTION(static_cast<uint32_t>(ogg_page_serialno(aPage)) == mSerial,
+ "Page must be for this stream!");
+ if (ogg_stream_pagein(&mState, aPage) == -1)
+ return NS_ERROR_FAILURE;
+
+ bool haveGranulepos;
+ nsresult rv = PacketOutUntilGranulepos(haveGranulepos);
+ if (NS_FAILED(rv) || !haveGranulepos || mPacketCount < 2) {
+ return rv;
+ }
+ if (!ReconstructOpusGranulepos()) {
+ return NS_ERROR_FAILURE;
+ }
+ for (uint32_t i = 0; i < mUnstamped.Length(); i++) {
+ ogg_packet* packet = mUnstamped[i];
+ NS_ASSERTION(!IsHeader(packet), "Don't try to play a header packet");
+ NS_ASSERTION(packet->granulepos != -1, "Packet should have a granulepos");
+ mPackets.Append(packet);
+ }
+ mUnstamped.Clear();
+ return NS_OK;
+}
+
+// Helper method to return the change in granule position due to an Opus packet
+// (as distinct from the number of samples in the packet, which depends on the
+// decoder rate). It should work with a multistream Opus file, and continue to
+// work should we ever allow the decoder to decode at a rate other than 48 kHz.
+// It even works before we've created the actual Opus decoder.
+static int
+GetOpusDeltaGP(ogg_packet* packet)
+{
+ int nframes;
+ nframes = opus_packet_get_nb_frames(packet->packet, packet->bytes);
+ if (nframes > 0) {
+ return nframes*opus_packet_get_samples_per_frame(packet->packet, 48000);
+ }
+ NS_WARNING("Invalid Opus packet.");
+ return nframes;
+}
+
+int64_t
+OpusState::PacketDuration(ogg_packet* aPacket)
+{
+ CheckedInt64 t = SaferMultDiv(GetOpusDeltaGP(aPacket), USECS_PER_S, 48000);
+ return t.isValid() ? t.value() : -1;
+}
+
+bool
+OpusState::ReconstructOpusGranulepos(void)
+{
+ NS_ASSERTION(mUnstamped.Length() > 0, "Must have unstamped packets");
+ ogg_packet* last = mUnstamped.LastElement();
+ NS_ASSERTION(last->e_o_s || last->granulepos > 0,
+ "Must know last granulepos!");
+ int64_t gp;
+ // If this is the last page, and we've seen at least one previous page (or
+ // this is the first page)...
+ if (last->e_o_s) {
+ if (mPrevPageGranulepos != -1) {
+ // If this file only has one page and the final granule position is
+ // smaller than the pre-skip amount, we MUST reject the stream.
+ if (!mDoneReadingHeaders && last->granulepos < mPreSkip)
+ return false;
+ int64_t last_gp = last->granulepos;
+ gp = mPrevPageGranulepos;
+ // Loop through the packets forwards, adding the current packet's
+ // duration to the previous granulepos to get the value for the
+ // current packet.
+ for (uint32_t i = 0; i < mUnstamped.Length() - 1; ++i) {
+ ogg_packet* packet = mUnstamped[i];
+ int offset = GetOpusDeltaGP(packet);
+ // Check for error (negative offset) and overflow.
+ if (offset >= 0 && gp <= INT64_MAX - offset) {
+ gp += offset;
+ if (gp >= last_gp) {
+ NS_WARNING("Opus end trimming removed more than a full packet.");
+ // We were asked to remove a full packet's worth of data or more.
+ // Encoders SHOULD NOT produce streams like this, but we'll handle
+ // it for them anyway.
+ gp = last_gp;
+ for (uint32_t j = i+1; j < mUnstamped.Length(); ++j) {
+ OggCodecState::ReleasePacket(mUnstamped[j]);
+ }
+ mUnstamped.RemoveElementsAt(i+1, mUnstamped.Length() - (i+1));
+ last = packet;
+ last->e_o_s = 1;
+ }
+ }
+ packet->granulepos = gp;
+ }
+ mPrevPageGranulepos = last_gp;
+ return true;
+ } else {
+ NS_WARNING("No previous granule position to use for Opus end trimming.");
+ // If we don't have a previous granule position, fall through.
+ // We simply won't trim any samples from the end.
+ // TODO: Are we guaranteed to have seen a previous page if there is one?
+ }
+ }
+
+ gp = last->granulepos;
+ // Loop through the packets backwards, subtracting the next
+ // packet's duration from its granulepos to get the value
+ // for the current packet.
+ for (uint32_t i = mUnstamped.Length() - 1; i > 0; i--) {
+ int offset = GetOpusDeltaGP(mUnstamped[i]);
+ // Check for error (negative offset) and overflow.
+ if (offset >= 0) {
+ if (offset <= gp) {
+ gp -= offset;
+ } else {
+ // If the granule position of the first data page is smaller than the
+ // number of decodable audio samples on that page, then we MUST reject
+ // the stream.
+ if (!mDoneReadingHeaders)
+ return false;
+ // It's too late to reject the stream.
+ // If we get here, this almost certainly means the file has screwed-up
+ // timestamps somewhere after the first page.
+ NS_WARNING("Clamping negative Opus granulepos to zero.");
+ gp = 0;
+ }
+ }
+ mUnstamped[i - 1]->granulepos = gp;
+ }
+
+ // Check to make sure the first granule position is at least as large as the
+ // total number of samples decodable from the first page with completed
+ // packets. This requires looking at the duration of the first packet, too.
+ // We MUST reject such streams.
+ if (!mDoneReadingHeaders && GetOpusDeltaGP(mUnstamped[0]) > gp) {
+ return false;
+ }
+ mPrevPageGranulepos = last->granulepos;
+ return true;
+}
+
+already_AddRefed<MediaRawData>
+OpusState::PacketOutAsMediaRawData()
+{
+ ogg_packet* packet = PacketPeek();
+ uint32_t frames = 0;
+ const int64_t endFrame = packet->granulepos;
+
+ if (!packet) {
+ return nullptr;
+ }
+ if (packet->e_o_s) {
+ frames = GetOpusDeltaGP(packet);
+ }
+
+ RefPtr<MediaRawData> data = OggCodecState::PacketOutAsMediaRawData();
+ if (!data) {
+ return nullptr;
+ }
+
+ if (data->mEOS && mPrevPacketGranulepos != -1) {
+ // If this is the last packet, perform end trimming.
+ int64_t startFrame = mPrevPacketGranulepos;
+ frames -= std::max<int64_t>(
+ 0, std::min(endFrame - startFrame, static_cast<int64_t>(frames)));
+ data->mDiscardPadding = frames;
+ }
+
+ // Save this packet's granule position in case we need to perform end
+ // trimming on the next packet.
+ mPrevPacketGranulepos = endFrame;
+
+ return data.forget();
+}
+
+FlacState::FlacState(ogg_page* aBosPage)
+ : OggCodecState(aBosPage, true)
+{
+}
+
+bool
+FlacState::DecodeHeader(ogg_packet* aPacket)
+{
+ nsAutoRef<ogg_packet> autoRelease(aPacket);
+
+ if (!mParser.DecodeHeaderBlock(aPacket->packet, aPacket->bytes)) {
+ return false;
+ }
+ if (mParser.HasFullMetadata()) {
+ mDoneReadingHeaders = true;
+ }
+ return true;
+}
+
+int64_t
+FlacState::Time(int64_t granulepos)
+{
+ if (!mParser.mInfo.IsValid()) {
+ return -1;
+ }
+ CheckedInt64 t =
+ SaferMultDiv(granulepos, USECS_PER_S, mParser.mInfo.mRate);
+ if (!t.isValid()) {
+ return -1;
+ }
+ return t.value();
+}
+
+int64_t
+FlacState::PacketDuration(ogg_packet* aPacket)
+{
+ return mParser.BlockDuration(aPacket->packet, aPacket->bytes);
+}
+
+bool
+FlacState::IsHeader(ogg_packet* aPacket)
+{
+ return mParser.IsHeaderBlock(aPacket->packet, aPacket->bytes);
+}
+
+nsresult
+FlacState::PageIn(ogg_page* aPage)
+{
+ if (!mActive) {
+ return NS_OK;
+ }
+ NS_ASSERTION(static_cast<uint32_t>(ogg_page_serialno(aPage)) == mSerial,
+ "Page must be for this stream!");
+ if (ogg_stream_pagein(&mState, aPage) == -1)
+ return NS_ERROR_FAILURE;
+ bool foundGp;
+ nsresult res = PacketOutUntilGranulepos(foundGp);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+ if (foundGp && mDoneReadingHeaders) {
+ // We've found a packet with a granulepos, and we've loaded our metadata
+ // and initialized our decoder. Determine granulepos of buffered packets.
+ ReconstructFlacGranulepos();
+ for (uint32_t i = 0; i < mUnstamped.Length(); ++i) {
+ ogg_packet* packet = mUnstamped[i];
+ NS_ASSERTION(!IsHeader(packet), "Don't try to recover header packet gp");
+ NS_ASSERTION(packet->granulepos != -1, "Packet must have gp by now");
+ mPackets.Append(packet);
+ }
+ mUnstamped.Clear();
+ }
+ return NS_OK;
+}
+
+// Return a hash table with tag metadata.
+MetadataTags*
+FlacState::GetTags()
+{
+ return mParser.GetTags();
+}
+
+const AudioInfo&
+FlacState::Info()
+{
+ return mParser.mInfo;
+}
+
+bool
+FlacState::ReconstructFlacGranulepos(void)
+{
+ NS_ASSERTION(mUnstamped.Length() > 0, "Must have unstamped packets");
+ ogg_packet* last = mUnstamped.LastElement();
+ NS_ASSERTION(last->e_o_s || last->granulepos > 0,
+ "Must know last granulepos!");
+ int64_t gp;
+
+ gp = last->granulepos;
+ // Loop through the packets backwards, subtracting the next
+ // packet's duration from its granulepos to get the value
+ // for the current packet.
+ for (uint32_t i = mUnstamped.Length() - 1; i > 0; i--) {
+ int offset =
+ mParser.BlockDuration(mUnstamped[i]->packet, mUnstamped[i]->bytes);
+ // Check for error (negative offset) and overflow.
+ if (offset >= 0) {
+ if (offset <= gp) {
+ gp -= offset;
+ } else {
+ // If the granule position of the first data page is smaller than the
+ // number of decodable audio samples on that page, then we MUST reject
+ // the stream.
+ if (!mDoneReadingHeaders) {
+ return false;
+ }
+ // It's too late to reject the stream.
+ // If we get here, this almost certainly means the file has screwed-up
+ // timestamps somewhere after the first page.
+ NS_WARNING("Clamping negative granulepos to zero.");
+ gp = 0;
+ }
+ }
+ mUnstamped[i - 1]->granulepos = gp;
+ }
+
+ return true;
+}
+
+SkeletonState::SkeletonState(ogg_page* aBosPage)
+ : OggCodecState(aBosPage, true)
+ , mVersion(0)
+ , mPresentationTime(0)
+ , mLength(0)
+{
+ MOZ_COUNT_CTOR(SkeletonState);
+}
+
+SkeletonState::~SkeletonState()
+{
+ MOZ_COUNT_DTOR(SkeletonState);
+}
+
+// Support for Ogg Skeleton 4.0, as per specification at:
+// http://wiki.xiph.org/Ogg_Skeleton_4
+
+// Minimum length in bytes of a Skeleton header packet.
+static const long SKELETON_MIN_HEADER_LEN = 28;
+static const long SKELETON_4_0_MIN_HEADER_LEN = 80;
+
+// Minimum length in bytes of a Skeleton 4.0 index packet.
+static const long SKELETON_4_0_MIN_INDEX_LEN = 42;
+
+// Minimum length in bytes of a Skeleton 3.0/4.0 Fisbone packet.
+static const long SKELETON_MIN_FISBONE_LEN = 52;
+
+// Minimum possible size of a compressed index keypoint.
+static const size_t MIN_KEY_POINT_SIZE = 2;
+
+// Byte offset of the major and minor version numbers in the
+// Ogg Skeleton 4.0 header packet.
+static const size_t SKELETON_VERSION_MAJOR_OFFSET = 8;
+static const size_t SKELETON_VERSION_MINOR_OFFSET = 10;
+
+// Byte-offsets of the presentation time numerator and denominator
+static const size_t SKELETON_PRESENTATION_TIME_NUMERATOR_OFFSET = 12;
+static const size_t SKELETON_PRESENTATION_TIME_DENOMINATOR_OFFSET = 20;
+
+// Byte-offsets of the length of file field in the Skeleton 4.0 header packet.
+static const size_t SKELETON_FILE_LENGTH_OFFSET = 64;
+
+// Byte-offsets of the fields in the Skeleton index packet.
+static const size_t INDEX_SERIALNO_OFFSET = 6;
+static const size_t INDEX_NUM_KEYPOINTS_OFFSET = 10;
+static const size_t INDEX_TIME_DENOM_OFFSET = 18;
+static const size_t INDEX_FIRST_NUMER_OFFSET = 26;
+static const size_t INDEX_LAST_NUMER_OFFSET = 34;
+static const size_t INDEX_KEYPOINT_OFFSET = 42;
+
+// Byte-offsets of the fields in the Skeleton Fisbone packet.
+static const size_t FISBONE_MSG_FIELDS_OFFSET = 8;
+static const size_t FISBONE_SERIALNO_OFFSET = 12;
+
+static bool
+IsSkeletonBOS(ogg_packet* aPacket)
+{
+ static_assert(SKELETON_MIN_HEADER_LEN >= 8,
+ "Minimum length of skeleton BOS header incorrect");
+ return aPacket->bytes >= SKELETON_MIN_HEADER_LEN &&
+ memcmp(reinterpret_cast<char*>(aPacket->packet), "fishead", 8) == 0;
+}
+
+static bool
+IsSkeletonIndex(ogg_packet* aPacket)
+{
+ static_assert(SKELETON_4_0_MIN_INDEX_LEN >= 5,
+ "Minimum length of skeleton index header incorrect");
+ return aPacket->bytes >= SKELETON_4_0_MIN_INDEX_LEN &&
+ memcmp(reinterpret_cast<char*>(aPacket->packet), "index", 5) == 0;
+}
+
+static bool
+IsSkeletonFisbone(ogg_packet* aPacket)
+{
+ static_assert(SKELETON_MIN_FISBONE_LEN >= 8,
+ "Minimum length of skeleton fisbone header incorrect");
+ return aPacket->bytes >= SKELETON_MIN_FISBONE_LEN &&
+ memcmp(reinterpret_cast<char*>(aPacket->packet), "fisbone", 8) == 0;
+}
+
+// Reads a variable length encoded integer at p. Will not read
+// past aLimit. Returns pointer to character after end of integer.
+static const unsigned char*
+ReadVariableLengthInt(const unsigned char* p,
+ const unsigned char* aLimit,
+ int64_t& n)
+{
+ int shift = 0;
+ int64_t byte = 0;
+ n = 0;
+ while (p < aLimit &&
+ (byte & 0x80) != 0x80 &&
+ shift < 57)
+ {
+ byte = static_cast<int64_t>(*p);
+ n |= ((byte & 0x7f) << shift);
+ shift += 7;
+ p++;
+ }
+ return p;
+}
+
+bool
+SkeletonState::DecodeIndex(ogg_packet* aPacket)
+{
+ NS_ASSERTION(aPacket->bytes >= SKELETON_4_0_MIN_INDEX_LEN,
+ "Index must be at least minimum size");
+ if (!mActive) {
+ return false;
+ }
+
+ uint32_t serialno = LittleEndian::readUint32(aPacket->packet + INDEX_SERIALNO_OFFSET);
+ int64_t numKeyPoints = LittleEndian::readInt64(aPacket->packet + INDEX_NUM_KEYPOINTS_OFFSET);
+
+ int64_t endTime = 0, startTime = 0;
+ const unsigned char* p = aPacket->packet;
+
+ int64_t timeDenom = LittleEndian::readInt64(aPacket->packet + INDEX_TIME_DENOM_OFFSET);
+ if (timeDenom == 0) {
+ LOG(LogLevel::Debug, ("Ogg Skeleton Index packet for stream %u has 0 "
+ "timestamp denominator.", serialno));
+ return (mActive = false);
+ }
+
+ // Extract the start time.
+ int64_t timeRawInt = LittleEndian::readInt64(p + INDEX_FIRST_NUMER_OFFSET);
+ CheckedInt64 t = SaferMultDiv(timeRawInt, USECS_PER_S, timeDenom);
+ if (!t.isValid()) {
+ return (mActive = false);
+ } else {
+ startTime = t.value();
+ }
+
+ // Extract the end time.
+ timeRawInt = LittleEndian::readInt64(p + INDEX_LAST_NUMER_OFFSET);
+ t = SaferMultDiv(timeRawInt, USECS_PER_S, timeDenom);
+ if (!t.isValid()) {
+ return (mActive = false);
+ } else {
+ endTime = t.value();
+ }
+
+ // Check the numKeyPoints value read, ensure we're not going to run out of
+ // memory while trying to decode the index packet.
+ CheckedInt64 minPacketSize =
+ (CheckedInt64(numKeyPoints) * MIN_KEY_POINT_SIZE) + INDEX_KEYPOINT_OFFSET;
+ if (!minPacketSize.isValid())
+ {
+ return (mActive = false);
+ }
+
+ int64_t sizeofIndex = aPacket->bytes - INDEX_KEYPOINT_OFFSET;
+ int64_t maxNumKeyPoints = sizeofIndex / MIN_KEY_POINT_SIZE;
+ if (aPacket->bytes < minPacketSize.value() ||
+ numKeyPoints > maxNumKeyPoints ||
+ numKeyPoints < 0) {
+ // Packet size is less than the theoretical minimum size, or the packet is
+ // claiming to store more keypoints than it's capable of storing. This means
+ // that the numKeyPoints field is too large or small for the packet to
+ // possibly contain as many packets as it claims to, so the numKeyPoints
+ // field is possibly malicious. Don't try decoding this index, we may run
+ // out of memory.
+ LOG(LogLevel::Debug, ("Possibly malicious number of key points reported "
+ "(%lld) in index packet for stream %u.",
+ numKeyPoints,
+ serialno));
+ return (mActive = false);
+ }
+
+ nsAutoPtr<nsKeyFrameIndex> keyPoints(new nsKeyFrameIndex(startTime, endTime));
+
+ p = aPacket->packet + INDEX_KEYPOINT_OFFSET;
+ const unsigned char* limit = aPacket->packet + aPacket->bytes;
+ int64_t numKeyPointsRead = 0;
+ CheckedInt64 offset = 0;
+ CheckedInt64 time = 0;
+ while (p < limit && numKeyPointsRead < numKeyPoints) {
+ int64_t delta = 0;
+ p = ReadVariableLengthInt(p, limit, delta);
+ offset += delta;
+ if (p == limit ||
+ !offset.isValid() ||
+ offset.value() > mLength ||
+ offset.value() < 0) {
+ return (mActive = false);
+ }
+ p = ReadVariableLengthInt(p, limit, delta);
+ time += delta;
+ if (!time.isValid() ||
+ time.value() > endTime ||
+ time.value() < startTime) {
+ return (mActive = false);
+ }
+ CheckedInt64 timeUsecs = SaferMultDiv(time.value(), USECS_PER_S, timeDenom);
+ if (!timeUsecs.isValid()) {
+ return (mActive = false);
+ }
+ keyPoints->Add(offset.value(), timeUsecs.value());
+ numKeyPointsRead++;
+ }
+
+ int32_t keyPointsRead = keyPoints->Length();
+ if (keyPointsRead > 0) {
+ mIndex.Put(serialno, keyPoints.forget());
+ }
+
+ LOG(LogLevel::Debug, ("Loaded %d keypoints for Skeleton on stream %u",
+ keyPointsRead, serialno));
+ return true;
+}
+
+nsresult
+SkeletonState::IndexedSeekTargetForTrack(uint32_t aSerialno,
+ int64_t aTarget,
+ nsKeyPoint& aResult)
+{
+ nsKeyFrameIndex* index = nullptr;
+ mIndex.Get(aSerialno, &index);
+
+ if (!index || index->Length() == 0 ||
+ aTarget < index->mStartTime || aTarget > index->mEndTime) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Binary search to find the last key point with time less than target.
+ int start = 0;
+ int end = index->Length() - 1;
+ while (end > start) {
+ int mid = start + ((end - start + 1) >> 1);
+ if (index->Get(mid).mTime == aTarget) {
+ start = mid;
+ break;
+ } else if (index->Get(mid).mTime < aTarget) {
+ start = mid;
+ } else {
+ end = mid - 1;
+ }
+ }
+
+ aResult = index->Get(start);
+ NS_ASSERTION(aResult.mTime <= aTarget, "Result should have time <= target");
+ return NS_OK;
+}
+
+nsresult
+SkeletonState::IndexedSeekTarget(int64_t aTarget,
+ nsTArray<uint32_t>& aTracks,
+ nsSeekTarget& aResult)
+{
+ if (!mActive || mVersion < SKELETON_VERSION(4,0)) {
+ return NS_ERROR_FAILURE;
+ }
+ // Loop over all requested tracks' indexes, and get the keypoint for that
+ // seek target. Record the keypoint with the lowest offset, this will be
+ // our seek result. User must seek to the one with lowest offset to ensure we
+ // pass "keyframes" on all tracks when we decode forwards to the seek target.
+ nsSeekTarget r;
+ for (uint32_t i=0; i<aTracks.Length(); i++) {
+ nsKeyPoint k;
+ if (NS_SUCCEEDED(IndexedSeekTargetForTrack(aTracks[i], aTarget, k)) &&
+ k.mOffset < r.mKeyPoint.mOffset) {
+ r.mKeyPoint = k;
+ r.mSerial = aTracks[i];
+ }
+ }
+ if (r.IsNull()) {
+ return NS_ERROR_FAILURE;
+ }
+ LOG(LogLevel::Debug, ("Indexed seek target for time %lld is offset %lld",
+ aTarget, r.mKeyPoint.mOffset));
+ aResult = r;
+ return NS_OK;
+}
+
+nsresult
+SkeletonState::GetDuration(const nsTArray<uint32_t>& aTracks,
+ int64_t& aDuration)
+{
+ if (!mActive ||
+ mVersion < SKELETON_VERSION(4,0) ||
+ !HasIndex() ||
+ aTracks.Length() == 0) {
+ return NS_ERROR_FAILURE;
+ }
+ int64_t endTime = INT64_MIN;
+ int64_t startTime = INT64_MAX;
+ for (uint32_t i=0; i<aTracks.Length(); i++) {
+ nsKeyFrameIndex* index = nullptr;
+ mIndex.Get(aTracks[i], &index);
+ if (!index) {
+ // Can't get the timestamps for one of the required tracks, fail.
+ return NS_ERROR_FAILURE;
+ }
+ if (index->mEndTime > endTime) {
+ endTime = index->mEndTime;
+ }
+ if (index->mStartTime < startTime) {
+ startTime = index->mStartTime;
+ }
+ }
+ NS_ASSERTION(endTime > startTime, "Duration must be positive");
+ CheckedInt64 duration = CheckedInt64(endTime) - startTime;
+ aDuration = duration.isValid() ? duration.value() : 0;
+ return duration.isValid() ? NS_OK : NS_ERROR_FAILURE;
+}
+
+bool
+SkeletonState::DecodeFisbone(ogg_packet* aPacket)
+{
+ if (aPacket->bytes < static_cast<long>(FISBONE_MSG_FIELDS_OFFSET + 4)) {
+ return false;
+ }
+ uint32_t offsetMsgField =
+ LittleEndian::readUint32(aPacket->packet + FISBONE_MSG_FIELDS_OFFSET);
+
+ if (aPacket->bytes < static_cast<long>(FISBONE_SERIALNO_OFFSET + 4)) {
+ return false;
+ }
+ uint32_t serialno =
+ LittleEndian::readUint32(aPacket->packet + FISBONE_SERIALNO_OFFSET);
+
+ CheckedUint32 checked_fields_pos =
+ CheckedUint32(FISBONE_MSG_FIELDS_OFFSET) + offsetMsgField;
+ if (!checked_fields_pos.isValid() ||
+ aPacket->bytes < static_cast<int64_t>(checked_fields_pos.value())) {
+ return false;
+ }
+ int64_t msgLength = aPacket->bytes - checked_fields_pos.value();
+ char* msgProbe = (char*)aPacket->packet + checked_fields_pos.value();
+ char* msgHead = msgProbe;
+ nsAutoPtr<MessageField> field(new MessageField());
+
+ const static FieldPatternType kFieldTypeMaps[] = {
+ {"Content-Type:", eContentType},
+ {"Role:", eRole},
+ {"Name:", eName},
+ {"Language:", eLanguage},
+ {"Title:", eTitle},
+ {"Display-hint:", eDisplayHint},
+ {"Altitude:", eAltitude},
+ {"TrackOrder:", eTrackOrder},
+ {"Track dependencies:", eTrackDependencies}
+ };
+
+ bool isContentTypeParsed = false;
+ while (msgLength > 1) {
+ if (*msgProbe == '\r' && *(msgProbe+1) == '\n') {
+ nsAutoCString strMsg(msgHead, msgProbe-msgHead);
+ for (size_t i = 0; i < ArrayLength(kFieldTypeMaps); i++) {
+ if (strMsg.Find(kFieldTypeMaps[i].mPatternToRecognize) != -1) {
+ // The content of message header fields follows [RFC2822], and the
+ // mandatory message field must be encoded in US-ASCII, others
+ // must be be encoded in UTF-8. "Content-Type" must come first
+ // for all of message header fields.
+ // See http://svn.annodex.net/standards/draft-pfeiffer-oggskeleton-current.txt.
+ if (i != 0 && !isContentTypeParsed) {
+ return false;
+ }
+
+ if ((i == 0 && IsASCII(strMsg)) || (i != 0 && IsUTF8(strMsg))) {
+ EMsgHeaderType eHeaderType = kFieldTypeMaps[i].mMsgHeaderType;
+ if (!field->mValuesStore.Contains(eHeaderType)) {
+ uint32_t nameLen = strlen(kFieldTypeMaps[i].mPatternToRecognize);
+ field->mValuesStore.Put(eHeaderType, new nsCString(msgHead+nameLen,
+ msgProbe-msgHead-nameLen));
+ }
+ isContentTypeParsed = i==0 ? true : isContentTypeParsed;
+ }
+ break;
+ }
+ }
+ msgProbe += 2;
+ msgLength -= 2;
+ msgHead = msgProbe;
+ continue;
+ }
+ msgLength--;
+ msgProbe++;
+ }
+
+ if (!mMsgFieldStore.Contains(serialno)) {
+ mMsgFieldStore.Put(serialno, field.forget());
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+bool
+SkeletonState::DecodeHeader(ogg_packet* aPacket)
+{
+ nsAutoRef<ogg_packet> autoRelease(aPacket);
+ if (IsSkeletonBOS(aPacket)) {
+ uint16_t verMajor =
+ LittleEndian::readUint16(aPacket->packet + SKELETON_VERSION_MAJOR_OFFSET);
+ uint16_t verMinor =
+ LittleEndian::readUint16(aPacket->packet + SKELETON_VERSION_MINOR_OFFSET);
+
+ // Read the presentation time. We read this before the version check as the
+ // presentation time exists in all versions.
+ int64_t n =
+ LittleEndian::readInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_NUMERATOR_OFFSET);
+ int64_t d =
+ LittleEndian::readInt64(aPacket->packet + SKELETON_PRESENTATION_TIME_DENOMINATOR_OFFSET);
+ mPresentationTime =
+ d == 0 ? 0 : (static_cast<float>(n) / static_cast<float>(d)) * USECS_PER_S;
+
+ mVersion = SKELETON_VERSION(verMajor, verMinor);
+ // We can only care to parse Skeleton version 4.0+.
+ if (mVersion < SKELETON_VERSION(4,0) ||
+ mVersion >= SKELETON_VERSION(5,0) ||
+ aPacket->bytes < SKELETON_4_0_MIN_HEADER_LEN) {
+ return false;
+ }
+
+ // Extract the segment length.
+ mLength =
+ LittleEndian::readInt64(aPacket->packet + SKELETON_FILE_LENGTH_OFFSET);
+
+ LOG(LogLevel::Debug, ("Skeleton segment length: %lld", mLength));
+
+ // Initialize the serialno-to-index map.
+ return true;
+ } else if (IsSkeletonIndex(aPacket) && mVersion >= SKELETON_VERSION(4,0)) {
+ return DecodeIndex(aPacket);
+ } else if (IsSkeletonFisbone(aPacket)) {
+ return DecodeFisbone(aPacket);
+ } else if (aPacket->e_o_s) {
+ mDoneReadingHeaders = true;
+ return true;
+ }
+ return true;
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/ogg/OggCodecState.h b/dom/media/ogg/OggCodecState.h
new file mode 100644
index 000000000..9c254aa40
--- /dev/null
+++ b/dom/media/ogg/OggCodecState.h
@@ -0,0 +1,644 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(OggCodecState_h_)
+#define OggCodecState_h_
+
+#include <ogg/ogg.h>
+// For MOZ_SAMPLE_TYPE_*
+#include <nsAutoPtr.h>
+#include <nsAutoRef.h>
+#include <nsDeque.h>
+#include <nsTArray.h>
+#include <nsClassHashtable.h>
+#include "VideoUtils.h"
+#include "FlacFrameParser.h"
+
+#include <theora/theoradec.h>
+#ifdef MOZ_TREMOR
+#include <tremor/ivorbiscodec.h>
+#else
+#include <vorbis/codec.h>
+#endif
+
+// Uncomment the following to validate that we're predicting the number
+// of Vorbis samples in each packet correctly.
+#define VALIDATE_VORBIS_SAMPLE_CALCULATION
+#ifdef VALIDATE_VORBIS_SAMPLE_CALCULATION
+#include <map>
+#endif
+
+struct OpusMSDecoder;
+
+namespace mozilla {
+
+class OpusParser;
+
+// Deallocates a packet, used in OggPacketQueue below.
+class OggPacketDeallocator : public nsDequeFunctor
+{
+ virtual void* operator() (void* aPacket)
+ {
+ ogg_packet* p = static_cast<ogg_packet*>(aPacket);
+ delete [] p->packet;
+ delete p;
+ return nullptr;
+ }
+};
+
+// A queue of ogg_packets. When we read a page, we extract the page's packets
+// and buffer them in the owning stream's OggCodecState. This is because
+// if we're skipping up to the next keyframe in very large frame sized videos,
+// there may be several megabytes of data between keyframes, and the
+// ogg_stream_state would end up resizing its buffer every time we added a
+// new 4KB page to the bitstream, which kills performance on Windows. This
+// also gives us the option to timestamp packets rather than decoded
+// frames/samples, reducing the amount of frames/samples we must decode to
+// determine start-time at a particular offset, and gives us finer control
+// over memory usage.
+class OggPacketQueue : private nsDeque
+{
+public:
+ OggPacketQueue() : nsDeque(new OggPacketDeallocator()) {}
+ ~OggPacketQueue() { Erase(); }
+ bool IsEmpty() { return nsDeque::GetSize() == 0; }
+ void Append(ogg_packet* aPacket);
+ ogg_packet* PopFront() { return static_cast<ogg_packet*>(nsDeque::PopFront()); }
+ ogg_packet* PeekFront() { return static_cast<ogg_packet*>(nsDeque::PeekFront()); }
+ ogg_packet* Pop() { return static_cast<ogg_packet*>(nsDeque::Pop()); }
+ void PushFront(ogg_packet* aPacket) { nsDeque::PushFront(aPacket); }
+ void Erase() { nsDeque::Erase(); }
+};
+
+// Encapsulates the data required for decoding an ogg bitstream and for
+// converting granulepos to timestamps.
+class OggCodecState
+{
+public:
+ typedef mozilla::MetadataTags MetadataTags;
+ // Ogg types we know about
+ enum CodecType
+ {
+ TYPE_VORBIS=0,
+ TYPE_THEORA,
+ TYPE_OPUS,
+ TYPE_SKELETON,
+ TYPE_FLAC,
+ TYPE_UNKNOWN
+ };
+
+ virtual ~OggCodecState();
+
+ // Factory for creating nsCodecStates. Use instead of constructor.
+ // aPage should be a beginning-of-stream page.
+ static OggCodecState* Create(ogg_page* aPage);
+
+ virtual CodecType GetType() { return TYPE_UNKNOWN; }
+
+ // Reads a header packet. Returns false if an error was encountered
+ // while reading header packets. Callers should check DoneReadingHeaders()
+ // to determine if the last header has been read.
+ // This function takes ownership of the packet and is responsible for
+ // releasing it or queuing it for later processing.
+ virtual bool DecodeHeader(ogg_packet* aPacket)
+ {
+ return (mDoneReadingHeaders = true);
+ }
+
+ // Build a hash table with tag metadata parsed from the stream.
+ virtual MetadataTags* GetTags()
+ {
+ return nullptr;
+ }
+
+ // Returns the end time that a granulepos represents.
+ virtual int64_t Time(int64_t granulepos) { return -1; }
+
+ // Returns the start time that a granulepos represents.
+ virtual int64_t StartTime(int64_t granulepos) { return -1; }
+
+ // Returns the duration of the given packet, if it can be determined.
+ virtual int64_t PacketDuration(ogg_packet* aPacket) { return -1; }
+
+ // Returns the start time of the given packet, if it can be determined.
+ virtual int64_t PacketStartTime(ogg_packet* aPacket)
+ {
+ if (aPacket->granulepos < 0) {
+ return -1;
+ }
+ int64_t endTime = Time(aPacket->granulepos);
+ int64_t duration = PacketDuration(aPacket);
+ if (duration > endTime) {
+ // Audio preskip may eat a whole packet or more.
+ return 0;
+ } else {
+ return endTime - duration;
+ }
+ }
+
+ // Initializes the codec state.
+ virtual bool Init() { return true; }
+
+ // Returns true when this bitstream has finished reading all its
+ // header packets.
+ bool DoneReadingHeaders() { return mDoneReadingHeaders; }
+
+ // Deactivates the bitstream. Only the primary video and audio bitstreams
+ // should be active.
+ void Deactivate()
+ {
+ mActive = false;
+ mDoneReadingHeaders = true;
+ Reset();
+ }
+
+ // Resets decoding state.
+ virtual nsresult Reset();
+
+ // Returns true if the OggCodecState thinks this packet is a header
+ // packet. Note this does not verify the validity of the header packet,
+ // it just guarantees that the packet is marked as a header packet (i.e.
+ // it is definintely not a data packet). Do not use this to identify
+ // streams, use it to filter header packets from data packets while
+ // decoding.
+ virtual bool IsHeader(ogg_packet* aPacket) { return false; }
+
+ // Returns true if the OggCodecState thinks this packet represents a
+ // keyframe, from which decoding can restart safely.
+ virtual bool IsKeyframe(ogg_packet* aPacket) { return true; }
+
+ // Returns true if there is a packet available for dequeueing in the stream.
+ bool IsPacketReady();
+
+ // Returns the next raw packet in the stream, or nullptr if there are no more
+ // packets buffered in the packet queue. More packets can be buffered by
+ // inserting one or more pages into the stream by calling PageIn(). The
+ // caller is responsible for deleting returned packet's using
+ // OggCodecState::ReleasePacket(). The packet will have a valid granulepos.
+ ogg_packet* PacketOut();
+
+ // Returns the next raw packet in the stream, or nullptr if there are no more
+ // packets buffered in the packet queue, without consuming it.
+ // The packet will have a valid granulepos.
+ ogg_packet* PacketPeek();
+
+ // Moves all raw packets from aOther to the front of the current packet queue.
+ void PushFront(OggPacketQueue&& aOther);
+
+ // Releases the memory used by a cloned packet. Every packet returned by
+ // PacketOut() must be free'd using this function.
+ static void ReleasePacket(ogg_packet* aPacket);
+
+ // Returns the next packet in the stream as a MediaRawData, or nullptr
+ // if there are no more packets buffered in the packet queue. More packets
+ // can be buffered by inserting one or more pages into the stream by calling
+ // PageIn(). The packet will have a valid granulepos.
+ virtual already_AddRefed<MediaRawData> PacketOutAsMediaRawData();
+
+ // Extracts all packets from the page, and inserts them into the packet
+ // queue. They can be extracted by calling PacketOut(). Packets from an
+ // inactive stream are not buffered, i.e. this call has no effect for
+ // inactive streams. Multiple pages may need to be inserted before
+ // PacketOut() starts to return packets, as granulepos may need to be
+ // captured.
+ virtual nsresult PageIn(ogg_page* aPage);
+
+ // Number of packets read.
+ uint64_t mPacketCount;
+
+ // Serial number of the bitstream.
+ uint32_t mSerial;
+
+ // Ogg specific state.
+ ogg_stream_state mState;
+
+ // Queue of as yet undecoded packets. Packets are guaranteed to have
+ // a valid granulepos.
+ OggPacketQueue mPackets;
+
+ // Is the bitstream active; whether we're decoding and playing this bitstream.
+ bool mActive;
+
+ // True when all headers packets have been read.
+ bool mDoneReadingHeaders;
+
+ // Validation utility for vorbis-style tag names.
+ static bool IsValidVorbisTagName(nsCString& aName);
+
+ // Utility method to parse and add a vorbis-style comment
+ // to a metadata hash table. Most Ogg-encapsulated codecs
+ // use the vorbis comment format for metadata.
+ static bool AddVorbisComment(MetadataTags* aTags,
+ const char* aComment,
+ uint32_t aLength);
+
+protected:
+ // Constructs a new OggCodecState. aActive denotes whether the stream is
+ // active. For streams of unsupported or unknown types, aActive should be
+ // false.
+ OggCodecState(ogg_page* aBosPage, bool aActive);
+
+ // Deallocates all packets stored in mUnstamped, and clears the array.
+ void ClearUnstamped();
+
+ // Extracts packets out of mState until a data packet with a non -1
+ // granulepos is encountered, or no more packets are readable. Header
+ // packets are pushed into the packet queue immediately, and data packets
+ // are buffered in mUnstamped. Once a non -1 granulepos packet is read
+ // the granulepos of the packets in mUnstamped can be inferred, and they
+ // can be pushed over to mPackets. Used by PageIn() implementations in
+ // subclasses.
+ nsresult PacketOutUntilGranulepos(bool& aFoundGranulepos);
+
+ // Temporary buffer in which to store packets while we're reading packets
+ // in order to capture granulepos.
+ nsTArray<ogg_packet*> mUnstamped;
+
+private:
+ bool InternalInit();
+};
+
+class VorbisState : public OggCodecState
+{
+public:
+ explicit VorbisState(ogg_page* aBosPage);
+ virtual ~VorbisState();
+
+ CodecType GetType() override { return TYPE_VORBIS; }
+ bool DecodeHeader(ogg_packet* aPacket) override;
+ int64_t Time(int64_t granulepos) override;
+ int64_t PacketDuration(ogg_packet* aPacket) override;
+ bool Init() override;
+ nsresult Reset() override;
+ bool IsHeader(ogg_packet* aPacket) override;
+ nsresult PageIn(ogg_page* aPage) override;
+
+ // Return a hash table with tag metadata.
+ MetadataTags* GetTags() override;
+
+ // Returns the end time that a granulepos represents.
+ static int64_t Time(vorbis_info* aInfo, int64_t aGranulePos);
+
+ vorbis_info mInfo;
+ vorbis_comment mComment;
+ vorbis_dsp_state mDsp;
+ vorbis_block mBlock;
+
+private:
+
+ // Reconstructs the granulepos of Vorbis packets stored in the mUnstamped
+ // array.
+ nsresult ReconstructVorbisGranulepos();
+
+ // The "block size" of the previously decoded Vorbis packet, or 0 if we've
+ // not yet decoded anything. This is used to calculate the number of samples
+ // in a Vorbis packet, since each Vorbis packet depends on the previous
+ // packet while being decoded.
+ long mPrevVorbisBlockSize;
+
+ // Granulepos (end sample) of the last decoded Vorbis packet. This is used
+ // to calculate the Vorbis granulepos when we don't find a granulepos to
+ // back-propagate from.
+ int64_t mGranulepos;
+
+#ifdef VALIDATE_VORBIS_SAMPLE_CALCULATION
+ // When validating that we've correctly predicted Vorbis packets' number
+ // of samples, we store each packet's predicted number of samples in this
+ // map, and verify we decode the predicted number of samples.
+ std::map<ogg_packet*, long> mVorbisPacketSamples;
+#endif
+
+ // Records that aPacket is predicted to have aSamples samples.
+ // This function has no effect if VALIDATE_VORBIS_SAMPLE_CALCULATION
+ // is not defined.
+ void RecordVorbisPacketSamples(ogg_packet* aPacket, long aSamples);
+
+ // Verifies that aPacket has had its number of samples predicted.
+ // This function has no effect if VALIDATE_VORBIS_SAMPLE_CALCULATION
+ // is not defined.
+ void AssertHasRecordedPacketSamples(ogg_packet* aPacket);
+
+public:
+ // Asserts that the number of samples predicted for aPacket is aSamples.
+ // This function has no effect if VALIDATE_VORBIS_SAMPLE_CALCULATION
+ // is not defined.
+ void ValidateVorbisPacketSamples(ogg_packet* aPacket, long aSamples);
+
+};
+
+// Returns 1 if the Theora info struct is decoding a media of Theora
+// version (maj,min,sub) or later, otherwise returns 0.
+int TheoraVersion(th_info* info,
+ unsigned char maj,
+ unsigned char min,
+ unsigned char sub);
+
+class TheoraState : public OggCodecState
+{
+public:
+ explicit TheoraState(ogg_page* aBosPage);
+ virtual ~TheoraState();
+
+ CodecType GetType() override { return TYPE_THEORA; }
+ bool DecodeHeader(ogg_packet* aPacket) override;
+ int64_t Time(int64_t granulepos) override;
+ int64_t StartTime(int64_t granulepos) override;
+ int64_t PacketDuration(ogg_packet* aPacket) override;
+ bool Init() override;
+ bool IsHeader(ogg_packet* aPacket) override;
+ bool IsKeyframe(ogg_packet* aPacket) override;
+ nsresult PageIn(ogg_page* aPage) override;
+
+ // Returns the maximum number of microseconds which a keyframe can be offset
+ // from any given interframe.
+ int64_t MaxKeyframeOffset();
+
+ // Returns the end time that a granulepos represents.
+ static int64_t Time(th_info* aInfo, int64_t aGranulePos);
+
+ th_info mInfo;
+ th_comment mComment;
+ th_setup_info* mSetup;
+ th_dec_ctx* mCtx;
+
+ float mPixelAspectRatio;
+
+private:
+
+ // Reconstructs the granulepos of Theora packets stored in the
+ // mUnstamped array. mUnstamped must be filled with consecutive packets from
+ // the stream, with the last packet having a known granulepos. Using this
+ // known granulepos, and the known frame numbers, we recover the granulepos
+ // of all frames in the array. This enables us to determine their timestamps.
+ void ReconstructTheoraGranulepos();
+
+};
+
+class OpusState : public OggCodecState
+{
+public:
+ explicit OpusState(ogg_page* aBosPage);
+ virtual ~OpusState();
+
+ CodecType GetType() override { return TYPE_OPUS; }
+ bool DecodeHeader(ogg_packet* aPacket) override;
+ int64_t Time(int64_t aGranulepos) override;
+ int64_t PacketDuration(ogg_packet* aPacket) override;
+ bool Init() override;
+ nsresult Reset() override;
+ nsresult Reset(bool aStart);
+ bool IsHeader(ogg_packet* aPacket) override;
+ nsresult PageIn(ogg_page* aPage) override;
+ already_AddRefed<MediaRawData> PacketOutAsMediaRawData() override;
+ // Returns the end time that a granulepos represents.
+ static int64_t Time(int aPreSkip, int64_t aGranulepos);
+
+ // Various fields from the Ogg Opus header.
+ int mRate; // Sample rate the decoder uses (always 48 kHz).
+ int mChannels; // Number of channels the stream encodes.
+ uint16_t mPreSkip; // Number of samples to strip after decoder reset.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ float mGain; // Gain to apply to decoder output.
+#else
+ int32_t mGain_Q16; // Gain to apply to the decoder output.
+#endif
+
+ nsAutoPtr<OpusParser> mParser;
+ OpusMSDecoder* mDecoder;
+
+ int mSkip; // Number of samples left to trim before playback.
+ // Granule position (end sample) of the last decoded Opus packet. This is
+ // used to calculate the amount we should trim from the last packet.
+ int64_t mPrevPacketGranulepos;
+
+ // Construct and return a table of tags from the metadata header.
+ MetadataTags* GetTags() override;
+
+private:
+
+ // Reconstructs the granulepos of Opus packets stored in the
+ // mUnstamped array. mUnstamped must be filled with consecutive packets from
+ // the stream, with the last packet having a known granulepos. Using this
+ // known granulepos, and the known frame numbers, we recover the granulepos
+ // of all frames in the array. This enables us to determine their timestamps.
+ bool ReconstructOpusGranulepos();
+
+ // Granule position (end sample) of the last decoded Opus page. This is
+ // used to calculate the Opus per-packet granule positions on the last page,
+ // where we may need to trim some samples from the end.
+ int64_t mPrevPageGranulepos;
+
+};
+
+// Constructs a 32bit version number out of two 16 bit major,minor
+// version numbers.
+#define SKELETON_VERSION(major, minor) (((major)<<16)|(minor))
+
+enum EMsgHeaderType {
+ eContentType,
+ eRole,
+ eName,
+ eLanguage,
+ eTitle,
+ eDisplayHint,
+ eAltitude,
+ eTrackOrder,
+ eTrackDependencies
+};
+
+typedef struct
+{
+ const char* mPatternToRecognize;
+ EMsgHeaderType mMsgHeaderType;
+} FieldPatternType;
+
+// Stores the message information for different logical bitstream.
+typedef struct
+{
+ nsClassHashtable<nsUint32HashKey, nsCString> mValuesStore;
+} MessageField;
+
+class SkeletonState : public OggCodecState
+{
+public:
+ explicit SkeletonState(ogg_page* aBosPage);
+ ~SkeletonState();
+
+ nsClassHashtable<nsUint32HashKey, MessageField> mMsgFieldStore;
+
+ CodecType GetType() override { return TYPE_SKELETON; }
+ bool DecodeHeader(ogg_packet* aPacket) override;
+ int64_t Time(int64_t granulepos) override { return -1; }
+ bool IsHeader(ogg_packet* aPacket) override { return true; }
+
+ // Return true if the given time (in milliseconds) is within
+ // the presentation time defined in the skeleton track.
+ bool IsPresentable(int64_t aTime) { return aTime >= mPresentationTime; }
+
+ // Stores the offset of the page on which a keyframe starts,
+ // and its presentation time.
+ class nsKeyPoint
+ {
+ public:
+ nsKeyPoint()
+ : mOffset(INT64_MAX)
+ , mTime(INT64_MAX) {}
+
+ nsKeyPoint(int64_t aOffset, int64_t aTime)
+ : mOffset(aOffset)
+ ,mTime(aTime) {}
+
+ // Offset from start of segment/link-in-the-chain in bytes.
+ int64_t mOffset;
+
+ // Presentation time in usecs.
+ int64_t mTime;
+
+ bool IsNull()
+ {
+ return mOffset == INT64_MAX && mTime == INT64_MAX;
+ }
+ };
+
+ // Stores a keyframe's byte-offset, presentation time and the serialno
+ // of the stream it belongs to.
+ class nsSeekTarget
+ {
+ public:
+ nsSeekTarget() : mSerial(0) {}
+ nsKeyPoint mKeyPoint;
+ uint32_t mSerial;
+ bool IsNull()
+ {
+ return mKeyPoint.IsNull() && mSerial == 0;
+ }
+ };
+
+ // Determines from the seek index the keyframe which you must seek back to
+ // in order to get all keyframes required to render all streams with
+ // serialnos in aTracks, at time aTarget.
+ nsresult IndexedSeekTarget(int64_t aTarget,
+ nsTArray<uint32_t>& aTracks,
+ nsSeekTarget& aResult);
+
+ bool HasIndex() const
+ {
+ return mIndex.Count() > 0;
+ }
+
+ // Returns the duration of the active tracks in the media, if we have
+ // an index. aTracks must be filled with the serialnos of the active tracks.
+ // The duration is calculated as the greatest end time of all active tracks,
+ // minus the smalled start time of all the active tracks.
+ nsresult GetDuration(const nsTArray<uint32_t>& aTracks, int64_t& aDuration);
+
+private:
+
+ // Decodes an index packet. Returns false on failure.
+ bool DecodeIndex(ogg_packet* aPacket);
+ // Decodes an fisbone packet. Returns false on failure.
+ bool DecodeFisbone(ogg_packet* aPacket);
+
+ // Gets the keypoint you must seek to in order to get the keyframe required
+ // to render the stream at time aTarget on stream with serial aSerialno.
+ nsresult IndexedSeekTargetForTrack(uint32_t aSerialno,
+ int64_t aTarget,
+ nsKeyPoint& aResult);
+
+ // Version of the decoded skeleton track, as per the SKELETON_VERSION macro.
+ uint32_t mVersion;
+
+ // Presentation time of the resource in milliseconds
+ int64_t mPresentationTime;
+
+ // Length of the resource in bytes.
+ int64_t mLength;
+
+ // Stores the keyframe index and duration information for a particular
+ // stream.
+ class nsKeyFrameIndex
+ {
+ public:
+
+ nsKeyFrameIndex(int64_t aStartTime, int64_t aEndTime)
+ : mStartTime(aStartTime)
+ , mEndTime(aEndTime)
+ {
+ MOZ_COUNT_CTOR(nsKeyFrameIndex);
+ }
+
+ ~nsKeyFrameIndex()
+ {
+ MOZ_COUNT_DTOR(nsKeyFrameIndex);
+ }
+
+ void Add(int64_t aOffset, int64_t aTimeMs)
+ {
+ mKeyPoints.AppendElement(nsKeyPoint(aOffset, aTimeMs));
+ }
+
+ const nsKeyPoint& Get(uint32_t aIndex) const
+ {
+ return mKeyPoints[aIndex];
+ }
+
+ uint32_t Length() const
+ {
+ return mKeyPoints.Length();
+ }
+
+ // Presentation time of the first sample in this stream in usecs.
+ const int64_t mStartTime;
+
+ // End time of the last sample in this stream in usecs.
+ const int64_t mEndTime;
+
+ private:
+ nsTArray<nsKeyPoint> mKeyPoints;
+ };
+
+ // Maps Ogg serialnos to the index-keypoint list.
+ nsClassHashtable<nsUint32HashKey, nsKeyFrameIndex> mIndex;
+};
+
+class FlacState : public OggCodecState
+{
+public:
+ explicit FlacState(ogg_page* aBosPage);
+
+ CodecType GetType() override { return TYPE_FLAC; }
+ bool DecodeHeader(ogg_packet* aPacket) override;
+ int64_t Time(int64_t granulepos) override;
+ int64_t PacketDuration(ogg_packet* aPacket) override;
+ bool IsHeader(ogg_packet* aPacket) override;
+ nsresult PageIn(ogg_page* aPage) override;
+
+ // Return a hash table with tag metadata.
+ MetadataTags* GetTags() override;
+
+ const AudioInfo& Info();
+
+private:
+ bool ReconstructFlacGranulepos(void);
+
+ FlacFrameParser mParser;
+};
+
+} // namespace mozilla
+
+// This allows the use of nsAutoRefs for an ogg_packet that properly free the
+// contents of the packet.
+template <>
+class nsAutoRefTraits<ogg_packet> : public nsPointerRefTraits<ogg_packet>
+{
+public:
+ static void Release(ogg_packet* aPacket)
+ {
+ mozilla::OggCodecState::ReleasePacket(aPacket);
+ }
+};
+
+
+#endif
diff --git a/dom/media/ogg/OggCodecStore.cpp b/dom/media/ogg/OggCodecStore.cpp
new file mode 100644
index 000000000..528932dd0
--- /dev/null
+++ b/dom/media/ogg/OggCodecStore.cpp
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/DebugOnly.h"
+
+#include "OggCodecStore.h"
+
+namespace mozilla {
+
+OggCodecStore::OggCodecStore()
+: mMonitor("CodecStore")
+{
+}
+
+void OggCodecStore::Add(uint32_t serial, OggCodecState* codecState)
+{
+ MonitorAutoLock mon(mMonitor);
+ mCodecStates.Put(serial, codecState);
+}
+
+bool OggCodecStore::Contains(uint32_t serial)
+{
+ MonitorAutoLock mon(mMonitor);
+ return mCodecStates.Get(serial, nullptr);
+}
+
+OggCodecState* OggCodecStore::Get(uint32_t serial)
+{
+ MonitorAutoLock mon(mMonitor);
+ return mCodecStates.Get(serial);
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/ogg/OggCodecStore.h b/dom/media/ogg/OggCodecStore.h
new file mode 100644
index 000000000..2d8fd5830
--- /dev/null
+++ b/dom/media/ogg/OggCodecStore.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(OggCodecStore_h_)
+#define OggCodecStore_h_
+
+#include <ogg/ogg.h>
+
+#include "OggCodecState.h"
+#include "VideoUtils.h"
+#include "mozilla/Monitor.h"
+
+namespace mozilla {
+
+// Thread safe container to store the codec information and the serial for each
+// streams.
+class OggCodecStore
+{
+ public:
+ OggCodecStore();
+ void Add(uint32_t serial, OggCodecState* codecState);
+ bool Contains(uint32_t serial);
+ OggCodecState* Get(uint32_t serial);
+ bool IsKnownStream(uint32_t aSerial);
+
+ private:
+ // Maps Ogg serialnos to OggStreams.
+ nsClassHashtable<nsUint32HashKey, OggCodecState> mCodecStates;
+
+ // Protects the |mCodecStates| and the |mKnownStreams| members.
+ Monitor mMonitor;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/ogg/OggDecoder.cpp b/dom/media/ogg/OggDecoder.cpp
new file mode 100644
index 000000000..2631b1cde
--- /dev/null
+++ b/dom/media/ogg/OggDecoder.cpp
@@ -0,0 +1,79 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaPrefs.h"
+#include "MediaDecoderStateMachine.h"
+#include "MediaFormatReader.h"
+#include "OggDemuxer.h"
+#include "OggDecoder.h"
+#include "nsContentTypeParser.h"
+
+namespace mozilla {
+
+MediaDecoderStateMachine* OggDecoder::CreateStateMachine()
+{
+ RefPtr<OggDemuxer> demuxer = new OggDemuxer(GetResource());
+ RefPtr<MediaFormatReader> reader =
+ new MediaFormatReader(this, demuxer, GetVideoFrameContainer());
+ demuxer->SetChainingEvents(&reader->TimedMetadataProducer(),
+ &reader->MediaNotSeekableProducer());
+ return new MediaDecoderStateMachine(this, reader);
+}
+
+/* static */
+bool
+OggDecoder::IsEnabled()
+{
+ return MediaPrefs::OggEnabled();
+}
+
+/* static */
+bool
+OggDecoder::CanHandleMediaType(const nsACString& aMIMETypeExcludingCodecs,
+ const nsAString& aCodecs)
+{
+ if (!IsEnabled()) {
+ return false;
+ }
+
+ const bool isOggAudio = aMIMETypeExcludingCodecs.EqualsASCII("audio/ogg");
+ const bool isOggVideo =
+ aMIMETypeExcludingCodecs.EqualsASCII("video/ogg") ||
+ aMIMETypeExcludingCodecs.EqualsASCII("application/ogg");
+
+ if (!isOggAudio && !isOggVideo) {
+ return false;
+ }
+
+ nsTArray<nsCString> codecMimes;
+ if (aCodecs.IsEmpty()) {
+ // WebM guarantees that the only codecs it contained are vp8, vp9, opus or vorbis.
+ return true;
+ }
+ // Verify that all the codecs specified are ones that we expect that
+ // we can play.
+ nsTArray<nsString> codecs;
+ if (!ParseCodecsString(aCodecs, codecs)) {
+ return false;
+ }
+ for (const nsString& codec : codecs) {
+ if ((IsOpusEnabled() && codec.EqualsLiteral("opus")) ||
+ codec.EqualsLiteral("vorbis") ||
+ (MediaPrefs::FlacInOgg() && codec.EqualsLiteral("flac"))) {
+ continue;
+ }
+ // Note: Only accept Theora in a video content type, not in an audio
+ // content type.
+ if (isOggVideo && codec.EqualsLiteral("theora")) {
+ continue;
+ }
+ // Some unsupported codec.
+ return false;
+ }
+ return true;
+}
+
+} // namespace mozilla
diff --git a/dom/media/ogg/OggDecoder.h b/dom/media/ogg/OggDecoder.h
new file mode 100644
index 000000000..3a98f2918
--- /dev/null
+++ b/dom/media/ogg/OggDecoder.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(OggDecoder_h_)
+#define OggDecoder_h_
+
+#include "MediaDecoder.h"
+
+namespace mozilla {
+
+class OggDecoder : public MediaDecoder
+{
+public:
+ explicit OggDecoder(MediaDecoderOwner* aOwner)
+ : MediaDecoder(aOwner)
+ , mShutdownBitMonitor("mShutdownBitMonitor")
+ , mShutdownBit(false)
+ {}
+
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override {
+ if (!IsOggEnabled()) {
+ return nullptr;
+ }
+ return new OggDecoder(aOwner);
+ }
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // For yucky legacy reasons, the ogg decoder needs to do a cross-thread read
+ // to check for shutdown while it hogs its own task queue. We don't want to
+ // protect the general state with a lock, so we make a special copy and a
+ // special-purpose lock. This method may be called on any thread.
+ bool IsOggDecoderShutdown() override
+ {
+ MonitorAutoLock lock(mShutdownBitMonitor);
+ return mShutdownBit;
+ }
+
+ // Returns true if aMIMEType is a type that we think we can render with the
+ // a platform decoder backend. If aCodecs is non emtpy, it is filled
+ // with a comma-delimited list of codecs to check support for.
+ static bool CanHandleMediaType(const nsACString& aMIMETypeExcludingCodecs,
+ const nsAString& aCodecs);
+
+ static bool IsEnabled();
+
+protected:
+ void ShutdownBitChanged() override
+ {
+ MonitorAutoLock lock(mShutdownBitMonitor);
+ mShutdownBit = mStateMachineIsShutdown;
+ }
+
+ Monitor mShutdownBitMonitor;
+ bool mShutdownBit;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/ogg/OggDemuxer.cpp b/dom/media/ogg/OggDemuxer.cpp
new file mode 100644
index 000000000..591a5248f
--- /dev/null
+++ b/dom/media/ogg/OggDemuxer.cpp
@@ -0,0 +1,2194 @@
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsError.h"
+#include "MediaDecoderStateMachine.h"
+#include "AbstractMediaDecoder.h"
+#include "OggDemuxer.h"
+#include "OggCodecState.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/PodOperations.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/TimeStamp.h"
+#include "MediaDataDemuxer.h"
+#include "nsAutoRef.h"
+#include "XiphExtradata.h"
+#include "MediaPrefs.h"
+
+#include <algorithm>
+
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+#define OGG_DEBUG(arg, ...) MOZ_LOG(gMediaDemuxerLog, mozilla::LogLevel::Debug, ("OggDemuxer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+// Un-comment to enable logging of seek bisections.
+//#define SEEK_LOGGING
+#ifdef SEEK_LOGGING
+#define SEEK_LOG(type, msg) MOZ_LOG(gMediaDemuxerLog, type, msg)
+#else
+#define SEEK_LOG(type, msg)
+#endif
+
+namespace mozilla
+{
+
+using media::TimeUnit;
+using media::TimeInterval;
+using media::TimeIntervals;
+
+// The number of microseconds of "fuzz" we use in a bisection search over
+// HTTP. When we're seeking with fuzz, we'll stop the search if a bisection
+// lands between the seek target and OGG_SEEK_FUZZ_USECS microseconds before the
+// seek target. This is becaue it's usually quicker to just keep downloading
+// from an exisiting connection than to do another bisection inside that
+// small range, which would open a new HTTP connetion.
+static const uint32_t OGG_SEEK_FUZZ_USECS = 500000;
+
+// The number of microseconds of "pre-roll" we use for Opus streams.
+// The specification recommends 80 ms.
+static const int64_t OGG_SEEK_OPUS_PREROLL = 80 * USECS_PER_MS;
+
+static Atomic<uint32_t> sStreamSourceID(0u);
+
+class OggHeaders
+{
+public:
+ OggHeaders() {}
+ ~OggHeaders()
+ {
+ for (size_t i = 0; i < mHeaders.Length(); i++) {
+ delete[] mHeaders[i];
+ }
+ }
+
+ void AppendPacket(const ogg_packet* aPacket)
+ {
+ size_t packetSize = aPacket->bytes;
+ unsigned char* packetData = new unsigned char[packetSize];
+ memcpy(packetData, aPacket->packet, packetSize);
+ mHeaders.AppendElement(packetData);
+ mHeaderLens.AppendElement(packetSize);
+ }
+
+ nsTArray<const unsigned char*> mHeaders;
+ nsTArray<size_t> mHeaderLens;
+};
+
+// Return the corresponding category in aKind based on the following specs.
+// (https://www.whatwg.org/specs/web-apps/current-
+// work/multipage/embedded-content.html#dom-audiotrack-kind) &
+// (http://wiki.xiph.org/SkeletonHeaders)
+const nsString
+OggDemuxer::GetKind(const nsCString& aRole)
+{
+ if (aRole.Find("audio/main") != -1 || aRole.Find("video/main") != -1) {
+ return NS_LITERAL_STRING("main");
+ } else if (aRole.Find("audio/alternate") != -1 ||
+ aRole.Find("video/alternate") != -1) {
+ return NS_LITERAL_STRING("alternative");
+ } else if (aRole.Find("audio/audiodesc") != -1) {
+ return NS_LITERAL_STRING("descriptions");
+ } else if (aRole.Find("audio/described") != -1) {
+ return NS_LITERAL_STRING("main-desc");
+ } else if (aRole.Find("audio/dub") != -1) {
+ return NS_LITERAL_STRING("translation");
+ } else if (aRole.Find("audio/commentary") != -1) {
+ return NS_LITERAL_STRING("commentary");
+ } else if (aRole.Find("video/sign") != -1) {
+ return NS_LITERAL_STRING("sign");
+ } else if (aRole.Find("video/captioned") != -1) {
+ return NS_LITERAL_STRING("captions");
+ } else if (aRole.Find("video/subtitled") != -1) {
+ return NS_LITERAL_STRING("subtitles");
+ }
+ return EmptyString();
+}
+
+void
+OggDemuxer::InitTrack(MessageField* aMsgInfo,
+ TrackInfo* aInfo,
+ bool aEnable)
+{
+ MOZ_ASSERT(aMsgInfo);
+ MOZ_ASSERT(aInfo);
+
+ nsCString* sName = aMsgInfo->mValuesStore.Get(eName);
+ nsCString* sRole = aMsgInfo->mValuesStore.Get(eRole);
+ nsCString* sTitle = aMsgInfo->mValuesStore.Get(eTitle);
+ nsCString* sLanguage = aMsgInfo->mValuesStore.Get(eLanguage);
+ aInfo->Init(sName? NS_ConvertUTF8toUTF16(*sName):EmptyString(),
+ sRole? GetKind(*sRole):EmptyString(),
+ sTitle? NS_ConvertUTF8toUTF16(*sTitle):EmptyString(),
+ sLanguage? NS_ConvertUTF8toUTF16(*sLanguage):EmptyString(),
+ aEnable);
+}
+
+OggDemuxer::OggDemuxer(MediaResource* aResource)
+ : mTheoraState(nullptr)
+ , mVorbisState(nullptr)
+ , mOpusState(nullptr)
+ , mFlacState(nullptr)
+ , mOpusEnabled(MediaDecoder::IsOpusEnabled())
+ , mSkeletonState(nullptr)
+ , mAudioOggState(aResource)
+ , mVideoOggState(aResource)
+ , mVorbisSerial(0)
+ , mOpusSerial(0)
+ , mTheoraSerial(0)
+ , mFlacSerial(0)
+ , mOpusPreSkip(0)
+ , mIsChained(false)
+ , mTimedMetadataEvent(nullptr)
+ , mOnSeekableEvent(nullptr)
+{
+ MOZ_COUNT_CTOR(OggDemuxer);
+ PodZero(&mTheoraInfo);
+}
+
+OggDemuxer::~OggDemuxer()
+{
+ MOZ_COUNT_DTOR(OggDemuxer);
+ Reset(TrackInfo::kAudioTrack);
+ Reset(TrackInfo::kVideoTrack);
+ if (HasAudio() || HasVideo()) {
+ // If we were able to initialize our decoders, report whether we encountered
+ // a chained stream or not.
+ bool isChained = mIsChained;
+ void* ptr = this;
+ nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([ptr, isChained]() -> void {
+ // We can't use OGG_DEBUG here because it implicitly refers to `this`,
+ // which we can't capture in this runnable.
+ MOZ_LOG(gMediaDemuxerLog, mozilla::LogLevel::Debug,
+ ("OggDemuxer(%p)::%s: Reporting telemetry MEDIA_OGG_LOADED_IS_CHAINED=%d",
+ ptr, __func__, isChained));
+ Telemetry::Accumulate(Telemetry::ID::MEDIA_OGG_LOADED_IS_CHAINED, isChained);
+ });
+ AbstractThread::MainThread()->Dispatch(task.forget());
+ }
+}
+
+void
+OggDemuxer::SetChainingEvents(TimedMetadataEventProducer* aMetadataEvent,
+ MediaEventProducer<void>* aOnSeekableEvent)
+{
+ mTimedMetadataEvent = aMetadataEvent;
+ mOnSeekableEvent = aOnSeekableEvent;
+}
+
+
+bool
+OggDemuxer::HasAudio()
+const
+{
+ return mVorbisState || mOpusState || mFlacState;
+}
+
+bool
+OggDemuxer::HasVideo()
+const
+{
+ return mTheoraState;
+}
+
+bool
+OggDemuxer::HaveStartTime()
+const
+{
+ return mStartTime.isSome();
+}
+
+int64_t
+OggDemuxer::StartTime() const
+{
+ return mStartTime.refOr(0);
+}
+
+bool
+OggDemuxer::HaveStartTime(TrackInfo::TrackType aType)
+{
+ return OggState(aType).mStartTime.isSome();
+}
+
+int64_t
+OggDemuxer::StartTime(TrackInfo::TrackType aType)
+{
+ return OggState(aType).mStartTime.refOr(TimeUnit::FromMicroseconds(0)).ToMicroseconds();
+}
+
+RefPtr<OggDemuxer::InitPromise>
+OggDemuxer::Init()
+{
+ int ret = ogg_sync_init(OggSyncState(TrackInfo::kAudioTrack));
+ if (ret != 0) {
+ return InitPromise::CreateAndReject(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ ret = ogg_sync_init(OggSyncState(TrackInfo::kVideoTrack));
+ if (ret != 0) {
+ return InitPromise::CreateAndReject(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ if (ReadMetadata() != NS_OK) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ if (!GetNumberTracks(TrackInfo::kAudioTrack) &&
+ !GetNumberTracks(TrackInfo::kVideoTrack)) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+bool
+OggDemuxer::HasTrackType(TrackInfo::TrackType aType) const
+{
+ return !!GetNumberTracks(aType);
+}
+
+OggCodecState*
+OggDemuxer::GetTrackCodecState(TrackInfo::TrackType aType) const
+{
+ switch(aType) {
+ case TrackInfo::kAudioTrack:
+ if (mVorbisState) {
+ return mVorbisState;
+ } else if (mOpusState) {
+ return mOpusState;
+ } else {
+ return mFlacState;
+ }
+ case TrackInfo::kVideoTrack:
+ return mTheoraState;
+ default:
+ return 0;
+ }
+}
+
+TrackInfo::TrackType
+OggDemuxer::GetCodecStateType(OggCodecState* aState) const
+{
+ switch (aState->GetType()) {
+ case OggCodecState::TYPE_THEORA:
+ return TrackInfo::kVideoTrack;
+ case OggCodecState::TYPE_OPUS:
+ case OggCodecState::TYPE_VORBIS:
+ case OggCodecState::TYPE_FLAC:
+ return TrackInfo::kAudioTrack;
+ default:
+ return TrackInfo::kUndefinedTrack;
+ }
+}
+
+uint32_t
+OggDemuxer::GetNumberTracks(TrackInfo::TrackType aType) const
+{
+ switch(aType) {
+ case TrackInfo::kAudioTrack:
+ return HasAudio() ? 1 : 0;
+ case TrackInfo::kVideoTrack:
+ return HasVideo() ? 1 : 0;
+ default:
+ return 0;
+ }
+}
+
+UniquePtr<TrackInfo>
+OggDemuxer::GetTrackInfo(TrackInfo::TrackType aType, size_t aTrackNumber) const
+{
+ switch(aType) {
+ case TrackInfo::kAudioTrack:
+ return mInfo.mAudio.Clone();
+ case TrackInfo::kVideoTrack:
+ return mInfo.mVideo.Clone();
+ default:
+ return nullptr;
+ }
+}
+
+already_AddRefed<MediaTrackDemuxer>
+OggDemuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber)
+{
+ if (GetNumberTracks(aType) <= aTrackNumber) {
+ return nullptr;
+ }
+ RefPtr<OggTrackDemuxer> e = new OggTrackDemuxer(this, aType, aTrackNumber);
+ mDemuxers.AppendElement(e);
+
+ return e.forget();
+}
+
+nsresult
+OggDemuxer::Reset(TrackInfo::TrackType aType)
+{
+ // Discard any previously buffered packets/pages.
+ ogg_sync_reset(OggSyncState(aType));
+ OggCodecState* trackState = GetTrackCodecState(aType);
+ if (trackState) {
+ return trackState->Reset();
+ }
+ OggState(aType).mNeedKeyframe = true;
+ return NS_OK;
+}
+
+bool
+OggDemuxer::ReadHeaders(TrackInfo::TrackType aType,
+ OggCodecState* aState,
+ OggHeaders& aHeaders)
+{
+ while (!aState->DoneReadingHeaders()) {
+ DemuxUntilPacketAvailable(aType, aState);
+ ogg_packet* packet = aState->PacketOut();
+ if (!packet) {
+ OGG_DEBUG("Ran out of header packets early; deactivating stream %ld", aState->mSerial);
+ aState->Deactivate();
+ return false;
+ }
+
+ // Save a copy of the header packet for the decoder to use later;
+ // OggCodecState::DecodeHeader will free it when processing locally.
+ aHeaders.AppendPacket(packet);
+
+ // Local OggCodecState needs to decode headers in order to process
+ // packet granulepos -> time mappings, etc.
+ if (!aState->DecodeHeader(packet)) {
+ OGG_DEBUG("Failed to decode ogg header packet; deactivating stream %ld", aState->mSerial);
+ aState->Deactivate();
+ return false;
+ }
+ }
+
+ return aState->Init();
+}
+
+void
+OggDemuxer::BuildSerialList(nsTArray<uint32_t>& aTracks)
+{
+ // Obtaining seek index information for currently active bitstreams.
+ if (HasVideo()) {
+ aTracks.AppendElement(mTheoraState->mSerial);
+ }
+ if (HasAudio()) {
+ if (mVorbisState) {
+ aTracks.AppendElement(mVorbisState->mSerial);
+ } else if (mOpusState) {
+ aTracks.AppendElement(mOpusState->mSerial);
+ }
+ }
+}
+
+void
+OggDemuxer::SetupTargetTheora(TheoraState* aTheoraState, OggHeaders& aHeaders)
+{
+ if (mTheoraState) {
+ mTheoraState->Reset();
+ }
+
+ nsIntRect picture = nsIntRect(aTheoraState->mInfo.pic_x,
+ aTheoraState->mInfo.pic_y,
+ aTheoraState->mInfo.pic_width,
+ aTheoraState->mInfo.pic_height);
+
+ nsIntSize displaySize = nsIntSize(aTheoraState->mInfo.pic_width,
+ aTheoraState->mInfo.pic_height);
+
+ // Apply the aspect ratio to produce the intrinsic display size we report
+ // to the element.
+ ScaleDisplayByAspectRatio(displaySize, aTheoraState->mPixelAspectRatio);
+
+ nsIntSize frameSize(aTheoraState->mInfo.frame_width,
+ aTheoraState->mInfo.frame_height);
+ if (IsValidVideoRegion(frameSize, picture, displaySize)) {
+ // Video track's frame sizes will not overflow. Activate the video track.
+ mInfo.mVideo.mMimeType = "video/theora";
+ mInfo.mVideo.mDisplay = displaySize;
+ mInfo.mVideo.mImage = frameSize;
+ mInfo.mVideo.SetImageRect(picture);
+
+ // Copy Theora info data for time computations on other threads.
+ memcpy(&mTheoraInfo, &aTheoraState->mInfo, sizeof(mTheoraInfo));
+
+ // Save header packets for the decoder
+ if (!XiphHeadersToExtradata(mInfo.mVideo.mCodecSpecificConfig,
+ aHeaders.mHeaders, aHeaders.mHeaderLens)) {
+ return;
+ }
+
+ mTheoraState = aTheoraState;
+ mTheoraSerial = aTheoraState->mSerial;
+ }
+}
+
+void
+OggDemuxer::SetupTargetVorbis(VorbisState* aVorbisState, OggHeaders& aHeaders)
+{
+ if (mVorbisState) {
+ mVorbisState->Reset();
+ }
+
+ // Copy Vorbis info data for time computations on other threads.
+ memcpy(&mVorbisInfo, &aVorbisState->mInfo, sizeof(mVorbisInfo));
+ mVorbisInfo.codec_setup = nullptr;
+
+ mInfo.mAudio.mMimeType = "audio/vorbis";
+ mInfo.mAudio.mRate = aVorbisState->mInfo.rate;
+ mInfo.mAudio.mChannels = aVorbisState->mInfo.channels;
+
+ // Save header packets for the decoder
+ if (!XiphHeadersToExtradata(mInfo.mAudio.mCodecSpecificConfig,
+ aHeaders.mHeaders, aHeaders.mHeaderLens)) {
+ return;
+ }
+
+ mVorbisState = aVorbisState;
+ mVorbisSerial = aVorbisState->mSerial;
+}
+
+void
+OggDemuxer::SetupTargetOpus(OpusState* aOpusState, OggHeaders& aHeaders)
+{
+ if (mOpusState) {
+ mOpusState->Reset();
+ }
+
+ mInfo.mAudio.mMimeType = "audio/opus";
+ mInfo.mAudio.mRate = aOpusState->mRate;
+ mInfo.mAudio.mChannels = aOpusState->mChannels;
+
+ // Save preskip & the first header packet for the Opus decoder
+ uint64_t preSkip = aOpusState->Time(0, aOpusState->mPreSkip);
+ uint8_t c[sizeof(preSkip)];
+ BigEndian::writeUint64(&c[0], preSkip);
+ mInfo.mAudio.mCodecSpecificConfig->AppendElements(&c[0], sizeof(preSkip));
+ mInfo.mAudio.mCodecSpecificConfig->AppendElements(aHeaders.mHeaders[0],
+ aHeaders.mHeaderLens[0]);
+
+ mOpusState = aOpusState;
+ mOpusSerial = aOpusState->mSerial;
+ mOpusPreSkip = aOpusState->mPreSkip;
+}
+
+void
+OggDemuxer::SetupTargetFlac(FlacState* aFlacState, OggHeaders& aHeaders)
+{
+ if (mFlacState) {
+ mFlacState->Reset();
+ }
+
+ mInfo.mAudio = aFlacState->Info();
+ mFlacState = aFlacState;
+ mFlacSerial = aFlacState->mSerial;
+}
+
+void
+OggDemuxer::SetupTargetSkeleton()
+{
+ // Setup skeleton related information after mVorbisState & mTheroState
+ // being set (if they exist).
+ if (mSkeletonState) {
+ OggHeaders headers;
+ if (!HasAudio() && !HasVideo()) {
+ // We have a skeleton track, but no audio or video, may as well disable
+ // the skeleton, we can't do anything useful with this media.
+ OGG_DEBUG("Deactivating skeleton stream %ld", mSkeletonState->mSerial);
+ mSkeletonState->Deactivate();
+ } else if (ReadHeaders(TrackInfo::kAudioTrack, mSkeletonState, headers) &&
+ mSkeletonState->HasIndex()) {
+ // We don't particularly care about which track we are currently using
+ // as both MediaResource points to the same content.
+ // Extract the duration info out of the index, so we don't need to seek to
+ // the end of resource to get it.
+ nsTArray<uint32_t> tracks;
+ BuildSerialList(tracks);
+ int64_t duration = 0;
+ if (NS_SUCCEEDED(mSkeletonState->GetDuration(tracks, duration))) {
+ OGG_DEBUG("Got duration from Skeleton index %lld", duration);
+ mInfo.mMetadataDuration.emplace(TimeUnit::FromMicroseconds(duration));
+ }
+ }
+ }
+}
+
+void
+OggDemuxer::SetupMediaTracksInfo(const nsTArray<uint32_t>& aSerials)
+{
+ // For each serial number
+ // 1. Retrieve a codecState from mCodecStore by this serial number.
+ // 2. Retrieve a message field from mMsgFieldStore by this serial number.
+ // 3. For now, skip if the serial number refers to a non-primary bitstream.
+ // 4. Setup track and other audio/video related information per different types.
+ for (size_t i = 0; i < aSerials.Length(); i++) {
+ uint32_t serial = aSerials[i];
+ OggCodecState* codecState = mCodecStore.Get(serial);
+
+ MessageField* msgInfo = nullptr;
+ if (mSkeletonState && mSkeletonState->mMsgFieldStore.Contains(serial)) {
+ mSkeletonState->mMsgFieldStore.Get(serial, &msgInfo);
+ }
+
+ if (codecState->GetType() == OggCodecState::TYPE_THEORA) {
+ TheoraState* theoraState = static_cast<TheoraState*>(codecState);
+ if (!(mTheoraState && mTheoraState->mSerial == theoraState->mSerial)) {
+ continue;
+ }
+
+ if (msgInfo) {
+ InitTrack(msgInfo, &mInfo.mVideo, mTheoraState == theoraState);
+ }
+
+ nsIntRect picture = nsIntRect(theoraState->mInfo.pic_x,
+ theoraState->mInfo.pic_y,
+ theoraState->mInfo.pic_width,
+ theoraState->mInfo.pic_height);
+ nsIntSize displaySize = nsIntSize(theoraState->mInfo.pic_width,
+ theoraState->mInfo.pic_height);
+ nsIntSize frameSize(theoraState->mInfo.frame_width,
+ theoraState->mInfo.frame_height);
+ ScaleDisplayByAspectRatio(displaySize, theoraState->mPixelAspectRatio);
+ if (IsValidVideoRegion(frameSize, picture, displaySize)) {
+ mInfo.mVideo.mDisplay = displaySize;
+ }
+ } else if (codecState->GetType() == OggCodecState::TYPE_VORBIS) {
+ VorbisState* vorbisState = static_cast<VorbisState*>(codecState);
+ if (!(mVorbisState && mVorbisState->mSerial == vorbisState->mSerial)) {
+ continue;
+ }
+
+ if (msgInfo) {
+ InitTrack(msgInfo,
+ &mInfo.mAudio,
+ mVorbisState == vorbisState);
+ }
+
+ mInfo.mAudio.mRate = vorbisState->mInfo.rate;
+ mInfo.mAudio.mChannels = vorbisState->mInfo.channels;
+ FillTags(&mInfo.mAudio, vorbisState->GetTags());
+ } else if (codecState->GetType() == OggCodecState::TYPE_OPUS) {
+ OpusState* opusState = static_cast<OpusState*>(codecState);
+ if (!(mOpusState && mOpusState->mSerial == opusState->mSerial)) {
+ continue;
+ }
+
+ if (msgInfo) {
+ InitTrack(msgInfo, &mInfo.mAudio, mOpusState == opusState);
+ }
+
+ mInfo.mAudio.mRate = opusState->mRate;
+ mInfo.mAudio.mChannels = opusState->mChannels;
+ FillTags(&mInfo.mAudio, opusState->GetTags());
+ } else if (codecState->GetType() == OggCodecState::TYPE_FLAC) {
+ FlacState* flacState = static_cast<FlacState*>(codecState);
+ if (!(mFlacState && mFlacState->mSerial == flacState->mSerial)) {
+ continue;
+ }
+
+ if (msgInfo) {
+ InitTrack(msgInfo, &mInfo.mAudio, mFlacState == flacState);
+ }
+
+ mInfo.mAudio = flacState->Info();
+ FillTags(&mInfo.mAudio, flacState->GetTags());
+ }
+ }
+}
+
+void
+OggDemuxer::FillTags(TrackInfo* aInfo, MetadataTags* aTags)
+{
+ if (!aTags) {
+ return;
+ }
+ nsAutoPtr<MetadataTags> tags(aTags);
+ for (auto iter = aTags->Iter(); !iter.Done(); iter.Next()) {
+ aInfo->mTags.AppendElement(MetadataTag(iter.Key(), iter.Data()));
+ }
+}
+
+nsresult
+OggDemuxer::ReadMetadata()
+{
+ OGG_DEBUG("OggDemuxer::ReadMetadata called!");
+
+ // We read packets until all bitstreams have read all their header packets.
+ // We record the offset of the first non-header page so that we know
+ // what page to seek to when seeking to the media start.
+
+ // @FIXME we have to read all the header packets on all the streams
+ // and THEN we can run SetupTarget*
+ // @fixme fixme
+
+ TrackInfo::TrackType tracks[2] =
+ { TrackInfo::kAudioTrack, TrackInfo::kVideoTrack };
+
+ nsTArray<OggCodecState*> bitstreams;
+ nsTArray<uint32_t> serials;
+
+ for (uint32_t i = 0; i < ArrayLength(tracks); i++) {
+ ogg_page page;
+ bool readAllBOS = false;
+ while (!readAllBOS) {
+ if (!ReadOggPage(tracks[i], &page)) {
+ // Some kind of error...
+ OGG_DEBUG("OggDemuxer::ReadOggPage failed? leaving ReadMetadata...");
+ return NS_ERROR_FAILURE;
+ }
+
+ int serial = ogg_page_serialno(&page);
+
+ if (!ogg_page_bos(&page)) {
+ // We've encountered a non Beginning Of Stream page. No more BOS pages
+ // can follow in this Ogg segment, so there will be no other bitstreams
+ // in the Ogg (unless it's invalid).
+ readAllBOS = true;
+ } else if (!mCodecStore.Contains(serial)) {
+ // We've not encountered a stream with this serial number before. Create
+ // an OggCodecState to demux it, and map that to the OggCodecState
+ // in mCodecStates.
+ OggCodecState* codecState = OggCodecState::Create(&page);
+ mCodecStore.Add(serial, codecState);
+ bitstreams.AppendElement(codecState);
+ serials.AppendElement(serial);
+ }
+ if (NS_FAILED(DemuxOggPage(tracks[i], &page))) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+ }
+
+ // We've read all BOS pages, so we know the streams contained in the media.
+ // 1. Find the first encountered Theora/Vorbis/Opus bitstream, and configure
+ // it as the target A/V bitstream.
+ // 2. Deactivate the rest of bitstreams for now, until we have MediaInfo
+ // support multiple track infos.
+ for (uint32_t i = 0; i < bitstreams.Length(); ++i) {
+ OggCodecState* s = bitstreams[i];
+ if (s) {
+ OggHeaders headers;
+ if (s->GetType() == OggCodecState::TYPE_THEORA &&
+ ReadHeaders(TrackInfo::kVideoTrack, s, headers)) {
+ if (!mTheoraState) {
+ TheoraState* theoraState = static_cast<TheoraState*>(s);
+ SetupTargetTheora(theoraState, headers);
+ } else {
+ s->Deactivate();
+ }
+ } else if (s->GetType() == OggCodecState::TYPE_VORBIS &&
+ ReadHeaders(TrackInfo::kAudioTrack, s, headers)) {
+ if (!mVorbisState) {
+ VorbisState* vorbisState = static_cast<VorbisState*>(s);
+ SetupTargetVorbis(vorbisState, headers);
+ } else {
+ s->Deactivate();
+ }
+ } else if (s->GetType() == OggCodecState::TYPE_OPUS &&
+ ReadHeaders(TrackInfo::kAudioTrack, s, headers)) {
+ if (mOpusEnabled) {
+ if (!mOpusState) {
+ OpusState* opusState = static_cast<OpusState*>(s);
+ SetupTargetOpus(opusState, headers);
+ } else {
+ s->Deactivate();
+ }
+ } else {
+ NS_WARNING("Opus decoding disabled."
+ " See media.opus.enabled in about:config");
+ }
+ } else if (MediaPrefs::FlacInOgg() &&
+ s->GetType() == OggCodecState::TYPE_FLAC &&
+ ReadHeaders(TrackInfo::kAudioTrack, s, headers)) {
+ if (!mFlacState) {
+ FlacState* flacState = static_cast<FlacState*>(s);
+ SetupTargetFlac(flacState, headers);
+ } else {
+ s->Deactivate();
+ }
+ } else if (s->GetType() == OggCodecState::TYPE_SKELETON && !mSkeletonState) {
+ mSkeletonState = static_cast<SkeletonState*>(s);
+ } else {
+ // Deactivate any non-primary bitstreams.
+ s->Deactivate();
+ }
+ }
+ }
+
+ SetupTargetSkeleton();
+ SetupMediaTracksInfo(serials);
+
+ if (HasAudio() || HasVideo()) {
+ int64_t startTime = -1;
+ FindStartTime(startTime);
+ if (startTime >= 0) {
+ OGG_DEBUG("Detected stream start time %lld", startTime);
+ mStartTime.emplace(startTime);
+ }
+
+ if (mInfo.mMetadataDuration.isNothing() &&
+ Resource(TrackInfo::kAudioTrack)->GetLength() >= 0) {
+ // We didn't get a duration from the index or a Content-Duration header.
+ // Seek to the end of file to find the end time.
+ int64_t length = Resource(TrackInfo::kAudioTrack)->GetLength();
+
+ NS_ASSERTION(length > 0, "Must have a content length to get end time");
+
+ int64_t endTime = RangeEndTime(TrackInfo::kAudioTrack, length);
+
+ if (endTime != -1) {
+ mInfo.mUnadjustedMetadataEndTime.emplace(TimeUnit::FromMicroseconds(endTime));
+ mInfo.mMetadataDuration.emplace(TimeUnit::FromMicroseconds(endTime - mStartTime.refOr(0)));
+ OGG_DEBUG("Got Ogg duration from seeking to end %lld", endTime);
+ }
+ }
+ if (mInfo.mMetadataDuration.isNothing()) {
+ mInfo.mMetadataDuration.emplace(TimeUnit::FromInfinity());
+ }
+ if (HasAudio()) {
+ mInfo.mAudio.mDuration = mInfo.mMetadataDuration->ToMicroseconds();
+ }
+ if (HasVideo()) {
+ mInfo.mVideo.mDuration = mInfo.mMetadataDuration->ToMicroseconds();
+ }
+ } else {
+ OGG_DEBUG("no audio or video tracks");
+ return NS_ERROR_FAILURE;
+ }
+
+ OGG_DEBUG("success?!");
+ return NS_OK;
+}
+
+void
+OggDemuxer::SetChained() {
+ {
+ if (mIsChained) {
+ return;
+ }
+ mIsChained = true;
+ }
+ if (mOnSeekableEvent) {
+ mOnSeekableEvent->Notify();
+ }
+}
+
+bool
+OggDemuxer::ReadOggChain(const media::TimeUnit& aLastEndTime)
+{
+ bool chained = false;
+ OpusState* newOpusState = nullptr;
+ VorbisState* newVorbisState = nullptr;
+ FlacState* newFlacState = nullptr;
+ nsAutoPtr<MetadataTags> tags;
+
+ if (HasVideo() || HasSkeleton() || !HasAudio()) {
+ return false;
+ }
+
+ ogg_page page;
+ if (!ReadOggPage(TrackInfo::kAudioTrack, &page) || !ogg_page_bos(&page)) {
+ // Chaining is only supported for audio only ogg files.
+ return false;
+ }
+
+ int serial = ogg_page_serialno(&page);
+ if (mCodecStore.Contains(serial)) {
+ return false;
+ }
+
+ nsAutoPtr<OggCodecState> codecState;
+ codecState = OggCodecState::Create(&page);
+ if (!codecState) {
+ return false;
+ }
+
+ if (mVorbisState && (codecState->GetType() == OggCodecState::TYPE_VORBIS)) {
+ newVorbisState = static_cast<VorbisState*>(codecState.get());
+ } else if (mOpusState && (codecState->GetType() == OggCodecState::TYPE_OPUS)) {
+ newOpusState = static_cast<OpusState*>(codecState.get());
+ } else if (mFlacState && (codecState->GetType() == OggCodecState::TYPE_FLAC)) {
+ newFlacState = static_cast<FlacState*>(codecState.get());
+ } else {
+ return false;
+ }
+
+ OggCodecState* state;
+
+ mCodecStore.Add(serial, codecState.forget());
+ state = mCodecStore.Get(serial);
+
+ NS_ENSURE_TRUE(state != nullptr, false);
+
+ if (NS_FAILED(state->PageIn(&page))) {
+ return false;
+ }
+
+ MessageField* msgInfo = nullptr;
+ if (mSkeletonState && mSkeletonState->mMsgFieldStore.Contains(serial)) {
+ mSkeletonState->mMsgFieldStore.Get(serial, &msgInfo);
+ }
+
+ OggHeaders vorbisHeaders;
+ if ((newVorbisState &&
+ ReadHeaders(TrackInfo::kAudioTrack, newVorbisState, vorbisHeaders)) &&
+ (mVorbisState->mInfo.rate == newVorbisState->mInfo.rate) &&
+ (mVorbisState->mInfo.channels == newVorbisState->mInfo.channels)) {
+
+ SetupTargetVorbis(newVorbisState, vorbisHeaders);
+ LOG(LogLevel::Debug, ("New vorbis ogg link, serial=%d\n", mVorbisSerial));
+
+ if (msgInfo) {
+ InitTrack(msgInfo, &mInfo.mAudio, true);
+ }
+ mInfo.mAudio.mMimeType = NS_LITERAL_CSTRING("audio/vorbis");
+ mInfo.mAudio.mRate = newVorbisState->mInfo.rate;
+ mInfo.mAudio.mChannels = newVorbisState->mInfo.channels;
+
+ chained = true;
+ tags = newVorbisState->GetTags();
+ }
+
+ OggHeaders opusHeaders;
+ if ((newOpusState &&
+ ReadHeaders(TrackInfo::kAudioTrack, newOpusState, opusHeaders)) &&
+ (mOpusState->mRate == newOpusState->mRate) &&
+ (mOpusState->mChannels == newOpusState->mChannels)) {
+
+ SetupTargetOpus(newOpusState, opusHeaders);
+
+ if (msgInfo) {
+ InitTrack(msgInfo, &mInfo.mAudio, true);
+ }
+ mInfo.mAudio.mMimeType = NS_LITERAL_CSTRING("audio/opus");
+ mInfo.mAudio.mRate = newOpusState->mRate;
+ mInfo.mAudio.mChannels = newOpusState->mChannels;
+
+ chained = true;
+ tags = newOpusState->GetTags();
+ }
+
+ OggHeaders flacHeaders;
+ if ((newFlacState &&
+ ReadHeaders(TrackInfo::kAudioTrack, newFlacState, flacHeaders)) &&
+ (mFlacState->Info().mRate == newFlacState->Info().mRate) &&
+ (mFlacState->Info().mChannels == newFlacState->Info().mChannels)) {
+
+ SetupTargetFlac(newFlacState, flacHeaders);
+ LOG(LogLevel::Debug, ("New flac ogg link, serial=%d\n", mFlacSerial));
+
+ if (msgInfo) {
+ InitTrack(msgInfo, &mInfo.mAudio, true);
+ }
+
+ mInfo.mAudio = newFlacState->Info();
+ chained = true;
+ tags = newFlacState->GetTags();
+ }
+
+ if (chained) {
+ SetChained();
+ mInfo.mMediaSeekable = false;
+ mDecodedAudioDuration += aLastEndTime;
+ if (mTimedMetadataEvent) {
+ mTimedMetadataEvent->Notify(
+ TimedMetadata(mDecodedAudioDuration,
+ Move(tags),
+ nsAutoPtr<MediaInfo>(new MediaInfo(mInfo))));
+ }
+ // Setup a new TrackInfo so that the MediaFormatReader will flush the
+ // current decoder.
+ mSharedAudioTrackInfo = new SharedTrackInfo(mInfo.mAudio, ++sStreamSourceID);
+ return true;
+ }
+
+ return false;
+}
+
+OggDemuxer::OggStateContext&
+OggDemuxer::OggState(TrackInfo::TrackType aType)
+{
+ if (aType == TrackInfo::kVideoTrack) {
+ return mVideoOggState;
+ }
+ return mAudioOggState;
+}
+
+ogg_sync_state*
+OggDemuxer::OggSyncState(TrackInfo::TrackType aType)
+{
+ return &OggState(aType).mOggState.mState;
+}
+
+MediaResourceIndex*
+OggDemuxer::Resource(TrackInfo::TrackType aType)
+{
+ return &OggState(aType).mResource;
+}
+
+MediaResourceIndex*
+OggDemuxer::CommonResource()
+{
+ return &mAudioOggState.mResource;
+}
+
+bool
+OggDemuxer::ReadOggPage(TrackInfo::TrackType aType, ogg_page* aPage)
+{
+ int ret = 0;
+ while((ret = ogg_sync_pageseek(OggSyncState(aType), aPage)) <= 0) {
+ if (ret < 0) {
+ // Lost page sync, have to skip up to next page.
+ continue;
+ }
+ // Returns a buffer that can be written too
+ // with the given size. This buffer is stored
+ // in the ogg synchronisation structure.
+ char* buffer = ogg_sync_buffer(OggSyncState(aType), 4096);
+ NS_ASSERTION(buffer, "ogg_sync_buffer failed");
+
+ // Read from the resource into the buffer
+ uint32_t bytesRead = 0;
+
+ nsresult rv = Resource(aType)->Read(buffer, 4096, &bytesRead);
+ if (NS_FAILED(rv) || !bytesRead) {
+ // End of file or error.
+ return false;
+ }
+
+ // Update the synchronisation layer with the number
+ // of bytes written to the buffer
+ ret = ogg_sync_wrote(OggSyncState(aType), bytesRead);
+ NS_ENSURE_TRUE(ret == 0, false);
+ }
+
+ return true;
+}
+
+nsresult
+OggDemuxer::DemuxOggPage(TrackInfo::TrackType aType, ogg_page* aPage)
+{
+ int serial = ogg_page_serialno(aPage);
+ OggCodecState* codecState = mCodecStore.Get(serial);
+ if (codecState == nullptr) {
+ OGG_DEBUG("encountered packet for unrecognized codecState");
+ return NS_ERROR_FAILURE;
+ }
+ if (GetCodecStateType(codecState) != aType &&
+ codecState->GetType() != OggCodecState::TYPE_SKELETON) {
+ // Not a page we're interested in.
+ return NS_OK;
+ }
+ if (NS_FAILED(codecState->PageIn(aPage))) {
+ OGG_DEBUG("codecState->PageIn failed");
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+bool
+OggDemuxer::IsSeekable() const
+{
+ if (mIsChained) {
+ return false;
+ }
+ return true;
+}
+
+UniquePtr<EncryptionInfo>
+OggDemuxer::GetCrypto()
+{
+ return nullptr;
+}
+
+ogg_packet*
+OggDemuxer::GetNextPacket(TrackInfo::TrackType aType)
+{
+ OggCodecState* state = GetTrackCodecState(aType);
+ ogg_packet* packet = nullptr;
+ OggStateContext& context = OggState(aType);
+
+ while (true) {
+ if (packet) {
+ OggCodecState::ReleasePacket(state->PacketOut());
+ }
+ DemuxUntilPacketAvailable(aType, state);
+
+ packet = state->PacketPeek();
+ if (!packet) {
+ break;
+ }
+ if (state->IsHeader(packet)) {
+ continue;
+ }
+ if (context.mNeedKeyframe && !state->IsKeyframe(packet)) {
+ continue;
+ }
+ context.mNeedKeyframe = false;
+ break;
+ }
+
+ return packet;
+}
+
+void
+OggDemuxer::DemuxUntilPacketAvailable(TrackInfo::TrackType aType,
+ OggCodecState* aState)
+{
+ while (!aState->IsPacketReady()) {
+ OGG_DEBUG("no packet yet, reading some more");
+ ogg_page page;
+ if (!ReadOggPage(aType, &page)) {
+ OGG_DEBUG("no more pages to read in resource?");
+ return;
+ }
+ DemuxOggPage(aType, &page);
+ }
+}
+
+TimeIntervals
+OggDemuxer::GetBuffered(TrackInfo::TrackType aType)
+{
+ if (!HaveStartTime(aType)) {
+ return TimeIntervals();
+ }
+ if (mIsChained) {
+ return TimeIntervals::Invalid();
+ }
+ TimeIntervals buffered;
+ // HasAudio and HasVideo are not used here as they take a lock and cause
+ // a deadlock. Accessing mInfo doesn't require a lock - it doesn't change
+ // after metadata is read.
+ if (!mInfo.HasValidMedia()) {
+ // No need to search through the file if there are no audio or video tracks
+ return buffered;
+ }
+
+ AutoPinned<MediaResource> resource(Resource(aType)->GetResource());
+ MediaByteRangeSet ranges;
+ nsresult res = resource->GetCachedRanges(ranges);
+ NS_ENSURE_SUCCESS(res, TimeIntervals::Invalid());
+
+ // Traverse across the buffered byte ranges, determining the time ranges
+ // they contain. MediaResource::GetNextCachedData(offset) returns -1 when
+ // offset is after the end of the media resource, or there's no more cached
+ // data after the offset. This loop will run until we've checked every
+ // buffered range in the media, in increasing order of offset.
+ nsAutoOggSyncState sync;
+ for (uint32_t index = 0; index < ranges.Length(); index++) {
+ // Ensure the offsets are after the header pages.
+ int64_t startOffset = ranges[index].mStart;
+ int64_t endOffset = ranges[index].mEnd;
+
+ // Because the granulepos time is actually the end time of the page,
+ // we special-case (startOffset == 0) so that the first
+ // buffered range always appears to be buffered from the media start
+ // time, rather than from the end-time of the first page.
+ int64_t startTime = (startOffset == 0) ? StartTime() : -1;
+
+ // Find the start time of the range. Read pages until we find one with a
+ // granulepos which we can convert into a timestamp to use as the time of
+ // the start of the buffered range.
+ ogg_sync_reset(&sync.mState);
+ while (startTime == -1) {
+ ogg_page page;
+ int32_t discard;
+ PageSyncResult pageSyncResult = PageSync(Resource(aType),
+ &sync.mState,
+ true,
+ startOffset,
+ endOffset,
+ &page,
+ discard);
+ if (pageSyncResult == PAGE_SYNC_ERROR) {
+ return TimeIntervals::Invalid();
+ } else if (pageSyncResult == PAGE_SYNC_END_OF_RANGE) {
+ // Hit the end of range without reading a page, give up trying to
+ // find a start time for this buffered range, skip onto the next one.
+ break;
+ }
+
+ int64_t granulepos = ogg_page_granulepos(&page);
+ if (granulepos == -1) {
+ // Page doesn't have an end time, advance to the next page
+ // until we find one.
+ startOffset += page.header_len + page.body_len;
+ continue;
+ }
+
+ uint32_t serial = ogg_page_serialno(&page);
+ if (aType == TrackInfo::kAudioTrack && mVorbisState &&
+ serial == mVorbisSerial) {
+ startTime = VorbisState::Time(&mVorbisInfo, granulepos);
+ NS_ASSERTION(startTime > 0, "Must have positive start time");
+ } else if (aType == TrackInfo::kAudioTrack && mOpusState &&
+ serial == mOpusSerial) {
+ startTime = OpusState::Time(mOpusPreSkip, granulepos);
+ NS_ASSERTION(startTime > 0, "Must have positive start time");
+ } else if (aType == TrackInfo::kAudioTrack && mFlacState &&
+ serial == mFlacSerial) {
+ startTime = mFlacState->Time(granulepos);
+ NS_ASSERTION(startTime > 0, "Must have positive start time");
+ } else if (aType == TrackInfo::kVideoTrack && mTheoraState &&
+ serial == mTheoraSerial) {
+ startTime = TheoraState::Time(&mTheoraInfo, granulepos);
+ NS_ASSERTION(startTime > 0, "Must have positive start time");
+ } else if (mCodecStore.Contains(serial)) {
+ // Stream is not the theora or vorbis stream we're playing,
+ // but is one that we have header data for.
+ startOffset += page.header_len + page.body_len;
+ continue;
+ } else {
+ // Page is for a stream we don't know about (possibly a chained
+ // ogg), return OK to abort the finding any further ranges. This
+ // prevents us searching through the rest of the media when we
+ // may not be able to extract timestamps from it.
+ SetChained();
+ return buffered;
+ }
+ }
+
+ if (startTime != -1) {
+ // We were able to find a start time for that range, see if we can
+ // find an end time.
+ int64_t endTime = RangeEndTime(aType, startOffset, endOffset, true);
+ if (endTime > startTime) {
+ buffered += TimeInterval(
+ TimeUnit::FromMicroseconds(startTime - StartTime()),
+ TimeUnit::FromMicroseconds(endTime - StartTime()));
+ }
+ }
+ }
+
+ return buffered;
+}
+
+void
+OggDemuxer::FindStartTime(int64_t& aOutStartTime)
+{
+ // Extract the start times of the bitstreams in order to calculate
+ // the duration.
+ int64_t videoStartTime = INT64_MAX;
+ int64_t audioStartTime = INT64_MAX;
+
+ if (HasVideo()) {
+ FindStartTime(TrackInfo::kVideoTrack, videoStartTime);
+ if (videoStartTime != INT64_MAX) {
+ OGG_DEBUG("OggDemuxer::FindStartTime() video=%lld", videoStartTime);
+ mVideoOggState.mStartTime =
+ Some(TimeUnit::FromMicroseconds(videoStartTime));
+ }
+ }
+ if (HasAudio()) {
+ FindStartTime(TrackInfo::kAudioTrack, audioStartTime);
+ if (audioStartTime != INT64_MAX) {
+ OGG_DEBUG("OggDemuxer::FindStartTime() audio=%lld", audioStartTime);
+ mAudioOggState.mStartTime =
+ Some(TimeUnit::FromMicroseconds(audioStartTime));
+ }
+ }
+
+ int64_t startTime = std::min(videoStartTime, audioStartTime);
+ if (startTime != INT64_MAX) {
+ aOutStartTime = startTime;
+ }
+}
+
+void
+OggDemuxer::FindStartTime(TrackInfo::TrackType aType, int64_t& aOutStartTime)
+{
+ int64_t startTime = INT64_MAX;
+
+ OggCodecState* state = GetTrackCodecState(aType);
+ ogg_packet* pkt = GetNextPacket(aType);
+ if (pkt) {
+ startTime = state->PacketStartTime(pkt);
+ }
+
+ if (startTime != INT64_MAX) {
+ aOutStartTime = startTime;
+ }
+}
+
+nsresult
+OggDemuxer::SeekInternal(TrackInfo::TrackType aType, const TimeUnit& aTarget)
+{
+ int64_t target = aTarget.ToMicroseconds();
+ OGG_DEBUG("About to seek to %lld", target);
+ nsresult res;
+ int64_t adjustedTarget = target;
+ int64_t startTime = StartTime(aType);
+ int64_t endTime = mInfo.mMetadataDuration->ToMicroseconds();
+ if (aType == TrackInfo::kAudioTrack && mOpusState){
+ adjustedTarget = std::max(startTime, target - OGG_SEEK_OPUS_PREROLL);
+ }
+
+ if (!HaveStartTime(aType) || adjustedTarget == startTime) {
+ // We've seeked to the media start or we can't seek.
+ // Just seek to the offset of the first content page.
+ res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, 0);
+ NS_ENSURE_SUCCESS(res,res);
+
+ res = Reset(aType);
+ NS_ENSURE_SUCCESS(res,res);
+ } else {
+ // TODO: This may seek back unnecessarily far in the video, but we don't
+ // have a way of asking Skeleton to seek to a different target for each
+ // stream yet. Using adjustedTarget here is at least correct, if slow.
+ IndexedSeekResult sres = SeekToKeyframeUsingIndex(aType, adjustedTarget);
+ NS_ENSURE_TRUE(sres != SEEK_FATAL_ERROR, NS_ERROR_FAILURE);
+ if (sres == SEEK_INDEX_FAIL) {
+ // No index or other non-fatal index-related failure. Try to seek
+ // using a bisection search. Determine the already downloaded data
+ // in the media cache, so we can try to seek in the cached data first.
+ AutoTArray<SeekRange, 16> ranges;
+ res = GetSeekRanges(aType, ranges);
+ NS_ENSURE_SUCCESS(res,res);
+
+ // Figure out if the seek target lies in a buffered range.
+ SeekRange r = SelectSeekRange(aType, ranges, target, startTime, endTime, true);
+
+ if (!r.IsNull()) {
+ // We know the buffered range in which the seek target lies, do a
+ // bisection search in that buffered range.
+ res = SeekInBufferedRange(aType, target, adjustedTarget, startTime, endTime, ranges, r);
+ NS_ENSURE_SUCCESS(res,res);
+ } else {
+ // The target doesn't lie in a buffered range. Perform a bisection
+ // search over the whole media, using the known buffered ranges to
+ // reduce the search space.
+ res = SeekInUnbuffered(aType, target, startTime, endTime, ranges);
+ NS_ENSURE_SUCCESS(res,res);
+ }
+ }
+ }
+
+ // Demux forwards until we find the first keyframe prior the target.
+ // there may be non-keyframes in the page before the keyframe.
+ // Additionally, we may have seeked to the first page referenced by the
+ // page index which may be quite far off the target.
+ // When doing fastSeek we display the first frame after the seek, so
+ // we need to advance the decode to the keyframe otherwise we'll get
+ // visual artifacts in the first frame output after the seek.
+ OggCodecState* state = GetTrackCodecState(aType);
+ OggPacketQueue tempPackets;
+ bool foundKeyframe = false;
+ while (true) {
+ DemuxUntilPacketAvailable(aType, state);
+ ogg_packet* packet = state->PacketPeek();
+ if (packet == nullptr) {
+ OGG_DEBUG("End of stream reached before keyframe found in indexed seek");
+ break;
+ }
+ int64_t startTstamp = state->PacketStartTime(packet);
+ if (foundKeyframe && startTstamp > adjustedTarget) {
+ break;
+ }
+ if (state->IsKeyframe(packet)) {
+ OGG_DEBUG("keyframe found after seeking at %lld", startTstamp);
+ tempPackets.Erase();
+ foundKeyframe = true;
+ }
+ if (foundKeyframe && startTstamp == adjustedTarget) {
+ break;
+ }
+ ogg_packet* releaseMe = state->PacketOut();
+ if (foundKeyframe) {
+ tempPackets.Append(releaseMe);
+ } else {
+ // Discard video packets before the first keyframe.
+ OggCodecState::ReleasePacket(releaseMe);
+ }
+ }
+ // Re-add all packet into the codec state in order.
+ state->PushFront(Move(tempPackets));
+
+ return NS_OK;
+}
+
+OggDemuxer::IndexedSeekResult
+OggDemuxer::RollbackIndexedSeek(TrackInfo::TrackType aType, int64_t aOffset)
+{
+ if (mSkeletonState) {
+ mSkeletonState->Deactivate();
+ }
+ nsresult res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, aOffset);
+ NS_ENSURE_SUCCESS(res, SEEK_FATAL_ERROR);
+ return SEEK_INDEX_FAIL;
+}
+
+OggDemuxer::IndexedSeekResult
+OggDemuxer::SeekToKeyframeUsingIndex(TrackInfo::TrackType aType, int64_t aTarget)
+{
+ if (!HasSkeleton() || !mSkeletonState->HasIndex()) {
+ return SEEK_INDEX_FAIL;
+ }
+ // We have an index from the Skeleton track, try to use it to seek.
+ AutoTArray<uint32_t, 2> tracks;
+ BuildSerialList(tracks);
+ SkeletonState::nsSeekTarget keyframe;
+ if (NS_FAILED(mSkeletonState->IndexedSeekTarget(aTarget,
+ tracks,
+ keyframe))) {
+ // Could not locate a keypoint for the target in the index.
+ return SEEK_INDEX_FAIL;
+ }
+
+ // Remember original resource read cursor position so we can rollback on failure.
+ int64_t tell = Resource(aType)->Tell();
+
+ // Seek to the keypoint returned by the index.
+ if (keyframe.mKeyPoint.mOffset > Resource(aType)->GetLength() ||
+ keyframe.mKeyPoint.mOffset < 0) {
+ // Index must be invalid.
+ return RollbackIndexedSeek(aType, tell);
+ }
+ LOG(LogLevel::Debug, ("Seeking using index to keyframe at offset %lld\n",
+ keyframe.mKeyPoint.mOffset));
+ nsresult res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET,
+ keyframe.mKeyPoint.mOffset);
+ NS_ENSURE_SUCCESS(res, SEEK_FATAL_ERROR);
+
+ // We've moved the read set, so reset decode.
+ res = Reset(aType);
+ NS_ENSURE_SUCCESS(res, SEEK_FATAL_ERROR);
+
+ // Check that the page the index thinks is exactly here is actually exactly
+ // here. If not, the index is invalid.
+ ogg_page page;
+ int skippedBytes = 0;
+ PageSyncResult syncres = PageSync(Resource(aType),
+ OggSyncState(aType),
+ false,
+ keyframe.mKeyPoint.mOffset,
+ Resource(aType)->GetLength(),
+ &page,
+ skippedBytes);
+ NS_ENSURE_TRUE(syncres != PAGE_SYNC_ERROR, SEEK_FATAL_ERROR);
+ if (syncres != PAGE_SYNC_OK || skippedBytes != 0) {
+ LOG(LogLevel::Debug, ("Indexed-seek failure: Ogg Skeleton Index is invalid "
+ "or sync error after seek"));
+ return RollbackIndexedSeek(aType, tell);
+ }
+ uint32_t serial = ogg_page_serialno(&page);
+ if (serial != keyframe.mSerial) {
+ // Serialno of page at offset isn't what the index told us to expect.
+ // Assume the index is invalid.
+ return RollbackIndexedSeek(aType, tell);
+ }
+ OggCodecState* codecState = mCodecStore.Get(serial);
+ if (codecState && codecState->mActive &&
+ ogg_stream_pagein(&codecState->mState, &page) != 0) {
+ // Couldn't insert page into the ogg resource, or somehow the resource
+ // is no longer active.
+ return RollbackIndexedSeek(aType, tell);
+ }
+ return SEEK_OK;
+}
+
+// Reads a page from the media resource.
+OggDemuxer::PageSyncResult
+OggDemuxer::PageSync(MediaResourceIndex* aResource,
+ ogg_sync_state* aState,
+ bool aCachedDataOnly,
+ int64_t aOffset,
+ int64_t aEndOffset,
+ ogg_page* aPage,
+ int& aSkippedBytes)
+{
+ aSkippedBytes = 0;
+ // Sync to the next page.
+ int ret = 0;
+ uint32_t bytesRead = 0;
+ int64_t readHead = aOffset;
+ while (ret <= 0) {
+ ret = ogg_sync_pageseek(aState, aPage);
+ if (ret == 0) {
+ char* buffer = ogg_sync_buffer(aState, PAGE_STEP);
+ NS_ASSERTION(buffer, "Must have a buffer");
+
+ // Read from the file into the buffer
+ int64_t bytesToRead = std::min(static_cast<int64_t>(PAGE_STEP),
+ aEndOffset - readHead);
+ NS_ASSERTION(bytesToRead <= UINT32_MAX, "bytesToRead range check");
+ if (bytesToRead <= 0) {
+ return PAGE_SYNC_END_OF_RANGE;
+ }
+ nsresult rv = NS_OK;
+ if (aCachedDataOnly) {
+ rv = aResource->GetResource()->ReadFromCache(buffer, readHead,
+ static_cast<uint32_t>(bytesToRead));
+ NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR);
+ bytesRead = static_cast<uint32_t>(bytesToRead);
+ } else {
+ rv = aResource->Seek(nsISeekableStream::NS_SEEK_SET, readHead);
+ NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR);
+ rv = aResource->Read(buffer,
+ static_cast<uint32_t>(bytesToRead),
+ &bytesRead);
+ NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR);
+ }
+ if (bytesRead == 0 && NS_SUCCEEDED(rv)) {
+ // End of file.
+ return PAGE_SYNC_END_OF_RANGE;
+ }
+ readHead += bytesRead;
+
+ // Update the synchronisation layer with the number
+ // of bytes written to the buffer
+ ret = ogg_sync_wrote(aState, bytesRead);
+ NS_ENSURE_TRUE(ret == 0, PAGE_SYNC_ERROR);
+ continue;
+ }
+
+ if (ret < 0) {
+ NS_ASSERTION(aSkippedBytes >= 0, "Offset >= 0");
+ aSkippedBytes += -ret;
+ NS_ASSERTION(aSkippedBytes >= 0, "Offset >= 0");
+ continue;
+ }
+ }
+
+ return PAGE_SYNC_OK;
+}
+
+//OggTrackDemuxer
+OggTrackDemuxer::OggTrackDemuxer(OggDemuxer* aParent,
+ TrackInfo::TrackType aType,
+ uint32_t aTrackNumber)
+ : mParent(aParent)
+ , mType(aType)
+{
+ mInfo = mParent->GetTrackInfo(aType, aTrackNumber);
+ MOZ_ASSERT(mInfo);
+}
+
+OggTrackDemuxer::~OggTrackDemuxer()
+{
+}
+
+UniquePtr<TrackInfo>
+OggTrackDemuxer::GetInfo() const
+{
+ return mInfo->Clone();
+}
+
+RefPtr<OggTrackDemuxer::SeekPromise>
+OggTrackDemuxer::Seek(TimeUnit aTime)
+{
+ // Seeks to aTime. Upon success, SeekPromise will be resolved with the
+ // actual time seeked to. Typically the random access point time
+ mQueuedSample = nullptr;
+ TimeUnit seekTime = aTime;
+ if (mParent->SeekInternal(mType, aTime) == NS_OK) {
+ RefPtr<MediaRawData> sample(NextSample());
+
+ // Check what time we actually seeked to.
+ if (sample != nullptr) {
+ seekTime = TimeUnit::FromMicroseconds(sample->mTime);
+ OGG_DEBUG("%p seeked to time %lld", this, seekTime.ToMicroseconds());
+ }
+ mQueuedSample = sample;
+
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+ } else {
+ return SeekPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+}
+
+RefPtr<MediaRawData>
+OggTrackDemuxer::NextSample()
+{
+ if (mQueuedSample) {
+ RefPtr<MediaRawData> nextSample = mQueuedSample;
+ mQueuedSample = nullptr;
+ if (mType == TrackInfo::kAudioTrack) {
+ nextSample->mTrackInfo = mParent->mSharedAudioTrackInfo;
+ }
+ return nextSample;
+ }
+ ogg_packet* packet = mParent->GetNextPacket(mType);
+ if (!packet) {
+ return nullptr;
+ }
+ // Check the eos state in case we need to look for chained streams.
+ bool eos = packet->e_o_s;
+ OggCodecState* state = mParent->GetTrackCodecState(mType);
+ RefPtr<MediaRawData> data = state->PacketOutAsMediaRawData();
+ if (!data) {
+ return nullptr;
+ }
+ if (mType == TrackInfo::kAudioTrack) {
+ data->mTrackInfo = mParent->mSharedAudioTrackInfo;
+ }
+ if (eos) {
+ // We've encountered an end of bitstream packet; check for a chained
+ // bitstream following this one.
+ // This will also update mSharedAudioTrackInfo.
+ mParent->ReadOggChain(TimeUnit::FromMicroseconds(data->GetEndTime()));
+ }
+ return data;
+}
+
+RefPtr<OggTrackDemuxer::SamplesPromise>
+OggTrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ RefPtr<SamplesHolder> samples = new SamplesHolder;
+ if (!aNumSamples) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, __func__);
+ }
+
+ while (aNumSamples) {
+ RefPtr<MediaRawData> sample(NextSample());
+ if (!sample) {
+ break;
+ }
+ samples->mSamples.AppendElement(sample);
+ aNumSamples--;
+ }
+
+ if (samples->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ } else {
+ return SamplesPromise::CreateAndResolve(samples, __func__);
+ }
+}
+
+void
+OggTrackDemuxer::Reset()
+{
+ mParent->Reset(mType);
+ mQueuedSample = nullptr;
+}
+
+RefPtr<OggTrackDemuxer::SkipAccessPointPromise>
+OggTrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold)
+{
+ uint32_t parsed = 0;
+ bool found = false;
+ RefPtr<MediaRawData> sample;
+
+ OGG_DEBUG("TimeThreshold: %f", aTimeThreshold.ToSeconds());
+ while (!found && (sample = NextSample())) {
+ parsed++;
+ if (sample->mKeyframe && sample->mTime >= aTimeThreshold.ToMicroseconds()) {
+ found = true;
+ mQueuedSample = sample;
+ }
+ }
+ if (found) {
+ OGG_DEBUG("next sample: %f (parsed: %d)",
+ TimeUnit::FromMicroseconds(sample->mTime).ToSeconds(),
+ parsed);
+ return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
+ } else {
+ SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
+ return SkipAccessPointPromise::CreateAndReject(Move(failure), __func__);
+ }
+}
+
+TimeIntervals
+OggTrackDemuxer::GetBuffered()
+{
+ return mParent->GetBuffered(mType);
+}
+
+void
+OggTrackDemuxer::BreakCycles()
+{
+ mParent = nullptr;
+}
+
+
+// Returns an ogg page's checksum.
+ogg_uint32_t
+OggDemuxer::GetPageChecksum(ogg_page* page)
+{
+ if (page == 0 || page->header == 0 || page->header_len < 25) {
+ return 0;
+ }
+ const unsigned char* p = page->header + 22;
+ uint32_t c = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24);
+ return c;
+}
+
+int64_t
+OggDemuxer::RangeStartTime(TrackInfo::TrackType aType, int64_t aOffset)
+{
+ int64_t position = Resource(aType)->Tell();
+ nsresult res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, aOffset);
+ NS_ENSURE_SUCCESS(res, 0);
+ int64_t startTime = 0;
+ FindStartTime(aType, startTime);
+ res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, position);
+ NS_ENSURE_SUCCESS(res, -1);
+ return startTime;
+}
+
+struct nsDemuxerAutoOggSyncState
+{
+ nsDemuxerAutoOggSyncState()
+ {
+ ogg_sync_init(&mState);
+ }
+ ~nsDemuxerAutoOggSyncState()
+ {
+ ogg_sync_clear(&mState);
+ }
+ ogg_sync_state mState;
+};
+
+int64_t
+OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, int64_t aEndOffset)
+{
+ int64_t position = Resource(aType)->Tell();
+ int64_t endTime = RangeEndTime(aType, 0, aEndOffset, false);
+ nsresult res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, position);
+ NS_ENSURE_SUCCESS(res, -1);
+ return endTime;
+}
+
+int64_t
+OggDemuxer::RangeEndTime(TrackInfo::TrackType aType,
+ int64_t aStartOffset,
+ int64_t aEndOffset,
+ bool aCachedDataOnly)
+{
+ nsDemuxerAutoOggSyncState sync;
+
+ // We need to find the last page which ends before aEndOffset that
+ // has a granulepos that we can convert to a timestamp. We do this by
+ // backing off from aEndOffset until we encounter a page on which we can
+ // interpret the granulepos. If while backing off we encounter a page which
+ // we've previously encountered before, we'll either backoff again if we
+ // haven't found an end time yet, or return the last end time found.
+ const int step = 5000;
+ const int maxOggPageSize = 65306;
+ int64_t readStartOffset = aEndOffset;
+ int64_t readLimitOffset = aEndOffset;
+ int64_t readHead = aEndOffset;
+ int64_t endTime = -1;
+ uint32_t checksumAfterSeek = 0;
+ uint32_t prevChecksumAfterSeek = 0;
+ bool mustBackOff = false;
+ while (true) {
+ ogg_page page;
+ int ret = ogg_sync_pageseek(&sync.mState, &page);
+ if (ret == 0) {
+ // We need more data if we've not encountered a page we've seen before,
+ // or we've read to the end of file.
+ if (mustBackOff || readHead == aEndOffset || readHead == aStartOffset) {
+ if (endTime != -1 || readStartOffset == 0) {
+ // We have encountered a page before, or we're at the end of file.
+ break;
+ }
+ mustBackOff = false;
+ prevChecksumAfterSeek = checksumAfterSeek;
+ checksumAfterSeek = 0;
+ ogg_sync_reset(&sync.mState);
+ readStartOffset = std::max(static_cast<int64_t>(0), readStartOffset - step);
+ // There's no point reading more than the maximum size of
+ // an Ogg page into data we've previously scanned. Any data
+ // between readLimitOffset and aEndOffset must be garbage
+ // and we can ignore it thereafter.
+ readLimitOffset = std::min(readLimitOffset,
+ readStartOffset + maxOggPageSize);
+ readHead = std::max(aStartOffset, readStartOffset);
+ }
+
+ int64_t limit = std::min(static_cast<int64_t>(UINT32_MAX),
+ aEndOffset - readHead);
+ limit = std::max(static_cast<int64_t>(0), limit);
+ limit = std::min(limit, static_cast<int64_t>(step));
+ uint32_t bytesToRead = static_cast<uint32_t>(limit);
+ uint32_t bytesRead = 0;
+ char* buffer = ogg_sync_buffer(&sync.mState, bytesToRead);
+ NS_ASSERTION(buffer, "Must have buffer");
+ nsresult res;
+ if (aCachedDataOnly) {
+ res = Resource(aType)->GetResource()->ReadFromCache(buffer, readHead, bytesToRead);
+ NS_ENSURE_SUCCESS(res, -1);
+ bytesRead = bytesToRead;
+ } else {
+ NS_ASSERTION(readHead < aEndOffset,
+ "resource pos must be before range end");
+ res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, readHead);
+ NS_ENSURE_SUCCESS(res, -1);
+ res = Resource(aType)->Read(buffer, bytesToRead, &bytesRead);
+ NS_ENSURE_SUCCESS(res, -1);
+ }
+ readHead += bytesRead;
+ if (readHead > readLimitOffset) {
+ mustBackOff = true;
+ }
+
+ // Update the synchronisation layer with the number
+ // of bytes written to the buffer
+ ret = ogg_sync_wrote(&sync.mState, bytesRead);
+ if (ret != 0) {
+ endTime = -1;
+ break;
+ }
+ continue;
+ }
+
+ if (ret < 0 || ogg_page_granulepos(&page) < 0) {
+ continue;
+ }
+
+ uint32_t checksum = GetPageChecksum(&page);
+ if (checksumAfterSeek == 0) {
+ // This is the first page we've decoded after a backoff/seek. Remember
+ // the page checksum. If we backoff further and encounter this page
+ // again, we'll know that we won't find a page with an end time after
+ // this one, so we'll know to back off again.
+ checksumAfterSeek = checksum;
+ }
+ if (checksum == prevChecksumAfterSeek) {
+ // This page has the same checksum as the first page we encountered
+ // after the last backoff/seek. Since we've already scanned after this
+ // page and failed to find an end time, we may as well backoff again and
+ // try to find an end time from an earlier page.
+ mustBackOff = true;
+ continue;
+ }
+
+ int64_t granulepos = ogg_page_granulepos(&page);
+ int serial = ogg_page_serialno(&page);
+
+ OggCodecState* codecState = nullptr;
+ codecState = mCodecStore.Get(serial);
+ if (!codecState) {
+ // This page is from a bitstream which we haven't encountered yet.
+ // It's probably from a new "link" in a "chained" ogg. Don't
+ // bother even trying to find a duration...
+ SetChained();
+ endTime = -1;
+ break;
+ }
+
+ int64_t t = codecState->Time(granulepos);
+ if (t != -1) {
+ endTime = t;
+ }
+ }
+
+ return endTime;
+}
+
+nsresult
+OggDemuxer::GetSeekRanges(TrackInfo::TrackType aType,
+ nsTArray<SeekRange>& aRanges)
+{
+ AutoPinned<MediaResource> resource(Resource(aType)->GetResource());
+ MediaByteRangeSet cached;
+ nsresult res = resource->GetCachedRanges(cached);
+ NS_ENSURE_SUCCESS(res, res);
+
+ for (uint32_t index = 0; index < cached.Length(); index++) {
+ auto& range = cached[index];
+ int64_t startTime = -1;
+ int64_t endTime = -1;
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+ int64_t startOffset = range.mStart;
+ int64_t endOffset = range.mEnd;
+ startTime = RangeStartTime(aType, startOffset);
+ if (startTime != -1 &&
+ ((endTime = RangeEndTime(aType, endOffset)) != -1)) {
+ NS_WARNING_ASSERTION(startTime < endTime,
+ "Start time must be before end time");
+ aRanges.AppendElement(SeekRange(startOffset,
+ endOffset,
+ startTime,
+ endTime));
+ }
+ }
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+OggDemuxer::SeekRange
+OggDemuxer::SelectSeekRange(TrackInfo::TrackType aType,
+ const nsTArray<SeekRange>& ranges,
+ int64_t aTarget,
+ int64_t aStartTime,
+ int64_t aEndTime,
+ bool aExact)
+{
+ int64_t so = 0;
+ int64_t eo = Resource(aType)->GetLength();
+ int64_t st = aStartTime;
+ int64_t et = aEndTime;
+ for (uint32_t i = 0; i < ranges.Length(); i++) {
+ const SeekRange& r = ranges[i];
+ if (r.mTimeStart < aTarget) {
+ so = r.mOffsetStart;
+ st = r.mTimeStart;
+ }
+ if (r.mTimeEnd >= aTarget && r.mTimeEnd < et) {
+ eo = r.mOffsetEnd;
+ et = r.mTimeEnd;
+ }
+
+ if (r.mTimeStart < aTarget && aTarget <= r.mTimeEnd) {
+ // Target lies exactly in this range.
+ return ranges[i];
+ }
+ }
+ if (aExact || eo == -1) {
+ return SeekRange();
+ }
+ return SeekRange(so, eo, st, et);
+}
+
+
+nsresult
+OggDemuxer::SeekInBufferedRange(TrackInfo::TrackType aType,
+ int64_t aTarget,
+ int64_t aAdjustedTarget,
+ int64_t aStartTime,
+ int64_t aEndTime,
+ const nsTArray<SeekRange>& aRanges,
+ const SeekRange& aRange)
+{
+ OGG_DEBUG("Seeking in buffered data to %lld using bisection search", aTarget);
+ if (aType == TrackInfo::kVideoTrack || aAdjustedTarget >= aTarget) {
+ // We know the exact byte range in which the target must lie. It must
+ // be buffered in the media cache. Seek there.
+ nsresult res = SeekBisection(aType, aTarget, aRange, 0);
+ if (NS_FAILED(res) || aType != TrackInfo::kVideoTrack) {
+ return res;
+ }
+
+ // We have an active Theora bitstream. Peek the next Theora frame, and
+ // extract its keyframe's time.
+ DemuxUntilPacketAvailable(aType, mTheoraState);
+ ogg_packet* packet = mTheoraState->PacketPeek();
+ if (packet && !mTheoraState->IsKeyframe(packet)) {
+ // First post-seek frame isn't a keyframe, seek back to previous keyframe,
+ // otherwise we'll get visual artifacts.
+ NS_ASSERTION(packet->granulepos != -1, "Must have a granulepos");
+ int shift = mTheoraState->mInfo.keyframe_granule_shift;
+ int64_t keyframeGranulepos = (packet->granulepos >> shift) << shift;
+ int64_t keyframeTime = mTheoraState->StartTime(keyframeGranulepos);
+ SEEK_LOG(LogLevel::Debug, ("Keyframe for %lld is at %lld, seeking back to it",
+ frameTime, keyframeTime));
+ aAdjustedTarget = std::min(aAdjustedTarget, keyframeTime);
+ }
+ }
+
+ nsresult res = NS_OK;
+ if (aAdjustedTarget < aTarget) {
+ SeekRange k = SelectSeekRange(aType,
+ aRanges,
+ aAdjustedTarget,
+ aStartTime,
+ aEndTime,
+ false);
+ res = SeekBisection(aType, aAdjustedTarget, k, OGG_SEEK_FUZZ_USECS);
+ }
+ return res;
+}
+
+nsresult
+OggDemuxer::SeekInUnbuffered(TrackInfo::TrackType aType,
+ int64_t aTarget,
+ int64_t aStartTime,
+ int64_t aEndTime,
+ const nsTArray<SeekRange>& aRanges)
+{
+ OGG_DEBUG("Seeking in unbuffered data to %lld using bisection search", aTarget);
+
+ // If we've got an active Theora bitstream, determine the maximum possible
+ // time in usecs which a keyframe could be before a given interframe. We
+ // subtract this from our seek target, seek to the new target, and then
+ // will decode forward to the original seek target. We should encounter a
+ // keyframe in that interval. This prevents us from needing to run two
+ // bisections; one for the seek target frame, and another to find its
+ // keyframe. It's usually faster to just download this extra data, rather
+ // tham perform two bisections to find the seek target's keyframe. We
+ // don't do this offsetting when seeking in a buffered range,
+ // as the extra decoding causes a noticeable speed hit when all the data
+ // is buffered (compared to just doing a bisection to exactly find the
+ // keyframe).
+ int64_t keyframeOffsetMs = 0;
+ if (aType == TrackInfo::kVideoTrack && mTheoraState) {
+ keyframeOffsetMs = mTheoraState->MaxKeyframeOffset();
+ }
+ // Add in the Opus pre-roll if necessary, as well.
+ if (aType == TrackInfo::kAudioTrack && mOpusState) {
+ keyframeOffsetMs = std::max(keyframeOffsetMs, OGG_SEEK_OPUS_PREROLL);
+ }
+ int64_t seekTarget = std::max(aStartTime, aTarget - keyframeOffsetMs);
+ // Minimize the bisection search space using the known timestamps from the
+ // buffered ranges.
+ SeekRange k =
+ SelectSeekRange(aType, aRanges, seekTarget, aStartTime, aEndTime, false);
+ return SeekBisection(aType, seekTarget, k, OGG_SEEK_FUZZ_USECS);
+}
+
+nsresult
+OggDemuxer::SeekBisection(TrackInfo::TrackType aType,
+ int64_t aTarget,
+ const SeekRange& aRange,
+ uint32_t aFuzz)
+{
+ nsresult res;
+
+ if (aTarget <= aRange.mTimeStart) {
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+ res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, 0);
+ NS_ENSURE_SUCCESS(res,res);
+ return NS_OK;
+ }
+
+ // Bisection search, find start offset of last page with end time less than
+ // the seek target.
+ ogg_int64_t startOffset = aRange.mOffsetStart;
+ ogg_int64_t startTime = aRange.mTimeStart;
+ ogg_int64_t startLength = 0; // Length of the page at startOffset.
+ ogg_int64_t endOffset = aRange.mOffsetEnd;
+ ogg_int64_t endTime = aRange.mTimeEnd;
+
+ ogg_int64_t seekTarget = aTarget;
+ int64_t seekLowerBound = std::max(static_cast<int64_t>(0), aTarget - aFuzz);
+ int hops = 0;
+ DebugOnly<ogg_int64_t> previousGuess = -1;
+ int backsteps = 0;
+ const int maxBackStep = 10;
+ NS_ASSERTION(static_cast<uint64_t>(PAGE_STEP) * pow(2.0, maxBackStep) < INT32_MAX,
+ "Backstep calculation must not overflow");
+
+ // Seek via bisection search. Loop until we find the offset where the page
+ // before the offset is before the seek target, and the page after the offset
+ // is after the seek target.
+ while (true) {
+ ogg_int64_t duration = 0;
+ double target = 0;
+ ogg_int64_t interval = 0;
+ ogg_int64_t guess = 0;
+ ogg_page page;
+ int skippedBytes = 0;
+ ogg_int64_t pageOffset = 0;
+ ogg_int64_t pageLength = 0;
+ ogg_int64_t granuleTime = -1;
+ bool mustBackoff = false;
+
+ // Guess where we should bisect to, based on the bit rate and the time
+ // remaining in the interval. Loop until we can determine the time at
+ // the guess offset.
+ while (true) {
+
+ // Discard any previously buffered packets/pages.
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ interval = endOffset - startOffset - startLength;
+ if (interval == 0) {
+ // Our interval is empty, we've found the optimal seek point, as the
+ // page at the start offset is before the seek target, and the page
+ // at the end offset is after the seek target.
+ SEEK_LOG(LogLevel::Debug, ("Interval narrowed, terminating bisection."));
+ break;
+ }
+
+ // Guess bisection point.
+ duration = endTime - startTime;
+ target = (double)(seekTarget - startTime) / (double)duration;
+ guess = startOffset + startLength +
+ static_cast<ogg_int64_t>((double)interval * target);
+ guess = std::min(guess, endOffset - PAGE_STEP);
+ if (mustBackoff) {
+ // We previously failed to determine the time at the guess offset,
+ // probably because we ran out of data to decode. This usually happens
+ // when we guess very close to the end offset. So reduce the guess
+ // offset using an exponential backoff until we determine the time.
+ SEEK_LOG(LogLevel::Debug, ("Backing off %d bytes, backsteps=%d",
+ static_cast<int32_t>(PAGE_STEP * pow(2.0, backsteps)), backsteps));
+ guess -= PAGE_STEP * static_cast<ogg_int64_t>(pow(2.0, backsteps));
+
+ if (guess <= startOffset) {
+ // We've tried to backoff to before the start offset of our seek
+ // range. This means we couldn't find a seek termination position
+ // near the end of the seek range, so just set the seek termination
+ // condition, and break out of the bisection loop. We'll begin
+ // decoding from the start of the seek range.
+ interval = 0;
+ break;
+ }
+
+ backsteps = std::min(backsteps + 1, maxBackStep);
+ // We reset mustBackoff. If we still need to backoff further, it will
+ // be set to true again.
+ mustBackoff = false;
+ } else {
+ backsteps = 0;
+ }
+ guess = std::max(guess, startOffset + startLength);
+
+ SEEK_LOG(LogLevel::Debug, ("Seek loop start[o=%lld..%lld t=%lld] "
+ "end[o=%lld t=%lld] "
+ "interval=%lld target=%lf guess=%lld",
+ startOffset, (startOffset+startLength), startTime,
+ endOffset, endTime, interval, target, guess));
+
+ NS_ASSERTION(guess >= startOffset + startLength, "Guess must be after range start");
+ NS_ASSERTION(guess < endOffset, "Guess must be before range end");
+ NS_ASSERTION(guess != previousGuess, "Guess should be different to previous");
+ previousGuess = guess;
+
+ hops++;
+
+ // Locate the next page after our seek guess, and then figure out the
+ // granule time of the audio and video bitstreams there. We can then
+ // make a bisection decision based on our location in the media.
+ PageSyncResult pageSyncResult = PageSync(Resource(aType),
+ OggSyncState(aType),
+ false,
+ guess,
+ endOffset,
+ &page,
+ skippedBytes);
+ NS_ENSURE_TRUE(pageSyncResult != PAGE_SYNC_ERROR, NS_ERROR_FAILURE);
+
+ if (pageSyncResult == PAGE_SYNC_END_OF_RANGE) {
+ // Our guess was too close to the end, we've ended up reading the end
+ // page. Backoff exponentially from the end point, in case the last
+ // page/frame/sample is huge.
+ mustBackoff = true;
+ SEEK_LOG(LogLevel::Debug, ("Hit the end of range, backing off"));
+ continue;
+ }
+
+ // We've located a page of length |ret| at |guess + skippedBytes|.
+ // Remember where the page is located.
+ pageOffset = guess + skippedBytes;
+ pageLength = page.header_len + page.body_len;
+
+ // Read pages until we can determine the granule time of the audio and
+ // video bitstream.
+ ogg_int64_t audioTime = -1;
+ ogg_int64_t videoTime = -1;
+ do {
+ // Add the page to its codec state, determine its granule time.
+ uint32_t serial = ogg_page_serialno(&page);
+ OggCodecState* codecState = mCodecStore.Get(serial);
+ if (codecState && GetCodecStateType(codecState) == aType) {
+ if (codecState->mActive) {
+ int ret = ogg_stream_pagein(&codecState->mState, &page);
+ NS_ENSURE_TRUE(ret == 0, NS_ERROR_FAILURE);
+ }
+
+ ogg_int64_t granulepos = ogg_page_granulepos(&page);
+
+ if (aType == TrackInfo::kAudioTrack &&
+ granulepos > 0 && audioTime == -1) {
+ if (mVorbisState && serial == mVorbisState->mSerial) {
+ audioTime = mVorbisState->Time(granulepos);
+ } else if (mOpusState && serial == mOpusState->mSerial) {
+ audioTime = mOpusState->Time(granulepos);
+ } else if (mFlacState && serial == mFlacState->mSerial) {
+ audioTime = mFlacState->Time(granulepos);
+ }
+ }
+
+ if (aType == TrackInfo::kVideoTrack &&
+ granulepos > 0 && serial == mTheoraState->mSerial &&
+ videoTime == -1) {
+ videoTime = mTheoraState->Time(granulepos);
+ }
+
+ if (pageOffset + pageLength >= endOffset) {
+ // Hit end of readable data.
+ break;
+ }
+ }
+ if (!ReadOggPage(aType, &page)) {
+ break;
+ }
+
+ } while ((aType == TrackInfo::kAudioTrack && audioTime == -1) ||
+ (aType == TrackInfo::kVideoTrack && videoTime == -1));
+
+
+ if ((aType == TrackInfo::kAudioTrack && audioTime == -1) ||
+ (aType == TrackInfo::kVideoTrack && videoTime == -1)) {
+ // We don't have timestamps for all active tracks...
+ if (pageOffset == startOffset + startLength &&
+ pageOffset + pageLength >= endOffset) {
+ // We read the entire interval without finding timestamps for all
+ // active tracks. We know the interval start offset is before the seek
+ // target, and the interval end is after the seek target, and we can't
+ // terminate inside the interval, so we terminate the seek at the
+ // start of the interval.
+ interval = 0;
+ break;
+ }
+
+ // We should backoff; cause the guess to back off from the end, so
+ // that we've got more room to capture.
+ mustBackoff = true;
+ continue;
+ }
+
+ // We've found appropriate time stamps here. Proceed to bisect
+ // the search space.
+ granuleTime = aType == TrackInfo::kAudioTrack ? audioTime : videoTime;
+ NS_ASSERTION(granuleTime > 0, "Must get a granuletime");
+ break;
+ } // End of "until we determine time at guess offset" loop.
+
+ if (interval == 0) {
+ // Seek termination condition; we've found the page boundary of the
+ // last page before the target, and the first page after the target.
+ SEEK_LOG(LogLevel::Debug, ("Terminating seek at offset=%lld", startOffset));
+ NS_ASSERTION(startTime < aTarget, "Start time must always be less than target");
+ res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, startOffset);
+ NS_ENSURE_SUCCESS(res,res);
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+ break;
+ }
+
+ SEEK_LOG(LogLevel::Debug, ("Time at offset %lld is %lld", guess, granuleTime));
+ if (granuleTime < seekTarget && granuleTime > seekLowerBound) {
+ // We're within the fuzzy region in which we want to terminate the search.
+ res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, pageOffset);
+ NS_ENSURE_SUCCESS(res,res);
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+ SEEK_LOG(LogLevel::Debug, ("Terminating seek at offset=%lld", pageOffset));
+ break;
+ }
+
+ if (granuleTime >= seekTarget) {
+ // We've landed after the seek target.
+ NS_ASSERTION(pageOffset < endOffset, "offset_end must decrease");
+ endOffset = pageOffset;
+ endTime = granuleTime;
+ } else if (granuleTime < seekTarget) {
+ // Landed before seek target.
+ NS_ASSERTION(pageOffset >= startOffset + startLength,
+ "Bisection point should be at or after end of first page in interval");
+ startOffset = pageOffset;
+ startLength = pageLength;
+ startTime = granuleTime;
+ }
+ NS_ASSERTION(startTime <= seekTarget, "Must be before seek target");
+ NS_ASSERTION(endTime >= seekTarget, "End must be after seek target");
+ }
+
+ SEEK_LOG(LogLevel::Debug, ("Seek complete in %d bisections.", hops));
+
+ return NS_OK;
+}
+
+#undef OGG_DEBUG
+#undef SEEK_DEBUG
+} // namespace mozilla
diff --git a/dom/media/ogg/OggDemuxer.h b/dom/media/ogg/OggDemuxer.h
new file mode 100644
index 000000000..90c075c98
--- /dev/null
+++ b/dom/media/ogg/OggDemuxer.h
@@ -0,0 +1,387 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(OggDemuxer_h_)
+#define OggDemuxer_h_
+
+#include "nsTArray.h"
+#include "MediaDataDemuxer.h"
+#include "OggCodecState.h"
+#include "OggCodecStore.h"
+#include "MediaMetadataManager.h"
+
+namespace mozilla {
+
+class OggTrackDemuxer;
+class OggHeaders;
+
+class OggDemuxer : public MediaDataDemuxer
+{
+public:
+ explicit OggDemuxer(MediaResource* aResource);
+
+ RefPtr<InitPromise> Init() override;
+
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(TrackInfo::TrackType aType,
+ uint32_t aTrackNumber) override;
+
+ bool IsSeekable() const override;
+
+ UniquePtr<EncryptionInfo> GetCrypto() override;
+
+ // Set the events to notify when chaining is encountered.
+ void SetChainingEvents(TimedMetadataEventProducer* aMetadataEvent,
+ MediaEventProducer<void>* aOnSeekableEvent);
+
+private:
+
+ // helpers for friend OggTrackDemuxer
+ UniquePtr<TrackInfo> GetTrackInfo(TrackInfo::TrackType aType, size_t aTrackNumber) const;
+
+ struct nsAutoOggSyncState {
+ nsAutoOggSyncState() {
+ ogg_sync_init(&mState);
+ }
+ ~nsAutoOggSyncState() {
+ ogg_sync_clear(&mState);
+ }
+ ogg_sync_state mState;
+ };
+ media::TimeIntervals GetBuffered(TrackInfo::TrackType aType);
+ void FindStartTime(int64_t& aOutStartTime);
+ void FindStartTime(TrackInfo::TrackType, int64_t& aOutStartTime);
+
+ nsresult SeekInternal(TrackInfo::TrackType aType, const media::TimeUnit& aTarget);
+
+ // Seeks to the keyframe preceding the target time using available
+ // keyframe indexes.
+ enum IndexedSeekResult
+ {
+ SEEK_OK, // Success.
+ SEEK_INDEX_FAIL, // Failure due to no index, or invalid index.
+ SEEK_FATAL_ERROR // Error returned by a stream operation.
+ };
+ IndexedSeekResult SeekToKeyframeUsingIndex(TrackInfo::TrackType aType, int64_t aTarget);
+
+ // Rolls back a seek-using-index attempt, returning a failure error code.
+ IndexedSeekResult RollbackIndexedSeek(TrackInfo::TrackType aType, int64_t aOffset);
+
+ // Represents a section of contiguous media, with a start and end offset,
+ // and the timestamps of the start and end of that range, that is cached.
+ // Used to denote the extremities of a range in which we can seek quickly
+ // (because it's cached).
+ class SeekRange
+ {
+ public:
+ SeekRange()
+ : mOffsetStart(0)
+ , mOffsetEnd(0)
+ , mTimeStart(0)
+ , mTimeEnd(0)
+ {}
+
+ SeekRange(int64_t aOffsetStart,
+ int64_t aOffsetEnd,
+ int64_t aTimeStart,
+ int64_t aTimeEnd)
+ : mOffsetStart(aOffsetStart)
+ , mOffsetEnd(aOffsetEnd)
+ , mTimeStart(aTimeStart)
+ , mTimeEnd(aTimeEnd)
+ {}
+
+ bool IsNull() const {
+ return mOffsetStart == 0 &&
+ mOffsetEnd == 0 &&
+ mTimeStart == 0 &&
+ mTimeEnd == 0;
+ }
+
+ int64_t mOffsetStart, mOffsetEnd; // in bytes.
+ int64_t mTimeStart, mTimeEnd; // in usecs.
+ };
+
+ nsresult GetSeekRanges(TrackInfo::TrackType aType, nsTArray<SeekRange>& aRanges);
+ SeekRange SelectSeekRange(TrackInfo::TrackType aType,
+ const nsTArray<SeekRange>& ranges,
+ int64_t aTarget,
+ int64_t aStartTime,
+ int64_t aEndTime,
+ bool aExact);
+
+ // Seeks to aTarget usecs in the buffered range aRange using bisection search,
+ // or to the keyframe prior to aTarget if we have video. aAdjustedTarget is
+ // an adjusted version of the target used to account for Opus pre-roll, if
+ // necessary. aStartTime must be the presentation time at the start of media,
+ // and aEndTime the time at end of media. aRanges must be the time/byte ranges
+ // buffered in the media cache as per GetSeekRanges().
+ nsresult SeekInBufferedRange(TrackInfo::TrackType aType,
+ int64_t aTarget,
+ int64_t aAdjustedTarget,
+ int64_t aStartTime,
+ int64_t aEndTime,
+ const nsTArray<SeekRange>& aRanges,
+ const SeekRange& aRange);
+
+ // Seeks to before aTarget usecs in media using bisection search. If the media
+ // has video, this will seek to before the keyframe required to render the
+ // media at aTarget. Will use aRanges in order to narrow the bisection
+ // search space. aStartTime must be the presentation time at the start of
+ // media, and aEndTime the time at end of media. aRanges must be the time/byte
+ // ranges buffered in the media cache as per GetSeekRanges().
+ nsresult SeekInUnbuffered(TrackInfo::TrackType aType,
+ int64_t aTarget,
+ int64_t aStartTime,
+ int64_t aEndTime,
+ const nsTArray<SeekRange>& aRanges);
+
+ // Performs a seek bisection to move the media stream's read cursor to the
+ // last ogg page boundary which has end time before aTarget usecs on both the
+ // Theora and Vorbis bitstreams. Limits its search to data inside aRange;
+ // i.e. it will only read inside of the aRange's start and end offsets.
+ // aFuzz is the number of usecs of leniency we'll allow; we'll terminate the
+ // seek when we land in the range (aTime - aFuzz, aTime) usecs.
+ nsresult SeekBisection(TrackInfo::TrackType aType,
+ int64_t aTarget,
+ const SeekRange& aRange,
+ uint32_t aFuzz);
+
+ // Chunk size to read when reading Ogg files. Average Ogg page length
+ // is about 4300 bytes, so we read the file in chunks larger than that.
+ static const int PAGE_STEP = 8192;
+
+ enum PageSyncResult
+ {
+ PAGE_SYNC_ERROR = 1,
+ PAGE_SYNC_END_OF_RANGE= 2,
+ PAGE_SYNC_OK = 3
+ };
+ static PageSyncResult PageSync(MediaResourceIndex* aResource,
+ ogg_sync_state* aState,
+ bool aCachedDataOnly,
+ int64_t aOffset,
+ int64_t aEndOffset,
+ ogg_page* aPage,
+ int& aSkippedBytes);
+
+ // Demux next Ogg packet
+ ogg_packet* GetNextPacket(TrackInfo::TrackType aType);
+
+ nsresult Reset(TrackInfo::TrackType aType);
+
+ static const nsString GetKind(const nsCString& aRole);
+ static void InitTrack(MessageField* aMsgInfo,
+ TrackInfo* aInfo,
+ bool aEnable);
+
+ // Really private!
+ ~OggDemuxer();
+
+ // Read enough of the file to identify track information and header
+ // packets necessary for decoding to begin.
+ nsresult ReadMetadata();
+
+ // Read a page of data from the Ogg file. Returns true if a page has been
+ // read, false if the page read failed or end of file reached.
+ bool ReadOggPage(TrackInfo::TrackType aType, ogg_page* aPage);
+
+ // Send a page off to the individual streams it belongs to.
+ // Reconstructed packets, if any are ready, will be available
+ // on the individual OggCodecStates.
+ nsresult DemuxOggPage(TrackInfo::TrackType aType, ogg_page* aPage);
+
+ // Read data and demux until a packet is available on the given stream state
+ void DemuxUntilPacketAvailable(TrackInfo::TrackType aType, OggCodecState* aState);
+
+ // Reads and decodes header packets for aState, until either header decode
+ // fails, or is complete. Initializes the codec state before returning.
+ // Returns true if reading headers and initializtion of the stream
+ // succeeds.
+ bool ReadHeaders(TrackInfo::TrackType aType, OggCodecState* aState, OggHeaders& aHeaders);
+
+ // Reads the next link in the chain.
+ bool ReadOggChain(const media::TimeUnit& aLastEndTime);
+
+ // Set this media as being a chain and notifies the state machine that the
+ // media is no longer seekable.
+ void SetChained();
+
+ // Fills aTracks with the serial numbers of each active stream, for use by
+ // various SkeletonState functions.
+ void BuildSerialList(nsTArray<uint32_t>& aTracks);
+
+ // Setup target bitstreams for decoding.
+ void SetupTargetTheora(TheoraState* aTheoraState, OggHeaders& aHeaders);
+ void SetupTargetVorbis(VorbisState* aVorbisState, OggHeaders& aHeaders);
+ void SetupTargetOpus(OpusState* aOpusState, OggHeaders& aHeaders);
+ void SetupTargetFlac(FlacState* aFlacState, OggHeaders& aHeaders);
+ void SetupTargetSkeleton();
+ void SetupMediaTracksInfo(const nsTArray<uint32_t>& aSerials);
+ void FillTags(TrackInfo* aInfo, MetadataTags* aTags);
+
+ // Compute an ogg page's checksum
+ ogg_uint32_t GetPageChecksum(ogg_page* aPage);
+
+ // Get the end time of aEndOffset. This is the playback position we'd reach
+ // after playback finished at aEndOffset.
+ int64_t RangeEndTime(TrackInfo::TrackType aType, int64_t aEndOffset);
+
+ // Get the end time of aEndOffset, without reading before aStartOffset.
+ // This is the playback position we'd reach after playback finished at
+ // aEndOffset. If bool aCachedDataOnly is true, then we'll only read
+ // from data which is cached in the media cached, otherwise we'll do
+ // regular blocking reads from the media stream. If bool aCachedDataOnly
+ // is true, this can safely be called on the main thread, otherwise it
+ // must be called on the state machine thread.
+ int64_t RangeEndTime(TrackInfo::TrackType aType,
+ int64_t aStartOffset,
+ int64_t aEndOffset,
+ bool aCachedDataOnly);
+
+ // Get the start time of the range beginning at aOffset. This is the start
+ // time of the first aType sample we'd be able to play if we
+ // started playback at aOffset.
+ int64_t RangeStartTime(TrackInfo::TrackType aType, int64_t aOffset);
+
+ MediaInfo mInfo;
+ nsTArray<RefPtr<OggTrackDemuxer>> mDemuxers;
+
+ // Map of codec-specific bitstream states.
+ OggCodecStore mCodecStore;
+
+ // Decode state of the Theora bitstream we're decoding, if we have video.
+ TheoraState* mTheoraState;
+
+ // Decode state of the Vorbis bitstream we're decoding, if we have audio.
+ VorbisState* mVorbisState;
+
+ // Decode state of the Opus bitstream we're decoding, if we have one.
+ OpusState* mOpusState;
+
+ // Get the bitstream decode state for the given track type
+ // Decode state of the Flac bitstream we're decoding, if we have one.
+ FlacState* mFlacState;
+
+ OggCodecState* GetTrackCodecState(TrackInfo::TrackType aType) const;
+ TrackInfo::TrackType GetCodecStateType(OggCodecState* aState) const;
+
+ // Represents the user pref media.opus.enabled at the time our
+ // contructor was called. We can't check it dynamically because
+ // we're not on the main thread;
+ bool mOpusEnabled;
+
+ // Decode state of the Skeleton bitstream.
+ SkeletonState* mSkeletonState;
+
+ // Ogg decoding state.
+ struct OggStateContext
+ {
+ explicit OggStateContext(MediaResource* aResource)
+ : mResource(aResource), mNeedKeyframe(true) {}
+ nsAutoOggSyncState mOggState;
+ MediaResourceIndex mResource;
+ Maybe<media::TimeUnit> mStartTime;
+ bool mNeedKeyframe;
+ };
+
+ OggStateContext& OggState(TrackInfo::TrackType aType);
+ ogg_sync_state* OggSyncState(TrackInfo::TrackType aType);
+ MediaResourceIndex* Resource(TrackInfo::TrackType aType);
+ MediaResourceIndex* CommonResource();
+ OggStateContext mAudioOggState;
+ OggStateContext mVideoOggState;
+
+ // Vorbis/Opus/Theora data used to compute timestamps. This is written on the
+ // decoder thread and read on the main thread. All reading on the main
+ // thread must be done after metadataloaded. We can't use the existing
+ // data in the codec states due to threading issues. You must check the
+ // associated mTheoraState or mVorbisState pointer is non-null before
+ // using this codec data.
+ uint32_t mVorbisSerial;
+ uint32_t mOpusSerial;
+ uint32_t mTheoraSerial;
+ uint32_t mFlacSerial;
+
+ vorbis_info mVorbisInfo;
+ int mOpusPreSkip;
+ th_info mTheoraInfo;
+
+ Maybe<int64_t> mStartTime;
+
+ // Booleans to indicate if we have audio and/or video data
+ bool HasVideo() const;
+ bool HasAudio() const;
+ bool HasSkeleton() const
+ {
+ return mSkeletonState != 0 && mSkeletonState->mActive;
+ }
+ bool HaveStartTime () const;
+ bool HaveStartTime (TrackInfo::TrackType aType);
+ int64_t StartTime() const;
+ int64_t StartTime(TrackInfo::TrackType aType);
+
+ // The picture region inside Theora frame to be displayed, if we have
+ // a Theora video track.
+ nsIntRect mPicture;
+
+ // True if we are decoding a chained ogg.
+ bool mIsChained;
+
+ // Total audio duration played so far.
+ media::TimeUnit mDecodedAudioDuration;
+
+ // Events manager
+ TimedMetadataEventProducer* mTimedMetadataEvent;
+ MediaEventProducer<void>* mOnSeekableEvent;
+
+ // This will be populated only if a content change occurs, otherwise it
+ // will be left as null so the original metadata is used.
+ // It is updated once a chained ogg is encountered.
+ // As Ogg chaining is only supported for audio, we only need an audio track
+ // info.
+ RefPtr<SharedTrackInfo> mSharedAudioTrackInfo;
+
+ friend class OggTrackDemuxer;
+};
+
+class OggTrackDemuxer : public MediaTrackDemuxer
+{
+public:
+ OggTrackDemuxer(OggDemuxer* aParent,
+ TrackInfo::TrackType aType,
+ uint32_t aTrackNumber);
+
+ UniquePtr<TrackInfo> GetInfo() const override;
+
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+
+ void Reset() override;
+
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override;
+
+ media::TimeIntervals GetBuffered() override;
+
+ void BreakCycles() override;
+
+private:
+ ~OggTrackDemuxer();
+ void SetNextKeyFrameTime();
+ RefPtr<MediaRawData> NextSample();
+ RefPtr<OggDemuxer> mParent;
+ TrackInfo::TrackType mType;
+ UniquePtr<TrackInfo> mInfo;
+
+ // Queued sample extracted by the demuxer, but not yet returned.
+ RefPtr<MediaRawData> mQueuedSample;
+};
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/ogg/OggWriter.cpp b/dom/media/ogg/OggWriter.cpp
new file mode 100644
index 000000000..bb0dca67b
--- /dev/null
+++ b/dom/media/ogg/OggWriter.cpp
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "OggWriter.h"
+#include "prtime.h"
+#include "GeckoProfiler.h"
+
+#undef LOG
+#ifdef MOZ_WIDGET_GONK
+#include <android/log.h>
+#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "MediaEncoder", ## args);
+#else
+#define LOG(args, ...)
+#endif
+
+namespace mozilla {
+
+OggWriter::OggWriter() : ContainerWriter()
+{
+ if (NS_FAILED(Init())) {
+ LOG("ERROR! Fail to initialize the OggWriter.");
+ }
+}
+
+OggWriter::~OggWriter()
+{
+ if (mInitialized) {
+ ogg_stream_clear(&mOggStreamState);
+ }
+ // mPacket's data was always owned by us, no need to ogg_packet_clear.
+}
+
+nsresult
+OggWriter::Init()
+{
+ MOZ_ASSERT(!mInitialized);
+
+ // The serial number (serialno) should be a random number, for the current
+ // implementation where the output file contains only a single stream, this
+ // serialno is used to differentiate between files.
+ srand(static_cast<unsigned>(PR_Now()));
+ int rc = ogg_stream_init(&mOggStreamState, rand());
+
+ mPacket.b_o_s = 1;
+ mPacket.e_o_s = 0;
+ mPacket.granulepos = 0;
+ mPacket.packet = nullptr;
+ mPacket.packetno = 0;
+ mPacket.bytes = 0;
+
+ mInitialized = (rc == 0);
+
+ return (rc == 0) ? NS_OK : NS_ERROR_NOT_INITIALIZED;
+}
+
+nsresult
+OggWriter::WriteEncodedTrack(const EncodedFrameContainer& aData,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("OggWriter", "WriteEncodedTrack",
+ js::ProfileEntry::Category::OTHER);
+
+ uint32_t len = aData.GetEncodedFrames().Length();
+ for (uint32_t i = 0; i < len; i++) {
+ if (aData.GetEncodedFrames()[i]->GetFrameType() != EncodedFrame::OPUS_AUDIO_FRAME) {
+ LOG("[OggWriter] wrong encoded data type!");
+ return NS_ERROR_FAILURE;
+ }
+
+ // only pass END_OF_STREAM on the last frame!
+ nsresult rv = WriteEncodedData(aData.GetEncodedFrames()[i]->GetFrameData(),
+ aData.GetEncodedFrames()[i]->GetDuration(),
+ i < len-1 ? (aFlags & ~ContainerWriter::END_OF_STREAM) :
+ aFlags);
+ if (NS_FAILED(rv)) {
+ LOG("%p Failed to WriteEncodedTrack!", this);
+ return rv;
+ }
+ }
+ return NS_OK;
+}
+
+nsresult
+OggWriter::WriteEncodedData(const nsTArray<uint8_t>& aBuffer, int aDuration,
+ uint32_t aFlags)
+{
+ if (!mInitialized) {
+ LOG("[OggWriter] OggWriter has not initialized!");
+ return NS_ERROR_FAILURE;
+ }
+
+ MOZ_ASSERT(!ogg_stream_eos(&mOggStreamState),
+ "No data can be written after eos has marked.");
+
+ // Set eos flag to true, and once the eos is written to a packet, there must
+ // not be anymore pages after a page has marked as eos.
+ if (aFlags & ContainerWriter::END_OF_STREAM) {
+ LOG("[OggWriter] Set e_o_s flag to true.");
+ mPacket.e_o_s = 1;
+ }
+
+ mPacket.packet = const_cast<uint8_t*>(aBuffer.Elements());
+ mPacket.bytes = aBuffer.Length();
+ mPacket.granulepos += aDuration;
+
+ // 0 returned on success. -1 returned in the event of internal error.
+ // The data in the packet is copied into the internal storage managed by the
+ // mOggStreamState, so we are free to alter the contents of mPacket after
+ // this call has returned.
+ int rc = ogg_stream_packetin(&mOggStreamState, &mPacket);
+ if (rc < 0) {
+ LOG("[OggWriter] Failed in ogg_stream_packetin! (%d).", rc);
+ return NS_ERROR_FAILURE;
+ }
+
+ if (mPacket.b_o_s) {
+ mPacket.b_o_s = 0;
+ }
+ mPacket.packetno++;
+ mPacket.packet = nullptr;
+
+ return NS_OK;
+}
+
+void
+OggWriter::ProduceOggPage(nsTArray<nsTArray<uint8_t> >* aOutputBufs)
+{
+ aOutputBufs->AppendElement();
+ aOutputBufs->LastElement().SetLength(mOggPage.header_len +
+ mOggPage.body_len);
+ memcpy(aOutputBufs->LastElement().Elements(), mOggPage.header,
+ mOggPage.header_len);
+ memcpy(aOutputBufs->LastElement().Elements() + mOggPage.header_len,
+ mOggPage.body, mOggPage.body_len);
+}
+
+nsresult
+OggWriter::GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ uint32_t aFlags)
+{
+ int rc = -1;
+ PROFILER_LABEL("OggWriter", "GetContainerData",
+ js::ProfileEntry::Category::OTHER);
+ // Generate the oggOpus Header
+ if (aFlags & ContainerWriter::GET_HEADER) {
+ OpusMetadata* meta = static_cast<OpusMetadata*>(mMetadata.get());
+ NS_ASSERTION(meta, "should have meta data");
+ NS_ASSERTION(meta->GetKind() == TrackMetadataBase::METADATA_OPUS,
+ "should have Opus meta data");
+
+ nsresult rv = WriteEncodedData(meta->mIdHeader, 0);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rc = ogg_stream_flush(&mOggStreamState, &mOggPage);
+ NS_ENSURE_TRUE(rc > 0, NS_ERROR_FAILURE);
+ ProduceOggPage(aOutputBufs);
+
+ rv = WriteEncodedData(meta->mCommentHeader, 0);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rc = ogg_stream_flush(&mOggStreamState, &mOggPage);
+ NS_ENSURE_TRUE(rc > 0, NS_ERROR_FAILURE);
+
+ ProduceOggPage(aOutputBufs);
+ return NS_OK;
+
+ // Force generate a page even if the amount of packet data is not enough.
+ // Usually do so after a header packet.
+ } else if (aFlags & ContainerWriter::FLUSH_NEEDED) {
+ // rc = 0 means no packet to put into a page, or an internal error.
+ rc = ogg_stream_flush(&mOggStreamState, &mOggPage);
+ } else {
+ // rc = 0 means insufficient data has accumulated to fill a page, or an
+ // internal error has occurred.
+ rc = ogg_stream_pageout(&mOggStreamState, &mOggPage);
+ }
+
+ if (rc) {
+ ProduceOggPage(aOutputBufs);
+ }
+ if (aFlags & ContainerWriter::FLUSH_NEEDED) {
+ mIsWritingComplete = true;
+ }
+ return (rc > 0) ? NS_OK : NS_ERROR_FAILURE;
+}
+
+nsresult
+OggWriter::SetMetadata(TrackMetadataBase* aMetadata)
+{
+ MOZ_ASSERT(aMetadata);
+
+ PROFILER_LABEL("OggWriter", "SetMetadata",
+ js::ProfileEntry::Category::OTHER);
+
+ if (aMetadata->GetKind() != TrackMetadataBase::METADATA_OPUS) {
+ LOG("wrong meta data type!");
+ return NS_ERROR_FAILURE;
+ }
+ // Validate each field of METADATA
+ mMetadata = static_cast<OpusMetadata*>(aMetadata);
+ if (mMetadata->mIdHeader.Length() == 0) {
+ LOG("miss mIdHeader!");
+ return NS_ERROR_FAILURE;
+ }
+ if (mMetadata->mCommentHeader.Length() == 0) {
+ LOG("miss mCommentHeader!");
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/ogg/OggWriter.h b/dom/media/ogg/OggWriter.h
new file mode 100644
index 000000000..b58bbd6df
--- /dev/null
+++ b/dom/media/ogg/OggWriter.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef OggWriter_h_
+#define OggWriter_h_
+
+#include "ContainerWriter.h"
+#include "OpusTrackEncoder.h"
+#include <ogg/ogg.h>
+
+namespace mozilla {
+/**
+ * WriteEncodedTrack inserts raw packets into Ogg stream (ogg_stream_state), and
+ * GetContainerData outputs an ogg_page when enough packets have been written
+ * to the Ogg stream.
+ * For more details, please reference:
+ * http://www.xiph.org/ogg/doc/libogg/encoding.html
+ */
+class OggWriter : public ContainerWriter
+{
+public:
+ OggWriter();
+ ~OggWriter();
+
+ nsresult WriteEncodedTrack(const EncodedFrameContainer &aData,
+ uint32_t aFlags = 0) override;
+
+ nsresult GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ uint32_t aFlags = 0) override;
+
+ // Check metadata type integrity and reject unacceptable track encoder.
+ nsresult SetMetadata(TrackMetadataBase* aMetadata) override;
+private:
+ nsresult Init();
+
+ nsresult WriteEncodedData(const nsTArray<uint8_t>& aBuffer, int aDuration,
+ uint32_t aFlags = 0);
+
+ void ProduceOggPage(nsTArray<nsTArray<uint8_t> >* aOutputBufs);
+ // Store the Medatata from track encoder
+ RefPtr<OpusMetadata> mMetadata;
+
+ ogg_stream_state mOggStreamState;
+ ogg_page mOggPage;
+ ogg_packet mPacket;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/ogg/OpusParser.cpp b/dom/media/ogg/OpusParser.cpp
new file mode 100644
index 000000000..7e62f6d5f
--- /dev/null
+++ b/dom/media/ogg/OpusParser.cpp
@@ -0,0 +1,185 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <algorithm>
+#include "mozilla/EndianUtils.h"
+
+#include "OpusParser.h"
+#include "VideoUtils.h"
+
+#include "opus/opus.h"
+extern "C" {
+#include "opus/opus_multistream.h"
+}
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+#define OPUS_LOG(type, msg) MOZ_LOG(gMediaDecoderLog, type, msg)
+
+OpusParser::OpusParser():
+ mRate(0),
+ mNominalRate(0),
+ mChannels(0),
+ mPreSkip(0),
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ mGain(1.0f),
+#else
+ mGain_Q16(65536),
+#endif
+ mChannelMapping(0),
+ mStreams(0),
+ mCoupledStreams(0)
+{ }
+
+bool OpusParser::DecodeHeader(unsigned char* aData, size_t aLength)
+{
+ if (aLength < 19 || memcmp(aData, "OpusHead", 8)) {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: unrecognized header"));
+ return false;
+ }
+
+ mRate = 48000; // The Opus decoder runs at 48 kHz regardless.
+
+ int version = aData[8];
+ // Accept file format versions 0.x.
+ if ((version & 0xf0) != 0) {
+ OPUS_LOG(LogLevel::Debug, ("Rejecting unknown Opus file version %d", version));
+ return false;
+ }
+
+ mChannels = aData[9];
+ if (mChannels<1) {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: Number of channels %d", mChannels));
+ return false;
+ }
+
+ mPreSkip = LittleEndian::readUint16(aData + 10);
+ mNominalRate = LittleEndian::readUint32(aData + 12);
+ double gain_dB = LittleEndian::readInt16(aData + 16) / 256.0;
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ mGain = static_cast<float>(pow(10,0.05*gain_dB));
+#else
+ mGain_Q16 = static_cast<int32_t>(std::min(65536*pow(10,0.05*gain_dB)+0.5,
+ static_cast<double>(INT32_MAX)));
+#endif
+ mChannelMapping = aData[18];
+
+ if (mChannelMapping == 0) {
+ // Mapping family 0 only allows two channels
+ if (mChannels>2) {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: too many channels (%d) for"
+ " mapping family 0.", mChannels));
+ return false;
+ }
+ mStreams = 1;
+ mCoupledStreams = mChannels - 1;
+ mMappingTable[0] = 0;
+ mMappingTable[1] = 1;
+ } else if (mChannelMapping == 1 || mChannelMapping == 255) {
+ // Currently only up to 8 channels are defined for mapping family 1 and we
+ // only supports only up to 8 channels for mapping family 255.
+ if (mChannels>8) {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: too many channels (%d) for"
+ " mapping family 1.", mChannels));
+ return false;
+ }
+ if (aLength>static_cast<unsigned>(20+mChannels)) {
+ mStreams = aData[19];
+ mCoupledStreams = aData[20];
+ int i;
+ for (i=0; i<mChannels; i++)
+ mMappingTable[i] = aData[21+i];
+ } else {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: channel mapping %d,"
+ " but no channel mapping table", mChannelMapping));
+ return false;
+ }
+ } else {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: unsupported channel mapping "
+ "family %d", mChannelMapping));
+ return false;
+ }
+ if (mStreams < 1) {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: no streams"));
+ return false;
+ }
+ if (mCoupledStreams > mStreams) {
+ OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: more coupled streams (%d) than "
+ "total streams (%d)", mCoupledStreams, mStreams));
+ return false;
+ }
+
+#ifdef DEBUG
+ OPUS_LOG(LogLevel::Debug, ("Opus stream header:"));
+ OPUS_LOG(LogLevel::Debug, (" channels: %d", mChannels));
+ OPUS_LOG(LogLevel::Debug, (" preskip: %d", mPreSkip));
+ OPUS_LOG(LogLevel::Debug, (" original: %d Hz", mNominalRate));
+ OPUS_LOG(LogLevel::Debug, (" gain: %.2f dB", gain_dB));
+ OPUS_LOG(LogLevel::Debug, ("Channel Mapping:"));
+ OPUS_LOG(LogLevel::Debug, (" family: %d", mChannelMapping));
+ OPUS_LOG(LogLevel::Debug, (" streams: %d", mStreams));
+#endif
+ return true;
+}
+
+bool OpusParser::DecodeTags(unsigned char* aData, size_t aLength)
+{
+ if (aLength < 16 || memcmp(aData, "OpusTags", 8))
+ return false;
+
+ // Copy out the raw comment lines, but only do basic validation
+ // checks against the string packing: too little data, too many
+ // comments, or comments that are too long. Rejecting these cases
+ // helps reduce the propagation of broken files.
+ // We do not ensure they are valid UTF-8 here, nor do we validate
+ // the required ASCII_TAG=value format of the user comments.
+ const unsigned char* buf = aData + 8;
+ uint32_t bytes = aLength - 8;
+ uint32_t len;
+ // Read the vendor string.
+ len = LittleEndian::readUint32(buf);
+ buf += 4;
+ bytes -= 4;
+ if (len > bytes)
+ return false;
+ mVendorString = nsCString(reinterpret_cast<const char*>(buf), len);
+ buf += len;
+ bytes -= len;
+ // Read the user comments.
+ if (bytes < 4)
+ return false;
+ uint32_t ncomments = LittleEndian::readUint32(buf);
+ buf += 4;
+ bytes -= 4;
+ // If there are so many comments even their length fields
+ // won't fit in the packet, stop reading now.
+ if (ncomments > (bytes>>2))
+ return false;
+ for (uint32_t i = 0; i < ncomments; i++) {
+ if (bytes < 4)
+ return false;
+ len = LittleEndian::readUint32(buf);
+ buf += 4;
+ bytes -= 4;
+ if (len > bytes)
+ return false;
+ mTags.AppendElement(nsCString(reinterpret_cast<const char*>(buf), len));
+ buf += len;
+ bytes -= len;
+ }
+
+#ifdef DEBUG
+ OPUS_LOG(LogLevel::Debug, ("Opus metadata header:"));
+ OPUS_LOG(LogLevel::Debug, (" vendor: %s", mVendorString.get()));
+ for (uint32_t i = 0; i < mTags.Length(); i++) {
+ OPUS_LOG(LogLevel::Debug, (" %s", mTags[i].get()));
+ }
+#endif
+ return true;
+}
+
+} // namespace mozilla
diff --git a/dom/media/ogg/OpusParser.h b/dom/media/ogg/OpusParser.h
new file mode 100644
index 000000000..0c6d9c940
--- /dev/null
+++ b/dom/media/ogg/OpusParser.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(OpusParser_h_)
+#define OpusParser_h_
+
+#include "nsTArray.h"
+#include "nsString.h"
+
+namespace mozilla {
+
+class OpusParser
+{
+public:
+ OpusParser();
+
+ bool DecodeHeader(unsigned char* aData, size_t aLength);
+ bool DecodeTags(unsigned char* aData, size_t aLength);
+
+ // Various fields from the Ogg Opus header.
+ int mRate; // Sample rate the decoder uses (always 48 kHz).
+ uint32_t mNominalRate; // Original sample rate of the data (informational).
+ int mChannels; // Number of channels the stream encodes.
+ uint16_t mPreSkip; // Number of samples to strip after decoder reset.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ float mGain; // Gain to apply to decoder output.
+#else
+ int32_t mGain_Q16; // Gain to apply to the decoder output.
+#endif
+ int mChannelMapping; // Channel mapping family.
+ int mStreams; // Number of packed streams in each packet.
+ int mCoupledStreams; // Number of packed coupled streams in each packet.
+ unsigned char mMappingTable[255]; // Channel mapping table.
+
+ // Granule position (end sample) of the last decoded Opus packet. This is
+ // used to calculate the amount we should trim from the last packet.
+ int64_t mPrevPacketGranulepos;
+
+ nsTArray<nsCString> mTags; // Unparsed comment strings from the header.
+
+ nsCString mVendorString; // Encoder vendor string from the header.
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/ogg/moz.build b/dom/media/ogg/moz.build
new file mode 100644
index 000000000..07e195b6f
--- /dev/null
+++ b/dom/media/ogg/moz.build
@@ -0,0 +1,25 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'OggCodecState.h',
+ 'OggCodecStore.h',
+ 'OggDecoder.h',
+ 'OggDemuxer.h',
+ 'OggWriter.h',
+ 'OpusParser.h',
+]
+
+UNIFIED_SOURCES += [
+ 'OggCodecState.cpp',
+ 'OggCodecStore.cpp',
+ 'OggDecoder.cpp',
+ 'OggDemuxer.cpp',
+ 'OggWriter.cpp',
+ 'OpusParser.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/MediaTelemetryConstants.h b/dom/media/platforms/MediaTelemetryConstants.h
new file mode 100644
index 000000000..5024949a8
--- /dev/null
+++ b/dom/media/platforms/MediaTelemetryConstants.h
@@ -0,0 +1,22 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef dom_media_platforms_MediaTelemetryConstants_h___
+#define dom_media_platforms_MediaTelemetryConstants_h___
+
+namespace mozilla {
+namespace media {
+
+enum class MediaDecoderBackend : uint32_t
+{
+ WMFSoftware = 0,
+ WMFDXVA2D3D9 = 1,
+ WMFDXVA2D3D11 = 2
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif // dom_media_platforms_MediaTelemetryConstants_h___
diff --git a/dom/media/platforms/PDMFactory.cpp b/dom/media/platforms/PDMFactory.cpp
new file mode 100644
index 000000000..a72d910f5
--- /dev/null
+++ b/dom/media/platforms/PDMFactory.cpp
@@ -0,0 +1,482 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "PDMFactory.h"
+
+#ifdef XP_WIN
+#include "WMFDecoderModule.h"
+
+#endif
+#ifdef MOZ_FFVPX
+#include "FFVPXRuntimeLinker.h"
+#endif
+#ifdef MOZ_FFMPEG
+#include "FFmpegRuntimeLinker.h"
+#endif
+#ifdef MOZ_APPLEMEDIA
+#include "AppleDecoderModule.h"
+#endif
+#ifdef MOZ_GONK_MEDIACODEC
+#include "GonkDecoderModule.h"
+#endif
+#ifdef MOZ_WIDGET_ANDROID
+#include "AndroidDecoderModule.h"
+#endif
+#include "GMPDecoderModule.h"
+
+#include "mozilla/CDMProxy.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/SharedThreadPool.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/SyncRunnable.h"
+#include "mozilla/TaskQueue.h"
+
+#include "MediaInfo.h"
+#include "MediaPrefs.h"
+#include "FuzzingWrapper.h"
+#include "H264Converter.h"
+
+#include "AgnosticDecoderModule.h"
+#include "EMEDecoderModule.h"
+
+#include "DecoderDoctorDiagnostics.h"
+
+#include "MP4Decoder.h"
+#include "mozilla/dom/RemoteVideoDecoder.h"
+
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
+
+#include "mp4_demuxer/H264.h"
+
+namespace mozilla {
+
+extern already_AddRefed<PlatformDecoderModule> CreateAgnosticDecoderModule();
+extern already_AddRefed<PlatformDecoderModule> CreateBlankDecoderModule();
+
+class PDMFactoryImpl final {
+public:
+ PDMFactoryImpl()
+ {
+#ifdef XP_WIN
+ WMFDecoderModule::Init();
+#endif
+#ifdef MOZ_APPLEMEDIA
+ AppleDecoderModule::Init();
+#endif
+#ifdef MOZ_FFVPX
+ FFVPXRuntimeLinker::Init();
+#endif
+#ifdef MOZ_FFMPEG
+ FFmpegRuntimeLinker::Init();
+#endif
+ }
+};
+
+StaticAutoPtr<PDMFactoryImpl> PDMFactory::sInstance;
+StaticMutex PDMFactory::sMonitor;
+
+class SupportChecker
+{
+public:
+ enum class Reason : uint8_t
+ {
+ kSupported,
+ kVideoFormatNotSupported,
+ kAudioFormatNotSupported,
+ kUnknown,
+ };
+
+ struct CheckResult
+ {
+ explicit CheckResult(Reason aReason,
+ MediaResult aResult = MediaResult(NS_OK))
+ : mReason(aReason),
+ mMediaResult(mozilla::Move(aResult))
+ {}
+ CheckResult(const CheckResult& aOther) = default;
+ CheckResult(CheckResult&& aOther) = default;
+ CheckResult& operator=(const CheckResult& aOther) = default;
+ CheckResult& operator=(CheckResult&& aOther) = default;
+
+ Reason mReason;
+ MediaResult mMediaResult;
+ };
+
+ template<class Func>
+ void
+ AddToCheckList(Func&& aChecker)
+ {
+ mCheckerList.AppendElement(mozilla::Forward<Func>(aChecker));
+ }
+
+ void
+ AddMediaFormatChecker(const TrackInfo& aTrackConfig)
+ {
+ if (aTrackConfig.IsVideo()) {
+ auto mimeType = aTrackConfig.GetAsVideoInfo()->mMimeType;
+ RefPtr<MediaByteBuffer> extraData = aTrackConfig.GetAsVideoInfo()->mExtraData;
+ AddToCheckList(
+ [mimeType, extraData]() {
+ if (MP4Decoder::IsH264(mimeType)) {
+ mp4_demuxer::SPSData spsdata;
+ // WMF H.264 Video Decoder and Apple ATDecoder
+ // do not support YUV444 format.
+ // For consistency, all decoders should be checked.
+ if (mp4_demuxer::H264::DecodeSPSFromExtraData(extraData, spsdata) &&
+ (spsdata.profile_idc == 244 /* Hi444PP */ ||
+ spsdata.chroma_format_idc == PDMFactory::kYUV444)) {
+ return CheckResult(
+ SupportChecker::Reason::kVideoFormatNotSupported,
+ MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Decoder may not have the capability to handle"
+ " the requested video format"
+ " with YUV444 chroma subsampling.")));
+ }
+ }
+ return CheckResult(SupportChecker::Reason::kSupported);
+ });
+ }
+ }
+
+ SupportChecker::CheckResult
+ Check()
+ {
+ for (auto& checker : mCheckerList) {
+ auto result = checker();
+ if (result.mReason != SupportChecker::Reason::kSupported) {
+ return result;
+ }
+ }
+ return CheckResult(SupportChecker::Reason::kSupported);
+ }
+
+ void Clear() { mCheckerList.Clear(); }
+
+private:
+ nsTArray<mozilla::function<CheckResult()>> mCheckerList;
+}; // SupportChecker
+
+PDMFactory::PDMFactory()
+{
+ EnsureInit();
+ CreatePDMs();
+ CreateBlankPDM();
+}
+
+PDMFactory::~PDMFactory()
+{
+}
+
+void
+PDMFactory::EnsureInit() const
+{
+ {
+ StaticMutexAutoLock mon(sMonitor);
+ if (sInstance) {
+ // Quick exit if we already have an instance.
+ return;
+ }
+ if (NS_IsMainThread()) {
+ // On the main thread and holding the lock -> Create instance.
+ sInstance = new PDMFactoryImpl();
+ ClearOnShutdown(&sInstance);
+ return;
+ }
+ }
+
+ // Not on the main thread -> Sync-dispatch creation to main thread.
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ nsCOMPtr<nsIRunnable> runnable =
+ NS_NewRunnableFunction([]() {
+ StaticMutexAutoLock mon(sMonitor);
+ if (!sInstance) {
+ sInstance = new PDMFactoryImpl();
+ ClearOnShutdown(&sInstance);
+ }
+ });
+ SyncRunnable::DispatchToThread(mainThread, runnable);
+}
+
+already_AddRefed<MediaDataDecoder>
+PDMFactory::CreateDecoder(const CreateDecoderParams& aParams)
+{
+ if (aParams.mUseBlankDecoder) {
+ MOZ_ASSERT(mBlankPDM);
+ return CreateDecoderWithPDM(mBlankPDM, aParams);
+ }
+
+ const TrackInfo& config = aParams.mConfig;
+ bool isEncrypted = mEMEPDM && config.mCrypto.mValid;
+
+ if (isEncrypted) {
+ return CreateDecoderWithPDM(mEMEPDM, aParams);
+ }
+
+ DecoderDoctorDiagnostics* diagnostics = aParams.mDiagnostics;
+ if (diagnostics) {
+ // If libraries failed to load, the following loop over mCurrentPDMs
+ // will not even try to use them. So we record failures now.
+ if (mWMFFailedToLoad) {
+ diagnostics->SetWMFFailedToLoad();
+ }
+ if (mFFmpegFailedToLoad) {
+ diagnostics->SetFFmpegFailedToLoad();
+ }
+ if (mGMPPDMFailedToStartup) {
+ diagnostics->SetGMPPDMFailedToStartup();
+ }
+ }
+
+ for (auto& current : mCurrentPDMs) {
+ if (!current->SupportsMimeType(config.mMimeType, diagnostics)) {
+ continue;
+ }
+ RefPtr<MediaDataDecoder> m = CreateDecoderWithPDM(current, aParams);
+ if (m) {
+ return m.forget();
+ }
+ }
+ NS_WARNING("Unable to create a decoder, no platform found.");
+ return nullptr;
+}
+
+already_AddRefed<MediaDataDecoder>
+PDMFactory::CreateDecoderWithPDM(PlatformDecoderModule* aPDM,
+ const CreateDecoderParams& aParams)
+{
+ MOZ_ASSERT(aPDM);
+ RefPtr<MediaDataDecoder> m;
+ MediaResult* result = aParams.mError;
+
+ SupportChecker supportChecker;
+ const TrackInfo& config = aParams.mConfig;
+ supportChecker.AddMediaFormatChecker(config);
+
+ auto checkResult = supportChecker.Check();
+ if (checkResult.mReason != SupportChecker::Reason::kSupported) {
+ DecoderDoctorDiagnostics* diagnostics = aParams.mDiagnostics;
+ if (checkResult.mReason == SupportChecker::Reason::kVideoFormatNotSupported) {
+ if (diagnostics) {
+ diagnostics->SetVideoNotSupported();
+ }
+ if (result) {
+ *result = checkResult.mMediaResult;
+ }
+ } else if (checkResult.mReason == SupportChecker::Reason::kAudioFormatNotSupported) {
+ if (diagnostics) {
+ diagnostics->SetAudioNotSupported();
+ }
+ if (result) {
+ *result = checkResult.mMediaResult;
+ }
+ }
+ return nullptr;
+ }
+
+ if (config.IsAudio()) {
+ m = aPDM->CreateAudioDecoder(aParams);
+ return m.forget();
+ }
+
+ if (!config.IsVideo()) {
+ *result = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Decoder configuration error, expected audio or video."));
+ return nullptr;
+ }
+
+ MediaDataDecoderCallback* callback = aParams.mCallback;
+ RefPtr<DecoderCallbackFuzzingWrapper> callbackWrapper;
+ if (MediaPrefs::PDMFuzzingEnabled()) {
+ callbackWrapper = new DecoderCallbackFuzzingWrapper(callback);
+ callbackWrapper->SetVideoOutputMinimumInterval(
+ TimeDuration::FromMilliseconds(MediaPrefs::PDMFuzzingInterval()));
+ callbackWrapper->SetDontDelayInputExhausted(!MediaPrefs::PDMFuzzingDelayInputExhausted());
+ callback = callbackWrapper.get();
+ }
+
+ CreateDecoderParams params = aParams;
+ params.mCallback = callback;
+
+ if (MP4Decoder::IsH264(config.mMimeType) && !aParams.mUseBlankDecoder) {
+ RefPtr<H264Converter> h = new H264Converter(aPDM, params);
+ const nsresult rv = h->GetLastError();
+ if (NS_SUCCEEDED(rv) || rv == NS_ERROR_NOT_INITIALIZED) {
+ // The H264Converter either successfully created the wrapped decoder,
+ // or there wasn't enough AVCC data to do so. Otherwise, there was some
+ // problem, for example WMF DLLs were missing.
+ m = h.forget();
+ }
+ } else {
+ m = aPDM->CreateVideoDecoder(params);
+ }
+
+ if (callbackWrapper && m) {
+ m = new DecoderFuzzingWrapper(m.forget(), callbackWrapper.forget());
+ }
+
+ return m.forget();
+}
+
+bool
+PDMFactory::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ UniquePtr<TrackInfo> trackInfo = CreateTrackInfoWithMIMEType(aMimeType);
+ if (!trackInfo) {
+ return false;
+ }
+ return Supports(*trackInfo, aDiagnostics);
+}
+
+bool
+PDMFactory::Supports(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ if (mEMEPDM) {
+ return mEMEPDM->Supports(aTrackInfo, aDiagnostics);
+ }
+ RefPtr<PlatformDecoderModule> current = GetDecoder(aTrackInfo, aDiagnostics);
+ return !!current;
+}
+
+void
+PDMFactory::CreatePDMs()
+{
+ RefPtr<PlatformDecoderModule> m;
+
+ if (MediaPrefs::PDMUseBlankDecoder()) {
+ m = CreateBlankDecoderModule();
+ StartupPDM(m);
+ // The Blank PDM SupportsMimeType reports true for all codecs; the creation
+ // of its decoder is infallible. As such it will be used for all media, we
+ // can stop creating more PDM from this point.
+ return;
+ }
+
+#ifdef MOZ_WIDGET_ANDROID
+ if(MediaPrefs::PDMAndroidMediaCodecPreferred() &&
+ MediaPrefs::PDMAndroidMediaCodecEnabled()) {
+ m = new AndroidDecoderModule();
+ StartupPDM(m);
+ }
+#endif
+#ifdef XP_WIN
+ if (MediaPrefs::PDMWMFEnabled() && IsVistaOrLater() && !IsWin7AndPre2000Compatible()) {
+ // *Only* use WMF on Vista and later, as if Firefox is run in Windows 95
+ // compatibility mode on Windows 7 (it does happen!) we may crash trying
+ // to startup WMF. So we need to detect the OS version here, as in
+ // compatibility mode IsVistaOrLater() and friends behave as if we're on
+ // the emulated version of Windows. See bug 1279171.
+ // Additionally, we don't want to start the RemoteDecoderModule if we
+ // expect it's not going to work (i.e. on Windows older than Vista).
+ // IsWin7AndPre2000Compatible() uses GetVersionEx as the user specified OS version can
+ // be reflected when compatibility mode is in effect.
+ m = new WMFDecoderModule();
+ RefPtr<PlatformDecoderModule> remote = new dom::RemoteDecoderModule(m);
+ StartupPDM(remote);
+ mWMFFailedToLoad = !StartupPDM(m);
+ } else {
+ mWMFFailedToLoad = MediaPrefs::DecoderDoctorWMFDisabledIsFailure();
+ }
+#endif
+#ifdef MOZ_FFVPX
+ if (MediaPrefs::PDMFFVPXEnabled()) {
+ m = FFVPXRuntimeLinker::CreateDecoderModule();
+ StartupPDM(m);
+ }
+#endif
+#ifdef MOZ_FFMPEG
+ if (MediaPrefs::PDMFFmpegEnabled()) {
+ m = FFmpegRuntimeLinker::CreateDecoderModule();
+ mFFmpegFailedToLoad = !StartupPDM(m);
+ } else {
+ mFFmpegFailedToLoad = false;
+ }
+#endif
+#ifdef MOZ_APPLEMEDIA
+ m = new AppleDecoderModule();
+ StartupPDM(m);
+#endif
+#ifdef MOZ_GONK_MEDIACODEC
+ if (MediaPrefs::PDMGonkDecoderEnabled()) {
+ m = new GonkDecoderModule();
+ StartupPDM(m);
+ }
+#endif
+#ifdef MOZ_WIDGET_ANDROID
+ if(MediaPrefs::PDMAndroidMediaCodecEnabled()){
+ m = new AndroidDecoderModule();
+ StartupPDM(m);
+ }
+#endif
+
+ m = new AgnosticDecoderModule();
+ StartupPDM(m);
+
+ if (MediaPrefs::PDMGMPEnabled()) {
+ m = new GMPDecoderModule();
+ mGMPPDMFailedToStartup = !StartupPDM(m);
+ } else {
+ mGMPPDMFailedToStartup = false;
+ }
+}
+
+void
+PDMFactory::CreateBlankPDM()
+{
+ mBlankPDM = CreateBlankDecoderModule();
+ MOZ_ASSERT(mBlankPDM && NS_SUCCEEDED(mBlankPDM->Startup()));
+}
+
+bool
+PDMFactory::StartupPDM(PlatformDecoderModule* aPDM)
+{
+ if (aPDM && NS_SUCCEEDED(aPDM->Startup())) {
+ mCurrentPDMs.AppendElement(aPDM);
+ return true;
+ }
+ return false;
+}
+
+already_AddRefed<PlatformDecoderModule>
+PDMFactory::GetDecoder(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ if (aDiagnostics) {
+ // If libraries failed to load, the following loop over mCurrentPDMs
+ // will not even try to use them. So we record failures now.
+ if (mWMFFailedToLoad) {
+ aDiagnostics->SetWMFFailedToLoad();
+ }
+ if (mFFmpegFailedToLoad) {
+ aDiagnostics->SetFFmpegFailedToLoad();
+ }
+ if (mGMPPDMFailedToStartup) {
+ aDiagnostics->SetGMPPDMFailedToStartup();
+ }
+ }
+
+ RefPtr<PlatformDecoderModule> pdm;
+ for (auto& current : mCurrentPDMs) {
+ if (current->Supports(aTrackInfo, aDiagnostics)) {
+ pdm = current;
+ break;
+ }
+ }
+ return pdm.forget();
+}
+
+void
+PDMFactory::SetCDMProxy(CDMProxy* aProxy)
+{
+ RefPtr<PDMFactory> m = new PDMFactory();
+ mEMEPDM = new EMEDecoderModule(aProxy, m);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/PDMFactory.h b/dom/media/platforms/PDMFactory.h
new file mode 100644
index 000000000..94be7e928
--- /dev/null
+++ b/dom/media/platforms/PDMFactory.h
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(PDMFactory_h_)
+#define PDMFactory_h_
+
+#include "PlatformDecoderModule.h"
+#include "mozilla/Function.h"
+#include "mozilla/StaticMutex.h"
+
+class CDMProxy;
+
+namespace mozilla {
+
+class DecoderDoctorDiagnostics;
+class PDMFactoryImpl;
+template<class T> class StaticAutoPtr;
+
+class PDMFactory final {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PDMFactory)
+
+ PDMFactory();
+
+ // Factory method that creates the appropriate PlatformDecoderModule for
+ // the platform we're running on. Caller is responsible for deleting this
+ // instance. It's expected that there will be multiple
+ // PlatformDecoderModules alive at the same time.
+ // This is called on the decode task queue.
+ already_AddRefed<MediaDataDecoder>
+ CreateDecoder(const CreateDecoderParams& aParams);
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const;
+ bool Supports(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const;
+
+ // Creates a PlatformDecoderModule that uses a CDMProxy to decrypt or
+ // decrypt-and-decode EME encrypted content. If the CDM only decrypts and
+ // does not decode, we create a PDM and use that to create MediaDataDecoders
+ // that we use on on aTaskQueue to decode the decrypted stream.
+ // This is called on the decode task queue.
+ void SetCDMProxy(CDMProxy* aProxy);
+
+ static constexpr int kYUV400 = 0;
+ static constexpr int kYUV420 = 1;
+ static constexpr int kYUV422 = 2;
+ static constexpr int kYUV444 = 3;
+
+private:
+ virtual ~PDMFactory();
+ void CreatePDMs();
+ void CreateBlankPDM();
+ // Startup the provided PDM and add it to our list if successful.
+ bool StartupPDM(PlatformDecoderModule* aPDM);
+ // Returns the first PDM in our list supporting the mimetype.
+ already_AddRefed<PlatformDecoderModule>
+ GetDecoder(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const;
+
+ already_AddRefed<MediaDataDecoder>
+ CreateDecoderWithPDM(PlatformDecoderModule* aPDM,
+ const CreateDecoderParams& aParams);
+
+ nsTArray<RefPtr<PlatformDecoderModule>> mCurrentPDMs;
+ RefPtr<PlatformDecoderModule> mEMEPDM;
+ RefPtr<PlatformDecoderModule> mBlankPDM;
+
+ bool mWMFFailedToLoad = false;
+ bool mFFmpegFailedToLoad = false;
+ bool mGMPPDMFailedToStartup = false;
+
+ void EnsureInit() const;
+ template<class T> friend class StaticAutoPtr;
+ static StaticAutoPtr<PDMFactoryImpl> sInstance;
+ static StaticMutex sMonitor;
+};
+
+} // namespace mozilla
+
+#endif /* PDMFactory_h_ */
diff --git a/dom/media/platforms/PlatformDecoderModule.h b/dom/media/platforms/PlatformDecoderModule.h
new file mode 100644
index 000000000..7480d8ff9
--- /dev/null
+++ b/dom/media/platforms/PlatformDecoderModule.h
@@ -0,0 +1,309 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(PlatformDecoderModule_h_)
+#define PlatformDecoderModule_h_
+
+#include "MediaDecoderReader.h"
+#include "MediaInfo.h"
+#include "mozilla/MozPromise.h"
+#include "mozilla/layers/LayersTypes.h"
+#include "mozilla/layers/KnowsCompositor.h"
+#include "nsTArray.h"
+#include "mozilla/RefPtr.h"
+#include "GMPService.h"
+#include <queue>
+#include "MediaResult.h"
+
+namespace mozilla {
+class TrackInfo;
+class AudioInfo;
+class VideoInfo;
+class MediaRawData;
+class DecoderDoctorDiagnostics;
+
+namespace layers {
+class ImageContainer;
+} // namespace layers
+
+namespace dom {
+class RemoteDecoderModule;
+}
+
+class MediaDataDecoder;
+class MediaDataDecoderCallback;
+class TaskQueue;
+class CDMProxy;
+
+static LazyLogModule sPDMLog("PlatformDecoderModule");
+
+struct MOZ_STACK_CLASS CreateDecoderParams final {
+ explicit CreateDecoderParams(const TrackInfo& aConfig)
+ : mConfig(aConfig)
+ {}
+
+ template <typename T1, typename... Ts>
+ CreateDecoderParams(const TrackInfo& aConfig, T1&& a1, Ts&&... args)
+ : mConfig(aConfig)
+ {
+ Set(mozilla::Forward<T1>(a1), mozilla::Forward<Ts>(args)...);
+ }
+
+ const VideoInfo& VideoConfig() const
+ {
+ MOZ_ASSERT(mConfig.IsVideo());
+ return *mConfig.GetAsVideoInfo();
+ }
+
+ const AudioInfo& AudioConfig() const
+ {
+ MOZ_ASSERT(mConfig.IsAudio());
+ return *mConfig.GetAsAudioInfo();
+ }
+
+ layers::LayersBackend GetLayersBackend() const
+ {
+ if (mKnowsCompositor) {
+ return mKnowsCompositor->GetCompositorBackendType();
+ }
+ return layers::LayersBackend::LAYERS_NONE;
+ }
+
+ const TrackInfo& mConfig;
+ TaskQueue* mTaskQueue = nullptr;
+ MediaDataDecoderCallback* mCallback = nullptr;
+ DecoderDoctorDiagnostics* mDiagnostics = nullptr;
+ layers::ImageContainer* mImageContainer = nullptr;
+ MediaResult* mError = nullptr;
+ RefPtr<layers::KnowsCompositor> mKnowsCompositor;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+ bool mUseBlankDecoder = false;
+
+private:
+ void Set(TaskQueue* aTaskQueue) { mTaskQueue = aTaskQueue; }
+ void Set(MediaDataDecoderCallback* aCallback) { mCallback = aCallback; }
+ void Set(DecoderDoctorDiagnostics* aDiagnostics) { mDiagnostics = aDiagnostics; }
+ void Set(layers::ImageContainer* aImageContainer) { mImageContainer = aImageContainer; }
+ void Set(MediaResult* aError) { mError = aError; }
+ void Set(GMPCrashHelper* aCrashHelper) { mCrashHelper = aCrashHelper; }
+ void Set(bool aUseBlankDecoder) { mUseBlankDecoder = aUseBlankDecoder; }
+ void Set(layers::KnowsCompositor* aKnowsCompositor) { mKnowsCompositor = aKnowsCompositor; }
+ template <typename T1, typename T2, typename... Ts>
+ void Set(T1&& a1, T2&& a2, Ts&&... args)
+ {
+ Set(mozilla::Forward<T1>(a1));
+ Set(mozilla::Forward<T2>(a2), mozilla::Forward<Ts>(args)...);
+ }
+};
+
+// The PlatformDecoderModule interface is used by the MediaFormatReader to
+// abstract access to decoders provided by various
+// platforms.
+// Each platform (Windows, MacOSX, Linux, B2G etc) must implement a
+// PlatformDecoderModule to provide access to its decoders in order to get
+// decompressed H.264/AAC from the MediaFormatReader.
+//
+// Decoding is asynchronous, and should be performed on the task queue
+// provided if the underlying platform isn't already exposing an async API.
+//
+// A cross-platform decoder module that discards input and produces "blank"
+// output samples exists for testing, and is created when the pref
+// "media.use-blank-decoder" is true.
+
+class PlatformDecoderModule {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PlatformDecoderModule)
+
+ // Perform any per-instance initialization.
+ // This is called on the decode task queue.
+ virtual nsresult Startup() { return NS_OK; };
+
+ // Indicates if the PlatformDecoderModule supports decoding of aMimeType.
+ virtual bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const = 0;
+ virtual bool Supports(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+ {
+ // By default, fall back to SupportsMimeType with just the MIME string.
+ // (So PDMs do not need to override this method -- yet.)
+ return SupportsMimeType(aTrackInfo.mMimeType, aDiagnostics);
+ }
+
+ enum class ConversionRequired : uint8_t {
+ kNeedNone,
+ kNeedAVCC,
+ kNeedAnnexB,
+ };
+
+ // Indicates that the decoder requires a specific format.
+ // The PlatformDecoderModule will convert the demuxed data accordingly before
+ // feeding it to MediaDataDecoder::Input.
+ virtual ConversionRequired DecoderNeedsConversion(const TrackInfo& aConfig) const = 0;
+
+protected:
+ PlatformDecoderModule() {}
+ virtual ~PlatformDecoderModule() {}
+
+ friend class H264Converter;
+ friend class PDMFactory;
+ friend class dom::RemoteDecoderModule;
+
+ // Creates a Video decoder. The layers backend is passed in so that
+ // decoders can determine whether hardware accelerated decoding can be used.
+ // Asynchronous decoding of video should be done in runnables dispatched
+ // to aVideoTaskQueue. If the task queue isn't needed, the decoder should
+ // not hold a reference to it.
+ // Output and errors should be returned to the reader via aCallback.
+ // On Windows the task queue's threads in have MSCOM initialized with
+ // COINIT_MULTITHREADED.
+ // Returns nullptr if the decoder can't be created.
+ // It is safe to store a reference to aConfig.
+ // This is called on the decode task queue.
+ virtual already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) = 0;
+
+ // Creates an Audio decoder with the specified properties.
+ // Asynchronous decoding of audio should be done in runnables dispatched to
+ // aAudioTaskQueue. If the task queue isn't needed, the decoder should
+ // not hold a reference to it.
+ // Output and errors should be returned to the reader via aCallback.
+ // Returns nullptr if the decoder can't be created.
+ // On Windows the task queue's threads in have MSCOM initialized with
+ // COINIT_MULTITHREADED.
+ // It is safe to store a reference to aConfig.
+ // This is called on the decode task queue.
+ virtual already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) = 0;
+};
+
+// A callback used by MediaDataDecoder to return output/errors to the
+// MediaFormatReader.
+// Implementation is threadsafe, and can be called on any thread.
+class MediaDataDecoderCallback {
+public:
+ virtual ~MediaDataDecoderCallback() {}
+
+ // Called by MediaDataDecoder when a sample has been decoded.
+ virtual void Output(MediaData* aData) = 0;
+
+ // Denotes an error in the decoding process. The reader will stop calling
+ // the decoder.
+ virtual void Error(const MediaResult& aError) = 0;
+
+ // Denotes that the last input sample has been inserted into the decoder,
+ // and no more output can be produced unless more input is sent.
+ // A frame decoding session is completed once InputExhausted has been called.
+ // MediaDataDecoder::Input will not be called again until InputExhausted has
+ // been called.
+ virtual void InputExhausted() = 0;
+
+ virtual void DrainComplete() = 0;
+
+ virtual void ReleaseMediaResources() {}
+
+ virtual bool OnReaderTaskQueue() = 0;
+
+ // Denotes that a pending encryption key is preventing more input being fed
+ // into the decoder. This only needs to be overridden for callbacks that
+ // handle encryption. E.g. benchmarking does not use eme, so this need
+ // not be overridden in that case.
+ virtual void WaitingForKey() {}
+};
+
+// MediaDataDecoder is the interface exposed by decoders created by the
+// PlatformDecoderModule's Create*Decoder() functions. The type of
+// media data that the decoder accepts as valid input and produces as
+// output is determined when the MediaDataDecoder is created.
+//
+// Unless otherwise noted, all functions are only called on the decode task
+// queue. An exception is the MediaDataDecoder in
+// MediaFormatReader::IsVideoAccelerated() for which all calls (Init(),
+// IsHardwareAccelerated(), and Shutdown()) are from the main thread.
+//
+// Don't block inside these functions, unless it's explicitly noted that you
+// should (like in Flush()).
+//
+// Decoding is done asynchronously. Any async work can be done on the
+// TaskQueue passed into the PlatformDecoderModules's Create*Decoder()
+// function. This may not be necessary for platforms with async APIs
+// for decoding.
+//
+// If an error occurs at any point after the Init promise has been
+// completed, then Error() must be called on the associated
+// MediaDataDecoderCallback.
+class MediaDataDecoder {
+protected:
+ virtual ~MediaDataDecoder() {};
+
+public:
+ typedef TrackInfo::TrackType TrackType;
+ typedef MozPromise<TrackType, MediaResult, /* IsExclusive = */ true> InitPromise;
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDataDecoder)
+
+ // Initialize the decoder. The decoder should be ready to decode once
+ // promise resolves. The decoder should do any initialization here, rather
+ // than in its constructor or PlatformDecoderModule::Create*Decoder(),
+ // so that if the MediaFormatReader needs to shutdown during initialization,
+ // it can call Shutdown() to cancel this operation. Any initialization
+ // that requires blocking the calling thread in this function *must*
+ // be done here so that it can be canceled by calling Shutdown()!
+ virtual RefPtr<InitPromise> Init() = 0;
+
+ // Inserts a sample into the decoder's decode pipeline.
+ virtual void Input(MediaRawData* aSample) = 0;
+
+ // Causes all samples in the decoding pipeline to be discarded. When
+ // this function returns, the decoder must be ready to accept new input
+ // for decoding. This function is called when the demuxer seeks, before
+ // decoding resumes after the seek.
+ // While the reader calls Flush(), it ignores all output sent to it;
+ // it is safe (but pointless) to send output while Flush is called.
+ // The MediaFormatReader will not call Input() while it's calling Flush().
+ virtual void Flush() = 0;
+
+ // Causes all complete samples in the pipeline that can be decoded to be
+ // output. If the decoder can't produce samples from the current output,
+ // it drops the input samples. The decoder may be holding onto samples
+ // that are required to decode samples that it expects to get in future.
+ // This is called when the demuxer reaches end of stream.
+ // The MediaFormatReader will not call Input() while it's calling Drain().
+ // This function is asynchronous. The MediaDataDecoder must call
+ // MediaDataDecoderCallback::DrainComplete() once all remaining
+ // samples have been output.
+ virtual void Drain() = 0;
+
+ // Cancels all init/input/drain operations, and shuts down the
+ // decoder. The platform decoder should clean up any resources it's using
+ // and release memory etc. Shutdown() must block until the decoder has
+ // completed shutdown. The reader calls Flush() before calling Shutdown().
+ // The reader will delete the decoder once Shutdown() returns.
+ // The MediaDataDecoderCallback *must* not be called after Shutdown() has
+ // returned.
+ virtual void Shutdown() = 0;
+
+ // Called from the state machine task queue or main thread.
+ // Decoder needs to decide whether or not hardware accelearation is supported
+ // after creating. It doesn't need to call Init() before calling this function.
+ virtual bool IsHardwareAccelerated(nsACString& aFailureReason) const { return false; }
+
+ // Return the name of the MediaDataDecoder, only used for decoding.
+ // Only return a static const string, as the information may be accessed
+ // in a non thread-safe fashion.
+ virtual const char* GetDescriptionName() const = 0;
+
+ // Set a hint of seek target time to decoder. Decoder will drop any decoded
+ // data which pts is smaller than this value. This threshold needs to be clear
+ // after reset decoder.
+ // Decoder may not honor this value. However, it'd be better that
+ // video decoder implements this API to improve seek performance.
+ // Note: it should be called before Input() or after Flush().
+ virtual void SetSeekThreshold(const media::TimeUnit& aTime) {}
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/ReorderQueue.h b/dom/media/platforms/ReorderQueue.h
new file mode 100644
index 000000000..f4a002220
--- /dev/null
+++ b/dom/media/platforms/ReorderQueue.h
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Queue for ordering decoded video frames by presentation time.
+// Decoders often return frames out of order, which we need to
+// buffer so we can forward them in correct presentation order.
+
+#ifndef mozilla_ReorderQueue_h
+#define mozilla_ReorderQueue_h
+
+#include <MediaData.h>
+#include <nsTPriorityQueue.h>
+
+namespace mozilla {
+
+struct ReorderQueueComparator
+{
+ bool LessThan(MediaData* const& a, MediaData* const& b) const
+ {
+ return a->mTime < b->mTime;
+ }
+};
+
+typedef nsTPriorityQueue<RefPtr<MediaData>, ReorderQueueComparator> ReorderQueue;
+
+} // namespace mozilla
+
+#endif // mozilla_ReorderQueue_h
diff --git a/dom/media/platforms/agnostic/AgnosticDecoderModule.cpp b/dom/media/platforms/agnostic/AgnosticDecoderModule.cpp
new file mode 100644
index 000000000..7bd75b7fe
--- /dev/null
+++ b/dom/media/platforms/agnostic/AgnosticDecoderModule.cpp
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AgnosticDecoderModule.h"
+#include "mozilla/Logging.h"
+#include "OpusDecoder.h"
+#include "VorbisDecoder.h"
+#include "VPXDecoder.h"
+#include "WAVDecoder.h"
+#include "TheoraDecoder.h"
+
+namespace mozilla {
+
+bool
+AgnosticDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ bool supports =
+ VPXDecoder::IsVPX(aMimeType) ||
+ OpusDataDecoder::IsOpus(aMimeType) ||
+ VorbisDataDecoder::IsVorbis(aMimeType) ||
+ WaveDataDecoder::IsWave(aMimeType) ||
+ TheoraDecoder::IsTheora(aMimeType);
+ MOZ_LOG(sPDMLog, LogLevel::Debug, ("Agnostic decoder %s requested type",
+ supports ? "supports" : "rejects"));
+ return supports;
+}
+
+already_AddRefed<MediaDataDecoder>
+AgnosticDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<MediaDataDecoder> m;
+
+ if (VPXDecoder::IsVPX(aParams.mConfig.mMimeType)) {
+ m = new VPXDecoder(aParams);
+ } else if (TheoraDecoder::IsTheora(aParams.mConfig.mMimeType)) {
+ m = new TheoraDecoder(aParams);
+ }
+
+ return m.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+AgnosticDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<MediaDataDecoder> m;
+
+ const TrackInfo& config = aParams.mConfig;
+ if (VorbisDataDecoder::IsVorbis(config.mMimeType)) {
+ m = new VorbisDataDecoder(aParams);
+ } else if (OpusDataDecoder::IsOpus(config.mMimeType)) {
+ m = new OpusDataDecoder(aParams);
+ } else if (WaveDataDecoder::IsWave(config.mMimeType)) {
+ m = new WaveDataDecoder(aParams);
+ }
+
+ return m.forget();
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/AgnosticDecoderModule.h b/dom/media/platforms/agnostic/AgnosticDecoderModule.h
new file mode 100644
index 000000000..d944b84ab
--- /dev/null
+++ b/dom/media/platforms/agnostic/AgnosticDecoderModule.h
@@ -0,0 +1,34 @@
+#if !defined(AgnosticDecoderModule_h_)
+#define AgnosticDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class AgnosticDecoderModule : public PlatformDecoderModule {
+public:
+ AgnosticDecoderModule() = default;
+ virtual ~AgnosticDecoderModule() = default;
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override
+ {
+ return ConversionRequired::kNeedNone;
+ }
+
+protected:
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+};
+
+} // namespace mozilla
+
+#endif /* AgnosticDecoderModule_h_ */
diff --git a/dom/media/platforms/agnostic/BlankDecoderModule.cpp b/dom/media/platforms/agnostic/BlankDecoderModule.cpp
new file mode 100644
index 000000000..7d7bae721
--- /dev/null
+++ b/dom/media/platforms/agnostic/BlankDecoderModule.cpp
@@ -0,0 +1,278 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ImageContainer.h"
+#include "MediaDecoderReader.h"
+#include "MediaInfo.h"
+#include "mozilla/CheckedInt.h"
+#include "mozilla/mozalloc.h" // for operator new, and new (fallible)
+#include "mozilla/RefPtr.h"
+#include "mozilla/TaskQueue.h"
+#include "mp4_demuxer/AnnexB.h"
+#include "mp4_demuxer/H264.h"
+#include "MP4Decoder.h"
+#include "nsAutoPtr.h"
+#include "nsRect.h"
+#include "PlatformDecoderModule.h"
+#include "ReorderQueue.h"
+#include "TimeUnits.h"
+#include "VideoUtils.h"
+
+namespace mozilla {
+
+// Decoder that uses a passed in object's Create function to create blank
+// MediaData objects.
+template<class BlankMediaDataCreator>
+class BlankMediaDataDecoder : public MediaDataDecoder {
+public:
+
+ BlankMediaDataDecoder(BlankMediaDataCreator* aCreator,
+ const CreateDecoderParams& aParams)
+ : mCreator(aCreator)
+ , mCallback(aParams.mCallback)
+ , mMaxRefFrames(aParams.mConfig.GetType() == TrackInfo::kVideoTrack &&
+ MP4Decoder::IsH264(aParams.mConfig.mMimeType)
+ ? mp4_demuxer::AnnexB::HasSPS(aParams.VideoConfig().mExtraData)
+ ? mp4_demuxer::H264::ComputeMaxRefFrames(aParams.VideoConfig().mExtraData)
+ : 16
+ : 0)
+ , mType(aParams.mConfig.GetType())
+ {
+ }
+
+ RefPtr<InitPromise> Init() override {
+ return InitPromise::CreateAndResolve(mType, __func__);
+ }
+
+ void Shutdown() override {}
+
+ void Input(MediaRawData* aSample) override
+ {
+ RefPtr<MediaData> data =
+ mCreator->Create(media::TimeUnit::FromMicroseconds(aSample->mTime),
+ media::TimeUnit::FromMicroseconds(aSample->mDuration),
+ aSample->mOffset);
+
+ OutputFrame(data);
+ }
+
+ void Flush() override
+ {
+ mReorderQueue.Clear();
+ }
+
+ void Drain() override
+ {
+ while (!mReorderQueue.IsEmpty()) {
+ mCallback->Output(mReorderQueue.Pop().get());
+ }
+
+ mCallback->DrainComplete();
+ }
+
+ const char* GetDescriptionName() const override
+ {
+ return "blank media data decoder";
+ }
+
+private:
+ void OutputFrame(MediaData* aData)
+ {
+ if (!aData) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__));
+ return;
+ }
+
+ // Frames come out in DTS order but we need to output them in PTS order.
+ mReorderQueue.Push(aData);
+
+ while (mReorderQueue.Length() > mMaxRefFrames) {
+ mCallback->Output(mReorderQueue.Pop().get());
+ }
+ mCallback->InputExhausted();
+ }
+
+private:
+ nsAutoPtr<BlankMediaDataCreator> mCreator;
+ MediaDataDecoderCallback* mCallback;
+ const uint32_t mMaxRefFrames;
+ ReorderQueue mReorderQueue;
+ TrackInfo::TrackType mType;
+};
+
+class BlankVideoDataCreator {
+public:
+ BlankVideoDataCreator(uint32_t aFrameWidth,
+ uint32_t aFrameHeight,
+ layers::ImageContainer* aImageContainer)
+ : mFrameWidth(aFrameWidth)
+ , mFrameHeight(aFrameHeight)
+ , mImageContainer(aImageContainer)
+ {
+ mInfo.mDisplay = nsIntSize(mFrameWidth, mFrameHeight);
+ mPicture = gfx::IntRect(0, 0, mFrameWidth, mFrameHeight);
+ }
+
+ already_AddRefed<MediaData>
+ Create(const media::TimeUnit& aDTS, const media::TimeUnit& aDuration, int64_t aOffsetInStream)
+ {
+ // Create a fake YUV buffer in a 420 format. That is, an 8bpp Y plane,
+ // with a U and V plane that are half the size of the Y plane, i.e 8 bit,
+ // 2x2 subsampled.
+ const int sizeY = mFrameWidth * mFrameHeight;
+ const int sizeCbCr = ((mFrameWidth + 1) / 2) * ((mFrameHeight + 1) / 2);
+ auto frame = MakeUnique<uint8_t[]>(sizeY + sizeCbCr);
+ VideoData::YCbCrBuffer buffer;
+
+ // Y plane.
+ buffer.mPlanes[0].mData = frame.get();
+ buffer.mPlanes[0].mStride = mFrameWidth;
+ buffer.mPlanes[0].mHeight = mFrameHeight;
+ buffer.mPlanes[0].mWidth = mFrameWidth;
+ buffer.mPlanes[0].mOffset = 0;
+ buffer.mPlanes[0].mSkip = 0;
+
+ // Cb plane.
+ buffer.mPlanes[1].mData = frame.get() + sizeY;
+ buffer.mPlanes[1].mStride = mFrameWidth / 2;
+ buffer.mPlanes[1].mHeight = mFrameHeight / 2;
+ buffer.mPlanes[1].mWidth = mFrameWidth / 2;
+ buffer.mPlanes[1].mOffset = 0;
+ buffer.mPlanes[1].mSkip = 0;
+
+ // Cr plane.
+ buffer.mPlanes[2].mData = frame.get() + sizeY;
+ buffer.mPlanes[2].mStride = mFrameWidth / 2;
+ buffer.mPlanes[2].mHeight = mFrameHeight / 2;
+ buffer.mPlanes[2].mWidth = mFrameWidth / 2;
+ buffer.mPlanes[2].mOffset = 0;
+ buffer.mPlanes[2].mSkip = 0;
+
+ // Set to color white.
+ memset(buffer.mPlanes[0].mData, 255, sizeY);
+ memset(buffer.mPlanes[1].mData, 128, sizeCbCr);
+
+ return VideoData::CreateAndCopyData(mInfo,
+ mImageContainer,
+ aOffsetInStream,
+ aDTS.ToMicroseconds(),
+ aDuration.ToMicroseconds(),
+ buffer,
+ true,
+ aDTS.ToMicroseconds(),
+ mPicture);
+ }
+
+private:
+ VideoInfo mInfo;
+ gfx::IntRect mPicture;
+ uint32_t mFrameWidth;
+ uint32_t mFrameHeight;
+ RefPtr<layers::ImageContainer> mImageContainer;
+};
+
+class BlankAudioDataCreator {
+public:
+ BlankAudioDataCreator(uint32_t aChannelCount, uint32_t aSampleRate)
+ : mFrameSum(0), mChannelCount(aChannelCount), mSampleRate(aSampleRate)
+ {
+ }
+
+ MediaData* Create(const media::TimeUnit& aDTS,
+ const media::TimeUnit& aDuration,
+ int64_t aOffsetInStream)
+ {
+ // Convert duration to frames. We add 1 to duration to account for
+ // rounding errors, so we get a consistent tone.
+ CheckedInt64 frames =
+ UsecsToFrames(aDuration.ToMicroseconds()+1, mSampleRate);
+ if (!frames.isValid() ||
+ !mChannelCount ||
+ !mSampleRate ||
+ frames.value() > (UINT32_MAX / mChannelCount)) {
+ return nullptr;
+ }
+ AlignedAudioBuffer samples(frames.value() * mChannelCount);
+ if (!samples) {
+ return nullptr;
+ }
+ // Fill the sound buffer with an A4 tone.
+ static const float pi = 3.14159265f;
+ static const float noteHz = 440.0f;
+ for (int i = 0; i < frames.value(); i++) {
+ float f = sin(2 * pi * noteHz * mFrameSum / mSampleRate);
+ for (unsigned c = 0; c < mChannelCount; c++) {
+ samples[i * mChannelCount + c] = AudioDataValue(f);
+ }
+ mFrameSum++;
+ }
+ return new AudioData(aOffsetInStream,
+ aDTS.ToMicroseconds(),
+ aDuration.ToMicroseconds(),
+ uint32_t(frames.value()),
+ Move(samples),
+ mChannelCount,
+ mSampleRate);
+ }
+
+private:
+ int64_t mFrameSum;
+ uint32_t mChannelCount;
+ uint32_t mSampleRate;
+};
+
+class BlankDecoderModule : public PlatformDecoderModule {
+public:
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override {
+ const VideoInfo& config = aParams.VideoConfig();
+ BlankVideoDataCreator* creator = new BlankVideoDataCreator(
+ config.mDisplay.width, config.mDisplay.height, aParams.mImageContainer);
+ RefPtr<MediaDataDecoder> decoder =
+ new BlankMediaDataDecoder<BlankVideoDataCreator>(creator, aParams);
+ return decoder.forget();
+ }
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override {
+ const AudioInfo& config = aParams.AudioConfig();
+ BlankAudioDataCreator* creator = new BlankAudioDataCreator(
+ config.mChannels, config.mRate);
+
+ RefPtr<MediaDataDecoder> decoder =
+ new BlankMediaDataDecoder<BlankAudioDataCreator>(creator, aParams);
+ return decoder.forget();
+ }
+
+ bool
+ SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override
+ {
+ return true;
+ }
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override
+ {
+ if (aConfig.IsVideo() && MP4Decoder::IsH264(aConfig.mMimeType)) {
+ return ConversionRequired::kNeedAVCC;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+ }
+
+};
+
+already_AddRefed<PlatformDecoderModule> CreateBlankDecoderModule()
+{
+ RefPtr<PlatformDecoderModule> pdm = new BlankDecoderModule();
+ return pdm.forget();
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/OpusDecoder.cpp b/dom/media/platforms/agnostic/OpusDecoder.cpp
new file mode 100644
index 000000000..9163ed058
--- /dev/null
+++ b/dom/media/platforms/agnostic/OpusDecoder.cpp
@@ -0,0 +1,356 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OpusDecoder.h"
+#include "OpusParser.h"
+#include "TimeUnits.h"
+#include "VorbisUtils.h"
+#include "VorbisDecoder.h" // For VorbisLayout
+#include "mozilla/EndianUtils.h"
+#include "mozilla/PodOperations.h"
+#include "mozilla/SyncRunnable.h"
+
+#include <inttypes.h> // For PRId64
+
+#include "opus/opus.h"
+extern "C" {
+#include "opus/opus_multistream.h"
+}
+
+#define OPUS_DEBUG(arg, ...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, \
+ ("OpusDataDecoder(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+OpusDataDecoder::OpusDataDecoder(const CreateDecoderParams& aParams)
+ : mInfo(aParams.AudioConfig())
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(aParams.mCallback)
+ , mOpusDecoder(nullptr)
+ , mSkip(0)
+ , mDecodedHeader(false)
+ , mPaddingDiscarded(false)
+ , mFrames(0)
+ , mIsFlushing(false)
+{
+}
+
+OpusDataDecoder::~OpusDataDecoder()
+{
+ if (mOpusDecoder) {
+ opus_multistream_decoder_destroy(mOpusDecoder);
+ mOpusDecoder = nullptr;
+ }
+}
+
+void
+OpusDataDecoder::Shutdown()
+{
+}
+
+void
+OpusDataDecoder::AppendCodecDelay(MediaByteBuffer* config, uint64_t codecDelayUS)
+{
+ uint8_t buffer[sizeof(uint64_t)];
+ BigEndian::writeUint64(buffer, codecDelayUS);
+ config->AppendElements(buffer, sizeof(uint64_t));
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+OpusDataDecoder::Init()
+{
+ size_t length = mInfo.mCodecSpecificConfig->Length();
+ uint8_t *p = mInfo.mCodecSpecificConfig->Elements();
+ if (length < sizeof(uint64_t)) {
+ OPUS_DEBUG("CodecSpecificConfig too short to read codecDelay!");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+ int64_t codecDelay = BigEndian::readUint64(p);
+ length -= sizeof(uint64_t);
+ p += sizeof(uint64_t);
+ if (NS_FAILED(DecodeHeader(p, length))) {
+ OPUS_DEBUG("Error decoding header!");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ int r;
+ mOpusDecoder = opus_multistream_decoder_create(mOpusParser->mRate,
+ mOpusParser->mChannels,
+ mOpusParser->mStreams,
+ mOpusParser->mCoupledStreams,
+ mMappingTable,
+ &r);
+ mSkip = mOpusParser->mPreSkip;
+ mPaddingDiscarded = false;
+
+ if (codecDelay != FramesToUsecs(mOpusParser->mPreSkip,
+ mOpusParser->mRate).value()) {
+ NS_WARNING("Invalid Opus header: CodecDelay and pre-skip do not match!");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (mInfo.mRate != (uint32_t)mOpusParser->mRate) {
+ NS_WARNING("Invalid Opus header: container and codec rate do not match!");
+ }
+ if (mInfo.mChannels != (uint32_t)mOpusParser->mChannels) {
+ NS_WARNING("Invalid Opus header: container and codec channels do not match!");
+ }
+
+ return r == OPUS_OK ? InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__)
+ : InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+}
+
+nsresult
+OpusDataDecoder::DecodeHeader(const unsigned char* aData, size_t aLength)
+{
+ MOZ_ASSERT(!mOpusParser);
+ MOZ_ASSERT(!mOpusDecoder);
+ MOZ_ASSERT(!mDecodedHeader);
+ mDecodedHeader = true;
+
+ mOpusParser = new OpusParser;
+ if (!mOpusParser->DecodeHeader(const_cast<unsigned char*>(aData), aLength)) {
+ return NS_ERROR_FAILURE;
+ }
+ int channels = mOpusParser->mChannels;
+
+ AudioConfig::ChannelLayout layout(channels);
+ if (!layout.IsValid()) {
+ OPUS_DEBUG("Invalid channel mapping. Source is %d channels", channels);
+ return NS_ERROR_FAILURE;
+ }
+
+ AudioConfig::ChannelLayout vorbisLayout(
+ channels, VorbisDataDecoder::VorbisLayout(channels));
+ AudioConfig::ChannelLayout smpteLayout(channels);
+ static_assert(sizeof(mOpusParser->mMappingTable) / sizeof(mOpusParser->mMappingTable[0]) >= MAX_AUDIO_CHANNELS,
+ "Invalid size set");
+ uint8_t map[sizeof(mOpusParser->mMappingTable) / sizeof(mOpusParser->mMappingTable[0])];
+ if (vorbisLayout.MappingTable(smpteLayout, map)) {
+ for (int i = 0; i < channels; i++) {
+ mMappingTable[i] = mOpusParser->mMappingTable[map[i]];
+ }
+ } else {
+ // Should never get here as vorbis layout is always convertible to SMPTE
+ // default layout.
+ PodCopy(mMappingTable, mOpusParser->mMappingTable, MAX_AUDIO_CHANNELS);
+ }
+
+ return NS_OK;
+}
+
+void
+OpusDataDecoder::Input(MediaRawData* aSample)
+{
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &OpusDataDecoder::ProcessDecode, aSample));
+}
+
+void
+OpusDataDecoder::ProcessDecode(MediaRawData* aSample)
+{
+ if (mIsFlushing) {
+ return;
+ }
+
+ MediaResult rv = DoDecode(aSample);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(rv);
+ return;
+ }
+ mCallback->InputExhausted();
+}
+
+MediaResult
+OpusDataDecoder::DoDecode(MediaRawData* aSample)
+{
+ uint32_t channels = mOpusParser->mChannels;
+
+ if (mPaddingDiscarded) {
+ // Discard padding should be used only on the final packet, so
+ // decoding after a padding discard is invalid.
+ OPUS_DEBUG("Opus error, discard padding on interstitial packet");
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Discard padding on interstitial packet"));
+ }
+
+ if (!mLastFrameTime || mLastFrameTime.ref() != aSample->mTime) {
+ // We are starting a new block.
+ mFrames = 0;
+ mLastFrameTime = Some(aSample->mTime);
+ }
+
+ // Maximum value is 63*2880, so there's no chance of overflow.
+ int frames_number =
+ opus_packet_get_nb_frames(aSample->Data(), aSample->Size());
+ if (frames_number <= 0) {
+ OPUS_DEBUG("Invalid packet header: r=%d length=%u",
+ frames_number, uint32_t(aSample->Size()));
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Invalid packet header: r=%d length=%u",
+ frames_number, uint32_t(aSample->Size())));
+ }
+
+ int samples = opus_packet_get_samples_per_frame(
+ aSample->Data(), opus_int32(mOpusParser->mRate));
+
+
+ // A valid Opus packet must be between 2.5 and 120 ms long (48kHz).
+ CheckedInt32 totalFrames =
+ CheckedInt32(frames_number) * CheckedInt32(samples);
+ if (!totalFrames.isValid()) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Frames count overflow"));
+ }
+
+ int frames = totalFrames.value();
+ if (frames < 120 || frames > 5760) {
+ OPUS_DEBUG("Invalid packet frames: %d", frames);
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Invalid packet frames:%d", frames));
+ }
+
+ AlignedAudioBuffer buffer(frames * channels);
+ if (!buffer) {
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+
+ // Decode to the appropriate sample type.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ int ret = opus_multistream_decode_float(mOpusDecoder,
+ aSample->Data(), aSample->Size(),
+ buffer.get(), frames, false);
+#else
+ int ret = opus_multistream_decode(mOpusDecoder,
+ aSample->Data(), aSample->Size(),
+ buffer.get(), frames, false);
+#endif
+ if (ret < 0) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Opus decoding error:%d", ret));
+ }
+ NS_ASSERTION(ret == frames, "Opus decoded too few audio samples");
+ CheckedInt64 startTime = aSample->mTime;
+
+ // Trim the initial frames while the decoder is settling.
+ if (mSkip > 0) {
+ int32_t skipFrames = std::min<int32_t>(mSkip, frames);
+ int32_t keepFrames = frames - skipFrames;
+ OPUS_DEBUG(
+ "Opus decoder skipping %d of %d frames", skipFrames, frames);
+ PodMove(buffer.get(),
+ buffer.get() + skipFrames * channels,
+ keepFrames * channels);
+ startTime = startTime + FramesToUsecs(skipFrames, mOpusParser->mRate);
+ frames = keepFrames;
+ mSkip -= skipFrames;
+ }
+
+ if (aSample->mDiscardPadding > 0) {
+ OPUS_DEBUG("Opus decoder discarding %u of %d frames",
+ aSample->mDiscardPadding, frames);
+ // Padding discard is only supposed to happen on the final packet.
+ // Record the discard so we can return an error if another packet is
+ // decoded.
+ if (aSample->mDiscardPadding > uint32_t(frames)) {
+ // Discarding more than the entire packet is invalid.
+ OPUS_DEBUG("Opus error, discard padding larger than packet");
+ return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Discard padding larger than packet"));
+ }
+
+ mPaddingDiscarded = true;
+ frames = frames - aSample->mDiscardPadding;
+ }
+
+ // Apply the header gain if one was specified.
+#ifdef MOZ_SAMPLE_TYPE_FLOAT32
+ if (mOpusParser->mGain != 1.0f) {
+ float gain = mOpusParser->mGain;
+ uint32_t samples = frames * channels;
+ for (uint32_t i = 0; i < samples; i++) {
+ buffer[i] *= gain;
+ }
+ }
+#else
+ if (mOpusParser->mGain_Q16 != 65536) {
+ int64_t gain_Q16 = mOpusParser->mGain_Q16;
+ uint32_t samples = frames * channels;
+ for (uint32_t i = 0; i < samples; i++) {
+ int32_t val = static_cast<int32_t>((gain_Q16*buffer[i] + 32768)>>16);
+ buffer[i] = static_cast<AudioDataValue>(MOZ_CLIP_TO_15(val));
+ }
+ }
+#endif
+
+ CheckedInt64 duration = FramesToUsecs(frames, mOpusParser->mRate);
+ if (!duration.isValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Overflow converting WebM audio duration"));
+ }
+ CheckedInt64 time =
+ startTime - FramesToUsecs(mOpusParser->mPreSkip, mOpusParser->mRate) +
+ FramesToUsecs(mFrames, mOpusParser->mRate);
+ if (!time.isValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Overflow shifting tstamp by codec delay"));
+ };
+
+ mCallback->Output(new AudioData(aSample->mOffset,
+ time.value(),
+ duration.value(),
+ frames,
+ Move(buffer),
+ mOpusParser->mChannels,
+ mOpusParser->mRate));
+ mFrames += frames;
+ return NS_OK;
+}
+
+void
+OpusDataDecoder::ProcessDrain()
+{
+ mCallback->DrainComplete();
+}
+
+void
+OpusDataDecoder::Drain()
+{
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &OpusDataDecoder::ProcessDrain));
+}
+
+void
+OpusDataDecoder::Flush()
+{
+ if (!mOpusDecoder) {
+ return;
+ }
+ mIsFlushing = true;
+ RefPtr<OpusDataDecoder> self = this;
+ nsCOMPtr<nsIRunnable> runnable = NS_NewRunnableFunction([self] () {
+ MOZ_ASSERT(self->mOpusDecoder);
+ // Reset the decoder.
+ opus_multistream_decoder_ctl(self->mOpusDecoder, OPUS_RESET_STATE);
+ self->mSkip = self->mOpusParser->mPreSkip;
+ self->mPaddingDiscarded = false;
+ self->mLastFrameTime.reset();
+ });
+ SyncRunnable::DispatchToThread(mTaskQueue, runnable);
+ mIsFlushing = false;
+}
+
+/* static */
+bool
+OpusDataDecoder::IsOpus(const nsACString& aMimeType)
+{
+ return aMimeType.EqualsLiteral("audio/opus");
+}
+
+} // namespace mozilla
+#undef OPUS_DEBUG
diff --git a/dom/media/platforms/agnostic/OpusDecoder.h b/dom/media/platforms/agnostic/OpusDecoder.h
new file mode 100644
index 000000000..6d82ae502
--- /dev/null
+++ b/dom/media/platforms/agnostic/OpusDecoder.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(OpusDecoder_h_)
+#define OpusDecoder_h_
+
+#include "PlatformDecoderModule.h"
+
+#include "mozilla/Maybe.h"
+#include "nsAutoPtr.h"
+
+struct OpusMSDecoder;
+
+namespace mozilla {
+
+class OpusParser;
+
+class OpusDataDecoder : public MediaDataDecoder
+{
+public:
+ explicit OpusDataDecoder(const CreateDecoderParams& aParams);
+ ~OpusDataDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ const char* GetDescriptionName() const override
+ {
+ return "opus audio decoder";
+ }
+
+ // Return true if mimetype is Opus
+ static bool IsOpus(const nsACString& aMimeType);
+
+ // Pack pre-skip/CodecDelay, given in microseconds, into a
+ // MediaByteBuffer. The decoder expects this value to come
+ // from the container (if any) and to precede the OpusHead
+ // block in the CodecSpecificConfig buffer to verify the
+ // values match.
+ static void AppendCodecDelay(MediaByteBuffer* config, uint64_t codecDelayUS);
+
+private:
+ nsresult DecodeHeader(const unsigned char* aData, size_t aLength);
+
+ void ProcessDecode(MediaRawData* aSample);
+ MediaResult DoDecode(MediaRawData* aSample);
+ void ProcessDrain();
+
+ const AudioInfo& mInfo;
+ const RefPtr<TaskQueue> mTaskQueue;
+ MediaDataDecoderCallback* mCallback;
+
+ // Opus decoder state
+ nsAutoPtr<OpusParser> mOpusParser;
+ OpusMSDecoder* mOpusDecoder;
+
+ uint16_t mSkip; // Samples left to trim before playback.
+ bool mDecodedHeader;
+
+ // Opus padding should only be discarded on the final packet. Once this
+ // is set to true, if the reader attempts to decode any further packets it
+ // will raise an error so we can indicate that the file is invalid.
+ bool mPaddingDiscarded;
+ int64_t mFrames;
+ Maybe<int64_t> mLastFrameTime;
+ uint8_t mMappingTable[MAX_AUDIO_CHANNELS]; // Channel mapping table.
+
+ Atomic<bool> mIsFlushing;
+};
+
+} // namespace mozilla
+#endif
diff --git a/dom/media/platforms/agnostic/TheoraDecoder.cpp b/dom/media/platforms/agnostic/TheoraDecoder.cpp
new file mode 100644
index 000000000..b216791e4
--- /dev/null
+++ b/dom/media/platforms/agnostic/TheoraDecoder.cpp
@@ -0,0 +1,240 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "TheoraDecoder.h"
+#include "XiphExtradata.h"
+#include "gfx2DGlue.h"
+#include "nsError.h"
+#include "TimeUnits.h"
+#include "mozilla/PodOperations.h"
+
+#include <algorithm>
+
+#undef LOG
+#define LOG(arg, ...) MOZ_LOG(gMediaDecoderLog, mozilla::LogLevel::Debug, ("TheoraDecoder(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+using namespace gfx;
+using namespace layers;
+
+extern LazyLogModule gMediaDecoderLog;
+
+ogg_packet InitTheoraPacket(const unsigned char* aData, size_t aLength,
+ bool aBOS, bool aEOS,
+ int64_t aGranulepos, int64_t aPacketNo)
+{
+ ogg_packet packet;
+ packet.packet = const_cast<unsigned char*>(aData);
+ packet.bytes = aLength;
+ packet.b_o_s = aBOS;
+ packet.e_o_s = aEOS;
+ packet.granulepos = aGranulepos;
+ packet.packetno = aPacketNo;
+ return packet;
+}
+
+TheoraDecoder::TheoraDecoder(const CreateDecoderParams& aParams)
+ : mImageContainer(aParams.mImageContainer)
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(aParams.mCallback)
+ , mIsFlushing(false)
+ , mTheoraSetupInfo(nullptr)
+ , mTheoraDecoderContext(nullptr)
+ , mPacketCount(0)
+ , mInfo(aParams.VideoConfig())
+{
+ MOZ_COUNT_CTOR(TheoraDecoder);
+}
+
+TheoraDecoder::~TheoraDecoder()
+{
+ MOZ_COUNT_DTOR(TheoraDecoder);
+ th_setup_free(mTheoraSetupInfo);
+ th_comment_clear(&mTheoraComment);
+ th_info_clear(&mTheoraInfo);
+}
+
+void
+TheoraDecoder::Shutdown()
+{
+ if (mTheoraDecoderContext) {
+ th_decode_free(mTheoraDecoderContext);
+ mTheoraDecoderContext = nullptr;
+ }
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+TheoraDecoder::Init()
+{
+ th_comment_init(&mTheoraComment);
+ th_info_init(&mTheoraInfo);
+
+ nsTArray<unsigned char*> headers;
+ nsTArray<size_t> headerLens;
+ if (!XiphExtradataToHeaders(headers, headerLens,
+ mInfo.mCodecSpecificConfig->Elements(),
+ mInfo.mCodecSpecificConfig->Length())) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+ for (size_t i = 0; i < headers.Length(); i++) {
+ if (NS_FAILED(DoDecodeHeader(headers[i], headerLens[i]))) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+ }
+ if (mPacketCount != 3) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ mTheoraDecoderContext = th_decode_alloc(&mTheoraInfo, mTheoraSetupInfo);
+ if (mTheoraDecoderContext) {
+ return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
+ } else {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+}
+
+void
+TheoraDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mIsFlushing = true;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([this] () {
+ // nothing to do for now.
+ });
+ SyncRunnable::DispatchToThread(mTaskQueue, r);
+ mIsFlushing = false;
+}
+
+nsresult
+TheoraDecoder::DoDecodeHeader(const unsigned char* aData, size_t aLength)
+{
+ bool bos = mPacketCount == 0;
+ ogg_packet pkt = InitTheoraPacket(aData, aLength, bos, false, 0, mPacketCount++);
+
+ int r = th_decode_headerin(&mTheoraInfo,
+ &mTheoraComment,
+ &mTheoraSetupInfo,
+ &pkt);
+ return r > 0 ? NS_OK : NS_ERROR_FAILURE;
+}
+
+MediaResult
+TheoraDecoder::DoDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ const unsigned char* aData = aSample->Data();
+ size_t aLength = aSample->Size();
+
+ bool bos = mPacketCount == 0;
+ ogg_packet pkt = InitTheoraPacket(aData, aLength, bos, false, aSample->mTimecode, mPacketCount++);
+
+ int ret = th_decode_packetin(mTheoraDecoderContext, &pkt, nullptr);
+ if (ret == 0 || ret == TH_DUPFRAME) {
+ th_ycbcr_buffer ycbcr;
+ th_decode_ycbcr_out(mTheoraDecoderContext, ycbcr);
+
+ int hdec = !(mTheoraInfo.pixel_fmt & 1);
+ int vdec = !(mTheoraInfo.pixel_fmt & 2);
+
+ VideoData::YCbCrBuffer b;
+ b.mPlanes[0].mData = ycbcr[0].data;
+ b.mPlanes[0].mStride = ycbcr[0].stride;
+ b.mPlanes[0].mHeight = mTheoraInfo.frame_height;
+ b.mPlanes[0].mWidth = mTheoraInfo.frame_width;
+ b.mPlanes[0].mOffset = b.mPlanes[0].mSkip = 0;
+
+ b.mPlanes[1].mData = ycbcr[1].data;
+ b.mPlanes[1].mStride = ycbcr[1].stride;
+ b.mPlanes[1].mHeight = mTheoraInfo.frame_height >> vdec;
+ b.mPlanes[1].mWidth = mTheoraInfo.frame_width >> hdec;
+ b.mPlanes[1].mOffset = b.mPlanes[1].mSkip = 0;
+
+ b.mPlanes[2].mData = ycbcr[2].data;
+ b.mPlanes[2].mStride = ycbcr[2].stride;
+ b.mPlanes[2].mHeight = mTheoraInfo.frame_height >> vdec;
+ b.mPlanes[2].mWidth = mTheoraInfo.frame_width >> hdec;
+ b.mPlanes[2].mOffset = b.mPlanes[2].mSkip = 0;
+
+ IntRect pictureArea(mTheoraInfo.pic_x, mTheoraInfo.pic_y,
+ mTheoraInfo.pic_width, mTheoraInfo.pic_height);
+
+ VideoInfo info;
+ info.mDisplay = mInfo.mDisplay;
+ RefPtr<VideoData> v =
+ VideoData::CreateAndCopyData(info,
+ mImageContainer,
+ aSample->mOffset,
+ aSample->mTime,
+ aSample->mDuration,
+ b,
+ aSample->mKeyframe,
+ aSample->mTimecode,
+ mInfo.ScaledImageRect(mTheoraInfo.frame_width,
+ mTheoraInfo.frame_height));
+ if (!v) {
+ LOG("Image allocation error source %ldx%ld display %ldx%ld picture %ldx%ld",
+ mTheoraInfo.frame_width, mTheoraInfo.frame_height, mInfo.mDisplay.width, mInfo.mDisplay.height,
+ mInfo.mImage.width, mInfo.mImage.height);
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ mCallback->Output(v);
+ return NS_OK;
+ } else {
+ LOG("Theora Decode error: %d", ret);
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Theora decode error:%d", ret));
+ }
+}
+
+void
+TheoraDecoder::ProcessDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mIsFlushing) {
+ return;
+ }
+ MediaResult rv = DoDecode(aSample);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(rv);
+ } else {
+ mCallback->InputExhausted();
+ }
+}
+
+void
+TheoraDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &TheoraDecoder::ProcessDecode, aSample));
+}
+
+void
+TheoraDecoder::ProcessDrain()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ mCallback->DrainComplete();
+}
+
+void
+TheoraDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &TheoraDecoder::ProcessDrain));
+}
+
+/* static */
+bool
+TheoraDecoder::IsTheora(const nsACString& aMimeType)
+{
+ return aMimeType.EqualsLiteral("video/theora");
+}
+
+} // namespace mozilla
+#undef LOG
diff --git a/dom/media/platforms/agnostic/TheoraDecoder.h b/dom/media/platforms/agnostic/TheoraDecoder.h
new file mode 100644
index 000000000..4a5daebb9
--- /dev/null
+++ b/dom/media/platforms/agnostic/TheoraDecoder.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(TheoraDecoder_h_)
+#define TheoraDecoder_h_
+
+#include "PlatformDecoderModule.h"
+
+#include <stdint.h>
+#include "ogg/ogg.h"
+#include "theora/theoradec.h"
+
+namespace mozilla {
+
+ using namespace layers;
+
+class TheoraDecoder : public MediaDataDecoder
+{
+public:
+ explicit TheoraDecoder(const CreateDecoderParams& aParams);
+
+ ~TheoraDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+
+ // Return true if mimetype is a Theora codec
+ static bool IsTheora(const nsACString& aMimeType);
+
+ const char* GetDescriptionName() const override
+ {
+ return "theora video decoder";
+ }
+
+private:
+ nsresult DoDecodeHeader(const unsigned char* aData, size_t aLength);
+
+ void ProcessDecode(MediaRawData* aSample);
+ MediaResult DoDecode(MediaRawData* aSample);
+ void ProcessDrain();
+
+ RefPtr<ImageContainer> mImageContainer;
+ RefPtr<TaskQueue> mTaskQueue;
+ MediaDataDecoderCallback* mCallback;
+ Atomic<bool> mIsFlushing;
+
+ // Theora header & decoder state
+ th_info mTheoraInfo;
+ th_comment mTheoraComment;
+ th_setup_info *mTheoraSetupInfo;
+ th_dec_ctx *mTheoraDecoderContext;
+ int mPacketCount;
+
+ const VideoInfo& mInfo;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/agnostic/VPXDecoder.cpp b/dom/media/platforms/agnostic/VPXDecoder.cpp
new file mode 100644
index 000000000..77c81b51b
--- /dev/null
+++ b/dom/media/platforms/agnostic/VPXDecoder.cpp
@@ -0,0 +1,253 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VPXDecoder.h"
+#include "gfx2DGlue.h"
+#include "nsError.h"
+#include "TimeUnits.h"
+#include "mozilla/PodOperations.h"
+#include "mozilla/SyncRunnable.h"
+#include "prsystem.h"
+
+#include <algorithm>
+
+#undef LOG
+#define LOG(arg, ...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, ("VPXDecoder(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+using namespace gfx;
+using namespace layers;
+
+static int MimeTypeToCodec(const nsACString& aMimeType)
+{
+ if (aMimeType.EqualsLiteral("video/webm; codecs=vp8")) {
+ return VPXDecoder::Codec::VP8;
+ } else if (aMimeType.EqualsLiteral("video/webm; codecs=vp9")) {
+ return VPXDecoder::Codec::VP9;
+ } else if (aMimeType.EqualsLiteral("video/vp9")) {
+ return VPXDecoder::Codec::VP9;
+ }
+ return -1;
+}
+
+VPXDecoder::VPXDecoder(const CreateDecoderParams& aParams)
+ : mImageContainer(aParams.mImageContainer)
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(aParams.mCallback)
+ , mIsFlushing(false)
+ , mInfo(aParams.VideoConfig())
+ , mCodec(MimeTypeToCodec(aParams.VideoConfig().mMimeType))
+{
+ MOZ_COUNT_CTOR(VPXDecoder);
+ PodZero(&mVPX);
+}
+
+VPXDecoder::~VPXDecoder()
+{
+ MOZ_COUNT_DTOR(VPXDecoder);
+}
+
+void
+VPXDecoder::Shutdown()
+{
+ vpx_codec_destroy(&mVPX);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+VPXDecoder::Init()
+{
+ int decode_threads = 2;
+
+ vpx_codec_iface_t* dx = nullptr;
+ if (mCodec == Codec::VP8) {
+ dx = vpx_codec_vp8_dx();
+ } else if (mCodec == Codec::VP9) {
+ dx = vpx_codec_vp9_dx();
+ if (mInfo.mDisplay.width >= 2048) {
+ decode_threads = 8;
+ } else if (mInfo.mDisplay.width >= 1024) {
+ decode_threads = 4;
+ }
+ }
+ decode_threads = std::min(decode_threads, PR_GetNumberOfProcessors());
+
+ vpx_codec_dec_cfg_t config;
+ config.threads = decode_threads;
+ config.w = config.h = 0; // set after decode
+
+ if (!dx || vpx_codec_dec_init(&mVPX, dx, &config, 0)) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+ return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
+}
+
+void
+VPXDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mIsFlushing = true;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([this] () {
+ // nothing to do for now.
+ });
+ SyncRunnable::DispatchToThread(mTaskQueue, r);
+ mIsFlushing = false;
+}
+
+MediaResult
+VPXDecoder::DoDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+#if defined(DEBUG)
+ vpx_codec_stream_info_t si;
+ PodZero(&si);
+ si.sz = sizeof(si);
+ if (mCodec == Codec::VP8) {
+ vpx_codec_peek_stream_info(vpx_codec_vp8_dx(), aSample->Data(), aSample->Size(), &si);
+ } else if (mCodec == Codec::VP9) {
+ vpx_codec_peek_stream_info(vpx_codec_vp9_dx(), aSample->Data(), aSample->Size(), &si);
+ }
+ NS_ASSERTION(bool(si.is_kf) == aSample->mKeyframe,
+ "VPX Decode Keyframe error sample->mKeyframe and si.si_kf out of sync");
+#endif
+
+ if (vpx_codec_err_t r = vpx_codec_decode(&mVPX, aSample->Data(), aSample->Size(), nullptr, 0)) {
+ LOG("VPX Decode error: %s", vpx_codec_err_to_string(r));
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("VPX error: %s", vpx_codec_err_to_string(r)));
+ }
+
+ vpx_codec_iter_t iter = nullptr;
+ vpx_image_t *img;
+
+ while ((img = vpx_codec_get_frame(&mVPX, &iter))) {
+ NS_ASSERTION(img->fmt == VPX_IMG_FMT_I420 ||
+ img->fmt == VPX_IMG_FMT_I444,
+ "WebM image format not I420 or I444");
+
+ // Chroma shifts are rounded down as per the decoding examples in the SDK
+ VideoData::YCbCrBuffer b;
+ b.mPlanes[0].mData = img->planes[0];
+ b.mPlanes[0].mStride = img->stride[0];
+ b.mPlanes[0].mHeight = img->d_h;
+ b.mPlanes[0].mWidth = img->d_w;
+ b.mPlanes[0].mOffset = b.mPlanes[0].mSkip = 0;
+
+ b.mPlanes[1].mData = img->planes[1];
+ b.mPlanes[1].mStride = img->stride[1];
+ b.mPlanes[1].mOffset = b.mPlanes[1].mSkip = 0;
+
+ b.mPlanes[2].mData = img->planes[2];
+ b.mPlanes[2].mStride = img->stride[2];
+ b.mPlanes[2].mOffset = b.mPlanes[2].mSkip = 0;
+
+ if (img->fmt == VPX_IMG_FMT_I420) {
+ b.mPlanes[1].mHeight = (img->d_h + 1) >> img->y_chroma_shift;
+ b.mPlanes[1].mWidth = (img->d_w + 1) >> img->x_chroma_shift;
+
+ b.mPlanes[2].mHeight = (img->d_h + 1) >> img->y_chroma_shift;
+ b.mPlanes[2].mWidth = (img->d_w + 1) >> img->x_chroma_shift;
+ } else if (img->fmt == VPX_IMG_FMT_I444) {
+ b.mPlanes[1].mHeight = img->d_h;
+ b.mPlanes[1].mWidth = img->d_w;
+
+ b.mPlanes[2].mHeight = img->d_h;
+ b.mPlanes[2].mWidth = img->d_w;
+ } else {
+ LOG("VPX Unknown image format");
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("VPX Unknown image format"));
+ }
+
+ RefPtr<VideoData> v =
+ VideoData::CreateAndCopyData(mInfo,
+ mImageContainer,
+ aSample->mOffset,
+ aSample->mTime,
+ aSample->mDuration,
+ b,
+ aSample->mKeyframe,
+ aSample->mTimecode,
+ mInfo.ScaledImageRect(img->d_w,
+ img->d_h));
+
+ if (!v) {
+ LOG("Image allocation error source %ldx%ld display %ldx%ld picture %ldx%ld",
+ img->d_w, img->d_h, mInfo.mDisplay.width, mInfo.mDisplay.height,
+ mInfo.mImage.width, mInfo.mImage.height);
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ mCallback->Output(v);
+ }
+ return NS_OK;
+}
+
+void
+VPXDecoder::ProcessDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mIsFlushing) {
+ return;
+ }
+ MediaResult rv = DoDecode(aSample);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(rv);
+ } else {
+ mCallback->InputExhausted();
+ }
+}
+
+void
+VPXDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &VPXDecoder::ProcessDecode, aSample));
+}
+
+void
+VPXDecoder::ProcessDrain()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ mCallback->DrainComplete();
+}
+
+void
+VPXDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &VPXDecoder::ProcessDrain));
+}
+
+/* static */
+bool
+VPXDecoder::IsVPX(const nsACString& aMimeType, uint8_t aCodecMask)
+{
+ return ((aCodecMask & VPXDecoder::VP8) &&
+ aMimeType.EqualsLiteral("video/webm; codecs=vp8")) ||
+ ((aCodecMask & VPXDecoder::VP9) &&
+ aMimeType.EqualsLiteral("video/webm; codecs=vp9")) ||
+ ((aCodecMask & VPXDecoder::VP9) &&
+ aMimeType.EqualsLiteral("video/vp9"));
+}
+
+/* static */
+bool
+VPXDecoder::IsVP8(const nsACString& aMimeType)
+{
+ return IsVPX(aMimeType, VPXDecoder::VP8);
+}
+
+/* static */
+bool
+VPXDecoder::IsVP9(const nsACString& aMimeType)
+{
+ return IsVPX(aMimeType, VPXDecoder::VP9);
+}
+
+} // namespace mozilla
+#undef LOG
diff --git a/dom/media/platforms/agnostic/VPXDecoder.h b/dom/media/platforms/agnostic/VPXDecoder.h
new file mode 100644
index 000000000..d420ec069
--- /dev/null
+++ b/dom/media/platforms/agnostic/VPXDecoder.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(VPXDecoder_h_)
+#define VPXDecoder_h_
+
+#include "PlatformDecoderModule.h"
+
+#include <stdint.h>
+#define VPX_DONT_DEFINE_STDINT_TYPES
+#include "vpx/vp8dx.h"
+#include "vpx/vpx_codec.h"
+#include "vpx/vpx_decoder.h"
+
+namespace mozilla {
+
+using namespace layers;
+
+class VPXDecoder : public MediaDataDecoder
+{
+public:
+ explicit VPXDecoder(const CreateDecoderParams& aParams);
+ ~VPXDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ const char* GetDescriptionName() const override
+ {
+ return "libvpx video decoder";
+ }
+
+ enum Codec: uint8_t {
+ VP8 = 1 << 0,
+ VP9 = 1 << 1
+ };
+
+ // Return true if aMimeType is a one of the strings used by our demuxers to
+ // identify VPX of the specified type. Does not parse general content type
+ // strings, i.e. white space matters.
+ static bool IsVPX(const nsACString& aMimeType, uint8_t aCodecMask=VP8|VP9);
+ static bool IsVP8(const nsACString& aMimeType);
+ static bool IsVP9(const nsACString& aMimeType);
+
+private:
+ void ProcessDecode(MediaRawData* aSample);
+ MediaResult DoDecode(MediaRawData* aSample);
+ void ProcessDrain();
+
+ const RefPtr<ImageContainer> mImageContainer;
+ const RefPtr<TaskQueue> mTaskQueue;
+ MediaDataDecoderCallback* mCallback;
+ Atomic<bool> mIsFlushing;
+
+ // VPx decoder state
+ vpx_codec_ctx_t mVPX;
+
+ const VideoInfo& mInfo;
+
+ const int mCodec;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/agnostic/VorbisDecoder.cpp b/dom/media/platforms/agnostic/VorbisDecoder.cpp
new file mode 100644
index 000000000..ed8b90dbd
--- /dev/null
+++ b/dom/media/platforms/agnostic/VorbisDecoder.cpp
@@ -0,0 +1,349 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "VorbisDecoder.h"
+#include "VorbisUtils.h"
+#include "XiphExtradata.h"
+
+#include "mozilla/PodOperations.h"
+#include "mozilla/SyncRunnable.h"
+
+#undef LOG
+#define LOG(type, msg) MOZ_LOG(sPDMLog, type, msg)
+
+namespace mozilla {
+
+ogg_packet InitVorbisPacket(const unsigned char* aData, size_t aLength,
+ bool aBOS, bool aEOS,
+ int64_t aGranulepos, int64_t aPacketNo)
+{
+ ogg_packet packet;
+ packet.packet = const_cast<unsigned char*>(aData);
+ packet.bytes = aLength;
+ packet.b_o_s = aBOS;
+ packet.e_o_s = aEOS;
+ packet.granulepos = aGranulepos;
+ packet.packetno = aPacketNo;
+ return packet;
+}
+
+VorbisDataDecoder::VorbisDataDecoder(const CreateDecoderParams& aParams)
+ : mInfo(aParams.AudioConfig())
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(aParams.mCallback)
+ , mPacketCount(0)
+ , mFrames(0)
+ , mIsFlushing(false)
+{
+ // Zero these member vars to avoid crashes in Vorbis clear functions when
+ // destructor is called before |Init|.
+ PodZero(&mVorbisBlock);
+ PodZero(&mVorbisDsp);
+ PodZero(&mVorbisInfo);
+ PodZero(&mVorbisComment);
+}
+
+VorbisDataDecoder::~VorbisDataDecoder()
+{
+ vorbis_block_clear(&mVorbisBlock);
+ vorbis_dsp_clear(&mVorbisDsp);
+ vorbis_info_clear(&mVorbisInfo);
+ vorbis_comment_clear(&mVorbisComment);
+}
+
+void
+VorbisDataDecoder::Shutdown()
+{
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+VorbisDataDecoder::Init()
+{
+ vorbis_info_init(&mVorbisInfo);
+ vorbis_comment_init(&mVorbisComment);
+ PodZero(&mVorbisDsp);
+ PodZero(&mVorbisBlock);
+
+ AutoTArray<unsigned char*,4> headers;
+ AutoTArray<size_t,4> headerLens;
+ if (!XiphExtradataToHeaders(headers, headerLens,
+ mInfo.mCodecSpecificConfig->Elements(),
+ mInfo.mCodecSpecificConfig->Length())) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+ for (size_t i = 0; i < headers.Length(); i++) {
+ if (NS_FAILED(DecodeHeader(headers[i], headerLens[i]))) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+ }
+
+ MOZ_ASSERT(mPacketCount == 3);
+
+ int r = vorbis_synthesis_init(&mVorbisDsp, &mVorbisInfo);
+ if (r) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ r = vorbis_block_init(&mVorbisDsp, &mVorbisBlock);
+ if (r) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (mInfo.mRate != (uint32_t)mVorbisDsp.vi->rate) {
+ LOG(LogLevel::Warning,
+ ("Invalid Vorbis header: container and codec rate do not match!"));
+ }
+ if (mInfo.mChannels != (uint32_t)mVorbisDsp.vi->channels) {
+ LOG(LogLevel::Warning,
+ ("Invalid Vorbis header: container and codec channels do not match!"));
+ }
+
+ AudioConfig::ChannelLayout layout(mVorbisDsp.vi->channels);
+ if (!layout.IsValid()) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);
+}
+
+nsresult
+VorbisDataDecoder::DecodeHeader(const unsigned char* aData, size_t aLength)
+{
+ bool bos = mPacketCount == 0;
+ ogg_packet pkt = InitVorbisPacket(aData, aLength, bos, false, 0, mPacketCount++);
+ MOZ_ASSERT(mPacketCount <= 3);
+
+ int r = vorbis_synthesis_headerin(&mVorbisInfo,
+ &mVorbisComment,
+ &pkt);
+ return r == 0 ? NS_OK : NS_ERROR_FAILURE;
+}
+
+void
+VorbisDataDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &VorbisDataDecoder::ProcessDecode, aSample));
+}
+
+void
+VorbisDataDecoder::ProcessDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mIsFlushing) {
+ return;
+ }
+
+ MediaResult rv = DoDecode(aSample);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(rv);
+ } else {
+ mCallback->InputExhausted();
+ }
+}
+
+MediaResult
+VorbisDataDecoder::DoDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ const unsigned char* aData = aSample->Data();
+ size_t aLength = aSample->Size();
+ int64_t aOffset = aSample->mOffset;
+ int64_t aTstampUsecs = aSample->mTime;
+ int64_t aTotalFrames = 0;
+
+ MOZ_ASSERT(mPacketCount >= 3);
+
+ if (!mLastFrameTime || mLastFrameTime.ref() != aSample->mTime) {
+ // We are starting a new block.
+ mFrames = 0;
+ mLastFrameTime = Some(aSample->mTime);
+ }
+
+ ogg_packet pkt = InitVorbisPacket(aData, aLength, false, aSample->mEOS,
+ aSample->mTimecode, mPacketCount++);
+
+ int err = vorbis_synthesis(&mVorbisBlock, &pkt);
+ if (err) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("vorbis_synthesis:%d", err));
+ }
+
+ err = vorbis_synthesis_blockin(&mVorbisDsp, &mVorbisBlock);
+ if (err) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("vorbis_synthesis_blockin:%d", err));
+ }
+
+ VorbisPCMValue** pcm = 0;
+ int32_t frames = vorbis_synthesis_pcmout(&mVorbisDsp, &pcm);
+ if (frames == 0) {
+ return NS_OK;
+ }
+ while (frames > 0) {
+ uint32_t channels = mVorbisDsp.vi->channels;
+ uint32_t rate = mVorbisDsp.vi->rate;
+ AlignedAudioBuffer buffer(frames*channels);
+ if (!buffer) {
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ for (uint32_t j = 0; j < channels; ++j) {
+ VorbisPCMValue* channel = pcm[j];
+ for (uint32_t i = 0; i < uint32_t(frames); ++i) {
+ buffer[i*channels + j] = MOZ_CONVERT_VORBIS_SAMPLE(channel[i]);
+ }
+ }
+
+ CheckedInt64 duration = FramesToUsecs(frames, rate);
+ if (!duration.isValid()) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Overflow converting audio duration"));
+ }
+ CheckedInt64 total_duration = FramesToUsecs(mFrames, rate);
+ if (!total_duration.isValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Overflow converting audio total_duration"));
+ }
+
+ CheckedInt64 time = total_duration + aTstampUsecs;
+ if (!time.isValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Overflow adding total_duration and aTstampUsecs"));
+ };
+
+ if (!mAudioConverter) {
+ AudioConfig in(AudioConfig::ChannelLayout(channels, VorbisLayout(channels)),
+ rate);
+ AudioConfig out(channels, rate);
+ if (!in.IsValid() || !out.IsValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Invalid channel layout:%u", channels));
+ }
+ mAudioConverter = MakeUnique<AudioConverter>(in, out);
+ }
+ MOZ_ASSERT(mAudioConverter->CanWorkInPlace());
+ AudioSampleBuffer data(Move(buffer));
+ data = mAudioConverter->Process(Move(data));
+
+ aTotalFrames += frames;
+ mCallback->Output(new AudioData(aOffset,
+ time.value(),
+ duration.value(),
+ frames,
+ data.Forget(),
+ channels,
+ rate));
+ mFrames += frames;
+ err = vorbis_synthesis_read(&mVorbisDsp, frames);
+ if (err) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("vorbis_synthesis_read:%d", err));
+ }
+
+ frames = vorbis_synthesis_pcmout(&mVorbisDsp, &pcm);
+ }
+
+ return NS_OK;
+}
+
+void
+VorbisDataDecoder::ProcessDrain()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ mCallback->DrainComplete();
+}
+
+void
+VorbisDataDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &VorbisDataDecoder::ProcessDrain));
+}
+
+void
+VorbisDataDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mIsFlushing = true;
+ RefPtr<VorbisDataDecoder> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self] () {
+ // Ignore failed results from vorbis_synthesis_restart. They
+ // aren't fatal and it fails when ResetDecode is called at a
+ // time when no vorbis data has been read.
+ vorbis_synthesis_restart(&self->mVorbisDsp);
+ self->mLastFrameTime.reset();
+ });
+ SyncRunnable::DispatchToThread(mTaskQueue, r);
+ mIsFlushing = false;
+}
+
+/* static */
+bool
+VorbisDataDecoder::IsVorbis(const nsACString& aMimeType)
+{
+ return aMimeType.EqualsLiteral("audio/vorbis");
+}
+
+/* static */ const AudioConfig::Channel*
+VorbisDataDecoder::VorbisLayout(uint32_t aChannels)
+{
+ // From https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html
+ // Section 4.3.9.
+ typedef AudioConfig::Channel Channel;
+
+ switch (aChannels) {
+ case 1: // the stream is monophonic
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_MONO };
+ return config;
+ }
+ case 2: // the stream is stereo. channel order: left, right
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_RIGHT };
+ return config;
+ }
+ case 3: // the stream is a 1d-surround encoding. channel order: left, center, right
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_CENTER, AudioConfig::CHANNEL_RIGHT };
+ return config;
+ }
+ case 4: // the stream is quadraphonic surround. channel order: front left, front right, rear left, rear right
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_RIGHT, AudioConfig::CHANNEL_LS, AudioConfig::CHANNEL_RS };
+ return config;
+ }
+ case 5: // the stream is five-channel surround. channel order: front left, center, front right, rear left, rear right
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_CENTER, AudioConfig::CHANNEL_RIGHT, AudioConfig::CHANNEL_LS, AudioConfig::CHANNEL_RS };
+ return config;
+ }
+ case 6: // the stream is 5.1 surround. channel order: front left, center, front right, rear left, rear right, LFE
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_CENTER, AudioConfig::CHANNEL_RIGHT, AudioConfig::CHANNEL_LS, AudioConfig::CHANNEL_RS, AudioConfig::CHANNEL_LFE };
+ return config;
+ }
+ case 7: // surround. channel order: front left, center, front right, side left, side right, rear center, LFE
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_CENTER, AudioConfig::CHANNEL_RIGHT, AudioConfig::CHANNEL_LS, AudioConfig::CHANNEL_RS, AudioConfig::CHANNEL_RCENTER, AudioConfig::CHANNEL_LFE };
+ return config;
+ }
+ case 8: // the stream is 7.1 surround. channel order: front left, center, front right, side left, side right, rear left, rear right, LFE
+ {
+ static const Channel config[] = { AudioConfig::CHANNEL_LEFT, AudioConfig::CHANNEL_CENTER, AudioConfig::CHANNEL_RIGHT, AudioConfig::CHANNEL_LS, AudioConfig::CHANNEL_RS, AudioConfig::CHANNEL_RLS, AudioConfig::CHANNEL_RRS, AudioConfig::CHANNEL_LFE };
+ return config;
+ }
+ default:
+ return nullptr;
+ }
+}
+
+} // namespace mozilla
+#undef LOG
diff --git a/dom/media/platforms/agnostic/VorbisDecoder.h b/dom/media/platforms/agnostic/VorbisDecoder.h
new file mode 100644
index 000000000..0ed7bb645
--- /dev/null
+++ b/dom/media/platforms/agnostic/VorbisDecoder.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(VorbisDecoder_h_)
+#define VorbisDecoder_h_
+
+#include "PlatformDecoderModule.h"
+#include "mozilla/Maybe.h"
+#include "AudioConverter.h"
+
+#ifdef MOZ_TREMOR
+#include "tremor/ivorbiscodec.h"
+#else
+#include "vorbis/codec.h"
+#endif
+
+namespace mozilla {
+
+class VorbisDataDecoder : public MediaDataDecoder
+{
+public:
+ explicit VorbisDataDecoder(const CreateDecoderParams& aParams);
+ ~VorbisDataDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ const char* GetDescriptionName() const override
+ {
+ return "vorbis audio decoder";
+ }
+
+ // Return true if mimetype is Vorbis
+ static bool IsVorbis(const nsACString& aMimeType);
+ static const AudioConfig::Channel* VorbisLayout(uint32_t aChannels);
+
+private:
+ nsresult DecodeHeader(const unsigned char* aData, size_t aLength);
+
+ void ProcessDecode(MediaRawData* aSample);
+ MediaResult DoDecode(MediaRawData* aSample);
+ void ProcessDrain();
+
+ const AudioInfo& mInfo;
+ const RefPtr<TaskQueue> mTaskQueue;
+ MediaDataDecoderCallback* mCallback;
+
+ // Vorbis decoder state
+ vorbis_info mVorbisInfo;
+ vorbis_comment mVorbisComment;
+ vorbis_dsp_state mVorbisDsp;
+ vorbis_block mVorbisBlock;
+
+ int64_t mPacketCount;
+ int64_t mFrames;
+ Maybe<int64_t> mLastFrameTime;
+ UniquePtr<AudioConverter> mAudioConverter;
+ Atomic<bool> mIsFlushing;
+};
+
+} // namespace mozilla
+#endif
diff --git a/dom/media/platforms/agnostic/WAVDecoder.cpp b/dom/media/platforms/agnostic/WAVDecoder.cpp
new file mode 100644
index 000000000..67a045287
--- /dev/null
+++ b/dom/media/platforms/agnostic/WAVDecoder.cpp
@@ -0,0 +1,158 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WAVDecoder.h"
+#include "AudioSampleFormat.h"
+#include "mozilla/SyncRunnable.h"
+
+using mp4_demuxer::ByteReader;
+
+namespace mozilla {
+
+int16_t
+DecodeALawSample(uint8_t aValue)
+{
+ aValue = aValue ^ 0x55;
+ int8_t sign = (aValue & 0x80) ? -1 : 1;
+ uint8_t exponent = (aValue & 0x70) >> 4;
+ uint8_t mantissa = aValue & 0x0F;
+ int16_t sample = mantissa << 4;
+ switch (exponent) {
+ case 0:
+ sample += 8;
+ break;
+ case 1:
+ sample += 0x108;
+ break;
+ default:
+ sample += 0x108;
+ sample <<= exponent - 1;
+ }
+ return sign * sample;
+}
+
+int16_t
+DecodeULawSample(uint8_t aValue)
+{
+ aValue = aValue ^ 0xFF;
+ int8_t sign = (aValue & 0x80) ? -1 : 1;
+ uint8_t exponent = (aValue & 0x70) >> 4;
+ uint8_t mantissa = aValue & 0x0F;
+ int16_t sample = (33 + 2 * mantissa) * (2 << (exponent + 1)) - 33;
+ return sign * sample;
+}
+
+WaveDataDecoder::WaveDataDecoder(const CreateDecoderParams& aParams)
+ : mInfo(aParams.AudioConfig())
+ , mCallback(aParams.mCallback)
+{
+}
+
+void
+WaveDataDecoder::Shutdown()
+{
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+WaveDataDecoder::Init()
+{
+ return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);
+}
+
+void
+WaveDataDecoder::Input(MediaRawData* aSample)
+{
+ MediaResult rv = DoDecode(aSample);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(rv);
+ } else {
+ mCallback->InputExhausted();
+ }
+}
+
+MediaResult
+WaveDataDecoder::DoDecode(MediaRawData* aSample)
+{
+ size_t aLength = aSample->Size();
+ ByteReader aReader(aSample->Data(), aLength);
+ int64_t aOffset = aSample->mOffset;
+ uint64_t aTstampUsecs = aSample->mTime;
+
+ int32_t frames = aLength * 8 / mInfo.mBitDepth / mInfo.mChannels;
+
+ AlignedAudioBuffer buffer(frames * mInfo.mChannels);
+ if (!buffer) {
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ for (int i = 0; i < frames; ++i) {
+ for (unsigned int j = 0; j < mInfo.mChannels; ++j) {
+ if (mInfo.mProfile == 6) { //ALAW Data
+ uint8_t v = aReader.ReadU8();
+ int16_t decoded = DecodeALawSample(v);
+ buffer[i * mInfo.mChannels + j] =
+ IntegerToAudioSample<AudioDataValue>(decoded);
+ } else if (mInfo.mProfile == 7) { //ULAW Data
+ uint8_t v = aReader.ReadU8();
+ int16_t decoded = DecodeULawSample(v);
+ buffer[i * mInfo.mChannels + j] =
+ IntegerToAudioSample<AudioDataValue>(decoded);
+ } else { //PCM Data
+ if (mInfo.mBitDepth == 8) {
+ uint8_t v = aReader.ReadU8();
+ buffer[i * mInfo.mChannels + j] =
+ UInt8bitToAudioSample<AudioDataValue>(v);
+ } else if (mInfo.mBitDepth == 16) {
+ int16_t v = aReader.ReadLE16();
+ buffer[i * mInfo.mChannels + j] =
+ IntegerToAudioSample<AudioDataValue>(v);
+ } else if (mInfo.mBitDepth == 24) {
+ int32_t v = aReader.ReadLE24();
+ buffer[i * mInfo.mChannels + j] =
+ Int24bitToAudioSample<AudioDataValue>(v);
+ }
+ }
+ }
+ }
+
+ int64_t duration = frames / mInfo.mRate;
+
+ mCallback->Output(new AudioData(aOffset,
+ aTstampUsecs,
+ duration,
+ frames,
+ Move(buffer),
+ mInfo.mChannels,
+ mInfo.mRate));
+
+ return NS_OK;
+}
+
+void
+WaveDataDecoder::Drain()
+{
+ mCallback->DrainComplete();
+}
+
+void
+WaveDataDecoder::Flush()
+{
+}
+
+/* static */
+bool
+WaveDataDecoder::IsWave(const nsACString& aMimeType)
+{
+ // Some WebAudio uses "audio/x-wav",
+ // WAVdemuxer uses "audio/wave; codecs=aNum".
+ return aMimeType.EqualsLiteral("audio/x-wav") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=1") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=6") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=7") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=65534");
+}
+
+} // namespace mozilla
+#undef LOG
diff --git a/dom/media/platforms/agnostic/WAVDecoder.h b/dom/media/platforms/agnostic/WAVDecoder.h
new file mode 100644
index 000000000..dea980168
--- /dev/null
+++ b/dom/media/platforms/agnostic/WAVDecoder.h
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(WaveDecoder_h_)
+#define WaveDecoder_h_
+
+#include "PlatformDecoderModule.h"
+#include "mp4_demuxer/ByteReader.h"
+
+namespace mozilla {
+
+class WaveDataDecoder : public MediaDataDecoder
+{
+public:
+ explicit WaveDataDecoder(const CreateDecoderParams& aParams);
+
+ // Return true if mimetype is Wave
+ static bool IsWave(const nsACString& aMimeType);
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ const char* GetDescriptionName() const override
+ {
+ return "wave audio decoder";
+ }
+
+private:
+ MediaResult DoDecode(MediaRawData* aSample);
+
+ const AudioInfo& mInfo;
+ MediaDataDecoderCallback* mCallback;
+};
+
+} // namespace mozilla
+#endif
diff --git a/dom/media/platforms/agnostic/eme/EMEAudioDecoder.cpp b/dom/media/platforms/agnostic/eme/EMEAudioDecoder.cpp
new file mode 100644
index 000000000..25e502025
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/EMEAudioDecoder.cpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "EMEAudioDecoder.h"
+#include "mozilla/CDMProxy.h"
+
+namespace mozilla {
+
+void
+EMEAudioCallbackAdapter::Error(GMPErr aErr)
+{
+ if (aErr == GMPNoKeyErr) {
+ // The GMP failed to decrypt a frame due to not having a key. This can
+ // happen if a key expires or a session is closed during playback.
+ NS_WARNING("GMP failed to decrypt due to lack of key");
+ return;
+ }
+ AudioCallbackAdapter::Error(aErr);
+}
+
+EMEAudioDecoder::EMEAudioDecoder(CDMProxy* aProxy,
+ const GMPAudioDecoderParams& aParams)
+ : GMPAudioDecoder(GMPAudioDecoderParams(aParams).WithAdapter(
+ new EMEAudioCallbackAdapter(aParams.mCallback)))
+ , mProxy(aProxy)
+{}
+
+void
+EMEAudioDecoder::InitTags(nsTArray<nsCString>& aTags)
+{
+ aTags.AppendElement(NS_LITERAL_CSTRING("aac"));
+ aTags.AppendElement(NS_ConvertUTF16toUTF8(mProxy->KeySystem()));
+}
+
+nsCString
+EMEAudioDecoder::GetNodeId()
+{
+ return mProxy->GetNodeId();
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/eme/EMEAudioDecoder.h b/dom/media/platforms/agnostic/eme/EMEAudioDecoder.h
new file mode 100644
index 000000000..c5944cf8c
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/EMEAudioDecoder.h
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EMEAudioDecoder_h_
+#define EMEAudioDecoder_h_
+
+#include "GMPAudioDecoder.h"
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class EMEAudioCallbackAdapter : public AudioCallbackAdapter {
+public:
+ explicit EMEAudioCallbackAdapter(MediaDataDecoderCallbackProxy* aCallback)
+ : AudioCallbackAdapter(aCallback)
+ {}
+
+ void Error(GMPErr aErr) override;
+};
+
+class EMEAudioDecoder : public GMPAudioDecoder {
+public:
+ EMEAudioDecoder(CDMProxy* aProxy, const GMPAudioDecoderParams& aParams);
+
+private:
+ void InitTags(nsTArray<nsCString>& aTags) override;
+ nsCString GetNodeId() override;
+
+ RefPtr<CDMProxy> mProxy;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/agnostic/eme/EMEDecoderModule.cpp b/dom/media/platforms/agnostic/eme/EMEDecoderModule.cpp
new file mode 100644
index 000000000..7d523d926
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/EMEDecoderModule.cpp
@@ -0,0 +1,307 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "EMEDecoderModule.h"
+#include "EMEAudioDecoder.h"
+#include "EMEVideoDecoder.h"
+#include "MediaDataDecoderProxy.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "mozilla/CDMProxy.h"
+#include "mozilla/Unused.h"
+#include "nsAutoPtr.h"
+#include "nsServiceManagerUtils.h"
+#include "MediaInfo.h"
+#include "nsClassHashtable.h"
+#include "GMPDecoderModule.h"
+#include "MP4Decoder.h"
+
+namespace mozilla {
+
+typedef MozPromiseRequestHolder<CDMProxy::DecryptPromise> DecryptPromiseRequestHolder;
+
+class EMEDecryptor : public MediaDataDecoder {
+
+public:
+
+ EMEDecryptor(MediaDataDecoder* aDecoder,
+ MediaDataDecoderCallback* aCallback,
+ CDMProxy* aProxy,
+ TaskQueue* aDecodeTaskQueue)
+ : mDecoder(aDecoder)
+ , mCallback(aCallback)
+ , mTaskQueue(aDecodeTaskQueue)
+ , mProxy(aProxy)
+ , mSamplesWaitingForKey(new SamplesWaitingForKey(this, this->mCallback,
+ mTaskQueue, mProxy))
+ , mIsShutdown(false)
+ {
+ }
+
+ RefPtr<InitPromise> Init() override {
+ MOZ_ASSERT(!mIsShutdown);
+ return mDecoder->Init();
+ }
+
+ void Input(MediaRawData* aSample) override {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mIsShutdown) {
+ NS_WARNING("EME encrypted sample arrived after shutdown");
+ return;
+ }
+ if (mSamplesWaitingForKey->WaitIfKeyNotUsable(aSample)) {
+ return;
+ }
+
+ nsAutoPtr<MediaRawDataWriter> writer(aSample->CreateWriter());
+ mProxy->GetSessionIdsForKeyId(aSample->mCrypto.mKeyId,
+ writer->mCrypto.mSessionIds);
+
+ mDecrypts.Put(aSample, new DecryptPromiseRequestHolder());
+ mDecrypts.Get(aSample)->Begin(mProxy->Decrypt(aSample)->Then(
+ mTaskQueue, __func__, this,
+ &EMEDecryptor::Decrypted,
+ &EMEDecryptor::Decrypted));
+ return;
+ }
+
+ void Decrypted(const DecryptResult& aDecrypted) {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(aDecrypted.mSample);
+
+ nsAutoPtr<DecryptPromiseRequestHolder> holder;
+ mDecrypts.RemoveAndForget(aDecrypted.mSample, holder);
+ if (holder) {
+ holder->Complete();
+ } else {
+ // Decryption is not in the list of decrypt operations waiting
+ // for a result. It must have been flushed or drained. Ignore result.
+ return;
+ }
+
+ if (mIsShutdown) {
+ NS_WARNING("EME decrypted sample arrived after shutdown");
+ return;
+ }
+
+ if (aDecrypted.mStatus == NoKeyErr) {
+ // Key became unusable after we sent the sample to CDM to decrypt.
+ // Call Input() again, so that the sample is enqueued for decryption
+ // if the key becomes usable again.
+ Input(aDecrypted.mSample);
+ } else if (aDecrypted.mStatus != Ok) {
+ if (mCallback) {
+ mCallback->Error(MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("decrypted.mStatus=%u", uint32_t(aDecrypted.mStatus))));
+ }
+ } else {
+ MOZ_ASSERT(!mIsShutdown);
+ // The Adobe GMP AAC decoder gets confused if we pass it non-encrypted
+ // samples with valid crypto data. So clear the crypto data, since the
+ // sample should be decrypted now anyway. If we don't do this and we're
+ // using the Adobe GMP for unencrypted decoding of data that is decrypted
+ // by gmp-clearkey, decoding will fail.
+ UniquePtr<MediaRawDataWriter> writer(aDecrypted.mSample->CreateWriter());
+ writer->mCrypto = CryptoSample();
+ mDecoder->Input(aDecrypted.mSample);
+ }
+ }
+
+ void Flush() override {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(!mIsShutdown);
+ for (auto iter = mDecrypts.Iter(); !iter.Done(); iter.Next()) {
+ nsAutoPtr<DecryptPromiseRequestHolder>& holder = iter.Data();
+ holder->DisconnectIfExists();
+ iter.Remove();
+ }
+ mDecoder->Flush();
+ mSamplesWaitingForKey->Flush();
+ }
+
+ void Drain() override {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(!mIsShutdown);
+ for (auto iter = mDecrypts.Iter(); !iter.Done(); iter.Next()) {
+ nsAutoPtr<DecryptPromiseRequestHolder>& holder = iter.Data();
+ holder->DisconnectIfExists();
+ iter.Remove();
+ }
+ mDecoder->Drain();
+ }
+
+ void Shutdown() override {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(!mIsShutdown);
+ mIsShutdown = true;
+ mDecoder->Shutdown();
+ mSamplesWaitingForKey->BreakCycles();
+ mSamplesWaitingForKey = nullptr;
+ mDecoder = nullptr;
+ mProxy = nullptr;
+ mCallback = nullptr;
+ }
+
+ const char* GetDescriptionName() const override {
+ return mDecoder->GetDescriptionName();
+ }
+
+private:
+
+ RefPtr<MediaDataDecoder> mDecoder;
+ MediaDataDecoderCallback* mCallback;
+ RefPtr<TaskQueue> mTaskQueue;
+ RefPtr<CDMProxy> mProxy;
+ nsClassHashtable<nsRefPtrHashKey<MediaRawData>, DecryptPromiseRequestHolder> mDecrypts;
+ RefPtr<SamplesWaitingForKey> mSamplesWaitingForKey;
+ bool mIsShutdown;
+};
+
+class EMEMediaDataDecoderProxy : public MediaDataDecoderProxy {
+public:
+ EMEMediaDataDecoderProxy(already_AddRefed<AbstractThread> aProxyThread,
+ MediaDataDecoderCallback* aCallback,
+ CDMProxy* aProxy,
+ TaskQueue* aTaskQueue)
+ : MediaDataDecoderProxy(Move(aProxyThread), aCallback)
+ , mSamplesWaitingForKey(new SamplesWaitingForKey(this, aCallback,
+ aTaskQueue, aProxy))
+ , mProxy(aProxy)
+ {
+ }
+
+ void Input(MediaRawData* aSample) override;
+ void Shutdown() override;
+
+private:
+ RefPtr<SamplesWaitingForKey> mSamplesWaitingForKey;
+ RefPtr<CDMProxy> mProxy;
+};
+
+void
+EMEMediaDataDecoderProxy::Input(MediaRawData* aSample)
+{
+ if (mSamplesWaitingForKey->WaitIfKeyNotUsable(aSample)) {
+ return;
+ }
+
+ nsAutoPtr<MediaRawDataWriter> writer(aSample->CreateWriter());
+ mProxy->GetSessionIdsForKeyId(aSample->mCrypto.mKeyId,
+ writer->mCrypto.mSessionIds);
+
+ MediaDataDecoderProxy::Input(aSample);
+}
+
+void
+EMEMediaDataDecoderProxy::Shutdown()
+{
+ MediaDataDecoderProxy::Shutdown();
+
+ mSamplesWaitingForKey->BreakCycles();
+ mSamplesWaitingForKey = nullptr;
+ mProxy = nullptr;
+}
+
+EMEDecoderModule::EMEDecoderModule(CDMProxy* aProxy, PDMFactory* aPDM)
+ : mProxy(aProxy)
+ , mPDM(aPDM)
+{
+}
+
+EMEDecoderModule::~EMEDecoderModule()
+{
+}
+
+static already_AddRefed<MediaDataDecoderProxy>
+CreateDecoderWrapper(MediaDataDecoderCallback* aCallback, CDMProxy* aProxy, TaskQueue* aTaskQueue)
+{
+ RefPtr<gmp::GeckoMediaPluginService> s(gmp::GeckoMediaPluginService::GetGeckoMediaPluginService());
+ if (!s) {
+ return nullptr;
+ }
+ RefPtr<AbstractThread> thread(s->GetAbstractGMPThread());
+ if (!thread) {
+ return nullptr;
+ }
+ RefPtr<MediaDataDecoderProxy> decoder(
+ new EMEMediaDataDecoderProxy(thread.forget(), aCallback, aProxy, aTaskQueue));
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+EMEDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ MOZ_ASSERT(aParams.mConfig.mCrypto.mValid);
+
+ if (SupportsMimeType(aParams.mConfig.mMimeType, nullptr)) {
+ // GMP decodes. Assume that means it can decrypt too.
+ RefPtr<MediaDataDecoderProxy> wrapper =
+ CreateDecoderWrapper(aParams.mCallback, mProxy, aParams.mTaskQueue);
+ auto params = GMPVideoDecoderParams(aParams).WithCallback(wrapper);
+ wrapper->SetProxyTarget(new EMEVideoDecoder(mProxy, params));
+ return wrapper.forget();
+ }
+
+ MOZ_ASSERT(mPDM);
+ RefPtr<MediaDataDecoder> decoder(mPDM->CreateDecoder(aParams));
+ if (!decoder) {
+ return nullptr;
+ }
+
+ RefPtr<MediaDataDecoder> emeDecoder(new EMEDecryptor(decoder,
+ aParams.mCallback,
+ mProxy,
+ AbstractThread::GetCurrent()->AsTaskQueue()));
+ return emeDecoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+EMEDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ MOZ_ASSERT(aParams.mConfig.mCrypto.mValid);
+
+ if (SupportsMimeType(aParams.mConfig.mMimeType, nullptr)) {
+ // GMP decodes. Assume that means it can decrypt too.
+ RefPtr<MediaDataDecoderProxy> wrapper =
+ CreateDecoderWrapper(aParams.mCallback, mProxy, aParams.mTaskQueue);
+ auto gmpParams = GMPAudioDecoderParams(aParams).WithCallback(wrapper);
+ wrapper->SetProxyTarget(new EMEAudioDecoder(mProxy, gmpParams));
+ return wrapper.forget();
+ }
+
+ MOZ_ASSERT(mPDM);
+ RefPtr<MediaDataDecoder> decoder(mPDM->CreateDecoder(aParams));
+ if (!decoder) {
+ return nullptr;
+ }
+
+ RefPtr<MediaDataDecoder> emeDecoder(new EMEDecryptor(decoder,
+ aParams.mCallback,
+ mProxy,
+ AbstractThread::GetCurrent()->AsTaskQueue()));
+ return emeDecoder.forget();
+}
+
+PlatformDecoderModule::ConversionRequired
+EMEDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ if (aConfig.IsVideo() && MP4Decoder::IsH264(aConfig.mMimeType)) {
+ return ConversionRequired::kNeedAVCC;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+}
+
+bool
+EMEDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ Maybe<nsCString> gmp;
+ gmp.emplace(NS_ConvertUTF16toUTF8(mProxy->KeySystem()));
+ return GMPDecoderModule::SupportsMimeType(aMimeType, gmp);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/eme/EMEDecoderModule.h b/dom/media/platforms/agnostic/eme/EMEDecoderModule.h
new file mode 100644
index 000000000..32074ae8c
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/EMEDecoderModule.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(EMEDecoderModule_h_)
+#define EMEDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+#include "PDMFactory.h"
+#include "gmp-decryption.h"
+
+namespace mozilla {
+
+class CDMProxy;
+
+class EMEDecoderModule : public PlatformDecoderModule {
+private:
+
+public:
+ EMEDecoderModule(CDMProxy* aProxy, PDMFactory* aPDM);
+
+ virtual ~EMEDecoderModule();
+
+protected:
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+
+ bool
+ SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+private:
+ RefPtr<CDMProxy> mProxy;
+ // Will be null if CDM has decoding capability.
+ RefPtr<PDMFactory> mPDM;
+ // We run the PDM on its own task queue.
+ RefPtr<TaskQueue> mTaskQueue;
+};
+
+} // namespace mozilla
+
+#endif // EMEDecoderModule_h_
diff --git a/dom/media/platforms/agnostic/eme/EMEVideoDecoder.cpp b/dom/media/platforms/agnostic/eme/EMEVideoDecoder.cpp
new file mode 100644
index 000000000..bddb89660
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/EMEVideoDecoder.cpp
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "EMEVideoDecoder.h"
+#include "GMPVideoEncodedFrameImpl.h"
+#include "mozilla/CDMProxy.h"
+#include "MediaData.h"
+#include "MP4Decoder.h"
+#include "VPXDecoder.h"
+
+namespace mozilla {
+
+void
+EMEVideoCallbackAdapter::Error(GMPErr aErr)
+{
+ if (aErr == GMPNoKeyErr) {
+ // The GMP failed to decrypt a frame due to not having a key. This can
+ // happen if a key expires or a session is closed during playback.
+ NS_WARNING("GMP failed to decrypt due to lack of key");
+ return;
+ }
+ VideoCallbackAdapter::Error(aErr);
+}
+
+EMEVideoDecoder::EMEVideoDecoder(CDMProxy* aProxy,
+ const GMPVideoDecoderParams& aParams)
+ : GMPVideoDecoder(GMPVideoDecoderParams(aParams).WithAdapter(
+ new EMEVideoCallbackAdapter(aParams.mCallback,
+ VideoInfo(aParams.mConfig.mDisplay),
+ aParams.mImageContainer)))
+ , mProxy(aProxy)
+ , mDecryptorId(aProxy->GetDecryptorId())
+{}
+
+void
+EMEVideoDecoder::InitTags(nsTArray<nsCString>& aTags)
+{
+ VideoInfo config = GetConfig();
+ if (MP4Decoder::IsH264(config.mMimeType)) {
+ aTags.AppendElement(NS_LITERAL_CSTRING("h264"));
+ } else if (VPXDecoder::IsVP8(config.mMimeType)) {
+ aTags.AppendElement(NS_LITERAL_CSTRING("vp8"));
+ } else if (VPXDecoder::IsVP9(config.mMimeType)) {
+ aTags.AppendElement(NS_LITERAL_CSTRING("vp9"));
+ }
+ aTags.AppendElement(NS_ConvertUTF16toUTF8(mProxy->KeySystem()));
+}
+
+nsCString
+EMEVideoDecoder::GetNodeId()
+{
+ return mProxy->GetNodeId();
+}
+
+GMPUniquePtr<GMPVideoEncodedFrame>
+EMEVideoDecoder::CreateFrame(MediaRawData* aSample)
+{
+ GMPUniquePtr<GMPVideoEncodedFrame> frame = GMPVideoDecoder::CreateFrame(aSample);
+ if (frame && aSample->mCrypto.mValid) {
+ static_cast<gmp::GMPVideoEncodedFrameImpl*>(frame.get())->InitCrypto(aSample->mCrypto);
+ }
+ return frame;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/eme/EMEVideoDecoder.h b/dom/media/platforms/agnostic/eme/EMEVideoDecoder.h
new file mode 100644
index 000000000..a0f23f867
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/EMEVideoDecoder.h
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EMEVideoDecoder_h_
+#define EMEVideoDecoder_h_
+
+#include "GMPVideoDecoder.h"
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class CDMProxy;
+class TaskQueue;
+
+class EMEVideoCallbackAdapter : public VideoCallbackAdapter {
+public:
+ EMEVideoCallbackAdapter(MediaDataDecoderCallbackProxy* aCallback,
+ VideoInfo aVideoInfo,
+ layers::ImageContainer* aImageContainer)
+ : VideoCallbackAdapter(aCallback, aVideoInfo, aImageContainer)
+ {}
+
+ void Error(GMPErr aErr) override;
+};
+
+class EMEVideoDecoder : public GMPVideoDecoder {
+public:
+ EMEVideoDecoder(CDMProxy* aProxy, const GMPVideoDecoderParams& aParams);
+
+private:
+ void InitTags(nsTArray<nsCString>& aTags) override;
+ nsCString GetNodeId() override;
+ uint32_t DecryptorId() const override { return mDecryptorId; }
+ GMPUniquePtr<GMPVideoEncodedFrame> CreateFrame(MediaRawData* aSample) override;
+
+ RefPtr<CDMProxy> mProxy;
+ uint32_t mDecryptorId;
+};
+
+} // namespace mozilla
+
+#endif // EMEVideoDecoder_h_
diff --git a/dom/media/platforms/agnostic/eme/SamplesWaitingForKey.cpp b/dom/media/platforms/agnostic/eme/SamplesWaitingForKey.cpp
new file mode 100644
index 000000000..58098c2b3
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/SamplesWaitingForKey.cpp
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SamplesWaitingForKey.h"
+#include "mozilla/CDMProxy.h"
+#include "mozilla/CDMCaps.h"
+#include "MediaData.h"
+
+namespace mozilla {
+
+SamplesWaitingForKey::SamplesWaitingForKey(MediaDataDecoder* aDecoder,
+ MediaDataDecoderCallback* aCallback,
+ TaskQueue* aTaskQueue,
+ CDMProxy* aProxy)
+ : mMutex("SamplesWaitingForKey")
+ , mDecoder(aDecoder)
+ , mDecoderCallback(aCallback)
+ , mTaskQueue(aTaskQueue)
+ , mProxy(aProxy)
+{
+}
+
+SamplesWaitingForKey::~SamplesWaitingForKey()
+{
+}
+
+bool
+SamplesWaitingForKey::WaitIfKeyNotUsable(MediaRawData* aSample)
+{
+ if (!aSample || !aSample->mCrypto.mValid || !mProxy) {
+ return false;
+ }
+ CDMCaps::AutoLock caps(mProxy->Capabilites());
+ const auto& keyid = aSample->mCrypto.mKeyId;
+ if (!caps.IsKeyUsable(keyid)) {
+ {
+ MutexAutoLock lock(mMutex);
+ mSamples.AppendElement(aSample);
+ }
+ mDecoderCallback->WaitingForKey();
+ caps.NotifyWhenKeyIdUsable(aSample->mCrypto.mKeyId, this);
+ return true;
+ }
+ return false;
+}
+
+void
+SamplesWaitingForKey::NotifyUsable(const CencKeyId& aKeyId)
+{
+ MutexAutoLock lock(mMutex);
+ size_t i = 0;
+ while (i < mSamples.Length()) {
+ if (aKeyId == mSamples[i]->mCrypto.mKeyId) {
+ RefPtr<nsIRunnable> task;
+ task = NewRunnableMethod<RefPtr<MediaRawData>>(mDecoder,
+ &MediaDataDecoder::Input,
+ RefPtr<MediaRawData>(mSamples[i]));
+ mSamples.RemoveElementAt(i);
+ mTaskQueue->Dispatch(task.forget());
+ } else {
+ i++;
+ }
+ }
+}
+
+void
+SamplesWaitingForKey::Flush()
+{
+ MutexAutoLock lock(mMutex);
+ mSamples.Clear();
+}
+
+void
+SamplesWaitingForKey::BreakCycles()
+{
+ MutexAutoLock lock(mMutex);
+ mDecoder = nullptr;
+ mTaskQueue = nullptr;
+ mProxy = nullptr;
+ mSamples.Clear();
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/eme/SamplesWaitingForKey.h b/dom/media/platforms/agnostic/eme/SamplesWaitingForKey.h
new file mode 100644
index 000000000..65bb14403
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/SamplesWaitingForKey.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef SamplesWaitingForKey_h_
+#define SamplesWaitingForKey_h_
+
+#include "mozilla/TaskQueue.h"
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+typedef nsTArray<uint8_t> CencKeyId;
+
+class CDMProxy;
+
+// Encapsulates the task of waiting for the CDMProxy to have the necessary
+// keys to decrypt a given sample.
+class SamplesWaitingForKey {
+public:
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SamplesWaitingForKey)
+
+ explicit SamplesWaitingForKey(MediaDataDecoder* aDecoder,
+ MediaDataDecoderCallback* aCallback,
+ TaskQueue* aTaskQueue,
+ CDMProxy* aProxy);
+
+ // Returns true if we need to wait for a key to become usable.
+ // Will callback MediaDataDecoder::Input(aSample) on mDecoder once the
+ // sample is ready to be decrypted. The order of input samples is
+ // preserved.
+ bool WaitIfKeyNotUsable(MediaRawData* aSample);
+
+ void NotifyUsable(const CencKeyId& aKeyId);
+
+ void Flush();
+
+ void BreakCycles();
+
+protected:
+ ~SamplesWaitingForKey();
+
+private:
+ Mutex mMutex;
+ RefPtr<MediaDataDecoder> mDecoder;
+ MediaDataDecoderCallback* mDecoderCallback;
+ RefPtr<TaskQueue> mTaskQueue;
+ RefPtr<CDMProxy> mProxy;
+ nsTArray<RefPtr<MediaRawData>> mSamples;
+};
+
+} // namespace mozilla
+
+#endif // SamplesWaitingForKey_h_
diff --git a/dom/media/platforms/agnostic/eme/moz.build b/dom/media/platforms/agnostic/eme/moz.build
new file mode 100644
index 000000000..78b76d4d4
--- /dev/null
+++ b/dom/media/platforms/agnostic/eme/moz.build
@@ -0,0 +1,23 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'EMEAudioDecoder.h',
+ 'EMEDecoderModule.h',
+ 'EMEVideoDecoder.h',
+ 'SamplesWaitingForKey.h',
+]
+
+UNIFIED_SOURCES += [
+ 'EMEAudioDecoder.cpp',
+ 'EMEDecoderModule.cpp',
+ 'EMEVideoDecoder.cpp',
+ 'SamplesWaitingForKey.cpp',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.cpp b/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.cpp
new file mode 100644
index 000000000..d863d44d4
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.cpp
@@ -0,0 +1,306 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPAudioDecoder.h"
+#include "nsServiceManagerUtils.h"
+#include "MediaInfo.h"
+#include "GMPDecoderModule.h"
+#include "nsPrintfCString.h"
+
+namespace mozilla {
+
+#if defined(DEBUG)
+bool IsOnGMPThread()
+{
+ nsCOMPtr<mozIGeckoMediaPluginService> mps = do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ MOZ_ASSERT(mps);
+
+ nsCOMPtr<nsIThread> gmpThread;
+ nsresult rv = mps->GetThread(getter_AddRefs(gmpThread));
+ MOZ_ASSERT(NS_SUCCEEDED(rv) && gmpThread);
+ return NS_GetCurrentThread() == gmpThread;
+}
+#endif
+
+void
+AudioCallbackAdapter::Decoded(const nsTArray<int16_t>& aPCM, uint64_t aTimeStamp, uint32_t aChannels, uint32_t aRate)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (aRate == 0 || aChannels == 0) {
+ mCallback->Error(MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL(
+ "Invalid rate or num channels returned on GMP audio samples")));
+ return;
+ }
+
+ size_t numFrames = aPCM.Length() / aChannels;
+ MOZ_ASSERT((aPCM.Length() % aChannels) == 0);
+ AlignedAudioBuffer audioData(aPCM.Length());
+ if (!audioData) {
+ mCallback->Error(
+ MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("Unable to allocate audio buffer")));
+ return;
+ }
+
+ for (size_t i = 0; i < aPCM.Length(); ++i) {
+ audioData[i] = AudioSampleToFloat(aPCM[i]);
+ }
+
+ if (mMustRecaptureAudioPosition) {
+ mAudioFrameSum = 0;
+ auto timestamp = UsecsToFrames(aTimeStamp, aRate);
+ if (!timestamp.isValid()) {
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Invalid timestamp")));
+ return;
+ }
+ mAudioFrameOffset = timestamp.value();
+ mMustRecaptureAudioPosition = false;
+ }
+
+ auto timestamp = FramesToUsecs(mAudioFrameOffset + mAudioFrameSum, aRate);
+ if (!timestamp.isValid()) {
+ mCallback->Error(
+ MediaResult(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Invalid timestamp on audio samples")));
+ return;
+ }
+ mAudioFrameSum += numFrames;
+
+ auto duration = FramesToUsecs(numFrames, aRate);
+ if (!duration.isValid()) {
+ mCallback->Error(
+ MediaResult(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Invalid duration on audio samples")));
+ return;
+ }
+
+ RefPtr<AudioData> audio(new AudioData(mLastStreamOffset,
+ timestamp.value(),
+ duration.value(),
+ numFrames,
+ Move(audioData),
+ aChannels,
+ aRate));
+
+#ifdef LOG_SAMPLE_DECODE
+ LOG("Decoded audio sample! timestamp=%lld duration=%lld currentLength=%u",
+ timestamp, duration, currentLength);
+#endif
+
+ mCallback->Output(audio);
+}
+
+void
+AudioCallbackAdapter::InputDataExhausted()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->InputExhausted();
+}
+
+void
+AudioCallbackAdapter::DrainComplete()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->DrainComplete();
+}
+
+void
+AudioCallbackAdapter::ResetComplete()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mMustRecaptureAudioPosition = true;
+ mCallback->FlushComplete();
+}
+
+void
+AudioCallbackAdapter::Error(GMPErr aErr)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->Error(MediaResult(aErr == GMPDecodeErr
+ ? NS_ERROR_DOM_MEDIA_DECODE_ERR
+ : NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("GMPErr:%x", aErr)));
+}
+
+void
+AudioCallbackAdapter::Terminated()
+{
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Audio GMP decoder terminated.")));
+}
+
+GMPAudioDecoderParams::GMPAudioDecoderParams(const CreateDecoderParams& aParams)
+ : mConfig(aParams.AudioConfig())
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(nullptr)
+ , mAdapter(nullptr)
+ , mCrashHelper(aParams.mCrashHelper)
+{}
+
+GMPAudioDecoderParams&
+GMPAudioDecoderParams::WithCallback(MediaDataDecoderProxy* aWrapper)
+{
+ MOZ_ASSERT(aWrapper);
+ MOZ_ASSERT(!mCallback); // Should only be called once per instance.
+ mCallback = aWrapper->Callback();
+ mAdapter = nullptr;
+ return *this;
+}
+
+GMPAudioDecoderParams&
+GMPAudioDecoderParams::WithAdapter(AudioCallbackAdapter* aAdapter)
+{
+ MOZ_ASSERT(aAdapter);
+ MOZ_ASSERT(!mAdapter); // Should only be called once per instance.
+ mCallback = aAdapter->Callback();
+ mAdapter = aAdapter;
+ return *this;
+}
+
+GMPAudioDecoder::GMPAudioDecoder(const GMPAudioDecoderParams& aParams)
+ : mConfig(aParams.mConfig)
+ , mCallback(aParams.mCallback)
+ , mGMP(nullptr)
+ , mAdapter(aParams.mAdapter)
+ , mCrashHelper(aParams.mCrashHelper)
+{
+ MOZ_ASSERT(!mAdapter || mCallback == mAdapter->Callback());
+ if (!mAdapter) {
+ mAdapter = new AudioCallbackAdapter(mCallback);
+ }
+}
+
+void
+GMPAudioDecoder::InitTags(nsTArray<nsCString>& aTags)
+{
+ aTags.AppendElement(NS_LITERAL_CSTRING("aac"));
+ const Maybe<nsCString> gmp(
+ GMPDecoderModule::PreferredGMP(NS_LITERAL_CSTRING("audio/mp4a-latm")));
+ if (gmp.isSome()) {
+ aTags.AppendElement(gmp.value());
+ }
+}
+
+nsCString
+GMPAudioDecoder::GetNodeId()
+{
+ return SHARED_GMP_DECODING_NODE_ID;
+}
+
+void
+GMPAudioDecoder::GMPInitDone(GMPAudioDecoderProxy* aGMP)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (!aGMP) {
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ return;
+ }
+ if (mInitPromise.IsEmpty()) {
+ // GMP must have been shutdown while we were waiting for Init operation
+ // to complete.
+ aGMP->Close();
+ return;
+ }
+ nsTArray<uint8_t> codecSpecific;
+ codecSpecific.AppendElements(mConfig.mCodecSpecificConfig->Elements(),
+ mConfig.mCodecSpecificConfig->Length());
+
+ nsresult rv = aGMP->InitDecode(kGMPAudioCodecAAC,
+ mConfig.mChannels,
+ mConfig.mBitDepth,
+ mConfig.mRate,
+ codecSpecific,
+ mAdapter);
+ if (NS_FAILED(rv)) {
+ aGMP->Close();
+ mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ return;
+ }
+
+ mGMP = aGMP;
+ mInitPromise.Resolve(TrackInfo::kAudioTrack, __func__);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+GMPAudioDecoder::Init()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ mMPS = do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ MOZ_ASSERT(mMPS);
+
+ RefPtr<InitPromise> promise(mInitPromise.Ensure(__func__));
+
+ nsTArray<nsCString> tags;
+ InitTags(tags);
+ UniquePtr<GetGMPAudioDecoderCallback> callback(new GMPInitDoneCallback(this));
+ if (NS_FAILED(mMPS->GetGMPAudioDecoder(mCrashHelper, &tags, GetNodeId(), Move(callback)))) {
+ mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return promise;
+}
+
+void
+GMPAudioDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ RefPtr<MediaRawData> sample(aSample);
+ if (!mGMP) {
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("mGMP not initialized")));
+ return;
+ }
+
+ mAdapter->SetLastStreamOffset(sample->mOffset);
+
+ gmp::GMPAudioSamplesImpl samples(sample, mConfig.mChannels, mConfig.mRate);
+ nsresult rv = mGMP->Decode(samples);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(MediaResult(rv, __func__));
+ }
+}
+
+void
+GMPAudioDecoder::Flush()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (!mGMP || NS_FAILED(mGMP->Reset())) {
+ // Abort the flush.
+ mCallback->FlushComplete();
+ }
+}
+
+void
+GMPAudioDecoder::Drain()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (!mGMP || NS_FAILED(mGMP->Drain())) {
+ mCallback->DrainComplete();
+ }
+}
+
+void
+GMPAudioDecoder::Shutdown()
+{
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ if (!mGMP) {
+ return;
+ }
+ // Note this unblocks flush and drain operations waiting for callbacks.
+ mGMP->Close();
+ mGMP = nullptr;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.h b/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.h
new file mode 100644
index 000000000..90e3ebdb6
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/GMPAudioDecoder.h
@@ -0,0 +1,112 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GMPAudioDecoder_h_)
+#define GMPAudioDecoder_h_
+
+#include "GMPAudioDecoderProxy.h"
+#include "MediaDataDecoderProxy.h"
+#include "PlatformDecoderModule.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+
+class AudioCallbackAdapter : public GMPAudioDecoderCallbackProxy {
+public:
+ explicit AudioCallbackAdapter(MediaDataDecoderCallbackProxy* aCallback)
+ : mCallback(aCallback)
+ , mLastStreamOffset(0)
+ , mAudioFrameSum(0)
+ , mAudioFrameOffset(0)
+ , mMustRecaptureAudioPosition(true)
+ {}
+
+ MediaDataDecoderCallbackProxy* Callback() const { return mCallback; }
+
+ // GMPAudioDecoderCallbackProxy
+ void Decoded(const nsTArray<int16_t>& aPCM, uint64_t aTimeStamp, uint32_t aChannels, uint32_t aRate) override;
+ void InputDataExhausted() override;
+ void DrainComplete() override;
+ void ResetComplete() override;
+ void Error(GMPErr aErr) override;
+ void Terminated() override;
+
+ void SetLastStreamOffset(int64_t aStreamOffset) {
+ mLastStreamOffset = aStreamOffset;
+ }
+
+private:
+ MediaDataDecoderCallbackProxy* mCallback;
+ int64_t mLastStreamOffset;
+
+ int64_t mAudioFrameSum;
+ int64_t mAudioFrameOffset;
+ bool mMustRecaptureAudioPosition;
+};
+
+struct GMPAudioDecoderParams {
+ explicit GMPAudioDecoderParams(const CreateDecoderParams& aParams);
+ GMPAudioDecoderParams& WithCallback(MediaDataDecoderProxy* aWrapper);
+ GMPAudioDecoderParams& WithAdapter(AudioCallbackAdapter* aAdapter);
+
+ const AudioInfo& mConfig;
+ TaskQueue* mTaskQueue;
+ MediaDataDecoderCallbackProxy* mCallback;
+ AudioCallbackAdapter* mAdapter;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+};
+
+class GMPAudioDecoder : public MediaDataDecoder {
+public:
+ explicit GMPAudioDecoder(const GMPAudioDecoderParams& aParams);
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ const char* GetDescriptionName() const override
+ {
+ return "GMP audio decoder";
+ }
+
+protected:
+ virtual void InitTags(nsTArray<nsCString>& aTags);
+ virtual nsCString GetNodeId();
+
+private:
+
+ class GMPInitDoneCallback : public GetGMPAudioDecoderCallback
+ {
+ public:
+ explicit GMPInitDoneCallback(GMPAudioDecoder* aDecoder)
+ : mDecoder(aDecoder)
+ {
+ }
+
+ void Done(GMPAudioDecoderProxy* aGMP) override
+ {
+ mDecoder->GMPInitDone(aGMP);
+ }
+
+ private:
+ RefPtr<GMPAudioDecoder> mDecoder;
+ };
+ void GMPInitDone(GMPAudioDecoderProxy* aGMP);
+
+ const AudioInfo mConfig;
+ MediaDataDecoderCallbackProxy* mCallback;
+ nsCOMPtr<mozIGeckoMediaPluginService> mMPS;
+ GMPAudioDecoderProxy* mGMP;
+ nsAutoPtr<AudioCallbackAdapter> mAdapter;
+ MozPromiseHolder<InitPromise> mInitPromise;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+};
+
+} // namespace mozilla
+
+#endif // GMPAudioDecoder_h_
diff --git a/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp b/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp
new file mode 100644
index 000000000..cc53d2c93
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/GMPDecoderModule.cpp
@@ -0,0 +1,172 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPDecoderModule.h"
+#include "DecoderDoctorDiagnostics.h"
+#include "GMPAudioDecoder.h"
+#include "GMPVideoDecoder.h"
+#include "GMPUtils.h"
+#include "MediaDataDecoderProxy.h"
+#include "MediaPrefs.h"
+#include "VideoUtils.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "nsServiceManagerUtils.h"
+#include "mozilla/StaticMutex.h"
+#include "gmp-audio-decode.h"
+#include "gmp-video-decode.h"
+#include "MP4Decoder.h"
+#include "VPXDecoder.h"
+#ifdef XP_WIN
+#include "WMFDecoderModule.h"
+#endif
+
+namespace mozilla {
+
+GMPDecoderModule::GMPDecoderModule()
+{
+}
+
+GMPDecoderModule::~GMPDecoderModule()
+{
+}
+
+static already_AddRefed<MediaDataDecoderProxy>
+CreateDecoderWrapper(MediaDataDecoderCallback* aCallback)
+{
+ RefPtr<gmp::GeckoMediaPluginService> s(gmp::GeckoMediaPluginService::GetGeckoMediaPluginService());
+ if (!s) {
+ return nullptr;
+ }
+ RefPtr<AbstractThread> thread(s->GetAbstractGMPThread());
+ if (!thread) {
+ return nullptr;
+ }
+ RefPtr<MediaDataDecoderProxy> decoder(new MediaDataDecoderProxy(thread.forget(), aCallback));
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+GMPDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ if (!MP4Decoder::IsH264(aParams.mConfig.mMimeType) &&
+ !VPXDecoder::IsVP8(aParams.mConfig.mMimeType) &&
+ !VPXDecoder::IsVP9(aParams.mConfig.mMimeType)) {
+ return nullptr;
+ }
+
+ if (aParams.mDiagnostics) {
+ const Maybe<nsCString> preferredGMP = PreferredGMP(aParams.mConfig.mMimeType);
+ if (preferredGMP.isSome()) {
+ aParams.mDiagnostics->SetGMP(preferredGMP.value());
+ }
+ }
+
+ RefPtr<MediaDataDecoderProxy> wrapper = CreateDecoderWrapper(aParams.mCallback);
+ auto params = GMPVideoDecoderParams(aParams).WithCallback(wrapper);
+ wrapper->SetProxyTarget(new GMPVideoDecoder(params));
+ return wrapper.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+GMPDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ if (!aParams.mConfig.mMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ return nullptr;
+ }
+
+ if (aParams.mDiagnostics) {
+ const Maybe<nsCString> preferredGMP = PreferredGMP(aParams.mConfig.mMimeType);
+ if (preferredGMP.isSome()) {
+ aParams.mDiagnostics->SetGMP(preferredGMP.value());
+ }
+ }
+
+ RefPtr<MediaDataDecoderProxy> wrapper = CreateDecoderWrapper(aParams.mCallback);
+ auto params = GMPAudioDecoderParams(aParams).WithCallback(wrapper);
+ wrapper->SetProxyTarget(new GMPAudioDecoder(params));
+ return wrapper.forget();
+}
+
+PlatformDecoderModule::ConversionRequired
+GMPDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ // GMPVideoCodecType::kGMPVideoCodecH264 specifies that encoded frames must be in AVCC format.
+ if (aConfig.IsVideo() && MP4Decoder::IsH264(aConfig.mMimeType)) {
+ return ConversionRequired::kNeedAVCC;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+}
+
+/* static */
+const Maybe<nsCString>
+GMPDecoderModule::PreferredGMP(const nsACString& aMimeType)
+{
+ Maybe<nsCString> rv;
+ if (aMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ switch (MediaPrefs::GMPAACPreferred()) {
+ case 1: rv.emplace(kEMEKeySystemClearkey); break;
+ case 2: rv.emplace(kEMEKeySystemPrimetime); break;
+ default: break;
+ }
+ }
+
+ if (MP4Decoder::IsH264(aMimeType)) {
+ switch (MediaPrefs::GMPH264Preferred()) {
+ case 1: rv.emplace(kEMEKeySystemClearkey); break;
+ case 2: rv.emplace(kEMEKeySystemPrimetime); break;
+ default: break;
+ }
+ }
+
+ return rv;
+}
+
+/* static */
+bool
+GMPDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ const Maybe<nsCString>& aGMP)
+{
+ if (aGMP.isNothing()) {
+ return false;
+ }
+
+ if (MP4Decoder::IsH264(aMimeType)) {
+ return HaveGMPFor(NS_LITERAL_CSTRING(GMP_API_VIDEO_DECODER),
+ { NS_LITERAL_CSTRING("h264"), aGMP.value()});
+ }
+
+ if (VPXDecoder::IsVP9(aMimeType)) {
+ return HaveGMPFor(NS_LITERAL_CSTRING(GMP_API_VIDEO_DECODER),
+ { NS_LITERAL_CSTRING("vp9"), aGMP.value()});
+ }
+
+ if (VPXDecoder::IsVP8(aMimeType)) {
+ return HaveGMPFor(NS_LITERAL_CSTRING(GMP_API_VIDEO_DECODER),
+ { NS_LITERAL_CSTRING("vp8"), aGMP.value()});
+ }
+
+ if (MP4Decoder::IsAAC(aMimeType)) {
+ return HaveGMPFor(NS_LITERAL_CSTRING(GMP_API_AUDIO_DECODER),
+ { NS_LITERAL_CSTRING("aac"), aGMP.value()});
+ }
+
+ return false;
+}
+
+bool
+GMPDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ const Maybe<nsCString> preferredGMP = PreferredGMP(aMimeType);
+ bool rv = SupportsMimeType(aMimeType, preferredGMP);
+ if (rv && aDiagnostics && preferredGMP.isSome()) {
+ aDiagnostics->SetGMP(preferredGMP.value());
+ }
+ return rv;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/gmp/GMPDecoderModule.h b/dom/media/platforms/agnostic/gmp/GMPDecoderModule.h
new file mode 100644
index 000000000..b501ecb54
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/GMPDecoderModule.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GMPDecoderModule_h_)
+#define GMPDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+#include "mozilla/Maybe.h"
+
+// The special NodeId we use when doing unencrypted decoding using the GMP's
+// decoder. This ensures that each GMP MediaDataDecoder we create doesn't
+// require spinning up a new process, but instead we run all instances of
+// GMP decoders in the one process, to reduce overhead.
+//
+// Note: GMP storage is isolated by NodeId, and non persistent for this
+// special NodeId, and the only way a GMP can communicate with the outside
+// world is through the EME GMP APIs, and we never run EME with this NodeID
+// (because NodeIds are random strings which can't contain the '-' character),
+// so there's no way a malicious GMP can harvest, store, and then report any
+// privacy sensitive data about what users are watching.
+#define SHARED_GMP_DECODING_NODE_ID NS_LITERAL_CSTRING("gmp-shared-decoding")
+
+namespace mozilla {
+
+class GMPDecoderModule : public PlatformDecoderModule {
+public:
+ GMPDecoderModule();
+
+ virtual ~GMPDecoderModule();
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+
+ bool
+ SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ static const Maybe<nsCString> PreferredGMP(const nsACString& aMimeType);
+
+ static bool SupportsMimeType(const nsACString& aMimeType,
+ const Maybe<nsCString>& aGMP);
+};
+
+} // namespace mozilla
+
+#endif // GMPDecoderModule_h_
diff --git a/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp
new file mode 100644
index 000000000..912b88ce1
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp
@@ -0,0 +1,387 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GMPVideoDecoder.h"
+#include "GMPVideoHost.h"
+#include "mozilla/EndianUtils.h"
+#include "prsystem.h"
+#include "MediaData.h"
+#include "GMPDecoderModule.h"
+#include "VPXDecoder.h"
+
+namespace mozilla {
+
+#if defined(DEBUG)
+extern bool IsOnGMPThread();
+#endif
+
+void
+VideoCallbackAdapter::Decoded(GMPVideoi420Frame* aDecodedFrame)
+{
+ GMPUniquePtr<GMPVideoi420Frame> decodedFrame(aDecodedFrame);
+
+ MOZ_ASSERT(IsOnGMPThread());
+
+ VideoData::YCbCrBuffer b;
+ for (int i = 0; i < kGMPNumOfPlanes; ++i) {
+ b.mPlanes[i].mData = decodedFrame->Buffer(GMPPlaneType(i));
+ b.mPlanes[i].mStride = decodedFrame->Stride(GMPPlaneType(i));
+ if (i == kGMPYPlane) {
+ b.mPlanes[i].mWidth = decodedFrame->Width();
+ b.mPlanes[i].mHeight = decodedFrame->Height();
+ } else {
+ b.mPlanes[i].mWidth = (decodedFrame->Width() + 1) / 2;
+ b.mPlanes[i].mHeight = (decodedFrame->Height() + 1) / 2;
+ }
+ b.mPlanes[i].mOffset = 0;
+ b.mPlanes[i].mSkip = 0;
+ }
+
+ gfx::IntRect pictureRegion(0, 0, decodedFrame->Width(), decodedFrame->Height());
+ RefPtr<VideoData> v =
+ VideoData::CreateAndCopyData(mVideoInfo,
+ mImageContainer,
+ mLastStreamOffset,
+ decodedFrame->Timestamp(),
+ decodedFrame->Duration(),
+ b,
+ false,
+ -1,
+ pictureRegion);
+ if (v) {
+ mCallback->Output(v);
+ } else {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__));
+ }
+}
+
+void
+VideoCallbackAdapter::ReceivedDecodedReferenceFrame(const uint64_t aPictureId)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+}
+
+void
+VideoCallbackAdapter::ReceivedDecodedFrame(const uint64_t aPictureId)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+}
+
+void
+VideoCallbackAdapter::InputDataExhausted()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->InputExhausted();
+}
+
+void
+VideoCallbackAdapter::DrainComplete()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->DrainComplete();
+}
+
+void
+VideoCallbackAdapter::ResetComplete()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->FlushComplete();
+}
+
+void
+VideoCallbackAdapter::Error(GMPErr aErr)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+ mCallback->Error(MediaResult(aErr == GMPDecodeErr
+ ? NS_ERROR_DOM_MEDIA_DECODE_ERR
+ : NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("GMPErr:%x", aErr)));
+}
+
+void
+VideoCallbackAdapter::Terminated()
+{
+ // Note that this *may* be called from the proxy thread also.
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Video GMP decoder terminated.")));
+}
+
+GMPVideoDecoderParams::GMPVideoDecoderParams(const CreateDecoderParams& aParams)
+ : mConfig(aParams.VideoConfig())
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(nullptr)
+ , mAdapter(nullptr)
+ , mImageContainer(aParams.mImageContainer)
+ , mLayersBackend(aParams.GetLayersBackend())
+ , mCrashHelper(aParams.mCrashHelper)
+{}
+
+GMPVideoDecoderParams&
+GMPVideoDecoderParams::WithCallback(MediaDataDecoderProxy* aWrapper)
+{
+ MOZ_ASSERT(aWrapper);
+ MOZ_ASSERT(!mCallback); // Should only be called once per instance.
+ mCallback = aWrapper->Callback();
+ mAdapter = nullptr;
+ return *this;
+}
+
+GMPVideoDecoderParams&
+GMPVideoDecoderParams::WithAdapter(VideoCallbackAdapter* aAdapter)
+{
+ MOZ_ASSERT(aAdapter);
+ MOZ_ASSERT(!mAdapter); // Should only be called once per instance.
+ mCallback = aAdapter->Callback();
+ mAdapter = aAdapter;
+ return *this;
+}
+
+GMPVideoDecoder::GMPVideoDecoder(const GMPVideoDecoderParams& aParams)
+ : mConfig(aParams.mConfig)
+ , mCallback(aParams.mCallback)
+ , mGMP(nullptr)
+ , mHost(nullptr)
+ , mAdapter(aParams.mAdapter)
+ , mConvertNALUnitLengths(false)
+ , mCrashHelper(aParams.mCrashHelper)
+{
+ MOZ_ASSERT(!mAdapter || mCallback == mAdapter->Callback());
+ if (!mAdapter) {
+ mAdapter = new VideoCallbackAdapter(mCallback,
+ VideoInfo(mConfig.mDisplay.width,
+ mConfig.mDisplay.height),
+ aParams.mImageContainer);
+ }
+}
+
+void
+GMPVideoDecoder::InitTags(nsTArray<nsCString>& aTags)
+{
+ if (MP4Decoder::IsH264(mConfig.mMimeType)) {
+ aTags.AppendElement(NS_LITERAL_CSTRING("h264"));
+ const Maybe<nsCString> gmp(
+ GMPDecoderModule::PreferredGMP(NS_LITERAL_CSTRING("video/avc")));
+ if (gmp.isSome()) {
+ aTags.AppendElement(gmp.value());
+ }
+ } else if (VPXDecoder::IsVP8(mConfig.mMimeType)) {
+ aTags.AppendElement(NS_LITERAL_CSTRING("vp8"));
+ } else if (VPXDecoder::IsVP9(mConfig.mMimeType)) {
+ aTags.AppendElement(NS_LITERAL_CSTRING("vp9"));
+ }
+}
+
+nsCString
+GMPVideoDecoder::GetNodeId()
+{
+ return SHARED_GMP_DECODING_NODE_ID;
+}
+
+GMPUniquePtr<GMPVideoEncodedFrame>
+GMPVideoDecoder::CreateFrame(MediaRawData* aSample)
+{
+ GMPVideoFrame* ftmp = nullptr;
+ GMPErr err = mHost->CreateFrame(kGMPEncodedVideoFrame, &ftmp);
+ if (GMP_FAILED(err)) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("Host::CreateFrame:%x", err)));
+ return nullptr;
+ }
+
+ GMPUniquePtr<GMPVideoEncodedFrame> frame(static_cast<GMPVideoEncodedFrame*>(ftmp));
+ err = frame->CreateEmptyFrame(aSample->Size());
+ if (GMP_FAILED(err)) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("GMPVideoEncodedFrame::CreateEmptyFrame:%x", err)));
+ return nullptr;
+ }
+
+ memcpy(frame->Buffer(), aSample->Data(), frame->Size());
+
+ // Convert 4-byte NAL unit lengths to host-endian 4-byte buffer lengths to
+ // suit the GMP API.
+ if (mConvertNALUnitLengths) {
+ const int kNALLengthSize = 4;
+ uint8_t* buf = frame->Buffer();
+ while (buf < frame->Buffer() + frame->Size() - kNALLengthSize) {
+ uint32_t length = BigEndian::readUint32(buf) + kNALLengthSize;
+ *reinterpret_cast<uint32_t *>(buf) = length;
+ buf += length;
+ }
+ }
+
+ frame->SetBufferType(GMP_BufferLength32);
+
+ frame->SetEncodedWidth(mConfig.mDisplay.width);
+ frame->SetEncodedHeight(mConfig.mDisplay.height);
+ frame->SetTimeStamp(aSample->mTime);
+ frame->SetCompleteFrame(true);
+ frame->SetDuration(aSample->mDuration);
+ frame->SetFrameType(aSample->mKeyframe ? kGMPKeyFrame : kGMPDeltaFrame);
+
+ return frame;
+}
+
+const VideoInfo&
+GMPVideoDecoder::GetConfig() const
+{
+ return mConfig;
+}
+
+void
+GMPVideoDecoder::GMPInitDone(GMPVideoDecoderProxy* aGMP, GMPVideoHost* aHost)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (!aGMP) {
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ return;
+ }
+ MOZ_ASSERT(aHost);
+
+ if (mInitPromise.IsEmpty()) {
+ // GMP must have been shutdown while we were waiting for Init operation
+ // to complete.
+ aGMP->Close();
+ return;
+ }
+
+ GMPVideoCodec codec;
+ memset(&codec, 0, sizeof(codec));
+
+ codec.mGMPApiVersion = kGMPVersion33;
+ nsTArray<uint8_t> codecSpecific;
+ if (MP4Decoder::IsH264(mConfig.mMimeType)) {
+ codec.mCodecType = kGMPVideoCodecH264;
+ codecSpecific.AppendElement(0); // mPacketizationMode.
+ codecSpecific.AppendElements(mConfig.mExtraData->Elements(),
+ mConfig.mExtraData->Length());
+ } else if (VPXDecoder::IsVP8(mConfig.mMimeType)) {
+ codec.mCodecType = kGMPVideoCodecVP8;
+ } else if (VPXDecoder::IsVP9(mConfig.mMimeType)) {
+ codec.mCodecType = kGMPVideoCodecVP9;
+ } else {
+ // Unrecognized mime type
+ aGMP->Close();
+ mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ return;
+ }
+ codec.mWidth = mConfig.mImage.width;
+ codec.mHeight = mConfig.mImage.height;
+
+ nsresult rv = aGMP->InitDecode(codec,
+ codecSpecific,
+ mAdapter,
+ PR_GetNumberOfProcessors());
+ if (NS_FAILED(rv)) {
+ aGMP->Close();
+ mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ return;
+ }
+
+ mGMP = aGMP;
+ mHost = aHost;
+
+ // GMP implementations have interpreted the meaning of GMP_BufferLength32
+ // differently. The OpenH264 GMP expects GMP_BufferLength32 to behave as
+ // specified in the GMP API, where each buffer is prefixed by a 32-bit
+ // host-endian buffer length that includes the size of the buffer length
+ // field. Other existing GMPs currently expect GMP_BufferLength32 (when
+ // combined with kGMPVideoCodecH264) to mean "like AVCC but restricted to
+ // 4-byte NAL lengths" (i.e. buffer lengths are specified in big-endian
+ // and do not include the length of the buffer length field.
+ mConvertNALUnitLengths = mGMP->GetDisplayName().EqualsLiteral("gmpopenh264");
+
+ mInitPromise.Resolve(TrackInfo::kVideoTrack, __func__);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+GMPVideoDecoder::Init()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ mMPS = do_GetService("@mozilla.org/gecko-media-plugin-service;1");
+ MOZ_ASSERT(mMPS);
+
+ RefPtr<InitPromise> promise(mInitPromise.Ensure(__func__));
+
+ nsTArray<nsCString> tags;
+ InitTags(tags);
+ UniquePtr<GetGMPVideoDecoderCallback> callback(new GMPInitDoneCallback(this));
+ if (NS_FAILED(mMPS->GetDecryptingGMPVideoDecoder(mCrashHelper,
+ &tags,
+ GetNodeId(),
+ Move(callback),
+ DecryptorId()))) {
+ mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return promise;
+}
+
+void
+GMPVideoDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ RefPtr<MediaRawData> sample(aSample);
+ if (!mGMP) {
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("mGMP not initialized")));
+ return;
+ }
+
+ mAdapter->SetLastStreamOffset(sample->mOffset);
+
+ GMPUniquePtr<GMPVideoEncodedFrame> frame = CreateFrame(sample);
+ if (!frame) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("CreateFrame returned null")));
+ return;
+ }
+ nsTArray<uint8_t> info; // No codec specific per-frame info to pass.
+ nsresult rv = mGMP->Decode(Move(frame), false, info, 0);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("mGMP->Decode:%x", rv)));
+ }
+}
+
+void
+GMPVideoDecoder::Flush()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (!mGMP || NS_FAILED(mGMP->Reset())) {
+ // Abort the flush.
+ mCallback->FlushComplete();
+ }
+}
+
+void
+GMPVideoDecoder::Drain()
+{
+ MOZ_ASSERT(IsOnGMPThread());
+
+ if (!mGMP || NS_FAILED(mGMP->Drain())) {
+ mCallback->DrainComplete();
+ }
+}
+
+void
+GMPVideoDecoder::Shutdown()
+{
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+ // Note that this *may* be called from the proxy thread also.
+ if (!mGMP) {
+ return;
+ }
+ // Note this unblocks flush and drain operations waiting for callbacks.
+ mGMP->Close();
+ mGMP = nullptr;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.h b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.h
new file mode 100644
index 000000000..900ef4553
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.h
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GMPVideoDecoder_h_)
+#define GMPVideoDecoder_h_
+
+#include "GMPVideoDecoderProxy.h"
+#include "ImageContainer.h"
+#include "MediaDataDecoderProxy.h"
+#include "PlatformDecoderModule.h"
+#include "mozIGeckoMediaPluginService.h"
+#include "MediaInfo.h"
+
+namespace mozilla {
+
+class VideoCallbackAdapter : public GMPVideoDecoderCallbackProxy {
+public:
+ VideoCallbackAdapter(MediaDataDecoderCallbackProxy* aCallback,
+ VideoInfo aVideoInfo,
+ layers::ImageContainer* aImageContainer)
+ : mCallback(aCallback)
+ , mLastStreamOffset(0)
+ , mVideoInfo(aVideoInfo)
+ , mImageContainer(aImageContainer)
+ {}
+
+ MediaDataDecoderCallbackProxy* Callback() const { return mCallback; }
+
+ // GMPVideoDecoderCallbackProxy
+ void Decoded(GMPVideoi420Frame* aDecodedFrame) override;
+ void ReceivedDecodedReferenceFrame(const uint64_t aPictureId) override;
+ void ReceivedDecodedFrame(const uint64_t aPictureId) override;
+ void InputDataExhausted() override;
+ void DrainComplete() override;
+ void ResetComplete() override;
+ void Error(GMPErr aErr) override;
+ void Terminated() override;
+
+ void SetLastStreamOffset(int64_t aStreamOffset) {
+ mLastStreamOffset = aStreamOffset;
+ }
+
+private:
+ MediaDataDecoderCallbackProxy* mCallback;
+ int64_t mLastStreamOffset;
+
+ VideoInfo mVideoInfo;
+ RefPtr<layers::ImageContainer> mImageContainer;
+};
+
+struct GMPVideoDecoderParams {
+ explicit GMPVideoDecoderParams(const CreateDecoderParams& aParams);
+ GMPVideoDecoderParams& WithCallback(MediaDataDecoderProxy* aWrapper);
+ GMPVideoDecoderParams& WithAdapter(VideoCallbackAdapter* aAdapter);
+
+ const VideoInfo& mConfig;
+ TaskQueue* mTaskQueue;
+ MediaDataDecoderCallbackProxy* mCallback;
+ VideoCallbackAdapter* mAdapter;
+ layers::ImageContainer* mImageContainer;
+ layers::LayersBackend mLayersBackend;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+};
+
+class GMPVideoDecoder : public MediaDataDecoder {
+public:
+ explicit GMPVideoDecoder(const GMPVideoDecoderParams& aParams);
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ const char* GetDescriptionName() const override
+ {
+ return "GMP video decoder";
+ }
+
+protected:
+ virtual void InitTags(nsTArray<nsCString>& aTags);
+ virtual nsCString GetNodeId();
+ virtual uint32_t DecryptorId() const { return 0; }
+ virtual GMPUniquePtr<GMPVideoEncodedFrame> CreateFrame(MediaRawData* aSample);
+ virtual const VideoInfo& GetConfig() const;
+
+private:
+
+ class GMPInitDoneCallback : public GetGMPVideoDecoderCallback
+ {
+ public:
+ explicit GMPInitDoneCallback(GMPVideoDecoder* aDecoder)
+ : mDecoder(aDecoder)
+ {
+ }
+
+ void Done(GMPVideoDecoderProxy* aGMP, GMPVideoHost* aHost) override
+ {
+ mDecoder->GMPInitDone(aGMP, aHost);
+ }
+
+ private:
+ RefPtr<GMPVideoDecoder> mDecoder;
+ };
+ void GMPInitDone(GMPVideoDecoderProxy* aGMP, GMPVideoHost* aHost);
+
+ const VideoInfo mConfig;
+ MediaDataDecoderCallbackProxy* mCallback;
+ nsCOMPtr<mozIGeckoMediaPluginService> mMPS;
+ GMPVideoDecoderProxy* mGMP;
+ GMPVideoHost* mHost;
+ nsAutoPtr<VideoCallbackAdapter> mAdapter;
+ bool mConvertNALUnitLengths;
+ MozPromiseHolder<InitPromise> mInitPromise;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+};
+
+} // namespace mozilla
+
+#endif // GMPVideoDecoder_h_
diff --git a/dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.cpp b/dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.cpp
new file mode 100644
index 000000000..5a196f8e6
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.cpp
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaDataDecoderProxy.h"
+#include "MediaData.h"
+
+namespace mozilla {
+
+void
+MediaDataDecoderCallbackProxy::Error(const MediaResult& aError)
+{
+ mProxyCallback->Error(aError);
+}
+
+void
+MediaDataDecoderCallbackProxy::FlushComplete()
+{
+ mProxyDecoder->FlushComplete();
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+MediaDataDecoderProxy::InternalInit()
+{
+ return mProxyDecoder->Init();
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+MediaDataDecoderProxy::Init()
+{
+ MOZ_ASSERT(!mIsShutdown);
+
+ return InvokeAsync(mProxyThread, this, __func__,
+ &MediaDataDecoderProxy::InternalInit);
+}
+
+void
+MediaDataDecoderProxy::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(!IsOnProxyThread());
+ MOZ_ASSERT(!mIsShutdown);
+
+ nsCOMPtr<nsIRunnable> task(new InputTask(mProxyDecoder, aSample));
+ mProxyThread->Dispatch(task.forget());
+}
+
+void
+MediaDataDecoderProxy::Flush()
+{
+ MOZ_ASSERT(!IsOnProxyThread());
+ MOZ_ASSERT(!mIsShutdown);
+
+ mFlushComplete.Set(false);
+
+ mProxyThread->Dispatch(NewRunnableMethod(mProxyDecoder, &MediaDataDecoder::Flush));
+
+ mFlushComplete.WaitUntil(true);
+}
+
+void
+MediaDataDecoderProxy::Drain()
+{
+ MOZ_ASSERT(!IsOnProxyThread());
+ MOZ_ASSERT(!mIsShutdown);
+
+ mProxyThread->Dispatch(NewRunnableMethod(mProxyDecoder, &MediaDataDecoder::Drain));
+}
+
+void
+MediaDataDecoderProxy::Shutdown()
+{
+ // Note that this *may* be called from the proxy thread also.
+ MOZ_ASSERT(!mIsShutdown);
+#if defined(DEBUG)
+ mIsShutdown = true;
+#endif
+ mProxyThread->AsXPCOMThread()->Dispatch(NewRunnableMethod(mProxyDecoder,
+ &MediaDataDecoder::Shutdown),
+ NS_DISPATCH_SYNC);
+}
+
+void
+MediaDataDecoderProxy::FlushComplete()
+{
+ mFlushComplete.Set(true);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.h b/dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.h
new file mode 100644
index 000000000..735b6126e
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/MediaDataDecoderProxy.h
@@ -0,0 +1,181 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaDataDecoderProxy_h_)
+#define MediaDataDecoderProxy_h_
+
+#include "PlatformDecoderModule.h"
+#include "mozilla/RefPtr.h"
+#include "nsThreadUtils.h"
+#include "nscore.h"
+#include "GMPService.h"
+
+namespace mozilla {
+
+class InputTask : public Runnable {
+public:
+ InputTask(MediaDataDecoder* aDecoder,
+ MediaRawData* aSample)
+ : mDecoder(aDecoder)
+ , mSample(aSample)
+ {}
+
+ NS_IMETHOD Run() override {
+ mDecoder->Input(mSample);
+ return NS_OK;
+ }
+
+private:
+ RefPtr<MediaDataDecoder> mDecoder;
+ RefPtr<MediaRawData> mSample;
+};
+
+template<typename T>
+class Condition {
+public:
+ explicit Condition(T aValue)
+ : mMonitor("Condition")
+ , mCondition(aValue)
+ {}
+
+ void Set(T aValue) {
+ MonitorAutoLock mon(mMonitor);
+ mCondition = aValue;
+ mon.NotifyAll();
+ }
+
+ void WaitUntil(T aValue) {
+ MonitorAutoLock mon(mMonitor);
+ while (mCondition != aValue) {
+ mon.Wait();
+ }
+ }
+
+private:
+ Monitor mMonitor;
+ T mCondition;
+};
+
+class MediaDataDecoderProxy;
+
+class MediaDataDecoderCallbackProxy : public MediaDataDecoderCallback {
+public:
+ MediaDataDecoderCallbackProxy(MediaDataDecoderProxy* aProxyDecoder,
+ MediaDataDecoderCallback* aCallback)
+ : mProxyDecoder(aProxyDecoder)
+ , mProxyCallback(aCallback)
+ {
+ }
+
+ void Output(MediaData* aData) override {
+ mProxyCallback->Output(aData);
+ }
+
+ void Error(const MediaResult& aError) override;
+
+ void InputExhausted() override {
+ mProxyCallback->InputExhausted();
+ }
+
+ void DrainComplete() override {
+ mProxyCallback->DrainComplete();
+ }
+
+ void ReleaseMediaResources() override {
+ mProxyCallback->ReleaseMediaResources();
+ }
+
+ void FlushComplete();
+
+ bool OnReaderTaskQueue() override
+ {
+ return mProxyCallback->OnReaderTaskQueue();
+ }
+
+ void WaitingForKey() override
+ {
+ mProxyCallback->WaitingForKey();
+ }
+
+private:
+ MediaDataDecoderProxy* mProxyDecoder;
+ MediaDataDecoderCallback* mProxyCallback;
+};
+
+class MediaDataDecoderProxy : public MediaDataDecoder {
+public:
+ MediaDataDecoderProxy(already_AddRefed<AbstractThread> aProxyThread,
+ MediaDataDecoderCallback* aCallback)
+ : mProxyThread(aProxyThread)
+ , mProxyCallback(this, aCallback)
+ , mFlushComplete(false)
+#if defined(DEBUG)
+ , mIsShutdown(false)
+#endif
+ {
+ }
+
+ // Ideally, this would return a regular MediaDataDecoderCallback pointer
+ // to retain the clean abstraction, but until MediaDataDecoderCallback
+ // supports the FlushComplete interface, this will have to do. When MDDC
+ // supports FlushComplete, this, the GMP*Decoders, and the
+ // *CallbackAdapters can be reverted to accepting a regular
+ // MediaDataDecoderCallback pointer.
+ MediaDataDecoderCallbackProxy* Callback()
+ {
+ return &mProxyCallback;
+ }
+
+ void SetProxyTarget(MediaDataDecoder* aProxyDecoder)
+ {
+ MOZ_ASSERT(aProxyDecoder);
+ mProxyDecoder = aProxyDecoder;
+ }
+
+ // These are called from the decoder thread pool.
+ // Init and Shutdown run synchronously on the proxy thread, all others are
+ // asynchronously and responded to via the MediaDataDecoderCallback.
+ // Note: the nsresults returned by the proxied decoder are lost.
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "GMP proxy data decoder";
+ }
+
+ // Called by MediaDataDecoderCallbackProxy.
+ void FlushComplete();
+
+private:
+ RefPtr<InitPromise> InternalInit();
+
+#ifdef DEBUG
+ bool IsOnProxyThread() {
+ return mProxyThread && mProxyThread->IsCurrentThreadIn();
+ }
+#endif
+
+ friend class InputTask;
+ friend class InitTask;
+
+ RefPtr<MediaDataDecoder> mProxyDecoder;
+ RefPtr<AbstractThread> mProxyThread;
+
+ MediaDataDecoderCallbackProxy mProxyCallback;
+
+ Condition<bool> mFlushComplete;
+#if defined(DEBUG)
+ bool mIsShutdown;
+#endif
+};
+
+} // namespace mozilla
+
+#endif // MediaDataDecoderProxy_h_
diff --git a/dom/media/platforms/agnostic/gmp/moz.build b/dom/media/platforms/agnostic/gmp/moz.build
new file mode 100644
index 000000000..eb2738e26
--- /dev/null
+++ b/dom/media/platforms/agnostic/gmp/moz.build
@@ -0,0 +1,24 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'GMPAudioDecoder.h',
+ 'GMPDecoderModule.h',
+ 'GMPVideoDecoder.h',
+ 'MediaDataDecoderProxy.h',
+]
+
+UNIFIED_SOURCES += [
+ 'GMPAudioDecoder.cpp',
+ 'GMPDecoderModule.cpp',
+ 'GMPVideoDecoder.cpp',
+ 'MediaDataDecoderProxy.cpp',
+]
+
+# GMPVideoEncodedFrameImpl.h needs IPC
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/android/AndroidDecoderModule.cpp b/dom/media/platforms/android/AndroidDecoderModule.cpp
new file mode 100644
index 000000000..3bf5cbf09
--- /dev/null
+++ b/dom/media/platforms/android/AndroidDecoderModule.cpp
@@ -0,0 +1,227 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AndroidDecoderModule.h"
+#include "AndroidBridge.h"
+
+#include "MediaCodecDataDecoder.h"
+#include "RemoteDataDecoder.h"
+
+#include "MediaInfo.h"
+#include "VPXDecoder.h"
+
+#include "MediaPrefs.h"
+#include "OpusDecoder.h"
+#include "VorbisDecoder.h"
+
+#include "nsPromiseFlatString.h"
+#include "nsIGfxInfo.h"
+
+#include "prlog.h"
+
+#include <jni.h>
+
+#undef LOG
+#define LOG(arg, ...) MOZ_LOG(sAndroidDecoderModuleLog, \
+ mozilla::LogLevel::Debug, ("AndroidDecoderModule(%p)::%s: " arg, \
+ this, __func__, ##__VA_ARGS__))
+
+using namespace mozilla;
+using namespace mozilla::gl;
+using namespace mozilla::java::sdk;
+using media::TimeUnit;
+
+namespace mozilla {
+
+mozilla::LazyLogModule sAndroidDecoderModuleLog("AndroidDecoderModule");
+
+static const char*
+TranslateMimeType(const nsACString& aMimeType)
+{
+ if (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP8)) {
+ return "video/x-vnd.on2.vp8";
+ } else if (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP9)) {
+ return "video/x-vnd.on2.vp9";
+ }
+ return PromiseFlatCString(aMimeType).get();
+}
+
+static bool
+GetFeatureStatus(int32_t aFeature)
+{
+ nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
+ int32_t status = nsIGfxInfo::FEATURE_STATUS_UNKNOWN;
+ nsCString discardFailureId;
+ if (!gfxInfo || NS_FAILED(gfxInfo->GetFeatureStatus(aFeature, discardFailureId, &status))) {
+ return false;
+ }
+ return status == nsIGfxInfo::FEATURE_STATUS_OK;
+};
+
+CryptoInfo::LocalRef
+GetCryptoInfoFromSample(const MediaRawData* aSample)
+{
+ auto& cryptoObj = aSample->mCrypto;
+
+ if (!cryptoObj.mValid) {
+ return nullptr;
+ }
+
+ CryptoInfo::LocalRef cryptoInfo;
+ nsresult rv = CryptoInfo::New(&cryptoInfo);
+ NS_ENSURE_SUCCESS(rv, nullptr);
+
+ uint32_t numSubSamples =
+ std::min<uint32_t>(cryptoObj.mPlainSizes.Length(), cryptoObj.mEncryptedSizes.Length());
+
+ uint32_t totalSubSamplesSize = 0;
+ for (auto& size : cryptoObj.mEncryptedSizes) {
+ totalSubSamplesSize += size;
+ }
+
+ // mPlainSizes is uint16_t, need to transform to uint32_t first.
+ nsTArray<uint32_t> plainSizes;
+ for (auto& size : cryptoObj.mPlainSizes) {
+ totalSubSamplesSize += size;
+ plainSizes.AppendElement(size);
+ }
+
+ uint32_t codecSpecificDataSize = aSample->Size() - totalSubSamplesSize;
+ // Size of codec specific data("CSD") for Android MediaCodec usage should be
+ // included in the 1st plain size.
+ plainSizes[0] += codecSpecificDataSize;
+
+ static const int kExpectedIVLength = 16;
+ auto tempIV(cryptoObj.mIV);
+ auto tempIVLength = tempIV.Length();
+ MOZ_ASSERT(tempIVLength <= kExpectedIVLength);
+ for (size_t i = tempIVLength; i < kExpectedIVLength; i++) {
+ // Padding with 0
+ tempIV.AppendElement(0);
+ }
+
+ auto numBytesOfPlainData = mozilla::jni::IntArray::New(
+ reinterpret_cast<int32_t*>(&plainSizes[0]),
+ plainSizes.Length());
+
+ auto numBytesOfEncryptedData =
+ mozilla::jni::IntArray::New(reinterpret_cast<const int32_t*>(&cryptoObj.mEncryptedSizes[0]),
+ cryptoObj.mEncryptedSizes.Length());
+ auto iv = mozilla::jni::ByteArray::New(reinterpret_cast<int8_t*>(&tempIV[0]),
+ tempIV.Length());
+ auto keyId = mozilla::jni::ByteArray::New(reinterpret_cast<const int8_t*>(&cryptoObj.mKeyId[0]),
+ cryptoObj.mKeyId.Length());
+ cryptoInfo->Set(numSubSamples,
+ numBytesOfPlainData,
+ numBytesOfEncryptedData,
+ keyId,
+ iv,
+ MediaCodec::CRYPTO_MODE_AES_CTR);
+
+ return cryptoInfo;
+}
+
+bool
+AndroidDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ if (!AndroidBridge::Bridge() ||
+ AndroidBridge::Bridge()->GetAPIVersion() < 16) {
+ return false;
+ }
+
+ if (aMimeType.EqualsLiteral("video/mp4") ||
+ aMimeType.EqualsLiteral("video/avc")) {
+ return true;
+ }
+
+ // When checking "audio/x-wav", CreateDecoder can cause a JNI ERROR by
+ // Accessing a stale local reference leading to a SIGSEGV crash.
+ // To avoid this we check for wav types here.
+ if (aMimeType.EqualsLiteral("audio/x-wav") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=1") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=6") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=7") ||
+ aMimeType.EqualsLiteral("audio/wave; codecs=65534")) {
+ return false;
+ }
+
+ if ((VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP8) &&
+ !GetFeatureStatus(nsIGfxInfo::FEATURE_VP8_HW_DECODE)) ||
+ (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP9) &&
+ !GetFeatureStatus(nsIGfxInfo::FEATURE_VP9_HW_DECODE))) {
+ return false;
+ }
+
+ // Prefer the gecko decoder for opus and vorbis; stagefright crashes
+ // on content demuxed from mp4.
+ if (OpusDataDecoder::IsOpus(aMimeType) ||
+ VorbisDataDecoder::IsVorbis(aMimeType)) {
+ LOG("Rejecting audio of type %s", aMimeType.Data());
+ return false;
+ }
+
+ return java::HardwareCodecCapabilityUtils::FindDecoderCodecInfoForMimeType(
+ nsCString(TranslateMimeType(aMimeType)));
+}
+
+already_AddRefed<MediaDataDecoder>
+AndroidDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ MediaFormat::LocalRef format;
+
+ const VideoInfo& config = aParams.VideoConfig();
+ NS_ENSURE_SUCCESS(MediaFormat::CreateVideoFormat(
+ TranslateMimeType(config.mMimeType),
+ config.mDisplay.width,
+ config.mDisplay.height,
+ &format), nullptr);
+
+ RefPtr<MediaDataDecoder> decoder = MediaPrefs::PDMAndroidRemoteCodecEnabled() ?
+ RemoteDataDecoder::CreateVideoDecoder(config,
+ format,
+ aParams.mCallback,
+ aParams.mImageContainer) :
+ MediaCodecDataDecoder::CreateVideoDecoder(config,
+ format,
+ aParams.mCallback,
+ aParams.mImageContainer);
+
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+AndroidDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ const AudioInfo& config = aParams.AudioConfig();
+ MOZ_ASSERT(config.mBitDepth == 16, "We only handle 16-bit audio!");
+
+ MediaFormat::LocalRef format;
+
+ LOG("CreateAudioFormat with mimeType=%s, mRate=%d, channels=%d",
+ config.mMimeType.Data(), config.mRate, config.mChannels);
+
+ NS_ENSURE_SUCCESS(MediaFormat::CreateAudioFormat(
+ config.mMimeType,
+ config.mRate,
+ config.mChannels,
+ &format), nullptr);
+
+ RefPtr<MediaDataDecoder> decoder = MediaPrefs::PDMAndroidRemoteCodecEnabled() ?
+ RemoteDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback) :
+ MediaCodecDataDecoder::CreateAudioDecoder(config, format, aParams.mCallback);
+
+ return decoder.forget();
+}
+
+PlatformDecoderModule::ConversionRequired
+AndroidDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ if (aConfig.IsVideo()) {
+ return ConversionRequired::kNeedAnnexB;
+ }
+ return ConversionRequired::kNeedNone;
+}
+
+} // mozilla
diff --git a/dom/media/platforms/android/AndroidDecoderModule.h b/dom/media/platforms/android/AndroidDecoderModule.h
new file mode 100644
index 000000000..339cbb311
--- /dev/null
+++ b/dom/media/platforms/android/AndroidDecoderModule.h
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AndroidDecoderModule_h_
+#define AndroidDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class AndroidDecoderModule : public PlatformDecoderModule {
+public:
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ AndroidDecoderModule() {}
+ virtual ~AndroidDecoderModule() {}
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+};
+
+extern LazyLogModule sAndroidDecoderModuleLog;
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/android/MediaCodecDataDecoder.cpp b/dom/media/platforms/android/MediaCodecDataDecoder.cpp
new file mode 100644
index 000000000..3c5df54ee
--- /dev/null
+++ b/dom/media/platforms/android/MediaCodecDataDecoder.cpp
@@ -0,0 +1,698 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaCodecDataDecoder.h"
+
+#include "AndroidBridge.h"
+#include "AndroidSurfaceTexture.h"
+#include "GeneratedJNINatives.h"
+#include "GLImages.h"
+
+#include "MediaData.h"
+#include "MediaInfo.h"
+#include "VPXDecoder.h"
+
+#include "nsThreadUtils.h"
+#include "nsPromiseFlatString.h"
+#include "nsIGfxInfo.h"
+
+#include "prlog.h"
+
+#include <jni.h>
+
+#undef LOG
+#define LOG(arg, ...) MOZ_LOG(sAndroidDecoderModuleLog, \
+ mozilla::LogLevel::Debug, ("MediaCodecDataDecoder(%p)::%s: " arg, \
+ this, __func__, ##__VA_ARGS__))
+
+using namespace mozilla;
+using namespace mozilla::gl;
+using namespace mozilla::java;
+using namespace mozilla::java::sdk;
+using media::TimeUnit;
+
+namespace mozilla {
+
+#define INVOKE_CALLBACK(Func, ...) \
+ if (mCallback) { \
+ mCallback->Func(__VA_ARGS__); \
+ } else { \
+ NS_WARNING("Callback not set"); \
+ }
+
+static MediaCodec::LocalRef
+CreateDecoder(const nsACString& aMimeType)
+{
+ MediaCodec::LocalRef codec;
+ NS_ENSURE_SUCCESS(MediaCodec::CreateDecoderByType(TranslateMimeType(aMimeType),
+ &codec), nullptr);
+ return codec;
+}
+
+class VideoDataDecoder : public MediaCodecDataDecoder
+{
+public:
+ VideoDataDecoder(const VideoInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer)
+ : MediaCodecDataDecoder(MediaData::Type::VIDEO_DATA, aConfig.mMimeType,
+ aFormat, aCallback)
+ , mImageContainer(aImageContainer)
+ , mConfig(aConfig)
+ {
+
+ }
+
+ const char* GetDescriptionName() const override
+ {
+ return "Android MediaCodec video decoder";
+ }
+
+ RefPtr<InitPromise> Init() override
+ {
+ mSurfaceTexture = AndroidSurfaceTexture::Create();
+ if (!mSurfaceTexture) {
+ NS_WARNING("Failed to create SurfaceTexture for video decode\n");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (NS_FAILED(InitDecoder(mSurfaceTexture->JavaSurface()))) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
+ }
+
+ void Cleanup() override
+ {
+ }
+
+ nsresult PostOutput(BufferInfo::Param aInfo, MediaFormat::Param aFormat,
+ const TimeUnit& aDuration) override
+ {
+ RefPtr<layers::Image> img =
+ new SurfaceTextureImage(mSurfaceTexture.get(), mConfig.mDisplay,
+ gl::OriginPos::BottomLeft);
+
+ nsresult rv;
+ int32_t flags;
+ NS_ENSURE_SUCCESS(rv = aInfo->Flags(&flags), rv);
+
+ bool isSync = !!(flags & MediaCodec::BUFFER_FLAG_SYNC_FRAME);
+
+ int32_t offset;
+ NS_ENSURE_SUCCESS(rv = aInfo->Offset(&offset), rv);
+
+ int64_t presentationTimeUs;
+ NS_ENSURE_SUCCESS(rv = aInfo->PresentationTimeUs(&presentationTimeUs), rv);
+
+ RefPtr<VideoData> v =
+ VideoData::CreateFromImage(mConfig,
+ offset,
+ presentationTimeUs,
+ aDuration.ToMicroseconds(),
+ img,
+ isSync,
+ presentationTimeUs,
+ gfx::IntRect(0, 0,
+ mConfig.mDisplay.width,
+ mConfig.mDisplay.height));
+ INVOKE_CALLBACK(Output, v);
+ return NS_OK;
+ }
+
+protected:
+ layers::ImageContainer* mImageContainer;
+ const VideoInfo& mConfig;
+ RefPtr<AndroidSurfaceTexture> mSurfaceTexture;
+};
+
+class AudioDataDecoder : public MediaCodecDataDecoder
+{
+public:
+ AudioDataDecoder(const AudioInfo& aConfig, MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback)
+ : MediaCodecDataDecoder(MediaData::Type::AUDIO_DATA, aConfig.mMimeType,
+ aFormat, aCallback)
+ {
+ JNIEnv* const env = jni::GetEnvForThread();
+
+ jni::ByteBuffer::LocalRef buffer(env);
+ NS_ENSURE_SUCCESS_VOID(aFormat->GetByteBuffer(NS_LITERAL_STRING("csd-0"),
+ &buffer));
+
+ if (!buffer && aConfig.mCodecSpecificConfig->Length() >= 2) {
+ buffer = jni::ByteBuffer::New(
+ aConfig.mCodecSpecificConfig->Elements(),
+ aConfig.mCodecSpecificConfig->Length());
+ NS_ENSURE_SUCCESS_VOID(aFormat->SetByteBuffer(NS_LITERAL_STRING("csd-0"),
+ buffer));
+ }
+ }
+
+ const char* GetDescriptionName() const override
+ {
+ return "android audio decoder";
+ }
+
+ nsresult Output(BufferInfo::Param aInfo, void* aBuffer,
+ MediaFormat::Param aFormat, const TimeUnit& aDuration)
+ {
+ // The output on Android is always 16-bit signed
+ nsresult rv;
+ int32_t numChannels;
+ NS_ENSURE_SUCCESS(rv =
+ aFormat->GetInteger(NS_LITERAL_STRING("channel-count"), &numChannels), rv);
+ AudioConfig::ChannelLayout layout(numChannels);
+ if (!layout.IsValid()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ int32_t sampleRate;
+ NS_ENSURE_SUCCESS(rv =
+ aFormat->GetInteger(NS_LITERAL_STRING("sample-rate"), &sampleRate), rv);
+
+ int32_t size;
+ NS_ENSURE_SUCCESS(rv = aInfo->Size(&size), rv);
+
+ int32_t offset;
+ NS_ENSURE_SUCCESS(rv = aInfo->Offset(&offset), rv);
+
+#ifdef MOZ_SAMPLE_TYPE_S16
+ const int32_t numSamples = size / 2;
+#else
+#error We only support 16-bit integer PCM
+#endif
+
+ const int32_t numFrames = numSamples / numChannels;
+ AlignedAudioBuffer audio(numSamples);
+ if (!audio) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+ const uint8_t* bufferStart = static_cast<uint8_t*>(aBuffer) + offset;
+ PodCopy(audio.get(), reinterpret_cast<const AudioDataValue*>(bufferStart),
+ numSamples);
+
+ int64_t presentationTimeUs;
+ NS_ENSURE_SUCCESS(rv = aInfo->PresentationTimeUs(&presentationTimeUs), rv);
+
+ RefPtr<AudioData> data = new AudioData(0, presentationTimeUs,
+ aDuration.ToMicroseconds(),
+ numFrames,
+ Move(audio),
+ numChannels,
+ sampleRate);
+ INVOKE_CALLBACK(Output, data);
+ return NS_OK;
+ }
+};
+
+MediaDataDecoder*
+MediaCodecDataDecoder::CreateAudioDecoder(const AudioInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback)
+{
+ return new AudioDataDecoder(aConfig, aFormat, aCallback);
+}
+
+MediaDataDecoder*
+MediaCodecDataDecoder::CreateVideoDecoder(const VideoInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer)
+{
+ return new VideoDataDecoder(aConfig, aFormat, aCallback, aImageContainer);
+}
+
+MediaCodecDataDecoder::MediaCodecDataDecoder(MediaData::Type aType,
+ const nsACString& aMimeType,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback)
+ : mType(aType)
+ , mMimeType(aMimeType)
+ , mFormat(aFormat)
+ , mCallback(aCallback)
+ , mInputBuffers(nullptr)
+ , mOutputBuffers(nullptr)
+ , mMonitor("MediaCodecDataDecoder::mMonitor")
+ , mState(ModuleState::kDecoding)
+{
+
+}
+
+MediaCodecDataDecoder::~MediaCodecDataDecoder()
+{
+ Shutdown();
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+MediaCodecDataDecoder::Init()
+{
+ nsresult rv = InitDecoder(nullptr);
+
+ TrackInfo::TrackType type =
+ (mType == MediaData::AUDIO_DATA ? TrackInfo::TrackType::kAudioTrack
+ : TrackInfo::TrackType::kVideoTrack);
+
+ return NS_SUCCEEDED(rv) ?
+ InitPromise::CreateAndResolve(type, __func__) :
+ InitPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+}
+
+nsresult
+MediaCodecDataDecoder::InitDecoder(Surface::Param aSurface)
+{
+ mDecoder = CreateDecoder(mMimeType);
+ if (!mDecoder) {
+ INVOKE_CALLBACK(Error,
+ MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__));
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult rv;
+ NS_ENSURE_SUCCESS(rv = mDecoder->Configure(mFormat, aSurface, nullptr, 0), rv);
+ NS_ENSURE_SUCCESS(rv = mDecoder->Start(), rv);
+
+ NS_ENSURE_SUCCESS(rv = ResetInputBuffers(), rv);
+ NS_ENSURE_SUCCESS(rv = ResetOutputBuffers(), rv);
+
+ nsCOMPtr<nsIRunnable> r = NewRunnableMethod(this, &MediaCodecDataDecoder::DecoderLoop);
+ rv = NS_NewNamedThread("MC Decoder", getter_AddRefs(mThread), r);
+
+ return rv;
+}
+
+// This is in usec, so that's 10ms.
+static const int64_t kDecoderTimeout = 10000;
+
+#define BREAK_ON_DECODER_ERROR() \
+ if (NS_FAILED(res)) { \
+ NS_WARNING("Exiting decoder loop due to exception"); \
+ if (mState == ModuleState::kDrainDecoder) { \
+ INVOKE_CALLBACK(DrainComplete); \
+ SetState(ModuleState::kDecoding); \
+ } \
+ INVOKE_CALLBACK(Error, MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__)); \
+ break; \
+ }
+
+nsresult
+MediaCodecDataDecoder::GetInputBuffer(
+ JNIEnv* aEnv, int aIndex, jni::Object::LocalRef* aBuffer)
+{
+ MOZ_ASSERT(aEnv);
+ MOZ_ASSERT(!*aBuffer);
+
+ int numTries = 2;
+
+ while (numTries--) {
+ *aBuffer = jni::Object::LocalRef::Adopt(
+ aEnv->GetObjectArrayElement(mInputBuffers.Get(), aIndex));
+ if (*aBuffer) {
+ return NS_OK;
+ }
+ nsresult res = ResetInputBuffers();
+ if (NS_FAILED(res)) {
+ return res;
+ }
+ }
+ return NS_ERROR_FAILURE;
+}
+
+bool
+MediaCodecDataDecoder::WaitForInput()
+{
+ MonitorAutoLock lock(mMonitor);
+
+ while (mState == ModuleState::kDecoding && mQueue.empty()) {
+ // Signal that we require more input.
+ INVOKE_CALLBACK(InputExhausted);
+ lock.Wait();
+ }
+
+ return mState != ModuleState::kStopping;
+}
+
+
+already_AddRefed<MediaRawData>
+MediaCodecDataDecoder::PeekNextSample()
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (mState == ModuleState::kFlushing) {
+ mDecoder->Flush();
+ ClearQueue();
+ SetState(ModuleState::kDecoding);
+ lock.Notify();
+ return nullptr;
+ }
+
+ if (mQueue.empty()) {
+ if (mState == ModuleState::kDrainQueue) {
+ SetState(ModuleState::kDrainDecoder);
+ }
+ return nullptr;
+ }
+
+ // We're not stopping or flushing, so try to get a sample.
+ return RefPtr<MediaRawData>(mQueue.front()).forget();
+}
+
+nsresult
+MediaCodecDataDecoder::QueueSample(const MediaRawData* aSample)
+{
+ MOZ_ASSERT(aSample);
+ AutoLocalJNIFrame frame(jni::GetEnvForThread(), 1);
+
+ // We have a sample, try to feed it to the decoder.
+ int32_t inputIndex = -1;
+ nsresult res = mDecoder->DequeueInputBuffer(kDecoderTimeout, &inputIndex);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+
+ if (inputIndex < 0) {
+ // There is no valid input buffer available.
+ return NS_ERROR_FAILURE;
+ }
+
+ jni::Object::LocalRef buffer(frame.GetEnv());
+ res = GetInputBuffer(frame.GetEnv(), inputIndex, &buffer);
+ if (NS_FAILED(res)) {
+ return res;
+ }
+
+ void* directBuffer = frame.GetEnv()->GetDirectBufferAddress(buffer.Get());
+
+ MOZ_ASSERT(frame.GetEnv()->GetDirectBufferCapacity(buffer.Get()) >=
+ aSample->Size(),
+ "Decoder buffer is not large enough for sample");
+
+ PodCopy(static_cast<uint8_t*>(directBuffer), aSample->Data(), aSample->Size());
+
+ CryptoInfo::LocalRef cryptoInfo = GetCryptoInfoFromSample(aSample);
+ if (cryptoInfo) {
+ res = mDecoder->QueueSecureInputBuffer(inputIndex, 0, cryptoInfo,
+ aSample->mTime, 0);
+ } else {
+ res = mDecoder->QueueInputBuffer(inputIndex, 0, aSample->Size(),
+ aSample->mTime, 0);
+ }
+
+ if (NS_FAILED(res)) {
+ return res;
+ }
+
+ mDurations.push_back(TimeUnit::FromMicroseconds(aSample->mDuration));
+ return NS_OK;
+}
+
+nsresult
+MediaCodecDataDecoder::QueueEOS()
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ nsresult res = NS_OK;
+ int32_t inputIndex = -1;
+ res = mDecoder->DequeueInputBuffer(kDecoderTimeout, &inputIndex);
+ if (NS_FAILED(res) || inputIndex < 0) {
+ return res;
+ }
+
+ res = mDecoder->QueueInputBuffer(inputIndex, 0, 0, 0,
+ MediaCodec::BUFFER_FLAG_END_OF_STREAM);
+ if (NS_SUCCEEDED(res)) {
+ SetState(ModuleState::kDrainWaitEOS);
+ mMonitor.Notify();
+ }
+ return res;
+}
+
+void
+MediaCodecDataDecoder::HandleEOS(int32_t aOutputStatus)
+{
+ MonitorAutoLock lock(mMonitor);
+
+ if (mState == ModuleState::kDrainWaitEOS) {
+ SetState(ModuleState::kDecoding);
+ mMonitor.Notify();
+
+ INVOKE_CALLBACK(DrainComplete);
+ }
+
+ mDecoder->ReleaseOutputBuffer(aOutputStatus, false);
+}
+
+Maybe<TimeUnit>
+MediaCodecDataDecoder::GetOutputDuration()
+{
+ if (mDurations.empty()) {
+ return Nothing();
+ }
+ const Maybe<TimeUnit> duration = Some(mDurations.front());
+ mDurations.pop_front();
+ return duration;
+}
+
+nsresult
+MediaCodecDataDecoder::ProcessOutput(
+ BufferInfo::Param aInfo, MediaFormat::Param aFormat, int32_t aStatus)
+{
+ AutoLocalJNIFrame frame(jni::GetEnvForThread(), 1);
+
+ const Maybe<TimeUnit> duration = GetOutputDuration();
+ if (!duration) {
+ // Some devices report failure in QueueSample while actually succeeding at
+ // it, in which case we get an output buffer without having a cached duration
+ // (bug 1273523).
+ return NS_OK;
+ }
+
+ const auto buffer = jni::Object::LocalRef::Adopt(
+ frame.GetEnv()->GetObjectArrayElement(mOutputBuffers.Get(), aStatus));
+
+ if (buffer) {
+ // The buffer will be null on Android L if we are decoding to a Surface.
+ void* directBuffer = frame.GetEnv()->GetDirectBufferAddress(buffer.Get());
+ Output(aInfo, directBuffer, aFormat, duration.value());
+ }
+
+ // The Surface will be updated at this point (for video).
+ mDecoder->ReleaseOutputBuffer(aStatus, true);
+ PostOutput(aInfo, aFormat, duration.value());
+
+ return NS_OK;
+}
+
+void
+MediaCodecDataDecoder::DecoderLoop()
+{
+ bool isOutputDone = false;
+ AutoLocalJNIFrame frame(jni::GetEnvForThread(), 1);
+ MediaFormat::LocalRef outputFormat(frame.GetEnv());
+ nsresult res = NS_OK;
+
+ while (WaitForInput()) {
+ RefPtr<MediaRawData> sample = PeekNextSample();
+
+ {
+ MonitorAutoLock lock(mMonitor);
+ if (mState == ModuleState::kDrainDecoder) {
+ MOZ_ASSERT(!sample, "Shouldn't have a sample when pushing EOF frame");
+ res = QueueEOS();
+ BREAK_ON_DECODER_ERROR();
+ }
+ }
+
+ if (sample) {
+ res = QueueSample(sample);
+ if (NS_SUCCEEDED(res)) {
+ // We've fed this into the decoder, so remove it from the queue.
+ MonitorAutoLock lock(mMonitor);
+ MOZ_RELEASE_ASSERT(mQueue.size(), "Queue may not be empty");
+ mQueue.pop_front();
+ isOutputDone = false;
+ }
+ }
+
+ if (isOutputDone) {
+ continue;
+ }
+
+ BufferInfo::LocalRef bufferInfo;
+ nsresult res = BufferInfo::New(&bufferInfo);
+ BREAK_ON_DECODER_ERROR();
+
+ int32_t outputStatus = -1;
+ res = mDecoder->DequeueOutputBuffer(bufferInfo, kDecoderTimeout,
+ &outputStatus);
+ BREAK_ON_DECODER_ERROR();
+
+ if (outputStatus == MediaCodec::INFO_TRY_AGAIN_LATER) {
+ // We might want to call mCallback->InputExhausted() here, but there seems
+ // to be some possible bad interactions here with the threading.
+ } else if (outputStatus == MediaCodec::INFO_OUTPUT_BUFFERS_CHANGED) {
+ res = ResetOutputBuffers();
+ BREAK_ON_DECODER_ERROR();
+ } else if (outputStatus == MediaCodec::INFO_OUTPUT_FORMAT_CHANGED) {
+ res = mDecoder->GetOutputFormat(ReturnTo(&outputFormat));
+ BREAK_ON_DECODER_ERROR();
+ } else if (outputStatus < 0) {
+ NS_WARNING("Unknown error from decoder!");
+ INVOKE_CALLBACK(Error,
+ MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ __func__));
+ // Don't break here just in case it's recoverable. If it's not, other
+ // stuff will fail later and we'll bail out.
+ } else {
+ // We have a valid buffer index >= 0 here.
+ int32_t flags;
+ nsresult res = bufferInfo->Flags(&flags);
+ BREAK_ON_DECODER_ERROR();
+
+ if (flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM) {
+ HandleEOS(outputStatus);
+ isOutputDone = true;
+ // We only queue empty EOF frames, so we're done for now.
+ continue;
+ }
+
+ res = ProcessOutput(bufferInfo, outputFormat, outputStatus);
+ BREAK_ON_DECODER_ERROR();
+ }
+ }
+
+ Cleanup();
+
+ // We're done.
+ MonitorAutoLock lock(mMonitor);
+ SetState(ModuleState::kShutdown);
+ mMonitor.Notify();
+}
+
+const char*
+MediaCodecDataDecoder::ModuleStateStr(ModuleState aState) {
+ switch (aState) {
+ case ModuleState::kDecoding: return "Decoding";
+ case ModuleState::kFlushing: return "Flushing";
+ case ModuleState::kDrainQueue: return "DrainQueue";
+ case ModuleState::kDrainDecoder: return "DrainDecoder";
+ case ModuleState::kDrainWaitEOS: return "DrainWaitEOS";
+ case ModuleState::kStopping: return "Stopping";
+ case ModuleState::kShutdown: return "Shutdown";
+ default: MOZ_ASSERT_UNREACHABLE("Invalid state.");
+ }
+ return "Unknown";
+}
+
+bool
+MediaCodecDataDecoder::SetState(ModuleState aState)
+{
+ bool ok = true;
+
+ if (mState == ModuleState::kShutdown) {
+ ok = false;
+ } else if (mState == ModuleState::kStopping) {
+ ok = aState == ModuleState::kShutdown;
+ } else if (aState == ModuleState::kDrainDecoder) {
+ ok = mState == ModuleState::kDrainQueue;
+ } else if (aState == ModuleState::kDrainWaitEOS) {
+ ok = mState == ModuleState::kDrainDecoder;
+ }
+
+ if (ok) {
+ LOG("%s -> %s", ModuleStateStr(mState), ModuleStateStr(aState));
+ mState = aState;
+ } else {
+ LOG("Fail to transit from %s to %s state", ModuleStateStr(mState), ModuleStateStr(aState));
+ }
+
+ return ok;
+}
+
+void
+MediaCodecDataDecoder::ClearQueue()
+{
+ mMonitor.AssertCurrentThreadOwns();
+
+ mQueue.clear();
+ mDurations.clear();
+}
+
+void
+MediaCodecDataDecoder::Input(MediaRawData* aSample)
+{
+ MonitorAutoLock lock(mMonitor);
+ mQueue.push_back(aSample);
+ lock.NotifyAll();
+}
+
+nsresult
+MediaCodecDataDecoder::ResetInputBuffers()
+{
+ return mDecoder->GetInputBuffers(ReturnTo(&mInputBuffers));
+}
+
+nsresult
+MediaCodecDataDecoder::ResetOutputBuffers()
+{
+ return mDecoder->GetOutputBuffers(ReturnTo(&mOutputBuffers));
+}
+
+void
+MediaCodecDataDecoder::Flush()
+{
+ MonitorAutoLock lock(mMonitor);
+ if (!SetState(ModuleState::kFlushing)) {
+ return;
+ }
+ lock.Notify();
+
+ while (mState == ModuleState::kFlushing) {
+ lock.Wait();
+ }
+}
+
+void
+MediaCodecDataDecoder::Drain()
+{
+ MonitorAutoLock lock(mMonitor);
+ if (mState == ModuleState::kDrainDecoder ||
+ mState == ModuleState::kDrainQueue) {
+ return;
+ }
+
+ SetState(ModuleState::kDrainQueue);
+ lock.Notify();
+}
+
+
+void
+MediaCodecDataDecoder::Shutdown()
+{
+ MonitorAutoLock lock(mMonitor);
+
+ SetState(ModuleState::kStopping);
+ lock.Notify();
+
+ while (mThread && mState != ModuleState::kShutdown) {
+ lock.Wait();
+ }
+
+ if (mThread) {
+ mThread->Shutdown();
+ mThread = nullptr;
+ }
+
+ if (mDecoder) {
+ mDecoder->Stop();
+ mDecoder->Release();
+ mDecoder = nullptr;
+ }
+}
+
+} // mozilla
diff --git a/dom/media/platforms/android/MediaCodecDataDecoder.h b/dom/media/platforms/android/MediaCodecDataDecoder.h
new file mode 100644
index 000000000..0db6407bf
--- /dev/null
+++ b/dom/media/platforms/android/MediaCodecDataDecoder.h
@@ -0,0 +1,126 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaCodecDataDecoder_h_
+#define MediaCodecDataDecoder_h_
+
+#include "AndroidDecoderModule.h"
+
+#include "MediaCodec.h"
+#include "SurfaceTexture.h"
+#include "TimeUnits.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/Maybe.h"
+
+#include <deque>
+
+namespace mozilla {
+
+typedef std::deque<RefPtr<MediaRawData>> SampleQueue;
+
+class MediaCodecDataDecoder : public MediaDataDecoder {
+public:
+ static MediaDataDecoder* CreateAudioDecoder(const AudioInfo& aConfig,
+ java::sdk::MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback);
+
+ static MediaDataDecoder* CreateVideoDecoder(const VideoInfo& aConfig,
+ java::sdk::MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer);
+
+ virtual ~MediaCodecDataDecoder();
+
+ RefPtr<MediaDataDecoder::InitPromise> Init() override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ void Input(MediaRawData* aSample) override;
+ const char* GetDescriptionName() const override
+ {
+ return "Android MediaCodec decoder";
+ }
+
+protected:
+ enum class ModuleState : uint8_t {
+ kDecoding = 0,
+ kFlushing,
+ kDrainQueue,
+ kDrainDecoder,
+ kDrainWaitEOS,
+ kStopping,
+ kShutdown
+ };
+
+ friend class AndroidDecoderModule;
+
+ MediaCodecDataDecoder(MediaData::Type aType,
+ const nsACString& aMimeType,
+ java::sdk::MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback);
+
+ static const char* ModuleStateStr(ModuleState aState);
+
+ virtual nsresult InitDecoder(java::sdk::Surface::Param aSurface);
+
+ virtual nsresult Output(java::sdk::BufferInfo::Param aInfo, void* aBuffer,
+ java::sdk::MediaFormat::Param aFormat, const media::TimeUnit& aDuration)
+ {
+ return NS_OK;
+ }
+
+ virtual nsresult PostOutput(java::sdk::BufferInfo::Param aInfo,
+ java::sdk::MediaFormat::Param aFormat, const media::TimeUnit& aDuration)
+ {
+ return NS_OK;
+ }
+
+ virtual void Cleanup() {};
+
+ nsresult ResetInputBuffers();
+ nsresult ResetOutputBuffers();
+
+ nsresult GetInputBuffer(JNIEnv* env, int index, jni::Object::LocalRef* buffer);
+ bool WaitForInput();
+ already_AddRefed<MediaRawData> PeekNextSample();
+ nsresult QueueSample(const MediaRawData* aSample);
+ nsresult QueueEOS();
+ void HandleEOS(int32_t aOutputStatus);
+ Maybe<media::TimeUnit> GetOutputDuration();
+ nsresult ProcessOutput(java::sdk::BufferInfo::Param aInfo,
+ java::sdk::MediaFormat::Param aFormat,
+ int32_t aStatus);
+ // Sets decoder state and returns whether the new state has become effective.
+ bool SetState(ModuleState aState);
+ void DecoderLoop();
+
+ virtual void ClearQueue();
+
+ MediaData::Type mType;
+
+ nsAutoCString mMimeType;
+ java::sdk::MediaFormat::GlobalRef mFormat;
+
+ MediaDataDecoderCallback* mCallback;
+
+ java::sdk::MediaCodec::GlobalRef mDecoder;
+
+ jni::ObjectArray::GlobalRef mInputBuffers;
+ jni::ObjectArray::GlobalRef mOutputBuffers;
+
+ nsCOMPtr<nsIThread> mThread;
+
+ // Only these members are protected by mMonitor.
+ Monitor mMonitor;
+
+ ModuleState mState;
+
+ SampleQueue mQueue;
+ // Durations are stored in microseconds.
+ std::deque<media::TimeUnit> mDurations;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/android/RemoteDataDecoder.cpp b/dom/media/platforms/android/RemoteDataDecoder.cpp
new file mode 100644
index 000000000..56af2601f
--- /dev/null
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -0,0 +1,489 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AndroidDecoderModule.h"
+#include "AndroidBridge.h"
+#include "AndroidSurfaceTexture.h"
+#include "FennecJNINatives.h"
+#include "GLImages.h"
+
+#include "MediaData.h"
+#include "MediaInfo.h"
+#include "VideoUtils.h"
+#include "VPXDecoder.h"
+
+#include "nsThreadUtils.h"
+#include "nsPromiseFlatString.h"
+#include "nsIGfxInfo.h"
+
+#include "prlog.h"
+
+#include <jni.h>
+
+#include <deque>
+
+#undef LOG
+#define LOG(arg, ...) MOZ_LOG(sAndroidDecoderModuleLog, \
+ mozilla::LogLevel::Debug, ("RemoteDataDecoder(%p)::%s: " arg, \
+ this, __func__, ##__VA_ARGS__))
+
+using namespace mozilla;
+using namespace mozilla::gl;
+using namespace mozilla::java;
+using namespace mozilla::java::sdk;
+using media::TimeUnit;
+
+namespace mozilla {
+
+class JavaCallbacksSupport
+ : public CodecProxy::NativeCallbacks::Natives<JavaCallbacksSupport>
+{
+public:
+ typedef CodecProxy::NativeCallbacks::Natives<JavaCallbacksSupport> Base;
+ using Base::AttachNative;
+
+ JavaCallbacksSupport(MediaDataDecoderCallback* aDecoderCallback)
+ : mDecoderCallback(aDecoderCallback)
+ {
+ MOZ_ASSERT(aDecoderCallback);
+ }
+
+ virtual ~JavaCallbacksSupport() {}
+
+ void OnInputExhausted()
+ {
+ if (mDecoderCallback) {
+ mDecoderCallback->InputExhausted();
+ }
+ }
+
+ virtual void HandleOutput(Sample::Param aSample) = 0;
+
+ void OnOutput(jni::Object::Param aSample)
+ {
+ if (mDecoderCallback) {
+ HandleOutput(Sample::Ref::From(aSample));
+ }
+ }
+
+ virtual void HandleOutputFormatChanged(MediaFormat::Param aFormat) {};
+
+ void OnOutputFormatChanged(jni::Object::Param aFormat)
+ {
+ if (mDecoderCallback) {
+ HandleOutputFormatChanged(MediaFormat::Ref::From(aFormat));
+ }
+ }
+
+ void OnError(bool aIsFatal)
+ {
+ if (mDecoderCallback) {
+ mDecoderCallback->Error(aIsFatal ?
+ MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__) :
+ MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, __func__));
+ }
+ }
+
+ void DisposeNative()
+ {
+ // TODO
+ }
+
+ void Cancel()
+ {
+ mDecoderCallback = nullptr;
+ }
+
+protected:
+ MediaDataDecoderCallback* mDecoderCallback;
+};
+
+struct SampleTime final
+{
+ SampleTime(int64_t aStart, int64_t aDuration)
+ : mStart(aStart)
+ , mDuration(aDuration)
+ {}
+
+ int64_t mStart;
+ int64_t mDuration;
+};
+
+
+class RemoteVideoDecoder final : public RemoteDataDecoder
+{
+public:
+ class CallbacksSupport final : public JavaCallbacksSupport
+ {
+ public:
+ CallbacksSupport(RemoteVideoDecoder* aDecoder, MediaDataDecoderCallback* aCallback)
+ : JavaCallbacksSupport(aCallback)
+ , mDecoder(aDecoder)
+ {}
+
+ virtual ~CallbacksSupport() {}
+
+ void HandleOutput(Sample::Param aSample) override
+ {
+ Maybe<int64_t> durationUs = mDecoder->mInputDurations.Get();
+ if (!durationUs) {
+ return;
+ }
+
+ BufferInfo::LocalRef info = aSample->Info();
+
+ int32_t flags;
+ bool ok = NS_SUCCEEDED(info->Flags(&flags));
+ MOZ_ASSERT(ok);
+
+ int32_t offset;
+ ok |= NS_SUCCEEDED(info->Offset(&offset));
+ MOZ_ASSERT(ok);
+
+ int64_t presentationTimeUs;
+ ok |= NS_SUCCEEDED(info->PresentationTimeUs(&presentationTimeUs));
+ MOZ_ASSERT(ok);
+
+ int32_t size;
+ ok |= NS_SUCCEEDED(info->Size(&size));
+ MOZ_ASSERT(ok);
+
+ NS_ENSURE_TRUE_VOID(ok);
+
+ if (size > 0) {
+ RefPtr<layers::Image> img =
+ new SurfaceTextureImage(mDecoder->mSurfaceTexture.get(), mDecoder->mConfig.mDisplay,
+ gl::OriginPos::BottomLeft);
+
+ RefPtr<VideoData> v =
+ VideoData::CreateFromImage(mDecoder->mConfig,
+ offset,
+ presentationTimeUs,
+ durationUs.value(),
+ img,
+ !!(flags & MediaCodec::BUFFER_FLAG_SYNC_FRAME),
+ presentationTimeUs,
+ gfx::IntRect(0, 0,
+ mDecoder->mConfig.mDisplay.width,
+ mDecoder->mConfig.mDisplay.height));
+
+ mDecoderCallback->Output(v);
+ }
+
+ if ((flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM) != 0) {
+ mDecoderCallback->DrainComplete();
+ }
+ }
+
+ friend class RemoteDataDecoder;
+
+ private:
+ RemoteVideoDecoder* mDecoder;
+ };
+
+ RemoteVideoDecoder(const VideoInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer)
+ : RemoteDataDecoder(MediaData::Type::VIDEO_DATA, aConfig.mMimeType,
+ aFormat, aCallback)
+ , mImageContainer(aImageContainer)
+ , mConfig(aConfig)
+ {
+ }
+
+ RefPtr<InitPromise> Init() override
+ {
+ mSurfaceTexture = AndroidSurfaceTexture::Create();
+ if (!mSurfaceTexture) {
+ NS_WARNING("Failed to create SurfaceTexture for video decode\n");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (!jni::IsFennec()) {
+ NS_WARNING("Remote decoding not supported in non-Fennec environment\n");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ // Register native methods.
+ JavaCallbacksSupport::Init();
+
+ mJavaCallbacks = CodecProxy::NativeCallbacks::New();
+ JavaCallbacksSupport::AttachNative(mJavaCallbacks,
+ mozilla::MakeUnique<CallbacksSupport>(this, mCallback));
+
+ mJavaDecoder = CodecProxy::Create(mFormat, mSurfaceTexture->JavaSurface(), mJavaCallbacks);
+ if (mJavaDecoder == nullptr) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ mInputDurations.Clear();
+
+ return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
+ }
+
+ void Flush() override
+ {
+ mInputDurations.Clear();
+ RemoteDataDecoder::Flush();
+ }
+
+ void Drain() override
+ {
+ RemoteDataDecoder::Drain();
+ mInputDurations.Put(0);
+ }
+
+ void Input(MediaRawData* aSample) override
+ {
+ RemoteDataDecoder::Input(aSample);
+ mInputDurations.Put(aSample->mDuration);
+ }
+
+private:
+ class DurationQueue {
+ public:
+
+ void Clear()
+ {
+ mValues.clear();
+ }
+
+ void Put(int64_t aDurationUs)
+ {
+ mValues.emplace_back(aDurationUs);
+ }
+
+ Maybe<int64_t> Get()
+ {
+ if (mValues.empty()) {
+ return Nothing();
+ }
+
+ auto value = Some(mValues.front());
+ mValues.pop_front();
+
+ return value;
+ }
+
+ private:
+ std::deque<int64_t> mValues;
+ };
+
+ layers::ImageContainer* mImageContainer;
+ const VideoInfo& mConfig;
+ RefPtr<AndroidSurfaceTexture> mSurfaceTexture;
+ DurationQueue mInputDurations;
+};
+
+class RemoteAudioDecoder final : public RemoteDataDecoder
+{
+public:
+ RemoteAudioDecoder(const AudioInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback)
+ : RemoteDataDecoder(MediaData::Type::AUDIO_DATA, aConfig.mMimeType,
+ aFormat, aCallback)
+ , mConfig(aConfig)
+ {
+ JNIEnv* const env = jni::GetEnvForThread();
+
+ bool formatHasCSD = false;
+ NS_ENSURE_SUCCESS_VOID(aFormat->ContainsKey(NS_LITERAL_STRING("csd-0"), &formatHasCSD));
+
+ if (!formatHasCSD && aConfig.mCodecSpecificConfig->Length() >= 2) {
+ jni::ByteBuffer::LocalRef buffer(env);
+ buffer = jni::ByteBuffer::New(
+ aConfig.mCodecSpecificConfig->Elements(),
+ aConfig.mCodecSpecificConfig->Length());
+ NS_ENSURE_SUCCESS_VOID(aFormat->SetByteBuffer(NS_LITERAL_STRING("csd-0"),
+ buffer));
+ }
+ }
+
+ RefPtr<InitPromise> Init() override
+ {
+ // Register native methods.
+ JavaCallbacksSupport::Init();
+
+ mJavaCallbacks = CodecProxy::NativeCallbacks::New();
+ JavaCallbacksSupport::AttachNative(mJavaCallbacks,
+ mozilla::MakeUnique<CallbacksSupport>(this, mCallback));
+
+ mJavaDecoder = CodecProxy::Create(mFormat, nullptr, mJavaCallbacks);
+ if (mJavaDecoder == nullptr) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);
+ }
+
+private:
+ class CallbacksSupport final : public JavaCallbacksSupport
+ {
+ public:
+ CallbacksSupport(RemoteAudioDecoder* aDecoder, MediaDataDecoderCallback* aCallback)
+ : JavaCallbacksSupport(aCallback)
+ , mDecoder(aDecoder)
+ {}
+
+ virtual ~CallbacksSupport() {}
+
+ void HandleOutput(Sample::Param aSample) override
+ {
+ BufferInfo::LocalRef info = aSample->Info();
+
+ int32_t flags;
+ bool ok = NS_SUCCEEDED(info->Flags(&flags));
+ MOZ_ASSERT(ok);
+
+ int32_t offset;
+ ok |= NS_SUCCEEDED(info->Offset(&offset));
+ MOZ_ASSERT(ok);
+
+ int64_t presentationTimeUs;
+ ok |= NS_SUCCEEDED(info->PresentationTimeUs(&presentationTimeUs));
+ MOZ_ASSERT(ok);
+
+ int32_t size;
+ ok |= NS_SUCCEEDED(info->Size(&size));
+ MOZ_ASSERT(ok);
+
+ NS_ENSURE_TRUE_VOID(ok);
+
+ if (size > 0) {
+#ifdef MOZ_SAMPLE_TYPE_S16
+ const int32_t numSamples = size / 2;
+#else
+#error We only support 16-bit integer PCM
+#endif
+
+ const int32_t numFrames = numSamples / mOutputChannels;
+ AlignedAudioBuffer audio(numSamples);
+ if (!audio) {
+ return;
+ }
+
+ jni::ByteBuffer::LocalRef dest = jni::ByteBuffer::New(audio.get(), size);
+ aSample->WriteToByteBuffer(dest);
+
+ RefPtr<AudioData> data = new AudioData(0, presentationTimeUs,
+ FramesToUsecs(numFrames, mOutputSampleRate).value(),
+ numFrames,
+ Move(audio),
+ mOutputChannels,
+ mOutputSampleRate);
+
+ mDecoderCallback->Output(data);
+ }
+
+ if ((flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM) != 0) {
+ mDecoderCallback->DrainComplete();
+ return;
+ }
+ }
+
+ void HandleOutputFormatChanged(MediaFormat::Param aFormat) override
+ {
+ aFormat->GetInteger(NS_LITERAL_STRING("channel-count"), &mOutputChannels);
+ AudioConfig::ChannelLayout layout(mOutputChannels);
+ if (!layout.IsValid()) {
+ mDecoderCallback->Error(MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Invalid channel layout:%d", mOutputChannels)));
+ return;
+ }
+ aFormat->GetInteger(NS_LITERAL_STRING("sample-rate"), &mOutputSampleRate);
+ LOG("Audio output format changed: channels:%d sample rate:%d", mOutputChannels, mOutputSampleRate);
+ }
+
+ private:
+ RemoteAudioDecoder* mDecoder;
+ int32_t mOutputChannels;
+ int32_t mOutputSampleRate;
+ };
+
+ const AudioInfo& mConfig;
+};
+
+MediaDataDecoder*
+RemoteDataDecoder::CreateAudioDecoder(const AudioInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback)
+{
+ return new RemoteAudioDecoder(aConfig, aFormat, aCallback);
+}
+
+MediaDataDecoder*
+RemoteDataDecoder::CreateVideoDecoder(const VideoInfo& aConfig,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer)
+{
+ return new RemoteVideoDecoder(aConfig, aFormat, aCallback, aImageContainer);
+}
+
+RemoteDataDecoder::RemoteDataDecoder(MediaData::Type aType,
+ const nsACString& aMimeType,
+ MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback)
+ : mType(aType)
+ , mMimeType(aMimeType)
+ , mFormat(aFormat)
+ , mCallback(aCallback)
+{
+}
+
+void
+RemoteDataDecoder::Flush()
+{
+ mJavaDecoder->Flush();
+}
+
+void
+RemoteDataDecoder::Drain()
+{
+ BufferInfo::LocalRef bufferInfo;
+ nsresult rv = BufferInfo::New(&bufferInfo);
+ NS_ENSURE_SUCCESS_VOID(rv);
+ bufferInfo->Set(0, 0, -1, MediaCodec::BUFFER_FLAG_END_OF_STREAM);
+
+ mJavaDecoder->Input(nullptr, bufferInfo, nullptr);
+}
+
+void
+RemoteDataDecoder::Shutdown()
+{
+ LOG("");
+ MOZ_ASSERT(mJavaDecoder && mJavaCallbacks);
+
+ mJavaDecoder->Release();
+ mJavaDecoder = nullptr;
+
+ JavaCallbacksSupport::GetNative(mJavaCallbacks)->Cancel();
+ mJavaCallbacks = nullptr;
+
+ mFormat = nullptr;
+}
+
+void
+RemoteDataDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(aSample != nullptr);
+
+ jni::ByteBuffer::LocalRef bytes = jni::ByteBuffer::New(const_cast<uint8_t*>(aSample->Data()),
+ aSample->Size());
+
+ BufferInfo::LocalRef bufferInfo;
+ nsresult rv = BufferInfo::New(&bufferInfo);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__));
+ return;
+ }
+ bufferInfo->Set(0, aSample->Size(), aSample->mTime, 0);
+
+ mJavaDecoder->Input(bytes, bufferInfo, GetCryptoInfoFromSample(aSample));
+}
+
+} // mozilla
diff --git a/dom/media/platforms/android/RemoteDataDecoder.h b/dom/media/platforms/android/RemoteDataDecoder.h
new file mode 100644
index 000000000..219539a0a
--- /dev/null
+++ b/dom/media/platforms/android/RemoteDataDecoder.h
@@ -0,0 +1,62 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef RemoteDataDecoder_h_
+#define RemoteDataDecoder_h_
+
+#include "AndroidDecoderModule.h"
+
+#include "FennecJNIWrappers.h"
+
+#include "SurfaceTexture.h"
+#include "TimeUnits.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/Maybe.h"
+
+#include <deque>
+
+namespace mozilla {
+
+class RemoteDataDecoder : public MediaDataDecoder {
+public:
+ static MediaDataDecoder* CreateAudioDecoder(const AudioInfo& aConfig,
+ java::sdk::MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback);
+
+ static MediaDataDecoder* CreateVideoDecoder(const VideoInfo& aConfig,
+ java::sdk::MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer);
+
+ virtual ~RemoteDataDecoder() {}
+
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ void Input(MediaRawData* aSample) override;
+ const char* GetDescriptionName() const override
+ {
+ return "android remote decoder";
+ }
+
+protected:
+ RemoteDataDecoder(MediaData::Type aType,
+ const nsACString& aMimeType,
+ java::sdk::MediaFormat::Param aFormat,
+ MediaDataDecoderCallback* aCallback);
+
+ MediaData::Type mType;
+
+ nsAutoCString mMimeType;
+ java::sdk::MediaFormat::GlobalRef mFormat;
+
+ MediaDataDecoderCallback* mCallback;
+
+ java::CodecProxy::GlobalRef mJavaDecoder;
+ java::CodecProxy::NativeCallbacks::GlobalRef mJavaCallbacks;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/apple/AppleATDecoder.cpp b/dom/media/platforms/apple/AppleATDecoder.cpp
new file mode 100644
index 000000000..65794d82c
--- /dev/null
+++ b/dom/media/platforms/apple/AppleATDecoder.cpp
@@ -0,0 +1,722 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AppleUtils.h"
+#include "MP4Decoder.h"
+#include "mp4_demuxer/Adts.h"
+#include "MediaInfo.h"
+#include "AppleATDecoder.h"
+#include "mozilla/Logging.h"
+#include "mozilla/SyncRunnable.h"
+#include "mozilla/UniquePtr.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+#define FourCC2Str(n) ((char[5]){(char)(n >> 24), (char)(n >> 16), (char)(n >> 8), (char)(n), 0})
+
+namespace mozilla {
+
+AppleATDecoder::AppleATDecoder(const AudioInfo& aConfig,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback)
+ : mConfig(aConfig)
+ , mFileStreamError(false)
+ , mTaskQueue(aTaskQueue)
+ , mCallback(aCallback)
+ , mConverter(nullptr)
+ , mStream(nullptr)
+ , mIsFlushing(false)
+ , mParsedFramesForAACMagicCookie(0)
+ , mErrored(false)
+{
+ MOZ_COUNT_CTOR(AppleATDecoder);
+ LOG("Creating Apple AudioToolbox decoder");
+ LOG("Audio Decoder configuration: %s %d Hz %d channels %d bits per channel",
+ mConfig.mMimeType.get(),
+ mConfig.mRate,
+ mConfig.mChannels,
+ mConfig.mBitDepth);
+
+ if (mConfig.mMimeType.EqualsLiteral("audio/mpeg")) {
+ mFormatID = kAudioFormatMPEGLayer3;
+ } else if (mConfig.mMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ mFormatID = kAudioFormatMPEG4AAC;
+ } else {
+ mFormatID = 0;
+ }
+}
+
+AppleATDecoder::~AppleATDecoder()
+{
+ MOZ_COUNT_DTOR(AppleATDecoder);
+ MOZ_ASSERT(!mConverter);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+AppleATDecoder::Init()
+{
+ if (!mFormatID) {
+ NS_ERROR("Non recognised format");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(TrackType::kAudioTrack, __func__);
+}
+
+void
+AppleATDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ LOG("mp4 input sample %p %lld us %lld pts%s %llu bytes audio",
+ aSample,
+ aSample->mDuration,
+ aSample->mTime,
+ aSample->mKeyframe ? " keyframe" : "",
+ (unsigned long long)aSample->Size());
+
+ // Queue a task to perform the actual decoding on a separate thread.
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod<RefPtr<MediaRawData>>(
+ this,
+ &AppleATDecoder::SubmitSample,
+ RefPtr<MediaRawData>(aSample));
+ mTaskQueue->Dispatch(runnable.forget());
+}
+
+void
+AppleATDecoder::ProcessFlush()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ mQueuedSamples.Clear();
+ if (mConverter) {
+ OSStatus rv = AudioConverterReset(mConverter);
+ if (rv) {
+ LOG("Error %d resetting AudioConverter", rv);
+ }
+ }
+ if (mErrored) {
+ mParsedFramesForAACMagicCookie = 0;
+ mMagicCookie.Clear();
+ ProcessShutdown();
+ mErrored = false;
+ }
+}
+
+void
+AppleATDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ LOG("Flushing AudioToolbox AAC decoder");
+ mIsFlushing = true;
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &AppleATDecoder::ProcessFlush);
+ SyncRunnable::DispatchToThread(mTaskQueue, runnable);
+ mIsFlushing = false;
+}
+
+void
+AppleATDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ LOG("Draining AudioToolbox AAC decoder");
+ mTaskQueue->AwaitIdle();
+ mCallback->DrainComplete();
+ Flush();
+}
+
+void
+AppleATDecoder::Shutdown()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &AppleATDecoder::ProcessShutdown);
+ SyncRunnable::DispatchToThread(mTaskQueue, runnable);
+}
+
+void
+AppleATDecoder::ProcessShutdown()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ if (mStream) {
+ OSStatus rv = AudioFileStreamClose(mStream);
+ if (rv) {
+ LOG("error %d disposing of AudioFileStream", rv);
+ return;
+ }
+ mStream = nullptr;
+ }
+
+ if (mConverter) {
+ LOG("Shutdown: Apple AudioToolbox AAC decoder");
+ OSStatus rv = AudioConverterDispose(mConverter);
+ if (rv) {
+ LOG("error %d disposing of AudioConverter", rv);
+ }
+ mConverter = nullptr;
+ }
+}
+
+struct PassthroughUserData {
+ UInt32 mChannels;
+ UInt32 mDataSize;
+ const void* mData;
+ AudioStreamPacketDescription mPacket;
+};
+
+// Error value we pass through the decoder to signal that nothing
+// has gone wrong during decoding and we're done processing the packet.
+const uint32_t kNoMoreDataErr = 'MOAR';
+
+static OSStatus
+_PassthroughInputDataCallback(AudioConverterRef aAudioConverter,
+ UInt32* aNumDataPackets /* in/out */,
+ AudioBufferList* aData /* in/out */,
+ AudioStreamPacketDescription** aPacketDesc,
+ void* aUserData)
+{
+ PassthroughUserData* userData = (PassthroughUserData*)aUserData;
+ if (!userData->mDataSize) {
+ *aNumDataPackets = 0;
+ return kNoMoreDataErr;
+ }
+
+ if (aPacketDesc) {
+ userData->mPacket.mStartOffset = 0;
+ userData->mPacket.mVariableFramesInPacket = 0;
+ userData->mPacket.mDataByteSize = userData->mDataSize;
+ *aPacketDesc = &userData->mPacket;
+ }
+
+ aData->mBuffers[0].mNumberChannels = userData->mChannels;
+ aData->mBuffers[0].mDataByteSize = userData->mDataSize;
+ aData->mBuffers[0].mData = const_cast<void*>(userData->mData);
+
+ // No more data to provide following this run.
+ userData->mDataSize = 0;
+
+ return noErr;
+}
+
+void
+AppleATDecoder::SubmitSample(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ if (mIsFlushing) {
+ return;
+ }
+
+ MediaResult rv = NS_OK;
+ if (!mConverter) {
+ rv = SetupDecoder(aSample);
+ if (rv != NS_OK && rv != NS_ERROR_NOT_INITIALIZED) {
+ mCallback->Error(rv);
+ return;
+ }
+ }
+
+ mQueuedSamples.AppendElement(aSample);
+
+ if (rv == NS_OK) {
+ for (size_t i = 0; i < mQueuedSamples.Length(); i++) {
+ rv = DecodeSample(mQueuedSamples[i]);
+ if (NS_FAILED(rv)) {
+ mErrored = true;
+ mCallback->Error(rv);
+ return;
+ }
+ }
+ mQueuedSamples.Clear();
+ }
+ mCallback->InputExhausted();
+}
+
+MediaResult
+AppleATDecoder::DecodeSample(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ // Array containing the queued decoded audio frames, about to be output.
+ nsTArray<AudioDataValue> outputData;
+ UInt32 channels = mOutputFormat.mChannelsPerFrame;
+ // Pick a multiple of the frame size close to a power of two
+ // for efficient allocation.
+ const uint32_t MAX_AUDIO_FRAMES = 128;
+ const uint32_t maxDecodedSamples = MAX_AUDIO_FRAMES * channels;
+
+ // Descriptions for _decompressed_ audio packets. ignored.
+ auto packets = MakeUnique<AudioStreamPacketDescription[]>(MAX_AUDIO_FRAMES);
+
+ // This API insists on having packets spoon-fed to it from a callback.
+ // This structure exists only to pass our state.
+ PassthroughUserData userData =
+ { channels, (UInt32)aSample->Size(), aSample->Data() };
+
+ // Decompressed audio buffer
+ AlignedAudioBuffer decoded(maxDecodedSamples);
+ if (!decoded) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+ do {
+ AudioBufferList decBuffer;
+ decBuffer.mNumberBuffers = 1;
+ decBuffer.mBuffers[0].mNumberChannels = channels;
+ decBuffer.mBuffers[0].mDataByteSize =
+ maxDecodedSamples * sizeof(AudioDataValue);
+ decBuffer.mBuffers[0].mData = decoded.get();
+
+ // in: the max number of packets we can handle from the decoder.
+ // out: the number of packets the decoder is actually returning.
+ UInt32 numFrames = MAX_AUDIO_FRAMES;
+
+ OSStatus rv = AudioConverterFillComplexBuffer(mConverter,
+ _PassthroughInputDataCallback,
+ &userData,
+ &numFrames /* in/out */,
+ &decBuffer,
+ packets.get());
+
+ if (rv && rv != kNoMoreDataErr) {
+ LOG("Error decoding audio sample: %d\n", rv);
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Error decoding audio sample: %d @ %lld",
+ rv, aSample->mTime));
+ }
+
+ if (numFrames) {
+ outputData.AppendElements(decoded.get(), numFrames * channels);
+ }
+
+ if (rv == kNoMoreDataErr) {
+ break;
+ }
+ } while (true);
+
+ if (outputData.IsEmpty()) {
+ return NS_OK;
+ }
+
+ size_t numFrames = outputData.Length() / channels;
+ int rate = mOutputFormat.mSampleRate;
+ media::TimeUnit duration = FramesToTimeUnit(numFrames, rate);
+ if (!duration.IsValid()) {
+ NS_WARNING("Invalid count of accumulated audio samples");
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL(
+ "Invalid count of accumulated audio samples: num:%llu rate:%d",
+ uint64_t(numFrames), rate));
+ }
+
+#ifdef LOG_SAMPLE_DECODE
+ LOG("pushed audio at time %lfs; duration %lfs\n",
+ (double)aSample->mTime / USECS_PER_S,
+ duration.ToSeconds());
+#endif
+
+ AudioSampleBuffer data(outputData.Elements(), outputData.Length());
+ if (!data.Data()) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ if (mChannelLayout && !mAudioConverter) {
+ AudioConfig in(*mChannelLayout.get(), rate);
+ AudioConfig out(channels, rate);
+ if (!in.IsValid() || !out.IsValid()) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("Invalid audio config"));
+ }
+ mAudioConverter = MakeUnique<AudioConverter>(in, out);
+ }
+ if (mAudioConverter) {
+ MOZ_ASSERT(mAudioConverter->CanWorkInPlace());
+ data = mAudioConverter->Process(Move(data));
+ }
+
+ RefPtr<AudioData> audio = new AudioData(aSample->mOffset,
+ aSample->mTime,
+ duration.ToMicroseconds(),
+ numFrames,
+ data.Forget(),
+ channels,
+ rate);
+ mCallback->Output(audio);
+ return NS_OK;
+}
+
+MediaResult
+AppleATDecoder::GetInputAudioDescription(AudioStreamBasicDescription& aDesc,
+ const nsTArray<uint8_t>& aExtraData)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ // Request the properties from CoreAudio using the codec magic cookie
+ AudioFormatInfo formatInfo;
+ PodZero(&formatInfo.mASBD);
+ formatInfo.mASBD.mFormatID = mFormatID;
+ if (mFormatID == kAudioFormatMPEG4AAC) {
+ formatInfo.mASBD.mFormatFlags = mConfig.mExtendedProfile;
+ }
+ formatInfo.mMagicCookieSize = aExtraData.Length();
+ formatInfo.mMagicCookie = aExtraData.Elements();
+
+ UInt32 formatListSize;
+ // Attempt to retrieve the default format using
+ // kAudioFormatProperty_FormatInfo method.
+ // This method only retrieves the FramesPerPacket information required
+ // by the decoder, which depends on the codec type and profile.
+ aDesc.mFormatID = mFormatID;
+ aDesc.mChannelsPerFrame = mConfig.mChannels;
+ aDesc.mSampleRate = mConfig.mRate;
+ UInt32 inputFormatSize = sizeof(aDesc);
+ OSStatus rv = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,
+ 0,
+ NULL,
+ &inputFormatSize,
+ &aDesc);
+ if (NS_WARN_IF(rv)) {
+ return MediaResult(
+ NS_ERROR_FAILURE,
+ RESULT_DETAIL("Unable to get format info:%lld", int64_t(rv)));
+ }
+
+ // If any of the methods below fail, we will return the default format as
+ // created using kAudioFormatProperty_FormatInfo above.
+ rv = AudioFormatGetPropertyInfo(kAudioFormatProperty_FormatList,
+ sizeof(formatInfo),
+ &formatInfo,
+ &formatListSize);
+ if (rv || (formatListSize % sizeof(AudioFormatListItem))) {
+ return NS_OK;
+ }
+ size_t listCount = formatListSize / sizeof(AudioFormatListItem);
+ auto formatList = MakeUnique<AudioFormatListItem[]>(listCount);
+
+ rv = AudioFormatGetProperty(kAudioFormatProperty_FormatList,
+ sizeof(formatInfo),
+ &formatInfo,
+ &formatListSize,
+ formatList.get());
+ if (rv) {
+ return NS_OK;
+ }
+ LOG("found %u available audio stream(s)",
+ formatListSize / sizeof(AudioFormatListItem));
+ // Get the index number of the first playable format.
+ // This index number will be for the highest quality layer the platform
+ // is capable of playing.
+ UInt32 itemIndex;
+ UInt32 indexSize = sizeof(itemIndex);
+ rv = AudioFormatGetProperty(kAudioFormatProperty_FirstPlayableFormatFromList,
+ formatListSize,
+ formatList.get(),
+ &indexSize,
+ &itemIndex);
+ if (rv) {
+ return NS_OK;
+ }
+
+ aDesc = formatList[itemIndex].mASBD;
+
+ return NS_OK;
+}
+
+AudioConfig::Channel
+ConvertChannelLabel(AudioChannelLabel id)
+{
+ switch (id) {
+ case kAudioChannelLabel_Mono:
+ return AudioConfig::CHANNEL_MONO;
+ case kAudioChannelLabel_Left:
+ return AudioConfig::CHANNEL_LEFT;
+ case kAudioChannelLabel_Right:
+ return AudioConfig::CHANNEL_RIGHT;
+ case kAudioChannelLabel_Center:
+ return AudioConfig::CHANNEL_CENTER;
+ case kAudioChannelLabel_LFEScreen:
+ return AudioConfig::CHANNEL_LFE;
+ case kAudioChannelLabel_LeftSurround:
+ return AudioConfig::CHANNEL_LS;
+ case kAudioChannelLabel_RightSurround:
+ return AudioConfig::CHANNEL_RS;
+ case kAudioChannelLabel_CenterSurround:
+ return AudioConfig::CHANNEL_RCENTER;
+ case kAudioChannelLabel_RearSurroundLeft:
+ return AudioConfig::CHANNEL_RLS;
+ case kAudioChannelLabel_RearSurroundRight:
+ return AudioConfig::CHANNEL_RRS;
+ default:
+ return AudioConfig::CHANNEL_INVALID;
+ }
+}
+
+// Will set mChannelLayout if a channel layout could properly be identified
+// and is supported.
+nsresult
+AppleATDecoder::SetupChannelLayout()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ // Determine the channel layout.
+ UInt32 propertySize;
+ UInt32 size;
+ OSStatus status =
+ AudioConverterGetPropertyInfo(mConverter,
+ kAudioConverterOutputChannelLayout,
+ &propertySize, NULL);
+ if (status || !propertySize) {
+ LOG("Couldn't get channel layout property (%s)", FourCC2Str(status));
+ return NS_ERROR_FAILURE;
+ }
+
+ auto data = MakeUnique<uint8_t[]>(propertySize);
+ size = propertySize;
+ status =
+ AudioConverterGetProperty(mConverter, kAudioConverterInputChannelLayout,
+ &size, data.get());
+ if (status || size != propertySize) {
+ LOG("Couldn't get channel layout property (%s)",
+ FourCC2Str(status));
+ return NS_ERROR_FAILURE;
+ }
+
+ AudioChannelLayout* layout =
+ reinterpret_cast<AudioChannelLayout*>(data.get());
+ AudioChannelLayoutTag tag = layout->mChannelLayoutTag;
+
+ // if tag is kAudioChannelLayoutTag_UseChannelDescriptions then the structure
+ // directly contains the the channel layout mapping.
+ // If tag is kAudioChannelLayoutTag_UseChannelBitmap then the layout will
+ // be defined via the bitmap and can be retrieved using
+ // kAudioFormatProperty_ChannelLayoutForBitmap property.
+ // Otherwise the tag itself describes the layout.
+ if (tag != kAudioChannelLayoutTag_UseChannelDescriptions) {
+ AudioFormatPropertyID property =
+ tag == kAudioChannelLayoutTag_UseChannelBitmap
+ ? kAudioFormatProperty_ChannelLayoutForBitmap
+ : kAudioFormatProperty_ChannelLayoutForTag;
+
+ if (property == kAudioFormatProperty_ChannelLayoutForBitmap) {
+ status =
+ AudioFormatGetPropertyInfo(property,
+ sizeof(UInt32), &layout->mChannelBitmap,
+ &propertySize);
+ } else {
+ status =
+ AudioFormatGetPropertyInfo(property,
+ sizeof(AudioChannelLayoutTag), &tag,
+ &propertySize);
+ }
+ if (status || !propertySize) {
+ LOG("Couldn't get channel layout property info (%s:%s)",
+ FourCC2Str(property), FourCC2Str(status));
+ return NS_ERROR_FAILURE;
+ }
+ data = MakeUnique<uint8_t[]>(propertySize);
+ layout = reinterpret_cast<AudioChannelLayout*>(data.get());
+ size = propertySize;
+
+ if (property == kAudioFormatProperty_ChannelLayoutForBitmap) {
+ status = AudioFormatGetProperty(property,
+ sizeof(UInt32), &layout->mChannelBitmap,
+ &size, layout);
+ } else {
+ status = AudioFormatGetProperty(property,
+ sizeof(AudioChannelLayoutTag), &tag,
+ &size, layout);
+ }
+ if (status || size != propertySize) {
+ LOG("Couldn't get channel layout property (%s:%s)",
+ FourCC2Str(property), FourCC2Str(status));
+ return NS_ERROR_FAILURE;
+ }
+ // We have retrieved the channel layout from the tag or bitmap.
+ // We can now directly use the channel descriptions.
+ layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions;
+ }
+
+ if (layout->mNumberChannelDescriptions > MAX_AUDIO_CHANNELS ||
+ layout->mNumberChannelDescriptions != mOutputFormat.mChannelsPerFrame) {
+ LOG("Nonsensical channel layout or not matching the original channel number");
+ return NS_ERROR_FAILURE;
+ }
+
+ AudioConfig::Channel channels[MAX_AUDIO_CHANNELS];
+ for (uint32_t i = 0; i < layout->mNumberChannelDescriptions; i++) {
+ AudioChannelLabel id = layout->mChannelDescriptions[i].mChannelLabel;
+ AudioConfig::Channel channel = ConvertChannelLabel(id);
+ channels[i] = channel;
+ }
+ mChannelLayout =
+ MakeUnique<AudioConfig::ChannelLayout>(mOutputFormat.mChannelsPerFrame,
+ channels);
+ return NS_OK;
+}
+
+MediaResult
+AppleATDecoder::SetupDecoder(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ static const uint32_t MAX_FRAMES = 2;
+
+ if (mFormatID == kAudioFormatMPEG4AAC &&
+ mConfig.mExtendedProfile == 2 &&
+ mParsedFramesForAACMagicCookie < MAX_FRAMES) {
+ // Check for implicit SBR signalling if stream is AAC-LC
+ // This will provide us with an updated magic cookie for use with
+ // GetInputAudioDescription.
+ if (NS_SUCCEEDED(GetImplicitAACMagicCookie(aSample)) &&
+ !mMagicCookie.Length()) {
+ // nothing found yet, will try again later
+ mParsedFramesForAACMagicCookie++;
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ // An error occurred, fallback to using default stream description
+ }
+
+ LOG("Initializing Apple AudioToolbox decoder");
+
+ AudioStreamBasicDescription inputFormat;
+ PodZero(&inputFormat);
+ MediaResult rv =
+ GetInputAudioDescription(inputFormat,
+ mMagicCookie.Length() ?
+ mMagicCookie : *mConfig.mExtraData);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ // Fill in the output format manually.
+ PodZero(&mOutputFormat);
+ mOutputFormat.mFormatID = kAudioFormatLinearPCM;
+ mOutputFormat.mSampleRate = inputFormat.mSampleRate;
+ mOutputFormat.mChannelsPerFrame = inputFormat.mChannelsPerFrame;
+#if defined(MOZ_SAMPLE_TYPE_FLOAT32)
+ mOutputFormat.mBitsPerChannel = 32;
+ mOutputFormat.mFormatFlags =
+ kLinearPCMFormatFlagIsFloat |
+ 0;
+#elif defined(MOZ_SAMPLE_TYPE_S16)
+ mOutputFormat.mBitsPerChannel = 16;
+ mOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | 0;
+#else
+# error Unknown audio sample type
+#endif
+ // Set up the decoder so it gives us one sample per frame
+ mOutputFormat.mFramesPerPacket = 1;
+ mOutputFormat.mBytesPerPacket = mOutputFormat.mBytesPerFrame
+ = mOutputFormat.mChannelsPerFrame * mOutputFormat.mBitsPerChannel / 8;
+
+ OSStatus status = AudioConverterNew(&inputFormat, &mOutputFormat, &mConverter);
+ if (status) {
+ LOG("Error %d constructing AudioConverter", status);
+ mConverter = nullptr;
+ return MediaResult(
+ NS_ERROR_FAILURE,
+ RESULT_DETAIL("Error constructing AudioConverter:%lld", int64_t(status)));
+ }
+
+ if (NS_FAILED(SetupChannelLayout())) {
+ NS_WARNING("Couldn't retrieve channel layout, will use default layout");
+ }
+
+ return NS_OK;
+}
+
+static void
+_MetadataCallback(void* aAppleATDecoder,
+ AudioFileStreamID aStream,
+ AudioFileStreamPropertyID aProperty,
+ UInt32* aFlags)
+{
+ AppleATDecoder* decoder = static_cast<AppleATDecoder*>(aAppleATDecoder);
+ LOG("MetadataCallback receiving: '%s'", FourCC2Str(aProperty));
+ if (aProperty == kAudioFileStreamProperty_MagicCookieData) {
+ UInt32 size;
+ Boolean writeable;
+ OSStatus rv = AudioFileStreamGetPropertyInfo(aStream,
+ aProperty,
+ &size,
+ &writeable);
+ if (rv) {
+ LOG("Couldn't get property info for '%s' (%s)",
+ FourCC2Str(aProperty), FourCC2Str(rv));
+ decoder->mFileStreamError = true;
+ return;
+ }
+ auto data = MakeUnique<uint8_t[]>(size);
+ rv = AudioFileStreamGetProperty(aStream, aProperty,
+ &size, data.get());
+ if (rv) {
+ LOG("Couldn't get property '%s' (%s)",
+ FourCC2Str(aProperty), FourCC2Str(rv));
+ decoder->mFileStreamError = true;
+ return;
+ }
+ decoder->mMagicCookie.AppendElements(data.get(), size);
+ }
+}
+
+static void
+_SampleCallback(void* aSBR,
+ UInt32 aNumBytes,
+ UInt32 aNumPackets,
+ const void* aData,
+ AudioStreamPacketDescription* aPackets)
+{
+}
+
+nsresult
+AppleATDecoder::GetImplicitAACMagicCookie(const MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ // Prepend ADTS header to AAC audio.
+ RefPtr<MediaRawData> adtssample(aSample->Clone());
+ if (!adtssample) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ int8_t frequency_index =
+ mp4_demuxer::Adts::GetFrequencyIndex(mConfig.mRate);
+
+ bool rv = mp4_demuxer::Adts::ConvertSample(mConfig.mChannels,
+ frequency_index,
+ mConfig.mProfile,
+ adtssample);
+ if (!rv) {
+ NS_WARNING("Failed to apply ADTS header");
+ return NS_ERROR_FAILURE;
+ }
+ if (!mStream) {
+ OSStatus rv = AudioFileStreamOpen(this,
+ _MetadataCallback,
+ _SampleCallback,
+ kAudioFileAAC_ADTSType,
+ &mStream);
+ if (rv) {
+ NS_WARNING("Couldn't open AudioFileStream");
+ return NS_ERROR_FAILURE;
+ }
+ }
+
+ OSStatus status = AudioFileStreamParseBytes(mStream,
+ adtssample->Size(),
+ adtssample->Data(),
+ 0 /* discontinuity */);
+ if (status) {
+ NS_WARNING("Couldn't parse sample");
+ }
+
+ if (status || mFileStreamError || mMagicCookie.Length()) {
+ // We have decoded a magic cookie or an error occurred as such
+ // we won't need the stream any longer.
+ AudioFileStreamClose(mStream);
+ mStream = nullptr;
+ }
+
+ return (mFileStreamError || status) ? NS_ERROR_FAILURE : NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/apple/AppleATDecoder.h b/dom/media/platforms/apple/AppleATDecoder.h
new file mode 100644
index 000000000..be232e07b
--- /dev/null
+++ b/dom/media/platforms/apple/AppleATDecoder.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_AppleATDecoder_h
+#define mozilla_AppleATDecoder_h
+
+#include <AudioToolbox/AudioToolbox.h>
+#include "PlatformDecoderModule.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/Vector.h"
+#include "nsIThread.h"
+#include "AudioConverter.h"
+
+namespace mozilla {
+
+class TaskQueue;
+class MediaDataDecoderCallback;
+
+class AppleATDecoder : public MediaDataDecoder {
+public:
+ AppleATDecoder(const AudioInfo& aConfig,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback);
+ virtual ~AppleATDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "apple CoreMedia decoder";
+ }
+
+ // Callbacks also need access to the config.
+ const AudioInfo& mConfig;
+
+ // Use to extract magic cookie for HE-AAC detection.
+ nsTArray<uint8_t> mMagicCookie;
+ // Will be set to true should an error occurred while attempting to retrieve
+ // the magic cookie property.
+ bool mFileStreamError;
+
+private:
+ const RefPtr<TaskQueue> mTaskQueue;
+ MediaDataDecoderCallback* mCallback;
+ AudioConverterRef mConverter;
+ AudioStreamBasicDescription mOutputFormat;
+ UInt32 mFormatID;
+ AudioFileStreamID mStream;
+ nsTArray<RefPtr<MediaRawData>> mQueuedSamples;
+ UniquePtr<AudioConfig::ChannelLayout> mChannelLayout;
+ UniquePtr<AudioConverter> mAudioConverter;
+ Atomic<bool> mIsFlushing;
+
+ void ProcessFlush();
+ void ProcessShutdown();
+ void SubmitSample(MediaRawData* aSample);
+ MediaResult DecodeSample(MediaRawData* aSample);
+ MediaResult GetInputAudioDescription(AudioStreamBasicDescription& aDesc,
+ const nsTArray<uint8_t>& aExtraData);
+ // Setup AudioConverter once all information required has been gathered.
+ // Will return NS_ERROR_NOT_INITIALIZED if more data is required.
+ MediaResult SetupDecoder(MediaRawData* aSample);
+ nsresult GetImplicitAACMagicCookie(const MediaRawData* aSample);
+ nsresult SetupChannelLayout();
+ uint32_t mParsedFramesForAACMagicCookie;
+ bool mErrored;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_AppleATDecoder_h
diff --git a/dom/media/platforms/apple/AppleCMFunctions.h b/dom/media/platforms/apple/AppleCMFunctions.h
new file mode 100644
index 000000000..2c0408490
--- /dev/null
+++ b/dom/media/platforms/apple/AppleCMFunctions.h
@@ -0,0 +1,12 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct references to each of the CoreMedia symbols we use.
+
+LINK_FUNC(VideoFormatDescriptionCreate)
+LINK_FUNC(BlockBufferCreateWithMemoryBlock)
+LINK_FUNC(SampleBufferCreate)
+LINK_FUNC(TimeMake)
diff --git a/dom/media/platforms/apple/AppleCMLinker.cpp b/dom/media/platforms/apple/AppleCMLinker.cpp
new file mode 100644
index 000000000..5227bf9e5
--- /dev/null
+++ b/dom/media/platforms/apple/AppleCMLinker.cpp
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <dlfcn.h>
+
+#include "AppleCMLinker.h"
+#include "mozilla/ArrayUtils.h"
+#include "nsDebug.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+namespace mozilla {
+
+AppleCMLinker::LinkStatus
+AppleCMLinker::sLinkStatus = LinkStatus_INIT;
+
+void* AppleCMLinker::sLink = nullptr;
+CFStringRef AppleCMLinker::skPropExtensionAtoms = nullptr;
+CFStringRef AppleCMLinker::skPropFullRangeVideo = nullptr;
+
+#define LINK_FUNC(func) typeof(CM ## func) CM ## func;
+#include "AppleCMFunctions.h"
+#undef LINK_FUNC
+
+/* static */ bool
+AppleCMLinker::Link()
+{
+ if (sLinkStatus) {
+ return sLinkStatus == LinkStatus_SUCCEEDED;
+ }
+
+ const char* dlnames[] =
+ { "/System/Library/Frameworks/CoreMedia.framework/CoreMedia",
+ "/System/Library/PrivateFrameworks/CoreMedia.framework/CoreMedia" };
+ bool dlfound = false;
+ for (size_t i = 0; i < ArrayLength(dlnames); i++) {
+ if ((sLink = dlopen(dlnames[i], RTLD_NOW | RTLD_LOCAL))) {
+ dlfound = true;
+ break;
+ }
+ }
+ if (!dlfound) {
+ NS_WARNING("Couldn't load CoreMedia framework");
+ goto fail;
+ }
+
+#define LINK_FUNC2(func) \
+ func = (typeof(func))dlsym(sLink, #func); \
+ if (!func) { \
+ NS_WARNING("Couldn't load CoreMedia function " #func ); \
+ goto fail; \
+ }
+#define LINK_FUNC(func) LINK_FUNC2(CM ## func)
+#include "AppleCMFunctions.h"
+#undef LINK_FUNC
+#undef LINK_FUNC2
+
+ skPropExtensionAtoms =
+ GetIOConst("kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms");
+
+ skPropFullRangeVideo =
+ GetIOConst("kCMFormatDescriptionExtension_FullRangeVideo");
+
+ if (!skPropExtensionAtoms) {
+ goto fail;
+ }
+
+ LOG("Loaded CoreMedia framework.");
+ sLinkStatus = LinkStatus_SUCCEEDED;
+ return true;
+
+fail:
+ Unlink();
+
+ sLinkStatus = LinkStatus_FAILED;
+ return false;
+}
+
+/* static */ void
+AppleCMLinker::Unlink()
+{
+ if (sLink) {
+ LOG("Unlinking CoreMedia framework.");
+ dlclose(sLink);
+ sLink = nullptr;
+ sLinkStatus = LinkStatus_INIT;
+ }
+}
+
+/* static */ CFStringRef
+AppleCMLinker::GetIOConst(const char* symbol)
+{
+ CFStringRef* address = (CFStringRef*)dlsym(sLink, symbol);
+ if (!address) {
+ return nullptr;
+ }
+
+ return *address;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/apple/AppleCMLinker.h b/dom/media/platforms/apple/AppleCMLinker.h
new file mode 100644
index 000000000..74372b6af
--- /dev/null
+++ b/dom/media/platforms/apple/AppleCMLinker.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AppleCMLinker_h
+#define AppleCMLinker_h
+
+extern "C" {
+#pragma GCC visibility push(default)
+#include <CoreMedia/CoreMedia.h>
+#pragma GCC visibility pop
+}
+
+#include "nscore.h"
+
+namespace mozilla {
+
+class AppleCMLinker
+{
+public:
+ static bool Link();
+ static void Unlink();
+ static CFStringRef skPropExtensionAtoms;
+ static CFStringRef skPropFullRangeVideo;
+
+private:
+ static void* sLink;
+
+ static enum LinkStatus {
+ LinkStatus_INIT = 0,
+ LinkStatus_FAILED,
+ LinkStatus_SUCCEEDED
+ } sLinkStatus;
+
+ static CFStringRef GetIOConst(const char* symbol);
+};
+
+#define LINK_FUNC(func) extern typeof(CM ## func)* CM ## func;
+#include "AppleCMFunctions.h"
+#undef LINK_FUNC
+
+} // namespace mozilla
+
+#endif // AppleCMLinker_h
diff --git a/dom/media/platforms/apple/AppleDecoderModule.cpp b/dom/media/platforms/apple/AppleDecoderModule.cpp
new file mode 100644
index 000000000..9976c86ab
--- /dev/null
+++ b/dom/media/platforms/apple/AppleDecoderModule.cpp
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AppleATDecoder.h"
+#include "AppleCMLinker.h"
+#include "AppleDecoderModule.h"
+#include "AppleVTDecoder.h"
+#include "AppleVTLinker.h"
+#include "MacIOSurfaceImage.h"
+#include "MediaPrefs.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/Logging.h"
+#include "mozilla/gfx/gfxVars.h"
+
+namespace mozilla {
+
+bool AppleDecoderModule::sInitialized = false;
+bool AppleDecoderModule::sIsCoreMediaAvailable = false;
+bool AppleDecoderModule::sIsVTAvailable = false;
+bool AppleDecoderModule::sIsVTHWAvailable = false;
+bool AppleDecoderModule::sCanUseHardwareVideoDecoder = true;
+
+AppleDecoderModule::AppleDecoderModule()
+{
+}
+
+AppleDecoderModule::~AppleDecoderModule()
+{
+}
+
+/* static */
+void
+AppleDecoderModule::Init()
+{
+ if (sInitialized) {
+ return;
+ }
+
+ // Ensure IOSurface framework is loaded.
+ MacIOSurfaceLib::LoadLibrary();
+ const bool loaded = MacIOSurfaceLib::isInit();
+
+ // dlopen CoreMedia.framework if it's available.
+ sIsCoreMediaAvailable = AppleCMLinker::Link();
+ // dlopen VideoToolbox.framework if it's available.
+ // We must link both CM and VideoToolbox framework to allow for proper
+ // paired Link/Unlink calls
+ bool haveVideoToolbox = loaded && AppleVTLinker::Link();
+ sIsVTAvailable = sIsCoreMediaAvailable && haveVideoToolbox;
+
+ sIsVTHWAvailable = AppleVTLinker::skPropEnableHWAccel != nullptr;
+
+ sCanUseHardwareVideoDecoder = loaded &&
+ gfx::gfxVars::CanUseHardwareVideoDecoding();
+
+ sInitialized = true;
+}
+
+nsresult
+AppleDecoderModule::Startup()
+{
+ if (!sInitialized || !sIsVTAvailable) {
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+already_AddRefed<MediaDataDecoder>
+AppleDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<MediaDataDecoder> decoder =
+ new AppleVTDecoder(aParams.VideoConfig(),
+ aParams.mTaskQueue,
+ aParams.mCallback,
+ aParams.mImageContainer);
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+AppleDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<MediaDataDecoder> decoder =
+ new AppleATDecoder(aParams.AudioConfig(),
+ aParams.mTaskQueue,
+ aParams.mCallback);
+ return decoder.forget();
+}
+
+bool
+AppleDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ return (sIsCoreMediaAvailable &&
+ (aMimeType.EqualsLiteral("audio/mpeg") ||
+ aMimeType.EqualsLiteral("audio/mp4a-latm"))) ||
+ (sIsVTAvailable && (aMimeType.EqualsLiteral("video/mp4") ||
+ aMimeType.EqualsLiteral("video/avc")));
+}
+
+PlatformDecoderModule::ConversionRequired
+AppleDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ if (aConfig.IsVideo()) {
+ return ConversionRequired::kNeedAVCC;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/apple/AppleDecoderModule.h b/dom/media/platforms/apple/AppleDecoderModule.h
new file mode 100644
index 000000000..43a828e63
--- /dev/null
+++ b/dom/media/platforms/apple/AppleDecoderModule.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_AppleDecoderModule_h
+#define mozilla_AppleDecoderModule_h
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class AppleDecoderModule : public PlatformDecoderModule {
+public:
+ AppleDecoderModule();
+ virtual ~AppleDecoderModule();
+
+ nsresult Startup() override;
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+
+ static void Init();
+
+ static bool sCanUseHardwareVideoDecoder;
+
+private:
+ static bool sInitialized;
+ static bool sIsCoreMediaAvailable;
+ static bool sIsVTAvailable;
+ static bool sIsVTHWAvailable;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_AppleDecoderModule_h
diff --git a/dom/media/platforms/apple/AppleUtils.h b/dom/media/platforms/apple/AppleUtils.h
new file mode 100644
index 000000000..9e30aff86
--- /dev/null
+++ b/dom/media/platforms/apple/AppleUtils.h
@@ -0,0 +1,98 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Utility functions to help with Apple API calls.
+
+#ifndef mozilla_AppleUtils_h
+#define mozilla_AppleUtils_h
+
+#include "mozilla/Attributes.h"
+
+namespace mozilla {
+
+// Wrapper class to call CFRelease on reference types
+// when they go out of scope.
+template <class T>
+class AutoCFRelease {
+public:
+ MOZ_IMPLICIT AutoCFRelease(T aRef)
+ : mRef(aRef)
+ {
+ }
+ ~AutoCFRelease()
+ {
+ if (mRef) {
+ CFRelease(mRef);
+ }
+ }
+ // Return the wrapped ref so it can be used as an in parameter.
+ operator T()
+ {
+ return mRef;
+ }
+ // Return a pointer to the wrapped ref for use as an out parameter.
+ T* receive()
+ {
+ return &mRef;
+ }
+
+private:
+ // Copy operator isn't supported and is not implemented.
+ AutoCFRelease<T>& operator=(const AutoCFRelease<T>&);
+ T mRef;
+};
+
+// CFRefPtr: A CoreFoundation smart pointer.
+template <class T>
+class CFRefPtr {
+public:
+ explicit CFRefPtr(T aRef)
+ : mRef(aRef)
+ {
+ if (mRef) {
+ CFRetain(mRef);
+ }
+ }
+ // Copy constructor.
+ CFRefPtr(const CFRefPtr<T>& aCFRefPtr)
+ : mRef(aCFRefPtr.mRef)
+ {
+ if (mRef) {
+ CFRetain(mRef);
+ }
+ }
+ // Copy operator
+ CFRefPtr<T>& operator=(const CFRefPtr<T>& aCFRefPtr)
+ {
+ if (mRef == aCFRefPtr.mRef) {
+ return;
+ }
+ if (mRef) {
+ CFRelease(mRef);
+ }
+ mRef = aCFRefPtr.mRef;
+ if (mRef) {
+ CFRetain(mRef);
+ }
+ return *this;
+ }
+ ~CFRefPtr()
+ {
+ if (mRef) {
+ CFRelease(mRef);
+ }
+ }
+ // Return the wrapped ref so it can be used as an in parameter.
+ operator T()
+ {
+ return mRef;
+ }
+
+private:
+ T mRef;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_AppleUtils_h
diff --git a/dom/media/platforms/apple/AppleVTDecoder.cpp b/dom/media/platforms/apple/AppleVTDecoder.cpp
new file mode 100644
index 000000000..81638870a
--- /dev/null
+++ b/dom/media/platforms/apple/AppleVTDecoder.cpp
@@ -0,0 +1,674 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <CoreFoundation/CFString.h>
+
+#include "AppleCMLinker.h"
+#include "AppleDecoderModule.h"
+#include "AppleUtils.h"
+#include "AppleVTDecoder.h"
+#include "AppleVTLinker.h"
+#include "MediaData.h"
+#include "mozilla/ArrayUtils.h"
+#include "mp4_demuxer/H264.h"
+#include "nsAutoPtr.h"
+#include "nsThreadUtils.h"
+#include "mozilla/Logging.h"
+#include "VideoUtils.h"
+#include "gfxPlatform.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+namespace mozilla {
+
+AppleVTDecoder::AppleVTDecoder(const VideoInfo& aConfig,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer)
+ : mExtraData(aConfig.mExtraData)
+ , mCallback(aCallback)
+ , mPictureWidth(aConfig.mImage.width)
+ , mPictureHeight(aConfig.mImage.height)
+ , mDisplayWidth(aConfig.mDisplay.width)
+ , mDisplayHeight(aConfig.mDisplay.height)
+ , mTaskQueue(aTaskQueue)
+ , mMaxRefFrames(mp4_demuxer::H264::ComputeMaxRefFrames(aConfig.mExtraData))
+ , mImageContainer(aImageContainer)
+ , mIsShutDown(false)
+#ifdef MOZ_WIDGET_UIKIT
+ , mUseSoftwareImages(true)
+#else
+ , mUseSoftwareImages(false)
+#endif
+ , mIsFlushing(false)
+ , mMonitor("AppleVideoDecoder")
+ , mFormat(nullptr)
+ , mSession(nullptr)
+ , mIsHardwareAccelerated(false)
+{
+ MOZ_COUNT_CTOR(AppleVTDecoder);
+ // TODO: Verify aConfig.mime_type.
+ LOG("Creating AppleVTDecoder for %dx%d h.264 video",
+ mDisplayWidth,
+ mDisplayHeight
+ );
+}
+
+AppleVTDecoder::~AppleVTDecoder()
+{
+ MOZ_COUNT_DTOR(AppleVTDecoder);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+AppleVTDecoder::Init()
+{
+ nsresult rv = InitializeSession();
+
+ if (NS_SUCCEEDED(rv)) {
+ return InitPromise::CreateAndResolve(TrackType::kVideoTrack, __func__);
+ }
+
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+}
+
+void
+AppleVTDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+
+ LOG("mp4 input sample %p pts %lld duration %lld us%s %d bytes",
+ aSample,
+ aSample->mTime,
+ aSample->mDuration,
+ aSample->mKeyframe ? " keyframe" : "",
+ aSample->Size());
+
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &AppleVTDecoder::ProcessDecode, aSample));
+}
+
+void
+AppleVTDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mIsFlushing = true;
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &AppleVTDecoder::ProcessFlush);
+ SyncRunnable::DispatchToThread(mTaskQueue, runnable);
+ mIsFlushing = false;
+
+ mSeekTargetThreshold.reset();
+}
+
+void
+AppleVTDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &AppleVTDecoder::ProcessDrain);
+ mTaskQueue->Dispatch(runnable.forget());
+}
+
+void
+AppleVTDecoder::Shutdown()
+{
+ MOZ_DIAGNOSTIC_ASSERT(!mIsShutDown);
+ mIsShutDown = true;
+ if (mTaskQueue) {
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &AppleVTDecoder::ProcessShutdown);
+ mTaskQueue->Dispatch(runnable.forget());
+ } else {
+ ProcessShutdown();
+ }
+}
+
+nsresult
+AppleVTDecoder::ProcessDecode(MediaRawData* aSample)
+{
+ AssertOnTaskQueueThread();
+
+ if (mIsFlushing) {
+ return NS_OK;
+ }
+
+ auto rv = DoDecode(aSample);
+
+ return rv;
+}
+
+void
+AppleVTDecoder::ProcessShutdown()
+{
+ if (mSession) {
+ LOG("%s: cleaning up session %p", __func__, mSession);
+ VTDecompressionSessionInvalidate(mSession);
+ CFRelease(mSession);
+ mSession = nullptr;
+ }
+ if (mFormat) {
+ LOG("%s: releasing format %p", __func__, mFormat);
+ CFRelease(mFormat);
+ mFormat = nullptr;
+ }
+}
+
+void
+AppleVTDecoder::ProcessFlush()
+{
+ AssertOnTaskQueueThread();
+ nsresult rv = WaitForAsynchronousFrames();
+ if (NS_FAILED(rv)) {
+ LOG("AppleVTDecoder::Flush failed waiting for platform decoder "
+ "with error:%d.", rv);
+ }
+ ClearReorderedFrames();
+}
+
+void
+AppleVTDecoder::ProcessDrain()
+{
+ AssertOnTaskQueueThread();
+ nsresult rv = WaitForAsynchronousFrames();
+ if (NS_FAILED(rv)) {
+ LOG("AppleVTDecoder::Drain failed waiting for platform decoder "
+ "with error:%d.", rv);
+ }
+ DrainReorderedFrames();
+ mCallback->DrainComplete();
+}
+
+AppleVTDecoder::AppleFrameRef*
+AppleVTDecoder::CreateAppleFrameRef(const MediaRawData* aSample)
+{
+ MOZ_ASSERT(aSample);
+ return new AppleFrameRef(*aSample);
+}
+
+void
+AppleVTDecoder::DrainReorderedFrames()
+{
+ MonitorAutoLock mon(mMonitor);
+ while (!mReorderQueue.IsEmpty()) {
+ mCallback->Output(mReorderQueue.Pop().get());
+ }
+}
+
+void
+AppleVTDecoder::ClearReorderedFrames()
+{
+ MonitorAutoLock mon(mMonitor);
+ while (!mReorderQueue.IsEmpty()) {
+ mReorderQueue.Pop();
+ }
+}
+
+void
+AppleVTDecoder::SetSeekThreshold(const media::TimeUnit& aTime)
+{
+ LOG("SetSeekThreshold %lld", aTime.ToMicroseconds());
+ mSeekTargetThreshold = Some(aTime);
+}
+
+//
+// Implementation details.
+//
+
+// Callback passed to the VideoToolbox decoder for returning data.
+// This needs to be static because the API takes a C-style pair of
+// function and userdata pointers. This validates parameters and
+// forwards the decoded image back to an object method.
+static void
+PlatformCallback(void* decompressionOutputRefCon,
+ void* sourceFrameRefCon,
+ OSStatus status,
+ VTDecodeInfoFlags flags,
+ CVImageBufferRef image,
+ CMTime presentationTimeStamp,
+ CMTime presentationDuration)
+{
+ LOG("AppleVideoDecoder %s status %d flags %d", __func__, status, flags);
+
+ AppleVTDecoder* decoder =
+ static_cast<AppleVTDecoder*>(decompressionOutputRefCon);
+ nsAutoPtr<AppleVTDecoder::AppleFrameRef> frameRef(
+ static_cast<AppleVTDecoder::AppleFrameRef*>(sourceFrameRefCon));
+
+ // Validate our arguments.
+ if (status != noErr || !image) {
+ NS_WARNING("VideoToolbox decoder returned no data");
+ image = nullptr;
+ } else if (flags & kVTDecodeInfo_FrameDropped) {
+ NS_WARNING(" ...frame tagged as dropped...");
+ } else {
+ MOZ_ASSERT(CFGetTypeID(image) == CVPixelBufferGetTypeID(),
+ "VideoToolbox returned an unexpected image type");
+ }
+ decoder->OutputFrame(image, *frameRef);
+}
+
+// Copy and return a decoded frame.
+nsresult
+AppleVTDecoder::OutputFrame(CVPixelBufferRef aImage,
+ AppleVTDecoder::AppleFrameRef aFrameRef)
+{
+ if (mIsShutDown || mIsFlushing) {
+ // We are in the process of flushing or shutting down; ignore frame.
+ return NS_OK;
+ }
+
+ LOG("mp4 output frame %lld dts %lld pts %lld duration %lld us%s",
+ aFrameRef.byte_offset,
+ aFrameRef.decode_timestamp.ToMicroseconds(),
+ aFrameRef.composition_timestamp.ToMicroseconds(),
+ aFrameRef.duration.ToMicroseconds(),
+ aFrameRef.is_sync_point ? " keyframe" : ""
+ );
+
+ if (!aImage) {
+ // Image was dropped by decoder or none return yet.
+ // We need more input to continue.
+ mCallback->InputExhausted();
+ return NS_OK;
+ }
+
+ bool useNullSample = false;
+ if (mSeekTargetThreshold.isSome()) {
+ if ((aFrameRef.composition_timestamp + aFrameRef.duration) < mSeekTargetThreshold.ref()) {
+ useNullSample = true;
+ } else {
+ mSeekTargetThreshold.reset();
+ }
+ }
+
+ // Where our resulting image will end up.
+ RefPtr<MediaData> data;
+ // Bounds.
+ VideoInfo info;
+ info.mDisplay = nsIntSize(mDisplayWidth, mDisplayHeight);
+ gfx::IntRect visible = gfx::IntRect(0,
+ 0,
+ mPictureWidth,
+ mPictureHeight);
+
+ if (useNullSample) {
+ data = new NullData(aFrameRef.byte_offset,
+ aFrameRef.composition_timestamp.ToMicroseconds(),
+ aFrameRef.duration.ToMicroseconds());
+ } else if (mUseSoftwareImages) {
+ size_t width = CVPixelBufferGetWidth(aImage);
+ size_t height = CVPixelBufferGetHeight(aImage);
+ DebugOnly<size_t> planes = CVPixelBufferGetPlaneCount(aImage);
+ MOZ_ASSERT(planes == 2, "Likely not NV12 format and it must be.");
+
+ VideoData::YCbCrBuffer buffer;
+
+ // Lock the returned image data.
+ CVReturn rv = CVPixelBufferLockBaseAddress(aImage, kCVPixelBufferLock_ReadOnly);
+ if (rv != kCVReturnSuccess) {
+ NS_ERROR("error locking pixel data");
+ mCallback->Error(
+ MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("CVPixelBufferLockBaseAddress:%x", rv)));
+ return NS_ERROR_DOM_MEDIA_DECODE_ERR;
+ }
+ // Y plane.
+ buffer.mPlanes[0].mData =
+ static_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(aImage, 0));
+ buffer.mPlanes[0].mStride = CVPixelBufferGetBytesPerRowOfPlane(aImage, 0);
+ buffer.mPlanes[0].mWidth = width;
+ buffer.mPlanes[0].mHeight = height;
+ buffer.mPlanes[0].mOffset = 0;
+ buffer.mPlanes[0].mSkip = 0;
+ // Cb plane.
+ buffer.mPlanes[1].mData =
+ static_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(aImage, 1));
+ buffer.mPlanes[1].mStride = CVPixelBufferGetBytesPerRowOfPlane(aImage, 1);
+ buffer.mPlanes[1].mWidth = (width+1) / 2;
+ buffer.mPlanes[1].mHeight = (height+1) / 2;
+ buffer.mPlanes[1].mOffset = 0;
+ buffer.mPlanes[1].mSkip = 1;
+ // Cr plane.
+ buffer.mPlanes[2].mData =
+ static_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(aImage, 1));
+ buffer.mPlanes[2].mStride = CVPixelBufferGetBytesPerRowOfPlane(aImage, 1);
+ buffer.mPlanes[2].mWidth = (width+1) / 2;
+ buffer.mPlanes[2].mHeight = (height+1) / 2;
+ buffer.mPlanes[2].mOffset = 1;
+ buffer.mPlanes[2].mSkip = 1;
+
+ // Copy the image data into our own format.
+ data =
+ VideoData::CreateAndCopyData(info,
+ mImageContainer,
+ aFrameRef.byte_offset,
+ aFrameRef.composition_timestamp.ToMicroseconds(),
+ aFrameRef.duration.ToMicroseconds(),
+ buffer,
+ aFrameRef.is_sync_point,
+ aFrameRef.decode_timestamp.ToMicroseconds(),
+ visible);
+ // Unlock the returned image data.
+ CVPixelBufferUnlockBaseAddress(aImage, kCVPixelBufferLock_ReadOnly);
+ } else {
+#ifndef MOZ_WIDGET_UIKIT
+ IOSurfacePtr surface = MacIOSurfaceLib::CVPixelBufferGetIOSurface(aImage);
+ MOZ_ASSERT(surface, "Decoder didn't return an IOSurface backed buffer");
+
+ RefPtr<MacIOSurface> macSurface = new MacIOSurface(surface);
+
+ RefPtr<layers::Image> image = new MacIOSurfaceImage(macSurface);
+
+ data =
+ VideoData::CreateFromImage(info,
+ aFrameRef.byte_offset,
+ aFrameRef.composition_timestamp.ToMicroseconds(),
+ aFrameRef.duration.ToMicroseconds(),
+ image.forget(),
+ aFrameRef.is_sync_point,
+ aFrameRef.decode_timestamp.ToMicroseconds(),
+ visible);
+#else
+ MOZ_ASSERT_UNREACHABLE("No MacIOSurface on iOS");
+#endif
+ }
+
+ if (!data) {
+ NS_ERROR("Couldn't create VideoData for frame");
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__));
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
+ // Frames come out in DTS order but we need to output them
+ // in composition order.
+ MonitorAutoLock mon(mMonitor);
+ mReorderQueue.Push(data);
+ if (mReorderQueue.Length() > mMaxRefFrames) {
+ mCallback->Output(mReorderQueue.Pop().get());
+ }
+ mCallback->InputExhausted();
+ LOG("%llu decoded frames queued",
+ static_cast<unsigned long long>(mReorderQueue.Length()));
+
+ return NS_OK;
+}
+
+nsresult
+AppleVTDecoder::WaitForAsynchronousFrames()
+{
+ OSStatus rv = VTDecompressionSessionWaitForAsynchronousFrames(mSession);
+ if (rv != noErr) {
+ LOG("AppleVTDecoder: Error %d waiting for asynchronous frames", rv);
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+// Helper to fill in a timestamp structure.
+static CMSampleTimingInfo
+TimingInfoFromSample(MediaRawData* aSample)
+{
+ CMSampleTimingInfo timestamp;
+
+ timestamp.duration = CMTimeMake(aSample->mDuration, USECS_PER_S);
+ timestamp.presentationTimeStamp =
+ CMTimeMake(aSample->mTime, USECS_PER_S);
+ timestamp.decodeTimeStamp =
+ CMTimeMake(aSample->mTimecode, USECS_PER_S);
+
+ return timestamp;
+}
+
+MediaResult
+AppleVTDecoder::DoDecode(MediaRawData* aSample)
+{
+ AssertOnTaskQueueThread();
+
+ // For some reason this gives me a double-free error with stagefright.
+ AutoCFRelease<CMBlockBufferRef> block = nullptr;
+ AutoCFRelease<CMSampleBufferRef> sample = nullptr;
+ VTDecodeInfoFlags infoFlags;
+ OSStatus rv;
+
+ // FIXME: This copies the sample data. I think we can provide
+ // a custom block source which reuses the aSample buffer.
+ // But note that there may be a problem keeping the samples
+ // alive over multiple frames.
+ rv = CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault, // Struct allocator.
+ const_cast<uint8_t*>(aSample->Data()),
+ aSample->Size(),
+ kCFAllocatorNull, // Block allocator.
+ NULL, // Block source.
+ 0, // Data offset.
+ aSample->Size(),
+ false,
+ block.receive());
+ if (rv != noErr) {
+ NS_ERROR("Couldn't create CMBlockBuffer");
+ mCallback->Error(
+ MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("CMBlockBufferCreateWithMemoryBlock:%x", rv)));
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+ CMSampleTimingInfo timestamp = TimingInfoFromSample(aSample);
+ rv = CMSampleBufferCreate(kCFAllocatorDefault, block, true, 0, 0, mFormat, 1, 1, &timestamp, 0, NULL, sample.receive());
+ if (rv != noErr) {
+ NS_ERROR("Couldn't create CMSampleBuffer");
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("CMSampleBufferCreate:%x", rv)));
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+
+ VTDecodeFrameFlags decodeFlags =
+ kVTDecodeFrame_EnableAsynchronousDecompression;
+ rv = VTDecompressionSessionDecodeFrame(mSession,
+ sample,
+ decodeFlags,
+ CreateAppleFrameRef(aSample),
+ &infoFlags);
+ if (rv != noErr && !(infoFlags & kVTDecodeInfo_FrameDropped)) {
+ LOG("AppleVTDecoder: Error %d VTDecompressionSessionDecodeFrame", rv);
+ NS_WARNING("Couldn't pass frame to decoder");
+ mCallback->Error(
+ MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("VTDecompressionSessionDecodeFrame:%x", rv)));
+ return NS_ERROR_DOM_MEDIA_DECODE_ERR;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+AppleVTDecoder::InitializeSession()
+{
+ OSStatus rv;
+
+ AutoCFRelease<CFDictionaryRef> extensions = CreateDecoderExtensions();
+
+ rv = CMVideoFormatDescriptionCreate(kCFAllocatorDefault,
+ kCMVideoCodecType_H264,
+ mPictureWidth,
+ mPictureHeight,
+ extensions,
+ &mFormat);
+ if (rv != noErr) {
+ NS_ERROR("Couldn't create format description!");
+ return NS_ERROR_FAILURE;
+ }
+
+ // Contruct video decoder selection spec.
+ AutoCFRelease<CFDictionaryRef> spec = CreateDecoderSpecification();
+
+ // Contruct output configuration.
+ AutoCFRelease<CFDictionaryRef> outputConfiguration =
+ CreateOutputConfiguration();
+
+ VTDecompressionOutputCallbackRecord cb = { PlatformCallback, this };
+ rv = VTDecompressionSessionCreate(kCFAllocatorDefault,
+ mFormat,
+ spec, // Video decoder selection.
+ outputConfiguration, // Output video format.
+ &cb,
+ &mSession);
+
+ if (rv != noErr) {
+ NS_ERROR("Couldn't create decompression session!");
+ return NS_ERROR_FAILURE;
+ }
+
+ if (AppleVTLinker::skPropUsingHWAccel) {
+ CFBooleanRef isUsingHW = nullptr;
+ rv = VTSessionCopyProperty(mSession,
+ AppleVTLinker::skPropUsingHWAccel,
+ kCFAllocatorDefault,
+ &isUsingHW);
+ if (rv != noErr) {
+ LOG("AppleVTDecoder: system doesn't support hardware acceleration");
+ }
+ mIsHardwareAccelerated = rv == noErr && isUsingHW == kCFBooleanTrue;
+ LOG("AppleVTDecoder: %s hardware accelerated decoding",
+ mIsHardwareAccelerated ? "using" : "not using");
+ } else {
+ LOG("AppleVTDecoder: couldn't determine hardware acceleration status.");
+ }
+ return NS_OK;
+}
+
+CFDictionaryRef
+AppleVTDecoder::CreateDecoderExtensions()
+{
+ AutoCFRelease<CFDataRef> avc_data =
+ CFDataCreate(kCFAllocatorDefault,
+ mExtraData->Elements(),
+ mExtraData->Length());
+
+ const void* atomsKey[] = { CFSTR("avcC") };
+ const void* atomsValue[] = { avc_data };
+ static_assert(ArrayLength(atomsKey) == ArrayLength(atomsValue),
+ "Non matching keys/values array size");
+
+ AutoCFRelease<CFDictionaryRef> atoms =
+ CFDictionaryCreate(kCFAllocatorDefault,
+ atomsKey,
+ atomsValue,
+ ArrayLength(atomsKey),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+
+ const void* extensionKeys[] =
+ { kCVImageBufferChromaLocationBottomFieldKey,
+ kCVImageBufferChromaLocationTopFieldKey,
+ AppleCMLinker::skPropExtensionAtoms };
+
+ const void* extensionValues[] =
+ { kCVImageBufferChromaLocation_Left,
+ kCVImageBufferChromaLocation_Left,
+ atoms };
+ static_assert(ArrayLength(extensionKeys) == ArrayLength(extensionValues),
+ "Non matching keys/values array size");
+
+ return CFDictionaryCreate(kCFAllocatorDefault,
+ extensionKeys,
+ extensionValues,
+ ArrayLength(extensionKeys),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+}
+
+CFDictionaryRef
+AppleVTDecoder::CreateDecoderSpecification()
+{
+ if (!AppleVTLinker::skPropEnableHWAccel) {
+ return nullptr;
+ }
+
+ const void* specKeys[] = { AppleVTLinker::skPropEnableHWAccel };
+ const void* specValues[1];
+ if (AppleDecoderModule::sCanUseHardwareVideoDecoder) {
+ specValues[0] = kCFBooleanTrue;
+ } else {
+ // This GPU is blacklisted for hardware decoding.
+ specValues[0] = kCFBooleanFalse;
+ }
+ static_assert(ArrayLength(specKeys) == ArrayLength(specValues),
+ "Non matching keys/values array size");
+
+ return CFDictionaryCreate(kCFAllocatorDefault,
+ specKeys,
+ specValues,
+ ArrayLength(specKeys),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+}
+
+CFDictionaryRef
+AppleVTDecoder::CreateOutputConfiguration()
+{
+ if (mUseSoftwareImages) {
+ // Output format type:
+ SInt32 PixelFormatTypeValue =
+ kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
+ AutoCFRelease<CFNumberRef> PixelFormatTypeNumber =
+ CFNumberCreate(kCFAllocatorDefault,
+ kCFNumberSInt32Type,
+ &PixelFormatTypeValue);
+ const void* outputKeys[] = { kCVPixelBufferPixelFormatTypeKey };
+ const void* outputValues[] = { PixelFormatTypeNumber };
+ static_assert(ArrayLength(outputKeys) == ArrayLength(outputValues),
+ "Non matching keys/values array size");
+
+ return CFDictionaryCreate(kCFAllocatorDefault,
+ outputKeys,
+ outputValues,
+ ArrayLength(outputKeys),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ }
+
+#ifndef MOZ_WIDGET_UIKIT
+ // Output format type:
+ SInt32 PixelFormatTypeValue = kCVPixelFormatType_422YpCbCr8;
+ AutoCFRelease<CFNumberRef> PixelFormatTypeNumber =
+ CFNumberCreate(kCFAllocatorDefault,
+ kCFNumberSInt32Type,
+ &PixelFormatTypeValue);
+ // Construct IOSurface Properties
+ const void* IOSurfaceKeys[] = { MacIOSurfaceLib::kPropIsGlobal };
+ const void* IOSurfaceValues[] = { kCFBooleanTrue };
+ static_assert(ArrayLength(IOSurfaceKeys) == ArrayLength(IOSurfaceValues),
+ "Non matching keys/values array size");
+
+ // Contruct output configuration.
+ AutoCFRelease<CFDictionaryRef> IOSurfaceProperties =
+ CFDictionaryCreate(kCFAllocatorDefault,
+ IOSurfaceKeys,
+ IOSurfaceValues,
+ ArrayLength(IOSurfaceKeys),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+
+ const void* outputKeys[] = { kCVPixelBufferIOSurfacePropertiesKey,
+ kCVPixelBufferPixelFormatTypeKey,
+ kCVPixelBufferOpenGLCompatibilityKey };
+ const void* outputValues[] = { IOSurfaceProperties,
+ PixelFormatTypeNumber,
+ kCFBooleanTrue };
+ static_assert(ArrayLength(outputKeys) == ArrayLength(outputValues),
+ "Non matching keys/values array size");
+
+ return CFDictionaryCreate(kCFAllocatorDefault,
+ outputKeys,
+ outputValues,
+ ArrayLength(outputKeys),
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+#else
+ MOZ_ASSERT_UNREACHABLE("No MacIOSurface on iOS");
+#endif
+}
+
+
+} // namespace mozilla
diff --git a/dom/media/platforms/apple/AppleVTDecoder.h b/dom/media/platforms/apple/AppleVTDecoder.h
new file mode 100644
index 000000000..05d08c7c7
--- /dev/null
+++ b/dom/media/platforms/apple/AppleVTDecoder.h
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_AppleVTDecoder_h
+#define mozilla_AppleVTDecoder_h
+
+#include "PlatformDecoderModule.h"
+#include "mozilla/Atomics.h"
+#include "nsIThread.h"
+#include "ReorderQueue.h"
+#include "TimeUnits.h"
+
+#include "VideoToolbox/VideoToolbox.h"
+
+namespace mozilla {
+
+class AppleVTDecoder : public MediaDataDecoder {
+public:
+ AppleVTDecoder(const VideoInfo& aConfig,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer);
+
+ class AppleFrameRef {
+ public:
+ media::TimeUnit decode_timestamp;
+ media::TimeUnit composition_timestamp;
+ media::TimeUnit duration;
+ int64_t byte_offset;
+ bool is_sync_point;
+
+ explicit AppleFrameRef(const MediaRawData& aSample)
+ : decode_timestamp(media::TimeUnit::FromMicroseconds(aSample.mTimecode))
+ , composition_timestamp(media::TimeUnit::FromMicroseconds(aSample.mTime))
+ , duration(media::TimeUnit::FromMicroseconds(aSample.mDuration))
+ , byte_offset(aSample.mOffset)
+ , is_sync_point(aSample.mKeyframe)
+ {
+ }
+ };
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ void SetSeekThreshold(const media::TimeUnit& aTime) override;
+
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override
+ {
+ return mIsHardwareAccelerated;
+ }
+
+ const char* GetDescriptionName() const override
+ {
+ return mIsHardwareAccelerated
+ ? "apple hardware VT decoder"
+ : "apple software VT decoder";
+ }
+
+ // Access from the taskqueue and the decoder's thread.
+ // OutputFrame is thread-safe.
+ nsresult OutputFrame(CVPixelBufferRef aImage,
+ AppleFrameRef aFrameRef);
+
+private:
+ virtual ~AppleVTDecoder();
+ void ProcessFlush();
+ void ProcessDrain();
+ void ProcessShutdown();
+ nsresult ProcessDecode(MediaRawData* aSample);
+
+ void AssertOnTaskQueueThread()
+ {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ }
+
+ AppleFrameRef* CreateAppleFrameRef(const MediaRawData* aSample);
+ void DrainReorderedFrames();
+ void ClearReorderedFrames();
+ CFDictionaryRef CreateOutputConfiguration();
+
+ const RefPtr<MediaByteBuffer> mExtraData;
+ MediaDataDecoderCallback* mCallback;
+ const uint32_t mPictureWidth;
+ const uint32_t mPictureHeight;
+ const uint32_t mDisplayWidth;
+ const uint32_t mDisplayHeight;
+
+ // Method to set up the decompression session.
+ nsresult InitializeSession();
+ nsresult WaitForAsynchronousFrames();
+ CFDictionaryRef CreateDecoderSpecification();
+ CFDictionaryRef CreateDecoderExtensions();
+ // Method to pass a frame to VideoToolbox for decoding.
+ MediaResult DoDecode(MediaRawData* aSample);
+
+ const RefPtr<TaskQueue> mTaskQueue;
+ const uint32_t mMaxRefFrames;
+ const RefPtr<layers::ImageContainer> mImageContainer;
+ Atomic<bool> mIsShutDown;
+ const bool mUseSoftwareImages;
+
+ // Set on reader/decode thread calling Flush() to indicate that output is
+ // not required and so input samples on mTaskQueue need not be processed.
+ // Cleared on mTaskQueue in ProcessDrain().
+ Atomic<bool> mIsFlushing;
+ // Protects mReorderQueue.
+ Monitor mMonitor;
+ ReorderQueue mReorderQueue;
+ // Decoded frame will be dropped if its pts is smaller than this
+ // value. It shold be initialized before Input() or after Flush(). So it is
+ // safe to access it in OutputFrame without protecting.
+ Maybe<media::TimeUnit> mSeekTargetThreshold;
+
+ CMVideoFormatDescriptionRef mFormat;
+ VTDecompressionSessionRef mSession;
+ Atomic<bool> mIsHardwareAccelerated;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_AppleVTDecoder_h
diff --git a/dom/media/platforms/apple/AppleVTFunctions.h b/dom/media/platforms/apple/AppleVTFunctions.h
new file mode 100644
index 000000000..62765afa4
--- /dev/null
+++ b/dom/media/platforms/apple/AppleVTFunctions.h
@@ -0,0 +1,14 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Construct references to each of the VideoToolbox symbols we use.
+
+LINK_FUNC(VTDecompressionSessionCreate)
+LINK_FUNC(VTDecompressionSessionDecodeFrame)
+LINK_FUNC(VTDecompressionSessionInvalidate)
+LINK_FUNC(VTDecompressionSessionWaitForAsynchronousFrames)
+LINK_FUNC(VTSessionCopyProperty)
+LINK_FUNC(VTSessionCopySupportedPropertyDictionary)
diff --git a/dom/media/platforms/apple/AppleVTLinker.cpp b/dom/media/platforms/apple/AppleVTLinker.cpp
new file mode 100644
index 000000000..51a8a0122
--- /dev/null
+++ b/dom/media/platforms/apple/AppleVTLinker.cpp
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <dlfcn.h>
+
+#include "AppleVTLinker.h"
+#include "mozilla/ArrayUtils.h"
+#include "nsDebug.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+namespace mozilla {
+
+AppleVTLinker::LinkStatus
+AppleVTLinker::sLinkStatus = LinkStatus_INIT;
+
+void* AppleVTLinker::sLink = nullptr;
+CFStringRef AppleVTLinker::skPropEnableHWAccel = nullptr;
+CFStringRef AppleVTLinker::skPropUsingHWAccel = nullptr;
+
+#define LINK_FUNC(func) typeof(func) func;
+#include "AppleVTFunctions.h"
+#undef LINK_FUNC
+
+/* static */ bool
+AppleVTLinker::Link()
+{
+ if (sLinkStatus) {
+ return sLinkStatus == LinkStatus_SUCCEEDED;
+ }
+
+ const char* dlnames[] =
+ { "/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox",
+ "/System/Library/PrivateFrameworks/VideoToolbox.framework/VideoToolbox" };
+ bool dlfound = false;
+ for (size_t i = 0; i < ArrayLength(dlnames); i++) {
+ if ((sLink = dlopen(dlnames[i], RTLD_NOW | RTLD_LOCAL))) {
+ dlfound = true;
+ break;
+ }
+ }
+ if (!dlfound) {
+ NS_WARNING("Couldn't load VideoToolbox framework");
+ goto fail;
+ }
+
+#define LINK_FUNC(func) \
+ func = (typeof(func))dlsym(sLink, #func); \
+ if (!func) { \
+ NS_WARNING("Couldn't load VideoToolbox function " #func ); \
+ goto fail; \
+ }
+#include "AppleVTFunctions.h"
+#undef LINK_FUNC
+
+ // Will only resolve in 10.9 and later.
+ skPropEnableHWAccel =
+ GetIOConst("kVTVideoDecoderSpecification_EnableHardwareAcceleratedVideoDecoder");
+ skPropUsingHWAccel =
+ GetIOConst("kVTDecompressionPropertyKey_UsingHardwareAcceleratedVideoDecoder");
+
+ LOG("Loaded VideoToolbox framework.");
+ sLinkStatus = LinkStatus_SUCCEEDED;
+ return true;
+
+fail:
+ Unlink();
+
+ sLinkStatus = LinkStatus_FAILED;
+ return false;
+}
+
+/* static */ void
+AppleVTLinker::Unlink()
+{
+ if (sLink) {
+ LOG("Unlinking VideoToolbox framework.");
+#define LINK_FUNC(func) \
+ func = nullptr;
+#include "AppleVTFunctions.h"
+#undef LINK_FUNC
+ dlclose(sLink);
+ sLink = nullptr;
+ skPropEnableHWAccel = nullptr;
+ skPropUsingHWAccel = nullptr;
+ sLinkStatus = LinkStatus_INIT;
+ }
+}
+
+/* static */ CFStringRef
+AppleVTLinker::GetIOConst(const char* symbol)
+{
+ CFStringRef* address = (CFStringRef*)dlsym(sLink, symbol);
+ if (!address) {
+ return nullptr;
+ }
+
+ return *address;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/apple/AppleVTLinker.h b/dom/media/platforms/apple/AppleVTLinker.h
new file mode 100644
index 000000000..49783432d
--- /dev/null
+++ b/dom/media/platforms/apple/AppleVTLinker.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AppleVTLinker_h
+#define AppleVTLinker_h
+
+extern "C" {
+#pragma GCC visibility push(default)
+#include "VideoToolbox/VideoToolbox.h"
+#pragma GCC visibility pop
+}
+
+#include "nscore.h"
+
+namespace mozilla {
+
+class AppleVTLinker
+{
+public:
+ static bool Link();
+ static void Unlink();
+ static CFStringRef skPropEnableHWAccel;
+ static CFStringRef skPropUsingHWAccel;
+
+private:
+ static void* sLink;
+
+ static enum LinkStatus {
+ LinkStatus_INIT = 0,
+ LinkStatus_FAILED,
+ LinkStatus_SUCCEEDED
+ } sLinkStatus;
+
+ static CFStringRef GetIOConst(const char* symbol);
+};
+
+#define LINK_FUNC(func) extern typeof(func)* func;
+#include "AppleVTFunctions.h"
+#undef LINK_FUNC
+
+} // namespace mozilla
+
+#endif // AppleVTLinker_h
diff --git a/dom/media/platforms/apple/VideoToolbox/VideoToolbox.h b/dom/media/platforms/apple/VideoToolbox/VideoToolbox.h
new file mode 100644
index 000000000..edd3f9c1b
--- /dev/null
+++ b/dom/media/platforms/apple/VideoToolbox/VideoToolbox.h
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Stub header for VideoToolbox framework API.
+// We include our own copy so we can build on MacOS versions
+// where it's not available.
+
+#ifndef mozilla_VideoToolbox_VideoToolbox_h
+#define mozilla_VideoToolbox_VideoToolbox_h
+
+// CoreMedia is available starting in OS X 10.7,
+// so we need to dlopen it as well to run on 10.6,
+// but we can depend on the real framework headers at build time.
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreMedia/CoreMedia.h>
+#include <CoreVideo/CVPixelBuffer.h>
+
+typedef uint32_t VTDecodeFrameFlags;
+typedef uint32_t VTDecodeInfoFlags;
+enum {
+ kVTDecodeInfo_Asynchronous = 1UL << 0,
+ kVTDecodeInfo_FrameDropped = 1UL << 1,
+};
+enum {
+ kVTDecodeFrame_EnableAsynchronousDecompression = 1<<0,
+ kVTDecodeFrame_DoNotOutputFrame = 1<<1,
+ kVTDecodeFrame_1xRealTimePlayback = 1<<2,
+ kVTDecodeFrame_EnableTemporalProcessing = 1<<3,
+};
+
+typedef CFTypeRef VTSessionRef;
+typedef struct OpaqueVTDecompressionSession* VTDecompressionSessionRef;
+typedef void (*VTDecompressionOutputCallback)(
+ void*,
+ void*,
+ OSStatus,
+ VTDecodeInfoFlags,
+ CVImageBufferRef,
+ CMTime,
+ CMTime
+);
+typedef struct VTDecompressionOutputCallbackRecord {
+ VTDecompressionOutputCallback decompressionOutputCallback;
+ void* decompressionOutputRefCon;
+} VTDecompressionOutputCallbackRecord;
+
+OSStatus
+VTDecompressionSessionCreate(
+ CFAllocatorRef,
+ CMVideoFormatDescriptionRef,
+ CFDictionaryRef,
+ CFDictionaryRef,
+ const VTDecompressionOutputCallbackRecord*,
+ VTDecompressionSessionRef*
+);
+
+OSStatus
+VTDecompressionSessionDecodeFrame(
+ VTDecompressionSessionRef,
+ CMSampleBufferRef,
+ VTDecodeFrameFlags,
+ void*,
+ VTDecodeInfoFlags*
+);
+
+OSStatus
+VTDecompressionSessionWaitForAsynchronousFrames(
+ VTDecompressionSessionRef
+);
+
+void
+VTDecompressionSessionInvalidate(
+ VTDecompressionSessionRef
+);
+
+OSStatus
+VTSessionCopyProperty(
+ VTSessionRef,
+ CFStringRef,
+ CFAllocatorRef,
+ void*
+);
+
+OSStatus
+VTSessionCopySupportedPropertyDictionary(
+ VTSessionRef,
+ CFDictionaryRef*
+);
+
+#endif // mozilla_VideoToolbox_VideoToolbox_h
diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
new file mode 100644
index 000000000..f867ec494
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -0,0 +1,233 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/TaskQueue.h"
+
+#include "FFmpegAudioDecoder.h"
+#include "TimeUnits.h"
+
+#define MAX_CHANNELS 16
+
+namespace mozilla
+{
+
+FFmpegAudioDecoder<LIBAV_VER>::FFmpegAudioDecoder(FFmpegLibWrapper* aLib,
+ TaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback,
+ const AudioInfo& aConfig)
+ : FFmpegDataDecoder(aLib, aTaskQueue, aCallback, GetCodecId(aConfig.mMimeType))
+{
+ MOZ_COUNT_CTOR(FFmpegAudioDecoder);
+ // Use a new MediaByteBuffer as the object will be modified during initialization.
+ if (aConfig.mCodecSpecificConfig && aConfig.mCodecSpecificConfig->Length()) {
+ mExtraData = new MediaByteBuffer;
+ mExtraData->AppendElements(*aConfig.mCodecSpecificConfig);
+ }
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+FFmpegAudioDecoder<LIBAV_VER>::Init()
+{
+ nsresult rv = InitDecoder();
+
+ return rv == NS_OK ? InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__)
+ : InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+}
+
+void
+FFmpegAudioDecoder<LIBAV_VER>::InitCodecContext()
+{
+ MOZ_ASSERT(mCodecContext);
+ // We do not want to set this value to 0 as FFmpeg by default will
+ // use the number of cores, which with our mozlibavutil get_cpu_count
+ // isn't implemented.
+ mCodecContext->thread_count = 1;
+ // FFmpeg takes this as a suggestion for what format to use for audio samples.
+ // LibAV 0.8 produces rubbish float interleaved samples, request 16 bits audio.
+ mCodecContext->request_sample_fmt =
+ (mLib->mVersion == 53) ? AV_SAMPLE_FMT_S16 : AV_SAMPLE_FMT_FLT;
+}
+
+static AlignedAudioBuffer
+CopyAndPackAudio(AVFrame* aFrame, uint32_t aNumChannels, uint32_t aNumAFrames)
+{
+ MOZ_ASSERT(aNumChannels <= MAX_CHANNELS);
+
+ AlignedAudioBuffer audio(aNumChannels * aNumAFrames);
+ if (!audio) {
+ return audio;
+ }
+
+ if (aFrame->format == AV_SAMPLE_FMT_FLT) {
+ // Audio data already packed. No need to do anything other than copy it
+ // into a buffer we own.
+ memcpy(audio.get(), aFrame->data[0],
+ aNumChannels * aNumAFrames * sizeof(AudioDataValue));
+ } else if (aFrame->format == AV_SAMPLE_FMT_FLTP) {
+ // Planar audio data. Pack it into something we can understand.
+ AudioDataValue* tmp = audio.get();
+ AudioDataValue** data = reinterpret_cast<AudioDataValue**>(aFrame->data);
+ for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
+ for (uint32_t channel = 0; channel < aNumChannels; channel++) {
+ *tmp++ = data[channel][frame];
+ }
+ }
+ } else if (aFrame->format == AV_SAMPLE_FMT_S16) {
+ // Audio data already packed. Need to convert from S16 to 32 bits Float
+ AudioDataValue* tmp = audio.get();
+ int16_t* data = reinterpret_cast<int16_t**>(aFrame->data)[0];
+ for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
+ for (uint32_t channel = 0; channel < aNumChannels; channel++) {
+ *tmp++ = AudioSampleToFloat(*data++);
+ }
+ }
+ } else if (aFrame->format == AV_SAMPLE_FMT_S16P) {
+ // Planar audio data. Convert it from S16 to 32 bits float
+ // and pack it into something we can understand.
+ AudioDataValue* tmp = audio.get();
+ int16_t** data = reinterpret_cast<int16_t**>(aFrame->data);
+ for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
+ for (uint32_t channel = 0; channel < aNumChannels; channel++) {
+ *tmp++ = AudioSampleToFloat(data[channel][frame]);
+ }
+ }
+ } else if (aFrame->format == AV_SAMPLE_FMT_S32) {
+ // Audio data already packed. Need to convert from S16 to 32 bits Float
+ AudioDataValue* tmp = audio.get();
+ int32_t* data = reinterpret_cast<int32_t**>(aFrame->data)[0];
+ for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
+ for (uint32_t channel = 0; channel < aNumChannels; channel++) {
+ *tmp++ = AudioSampleToFloat(*data++);
+ }
+ }
+ } else if (aFrame->format == AV_SAMPLE_FMT_S32P) {
+ // Planar audio data. Convert it from S32 to 32 bits float
+ // and pack it into something we can understand.
+ AudioDataValue* tmp = audio.get();
+ int32_t** data = reinterpret_cast<int32_t**>(aFrame->data);
+ for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
+ for (uint32_t channel = 0; channel < aNumChannels; channel++) {
+ *tmp++ = AudioSampleToFloat(data[channel][frame]);
+ }
+ }
+ }
+
+ return audio;
+}
+
+MediaResult
+FFmpegAudioDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample)
+{
+ AVPacket packet;
+ mLib->av_init_packet(&packet);
+
+ packet.data = const_cast<uint8_t*>(aSample->Data());
+ packet.size = aSample->Size();
+
+ if (!PrepareFrame()) {
+ return MediaResult(
+ NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("FFmpeg audio decoder failed to allocate frame"));
+ }
+
+ int64_t samplePosition = aSample->mOffset;
+ media::TimeUnit pts = media::TimeUnit::FromMicroseconds(aSample->mTime);
+
+ while (packet.size > 0) {
+ int decoded;
+ int bytesConsumed =
+ mLib->avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet);
+
+ if (bytesConsumed < 0) {
+ NS_WARNING("FFmpeg audio decoder error.");
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("FFmpeg audio error:%d", bytesConsumed));
+ }
+
+ if (decoded) {
+ if (mFrame->format != AV_SAMPLE_FMT_FLT &&
+ mFrame->format != AV_SAMPLE_FMT_FLTP &&
+ mFrame->format != AV_SAMPLE_FMT_S16 &&
+ mFrame->format != AV_SAMPLE_FMT_S16P &&
+ mFrame->format != AV_SAMPLE_FMT_S32 &&
+ mFrame->format != AV_SAMPLE_FMT_S32P) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL(
+ "FFmpeg audio decoder outputs unsupported audio format"));
+ }
+ uint32_t numChannels = mCodecContext->channels;
+ AudioConfig::ChannelLayout layout(numChannels);
+ if (!layout.IsValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Unsupported channel layout:%u", numChannels));
+ }
+
+ uint32_t samplingRate = mCodecContext->sample_rate;
+
+ AlignedAudioBuffer audio =
+ CopyAndPackAudio(mFrame, numChannels, mFrame->nb_samples);
+ if (!audio) {
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+
+ media::TimeUnit duration =
+ FramesToTimeUnit(mFrame->nb_samples, samplingRate);
+ if (!duration.IsValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Invalid sample duration"));
+ }
+
+ RefPtr<AudioData> data = new AudioData(samplePosition,
+ pts.ToMicroseconds(),
+ duration.ToMicroseconds(),
+ mFrame->nb_samples,
+ Move(audio),
+ numChannels,
+ samplingRate);
+ mCallback->Output(data);
+ pts += duration;
+ if (!pts.IsValid()) {
+ return MediaResult(
+ NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+ RESULT_DETAIL("Invalid count of accumulated audio samples"));
+ }
+ }
+ packet.data += bytesConsumed;
+ packet.size -= bytesConsumed;
+ samplePosition += bytesConsumed;
+ }
+ return NS_OK;
+}
+
+void
+FFmpegAudioDecoder<LIBAV_VER>::ProcessDrain()
+{
+ ProcessFlush();
+ mCallback->DrainComplete();
+}
+
+AVCodecID
+FFmpegAudioDecoder<LIBAV_VER>::GetCodecId(const nsACString& aMimeType)
+{
+ if (aMimeType.EqualsLiteral("audio/mpeg")) {
+ return AV_CODEC_ID_MP3;
+ } else if (aMimeType.EqualsLiteral("audio/flac")) {
+ return AV_CODEC_ID_FLAC;
+ } else if (aMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ return AV_CODEC_ID_AAC;
+ }
+
+ return AV_CODEC_ID_NONE;
+}
+
+FFmpegAudioDecoder<LIBAV_VER>::~FFmpegAudioDecoder()
+{
+ MOZ_COUNT_DTOR(FFmpegAudioDecoder);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h
new file mode 100644
index 000000000..6adaeee14
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegAACDecoder_h__
+#define __FFmpegAACDecoder_h__
+
+#include "FFmpegLibWrapper.h"
+#include "FFmpegDataDecoder.h"
+
+namespace mozilla
+{
+
+template <int V> class FFmpegAudioDecoder
+{
+};
+
+template <>
+class FFmpegAudioDecoder<LIBAV_VER> : public FFmpegDataDecoder<LIBAV_VER>
+{
+public:
+ FFmpegAudioDecoder(FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback,
+ const AudioInfo& aConfig);
+ virtual ~FFmpegAudioDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void InitCodecContext() override;
+ static AVCodecID GetCodecId(const nsACString& aMimeType);
+ const char* GetDescriptionName() const override
+ {
+ return "ffmpeg audio decoder";
+ }
+
+private:
+ MediaResult DoDecode(MediaRawData* aSample) override;
+ void ProcessDrain() override;
+};
+
+} // namespace mozilla
+
+#endif // __FFmpegAACDecoder_h__
diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
new file mode 100644
index 000000000..0b31fb0f9
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
@@ -0,0 +1,204 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/SyncRunnable.h"
+#include "mozilla/TaskQueue.h"
+
+#include <string.h>
+#ifdef __GNUC__
+#include <unistd.h>
+#endif
+
+#include "FFmpegLog.h"
+#include "FFmpegDataDecoder.h"
+#include "prsystem.h"
+
+namespace mozilla
+{
+
+StaticMutex FFmpegDataDecoder<LIBAV_VER>::sMonitor;
+
+ FFmpegDataDecoder<LIBAV_VER>::FFmpegDataDecoder(FFmpegLibWrapper* aLib,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback,
+ AVCodecID aCodecID)
+ : mLib(aLib)
+ , mCallback(aCallback)
+ , mCodecContext(nullptr)
+ , mFrame(NULL)
+ , mExtraData(nullptr)
+ , mCodecID(aCodecID)
+ , mTaskQueue(aTaskQueue)
+ , mIsFlushing(false)
+{
+ MOZ_ASSERT(aLib);
+ MOZ_COUNT_CTOR(FFmpegDataDecoder);
+}
+
+FFmpegDataDecoder<LIBAV_VER>::~FFmpegDataDecoder()
+{
+ MOZ_COUNT_DTOR(FFmpegDataDecoder);
+}
+
+nsresult
+FFmpegDataDecoder<LIBAV_VER>::InitDecoder()
+{
+ FFMPEG_LOG("Initialising FFmpeg decoder.");
+
+ AVCodec* codec = FindAVCodec(mLib, mCodecID);
+ if (!codec) {
+ NS_WARNING("Couldn't find ffmpeg decoder");
+ return NS_ERROR_FAILURE;
+ }
+
+ StaticMutexAutoLock mon(sMonitor);
+
+ if (!(mCodecContext = mLib->avcodec_alloc_context3(codec))) {
+ NS_WARNING("Couldn't init ffmpeg context");
+ return NS_ERROR_FAILURE;
+ }
+
+ mCodecContext->opaque = this;
+
+ InitCodecContext();
+
+ if (mExtraData) {
+ mCodecContext->extradata_size = mExtraData->Length();
+ // FFmpeg may use SIMD instructions to access the data which reads the
+ // data in 32 bytes block. Must ensure we have enough data to read.
+ mExtraData->AppendElements(FF_INPUT_BUFFER_PADDING_SIZE);
+ mCodecContext->extradata = mExtraData->Elements();
+ } else {
+ mCodecContext->extradata_size = 0;
+ }
+
+ if (codec->capabilities & CODEC_CAP_DR1) {
+ mCodecContext->flags |= CODEC_FLAG_EMU_EDGE;
+ }
+
+ if (mLib->avcodec_open2(mCodecContext, codec, nullptr) < 0) {
+ NS_WARNING("Couldn't initialise ffmpeg decoder");
+ mLib->avcodec_close(mCodecContext);
+ mLib->av_freep(&mCodecContext);
+ return NS_ERROR_FAILURE;
+ }
+
+ FFMPEG_LOG("FFmpeg init successful.");
+ return NS_OK;
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::Shutdown()
+{
+ if (mTaskQueue) {
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &FFmpegDataDecoder<LIBAV_VER>::ProcessShutdown);
+ mTaskQueue->Dispatch(runnable.forget());
+ } else {
+ ProcessShutdown();
+ }
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::ProcessDecode(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mIsFlushing) {
+ return;
+ }
+ MediaResult rv = DoDecode(aSample);
+ if (NS_FAILED(rv)) {
+ mCallback->Error(rv);
+ } else {
+ mCallback->InputExhausted();
+ }
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::Input(MediaRawData* aSample)
+{
+ mTaskQueue->Dispatch(NewRunnableMethod<RefPtr<MediaRawData>>(
+ this, &FFmpegDataDecoder::ProcessDecode, aSample));
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ mIsFlushing = true;
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &FFmpegDataDecoder<LIBAV_VER>::ProcessFlush);
+ SyncRunnable::DispatchToThread(mTaskQueue, runnable);
+ mIsFlushing = false;
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &FFmpegDataDecoder<LIBAV_VER>::ProcessDrain);
+ mTaskQueue->Dispatch(runnable.forget());
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::ProcessFlush()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mCodecContext) {
+ mLib->avcodec_flush_buffers(mCodecContext);
+ }
+}
+
+void
+FFmpegDataDecoder<LIBAV_VER>::ProcessShutdown()
+{
+ StaticMutexAutoLock mon(sMonitor);
+
+ if (mCodecContext) {
+ mLib->avcodec_close(mCodecContext);
+ mLib->av_freep(&mCodecContext);
+#if LIBAVCODEC_VERSION_MAJOR >= 55
+ mLib->av_frame_free(&mFrame);
+#elif LIBAVCODEC_VERSION_MAJOR == 54
+ mLib->avcodec_free_frame(&mFrame);
+#else
+ mLib->av_freep(&mFrame);
+#endif
+ }
+}
+
+AVFrame*
+FFmpegDataDecoder<LIBAV_VER>::PrepareFrame()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+#if LIBAVCODEC_VERSION_MAJOR >= 55
+ if (mFrame) {
+ mLib->av_frame_unref(mFrame);
+ } else {
+ mFrame = mLib->av_frame_alloc();
+ }
+#elif LIBAVCODEC_VERSION_MAJOR == 54
+ if (mFrame) {
+ mLib->avcodec_get_frame_defaults(mFrame);
+ } else {
+ mFrame = mLib->avcodec_alloc_frame();
+ }
+#else
+ mLib->av_freep(&mFrame);
+ mFrame = mLib->avcodec_alloc_frame();
+#endif
+ return mFrame;
+}
+
+/* static */ AVCodec*
+FFmpegDataDecoder<LIBAV_VER>::FindAVCodec(FFmpegLibWrapper* aLib,
+ AVCodecID aCodec)
+{
+ return aLib->avcodec_find_decoder(aCodec);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h
new file mode 100644
index 000000000..f9ff9d3c4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegDataDecoder_h__
+#define __FFmpegDataDecoder_h__
+
+#include "PlatformDecoderModule.h"
+#include "FFmpegLibWrapper.h"
+#include "mozilla/StaticMutex.h"
+#include "FFmpegLibs.h"
+
+namespace mozilla
+{
+
+template <int V>
+class FFmpegDataDecoder : public MediaDataDecoder
+{
+};
+
+template <>
+class FFmpegDataDecoder<LIBAV_VER> : public MediaDataDecoder
+{
+public:
+ FFmpegDataDecoder(FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback,
+ AVCodecID aCodecID);
+ virtual ~FFmpegDataDecoder();
+
+ static bool Link();
+
+ RefPtr<InitPromise> Init() override = 0;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+
+ static AVCodec* FindAVCodec(FFmpegLibWrapper* aLib, AVCodecID aCodec);
+
+protected:
+ // Flush and Drain operation, always run
+ virtual void ProcessFlush();
+ virtual void ProcessShutdown();
+ virtual void InitCodecContext() {}
+ AVFrame* PrepareFrame();
+ nsresult InitDecoder();
+
+ FFmpegLibWrapper* mLib;
+ MediaDataDecoderCallback* mCallback;
+
+ AVCodecContext* mCodecContext;
+ AVFrame* mFrame;
+ RefPtr<MediaByteBuffer> mExtraData;
+ AVCodecID mCodecID;
+
+private:
+ void ProcessDecode(MediaRawData* aSample);
+ virtual MediaResult DoDecode(MediaRawData* aSample) = 0;
+ virtual void ProcessDrain() = 0;
+
+ static StaticMutex sMonitor;
+ const RefPtr<TaskQueue> mTaskQueue;
+ // Set/cleared on reader thread calling Flush() to indicate that output is
+ // not required and so input samples on mTaskQueue need not be processed.
+ Atomic<bool> mIsFlushing;
+};
+
+} // namespace mozilla
+
+#endif // __FFmpegDataDecoder_h__
diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.cpp b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.cpp
new file mode 100644
index 000000000..7366bd899
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.cpp
@@ -0,0 +1,13 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FFmpegDecoderModule.h"
+
+namespace mozilla {
+
+template class FFmpegDecoderModule<LIBAV_VER>;
+
+} // namespace mozilla
diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
new file mode 100644
index 000000000..969ac7e0b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegDecoderModule_h__
+#define __FFmpegDecoderModule_h__
+
+#include "PlatformDecoderModule.h"
+#include "FFmpegLibWrapper.h"
+#include "FFmpegAudioDecoder.h"
+#include "FFmpegVideoDecoder.h"
+
+namespace mozilla
+{
+
+template <int V>
+class FFmpegDecoderModule : public PlatformDecoderModule
+{
+public:
+ static already_AddRefed<PlatformDecoderModule>
+ Create(FFmpegLibWrapper* aLib)
+ {
+ RefPtr<PlatformDecoderModule> pdm = new FFmpegDecoderModule(aLib);
+
+ return pdm.forget();
+ }
+
+ explicit FFmpegDecoderModule(FFmpegLibWrapper* aLib) : mLib(aLib) {}
+ virtual ~FFmpegDecoderModule() {}
+
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override
+ {
+ RefPtr<MediaDataDecoder> decoder =
+ new FFmpegVideoDecoder<V>(mLib,
+ aParams.mTaskQueue,
+ aParams.mCallback,
+ aParams.VideoConfig(),
+ aParams.mImageContainer);
+ return decoder.forget();
+ }
+
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override
+ {
+ RefPtr<MediaDataDecoder> decoder =
+ new FFmpegAudioDecoder<V>(mLib,
+ aParams.mTaskQueue,
+ aParams.mCallback,
+ aParams.AudioConfig());
+ return decoder.forget();
+ }
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override
+ {
+ AVCodecID videoCodec = FFmpegVideoDecoder<V>::GetCodecId(aMimeType);
+ AVCodecID audioCodec = FFmpegAudioDecoder<V>::GetCodecId(aMimeType);
+ if (audioCodec == AV_CODEC_ID_NONE && videoCodec == AV_CODEC_ID_NONE) {
+ return false;
+ }
+ AVCodecID codec = audioCodec != AV_CODEC_ID_NONE ? audioCodec : videoCodec;
+ return !!FFmpegDataDecoder<V>::FindAVCodec(mLib, codec);
+ }
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override
+ {
+ if (aConfig.IsVideo() &&
+ (aConfig.mMimeType.EqualsLiteral("video/avc") ||
+ aConfig.mMimeType.EqualsLiteral("video/mp4"))) {
+ return ConversionRequired::kNeedAVCC;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+ }
+
+private:
+ FFmpegLibWrapper* mLib;
+};
+
+} // namespace mozilla
+
+#endif // __FFmpegDecoderModule_h__
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
new file mode 100644
index 000000000..f3dc00ad7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
@@ -0,0 +1,178 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FFmpegLibWrapper.h"
+#include "FFmpegLog.h"
+#include "MediaPrefs.h"
+#include "mozilla/PodOperations.h"
+#include "mozilla/Types.h"
+#include "prlink.h"
+
+#define AV_LOG_DEBUG 48
+
+namespace mozilla
+{
+
+FFmpegLibWrapper::FFmpegLibWrapper()
+{
+ PodZero(this);
+}
+
+FFmpegLibWrapper::~FFmpegLibWrapper()
+{
+ Unlink();
+}
+
+FFmpegLibWrapper::LinkResult
+FFmpegLibWrapper::Link()
+{
+ if (!mAVCodecLib || !mAVUtilLib) {
+ Unlink();
+ return LinkResult::NoProvidedLib;
+ }
+
+ avcodec_version =
+ (decltype(avcodec_version))PR_FindSymbol(mAVCodecLib, "avcodec_version");
+ if (!avcodec_version) {
+ Unlink();
+ return LinkResult::NoAVCodecVersion;
+ }
+ uint32_t version = avcodec_version();
+ uint32_t macro = (version >> 16) & 0xFFu;
+ mVersion = static_cast<int>(macro);
+ uint32_t micro = version & 0xFFu;
+ // A micro version >= 100 indicates that it's FFmpeg (as opposed to LibAV).
+ bool isFFMpeg = micro >= 100;
+ if (!isFFMpeg) {
+ if (macro == 57) {
+ // Due to current AVCodecContext binary incompatibility we can only
+ // support FFmpeg 57 at this stage.
+ Unlink();
+ return LinkResult::CannotUseLibAV57;
+ }
+#ifdef MOZ_FFMPEG
+ if (version < (54u << 16 | 35u << 8 | 1u)
+ && !MediaPrefs::LibavcodecAllowObsolete()) {
+ // Refuse any libavcodec version prior to 54.35.1.
+ // (Unless media.libavcodec.allow-obsolete==true)
+ Unlink();
+ return LinkResult::BlockedOldLibAVVersion;
+ }
+#endif
+ }
+
+ enum {
+ AV_FUNC_AVUTIL_MASK = 1 << 8,
+ AV_FUNC_53 = 1 << 0,
+ AV_FUNC_54 = 1 << 1,
+ AV_FUNC_55 = 1 << 2,
+ AV_FUNC_56 = 1 << 3,
+ AV_FUNC_57 = 1 << 4,
+ AV_FUNC_AVUTIL_53 = AV_FUNC_53 | AV_FUNC_AVUTIL_MASK,
+ AV_FUNC_AVUTIL_54 = AV_FUNC_54 | AV_FUNC_AVUTIL_MASK,
+ AV_FUNC_AVUTIL_55 = AV_FUNC_55 | AV_FUNC_AVUTIL_MASK,
+ AV_FUNC_AVUTIL_56 = AV_FUNC_56 | AV_FUNC_AVUTIL_MASK,
+ AV_FUNC_AVUTIL_57 = AV_FUNC_57 | AV_FUNC_AVUTIL_MASK,
+ AV_FUNC_AVCODEC_ALL = AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57,
+ AV_FUNC_AVUTIL_ALL = AV_FUNC_AVCODEC_ALL | AV_FUNC_AVUTIL_MASK
+ };
+
+ switch (macro) {
+ case 53:
+ version = AV_FUNC_53;
+ break;
+ case 54:
+ version = AV_FUNC_54;
+ break;
+ case 55:
+ version = AV_FUNC_55;
+ break;
+ case 56:
+ version = AV_FUNC_56;
+ break;
+ case 57:
+ version = AV_FUNC_57;
+ break;
+ default:
+ FFMPEG_LOG("Unknown avcodec version");
+ Unlink();
+ return isFFMpeg
+ ? ((macro > 57)
+ ? LinkResult::UnknownFutureFFMpegVersion
+ : LinkResult::UnknownOlderFFMpegVersion)
+ // All LibAV versions<54.35.1 are blocked, therefore we must be
+ // dealing with a later one.
+ : LinkResult::UnknownFutureLibAVVersion;
+ }
+
+#define AV_FUNC_OPTION(func, ver) \
+ if ((ver) & version) { \
+ if (!(func = (decltype(func))PR_FindSymbol(((ver) & AV_FUNC_AVUTIL_MASK) ? mAVUtilLib : mAVCodecLib, #func))) { \
+ FFMPEG_LOG("Couldn't load function " # func); \
+ } \
+ } else { \
+ func = (decltype(func))nullptr; \
+ }
+
+#define AV_FUNC(func, ver) \
+ AV_FUNC_OPTION(func, ver) \
+ if ((ver) & version && !func) { \
+ Unlink(); \
+ return isFFMpeg ? LinkResult::MissingFFMpegFunction \
+ : LinkResult::MissingLibAVFunction; \
+ }
+
+ AV_FUNC(av_lockmgr_register, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_alloc_context3, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_close, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_decode_audio4, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_decode_video2, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_find_decoder, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_flush_buffers, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_open2, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_register_all, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(av_init_packet, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(av_parser_init, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(av_parser_close, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(av_parser_parse2, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_alloc_frame, (AV_FUNC_53 | AV_FUNC_54))
+ AV_FUNC(avcodec_get_frame_defaults, (AV_FUNC_53 | AV_FUNC_54))
+ AV_FUNC(avcodec_free_frame, AV_FUNC_54)
+ AV_FUNC(av_log_set_level, AV_FUNC_AVUTIL_ALL)
+ AV_FUNC(av_malloc, AV_FUNC_AVUTIL_ALL)
+ AV_FUNC(av_freep, AV_FUNC_AVUTIL_ALL)
+ AV_FUNC(av_frame_alloc, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57))
+ AV_FUNC(av_frame_free, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57))
+ AV_FUNC(av_frame_unref, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57))
+ AV_FUNC_OPTION(av_frame_get_colorspace, AV_FUNC_AVUTIL_ALL)
+#undef AV_FUNC
+#undef AV_FUNC_OPTION
+
+ avcodec_register_all();
+#ifdef DEBUG
+ av_log_set_level(AV_LOG_DEBUG);
+#endif
+
+ return LinkResult::Success;
+}
+
+void
+FFmpegLibWrapper::Unlink()
+{
+ if (av_lockmgr_register) {
+ // Registering a null lockmgr cause the destruction of libav* global mutexes
+ // as the default lockmgr that allocated them will be deregistered.
+ // This prevents ASAN and valgrind to report sizeof(pthread_mutex_t) leaks.
+ av_lockmgr_register(nullptr);
+ }
+ if (mAVUtilLib && mAVUtilLib != mAVCodecLib) {
+ PR_UnloadLibrary(mAVUtilLib);
+ }
+ if (mAVCodecLib) {
+ PR_UnloadLibrary(mAVCodecLib);
+ }
+ PodZero(this);
+}
+
+} // namespace mozilla \ No newline at end of file
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
new file mode 100644
index 000000000..d6944a1d8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegLibWrapper_h__
+#define __FFmpegLibWrapper_h__
+
+#include "mozilla/Types.h"
+
+struct AVCodec;
+struct AVCodecContext;
+struct AVFrame;
+struct AVPacket;
+struct AVDictionary;
+struct AVCodecParserContext;
+struct PRLibrary;
+
+namespace mozilla
+{
+
+struct FFmpegLibWrapper
+{
+ FFmpegLibWrapper();
+ ~FFmpegLibWrapper();
+
+ enum class LinkResult
+ {
+ Success,
+ NoProvidedLib,
+ NoAVCodecVersion,
+ CannotUseLibAV57,
+ BlockedOldLibAVVersion,
+ UnknownFutureLibAVVersion,
+ UnknownFutureFFMpegVersion,
+ UnknownOlderFFMpegVersion,
+ MissingFFMpegFunction,
+ MissingLibAVFunction,
+ };
+ // Examine mAVCodecLib and mAVUtilLib, and attempt to resolve all symbols.
+ // Upon failure, the entire object will be reset and any attached libraries
+ // will be unlinked.
+ LinkResult Link();
+
+ // Reset the wrapper and unlink all attached libraries.
+ void Unlink();
+
+ // indicate the version of libavcodec linked to.
+ // 0 indicates that the function wasn't initialized with Link().
+ int mVersion;
+
+ // libavcodec
+ unsigned (*avcodec_version)();
+ int (*av_lockmgr_register)(int (*cb)(void** mutex, int op));
+ AVCodecContext* (*avcodec_alloc_context3)(const AVCodec* codec);
+ int (*avcodec_close)(AVCodecContext* avctx);
+ int (*avcodec_decode_audio4)(AVCodecContext* avctx, AVFrame* frame, int* got_frame_ptr, const AVPacket* avpkt);
+ int (*avcodec_decode_video2)(AVCodecContext* avctx, AVFrame* picture, int* got_picture_ptr, const AVPacket* avpkt);
+ AVCodec* (*avcodec_find_decoder)(int id);
+ void (*avcodec_flush_buffers)(AVCodecContext *avctx);
+ int (*avcodec_open2)(AVCodecContext *avctx, const AVCodec* codec, AVDictionary** options);
+ void (*avcodec_register_all)();
+ void (*av_init_packet)(AVPacket* pkt);
+ AVCodecParserContext* (*av_parser_init)(int codec_id);
+ void (*av_parser_close)(AVCodecParserContext* s);
+ int (*av_parser_parse2)(AVCodecParserContext* s, AVCodecContext* avctx, uint8_t** poutbuf, int* poutbuf_size, const uint8_t* buf, int buf_size, int64_t pts, int64_t dts, int64_t pos);
+
+ // only used in libavcodec <= 54
+ AVFrame* (*avcodec_alloc_frame)();
+ void (*avcodec_get_frame_defaults)(AVFrame* pic);
+ // libavcodec v54 only
+ void (*avcodec_free_frame)(AVFrame** frame);
+
+ // libavutil
+ void (*av_log_set_level)(int level);
+ void* (*av_malloc)(size_t size);
+ void (*av_freep)(void *ptr);
+
+ // libavutil v55 and later only
+ AVFrame* (*av_frame_alloc)();
+ void (*av_frame_free)(AVFrame** frame);
+ void (*av_frame_unref)(AVFrame* frame);
+
+ // libavutil optional
+ int (*av_frame_get_colorspace)(const AVFrame *frame);
+
+ PRLibrary* mAVCodecLib;
+ PRLibrary* mAVUtilLib;
+
+private:
+};
+
+} // namespace mozilla
+
+#endif // FFmpegLibWrapper \ No newline at end of file
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibs.h b/dom/media/platforms/ffmpeg/FFmpegLibs.h
new file mode 100644
index 000000000..291ed7789
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegLibs.h
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegLibs_h__
+#define __FFmpegLibs_h__
+
+extern "C" {
+#ifdef __GNUC__
+#pragma GCC visibility push(default)
+#endif
+#include "libavcodec/avcodec.h"
+#include "libavutil/avutil.h"
+#include "libavutil/mem.h"
+#ifdef __GNUC__
+#pragma GCC visibility pop
+#endif
+}
+
+#if LIBAVCODEC_VERSION_MAJOR < 55
+#define AV_CODEC_ID_VP6F CODEC_ID_VP6F
+#define AV_CODEC_ID_H264 CODEC_ID_H264
+#define AV_CODEC_ID_AAC CODEC_ID_AAC
+#define AV_CODEC_ID_MP3 CODEC_ID_MP3
+#define AV_CODEC_ID_VP8 CODEC_ID_VP8
+#define AV_CODEC_ID_NONE CODEC_ID_NONE
+#define AV_CODEC_ID_FLAC CODEC_ID_FLAC
+typedef CodecID AVCodecID;
+#endif
+
+#ifdef FFVPX_VERSION
+enum { LIBAV_VER = FFVPX_VERSION };
+#else
+enum { LIBAV_VER = LIBAVCODEC_VERSION_MAJOR };
+#endif
+
+#endif // __FFmpegLibs_h__
diff --git a/dom/media/platforms/ffmpeg/FFmpegLog.h b/dom/media/platforms/ffmpeg/FFmpegLog.h
new file mode 100644
index 000000000..602ce5b71
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegLog.h
@@ -0,0 +1,14 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegLog_h__
+#define __FFmpegLog_h__
+
+#include "mozilla/Logging.h"
+
+#define FFMPEG_LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+#endif // __FFmpegLog_h__
diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
new file mode 100644
index 000000000..fdbe77ef7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
@@ -0,0 +1,169 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FFmpegRuntimeLinker.h"
+#include "FFmpegLibWrapper.h"
+#include "mozilla/ArrayUtils.h"
+#include "FFmpegLog.h"
+#include "prlink.h"
+
+namespace mozilla
+{
+
+FFmpegRuntimeLinker::LinkStatus FFmpegRuntimeLinker::sLinkStatus =
+ LinkStatus_INIT;
+const char* FFmpegRuntimeLinker::sLinkStatusLibraryName = "";
+
+template <int V> class FFmpegDecoderModule
+{
+public:
+ static already_AddRefed<PlatformDecoderModule> Create(FFmpegLibWrapper*);
+};
+
+static FFmpegLibWrapper sLibAV;
+
+static const char* sLibs[] = {
+#if defined(XP_DARWIN)
+ "libavcodec.57.dylib",
+ "libavcodec.56.dylib",
+ "libavcodec.55.dylib",
+ "libavcodec.54.dylib",
+ "libavcodec.53.dylib",
+#else
+ "libavcodec-ffmpeg.so.57",
+ "libavcodec-ffmpeg.so.56",
+ "libavcodec.so.57",
+ "libavcodec.so.56",
+ "libavcodec.so.55",
+ "libavcodec.so.54",
+ "libavcodec.so.53",
+#endif
+};
+
+/* static */ bool
+FFmpegRuntimeLinker::Init()
+{
+ if (sLinkStatus != LinkStatus_INIT) {
+ return sLinkStatus == LinkStatus_SUCCEEDED;
+ }
+
+ // While going through all possible libs, this status will be updated with a
+ // more precise error if possible.
+ sLinkStatus = LinkStatus_NOT_FOUND;
+
+ for (size_t i = 0; i < ArrayLength(sLibs); i++) {
+ const char* lib = sLibs[i];
+ PRLibSpec lspec;
+ lspec.type = PR_LibSpec_Pathname;
+ lspec.value.pathname = lib;
+ sLibAV.mAVCodecLib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
+ if (sLibAV.mAVCodecLib) {
+ sLibAV.mAVUtilLib = sLibAV.mAVCodecLib;
+ switch (sLibAV.Link()) {
+ case FFmpegLibWrapper::LinkResult::Success:
+ sLinkStatus = LinkStatus_SUCCEEDED;
+ sLinkStatusLibraryName = lib;
+ return true;
+ case FFmpegLibWrapper::LinkResult::NoProvidedLib:
+ MOZ_ASSERT_UNREACHABLE("Incorrectly-setup sLibAV");
+ break;
+ case FFmpegLibWrapper::LinkResult::NoAVCodecVersion:
+ if (sLinkStatus > LinkStatus_INVALID_CANDIDATE) {
+ sLinkStatus = LinkStatus_INVALID_CANDIDATE;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::CannotUseLibAV57:
+ if (sLinkStatus > LinkStatus_UNUSABLE_LIBAV57) {
+ sLinkStatus = LinkStatus_UNUSABLE_LIBAV57;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::BlockedOldLibAVVersion:
+ if (sLinkStatus > LinkStatus_OBSOLETE_LIBAV) {
+ sLinkStatus = LinkStatus_OBSOLETE_LIBAV;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::UnknownFutureLibAVVersion:
+ case FFmpegLibWrapper::LinkResult::MissingLibAVFunction:
+ if (sLinkStatus > LinkStatus_INVALID_LIBAV_CANDIDATE) {
+ sLinkStatus = LinkStatus_INVALID_LIBAV_CANDIDATE;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::UnknownFutureFFMpegVersion:
+ case FFmpegLibWrapper::LinkResult::MissingFFMpegFunction:
+ if (sLinkStatus > LinkStatus_INVALID_FFMPEG_CANDIDATE) {
+ sLinkStatus = LinkStatus_INVALID_FFMPEG_CANDIDATE;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ case FFmpegLibWrapper::LinkResult::UnknownOlderFFMpegVersion:
+ if (sLinkStatus > LinkStatus_OBSOLETE_FFMPEG) {
+ sLinkStatus = LinkStatus_OBSOLETE_FFMPEG;
+ sLinkStatusLibraryName = lib;
+ }
+ break;
+ }
+ }
+ }
+
+ FFMPEG_LOG("H264/AAC codecs unsupported without [");
+ for (size_t i = 0; i < ArrayLength(sLibs); i++) {
+ FFMPEG_LOG("%s %s", i ? "," : " ", sLibs[i]);
+ }
+ FFMPEG_LOG(" ]\n");
+
+ return false;
+}
+
+/* static */ already_AddRefed<PlatformDecoderModule>
+FFmpegRuntimeLinker::CreateDecoderModule()
+{
+ if (!Init()) {
+ return nullptr;
+ }
+ RefPtr<PlatformDecoderModule> module;
+ switch (sLibAV.mVersion) {
+ case 53: module = FFmpegDecoderModule<53>::Create(&sLibAV); break;
+ case 54: module = FFmpegDecoderModule<54>::Create(&sLibAV); break;
+ case 55:
+ case 56: module = FFmpegDecoderModule<55>::Create(&sLibAV); break;
+ case 57: module = FFmpegDecoderModule<57>::Create(&sLibAV); break;
+ default: module = nullptr;
+ }
+ return module.forget();
+}
+
+/* static */ const char*
+FFmpegRuntimeLinker::LinkStatusString()
+{
+ switch (sLinkStatus) {
+ case LinkStatus_INIT:
+ return "Libavcodec not initialized yet";
+ case LinkStatus_SUCCEEDED:
+ return "Libavcodec linking succeeded";
+ case LinkStatus_INVALID_FFMPEG_CANDIDATE:
+ return "Invalid FFMpeg libavcodec candidate";
+ case LinkStatus_UNUSABLE_LIBAV57:
+ return "Unusable LibAV's libavcodec 57";
+ case LinkStatus_INVALID_LIBAV_CANDIDATE:
+ return "Invalid LibAV libavcodec candidate";
+ case LinkStatus_OBSOLETE_FFMPEG:
+ return "Obsolete FFMpeg libavcodec candidate";
+ case LinkStatus_OBSOLETE_LIBAV:
+ return "Obsolete LibAV libavcodec candidate";
+ case LinkStatus_INVALID_CANDIDATE:
+ return "Invalid libavcodec candidate";
+ case LinkStatus_NOT_FOUND:
+ return "Libavcodec not found";
+ }
+ MOZ_ASSERT_UNREACHABLE("Unknown sLinkStatus value");
+ return "?";
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h
new file mode 100644
index 000000000..900c4ca79
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegRuntimeLinker_h__
+#define __FFmpegRuntimeLinker_h__
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla
+{
+
+class FFmpegRuntimeLinker
+{
+public:
+ static bool Init();
+ static already_AddRefed<PlatformDecoderModule> CreateDecoderModule();
+ enum LinkStatus
+ {
+ LinkStatus_INIT = 0, // Never been linked.
+ LinkStatus_SUCCEEDED, // Found a usable library.
+ // The following error statuses are sorted from most to least preferred
+ // (i.e., if more than one happens, the top one is chosen.)
+ LinkStatus_INVALID_FFMPEG_CANDIDATE, // Found ffmpeg with unexpected contents.
+ LinkStatus_UNUSABLE_LIBAV57, // Found LibAV 57, which we cannot use.
+ LinkStatus_INVALID_LIBAV_CANDIDATE, // Found libav with unexpected contents.
+ LinkStatus_OBSOLETE_FFMPEG,
+ LinkStatus_OBSOLETE_LIBAV,
+ LinkStatus_INVALID_CANDIDATE, // Found some lib with unexpected contents.
+ LinkStatus_NOT_FOUND, // Haven't found any library with an expected name.
+ };
+ static LinkStatus LinkStatusCode() { return sLinkStatus; }
+ static const char* LinkStatusString();
+ // Library name to which the sLinkStatus applies, or "" if not applicable.
+ static const char* LinkStatusLibraryName() { return sLinkStatusLibraryName; }
+
+private:
+ static LinkStatus sLinkStatus;
+ static const char* sLinkStatusLibraryName;
+};
+
+}
+
+#endif // __FFmpegRuntimeLinker_h__
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
new file mode 100644
index 000000000..5c1b6c97b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
@@ -0,0 +1,393 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/TaskQueue.h"
+
+#include "nsThreadUtils.h"
+#include "ImageContainer.h"
+
+#include "MediaInfo.h"
+#include "VPXDecoder.h"
+#include "MP4Decoder.h"
+
+#include "FFmpegVideoDecoder.h"
+#include "FFmpegLog.h"
+#include "mozilla/PodOperations.h"
+
+#include "libavutil/pixfmt.h"
+#if LIBAVCODEC_VERSION_MAJOR < 54
+#define AVPixelFormat PixelFormat
+#define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P
+#define AV_PIX_FMT_YUVJ420P PIX_FMT_YUVJ420P
+#define AV_PIX_FMT_YUV444P PIX_FMT_YUV444P
+#define AV_PIX_FMT_NONE PIX_FMT_NONE
+#endif
+
+typedef mozilla::layers::Image Image;
+typedef mozilla::layers::PlanarYCbCrImage PlanarYCbCrImage;
+
+namespace mozilla
+{
+
+/**
+ * FFmpeg calls back to this function with a list of pixel formats it supports.
+ * We choose a pixel format that we support and return it.
+ * For now, we just look for YUV420P, YUVJ420P and YUV444 as those are the only
+ * only non-HW accelerated format supported by FFmpeg's H264 and VP9 decoder.
+ */
+static AVPixelFormat
+ChoosePixelFormat(AVCodecContext* aCodecContext, const AVPixelFormat* aFormats)
+{
+ FFMPEG_LOG("Choosing FFmpeg pixel format for video decoding.");
+ for (; *aFormats > -1; aFormats++) {
+ switch (*aFormats) {
+ case AV_PIX_FMT_YUV444P:
+ FFMPEG_LOG("Requesting pixel format YUV444P.");
+ return AV_PIX_FMT_YUV444P;
+ case AV_PIX_FMT_YUV420P:
+ FFMPEG_LOG("Requesting pixel format YUV420P.");
+ return AV_PIX_FMT_YUV420P;
+ case AV_PIX_FMT_YUVJ420P:
+ FFMPEG_LOG("Requesting pixel format YUVJ420P.");
+ return AV_PIX_FMT_YUVJ420P;
+ default:
+ break;
+ }
+ }
+
+ NS_WARNING("FFmpeg does not share any supported pixel formats.");
+ return AV_PIX_FMT_NONE;
+}
+
+FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::PtsCorrectionContext()
+ : mNumFaultyPts(0)
+ , mNumFaultyDts(0)
+ , mLastPts(INT64_MIN)
+ , mLastDts(INT64_MIN)
+{
+}
+
+int64_t
+FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::GuessCorrectPts(int64_t aPts, int64_t aDts)
+{
+ int64_t pts = AV_NOPTS_VALUE;
+
+ if (aDts != int64_t(AV_NOPTS_VALUE)) {
+ mNumFaultyDts += aDts <= mLastDts;
+ mLastDts = aDts;
+ }
+ if (aPts != int64_t(AV_NOPTS_VALUE)) {
+ mNumFaultyPts += aPts <= mLastPts;
+ mLastPts = aPts;
+ }
+ if ((mNumFaultyPts <= mNumFaultyDts || aDts == int64_t(AV_NOPTS_VALUE)) &&
+ aPts != int64_t(AV_NOPTS_VALUE)) {
+ pts = aPts;
+ } else {
+ pts = aDts;
+ }
+ return pts;
+}
+
+void
+FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::Reset()
+{
+ mNumFaultyPts = 0;
+ mNumFaultyDts = 0;
+ mLastPts = INT64_MIN;
+ mLastDts = INT64_MIN;
+}
+
+FFmpegVideoDecoder<LIBAV_VER>::FFmpegVideoDecoder(FFmpegLibWrapper* aLib,
+ TaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback,
+ const VideoInfo& aConfig,
+ ImageContainer* aImageContainer)
+ : FFmpegDataDecoder(aLib, aTaskQueue, aCallback, GetCodecId(aConfig.mMimeType))
+ , mImageContainer(aImageContainer)
+ , mInfo(aConfig)
+ , mCodecParser(nullptr)
+ , mLastInputDts(INT64_MIN)
+{
+ MOZ_COUNT_CTOR(FFmpegVideoDecoder);
+ // Use a new MediaByteBuffer as the object will be modified during initialization.
+ mExtraData = new MediaByteBuffer;
+ mExtraData->AppendElements(*aConfig.mExtraData);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+FFmpegVideoDecoder<LIBAV_VER>::Init()
+{
+ if (NS_FAILED(InitDecoder())) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
+}
+
+void
+FFmpegVideoDecoder<LIBAV_VER>::InitCodecContext()
+{
+ mCodecContext->width = mInfo.mImage.width;
+ mCodecContext->height = mInfo.mImage.height;
+
+ // We use the same logic as libvpx in determining the number of threads to use
+ // so that we end up behaving in the same fashion when using ffmpeg as
+ // we would otherwise cause various crashes (see bug 1236167)
+ int decode_threads = 1;
+ if (mInfo.mDisplay.width >= 2048) {
+ decode_threads = 8;
+ } else if (mInfo.mDisplay.width >= 1024) {
+ decode_threads = 4;
+ } else if (mInfo.mDisplay.width >= 320) {
+ decode_threads = 2;
+ }
+
+ decode_threads = std::min(decode_threads, PR_GetNumberOfProcessors() - 1);
+ decode_threads = std::max(decode_threads, 1);
+ mCodecContext->thread_count = decode_threads;
+ if (decode_threads > 1) {
+ mCodecContext->thread_type = FF_THREAD_SLICE | FF_THREAD_FRAME;
+ }
+
+ // FFmpeg will call back to this to negotiate a video pixel format.
+ mCodecContext->get_format = ChoosePixelFormat;
+
+ mCodecParser = mLib->av_parser_init(mCodecID);
+ if (mCodecParser) {
+ mCodecParser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
+ }
+}
+
+MediaResult
+FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample)
+{
+ bool gotFrame = false;
+ return DoDecode(aSample, &gotFrame);
+}
+
+MediaResult
+FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample, bool* aGotFrame)
+{
+ uint8_t* inputData = const_cast<uint8_t*>(aSample->Data());
+ size_t inputSize = aSample->Size();
+
+#if LIBAVCODEC_VERSION_MAJOR >= 54
+ if (inputSize && mCodecParser && (mCodecID == AV_CODEC_ID_VP8
+#if LIBAVCODEC_VERSION_MAJOR >= 55
+ || mCodecID == AV_CODEC_ID_VP9
+#endif
+ )) {
+ while (inputSize) {
+ uint8_t* data;
+ int size;
+ int len = mLib->av_parser_parse2(mCodecParser, mCodecContext, &data, &size,
+ inputData, inputSize,
+ aSample->mTime, aSample->mTimecode,
+ aSample->mOffset);
+ if (size_t(len) > inputSize) {
+ return NS_ERROR_DOM_MEDIA_DECODE_ERR;
+ }
+ inputData += len;
+ inputSize -= len;
+ if (size) {
+ bool gotFrame = false;
+ MediaResult rv = DoDecode(aSample, data, size, &gotFrame);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ if (gotFrame && aGotFrame) {
+ *aGotFrame = true;
+ }
+ }
+ }
+ return NS_OK;
+ }
+#endif
+ return DoDecode(aSample, inputData, inputSize, aGotFrame);
+}
+
+MediaResult
+FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
+ uint8_t* aData, int aSize,
+ bool* aGotFrame)
+{
+ AVPacket packet;
+ mLib->av_init_packet(&packet);
+
+ packet.data = aData;
+ packet.size = aSize;
+ packet.dts = mLastInputDts = aSample->mTimecode;
+ packet.pts = aSample->mTime;
+ packet.flags = aSample->mKeyframe ? AV_PKT_FLAG_KEY : 0;
+ packet.pos = aSample->mOffset;
+
+ // LibAV provides no API to retrieve the decoded sample's duration.
+ // (FFmpeg >= 1.0 provides av_frame_get_pkt_duration)
+ // As such we instead use a map using the dts as key that we will retrieve
+ // later.
+ // The map will have a typical size of 16 entry.
+ mDurationMap.Insert(aSample->mTimecode, aSample->mDuration);
+
+ if (!PrepareFrame()) {
+ NS_WARNING("FFmpeg h264 decoder failed to allocate frame.");
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
+ }
+
+ // Required with old version of FFmpeg/LibAV
+ mFrame->reordered_opaque = AV_NOPTS_VALUE;
+
+ int decoded;
+ int bytesConsumed =
+ mLib->avcodec_decode_video2(mCodecContext, mFrame, &decoded, &packet);
+
+ FFMPEG_LOG("DoDecodeFrame:decode_video: rv=%d decoded=%d "
+ "(Input: pts(%lld) dts(%lld) Output: pts(%lld) "
+ "opaque(%lld) pkt_pts(%lld) pkt_dts(%lld))",
+ bytesConsumed, decoded, packet.pts, packet.dts, mFrame->pts,
+ mFrame->reordered_opaque, mFrame->pkt_pts, mFrame->pkt_dts);
+
+ if (bytesConsumed < 0) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("FFmpeg video error:%d", bytesConsumed));
+ }
+
+ if (!decoded) {
+ if (aGotFrame) {
+ *aGotFrame = false;
+ }
+ return NS_OK;
+ }
+
+ // If we've decoded a frame then we need to output it
+ int64_t pts = mPtsContext.GuessCorrectPts(mFrame->pkt_pts, mFrame->pkt_dts);
+ // Retrieve duration from dts.
+ // We use the first entry found matching this dts (this is done to
+ // handle damaged file with multiple frames with the same dts)
+
+ int64_t duration;
+ if (!mDurationMap.Find(mFrame->pkt_dts, duration)) {
+ NS_WARNING("Unable to retrieve duration from map");
+ duration = aSample->mDuration;
+ // dts are probably incorrectly reported ; so clear the map as we're
+ // unlikely to find them in the future anyway. This also guards
+ // against the map becoming extremely big.
+ mDurationMap.Clear();
+ }
+ FFMPEG_LOG("Got one frame output with pts=%lld dts=%lld duration=%lld opaque=%lld",
+ pts, mFrame->pkt_dts, duration, mCodecContext->reordered_opaque);
+
+ VideoData::YCbCrBuffer b;
+ b.mPlanes[0].mData = mFrame->data[0];
+ b.mPlanes[1].mData = mFrame->data[1];
+ b.mPlanes[2].mData = mFrame->data[2];
+
+ b.mPlanes[0].mStride = mFrame->linesize[0];
+ b.mPlanes[1].mStride = mFrame->linesize[1];
+ b.mPlanes[2].mStride = mFrame->linesize[2];
+
+ b.mPlanes[0].mOffset = b.mPlanes[0].mSkip = 0;
+ b.mPlanes[1].mOffset = b.mPlanes[1].mSkip = 0;
+ b.mPlanes[2].mOffset = b.mPlanes[2].mSkip = 0;
+
+ b.mPlanes[0].mWidth = mFrame->width;
+ b.mPlanes[0].mHeight = mFrame->height;
+ if (mCodecContext->pix_fmt == AV_PIX_FMT_YUV444P) {
+ b.mPlanes[1].mWidth = b.mPlanes[2].mWidth = mFrame->width;
+ b.mPlanes[1].mHeight = b.mPlanes[2].mHeight = mFrame->height;
+ } else {
+ b.mPlanes[1].mWidth = b.mPlanes[2].mWidth = (mFrame->width + 1) >> 1;
+ b.mPlanes[1].mHeight = b.mPlanes[2].mHeight = (mFrame->height + 1) >> 1;
+ }
+ if (mLib->av_frame_get_colorspace) {
+ switch (mLib->av_frame_get_colorspace(mFrame)) {
+ case AVCOL_SPC_BT709:
+ b.mYUVColorSpace = YUVColorSpace::BT709;
+ break;
+ case AVCOL_SPC_SMPTE170M:
+ case AVCOL_SPC_BT470BG:
+ b.mYUVColorSpace = YUVColorSpace::BT601;
+ break;
+ default:
+ break;
+ }
+ }
+ RefPtr<VideoData> v =
+ VideoData::CreateAndCopyData(mInfo,
+ mImageContainer,
+ aSample->mOffset,
+ pts,
+ duration,
+ b,
+ !!mFrame->key_frame,
+ -1,
+ mInfo.ScaledImageRect(mFrame->width,
+ mFrame->height));
+
+ if (!v) {
+ return MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("image allocation error"));
+ }
+ mCallback->Output(v);
+ if (aGotFrame) {
+ *aGotFrame = true;
+ }
+ return NS_OK;
+}
+
+void
+FFmpegVideoDecoder<LIBAV_VER>::ProcessDrain()
+{
+ RefPtr<MediaRawData> empty(new MediaRawData());
+ empty->mTimecode = mLastInputDts;
+ bool gotFrame = false;
+ while (NS_SUCCEEDED(DoDecode(empty, &gotFrame)) && gotFrame);
+ mCallback->DrainComplete();
+}
+
+void
+FFmpegVideoDecoder<LIBAV_VER>::ProcessFlush()
+{
+ mPtsContext.Reset();
+ mDurationMap.Clear();
+ FFmpegDataDecoder::ProcessFlush();
+}
+
+FFmpegVideoDecoder<LIBAV_VER>::~FFmpegVideoDecoder()
+{
+ MOZ_COUNT_DTOR(FFmpegVideoDecoder);
+ if (mCodecParser) {
+ mLib->av_parser_close(mCodecParser);
+ mCodecParser = nullptr;
+ }
+}
+
+AVCodecID
+FFmpegVideoDecoder<LIBAV_VER>::GetCodecId(const nsACString& aMimeType)
+{
+ if (MP4Decoder::IsH264(aMimeType)) {
+ return AV_CODEC_ID_H264;
+ }
+
+ if (aMimeType.EqualsLiteral("video/x-vnd.on2.vp6")) {
+ return AV_CODEC_ID_VP6F;
+ }
+
+#if LIBAVCODEC_VERSION_MAJOR >= 54
+ if (VPXDecoder::IsVP8(aMimeType)) {
+ return AV_CODEC_ID_VP8;
+ }
+#endif
+
+#if LIBAVCODEC_VERSION_MAJOR >= 55
+ if (VPXDecoder::IsVP9(aMimeType)) {
+ return AV_CODEC_ID_VP9;
+ }
+#endif
+
+ return AV_CODEC_ID_NONE;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
new file mode 100644
index 000000000..786df0da1
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
@@ -0,0 +1,127 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFmpegVideoDecoder_h__
+#define __FFmpegVideoDecoder_h__
+
+#include "FFmpegLibWrapper.h"
+#include "FFmpegDataDecoder.h"
+#include "mozilla/Pair.h"
+#include "nsTArray.h"
+
+namespace mozilla
+{
+
+template <int V>
+class FFmpegVideoDecoder : public FFmpegDataDecoder<V>
+{
+};
+
+template <>
+class FFmpegVideoDecoder<LIBAV_VER> : public FFmpegDataDecoder<LIBAV_VER>
+{
+ typedef mozilla::layers::Image Image;
+ typedef mozilla::layers::ImageContainer ImageContainer;
+
+public:
+ FFmpegVideoDecoder(FFmpegLibWrapper* aLib, TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback,
+ const VideoInfo& aConfig,
+ ImageContainer* aImageContainer);
+ virtual ~FFmpegVideoDecoder();
+
+ RefPtr<InitPromise> Init() override;
+ void InitCodecContext() override;
+ const char* GetDescriptionName() const override
+ {
+#ifdef USING_MOZFFVPX
+ return "ffvpx video decoder";
+#else
+ return "ffmpeg video decoder";
+#endif
+ }
+ static AVCodecID GetCodecId(const nsACString& aMimeType);
+
+private:
+ MediaResult DoDecode(MediaRawData* aSample) override;
+ MediaResult DoDecode(MediaRawData* aSample, bool* aGotFrame);
+ MediaResult DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame);
+ void ProcessDrain() override;
+ void ProcessFlush() override;
+ void OutputDelayedFrames();
+
+ /**
+ * This method allocates a buffer for FFmpeg's decoder, wrapped in an Image.
+ * Currently it only supports Planar YUV420, which appears to be the only
+ * non-hardware accelerated image format that FFmpeg's H264 decoder is
+ * capable of outputting.
+ */
+ int AllocateYUV420PVideoBuffer(AVCodecContext* aCodecContext,
+ AVFrame* aFrame);
+
+ RefPtr<ImageContainer> mImageContainer;
+ VideoInfo mInfo;
+
+ // Parser used for VP8 and VP9 decoding.
+ AVCodecParserContext* mCodecParser;
+
+ class PtsCorrectionContext {
+ public:
+ PtsCorrectionContext();
+ int64_t GuessCorrectPts(int64_t aPts, int64_t aDts);
+ void Reset();
+ int64_t LastDts() const { return mLastDts; }
+
+ private:
+ int64_t mNumFaultyPts; /// Number of incorrect PTS values so far
+ int64_t mNumFaultyDts; /// Number of incorrect DTS values so far
+ int64_t mLastPts; /// PTS of the last frame
+ int64_t mLastDts; /// DTS of the last frame
+ };
+
+ PtsCorrectionContext mPtsContext;
+ int64_t mLastInputDts;
+
+ class DurationMap {
+ public:
+ typedef Pair<int64_t, int64_t> DurationElement;
+
+ // Insert Key and Duration pair at the end of our map.
+ void Insert(int64_t aKey, int64_t aDuration)
+ {
+ mMap.AppendElement(MakePair(aKey, aDuration));
+ }
+ // Sets aDuration matching aKey and remove it from the map if found.
+ // The element returned is the first one found.
+ // Returns true if found, false otherwise.
+ bool Find(int64_t aKey, int64_t& aDuration)
+ {
+ for (uint32_t i = 0; i < mMap.Length(); i++) {
+ DurationElement& element = mMap[i];
+ if (element.first() == aKey) {
+ aDuration = element.second();
+ mMap.RemoveElementAt(i);
+ return true;
+ }
+ }
+ return false;
+ }
+ // Remove all elements of the map.
+ void Clear()
+ {
+ mMap.Clear();
+ }
+
+ private:
+ AutoTArray<DurationElement, 16> mMap;
+ };
+
+ DurationMap mDurationMap;
+};
+
+} // namespace mozilla
+
+#endif // __FFmpegVideoDecoder_h__
diff --git a/dom/media/platforms/ffmpeg/README_mozilla b/dom/media/platforms/ffmpeg/README_mozilla
new file mode 100644
index 000000000..19761f751
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/README_mozilla
@@ -0,0 +1,11 @@
+These headers are taken from Libav versions 0.8.9, 0.9 and 1.0.
+
+These headers are licensed under the GNU Lesser General Public License version
+2.1. For more information see the file COPYING.LGPLv2.1
+
+While the function ABIs of FFmpeg/Libav tend to be stable between even major
+versions, the class layouts can change considerably. This can lead to major
+crashes if we build against the wrong headers. We include these headers to make
+sure we have the same version every time we build, and to ease the pain of
+acquiring the correct libraries for a build, especially for those distributions
+who oppose distributing such packages.
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/ffmpeg57/include/COPYING.LGPLv2.1
new file mode 100644
index 000000000..00b4fedfe
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/COPYING.LGPLv2.1
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avcodec.h
new file mode 100644
index 000000000..f365775f0
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avcodec.h
@@ -0,0 +1,5418 @@
+/*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVCODEC_H
+#define AVCODEC_AVCODEC_H
+
+/**
+ * @file
+ * @ingroup libavc
+ * Libavcodec external API header
+ */
+
+#include <errno.h>
+#include "libavutil/samplefmt.h"
+#include "libavutil/attributes.h"
+#include "libavutil/avutil.h"
+#include "libavutil/buffer.h"
+#include "libavutil/cpu.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/dict.h"
+#include "libavutil/frame.h"
+#include "libavutil/log.h"
+#include "libavutil/pixfmt.h"
+#include "libavutil/rational.h"
+
+#include "version.h"
+
+/**
+ * @defgroup libavc Encoding/Decoding Library
+ * @{
+ *
+ * @defgroup lavc_decoding Decoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_encoding Encoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_codec Codecs
+ * @{
+ * @defgroup lavc_codec_native Native Codecs
+ * @{
+ * @}
+ * @defgroup lavc_codec_wrappers External library wrappers
+ * @{
+ * @}
+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
+ * @{
+ * @}
+ * @}
+ * @defgroup lavc_internal Internal
+ * @{
+ * @}
+ * @}
+ *
+ */
+
+/**
+ * @defgroup lavc_core Core functions/structures.
+ * @ingroup libavc
+ *
+ * Basic definitions, functions for querying libavcodec capabilities,
+ * allocating core structures, etc.
+ * @{
+ */
+
+
+/**
+ * Identify the syntax and semantics of the bitstream.
+ * The principle is roughly:
+ * Two decoders with the same ID can decode the same streams.
+ * Two encoders with the same ID can encode compatible streams.
+ * There may be slight deviations from the principle due to implementation
+ * details.
+ *
+ * If you add a codec ID to this list, add it so that
+ * 1. no value of a existing codec ID changes (that would break ABI),
+ * 2. it is as close as possible to similar codecs
+ *
+ * After adding new codec IDs, do not forget to add an entry to the codec
+ * descriptor list and bump libavcodec minor version.
+ */
+enum AVCodecID {
+ AV_CODEC_ID_NONE,
+
+ /* video codecs */
+ AV_CODEC_ID_MPEG1VIDEO,
+ AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+#if FF_API_XVMC
+ AV_CODEC_ID_MPEG2VIDEO_XVMC,
+#endif /* FF_API_XVMC */
+ AV_CODEC_ID_H261,
+ AV_CODEC_ID_H263,
+ AV_CODEC_ID_RV10,
+ AV_CODEC_ID_RV20,
+ AV_CODEC_ID_MJPEG,
+ AV_CODEC_ID_MJPEGB,
+ AV_CODEC_ID_LJPEG,
+ AV_CODEC_ID_SP5X,
+ AV_CODEC_ID_JPEGLS,
+ AV_CODEC_ID_MPEG4,
+ AV_CODEC_ID_RAWVIDEO,
+ AV_CODEC_ID_MSMPEG4V1,
+ AV_CODEC_ID_MSMPEG4V2,
+ AV_CODEC_ID_MSMPEG4V3,
+ AV_CODEC_ID_WMV1,
+ AV_CODEC_ID_WMV2,
+ AV_CODEC_ID_H263P,
+ AV_CODEC_ID_H263I,
+ AV_CODEC_ID_FLV1,
+ AV_CODEC_ID_SVQ1,
+ AV_CODEC_ID_SVQ3,
+ AV_CODEC_ID_DVVIDEO,
+ AV_CODEC_ID_HUFFYUV,
+ AV_CODEC_ID_CYUV,
+ AV_CODEC_ID_H264,
+ AV_CODEC_ID_INDEO3,
+ AV_CODEC_ID_VP3,
+ AV_CODEC_ID_THEORA,
+ AV_CODEC_ID_ASV1,
+ AV_CODEC_ID_ASV2,
+ AV_CODEC_ID_FFV1,
+ AV_CODEC_ID_4XM,
+ AV_CODEC_ID_VCR1,
+ AV_CODEC_ID_CLJR,
+ AV_CODEC_ID_MDEC,
+ AV_CODEC_ID_ROQ,
+ AV_CODEC_ID_INTERPLAY_VIDEO,
+ AV_CODEC_ID_XAN_WC3,
+ AV_CODEC_ID_XAN_WC4,
+ AV_CODEC_ID_RPZA,
+ AV_CODEC_ID_CINEPAK,
+ AV_CODEC_ID_WS_VQA,
+ AV_CODEC_ID_MSRLE,
+ AV_CODEC_ID_MSVIDEO1,
+ AV_CODEC_ID_IDCIN,
+ AV_CODEC_ID_8BPS,
+ AV_CODEC_ID_SMC,
+ AV_CODEC_ID_FLIC,
+ AV_CODEC_ID_TRUEMOTION1,
+ AV_CODEC_ID_VMDVIDEO,
+ AV_CODEC_ID_MSZH,
+ AV_CODEC_ID_ZLIB,
+ AV_CODEC_ID_QTRLE,
+ AV_CODEC_ID_TSCC,
+ AV_CODEC_ID_ULTI,
+ AV_CODEC_ID_QDRAW,
+ AV_CODEC_ID_VIXL,
+ AV_CODEC_ID_QPEG,
+ AV_CODEC_ID_PNG,
+ AV_CODEC_ID_PPM,
+ AV_CODEC_ID_PBM,
+ AV_CODEC_ID_PGM,
+ AV_CODEC_ID_PGMYUV,
+ AV_CODEC_ID_PAM,
+ AV_CODEC_ID_FFVHUFF,
+ AV_CODEC_ID_RV30,
+ AV_CODEC_ID_RV40,
+ AV_CODEC_ID_VC1,
+ AV_CODEC_ID_WMV3,
+ AV_CODEC_ID_LOCO,
+ AV_CODEC_ID_WNV1,
+ AV_CODEC_ID_AASC,
+ AV_CODEC_ID_INDEO2,
+ AV_CODEC_ID_FRAPS,
+ AV_CODEC_ID_TRUEMOTION2,
+ AV_CODEC_ID_BMP,
+ AV_CODEC_ID_CSCD,
+ AV_CODEC_ID_MMVIDEO,
+ AV_CODEC_ID_ZMBV,
+ AV_CODEC_ID_AVS,
+ AV_CODEC_ID_SMACKVIDEO,
+ AV_CODEC_ID_NUV,
+ AV_CODEC_ID_KMVC,
+ AV_CODEC_ID_FLASHSV,
+ AV_CODEC_ID_CAVS,
+ AV_CODEC_ID_JPEG2000,
+ AV_CODEC_ID_VMNC,
+ AV_CODEC_ID_VP5,
+ AV_CODEC_ID_VP6,
+ AV_CODEC_ID_VP6F,
+ AV_CODEC_ID_TARGA,
+ AV_CODEC_ID_DSICINVIDEO,
+ AV_CODEC_ID_TIERTEXSEQVIDEO,
+ AV_CODEC_ID_TIFF,
+ AV_CODEC_ID_GIF,
+ AV_CODEC_ID_DXA,
+ AV_CODEC_ID_DNXHD,
+ AV_CODEC_ID_THP,
+ AV_CODEC_ID_SGI,
+ AV_CODEC_ID_C93,
+ AV_CODEC_ID_BETHSOFTVID,
+ AV_CODEC_ID_PTX,
+ AV_CODEC_ID_TXD,
+ AV_CODEC_ID_VP6A,
+ AV_CODEC_ID_AMV,
+ AV_CODEC_ID_VB,
+ AV_CODEC_ID_PCX,
+ AV_CODEC_ID_SUNRAST,
+ AV_CODEC_ID_INDEO4,
+ AV_CODEC_ID_INDEO5,
+ AV_CODEC_ID_MIMIC,
+ AV_CODEC_ID_RL2,
+ AV_CODEC_ID_ESCAPE124,
+ AV_CODEC_ID_DIRAC,
+ AV_CODEC_ID_BFI,
+ AV_CODEC_ID_CMV,
+ AV_CODEC_ID_MOTIONPIXELS,
+ AV_CODEC_ID_TGV,
+ AV_CODEC_ID_TGQ,
+ AV_CODEC_ID_TQI,
+ AV_CODEC_ID_AURA,
+ AV_CODEC_ID_AURA2,
+ AV_CODEC_ID_V210X,
+ AV_CODEC_ID_TMV,
+ AV_CODEC_ID_V210,
+ AV_CODEC_ID_DPX,
+ AV_CODEC_ID_MAD,
+ AV_CODEC_ID_FRWU,
+ AV_CODEC_ID_FLASHSV2,
+ AV_CODEC_ID_CDGRAPHICS,
+ AV_CODEC_ID_R210,
+ AV_CODEC_ID_ANM,
+ AV_CODEC_ID_BINKVIDEO,
+ AV_CODEC_ID_IFF_ILBM,
+#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM
+ AV_CODEC_ID_KGV1,
+ AV_CODEC_ID_YOP,
+ AV_CODEC_ID_VP8,
+ AV_CODEC_ID_PICTOR,
+ AV_CODEC_ID_ANSI,
+ AV_CODEC_ID_A64_MULTI,
+ AV_CODEC_ID_A64_MULTI5,
+ AV_CODEC_ID_R10K,
+ AV_CODEC_ID_MXPEG,
+ AV_CODEC_ID_LAGARITH,
+ AV_CODEC_ID_PRORES,
+ AV_CODEC_ID_JV,
+ AV_CODEC_ID_DFA,
+ AV_CODEC_ID_WMV3IMAGE,
+ AV_CODEC_ID_VC1IMAGE,
+ AV_CODEC_ID_UTVIDEO,
+ AV_CODEC_ID_BMV_VIDEO,
+ AV_CODEC_ID_VBLE,
+ AV_CODEC_ID_DXTORY,
+ AV_CODEC_ID_V410,
+ AV_CODEC_ID_XWD,
+ AV_CODEC_ID_CDXL,
+ AV_CODEC_ID_XBM,
+ AV_CODEC_ID_ZEROCODEC,
+ AV_CODEC_ID_MSS1,
+ AV_CODEC_ID_MSA1,
+ AV_CODEC_ID_TSCC2,
+ AV_CODEC_ID_MTS2,
+ AV_CODEC_ID_CLLC,
+ AV_CODEC_ID_MSS2,
+ AV_CODEC_ID_VP9,
+ AV_CODEC_ID_AIC,
+ AV_CODEC_ID_ESCAPE130,
+ AV_CODEC_ID_G2M,
+ AV_CODEC_ID_WEBP,
+ AV_CODEC_ID_HNM4_VIDEO,
+ AV_CODEC_ID_HEVC,
+#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
+ AV_CODEC_ID_FIC,
+ AV_CODEC_ID_ALIAS_PIX,
+ AV_CODEC_ID_BRENDER_PIX,
+ AV_CODEC_ID_PAF_VIDEO,
+ AV_CODEC_ID_EXR,
+ AV_CODEC_ID_VP7,
+ AV_CODEC_ID_SANM,
+ AV_CODEC_ID_SGIRLE,
+ AV_CODEC_ID_MVC1,
+ AV_CODEC_ID_MVC2,
+ AV_CODEC_ID_HQX,
+ AV_CODEC_ID_TDSC,
+ AV_CODEC_ID_HQ_HQA,
+ AV_CODEC_ID_HAP,
+ AV_CODEC_ID_DDS,
+ AV_CODEC_ID_DXV,
+ AV_CODEC_ID_SCREENPRESSO,
+ AV_CODEC_ID_RSCC,
+
+ AV_CODEC_ID_Y41P = 0x8000,
+ AV_CODEC_ID_AVRP,
+ AV_CODEC_ID_012V,
+ AV_CODEC_ID_AVUI,
+ AV_CODEC_ID_AYUV,
+ AV_CODEC_ID_TARGA_Y216,
+ AV_CODEC_ID_V308,
+ AV_CODEC_ID_V408,
+ AV_CODEC_ID_YUV4,
+ AV_CODEC_ID_AVRN,
+ AV_CODEC_ID_CPIA,
+ AV_CODEC_ID_XFACE,
+ AV_CODEC_ID_SNOW,
+ AV_CODEC_ID_SMVJPEG,
+ AV_CODEC_ID_APNG,
+ AV_CODEC_ID_DAALA,
+
+ /* various PCM "codecs" */
+ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ AV_CODEC_ID_PCM_S16LE = 0x10000,
+ AV_CODEC_ID_PCM_S16BE,
+ AV_CODEC_ID_PCM_U16LE,
+ AV_CODEC_ID_PCM_U16BE,
+ AV_CODEC_ID_PCM_S8,
+ AV_CODEC_ID_PCM_U8,
+ AV_CODEC_ID_PCM_MULAW,
+ AV_CODEC_ID_PCM_ALAW,
+ AV_CODEC_ID_PCM_S32LE,
+ AV_CODEC_ID_PCM_S32BE,
+ AV_CODEC_ID_PCM_U32LE,
+ AV_CODEC_ID_PCM_U32BE,
+ AV_CODEC_ID_PCM_S24LE,
+ AV_CODEC_ID_PCM_S24BE,
+ AV_CODEC_ID_PCM_U24LE,
+ AV_CODEC_ID_PCM_U24BE,
+ AV_CODEC_ID_PCM_S24DAUD,
+ AV_CODEC_ID_PCM_ZORK,
+ AV_CODEC_ID_PCM_S16LE_PLANAR,
+ AV_CODEC_ID_PCM_DVD,
+ AV_CODEC_ID_PCM_F32BE,
+ AV_CODEC_ID_PCM_F32LE,
+ AV_CODEC_ID_PCM_F64BE,
+ AV_CODEC_ID_PCM_F64LE,
+ AV_CODEC_ID_PCM_BLURAY,
+ AV_CODEC_ID_PCM_LXF,
+ AV_CODEC_ID_S302M,
+ AV_CODEC_ID_PCM_S8_PLANAR,
+ AV_CODEC_ID_PCM_S24LE_PLANAR,
+ AV_CODEC_ID_PCM_S32LE_PLANAR,
+ AV_CODEC_ID_PCM_S16BE_PLANAR,
+ /* new PCM "codecs" should be added right below this line starting with
+ * an explicit value of for example 0x10800
+ */
+
+ /* various ADPCM codecs */
+ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ AV_CODEC_ID_ADPCM_IMA_WAV,
+ AV_CODEC_ID_ADPCM_IMA_DK3,
+ AV_CODEC_ID_ADPCM_IMA_DK4,
+ AV_CODEC_ID_ADPCM_IMA_WS,
+ AV_CODEC_ID_ADPCM_IMA_SMJPEG,
+ AV_CODEC_ID_ADPCM_MS,
+ AV_CODEC_ID_ADPCM_4XM,
+ AV_CODEC_ID_ADPCM_XA,
+ AV_CODEC_ID_ADPCM_ADX,
+ AV_CODEC_ID_ADPCM_EA,
+ AV_CODEC_ID_ADPCM_G726,
+ AV_CODEC_ID_ADPCM_CT,
+ AV_CODEC_ID_ADPCM_SWF,
+ AV_CODEC_ID_ADPCM_YAMAHA,
+ AV_CODEC_ID_ADPCM_SBPRO_4,
+ AV_CODEC_ID_ADPCM_SBPRO_3,
+ AV_CODEC_ID_ADPCM_SBPRO_2,
+ AV_CODEC_ID_ADPCM_THP,
+ AV_CODEC_ID_ADPCM_IMA_AMV,
+ AV_CODEC_ID_ADPCM_EA_R1,
+ AV_CODEC_ID_ADPCM_EA_R3,
+ AV_CODEC_ID_ADPCM_EA_R2,
+ AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
+ AV_CODEC_ID_ADPCM_IMA_EA_EACS,
+ AV_CODEC_ID_ADPCM_EA_XAS,
+ AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
+ AV_CODEC_ID_ADPCM_IMA_ISS,
+ AV_CODEC_ID_ADPCM_G722,
+ AV_CODEC_ID_ADPCM_IMA_APC,
+ AV_CODEC_ID_ADPCM_VIMA,
+#if FF_API_VIMA_DECODER
+ AV_CODEC_ID_VIMA = AV_CODEC_ID_ADPCM_VIMA,
+#endif
+
+ AV_CODEC_ID_ADPCM_AFC = 0x11800,
+ AV_CODEC_ID_ADPCM_IMA_OKI,
+ AV_CODEC_ID_ADPCM_DTK,
+ AV_CODEC_ID_ADPCM_IMA_RAD,
+ AV_CODEC_ID_ADPCM_G726LE,
+ AV_CODEC_ID_ADPCM_THP_LE,
+ AV_CODEC_ID_ADPCM_PSX,
+ AV_CODEC_ID_ADPCM_AICA,
+
+ /* AMR */
+ AV_CODEC_ID_AMR_NB = 0x12000,
+ AV_CODEC_ID_AMR_WB,
+
+ /* RealAudio codecs*/
+ AV_CODEC_ID_RA_144 = 0x13000,
+ AV_CODEC_ID_RA_288,
+
+ /* various DPCM codecs */
+ AV_CODEC_ID_ROQ_DPCM = 0x14000,
+ AV_CODEC_ID_INTERPLAY_DPCM,
+ AV_CODEC_ID_XAN_DPCM,
+ AV_CODEC_ID_SOL_DPCM,
+
+ AV_CODEC_ID_SDX2_DPCM = 0x14800,
+
+ /* audio codecs */
+ AV_CODEC_ID_MP2 = 0x15000,
+ AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+ AV_CODEC_ID_AAC,
+ AV_CODEC_ID_AC3,
+ AV_CODEC_ID_DTS,
+ AV_CODEC_ID_VORBIS,
+ AV_CODEC_ID_DVAUDIO,
+ AV_CODEC_ID_WMAV1,
+ AV_CODEC_ID_WMAV2,
+ AV_CODEC_ID_MACE3,
+ AV_CODEC_ID_MACE6,
+ AV_CODEC_ID_VMDAUDIO,
+ AV_CODEC_ID_FLAC,
+ AV_CODEC_ID_MP3ADU,
+ AV_CODEC_ID_MP3ON4,
+ AV_CODEC_ID_SHORTEN,
+ AV_CODEC_ID_ALAC,
+ AV_CODEC_ID_WESTWOOD_SND1,
+ AV_CODEC_ID_GSM, ///< as in Berlin toast format
+ AV_CODEC_ID_QDM2,
+ AV_CODEC_ID_COOK,
+ AV_CODEC_ID_TRUESPEECH,
+ AV_CODEC_ID_TTA,
+ AV_CODEC_ID_SMACKAUDIO,
+ AV_CODEC_ID_QCELP,
+ AV_CODEC_ID_WAVPACK,
+ AV_CODEC_ID_DSICINAUDIO,
+ AV_CODEC_ID_IMC,
+ AV_CODEC_ID_MUSEPACK7,
+ AV_CODEC_ID_MLP,
+ AV_CODEC_ID_GSM_MS, /* as found in WAV */
+ AV_CODEC_ID_ATRAC3,
+#if FF_API_VOXWARE
+ AV_CODEC_ID_VOXWARE,
+#endif
+ AV_CODEC_ID_APE,
+ AV_CODEC_ID_NELLYMOSER,
+ AV_CODEC_ID_MUSEPACK8,
+ AV_CODEC_ID_SPEEX,
+ AV_CODEC_ID_WMAVOICE,
+ AV_CODEC_ID_WMAPRO,
+ AV_CODEC_ID_WMALOSSLESS,
+ AV_CODEC_ID_ATRAC3P,
+ AV_CODEC_ID_EAC3,
+ AV_CODEC_ID_SIPR,
+ AV_CODEC_ID_MP1,
+ AV_CODEC_ID_TWINVQ,
+ AV_CODEC_ID_TRUEHD,
+ AV_CODEC_ID_MP4ALS,
+ AV_CODEC_ID_ATRAC1,
+ AV_CODEC_ID_BINKAUDIO_RDFT,
+ AV_CODEC_ID_BINKAUDIO_DCT,
+ AV_CODEC_ID_AAC_LATM,
+ AV_CODEC_ID_QDMC,
+ AV_CODEC_ID_CELT,
+ AV_CODEC_ID_G723_1,
+ AV_CODEC_ID_G729,
+ AV_CODEC_ID_8SVX_EXP,
+ AV_CODEC_ID_8SVX_FIB,
+ AV_CODEC_ID_BMV_AUDIO,
+ AV_CODEC_ID_RALF,
+ AV_CODEC_ID_IAC,
+ AV_CODEC_ID_ILBC,
+ AV_CODEC_ID_OPUS,
+ AV_CODEC_ID_COMFORT_NOISE,
+ AV_CODEC_ID_TAK,
+ AV_CODEC_ID_METASOUND,
+ AV_CODEC_ID_PAF_AUDIO,
+ AV_CODEC_ID_ON2AVC,
+ AV_CODEC_ID_DSS_SP,
+
+ AV_CODEC_ID_FFWAVESYNTH = 0x15800,
+ AV_CODEC_ID_SONIC,
+ AV_CODEC_ID_SONIC_LS,
+ AV_CODEC_ID_EVRC,
+ AV_CODEC_ID_SMV,
+ AV_CODEC_ID_DSD_LSBF,
+ AV_CODEC_ID_DSD_MSBF,
+ AV_CODEC_ID_DSD_LSBF_PLANAR,
+ AV_CODEC_ID_DSD_MSBF_PLANAR,
+ AV_CODEC_ID_4GV,
+ AV_CODEC_ID_INTERPLAY_ACM,
+ AV_CODEC_ID_XMA1,
+ AV_CODEC_ID_XMA2,
+
+ /* subtitle codecs */
+ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+ AV_CODEC_ID_DVD_SUBTITLE = 0x17000,
+ AV_CODEC_ID_DVB_SUBTITLE,
+ AV_CODEC_ID_TEXT, ///< raw UTF-8 text
+ AV_CODEC_ID_XSUB,
+ AV_CODEC_ID_SSA,
+ AV_CODEC_ID_MOV_TEXT,
+ AV_CODEC_ID_HDMV_PGS_SUBTITLE,
+ AV_CODEC_ID_DVB_TELETEXT,
+ AV_CODEC_ID_SRT,
+
+ AV_CODEC_ID_MICRODVD = 0x17800,
+ AV_CODEC_ID_EIA_608,
+ AV_CODEC_ID_JACOSUB,
+ AV_CODEC_ID_SAMI,
+ AV_CODEC_ID_REALTEXT,
+ AV_CODEC_ID_STL,
+ AV_CODEC_ID_SUBVIEWER1,
+ AV_CODEC_ID_SUBVIEWER,
+ AV_CODEC_ID_SUBRIP,
+ AV_CODEC_ID_WEBVTT,
+ AV_CODEC_ID_MPL2,
+ AV_CODEC_ID_VPLAYER,
+ AV_CODEC_ID_PJS,
+ AV_CODEC_ID_ASS,
+ AV_CODEC_ID_HDMV_TEXT_SUBTITLE,
+
+ /* other specific kind of codecs (generally used for attachments) */
+ AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
+ AV_CODEC_ID_TTF = 0x18000,
+
+ AV_CODEC_ID_BINTEXT = 0x18800,
+ AV_CODEC_ID_XBIN,
+ AV_CODEC_ID_IDF,
+ AV_CODEC_ID_OTF,
+ AV_CODEC_ID_SMPTE_KLV,
+ AV_CODEC_ID_DVD_NAV,
+ AV_CODEC_ID_TIMED_ID3,
+ AV_CODEC_ID_BIN_DATA,
+
+
+ AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
+
+ AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+ * stream (only used by libavformat) */
+ AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+ * stream (only used by libavformat) */
+ AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
+ AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket
+};
+
+/**
+ * This struct describes the properties of a single codec described by an
+ * AVCodecID.
+ * @see avcodec_descriptor_get()
+ */
+typedef struct AVCodecDescriptor {
+ enum AVCodecID id;
+ enum AVMediaType type;
+ /**
+ * Name of the codec described by this descriptor. It is non-empty and
+ * unique for each codec descriptor. It should contain alphanumeric
+ * characters and '_' only.
+ */
+ const char *name;
+ /**
+ * A more descriptive name for this codec. May be NULL.
+ */
+ const char *long_name;
+ /**
+ * Codec properties, a combination of AV_CODEC_PROP_* flags.
+ */
+ int props;
+ /**
+ * MIME type(s) associated with the codec.
+ * May be NULL; if not, a NULL-terminated array of MIME types.
+ * The first item is always non-NULL and is the preferred MIME type.
+ */
+ const char *const *mime_types;
+ /**
+ * If non-NULL, an array of profiles recognized for this codec.
+ * Terminated with FF_PROFILE_UNKNOWN.
+ */
+ const struct AVProfile *profiles;
+} AVCodecDescriptor;
+
+/**
+ * Codec uses only intra compression.
+ * Video codecs only.
+ */
+#define AV_CODEC_PROP_INTRA_ONLY (1 << 0)
+/**
+ * Codec supports lossy compression. Audio and video codecs only.
+ * @note a codec may support both lossy and lossless
+ * compression modes
+ */
+#define AV_CODEC_PROP_LOSSY (1 << 1)
+/**
+ * Codec supports lossless compression. Audio and video codecs only.
+ */
+#define AV_CODEC_PROP_LOSSLESS (1 << 2)
+/**
+ * Codec supports frame reordering. That is, the coded order (the order in which
+ * the encoded packets are output by the encoders / stored / input to the
+ * decoders) may be different from the presentation order of the corresponding
+ * frames.
+ *
+ * For codecs that do not have this property set, PTS and DTS should always be
+ * equal.
+ */
+#define AV_CODEC_PROP_REORDER (1 << 3)
+/**
+ * Subtitle codec is bitmap based
+ * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field.
+ */
+#define AV_CODEC_PROP_BITMAP_SUB (1 << 16)
+/**
+ * Subtitle codec is text based.
+ * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field.
+ */
+#define AV_CODEC_PROP_TEXT_SUB (1 << 17)
+
+/**
+ * @ingroup lavc_decoding
+ * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
+ * This is mainly needed because some optimized bitstream readers read
+ * 32 or 64 bit at once and could read over the end.<br>
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged
+ * MPEG bitstreams could cause overread and segfault.
+ */
+#define AV_INPUT_BUFFER_PADDING_SIZE 32
+
+/**
+ * @ingroup lavc_encoding
+ * minimum encoding buffer size
+ * Used to avoid some checks during header writing.
+ */
+#define AV_INPUT_BUFFER_MIN_SIZE 16384
+
+#if FF_API_WITHOUT_PREFIX
+/**
+ * @deprecated use AV_INPUT_BUFFER_PADDING_SIZE instead
+ */
+#define FF_INPUT_BUFFER_PADDING_SIZE 32
+
+/**
+ * @deprecated use AV_INPUT_BUFFER_MIN_SIZE instead
+ */
+#define FF_MIN_BUFFER_SIZE 16384
+#endif /* FF_API_WITHOUT_PREFIX */
+
+/**
+ * @ingroup lavc_encoding
+ * motion estimation type.
+ * @deprecated use codec private option instead
+ */
+#if FF_API_MOTION_EST
+enum Motion_Est_ID {
+ ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed
+ ME_FULL,
+ ME_LOG,
+ ME_PHODS,
+ ME_EPZS, ///< enhanced predictive zonal search
+ ME_X1, ///< reserved for experiments
+ ME_HEX, ///< hexagon based search
+ ME_UMH, ///< uneven multi-hexagon search
+ ME_TESA, ///< transformed exhaustive search algorithm
+ ME_ITER=50, ///< iterative search
+};
+#endif
+
+/**
+ * @ingroup lavc_decoding
+ */
+enum AVDiscard{
+ /* We leave some space between them for extensions (drop some
+ * keyframes for intra-only or drop just some bidir frames). */
+ AVDISCARD_NONE =-16, ///< discard nothing
+ AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi
+ AVDISCARD_NONREF = 8, ///< discard all non reference
+ AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
+ AVDISCARD_NONINTRA= 24, ///< discard all non intra frames
+ AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
+ AVDISCARD_ALL = 48, ///< discard all
+};
+
+enum AVAudioServiceType {
+ AV_AUDIO_SERVICE_TYPE_MAIN = 0,
+ AV_AUDIO_SERVICE_TYPE_EFFECTS = 1,
+ AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
+ AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3,
+ AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4,
+ AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5,
+ AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6,
+ AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7,
+ AV_AUDIO_SERVICE_TYPE_KARAOKE = 8,
+ AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI
+};
+
+/**
+ * @ingroup lavc_encoding
+ */
+typedef struct RcOverride{
+ int start_frame;
+ int end_frame;
+ int qscale; // If this is 0 then quality_factor will be used instead.
+ float quality_factor;
+} RcOverride;
+
+#if FF_API_MAX_BFRAMES
+/**
+ * @deprecated there is no libavcodec-wide limit on the number of B-frames
+ */
+#define FF_MAX_B_FRAMES 16
+#endif
+
+/* encoding support
+ These flags can be passed in AVCodecContext.flags before initialization.
+ Note: Not everything is supported yet.
+*/
+
+/**
+ * Allow decoders to produce frames with data planes that are not aligned
+ * to CPU requirements (e.g. due to cropping).
+ */
+#define AV_CODEC_FLAG_UNALIGNED (1 << 0)
+/**
+ * Use fixed qscale.
+ */
+#define AV_CODEC_FLAG_QSCALE (1 << 1)
+/**
+ * 4 MV per MB allowed / advanced prediction for H.263.
+ */
+#define AV_CODEC_FLAG_4MV (1 << 2)
+/**
+ * Output even those frames that might be corrupted.
+ */
+#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3)
+/**
+ * Use qpel MC.
+ */
+#define AV_CODEC_FLAG_QPEL (1 << 4)
+/**
+ * Use internal 2pass ratecontrol in first pass mode.
+ */
+#define AV_CODEC_FLAG_PASS1 (1 << 9)
+/**
+ * Use internal 2pass ratecontrol in second pass mode.
+ */
+#define AV_CODEC_FLAG_PASS2 (1 << 10)
+/**
+ * loop filter.
+ */
+#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11)
+/**
+ * Only decode/encode grayscale.
+ */
+#define AV_CODEC_FLAG_GRAY (1 << 13)
+/**
+ * error[?] variables will be set during encoding.
+ */
+#define AV_CODEC_FLAG_PSNR (1 << 15)
+/**
+ * Input bitstream might be truncated at a random location
+ * instead of only at frame boundaries.
+ */
+#define AV_CODEC_FLAG_TRUNCATED (1 << 16)
+/**
+ * Use interlaced DCT.
+ */
+#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18)
+/**
+ * Force low delay.
+ */
+#define AV_CODEC_FLAG_LOW_DELAY (1 << 19)
+/**
+ * Place global headers in extradata instead of every keyframe.
+ */
+#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
+/**
+ * Use only bitexact stuff (except (I)DCT).
+ */
+#define AV_CODEC_FLAG_BITEXACT (1 << 23)
+/* Fx : Flag for h263+ extra options */
+/**
+ * H.263 advanced intra coding / MPEG-4 AC prediction
+ */
+#define AV_CODEC_FLAG_AC_PRED (1 << 24)
+/**
+ * interlaced motion estimation
+ */
+#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29)
+#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31)
+
+/**
+ * Allow non spec compliant speedup tricks.
+ */
+#define AV_CODEC_FLAG2_FAST (1 << 0)
+/**
+ * Skip bitstream encoding.
+ */
+#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2)
+/**
+ * Place global headers at every keyframe instead of in extradata.
+ */
+#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3)
+
+/**
+ * timecode is in drop frame format. DEPRECATED!!!!
+ */
+#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13)
+
+/**
+ * Input bitstream might be truncated at a packet boundaries
+ * instead of only at frame boundaries.
+ */
+#define AV_CODEC_FLAG2_CHUNKS (1 << 15)
+/**
+ * Discard cropping information from SPS.
+ */
+#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16)
+
+/**
+ * Show all frames before the first keyframe
+ */
+#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22)
+/**
+ * Export motion vectors through frame side data
+ */
+#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28)
+/**
+ * Do not skip samples and export skip information as frame side data
+ */
+#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29)
+
+/* Unsupported options :
+ * Syntax Arithmetic coding (SAC)
+ * Reference Picture Selection
+ * Independent Segment Decoding */
+/* /Fx */
+/* codec capabilities */
+
+/**
+ * Decoder can use draw_horiz_band callback.
+ */
+#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0)
+/**
+ * Codec uses get_buffer() for allocating buffers and supports custom allocators.
+ * If not set, it might not use get_buffer() at all or use operations that
+ * assume the buffer was allocated by avcodec_default_get_buffer.
+ */
+#define AV_CODEC_CAP_DR1 (1 << 1)
+#define AV_CODEC_CAP_TRUNCATED (1 << 3)
+/**
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+ *
+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
+ * with NULL data. The user can still send NULL data to the public encode
+ * or decode function, but libavcodec will not pass it along to the codec
+ * unless this flag is set.
+ *
+ * Decoders:
+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
+ * returns frames.
+ *
+ * Encoders:
+ * The encoder needs to be fed with NULL data at the end of encoding until the
+ * encoder no longer returns data.
+ *
+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
+ * flag also means that the encoder must set the pts and duration for
+ * each output packet. If this flag is not set, the pts and duration will
+ * be determined by libavcodec from the input frame.
+ */
+#define AV_CODEC_CAP_DELAY (1 << 5)
+/**
+ * Codec can be fed a final frame with a smaller size.
+ * This can be used to prevent truncation of the last audio samples.
+ */
+#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6)
+
+#if FF_API_CAP_VDPAU
+/**
+ * Codec can export data for HW decoding (VDPAU).
+ */
+#define AV_CODEC_CAP_HWACCEL_VDPAU (1 << 7)
+#endif
+
+/**
+ * Codec can output multiple frames per AVPacket
+ * Normally demuxers return one frame at a time, demuxers which do not do
+ * are connected to a parser to split what they return into proper frames.
+ * This flag is reserved to the very rare category of codecs which have a
+ * bitstream that cannot be split into frames without timeconsuming
+ * operations like full decoding. Demuxers carring such bitstreams thus
+ * may return multiple frames in a packet. This has many disadvantages like
+ * prohibiting stream copy in many cases thus it should only be considered
+ * as a last resort.
+ */
+#define AV_CODEC_CAP_SUBFRAMES (1 << 8)
+/**
+ * Codec is experimental and is thus avoided in favor of non experimental
+ * encoders
+ */
+#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9)
+/**
+ * Codec should fill in channel configuration and samplerate instead of container
+ */
+#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10)
+/**
+ * Codec supports frame-level multithreading.
+ */
+#define AV_CODEC_CAP_FRAME_THREADS (1 << 12)
+/**
+ * Codec supports slice-based (or partition-based) multithreading.
+ */
+#define AV_CODEC_CAP_SLICE_THREADS (1 << 13)
+/**
+ * Codec supports changed parameters at any point.
+ */
+#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14)
+/**
+ * Codec supports avctx->thread_count == 0 (auto).
+ */
+#define AV_CODEC_CAP_AUTO_THREADS (1 << 15)
+/**
+ * Audio encoder supports receiving a different number of samples in each call.
+ */
+#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16)
+/**
+ * Codec is intra only.
+ */
+#define AV_CODEC_CAP_INTRA_ONLY 0x40000000
+/**
+ * Codec is lossless.
+ */
+#define AV_CODEC_CAP_LOSSLESS 0x80000000
+
+
+#if FF_API_WITHOUT_PREFIX
+/**
+ * Allow decoders to produce frames with data planes that are not aligned
+ * to CPU requirements (e.g. due to cropping).
+ */
+#define CODEC_FLAG_UNALIGNED AV_CODEC_FLAG_UNALIGNED
+#define CODEC_FLAG_QSCALE AV_CODEC_FLAG_QSCALE
+#define CODEC_FLAG_4MV AV_CODEC_FLAG_4MV
+#define CODEC_FLAG_OUTPUT_CORRUPT AV_CODEC_FLAG_OUTPUT_CORRUPT
+#define CODEC_FLAG_QPEL AV_CODEC_FLAG_QPEL
+#if FF_API_GMC
+/**
+ * @deprecated use the "gmc" private option of the libxvid encoder
+ */
+#define CODEC_FLAG_GMC 0x0020 ///< Use GMC.
+#endif
+#if FF_API_MV0
+/**
+ * @deprecated use the flag "mv0" in the "mpv_flags" private option of the
+ * mpegvideo encoders
+ */
+#define CODEC_FLAG_MV0 0x0040
+#endif
+#if FF_API_INPUT_PRESERVED
+/**
+ * @deprecated passing reference-counted frames to the encoders replaces this
+ * flag
+ */
+#define CODEC_FLAG_INPUT_PRESERVED 0x0100
+#endif
+#define CODEC_FLAG_PASS1 AV_CODEC_FLAG_PASS1
+#define CODEC_FLAG_PASS2 AV_CODEC_FLAG_PASS2
+#define CODEC_FLAG_GRAY AV_CODEC_FLAG_GRAY
+#if FF_API_EMU_EDGE
+/**
+ * @deprecated edges are not used/required anymore. I.e. this flag is now always
+ * set.
+ */
+#define CODEC_FLAG_EMU_EDGE 0x4000
+#endif
+#define CODEC_FLAG_PSNR AV_CODEC_FLAG_PSNR
+#define CODEC_FLAG_TRUNCATED AV_CODEC_FLAG_TRUNCATED
+
+#if FF_API_NORMALIZE_AQP
+/**
+ * @deprecated use the flag "naq" in the "mpv_flags" private option of the
+ * mpegvideo encoders
+ */
+#define CODEC_FLAG_NORMALIZE_AQP 0x00020000
+#endif
+#define CODEC_FLAG_INTERLACED_DCT AV_CODEC_FLAG_INTERLACED_DCT
+#define CODEC_FLAG_LOW_DELAY AV_CODEC_FLAG_LOW_DELAY
+#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
+#define CODEC_FLAG_BITEXACT AV_CODEC_FLAG_BITEXACT
+#define CODEC_FLAG_AC_PRED AV_CODEC_FLAG_AC_PRED
+#define CODEC_FLAG_LOOP_FILTER AV_CODEC_FLAG_LOOP_FILTER
+#define CODEC_FLAG_INTERLACED_ME AV_CODEC_FLAG_INTERLACED_ME
+#define CODEC_FLAG_CLOSED_GOP AV_CODEC_FLAG_CLOSED_GOP
+#define CODEC_FLAG2_FAST AV_CODEC_FLAG2_FAST
+#define CODEC_FLAG2_NO_OUTPUT AV_CODEC_FLAG2_NO_OUTPUT
+#define CODEC_FLAG2_LOCAL_HEADER AV_CODEC_FLAG2_LOCAL_HEADER
+#define CODEC_FLAG2_DROP_FRAME_TIMECODE AV_CODEC_FLAG2_DROP_FRAME_TIMECODE
+#define CODEC_FLAG2_IGNORE_CROP AV_CODEC_FLAG2_IGNORE_CROP
+
+#define CODEC_FLAG2_CHUNKS AV_CODEC_FLAG2_CHUNKS
+#define CODEC_FLAG2_SHOW_ALL AV_CODEC_FLAG2_SHOW_ALL
+#define CODEC_FLAG2_EXPORT_MVS AV_CODEC_FLAG2_EXPORT_MVS
+#define CODEC_FLAG2_SKIP_MANUAL AV_CODEC_FLAG2_SKIP_MANUAL
+
+/* Unsupported options :
+ * Syntax Arithmetic coding (SAC)
+ * Reference Picture Selection
+ * Independent Segment Decoding */
+/* /Fx */
+/* codec capabilities */
+
+#define CODEC_CAP_DRAW_HORIZ_BAND AV_CODEC_CAP_DRAW_HORIZ_BAND ///< Decoder can use draw_horiz_band callback.
+/**
+ * Codec uses get_buffer() for allocating buffers and supports custom allocators.
+ * If not set, it might not use get_buffer() at all or use operations that
+ * assume the buffer was allocated by avcodec_default_get_buffer.
+ */
+#define CODEC_CAP_DR1 AV_CODEC_CAP_DR1
+#define CODEC_CAP_TRUNCATED AV_CODEC_CAP_TRUNCATED
+#if FF_API_XVMC
+/* Codec can export data for HW decoding. This flag indicates that
+ * the codec would call get_format() with list that might contain HW accelerated
+ * pixel formats (XvMC, VDPAU, VAAPI, etc). The application can pick any of them
+ * including raw image format.
+ * The application can use the passed context to determine bitstream version,
+ * chroma format, resolution etc.
+ */
+#define CODEC_CAP_HWACCEL 0x0010
+#endif /* FF_API_XVMC */
+/**
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+ *
+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
+ * with NULL data. The user can still send NULL data to the public encode
+ * or decode function, but libavcodec will not pass it along to the codec
+ * unless this flag is set.
+ *
+ * Decoders:
+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
+ * returns frames.
+ *
+ * Encoders:
+ * The encoder needs to be fed with NULL data at the end of encoding until the
+ * encoder no longer returns data.
+ *
+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
+ * flag also means that the encoder must set the pts and duration for
+ * each output packet. If this flag is not set, the pts and duration will
+ * be determined by libavcodec from the input frame.
+ */
+#define CODEC_CAP_DELAY AV_CODEC_CAP_DELAY
+/**
+ * Codec can be fed a final frame with a smaller size.
+ * This can be used to prevent truncation of the last audio samples.
+ */
+#define CODEC_CAP_SMALL_LAST_FRAME AV_CODEC_CAP_SMALL_LAST_FRAME
+#if FF_API_CAP_VDPAU
+/**
+ * Codec can export data for HW decoding (VDPAU).
+ */
+#define CODEC_CAP_HWACCEL_VDPAU AV_CODEC_CAP_HWACCEL_VDPAU
+#endif
+/**
+ * Codec can output multiple frames per AVPacket
+ * Normally demuxers return one frame at a time, demuxers which do not do
+ * are connected to a parser to split what they return into proper frames.
+ * This flag is reserved to the very rare category of codecs which have a
+ * bitstream that cannot be split into frames without timeconsuming
+ * operations like full decoding. Demuxers carring such bitstreams thus
+ * may return multiple frames in a packet. This has many disadvantages like
+ * prohibiting stream copy in many cases thus it should only be considered
+ * as a last resort.
+ */
+#define CODEC_CAP_SUBFRAMES AV_CODEC_CAP_SUBFRAMES
+/**
+ * Codec is experimental and is thus avoided in favor of non experimental
+ * encoders
+ */
+#define CODEC_CAP_EXPERIMENTAL AV_CODEC_CAP_EXPERIMENTAL
+/**
+ * Codec should fill in channel configuration and samplerate instead of container
+ */
+#define CODEC_CAP_CHANNEL_CONF AV_CODEC_CAP_CHANNEL_CONF
+#if FF_API_NEG_LINESIZES
+/**
+ * @deprecated no codecs use this capability
+ */
+#define CODEC_CAP_NEG_LINESIZES 0x0800
+#endif
+/**
+ * Codec supports frame-level multithreading.
+ */
+#define CODEC_CAP_FRAME_THREADS AV_CODEC_CAP_FRAME_THREADS
+/**
+ * Codec supports slice-based (or partition-based) multithreading.
+ */
+#define CODEC_CAP_SLICE_THREADS AV_CODEC_CAP_SLICE_THREADS
+/**
+ * Codec supports changed parameters at any point.
+ */
+#define CODEC_CAP_PARAM_CHANGE AV_CODEC_CAP_PARAM_CHANGE
+/**
+ * Codec supports avctx->thread_count == 0 (auto).
+ */
+#define CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_AUTO_THREADS
+/**
+ * Audio encoder supports receiving a different number of samples in each call.
+ */
+#define CODEC_CAP_VARIABLE_FRAME_SIZE AV_CODEC_CAP_VARIABLE_FRAME_SIZE
+/**
+ * Codec is intra only.
+ */
+#define CODEC_CAP_INTRA_ONLY AV_CODEC_CAP_INTRA_ONLY
+/**
+ * Codec is lossless.
+ */
+#define CODEC_CAP_LOSSLESS AV_CODEC_CAP_LOSSLESS
+
+/**
+ * HWAccel is experimental and is thus avoided in favor of non experimental
+ * codecs
+ */
+#define HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200
+#endif /* FF_API_WITHOUT_PREFIX */
+
+#if FF_API_MB_TYPE
+//The following defines may change, don't expect compatibility if you use them.
+#define MB_TYPE_INTRA4x4 0x0001
+#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific
+#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific
+#define MB_TYPE_16x16 0x0008
+#define MB_TYPE_16x8 0x0010
+#define MB_TYPE_8x16 0x0020
+#define MB_TYPE_8x8 0x0040
+#define MB_TYPE_INTERLACED 0x0080
+#define MB_TYPE_DIRECT2 0x0100 //FIXME
+#define MB_TYPE_ACPRED 0x0200
+#define MB_TYPE_GMC 0x0400
+#define MB_TYPE_SKIP 0x0800
+#define MB_TYPE_P0L0 0x1000
+#define MB_TYPE_P1L0 0x2000
+#define MB_TYPE_P0L1 0x4000
+#define MB_TYPE_P1L1 0x8000
+#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0)
+#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1)
+#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1)
+#define MB_TYPE_QUANT 0x00010000
+#define MB_TYPE_CBP 0x00020000
+//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...)
+#endif
+
+/**
+ * Pan Scan area.
+ * This specifies the area which should be displayed.
+ * Note there may be multiple such areas for one frame.
+ */
+typedef struct AVPanScan{
+ /**
+ * id
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int id;
+
+ /**
+ * width and height in 1/16 pel
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int width;
+ int height;
+
+ /**
+ * position of the top left corner in 1/16 pel for up to 3 fields/frames
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t position[3][2];
+}AVPanScan;
+
+/**
+ * This structure describes the bitrate properties of an encoded bitstream. It
+ * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD
+ * parameters for H.264/HEVC.
+ */
+typedef struct AVCPBProperties {
+ /**
+ * Maximum bitrate of the stream, in bits per second.
+ * Zero if unknown or unspecified.
+ */
+ int max_bitrate;
+ /**
+ * Minimum bitrate of the stream, in bits per second.
+ * Zero if unknown or unspecified.
+ */
+ int min_bitrate;
+ /**
+ * Average bitrate of the stream, in bits per second.
+ * Zero if unknown or unspecified.
+ */
+ int avg_bitrate;
+
+ /**
+ * The size of the buffer to which the ratecontrol is applied, in bits.
+ * Zero if unknown or unspecified.
+ */
+ int buffer_size;
+
+ /**
+ * The delay between the time the packet this structure is associated with
+ * is received and the time when it should be decoded, in periods of a 27MHz
+ * clock.
+ *
+ * UINT64_MAX when unknown or unspecified.
+ */
+ uint64_t vbv_delay;
+} AVCPBProperties;
+
+#if FF_API_QSCALE_TYPE
+#define FF_QSCALE_TYPE_MPEG1 0
+#define FF_QSCALE_TYPE_MPEG2 1
+#define FF_QSCALE_TYPE_H264 2
+#define FF_QSCALE_TYPE_VP56 3
+#endif
+
+/**
+ * The decoder will keep a reference to the frame and may reuse it later.
+ */
+#define AV_GET_BUFFER_FLAG_REF (1 << 0)
+
+/**
+ * @defgroup lavc_packet AVPacket
+ *
+ * Types and functions for working with AVPacket.
+ * @{
+ */
+enum AVPacketSideDataType {
+ AV_PKT_DATA_PALETTE,
+ AV_PKT_DATA_NEW_EXTRADATA,
+
+ /**
+ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+ * @code
+ * u32le param_flags
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+ * s32le channel_count
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+ * u64le channel_layout
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+ * s32le sample_rate
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+ * s32le width
+ * s32le height
+ * @endcode
+ */
+ AV_PKT_DATA_PARAM_CHANGE,
+
+ /**
+ * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
+ * structures with info about macroblocks relevant to splitting the
+ * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
+ * That is, it does not necessarily contain info about all macroblocks,
+ * as long as the distance between macroblocks in the info is smaller
+ * than the target payload size.
+ * Each MB info structure is 12 bytes, and is laid out as follows:
+ * @code
+ * u32le bit offset from the start of the packet
+ * u8 current quantizer at the start of the macroblock
+ * u8 GOB number
+ * u16le macroblock address within the GOB
+ * u8 horizontal MV predictor
+ * u8 vertical MV predictor
+ * u8 horizontal MV predictor for block number 3
+ * u8 vertical MV predictor for block number 3
+ * @endcode
+ */
+ AV_PKT_DATA_H263_MB_INFO,
+
+ /**
+ * This side data should be associated with an audio stream and contains
+ * ReplayGain information in form of the AVReplayGain struct.
+ */
+ AV_PKT_DATA_REPLAYGAIN,
+
+ /**
+ * This side data contains a 3x3 transformation matrix describing an affine
+ * transformation that needs to be applied to the decoded video frames for
+ * correct presentation.
+ *
+ * See libavutil/display.h for a detailed description of the data.
+ */
+ AV_PKT_DATA_DISPLAYMATRIX,
+
+ /**
+ * This side data should be associated with a video stream and contains
+ * Stereoscopic 3D information in form of the AVStereo3D struct.
+ */
+ AV_PKT_DATA_STEREO3D,
+
+ /**
+ * This side data should be associated with an audio stream and corresponds
+ * to enum AVAudioServiceType.
+ */
+ AV_PKT_DATA_AUDIO_SERVICE_TYPE,
+
+ /**
+ * This side data contains quality related information from the encoder.
+ * @code
+ * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad).
+ * u8 picture type
+ * u8 error count
+ * u16 reserved
+ * u64le[error count] sum of squared differences between encoder in and output
+ * @endcode
+ */
+ AV_PKT_DATA_QUALITY_STATS,
+
+ /**
+ * This side data contains an integer value representing the stream index
+ * of a "fallback" track. A fallback track indicates an alternate
+ * track to use when the current track can not be decoded for some reason.
+ * e.g. no decoder available for codec.
+ */
+ AV_PKT_DATA_FALLBACK_TRACK,
+
+ /**
+ * This side data corresponds to the AVCPBProperties struct.
+ */
+ AV_PKT_DATA_CPB_PROPERTIES,
+
+ /**
+ * Recommmends skipping the specified number of samples
+ * @code
+ * u32le number of samples to skip from start of this packet
+ * u32le number of samples to skip from end of this packet
+ * u8 reason for start skip
+ * u8 reason for end skip (0=padding silence, 1=convergence)
+ * @endcode
+ */
+ AV_PKT_DATA_SKIP_SAMPLES=70,
+
+ /**
+ * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that
+ * the packet may contain "dual mono" audio specific to Japanese DTV
+ * and if it is true, recommends only the selected channel to be used.
+ * @code
+ * u8 selected channels (0=mail/left, 1=sub/right, 2=both)
+ * @endcode
+ */
+ AV_PKT_DATA_JP_DUALMONO,
+
+ /**
+ * A list of zero terminated key/value strings. There is no end marker for
+ * the list, so it is required to rely on the side data size to stop.
+ */
+ AV_PKT_DATA_STRINGS_METADATA,
+
+ /**
+ * Subtitle event position
+ * @code
+ * u32le x1
+ * u32le y1
+ * u32le x2
+ * u32le y2
+ * @endcode
+ */
+ AV_PKT_DATA_SUBTITLE_POSITION,
+
+ /**
+ * Data found in BlockAdditional element of matroska container. There is
+ * no end marker for the data, so it is required to rely on the side data
+ * size to recognize the end. 8 byte id (as found in BlockAddId) followed
+ * by data.
+ */
+ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
+
+ /**
+ * The optional first identifier line of a WebVTT cue.
+ */
+ AV_PKT_DATA_WEBVTT_IDENTIFIER,
+
+ /**
+ * The optional settings (rendering instructions) that immediately
+ * follow the timestamp specifier of a WebVTT cue.
+ */
+ AV_PKT_DATA_WEBVTT_SETTINGS,
+
+ /**
+ * A list of zero terminated key/value strings. There is no end marker for
+ * the list, so it is required to rely on the side data size to stop. This
+ * side data includes updated metadata which appeared in the stream.
+ */
+ AV_PKT_DATA_METADATA_UPDATE,
+};
+
+#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
+
+typedef struct AVPacketSideData {
+ uint8_t *data;
+ int size;
+ enum AVPacketSideDataType type;
+} AVPacketSideData;
+
+/**
+ * This structure stores compressed data. It is typically exported by demuxers
+ * and then passed as input to decoders, or received as output from encoders and
+ * then passed to muxers.
+ *
+ * For video, it should typically contain one compressed frame. For audio it may
+ * contain several compressed frames. Encoders are allowed to output empty
+ * packets, with no compressed data, containing only side data
+ * (e.g. to update some stream parameters at the end of encoding).
+ *
+ * AVPacket is one of the few structs in FFmpeg, whose size is a part of public
+ * ABI. Thus it may be allocated on stack and no new fields can be added to it
+ * without libavcodec and libavformat major bump.
+ *
+ * The semantics of data ownership depends on the buf field.
+ * If it is set, the packet data is dynamically allocated and is
+ * valid indefinitely until a call to av_packet_unref() reduces the
+ * reference count to 0.
+ *
+ * If the buf field is not set av_packet_ref() would make a copy instead
+ * of increasing the reference count.
+ *
+ * The side data is always allocated with av_malloc(), copied by
+ * av_packet_ref() and freed by av_packet_unref().
+ *
+ * @see av_packet_ref
+ * @see av_packet_unref
+ */
+typedef struct AVPacket {
+ /**
+ * A reference to the reference-counted buffer where the packet data is
+ * stored.
+ * May be NULL, then the packet data is not reference-counted.
+ */
+ AVBufferRef *buf;
+ /**
+ * Presentation timestamp in AVStream->time_base units; the time at which
+ * the decompressed packet will be presented to the user.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ * pts MUST be larger or equal to dts as presentation cannot happen before
+ * decompression, unless one wants to view hex dumps. Some formats misuse
+ * the terms dts and pts/cts to mean something different. Such timestamps
+ * must be converted to true pts/dts before they are stored in AVPacket.
+ */
+ int64_t pts;
+ /**
+ * Decompression timestamp in AVStream->time_base units; the time at which
+ * the packet is decompressed.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ */
+ int64_t dts;
+ uint8_t *data;
+ int size;
+ int stream_index;
+ /**
+ * A combination of AV_PKT_FLAG values
+ */
+ int flags;
+ /**
+ * Additional packet data that can be provided by the container.
+ * Packet can contain several types of side information.
+ */
+ AVPacketSideData *side_data;
+ int side_data_elems;
+
+ /**
+ * Duration of this packet in AVStream->time_base units, 0 if unknown.
+ * Equals next_pts - this_pts in presentation order.
+ */
+ int64_t duration;
+
+ int64_t pos; ///< byte position in stream, -1 if unknown
+
+#if FF_API_CONVERGENCE_DURATION
+ /**
+ * @deprecated Same as the duration field, but as int64_t. This was required
+ * for Matroska subtitles, whose duration values could overflow when the
+ * duration field was still an int.
+ */
+ attribute_deprecated
+ int64_t convergence_duration;
+#endif
+} AVPacket;
+#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe
+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
+
+enum AVSideDataParamChangeFlags {
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001,
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004,
+ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008,
+};
+/**
+ * @}
+ */
+
+struct AVCodecInternal;
+
+enum AVFieldOrder {
+ AV_FIELD_UNKNOWN,
+ AV_FIELD_PROGRESSIVE,
+ AV_FIELD_TT, //< Top coded_first, top displayed first
+ AV_FIELD_BB, //< Bottom coded first, bottom displayed first
+ AV_FIELD_TB, //< Top coded first, bottom displayed first
+ AV_FIELD_BT, //< Bottom coded first, top displayed first
+};
+
+/**
+ * main external API structure.
+ * New fields can be added to the end with minor version bumps.
+ * Removal, reordering and changes to existing fields require a major
+ * version bump.
+ * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user
+ * applications.
+ * sizeof(AVCodecContext) must not be used outside libav*.
+ */
+typedef struct AVCodecContext {
+ /**
+ * information on struct for av_log
+ * - set by avcodec_alloc_context3
+ */
+ const AVClass *av_class;
+ int log_level_offset;
+
+ enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
+ const struct AVCodec *codec;
+#if FF_API_CODEC_NAME
+ /**
+ * @deprecated this field is not used for anything in libavcodec
+ */
+ attribute_deprecated
+ char codec_name[32];
+#endif
+ enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
+
+ /**
+ * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * A demuxer should set this to what is stored in the field used to identify the codec.
+ * If there are multiple such fields in a container then the demuxer should choose the one
+ * which maximizes the information about the used codec.
+ * If the codec tag field in a container is larger than 32 bits then the demuxer should
+ * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
+ * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
+ * first.
+ * - encoding: Set by user, if not then the default based on codec_id will be used.
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int codec_tag;
+
+#if FF_API_STREAM_CODEC_TAG
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated
+ unsigned int stream_codec_tag;
+#endif
+
+ void *priv_data;
+
+ /**
+ * Private context used for internal data.
+ *
+ * Unlike priv_data, this is not codec-specific. It is used in general
+ * libavcodec functions.
+ */
+ struct AVCodecInternal *internal;
+
+ /**
+ * Private data of the user, can be used to carry app specific stuff.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ /**
+ * the average bitrate
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: Set by user, may be overwritten by libavcodec
+ * if this info is available in the stream
+ */
+ int64_t bit_rate;
+
+ /**
+ * number of bits the bitstream is allowed to diverge from the reference.
+ * the reference can be CBR (for CBR pass1) or VBR (for pass2)
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: unused
+ */
+ int bit_rate_tolerance;
+
+ /**
+ * Global quality for codecs which cannot change it per frame.
+ * This should be proportional to MPEG-1/2/4 qscale.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int global_quality;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int compression_level;
+#define FF_COMPRESSION_DEFAULT -1
+
+ /**
+ * AV_CODEC_FLAG_*.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags;
+
+ /**
+ * AV_CODEC_FLAG2_*
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags2;
+
+ /**
+ * some codecs need / can use extradata like Huffman tables.
+ * mjpeg: Huffman tables
+ * rv10: additional flags
+ * mpeg4: global headers (they can be in the bitstream or here)
+ * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger
+ * than extradata_size to avoid problems if it is read with the bitstream reader.
+ * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
+ * - encoding: Set/allocated/freed by libavcodec.
+ * - decoding: Set/allocated/freed by user.
+ */
+ uint8_t *extradata;
+ int extradata_size;
+
+ /**
+ * This is the fundamental unit of time (in seconds) in terms
+ * of which frame timestamps are represented. For fixed-fps content,
+ * timebase should be 1/framerate and timestamp increments should be
+ * identically 1.
+ * This often, but not always is the inverse of the frame rate or field rate
+ * for video.
+ * - encoding: MUST be set by user.
+ * - decoding: the use of this field for decoding is deprecated.
+ * Use framerate instead.
+ */
+ AVRational time_base;
+
+ /**
+ * For some codecs, the time base is closer to the field rate than the frame rate.
+ * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
+ * if no telecine is used ...
+ *
+ * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
+ */
+ int ticks_per_frame;
+
+ /**
+ * Codec delay.
+ *
+ * Encoding: Number of frames delay there will be from the encoder input to
+ * the decoder output. (we assume the decoder matches the spec)
+ * Decoding: Number of frames delay in addition to what a standard decoder
+ * as specified in the spec would produce.
+ *
+ * Video:
+ * Number of frames the decoded output will be delayed relative to the
+ * encoded input.
+ *
+ * Audio:
+ * For encoding, this field is unused (see initial_padding).
+ *
+ * For decoding, this is the number of samples the decoder needs to
+ * output before the decoder's output is valid. When seeking, you should
+ * start decoding this many samples prior to your desired seek point.
+ *
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int delay;
+
+
+ /* video only */
+ /**
+ * picture width / height.
+ *
+ * @note Those fields may not match the values of the last
+ * AVFrame outputted by avcodec_decode_video2 due frame
+ * reordering.
+ *
+ * - encoding: MUST be set by user.
+ * - decoding: May be set by the user before opening the decoder if known e.g.
+ * from the container. Some decoders will require the dimensions
+ * to be set by the caller. During decoding, the decoder may
+ * overwrite those values as required while parsing the data.
+ */
+ int width, height;
+
+ /**
+ * Bitstream width / height, may be different from width/height e.g. when
+ * the decoded frame is cropped before being output or lowres is enabled.
+ *
+ * @note Those field may not match the value of the last
+ * AVFrame outputted by avcodec_decode_video2 due frame
+ * reordering.
+ *
+ * - encoding: unused
+ * - decoding: May be set by the user before opening the decoder if known
+ * e.g. from the container. During decoding, the decoder may
+ * overwrite those values as required while parsing the data.
+ */
+ int coded_width, coded_height;
+
+#if FF_API_ASPECT_EXTENDED
+#define FF_ASPECT_EXTENDED 15
+#endif
+
+ /**
+ * the number of pictures in a group of pictures, or 0 for intra_only
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int gop_size;
+
+ /**
+ * Pixel format, see AV_PIX_FMT_xxx.
+ * May be set by the demuxer if known from headers.
+ * May be overridden by the decoder if it knows better.
+ *
+ * @note This field may not match the value of the last
+ * AVFrame outputted by avcodec_decode_video2 due frame
+ * reordering.
+ *
+ * - encoding: Set by user.
+ * - decoding: Set by user if known, overridden by libavcodec while
+ * parsing the data.
+ */
+ enum AVPixelFormat pix_fmt;
+
+#if FF_API_MOTION_EST
+ /**
+ * This option does nothing
+ * @deprecated use codec private options instead
+ */
+ attribute_deprecated int me_method;
+#endif
+
+ /**
+ * If non NULL, 'draw_horiz_band' is called by the libavcodec
+ * decoder to draw a horizontal band. It improves cache usage. Not
+ * all codecs can do that. You must check the codec capabilities
+ * beforehand.
+ * When multithreading is used, it may be called from multiple threads
+ * at the same time; threads might draw different parts of the same AVFrame,
+ * or multiple AVFrames, and there is no guarantee that slices will be drawn
+ * in order.
+ * The function is also used by hardware acceleration APIs.
+ * It is called at least once during frame decoding to pass
+ * the data needed for hardware render.
+ * In that mode instead of pixel data, AVFrame points to
+ * a structure specific to the acceleration API. The application
+ * reads the structure and can change some fields to indicate progress
+ * or mark state.
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @param height the height of the slice
+ * @param y the y position of the slice
+ * @param type 1->top field, 2->bottom field, 3->frame
+ * @param offset offset into the AVFrame.data from which the slice should be read
+ */
+ void (*draw_horiz_band)(struct AVCodecContext *s,
+ const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
+ int y, int type, int height);
+
+ /**
+ * callback to negotiate the pixelFormat
+ * @param fmt is the list of formats which are supported by the codec,
+ * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
+ * The first is always the native one.
+ * @note The callback may be called again immediately if initialization for
+ * the selected (hardware-accelerated) pixel format failed.
+ * @warning Behavior is undefined if the callback returns a value not
+ * in the fmt list of formats.
+ * @return the chosen format
+ * - encoding: unused
+ * - decoding: Set by user, if not set the native format will be chosen.
+ */
+ enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
+
+ /**
+ * maximum number of B-frames between non-B-frames
+ * Note: The output will be delayed by max_b_frames+1 relative to the input.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_b_frames;
+
+ /**
+ * qscale factor between IP and B-frames
+ * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_factor;
+
+#if FF_API_RC_STRATEGY
+ /** @deprecated use codec private option instead */
+ attribute_deprecated int rc_strategy;
+#define FF_RC_STRATEGY_XVID 1
+#endif
+
+ int b_frame_strategy;
+
+ /**
+ * qscale offset between IP and B-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_offset;
+
+ /**
+ * Size of the frame reordering buffer in the decoder.
+ * For MPEG-2 it is 1 IPB or 0 low delay IP.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int has_b_frames;
+
+ /**
+ * 0-> h263 quant 1-> mpeg quant
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mpeg_quant;
+
+ /**
+ * qscale factor between P and I-frames
+ * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_factor;
+
+ /**
+ * qscale offset between P and I-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_offset;
+
+ /**
+ * luminance masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float lumi_masking;
+
+ /**
+ * temporary complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float temporal_cplx_masking;
+
+ /**
+ * spatial complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float spatial_cplx_masking;
+
+ /**
+ * p block masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float p_masking;
+
+ /**
+ * darkness masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float dark_masking;
+
+ /**
+ * slice count
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user (or 0).
+ */
+ int slice_count;
+ /**
+ * prediction method (needed for huffyuv)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int prediction_method;
+#define FF_PRED_LEFT 0
+#define FF_PRED_PLANE 1
+#define FF_PRED_MEDIAN 2
+
+ /**
+ * slice offsets in the frame in bytes
+ * - encoding: Set/allocated by libavcodec.
+ * - decoding: Set/allocated by user (or NULL).
+ */
+ int *slice_offset;
+
+ /**
+ * sample aspect ratio (0 if unknown)
+ * That is the width of a pixel divided by the height of the pixel.
+ * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_cmp;
+ /**
+ * subpixel motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_sub_cmp;
+ /**
+ * macroblock comparison function (not supported yet)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_cmp;
+ /**
+ * interlaced DCT comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int ildct_cmp;
+#define FF_CMP_SAD 0
+#define FF_CMP_SSE 1
+#define FF_CMP_SATD 2
+#define FF_CMP_DCT 3
+#define FF_CMP_PSNR 4
+#define FF_CMP_BIT 5
+#define FF_CMP_RD 6
+#define FF_CMP_ZERO 7
+#define FF_CMP_VSAD 8
+#define FF_CMP_VSSE 9
+#define FF_CMP_NSSE 10
+#define FF_CMP_W53 11
+#define FF_CMP_W97 12
+#define FF_CMP_DCTMAX 13
+#define FF_CMP_DCT264 14
+#define FF_CMP_CHROMA 256
+
+ /**
+ * ME diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dia_size;
+
+ /**
+ * amount of previous MV predictors (2a+1 x 2a+1 square)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int last_predictor_count;
+
+ /**
+ * prepass for motion estimation
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_me;
+
+ /**
+ * motion estimation prepass comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_pre_cmp;
+
+ /**
+ * ME prepass diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_dia_size;
+
+ /**
+ * subpel ME quality
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_subpel_quality;
+
+#if FF_API_AFD
+ /**
+ * DTG active format information (additional aspect ratio
+ * information only used in DVB MPEG-2 transport streams)
+ * 0 if not set.
+ *
+ * - encoding: unused
+ * - decoding: Set by decoder.
+ * @deprecated Deprecated in favor of AVSideData
+ */
+ attribute_deprecated int dtg_active_format;
+#define FF_DTG_AFD_SAME 8
+#define FF_DTG_AFD_4_3 9
+#define FF_DTG_AFD_16_9 10
+#define FF_DTG_AFD_14_9 11
+#define FF_DTG_AFD_4_3_SP_14_9 13
+#define FF_DTG_AFD_16_9_SP_14_9 14
+#define FF_DTG_AFD_SP_4_3 15
+#endif /* FF_API_AFD */
+
+ /**
+ * maximum motion estimation search range in subpel units
+ * If 0 then no limit.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_range;
+
+#if FF_API_QUANT_BIAS
+ /**
+ * @deprecated use encoder private option instead
+ */
+ attribute_deprecated int intra_quant_bias;
+#define FF_DEFAULT_QUANT_BIAS 999999
+
+ /**
+ * @deprecated use encoder private option instead
+ */
+ attribute_deprecated int inter_quant_bias;
+#endif
+
+ /**
+ * slice flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int slice_flags;
+#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display
+#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG2 field pics)
+#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
+
+#if FF_API_XVMC
+ /**
+ * XVideo Motion Acceleration
+ * - encoding: forbidden
+ * - decoding: set by decoder
+ * @deprecated XvMC doesn't need it anymore.
+ */
+ attribute_deprecated int xvmc_acceleration;
+#endif /* FF_API_XVMC */
+
+ /**
+ * macroblock decision mode
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_decision;
+#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp
+#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits
+#define FF_MB_DECISION_RD 2 ///< rate distortion
+
+ /**
+ * custom intra quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *intra_matrix;
+
+ /**
+ * custom inter quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *inter_matrix;
+
+ /**
+ * scene change detection threshold
+ * 0 is default, larger means fewer detected scene changes.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_threshold;
+
+ /**
+ * noise reduction strength
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int noise_reduction;
+
+#if FF_API_MPV_OPT
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated
+ int me_threshold;
+
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated
+ int mb_threshold;
+#endif
+
+ /**
+ * precision of the intra DC coefficient - 8
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec
+ */
+ int intra_dc_precision;
+
+ /**
+ * Number of macroblock rows at the top which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_top;
+
+ /**
+ * Number of macroblock rows at the bottom which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_bottom;
+
+#if FF_API_MPV_OPT
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ float border_masking;
+#endif
+
+ /**
+ * minimum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmin;
+
+ /**
+ * maximum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmax;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_penalty_compensation;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int bidir_refine;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int brd_scale;
+
+ /**
+ * minimum GOP size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int keyint_min;
+
+ /**
+ * number of reference frames
+ * - encoding: Set by user.
+ * - decoding: Set by lavc.
+ */
+ int refs;
+
+ /**
+ * chroma qp offset from luma
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int chromaoffset;
+
+#if FF_API_UNUSED_MEMBERS
+ /**
+ * Multiplied by qscale for each frame and added to scene_change_score.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int scenechange_factor;
+#endif
+
+ /**
+ *
+ * Note: Value depends upon the compare function used for fullpel ME.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mv0_threshold;
+
+ /**
+ * Adjust sensitivity of b_frame_strategy 1.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int b_sensitivity;
+
+ /**
+ * Chromaticity coordinates of the source primaries.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorPrimaries color_primaries;
+
+ /**
+ * Color Transfer Characteristic.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorTransferCharacteristic color_trc;
+
+ /**
+ * YUV colorspace type.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorSpace colorspace;
+
+ /**
+ * MPEG vs JPEG YUV range.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorRange color_range;
+
+ /**
+ * This defines the location of chroma samples.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVChromaLocation chroma_sample_location;
+
+ /**
+ * Number of slices.
+ * Indicates number of picture subdivisions. Used for parallelized
+ * decoding.
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ int slices;
+
+ /** Field order
+ * - encoding: set by libavcodec
+ * - decoding: Set by user.
+ */
+ enum AVFieldOrder field_order;
+
+ /* audio only */
+ int sample_rate; ///< samples per second
+ int channels; ///< number of audio channels
+
+ /**
+ * audio sample format
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVSampleFormat sample_fmt; ///< sample format
+
+ /* The following data should not be initialized. */
+ /**
+ * Number of samples per channel in an audio frame.
+ *
+ * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame
+ * except the last must contain exactly frame_size samples per channel.
+ * May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the
+ * frame size is not restricted.
+ * - decoding: may be set by some decoders to indicate constant frame size
+ */
+ int frame_size;
+
+ /**
+ * Frame counter, set by libavcodec.
+ *
+ * - decoding: total number of frames returned from the decoder so far.
+ * - encoding: total number of frames passed to the encoder so far.
+ *
+ * @note the counter is not incremented if encoding/decoding resulted in
+ * an error.
+ */
+ int frame_number;
+
+ /**
+ * number of bytes per packet if constant and known or 0
+ * Used by some WAV based audio codecs.
+ */
+ int block_align;
+
+ /**
+ * Audio cutoff bandwidth (0 means "automatic")
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int cutoff;
+
+ /**
+ * Audio channel layout.
+ * - encoding: set by user.
+ * - decoding: set by user, may be overwritten by libavcodec.
+ */
+ uint64_t channel_layout;
+
+ /**
+ * Request decoder to use this channel layout if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ uint64_t request_channel_layout;
+
+ /**
+ * Type of service that the audio stream conveys.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVAudioServiceType audio_service_type;
+
+ /**
+ * desired sample format
+ * - encoding: Not used.
+ * - decoding: Set by user.
+ * Decoder will decode to this format if it can.
+ */
+ enum AVSampleFormat request_sample_fmt;
+
+ /**
+ * This callback is called at the beginning of each frame to get data
+ * buffer(s) for it. There may be one contiguous buffer for all the data or
+ * there may be a buffer per each data plane or anything in between. What
+ * this means is, you may set however many entries in buf[] you feel necessary.
+ * Each buffer must be reference-counted using the AVBuffer API (see description
+ * of buf[] below).
+ *
+ * The following fields will be set in the frame before this callback is
+ * called:
+ * - format
+ * - width, height (video only)
+ * - sample_rate, channel_layout, nb_samples (audio only)
+ * Their values may differ from the corresponding values in
+ * AVCodecContext. This callback must use the frame values, not the codec
+ * context values, to calculate the required buffer size.
+ *
+ * This callback must fill the following fields in the frame:
+ * - data[]
+ * - linesize[]
+ * - extended_data:
+ * * if the data is planar audio with more than 8 channels, then this
+ * callback must allocate and fill extended_data to contain all pointers
+ * to all data planes. data[] must hold as many pointers as it can.
+ * extended_data must be allocated with av_malloc() and will be freed in
+ * av_frame_unref().
+ * * otherwise exended_data must point to data
+ * - buf[] must contain one or more pointers to AVBufferRef structures. Each of
+ * the frame's data and extended_data pointers must be contained in these. That
+ * is, one AVBufferRef for each allocated chunk of memory, not necessarily one
+ * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(),
+ * and av_buffer_ref().
+ * - extended_buf and nb_extended_buf must be allocated with av_malloc() by
+ * this callback and filled with the extra buffers if there are more
+ * buffers than buf[] can hold. extended_buf will be freed in
+ * av_frame_unref().
+ *
+ * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call
+ * avcodec_default_get_buffer2() instead of providing buffers allocated by
+ * some other means.
+ *
+ * Each data plane must be aligned to the maximum required by the target
+ * CPU.
+ *
+ * @see avcodec_default_get_buffer2()
+ *
+ * Video:
+ *
+ * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused
+ * (read and/or written to if it is writable) later by libavcodec.
+ *
+ * avcodec_align_dimensions2() should be used to find the required width and
+ * height, as they normally need to be rounded up to the next multiple of 16.
+ *
+ * Some decoders do not support linesizes changing between frames.
+ *
+ * If frame multithreading is used and thread_safe_callbacks is set,
+ * this callback may be called from a different thread, but not from more
+ * than one at once. Does not need to be reentrant.
+ *
+ * @see avcodec_align_dimensions2()
+ *
+ * Audio:
+ *
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may,
+ * however, utilize only part of the buffer by setting AVFrame.nb_samples
+ * to a smaller value in the output frame.
+ *
+ * As a convenience, av_samples_get_buffer_size() and
+ * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2()
+ * functions to find the required data size and to fill data pointers and
+ * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+ * since all planes must be the same size.
+ *
+ * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags);
+
+ /**
+ * If non-zero, the decoded audio and video frames returned from
+ * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted
+ * and are valid indefinitely. The caller must free them with
+ * av_frame_unref() when they are not needed anymore.
+ * Otherwise, the decoded frames must not be freed by the caller and are
+ * only valid until the next decode call.
+ *
+ * - encoding: unused
+ * - decoding: set by the caller before avcodec_open2().
+ */
+ int refcounted_frames;
+
+ /* - encoding parameters */
+ float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0)
+ float qblur; ///< amount of qscale smoothing over time (0.0-1.0)
+
+ /**
+ * minimum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmin;
+
+ /**
+ * maximum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmax;
+
+ /**
+ * maximum quantizer difference between frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_qdiff;
+
+#if FF_API_MPV_OPT
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ float rc_qsquish;
+
+ attribute_deprecated
+ float rc_qmod_amp;
+ attribute_deprecated
+ int rc_qmod_freq;
+#endif
+
+ /**
+ * decoder bitstream buffer size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_buffer_size;
+
+ /**
+ * ratecontrol override, see RcOverride
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ int rc_override_count;
+ RcOverride *rc_override;
+
+#if FF_API_MPV_OPT
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ const char *rc_eq;
+#endif
+
+ /**
+ * maximum bitrate
+ * - encoding: Set by user.
+ * - decoding: Set by user, may be overwritten by libavcodec.
+ */
+ int64_t rc_max_rate;
+
+ /**
+ * minimum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int64_t rc_min_rate;
+
+#if FF_API_MPV_OPT
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ float rc_buffer_aggressivity;
+
+ attribute_deprecated
+ float rc_initial_cplx;
+#endif
+
+ /**
+ * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_max_available_vbv_use;
+
+ /**
+ * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_min_vbv_overflow_use;
+
+ /**
+ * Number of bits which should be loaded into the rc buffer before decoding starts.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_initial_buffer_occupancy;
+
+#if FF_API_CODER_TYPE
+#define FF_CODER_TYPE_VLC 0
+#define FF_CODER_TYPE_AC 1
+#define FF_CODER_TYPE_RAW 2
+#define FF_CODER_TYPE_RLE 3
+#if FF_API_UNUSED_MEMBERS
+#define FF_CODER_TYPE_DEFLATE 4
+#endif /* FF_API_UNUSED_MEMBERS */
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ int coder_type;
+#endif /* FF_API_CODER_TYPE */
+
+ /**
+ * context model
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int context_model;
+
+#if FF_API_MPV_OPT
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ int lmin;
+
+ /**
+ * @deprecated use encoder private options instead
+ */
+ attribute_deprecated
+ int lmax;
+#endif
+
+ /**
+ * frame skip threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_threshold;
+
+ /**
+ * frame skip factor
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_factor;
+
+ /**
+ * frame skip exponent
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_exp;
+
+ /**
+ * frame skip comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_cmp;
+
+ /**
+ * trellis RD quantization
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int trellis;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int min_prediction_order;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_prediction_order;
+
+ /**
+ * GOP timecode frame start number
+ * - encoding: Set by user, in non drop frame format
+ * - decoding: Set by libavcodec (timecode in the 25 bits format, -1 if unset)
+ */
+ int64_t timecode_frame_start;
+
+#if FF_API_RTP_CALLBACK
+ /**
+ * @deprecated unused
+ */
+ /* The RTP callback: This function is called */
+ /* every time the encoder has a packet to send. */
+ /* It depends on the encoder if the data starts */
+ /* with a Start Code (it should). H.263 does. */
+ /* mb_nb contains the number of macroblocks */
+ /* encoded in the RTP payload. */
+ attribute_deprecated
+ void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb);
+#endif
+
+ int rtp_payload_size; /* The size of the RTP payload: the coder will */
+ /* do its best to deliver a chunk with size */
+ /* below rtp_payload_size, the chunk will start */
+ /* with a start code on some codecs like H.263. */
+ /* This doesn't take account of any particular */
+ /* headers inside the transmitted RTP payload. */
+
+#if FF_API_STAT_BITS
+ /* statistics, used for 2-pass encoding */
+ attribute_deprecated
+ int mv_bits;
+ attribute_deprecated
+ int header_bits;
+ attribute_deprecated
+ int i_tex_bits;
+ attribute_deprecated
+ int p_tex_bits;
+ attribute_deprecated
+ int i_count;
+ attribute_deprecated
+ int p_count;
+ attribute_deprecated
+ int skip_count;
+ attribute_deprecated
+ int misc_bits;
+
+ /** @deprecated this field is unused */
+ attribute_deprecated
+ int frame_bits;
+#endif
+
+ /**
+ * pass1 encoding statistics output buffer
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ char *stats_out;
+
+ /**
+ * pass2 encoding statistics input buffer
+ * Concatenated stuff from stats_out of pass1 should be placed here.
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ char *stats_in;
+
+ /**
+ * Work around bugs in encoders which sometimes cannot be detected automatically.
+ * - encoding: Set by user
+ * - decoding: Set by user
+ */
+ int workaround_bugs;
+#define FF_BUG_AUTODETECT 1 ///< autodetection
+#if FF_API_OLD_MSMPEG4
+#define FF_BUG_OLD_MSMPEG4 2
+#endif
+#define FF_BUG_XVID_ILACE 4
+#define FF_BUG_UMP4 8
+#define FF_BUG_NO_PADDING 16
+#define FF_BUG_AMV 32
+#if FF_API_AC_VLC
+#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default.
+#endif
+#define FF_BUG_QPEL_CHROMA 64
+#define FF_BUG_STD_QPEL 128
+#define FF_BUG_QPEL_CHROMA2 256
+#define FF_BUG_DIRECT_BLOCKSIZE 512
+#define FF_BUG_EDGE 1024
+#define FF_BUG_HPEL_CHROMA 2048
+#define FF_BUG_DC_CLIP 4096
+#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
+#define FF_BUG_TRUNCATED 16384
+
+ /**
+ * strictly follow the standard (MPEG4, ...).
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ * Setting this to STRICT or higher means the encoder and decoder will
+ * generally do stupid things, whereas setting it to unofficial or lower
+ * will mean the encoder might produce output that is not supported by all
+ * spec-compliant decoders. Decoders don't differentiate between normal,
+ * unofficial and experimental (that is, they always try to decode things
+ * when they can) unless they are explicitly asked to behave stupidly
+ * (=strictly conform to the specs)
+ */
+ int strict_std_compliance;
+#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software.
+#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences.
+#define FF_COMPLIANCE_NORMAL 0
+#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions
+#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
+
+ /**
+ * error concealment flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int error_concealment;
+#define FF_EC_GUESS_MVS 1
+#define FF_EC_DEBLOCK 2
+#define FF_EC_FAVOR_INTER 256
+
+ /**
+ * debug
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug;
+#define FF_DEBUG_PICT_INFO 1
+#define FF_DEBUG_RC 2
+#define FF_DEBUG_BITSTREAM 4
+#define FF_DEBUG_MB_TYPE 8
+#define FF_DEBUG_QP 16
+#if FF_API_DEBUG_MV
+/**
+ * @deprecated this option does nothing
+ */
+#define FF_DEBUG_MV 32
+#endif
+#define FF_DEBUG_DCT_COEFF 0x00000040
+#define FF_DEBUG_SKIP 0x00000080
+#define FF_DEBUG_STARTCODE 0x00000100
+#if FF_API_UNUSED_MEMBERS
+#define FF_DEBUG_PTS 0x00000200
+#endif /* FF_API_UNUSED_MEMBERS */
+#define FF_DEBUG_ER 0x00000400
+#define FF_DEBUG_MMCO 0x00000800
+#define FF_DEBUG_BUGS 0x00001000
+#if FF_API_DEBUG_MV
+#define FF_DEBUG_VIS_QP 0x00002000 ///< only access through AVOptions from outside libavcodec
+#define FF_DEBUG_VIS_MB_TYPE 0x00004000 ///< only access through AVOptions from outside libavcodec
+#endif
+#define FF_DEBUG_BUFFERS 0x00008000
+#define FF_DEBUG_THREADS 0x00010000
+#define FF_DEBUG_GREEN_MD 0x00800000
+#define FF_DEBUG_NOMC 0x01000000
+
+#if FF_API_DEBUG_MV
+ /**
+ * debug
+ * Code outside libavcodec should access this field using AVOptions
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug_mv;
+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames
+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames
+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
+#endif
+
+ /**
+ * Error recognition; may misdetect some more or less valid parts as errors.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int err_recognition;
+
+/**
+ * Verify checksums embedded in the bitstream (could be of either encoded or
+ * decoded data, depending on the codec) and print an error message on mismatch.
+ * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the
+ * decoder returning an error.
+ */
+#define AV_EF_CRCCHECK (1<<0)
+#define AV_EF_BITSTREAM (1<<1) ///< detect bitstream specification deviations
+#define AV_EF_BUFFER (1<<2) ///< detect improper bitstream length
+#define AV_EF_EXPLODE (1<<3) ///< abort decoding on minor error detection
+
+#define AV_EF_IGNORE_ERR (1<<15) ///< ignore errors and continue
+#define AV_EF_CAREFUL (1<<16) ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors
+#define AV_EF_COMPLIANT (1<<17) ///< consider all spec non compliances as errors
+#define AV_EF_AGGRESSIVE (1<<18) ///< consider things that a sane encoder should not do as an error
+
+
+ /**
+ * opaque 64bit number (generally a PTS) that will be reordered and
+ * output in AVFrame.reordered_opaque
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * Hardware accelerator in use
+ * - encoding: unused.
+ * - decoding: Set by libavcodec
+ */
+ struct AVHWAccel *hwaccel;
+
+ /**
+ * Hardware accelerator context.
+ * For some hardware accelerators, a global context needs to be
+ * provided by the user. In that case, this holds display-dependent
+ * data FFmpeg cannot instantiate itself. Please refer to the
+ * FFmpeg HW accelerator documentation to know how to fill this
+ * is. e.g. for VA API, this is a struct vaapi_context.
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *hwaccel_context;
+
+ /**
+ * error
+ * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * DCT algorithm, see FF_DCT_* below
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dct_algo;
+#define FF_DCT_AUTO 0
+#define FF_DCT_FASTINT 1
+#define FF_DCT_INT 2
+#define FF_DCT_MMX 3
+#define FF_DCT_ALTIVEC 5
+#define FF_DCT_FAAN 6
+
+ /**
+ * IDCT algorithm, see FF_IDCT_* below.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int idct_algo;
+#define FF_IDCT_AUTO 0
+#define FF_IDCT_INT 1
+#define FF_IDCT_SIMPLE 2
+#define FF_IDCT_SIMPLEMMX 3
+#define FF_IDCT_ARM 7
+#define FF_IDCT_ALTIVEC 8
+#if FF_API_ARCH_SH4
+#define FF_IDCT_SH4 9
+#endif
+#define FF_IDCT_SIMPLEARM 10
+#if FF_API_UNUSED_MEMBERS
+#define FF_IDCT_IPP 13
+#endif /* FF_API_UNUSED_MEMBERS */
+#define FF_IDCT_XVID 14
+#if FF_API_IDCT_XVIDMMX
+#define FF_IDCT_XVIDMMX 14
+#endif /* FF_API_IDCT_XVIDMMX */
+#define FF_IDCT_SIMPLEARMV5TE 16
+#define FF_IDCT_SIMPLEARMV6 17
+#if FF_API_ARCH_SPARC
+#define FF_IDCT_SIMPLEVIS 18
+#endif
+#define FF_IDCT_FAAN 20
+#define FF_IDCT_SIMPLENEON 22
+#if FF_API_ARCH_ALPHA
+#define FF_IDCT_SIMPLEALPHA 23
+#endif
+#define FF_IDCT_SIMPLEAUTO 128
+
+ /**
+ * bits per sample/pixel from the demuxer (needed for huffyuv).
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user.
+ */
+ int bits_per_coded_sample;
+
+ /**
+ * Bits per sample/pixel of internal libavcodec pixel/sample format.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ int bits_per_raw_sample;
+
+#if FF_API_LOWRES
+ /**
+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size
+ * - encoding: unused
+ * - decoding: Set by user.
+ * Code outside libavcodec should access this field using:
+ * av_codec_{get,set}_lowres(avctx)
+ */
+ int lowres;
+#endif
+
+#if FF_API_CODED_FRAME
+ /**
+ * the picture in the bitstream
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ *
+ * @deprecated use the quality factor packet side data instead
+ */
+ attribute_deprecated AVFrame *coded_frame;
+#endif
+
+ /**
+ * thread count
+ * is used to decide how many independent tasks should be passed to execute()
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_count;
+
+ /**
+ * Which multithreading methods to use.
+ * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
+ * so clients which cannot provide future frames should not use it.
+ *
+ * - encoding: Set by user, otherwise the default is used.
+ * - decoding: Set by user, otherwise the default is used.
+ */
+ int thread_type;
+#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once
+#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once
+
+ /**
+ * Which multithreading methods are in use by the codec.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int active_thread_type;
+
+ /**
+ * Set by the client if its custom get_buffer() callback can be called
+ * synchronously from another thread, which allows faster multithreaded decoding.
+ * draw_horiz_band() will be called from other threads regardless of this setting.
+ * Ignored if the default get_buffer() is used.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_safe_callbacks;
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * @param count the number of things to execute
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * Also see avcodec_thread_init and e.g. the --enable-pthread configure option.
+ * @param c context passed also to func
+ * @param count the number of things to execute
+ * @param arg2 argument passed unchanged to func
+ * @param ret return values of executed functions, must have space for "count" values. May be NULL.
+ * @param func function that will be called count times, with jobnr from 0 to count-1.
+ * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no
+ * two instances of func executing at the same time will have the same threadnr.
+ * @return always 0 currently, but code should handle a future improvement where when any call to func
+ * returns < 0 no further calls to func may be done and < 0 is returned.
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
+
+ /**
+ * noise vs. sse weight for the nsse comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int nsse_weight;
+
+ /**
+ * profile
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int profile;
+#define FF_PROFILE_UNKNOWN -99
+#define FF_PROFILE_RESERVED -100
+
+#define FF_PROFILE_AAC_MAIN 0
+#define FF_PROFILE_AAC_LOW 1
+#define FF_PROFILE_AAC_SSR 2
+#define FF_PROFILE_AAC_LTP 3
+#define FF_PROFILE_AAC_HE 4
+#define FF_PROFILE_AAC_HE_V2 28
+#define FF_PROFILE_AAC_LD 22
+#define FF_PROFILE_AAC_ELD 38
+#define FF_PROFILE_MPEG2_AAC_LOW 128
+#define FF_PROFILE_MPEG2_AAC_HE 131
+
+#define FF_PROFILE_DTS 20
+#define FF_PROFILE_DTS_ES 30
+#define FF_PROFILE_DTS_96_24 40
+#define FF_PROFILE_DTS_HD_HRA 50
+#define FF_PROFILE_DTS_HD_MA 60
+#define FF_PROFILE_DTS_EXPRESS 70
+
+#define FF_PROFILE_MPEG2_422 0
+#define FF_PROFILE_MPEG2_HIGH 1
+#define FF_PROFILE_MPEG2_SS 2
+#define FF_PROFILE_MPEG2_SNR_SCALABLE 3
+#define FF_PROFILE_MPEG2_MAIN 4
+#define FF_PROFILE_MPEG2_SIMPLE 5
+
+#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag
+#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag
+
+#define FF_PROFILE_H264_BASELINE 66
+#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)
+#define FF_PROFILE_H264_MAIN 77
+#define FF_PROFILE_H264_EXTENDED 88
+#define FF_PROFILE_H264_HIGH 100
+#define FF_PROFILE_H264_HIGH_10 110
+#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_422 122
+#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_444 144
+#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244
+#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_CAVLC_444 44
+
+#define FF_PROFILE_VC1_SIMPLE 0
+#define FF_PROFILE_VC1_MAIN 1
+#define FF_PROFILE_VC1_COMPLEX 2
+#define FF_PROFILE_VC1_ADVANCED 3
+
+#define FF_PROFILE_MPEG4_SIMPLE 0
+#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1
+#define FF_PROFILE_MPEG4_CORE 2
+#define FF_PROFILE_MPEG4_MAIN 3
+#define FF_PROFILE_MPEG4_N_BIT 4
+#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5
+#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
+#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
+#define FF_PROFILE_MPEG4_HYBRID 8
+#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
+#define FF_PROFILE_MPEG4_CORE_SCALABLE 10
+#define FF_PROFILE_MPEG4_ADVANCED_CODING 11
+#define FF_PROFILE_MPEG4_ADVANCED_CORE 12
+#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
+#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14
+#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15
+
+#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 0
+#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 1
+#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 2
+#define FF_PROFILE_JPEG2000_DCINEMA_2K 3
+#define FF_PROFILE_JPEG2000_DCINEMA_4K 4
+
+#define FF_PROFILE_VP9_0 0
+#define FF_PROFILE_VP9_1 1
+#define FF_PROFILE_VP9_2 2
+#define FF_PROFILE_VP9_3 3
+
+#define FF_PROFILE_HEVC_MAIN 1
+#define FF_PROFILE_HEVC_MAIN_10 2
+#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3
+#define FF_PROFILE_HEVC_REXT 4
+
+ /**
+ * level
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int level;
+#define FF_LEVEL_UNKNOWN -99
+
+ /**
+ * Skip loop filtering for selected frames.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_loop_filter;
+
+ /**
+ * Skip IDCT/dequantization for selected frames.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_idct;
+
+ /**
+ * Skip decoding for selected frames.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_frame;
+
+ /**
+ * Header containing style information for text subtitles.
+ * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
+ * [Script Info] and [V4+ Styles] section, plus the [Events] line and
+ * the Format line following. It shouldn't include any Dialogue line.
+ * - encoding: Set/allocated/freed by user (before avcodec_open2())
+ * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
+ */
+ uint8_t *subtitle_header;
+ int subtitle_header_size;
+
+#if FF_API_ERROR_RATE
+ /**
+ * @deprecated use the 'error_rate' private AVOption of the mpegvideo
+ * encoders
+ */
+ attribute_deprecated
+ int error_rate;
+#endif
+
+#if FF_API_VBV_DELAY
+ /**
+ * VBV delay coded in the last frame (in periods of a 27 MHz clock).
+ * Used for compliant TS muxing.
+ * - encoding: Set by libavcodec.
+ * - decoding: unused.
+ * @deprecated this value is now exported as a part of
+ * AV_PKT_DATA_CPB_PROPERTIES packet side data
+ */
+ attribute_deprecated
+ uint64_t vbv_delay;
+#endif
+
+#if FF_API_SIDEDATA_ONLY_PKT
+ /**
+ * Encoding only and set by default. Allow encoders to output packets
+ * that do not contain any encoded data, only side data.
+ *
+ * Some encoders need to output such packets, e.g. to update some stream
+ * parameters at the end of encoding.
+ *
+ * @deprecated this field disables the default behaviour and
+ * it is kept only for compatibility.
+ */
+ attribute_deprecated
+ int side_data_only_packets;
+#endif
+
+ /**
+ * Audio only. The number of "priming" samples (padding) inserted by the
+ * encoder at the beginning of the audio. I.e. this number of leading
+ * decoded samples must be discarded by the caller to get the original audio
+ * without leading padding.
+ *
+ * - decoding: unused
+ * - encoding: Set by libavcodec. The timestamps on the output packets are
+ * adjusted by the encoder so that they always refer to the
+ * first sample of the data actually contained in the packet,
+ * including any added padding. E.g. if the timebase is
+ * 1/samplerate and the timestamp of the first input sample is
+ * 0, the timestamp of the first output packet will be
+ * -initial_padding.
+ */
+ int initial_padding;
+
+ /**
+ * - decoding: For codecs that store a framerate value in the compressed
+ * bitstream, the decoder may export it here. { 0, 1} when
+ * unknown.
+ * - encoding: unused
+ */
+ AVRational framerate;
+
+ /**
+ * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
+ * - encoding: unused.
+ * - decoding: Set by libavcodec before calling get_format()
+ */
+ enum AVPixelFormat sw_pix_fmt;
+
+ /**
+ * Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
+ * Code outside libavcodec should access this field using:
+ * av_codec_{get,set}_pkt_timebase(avctx)
+ * - encoding unused.
+ * - decoding set by user.
+ */
+ AVRational pkt_timebase;
+
+ /**
+ * AVCodecDescriptor
+ * Code outside libavcodec should access this field using:
+ * av_codec_{get,set}_codec_descriptor(avctx)
+ * - encoding: unused.
+ * - decoding: set by libavcodec.
+ */
+ const AVCodecDescriptor *codec_descriptor;
+
+#if !FF_API_LOWRES
+ /**
+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size
+ * - encoding: unused
+ * - decoding: Set by user.
+ * Code outside libavcodec should access this field using:
+ * av_codec_{get,set}_lowres(avctx)
+ */
+ int lowres;
+#endif
+
+ /**
+ * Current statistics for PTS correction.
+ * - decoding: maintained and used by libavcodec, not intended to be used by user apps
+ * - encoding: unused
+ */
+ int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
+ int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
+ int64_t pts_correction_last_pts; /// PTS of the last frame
+ int64_t pts_correction_last_dts; /// DTS of the last frame
+
+ /**
+ * Character encoding of the input subtitles file.
+ * - decoding: set by user
+ * - encoding: unused
+ */
+ char *sub_charenc;
+
+ /**
+ * Subtitles character encoding mode. Formats or codecs might be adjusting
+ * this setting (if they are doing the conversion themselves for instance).
+ * - decoding: set by libavcodec
+ * - encoding: unused
+ */
+ int sub_charenc_mode;
+#define FF_SUB_CHARENC_MODE_DO_NOTHING -1 ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance)
+#define FF_SUB_CHARENC_MODE_AUTOMATIC 0 ///< libavcodec will select the mode itself
+#define FF_SUB_CHARENC_MODE_PRE_DECODER 1 ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
+
+ /**
+ * Skip processing alpha if supported by codec.
+ * Note that if the format uses pre-multiplied alpha (common with VP6,
+ * and recommended due to better video quality/compression)
+ * the image will look as if alpha-blended onto a black background.
+ * However for formats that do not use pre-multiplied alpha
+ * there might be serious artefacts (though e.g. libswscale currently
+ * assumes pre-multiplied alpha anyway).
+ * Code outside libavcodec should access this field using AVOptions
+ *
+ * - decoding: set by user
+ * - encoding: unused
+ */
+ int skip_alpha;
+
+ /**
+ * Number of samples to skip after a discontinuity
+ * - decoding: unused
+ * - encoding: set by libavcodec
+ */
+ int seek_preroll;
+
+#if !FF_API_DEBUG_MV
+ /**
+ * debug motion vectors
+ * Code outside libavcodec should access this field using AVOptions
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug_mv;
+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames
+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames
+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
+#endif
+
+ /**
+ * custom intra quantization matrix
+ * Code outside libavcodec should access this field using av_codec_g/set_chroma_intra_matrix()
+ * - encoding: Set by user, can be NULL.
+ * - decoding: unused.
+ */
+ uint16_t *chroma_intra_matrix;
+
+ /**
+ * dump format separator.
+ * can be ", " or "\n " or anything else
+ * Code outside libavcodec should access this field using AVOptions
+ * (NO direct access).
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ uint8_t *dump_separator;
+
+ /**
+ * ',' separated list of allowed decoders.
+ * If NULL then all are allowed
+ * - encoding: unused
+ * - decoding: set by user through AVOPtions (NO direct access)
+ */
+ char *codec_whitelist;
+
+ /*
+ * Properties of the stream that gets decoded
+ * To be accessed through av_codec_get_properties() (NO direct access)
+ * - encoding: unused
+ * - decoding: set by libavcodec
+ */
+ unsigned properties;
+#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001
+#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002
+
+ /**
+ * Additional data associated with the entire coded stream.
+ *
+ * - decoding: unused
+ * - encoding: may be set by libavcodec after avcodec_open2().
+ */
+ AVPacketSideData *coded_side_data;
+ int nb_coded_side_data;
+
+} AVCodecContext;
+
+AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx);
+void av_codec_set_pkt_timebase (AVCodecContext *avctx, AVRational val);
+
+const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx);
+void av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc);
+
+unsigned av_codec_get_codec_properties(const AVCodecContext *avctx);
+
+int av_codec_get_lowres(const AVCodecContext *avctx);
+void av_codec_set_lowres(AVCodecContext *avctx, int val);
+
+int av_codec_get_seek_preroll(const AVCodecContext *avctx);
+void av_codec_set_seek_preroll(AVCodecContext *avctx, int val);
+
+uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx);
+void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val);
+
+/**
+ * AVProfile.
+ */
+typedef struct AVProfile {
+ int profile;
+ const char *name; ///< short name for the profile
+} AVProfile;
+
+typedef struct AVCodecDefault AVCodecDefault;
+
+struct AVSubtitle;
+
+/**
+ * AVCodec.
+ */
+typedef struct AVCodec {
+ /**
+ * Name of the codec implementation.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ * This is the primary way to find a codec from the user perspective.
+ */
+ const char *name;
+ /**
+ * Descriptive name for the codec, meant to be more human readable than name.
+ * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
+ */
+ const char *long_name;
+ enum AVMediaType type;
+ enum AVCodecID id;
+ /**
+ * Codec capabilities.
+ * see AV_CODEC_CAP_*
+ */
+ int capabilities;
+ const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
+ const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
+ const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
+ const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
+ const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
+ uint8_t max_lowres; ///< maximum value for lowres supported by the decoder, no direct access, use av_codec_get_max_lowres()
+ const AVClass *priv_class; ///< AVClass for the private context
+ const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
+
+ /*****************************************************************
+ * No fields below this line are part of the public API. They
+ * may not be used outside of libavcodec and can be changed and
+ * removed at will.
+ * New public fields should be added right above.
+ *****************************************************************
+ */
+ int priv_data_size;
+ struct AVCodec *next;
+ /**
+ * @name Frame-level threading support functions
+ * @{
+ */
+ /**
+ * If defined, called on thread contexts when they are created.
+ * If the codec allocates writable tables in init(), re-allocate them here.
+ * priv_data will be set to a copy of the original.
+ */
+ int (*init_thread_copy)(AVCodecContext *);
+ /**
+ * Copy necessary context variables from a previous thread context to the current one.
+ * If not defined, the next thread will start automatically; otherwise, the codec
+ * must call ff_thread_finish_setup().
+ *
+ * dst and src will (rarely) point to the same context, in which case memcpy should be skipped.
+ */
+ int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src);
+ /** @} */
+
+ /**
+ * Private codec-specific defaults.
+ */
+ const AVCodecDefault *defaults;
+
+ /**
+ * Initialize codec static data, called from avcodec_register().
+ */
+ void (*init_static_data)(struct AVCodec *codec);
+
+ int (*init)(AVCodecContext *);
+ int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size,
+ const struct AVSubtitle *sub);
+ /**
+ * Encode data to an AVPacket.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket (may contain a user-provided buffer)
+ * @param[in] frame AVFrame containing the raw data to be encoded
+ * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
+ * non-empty packet was returned in avpkt.
+ * @return 0 on success, negative error code on failure
+ */
+ int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
+ int *got_packet_ptr);
+ int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
+ int (*close)(AVCodecContext *);
+ /**
+ * Flush buffers.
+ * Will be called when seeking
+ */
+ void (*flush)(AVCodecContext *);
+ /**
+ * Internal codec capabilities.
+ * See FF_CODEC_CAP_* in internal.h
+ */
+ int caps_internal;
+} AVCodec;
+
+int av_codec_get_max_lowres(const AVCodec *codec);
+
+struct MpegEncContext;
+
+/**
+ * @defgroup lavc_hwaccel AVHWAccel
+ * @{
+ */
+typedef struct AVHWAccel {
+ /**
+ * Name of the hardware accelerated codec.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ */
+ const char *name;
+
+ /**
+ * Type of codec implemented by the hardware accelerator.
+ *
+ * See AVMEDIA_TYPE_xxx
+ */
+ enum AVMediaType type;
+
+ /**
+ * Codec implemented by the hardware accelerator.
+ *
+ * See AV_CODEC_ID_xxx
+ */
+ enum AVCodecID id;
+
+ /**
+ * Supported pixel format.
+ *
+ * Only hardware accelerated formats are supported here.
+ */
+ enum AVPixelFormat pix_fmt;
+
+ /**
+ * Hardware accelerated codec capabilities.
+ * see HWACCEL_CODEC_CAP_*
+ */
+ int capabilities;
+
+ /*****************************************************************
+ * No fields below this line are part of the public API. They
+ * may not be used outside of libavcodec and can be changed and
+ * removed at will.
+ * New public fields should be added right above.
+ *****************************************************************
+ */
+ struct AVHWAccel *next;
+
+ /**
+ * Allocate a custom buffer
+ */
+ int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame);
+
+ /**
+ * Called at the beginning of each frame or field picture.
+ *
+ * Meaningful frame information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * Note that buf can be NULL along with buf_size set to 0.
+ * Otherwise, this means the whole frame is available at this point.
+ *
+ * @param avctx the codec context
+ * @param buf the frame data buffer base
+ * @param buf_size the size of the frame in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Callback for each slice.
+ *
+ * Meaningful slice information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ * The only exception is XvMC, that works on MB level.
+ *
+ * @param avctx the codec context
+ * @param buf the slice data buffer base
+ * @param buf_size the size of the slice in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Called at the end of each frame or field picture.
+ *
+ * The whole picture is parsed at this point and can now be sent
+ * to the hardware accelerator. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*end_frame)(AVCodecContext *avctx);
+
+ /**
+ * Size of per-frame hardware accelerator private data.
+ *
+ * Private data is allocated with av_mallocz() before
+ * AVCodecContext.get_buffer() and deallocated after
+ * AVCodecContext.release_buffer().
+ */
+ int frame_priv_data_size;
+
+ /**
+ * Called for every Macroblock in a slice.
+ *
+ * XvMC uses it to replace the ff_mpv_decode_mb().
+ * Instead of decoding to raw picture, MB parameters are
+ * stored in an array provided by the video driver.
+ *
+ * @param s the mpeg context
+ */
+ void (*decode_mb)(struct MpegEncContext *s);
+
+ /**
+ * Initialize the hwaccel private data.
+ *
+ * This will be called from ff_get_format(), after hwaccel and
+ * hwaccel_context are set and the hwaccel private data in AVCodecInternal
+ * is allocated.
+ */
+ int (*init)(AVCodecContext *avctx);
+
+ /**
+ * Uninitialize the hwaccel private data.
+ *
+ * This will be called from get_format() or avcodec_close(), after hwaccel
+ * and hwaccel_context are already uninitialized.
+ */
+ int (*uninit)(AVCodecContext *avctx);
+
+ /**
+ * Size of the private data to allocate in
+ * AVCodecInternal.hwaccel_priv_data.
+ */
+ int priv_data_size;
+} AVHWAccel;
+
+/**
+ * Hardware acceleration should be used for decoding even if the codec level
+ * used is unknown or higher than the maximum supported level reported by the
+ * hardware driver.
+ *
+ * It's generally a good idea to pass this flag unless you have a specific
+ * reason not to, as hardware tends to under-report supported levels.
+ */
+#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)
+
+/**
+ * Hardware acceleration can output YUV pixel formats with a different chroma
+ * sampling than 4:2:0 and/or other than 8 bits per component.
+ */
+#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1)
+
+/**
+ * @}
+ */
+
+#if FF_API_AVPICTURE
+/**
+ * @defgroup lavc_picture AVPicture
+ *
+ * Functions for working with AVPicture
+ * @{
+ */
+
+/**
+ * Picture data structure.
+ *
+ * Up to four components can be stored into it, the last component is
+ * alpha.
+ * @deprecated use AVFrame or imgutils functions instead
+ */
+typedef struct AVPicture {
+ attribute_deprecated
+ uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes
+ attribute_deprecated
+ int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line
+} AVPicture;
+
+/**
+ * @}
+ */
+#endif
+
+enum AVSubtitleType {
+ SUBTITLE_NONE,
+
+ SUBTITLE_BITMAP, ///< A bitmap, pict will be set
+
+ /**
+ * Plain text, the text field must be set by the decoder and is
+ * authoritative. ass and pict fields may contain approximations.
+ */
+ SUBTITLE_TEXT,
+
+ /**
+ * Formatted text, the ass field must be set by the decoder and is
+ * authoritative. pict and text fields may contain approximations.
+ */
+ SUBTITLE_ASS,
+};
+
+#define AV_SUBTITLE_FLAG_FORCED 0x00000001
+
+typedef struct AVSubtitleRect {
+ int x; ///< top left corner of pict, undefined when pict is not set
+ int y; ///< top left corner of pict, undefined when pict is not set
+ int w; ///< width of pict, undefined when pict is not set
+ int h; ///< height of pict, undefined when pict is not set
+ int nb_colors; ///< number of colors in pict, undefined when pict is not set
+
+#if FF_API_AVPICTURE
+ /**
+ * @deprecated unused
+ */
+ attribute_deprecated
+ AVPicture pict;
+#endif
+ /**
+ * data+linesize for the bitmap of this subtitle.
+ * Can be set for text/ass as well once they are rendered.
+ */
+ uint8_t *data[4];
+ int linesize[4];
+
+ enum AVSubtitleType type;
+
+ char *text; ///< 0 terminated plain UTF-8 text
+
+ /**
+ * 0 terminated ASS/SSA compatible event line.
+ * The presentation of this is unaffected by the other values in this
+ * struct.
+ */
+ char *ass;
+
+ int flags;
+} AVSubtitleRect;
+
+typedef struct AVSubtitle {
+ uint16_t format; /* 0 = graphics */
+ uint32_t start_display_time; /* relative to packet pts, in ms */
+ uint32_t end_display_time; /* relative to packet pts, in ms */
+ unsigned num_rects;
+ AVSubtitleRect **rects;
+ int64_t pts; ///< Same as packet pts, in AV_TIME_BASE
+} AVSubtitle;
+
+/**
+ * If c is NULL, returns the first registered codec,
+ * if c is non-NULL, returns the next registered codec after c,
+ * or NULL if c is the last one.
+ */
+AVCodec *av_codec_next(const AVCodec *c);
+
+/**
+ * Return the LIBAVCODEC_VERSION_INT constant.
+ */
+unsigned avcodec_version(void);
+
+/**
+ * Return the libavcodec build-time configuration.
+ */
+const char *avcodec_configuration(void);
+
+/**
+ * Return the libavcodec license.
+ */
+const char *avcodec_license(void);
+
+/**
+ * Register the codec codec and initialize libavcodec.
+ *
+ * @warning either this function or avcodec_register_all() must be called
+ * before any other libavcodec functions.
+ *
+ * @see avcodec_register_all()
+ */
+void avcodec_register(AVCodec *codec);
+
+/**
+ * Register all the codecs, parsers and bitstream filters which were enabled at
+ * configuration time. If you do not call this function you can select exactly
+ * which formats you want to support, by using the individual registration
+ * functions.
+ *
+ * @see avcodec_register
+ * @see av_register_codec_parser
+ * @see av_register_bitstream_filter
+ */
+void avcodec_register_all(void);
+
+/**
+ * Allocate an AVCodecContext and set its fields to default values. The
+ * resulting struct should be freed with avcodec_free_context().
+ *
+ * @param codec if non-NULL, allocate private data and initialize defaults
+ * for the given codec. It is illegal to then call avcodec_open2()
+ * with a different codec.
+ * If NULL, then the codec-specific defaults won't be initialized,
+ * which may result in suboptimal default settings (this is
+ * important mainly for encoders, e.g. libx264).
+ *
+ * @return An AVCodecContext filled with default values or NULL on failure.
+ * @see avcodec_get_context_defaults
+ */
+AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
+
+/**
+ * Free the codec context and everything associated with it and write NULL to
+ * the provided pointer.
+ */
+void avcodec_free_context(AVCodecContext **avctx);
+
+/**
+ * Set the fields of the given AVCodecContext to default values corresponding
+ * to the given codec (defaults may be codec-dependent).
+ *
+ * Do not call this function if a non-NULL codec has been passed
+ * to avcodec_alloc_context3() that allocated this AVCodecContext.
+ * If codec is non-NULL, it is illegal to call avcodec_open2() with a
+ * different codec on this AVCodecContext.
+ */
+int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec);
+
+/**
+ * Get the AVClass for AVCodecContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_class(void);
+
+/**
+ * Get the AVClass for AVFrame. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_frame_class(void);
+
+/**
+ * Get the AVClass for AVSubtitleRect. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_subtitle_rect_class(void);
+
+/**
+ * Copy the settings of the source AVCodecContext into the destination
+ * AVCodecContext. The resulting destination codec context will be
+ * unopened, i.e. you are required to call avcodec_open2() before you
+ * can use this AVCodecContext to decode/encode video/audio data.
+ *
+ * @param dest target codec context, should be initialized with
+ * avcodec_alloc_context3(NULL), but otherwise uninitialized
+ * @param src source codec context
+ * @return AVERROR() on error (e.g. memory allocation error), 0 on success
+ */
+int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
+
+/**
+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
+ * function the context has to be allocated with avcodec_alloc_context3().
+ *
+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
+ * retrieving a codec.
+ *
+ * @warning This function is not thread safe!
+ *
+ * @note Always call this function before using decoding routines (such as
+ * @ref avcodec_decode_video2()).
+ *
+ * @code
+ * avcodec_register_all();
+ * av_dict_set(&opts, "b", "2.5M", 0);
+ * codec = avcodec_find_decoder(AV_CODEC_ID_H264);
+ * if (!codec)
+ * exit(1);
+ *
+ * context = avcodec_alloc_context3(codec);
+ *
+ * if (avcodec_open2(context, codec, opts) < 0)
+ * exit(1);
+ * @endcode
+ *
+ * @param avctx The context to initialize.
+ * @param codec The codec to open this context for. If a non-NULL codec has been
+ * previously passed to avcodec_alloc_context3() or
+ * avcodec_get_context_defaults3() for this context, then this
+ * parameter MUST be either NULL or equal to the previously passed
+ * codec.
+ * @param options A dictionary filled with AVCodecContext and codec-private options.
+ * On return this object will be filled with options that were not found.
+ *
+ * @return zero on success, a negative value on error
+ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
+ * av_dict_set(), av_opt_find().
+ */
+int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
+
+/**
+ * Close a given AVCodecContext and free all the data associated with it
+ * (but not the AVCodecContext itself).
+ *
+ * Calling this function on an AVCodecContext that hasn't been opened will free
+ * the codec-specific data allocated in avcodec_alloc_context3() /
+ * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will
+ * do nothing.
+ */
+int avcodec_close(AVCodecContext *avctx);
+
+/**
+ * Free all allocated data in the given subtitle struct.
+ *
+ * @param sub AVSubtitle to free.
+ */
+void avsubtitle_free(AVSubtitle *sub);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_packet
+ * @{
+ */
+
+/**
+ * Allocate an AVPacket and set its fields to default values. The resulting
+ * struct must be freed using av_packet_free().
+ *
+ * @return An AVPacket filled with default values or NULL on failure.
+ *
+ * @note this only allocates the AVPacket itself, not the data buffers. Those
+ * must be allocated through other means such as av_new_packet.
+ *
+ * @see av_new_packet
+ */
+AVPacket *av_packet_alloc(void);
+
+/**
+ * Create a new packet that references the same data as src.
+ *
+ * This is a shortcut for av_packet_alloc()+av_packet_ref().
+ *
+ * @return newly created AVPacket on success, NULL on error.
+ *
+ * @see av_packet_alloc
+ * @see av_packet_ref
+ */
+AVPacket *av_packet_clone(AVPacket *src);
+
+/**
+ * Free the packet, if the packet is reference counted, it will be
+ * unreferenced first.
+ *
+ * @param packet packet to be freed. The pointer will be set to NULL.
+ * @note passing NULL is a no-op.
+ */
+void av_packet_free(AVPacket **pkt);
+
+/**
+ * Initialize optional fields of a packet with default values.
+ *
+ * Note, this does not touch the data and size members, which have to be
+ * initialized separately.
+ *
+ * @param pkt packet
+ */
+void av_init_packet(AVPacket *pkt);
+
+/**
+ * Allocate the payload of a packet and initialize its fields with
+ * default values.
+ *
+ * @param pkt packet
+ * @param size wanted payload size
+ * @return 0 if OK, AVERROR_xxx otherwise
+ */
+int av_new_packet(AVPacket *pkt, int size);
+
+/**
+ * Reduce packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param size new size
+ */
+void av_shrink_packet(AVPacket *pkt, int size);
+
+/**
+ * Increase packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param grow_by number of bytes by which to increase the size of the packet
+ */
+int av_grow_packet(AVPacket *pkt, int grow_by);
+
+/**
+ * Initialize a reference-counted packet from av_malloc()ed data.
+ *
+ * @param pkt packet to be initialized. This function will set the data, size,
+ * buf and destruct fields, all others are left untouched.
+ * @param data Data allocated by av_malloc() to be used as packet data. If this
+ * function returns successfully, the data is owned by the underlying AVBuffer.
+ * The caller may not access the data through other means.
+ * @param size size of data in bytes, without the padding. I.e. the full buffer
+ * size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE.
+ *
+ * @return 0 on success, a negative AVERROR on error
+ */
+int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
+
+#if FF_API_AVPACKET_OLD_API
+/**
+ * @warning This is a hack - the packet memory allocation stuff is broken. The
+ * packet is allocated if it was not really allocated.
+ *
+ * @deprecated Use av_packet_ref
+ */
+attribute_deprecated
+int av_dup_packet(AVPacket *pkt);
+/**
+ * Copy packet, including contents
+ *
+ * @return 0 on success, negative AVERROR on fail
+ */
+int av_copy_packet(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Copy packet side data
+ *
+ * @return 0 on success, negative AVERROR on fail
+ */
+int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Free a packet.
+ *
+ * @deprecated Use av_packet_unref
+ *
+ * @param pkt packet to free
+ */
+attribute_deprecated
+void av_free_packet(AVPacket *pkt);
+#endif
+/**
+ * Allocate new information of a packet.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Wrap an existing array as a packet side data.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param data the side data array. It must be allocated with the av_malloc()
+ * family of functions. The ownership of the data is transferred to
+ * pkt.
+ * @param size side information size
+ * @return a non-negative number on success, a negative AVERROR code on
+ * failure. On failure, the packet is unchanged and the data remains
+ * owned by the caller.
+ */
+int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ uint8_t *data, size_t size);
+
+/**
+ * Shrink the already allocated side data buffer
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size new side information size
+ * @return 0 on success, < 0 on failure
+ */
+int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Get side information from packet.
+ *
+ * @param pkt packet
+ * @param type desired side information type
+ * @param size pointer for side information size to store (optional)
+ * @return pointer to data if present or NULL otherwise
+ */
+uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int *size);
+
+int av_packet_merge_side_data(AVPacket *pkt);
+
+int av_packet_split_side_data(AVPacket *pkt);
+
+const char *av_packet_side_data_name(enum AVPacketSideDataType type);
+
+/**
+ * Pack a dictionary for use in side_data.
+ *
+ * @param dict The dictionary to pack.
+ * @param size pointer to store the size of the returned data
+ * @return pointer to data if successful, NULL otherwise
+ */
+uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size);
+/**
+ * Unpack a dictionary from side_data.
+ *
+ * @param data data from side_data
+ * @param size size of the data
+ * @param dict the metadata storage dictionary
+ * @return 0 on success, < 0 on failure
+ */
+int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict);
+
+
+/**
+ * Convenience function to free all the side data stored.
+ * All the other fields stay untouched.
+ *
+ * @param pkt packet
+ */
+void av_packet_free_side_data(AVPacket *pkt);
+
+/**
+ * Setup a new reference to the data described by a given packet
+ *
+ * If src is reference-counted, setup dst as a new reference to the
+ * buffer in src. Otherwise allocate a new buffer in dst and copy the
+ * data from src into it.
+ *
+ * All the other fields are copied from src.
+ *
+ * @see av_packet_unref
+ *
+ * @param dst Destination packet
+ * @param src Source packet
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ */
+int av_packet_ref(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Wipe the packet.
+ *
+ * Unreference the buffer referenced by the packet and reset the
+ * remaining packet fields to their default values.
+ *
+ * @param pkt The packet to be unreferenced.
+ */
+void av_packet_unref(AVPacket *pkt);
+
+/**
+ * Move every field in src to dst and reset src.
+ *
+ * @see av_packet_unref
+ *
+ * @param src Source packet, will be reset
+ * @param dst Destination packet
+ */
+void av_packet_move_ref(AVPacket *dst, AVPacket *src);
+
+/**
+ * Copy only "properties" fields from src to dst.
+ *
+ * Properties for the purpose of this function are all the fields
+ * beside those related to the packet data (buf, data, size)
+ *
+ * @param dst Destination packet
+ * @param src Source packet
+ *
+ * @return 0 on success AVERROR on failure.
+ *
+ */
+int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Convert valid timing fields (timestamps / durations) in a packet from one
+ * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
+ * ignored.
+ *
+ * @param pkt packet on which the conversion will be performed
+ * @param tb_src source timebase, in which the timing fields in pkt are
+ * expressed
+ * @param tb_dst destination timebase, to which the timing fields will be
+ * converted
+ */
+void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_decoding
+ * @{
+ */
+
+/**
+ * Find a registered decoder with a matching codec ID.
+ *
+ * @param id AVCodecID of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder(enum AVCodecID id);
+
+/**
+ * Find a registered decoder with the specified name.
+ *
+ * @param name name of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder_by_name(const char *name);
+
+/**
+ * The default callback for AVCodecContext.get_buffer2(). It is made public so
+ * it can be called by custom get_buffer2() implementations for decoders without
+ * AV_CODEC_CAP_DR1 set.
+ */
+int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags);
+
+#if FF_API_EMU_EDGE
+/**
+ * Return the amount of padding in pixels which the get_buffer callback must
+ * provide around the edge of the image for codecs which do not have the
+ * CODEC_FLAG_EMU_EDGE flag.
+ *
+ * @return Required padding in pixels.
+ *
+ * @deprecated CODEC_FLAG_EMU_EDGE is deprecated, so this function is no longer
+ * needed
+ */
+attribute_deprecated
+unsigned avcodec_get_edge_width(void);
+#endif
+
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you do not use any horizontal
+ * padding.
+ *
+ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
+ */
+void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
+
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you also ensure that all
+ * line sizes are a multiple of the respective linesize_align[i].
+ *
+ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
+ */
+void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
+ int linesize_align[AV_NUM_DATA_POINTERS]);
+
+/**
+ * Converts AVChromaLocation to swscale x/y chroma position.
+ *
+ * The positions represent the chroma (0,0) position in a coordinates system
+ * with luma (0,0) representing the origin and luma(1,1) representing 256,256
+ *
+ * @param xpos horizontal chroma sample position
+ * @param ypos vertical chroma sample position
+ */
+int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos);
+
+/**
+ * Converts swscale x/y chroma position to AVChromaLocation.
+ *
+ * The positions represent the chroma (0,0) position in a coordinates system
+ * with luma (0,0) representing the origin and luma(1,1) representing 256,256
+ *
+ * @param xpos horizontal chroma sample position
+ * @param ypos vertical chroma sample position
+ */
+enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos);
+
+/**
+ * Decode the audio frame of size avpkt->size from avpkt->data into frame.
+ *
+ * Some decoders may support multiple frames in a single AVPacket. Such
+ * decoders would then just decode the first frame and the return value would be
+ * less than the packet size. In this case, avcodec_decode_audio4 has to be
+ * called again with an AVPacket containing the remaining data in order to
+ * decode the second frame, etc... Even if no frames are returned, the packet
+ * needs to be fed to the decoder with remaining data until it is completely
+ * consumed or an error occurs.
+ *
+ * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input
+ * and output. This means that for some packets they will not immediately
+ * produce decoded output and need to be flushed at the end of decoding to get
+ * all the decoded data. Flushing is done by calling this function with packets
+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops
+ * returning samples. It is safe to flush even those decoders that are not
+ * marked with AV_CODEC_CAP_DELAY, then no samples will be returned.
+ *
+ * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE
+ * larger than the actual read bytes because some optimized bitstream
+ * readers read 32 or 64 bits at once and could read over the end.
+ *
+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
+ * before packets may be fed to the decoder.
+ *
+ * @param avctx the codec context
+ * @param[out] frame The AVFrame in which to store decoded audio samples.
+ * The decoder will allocate a buffer for the decoded frame by
+ * calling the AVCodecContext.get_buffer2() callback.
+ * When AVCodecContext.refcounted_frames is set to 1, the frame is
+ * reference counted and the returned reference belongs to the
+ * caller. The caller must release the frame using av_frame_unref()
+ * when the frame is no longer needed. The caller may safely write
+ * to the frame if av_frame_is_writable() returns 1.
+ * When AVCodecContext.refcounted_frames is set to 0, the returned
+ * reference belongs to the decoder and is valid only until the
+ * next call to this function or until closing or flushing the
+ * decoder. The caller may not write to it.
+ * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is
+ * non-zero. Note that this field being set to zero
+ * does not mean that an error has occurred. For
+ * decoders with AV_CODEC_CAP_DELAY set, no given decode
+ * call is guaranteed to produce a frame.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * At least avpkt->data and avpkt->size should be set. Some
+ * decoders might also require additional fields to be set.
+ * @return A negative error code is returned if an error occurred during
+ * decoding, otherwise the number of bytes consumed from the input
+ * AVPacket is returned.
+ */
+int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
+ int *got_frame_ptr, const AVPacket *avpkt);
+
+/**
+ * Decode the video frame of size avpkt->size from avpkt->data into picture.
+ * Some decoders may support multiple frames in a single AVPacket, such
+ * decoders would then just decode the first frame.
+ *
+ * @warning The input buffer must be AV_INPUT_BUFFER_PADDING_SIZE larger than
+ * the actual read bytes because some optimized bitstream readers read 32 or 64
+ * bits at once and could read over the end.
+ *
+ * @warning The end of the input buffer buf should be set to 0 to ensure that
+ * no overreading happens for damaged MPEG streams.
+ *
+ * @note Codecs which have the AV_CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
+ * before packets may be fed to the decoder.
+ *
+ * @param avctx the codec context
+ * @param[out] picture The AVFrame in which the decoded video frame will be stored.
+ * Use av_frame_alloc() to get an AVFrame. The codec will
+ * allocate memory for the actual bitmap by calling the
+ * AVCodecContext.get_buffer2() callback.
+ * When AVCodecContext.refcounted_frames is set to 1, the frame is
+ * reference counted and the returned reference belongs to the
+ * caller. The caller must release the frame using av_frame_unref()
+ * when the frame is no longer needed. The caller may safely write
+ * to the frame if av_frame_is_writable() returns 1.
+ * When AVCodecContext.refcounted_frames is set to 0, the returned
+ * reference belongs to the decoder and is valid only until the
+ * next call to this function or until closing or flushing the
+ * decoder. The caller may not write to it.
+ *
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * You can create such packet with av_init_packet() and by then setting
+ * data and size, some decoders might in addition need other fields like
+ * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least
+ * fields possible.
+ * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame could be decompressed.
+ */
+int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
+ int *got_picture_ptr,
+ const AVPacket *avpkt);
+
+/**
+ * Decode a subtitle message.
+ * Return a negative value on error, otherwise return the number of bytes used.
+ * If no subtitle could be decompressed, got_sub_ptr is zero.
+ * Otherwise, the subtitle is stored in *sub.
+ * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for
+ * simplicity, because the performance difference is expect to be negligible
+ * and reusing a get_buffer written for video codecs would probably perform badly
+ * due to a potentially very different allocation pattern.
+ *
+ * Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input
+ * and output. This means that for some packets they will not immediately
+ * produce decoded output and need to be flushed at the end of decoding to get
+ * all the decoded data. Flushing is done by calling this function with packets
+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops
+ * returning subtitles. It is safe to flush even those decoders that are not
+ * marked with CODEC_CAP_DELAY, then no subtitles will be returned.
+ *
+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
+ * before packets may be fed to the decoder.
+ *
+ * @param avctx the codec context
+ * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored,
+ * must be freed with avsubtitle_free if *got_sub_ptr is set.
+ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ */
+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+ int *got_sub_ptr,
+ AVPacket *avpkt);
+
+/**
+ * @defgroup lavc_parsing Frame parsing
+ * @{
+ */
+
+enum AVPictureStructure {
+ AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown
+ AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field
+ AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field
+ AV_PICTURE_STRUCTURE_FRAME, //< coded as frame
+};
+
+typedef struct AVCodecParserContext {
+ void *priv_data;
+ struct AVCodecParser *parser;
+ int64_t frame_offset; /* offset of the current frame */
+ int64_t cur_offset; /* current offset
+ (incremented by each av_parser_parse()) */
+ int64_t next_frame_offset; /* offset of the next frame */
+ /* video info */
+ int pict_type; /* XXX: Put it back in AVCodecContext. */
+ /**
+ * This field is used for proper frame duration computation in lavf.
+ * It signals, how much longer the frame duration of the current frame
+ * is compared to normal frame duration.
+ *
+ * frame_duration = (1 + repeat_pict) * time_base
+ *
+ * It is used by codecs like H.264 to display telecined material.
+ */
+ int repeat_pict; /* XXX: Put it back in AVCodecContext. */
+ int64_t pts; /* pts of the current frame */
+ int64_t dts; /* dts of the current frame */
+
+ /* private data */
+ int64_t last_pts;
+ int64_t last_dts;
+ int fetch_timestamp;
+
+#define AV_PARSER_PTS_NB 4
+ int cur_frame_start_index;
+ int64_t cur_frame_offset[AV_PARSER_PTS_NB];
+ int64_t cur_frame_pts[AV_PARSER_PTS_NB];
+ int64_t cur_frame_dts[AV_PARSER_PTS_NB];
+
+ int flags;
+#define PARSER_FLAG_COMPLETE_FRAMES 0x0001
+#define PARSER_FLAG_ONCE 0x0002
+/// Set if the parser has a valid file offset
+#define PARSER_FLAG_FETCHED_OFFSET 0x0004
+#define PARSER_FLAG_USE_CODEC_TS 0x1000
+
+ int64_t offset; ///< byte offset from starting packet start
+ int64_t cur_frame_end[AV_PARSER_PTS_NB];
+
+ /**
+ * Set by parser to 1 for key frames and 0 for non-key frames.
+ * It is initialized to -1, so if the parser doesn't set this flag,
+ * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames
+ * will be used.
+ */
+ int key_frame;
+
+#if FF_API_CONVERGENCE_DURATION
+ /**
+ * @deprecated unused
+ */
+ attribute_deprecated
+ int64_t convergence_duration;
+#endif
+
+ // Timestamp generation support:
+ /**
+ * Synchronization point for start of timestamp generation.
+ *
+ * Set to >0 for sync point, 0 for no sync point and <0 for undefined
+ * (default).
+ *
+ * For example, this corresponds to presence of H.264 buffering period
+ * SEI message.
+ */
+ int dts_sync_point;
+
+ /**
+ * Offset of the current timestamp against last timestamp sync point in
+ * units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain a valid timestamp offset.
+ *
+ * Note that the timestamp of sync point has usually a nonzero
+ * dts_ref_dts_delta, which refers to the previous sync point. Offset of
+ * the next frame after timestamp sync point will be usually 1.
+ *
+ * For example, this corresponds to H.264 cpb_removal_delay.
+ */
+ int dts_ref_dts_delta;
+
+ /**
+ * Presentation delay of current frame in units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain valid non-negative timestamp delta (presentation time of a frame
+ * must not lie in the past).
+ *
+ * This delay represents the difference between decoding and presentation
+ * time of the frame.
+ *
+ * For example, this corresponds to H.264 dpb_output_delay.
+ */
+ int pts_dts_delta;
+
+ /**
+ * Position of the packet in file.
+ *
+ * Analogous to cur_frame_pts/dts
+ */
+ int64_t cur_frame_pos[AV_PARSER_PTS_NB];
+
+ /**
+ * Byte position of currently parsed frame in stream.
+ */
+ int64_t pos;
+
+ /**
+ * Previous frame byte position.
+ */
+ int64_t last_pos;
+
+ /**
+ * Duration of the current frame.
+ * For audio, this is in units of 1 / AVCodecContext.sample_rate.
+ * For all other types, this is in units of AVCodecContext.time_base.
+ */
+ int duration;
+
+ enum AVFieldOrder field_order;
+
+ /**
+ * Indicate whether a picture is coded as a frame, top field or bottom field.
+ *
+ * For example, H.264 field_pic_flag equal to 0 corresponds to
+ * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag
+ * equal to 1 and bottom_field_flag equal to 0 corresponds to
+ * AV_PICTURE_STRUCTURE_TOP_FIELD.
+ */
+ enum AVPictureStructure picture_structure;
+
+ /**
+ * Picture number incremented in presentation or output order.
+ * This field may be reinitialized at the first picture of a new sequence.
+ *
+ * For example, this corresponds to H.264 PicOrderCnt.
+ */
+ int output_picture_number;
+
+ /**
+ * Dimensions of the decoded video intended for presentation.
+ */
+ int width;
+ int height;
+
+ /**
+ * Dimensions of the coded video.
+ */
+ int coded_width;
+ int coded_height;
+
+ /**
+ * The format of the coded data, corresponds to enum AVPixelFormat for video
+ * and for enum AVSampleFormat for audio.
+ *
+ * Note that a decoder can have considerable freedom in how exactly it
+ * decodes the data, so the format reported here might be different from the
+ * one returned by a decoder.
+ */
+ int format;
+} AVCodecParserContext;
+
+typedef struct AVCodecParser {
+ int codec_ids[5]; /* several codec IDs are permitted */
+ int priv_data_size;
+ int (*parser_init)(AVCodecParserContext *s);
+ /* This callback never returns an error, a negative value means that
+ * the frame start was in a previous packet. */
+ int (*parser_parse)(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ const uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size);
+ void (*parser_close)(AVCodecParserContext *s);
+ int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
+ struct AVCodecParser *next;
+} AVCodecParser;
+
+AVCodecParser *av_parser_next(const AVCodecParser *c);
+
+void av_register_codec_parser(AVCodecParser *parser);
+AVCodecParserContext *av_parser_init(int codec_id);
+
+/**
+ * Parse a packet.
+ *
+ * @param s parser context.
+ * @param avctx codec context.
+ * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished.
+ * @param poutbuf_size set to size of parsed buffer or zero if not yet finished.
+ * @param buf input buffer.
+ * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output).
+ * @param pts input presentation timestamp.
+ * @param dts input decoding timestamp.
+ * @param pos input byte position in stream.
+ * @return the number of bytes of the input bitstream used.
+ *
+ * Example:
+ * @code
+ * while(in_len){
+ * len = av_parser_parse2(myparser, AVCodecContext, &data, &size,
+ * in_data, in_len,
+ * pts, dts, pos);
+ * in_data += len;
+ * in_len -= len;
+ *
+ * if(size)
+ * decode_frame(data, size);
+ * }
+ * @endcode
+ */
+int av_parser_parse2(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size,
+ int64_t pts, int64_t dts,
+ int64_t pos);
+
+/**
+ * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
+ * @deprecated use AVBitStreamFilter
+ */
+int av_parser_change(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_parser_close(AVCodecParserContext *s);
+
+/**
+ * @}
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_encoding
+ * @{
+ */
+
+/**
+ * Find a registered encoder with a matching codec ID.
+ *
+ * @param id AVCodecID of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder(enum AVCodecID id);
+
+/**
+ * Find a registered encoder with the specified name.
+ *
+ * @param name name of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder_by_name(const char *name);
+
+/**
+ * Encode a frame of audio.
+ *
+ * Takes input samples from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay, split, and combine input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. If avpkt->data and
+ * avpkt->size are set, avpkt->destruct must also be set. All
+ * other AVPacket fields will be reset by the encoder using
+ * av_init_packet(). If avpkt->data is NULL, the encoder will
+ * allocate it. The encoder will set avpkt->size to the size
+ * of the output packet.
+ *
+ * If this function fails or produces no output, avpkt will be
+ * freed using av_packet_unref().
+ * @param[in] frame AVFrame containing the raw audio data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * AV_CODEC_CAP_DELAY capability set.
+ * If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
+ * can have any number of samples.
+ * If it is not set, frame->nb_samples must be equal to
+ * avctx->frame_size for all frames except the last.
+ * The final frame may be smaller than avctx->frame_size.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+/**
+ * Encode a frame of video.
+ *
+ * Takes input raw video data from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay and reorder input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. All other AVPacket fields
+ * will be reset by the encoder using av_init_packet(). If
+ * avpkt->data is NULL, the encoder will allocate it.
+ * The encoder will set avpkt->size to the size of the
+ * output packet. The returned data (if any) belongs to the
+ * caller, he is responsible for freeing it.
+ *
+ * If this function fails or produces no output, avpkt will be
+ * freed using av_packet_unref().
+ * @param[in] frame AVFrame containing the raw video data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * AV_CODEC_CAP_DELAY capability set.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ const AVSubtitle *sub);
+
+
+/**
+ * @}
+ */
+
+#if FF_API_AVCODEC_RESAMPLE
+/**
+ * @defgroup lavc_resample Audio resampling
+ * @ingroup libavc
+ * @deprecated use libswresample instead
+ *
+ * @{
+ */
+struct ReSampleContext;
+struct AVResampleContext;
+
+typedef struct ReSampleContext ReSampleContext;
+
+/**
+ * Initialize audio resampling context.
+ *
+ * @param output_channels number of output channels
+ * @param input_channels number of input channels
+ * @param output_rate output sample rate
+ * @param input_rate input sample rate
+ * @param sample_fmt_out requested output sample format
+ * @param sample_fmt_in input sample format
+ * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency
+ * @param log2_phase_count log2 of the number of entries in the polyphase filterbank
+ * @param linear if 1 then the used FIR filter will be linearly interpolated
+ between the 2 closest, if 0 the closest will be used
+ * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate
+ * @return allocated ReSampleContext, NULL if error occurred
+ */
+attribute_deprecated
+ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
+ int output_rate, int input_rate,
+ enum AVSampleFormat sample_fmt_out,
+ enum AVSampleFormat sample_fmt_in,
+ int filter_length, int log2_phase_count,
+ int linear, double cutoff);
+
+attribute_deprecated
+int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples);
+
+/**
+ * Free resample context.
+ *
+ * @param s a non-NULL pointer to a resample context previously
+ * created with av_audio_resample_init()
+ */
+attribute_deprecated
+void audio_resample_close(ReSampleContext *s);
+
+
+/**
+ * Initialize an audio resampler.
+ * Note, if either rate is not an integer then simply scale both rates up so they are.
+ * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq
+ * @param log2_phase_count log2 of the number of entries in the polyphase filterbank
+ * @param linear If 1 then the used FIR filter will be linearly interpolated
+ between the 2 closest, if 0 the closest will be used
+ * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate
+ */
+attribute_deprecated
+struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff);
+
+/**
+ * Resample an array of samples using a previously configured context.
+ * @param src an array of unconsumed samples
+ * @param consumed the number of samples of src which have been consumed are returned here
+ * @param src_size the number of unconsumed samples available
+ * @param dst_size the amount of space in samples available in dst
+ * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context.
+ * @return the number of samples written in dst or -1 if an error occurred
+ */
+attribute_deprecated
+int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx);
+
+
+/**
+ * Compensate samplerate/timestamp drift. The compensation is done by changing
+ * the resampler parameters, so no audible clicks or similar distortions occur
+ * @param compensation_distance distance in output samples over which the compensation should be performed
+ * @param sample_delta number of output samples which should be output less
+ *
+ * example: av_resample_compensate(c, 10, 500)
+ * here instead of 510 samples only 500 samples would be output
+ *
+ * note, due to rounding the actual compensation might be slightly different,
+ * especially if the compensation_distance is large and the in_rate used during init is small
+ */
+attribute_deprecated
+void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance);
+attribute_deprecated
+void av_resample_close(struct AVResampleContext *c);
+
+/**
+ * @}
+ */
+#endif
+
+#if FF_API_AVPICTURE
+/**
+ * @addtogroup lavc_picture
+ * @{
+ */
+
+/**
+ * @deprecated unused
+ */
+attribute_deprecated
+int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * @deprecated unused
+ */
+attribute_deprecated
+void avpicture_free(AVPicture *picture);
+
+/**
+ * @deprecated use av_image_fill_arrays() instead.
+ */
+attribute_deprecated
+int avpicture_fill(AVPicture *picture, const uint8_t *ptr,
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * @deprecated use av_image_copy_to_buffer() instead.
+ */
+attribute_deprecated
+int avpicture_layout(const AVPicture *src, enum AVPixelFormat pix_fmt,
+ int width, int height,
+ unsigned char *dest, int dest_size);
+
+/**
+ * @deprecated use av_image_get_buffer_size() instead.
+ */
+attribute_deprecated
+int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * @deprecated av_image_copy() instead.
+ */
+attribute_deprecated
+void av_picture_copy(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * @deprecated unused
+ */
+attribute_deprecated
+int av_picture_crop(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int top_band, int left_band);
+
+/**
+ * @deprecated unused
+ */
+attribute_deprecated
+int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt,
+ int padtop, int padbottom, int padleft, int padright, int *color);
+
+/**
+ * @}
+ */
+#endif
+
+/**
+ * @defgroup lavc_misc Utility functions
+ * @ingroup libavc
+ *
+ * Miscellaneous utility functions related to both encoding and decoding
+ * (or neither).
+ * @{
+ */
+
+/**
+ * @defgroup lavc_misc_pixfmt Pixel formats
+ *
+ * Functions for working with pixel formats.
+ * @{
+ */
+
+/**
+ * Utility function to access log2_chroma_w log2_chroma_h from
+ * the pixel format AVPixFmtDescriptor.
+ *
+ * This function asserts that pix_fmt is valid. See av_pix_fmt_get_chroma_sub_sample
+ * for one that returns a failure code and continues in case of invalid
+ * pix_fmts.
+ *
+ * @param[in] pix_fmt the pixel format
+ * @param[out] h_shift store log2_chroma_w
+ * @param[out] v_shift store log2_chroma_h
+ *
+ * @see av_pix_fmt_get_chroma_sub_sample
+ */
+
+void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift);
+
+/**
+ * Return a value representing the fourCC code associated to the
+ * pixel format pix_fmt, or 0 if no associated fourCC code can be
+ * found.
+ */
+unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt);
+
+/**
+ * @deprecated see av_get_pix_fmt_loss()
+ */
+int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt,
+ int has_alpha);
+
+/**
+ * Find the best pixel format to convert to given a certain source pixel
+ * format. When converting from one pixel format to another, information loss
+ * may occur. For example, when converting from RGB24 to GRAY, the color
+ * information will be lost. Similarly, other losses occur when converting from
+ * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of
+ * the given pixel formats should be used to suffer the least amount of loss.
+ * The pixel formats from which it chooses one, are determined by the
+ * pix_fmt_list parameter.
+ *
+ *
+ * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
+ * @return The best pixel format to convert to or -1 if none was found.
+ */
+enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list,
+ enum AVPixelFormat src_pix_fmt,
+ int has_alpha, int *loss_ptr);
+
+/**
+ * @deprecated see av_find_best_pix_fmt_of_2()
+ */
+enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
+ enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
+
+attribute_deprecated
+#if AV_HAVE_INCOMPATIBLE_LIBAV_ABI
+enum AVPixelFormat avcodec_find_best_pix_fmt2(const enum AVPixelFormat *pix_fmt_list,
+ enum AVPixelFormat src_pix_fmt,
+ int has_alpha, int *loss_ptr);
+#else
+enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
+ enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
+#endif
+
+
+enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
+
+/**
+ * @}
+ */
+
+#if FF_API_SET_DIMENSIONS
+/**
+ * @deprecated this function is not supposed to be used from outside of lavc
+ */
+attribute_deprecated
+void avcodec_set_dimensions(AVCodecContext *s, int width, int height);
+#endif
+
+/**
+ * Put a string representing the codec tag codec_tag in buf.
+ *
+ * @param buf buffer to place codec tag in
+ * @param buf_size size in bytes of buf
+ * @param codec_tag codec tag to assign
+ * @return the length of the string that would have been generated if
+ * enough space had been available, excluding the trailing null
+ */
+size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag);
+
+void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode);
+
+/**
+ * Return a name for the specified profile, if available.
+ *
+ * @param codec the codec that is searched for the given profile
+ * @param profile the profile value for which a name is requested
+ * @return A name for the profile if found, NULL otherwise.
+ */
+const char *av_get_profile_name(const AVCodec *codec, int profile);
+
+/**
+ * Return a name for the specified profile, if available.
+ *
+ * @param codec_id the ID of the codec to which the requested profile belongs
+ * @param profile the profile value for which a name is requested
+ * @return A name for the profile if found, NULL otherwise.
+ *
+ * @note unlike av_get_profile_name(), which searches a list of profiles
+ * supported by a specific decoder or encoder implementation, this
+ * function searches the list of profiles from the AVCodecDescriptor
+ */
+const char *avcodec_profile_name(enum AVCodecID codec_id, int profile);
+
+int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size);
+int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
+//FIXME func typedef
+
+/**
+ * Fill AVFrame audio data and linesize pointers.
+ *
+ * The buffer buf must be a preallocated buffer with a size big enough
+ * to contain the specified samples amount. The filled AVFrame data
+ * pointers will point to this buffer.
+ *
+ * AVFrame extended_data channel pointers are allocated if necessary for
+ * planar audio.
+ *
+ * @param frame the AVFrame
+ * frame->nb_samples must be set prior to calling the
+ * function. This function fills in frame->data,
+ * frame->extended_data, frame->linesize[0].
+ * @param nb_channels channel count
+ * @param sample_fmt sample format
+ * @param buf buffer to use for frame data
+ * @param buf_size size of buffer
+ * @param align plane size sample alignment (0 = default)
+ * @return >=0 on success, negative error code on failure
+ * @todo return the size in bytes required to store the samples in
+ * case of success, at the next libavutil bump
+ */
+int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
+ enum AVSampleFormat sample_fmt, const uint8_t *buf,
+ int buf_size, int align);
+
+/**
+ * Reset the internal decoder state / flush internal buffers. Should be called
+ * e.g. when seeking or when switching to a different stream.
+ *
+ * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0),
+ * this invalidates the frames previously returned from the decoder. When
+ * refcounted frames are used, the decoder just releases any references it might
+ * keep internally, but the caller's reference remains valid.
+ */
+void avcodec_flush_buffers(AVCodecContext *avctx);
+
+/**
+ * Return codec bits per sample.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_bits_per_sample(enum AVCodecID codec_id);
+
+/**
+ * Return the PCM codec associated with a sample format.
+ * @param be endianness, 0 for little, 1 for big,
+ * -1 (or anything else) for native
+ * @return AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE
+ */
+enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be);
+
+/**
+ * Return codec bits per sample.
+ * Only return non-zero if the bits per sample is exactly correct, not an
+ * approximation.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_exact_bits_per_sample(enum AVCodecID codec_id);
+
+/**
+ * Return audio frame duration.
+ *
+ * @param avctx codec context
+ * @param frame_bytes size of the frame, or 0 if unknown
+ * @return frame duration, in samples, if known. 0 if not able to
+ * determine.
+ */
+int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes);
+
+
+typedef struct AVBitStreamFilterContext {
+ void *priv_data;
+ struct AVBitStreamFilter *filter;
+ AVCodecParserContext *parser;
+ struct AVBitStreamFilterContext *next;
+ /**
+ * Internal default arguments, used if NULL is passed to av_bitstream_filter_filter().
+ * Not for access by library users.
+ */
+ char *args;
+} AVBitStreamFilterContext;
+
+
+typedef struct AVBitStreamFilter {
+ const char *name;
+ int priv_data_size;
+ int (*filter)(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+ void (*close)(AVBitStreamFilterContext *bsfc);
+ struct AVBitStreamFilter *next;
+} AVBitStreamFilter;
+
+/**
+ * Register a bitstream filter.
+ *
+ * The filter will be accessible to the application code through
+ * av_bitstream_filter_next() or can be directly initialized with
+ * av_bitstream_filter_init().
+ *
+ * @see avcodec_register_all()
+ */
+void av_register_bitstream_filter(AVBitStreamFilter *bsf);
+
+/**
+ * Create and initialize a bitstream filter context given a bitstream
+ * filter name.
+ *
+ * The returned context must be freed with av_bitstream_filter_close().
+ *
+ * @param name the name of the bitstream filter
+ * @return a bitstream filter context if a matching filter was found
+ * and successfully initialized, NULL otherwise
+ */
+AVBitStreamFilterContext *av_bitstream_filter_init(const char *name);
+
+/**
+ * Filter bitstream.
+ *
+ * This function filters the buffer buf with size buf_size, and places the
+ * filtered buffer in the buffer pointed to by poutbuf.
+ *
+ * The output buffer must be freed by the caller.
+ *
+ * @param bsfc bitstream filter context created by av_bitstream_filter_init()
+ * @param avctx AVCodecContext accessed by the filter, may be NULL.
+ * If specified, this must point to the encoder context of the
+ * output stream the packet is sent to.
+ * @param args arguments which specify the filter configuration, may be NULL
+ * @param poutbuf pointer which is updated to point to the filtered buffer
+ * @param poutbuf_size pointer which is updated to the filtered buffer size in bytes
+ * @param buf buffer containing the data to filter
+ * @param buf_size size in bytes of buf
+ * @param keyframe set to non-zero if the buffer to filter corresponds to a key-frame packet data
+ * @return >= 0 in case of success, or a negative error code in case of failure
+ *
+ * If the return value is positive, an output buffer is allocated and
+ * is available in *poutbuf, and is distinct from the input buffer.
+ *
+ * If the return value is 0, the output buffer is not allocated and
+ * should be considered identical to the input buffer, or in case
+ * *poutbuf was set it points to the input buffer (not necessarily to
+ * its starting address).
+ */
+int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+
+/**
+ * Release bitstream filter context.
+ *
+ * @param bsf the bitstream filter context created with
+ * av_bitstream_filter_init(), can be NULL
+ */
+void av_bitstream_filter_close(AVBitStreamFilterContext *bsf);
+
+/**
+ * If f is NULL, return the first registered bitstream filter,
+ * if f is non-NULL, return the next registered bitstream filter
+ * after f, or NULL if f is the last one.
+ *
+ * This function can be used to iterate over all registered bitstream
+ * filters.
+ */
+AVBitStreamFilter *av_bitstream_filter_next(const AVBitStreamFilter *f);
+
+/* memory */
+
+/**
+ * Same behaviour av_fast_malloc but the buffer has additional
+ * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0.
+ *
+ * In addition the whole buffer will initially and after resizes
+ * be 0-initialized so that no uninitialized data will ever appear.
+ */
+void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Same behaviour av_fast_padded_malloc except that buffer will always
+ * be 0-initialized after call.
+ */
+void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Encode extradata length to a buffer. Used by xiph codecs.
+ *
+ * @param s buffer to write to; must be at least (v/255+1) bytes long
+ * @param v size of extradata in bytes
+ * @return number of bytes written to the buffer.
+ */
+unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
+
+#if FF_API_MISSING_SAMPLE
+/**
+ * Log a generic warning message about a missing feature. This function is
+ * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] feature string containing the name of the missing feature
+ * @param[in] want_sample indicates if samples are wanted which exhibit this feature.
+ * If want_sample is non-zero, additional verbage will be added to the log
+ * message which tells the user how to report samples to the development
+ * mailing list.
+ * @deprecated Use avpriv_report_missing_feature() instead.
+ */
+attribute_deprecated
+void av_log_missing_feature(void *avc, const char *feature, int want_sample);
+
+/**
+ * Log a generic warning message asking for a sample. This function is
+ * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] msg string containing an optional message, or NULL if no message
+ * @deprecated Use avpriv_request_sample() instead.
+ */
+attribute_deprecated
+void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3);
+#endif /* FF_API_MISSING_SAMPLE */
+
+/**
+ * Register the hardware accelerator hwaccel.
+ */
+void av_register_hwaccel(AVHWAccel *hwaccel);
+
+/**
+ * If hwaccel is NULL, returns the first registered hardware accelerator,
+ * if hwaccel is non-NULL, returns the next registered hardware accelerator
+ * after hwaccel, or NULL if hwaccel is the last one.
+ */
+AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel);
+
+
+/**
+ * Lock operation used by lockmgr
+ */
+enum AVLockOp {
+ AV_LOCK_CREATE, ///< Create a mutex
+ AV_LOCK_OBTAIN, ///< Lock the mutex
+ AV_LOCK_RELEASE, ///< Unlock the mutex
+ AV_LOCK_DESTROY, ///< Free mutex resources
+};
+
+/**
+ * Register a user provided lock manager supporting the operations
+ * specified by AVLockOp. The "mutex" argument to the function points
+ * to a (void *) where the lockmgr should store/get a pointer to a user
+ * allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the
+ * value left by the last call for all other ops. If the lock manager is
+ * unable to perform the op then it should leave the mutex in the same
+ * state as when it was called and return a non-zero value. However,
+ * when called with AV_LOCK_DESTROY the mutex will always be assumed to
+ * have been successfully destroyed. If av_lockmgr_register succeeds
+ * it will return a non-negative value, if it fails it will return a
+ * negative value and destroy all mutex and unregister all callbacks.
+ * av_lockmgr_register is not thread-safe, it must be called from a
+ * single thread before any calls which make use of locking are used.
+ *
+ * @param cb User defined callback. av_lockmgr_register invokes calls
+ * to this callback and the previously registered callback.
+ * The callback will be used to create more than one mutex
+ * each of which must be backed by its own underlying locking
+ * mechanism (i.e. do not use a single static object to
+ * implement your lock manager). If cb is set to NULL the
+ * lockmgr will be unregistered.
+ */
+int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
+
+/**
+ * Get the type of the given codec.
+ */
+enum AVMediaType avcodec_get_type(enum AVCodecID codec_id);
+
+/**
+ * Get the name of a codec.
+ * @return a static string identifying the codec; never NULL
+ */
+const char *avcodec_get_name(enum AVCodecID id);
+
+/**
+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+ * with no corresponding avcodec_close()), 0 otherwise.
+ */
+int avcodec_is_open(AVCodecContext *s);
+
+/**
+ * @return a non-zero number if codec is an encoder, zero otherwise
+ */
+int av_codec_is_encoder(const AVCodec *codec);
+
+/**
+ * @return a non-zero number if codec is a decoder, zero otherwise
+ */
+int av_codec_is_decoder(const AVCodec *codec);
+
+/**
+ * @return descriptor for given codec ID or NULL if no descriptor exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
+
+/**
+ * Iterate over all codec descriptors known to libavcodec.
+ *
+ * @param prev previous descriptor. NULL to get the first descriptor.
+ *
+ * @return next descriptor or NULL after the last descriptor
+ */
+const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
+
+/**
+ * @return codec descriptor with the given name or NULL if no such descriptor
+ * exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
+
+/**
+ * Allocate a CPB properties structure and initialize its fields to default
+ * values.
+ *
+ * @param size if non-NULL, the size of the allocated struct will be written
+ * here. This is useful for embedding it in side data.
+ *
+ * @return the newly allocated struct or NULL on failure
+ */
+AVCPBProperties *av_cpb_properties_alloc(size_t *size);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_AVCODEC_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avfft.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avfft.h
new file mode 100644
index 000000000..0c0f9b8d8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/avfft.h
@@ -0,0 +1,118 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVFFT_H
+#define AVCODEC_AVFFT_H
+
+/**
+ * @file
+ * @ingroup lavc_fft
+ * FFT functions
+ */
+
+/**
+ * @defgroup lavc_fft FFT functions
+ * @ingroup lavc_misc
+ *
+ * @{
+ */
+
+typedef float FFTSample;
+
+typedef struct FFTComplex {
+ FFTSample re, im;
+} FFTComplex;
+
+typedef struct FFTContext FFTContext;
+
+/**
+ * Set up a complex FFT.
+ * @param nbits log2 of the length of the input array
+ * @param inverse if 0 perform the forward transform, if 1 perform the inverse
+ */
+FFTContext *av_fft_init(int nbits, int inverse);
+
+/**
+ * Do the permutation needed BEFORE calling ff_fft_calc().
+ */
+void av_fft_permute(FFTContext *s, FFTComplex *z);
+
+/**
+ * Do a complex FFT with the parameters defined in av_fft_init(). The
+ * input data must be permuted before. No 1.0/sqrt(n) normalization is done.
+ */
+void av_fft_calc(FFTContext *s, FFTComplex *z);
+
+void av_fft_end(FFTContext *s);
+
+FFTContext *av_mdct_init(int nbits, int inverse, double scale);
+void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_end(FFTContext *s);
+
+/* Real Discrete Fourier Transform */
+
+enum RDFTransformType {
+ DFT_R2C,
+ IDFT_C2R,
+ IDFT_R2C,
+ DFT_C2R,
+};
+
+typedef struct RDFTContext RDFTContext;
+
+/**
+ * Set up a real FFT.
+ * @param nbits log2 of the length of the input array
+ * @param trans the type of transform
+ */
+RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
+void av_rdft_calc(RDFTContext *s, FFTSample *data);
+void av_rdft_end(RDFTContext *s);
+
+/* Discrete Cosine Transform */
+
+typedef struct DCTContext DCTContext;
+
+enum DCTTransformType {
+ DCT_II = 0,
+ DCT_III,
+ DCT_I,
+ DST_I,
+};
+
+/**
+ * Set up DCT.
+ *
+ * @param nbits size of the input array:
+ * (1 << nbits) for DCT-II, DCT-III and DST-I
+ * (1 << nbits) + 1 for DCT-I
+ * @param type the type of transform
+ *
+ * @note the first element of the input of DST-I is ignored
+ */
+DCTContext *av_dct_init(int nbits, enum DCTTransformType type);
+void av_dct_calc(DCTContext *s, FFTSample *data);
+void av_dct_end (DCTContext *s);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_AVFFT_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vaapi.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vaapi.h
new file mode 100644
index 000000000..7a29f6f88
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vaapi.h
@@ -0,0 +1,189 @@
+/*
+ * Video Acceleration API (shared data between FFmpeg and the video player)
+ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
+ *
+ * Copyright (C) 2008-2009 Splitted-Desktop Systems
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VAAPI_H
+#define AVCODEC_VAAPI_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vaapi
+ * Public libavcodec VA API header.
+ */
+
+#include <stdint.h>
+#include "libavutil/attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
+ * @ingroup lavc_codec_hwaccel
+ * @{
+ */
+
+/**
+ * This structure is used to share data between the FFmpeg library and
+ * the client video application.
+ * This shall be zero-allocated and available as
+ * AVCodecContext.hwaccel_context. All user members can be set once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ */
+struct vaapi_context {
+ /**
+ * Window system dependent data
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *display;
+
+ /**
+ * Configuration ID
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t config_id;
+
+ /**
+ * Context ID (video decode pipeline)
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t context_id;
+
+#if FF_API_VAAPI_CONTEXT
+ /**
+ * VAPictureParameterBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ uint32_t pic_param_buf_id;
+
+ /**
+ * VAIQMatrixBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ uint32_t iq_matrix_buf_id;
+
+ /**
+ * VABitPlaneBuffer ID (for VC-1 decoding)
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ uint32_t bitplane_buf_id;
+
+ /**
+ * Slice parameter/data buffer IDs
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ uint32_t *slice_buf_ids;
+
+ /**
+ * Number of effective slice buffer IDs to send to the HW
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ unsigned int n_slice_buf_ids;
+
+ /**
+ * Size of pre-allocated slice_buf_ids
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ unsigned int slice_buf_ids_alloc;
+
+ /**
+ * Pointer to VASliceParameterBuffers
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ void *slice_params;
+
+ /**
+ * Size of a VASliceParameterBuffer element
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ unsigned int slice_param_size;
+
+ /**
+ * Size of pre-allocated slice_params
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ unsigned int slice_params_alloc;
+
+ /**
+ * Number of slices currently filled in
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ unsigned int slice_count;
+
+ /**
+ * Pointer to slice data buffer base
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ const uint8_t *slice_data;
+
+ /**
+ * Current size of slice data
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ attribute_deprecated
+ uint32_t slice_data_size;
+#endif
+};
+
+/* @} */
+
+#endif /* AVCODEC_VAAPI_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vdpau.h
new file mode 100644
index 000000000..e85e4d9e9
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/vdpau.h
@@ -0,0 +1,253 @@
+/*
+ * The Video Decode and Presentation API for UNIX (VDPAU) is used for
+ * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.
+ *
+ * Copyright (C) 2008 NVIDIA
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDPAU_H
+#define AVCODEC_VDPAU_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vdpau
+ * Public libavcodec VDPAU header.
+ */
+
+
+/**
+ * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer
+ * @ingroup lavc_codec_hwaccel
+ *
+ * VDPAU hardware acceleration has two modules
+ * - VDPAU decoding
+ * - VDPAU presentation
+ *
+ * The VDPAU decoding module parses all headers using FFmpeg
+ * parsing mechanisms and uses VDPAU for the actual decoding.
+ *
+ * As per the current implementation, the actual decoding
+ * and rendering (API calls) are done as part of the VDPAU
+ * presentation (vo_vdpau.c) module.
+ *
+ * @{
+ */
+
+#include <vdpau/vdpau.h>
+#include <vdpau/vdpau_x11.h>
+#include "libavutil/avconfig.h"
+#include "libavutil/attributes.h"
+
+#include "avcodec.h"
+#include "version.h"
+
+#if FF_API_BUFS_VDPAU
+union AVVDPAUPictureInfo {
+ VdpPictureInfoH264 h264;
+ VdpPictureInfoMPEG1Or2 mpeg;
+ VdpPictureInfoVC1 vc1;
+ VdpPictureInfoMPEG4Part2 mpeg4;
+};
+#endif
+
+struct AVCodecContext;
+struct AVFrame;
+
+typedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *,
+ const VdpPictureInfo *, uint32_t,
+ const VdpBitstreamBuffer *);
+
+/**
+ * This structure is used to share data between the libavcodec library and
+ * the client video application.
+ * The user shall allocate the structure via the av_alloc_vdpau_hwaccel
+ * function and make it available as
+ * AVCodecContext.hwaccel_context. Members can be set by the user once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ *
+ * The size of this structure is not a part of the public ABI and must not
+ * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an
+ * AVVDPAUContext.
+ */
+typedef struct AVVDPAUContext {
+ /**
+ * VDPAU decoder handle
+ *
+ * Set by user.
+ */
+ VdpDecoder decoder;
+
+ /**
+ * VDPAU decoder render callback
+ *
+ * Set by the user.
+ */
+ VdpDecoderRender *render;
+
+#if FF_API_BUFS_VDPAU
+ /**
+ * VDPAU picture information
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ union AVVDPAUPictureInfo info;
+
+ /**
+ * Allocated size of the bitstream_buffers table.
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ int bitstream_buffers_allocated;
+
+ /**
+ * Useful bitstream buffers in the bitstream buffers table.
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ int bitstream_buffers_used;
+
+ /**
+ * Table of bitstream buffers.
+ * The user is responsible for freeing this buffer using av_freep().
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ VdpBitstreamBuffer *bitstream_buffers;
+#endif
+ AVVDPAU_Render2 render2;
+} AVVDPAUContext;
+
+/**
+ * @brief allocation function for AVVDPAUContext
+ *
+ * Allows extending the struct without breaking API/ABI
+ */
+AVVDPAUContext *av_alloc_vdpaucontext(void);
+
+AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext *);
+void av_vdpau_hwaccel_set_render2(AVVDPAUContext *, AVVDPAU_Render2);
+
+/**
+ * Associate a VDPAU device with a codec context for hardware acceleration.
+ * This function is meant to be called from the get_format() codec callback,
+ * or earlier. It can also be called after avcodec_flush_buffers() to change
+ * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent
+ * display preemption).
+ *
+ * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes
+ * successfully.
+ *
+ * @param avctx decoding context whose get_format() callback is invoked
+ * @param device VDPAU device handle to use for hardware acceleration
+ * @param get_proc_address VDPAU device driver
+ * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags
+ *
+ * @return 0 on success, an AVERROR code on failure.
+ */
+int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
+ VdpGetProcAddress *get_proc_address, unsigned flags);
+
+/**
+ * Gets the parameters to create an adequate VDPAU video surface for the codec
+ * context using VDPAU hardware decoding acceleration.
+ *
+ * @note Behavior is undefined if the context was not successfully bound to a
+ * VDPAU device using av_vdpau_bind_context().
+ *
+ * @param avctx the codec context being used for decoding the stream
+ * @param type storage space for the VDPAU video surface chroma type
+ * (or NULL to ignore)
+ * @param width storage space for the VDPAU video surface pixel width
+ * (or NULL to ignore)
+ * @param height storage space for the VDPAU video surface pixel height
+ * (or NULL to ignore)
+ *
+ * @return 0 on success, a negative AVERROR code on failure.
+ */
+int av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type,
+ uint32_t *width, uint32_t *height);
+
+/**
+ * Allocate an AVVDPAUContext.
+ *
+ * @return Newly-allocated AVVDPAUContext or NULL on failure.
+ */
+AVVDPAUContext *av_vdpau_alloc_context(void);
+
+#if FF_API_VDPAU_PROFILE
+/**
+ * Get a decoder profile that should be used for initializing a VDPAU decoder.
+ * Should be called from the AVCodecContext.get_format() callback.
+ *
+ * @deprecated Use av_vdpau_bind_context() instead.
+ *
+ * @param avctx the codec context being used for decoding the stream
+ * @param profile a pointer into which the result will be written on success.
+ * The contents of profile are undefined if this function returns
+ * an error.
+ *
+ * @return 0 on success (non-negative), a negative AVERROR on failure.
+ */
+attribute_deprecated
+int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile);
+#endif
+
+#if FF_API_CAP_VDPAU
+/** @brief The videoSurface is used for rendering. */
+#define FF_VDPAU_STATE_USED_FOR_RENDER 1
+
+/**
+ * @brief The videoSurface is needed for reference/prediction.
+ * The codec manipulates this.
+ */
+#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2
+
+/**
+ * @brief This structure is used as a callback between the FFmpeg
+ * decoder (vd_) and presentation (vo_) module.
+ * This is used for defining a video frame containing surface,
+ * picture parameter, bitstream information etc which are passed
+ * between the FFmpeg decoder and its clients.
+ */
+struct vdpau_render_state {
+ VdpVideoSurface surface; ///< Used as rendered surface, never changed.
+
+ int state; ///< Holds FF_VDPAU_STATE_* values.
+
+ /** picture parameter information for all supported codecs */
+ union AVVDPAUPictureInfo info;
+
+ /** Describe size/location of the compressed video data.
+ Set to 0 when freeing bitstream_buffers. */
+ int bitstream_buffers_allocated;
+ int bitstream_buffers_used;
+ /** The user is responsible for freeing this buffer using av_freep(). */
+ VdpBitstreamBuffer *bitstream_buffers;
+};
+#endif
+
+/* @}*/
+
+#endif /* AVCODEC_VDPAU_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/version.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/version.h
new file mode 100644
index 000000000..2b01e6f91
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavcodec/version.h
@@ -0,0 +1,210 @@
+/*
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VERSION_H
+#define AVCODEC_VERSION_H
+
+/**
+ * @file
+ * @ingroup libavc
+ * Libavcodec version macros.
+ */
+
+#include "libavutil/version.h"
+
+#define LIBAVCODEC_VERSION_MAJOR 57
+#define LIBAVCODEC_VERSION_MINOR 22
+#define LIBAVCODEC_VERSION_MICRO 100
+
+#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
+
+#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
+
+/**
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *
+ * @note, when bumping the major version it is recommended to manually
+ * disable each FF_API_* in its own commit instead of disabling them all
+ * at once through the bump. This improves the git bisect-ability of the change.
+ */
+
+#ifndef FF_API_VIMA_DECODER
+#define FF_API_VIMA_DECODER (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_AUDIO_CONVERT
+#define FF_API_AUDIO_CONVERT (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_AVCODEC_RESAMPLE
+#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT
+#endif
+#ifndef FF_API_MISSING_SAMPLE
+#define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_LOWRES
+#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_CAP_VDPAU
+#define FF_API_CAP_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_BUFS_VDPAU
+#define FF_API_BUFS_VDPAU (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_VOXWARE
+#define FF_API_VOXWARE (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_SET_DIMENSIONS
+#define FF_API_SET_DIMENSIONS (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_DEBUG_MV
+#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_AC_VLC
+#define FF_API_AC_VLC (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_OLD_MSMPEG4
+#define FF_API_OLD_MSMPEG4 (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_ASPECT_EXTENDED
+#define FF_API_ASPECT_EXTENDED (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_ARCH_ALPHA
+#define FF_API_ARCH_ALPHA (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_XVMC
+#define FF_API_XVMC (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_ERROR_RATE
+#define FF_API_ERROR_RATE (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_QSCALE_TYPE
+#define FF_API_QSCALE_TYPE (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_MB_TYPE
+#define FF_API_MB_TYPE (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_MAX_BFRAMES
+#define FF_API_MAX_BFRAMES (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_NEG_LINESIZES
+#define FF_API_NEG_LINESIZES (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_EMU_EDGE
+#define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_ARCH_SH4
+#define FF_API_ARCH_SH4 (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_ARCH_SPARC
+#define FF_API_ARCH_SPARC (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_UNUSED_MEMBERS
+#define FF_API_UNUSED_MEMBERS (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_IDCT_XVIDMMX
+#define FF_API_IDCT_XVIDMMX (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_INPUT_PRESERVED
+#define FF_API_INPUT_PRESERVED (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_NORMALIZE_AQP
+#define FF_API_NORMALIZE_AQP (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_GMC
+#define FF_API_GMC (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_MV0
+#define FF_API_MV0 (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_CODEC_NAME
+#define FF_API_CODEC_NAME (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_AFD
+#define FF_API_AFD (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_VISMV
+/* XXX: don't forget to drop the -vismv documentation */
+#define FF_API_VISMV (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_AUDIOENC_DELAY
+#define FF_API_AUDIOENC_DELAY (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_VAAPI_CONTEXT
+#define FF_API_VAAPI_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 58)
+#endif
+#ifndef FF_API_AVCTX_TIMEBASE
+#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_MPV_OPT
+#define FF_API_MPV_OPT (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_STREAM_CODEC_TAG
+#define FF_API_STREAM_CODEC_TAG (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_QUANT_BIAS
+#define FF_API_QUANT_BIAS (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_RC_STRATEGY
+#define FF_API_RC_STRATEGY (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_CODED_FRAME
+#define FF_API_CODED_FRAME (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_MOTION_EST
+#define FF_API_MOTION_EST (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_WITHOUT_PREFIX
+#define FF_API_WITHOUT_PREFIX (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_SIDEDATA_ONLY_PKT
+#define FF_API_SIDEDATA_ONLY_PKT (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_VDPAU_PROFILE
+#define FF_API_VDPAU_PROFILE (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_CONVERGENCE_DURATION
+#define FF_API_CONVERGENCE_DURATION (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_AVPICTURE
+#define FF_API_AVPICTURE (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_AVPACKET_OLD_API
+#define FF_API_AVPACKET_OLD_API (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_RTP_CALLBACK
+#define FF_API_RTP_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_VBV_DELAY
+#define FF_API_VBV_DELAY (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_CODER_TYPE
+#define FF_API_CODER_TYPE (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_STAT_BITS
+#define FF_API_STAT_BITS (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
+
+#endif /* AVCODEC_VERSION_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/attributes.h
new file mode 100644
index 000000000..5c6b9deec
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/attributes.h
@@ -0,0 +1,168 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Macro definitions for various function/variable attributes
+ */
+
+#ifndef AVUTIL_ATTRIBUTES_H
+#define AVUTIL_ATTRIBUTES_H
+
+#ifdef __GNUC__
+# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))
+# define AV_GCC_VERSION_AT_MOST(x,y) (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y))
+#else
+# define AV_GCC_VERSION_AT_LEAST(x,y) 0
+# define AV_GCC_VERSION_AT_MOST(x,y) 0
+#endif
+
+#ifndef av_always_inline
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_always_inline __attribute__((always_inline)) inline
+#elif defined(_MSC_VER)
+# define av_always_inline __forceinline
+#else
+# define av_always_inline inline
+#endif
+#endif
+
+#ifndef av_extern_inline
+#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__)
+# define av_extern_inline extern inline
+#else
+# define av_extern_inline inline
+#endif
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,4)
+# define av_warn_unused_result __attribute__((warn_unused_result))
+#else
+# define av_warn_unused_result
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_noinline __attribute__((noinline))
+#elif defined(_MSC_VER)
+# define av_noinline __declspec(noinline)
+#else
+# define av_noinline
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_pure __attribute__((pure))
+#else
+# define av_pure
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(2,6)
+# define av_const __attribute__((const))
+#else
+# define av_const
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+# define av_cold __attribute__((cold))
+#else
+# define av_cold
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__)
+# define av_flatten __attribute__((flatten))
+#else
+# define av_flatten
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define attribute_deprecated __attribute__((deprecated))
+#elif defined(_MSC_VER)
+# define attribute_deprecated __declspec(deprecated)
+#else
+# define attribute_deprecated
+#endif
+
+/**
+ * Disable warnings about deprecated features
+ * This is useful for sections of code kept for backward compatibility and
+ * scheduled for removal.
+ */
+#ifndef AV_NOWARN_DEPRECATED
+#if AV_GCC_VERSION_AT_LEAST(4,6)
+# define AV_NOWARN_DEPRECATED(code) \
+ _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \
+ code \
+ _Pragma("GCC diagnostic pop")
+#elif defined(_MSC_VER)
+# define AV_NOWARN_DEPRECATED(code) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable : 4996)) \
+ code; \
+ __pragma(warning(pop))
+#else
+# define AV_NOWARN_DEPRECATED(code) code
+#endif
+#endif
+
+
+#if defined(__GNUC__)
+# define av_unused __attribute__((unused))
+#else
+# define av_unused
+#endif
+
+/**
+ * Mark a variable as used and prevent the compiler from optimizing it
+ * away. This is useful for variables accessed only from inline
+ * assembler without the compiler being aware.
+ */
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_used __attribute__((used))
+#else
+# define av_used
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,3)
+# define av_alias __attribute__((may_alias))
+#else
+# define av_alias
+#endif
+
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
+# define av_uninit(x) x=x
+#else
+# define av_uninit(x) x
+#endif
+
+#ifdef __GNUC__
+# define av_builtin_constant_p __builtin_constant_p
+# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))
+#else
+# define av_builtin_constant_p(x) 0
+# define av_printf_format(fmtpos, attrpos)
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(2,5)
+# define av_noreturn __attribute__((noreturn))
+#else
+# define av_noreturn
+#endif
+
+#endif /* AVUTIL_ATTRIBUTES_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avconfig.h
new file mode 100644
index 000000000..36a8cd14d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avconfig.h
@@ -0,0 +1,7 @@
+/* Generated by ffconf */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#define AV_HAVE_INCOMPATIBLE_LIBAV_ABI 0
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avutil.h
new file mode 100644
index 000000000..9bcf67412
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/avutil.h
@@ -0,0 +1,343 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVUTIL_H
+#define AVUTIL_AVUTIL_H
+
+/**
+ * @file
+ * external API header
+ */
+
+/**
+ * @mainpage
+ *
+ * @section ffmpeg_intro Introduction
+ *
+ * This document describes the usage of the different libraries
+ * provided by FFmpeg.
+ *
+ * @li @ref libavc "libavcodec" encoding/decoding library
+ * @li @ref lavfi "libavfilter" graph-based frame editing library
+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
+ * @li @ref lavu "libavutil" common utility library
+ * @li @ref lswr "libswresample" audio resampling, format conversion and mixing
+ * @li @ref lpp "libpostproc" post processing library
+ * @li @ref libsws "libswscale" color conversion and scaling library
+ *
+ * @section ffmpeg_versioning Versioning and compatibility
+ *
+ * Each of the FFmpeg libraries contains a version.h header, which defines a
+ * major, minor and micro version number with the
+ * <em>LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO}</em> macros. The major version
+ * number is incremented with backward incompatible changes - e.g. removing
+ * parts of the public API, reordering public struct members, etc. The minor
+ * version number is incremented for backward compatible API changes or major
+ * new features - e.g. adding a new public function or a new decoder. The micro
+ * version number is incremented for smaller changes that a calling program
+ * might still want to check for - e.g. changing behavior in a previously
+ * unspecified situation.
+ *
+ * FFmpeg guarantees backward API and ABI compatibility for each library as long
+ * as its major version number is unchanged. This means that no public symbols
+ * will be removed or renamed. Types and names of the public struct members and
+ * values of public macros and enums will remain the same (unless they were
+ * explicitly declared as not part of the public API). Documented behavior will
+ * not change.
+ *
+ * In other words, any correct program that works with a given FFmpeg snapshot
+ * should work just as well without any changes with any later snapshot with the
+ * same major versions. This applies to both rebuilding the program against new
+ * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program
+ * links against.
+ *
+ * However, new public symbols may be added and new members may be appended to
+ * public structs whose size is not part of public ABI (most public structs in
+ * FFmpeg). New macros and enum values may be added. Behavior in undocumented
+ * situations may change slightly (and be documented). All those are accompanied
+ * by an entry in doc/APIchanges and incrementing either the minor or micro
+ * version number.
+ */
+
+/**
+ * @defgroup lavu Common utility functions
+ *
+ * @brief
+ * libavutil contains the code shared across all the other FFmpeg
+ * libraries
+ *
+ * @note In order to use the functions provided by avutil you must include
+ * the specific header.
+ *
+ * @{
+ *
+ * @defgroup lavu_crypto Crypto and Hashing
+ *
+ * @{
+ * @}
+ *
+ * @defgroup lavu_math Maths
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_string String Manipulation
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_mem Memory Management
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_data Data Structures
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_audio Audio related
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_error Error Codes
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_log Logging Facility
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_misc Other
+ *
+ * @{
+ *
+ * @defgroup preproc_misc Preprocessor String Macros
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup version_utils Library Version Macros
+ *
+ * @{
+ *
+ * @}
+ */
+
+
+/**
+ * @addtogroup lavu_ver
+ * @{
+ */
+
+/**
+ * Return the LIBAVUTIL_VERSION_INT constant.
+ */
+unsigned avutil_version(void);
+
+/**
+ * Return an informative version string. This usually is the actual release
+ * version number or a git commit description. This string has no fixed format
+ * and can change any time. It should never be parsed by code.
+ */
+const char *av_version_info(void);
+
+/**
+ * Return the libavutil build-time configuration.
+ */
+const char *avutil_configuration(void);
+
+/**
+ * Return the libavutil license.
+ */
+const char *avutil_license(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_media Media Type
+ * @brief Media Type
+ */
+
+enum AVMediaType {
+ AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA
+ AVMEDIA_TYPE_VIDEO,
+ AVMEDIA_TYPE_AUDIO,
+ AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous
+ AVMEDIA_TYPE_SUBTITLE,
+ AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse
+ AVMEDIA_TYPE_NB
+};
+
+/**
+ * Return a string describing the media_type enum, NULL if media_type
+ * is unknown.
+ */
+const char *av_get_media_type_string(enum AVMediaType media_type);
+
+/**
+ * @defgroup lavu_const Constants
+ * @{
+ *
+ * @defgroup lavu_enc Encoding specific
+ *
+ * @note those definition should move to avcodec
+ * @{
+ */
+
+#define FF_LAMBDA_SHIFT 7
+#define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)
+#define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
+#define FF_LAMBDA_MAX (256*128-1)
+
+#define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
+
+/**
+ * @}
+ * @defgroup lavu_time Timestamp specific
+ *
+ * FFmpeg internal timebase and timestamp definitions
+ *
+ * @{
+ */
+
+/**
+ * @brief Undefined timestamp value
+ *
+ * Usually reported by demuxer that work on containers that do not provide
+ * either pts or dts.
+ */
+
+#define AV_NOPTS_VALUE ((int64_t)UINT64_C(0x8000000000000000))
+
+/**
+ * Internal time base represented as integer
+ */
+
+#define AV_TIME_BASE 1000000
+
+/**
+ * Internal time base represented as fractional value
+ */
+
+#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
+
+/**
+ * @}
+ * @}
+ * @defgroup lavu_picture Image related
+ *
+ * AVPicture types, pixel formats and basic image planes manipulation.
+ *
+ * @{
+ */
+
+enum AVPictureType {
+ AV_PICTURE_TYPE_NONE = 0, ///< Undefined
+ AV_PICTURE_TYPE_I, ///< Intra
+ AV_PICTURE_TYPE_P, ///< Predicted
+ AV_PICTURE_TYPE_B, ///< Bi-dir predicted
+ AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG4
+ AV_PICTURE_TYPE_SI, ///< Switching Intra
+ AV_PICTURE_TYPE_SP, ///< Switching Predicted
+ AV_PICTURE_TYPE_BI, ///< BI type
+};
+
+/**
+ * Return a single letter to describe the given picture type
+ * pict_type.
+ *
+ * @param[in] pict_type the picture type @return a single character
+ * representing the picture type, '?' if pict_type is unknown
+ */
+char av_get_picture_type_char(enum AVPictureType pict_type);
+
+/**
+ * @}
+ */
+
+#include "common.h"
+#include "error.h"
+#include "rational.h"
+#include "version.h"
+#include "macros.h"
+#include "mathematics.h"
+#include "log.h"
+#include "pixfmt.h"
+
+/**
+ * Return x default pointer in case p is NULL.
+ */
+static inline void *av_x_if_null(const void *p, const void *x)
+{
+ return (void *)(intptr_t)(p ? p : x);
+}
+
+/**
+ * Compute the length of an integer list.
+ *
+ * @param elsize size in bytes of each list element (only 1, 2, 4 or 8)
+ * @param term list terminator (usually 0 or -1)
+ * @param list pointer to the list
+ * @return length of the list, in elements, not counting the terminator
+ */
+unsigned av_int_list_length_for_size(unsigned elsize,
+ const void *list, uint64_t term) av_pure;
+
+/**
+ * Compute the length of an integer list.
+ *
+ * @param term list terminator (usually 0 or -1)
+ * @param list pointer to the list
+ * @return length of the list, in elements, not counting the terminator
+ */
+#define av_int_list_length(list, term) \
+ av_int_list_length_for_size(sizeof(*(list)), list, term)
+
+/**
+ * Open a file using a UTF-8 filename.
+ * The API of this function matches POSIX fopen(), errors are returned through
+ * errno.
+ */
+FILE *av_fopen_utf8(const char *path, const char *mode);
+
+/**
+ * Return the fractional representation of the internal time base.
+ */
+AVRational av_get_time_base_q(void);
+
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_AVUTIL_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/buffer.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/buffer.h
new file mode 100644
index 000000000..b4399fd39
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/buffer.h
@@ -0,0 +1,274 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @ingroup lavu_buffer
+ * refcounted data buffer API
+ */
+
+#ifndef AVUTIL_BUFFER_H
+#define AVUTIL_BUFFER_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_buffer AVBuffer
+ * @ingroup lavu_data
+ *
+ * @{
+ * AVBuffer is an API for reference-counted data buffers.
+ *
+ * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer
+ * represents the data buffer itself; it is opaque and not meant to be accessed
+ * by the caller directly, but only through AVBufferRef. However, the caller may
+ * e.g. compare two AVBuffer pointers to check whether two different references
+ * are describing the same data buffer. AVBufferRef represents a single
+ * reference to an AVBuffer and it is the object that may be manipulated by the
+ * caller directly.
+ *
+ * There are two functions provided for creating a new AVBuffer with a single
+ * reference -- av_buffer_alloc() to just allocate a new buffer, and
+ * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing
+ * reference, additional references may be created with av_buffer_ref().
+ * Use av_buffer_unref() to free a reference (this will automatically free the
+ * data once all the references are freed).
+ *
+ * The convention throughout this API and the rest of FFmpeg is such that the
+ * buffer is considered writable if there exists only one reference to it (and
+ * it has not been marked as read-only). The av_buffer_is_writable() function is
+ * provided to check whether this is true and av_buffer_make_writable() will
+ * automatically create a new writable buffer when necessary.
+ * Of course nothing prevents the calling code from violating this convention,
+ * however that is safe only when all the existing references are under its
+ * control.
+ *
+ * @note Referencing and unreferencing the buffers is thread-safe and thus
+ * may be done from multiple threads simultaneously without any need for
+ * additional locking.
+ *
+ * @note Two different references to the same buffer can point to different
+ * parts of the buffer (i.e. their AVBufferRef.data will not be equal).
+ */
+
+/**
+ * A reference counted buffer type. It is opaque and is meant to be used through
+ * references (AVBufferRef).
+ */
+typedef struct AVBuffer AVBuffer;
+
+/**
+ * A reference to a data buffer.
+ *
+ * The size of this struct is not a part of the public ABI and it is not meant
+ * to be allocated directly.
+ */
+typedef struct AVBufferRef {
+ AVBuffer *buffer;
+
+ /**
+ * The data buffer. It is considered writable if and only if
+ * this is the only reference to the buffer, in which case
+ * av_buffer_is_writable() returns 1.
+ */
+ uint8_t *data;
+ /**
+ * Size of data in bytes.
+ */
+ int size;
+} AVBufferRef;
+
+/**
+ * Allocate an AVBuffer of the given size using av_malloc().
+ *
+ * @return an AVBufferRef of given size or NULL when out of memory
+ */
+AVBufferRef *av_buffer_alloc(int size);
+
+/**
+ * Same as av_buffer_alloc(), except the returned buffer will be initialized
+ * to zero.
+ */
+AVBufferRef *av_buffer_allocz(int size);
+
+/**
+ * Always treat the buffer as read-only, even when it has only one
+ * reference.
+ */
+#define AV_BUFFER_FLAG_READONLY (1 << 0)
+
+/**
+ * Create an AVBuffer from an existing array.
+ *
+ * If this function is successful, data is owned by the AVBuffer. The caller may
+ * only access data through the returned AVBufferRef and references derived from
+ * it.
+ * If this function fails, data is left untouched.
+ * @param data data array
+ * @param size size of data in bytes
+ * @param free a callback for freeing this buffer's data
+ * @param opaque parameter to be got for processing or passed to free
+ * @param flags a combination of AV_BUFFER_FLAG_*
+ *
+ * @return an AVBufferRef referring to data on success, NULL on failure.
+ */
+AVBufferRef *av_buffer_create(uint8_t *data, int size,
+ void (*free)(void *opaque, uint8_t *data),
+ void *opaque, int flags);
+
+/**
+ * Default free callback, which calls av_free() on the buffer data.
+ * This function is meant to be passed to av_buffer_create(), not called
+ * directly.
+ */
+void av_buffer_default_free(void *opaque, uint8_t *data);
+
+/**
+ * Create a new reference to an AVBuffer.
+ *
+ * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on
+ * failure.
+ */
+AVBufferRef *av_buffer_ref(AVBufferRef *buf);
+
+/**
+ * Free a given reference and automatically free the buffer if there are no more
+ * references to it.
+ *
+ * @param buf the reference to be freed. The pointer is set to NULL on return.
+ */
+void av_buffer_unref(AVBufferRef **buf);
+
+/**
+ * @return 1 if the caller may write to the data referred to by buf (which is
+ * true if and only if buf is the only reference to the underlying AVBuffer).
+ * Return 0 otherwise.
+ * A positive answer is valid until av_buffer_ref() is called on buf.
+ */
+int av_buffer_is_writable(const AVBufferRef *buf);
+
+/**
+ * @return the opaque parameter set by av_buffer_create.
+ */
+void *av_buffer_get_opaque(const AVBufferRef *buf);
+
+int av_buffer_get_ref_count(const AVBufferRef *buf);
+
+/**
+ * Create a writable reference from a given buffer reference, avoiding data copy
+ * if possible.
+ *
+ * @param buf buffer reference to make writable. On success, buf is either left
+ * untouched, or it is unreferenced and a new writable AVBufferRef is
+ * written in its place. On failure, buf is left untouched.
+ * @return 0 on success, a negative AVERROR on failure.
+ */
+int av_buffer_make_writable(AVBufferRef **buf);
+
+/**
+ * Reallocate a given buffer.
+ *
+ * @param buf a buffer reference to reallocate. On success, buf will be
+ * unreferenced and a new reference with the required size will be
+ * written in its place. On failure buf will be left untouched. *buf
+ * may be NULL, then a new buffer is allocated.
+ * @param size required new buffer size.
+ * @return 0 on success, a negative AVERROR on failure.
+ *
+ * @note the buffer is actually reallocated with av_realloc() only if it was
+ * initially allocated through av_buffer_realloc(NULL) and there is only one
+ * reference to it (i.e. the one passed to this function). In all other cases
+ * a new buffer is allocated and the data is copied.
+ */
+int av_buffer_realloc(AVBufferRef **buf, int size);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup lavu_bufferpool AVBufferPool
+ * @ingroup lavu_data
+ *
+ * @{
+ * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
+ *
+ * Frequently allocating and freeing large buffers may be slow. AVBufferPool is
+ * meant to solve this in cases when the caller needs a set of buffers of the
+ * same size (the most obvious use case being buffers for raw video or audio
+ * frames).
+ *
+ * At the beginning, the user must call av_buffer_pool_init() to create the
+ * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to
+ * get a reference to a new buffer, similar to av_buffer_alloc(). This new
+ * reference works in all aspects the same way as the one created by
+ * av_buffer_alloc(). However, when the last reference to this buffer is
+ * unreferenced, it is returned to the pool instead of being freed and will be
+ * reused for subsequent av_buffer_pool_get() calls.
+ *
+ * When the caller is done with the pool and no longer needs to allocate any new
+ * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.
+ * Once all the buffers are released, it will automatically be freed.
+ *
+ * Allocating and releasing buffers with this API is thread-safe as long as
+ * either the default alloc callback is used, or the user-supplied one is
+ * thread-safe.
+ */
+
+/**
+ * The buffer pool. This structure is opaque and not meant to be accessed
+ * directly. It is allocated with av_buffer_pool_init() and freed with
+ * av_buffer_pool_uninit().
+ */
+typedef struct AVBufferPool AVBufferPool;
+
+/**
+ * Allocate and initialize a buffer pool.
+ *
+ * @param size size of each buffer in this pool
+ * @param alloc a function that will be used to allocate new buffers when the
+ * pool is empty. May be NULL, then the default allocator will be used
+ * (av_buffer_alloc()).
+ * @return newly created buffer pool on success, NULL on error.
+ */
+AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size));
+
+/**
+ * Mark the pool as being available for freeing. It will actually be freed only
+ * once all the allocated buffers associated with the pool are released. Thus it
+ * is safe to call this function while some of the allocated buffers are still
+ * in use.
+ *
+ * @param pool pointer to the pool to be freed. It will be set to NULL.
+ * @see av_buffer_pool_can_uninit()
+ */
+void av_buffer_pool_uninit(AVBufferPool **pool);
+
+/**
+ * Allocate a new AVBuffer, reusing an old buffer from the pool when available.
+ * This function may be called simultaneously from multiple threads.
+ *
+ * @return a reference to the new buffer on success, NULL on error.
+ */
+AVBufferRef *av_buffer_pool_get(AVBufferPool *pool);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_BUFFER_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/channel_layout.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/channel_layout.h
new file mode 100644
index 000000000..ec7effead
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/channel_layout.h
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ * Copyright (c) 2008 Peter Ross
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CHANNEL_LAYOUT_H
+#define AVUTIL_CHANNEL_LAYOUT_H
+
+#include <stdint.h>
+
+/**
+ * @file
+ * audio channel layout utility functions
+ */
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * @defgroup channel_masks Audio channel masks
+ *
+ * A channel layout is a 64-bits integer with a bit set for every channel.
+ * The number of bits set must be equal to the number of channels.
+ * The value 0 means that the channel layout is not known.
+ * @note this data structure is not powerful enough to handle channels
+ * combinations that have the same channel multiple times, such as
+ * dual-mono.
+ *
+ * @{
+ */
+#define AV_CH_FRONT_LEFT 0x00000001
+#define AV_CH_FRONT_RIGHT 0x00000002
+#define AV_CH_FRONT_CENTER 0x00000004
+#define AV_CH_LOW_FREQUENCY 0x00000008
+#define AV_CH_BACK_LEFT 0x00000010
+#define AV_CH_BACK_RIGHT 0x00000020
+#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040
+#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080
+#define AV_CH_BACK_CENTER 0x00000100
+#define AV_CH_SIDE_LEFT 0x00000200
+#define AV_CH_SIDE_RIGHT 0x00000400
+#define AV_CH_TOP_CENTER 0x00000800
+#define AV_CH_TOP_FRONT_LEFT 0x00001000
+#define AV_CH_TOP_FRONT_CENTER 0x00002000
+#define AV_CH_TOP_FRONT_RIGHT 0x00004000
+#define AV_CH_TOP_BACK_LEFT 0x00008000
+#define AV_CH_TOP_BACK_CENTER 0x00010000
+#define AV_CH_TOP_BACK_RIGHT 0x00020000
+#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix.
+#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT.
+#define AV_CH_WIDE_LEFT 0x0000000080000000ULL
+#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL
+#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL
+#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL
+#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL
+
+/** Channel mask value used for AVCodecContext.request_channel_layout
+ to indicate that the user requests the channel order of the decoder output
+ to be the native codec channel order. */
+#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL
+
+/**
+ * @}
+ * @defgroup channel_mask_c Audio channel layouts
+ * @{
+ * */
+#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
+#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_HEXADECAGONAL (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)
+#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
+
+enum AVMatrixEncoding {
+ AV_MATRIX_ENCODING_NONE,
+ AV_MATRIX_ENCODING_DOLBY,
+ AV_MATRIX_ENCODING_DPLII,
+ AV_MATRIX_ENCODING_DPLIIX,
+ AV_MATRIX_ENCODING_DPLIIZ,
+ AV_MATRIX_ENCODING_DOLBYEX,
+ AV_MATRIX_ENCODING_DOLBYHEADPHONE,
+ AV_MATRIX_ENCODING_NB
+};
+
+/**
+ * Return a channel layout id that matches name, or 0 if no match is found.
+ *
+ * name can be one or several of the following notations,
+ * separated by '+' or '|':
+ * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0,
+ * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix);
+ * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC,
+ * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR);
+ * - a number of channels, in decimal, optionally followed by 'c', yielding
+ * the default channel layout for that number of channels (@see
+ * av_get_default_channel_layout);
+ * - a channel layout mask, in hexadecimal starting with "0x" (see the
+ * AV_CH_* macros).
+ *
+ * @warning Starting from the next major bump the trailing character
+ * 'c' to specify a number of channels will be required, while a
+ * channel layout mask could also be specified as a decimal number
+ * (if and only if not followed by "c").
+ *
+ * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7"
+ */
+uint64_t av_get_channel_layout(const char *name);
+
+/**
+ * Return a description of a channel layout.
+ * If nb_channels is <= 0, it is guessed from the channel_layout.
+ *
+ * @param buf put here the string containing the channel layout
+ * @param buf_size size in bytes of the buffer
+ */
+void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
+
+struct AVBPrint;
+/**
+ * Append a description of a channel layout to a bprint buffer.
+ */
+void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout);
+
+/**
+ * Return the number of channels in the channel layout.
+ */
+int av_get_channel_layout_nb_channels(uint64_t channel_layout);
+
+/**
+ * Return default channel layout for a given number of channels.
+ */
+int64_t av_get_default_channel_layout(int nb_channels);
+
+/**
+ * Get the index of a channel in channel_layout.
+ *
+ * @param channel a channel layout describing exactly one channel which must be
+ * present in channel_layout.
+ *
+ * @return index of channel in channel_layout on success, a negative AVERROR
+ * on error.
+ */
+int av_get_channel_layout_channel_index(uint64_t channel_layout,
+ uint64_t channel);
+
+/**
+ * Get the channel with the given index in channel_layout.
+ */
+uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index);
+
+/**
+ * Get the name of a given channel.
+ *
+ * @return channel name on success, NULL on error.
+ */
+const char *av_get_channel_name(uint64_t channel);
+
+/**
+ * Get the description of a given channel.
+ *
+ * @param channel a channel layout with a single channel
+ * @return channel description on success, NULL on error
+ */
+const char *av_get_channel_description(uint64_t channel);
+
+/**
+ * Get the value and name of a standard channel layout.
+ *
+ * @param[in] index index in an internal list, starting at 0
+ * @param[out] layout channel layout mask
+ * @param[out] name name of the layout
+ * @return 0 if the layout exists,
+ * <0 if index is beyond the limits
+ */
+int av_get_standard_channel_layout(unsigned index, uint64_t *layout,
+ const char **name);
+
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_CHANNEL_LAYOUT_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/common.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/common.h
new file mode 100644
index 000000000..ea636431c
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/common.h
@@ -0,0 +1,519 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * common internal and external API header
+ */
+
+#ifndef AVUTIL_COMMON_H
+#define AVUTIL_COMMON_H
+
+#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)
+#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
+#endif
+
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <math.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "attributes.h"
+#include "macros.h"
+#include "version.h"
+#include "libavutil/avconfig.h"
+
+#if AV_HAVE_BIGENDIAN
+# define AV_NE(be, le) (be)
+#else
+# define AV_NE(be, le) (le)
+#endif
+
+//rounded division & shift
+#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
+/* assume b>0 */
+#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
+/* assume a>0 and b>0 */
+#define FF_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \
+ : ((a) + (1<<(b)) - 1) >> (b))
+#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b))
+#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b))
+
+/**
+ * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they
+ * are not representable as absolute values of their type. This is the same
+ * as with *abs()
+ * @see FFNABS()
+ */
+#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
+#define FFSIGN(a) ((a) > 0 ? 1 : -1)
+
+/**
+ * Negative Absolute value.
+ * this works for all integers of all types.
+ * As with many macros, this evaluates its argument twice, it thus must not have
+ * a sideeffect, that is FFNABS(x++) has undefined behavior.
+ */
+#define FFNABS(a) ((a) <= 0 ? (a) : (-(a)))
+
+/**
+ * Comparator.
+ * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0
+ * if x == y. This is useful for instance in a qsort comparator callback.
+ * Furthermore, compilers are able to optimize this to branchless code, and
+ * there is no risk of overflow with signed types.
+ * As with many macros, this evaluates its argument multiple times, it thus
+ * must not have a side-effect.
+ */
+#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y)))
+
+#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
+#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
+#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
+#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
+
+#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
+
+/* misc math functions */
+
+#ifdef HAVE_AV_CONFIG_H
+# include "config.h"
+# include "intmath.h"
+#endif
+
+/* Pull in unguarded fallback defines at the end of this file. */
+#include "common.h"
+
+#ifndef av_log2
+av_const int av_log2(unsigned v);
+#endif
+
+#ifndef av_log2_16bit
+av_const int av_log2_16bit(unsigned v);
+#endif
+
+/**
+ * Clip a signed integer value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
+{
+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
+ if (amin > amax) abort();
+#endif
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/**
+ * Clip a signed 64bit integer value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax)
+{
+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
+ if (amin > amax) abort();
+#endif
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-255 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
+{
+ if (a&(~0xFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -128,127 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int8_t av_clip_int8_c(int a)
+{
+ if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-65535 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
+{
+ if (a&(~0xFFFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -32768,32767 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int16_t av_clip_int16_c(int a)
+{
+ if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
+ else return a;
+}
+
+/**
+ * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
+{
+ if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF);
+ else return (int32_t)a;
+}
+
+/**
+ * Clip a signed integer into the -(2^p),(2^p-1) range.
+ * @param a value to clip
+ * @param p bit position to clip at
+ * @return clipped value
+ */
+static av_always_inline av_const int av_clip_intp2_c(int a, int p)
+{
+ if ((a + (1 << p)) & ~((2 << p) - 1))
+ return (a >> 31) ^ ((1 << p) - 1);
+ else
+ return a;
+}
+
+/**
+ * Clip a signed integer to an unsigned power of two range.
+ * @param a value to clip
+ * @param p bit position to clip at
+ * @return clipped value
+ */
+static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
+{
+ if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1);
+ else return a;
+}
+
+/**
+ * Clear high bits from an unsigned integer starting with specific bit position
+ * @param a value to clip
+ * @param p bit position to clip at
+ * @return clipped value
+ */
+static av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a, unsigned p)
+{
+ return a & ((1 << p) - 1);
+}
+
+/**
+ * Add two signed 32-bit values with saturation.
+ *
+ * @param a one value
+ * @param b another value
+ * @return sum with signed saturation
+ */
+static av_always_inline int av_sat_add32_c(int a, int b)
+{
+ return av_clipl_int32((int64_t)a + b);
+}
+
+/**
+ * Add a doubled value to another value with saturation at both stages.
+ *
+ * @param a first value
+ * @param b value doubled and added to a
+ * @return sum with signed saturation
+ */
+static av_always_inline int av_sat_dadd32_c(int a, int b)
+{
+ return av_sat_add32(a, av_sat_add32(b, b));
+}
+
+/**
+ * Clip a float value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
+{
+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
+ if (amin > amax) abort();
+#endif
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/**
+ * Clip a double value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const double av_clipd_c(double a, double amin, double amax)
+{
+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
+ if (amin > amax) abort();
+#endif
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/** Compute ceil(log2(x)).
+ * @param x value used to compute ceil(log2(x))
+ * @return computed ceiling of log2(x)
+ */
+static av_always_inline av_const int av_ceil_log2_c(int x)
+{
+ return av_log2((x - 1) << 1);
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount_c(uint32_t x)
+{
+ x -= (x >> 1) & 0x55555555;
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+ x = (x + (x >> 4)) & 0x0F0F0F0F;
+ x += x >> 8;
+ return (x + (x >> 16)) & 0x3F;
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount64_c(uint64_t x)
+{
+ return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32));
+}
+
+#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
+#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
+
+/**
+ * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_BYTE Expression reading one byte from the input.
+ * Evaluated up to 7 times (4 for the currently
+ * assigned Unicode range). With a memory buffer
+ * input, this could be *ptr++.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ *
+ * @warning ERROR should not contain a loop control statement which
+ * could interact with the internal while loop, and should force an
+ * exit from the macro code (e.g. through a goto or a return) in order
+ * to prevent undefined results.
+ */
+#define GET_UTF8(val, GET_BYTE, ERROR)\
+ val= GET_BYTE;\
+ {\
+ uint32_t top = (val & 128) >> 1;\
+ if ((val & 0xc0) == 0x80 || val >= 0xFE)\
+ ERROR\
+ while (val & top) {\
+ int tmp= GET_BYTE - 128;\
+ if(tmp>>6)\
+ ERROR\
+ val= (val<<6) + tmp;\
+ top <<= 5;\
+ }\
+ val &= (top << 1) - 1;\
+ }
+
+/**
+ * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
+ * to native byte order. Evaluated one or two times.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF16(val, GET_16BIT, ERROR)\
+ val = GET_16BIT;\
+ {\
+ unsigned int hi = val - 0xD800;\
+ if (hi < 0x800) {\
+ val = GET_16BIT - 0xDC00;\
+ if (val > 0x3FFU || hi > 0x3FFU)\
+ ERROR\
+ val += (hi<<10) + 0x10000;\
+ }\
+ }\
+
+/**
+ * @def PUT_UTF8(val, tmp, PUT_BYTE)
+ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint8_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_BYTE.
+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
+ * It could be a function or a statement, and uses tmp as the input byte.
+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
+ * executed up to 4 times for values in the valid UTF-8 range and up to
+ * 7 times in the general case, depending on the length of the converted
+ * Unicode character.
+ */
+#define PUT_UTF8(val, tmp, PUT_BYTE)\
+ {\
+ int bytes, shift;\
+ uint32_t in = val;\
+ if (in < 0x80) {\
+ tmp = in;\
+ PUT_BYTE\
+ } else {\
+ bytes = (av_log2(in) + 4) / 5;\
+ shift = (bytes - 1) * 6;\
+ tmp = (256 - (256 >> bytes)) | (in >> shift);\
+ PUT_BYTE\
+ while (shift >= 6) {\
+ shift -= 6;\
+ tmp = 0x80 | ((in >> shift) & 0x3f);\
+ PUT_BYTE\
+ }\
+ }\
+ }
+
+/**
+ * @def PUT_UTF16(val, tmp, PUT_16BIT)
+ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint16_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_16BIT.
+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
+ * in desired endianness. It could be a function or a statement, and uses tmp
+ * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;"
+ * PUT_BYTE will be executed 1 or 2 times depending on input character.
+ */
+#define PUT_UTF16(val, tmp, PUT_16BIT)\
+ {\
+ uint32_t in = val;\
+ if (in < 0x10000) {\
+ tmp = in;\
+ PUT_16BIT\
+ } else {\
+ tmp = 0xD800 | ((in - 0x10000) >> 10);\
+ PUT_16BIT\
+ tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
+ PUT_16BIT\
+ }\
+ }\
+
+
+
+#include "mem.h"
+
+#ifdef HAVE_AV_CONFIG_H
+# include "internal.h"
+#endif /* HAVE_AV_CONFIG_H */
+
+#endif /* AVUTIL_COMMON_H */
+
+/*
+ * The following definitions are outside the multiple inclusion guard
+ * to ensure they are immediately available in intmath.h.
+ */
+
+#ifndef av_ceil_log2
+# define av_ceil_log2 av_ceil_log2_c
+#endif
+#ifndef av_clip
+# define av_clip av_clip_c
+#endif
+#ifndef av_clip64
+# define av_clip64 av_clip64_c
+#endif
+#ifndef av_clip_uint8
+# define av_clip_uint8 av_clip_uint8_c
+#endif
+#ifndef av_clip_int8
+# define av_clip_int8 av_clip_int8_c
+#endif
+#ifndef av_clip_uint16
+# define av_clip_uint16 av_clip_uint16_c
+#endif
+#ifndef av_clip_int16
+# define av_clip_int16 av_clip_int16_c
+#endif
+#ifndef av_clipl_int32
+# define av_clipl_int32 av_clipl_int32_c
+#endif
+#ifndef av_clip_intp2
+# define av_clip_intp2 av_clip_intp2_c
+#endif
+#ifndef av_clip_uintp2
+# define av_clip_uintp2 av_clip_uintp2_c
+#endif
+#ifndef av_mod_uintp2
+# define av_mod_uintp2 av_mod_uintp2_c
+#endif
+#ifndef av_sat_add32
+# define av_sat_add32 av_sat_add32_c
+#endif
+#ifndef av_sat_dadd32
+# define av_sat_dadd32 av_sat_dadd32_c
+#endif
+#ifndef av_clipf
+# define av_clipf av_clipf_c
+#endif
+#ifndef av_clipd
+# define av_clipd av_clipd_c
+#endif
+#ifndef av_popcount
+# define av_popcount av_popcount_c
+#endif
+#ifndef av_popcount64
+# define av_popcount64 av_popcount64_c
+#endif
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/cpu.h
new file mode 100644
index 000000000..cc4e30c4c
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/cpu.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CPU_H
+#define AVUTIL_CPU_H
+
+#include "attributes.h"
+
+#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */
+
+ /* lower 16 bits - CPU features */
+#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX
+#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext
+#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext
+#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW
+#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions
+#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions
+#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster
+ ///< than regular MMX/SSE (e.g. Core1)
+#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt
+#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions
+#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster
+ ///< than regular MMX/SSE (e.g. Core1)
+#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions
+#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower
+#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions
+#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions
+#define AV_CPU_FLAG_AESNI 0x80000 ///< Advanced Encryption Standard functions
+#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
+#define AV_CPU_FLAG_AVXSLOW 0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer)
+#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions
+#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions
+#define AV_CPU_FLAG_CMOV 0x1000 ///< supports cmov instruction
+#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used
+#define AV_CPU_FLAG_FMA3 0x10000 ///< Haswell FMA3 functions
+#define AV_CPU_FLAG_BMI1 0x20000 ///< Bit Manipulation Instruction Set 1
+#define AV_CPU_FLAG_BMI2 0x40000 ///< Bit Manipulation Instruction Set 2
+
+#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard
+#define AV_CPU_FLAG_VSX 0x0002 ///< ISA 2.06
+#define AV_CPU_FLAG_POWER8 0x0004 ///< ISA 2.07
+
+#define AV_CPU_FLAG_ARMV5TE (1 << 0)
+#define AV_CPU_FLAG_ARMV6 (1 << 1)
+#define AV_CPU_FLAG_ARMV6T2 (1 << 2)
+#define AV_CPU_FLAG_VFP (1 << 3)
+#define AV_CPU_FLAG_VFPV3 (1 << 4)
+#define AV_CPU_FLAG_NEON (1 << 5)
+#define AV_CPU_FLAG_ARMV8 (1 << 6)
+#define AV_CPU_FLAG_VFP_VM (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations
+#define AV_CPU_FLAG_SETEND (1 <<16)
+
+/**
+ * Return the flags which specify extensions supported by the CPU.
+ * The returned value is affected by av_force_cpu_flags() if that was used
+ * before. So av_get_cpu_flags() can easily be used in a application to
+ * detect the enabled cpu flags.
+ */
+int av_get_cpu_flags(void);
+
+/**
+ * Disables cpu detection and forces the specified flags.
+ * -1 is a special case that disables forcing of specific flags.
+ */
+void av_force_cpu_flags(int flags);
+
+/**
+ * Set a mask on flags returned by av_get_cpu_flags().
+ * This function is mainly useful for testing.
+ * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible
+ *
+ * @warning this function is not thread safe.
+ */
+attribute_deprecated void av_set_cpu_flags_mask(int mask);
+
+/**
+ * Parse CPU flags from a string.
+ *
+ * The returned flags contain the specified flags as well as related unspecified flags.
+ *
+ * This function exists only for compatibility with libav.
+ * Please use av_parse_cpu_caps() when possible.
+ * @return a combination of AV_CPU_* flags, negative on error.
+ */
+attribute_deprecated
+int av_parse_cpu_flags(const char *s);
+
+/**
+ * Parse CPU caps from a string and update the given AV_CPU_* flags based on that.
+ *
+ * @return negative on error.
+ */
+int av_parse_cpu_caps(unsigned *flags, const char *s);
+
+/**
+ * @return the number of logical CPU cores present.
+ */
+int av_cpu_count(void);
+
+#endif /* AVUTIL_CPU_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/dict.h
new file mode 100644
index 000000000..5b8d00339
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/dict.h
@@ -0,0 +1,198 @@
+/*
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Public dictionary API.
+ * @deprecated
+ * AVDictionary is provided for compatibility with libav. It is both in
+ * implementation as well as API inefficient. It does not scale and is
+ * extremely slow with large dictionaries.
+ * It is recommended that new code uses our tree container from tree.c/h
+ * where applicable, which uses AVL trees to achieve O(log n) performance.
+ */
+
+#ifndef AVUTIL_DICT_H
+#define AVUTIL_DICT_H
+
+#include <stdint.h>
+
+#include "version.h"
+
+/**
+ * @addtogroup lavu_dict AVDictionary
+ * @ingroup lavu_data
+ *
+ * @brief Simple key:value store
+ *
+ * @{
+ * Dictionaries are used for storing key:value pairs. To create
+ * an AVDictionary, simply pass an address of a NULL pointer to
+ * av_dict_set(). NULL can be used as an empty dictionary wherever
+ * a pointer to an AVDictionary is required.
+ * Use av_dict_get() to retrieve an entry or iterate over all
+ * entries and finally av_dict_free() to free the dictionary
+ * and all its contents.
+ *
+ @code
+ AVDictionary *d = NULL; // "create" an empty dictionary
+ AVDictionaryEntry *t = NULL;
+
+ av_dict_set(&d, "foo", "bar", 0); // add an entry
+
+ char *k = av_strdup("key"); // if your strings are already allocated,
+ char *v = av_strdup("value"); // you can avoid copying them like this
+ av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
+
+ while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ <....> // iterate over all entries in d
+ }
+ av_dict_free(&d);
+ @endcode
+ *
+ */
+
+#define AV_DICT_MATCH_CASE 1 /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */
+#define AV_DICT_IGNORE_SUFFIX 2 /**< Return first entry in a dictionary whose first part corresponds to the search key,
+ ignoring the suffix of the found key string. Only relevant in av_dict_get(). */
+#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been
+ allocated with av_malloc() or another memory allocation function. */
+#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been
+ allocated with av_malloc() or another memory allocation function. */
+#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries.
+#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no
+ delimiter is added, the strings are simply concatenated. */
+
+typedef struct AVDictionaryEntry {
+ char *key;
+ char *value;
+} AVDictionaryEntry;
+
+typedef struct AVDictionary AVDictionary;
+
+/**
+ * Get a dictionary entry with matching key.
+ *
+ * The returned entry key or value must not be changed, or it will
+ * cause undefined behavior.
+ *
+ * To iterate through all the dictionary entries, you can set the matching key
+ * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag.
+ *
+ * @param prev Set to the previous matching element to find the next.
+ * If set to NULL the first matching element is returned.
+ * @param key matching key
+ * @param flags a collection of AV_DICT_* flags controlling how the entry is retrieved
+ * @return found entry or NULL in case no matching entry was found in the dictionary
+ */
+AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key,
+ const AVDictionaryEntry *prev, int flags);
+
+/**
+ * Get number of entries in dictionary.
+ *
+ * @param m dictionary
+ * @return number of entries in dictionary
+ */
+int av_dict_count(const AVDictionary *m);
+
+/**
+ * Set the given entry in *pm, overwriting an existing entry.
+ *
+ * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set,
+ * these arguments will be freed on error.
+ *
+ * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL
+ * a dictionary struct is allocated and put in *pm.
+ * @param key entry key to add to *pm (will be av_strduped depending on flags)
+ * @param value entry value to add to *pm (will be av_strduped depending on flags).
+ * Passing a NULL value will cause an existing entry to be deleted.
+ * @return >= 0 on success otherwise an error code <0
+ */
+int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
+
+/**
+ * Convenience wrapper for av_dict_set that converts the value to a string
+ * and stores it.
+ *
+ * Note: If AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error.
+ */
+int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags);
+
+/**
+ * Parse the key/value pairs list and add the parsed entries to a dictionary.
+ *
+ * In case of failure, all the successfully set entries are stored in
+ * *pm. You may need to manually free the created dictionary.
+ *
+ * @param key_val_sep a 0-terminated list of characters used to separate
+ * key from value
+ * @param pairs_sep a 0-terminated list of characters used to separate
+ * two pairs from each other
+ * @param flags flags to use when adding to dictionary.
+ * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL
+ * are ignored since the key/value tokens will always
+ * be duplicated.
+ * @return 0 on success, negative AVERROR code on failure
+ */
+int av_dict_parse_string(AVDictionary **pm, const char *str,
+ const char *key_val_sep, const char *pairs_sep,
+ int flags);
+
+/**
+ * Copy entries from one AVDictionary struct into another.
+ * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL,
+ * this function will allocate a struct for you and put it in *dst
+ * @param src pointer to source AVDictionary struct
+ * @param flags flags to use when setting entries in *dst
+ * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag
+ * @return 0 on success, negative AVERROR code on failure. If dst was allocated
+ * by this function, callers should free the associated memory.
+ */
+int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags);
+
+/**
+ * Free all the memory allocated for an AVDictionary struct
+ * and all keys and values.
+ */
+void av_dict_free(AVDictionary **m);
+
+/**
+ * Get dictionary entries as a string.
+ *
+ * Create a string containing dictionary's entries.
+ * Such string may be passed back to av_dict_parse_string().
+ * @note String is escaped with backslashes ('\').
+ *
+ * @param[in] m dictionary
+ * @param[out] buffer Pointer to buffer that will be allocated with string containg entries.
+ * Buffer must be freed by the caller when is no longer needed.
+ * @param[in] key_val_sep character used to separate key from value
+ * @param[in] pairs_sep character used to separate two pairs from each other
+ * @return >= 0 on success, negative on error
+ * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same.
+ */
+int av_dict_get_string(const AVDictionary *m, char **buffer,
+ const char key_val_sep, const char pairs_sep);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_DICT_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/error.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/error.h
new file mode 100644
index 000000000..71df4da35
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/error.h
@@ -0,0 +1,126 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * error code definitions
+ */
+
+#ifndef AVUTIL_ERROR_H
+#define AVUTIL_ERROR_H
+
+#include <errno.h>
+#include <stddef.h>
+
+/**
+ * @addtogroup lavu_error
+ *
+ * @{
+ */
+
+
+/* error handling */
+#if EDOM > 0
+#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions.
+#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
+#else
+/* Some platforms have E* and errno already negated. */
+#define AVERROR(e) (e)
+#define AVUNERROR(e) (e)
+#endif
+
+#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))
+
+#define AVERROR_BSF_NOT_FOUND FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found
+#define AVERROR_BUG FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2
+#define AVERROR_BUFFER_TOO_SMALL FFERRTAG( 'B','U','F','S') ///< Buffer too small
+#define AVERROR_DECODER_NOT_FOUND FFERRTAG(0xF8,'D','E','C') ///< Decoder not found
+#define AVERROR_DEMUXER_NOT_FOUND FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found
+#define AVERROR_ENCODER_NOT_FOUND FFERRTAG(0xF8,'E','N','C') ///< Encoder not found
+#define AVERROR_EOF FFERRTAG( 'E','O','F',' ') ///< End of file
+#define AVERROR_EXIT FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted
+#define AVERROR_EXTERNAL FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library
+#define AVERROR_FILTER_NOT_FOUND FFERRTAG(0xF8,'F','I','L') ///< Filter not found
+#define AVERROR_INVALIDDATA FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input
+#define AVERROR_MUXER_NOT_FOUND FFERRTAG(0xF8,'M','U','X') ///< Muxer not found
+#define AVERROR_OPTION_NOT_FOUND FFERRTAG(0xF8,'O','P','T') ///< Option not found
+#define AVERROR_PATCHWELCOME FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome
+#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found
+
+#define AVERROR_STREAM_NOT_FOUND FFERRTAG(0xF8,'S','T','R') ///< Stream not found
+/**
+ * This is semantically identical to AVERROR_BUG
+ * it has been introduced in Libav after our AVERROR_BUG and with a modified value.
+ */
+#define AVERROR_BUG2 FFERRTAG( 'B','U','G',' ')
+#define AVERROR_UNKNOWN FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library
+#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
+#define AVERROR_INPUT_CHANGED (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED)
+#define AVERROR_OUTPUT_CHANGED (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED)
+/* HTTP & RTSP errors */
+#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8,'4','0','0')
+#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8,'4','0','1')
+#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8,'4','0','3')
+#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8,'4','0','4')
+#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8,'4','X','X')
+#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8,'5','X','X')
+
+#define AV_ERROR_MAX_STRING_SIZE 64
+
+/**
+ * Put a description of the AVERROR code errnum in errbuf.
+ * In case of failure the global variable errno is set to indicate the
+ * error. Even in case of failure av_strerror() will print a generic
+ * error message indicating the errnum provided to errbuf.
+ *
+ * @param errnum error code to describe
+ * @param errbuf buffer to which description is written
+ * @param errbuf_size the size in bytes of errbuf
+ * @return 0 on success, a negative value if a description for errnum
+ * cannot be found
+ */
+int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
+
+/**
+ * Fill the provided buffer with a string containing an error string
+ * corresponding to the AVERROR code errnum.
+ *
+ * @param errbuf a buffer
+ * @param errbuf_size size in bytes of errbuf
+ * @param errnum error code to describe
+ * @return the buffer in input, filled with the error description
+ * @see av_strerror()
+ */
+static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum)
+{
+ av_strerror(errnum, errbuf, errbuf_size);
+ return errbuf;
+}
+
+/**
+ * Convenience macro, the return value should be used only directly in
+ * function arguments but never stand-alone.
+ */
+#define av_err2str(errnum) \
+ av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_ERROR_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/frame.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/frame.h
new file mode 100644
index 000000000..9c6061a11
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/frame.h
@@ -0,0 +1,713 @@
+/*
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @ingroup lavu_frame
+ * reference-counted frame API
+ */
+
+#ifndef AVUTIL_FRAME_H
+#define AVUTIL_FRAME_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+#include "buffer.h"
+#include "dict.h"
+#include "rational.h"
+#include "samplefmt.h"
+#include "pixfmt.h"
+#include "version.h"
+
+
+/**
+ * @defgroup lavu_frame AVFrame
+ * @ingroup lavu_data
+ *
+ * @{
+ * AVFrame is an abstraction for reference-counted raw multimedia data.
+ */
+
+enum AVFrameSideDataType {
+ /**
+ * The data is the AVPanScan struct defined in libavcodec.
+ */
+ AV_FRAME_DATA_PANSCAN,
+ /**
+ * ATSC A53 Part 4 Closed Captions.
+ * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data.
+ * The number of bytes of CC data is AVFrameSideData.size.
+ */
+ AV_FRAME_DATA_A53_CC,
+ /**
+ * Stereoscopic 3d metadata.
+ * The data is the AVStereo3D struct defined in libavutil/stereo3d.h.
+ */
+ AV_FRAME_DATA_STEREO3D,
+ /**
+ * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h.
+ */
+ AV_FRAME_DATA_MATRIXENCODING,
+ /**
+ * Metadata relevant to a downmix procedure.
+ * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h.
+ */
+ AV_FRAME_DATA_DOWNMIX_INFO,
+ /**
+ * ReplayGain information in the form of the AVReplayGain struct.
+ */
+ AV_FRAME_DATA_REPLAYGAIN,
+ /**
+ * This side data contains a 3x3 transformation matrix describing an affine
+ * transformation that needs to be applied to the frame for correct
+ * presentation.
+ *
+ * See libavutil/display.h for a detailed description of the data.
+ */
+ AV_FRAME_DATA_DISPLAYMATRIX,
+ /**
+ * Active Format Description data consisting of a single byte as specified
+ * in ETSI TS 101 154 using AVActiveFormatDescription enum.
+ */
+ AV_FRAME_DATA_AFD,
+ /**
+ * Motion vectors exported by some codecs (on demand through the export_mvs
+ * flag set in the libavcodec AVCodecContext flags2 option).
+ * The data is the AVMotionVector struct defined in
+ * libavutil/motion_vector.h.
+ */
+ AV_FRAME_DATA_MOTION_VECTORS,
+ /**
+ * Recommmends skipping the specified number of samples. This is exported
+ * only if the "skip_manual" AVOption is set in libavcodec.
+ * This has the same format as AV_PKT_DATA_SKIP_SAMPLES.
+ * @code
+ * u32le number of samples to skip from start of this packet
+ * u32le number of samples to skip from end of this packet
+ * u8 reason for start skip
+ * u8 reason for end skip (0=padding silence, 1=convergence)
+ * @endcode
+ */
+ AV_FRAME_DATA_SKIP_SAMPLES,
+
+ /**
+ * This side data must be associated with an audio frame and corresponds to
+ * enum AVAudioServiceType defined in avcodec.h.
+ */
+ AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
+};
+
+enum AVActiveFormatDescription {
+ AV_AFD_SAME = 8,
+ AV_AFD_4_3 = 9,
+ AV_AFD_16_9 = 10,
+ AV_AFD_14_9 = 11,
+ AV_AFD_4_3_SP_14_9 = 13,
+ AV_AFD_16_9_SP_14_9 = 14,
+ AV_AFD_SP_4_3 = 15,
+};
+
+
+/**
+ * Structure to hold side data for an AVFrame.
+ *
+ * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added
+ * to the end with a minor bump.
+ */
+typedef struct AVFrameSideData {
+ enum AVFrameSideDataType type;
+ uint8_t *data;
+ int size;
+ AVDictionary *metadata;
+ AVBufferRef *buf;
+} AVFrameSideData;
+
+/**
+ * This structure describes decoded (raw) audio or video data.
+ *
+ * AVFrame must be allocated using av_frame_alloc(). Note that this only
+ * allocates the AVFrame itself, the buffers for the data must be managed
+ * through other means (see below).
+ * AVFrame must be freed with av_frame_free().
+ *
+ * AVFrame is typically allocated once and then reused multiple times to hold
+ * different data (e.g. a single AVFrame to hold frames received from a
+ * decoder). In such a case, av_frame_unref() will free any references held by
+ * the frame and reset it to its original clean state before it
+ * is reused again.
+ *
+ * The data described by an AVFrame is usually reference counted through the
+ * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /
+ * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at
+ * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,
+ * every single data plane must be contained in one of the buffers in
+ * AVFrame.buf or AVFrame.extended_buf.
+ * There may be a single buffer for all the data, or one separate buffer for
+ * each plane, or anything in between.
+ *
+ * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
+ * to the end with a minor bump.
+ * Similarly fields that are marked as to be only accessed by
+ * av_opt_ptr() can be reordered. This allows 2 forks to add fields
+ * without breaking compatibility with each other.
+ */
+typedef struct AVFrame {
+#define AV_NUM_DATA_POINTERS 8
+ /**
+ * pointer to the picture/channel planes.
+ * This might be different from the first allocated byte
+ *
+ * Some decoders access areas outside 0,0 - width,height, please
+ * see avcodec_align_dimensions2(). Some filters and swscale can read
+ * up to 16 bytes beyond the planes, if these filters are to be used,
+ * then 16 extra bytes must be allocated.
+ */
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+
+ /**
+ * For video, size in bytes of each picture line.
+ * For audio, size in bytes of each plane.
+ *
+ * For audio, only linesize[0] may be set. For planar audio, each channel
+ * plane must be the same size.
+ *
+ * For video the linesizes should be multiples of the CPUs alignment
+ * preference, this is 16 or 32 for modern desktop CPUs.
+ * Some code requires such alignment other code can be slower without
+ * correct alignment, for yet other it makes no difference.
+ *
+ * @note The linesize may be larger than the size of usable data -- there
+ * may be extra padding present for performance reasons.
+ */
+ int linesize[AV_NUM_DATA_POINTERS];
+
+ /**
+ * pointers to the data planes/channels.
+ *
+ * For video, this should simply point to data[].
+ *
+ * For planar audio, each channel has a separate data pointer, and
+ * linesize[0] contains the size of each channel buffer.
+ * For packed audio, there is just one data pointer, and linesize[0]
+ * contains the total size of the buffer for all channels.
+ *
+ * Note: Both data and extended_data should always be set in a valid frame,
+ * but for planar audio with more channels that can fit in data,
+ * extended_data must be used in order to access all channels.
+ */
+ uint8_t **extended_data;
+
+ /**
+ * width and height of the video frame
+ */
+ int width, height;
+
+ /**
+ * number of audio samples (per channel) described by this frame
+ */
+ int nb_samples;
+
+ /**
+ * format of the frame, -1 if unknown or unset
+ * Values correspond to enum AVPixelFormat for video frames,
+ * enum AVSampleFormat for audio)
+ */
+ int format;
+
+ /**
+ * 1 -> keyframe, 0-> not
+ */
+ int key_frame;
+
+ /**
+ * Picture type of the frame.
+ */
+ enum AVPictureType pict_type;
+
+ /**
+ * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * Presentation timestamp in time_base units (time when frame should be shown to user).
+ */
+ int64_t pts;
+
+ /**
+ * PTS copied from the AVPacket that was decoded to produce this frame.
+ */
+ int64_t pkt_pts;
+
+ /**
+ * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used)
+ * This is also the Presentation time of this AVFrame calculated from
+ * only AVPacket.dts values without pts values.
+ */
+ int64_t pkt_dts;
+
+ /**
+ * picture number in bitstream order
+ */
+ int coded_picture_number;
+ /**
+ * picture number in display order
+ */
+ int display_picture_number;
+
+ /**
+ * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
+ */
+ int quality;
+
+ /**
+ * for some private data of the user
+ */
+ void *opaque;
+
+#if FF_API_ERROR_FRAME
+ /**
+ * @deprecated unused
+ */
+ attribute_deprecated
+ uint64_t error[AV_NUM_DATA_POINTERS];
+#endif
+
+ /**
+ * When decoding, this signals how much the picture must be delayed.
+ * extra_delay = repeat_pict / (2*fps)
+ */
+ int repeat_pict;
+
+ /**
+ * The content of the picture is interlaced.
+ */
+ int interlaced_frame;
+
+ /**
+ * If the content is interlaced, is top field displayed first.
+ */
+ int top_field_first;
+
+ /**
+ * Tell user application that palette has changed from previous frame.
+ */
+ int palette_has_changed;
+
+ /**
+ * reordered opaque 64bit (generally an integer or a double precision float
+ * PTS but can be anything).
+ * The user sets AVCodecContext.reordered_opaque to represent the input at
+ * that time,
+ * the decoder reorders values as needed and sets AVFrame.reordered_opaque
+ * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * Sample rate of the audio data.
+ */
+ int sample_rate;
+
+ /**
+ * Channel layout of the audio data.
+ */
+ uint64_t channel_layout;
+
+ /**
+ * AVBuffer references backing the data for this frame. If all elements of
+ * this array are NULL, then this frame is not reference counted. This array
+ * must be filled contiguously -- if buf[i] is non-NULL then buf[j] must
+ * also be non-NULL for all j < i.
+ *
+ * There may be at most one AVBuffer per data plane, so for video this array
+ * always contains all the references. For planar audio with more than
+ * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
+ * this array. Then the extra AVBufferRef pointers are stored in the
+ * extended_buf array.
+ */
+ AVBufferRef *buf[AV_NUM_DATA_POINTERS];
+
+ /**
+ * For planar audio which requires more than AV_NUM_DATA_POINTERS
+ * AVBufferRef pointers, this array will hold all the references which
+ * cannot fit into AVFrame.buf.
+ *
+ * Note that this is different from AVFrame.extended_data, which always
+ * contains all the pointers. This array only contains the extra pointers,
+ * which cannot fit into AVFrame.buf.
+ *
+ * This array is always allocated using av_malloc() by whoever constructs
+ * the frame. It is freed in av_frame_unref().
+ */
+ AVBufferRef **extended_buf;
+ /**
+ * Number of elements in extended_buf.
+ */
+ int nb_extended_buf;
+
+ AVFrameSideData **side_data;
+ int nb_side_data;
+
+/**
+ * @defgroup lavu_frame_flags AV_FRAME_FLAGS
+ * Flags describing additional frame properties.
+ *
+ * @{
+ */
+
+/**
+ * The frame data may be corrupted, e.g. due to decoding errors.
+ */
+#define AV_FRAME_FLAG_CORRUPT (1 << 0)
+/**
+ * @}
+ */
+
+ /**
+ * Frame flags, a combination of @ref lavu_frame_flags
+ */
+ int flags;
+
+ /**
+ * MPEG vs JPEG YUV range.
+ * It must be accessed using av_frame_get_color_range() and
+ * av_frame_set_color_range().
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorRange color_range;
+
+ enum AVColorPrimaries color_primaries;
+
+ enum AVColorTransferCharacteristic color_trc;
+
+ /**
+ * YUV colorspace type.
+ * It must be accessed using av_frame_get_colorspace() and
+ * av_frame_set_colorspace().
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorSpace colorspace;
+
+ enum AVChromaLocation chroma_location;
+
+ /**
+ * frame timestamp estimated using various heuristics, in stream time base
+ * Code outside libavutil should access this field using:
+ * av_frame_get_best_effort_timestamp(frame)
+ * - encoding: unused
+ * - decoding: set by libavcodec, read by user.
+ */
+ int64_t best_effort_timestamp;
+
+ /**
+ * reordered pos from the last AVPacket that has been input into the decoder
+ * Code outside libavutil should access this field using:
+ * av_frame_get_pkt_pos(frame)
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_pos;
+
+ /**
+ * duration of the corresponding packet, expressed in
+ * AVStream->time_base units, 0 if unknown.
+ * Code outside libavutil should access this field using:
+ * av_frame_get_pkt_duration(frame)
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_duration;
+
+ /**
+ * metadata.
+ * Code outside libavutil should access this field using:
+ * av_frame_get_metadata(frame)
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVDictionary *metadata;
+
+ /**
+ * decode error flags of the frame, set to a combination of
+ * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there
+ * were errors during the decoding.
+ * Code outside libavutil should access this field using:
+ * av_frame_get_decode_error_flags(frame)
+ * - encoding: unused
+ * - decoding: set by libavcodec, read by user.
+ */
+ int decode_error_flags;
+#define FF_DECODE_ERROR_INVALID_BITSTREAM 1
+#define FF_DECODE_ERROR_MISSING_REFERENCE 2
+
+ /**
+ * number of audio channels, only used for audio.
+ * Code outside libavutil should access this field using:
+ * av_frame_get_channels(frame)
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int channels;
+
+ /**
+ * size of the corresponding packet containing the compressed
+ * frame. It must be accessed using av_frame_get_pkt_size() and
+ * av_frame_set_pkt_size().
+ * It is set to a negative value if unknown.
+ * - encoding: unused
+ * - decoding: set by libavcodec, read by user.
+ */
+ int pkt_size;
+
+#if FF_API_FRAME_QP
+ /**
+ * QP table
+ * Not to be accessed directly from outside libavutil
+ */
+ attribute_deprecated
+ int8_t *qscale_table;
+ /**
+ * QP store stride
+ * Not to be accessed directly from outside libavutil
+ */
+ attribute_deprecated
+ int qstride;
+
+ attribute_deprecated
+ int qscale_type;
+
+ /**
+ * Not to be accessed directly from outside libavutil
+ */
+ AVBufferRef *qp_table_buf;
+#endif
+} AVFrame;
+
+/**
+ * Accessors for some AVFrame fields.
+ * The position of these field in the structure is not part of the ABI,
+ * they should not be accessed directly outside libavutil.
+ */
+int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame);
+void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val);
+int64_t av_frame_get_pkt_duration (const AVFrame *frame);
+void av_frame_set_pkt_duration (AVFrame *frame, int64_t val);
+int64_t av_frame_get_pkt_pos (const AVFrame *frame);
+void av_frame_set_pkt_pos (AVFrame *frame, int64_t val);
+int64_t av_frame_get_channel_layout (const AVFrame *frame);
+void av_frame_set_channel_layout (AVFrame *frame, int64_t val);
+int av_frame_get_channels (const AVFrame *frame);
+void av_frame_set_channels (AVFrame *frame, int val);
+int av_frame_get_sample_rate (const AVFrame *frame);
+void av_frame_set_sample_rate (AVFrame *frame, int val);
+AVDictionary *av_frame_get_metadata (const AVFrame *frame);
+void av_frame_set_metadata (AVFrame *frame, AVDictionary *val);
+int av_frame_get_decode_error_flags (const AVFrame *frame);
+void av_frame_set_decode_error_flags (AVFrame *frame, int val);
+int av_frame_get_pkt_size(const AVFrame *frame);
+void av_frame_set_pkt_size(AVFrame *frame, int val);
+AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame);
+#if FF_API_FRAME_QP
+int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type);
+int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type);
+#endif
+enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame);
+void av_frame_set_colorspace(AVFrame *frame, enum AVColorSpace val);
+enum AVColorRange av_frame_get_color_range(const AVFrame *frame);
+void av_frame_set_color_range(AVFrame *frame, enum AVColorRange val);
+
+/**
+ * Get the name of a colorspace.
+ * @return a static string identifying the colorspace; can be NULL.
+ */
+const char *av_get_colorspace_name(enum AVColorSpace val);
+
+/**
+ * Allocate an AVFrame and set its fields to default values. The resulting
+ * struct must be freed using av_frame_free().
+ *
+ * @return An AVFrame filled with default values or NULL on failure.
+ *
+ * @note this only allocates the AVFrame itself, not the data buffers. Those
+ * must be allocated through other means, e.g. with av_frame_get_buffer() or
+ * manually.
+ */
+AVFrame *av_frame_alloc(void);
+
+/**
+ * Free the frame and any dynamically allocated objects in it,
+ * e.g. extended_data. If the frame is reference counted, it will be
+ * unreferenced first.
+ *
+ * @param frame frame to be freed. The pointer will be set to NULL.
+ */
+void av_frame_free(AVFrame **frame);
+
+/**
+ * Set up a new reference to the data described by the source frame.
+ *
+ * Copy frame properties from src to dst and create a new reference for each
+ * AVBufferRef from src.
+ *
+ * If src is not reference counted, new buffers are allocated and the data is
+ * copied.
+ *
+ * @return 0 on success, a negative AVERROR on error
+ */
+int av_frame_ref(AVFrame *dst, const AVFrame *src);
+
+/**
+ * Create a new frame that references the same data as src.
+ *
+ * This is a shortcut for av_frame_alloc()+av_frame_ref().
+ *
+ * @return newly created AVFrame on success, NULL on error.
+ */
+AVFrame *av_frame_clone(const AVFrame *src);
+
+/**
+ * Unreference all the buffers referenced by frame and reset the frame fields.
+ */
+void av_frame_unref(AVFrame *frame);
+
+/**
+ * Move everything contained in src to dst and reset src.
+ */
+void av_frame_move_ref(AVFrame *dst, AVFrame *src);
+
+/**
+ * Allocate new buffer(s) for audio or video data.
+ *
+ * The following fields must be set on frame before calling this function:
+ * - format (pixel format for video, sample format for audio)
+ * - width and height for video
+ * - nb_samples and channel_layout for audio
+ *
+ * This function will fill AVFrame.data and AVFrame.buf arrays and, if
+ * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.
+ * For planar formats, one buffer will be allocated for each plane.
+ *
+ * @param frame frame in which to store the new buffers.
+ * @param align required buffer size alignment
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ */
+int av_frame_get_buffer(AVFrame *frame, int align);
+
+/**
+ * Check if the frame data is writable.
+ *
+ * @return A positive value if the frame data is writable (which is true if and
+ * only if each of the underlying buffers has only one reference, namely the one
+ * stored in this frame). Return 0 otherwise.
+ *
+ * If 1 is returned the answer is valid until av_buffer_ref() is called on any
+ * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).
+ *
+ * @see av_frame_make_writable(), av_buffer_is_writable()
+ */
+int av_frame_is_writable(AVFrame *frame);
+
+/**
+ * Ensure that the frame data is writable, avoiding data copy if possible.
+ *
+ * Do nothing if the frame is writable, allocate new buffers and copy the data
+ * if it is not.
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ *
+ * @see av_frame_is_writable(), av_buffer_is_writable(),
+ * av_buffer_make_writable()
+ */
+int av_frame_make_writable(AVFrame *frame);
+
+/**
+ * Copy the frame data from src to dst.
+ *
+ * This function does not allocate anything, dst must be already initialized and
+ * allocated with the same parameters as src.
+ *
+ * This function only copies the frame data (i.e. the contents of the data /
+ * extended data arrays), not any other properties.
+ *
+ * @return >= 0 on success, a negative AVERROR on error.
+ */
+int av_frame_copy(AVFrame *dst, const AVFrame *src);
+
+/**
+ * Copy only "metadata" fields from src to dst.
+ *
+ * Metadata for the purpose of this function are those fields that do not affect
+ * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample
+ * aspect ratio (for video), but not width/height or channel layout.
+ * Side data is also copied.
+ */
+int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
+
+/**
+ * Get the buffer reference a given data plane is stored in.
+ *
+ * @param plane index of the data plane of interest in frame->extended_data.
+ *
+ * @return the buffer reference that contains the plane or NULL if the input
+ * frame is not valid.
+ */
+AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane);
+
+/**
+ * Add a new side data to a frame.
+ *
+ * @param frame a frame to which the side data should be added
+ * @param type type of the added side data
+ * @param size size of the side data
+ *
+ * @return newly added side data on success, NULL on error
+ */
+AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
+ enum AVFrameSideDataType type,
+ int size);
+
+/**
+ * @return a pointer to the side data of a given type on success, NULL if there
+ * is no side data with such type in this frame.
+ */
+AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
+ enum AVFrameSideDataType type);
+
+/**
+ * If side data of the supplied type exists in the frame, free it and remove it
+ * from the frame.
+ */
+void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type);
+
+/**
+ * @return a string identifying the side data type
+ */
+const char *av_frame_side_data_name(enum AVFrameSideDataType type);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_FRAME_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/intfloat.h
new file mode 100644
index 000000000..fe3d7ec4a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/intfloat.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2011 Mans Rullgard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_H
+#define AVUTIL_INTFLOAT_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+union av_intfloat32 {
+ uint32_t i;
+ float f;
+};
+
+union av_intfloat64 {
+ uint64_t i;
+ double f;
+};
+
+/**
+ * Reinterpret a 32-bit integer as a float.
+ */
+static av_always_inline float av_int2float(uint32_t i)
+{
+ union av_intfloat32 v;
+ v.i = i;
+ return v.f;
+}
+
+/**
+ * Reinterpret a float as a 32-bit integer.
+ */
+static av_always_inline uint32_t av_float2int(float f)
+{
+ union av_intfloat32 v;
+ v.f = f;
+ return v.i;
+}
+
+/**
+ * Reinterpret a 64-bit integer as a double.
+ */
+static av_always_inline double av_int2double(uint64_t i)
+{
+ union av_intfloat64 v;
+ v.i = i;
+ return v.f;
+}
+
+/**
+ * Reinterpret a double as a 64-bit integer.
+ */
+static av_always_inline uint64_t av_double2int(double f)
+{
+ union av_intfloat64 v;
+ v.f = f;
+ return v.i;
+}
+
+#endif /* AVUTIL_INTFLOAT_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/log.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/log.h
new file mode 100644
index 000000000..321748cd8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/log.h
@@ -0,0 +1,359 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LOG_H
+#define AVUTIL_LOG_H
+
+#include <stdarg.h>
+#include "avutil.h"
+#include "attributes.h"
+#include "version.h"
+
+typedef enum {
+ AV_CLASS_CATEGORY_NA = 0,
+ AV_CLASS_CATEGORY_INPUT,
+ AV_CLASS_CATEGORY_OUTPUT,
+ AV_CLASS_CATEGORY_MUXER,
+ AV_CLASS_CATEGORY_DEMUXER,
+ AV_CLASS_CATEGORY_ENCODER,
+ AV_CLASS_CATEGORY_DECODER,
+ AV_CLASS_CATEGORY_FILTER,
+ AV_CLASS_CATEGORY_BITSTREAM_FILTER,
+ AV_CLASS_CATEGORY_SWSCALER,
+ AV_CLASS_CATEGORY_SWRESAMPLER,
+ AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40,
+ AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
+ AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
+ AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
+ AV_CLASS_CATEGORY_DEVICE_OUTPUT,
+ AV_CLASS_CATEGORY_DEVICE_INPUT,
+ AV_CLASS_CATEGORY_NB, ///< not part of ABI/API
+}AVClassCategory;
+
+#define AV_IS_INPUT_DEVICE(category) \
+ (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \
+ ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \
+ ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT))
+
+#define AV_IS_OUTPUT_DEVICE(category) \
+ (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \
+ ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \
+ ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT))
+
+struct AVOptionRanges;
+
+/**
+ * Describe the class of an AVClass context structure. That is an
+ * arbitrary struct of which the first field is a pointer to an
+ * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
+ */
+typedef struct AVClass {
+ /**
+ * The name of the class; usually it is the same name as the
+ * context structure type to which the AVClass is associated.
+ */
+ const char* class_name;
+
+ /**
+ * A pointer to a function which returns the name of a context
+ * instance ctx associated with the class.
+ */
+ const char* (*item_name)(void* ctx);
+
+ /**
+ * a pointer to the first option specified in the class if any or NULL
+ *
+ * @see av_set_default_options()
+ */
+ const struct AVOption *option;
+
+ /**
+ * LIBAVUTIL_VERSION with which this structure was created.
+ * This is used to allow fields to be added without requiring major
+ * version bumps everywhere.
+ */
+
+ int version;
+
+ /**
+ * Offset in the structure where log_level_offset is stored.
+ * 0 means there is no such variable
+ */
+ int log_level_offset_offset;
+
+ /**
+ * Offset in the structure where a pointer to the parent context for
+ * logging is stored. For example a decoder could pass its AVCodecContext
+ * to eval as such a parent context, which an av_log() implementation
+ * could then leverage to display the parent context.
+ * The offset can be NULL.
+ */
+ int parent_log_context_offset;
+
+ /**
+ * Return next AVOptions-enabled child or NULL
+ */
+ void* (*child_next)(void *obj, void *prev);
+
+ /**
+ * Return an AVClass corresponding to the next potential
+ * AVOptions-enabled child.
+ *
+ * The difference between child_next and this is that
+ * child_next iterates over _already existing_ objects, while
+ * child_class_next iterates over _all possible_ children.
+ */
+ const struct AVClass* (*child_class_next)(const struct AVClass *prev);
+
+ /**
+ * Category used for visualization (like color)
+ * This is only set if the category is equal for all objects using this class.
+ * available since version (51 << 16 | 56 << 8 | 100)
+ */
+ AVClassCategory category;
+
+ /**
+ * Callback to return the category.
+ * available since version (51 << 16 | 59 << 8 | 100)
+ */
+ AVClassCategory (*get_category)(void* ctx);
+
+ /**
+ * Callback to return the supported/allowed ranges.
+ * available since version (52.12)
+ */
+ int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags);
+} AVClass;
+
+/**
+ * @addtogroup lavu_log
+ *
+ * @{
+ *
+ * @defgroup lavu_log_constants Logging Constants
+ *
+ * @{
+ */
+
+/**
+ * Print no output.
+ */
+#define AV_LOG_QUIET -8
+
+/**
+ * Something went really wrong and we will crash now.
+ */
+#define AV_LOG_PANIC 0
+
+/**
+ * Something went wrong and recovery is not possible.
+ * For example, no header was found for a format which depends
+ * on headers or an illegal combination of parameters is used.
+ */
+#define AV_LOG_FATAL 8
+
+/**
+ * Something went wrong and cannot losslessly be recovered.
+ * However, not all future data is affected.
+ */
+#define AV_LOG_ERROR 16
+
+/**
+ * Something somehow does not look correct. This may or may not
+ * lead to problems. An example would be the use of '-vstrict -2'.
+ */
+#define AV_LOG_WARNING 24
+
+/**
+ * Standard information.
+ */
+#define AV_LOG_INFO 32
+
+/**
+ * Detailed information.
+ */
+#define AV_LOG_VERBOSE 40
+
+/**
+ * Stuff which is only useful for libav* developers.
+ */
+#define AV_LOG_DEBUG 48
+
+/**
+ * Extremely verbose debugging, useful for libav* development.
+ */
+#define AV_LOG_TRACE 56
+
+#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET)
+
+/**
+ * @}
+ */
+
+/**
+ * Sets additional colors for extended debugging sessions.
+ * @code
+ av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n");
+ @endcode
+ * Requires 256color terminal support. Uses outside debugging is not
+ * recommended.
+ */
+#define AV_LOG_C(x) ((x) << 8)
+
+/**
+ * Send the specified message to the log if the level is less than or equal
+ * to the current av_log_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different logging callback
+ * function.
+ * @see av_log_set_callback
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct or NULL if general log.
+ * @param level The importance level of the message expressed using a @ref
+ * lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ */
+void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
+
+
+/**
+ * Send the specified message to the log if the level is less than or equal
+ * to the current av_log_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different logging callback
+ * function.
+ * @see av_log_set_callback
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message expressed using a @ref
+ * lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ * @param vl The arguments referenced by the format string.
+ */
+void av_vlog(void *avcl, int level, const char *fmt, va_list vl);
+
+/**
+ * Get the current log level
+ *
+ * @see lavu_log_constants
+ *
+ * @return Current log level
+ */
+int av_log_get_level(void);
+
+/**
+ * Set the log level
+ *
+ * @see lavu_log_constants
+ *
+ * @param level Logging level
+ */
+void av_log_set_level(int level);
+
+/**
+ * Set the logging callback
+ *
+ * @note The callback must be thread safe, even if the application does not use
+ * threads itself as some codecs are multithreaded.
+ *
+ * @see av_log_default_callback
+ *
+ * @param callback A logging function with a compatible signature.
+ */
+void av_log_set_callback(void (*callback)(void*, int, const char*, va_list));
+
+/**
+ * Default logging callback
+ *
+ * It prints the message to stderr, optionally colorizing it.
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message expressed using a @ref
+ * lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ * @param vl The arguments referenced by the format string.
+ */
+void av_log_default_callback(void *avcl, int level, const char *fmt,
+ va_list vl);
+
+/**
+ * Return the context name
+ *
+ * @param ctx The AVClass context
+ *
+ * @return The AVClass class_name
+ */
+const char* av_default_item_name(void* ctx);
+AVClassCategory av_default_get_category(void *ptr);
+
+/**
+ * Format a line of log the same way as the default callback.
+ * @param line buffer to receive the formatted line
+ * @param line_size size of the buffer
+ * @param print_prefix used to store whether the prefix must be printed;
+ * must point to a persistent integer initially set to 1
+ */
+void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,
+ char *line, int line_size, int *print_prefix);
+
+#if FF_API_DLOG
+/**
+ * av_dlog macros
+ * @deprecated unused
+ * Useful to print debug messages that shouldn't get compiled in normally.
+ */
+
+#ifdef DEBUG
+# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
+#else
+# define av_dlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0)
+#endif
+#endif /* FF_API_DLOG */
+
+/**
+ * Skip repeated messages, this requires the user app to use av_log() instead of
+ * (f)printf as the 2 would otherwise interfere and lead to
+ * "Last message repeated x times" messages below (f)printf messages with some
+ * bad luck.
+ * Also to receive the last, "last repeated" line if any, the user app must
+ * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end
+ */
+#define AV_LOG_SKIP_REPEATED 1
+
+/**
+ * Include the log severity in messages originating from codecs.
+ *
+ * Results in messages such as:
+ * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts
+ */
+#define AV_LOG_PRINT_LEVEL 2
+
+void av_log_set_flags(int arg);
+int av_log_get_flags(void);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_LOG_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/macros.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/macros.h
new file mode 100644
index 000000000..2007ee561
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/macros.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @ingroup lavu
+ * Utility Preprocessor macros
+ */
+
+#ifndef AVUTIL_MACROS_H
+#define AVUTIL_MACROS_H
+
+/**
+ * @addtogroup preproc_misc Preprocessor String Macros
+ *
+ * String manipulation macros
+ *
+ * @{
+ */
+
+#define AV_STRINGIFY(s) AV_TOSTRING(s)
+#define AV_TOSTRING(s) #s
+
+#define AV_GLUE(a, b) a ## b
+#define AV_JOIN(a, b) AV_GLUE(a, b)
+
+/**
+ * @}
+ */
+
+#define AV_PRAGMA(s) _Pragma(#s)
+
+#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
+
+#endif /* AVUTIL_MACROS_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mathematics.h
new file mode 100644
index 000000000..57c44f845
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mathematics.h
@@ -0,0 +1,165 @@
+/*
+ * copyright (c) 2005-2012 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MATHEMATICS_H
+#define AVUTIL_MATHEMATICS_H
+
+#include <stdint.h>
+#include <math.h>
+#include "attributes.h"
+#include "rational.h"
+#include "intfloat.h"
+
+#ifndef M_E
+#define M_E 2.7182818284590452354 /* e */
+#endif
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530942 /* log_e 2 */
+#endif
+#ifndef M_LN10
+#define M_LN10 2.30258509299404568402 /* log_e 10 */
+#endif
+#ifndef M_LOG2_10
+#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
+#endif
+#ifndef M_PHI
+#define M_PHI 1.61803398874989484820 /* phi / golden ratio */
+#endif
+#ifndef M_PI
+#define M_PI 3.14159265358979323846 /* pi */
+#endif
+#ifndef M_PI_2
+#define M_PI_2 1.57079632679489661923 /* pi/2 */
+#endif
+#ifndef M_SQRT1_2
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+#endif
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#endif
+#ifndef NAN
+#define NAN av_int2float(0x7fc00000)
+#endif
+#ifndef INFINITY
+#define INFINITY av_int2float(0x7f800000)
+#endif
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+
+enum AVRounding {
+ AV_ROUND_ZERO = 0, ///< Round toward zero.
+ AV_ROUND_INF = 1, ///< Round away from zero.
+ AV_ROUND_DOWN = 2, ///< Round toward -infinity.
+ AV_ROUND_UP = 3, ///< Round toward +infinity.
+ AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
+ AV_ROUND_PASS_MINMAX = 8192, ///< Flag to pass INT64_MIN/MAX through instead of rescaling, this avoids special cases for AV_NOPTS_VALUE
+};
+
+/**
+ * Compute the greatest common divisor of a and b.
+ *
+ * @return gcd of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0;
+ * if a == 0 and b == 0, returns 0.
+ */
+int64_t av_const av_gcd(int64_t a, int64_t b);
+
+/**
+ * Rescale a 64-bit integer with rounding to nearest.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
+
+/**
+ * Rescale a 64-bit integer with specified rounding.
+ * A simple a*b/c isn't possible as it can overflow.
+ *
+ * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is
+ * INT64_MIN or INT64_MAX then a is passed through unchanged.
+ */
+int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers.
+ */
+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
+ *
+ * @return rescaled value a, or if AV_ROUND_PASS_MINMAX is set and a is
+ * INT64_MIN or INT64_MAX then a is passed through unchanged.
+ */
+int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
+ enum AVRounding) av_const;
+
+/**
+ * Compare 2 timestamps each in its own timebases.
+ * The result of the function is undefined if one of the timestamps
+ * is outside the int64_t range when represented in the others timebase.
+ * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position
+ */
+int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
+
+/**
+ * Compare 2 integers modulo mod.
+ * That is we compare integers a and b for which only the least
+ * significant log2(mod) bits are known.
+ *
+ * @param mod must be a power of 2
+ * @return a negative value if a is smaller than b
+ * a positive value if a is greater than b
+ * 0 if a equals b
+ */
+int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
+
+/**
+ * Rescale a timestamp while preserving known durations.
+ *
+ * @param in_ts Input timestamp
+ * @param in_tb Input timebase
+ * @param fs_tb Duration and *last timebase
+ * @param duration duration till the next call
+ * @param out_tb Output timebase
+ */
+int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int duration, int64_t *last, AVRational out_tb);
+
+/**
+ * Add a value to a timestamp.
+ *
+ * This function guarantees that when the same value is repeatly added that
+ * no accumulation of rounding errors occurs.
+ *
+ * @param ts Input timestamp
+ * @param ts_tb Input timestamp timebase
+ * @param inc value to add to ts
+ * @param inc_tb inc timebase
+ */
+int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc);
+
+
+ /**
+ * @}
+ */
+
+#endif /* AVUTIL_MATHEMATICS_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mem.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mem.h
new file mode 100644
index 000000000..d25b3229b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/mem.h
@@ -0,0 +1,406 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * memory handling functions
+ */
+
+#ifndef AVUTIL_MEM_H
+#define AVUTIL_MEM_H
+
+#include <limits.h>
+#include <stdint.h>
+
+#include "attributes.h"
+#include "error.h"
+#include "avutil.h"
+
+/**
+ * @addtogroup lavu_mem
+ * @{
+ */
+
+
+#if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v
+#elif defined(__TI_COMPILER_VERSION__)
+ #define DECLARE_ALIGNED(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ t __attribute__((aligned(n))) v
+ #define DECLARE_ASM_CONST(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ static const t __attribute__((aligned(n))) v
+#elif defined(__GNUC__)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v
+#elif defined(_MSC_VER)
+ #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
+ #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v
+#else
+ #define DECLARE_ALIGNED(n,t,v) t v
+ #define DECLARE_ASM_CONST(n,t,v) static const t v
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+ #define av_malloc_attrib __attribute__((__malloc__))
+#else
+ #define av_malloc_attrib
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+ #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
+#else
+ #define av_alloc_size(...)
+#endif
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU).
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ */
+void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Allocate a block of size * nmemb bytes with av_malloc().
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_malloc()
+ */
+av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size)
+{
+ if (!size || nmemb >= INT_MAX / size)
+ return NULL;
+ return av_malloc(nmemb * size);
+}
+
+/**
+ * Allocate or reallocate a block of memory.
+ * If ptr is NULL and size > 0, allocate a new block. If
+ * size is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a memory block already allocated with
+ * av_realloc() or NULL.
+ * @param size Size in bytes of the memory block to be allocated or
+ * reallocated.
+ * @return Pointer to a newly-reallocated block or NULL if the block
+ * cannot be reallocated or the function is used to free the memory block.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_realloc(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ * @see av_fast_realloc()
+ */
+void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
+
+/**
+ * Allocate or reallocate a block of memory.
+ * This function does the same thing as av_realloc, except:
+ * - It takes two arguments and checks the result of the multiplication for
+ * integer overflow.
+ * - It frees the input block in case of failure, thus avoiding the memory
+ * leak with the classic "buf = realloc(buf); if (!buf) return -1;".
+ */
+void *av_realloc_f(void *ptr, size_t nelem, size_t elsize);
+
+/**
+ * Allocate or reallocate a block of memory.
+ * If *ptr is NULL and size > 0, allocate a new block. If
+ * size is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a pointer to a memory block already allocated
+ * with av_realloc(), or pointer to a pointer to NULL.
+ * The pointer is updated on success, or freed on failure.
+ * @param size Size in bytes for the memory block to be allocated or
+ * reallocated
+ * @return Zero on success, an AVERROR error code on failure.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_reallocp(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ */
+av_warn_unused_result
+int av_reallocp(void *ptr, size_t size);
+
+/**
+ * Allocate or reallocate an array.
+ * If ptr is NULL and nmemb > 0, allocate a new block. If
+ * nmemb is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a memory block already allocated with
+ * av_realloc() or NULL.
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to a newly-reallocated block or NULL if the block
+ * cannot be reallocated or the function is used to free the memory block.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_realloc(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ */
+av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size);
+
+/**
+ * Allocate or reallocate an array through a pointer to a pointer.
+ * If *ptr is NULL and nmemb > 0, allocate a new block. If
+ * nmemb is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a pointer to a memory block already allocated
+ * with av_realloc(), or pointer to a pointer to NULL.
+ * The pointer is updated on success, or freed on failure.
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Zero on success, an AVERROR error code on failure.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_realloc(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ */
+av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc().
+ * @param ptr Pointer to the memory block which should be freed.
+ * @note ptr = NULL is explicitly allowed.
+ * @note It is recommended that you use av_freep() instead.
+ * @see av_freep()
+ */
+void av_free(void *ptr);
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU) and
+ * zero all the bytes of the block.
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if it cannot be allocated.
+ * @see av_malloc()
+ */
+void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Allocate a block of nmemb * size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU) and
+ * zero all the bytes of the block.
+ * The allocation will fail if nmemb * size is greater than or equal
+ * to INT_MAX.
+ * @param nmemb
+ * @param size
+ * @return Pointer to the allocated block, NULL if it cannot be allocated.
+ */
+void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib;
+
+/**
+ * Allocate a block of size * nmemb bytes with av_mallocz().
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ * @see av_malloc_array()
+ */
+av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size)
+{
+ if (!size || nmemb >= INT_MAX / size)
+ return NULL;
+ return av_mallocz(nmemb * size);
+}
+
+/**
+ * Duplicate the string s.
+ * @param s string to be duplicated
+ * @return Pointer to a newly-allocated string containing a
+ * copy of s or NULL if the string cannot be allocated.
+ */
+char *av_strdup(const char *s) av_malloc_attrib;
+
+/**
+ * Duplicate a substring of the string s.
+ * @param s string to be duplicated
+ * @param len the maximum length of the resulting string (not counting the
+ * terminating byte).
+ * @return Pointer to a newly-allocated string containing a
+ * copy of s or NULL if the string cannot be allocated.
+ */
+char *av_strndup(const char *s, size_t len) av_malloc_attrib;
+
+/**
+ * Duplicate the buffer p.
+ * @param p buffer to be duplicated
+ * @return Pointer to a newly allocated buffer containing a
+ * copy of p or NULL if the buffer cannot be allocated.
+ */
+void *av_memdup(const void *p, size_t size);
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc() and set the pointer pointing to it to NULL.
+ * @param ptr Pointer to the pointer to the memory block which should
+ * be freed.
+ * @note passing a pointer to a NULL pointer is safe and leads to no action.
+ * @see av_free()
+ */
+void av_freep(void *ptr);
+
+/**
+ * Add an element to a dynamic array.
+ *
+ * The array to grow is supposed to be an array of pointers to
+ * structures, and the element to add must be a pointer to an already
+ * allocated structure.
+ *
+ * The array is reallocated when its size reaches powers of 2.
+ * Therefore, the amortized cost of adding an element is constant.
+ *
+ * In case of success, the pointer to the array is updated in order to
+ * point to the new grown array, and the number pointed to by nb_ptr
+ * is incremented.
+ * In case of failure, the array is freed, *tab_ptr is set to NULL and
+ * *nb_ptr is set to 0.
+ *
+ * @param tab_ptr pointer to the array to grow
+ * @param nb_ptr pointer to the number of elements in the array
+ * @param elem element to add
+ * @see av_dynarray_add_nofree(), av_dynarray2_add()
+ */
+void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
+
+/**
+ * Add an element to a dynamic array.
+ *
+ * Function has the same functionality as av_dynarray_add(),
+ * but it doesn't free memory on fails. It returns error code
+ * instead and leave current buffer untouched.
+ *
+ * @param tab_ptr pointer to the array to grow
+ * @param nb_ptr pointer to the number of elements in the array
+ * @param elem element to add
+ * @return >=0 on success, negative otherwise.
+ * @see av_dynarray_add(), av_dynarray2_add()
+ */
+av_warn_unused_result
+int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem);
+
+/**
+ * Add an element of size elem_size to a dynamic array.
+ *
+ * The array is reallocated when its number of elements reaches powers of 2.
+ * Therefore, the amortized cost of adding an element is constant.
+ *
+ * In case of success, the pointer to the array is updated in order to
+ * point to the new grown array, and the number pointed to by nb_ptr
+ * is incremented.
+ * In case of failure, the array is freed, *tab_ptr is set to NULL and
+ * *nb_ptr is set to 0.
+ *
+ * @param tab_ptr pointer to the array to grow
+ * @param nb_ptr pointer to the number of elements in the array
+ * @param elem_size size in bytes of the elements in the array
+ * @param elem_data pointer to the data of the element to add. If NULL, the space of
+ * the new added element is not filled.
+ * @return pointer to the data of the element to copy in the new allocated space.
+ * If NULL, the new allocated space is left uninitialized."
+ * @see av_dynarray_add(), av_dynarray_add_nofree()
+ */
+void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
+ const uint8_t *elem_data);
+
+/**
+ * Multiply two size_t values checking for overflow.
+ * @return 0 if success, AVERROR(EINVAL) if overflow.
+ */
+static inline int av_size_mult(size_t a, size_t b, size_t *r)
+{
+ size_t t = a * b;
+ /* Hack inspired from glibc: only try the division if nelem and elsize
+ * are both greater than sqrt(SIZE_MAX). */
+ if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b)
+ return AVERROR(EINVAL);
+ *r = t;
+ return 0;
+}
+
+/**
+ * Set the maximum size that may me allocated in one block.
+ */
+void av_max_alloc(size_t max);
+
+/**
+ * deliberately overlapping memcpy implementation
+ * @param dst destination buffer
+ * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0
+ * @param cnt number of bytes to copy, must be >= 0
+ *
+ * cnt > back is valid, this will copy the bytes we just copied,
+ * thus creating a repeating pattern with a period length of back.
+ */
+void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
+
+/**
+ * Reallocate the given block if it is not large enough, otherwise do nothing.
+ *
+ * @see av_realloc
+ */
+void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Allocate a buffer, reusing the given one if large enough.
+ *
+ * Contrary to av_fast_realloc the current buffer contents might not be
+ * preserved and on error the old buffer is freed, thus no special
+ * handling to avoid memleaks is necessary.
+ *
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+ * @param size size of the buffer *ptr points to
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+ * *size 0 if an error occurred.
+ */
+void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Allocate a buffer, reusing the given one if large enough.
+ *
+ * All newly allocated space is initially cleared
+ * Contrary to av_fast_realloc the current buffer contents might not be
+ * preserved and on error the old buffer is freed, thus no special
+ * handling to avoid memleaks is necessary.
+ *
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+ * @param size size of the buffer *ptr points to
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+ * *size 0 if an error occurred.
+ */
+void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MEM_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/pixfmt.h
new file mode 100644
index 000000000..32044f077
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/pixfmt.h
@@ -0,0 +1,469 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXFMT_H
+#define AVUTIL_PIXFMT_H
+
+/**
+ * @file
+ * pixel format definitions
+ *
+ */
+
+#include "libavutil/avconfig.h"
+#include "version.h"
+
+#define AVPALETTE_SIZE 1024
+#define AVPALETTE_COUNT 256
+
+/**
+ * Pixel format.
+ *
+ * @note
+ * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
+ * color is put together as:
+ * (A << 24) | (R << 16) | (G << 8) | B
+ * This is stored as BGRA on little-endian CPU architectures and ARGB on
+ * big-endian CPUs.
+ *
+ * @par
+ * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized
+ * image data is stored in AVFrame.data[0]. The palette is transported in
+ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
+ * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is
+ * also endian-specific). Note also that the individual RGB32 palette
+ * components stored in AVFrame.data[1] should be in the range 0..255.
+ * This is important as many custom PAL8 video codecs that were designed
+ * to run on the IBM VGA graphics adapter use 6-bit palette components.
+ *
+ * @par
+ * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like
+ * for pal8. This palette is filled in automatically by the function
+ * allocating the picture.
+ */
+enum AVPixelFormat {
+ AV_PIX_FMT_NONE = -1,
+ AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ AV_PIX_FMT_GRAY8, ///< Y , 8bpp
+ AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ AV_PIX_FMT_PAL8, ///< 8 bit with AV_PIX_FMT_RGB32 palette
+ AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
+ AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range
+ AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range
+#if FF_API_XVMC
+ AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ AV_PIX_FMT_XVMC_MPEG2_IDCT,
+#define AV_PIX_FMT_XVMC AV_PIX_FMT_XVMC_MPEG2_IDCT
+#endif /* FF_API_XVMC */
+ AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
+ AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+#if FF_API_VDPAU
+ AV_PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+#endif
+ AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
+ AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
+
+ AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
+ AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
+
+#if FF_API_VAAPI
+ /** @name Deprecated pixel formats */
+ /**@{*/
+ AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ /**@}*/
+ AV_PIX_FMT_VAAPI = AV_PIX_FMT_VAAPI_VLD,
+#else
+ /**
+ * Hardware acceleration through VA-API, data[3] contains a
+ * VASurfaceID.
+ */
+ AV_PIX_FMT_VAAPI,
+#endif
+
+ AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+#if FF_API_VDPAU
+ AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+#endif
+ AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
+ AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian, X=unused/undefined
+ AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
+ AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian, X=unused/undefined
+ AV_PIX_FMT_YA8, ///< 8bit gray, 8bit alpha
+
+ AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8
+ AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8
+
+ AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+
+ /**
+ * The following 12 formats have the disadvantage of needing 1 format for each bit depth.
+ * Notice that each 9/10 bits sample is stored in 16 bits with extra padding.
+ * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better.
+ */
+ AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+ AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian
+ AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian
+ AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian
+ AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian
+ AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian
+ AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian
+ AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
+ AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
+ AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
+
+ AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface
+
+ AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0
+ AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0
+ AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+
+ AV_PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+ AV_PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+ AV_PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+ AV_PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+
+ AV_PIX_FMT_YVYU422, ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
+
+ AV_PIX_FMT_VDA, ///< HW acceleration through VDA, data[3] contains a CVPixelBufferRef
+
+ AV_PIX_FMT_YA16BE, ///< 16bit gray, 16bit alpha (big-endian)
+ AV_PIX_FMT_YA16LE, ///< 16bit gray, 16bit alpha (little-endian)
+
+ AV_PIX_FMT_GBRAP, ///< planar GBRA 4:4:4:4 32bpp
+ AV_PIX_FMT_GBRAP16BE, ///< planar GBRA 4:4:4:4 64bpp, big-endian
+ AV_PIX_FMT_GBRAP16LE, ///< planar GBRA 4:4:4:4 64bpp, little-endian
+ /**
+ * HW acceleration through QSV, data[3] contains a pointer to the
+ * mfxFrameSurface1 structure.
+ */
+ AV_PIX_FMT_QSV,
+ /**
+ * HW acceleration though MMAL, data[3] contains a pointer to the
+ * MMAL_BUFFER_HEADER_T structure.
+ */
+ AV_PIX_FMT_MMAL,
+
+ AV_PIX_FMT_D3D11VA_VLD, ///< HW decoding through Direct3D11, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer
+
+ AV_PIX_FMT_0RGB=0x123+4,///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
+ AV_PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
+ AV_PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
+ AV_PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
+
+ AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big-endian
+ AV_PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little-endian
+ AV_PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big-endian
+ AV_PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little-endian
+ AV_PIX_FMT_YUVJ411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range
+
+ AV_PIX_FMT_BAYER_BGGR8, ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */
+ AV_PIX_FMT_BAYER_RGGB8, ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */
+ AV_PIX_FMT_BAYER_GBRG8, ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */
+ AV_PIX_FMT_BAYER_GRBG8, ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */
+ AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */
+ AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */
+ AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */
+ AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */
+ AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */
+ AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */
+ AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */
+ AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */
+#if !FF_API_XVMC
+ AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing
+#endif /* !FF_API_XVMC */
+ AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
+ AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
+ AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
+ AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
+ AV_PIX_FMT_AYUV64LE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
+ AV_PIX_FMT_AYUV64BE, ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
+
+ AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox
+
+ AV_PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+};
+
+#define AV_PIX_FMT_Y400A AV_PIX_FMT_GRAY8A
+#define AV_PIX_FMT_GBR24P AV_PIX_FMT_GBRP
+
+#if AV_HAVE_BIGENDIAN
+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be
+#else
+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le
+#endif
+
+#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA)
+#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR)
+#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA)
+#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB)
+#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0)
+#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0)
+
+#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE)
+#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE)
+#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE)
+#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE)
+#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE)
+#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE)
+#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE)
+#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE)
+#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE)
+#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE)
+#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE)
+#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE)
+
+#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
+#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE)
+#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE)
+#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
+#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
+#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE)
+#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE)
+#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE)
+#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE)
+#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE)
+#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE)
+#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE)
+#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE)
+#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE)
+#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
+#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
+#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
+
+#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE)
+#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE)
+#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE)
+#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE)
+#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE)
+#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE)
+
+#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE)
+#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE)
+#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE)
+#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE)
+
+
+#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE)
+#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE)
+#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE)
+#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE)
+#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE)
+#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE)
+#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE)
+#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE)
+#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE)
+
+#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE)
+#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE)
+#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE)
+
+/**
+ * Chromaticity coordinates of the source primaries.
+ */
+enum AVColorPrimaries {
+ AVCOL_PRI_RESERVED0 = 0,
+ AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
+ AVCOL_PRI_UNSPECIFIED = 2,
+ AVCOL_PRI_RESERVED = 3,
+ AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
+
+ AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
+ AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above
+ AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C
+ AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020
+ AVCOL_PRI_SMPTEST428_1= 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ)
+ AVCOL_PRI_NB, ///< Not part of ABI
+};
+
+/**
+ * Color Transfer Characteristic.
+ */
+enum AVColorTransferCharacteristic {
+ AVCOL_TRC_RESERVED0 = 0,
+ AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361
+ AVCOL_TRC_UNSPECIFIED = 2,
+ AVCOL_TRC_RESERVED = 3,
+ AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG
+ AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
+ AVCOL_TRC_SMPTE240M = 7,
+ AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics"
+ AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)"
+ AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
+ AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4
+ AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut
+ AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC)
+ AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system
+ AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system
+ AVCOL_TRC_SMPTEST2084 = 16, ///< SMPTE ST 2084 for 10, 12, 14 and 16 bit systems
+ AVCOL_TRC_SMPTEST428_1 = 17, ///< SMPTE ST 428-1
+ AVCOL_TRC_NB, ///< Not part of ABI
+};
+
+/**
+ * YUV colorspace type.
+ */
+enum AVColorSpace {
+ AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)
+ AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
+ AVCOL_SPC_UNSPECIFIED = 2,
+ AVCOL_SPC_RESERVED = 3,
+ AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
+ AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
+ AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
+ AVCOL_SPC_SMPTE240M = 7,
+ AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
+ AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system
+ AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system
+ AVCOL_SPC_NB, ///< Not part of ABI
+};
+#define AVCOL_SPC_YCGCO AVCOL_SPC_YCOCG
+
+
+/**
+ * MPEG vs JPEG YUV range.
+ */
+enum AVColorRange {
+ AVCOL_RANGE_UNSPECIFIED = 0,
+ AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges
+ AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges
+ AVCOL_RANGE_NB, ///< Not part of ABI
+};
+
+/**
+ * Location of chroma samples.
+ *
+ * Illustration showing the location of the first (top left) chroma sample of the
+ * image, the left shows only luma, the right
+ * shows the location of the chroma sample, the 2 could be imagined to overlay
+ * each other but are drawn separately due to limitations of ASCII
+ *
+ * 1st 2nd 1st 2nd horizontal luma sample positions
+ * v v v v
+ * ______ ______
+ *1st luma line > |X X ... |3 4 X ... X are luma samples,
+ * | |1 2 1-6 are possible chroma positions
+ *2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position
+ */
+enum AVChromaLocation {
+ AVCHROMA_LOC_UNSPECIFIED = 0,
+ AVCHROMA_LOC_LEFT = 1, ///< mpeg2/4 4:2:0, h264 default for 4:2:0
+ AVCHROMA_LOC_CENTER = 2, ///< mpeg1 4:2:0, jpeg 4:2:0, h263 4:2:0
+ AVCHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2
+ AVCHROMA_LOC_TOP = 4,
+ AVCHROMA_LOC_BOTTOMLEFT = 5,
+ AVCHROMA_LOC_BOTTOM = 6,
+ AVCHROMA_LOC_NB, ///< Not part of ABI
+};
+
+#endif /* AVUTIL_PIXFMT_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/rational.h
new file mode 100644
index 000000000..289746968
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/rational.h
@@ -0,0 +1,173 @@
+/*
+ * rational numbers
+ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * rational numbers
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_RATIONAL_H
+#define AVUTIL_RATIONAL_H
+
+#include <stdint.h>
+#include <limits.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+/**
+ * rational number numerator/denominator
+ */
+typedef struct AVRational{
+ int num; ///< numerator
+ int den; ///< denominator
+} AVRational;
+
+/**
+ * Create a rational.
+ * Useful for compilers that do not support compound literals.
+ * @note The return value is not reduced.
+ */
+static inline AVRational av_make_q(int num, int den)
+{
+ AVRational r = { num, den };
+ return r;
+}
+
+/**
+ * Compare two rationals.
+ * @param a first rational
+ * @param b second rational
+ * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
+ * values is of the form 0/0
+ */
+static inline int av_cmp_q(AVRational a, AVRational b){
+ const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
+
+ if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1;
+ else if(b.den && a.den) return 0;
+ else if(a.num && b.num) return (a.num>>31) - (b.num>>31);
+ else return INT_MIN;
+}
+
+/**
+ * Convert rational to double.
+ * @param a rational to convert
+ * @return (double) a
+ */
+static inline double av_q2d(AVRational a){
+ return a.num / (double) a.den;
+}
+
+/**
+ * Reduce a fraction.
+ * This is useful for framerate calculations.
+ * @param dst_num destination numerator
+ * @param dst_den destination denominator
+ * @param num source numerator
+ * @param den source denominator
+ * @param max the maximum allowed for dst_num & dst_den
+ * @return 1 if exact, 0 otherwise
+ */
+int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);
+
+/**
+ * Multiply two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b*c
+ */
+AVRational av_mul_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Divide one rational by another.
+ * @param b first rational
+ * @param c second rational
+ * @return b/c
+ */
+AVRational av_div_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Add two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b+c
+ */
+AVRational av_add_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Subtract one rational from another.
+ * @param b first rational
+ * @param c second rational
+ * @return b-c
+ */
+AVRational av_sub_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Invert a rational.
+ * @param q value
+ * @return 1 / q
+ */
+static av_always_inline AVRational av_inv_q(AVRational q)
+{
+ AVRational r = { q.den, q.num };
+ return r;
+}
+
+/**
+ * Convert a double precision floating point number to a rational.
+ * inf is expressed as {1,0} or {-1,0} depending on the sign.
+ *
+ * @param d double to convert
+ * @param max the maximum allowed numerator and denominator
+ * @return (AVRational) d
+ */
+AVRational av_d2q(double d, int max) av_const;
+
+/**
+ * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
+ * than q1, 0 if they have the same distance.
+ */
+int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
+
+/**
+ * Find the nearest value in q_list to q.
+ * @param q_list an array of rationals terminated by {0, 0}
+ * @return the index of the nearest value found in the array
+ */
+int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
+
+/**
+ * Converts a AVRational to a IEEE 32bit float.
+ *
+ * The float is returned in a uint32_t and its value is platform indepenant.
+ */
+uint32_t av_q2intfloat(AVRational q);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RATIONAL_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/samplefmt.h
new file mode 100644
index 000000000..6a8a031c0
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/samplefmt.h
@@ -0,0 +1,271 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SAMPLEFMT_H
+#define AVUTIL_SAMPLEFMT_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ *
+ * @defgroup lavu_sampfmts Audio sample formats
+ *
+ * Audio sample format enumeration and related convenience functions.
+ * @{
+ *
+ */
+
+/**
+ * Audio sample formats
+ *
+ * - The data described by the sample format is always in native-endian order.
+ * Sample values can be expressed by native C types, hence the lack of a signed
+ * 24-bit sample format even though it is a common raw audio data format.
+ *
+ * - The floating-point formats are based on full volume being in the range
+ * [-1.0, 1.0]. Any values outside this range are beyond full volume level.
+ *
+ * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg
+ * (such as AVFrame in libavcodec) is as follows:
+ *
+ * @par
+ * For planar sample formats, each audio channel is in a separate data plane,
+ * and linesize is the buffer size, in bytes, for a single plane. All data
+ * planes must be the same size. For packed sample formats, only the first data
+ * plane is used, and samples for each channel are interleaved. In this case,
+ * linesize is the buffer size, in bytes, for the 1 plane.
+ *
+ */
+enum AVSampleFormat {
+ AV_SAMPLE_FMT_NONE = -1,
+ AV_SAMPLE_FMT_U8, ///< unsigned 8 bits
+ AV_SAMPLE_FMT_S16, ///< signed 16 bits
+ AV_SAMPLE_FMT_S32, ///< signed 32 bits
+ AV_SAMPLE_FMT_FLT, ///< float
+ AV_SAMPLE_FMT_DBL, ///< double
+
+ AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar
+ AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar
+ AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar
+ AV_SAMPLE_FMT_FLTP, ///< float, planar
+ AV_SAMPLE_FMT_DBLP, ///< double, planar
+
+ AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically
+};
+
+/**
+ * Return the name of sample_fmt, or NULL if sample_fmt is not
+ * recognized.
+ */
+const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);
+
+/**
+ * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE
+ * on error.
+ */
+enum AVSampleFormat av_get_sample_fmt(const char *name);
+
+/**
+ * Return the planar<->packed alternative form of the given sample format, or
+ * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the
+ * requested planar/packed format, the format returned is the same as the
+ * input.
+ */
+enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar);
+
+/**
+ * Get the packed alternative form of the given sample format.
+ *
+ * If the passed sample_fmt is already in packed format, the format returned is
+ * the same as the input.
+ *
+ * @return the packed alternative form of the given sample format or
+ AV_SAMPLE_FMT_NONE on error.
+ */
+enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the planar alternative form of the given sample format.
+ *
+ * If the passed sample_fmt is already in planar format, the format returned is
+ * the same as the input.
+ *
+ * @return the planar alternative form of the given sample format or
+ AV_SAMPLE_FMT_NONE on error.
+ */
+enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt);
+
+/**
+ * Generate a string corresponding to the sample format with
+ * sample_fmt, or a header if sample_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param sample_fmt the number of the sample format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ * @return the pointer to the filled buffer or NULL if sample_fmt is
+ * unknown or in case of other errors
+ */
+char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt);
+
+/**
+ * Return number of bytes per sample.
+ *
+ * @param sample_fmt the sample format
+ * @return number of bytes per sample or zero if unknown for the given
+ * sample format
+ */
+int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
+
+/**
+ * Check if the sample format is planar.
+ *
+ * @param sample_fmt the sample format to inspect
+ * @return 1 if the sample format is planar, 0 if it is interleaved
+ */
+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the required buffer size for the given audio parameters.
+ *
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return required buffer size, or negative error code on failure
+ */
+int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * @}
+ *
+ * @defgroup lavu_sampmanip Samples manipulation
+ *
+ * Functions that manipulate audio samples
+ * @{
+ */
+
+/**
+ * Fill plane data pointers and linesize for samples with sample
+ * format sample_fmt.
+ *
+ * The audio_data array is filled with the pointers to the samples data planes:
+ * for planar, set the start point of each channel's data within the buffer,
+ * for packed, set the start point of the entire buffer only.
+ *
+ * The value pointed to by linesize is set to the aligned size of each
+ * channel's data buffer for planar layout, or to the aligned size of the
+ * buffer for all channels for packed layout.
+ *
+ * The buffer in buf must be big enough to contain all the samples
+ * (use av_samples_get_buffer_size() to compute its minimum size),
+ * otherwise the audio_data pointers will point to invalid data.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param buf the pointer to a buffer containing the samples
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return >=0 on success or a negative error code on failure
+ * @todo return minimum size in bytes required for the buffer in case
+ * of success at the next bump
+ */
+int av_samples_fill_arrays(uint8_t **audio_data, int *linesize,
+ const uint8_t *buf,
+ int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
+ * linesize accordingly.
+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
+ * Allocated data will be initialized to silence.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize aligned size for audio buffer(s), may be NULL
+ * @param nb_channels number of audio channels
+ * @param nb_samples number of samples per channel
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return >=0 on success or a negative error code on failure
+ * @todo return the size of the allocated buffer in case of success at the next bump
+ * @see av_samples_fill_arrays()
+ * @see av_samples_alloc_array_and_samples()
+ */
+int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
+ int nb_samples, enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Allocate a data pointers array, samples buffer for nb_samples
+ * samples, and fill data pointers and linesize accordingly.
+ *
+ * This is the same as av_samples_alloc(), but also allocates the data
+ * pointers array.
+ *
+ * @see av_samples_alloc()
+ */
+int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels,
+ int nb_samples, enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Copy samples from src to dst.
+ *
+ * @param dst destination array of pointers to data planes
+ * @param src source array of pointers to data planes
+ * @param dst_offset offset in samples at which the data will be written to dst
+ * @param src_offset offset in samples at which the data will be read from src
+ * @param nb_samples number of samples to be copied
+ * @param nb_channels number of audio channels
+ * @param sample_fmt audio sample format
+ */
+int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset,
+ int src_offset, int nb_samples, int nb_channels,
+ enum AVSampleFormat sample_fmt);
+
+/**
+ * Fill an audio buffer with silence.
+ *
+ * @param audio_data array of pointers to data planes
+ * @param offset offset in samples at which to start filling
+ * @param nb_samples number of samples to fill
+ * @param nb_channels number of audio channels
+ * @param sample_fmt audio sample format
+ */
+int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples,
+ int nb_channels, enum AVSampleFormat sample_fmt);
+
+/**
+ * @}
+ * @}
+ */
+#endif /* AVUTIL_SAMPLEFMT_H */
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/version.h b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/version.h
new file mode 100644
index 000000000..9ffa7a866
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/include/libavutil/version.h
@@ -0,0 +1,129 @@
+/*
+ * copyright (c) 2003 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_VERSION_H
+#define AVUTIL_VERSION_H
+
+#include "macros.h"
+
+/**
+ * @addtogroup version_utils
+ *
+ * Useful to check and match library version in order to maintain
+ * backward compatibility.
+ *
+ * @{
+ */
+
+#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))
+#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
+
+/**
+ * Extract version components from the full ::AV_VERSION_INT int as returned
+ * by functions like ::avformat_version() and ::avcodec_version()
+ */
+#define AV_VERSION_MAJOR(a) ((a) >> 16)
+#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8)
+#define AV_VERSION_MICRO(a) ((a) & 0xFF)
+
+/**
+ * @}
+ */
+
+/**
+ * @file
+ * @ingroup lavu
+ * Libavutil version macros
+ */
+
+/**
+ * @defgroup lavu_ver Version and Build diagnostics
+ *
+ * Macros and function useful to check at compiletime and at runtime
+ * which version of libavutil is in use.
+ *
+ * @{
+ */
+
+#define LIBAVUTIL_VERSION_MAJOR 55
+#define LIBAVUTIL_VERSION_MINOR 12
+#define LIBAVUTIL_VERSION_MICRO 100
+
+#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT
+
+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
+
+/**
+ * @}
+ *
+ * @defgroup depr_guards Deprecation guards
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *
+ * @note, when bumping the major version it is recommended to manually
+ * disable each FF_API_* in its own commit instead of disabling them all
+ * at once through the bump. This improves the git bisect-ability of the change.
+ *
+ * @{
+ */
+
+#ifndef FF_API_VDPAU
+#define FF_API_VDPAU (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_XVMC
+#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_OPT_TYPE_METADATA
+#define FF_API_OPT_TYPE_METADATA (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_DLOG
+#define FF_API_DLOG (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_VAAPI
+#define FF_API_VAAPI (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_FRAME_QP
+#define FF_API_FRAME_QP (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_PLUS1_MINUS1
+#define FF_API_PLUS1_MINUS1 (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_ERROR_FRAME
+#define FF_API_ERROR_FRAME (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_CRC_BIG_TABLE
+#define FF_API_CRC_BIG_TABLE (LIBAVUTIL_VERSION_MAJOR < 56)
+#endif
+
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_VERSION_H */
+
diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/moz.build b/dom/media/platforms/ffmpeg/ffmpeg57/moz.build
new file mode 100644
index 000000000..6bd5db8d7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/moz.build
@@ -0,0 +1,25 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ '../FFmpegAudioDecoder.cpp',
+ '../FFmpegDataDecoder.cpp',
+ '../FFmpegDecoderModule.cpp',
+ '../FFmpegVideoDecoder.cpp',
+]
+LOCAL_INCLUDES += [
+ '..',
+ 'include',
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += [ '-Wno-deprecated-declarations' ]
+if CONFIG['CLANG_CXX']:
+ CXXFLAGS += [
+ '-Wno-unknown-attributes',
+ ]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
new file mode 100644
index 000000000..0e95e79e6
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
@@ -0,0 +1,113 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FFVPXRuntimeLinker.h"
+#include "FFmpegLibWrapper.h"
+#include "FFmpegLog.h"
+#include "nsIFile.h"
+#include "prmem.h"
+#include "prlink.h"
+
+// We use a known symbol located in lgpllibs to determine its location.
+// soundtouch happens to be always included in lgpllibs
+#include "soundtouch/SoundTouch.h"
+
+namespace mozilla
+{
+
+template <int V> class FFmpegDecoderModule
+{
+public:
+ static already_AddRefed<PlatformDecoderModule> Create(FFmpegLibWrapper*);
+};
+
+static FFmpegLibWrapper sFFVPXLib;
+
+FFVPXRuntimeLinker::LinkStatus FFVPXRuntimeLinker::sLinkStatus =
+ LinkStatus_INIT;
+
+static PRLibrary*
+MozAVLink(const char* aName)
+{
+ PRLibSpec lspec;
+ lspec.type = PR_LibSpec_Pathname;
+ lspec.value.pathname = aName;
+ PRLibrary* lib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
+ if (!lib) {
+ FFMPEG_LOG("unable to load library %s", aName);
+ }
+ return lib;
+}
+
+/* static */ bool
+FFVPXRuntimeLinker::Init()
+{
+ if (sLinkStatus) {
+ return sLinkStatus == LinkStatus_SUCCEEDED;
+ }
+
+ sLinkStatus = LinkStatus_FAILED;
+
+ // We retrieve the path of the lgpllibs library as this is where mozavcodec
+ // and mozavutil libs are located.
+ char* lgpllibsname = PR_GetLibraryName(nullptr, "lgpllibs");
+ if (!lgpllibsname) {
+ return false;
+ }
+ char* path =
+ PR_GetLibraryFilePathname(lgpllibsname,
+ (PRFuncPtr)&soundtouch::SoundTouch::getVersionId);
+ PR_FreeLibraryName(lgpllibsname);
+ if (!path) {
+ return false;
+ }
+ nsCOMPtr<nsIFile> xulFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID);
+ if (!xulFile ||
+ NS_FAILED(xulFile->InitWithNativePath(nsDependentCString(path)))) {
+ PR_Free(path);
+ return false;
+ }
+ PR_Free(path);
+
+ nsCOMPtr<nsIFile> rootDir;
+ if (NS_FAILED(xulFile->GetParent(getter_AddRefs(rootDir))) || !rootDir) {
+ return false;
+ }
+ nsAutoCString rootPath;
+ if (NS_FAILED(rootDir->GetNativePath(rootPath))) {
+ return false;
+ }
+
+ char* libname = NULL;
+ /* Get the platform-dependent library name of the module */
+ libname = PR_GetLibraryName(rootPath.get(), "mozavutil");
+ if (!libname) {
+ return false;
+ }
+ sFFVPXLib.mAVUtilLib = MozAVLink(libname);
+ PR_FreeLibraryName(libname);
+ libname = PR_GetLibraryName(rootPath.get(), "mozavcodec");
+ if (libname) {
+ sFFVPXLib.mAVCodecLib = MozAVLink(libname);
+ PR_FreeLibraryName(libname);
+ }
+ if (sFFVPXLib.Link() == FFmpegLibWrapper::LinkResult::Success) {
+ sLinkStatus = LinkStatus_SUCCEEDED;
+ return true;
+ }
+ return false;
+}
+
+/* static */ already_AddRefed<PlatformDecoderModule>
+FFVPXRuntimeLinker::CreateDecoderModule()
+{
+ if (!Init()) {
+ return nullptr;
+ }
+ return FFmpegDecoderModule<FFVPX_VERSION>::Create(&sFFVPXLib);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.h b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.h
new file mode 100644
index 000000000..f7592a751
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef __FFVPXRuntimeLinker_h__
+#define __FFVPXRuntimeLinker_h__
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla
+{
+
+class FFVPXRuntimeLinker
+{
+public:
+ static bool Init();
+ static already_AddRefed<PlatformDecoderModule> CreateDecoderModule();
+
+private:
+ static enum LinkStatus {
+ LinkStatus_INIT = 0,
+ LinkStatus_FAILED,
+ LinkStatus_SUCCEEDED
+ } sLinkStatus;
+};
+
+}
+
+#endif /* __FFVPXRuntimeLinker_h__ */
diff --git a/dom/media/platforms/ffmpeg/ffvpx/moz.build b/dom/media/platforms/ffmpeg/ffvpx/moz.build
new file mode 100644
index 000000000..aee58b5b0
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffvpx/moz.build
@@ -0,0 +1,45 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+LOCAL_INCLUDES += ['/xpcom/build']
+EXPORTS += [
+ 'FFVPXRuntimeLinker.h',
+]
+
+UNIFIED_SOURCES += [
+ '../FFmpegAudioDecoder.cpp',
+ '../FFmpegDataDecoder.cpp',
+ '../FFmpegDecoderModule.cpp',
+ '../FFmpegVideoDecoder.cpp',
+]
+SOURCES += [
+ 'FFVPXRuntimeLinker.cpp',
+]
+LOCAL_INCLUDES += [
+ '..',
+ '../ffmpeg57/include',
+]
+
+if CONFIG['OS_ARCH'] == 'WINNT':
+ LOCAL_INCLUDES += [
+ '../ffmpeg57/include',
+ ]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += [ '-Wno-deprecated-declarations' ]
+if CONFIG['CLANG_CXX']:
+ CXXFLAGS += [
+ '-Wno-unknown-attributes',
+ ]
+if CONFIG['_MSC_VER']:
+ CXXFLAGS += [
+ '-wd4996', # deprecated declaration
+ ]
+
+DEFINES['FFVPX_VERSION'] = 46465650
+DEFINES['USING_MOZFFVPX'] = True
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/ffmpeg/libav53/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/libav53/include/COPYING.LGPLv2.1
new file mode 100644
index 000000000..00b4fedfe
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/COPYING.LGPLv2.1
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/avcodec.h
new file mode 100644
index 000000000..2451294c1
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/avcodec.h
@@ -0,0 +1,4761 @@
+/*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVCODEC_H
+#define AVCODEC_AVCODEC_H
+
+/**
+ * @file
+ * external API header
+ */
+
+#include <errno.h>
+#include "libavutil/samplefmt.h"
+#include "libavutil/avutil.h"
+#include "libavutil/cpu.h"
+#include "libavutil/dict.h"
+#include "libavutil/log.h"
+#include "libavutil/pixfmt.h"
+#include "libavutil/rational.h"
+
+#include "libavcodec/version.h"
+/**
+ * @defgroup libavc Encoding/Decoding Library
+ * @{
+ *
+ * @defgroup lavc_decoding Decoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_encoding Encoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_codec Codecs
+ * @{
+ * @defgroup lavc_codec_native Native Codecs
+ * @{
+ * @}
+ * @defgroup lavc_codec_wrappers External library wrappers
+ * @{
+ * @}
+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
+ * @{
+ * @}
+ * @}
+ * @defgroup lavc_internal Internal
+ * @{
+ * @}
+ * @}
+ *
+ */
+
+
+/**
+ * Identify the syntax and semantics of the bitstream.
+ * The principle is roughly:
+ * Two decoders with the same ID can decode the same streams.
+ * Two encoders with the same ID can encode compatible streams.
+ * There may be slight deviations from the principle due to implementation
+ * details.
+ *
+ * If you add a codec ID to this list, add it so that
+ * 1. no value of a existing codec ID changes (that would break ABI),
+ * 2. it is as close as possible to similar codecs.
+ */
+enum CodecID {
+ CODEC_ID_NONE,
+
+ /* video codecs */
+ CODEC_ID_MPEG1VIDEO,
+ CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+ CODEC_ID_MPEG2VIDEO_XVMC,
+ CODEC_ID_H261,
+ CODEC_ID_H263,
+ CODEC_ID_RV10,
+ CODEC_ID_RV20,
+ CODEC_ID_MJPEG,
+ CODEC_ID_MJPEGB,
+ CODEC_ID_LJPEG,
+ CODEC_ID_SP5X,
+ CODEC_ID_JPEGLS,
+ CODEC_ID_MPEG4,
+ CODEC_ID_RAWVIDEO,
+ CODEC_ID_MSMPEG4V1,
+ CODEC_ID_MSMPEG4V2,
+ CODEC_ID_MSMPEG4V3,
+ CODEC_ID_WMV1,
+ CODEC_ID_WMV2,
+ CODEC_ID_H263P,
+ CODEC_ID_H263I,
+ CODEC_ID_FLV1,
+ CODEC_ID_SVQ1,
+ CODEC_ID_SVQ3,
+ CODEC_ID_DVVIDEO,
+ CODEC_ID_HUFFYUV,
+ CODEC_ID_CYUV,
+ CODEC_ID_H264,
+ CODEC_ID_INDEO3,
+ CODEC_ID_VP3,
+ CODEC_ID_THEORA,
+ CODEC_ID_ASV1,
+ CODEC_ID_ASV2,
+ CODEC_ID_FFV1,
+ CODEC_ID_4XM,
+ CODEC_ID_VCR1,
+ CODEC_ID_CLJR,
+ CODEC_ID_MDEC,
+ CODEC_ID_ROQ,
+ CODEC_ID_INTERPLAY_VIDEO,
+ CODEC_ID_XAN_WC3,
+ CODEC_ID_XAN_WC4,
+ CODEC_ID_RPZA,
+ CODEC_ID_CINEPAK,
+ CODEC_ID_WS_VQA,
+ CODEC_ID_MSRLE,
+ CODEC_ID_MSVIDEO1,
+ CODEC_ID_IDCIN,
+ CODEC_ID_8BPS,
+ CODEC_ID_SMC,
+ CODEC_ID_FLIC,
+ CODEC_ID_TRUEMOTION1,
+ CODEC_ID_VMDVIDEO,
+ CODEC_ID_MSZH,
+ CODEC_ID_ZLIB,
+ CODEC_ID_QTRLE,
+ CODEC_ID_SNOW,
+ CODEC_ID_TSCC,
+ CODEC_ID_ULTI,
+ CODEC_ID_QDRAW,
+ CODEC_ID_VIXL,
+ CODEC_ID_QPEG,
+ CODEC_ID_PNG,
+ CODEC_ID_PPM,
+ CODEC_ID_PBM,
+ CODEC_ID_PGM,
+ CODEC_ID_PGMYUV,
+ CODEC_ID_PAM,
+ CODEC_ID_FFVHUFF,
+ CODEC_ID_RV30,
+ CODEC_ID_RV40,
+ CODEC_ID_VC1,
+ CODEC_ID_WMV3,
+ CODEC_ID_LOCO,
+ CODEC_ID_WNV1,
+ CODEC_ID_AASC,
+ CODEC_ID_INDEO2,
+ CODEC_ID_FRAPS,
+ CODEC_ID_TRUEMOTION2,
+ CODEC_ID_BMP,
+ CODEC_ID_CSCD,
+ CODEC_ID_MMVIDEO,
+ CODEC_ID_ZMBV,
+ CODEC_ID_AVS,
+ CODEC_ID_SMACKVIDEO,
+ CODEC_ID_NUV,
+ CODEC_ID_KMVC,
+ CODEC_ID_FLASHSV,
+ CODEC_ID_CAVS,
+ CODEC_ID_JPEG2000,
+ CODEC_ID_VMNC,
+ CODEC_ID_VP5,
+ CODEC_ID_VP6,
+ CODEC_ID_VP6F,
+ CODEC_ID_TARGA,
+ CODEC_ID_DSICINVIDEO,
+ CODEC_ID_TIERTEXSEQVIDEO,
+ CODEC_ID_TIFF,
+ CODEC_ID_GIF,
+#if LIBAVCODEC_VERSION_MAJOR == 53
+ CODEC_ID_FFH264,
+#endif
+ CODEC_ID_DXA,
+ CODEC_ID_DNXHD,
+ CODEC_ID_THP,
+ CODEC_ID_SGI,
+ CODEC_ID_C93,
+ CODEC_ID_BETHSOFTVID,
+ CODEC_ID_PTX,
+ CODEC_ID_TXD,
+ CODEC_ID_VP6A,
+ CODEC_ID_AMV,
+ CODEC_ID_VB,
+ CODEC_ID_PCX,
+ CODEC_ID_SUNRAST,
+ CODEC_ID_INDEO4,
+ CODEC_ID_INDEO5,
+ CODEC_ID_MIMIC,
+ CODEC_ID_RL2,
+#if LIBAVCODEC_VERSION_MAJOR == 53
+ CODEC_ID_8SVX_EXP,
+ CODEC_ID_8SVX_FIB,
+#endif
+ CODEC_ID_ESCAPE124,
+ CODEC_ID_DIRAC,
+ CODEC_ID_BFI,
+ CODEC_ID_CMV,
+ CODEC_ID_MOTIONPIXELS,
+ CODEC_ID_TGV,
+ CODEC_ID_TGQ,
+ CODEC_ID_TQI,
+ CODEC_ID_AURA,
+ CODEC_ID_AURA2,
+ CODEC_ID_V210X,
+ CODEC_ID_TMV,
+ CODEC_ID_V210,
+ CODEC_ID_DPX,
+ CODEC_ID_MAD,
+ CODEC_ID_FRWU,
+ CODEC_ID_FLASHSV2,
+ CODEC_ID_CDGRAPHICS,
+ CODEC_ID_R210,
+ CODEC_ID_ANM,
+ CODEC_ID_BINKVIDEO,
+ CODEC_ID_IFF_ILBM,
+ CODEC_ID_IFF_BYTERUN1,
+ CODEC_ID_KGV1,
+ CODEC_ID_YOP,
+ CODEC_ID_VP8,
+ CODEC_ID_PICTOR,
+ CODEC_ID_ANSI,
+ CODEC_ID_A64_MULTI,
+ CODEC_ID_A64_MULTI5,
+ CODEC_ID_R10K,
+ CODEC_ID_MXPEG,
+ CODEC_ID_LAGARITH,
+ CODEC_ID_PRORES,
+ CODEC_ID_JV,
+ CODEC_ID_DFA,
+ CODEC_ID_WMV3IMAGE,
+ CODEC_ID_VC1IMAGE,
+#if LIBAVCODEC_VERSION_MAJOR == 53
+ CODEC_ID_G723_1,
+ CODEC_ID_G729,
+#endif
+ CODEC_ID_UTVIDEO,
+ CODEC_ID_BMV_VIDEO,
+ CODEC_ID_VBLE,
+ CODEC_ID_DXTORY,
+ CODEC_ID_V410,
+
+ /* various PCM "codecs" */
+ CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ CODEC_ID_PCM_S16LE = 0x10000,
+ CODEC_ID_PCM_S16BE,
+ CODEC_ID_PCM_U16LE,
+ CODEC_ID_PCM_U16BE,
+ CODEC_ID_PCM_S8,
+ CODEC_ID_PCM_U8,
+ CODEC_ID_PCM_MULAW,
+ CODEC_ID_PCM_ALAW,
+ CODEC_ID_PCM_S32LE,
+ CODEC_ID_PCM_S32BE,
+ CODEC_ID_PCM_U32LE,
+ CODEC_ID_PCM_U32BE,
+ CODEC_ID_PCM_S24LE,
+ CODEC_ID_PCM_S24BE,
+ CODEC_ID_PCM_U24LE,
+ CODEC_ID_PCM_U24BE,
+ CODEC_ID_PCM_S24DAUD,
+ CODEC_ID_PCM_ZORK,
+ CODEC_ID_PCM_S16LE_PLANAR,
+ CODEC_ID_PCM_DVD,
+ CODEC_ID_PCM_F32BE,
+ CODEC_ID_PCM_F32LE,
+ CODEC_ID_PCM_F64BE,
+ CODEC_ID_PCM_F64LE,
+ CODEC_ID_PCM_BLURAY,
+ CODEC_ID_PCM_LXF,
+ CODEC_ID_S302M,
+ CODEC_ID_PCM_S8_PLANAR,
+
+ /* various ADPCM codecs */
+ CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ CODEC_ID_ADPCM_IMA_WAV,
+ CODEC_ID_ADPCM_IMA_DK3,
+ CODEC_ID_ADPCM_IMA_DK4,
+ CODEC_ID_ADPCM_IMA_WS,
+ CODEC_ID_ADPCM_IMA_SMJPEG,
+ CODEC_ID_ADPCM_MS,
+ CODEC_ID_ADPCM_4XM,
+ CODEC_ID_ADPCM_XA,
+ CODEC_ID_ADPCM_ADX,
+ CODEC_ID_ADPCM_EA,
+ CODEC_ID_ADPCM_G726,
+ CODEC_ID_ADPCM_CT,
+ CODEC_ID_ADPCM_SWF,
+ CODEC_ID_ADPCM_YAMAHA,
+ CODEC_ID_ADPCM_SBPRO_4,
+ CODEC_ID_ADPCM_SBPRO_3,
+ CODEC_ID_ADPCM_SBPRO_2,
+ CODEC_ID_ADPCM_THP,
+ CODEC_ID_ADPCM_IMA_AMV,
+ CODEC_ID_ADPCM_EA_R1,
+ CODEC_ID_ADPCM_EA_R3,
+ CODEC_ID_ADPCM_EA_R2,
+ CODEC_ID_ADPCM_IMA_EA_SEAD,
+ CODEC_ID_ADPCM_IMA_EA_EACS,
+ CODEC_ID_ADPCM_EA_XAS,
+ CODEC_ID_ADPCM_EA_MAXIS_XA,
+ CODEC_ID_ADPCM_IMA_ISS,
+ CODEC_ID_ADPCM_G722,
+
+ /* AMR */
+ CODEC_ID_AMR_NB = 0x12000,
+ CODEC_ID_AMR_WB,
+
+ /* RealAudio codecs*/
+ CODEC_ID_RA_144 = 0x13000,
+ CODEC_ID_RA_288,
+
+ /* various DPCM codecs */
+ CODEC_ID_ROQ_DPCM = 0x14000,
+ CODEC_ID_INTERPLAY_DPCM,
+ CODEC_ID_XAN_DPCM,
+ CODEC_ID_SOL_DPCM,
+
+ /* audio codecs */
+ CODEC_ID_MP2 = 0x15000,
+ CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+ CODEC_ID_AAC,
+ CODEC_ID_AC3,
+ CODEC_ID_DTS,
+ CODEC_ID_VORBIS,
+ CODEC_ID_DVAUDIO,
+ CODEC_ID_WMAV1,
+ CODEC_ID_WMAV2,
+ CODEC_ID_MACE3,
+ CODEC_ID_MACE6,
+ CODEC_ID_VMDAUDIO,
+#if LIBAVCODEC_VERSION_MAJOR == 53
+ CODEC_ID_SONIC,
+ CODEC_ID_SONIC_LS,
+#endif
+ CODEC_ID_FLAC,
+ CODEC_ID_MP3ADU,
+ CODEC_ID_MP3ON4,
+ CODEC_ID_SHORTEN,
+ CODEC_ID_ALAC,
+ CODEC_ID_WESTWOOD_SND1,
+ CODEC_ID_GSM, ///< as in Berlin toast format
+ CODEC_ID_QDM2,
+ CODEC_ID_COOK,
+ CODEC_ID_TRUESPEECH,
+ CODEC_ID_TTA,
+ CODEC_ID_SMACKAUDIO,
+ CODEC_ID_QCELP,
+ CODEC_ID_WAVPACK,
+ CODEC_ID_DSICINAUDIO,
+ CODEC_ID_IMC,
+ CODEC_ID_MUSEPACK7,
+ CODEC_ID_MLP,
+ CODEC_ID_GSM_MS, /* as found in WAV */
+ CODEC_ID_ATRAC3,
+ CODEC_ID_VOXWARE,
+ CODEC_ID_APE,
+ CODEC_ID_NELLYMOSER,
+ CODEC_ID_MUSEPACK8,
+ CODEC_ID_SPEEX,
+ CODEC_ID_WMAVOICE,
+ CODEC_ID_WMAPRO,
+ CODEC_ID_WMALOSSLESS,
+ CODEC_ID_ATRAC3P,
+ CODEC_ID_EAC3,
+ CODEC_ID_SIPR,
+ CODEC_ID_MP1,
+ CODEC_ID_TWINVQ,
+ CODEC_ID_TRUEHD,
+ CODEC_ID_MP4ALS,
+ CODEC_ID_ATRAC1,
+ CODEC_ID_BINKAUDIO_RDFT,
+ CODEC_ID_BINKAUDIO_DCT,
+ CODEC_ID_AAC_LATM,
+ CODEC_ID_QDMC,
+ CODEC_ID_CELT,
+#if LIBAVCODEC_VERSION_MAJOR > 53
+ CODEC_ID_G723_1,
+ CODEC_ID_G729,
+ CODEC_ID_8SVX_EXP,
+ CODEC_ID_8SVX_FIB,
+#endif
+ CODEC_ID_BMV_AUDIO,
+
+ /* subtitle codecs */
+ CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+ CODEC_ID_DVD_SUBTITLE = 0x17000,
+ CODEC_ID_DVB_SUBTITLE,
+ CODEC_ID_TEXT, ///< raw UTF-8 text
+ CODEC_ID_XSUB,
+ CODEC_ID_SSA,
+ CODEC_ID_MOV_TEXT,
+ CODEC_ID_HDMV_PGS_SUBTITLE,
+ CODEC_ID_DVB_TELETEXT,
+ CODEC_ID_SRT,
+
+ /* other specific kind of codecs (generally used for attachments) */
+ CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
+ CODEC_ID_TTF = 0x18000,
+
+ CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it
+
+ CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+ * stream (only used by libavformat) */
+ CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+ * stream (only used by libavformat) */
+ CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
+};
+
+#if FF_API_OLD_SAMPLE_FMT
+#define SampleFormat AVSampleFormat
+
+#define SAMPLE_FMT_NONE AV_SAMPLE_FMT_NONE
+#define SAMPLE_FMT_U8 AV_SAMPLE_FMT_U8
+#define SAMPLE_FMT_S16 AV_SAMPLE_FMT_S16
+#define SAMPLE_FMT_S32 AV_SAMPLE_FMT_S32
+#define SAMPLE_FMT_FLT AV_SAMPLE_FMT_FLT
+#define SAMPLE_FMT_DBL AV_SAMPLE_FMT_DBL
+#define SAMPLE_FMT_NB AV_SAMPLE_FMT_NB
+#endif
+
+#if FF_API_OLD_AUDIOCONVERT
+#include "libavutil/audioconvert.h"
+
+/* Audio channel masks */
+#define CH_FRONT_LEFT AV_CH_FRONT_LEFT
+#define CH_FRONT_RIGHT AV_CH_FRONT_RIGHT
+#define CH_FRONT_CENTER AV_CH_FRONT_CENTER
+#define CH_LOW_FREQUENCY AV_CH_LOW_FREQUENCY
+#define CH_BACK_LEFT AV_CH_BACK_LEFT
+#define CH_BACK_RIGHT AV_CH_BACK_RIGHT
+#define CH_FRONT_LEFT_OF_CENTER AV_CH_FRONT_LEFT_OF_CENTER
+#define CH_FRONT_RIGHT_OF_CENTER AV_CH_FRONT_RIGHT_OF_CENTER
+#define CH_BACK_CENTER AV_CH_BACK_CENTER
+#define CH_SIDE_LEFT AV_CH_SIDE_LEFT
+#define CH_SIDE_RIGHT AV_CH_SIDE_RIGHT
+#define CH_TOP_CENTER AV_CH_TOP_CENTER
+#define CH_TOP_FRONT_LEFT AV_CH_TOP_FRONT_LEFT
+#define CH_TOP_FRONT_CENTER AV_CH_TOP_FRONT_CENTER
+#define CH_TOP_FRONT_RIGHT AV_CH_TOP_FRONT_RIGHT
+#define CH_TOP_BACK_LEFT AV_CH_TOP_BACK_LEFT
+#define CH_TOP_BACK_CENTER AV_CH_TOP_BACK_CENTER
+#define CH_TOP_BACK_RIGHT AV_CH_TOP_BACK_RIGHT
+#define CH_STEREO_LEFT AV_CH_STEREO_LEFT
+#define CH_STEREO_RIGHT AV_CH_STEREO_RIGHT
+
+/** Channel mask value used for AVCodecContext.request_channel_layout
+ to indicate that the user requests the channel order of the decoder output
+ to be the native codec channel order. */
+#define CH_LAYOUT_NATIVE AV_CH_LAYOUT_NATIVE
+
+/* Audio channel convenience macros */
+#define CH_LAYOUT_MONO AV_CH_LAYOUT_MONO
+#define CH_LAYOUT_STEREO AV_CH_LAYOUT_STEREO
+#define CH_LAYOUT_2_1 AV_CH_LAYOUT_2_1
+#define CH_LAYOUT_SURROUND AV_CH_LAYOUT_SURROUND
+#define CH_LAYOUT_4POINT0 AV_CH_LAYOUT_4POINT0
+#define CH_LAYOUT_2_2 AV_CH_LAYOUT_2_2
+#define CH_LAYOUT_QUAD AV_CH_LAYOUT_QUAD
+#define CH_LAYOUT_5POINT0 AV_CH_LAYOUT_5POINT0
+#define CH_LAYOUT_5POINT1 AV_CH_LAYOUT_5POINT1
+#define CH_LAYOUT_5POINT0_BACK AV_CH_LAYOUT_5POINT0_BACK
+#define CH_LAYOUT_5POINT1_BACK AV_CH_LAYOUT_5POINT1_BACK
+#define CH_LAYOUT_7POINT0 AV_CH_LAYOUT_7POINT0
+#define CH_LAYOUT_7POINT1 AV_CH_LAYOUT_7POINT1
+#define CH_LAYOUT_7POINT1_WIDE AV_CH_LAYOUT_7POINT1_WIDE
+#define CH_LAYOUT_STEREO_DOWNMIX AV_CH_LAYOUT_STEREO_DOWNMIX
+#endif
+
+#if FF_API_OLD_DECODE_AUDIO
+/* in bytes */
+#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
+#endif
+
+/**
+ * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
+ * This is mainly needed because some optimized bitstream readers read
+ * 32 or 64 bit at once and could read over the end.<br>
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged
+ * MPEG bitstreams could cause overread and segfault.
+ */
+#define FF_INPUT_BUFFER_PADDING_SIZE 8
+
+/**
+ * minimum encoding buffer size
+ * Used to avoid some checks during header writing.
+ */
+#define FF_MIN_BUFFER_SIZE 16384
+
+
+/**
+ * motion estimation type.
+ */
+enum Motion_Est_ID {
+ ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed
+ ME_FULL,
+ ME_LOG,
+ ME_PHODS,
+ ME_EPZS, ///< enhanced predictive zonal search
+ ME_X1, ///< reserved for experiments
+ ME_HEX, ///< hexagon based search
+ ME_UMH, ///< uneven multi-hexagon search
+ ME_ITER, ///< iterative search
+ ME_TESA, ///< transformed exhaustive search algorithm
+};
+
+enum AVDiscard{
+ /* We leave some space between them for extensions (drop some
+ * keyframes for intra-only or drop just some bidir frames). */
+ AVDISCARD_NONE =-16, ///< discard nothing
+ AVDISCARD_DEFAULT= 0, ///< discard useless packets like 0 size packets in avi
+ AVDISCARD_NONREF = 8, ///< discard all non reference
+ AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
+ AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
+ AVDISCARD_ALL = 48, ///< discard all
+};
+
+enum AVColorPrimaries{
+ AVCOL_PRI_BT709 =1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
+ AVCOL_PRI_UNSPECIFIED=2,
+ AVCOL_PRI_BT470M =4,
+ AVCOL_PRI_BT470BG =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_PRI_SMPTE170M =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
+ AVCOL_PRI_SMPTE240M =7, ///< functionally identical to above
+ AVCOL_PRI_FILM =8,
+ AVCOL_PRI_NB , ///< Not part of ABI
+};
+
+enum AVColorTransferCharacteristic{
+ AVCOL_TRC_BT709 =1, ///< also ITU-R BT1361
+ AVCOL_TRC_UNSPECIFIED=2,
+ AVCOL_TRC_GAMMA22 =4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_TRC_GAMMA28 =5, ///< also ITU-R BT470BG
+ AVCOL_TRC_NB , ///< Not part of ABI
+};
+
+enum AVColorSpace{
+ AVCOL_SPC_RGB =0,
+ AVCOL_SPC_BT709 =1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
+ AVCOL_SPC_UNSPECIFIED=2,
+ AVCOL_SPC_FCC =4,
+ AVCOL_SPC_BT470BG =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
+ AVCOL_SPC_SMPTE170M =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
+ AVCOL_SPC_SMPTE240M =7,
+ AVCOL_SPC_NB , ///< Not part of ABI
+};
+
+enum AVColorRange{
+ AVCOL_RANGE_UNSPECIFIED=0,
+ AVCOL_RANGE_MPEG =1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges
+ AVCOL_RANGE_JPEG =2, ///< the normal 2^n-1 "JPEG" YUV ranges
+ AVCOL_RANGE_NB , ///< Not part of ABI
+};
+
+/**
+ * X X 3 4 X X are luma samples,
+ * 1 2 1-6 are possible chroma positions
+ * X X 5 6 X 0 is undefined/unknown position
+ */
+enum AVChromaLocation{
+ AVCHROMA_LOC_UNSPECIFIED=0,
+ AVCHROMA_LOC_LEFT =1, ///< mpeg2/4, h264 default
+ AVCHROMA_LOC_CENTER =2, ///< mpeg1, jpeg, h263
+ AVCHROMA_LOC_TOPLEFT =3, ///< DV
+ AVCHROMA_LOC_TOP =4,
+ AVCHROMA_LOC_BOTTOMLEFT =5,
+ AVCHROMA_LOC_BOTTOM =6,
+ AVCHROMA_LOC_NB , ///< Not part of ABI
+};
+
+#if FF_API_FLAC_GLOBAL_OPTS
+/**
+ * LPC analysis type
+ */
+enum AVLPCType {
+ AV_LPC_TYPE_DEFAULT = -1, ///< use the codec default LPC type
+ AV_LPC_TYPE_NONE = 0, ///< do not use LPC prediction or use all zero coefficients
+ AV_LPC_TYPE_FIXED = 1, ///< fixed LPC coefficients
+ AV_LPC_TYPE_LEVINSON = 2, ///< Levinson-Durbin recursion
+ AV_LPC_TYPE_CHOLESKY = 3, ///< Cholesky factorization
+ AV_LPC_TYPE_NB , ///< Not part of ABI
+};
+#endif
+
+enum AVAudioServiceType {
+ AV_AUDIO_SERVICE_TYPE_MAIN = 0,
+ AV_AUDIO_SERVICE_TYPE_EFFECTS = 1,
+ AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
+ AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3,
+ AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4,
+ AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5,
+ AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6,
+ AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7,
+ AV_AUDIO_SERVICE_TYPE_KARAOKE = 8,
+ AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI
+};
+
+typedef struct RcOverride{
+ int start_frame;
+ int end_frame;
+ int qscale; // If this is 0 then quality_factor will be used instead.
+ float quality_factor;
+} RcOverride;
+
+#define FF_MAX_B_FRAMES 16
+
+/* encoding support
+ These flags can be passed in AVCodecContext.flags before initialization.
+ Note: Not everything is supported yet.
+*/
+
+#define CODEC_FLAG_QSCALE 0x0002 ///< Use fixed qscale.
+#define CODEC_FLAG_4MV 0x0004 ///< 4 MV per MB allowed / advanced prediction for H.263.
+#define CODEC_FLAG_QPEL 0x0010 ///< Use qpel MC.
+#define CODEC_FLAG_GMC 0x0020 ///< Use GMC.
+#define CODEC_FLAG_MV0 0x0040 ///< Always try a MB with MV=<0,0>.
+/**
+ * The parent program guarantees that the input for B-frames containing
+ * streams is not written to for at least s->max_b_frames+1 frames, if
+ * this is not set the input will be copied.
+ */
+#define CODEC_FLAG_INPUT_PRESERVED 0x0100
+#define CODEC_FLAG_PASS1 0x0200 ///< Use internal 2pass ratecontrol in first pass mode.
+#define CODEC_FLAG_PASS2 0x0400 ///< Use internal 2pass ratecontrol in second pass mode.
+#define CODEC_FLAG_GRAY 0x2000 ///< Only decode/encode grayscale.
+#define CODEC_FLAG_EMU_EDGE 0x4000 ///< Don't draw edges.
+#define CODEC_FLAG_PSNR 0x8000 ///< error[?] variables will be set during encoding.
+#define CODEC_FLAG_TRUNCATED 0x00010000 /** Input bitstream might be truncated at a random
+ location instead of only at frame boundaries. */
+#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 ///< Normalize adaptive quantization.
+#define CODEC_FLAG_INTERLACED_DCT 0x00040000 ///< Use interlaced DCT.
+#define CODEC_FLAG_LOW_DELAY 0x00080000 ///< Force low delay.
+#define CODEC_FLAG_GLOBAL_HEADER 0x00400000 ///< Place global headers in extradata instead of every keyframe.
+#define CODEC_FLAG_BITEXACT 0x00800000 ///< Use only bitexact stuff (except (I)DCT).
+/* Fx : Flag for h263+ extra options */
+#define CODEC_FLAG_AC_PRED 0x01000000 ///< H.263 advanced intra coding / MPEG-4 AC prediction
+#define CODEC_FLAG_CBP_RD 0x04000000 ///< Use rate distortion optimization for cbp.
+#define CODEC_FLAG_QP_RD 0x08000000 ///< Use rate distortion optimization for qp selectioon.
+#define CODEC_FLAG_LOOP_FILTER 0x00000800 ///< loop filter
+#define CODEC_FLAG_INTERLACED_ME 0x20000000 ///< interlaced motion estimation
+#define CODEC_FLAG_CLOSED_GOP 0x80000000
+#define CODEC_FLAG2_FAST 0x00000001 ///< Allow non spec compliant speedup tricks.
+#define CODEC_FLAG2_STRICT_GOP 0x00000002 ///< Strictly enforce GOP size.
+#define CODEC_FLAG2_NO_OUTPUT 0x00000004 ///< Skip bitstream encoding.
+#define CODEC_FLAG2_LOCAL_HEADER 0x00000008 ///< Place global headers at every keyframe instead of in extradata.
+#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skipping
+#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
+/**
+ * @defgroup deprecated_flags Deprecated codec flags
+ * Use corresponding private codec options instead.
+ * @{
+ */
+#if FF_API_MPEGVIDEO_GLOBAL_OPTS
+#define CODEC_FLAG_OBMC 0x00000001 ///< OBMC
+#define CODEC_FLAG_H263P_AIV 0x00000008 ///< H.263 alternative inter VLC
+#define CODEC_FLAG_PART 0x0080 ///< Use data partitioning.
+#define CODEC_FLAG_ALT_SCAN 0x00100000 ///< Use alternate scan.
+#define CODEC_FLAG_H263P_UMV 0x02000000 ///< unlimited motion vector
+#define CODEC_FLAG_H263P_SLICE_STRUCT 0x10000000
+#define CODEC_FLAG_SVCD_SCAN_OFFSET 0x40000000 ///< Will reserve space for SVCD scan offset user data.
+#define CODEC_FLAG2_INTRA_VLC 0x00000800 ///< Use MPEG-2 intra VLC table.
+#define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format.
+#define CODEC_FLAG2_NON_LINEAR_QUANT 0x00010000 ///< Use MPEG-2 nonlinear quantizer.
+#endif
+#if FF_API_MJPEG_GLOBAL_OPTS
+#define CODEC_FLAG_EXTERN_HUFF 0x1000 ///< Use external Huffman table (for MJPEG).
+#endif
+#if FF_API_X264_GLOBAL_OPTS
+#define CODEC_FLAG2_BPYRAMID 0x00000010 ///< H.264 allow B-frames to be used as references.
+#define CODEC_FLAG2_WPRED 0x00000020 ///< H.264 weighted biprediction for B-frames
+#define CODEC_FLAG2_MIXED_REFS 0x00000040 ///< H.264 one reference per partition, as opposed to one reference per macroblock
+#define CODEC_FLAG2_8X8DCT 0x00000080 ///< H.264 high profile 8x8 transform
+#define CODEC_FLAG2_FASTPSKIP 0x00000100 ///< H.264 fast pskip
+#define CODEC_FLAG2_AUD 0x00000200 ///< H.264 access unit delimiters
+#define CODEC_FLAG2_BRDO 0x00000400 ///< B-frame rate-distortion optimization
+#define CODEC_FLAG2_MBTREE 0x00040000 ///< Use macroblock tree ratecontrol (x264 only)
+#define CODEC_FLAG2_PSY 0x00080000 ///< Use psycho visual optimizations.
+#define CODEC_FLAG2_SSIM 0x00100000 ///< Compute SSIM during encoding, error[] values are undefined.
+#define CODEC_FLAG2_INTRA_REFRESH 0x00200000 ///< Use periodic insertion of intra blocks instead of keyframes.
+#endif
+#if FF_API_SNOW_GLOBAL_OPTS
+#define CODEC_FLAG2_MEMC_ONLY 0x00001000 ///< Only do ME/MC (I frames -> ref, P frame -> ME+MC).
+#endif
+#if FF_API_LAME_GLOBAL_OPTS
+#define CODEC_FLAG2_BIT_RESERVOIR 0x00020000 ///< Use a bit reservoir when encoding if possible
+#endif
+/**
+ * @}
+ */
+
+/* Unsupported options :
+ * Syntax Arithmetic coding (SAC)
+ * Reference Picture Selection
+ * Independent Segment Decoding */
+/* /Fx */
+/* codec capabilities */
+
+#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001 ///< Decoder can use draw_horiz_band callback.
+/**
+ * Codec uses get_buffer() for allocating buffers and supports custom allocators.
+ * If not set, it might not use get_buffer() at all or use operations that
+ * assume the buffer was allocated by avcodec_default_get_buffer.
+ */
+#define CODEC_CAP_DR1 0x0002
+#if FF_API_PARSE_FRAME
+/* If 'parse_only' field is true, then avcodec_parse_frame() can be used. */
+#define CODEC_CAP_PARSE_ONLY 0x0004
+#endif
+#define CODEC_CAP_TRUNCATED 0x0008
+/* Codec can export data for HW decoding (XvMC). */
+#define CODEC_CAP_HWACCEL 0x0010
+/**
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+ *
+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
+ * with NULL data. The user can still send NULL data to the public encode
+ * or decode function, but libavcodec will not pass it along to the codec
+ * unless this flag is set.
+ *
+ * Decoders:
+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
+ * returns frames.
+ *
+ * Encoders:
+ * The encoder needs to be fed with NULL data at the end of encoding until the
+ * encoder no longer returns data.
+ *
+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
+ * flag also means that the encoder must set the pts and duration for
+ * each output packet. If this flag is not set, the pts and duration will
+ * be determined by libavcodec from the input frame.
+ */
+#define CODEC_CAP_DELAY 0x0020
+/**
+ * Codec can be fed a final frame with a smaller size.
+ * This can be used to prevent truncation of the last audio samples.
+ */
+#define CODEC_CAP_SMALL_LAST_FRAME 0x0040
+/**
+ * Codec can export data for HW decoding (VDPAU).
+ */
+#define CODEC_CAP_HWACCEL_VDPAU 0x0080
+/**
+ * Codec can output multiple frames per AVPacket
+ * Normally demuxers return one frame at a time, demuxers which do not do
+ * are connected to a parser to split what they return into proper frames.
+ * This flag is reserved to the very rare category of codecs which have a
+ * bitstream that cannot be split into frames without timeconsuming
+ * operations like full decoding. Demuxers carring such bitstreams thus
+ * may return multiple frames in a packet. This has many disadvantages like
+ * prohibiting stream copy in many cases thus it should only be considered
+ * as a last resort.
+ */
+#define CODEC_CAP_SUBFRAMES 0x0100
+/**
+ * Codec is experimental and is thus avoided in favor of non experimental
+ * encoders
+ */
+#define CODEC_CAP_EXPERIMENTAL 0x0200
+/**
+ * Codec should fill in channel configuration and samplerate instead of container
+ */
+#define CODEC_CAP_CHANNEL_CONF 0x0400
+/**
+ * Codec is able to deal with negative linesizes
+ */
+#define CODEC_CAP_NEG_LINESIZES 0x0800
+/**
+ * Codec supports frame-level multithreading.
+ */
+#define CODEC_CAP_FRAME_THREADS 0x1000
+/**
+ * Codec supports slice-based (or partition-based) multithreading.
+ */
+#define CODEC_CAP_SLICE_THREADS 0x2000
+/**
+ * Codec supports changed parameters at any point.
+ */
+#define CODEC_CAP_PARAM_CHANGE 0x4000
+/**
+ * Codec supports avctx->thread_count == 0 (auto).
+ */
+#define CODEC_CAP_AUTO_THREADS 0x8000
+/**
+ * Audio encoder supports receiving a different number of samples in each call.
+ */
+#define CODEC_CAP_VARIABLE_FRAME_SIZE 0x10000
+
+//The following defines may change, don't expect compatibility if you use them.
+#define MB_TYPE_INTRA4x4 0x0001
+#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific
+#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific
+#define MB_TYPE_16x16 0x0008
+#define MB_TYPE_16x8 0x0010
+#define MB_TYPE_8x16 0x0020
+#define MB_TYPE_8x8 0x0040
+#define MB_TYPE_INTERLACED 0x0080
+#define MB_TYPE_DIRECT2 0x0100 //FIXME
+#define MB_TYPE_ACPRED 0x0200
+#define MB_TYPE_GMC 0x0400
+#define MB_TYPE_SKIP 0x0800
+#define MB_TYPE_P0L0 0x1000
+#define MB_TYPE_P1L0 0x2000
+#define MB_TYPE_P0L1 0x4000
+#define MB_TYPE_P1L1 0x8000
+#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0)
+#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1)
+#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1)
+#define MB_TYPE_QUANT 0x00010000
+#define MB_TYPE_CBP 0x00020000
+//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...)
+
+/**
+ * Pan Scan area.
+ * This specifies the area which should be displayed.
+ * Note there may be multiple such areas for one frame.
+ */
+typedef struct AVPanScan{
+ /**
+ * id
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int id;
+
+ /**
+ * width and height in 1/16 pel
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int width;
+ int height;
+
+ /**
+ * position of the top left corner in 1/16 pel for up to 3 fields/frames
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t position[3][2];
+}AVPanScan;
+
+#define FF_QSCALE_TYPE_MPEG1 0
+#define FF_QSCALE_TYPE_MPEG2 1
+#define FF_QSCALE_TYPE_H264 2
+#define FF_QSCALE_TYPE_VP56 3
+
+#define FF_BUFFER_TYPE_INTERNAL 1
+#define FF_BUFFER_TYPE_USER 2 ///< direct rendering buffers (image is (de)allocated by user)
+#define FF_BUFFER_TYPE_SHARED 4 ///< Buffer from somewhere else; don't deallocate image (data/base), all other tables are not shared.
+#define FF_BUFFER_TYPE_COPY 8 ///< Just a (modified) copy of some other buffer, don't deallocate anything.
+
+#if FF_API_OLD_FF_PICT_TYPES
+/* DEPRECATED, directly use the AV_PICTURE_TYPE_* enum values */
+#define FF_I_TYPE AV_PICTURE_TYPE_I ///< Intra
+#define FF_P_TYPE AV_PICTURE_TYPE_P ///< Predicted
+#define FF_B_TYPE AV_PICTURE_TYPE_B ///< Bi-dir predicted
+#define FF_S_TYPE AV_PICTURE_TYPE_S ///< S(GMC)-VOP MPEG4
+#define FF_SI_TYPE AV_PICTURE_TYPE_SI ///< Switching Intra
+#define FF_SP_TYPE AV_PICTURE_TYPE_SP ///< Switching Predicted
+#define FF_BI_TYPE AV_PICTURE_TYPE_BI
+#endif
+
+#define FF_BUFFER_HINTS_VALID 0x01 // Buffer hints value is meaningful (if 0 ignore).
+#define FF_BUFFER_HINTS_READABLE 0x02 // Codec will read from buffer.
+#define FF_BUFFER_HINTS_PRESERVE 0x04 // User must not alter buffer content.
+#define FF_BUFFER_HINTS_REUSABLE 0x08 // Codec will reuse the buffer (update).
+
+enum AVPacketSideDataType {
+ AV_PKT_DATA_PALETTE,
+ AV_PKT_DATA_NEW_EXTRADATA,
+ AV_PKT_DATA_PARAM_CHANGE,
+};
+
+typedef struct AVPacket {
+ /**
+ * Presentation timestamp in AVStream->time_base units; the time at which
+ * the decompressed packet will be presented to the user.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ * pts MUST be larger or equal to dts as presentation cannot happen before
+ * decompression, unless one wants to view hex dumps. Some formats misuse
+ * the terms dts and pts/cts to mean something different. Such timestamps
+ * must be converted to true pts/dts before they are stored in AVPacket.
+ */
+ int64_t pts;
+ /**
+ * Decompression timestamp in AVStream->time_base units; the time at which
+ * the packet is decompressed.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ */
+ int64_t dts;
+ uint8_t *data;
+ int size;
+ int stream_index;
+ /**
+ * A combination of AV_PKT_FLAG values
+ */
+ int flags;
+ /**
+ * Additional packet data that can be provided by the container.
+ * Packet can contain several types of side information.
+ */
+ struct {
+ uint8_t *data;
+ int size;
+ enum AVPacketSideDataType type;
+ } *side_data;
+ int side_data_elems;
+
+ /**
+ * Duration of this packet in AVStream->time_base units, 0 if unknown.
+ * Equals next_pts - this_pts in presentation order.
+ */
+ int duration;
+ void (*destruct)(struct AVPacket *);
+ void *priv;
+ int64_t pos; ///< byte position in stream, -1 if unknown
+
+ /**
+ * Time difference in AVStream->time_base units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * independent from the availability of previous frames. That is, the
+ * frames are virtually identical no matter if decoding started from
+ * the very first frame or from this keyframe.
+ * Is AV_NOPTS_VALUE if unknown.
+ * This field is not the display duration of the current packet.
+ * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
+ * set.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
+} AVPacket;
+#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe
+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
+
+/**
+ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+ * u32le param_flags
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+ * s32le channel_count
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+ * u64le channel_layout
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+ * s32le sample_rate
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+ * s32le width
+ * s32le height
+ */
+
+enum AVSideDataParamChangeFlags {
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001,
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004,
+ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008,
+};
+
+/**
+ * Audio Video Frame.
+ * New fields can be added to the end of AVFRAME with minor version
+ * bumps. Removal, reordering and changes to existing fields require
+ * a major version bump.
+ * sizeof(AVFrame) must not be used outside libav*.
+ */
+typedef struct AVFrame {
+#if FF_API_DATA_POINTERS
+#define AV_NUM_DATA_POINTERS 4
+#else
+#define AV_NUM_DATA_POINTERS 8
+#endif
+ /**
+ * pointer to the picture/channel planes.
+ * This might be different from the first allocated byte
+ * - encoding: Set by user
+ * - decoding: set by AVCodecContext.get_buffer()
+ */
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+
+ /**
+ * Size, in bytes, of the data for each picture/channel plane.
+ *
+ * For audio, only linesize[0] may be set. For planar audio, each channel
+ * plane must be the same size.
+ *
+ * - encoding: Set by user (video only)
+ * - decoding: set by AVCodecContext.get_buffer()
+ */
+ int linesize[AV_NUM_DATA_POINTERS];
+
+ /**
+ * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.
+ * This isn't used by libavcodec unless the default get/release_buffer() is used.
+ * - encoding:
+ * - decoding:
+ */
+ uint8_t *base[AV_NUM_DATA_POINTERS];
+ /**
+ * 1 -> keyframe, 0-> not
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int key_frame;
+
+ /**
+ * Picture type of the frame, see ?_TYPE below.
+ * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+ * - decoding: Set by libavcodec.
+ */
+ enum AVPictureType pict_type;
+
+ /**
+ * presentation timestamp in time_base units (time when frame should be shown to user)
+ * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int64_t pts;
+
+ /**
+ * picture number in bitstream order
+ * - encoding: set by
+ * - decoding: Set by libavcodec.
+ */
+ int coded_picture_number;
+ /**
+ * picture number in display order
+ * - encoding: set by
+ * - decoding: Set by libavcodec.
+ */
+ int display_picture_number;
+
+ /**
+ * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
+ * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+ * - decoding: Set by libavcodec.
+ */
+ int quality;
+
+#if FF_API_AVFRAME_AGE
+ /**
+ * @deprecated unused
+ */
+ attribute_deprecated int age;
+#endif
+
+ /**
+ * is this picture used as reference
+ * The values for this are the same as the MpegEncContext.picture_structure
+ * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
+ * Set to 4 for delayed, non-reference frames.
+ * - encoding: unused
+ * - decoding: Set by libavcodec. (before get_buffer() call)).
+ */
+ int reference;
+
+ /**
+ * QP table
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int8_t *qscale_table;
+ /**
+ * QP store stride
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int qstride;
+
+ /**
+ * mbskip_table[mb]>=1 if MB didn't change
+ * stride= mb_width = (width+15)>>4
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ uint8_t *mbskip_table;
+
+ /**
+ * motion vector table
+ * @code
+ * example:
+ * int mv_sample_log2= 4 - motion_subsample_log2;
+ * int mb_width= (width+15)>>4;
+ * int mv_stride= (mb_width << mv_sample_log2) + 1;
+ * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
+ * @endcode
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t (*motion_val[2])[2];
+
+ /**
+ * macroblock type table
+ * mb_type_base + mb_width + 2
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ uint32_t *mb_type;
+
+ /**
+ * log2 of the size of the block which a single vector in motion_val represents:
+ * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ uint8_t motion_subsample_log2;
+
+ /**
+ * for some private data of the user
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ /**
+ * error
+ * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * type of the buffer (to keep track of who has to deallocate data[*])
+ * - encoding: Set by the one who allocates it.
+ * - decoding: Set by the one who allocates it.
+ * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.
+ */
+ int type;
+
+ /**
+ * When decoding, this signals how much the picture must be delayed.
+ * extra_delay = repeat_pict / (2*fps)
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int repeat_pict;
+
+ /**
+ *
+ */
+ int qscale_type;
+
+ /**
+ * The content of the picture is interlaced.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec. (default 0)
+ */
+ int interlaced_frame;
+
+ /**
+ * If the content is interlaced, is top field displayed first.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int top_field_first;
+
+ /**
+ * Pan scan.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVPanScan *pan_scan;
+
+ /**
+ * Tell user application that palette has changed from previous frame.
+ * - encoding: ??? (no palette-enabled encoder yet)
+ * - decoding: Set by libavcodec. (default 0).
+ */
+ int palette_has_changed;
+
+ /**
+ * codec suggestion on buffer type if != 0
+ * - encoding: unused
+ * - decoding: Set by libavcodec. (before get_buffer() call)).
+ */
+ int buffer_hints;
+
+ /**
+ * DCT coefficients
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ short *dct_coeff;
+
+ /**
+ * motion reference frame index
+ * the order in which these are stored can depend on the codec.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int8_t *ref_index[2];
+
+ /**
+ * reordered opaque 64bit (generally an integer or a double precision float
+ * PTS but can be anything).
+ * The user sets AVCodecContext.reordered_opaque to represent the input at
+ * that time,
+ * the decoder reorders values as needed and sets AVFrame.reordered_opaque
+ * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * hardware accelerator private data (Libav-allocated)
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ void *hwaccel_picture_private;
+
+ /**
+ * reordered pts from the last AVPacket that has been input into the decoder
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_pts;
+
+ /**
+ * dts from the last AVPacket that has been input into the decoder
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_dts;
+
+ /**
+ * the AVCodecContext which ff_thread_get_buffer() was last called on
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ struct AVCodecContext *owner;
+
+ /**
+ * used by multithreading to store frame-specific info
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ void *thread_opaque;
+
+ /**
+ * number of audio samples (per channel) described by this frame
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ int nb_samples;
+
+ /**
+ * pointers to the data planes/channels.
+ *
+ * For video, this should simply point to data[].
+ *
+ * For planar audio, each channel has a separate data pointer, and
+ * linesize[0] contains the size of each channel buffer.
+ * For packed audio, there is just one data pointer, and linesize[0]
+ * contains the total size of the buffer for all channels.
+ *
+ * Note: Both data and extended_data will always be set by get_buffer(),
+ * but for planar audio with more channels that can fit in data,
+ * extended_data must be used by the decoder in order to access all
+ * channels.
+ *
+ * encoding: unused
+ * decoding: set by AVCodecContext.get_buffer()
+ */
+ uint8_t **extended_data;
+
+ /**
+ * sample aspect ratio for the video frame, 0/1 if unknown\unspecified
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * width and height of the video frame
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int width, height;
+
+ /**
+ * format of the frame, -1 if unknown or unset
+ * Values correspond to enum PixelFormat for video frames,
+ * enum AVSampleFormat for audio)
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int format;
+} AVFrame;
+
+struct AVCodecInternal;
+
+enum AVFieldOrder {
+ AV_FIELD_UNKNOWN,
+ AV_FIELD_PROGRESSIVE,
+ AV_FIELD_TT, //< Top coded_first, top displayed first
+ AV_FIELD_BB, //< Bottom coded first, bottom displayed first
+ AV_FIELD_TB, //< Top coded first, bottom displayed first
+ AV_FIELD_BT, //< Bottom coded first, top displayed first
+};
+
+/**
+ * main external API structure.
+ * New fields can be added to the end with minor version bumps.
+ * Removal, reordering and changes to existing fields require a major
+ * version bump.
+ * sizeof(AVCodecContext) must not be used outside libav*.
+ */
+typedef struct AVCodecContext {
+ /**
+ * information on struct for av_log
+ * - set by avcodec_alloc_context3
+ */
+ const AVClass *av_class;
+ /**
+ * the average bitrate
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the stream.
+ */
+ int bit_rate;
+
+ /**
+ * number of bits the bitstream is allowed to diverge from the reference.
+ * the reference can be CBR (for CBR pass1) or VBR (for pass2)
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: unused
+ */
+ int bit_rate_tolerance;
+
+ /**
+ * CODEC_FLAG_*.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags;
+
+ /**
+ * Some codecs need additional format info. It is stored here.
+ * If any muxer uses this then ALL demuxers/parsers AND encoders for the
+ * specific codec MUST set it correctly otherwise stream copy breaks.
+ * In general use of this field by muxers is not recommended.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec. (FIXME: Is this OK?)
+ */
+ int sub_id;
+
+ /**
+ * Motion estimation algorithm used for video coding.
+ * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex),
+ * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific]
+ * - encoding: MUST be set by user.
+ * - decoding: unused
+ */
+ int me_method;
+
+ /**
+ * some codecs need / can use extradata like Huffman tables.
+ * mjpeg: Huffman tables
+ * rv10: additional flags
+ * mpeg4: global headers (they can be in the bitstream or here)
+ * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger
+ * than extradata_size to avoid prolems if it is read with the bitstream reader.
+ * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
+ * - encoding: Set/allocated/freed by libavcodec.
+ * - decoding: Set/allocated/freed by user.
+ */
+ uint8_t *extradata;
+ int extradata_size;
+
+ /**
+ * This is the fundamental unit of time (in seconds) in terms
+ * of which frame timestamps are represented. For fixed-fps content,
+ * timebase should be 1/framerate and timestamp increments should be
+ * identically 1.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational time_base;
+
+ /* video only */
+ /**
+ * picture width / height.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ * Note: For compatibility it is possible to set this instead of
+ * coded_width/height before decoding.
+ */
+ int width, height;
+
+#define FF_ASPECT_EXTENDED 15
+
+ /**
+ * the number of pictures in a group of pictures, or 0 for intra_only
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int gop_size;
+
+ /**
+ * Pixel format, see PIX_FMT_xxx.
+ * May be set by the demuxer if known from headers.
+ * May be overriden by the decoder if it knows better.
+ * - encoding: Set by user.
+ * - decoding: Set by user if known, overridden by libavcodec if known
+ */
+ enum PixelFormat pix_fmt;
+
+ /**
+ * If non NULL, 'draw_horiz_band' is called by the libavcodec
+ * decoder to draw a horizontal band. It improves cache usage. Not
+ * all codecs can do that. You must check the codec capabilities
+ * beforehand.
+ * When multithreading is used, it may be called from multiple threads
+ * at the same time; threads might draw different parts of the same AVFrame,
+ * or multiple AVFrames, and there is no guarantee that slices will be drawn
+ * in order.
+ * The function is also used by hardware acceleration APIs.
+ * It is called at least once during frame decoding to pass
+ * the data needed for hardware render.
+ * In that mode instead of pixel data, AVFrame points to
+ * a structure specific to the acceleration API. The application
+ * reads the structure and can change some fields to indicate progress
+ * or mark state.
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @param height the height of the slice
+ * @param y the y position of the slice
+ * @param type 1->top field, 2->bottom field, 3->frame
+ * @param offset offset into the AVFrame.data from which the slice should be read
+ */
+ void (*draw_horiz_band)(struct AVCodecContext *s,
+ const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
+ int y, int type, int height);
+
+ /* audio only */
+ int sample_rate; ///< samples per second
+ int channels; ///< number of audio channels
+
+ /**
+ * audio sample format
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVSampleFormat sample_fmt; ///< sample format
+
+ /* The following data should not be initialized. */
+ /**
+ * Samples per packet, initialized when calling 'init'.
+ */
+ int frame_size;
+ int frame_number; ///< audio or video frame number
+
+ /**
+ * Number of frames the decoded output will be delayed relative to
+ * the encoded input.
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ int delay;
+
+ /* - encoding parameters */
+ float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0)
+ float qblur; ///< amount of qscale smoothing over time (0.0-1.0)
+
+ /**
+ * minimum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmin;
+
+ /**
+ * maximum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmax;
+
+ /**
+ * maximum quantizer difference between frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_qdiff;
+
+ /**
+ * maximum number of B-frames between non-B-frames
+ * Note: The output will be delayed by max_b_frames+1 relative to the input.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_b_frames;
+
+ /**
+ * qscale factor between IP and B-frames
+ * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_factor;
+
+ /** obsolete FIXME remove */
+ int rc_strategy;
+#define FF_RC_STRATEGY_XVID 1
+
+ int b_frame_strategy;
+
+ struct AVCodec *codec;
+
+ void *priv_data;
+
+ int rtp_payload_size; /* The size of the RTP payload: the coder will */
+ /* do its best to deliver a chunk with size */
+ /* below rtp_payload_size, the chunk will start */
+ /* with a start code on some codecs like H.263. */
+ /* This doesn't take account of any particular */
+ /* headers inside the transmitted RTP payload. */
+
+
+ /* The RTP callback: This function is called */
+ /* every time the encoder has a packet to send. */
+ /* It depends on the encoder if the data starts */
+ /* with a Start Code (it should). H.263 does. */
+ /* mb_nb contains the number of macroblocks */
+ /* encoded in the RTP payload. */
+ void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb);
+
+ /* statistics, used for 2-pass encoding */
+ int mv_bits;
+ int header_bits;
+ int i_tex_bits;
+ int p_tex_bits;
+ int i_count;
+ int p_count;
+ int skip_count;
+ int misc_bits;
+
+ /**
+ * number of bits used for the previously encoded frame
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ int frame_bits;
+
+ /**
+ * Private data of the user, can be used to carry app specific stuff.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ char codec_name[32];
+ enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
+ enum CodecID codec_id; /* see CODEC_ID_xxx */
+
+ /**
+ * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * A demuxer should set this to what is stored in the field used to identify the codec.
+ * If there are multiple such fields in a container then the demuxer should choose the one
+ * which maximizes the information about the used codec.
+ * If the codec tag field in a container is larger than 32 bits then the demuxer should
+ * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
+ * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
+ * first.
+ * - encoding: Set by user, if not then the default based on codec_id will be used.
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int codec_tag;
+
+ /**
+ * Work around bugs in encoders which sometimes cannot be detected automatically.
+ * - encoding: Set by user
+ * - decoding: Set by user
+ */
+ int workaround_bugs;
+#define FF_BUG_AUTODETECT 1 ///< autodetection
+#define FF_BUG_OLD_MSMPEG4 2
+#define FF_BUG_XVID_ILACE 4
+#define FF_BUG_UMP4 8
+#define FF_BUG_NO_PADDING 16
+#define FF_BUG_AMV 32
+#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default.
+#define FF_BUG_QPEL_CHROMA 64
+#define FF_BUG_STD_QPEL 128
+#define FF_BUG_QPEL_CHROMA2 256
+#define FF_BUG_DIRECT_BLOCKSIZE 512
+#define FF_BUG_EDGE 1024
+#define FF_BUG_HPEL_CHROMA 2048
+#define FF_BUG_DC_CLIP 4096
+#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
+#define FF_BUG_TRUNCATED 16384
+//#define FF_BUG_FAKE_SCALABILITY 16 //Autodetection should work 100%.
+
+ /**
+ * luma single coefficient elimination threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int luma_elim_threshold;
+
+ /**
+ * chroma single coeff elimination threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int chroma_elim_threshold;
+
+ /**
+ * strictly follow the standard (MPEG4, ...).
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ * Setting this to STRICT or higher means the encoder and decoder will
+ * generally do stupid things, whereas setting it to unofficial or lower
+ * will mean the encoder might produce output that is not supported by all
+ * spec-compliant decoders. Decoders don't differentiate between normal,
+ * unofficial and experimental (that is, they always try to decode things
+ * when they can) unless they are explicitly asked to behave stupidly
+ * (=strictly conform to the specs)
+ */
+ int strict_std_compliance;
+#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software.
+#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences.
+#define FF_COMPLIANCE_NORMAL 0
+#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions
+#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
+
+ /**
+ * qscale offset between IP and B-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_offset;
+
+#if FF_API_ER
+ /**
+ * Error recognition; higher values will detect more errors but may
+ * misdetect some more or less valid parts as errors.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ attribute_deprecated int error_recognition;
+#define FF_ER_CAREFUL 1
+#define FF_ER_COMPLIANT 2
+#define FF_ER_AGGRESSIVE 3
+#define FF_ER_VERY_AGGRESSIVE 4
+#define FF_ER_EXPLODE 5
+#endif /* FF_API_ER */
+
+ /**
+ * Called at the beginning of each frame to get a buffer for it.
+ *
+ * The function will set AVFrame.data[], AVFrame.linesize[].
+ * AVFrame.extended_data[] must also be set, but it should be the same as
+ * AVFrame.data[] except for planar audio with more channels than can fit
+ * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as
+ * many data pointers as it can hold.
+ *
+ * if CODEC_CAP_DR1 is not set then get_buffer() must call
+ * avcodec_default_get_buffer() instead of providing buffers allocated by
+ * some other means.
+ *
+ * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't
+ * need it. avcodec_default_get_buffer() aligns the output buffer properly,
+ * but if get_buffer() is overridden then alignment considerations should
+ * be taken into account.
+ *
+ * @see avcodec_default_get_buffer()
+ *
+ * Video:
+ *
+ * If pic.reference is set then the frame will be read later by libavcodec.
+ * avcodec_align_dimensions2() should be used to find the required width and
+ * height, as they normally need to be rounded up to the next multiple of 16.
+ *
+ * If frame multithreading is used and thread_safe_callbacks is set,
+ * it may be called from a different thread, but not from more than one at
+ * once. Does not need to be reentrant.
+ *
+ * @see release_buffer(), reget_buffer()
+ * @see avcodec_align_dimensions2()
+ *
+ * Audio:
+ *
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer(). The decoder may,
+ * however, utilize only part of the buffer by setting AVFrame.nb_samples
+ * to a smaller value in the output frame.
+ *
+ * Decoders cannot use the buffer after returning from
+ * avcodec_decode_audio4(), so they will not call release_buffer(), as it
+ * is assumed to be released immediately upon return.
+ *
+ * As a convenience, av_samples_get_buffer_size() and
+ * av_samples_fill_arrays() in libavutil may be used by custom get_buffer()
+ * functions to find the required data size and to fill data pointers and
+ * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+ * since all planes must be the same size.
+ *
+ * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Called to release buffers which were allocated with get_buffer.
+ * A released buffer can be reused in get_buffer().
+ * pic.data[*] must be set to NULL.
+ * May be called from a different thread if frame multithreading is used,
+ * but not by more than one thread at once, so does not need to be reentrant.
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Size of the frame reordering buffer in the decoder.
+ * For MPEG-2 it is 1 IPB or 0 low delay IP.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int has_b_frames;
+
+ /**
+ * number of bytes per packet if constant and known or 0
+ * Used by some WAV based audio codecs.
+ */
+ int block_align;
+
+#if FF_API_PARSE_FRAME
+ /**
+ * If true, only parsing is done. The frame data is returned.
+ * Only MPEG audio decoders support this now.
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ attribute_deprecated int parse_only;
+#endif
+
+ /**
+ * 0-> h263 quant 1-> mpeg quant
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mpeg_quant;
+
+ /**
+ * pass1 encoding statistics output buffer
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ char *stats_out;
+
+ /**
+ * pass2 encoding statistics input buffer
+ * Concatenated stuff from stats_out of pass1 should be placed here.
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ char *stats_in;
+
+ /**
+ * ratecontrol qmin qmax limiting method
+ * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float rc_qsquish;
+
+ float rc_qmod_amp;
+ int rc_qmod_freq;
+
+ /**
+ * ratecontrol override, see RcOverride
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ RcOverride *rc_override;
+ int rc_override_count;
+
+ /**
+ * rate control equation
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ const char *rc_eq;
+
+ /**
+ * maximum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_max_rate;
+
+ /**
+ * minimum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_min_rate;
+
+ /**
+ * decoder bitstream buffer size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_buffer_size;
+ float rc_buffer_aggressivity;
+
+ /**
+ * qscale factor between P and I-frames
+ * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_factor;
+
+ /**
+ * qscale offset between P and I-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_offset;
+
+ /**
+ * initial complexity for pass1 ratecontrol
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float rc_initial_cplx;
+
+ /**
+ * DCT algorithm, see FF_DCT_* below
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dct_algo;
+#define FF_DCT_AUTO 0
+#define FF_DCT_FASTINT 1
+#define FF_DCT_INT 2
+#define FF_DCT_MMX 3
+#define FF_DCT_MLIB 4
+#define FF_DCT_ALTIVEC 5
+#define FF_DCT_FAAN 6
+
+ /**
+ * luminance masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float lumi_masking;
+
+ /**
+ * temporary complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float temporal_cplx_masking;
+
+ /**
+ * spatial complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float spatial_cplx_masking;
+
+ /**
+ * p block masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float p_masking;
+
+ /**
+ * darkness masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float dark_masking;
+
+ /**
+ * IDCT algorithm, see FF_IDCT_* below.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int idct_algo;
+#define FF_IDCT_AUTO 0
+#define FF_IDCT_INT 1
+#define FF_IDCT_SIMPLE 2
+#define FF_IDCT_SIMPLEMMX 3
+#define FF_IDCT_LIBMPEG2MMX 4
+#define FF_IDCT_PS2 5
+#define FF_IDCT_MLIB 6
+#define FF_IDCT_ARM 7
+#define FF_IDCT_ALTIVEC 8
+#define FF_IDCT_SH4 9
+#define FF_IDCT_SIMPLEARM 10
+#define FF_IDCT_H264 11
+#define FF_IDCT_VP3 12
+#define FF_IDCT_IPP 13
+#define FF_IDCT_XVIDMMX 14
+#define FF_IDCT_CAVS 15
+#define FF_IDCT_SIMPLEARMV5TE 16
+#define FF_IDCT_SIMPLEARMV6 17
+#define FF_IDCT_SIMPLEVIS 18
+#define FF_IDCT_WMV2 19
+#define FF_IDCT_FAAN 20
+#define FF_IDCT_EA 21
+#define FF_IDCT_SIMPLENEON 22
+#define FF_IDCT_SIMPLEALPHA 23
+#define FF_IDCT_BINK 24
+
+ /**
+ * slice count
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user (or 0).
+ */
+ int slice_count;
+ /**
+ * slice offsets in the frame in bytes
+ * - encoding: Set/allocated by libavcodec.
+ * - decoding: Set/allocated by user (or NULL).
+ */
+ int *slice_offset;
+
+ /**
+ * error concealment flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int error_concealment;
+#define FF_EC_GUESS_MVS 1
+#define FF_EC_DEBLOCK 2
+
+ /**
+ * dsp_mask could be add used to disable unwanted CPU features
+ * CPU features (i.e. MMX, SSE. ...)
+ *
+ * With the FORCE flag you may instead enable given CPU features.
+ * (Dangerous: Usable in case of misdetection, improper usage however will
+ * result into program crash.)
+ */
+ unsigned dsp_mask;
+
+ /**
+ * bits per sample/pixel from the demuxer (needed for huffyuv).
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user.
+ */
+ int bits_per_coded_sample;
+
+ /**
+ * prediction method (needed for huffyuv)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int prediction_method;
+#define FF_PRED_LEFT 0
+#define FF_PRED_PLANE 1
+#define FF_PRED_MEDIAN 2
+
+ /**
+ * sample aspect ratio (0 if unknown)
+ * That is the width of a pixel divided by the height of the pixel.
+ * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * the picture in the bitstream
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ AVFrame *coded_frame;
+
+ /**
+ * debug
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug;
+#define FF_DEBUG_PICT_INFO 1
+#define FF_DEBUG_RC 2
+#define FF_DEBUG_BITSTREAM 4
+#define FF_DEBUG_MB_TYPE 8
+#define FF_DEBUG_QP 16
+#define FF_DEBUG_MV 32
+#define FF_DEBUG_DCT_COEFF 0x00000040
+#define FF_DEBUG_SKIP 0x00000080
+#define FF_DEBUG_STARTCODE 0x00000100
+#define FF_DEBUG_PTS 0x00000200
+#define FF_DEBUG_ER 0x00000400
+#define FF_DEBUG_MMCO 0x00000800
+#define FF_DEBUG_BUGS 0x00001000
+#define FF_DEBUG_VIS_QP 0x00002000
+#define FF_DEBUG_VIS_MB_TYPE 0x00004000
+#define FF_DEBUG_BUFFERS 0x00008000
+#define FF_DEBUG_THREADS 0x00010000
+
+ /**
+ * debug
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug_mv;
+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames
+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames
+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
+
+ /**
+ * error
+ * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_cmp;
+ /**
+ * subpixel motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_sub_cmp;
+ /**
+ * macroblock comparison function (not supported yet)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_cmp;
+ /**
+ * interlaced DCT comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int ildct_cmp;
+#define FF_CMP_SAD 0
+#define FF_CMP_SSE 1
+#define FF_CMP_SATD 2
+#define FF_CMP_DCT 3
+#define FF_CMP_PSNR 4
+#define FF_CMP_BIT 5
+#define FF_CMP_RD 6
+#define FF_CMP_ZERO 7
+#define FF_CMP_VSAD 8
+#define FF_CMP_VSSE 9
+#define FF_CMP_NSSE 10
+#define FF_CMP_W53 11
+#define FF_CMP_W97 12
+#define FF_CMP_DCTMAX 13
+#define FF_CMP_DCT264 14
+#define FF_CMP_CHROMA 256
+
+ /**
+ * ME diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dia_size;
+
+ /**
+ * amount of previous MV predictors (2a+1 x 2a+1 square)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int last_predictor_count;
+
+ /**
+ * prepass for motion estimation
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_me;
+
+ /**
+ * motion estimation prepass comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_pre_cmp;
+
+ /**
+ * ME prepass diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_dia_size;
+
+ /**
+ * subpel ME quality
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_subpel_quality;
+
+ /**
+ * callback to negotiate the pixelFormat
+ * @param fmt is the list of formats which are supported by the codec,
+ * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
+ * The first is always the native one.
+ * @return the chosen format
+ * - encoding: unused
+ * - decoding: Set by user, if not set the native format will be chosen.
+ */
+ enum PixelFormat (*get_format)(struct AVCodecContext *s, const enum PixelFormat * fmt);
+
+ /**
+ * DTG active format information (additional aspect ratio
+ * information only used in DVB MPEG-2 transport streams)
+ * 0 if not set.
+ *
+ * - encoding: unused
+ * - decoding: Set by decoder.
+ */
+ int dtg_active_format;
+#define FF_DTG_AFD_SAME 8
+#define FF_DTG_AFD_4_3 9
+#define FF_DTG_AFD_16_9 10
+#define FF_DTG_AFD_14_9 11
+#define FF_DTG_AFD_4_3_SP_14_9 13
+#define FF_DTG_AFD_16_9_SP_14_9 14
+#define FF_DTG_AFD_SP_4_3 15
+
+ /**
+ * maximum motion estimation search range in subpel units
+ * If 0 then no limit.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_range;
+
+ /**
+ * intra quantizer bias
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int intra_quant_bias;
+#define FF_DEFAULT_QUANT_BIAS 999999
+
+ /**
+ * inter quantizer bias
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int inter_quant_bias;
+
+ /**
+ * color table ID
+ * - encoding: unused
+ * - decoding: Which clrtable should be used for 8bit RGB images.
+ * Tables have to be stored somewhere. FIXME
+ */
+ int color_table_id;
+
+#if FF_API_INTERNAL_CONTEXT
+ /**
+ * internal_buffer count
+ * Don't touch, used by libavcodec default_get_buffer().
+ * @deprecated this field was moved to an internal context
+ */
+ attribute_deprecated int internal_buffer_count;
+
+ /**
+ * internal_buffers
+ * Don't touch, used by libavcodec default_get_buffer().
+ * @deprecated this field was moved to an internal context
+ */
+ attribute_deprecated void *internal_buffer;
+#endif
+
+ /**
+ * Global quality for codecs which cannot change it per frame.
+ * This should be proportional to MPEG-1/2/4 qscale.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int global_quality;
+
+#define FF_CODER_TYPE_VLC 0
+#define FF_CODER_TYPE_AC 1
+#define FF_CODER_TYPE_RAW 2
+#define FF_CODER_TYPE_RLE 3
+#define FF_CODER_TYPE_DEFLATE 4
+ /**
+ * coder type
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int coder_type;
+
+ /**
+ * context model
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int context_model;
+#if 0
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ uint8_t * (*realloc)(struct AVCodecContext *s, uint8_t *buf, int buf_size);
+#endif
+
+ /**
+ * slice flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int slice_flags;
+#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display
+#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG2 field pics)
+#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
+
+ /**
+ * XVideo Motion Acceleration
+ * - encoding: forbidden
+ * - decoding: set by decoder
+ */
+ int xvmc_acceleration;
+
+ /**
+ * macroblock decision mode
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_decision;
+#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp
+#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits
+#define FF_MB_DECISION_RD 2 ///< rate distortion
+
+ /**
+ * custom intra quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *intra_matrix;
+
+ /**
+ * custom inter quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *inter_matrix;
+
+ /**
+ * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * - encoding: unused
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int stream_codec_tag;
+
+ /**
+ * scene change detection threshold
+ * 0 is default, larger means fewer detected scene changes.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_threshold;
+
+ /**
+ * minimum Lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int lmin;
+
+ /**
+ * maximum Lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int lmax;
+
+#if FF_API_PALETTE_CONTROL
+ /**
+ * palette control structure
+ * - encoding: ??? (no palette-enabled encoder yet)
+ * - decoding: Set by user.
+ */
+ struct AVPaletteControl *palctrl;
+#endif
+
+ /**
+ * noise reduction strength
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int noise_reduction;
+
+ /**
+ * Called at the beginning of a frame to get cr buffer for it.
+ * Buffer type (size, hints) must be the same. libavcodec won't check it.
+ * libavcodec will pass previous buffer in pic, function should return
+ * same buffer or new buffer with old frame "painted" into it.
+ * If pic.data[0] == NULL must behave like get_buffer().
+ * if CODEC_CAP_DR1 is not set then reget_buffer() must call
+ * avcodec_default_reget_buffer() instead of providing buffers allocated by
+ * some other means.
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Number of bits which should be loaded into the rc buffer before decoding starts.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_initial_buffer_occupancy;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int inter_threshold;
+
+ /**
+ * CODEC_FLAG2_*
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags2;
+
+ /**
+ * Simulates errors in the bitstream to test error concealment.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int error_rate;
+
+#if FF_API_ANTIALIAS_ALGO
+ /**
+ * MP3 antialias algorithm, see FF_AA_* below.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ attribute_deprecated int antialias_algo;
+#define FF_AA_AUTO 0
+#define FF_AA_FASTINT 1 //not implemented yet
+#define FF_AA_INT 2
+#define FF_AA_FLOAT 3
+#endif
+
+ /**
+ * quantizer noise shaping
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int quantizer_noise_shaping;
+
+ /**
+ * thread count
+ * is used to decide how many independent tasks should be passed to execute()
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_count;
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * @param count the number of things to execute
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);
+
+ /**
+ * thread opaque
+ * Can be used by execute() to store some per AVCodecContext stuff.
+ * - encoding: set by execute()
+ * - decoding: set by execute()
+ */
+ void *thread_opaque;
+
+ /**
+ * Motion estimation threshold below which no motion estimation is
+ * performed, but instead the user specified motion vectors are used.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_threshold;
+
+ /**
+ * Macroblock threshold below which the user specified macroblock types will be used.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_threshold;
+
+ /**
+ * precision of the intra DC coefficient - 8
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int intra_dc_precision;
+
+ /**
+ * noise vs. sse weight for the nsse comparsion function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int nsse_weight;
+
+ /**
+ * Number of macroblock rows at the top which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_top;
+
+ /**
+ * Number of macroblock rows at the bottom which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_bottom;
+
+ /**
+ * profile
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int profile;
+#define FF_PROFILE_UNKNOWN -99
+#define FF_PROFILE_RESERVED -100
+
+#define FF_PROFILE_AAC_MAIN 0
+#define FF_PROFILE_AAC_LOW 1
+#define FF_PROFILE_AAC_SSR 2
+#define FF_PROFILE_AAC_LTP 3
+
+#define FF_PROFILE_DTS 20
+#define FF_PROFILE_DTS_ES 30
+#define FF_PROFILE_DTS_96_24 40
+#define FF_PROFILE_DTS_HD_HRA 50
+#define FF_PROFILE_DTS_HD_MA 60
+
+#define FF_PROFILE_MPEG2_422 0
+#define FF_PROFILE_MPEG2_HIGH 1
+#define FF_PROFILE_MPEG2_SS 2
+#define FF_PROFILE_MPEG2_SNR_SCALABLE 3
+#define FF_PROFILE_MPEG2_MAIN 4
+#define FF_PROFILE_MPEG2_SIMPLE 5
+
+#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag
+#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag
+
+#define FF_PROFILE_H264_BASELINE 66
+#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)
+#define FF_PROFILE_H264_MAIN 77
+#define FF_PROFILE_H264_EXTENDED 88
+#define FF_PROFILE_H264_HIGH 100
+#define FF_PROFILE_H264_HIGH_10 110
+#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_422 122
+#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_444 144
+#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244
+#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_CAVLC_444 44
+
+#define FF_PROFILE_VC1_SIMPLE 0
+#define FF_PROFILE_VC1_MAIN 1
+#define FF_PROFILE_VC1_COMPLEX 2
+#define FF_PROFILE_VC1_ADVANCED 3
+
+#define FF_PROFILE_MPEG4_SIMPLE 0
+#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1
+#define FF_PROFILE_MPEG4_CORE 2
+#define FF_PROFILE_MPEG4_MAIN 3
+#define FF_PROFILE_MPEG4_N_BIT 4
+#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5
+#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
+#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
+#define FF_PROFILE_MPEG4_HYBRID 8
+#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
+#define FF_PROFILE_MPEG4_CORE_SCALABLE 10
+#define FF_PROFILE_MPEG4_ADVANCED_CODING 11
+#define FF_PROFILE_MPEG4_ADVANCED_CORE 12
+#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
+#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14
+#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15
+
+ /**
+ * level
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int level;
+#define FF_LEVEL_UNKNOWN -99
+
+ /**
+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int lowres;
+
+ /**
+ * Bitstream width / height, may be different from width/height if lowres enabled.
+ * - encoding: unused
+ * - decoding: Set by user before init if known. Codec should override / dynamically change if needed.
+ */
+ int coded_width, coded_height;
+
+ /**
+ * frame skip threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_threshold;
+
+ /**
+ * frame skip factor
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_factor;
+
+ /**
+ * frame skip exponent
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_exp;
+
+ /**
+ * frame skip comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_cmp;
+
+ /**
+ * Border processing masking, raises the quantizer for mbs on the borders
+ * of the picture.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float border_masking;
+
+ /**
+ * minimum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmin;
+
+ /**
+ * maximum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmax;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_penalty_compensation;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_loop_filter;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_idct;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_frame;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int bidir_refine;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int brd_scale;
+
+#if FF_API_X264_GLOBAL_OPTS
+ /**
+ * constant rate factor - quality-based VBR - values ~correspond to qps
+ * - encoding: Set by user.
+ * - decoding: unused
+ * @deprecated use 'crf' libx264 private option
+ */
+ attribute_deprecated float crf;
+
+ /**
+ * constant quantization parameter rate control method
+ * - encoding: Set by user.
+ * - decoding: unused
+ * @deprecated use 'cqp' libx264 private option
+ */
+ attribute_deprecated int cqp;
+#endif
+
+ /**
+ * minimum GOP size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int keyint_min;
+
+ /**
+ * number of reference frames
+ * - encoding: Set by user.
+ * - decoding: Set by lavc.
+ */
+ int refs;
+
+ /**
+ * chroma qp offset from luma
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int chromaoffset;
+
+#if FF_API_X264_GLOBAL_OPTS
+ /**
+ * Influence how often B-frames are used.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int bframebias;
+#endif
+
+ /**
+ * trellis RD quantization
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int trellis;
+
+#if FF_API_X264_GLOBAL_OPTS
+ /**
+ * Reduce fluctuations in qp (before curve compression).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated float complexityblur;
+
+ /**
+ * in-loop deblocking filter alphac0 parameter
+ * alpha is in the range -6...6
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int deblockalpha;
+
+ /**
+ * in-loop deblocking filter beta parameter
+ * beta is in the range -6...6
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int deblockbeta;
+
+ /**
+ * macroblock subpartition sizes to consider - p8x8, p4x4, b8x8, i8x8, i4x4
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int partitions;
+#define X264_PART_I4X4 0x001 /* Analyze i4x4 */
+#define X264_PART_I8X8 0x002 /* Analyze i8x8 (requires 8x8 transform) */
+#define X264_PART_P8X8 0x010 /* Analyze p16x8, p8x16 and p8x8 */
+#define X264_PART_P4X4 0x020 /* Analyze p8x4, p4x8, p4x4 */
+#define X264_PART_B8X8 0x100 /* Analyze b16x8, b8x16 and b8x8 */
+
+ /**
+ * direct MV prediction mode - 0 (none), 1 (spatial), 2 (temporal), 3 (auto)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int directpred;
+#endif
+
+ /**
+ * Audio cutoff bandwidth (0 means "automatic")
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int cutoff;
+
+ /**
+ * Multiplied by qscale for each frame and added to scene_change_score.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_factor;
+
+ /**
+ *
+ * Note: Value depends upon the compare function used for fullpel ME.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mv0_threshold;
+
+ /**
+ * Adjust sensitivity of b_frame_strategy 1.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int b_sensitivity;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int compression_level;
+#define FF_COMPRESSION_DEFAULT -1
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int min_prediction_order;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_prediction_order;
+
+#if FF_API_FLAC_GLOBAL_OPTS
+ /**
+ * @name FLAC options
+ * @deprecated Use FLAC encoder private options instead.
+ * @{
+ */
+
+ /**
+ * LPC coefficient precision - used by FLAC encoder
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int lpc_coeff_precision;
+
+ /**
+ * search method for selecting prediction order
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int prediction_order_method;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int min_partition_order;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int max_partition_order;
+ /**
+ * @}
+ */
+#endif
+
+ /**
+ * GOP timecode frame start number, in non drop frame format
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int64_t timecode_frame_start;
+
+#if FF_API_REQUEST_CHANNELS
+ /**
+ * Decoder should decode to this many channels if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @deprecated Deprecated in favor of request_channel_layout.
+ */
+ int request_channels;
+#endif
+
+#if FF_API_DRC_SCALE
+ /**
+ * Percentage of dynamic range compression to be applied by the decoder.
+ * The default value is 1.0, corresponding to full compression.
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @deprecated use AC3 decoder private option instead.
+ */
+ attribute_deprecated float drc_scale;
+#endif
+
+ /**
+ * opaque 64bit number (generally a PTS) that will be reordered and
+ * output in AVFrame.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * Bits per sample/pixel of internal libavcodec pixel/sample format.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ int bits_per_raw_sample;
+
+ /**
+ * Audio channel layout.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ uint64_t channel_layout;
+
+ /**
+ * Request decoder to use this channel layout if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ uint64_t request_channel_layout;
+
+ /**
+ * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_max_available_vbv_use;
+
+ /**
+ * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_min_vbv_overflow_use;
+
+ /**
+ * Hardware accelerator in use
+ * - encoding: unused.
+ * - decoding: Set by libavcodec
+ */
+ struct AVHWAccel *hwaccel;
+
+ /**
+ * For some codecs, the time base is closer to the field rate than the frame rate.
+ * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
+ * if no telecine is used ...
+ *
+ * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
+ */
+ int ticks_per_frame;
+
+ /**
+ * Hardware accelerator context.
+ * For some hardware accelerators, a global context needs to be
+ * provided by the user. In that case, this holds display-dependent
+ * data Libav cannot instantiate itself. Please refer to the
+ * Libav HW accelerator documentation to know how to fill this
+ * is. e.g. for VA API, this is a struct vaapi_context.
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *hwaccel_context;
+
+ /**
+ * Chromaticity coordinates of the source primaries.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorPrimaries color_primaries;
+
+ /**
+ * Color Transfer Characteristic.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorTransferCharacteristic color_trc;
+
+ /**
+ * YUV colorspace type.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorSpace colorspace;
+
+ /**
+ * MPEG vs JPEG YUV range.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorRange color_range;
+
+ /**
+ * This defines the location of chroma samples.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVChromaLocation chroma_sample_location;
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * Also see avcodec_thread_init and e.g. the --enable-pthread configure option.
+ * @param c context passed also to func
+ * @param count the number of things to execute
+ * @param arg2 argument passed unchanged to func
+ * @param ret return values of executed functions, must have space for "count" values. May be NULL.
+ * @param func function that will be called count times, with jobnr from 0 to count-1.
+ * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no
+ * two instances of func executing at the same time will have the same threadnr.
+ * @return always 0 currently, but code should handle a future improvement where when any call to func
+ * returns < 0 no further calls to func may be done and < 0 is returned.
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
+
+#if FF_API_X264_GLOBAL_OPTS
+ /**
+ * explicit P-frame weighted prediction analysis method
+ * 0: off
+ * 1: fast blind weighting (one reference duplicate with -1 offset)
+ * 2: smart weighting (full fade detection analysis)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int weighted_p_pred;
+
+ /**
+ * AQ mode
+ * 0: Disabled
+ * 1: Variance AQ (complexity mask)
+ * 2: Auto-variance AQ (experimental)
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated int aq_mode;
+
+ /**
+ * AQ strength
+ * Reduces blocking and blurring in flat and textured areas.
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated float aq_strength;
+
+ /**
+ * PSY RD
+ * Strength of psychovisual optimization
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated float psy_rd;
+
+ /**
+ * PSY trellis
+ * Strength of psychovisual optimization
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated float psy_trellis;
+
+ /**
+ * RC lookahead
+ * Number of frames for frametype and ratecontrol lookahead
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated int rc_lookahead;
+
+ /**
+ * Constant rate factor maximum
+ * With CRF encoding mode and VBV restrictions enabled, prevents quality from being worse
+ * than crf_max, even if doing so would violate VBV restrictions.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated float crf_max;
+#endif
+
+ int log_level_offset;
+
+#if FF_API_FLAC_GLOBAL_OPTS
+ /**
+ * Determine which LPC analysis algorithm to use.
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated enum AVLPCType lpc_type;
+
+ /**
+ * Number of passes to use for Cholesky factorization during LPC analysis
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ attribute_deprecated int lpc_passes;
+#endif
+
+ /**
+ * Number of slices.
+ * Indicates number of picture subdivisions. Used for parallelized
+ * decoding.
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ int slices;
+
+ /**
+ * Header containing style information for text subtitles.
+ * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
+ * [Script Info] and [V4+ Styles] section, plus the [Events] line and
+ * the Format line following. It shouldn't include any Dialogue line.
+ * - encoding: Set/allocated/freed by user (before avcodec_open2())
+ * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
+ */
+ uint8_t *subtitle_header;
+ int subtitle_header_size;
+
+ /**
+ * Current packet as passed into the decoder, to avoid having
+ * to pass the packet into every function. Currently only valid
+ * inside lavc and get/release_buffer callbacks.
+ * - decoding: set by avcodec_decode_*, read by get_buffer() for setting pkt_pts
+ * - encoding: unused
+ */
+ AVPacket *pkt;
+
+#if FF_API_INTERNAL_CONTEXT
+ /**
+ * Whether this is a copy of the context which had init() called on it.
+ * This is used by multithreading - shared tables and picture pointers
+ * should be freed from the original context only.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ *
+ * @deprecated this field has been moved to an internal context
+ */
+ attribute_deprecated int is_copy;
+#endif
+
+ /**
+ * Which multithreading methods to use.
+ * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
+ * so clients which cannot provide future frames should not use it.
+ *
+ * - encoding: Set by user, otherwise the default is used.
+ * - decoding: Set by user, otherwise the default is used.
+ */
+ int thread_type;
+#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once
+#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once
+
+ /**
+ * Which multithreading methods are in use by the codec.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int active_thread_type;
+
+ /**
+ * Set by the client if its custom get_buffer() callback can be called
+ * from another thread, which allows faster multithreaded decoding.
+ * draw_horiz_band() will be called from other threads regardless of this setting.
+ * Ignored if the default get_buffer() is used.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_safe_callbacks;
+
+ /**
+ * VBV delay coded in the last frame (in periods of a 27 MHz clock).
+ * Used for compliant TS muxing.
+ * - encoding: Set by libavcodec.
+ * - decoding: unused.
+ */
+ uint64_t vbv_delay;
+
+ /**
+ * Type of service that the audio stream conveys.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVAudioServiceType audio_service_type;
+
+ /**
+ * Used to request a sample format from the decoder.
+ * - encoding: unused.
+ * - decoding: Set by user.
+ */
+ enum AVSampleFormat request_sample_fmt;
+
+ /**
+ * Error recognition; may misdetect some more or less valid parts as errors.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int err_recognition;
+#define AV_EF_CRCCHECK (1<<0)
+#define AV_EF_BITSTREAM (1<<1)
+#define AV_EF_BUFFER (1<<2)
+#define AV_EF_EXPLODE (1<<3)
+
+ /**
+ * Private context used for internal data.
+ *
+ * Unlike priv_data, this is not codec-specific. It is used in general
+ * libavcodec functions.
+ */
+ struct AVCodecInternal *internal;
+
+ /** Field order
+ * - encoding: set by libavcodec
+ * - decoding: Set by libavcodec
+ */
+ enum AVFieldOrder field_order;
+} AVCodecContext;
+
+/**
+ * AVProfile.
+ */
+typedef struct AVProfile {
+ int profile;
+ const char *name; ///< short name for the profile
+} AVProfile;
+
+typedef struct AVCodecDefault AVCodecDefault;
+
+/**
+ * AVCodec.
+ */
+typedef struct AVCodec {
+ /**
+ * Name of the codec implementation.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ * This is the primary way to find a codec from the user perspective.
+ */
+ const char *name;
+ enum AVMediaType type;
+ enum CodecID id;
+ int priv_data_size;
+ int (*init)(AVCodecContext *);
+ int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
+ int (*close)(AVCodecContext *);
+ int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
+ /**
+ * Codec capabilities.
+ * see CODEC_CAP_*
+ */
+ int capabilities;
+ struct AVCodec *next;
+ /**
+ * Flush buffers.
+ * Will be called when seeking
+ */
+ void (*flush)(AVCodecContext *);
+ const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
+ const enum PixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
+ /**
+ * Descriptive name for the codec, meant to be more human readable than name.
+ * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
+ */
+ const char *long_name;
+ const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
+ const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
+ const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
+ uint8_t max_lowres; ///< maximum value for lowres supported by the decoder
+ const AVClass *priv_class; ///< AVClass for the private context
+ const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
+
+ /**
+ * @name Frame-level threading support functions
+ * @{
+ */
+ /**
+ * If defined, called on thread contexts when they are created.
+ * If the codec allocates writable tables in init(), re-allocate them here.
+ * priv_data will be set to a copy of the original.
+ */
+ int (*init_thread_copy)(AVCodecContext *);
+ /**
+ * Copy necessary context variables from a previous thread context to the current one.
+ * If not defined, the next thread will start automatically; otherwise, the codec
+ * must call ff_thread_finish_setup().
+ *
+ * dst and src will (rarely) point to the same context, in which case memcpy should be skipped.
+ */
+ int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src);
+ /** @} */
+
+ /**
+ * Private codec-specific defaults.
+ */
+ const AVCodecDefault *defaults;
+
+ /**
+ * Initialize codec static data, called from avcodec_register().
+ */
+ void (*init_static_data)(struct AVCodec *codec);
+
+ /**
+ * Encode data to an AVPacket.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket (may contain a user-provided buffer)
+ * @param[in] frame AVFrame containing the raw data to be encoded
+ * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
+ * non-empty packet was returned in avpkt.
+ * @return 0 on success, negative error code on failure
+ */
+ int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
+ int *got_packet_ptr);
+} AVCodec;
+
+/**
+ * AVHWAccel.
+ */
+typedef struct AVHWAccel {
+ /**
+ * Name of the hardware accelerated codec.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ */
+ const char *name;
+
+ /**
+ * Type of codec implemented by the hardware accelerator.
+ *
+ * See AVMEDIA_TYPE_xxx
+ */
+ enum AVMediaType type;
+
+ /**
+ * Codec implemented by the hardware accelerator.
+ *
+ * See CODEC_ID_xxx
+ */
+ enum CodecID id;
+
+ /**
+ * Supported pixel format.
+ *
+ * Only hardware accelerated formats are supported here.
+ */
+ enum PixelFormat pix_fmt;
+
+ /**
+ * Hardware accelerated codec capabilities.
+ * see FF_HWACCEL_CODEC_CAP_*
+ */
+ int capabilities;
+
+ struct AVHWAccel *next;
+
+ /**
+ * Called at the beginning of each frame or field picture.
+ *
+ * Meaningful frame information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * Note that buf can be NULL along with buf_size set to 0.
+ * Otherwise, this means the whole frame is available at this point.
+ *
+ * @param avctx the codec context
+ * @param buf the frame data buffer base
+ * @param buf_size the size of the frame in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Callback for each slice.
+ *
+ * Meaningful slice information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @param buf the slice data buffer base
+ * @param buf_size the size of the slice in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Called at the end of each frame or field picture.
+ *
+ * The whole picture is parsed at this point and can now be sent
+ * to the hardware accelerator. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*end_frame)(AVCodecContext *avctx);
+
+ /**
+ * Size of HW accelerator private data.
+ *
+ * Private data is allocated with av_mallocz() before
+ * AVCodecContext.get_buffer() and deallocated after
+ * AVCodecContext.release_buffer().
+ */
+ int priv_data_size;
+} AVHWAccel;
+
+/**
+ * four components are given, that's all.
+ * the last component is alpha
+ */
+typedef struct AVPicture {
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+ int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line
+} AVPicture;
+
+#define AVPALETTE_SIZE 1024
+#define AVPALETTE_COUNT 256
+#if FF_API_PALETTE_CONTROL
+/**
+ * AVPaletteControl
+ * This structure defines a method for communicating palette changes
+ * between and demuxer and a decoder.
+ *
+ * @deprecated Use AVPacket to send palette changes instead.
+ * This is totally broken.
+ */
+typedef struct AVPaletteControl {
+
+ /* Demuxer sets this to 1 to indicate the palette has changed;
+ * decoder resets to 0. */
+ int palette_changed;
+
+ /* 4-byte ARGB palette entries, stored in native byte order; note that
+ * the individual palette components should be on a 8-bit scale; if
+ * the palette data comes from an IBM VGA native format, the component
+ * data is probably 6 bits in size and needs to be scaled. */
+ unsigned int palette[AVPALETTE_COUNT];
+
+} AVPaletteControl attribute_deprecated;
+#endif
+
+enum AVSubtitleType {
+ SUBTITLE_NONE,
+
+ SUBTITLE_BITMAP, ///< A bitmap, pict will be set
+
+ /**
+ * Plain text, the text field must be set by the decoder and is
+ * authoritative. ass and pict fields may contain approximations.
+ */
+ SUBTITLE_TEXT,
+
+ /**
+ * Formatted text, the ass field must be set by the decoder and is
+ * authoritative. pict and text fields may contain approximations.
+ */
+ SUBTITLE_ASS,
+};
+
+typedef struct AVSubtitleRect {
+ int x; ///< top left corner of pict, undefined when pict is not set
+ int y; ///< top left corner of pict, undefined when pict is not set
+ int w; ///< width of pict, undefined when pict is not set
+ int h; ///< height of pict, undefined when pict is not set
+ int nb_colors; ///< number of colors in pict, undefined when pict is not set
+
+ /**
+ * data+linesize for the bitmap of this subtitle.
+ * can be set for text/ass as well once they where rendered
+ */
+ AVPicture pict;
+ enum AVSubtitleType type;
+
+ char *text; ///< 0 terminated plain UTF-8 text
+
+ /**
+ * 0 terminated ASS/SSA compatible event line.
+ * The pressentation of this is unaffected by the other values in this
+ * struct.
+ */
+ char *ass;
+} AVSubtitleRect;
+
+typedef struct AVSubtitle {
+ uint16_t format; /* 0 = graphics */
+ uint32_t start_display_time; /* relative to packet pts, in ms */
+ uint32_t end_display_time; /* relative to packet pts, in ms */
+ unsigned num_rects;
+ AVSubtitleRect **rects;
+ int64_t pts; ///< Same as packet pts, in AV_TIME_BASE
+} AVSubtitle;
+
+/* packet functions */
+
+/**
+ * @deprecated use NULL instead
+ */
+attribute_deprecated void av_destruct_packet_nofree(AVPacket *pkt);
+
+/**
+ * Default packet destructor.
+ */
+void av_destruct_packet(AVPacket *pkt);
+
+/**
+ * Initialize optional fields of a packet with default values.
+ *
+ * @param pkt packet
+ */
+void av_init_packet(AVPacket *pkt);
+
+/**
+ * Allocate the payload of a packet and initialize its fields with
+ * default values.
+ *
+ * @param pkt packet
+ * @param size wanted payload size
+ * @return 0 if OK, AVERROR_xxx otherwise
+ */
+int av_new_packet(AVPacket *pkt, int size);
+
+/**
+ * Reduce packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param size new size
+ */
+void av_shrink_packet(AVPacket *pkt, int size);
+
+/**
+ * Increase packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param grow_by number of bytes by which to increase the size of the packet
+ */
+int av_grow_packet(AVPacket *pkt, int grow_by);
+
+/**
+ * @warning This is a hack - the packet memory allocation stuff is broken. The
+ * packet is allocated if it was not really allocated.
+ */
+int av_dup_packet(AVPacket *pkt);
+
+/**
+ * Free a packet.
+ *
+ * @param pkt packet to free
+ */
+void av_free_packet(AVPacket *pkt);
+
+/**
+ * Allocate new information of a packet.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Get side information from packet.
+ *
+ * @param pkt packet
+ * @param type desired side information type
+ * @param size pointer for side information size to store (optional)
+ * @return pointer to data if present or NULL otherwise
+ */
+uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int *size);
+
+/* resample.c */
+
+struct ReSampleContext;
+struct AVResampleContext;
+
+typedef struct ReSampleContext ReSampleContext;
+
+/**
+ * Initialize audio resampling context.
+ *
+ * @param output_channels number of output channels
+ * @param input_channels number of input channels
+ * @param output_rate output sample rate
+ * @param input_rate input sample rate
+ * @param sample_fmt_out requested output sample format
+ * @param sample_fmt_in input sample format
+ * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency
+ * @param log2_phase_count log2 of the number of entries in the polyphase filterbank
+ * @param linear if 1 then the used FIR filter will be linearly interpolated
+ between the 2 closest, if 0 the closest will be used
+ * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate
+ * @return allocated ReSampleContext, NULL if error occurred
+ */
+ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
+ int output_rate, int input_rate,
+ enum AVSampleFormat sample_fmt_out,
+ enum AVSampleFormat sample_fmt_in,
+ int filter_length, int log2_phase_count,
+ int linear, double cutoff);
+
+int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples);
+
+/**
+ * Free resample context.
+ *
+ * @param s a non-NULL pointer to a resample context previously
+ * created with av_audio_resample_init()
+ */
+void audio_resample_close(ReSampleContext *s);
+
+
+/**
+ * Initialize an audio resampler.
+ * Note, if either rate is not an integer then simply scale both rates up so they are.
+ * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq
+ * @param log2_phase_count log2 of the number of entries in the polyphase filterbank
+ * @param linear If 1 then the used FIR filter will be linearly interpolated
+ between the 2 closest, if 0 the closest will be used
+ * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate
+ */
+struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff);
+
+/**
+ * Resample an array of samples using a previously configured context.
+ * @param src an array of unconsumed samples
+ * @param consumed the number of samples of src which have been consumed are returned here
+ * @param src_size the number of unconsumed samples available
+ * @param dst_size the amount of space in samples available in dst
+ * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context.
+ * @return the number of samples written in dst or -1 if an error occurred
+ */
+int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx);
+
+
+/**
+ * Compensate samplerate/timestamp drift. The compensation is done by changing
+ * the resampler parameters, so no audible clicks or similar distortions occur
+ * @param compensation_distance distance in output samples over which the compensation should be performed
+ * @param sample_delta number of output samples which should be output less
+ *
+ * example: av_resample_compensate(c, 10, 500)
+ * here instead of 510 samples only 500 samples would be output
+ *
+ * note, due to rounding the actual compensation might be slightly different,
+ * especially if the compensation_distance is large and the in_rate used during init is small
+ */
+void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance);
+void av_resample_close(struct AVResampleContext *c);
+
+/**
+ * Allocate memory for a picture. Call avpicture_free() to free it.
+ *
+ * @see avpicture_fill()
+ *
+ * @param picture the picture to be filled in
+ * @param pix_fmt the format of the picture
+ * @param width the width of the picture
+ * @param height the height of the picture
+ * @return zero if successful, a negative value if not
+ */
+int avpicture_alloc(AVPicture *picture, enum PixelFormat pix_fmt, int width, int height);
+
+/**
+ * Free a picture previously allocated by avpicture_alloc().
+ * The data buffer used by the AVPicture is freed, but the AVPicture structure
+ * itself is not.
+ *
+ * @param picture the AVPicture to be freed
+ */
+void avpicture_free(AVPicture *picture);
+
+/**
+ * Fill in the AVPicture fields.
+ * The fields of the given AVPicture are filled in by using the 'ptr' address
+ * which points to the image data buffer. Depending on the specified picture
+ * format, one or multiple image data pointers and line sizes will be set.
+ * If a planar format is specified, several pointers will be set pointing to
+ * the different picture planes and the line sizes of the different planes
+ * will be stored in the lines_sizes array.
+ * Call with ptr == NULL to get the required size for the ptr buffer.
+ *
+ * To allocate the buffer and fill in the AVPicture fields in one call,
+ * use avpicture_alloc().
+ *
+ * @param picture AVPicture whose fields are to be filled in
+ * @param ptr Buffer which will contain or contains the actual image data
+ * @param pix_fmt The format in which the picture data is stored.
+ * @param width the width of the image in pixels
+ * @param height the height of the image in pixels
+ * @return size of the image data in bytes
+ */
+int avpicture_fill(AVPicture *picture, uint8_t *ptr,
+ enum PixelFormat pix_fmt, int width, int height);
+
+/**
+ * Copy pixel data from an AVPicture into a buffer.
+ * The data is stored compactly, without any gaps for alignment or padding
+ * which may be applied by avpicture_fill().
+ *
+ * @see avpicture_get_size()
+ *
+ * @param[in] src AVPicture containing image data
+ * @param[in] pix_fmt The format in which the picture data is stored.
+ * @param[in] width the width of the image in pixels.
+ * @param[in] height the height of the image in pixels.
+ * @param[out] dest A buffer into which picture data will be copied.
+ * @param[in] dest_size The size of 'dest'.
+ * @return The number of bytes written to dest, or a negative value (error code) on error.
+ */
+int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width, int height,
+ unsigned char *dest, int dest_size);
+
+/**
+ * Calculate the size in bytes that a picture of the given width and height
+ * would occupy if stored in the given picture format.
+ * Note that this returns the size of a compact representation as generated
+ * by avpicture_layout(), which can be smaller than the size required for e.g.
+ * avpicture_fill().
+ *
+ * @param pix_fmt the given picture format
+ * @param width the width of the image
+ * @param height the height of the image
+ * @return Image data size in bytes or -1 on error (e.g. too large dimensions).
+ */
+int avpicture_get_size(enum PixelFormat pix_fmt, int width, int height);
+void avcodec_get_chroma_sub_sample(enum PixelFormat pix_fmt, int *h_shift, int *v_shift);
+
+#if FF_API_GET_PIX_FMT_NAME
+/**
+ * @deprecated Deprecated in favor of av_get_pix_fmt_name().
+ */
+attribute_deprecated
+const char *avcodec_get_pix_fmt_name(enum PixelFormat pix_fmt);
+#endif
+
+void avcodec_set_dimensions(AVCodecContext *s, int width, int height);
+
+/**
+ * Return a value representing the fourCC code associated to the
+ * pixel format pix_fmt, or 0 if no associated fourCC code can be
+ * found.
+ */
+unsigned int avcodec_pix_fmt_to_codec_tag(enum PixelFormat pix_fmt);
+
+/**
+ * Put a string representing the codec tag codec_tag in buf.
+ *
+ * @param buf_size size in bytes of buf
+ * @return the length of the string that would have been generated if
+ * enough space had been available, excluding the trailing null
+ */
+size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag);
+
+#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */
+#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */
+#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */
+#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */
+#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */
+#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */
+
+/**
+ * Compute what kind of losses will occur when converting from one specific
+ * pixel format to another.
+ * When converting from one pixel format to another, information loss may occur.
+ * For example, when converting from RGB24 to GRAY, the color information will
+ * be lost. Similarly, other losses occur when converting from some formats to
+ * other formats. These losses can involve loss of chroma, but also loss of
+ * resolution, loss of color depth, loss due to the color space conversion, loss
+ * of the alpha bits or loss due to color quantization.
+ * avcodec_get_fix_fmt_loss() informs you about the various types of losses
+ * which will occur when converting from one pixel format to another.
+ *
+ * @param[in] dst_pix_fmt destination pixel format
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @return Combination of flags informing you what kind of losses will occur.
+ */
+int avcodec_get_pix_fmt_loss(enum PixelFormat dst_pix_fmt, enum PixelFormat src_pix_fmt,
+ int has_alpha);
+
+/**
+ * Find the best pixel format to convert to given a certain source pixel
+ * format. When converting from one pixel format to another, information loss
+ * may occur. For example, when converting from RGB24 to GRAY, the color
+ * information will be lost. Similarly, other losses occur when converting from
+ * some formats to other formats. avcodec_find_best_pix_fmt() searches which of
+ * the given pixel formats should be used to suffer the least amount of loss.
+ * The pixel formats from which it chooses one, are determined by the
+ * pix_fmt_mask parameter.
+ *
+ * @code
+ * src_pix_fmt = PIX_FMT_YUV420P;
+ * pix_fmt_mask = (1 << PIX_FMT_YUV422P) || (1 << PIX_FMT_RGB24);
+ * dst_pix_fmt = avcodec_find_best_pix_fmt(pix_fmt_mask, src_pix_fmt, alpha, &loss);
+ * @endcode
+ *
+ * @param[in] pix_fmt_mask bitmask determining which pixel format to choose from
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
+ * @return The best pixel format to convert to or -1 if none was found.
+ */
+enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt,
+ int has_alpha, int *loss_ptr);
+
+#if FF_API_GET_ALPHA_INFO
+#define FF_ALPHA_TRANSP 0x0001 /* image has some totally transparent pixels */
+#define FF_ALPHA_SEMI_TRANSP 0x0002 /* image has some transparent pixels */
+
+/**
+ * Tell if an image really has transparent alpha values.
+ * @return ored mask of FF_ALPHA_xxx constants
+ */
+attribute_deprecated
+int img_get_alpha_info(const AVPicture *src,
+ enum PixelFormat pix_fmt, int width, int height);
+#endif
+
+/* deinterlace a picture */
+/* deinterlace - if not supported return -1 */
+int avpicture_deinterlace(AVPicture *dst, const AVPicture *src,
+ enum PixelFormat pix_fmt, int width, int height);
+
+/* external high level API */
+
+/**
+ * If c is NULL, returns the first registered codec,
+ * if c is non-NULL, returns the next registered codec after c,
+ * or NULL if c is the last one.
+ */
+AVCodec *av_codec_next(AVCodec *c);
+
+/**
+ * Return the LIBAVCODEC_VERSION_INT constant.
+ */
+unsigned avcodec_version(void);
+
+/**
+ * Return the libavcodec build-time configuration.
+ */
+const char *avcodec_configuration(void);
+
+/**
+ * Return the libavcodec license.
+ */
+const char *avcodec_license(void);
+
+#if FF_API_AVCODEC_INIT
+/**
+ * @deprecated this function is called automatically from avcodec_register()
+ * and avcodec_register_all(), there is no need to call it manually
+ */
+attribute_deprecated
+void avcodec_init(void);
+#endif
+
+/**
+ * Register the codec codec and initialize libavcodec.
+ *
+ * @warning either this function or avcodec_register_all() must be called
+ * before any other libavcodec functions.
+ *
+ * @see avcodec_register_all()
+ */
+void avcodec_register(AVCodec *codec);
+
+/**
+ * Find a registered encoder with a matching codec ID.
+ *
+ * @param id CodecID of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder(enum CodecID id);
+
+/**
+ * Find a registered encoder with the specified name.
+ *
+ * @param name name of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder_by_name(const char *name);
+
+/**
+ * Find a registered decoder with a matching codec ID.
+ *
+ * @param id CodecID of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder(enum CodecID id);
+
+/**
+ * Find a registered decoder with the specified name.
+ *
+ * @param name name of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder_by_name(const char *name);
+void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode);
+
+/**
+ * Return a name for the specified profile, if available.
+ *
+ * @param codec the codec that is searched for the given profile
+ * @param profile the profile value for which a name is requested
+ * @return A name for the profile if found, NULL otherwise.
+ */
+const char *av_get_profile_name(const AVCodec *codec, int profile);
+
+#if FF_API_ALLOC_CONTEXT
+/**
+ * Set the fields of the given AVCodecContext to default values.
+ *
+ * @param s The AVCodecContext of which the fields should be set to default values.
+ * @deprecated use avcodec_get_context_defaults3
+ */
+attribute_deprecated
+void avcodec_get_context_defaults(AVCodecContext *s);
+
+/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API!
+ * we WILL change its arguments and name a few times! */
+attribute_deprecated
+void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType);
+#endif
+
+/**
+ * Set the fields of the given AVCodecContext to default values corresponding
+ * to the given codec (defaults may be codec-dependent).
+ *
+ * Do not call this function if a non-NULL codec has been passed
+ * to avcodec_alloc_context3() that allocated this AVCodecContext.
+ * If codec is non-NULL, it is illegal to call avcodec_open2() with a
+ * different codec on this AVCodecContext.
+ */
+int avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec);
+
+#if FF_API_ALLOC_CONTEXT
+/**
+ * Allocate an AVCodecContext and set its fields to default values. The
+ * resulting struct can be deallocated by simply calling av_free().
+ *
+ * @return An AVCodecContext filled with default values or NULL on failure.
+ * @see avcodec_get_context_defaults
+ *
+ * @deprecated use avcodec_alloc_context3()
+ */
+attribute_deprecated
+AVCodecContext *avcodec_alloc_context(void);
+
+/** THIS FUNCTION IS NOT YET PART OF THE PUBLIC API!
+ * we WILL change its arguments and name a few times! */
+attribute_deprecated
+AVCodecContext *avcodec_alloc_context2(enum AVMediaType);
+#endif
+
+/**
+ * Allocate an AVCodecContext and set its fields to default values. The
+ * resulting struct can be deallocated by calling avcodec_close() on it followed
+ * by av_free().
+ *
+ * @param codec if non-NULL, allocate private data and initialize defaults
+ * for the given codec. It is illegal to then call avcodec_open2()
+ * with a different codec.
+ *
+ * @return An AVCodecContext filled with default values or NULL on failure.
+ * @see avcodec_get_context_defaults
+ */
+AVCodecContext *avcodec_alloc_context3(AVCodec *codec);
+
+/**
+ * Copy the settings of the source AVCodecContext into the destination
+ * AVCodecContext. The resulting destination codec context will be
+ * unopened, i.e. you are required to call avcodec_open2() before you
+ * can use this AVCodecContext to decode/encode video/audio data.
+ *
+ * @param dest target codec context, should be initialized with
+ * avcodec_alloc_context3(), but otherwise uninitialized
+ * @param src source codec context
+ * @return AVERROR() on error (e.g. memory allocation error), 0 on success
+ */
+int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
+
+/**
+ * Set the fields of the given AVFrame to default values.
+ *
+ * @param pic The AVFrame of which the fields should be set to default values.
+ */
+void avcodec_get_frame_defaults(AVFrame *pic);
+
+/**
+ * Allocate an AVFrame and set its fields to default values. The resulting
+ * struct can be deallocated by simply calling av_free().
+ *
+ * @return An AVFrame filled with default values or NULL on failure.
+ * @see avcodec_get_frame_defaults
+ */
+AVFrame *avcodec_alloc_frame(void);
+
+int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic);
+void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic);
+int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic);
+
+/**
+ * Return the amount of padding in pixels which the get_buffer callback must
+ * provide around the edge of the image for codecs which do not have the
+ * CODEC_FLAG_EMU_EDGE flag.
+ *
+ * @return Required padding in pixels.
+ */
+unsigned avcodec_get_edge_width(void);
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you do not use any horizontal
+ * padding.
+ *
+ * May only be used if a codec with CODEC_CAP_DR1 has been opened.
+ * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased
+ * according to avcodec_get_edge_width() before.
+ */
+void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you also ensure that all
+ * line sizes are a multiple of the respective linesize_align[i].
+ *
+ * May only be used if a codec with CODEC_CAP_DR1 has been opened.
+ * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased
+ * according to avcodec_get_edge_width() before.
+ */
+void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
+ int linesize_align[AV_NUM_DATA_POINTERS]);
+
+enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt);
+
+#if FF_API_THREAD_INIT
+/**
+ * @deprecated Set s->thread_count before calling avcodec_open2() instead of calling this.
+ */
+attribute_deprecated
+int avcodec_thread_init(AVCodecContext *s, int thread_count);
+#endif
+
+int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size);
+int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
+//FIXME func typedef
+
+#if FF_API_AVCODEC_OPEN
+/**
+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
+ * function the context has to be allocated.
+ *
+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
+ * retrieving a codec.
+ *
+ * @warning This function is not thread safe!
+ *
+ * @code
+ * avcodec_register_all();
+ * codec = avcodec_find_decoder(CODEC_ID_H264);
+ * if (!codec)
+ * exit(1);
+ *
+ * context = avcodec_alloc_context3(codec);
+ *
+ * if (avcodec_open(context, codec) < 0)
+ * exit(1);
+ * @endcode
+ *
+ * @param avctx The context which will be set up to use the given codec.
+ * @param codec The codec to use within the context.
+ * @return zero on success, a negative value on error
+ * @see avcodec_alloc_context3, avcodec_find_decoder, avcodec_find_encoder, avcodec_close
+ *
+ * @deprecated use avcodec_open2
+ */
+attribute_deprecated
+int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
+#endif
+
+/**
+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
+ * function the context has to be allocated with avcodec_alloc_context3().
+ *
+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
+ * retrieving a codec.
+ *
+ * @warning This function is not thread safe!
+ *
+ * @code
+ * avcodec_register_all();
+ * av_dict_set(&opts, "b", "2.5M", 0);
+ * codec = avcodec_find_decoder(CODEC_ID_H264);
+ * if (!codec)
+ * exit(1);
+ *
+ * context = avcodec_alloc_context3(codec);
+ *
+ * if (avcodec_open2(context, codec, opts) < 0)
+ * exit(1);
+ * @endcode
+ *
+ * @param avctx The context to initialize.
+ * @param codec The codec to open this context for. If a non-NULL codec has been
+ * previously passed to avcodec_alloc_context3() or
+ * avcodec_get_context_defaults3() for this context, then this
+ * parameter MUST be either NULL or equal to the previously passed
+ * codec.
+ * @param options A dictionary filled with AVCodecContext and codec-private options.
+ * On return this object will be filled with options that were not found.
+ *
+ * @return zero on success, a negative value on error
+ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
+ * av_dict_set(), av_opt_find().
+ */
+int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options);
+
+#if FF_API_OLD_DECODE_AUDIO
+/**
+ * Wrapper function which calls avcodec_decode_audio4.
+ *
+ * @deprecated Use avcodec_decode_audio4 instead.
+ *
+ * Decode the audio frame of size avpkt->size from avpkt->data into samples.
+ * Some decoders may support multiple frames in a single AVPacket, such
+ * decoders would then just decode the first frame. In this case,
+ * avcodec_decode_audio3 has to be called again with an AVPacket that contains
+ * the remaining data in order to decode the second frame etc.
+ * If no frame
+ * could be outputted, frame_size_ptr is zero. Otherwise, it is the
+ * decompressed frame size in bytes.
+ *
+ * @warning You must set frame_size_ptr to the allocated size of the
+ * output buffer before calling avcodec_decode_audio3().
+ *
+ * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than
+ * the actual read bytes because some optimized bitstream readers read 32 or 64
+ * bits at once and could read over the end.
+ *
+ * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that
+ * no overreading happens for damaged MPEG streams.
+ *
+ * @warning You must not provide a custom get_buffer() when using
+ * avcodec_decode_audio3(). Doing so will override it with
+ * avcodec_default_get_buffer. Use avcodec_decode_audio4() instead,
+ * which does allow the application to provide a custom get_buffer().
+ *
+ * @note You might have to align the input buffer avpkt->data and output buffer
+ * samples. The alignment requirements depend on the CPU: On some CPUs it isn't
+ * necessary at all, on others it won't work at all if not aligned and on others
+ * it will work but it will have an impact on performance.
+ *
+ * In practice, avpkt->data should have 4 byte alignment at minimum and
+ * samples should be 16 byte aligned unless the CPU doesn't need it
+ * (AltiVec and SSE do).
+ *
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
+ * @param avctx the codec context
+ * @param[out] samples the output buffer, sample type in avctx->sample_fmt
+ * If the sample format is planar, each channel plane will
+ * be the same size, with no padding between channels.
+ * @param[in,out] frame_size_ptr the output buffer size in bytes
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * You can create such packet with av_init_packet() and by then setting
+ * data and size, some decoders might in addition need other fields.
+ * All decoders are designed to use the least fields possible though.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame data was decompressed (used) from the input AVPacket.
+ */
+attribute_deprecated int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
+ int *frame_size_ptr,
+ AVPacket *avpkt);
+#endif
+
+/**
+ * Decode the audio frame of size avpkt->size from avpkt->data into frame.
+ *
+ * Some decoders may support multiple frames in a single AVPacket. Such
+ * decoders would then just decode the first frame. In this case,
+ * avcodec_decode_audio4 has to be called again with an AVPacket containing
+ * the remaining data in order to decode the second frame, etc...
+ * Even if no frames are returned, the packet needs to be fed to the decoder
+ * with remaining data until it is completely consumed or an error occurs.
+ *
+ * @warning The input buffer, avpkt->data must be FF_INPUT_BUFFER_PADDING_SIZE
+ * larger than the actual read bytes because some optimized bitstream
+ * readers read 32 or 64 bits at once and could read over the end.
+ *
+ * @note You might have to align the input buffer. The alignment requirements
+ * depend on the CPU and the decoder.
+ *
+ * @param avctx the codec context
+ * @param[out] frame The AVFrame in which to store decoded audio samples.
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer(). The
+ * decoder may, however, only utilize part of the buffer by
+ * setting AVFrame.nb_samples to a smaller value in the
+ * output frame.
+ * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is
+ * non-zero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * At least avpkt->data and avpkt->size should be set. Some
+ * decoders might also require additional fields to be set.
+ * @return A negative error code is returned if an error occurred during
+ * decoding, otherwise the number of bytes consumed from the input
+ * AVPacket is returned.
+ */
+int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
+ int *got_frame_ptr, AVPacket *avpkt);
+
+/**
+ * Decode the video frame of size avpkt->size from avpkt->data into picture.
+ * Some decoders may support multiple frames in a single AVPacket, such
+ * decoders would then just decode the first frame.
+ *
+ * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than
+ * the actual read bytes because some optimized bitstream readers read 32 or 64
+ * bits at once and could read over the end.
+ *
+ * @warning The end of the input buffer buf should be set to 0 to ensure that
+ * no overreading happens for damaged MPEG streams.
+ *
+ * @note You might have to align the input buffer avpkt->data.
+ * The alignment requirements depend on the CPU: on some CPUs it isn't
+ * necessary at all, on others it won't work at all if not aligned and on others
+ * it will work but it will have an impact on performance.
+ *
+ * In practice, avpkt->data should have 4 byte alignment at minimum.
+ *
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
+ * @param avctx the codec context
+ * @param[out] picture The AVFrame in which the decoded video frame will be stored.
+ * Use avcodec_alloc_frame to get an AVFrame, the codec will
+ * allocate memory for the actual bitmap.
+ * with default get/release_buffer(), the decoder frees/reuses the bitmap as it sees fit.
+ * with overridden get/release_buffer() (needs CODEC_CAP_DR1) the user decides into what buffer the decoder
+ * decodes and the decoder tells the user once it does not need the data anymore,
+ * the user app can at this point free/reuse/keep the memory as it sees fit.
+ *
+ * @param[in] avpkt The input AVpacket containing the input buffer.
+ * You can create such packet with av_init_packet() and by then setting
+ * data and size, some decoders might in addition need other fields like
+ * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least
+ * fields possible.
+ * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame could be decompressed.
+ */
+int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
+ int *got_picture_ptr,
+ AVPacket *avpkt);
+
+/**
+ * Decode a subtitle message.
+ * Return a negative value on error, otherwise return the number of bytes used.
+ * If no subtitle could be decompressed, got_sub_ptr is zero.
+ * Otherwise, the subtitle is stored in *sub.
+ * Note that CODEC_CAP_DR1 is not available for subtitle codecs. This is for
+ * simplicity, because the performance difference is expect to be negligible
+ * and reusing a get_buffer written for video codecs would probably perform badly
+ * due to a potentially very different allocation pattern.
+ *
+ * @param avctx the codec context
+ * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be
+ freed with avsubtitle_free if *got_sub_ptr is set.
+ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ */
+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+ int *got_sub_ptr,
+ AVPacket *avpkt);
+
+/**
+ * Free all allocated data in the given subtitle struct.
+ *
+ * @param sub AVSubtitle to free.
+ */
+void avsubtitle_free(AVSubtitle *sub);
+
+#if FF_API_OLD_ENCODE_AUDIO
+/**
+ * Encode an audio frame from samples into buf.
+ *
+ * @deprecated Use avcodec_encode_audio2 instead.
+ *
+ * @note The output buffer should be at least FF_MIN_BUFFER_SIZE bytes large.
+ * However, for codecs with avctx->frame_size equal to 0 (e.g. PCM) the user
+ * will know how much space is needed because it depends on the value passed
+ * in buf_size as described below. In that case a lower value can be used.
+ *
+ * @param avctx the codec context
+ * @param[out] buf the output buffer
+ * @param[in] buf_size the output buffer size
+ * @param[in] samples the input buffer containing the samples
+ * The number of samples read from this buffer is frame_size*channels,
+ * both of which are defined in avctx.
+ * For codecs which have avctx->frame_size equal to 0 (e.g. PCM) the number of
+ * samples read from samples is equal to:
+ * buf_size * 8 / (avctx->channels * av_get_bits_per_sample(avctx->codec_id))
+ * This also implies that av_get_bits_per_sample() must not return 0 for these
+ * codecs.
+ * @return On error a negative value is returned, on success zero or the number
+ * of bytes used to encode the data read from the input buffer.
+ */
+int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx,
+ uint8_t *buf, int buf_size,
+ const short *samples);
+#endif
+
+/**
+ * Encode a frame of audio.
+ *
+ * Takes input samples from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay, split, and combine input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. All other AVPacket fields
+ * will be reset by the encoder using av_init_packet(). If
+ * avpkt->data is NULL, the encoder will allocate it.
+ * The encoder will set avpkt->size to the size of the
+ * output packet.
+ * @param[in] frame AVFrame containing the raw audio data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * CODEC_CAP_DELAY capability set.
+ * There are 2 codec capabilities that affect the allowed
+ * values of frame->nb_samples.
+ * If CODEC_CAP_SMALL_LAST_FRAME is set, then only the final
+ * frame may be smaller than avctx->frame_size, and all other
+ * frames must be equal to avctx->frame_size.
+ * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
+ * can have any number of samples.
+ * If neither is set, frame->nb_samples must be equal to
+ * avctx->frame_size for all frames.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+/**
+ * Fill audio frame data and linesize.
+ * AVFrame extended_data channel pointers are allocated if necessary for
+ * planar audio.
+ *
+ * @param frame the AVFrame
+ * frame->nb_samples must be set prior to calling the
+ * function. This function fills in frame->data,
+ * frame->extended_data, frame->linesize[0].
+ * @param nb_channels channel count
+ * @param sample_fmt sample format
+ * @param buf buffer to use for frame data
+ * @param buf_size size of buffer
+ * @param align plane size sample alignment
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
+ enum AVSampleFormat sample_fmt, const uint8_t *buf,
+ int buf_size, int align);
+
+/**
+ * Encode a video frame from pict into buf.
+ * The input picture should be
+ * stored using a specific format, namely avctx.pix_fmt.
+ *
+ * @param avctx the codec context
+ * @param[out] buf the output buffer for the bitstream of encoded frame
+ * @param[in] buf_size the size of the output buffer in bytes
+ * @param[in] pict the input picture to encode
+ * @return On error a negative value is returned, on success zero or the number
+ * of bytes used from the output buffer.
+ */
+int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ const AVFrame *pict);
+int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ const AVSubtitle *sub);
+
+/**
+ * Close a given AVCodecContext and free all the data associated with it
+ * (but not the AVCodecContext itself).
+ *
+ * Calling this function on an AVCodecContext that hasn't been opened will free
+ * the codec-specific data allocated in avcodec_alloc_context3() /
+ * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will
+ * do nothing.
+ */
+int avcodec_close(AVCodecContext *avctx);
+
+/**
+ * Register all the codecs, parsers and bitstream filters which were enabled at
+ * configuration time. If you do not call this function you can select exactly
+ * which formats you want to support, by using the individual registration
+ * functions.
+ *
+ * @see avcodec_register
+ * @see av_register_codec_parser
+ * @see av_register_bitstream_filter
+ */
+void avcodec_register_all(void);
+
+/**
+ * Flush buffers, should be called when seeking or when switching to a different stream.
+ */
+void avcodec_flush_buffers(AVCodecContext *avctx);
+
+void avcodec_default_free_buffers(AVCodecContext *s);
+
+/* misc useful functions */
+
+#if FF_API_OLD_FF_PICT_TYPES
+/**
+ * Return a single letter to describe the given picture type pict_type.
+ *
+ * @param[in] pict_type the picture type
+ * @return A single character representing the picture type.
+ * @deprecated Use av_get_picture_type_char() instead.
+ */
+attribute_deprecated
+char av_get_pict_type_char(int pict_type);
+#endif
+
+/**
+ * Return codec bits per sample.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_bits_per_sample(enum CodecID codec_id);
+
+#if FF_API_OLD_SAMPLE_FMT
+/**
+ * @deprecated Use av_get_bytes_per_sample() instead.
+ */
+attribute_deprecated
+int av_get_bits_per_sample_format(enum AVSampleFormat sample_fmt);
+#endif
+
+/* frame parsing */
+typedef struct AVCodecParserContext {
+ void *priv_data;
+ struct AVCodecParser *parser;
+ int64_t frame_offset; /* offset of the current frame */
+ int64_t cur_offset; /* current offset
+ (incremented by each av_parser_parse()) */
+ int64_t next_frame_offset; /* offset of the next frame */
+ /* video info */
+ int pict_type; /* XXX: Put it back in AVCodecContext. */
+ /**
+ * This field is used for proper frame duration computation in lavf.
+ * It signals, how much longer the frame duration of the current frame
+ * is compared to normal frame duration.
+ *
+ * frame_duration = (1 + repeat_pict) * time_base
+ *
+ * It is used by codecs like H.264 to display telecined material.
+ */
+ int repeat_pict; /* XXX: Put it back in AVCodecContext. */
+ int64_t pts; /* pts of the current frame */
+ int64_t dts; /* dts of the current frame */
+
+ /* private data */
+ int64_t last_pts;
+ int64_t last_dts;
+ int fetch_timestamp;
+
+#define AV_PARSER_PTS_NB 4
+ int cur_frame_start_index;
+ int64_t cur_frame_offset[AV_PARSER_PTS_NB];
+ int64_t cur_frame_pts[AV_PARSER_PTS_NB];
+ int64_t cur_frame_dts[AV_PARSER_PTS_NB];
+
+ int flags;
+#define PARSER_FLAG_COMPLETE_FRAMES 0x0001
+#define PARSER_FLAG_ONCE 0x0002
+/// Set if the parser has a valid file offset
+#define PARSER_FLAG_FETCHED_OFFSET 0x0004
+
+ int64_t offset; ///< byte offset from starting packet start
+ int64_t cur_frame_end[AV_PARSER_PTS_NB];
+
+ /**
+ * Set by parser to 1 for key frames and 0 for non-key frames.
+ * It is initialized to -1, so if the parser doesn't set this flag,
+ * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames
+ * will be used.
+ */
+ int key_frame;
+
+ /**
+ * Time difference in stream time base units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * independent from the availability of previous frames. That is, the
+ * frames are virtually identical no matter if decoding started from
+ * the very first frame or from this keyframe.
+ * Is AV_NOPTS_VALUE if unknown.
+ * This field is not the display duration of the current frame.
+ * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
+ * set.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
+
+ // Timestamp generation support:
+ /**
+ * Synchronization point for start of timestamp generation.
+ *
+ * Set to >0 for sync point, 0 for no sync point and <0 for undefined
+ * (default).
+ *
+ * For example, this corresponds to presence of H.264 buffering period
+ * SEI message.
+ */
+ int dts_sync_point;
+
+ /**
+ * Offset of the current timestamp against last timestamp sync point in
+ * units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain a valid timestamp offset.
+ *
+ * Note that the timestamp of sync point has usually a nonzero
+ * dts_ref_dts_delta, which refers to the previous sync point. Offset of
+ * the next frame after timestamp sync point will be usually 1.
+ *
+ * For example, this corresponds to H.264 cpb_removal_delay.
+ */
+ int dts_ref_dts_delta;
+
+ /**
+ * Presentation delay of current frame in units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain valid non-negative timestamp delta (presentation time of a frame
+ * must not lie in the past).
+ *
+ * This delay represents the difference between decoding and presentation
+ * time of the frame.
+ *
+ * For example, this corresponds to H.264 dpb_output_delay.
+ */
+ int pts_dts_delta;
+
+ /**
+ * Position of the packet in file.
+ *
+ * Analogous to cur_frame_pts/dts
+ */
+ int64_t cur_frame_pos[AV_PARSER_PTS_NB];
+
+ /**
+ * Byte position of currently parsed frame in stream.
+ */
+ int64_t pos;
+
+ /**
+ * Previous frame byte position.
+ */
+ int64_t last_pos;
+} AVCodecParserContext;
+
+typedef struct AVCodecParser {
+ int codec_ids[5]; /* several codec IDs are permitted */
+ int priv_data_size;
+ int (*parser_init)(AVCodecParserContext *s);
+ int (*parser_parse)(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ const uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size);
+ void (*parser_close)(AVCodecParserContext *s);
+ int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
+ struct AVCodecParser *next;
+} AVCodecParser;
+
+AVCodecParser *av_parser_next(AVCodecParser *c);
+
+void av_register_codec_parser(AVCodecParser *parser);
+AVCodecParserContext *av_parser_init(int codec_id);
+
+/**
+ * Parse a packet.
+ *
+ * @param s parser context.
+ * @param avctx codec context.
+ * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished.
+ * @param poutbuf_size set to size of parsed buffer or zero if not yet finished.
+ * @param buf input buffer.
+ * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output).
+ * @param pts input presentation timestamp.
+ * @param dts input decoding timestamp.
+ * @param pos input byte position in stream.
+ * @return the number of bytes of the input bitstream used.
+ *
+ * Example:
+ * @code
+ * while(in_len){
+ * len = av_parser_parse2(myparser, AVCodecContext, &data, &size,
+ * in_data, in_len,
+ * pts, dts, pos);
+ * in_data += len;
+ * in_len -= len;
+ *
+ * if(size)
+ * decode_frame(data, size);
+ * }
+ * @endcode
+ */
+int av_parser_parse2(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size,
+ int64_t pts, int64_t dts,
+ int64_t pos);
+
+int av_parser_change(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_parser_close(AVCodecParserContext *s);
+
+
+typedef struct AVBitStreamFilterContext {
+ void *priv_data;
+ struct AVBitStreamFilter *filter;
+ AVCodecParserContext *parser;
+ struct AVBitStreamFilterContext *next;
+} AVBitStreamFilterContext;
+
+
+typedef struct AVBitStreamFilter {
+ const char *name;
+ int priv_data_size;
+ int (*filter)(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+ void (*close)(AVBitStreamFilterContext *bsfc);
+ struct AVBitStreamFilter *next;
+} AVBitStreamFilter;
+
+void av_register_bitstream_filter(AVBitStreamFilter *bsf);
+AVBitStreamFilterContext *av_bitstream_filter_init(const char *name);
+int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_bitstream_filter_close(AVBitStreamFilterContext *bsf);
+
+AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f);
+
+/* memory */
+
+/**
+ * Reallocate the given block if it is not large enough, otherwise do nothing.
+ *
+ * @see av_realloc
+ */
+void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Allocate a buffer, reusing the given one if large enough.
+ *
+ * Contrary to av_fast_realloc the current buffer contents might not be
+ * preserved and on error the old buffer is freed, thus no special
+ * handling to avoid memleaks is necessary.
+ *
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+ * @param size size of the buffer *ptr points to
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+ * *size 0 if an error occurred.
+ */
+void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Copy image src to dst. Wraps av_picture_data_copy() above.
+ */
+void av_picture_copy(AVPicture *dst, const AVPicture *src,
+ enum PixelFormat pix_fmt, int width, int height);
+
+/**
+ * Crop image top and left side.
+ */
+int av_picture_crop(AVPicture *dst, const AVPicture *src,
+ enum PixelFormat pix_fmt, int top_band, int left_band);
+
+/**
+ * Pad image.
+ */
+int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum PixelFormat pix_fmt,
+ int padtop, int padbottom, int padleft, int padright, int *color);
+
+/**
+ * Encode extradata length to a buffer. Used by xiph codecs.
+ *
+ * @param s buffer to write to; must be at least (v/255+1) bytes long
+ * @param v size of extradata in bytes
+ * @return number of bytes written to the buffer.
+ */
+unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
+
+/**
+ * Log a generic warning message about a missing feature. This function is
+ * intended to be used internally by Libav (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] feature string containing the name of the missing feature
+ * @param[in] want_sample indicates if samples are wanted which exhibit this feature.
+ * If want_sample is non-zero, additional verbage will be added to the log
+ * message which tells the user how to report samples to the development
+ * mailing list.
+ */
+void av_log_missing_feature(void *avc, const char *feature, int want_sample);
+
+/**
+ * Log a generic warning message asking for a sample. This function is
+ * intended to be used internally by Libav (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] msg string containing an optional message, or NULL if no message
+ */
+void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3);
+
+/**
+ * Register the hardware accelerator hwaccel.
+ */
+void av_register_hwaccel(AVHWAccel *hwaccel);
+
+/**
+ * If hwaccel is NULL, returns the first registered hardware accelerator,
+ * if hwaccel is non-NULL, returns the next registered hardware accelerator
+ * after hwaccel, or NULL if hwaccel is the last one.
+ */
+AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel);
+
+
+/**
+ * Lock operation used by lockmgr
+ */
+enum AVLockOp {
+ AV_LOCK_CREATE, ///< Create a mutex
+ AV_LOCK_OBTAIN, ///< Lock the mutex
+ AV_LOCK_RELEASE, ///< Unlock the mutex
+ AV_LOCK_DESTROY, ///< Free mutex resources
+};
+
+/**
+ * Register a user provided lock manager supporting the operations
+ * specified by AVLockOp. mutex points to a (void *) where the
+ * lockmgr should store/get a pointer to a user allocated mutex. It's
+ * NULL upon AV_LOCK_CREATE and != NULL for all other ops.
+ *
+ * @param cb User defined callback. Note: Libav may invoke calls to this
+ * callback during the call to av_lockmgr_register().
+ * Thus, the application must be prepared to handle that.
+ * If cb is set to NULL the lockmgr will be unregistered.
+ * Also note that during unregistration the previously registered
+ * lockmgr callback may also be invoked.
+ */
+int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
+
+/**
+ * Get the type of the given codec.
+ */
+enum AVMediaType avcodec_get_type(enum CodecID codec_id);
+
+/**
+ * Get the AVClass for AVCodecContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_class(void);
+
+/**
+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+ * with no corresponding avcodec_close()), 0 otherwise.
+ */
+int avcodec_is_open(AVCodecContext *s);
+
+#endif /* AVCODEC_AVCODEC_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/avfft.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/avfft.h
new file mode 100644
index 000000000..91fe2f429
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/avfft.h
@@ -0,0 +1,99 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVFFT_H
+#define AVCODEC_AVFFT_H
+
+typedef float FFTSample;
+
+typedef struct FFTComplex {
+ FFTSample re, im;
+} FFTComplex;
+
+typedef struct FFTContext FFTContext;
+
+/**
+ * Set up a complex FFT.
+ * @param nbits log2 of the length of the input array
+ * @param inverse if 0 perform the forward transform, if 1 perform the inverse
+ */
+FFTContext *av_fft_init(int nbits, int inverse);
+
+/**
+ * Do the permutation needed BEFORE calling ff_fft_calc().
+ */
+void av_fft_permute(FFTContext *s, FFTComplex *z);
+
+/**
+ * Do a complex FFT with the parameters defined in av_fft_init(). The
+ * input data must be permuted before. No 1.0/sqrt(n) normalization is done.
+ */
+void av_fft_calc(FFTContext *s, FFTComplex *z);
+
+void av_fft_end(FFTContext *s);
+
+FFTContext *av_mdct_init(int nbits, int inverse, double scale);
+void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_end(FFTContext *s);
+
+/* Real Discrete Fourier Transform */
+
+enum RDFTransformType {
+ DFT_R2C,
+ IDFT_C2R,
+ IDFT_R2C,
+ DFT_C2R,
+};
+
+typedef struct RDFTContext RDFTContext;
+
+/**
+ * Set up a real FFT.
+ * @param nbits log2 of the length of the input array
+ * @param trans the type of transform
+ */
+RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
+void av_rdft_calc(RDFTContext *s, FFTSample *data);
+void av_rdft_end(RDFTContext *s);
+
+/* Discrete Cosine Transform */
+
+typedef struct DCTContext DCTContext;
+
+enum DCTTransformType {
+ DCT_II = 0,
+ DCT_III,
+ DCT_I,
+ DST_I,
+};
+
+/**
+ * Set up DCT.
+ * @param nbits size of the input array:
+ * (1 << nbits) for DCT-II, DCT-III and DST-I
+ * (1 << nbits) + 1 for DCT-I
+ *
+ * @note the first element of the input of DST-I is ignored
+ */
+DCTContext *av_dct_init(int nbits, enum DCTTransformType type);
+void av_dct_calc(DCTContext *s, FFTSample *data);
+void av_dct_end (DCTContext *s);
+
+#endif /* AVCODEC_AVFFT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/dxva2.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/dxva2.h
new file mode 100644
index 000000000..374ae039a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/dxva2.h
@@ -0,0 +1,71 @@
+/*
+ * DXVA2 HW acceleration
+ *
+ * copyright (c) 2009 Laurent Aimar
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_DXVA_H
+#define AVCODEC_DXVA_H
+
+#include <stdint.h>
+
+#include <d3d9.h>
+#include <dxva2api.h>
+
+#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
+
+/**
+ * This structure is used to provides the necessary configurations and data
+ * to the DXVA2 Libav HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct dxva_context {
+ /**
+ * DXVA2 decoder object
+ */
+ IDirectXVideoDecoder *decoder;
+
+ /**
+ * DXVA2 configuration used to create the decoder
+ */
+ const DXVA2_ConfigPictureDecode *cfg;
+
+ /**
+ * The number of surface in the surface array
+ */
+ unsigned surface_count;
+
+ /**
+ * The array of Direct3D surfaces used to create the decoder
+ */
+ LPDIRECT3DSURFACE9 *surface;
+
+ /**
+ * A bit field configuring the workarounds needed for using the decoder
+ */
+ uint64_t workaround;
+
+ /**
+ * Private to the Libav AVHWAccel implementation
+ */
+ unsigned report_id;
+};
+
+#endif /* AVCODEC_DXVA_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/old_codec_ids.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/old_codec_ids.h
new file mode 100644
index 000000000..ded4cc787
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/old_codec_ids.h
@@ -0,0 +1,398 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_OLD_CODEC_IDS_H
+#define AVCODEC_OLD_CODEC_IDS_H
+
+#include "libavutil/common.h"
+
+/*
+ * This header exists to prevent new codec IDs from being accidentally added to
+ * the deprecated list.
+ * Do not include it directly. It will be removed on next major bump
+ *
+ * Do not add new items to this list. Use the AVCodecID enum instead.
+ */
+
+ CODEC_ID_NONE = AV_CODEC_ID_NONE,
+
+ /* video codecs */
+ CODEC_ID_MPEG1VIDEO,
+ CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+ CODEC_ID_MPEG2VIDEO_XVMC,
+ CODEC_ID_H261,
+ CODEC_ID_H263,
+ CODEC_ID_RV10,
+ CODEC_ID_RV20,
+ CODEC_ID_MJPEG,
+ CODEC_ID_MJPEGB,
+ CODEC_ID_LJPEG,
+ CODEC_ID_SP5X,
+ CODEC_ID_JPEGLS,
+ CODEC_ID_MPEG4,
+ CODEC_ID_RAWVIDEO,
+ CODEC_ID_MSMPEG4V1,
+ CODEC_ID_MSMPEG4V2,
+ CODEC_ID_MSMPEG4V3,
+ CODEC_ID_WMV1,
+ CODEC_ID_WMV2,
+ CODEC_ID_H263P,
+ CODEC_ID_H263I,
+ CODEC_ID_FLV1,
+ CODEC_ID_SVQ1,
+ CODEC_ID_SVQ3,
+ CODEC_ID_DVVIDEO,
+ CODEC_ID_HUFFYUV,
+ CODEC_ID_CYUV,
+ CODEC_ID_H264,
+ CODEC_ID_INDEO3,
+ CODEC_ID_VP3,
+ CODEC_ID_THEORA,
+ CODEC_ID_ASV1,
+ CODEC_ID_ASV2,
+ CODEC_ID_FFV1,
+ CODEC_ID_4XM,
+ CODEC_ID_VCR1,
+ CODEC_ID_CLJR,
+ CODEC_ID_MDEC,
+ CODEC_ID_ROQ,
+ CODEC_ID_INTERPLAY_VIDEO,
+ CODEC_ID_XAN_WC3,
+ CODEC_ID_XAN_WC4,
+ CODEC_ID_RPZA,
+ CODEC_ID_CINEPAK,
+ CODEC_ID_WS_VQA,
+ CODEC_ID_MSRLE,
+ CODEC_ID_MSVIDEO1,
+ CODEC_ID_IDCIN,
+ CODEC_ID_8BPS,
+ CODEC_ID_SMC,
+ CODEC_ID_FLIC,
+ CODEC_ID_TRUEMOTION1,
+ CODEC_ID_VMDVIDEO,
+ CODEC_ID_MSZH,
+ CODEC_ID_ZLIB,
+ CODEC_ID_QTRLE,
+ CODEC_ID_SNOW,
+ CODEC_ID_TSCC,
+ CODEC_ID_ULTI,
+ CODEC_ID_QDRAW,
+ CODEC_ID_VIXL,
+ CODEC_ID_QPEG,
+ CODEC_ID_PNG,
+ CODEC_ID_PPM,
+ CODEC_ID_PBM,
+ CODEC_ID_PGM,
+ CODEC_ID_PGMYUV,
+ CODEC_ID_PAM,
+ CODEC_ID_FFVHUFF,
+ CODEC_ID_RV30,
+ CODEC_ID_RV40,
+ CODEC_ID_VC1,
+ CODEC_ID_WMV3,
+ CODEC_ID_LOCO,
+ CODEC_ID_WNV1,
+ CODEC_ID_AASC,
+ CODEC_ID_INDEO2,
+ CODEC_ID_FRAPS,
+ CODEC_ID_TRUEMOTION2,
+ CODEC_ID_BMP,
+ CODEC_ID_CSCD,
+ CODEC_ID_MMVIDEO,
+ CODEC_ID_ZMBV,
+ CODEC_ID_AVS,
+ CODEC_ID_SMACKVIDEO,
+ CODEC_ID_NUV,
+ CODEC_ID_KMVC,
+ CODEC_ID_FLASHSV,
+ CODEC_ID_CAVS,
+ CODEC_ID_JPEG2000,
+ CODEC_ID_VMNC,
+ CODEC_ID_VP5,
+ CODEC_ID_VP6,
+ CODEC_ID_VP6F,
+ CODEC_ID_TARGA,
+ CODEC_ID_DSICINVIDEO,
+ CODEC_ID_TIERTEXSEQVIDEO,
+ CODEC_ID_TIFF,
+ CODEC_ID_GIF,
+ CODEC_ID_DXA,
+ CODEC_ID_DNXHD,
+ CODEC_ID_THP,
+ CODEC_ID_SGI,
+ CODEC_ID_C93,
+ CODEC_ID_BETHSOFTVID,
+ CODEC_ID_PTX,
+ CODEC_ID_TXD,
+ CODEC_ID_VP6A,
+ CODEC_ID_AMV,
+ CODEC_ID_VB,
+ CODEC_ID_PCX,
+ CODEC_ID_SUNRAST,
+ CODEC_ID_INDEO4,
+ CODEC_ID_INDEO5,
+ CODEC_ID_MIMIC,
+ CODEC_ID_RL2,
+ CODEC_ID_ESCAPE124,
+ CODEC_ID_DIRAC,
+ CODEC_ID_BFI,
+ CODEC_ID_CMV,
+ CODEC_ID_MOTIONPIXELS,
+ CODEC_ID_TGV,
+ CODEC_ID_TGQ,
+ CODEC_ID_TQI,
+ CODEC_ID_AURA,
+ CODEC_ID_AURA2,
+ CODEC_ID_V210X,
+ CODEC_ID_TMV,
+ CODEC_ID_V210,
+ CODEC_ID_DPX,
+ CODEC_ID_MAD,
+ CODEC_ID_FRWU,
+ CODEC_ID_FLASHSV2,
+ CODEC_ID_CDGRAPHICS,
+ CODEC_ID_R210,
+ CODEC_ID_ANM,
+ CODEC_ID_BINKVIDEO,
+ CODEC_ID_IFF_ILBM,
+ CODEC_ID_IFF_BYTERUN1,
+ CODEC_ID_KGV1,
+ CODEC_ID_YOP,
+ CODEC_ID_VP8,
+ CODEC_ID_PICTOR,
+ CODEC_ID_ANSI,
+ CODEC_ID_A64_MULTI,
+ CODEC_ID_A64_MULTI5,
+ CODEC_ID_R10K,
+ CODEC_ID_MXPEG,
+ CODEC_ID_LAGARITH,
+ CODEC_ID_PRORES,
+ CODEC_ID_JV,
+ CODEC_ID_DFA,
+ CODEC_ID_WMV3IMAGE,
+ CODEC_ID_VC1IMAGE,
+ CODEC_ID_UTVIDEO,
+ CODEC_ID_BMV_VIDEO,
+ CODEC_ID_VBLE,
+ CODEC_ID_DXTORY,
+ CODEC_ID_V410,
+ CODEC_ID_XWD,
+ CODEC_ID_CDXL,
+ CODEC_ID_XBM,
+ CODEC_ID_ZEROCODEC,
+ CODEC_ID_MSS1,
+ CODEC_ID_MSA1,
+ CODEC_ID_TSCC2,
+ CODEC_ID_MTS2,
+ CODEC_ID_CLLC,
+ CODEC_ID_Y41P = MKBETAG('Y','4','1','P'),
+ CODEC_ID_ESCAPE130 = MKBETAG('E','1','3','0'),
+ CODEC_ID_EXR = MKBETAG('0','E','X','R'),
+ CODEC_ID_AVRP = MKBETAG('A','V','R','P'),
+
+ CODEC_ID_G2M = MKBETAG( 0 ,'G','2','M'),
+ CODEC_ID_AVUI = MKBETAG('A','V','U','I'),
+ CODEC_ID_AYUV = MKBETAG('A','Y','U','V'),
+ CODEC_ID_V308 = MKBETAG('V','3','0','8'),
+ CODEC_ID_V408 = MKBETAG('V','4','0','8'),
+ CODEC_ID_YUV4 = MKBETAG('Y','U','V','4'),
+ CODEC_ID_SANM = MKBETAG('S','A','N','M'),
+ CODEC_ID_PAF_VIDEO = MKBETAG('P','A','F','V'),
+
+ /* various PCM "codecs" */
+ CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ CODEC_ID_PCM_S16LE = 0x10000,
+ CODEC_ID_PCM_S16BE,
+ CODEC_ID_PCM_U16LE,
+ CODEC_ID_PCM_U16BE,
+ CODEC_ID_PCM_S8,
+ CODEC_ID_PCM_U8,
+ CODEC_ID_PCM_MULAW,
+ CODEC_ID_PCM_ALAW,
+ CODEC_ID_PCM_S32LE,
+ CODEC_ID_PCM_S32BE,
+ CODEC_ID_PCM_U32LE,
+ CODEC_ID_PCM_U32BE,
+ CODEC_ID_PCM_S24LE,
+ CODEC_ID_PCM_S24BE,
+ CODEC_ID_PCM_U24LE,
+ CODEC_ID_PCM_U24BE,
+ CODEC_ID_PCM_S24DAUD,
+ CODEC_ID_PCM_ZORK,
+ CODEC_ID_PCM_S16LE_PLANAR,
+ CODEC_ID_PCM_DVD,
+ CODEC_ID_PCM_F32BE,
+ CODEC_ID_PCM_F32LE,
+ CODEC_ID_PCM_F64BE,
+ CODEC_ID_PCM_F64LE,
+ CODEC_ID_PCM_BLURAY,
+ CODEC_ID_PCM_LXF,
+ CODEC_ID_S302M,
+ CODEC_ID_PCM_S8_PLANAR,
+
+ /* various ADPCM codecs */
+ CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ CODEC_ID_ADPCM_IMA_WAV,
+ CODEC_ID_ADPCM_IMA_DK3,
+ CODEC_ID_ADPCM_IMA_DK4,
+ CODEC_ID_ADPCM_IMA_WS,
+ CODEC_ID_ADPCM_IMA_SMJPEG,
+ CODEC_ID_ADPCM_MS,
+ CODEC_ID_ADPCM_4XM,
+ CODEC_ID_ADPCM_XA,
+ CODEC_ID_ADPCM_ADX,
+ CODEC_ID_ADPCM_EA,
+ CODEC_ID_ADPCM_G726,
+ CODEC_ID_ADPCM_CT,
+ CODEC_ID_ADPCM_SWF,
+ CODEC_ID_ADPCM_YAMAHA,
+ CODEC_ID_ADPCM_SBPRO_4,
+ CODEC_ID_ADPCM_SBPRO_3,
+ CODEC_ID_ADPCM_SBPRO_2,
+ CODEC_ID_ADPCM_THP,
+ CODEC_ID_ADPCM_IMA_AMV,
+ CODEC_ID_ADPCM_EA_R1,
+ CODEC_ID_ADPCM_EA_R3,
+ CODEC_ID_ADPCM_EA_R2,
+ CODEC_ID_ADPCM_IMA_EA_SEAD,
+ CODEC_ID_ADPCM_IMA_EA_EACS,
+ CODEC_ID_ADPCM_EA_XAS,
+ CODEC_ID_ADPCM_EA_MAXIS_XA,
+ CODEC_ID_ADPCM_IMA_ISS,
+ CODEC_ID_ADPCM_G722,
+ CODEC_ID_ADPCM_IMA_APC,
+ CODEC_ID_VIMA = MKBETAG('V','I','M','A'),
+
+ /* AMR */
+ CODEC_ID_AMR_NB = 0x12000,
+ CODEC_ID_AMR_WB,
+
+ /* RealAudio codecs*/
+ CODEC_ID_RA_144 = 0x13000,
+ CODEC_ID_RA_288,
+
+ /* various DPCM codecs */
+ CODEC_ID_ROQ_DPCM = 0x14000,
+ CODEC_ID_INTERPLAY_DPCM,
+ CODEC_ID_XAN_DPCM,
+ CODEC_ID_SOL_DPCM,
+
+ /* audio codecs */
+ CODEC_ID_MP2 = 0x15000,
+ CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+ CODEC_ID_AAC,
+ CODEC_ID_AC3,
+ CODEC_ID_DTS,
+ CODEC_ID_VORBIS,
+ CODEC_ID_DVAUDIO,
+ CODEC_ID_WMAV1,
+ CODEC_ID_WMAV2,
+ CODEC_ID_MACE3,
+ CODEC_ID_MACE6,
+ CODEC_ID_VMDAUDIO,
+ CODEC_ID_FLAC,
+ CODEC_ID_MP3ADU,
+ CODEC_ID_MP3ON4,
+ CODEC_ID_SHORTEN,
+ CODEC_ID_ALAC,
+ CODEC_ID_WESTWOOD_SND1,
+ CODEC_ID_GSM, ///< as in Berlin toast format
+ CODEC_ID_QDM2,
+ CODEC_ID_COOK,
+ CODEC_ID_TRUESPEECH,
+ CODEC_ID_TTA,
+ CODEC_ID_SMACKAUDIO,
+ CODEC_ID_QCELP,
+ CODEC_ID_WAVPACK,
+ CODEC_ID_DSICINAUDIO,
+ CODEC_ID_IMC,
+ CODEC_ID_MUSEPACK7,
+ CODEC_ID_MLP,
+ CODEC_ID_GSM_MS, /* as found in WAV */
+ CODEC_ID_ATRAC3,
+ CODEC_ID_VOXWARE,
+ CODEC_ID_APE,
+ CODEC_ID_NELLYMOSER,
+ CODEC_ID_MUSEPACK8,
+ CODEC_ID_SPEEX,
+ CODEC_ID_WMAVOICE,
+ CODEC_ID_WMAPRO,
+ CODEC_ID_WMALOSSLESS,
+ CODEC_ID_ATRAC3P,
+ CODEC_ID_EAC3,
+ CODEC_ID_SIPR,
+ CODEC_ID_MP1,
+ CODEC_ID_TWINVQ,
+ CODEC_ID_TRUEHD,
+ CODEC_ID_MP4ALS,
+ CODEC_ID_ATRAC1,
+ CODEC_ID_BINKAUDIO_RDFT,
+ CODEC_ID_BINKAUDIO_DCT,
+ CODEC_ID_AAC_LATM,
+ CODEC_ID_QDMC,
+ CODEC_ID_CELT,
+ CODEC_ID_G723_1,
+ CODEC_ID_G729,
+ CODEC_ID_8SVX_EXP,
+ CODEC_ID_8SVX_FIB,
+ CODEC_ID_BMV_AUDIO,
+ CODEC_ID_RALF,
+ CODEC_ID_IAC,
+ CODEC_ID_ILBC,
+ CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'),
+ CODEC_ID_8SVX_RAW = MKBETAG('8','S','V','X'),
+ CODEC_ID_SONIC = MKBETAG('S','O','N','C'),
+ CODEC_ID_SONIC_LS = MKBETAG('S','O','N','L'),
+ CODEC_ID_PAF_AUDIO = MKBETAG('P','A','F','A'),
+ CODEC_ID_OPUS = MKBETAG('O','P','U','S'),
+
+ /* subtitle codecs */
+ CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+ CODEC_ID_DVD_SUBTITLE = 0x17000,
+ CODEC_ID_DVB_SUBTITLE,
+ CODEC_ID_TEXT, ///< raw UTF-8 text
+ CODEC_ID_XSUB,
+ CODEC_ID_SSA,
+ CODEC_ID_MOV_TEXT,
+ CODEC_ID_HDMV_PGS_SUBTITLE,
+ CODEC_ID_DVB_TELETEXT,
+ CODEC_ID_SRT,
+ CODEC_ID_MICRODVD = MKBETAG('m','D','V','D'),
+ CODEC_ID_EIA_608 = MKBETAG('c','6','0','8'),
+ CODEC_ID_JACOSUB = MKBETAG('J','S','U','B'),
+ CODEC_ID_SAMI = MKBETAG('S','A','M','I'),
+ CODEC_ID_REALTEXT = MKBETAG('R','T','X','T'),
+ CODEC_ID_SUBVIEWER = MKBETAG('S','u','b','V'),
+
+ /* other specific kind of codecs (generally used for attachments) */
+ CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
+ CODEC_ID_TTF = 0x18000,
+ CODEC_ID_BINTEXT = MKBETAG('B','T','X','T'),
+ CODEC_ID_XBIN = MKBETAG('X','B','I','N'),
+ CODEC_ID_IDF = MKBETAG( 0 ,'I','D','F'),
+ CODEC_ID_OTF = MKBETAG( 0 ,'O','T','F'),
+
+ CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it
+
+ CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+ * stream (only used by libavformat) */
+ CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+ * stream (only used by libavformat) */
+ CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
+
+#endif /* AVCODEC_OLD_CODEC_IDS_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/opt.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/opt.h
new file mode 100644
index 000000000..2380e7433
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/opt.h
@@ -0,0 +1,34 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * This header is provided for compatibility only and will be removed
+ * on next major bump
+ */
+
+#ifndef AVCODEC_OPT_H
+#define AVCODEC_OPT_H
+
+#include "libavcodec/version.h"
+
+#if FF_API_OPT_H
+#include "libavutil/opt.h"
+#endif
+
+#endif /* AVCODEC_OPT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vaapi.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vaapi.h
new file mode 100644
index 000000000..36fb386ac
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vaapi.h
@@ -0,0 +1,167 @@
+/*
+ * Video Acceleration API (shared data between Libav and the video player)
+ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
+ *
+ * Copyright (C) 2008-2009 Splitted-Desktop Systems
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VAAPI_H
+#define AVCODEC_VAAPI_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup VAAPI_Decoding VA API Decoding
+ * @ingroup Decoder
+ * @{
+ */
+
+/**
+ * This structure is used to share data between the Libav library and
+ * the client video application.
+ * This shall be zero-allocated and available as
+ * AVCodecContext.hwaccel_context. All user members can be set once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ */
+struct vaapi_context {
+ /**
+ * Window system dependent data
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *display;
+
+ /**
+ * Configuration ID
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t config_id;
+
+ /**
+ * Context ID (video decode pipeline)
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t context_id;
+
+ /**
+ * VAPictureParameterBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t pic_param_buf_id;
+
+ /**
+ * VAIQMatrixBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t iq_matrix_buf_id;
+
+ /**
+ * VABitPlaneBuffer ID (for VC-1 decoding)
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t bitplane_buf_id;
+
+ /**
+ * Slice parameter/data buffer IDs
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t *slice_buf_ids;
+
+ /**
+ * Number of effective slice buffer IDs to send to the HW
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int n_slice_buf_ids;
+
+ /**
+ * Size of pre-allocated slice_buf_ids
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_buf_ids_alloc;
+
+ /**
+ * Pointer to VASliceParameterBuffers
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ void *slice_params;
+
+ /**
+ * Size of a VASliceParameterBuffer element
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_param_size;
+
+ /**
+ * Size of pre-allocated slice_params
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_params_alloc;
+
+ /**
+ * Number of slices currently filled in
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_count;
+
+ /**
+ * Pointer to slice data buffer base
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ const uint8_t *slice_data;
+
+ /**
+ * Current size of slice data
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t slice_data_size;
+};
+
+/* @} */
+
+#endif /* AVCODEC_VAAPI_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vda.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vda.h
new file mode 100644
index 000000000..2cb51c5f5
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vda.h
@@ -0,0 +1,144 @@
+/*
+ * VDA HW acceleration
+ *
+ * copyright (c) 2011 Sebastien Zwickert
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDA_H
+#define AVCODEC_VDA_H
+
+#include <pthread.h>
+#include <stdint.h>
+
+// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
+// http://openradar.appspot.com/8026390
+#undef __GNUC_STDC_INLINE__
+
+#define Picture QuickdrawPicture
+#include <VideoDecodeAcceleration/VDADecoder.h>
+#undef Picture
+
+/**
+ * This structure is used to store a decoded frame information and data.
+ */
+typedef struct vda_frame {
+ /**
+ * The PTS of the frame.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ int64_t pts;
+
+ /**
+ * The CoreVideo buffer that contains the decoded data.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ CVPixelBufferRef cv_buffer;
+
+ /**
+ * A pointer to the next frame.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ struct vda_frame *next_frame;
+} vda_frame;
+
+/**
+ * This structure is used to provide the necessary configurations and data
+ * to the VDA Libav HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct vda_context {
+ /**
+ * VDA decoder object.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ VDADecoder decoder;
+
+ /**
+ * VDA frames queue ordered by presentation timestamp.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ vda_frame *queue;
+
+ /**
+ * Mutex for locking queue operations.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ pthread_mutex_t queue_mutex;
+
+ /**
+ * The frame width.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int width;
+
+ /**
+ * The frame height.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int height;
+
+ /**
+ * The frame format.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int format;
+
+ /**
+ * The pixel format for output image buffers.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ OSType cv_pix_fmt_type;
+};
+
+/** Create the video decoder. */
+int ff_vda_create_decoder(struct vda_context *vda_ctx,
+ uint8_t *extradata,
+ int extradata_size);
+
+/** Destroy the video decoder. */
+int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
+
+/** Return the top frame of the queue. */
+vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx);
+
+/** Release the given frame. */
+void ff_vda_release_vda_frame(vda_frame *frame);
+
+#endif /* AVCODEC_VDA_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vdpau.h
new file mode 100644
index 000000000..6f1386067
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/vdpau.h
@@ -0,0 +1,88 @@
+/*
+ * The Video Decode and Presentation API for UNIX (VDPAU) is used for
+ * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.
+ *
+ * Copyright (C) 2008 NVIDIA
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDPAU_H
+#define AVCODEC_VDPAU_H
+
+/**
+ * @defgroup Decoder VDPAU Decoder and Renderer
+ *
+ * VDPAU hardware acceleration has two modules
+ * - VDPAU decoding
+ * - VDPAU presentation
+ *
+ * The VDPAU decoding module parses all headers using Libav
+ * parsing mechanisms and uses VDPAU for the actual decoding.
+ *
+ * As per the current implementation, the actual decoding
+ * and rendering (API calls) are done as part of the VDPAU
+ * presentation (vo_vdpau.c) module.
+ *
+ * @defgroup VDPAU_Decoding VDPAU Decoding
+ * @ingroup Decoder
+ * @{
+ */
+
+#include <vdpau/vdpau.h>
+#include <vdpau/vdpau_x11.h>
+
+/** @brief The videoSurface is used for rendering. */
+#define FF_VDPAU_STATE_USED_FOR_RENDER 1
+
+/**
+ * @brief The videoSurface is needed for reference/prediction.
+ * The codec manipulates this.
+ */
+#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2
+
+/**
+ * @brief This structure is used as a callback between the Libav
+ * decoder (vd_) and presentation (vo_) module.
+ * This is used for defining a video frame containing surface,
+ * picture parameter, bitstream information etc which are passed
+ * between the Libav decoder and its clients.
+ */
+struct vdpau_render_state {
+ VdpVideoSurface surface; ///< Used as rendered surface, never changed.
+
+ int state; ///< Holds FF_VDPAU_STATE_* values.
+
+ /** picture parameter information for all supported codecs */
+ union VdpPictureInfo {
+ VdpPictureInfoH264 h264;
+ VdpPictureInfoMPEG1Or2 mpeg;
+ VdpPictureInfoVC1 vc1;
+ VdpPictureInfoMPEG4Part2 mpeg4;
+ } info;
+
+ /** Describe size/location of the compressed video data.
+ Set to 0 when freeing bitstream_buffers. */
+ int bitstream_buffers_allocated;
+ int bitstream_buffers_used;
+ /** The user is responsible for freeing this buffer using av_freep(). */
+ VdpBitstreamBuffer *bitstream_buffers;
+};
+
+/* @}*/
+
+#endif /* AVCODEC_VDPAU_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/version.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/version.h
new file mode 100644
index 000000000..77e16823f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/version.h
@@ -0,0 +1,126 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VERSION_H
+#define AVCODEC_VERSION_H
+
+#define LIBAVCODEC_VERSION_MAJOR 53
+#define LIBAVCODEC_VERSION_MINOR 35
+#define LIBAVCODEC_VERSION_MICRO 0
+
+#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
+
+#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
+
+/**
+ * Those FF_API_* defines are not part of public API.
+ * They may change, break or disappear at any time.
+ */
+#ifndef FF_API_PALETTE_CONTROL
+#define FF_API_PALETTE_CONTROL (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_SAMPLE_FMT
+#define FF_API_OLD_SAMPLE_FMT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_AUDIOCONVERT
+#define FF_API_OLD_AUDIOCONVERT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_ANTIALIAS_ALGO
+#define FF_API_ANTIALIAS_ALGO (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_REQUEST_CHANNELS
+#define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OPT_H
+#define FF_API_OPT_H (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_THREAD_INIT
+#define FF_API_THREAD_INIT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_FF_PICT_TYPES
+#define FF_API_OLD_FF_PICT_TYPES (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_FLAC_GLOBAL_OPTS
+#define FF_API_FLAC_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_GET_PIX_FMT_NAME
+#define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_ALLOC_CONTEXT
+#define FF_API_ALLOC_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AVCODEC_OPEN
+#define FF_API_AVCODEC_OPEN (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_DRC_SCALE
+#define FF_API_DRC_SCALE (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_ER
+#define FF_API_ER (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AVCODEC_INIT
+#define FF_API_AVCODEC_INIT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_X264_GLOBAL_OPTS
+#define FF_API_X264_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_MPEGVIDEO_GLOBAL_OPTS
+#define FF_API_MPEGVIDEO_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_LAME_GLOBAL_OPTS
+#define FF_API_LAME_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_SNOW_GLOBAL_OPTS
+#define FF_API_SNOW_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_MJPEG_GLOBAL_OPTS
+#define FF_API_MJPEG_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_GET_ALPHA_INFO
+#define FF_API_GET_ALPHA_INFO (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_PARSE_FRAME
+#define FF_API_PARSE_FRAME (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_INTERNAL_CONTEXT
+#define FF_API_INTERNAL_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_TIFFENC_COMPLEVEL
+#define FF_API_TIFFENC_COMPLEVEL (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_DATA_POINTERS
+#define FF_API_DATA_POINTERS (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_DECODE_AUDIO
+#define FF_API_OLD_DECODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AVFRAME_AGE
+#define FF_API_AVFRAME_AGE (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_OLD_ENCODE_AUDIO
+#define FF_API_OLD_ENCODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 54)
+#endif
+
+#endif /* AVCODEC_VERSION_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavcodec/xvmc.h b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/xvmc.h
new file mode 100644
index 000000000..1239015fc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavcodec/xvmc.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2003 Ivan Kalvachev
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_XVMC_H
+#define AVCODEC_XVMC_H
+
+#include <X11/extensions/XvMC.h>
+
+#include "avcodec.h"
+
+#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct
+ the number is 1337 speak for the letters IDCT MCo (motion compensation) */
+
+struct xvmc_pix_fmt {
+ /** The field contains the special constant value AV_XVMC_ID.
+ It is used as a test that the application correctly uses the API,
+ and that there is no corruption caused by pixel routines.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int xvmc_id;
+
+ /** Pointer to the block array allocated by XvMCCreateBlocks().
+ The array has to be freed by XvMCDestroyBlocks().
+ Each group of 64 values represents one data block of differential
+ pixel information (in MoCo mode) or coefficients for IDCT.
+ - application - set the pointer during initialization
+ - libavcodec - fills coefficients/pixel data into the array
+ */
+ short* data_blocks;
+
+ /** Pointer to the macroblock description array allocated by
+ XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks().
+ - application - set the pointer during initialization
+ - libavcodec - fills description data into the array
+ */
+ XvMCMacroBlock* mv_blocks;
+
+ /** Number of macroblock descriptions that can be stored in the mv_blocks
+ array.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int allocated_mv_blocks;
+
+ /** Number of blocks that can be stored at once in the data_blocks array.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int allocated_data_blocks;
+
+ /** Indicate that the hardware would interpret data_blocks as IDCT
+ coefficients and perform IDCT on them.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int idct;
+
+ /** In MoCo mode it indicates that intra macroblocks are assumed to be in
+ unsigned format; same as the XVMC_INTRA_UNSIGNED flag.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int unsigned_intra;
+
+ /** Pointer to the surface allocated by XvMCCreateSurface().
+ It has to be freed by XvMCDestroySurface() on application exit.
+ It identifies the frame and its state on the video hardware.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ XvMCSurface* p_surface;
+
+/** Set by the decoder before calling ff_draw_horiz_band(),
+ needed by the XvMCRenderSurface function. */
+//@{
+ /** Pointer to the surface used as past reference
+ - application - unchanged
+ - libavcodec - set
+ */
+ XvMCSurface* p_past_surface;
+
+ /** Pointer to the surface used as future reference
+ - application - unchanged
+ - libavcodec - set
+ */
+ XvMCSurface* p_future_surface;
+
+ /** top/bottom field or frame
+ - application - unchanged
+ - libavcodec - set
+ */
+ unsigned int picture_structure;
+
+ /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence
+ - application - unchanged
+ - libavcodec - set
+ */
+ unsigned int flags;
+//}@
+
+ /** Number of macroblock descriptions in the mv_blocks array
+ that have already been passed to the hardware.
+ - application - zeroes it on get_buffer().
+ A successful ff_draw_horiz_band() may increment it
+ with filled_mb_block_num or zero both.
+ - libavcodec - unchanged
+ */
+ int start_mv_blocks_num;
+
+ /** Number of new macroblock descriptions in the mv_blocks array (after
+ start_mv_blocks_num) that are filled by libavcodec and have to be
+ passed to the hardware.
+ - application - zeroes it on get_buffer() or after successful
+ ff_draw_horiz_band().
+ - libavcodec - increment with one of each stored MB
+ */
+ int filled_mv_blocks_num;
+
+ /** Number of the the next free data block; one data block consists of
+ 64 short values in the data_blocks array.
+ All blocks before this one have already been claimed by placing their
+ position into the corresponding block description structure field,
+ that are part of the mv_blocks array.
+ - application - zeroes it on get_buffer().
+ A successful ff_draw_horiz_band() may zero it together
+ with start_mb_blocks_num.
+ - libavcodec - each decoded macroblock increases it by the number
+ of coded blocks it contains.
+ */
+ int next_free_data_block_num;
+};
+
+#endif /* AVCODEC_XVMC_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/adler32.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/adler32.h
new file mode 100644
index 000000000..a8ff6f9d4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/adler32.h
@@ -0,0 +1,43 @@
+/*
+ * copyright (c) 2006 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_ADLER32_H
+#define AVUTIL_ADLER32_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+/**
+ * @ingroup lavu_crypto
+ * Calculate the Adler32 checksum of a buffer.
+ *
+ * Passing the return value to a subsequent av_adler32_update() call
+ * allows the checksum of multiple buffers to be calculated as though
+ * they were concatenated.
+ *
+ * @param adler initial checksum value
+ * @param buf pointer to input buffer
+ * @param len size of input buffer
+ * @return updated checksum
+ */
+unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf,
+ unsigned int len) av_pure;
+
+#endif /* AVUTIL_ADLER32_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/aes.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/aes.h
new file mode 100644
index 000000000..cf7b46209
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/aes.h
@@ -0,0 +1,57 @@
+/*
+ * copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AES_H
+#define AVUTIL_AES_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_aes AES
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+extern const int av_aes_size;
+
+struct AVAES;
+
+/**
+ * Initialize an AVAES context.
+ * @param key_bits 128, 192 or 256
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ * @param count number of 16 byte blocks
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param iv initialization vector for CBC mode, if NULL then ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AES_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/attributes.h
new file mode 100644
index 000000000..ef990a1d4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/attributes.h
@@ -0,0 +1,136 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Macro definitions for various function/variable attributes
+ */
+
+#ifndef AVUTIL_ATTRIBUTES_H
+#define AVUTIL_ATTRIBUTES_H
+
+#ifdef __GNUC__
+# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y)
+#else
+# define AV_GCC_VERSION_AT_LEAST(x,y) 0
+#endif
+
+#ifndef av_always_inline
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_always_inline __attribute__((always_inline)) inline
+#else
+# define av_always_inline inline
+#endif
+#endif
+
+#ifndef av_noinline
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_noinline __attribute__((noinline))
+#else
+# define av_noinline
+#endif
+#endif
+
+#ifndef av_pure
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_pure __attribute__((pure))
+#else
+# define av_pure
+#endif
+#endif
+
+#ifndef av_const
+#if AV_GCC_VERSION_AT_LEAST(2,6)
+# define av_const __attribute__((const))
+#else
+# define av_const
+#endif
+#endif
+
+#ifndef av_cold
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+# define av_cold __attribute__((cold))
+#else
+# define av_cold
+#endif
+#endif
+
+#ifndef av_flatten
+#if AV_GCC_VERSION_AT_LEAST(4,1)
+# define av_flatten __attribute__((flatten))
+#else
+# define av_flatten
+#endif
+#endif
+
+#ifndef attribute_deprecated
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define attribute_deprecated __attribute__((deprecated))
+#else
+# define attribute_deprecated
+#endif
+#endif
+
+#ifndef av_unused
+#if defined(__GNUC__)
+# define av_unused __attribute__((unused))
+#else
+# define av_unused
+#endif
+#endif
+
+/**
+ * Mark a variable as used and prevent the compiler from optimizing it
+ * away. This is useful for variables accessed only from inline
+ * assembler without the compiler being aware.
+ */
+#ifndef av_used
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_used __attribute__((used))
+#else
+# define av_used
+#endif
+#endif
+
+#ifndef av_alias
+#if AV_GCC_VERSION_AT_LEAST(3,3)
+# define av_alias __attribute__((may_alias))
+#else
+# define av_alias
+#endif
+#endif
+
+#ifndef av_uninit
+#if defined(__GNUC__) && !defined(__ICC)
+# define av_uninit(x) x=x
+#else
+# define av_uninit(x) x
+#endif
+#endif
+
+#ifdef __GNUC__
+# define av_builtin_constant_p __builtin_constant_p
+# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))
+#else
+# define av_builtin_constant_p(x) 0
+# define av_printf_format(fmtpos, attrpos)
+#endif
+
+#endif /* AVUTIL_ATTRIBUTES_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/audio_fifo.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/audio_fifo.h
new file mode 100644
index 000000000..8c7638825
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/audio_fifo.h
@@ -0,0 +1,146 @@
+/*
+ * Audio FIFO
+ * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Audio FIFO Buffer
+ */
+
+#ifndef AVUTIL_AUDIO_FIFO_H
+#define AVUTIL_AUDIO_FIFO_H
+
+#include "avutil.h"
+#include "fifo.h"
+#include "samplefmt.h"
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * Context for an Audio FIFO Buffer.
+ *
+ * - Operates at the sample level rather than the byte level.
+ * - Supports multiple channels with either planar or packed sample format.
+ * - Automatic reallocation when writing to a full buffer.
+ */
+typedef struct AVAudioFifo AVAudioFifo;
+
+/**
+ * Free an AVAudioFifo.
+ *
+ * @param af AVAudioFifo to free
+ */
+void av_audio_fifo_free(AVAudioFifo *af);
+
+/**
+ * Allocate an AVAudioFifo.
+ *
+ * @param sample_fmt sample format
+ * @param channels number of channels
+ * @param nb_samples initial allocation size, in samples
+ * @return newly allocated AVAudioFifo, or NULL on error
+ */
+AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels,
+ int nb_samples);
+
+/**
+ * Reallocate an AVAudioFifo.
+ *
+ * @param af AVAudioFifo to reallocate
+ * @param nb_samples new allocation size, in samples
+ * @return 0 if OK, or negative AVERROR code on failure
+ */
+int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples);
+
+/**
+ * Write data to an AVAudioFifo.
+ *
+ * The AVAudioFifo will be reallocated automatically if the available space
+ * is less than nb_samples.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param af AVAudioFifo to write to
+ * @param data audio data plane pointers
+ * @param nb_samples number of samples to write
+ * @return number of samples actually written, or negative AVERROR
+ * code on failure.
+ */
+int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples);
+
+/**
+ * Read data from an AVAudioFifo.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param af AVAudioFifo to read from
+ * @param data audio data plane pointers
+ * @param nb_samples number of samples to read
+ * @return number of samples actually read, or negative AVERROR code
+ * on failure.
+ */
+int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples);
+
+/**
+ * Drain data from an AVAudioFifo.
+ *
+ * Removes the data without reading it.
+ *
+ * @param af AVAudioFifo to drain
+ * @param nb_samples number of samples to drain
+ * @return 0 if OK, or negative AVERROR code on failure
+ */
+int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples);
+
+/**
+ * Reset the AVAudioFifo buffer.
+ *
+ * This empties all data in the buffer.
+ *
+ * @param af AVAudioFifo to reset
+ */
+void av_audio_fifo_reset(AVAudioFifo *af);
+
+/**
+ * Get the current number of samples in the AVAudioFifo available for reading.
+ *
+ * @param af the AVAudioFifo to query
+ * @return number of samples available for reading
+ */
+int av_audio_fifo_size(AVAudioFifo *af);
+
+/**
+ * Get the current number of samples in the AVAudioFifo available for writing.
+ *
+ * @param af the AVAudioFifo to query
+ * @return number of samples available for writing
+ */
+int av_audio_fifo_space(AVAudioFifo *af);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AUDIO_FIFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/audioconvert.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/audioconvert.h
new file mode 100644
index 000000000..00ed0ff7b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/audioconvert.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ * Copyright (c) 2008 Peter Ross
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AUDIOCONVERT_H
+#define AVUTIL_AUDIOCONVERT_H
+
+#include <stdint.h>
+
+/**
+ * @file
+ * audio conversion routines
+ */
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * @defgroup channel_masks Audio channel masks
+ * @{
+ */
+#define AV_CH_FRONT_LEFT 0x00000001
+#define AV_CH_FRONT_RIGHT 0x00000002
+#define AV_CH_FRONT_CENTER 0x00000004
+#define AV_CH_LOW_FREQUENCY 0x00000008
+#define AV_CH_BACK_LEFT 0x00000010
+#define AV_CH_BACK_RIGHT 0x00000020
+#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040
+#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080
+#define AV_CH_BACK_CENTER 0x00000100
+#define AV_CH_SIDE_LEFT 0x00000200
+#define AV_CH_SIDE_RIGHT 0x00000400
+#define AV_CH_TOP_CENTER 0x00000800
+#define AV_CH_TOP_FRONT_LEFT 0x00001000
+#define AV_CH_TOP_FRONT_CENTER 0x00002000
+#define AV_CH_TOP_FRONT_RIGHT 0x00004000
+#define AV_CH_TOP_BACK_LEFT 0x00008000
+#define AV_CH_TOP_BACK_CENTER 0x00010000
+#define AV_CH_TOP_BACK_RIGHT 0x00020000
+#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix.
+#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT.
+#define AV_CH_WIDE_LEFT 0x0000000080000000ULL
+#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL
+#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL
+#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL
+
+/** Channel mask value used for AVCodecContext.request_channel_layout
+ to indicate that the user requests the channel order of the decoder output
+ to be the native codec channel order. */
+#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL
+
+/**
+ * @}
+ * @defgroup channel_mask_c Audio channel convenience macros
+ * @{
+ * */
+#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
+#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
+
+/**
+ * @}
+ */
+
+/**
+ * Return a channel layout id that matches name, 0 if no match.
+ */
+uint64_t av_get_channel_layout(const char *name);
+
+/**
+ * Return a description of a channel layout.
+ * If nb_channels is <= 0, it is guessed from the channel_layout.
+ *
+ * @param buf put here the string containing the channel layout
+ * @param buf_size size in bytes of the buffer
+ */
+void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
+
+/**
+ * Return the number of channels in the channel layout.
+ */
+int av_get_channel_layout_nb_channels(uint64_t channel_layout);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AUDIOCONVERT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/avassert.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avassert.h
new file mode 100644
index 000000000..b223d26e8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avassert.h
@@ -0,0 +1,66 @@
+/*
+ * copyright (c) 2010 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * simple assert() macros that are a bit more flexible than ISO C assert().
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_AVASSERT_H
+#define AVUTIL_AVASSERT_H
+
+#include <stdlib.h>
+#include "avutil.h"
+#include "log.h"
+
+/**
+ * assert() equivalent, that is always enabled.
+ */
+#define av_assert0(cond) do { \
+ if (!(cond)) { \
+ av_log(NULL, AV_LOG_FATAL, "Assertion %s failed at %s:%d\n", \
+ AV_STRINGIFY(cond), __FILE__, __LINE__); \
+ abort(); \
+ } \
+} while (0)
+
+
+/**
+ * assert() equivalent, that does not lie in speed critical code.
+ * These asserts() thus can be enabled without fearing speedloss.
+ */
+#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0
+#define av_assert1(cond) av_assert0(cond)
+#else
+#define av_assert1(cond) ((void)0)
+#endif
+
+
+/**
+ * assert() equivalent, that does lie in speed critical code.
+ */
+#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
+#define av_assert2(cond) av_assert0(cond)
+#else
+#define av_assert2(cond) ((void)0)
+#endif
+
+#endif /* AVUTIL_AVASSERT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avconfig.h
new file mode 100644
index 000000000..f10aa6186
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffconf */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/avstring.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avstring.h
new file mode 100644
index 000000000..ed4e465cb
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avstring.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2007 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVSTRING_H
+#define AVUTIL_AVSTRING_H
+
+#include <stddef.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_string
+ * @{
+ */
+
+/**
+ * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to
+ * the address of the first character in str after the prefix.
+ *
+ * @param str input string
+ * @param pfx prefix to test
+ * @param ptr updated if the prefix is matched inside str
+ * @return non-zero if the prefix matches, zero otherwise
+ */
+int av_strstart(const char *str, const char *pfx, const char **ptr);
+
+/**
+ * Return non-zero if pfx is a prefix of str independent of case. If
+ * it is, *ptr is set to the address of the first character in str
+ * after the prefix.
+ *
+ * @param str input string
+ * @param pfx prefix to test
+ * @param ptr updated if the prefix is matched inside str
+ * @return non-zero if the prefix matches, zero otherwise
+ */
+int av_stristart(const char *str, const char *pfx, const char **ptr);
+
+/**
+ * Locate the first case-independent occurrence in the string haystack
+ * of the string needle. A zero-length string needle is considered to
+ * match at the start of haystack.
+ *
+ * This function is a case-insensitive version of the standard strstr().
+ *
+ * @param haystack string to search in
+ * @param needle string to search for
+ * @return pointer to the located match within haystack
+ * or a null pointer if no match
+ */
+char *av_stristr(const char *haystack, const char *needle);
+
+/**
+ * Copy the string src to dst, but no more than size - 1 bytes, and
+ * null-terminate dst.
+ *
+ * This function is the same as BSD strlcpy().
+ *
+ * @param dst destination buffer
+ * @param src source string
+ * @param size size of destination buffer
+ * @return the length of src
+ *
+ * @warning since the return value is the length of src, src absolutely
+ * _must_ be a properly 0-terminated string, otherwise this will read beyond
+ * the end of the buffer and possibly crash.
+ */
+size_t av_strlcpy(char *dst, const char *src, size_t size);
+
+/**
+ * Append the string src to the string dst, but to a total length of
+ * no more than size - 1 bytes, and null-terminate dst.
+ *
+ * This function is similar to BSD strlcat(), but differs when
+ * size <= strlen(dst).
+ *
+ * @param dst destination buffer
+ * @param src source string
+ * @param size size of destination buffer
+ * @return the total length of src and dst
+ *
+ * @warning since the return value use the length of src and dst, these
+ * absolutely _must_ be a properly 0-terminated strings, otherwise this
+ * will read beyond the end of the buffer and possibly crash.
+ */
+size_t av_strlcat(char *dst, const char *src, size_t size);
+
+/**
+ * Append output to a string, according to a format. Never write out of
+ * the destination buffer, and always put a terminating 0 within
+ * the buffer.
+ * @param dst destination buffer (string to which the output is
+ * appended)
+ * @param size total size of the destination buffer
+ * @param fmt printf-compatible format string, specifying how the
+ * following parameters are used
+ * @return the length of the string that would have been generated
+ * if enough space had been available
+ */
+size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);
+
+/**
+ * Convert a number to a av_malloced string.
+ */
+char *av_d2str(double d);
+
+/**
+ * Unescape the given string until a non escaped terminating char,
+ * and return the token corresponding to the unescaped string.
+ *
+ * The normal \ and ' escaping is supported. Leading and trailing
+ * whitespaces are removed, unless they are escaped with '\' or are
+ * enclosed between ''.
+ *
+ * @param buf the buffer to parse, buf will be updated to point to the
+ * terminating char
+ * @param term a 0-terminated list of terminating chars
+ * @return the malloced unescaped string, which must be av_freed by
+ * the user, NULL in case of allocation failure
+ */
+char *av_get_token(const char **buf, const char *term);
+
+/**
+ * Locale-independent conversion of ASCII characters to uppercase.
+ */
+static inline int av_toupper(int c)
+{
+ if (c >= 'a' && c <= 'z')
+ c ^= 0x20;
+ return c;
+}
+
+/**
+ * Locale-independent conversion of ASCII characters to lowercase.
+ */
+static inline int av_tolower(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ c ^= 0x20;
+ return c;
+}
+
+/*
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strcasecmp(const char *a, const char *b);
+
+/**
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strncasecmp(const char *a, const char *b, size_t n);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AVSTRING_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avutil.h
new file mode 100644
index 000000000..05e924837
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/avutil.h
@@ -0,0 +1,326 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVUTIL_H
+#define AVUTIL_AVUTIL_H
+
+/**
+ * @file
+ * external API header
+ */
+
+/**
+ * @mainpage
+ *
+ * @section libav_intro Introduction
+ *
+ * This document describe the usage of the different libraries
+ * provided by Libav.
+ *
+ * @li @ref libavc "libavcodec" encoding/decoding library
+ * @li @subpage libavfilter graph based frame editing library
+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
+ * @li @ref lavu "libavutil" common utility library
+ * @li @subpage libpostproc post processing library
+ * @li @subpage libswscale color conversion and scaling library
+ *
+ */
+
+/**
+ * @defgroup lavu Common utility functions
+ *
+ * @brief
+ * libavutil contains the code shared across all the other Libav
+ * libraries
+ *
+ * @note In order to use the functions provided by avutil you must include
+ * the specific header.
+ *
+ * @{
+ *
+ * @defgroup lavu_crypto Crypto and Hashing
+ *
+ * @{
+ * @}
+ *
+ * @defgroup lavu_math Maths
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_string String Manipulation
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_mem Memory Management
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_data Data Structures
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_audio Audio related
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_error Error Codes
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_misc Other
+ *
+ * @{
+ *
+ * @defgroup lavu_internal Internal
+ *
+ * Not exported functions, for internal usage only
+ *
+ * @{
+ *
+ * @}
+ */
+
+
+/**
+ * @defgroup preproc_misc Preprocessor String Macros
+ *
+ * String manipulation macros
+ *
+ * @{
+ */
+
+#define AV_STRINGIFY(s) AV_TOSTRING(s)
+#define AV_TOSTRING(s) #s
+
+#define AV_GLUE(a, b) a ## b
+#define AV_JOIN(a, b) AV_GLUE(a, b)
+
+#define AV_PRAGMA(s) _Pragma(#s)
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup version_utils Library Version Macros
+ *
+ * Useful to check and match library version in order to maintain
+ * backward compatibility.
+ *
+ * @{
+ */
+
+#define AV_VERSION_INT(a, b, c) (a<<16 | b<<8 | c)
+#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
+
+/**
+ * @}
+ *
+ * @defgroup lavu_ver Version and Build diagnostics
+ *
+ * Macros and function useful to check at compiletime and at runtime
+ * which version of libavutil is in use.
+ *
+ * @{
+ */
+
+#define LIBAVUTIL_VERSION_MAJOR 51
+#define LIBAVUTIL_VERSION_MINOR 22
+#define LIBAVUTIL_VERSION_MICRO 1
+
+#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT
+
+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
+
+/**
+ * @}
+ *
+ * @defgroup depr_guards Deprecation guards
+ * Those FF_API_* defines are not part of public API.
+ * They may change, break or disappear at any time.
+ *
+ * They are used mostly internally to mark code that will be removed
+ * on the next major version.
+ *
+ * @{
+ */
+#ifndef FF_API_GET_BITS_PER_SAMPLE_FMT
+#define FF_API_GET_BITS_PER_SAMPLE_FMT (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+#ifndef FF_API_FIND_OPT
+#define FF_API_FIND_OPT (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+#ifndef FF_API_AV_FIFO_PEEK
+#define FF_API_AV_FIFO_PEEK (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+#ifndef FF_API_OLD_AVOPTIONS
+#define FF_API_OLD_AVOPTIONS (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_ver
+ * @{
+ */
+
+/**
+ * Return the LIBAVUTIL_VERSION_INT constant.
+ */
+unsigned avutil_version(void);
+
+/**
+ * Return the libavutil build-time configuration.
+ */
+const char *avutil_configuration(void);
+
+/**
+ * Return the libavutil license.
+ */
+const char *avutil_license(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_media Media Type
+ * @brief Media Type
+ */
+
+enum AVMediaType {
+ AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA
+ AVMEDIA_TYPE_VIDEO,
+ AVMEDIA_TYPE_AUDIO,
+ AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous
+ AVMEDIA_TYPE_SUBTITLE,
+ AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse
+ AVMEDIA_TYPE_NB
+};
+
+/**
+ * @defgroup lavu_const Constants
+ * @{
+ *
+ * @defgroup lavu_enc Encoding specific
+ *
+ * @note those definition should move to avcodec
+ * @{
+ */
+
+#define FF_LAMBDA_SHIFT 7
+#define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)
+#define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
+#define FF_LAMBDA_MAX (256*128-1)
+
+#define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
+
+/**
+ * @}
+ * @defgroup lavu_time Timestamp specific
+ *
+ * Libav internal timebase and timestamp definitions
+ *
+ * @{
+ */
+
+/**
+ * @brief Undefined timestamp value
+ *
+ * Usually reported by demuxer that work on containers that do not provide
+ * either pts or dts.
+ */
+
+#define AV_NOPTS_VALUE INT64_C(0x8000000000000000)
+
+/**
+ * Internal time base represented as integer
+ */
+
+#define AV_TIME_BASE 1000000
+
+/**
+ * Internal time base represented as fractional value
+ */
+
+#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
+
+/**
+ * @}
+ * @}
+ * @defgroup lavu_picture Image related
+ *
+ * AVPicture types, pixel formats and basic image planes manipulation.
+ *
+ * @{
+ */
+
+enum AVPictureType {
+ AV_PICTURE_TYPE_I = 1, ///< Intra
+ AV_PICTURE_TYPE_P, ///< Predicted
+ AV_PICTURE_TYPE_B, ///< Bi-dir predicted
+ AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG4
+ AV_PICTURE_TYPE_SI, ///< Switching Intra
+ AV_PICTURE_TYPE_SP, ///< Switching Predicted
+ AV_PICTURE_TYPE_BI, ///< BI type
+};
+
+/**
+ * Return a single letter to describe the given picture type
+ * pict_type.
+ *
+ * @param[in] pict_type the picture type @return a single character
+ * representing the picture type, '?' if pict_type is unknown
+ */
+char av_get_picture_type_char(enum AVPictureType pict_type);
+
+/**
+ * @}
+ */
+
+#include "common.h"
+#include "error.h"
+
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_AVUTIL_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/base64.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/base64.h
new file mode 100644
index 000000000..4750cf5c7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/base64.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BASE64_H
+#define AVUTIL_BASE64_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_base64 Base64
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+
+/**
+ * Decode a base64-encoded string.
+ *
+ * @param out buffer for decoded data
+ * @param in null-terminated input string
+ * @param out_size size in bytes of the out buffer, must be at
+ * least 3/4 of the length of in
+ * @return number of bytes written, or a negative value in case of
+ * invalid input
+ */
+int av_base64_decode(uint8_t *out, const char *in, int out_size);
+
+/**
+ * Encode data to base64 and null-terminate.
+ *
+ * @param out buffer for encoded data
+ * @param out_size size in bytes of the output buffer, must be at
+ * least AV_BASE64_SIZE(in_size)
+ * @param in_size size in bytes of the 'in' buffer
+ * @return 'out' or NULL in case of error
+ */
+char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size);
+
+/**
+ * Calculate the output size needed to base64-encode x bytes.
+ */
+#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1)
+
+ /**
+ * @}
+ */
+
+#endif /* AVUTIL_BASE64_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/blowfish.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/blowfish.h
new file mode 100644
index 000000000..0b004532d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/blowfish.h
@@ -0,0 +1,77 @@
+/*
+ * Blowfish algorithm
+ * Copyright (c) 2012 Samuel Pitoiset
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BLOWFISH_H
+#define AVUTIL_BLOWFISH_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_blowfish Blowfish
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#define AV_BF_ROUNDS 16
+
+typedef struct AVBlowfish {
+ uint32_t p[AV_BF_ROUNDS + 2];
+ uint32_t s[4][256];
+} AVBlowfish;
+
+/**
+ * Initialize an AVBlowfish context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param key a key
+ * @param key_len length of the key
+ */
+void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param xl left four bytes halves of input to be encrypted
+ * @param xr right four bytes halves of input to be encrypted
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
+ int decrypt);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param count number of 8 byte blocks
+ * @param iv initialization vector for CBC mode, if NULL ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
+ int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_BLOWFISH_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/bprint.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/bprint.h
new file mode 100644
index 000000000..c09b61f20
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/bprint.h
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2012 Nicolas George
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BPRINT_H
+#define AVUTIL_BPRINT_H
+
+#include "attributes.h"
+
+/**
+ * Define a structure with extra padding to a fixed size
+ * This helps ensuring binary compatibility with future versions.
+ */
+#define FF_PAD_STRUCTURE(size, ...) \
+ __VA_ARGS__ \
+ char reserved_padding[size - sizeof(struct { __VA_ARGS__ })];
+
+/**
+ * Buffer to print data progressively
+ *
+ * The string buffer grows as necessary and is always 0-terminated.
+ * The content of the string is never accessed, and thus is
+ * encoding-agnostic and can even hold binary data.
+ *
+ * Small buffers are kept in the structure itself, and thus require no
+ * memory allocation at all (unless the contents of the buffer is needed
+ * after the structure goes out of scope). This is almost as lightweight as
+ * declaring a local "char buf[512]".
+ *
+ * The length of the string can go beyond the allocated size: the buffer is
+ * then truncated, but the functions still keep account of the actual total
+ * length.
+ *
+ * In other words, buf->len can be greater than buf->size and records the
+ * total length of what would have been to the buffer if there had been
+ * enough memory.
+ *
+ * Append operations do not need to be tested for failure: if a memory
+ * allocation fails, data stop being appended to the buffer, but the length
+ * is still updated. This situation can be tested with
+ * av_bprint_is_complete().
+ *
+ * The size_max field determines several possible behaviours:
+ *
+ * size_max = -1 (= UINT_MAX) or any large value will let the buffer be
+ * reallocated as necessary, with an amortized linear cost.
+ *
+ * size_max = 0 prevents writing anything to the buffer: only the total
+ * length is computed. The write operations can then possibly be repeated in
+ * a buffer with exactly the necessary size
+ * (using size_init = size_max = len + 1).
+ *
+ * size_max = 1 is automatically replaced by the exact size available in the
+ * structure itself, thus ensuring no dynamic memory allocation. The
+ * internal buffer is large enough to hold a reasonable paragraph of text,
+ * such as the current paragraph.
+ */
+typedef struct AVBPrint {
+ FF_PAD_STRUCTURE(1024,
+ char *str; /** string so far */
+ unsigned len; /** length so far */
+ unsigned size; /** allocated memory */
+ unsigned size_max; /** maximum allocated memory */
+ char reserved_internal_buffer[1];
+ )
+} AVBPrint;
+
+/**
+ * Convenience macros for special values for av_bprint_init() size_max
+ * parameter.
+ */
+#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1)
+#define AV_BPRINT_SIZE_AUTOMATIC 1
+#define AV_BPRINT_SIZE_COUNT_ONLY 0
+
+/**
+ * Init a print buffer.
+ *
+ * @param buf buffer to init
+ * @param size_init initial size (including the final 0)
+ * @param size_max maximum size;
+ * 0 means do not write anything, just count the length;
+ * 1 is replaced by the maximum value for automatic storage;
+ * any large value means that the internal buffer will be
+ * reallocated as needed up to that limit; -1 is converted to
+ * UINT_MAX, the largest limit possible.
+ * Check also AV_BPRINT_SIZE_* macros.
+ */
+void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max);
+
+/**
+ * Init a print buffer using a pre-existing buffer.
+ *
+ * The buffer will not be reallocated.
+ *
+ * @param buf buffer structure to init
+ * @param buffer byte buffer to use for the string data
+ * @param size size of buffer
+ */
+void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size);
+
+/**
+ * Append a formated string to a print buffer.
+ */
+void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3);
+
+/**
+ * Append char c n times to a print buffer.
+ */
+void av_bprint_chars(AVBPrint *buf, char c, unsigned n);
+
+/**
+ * Allocate bytes in the buffer for external use.
+ *
+ * @param[in] buf buffer structure
+ * @param[in] size required size
+ * @param[out] mem pointer to the memory area
+ * @param[out] actual_size size of the memory area after allocation;
+ * can be larger or smaller than size
+ */
+void av_bprint_get_buffer(AVBPrint *buf, unsigned size,
+ unsigned char **mem, unsigned *actual_size);
+
+/**
+ * Reset the string to "" but keep internal allocated data.
+ */
+void av_bprint_clear(AVBPrint *buf);
+
+/**
+ * Test if the print buffer is complete (not truncated).
+ *
+ * It may have been truncated due to a memory allocation failure
+ * or the size_max limit (compare size and size_max if necessary).
+ */
+static inline int av_bprint_is_complete(AVBPrint *buf)
+{
+ return buf->len < buf->size;
+}
+
+/**
+ * Finalize a print buffer.
+ *
+ * The print buffer can no longer be used afterwards,
+ * but the len and size fields are still valid.
+ *
+ * @arg[out] ret_str if not NULL, used to return a permanent copy of the
+ * buffer contents, or NULL if memory allocation fails;
+ * if NULL, the buffer is discarded and freed
+ * @return 0 for success or error code (probably AVERROR(ENOMEM))
+ */
+int av_bprint_finalize(AVBPrint *buf, char **ret_str);
+
+#endif /* AVUTIL_BPRINT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/bswap.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/bswap.h
new file mode 100644
index 000000000..8a350e1cd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/bswap.h
@@ -0,0 +1,109 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * byte swapping routines
+ */
+
+#ifndef AVUTIL_BSWAP_H
+#define AVUTIL_BSWAP_H
+
+#include <stdint.h>
+#include "libavutil/avconfig.h"
+#include "attributes.h"
+
+#ifdef HAVE_AV_CONFIG_H
+
+#include "config.h"
+
+#if ARCH_ARM
+# include "arm/bswap.h"
+#elif ARCH_AVR32
+# include "avr32/bswap.h"
+#elif ARCH_BFIN
+# include "bfin/bswap.h"
+#elif ARCH_SH4
+# include "sh4/bswap.h"
+#elif ARCH_X86
+# include "x86/bswap.h"
+#endif
+
+#endif /* HAVE_AV_CONFIG_H */
+
+#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff))
+#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16))
+#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32))
+
+#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x)
+
+#ifndef av_bswap16
+static av_always_inline av_const uint16_t av_bswap16(uint16_t x)
+{
+ x= (x>>8) | (x<<8);
+ return x;
+}
+#endif
+
+#ifndef av_bswap32
+static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
+{
+ return AV_BSWAP32C(x);
+}
+#endif
+
+#ifndef av_bswap64
+static inline uint64_t av_const av_bswap64(uint64_t x)
+{
+ return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32);
+}
+#endif
+
+// be2ne ... big-endian to native-endian
+// le2ne ... little-endian to native-endian
+
+#if AV_HAVE_BIGENDIAN
+#define av_be2ne16(x) (x)
+#define av_be2ne32(x) (x)
+#define av_be2ne64(x) (x)
+#define av_le2ne16(x) av_bswap16(x)
+#define av_le2ne32(x) av_bswap32(x)
+#define av_le2ne64(x) av_bswap64(x)
+#define AV_BE2NEC(s, x) (x)
+#define AV_LE2NEC(s, x) AV_BSWAPC(s, x)
+#else
+#define av_be2ne16(x) av_bswap16(x)
+#define av_be2ne32(x) av_bswap32(x)
+#define av_be2ne64(x) av_bswap64(x)
+#define av_le2ne16(x) (x)
+#define av_le2ne32(x) (x)
+#define av_le2ne64(x) (x)
+#define AV_BE2NEC(s, x) AV_BSWAPC(s, x)
+#define AV_LE2NEC(s, x) (x)
+#endif
+
+#define AV_BE2NE16C(x) AV_BE2NEC(16, x)
+#define AV_BE2NE32C(x) AV_BE2NEC(32, x)
+#define AV_BE2NE64C(x) AV_BE2NEC(64, x)
+#define AV_LE2NE16C(x) AV_LE2NEC(16, x)
+#define AV_LE2NE32C(x) AV_LE2NEC(32, x)
+#define AV_LE2NE64C(x) AV_LE2NEC(64, x)
+
+#endif /* AVUTIL_BSWAP_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/common.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/common.h
new file mode 100644
index 000000000..c99d85847
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/common.h
@@ -0,0 +1,398 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * common internal and external API header
+ */
+
+#ifndef AVUTIL_COMMON_H
+#define AVUTIL_COMMON_H
+
+#include <ctype.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "attributes.h"
+#include "libavutil/avconfig.h"
+
+#if AV_HAVE_BIGENDIAN
+# define AV_NE(be, le) (be)
+#else
+# define AV_NE(be, le) (le)
+#endif
+
+//rounded division & shift
+#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
+/* assume b>0 */
+#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
+#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
+#define FFSIGN(a) ((a) > 0 ? 1 : -1)
+
+#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
+#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
+#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
+#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
+
+#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
+#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
+
+/* misc math functions */
+extern const uint8_t ff_log2_tab[256];
+
+extern const uint8_t av_reverse[256];
+
+static av_always_inline av_const int av_log2_c(unsigned int v)
+{
+ int n = 0;
+ if (v & 0xffff0000) {
+ v >>= 16;
+ n += 16;
+ }
+ if (v & 0xff00) {
+ v >>= 8;
+ n += 8;
+ }
+ n += ff_log2_tab[v];
+
+ return n;
+}
+
+static av_always_inline av_const int av_log2_16bit_c(unsigned int v)
+{
+ int n = 0;
+ if (v & 0xff00) {
+ v >>= 8;
+ n += 8;
+ }
+ n += ff_log2_tab[v];
+
+ return n;
+}
+
+#ifdef HAVE_AV_CONFIG_H
+# include "config.h"
+# include "intmath.h"
+#endif
+
+/* Pull in unguarded fallback defines at the end of this file. */
+#include "common.h"
+
+/**
+ * Clip a signed integer value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
+{
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-255 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
+{
+ if (a&(~0xFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -128,127 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int8_t av_clip_int8_c(int a)
+{
+ if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-65535 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
+{
+ if (a&(~0xFFFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -32768,32767 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int16_t av_clip_int16_c(int a)
+{
+ if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
+ else return a;
+}
+
+/**
+ * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
+{
+ if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;
+ else return a;
+}
+
+/**
+ * Clip a signed integer to an unsigned power of two range.
+ * @param a value to clip
+ * @param p bit position to clip at
+ * @return clipped value
+ */
+static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
+{
+ if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1);
+ else return a;
+}
+
+/**
+ * Clip a float value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
+{
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/** Compute ceil(log2(x)).
+ * @param x value used to compute ceil(log2(x))
+ * @return computed ceiling of log2(x)
+ */
+static av_always_inline av_const int av_ceil_log2_c(int x)
+{
+ return av_log2((x - 1) << 1);
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount_c(uint32_t x)
+{
+ x -= (x >> 1) & 0x55555555;
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+ x = (x + (x >> 4)) & 0x0F0F0F0F;
+ x += x >> 8;
+ return (x + (x >> 16)) & 0x3F;
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount64_c(uint64_t x)
+{
+ return av_popcount(x) + av_popcount(x >> 32);
+}
+
+#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
+#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
+
+/**
+ * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_BYTE Expression reading one byte from the input.
+ * Evaluated up to 7 times (4 for the currently
+ * assigned Unicode range). With a memory buffer
+ * input, this could be *ptr++.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF8(val, GET_BYTE, ERROR)\
+ val= GET_BYTE;\
+ {\
+ int ones= 7 - av_log2(val ^ 255);\
+ if(ones==1)\
+ ERROR\
+ val&= 127>>ones;\
+ while(--ones > 0){\
+ int tmp= GET_BYTE - 128;\
+ if(tmp>>6)\
+ ERROR\
+ val= (val<<6) + tmp;\
+ }\
+ }
+
+/**
+ * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
+ * to native byte order. Evaluated one or two times.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF16(val, GET_16BIT, ERROR)\
+ val = GET_16BIT;\
+ {\
+ unsigned int hi = val - 0xD800;\
+ if (hi < 0x800) {\
+ val = GET_16BIT - 0xDC00;\
+ if (val > 0x3FFU || hi > 0x3FFU)\
+ ERROR\
+ val += (hi<<10) + 0x10000;\
+ }\
+ }\
+
+/**
+ * @def PUT_UTF8(val, tmp, PUT_BYTE)
+ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint8_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_BYTE.
+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
+ * It could be a function or a statement, and uses tmp as the input byte.
+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
+ * executed up to 4 times for values in the valid UTF-8 range and up to
+ * 7 times in the general case, depending on the length of the converted
+ * Unicode character.
+ */
+#define PUT_UTF8(val, tmp, PUT_BYTE)\
+ {\
+ int bytes, shift;\
+ uint32_t in = val;\
+ if (in < 0x80) {\
+ tmp = in;\
+ PUT_BYTE\
+ } else {\
+ bytes = (av_log2(in) + 4) / 5;\
+ shift = (bytes - 1) * 6;\
+ tmp = (256 - (256 >> bytes)) | (in >> shift);\
+ PUT_BYTE\
+ while (shift >= 6) {\
+ shift -= 6;\
+ tmp = 0x80 | ((in >> shift) & 0x3f);\
+ PUT_BYTE\
+ }\
+ }\
+ }
+
+/**
+ * @def PUT_UTF16(val, tmp, PUT_16BIT)
+ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint16_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_16BIT.
+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
+ * in desired endianness. It could be a function or a statement, and uses tmp
+ * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;"
+ * PUT_BYTE will be executed 1 or 2 times depending on input character.
+ */
+#define PUT_UTF16(val, tmp, PUT_16BIT)\
+ {\
+ uint32_t in = val;\
+ if (in < 0x10000) {\
+ tmp = in;\
+ PUT_16BIT\
+ } else {\
+ tmp = 0xD800 | ((in - 0x10000) >> 10);\
+ PUT_16BIT\
+ tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
+ PUT_16BIT\
+ }\
+ }\
+
+
+
+#include "mem.h"
+
+#ifdef HAVE_AV_CONFIG_H
+# include "internal.h"
+#endif /* HAVE_AV_CONFIG_H */
+
+#endif /* AVUTIL_COMMON_H */
+
+/*
+ * The following definitions are outside the multiple inclusion guard
+ * to ensure they are immediately available in intmath.h.
+ */
+
+#ifndef av_log2
+# define av_log2 av_log2_c
+#endif
+#ifndef av_log2_16bit
+# define av_log2_16bit av_log2_16bit_c
+#endif
+#ifndef av_ceil_log2
+# define av_ceil_log2 av_ceil_log2_c
+#endif
+#ifndef av_clip
+# define av_clip av_clip_c
+#endif
+#ifndef av_clip_uint8
+# define av_clip_uint8 av_clip_uint8_c
+#endif
+#ifndef av_clip_int8
+# define av_clip_int8 av_clip_int8_c
+#endif
+#ifndef av_clip_uint16
+# define av_clip_uint16 av_clip_uint16_c
+#endif
+#ifndef av_clip_int16
+# define av_clip_int16 av_clip_int16_c
+#endif
+#ifndef av_clipl_int32
+# define av_clipl_int32 av_clipl_int32_c
+#endif
+#ifndef av_clip_uintp2
+# define av_clip_uintp2 av_clip_uintp2_c
+#endif
+#ifndef av_clipf
+# define av_clipf av_clipf_c
+#endif
+#ifndef av_popcount
+# define av_popcount av_popcount_c
+#endif
+#ifndef av_popcount64
+# define av_popcount64 av_popcount64_c
+#endif
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/cpu.h
new file mode 100644
index 000000000..df7bf4421
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/cpu.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CPU_H
+#define AVUTIL_CPU_H
+
+#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */
+
+ /* lower 16 bits - CPU features */
+#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX
+#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext
+#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW
+#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions
+#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions
+#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster
+#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt
+#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions
+#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster
+#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions
+#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower
+#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions
+#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions
+#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
+#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions
+#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions
+#define AV_CPU_FLAG_IWMMXT 0x0100 ///< XScale IWMMXT
+#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard
+
+/**
+ * Return the flags which specify extensions supported by the CPU.
+ */
+int av_get_cpu_flags(void);
+
+/* The following CPU-specific functions shall not be called directly. */
+int ff_get_cpu_flags_arm(void);
+int ff_get_cpu_flags_ppc(void);
+int ff_get_cpu_flags_x86(void);
+
+#endif /* AVUTIL_CPU_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/crc.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/crc.h
new file mode 100644
index 000000000..a93411941
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/crc.h
@@ -0,0 +1,44 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CRC_H
+#define AVUTIL_CRC_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include "attributes.h"
+
+typedef uint32_t AVCRC;
+
+typedef enum {
+ AV_CRC_8_ATM,
+ AV_CRC_16_ANSI,
+ AV_CRC_16_CCITT,
+ AV_CRC_32_IEEE,
+ AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */
+ AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */
+}AVCRCId;
+
+int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size);
+const AVCRC *av_crc_get_table(AVCRCId crc_id);
+uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length) av_pure;
+
+#endif /* AVUTIL_CRC_H */
+
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/dict.h
new file mode 100644
index 000000000..6e28b6140
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/dict.h
@@ -0,0 +1,121 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Public dictionary API.
+ */
+
+#ifndef AVUTIL_DICT_H
+#define AVUTIL_DICT_H
+
+/**
+ * @addtogroup lavu_dict AVDictionary
+ * @ingroup lavu_data
+ *
+ * @brief Simple key:value store
+ *
+ * @{
+ * Dictionaries are used for storing key:value pairs. To create
+ * an AVDictionary, simply pass an address of a NULL pointer to
+ * av_dict_set(). NULL can be used as an empty dictionary wherever
+ * a pointer to an AVDictionary is required.
+ * Use av_dict_get() to retrieve an entry or iterate over all
+ * entries and finally av_dict_free() to free the dictionary
+ * and all its contents.
+ *
+ * @code
+ * AVDictionary *d = NULL; // "create" an empty dictionary
+ * av_dict_set(&d, "foo", "bar", 0); // add an entry
+ *
+ * char *k = av_strdup("key"); // if your strings are already allocated,
+ * char *v = av_strdup("value"); // you can avoid copying them like this
+ * av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
+ *
+ * AVDictionaryEntry *t = NULL;
+ * while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ * <....> // iterate over all entries in d
+ * }
+ *
+ * av_dict_free(&d);
+ * @endcode
+ *
+ */
+
+#define AV_DICT_MATCH_CASE 1
+#define AV_DICT_IGNORE_SUFFIX 2
+#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been
+ allocated with av_malloc() and children. */
+#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been
+ allocated with av_malloc() and chilren. */
+#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries.
+#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no
+ delimiter is added, the strings are simply concatenated. */
+
+typedef struct {
+ char *key;
+ char *value;
+} AVDictionaryEntry;
+
+typedef struct AVDictionary AVDictionary;
+
+/**
+ * Get a dictionary entry with matching key.
+ *
+ * @param prev Set to the previous matching element to find the next.
+ * If set to NULL the first matching element is returned.
+ * @param flags Allows case as well as suffix-insensitive comparisons.
+ * @return Found entry or NULL, changing key or value leads to undefined behavior.
+ */
+AVDictionaryEntry *
+av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags);
+
+/**
+ * Set the given entry in *pm, overwriting an existing entry.
+ *
+ * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL
+ * a dictionary struct is allocated and put in *pm.
+ * @param key entry key to add to *pm (will be av_strduped depending on flags)
+ * @param value entry value to add to *pm (will be av_strduped depending on flags).
+ * Passing a NULL value will cause an existing tag to be deleted.
+ * @return >= 0 on success otherwise an error code <0
+ */
+int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
+
+/**
+ * Copy entries from one AVDictionary struct into another.
+ * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL,
+ * this function will allocate a struct for you and put it in *dst
+ * @param src pointer to source AVDictionary struct
+ * @param flags flags to use when setting entries in *dst
+ * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag
+ */
+void av_dict_copy(AVDictionary **dst, AVDictionary *src, int flags);
+
+/**
+ * Free all the memory allocated for an AVDictionary struct
+ * and all keys and values.
+ */
+void av_dict_free(AVDictionary **m);
+
+/**
+ * @}
+ */
+
+#endif // AVUTIL_DICT_H
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/error.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/error.h
new file mode 100644
index 000000000..11bcc5c4c
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/error.h
@@ -0,0 +1,81 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * error code definitions
+ */
+
+#ifndef AVUTIL_ERROR_H
+#define AVUTIL_ERROR_H
+
+#include <errno.h>
+#include "avutil.h"
+
+/**
+ * @addtogroup lavu_error
+ *
+ * @{
+ */
+
+
+/* error handling */
+#if EDOM > 0
+#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions.
+#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
+#else
+/* Some platforms have E* and errno already negated. */
+#define AVERROR(e) (e)
+#define AVUNERROR(e) (e)
+#endif
+
+#define AVERROR_BSF_NOT_FOUND (-MKTAG(0xF8,'B','S','F')) ///< Bitstream filter not found
+#define AVERROR_DECODER_NOT_FOUND (-MKTAG(0xF8,'D','E','C')) ///< Decoder not found
+#define AVERROR_DEMUXER_NOT_FOUND (-MKTAG(0xF8,'D','E','M')) ///< Demuxer not found
+#define AVERROR_ENCODER_NOT_FOUND (-MKTAG(0xF8,'E','N','C')) ///< Encoder not found
+#define AVERROR_EOF (-MKTAG( 'E','O','F',' ')) ///< End of file
+#define AVERROR_EXIT (-MKTAG( 'E','X','I','T')) ///< Immediate exit was requested; the called function should not be restarted
+#define AVERROR_FILTER_NOT_FOUND (-MKTAG(0xF8,'F','I','L')) ///< Filter not found
+#define AVERROR_INVALIDDATA (-MKTAG( 'I','N','D','A')) ///< Invalid data found when processing input
+#define AVERROR_MUXER_NOT_FOUND (-MKTAG(0xF8,'M','U','X')) ///< Muxer not found
+#define AVERROR_OPTION_NOT_FOUND (-MKTAG(0xF8,'O','P','T')) ///< Option not found
+#define AVERROR_PATCHWELCOME (-MKTAG( 'P','A','W','E')) ///< Not yet implemented in Libav, patches welcome
+#define AVERROR_PROTOCOL_NOT_FOUND (-MKTAG(0xF8,'P','R','O')) ///< Protocol not found
+#define AVERROR_STREAM_NOT_FOUND (-MKTAG(0xF8,'S','T','R')) ///< Stream not found
+#define AVERROR_BUG (-MKTAG( 'B','U','G',' ')) ///< Bug detected, please report the issue
+#define AVERROR_UNKNOWN (-MKTAG( 'U','N','K','N')) ///< Unknown error, typically from an external library
+
+/**
+ * Put a description of the AVERROR code errnum in errbuf.
+ * In case of failure the global variable errno is set to indicate the
+ * error. Even in case of failure av_strerror() will print a generic
+ * error message indicating the errnum provided to errbuf.
+ *
+ * @param errnum error code to describe
+ * @param errbuf buffer to which description is written
+ * @param errbuf_size the size in bytes of errbuf
+ * @return 0 on success, a negative value if a description for errnum
+ * cannot be found
+ */
+int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_ERROR_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/eval.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/eval.h
new file mode 100644
index 000000000..ccb29e7a3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/eval.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * simple arithmetic expression evaluator
+ */
+
+#ifndef AVUTIL_EVAL_H
+#define AVUTIL_EVAL_H
+
+#include "avutil.h"
+
+typedef struct AVExpr AVExpr;
+
+/**
+ * Parse and evaluate an expression.
+ * Note, this is significantly slower than av_expr_eval().
+ *
+ * @param res a pointer to a double where is put the result value of
+ * the expression, or NAN in case of error
+ * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
+ * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
+ * @param const_values a zero terminated array of values for the identifiers from const_names
+ * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers
+ * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument
+ * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers
+ * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments
+ * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
+ * @param log_ctx parent logging context
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_expr_parse_and_eval(double *res, const char *s,
+ const char * const *const_names, const double *const_values,
+ const char * const *func1_names, double (* const *funcs1)(void *, double),
+ const char * const *func2_names, double (* const *funcs2)(void *, double, double),
+ void *opaque, int log_offset, void *log_ctx);
+
+/**
+ * Parse an expression.
+ *
+ * @param expr a pointer where is put an AVExpr containing the parsed
+ * value in case of successful parsing, or NULL otherwise.
+ * The pointed to AVExpr must be freed with av_expr_free() by the user
+ * when it is not needed anymore.
+ * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
+ * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
+ * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers
+ * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument
+ * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers
+ * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments
+ * @param log_ctx parent logging context
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_expr_parse(AVExpr **expr, const char *s,
+ const char * const *const_names,
+ const char * const *func1_names, double (* const *funcs1)(void *, double),
+ const char * const *func2_names, double (* const *funcs2)(void *, double, double),
+ int log_offset, void *log_ctx);
+
+/**
+ * Evaluate a previously parsed expression.
+ *
+ * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names
+ * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
+ * @return the value of the expression
+ */
+double av_expr_eval(AVExpr *e, const double *const_values, void *opaque);
+
+/**
+ * Free a parsed expression previously created with av_expr_parse().
+ */
+void av_expr_free(AVExpr *e);
+
+/**
+ * Parse the string in numstr and return its value as a double. If
+ * the string is empty, contains only whitespaces, or does not contain
+ * an initial substring that has the expected syntax for a
+ * floating-point number, no conversion is performed. In this case,
+ * returns a value of zero and the value returned in tail is the value
+ * of numstr.
+ *
+ * @param numstr a string representing a number, may contain one of
+ * the International System number postfixes, for example 'K', 'M',
+ * 'G'. If 'i' is appended after the postfix, powers of 2 are used
+ * instead of powers of 10. The 'B' postfix multiplies the value for
+ * 8, and can be appended after another postfix or used alone. This
+ * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix.
+ * @param tail if non-NULL puts here the pointer to the char next
+ * after the last parsed character
+ */
+double av_strtod(const char *numstr, char **tail);
+
+#endif /* AVUTIL_EVAL_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/fifo.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/fifo.h
new file mode 100644
index 000000000..f10623930
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/fifo.h
@@ -0,0 +1,141 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * a very simple circular buffer FIFO implementation
+ */
+
+#ifndef AVUTIL_FIFO_H
+#define AVUTIL_FIFO_H
+
+#include <stdint.h>
+#include "avutil.h"
+
+typedef struct AVFifoBuffer {
+ uint8_t *buffer;
+ uint8_t *rptr, *wptr, *end;
+ uint32_t rndx, wndx;
+} AVFifoBuffer;
+
+/**
+ * Initialize an AVFifoBuffer.
+ * @param size of FIFO
+ * @return AVFifoBuffer or NULL in case of memory allocation failure
+ */
+AVFifoBuffer *av_fifo_alloc(unsigned int size);
+
+/**
+ * Free an AVFifoBuffer.
+ * @param f AVFifoBuffer to free
+ */
+void av_fifo_free(AVFifoBuffer *f);
+
+/**
+ * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied.
+ * @param f AVFifoBuffer to reset
+ */
+void av_fifo_reset(AVFifoBuffer *f);
+
+/**
+ * Return the amount of data in bytes in the AVFifoBuffer, that is the
+ * amount of data you can read from it.
+ * @param f AVFifoBuffer to read from
+ * @return size
+ */
+int av_fifo_size(AVFifoBuffer *f);
+
+/**
+ * Return the amount of space in bytes in the AVFifoBuffer, that is the
+ * amount of data you can write into it.
+ * @param f AVFifoBuffer to write into
+ * @return size
+ */
+int av_fifo_space(AVFifoBuffer *f);
+
+/**
+ * Feed data from an AVFifoBuffer to a user-supplied callback.
+ * @param f AVFifoBuffer to read from
+ * @param buf_size number of bytes to read
+ * @param func generic read function
+ * @param dest data destination
+ */
+int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
+
+/**
+ * Feed data from a user-supplied callback to an AVFifoBuffer.
+ * @param f AVFifoBuffer to write to
+ * @param src data source; non-const since it may be used as a
+ * modifiable context by the function defined in func
+ * @param size number of bytes to write
+ * @param func generic write function; the first parameter is src,
+ * the second is dest_buf, the third is dest_buf_size.
+ * func must return the number of bytes written to dest_buf, or <= 0 to
+ * indicate no more data available to write.
+ * If func is NULL, src is interpreted as a simple byte array for source data.
+ * @return the number of bytes written to the FIFO
+ */
+int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int));
+
+/**
+ * Resize an AVFifoBuffer.
+ * @param f AVFifoBuffer to resize
+ * @param size new AVFifoBuffer size in bytes
+ * @return <0 for failure, >=0 otherwise
+ */
+int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
+
+/**
+ * Read and discard the specified amount of data from an AVFifoBuffer.
+ * @param f AVFifoBuffer to read from
+ * @param size amount of data to read in bytes
+ */
+void av_fifo_drain(AVFifoBuffer *f, int size);
+
+/**
+ * Return a pointer to the data stored in a FIFO buffer at a certain offset.
+ * The FIFO buffer is not modified.
+ *
+ * @param f AVFifoBuffer to peek at, f must be non-NULL
+ * @param offs an offset in bytes, its absolute value must be less
+ * than the used buffer size or the returned pointer will
+ * point outside to the buffer data.
+ * The used buffer size can be checked with av_fifo_size().
+ */
+static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs)
+{
+ uint8_t *ptr = f->rptr + offs;
+ if (ptr >= f->end)
+ ptr = f->buffer + (ptr - f->end);
+ else if (ptr < f->buffer)
+ ptr = f->end - (f->buffer - ptr);
+ return ptr;
+}
+
+#if FF_API_AV_FIFO_PEEK
+/**
+ * @deprecated Use av_fifo_peek2() instead.
+ */
+attribute_deprecated
+static inline uint8_t av_fifo_peek(AVFifoBuffer *f, int offs)
+{
+ return *av_fifo_peek2(f, offs);
+}
+#endif
+
+#endif /* AVUTIL_FIFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/file.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/file.h
new file mode 100644
index 000000000..c481c37f9
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/file.h
@@ -0,0 +1,52 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_FILE_H
+#define AVUTIL_FILE_H
+
+#include "avutil.h"
+
+/**
+ * @file
+ * Misc file utilities.
+ */
+
+/**
+ * Read the file with name filename, and put its content in a newly
+ * allocated buffer or map it with mmap() when available.
+ * In case of success set *bufptr to the read or mmapped buffer, and
+ * *size to the size in bytes of the buffer in *bufptr.
+ * The returned buffer must be released with av_file_unmap().
+ *
+ * @param log_offset loglevel offset used for logging
+ * @param log_ctx context used for logging
+ * @return a non negative number in case of success, a negative value
+ * corresponding to an AVERROR error code in case of failure
+ */
+int av_file_map(const char *filename, uint8_t **bufptr, size_t *size,
+ int log_offset, void *log_ctx);
+
+/**
+ * Unmap or free the buffer bufptr created by av_file_map().
+ *
+ * @param size size in bytes of bufptr, must be the same as returned
+ * by av_file_map()
+ */
+void av_file_unmap(uint8_t *bufptr, size_t size);
+
+#endif /* AVUTIL_FILE_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/imgutils.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/imgutils.h
new file mode 100644
index 000000000..3815a49ae
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/imgutils.h
@@ -0,0 +1,138 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_IMGUTILS_H
+#define AVUTIL_IMGUTILS_H
+
+/**
+ * @file
+ * misc image utilities
+ *
+ * @addtogroup lavu_picture
+ * @{
+ */
+
+#include "avutil.h"
+#include "pixdesc.h"
+
+/**
+ * Compute the max pixel step for each plane of an image with a
+ * format described by pixdesc.
+ *
+ * The pixel step is the distance in bytes between the first byte of
+ * the group of bytes which describe a pixel component and the first
+ * byte of the successive group in the same plane for the same
+ * component.
+ *
+ * @param max_pixsteps an array which is filled with the max pixel step
+ * for each plane. Since a plane may contain different pixel
+ * components, the computed max_pixsteps[plane] is relative to the
+ * component in the plane with the max pixel step.
+ * @param max_pixstep_comps an array which is filled with the component
+ * for each plane which has the max pixel step. May be NULL.
+ */
+void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4],
+ const AVPixFmtDescriptor *pixdesc);
+
+/**
+ * Compute the size of an image line with format pix_fmt and width
+ * width for the plane plane.
+ *
+ * @return the computed size in bytes
+ */
+int av_image_get_linesize(enum PixelFormat pix_fmt, int width, int plane);
+
+/**
+ * Fill plane linesizes for an image with pixel format pix_fmt and
+ * width width.
+ *
+ * @param linesizes array to be filled with the linesize for each plane
+ * @return >= 0 in case of success, a negative error code otherwise
+ */
+int av_image_fill_linesizes(int linesizes[4], enum PixelFormat pix_fmt, int width);
+
+/**
+ * Fill plane data pointers for an image with pixel format pix_fmt and
+ * height height.
+ *
+ * @param data pointers array to be filled with the pointer for each image plane
+ * @param ptr the pointer to a buffer which will contain the image
+ * @param linesizes the array containing the linesize for each
+ * plane, should be filled by av_image_fill_linesizes()
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_fill_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int height,
+ uint8_t *ptr, const int linesizes[4]);
+
+/**
+ * Allocate an image with size w and h and pixel format pix_fmt, and
+ * fill pointers and linesizes accordingly.
+ * The allocated image buffer has to be freed by using
+ * av_freep(&pointers[0]).
+ *
+ * @param align the value to use for buffer size alignment
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+ int w, int h, enum PixelFormat pix_fmt, int align);
+
+/**
+ * Copy image plane from src to dst.
+ * That is, copy "height" number of lines of "bytewidth" bytes each.
+ * The first byte of each successive line is separated by *_linesize
+ * bytes.
+ *
+ * @param dst_linesize linesize for the image plane in dst
+ * @param src_linesize linesize for the image plane in src
+ */
+void av_image_copy_plane(uint8_t *dst, int dst_linesize,
+ const uint8_t *src, int src_linesize,
+ int bytewidth, int height);
+
+/**
+ * Copy image in src_data to dst_data.
+ *
+ * @param dst_linesizes linesizes for the image in dst_data
+ * @param src_linesizes linesizes for the image in src_data
+ */
+void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
+ const uint8_t *src_data[4], const int src_linesizes[4],
+ enum PixelFormat pix_fmt, int width, int height);
+
+/**
+ * Check if the given dimension of an image is valid, meaning that all
+ * bytes of the image can be addressed with a signed int.
+ *
+ * @param w the width of the picture
+ * @param h the height of the picture
+ * @param log_offset the offset to sum to the log level for logging with log_ctx
+ * @param log_ctx the parent logging context, it may be NULL
+ * @return >= 0 if valid, a negative error code otherwise
+ */
+int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);
+
+int ff_set_systematic_pal2(uint32_t pal[256], enum PixelFormat pix_fmt);
+
+/**
+ * @}
+ */
+
+
+#endif /* AVUTIL_IMGUTILS_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat.h
new file mode 100644
index 000000000..9db624a6c
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2011 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_H
+#define AVUTIL_INTFLOAT_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+union av_intfloat32 {
+ uint32_t i;
+ float f;
+};
+
+union av_intfloat64 {
+ uint64_t i;
+ double f;
+};
+
+/**
+ * Reinterpret a 32-bit integer as a float.
+ */
+static av_always_inline float av_int2float(uint32_t i)
+{
+ union av_intfloat32 v = { .i = i };
+ return v.f;
+}
+
+/**
+ * Reinterpret a float as a 32-bit integer.
+ */
+static av_always_inline uint32_t av_float2int(float f)
+{
+ union av_intfloat32 v = { .f = f };
+ return v.i;
+}
+
+/**
+ * Reinterpret a 64-bit integer as a double.
+ */
+static av_always_inline double av_int2double(uint64_t i)
+{
+ union av_intfloat64 v = { .i = i };
+ return v.f;
+}
+
+/**
+ * Reinterpret a double as a 64-bit integer.
+ */
+static av_always_inline uint64_t av_double2int(double f)
+{
+ union av_intfloat64 v = { .f = f };
+ return v.i;
+}
+
+#endif /* AVUTIL_INTFLOAT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat_readwrite.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat_readwrite.h
new file mode 100644
index 000000000..f093b92cd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/intfloat_readwrite.h
@@ -0,0 +1,40 @@
+/*
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_READWRITE_H
+#define AVUTIL_INTFLOAT_READWRITE_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+/* IEEE 80 bits extended float */
+typedef struct AVExtFloat {
+ uint8_t exponent[2];
+ uint8_t mantissa[8];
+} AVExtFloat;
+
+attribute_deprecated double av_int2dbl(int64_t v) av_const;
+attribute_deprecated float av_int2flt(int32_t v) av_const;
+attribute_deprecated double av_ext2dbl(const AVExtFloat ext) av_const;
+attribute_deprecated int64_t av_dbl2int(double d) av_const;
+attribute_deprecated int32_t av_flt2int(float d) av_const;
+attribute_deprecated AVExtFloat av_dbl2ext(double d) av_const;
+
+#endif /* AVUTIL_INTFLOAT_READWRITE_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/intreadwrite.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/intreadwrite.h
new file mode 100644
index 000000000..01eb27804
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/intreadwrite.h
@@ -0,0 +1,522 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTREADWRITE_H
+#define AVUTIL_INTREADWRITE_H
+
+#include <stdint.h>
+#include "libavutil/avconfig.h"
+#include "attributes.h"
+#include "bswap.h"
+
+typedef union {
+ uint64_t u64;
+ uint32_t u32[2];
+ uint16_t u16[4];
+ uint8_t u8 [8];
+ double f64;
+ float f32[2];
+} av_alias av_alias64;
+
+typedef union {
+ uint32_t u32;
+ uint16_t u16[2];
+ uint8_t u8 [4];
+ float f32;
+} av_alias av_alias32;
+
+typedef union {
+ uint16_t u16;
+ uint8_t u8 [2];
+} av_alias av_alias16;
+
+/*
+ * Arch-specific headers can provide any combination of
+ * AV_[RW][BLN](16|24|32|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.
+ * Preprocessor symbols must be defined, even if these are implemented
+ * as inline functions.
+ */
+
+#ifdef HAVE_AV_CONFIG_H
+
+#include "config.h"
+
+#if ARCH_ARM
+# include "arm/intreadwrite.h"
+#elif ARCH_AVR32
+# include "avr32/intreadwrite.h"
+#elif ARCH_MIPS
+# include "mips/intreadwrite.h"
+#elif ARCH_PPC
+# include "ppc/intreadwrite.h"
+#elif ARCH_TOMI
+# include "tomi/intreadwrite.h"
+#elif ARCH_X86
+# include "x86/intreadwrite.h"
+#endif
+
+#endif /* HAVE_AV_CONFIG_H */
+
+/*
+ * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
+ */
+
+#if AV_HAVE_BIGENDIAN
+
+# if defined(AV_RN16) && !defined(AV_RB16)
+# define AV_RB16(p) AV_RN16(p)
+# elif !defined(AV_RN16) && defined(AV_RB16)
+# define AV_RN16(p) AV_RB16(p)
+# endif
+
+# if defined(AV_WN16) && !defined(AV_WB16)
+# define AV_WB16(p, v) AV_WN16(p, v)
+# elif !defined(AV_WN16) && defined(AV_WB16)
+# define AV_WN16(p, v) AV_WB16(p, v)
+# endif
+
+# if defined(AV_RN24) && !defined(AV_RB24)
+# define AV_RB24(p) AV_RN24(p)
+# elif !defined(AV_RN24) && defined(AV_RB24)
+# define AV_RN24(p) AV_RB24(p)
+# endif
+
+# if defined(AV_WN24) && !defined(AV_WB24)
+# define AV_WB24(p, v) AV_WN24(p, v)
+# elif !defined(AV_WN24) && defined(AV_WB24)
+# define AV_WN24(p, v) AV_WB24(p, v)
+# endif
+
+# if defined(AV_RN32) && !defined(AV_RB32)
+# define AV_RB32(p) AV_RN32(p)
+# elif !defined(AV_RN32) && defined(AV_RB32)
+# define AV_RN32(p) AV_RB32(p)
+# endif
+
+# if defined(AV_WN32) && !defined(AV_WB32)
+# define AV_WB32(p, v) AV_WN32(p, v)
+# elif !defined(AV_WN32) && defined(AV_WB32)
+# define AV_WN32(p, v) AV_WB32(p, v)
+# endif
+
+# if defined(AV_RN64) && !defined(AV_RB64)
+# define AV_RB64(p) AV_RN64(p)
+# elif !defined(AV_RN64) && defined(AV_RB64)
+# define AV_RN64(p) AV_RB64(p)
+# endif
+
+# if defined(AV_WN64) && !defined(AV_WB64)
+# define AV_WB64(p, v) AV_WN64(p, v)
+# elif !defined(AV_WN64) && defined(AV_WB64)
+# define AV_WN64(p, v) AV_WB64(p, v)
+# endif
+
+#else /* AV_HAVE_BIGENDIAN */
+
+# if defined(AV_RN16) && !defined(AV_RL16)
+# define AV_RL16(p) AV_RN16(p)
+# elif !defined(AV_RN16) && defined(AV_RL16)
+# define AV_RN16(p) AV_RL16(p)
+# endif
+
+# if defined(AV_WN16) && !defined(AV_WL16)
+# define AV_WL16(p, v) AV_WN16(p, v)
+# elif !defined(AV_WN16) && defined(AV_WL16)
+# define AV_WN16(p, v) AV_WL16(p, v)
+# endif
+
+# if defined(AV_RN24) && !defined(AV_RL24)
+# define AV_RL24(p) AV_RN24(p)
+# elif !defined(AV_RN24) && defined(AV_RL24)
+# define AV_RN24(p) AV_RL24(p)
+# endif
+
+# if defined(AV_WN24) && !defined(AV_WL24)
+# define AV_WL24(p, v) AV_WN24(p, v)
+# elif !defined(AV_WN24) && defined(AV_WL24)
+# define AV_WN24(p, v) AV_WL24(p, v)
+# endif
+
+# if defined(AV_RN32) && !defined(AV_RL32)
+# define AV_RL32(p) AV_RN32(p)
+# elif !defined(AV_RN32) && defined(AV_RL32)
+# define AV_RN32(p) AV_RL32(p)
+# endif
+
+# if defined(AV_WN32) && !defined(AV_WL32)
+# define AV_WL32(p, v) AV_WN32(p, v)
+# elif !defined(AV_WN32) && defined(AV_WL32)
+# define AV_WN32(p, v) AV_WL32(p, v)
+# endif
+
+# if defined(AV_RN64) && !defined(AV_RL64)
+# define AV_RL64(p) AV_RN64(p)
+# elif !defined(AV_RN64) && defined(AV_RL64)
+# define AV_RN64(p) AV_RL64(p)
+# endif
+
+# if defined(AV_WN64) && !defined(AV_WL64)
+# define AV_WL64(p, v) AV_WN64(p, v)
+# elif !defined(AV_WN64) && defined(AV_WL64)
+# define AV_WN64(p, v) AV_WL64(p, v)
+# endif
+
+#endif /* !AV_HAVE_BIGENDIAN */
+
+/*
+ * Define AV_[RW]N helper macros to simplify definitions not provided
+ * by per-arch headers.
+ */
+
+#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__)
+
+union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;
+union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;
+union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
+
+# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l)
+# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v))
+
+#elif defined(__DECC)
+
+# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))
+# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v))
+
+#elif AV_HAVE_FAST_UNALIGNED
+
+# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s)
+# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v))
+
+#else
+
+#ifndef AV_RB16
+# define AV_RB16(x) \
+ ((((const uint8_t*)(x))[0] << 8) | \
+ ((const uint8_t*)(x))[1])
+#endif
+#ifndef AV_WB16
+# define AV_WB16(p, d) do { \
+ ((uint8_t*)(p))[1] = (d); \
+ ((uint8_t*)(p))[0] = (d)>>8; \
+ } while(0)
+#endif
+
+#ifndef AV_RL16
+# define AV_RL16(x) \
+ ((((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL16
+# define AV_WL16(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ } while(0)
+#endif
+
+#ifndef AV_RB32
+# define AV_RB32(x) \
+ (((uint32_t)((const uint8_t*)(x))[0] << 24) | \
+ (((const uint8_t*)(x))[1] << 16) | \
+ (((const uint8_t*)(x))[2] << 8) | \
+ ((const uint8_t*)(x))[3])
+#endif
+#ifndef AV_WB32
+# define AV_WB32(p, d) do { \
+ ((uint8_t*)(p))[3] = (d); \
+ ((uint8_t*)(p))[2] = (d)>>8; \
+ ((uint8_t*)(p))[1] = (d)>>16; \
+ ((uint8_t*)(p))[0] = (d)>>24; \
+ } while(0)
+#endif
+
+#ifndef AV_RL32
+# define AV_RL32(x) \
+ (((uint32_t)((const uint8_t*)(x))[3] << 24) | \
+ (((const uint8_t*)(x))[2] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL32
+# define AV_WL32(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ ((uint8_t*)(p))[3] = (d)>>24; \
+ } while(0)
+#endif
+
+#ifndef AV_RB64
+# define AV_RB64(x) \
+ (((uint64_t)((const uint8_t*)(x))[0] << 56) | \
+ ((uint64_t)((const uint8_t*)(x))[1] << 48) | \
+ ((uint64_t)((const uint8_t*)(x))[2] << 40) | \
+ ((uint64_t)((const uint8_t*)(x))[3] << 32) | \
+ ((uint64_t)((const uint8_t*)(x))[4] << 24) | \
+ ((uint64_t)((const uint8_t*)(x))[5] << 16) | \
+ ((uint64_t)((const uint8_t*)(x))[6] << 8) | \
+ (uint64_t)((const uint8_t*)(x))[7])
+#endif
+#ifndef AV_WB64
+# define AV_WB64(p, d) do { \
+ ((uint8_t*)(p))[7] = (d); \
+ ((uint8_t*)(p))[6] = (d)>>8; \
+ ((uint8_t*)(p))[5] = (d)>>16; \
+ ((uint8_t*)(p))[4] = (d)>>24; \
+ ((uint8_t*)(p))[3] = (d)>>32; \
+ ((uint8_t*)(p))[2] = (d)>>40; \
+ ((uint8_t*)(p))[1] = (d)>>48; \
+ ((uint8_t*)(p))[0] = (d)>>56; \
+ } while(0)
+#endif
+
+#ifndef AV_RL64
+# define AV_RL64(x) \
+ (((uint64_t)((const uint8_t*)(x))[7] << 56) | \
+ ((uint64_t)((const uint8_t*)(x))[6] << 48) | \
+ ((uint64_t)((const uint8_t*)(x))[5] << 40) | \
+ ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
+ ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
+ ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
+ ((uint64_t)((const uint8_t*)(x))[1] << 8) | \
+ (uint64_t)((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL64
+# define AV_WL64(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ ((uint8_t*)(p))[3] = (d)>>24; \
+ ((uint8_t*)(p))[4] = (d)>>32; \
+ ((uint8_t*)(p))[5] = (d)>>40; \
+ ((uint8_t*)(p))[6] = (d)>>48; \
+ ((uint8_t*)(p))[7] = (d)>>56; \
+ } while(0)
+#endif
+
+#if AV_HAVE_BIGENDIAN
+# define AV_RN(s, p) AV_RB##s(p)
+# define AV_WN(s, p, v) AV_WB##s(p, v)
+#else
+# define AV_RN(s, p) AV_RL##s(p)
+# define AV_WN(s, p, v) AV_WL##s(p, v)
+#endif
+
+#endif /* HAVE_FAST_UNALIGNED */
+
+#ifndef AV_RN16
+# define AV_RN16(p) AV_RN(16, p)
+#endif
+
+#ifndef AV_RN32
+# define AV_RN32(p) AV_RN(32, p)
+#endif
+
+#ifndef AV_RN64
+# define AV_RN64(p) AV_RN(64, p)
+#endif
+
+#ifndef AV_WN16
+# define AV_WN16(p, v) AV_WN(16, p, v)
+#endif
+
+#ifndef AV_WN32
+# define AV_WN32(p, v) AV_WN(32, p, v)
+#endif
+
+#ifndef AV_WN64
+# define AV_WN64(p, v) AV_WN(64, p, v)
+#endif
+
+#if AV_HAVE_BIGENDIAN
+# define AV_RB(s, p) AV_RN##s(p)
+# define AV_WB(s, p, v) AV_WN##s(p, v)
+# define AV_RL(s, p) av_bswap##s(AV_RN##s(p))
+# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v))
+#else
+# define AV_RB(s, p) av_bswap##s(AV_RN##s(p))
+# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v))
+# define AV_RL(s, p) AV_RN##s(p)
+# define AV_WL(s, p, v) AV_WN##s(p, v)
+#endif
+
+#define AV_RB8(x) (((const uint8_t*)(x))[0])
+#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
+
+#define AV_RL8(x) AV_RB8(x)
+#define AV_WL8(p, d) AV_WB8(p, d)
+
+#ifndef AV_RB16
+# define AV_RB16(p) AV_RB(16, p)
+#endif
+#ifndef AV_WB16
+# define AV_WB16(p, v) AV_WB(16, p, v)
+#endif
+
+#ifndef AV_RL16
+# define AV_RL16(p) AV_RL(16, p)
+#endif
+#ifndef AV_WL16
+# define AV_WL16(p, v) AV_WL(16, p, v)
+#endif
+
+#ifndef AV_RB32
+# define AV_RB32(p) AV_RB(32, p)
+#endif
+#ifndef AV_WB32
+# define AV_WB32(p, v) AV_WB(32, p, v)
+#endif
+
+#ifndef AV_RL32
+# define AV_RL32(p) AV_RL(32, p)
+#endif
+#ifndef AV_WL32
+# define AV_WL32(p, v) AV_WL(32, p, v)
+#endif
+
+#ifndef AV_RB64
+# define AV_RB64(p) AV_RB(64, p)
+#endif
+#ifndef AV_WB64
+# define AV_WB64(p, v) AV_WB(64, p, v)
+#endif
+
+#ifndef AV_RL64
+# define AV_RL64(p) AV_RL(64, p)
+#endif
+#ifndef AV_WL64
+# define AV_WL64(p, v) AV_WL(64, p, v)
+#endif
+
+#ifndef AV_RB24
+# define AV_RB24(x) \
+ ((((const uint8_t*)(x))[0] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[2])
+#endif
+#ifndef AV_WB24
+# define AV_WB24(p, d) do { \
+ ((uint8_t*)(p))[2] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[0] = (d)>>16; \
+ } while(0)
+#endif
+
+#ifndef AV_RL24
+# define AV_RL24(x) \
+ ((((const uint8_t*)(x))[2] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL24
+# define AV_WL24(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ } while(0)
+#endif
+
+/*
+ * The AV_[RW]NA macros access naturally aligned data
+ * in a type-safe way.
+ */
+
+#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s)
+#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v))
+
+#ifndef AV_RN16A
+# define AV_RN16A(p) AV_RNA(16, p)
+#endif
+
+#ifndef AV_RN32A
+# define AV_RN32A(p) AV_RNA(32, p)
+#endif
+
+#ifndef AV_RN64A
+# define AV_RN64A(p) AV_RNA(64, p)
+#endif
+
+#ifndef AV_WN16A
+# define AV_WN16A(p, v) AV_WNA(16, p, v)
+#endif
+
+#ifndef AV_WN32A
+# define AV_WN32A(p, v) AV_WNA(32, p, v)
+#endif
+
+#ifndef AV_WN64A
+# define AV_WN64A(p, v) AV_WNA(64, p, v)
+#endif
+
+/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
+ * naturally aligned. They may be implemented using MMX,
+ * so emms_c() must be called before using any float code
+ * afterwards.
+ */
+
+#define AV_COPY(n, d, s) \
+ (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)
+
+#ifndef AV_COPY16
+# define AV_COPY16(d, s) AV_COPY(16, d, s)
+#endif
+
+#ifndef AV_COPY32
+# define AV_COPY32(d, s) AV_COPY(32, d, s)
+#endif
+
+#ifndef AV_COPY64
+# define AV_COPY64(d, s) AV_COPY(64, d, s)
+#endif
+
+#ifndef AV_COPY128
+# define AV_COPY128(d, s) \
+ do { \
+ AV_COPY64(d, s); \
+ AV_COPY64((char*)(d)+8, (char*)(s)+8); \
+ } while(0)
+#endif
+
+#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b))
+
+#ifndef AV_SWAP64
+# define AV_SWAP64(a, b) AV_SWAP(64, a, b)
+#endif
+
+#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0)
+
+#ifndef AV_ZERO16
+# define AV_ZERO16(d) AV_ZERO(16, d)
+#endif
+
+#ifndef AV_ZERO32
+# define AV_ZERO32(d) AV_ZERO(32, d)
+#endif
+
+#ifndef AV_ZERO64
+# define AV_ZERO64(d) AV_ZERO(64, d)
+#endif
+
+#ifndef AV_ZERO128
+# define AV_ZERO128(d) \
+ do { \
+ AV_ZERO64(d); \
+ AV_ZERO64((char*)(d)+8); \
+ } while(0)
+#endif
+
+#endif /* AVUTIL_INTREADWRITE_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/lfg.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/lfg.h
new file mode 100644
index 000000000..904d00a66
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/lfg.h
@@ -0,0 +1,62 @@
+/*
+ * Lagged Fibonacci PRNG
+ * Copyright (c) 2008 Michael Niedermayer
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LFG_H
+#define AVUTIL_LFG_H
+
+typedef struct {
+ unsigned int state[64];
+ int index;
+} AVLFG;
+
+void av_lfg_init(AVLFG *c, unsigned int seed);
+
+/**
+ * Get the next random unsigned 32-bit number using an ALFG.
+ *
+ * Please also consider a simple LCG like state= state*1664525+1013904223,
+ * it may be good enough and faster for your specific use case.
+ */
+static inline unsigned int av_lfg_get(AVLFG *c){
+ c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
+ return c->state[c->index++ & 63];
+}
+
+/**
+ * Get the next random unsigned 32-bit number using a MLFG.
+ *
+ * Please also consider av_lfg_get() above, it is faster.
+ */
+static inline unsigned int av_mlfg_get(AVLFG *c){
+ unsigned int a= c->state[(c->index-55) & 63];
+ unsigned int b= c->state[(c->index-24) & 63];
+ return c->state[c->index++ & 63] = 2*a*b+a+b;
+}
+
+/**
+ * Get the next two numbers generated by a Box-Muller Gaussian
+ * generator using the random numbers issued by lfg.
+ *
+ * @param out array where the two generated numbers are placed
+ */
+void av_bmg_get(AVLFG *lfg, double out[2]);
+
+#endif /* AVUTIL_LFG_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/log.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/log.h
new file mode 100644
index 000000000..0678e1a3b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/log.h
@@ -0,0 +1,172 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LOG_H
+#define AVUTIL_LOG_H
+
+#include <stdarg.h>
+#include "avutil.h"
+#include "attributes.h"
+
+/**
+ * Describe the class of an AVClass context structure. That is an
+ * arbitrary struct of which the first field is a pointer to an
+ * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
+ */
+typedef struct AVClass {
+ /**
+ * The name of the class; usually it is the same name as the
+ * context structure type to which the AVClass is associated.
+ */
+ const char* class_name;
+
+ /**
+ * A pointer to a function which returns the name of a context
+ * instance ctx associated with the class.
+ */
+ const char* (*item_name)(void* ctx);
+
+ /**
+ * a pointer to the first option specified in the class if any or NULL
+ *
+ * @see av_set_default_options()
+ */
+ const struct AVOption *option;
+
+ /**
+ * LIBAVUTIL_VERSION with which this structure was created.
+ * This is used to allow fields to be added without requiring major
+ * version bumps everywhere.
+ */
+
+ int version;
+
+ /**
+ * Offset in the structure where log_level_offset is stored.
+ * 0 means there is no such variable
+ */
+ int log_level_offset_offset;
+
+ /**
+ * Offset in the structure where a pointer to the parent context for loging is stored.
+ * for example a decoder that uses eval.c could pass its AVCodecContext to eval as such
+ * parent context. And a av_log() implementation could then display the parent context
+ * can be NULL of course
+ */
+ int parent_log_context_offset;
+
+ /**
+ * Return next AVOptions-enabled child or NULL
+ */
+ void* (*child_next)(void *obj, void *prev);
+
+ /**
+ * Return an AVClass corresponding to next potential
+ * AVOptions-enabled child.
+ *
+ * The difference between child_next and this is that
+ * child_next iterates over _already existing_ objects, while
+ * child_class_next iterates over _all possible_ children.
+ */
+ const struct AVClass* (*child_class_next)(const struct AVClass *prev);
+} AVClass;
+
+/* av_log API */
+
+#define AV_LOG_QUIET -8
+
+/**
+ * Something went really wrong and we will crash now.
+ */
+#define AV_LOG_PANIC 0
+
+/**
+ * Something went wrong and recovery is not possible.
+ * For example, no header was found for a format which depends
+ * on headers or an illegal combination of parameters is used.
+ */
+#define AV_LOG_FATAL 8
+
+/**
+ * Something went wrong and cannot losslessly be recovered.
+ * However, not all future data is affected.
+ */
+#define AV_LOG_ERROR 16
+
+/**
+ * Something somehow does not look correct. This may or may not
+ * lead to problems. An example would be the use of '-vstrict -2'.
+ */
+#define AV_LOG_WARNING 24
+
+#define AV_LOG_INFO 32
+#define AV_LOG_VERBOSE 40
+
+/**
+ * Stuff which is only useful for libav* developers.
+ */
+#define AV_LOG_DEBUG 48
+
+/**
+ * Send the specified message to the log if the level is less than or equal
+ * to the current av_log_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different av_vlog callback
+ * function.
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message, lower values signifying
+ * higher importance.
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ * @see av_vlog
+ */
+void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
+
+void av_vlog(void *avcl, int level, const char *fmt, va_list);
+int av_log_get_level(void);
+void av_log_set_level(int);
+void av_log_set_callback(void (*)(void*, int, const char*, va_list));
+void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl);
+const char* av_default_item_name(void* ctx);
+
+/**
+ * av_dlog macros
+ * Useful to print debug messages that shouldn't get compiled in normally.
+ */
+
+#ifdef DEBUG
+# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
+#else
+# define av_dlog(pctx, ...)
+#endif
+
+/**
+ * Skip repeated messages, this requires the user app to use av_log() instead of
+ * (f)printf as the 2 would otherwise interfere and lead to
+ * "Last message repeated x times" messages below (f)printf messages with some
+ * bad luck.
+ * Also to receive the last, "last repeated" line if any, the user app must
+ * call av_log(NULL, AV_LOG_QUIET, ""); at the end
+ */
+#define AV_LOG_SKIP_REPEATED 1
+void av_log_set_flags(int arg);
+
+#endif /* AVUTIL_LOG_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/lzo.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/lzo.h
new file mode 100644
index 000000000..1b774a53b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/lzo.h
@@ -0,0 +1,77 @@
+/*
+ * LZO 1x decompression
+ * copyright (c) 2006 Reimar Doeffinger
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LZO_H
+#define AVUTIL_LZO_H
+
+/**
+ * @defgroup lavu_lzo LZO
+ * @ingroup lavu_crypto
+ *
+ * @{
+ */
+
+#include <stdint.h>
+
+/** @name Error flags returned by av_lzo1x_decode
+ * @{ */
+/// end of the input buffer reached before decoding finished
+#define AV_LZO_INPUT_DEPLETED 1
+/// decoded data did not fit into output buffer
+#define AV_LZO_OUTPUT_FULL 2
+/// a reference to previously decoded data was wrong
+#define AV_LZO_INVALID_BACKPTR 4
+/// a non-specific error in the compressed bitstream
+#define AV_LZO_ERROR 8
+/** @} */
+
+#define AV_LZO_INPUT_PADDING 8
+#define AV_LZO_OUTPUT_PADDING 12
+
+/**
+ * @brief Decodes LZO 1x compressed data.
+ * @param out output buffer
+ * @param outlen size of output buffer, number of bytes left are returned here
+ * @param in input buffer
+ * @param inlen size of input buffer, number of bytes left are returned here
+ * @return 0 on success, otherwise a combination of the error flags above
+ *
+ * Make sure all buffers are appropriately padded, in must provide
+ * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes.
+ */
+int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);
+
+/**
+ * @brief deliberately overlapping memcpy implementation
+ * @param dst destination buffer; must be padded with 12 additional bytes
+ * @param back how many bytes back we start (the initial size of the overlapping window)
+ * @param cnt number of bytes to copy, must be >= 0
+ *
+ * cnt > back is valid, this will copy the bytes we just copied,
+ * thus creating a repeating pattern with a period length of back.
+ */
+void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_LZO_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/mathematics.h
new file mode 100644
index 000000000..0b072ebe6
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/mathematics.h
@@ -0,0 +1,122 @@
+/*
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MATHEMATICS_H
+#define AVUTIL_MATHEMATICS_H
+
+#include <stdint.h>
+#include <math.h>
+#include "attributes.h"
+#include "rational.h"
+
+#ifndef M_E
+#define M_E 2.7182818284590452354 /* e */
+#endif
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530942 /* log_e 2 */
+#endif
+#ifndef M_LN10
+#define M_LN10 2.30258509299404568402 /* log_e 10 */
+#endif
+#ifndef M_LOG2_10
+#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
+#endif
+#ifndef M_PHI
+#define M_PHI 1.61803398874989484820 /* phi / golden ratio */
+#endif
+#ifndef M_PI
+#define M_PI 3.14159265358979323846 /* pi */
+#endif
+#ifndef M_SQRT1_2
+#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
+#endif
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
+#endif
+#ifndef NAN
+#define NAN (0.0/0.0)
+#endif
+#ifndef INFINITY
+#define INFINITY (1.0/0.0)
+#endif
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+
+enum AVRounding {
+ AV_ROUND_ZERO = 0, ///< Round toward zero.
+ AV_ROUND_INF = 1, ///< Round away from zero.
+ AV_ROUND_DOWN = 2, ///< Round toward -infinity.
+ AV_ROUND_UP = 3, ///< Round toward +infinity.
+ AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
+};
+
+/**
+ * Return the greatest common divisor of a and b.
+ * If both a and b are 0 or either or both are <0 then behavior is
+ * undefined.
+ */
+int64_t av_const av_gcd(int64_t a, int64_t b);
+
+/**
+ * Rescale a 64-bit integer with rounding to nearest.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
+
+/**
+ * Rescale a 64-bit integer with specified rounding.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers.
+ */
+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
+
+/**
+ * Compare 2 timestamps each in its own timebases.
+ * The result of the function is undefined if one of the timestamps
+ * is outside the int64_t range when represented in the others timebase.
+ * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position
+ */
+int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
+
+/**
+ * Compare 2 integers modulo mod.
+ * That is we compare integers a and b for which only the least
+ * significant log2(mod) bits are known.
+ *
+ * @param mod must be a power of 2
+ * @return a negative value if a is smaller than b
+ * a positive value if a is greater than b
+ * 0 if a equals b
+ */
+int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MATHEMATICS_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/md5.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/md5.h
new file mode 100644
index 000000000..1412ee240
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/md5.h
@@ -0,0 +1,46 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MD5_H
+#define AVUTIL_MD5_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_md5 MD5
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+extern const int av_md5_size;
+
+struct AVMD5;
+
+void av_md5_init(struct AVMD5 *ctx);
+void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, const int len);
+void av_md5_final(struct AVMD5 *ctx, uint8_t *dst);
+void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MD5_H */
+
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/mem.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/mem.h
new file mode 100644
index 000000000..cd8490b2d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/mem.h
@@ -0,0 +1,136 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * memory handling functions
+ */
+
+#ifndef AVUTIL_MEM_H
+#define AVUTIL_MEM_H
+
+#include "attributes.h"
+#include "avutil.h"
+
+/**
+ * @addtogroup lavu_mem
+ * @{
+ */
+
+
+#if defined(__ICC) && _ICC < 1200 || defined(__SUNPRO_C)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v
+#elif defined(__TI_COMPILER_VERSION__)
+ #define DECLARE_ALIGNED(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ t __attribute__((aligned(n))) v
+ #define DECLARE_ASM_CONST(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ static const t __attribute__((aligned(n))) v
+#elif defined(__GNUC__)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v
+#elif defined(_MSC_VER)
+ #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
+ #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v
+#else
+ #define DECLARE_ALIGNED(n,t,v) t v
+ #define DECLARE_ASM_CONST(n,t,v) static const t v
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+ #define av_malloc_attrib __attribute__((__malloc__))
+#else
+ #define av_malloc_attrib
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+ #define av_alloc_size(n) __attribute__((alloc_size(n)))
+#else
+ #define av_alloc_size(n)
+#endif
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU).
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ */
+void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Allocate or reallocate a block of memory.
+ * If ptr is NULL and size > 0, allocate a new block. If
+ * size is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a memory block already allocated with
+ * av_malloc(z)() or av_realloc() or NULL.
+ * @param size Size in bytes for the memory block to be allocated or
+ * reallocated.
+ * @return Pointer to a newly reallocated block or NULL if the block
+ * cannot be reallocated or the function is used to free the memory block.
+ * @see av_fast_realloc()
+ */
+void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc().
+ * @param ptr Pointer to the memory block which should be freed.
+ * @note ptr = NULL is explicitly allowed.
+ * @note It is recommended that you use av_freep() instead.
+ * @see av_freep()
+ */
+void av_free(void *ptr);
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU) and
+ * zero all the bytes of the block.
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if it cannot be allocated.
+ * @see av_malloc()
+ */
+void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Duplicate the string s.
+ * @param s string to be duplicated
+ * @return Pointer to a newly allocated string containing a
+ * copy of s or NULL if the string cannot be allocated.
+ */
+char *av_strdup(const char *s) av_malloc_attrib;
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc() and set the pointer pointing to it to NULL.
+ * @param ptr Pointer to the pointer to the memory block which should
+ * be freed.
+ * @see av_free()
+ */
+void av_freep(void *ptr);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MEM_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/old_pix_fmts.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/old_pix_fmts.h
new file mode 100644
index 000000000..57b699220
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/old_pix_fmts.h
@@ -0,0 +1,171 @@
+/*
+ * copyright (c) 2006-2012 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_OLD_PIX_FMTS_H
+#define AVUTIL_OLD_PIX_FMTS_H
+
+/*
+ * This header exists to prevent new pixel formats from being accidentally added
+ * to the deprecated list.
+ * Do not include it directly. It will be removed on next major bump
+ *
+ * Do not add new items to this list. Use the AVPixelFormat enum instead.
+ */
+ PIX_FMT_NONE = AV_PIX_FMT_NONE,
+ PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ PIX_FMT_GRAY8, ///< Y , 8bpp
+ PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette
+ PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range
+ PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range
+ PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range
+ PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ PIX_FMT_XVMC_MPEG2_IDCT,
+ PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range
+ PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+ PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0
+ PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0
+
+ PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1
+ PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1
+
+ PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+
+ PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
+ PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
+ PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
+ PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
+ PIX_FMT_GRAY8A, ///< 8bit gray, 8bit alpha
+ PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+
+ //the following 10 formats have the disadvantage of needing 1 format for each bit depth, thus
+ //If you want to support multiple bit depths, then using PIX_FMT_YUV420P16* with the bpp stored separately
+ //is better
+ PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+
+#ifdef AV_PIX_FMT_ABI_GIT_MASTER
+ PIX_FMT_RGBA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+ PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+ PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+ PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+#endif
+ PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big endian
+ PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little endian
+ PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big endian
+ PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little endian
+ PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big endian
+ PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little endian
+
+#ifndef AV_PIX_FMT_ABI_GIT_MASTER
+ PIX_FMT_RGBA64BE=0x123, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+ PIX_FMT_RGBA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+ PIX_FMT_BGRA64BE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
+ PIX_FMT_BGRA64LE, ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
+#endif
+ PIX_FMT_0RGB=0x123+4, ///< packed RGB 8:8:8, 32bpp, 0RGB0RGB...
+ PIX_FMT_RGB0, ///< packed RGB 8:8:8, 32bpp, RGB0RGB0...
+ PIX_FMT_0BGR, ///< packed BGR 8:8:8, 32bpp, 0BGR0BGR...
+ PIX_FMT_BGR0, ///< packed BGR 8:8:8, 32bpp, BGR0BGR0...
+ PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
+ PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
+
+ PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_GBRP12BE, ///< planar GBR 4:4:4 36bpp, big endian
+ PIX_FMT_GBRP12LE, ///< planar GBR 4:4:4 36bpp, little endian
+ PIX_FMT_GBRP14BE, ///< planar GBR 4:4:4 42bpp, big endian
+ PIX_FMT_GBRP14LE, ///< planar GBR 4:4:4 42bpp, little endian
+
+ PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+#endif /* AVUTIL_OLD_PIX_FMTS_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/opt.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/opt.h
new file mode 100644
index 000000000..19549408e
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/opt.h
@@ -0,0 +1,591 @@
+/*
+ * AVOptions
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_OPT_H
+#define AVUTIL_OPT_H
+
+/**
+ * @file
+ * AVOptions
+ */
+
+#include "rational.h"
+#include "avutil.h"
+#include "dict.h"
+#include "log.h"
+
+/**
+ * @defgroup avoptions AVOptions
+ * @ingroup lavu_data
+ * @{
+ * AVOptions provide a generic system to declare options on arbitrary structs
+ * ("objects"). An option can have a help text, a type and a range of possible
+ * values. Options may then be enumerated, read and written to.
+ *
+ * @section avoptions_implement Implementing AVOptions
+ * This section describes how to add AVOptions capabilities to a struct.
+ *
+ * All AVOptions-related information is stored in an AVClass. Therefore
+ * the first member of the struct must be a pointer to an AVClass describing it.
+ * The option field of the AVClass must be set to a NULL-terminated static array
+ * of AVOptions. Each AVOption must have a non-empty name, a type, a default
+ * value and for number-type AVOptions also a range of allowed values. It must
+ * also declare an offset in bytes from the start of the struct, where the field
+ * associated with this AVOption is located. Other fields in the AVOption struct
+ * should also be set when applicable, but are not required.
+ *
+ * The following example illustrates an AVOptions-enabled struct:
+ * @code
+ * typedef struct test_struct {
+ * AVClass *class;
+ * int int_opt;
+ * char *str_opt;
+ * uint8_t *bin_opt;
+ * int bin_len;
+ * } test_struct;
+ *
+ * static const AVOption options[] = {
+ * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),
+ * AV_OPT_TYPE_INT, { -1 }, INT_MIN, INT_MAX },
+ * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),
+ * AV_OPT_TYPE_STRING },
+ * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),
+ * AV_OPT_TYPE_BINARY },
+ * { NULL },
+ * };
+ *
+ * static const AVClass test_class = {
+ * .class_name = "test class",
+ * .item_name = av_default_item_name,
+ * .option = options,
+ * .version = LIBAVUTIL_VERSION_INT,
+ * };
+ * @endcode
+ *
+ * Next, when allocating your struct, you must ensure that the AVClass pointer
+ * is set to the correct value. Then, av_opt_set_defaults() must be called to
+ * initialize defaults. After that the struct is ready to be used with the
+ * AVOptions API.
+ *
+ * When cleaning up, you may use the av_opt_free() function to automatically
+ * free all the allocated string and binary options.
+ *
+ * Continuing with the above example:
+ *
+ * @code
+ * test_struct *alloc_test_struct(void)
+ * {
+ * test_struct *ret = av_malloc(sizeof(*ret));
+ * ret->class = &test_class;
+ * av_opt_set_defaults(ret);
+ * return ret;
+ * }
+ * void free_test_struct(test_struct **foo)
+ * {
+ * av_opt_free(*foo);
+ * av_freep(foo);
+ * }
+ * @endcode
+ *
+ * @subsection avoptions_implement_nesting Nesting
+ * It may happen that an AVOptions-enabled struct contains another
+ * AVOptions-enabled struct as a member (e.g. AVCodecContext in
+ * libavcodec exports generic options, while its priv_data field exports
+ * codec-specific options). In such a case, it is possible to set up the
+ * parent struct to export a child's options. To do that, simply
+ * implement AVClass.child_next() and AVClass.child_class_next() in the
+ * parent struct's AVClass.
+ * Assuming that the test_struct from above now also contains a
+ * child_struct field:
+ *
+ * @code
+ * typedef struct child_struct {
+ * AVClass *class;
+ * int flags_opt;
+ * } child_struct;
+ * static const AVOption child_opts[] = {
+ * { "test_flags", "This is a test option of flags type.",
+ * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX },
+ * { NULL },
+ * };
+ * static const AVClass child_class = {
+ * .class_name = "child class",
+ * .item_name = av_default_item_name,
+ * .option = child_opts,
+ * .version = LIBAVUTIL_VERSION_INT,
+ * };
+ *
+ * void *child_next(void *obj, void *prev)
+ * {
+ * test_struct *t = obj;
+ * if (!prev && t->child_struct)
+ * return t->child_struct;
+ * return NULL
+ * }
+ * const AVClass child_class_next(const AVClass *prev)
+ * {
+ * return prev ? NULL : &child_class;
+ * }
+ * @endcode
+ * Putting child_next() and child_class_next() as defined above into
+ * test_class will now make child_struct's options accessible through
+ * test_struct (again, proper setup as described above needs to be done on
+ * child_struct right after it is created).
+ *
+ * From the above example it might not be clear why both child_next()
+ * and child_class_next() are needed. The distinction is that child_next()
+ * iterates over actually existing objects, while child_class_next()
+ * iterates over all possible child classes. E.g. if an AVCodecContext
+ * was initialized to use a codec which has private options, then its
+ * child_next() will return AVCodecContext.priv_data and finish
+ * iterating. OTOH child_class_next() on AVCodecContext.av_class will
+ * iterate over all available codecs with private options.
+ *
+ * @subsection avoptions_implement_named_constants Named constants
+ * It is possible to create named constants for options. Simply set the unit
+ * field of the option the constants should apply to to a string and
+ * create the constants themselves as options of type AV_OPT_TYPE_CONST
+ * with their unit field set to the same string.
+ * Their default_val field should contain the value of the named
+ * constant.
+ * For example, to add some named constants for the test_flags option
+ * above, put the following into the child_opts array:
+ * @code
+ * { "test_flags", "This is a test option of flags type.",
+ * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { 0 }, INT_MIN, INT_MAX, "test_unit" },
+ * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { 16 }, 0, 0, "test_unit" },
+ * @endcode
+ *
+ * @section avoptions_use Using AVOptions
+ * This section deals with accessing options in an AVOptions-enabled struct.
+ * Such structs in Libav are e.g. AVCodecContext in libavcodec or
+ * AVFormatContext in libavformat.
+ *
+ * @subsection avoptions_use_examine Examining AVOptions
+ * The basic functions for examining options are av_opt_next(), which iterates
+ * over all options defined for one object, and av_opt_find(), which searches
+ * for an option with the given name.
+ *
+ * The situation is more complicated with nesting. An AVOptions-enabled struct
+ * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag
+ * to av_opt_find() will make the function search children recursively.
+ *
+ * For enumerating there are basically two cases. The first is when you want to
+ * get all options that may potentially exist on the struct and its children
+ * (e.g. when constructing documentation). In that case you should call
+ * av_opt_child_class_next() recursively on the parent struct's AVClass. The
+ * second case is when you have an already initialized struct with all its
+ * children and you want to get all options that can be actually written or read
+ * from it. In that case you should call av_opt_child_next() recursively (and
+ * av_opt_next() on each result).
+ *
+ * @subsection avoptions_use_get_set Reading and writing AVOptions
+ * When setting options, you often have a string read directly from the
+ * user. In such a case, simply passing it to av_opt_set() is enough. For
+ * non-string type options, av_opt_set() will parse the string according to the
+ * option type.
+ *
+ * Similarly av_opt_get() will read any option type and convert it to a string
+ * which will be returned. Do not forget that the string is allocated, so you
+ * have to free it with av_free().
+ *
+ * In some cases it may be more convenient to put all options into an
+ * AVDictionary and call av_opt_set_dict() on it. A specific case of this
+ * are the format/codec open functions in lavf/lavc which take a dictionary
+ * filled with option as a parameter. This allows to set some options
+ * that cannot be set otherwise, since e.g. the input file format is not known
+ * before the file is actually opened.
+ */
+
+enum AVOptionType{
+ AV_OPT_TYPE_FLAGS,
+ AV_OPT_TYPE_INT,
+ AV_OPT_TYPE_INT64,
+ AV_OPT_TYPE_DOUBLE,
+ AV_OPT_TYPE_FLOAT,
+ AV_OPT_TYPE_STRING,
+ AV_OPT_TYPE_RATIONAL,
+ AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length
+ AV_OPT_TYPE_CONST = 128,
+#if FF_API_OLD_AVOPTIONS
+ FF_OPT_TYPE_FLAGS = 0,
+ FF_OPT_TYPE_INT,
+ FF_OPT_TYPE_INT64,
+ FF_OPT_TYPE_DOUBLE,
+ FF_OPT_TYPE_FLOAT,
+ FF_OPT_TYPE_STRING,
+ FF_OPT_TYPE_RATIONAL,
+ FF_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length
+ FF_OPT_TYPE_CONST=128,
+#endif
+};
+
+/**
+ * AVOption
+ */
+typedef struct AVOption {
+ const char *name;
+
+ /**
+ * short English help text
+ * @todo What about other languages?
+ */
+ const char *help;
+
+ /**
+ * The offset relative to the context structure where the option
+ * value is stored. It should be 0 for named constants.
+ */
+ int offset;
+ enum AVOptionType type;
+
+ /**
+ * the default value for scalar options
+ */
+ union {
+ double dbl;
+ const char *str;
+ /* TODO those are unused now */
+ int64_t i64;
+ AVRational q;
+ } default_val;
+ double min; ///< minimum valid value for the option
+ double max; ///< maximum valid value for the option
+
+ int flags;
+#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding
+#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding
+#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ...
+#define AV_OPT_FLAG_AUDIO_PARAM 8
+#define AV_OPT_FLAG_VIDEO_PARAM 16
+#define AV_OPT_FLAG_SUBTITLE_PARAM 32
+//FIXME think about enc-audio, ... style flags
+
+ /**
+ * The logical unit to which the option belongs. Non-constant
+ * options and corresponding named constants share the same
+ * unit. May be NULL.
+ */
+ const char *unit;
+} AVOption;
+
+#if FF_API_FIND_OPT
+/**
+ * Look for an option in obj. Look only for the options which
+ * have the flags set as specified in mask and flags (that is,
+ * for which it is the case that opt->flags & mask == flags).
+ *
+ * @param[in] obj a pointer to a struct whose first element is a
+ * pointer to an AVClass
+ * @param[in] name the name of the option to look for
+ * @param[in] unit the unit of the option to look for, or any if NULL
+ * @return a pointer to the option found, or NULL if no option
+ * has been found
+ *
+ * @deprecated use av_opt_find.
+ */
+attribute_deprecated
+const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int mask, int flags);
+#endif
+
+#if FF_API_OLD_AVOPTIONS
+/**
+ * Set the field of obj with the given name to value.
+ *
+ * @param[in] obj A struct whose first element is a pointer to an
+ * AVClass.
+ * @param[in] name the name of the field to set
+ * @param[in] val The value to set. If the field is not of a string
+ * type, then the given string is parsed.
+ * SI postfixes and some named scalars are supported.
+ * If the field is of a numeric type, it has to be a numeric or named
+ * scalar. Behavior with more than one scalar and +- infix operators
+ * is undefined.
+ * If the field is of a flags type, it has to be a sequence of numeric
+ * scalars or named flags separated by '+' or '-'. Prefixing a flag
+ * with '+' causes it to be set without affecting the other flags;
+ * similarly, '-' unsets a flag.
+ * @param[out] o_out if non-NULL put here a pointer to the AVOption
+ * found
+ * @param alloc this parameter is currently ignored
+ * @return 0 if the value has been set, or an AVERROR code in case of
+ * error:
+ * AVERROR_OPTION_NOT_FOUND if no matching option exists
+ * AVERROR(ERANGE) if the value is out of range
+ * AVERROR(EINVAL) if the value is not valid
+ * @deprecated use av_opt_set()
+ */
+attribute_deprecated
+int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out);
+
+attribute_deprecated const AVOption *av_set_double(void *obj, const char *name, double n);
+attribute_deprecated const AVOption *av_set_q(void *obj, const char *name, AVRational n);
+attribute_deprecated const AVOption *av_set_int(void *obj, const char *name, int64_t n);
+
+attribute_deprecated double av_get_double(void *obj, const char *name, const AVOption **o_out);
+attribute_deprecated AVRational av_get_q(void *obj, const char *name, const AVOption **o_out);
+attribute_deprecated int64_t av_get_int(void *obj, const char *name, const AVOption **o_out);
+attribute_deprecated const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len);
+attribute_deprecated const AVOption *av_next_option(void *obj, const AVOption *last);
+#endif
+
+/**
+ * Show the obj options.
+ *
+ * @param req_flags requested flags for the options to show. Show only the
+ * options for which it is opt->flags & req_flags.
+ * @param rej_flags rejected flags for the options to show. Show only the
+ * options for which it is !(opt->flags & req_flags).
+ * @param av_log_obj log context to use for showing the options
+ */
+int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
+
+/**
+ * Set the values of all AVOption fields to their default values.
+ *
+ * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
+ */
+void av_opt_set_defaults(void *s);
+
+#if FF_API_OLD_AVOPTIONS
+attribute_deprecated
+void av_opt_set_defaults2(void *s, int mask, int flags);
+#endif
+
+/**
+ * Parse the key/value pairs list in opts. For each key/value pair
+ * found, stores the value in the field in ctx that is named like the
+ * key. ctx must be an AVClass context, storing is done using
+ * AVOptions.
+ *
+ * @param key_val_sep a 0-terminated list of characters used to
+ * separate key from value
+ * @param pairs_sep a 0-terminated list of characters used to separate
+ * two pairs from each other
+ * @return the number of successfully set key/value pairs, or a negative
+ * value corresponding to an AVERROR code in case of error:
+ * AVERROR(EINVAL) if opts cannot be parsed,
+ * the error code issued by av_set_string3() if a key/value pair
+ * cannot be set
+ */
+int av_set_options_string(void *ctx, const char *opts,
+ const char *key_val_sep, const char *pairs_sep);
+
+/**
+ * Free all string and binary options in obj.
+ */
+void av_opt_free(void *obj);
+
+/**
+ * Check whether a particular flag is set in a flags field.
+ *
+ * @param field_name the name of the flag field option
+ * @param flag_name the name of the flag to check
+ * @return non-zero if the flag is set, zero if the flag isn't set,
+ * isn't of the right type, or the flags field doesn't exist.
+ */
+int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
+
+/*
+ * Set all the options from a given dictionary on an object.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass
+ * @param options options to process. This dictionary will be freed and replaced
+ * by a new one containing all options not found in obj.
+ * Of course this new dictionary needs to be freed by caller
+ * with av_dict_free().
+ *
+ * @return 0 on success, a negative AVERROR if some option was found in obj,
+ * but could not be set.
+ *
+ * @see av_dict_copy()
+ */
+int av_opt_set_dict(void *obj, struct AVDictionary **options);
+
+/**
+ * @defgroup opt_eval_funcs Evaluating option strings
+ * @{
+ * This group of functions can be used to evaluate option strings
+ * and get numbers out of them. They do the same thing as av_opt_set(),
+ * except the result is written into the caller-supplied pointer.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass.
+ * @param o an option for which the string is to be evaluated.
+ * @param val string to be evaluated.
+ * @param *_out value of the string will be written here.
+ *
+ * @return 0 on success, a negative number on failure.
+ */
+int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out);
+int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out);
+int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out);
+int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out);
+int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out);
+int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out);
+/**
+ * @}
+ */
+
+#define AV_OPT_SEARCH_CHILDREN 0x0001 /**< Search in possible children of the
+ given object first. */
+/**
+ * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
+ * instead of a required pointer to a struct containing AVClass. This is
+ * useful for searching for options without needing to allocate the corresponding
+ * object.
+ */
+#define AV_OPT_SEARCH_FAKE_OBJ 0x0002
+
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ * pointer to an AVClass.
+ * Alternatively a double pointer to an AVClass, if
+ * AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ * it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ * was found.
+ *
+ * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable
+ * directly with av_set_string3(). Use special calls which take an options
+ * AVDictionary (e.g. avformat_open_input()) to set options found with this
+ * flag.
+ */
+const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
+ int opt_flags, int search_flags);
+
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ * pointer to an AVClass.
+ * Alternatively a double pointer to an AVClass, if
+ * AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ * it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ * @param[out] target_obj if non-NULL, an object to which the option belongs will be
+ * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present
+ * in search_flags. This parameter is ignored if search_flags contain
+ * AV_OPT_SEARCH_FAKE_OBJ.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ * was found.
+ */
+const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
+ int opt_flags, int search_flags, void **target_obj);
+
+/**
+ * Iterate over all AVOptions belonging to obj.
+ *
+ * @param obj an AVOptions-enabled struct or a double pointer to an
+ * AVClass describing it.
+ * @param prev result of the previous call to av_opt_next() on this object
+ * or NULL
+ * @return next AVOption or NULL
+ */
+const AVOption *av_opt_next(void *obj, const AVOption *prev);
+
+/**
+ * Iterate over AVOptions-enabled children of obj.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return next AVOptions-enabled child or NULL
+ */
+void *av_opt_child_next(void *obj, void *prev);
+
+/**
+ * Iterate over potential AVOptions-enabled children of parent.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return AVClass corresponding to next potential child or NULL
+ */
+const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev);
+
+/**
+ * @defgroup opt_set_funcs Option setting functions
+ * @{
+ * Those functions set the field of obj with the given name to value.
+ *
+ * @param[in] obj A struct whose first element is a pointer to an AVClass.
+ * @param[in] name the name of the field to set
+ * @param[in] val The value to set. In case of av_opt_set() if the field is not
+ * of a string type, then the given string is parsed.
+ * SI postfixes and some named scalars are supported.
+ * If the field is of a numeric type, it has to be a numeric or named
+ * scalar. Behavior with more than one scalar and +- infix operators
+ * is undefined.
+ * If the field is of a flags type, it has to be a sequence of numeric
+ * scalars or named flags separated by '+' or '-'. Prefixing a flag
+ * with '+' causes it to be set without affecting the other flags;
+ * similarly, '-' unsets a flag.
+ * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be set on a child of obj.
+ *
+ * @return 0 if the value has been set, or an AVERROR code in case of
+ * error:
+ * AVERROR_OPTION_NOT_FOUND if no matching option exists
+ * AVERROR(ERANGE) if the value is out of range
+ * AVERROR(EINVAL) if the value is not valid
+ */
+int av_opt_set (void *obj, const char *name, const char *val, int search_flags);
+int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags);
+int av_opt_set_double(void *obj, const char *name, double val, int search_flags);
+int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags);
+/**
+ * @}
+ */
+
+/**
+ * @defgroup opt_get_funcs Option getting functions
+ * @{
+ * Those functions get a value of the option with the given name from an object.
+ *
+ * @param[in] obj a struct whose first element is a pointer to an AVClass.
+ * @param[in] name name of the option to get.
+ * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be found in a child of obj.
+ * @param[out] out_val value of the option will be written here
+ * @return 0 on success, a negative error code otherwise
+ */
+/**
+ * @note the returned string will av_malloc()ed and must be av_free()ed by the caller
+ */
+int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val);
+int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val);
+int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val);
+int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val);
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_OPT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/parseutils.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/parseutils.h
new file mode 100644
index 000000000..0844abb2f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/parseutils.h
@@ -0,0 +1,124 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PARSEUTILS_H
+#define AVUTIL_PARSEUTILS_H
+
+#include <time.h>
+
+#include "rational.h"
+
+/**
+ * @file
+ * misc parsing utilities
+ */
+
+/**
+ * Parse str and put in width_ptr and height_ptr the detected values.
+ *
+ * @param[in,out] width_ptr pointer to the variable which will contain the detected
+ * width value
+ * @param[in,out] height_ptr pointer to the variable which will contain the detected
+ * height value
+ * @param[in] str the string to parse: it has to be a string in the format
+ * width x height or a valid video size abbreviation.
+ * @return >= 0 on success, a negative error code otherwise
+ */
+int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str);
+
+/**
+ * Parse str and store the detected values in *rate.
+ *
+ * @param[in,out] rate pointer to the AVRational which will contain the detected
+ * frame rate
+ * @param[in] str the string to parse: it has to be a string in the format
+ * rate_num / rate_den, a float number or a valid video rate abbreviation
+ * @return >= 0 on success, a negative error code otherwise
+ */
+int av_parse_video_rate(AVRational *rate, const char *str);
+
+/**
+ * Put the RGBA values that correspond to color_string in rgba_color.
+ *
+ * @param color_string a string specifying a color. It can be the name of
+ * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence,
+ * possibly followed by "@" and a string representing the alpha
+ * component.
+ * The alpha component may be a string composed by "0x" followed by an
+ * hexadecimal number or a decimal number between 0.0 and 1.0, which
+ * represents the opacity value (0x00/0.0 means completely transparent,
+ * 0xff/1.0 completely opaque).
+ * If the alpha component is not specified then 0xff is assumed.
+ * The string "random" will result in a random color.
+ * @param slen length of the initial part of color_string containing the
+ * color. It can be set to -1 if color_string is a null terminated string
+ * containing nothing else than the color.
+ * @return >= 0 in case of success, a negative value in case of
+ * failure (for example if color_string cannot be parsed).
+ */
+int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
+ void *log_ctx);
+
+/**
+ * Parse timestr and return in *time a corresponding number of
+ * microseconds.
+ *
+ * @param timeval puts here the number of microseconds corresponding
+ * to the string in timestr. If the string represents a duration, it
+ * is the number of microseconds contained in the time interval. If
+ * the string is a date, is the number of microseconds since 1st of
+ * January, 1970 up to the time of the parsed date. If timestr cannot
+ * be successfully parsed, set *time to INT64_MIN.
+
+ * @param timestr a string representing a date or a duration.
+ * - If a date the syntax is:
+ * @code
+ * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z]
+ * now
+ * @endcode
+ * If the value is "now" it takes the current time.
+ * Time is local time unless Z is appended, in which case it is
+ * interpreted as UTC.
+ * If the year-month-day part is not specified it takes the current
+ * year-month-day.
+ * - If a duration the syntax is:
+ * @code
+ * [-]HH[:MM[:SS[.m...]]]
+ * [-]S+[.m...]
+ * @endcode
+ * @param duration flag which tells how to interpret timestr, if not
+ * zero timestr is interpreted as a duration, otherwise as a date
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_parse_time(int64_t *timeval, const char *timestr, int duration);
+
+/**
+ * Attempt to find a specific tag in a URL.
+ *
+ * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
+ * Return 1 if found.
+ */
+int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);
+
+/**
+ * Convert the decomposed UTC time in tm to a time_t value.
+ */
+time_t av_timegm(struct tm *tm);
+
+#endif /* AVUTIL_PARSEUTILS_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/pixdesc.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/pixdesc.h
new file mode 100644
index 000000000..b5972c78f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/pixdesc.h
@@ -0,0 +1,177 @@
+/*
+ * pixel format descriptor
+ * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXDESC_H
+#define AVUTIL_PIXDESC_H
+
+#include <inttypes.h>
+#include "pixfmt.h"
+
+typedef struct AVComponentDescriptor{
+ uint16_t plane :2; ///< which of the 4 planes contains the component
+
+ /**
+ * Number of elements between 2 horizontally consecutive pixels minus 1.
+ * Elements are bits for bitstream formats, bytes otherwise.
+ */
+ uint16_t step_minus1 :3;
+
+ /**
+ * Number of elements before the component of the first pixel plus 1.
+ * Elements are bits for bitstream formats, bytes otherwise.
+ */
+ uint16_t offset_plus1 :3;
+ uint16_t shift :3; ///< number of least significant bits that must be shifted away to get the value
+ uint16_t depth_minus1 :4; ///< number of bits in the component minus 1
+}AVComponentDescriptor;
+
+/**
+ * Descriptor that unambiguously describes how the bits of a pixel are
+ * stored in the up to 4 data planes of an image. It also stores the
+ * subsampling factors and number of components.
+ *
+ * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV
+ * and all the YUV variants) AVPixFmtDescriptor just stores how values
+ * are stored not what these values represent.
+ */
+typedef struct AVPixFmtDescriptor{
+ const char *name;
+ uint8_t nb_components; ///< The number of components each pixel has, (1-4)
+
+ /**
+ * Amount to shift the luma width right to find the chroma width.
+ * For YV12 this is 1 for example.
+ * chroma_width = -((-luma_width) >> log2_chroma_w)
+ * The note above is needed to ensure rounding up.
+ * This value only refers to the chroma components.
+ */
+ uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w)
+
+ /**
+ * Amount to shift the luma height right to find the chroma height.
+ * For YV12 this is 1 for example.
+ * chroma_height= -((-luma_height) >> log2_chroma_h)
+ * The note above is needed to ensure rounding up.
+ * This value only refers to the chroma components.
+ */
+ uint8_t log2_chroma_h;
+ uint8_t flags;
+
+ /**
+ * Parameters that describe how pixels are packed. If the format
+ * has chroma components, they must be stored in comp[1] and
+ * comp[2].
+ */
+ AVComponentDescriptor comp[4];
+}AVPixFmtDescriptor;
+
+#define PIX_FMT_BE 1 ///< Pixel format is big-endian.
+#define PIX_FMT_PAL 2 ///< Pixel format has a palette in data[1], values are indexes in this palette.
+#define PIX_FMT_BITSTREAM 4 ///< All values of a component are bit-wise packed end to end.
+#define PIX_FMT_HWACCEL 8 ///< Pixel format is an HW accelerated format.
+#define PIX_FMT_PLANAR 16 ///< At least one pixel component is not in the first data plane
+#define PIX_FMT_RGB 32 ///< The pixel format contains RGB-like data (as opposed to YUV/grayscale)
+
+/**
+ * The array of all the pixel format descriptors.
+ */
+extern const AVPixFmtDescriptor av_pix_fmt_descriptors[];
+
+/**
+ * Read a line from an image, and write the values of the
+ * pixel format component c to dst.
+ *
+ * @param data the array containing the pointers to the planes of the image
+ * @param linesize the array containing the linesizes of the image
+ * @param desc the pixel format descriptor for the image
+ * @param x the horizontal coordinate of the first pixel to read
+ * @param y the vertical coordinate of the first pixel to read
+ * @param w the width of the line to read, that is the number of
+ * values to write to dst
+ * @param read_pal_component if not zero and the format is a paletted
+ * format writes the values corresponding to the palette
+ * component c in data[1] to dst, rather than the palette indexes in
+ * data[0]. The behavior is undefined if the format is not paletted.
+ */
+void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
+ const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component);
+
+/**
+ * Write the values from src to the pixel format component c of an
+ * image line.
+ *
+ * @param src array containing the values to write
+ * @param data the array containing the pointers to the planes of the
+ * image to write into. It is supposed to be zeroed.
+ * @param linesize the array containing the linesizes of the image
+ * @param desc the pixel format descriptor for the image
+ * @param x the horizontal coordinate of the first pixel to write
+ * @param y the vertical coordinate of the first pixel to write
+ * @param w the width of the line to write, that is the number of
+ * values to write to the image line
+ */
+void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
+ const AVPixFmtDescriptor *desc, int x, int y, int c, int w);
+
+/**
+ * Return the pixel format corresponding to name.
+ *
+ * If there is no pixel format with name name, then looks for a
+ * pixel format with the name corresponding to the native endian
+ * format of name.
+ * For example in a little-endian system, first looks for "gray16",
+ * then for "gray16le".
+ *
+ * Finally if no pixel format has been found, returns PIX_FMT_NONE.
+ */
+enum PixelFormat av_get_pix_fmt(const char *name);
+
+/**
+ * Return the short name for a pixel format, NULL in case pix_fmt is
+ * unknown.
+ *
+ * @see av_get_pix_fmt(), av_get_pix_fmt_string()
+ */
+const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt);
+
+/**
+ * Print in buf the string corresponding to the pixel format with
+ * number pix_fmt, or an header if pix_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param pix_fmt the number of the pixel format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ */
+char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt);
+
+/**
+ * Return the number of bits per pixel used by the pixel format
+ * described by pixdesc.
+ *
+ * The returned number of bits refers to the number of bits actually
+ * used for storing the pixel information, that is padding bits are
+ * not counted.
+ */
+int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);
+
+#endif /* AVUTIL_PIXDESC_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/pixfmt.h
new file mode 100644
index 000000000..bd898bdc8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/pixfmt.h
@@ -0,0 +1,198 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXFMT_H
+#define AVUTIL_PIXFMT_H
+
+/**
+ * @file
+ * pixel format definitions
+ *
+ */
+
+#include "libavutil/avconfig.h"
+
+/**
+ * Pixel format.
+ *
+ * @note
+ * PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
+ * color is put together as:
+ * (A << 24) | (R << 16) | (G << 8) | B
+ * This is stored as BGRA on little-endian CPU architectures and ARGB on
+ * big-endian CPUs.
+ *
+ * @par
+ * When the pixel format is palettized RGB (PIX_FMT_PAL8), the palettized
+ * image data is stored in AVFrame.data[0]. The palette is transported in
+ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
+ * formatted the same as in PIX_FMT_RGB32 described above (i.e., it is
+ * also endian-specific). Note also that the individual RGB palette
+ * components stored in AVFrame.data[1] should be in the range 0..255.
+ * This is important as many custom PAL8 video codecs that were designed
+ * to run on the IBM VGA graphics adapter use 6-bit palette components.
+ *
+ * @par
+ * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like
+ * for pal8. This palette is filled in automatically by the function
+ * allocating the picture.
+ *
+ * @note
+ * make sure that all newly added big endian formats have pix_fmt&1==1
+ * and that all newly added little endian formats have pix_fmt&1==0
+ * this allows simpler detection of big vs little endian.
+ */
+enum PixelFormat {
+ PIX_FMT_NONE= -1,
+ PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ PIX_FMT_GRAY8, ///< Y , 8bpp
+ PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette
+ PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range
+ PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range
+ PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range
+ PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ PIX_FMT_XVMC_MPEG2_IDCT,
+ PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range
+ PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+ PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0
+ PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0
+
+ PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1
+ PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1
+
+ PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+
+ PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
+ PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
+ PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
+ PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
+ PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha
+ PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+ PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+ PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big endian
+ PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little endian
+ PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big endian
+ PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little endian
+ PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big endian
+ PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little endian
+ PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+};
+
+#if AV_HAVE_BIGENDIAN
+# define PIX_FMT_NE(be, le) PIX_FMT_##be
+#else
+# define PIX_FMT_NE(be, le) PIX_FMT_##le
+#endif
+
+#define PIX_FMT_RGB32 PIX_FMT_NE(ARGB, BGRA)
+#define PIX_FMT_RGB32_1 PIX_FMT_NE(RGBA, ABGR)
+#define PIX_FMT_BGR32 PIX_FMT_NE(ABGR, RGBA)
+#define PIX_FMT_BGR32_1 PIX_FMT_NE(BGRA, ARGB)
+
+#define PIX_FMT_GRAY16 PIX_FMT_NE(GRAY16BE, GRAY16LE)
+#define PIX_FMT_RGB48 PIX_FMT_NE(RGB48BE, RGB48LE)
+#define PIX_FMT_RGB565 PIX_FMT_NE(RGB565BE, RGB565LE)
+#define PIX_FMT_RGB555 PIX_FMT_NE(RGB555BE, RGB555LE)
+#define PIX_FMT_RGB444 PIX_FMT_NE(RGB444BE, RGB444LE)
+#define PIX_FMT_BGR48 PIX_FMT_NE(BGR48BE, BGR48LE)
+#define PIX_FMT_BGR565 PIX_FMT_NE(BGR565BE, BGR565LE)
+#define PIX_FMT_BGR555 PIX_FMT_NE(BGR555BE, BGR555LE)
+#define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE)
+
+#define PIX_FMT_YUV420P9 PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
+#define PIX_FMT_YUV422P9 PIX_FMT_NE(YUV422P9BE , YUV422P9LE)
+#define PIX_FMT_YUV444P9 PIX_FMT_NE(YUV444P9BE , YUV444P9LE)
+#define PIX_FMT_YUV420P10 PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
+#define PIX_FMT_YUV422P10 PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
+#define PIX_FMT_YUV444P10 PIX_FMT_NE(YUV444P10BE, YUV444P10LE)
+#define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
+#define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
+#define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
+
+#define PIX_FMT_GBRP9 PIX_FMT_NE(GBRP9BE , GBRP9LE)
+#define PIX_FMT_GBRP10 PIX_FMT_NE(GBRP10BE, GBRP10LE)
+#define PIX_FMT_GBRP16 PIX_FMT_NE(GBRP16BE, GBRP16LE)
+
+#endif /* AVUTIL_PIXFMT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/random_seed.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/random_seed.h
new file mode 100644
index 000000000..b1fad13d0
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/random_seed.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudurier@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_RANDOM_SEED_H
+#define AVUTIL_RANDOM_SEED_H
+
+#include <stdint.h>
+/**
+ * @addtogroup lavu_crypto
+ * @{
+ */
+
+/**
+ * Get random data.
+ *
+ * This function can be called repeatedly to generate more random bits
+ * as needed. It is generally quite slow, and usually used to seed a
+ * PRNG. As it uses /dev/urandom and /dev/random, the quality of the
+ * returned random data depends on the platform.
+ */
+uint32_t av_get_random_seed(void);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RANDOM_SEED_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/rational.h
new file mode 100644
index 000000000..0ec18ec96
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/rational.h
@@ -0,0 +1,144 @@
+/*
+ * rational numbers
+ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * rational numbers
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_RATIONAL_H
+#define AVUTIL_RATIONAL_H
+
+#include <stdint.h>
+#include <limits.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+/**
+ * rational number numerator/denominator
+ */
+typedef struct AVRational{
+ int num; ///< numerator
+ int den; ///< denominator
+} AVRational;
+
+/**
+ * Compare two rationals.
+ * @param a first rational
+ * @param b second rational
+ * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
+ * values is of the form 0/0
+ */
+static inline int av_cmp_q(AVRational a, AVRational b){
+ const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
+
+ if(tmp) return ((tmp ^ a.den ^ b.den)>>63)|1;
+ else if(b.den && a.den) return 0;
+ else if(a.num && b.num) return (a.num>>31) - (b.num>>31);
+ else return INT_MIN;
+}
+
+/**
+ * Convert rational to double.
+ * @param a rational to convert
+ * @return (double) a
+ */
+static inline double av_q2d(AVRational a){
+ return a.num / (double) a.den;
+}
+
+/**
+ * Reduce a fraction.
+ * This is useful for framerate calculations.
+ * @param dst_num destination numerator
+ * @param dst_den destination denominator
+ * @param num source numerator
+ * @param den source denominator
+ * @param max the maximum allowed for dst_num & dst_den
+ * @return 1 if exact, 0 otherwise
+ */
+int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);
+
+/**
+ * Multiply two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b*c
+ */
+AVRational av_mul_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Divide one rational by another.
+ * @param b first rational
+ * @param c second rational
+ * @return b/c
+ */
+AVRational av_div_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Add two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b+c
+ */
+AVRational av_add_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Subtract one rational from another.
+ * @param b first rational
+ * @param c second rational
+ * @return b-c
+ */
+AVRational av_sub_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Convert a double precision floating point number to a rational.
+ * inf is expressed as {1,0} or {-1,0} depending on the sign.
+ *
+ * @param d double to convert
+ * @param max the maximum allowed numerator and denominator
+ * @return (AVRational) d
+ */
+AVRational av_d2q(double d, int max) av_const;
+
+/**
+ * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
+ * than q1, 0 if they have the same distance.
+ */
+int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
+
+/**
+ * Find the nearest value in q_list to q.
+ * @param q_list an array of rationals terminated by {0, 0}
+ * @return the index of the nearest value found in the array
+ */
+int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RATIONAL_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/samplefmt.h
new file mode 100644
index 000000000..b6715561d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/samplefmt.h
@@ -0,0 +1,148 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SAMPLEFMT_H
+#define AVUTIL_SAMPLEFMT_H
+
+#include "avutil.h"
+
+/**
+ * all in native-endian format
+ */
+enum AVSampleFormat {
+ AV_SAMPLE_FMT_NONE = -1,
+ AV_SAMPLE_FMT_U8, ///< unsigned 8 bits
+ AV_SAMPLE_FMT_S16, ///< signed 16 bits
+ AV_SAMPLE_FMT_S32, ///< signed 32 bits
+ AV_SAMPLE_FMT_FLT, ///< float
+ AV_SAMPLE_FMT_DBL, ///< double
+
+ AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar
+ AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar
+ AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar
+ AV_SAMPLE_FMT_FLTP, ///< float, planar
+ AV_SAMPLE_FMT_DBLP, ///< double, planar
+
+ AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically
+};
+
+/**
+ * Return the name of sample_fmt, or NULL if sample_fmt is not
+ * recognized.
+ */
+const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);
+
+/**
+ * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE
+ * on error.
+ */
+enum AVSampleFormat av_get_sample_fmt(const char *name);
+
+/**
+ * Generate a string corresponding to the sample format with
+ * sample_fmt, or a header if sample_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param sample_fmt the number of the sample format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ * @return the pointer to the filled buffer or NULL if sample_fmt is
+ * unknown or in case of other errors
+ */
+char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt);
+
+#if FF_API_GET_BITS_PER_SAMPLE_FMT
+/**
+ * @deprecated Use av_get_bytes_per_sample() instead.
+ */
+attribute_deprecated
+int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt);
+#endif
+
+/**
+ * Return number of bytes per sample.
+ *
+ * @param sample_fmt the sample format
+ * @return number of bytes per sample or zero if unknown for the given
+ * sample format
+ */
+int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
+
+/**
+ * Check if the sample format is planar.
+ *
+ * @param sample_fmt the sample format to inspect
+ * @return 1 if the sample format is planar, 0 if it is interleaved
+ */
+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the required buffer size for the given audio parameters.
+ *
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @return required buffer size, or negative error code on failure
+ */
+int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Fill channel data pointers and linesize for samples with sample
+ * format sample_fmt.
+ *
+ * The pointers array is filled with the pointers to the samples data:
+ * for planar, set the start point of each channel's data within the buffer,
+ * for packed, set the start point of the entire buffer only.
+ *
+ * The linesize array is filled with the aligned size of each channel's data
+ * buffer for planar layout, or the aligned size of the buffer for all channels
+ * for packed layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize calculated linesize
+ * @param buf the pointer to a buffer containing the samples
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (1 = no alignment required)
+ * @return 0 on success or a negative error code on failure
+ */
+int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, uint8_t *buf,
+ int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
+ * linesize accordingly.
+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize aligned size for audio buffer(s)
+ * @param nb_channels number of audio channels
+ * @param nb_samples number of samples per channel
+ * @param align buffer size alignment (1 = no alignment required)
+ * @return 0 on success or a negative error code on failure
+ * @see av_samples_fill_arrays()
+ */
+int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
+ int nb_samples, enum AVSampleFormat sample_fmt, int align);
+
+#endif /* AVUTIL_SAMPLEFMT_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/sha.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/sha.h
new file mode 100644
index 000000000..8350954c4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/sha.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SHA_H
+#define AVUTIL_SHA_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_sha SHA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+extern const int av_sha_size;
+
+struct AVSHA;
+
+/**
+ * Initialize SHA-1 or SHA-2 hashing.
+ *
+ * @param context pointer to the function context (of size av_sha_size)
+ * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits)
+ * @return zero if initialization succeeded, -1 otherwise
+ */
+int av_sha_init(struct AVSHA* context, int bits);
+
+/**
+ * Update hash value.
+ *
+ * @param context hash function context
+ * @param data input data to update hash with
+ * @param len input data length
+ */
+void av_sha_update(struct AVSHA* context, const uint8_t* data, unsigned int len);
+
+/**
+ * Finish hashing and output digest value.
+ *
+ * @param context hash function context
+ * @param digest buffer where output digest value is stored
+ */
+void av_sha_final(struct AVSHA* context, uint8_t *digest);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_SHA_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/time.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/time.h
new file mode 100644
index 000000000..90eb43694
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/time.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2000-2003 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_TIME_H
+#define AVUTIL_TIME_H
+
+#include <stdint.h>
+
+/**
+ * Get the current time in microseconds.
+ */
+int64_t av_gettime(void);
+
+/**
+ * Sleep for a period of time. Although the duration is expressed in
+ * microseconds, the actual delay may be rounded to the precision of the
+ * system timer.
+ *
+ * @param usec Number of microseconds to sleep.
+ * @return zero on success or (negative) error code.
+ */
+int av_usleep(unsigned usec);
+
+#endif /* AVUTIL_TIME_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/timecode.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/timecode.h
new file mode 100644
index 000000000..56e3975fd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/timecode.h
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier <baptiste.coudurier@gmail.com>
+ * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch <clement.boesch@smartjog.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Timecode helpers header
+ */
+
+#ifndef AVUTIL_TIMECODE_H
+#define AVUTIL_TIMECODE_H
+
+#include <stdint.h>
+#include "rational.h"
+
+#define AV_TIMECODE_STR_SIZE 16
+
+enum AVTimecodeFlag {
+ AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame
+ AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours
+ AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed
+};
+
+typedef struct {
+ int start; ///< timecode frame start (first base frame number)
+ uint32_t flags; ///< flags such as drop frame, +24 hours support, ...
+ AVRational rate; ///< frame rate in rational form
+ unsigned fps; ///< frame per second; must be consistent with the rate field
+} AVTimecode;
+
+/**
+ * Adjust frame number for NTSC drop frame time code.
+ *
+ * @param framenum frame number to adjust
+ * @param fps frame per second, 30 or 60
+ * @return adjusted frame number
+ * @warning adjustment is only valid in NTSC 29.97 and 59.94
+ */
+int av_timecode_adjust_ntsc_framenum2(int framenum, int fps);
+
+/**
+ * Convert frame number to SMPTE 12M binary representation.
+ *
+ * @param tc timecode data correctly initialized
+ * @param framenum frame number
+ * @return the SMPTE binary representation
+ *
+ * @note Frame number adjustment is automatically done in case of drop timecode,
+ * you do NOT have to call av_timecode_adjust_ntsc_framenum2().
+ * @note The frame number is relative to tc->start.
+ * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity
+ * correction (PC) bits are set to zero.
+ */
+uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum);
+
+/**
+ * Load timecode string in buf.
+ *
+ * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long
+ * @param tc timecode data correctly initialized
+ * @param framenum frame number
+ * @return the buf parameter
+ *
+ * @note Timecode representation can be a negative timecode and have more than
+ * 24 hours, but will only be honored if the flags are correctly set.
+ * @note The frame number is relative to tc->start.
+ */
+char *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum);
+
+/**
+ * Get the timecode string from the SMPTE timecode format.
+ *
+ * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long
+ * @param tcsmpte the 32-bit SMPTE timecode
+ * @param prevent_df prevent the use of a drop flag when it is known the DF bit
+ * is arbitrary
+ * @return the buf parameter
+ */
+char *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df);
+
+/**
+ * Get the timecode string from the 25-bit timecode format (MPEG GOP format).
+ *
+ * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long
+ * @param tc25bit the 25-bits timecode
+ * @return the buf parameter
+ */
+char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit);
+
+/**
+ * Init a timecode struct with the passed parameters.
+ *
+ * @param log_ctx a pointer to an arbitrary struct of which the first field
+ * is a pointer to an AVClass struct (used for av_log)
+ * @param tc pointer to an allocated AVTimecode
+ * @param rate frame rate in rational form
+ * @param flags miscellaneous flags such as drop frame, +24 hours, ...
+ * (see AVTimecodeFlag)
+ * @param frame_start the first frame number
+ * @return 0 on success, AVERROR otherwise
+ */
+int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx);
+
+/**
+ * Parse timecode representation (hh:mm:ss[:;.]ff).
+ *
+ * @param log_ctx a pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct (used for av_log).
+ * @param tc pointer to an allocated AVTimecode
+ * @param rate frame rate in rational form
+ * @param str timecode string which will determine the frame start
+ * @return 0 on success, AVERROR otherwise
+ */
+int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx);
+
+/**
+ * Check if the timecode feature is available for the given frame rate
+ *
+ * @return 0 if supported, <0 otherwise
+ */
+int av_timecode_check_frame_rate(AVRational rate);
+
+#endif /* AVUTIL_TIMECODE_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/timestamp.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/timestamp.h
new file mode 100644
index 000000000..c7348d8f1
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/timestamp.h
@@ -0,0 +1,74 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * timestamp utils, mostly useful for debugging/logging purposes
+ */
+
+#ifndef AVUTIL_TIMESTAMP_H
+#define AVUTIL_TIMESTAMP_H
+
+#include "common.h"
+
+#define AV_TS_MAX_STRING_SIZE 32
+
+/**
+ * Fill the provided buffer with a string containing a timestamp
+ * representation.
+ *
+ * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE
+ * @param ts the timestamp to represent
+ * @return the buffer in input
+ */
+static inline char *av_ts_make_string(char *buf, int64_t ts)
+{
+ if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS");
+ else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%"PRId64"", ts);
+ return buf;
+}
+
+/**
+ * Convenience macro, the return value should be used only directly in
+ * function arguments but never stand-alone.
+ */
+#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts)
+
+/**
+ * Fill the provided buffer with a string containing a timestamp time
+ * representation.
+ *
+ * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE
+ * @param ts the timestamp to represent
+ * @param tb the timebase of the timestamp
+ * @return the buffer in input
+ */
+static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb)
+{
+ if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS");
+ else snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts);
+ return buf;
+}
+
+/**
+ * Convenience macro, the return value should be used only directly in
+ * function arguments but never stand-alone.
+ */
+#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb)
+
+#endif /* AVUTIL_TIMESTAMP_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/version.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/version.h
new file mode 100644
index 000000000..4ad244f40
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/version.h
@@ -0,0 +1,132 @@
+/*
+ * copyright (c) 2003 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_VERSION_H
+#define AVUTIL_VERSION_H
+
+/**
+ * @defgroup preproc_misc Preprocessor String Macros
+ *
+ * String manipulation macros
+ *
+ * @{
+ */
+
+#define AV_STRINGIFY(s) AV_TOSTRING(s)
+#define AV_TOSTRING(s) #s
+
+#define AV_GLUE(a, b) a ## b
+#define AV_JOIN(a, b) AV_GLUE(a, b)
+
+#define AV_PRAGMA(s) _Pragma(#s)
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup version_utils Library Version Macros
+ *
+ * Useful to check and match library version in order to maintain
+ * backward compatibility.
+ *
+ * @{
+ */
+
+#define AV_VERSION_INT(a, b, c) (a<<16 | b<<8 | c)
+#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
+
+/**
+ * @}
+ */
+
+
+/**
+ * @file
+ * @ingroup lavu
+ * Libavutil version macros
+ */
+
+/**
+ * @defgroup lavu_ver Version and Build diagnostics
+ *
+ * Macros and function useful to check at compiletime and at runtime
+ * which version of libavutil is in use.
+ *
+ * @{
+ */
+
+#define LIBAVUTIL_VERSION_MAJOR 52
+#define LIBAVUTIL_VERSION_MINOR 5
+#define LIBAVUTIL_VERSION_MICRO 100
+
+#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT
+
+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
+
+/**
+ * @}
+ *
+ * @defgroup depr_guards Deprecation guards
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *
+ * @{
+ */
+
+#ifndef FF_API_OLD_EVAL_NAMES
+#define FF_API_OLD_EVAL_NAMES (LIBAVUTIL_VERSION_MAJOR < 52)
+#endif
+#ifndef FF_API_GET_BITS_PER_SAMPLE_FMT
+#define FF_API_GET_BITS_PER_SAMPLE_FMT (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_FIND_OPT
+#define FF_API_FIND_OPT (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_OLD_AVOPTIONS
+#define FF_API_OLD_AVOPTIONS (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_PIX_FMT
+#define FF_API_PIX_FMT (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_CONTEXT_SIZE
+#define FF_API_CONTEXT_SIZE (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_PIX_FMT_DESC
+#define FF_API_PIX_FMT_DESC (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_AV_REVERSE
+#define FF_API_AV_REVERSE (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_VERSION_H */
+
diff --git a/dom/media/platforms/ffmpeg/libav53/include/libavutil/xtea.h b/dom/media/platforms/ffmpeg/libav53/include/libavutil/xtea.h
new file mode 100644
index 000000000..0899c92bc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/include/libavutil/xtea.h
@@ -0,0 +1,62 @@
+/*
+ * A 32-bit implementation of the XTEA algorithm
+ * Copyright (c) 2012 Samuel Pitoiset
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_XTEA_H
+#define AVUTIL_XTEA_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_xtea XTEA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+typedef struct AVXTEA {
+ uint32_t key[16];
+} AVXTEA;
+
+/**
+ * Initialize an AVXTEA context.
+ *
+ * @param ctx an AVXTEA context
+ * @param key a key of 16 bytes used for encryption/decryption
+ */
+void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVXTEA context
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param count number of 8 byte blocks
+ * @param iv initialization vector for CBC mode, if NULL then ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src,
+ int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_XTEA_H */
diff --git a/dom/media/platforms/ffmpeg/libav53/moz.build b/dom/media/platforms/ffmpeg/libav53/moz.build
new file mode 100644
index 000000000..2bdc1dc34
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav53/moz.build
@@ -0,0 +1,23 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ '../FFmpegAudioDecoder.cpp',
+ '../FFmpegDataDecoder.cpp',
+ '../FFmpegDecoderModule.cpp',
+ '../FFmpegVideoDecoder.cpp',
+]
+LOCAL_INCLUDES += [
+ '..',
+ 'include',
+]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['CLANG_CXX']:
+ CXXFLAGS += [
+ '-Wno-unknown-attributes',
+ ]
diff --git a/dom/media/platforms/ffmpeg/libav54/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/libav54/include/COPYING.LGPLv2.1
new file mode 100644
index 000000000..00b4fedfe
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/COPYING.LGPLv2.1
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/avcodec.h
new file mode 100644
index 000000000..e6b8ec626
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/avcodec.h
@@ -0,0 +1,4658 @@
+/*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVCODEC_H
+#define AVCODEC_AVCODEC_H
+
+/**
+ * @file
+ * external API header
+ */
+
+#include <errno.h>
+#include "libavutil/samplefmt.h"
+#include "libavutil/avutil.h"
+#include "libavutil/cpu.h"
+#include "libavutil/dict.h"
+#include "libavutil/log.h"
+#include "libavutil/pixfmt.h"
+#include "libavutil/rational.h"
+
+#include "libavcodec/version.h"
+/**
+ * @defgroup libavc Encoding/Decoding Library
+ * @{
+ *
+ * @defgroup lavc_decoding Decoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_encoding Encoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_codec Codecs
+ * @{
+ * @defgroup lavc_codec_native Native Codecs
+ * @{
+ * @}
+ * @defgroup lavc_codec_wrappers External library wrappers
+ * @{
+ * @}
+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
+ * @{
+ * @}
+ * @}
+ * @defgroup lavc_internal Internal
+ * @{
+ * @}
+ * @}
+ *
+ */
+
+/**
+ * @defgroup lavc_core Core functions/structures.
+ * @ingroup libavc
+ *
+ * Basic definitions, functions for querying libavcodec capabilities,
+ * allocating core structures, etc.
+ * @{
+ */
+
+
+/**
+ * Identify the syntax and semantics of the bitstream.
+ * The principle is roughly:
+ * Two decoders with the same ID can decode the same streams.
+ * Two encoders with the same ID can encode compatible streams.
+ * There may be slight deviations from the principle due to implementation
+ * details.
+ *
+ * If you add a codec ID to this list, add it so that
+ * 1. no value of a existing codec ID changes (that would break ABI),
+ * 2. it is as close as possible to similar codecs.
+ *
+ * After adding new codec IDs, do not forget to add an entry to the codec
+ * descriptor list and bump libavcodec minor version.
+ */
+enum AVCodecID {
+ AV_CODEC_ID_NONE,
+
+ /* video codecs */
+ AV_CODEC_ID_MPEG1VIDEO,
+ AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+ AV_CODEC_ID_MPEG2VIDEO_XVMC,
+ AV_CODEC_ID_H261,
+ AV_CODEC_ID_H263,
+ AV_CODEC_ID_RV10,
+ AV_CODEC_ID_RV20,
+ AV_CODEC_ID_MJPEG,
+ AV_CODEC_ID_MJPEGB,
+ AV_CODEC_ID_LJPEG,
+ AV_CODEC_ID_SP5X,
+ AV_CODEC_ID_JPEGLS,
+ AV_CODEC_ID_MPEG4,
+ AV_CODEC_ID_RAWVIDEO,
+ AV_CODEC_ID_MSMPEG4V1,
+ AV_CODEC_ID_MSMPEG4V2,
+ AV_CODEC_ID_MSMPEG4V3,
+ AV_CODEC_ID_WMV1,
+ AV_CODEC_ID_WMV2,
+ AV_CODEC_ID_H263P,
+ AV_CODEC_ID_H263I,
+ AV_CODEC_ID_FLV1,
+ AV_CODEC_ID_SVQ1,
+ AV_CODEC_ID_SVQ3,
+ AV_CODEC_ID_DVVIDEO,
+ AV_CODEC_ID_HUFFYUV,
+ AV_CODEC_ID_CYUV,
+ AV_CODEC_ID_H264,
+ AV_CODEC_ID_INDEO3,
+ AV_CODEC_ID_VP3,
+ AV_CODEC_ID_THEORA,
+ AV_CODEC_ID_ASV1,
+ AV_CODEC_ID_ASV2,
+ AV_CODEC_ID_FFV1,
+ AV_CODEC_ID_4XM,
+ AV_CODEC_ID_VCR1,
+ AV_CODEC_ID_CLJR,
+ AV_CODEC_ID_MDEC,
+ AV_CODEC_ID_ROQ,
+ AV_CODEC_ID_INTERPLAY_VIDEO,
+ AV_CODEC_ID_XAN_WC3,
+ AV_CODEC_ID_XAN_WC4,
+ AV_CODEC_ID_RPZA,
+ AV_CODEC_ID_CINEPAK,
+ AV_CODEC_ID_WS_VQA,
+ AV_CODEC_ID_MSRLE,
+ AV_CODEC_ID_MSVIDEO1,
+ AV_CODEC_ID_IDCIN,
+ AV_CODEC_ID_8BPS,
+ AV_CODEC_ID_SMC,
+ AV_CODEC_ID_FLIC,
+ AV_CODEC_ID_TRUEMOTION1,
+ AV_CODEC_ID_VMDVIDEO,
+ AV_CODEC_ID_MSZH,
+ AV_CODEC_ID_ZLIB,
+ AV_CODEC_ID_QTRLE,
+ AV_CODEC_ID_SNOW,
+ AV_CODEC_ID_TSCC,
+ AV_CODEC_ID_ULTI,
+ AV_CODEC_ID_QDRAW,
+ AV_CODEC_ID_VIXL,
+ AV_CODEC_ID_QPEG,
+ AV_CODEC_ID_PNG,
+ AV_CODEC_ID_PPM,
+ AV_CODEC_ID_PBM,
+ AV_CODEC_ID_PGM,
+ AV_CODEC_ID_PGMYUV,
+ AV_CODEC_ID_PAM,
+ AV_CODEC_ID_FFVHUFF,
+ AV_CODEC_ID_RV30,
+ AV_CODEC_ID_RV40,
+ AV_CODEC_ID_VC1,
+ AV_CODEC_ID_WMV3,
+ AV_CODEC_ID_LOCO,
+ AV_CODEC_ID_WNV1,
+ AV_CODEC_ID_AASC,
+ AV_CODEC_ID_INDEO2,
+ AV_CODEC_ID_FRAPS,
+ AV_CODEC_ID_TRUEMOTION2,
+ AV_CODEC_ID_BMP,
+ AV_CODEC_ID_CSCD,
+ AV_CODEC_ID_MMVIDEO,
+ AV_CODEC_ID_ZMBV,
+ AV_CODEC_ID_AVS,
+ AV_CODEC_ID_SMACKVIDEO,
+ AV_CODEC_ID_NUV,
+ AV_CODEC_ID_KMVC,
+ AV_CODEC_ID_FLASHSV,
+ AV_CODEC_ID_CAVS,
+ AV_CODEC_ID_JPEG2000,
+ AV_CODEC_ID_VMNC,
+ AV_CODEC_ID_VP5,
+ AV_CODEC_ID_VP6,
+ AV_CODEC_ID_VP6F,
+ AV_CODEC_ID_TARGA,
+ AV_CODEC_ID_DSICINVIDEO,
+ AV_CODEC_ID_TIERTEXSEQVIDEO,
+ AV_CODEC_ID_TIFF,
+ AV_CODEC_ID_GIF,
+ AV_CODEC_ID_DXA,
+ AV_CODEC_ID_DNXHD,
+ AV_CODEC_ID_THP,
+ AV_CODEC_ID_SGI,
+ AV_CODEC_ID_C93,
+ AV_CODEC_ID_BETHSOFTVID,
+ AV_CODEC_ID_PTX,
+ AV_CODEC_ID_TXD,
+ AV_CODEC_ID_VP6A,
+ AV_CODEC_ID_AMV,
+ AV_CODEC_ID_VB,
+ AV_CODEC_ID_PCX,
+ AV_CODEC_ID_SUNRAST,
+ AV_CODEC_ID_INDEO4,
+ AV_CODEC_ID_INDEO5,
+ AV_CODEC_ID_MIMIC,
+ AV_CODEC_ID_RL2,
+ AV_CODEC_ID_ESCAPE124,
+ AV_CODEC_ID_DIRAC,
+ AV_CODEC_ID_BFI,
+ AV_CODEC_ID_CMV,
+ AV_CODEC_ID_MOTIONPIXELS,
+ AV_CODEC_ID_TGV,
+ AV_CODEC_ID_TGQ,
+ AV_CODEC_ID_TQI,
+ AV_CODEC_ID_AURA,
+ AV_CODEC_ID_AURA2,
+ AV_CODEC_ID_V210X,
+ AV_CODEC_ID_TMV,
+ AV_CODEC_ID_V210,
+ AV_CODEC_ID_DPX,
+ AV_CODEC_ID_MAD,
+ AV_CODEC_ID_FRWU,
+ AV_CODEC_ID_FLASHSV2,
+ AV_CODEC_ID_CDGRAPHICS,
+ AV_CODEC_ID_R210,
+ AV_CODEC_ID_ANM,
+ AV_CODEC_ID_BINKVIDEO,
+ AV_CODEC_ID_IFF_ILBM,
+ AV_CODEC_ID_IFF_BYTERUN1,
+ AV_CODEC_ID_KGV1,
+ AV_CODEC_ID_YOP,
+ AV_CODEC_ID_VP8,
+ AV_CODEC_ID_PICTOR,
+ AV_CODEC_ID_ANSI,
+ AV_CODEC_ID_A64_MULTI,
+ AV_CODEC_ID_A64_MULTI5,
+ AV_CODEC_ID_R10K,
+ AV_CODEC_ID_MXPEG,
+ AV_CODEC_ID_LAGARITH,
+ AV_CODEC_ID_PRORES,
+ AV_CODEC_ID_JV,
+ AV_CODEC_ID_DFA,
+ AV_CODEC_ID_WMV3IMAGE,
+ AV_CODEC_ID_VC1IMAGE,
+ AV_CODEC_ID_UTVIDEO,
+ AV_CODEC_ID_BMV_VIDEO,
+ AV_CODEC_ID_VBLE,
+ AV_CODEC_ID_DXTORY,
+ AV_CODEC_ID_V410,
+ AV_CODEC_ID_XWD,
+ AV_CODEC_ID_CDXL,
+ AV_CODEC_ID_XBM,
+ AV_CODEC_ID_ZEROCODEC,
+ AV_CODEC_ID_MSS1,
+ AV_CODEC_ID_MSA1,
+ AV_CODEC_ID_TSCC2,
+ AV_CODEC_ID_MTS2,
+ AV_CODEC_ID_CLLC,
+ AV_CODEC_ID_MSS2,
+
+ /* various PCM "codecs" */
+ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ AV_CODEC_ID_PCM_S16LE = 0x10000,
+ AV_CODEC_ID_PCM_S16BE,
+ AV_CODEC_ID_PCM_U16LE,
+ AV_CODEC_ID_PCM_U16BE,
+ AV_CODEC_ID_PCM_S8,
+ AV_CODEC_ID_PCM_U8,
+ AV_CODEC_ID_PCM_MULAW,
+ AV_CODEC_ID_PCM_ALAW,
+ AV_CODEC_ID_PCM_S32LE,
+ AV_CODEC_ID_PCM_S32BE,
+ AV_CODEC_ID_PCM_U32LE,
+ AV_CODEC_ID_PCM_U32BE,
+ AV_CODEC_ID_PCM_S24LE,
+ AV_CODEC_ID_PCM_S24BE,
+ AV_CODEC_ID_PCM_U24LE,
+ AV_CODEC_ID_PCM_U24BE,
+ AV_CODEC_ID_PCM_S24DAUD,
+ AV_CODEC_ID_PCM_ZORK,
+ AV_CODEC_ID_PCM_S16LE_PLANAR,
+ AV_CODEC_ID_PCM_DVD,
+ AV_CODEC_ID_PCM_F32BE,
+ AV_CODEC_ID_PCM_F32LE,
+ AV_CODEC_ID_PCM_F64BE,
+ AV_CODEC_ID_PCM_F64LE,
+ AV_CODEC_ID_PCM_BLURAY,
+ AV_CODEC_ID_PCM_LXF,
+ AV_CODEC_ID_S302M,
+ AV_CODEC_ID_PCM_S8_PLANAR,
+
+ /* various ADPCM codecs */
+ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ AV_CODEC_ID_ADPCM_IMA_WAV,
+ AV_CODEC_ID_ADPCM_IMA_DK3,
+ AV_CODEC_ID_ADPCM_IMA_DK4,
+ AV_CODEC_ID_ADPCM_IMA_WS,
+ AV_CODEC_ID_ADPCM_IMA_SMJPEG,
+ AV_CODEC_ID_ADPCM_MS,
+ AV_CODEC_ID_ADPCM_4XM,
+ AV_CODEC_ID_ADPCM_XA,
+ AV_CODEC_ID_ADPCM_ADX,
+ AV_CODEC_ID_ADPCM_EA,
+ AV_CODEC_ID_ADPCM_G726,
+ AV_CODEC_ID_ADPCM_CT,
+ AV_CODEC_ID_ADPCM_SWF,
+ AV_CODEC_ID_ADPCM_YAMAHA,
+ AV_CODEC_ID_ADPCM_SBPRO_4,
+ AV_CODEC_ID_ADPCM_SBPRO_3,
+ AV_CODEC_ID_ADPCM_SBPRO_2,
+ AV_CODEC_ID_ADPCM_THP,
+ AV_CODEC_ID_ADPCM_IMA_AMV,
+ AV_CODEC_ID_ADPCM_EA_R1,
+ AV_CODEC_ID_ADPCM_EA_R3,
+ AV_CODEC_ID_ADPCM_EA_R2,
+ AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
+ AV_CODEC_ID_ADPCM_IMA_EA_EACS,
+ AV_CODEC_ID_ADPCM_EA_XAS,
+ AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
+ AV_CODEC_ID_ADPCM_IMA_ISS,
+ AV_CODEC_ID_ADPCM_G722,
+ AV_CODEC_ID_ADPCM_IMA_APC,
+
+ /* AMR */
+ AV_CODEC_ID_AMR_NB = 0x12000,
+ AV_CODEC_ID_AMR_WB,
+
+ /* RealAudio codecs*/
+ AV_CODEC_ID_RA_144 = 0x13000,
+ AV_CODEC_ID_RA_288,
+
+ /* various DPCM codecs */
+ AV_CODEC_ID_ROQ_DPCM = 0x14000,
+ AV_CODEC_ID_INTERPLAY_DPCM,
+ AV_CODEC_ID_XAN_DPCM,
+ AV_CODEC_ID_SOL_DPCM,
+
+ /* audio codecs */
+ AV_CODEC_ID_MP2 = 0x15000,
+ AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+ AV_CODEC_ID_AAC,
+ AV_CODEC_ID_AC3,
+ AV_CODEC_ID_DTS,
+ AV_CODEC_ID_VORBIS,
+ AV_CODEC_ID_DVAUDIO,
+ AV_CODEC_ID_WMAV1,
+ AV_CODEC_ID_WMAV2,
+ AV_CODEC_ID_MACE3,
+ AV_CODEC_ID_MACE6,
+ AV_CODEC_ID_VMDAUDIO,
+ AV_CODEC_ID_FLAC,
+ AV_CODEC_ID_MP3ADU,
+ AV_CODEC_ID_MP3ON4,
+ AV_CODEC_ID_SHORTEN,
+ AV_CODEC_ID_ALAC,
+ AV_CODEC_ID_WESTWOOD_SND1,
+ AV_CODEC_ID_GSM, ///< as in Berlin toast format
+ AV_CODEC_ID_QDM2,
+ AV_CODEC_ID_COOK,
+ AV_CODEC_ID_TRUESPEECH,
+ AV_CODEC_ID_TTA,
+ AV_CODEC_ID_SMACKAUDIO,
+ AV_CODEC_ID_QCELP,
+ AV_CODEC_ID_WAVPACK,
+ AV_CODEC_ID_DSICINAUDIO,
+ AV_CODEC_ID_IMC,
+ AV_CODEC_ID_MUSEPACK7,
+ AV_CODEC_ID_MLP,
+ AV_CODEC_ID_GSM_MS, /* as found in WAV */
+ AV_CODEC_ID_ATRAC3,
+ AV_CODEC_ID_VOXWARE,
+ AV_CODEC_ID_APE,
+ AV_CODEC_ID_NELLYMOSER,
+ AV_CODEC_ID_MUSEPACK8,
+ AV_CODEC_ID_SPEEX,
+ AV_CODEC_ID_WMAVOICE,
+ AV_CODEC_ID_WMAPRO,
+ AV_CODEC_ID_WMALOSSLESS,
+ AV_CODEC_ID_ATRAC3P,
+ AV_CODEC_ID_EAC3,
+ AV_CODEC_ID_SIPR,
+ AV_CODEC_ID_MP1,
+ AV_CODEC_ID_TWINVQ,
+ AV_CODEC_ID_TRUEHD,
+ AV_CODEC_ID_MP4ALS,
+ AV_CODEC_ID_ATRAC1,
+ AV_CODEC_ID_BINKAUDIO_RDFT,
+ AV_CODEC_ID_BINKAUDIO_DCT,
+ AV_CODEC_ID_AAC_LATM,
+ AV_CODEC_ID_QDMC,
+ AV_CODEC_ID_CELT,
+ AV_CODEC_ID_G723_1,
+ AV_CODEC_ID_G729,
+ AV_CODEC_ID_8SVX_EXP,
+ AV_CODEC_ID_8SVX_FIB,
+ AV_CODEC_ID_BMV_AUDIO,
+ AV_CODEC_ID_RALF,
+ AV_CODEC_ID_IAC,
+ AV_CODEC_ID_ILBC,
+ AV_CODEC_ID_OPUS,
+ AV_CODEC_ID_COMFORT_NOISE,
+ AV_CODEC_ID_TAK,
+
+ /* subtitle codecs */
+ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+ AV_CODEC_ID_DVD_SUBTITLE = 0x17000,
+ AV_CODEC_ID_DVB_SUBTITLE,
+ AV_CODEC_ID_TEXT, ///< raw UTF-8 text
+ AV_CODEC_ID_XSUB,
+ AV_CODEC_ID_SSA,
+ AV_CODEC_ID_MOV_TEXT,
+ AV_CODEC_ID_HDMV_PGS_SUBTITLE,
+ AV_CODEC_ID_DVB_TELETEXT,
+ AV_CODEC_ID_SRT,
+
+ /* other specific kind of codecs (generally used for attachments) */
+ AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
+ AV_CODEC_ID_TTF = 0x18000,
+
+ AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
+
+ AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+ * stream (only used by libavformat) */
+ AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+ * stream (only used by libavformat) */
+ AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
+
+#if FF_API_CODEC_ID
+#include "old_codec_ids.h"
+#endif
+};
+
+#if FF_API_CODEC_ID
+#define CodecID AVCodecID
+#endif
+
+/**
+ * This struct describes the properties of a single codec described by an
+ * AVCodecID.
+ * @see avcodec_get_descriptor()
+ */
+typedef struct AVCodecDescriptor {
+ enum AVCodecID id;
+ enum AVMediaType type;
+ /**
+ * Name of the codec described by this descriptor. It is non-empty and
+ * unique for each codec descriptor. It should contain alphanumeric
+ * characters and '_' only.
+ */
+ const char *name;
+ /**
+ * A more descriptive name for this codec. May be NULL.
+ */
+ const char *long_name;
+ /**
+ * Codec properties, a combination of AV_CODEC_PROP_* flags.
+ */
+ int props;
+} AVCodecDescriptor;
+
+/**
+ * Codec uses only intra compression.
+ * Video codecs only.
+ */
+#define AV_CODEC_PROP_INTRA_ONLY (1 << 0)
+/**
+ * Codec supports lossy compression. Audio and video codecs only.
+ * @note a codec may support both lossy and lossless
+ * compression modes
+ */
+#define AV_CODEC_PROP_LOSSY (1 << 1)
+/**
+ * Codec supports lossless compression. Audio and video codecs only.
+ */
+#define AV_CODEC_PROP_LOSSLESS (1 << 2)
+
+#if FF_API_OLD_DECODE_AUDIO
+/* in bytes */
+#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
+#endif
+
+/**
+ * @ingroup lavc_decoding
+ * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
+ * This is mainly needed because some optimized bitstream readers read
+ * 32 or 64 bit at once and could read over the end.<br>
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged
+ * MPEG bitstreams could cause overread and segfault.
+ */
+#define FF_INPUT_BUFFER_PADDING_SIZE 8
+
+/**
+ * @ingroup lavc_encoding
+ * minimum encoding buffer size
+ * Used to avoid some checks during header writing.
+ */
+#define FF_MIN_BUFFER_SIZE 16384
+
+
+/**
+ * @ingroup lavc_encoding
+ * motion estimation type.
+ */
+enum Motion_Est_ID {
+ ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed
+ ME_FULL,
+ ME_LOG,
+ ME_PHODS,
+ ME_EPZS, ///< enhanced predictive zonal search
+ ME_X1, ///< reserved for experiments
+ ME_HEX, ///< hexagon based search
+ ME_UMH, ///< uneven multi-hexagon search
+ ME_ITER, ///< iterative search
+ ME_TESA, ///< transformed exhaustive search algorithm
+};
+
+/**
+ * @ingroup lavc_decoding
+ */
+enum AVDiscard{
+ /* We leave some space between them for extensions (drop some
+ * keyframes for intra-only or drop just some bidir frames). */
+ AVDISCARD_NONE =-16, ///< discard nothing
+ AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi
+ AVDISCARD_NONREF = 8, ///< discard all non reference
+ AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
+ AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
+ AVDISCARD_ALL = 48, ///< discard all
+};
+
+enum AVColorPrimaries{
+ AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
+ AVCOL_PRI_UNSPECIFIED = 2,
+ AVCOL_PRI_BT470M = 4,
+ AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
+ AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above
+ AVCOL_PRI_FILM = 8,
+ AVCOL_PRI_NB , ///< Not part of ABI
+};
+
+enum AVColorTransferCharacteristic{
+ AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361
+ AVCOL_TRC_UNSPECIFIED = 2,
+ AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG
+ AVCOL_TRC_SMPTE240M = 7,
+ AVCOL_TRC_NB , ///< Not part of ABI
+};
+
+enum AVColorSpace{
+ AVCOL_SPC_RGB = 0,
+ AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
+ AVCOL_SPC_UNSPECIFIED = 2,
+ AVCOL_SPC_FCC = 4,
+ AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
+ AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
+ AVCOL_SPC_SMPTE240M = 7,
+ AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
+ AVCOL_SPC_NB , ///< Not part of ABI
+};
+
+enum AVColorRange{
+ AVCOL_RANGE_UNSPECIFIED = 0,
+ AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges
+ AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges
+ AVCOL_RANGE_NB , ///< Not part of ABI
+};
+
+/**
+ * X X 3 4 X X are luma samples,
+ * 1 2 1-6 are possible chroma positions
+ * X X 5 6 X 0 is undefined/unknown position
+ */
+enum AVChromaLocation{
+ AVCHROMA_LOC_UNSPECIFIED = 0,
+ AVCHROMA_LOC_LEFT = 1, ///< mpeg2/4, h264 default
+ AVCHROMA_LOC_CENTER = 2, ///< mpeg1, jpeg, h263
+ AVCHROMA_LOC_TOPLEFT = 3, ///< DV
+ AVCHROMA_LOC_TOP = 4,
+ AVCHROMA_LOC_BOTTOMLEFT = 5,
+ AVCHROMA_LOC_BOTTOM = 6,
+ AVCHROMA_LOC_NB , ///< Not part of ABI
+};
+
+enum AVAudioServiceType {
+ AV_AUDIO_SERVICE_TYPE_MAIN = 0,
+ AV_AUDIO_SERVICE_TYPE_EFFECTS = 1,
+ AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
+ AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3,
+ AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4,
+ AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5,
+ AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6,
+ AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7,
+ AV_AUDIO_SERVICE_TYPE_KARAOKE = 8,
+ AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI
+};
+
+/**
+ * @ingroup lavc_encoding
+ */
+typedef struct RcOverride{
+ int start_frame;
+ int end_frame;
+ int qscale; // If this is 0 then quality_factor will be used instead.
+ float quality_factor;
+} RcOverride;
+
+#define FF_MAX_B_FRAMES 16
+
+/* encoding support
+ These flags can be passed in AVCodecContext.flags before initialization.
+ Note: Not everything is supported yet.
+*/
+
+#define CODEC_FLAG_QSCALE 0x0002 ///< Use fixed qscale.
+#define CODEC_FLAG_4MV 0x0004 ///< 4 MV per MB allowed / advanced prediction for H.263.
+#define CODEC_FLAG_QPEL 0x0010 ///< Use qpel MC.
+#define CODEC_FLAG_GMC 0x0020 ///< Use GMC.
+#define CODEC_FLAG_MV0 0x0040 ///< Always try a MB with MV=<0,0>.
+/**
+ * The parent program guarantees that the input for B-frames containing
+ * streams is not written to for at least s->max_b_frames+1 frames, if
+ * this is not set the input will be copied.
+ */
+#define CODEC_FLAG_INPUT_PRESERVED 0x0100
+#define CODEC_FLAG_PASS1 0x0200 ///< Use internal 2pass ratecontrol in first pass mode.
+#define CODEC_FLAG_PASS2 0x0400 ///< Use internal 2pass ratecontrol in second pass mode.
+#define CODEC_FLAG_GRAY 0x2000 ///< Only decode/encode grayscale.
+#define CODEC_FLAG_EMU_EDGE 0x4000 ///< Don't draw edges.
+#define CODEC_FLAG_PSNR 0x8000 ///< error[?] variables will be set during encoding.
+#define CODEC_FLAG_TRUNCATED 0x00010000 /** Input bitstream might be truncated at a random
+ location instead of only at frame boundaries. */
+#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 ///< Normalize adaptive quantization.
+#define CODEC_FLAG_INTERLACED_DCT 0x00040000 ///< Use interlaced DCT.
+#define CODEC_FLAG_LOW_DELAY 0x00080000 ///< Force low delay.
+#define CODEC_FLAG_GLOBAL_HEADER 0x00400000 ///< Place global headers in extradata instead of every keyframe.
+#define CODEC_FLAG_BITEXACT 0x00800000 ///< Use only bitexact stuff (except (I)DCT).
+/* Fx : Flag for h263+ extra options */
+#define CODEC_FLAG_AC_PRED 0x01000000 ///< H.263 advanced intra coding / MPEG-4 AC prediction
+#define CODEC_FLAG_LOOP_FILTER 0x00000800 ///< loop filter
+#define CODEC_FLAG_INTERLACED_ME 0x20000000 ///< interlaced motion estimation
+#define CODEC_FLAG_CLOSED_GOP 0x80000000
+#define CODEC_FLAG2_FAST 0x00000001 ///< Allow non spec compliant speedup tricks.
+#define CODEC_FLAG2_NO_OUTPUT 0x00000004 ///< Skip bitstream encoding.
+#define CODEC_FLAG2_LOCAL_HEADER 0x00000008 ///< Place global headers at every keyframe instead of in extradata.
+#if FF_API_MPV_GLOBAL_OPTS
+#define CODEC_FLAG_CBP_RD 0x04000000 ///< Use rate distortion optimization for cbp.
+#define CODEC_FLAG_QP_RD 0x08000000 ///< Use rate distortion optimization for qp selectioon.
+#define CODEC_FLAG2_STRICT_GOP 0x00000002 ///< Strictly enforce GOP size.
+#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skipping
+#endif
+#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
+
+/* Unsupported options :
+ * Syntax Arithmetic coding (SAC)
+ * Reference Picture Selection
+ * Independent Segment Decoding */
+/* /Fx */
+/* codec capabilities */
+
+#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001 ///< Decoder can use draw_horiz_band callback.
+/**
+ * Codec uses get_buffer() for allocating buffers and supports custom allocators.
+ * If not set, it might not use get_buffer() at all or use operations that
+ * assume the buffer was allocated by avcodec_default_get_buffer.
+ */
+#define CODEC_CAP_DR1 0x0002
+#define CODEC_CAP_TRUNCATED 0x0008
+/* Codec can export data for HW decoding (XvMC). */
+#define CODEC_CAP_HWACCEL 0x0010
+/**
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+ *
+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
+ * with NULL data. The user can still send NULL data to the public encode
+ * or decode function, but libavcodec will not pass it along to the codec
+ * unless this flag is set.
+ *
+ * Decoders:
+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
+ * returns frames.
+ *
+ * Encoders:
+ * The encoder needs to be fed with NULL data at the end of encoding until the
+ * encoder no longer returns data.
+ *
+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
+ * flag also means that the encoder must set the pts and duration for
+ * each output packet. If this flag is not set, the pts and duration will
+ * be determined by libavcodec from the input frame.
+ */
+#define CODEC_CAP_DELAY 0x0020
+/**
+ * Codec can be fed a final frame with a smaller size.
+ * This can be used to prevent truncation of the last audio samples.
+ */
+#define CODEC_CAP_SMALL_LAST_FRAME 0x0040
+/**
+ * Codec can export data for HW decoding (VDPAU).
+ */
+#define CODEC_CAP_HWACCEL_VDPAU 0x0080
+/**
+ * Codec can output multiple frames per AVPacket
+ * Normally demuxers return one frame at a time, demuxers which do not do
+ * are connected to a parser to split what they return into proper frames.
+ * This flag is reserved to the very rare category of codecs which have a
+ * bitstream that cannot be split into frames without timeconsuming
+ * operations like full decoding. Demuxers carring such bitstreams thus
+ * may return multiple frames in a packet. This has many disadvantages like
+ * prohibiting stream copy in many cases thus it should only be considered
+ * as a last resort.
+ */
+#define CODEC_CAP_SUBFRAMES 0x0100
+/**
+ * Codec is experimental and is thus avoided in favor of non experimental
+ * encoders
+ */
+#define CODEC_CAP_EXPERIMENTAL 0x0200
+/**
+ * Codec should fill in channel configuration and samplerate instead of container
+ */
+#define CODEC_CAP_CHANNEL_CONF 0x0400
+/**
+ * Codec is able to deal with negative linesizes
+ */
+#define CODEC_CAP_NEG_LINESIZES 0x0800
+/**
+ * Codec supports frame-level multithreading.
+ */
+#define CODEC_CAP_FRAME_THREADS 0x1000
+/**
+ * Codec supports slice-based (or partition-based) multithreading.
+ */
+#define CODEC_CAP_SLICE_THREADS 0x2000
+/**
+ * Codec supports changed parameters at any point.
+ */
+#define CODEC_CAP_PARAM_CHANGE 0x4000
+/**
+ * Codec supports avctx->thread_count == 0 (auto).
+ */
+#define CODEC_CAP_AUTO_THREADS 0x8000
+/**
+ * Audio encoder supports receiving a different number of samples in each call.
+ */
+#define CODEC_CAP_VARIABLE_FRAME_SIZE 0x10000
+
+//The following defines may change, don't expect compatibility if you use them.
+#define MB_TYPE_INTRA4x4 0x0001
+#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific
+#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific
+#define MB_TYPE_16x16 0x0008
+#define MB_TYPE_16x8 0x0010
+#define MB_TYPE_8x16 0x0020
+#define MB_TYPE_8x8 0x0040
+#define MB_TYPE_INTERLACED 0x0080
+#define MB_TYPE_DIRECT2 0x0100 //FIXME
+#define MB_TYPE_ACPRED 0x0200
+#define MB_TYPE_GMC 0x0400
+#define MB_TYPE_SKIP 0x0800
+#define MB_TYPE_P0L0 0x1000
+#define MB_TYPE_P1L0 0x2000
+#define MB_TYPE_P0L1 0x4000
+#define MB_TYPE_P1L1 0x8000
+#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0)
+#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1)
+#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1)
+#define MB_TYPE_QUANT 0x00010000
+#define MB_TYPE_CBP 0x00020000
+//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...)
+
+/**
+ * Pan Scan area.
+ * This specifies the area which should be displayed.
+ * Note there may be multiple such areas for one frame.
+ */
+typedef struct AVPanScan{
+ /**
+ * id
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int id;
+
+ /**
+ * width and height in 1/16 pel
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int width;
+ int height;
+
+ /**
+ * position of the top left corner in 1/16 pel for up to 3 fields/frames
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t position[3][2];
+}AVPanScan;
+
+#define FF_QSCALE_TYPE_MPEG1 0
+#define FF_QSCALE_TYPE_MPEG2 1
+#define FF_QSCALE_TYPE_H264 2
+#define FF_QSCALE_TYPE_VP56 3
+
+#define FF_BUFFER_TYPE_INTERNAL 1
+#define FF_BUFFER_TYPE_USER 2 ///< direct rendering buffers (image is (de)allocated by user)
+#define FF_BUFFER_TYPE_SHARED 4 ///< Buffer from somewhere else; don't deallocate image (data/base), all other tables are not shared.
+#define FF_BUFFER_TYPE_COPY 8 ///< Just a (modified) copy of some other buffer, don't deallocate anything.
+
+#define FF_BUFFER_HINTS_VALID 0x01 // Buffer hints value is meaningful (if 0 ignore).
+#define FF_BUFFER_HINTS_READABLE 0x02 // Codec will read from buffer.
+#define FF_BUFFER_HINTS_PRESERVE 0x04 // User must not alter buffer content.
+#define FF_BUFFER_HINTS_REUSABLE 0x08 // Codec will reuse the buffer (update).
+
+/**
+ * @defgroup lavc_packet AVPacket
+ *
+ * Types and functions for working with AVPacket.
+ * @{
+ */
+enum AVPacketSideDataType {
+ AV_PKT_DATA_PALETTE,
+ AV_PKT_DATA_NEW_EXTRADATA,
+
+ /**
+ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+ * @code
+ * u32le param_flags
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+ * s32le channel_count
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+ * u64le channel_layout
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+ * s32le sample_rate
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+ * s32le width
+ * s32le height
+ * @endcode
+ */
+ AV_PKT_DATA_PARAM_CHANGE,
+
+ /**
+ * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
+ * structures with info about macroblocks relevant to splitting the
+ * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
+ * That is, it does not necessarily contain info about all macroblocks,
+ * as long as the distance between macroblocks in the info is smaller
+ * than the target payload size.
+ * Each MB info structure is 12 bytes, and is laid out as follows:
+ * @code
+ * u32le bit offset from the start of the packet
+ * u8 current quantizer at the start of the macroblock
+ * u8 GOB number
+ * u16le macroblock address within the GOB
+ * u8 horizontal MV predictor
+ * u8 vertical MV predictor
+ * u8 horizontal MV predictor for block number 3
+ * u8 vertical MV predictor for block number 3
+ * @endcode
+ */
+ AV_PKT_DATA_H263_MB_INFO,
+};
+
+/**
+ * This structure stores compressed data. It is typically exported by demuxers
+ * and then passed as input to decoders, or received as output from encoders and
+ * then passed to muxers.
+ *
+ * For video, it should typically contain one compressed frame. For audio it may
+ * contain several compressed frames.
+ *
+ * AVPacket is one of the few structs in Libav, whose size is a part of public
+ * ABI. Thus it may be allocated on stack and no new fields can be added to it
+ * without libavcodec and libavformat major bump.
+ *
+ * The semantics of data ownership depends on the destruct field.
+ * If it is set, the packet data is dynamically allocated and is valid
+ * indefinitely until av_free_packet() is called (which in turn calls the
+ * destruct callback to free the data). If destruct is not set, the packet data
+ * is typically backed by some static buffer somewhere and is only valid for a
+ * limited time (e.g. until the next read call when demuxing).
+ *
+ * The side data is always allocated with av_malloc() and is freed in
+ * av_free_packet().
+ */
+typedef struct AVPacket {
+ /**
+ * Presentation timestamp in AVStream->time_base units; the time at which
+ * the decompressed packet will be presented to the user.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ * pts MUST be larger or equal to dts as presentation cannot happen before
+ * decompression, unless one wants to view hex dumps. Some formats misuse
+ * the terms dts and pts/cts to mean something different. Such timestamps
+ * must be converted to true pts/dts before they are stored in AVPacket.
+ */
+ int64_t pts;
+ /**
+ * Decompression timestamp in AVStream->time_base units; the time at which
+ * the packet is decompressed.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ */
+ int64_t dts;
+ uint8_t *data;
+ int size;
+ int stream_index;
+ /**
+ * A combination of AV_PKT_FLAG values
+ */
+ int flags;
+ /**
+ * Additional packet data that can be provided by the container.
+ * Packet can contain several types of side information.
+ */
+ struct {
+ uint8_t *data;
+ int size;
+ enum AVPacketSideDataType type;
+ } *side_data;
+ int side_data_elems;
+
+ /**
+ * Duration of this packet in AVStream->time_base units, 0 if unknown.
+ * Equals next_pts - this_pts in presentation order.
+ */
+ int duration;
+ void (*destruct)(struct AVPacket *);
+ void *priv;
+ int64_t pos; ///< byte position in stream, -1 if unknown
+
+ /**
+ * Time difference in AVStream->time_base units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * independent from the availability of previous frames. That is, the
+ * frames are virtually identical no matter if decoding started from
+ * the very first frame or from this keyframe.
+ * Is AV_NOPTS_VALUE if unknown.
+ * This field is not the display duration of the current packet.
+ * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
+ * set.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
+} AVPacket;
+#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe
+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
+
+enum AVSideDataParamChangeFlags {
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001,
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004,
+ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008,
+};
+/**
+ * @}
+ */
+
+/**
+ * This structure describes decoded (raw) audio or video data.
+ *
+ * AVFrame must be allocated using avcodec_alloc_frame() and freed with
+ * avcodec_free_frame(). Note that this allocates only the AVFrame itself. The
+ * buffers for the data must be managed through other means.
+ *
+ * AVFrame is typically allocated once and then reused multiple times to hold
+ * different data (e.g. a single AVFrame to hold frames received from a
+ * decoder). In such a case, avcodec_get_frame_defaults() should be used to
+ * reset the frame to its original clean state before it is reused again.
+ *
+ * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
+ * to the end with a minor bump.
+ */
+typedef struct AVFrame {
+#define AV_NUM_DATA_POINTERS 8
+ /**
+ * pointer to the picture/channel planes.
+ * This might be different from the first allocated byte
+ * - encoding: Set by user
+ * - decoding: set by AVCodecContext.get_buffer()
+ */
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+
+ /**
+ * Size, in bytes, of the data for each picture/channel plane.
+ *
+ * For audio, only linesize[0] may be set. For planar audio, each channel
+ * plane must be the same size.
+ *
+ * - encoding: Set by user
+ * - decoding: set by AVCodecContext.get_buffer()
+ */
+ int linesize[AV_NUM_DATA_POINTERS];
+
+ /**
+ * pointers to the data planes/channels.
+ *
+ * For video, this should simply point to data[].
+ *
+ * For planar audio, each channel has a separate data pointer, and
+ * linesize[0] contains the size of each channel buffer.
+ * For packed audio, there is just one data pointer, and linesize[0]
+ * contains the total size of the buffer for all channels.
+ *
+ * Note: Both data and extended_data will always be set by get_buffer(),
+ * but for planar audio with more channels that can fit in data,
+ * extended_data must be used by the decoder in order to access all
+ * channels.
+ *
+ * encoding: set by user
+ * decoding: set by AVCodecContext.get_buffer()
+ */
+ uint8_t **extended_data;
+
+ /**
+ * width and height of the video frame
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int width, height;
+
+ /**
+ * number of audio samples (per channel) described by this frame
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ int nb_samples;
+
+ /**
+ * format of the frame, -1 if unknown or unset
+ * Values correspond to enum AVPixelFormat for video frames,
+ * enum AVSampleFormat for audio)
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int format;
+
+ /**
+ * 1 -> keyframe, 0-> not
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int key_frame;
+
+ /**
+ * Picture type of the frame, see ?_TYPE below.
+ * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+ * - decoding: Set by libavcodec.
+ */
+ enum AVPictureType pict_type;
+
+ /**
+ * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.
+ * This isn't used by libavcodec unless the default get/release_buffer() is used.
+ * - encoding:
+ * - decoding:
+ */
+ uint8_t *base[AV_NUM_DATA_POINTERS];
+
+ /**
+ * sample aspect ratio for the video frame, 0/1 if unknown/unspecified
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * presentation timestamp in time_base units (time when frame should be shown to user)
+ * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int64_t pts;
+
+ /**
+ * pts copied from the AVPacket that was decoded to produce this frame
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_pts;
+
+ /**
+ * dts copied from the AVPacket that triggered returning this frame
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_dts;
+
+ /**
+ * picture number in bitstream order
+ * - encoding: set by
+ * - decoding: Set by libavcodec.
+ */
+ int coded_picture_number;
+ /**
+ * picture number in display order
+ * - encoding: set by
+ * - decoding: Set by libavcodec.
+ */
+ int display_picture_number;
+
+ /**
+ * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
+ * - encoding: Set by libavcodec. for coded_picture (and set by user for input).
+ * - decoding: Set by libavcodec.
+ */
+ int quality;
+
+ /**
+ * is this picture used as reference
+ * The values for this are the same as the MpegEncContext.picture_structure
+ * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
+ * Set to 4 for delayed, non-reference frames.
+ * - encoding: unused
+ * - decoding: Set by libavcodec. (before get_buffer() call)).
+ */
+ int reference;
+
+ /**
+ * QP table
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int8_t *qscale_table;
+ /**
+ * QP store stride
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int qstride;
+
+ /**
+ *
+ */
+ int qscale_type;
+
+ /**
+ * mbskip_table[mb]>=1 if MB didn't change
+ * stride= mb_width = (width+15)>>4
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ uint8_t *mbskip_table;
+
+ /**
+ * motion vector table
+ * @code
+ * example:
+ * int mv_sample_log2= 4 - motion_subsample_log2;
+ * int mb_width= (width+15)>>4;
+ * int mv_stride= (mb_width << mv_sample_log2) + 1;
+ * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
+ * @endcode
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t (*motion_val[2])[2];
+
+ /**
+ * macroblock type table
+ * mb_type_base + mb_width + 2
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ uint32_t *mb_type;
+
+ /**
+ * DCT coefficients
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ short *dct_coeff;
+
+ /**
+ * motion reference frame index
+ * the order in which these are stored can depend on the codec.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int8_t *ref_index[2];
+
+ /**
+ * for some private data of the user
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ /**
+ * error
+ * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * type of the buffer (to keep track of who has to deallocate data[*])
+ * - encoding: Set by the one who allocates it.
+ * - decoding: Set by the one who allocates it.
+ * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.
+ */
+ int type;
+
+ /**
+ * When decoding, this signals how much the picture must be delayed.
+ * extra_delay = repeat_pict / (2*fps)
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int repeat_pict;
+
+ /**
+ * The content of the picture is interlaced.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec. (default 0)
+ */
+ int interlaced_frame;
+
+ /**
+ * If the content is interlaced, is top field displayed first.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int top_field_first;
+
+ /**
+ * Tell user application that palette has changed from previous frame.
+ * - encoding: ??? (no palette-enabled encoder yet)
+ * - decoding: Set by libavcodec. (default 0).
+ */
+ int palette_has_changed;
+
+ /**
+ * codec suggestion on buffer type if != 0
+ * - encoding: unused
+ * - decoding: Set by libavcodec. (before get_buffer() call)).
+ */
+ int buffer_hints;
+
+ /**
+ * Pan scan.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVPanScan *pan_scan;
+
+ /**
+ * reordered opaque 64bit (generally an integer or a double precision float
+ * PTS but can be anything).
+ * The user sets AVCodecContext.reordered_opaque to represent the input at
+ * that time,
+ * the decoder reorders values as needed and sets AVFrame.reordered_opaque
+ * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * hardware accelerator private data (Libav-allocated)
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ void *hwaccel_picture_private;
+
+ /**
+ * the AVCodecContext which ff_thread_get_buffer() was last called on
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ struct AVCodecContext *owner;
+
+ /**
+ * used by multithreading to store frame-specific info
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ void *thread_opaque;
+
+ /**
+ * log2 of the size of the block which a single vector in motion_val represents:
+ * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ uint8_t motion_subsample_log2;
+
+ /**
+ * Sample rate of the audio data.
+ *
+ * - encoding: unused
+ * - decoding: set by get_buffer()
+ */
+ int sample_rate;
+
+ /**
+ * Channel layout of the audio data.
+ *
+ * - encoding: unused
+ * - decoding: set by get_buffer()
+ */
+ uint64_t channel_layout;
+} AVFrame;
+
+struct AVCodecInternal;
+
+enum AVFieldOrder {
+ AV_FIELD_UNKNOWN,
+ AV_FIELD_PROGRESSIVE,
+ AV_FIELD_TT, //< Top coded_first, top displayed first
+ AV_FIELD_BB, //< Bottom coded first, bottom displayed first
+ AV_FIELD_TB, //< Top coded first, bottom displayed first
+ AV_FIELD_BT, //< Bottom coded first, top displayed first
+};
+
+/**
+ * main external API structure.
+ * New fields can be added to the end with minor version bumps.
+ * Removal, reordering and changes to existing fields require a major
+ * version bump.
+ * sizeof(AVCodecContext) must not be used outside libav*.
+ */
+typedef struct AVCodecContext {
+ /**
+ * information on struct for av_log
+ * - set by avcodec_alloc_context3
+ */
+ const AVClass *av_class;
+ int log_level_offset;
+
+ enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
+ const struct AVCodec *codec;
+ char codec_name[32];
+ enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
+
+ /**
+ * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * A demuxer should set this to what is stored in the field used to identify the codec.
+ * If there are multiple such fields in a container then the demuxer should choose the one
+ * which maximizes the information about the used codec.
+ * If the codec tag field in a container is larger than 32 bits then the demuxer should
+ * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
+ * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
+ * first.
+ * - encoding: Set by user, if not then the default based on codec_id will be used.
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int codec_tag;
+
+ /**
+ * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * - encoding: unused
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int stream_codec_tag;
+
+#if FF_API_SUB_ID
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated int sub_id;
+#endif
+
+ void *priv_data;
+
+ /**
+ * Private context used for internal data.
+ *
+ * Unlike priv_data, this is not codec-specific. It is used in general
+ * libavcodec functions.
+ */
+ struct AVCodecInternal *internal;
+
+ /**
+ * Private data of the user, can be used to carry app specific stuff.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ /**
+ * the average bitrate
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the stream.
+ */
+ int bit_rate;
+
+ /**
+ * number of bits the bitstream is allowed to diverge from the reference.
+ * the reference can be CBR (for CBR pass1) or VBR (for pass2)
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: unused
+ */
+ int bit_rate_tolerance;
+
+ /**
+ * Global quality for codecs which cannot change it per frame.
+ * This should be proportional to MPEG-1/2/4 qscale.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int global_quality;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int compression_level;
+#define FF_COMPRESSION_DEFAULT -1
+
+ /**
+ * CODEC_FLAG_*.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags;
+
+ /**
+ * CODEC_FLAG2_*
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags2;
+
+ /**
+ * some codecs need / can use extradata like Huffman tables.
+ * mjpeg: Huffman tables
+ * rv10: additional flags
+ * mpeg4: global headers (they can be in the bitstream or here)
+ * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger
+ * than extradata_size to avoid prolems if it is read with the bitstream reader.
+ * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
+ * - encoding: Set/allocated/freed by libavcodec.
+ * - decoding: Set/allocated/freed by user.
+ */
+ uint8_t *extradata;
+ int extradata_size;
+
+ /**
+ * This is the fundamental unit of time (in seconds) in terms
+ * of which frame timestamps are represented. For fixed-fps content,
+ * timebase should be 1/framerate and timestamp increments should be
+ * identically 1.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational time_base;
+
+ /**
+ * For some codecs, the time base is closer to the field rate than the frame rate.
+ * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
+ * if no telecine is used ...
+ *
+ * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
+ */
+ int ticks_per_frame;
+
+ /**
+ * Codec delay.
+ *
+ * Video:
+ * Number of frames the decoded output will be delayed relative to the
+ * encoded input.
+ *
+ * Audio:
+ * For encoding, this is the number of "priming" samples added to the
+ * beginning of the stream. The decoded output will be delayed by this
+ * many samples relative to the input to the encoder. Note that this
+ * field is purely informational and does not directly affect the pts
+ * output by the encoder, which should always be based on the actual
+ * presentation time, including any delay.
+ * For decoding, this is the number of samples the decoder needs to
+ * output before the decoder's output is valid. When seeking, you should
+ * start decoding this many samples prior to your desired seek point.
+ *
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int delay;
+
+
+ /* video only */
+ /**
+ * picture width / height.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ * Note: For compatibility it is possible to set this instead of
+ * coded_width/height before decoding.
+ */
+ int width, height;
+
+ /**
+ * Bitstream width / height, may be different from width/height.
+ * - encoding: unused
+ * - decoding: Set by user before init if known. Codec should override / dynamically change if needed.
+ */
+ int coded_width, coded_height;
+
+#define FF_ASPECT_EXTENDED 15
+
+ /**
+ * the number of pictures in a group of pictures, or 0 for intra_only
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int gop_size;
+
+ /**
+ * Pixel format, see AV_PIX_FMT_xxx.
+ * May be set by the demuxer if known from headers.
+ * May be overriden by the decoder if it knows better.
+ * - encoding: Set by user.
+ * - decoding: Set by user if known, overridden by libavcodec if known
+ */
+ enum AVPixelFormat pix_fmt;
+
+ /**
+ * Motion estimation algorithm used for video coding.
+ * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex),
+ * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific]
+ * - encoding: MUST be set by user.
+ * - decoding: unused
+ */
+ int me_method;
+
+ /**
+ * If non NULL, 'draw_horiz_band' is called by the libavcodec
+ * decoder to draw a horizontal band. It improves cache usage. Not
+ * all codecs can do that. You must check the codec capabilities
+ * beforehand.
+ * When multithreading is used, it may be called from multiple threads
+ * at the same time; threads might draw different parts of the same AVFrame,
+ * or multiple AVFrames, and there is no guarantee that slices will be drawn
+ * in order.
+ * The function is also used by hardware acceleration APIs.
+ * It is called at least once during frame decoding to pass
+ * the data needed for hardware render.
+ * In that mode instead of pixel data, AVFrame points to
+ * a structure specific to the acceleration API. The application
+ * reads the structure and can change some fields to indicate progress
+ * or mark state.
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @param height the height of the slice
+ * @param y the y position of the slice
+ * @param type 1->top field, 2->bottom field, 3->frame
+ * @param offset offset into the AVFrame.data from which the slice should be read
+ */
+ void (*draw_horiz_band)(struct AVCodecContext *s,
+ const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
+ int y, int type, int height);
+
+ /**
+ * callback to negotiate the pixelFormat
+ * @param fmt is the list of formats which are supported by the codec,
+ * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
+ * The first is always the native one.
+ * @return the chosen format
+ * - encoding: unused
+ * - decoding: Set by user, if not set the native format will be chosen.
+ */
+ enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
+
+ /**
+ * maximum number of B-frames between non-B-frames
+ * Note: The output will be delayed by max_b_frames+1 relative to the input.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_b_frames;
+
+ /**
+ * qscale factor between IP and B-frames
+ * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_factor;
+
+ /** obsolete FIXME remove */
+ int rc_strategy;
+#define FF_RC_STRATEGY_XVID 1
+
+ int b_frame_strategy;
+
+#if FF_API_MPV_GLOBAL_OPTS
+ /**
+ * luma single coefficient elimination threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int luma_elim_threshold;
+
+ /**
+ * chroma single coeff elimination threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ attribute_deprecated int chroma_elim_threshold;
+#endif
+
+ /**
+ * qscale offset between IP and B-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_offset;
+
+ /**
+ * Size of the frame reordering buffer in the decoder.
+ * For MPEG-2 it is 1 IPB or 0 low delay IP.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int has_b_frames;
+
+ /**
+ * 0-> h263 quant 1-> mpeg quant
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mpeg_quant;
+
+ /**
+ * qscale factor between P and I-frames
+ * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_factor;
+
+ /**
+ * qscale offset between P and I-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_offset;
+
+ /**
+ * luminance masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float lumi_masking;
+
+ /**
+ * temporary complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float temporal_cplx_masking;
+
+ /**
+ * spatial complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float spatial_cplx_masking;
+
+ /**
+ * p block masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float p_masking;
+
+ /**
+ * darkness masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float dark_masking;
+
+ /**
+ * slice count
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user (or 0).
+ */
+ int slice_count;
+ /**
+ * prediction method (needed for huffyuv)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int prediction_method;
+#define FF_PRED_LEFT 0
+#define FF_PRED_PLANE 1
+#define FF_PRED_MEDIAN 2
+
+ /**
+ * slice offsets in the frame in bytes
+ * - encoding: Set/allocated by libavcodec.
+ * - decoding: Set/allocated by user (or NULL).
+ */
+ int *slice_offset;
+
+ /**
+ * sample aspect ratio (0 if unknown)
+ * That is the width of a pixel divided by the height of the pixel.
+ * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_cmp;
+ /**
+ * subpixel motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_sub_cmp;
+ /**
+ * macroblock comparison function (not supported yet)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_cmp;
+ /**
+ * interlaced DCT comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int ildct_cmp;
+#define FF_CMP_SAD 0
+#define FF_CMP_SSE 1
+#define FF_CMP_SATD 2
+#define FF_CMP_DCT 3
+#define FF_CMP_PSNR 4
+#define FF_CMP_BIT 5
+#define FF_CMP_RD 6
+#define FF_CMP_ZERO 7
+#define FF_CMP_VSAD 8
+#define FF_CMP_VSSE 9
+#define FF_CMP_NSSE 10
+#define FF_CMP_W53 11
+#define FF_CMP_W97 12
+#define FF_CMP_DCTMAX 13
+#define FF_CMP_DCT264 14
+#define FF_CMP_CHROMA 256
+
+ /**
+ * ME diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dia_size;
+
+ /**
+ * amount of previous MV predictors (2a+1 x 2a+1 square)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int last_predictor_count;
+
+ /**
+ * prepass for motion estimation
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_me;
+
+ /**
+ * motion estimation prepass comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_pre_cmp;
+
+ /**
+ * ME prepass diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_dia_size;
+
+ /**
+ * subpel ME quality
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_subpel_quality;
+
+ /**
+ * DTG active format information (additional aspect ratio
+ * information only used in DVB MPEG-2 transport streams)
+ * 0 if not set.
+ *
+ * - encoding: unused
+ * - decoding: Set by decoder.
+ */
+ int dtg_active_format;
+#define FF_DTG_AFD_SAME 8
+#define FF_DTG_AFD_4_3 9
+#define FF_DTG_AFD_16_9 10
+#define FF_DTG_AFD_14_9 11
+#define FF_DTG_AFD_4_3_SP_14_9 13
+#define FF_DTG_AFD_16_9_SP_14_9 14
+#define FF_DTG_AFD_SP_4_3 15
+
+ /**
+ * maximum motion estimation search range in subpel units
+ * If 0 then no limit.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_range;
+
+ /**
+ * intra quantizer bias
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int intra_quant_bias;
+#define FF_DEFAULT_QUANT_BIAS 999999
+
+ /**
+ * inter quantizer bias
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int inter_quant_bias;
+
+#if FF_API_COLOR_TABLE_ID
+ /**
+ * color table ID
+ * - encoding: unused
+ * - decoding: Which clrtable should be used for 8bit RGB images.
+ * Tables have to be stored somewhere. FIXME
+ */
+ attribute_deprecated int color_table_id;
+#endif
+
+ /**
+ * slice flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int slice_flags;
+#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display
+#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG2 field pics)
+#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
+
+ /**
+ * XVideo Motion Acceleration
+ * - encoding: forbidden
+ * - decoding: set by decoder
+ */
+ int xvmc_acceleration;
+
+ /**
+ * macroblock decision mode
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_decision;
+#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp
+#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits
+#define FF_MB_DECISION_RD 2 ///< rate distortion
+
+ /**
+ * custom intra quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *intra_matrix;
+
+ /**
+ * custom inter quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *inter_matrix;
+
+ /**
+ * scene change detection threshold
+ * 0 is default, larger means fewer detected scene changes.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_threshold;
+
+ /**
+ * noise reduction strength
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int noise_reduction;
+
+#if FF_API_INTER_THRESHOLD
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated int inter_threshold;
+#endif
+
+#if FF_API_MPV_GLOBAL_OPTS
+ /**
+ * @deprecated use mpegvideo private options instead
+ */
+ attribute_deprecated int quantizer_noise_shaping;
+#endif
+
+ /**
+ * Motion estimation threshold below which no motion estimation is
+ * performed, but instead the user specified motion vectors are used.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_threshold;
+
+ /**
+ * Macroblock threshold below which the user specified macroblock types will be used.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_threshold;
+
+ /**
+ * precision of the intra DC coefficient - 8
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int intra_dc_precision;
+
+ /**
+ * Number of macroblock rows at the top which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_top;
+
+ /**
+ * Number of macroblock rows at the bottom which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_bottom;
+
+ /**
+ * Border processing masking, raises the quantizer for mbs on the borders
+ * of the picture.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float border_masking;
+
+ /**
+ * minimum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmin;
+
+ /**
+ * maximum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmax;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_penalty_compensation;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int bidir_refine;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int brd_scale;
+
+ /**
+ * minimum GOP size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int keyint_min;
+
+ /**
+ * number of reference frames
+ * - encoding: Set by user.
+ * - decoding: Set by lavc.
+ */
+ int refs;
+
+ /**
+ * chroma qp offset from luma
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int chromaoffset;
+
+ /**
+ * Multiplied by qscale for each frame and added to scene_change_score.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_factor;
+
+ /**
+ *
+ * Note: Value depends upon the compare function used for fullpel ME.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mv0_threshold;
+
+ /**
+ * Adjust sensitivity of b_frame_strategy 1.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int b_sensitivity;
+
+ /**
+ * Chromaticity coordinates of the source primaries.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorPrimaries color_primaries;
+
+ /**
+ * Color Transfer Characteristic.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorTransferCharacteristic color_trc;
+
+ /**
+ * YUV colorspace type.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorSpace colorspace;
+
+ /**
+ * MPEG vs JPEG YUV range.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorRange color_range;
+
+ /**
+ * This defines the location of chroma samples.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVChromaLocation chroma_sample_location;
+
+ /**
+ * Number of slices.
+ * Indicates number of picture subdivisions. Used for parallelized
+ * decoding.
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ int slices;
+
+ /** Field order
+ * - encoding: set by libavcodec
+ * - decoding: Set by libavcodec
+ */
+ enum AVFieldOrder field_order;
+
+ /* audio only */
+ int sample_rate; ///< samples per second
+ int channels; ///< number of audio channels
+
+ /**
+ * audio sample format
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVSampleFormat sample_fmt; ///< sample format
+
+ /* The following data should not be initialized. */
+ /**
+ * Number of samples per channel in an audio frame.
+ *
+ * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame
+ * except the last must contain exactly frame_size samples per channel.
+ * May be 0 when the codec has CODEC_CAP_VARIABLE_FRAME_SIZE set, then the
+ * frame size is not restricted.
+ * - decoding: may be set by some decoders to indicate constant frame size
+ */
+ int frame_size;
+
+ /**
+ * Frame counter, set by libavcodec.
+ *
+ * - decoding: total number of frames returned from the decoder so far.
+ * - encoding: total number of frames passed to the encoder so far.
+ *
+ * @note the counter is not incremented if encoding/decoding resulted in
+ * an error.
+ */
+ int frame_number;
+
+ /**
+ * number of bytes per packet if constant and known or 0
+ * Used by some WAV based audio codecs.
+ */
+ int block_align;
+
+ /**
+ * Audio cutoff bandwidth (0 means "automatic")
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int cutoff;
+
+#if FF_API_REQUEST_CHANNELS
+ /**
+ * Decoder should decode to this many channels if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @deprecated Deprecated in favor of request_channel_layout.
+ */
+ int request_channels;
+#endif
+
+ /**
+ * Audio channel layout.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ uint64_t channel_layout;
+
+ /**
+ * Request decoder to use this channel layout if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ uint64_t request_channel_layout;
+
+ /**
+ * Type of service that the audio stream conveys.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVAudioServiceType audio_service_type;
+
+ /**
+ * Used to request a sample format from the decoder.
+ * - encoding: unused.
+ * - decoding: Set by user.
+ */
+ enum AVSampleFormat request_sample_fmt;
+
+ /**
+ * Called at the beginning of each frame to get a buffer for it.
+ *
+ * The function will set AVFrame.data[], AVFrame.linesize[].
+ * AVFrame.extended_data[] must also be set, but it should be the same as
+ * AVFrame.data[] except for planar audio with more channels than can fit
+ * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as
+ * many data pointers as it can hold.
+ *
+ * if CODEC_CAP_DR1 is not set then get_buffer() must call
+ * avcodec_default_get_buffer() instead of providing buffers allocated by
+ * some other means.
+ *
+ * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't
+ * need it. avcodec_default_get_buffer() aligns the output buffer properly,
+ * but if get_buffer() is overridden then alignment considerations should
+ * be taken into account.
+ *
+ * @see avcodec_default_get_buffer()
+ *
+ * Video:
+ *
+ * If pic.reference is set then the frame will be read later by libavcodec.
+ * avcodec_align_dimensions2() should be used to find the required width and
+ * height, as they normally need to be rounded up to the next multiple of 16.
+ *
+ * If frame multithreading is used and thread_safe_callbacks is set,
+ * it may be called from a different thread, but not from more than one at
+ * once. Does not need to be reentrant.
+ *
+ * @see release_buffer(), reget_buffer()
+ * @see avcodec_align_dimensions2()
+ *
+ * Audio:
+ *
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer(). The decoder may,
+ * however, utilize only part of the buffer by setting AVFrame.nb_samples
+ * to a smaller value in the output frame.
+ *
+ * Decoders cannot use the buffer after returning from
+ * avcodec_decode_audio4(), so they will not call release_buffer(), as it
+ * is assumed to be released immediately upon return. In some rare cases,
+ * a decoder may need to call get_buffer() more than once in a single
+ * call to avcodec_decode_audio4(). In that case, when get_buffer() is
+ * called again after it has already been called once, the previously
+ * acquired buffer is assumed to be released at that time and may not be
+ * reused by the decoder.
+ *
+ * As a convenience, av_samples_get_buffer_size() and
+ * av_samples_fill_arrays() in libavutil may be used by custom get_buffer()
+ * functions to find the required data size and to fill data pointers and
+ * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+ * since all planes must be the same size.
+ *
+ * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Called to release buffers which were allocated with get_buffer.
+ * A released buffer can be reused in get_buffer().
+ * pic.data[*] must be set to NULL.
+ * May be called from a different thread if frame multithreading is used,
+ * but not by more than one thread at once, so does not need to be reentrant.
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Called at the beginning of a frame to get cr buffer for it.
+ * Buffer type (size, hints) must be the same. libavcodec won't check it.
+ * libavcodec will pass previous buffer in pic, function should return
+ * same buffer or new buffer with old frame "painted" into it.
+ * If pic.data[0] == NULL must behave like get_buffer().
+ * if CODEC_CAP_DR1 is not set then reget_buffer() must call
+ * avcodec_default_reget_buffer() instead of providing buffers allocated by
+ * some other means.
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+
+ /* - encoding parameters */
+ float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0)
+ float qblur; ///< amount of qscale smoothing over time (0.0-1.0)
+
+ /**
+ * minimum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmin;
+
+ /**
+ * maximum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmax;
+
+ /**
+ * maximum quantizer difference between frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_qdiff;
+
+ /**
+ * ratecontrol qmin qmax limiting method
+ * 0-> clipping, 1-> use a nice continuous function to limit qscale wthin qmin/qmax.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float rc_qsquish;
+
+ float rc_qmod_amp;
+ int rc_qmod_freq;
+
+ /**
+ * decoder bitstream buffer size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_buffer_size;
+
+ /**
+ * ratecontrol override, see RcOverride
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ int rc_override_count;
+ RcOverride *rc_override;
+
+ /**
+ * rate control equation
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ const char *rc_eq;
+
+ /**
+ * maximum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_max_rate;
+
+ /**
+ * minimum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_min_rate;
+
+ float rc_buffer_aggressivity;
+
+ /**
+ * initial complexity for pass1 ratecontrol
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float rc_initial_cplx;
+
+ /**
+ * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_max_available_vbv_use;
+
+ /**
+ * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_min_vbv_overflow_use;
+
+ /**
+ * Number of bits which should be loaded into the rc buffer before decoding starts.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_initial_buffer_occupancy;
+
+#define FF_CODER_TYPE_VLC 0
+#define FF_CODER_TYPE_AC 1
+#define FF_CODER_TYPE_RAW 2
+#define FF_CODER_TYPE_RLE 3
+#define FF_CODER_TYPE_DEFLATE 4
+ /**
+ * coder type
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int coder_type;
+
+ /**
+ * context model
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int context_model;
+
+ /**
+ * minimum Lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int lmin;
+
+ /**
+ * maximum Lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int lmax;
+
+ /**
+ * frame skip threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_threshold;
+
+ /**
+ * frame skip factor
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_factor;
+
+ /**
+ * frame skip exponent
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_exp;
+
+ /**
+ * frame skip comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_cmp;
+
+ /**
+ * trellis RD quantization
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int trellis;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int min_prediction_order;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_prediction_order;
+
+ /**
+ * GOP timecode frame start number, in non drop frame format
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int64_t timecode_frame_start;
+
+ /* The RTP callback: This function is called */
+ /* every time the encoder has a packet to send. */
+ /* It depends on the encoder if the data starts */
+ /* with a Start Code (it should). H.263 does. */
+ /* mb_nb contains the number of macroblocks */
+ /* encoded in the RTP payload. */
+ void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb);
+
+ int rtp_payload_size; /* The size of the RTP payload: the coder will */
+ /* do its best to deliver a chunk with size */
+ /* below rtp_payload_size, the chunk will start */
+ /* with a start code on some codecs like H.263. */
+ /* This doesn't take account of any particular */
+ /* headers inside the transmitted RTP payload. */
+
+ /* statistics, used for 2-pass encoding */
+ int mv_bits;
+ int header_bits;
+ int i_tex_bits;
+ int p_tex_bits;
+ int i_count;
+ int p_count;
+ int skip_count;
+ int misc_bits;
+
+ /**
+ * number of bits used for the previously encoded frame
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ int frame_bits;
+
+ /**
+ * pass1 encoding statistics output buffer
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ char *stats_out;
+
+ /**
+ * pass2 encoding statistics input buffer
+ * Concatenated stuff from stats_out of pass1 should be placed here.
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ char *stats_in;
+
+ /**
+ * Work around bugs in encoders which sometimes cannot be detected automatically.
+ * - encoding: Set by user
+ * - decoding: Set by user
+ */
+ int workaround_bugs;
+#define FF_BUG_AUTODETECT 1 ///< autodetection
+#define FF_BUG_OLD_MSMPEG4 2
+#define FF_BUG_XVID_ILACE 4
+#define FF_BUG_UMP4 8
+#define FF_BUG_NO_PADDING 16
+#define FF_BUG_AMV 32
+#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default.
+#define FF_BUG_QPEL_CHROMA 64
+#define FF_BUG_STD_QPEL 128
+#define FF_BUG_QPEL_CHROMA2 256
+#define FF_BUG_DIRECT_BLOCKSIZE 512
+#define FF_BUG_EDGE 1024
+#define FF_BUG_HPEL_CHROMA 2048
+#define FF_BUG_DC_CLIP 4096
+#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
+#define FF_BUG_TRUNCATED 16384
+
+ /**
+ * strictly follow the standard (MPEG4, ...).
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ * Setting this to STRICT or higher means the encoder and decoder will
+ * generally do stupid things, whereas setting it to unofficial or lower
+ * will mean the encoder might produce output that is not supported by all
+ * spec-compliant decoders. Decoders don't differentiate between normal,
+ * unofficial and experimental (that is, they always try to decode things
+ * when they can) unless they are explicitly asked to behave stupidly
+ * (=strictly conform to the specs)
+ */
+ int strict_std_compliance;
+#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software.
+#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences.
+#define FF_COMPLIANCE_NORMAL 0
+#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions
+#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
+
+ /**
+ * error concealment flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int error_concealment;
+#define FF_EC_GUESS_MVS 1
+#define FF_EC_DEBLOCK 2
+
+ /**
+ * debug
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug;
+#define FF_DEBUG_PICT_INFO 1
+#define FF_DEBUG_RC 2
+#define FF_DEBUG_BITSTREAM 4
+#define FF_DEBUG_MB_TYPE 8
+#define FF_DEBUG_QP 16
+#define FF_DEBUG_MV 32
+#define FF_DEBUG_DCT_COEFF 0x00000040
+#define FF_DEBUG_SKIP 0x00000080
+#define FF_DEBUG_STARTCODE 0x00000100
+#define FF_DEBUG_PTS 0x00000200
+#define FF_DEBUG_ER 0x00000400
+#define FF_DEBUG_MMCO 0x00000800
+#define FF_DEBUG_BUGS 0x00001000
+#define FF_DEBUG_VIS_QP 0x00002000
+#define FF_DEBUG_VIS_MB_TYPE 0x00004000
+#define FF_DEBUG_BUFFERS 0x00008000
+#define FF_DEBUG_THREADS 0x00010000
+
+ /**
+ * debug
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug_mv;
+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames
+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames
+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
+
+ /**
+ * Error recognition; may misdetect some more or less valid parts as errors.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int err_recognition;
+#define AV_EF_CRCCHECK (1<<0)
+#define AV_EF_BITSTREAM (1<<1)
+#define AV_EF_BUFFER (1<<2)
+#define AV_EF_EXPLODE (1<<3)
+
+ /**
+ * opaque 64bit number (generally a PTS) that will be reordered and
+ * output in AVFrame.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * Hardware accelerator in use
+ * - encoding: unused.
+ * - decoding: Set by libavcodec
+ */
+ struct AVHWAccel *hwaccel;
+
+ /**
+ * Hardware accelerator context.
+ * For some hardware accelerators, a global context needs to be
+ * provided by the user. In that case, this holds display-dependent
+ * data Libav cannot instantiate itself. Please refer to the
+ * Libav HW accelerator documentation to know how to fill this
+ * is. e.g. for VA API, this is a struct vaapi_context.
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *hwaccel_context;
+
+ /**
+ * error
+ * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * DCT algorithm, see FF_DCT_* below
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dct_algo;
+#define FF_DCT_AUTO 0
+#define FF_DCT_FASTINT 1
+#define FF_DCT_INT 2
+#define FF_DCT_MMX 3
+#define FF_DCT_ALTIVEC 5
+#define FF_DCT_FAAN 6
+
+ /**
+ * IDCT algorithm, see FF_IDCT_* below.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int idct_algo;
+#define FF_IDCT_AUTO 0
+#define FF_IDCT_INT 1
+#define FF_IDCT_SIMPLE 2
+#define FF_IDCT_SIMPLEMMX 3
+#if FF_API_LIBMPEG2
+#define FF_IDCT_LIBMPEG2MMX 4
+#endif
+#if FF_API_MMI
+#define FF_IDCT_MMI 5
+#endif
+#define FF_IDCT_ARM 7
+#define FF_IDCT_ALTIVEC 8
+#define FF_IDCT_SH4 9
+#define FF_IDCT_SIMPLEARM 10
+#define FF_IDCT_H264 11
+#define FF_IDCT_VP3 12
+#define FF_IDCT_IPP 13
+#define FF_IDCT_XVIDMMX 14
+#define FF_IDCT_CAVS 15
+#define FF_IDCT_SIMPLEARMV5TE 16
+#define FF_IDCT_SIMPLEARMV6 17
+#define FF_IDCT_SIMPLEVIS 18
+#define FF_IDCT_WMV2 19
+#define FF_IDCT_FAAN 20
+#define FF_IDCT_EA 21
+#define FF_IDCT_SIMPLENEON 22
+#define FF_IDCT_SIMPLEALPHA 23
+#define FF_IDCT_BINK 24
+
+#if FF_API_DSP_MASK
+ /**
+ * Unused.
+ * @deprecated use av_set_cpu_flags_mask() instead.
+ */
+ attribute_deprecated unsigned dsp_mask;
+#endif
+
+ /**
+ * bits per sample/pixel from the demuxer (needed for huffyuv).
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user.
+ */
+ int bits_per_coded_sample;
+
+ /**
+ * Bits per sample/pixel of internal libavcodec pixel/sample format.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ int bits_per_raw_sample;
+
+ /**
+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ attribute_deprecated int lowres;
+
+ /**
+ * the picture in the bitstream
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ AVFrame *coded_frame;
+
+ /**
+ * thread count
+ * is used to decide how many independent tasks should be passed to execute()
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_count;
+
+ /**
+ * Which multithreading methods to use.
+ * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
+ * so clients which cannot provide future frames should not use it.
+ *
+ * - encoding: Set by user, otherwise the default is used.
+ * - decoding: Set by user, otherwise the default is used.
+ */
+ int thread_type;
+#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once
+#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once
+
+ /**
+ * Which multithreading methods are in use by the codec.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int active_thread_type;
+
+ /**
+ * Set by the client if its custom get_buffer() callback can be called
+ * synchronously from another thread, which allows faster multithreaded decoding.
+ * draw_horiz_band() will be called from other threads regardless of this setting.
+ * Ignored if the default get_buffer() is used.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_safe_callbacks;
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * @param count the number of things to execute
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * Also see avcodec_thread_init and e.g. the --enable-pthread configure option.
+ * @param c context passed also to func
+ * @param count the number of things to execute
+ * @param arg2 argument passed unchanged to func
+ * @param ret return values of executed functions, must have space for "count" values. May be NULL.
+ * @param func function that will be called count times, with jobnr from 0 to count-1.
+ * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no
+ * two instances of func executing at the same time will have the same threadnr.
+ * @return always 0 currently, but code should handle a future improvement where when any call to func
+ * returns < 0 no further calls to func may be done and < 0 is returned.
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
+
+ /**
+ * thread opaque
+ * Can be used by execute() to store some per AVCodecContext stuff.
+ * - encoding: set by execute()
+ * - decoding: set by execute()
+ */
+ void *thread_opaque;
+
+ /**
+ * noise vs. sse weight for the nsse comparsion function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int nsse_weight;
+
+ /**
+ * profile
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int profile;
+#define FF_PROFILE_UNKNOWN -99
+#define FF_PROFILE_RESERVED -100
+
+#define FF_PROFILE_AAC_MAIN 0
+#define FF_PROFILE_AAC_LOW 1
+#define FF_PROFILE_AAC_SSR 2
+#define FF_PROFILE_AAC_LTP 3
+#define FF_PROFILE_AAC_HE 4
+#define FF_PROFILE_AAC_HE_V2 28
+#define FF_PROFILE_AAC_LD 22
+#define FF_PROFILE_AAC_ELD 38
+
+#define FF_PROFILE_DTS 20
+#define FF_PROFILE_DTS_ES 30
+#define FF_PROFILE_DTS_96_24 40
+#define FF_PROFILE_DTS_HD_HRA 50
+#define FF_PROFILE_DTS_HD_MA 60
+
+#define FF_PROFILE_MPEG2_422 0
+#define FF_PROFILE_MPEG2_HIGH 1
+#define FF_PROFILE_MPEG2_SS 2
+#define FF_PROFILE_MPEG2_SNR_SCALABLE 3
+#define FF_PROFILE_MPEG2_MAIN 4
+#define FF_PROFILE_MPEG2_SIMPLE 5
+
+#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag
+#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag
+
+#define FF_PROFILE_H264_BASELINE 66
+#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)
+#define FF_PROFILE_H264_MAIN 77
+#define FF_PROFILE_H264_EXTENDED 88
+#define FF_PROFILE_H264_HIGH 100
+#define FF_PROFILE_H264_HIGH_10 110
+#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_422 122
+#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_444 144
+#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244
+#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_CAVLC_444 44
+
+#define FF_PROFILE_VC1_SIMPLE 0
+#define FF_PROFILE_VC1_MAIN 1
+#define FF_PROFILE_VC1_COMPLEX 2
+#define FF_PROFILE_VC1_ADVANCED 3
+
+#define FF_PROFILE_MPEG4_SIMPLE 0
+#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1
+#define FF_PROFILE_MPEG4_CORE 2
+#define FF_PROFILE_MPEG4_MAIN 3
+#define FF_PROFILE_MPEG4_N_BIT 4
+#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5
+#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
+#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
+#define FF_PROFILE_MPEG4_HYBRID 8
+#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
+#define FF_PROFILE_MPEG4_CORE_SCALABLE 10
+#define FF_PROFILE_MPEG4_ADVANCED_CODING 11
+#define FF_PROFILE_MPEG4_ADVANCED_CORE 12
+#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
+#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14
+#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15
+
+ /**
+ * level
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int level;
+#define FF_LEVEL_UNKNOWN -99
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_loop_filter;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_idct;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_frame;
+
+ /**
+ * Header containing style information for text subtitles.
+ * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
+ * [Script Info] and [V4+ Styles] section, plus the [Events] line and
+ * the Format line following. It shouldn't include any Dialogue line.
+ * - encoding: Set/allocated/freed by user (before avcodec_open2())
+ * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
+ */
+ uint8_t *subtitle_header;
+ int subtitle_header_size;
+
+ /**
+ * Simulates errors in the bitstream to test error concealment.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int error_rate;
+
+ /**
+ * Current packet as passed into the decoder, to avoid having
+ * to pass the packet into every function. Currently only valid
+ * inside lavc and get/release_buffer callbacks.
+ * - decoding: set by avcodec_decode_*, read by get_buffer() for setting pkt_pts
+ * - encoding: unused
+ */
+ AVPacket *pkt;
+
+ /**
+ * VBV delay coded in the last frame (in periods of a 27 MHz clock).
+ * Used for compliant TS muxing.
+ * - encoding: Set by libavcodec.
+ * - decoding: unused.
+ */
+ uint64_t vbv_delay;
+} AVCodecContext;
+
+/**
+ * AVProfile.
+ */
+typedef struct AVProfile {
+ int profile;
+ const char *name; ///< short name for the profile
+} AVProfile;
+
+typedef struct AVCodecDefault AVCodecDefault;
+
+struct AVSubtitle;
+
+/**
+ * AVCodec.
+ */
+typedef struct AVCodec {
+ /**
+ * Name of the codec implementation.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ * This is the primary way to find a codec from the user perspective.
+ */
+ const char *name;
+ /**
+ * Descriptive name for the codec, meant to be more human readable than name.
+ * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
+ */
+ const char *long_name;
+ enum AVMediaType type;
+ enum AVCodecID id;
+ /**
+ * Codec capabilities.
+ * see CODEC_CAP_*
+ */
+ int capabilities;
+ const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
+ const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
+ const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
+ const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
+ const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
+ attribute_deprecated uint8_t max_lowres; ///< maximum value for lowres supported by the decoder
+ const AVClass *priv_class; ///< AVClass for the private context
+ const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
+
+ /*****************************************************************
+ * No fields below this line are part of the public API. They
+ * may not be used outside of libavcodec and can be changed and
+ * removed at will.
+ * New public fields should be added right above.
+ *****************************************************************
+ */
+ int priv_data_size;
+ struct AVCodec *next;
+ /**
+ * @name Frame-level threading support functions
+ * @{
+ */
+ /**
+ * If defined, called on thread contexts when they are created.
+ * If the codec allocates writable tables in init(), re-allocate them here.
+ * priv_data will be set to a copy of the original.
+ */
+ int (*init_thread_copy)(AVCodecContext *);
+ /**
+ * Copy necessary context variables from a previous thread context to the current one.
+ * If not defined, the next thread will start automatically; otherwise, the codec
+ * must call ff_thread_finish_setup().
+ *
+ * dst and src will (rarely) point to the same context, in which case memcpy should be skipped.
+ */
+ int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src);
+ /** @} */
+
+ /**
+ * Private codec-specific defaults.
+ */
+ const AVCodecDefault *defaults;
+
+ /**
+ * Initialize codec static data, called from avcodec_register().
+ */
+ void (*init_static_data)(struct AVCodec *codec);
+
+ int (*init)(AVCodecContext *);
+ int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size,
+ const struct AVSubtitle *sub);
+ /**
+ * Encode data to an AVPacket.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket (may contain a user-provided buffer)
+ * @param[in] frame AVFrame containing the raw data to be encoded
+ * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
+ * non-empty packet was returned in avpkt.
+ * @return 0 on success, negative error code on failure
+ */
+ int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
+ int *got_packet_ptr);
+ int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
+ int (*close)(AVCodecContext *);
+ /**
+ * Flush buffers.
+ * Will be called when seeking
+ */
+ void (*flush)(AVCodecContext *);
+} AVCodec;
+
+/**
+ * AVHWAccel.
+ */
+typedef struct AVHWAccel {
+ /**
+ * Name of the hardware accelerated codec.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ */
+ const char *name;
+
+ /**
+ * Type of codec implemented by the hardware accelerator.
+ *
+ * See AVMEDIA_TYPE_xxx
+ */
+ enum AVMediaType type;
+
+ /**
+ * Codec implemented by the hardware accelerator.
+ *
+ * See AV_CODEC_ID_xxx
+ */
+ enum AVCodecID id;
+
+ /**
+ * Supported pixel format.
+ *
+ * Only hardware accelerated formats are supported here.
+ */
+ enum AVPixelFormat pix_fmt;
+
+ /**
+ * Hardware accelerated codec capabilities.
+ * see FF_HWACCEL_CODEC_CAP_*
+ */
+ int capabilities;
+
+ struct AVHWAccel *next;
+
+ /**
+ * Called at the beginning of each frame or field picture.
+ *
+ * Meaningful frame information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * Note that buf can be NULL along with buf_size set to 0.
+ * Otherwise, this means the whole frame is available at this point.
+ *
+ * @param avctx the codec context
+ * @param buf the frame data buffer base
+ * @param buf_size the size of the frame in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Callback for each slice.
+ *
+ * Meaningful slice information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @param buf the slice data buffer base
+ * @param buf_size the size of the slice in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Called at the end of each frame or field picture.
+ *
+ * The whole picture is parsed at this point and can now be sent
+ * to the hardware accelerator. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*end_frame)(AVCodecContext *avctx);
+
+ /**
+ * Size of HW accelerator private data.
+ *
+ * Private data is allocated with av_mallocz() before
+ * AVCodecContext.get_buffer() and deallocated after
+ * AVCodecContext.release_buffer().
+ */
+ int priv_data_size;
+} AVHWAccel;
+
+/**
+ * @defgroup lavc_picture AVPicture
+ *
+ * Functions for working with AVPicture
+ * @{
+ */
+
+/**
+ * four components are given, that's all.
+ * the last component is alpha
+ */
+typedef struct AVPicture {
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+ int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line
+} AVPicture;
+
+/**
+ * @}
+ */
+
+#define AVPALETTE_SIZE 1024
+#define AVPALETTE_COUNT 256
+
+enum AVSubtitleType {
+ SUBTITLE_NONE,
+
+ SUBTITLE_BITMAP, ///< A bitmap, pict will be set
+
+ /**
+ * Plain text, the text field must be set by the decoder and is
+ * authoritative. ass and pict fields may contain approximations.
+ */
+ SUBTITLE_TEXT,
+
+ /**
+ * Formatted text, the ass field must be set by the decoder and is
+ * authoritative. pict and text fields may contain approximations.
+ */
+ SUBTITLE_ASS,
+};
+
+#define AV_SUBTITLE_FLAG_FORCED 0x00000001
+
+typedef struct AVSubtitleRect {
+ int x; ///< top left corner of pict, undefined when pict is not set
+ int y; ///< top left corner of pict, undefined when pict is not set
+ int w; ///< width of pict, undefined when pict is not set
+ int h; ///< height of pict, undefined when pict is not set
+ int nb_colors; ///< number of colors in pict, undefined when pict is not set
+
+ /**
+ * data+linesize for the bitmap of this subtitle.
+ * can be set for text/ass as well once they where rendered
+ */
+ AVPicture pict;
+ enum AVSubtitleType type;
+
+ char *text; ///< 0 terminated plain UTF-8 text
+
+ /**
+ * 0 terminated ASS/SSA compatible event line.
+ * The pressentation of this is unaffected by the other values in this
+ * struct.
+ */
+ char *ass;
+ int flags;
+} AVSubtitleRect;
+
+typedef struct AVSubtitle {
+ uint16_t format; /* 0 = graphics */
+ uint32_t start_display_time; /* relative to packet pts, in ms */
+ uint32_t end_display_time; /* relative to packet pts, in ms */
+ unsigned num_rects;
+ AVSubtitleRect **rects;
+ int64_t pts; ///< Same as packet pts, in AV_TIME_BASE
+} AVSubtitle;
+
+/**
+ * If c is NULL, returns the first registered codec,
+ * if c is non-NULL, returns the next registered codec after c,
+ * or NULL if c is the last one.
+ */
+AVCodec *av_codec_next(const AVCodec *c);
+
+/**
+ * Return the LIBAVCODEC_VERSION_INT constant.
+ */
+unsigned avcodec_version(void);
+
+/**
+ * Return the libavcodec build-time configuration.
+ */
+const char *avcodec_configuration(void);
+
+/**
+ * Return the libavcodec license.
+ */
+const char *avcodec_license(void);
+
+/**
+ * Register the codec codec and initialize libavcodec.
+ *
+ * @warning either this function or avcodec_register_all() must be called
+ * before any other libavcodec functions.
+ *
+ * @see avcodec_register_all()
+ */
+void avcodec_register(AVCodec *codec);
+
+/**
+ * Register all the codecs, parsers and bitstream filters which were enabled at
+ * configuration time. If you do not call this function you can select exactly
+ * which formats you want to support, by using the individual registration
+ * functions.
+ *
+ * @see avcodec_register
+ * @see av_register_codec_parser
+ * @see av_register_bitstream_filter
+ */
+void avcodec_register_all(void);
+
+/**
+ * Allocate an AVCodecContext and set its fields to default values. The
+ * resulting struct can be deallocated by calling avcodec_close() on it followed
+ * by av_free().
+ *
+ * @param codec if non-NULL, allocate private data and initialize defaults
+ * for the given codec. It is illegal to then call avcodec_open2()
+ * with a different codec.
+ * If NULL, then the codec-specific defaults won't be initialized,
+ * which may result in suboptimal default settings (this is
+ * important mainly for encoders, e.g. libx264).
+ *
+ * @return An AVCodecContext filled with default values or NULL on failure.
+ * @see avcodec_get_context_defaults
+ */
+AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
+
+/**
+ * Set the fields of the given AVCodecContext to default values corresponding
+ * to the given codec (defaults may be codec-dependent).
+ *
+ * Do not call this function if a non-NULL codec has been passed
+ * to avcodec_alloc_context3() that allocated this AVCodecContext.
+ * If codec is non-NULL, it is illegal to call avcodec_open2() with a
+ * different codec on this AVCodecContext.
+ */
+int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec);
+
+/**
+ * Get the AVClass for AVCodecContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_class(void);
+
+/**
+ * Copy the settings of the source AVCodecContext into the destination
+ * AVCodecContext. The resulting destination codec context will be
+ * unopened, i.e. you are required to call avcodec_open2() before you
+ * can use this AVCodecContext to decode/encode video/audio data.
+ *
+ * @param dest target codec context, should be initialized with
+ * avcodec_alloc_context3(), but otherwise uninitialized
+ * @param src source codec context
+ * @return AVERROR() on error (e.g. memory allocation error), 0 on success
+ */
+int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
+
+/**
+ * Allocate an AVFrame and set its fields to default values. The resulting
+ * struct must be freed using avcodec_free_frame().
+ *
+ * @return An AVFrame filled with default values or NULL on failure.
+ * @see avcodec_get_frame_defaults
+ */
+AVFrame *avcodec_alloc_frame(void);
+
+/**
+ * Set the fields of the given AVFrame to default values.
+ *
+ * @param frame The AVFrame of which the fields should be set to default values.
+ */
+void avcodec_get_frame_defaults(AVFrame *frame);
+
+/**
+ * Free the frame and any dynamically allocated objects in it,
+ * e.g. extended_data.
+ *
+ * @param frame frame to be freed. The pointer will be set to NULL.
+ *
+ * @warning this function does NOT free the data buffers themselves
+ * (it does not know how, since they might have been allocated with
+ * a custom get_buffer()).
+ */
+void avcodec_free_frame(AVFrame **frame);
+
+/**
+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
+ * function the context has to be allocated with avcodec_alloc_context3().
+ *
+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
+ * retrieving a codec.
+ *
+ * @warning This function is not thread safe!
+ *
+ * @code
+ * avcodec_register_all();
+ * av_dict_set(&opts, "b", "2.5M", 0);
+ * codec = avcodec_find_decoder(AV_CODEC_ID_H264);
+ * if (!codec)
+ * exit(1);
+ *
+ * context = avcodec_alloc_context3(codec);
+ *
+ * if (avcodec_open2(context, codec, opts) < 0)
+ * exit(1);
+ * @endcode
+ *
+ * @param avctx The context to initialize.
+ * @param codec The codec to open this context for. If a non-NULL codec has been
+ * previously passed to avcodec_alloc_context3() or
+ * avcodec_get_context_defaults3() for this context, then this
+ * parameter MUST be either NULL or equal to the previously passed
+ * codec.
+ * @param options A dictionary filled with AVCodecContext and codec-private options.
+ * On return this object will be filled with options that were not found.
+ *
+ * @return zero on success, a negative value on error
+ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
+ * av_dict_set(), av_opt_find().
+ */
+int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
+
+/**
+ * Close a given AVCodecContext and free all the data associated with it
+ * (but not the AVCodecContext itself).
+ *
+ * Calling this function on an AVCodecContext that hasn't been opened will free
+ * the codec-specific data allocated in avcodec_alloc_context3() /
+ * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will
+ * do nothing.
+ */
+int avcodec_close(AVCodecContext *avctx);
+
+/**
+ * Free all allocated data in the given subtitle struct.
+ *
+ * @param sub AVSubtitle to free.
+ */
+void avsubtitle_free(AVSubtitle *sub);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_packet
+ * @{
+ */
+
+/**
+ * Default packet destructor.
+ */
+void av_destruct_packet(AVPacket *pkt);
+
+/**
+ * Initialize optional fields of a packet with default values.
+ *
+ * Note, this does not touch the data and size members, which have to be
+ * initialized separately.
+ *
+ * @param pkt packet
+ */
+void av_init_packet(AVPacket *pkt);
+
+/**
+ * Allocate the payload of a packet and initialize its fields with
+ * default values.
+ *
+ * @param pkt packet
+ * @param size wanted payload size
+ * @return 0 if OK, AVERROR_xxx otherwise
+ */
+int av_new_packet(AVPacket *pkt, int size);
+
+/**
+ * Reduce packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param size new size
+ */
+void av_shrink_packet(AVPacket *pkt, int size);
+
+/**
+ * Increase packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param grow_by number of bytes by which to increase the size of the packet
+ */
+int av_grow_packet(AVPacket *pkt, int grow_by);
+
+/**
+ * @warning This is a hack - the packet memory allocation stuff is broken. The
+ * packet is allocated if it was not really allocated.
+ */
+int av_dup_packet(AVPacket *pkt);
+
+/**
+ * Free a packet.
+ *
+ * @param pkt packet to free
+ */
+void av_free_packet(AVPacket *pkt);
+
+/**
+ * Allocate new information of a packet.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Shrink the already allocated side data buffer
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size new side information size
+ * @return 0 on success, < 0 on failure
+ */
+int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Get side information from packet.
+ *
+ * @param pkt packet
+ * @param type desired side information type
+ * @param size pointer for side information size to store (optional)
+ * @return pointer to data if present or NULL otherwise
+ */
+uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int *size);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_decoding
+ * @{
+ */
+
+/**
+ * Find a registered decoder with a matching codec ID.
+ *
+ * @param id AVCodecID of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder(enum AVCodecID id);
+
+/**
+ * Find a registered decoder with the specified name.
+ *
+ * @param name name of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder_by_name(const char *name);
+
+int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic);
+void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic);
+int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic);
+
+/**
+ * Return the amount of padding in pixels which the get_buffer callback must
+ * provide around the edge of the image for codecs which do not have the
+ * CODEC_FLAG_EMU_EDGE flag.
+ *
+ * @return Required padding in pixels.
+ */
+unsigned avcodec_get_edge_width(void);
+
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you do not use any horizontal
+ * padding.
+ *
+ * May only be used if a codec with CODEC_CAP_DR1 has been opened.
+ * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased
+ * according to avcodec_get_edge_width() before.
+ */
+void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
+
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you also ensure that all
+ * line sizes are a multiple of the respective linesize_align[i].
+ *
+ * May only be used if a codec with CODEC_CAP_DR1 has been opened.
+ * If CODEC_FLAG_EMU_EDGE is not set, the dimensions must have been increased
+ * according to avcodec_get_edge_width() before.
+ */
+void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
+ int linesize_align[AV_NUM_DATA_POINTERS]);
+
+#if FF_API_OLD_DECODE_AUDIO
+/**
+ * Wrapper function which calls avcodec_decode_audio4.
+ *
+ * @deprecated Use avcodec_decode_audio4 instead.
+ *
+ * Decode the audio frame of size avpkt->size from avpkt->data into samples.
+ * Some decoders may support multiple frames in a single AVPacket, such
+ * decoders would then just decode the first frame. In this case,
+ * avcodec_decode_audio3 has to be called again with an AVPacket that contains
+ * the remaining data in order to decode the second frame etc.
+ * If no frame
+ * could be outputted, frame_size_ptr is zero. Otherwise, it is the
+ * decompressed frame size in bytes.
+ *
+ * @warning You must set frame_size_ptr to the allocated size of the
+ * output buffer before calling avcodec_decode_audio3().
+ *
+ * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than
+ * the actual read bytes because some optimized bitstream readers read 32 or 64
+ * bits at once and could read over the end.
+ *
+ * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that
+ * no overreading happens for damaged MPEG streams.
+ *
+ * @warning You must not provide a custom get_buffer() when using
+ * avcodec_decode_audio3(). Doing so will override it with
+ * avcodec_default_get_buffer. Use avcodec_decode_audio4() instead,
+ * which does allow the application to provide a custom get_buffer().
+ *
+ * @note You might have to align the input buffer avpkt->data and output buffer
+ * samples. The alignment requirements depend on the CPU: On some CPUs it isn't
+ * necessary at all, on others it won't work at all if not aligned and on others
+ * it will work but it will have an impact on performance.
+ *
+ * In practice, avpkt->data should have 4 byte alignment at minimum and
+ * samples should be 16 byte aligned unless the CPU doesn't need it
+ * (AltiVec and SSE do).
+ *
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
+ * @param avctx the codec context
+ * @param[out] samples the output buffer, sample type in avctx->sample_fmt
+ * If the sample format is planar, each channel plane will
+ * be the same size, with no padding between channels.
+ * @param[in,out] frame_size_ptr the output buffer size in bytes
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * You can create such packet with av_init_packet() and by then setting
+ * data and size, some decoders might in addition need other fields.
+ * All decoders are designed to use the least fields possible though.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame data was decompressed (used) from the input AVPacket.
+ */
+attribute_deprecated int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
+ int *frame_size_ptr,
+ AVPacket *avpkt);
+#endif
+
+/**
+ * Decode the audio frame of size avpkt->size from avpkt->data into frame.
+ *
+ * Some decoders may support multiple frames in a single AVPacket. Such
+ * decoders would then just decode the first frame. In this case,
+ * avcodec_decode_audio4 has to be called again with an AVPacket containing
+ * the remaining data in order to decode the second frame, etc...
+ * Even if no frames are returned, the packet needs to be fed to the decoder
+ * with remaining data until it is completely consumed or an error occurs.
+ *
+ * @warning The input buffer, avpkt->data must be FF_INPUT_BUFFER_PADDING_SIZE
+ * larger than the actual read bytes because some optimized bitstream
+ * readers read 32 or 64 bits at once and could read over the end.
+ *
+ * @note You might have to align the input buffer. The alignment requirements
+ * depend on the CPU and the decoder.
+ *
+ * @param avctx the codec context
+ * @param[out] frame The AVFrame in which to store decoded audio samples.
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer(). The
+ * decoder may, however, only utilize part of the buffer by
+ * setting AVFrame.nb_samples to a smaller value in the
+ * output frame.
+ * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is
+ * non-zero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * At least avpkt->data and avpkt->size should be set. Some
+ * decoders might also require additional fields to be set.
+ * @return A negative error code is returned if an error occurred during
+ * decoding, otherwise the number of bytes consumed from the input
+ * AVPacket is returned.
+ */
+int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
+ int *got_frame_ptr, AVPacket *avpkt);
+
+/**
+ * Decode the video frame of size avpkt->size from avpkt->data into picture.
+ * Some decoders may support multiple frames in a single AVPacket, such
+ * decoders would then just decode the first frame.
+ *
+ * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than
+ * the actual read bytes because some optimized bitstream readers read 32 or 64
+ * bits at once and could read over the end.
+ *
+ * @warning The end of the input buffer buf should be set to 0 to ensure that
+ * no overreading happens for damaged MPEG streams.
+ *
+ * @note You might have to align the input buffer avpkt->data.
+ * The alignment requirements depend on the CPU: on some CPUs it isn't
+ * necessary at all, on others it won't work at all if not aligned and on others
+ * it will work but it will have an impact on performance.
+ *
+ * In practice, avpkt->data should have 4 byte alignment at minimum.
+ *
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
+ * @param avctx the codec context
+ * @param[out] picture The AVFrame in which the decoded video frame will be stored.
+ * Use avcodec_alloc_frame to get an AVFrame, the codec will
+ * allocate memory for the actual bitmap.
+ * with default get/release_buffer(), the decoder frees/reuses the bitmap as it sees fit.
+ * with overridden get/release_buffer() (needs CODEC_CAP_DR1) the user decides into what buffer the decoder
+ * decodes and the decoder tells the user once it does not need the data anymore,
+ * the user app can at this point free/reuse/keep the memory as it sees fit.
+ *
+ * @param[in] avpkt The input AVpacket containing the input buffer.
+ * You can create such packet with av_init_packet() and by then setting
+ * data and size, some decoders might in addition need other fields like
+ * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least
+ * fields possible.
+ * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame could be decompressed.
+ */
+int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
+ int *got_picture_ptr,
+ AVPacket *avpkt);
+
+/**
+ * Decode a subtitle message.
+ * Return a negative value on error, otherwise return the number of bytes used.
+ * If no subtitle could be decompressed, got_sub_ptr is zero.
+ * Otherwise, the subtitle is stored in *sub.
+ * Note that CODEC_CAP_DR1 is not available for subtitle codecs. This is for
+ * simplicity, because the performance difference is expect to be negligible
+ * and reusing a get_buffer written for video codecs would probably perform badly
+ * due to a potentially very different allocation pattern.
+ *
+ * @param avctx the codec context
+ * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be
+ freed with avsubtitle_free if *got_sub_ptr is set.
+ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ */
+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+ int *got_sub_ptr,
+ AVPacket *avpkt);
+
+/**
+ * @defgroup lavc_parsing Frame parsing
+ * @{
+ */
+
+typedef struct AVCodecParserContext {
+ void *priv_data;
+ struct AVCodecParser *parser;
+ int64_t frame_offset; /* offset of the current frame */
+ int64_t cur_offset; /* current offset
+ (incremented by each av_parser_parse()) */
+ int64_t next_frame_offset; /* offset of the next frame */
+ /* video info */
+ int pict_type; /* XXX: Put it back in AVCodecContext. */
+ /**
+ * This field is used for proper frame duration computation in lavf.
+ * It signals, how much longer the frame duration of the current frame
+ * is compared to normal frame duration.
+ *
+ * frame_duration = (1 + repeat_pict) * time_base
+ *
+ * It is used by codecs like H.264 to display telecined material.
+ */
+ int repeat_pict; /* XXX: Put it back in AVCodecContext. */
+ int64_t pts; /* pts of the current frame */
+ int64_t dts; /* dts of the current frame */
+
+ /* private data */
+ int64_t last_pts;
+ int64_t last_dts;
+ int fetch_timestamp;
+
+#define AV_PARSER_PTS_NB 4
+ int cur_frame_start_index;
+ int64_t cur_frame_offset[AV_PARSER_PTS_NB];
+ int64_t cur_frame_pts[AV_PARSER_PTS_NB];
+ int64_t cur_frame_dts[AV_PARSER_PTS_NB];
+
+ int flags;
+#define PARSER_FLAG_COMPLETE_FRAMES 0x0001
+#define PARSER_FLAG_ONCE 0x0002
+/// Set if the parser has a valid file offset
+#define PARSER_FLAG_FETCHED_OFFSET 0x0004
+
+ int64_t offset; ///< byte offset from starting packet start
+ int64_t cur_frame_end[AV_PARSER_PTS_NB];
+
+ /**
+ * Set by parser to 1 for key frames and 0 for non-key frames.
+ * It is initialized to -1, so if the parser doesn't set this flag,
+ * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames
+ * will be used.
+ */
+ int key_frame;
+
+ /**
+ * Time difference in stream time base units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * independent from the availability of previous frames. That is, the
+ * frames are virtually identical no matter if decoding started from
+ * the very first frame or from this keyframe.
+ * Is AV_NOPTS_VALUE if unknown.
+ * This field is not the display duration of the current frame.
+ * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
+ * set.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
+
+ // Timestamp generation support:
+ /**
+ * Synchronization point for start of timestamp generation.
+ *
+ * Set to >0 for sync point, 0 for no sync point and <0 for undefined
+ * (default).
+ *
+ * For example, this corresponds to presence of H.264 buffering period
+ * SEI message.
+ */
+ int dts_sync_point;
+
+ /**
+ * Offset of the current timestamp against last timestamp sync point in
+ * units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain a valid timestamp offset.
+ *
+ * Note that the timestamp of sync point has usually a nonzero
+ * dts_ref_dts_delta, which refers to the previous sync point. Offset of
+ * the next frame after timestamp sync point will be usually 1.
+ *
+ * For example, this corresponds to H.264 cpb_removal_delay.
+ */
+ int dts_ref_dts_delta;
+
+ /**
+ * Presentation delay of current frame in units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain valid non-negative timestamp delta (presentation time of a frame
+ * must not lie in the past).
+ *
+ * This delay represents the difference between decoding and presentation
+ * time of the frame.
+ *
+ * For example, this corresponds to H.264 dpb_output_delay.
+ */
+ int pts_dts_delta;
+
+ /**
+ * Position of the packet in file.
+ *
+ * Analogous to cur_frame_pts/dts
+ */
+ int64_t cur_frame_pos[AV_PARSER_PTS_NB];
+
+ /**
+ * Byte position of currently parsed frame in stream.
+ */
+ int64_t pos;
+
+ /**
+ * Previous frame byte position.
+ */
+ int64_t last_pos;
+
+ /**
+ * Duration of the current frame.
+ * For audio, this is in units of 1 / AVCodecContext.sample_rate.
+ * For all other types, this is in units of AVCodecContext.time_base.
+ */
+ int duration;
+} AVCodecParserContext;
+
+typedef struct AVCodecParser {
+ int codec_ids[5]; /* several codec IDs are permitted */
+ int priv_data_size;
+ int (*parser_init)(AVCodecParserContext *s);
+ int (*parser_parse)(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ const uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size);
+ void (*parser_close)(AVCodecParserContext *s);
+ int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
+ struct AVCodecParser *next;
+} AVCodecParser;
+
+AVCodecParser *av_parser_next(AVCodecParser *c);
+
+void av_register_codec_parser(AVCodecParser *parser);
+AVCodecParserContext *av_parser_init(int codec_id);
+
+/**
+ * Parse a packet.
+ *
+ * @param s parser context.
+ * @param avctx codec context.
+ * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished.
+ * @param poutbuf_size set to size of parsed buffer or zero if not yet finished.
+ * @param buf input buffer.
+ * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output).
+ * @param pts input presentation timestamp.
+ * @param dts input decoding timestamp.
+ * @param pos input byte position in stream.
+ * @return the number of bytes of the input bitstream used.
+ *
+ * Example:
+ * @code
+ * while(in_len){
+ * len = av_parser_parse2(myparser, AVCodecContext, &data, &size,
+ * in_data, in_len,
+ * pts, dts, pos);
+ * in_data += len;
+ * in_len -= len;
+ *
+ * if(size)
+ * decode_frame(data, size);
+ * }
+ * @endcode
+ */
+int av_parser_parse2(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size,
+ int64_t pts, int64_t dts,
+ int64_t pos);
+
+/**
+ * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
+ * @deprecated use AVBitstreamFilter
+ */
+int av_parser_change(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_parser_close(AVCodecParserContext *s);
+
+/**
+ * @}
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_encoding
+ * @{
+ */
+
+/**
+ * Find a registered encoder with a matching codec ID.
+ *
+ * @param id AVCodecID of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder(enum AVCodecID id);
+
+/**
+ * Find a registered encoder with the specified name.
+ *
+ * @param name name of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder_by_name(const char *name);
+
+#if FF_API_OLD_ENCODE_AUDIO
+/**
+ * Encode an audio frame from samples into buf.
+ *
+ * @deprecated Use avcodec_encode_audio2 instead.
+ *
+ * @note The output buffer should be at least FF_MIN_BUFFER_SIZE bytes large.
+ * However, for codecs with avctx->frame_size equal to 0 (e.g. PCM) the user
+ * will know how much space is needed because it depends on the value passed
+ * in buf_size as described below. In that case a lower value can be used.
+ *
+ * @param avctx the codec context
+ * @param[out] buf the output buffer
+ * @param[in] buf_size the output buffer size
+ * @param[in] samples the input buffer containing the samples
+ * The number of samples read from this buffer is frame_size*channels,
+ * both of which are defined in avctx.
+ * For codecs which have avctx->frame_size equal to 0 (e.g. PCM) the number of
+ * samples read from samples is equal to:
+ * buf_size * 8 / (avctx->channels * av_get_bits_per_sample(avctx->codec_id))
+ * This also implies that av_get_bits_per_sample() must not return 0 for these
+ * codecs.
+ * @return On error a negative value is returned, on success zero or the number
+ * of bytes used to encode the data read from the input buffer.
+ */
+int attribute_deprecated avcodec_encode_audio(AVCodecContext *avctx,
+ uint8_t *buf, int buf_size,
+ const short *samples);
+#endif
+
+/**
+ * Encode a frame of audio.
+ *
+ * Takes input samples from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay, split, and combine input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. All other AVPacket fields
+ * will be reset by the encoder using av_init_packet(). If
+ * avpkt->data is NULL, the encoder will allocate it.
+ * The encoder will set avpkt->size to the size of the
+ * output packet.
+ *
+ * If this function fails or produces no output, avpkt will be
+ * freed using av_free_packet() (i.e. avpkt->destruct will be
+ * called to free the user supplied buffer).
+ * @param[in] frame AVFrame containing the raw audio data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * CODEC_CAP_DELAY capability set.
+ * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
+ * can have any number of samples.
+ * If it is not set, frame->nb_samples must be equal to
+ * avctx->frame_size for all frames except the last.
+ * The final frame may be smaller than avctx->frame_size.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+#if FF_API_OLD_ENCODE_VIDEO
+/**
+ * @deprecated use avcodec_encode_video2() instead.
+ *
+ * Encode a video frame from pict into buf.
+ * The input picture should be
+ * stored using a specific format, namely avctx.pix_fmt.
+ *
+ * @param avctx the codec context
+ * @param[out] buf the output buffer for the bitstream of encoded frame
+ * @param[in] buf_size the size of the output buffer in bytes
+ * @param[in] pict the input picture to encode
+ * @return On error a negative value is returned, on success zero or the number
+ * of bytes used from the output buffer.
+ */
+attribute_deprecated
+int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ const AVFrame *pict);
+#endif
+
+/**
+ * Encode a frame of video.
+ *
+ * Takes input raw video data from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay and reorder input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. All other AVPacket fields
+ * will be reset by the encoder using av_init_packet(). If
+ * avpkt->data is NULL, the encoder will allocate it.
+ * The encoder will set avpkt->size to the size of the
+ * output packet. The returned data (if any) belongs to the
+ * caller, he is responsible for freeing it.
+ *
+ * If this function fails or produces no output, avpkt will be
+ * freed using av_free_packet() (i.e. avpkt->destruct will be
+ * called to free the user supplied buffer).
+ * @param[in] frame AVFrame containing the raw video data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * CODEC_CAP_DELAY capability set.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ const AVSubtitle *sub);
+
+
+/**
+ * @}
+ */
+
+#if FF_API_AVCODEC_RESAMPLE
+/**
+ * @defgroup lavc_resample Audio resampling
+ * @ingroup libavc
+ * @deprecated use libavresample instead
+ *
+ * @{
+ */
+struct ReSampleContext;
+struct AVResampleContext;
+
+typedef struct ReSampleContext ReSampleContext;
+
+/**
+ * Initialize audio resampling context.
+ *
+ * @param output_channels number of output channels
+ * @param input_channels number of input channels
+ * @param output_rate output sample rate
+ * @param input_rate input sample rate
+ * @param sample_fmt_out requested output sample format
+ * @param sample_fmt_in input sample format
+ * @param filter_length length of each FIR filter in the filterbank relative to the cutoff frequency
+ * @param log2_phase_count log2 of the number of entries in the polyphase filterbank
+ * @param linear if 1 then the used FIR filter will be linearly interpolated
+ between the 2 closest, if 0 the closest will be used
+ * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate
+ * @return allocated ReSampleContext, NULL if error occurred
+ */
+attribute_deprecated
+ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
+ int output_rate, int input_rate,
+ enum AVSampleFormat sample_fmt_out,
+ enum AVSampleFormat sample_fmt_in,
+ int filter_length, int log2_phase_count,
+ int linear, double cutoff);
+
+attribute_deprecated
+int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples);
+
+/**
+ * Free resample context.
+ *
+ * @param s a non-NULL pointer to a resample context previously
+ * created with av_audio_resample_init()
+ */
+attribute_deprecated
+void audio_resample_close(ReSampleContext *s);
+
+
+/**
+ * Initialize an audio resampler.
+ * Note, if either rate is not an integer then simply scale both rates up so they are.
+ * @param filter_length length of each FIR filter in the filterbank relative to the cutoff freq
+ * @param log2_phase_count log2 of the number of entries in the polyphase filterbank
+ * @param linear If 1 then the used FIR filter will be linearly interpolated
+ between the 2 closest, if 0 the closest will be used
+ * @param cutoff cutoff frequency, 1.0 corresponds to half the output sampling rate
+ */
+attribute_deprecated
+struct AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_length, int log2_phase_count, int linear, double cutoff);
+
+/**
+ * Resample an array of samples using a previously configured context.
+ * @param src an array of unconsumed samples
+ * @param consumed the number of samples of src which have been consumed are returned here
+ * @param src_size the number of unconsumed samples available
+ * @param dst_size the amount of space in samples available in dst
+ * @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context.
+ * @return the number of samples written in dst or -1 if an error occurred
+ */
+attribute_deprecated
+int av_resample(struct AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx);
+
+
+/**
+ * Compensate samplerate/timestamp drift. The compensation is done by changing
+ * the resampler parameters, so no audible clicks or similar distortions occur
+ * @param compensation_distance distance in output samples over which the compensation should be performed
+ * @param sample_delta number of output samples which should be output less
+ *
+ * example: av_resample_compensate(c, 10, 500)
+ * here instead of 510 samples only 500 samples would be output
+ *
+ * note, due to rounding the actual compensation might be slightly different,
+ * especially if the compensation_distance is large and the in_rate used during init is small
+ */
+attribute_deprecated
+void av_resample_compensate(struct AVResampleContext *c, int sample_delta, int compensation_distance);
+attribute_deprecated
+void av_resample_close(struct AVResampleContext *c);
+
+/**
+ * @}
+ */
+#endif
+
+/**
+ * @addtogroup lavc_picture
+ * @{
+ */
+
+/**
+ * Allocate memory for a picture. Call avpicture_free() to free it.
+ *
+ * @see avpicture_fill()
+ *
+ * @param picture the picture to be filled in
+ * @param pix_fmt the format of the picture
+ * @param width the width of the picture
+ * @param height the height of the picture
+ * @return zero if successful, a negative value if not
+ */
+int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Free a picture previously allocated by avpicture_alloc().
+ * The data buffer used by the AVPicture is freed, but the AVPicture structure
+ * itself is not.
+ *
+ * @param picture the AVPicture to be freed
+ */
+void avpicture_free(AVPicture *picture);
+
+/**
+ * Fill in the AVPicture fields.
+ * The fields of the given AVPicture are filled in by using the 'ptr' address
+ * which points to the image data buffer. Depending on the specified picture
+ * format, one or multiple image data pointers and line sizes will be set.
+ * If a planar format is specified, several pointers will be set pointing to
+ * the different picture planes and the line sizes of the different planes
+ * will be stored in the lines_sizes array.
+ * Call with ptr == NULL to get the required size for the ptr buffer.
+ *
+ * To allocate the buffer and fill in the AVPicture fields in one call,
+ * use avpicture_alloc().
+ *
+ * @param picture AVPicture whose fields are to be filled in
+ * @param ptr Buffer which will contain or contains the actual image data
+ * @param pix_fmt The format in which the picture data is stored.
+ * @param width the width of the image in pixels
+ * @param height the height of the image in pixels
+ * @return size of the image data in bytes
+ */
+int avpicture_fill(AVPicture *picture, uint8_t *ptr,
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Copy pixel data from an AVPicture into a buffer.
+ * The data is stored compactly, without any gaps for alignment or padding
+ * which may be applied by avpicture_fill().
+ *
+ * @see avpicture_get_size()
+ *
+ * @param[in] src AVPicture containing image data
+ * @param[in] pix_fmt The format in which the picture data is stored.
+ * @param[in] width the width of the image in pixels.
+ * @param[in] height the height of the image in pixels.
+ * @param[out] dest A buffer into which picture data will be copied.
+ * @param[in] dest_size The size of 'dest'.
+ * @return The number of bytes written to dest, or a negative value (error code) on error.
+ */
+int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt,
+ int width, int height,
+ unsigned char *dest, int dest_size);
+
+/**
+ * Calculate the size in bytes that a picture of the given width and height
+ * would occupy if stored in the given picture format.
+ * Note that this returns the size of a compact representation as generated
+ * by avpicture_layout(), which can be smaller than the size required for e.g.
+ * avpicture_fill().
+ *
+ * @param pix_fmt the given picture format
+ * @param width the width of the image
+ * @param height the height of the image
+ * @return Image data size in bytes or -1 on error (e.g. too large dimensions).
+ */
+int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * deinterlace - if not supported return -1
+ */
+int avpicture_deinterlace(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int width, int height);
+/**
+ * Copy image src to dst. Wraps av_picture_data_copy() above.
+ */
+void av_picture_copy(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Crop image top and left side.
+ */
+int av_picture_crop(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int top_band, int left_band);
+
+/**
+ * Pad image.
+ */
+int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt,
+ int padtop, int padbottom, int padleft, int padright, int *color);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup lavc_misc Utility functions
+ * @ingroup libavc
+ *
+ * Miscellaneous utility functions related to both encoding and decoding
+ * (or neither).
+ * @{
+ */
+
+/**
+ * @defgroup lavc_misc_pixfmt Pixel formats
+ *
+ * Functions for working with pixel formats.
+ * @{
+ */
+
+/**
+ * @deprecated Use av_pix_fmt_get_chroma_sub_sample
+ */
+
+void attribute_deprecated avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift);
+
+/**
+ * Return a value representing the fourCC code associated to the
+ * pixel format pix_fmt, or 0 if no associated fourCC code can be
+ * found.
+ */
+unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt);
+
+#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */
+#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */
+#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */
+#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */
+#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */
+#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */
+
+/**
+ * Compute what kind of losses will occur when converting from one specific
+ * pixel format to another.
+ * When converting from one pixel format to another, information loss may occur.
+ * For example, when converting from RGB24 to GRAY, the color information will
+ * be lost. Similarly, other losses occur when converting from some formats to
+ * other formats. These losses can involve loss of chroma, but also loss of
+ * resolution, loss of color depth, loss due to the color space conversion, loss
+ * of the alpha bits or loss due to color quantization.
+ * avcodec_get_fix_fmt_loss() informs you about the various types of losses
+ * which will occur when converting from one pixel format to another.
+ *
+ * @param[in] dst_pix_fmt destination pixel format
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @return Combination of flags informing you what kind of losses will occur.
+ */
+int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt,
+ int has_alpha);
+
+#if FF_API_FIND_BEST_PIX_FMT
+/**
+ * @deprecated use avcodec_find_best_pix_fmt2() instead.
+ *
+ * Find the best pixel format to convert to given a certain source pixel
+ * format. When converting from one pixel format to another, information loss
+ * may occur. For example, when converting from RGB24 to GRAY, the color
+ * information will be lost. Similarly, other losses occur when converting from
+ * some formats to other formats. avcodec_find_best_pix_fmt() searches which of
+ * the given pixel formats should be used to suffer the least amount of loss.
+ * The pixel formats from which it chooses one, are determined by the
+ * pix_fmt_mask parameter.
+ *
+ * @code
+ * src_pix_fmt = AV_PIX_FMT_YUV420P;
+ * pix_fmt_mask = (1 << AV_PIX_FMT_YUV422P) || (1 << AV_PIX_FMT_RGB24);
+ * dst_pix_fmt = avcodec_find_best_pix_fmt(pix_fmt_mask, src_pix_fmt, alpha, &loss);
+ * @endcode
+ *
+ * @param[in] pix_fmt_mask bitmask determining which pixel format to choose from
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
+ * @return The best pixel format to convert to or -1 if none was found.
+ */
+attribute_deprecated
+enum AVPixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum AVPixelFormat src_pix_fmt,
+ int has_alpha, int *loss_ptr);
+#endif /* FF_API_FIND_BEST_PIX_FMT */
+
+/**
+ * Find the best pixel format to convert to given a certain source pixel
+ * format. When converting from one pixel format to another, information loss
+ * may occur. For example, when converting from RGB24 to GRAY, the color
+ * information will be lost. Similarly, other losses occur when converting from
+ * some formats to other formats. avcodec_find_best_pix_fmt2() searches which of
+ * the given pixel formats should be used to suffer the least amount of loss.
+ * The pixel formats from which it chooses one, are determined by the
+ * pix_fmt_list parameter.
+ *
+ *
+ * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
+ * @return The best pixel format to convert to or -1 if none was found.
+ */
+enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat *pix_fmt_list,
+ enum AVPixelFormat src_pix_fmt,
+ int has_alpha, int *loss_ptr);
+
+enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
+
+/**
+ * @}
+ */
+
+void avcodec_set_dimensions(AVCodecContext *s, int width, int height);
+
+/**
+ * Put a string representing the codec tag codec_tag in buf.
+ *
+ * @param buf_size size in bytes of buf
+ * @return the length of the string that would have been generated if
+ * enough space had been available, excluding the trailing null
+ */
+size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag);
+
+void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode);
+
+/**
+ * Return a name for the specified profile, if available.
+ *
+ * @param codec the codec that is searched for the given profile
+ * @param profile the profile value for which a name is requested
+ * @return A name for the profile if found, NULL otherwise.
+ */
+const char *av_get_profile_name(const AVCodec *codec, int profile);
+
+int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size);
+int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
+//FIXME func typedef
+
+/**
+ * Fill audio frame data and linesize.
+ * AVFrame extended_data channel pointers are allocated if necessary for
+ * planar audio.
+ *
+ * @param frame the AVFrame
+ * frame->nb_samples must be set prior to calling the
+ * function. This function fills in frame->data,
+ * frame->extended_data, frame->linesize[0].
+ * @param nb_channels channel count
+ * @param sample_fmt sample format
+ * @param buf buffer to use for frame data
+ * @param buf_size size of buffer
+ * @param align plane size sample alignment (0 = default)
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
+ enum AVSampleFormat sample_fmt, const uint8_t *buf,
+ int buf_size, int align);
+
+/**
+ * Flush buffers, should be called when seeking or when switching to a different stream.
+ */
+void avcodec_flush_buffers(AVCodecContext *avctx);
+
+void avcodec_default_free_buffers(AVCodecContext *s);
+
+/**
+ * Return codec bits per sample.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_bits_per_sample(enum AVCodecID codec_id);
+
+/**
+ * Return codec bits per sample.
+ * Only return non-zero if the bits per sample is exactly correct, not an
+ * approximation.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_exact_bits_per_sample(enum AVCodecID codec_id);
+
+/**
+ * Return audio frame duration.
+ *
+ * @param avctx codec context
+ * @param frame_bytes size of the frame, or 0 if unknown
+ * @return frame duration, in samples, if known. 0 if not able to
+ * determine.
+ */
+int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes);
+
+
+typedef struct AVBitStreamFilterContext {
+ void *priv_data;
+ struct AVBitStreamFilter *filter;
+ AVCodecParserContext *parser;
+ struct AVBitStreamFilterContext *next;
+} AVBitStreamFilterContext;
+
+
+typedef struct AVBitStreamFilter {
+ const char *name;
+ int priv_data_size;
+ int (*filter)(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+ void (*close)(AVBitStreamFilterContext *bsfc);
+ struct AVBitStreamFilter *next;
+} AVBitStreamFilter;
+
+void av_register_bitstream_filter(AVBitStreamFilter *bsf);
+AVBitStreamFilterContext *av_bitstream_filter_init(const char *name);
+int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_bitstream_filter_close(AVBitStreamFilterContext *bsf);
+
+AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f);
+
+/* memory */
+
+/**
+ * Reallocate the given block if it is not large enough, otherwise do nothing.
+ *
+ * @see av_realloc
+ */
+void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Allocate a buffer, reusing the given one if large enough.
+ *
+ * Contrary to av_fast_realloc the current buffer contents might not be
+ * preserved and on error the old buffer is freed, thus no special
+ * handling to avoid memleaks is necessary.
+ *
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+ * @param size size of the buffer *ptr points to
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+ * *size 0 if an error occurred.
+ */
+void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Allocate a buffer with padding, reusing the given one if large enough.
+ *
+ * Same behaviour av_fast_malloc but the buffer has additional
+ * FF_INPUT_PADDING_SIZE at the end which will always memset to 0.
+ *
+ */
+void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Encode extradata length to a buffer. Used by xiph codecs.
+ *
+ * @param s buffer to write to; must be at least (v/255+1) bytes long
+ * @param v size of extradata in bytes
+ * @return number of bytes written to the buffer.
+ */
+unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
+
+/**
+ * Log a generic warning message about a missing feature. This function is
+ * intended to be used internally by Libav (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] feature string containing the name of the missing feature
+ * @param[in] want_sample indicates if samples are wanted which exhibit this feature.
+ * If want_sample is non-zero, additional verbage will be added to the log
+ * message which tells the user how to report samples to the development
+ * mailing list.
+ */
+void av_log_missing_feature(void *avc, const char *feature, int want_sample);
+
+/**
+ * Log a generic warning message asking for a sample. This function is
+ * intended to be used internally by Libav (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] msg string containing an optional message, or NULL if no message
+ */
+void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3);
+
+/**
+ * Register the hardware accelerator hwaccel.
+ */
+void av_register_hwaccel(AVHWAccel *hwaccel);
+
+/**
+ * If hwaccel is NULL, returns the first registered hardware accelerator,
+ * if hwaccel is non-NULL, returns the next registered hardware accelerator
+ * after hwaccel, or NULL if hwaccel is the last one.
+ */
+AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel);
+
+
+/**
+ * Lock operation used by lockmgr
+ */
+enum AVLockOp {
+ AV_LOCK_CREATE, ///< Create a mutex
+ AV_LOCK_OBTAIN, ///< Lock the mutex
+ AV_LOCK_RELEASE, ///< Unlock the mutex
+ AV_LOCK_DESTROY, ///< Free mutex resources
+};
+
+/**
+ * Register a user provided lock manager supporting the operations
+ * specified by AVLockOp. mutex points to a (void *) where the
+ * lockmgr should store/get a pointer to a user allocated mutex. It's
+ * NULL upon AV_LOCK_CREATE and != NULL for all other ops.
+ *
+ * @param cb User defined callback. Note: Libav may invoke calls to this
+ * callback during the call to av_lockmgr_register().
+ * Thus, the application must be prepared to handle that.
+ * If cb is set to NULL the lockmgr will be unregistered.
+ * Also note that during unregistration the previously registered
+ * lockmgr callback may also be invoked.
+ */
+int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
+
+/**
+ * Get the type of the given codec.
+ */
+enum AVMediaType avcodec_get_type(enum AVCodecID codec_id);
+
+/**
+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+ * with no corresponding avcodec_close()), 0 otherwise.
+ */
+int avcodec_is_open(AVCodecContext *s);
+
+/**
+ * @return a non-zero number if codec is an encoder, zero otherwise
+ */
+int av_codec_is_encoder(const AVCodec *codec);
+
+/**
+ * @return a non-zero number if codec is a decoder, zero otherwise
+ */
+int av_codec_is_decoder(const AVCodec *codec);
+
+/**
+ * @return descriptor for given codec ID or NULL if no descriptor exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
+
+/**
+ * Iterate over all codec descriptors known to libavcodec.
+ *
+ * @param prev previous descriptor. NULL to get the first descriptor.
+ *
+ * @return next descriptor or NULL after the last descriptor
+ */
+const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
+
+/**
+ * @return codec descriptor with the given name or NULL if no such descriptor
+ * exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_AVCODEC_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/avfft.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/avfft.h
new file mode 100644
index 000000000..b89618258
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/avfft.h
@@ -0,0 +1,116 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVFFT_H
+#define AVCODEC_AVFFT_H
+
+/**
+ * @file
+ * @ingroup lavc_fft
+ * FFT functions
+ */
+
+/**
+ * @defgroup lavc_fft FFT functions
+ * @ingroup lavc_misc
+ *
+ * @{
+ */
+
+typedef float FFTSample;
+
+typedef struct FFTComplex {
+ FFTSample re, im;
+} FFTComplex;
+
+typedef struct FFTContext FFTContext;
+
+/**
+ * Set up a complex FFT.
+ * @param nbits log2 of the length of the input array
+ * @param inverse if 0 perform the forward transform, if 1 perform the inverse
+ */
+FFTContext *av_fft_init(int nbits, int inverse);
+
+/**
+ * Do the permutation needed BEFORE calling ff_fft_calc().
+ */
+void av_fft_permute(FFTContext *s, FFTComplex *z);
+
+/**
+ * Do a complex FFT with the parameters defined in av_fft_init(). The
+ * input data must be permuted before. No 1.0/sqrt(n) normalization is done.
+ */
+void av_fft_calc(FFTContext *s, FFTComplex *z);
+
+void av_fft_end(FFTContext *s);
+
+FFTContext *av_mdct_init(int nbits, int inverse, double scale);
+void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_end(FFTContext *s);
+
+/* Real Discrete Fourier Transform */
+
+enum RDFTransformType {
+ DFT_R2C,
+ IDFT_C2R,
+ IDFT_R2C,
+ DFT_C2R,
+};
+
+typedef struct RDFTContext RDFTContext;
+
+/**
+ * Set up a real FFT.
+ * @param nbits log2 of the length of the input array
+ * @param trans the type of transform
+ */
+RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
+void av_rdft_calc(RDFTContext *s, FFTSample *data);
+void av_rdft_end(RDFTContext *s);
+
+/* Discrete Cosine Transform */
+
+typedef struct DCTContext DCTContext;
+
+enum DCTTransformType {
+ DCT_II = 0,
+ DCT_III,
+ DCT_I,
+ DST_I,
+};
+
+/**
+ * Set up DCT.
+ * @param nbits size of the input array:
+ * (1 << nbits) for DCT-II, DCT-III and DST-I
+ * (1 << nbits) + 1 for DCT-I
+ *
+ * @note the first element of the input of DST-I is ignored
+ */
+DCTContext *av_dct_init(int nbits, enum DCTTransformType type);
+void av_dct_calc(DCTContext *s, FFTSample *data);
+void av_dct_end (DCTContext *s);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_AVFFT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/dxva2.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/dxva2.h
new file mode 100644
index 000000000..c06f1f333
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/dxva2.h
@@ -0,0 +1,88 @@
+/*
+ * DXVA2 HW acceleration
+ *
+ * copyright (c) 2009 Laurent Aimar
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_DXVA_H
+#define AVCODEC_DXVA_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_dxva2
+ * Public libavcodec DXVA2 header.
+ */
+
+#include <stdint.h>
+
+#include <d3d9.h>
+#include <dxva2api.h>
+
+/**
+ * @defgroup lavc_codec_hwaccel_dxva2 DXVA2
+ * @ingroup lavc_codec_hwaccel
+ *
+ * @{
+ */
+
+#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
+
+/**
+ * This structure is used to provides the necessary configurations and data
+ * to the DXVA2 Libav HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct dxva_context {
+ /**
+ * DXVA2 decoder object
+ */
+ IDirectXVideoDecoder *decoder;
+
+ /**
+ * DXVA2 configuration used to create the decoder
+ */
+ const DXVA2_ConfigPictureDecode *cfg;
+
+ /**
+ * The number of surface in the surface array
+ */
+ unsigned surface_count;
+
+ /**
+ * The array of Direct3D surfaces used to create the decoder
+ */
+ LPDIRECT3DSURFACE9 *surface;
+
+ /**
+ * A bit field configuring the workarounds needed for using the decoder
+ */
+ uint64_t workaround;
+
+ /**
+ * Private to the Libav AVHWAccel implementation
+ */
+ unsigned report_id;
+};
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_DXVA_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/old_codec_ids.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/old_codec_ids.h
new file mode 100644
index 000000000..2b72e38d2
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/old_codec_ids.h
@@ -0,0 +1,366 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_OLD_CODEC_IDS_H
+#define AVCODEC_OLD_CODEC_IDS_H
+
+/*
+ * This header exists to prevent new codec IDs from being accidentally added to
+ * the deprecated list.
+ * Do not include it directly. It will be removed on next major bump
+ *
+ * Do not add new items to this list. Use the AVCodecID enum instead.
+ */
+
+ CODEC_ID_NONE = AV_CODEC_ID_NONE,
+
+ /* video codecs */
+ CODEC_ID_MPEG1VIDEO,
+ CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+ CODEC_ID_MPEG2VIDEO_XVMC,
+ CODEC_ID_H261,
+ CODEC_ID_H263,
+ CODEC_ID_RV10,
+ CODEC_ID_RV20,
+ CODEC_ID_MJPEG,
+ CODEC_ID_MJPEGB,
+ CODEC_ID_LJPEG,
+ CODEC_ID_SP5X,
+ CODEC_ID_JPEGLS,
+ CODEC_ID_MPEG4,
+ CODEC_ID_RAWVIDEO,
+ CODEC_ID_MSMPEG4V1,
+ CODEC_ID_MSMPEG4V2,
+ CODEC_ID_MSMPEG4V3,
+ CODEC_ID_WMV1,
+ CODEC_ID_WMV2,
+ CODEC_ID_H263P,
+ CODEC_ID_H263I,
+ CODEC_ID_FLV1,
+ CODEC_ID_SVQ1,
+ CODEC_ID_SVQ3,
+ CODEC_ID_DVVIDEO,
+ CODEC_ID_HUFFYUV,
+ CODEC_ID_CYUV,
+ CODEC_ID_H264,
+ CODEC_ID_INDEO3,
+ CODEC_ID_VP3,
+ CODEC_ID_THEORA,
+ CODEC_ID_ASV1,
+ CODEC_ID_ASV2,
+ CODEC_ID_FFV1,
+ CODEC_ID_4XM,
+ CODEC_ID_VCR1,
+ CODEC_ID_CLJR,
+ CODEC_ID_MDEC,
+ CODEC_ID_ROQ,
+ CODEC_ID_INTERPLAY_VIDEO,
+ CODEC_ID_XAN_WC3,
+ CODEC_ID_XAN_WC4,
+ CODEC_ID_RPZA,
+ CODEC_ID_CINEPAK,
+ CODEC_ID_WS_VQA,
+ CODEC_ID_MSRLE,
+ CODEC_ID_MSVIDEO1,
+ CODEC_ID_IDCIN,
+ CODEC_ID_8BPS,
+ CODEC_ID_SMC,
+ CODEC_ID_FLIC,
+ CODEC_ID_TRUEMOTION1,
+ CODEC_ID_VMDVIDEO,
+ CODEC_ID_MSZH,
+ CODEC_ID_ZLIB,
+ CODEC_ID_QTRLE,
+ CODEC_ID_SNOW,
+ CODEC_ID_TSCC,
+ CODEC_ID_ULTI,
+ CODEC_ID_QDRAW,
+ CODEC_ID_VIXL,
+ CODEC_ID_QPEG,
+ CODEC_ID_PNG,
+ CODEC_ID_PPM,
+ CODEC_ID_PBM,
+ CODEC_ID_PGM,
+ CODEC_ID_PGMYUV,
+ CODEC_ID_PAM,
+ CODEC_ID_FFVHUFF,
+ CODEC_ID_RV30,
+ CODEC_ID_RV40,
+ CODEC_ID_VC1,
+ CODEC_ID_WMV3,
+ CODEC_ID_LOCO,
+ CODEC_ID_WNV1,
+ CODEC_ID_AASC,
+ CODEC_ID_INDEO2,
+ CODEC_ID_FRAPS,
+ CODEC_ID_TRUEMOTION2,
+ CODEC_ID_BMP,
+ CODEC_ID_CSCD,
+ CODEC_ID_MMVIDEO,
+ CODEC_ID_ZMBV,
+ CODEC_ID_AVS,
+ CODEC_ID_SMACKVIDEO,
+ CODEC_ID_NUV,
+ CODEC_ID_KMVC,
+ CODEC_ID_FLASHSV,
+ CODEC_ID_CAVS,
+ CODEC_ID_JPEG2000,
+ CODEC_ID_VMNC,
+ CODEC_ID_VP5,
+ CODEC_ID_VP6,
+ CODEC_ID_VP6F,
+ CODEC_ID_TARGA,
+ CODEC_ID_DSICINVIDEO,
+ CODEC_ID_TIERTEXSEQVIDEO,
+ CODEC_ID_TIFF,
+ CODEC_ID_GIF,
+ CODEC_ID_DXA,
+ CODEC_ID_DNXHD,
+ CODEC_ID_THP,
+ CODEC_ID_SGI,
+ CODEC_ID_C93,
+ CODEC_ID_BETHSOFTVID,
+ CODEC_ID_PTX,
+ CODEC_ID_TXD,
+ CODEC_ID_VP6A,
+ CODEC_ID_AMV,
+ CODEC_ID_VB,
+ CODEC_ID_PCX,
+ CODEC_ID_SUNRAST,
+ CODEC_ID_INDEO4,
+ CODEC_ID_INDEO5,
+ CODEC_ID_MIMIC,
+ CODEC_ID_RL2,
+ CODEC_ID_ESCAPE124,
+ CODEC_ID_DIRAC,
+ CODEC_ID_BFI,
+ CODEC_ID_CMV,
+ CODEC_ID_MOTIONPIXELS,
+ CODEC_ID_TGV,
+ CODEC_ID_TGQ,
+ CODEC_ID_TQI,
+ CODEC_ID_AURA,
+ CODEC_ID_AURA2,
+ CODEC_ID_V210X,
+ CODEC_ID_TMV,
+ CODEC_ID_V210,
+ CODEC_ID_DPX,
+ CODEC_ID_MAD,
+ CODEC_ID_FRWU,
+ CODEC_ID_FLASHSV2,
+ CODEC_ID_CDGRAPHICS,
+ CODEC_ID_R210,
+ CODEC_ID_ANM,
+ CODEC_ID_BINKVIDEO,
+ CODEC_ID_IFF_ILBM,
+ CODEC_ID_IFF_BYTERUN1,
+ CODEC_ID_KGV1,
+ CODEC_ID_YOP,
+ CODEC_ID_VP8,
+ CODEC_ID_PICTOR,
+ CODEC_ID_ANSI,
+ CODEC_ID_A64_MULTI,
+ CODEC_ID_A64_MULTI5,
+ CODEC_ID_R10K,
+ CODEC_ID_MXPEG,
+ CODEC_ID_LAGARITH,
+ CODEC_ID_PRORES,
+ CODEC_ID_JV,
+ CODEC_ID_DFA,
+ CODEC_ID_WMV3IMAGE,
+ CODEC_ID_VC1IMAGE,
+ CODEC_ID_UTVIDEO,
+ CODEC_ID_BMV_VIDEO,
+ CODEC_ID_VBLE,
+ CODEC_ID_DXTORY,
+ CODEC_ID_V410,
+ CODEC_ID_XWD,
+ CODEC_ID_CDXL,
+ CODEC_ID_XBM,
+ CODEC_ID_ZEROCODEC,
+ CODEC_ID_MSS1,
+ CODEC_ID_MSA1,
+ CODEC_ID_TSCC2,
+ CODEC_ID_MTS2,
+ CODEC_ID_CLLC,
+
+ /* various PCM "codecs" */
+ CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ CODEC_ID_PCM_S16LE = 0x10000,
+ CODEC_ID_PCM_S16BE,
+ CODEC_ID_PCM_U16LE,
+ CODEC_ID_PCM_U16BE,
+ CODEC_ID_PCM_S8,
+ CODEC_ID_PCM_U8,
+ CODEC_ID_PCM_MULAW,
+ CODEC_ID_PCM_ALAW,
+ CODEC_ID_PCM_S32LE,
+ CODEC_ID_PCM_S32BE,
+ CODEC_ID_PCM_U32LE,
+ CODEC_ID_PCM_U32BE,
+ CODEC_ID_PCM_S24LE,
+ CODEC_ID_PCM_S24BE,
+ CODEC_ID_PCM_U24LE,
+ CODEC_ID_PCM_U24BE,
+ CODEC_ID_PCM_S24DAUD,
+ CODEC_ID_PCM_ZORK,
+ CODEC_ID_PCM_S16LE_PLANAR,
+ CODEC_ID_PCM_DVD,
+ CODEC_ID_PCM_F32BE,
+ CODEC_ID_PCM_F32LE,
+ CODEC_ID_PCM_F64BE,
+ CODEC_ID_PCM_F64LE,
+ CODEC_ID_PCM_BLURAY,
+ CODEC_ID_PCM_LXF,
+ CODEC_ID_S302M,
+ CODEC_ID_PCM_S8_PLANAR,
+
+ /* various ADPCM codecs */
+ CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ CODEC_ID_ADPCM_IMA_WAV,
+ CODEC_ID_ADPCM_IMA_DK3,
+ CODEC_ID_ADPCM_IMA_DK4,
+ CODEC_ID_ADPCM_IMA_WS,
+ CODEC_ID_ADPCM_IMA_SMJPEG,
+ CODEC_ID_ADPCM_MS,
+ CODEC_ID_ADPCM_4XM,
+ CODEC_ID_ADPCM_XA,
+ CODEC_ID_ADPCM_ADX,
+ CODEC_ID_ADPCM_EA,
+ CODEC_ID_ADPCM_G726,
+ CODEC_ID_ADPCM_CT,
+ CODEC_ID_ADPCM_SWF,
+ CODEC_ID_ADPCM_YAMAHA,
+ CODEC_ID_ADPCM_SBPRO_4,
+ CODEC_ID_ADPCM_SBPRO_3,
+ CODEC_ID_ADPCM_SBPRO_2,
+ CODEC_ID_ADPCM_THP,
+ CODEC_ID_ADPCM_IMA_AMV,
+ CODEC_ID_ADPCM_EA_R1,
+ CODEC_ID_ADPCM_EA_R3,
+ CODEC_ID_ADPCM_EA_R2,
+ CODEC_ID_ADPCM_IMA_EA_SEAD,
+ CODEC_ID_ADPCM_IMA_EA_EACS,
+ CODEC_ID_ADPCM_EA_XAS,
+ CODEC_ID_ADPCM_EA_MAXIS_XA,
+ CODEC_ID_ADPCM_IMA_ISS,
+ CODEC_ID_ADPCM_G722,
+ CODEC_ID_ADPCM_IMA_APC,
+
+ /* AMR */
+ CODEC_ID_AMR_NB = 0x12000,
+ CODEC_ID_AMR_WB,
+
+ /* RealAudio codecs*/
+ CODEC_ID_RA_144 = 0x13000,
+ CODEC_ID_RA_288,
+
+ /* various DPCM codecs */
+ CODEC_ID_ROQ_DPCM = 0x14000,
+ CODEC_ID_INTERPLAY_DPCM,
+ CODEC_ID_XAN_DPCM,
+ CODEC_ID_SOL_DPCM,
+
+ /* audio codecs */
+ CODEC_ID_MP2 = 0x15000,
+ CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+ CODEC_ID_AAC,
+ CODEC_ID_AC3,
+ CODEC_ID_DTS,
+ CODEC_ID_VORBIS,
+ CODEC_ID_DVAUDIO,
+ CODEC_ID_WMAV1,
+ CODEC_ID_WMAV2,
+ CODEC_ID_MACE3,
+ CODEC_ID_MACE6,
+ CODEC_ID_VMDAUDIO,
+ CODEC_ID_FLAC,
+ CODEC_ID_MP3ADU,
+ CODEC_ID_MP3ON4,
+ CODEC_ID_SHORTEN,
+ CODEC_ID_ALAC,
+ CODEC_ID_WESTWOOD_SND1,
+ CODEC_ID_GSM, ///< as in Berlin toast format
+ CODEC_ID_QDM2,
+ CODEC_ID_COOK,
+ CODEC_ID_TRUESPEECH,
+ CODEC_ID_TTA,
+ CODEC_ID_SMACKAUDIO,
+ CODEC_ID_QCELP,
+ CODEC_ID_WAVPACK,
+ CODEC_ID_DSICINAUDIO,
+ CODEC_ID_IMC,
+ CODEC_ID_MUSEPACK7,
+ CODEC_ID_MLP,
+ CODEC_ID_GSM_MS, /* as found in WAV */
+ CODEC_ID_ATRAC3,
+ CODEC_ID_VOXWARE,
+ CODEC_ID_APE,
+ CODEC_ID_NELLYMOSER,
+ CODEC_ID_MUSEPACK8,
+ CODEC_ID_SPEEX,
+ CODEC_ID_WMAVOICE,
+ CODEC_ID_WMAPRO,
+ CODEC_ID_WMALOSSLESS,
+ CODEC_ID_ATRAC3P,
+ CODEC_ID_EAC3,
+ CODEC_ID_SIPR,
+ CODEC_ID_MP1,
+ CODEC_ID_TWINVQ,
+ CODEC_ID_TRUEHD,
+ CODEC_ID_MP4ALS,
+ CODEC_ID_ATRAC1,
+ CODEC_ID_BINKAUDIO_RDFT,
+ CODEC_ID_BINKAUDIO_DCT,
+ CODEC_ID_AAC_LATM,
+ CODEC_ID_QDMC,
+ CODEC_ID_CELT,
+ CODEC_ID_G723_1,
+ CODEC_ID_G729,
+ CODEC_ID_8SVX_EXP,
+ CODEC_ID_8SVX_FIB,
+ CODEC_ID_BMV_AUDIO,
+ CODEC_ID_RALF,
+ CODEC_ID_IAC,
+ CODEC_ID_ILBC,
+
+ /* subtitle codecs */
+ CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+ CODEC_ID_DVD_SUBTITLE = 0x17000,
+ CODEC_ID_DVB_SUBTITLE,
+ CODEC_ID_TEXT, ///< raw UTF-8 text
+ CODEC_ID_XSUB,
+ CODEC_ID_SSA,
+ CODEC_ID_MOV_TEXT,
+ CODEC_ID_HDMV_PGS_SUBTITLE,
+ CODEC_ID_DVB_TELETEXT,
+ CODEC_ID_SRT,
+
+ /* other specific kind of codecs (generally used for attachments) */
+ CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
+ CODEC_ID_TTF = 0x18000,
+
+ CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it
+
+ CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+ * stream (only used by libavformat) */
+ CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+ * stream (only used by libavformat) */
+ CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
+
+#endif /* AVCODEC_OLD_CODEC_IDS_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vaapi.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vaapi.h
new file mode 100644
index 000000000..39e88259d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vaapi.h
@@ -0,0 +1,173 @@
+/*
+ * Video Acceleration API (shared data between Libav and the video player)
+ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
+ *
+ * Copyright (C) 2008-2009 Splitted-Desktop Systems
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VAAPI_H
+#define AVCODEC_VAAPI_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vaapi
+ * Public libavcodec VA API header.
+ */
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
+ * @ingroup lavc_codec_hwaccel
+ * @{
+ */
+
+/**
+ * This structure is used to share data between the Libav library and
+ * the client video application.
+ * This shall be zero-allocated and available as
+ * AVCodecContext.hwaccel_context. All user members can be set once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ */
+struct vaapi_context {
+ /**
+ * Window system dependent data
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *display;
+
+ /**
+ * Configuration ID
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t config_id;
+
+ /**
+ * Context ID (video decode pipeline)
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t context_id;
+
+ /**
+ * VAPictureParameterBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t pic_param_buf_id;
+
+ /**
+ * VAIQMatrixBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t iq_matrix_buf_id;
+
+ /**
+ * VABitPlaneBuffer ID (for VC-1 decoding)
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t bitplane_buf_id;
+
+ /**
+ * Slice parameter/data buffer IDs
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t *slice_buf_ids;
+
+ /**
+ * Number of effective slice buffer IDs to send to the HW
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int n_slice_buf_ids;
+
+ /**
+ * Size of pre-allocated slice_buf_ids
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_buf_ids_alloc;
+
+ /**
+ * Pointer to VASliceParameterBuffers
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ void *slice_params;
+
+ /**
+ * Size of a VASliceParameterBuffer element
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_param_size;
+
+ /**
+ * Size of pre-allocated slice_params
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_params_alloc;
+
+ /**
+ * Number of slices currently filled in
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_count;
+
+ /**
+ * Pointer to slice data buffer base
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ const uint8_t *slice_data;
+
+ /**
+ * Current size of slice data
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t slice_data_size;
+};
+
+/* @} */
+
+#endif /* AVCODEC_VAAPI_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vda.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vda.h
new file mode 100644
index 000000000..f0ec2bfec
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vda.h
@@ -0,0 +1,217 @@
+/*
+ * VDA HW acceleration
+ *
+ * copyright (c) 2011 Sebastien Zwickert
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDA_H
+#define AVCODEC_VDA_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vda
+ * Public libavcodec VDA header.
+ */
+
+#include "libavcodec/version.h"
+
+#if FF_API_VDA_ASYNC
+#include <pthread.h>
+#endif
+
+#include <stdint.h>
+
+// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
+// http://openradar.appspot.com/8026390
+#undef __GNUC_STDC_INLINE__
+
+#define Picture QuickdrawPicture
+#include <VideoDecodeAcceleration/VDADecoder.h>
+#undef Picture
+
+/**
+ * @defgroup lavc_codec_hwaccel_vda VDA
+ * @ingroup lavc_codec_hwaccel
+ *
+ * @{
+ */
+
+#if FF_API_VDA_ASYNC
+/**
+ * This structure is used to store decoded frame information and data.
+ *
+ * @deprecated Use synchronous decoding mode.
+ */
+typedef struct vda_frame {
+ /**
+ * The PTS of the frame.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ int64_t pts;
+
+ /**
+ * The CoreVideo buffer that contains the decoded data.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ CVPixelBufferRef cv_buffer;
+
+ /**
+ * A pointer to the next frame.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ struct vda_frame *next_frame;
+} vda_frame;
+#endif
+
+/**
+ * This structure is used to provide the necessary configurations and data
+ * to the VDA Libav HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct vda_context {
+ /**
+ * VDA decoder object.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ VDADecoder decoder;
+
+ /**
+ * The Core Video pixel buffer that contains the current image data.
+ *
+ * encoding: unused
+ * decoding: Set by libavcodec. Unset by user.
+ */
+ CVPixelBufferRef cv_buffer;
+
+ /**
+ * Use the hardware decoder in synchronous mode.
+ *
+ * encoding: unused
+ * decoding: Set by user.
+ */
+ int use_sync_decoding;
+
+#if FF_API_VDA_ASYNC
+ /**
+ * VDA frames queue ordered by presentation timestamp.
+ *
+ * @deprecated Use synchronous decoding mode.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ vda_frame *queue;
+
+ /**
+ * Mutex for locking queue operations.
+ *
+ * @deprecated Use synchronous decoding mode.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ pthread_mutex_t queue_mutex;
+#endif
+
+ /**
+ * The frame width.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int width;
+
+ /**
+ * The frame height.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int height;
+
+ /**
+ * The frame format.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int format;
+
+ /**
+ * The pixel format for output image buffers.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ OSType cv_pix_fmt_type;
+
+ /**
+ * The current bitstream buffer.
+ */
+ uint8_t *priv_bitstream;
+
+ /**
+ * The current size of the bitstream.
+ */
+ int priv_bitstream_size;
+
+ /**
+ * The reference size used for fast reallocation.
+ */
+ int priv_allocated_size;
+};
+
+/** Create the video decoder. */
+int ff_vda_create_decoder(struct vda_context *vda_ctx,
+ uint8_t *extradata,
+ int extradata_size);
+
+/** Destroy the video decoder. */
+int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
+
+#if FF_API_VDA_ASYNC
+/**
+ * Return the top frame of the queue.
+ *
+ * @deprecated Use synchronous decoding mode.
+ */
+vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx);
+
+/**
+ * Release the given frame.
+ *
+ * @deprecated Use synchronous decoding mode.
+ */
+void ff_vda_release_vda_frame(vda_frame *frame);
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_VDA_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vdpau.h
new file mode 100644
index 000000000..241ff1905
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/vdpau.h
@@ -0,0 +1,94 @@
+/*
+ * The Video Decode and Presentation API for UNIX (VDPAU) is used for
+ * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.
+ *
+ * Copyright (C) 2008 NVIDIA
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDPAU_H
+#define AVCODEC_VDPAU_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vdpau
+ * Public libavcodec VDPAU header.
+ */
+
+
+/**
+ * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer
+ * @ingroup lavc_codec_hwaccel
+ *
+ * VDPAU hardware acceleration has two modules
+ * - VDPAU decoding
+ * - VDPAU presentation
+ *
+ * The VDPAU decoding module parses all headers using Libav
+ * parsing mechanisms and uses VDPAU for the actual decoding.
+ *
+ * As per the current implementation, the actual decoding
+ * and rendering (API calls) are done as part of the VDPAU
+ * presentation (vo_vdpau.c) module.
+ *
+ * @{
+ */
+
+#include <vdpau/vdpau.h>
+#include <vdpau/vdpau_x11.h>
+
+/** @brief The videoSurface is used for rendering. */
+#define FF_VDPAU_STATE_USED_FOR_RENDER 1
+
+/**
+ * @brief The videoSurface is needed for reference/prediction.
+ * The codec manipulates this.
+ */
+#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2
+
+/**
+ * @brief This structure is used as a callback between the Libav
+ * decoder (vd_) and presentation (vo_) module.
+ * This is used for defining a video frame containing surface,
+ * picture parameter, bitstream information etc which are passed
+ * between the Libav decoder and its clients.
+ */
+struct vdpau_render_state {
+ VdpVideoSurface surface; ///< Used as rendered surface, never changed.
+
+ int state; ///< Holds FF_VDPAU_STATE_* values.
+
+ /** picture parameter information for all supported codecs */
+ union VdpPictureInfo {
+ VdpPictureInfoH264 h264;
+ VdpPictureInfoMPEG1Or2 mpeg;
+ VdpPictureInfoVC1 vc1;
+ VdpPictureInfoMPEG4Part2 mpeg4;
+ } info;
+
+ /** Describe size/location of the compressed video data.
+ Set to 0 when freeing bitstream_buffers. */
+ int bitstream_buffers_allocated;
+ int bitstream_buffers_used;
+ /** The user is responsible for freeing this buffer using av_freep(). */
+ VdpBitstreamBuffer *bitstream_buffers;
+};
+
+/* @}*/
+
+#endif /* AVCODEC_VDPAU_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/version.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/version.h
new file mode 100644
index 000000000..348ce99f2
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/version.h
@@ -0,0 +1,95 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VERSION_H
+#define AVCODEC_VERSION_H
+
+/**
+ * @file
+ * @ingroup libavc
+ * Libavcodec version macros.
+ */
+
+#define LIBAVCODEC_VERSION_MAJOR 54
+#define LIBAVCODEC_VERSION_MINOR 35
+#define LIBAVCODEC_VERSION_MICRO 0
+
+#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
+
+#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
+
+/**
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ */
+
+#ifndef FF_API_REQUEST_CHANNELS
+#define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_OLD_DECODE_AUDIO
+#define FF_API_OLD_DECODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_OLD_ENCODE_AUDIO
+#define FF_API_OLD_ENCODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_OLD_ENCODE_VIDEO
+#define FF_API_OLD_ENCODE_VIDEO (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_MPV_GLOBAL_OPTS
+#define FF_API_MPV_GLOBAL_OPTS (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_COLOR_TABLE_ID
+#define FF_API_COLOR_TABLE_ID (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_INTER_THRESHOLD
+#define FF_API_INTER_THRESHOLD (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_SUB_ID
+#define FF_API_SUB_ID (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_DSP_MASK
+#define FF_API_DSP_MASK (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_FIND_BEST_PIX_FMT
+#define FF_API_FIND_BEST_PIX_FMT (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_CODEC_ID
+#define FF_API_CODEC_ID (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_VDA_ASYNC
+#define FF_API_VDA_ASYNC (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_AVCODEC_RESAMPLE
+#define FF_API_AVCODEC_RESAMPLE (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_LIBMPEG2
+#define FF_API_LIBMPEG2 (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+#ifndef FF_API_MMI
+#define FF_API_MMI (LIBAVCODEC_VERSION_MAJOR < 55)
+#endif
+
+#endif /* AVCODEC_VERSION_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavcodec/xvmc.h b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/xvmc.h
new file mode 100644
index 000000000..1f77e4efc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavcodec/xvmc.h
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2003 Ivan Kalvachev
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_XVMC_H
+#define AVCODEC_XVMC_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_xvmc
+ * Public libavcodec XvMC header.
+ */
+
+#include <X11/extensions/XvMC.h>
+
+#include "avcodec.h"
+
+/**
+ * @defgroup lavc_codec_hwaccel_xvmc XvMC
+ * @ingroup lavc_codec_hwaccel
+ *
+ * @{
+ */
+
+#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct
+ the number is 1337 speak for the letters IDCT MCo (motion compensation) */
+
+struct xvmc_pix_fmt {
+ /** The field contains the special constant value AV_XVMC_ID.
+ It is used as a test that the application correctly uses the API,
+ and that there is no corruption caused by pixel routines.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int xvmc_id;
+
+ /** Pointer to the block array allocated by XvMCCreateBlocks().
+ The array has to be freed by XvMCDestroyBlocks().
+ Each group of 64 values represents one data block of differential
+ pixel information (in MoCo mode) or coefficients for IDCT.
+ - application - set the pointer during initialization
+ - libavcodec - fills coefficients/pixel data into the array
+ */
+ short* data_blocks;
+
+ /** Pointer to the macroblock description array allocated by
+ XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks().
+ - application - set the pointer during initialization
+ - libavcodec - fills description data into the array
+ */
+ XvMCMacroBlock* mv_blocks;
+
+ /** Number of macroblock descriptions that can be stored in the mv_blocks
+ array.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int allocated_mv_blocks;
+
+ /** Number of blocks that can be stored at once in the data_blocks array.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int allocated_data_blocks;
+
+ /** Indicate that the hardware would interpret data_blocks as IDCT
+ coefficients and perform IDCT on them.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int idct;
+
+ /** In MoCo mode it indicates that intra macroblocks are assumed to be in
+ unsigned format; same as the XVMC_INTRA_UNSIGNED flag.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int unsigned_intra;
+
+ /** Pointer to the surface allocated by XvMCCreateSurface().
+ It has to be freed by XvMCDestroySurface() on application exit.
+ It identifies the frame and its state on the video hardware.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ XvMCSurface* p_surface;
+
+/** Set by the decoder before calling ff_draw_horiz_band(),
+ needed by the XvMCRenderSurface function. */
+//@{
+ /** Pointer to the surface used as past reference
+ - application - unchanged
+ - libavcodec - set
+ */
+ XvMCSurface* p_past_surface;
+
+ /** Pointer to the surface used as future reference
+ - application - unchanged
+ - libavcodec - set
+ */
+ XvMCSurface* p_future_surface;
+
+ /** top/bottom field or frame
+ - application - unchanged
+ - libavcodec - set
+ */
+ unsigned int picture_structure;
+
+ /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence
+ - application - unchanged
+ - libavcodec - set
+ */
+ unsigned int flags;
+//}@
+
+ /** Number of macroblock descriptions in the mv_blocks array
+ that have already been passed to the hardware.
+ - application - zeroes it on get_buffer().
+ A successful ff_draw_horiz_band() may increment it
+ with filled_mb_block_num or zero both.
+ - libavcodec - unchanged
+ */
+ int start_mv_blocks_num;
+
+ /** Number of new macroblock descriptions in the mv_blocks array (after
+ start_mv_blocks_num) that are filled by libavcodec and have to be
+ passed to the hardware.
+ - application - zeroes it on get_buffer() or after successful
+ ff_draw_horiz_band().
+ - libavcodec - increment with one of each stored MB
+ */
+ int filled_mv_blocks_num;
+
+ /** Number of the next free data block; one data block consists of
+ 64 short values in the data_blocks array.
+ All blocks before this one have already been claimed by placing their
+ position into the corresponding block description structure field,
+ that are part of the mv_blocks array.
+ - application - zeroes it on get_buffer().
+ A successful ff_draw_horiz_band() may zero it together
+ with start_mb_blocks_num.
+ - libavcodec - each decoded macroblock increases it by the number
+ of coded blocks it contains.
+ */
+ int next_free_data_block_num;
+};
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_XVMC_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/adler32.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/adler32.h
new file mode 100644
index 000000000..a8ff6f9d4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/adler32.h
@@ -0,0 +1,43 @@
+/*
+ * copyright (c) 2006 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_ADLER32_H
+#define AVUTIL_ADLER32_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+/**
+ * @ingroup lavu_crypto
+ * Calculate the Adler32 checksum of a buffer.
+ *
+ * Passing the return value to a subsequent av_adler32_update() call
+ * allows the checksum of multiple buffers to be calculated as though
+ * they were concatenated.
+ *
+ * @param adler initial checksum value
+ * @param buf pointer to input buffer
+ * @param len size of input buffer
+ * @return updated checksum
+ */
+unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf,
+ unsigned int len) av_pure;
+
+#endif /* AVUTIL_ADLER32_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/aes.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/aes.h
new file mode 100644
index 000000000..edff275b7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/aes.h
@@ -0,0 +1,67 @@
+/*
+ * copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AES_H
+#define AVUTIL_AES_H
+
+#include <stdint.h>
+
+#include "attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavu_aes AES
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#if FF_API_CONTEXT_SIZE
+extern attribute_deprecated const int av_aes_size;
+#endif
+
+struct AVAES;
+
+/**
+ * Allocate an AVAES context.
+ */
+struct AVAES *av_aes_alloc(void);
+
+/**
+ * Initialize an AVAES context.
+ * @param key_bits 128, 192 or 256
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ * @param count number of 16 byte blocks
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param iv initialization vector for CBC mode, if NULL then ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AES_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/attributes.h
new file mode 100644
index 000000000..292a0a1a8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/attributes.h
@@ -0,0 +1,122 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Macro definitions for various function/variable attributes
+ */
+
+#ifndef AVUTIL_ATTRIBUTES_H
+#define AVUTIL_ATTRIBUTES_H
+
+#ifdef __GNUC__
+# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y)
+#else
+# define AV_GCC_VERSION_AT_LEAST(x,y) 0
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_always_inline __attribute__((always_inline)) inline
+#elif defined(_MSC_VER)
+# define av_always_inline __forceinline
+#else
+# define av_always_inline inline
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_noinline __attribute__((noinline))
+#else
+# define av_noinline
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_pure __attribute__((pure))
+#else
+# define av_pure
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(2,6)
+# define av_const __attribute__((const))
+#else
+# define av_const
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+# define av_cold __attribute__((cold))
+#else
+# define av_cold
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,1)
+# define av_flatten __attribute__((flatten))
+#else
+# define av_flatten
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define attribute_deprecated __attribute__((deprecated))
+#else
+# define attribute_deprecated
+#endif
+
+#if defined(__GNUC__)
+# define av_unused __attribute__((unused))
+#else
+# define av_unused
+#endif
+
+/**
+ * Mark a variable as used and prevent the compiler from optimizing it
+ * away. This is useful for variables accessed only from inline
+ * assembler without the compiler being aware.
+ */
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_used __attribute__((used))
+#else
+# define av_used
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,3)
+# define av_alias __attribute__((may_alias))
+#else
+# define av_alias
+#endif
+
+#if defined(__GNUC__) && !defined(__ICC)
+# define av_uninit(x) x=x
+#else
+# define av_uninit(x) x
+#endif
+
+#ifdef __GNUC__
+# define av_builtin_constant_p __builtin_constant_p
+# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))
+#else
+# define av_builtin_constant_p(x) 0
+# define av_printf_format(fmtpos, attrpos)
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(2,5)
+# define av_noreturn __attribute__((noreturn))
+#else
+# define av_noreturn
+#endif
+
+#endif /* AVUTIL_ATTRIBUTES_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/audio_fifo.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/audio_fifo.h
new file mode 100644
index 000000000..8c7638825
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/audio_fifo.h
@@ -0,0 +1,146 @@
+/*
+ * Audio FIFO
+ * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Audio FIFO Buffer
+ */
+
+#ifndef AVUTIL_AUDIO_FIFO_H
+#define AVUTIL_AUDIO_FIFO_H
+
+#include "avutil.h"
+#include "fifo.h"
+#include "samplefmt.h"
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * Context for an Audio FIFO Buffer.
+ *
+ * - Operates at the sample level rather than the byte level.
+ * - Supports multiple channels with either planar or packed sample format.
+ * - Automatic reallocation when writing to a full buffer.
+ */
+typedef struct AVAudioFifo AVAudioFifo;
+
+/**
+ * Free an AVAudioFifo.
+ *
+ * @param af AVAudioFifo to free
+ */
+void av_audio_fifo_free(AVAudioFifo *af);
+
+/**
+ * Allocate an AVAudioFifo.
+ *
+ * @param sample_fmt sample format
+ * @param channels number of channels
+ * @param nb_samples initial allocation size, in samples
+ * @return newly allocated AVAudioFifo, or NULL on error
+ */
+AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels,
+ int nb_samples);
+
+/**
+ * Reallocate an AVAudioFifo.
+ *
+ * @param af AVAudioFifo to reallocate
+ * @param nb_samples new allocation size, in samples
+ * @return 0 if OK, or negative AVERROR code on failure
+ */
+int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples);
+
+/**
+ * Write data to an AVAudioFifo.
+ *
+ * The AVAudioFifo will be reallocated automatically if the available space
+ * is less than nb_samples.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param af AVAudioFifo to write to
+ * @param data audio data plane pointers
+ * @param nb_samples number of samples to write
+ * @return number of samples actually written, or negative AVERROR
+ * code on failure.
+ */
+int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples);
+
+/**
+ * Read data from an AVAudioFifo.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param af AVAudioFifo to read from
+ * @param data audio data plane pointers
+ * @param nb_samples number of samples to read
+ * @return number of samples actually read, or negative AVERROR code
+ * on failure.
+ */
+int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples);
+
+/**
+ * Drain data from an AVAudioFifo.
+ *
+ * Removes the data without reading it.
+ *
+ * @param af AVAudioFifo to drain
+ * @param nb_samples number of samples to drain
+ * @return 0 if OK, or negative AVERROR code on failure
+ */
+int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples);
+
+/**
+ * Reset the AVAudioFifo buffer.
+ *
+ * This empties all data in the buffer.
+ *
+ * @param af AVAudioFifo to reset
+ */
+void av_audio_fifo_reset(AVAudioFifo *af);
+
+/**
+ * Get the current number of samples in the AVAudioFifo available for reading.
+ *
+ * @param af the AVAudioFifo to query
+ * @return number of samples available for reading
+ */
+int av_audio_fifo_size(AVAudioFifo *af);
+
+/**
+ * Get the current number of samples in the AVAudioFifo available for writing.
+ *
+ * @param af the AVAudioFifo to query
+ * @return number of samples available for writing
+ */
+int av_audio_fifo_space(AVAudioFifo *af);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AUDIO_FIFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/audioconvert.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/audioconvert.h
new file mode 100644
index 000000000..300a67cd3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/audioconvert.h
@@ -0,0 +1,6 @@
+
+#include "version.h"
+
+#if FF_API_AUDIOCONVERT
+#include "channel_layout.h"
+#endif
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/avassert.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avassert.h
new file mode 100644
index 000000000..b223d26e8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avassert.h
@@ -0,0 +1,66 @@
+/*
+ * copyright (c) 2010 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * simple assert() macros that are a bit more flexible than ISO C assert().
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_AVASSERT_H
+#define AVUTIL_AVASSERT_H
+
+#include <stdlib.h>
+#include "avutil.h"
+#include "log.h"
+
+/**
+ * assert() equivalent, that is always enabled.
+ */
+#define av_assert0(cond) do { \
+ if (!(cond)) { \
+ av_log(NULL, AV_LOG_FATAL, "Assertion %s failed at %s:%d\n", \
+ AV_STRINGIFY(cond), __FILE__, __LINE__); \
+ abort(); \
+ } \
+} while (0)
+
+
+/**
+ * assert() equivalent, that does not lie in speed critical code.
+ * These asserts() thus can be enabled without fearing speedloss.
+ */
+#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0
+#define av_assert1(cond) av_assert0(cond)
+#else
+#define av_assert1(cond) ((void)0)
+#endif
+
+
+/**
+ * assert() equivalent, that does lie in speed critical code.
+ */
+#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
+#define av_assert2(cond) av_assert0(cond)
+#else
+#define av_assert2(cond) ((void)0)
+#endif
+
+#endif /* AVUTIL_AVASSERT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avconfig.h
new file mode 100644
index 000000000..f10aa6186
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffconf */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/avstring.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avstring.h
new file mode 100644
index 000000000..acd6610d3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avstring.h
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2007 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVSTRING_H
+#define AVUTIL_AVSTRING_H
+
+#include <stddef.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_string
+ * @{
+ */
+
+/**
+ * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to
+ * the address of the first character in str after the prefix.
+ *
+ * @param str input string
+ * @param pfx prefix to test
+ * @param ptr updated if the prefix is matched inside str
+ * @return non-zero if the prefix matches, zero otherwise
+ */
+int av_strstart(const char *str, const char *pfx, const char **ptr);
+
+/**
+ * Return non-zero if pfx is a prefix of str independent of case. If
+ * it is, *ptr is set to the address of the first character in str
+ * after the prefix.
+ *
+ * @param str input string
+ * @param pfx prefix to test
+ * @param ptr updated if the prefix is matched inside str
+ * @return non-zero if the prefix matches, zero otherwise
+ */
+int av_stristart(const char *str, const char *pfx, const char **ptr);
+
+/**
+ * Locate the first case-independent occurrence in the string haystack
+ * of the string needle. A zero-length string needle is considered to
+ * match at the start of haystack.
+ *
+ * This function is a case-insensitive version of the standard strstr().
+ *
+ * @param haystack string to search in
+ * @param needle string to search for
+ * @return pointer to the located match within haystack
+ * or a null pointer if no match
+ */
+char *av_stristr(const char *haystack, const char *needle);
+
+/**
+ * Copy the string src to dst, but no more than size - 1 bytes, and
+ * null-terminate dst.
+ *
+ * This function is the same as BSD strlcpy().
+ *
+ * @param dst destination buffer
+ * @param src source string
+ * @param size size of destination buffer
+ * @return the length of src
+ *
+ * @warning since the return value is the length of src, src absolutely
+ * _must_ be a properly 0-terminated string, otherwise this will read beyond
+ * the end of the buffer and possibly crash.
+ */
+size_t av_strlcpy(char *dst, const char *src, size_t size);
+
+/**
+ * Append the string src to the string dst, but to a total length of
+ * no more than size - 1 bytes, and null-terminate dst.
+ *
+ * This function is similar to BSD strlcat(), but differs when
+ * size <= strlen(dst).
+ *
+ * @param dst destination buffer
+ * @param src source string
+ * @param size size of destination buffer
+ * @return the total length of src and dst
+ *
+ * @warning since the return value use the length of src and dst, these
+ * absolutely _must_ be a properly 0-terminated strings, otherwise this
+ * will read beyond the end of the buffer and possibly crash.
+ */
+size_t av_strlcat(char *dst, const char *src, size_t size);
+
+/**
+ * Append output to a string, according to a format. Never write out of
+ * the destination buffer, and always put a terminating 0 within
+ * the buffer.
+ * @param dst destination buffer (string to which the output is
+ * appended)
+ * @param size total size of the destination buffer
+ * @param fmt printf-compatible format string, specifying how the
+ * following parameters are used
+ * @return the length of the string that would have been generated
+ * if enough space had been available
+ */
+size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);
+
+/**
+ * Convert a number to a av_malloced string.
+ */
+char *av_d2str(double d);
+
+/**
+ * Unescape the given string until a non escaped terminating char,
+ * and return the token corresponding to the unescaped string.
+ *
+ * The normal \ and ' escaping is supported. Leading and trailing
+ * whitespaces are removed, unless they are escaped with '\' or are
+ * enclosed between ''.
+ *
+ * @param buf the buffer to parse, buf will be updated to point to the
+ * terminating char
+ * @param term a 0-terminated list of terminating chars
+ * @return the malloced unescaped string, which must be av_freed by
+ * the user, NULL in case of allocation failure
+ */
+char *av_get_token(const char **buf, const char *term);
+
+/**
+ * Locale-independent conversion of ASCII characters to uppercase.
+ */
+static inline int av_toupper(int c)
+{
+ if (c >= 'a' && c <= 'z')
+ c ^= 0x20;
+ return c;
+}
+
+/**
+ * Locale-independent conversion of ASCII characters to lowercase.
+ */
+static inline int av_tolower(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ c ^= 0x20;
+ return c;
+}
+
+/*
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strcasecmp(const char *a, const char *b);
+
+/**
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strncasecmp(const char *a, const char *b, size_t n);
+
+
+/**
+ * Thread safe basename.
+ * @param path the path, on DOS both \ and / are considered separators.
+ * @return pointer to the basename substring.
+ */
+const char *av_basename(const char *path);
+
+/**
+ * Thread safe dirname.
+ * @param path the path, on DOS both \ and / are considered separators.
+ * @return the path with the separator replaced by the string terminator or ".".
+ * @note the function may change the input string.
+ */
+const char *av_dirname(char *path);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AVSTRING_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avutil.h
new file mode 100644
index 000000000..33f9bea72
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/avutil.h
@@ -0,0 +1,275 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVUTIL_H
+#define AVUTIL_AVUTIL_H
+
+/**
+ * @file
+ * external API header
+ */
+
+/**
+ * @mainpage
+ *
+ * @section libav_intro Introduction
+ *
+ * This document describes the usage of the different libraries
+ * provided by Libav.
+ *
+ * @li @ref libavc "libavcodec" encoding/decoding library
+ * @li @subpage libavfilter graph based frame editing library
+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
+ * @li @ref lavu "libavutil" common utility library
+ * @li @ref lavr "libavresample" audio resampling, format conversion and mixing
+ * @li @subpage libswscale color conversion and scaling library
+ */
+
+/**
+ * @defgroup lavu Common utility functions
+ *
+ * @brief
+ * libavutil contains the code shared across all the other Libav
+ * libraries
+ *
+ * @note In order to use the functions provided by avutil you must include
+ * the specific header.
+ *
+ * @{
+ *
+ * @defgroup lavu_crypto Crypto and Hashing
+ *
+ * @{
+ * @}
+ *
+ * @defgroup lavu_math Maths
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_string String Manipulation
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_mem Memory Management
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_data Data Structures
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_audio Audio related
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_error Error Codes
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_misc Other
+ *
+ * @{
+ *
+ * @defgroup lavu_internal Internal
+ *
+ * Not exported functions, for internal usage only
+ *
+ * @{
+ *
+ * @}
+ */
+
+
+/**
+ * @defgroup preproc_misc Preprocessor String Macros
+ *
+ * String manipulation macros
+ *
+ * @{
+ */
+
+#define AV_STRINGIFY(s) AV_TOSTRING(s)
+#define AV_TOSTRING(s) #s
+
+#define AV_GLUE(a, b) a ## b
+#define AV_JOIN(a, b) AV_GLUE(a, b)
+
+#define AV_PRAGMA(s) _Pragma(#s)
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup version_utils Library Version Macros
+ *
+ * Useful to check and match library version in order to maintain
+ * backward compatibility.
+ *
+ * @{
+ */
+
+#define AV_VERSION_INT(a, b, c) (a<<16 | b<<8 | c)
+#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_ver
+ * @{
+ */
+
+/**
+ * Return the LIBAVUTIL_VERSION_INT constant.
+ */
+unsigned avutil_version(void);
+
+/**
+ * Return the libavutil build-time configuration.
+ */
+const char *avutil_configuration(void);
+
+/**
+ * Return the libavutil license.
+ */
+const char *avutil_license(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_media Media Type
+ * @brief Media Type
+ */
+
+enum AVMediaType {
+ AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA
+ AVMEDIA_TYPE_VIDEO,
+ AVMEDIA_TYPE_AUDIO,
+ AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous
+ AVMEDIA_TYPE_SUBTITLE,
+ AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse
+ AVMEDIA_TYPE_NB
+};
+
+/**
+ * @defgroup lavu_const Constants
+ * @{
+ *
+ * @defgroup lavu_enc Encoding specific
+ *
+ * @note those definition should move to avcodec
+ * @{
+ */
+
+#define FF_LAMBDA_SHIFT 7
+#define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)
+#define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
+#define FF_LAMBDA_MAX (256*128-1)
+
+#define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
+
+/**
+ * @}
+ * @defgroup lavu_time Timestamp specific
+ *
+ * Libav internal timebase and timestamp definitions
+ *
+ * @{
+ */
+
+/**
+ * @brief Undefined timestamp value
+ *
+ * Usually reported by demuxer that work on containers that do not provide
+ * either pts or dts.
+ */
+
+#define AV_NOPTS_VALUE INT64_C(0x8000000000000000)
+
+/**
+ * Internal time base represented as integer
+ */
+
+#define AV_TIME_BASE 1000000
+
+/**
+ * Internal time base represented as fractional value
+ */
+
+#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
+
+/**
+ * @}
+ * @}
+ * @defgroup lavu_picture Image related
+ *
+ * AVPicture types, pixel formats and basic image planes manipulation.
+ *
+ * @{
+ */
+
+enum AVPictureType {
+ AV_PICTURE_TYPE_I = 1, ///< Intra
+ AV_PICTURE_TYPE_P, ///< Predicted
+ AV_PICTURE_TYPE_B, ///< Bi-dir predicted
+ AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG4
+ AV_PICTURE_TYPE_SI, ///< Switching Intra
+ AV_PICTURE_TYPE_SP, ///< Switching Predicted
+ AV_PICTURE_TYPE_BI, ///< BI type
+};
+
+/**
+ * Return a single letter to describe the given picture type
+ * pict_type.
+ *
+ * @param[in] pict_type the picture type @return a single character
+ * representing the picture type, '?' if pict_type is unknown
+ */
+char av_get_picture_type_char(enum AVPictureType pict_type);
+
+/**
+ * @}
+ */
+
+#include "error.h"
+#include "version.h"
+
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_AVUTIL_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/base64.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/base64.h
new file mode 100644
index 000000000..4750cf5c7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/base64.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BASE64_H
+#define AVUTIL_BASE64_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_base64 Base64
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+
+/**
+ * Decode a base64-encoded string.
+ *
+ * @param out buffer for decoded data
+ * @param in null-terminated input string
+ * @param out_size size in bytes of the out buffer, must be at
+ * least 3/4 of the length of in
+ * @return number of bytes written, or a negative value in case of
+ * invalid input
+ */
+int av_base64_decode(uint8_t *out, const char *in, int out_size);
+
+/**
+ * Encode data to base64 and null-terminate.
+ *
+ * @param out buffer for encoded data
+ * @param out_size size in bytes of the output buffer, must be at
+ * least AV_BASE64_SIZE(in_size)
+ * @param in_size size in bytes of the 'in' buffer
+ * @return 'out' or NULL in case of error
+ */
+char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size);
+
+/**
+ * Calculate the output size needed to base64-encode x bytes.
+ */
+#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1)
+
+ /**
+ * @}
+ */
+
+#endif /* AVUTIL_BASE64_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/blowfish.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/blowfish.h
new file mode 100644
index 000000000..8c29536cf
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/blowfish.h
@@ -0,0 +1,76 @@
+/*
+ * Blowfish algorithm
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BLOWFISH_H
+#define AVUTIL_BLOWFISH_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_blowfish Blowfish
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#define AV_BF_ROUNDS 16
+
+typedef struct AVBlowfish {
+ uint32_t p[AV_BF_ROUNDS + 2];
+ uint32_t s[4][256];
+} AVBlowfish;
+
+/**
+ * Initialize an AVBlowfish context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param key a key
+ * @param key_len length of the key
+ */
+void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param xl left four bytes halves of input to be encrypted
+ * @param xr right four bytes halves of input to be encrypted
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
+ int decrypt);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param count number of 8 byte blocks
+ * @param iv initialization vector for CBC mode, if NULL ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
+ int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_BLOWFISH_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/bswap.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/bswap.h
new file mode 100644
index 000000000..8a350e1cd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/bswap.h
@@ -0,0 +1,109 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * byte swapping routines
+ */
+
+#ifndef AVUTIL_BSWAP_H
+#define AVUTIL_BSWAP_H
+
+#include <stdint.h>
+#include "libavutil/avconfig.h"
+#include "attributes.h"
+
+#ifdef HAVE_AV_CONFIG_H
+
+#include "config.h"
+
+#if ARCH_ARM
+# include "arm/bswap.h"
+#elif ARCH_AVR32
+# include "avr32/bswap.h"
+#elif ARCH_BFIN
+# include "bfin/bswap.h"
+#elif ARCH_SH4
+# include "sh4/bswap.h"
+#elif ARCH_X86
+# include "x86/bswap.h"
+#endif
+
+#endif /* HAVE_AV_CONFIG_H */
+
+#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff))
+#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16))
+#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32))
+
+#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x)
+
+#ifndef av_bswap16
+static av_always_inline av_const uint16_t av_bswap16(uint16_t x)
+{
+ x= (x>>8) | (x<<8);
+ return x;
+}
+#endif
+
+#ifndef av_bswap32
+static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
+{
+ return AV_BSWAP32C(x);
+}
+#endif
+
+#ifndef av_bswap64
+static inline uint64_t av_const av_bswap64(uint64_t x)
+{
+ return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32);
+}
+#endif
+
+// be2ne ... big-endian to native-endian
+// le2ne ... little-endian to native-endian
+
+#if AV_HAVE_BIGENDIAN
+#define av_be2ne16(x) (x)
+#define av_be2ne32(x) (x)
+#define av_be2ne64(x) (x)
+#define av_le2ne16(x) av_bswap16(x)
+#define av_le2ne32(x) av_bswap32(x)
+#define av_le2ne64(x) av_bswap64(x)
+#define AV_BE2NEC(s, x) (x)
+#define AV_LE2NEC(s, x) AV_BSWAPC(s, x)
+#else
+#define av_be2ne16(x) av_bswap16(x)
+#define av_be2ne32(x) av_bswap32(x)
+#define av_be2ne64(x) av_bswap64(x)
+#define av_le2ne16(x) (x)
+#define av_le2ne32(x) (x)
+#define av_le2ne64(x) (x)
+#define AV_BE2NEC(s, x) AV_BSWAPC(s, x)
+#define AV_LE2NEC(s, x) (x)
+#endif
+
+#define AV_BE2NE16C(x) AV_BE2NEC(16, x)
+#define AV_BE2NE32C(x) AV_BE2NEC(32, x)
+#define AV_BE2NE64C(x) AV_BE2NEC(64, x)
+#define AV_LE2NE16C(x) AV_LE2NEC(16, x)
+#define AV_LE2NE32C(x) AV_LE2NEC(32, x)
+#define AV_LE2NE64C(x) AV_LE2NEC(64, x)
+
+#endif /* AVUTIL_BSWAP_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/channel_layout.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/channel_layout.h
new file mode 100644
index 000000000..15b6887a6
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/channel_layout.h
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ * Copyright (c) 2008 Peter Ross
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CHANNEL_LAYOUT_H
+#define AVUTIL_CHANNEL_LAYOUT_H
+
+#include <stdint.h>
+
+/**
+ * @file
+ * audio channel layout utility functions
+ */
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * @defgroup channel_masks Audio channel masks
+ * @{
+ */
+#define AV_CH_FRONT_LEFT 0x00000001
+#define AV_CH_FRONT_RIGHT 0x00000002
+#define AV_CH_FRONT_CENTER 0x00000004
+#define AV_CH_LOW_FREQUENCY 0x00000008
+#define AV_CH_BACK_LEFT 0x00000010
+#define AV_CH_BACK_RIGHT 0x00000020
+#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040
+#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080
+#define AV_CH_BACK_CENTER 0x00000100
+#define AV_CH_SIDE_LEFT 0x00000200
+#define AV_CH_SIDE_RIGHT 0x00000400
+#define AV_CH_TOP_CENTER 0x00000800
+#define AV_CH_TOP_FRONT_LEFT 0x00001000
+#define AV_CH_TOP_FRONT_CENTER 0x00002000
+#define AV_CH_TOP_FRONT_RIGHT 0x00004000
+#define AV_CH_TOP_BACK_LEFT 0x00008000
+#define AV_CH_TOP_BACK_CENTER 0x00010000
+#define AV_CH_TOP_BACK_RIGHT 0x00020000
+#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix.
+#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT.
+#define AV_CH_WIDE_LEFT 0x0000000080000000ULL
+#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL
+#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL
+#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL
+#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL
+
+/** Channel mask value used for AVCodecContext.request_channel_layout
+ to indicate that the user requests the channel order of the decoder output
+ to be the native codec channel order. */
+#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL
+
+/**
+ * @}
+ * @defgroup channel_mask_c Audio channel convenience macros
+ * @{
+ * */
+#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
+#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
+
+enum AVMatrixEncoding {
+ AV_MATRIX_ENCODING_NONE,
+ AV_MATRIX_ENCODING_DOLBY,
+ AV_MATRIX_ENCODING_DPLII,
+ AV_MATRIX_ENCODING_NB
+};
+
+/**
+ * @}
+ */
+
+/**
+ * Return a channel layout id that matches name, or 0 if no match is found.
+ *
+ * name can be one or several of the following notations,
+ * separated by '+' or '|':
+ * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0,
+ * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix);
+ * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC,
+ * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR);
+ * - a number of channels, in decimal, optionally followed by 'c', yielding
+ * the default channel layout for that number of channels (@see
+ * av_get_default_channel_layout);
+ * - a channel layout mask, in hexadecimal starting with "0x" (see the
+ * AV_CH_* macros).
+ *
+ * Example: "stereo+FC" = "2+FC" = "2c+1c" = "0x7"
+ */
+uint64_t av_get_channel_layout(const char *name);
+
+/**
+ * Return a description of a channel layout.
+ * If nb_channels is <= 0, it is guessed from the channel_layout.
+ *
+ * @param buf put here the string containing the channel layout
+ * @param buf_size size in bytes of the buffer
+ */
+void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
+
+/**
+ * Return the number of channels in the channel layout.
+ */
+int av_get_channel_layout_nb_channels(uint64_t channel_layout);
+
+/**
+ * Return default channel layout for a given number of channels.
+ */
+uint64_t av_get_default_channel_layout(int nb_channels);
+
+/**
+ * Get the index of a channel in channel_layout.
+ *
+ * @param channel a channel layout describing exactly one channel which must be
+ * present in channel_layout.
+ *
+ * @return index of channel in channel_layout on success, a negative AVERROR
+ * on error.
+ */
+int av_get_channel_layout_channel_index(uint64_t channel_layout,
+ uint64_t channel);
+
+/**
+ * Get the channel with the given index in channel_layout.
+ */
+uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index);
+
+/**
+ * Get the name of a given channel.
+ *
+ * @return channel name on success, NULL on error.
+ */
+const char *av_get_channel_name(uint64_t channel);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_CHANNEL_LAYOUT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/common.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/common.h
new file mode 100644
index 000000000..cc4df16e4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/common.h
@@ -0,0 +1,406 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * common internal and external API header
+ */
+
+#ifndef AVUTIL_COMMON_H
+#define AVUTIL_COMMON_H
+
+#include <ctype.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "attributes.h"
+#include "version.h"
+#include "libavutil/avconfig.h"
+
+#if AV_HAVE_BIGENDIAN
+# define AV_NE(be, le) (be)
+#else
+# define AV_NE(be, le) (le)
+#endif
+
+//rounded division & shift
+#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
+/* assume b>0 */
+#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
+#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
+#define FFSIGN(a) ((a) > 0 ? 1 : -1)
+
+#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
+#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
+#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
+#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
+
+#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
+#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
+
+/* misc math functions */
+
+#if FF_API_AV_REVERSE
+extern attribute_deprecated const uint8_t av_reverse[256];
+#endif
+
+#ifdef HAVE_AV_CONFIG_H
+# include "config.h"
+# include "intmath.h"
+#endif
+
+/* Pull in unguarded fallback defines at the end of this file. */
+#include "common.h"
+
+#ifndef av_log2
+av_const int av_log2(unsigned v);
+#endif
+
+#ifndef av_log2_16bit
+av_const int av_log2_16bit(unsigned v);
+#endif
+
+/**
+ * Clip a signed integer value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
+{
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-255 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
+{
+ if (a&(~0xFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -128,127 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int8_t av_clip_int8_c(int a)
+{
+ if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-65535 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
+{
+ if (a&(~0xFFFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -32768,32767 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int16_t av_clip_int16_c(int a)
+{
+ if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
+ else return a;
+}
+
+/**
+ * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
+{
+ if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;
+ else return a;
+}
+
+/**
+ * Clip a signed integer to an unsigned power of two range.
+ * @param a value to clip
+ * @param p bit position to clip at
+ * @return clipped value
+ */
+static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
+{
+ if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1);
+ else return a;
+}
+
+/**
+ * Add two signed 32-bit values with saturation.
+ *
+ * @param a one value
+ * @param b another value
+ * @return sum with signed saturation
+ */
+static av_always_inline int av_sat_add32_c(int a, int b)
+{
+ return av_clipl_int32((int64_t)a + b);
+}
+
+/**
+ * Add a doubled value to another value with saturation at both stages.
+ *
+ * @param a first value
+ * @param b value doubled and added to a
+ * @return sum with signed saturation
+ */
+static av_always_inline int av_sat_dadd32_c(int a, int b)
+{
+ return av_sat_add32(a, av_sat_add32(b, b));
+}
+
+/**
+ * Clip a float value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
+{
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/** Compute ceil(log2(x)).
+ * @param x value used to compute ceil(log2(x))
+ * @return computed ceiling of log2(x)
+ */
+static av_always_inline av_const int av_ceil_log2_c(int x)
+{
+ return av_log2((x - 1) << 1);
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount_c(uint32_t x)
+{
+ x -= (x >> 1) & 0x55555555;
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+ x = (x + (x >> 4)) & 0x0F0F0F0F;
+ x += x >> 8;
+ return (x + (x >> 16)) & 0x3F;
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount64_c(uint64_t x)
+{
+ return av_popcount(x) + av_popcount(x >> 32);
+}
+
+#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
+#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
+
+/**
+ * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_BYTE Expression reading one byte from the input.
+ * Evaluated up to 7 times (4 for the currently
+ * assigned Unicode range). With a memory buffer
+ * input, this could be *ptr++.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF8(val, GET_BYTE, ERROR)\
+ val= GET_BYTE;\
+ {\
+ uint32_t top = (val & 128) >> 1;\
+ if ((val & 0xc0) == 0x80)\
+ ERROR\
+ while (val & top) {\
+ int tmp= GET_BYTE - 128;\
+ if(tmp>>6)\
+ ERROR\
+ val= (val<<6) + tmp;\
+ top <<= 5;\
+ }\
+ val &= (top << 1) - 1;\
+ }
+
+/**
+ * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
+ * to native byte order. Evaluated one or two times.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF16(val, GET_16BIT, ERROR)\
+ val = GET_16BIT;\
+ {\
+ unsigned int hi = val - 0xD800;\
+ if (hi < 0x800) {\
+ val = GET_16BIT - 0xDC00;\
+ if (val > 0x3FFU || hi > 0x3FFU)\
+ ERROR\
+ val += (hi<<10) + 0x10000;\
+ }\
+ }\
+
+/**
+ * @def PUT_UTF8(val, tmp, PUT_BYTE)
+ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint8_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_BYTE.
+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
+ * It could be a function or a statement, and uses tmp as the input byte.
+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
+ * executed up to 4 times for values in the valid UTF-8 range and up to
+ * 7 times in the general case, depending on the length of the converted
+ * Unicode character.
+ */
+#define PUT_UTF8(val, tmp, PUT_BYTE)\
+ {\
+ int bytes, shift;\
+ uint32_t in = val;\
+ if (in < 0x80) {\
+ tmp = in;\
+ PUT_BYTE\
+ } else {\
+ bytes = (av_log2(in) + 4) / 5;\
+ shift = (bytes - 1) * 6;\
+ tmp = (256 - (256 >> bytes)) | (in >> shift);\
+ PUT_BYTE\
+ while (shift >= 6) {\
+ shift -= 6;\
+ tmp = 0x80 | ((in >> shift) & 0x3f);\
+ PUT_BYTE\
+ }\
+ }\
+ }
+
+/**
+ * @def PUT_UTF16(val, tmp, PUT_16BIT)
+ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint16_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_16BIT.
+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
+ * in desired endianness. It could be a function or a statement, and uses tmp
+ * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;"
+ * PUT_BYTE will be executed 1 or 2 times depending on input character.
+ */
+#define PUT_UTF16(val, tmp, PUT_16BIT)\
+ {\
+ uint32_t in = val;\
+ if (in < 0x10000) {\
+ tmp = in;\
+ PUT_16BIT\
+ } else {\
+ tmp = 0xD800 | ((in - 0x10000) >> 10);\
+ PUT_16BIT\
+ tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
+ PUT_16BIT\
+ }\
+ }\
+
+
+
+#include "mem.h"
+
+#ifdef HAVE_AV_CONFIG_H
+# include "internal.h"
+#endif /* HAVE_AV_CONFIG_H */
+
+#endif /* AVUTIL_COMMON_H */
+
+/*
+ * The following definitions are outside the multiple inclusion guard
+ * to ensure they are immediately available in intmath.h.
+ */
+
+#ifndef av_ceil_log2
+# define av_ceil_log2 av_ceil_log2_c
+#endif
+#ifndef av_clip
+# define av_clip av_clip_c
+#endif
+#ifndef av_clip_uint8
+# define av_clip_uint8 av_clip_uint8_c
+#endif
+#ifndef av_clip_int8
+# define av_clip_int8 av_clip_int8_c
+#endif
+#ifndef av_clip_uint16
+# define av_clip_uint16 av_clip_uint16_c
+#endif
+#ifndef av_clip_int16
+# define av_clip_int16 av_clip_int16_c
+#endif
+#ifndef av_clipl_int32
+# define av_clipl_int32 av_clipl_int32_c
+#endif
+#ifndef av_clip_uintp2
+# define av_clip_uintp2 av_clip_uintp2_c
+#endif
+#ifndef av_sat_add32
+# define av_sat_add32 av_sat_add32_c
+#endif
+#ifndef av_sat_dadd32
+# define av_sat_dadd32 av_sat_dadd32_c
+#endif
+#ifndef av_clipf
+# define av_clipf av_clipf_c
+#endif
+#ifndef av_popcount
+# define av_popcount av_popcount_c
+#endif
+#ifndef av_popcount64
+# define av_popcount64 av_popcount64_c
+#endif
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/cpu.h
new file mode 100644
index 000000000..4929512c6
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/cpu.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CPU_H
+#define AVUTIL_CPU_H
+
+#include "version.h"
+
+#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */
+
+ /* lower 16 bits - CPU features */
+#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX
+#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext
+#if FF_API_CPU_FLAG_MMX2
+#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext
+#endif
+#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW
+#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions
+#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions
+#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster
+#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt
+#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions
+#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster
+#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions
+#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower
+#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions
+#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions
+#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
+#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions
+#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions
+#define AV_CPU_FLAG_CMOV 0x1000 ///< i686 cmov
+
+#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard
+
+#define AV_CPU_FLAG_ARMV5TE (1 << 0)
+#define AV_CPU_FLAG_ARMV6 (1 << 1)
+#define AV_CPU_FLAG_ARMV6T2 (1 << 2)
+#define AV_CPU_FLAG_VFP (1 << 3)
+#define AV_CPU_FLAG_VFPV3 (1 << 4)
+#define AV_CPU_FLAG_NEON (1 << 5)
+
+/**
+ * Return the flags which specify extensions supported by the CPU.
+ */
+int av_get_cpu_flags(void);
+
+/**
+ * Set a mask on flags returned by av_get_cpu_flags().
+ * This function is mainly useful for testing.
+ *
+ * @warning this function is not thread safe.
+ */
+void av_set_cpu_flags_mask(int mask);
+
+/**
+ * Parse CPU flags from a string.
+ *
+ * @return a combination of AV_CPU_* flags, negative on error.
+ */
+int av_parse_cpu_flags(const char *s);
+
+/* The following CPU-specific functions shall not be called directly. */
+int ff_get_cpu_flags_arm(void);
+int ff_get_cpu_flags_ppc(void);
+int ff_get_cpu_flags_x86(void);
+
+#endif /* AVUTIL_CPU_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/crc.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/crc.h
new file mode 100644
index 000000000..0540619d2
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/crc.h
@@ -0,0 +1,74 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CRC_H
+#define AVUTIL_CRC_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include "attributes.h"
+
+typedef uint32_t AVCRC;
+
+typedef enum {
+ AV_CRC_8_ATM,
+ AV_CRC_16_ANSI,
+ AV_CRC_16_CCITT,
+ AV_CRC_32_IEEE,
+ AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */
+ AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */
+}AVCRCId;
+
+/**
+ * Initialize a CRC table.
+ * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024
+ * @param le If 1, the lowest bit represents the coefficient for the highest
+ * exponent of the corresponding polynomial (both for poly and
+ * actual CRC).
+ * If 0, you must swap the CRC parameter and the result of av_crc
+ * if you need the standard representation (can be simplified in
+ * most cases to e.g. bswap16):
+ * av_bswap32(crc << (32-bits))
+ * @param bits number of bits for the CRC
+ * @param poly generator polynomial without the x**bits coefficient, in the
+ * representation as specified by le
+ * @param ctx_size size of ctx in bytes
+ * @return <0 on failure
+ */
+int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size);
+
+/**
+ * Get an initialized standard CRC table.
+ * @param crc_id ID of a standard CRC
+ * @return a pointer to the CRC table or NULL on failure
+ */
+const AVCRC *av_crc_get_table(AVCRCId crc_id);
+
+/**
+ * Calculate the CRC of a block.
+ * @param crc CRC of previous blocks if any or initial value for CRC
+ * @return CRC updated with the data from the given block
+ *
+ * @see av_crc_init() "le" parameter
+ */
+uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
+ const uint8_t *buffer, size_t length) av_pure;
+
+#endif /* AVUTIL_CRC_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/dict.h
new file mode 100644
index 000000000..492da9a41
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/dict.h
@@ -0,0 +1,129 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Public dictionary API.
+ */
+
+#ifndef AVUTIL_DICT_H
+#define AVUTIL_DICT_H
+
+/**
+ * @addtogroup lavu_dict AVDictionary
+ * @ingroup lavu_data
+ *
+ * @brief Simple key:value store
+ *
+ * @{
+ * Dictionaries are used for storing key:value pairs. To create
+ * an AVDictionary, simply pass an address of a NULL pointer to
+ * av_dict_set(). NULL can be used as an empty dictionary wherever
+ * a pointer to an AVDictionary is required.
+ * Use av_dict_get() to retrieve an entry or iterate over all
+ * entries and finally av_dict_free() to free the dictionary
+ * and all its contents.
+ *
+ * @code
+ * AVDictionary *d = NULL; // "create" an empty dictionary
+ * av_dict_set(&d, "foo", "bar", 0); // add an entry
+ *
+ * char *k = av_strdup("key"); // if your strings are already allocated,
+ * char *v = av_strdup("value"); // you can avoid copying them like this
+ * av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
+ *
+ * AVDictionaryEntry *t = NULL;
+ * while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ * <....> // iterate over all entries in d
+ * }
+ *
+ * av_dict_free(&d);
+ * @endcode
+ *
+ */
+
+#define AV_DICT_MATCH_CASE 1
+#define AV_DICT_IGNORE_SUFFIX 2
+#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been
+ allocated with av_malloc() and children. */
+#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been
+ allocated with av_malloc() and chilren. */
+#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries.
+#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no
+ delimiter is added, the strings are simply concatenated. */
+
+typedef struct AVDictionaryEntry {
+ char *key;
+ char *value;
+} AVDictionaryEntry;
+
+typedef struct AVDictionary AVDictionary;
+
+/**
+ * Get a dictionary entry with matching key.
+ *
+ * @param prev Set to the previous matching element to find the next.
+ * If set to NULL the first matching element is returned.
+ * @param flags Allows case as well as suffix-insensitive comparisons.
+ * @return Found entry or NULL, changing key or value leads to undefined behavior.
+ */
+AVDictionaryEntry *
+av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags);
+
+/**
+ * Get number of entries in dictionary.
+ *
+ * @param m dictionary
+ * @return number of entries in dictionary
+ */
+int av_dict_count(const AVDictionary *m);
+
+/**
+ * Set the given entry in *pm, overwriting an existing entry.
+ *
+ * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL
+ * a dictionary struct is allocated and put in *pm.
+ * @param key entry key to add to *pm (will be av_strduped depending on flags)
+ * @param value entry value to add to *pm (will be av_strduped depending on flags).
+ * Passing a NULL value will cause an existing entry to be deleted.
+ * @return >= 0 on success otherwise an error code <0
+ */
+int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
+
+/**
+ * Copy entries from one AVDictionary struct into another.
+ * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL,
+ * this function will allocate a struct for you and put it in *dst
+ * @param src pointer to source AVDictionary struct
+ * @param flags flags to use when setting entries in *dst
+ * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag
+ */
+void av_dict_copy(AVDictionary **dst, AVDictionary *src, int flags);
+
+/**
+ * Free all the memory allocated for an AVDictionary struct
+ * and all keys and values.
+ */
+void av_dict_free(AVDictionary **m);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_DICT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/error.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/error.h
new file mode 100644
index 000000000..3dfd8807f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/error.h
@@ -0,0 +1,83 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * error code definitions
+ */
+
+#ifndef AVUTIL_ERROR_H
+#define AVUTIL_ERROR_H
+
+#include <errno.h>
+#include <stddef.h>
+#include "avutil.h"
+
+/**
+ * @addtogroup lavu_error
+ *
+ * @{
+ */
+
+
+/* error handling */
+#if EDOM > 0
+#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions.
+#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
+#else
+/* Some platforms have E* and errno already negated. */
+#define AVERROR(e) (e)
+#define AVUNERROR(e) (e)
+#endif
+
+#define AVERROR_BSF_NOT_FOUND (-0x39acbd08) ///< Bitstream filter not found
+#define AVERROR_DECODER_NOT_FOUND (-0x3cbabb08) ///< Decoder not found
+#define AVERROR_DEMUXER_NOT_FOUND (-0x32babb08) ///< Demuxer not found
+#define AVERROR_ENCODER_NOT_FOUND (-0x3cb1ba08) ///< Encoder not found
+#define AVERROR_EOF (-0x5fb9b0bb) ///< End of file
+#define AVERROR_EXIT (-0x2bb6a7bb) ///< Immediate exit was requested; the called function should not be restarted
+#define AVERROR_FILTER_NOT_FOUND (-0x33b6b908) ///< Filter not found
+#define AVERROR_INVALIDDATA (-0x3ebbb1b7) ///< Invalid data found when processing input
+#define AVERROR_MUXER_NOT_FOUND (-0x27aab208) ///< Muxer not found
+#define AVERROR_OPTION_NOT_FOUND (-0x2bafb008) ///< Option not found
+#define AVERROR_PATCHWELCOME (-0x3aa8beb0) ///< Not yet implemented in Libav, patches welcome
+#define AVERROR_PROTOCOL_NOT_FOUND (-0x30adaf08) ///< Protocol not found
+#define AVERROR_STREAM_NOT_FOUND (-0x2dabac08) ///< Stream not found
+#define AVERROR_BUG (-0x5fb8aabe) ///< Bug detected, please report the issue
+#define AVERROR_UNKNOWN (-0x31b4b1ab) ///< Unknown error, typically from an external library
+#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
+
+/**
+ * Put a description of the AVERROR code errnum in errbuf.
+ * In case of failure the global variable errno is set to indicate the
+ * error. Even in case of failure av_strerror() will print a generic
+ * error message indicating the errnum provided to errbuf.
+ *
+ * @param errnum error code to describe
+ * @param errbuf buffer to which description is written
+ * @param errbuf_size the size in bytes of errbuf
+ * @return 0 on success, a negative value if a description for errnum
+ * cannot be found
+ */
+int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_ERROR_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/eval.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/eval.h
new file mode 100644
index 000000000..ccb29e7a3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/eval.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * simple arithmetic expression evaluator
+ */
+
+#ifndef AVUTIL_EVAL_H
+#define AVUTIL_EVAL_H
+
+#include "avutil.h"
+
+typedef struct AVExpr AVExpr;
+
+/**
+ * Parse and evaluate an expression.
+ * Note, this is significantly slower than av_expr_eval().
+ *
+ * @param res a pointer to a double where is put the result value of
+ * the expression, or NAN in case of error
+ * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
+ * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
+ * @param const_values a zero terminated array of values for the identifiers from const_names
+ * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers
+ * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument
+ * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers
+ * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments
+ * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
+ * @param log_ctx parent logging context
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_expr_parse_and_eval(double *res, const char *s,
+ const char * const *const_names, const double *const_values,
+ const char * const *func1_names, double (* const *funcs1)(void *, double),
+ const char * const *func2_names, double (* const *funcs2)(void *, double, double),
+ void *opaque, int log_offset, void *log_ctx);
+
+/**
+ * Parse an expression.
+ *
+ * @param expr a pointer where is put an AVExpr containing the parsed
+ * value in case of successful parsing, or NULL otherwise.
+ * The pointed to AVExpr must be freed with av_expr_free() by the user
+ * when it is not needed anymore.
+ * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
+ * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
+ * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers
+ * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument
+ * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers
+ * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments
+ * @param log_ctx parent logging context
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_expr_parse(AVExpr **expr, const char *s,
+ const char * const *const_names,
+ const char * const *func1_names, double (* const *funcs1)(void *, double),
+ const char * const *func2_names, double (* const *funcs2)(void *, double, double),
+ int log_offset, void *log_ctx);
+
+/**
+ * Evaluate a previously parsed expression.
+ *
+ * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names
+ * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
+ * @return the value of the expression
+ */
+double av_expr_eval(AVExpr *e, const double *const_values, void *opaque);
+
+/**
+ * Free a parsed expression previously created with av_expr_parse().
+ */
+void av_expr_free(AVExpr *e);
+
+/**
+ * Parse the string in numstr and return its value as a double. If
+ * the string is empty, contains only whitespaces, or does not contain
+ * an initial substring that has the expected syntax for a
+ * floating-point number, no conversion is performed. In this case,
+ * returns a value of zero and the value returned in tail is the value
+ * of numstr.
+ *
+ * @param numstr a string representing a number, may contain one of
+ * the International System number postfixes, for example 'K', 'M',
+ * 'G'. If 'i' is appended after the postfix, powers of 2 are used
+ * instead of powers of 10. The 'B' postfix multiplies the value for
+ * 8, and can be appended after another postfix or used alone. This
+ * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix.
+ * @param tail if non-NULL puts here the pointer to the char next
+ * after the last parsed character
+ */
+double av_strtod(const char *numstr, char **tail);
+
+#endif /* AVUTIL_EVAL_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/fifo.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/fifo.h
new file mode 100644
index 000000000..ea30f5d2b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/fifo.h
@@ -0,0 +1,131 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * a very simple circular buffer FIFO implementation
+ */
+
+#ifndef AVUTIL_FIFO_H
+#define AVUTIL_FIFO_H
+
+#include <stdint.h>
+#include "avutil.h"
+#include "attributes.h"
+
+typedef struct AVFifoBuffer {
+ uint8_t *buffer;
+ uint8_t *rptr, *wptr, *end;
+ uint32_t rndx, wndx;
+} AVFifoBuffer;
+
+/**
+ * Initialize an AVFifoBuffer.
+ * @param size of FIFO
+ * @return AVFifoBuffer or NULL in case of memory allocation failure
+ */
+AVFifoBuffer *av_fifo_alloc(unsigned int size);
+
+/**
+ * Free an AVFifoBuffer.
+ * @param f AVFifoBuffer to free
+ */
+void av_fifo_free(AVFifoBuffer *f);
+
+/**
+ * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied.
+ * @param f AVFifoBuffer to reset
+ */
+void av_fifo_reset(AVFifoBuffer *f);
+
+/**
+ * Return the amount of data in bytes in the AVFifoBuffer, that is the
+ * amount of data you can read from it.
+ * @param f AVFifoBuffer to read from
+ * @return size
+ */
+int av_fifo_size(AVFifoBuffer *f);
+
+/**
+ * Return the amount of space in bytes in the AVFifoBuffer, that is the
+ * amount of data you can write into it.
+ * @param f AVFifoBuffer to write into
+ * @return size
+ */
+int av_fifo_space(AVFifoBuffer *f);
+
+/**
+ * Feed data from an AVFifoBuffer to a user-supplied callback.
+ * @param f AVFifoBuffer to read from
+ * @param buf_size number of bytes to read
+ * @param func generic read function
+ * @param dest data destination
+ */
+int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
+
+/**
+ * Feed data from a user-supplied callback to an AVFifoBuffer.
+ * @param f AVFifoBuffer to write to
+ * @param src data source; non-const since it may be used as a
+ * modifiable context by the function defined in func
+ * @param size number of bytes to write
+ * @param func generic write function; the first parameter is src,
+ * the second is dest_buf, the third is dest_buf_size.
+ * func must return the number of bytes written to dest_buf, or <= 0 to
+ * indicate no more data available to write.
+ * If func is NULL, src is interpreted as a simple byte array for source data.
+ * @return the number of bytes written to the FIFO
+ */
+int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int));
+
+/**
+ * Resize an AVFifoBuffer.
+ * @param f AVFifoBuffer to resize
+ * @param size new AVFifoBuffer size in bytes
+ * @return <0 for failure, >=0 otherwise
+ */
+int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
+
+/**
+ * Read and discard the specified amount of data from an AVFifoBuffer.
+ * @param f AVFifoBuffer to read from
+ * @param size amount of data to read in bytes
+ */
+void av_fifo_drain(AVFifoBuffer *f, int size);
+
+/**
+ * Return a pointer to the data stored in a FIFO buffer at a certain offset.
+ * The FIFO buffer is not modified.
+ *
+ * @param f AVFifoBuffer to peek at, f must be non-NULL
+ * @param offs an offset in bytes, its absolute value must be less
+ * than the used buffer size or the returned pointer will
+ * point outside to the buffer data.
+ * The used buffer size can be checked with av_fifo_size().
+ */
+static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs)
+{
+ uint8_t *ptr = f->rptr + offs;
+ if (ptr >= f->end)
+ ptr = f->buffer + (ptr - f->end);
+ else if (ptr < f->buffer)
+ ptr = f->end - (f->buffer - ptr);
+ return ptr;
+}
+
+#endif /* AVUTIL_FIFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/file.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/file.h
new file mode 100644
index 000000000..e3f02a830
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/file.h
@@ -0,0 +1,54 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_FILE_H
+#define AVUTIL_FILE_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+
+/**
+ * @file
+ * Misc file utilities.
+ */
+
+/**
+ * Read the file with name filename, and put its content in a newly
+ * allocated buffer or map it with mmap() when available.
+ * In case of success set *bufptr to the read or mmapped buffer, and
+ * *size to the size in bytes of the buffer in *bufptr.
+ * The returned buffer must be released with av_file_unmap().
+ *
+ * @param log_offset loglevel offset used for logging
+ * @param log_ctx context used for logging
+ * @return a non negative number in case of success, a negative value
+ * corresponding to an AVERROR error code in case of failure
+ */
+int av_file_map(const char *filename, uint8_t **bufptr, size_t *size,
+ int log_offset, void *log_ctx);
+
+/**
+ * Unmap or free the buffer bufptr created by av_file_map().
+ *
+ * @param size size in bytes of bufptr, must be the same as returned
+ * by av_file_map()
+ */
+void av_file_unmap(uint8_t *bufptr, size_t size);
+
+#endif /* AVUTIL_FILE_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/imgutils.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/imgutils.h
new file mode 100644
index 000000000..71510132a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/imgutils.h
@@ -0,0 +1,138 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_IMGUTILS_H
+#define AVUTIL_IMGUTILS_H
+
+/**
+ * @file
+ * misc image utilities
+ *
+ * @addtogroup lavu_picture
+ * @{
+ */
+
+#include "avutil.h"
+#include "pixdesc.h"
+
+/**
+ * Compute the max pixel step for each plane of an image with a
+ * format described by pixdesc.
+ *
+ * The pixel step is the distance in bytes between the first byte of
+ * the group of bytes which describe a pixel component and the first
+ * byte of the successive group in the same plane for the same
+ * component.
+ *
+ * @param max_pixsteps an array which is filled with the max pixel step
+ * for each plane. Since a plane may contain different pixel
+ * components, the computed max_pixsteps[plane] is relative to the
+ * component in the plane with the max pixel step.
+ * @param max_pixstep_comps an array which is filled with the component
+ * for each plane which has the max pixel step. May be NULL.
+ */
+void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4],
+ const AVPixFmtDescriptor *pixdesc);
+
+/**
+ * Compute the size of an image line with format pix_fmt and width
+ * width for the plane plane.
+ *
+ * @return the computed size in bytes
+ */
+int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane);
+
+/**
+ * Fill plane linesizes for an image with pixel format pix_fmt and
+ * width width.
+ *
+ * @param linesizes array to be filled with the linesize for each plane
+ * @return >= 0 in case of success, a negative error code otherwise
+ */
+int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width);
+
+/**
+ * Fill plane data pointers for an image with pixel format pix_fmt and
+ * height height.
+ *
+ * @param data pointers array to be filled with the pointer for each image plane
+ * @param ptr the pointer to a buffer which will contain the image
+ * @param linesizes the array containing the linesize for each
+ * plane, should be filled by av_image_fill_linesizes()
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height,
+ uint8_t *ptr, const int linesizes[4]);
+
+/**
+ * Allocate an image with size w and h and pixel format pix_fmt, and
+ * fill pointers and linesizes accordingly.
+ * The allocated image buffer has to be freed by using
+ * av_freep(&pointers[0]).
+ *
+ * @param align the value to use for buffer size alignment
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+ int w, int h, enum AVPixelFormat pix_fmt, int align);
+
+/**
+ * Copy image plane from src to dst.
+ * That is, copy "height" number of lines of "bytewidth" bytes each.
+ * The first byte of each successive line is separated by *_linesize
+ * bytes.
+ *
+ * @param dst_linesize linesize for the image plane in dst
+ * @param src_linesize linesize for the image plane in src
+ */
+void av_image_copy_plane(uint8_t *dst, int dst_linesize,
+ const uint8_t *src, int src_linesize,
+ int bytewidth, int height);
+
+/**
+ * Copy image in src_data to dst_data.
+ *
+ * @param dst_linesizes linesizes for the image in dst_data
+ * @param src_linesizes linesizes for the image in src_data
+ */
+void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
+ const uint8_t *src_data[4], const int src_linesizes[4],
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Check if the given dimension of an image is valid, meaning that all
+ * bytes of the image can be addressed with a signed int.
+ *
+ * @param w the width of the picture
+ * @param h the height of the picture
+ * @param log_offset the offset to sum to the log level for logging with log_ctx
+ * @param log_ctx the parent logging context, it may be NULL
+ * @return >= 0 if valid, a negative error code otherwise
+ */
+int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);
+
+int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt);
+
+/**
+ * @}
+ */
+
+
+#endif /* AVUTIL_IMGUTILS_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat.h
new file mode 100644
index 000000000..38d26ad87
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2011 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_H
+#define AVUTIL_INTFLOAT_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+union av_intfloat32 {
+ uint32_t i;
+ float f;
+};
+
+union av_intfloat64 {
+ uint64_t i;
+ double f;
+};
+
+/**
+ * Reinterpret a 32-bit integer as a float.
+ */
+static av_always_inline float av_int2float(uint32_t i)
+{
+ union av_intfloat32 v;
+ v.i = i;
+ return v.f;
+}
+
+/**
+ * Reinterpret a float as a 32-bit integer.
+ */
+static av_always_inline uint32_t av_float2int(float f)
+{
+ union av_intfloat32 v;
+ v.f = f;
+ return v.i;
+}
+
+/**
+ * Reinterpret a 64-bit integer as a double.
+ */
+static av_always_inline double av_int2double(uint64_t i)
+{
+ union av_intfloat64 v;
+ v.i = i;
+ return v.f;
+}
+
+/**
+ * Reinterpret a double as a 64-bit integer.
+ */
+static av_always_inline uint64_t av_double2int(double f)
+{
+ union av_intfloat64 v;
+ v.f = f;
+ return v.i;
+}
+
+#endif /* AVUTIL_INTFLOAT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat_readwrite.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat_readwrite.h
new file mode 100644
index 000000000..f093b92cd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/intfloat_readwrite.h
@@ -0,0 +1,40 @@
+/*
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_READWRITE_H
+#define AVUTIL_INTFLOAT_READWRITE_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+/* IEEE 80 bits extended float */
+typedef struct AVExtFloat {
+ uint8_t exponent[2];
+ uint8_t mantissa[8];
+} AVExtFloat;
+
+attribute_deprecated double av_int2dbl(int64_t v) av_const;
+attribute_deprecated float av_int2flt(int32_t v) av_const;
+attribute_deprecated double av_ext2dbl(const AVExtFloat ext) av_const;
+attribute_deprecated int64_t av_dbl2int(double d) av_const;
+attribute_deprecated int32_t av_flt2int(float d) av_const;
+attribute_deprecated AVExtFloat av_dbl2ext(double d) av_const;
+
+#endif /* AVUTIL_INTFLOAT_READWRITE_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/intreadwrite.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/intreadwrite.h
new file mode 100644
index 000000000..f77fd60f3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/intreadwrite.h
@@ -0,0 +1,549 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTREADWRITE_H
+#define AVUTIL_INTREADWRITE_H
+
+#include <stdint.h>
+#include "libavutil/avconfig.h"
+#include "attributes.h"
+#include "bswap.h"
+
+typedef union {
+ uint64_t u64;
+ uint32_t u32[2];
+ uint16_t u16[4];
+ uint8_t u8 [8];
+ double f64;
+ float f32[2];
+} av_alias av_alias64;
+
+typedef union {
+ uint32_t u32;
+ uint16_t u16[2];
+ uint8_t u8 [4];
+ float f32;
+} av_alias av_alias32;
+
+typedef union {
+ uint16_t u16;
+ uint8_t u8 [2];
+} av_alias av_alias16;
+
+/*
+ * Arch-specific headers can provide any combination of
+ * AV_[RW][BLN](16|24|32|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.
+ * Preprocessor symbols must be defined, even if these are implemented
+ * as inline functions.
+ */
+
+#ifdef HAVE_AV_CONFIG_H
+
+#include "config.h"
+
+#if ARCH_ARM
+# include "arm/intreadwrite.h"
+#elif ARCH_AVR32
+# include "avr32/intreadwrite.h"
+#elif ARCH_MIPS
+# include "mips/intreadwrite.h"
+#elif ARCH_PPC
+# include "ppc/intreadwrite.h"
+#elif ARCH_TOMI
+# include "tomi/intreadwrite.h"
+#elif ARCH_X86
+# include "x86/intreadwrite.h"
+#endif
+
+#endif /* HAVE_AV_CONFIG_H */
+
+/*
+ * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
+ */
+
+#if AV_HAVE_BIGENDIAN
+
+# if defined(AV_RN16) && !defined(AV_RB16)
+# define AV_RB16(p) AV_RN16(p)
+# elif !defined(AV_RN16) && defined(AV_RB16)
+# define AV_RN16(p) AV_RB16(p)
+# endif
+
+# if defined(AV_WN16) && !defined(AV_WB16)
+# define AV_WB16(p, v) AV_WN16(p, v)
+# elif !defined(AV_WN16) && defined(AV_WB16)
+# define AV_WN16(p, v) AV_WB16(p, v)
+# endif
+
+# if defined(AV_RN24) && !defined(AV_RB24)
+# define AV_RB24(p) AV_RN24(p)
+# elif !defined(AV_RN24) && defined(AV_RB24)
+# define AV_RN24(p) AV_RB24(p)
+# endif
+
+# if defined(AV_WN24) && !defined(AV_WB24)
+# define AV_WB24(p, v) AV_WN24(p, v)
+# elif !defined(AV_WN24) && defined(AV_WB24)
+# define AV_WN24(p, v) AV_WB24(p, v)
+# endif
+
+# if defined(AV_RN32) && !defined(AV_RB32)
+# define AV_RB32(p) AV_RN32(p)
+# elif !defined(AV_RN32) && defined(AV_RB32)
+# define AV_RN32(p) AV_RB32(p)
+# endif
+
+# if defined(AV_WN32) && !defined(AV_WB32)
+# define AV_WB32(p, v) AV_WN32(p, v)
+# elif !defined(AV_WN32) && defined(AV_WB32)
+# define AV_WN32(p, v) AV_WB32(p, v)
+# endif
+
+# if defined(AV_RN64) && !defined(AV_RB64)
+# define AV_RB64(p) AV_RN64(p)
+# elif !defined(AV_RN64) && defined(AV_RB64)
+# define AV_RN64(p) AV_RB64(p)
+# endif
+
+# if defined(AV_WN64) && !defined(AV_WB64)
+# define AV_WB64(p, v) AV_WN64(p, v)
+# elif !defined(AV_WN64) && defined(AV_WB64)
+# define AV_WN64(p, v) AV_WB64(p, v)
+# endif
+
+#else /* AV_HAVE_BIGENDIAN */
+
+# if defined(AV_RN16) && !defined(AV_RL16)
+# define AV_RL16(p) AV_RN16(p)
+# elif !defined(AV_RN16) && defined(AV_RL16)
+# define AV_RN16(p) AV_RL16(p)
+# endif
+
+# if defined(AV_WN16) && !defined(AV_WL16)
+# define AV_WL16(p, v) AV_WN16(p, v)
+# elif !defined(AV_WN16) && defined(AV_WL16)
+# define AV_WN16(p, v) AV_WL16(p, v)
+# endif
+
+# if defined(AV_RN24) && !defined(AV_RL24)
+# define AV_RL24(p) AV_RN24(p)
+# elif !defined(AV_RN24) && defined(AV_RL24)
+# define AV_RN24(p) AV_RL24(p)
+# endif
+
+# if defined(AV_WN24) && !defined(AV_WL24)
+# define AV_WL24(p, v) AV_WN24(p, v)
+# elif !defined(AV_WN24) && defined(AV_WL24)
+# define AV_WN24(p, v) AV_WL24(p, v)
+# endif
+
+# if defined(AV_RN32) && !defined(AV_RL32)
+# define AV_RL32(p) AV_RN32(p)
+# elif !defined(AV_RN32) && defined(AV_RL32)
+# define AV_RN32(p) AV_RL32(p)
+# endif
+
+# if defined(AV_WN32) && !defined(AV_WL32)
+# define AV_WL32(p, v) AV_WN32(p, v)
+# elif !defined(AV_WN32) && defined(AV_WL32)
+# define AV_WN32(p, v) AV_WL32(p, v)
+# endif
+
+# if defined(AV_RN64) && !defined(AV_RL64)
+# define AV_RL64(p) AV_RN64(p)
+# elif !defined(AV_RN64) && defined(AV_RL64)
+# define AV_RN64(p) AV_RL64(p)
+# endif
+
+# if defined(AV_WN64) && !defined(AV_WL64)
+# define AV_WL64(p, v) AV_WN64(p, v)
+# elif !defined(AV_WN64) && defined(AV_WL64)
+# define AV_WN64(p, v) AV_WL64(p, v)
+# endif
+
+#endif /* !AV_HAVE_BIGENDIAN */
+
+/*
+ * Define AV_[RW]N helper macros to simplify definitions not provided
+ * by per-arch headers.
+ */
+
+#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__)
+
+union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;
+union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;
+union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
+
+# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l)
+# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v))
+
+#elif defined(__DECC)
+
+# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))
+# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v))
+
+#elif AV_HAVE_FAST_UNALIGNED
+
+# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s)
+# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v))
+
+#else
+
+#ifndef AV_RB16
+# define AV_RB16(x) \
+ ((((const uint8_t*)(x))[0] << 8) | \
+ ((const uint8_t*)(x))[1])
+#endif
+#ifndef AV_WB16
+# define AV_WB16(p, d) do { \
+ ((uint8_t*)(p))[1] = (d); \
+ ((uint8_t*)(p))[0] = (d)>>8; \
+ } while(0)
+#endif
+
+#ifndef AV_RL16
+# define AV_RL16(x) \
+ ((((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL16
+# define AV_WL16(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ } while(0)
+#endif
+
+#ifndef AV_RB32
+# define AV_RB32(x) \
+ (((uint32_t)((const uint8_t*)(x))[0] << 24) | \
+ (((const uint8_t*)(x))[1] << 16) | \
+ (((const uint8_t*)(x))[2] << 8) | \
+ ((const uint8_t*)(x))[3])
+#endif
+#ifndef AV_WB32
+# define AV_WB32(p, d) do { \
+ ((uint8_t*)(p))[3] = (d); \
+ ((uint8_t*)(p))[2] = (d)>>8; \
+ ((uint8_t*)(p))[1] = (d)>>16; \
+ ((uint8_t*)(p))[0] = (d)>>24; \
+ } while(0)
+#endif
+
+#ifndef AV_RL32
+# define AV_RL32(x) \
+ (((uint32_t)((const uint8_t*)(x))[3] << 24) | \
+ (((const uint8_t*)(x))[2] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL32
+# define AV_WL32(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ ((uint8_t*)(p))[3] = (d)>>24; \
+ } while(0)
+#endif
+
+#ifndef AV_RB64
+# define AV_RB64(x) \
+ (((uint64_t)((const uint8_t*)(x))[0] << 56) | \
+ ((uint64_t)((const uint8_t*)(x))[1] << 48) | \
+ ((uint64_t)((const uint8_t*)(x))[2] << 40) | \
+ ((uint64_t)((const uint8_t*)(x))[3] << 32) | \
+ ((uint64_t)((const uint8_t*)(x))[4] << 24) | \
+ ((uint64_t)((const uint8_t*)(x))[5] << 16) | \
+ ((uint64_t)((const uint8_t*)(x))[6] << 8) | \
+ (uint64_t)((const uint8_t*)(x))[7])
+#endif
+#ifndef AV_WB64
+# define AV_WB64(p, d) do { \
+ ((uint8_t*)(p))[7] = (d); \
+ ((uint8_t*)(p))[6] = (d)>>8; \
+ ((uint8_t*)(p))[5] = (d)>>16; \
+ ((uint8_t*)(p))[4] = (d)>>24; \
+ ((uint8_t*)(p))[3] = (d)>>32; \
+ ((uint8_t*)(p))[2] = (d)>>40; \
+ ((uint8_t*)(p))[1] = (d)>>48; \
+ ((uint8_t*)(p))[0] = (d)>>56; \
+ } while(0)
+#endif
+
+#ifndef AV_RL64
+# define AV_RL64(x) \
+ (((uint64_t)((const uint8_t*)(x))[7] << 56) | \
+ ((uint64_t)((const uint8_t*)(x))[6] << 48) | \
+ ((uint64_t)((const uint8_t*)(x))[5] << 40) | \
+ ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
+ ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
+ ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
+ ((uint64_t)((const uint8_t*)(x))[1] << 8) | \
+ (uint64_t)((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL64
+# define AV_WL64(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ ((uint8_t*)(p))[3] = (d)>>24; \
+ ((uint8_t*)(p))[4] = (d)>>32; \
+ ((uint8_t*)(p))[5] = (d)>>40; \
+ ((uint8_t*)(p))[6] = (d)>>48; \
+ ((uint8_t*)(p))[7] = (d)>>56; \
+ } while(0)
+#endif
+
+#if AV_HAVE_BIGENDIAN
+# define AV_RN(s, p) AV_RB##s(p)
+# define AV_WN(s, p, v) AV_WB##s(p, v)
+#else
+# define AV_RN(s, p) AV_RL##s(p)
+# define AV_WN(s, p, v) AV_WL##s(p, v)
+#endif
+
+#endif /* HAVE_FAST_UNALIGNED */
+
+#ifndef AV_RN16
+# define AV_RN16(p) AV_RN(16, p)
+#endif
+
+#ifndef AV_RN32
+# define AV_RN32(p) AV_RN(32, p)
+#endif
+
+#ifndef AV_RN64
+# define AV_RN64(p) AV_RN(64, p)
+#endif
+
+#ifndef AV_WN16
+# define AV_WN16(p, v) AV_WN(16, p, v)
+#endif
+
+#ifndef AV_WN32
+# define AV_WN32(p, v) AV_WN(32, p, v)
+#endif
+
+#ifndef AV_WN64
+# define AV_WN64(p, v) AV_WN(64, p, v)
+#endif
+
+#if AV_HAVE_BIGENDIAN
+# define AV_RB(s, p) AV_RN##s(p)
+# define AV_WB(s, p, v) AV_WN##s(p, v)
+# define AV_RL(s, p) av_bswap##s(AV_RN##s(p))
+# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v))
+#else
+# define AV_RB(s, p) av_bswap##s(AV_RN##s(p))
+# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v))
+# define AV_RL(s, p) AV_RN##s(p)
+# define AV_WL(s, p, v) AV_WN##s(p, v)
+#endif
+
+#define AV_RB8(x) (((const uint8_t*)(x))[0])
+#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
+
+#define AV_RL8(x) AV_RB8(x)
+#define AV_WL8(p, d) AV_WB8(p, d)
+
+#ifndef AV_RB16
+# define AV_RB16(p) AV_RB(16, p)
+#endif
+#ifndef AV_WB16
+# define AV_WB16(p, v) AV_WB(16, p, v)
+#endif
+
+#ifndef AV_RL16
+# define AV_RL16(p) AV_RL(16, p)
+#endif
+#ifndef AV_WL16
+# define AV_WL16(p, v) AV_WL(16, p, v)
+#endif
+
+#ifndef AV_RB32
+# define AV_RB32(p) AV_RB(32, p)
+#endif
+#ifndef AV_WB32
+# define AV_WB32(p, v) AV_WB(32, p, v)
+#endif
+
+#ifndef AV_RL32
+# define AV_RL32(p) AV_RL(32, p)
+#endif
+#ifndef AV_WL32
+# define AV_WL32(p, v) AV_WL(32, p, v)
+#endif
+
+#ifndef AV_RB64
+# define AV_RB64(p) AV_RB(64, p)
+#endif
+#ifndef AV_WB64
+# define AV_WB64(p, v) AV_WB(64, p, v)
+#endif
+
+#ifndef AV_RL64
+# define AV_RL64(p) AV_RL(64, p)
+#endif
+#ifndef AV_WL64
+# define AV_WL64(p, v) AV_WL(64, p, v)
+#endif
+
+#ifndef AV_RB24
+# define AV_RB24(x) \
+ ((((const uint8_t*)(x))[0] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[2])
+#endif
+#ifndef AV_WB24
+# define AV_WB24(p, d) do { \
+ ((uint8_t*)(p))[2] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[0] = (d)>>16; \
+ } while(0)
+#endif
+
+#ifndef AV_RL24
+# define AV_RL24(x) \
+ ((((const uint8_t*)(x))[2] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL24
+# define AV_WL24(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ } while(0)
+#endif
+
+/*
+ * The AV_[RW]NA macros access naturally aligned data
+ * in a type-safe way.
+ */
+
+#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s)
+#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v))
+
+#ifndef AV_RN16A
+# define AV_RN16A(p) AV_RNA(16, p)
+#endif
+
+#ifndef AV_RN32A
+# define AV_RN32A(p) AV_RNA(32, p)
+#endif
+
+#ifndef AV_RN64A
+# define AV_RN64A(p) AV_RNA(64, p)
+#endif
+
+#ifndef AV_WN16A
+# define AV_WN16A(p, v) AV_WNA(16, p, v)
+#endif
+
+#ifndef AV_WN32A
+# define AV_WN32A(p, v) AV_WNA(32, p, v)
+#endif
+
+#ifndef AV_WN64A
+# define AV_WN64A(p, v) AV_WNA(64, p, v)
+#endif
+
+/*
+ * The AV_COPYxxU macros are suitable for copying data to/from unaligned
+ * memory locations.
+ */
+
+#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s));
+
+#ifndef AV_COPY16U
+# define AV_COPY16U(d, s) AV_COPYU(16, d, s)
+#endif
+
+#ifndef AV_COPY32U
+# define AV_COPY32U(d, s) AV_COPYU(32, d, s)
+#endif
+
+#ifndef AV_COPY64U
+# define AV_COPY64U(d, s) AV_COPYU(64, d, s)
+#endif
+
+#ifndef AV_COPY128U
+# define AV_COPY128U(d, s) \
+ do { \
+ AV_COPY64U(d, s); \
+ AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \
+ } while(0)
+#endif
+
+/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
+ * naturally aligned. They may be implemented using MMX,
+ * so emms_c() must be called before using any float code
+ * afterwards.
+ */
+
+#define AV_COPY(n, d, s) \
+ (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)
+
+#ifndef AV_COPY16
+# define AV_COPY16(d, s) AV_COPY(16, d, s)
+#endif
+
+#ifndef AV_COPY32
+# define AV_COPY32(d, s) AV_COPY(32, d, s)
+#endif
+
+#ifndef AV_COPY64
+# define AV_COPY64(d, s) AV_COPY(64, d, s)
+#endif
+
+#ifndef AV_COPY128
+# define AV_COPY128(d, s) \
+ do { \
+ AV_COPY64(d, s); \
+ AV_COPY64((char*)(d)+8, (char*)(s)+8); \
+ } while(0)
+#endif
+
+#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b))
+
+#ifndef AV_SWAP64
+# define AV_SWAP64(a, b) AV_SWAP(64, a, b)
+#endif
+
+#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0)
+
+#ifndef AV_ZERO16
+# define AV_ZERO16(d) AV_ZERO(16, d)
+#endif
+
+#ifndef AV_ZERO32
+# define AV_ZERO32(d) AV_ZERO(32, d)
+#endif
+
+#ifndef AV_ZERO64
+# define AV_ZERO64(d) AV_ZERO(64, d)
+#endif
+
+#ifndef AV_ZERO128
+# define AV_ZERO128(d) \
+ do { \
+ AV_ZERO64(d); \
+ AV_ZERO64((char*)(d)+8); \
+ } while(0)
+#endif
+
+#endif /* AVUTIL_INTREADWRITE_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/lfg.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/lfg.h
new file mode 100644
index 000000000..5e526c1da
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/lfg.h
@@ -0,0 +1,62 @@
+/*
+ * Lagged Fibonacci PRNG
+ * Copyright (c) 2008 Michael Niedermayer
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LFG_H
+#define AVUTIL_LFG_H
+
+typedef struct AVLFG {
+ unsigned int state[64];
+ int index;
+} AVLFG;
+
+void av_lfg_init(AVLFG *c, unsigned int seed);
+
+/**
+ * Get the next random unsigned 32-bit number using an ALFG.
+ *
+ * Please also consider a simple LCG like state= state*1664525+1013904223,
+ * it may be good enough and faster for your specific use case.
+ */
+static inline unsigned int av_lfg_get(AVLFG *c){
+ c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
+ return c->state[c->index++ & 63];
+}
+
+/**
+ * Get the next random unsigned 32-bit number using a MLFG.
+ *
+ * Please also consider av_lfg_get() above, it is faster.
+ */
+static inline unsigned int av_mlfg_get(AVLFG *c){
+ unsigned int a= c->state[(c->index-55) & 63];
+ unsigned int b= c->state[(c->index-24) & 63];
+ return c->state[c->index++ & 63] = 2*a*b+a+b;
+}
+
+/**
+ * Get the next two numbers generated by a Box-Muller Gaussian
+ * generator using the random numbers issued by lfg.
+ *
+ * @param out array where the two generated numbers are placed
+ */
+void av_bmg_get(AVLFG *lfg, double out[2]);
+
+#endif /* AVUTIL_LFG_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/log.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/log.h
new file mode 100644
index 000000000..7b173302f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/log.h
@@ -0,0 +1,173 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LOG_H
+#define AVUTIL_LOG_H
+
+#include <stdarg.h>
+#include "avutil.h"
+#include "attributes.h"
+
+/**
+ * Describe the class of an AVClass context structure. That is an
+ * arbitrary struct of which the first field is a pointer to an
+ * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
+ */
+typedef struct AVClass {
+ /**
+ * The name of the class; usually it is the same name as the
+ * context structure type to which the AVClass is associated.
+ */
+ const char* class_name;
+
+ /**
+ * A pointer to a function which returns the name of a context
+ * instance ctx associated with the class.
+ */
+ const char* (*item_name)(void* ctx);
+
+ /**
+ * a pointer to the first option specified in the class if any or NULL
+ *
+ * @see av_set_default_options()
+ */
+ const struct AVOption *option;
+
+ /**
+ * LIBAVUTIL_VERSION with which this structure was created.
+ * This is used to allow fields to be added without requiring major
+ * version bumps everywhere.
+ */
+
+ int version;
+
+ /**
+ * Offset in the structure where log_level_offset is stored.
+ * 0 means there is no such variable
+ */
+ int log_level_offset_offset;
+
+ /**
+ * Offset in the structure where a pointer to the parent context for
+ * logging is stored. For example a decoder could pass its AVCodecContext
+ * to eval as such a parent context, which an av_log() implementation
+ * could then leverage to display the parent context.
+ * The offset can be NULL.
+ */
+ int parent_log_context_offset;
+
+ /**
+ * Return next AVOptions-enabled child or NULL
+ */
+ void* (*child_next)(void *obj, void *prev);
+
+ /**
+ * Return an AVClass corresponding to the next potential
+ * AVOptions-enabled child.
+ *
+ * The difference between child_next and this is that
+ * child_next iterates over _already existing_ objects, while
+ * child_class_next iterates over _all possible_ children.
+ */
+ const struct AVClass* (*child_class_next)(const struct AVClass *prev);
+} AVClass;
+
+/* av_log API */
+
+#define AV_LOG_QUIET -8
+
+/**
+ * Something went really wrong and we will crash now.
+ */
+#define AV_LOG_PANIC 0
+
+/**
+ * Something went wrong and recovery is not possible.
+ * For example, no header was found for a format which depends
+ * on headers or an illegal combination of parameters is used.
+ */
+#define AV_LOG_FATAL 8
+
+/**
+ * Something went wrong and cannot losslessly be recovered.
+ * However, not all future data is affected.
+ */
+#define AV_LOG_ERROR 16
+
+/**
+ * Something somehow does not look correct. This may or may not
+ * lead to problems. An example would be the use of '-vstrict -2'.
+ */
+#define AV_LOG_WARNING 24
+
+#define AV_LOG_INFO 32
+#define AV_LOG_VERBOSE 40
+
+/**
+ * Stuff which is only useful for libav* developers.
+ */
+#define AV_LOG_DEBUG 48
+
+/**
+ * Send the specified message to the log if the level is less than or equal
+ * to the current av_log_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different av_vlog callback
+ * function.
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message, lower values signifying
+ * higher importance.
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ * @see av_vlog
+ */
+void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
+
+void av_vlog(void *avcl, int level, const char *fmt, va_list);
+int av_log_get_level(void);
+void av_log_set_level(int);
+void av_log_set_callback(void (*)(void*, int, const char*, va_list));
+void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl);
+const char* av_default_item_name(void* ctx);
+
+/**
+ * av_dlog macros
+ * Useful to print debug messages that shouldn't get compiled in normally.
+ */
+
+#ifdef DEBUG
+# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
+#else
+# define av_dlog(pctx, ...)
+#endif
+
+/**
+ * Skip repeated messages, this requires the user app to use av_log() instead of
+ * (f)printf as the 2 would otherwise interfere and lead to
+ * "Last message repeated x times" messages below (f)printf messages with some
+ * bad luck.
+ * Also to receive the last, "last repeated" line if any, the user app must
+ * call av_log(NULL, AV_LOG_QUIET, ""); at the end
+ */
+#define AV_LOG_SKIP_REPEATED 1
+void av_log_set_flags(int arg);
+
+#endif /* AVUTIL_LOG_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/lzo.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/lzo.h
new file mode 100644
index 000000000..9d7e8f1dc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/lzo.h
@@ -0,0 +1,66 @@
+/*
+ * LZO 1x decompression
+ * copyright (c) 2006 Reimar Doeffinger
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LZO_H
+#define AVUTIL_LZO_H
+
+/**
+ * @defgroup lavu_lzo LZO
+ * @ingroup lavu_crypto
+ *
+ * @{
+ */
+
+#include <stdint.h>
+
+/** @name Error flags returned by av_lzo1x_decode
+ * @{ */
+/// end of the input buffer reached before decoding finished
+#define AV_LZO_INPUT_DEPLETED 1
+/// decoded data did not fit into output buffer
+#define AV_LZO_OUTPUT_FULL 2
+/// a reference to previously decoded data was wrong
+#define AV_LZO_INVALID_BACKPTR 4
+/// a non-specific error in the compressed bitstream
+#define AV_LZO_ERROR 8
+/** @} */
+
+#define AV_LZO_INPUT_PADDING 8
+#define AV_LZO_OUTPUT_PADDING 12
+
+/**
+ * @brief Decodes LZO 1x compressed data.
+ * @param out output buffer
+ * @param outlen size of output buffer, number of bytes left are returned here
+ * @param in input buffer
+ * @param inlen size of input buffer, number of bytes left are returned here
+ * @return 0 on success, otherwise a combination of the error flags above
+ *
+ * Make sure all buffers are appropriately padded, in must provide
+ * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes.
+ */
+int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_LZO_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/mathematics.h
new file mode 100644
index 000000000..043dd0faf
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/mathematics.h
@@ -0,0 +1,111 @@
+/*
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MATHEMATICS_H
+#define AVUTIL_MATHEMATICS_H
+
+#include <stdint.h>
+#include <math.h>
+#include "attributes.h"
+#include "rational.h"
+#include "intfloat.h"
+
+#ifndef M_LOG2_10
+#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
+#endif
+#ifndef M_PHI
+#define M_PHI 1.61803398874989484820 /* phi / golden ratio */
+#endif
+#ifndef NAN
+#define NAN av_int2float(0x7fc00000)
+#endif
+#ifndef INFINITY
+#define INFINITY av_int2float(0x7f800000)
+#endif
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+
+enum AVRounding {
+ AV_ROUND_ZERO = 0, ///< Round toward zero.
+ AV_ROUND_INF = 1, ///< Round away from zero.
+ AV_ROUND_DOWN = 2, ///< Round toward -infinity.
+ AV_ROUND_UP = 3, ///< Round toward +infinity.
+ AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
+};
+
+/**
+ * Return the greatest common divisor of a and b.
+ * If both a and b are 0 or either or both are <0 then behavior is
+ * undefined.
+ */
+int64_t av_const av_gcd(int64_t a, int64_t b);
+
+/**
+ * Rescale a 64-bit integer with rounding to nearest.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
+
+/**
+ * Rescale a 64-bit integer with specified rounding.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers.
+ */
+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
+ */
+int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
+ enum AVRounding) av_const;
+
+/**
+ * Compare 2 timestamps each in its own timebases.
+ * The result of the function is undefined if one of the timestamps
+ * is outside the int64_t range when represented in the others timebase.
+ * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position
+ */
+int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
+
+/**
+ * Compare 2 integers modulo mod.
+ * That is we compare integers a and b for which only the least
+ * significant log2(mod) bits are known.
+ *
+ * @param mod must be a power of 2
+ * @return a negative value if a is smaller than b
+ * a positive value if a is greater than b
+ * 0 if a equals b
+ */
+int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MATHEMATICS_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/md5.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/md5.h
new file mode 100644
index 000000000..29e4e7c2b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/md5.h
@@ -0,0 +1,51 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MD5_H
+#define AVUTIL_MD5_H
+
+#include <stdint.h>
+
+#include "attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavu_md5 MD5
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#if FF_API_CONTEXT_SIZE
+extern attribute_deprecated const int av_md5_size;
+#endif
+
+struct AVMD5;
+
+struct AVMD5 *av_md5_alloc(void);
+void av_md5_init(struct AVMD5 *ctx);
+void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, const int len);
+void av_md5_final(struct AVMD5 *ctx, uint8_t *dst);
+void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MD5_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/mem.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/mem.h
new file mode 100644
index 000000000..8f4722447
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/mem.h
@@ -0,0 +1,183 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * memory handling functions
+ */
+
+#ifndef AVUTIL_MEM_H
+#define AVUTIL_MEM_H
+
+#include <limits.h>
+#include <stdint.h>
+
+#include "attributes.h"
+#include "avutil.h"
+
+/**
+ * @addtogroup lavu_mem
+ * @{
+ */
+
+
+#if defined(__ICC) && __ICC < 1200 || defined(__SUNPRO_C)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v
+#elif defined(__TI_COMPILER_VERSION__)
+ #define DECLARE_ALIGNED(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ t __attribute__((aligned(n))) v
+ #define DECLARE_ASM_CONST(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ static const t __attribute__((aligned(n))) v
+#elif defined(__GNUC__)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v
+#elif defined(_MSC_VER)
+ #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
+ #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v
+#else
+ #define DECLARE_ALIGNED(n,t,v) t v
+ #define DECLARE_ASM_CONST(n,t,v) static const t v
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+ #define av_malloc_attrib __attribute__((__malloc__))
+#else
+ #define av_malloc_attrib
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+ #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
+#else
+ #define av_alloc_size(...)
+#endif
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU).
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ */
+void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Helper function to allocate a block of size * nmemb bytes with
+ * using av_malloc()
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_malloc()
+ */
+av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size)
+{
+ if (size <= 0 || nmemb >= INT_MAX / size)
+ return NULL;
+ return av_malloc(nmemb * size);
+}
+
+/**
+ * Allocate or reallocate a block of memory.
+ * If ptr is NULL and size > 0, allocate a new block. If
+ * size is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a memory block already allocated with
+ * av_malloc(z)() or av_realloc() or NULL.
+ * @param size Size in bytes for the memory block to be allocated or
+ * reallocated.
+ * @return Pointer to a newly reallocated block or NULL if the block
+ * cannot be reallocated or the function is used to free the memory block.
+ * @see av_fast_realloc()
+ */
+void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc().
+ * @param ptr Pointer to the memory block which should be freed.
+ * @note ptr = NULL is explicitly allowed.
+ * @note It is recommended that you use av_freep() instead.
+ * @see av_freep()
+ */
+void av_free(void *ptr);
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU) and
+ * zero all the bytes of the block.
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if it cannot be allocated.
+ * @see av_malloc()
+ */
+void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Helper function to allocate a block of size * nmemb bytes with
+ * using av_mallocz()
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ * @see av_malloc_array()
+ */
+av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size)
+{
+ if (size <= 0 || nmemb >= INT_MAX / size)
+ return NULL;
+ return av_mallocz(nmemb * size);
+}
+
+/**
+ * Duplicate the string s.
+ * @param s string to be duplicated
+ * @return Pointer to a newly allocated string containing a
+ * copy of s or NULL if the string cannot be allocated.
+ */
+char *av_strdup(const char *s) av_malloc_attrib;
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc() and set the pointer pointing to it to NULL.
+ * @param ptr Pointer to the pointer to the memory block which should
+ * be freed.
+ * @see av_free()
+ */
+void av_freep(void *ptr);
+
+/**
+ * @brief deliberately overlapping memcpy implementation
+ * @param dst destination buffer
+ * @param back how many bytes back we start (the initial size of the overlapping window)
+ * @param cnt number of bytes to copy, must be >= 0
+ *
+ * cnt > back is valid, this will copy the bytes we just copied,
+ * thus creating a repeating pattern with a period length of back.
+ */
+void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MEM_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/old_pix_fmts.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/old_pix_fmts.h
new file mode 100644
index 000000000..31765aed5
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/old_pix_fmts.h
@@ -0,0 +1,128 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_OLD_PIX_FMTS_H
+#define AVUTIL_OLD_PIX_FMTS_H
+
+/*
+ * This header exists to prevent new pixel formats from being accidentally added
+ * to the deprecated list.
+ * Do not include it directly. It will be removed on next major bump
+ *
+ * Do not add new items to this list. Use the AVPixelFormat enum instead.
+ */
+ PIX_FMT_NONE = AV_PIX_FMT_NONE,
+ PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ PIX_FMT_GRAY8, ///< Y , 8bpp
+ PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette
+ PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range
+ PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range
+ PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range
+ PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ PIX_FMT_XVMC_MPEG2_IDCT,
+ PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range
+ PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+ PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0
+ PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0
+
+ PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1
+ PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1
+
+ PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+
+ PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
+ PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
+ PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
+ PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
+ PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha
+ PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+ PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+ PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big endian
+ PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little endian
+ PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big endian
+ PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little endian
+ PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big endian
+ PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little endian
+ PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+
+#endif /* AVUTIL_OLD_PIX_FMTS_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/opt.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/opt.h
new file mode 100644
index 000000000..2d3cc731e
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/opt.h
@@ -0,0 +1,516 @@
+/*
+ * AVOptions
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_OPT_H
+#define AVUTIL_OPT_H
+
+/**
+ * @file
+ * AVOptions
+ */
+
+#include "rational.h"
+#include "avutil.h"
+#include "dict.h"
+#include "log.h"
+
+/**
+ * @defgroup avoptions AVOptions
+ * @ingroup lavu_data
+ * @{
+ * AVOptions provide a generic system to declare options on arbitrary structs
+ * ("objects"). An option can have a help text, a type and a range of possible
+ * values. Options may then be enumerated, read and written to.
+ *
+ * @section avoptions_implement Implementing AVOptions
+ * This section describes how to add AVOptions capabilities to a struct.
+ *
+ * All AVOptions-related information is stored in an AVClass. Therefore
+ * the first member of the struct must be a pointer to an AVClass describing it.
+ * The option field of the AVClass must be set to a NULL-terminated static array
+ * of AVOptions. Each AVOption must have a non-empty name, a type, a default
+ * value and for number-type AVOptions also a range of allowed values. It must
+ * also declare an offset in bytes from the start of the struct, where the field
+ * associated with this AVOption is located. Other fields in the AVOption struct
+ * should also be set when applicable, but are not required.
+ *
+ * The following example illustrates an AVOptions-enabled struct:
+ * @code
+ * typedef struct test_struct {
+ * AVClass *class;
+ * int int_opt;
+ * char *str_opt;
+ * uint8_t *bin_opt;
+ * int bin_len;
+ * } test_struct;
+ *
+ * static const AVOption options[] = {
+ * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),
+ * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX },
+ * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),
+ * AV_OPT_TYPE_STRING },
+ * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),
+ * AV_OPT_TYPE_BINARY },
+ * { NULL },
+ * };
+ *
+ * static const AVClass test_class = {
+ * .class_name = "test class",
+ * .item_name = av_default_item_name,
+ * .option = options,
+ * .version = LIBAVUTIL_VERSION_INT,
+ * };
+ * @endcode
+ *
+ * Next, when allocating your struct, you must ensure that the AVClass pointer
+ * is set to the correct value. Then, av_opt_set_defaults() must be called to
+ * initialize defaults. After that the struct is ready to be used with the
+ * AVOptions API.
+ *
+ * When cleaning up, you may use the av_opt_free() function to automatically
+ * free all the allocated string and binary options.
+ *
+ * Continuing with the above example:
+ *
+ * @code
+ * test_struct *alloc_test_struct(void)
+ * {
+ * test_struct *ret = av_malloc(sizeof(*ret));
+ * ret->class = &test_class;
+ * av_opt_set_defaults(ret);
+ * return ret;
+ * }
+ * void free_test_struct(test_struct **foo)
+ * {
+ * av_opt_free(*foo);
+ * av_freep(foo);
+ * }
+ * @endcode
+ *
+ * @subsection avoptions_implement_nesting Nesting
+ * It may happen that an AVOptions-enabled struct contains another
+ * AVOptions-enabled struct as a member (e.g. AVCodecContext in
+ * libavcodec exports generic options, while its priv_data field exports
+ * codec-specific options). In such a case, it is possible to set up the
+ * parent struct to export a child's options. To do that, simply
+ * implement AVClass.child_next() and AVClass.child_class_next() in the
+ * parent struct's AVClass.
+ * Assuming that the test_struct from above now also contains a
+ * child_struct field:
+ *
+ * @code
+ * typedef struct child_struct {
+ * AVClass *class;
+ * int flags_opt;
+ * } child_struct;
+ * static const AVOption child_opts[] = {
+ * { "test_flags", "This is a test option of flags type.",
+ * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX },
+ * { NULL },
+ * };
+ * static const AVClass child_class = {
+ * .class_name = "child class",
+ * .item_name = av_default_item_name,
+ * .option = child_opts,
+ * .version = LIBAVUTIL_VERSION_INT,
+ * };
+ *
+ * void *child_next(void *obj, void *prev)
+ * {
+ * test_struct *t = obj;
+ * if (!prev && t->child_struct)
+ * return t->child_struct;
+ * return NULL
+ * }
+ * const AVClass child_class_next(const AVClass *prev)
+ * {
+ * return prev ? NULL : &child_class;
+ * }
+ * @endcode
+ * Putting child_next() and child_class_next() as defined above into
+ * test_class will now make child_struct's options accessible through
+ * test_struct (again, proper setup as described above needs to be done on
+ * child_struct right after it is created).
+ *
+ * From the above example it might not be clear why both child_next()
+ * and child_class_next() are needed. The distinction is that child_next()
+ * iterates over actually existing objects, while child_class_next()
+ * iterates over all possible child classes. E.g. if an AVCodecContext
+ * was initialized to use a codec which has private options, then its
+ * child_next() will return AVCodecContext.priv_data and finish
+ * iterating. OTOH child_class_next() on AVCodecContext.av_class will
+ * iterate over all available codecs with private options.
+ *
+ * @subsection avoptions_implement_named_constants Named constants
+ * It is possible to create named constants for options. Simply set the unit
+ * field of the option the constants should apply to to a string and
+ * create the constants themselves as options of type AV_OPT_TYPE_CONST
+ * with their unit field set to the same string.
+ * Their default_val field should contain the value of the named
+ * constant.
+ * For example, to add some named constants for the test_flags option
+ * above, put the following into the child_opts array:
+ * @code
+ * { "test_flags", "This is a test option of flags type.",
+ * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" },
+ * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" },
+ * @endcode
+ *
+ * @section avoptions_use Using AVOptions
+ * This section deals with accessing options in an AVOptions-enabled struct.
+ * Such structs in Libav are e.g. AVCodecContext in libavcodec or
+ * AVFormatContext in libavformat.
+ *
+ * @subsection avoptions_use_examine Examining AVOptions
+ * The basic functions for examining options are av_opt_next(), which iterates
+ * over all options defined for one object, and av_opt_find(), which searches
+ * for an option with the given name.
+ *
+ * The situation is more complicated with nesting. An AVOptions-enabled struct
+ * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag
+ * to av_opt_find() will make the function search children recursively.
+ *
+ * For enumerating there are basically two cases. The first is when you want to
+ * get all options that may potentially exist on the struct and its children
+ * (e.g. when constructing documentation). In that case you should call
+ * av_opt_child_class_next() recursively on the parent struct's AVClass. The
+ * second case is when you have an already initialized struct with all its
+ * children and you want to get all options that can be actually written or read
+ * from it. In that case you should call av_opt_child_next() recursively (and
+ * av_opt_next() on each result).
+ *
+ * @subsection avoptions_use_get_set Reading and writing AVOptions
+ * When setting options, you often have a string read directly from the
+ * user. In such a case, simply passing it to av_opt_set() is enough. For
+ * non-string type options, av_opt_set() will parse the string according to the
+ * option type.
+ *
+ * Similarly av_opt_get() will read any option type and convert it to a string
+ * which will be returned. Do not forget that the string is allocated, so you
+ * have to free it with av_free().
+ *
+ * In some cases it may be more convenient to put all options into an
+ * AVDictionary and call av_opt_set_dict() on it. A specific case of this
+ * are the format/codec open functions in lavf/lavc which take a dictionary
+ * filled with option as a parameter. This allows to set some options
+ * that cannot be set otherwise, since e.g. the input file format is not known
+ * before the file is actually opened.
+ */
+
+enum AVOptionType{
+ AV_OPT_TYPE_FLAGS,
+ AV_OPT_TYPE_INT,
+ AV_OPT_TYPE_INT64,
+ AV_OPT_TYPE_DOUBLE,
+ AV_OPT_TYPE_FLOAT,
+ AV_OPT_TYPE_STRING,
+ AV_OPT_TYPE_RATIONAL,
+ AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length
+ AV_OPT_TYPE_CONST = 128,
+};
+
+/**
+ * AVOption
+ */
+typedef struct AVOption {
+ const char *name;
+
+ /**
+ * short English help text
+ * @todo What about other languages?
+ */
+ const char *help;
+
+ /**
+ * The offset relative to the context structure where the option
+ * value is stored. It should be 0 for named constants.
+ */
+ int offset;
+ enum AVOptionType type;
+
+ /**
+ * the default value for scalar options
+ */
+ union {
+ int64_t i64;
+ double dbl;
+ const char *str;
+ /* TODO those are unused now */
+ AVRational q;
+ } default_val;
+ double min; ///< minimum valid value for the option
+ double max; ///< maximum valid value for the option
+
+ int flags;
+#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding
+#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding
+#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ...
+#define AV_OPT_FLAG_AUDIO_PARAM 8
+#define AV_OPT_FLAG_VIDEO_PARAM 16
+#define AV_OPT_FLAG_SUBTITLE_PARAM 32
+//FIXME think about enc-audio, ... style flags
+
+ /**
+ * The logical unit to which the option belongs. Non-constant
+ * options and corresponding named constants share the same
+ * unit. May be NULL.
+ */
+ const char *unit;
+} AVOption;
+
+/**
+ * Show the obj options.
+ *
+ * @param req_flags requested flags for the options to show. Show only the
+ * options for which it is opt->flags & req_flags.
+ * @param rej_flags rejected flags for the options to show. Show only the
+ * options for which it is !(opt->flags & req_flags).
+ * @param av_log_obj log context to use for showing the options
+ */
+int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
+
+/**
+ * Set the values of all AVOption fields to their default values.
+ *
+ * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
+ */
+void av_opt_set_defaults(void *s);
+
+/**
+ * Parse the key/value pairs list in opts. For each key/value pair
+ * found, stores the value in the field in ctx that is named like the
+ * key. ctx must be an AVClass context, storing is done using
+ * AVOptions.
+ *
+ * @param key_val_sep a 0-terminated list of characters used to
+ * separate key from value
+ * @param pairs_sep a 0-terminated list of characters used to separate
+ * two pairs from each other
+ * @return the number of successfully set key/value pairs, or a negative
+ * value corresponding to an AVERROR code in case of error:
+ * AVERROR(EINVAL) if opts cannot be parsed,
+ * the error code issued by av_set_string3() if a key/value pair
+ * cannot be set
+ */
+int av_set_options_string(void *ctx, const char *opts,
+ const char *key_val_sep, const char *pairs_sep);
+
+/**
+ * Free all string and binary options in obj.
+ */
+void av_opt_free(void *obj);
+
+/**
+ * Check whether a particular flag is set in a flags field.
+ *
+ * @param field_name the name of the flag field option
+ * @param flag_name the name of the flag to check
+ * @return non-zero if the flag is set, zero if the flag isn't set,
+ * isn't of the right type, or the flags field doesn't exist.
+ */
+int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
+
+/*
+ * Set all the options from a given dictionary on an object.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass
+ * @param options options to process. This dictionary will be freed and replaced
+ * by a new one containing all options not found in obj.
+ * Of course this new dictionary needs to be freed by caller
+ * with av_dict_free().
+ *
+ * @return 0 on success, a negative AVERROR if some option was found in obj,
+ * but could not be set.
+ *
+ * @see av_dict_copy()
+ */
+int av_opt_set_dict(void *obj, struct AVDictionary **options);
+
+/**
+ * @defgroup opt_eval_funcs Evaluating option strings
+ * @{
+ * This group of functions can be used to evaluate option strings
+ * and get numbers out of them. They do the same thing as av_opt_set(),
+ * except the result is written into the caller-supplied pointer.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass.
+ * @param o an option for which the string is to be evaluated.
+ * @param val string to be evaluated.
+ * @param *_out value of the string will be written here.
+ *
+ * @return 0 on success, a negative number on failure.
+ */
+int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out);
+int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out);
+int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out);
+int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out);
+int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out);
+int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out);
+/**
+ * @}
+ */
+
+#define AV_OPT_SEARCH_CHILDREN 0x0001 /**< Search in possible children of the
+ given object first. */
+/**
+ * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
+ * instead of a required pointer to a struct containing AVClass. This is
+ * useful for searching for options without needing to allocate the corresponding
+ * object.
+ */
+#define AV_OPT_SEARCH_FAKE_OBJ 0x0002
+
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ * pointer to an AVClass.
+ * Alternatively a double pointer to an AVClass, if
+ * AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ * it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ * was found.
+ *
+ * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable
+ * directly with av_set_string3(). Use special calls which take an options
+ * AVDictionary (e.g. avformat_open_input()) to set options found with this
+ * flag.
+ */
+const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
+ int opt_flags, int search_flags);
+
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ * pointer to an AVClass.
+ * Alternatively a double pointer to an AVClass, if
+ * AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ * it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ * @param[out] target_obj if non-NULL, an object to which the option belongs will be
+ * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present
+ * in search_flags. This parameter is ignored if search_flags contain
+ * AV_OPT_SEARCH_FAKE_OBJ.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ * was found.
+ */
+const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
+ int opt_flags, int search_flags, void **target_obj);
+
+/**
+ * Iterate over all AVOptions belonging to obj.
+ *
+ * @param obj an AVOptions-enabled struct or a double pointer to an
+ * AVClass describing it.
+ * @param prev result of the previous call to av_opt_next() on this object
+ * or NULL
+ * @return next AVOption or NULL
+ */
+const AVOption *av_opt_next(void *obj, const AVOption *prev);
+
+/**
+ * Iterate over AVOptions-enabled children of obj.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return next AVOptions-enabled child or NULL
+ */
+void *av_opt_child_next(void *obj, void *prev);
+
+/**
+ * Iterate over potential AVOptions-enabled children of parent.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return AVClass corresponding to next potential child or NULL
+ */
+const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev);
+
+/**
+ * @defgroup opt_set_funcs Option setting functions
+ * @{
+ * Those functions set the field of obj with the given name to value.
+ *
+ * @param[in] obj A struct whose first element is a pointer to an AVClass.
+ * @param[in] name the name of the field to set
+ * @param[in] val The value to set. In case of av_opt_set() if the field is not
+ * of a string type, then the given string is parsed.
+ * SI postfixes and some named scalars are supported.
+ * If the field is of a numeric type, it has to be a numeric or named
+ * scalar. Behavior with more than one scalar and +- infix operators
+ * is undefined.
+ * If the field is of a flags type, it has to be a sequence of numeric
+ * scalars or named flags separated by '+' or '-'. Prefixing a flag
+ * with '+' causes it to be set without affecting the other flags;
+ * similarly, '-' unsets a flag.
+ * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be set on a child of obj.
+ *
+ * @return 0 if the value has been set, or an AVERROR code in case of
+ * error:
+ * AVERROR_OPTION_NOT_FOUND if no matching option exists
+ * AVERROR(ERANGE) if the value is out of range
+ * AVERROR(EINVAL) if the value is not valid
+ */
+int av_opt_set (void *obj, const char *name, const char *val, int search_flags);
+int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags);
+int av_opt_set_double(void *obj, const char *name, double val, int search_flags);
+int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags);
+int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags);
+/**
+ * @}
+ */
+
+/**
+ * @defgroup opt_get_funcs Option getting functions
+ * @{
+ * Those functions get a value of the option with the given name from an object.
+ *
+ * @param[in] obj a struct whose first element is a pointer to an AVClass.
+ * @param[in] name name of the option to get.
+ * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be found in a child of obj.
+ * @param[out] out_val value of the option will be written here
+ * @return 0 on success, a negative error code otherwise
+ */
+/**
+ * @note the returned string will av_malloc()ed and must be av_free()ed by the caller
+ */
+int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val);
+int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val);
+int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val);
+int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val);
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_OPT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/parseutils.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/parseutils.h
new file mode 100644
index 000000000..0844abb2f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/parseutils.h
@@ -0,0 +1,124 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PARSEUTILS_H
+#define AVUTIL_PARSEUTILS_H
+
+#include <time.h>
+
+#include "rational.h"
+
+/**
+ * @file
+ * misc parsing utilities
+ */
+
+/**
+ * Parse str and put in width_ptr and height_ptr the detected values.
+ *
+ * @param[in,out] width_ptr pointer to the variable which will contain the detected
+ * width value
+ * @param[in,out] height_ptr pointer to the variable which will contain the detected
+ * height value
+ * @param[in] str the string to parse: it has to be a string in the format
+ * width x height or a valid video size abbreviation.
+ * @return >= 0 on success, a negative error code otherwise
+ */
+int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str);
+
+/**
+ * Parse str and store the detected values in *rate.
+ *
+ * @param[in,out] rate pointer to the AVRational which will contain the detected
+ * frame rate
+ * @param[in] str the string to parse: it has to be a string in the format
+ * rate_num / rate_den, a float number or a valid video rate abbreviation
+ * @return >= 0 on success, a negative error code otherwise
+ */
+int av_parse_video_rate(AVRational *rate, const char *str);
+
+/**
+ * Put the RGBA values that correspond to color_string in rgba_color.
+ *
+ * @param color_string a string specifying a color. It can be the name of
+ * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence,
+ * possibly followed by "@" and a string representing the alpha
+ * component.
+ * The alpha component may be a string composed by "0x" followed by an
+ * hexadecimal number or a decimal number between 0.0 and 1.0, which
+ * represents the opacity value (0x00/0.0 means completely transparent,
+ * 0xff/1.0 completely opaque).
+ * If the alpha component is not specified then 0xff is assumed.
+ * The string "random" will result in a random color.
+ * @param slen length of the initial part of color_string containing the
+ * color. It can be set to -1 if color_string is a null terminated string
+ * containing nothing else than the color.
+ * @return >= 0 in case of success, a negative value in case of
+ * failure (for example if color_string cannot be parsed).
+ */
+int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
+ void *log_ctx);
+
+/**
+ * Parse timestr and return in *time a corresponding number of
+ * microseconds.
+ *
+ * @param timeval puts here the number of microseconds corresponding
+ * to the string in timestr. If the string represents a duration, it
+ * is the number of microseconds contained in the time interval. If
+ * the string is a date, is the number of microseconds since 1st of
+ * January, 1970 up to the time of the parsed date. If timestr cannot
+ * be successfully parsed, set *time to INT64_MIN.
+
+ * @param timestr a string representing a date or a duration.
+ * - If a date the syntax is:
+ * @code
+ * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z]
+ * now
+ * @endcode
+ * If the value is "now" it takes the current time.
+ * Time is local time unless Z is appended, in which case it is
+ * interpreted as UTC.
+ * If the year-month-day part is not specified it takes the current
+ * year-month-day.
+ * - If a duration the syntax is:
+ * @code
+ * [-]HH[:MM[:SS[.m...]]]
+ * [-]S+[.m...]
+ * @endcode
+ * @param duration flag which tells how to interpret timestr, if not
+ * zero timestr is interpreted as a duration, otherwise as a date
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_parse_time(int64_t *timeval, const char *timestr, int duration);
+
+/**
+ * Attempt to find a specific tag in a URL.
+ *
+ * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
+ * Return 1 if found.
+ */
+int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);
+
+/**
+ * Convert the decomposed UTC time in tm to a time_t value.
+ */
+time_t av_timegm(struct tm *tm);
+
+#endif /* AVUTIL_PARSEUTILS_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/pixdesc.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/pixdesc.h
new file mode 100644
index 000000000..47e6bb838
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/pixdesc.h
@@ -0,0 +1,223 @@
+/*
+ * pixel format descriptor
+ * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXDESC_H
+#define AVUTIL_PIXDESC_H
+
+#include <inttypes.h>
+#include "pixfmt.h"
+
+typedef struct AVComponentDescriptor{
+ uint16_t plane :2; ///< which of the 4 planes contains the component
+
+ /**
+ * Number of elements between 2 horizontally consecutive pixels minus 1.
+ * Elements are bits for bitstream formats, bytes otherwise.
+ */
+ uint16_t step_minus1 :3;
+
+ /**
+ * Number of elements before the component of the first pixel plus 1.
+ * Elements are bits for bitstream formats, bytes otherwise.
+ */
+ uint16_t offset_plus1 :3;
+ uint16_t shift :3; ///< number of least significant bits that must be shifted away to get the value
+ uint16_t depth_minus1 :4; ///< number of bits in the component minus 1
+}AVComponentDescriptor;
+
+/**
+ * Descriptor that unambiguously describes how the bits of a pixel are
+ * stored in the up to 4 data planes of an image. It also stores the
+ * subsampling factors and number of components.
+ *
+ * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV
+ * and all the YUV variants) AVPixFmtDescriptor just stores how values
+ * are stored not what these values represent.
+ */
+typedef struct AVPixFmtDescriptor{
+ const char *name;
+ uint8_t nb_components; ///< The number of components each pixel has, (1-4)
+
+ /**
+ * Amount to shift the luma width right to find the chroma width.
+ * For YV12 this is 1 for example.
+ * chroma_width = -((-luma_width) >> log2_chroma_w)
+ * The note above is needed to ensure rounding up.
+ * This value only refers to the chroma components.
+ */
+ uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w)
+
+ /**
+ * Amount to shift the luma height right to find the chroma height.
+ * For YV12 this is 1 for example.
+ * chroma_height= -((-luma_height) >> log2_chroma_h)
+ * The note above is needed to ensure rounding up.
+ * This value only refers to the chroma components.
+ */
+ uint8_t log2_chroma_h;
+ uint8_t flags;
+
+ /**
+ * Parameters that describe how pixels are packed. If the format
+ * has chroma components, they must be stored in comp[1] and
+ * comp[2].
+ */
+ AVComponentDescriptor comp[4];
+}AVPixFmtDescriptor;
+
+#define PIX_FMT_BE 1 ///< Pixel format is big-endian.
+#define PIX_FMT_PAL 2 ///< Pixel format has a palette in data[1], values are indexes in this palette.
+#define PIX_FMT_BITSTREAM 4 ///< All values of a component are bit-wise packed end to end.
+#define PIX_FMT_HWACCEL 8 ///< Pixel format is an HW accelerated format.
+#define PIX_FMT_PLANAR 16 ///< At least one pixel component is not in the first data plane
+#define PIX_FMT_RGB 32 ///< The pixel format contains RGB-like data (as opposed to YUV/grayscale)
+/**
+ * The pixel format is "pseudo-paletted". This means that Libav treats it as
+ * paletted internally, but the palette is generated by the decoder and is not
+ * stored in the file.
+ */
+#define PIX_FMT_PSEUDOPAL 64
+
+#define PIX_FMT_ALPHA 128 ///< The pixel format has an alpha channel
+
+
+#if FF_API_PIX_FMT_DESC
+/**
+ * The array of all the pixel format descriptors.
+ */
+extern const AVPixFmtDescriptor av_pix_fmt_descriptors[];
+#endif
+
+/**
+ * Read a line from an image, and write the values of the
+ * pixel format component c to dst.
+ *
+ * @param data the array containing the pointers to the planes of the image
+ * @param linesize the array containing the linesizes of the image
+ * @param desc the pixel format descriptor for the image
+ * @param x the horizontal coordinate of the first pixel to read
+ * @param y the vertical coordinate of the first pixel to read
+ * @param w the width of the line to read, that is the number of
+ * values to write to dst
+ * @param read_pal_component if not zero and the format is a paletted
+ * format writes the values corresponding to the palette
+ * component c in data[1] to dst, rather than the palette indexes in
+ * data[0]. The behavior is undefined if the format is not paletted.
+ */
+void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
+ const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component);
+
+/**
+ * Write the values from src to the pixel format component c of an
+ * image line.
+ *
+ * @param src array containing the values to write
+ * @param data the array containing the pointers to the planes of the
+ * image to write into. It is supposed to be zeroed.
+ * @param linesize the array containing the linesizes of the image
+ * @param desc the pixel format descriptor for the image
+ * @param x the horizontal coordinate of the first pixel to write
+ * @param y the vertical coordinate of the first pixel to write
+ * @param w the width of the line to write, that is the number of
+ * values to write to the image line
+ */
+void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
+ const AVPixFmtDescriptor *desc, int x, int y, int c, int w);
+
+/**
+ * Return the pixel format corresponding to name.
+ *
+ * If there is no pixel format with name name, then looks for a
+ * pixel format with the name corresponding to the native endian
+ * format of name.
+ * For example in a little-endian system, first looks for "gray16",
+ * then for "gray16le".
+ *
+ * Finally if no pixel format has been found, returns PIX_FMT_NONE.
+ */
+enum AVPixelFormat av_get_pix_fmt(const char *name);
+
+/**
+ * Return the short name for a pixel format, NULL in case pix_fmt is
+ * unknown.
+ *
+ * @see av_get_pix_fmt(), av_get_pix_fmt_string()
+ */
+const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt);
+
+/**
+ * Print in buf the string corresponding to the pixel format with
+ * number pix_fmt, or an header if pix_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param pix_fmt the number of the pixel format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ */
+char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt);
+
+/**
+ * Return the number of bits per pixel used by the pixel format
+ * described by pixdesc.
+ *
+ * The returned number of bits refers to the number of bits actually
+ * used for storing the pixel information, that is padding bits are
+ * not counted.
+ */
+int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);
+
+/**
+ * @return a pixel format descriptor for provided pixel format or NULL if
+ * this pixel format is unknown.
+ */
+const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);
+
+/**
+ * Iterate over all pixel format descriptors known to libavutil.
+ *
+ * @param prev previous descriptor. NULL to get the first descriptor.
+ *
+ * @return next descriptor or NULL after the last descriptor
+ */
+const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev);
+
+/**
+ * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc
+ * is not a valid pointer to a pixel format descriptor.
+ */
+enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc);
+
+/**
+ * Utility function to access log2_chroma_w log2_chroma_h from
+ * the pixel format AVPixFmtDescriptor.
+ *
+ * @param[in] pix_fmt the pixel format
+ * @param[out] h_shift store log2_chroma_h
+ * @param[out] v_shift store log2_chroma_w
+ *
+ * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format
+ */
+int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
+ int *h_shift, int *v_shift);
+
+
+#endif /* AVUTIL_PIXDESC_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/pixfmt.h
new file mode 100644
index 000000000..1072f0089
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/pixfmt.h
@@ -0,0 +1,268 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXFMT_H
+#define AVUTIL_PIXFMT_H
+
+/**
+ * @file
+ * pixel format definitions
+ *
+ */
+
+#include "libavutil/avconfig.h"
+#include "libavutil/version.h"
+
+/**
+ * Pixel format.
+ *
+ * @note
+ * PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
+ * color is put together as:
+ * (A << 24) | (R << 16) | (G << 8) | B
+ * This is stored as BGRA on little-endian CPU architectures and ARGB on
+ * big-endian CPUs.
+ *
+ * @par
+ * When the pixel format is palettized RGB (PIX_FMT_PAL8), the palettized
+ * image data is stored in AVFrame.data[0]. The palette is transported in
+ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
+ * formatted the same as in PIX_FMT_RGB32 described above (i.e., it is
+ * also endian-specific). Note also that the individual RGB palette
+ * components stored in AVFrame.data[1] should be in the range 0..255.
+ * This is important as many custom PAL8 video codecs that were designed
+ * to run on the IBM VGA graphics adapter use 6-bit palette components.
+ *
+ * @par
+ * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like
+ * for pal8. This palette is filled in automatically by the function
+ * allocating the picture.
+ *
+ * @note
+ * Make sure that all newly added big-endian formats have pix_fmt & 1 == 1
+ * and that all newly added little-endian formats have pix_fmt & 1 == 0.
+ * This allows simpler detection of big vs little-endian.
+ */
+enum AVPixelFormat {
+ AV_PIX_FMT_NONE = -1,
+ AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ AV_PIX_FMT_GRAY8, ///< Y , 8bpp
+ AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ AV_PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette
+ AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range
+ AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range
+ AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range
+ AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ AV_PIX_FMT_XVMC_MPEG2_IDCT,
+ AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range
+ AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+ AV_PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0
+ AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0
+
+ AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1
+ AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1
+
+ AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+
+ AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
+ AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
+ AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
+ AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
+ AV_PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha
+ AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+ AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+ AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian
+ AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian
+ AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian
+ AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian
+ AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian
+ AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian
+ AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
+ AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
+ AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
+ AV_PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+
+#if FF_API_PIX_FMT
+#include "old_pix_fmts.h"
+#endif
+};
+
+#if AV_HAVE_BIGENDIAN
+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be
+#else
+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le
+#endif
+
+#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA)
+#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR)
+#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA)
+#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB)
+
+#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE)
+#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE)
+#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE)
+#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE)
+#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE)
+#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE)
+#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE)
+#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE)
+#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE)
+
+#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
+#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE)
+#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE)
+#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
+#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
+#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE)
+#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
+#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
+#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
+
+#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE)
+#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE)
+#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE)
+
+#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE)
+#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE)
+#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE)
+#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE)
+#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE)
+#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE)
+#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE)
+#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE)
+#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE)
+
+#if FF_API_PIX_FMT
+#define PixelFormat AVPixelFormat
+
+#define PIX_FMT_NE(be, le) AV_PIX_FMT_NE(be, le)
+
+#define PIX_FMT_RGB32 AV_PIX_FMT_RGB32
+#define PIX_FMT_RGB32_1 AV_PIX_FMT_RGB32_1
+#define PIX_FMT_BGR32 AV_PIX_FMT_BGR32
+#define PIX_FMT_BGR32_1 AV_PIX_FMT_BGR32_1
+
+#define PIX_FMT_GRAY16 AV_PIX_FMT_GRAY16
+#define PIX_FMT_RGB48 AV_PIX_FMT_RGB48
+#define PIX_FMT_RGB565 AV_PIX_FMT_RGB565
+#define PIX_FMT_RGB555 AV_PIX_FMT_RGB555
+#define PIX_FMT_RGB444 AV_PIX_FMT_RGB444
+#define PIX_FMT_BGR48 AV_PIX_FMT_BGR48
+#define PIX_FMT_BGR565 AV_PIX_FMT_BGR565
+#define PIX_FMT_BGR555 AV_PIX_FMT_BGR555
+#define PIX_FMT_BGR444 AV_PIX_FMT_BGR444
+
+#define PIX_FMT_YUV420P9 AV_PIX_FMT_YUV420P9
+#define PIX_FMT_YUV422P9 AV_PIX_FMT_YUV422P9
+#define PIX_FMT_YUV444P9 AV_PIX_FMT_YUV444P9
+#define PIX_FMT_YUV420P10 AV_PIX_FMT_YUV420P10
+#define PIX_FMT_YUV422P10 AV_PIX_FMT_YUV422P10
+#define PIX_FMT_YUV444P10 AV_PIX_FMT_YUV444P10
+#define PIX_FMT_YUV420P16 AV_PIX_FMT_YUV420P16
+#define PIX_FMT_YUV422P16 AV_PIX_FMT_YUV422P16
+#define PIX_FMT_YUV444P16 AV_PIX_FMT_YUV444P16
+
+#define PIX_FMT_GBRP9 AV_PIX_FMT_GBRP9
+#define PIX_FMT_GBRP10 AV_PIX_FMT_GBRP10
+#define PIX_FMT_GBRP16 AV_PIX_FMT_GBRP16
+#endif
+
+#endif /* AVUTIL_PIXFMT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/random_seed.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/random_seed.h
new file mode 100644
index 000000000..b1fad13d0
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/random_seed.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudurier@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_RANDOM_SEED_H
+#define AVUTIL_RANDOM_SEED_H
+
+#include <stdint.h>
+/**
+ * @addtogroup lavu_crypto
+ * @{
+ */
+
+/**
+ * Get random data.
+ *
+ * This function can be called repeatedly to generate more random bits
+ * as needed. It is generally quite slow, and usually used to seed a
+ * PRNG. As it uses /dev/urandom and /dev/random, the quality of the
+ * returned random data depends on the platform.
+ */
+uint32_t av_get_random_seed(void);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RANDOM_SEED_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/rational.h
new file mode 100644
index 000000000..5d7dab7fd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/rational.h
@@ -0,0 +1,155 @@
+/*
+ * rational numbers
+ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * rational numbers
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_RATIONAL_H
+#define AVUTIL_RATIONAL_H
+
+#include <stdint.h>
+#include <limits.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+/**
+ * rational number numerator/denominator
+ */
+typedef struct AVRational{
+ int num; ///< numerator
+ int den; ///< denominator
+} AVRational;
+
+/**
+ * Compare two rationals.
+ * @param a first rational
+ * @param b second rational
+ * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
+ * values is of the form 0/0
+ */
+static inline int av_cmp_q(AVRational a, AVRational b){
+ const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
+
+ if(tmp) return ((tmp ^ a.den ^ b.den)>>63)|1;
+ else if(b.den && a.den) return 0;
+ else if(a.num && b.num) return (a.num>>31) - (b.num>>31);
+ else return INT_MIN;
+}
+
+/**
+ * Convert rational to double.
+ * @param a rational to convert
+ * @return (double) a
+ */
+static inline double av_q2d(AVRational a){
+ return a.num / (double) a.den;
+}
+
+/**
+ * Reduce a fraction.
+ * This is useful for framerate calculations.
+ * @param dst_num destination numerator
+ * @param dst_den destination denominator
+ * @param num source numerator
+ * @param den source denominator
+ * @param max the maximum allowed for dst_num & dst_den
+ * @return 1 if exact, 0 otherwise
+ */
+int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);
+
+/**
+ * Multiply two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b*c
+ */
+AVRational av_mul_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Divide one rational by another.
+ * @param b first rational
+ * @param c second rational
+ * @return b/c
+ */
+AVRational av_div_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Add two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b+c
+ */
+AVRational av_add_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Subtract one rational from another.
+ * @param b first rational
+ * @param c second rational
+ * @return b-c
+ */
+AVRational av_sub_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Invert a rational.
+ * @param q value
+ * @return 1 / q
+ */
+static av_always_inline AVRational av_inv_q(AVRational q)
+{
+ AVRational r = { q.den, q.num };
+ return r;
+}
+
+/**
+ * Convert a double precision floating point number to a rational.
+ * inf is expressed as {1,0} or {-1,0} depending on the sign.
+ *
+ * @param d double to convert
+ * @param max the maximum allowed numerator and denominator
+ * @return (AVRational) d
+ */
+AVRational av_d2q(double d, int max) av_const;
+
+/**
+ * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
+ * than q1, 0 if they have the same distance.
+ */
+int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
+
+/**
+ * Find the nearest value in q_list to q.
+ * @param q_list an array of rationals terminated by {0, 0}
+ * @return the index of the nearest value found in the array
+ */
+int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RATIONAL_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/samplefmt.h
new file mode 100644
index 000000000..33cbdedf5
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/samplefmt.h
@@ -0,0 +1,220 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SAMPLEFMT_H
+#define AVUTIL_SAMPLEFMT_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+#include "attributes.h"
+
+/**
+ * Audio Sample Formats
+ *
+ * @par
+ * The data described by the sample format is always in native-endian order.
+ * Sample values can be expressed by native C types, hence the lack of a signed
+ * 24-bit sample format even though it is a common raw audio data format.
+ *
+ * @par
+ * The floating-point formats are based on full volume being in the range
+ * [-1.0, 1.0]. Any values outside this range are beyond full volume level.
+ *
+ * @par
+ * The data layout as used in av_samples_fill_arrays() and elsewhere in Libav
+ * (such as AVFrame in libavcodec) is as follows:
+ *
+ * For planar sample formats, each audio channel is in a separate data plane,
+ * and linesize is the buffer size, in bytes, for a single plane. All data
+ * planes must be the same size. For packed sample formats, only the first data
+ * plane is used, and samples for each channel are interleaved. In this case,
+ * linesize is the buffer size, in bytes, for the 1 plane.
+ */
+enum AVSampleFormat {
+ AV_SAMPLE_FMT_NONE = -1,
+ AV_SAMPLE_FMT_U8, ///< unsigned 8 bits
+ AV_SAMPLE_FMT_S16, ///< signed 16 bits
+ AV_SAMPLE_FMT_S32, ///< signed 32 bits
+ AV_SAMPLE_FMT_FLT, ///< float
+ AV_SAMPLE_FMT_DBL, ///< double
+
+ AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar
+ AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar
+ AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar
+ AV_SAMPLE_FMT_FLTP, ///< float, planar
+ AV_SAMPLE_FMT_DBLP, ///< double, planar
+
+ AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically
+};
+
+/**
+ * Return the name of sample_fmt, or NULL if sample_fmt is not
+ * recognized.
+ */
+const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);
+
+/**
+ * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE
+ * on error.
+ */
+enum AVSampleFormat av_get_sample_fmt(const char *name);
+
+/**
+ * Get the packed alternative form of the given sample format.
+ *
+ * If the passed sample_fmt is already in packed format, the format returned is
+ * the same as the input.
+ *
+ * @return the packed alternative form of the given sample format or
+ AV_SAMPLE_FMT_NONE on error.
+ */
+enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the planar alternative form of the given sample format.
+ *
+ * If the passed sample_fmt is already in planar format, the format returned is
+ * the same as the input.
+ *
+ * @return the planar alternative form of the given sample format or
+ AV_SAMPLE_FMT_NONE on error.
+ */
+enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt);
+
+/**
+ * Generate a string corresponding to the sample format with
+ * sample_fmt, or a header if sample_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param sample_fmt the number of the sample format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ * @return the pointer to the filled buffer or NULL if sample_fmt is
+ * unknown or in case of other errors
+ */
+char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt);
+
+/**
+ * Return number of bytes per sample.
+ *
+ * @param sample_fmt the sample format
+ * @return number of bytes per sample or zero if unknown for the given
+ * sample format
+ */
+int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
+
+/**
+ * Check if the sample format is planar.
+ *
+ * @param sample_fmt the sample format to inspect
+ * @return 1 if the sample format is planar, 0 if it is interleaved
+ */
+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the required buffer size for the given audio parameters.
+ *
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return required buffer size, or negative error code on failure
+ */
+int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Fill channel data pointers and linesize for samples with sample
+ * format sample_fmt.
+ *
+ * The pointers array is filled with the pointers to the samples data:
+ * for planar, set the start point of each channel's data within the buffer,
+ * for packed, set the start point of the entire buffer only.
+ *
+ * The linesize array is filled with the aligned size of each channel's data
+ * buffer for planar layout, or the aligned size of the buffer for all channels
+ * for packed layout.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param buf the pointer to a buffer containing the samples
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return 0 on success or a negative error code on failure
+ */
+int av_samples_fill_arrays(uint8_t **audio_data, int *linesize,
+ const uint8_t *buf,
+ int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
+ * linesize accordingly.
+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
+ * Allocated data will be initialized to silence.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize aligned size for audio buffer(s), may be NULL
+ * @param nb_channels number of audio channels
+ * @param nb_samples number of samples per channel
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return 0 on success or a negative error code on failure
+ * @see av_samples_fill_arrays()
+ */
+int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
+ int nb_samples, enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Copy samples from src to dst.
+ *
+ * @param dst destination array of pointers to data planes
+ * @param src source array of pointers to data planes
+ * @param dst_offset offset in samples at which the data will be written to dst
+ * @param src_offset offset in samples at which the data will be read from src
+ * @param nb_samples number of samples to be copied
+ * @param nb_channels number of audio channels
+ * @param sample_fmt audio sample format
+ */
+int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset,
+ int src_offset, int nb_samples, int nb_channels,
+ enum AVSampleFormat sample_fmt);
+
+/**
+ * Fill an audio buffer with silence.
+ *
+ * @param audio_data array of pointers to data planes
+ * @param offset offset in samples at which to start filling
+ * @param nb_samples number of samples to fill
+ * @param nb_channels number of audio channels
+ * @param sample_fmt audio sample format
+ */
+int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples,
+ int nb_channels, enum AVSampleFormat sample_fmt);
+
+#endif /* AVUTIL_SAMPLEFMT_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/sha.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/sha.h
new file mode 100644
index 000000000..4c9a0c909
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/sha.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SHA_H
+#define AVUTIL_SHA_H
+
+#include <stdint.h>
+
+#include "attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavu_sha SHA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#if FF_API_CONTEXT_SIZE
+extern attribute_deprecated const int av_sha_size;
+#endif
+
+struct AVSHA;
+
+/**
+ * Allocate an AVSHA context.
+ */
+struct AVSHA *av_sha_alloc(void);
+
+/**
+ * Initialize SHA-1 or SHA-2 hashing.
+ *
+ * @param context pointer to the function context (of size av_sha_size)
+ * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits)
+ * @return zero if initialization succeeded, -1 otherwise
+ */
+int av_sha_init(struct AVSHA* context, int bits);
+
+/**
+ * Update hash value.
+ *
+ * @param context hash function context
+ * @param data input data to update hash with
+ * @param len input data length
+ */
+void av_sha_update(struct AVSHA* context, const uint8_t* data, unsigned int len);
+
+/**
+ * Finish hashing and output digest value.
+ *
+ * @param context hash function context
+ * @param digest buffer where output digest value is stored
+ */
+void av_sha_final(struct AVSHA* context, uint8_t *digest);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_SHA_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/time.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/time.h
new file mode 100644
index 000000000..b01a97d77
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/time.h
@@ -0,0 +1,39 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_TIME_H
+#define AVUTIL_TIME_H
+
+#include <stdint.h>
+
+/**
+ * Get the current time in microseconds.
+ */
+int64_t av_gettime(void);
+
+/**
+ * Sleep for a period of time. Although the duration is expressed in
+ * microseconds, the actual delay may be rounded to the precision of the
+ * system timer.
+ *
+ * @param usec Number of microseconds to sleep.
+ * @return zero on success or (negative) error code.
+ */
+int av_usleep(unsigned usec);
+
+#endif /* AVUTIL_TIME_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/version.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/version.h
new file mode 100644
index 000000000..1dbb11ca2
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/version.h
@@ -0,0 +1,87 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_VERSION_H
+#define AVUTIL_VERSION_H
+
+#include "avutil.h"
+
+/**
+ * @file
+ * @ingroup lavu
+ * Libavutil version macros
+ */
+
+/**
+ * @defgroup lavu_ver Version and Build diagnostics
+ *
+ * Macros and function useful to check at compiletime and at runtime
+ * which version of libavutil is in use.
+ *
+ * @{
+ */
+
+#define LIBAVUTIL_VERSION_MAJOR 52
+#define LIBAVUTIL_VERSION_MINOR 3
+#define LIBAVUTIL_VERSION_MICRO 0
+
+#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT
+
+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
+
+/**
+ * @}
+ *
+ * @defgroup depr_guards Deprecation guards
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *
+ * @{
+ */
+
+#ifndef FF_API_PIX_FMT
+#define FF_API_PIX_FMT (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_CONTEXT_SIZE
+#define FF_API_CONTEXT_SIZE (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_PIX_FMT_DESC
+#define FF_API_PIX_FMT_DESC (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_AV_REVERSE
+#define FF_API_AV_REVERSE (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_AUDIOCONVERT
+#define FF_API_AUDIOCONVERT (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+#ifndef FF_API_CPU_FLAG_MMX2
+#define FF_API_CPU_FLAG_MMX2 (LIBAVUTIL_VERSION_MAJOR < 53)
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_VERSION_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/include/libavutil/xtea.h b/dom/media/platforms/ffmpeg/libav54/include/libavutil/xtea.h
new file mode 100644
index 000000000..7d2b07bbc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/include/libavutil/xtea.h
@@ -0,0 +1,61 @@
+/*
+ * A 32-bit implementation of the XTEA algorithm
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_XTEA_H
+#define AVUTIL_XTEA_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_xtea XTEA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+typedef struct AVXTEA {
+ uint32_t key[16];
+} AVXTEA;
+
+/**
+ * Initialize an AVXTEA context.
+ *
+ * @param ctx an AVXTEA context
+ * @param key a key of 16 bytes used for encryption/decryption
+ */
+void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVXTEA context
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param count number of 8 byte blocks
+ * @param iv initialization vector for CBC mode, if NULL then ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src,
+ int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_XTEA_H */
diff --git a/dom/media/platforms/ffmpeg/libav54/moz.build b/dom/media/platforms/ffmpeg/libav54/moz.build
new file mode 100644
index 000000000..2bdc1dc34
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav54/moz.build
@@ -0,0 +1,23 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ '../FFmpegAudioDecoder.cpp',
+ '../FFmpegDataDecoder.cpp',
+ '../FFmpegDecoderModule.cpp',
+ '../FFmpegVideoDecoder.cpp',
+]
+LOCAL_INCLUDES += [
+ '..',
+ 'include',
+]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['CLANG_CXX']:
+ CXXFLAGS += [
+ '-Wno-unknown-attributes',
+ ]
diff --git a/dom/media/platforms/ffmpeg/libav55/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/libav55/include/COPYING.LGPLv2.1
new file mode 100644
index 000000000..00b4fedfe
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/COPYING.LGPLv2.1
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/avcodec.h
new file mode 100644
index 000000000..244f47ba1
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/avcodec.h
@@ -0,0 +1,4356 @@
+/*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVCODEC_H
+#define AVCODEC_AVCODEC_H
+
+/**
+ * @file
+ * @ingroup libavc
+ * Libavcodec external API header
+ */
+
+#include <errno.h>
+#include "libavutil/samplefmt.h"
+#include "libavutil/attributes.h"
+#include "libavutil/avutil.h"
+#include "libavutil/buffer.h"
+#include "libavutil/cpu.h"
+#include "libavutil/dict.h"
+#include "libavutil/frame.h"
+#include "libavutil/log.h"
+#include "libavutil/pixfmt.h"
+#include "libavutil/rational.h"
+
+#include "version.h"
+
+#if FF_API_FAST_MALLOC
+// to provide fast_*alloc
+#include "libavutil/mem.h"
+#endif
+
+/**
+ * @defgroup libavc Encoding/Decoding Library
+ * @{
+ *
+ * @defgroup lavc_decoding Decoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_encoding Encoding
+ * @{
+ * @}
+ *
+ * @defgroup lavc_codec Codecs
+ * @{
+ * @defgroup lavc_codec_native Native Codecs
+ * @{
+ * @}
+ * @defgroup lavc_codec_wrappers External library wrappers
+ * @{
+ * @}
+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
+ * @{
+ * @}
+ * @}
+ * @defgroup lavc_internal Internal
+ * @{
+ * @}
+ * @}
+ *
+ */
+
+/**
+ * @defgroup lavc_core Core functions/structures.
+ * @ingroup libavc
+ *
+ * Basic definitions, functions for querying libavcodec capabilities,
+ * allocating core structures, etc.
+ * @{
+ */
+
+
+/**
+ * Identify the syntax and semantics of the bitstream.
+ * The principle is roughly:
+ * Two decoders with the same ID can decode the same streams.
+ * Two encoders with the same ID can encode compatible streams.
+ * There may be slight deviations from the principle due to implementation
+ * details.
+ *
+ * If you add a codec ID to this list, add it so that
+ * 1. no value of a existing codec ID changes (that would break ABI),
+ * 2. it is as close as possible to similar codecs.
+ *
+ * After adding new codec IDs, do not forget to add an entry to the codec
+ * descriptor list and bump libavcodec minor version.
+ */
+enum AVCodecID {
+ AV_CODEC_ID_NONE,
+
+ /* video codecs */
+ AV_CODEC_ID_MPEG1VIDEO,
+ AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+#if FF_API_XVMC
+ AV_CODEC_ID_MPEG2VIDEO_XVMC,
+#endif /* FF_API_XVMC */
+ AV_CODEC_ID_H261,
+ AV_CODEC_ID_H263,
+ AV_CODEC_ID_RV10,
+ AV_CODEC_ID_RV20,
+ AV_CODEC_ID_MJPEG,
+ AV_CODEC_ID_MJPEGB,
+ AV_CODEC_ID_LJPEG,
+ AV_CODEC_ID_SP5X,
+ AV_CODEC_ID_JPEGLS,
+ AV_CODEC_ID_MPEG4,
+ AV_CODEC_ID_RAWVIDEO,
+ AV_CODEC_ID_MSMPEG4V1,
+ AV_CODEC_ID_MSMPEG4V2,
+ AV_CODEC_ID_MSMPEG4V3,
+ AV_CODEC_ID_WMV1,
+ AV_CODEC_ID_WMV2,
+ AV_CODEC_ID_H263P,
+ AV_CODEC_ID_H263I,
+ AV_CODEC_ID_FLV1,
+ AV_CODEC_ID_SVQ1,
+ AV_CODEC_ID_SVQ3,
+ AV_CODEC_ID_DVVIDEO,
+ AV_CODEC_ID_HUFFYUV,
+ AV_CODEC_ID_CYUV,
+ AV_CODEC_ID_H264,
+ AV_CODEC_ID_INDEO3,
+ AV_CODEC_ID_VP3,
+ AV_CODEC_ID_THEORA,
+ AV_CODEC_ID_ASV1,
+ AV_CODEC_ID_ASV2,
+ AV_CODEC_ID_FFV1,
+ AV_CODEC_ID_4XM,
+ AV_CODEC_ID_VCR1,
+ AV_CODEC_ID_CLJR,
+ AV_CODEC_ID_MDEC,
+ AV_CODEC_ID_ROQ,
+ AV_CODEC_ID_INTERPLAY_VIDEO,
+ AV_CODEC_ID_XAN_WC3,
+ AV_CODEC_ID_XAN_WC4,
+ AV_CODEC_ID_RPZA,
+ AV_CODEC_ID_CINEPAK,
+ AV_CODEC_ID_WS_VQA,
+ AV_CODEC_ID_MSRLE,
+ AV_CODEC_ID_MSVIDEO1,
+ AV_CODEC_ID_IDCIN,
+ AV_CODEC_ID_8BPS,
+ AV_CODEC_ID_SMC,
+ AV_CODEC_ID_FLIC,
+ AV_CODEC_ID_TRUEMOTION1,
+ AV_CODEC_ID_VMDVIDEO,
+ AV_CODEC_ID_MSZH,
+ AV_CODEC_ID_ZLIB,
+ AV_CODEC_ID_QTRLE,
+ AV_CODEC_ID_TSCC,
+ AV_CODEC_ID_ULTI,
+ AV_CODEC_ID_QDRAW,
+ AV_CODEC_ID_VIXL,
+ AV_CODEC_ID_QPEG,
+ AV_CODEC_ID_PNG,
+ AV_CODEC_ID_PPM,
+ AV_CODEC_ID_PBM,
+ AV_CODEC_ID_PGM,
+ AV_CODEC_ID_PGMYUV,
+ AV_CODEC_ID_PAM,
+ AV_CODEC_ID_FFVHUFF,
+ AV_CODEC_ID_RV30,
+ AV_CODEC_ID_RV40,
+ AV_CODEC_ID_VC1,
+ AV_CODEC_ID_WMV3,
+ AV_CODEC_ID_LOCO,
+ AV_CODEC_ID_WNV1,
+ AV_CODEC_ID_AASC,
+ AV_CODEC_ID_INDEO2,
+ AV_CODEC_ID_FRAPS,
+ AV_CODEC_ID_TRUEMOTION2,
+ AV_CODEC_ID_BMP,
+ AV_CODEC_ID_CSCD,
+ AV_CODEC_ID_MMVIDEO,
+ AV_CODEC_ID_ZMBV,
+ AV_CODEC_ID_AVS,
+ AV_CODEC_ID_SMACKVIDEO,
+ AV_CODEC_ID_NUV,
+ AV_CODEC_ID_KMVC,
+ AV_CODEC_ID_FLASHSV,
+ AV_CODEC_ID_CAVS,
+ AV_CODEC_ID_JPEG2000,
+ AV_CODEC_ID_VMNC,
+ AV_CODEC_ID_VP5,
+ AV_CODEC_ID_VP6,
+ AV_CODEC_ID_VP6F,
+ AV_CODEC_ID_TARGA,
+ AV_CODEC_ID_DSICINVIDEO,
+ AV_CODEC_ID_TIERTEXSEQVIDEO,
+ AV_CODEC_ID_TIFF,
+ AV_CODEC_ID_GIF,
+ AV_CODEC_ID_DXA,
+ AV_CODEC_ID_DNXHD,
+ AV_CODEC_ID_THP,
+ AV_CODEC_ID_SGI,
+ AV_CODEC_ID_C93,
+ AV_CODEC_ID_BETHSOFTVID,
+ AV_CODEC_ID_PTX,
+ AV_CODEC_ID_TXD,
+ AV_CODEC_ID_VP6A,
+ AV_CODEC_ID_AMV,
+ AV_CODEC_ID_VB,
+ AV_CODEC_ID_PCX,
+ AV_CODEC_ID_SUNRAST,
+ AV_CODEC_ID_INDEO4,
+ AV_CODEC_ID_INDEO5,
+ AV_CODEC_ID_MIMIC,
+ AV_CODEC_ID_RL2,
+ AV_CODEC_ID_ESCAPE124,
+ AV_CODEC_ID_DIRAC,
+ AV_CODEC_ID_BFI,
+ AV_CODEC_ID_CMV,
+ AV_CODEC_ID_MOTIONPIXELS,
+ AV_CODEC_ID_TGV,
+ AV_CODEC_ID_TGQ,
+ AV_CODEC_ID_TQI,
+ AV_CODEC_ID_AURA,
+ AV_CODEC_ID_AURA2,
+ AV_CODEC_ID_V210X,
+ AV_CODEC_ID_TMV,
+ AV_CODEC_ID_V210,
+ AV_CODEC_ID_DPX,
+ AV_CODEC_ID_MAD,
+ AV_CODEC_ID_FRWU,
+ AV_CODEC_ID_FLASHSV2,
+ AV_CODEC_ID_CDGRAPHICS,
+ AV_CODEC_ID_R210,
+ AV_CODEC_ID_ANM,
+ AV_CODEC_ID_BINKVIDEO,
+ AV_CODEC_ID_IFF_ILBM,
+ AV_CODEC_ID_IFF_BYTERUN1,
+ AV_CODEC_ID_KGV1,
+ AV_CODEC_ID_YOP,
+ AV_CODEC_ID_VP8,
+ AV_CODEC_ID_PICTOR,
+ AV_CODEC_ID_ANSI,
+ AV_CODEC_ID_A64_MULTI,
+ AV_CODEC_ID_A64_MULTI5,
+ AV_CODEC_ID_R10K,
+ AV_CODEC_ID_MXPEG,
+ AV_CODEC_ID_LAGARITH,
+ AV_CODEC_ID_PRORES,
+ AV_CODEC_ID_JV,
+ AV_CODEC_ID_DFA,
+ AV_CODEC_ID_WMV3IMAGE,
+ AV_CODEC_ID_VC1IMAGE,
+ AV_CODEC_ID_UTVIDEO,
+ AV_CODEC_ID_BMV_VIDEO,
+ AV_CODEC_ID_VBLE,
+ AV_CODEC_ID_DXTORY,
+ AV_CODEC_ID_V410,
+ AV_CODEC_ID_XWD,
+ AV_CODEC_ID_CDXL,
+ AV_CODEC_ID_XBM,
+ AV_CODEC_ID_ZEROCODEC,
+ AV_CODEC_ID_MSS1,
+ AV_CODEC_ID_MSA1,
+ AV_CODEC_ID_TSCC2,
+ AV_CODEC_ID_MTS2,
+ AV_CODEC_ID_CLLC,
+ AV_CODEC_ID_MSS2,
+ AV_CODEC_ID_VP9,
+ AV_CODEC_ID_AIC,
+ AV_CODEC_ID_ESCAPE130,
+ AV_CODEC_ID_G2M,
+ AV_CODEC_ID_WEBP,
+ AV_CODEC_ID_HNM4_VIDEO,
+ AV_CODEC_ID_HEVC,
+ AV_CODEC_ID_FIC,
+
+ /* various PCM "codecs" */
+ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ AV_CODEC_ID_PCM_S16LE = 0x10000,
+ AV_CODEC_ID_PCM_S16BE,
+ AV_CODEC_ID_PCM_U16LE,
+ AV_CODEC_ID_PCM_U16BE,
+ AV_CODEC_ID_PCM_S8,
+ AV_CODEC_ID_PCM_U8,
+ AV_CODEC_ID_PCM_MULAW,
+ AV_CODEC_ID_PCM_ALAW,
+ AV_CODEC_ID_PCM_S32LE,
+ AV_CODEC_ID_PCM_S32BE,
+ AV_CODEC_ID_PCM_U32LE,
+ AV_CODEC_ID_PCM_U32BE,
+ AV_CODEC_ID_PCM_S24LE,
+ AV_CODEC_ID_PCM_S24BE,
+ AV_CODEC_ID_PCM_U24LE,
+ AV_CODEC_ID_PCM_U24BE,
+ AV_CODEC_ID_PCM_S24DAUD,
+ AV_CODEC_ID_PCM_ZORK,
+ AV_CODEC_ID_PCM_S16LE_PLANAR,
+ AV_CODEC_ID_PCM_DVD,
+ AV_CODEC_ID_PCM_F32BE,
+ AV_CODEC_ID_PCM_F32LE,
+ AV_CODEC_ID_PCM_F64BE,
+ AV_CODEC_ID_PCM_F64LE,
+ AV_CODEC_ID_PCM_BLURAY,
+ AV_CODEC_ID_PCM_LXF,
+ AV_CODEC_ID_S302M,
+ AV_CODEC_ID_PCM_S8_PLANAR,
+ AV_CODEC_ID_PCM_S24LE_PLANAR,
+ AV_CODEC_ID_PCM_S32LE_PLANAR,
+
+ /* various ADPCM codecs */
+ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ AV_CODEC_ID_ADPCM_IMA_WAV,
+ AV_CODEC_ID_ADPCM_IMA_DK3,
+ AV_CODEC_ID_ADPCM_IMA_DK4,
+ AV_CODEC_ID_ADPCM_IMA_WS,
+ AV_CODEC_ID_ADPCM_IMA_SMJPEG,
+ AV_CODEC_ID_ADPCM_MS,
+ AV_CODEC_ID_ADPCM_4XM,
+ AV_CODEC_ID_ADPCM_XA,
+ AV_CODEC_ID_ADPCM_ADX,
+ AV_CODEC_ID_ADPCM_EA,
+ AV_CODEC_ID_ADPCM_G726,
+ AV_CODEC_ID_ADPCM_CT,
+ AV_CODEC_ID_ADPCM_SWF,
+ AV_CODEC_ID_ADPCM_YAMAHA,
+ AV_CODEC_ID_ADPCM_SBPRO_4,
+ AV_CODEC_ID_ADPCM_SBPRO_3,
+ AV_CODEC_ID_ADPCM_SBPRO_2,
+ AV_CODEC_ID_ADPCM_THP,
+ AV_CODEC_ID_ADPCM_IMA_AMV,
+ AV_CODEC_ID_ADPCM_EA_R1,
+ AV_CODEC_ID_ADPCM_EA_R3,
+ AV_CODEC_ID_ADPCM_EA_R2,
+ AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
+ AV_CODEC_ID_ADPCM_IMA_EA_EACS,
+ AV_CODEC_ID_ADPCM_EA_XAS,
+ AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
+ AV_CODEC_ID_ADPCM_IMA_ISS,
+ AV_CODEC_ID_ADPCM_G722,
+ AV_CODEC_ID_ADPCM_IMA_APC,
+
+ /* AMR */
+ AV_CODEC_ID_AMR_NB = 0x12000,
+ AV_CODEC_ID_AMR_WB,
+
+ /* RealAudio codecs*/
+ AV_CODEC_ID_RA_144 = 0x13000,
+ AV_CODEC_ID_RA_288,
+
+ /* various DPCM codecs */
+ AV_CODEC_ID_ROQ_DPCM = 0x14000,
+ AV_CODEC_ID_INTERPLAY_DPCM,
+ AV_CODEC_ID_XAN_DPCM,
+ AV_CODEC_ID_SOL_DPCM,
+
+ /* audio codecs */
+ AV_CODEC_ID_MP2 = 0x15000,
+ AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+ AV_CODEC_ID_AAC,
+ AV_CODEC_ID_AC3,
+ AV_CODEC_ID_DTS,
+ AV_CODEC_ID_VORBIS,
+ AV_CODEC_ID_DVAUDIO,
+ AV_CODEC_ID_WMAV1,
+ AV_CODEC_ID_WMAV2,
+ AV_CODEC_ID_MACE3,
+ AV_CODEC_ID_MACE6,
+ AV_CODEC_ID_VMDAUDIO,
+ AV_CODEC_ID_FLAC,
+ AV_CODEC_ID_MP3ADU,
+ AV_CODEC_ID_MP3ON4,
+ AV_CODEC_ID_SHORTEN,
+ AV_CODEC_ID_ALAC,
+ AV_CODEC_ID_WESTWOOD_SND1,
+ AV_CODEC_ID_GSM, ///< as in Berlin toast format
+ AV_CODEC_ID_QDM2,
+ AV_CODEC_ID_COOK,
+ AV_CODEC_ID_TRUESPEECH,
+ AV_CODEC_ID_TTA,
+ AV_CODEC_ID_SMACKAUDIO,
+ AV_CODEC_ID_QCELP,
+ AV_CODEC_ID_WAVPACK,
+ AV_CODEC_ID_DSICINAUDIO,
+ AV_CODEC_ID_IMC,
+ AV_CODEC_ID_MUSEPACK7,
+ AV_CODEC_ID_MLP,
+ AV_CODEC_ID_GSM_MS, /* as found in WAV */
+ AV_CODEC_ID_ATRAC3,
+#if FF_API_VOXWARE
+ AV_CODEC_ID_VOXWARE,
+#endif
+ AV_CODEC_ID_APE,
+ AV_CODEC_ID_NELLYMOSER,
+ AV_CODEC_ID_MUSEPACK8,
+ AV_CODEC_ID_SPEEX,
+ AV_CODEC_ID_WMAVOICE,
+ AV_CODEC_ID_WMAPRO,
+ AV_CODEC_ID_WMALOSSLESS,
+ AV_CODEC_ID_ATRAC3P,
+ AV_CODEC_ID_EAC3,
+ AV_CODEC_ID_SIPR,
+ AV_CODEC_ID_MP1,
+ AV_CODEC_ID_TWINVQ,
+ AV_CODEC_ID_TRUEHD,
+ AV_CODEC_ID_MP4ALS,
+ AV_CODEC_ID_ATRAC1,
+ AV_CODEC_ID_BINKAUDIO_RDFT,
+ AV_CODEC_ID_BINKAUDIO_DCT,
+ AV_CODEC_ID_AAC_LATM,
+ AV_CODEC_ID_QDMC,
+ AV_CODEC_ID_CELT,
+ AV_CODEC_ID_G723_1,
+ AV_CODEC_ID_G729,
+ AV_CODEC_ID_8SVX_EXP,
+ AV_CODEC_ID_8SVX_FIB,
+ AV_CODEC_ID_BMV_AUDIO,
+ AV_CODEC_ID_RALF,
+ AV_CODEC_ID_IAC,
+ AV_CODEC_ID_ILBC,
+ AV_CODEC_ID_OPUS,
+ AV_CODEC_ID_COMFORT_NOISE,
+ AV_CODEC_ID_TAK,
+ AV_CODEC_ID_METASOUND,
+
+ /* subtitle codecs */
+ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+ AV_CODEC_ID_DVD_SUBTITLE = 0x17000,
+ AV_CODEC_ID_DVB_SUBTITLE,
+ AV_CODEC_ID_TEXT, ///< raw UTF-8 text
+ AV_CODEC_ID_XSUB,
+ AV_CODEC_ID_SSA,
+ AV_CODEC_ID_MOV_TEXT,
+ AV_CODEC_ID_HDMV_PGS_SUBTITLE,
+ AV_CODEC_ID_DVB_TELETEXT,
+ AV_CODEC_ID_SRT,
+
+ /* other specific kind of codecs (generally used for attachments) */
+ AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
+ AV_CODEC_ID_TTF = 0x18000,
+
+ AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
+
+ AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+ * stream (only used by libavformat) */
+ AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+ * stream (only used by libavformat) */
+ AV_CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information.
+};
+
+/**
+ * This struct describes the properties of a single codec described by an
+ * AVCodecID.
+ * @see avcodec_get_descriptor()
+ */
+typedef struct AVCodecDescriptor {
+ enum AVCodecID id;
+ enum AVMediaType type;
+ /**
+ * Name of the codec described by this descriptor. It is non-empty and
+ * unique for each codec descriptor. It should contain alphanumeric
+ * characters and '_' only.
+ */
+ const char *name;
+ /**
+ * A more descriptive name for this codec. May be NULL.
+ */
+ const char *long_name;
+ /**
+ * Codec properties, a combination of AV_CODEC_PROP_* flags.
+ */
+ int props;
+} AVCodecDescriptor;
+
+/**
+ * Codec uses only intra compression.
+ * Video codecs only.
+ */
+#define AV_CODEC_PROP_INTRA_ONLY (1 << 0)
+/**
+ * Codec supports lossy compression. Audio and video codecs only.
+ * @note a codec may support both lossy and lossless
+ * compression modes
+ */
+#define AV_CODEC_PROP_LOSSY (1 << 1)
+/**
+ * Codec supports lossless compression. Audio and video codecs only.
+ */
+#define AV_CODEC_PROP_LOSSLESS (1 << 2)
+
+/**
+ * @ingroup lavc_decoding
+ * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
+ * This is mainly needed because some optimized bitstream readers read
+ * 32 or 64 bit at once and could read over the end.<br>
+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged
+ * MPEG bitstreams could cause overread and segfault.
+ */
+#define FF_INPUT_BUFFER_PADDING_SIZE 8
+
+/**
+ * @ingroup lavc_encoding
+ * minimum encoding buffer size
+ * Used to avoid some checks during header writing.
+ */
+#define FF_MIN_BUFFER_SIZE 16384
+
+
+/**
+ * @ingroup lavc_encoding
+ * motion estimation type.
+ */
+enum Motion_Est_ID {
+ ME_ZERO = 1, ///< no search, that is use 0,0 vector whenever one is needed
+ ME_FULL,
+ ME_LOG,
+ ME_PHODS,
+ ME_EPZS, ///< enhanced predictive zonal search
+ ME_X1, ///< reserved for experiments
+ ME_HEX, ///< hexagon based search
+ ME_UMH, ///< uneven multi-hexagon search
+ ME_TESA, ///< transformed exhaustive search algorithm
+};
+
+/**
+ * @ingroup lavc_decoding
+ */
+enum AVDiscard{
+ /* We leave some space between them for extensions (drop some
+ * keyframes for intra-only or drop just some bidir frames). */
+ AVDISCARD_NONE =-16, ///< discard nothing
+ AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi
+ AVDISCARD_NONREF = 8, ///< discard all non reference
+ AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
+ AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
+ AVDISCARD_ALL = 48, ///< discard all
+};
+
+enum AVColorPrimaries{
+ AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B
+ AVCOL_PRI_UNSPECIFIED = 2,
+ AVCOL_PRI_BT470M = 4,
+ AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
+ AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above
+ AVCOL_PRI_FILM = 8,
+ AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020
+ AVCOL_PRI_NB , ///< Not part of ABI
+};
+
+enum AVColorTransferCharacteristic{
+ AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361
+ AVCOL_TRC_UNSPECIFIED = 2,
+ AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
+ AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG
+ AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
+ AVCOL_TRC_SMPTE240M = 7,
+ AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics"
+ AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)"
+ AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt( 10 ) : 1 range)"
+ AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4
+ AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut
+ AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC)
+ AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system
+ AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system
+ AVCOL_TRC_NB , ///< Not part of ABI
+};
+
+enum AVColorSpace{
+ AVCOL_SPC_RGB = 0,
+ AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
+ AVCOL_SPC_UNSPECIFIED = 2,
+ AVCOL_SPC_FCC = 4,
+ AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
+ AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
+ AVCOL_SPC_SMPTE240M = 7,
+ AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
+ AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system
+ AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system
+ AVCOL_SPC_NB , ///< Not part of ABI
+};
+
+enum AVColorRange{
+ AVCOL_RANGE_UNSPECIFIED = 0,
+ AVCOL_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges
+ AVCOL_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges
+ AVCOL_RANGE_NB , ///< Not part of ABI
+};
+
+/**
+ * X X 3 4 X X are luma samples,
+ * 1 2 1-6 are possible chroma positions
+ * X X 5 6 X 0 is undefined/unknown position
+ */
+enum AVChromaLocation{
+ AVCHROMA_LOC_UNSPECIFIED = 0,
+ AVCHROMA_LOC_LEFT = 1, ///< mpeg2/4, h264 default
+ AVCHROMA_LOC_CENTER = 2, ///< mpeg1, jpeg, h263
+ AVCHROMA_LOC_TOPLEFT = 3, ///< DV
+ AVCHROMA_LOC_TOP = 4,
+ AVCHROMA_LOC_BOTTOMLEFT = 5,
+ AVCHROMA_LOC_BOTTOM = 6,
+ AVCHROMA_LOC_NB , ///< Not part of ABI
+};
+
+enum AVAudioServiceType {
+ AV_AUDIO_SERVICE_TYPE_MAIN = 0,
+ AV_AUDIO_SERVICE_TYPE_EFFECTS = 1,
+ AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
+ AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3,
+ AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4,
+ AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5,
+ AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6,
+ AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7,
+ AV_AUDIO_SERVICE_TYPE_KARAOKE = 8,
+ AV_AUDIO_SERVICE_TYPE_NB , ///< Not part of ABI
+};
+
+/**
+ * @ingroup lavc_encoding
+ */
+typedef struct RcOverride{
+ int start_frame;
+ int end_frame;
+ int qscale; // If this is 0 then quality_factor will be used instead.
+ float quality_factor;
+} RcOverride;
+
+#if FF_API_MAX_BFRAMES
+/**
+ * @deprecated there is no libavcodec-wide limit on the number of B-frames
+ */
+#define FF_MAX_B_FRAMES 16
+#endif
+
+/* encoding support
+ These flags can be passed in AVCodecContext.flags before initialization.
+ Note: Not everything is supported yet.
+*/
+
+/**
+ * Allow decoders to produce frames with data planes that are not aligned
+ * to CPU requirements (e.g. due to cropping).
+ */
+#define CODEC_FLAG_UNALIGNED 0x0001
+#define CODEC_FLAG_QSCALE 0x0002 ///< Use fixed qscale.
+#define CODEC_FLAG_4MV 0x0004 ///< 4 MV per MB allowed / advanced prediction for H.263.
+#define CODEC_FLAG_OUTPUT_CORRUPT 0x0008 ///< Output even those frames that might be corrupted
+#define CODEC_FLAG_QPEL 0x0010 ///< Use qpel MC.
+#define CODEC_FLAG_GMC 0x0020 ///< Use GMC.
+#define CODEC_FLAG_MV0 0x0040 ///< Always try a MB with MV=<0,0>.
+/**
+ * The parent program guarantees that the input for B-frames containing
+ * streams is not written to for at least s->max_b_frames+1 frames, if
+ * this is not set the input will be copied.
+ */
+#define CODEC_FLAG_INPUT_PRESERVED 0x0100
+#define CODEC_FLAG_PASS1 0x0200 ///< Use internal 2pass ratecontrol in first pass mode.
+#define CODEC_FLAG_PASS2 0x0400 ///< Use internal 2pass ratecontrol in second pass mode.
+#define CODEC_FLAG_GRAY 0x2000 ///< Only decode/encode grayscale.
+#if FF_API_EMU_EDGE
+/**
+ * @deprecated edges are not used/required anymore. I.e. this flag is now always
+ * set.
+ */
+#define CODEC_FLAG_EMU_EDGE 0x4000
+#endif
+#define CODEC_FLAG_PSNR 0x8000 ///< error[?] variables will be set during encoding.
+#define CODEC_FLAG_TRUNCATED 0x00010000 /** Input bitstream might be truncated at a random
+ location instead of only at frame boundaries. */
+#define CODEC_FLAG_NORMALIZE_AQP 0x00020000 ///< Normalize adaptive quantization.
+#define CODEC_FLAG_INTERLACED_DCT 0x00040000 ///< Use interlaced DCT.
+#define CODEC_FLAG_LOW_DELAY 0x00080000 ///< Force low delay.
+#define CODEC_FLAG_GLOBAL_HEADER 0x00400000 ///< Place global headers in extradata instead of every keyframe.
+#define CODEC_FLAG_BITEXACT 0x00800000 ///< Use only bitexact stuff (except (I)DCT).
+/* Fx : Flag for h263+ extra options */
+#define CODEC_FLAG_AC_PRED 0x01000000 ///< H.263 advanced intra coding / MPEG-4 AC prediction
+#define CODEC_FLAG_LOOP_FILTER 0x00000800 ///< loop filter
+#define CODEC_FLAG_INTERLACED_ME 0x20000000 ///< interlaced motion estimation
+#define CODEC_FLAG_CLOSED_GOP 0x80000000
+#define CODEC_FLAG2_FAST 0x00000001 ///< Allow non spec compliant speedup tricks.
+#define CODEC_FLAG2_NO_OUTPUT 0x00000004 ///< Skip bitstream encoding.
+#define CODEC_FLAG2_LOCAL_HEADER 0x00000008 ///< Place global headers at every keyframe instead of in extradata.
+#define CODEC_FLAG2_IGNORE_CROP 0x00010000 ///< Discard cropping information from SPS.
+
+#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
+
+/* Unsupported options :
+ * Syntax Arithmetic coding (SAC)
+ * Reference Picture Selection
+ * Independent Segment Decoding */
+/* /Fx */
+/* codec capabilities */
+
+#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001 ///< Decoder can use draw_horiz_band callback.
+/**
+ * Codec uses get_buffer() for allocating buffers and supports custom allocators.
+ * If not set, it might not use get_buffer() at all or use operations that
+ * assume the buffer was allocated by avcodec_default_get_buffer.
+ */
+#define CODEC_CAP_DR1 0x0002
+#define CODEC_CAP_TRUNCATED 0x0008
+#if FF_API_XVMC
+/* Codec can export data for HW decoding (XvMC). */
+#define CODEC_CAP_HWACCEL 0x0010
+#endif /* FF_API_XVMC */
+/**
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+ *
+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
+ * with NULL data. The user can still send NULL data to the public encode
+ * or decode function, but libavcodec will not pass it along to the codec
+ * unless this flag is set.
+ *
+ * Decoders:
+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
+ * returns frames.
+ *
+ * Encoders:
+ * The encoder needs to be fed with NULL data at the end of encoding until the
+ * encoder no longer returns data.
+ *
+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
+ * flag also means that the encoder must set the pts and duration for
+ * each output packet. If this flag is not set, the pts and duration will
+ * be determined by libavcodec from the input frame.
+ */
+#define CODEC_CAP_DELAY 0x0020
+/**
+ * Codec can be fed a final frame with a smaller size.
+ * This can be used to prevent truncation of the last audio samples.
+ */
+#define CODEC_CAP_SMALL_LAST_FRAME 0x0040
+#if FF_API_CAP_VDPAU
+/**
+ * Codec can export data for HW decoding (VDPAU).
+ */
+#define CODEC_CAP_HWACCEL_VDPAU 0x0080
+#endif
+/**
+ * Codec can output multiple frames per AVPacket
+ * Normally demuxers return one frame at a time, demuxers which do not do
+ * are connected to a parser to split what they return into proper frames.
+ * This flag is reserved to the very rare category of codecs which have a
+ * bitstream that cannot be split into frames without timeconsuming
+ * operations like full decoding. Demuxers carring such bitstreams thus
+ * may return multiple frames in a packet. This has many disadvantages like
+ * prohibiting stream copy in many cases thus it should only be considered
+ * as a last resort.
+ */
+#define CODEC_CAP_SUBFRAMES 0x0100
+/**
+ * Codec is experimental and is thus avoided in favor of non experimental
+ * encoders
+ */
+#define CODEC_CAP_EXPERIMENTAL 0x0200
+/**
+ * Codec should fill in channel configuration and samplerate instead of container
+ */
+#define CODEC_CAP_CHANNEL_CONF 0x0400
+#if FF_API_NEG_LINESIZES
+/**
+ * @deprecated no codecs use this capability
+ */
+#define CODEC_CAP_NEG_LINESIZES 0x0800
+#endif
+/**
+ * Codec supports frame-level multithreading.
+ */
+#define CODEC_CAP_FRAME_THREADS 0x1000
+/**
+ * Codec supports slice-based (or partition-based) multithreading.
+ */
+#define CODEC_CAP_SLICE_THREADS 0x2000
+/**
+ * Codec supports changed parameters at any point.
+ */
+#define CODEC_CAP_PARAM_CHANGE 0x4000
+/**
+ * Codec supports avctx->thread_count == 0 (auto).
+ */
+#define CODEC_CAP_AUTO_THREADS 0x8000
+/**
+ * Audio encoder supports receiving a different number of samples in each call.
+ */
+#define CODEC_CAP_VARIABLE_FRAME_SIZE 0x10000
+
+#if FF_API_MB_TYPE
+//The following defines may change, don't expect compatibility if you use them.
+#define MB_TYPE_INTRA4x4 0x0001
+#define MB_TYPE_INTRA16x16 0x0002 //FIXME H.264-specific
+#define MB_TYPE_INTRA_PCM 0x0004 //FIXME H.264-specific
+#define MB_TYPE_16x16 0x0008
+#define MB_TYPE_16x8 0x0010
+#define MB_TYPE_8x16 0x0020
+#define MB_TYPE_8x8 0x0040
+#define MB_TYPE_INTERLACED 0x0080
+#define MB_TYPE_DIRECT2 0x0100 //FIXME
+#define MB_TYPE_ACPRED 0x0200
+#define MB_TYPE_GMC 0x0400
+#define MB_TYPE_SKIP 0x0800
+#define MB_TYPE_P0L0 0x1000
+#define MB_TYPE_P1L0 0x2000
+#define MB_TYPE_P0L1 0x4000
+#define MB_TYPE_P1L1 0x8000
+#define MB_TYPE_L0 (MB_TYPE_P0L0 | MB_TYPE_P1L0)
+#define MB_TYPE_L1 (MB_TYPE_P0L1 | MB_TYPE_P1L1)
+#define MB_TYPE_L0L1 (MB_TYPE_L0 | MB_TYPE_L1)
+#define MB_TYPE_QUANT 0x00010000
+#define MB_TYPE_CBP 0x00020000
+//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv, ...)
+#endif
+
+/**
+ * Pan Scan area.
+ * This specifies the area which should be displayed.
+ * Note there may be multiple such areas for one frame.
+ */
+typedef struct AVPanScan{
+ /**
+ * id
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int id;
+
+ /**
+ * width and height in 1/16 pel
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int width;
+ int height;
+
+ /**
+ * position of the top left corner in 1/16 pel for up to 3 fields/frames
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t position[3][2];
+}AVPanScan;
+
+#if FF_API_QSCALE_TYPE
+#define FF_QSCALE_TYPE_MPEG1 0
+#define FF_QSCALE_TYPE_MPEG2 1
+#define FF_QSCALE_TYPE_H264 2
+#define FF_QSCALE_TYPE_VP56 3
+#endif
+
+#if FF_API_GET_BUFFER
+#define FF_BUFFER_TYPE_INTERNAL 1
+#define FF_BUFFER_TYPE_USER 2 ///< direct rendering buffers (image is (de)allocated by user)
+#define FF_BUFFER_TYPE_SHARED 4 ///< Buffer from somewhere else; don't deallocate image (data/base), all other tables are not shared.
+#define FF_BUFFER_TYPE_COPY 8 ///< Just a (modified) copy of some other buffer, don't deallocate anything.
+
+#define FF_BUFFER_HINTS_VALID 0x01 // Buffer hints value is meaningful (if 0 ignore).
+#define FF_BUFFER_HINTS_READABLE 0x02 // Codec will read from buffer.
+#define FF_BUFFER_HINTS_PRESERVE 0x04 // User must not alter buffer content.
+#define FF_BUFFER_HINTS_REUSABLE 0x08 // Codec will reuse the buffer (update).
+#endif
+
+/**
+ * The decoder will keep a reference to the frame and may reuse it later.
+ */
+#define AV_GET_BUFFER_FLAG_REF (1 << 0)
+
+/**
+ * @defgroup lavc_packet AVPacket
+ *
+ * Types and functions for working with AVPacket.
+ * @{
+ */
+enum AVPacketSideDataType {
+ AV_PKT_DATA_PALETTE,
+ AV_PKT_DATA_NEW_EXTRADATA,
+
+ /**
+ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+ * @code
+ * u32le param_flags
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+ * s32le channel_count
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+ * u64le channel_layout
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+ * s32le sample_rate
+ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+ * s32le width
+ * s32le height
+ * @endcode
+ */
+ AV_PKT_DATA_PARAM_CHANGE,
+
+ /**
+ * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
+ * structures with info about macroblocks relevant to splitting the
+ * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
+ * That is, it does not necessarily contain info about all macroblocks,
+ * as long as the distance between macroblocks in the info is smaller
+ * than the target payload size.
+ * Each MB info structure is 12 bytes, and is laid out as follows:
+ * @code
+ * u32le bit offset from the start of the packet
+ * u8 current quantizer at the start of the macroblock
+ * u8 GOB number
+ * u16le macroblock address within the GOB
+ * u8 horizontal MV predictor
+ * u8 vertical MV predictor
+ * u8 horizontal MV predictor for block number 3
+ * u8 vertical MV predictor for block number 3
+ * @endcode
+ */
+ AV_PKT_DATA_H263_MB_INFO,
+};
+
+/**
+ * This structure stores compressed data. It is typically exported by demuxers
+ * and then passed as input to decoders, or received as output from encoders and
+ * then passed to muxers.
+ *
+ * For video, it should typically contain one compressed frame. For audio it may
+ * contain several compressed frames.
+ *
+ * AVPacket is one of the few structs in Libav, whose size is a part of public
+ * ABI. Thus it may be allocated on stack and no new fields can be added to it
+ * without libavcodec and libavformat major bump.
+ *
+ * The semantics of data ownership depends on the buf or destruct (deprecated)
+ * fields. If either is set, the packet data is dynamically allocated and is
+ * valid indefinitely until av_free_packet() is called (which in turn calls
+ * av_buffer_unref()/the destruct callback to free the data). If neither is set,
+ * the packet data is typically backed by some static buffer somewhere and is
+ * only valid for a limited time (e.g. until the next read call when demuxing).
+ *
+ * The side data is always allocated with av_malloc() and is freed in
+ * av_free_packet().
+ */
+typedef struct AVPacket {
+ /**
+ * A reference to the reference-counted buffer where the packet data is
+ * stored.
+ * May be NULL, then the packet data is not reference-counted.
+ */
+ AVBufferRef *buf;
+ /**
+ * Presentation timestamp in AVStream->time_base units; the time at which
+ * the decompressed packet will be presented to the user.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ * pts MUST be larger or equal to dts as presentation cannot happen before
+ * decompression, unless one wants to view hex dumps. Some formats misuse
+ * the terms dts and pts/cts to mean something different. Such timestamps
+ * must be converted to true pts/dts before they are stored in AVPacket.
+ */
+ int64_t pts;
+ /**
+ * Decompression timestamp in AVStream->time_base units; the time at which
+ * the packet is decompressed.
+ * Can be AV_NOPTS_VALUE if it is not stored in the file.
+ */
+ int64_t dts;
+ uint8_t *data;
+ int size;
+ int stream_index;
+ /**
+ * A combination of AV_PKT_FLAG values
+ */
+ int flags;
+ /**
+ * Additional packet data that can be provided by the container.
+ * Packet can contain several types of side information.
+ */
+ struct {
+ uint8_t *data;
+ int size;
+ enum AVPacketSideDataType type;
+ } *side_data;
+ int side_data_elems;
+
+ /**
+ * Duration of this packet in AVStream->time_base units, 0 if unknown.
+ * Equals next_pts - this_pts in presentation order.
+ */
+ int duration;
+#if FF_API_DESTRUCT_PACKET
+ attribute_deprecated
+ void (*destruct)(struct AVPacket *);
+ attribute_deprecated
+ void *priv;
+#endif
+ int64_t pos; ///< byte position in stream, -1 if unknown
+
+ /**
+ * Time difference in AVStream->time_base units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * independent from the availability of previous frames. That is, the
+ * frames are virtually identical no matter if decoding started from
+ * the very first frame or from this keyframe.
+ * Is AV_NOPTS_VALUE if unknown.
+ * This field is not the display duration of the current packet.
+ * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
+ * set.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
+} AVPacket;
+#define AV_PKT_FLAG_KEY 0x0001 ///< The packet contains a keyframe
+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
+
+enum AVSideDataParamChangeFlags {
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001,
+ AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004,
+ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008,
+};
+/**
+ * @}
+ */
+
+struct AVCodecInternal;
+
+enum AVFieldOrder {
+ AV_FIELD_UNKNOWN,
+ AV_FIELD_PROGRESSIVE,
+ AV_FIELD_TT, //< Top coded_first, top displayed first
+ AV_FIELD_BB, //< Bottom coded first, bottom displayed first
+ AV_FIELD_TB, //< Top coded first, bottom displayed first
+ AV_FIELD_BT, //< Bottom coded first, top displayed first
+};
+
+/**
+ * main external API structure.
+ * New fields can be added to the end with minor version bumps.
+ * Removal, reordering and changes to existing fields require a major
+ * version bump.
+ * sizeof(AVCodecContext) must not be used outside libav*.
+ */
+typedef struct AVCodecContext {
+ /**
+ * information on struct for av_log
+ * - set by avcodec_alloc_context3
+ */
+ const AVClass *av_class;
+ int log_level_offset;
+
+ enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
+ const struct AVCodec *codec;
+ char codec_name[32];
+ enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
+
+ /**
+ * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * A demuxer should set this to what is stored in the field used to identify the codec.
+ * If there are multiple such fields in a container then the demuxer should choose the one
+ * which maximizes the information about the used codec.
+ * If the codec tag field in a container is larger than 32 bits then the demuxer should
+ * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
+ * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
+ * first.
+ * - encoding: Set by user, if not then the default based on codec_id will be used.
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int codec_tag;
+
+ /**
+ * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
+ * This is used to work around some encoder bugs.
+ * - encoding: unused
+ * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+ */
+ unsigned int stream_codec_tag;
+
+ void *priv_data;
+
+ /**
+ * Private context used for internal data.
+ *
+ * Unlike priv_data, this is not codec-specific. It is used in general
+ * libavcodec functions.
+ */
+ struct AVCodecInternal *internal;
+
+ /**
+ * Private data of the user, can be used to carry app specific stuff.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ /**
+ * the average bitrate
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the stream.
+ */
+ int bit_rate;
+
+ /**
+ * number of bits the bitstream is allowed to diverge from the reference.
+ * the reference can be CBR (for CBR pass1) or VBR (for pass2)
+ * - encoding: Set by user; unused for constant quantizer encoding.
+ * - decoding: unused
+ */
+ int bit_rate_tolerance;
+
+ /**
+ * Global quality for codecs which cannot change it per frame.
+ * This should be proportional to MPEG-1/2/4 qscale.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int global_quality;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int compression_level;
+#define FF_COMPRESSION_DEFAULT -1
+
+ /**
+ * CODEC_FLAG_*.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags;
+
+ /**
+ * CODEC_FLAG2_*
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int flags2;
+
+ /**
+ * some codecs need / can use extradata like Huffman tables.
+ * mjpeg: Huffman tables
+ * rv10: additional flags
+ * mpeg4: global headers (they can be in the bitstream or here)
+ * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger
+ * than extradata_size to avoid prolems if it is read with the bitstream reader.
+ * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
+ * - encoding: Set/allocated/freed by libavcodec.
+ * - decoding: Set/allocated/freed by user.
+ */
+ uint8_t *extradata;
+ int extradata_size;
+
+ /**
+ * This is the fundamental unit of time (in seconds) in terms
+ * of which frame timestamps are represented. For fixed-fps content,
+ * timebase should be 1/framerate and timestamp increments should be
+ * identically 1.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational time_base;
+
+ /**
+ * For some codecs, the time base is closer to the field rate than the frame rate.
+ * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
+ * if no telecine is used ...
+ *
+ * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
+ */
+ int ticks_per_frame;
+
+ /**
+ * Codec delay.
+ *
+ * Video:
+ * Number of frames the decoded output will be delayed relative to the
+ * encoded input.
+ *
+ * Audio:
+ * For encoding, this is the number of "priming" samples added to the
+ * beginning of the stream. The decoded output will be delayed by this
+ * many samples relative to the input to the encoder. Note that this
+ * field is purely informational and does not directly affect the pts
+ * output by the encoder, which should always be based on the actual
+ * presentation time, including any delay.
+ * For decoding, this is the number of samples the decoder needs to
+ * output before the decoder's output is valid. When seeking, you should
+ * start decoding this many samples prior to your desired seek point.
+ *
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int delay;
+
+
+ /* video only */
+ /**
+ * picture width / height.
+ * - encoding: MUST be set by user.
+ * - decoding: May be set by the user before opening the decoder if known e.g.
+ * from the container. Some decoders will require the dimensions
+ * to be set by the caller. During decoding, the decoder may
+ * overwrite those values as required.
+ */
+ int width, height;
+
+ /**
+ * Bitstream width / height, may be different from width/height e.g. when
+ * the decoded frame is cropped before being output.
+ * - encoding: unused
+ * - decoding: May be set by the user before opening the decoder if known
+ * e.g. from the container. During decoding, the decoder may
+ * overwrite those values as required.
+ */
+ int coded_width, coded_height;
+
+#if FF_API_ASPECT_EXTENDED
+#define FF_ASPECT_EXTENDED 15
+#endif
+
+ /**
+ * the number of pictures in a group of pictures, or 0 for intra_only
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int gop_size;
+
+ /**
+ * Pixel format, see AV_PIX_FMT_xxx.
+ * May be set by the demuxer if known from headers.
+ * May be overriden by the decoder if it knows better.
+ * - encoding: Set by user.
+ * - decoding: Set by user if known, overridden by libavcodec if known
+ */
+ enum AVPixelFormat pix_fmt;
+
+ /**
+ * Motion estimation algorithm used for video coding.
+ * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex),
+ * 8 (umh), 10 (tesa) [7, 8, 10 are x264 specific]
+ * - encoding: MUST be set by user.
+ * - decoding: unused
+ */
+ int me_method;
+
+ /**
+ * If non NULL, 'draw_horiz_band' is called by the libavcodec
+ * decoder to draw a horizontal band. It improves cache usage. Not
+ * all codecs can do that. You must check the codec capabilities
+ * beforehand.
+ * When multithreading is used, it may be called from multiple threads
+ * at the same time; threads might draw different parts of the same AVFrame,
+ * or multiple AVFrames, and there is no guarantee that slices will be drawn
+ * in order.
+ * The function is also used by hardware acceleration APIs.
+ * It is called at least once during frame decoding to pass
+ * the data needed for hardware render.
+ * In that mode instead of pixel data, AVFrame points to
+ * a structure specific to the acceleration API. The application
+ * reads the structure and can change some fields to indicate progress
+ * or mark state.
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @param height the height of the slice
+ * @param y the y position of the slice
+ * @param type 1->top field, 2->bottom field, 3->frame
+ * @param offset offset into the AVFrame.data from which the slice should be read
+ */
+ void (*draw_horiz_band)(struct AVCodecContext *s,
+ const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
+ int y, int type, int height);
+
+ /**
+ * callback to negotiate the pixelFormat
+ * @param fmt is the list of formats which are supported by the codec,
+ * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
+ * The first is always the native one.
+ * @return the chosen format
+ * - encoding: unused
+ * - decoding: Set by user, if not set the native format will be chosen.
+ */
+ enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
+
+ /**
+ * maximum number of B-frames between non-B-frames
+ * Note: The output will be delayed by max_b_frames+1 relative to the input.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_b_frames;
+
+ /**
+ * qscale factor between IP and B-frames
+ * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_factor;
+
+ /** obsolete FIXME remove */
+ int rc_strategy;
+#define FF_RC_STRATEGY_XVID 1
+
+ int b_frame_strategy;
+
+ /**
+ * qscale offset between IP and B-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float b_quant_offset;
+
+ /**
+ * Size of the frame reordering buffer in the decoder.
+ * For MPEG-2 it is 1 IPB or 0 low delay IP.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int has_b_frames;
+
+ /**
+ * 0-> h263 quant 1-> mpeg quant
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mpeg_quant;
+
+ /**
+ * qscale factor between P and I-frames
+ * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset).
+ * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_factor;
+
+ /**
+ * qscale offset between P and I-frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float i_quant_offset;
+
+ /**
+ * luminance masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float lumi_masking;
+
+ /**
+ * temporary complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float temporal_cplx_masking;
+
+ /**
+ * spatial complexity masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float spatial_cplx_masking;
+
+ /**
+ * p block masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float p_masking;
+
+ /**
+ * darkness masking (0-> disabled)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float dark_masking;
+
+ /**
+ * slice count
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user (or 0).
+ */
+ int slice_count;
+ /**
+ * prediction method (needed for huffyuv)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int prediction_method;
+#define FF_PRED_LEFT 0
+#define FF_PRED_PLANE 1
+#define FF_PRED_MEDIAN 2
+
+ /**
+ * slice offsets in the frame in bytes
+ * - encoding: Set/allocated by libavcodec.
+ * - decoding: Set/allocated by user (or NULL).
+ */
+ int *slice_offset;
+
+ /**
+ * sample aspect ratio (0 if unknown)
+ * That is the width of a pixel divided by the height of the pixel.
+ * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_cmp;
+ /**
+ * subpixel motion estimation comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_sub_cmp;
+ /**
+ * macroblock comparison function (not supported yet)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_cmp;
+ /**
+ * interlaced DCT comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int ildct_cmp;
+#define FF_CMP_SAD 0
+#define FF_CMP_SSE 1
+#define FF_CMP_SATD 2
+#define FF_CMP_DCT 3
+#define FF_CMP_PSNR 4
+#define FF_CMP_BIT 5
+#define FF_CMP_RD 6
+#define FF_CMP_ZERO 7
+#define FF_CMP_VSAD 8
+#define FF_CMP_VSSE 9
+#define FF_CMP_NSSE 10
+#define FF_CMP_DCTMAX 13
+#define FF_CMP_DCT264 14
+#define FF_CMP_CHROMA 256
+
+ /**
+ * ME diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dia_size;
+
+ /**
+ * amount of previous MV predictors (2a+1 x 2a+1 square)
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int last_predictor_count;
+
+ /**
+ * prepass for motion estimation
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_me;
+
+ /**
+ * motion estimation prepass comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_pre_cmp;
+
+ /**
+ * ME prepass diamond size & shape
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int pre_dia_size;
+
+ /**
+ * subpel ME quality
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_subpel_quality;
+
+ /**
+ * DTG active format information (additional aspect ratio
+ * information only used in DVB MPEG-2 transport streams)
+ * 0 if not set.
+ *
+ * - encoding: unused
+ * - decoding: Set by decoder.
+ */
+ int dtg_active_format;
+#define FF_DTG_AFD_SAME 8
+#define FF_DTG_AFD_4_3 9
+#define FF_DTG_AFD_16_9 10
+#define FF_DTG_AFD_14_9 11
+#define FF_DTG_AFD_4_3_SP_14_9 13
+#define FF_DTG_AFD_16_9_SP_14_9 14
+#define FF_DTG_AFD_SP_4_3 15
+
+ /**
+ * maximum motion estimation search range in subpel units
+ * If 0 then no limit.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_range;
+
+ /**
+ * intra quantizer bias
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int intra_quant_bias;
+#define FF_DEFAULT_QUANT_BIAS 999999
+
+ /**
+ * inter quantizer bias
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int inter_quant_bias;
+
+ /**
+ * slice flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int slice_flags;
+#define SLICE_FLAG_CODED_ORDER 0x0001 ///< draw_horiz_band() is called in coded order instead of display
+#define SLICE_FLAG_ALLOW_FIELD 0x0002 ///< allow draw_horiz_band() with field slices (MPEG2 field pics)
+#define SLICE_FLAG_ALLOW_PLANE 0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
+
+#if FF_API_XVMC
+ /**
+ * XVideo Motion Acceleration
+ * - encoding: forbidden
+ * - decoding: set by decoder
+ * @deprecated XvMC support is slated for removal.
+ */
+ attribute_deprecated int xvmc_acceleration;
+#endif /* FF_API_XVMC */
+
+ /**
+ * macroblock decision mode
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_decision;
+#define FF_MB_DECISION_SIMPLE 0 ///< uses mb_cmp
+#define FF_MB_DECISION_BITS 1 ///< chooses the one which needs the fewest bits
+#define FF_MB_DECISION_RD 2 ///< rate distortion
+
+ /**
+ * custom intra quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *intra_matrix;
+
+ /**
+ * custom inter quantization matrix
+ * - encoding: Set by user, can be NULL.
+ * - decoding: Set by libavcodec.
+ */
+ uint16_t *inter_matrix;
+
+ /**
+ * scene change detection threshold
+ * 0 is default, larger means fewer detected scene changes.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_threshold;
+
+ /**
+ * noise reduction strength
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int noise_reduction;
+
+ /**
+ * Motion estimation threshold below which no motion estimation is
+ * performed, but instead the user specified motion vectors are used.
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_threshold;
+
+ /**
+ * Macroblock threshold below which the user specified macroblock types will be used.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_threshold;
+
+ /**
+ * precision of the intra DC coefficient - 8
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int intra_dc_precision;
+
+ /**
+ * Number of macroblock rows at the top which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_top;
+
+ /**
+ * Number of macroblock rows at the bottom which are skipped.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int skip_bottom;
+
+ /**
+ * Border processing masking, raises the quantizer for mbs on the borders
+ * of the picture.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float border_masking;
+
+ /**
+ * minimum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmin;
+
+ /**
+ * maximum MB lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mb_lmax;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int me_penalty_compensation;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int bidir_refine;
+
+ /**
+ *
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int brd_scale;
+
+ /**
+ * minimum GOP size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int keyint_min;
+
+ /**
+ * number of reference frames
+ * - encoding: Set by user.
+ * - decoding: Set by lavc.
+ */
+ int refs;
+
+ /**
+ * chroma qp offset from luma
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int chromaoffset;
+
+ /**
+ * Multiplied by qscale for each frame and added to scene_change_score.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int scenechange_factor;
+
+ /**
+ *
+ * Note: Value depends upon the compare function used for fullpel ME.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int mv0_threshold;
+
+ /**
+ * Adjust sensitivity of b_frame_strategy 1.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int b_sensitivity;
+
+ /**
+ * Chromaticity coordinates of the source primaries.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorPrimaries color_primaries;
+
+ /**
+ * Color Transfer Characteristic.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorTransferCharacteristic color_trc;
+
+ /**
+ * YUV colorspace type.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorSpace colorspace;
+
+ /**
+ * MPEG vs JPEG YUV range.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVColorRange color_range;
+
+ /**
+ * This defines the location of chroma samples.
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ enum AVChromaLocation chroma_sample_location;
+
+ /**
+ * Number of slices.
+ * Indicates number of picture subdivisions. Used for parallelized
+ * decoding.
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ int slices;
+
+ /** Field order
+ * - encoding: set by libavcodec
+ * - decoding: Set by libavcodec
+ */
+ enum AVFieldOrder field_order;
+
+ /* audio only */
+ int sample_rate; ///< samples per second
+ int channels; ///< number of audio channels
+
+ /**
+ * audio sample format
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVSampleFormat sample_fmt; ///< sample format
+
+ /* The following data should not be initialized. */
+ /**
+ * Number of samples per channel in an audio frame.
+ *
+ * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame
+ * except the last must contain exactly frame_size samples per channel.
+ * May be 0 when the codec has CODEC_CAP_VARIABLE_FRAME_SIZE set, then the
+ * frame size is not restricted.
+ * - decoding: may be set by some decoders to indicate constant frame size
+ */
+ int frame_size;
+
+ /**
+ * Frame counter, set by libavcodec.
+ *
+ * - decoding: total number of frames returned from the decoder so far.
+ * - encoding: total number of frames passed to the encoder so far.
+ *
+ * @note the counter is not incremented if encoding/decoding resulted in
+ * an error.
+ */
+ int frame_number;
+
+ /**
+ * number of bytes per packet if constant and known or 0
+ * Used by some WAV based audio codecs.
+ */
+ int block_align;
+
+ /**
+ * Audio cutoff bandwidth (0 means "automatic")
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int cutoff;
+
+#if FF_API_REQUEST_CHANNELS
+ /**
+ * Decoder should decode to this many channels if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ * @deprecated Deprecated in favor of request_channel_layout.
+ */
+ attribute_deprecated int request_channels;
+#endif
+
+ /**
+ * Audio channel layout.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ uint64_t channel_layout;
+
+ /**
+ * Request decoder to use this channel layout if it can (0 for default)
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ uint64_t request_channel_layout;
+
+ /**
+ * Type of service that the audio stream conveys.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ enum AVAudioServiceType audio_service_type;
+
+ /**
+ * Used to request a sample format from the decoder.
+ * - encoding: unused.
+ * - decoding: Set by user.
+ */
+ enum AVSampleFormat request_sample_fmt;
+
+#if FF_API_GET_BUFFER
+ /**
+ * Called at the beginning of each frame to get a buffer for it.
+ *
+ * The function will set AVFrame.data[], AVFrame.linesize[].
+ * AVFrame.extended_data[] must also be set, but it should be the same as
+ * AVFrame.data[] except for planar audio with more channels than can fit
+ * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as
+ * many data pointers as it can hold.
+ *
+ * if CODEC_CAP_DR1 is not set then get_buffer() must call
+ * avcodec_default_get_buffer() instead of providing buffers allocated by
+ * some other means.
+ *
+ * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't
+ * need it. avcodec_default_get_buffer() aligns the output buffer properly,
+ * but if get_buffer() is overridden then alignment considerations should
+ * be taken into account.
+ *
+ * @see avcodec_default_get_buffer()
+ *
+ * Video:
+ *
+ * If pic.reference is set then the frame will be read later by libavcodec.
+ * avcodec_align_dimensions2() should be used to find the required width and
+ * height, as they normally need to be rounded up to the next multiple of 16.
+ *
+ * If frame multithreading is used and thread_safe_callbacks is set,
+ * it may be called from a different thread, but not from more than one at
+ * once. Does not need to be reentrant.
+ *
+ * @see release_buffer(), reget_buffer()
+ * @see avcodec_align_dimensions2()
+ *
+ * Audio:
+ *
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer(). The decoder may,
+ * however, utilize only part of the buffer by setting AVFrame.nb_samples
+ * to a smaller value in the output frame.
+ *
+ * Decoders cannot use the buffer after returning from
+ * avcodec_decode_audio4(), so they will not call release_buffer(), as it
+ * is assumed to be released immediately upon return. In some rare cases,
+ * a decoder may need to call get_buffer() more than once in a single
+ * call to avcodec_decode_audio4(). In that case, when get_buffer() is
+ * called again after it has already been called once, the previously
+ * acquired buffer is assumed to be released at that time and may not be
+ * reused by the decoder.
+ *
+ * As a convenience, av_samples_get_buffer_size() and
+ * av_samples_fill_arrays() in libavutil may be used by custom get_buffer()
+ * functions to find the required data size and to fill data pointers and
+ * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+ * since all planes must be the same size.
+ *
+ * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ *
+ * @deprecated use get_buffer2()
+ */
+ attribute_deprecated
+ int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Called to release buffers which were allocated with get_buffer.
+ * A released buffer can be reused in get_buffer().
+ * pic.data[*] must be set to NULL.
+ * May be called from a different thread if frame multithreading is used,
+ * but not by more than one thread at once, so does not need to be reentrant.
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ *
+ * @deprecated custom freeing callbacks should be set from get_buffer2()
+ */
+ attribute_deprecated
+ void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic);
+
+ /**
+ * Called at the beginning of a frame to get cr buffer for it.
+ * Buffer type (size, hints) must be the same. libavcodec won't check it.
+ * libavcodec will pass previous buffer in pic, function should return
+ * same buffer or new buffer with old frame "painted" into it.
+ * If pic.data[0] == NULL must behave like get_buffer().
+ * if CODEC_CAP_DR1 is not set then reget_buffer() must call
+ * avcodec_default_reget_buffer() instead of providing buffers allocated by
+ * some other means.
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ attribute_deprecated
+ int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic);
+#endif
+
+ /**
+ * This callback is called at the beginning of each frame to get data
+ * buffer(s) for it. There may be one contiguous buffer for all the data or
+ * there may be a buffer per each data plane or anything in between. What
+ * this means is, you may set however many entries in buf[] you feel necessary.
+ * Each buffer must be reference-counted using the AVBuffer API (see description
+ * of buf[] below).
+ *
+ * The following fields will be set in the frame before this callback is
+ * called:
+ * - format
+ * - width, height (video only)
+ * - sample_rate, channel_layout, nb_samples (audio only)
+ * Their values may differ from the corresponding values in
+ * AVCodecContext. This callback must use the frame values, not the codec
+ * context values, to calculate the required buffer size.
+ *
+ * This callback must fill the following fields in the frame:
+ * - data[]
+ * - linesize[]
+ * - extended_data:
+ * * if the data is planar audio with more than 8 channels, then this
+ * callback must allocate and fill extended_data to contain all pointers
+ * to all data planes. data[] must hold as many pointers as it can.
+ * extended_data must be allocated with av_malloc() and will be freed in
+ * av_frame_unref().
+ * * otherwise exended_data must point to data
+ * - buf[] must contain one or more pointers to AVBufferRef structures. Each of
+ * the frame's data and extended_data pointers must be contained in these. That
+ * is, one AVBufferRef for each allocated chunk of memory, not necessarily one
+ * AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(),
+ * and av_buffer_ref().
+ * - extended_buf and nb_extended_buf must be allocated with av_malloc() by
+ * this callback and filled with the extra buffers if there are more
+ * buffers than buf[] can hold. extended_buf will be freed in
+ * av_frame_unref().
+ *
+ * If CODEC_CAP_DR1 is not set then get_buffer2() must call
+ * avcodec_default_get_buffer2() instead of providing buffers allocated by
+ * some other means.
+ *
+ * Each data plane must be aligned to the maximum required by the target
+ * CPU.
+ *
+ * @see avcodec_default_get_buffer2()
+ *
+ * Video:
+ *
+ * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused
+ * (read and/or written to if it is writable) later by libavcodec.
+ *
+ * avcodec_align_dimensions2() should be used to find the required width and
+ * height, as they normally need to be rounded up to the next multiple of 16.
+ *
+ * If frame multithreading is used and thread_safe_callbacks is set,
+ * this callback may be called from a different thread, but not from more
+ * than one at once. Does not need to be reentrant.
+ *
+ * @see avcodec_align_dimensions2()
+ *
+ * Audio:
+ *
+ * Decoders request a buffer of a particular size by setting
+ * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may,
+ * however, utilize only part of the buffer by setting AVFrame.nb_samples
+ * to a smaller value in the output frame.
+ *
+ * As a convenience, av_samples_get_buffer_size() and
+ * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2()
+ * functions to find the required data size and to fill data pointers and
+ * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+ * since all planes must be the same size.
+ *
+ * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags);
+
+ /**
+ * If non-zero, the decoded audio and video frames returned from
+ * avcodec_decode_video2() and avcodec_decode_audio4() are reference-counted
+ * and are valid indefinitely. The caller must free them with
+ * av_frame_unref() when they are not needed anymore.
+ * Otherwise, the decoded frames must not be freed by the caller and are
+ * only valid until the next decode call.
+ *
+ * - encoding: unused
+ * - decoding: set by the caller before avcodec_open2().
+ */
+ int refcounted_frames;
+
+ /* - encoding parameters */
+ float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0)
+ float qblur; ///< amount of qscale smoothing over time (0.0-1.0)
+
+ /**
+ * minimum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmin;
+
+ /**
+ * maximum quantizer
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int qmax;
+
+ /**
+ * maximum quantizer difference between frames
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_qdiff;
+
+ /**
+ * ratecontrol qmin qmax limiting method
+ * 0-> clipping, 1-> use a nice continuous function to limit qscale wthin qmin/qmax.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float rc_qsquish;
+
+ float rc_qmod_amp;
+ int rc_qmod_freq;
+
+ /**
+ * decoder bitstream buffer size
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_buffer_size;
+
+ /**
+ * ratecontrol override, see RcOverride
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ int rc_override_count;
+ RcOverride *rc_override;
+
+ /**
+ * rate control equation
+ * - encoding: Set by user
+ * - decoding: unused
+ */
+ const char *rc_eq;
+
+ /**
+ * maximum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_max_rate;
+
+ /**
+ * minimum bitrate
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_min_rate;
+
+ float rc_buffer_aggressivity;
+
+ /**
+ * initial complexity for pass1 ratecontrol
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ float rc_initial_cplx;
+
+ /**
+ * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_max_available_vbv_use;
+
+ /**
+ * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.
+ * - encoding: Set by user.
+ * - decoding: unused.
+ */
+ float rc_min_vbv_overflow_use;
+
+ /**
+ * Number of bits which should be loaded into the rc buffer before decoding starts.
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int rc_initial_buffer_occupancy;
+
+#define FF_CODER_TYPE_VLC 0
+#define FF_CODER_TYPE_AC 1
+#define FF_CODER_TYPE_RAW 2
+#define FF_CODER_TYPE_RLE 3
+#define FF_CODER_TYPE_DEFLATE 4
+ /**
+ * coder type
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int coder_type;
+
+ /**
+ * context model
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int context_model;
+
+ /**
+ * minimum Lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int lmin;
+
+ /**
+ * maximum Lagrange multipler
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int lmax;
+
+ /**
+ * frame skip threshold
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_threshold;
+
+ /**
+ * frame skip factor
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_factor;
+
+ /**
+ * frame skip exponent
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_exp;
+
+ /**
+ * frame skip comparison function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int frame_skip_cmp;
+
+ /**
+ * trellis RD quantization
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int trellis;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int min_prediction_order;
+
+ /**
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int max_prediction_order;
+
+ /**
+ * GOP timecode frame start number, in non drop frame format
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int64_t timecode_frame_start;
+
+ /* The RTP callback: This function is called */
+ /* every time the encoder has a packet to send. */
+ /* It depends on the encoder if the data starts */
+ /* with a Start Code (it should). H.263 does. */
+ /* mb_nb contains the number of macroblocks */
+ /* encoded in the RTP payload. */
+ void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb);
+
+ int rtp_payload_size; /* The size of the RTP payload: the coder will */
+ /* do its best to deliver a chunk with size */
+ /* below rtp_payload_size, the chunk will start */
+ /* with a start code on some codecs like H.263. */
+ /* This doesn't take account of any particular */
+ /* headers inside the transmitted RTP payload. */
+
+ /* statistics, used for 2-pass encoding */
+ int mv_bits;
+ int header_bits;
+ int i_tex_bits;
+ int p_tex_bits;
+ int i_count;
+ int p_count;
+ int skip_count;
+ int misc_bits;
+
+ /**
+ * number of bits used for the previously encoded frame
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ int frame_bits;
+
+ /**
+ * pass1 encoding statistics output buffer
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ char *stats_out;
+
+ /**
+ * pass2 encoding statistics input buffer
+ * Concatenated stuff from stats_out of pass1 should be placed here.
+ * - encoding: Allocated/set/freed by user.
+ * - decoding: unused
+ */
+ char *stats_in;
+
+ /**
+ * Work around bugs in encoders which sometimes cannot be detected automatically.
+ * - encoding: Set by user
+ * - decoding: Set by user
+ */
+ int workaround_bugs;
+#define FF_BUG_AUTODETECT 1 ///< autodetection
+#if FF_API_OLD_MSMPEG4
+#define FF_BUG_OLD_MSMPEG4 2
+#endif
+#define FF_BUG_XVID_ILACE 4
+#define FF_BUG_UMP4 8
+#define FF_BUG_NO_PADDING 16
+#define FF_BUG_AMV 32
+#if FF_API_AC_VLC
+#define FF_BUG_AC_VLC 0 ///< Will be removed, libavcodec can now handle these non-compliant files by default.
+#endif
+#define FF_BUG_QPEL_CHROMA 64
+#define FF_BUG_STD_QPEL 128
+#define FF_BUG_QPEL_CHROMA2 256
+#define FF_BUG_DIRECT_BLOCKSIZE 512
+#define FF_BUG_EDGE 1024
+#define FF_BUG_HPEL_CHROMA 2048
+#define FF_BUG_DC_CLIP 4096
+#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
+#define FF_BUG_TRUNCATED 16384
+
+ /**
+ * strictly follow the standard (MPEG4, ...).
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ * Setting this to STRICT or higher means the encoder and decoder will
+ * generally do stupid things, whereas setting it to unofficial or lower
+ * will mean the encoder might produce output that is not supported by all
+ * spec-compliant decoders. Decoders don't differentiate between normal,
+ * unofficial and experimental (that is, they always try to decode things
+ * when they can) unless they are explicitly asked to behave stupidly
+ * (=strictly conform to the specs)
+ */
+ int strict_std_compliance;
+#define FF_COMPLIANCE_VERY_STRICT 2 ///< Strictly conform to an older more strict version of the spec or reference software.
+#define FF_COMPLIANCE_STRICT 1 ///< Strictly conform to all the things in the spec no matter what consequences.
+#define FF_COMPLIANCE_NORMAL 0
+#define FF_COMPLIANCE_UNOFFICIAL -1 ///< Allow unofficial extensions
+#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
+
+ /**
+ * error concealment flags
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int error_concealment;
+#define FF_EC_GUESS_MVS 1
+#define FF_EC_DEBLOCK 2
+
+ /**
+ * debug
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int debug;
+#define FF_DEBUG_PICT_INFO 1
+#define FF_DEBUG_RC 2
+#define FF_DEBUG_BITSTREAM 4
+#define FF_DEBUG_MB_TYPE 8
+#define FF_DEBUG_QP 16
+#if FF_API_DEBUG_MV
+/**
+ * @deprecated this option does nothing
+ */
+#define FF_DEBUG_MV 32
+#endif
+#define FF_DEBUG_DCT_COEFF 0x00000040
+#define FF_DEBUG_SKIP 0x00000080
+#define FF_DEBUG_STARTCODE 0x00000100
+#define FF_DEBUG_PTS 0x00000200
+#define FF_DEBUG_ER 0x00000400
+#define FF_DEBUG_MMCO 0x00000800
+#define FF_DEBUG_BUGS 0x00001000
+#if FF_API_DEBUG_MV
+#define FF_DEBUG_VIS_QP 0x00002000
+#define FF_DEBUG_VIS_MB_TYPE 0x00004000
+#endif
+#define FF_DEBUG_BUFFERS 0x00008000
+#define FF_DEBUG_THREADS 0x00010000
+
+#if FF_API_DEBUG_MV
+ /**
+ * @deprecated this option does not have any effect
+ */
+ attribute_deprecated
+ int debug_mv;
+#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames
+#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames
+#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
+#endif
+
+ /**
+ * Error recognition; may misdetect some more or less valid parts as errors.
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int err_recognition;
+
+/**
+ * Verify checksums embedded in the bitstream (could be of either encoded or
+ * decoded data, depending on the codec) and print an error message on mismatch.
+ * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the
+ * decoder returning an error.
+ */
+#define AV_EF_CRCCHECK (1<<0)
+#define AV_EF_BITSTREAM (1<<1)
+#define AV_EF_BUFFER (1<<2)
+#define AV_EF_EXPLODE (1<<3)
+
+ /**
+ * opaque 64bit number (generally a PTS) that will be reordered and
+ * output in AVFrame.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ int64_t reordered_opaque;
+
+ /**
+ * Hardware accelerator in use
+ * - encoding: unused.
+ * - decoding: Set by libavcodec
+ */
+ struct AVHWAccel *hwaccel;
+
+ /**
+ * Hardware accelerator context.
+ * For some hardware accelerators, a global context needs to be
+ * provided by the user. In that case, this holds display-dependent
+ * data Libav cannot instantiate itself. Please refer to the
+ * Libav HW accelerator documentation to know how to fill this
+ * is. e.g. for VA API, this is a struct vaapi_context.
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *hwaccel_context;
+
+ /**
+ * error
+ * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * DCT algorithm, see FF_DCT_* below
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int dct_algo;
+#define FF_DCT_AUTO 0
+#define FF_DCT_FASTINT 1
+#define FF_DCT_INT 2
+#define FF_DCT_MMX 3
+#define FF_DCT_ALTIVEC 5
+#define FF_DCT_FAAN 6
+
+ /**
+ * IDCT algorithm, see FF_IDCT_* below.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int idct_algo;
+#define FF_IDCT_AUTO 0
+#define FF_IDCT_INT 1
+#define FF_IDCT_SIMPLE 2
+#define FF_IDCT_SIMPLEMMX 3
+#define FF_IDCT_ARM 7
+#define FF_IDCT_ALTIVEC 8
+#define FF_IDCT_SH4 9
+#define FF_IDCT_SIMPLEARM 10
+#define FF_IDCT_IPP 13
+#define FF_IDCT_XVIDMMX 14
+#define FF_IDCT_SIMPLEARMV5TE 16
+#define FF_IDCT_SIMPLEARMV6 17
+#define FF_IDCT_SIMPLEVIS 18
+#define FF_IDCT_FAAN 20
+#define FF_IDCT_SIMPLENEON 22
+#if FF_API_ARCH_ALPHA
+#define FF_IDCT_SIMPLEALPHA 23
+#endif
+
+ /**
+ * bits per sample/pixel from the demuxer (needed for huffyuv).
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by user.
+ */
+ int bits_per_coded_sample;
+
+ /**
+ * Bits per sample/pixel of internal libavcodec pixel/sample format.
+ * - encoding: set by user.
+ * - decoding: set by libavcodec.
+ */
+ int bits_per_raw_sample;
+
+#if FF_API_LOWRES
+ /**
+ * low resolution decoding, 1-> 1/2 size, 2->1/4 size
+ * - encoding: unused
+ * - decoding: Set by user.
+ *
+ * @deprecated use decoder private options instead
+ */
+ attribute_deprecated int lowres;
+#endif
+
+ /**
+ * the picture in the bitstream
+ * - encoding: Set by libavcodec.
+ * - decoding: unused
+ */
+ AVFrame *coded_frame;
+
+ /**
+ * thread count
+ * is used to decide how many independent tasks should be passed to execute()
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_count;
+
+ /**
+ * Which multithreading methods to use.
+ * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
+ * so clients which cannot provide future frames should not use it.
+ *
+ * - encoding: Set by user, otherwise the default is used.
+ * - decoding: Set by user, otherwise the default is used.
+ */
+ int thread_type;
+#define FF_THREAD_FRAME 1 ///< Decode more than one frame at once
+#define FF_THREAD_SLICE 2 ///< Decode more than one part of a single frame at once
+
+ /**
+ * Which multithreading methods are in use by the codec.
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int active_thread_type;
+
+ /**
+ * Set by the client if its custom get_buffer() callback can be called
+ * synchronously from another thread, which allows faster multithreaded decoding.
+ * draw_horiz_band() will be called from other threads regardless of this setting.
+ * Ignored if the default get_buffer() is used.
+ * - encoding: Set by user.
+ * - decoding: Set by user.
+ */
+ int thread_safe_callbacks;
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * @param count the number of things to execute
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);
+
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+ * The user may replace this with some multithreaded implementation,
+ * the default implementation will execute the parts serially.
+ * Also see avcodec_thread_init and e.g. the --enable-pthread configure option.
+ * @param c context passed also to func
+ * @param count the number of things to execute
+ * @param arg2 argument passed unchanged to func
+ * @param ret return values of executed functions, must have space for "count" values. May be NULL.
+ * @param func function that will be called count times, with jobnr from 0 to count-1.
+ * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no
+ * two instances of func executing at the same time will have the same threadnr.
+ * @return always 0 currently, but code should handle a future improvement where when any call to func
+ * returns < 0 no further calls to func may be done and < 0 is returned.
+ * - encoding: Set by libavcodec, user can override.
+ * - decoding: Set by libavcodec, user can override.
+ */
+ int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
+
+#if FF_API_THREAD_OPAQUE
+ /**
+ * @deprecated this field should not be used from outside of lavc
+ */
+ attribute_deprecated
+ void *thread_opaque;
+#endif
+
+ /**
+ * noise vs. sse weight for the nsse comparsion function
+ * - encoding: Set by user.
+ * - decoding: unused
+ */
+ int nsse_weight;
+
+ /**
+ * profile
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int profile;
+#define FF_PROFILE_UNKNOWN -99
+#define FF_PROFILE_RESERVED -100
+
+#define FF_PROFILE_AAC_MAIN 0
+#define FF_PROFILE_AAC_LOW 1
+#define FF_PROFILE_AAC_SSR 2
+#define FF_PROFILE_AAC_LTP 3
+#define FF_PROFILE_AAC_HE 4
+#define FF_PROFILE_AAC_HE_V2 28
+#define FF_PROFILE_AAC_LD 22
+#define FF_PROFILE_AAC_ELD 38
+#define FF_PROFILE_MPEG2_AAC_LOW 128
+#define FF_PROFILE_MPEG2_AAC_HE 131
+
+#define FF_PROFILE_DTS 20
+#define FF_PROFILE_DTS_ES 30
+#define FF_PROFILE_DTS_96_24 40
+#define FF_PROFILE_DTS_HD_HRA 50
+#define FF_PROFILE_DTS_HD_MA 60
+
+#define FF_PROFILE_MPEG2_422 0
+#define FF_PROFILE_MPEG2_HIGH 1
+#define FF_PROFILE_MPEG2_SS 2
+#define FF_PROFILE_MPEG2_SNR_SCALABLE 3
+#define FF_PROFILE_MPEG2_MAIN 4
+#define FF_PROFILE_MPEG2_SIMPLE 5
+
+#define FF_PROFILE_H264_CONSTRAINED (1<<9) // 8+1; constraint_set1_flag
+#define FF_PROFILE_H264_INTRA (1<<11) // 8+3; constraint_set3_flag
+
+#define FF_PROFILE_H264_BASELINE 66
+#define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)
+#define FF_PROFILE_H264_MAIN 77
+#define FF_PROFILE_H264_EXTENDED 88
+#define FF_PROFILE_H264_HIGH 100
+#define FF_PROFILE_H264_HIGH_10 110
+#define FF_PROFILE_H264_HIGH_10_INTRA (110|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_422 122
+#define FF_PROFILE_H264_HIGH_422_INTRA (122|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_HIGH_444 144
+#define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244
+#define FF_PROFILE_H264_HIGH_444_INTRA (244|FF_PROFILE_H264_INTRA)
+#define FF_PROFILE_H264_CAVLC_444 44
+
+#define FF_PROFILE_VC1_SIMPLE 0
+#define FF_PROFILE_VC1_MAIN 1
+#define FF_PROFILE_VC1_COMPLEX 2
+#define FF_PROFILE_VC1_ADVANCED 3
+
+#define FF_PROFILE_MPEG4_SIMPLE 0
+#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1
+#define FF_PROFILE_MPEG4_CORE 2
+#define FF_PROFILE_MPEG4_MAIN 3
+#define FF_PROFILE_MPEG4_N_BIT 4
+#define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5
+#define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
+#define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
+#define FF_PROFILE_MPEG4_HYBRID 8
+#define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
+#define FF_PROFILE_MPEG4_CORE_SCALABLE 10
+#define FF_PROFILE_MPEG4_ADVANCED_CODING 11
+#define FF_PROFILE_MPEG4_ADVANCED_CORE 12
+#define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
+#define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14
+#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15
+
+#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 0
+#define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 1
+#define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 2
+#define FF_PROFILE_JPEG2000_DCINEMA_2K 3
+#define FF_PROFILE_JPEG2000_DCINEMA_4K 4
+
+
+#define FF_PROFILE_HEVC_MAIN 1
+#define FF_PROFILE_HEVC_MAIN_10 2
+#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3
+
+ /**
+ * level
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int level;
+#define FF_LEVEL_UNKNOWN -99
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_loop_filter;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_idct;
+
+ /**
+ *
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ enum AVDiscard skip_frame;
+
+ /**
+ * Header containing style information for text subtitles.
+ * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
+ * [Script Info] and [V4+ Styles] section, plus the [Events] line and
+ * the Format line following. It shouldn't include any Dialogue line.
+ * - encoding: Set/allocated/freed by user (before avcodec_open2())
+ * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
+ */
+ uint8_t *subtitle_header;
+ int subtitle_header_size;
+
+#if FF_API_ERROR_RATE
+ /**
+ * @deprecated use the 'error_rate' private AVOption of the mpegvideo
+ * encoders
+ */
+ attribute_deprecated
+ int error_rate;
+#endif
+
+#if FF_API_CODEC_PKT
+ /**
+ * @deprecated this field is not supposed to be accessed from outside lavc
+ */
+ attribute_deprecated
+ AVPacket *pkt;
+#endif
+
+ /**
+ * VBV delay coded in the last frame (in periods of a 27 MHz clock).
+ * Used for compliant TS muxing.
+ * - encoding: Set by libavcodec.
+ * - decoding: unused.
+ */
+ uint64_t vbv_delay;
+} AVCodecContext;
+
+/**
+ * AVProfile.
+ */
+typedef struct AVProfile {
+ int profile;
+ const char *name; ///< short name for the profile
+} AVProfile;
+
+typedef struct AVCodecDefault AVCodecDefault;
+
+struct AVSubtitle;
+
+/**
+ * AVCodec.
+ */
+typedef struct AVCodec {
+ /**
+ * Name of the codec implementation.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ * This is the primary way to find a codec from the user perspective.
+ */
+ const char *name;
+ /**
+ * Descriptive name for the codec, meant to be more human readable than name.
+ * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
+ */
+ const char *long_name;
+ enum AVMediaType type;
+ enum AVCodecID id;
+ /**
+ * Codec capabilities.
+ * see CODEC_CAP_*
+ */
+ int capabilities;
+ const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
+ const enum AVPixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
+ const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
+ const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
+ const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
+#if FF_API_LOWRES
+ attribute_deprecated uint8_t max_lowres; ///< maximum value for lowres supported by the decoder
+#endif
+ const AVClass *priv_class; ///< AVClass for the private context
+ const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
+
+ /*****************************************************************
+ * No fields below this line are part of the public API. They
+ * may not be used outside of libavcodec and can be changed and
+ * removed at will.
+ * New public fields should be added right above.
+ *****************************************************************
+ */
+ int priv_data_size;
+ struct AVCodec *next;
+ /**
+ * @name Frame-level threading support functions
+ * @{
+ */
+ /**
+ * If defined, called on thread contexts when they are created.
+ * If the codec allocates writable tables in init(), re-allocate them here.
+ * priv_data will be set to a copy of the original.
+ */
+ int (*init_thread_copy)(AVCodecContext *);
+ /**
+ * Copy necessary context variables from a previous thread context to the current one.
+ * If not defined, the next thread will start automatically; otherwise, the codec
+ * must call ff_thread_finish_setup().
+ *
+ * dst and src will (rarely) point to the same context, in which case memcpy should be skipped.
+ */
+ int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src);
+ /** @} */
+
+ /**
+ * Private codec-specific defaults.
+ */
+ const AVCodecDefault *defaults;
+
+ /**
+ * Initialize codec static data, called from avcodec_register().
+ */
+ void (*init_static_data)(struct AVCodec *codec);
+
+ int (*init)(AVCodecContext *);
+ int (*encode_sub)(AVCodecContext *, uint8_t *buf, int buf_size,
+ const struct AVSubtitle *sub);
+ /**
+ * Encode data to an AVPacket.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket (may contain a user-provided buffer)
+ * @param[in] frame AVFrame containing the raw data to be encoded
+ * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a
+ * non-empty packet was returned in avpkt.
+ * @return 0 on success, negative error code on failure
+ */
+ int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame,
+ int *got_packet_ptr);
+ int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
+ int (*close)(AVCodecContext *);
+ /**
+ * Flush buffers.
+ * Will be called when seeking
+ */
+ void (*flush)(AVCodecContext *);
+} AVCodec;
+
+/**
+ * AVHWAccel.
+ */
+typedef struct AVHWAccel {
+ /**
+ * Name of the hardware accelerated codec.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ */
+ const char *name;
+
+ /**
+ * Type of codec implemented by the hardware accelerator.
+ *
+ * See AVMEDIA_TYPE_xxx
+ */
+ enum AVMediaType type;
+
+ /**
+ * Codec implemented by the hardware accelerator.
+ *
+ * See AV_CODEC_ID_xxx
+ */
+ enum AVCodecID id;
+
+ /**
+ * Supported pixel format.
+ *
+ * Only hardware accelerated formats are supported here.
+ */
+ enum AVPixelFormat pix_fmt;
+
+ /**
+ * Hardware accelerated codec capabilities.
+ * see FF_HWACCEL_CODEC_CAP_*
+ */
+ int capabilities;
+
+ struct AVHWAccel *next;
+
+ /**
+ * Called at the beginning of each frame or field picture.
+ *
+ * Meaningful frame information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * Note that buf can be NULL along with buf_size set to 0.
+ * Otherwise, this means the whole frame is available at this point.
+ *
+ * @param avctx the codec context
+ * @param buf the frame data buffer base
+ * @param buf_size the size of the frame in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Callback for each slice.
+ *
+ * Meaningful slice information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @param buf the slice data buffer base
+ * @param buf_size the size of the slice in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Called at the end of each frame or field picture.
+ *
+ * The whole picture is parsed at this point and can now be sent
+ * to the hardware accelerator. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*end_frame)(AVCodecContext *avctx);
+
+ /**
+ * Size of HW accelerator private data.
+ *
+ * Private data is allocated with av_mallocz() before
+ * AVCodecContext.get_buffer() and deallocated after
+ * AVCodecContext.release_buffer().
+ */
+ int priv_data_size;
+} AVHWAccel;
+
+/**
+ * @defgroup lavc_picture AVPicture
+ *
+ * Functions for working with AVPicture
+ * @{
+ */
+
+/**
+ * four components are given, that's all.
+ * the last component is alpha
+ */
+typedef struct AVPicture {
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+ int linesize[AV_NUM_DATA_POINTERS]; ///< number of bytes per line
+} AVPicture;
+
+/**
+ * @}
+ */
+
+#define AVPALETTE_SIZE 1024
+#define AVPALETTE_COUNT 256
+
+enum AVSubtitleType {
+ SUBTITLE_NONE,
+
+ SUBTITLE_BITMAP, ///< A bitmap, pict will be set
+
+ /**
+ * Plain text, the text field must be set by the decoder and is
+ * authoritative. ass and pict fields may contain approximations.
+ */
+ SUBTITLE_TEXT,
+
+ /**
+ * Formatted text, the ass field must be set by the decoder and is
+ * authoritative. pict and text fields may contain approximations.
+ */
+ SUBTITLE_ASS,
+};
+
+#define AV_SUBTITLE_FLAG_FORCED 0x00000001
+
+typedef struct AVSubtitleRect {
+ int x; ///< top left corner of pict, undefined when pict is not set
+ int y; ///< top left corner of pict, undefined when pict is not set
+ int w; ///< width of pict, undefined when pict is not set
+ int h; ///< height of pict, undefined when pict is not set
+ int nb_colors; ///< number of colors in pict, undefined when pict is not set
+
+ /**
+ * data+linesize for the bitmap of this subtitle.
+ * can be set for text/ass as well once they where rendered
+ */
+ AVPicture pict;
+ enum AVSubtitleType type;
+
+ char *text; ///< 0 terminated plain UTF-8 text
+
+ /**
+ * 0 terminated ASS/SSA compatible event line.
+ * The pressentation of this is unaffected by the other values in this
+ * struct.
+ */
+ char *ass;
+ int flags;
+} AVSubtitleRect;
+
+typedef struct AVSubtitle {
+ uint16_t format; /* 0 = graphics */
+ uint32_t start_display_time; /* relative to packet pts, in ms */
+ uint32_t end_display_time; /* relative to packet pts, in ms */
+ unsigned num_rects;
+ AVSubtitleRect **rects;
+ int64_t pts; ///< Same as packet pts, in AV_TIME_BASE
+} AVSubtitle;
+
+/**
+ * If c is NULL, returns the first registered codec,
+ * if c is non-NULL, returns the next registered codec after c,
+ * or NULL if c is the last one.
+ */
+AVCodec *av_codec_next(const AVCodec *c);
+
+/**
+ * Return the LIBAVCODEC_VERSION_INT constant.
+ */
+unsigned avcodec_version(void);
+
+/**
+ * Return the libavcodec build-time configuration.
+ */
+const char *avcodec_configuration(void);
+
+/**
+ * Return the libavcodec license.
+ */
+const char *avcodec_license(void);
+
+/**
+ * Register the codec codec and initialize libavcodec.
+ *
+ * @warning either this function or avcodec_register_all() must be called
+ * before any other libavcodec functions.
+ *
+ * @see avcodec_register_all()
+ */
+void avcodec_register(AVCodec *codec);
+
+/**
+ * Register all the codecs, parsers and bitstream filters which were enabled at
+ * configuration time. If you do not call this function you can select exactly
+ * which formats you want to support, by using the individual registration
+ * functions.
+ *
+ * @see avcodec_register
+ * @see av_register_codec_parser
+ * @see av_register_bitstream_filter
+ */
+void avcodec_register_all(void);
+
+/**
+ * Allocate an AVCodecContext and set its fields to default values. The
+ * resulting struct can be deallocated by calling avcodec_close() on it followed
+ * by av_free().
+ *
+ * @param codec if non-NULL, allocate private data and initialize defaults
+ * for the given codec. It is illegal to then call avcodec_open2()
+ * with a different codec.
+ * If NULL, then the codec-specific defaults won't be initialized,
+ * which may result in suboptimal default settings (this is
+ * important mainly for encoders, e.g. libx264).
+ *
+ * @return An AVCodecContext filled with default values or NULL on failure.
+ * @see avcodec_get_context_defaults
+ */
+AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
+
+/**
+ * Set the fields of the given AVCodecContext to default values corresponding
+ * to the given codec (defaults may be codec-dependent).
+ *
+ * Do not call this function if a non-NULL codec has been passed
+ * to avcodec_alloc_context3() that allocated this AVCodecContext.
+ * If codec is non-NULL, it is illegal to call avcodec_open2() with a
+ * different codec on this AVCodecContext.
+ */
+int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec);
+
+/**
+ * Get the AVClass for AVCodecContext. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+ *
+ * @see av_opt_find().
+ */
+const AVClass *avcodec_get_class(void);
+
+/**
+ * Copy the settings of the source AVCodecContext into the destination
+ * AVCodecContext. The resulting destination codec context will be
+ * unopened, i.e. you are required to call avcodec_open2() before you
+ * can use this AVCodecContext to decode/encode video/audio data.
+ *
+ * @param dest target codec context, should be initialized with
+ * avcodec_alloc_context3(), but otherwise uninitialized
+ * @param src source codec context
+ * @return AVERROR() on error (e.g. memory allocation error), 0 on success
+ */
+int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
+
+#if FF_API_AVFRAME_LAVC
+/**
+ * @deprecated use av_frame_alloc()
+ */
+attribute_deprecated
+AVFrame *avcodec_alloc_frame(void);
+
+/**
+ * Set the fields of the given AVFrame to default values.
+ *
+ * @param frame The AVFrame of which the fields should be set to default values.
+ *
+ * @deprecated use av_frame_unref()
+ */
+attribute_deprecated
+void avcodec_get_frame_defaults(AVFrame *frame);
+
+/**
+ * Free the frame and any dynamically allocated objects in it,
+ * e.g. extended_data.
+ *
+ * @param frame frame to be freed. The pointer will be set to NULL.
+ *
+ * @warning this function does NOT free the data buffers themselves
+ * (it does not know how, since they might have been allocated with
+ * a custom get_buffer()).
+ *
+ * @deprecated use av_frame_free()
+ */
+attribute_deprecated
+void avcodec_free_frame(AVFrame **frame);
+#endif
+
+/**
+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
+ * function the context has to be allocated with avcodec_alloc_context3().
+ *
+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
+ * retrieving a codec.
+ *
+ * @warning This function is not thread safe!
+ *
+ * @code
+ * avcodec_register_all();
+ * av_dict_set(&opts, "b", "2.5M", 0);
+ * codec = avcodec_find_decoder(AV_CODEC_ID_H264);
+ * if (!codec)
+ * exit(1);
+ *
+ * context = avcodec_alloc_context3(codec);
+ *
+ * if (avcodec_open2(context, codec, opts) < 0)
+ * exit(1);
+ * @endcode
+ *
+ * @param avctx The context to initialize.
+ * @param codec The codec to open this context for. If a non-NULL codec has been
+ * previously passed to avcodec_alloc_context3() or
+ * avcodec_get_context_defaults3() for this context, then this
+ * parameter MUST be either NULL or equal to the previously passed
+ * codec.
+ * @param options A dictionary filled with AVCodecContext and codec-private options.
+ * On return this object will be filled with options that were not found.
+ *
+ * @return zero on success, a negative value on error
+ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
+ * av_dict_set(), av_opt_find().
+ */
+int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
+
+/**
+ * Close a given AVCodecContext and free all the data associated with it
+ * (but not the AVCodecContext itself).
+ *
+ * Calling this function on an AVCodecContext that hasn't been opened will free
+ * the codec-specific data allocated in avcodec_alloc_context3() /
+ * avcodec_get_context_defaults3() with a non-NULL codec. Subsequent calls will
+ * do nothing.
+ */
+int avcodec_close(AVCodecContext *avctx);
+
+/**
+ * Free all allocated data in the given subtitle struct.
+ *
+ * @param sub AVSubtitle to free.
+ */
+void avsubtitle_free(AVSubtitle *sub);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_packet
+ * @{
+ */
+
+#if FF_API_DESTRUCT_PACKET
+/**
+ * Default packet destructor.
+ * @deprecated use the AVBuffer API instead
+ */
+attribute_deprecated
+void av_destruct_packet(AVPacket *pkt);
+#endif
+
+/**
+ * Initialize optional fields of a packet with default values.
+ *
+ * Note, this does not touch the data and size members, which have to be
+ * initialized separately.
+ *
+ * @param pkt packet
+ */
+void av_init_packet(AVPacket *pkt);
+
+/**
+ * Allocate the payload of a packet and initialize its fields with
+ * default values.
+ *
+ * @param pkt packet
+ * @param size wanted payload size
+ * @return 0 if OK, AVERROR_xxx otherwise
+ */
+int av_new_packet(AVPacket *pkt, int size);
+
+/**
+ * Reduce packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param size new size
+ */
+void av_shrink_packet(AVPacket *pkt, int size);
+
+/**
+ * Increase packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param grow_by number of bytes by which to increase the size of the packet
+ */
+int av_grow_packet(AVPacket *pkt, int grow_by);
+
+/**
+ * Initialize a reference-counted packet from av_malloc()ed data.
+ *
+ * @param pkt packet to be initialized. This function will set the data, size,
+ * buf and destruct fields, all others are left untouched.
+ * @param data Data allocated by av_malloc() to be used as packet data. If this
+ * function returns successfully, the data is owned by the underlying AVBuffer.
+ * The caller may not access the data through other means.
+ * @param size size of data in bytes, without the padding. I.e. the full buffer
+ * size is assumed to be size + FF_INPUT_BUFFER_PADDING_SIZE.
+ *
+ * @return 0 on success, a negative AVERROR on error
+ */
+int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
+
+/**
+ * @warning This is a hack - the packet memory allocation stuff is broken. The
+ * packet is allocated if it was not really allocated.
+ */
+int av_dup_packet(AVPacket *pkt);
+
+/**
+ * Free a packet.
+ *
+ * @param pkt packet to free
+ */
+void av_free_packet(AVPacket *pkt);
+
+/**
+ * Allocate new information of a packet.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Shrink the already allocated side data buffer
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size new side information size
+ * @return 0 on success, < 0 on failure
+ */
+int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int size);
+
+/**
+ * Get side information from packet.
+ *
+ * @param pkt packet
+ * @param type desired side information type
+ * @param size pointer for side information size to store (optional)
+ * @return pointer to data if present or NULL otherwise
+ */
+uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+ int *size);
+
+/**
+ * Convenience function to free all the side data stored.
+ * All the other fields stay untouched.
+ *
+ * @param pkt packet
+ */
+void av_packet_free_side_data(AVPacket *pkt);
+
+/**
+ * Setup a new reference to the data described by a given packet
+ *
+ * If src is reference-counted, setup dst as a new reference to the
+ * buffer in src. Otherwise allocate a new buffer in dst and copy the
+ * data from src into it.
+ *
+ * All the other fields are copied from src.
+ *
+ * @see av_packet_unref
+ *
+ * @param dst Destination packet
+ * @param src Source packet
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ */
+int av_packet_ref(AVPacket *dst, AVPacket *src);
+
+/**
+ * Wipe the packet.
+ *
+ * Unreference the buffer referenced by the packet and reset the
+ * remaining packet fields to their default values.
+ *
+ * @param pkt The packet to be unreferenced.
+ */
+void av_packet_unref(AVPacket *pkt);
+
+/**
+ * Move every field in src to dst and reset src.
+ *
+ * @see av_packet_unref
+ *
+ * @param src Source packet, will be reset
+ * @param dst Destination packet
+ */
+void av_packet_move_ref(AVPacket *dst, AVPacket *src);
+
+/**
+ * Copy only "properties" fields from src to dst.
+ *
+ * Properties for the purpose of this function are all the fields
+ * beside those related to the packet data (buf, data, size)
+ *
+ * @param dst Destination packet
+ * @param src Source packet
+ *
+ * @return 0 on success AVERROR on failure.
+ *
+ */
+int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_decoding
+ * @{
+ */
+
+/**
+ * Find a registered decoder with a matching codec ID.
+ *
+ * @param id AVCodecID of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder(enum AVCodecID id);
+
+/**
+ * Find a registered decoder with the specified name.
+ *
+ * @param name name of the requested decoder
+ * @return A decoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_decoder_by_name(const char *name);
+
+#if FF_API_GET_BUFFER
+attribute_deprecated int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic);
+attribute_deprecated void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic);
+attribute_deprecated int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic);
+#endif
+
+/**
+ * The default callback for AVCodecContext.get_buffer2(). It is made public so
+ * it can be called by custom get_buffer2() implementations for decoders without
+ * CODEC_CAP_DR1 set.
+ */
+int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags);
+
+#if FF_API_EMU_EDGE
+/**
+ * Return the amount of padding in pixels which the get_buffer callback must
+ * provide around the edge of the image for codecs which do not have the
+ * CODEC_FLAG_EMU_EDGE flag.
+ *
+ * @return Required padding in pixels.
+ *
+ * @deprecated CODEC_FLAG_EMU_EDGE is deprecated, so this function is no longer
+ * needed
+ */
+attribute_deprecated
+unsigned avcodec_get_edge_width(void);
+#endif
+
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you do not use any horizontal
+ * padding.
+ *
+ * May only be used if a codec with CODEC_CAP_DR1 has been opened.
+ */
+void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
+
+/**
+ * Modify width and height values so that they will result in a memory
+ * buffer that is acceptable for the codec if you also ensure that all
+ * line sizes are a multiple of the respective linesize_align[i].
+ *
+ * May only be used if a codec with CODEC_CAP_DR1 has been opened.
+ */
+void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
+ int linesize_align[AV_NUM_DATA_POINTERS]);
+
+/**
+ * Decode the audio frame of size avpkt->size from avpkt->data into frame.
+ *
+ * Some decoders may support multiple frames in a single AVPacket. Such
+ * decoders would then just decode the first frame and the return value would be
+ * less than the packet size. In this case, avcodec_decode_audio4 has to be
+ * called again with an AVPacket containing the remaining data in order to
+ * decode the second frame, etc... Even if no frames are returned, the packet
+ * needs to be fed to the decoder with remaining data until it is completely
+ * consumed or an error occurs.
+ *
+ * Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input
+ * and output. This means that for some packets they will not immediately
+ * produce decoded output and need to be flushed at the end of decoding to get
+ * all the decoded data. Flushing is done by calling this function with packets
+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops
+ * returning samples. It is safe to flush even those decoders that are not
+ * marked with CODEC_CAP_DELAY, then no samples will be returned.
+ *
+ * @warning The input buffer, avpkt->data must be FF_INPUT_BUFFER_PADDING_SIZE
+ * larger than the actual read bytes because some optimized bitstream
+ * readers read 32 or 64 bits at once and could read over the end.
+ *
+ * @param avctx the codec context
+ * @param[out] frame The AVFrame in which to store decoded audio samples.
+ * The decoder will allocate a buffer for the decoded frame by
+ * calling the AVCodecContext.get_buffer2() callback.
+ * When AVCodecContext.refcounted_frames is set to 1, the frame is
+ * reference counted and the returned reference belongs to the
+ * caller. The caller must release the frame using av_frame_unref()
+ * when the frame is no longer needed. The caller may safely write
+ * to the frame if av_frame_is_writable() returns 1.
+ * When AVCodecContext.refcounted_frames is set to 0, the returned
+ * reference belongs to the decoder and is valid only until the
+ * next call to this function or until closing or flushing the
+ * decoder. The caller may not write to it.
+ * @param[out] got_frame_ptr Zero if no frame could be decoded, otherwise it is
+ * non-zero. Note that this field being set to zero
+ * does not mean that an error has occurred. For
+ * decoders with CODEC_CAP_DELAY set, no given decode
+ * call is guaranteed to produce a frame.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ * At least avpkt->data and avpkt->size should be set. Some
+ * decoders might also require additional fields to be set.
+ * @return A negative error code is returned if an error occurred during
+ * decoding, otherwise the number of bytes consumed from the input
+ * AVPacket is returned.
+ */
+int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
+ int *got_frame_ptr, AVPacket *avpkt);
+
+/**
+ * Decode the video frame of size avpkt->size from avpkt->data into picture.
+ * Some decoders may support multiple frames in a single AVPacket, such
+ * decoders would then just decode the first frame.
+ *
+ * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than
+ * the actual read bytes because some optimized bitstream readers read 32 or 64
+ * bits at once and could read over the end.
+ *
+ * @warning The end of the input buffer buf should be set to 0 to ensure that
+ * no overreading happens for damaged MPEG streams.
+ *
+ * @note Codecs which have the CODEC_CAP_DELAY capability set have a delay
+ * between input and output, these need to be fed with avpkt->data=NULL,
+ * avpkt->size=0 at the end to return the remaining frames.
+ *
+ * @param avctx the codec context
+ * @param[out] picture The AVFrame in which the decoded video frame will be stored.
+ * Use av_frame_alloc() to get an AVFrame. The codec will
+ * allocate memory for the actual bitmap by calling the
+ * AVCodecContext.get_buffer2() callback.
+ * When AVCodecContext.refcounted_frames is set to 1, the frame is
+ * reference counted and the returned reference belongs to the
+ * caller. The caller must release the frame using av_frame_unref()
+ * when the frame is no longer needed. The caller may safely write
+ * to the frame if av_frame_is_writable() returns 1.
+ * When AVCodecContext.refcounted_frames is set to 0, the returned
+ * reference belongs to the decoder and is valid only until the
+ * next call to this function or until closing or flushing the
+ * decoder. The caller may not write to it.
+ *
+ * @param[in] avpkt The input AVpacket containing the input buffer.
+ * You can create such packet with av_init_packet() and by then setting
+ * data and size, some decoders might in addition need other fields like
+ * flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least
+ * fields possible.
+ * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.
+ * @return On error a negative value is returned, otherwise the number of bytes
+ * used or zero if no frame could be decompressed.
+ */
+int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
+ int *got_picture_ptr,
+ AVPacket *avpkt);
+
+/**
+ * Decode a subtitle message.
+ * Return a negative value on error, otherwise return the number of bytes used.
+ * If no subtitle could be decompressed, got_sub_ptr is zero.
+ * Otherwise, the subtitle is stored in *sub.
+ * Note that CODEC_CAP_DR1 is not available for subtitle codecs. This is for
+ * simplicity, because the performance difference is expect to be negligible
+ * and reusing a get_buffer written for video codecs would probably perform badly
+ * due to a potentially very different allocation pattern.
+ *
+ * @param avctx the codec context
+ * @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be
+ freed with avsubtitle_free if *got_sub_ptr is set.
+ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ */
+int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+ int *got_sub_ptr,
+ AVPacket *avpkt);
+
+/**
+ * @defgroup lavc_parsing Frame parsing
+ * @{
+ */
+
+enum AVPictureStructure {
+ AV_PICTURE_STRUCTURE_UNKNOWN, //< unknown
+ AV_PICTURE_STRUCTURE_TOP_FIELD, //< coded as top field
+ AV_PICTURE_STRUCTURE_BOTTOM_FIELD, //< coded as bottom field
+ AV_PICTURE_STRUCTURE_FRAME, //< coded as frame
+};
+
+typedef struct AVCodecParserContext {
+ void *priv_data;
+ struct AVCodecParser *parser;
+ int64_t frame_offset; /* offset of the current frame */
+ int64_t cur_offset; /* current offset
+ (incremented by each av_parser_parse()) */
+ int64_t next_frame_offset; /* offset of the next frame */
+ /* video info */
+ int pict_type; /* XXX: Put it back in AVCodecContext. */
+ /**
+ * This field is used for proper frame duration computation in lavf.
+ * It signals, how much longer the frame duration of the current frame
+ * is compared to normal frame duration.
+ *
+ * frame_duration = (1 + repeat_pict) * time_base
+ *
+ * It is used by codecs like H.264 to display telecined material.
+ */
+ int repeat_pict; /* XXX: Put it back in AVCodecContext. */
+ int64_t pts; /* pts of the current frame */
+ int64_t dts; /* dts of the current frame */
+
+ /* private data */
+ int64_t last_pts;
+ int64_t last_dts;
+ int fetch_timestamp;
+
+#define AV_PARSER_PTS_NB 4
+ int cur_frame_start_index;
+ int64_t cur_frame_offset[AV_PARSER_PTS_NB];
+ int64_t cur_frame_pts[AV_PARSER_PTS_NB];
+ int64_t cur_frame_dts[AV_PARSER_PTS_NB];
+
+ int flags;
+#define PARSER_FLAG_COMPLETE_FRAMES 0x0001
+#define PARSER_FLAG_ONCE 0x0002
+/// Set if the parser has a valid file offset
+#define PARSER_FLAG_FETCHED_OFFSET 0x0004
+
+ int64_t offset; ///< byte offset from starting packet start
+ int64_t cur_frame_end[AV_PARSER_PTS_NB];
+
+ /**
+ * Set by parser to 1 for key frames and 0 for non-key frames.
+ * It is initialized to -1, so if the parser doesn't set this flag,
+ * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames
+ * will be used.
+ */
+ int key_frame;
+
+ /**
+ * Time difference in stream time base units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * independent from the availability of previous frames. That is, the
+ * frames are virtually identical no matter if decoding started from
+ * the very first frame or from this keyframe.
+ * Is AV_NOPTS_VALUE if unknown.
+ * This field is not the display duration of the current frame.
+ * This field has no meaning if the packet does not have AV_PKT_FLAG_KEY
+ * set.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
+
+ // Timestamp generation support:
+ /**
+ * Synchronization point for start of timestamp generation.
+ *
+ * Set to >0 for sync point, 0 for no sync point and <0 for undefined
+ * (default).
+ *
+ * For example, this corresponds to presence of H.264 buffering period
+ * SEI message.
+ */
+ int dts_sync_point;
+
+ /**
+ * Offset of the current timestamp against last timestamp sync point in
+ * units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain a valid timestamp offset.
+ *
+ * Note that the timestamp of sync point has usually a nonzero
+ * dts_ref_dts_delta, which refers to the previous sync point. Offset of
+ * the next frame after timestamp sync point will be usually 1.
+ *
+ * For example, this corresponds to H.264 cpb_removal_delay.
+ */
+ int dts_ref_dts_delta;
+
+ /**
+ * Presentation delay of current frame in units of AVCodecContext.time_base.
+ *
+ * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
+ * contain valid non-negative timestamp delta (presentation time of a frame
+ * must not lie in the past).
+ *
+ * This delay represents the difference between decoding and presentation
+ * time of the frame.
+ *
+ * For example, this corresponds to H.264 dpb_output_delay.
+ */
+ int pts_dts_delta;
+
+ /**
+ * Position of the packet in file.
+ *
+ * Analogous to cur_frame_pts/dts
+ */
+ int64_t cur_frame_pos[AV_PARSER_PTS_NB];
+
+ /**
+ * Byte position of currently parsed frame in stream.
+ */
+ int64_t pos;
+
+ /**
+ * Previous frame byte position.
+ */
+ int64_t last_pos;
+
+ /**
+ * Duration of the current frame.
+ * For audio, this is in units of 1 / AVCodecContext.sample_rate.
+ * For all other types, this is in units of AVCodecContext.time_base.
+ */
+ int duration;
+
+ enum AVFieldOrder field_order;
+
+ /**
+ * Indicate whether a picture is coded as a frame, top field or bottom field.
+ *
+ * For example, H.264 field_pic_flag equal to 0 corresponds to
+ * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag
+ * equal to 1 and bottom_field_flag equal to 0 corresponds to
+ * AV_PICTURE_STRUCTURE_TOP_FIELD.
+ */
+ enum AVPictureStructure picture_structure;
+
+ /**
+ * Picture number incremented in presentation or output order.
+ * This field may be reinitialized at the first picture of a new sequence.
+ *
+ * For example, this corresponds to H.264 PicOrderCnt.
+ */
+ int output_picture_number;
+} AVCodecParserContext;
+
+typedef struct AVCodecParser {
+ int codec_ids[5]; /* several codec IDs are permitted */
+ int priv_data_size;
+ int (*parser_init)(AVCodecParserContext *s);
+ int (*parser_parse)(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ const uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size);
+ void (*parser_close)(AVCodecParserContext *s);
+ int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
+ struct AVCodecParser *next;
+} AVCodecParser;
+
+AVCodecParser *av_parser_next(AVCodecParser *c);
+
+void av_register_codec_parser(AVCodecParser *parser);
+AVCodecParserContext *av_parser_init(int codec_id);
+
+/**
+ * Parse a packet.
+ *
+ * @param s parser context.
+ * @param avctx codec context.
+ * @param poutbuf set to pointer to parsed buffer or NULL if not yet finished.
+ * @param poutbuf_size set to size of parsed buffer or zero if not yet finished.
+ * @param buf input buffer.
+ * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output).
+ * @param pts input presentation timestamp.
+ * @param dts input decoding timestamp.
+ * @param pos input byte position in stream.
+ * @return the number of bytes of the input bitstream used.
+ *
+ * Example:
+ * @code
+ * while(in_len){
+ * len = av_parser_parse2(myparser, AVCodecContext, &data, &size,
+ * in_data, in_len,
+ * pts, dts, pos);
+ * in_data += len;
+ * in_len -= len;
+ *
+ * if(size)
+ * decode_frame(data, size);
+ * }
+ * @endcode
+ */
+int av_parser_parse2(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size,
+ int64_t pts, int64_t dts,
+ int64_t pos);
+
+/**
+ * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
+ * @deprecated use AVBitstreamFilter
+ */
+int av_parser_change(AVCodecParserContext *s,
+ AVCodecContext *avctx,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_parser_close(AVCodecParserContext *s);
+
+/**
+ * @}
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_encoding
+ * @{
+ */
+
+/**
+ * Find a registered encoder with a matching codec ID.
+ *
+ * @param id AVCodecID of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder(enum AVCodecID id);
+
+/**
+ * Find a registered encoder with the specified name.
+ *
+ * @param name name of the requested encoder
+ * @return An encoder if one was found, NULL otherwise.
+ */
+AVCodec *avcodec_find_encoder_by_name(const char *name);
+
+/**
+ * Encode a frame of audio.
+ *
+ * Takes input samples from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay, split, and combine input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. All other AVPacket fields
+ * will be reset by the encoder using av_init_packet(). If
+ * avpkt->data is NULL, the encoder will allocate it.
+ * The encoder will set avpkt->size to the size of the
+ * output packet.
+ *
+ * If this function fails or produces no output, avpkt will be
+ * freed using av_free_packet() (i.e. avpkt->destruct will be
+ * called to free the user supplied buffer).
+ * @param[in] frame AVFrame containing the raw audio data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * CODEC_CAP_DELAY capability set.
+ * If CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
+ * can have any number of samples.
+ * If it is not set, frame->nb_samples must be equal to
+ * avctx->frame_size for all frames except the last.
+ * The final frame may be smaller than avctx->frame_size.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_audio2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+/**
+ * Encode a frame of video.
+ *
+ * Takes input raw video data from frame and writes the next output packet, if
+ * available, to avpkt. The output packet does not necessarily contain data for
+ * the most recent frame, as encoders can delay and reorder input frames
+ * internally as needed.
+ *
+ * @param avctx codec context
+ * @param avpkt output AVPacket.
+ * The user can supply an output buffer by setting
+ * avpkt->data and avpkt->size prior to calling the
+ * function, but if the size of the user-provided data is not
+ * large enough, encoding will fail. All other AVPacket fields
+ * will be reset by the encoder using av_init_packet(). If
+ * avpkt->data is NULL, the encoder will allocate it.
+ * The encoder will set avpkt->size to the size of the
+ * output packet. The returned data (if any) belongs to the
+ * caller, he is responsible for freeing it.
+ *
+ * If this function fails or produces no output, avpkt will be
+ * freed using av_free_packet() (i.e. avpkt->destruct will be
+ * called to free the user supplied buffer).
+ * @param[in] frame AVFrame containing the raw video data to be encoded.
+ * May be NULL when flushing an encoder that has the
+ * CODEC_CAP_DELAY capability set.
+ * @param[out] got_packet_ptr This field is set to 1 by libavcodec if the
+ * output packet is non-empty, and to 0 if it is
+ * empty. If the function returns an error, the
+ * packet can be assumed to be invalid, and the
+ * value of got_packet_ptr is undefined and should
+ * not be used.
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr);
+
+int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ const AVSubtitle *sub);
+
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavc_picture
+ * @{
+ */
+
+/**
+ * Allocate memory for a picture. Call avpicture_free() to free it.
+ *
+ * @see avpicture_fill()
+ *
+ * @param picture the picture to be filled in
+ * @param pix_fmt the format of the picture
+ * @param width the width of the picture
+ * @param height the height of the picture
+ * @return zero if successful, a negative value if not
+ */
+int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Free a picture previously allocated by avpicture_alloc().
+ * The data buffer used by the AVPicture is freed, but the AVPicture structure
+ * itself is not.
+ *
+ * @param picture the AVPicture to be freed
+ */
+void avpicture_free(AVPicture *picture);
+
+/**
+ * Fill in the AVPicture fields.
+ * The fields of the given AVPicture are filled in by using the 'ptr' address
+ * which points to the image data buffer. Depending on the specified picture
+ * format, one or multiple image data pointers and line sizes will be set.
+ * If a planar format is specified, several pointers will be set pointing to
+ * the different picture planes and the line sizes of the different planes
+ * will be stored in the lines_sizes array.
+ * Call with ptr == NULL to get the required size for the ptr buffer.
+ *
+ * To allocate the buffer and fill in the AVPicture fields in one call,
+ * use avpicture_alloc().
+ *
+ * @param picture AVPicture whose fields are to be filled in
+ * @param ptr Buffer which will contain or contains the actual image data
+ * @param pix_fmt The format in which the picture data is stored.
+ * @param width the width of the image in pixels
+ * @param height the height of the image in pixels
+ * @return size of the image data in bytes
+ */
+int avpicture_fill(AVPicture *picture, uint8_t *ptr,
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Copy pixel data from an AVPicture into a buffer.
+ * The data is stored compactly, without any gaps for alignment or padding
+ * which may be applied by avpicture_fill().
+ *
+ * @see avpicture_get_size()
+ *
+ * @param[in] src AVPicture containing image data
+ * @param[in] pix_fmt The format in which the picture data is stored.
+ * @param[in] width the width of the image in pixels.
+ * @param[in] height the height of the image in pixels.
+ * @param[out] dest A buffer into which picture data will be copied.
+ * @param[in] dest_size The size of 'dest'.
+ * @return The number of bytes written to dest, or a negative value (error code) on error.
+ */
+int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt,
+ int width, int height,
+ unsigned char *dest, int dest_size);
+
+/**
+ * Calculate the size in bytes that a picture of the given width and height
+ * would occupy if stored in the given picture format.
+ * Note that this returns the size of a compact representation as generated
+ * by avpicture_layout(), which can be smaller than the size required for e.g.
+ * avpicture_fill().
+ *
+ * @param pix_fmt the given picture format
+ * @param width the width of the image
+ * @param height the height of the image
+ * @return Image data size in bytes or -1 on error (e.g. too large dimensions).
+ */
+int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height);
+
+#if FF_API_DEINTERLACE
+/**
+ * deinterlace - if not supported return -1
+ *
+ * @deprecated - use yadif (in libavfilter) instead
+ */
+attribute_deprecated
+int avpicture_deinterlace(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int width, int height);
+#endif
+/**
+ * Copy image src to dst. Wraps av_picture_data_copy() above.
+ */
+void av_picture_copy(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Crop image top and left side.
+ */
+int av_picture_crop(AVPicture *dst, const AVPicture *src,
+ enum AVPixelFormat pix_fmt, int top_band, int left_band);
+
+/**
+ * Pad image.
+ */
+int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, enum AVPixelFormat pix_fmt,
+ int padtop, int padbottom, int padleft, int padright, int *color);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup lavc_misc Utility functions
+ * @ingroup libavc
+ *
+ * Miscellaneous utility functions related to both encoding and decoding
+ * (or neither).
+ * @{
+ */
+
+/**
+ * @defgroup lavc_misc_pixfmt Pixel formats
+ *
+ * Functions for working with pixel formats.
+ * @{
+ */
+
+/**
+ * @deprecated Use av_pix_fmt_get_chroma_sub_sample
+ */
+
+void attribute_deprecated avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift);
+
+/**
+ * Return a value representing the fourCC code associated to the
+ * pixel format pix_fmt, or 0 if no associated fourCC code can be
+ * found.
+ */
+unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt);
+
+#define FF_LOSS_RESOLUTION 0x0001 /**< loss due to resolution change */
+#define FF_LOSS_DEPTH 0x0002 /**< loss due to color depth change */
+#define FF_LOSS_COLORSPACE 0x0004 /**< loss due to color space conversion */
+#define FF_LOSS_ALPHA 0x0008 /**< loss of alpha bits */
+#define FF_LOSS_COLORQUANT 0x0010 /**< loss due to color quantization */
+#define FF_LOSS_CHROMA 0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */
+
+/**
+ * Compute what kind of losses will occur when converting from one specific
+ * pixel format to another.
+ * When converting from one pixel format to another, information loss may occur.
+ * For example, when converting from RGB24 to GRAY, the color information will
+ * be lost. Similarly, other losses occur when converting from some formats to
+ * other formats. These losses can involve loss of chroma, but also loss of
+ * resolution, loss of color depth, loss due to the color space conversion, loss
+ * of the alpha bits or loss due to color quantization.
+ * avcodec_get_fix_fmt_loss() informs you about the various types of losses
+ * which will occur when converting from one pixel format to another.
+ *
+ * @param[in] dst_pix_fmt destination pixel format
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @return Combination of flags informing you what kind of losses will occur.
+ */
+int avcodec_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt, enum AVPixelFormat src_pix_fmt,
+ int has_alpha);
+
+/**
+ * Find the best pixel format to convert to given a certain source pixel
+ * format. When converting from one pixel format to another, information loss
+ * may occur. For example, when converting from RGB24 to GRAY, the color
+ * information will be lost. Similarly, other losses occur when converting from
+ * some formats to other formats. avcodec_find_best_pix_fmt2() searches which of
+ * the given pixel formats should be used to suffer the least amount of loss.
+ * The pixel formats from which it chooses one, are determined by the
+ * pix_fmt_list parameter.
+ *
+ *
+ * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from
+ * @param[in] src_pix_fmt source pixel format
+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+ * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
+ * @return The best pixel format to convert to or -1 if none was found.
+ */
+enum AVPixelFormat avcodec_find_best_pix_fmt2(enum AVPixelFormat *pix_fmt_list,
+ enum AVPixelFormat src_pix_fmt,
+ int has_alpha, int *loss_ptr);
+
+enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
+
+/**
+ * @}
+ */
+
+#if FF_API_SET_DIMENSIONS
+/**
+ * @deprecated this function is not supposed to be used from outside of lavc
+ */
+attribute_deprecated
+void avcodec_set_dimensions(AVCodecContext *s, int width, int height);
+#endif
+
+/**
+ * Put a string representing the codec tag codec_tag in buf.
+ *
+ * @param buf buffer to place codec tag in
+ * @param buf_size size in bytes of buf
+ * @param codec_tag codec tag to assign
+ * @return the length of the string that would have been generated if
+ * enough space had been available, excluding the trailing null
+ */
+size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag);
+
+void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode);
+
+/**
+ * Return a name for the specified profile, if available.
+ *
+ * @param codec the codec that is searched for the given profile
+ * @param profile the profile value for which a name is requested
+ * @return A name for the profile if found, NULL otherwise.
+ */
+const char *av_get_profile_name(const AVCodec *codec, int profile);
+
+int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size);
+int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
+//FIXME func typedef
+
+/**
+ * Fill audio frame data and linesize.
+ * AVFrame extended_data channel pointers are allocated if necessary for
+ * planar audio.
+ *
+ * @param frame the AVFrame
+ * frame->nb_samples must be set prior to calling the
+ * function. This function fills in frame->data,
+ * frame->extended_data, frame->linesize[0].
+ * @param nb_channels channel count
+ * @param sample_fmt sample format
+ * @param buf buffer to use for frame data
+ * @param buf_size size of buffer
+ * @param align plane size sample alignment (0 = default)
+ * @return 0 on success, negative error code on failure
+ */
+int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
+ enum AVSampleFormat sample_fmt, const uint8_t *buf,
+ int buf_size, int align);
+
+/**
+ * Reset the internal decoder state / flush internal buffers. Should be called
+ * e.g. when seeking or when switching to a different stream.
+ *
+ * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0),
+ * this invalidates the frames previously returned from the decoder. When
+ * refcounted frames are used, the decoder just releases any references it might
+ * keep internally, but the caller's reference remains valid.
+ */
+void avcodec_flush_buffers(AVCodecContext *avctx);
+
+/**
+ * Return codec bits per sample.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_bits_per_sample(enum AVCodecID codec_id);
+
+/**
+ * Return codec bits per sample.
+ * Only return non-zero if the bits per sample is exactly correct, not an
+ * approximation.
+ *
+ * @param[in] codec_id the codec
+ * @return Number of bits per sample or zero if unknown for the given codec.
+ */
+int av_get_exact_bits_per_sample(enum AVCodecID codec_id);
+
+/**
+ * Return audio frame duration.
+ *
+ * @param avctx codec context
+ * @param frame_bytes size of the frame, or 0 if unknown
+ * @return frame duration, in samples, if known. 0 if not able to
+ * determine.
+ */
+int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes);
+
+
+typedef struct AVBitStreamFilterContext {
+ void *priv_data;
+ struct AVBitStreamFilter *filter;
+ AVCodecParserContext *parser;
+ struct AVBitStreamFilterContext *next;
+} AVBitStreamFilterContext;
+
+
+typedef struct AVBitStreamFilter {
+ const char *name;
+ int priv_data_size;
+ int (*filter)(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+ void (*close)(AVBitStreamFilterContext *bsfc);
+ struct AVBitStreamFilter *next;
+} AVBitStreamFilter;
+
+void av_register_bitstream_filter(AVBitStreamFilter *bsf);
+AVBitStreamFilterContext *av_bitstream_filter_init(const char *name);
+int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc,
+ AVCodecContext *avctx, const char *args,
+ uint8_t **poutbuf, int *poutbuf_size,
+ const uint8_t *buf, int buf_size, int keyframe);
+void av_bitstream_filter_close(AVBitStreamFilterContext *bsf);
+
+AVBitStreamFilter *av_bitstream_filter_next(AVBitStreamFilter *f);
+
+/* memory */
+
+/**
+ * Allocate a buffer with padding, reusing the given one if large enough.
+ *
+ * Same behaviour av_fast_malloc but the buffer has additional
+ * FF_INPUT_PADDING_SIZE at the end which will always memset to 0.
+ *
+ */
+void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Encode extradata length to a buffer. Used by xiph codecs.
+ *
+ * @param s buffer to write to; must be at least (v/255+1) bytes long
+ * @param v size of extradata in bytes
+ * @return number of bytes written to the buffer.
+ */
+unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
+
+#if FF_API_MISSING_SAMPLE
+/**
+ * Log a generic warning message about a missing feature. This function is
+ * intended to be used internally by Libav (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] feature string containing the name of the missing feature
+ * @param[in] want_sample indicates if samples are wanted which exhibit this feature.
+ * If want_sample is non-zero, additional verbage will be added to the log
+ * message which tells the user how to report samples to the development
+ * mailing list.
+ * @deprecated Use avpriv_report_missing_feature() instead.
+ */
+attribute_deprecated
+void av_log_missing_feature(void *avc, const char *feature, int want_sample);
+
+/**
+ * Log a generic warning message asking for a sample. This function is
+ * intended to be used internally by Libav (libavcodec, libavformat, etc.)
+ * only, and would normally not be used by applications.
+ * @param[in] avc a pointer to an arbitrary struct of which the first field is
+ * a pointer to an AVClass struct
+ * @param[in] msg string containing an optional message, or NULL if no message
+ * @deprecated Use avpriv_request_sample() instead.
+ */
+attribute_deprecated
+void av_log_ask_for_sample(void *avc, const char *msg, ...) av_printf_format(2, 3);
+#endif /* FF_API_MISSING_SAMPLE */
+
+/**
+ * Register the hardware accelerator hwaccel.
+ */
+void av_register_hwaccel(AVHWAccel *hwaccel);
+
+/**
+ * If hwaccel is NULL, returns the first registered hardware accelerator,
+ * if hwaccel is non-NULL, returns the next registered hardware accelerator
+ * after hwaccel, or NULL if hwaccel is the last one.
+ */
+AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel);
+
+
+/**
+ * Lock operation used by lockmgr
+ */
+enum AVLockOp {
+ AV_LOCK_CREATE, ///< Create a mutex
+ AV_LOCK_OBTAIN, ///< Lock the mutex
+ AV_LOCK_RELEASE, ///< Unlock the mutex
+ AV_LOCK_DESTROY, ///< Free mutex resources
+};
+
+/**
+ * Register a user provided lock manager supporting the operations
+ * specified by AVLockOp. mutex points to a (void *) where the
+ * lockmgr should store/get a pointer to a user allocated mutex. It's
+ * NULL upon AV_LOCK_CREATE and != NULL for all other ops.
+ *
+ * @param cb User defined callback. Note: Libav may invoke calls to this
+ * callback during the call to av_lockmgr_register().
+ * Thus, the application must be prepared to handle that.
+ * If cb is set to NULL the lockmgr will be unregistered.
+ * Also note that during unregistration the previously registered
+ * lockmgr callback may also be invoked.
+ */
+int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
+
+/**
+ * Get the type of the given codec.
+ */
+enum AVMediaType avcodec_get_type(enum AVCodecID codec_id);
+
+/**
+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+ * with no corresponding avcodec_close()), 0 otherwise.
+ */
+int avcodec_is_open(AVCodecContext *s);
+
+/**
+ * @return a non-zero number if codec is an encoder, zero otherwise
+ */
+int av_codec_is_encoder(const AVCodec *codec);
+
+/**
+ * @return a non-zero number if codec is a decoder, zero otherwise
+ */
+int av_codec_is_decoder(const AVCodec *codec);
+
+/**
+ * @return descriptor for given codec ID or NULL if no descriptor exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
+
+/**
+ * Iterate over all codec descriptors known to libavcodec.
+ *
+ * @param prev previous descriptor. NULL to get the first descriptor.
+ *
+ * @return next descriptor or NULL after the last descriptor
+ */
+const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
+
+/**
+ * @return codec descriptor with the given name or NULL if no such descriptor
+ * exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_AVCODEC_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/avfft.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/avfft.h
new file mode 100644
index 000000000..e2e727da9
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/avfft.h
@@ -0,0 +1,118 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AVFFT_H
+#define AVCODEC_AVFFT_H
+
+/**
+ * @file
+ * @ingroup lavc_fft
+ * FFT functions
+ */
+
+/**
+ * @defgroup lavc_fft FFT functions
+ * @ingroup lavc_misc
+ *
+ * @{
+ */
+
+typedef float FFTSample;
+
+typedef struct FFTComplex {
+ FFTSample re, im;
+} FFTComplex;
+
+typedef struct FFTContext FFTContext;
+
+/**
+ * Set up a complex FFT.
+ * @param nbits log2 of the length of the input array
+ * @param inverse if 0 perform the forward transform, if 1 perform the inverse
+ */
+FFTContext *av_fft_init(int nbits, int inverse);
+
+/**
+ * Do the permutation needed BEFORE calling ff_fft_calc().
+ */
+void av_fft_permute(FFTContext *s, FFTComplex *z);
+
+/**
+ * Do a complex FFT with the parameters defined in av_fft_init(). The
+ * input data must be permuted before. No 1.0/sqrt(n) normalization is done.
+ */
+void av_fft_calc(FFTContext *s, FFTComplex *z);
+
+void av_fft_end(FFTContext *s);
+
+FFTContext *av_mdct_init(int nbits, int inverse, double scale);
+void av_imdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_imdct_half(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_calc(FFTContext *s, FFTSample *output, const FFTSample *input);
+void av_mdct_end(FFTContext *s);
+
+/* Real Discrete Fourier Transform */
+
+enum RDFTransformType {
+ DFT_R2C,
+ IDFT_C2R,
+ IDFT_R2C,
+ DFT_C2R,
+};
+
+typedef struct RDFTContext RDFTContext;
+
+/**
+ * Set up a real FFT.
+ * @param nbits log2 of the length of the input array
+ * @param trans the type of transform
+ */
+RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
+void av_rdft_calc(RDFTContext *s, FFTSample *data);
+void av_rdft_end(RDFTContext *s);
+
+/* Discrete Cosine Transform */
+
+typedef struct DCTContext DCTContext;
+
+enum DCTTransformType {
+ DCT_II = 0,
+ DCT_III,
+ DCT_I,
+ DST_I,
+};
+
+/**
+ * Set up DCT.
+ *
+ * @param nbits size of the input array:
+ * (1 << nbits) for DCT-II, DCT-III and DST-I
+ * (1 << nbits) + 1 for DCT-I
+ * @param type the type of transform
+ *
+ * @note the first element of the input of DST-I is ignored
+ */
+DCTContext *av_dct_init(int nbits, enum DCTTransformType type);
+void av_dct_calc(DCTContext *s, FFTSample *data);
+void av_dct_end (DCTContext *s);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_AVFFT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/dxva2.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/dxva2.h
new file mode 100644
index 000000000..d161eb9f5
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/dxva2.h
@@ -0,0 +1,88 @@
+/*
+ * DXVA2 HW acceleration
+ *
+ * copyright (c) 2009 Laurent Aimar
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_DXVA_H
+#define AVCODEC_DXVA_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_dxva2
+ * Public libavcodec DXVA2 header.
+ */
+
+#define _WIN32_WINNT 0x0600
+#include <stdint.h>
+#include <d3d9.h>
+#include <dxva2api.h>
+
+/**
+ * @defgroup lavc_codec_hwaccel_dxva2 DXVA2
+ * @ingroup lavc_codec_hwaccel
+ *
+ * @{
+ */
+
+#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
+
+/**
+ * This structure is used to provides the necessary configurations and data
+ * to the DXVA2 Libav HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct dxva_context {
+ /**
+ * DXVA2 decoder object
+ */
+ IDirectXVideoDecoder *decoder;
+
+ /**
+ * DXVA2 configuration used to create the decoder
+ */
+ const DXVA2_ConfigPictureDecode *cfg;
+
+ /**
+ * The number of surface in the surface array
+ */
+ unsigned surface_count;
+
+ /**
+ * The array of Direct3D surfaces used to create the decoder
+ */
+ LPDIRECT3DSURFACE9 *surface;
+
+ /**
+ * A bit field configuring the workarounds needed for using the decoder
+ */
+ uint64_t workaround;
+
+ /**
+ * Private to the Libav AVHWAccel implementation
+ */
+ unsigned report_id;
+};
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_DXVA_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vaapi.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vaapi.h
new file mode 100644
index 000000000..39e88259d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vaapi.h
@@ -0,0 +1,173 @@
+/*
+ * Video Acceleration API (shared data between Libav and the video player)
+ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
+ *
+ * Copyright (C) 2008-2009 Splitted-Desktop Systems
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VAAPI_H
+#define AVCODEC_VAAPI_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vaapi
+ * Public libavcodec VA API header.
+ */
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
+ * @ingroup lavc_codec_hwaccel
+ * @{
+ */
+
+/**
+ * This structure is used to share data between the Libav library and
+ * the client video application.
+ * This shall be zero-allocated and available as
+ * AVCodecContext.hwaccel_context. All user members can be set once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ */
+struct vaapi_context {
+ /**
+ * Window system dependent data
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ void *display;
+
+ /**
+ * Configuration ID
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t config_id;
+
+ /**
+ * Context ID (video decode pipeline)
+ *
+ * - encoding: unused
+ * - decoding: Set by user
+ */
+ uint32_t context_id;
+
+ /**
+ * VAPictureParameterBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t pic_param_buf_id;
+
+ /**
+ * VAIQMatrixBuffer ID
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t iq_matrix_buf_id;
+
+ /**
+ * VABitPlaneBuffer ID (for VC-1 decoding)
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t bitplane_buf_id;
+
+ /**
+ * Slice parameter/data buffer IDs
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t *slice_buf_ids;
+
+ /**
+ * Number of effective slice buffer IDs to send to the HW
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int n_slice_buf_ids;
+
+ /**
+ * Size of pre-allocated slice_buf_ids
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_buf_ids_alloc;
+
+ /**
+ * Pointer to VASliceParameterBuffers
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ void *slice_params;
+
+ /**
+ * Size of a VASliceParameterBuffer element
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_param_size;
+
+ /**
+ * Size of pre-allocated slice_params
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_params_alloc;
+
+ /**
+ * Number of slices currently filled in
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ unsigned int slice_count;
+
+ /**
+ * Pointer to slice data buffer base
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ const uint8_t *slice_data;
+
+ /**
+ * Current size of slice data
+ *
+ * - encoding: unused
+ * - decoding: Set by libavcodec
+ */
+ uint32_t slice_data_size;
+};
+
+/* @} */
+
+#endif /* AVCODEC_VAAPI_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vda.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vda.h
new file mode 100644
index 000000000..987b94f1f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vda.h
@@ -0,0 +1,142 @@
+/*
+ * VDA HW acceleration
+ *
+ * copyright (c) 2011 Sebastien Zwickert
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDA_H
+#define AVCODEC_VDA_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vda
+ * Public libavcodec VDA header.
+ */
+
+#include "libavcodec/version.h"
+
+#include <stdint.h>
+
+// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
+// http://openradar.appspot.com/8026390
+#undef __GNUC_STDC_INLINE__
+
+#define Picture QuickdrawPicture
+#include <VideoDecodeAcceleration/VDADecoder.h>
+#undef Picture
+
+/**
+ * @defgroup lavc_codec_hwaccel_vda VDA
+ * @ingroup lavc_codec_hwaccel
+ *
+ * @{
+ */
+
+/**
+ * This structure is used to provide the necessary configurations and data
+ * to the VDA Libav HWAccel implementation.
+ *
+ * The application must make it available as AVCodecContext.hwaccel_context.
+ */
+struct vda_context {
+ /**
+ * VDA decoder object.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by libavcodec.
+ */
+ VDADecoder decoder;
+
+ /**
+ * The Core Video pixel buffer that contains the current image data.
+ *
+ * encoding: unused
+ * decoding: Set by libavcodec. Unset by user.
+ */
+ CVPixelBufferRef cv_buffer;
+
+ /**
+ * Use the hardware decoder in synchronous mode.
+ *
+ * encoding: unused
+ * decoding: Set by user.
+ */
+ int use_sync_decoding;
+
+ /**
+ * The frame width.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int width;
+
+ /**
+ * The frame height.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int height;
+
+ /**
+ * The frame format.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ int format;
+
+ /**
+ * The pixel format for output image buffers.
+ *
+ * - encoding: unused
+ * - decoding: Set/Unset by user.
+ */
+ OSType cv_pix_fmt_type;
+
+ /**
+ * The current bitstream buffer.
+ */
+ uint8_t *priv_bitstream;
+
+ /**
+ * The current size of the bitstream.
+ */
+ int priv_bitstream_size;
+
+ /**
+ * The reference size used for fast reallocation.
+ */
+ int priv_allocated_size;
+};
+
+/** Create the video decoder. */
+int ff_vda_create_decoder(struct vda_context *vda_ctx,
+ uint8_t *extradata,
+ int extradata_size);
+
+/** Destroy the video decoder. */
+int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
+
+/**
+ * @}
+ */
+
+#endif /* AVCODEC_VDA_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vdpau.h
new file mode 100644
index 000000000..75cb1bf7a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/vdpau.h
@@ -0,0 +1,189 @@
+/*
+ * The Video Decode and Presentation API for UNIX (VDPAU) is used for
+ * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.
+ *
+ * Copyright (C) 2008 NVIDIA
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VDPAU_H
+#define AVCODEC_VDPAU_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_vdpau
+ * Public libavcodec VDPAU header.
+ */
+
+
+/**
+ * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer
+ * @ingroup lavc_codec_hwaccel
+ *
+ * VDPAU hardware acceleration has two modules
+ * - VDPAU decoding
+ * - VDPAU presentation
+ *
+ * The VDPAU decoding module parses all headers using Libav
+ * parsing mechanisms and uses VDPAU for the actual decoding.
+ *
+ * As per the current implementation, the actual decoding
+ * and rendering (API calls) are done as part of the VDPAU
+ * presentation (vo_vdpau.c) module.
+ *
+ * @{
+ */
+
+#include <vdpau/vdpau.h>
+#include <vdpau/vdpau_x11.h>
+
+#include "libavutil/attributes.h"
+
+#include "avcodec.h"
+#include "version.h"
+
+#if FF_API_BUFS_VDPAU
+union AVVDPAUPictureInfo {
+ VdpPictureInfoH264 h264;
+ VdpPictureInfoMPEG1Or2 mpeg;
+ VdpPictureInfoVC1 vc1;
+ VdpPictureInfoMPEG4Part2 mpeg4;
+};
+#endif
+
+/**
+ * This structure is used to share data between the libavcodec library and
+ * the client video application.
+ * The user shall zero-allocate the structure and make it available as
+ * AVCodecContext.hwaccel_context. Members can be set by the user once
+ * during initialization or through each AVCodecContext.get_buffer()
+ * function call. In any case, they must be valid prior to calling
+ * decoding functions.
+ *
+ * The size of this structure is not a part of the public ABI and must not
+ * be used outside of libavcodec. Use av_vdpau_alloc_context() to allocate an
+ * AVVDPAUContext.
+ */
+typedef struct AVVDPAUContext {
+ /**
+ * VDPAU decoder handle
+ *
+ * Set by user.
+ */
+ VdpDecoder decoder;
+
+ /**
+ * VDPAU decoder render callback
+ *
+ * Set by the user.
+ */
+ VdpDecoderRender *render;
+
+#if FF_API_BUFS_VDPAU
+ /**
+ * VDPAU picture information
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ union AVVDPAUPictureInfo info;
+
+ /**
+ * Allocated size of the bitstream_buffers table.
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ int bitstream_buffers_allocated;
+
+ /**
+ * Useful bitstream buffers in the bitstream buffers table.
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ int bitstream_buffers_used;
+
+ /**
+ * Table of bitstream buffers.
+ * The user is responsible for freeing this buffer using av_freep().
+ *
+ * Set by libavcodec.
+ */
+ attribute_deprecated
+ VdpBitstreamBuffer *bitstream_buffers;
+#endif
+} AVVDPAUContext;
+
+/**
+ * Allocate an AVVDPAUContext.
+ *
+ * @return Newly-allocated AVVDPAUContext or NULL on failure.
+ */
+AVVDPAUContext *av_vdpau_alloc_context(void);
+
+/**
+ * Get a decoder profile that should be used for initializing a VDPAU decoder.
+ * Should be called from the AVCodecContext.get_format() callback.
+ *
+ * @param avctx the codec context being used for decoding the stream
+ * @param profile a pointer into which the result will be written on success.
+ * The contents of profile are undefined if this function returns
+ * an error.
+ *
+ * @return 0 on success (non-negative), a negative AVERROR on failure.
+ */
+int av_vdpau_get_profile(AVCodecContext *avctx, VdpDecoderProfile *profile);
+
+#if FF_API_CAP_VDPAU
+/** @brief The videoSurface is used for rendering. */
+#define FF_VDPAU_STATE_USED_FOR_RENDER 1
+
+/**
+ * @brief The videoSurface is needed for reference/prediction.
+ * The codec manipulates this.
+ */
+#define FF_VDPAU_STATE_USED_FOR_REFERENCE 2
+
+/**
+ * @brief This structure is used as a callback between the Libav
+ * decoder (vd_) and presentation (vo_) module.
+ * This is used for defining a video frame containing surface,
+ * picture parameter, bitstream information etc which are passed
+ * between the Libav decoder and its clients.
+ */
+struct vdpau_render_state {
+ VdpVideoSurface surface; ///< Used as rendered surface, never changed.
+
+ int state; ///< Holds FF_VDPAU_STATE_* values.
+
+ /** picture parameter information for all supported codecs */
+ union AVVDPAUPictureInfo info;
+
+ /** Describe size/location of the compressed video data.
+ Set to 0 when freeing bitstream_buffers. */
+ int bitstream_buffers_allocated;
+ int bitstream_buffers_used;
+ /** The user is responsible for freeing this buffer using av_freep(). */
+ VdpBitstreamBuffer *bitstream_buffers;
+};
+#endif
+
+/* @}*/
+
+#endif /* AVCODEC_VDPAU_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/version.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/version.h
new file mode 100644
index 000000000..cdd5a613d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/version.h
@@ -0,0 +1,127 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_VERSION_H
+#define AVCODEC_VERSION_H
+
+/**
+ * @file
+ * @ingroup libavc
+ * Libavcodec version macros.
+ */
+
+#include "libavutil/version.h"
+
+#define LIBAVCODEC_VERSION_MAJOR 55
+#define LIBAVCODEC_VERSION_MINOR 34
+#define LIBAVCODEC_VERSION_MICRO 1
+
+#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_VERSION AV_VERSION(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+ LIBAVCODEC_VERSION_MICRO)
+#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
+
+#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
+
+/**
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ */
+
+#ifndef FF_API_REQUEST_CHANNELS
+#define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_DEINTERLACE
+#define FF_API_DEINTERLACE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_DESTRUCT_PACKET
+#define FF_API_DESTRUCT_PACKET (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_GET_BUFFER
+#define FF_API_GET_BUFFER (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_MISSING_SAMPLE
+#define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_LOWRES
+#define FF_API_LOWRES (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_CAP_VDPAU
+#define FF_API_CAP_VDPAU (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_BUFS_VDPAU
+#define FF_API_BUFS_VDPAU (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_VOXWARE
+#define FF_API_VOXWARE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_SET_DIMENSIONS
+#define FF_API_SET_DIMENSIONS (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_DEBUG_MV
+#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_AC_VLC
+#define FF_API_AC_VLC (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_OLD_MSMPEG4
+#define FF_API_OLD_MSMPEG4 (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_ASPECT_EXTENDED
+#define FF_API_ASPECT_EXTENDED (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_THREAD_OPAQUE
+#define FF_API_THREAD_OPAQUE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_CODEC_PKT
+#define FF_API_CODEC_PKT (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_ARCH_ALPHA
+#define FF_API_ARCH_ALPHA (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_XVMC
+#define FF_API_XVMC (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_ERROR_RATE
+#define FF_API_ERROR_RATE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_QSCALE_TYPE
+#define FF_API_QSCALE_TYPE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_MB_TYPE
+#define FF_API_MB_TYPE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_MAX_BFRAMES
+#define FF_API_MAX_BFRAMES (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_FAST_MALLOC
+#define FF_API_FAST_MALLOC (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_NEG_LINESIZES
+#define FF_API_NEG_LINESIZES (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+#ifndef FF_API_EMU_EDGE
+#define FF_API_EMU_EDGE (LIBAVCODEC_VERSION_MAJOR < 56)
+#endif
+
+#endif /* AVCODEC_VERSION_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavcodec/xvmc.h b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/xvmc.h
new file mode 100644
index 000000000..950ed1827
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavcodec/xvmc.h
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2003 Ivan Kalvachev
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_XVMC_H
+#define AVCODEC_XVMC_H
+
+/**
+ * @file
+ * @ingroup lavc_codec_hwaccel_xvmc
+ * Public libavcodec XvMC header.
+ */
+
+#include <X11/extensions/XvMC.h>
+
+#include "libavutil/attributes.h"
+#include "version.h"
+#include "avcodec.h"
+
+#if FF_API_XVMC
+
+/**
+ * @defgroup lavc_codec_hwaccel_xvmc XvMC
+ * @ingroup lavc_codec_hwaccel
+ *
+ * @{
+ */
+
+#define AV_XVMC_ID 0x1DC711C0 /**< special value to ensure that regular pixel routines haven't corrupted the struct
+ the number is 1337 speak for the letters IDCT MCo (motion compensation) */
+
+attribute_deprecated struct xvmc_pix_fmt {
+ /** The field contains the special constant value AV_XVMC_ID.
+ It is used as a test that the application correctly uses the API,
+ and that there is no corruption caused by pixel routines.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int xvmc_id;
+
+ /** Pointer to the block array allocated by XvMCCreateBlocks().
+ The array has to be freed by XvMCDestroyBlocks().
+ Each group of 64 values represents one data block of differential
+ pixel information (in MoCo mode) or coefficients for IDCT.
+ - application - set the pointer during initialization
+ - libavcodec - fills coefficients/pixel data into the array
+ */
+ short* data_blocks;
+
+ /** Pointer to the macroblock description array allocated by
+ XvMCCreateMacroBlocks() and freed by XvMCDestroyMacroBlocks().
+ - application - set the pointer during initialization
+ - libavcodec - fills description data into the array
+ */
+ XvMCMacroBlock* mv_blocks;
+
+ /** Number of macroblock descriptions that can be stored in the mv_blocks
+ array.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int allocated_mv_blocks;
+
+ /** Number of blocks that can be stored at once in the data_blocks array.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int allocated_data_blocks;
+
+ /** Indicate that the hardware would interpret data_blocks as IDCT
+ coefficients and perform IDCT on them.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int idct;
+
+ /** In MoCo mode it indicates that intra macroblocks are assumed to be in
+ unsigned format; same as the XVMC_INTRA_UNSIGNED flag.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ int unsigned_intra;
+
+ /** Pointer to the surface allocated by XvMCCreateSurface().
+ It has to be freed by XvMCDestroySurface() on application exit.
+ It identifies the frame and its state on the video hardware.
+ - application - set during initialization
+ - libavcodec - unchanged
+ */
+ XvMCSurface* p_surface;
+
+/** Set by the decoder before calling ff_draw_horiz_band(),
+ needed by the XvMCRenderSurface function. */
+//@{
+ /** Pointer to the surface used as past reference
+ - application - unchanged
+ - libavcodec - set
+ */
+ XvMCSurface* p_past_surface;
+
+ /** Pointer to the surface used as future reference
+ - application - unchanged
+ - libavcodec - set
+ */
+ XvMCSurface* p_future_surface;
+
+ /** top/bottom field or frame
+ - application - unchanged
+ - libavcodec - set
+ */
+ unsigned int picture_structure;
+
+ /** XVMC_SECOND_FIELD - 1st or 2nd field in the sequence
+ - application - unchanged
+ - libavcodec - set
+ */
+ unsigned int flags;
+//}@
+
+ /** Number of macroblock descriptions in the mv_blocks array
+ that have already been passed to the hardware.
+ - application - zeroes it on get_buffer().
+ A successful ff_draw_horiz_band() may increment it
+ with filled_mb_block_num or zero both.
+ - libavcodec - unchanged
+ */
+ int start_mv_blocks_num;
+
+ /** Number of new macroblock descriptions in the mv_blocks array (after
+ start_mv_blocks_num) that are filled by libavcodec and have to be
+ passed to the hardware.
+ - application - zeroes it on get_buffer() or after successful
+ ff_draw_horiz_band().
+ - libavcodec - increment with one of each stored MB
+ */
+ int filled_mv_blocks_num;
+
+ /** Number of the next free data block; one data block consists of
+ 64 short values in the data_blocks array.
+ All blocks before this one have already been claimed by placing their
+ position into the corresponding block description structure field,
+ that are part of the mv_blocks array.
+ - application - zeroes it on get_buffer().
+ A successful ff_draw_horiz_band() may zero it together
+ with start_mb_blocks_num.
+ - libavcodec - each decoded macroblock increases it by the number
+ of coded blocks it contains.
+ */
+ int next_free_data_block_num;
+};
+
+/**
+ * @}
+ */
+
+#endif /* FF_API_XVMC */
+
+#endif /* AVCODEC_XVMC_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/adler32.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/adler32.h
new file mode 100644
index 000000000..a8ff6f9d4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/adler32.h
@@ -0,0 +1,43 @@
+/*
+ * copyright (c) 2006 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_ADLER32_H
+#define AVUTIL_ADLER32_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+/**
+ * @ingroup lavu_crypto
+ * Calculate the Adler32 checksum of a buffer.
+ *
+ * Passing the return value to a subsequent av_adler32_update() call
+ * allows the checksum of multiple buffers to be calculated as though
+ * they were concatenated.
+ *
+ * @param adler initial checksum value
+ * @param buf pointer to input buffer
+ * @param len size of input buffer
+ * @return updated checksum
+ */
+unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf,
+ unsigned int len) av_pure;
+
+#endif /* AVUTIL_ADLER32_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/aes.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/aes.h
new file mode 100644
index 000000000..edff275b7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/aes.h
@@ -0,0 +1,67 @@
+/*
+ * copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AES_H
+#define AVUTIL_AES_H
+
+#include <stdint.h>
+
+#include "attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavu_aes AES
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#if FF_API_CONTEXT_SIZE
+extern attribute_deprecated const int av_aes_size;
+#endif
+
+struct AVAES;
+
+/**
+ * Allocate an AVAES context.
+ */
+struct AVAES *av_aes_alloc(void);
+
+/**
+ * Initialize an AVAES context.
+ * @param key_bits 128, 192 or 256
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+int av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ * @param count number of 16 byte blocks
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param iv initialization vector for CBC mode, if NULL then ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AES_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/attributes.h
new file mode 100644
index 000000000..d7f2bb5c6
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/attributes.h
@@ -0,0 +1,126 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Macro definitions for various function/variable attributes
+ */
+
+#ifndef AVUTIL_ATTRIBUTES_H
+#define AVUTIL_ATTRIBUTES_H
+
+#ifdef __GNUC__
+# define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y)
+#else
+# define AV_GCC_VERSION_AT_LEAST(x,y) 0
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_always_inline __attribute__((always_inline)) inline
+#elif defined(_MSC_VER)
+# define av_always_inline __forceinline
+#else
+# define av_always_inline inline
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_noinline __attribute__((noinline))
+#elif defined(_MSC_VER)
+# define av_noinline __declspec(noinline)
+#else
+# define av_noinline
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_pure __attribute__((pure))
+#else
+# define av_pure
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(2,6)
+# define av_const __attribute__((const))
+#else
+# define av_const
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+# define av_cold __attribute__((cold))
+#else
+# define av_cold
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__)
+# define av_flatten __attribute__((flatten))
+#else
+# define av_flatten
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define attribute_deprecated __attribute__((deprecated))
+#elif defined(_MSC_VER)
+# define attribute_deprecated __declspec(deprecated)
+#else
+# define attribute_deprecated
+#endif
+
+#if defined(__GNUC__)
+# define av_unused __attribute__((unused))
+#else
+# define av_unused
+#endif
+
+/**
+ * Mark a variable as used and prevent the compiler from optimizing it
+ * away. This is useful for variables accessed only from inline
+ * assembler without the compiler being aware.
+ */
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+# define av_used __attribute__((used))
+#else
+# define av_used
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,3)
+# define av_alias __attribute__((may_alias))
+#else
+# define av_alias
+#endif
+
+#if defined(__GNUC__) && !defined(__ICC)
+# define av_uninit(x) x=x
+#else
+# define av_uninit(x) x
+#endif
+
+#ifdef __GNUC__
+# define av_builtin_constant_p __builtin_constant_p
+# define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))
+#else
+# define av_builtin_constant_p(x) 0
+# define av_printf_format(fmtpos, attrpos)
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(2,5)
+# define av_noreturn __attribute__((noreturn))
+#else
+# define av_noreturn
+#endif
+
+#endif /* AVUTIL_ATTRIBUTES_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/audio_fifo.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/audio_fifo.h
new file mode 100644
index 000000000..8c7638825
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/audio_fifo.h
@@ -0,0 +1,146 @@
+/*
+ * Audio FIFO
+ * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Audio FIFO Buffer
+ */
+
+#ifndef AVUTIL_AUDIO_FIFO_H
+#define AVUTIL_AUDIO_FIFO_H
+
+#include "avutil.h"
+#include "fifo.h"
+#include "samplefmt.h"
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * Context for an Audio FIFO Buffer.
+ *
+ * - Operates at the sample level rather than the byte level.
+ * - Supports multiple channels with either planar or packed sample format.
+ * - Automatic reallocation when writing to a full buffer.
+ */
+typedef struct AVAudioFifo AVAudioFifo;
+
+/**
+ * Free an AVAudioFifo.
+ *
+ * @param af AVAudioFifo to free
+ */
+void av_audio_fifo_free(AVAudioFifo *af);
+
+/**
+ * Allocate an AVAudioFifo.
+ *
+ * @param sample_fmt sample format
+ * @param channels number of channels
+ * @param nb_samples initial allocation size, in samples
+ * @return newly allocated AVAudioFifo, or NULL on error
+ */
+AVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels,
+ int nb_samples);
+
+/**
+ * Reallocate an AVAudioFifo.
+ *
+ * @param af AVAudioFifo to reallocate
+ * @param nb_samples new allocation size, in samples
+ * @return 0 if OK, or negative AVERROR code on failure
+ */
+int av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples);
+
+/**
+ * Write data to an AVAudioFifo.
+ *
+ * The AVAudioFifo will be reallocated automatically if the available space
+ * is less than nb_samples.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param af AVAudioFifo to write to
+ * @param data audio data plane pointers
+ * @param nb_samples number of samples to write
+ * @return number of samples actually written, or negative AVERROR
+ * code on failure.
+ */
+int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples);
+
+/**
+ * Read data from an AVAudioFifo.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param af AVAudioFifo to read from
+ * @param data audio data plane pointers
+ * @param nb_samples number of samples to read
+ * @return number of samples actually read, or negative AVERROR code
+ * on failure.
+ */
+int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples);
+
+/**
+ * Drain data from an AVAudioFifo.
+ *
+ * Removes the data without reading it.
+ *
+ * @param af AVAudioFifo to drain
+ * @param nb_samples number of samples to drain
+ * @return 0 if OK, or negative AVERROR code on failure
+ */
+int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples);
+
+/**
+ * Reset the AVAudioFifo buffer.
+ *
+ * This empties all data in the buffer.
+ *
+ * @param af AVAudioFifo to reset
+ */
+void av_audio_fifo_reset(AVAudioFifo *af);
+
+/**
+ * Get the current number of samples in the AVAudioFifo available for reading.
+ *
+ * @param af the AVAudioFifo to query
+ * @return number of samples available for reading
+ */
+int av_audio_fifo_size(AVAudioFifo *af);
+
+/**
+ * Get the current number of samples in the AVAudioFifo available for writing.
+ *
+ * @param af the AVAudioFifo to query
+ * @return number of samples available for writing
+ */
+int av_audio_fifo_space(AVAudioFifo *af);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AUDIO_FIFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/audioconvert.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/audioconvert.h
new file mode 100644
index 000000000..300a67cd3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/audioconvert.h
@@ -0,0 +1,6 @@
+
+#include "version.h"
+
+#if FF_API_AUDIOCONVERT
+#include "channel_layout.h"
+#endif
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/avassert.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avassert.h
new file mode 100644
index 000000000..b223d26e8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avassert.h
@@ -0,0 +1,66 @@
+/*
+ * copyright (c) 2010 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * simple assert() macros that are a bit more flexible than ISO C assert().
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_AVASSERT_H
+#define AVUTIL_AVASSERT_H
+
+#include <stdlib.h>
+#include "avutil.h"
+#include "log.h"
+
+/**
+ * assert() equivalent, that is always enabled.
+ */
+#define av_assert0(cond) do { \
+ if (!(cond)) { \
+ av_log(NULL, AV_LOG_FATAL, "Assertion %s failed at %s:%d\n", \
+ AV_STRINGIFY(cond), __FILE__, __LINE__); \
+ abort(); \
+ } \
+} while (0)
+
+
+/**
+ * assert() equivalent, that does not lie in speed critical code.
+ * These asserts() thus can be enabled without fearing speedloss.
+ */
+#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0
+#define av_assert1(cond) av_assert0(cond)
+#else
+#define av_assert1(cond) ((void)0)
+#endif
+
+
+/**
+ * assert() equivalent, that does lie in speed critical code.
+ */
+#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
+#define av_assert2(cond) av_assert0(cond)
+#else
+#define av_assert2(cond) ((void)0)
+#endif
+
+#endif /* AVUTIL_AVASSERT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avconfig.h
new file mode 100644
index 000000000..f10aa6186
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffconf */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/avstring.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avstring.h
new file mode 100644
index 000000000..b7d10983c
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avstring.h
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2007 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVSTRING_H
+#define AVUTIL_AVSTRING_H
+
+#include <stddef.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_string
+ * @{
+ */
+
+/**
+ * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to
+ * the address of the first character in str after the prefix.
+ *
+ * @param str input string
+ * @param pfx prefix to test
+ * @param ptr updated if the prefix is matched inside str
+ * @return non-zero if the prefix matches, zero otherwise
+ */
+int av_strstart(const char *str, const char *pfx, const char **ptr);
+
+/**
+ * Return non-zero if pfx is a prefix of str independent of case. If
+ * it is, *ptr is set to the address of the first character in str
+ * after the prefix.
+ *
+ * @param str input string
+ * @param pfx prefix to test
+ * @param ptr updated if the prefix is matched inside str
+ * @return non-zero if the prefix matches, zero otherwise
+ */
+int av_stristart(const char *str, const char *pfx, const char **ptr);
+
+/**
+ * Locate the first case-independent occurrence in the string haystack
+ * of the string needle. A zero-length string needle is considered to
+ * match at the start of haystack.
+ *
+ * This function is a case-insensitive version of the standard strstr().
+ *
+ * @param haystack string to search in
+ * @param needle string to search for
+ * @return pointer to the located match within haystack
+ * or a null pointer if no match
+ */
+char *av_stristr(const char *haystack, const char *needle);
+
+/**
+ * Locate the first occurrence of the string needle in the string haystack
+ * where not more than hay_length characters are searched. A zero-length
+ * string needle is considered to match at the start of haystack.
+ *
+ * This function is a length-limited version of the standard strstr().
+ *
+ * @param haystack string to search in
+ * @param needle string to search for
+ * @param hay_length length of string to search in
+ * @return pointer to the located match within haystack
+ * or a null pointer if no match
+ */
+char *av_strnstr(const char *haystack, const char *needle, size_t hay_length);
+
+/**
+ * Copy the string src to dst, but no more than size - 1 bytes, and
+ * null-terminate dst.
+ *
+ * This function is the same as BSD strlcpy().
+ *
+ * @param dst destination buffer
+ * @param src source string
+ * @param size size of destination buffer
+ * @return the length of src
+ *
+ * @warning since the return value is the length of src, src absolutely
+ * _must_ be a properly 0-terminated string, otherwise this will read beyond
+ * the end of the buffer and possibly crash.
+ */
+size_t av_strlcpy(char *dst, const char *src, size_t size);
+
+/**
+ * Append the string src to the string dst, but to a total length of
+ * no more than size - 1 bytes, and null-terminate dst.
+ *
+ * This function is similar to BSD strlcat(), but differs when
+ * size <= strlen(dst).
+ *
+ * @param dst destination buffer
+ * @param src source string
+ * @param size size of destination buffer
+ * @return the total length of src and dst
+ *
+ * @warning since the return value use the length of src and dst, these
+ * absolutely _must_ be a properly 0-terminated strings, otherwise this
+ * will read beyond the end of the buffer and possibly crash.
+ */
+size_t av_strlcat(char *dst, const char *src, size_t size);
+
+/**
+ * Append output to a string, according to a format. Never write out of
+ * the destination buffer, and always put a terminating 0 within
+ * the buffer.
+ * @param dst destination buffer (string to which the output is
+ * appended)
+ * @param size total size of the destination buffer
+ * @param fmt printf-compatible format string, specifying how the
+ * following parameters are used
+ * @return the length of the string that would have been generated
+ * if enough space had been available
+ */
+size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);
+
+/**
+ * Convert a number to a av_malloced string.
+ */
+char *av_d2str(double d);
+
+/**
+ * Unescape the given string until a non escaped terminating char,
+ * and return the token corresponding to the unescaped string.
+ *
+ * The normal \ and ' escaping is supported. Leading and trailing
+ * whitespaces are removed, unless they are escaped with '\' or are
+ * enclosed between ''.
+ *
+ * @param buf the buffer to parse, buf will be updated to point to the
+ * terminating char
+ * @param term a 0-terminated list of terminating chars
+ * @return the malloced unescaped string, which must be av_freed by
+ * the user, NULL in case of allocation failure
+ */
+char *av_get_token(const char **buf, const char *term);
+
+/**
+ * Locale-independent conversion of ASCII isdigit.
+ */
+int av_isdigit(int c);
+
+/**
+ * Locale-independent conversion of ASCII isgraph.
+ */
+int av_isgraph(int c);
+
+/**
+ * Locale-independent conversion of ASCII isspace.
+ */
+int av_isspace(int c);
+
+/**
+ * Locale-independent conversion of ASCII characters to uppercase.
+ */
+static inline int av_toupper(int c)
+{
+ if (c >= 'a' && c <= 'z')
+ c ^= 0x20;
+ return c;
+}
+
+/**
+ * Locale-independent conversion of ASCII characters to lowercase.
+ */
+static inline int av_tolower(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ c ^= 0x20;
+ return c;
+}
+
+/**
+ * Locale-independent conversion of ASCII isxdigit.
+ */
+int av_isxdigit(int c);
+
+/*
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strcasecmp(const char *a, const char *b);
+
+/**
+ * Locale-independent case-insensitive compare.
+ * @note This means only ASCII-range characters are case-insensitive
+ */
+int av_strncasecmp(const char *a, const char *b, size_t n);
+
+
+/**
+ * Thread safe basename.
+ * @param path the path, on DOS both \ and / are considered separators.
+ * @return pointer to the basename substring.
+ */
+const char *av_basename(const char *path);
+
+/**
+ * Thread safe dirname.
+ * @param path the path, on DOS both \ and / are considered separators.
+ * @return the path with the separator replaced by the string terminator or ".".
+ * @note the function may change the input string.
+ */
+const char *av_dirname(char *path);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_AVSTRING_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avutil.h
new file mode 100644
index 000000000..a0d35d162
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/avutil.h
@@ -0,0 +1,284 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_AVUTIL_H
+#define AVUTIL_AVUTIL_H
+
+/**
+ * @file
+ * external API header
+ */
+
+/**
+ * @mainpage
+ *
+ * @section libav_intro Introduction
+ *
+ * This document describes the usage of the different libraries
+ * provided by Libav.
+ *
+ * @li @ref libavc "libavcodec" encoding/decoding library
+ * @li @ref lavfi "libavfilter" graph-based frame editing library
+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
+ * @li @ref lavu "libavutil" common utility library
+ * @li @ref lavr "libavresample" audio resampling, format conversion and mixing
+ * @li @ref libsws "libswscale" color conversion and scaling library
+ *
+ * @section libav_versioning Versioning and compatibility
+ *
+ * Each of the Libav libraries contains a version.h header, which defines a
+ * major, minor and micro version number with the
+ * <em>LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO}</em> macros. The major version
+ * number is incremented with backward incompatible changes - e.g. removing
+ * parts of the public API, reordering public struct members, etc. The minor
+ * version number is incremented for backward compatible API changes or major
+ * new features - e.g. adding a new public function or a new decoder. The micro
+ * version number is incremented for smaller changes that a calling program
+ * might still want to check for - e.g. changing behavior in a previously
+ * unspecified situation.
+ *
+ * Libav guarantees backward API and ABI compatibility for each library as long
+ * as its major version number is unchanged. This means that no public symbols
+ * will be removed or renamed. Types and names of the public struct members and
+ * values of public macros and enums will remain the same (unless they were
+ * explicitly declared as not part of the public API). Documented behavior will
+ * not change.
+ *
+ * In other words, any correct program that works with a given Libav snapshot
+ * should work just as well without any changes with any later snapshot with the
+ * same major versions. This applies to both rebuilding the program against new
+ * Libav versions or to replacing the dynamic Libav libraries that a program
+ * links against.
+ *
+ * However, new public symbols may be added and new members may be appended to
+ * public structs whose size is not part of public ABI (most public structs in
+ * Libav). New macros and enum values may be added. Behavior in undocumented
+ * situations may change slightly (and be documented). All those are accompanied
+ * by an entry in doc/APIchanges and incrementing either the minor or micro
+ * version number.
+ */
+
+/**
+ * @defgroup lavu Common utility functions
+ *
+ * @brief
+ * libavutil contains the code shared across all the other Libav
+ * libraries
+ *
+ * @note In order to use the functions provided by avutil you must include
+ * the specific header.
+ *
+ * @{
+ *
+ * @defgroup lavu_crypto Crypto and Hashing
+ *
+ * @{
+ * @}
+ *
+ * @defgroup lavu_math Maths
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_string String Manipulation
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_mem Memory Management
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_data Data Structures
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_audio Audio related
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_error Error Codes
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_log Logging Facility
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup lavu_misc Other
+ *
+ * @{
+ *
+ * @defgroup lavu_internal Internal
+ *
+ * Not exported functions, for internal usage only
+ *
+ * @{
+ *
+ * @}
+ *
+ * @defgroup preproc_misc Preprocessor String Macros
+ *
+ * @{
+ *
+ * @}
+ */
+
+
+/**
+ * @addtogroup lavu_ver
+ * @{
+ */
+
+/**
+ * Return the LIBAVUTIL_VERSION_INT constant.
+ */
+unsigned avutil_version(void);
+
+/**
+ * Return the libavutil build-time configuration.
+ */
+const char *avutil_configuration(void);
+
+/**
+ * Return the libavutil license.
+ */
+const char *avutil_license(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup lavu_media Media Type
+ * @brief Media Type
+ */
+
+enum AVMediaType {
+ AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA
+ AVMEDIA_TYPE_VIDEO,
+ AVMEDIA_TYPE_AUDIO,
+ AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous
+ AVMEDIA_TYPE_SUBTITLE,
+ AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse
+ AVMEDIA_TYPE_NB
+};
+
+/**
+ * @defgroup lavu_const Constants
+ * @{
+ *
+ * @defgroup lavu_enc Encoding specific
+ *
+ * @note those definition should move to avcodec
+ * @{
+ */
+
+#define FF_LAMBDA_SHIFT 7
+#define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)
+#define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
+#define FF_LAMBDA_MAX (256*128-1)
+
+#define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
+
+/**
+ * @}
+ * @defgroup lavu_time Timestamp specific
+ *
+ * Libav internal timebase and timestamp definitions
+ *
+ * @{
+ */
+
+/**
+ * @brief Undefined timestamp value
+ *
+ * Usually reported by demuxer that work on containers that do not provide
+ * either pts or dts.
+ */
+
+#define AV_NOPTS_VALUE INT64_C(0x8000000000000000)
+
+/**
+ * Internal time base represented as integer
+ */
+
+#define AV_TIME_BASE 1000000
+
+/**
+ * Internal time base represented as fractional value
+ */
+
+#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
+
+/**
+ * @}
+ * @}
+ * @defgroup lavu_picture Image related
+ *
+ * AVPicture types, pixel formats and basic image planes manipulation.
+ *
+ * @{
+ */
+
+enum AVPictureType {
+ AV_PICTURE_TYPE_I = 1, ///< Intra
+ AV_PICTURE_TYPE_P, ///< Predicted
+ AV_PICTURE_TYPE_B, ///< Bi-dir predicted
+ AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG4
+ AV_PICTURE_TYPE_SI, ///< Switching Intra
+ AV_PICTURE_TYPE_SP, ///< Switching Predicted
+ AV_PICTURE_TYPE_BI, ///< BI type
+};
+
+/**
+ * Return a single letter to describe the given picture type
+ * pict_type.
+ *
+ * @param[in] pict_type the picture type @return a single character
+ * representing the picture type, '?' if pict_type is unknown
+ */
+char av_get_picture_type_char(enum AVPictureType pict_type);
+
+/**
+ * @}
+ */
+
+#include "error.h"
+#include "version.h"
+#include "macros.h"
+
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_AVUTIL_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/base64.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/base64.h
new file mode 100644
index 000000000..4750cf5c7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/base64.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BASE64_H
+#define AVUTIL_BASE64_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_base64 Base64
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+
+/**
+ * Decode a base64-encoded string.
+ *
+ * @param out buffer for decoded data
+ * @param in null-terminated input string
+ * @param out_size size in bytes of the out buffer, must be at
+ * least 3/4 of the length of in
+ * @return number of bytes written, or a negative value in case of
+ * invalid input
+ */
+int av_base64_decode(uint8_t *out, const char *in, int out_size);
+
+/**
+ * Encode data to base64 and null-terminate.
+ *
+ * @param out buffer for encoded data
+ * @param out_size size in bytes of the output buffer, must be at
+ * least AV_BASE64_SIZE(in_size)
+ * @param in_size size in bytes of the 'in' buffer
+ * @return 'out' or NULL in case of error
+ */
+char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size);
+
+/**
+ * Calculate the output size needed to base64-encode x bytes.
+ */
+#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1)
+
+ /**
+ * @}
+ */
+
+#endif /* AVUTIL_BASE64_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/blowfish.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/blowfish.h
new file mode 100644
index 000000000..8c29536cf
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/blowfish.h
@@ -0,0 +1,76 @@
+/*
+ * Blowfish algorithm
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_BLOWFISH_H
+#define AVUTIL_BLOWFISH_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_blowfish Blowfish
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#define AV_BF_ROUNDS 16
+
+typedef struct AVBlowfish {
+ uint32_t p[AV_BF_ROUNDS + 2];
+ uint32_t s[4][256];
+} AVBlowfish;
+
+/**
+ * Initialize an AVBlowfish context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param key a key
+ * @param key_len length of the key
+ */
+void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param xl left four bytes halves of input to be encrypted
+ * @param xr right four bytes halves of input to be encrypted
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
+ int decrypt);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVBlowfish context
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param count number of 8 byte blocks
+ * @param iv initialization vector for CBC mode, if NULL ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
+ int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_BLOWFISH_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/bswap.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/bswap.h
new file mode 100644
index 000000000..93a6016b8
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/bswap.h
@@ -0,0 +1,111 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * byte swapping routines
+ */
+
+#ifndef AVUTIL_BSWAP_H
+#define AVUTIL_BSWAP_H
+
+#include <stdint.h>
+#include "libavutil/avconfig.h"
+#include "attributes.h"
+
+#ifdef HAVE_AV_CONFIG_H
+
+#include "config.h"
+
+#if ARCH_AARCH64
+# include "aarch64/bswap.h"
+#elif ARCH_ARM
+# include "arm/bswap.h"
+#elif ARCH_AVR32
+# include "avr32/bswap.h"
+#elif ARCH_BFIN
+# include "bfin/bswap.h"
+#elif ARCH_SH4
+# include "sh4/bswap.h"
+#elif ARCH_X86
+# include "x86/bswap.h"
+#endif
+
+#endif /* HAVE_AV_CONFIG_H */
+
+#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff))
+#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16))
+#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32))
+
+#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x)
+
+#ifndef av_bswap16
+static av_always_inline av_const uint16_t av_bswap16(uint16_t x)
+{
+ x= (x>>8) | (x<<8);
+ return x;
+}
+#endif
+
+#ifndef av_bswap32
+static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
+{
+ return AV_BSWAP32C(x);
+}
+#endif
+
+#ifndef av_bswap64
+static inline uint64_t av_const av_bswap64(uint64_t x)
+{
+ return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32);
+}
+#endif
+
+// be2ne ... big-endian to native-endian
+// le2ne ... little-endian to native-endian
+
+#if AV_HAVE_BIGENDIAN
+#define av_be2ne16(x) (x)
+#define av_be2ne32(x) (x)
+#define av_be2ne64(x) (x)
+#define av_le2ne16(x) av_bswap16(x)
+#define av_le2ne32(x) av_bswap32(x)
+#define av_le2ne64(x) av_bswap64(x)
+#define AV_BE2NEC(s, x) (x)
+#define AV_LE2NEC(s, x) AV_BSWAPC(s, x)
+#else
+#define av_be2ne16(x) av_bswap16(x)
+#define av_be2ne32(x) av_bswap32(x)
+#define av_be2ne64(x) av_bswap64(x)
+#define av_le2ne16(x) (x)
+#define av_le2ne32(x) (x)
+#define av_le2ne64(x) (x)
+#define AV_BE2NEC(s, x) AV_BSWAPC(s, x)
+#define AV_LE2NEC(s, x) (x)
+#endif
+
+#define AV_BE2NE16C(x) AV_BE2NEC(16, x)
+#define AV_BE2NE32C(x) AV_BE2NEC(32, x)
+#define AV_BE2NE64C(x) AV_BE2NEC(64, x)
+#define AV_LE2NE16C(x) AV_LE2NEC(16, x)
+#define AV_LE2NE32C(x) AV_LE2NEC(32, x)
+#define AV_LE2NE64C(x) AV_LE2NEC(64, x)
+
+#endif /* AVUTIL_BSWAP_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/buffer.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/buffer.h
new file mode 100644
index 000000000..56b4d020e
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/buffer.h
@@ -0,0 +1,267 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @ingroup lavu_buffer
+ * refcounted data buffer API
+ */
+
+#ifndef AVUTIL_BUFFER_H
+#define AVUTIL_BUFFER_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_buffer AVBuffer
+ * @ingroup lavu_data
+ *
+ * @{
+ * AVBuffer is an API for reference-counted data buffers.
+ *
+ * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer
+ * represents the data buffer itself; it is opaque and not meant to be accessed
+ * by the caller directly, but only through AVBufferRef. However, the caller may
+ * e.g. compare two AVBuffer pointers to check whether two different references
+ * are describing the same data buffer. AVBufferRef represents a single
+ * reference to an AVBuffer and it is the object that may be manipulated by the
+ * caller directly.
+ *
+ * There are two functions provided for creating a new AVBuffer with a single
+ * reference -- av_buffer_alloc() to just allocate a new buffer, and
+ * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing
+ * reference, additional references may be created with av_buffer_ref().
+ * Use av_buffer_unref() to free a reference (this will automatically free the
+ * data once all the references are freed).
+ *
+ * The convention throughout this API and the rest of Libav is such that the
+ * buffer is considered writable if there exists only one reference to it (and
+ * it has not been marked as read-only). The av_buffer_is_writable() function is
+ * provided to check whether this is true and av_buffer_make_writable() will
+ * automatically create a new writable buffer when necessary.
+ * Of course nothing prevents the calling code from violating this convention,
+ * however that is safe only when all the existing references are under its
+ * control.
+ *
+ * @note Referencing and unreferencing the buffers is thread-safe and thus
+ * may be done from multiple threads simultaneously without any need for
+ * additional locking.
+ *
+ * @note Two different references to the same buffer can point to different
+ * parts of the buffer (i.e. their AVBufferRef.data will not be equal).
+ */
+
+/**
+ * A reference counted buffer type. It is opaque and is meant to be used through
+ * references (AVBufferRef).
+ */
+typedef struct AVBuffer AVBuffer;
+
+/**
+ * A reference to a data buffer.
+ *
+ * The size of this struct is not a part of the public ABI and it is not meant
+ * to be allocated directly.
+ */
+typedef struct AVBufferRef {
+ AVBuffer *buffer;
+
+ /**
+ * The data buffer. It is considered writable if and only if
+ * this is the only reference to the buffer, in which case
+ * av_buffer_is_writable() returns 1.
+ */
+ uint8_t *data;
+ /**
+ * Size of data in bytes.
+ */
+ int size;
+} AVBufferRef;
+
+/**
+ * Allocate an AVBuffer of the given size using av_malloc().
+ *
+ * @return an AVBufferRef of given size or NULL when out of memory
+ */
+AVBufferRef *av_buffer_alloc(int size);
+
+/**
+ * Same as av_buffer_alloc(), except the returned buffer will be initialized
+ * to zero.
+ */
+AVBufferRef *av_buffer_allocz(int size);
+
+/**
+ * Always treat the buffer as read-only, even when it has only one
+ * reference.
+ */
+#define AV_BUFFER_FLAG_READONLY (1 << 0)
+
+/**
+ * Create an AVBuffer from an existing array.
+ *
+ * If this function is successful, data is owned by the AVBuffer. The caller may
+ * only access data through the returned AVBufferRef and references derived from
+ * it.
+ * If this function fails, data is left untouched.
+ * @param data data array
+ * @param size size of data in bytes
+ * @param free a callback for freeing this buffer's data
+ * @param opaque parameter to be passed to free
+ * @param flags a combination of AV_BUFFER_FLAG_*
+ *
+ * @return an AVBufferRef referring to data on success, NULL on failure.
+ */
+AVBufferRef *av_buffer_create(uint8_t *data, int size,
+ void (*free)(void *opaque, uint8_t *data),
+ void *opaque, int flags);
+
+/**
+ * Default free callback, which calls av_free() on the buffer data.
+ * This function is meant to be passed to av_buffer_create(), not called
+ * directly.
+ */
+void av_buffer_default_free(void *opaque, uint8_t *data);
+
+/**
+ * Create a new reference to an AVBuffer.
+ *
+ * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on
+ * failure.
+ */
+AVBufferRef *av_buffer_ref(AVBufferRef *buf);
+
+/**
+ * Free a given reference and automatically free the buffer if there are no more
+ * references to it.
+ *
+ * @param buf the reference to be freed. The pointer is set to NULL on return.
+ */
+void av_buffer_unref(AVBufferRef **buf);
+
+/**
+ * @return 1 if the caller may write to the data referred to by buf (which is
+ * true if and only if buf is the only reference to the underlying AVBuffer).
+ * Return 0 otherwise.
+ * A positive answer is valid until av_buffer_ref() is called on buf.
+ */
+int av_buffer_is_writable(const AVBufferRef *buf);
+
+/**
+ * Create a writable reference from a given buffer reference, avoiding data copy
+ * if possible.
+ *
+ * @param buf buffer reference to make writable. On success, buf is either left
+ * untouched, or it is unreferenced and a new writable AVBufferRef is
+ * written in its place. On failure, buf is left untouched.
+ * @return 0 on success, a negative AVERROR on failure.
+ */
+int av_buffer_make_writable(AVBufferRef **buf);
+
+/**
+ * Reallocate a given buffer.
+ *
+ * @param buf a buffer reference to reallocate. On success, buf will be
+ * unreferenced and a new reference with the required size will be
+ * written in its place. On failure buf will be left untouched. *buf
+ * may be NULL, then a new buffer is allocated.
+ * @param size required new buffer size.
+ * @return 0 on success, a negative AVERROR on failure.
+ *
+ * @note the buffer is actually reallocated with av_realloc() only if it was
+ * initially allocated through av_buffer_realloc(NULL) and there is only one
+ * reference to it (i.e. the one passed to this function). In all other cases
+ * a new buffer is allocated and the data is copied.
+ */
+int av_buffer_realloc(AVBufferRef **buf, int size);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup lavu_bufferpool AVBufferPool
+ * @ingroup lavu_data
+ *
+ * @{
+ * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
+ *
+ * Frequently allocating and freeing large buffers may be slow. AVBufferPool is
+ * meant to solve this in cases when the caller needs a set of buffers of the
+ * same size (the most obvious use case being buffers for raw video or audio
+ * frames).
+ *
+ * At the beginning, the user must call av_buffer_pool_init() to create the
+ * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to
+ * get a reference to a new buffer, similar to av_buffer_alloc(). This new
+ * reference works in all aspects the same way as the one created by
+ * av_buffer_alloc(). However, when the last reference to this buffer is
+ * unreferenced, it is returned to the pool instead of being freed and will be
+ * reused for subsequent av_buffer_pool_get() calls.
+ *
+ * When the caller is done with the pool and no longer needs to allocate any new
+ * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.
+ * Once all the buffers are released, it will automatically be freed.
+ *
+ * Allocating and releasing buffers with this API is thread-safe as long as
+ * either the default alloc callback is used, or the user-supplied one is
+ * thread-safe.
+ */
+
+/**
+ * The buffer pool. This structure is opaque and not meant to be accessed
+ * directly. It is allocated with av_buffer_pool_init() and freed with
+ * av_buffer_pool_uninit().
+ */
+typedef struct AVBufferPool AVBufferPool;
+
+/**
+ * Allocate and initialize a buffer pool.
+ *
+ * @param size size of each buffer in this pool
+ * @param alloc a function that will be used to allocate new buffers when the
+ * pool is empty. May be NULL, then the default allocator will be used
+ * (av_buffer_alloc()).
+ * @return newly created buffer pool on success, NULL on error.
+ */
+AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size));
+
+/**
+ * Mark the pool as being available for freeing. It will actually be freed only
+ * once all the allocated buffers associated with the pool are released. Thus it
+ * is safe to call this function while some of the allocated buffers are still
+ * in use.
+ *
+ * @param pool pointer to the pool to be freed. It will be set to NULL.
+ * @see av_buffer_pool_can_uninit()
+ */
+void av_buffer_pool_uninit(AVBufferPool **pool);
+
+/**
+ * Allocate a new AVBuffer, reusing an old buffer from the pool when available.
+ * This function may be called simultaneously from multiple threads.
+ *
+ * @return a reference to the new buffer on success, NULL on error.
+ */
+AVBufferRef *av_buffer_pool_get(AVBufferPool *pool);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_BUFFER_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/channel_layout.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/channel_layout.h
new file mode 100644
index 000000000..6a1f83005
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/channel_layout.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ * Copyright (c) 2008 Peter Ross
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CHANNEL_LAYOUT_H
+#define AVUTIL_CHANNEL_LAYOUT_H
+
+#include <stdint.h>
+
+/**
+ * @file
+ * audio channel layout utility functions
+ */
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * @defgroup channel_masks Audio channel masks
+ * @{
+ */
+#define AV_CH_FRONT_LEFT 0x00000001
+#define AV_CH_FRONT_RIGHT 0x00000002
+#define AV_CH_FRONT_CENTER 0x00000004
+#define AV_CH_LOW_FREQUENCY 0x00000008
+#define AV_CH_BACK_LEFT 0x00000010
+#define AV_CH_BACK_RIGHT 0x00000020
+#define AV_CH_FRONT_LEFT_OF_CENTER 0x00000040
+#define AV_CH_FRONT_RIGHT_OF_CENTER 0x00000080
+#define AV_CH_BACK_CENTER 0x00000100
+#define AV_CH_SIDE_LEFT 0x00000200
+#define AV_CH_SIDE_RIGHT 0x00000400
+#define AV_CH_TOP_CENTER 0x00000800
+#define AV_CH_TOP_FRONT_LEFT 0x00001000
+#define AV_CH_TOP_FRONT_CENTER 0x00002000
+#define AV_CH_TOP_FRONT_RIGHT 0x00004000
+#define AV_CH_TOP_BACK_LEFT 0x00008000
+#define AV_CH_TOP_BACK_CENTER 0x00010000
+#define AV_CH_TOP_BACK_RIGHT 0x00020000
+#define AV_CH_STEREO_LEFT 0x20000000 ///< Stereo downmix.
+#define AV_CH_STEREO_RIGHT 0x40000000 ///< See AV_CH_STEREO_LEFT.
+#define AV_CH_WIDE_LEFT 0x0000000080000000ULL
+#define AV_CH_WIDE_RIGHT 0x0000000100000000ULL
+#define AV_CH_SURROUND_DIRECT_LEFT 0x0000000200000000ULL
+#define AV_CH_SURROUND_DIRECT_RIGHT 0x0000000400000000ULL
+#define AV_CH_LOW_FREQUENCY_2 0x0000000800000000ULL
+
+/** Channel mask value used for AVCodecContext.request_channel_layout
+ to indicate that the user requests the channel order of the decoder output
+ to be the native codec channel order. */
+#define AV_CH_LAYOUT_NATIVE 0x8000000000000000ULL
+
+/**
+ * @}
+ * @defgroup channel_mask_c Audio channel convenience macros
+ * @{
+ * */
+#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
+#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)
+#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_2_2 (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_QUAD (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT0 (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
+#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_5POINT0_BACK (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_5POINT1_BACK (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT0_FRONT (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
+#define AV_CH_LAYOUT_6POINT1_FRONT (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)
+#define AV_CH_LAYOUT_7POINT0 (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT0_FRONT (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1 (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_7POINT1_WIDE (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
+#define AV_CH_LAYOUT_OCTAGONAL (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
+#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
+
+enum AVMatrixEncoding {
+ AV_MATRIX_ENCODING_NONE,
+ AV_MATRIX_ENCODING_DOLBY,
+ AV_MATRIX_ENCODING_DPLII,
+ AV_MATRIX_ENCODING_DPLIIX,
+ AV_MATRIX_ENCODING_DPLIIZ,
+ AV_MATRIX_ENCODING_DOLBYEX,
+ AV_MATRIX_ENCODING_DOLBYHEADPHONE,
+ AV_MATRIX_ENCODING_NB
+};
+
+/**
+ * @}
+ */
+
+/**
+ * Return a channel layout id that matches name, or 0 if no match is found.
+ *
+ * name can be one or several of the following notations,
+ * separated by '+' or '|':
+ * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0,
+ * 5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix);
+ * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC,
+ * SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR);
+ * - a number of channels, in decimal, optionally followed by 'c', yielding
+ * the default channel layout for that number of channels (@see
+ * av_get_default_channel_layout);
+ * - a channel layout mask, in hexadecimal starting with "0x" (see the
+ * AV_CH_* macros).
+ *
+ * Example: "stereo+FC" = "2+FC" = "2c+1c" = "0x7"
+ */
+uint64_t av_get_channel_layout(const char *name);
+
+/**
+ * Return a description of a channel layout.
+ * If nb_channels is <= 0, it is guessed from the channel_layout.
+ *
+ * @param buf put here the string containing the channel layout
+ * @param buf_size size in bytes of the buffer
+ */
+void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
+
+/**
+ * Return the number of channels in the channel layout.
+ */
+int av_get_channel_layout_nb_channels(uint64_t channel_layout);
+
+/**
+ * Return default channel layout for a given number of channels.
+ */
+uint64_t av_get_default_channel_layout(int nb_channels);
+
+/**
+ * Get the index of a channel in channel_layout.
+ *
+ * @param channel a channel layout describing exactly one channel which must be
+ * present in channel_layout.
+ *
+ * @return index of channel in channel_layout on success, a negative AVERROR
+ * on error.
+ */
+int av_get_channel_layout_channel_index(uint64_t channel_layout,
+ uint64_t channel);
+
+/**
+ * Get the channel with the given index in channel_layout.
+ */
+uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index);
+
+/**
+ * Get the name of a given channel.
+ *
+ * @return channel name on success, NULL on error.
+ */
+const char *av_get_channel_name(uint64_t channel);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_CHANNEL_LAYOUT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/common.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/common.h
new file mode 100644
index 000000000..eb40e1299
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/common.h
@@ -0,0 +1,406 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * common internal and external API header
+ */
+
+#ifndef AVUTIL_COMMON_H
+#define AVUTIL_COMMON_H
+
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <math.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "attributes.h"
+#include "version.h"
+#include "libavutil/avconfig.h"
+
+#if AV_HAVE_BIGENDIAN
+# define AV_NE(be, le) (be)
+#else
+# define AV_NE(be, le) (le)
+#endif
+
+//rounded division & shift
+#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
+/* assume b>0 */
+#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
+#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
+#define FFSIGN(a) ((a) > 0 ? 1 : -1)
+
+#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
+#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
+#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
+#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
+
+#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
+#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
+
+/* misc math functions */
+
+#if FF_API_AV_REVERSE
+extern attribute_deprecated const uint8_t av_reverse[256];
+#endif
+
+#ifdef HAVE_AV_CONFIG_H
+# include "config.h"
+# include "intmath.h"
+#endif
+
+/* Pull in unguarded fallback defines at the end of this file. */
+#include "common.h"
+
+#ifndef av_log2
+av_const int av_log2(unsigned v);
+#endif
+
+#ifndef av_log2_16bit
+av_const int av_log2_16bit(unsigned v);
+#endif
+
+/**
+ * Clip a signed integer value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
+{
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-255 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
+{
+ if (a&(~0xFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -128,127 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int8_t av_clip_int8_c(int a)
+{
+ if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the 0-65535 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
+{
+ if (a&(~0xFFFF)) return (-a)>>31;
+ else return a;
+}
+
+/**
+ * Clip a signed integer value into the -32768,32767 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int16_t av_clip_int16_c(int a)
+{
+ if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
+ else return a;
+}
+
+/**
+ * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
+ * @param a value to clip
+ * @return clipped value
+ */
+static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
+{
+ if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;
+ else return a;
+}
+
+/**
+ * Clip a signed integer to an unsigned power of two range.
+ * @param a value to clip
+ * @param p bit position to clip at
+ * @return clipped value
+ */
+static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
+{
+ if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1);
+ else return a;
+}
+
+/**
+ * Add two signed 32-bit values with saturation.
+ *
+ * @param a one value
+ * @param b another value
+ * @return sum with signed saturation
+ */
+static av_always_inline int av_sat_add32_c(int a, int b)
+{
+ return av_clipl_int32((int64_t)a + b);
+}
+
+/**
+ * Add a doubled value to another value with saturation at both stages.
+ *
+ * @param a first value
+ * @param b value doubled and added to a
+ * @return sum with signed saturation
+ */
+static av_always_inline int av_sat_dadd32_c(int a, int b)
+{
+ return av_sat_add32(a, av_sat_add32(b, b));
+}
+
+/**
+ * Clip a float value into the amin-amax range.
+ * @param a value to clip
+ * @param amin minimum value of the clip range
+ * @param amax maximum value of the clip range
+ * @return clipped value
+ */
+static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
+{
+ if (a < amin) return amin;
+ else if (a > amax) return amax;
+ else return a;
+}
+
+/** Compute ceil(log2(x)).
+ * @param x value used to compute ceil(log2(x))
+ * @return computed ceiling of log2(x)
+ */
+static av_always_inline av_const int av_ceil_log2_c(int x)
+{
+ return av_log2((x - 1) << 1);
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount_c(uint32_t x)
+{
+ x -= (x >> 1) & 0x55555555;
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+ x = (x + (x >> 4)) & 0x0F0F0F0F;
+ x += x >> 8;
+ return (x + (x >> 16)) & 0x3F;
+}
+
+/**
+ * Count number of bits set to one in x
+ * @param x value to count bits of
+ * @return the number of bits set to one in x
+ */
+static av_always_inline av_const int av_popcount64_c(uint64_t x)
+{
+ return av_popcount(x) + av_popcount(x >> 32);
+}
+
+#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
+#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
+
+/**
+ * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_BYTE Expression reading one byte from the input.
+ * Evaluated up to 7 times (4 for the currently
+ * assigned Unicode range). With a memory buffer
+ * input, this could be *ptr++.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF8(val, GET_BYTE, ERROR)\
+ val= GET_BYTE;\
+ {\
+ uint32_t top = (val & 128) >> 1;\
+ if ((val & 0xc0) == 0x80)\
+ ERROR\
+ while (val & top) {\
+ int tmp= GET_BYTE - 128;\
+ if(tmp>>6)\
+ ERROR\
+ val= (val<<6) + tmp;\
+ top <<= 5;\
+ }\
+ val &= (top << 1) - 1;\
+ }
+
+/**
+ * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
+ *
+ * @param val Output value, must be an lvalue of type uint32_t.
+ * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
+ * to native byte order. Evaluated one or two times.
+ * @param ERROR Expression to be evaluated on invalid input,
+ * typically a goto statement.
+ */
+#define GET_UTF16(val, GET_16BIT, ERROR)\
+ val = GET_16BIT;\
+ {\
+ unsigned int hi = val - 0xD800;\
+ if (hi < 0x800) {\
+ val = GET_16BIT - 0xDC00;\
+ if (val > 0x3FFU || hi > 0x3FFU)\
+ ERROR\
+ val += (hi<<10) + 0x10000;\
+ }\
+ }\
+
+/**
+ * @def PUT_UTF8(val, tmp, PUT_BYTE)
+ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint8_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_BYTE.
+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
+ * It could be a function or a statement, and uses tmp as the input byte.
+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
+ * executed up to 4 times for values in the valid UTF-8 range and up to
+ * 7 times in the general case, depending on the length of the converted
+ * Unicode character.
+ */
+#define PUT_UTF8(val, tmp, PUT_BYTE)\
+ {\
+ int bytes, shift;\
+ uint32_t in = val;\
+ if (in < 0x80) {\
+ tmp = in;\
+ PUT_BYTE\
+ } else {\
+ bytes = (av_log2(in) + 4) / 5;\
+ shift = (bytes - 1) * 6;\
+ tmp = (256 - (256 >> bytes)) | (in >> shift);\
+ PUT_BYTE\
+ while (shift >= 6) {\
+ shift -= 6;\
+ tmp = 0x80 | ((in >> shift) & 0x3f);\
+ PUT_BYTE\
+ }\
+ }\
+ }
+
+/**
+ * @def PUT_UTF16(val, tmp, PUT_16BIT)
+ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
+ * @param val is an input-only argument and should be of type uint32_t. It holds
+ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
+ * val is given as a function it is executed only once.
+ * @param tmp is a temporary variable and should be of type uint16_t. It
+ * represents an intermediate value during conversion that is to be
+ * output by PUT_16BIT.
+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
+ * in desired endianness. It could be a function or a statement, and uses tmp
+ * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;"
+ * PUT_BYTE will be executed 1 or 2 times depending on input character.
+ */
+#define PUT_UTF16(val, tmp, PUT_16BIT)\
+ {\
+ uint32_t in = val;\
+ if (in < 0x10000) {\
+ tmp = in;\
+ PUT_16BIT\
+ } else {\
+ tmp = 0xD800 | ((in - 0x10000) >> 10);\
+ PUT_16BIT\
+ tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
+ PUT_16BIT\
+ }\
+ }\
+
+
+
+#include "mem.h"
+
+#ifdef HAVE_AV_CONFIG_H
+# include "internal.h"
+#endif /* HAVE_AV_CONFIG_H */
+
+#endif /* AVUTIL_COMMON_H */
+
+/*
+ * The following definitions are outside the multiple inclusion guard
+ * to ensure they are immediately available in intmath.h.
+ */
+
+#ifndef av_ceil_log2
+# define av_ceil_log2 av_ceil_log2_c
+#endif
+#ifndef av_clip
+# define av_clip av_clip_c
+#endif
+#ifndef av_clip_uint8
+# define av_clip_uint8 av_clip_uint8_c
+#endif
+#ifndef av_clip_int8
+# define av_clip_int8 av_clip_int8_c
+#endif
+#ifndef av_clip_uint16
+# define av_clip_uint16 av_clip_uint16_c
+#endif
+#ifndef av_clip_int16
+# define av_clip_int16 av_clip_int16_c
+#endif
+#ifndef av_clipl_int32
+# define av_clipl_int32 av_clipl_int32_c
+#endif
+#ifndef av_clip_uintp2
+# define av_clip_uintp2 av_clip_uintp2_c
+#endif
+#ifndef av_sat_add32
+# define av_sat_add32 av_sat_add32_c
+#endif
+#ifndef av_sat_dadd32
+# define av_sat_dadd32 av_sat_dadd32_c
+#endif
+#ifndef av_clipf
+# define av_clipf av_clipf_c
+#endif
+#ifndef av_popcount
+# define av_popcount av_popcount_c
+#endif
+#ifndef av_popcount64
+# define av_popcount64 av_popcount64_c
+#endif
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/cpu.h
new file mode 100644
index 000000000..29036e394
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/cpu.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CPU_H
+#define AVUTIL_CPU_H
+
+#include "version.h"
+
+#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */
+
+ /* lower 16 bits - CPU features */
+#define AV_CPU_FLAG_MMX 0x0001 ///< standard MMX
+#define AV_CPU_FLAG_MMXEXT 0x0002 ///< SSE integer functions or AMD MMX ext
+#if FF_API_CPU_FLAG_MMX2
+#define AV_CPU_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext
+#endif
+#define AV_CPU_FLAG_3DNOW 0x0004 ///< AMD 3DNOW
+#define AV_CPU_FLAG_SSE 0x0008 ///< SSE functions
+#define AV_CPU_FLAG_SSE2 0x0010 ///< PIV SSE2 functions
+#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster
+ ///< than regular MMX/SSE (e.g. Core1)
+#define AV_CPU_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt
+#define AV_CPU_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions
+#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster
+ ///< than regular MMX/SSE (e.g. Core1)
+#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions
+#define AV_CPU_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower
+#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions
+#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions
+#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
+#define AV_CPU_FLAG_XOP 0x0400 ///< Bulldozer XOP functions
+#define AV_CPU_FLAG_FMA4 0x0800 ///< Bulldozer FMA4 functions
+#define AV_CPU_FLAG_CMOV 0x1000 ///< i686 cmov
+#define AV_CPU_FLAG_AVX2 0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used
+
+#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard
+
+#define AV_CPU_FLAG_ARMV5TE (1 << 0)
+#define AV_CPU_FLAG_ARMV6 (1 << 1)
+#define AV_CPU_FLAG_ARMV6T2 (1 << 2)
+#define AV_CPU_FLAG_VFP (1 << 3)
+#define AV_CPU_FLAG_VFPV3 (1 << 4)
+#define AV_CPU_FLAG_NEON (1 << 5)
+
+/**
+ * Return the flags which specify extensions supported by the CPU.
+ */
+int av_get_cpu_flags(void);
+
+/**
+ * Set a mask on flags returned by av_get_cpu_flags().
+ * This function is mainly useful for testing.
+ *
+ * @warning this function is not thread safe.
+ */
+void av_set_cpu_flags_mask(int mask);
+
+/**
+ * Parse CPU flags from a string.
+ *
+ * @return a combination of AV_CPU_* flags, negative on error.
+ */
+int av_parse_cpu_flags(const char *s);
+
+/**
+ * @return the number of logical CPU cores present.
+ */
+int av_cpu_count(void);
+
+#endif /* AVUTIL_CPU_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/crc.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/crc.h
new file mode 100644
index 000000000..0540619d2
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/crc.h
@@ -0,0 +1,74 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_CRC_H
+#define AVUTIL_CRC_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include "attributes.h"
+
+typedef uint32_t AVCRC;
+
+typedef enum {
+ AV_CRC_8_ATM,
+ AV_CRC_16_ANSI,
+ AV_CRC_16_CCITT,
+ AV_CRC_32_IEEE,
+ AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */
+ AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */
+}AVCRCId;
+
+/**
+ * Initialize a CRC table.
+ * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024
+ * @param le If 1, the lowest bit represents the coefficient for the highest
+ * exponent of the corresponding polynomial (both for poly and
+ * actual CRC).
+ * If 0, you must swap the CRC parameter and the result of av_crc
+ * if you need the standard representation (can be simplified in
+ * most cases to e.g. bswap16):
+ * av_bswap32(crc << (32-bits))
+ * @param bits number of bits for the CRC
+ * @param poly generator polynomial without the x**bits coefficient, in the
+ * representation as specified by le
+ * @param ctx_size size of ctx in bytes
+ * @return <0 on failure
+ */
+int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size);
+
+/**
+ * Get an initialized standard CRC table.
+ * @param crc_id ID of a standard CRC
+ * @return a pointer to the CRC table or NULL on failure
+ */
+const AVCRC *av_crc_get_table(AVCRCId crc_id);
+
+/**
+ * Calculate the CRC of a block.
+ * @param crc CRC of previous blocks if any or initial value for CRC
+ * @return CRC updated with the data from the given block
+ *
+ * @see av_crc_init() "le" parameter
+ */
+uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
+ const uint8_t *buffer, size_t length) av_pure;
+
+#endif /* AVUTIL_CRC_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/dict.h
new file mode 100644
index 000000000..e0a91ae83
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/dict.h
@@ -0,0 +1,146 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Public dictionary API.
+ */
+
+#ifndef AVUTIL_DICT_H
+#define AVUTIL_DICT_H
+
+/**
+ * @addtogroup lavu_dict AVDictionary
+ * @ingroup lavu_data
+ *
+ * @brief Simple key:value store
+ *
+ * @{
+ * Dictionaries are used for storing key:value pairs. To create
+ * an AVDictionary, simply pass an address of a NULL pointer to
+ * av_dict_set(). NULL can be used as an empty dictionary wherever
+ * a pointer to an AVDictionary is required.
+ * Use av_dict_get() to retrieve an entry or iterate over all
+ * entries and finally av_dict_free() to free the dictionary
+ * and all its contents.
+ *
+ @code
+ AVDictionary *d = NULL; // "create" an empty dictionary
+ AVDictionaryEntry *t = NULL;
+
+ av_dict_set(&d, "foo", "bar", 0); // add an entry
+
+ char *k = av_strdup("key"); // if your strings are already allocated,
+ char *v = av_strdup("value"); // you can avoid copying them like this
+ av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
+
+ while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ <....> // iterate over all entries in d
+ }
+ av_dict_free(&d);
+ @endcode
+ *
+ */
+
+#define AV_DICT_MATCH_CASE 1
+#define AV_DICT_IGNORE_SUFFIX 2
+#define AV_DICT_DONT_STRDUP_KEY 4 /**< Take ownership of a key that's been
+ allocated with av_malloc() and children. */
+#define AV_DICT_DONT_STRDUP_VAL 8 /**< Take ownership of a value that's been
+ allocated with av_malloc() and chilren. */
+#define AV_DICT_DONT_OVERWRITE 16 ///< Don't overwrite existing entries.
+#define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no
+ delimiter is added, the strings are simply concatenated. */
+
+typedef struct AVDictionaryEntry {
+ char *key;
+ char *value;
+} AVDictionaryEntry;
+
+typedef struct AVDictionary AVDictionary;
+
+/**
+ * Get a dictionary entry with matching key.
+ *
+ * @param prev Set to the previous matching element to find the next.
+ * If set to NULL the first matching element is returned.
+ * @param flags Allows case as well as suffix-insensitive comparisons.
+ * @return Found entry or NULL, changing key or value leads to undefined behavior.
+ */
+AVDictionaryEntry *
+av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags);
+
+/**
+ * Get number of entries in dictionary.
+ *
+ * @param m dictionary
+ * @return number of entries in dictionary
+ */
+int av_dict_count(const AVDictionary *m);
+
+/**
+ * Set the given entry in *pm, overwriting an existing entry.
+ *
+ * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL
+ * a dictionary struct is allocated and put in *pm.
+ * @param key entry key to add to *pm (will be av_strduped depending on flags)
+ * @param value entry value to add to *pm (will be av_strduped depending on flags).
+ * Passing a NULL value will cause an existing entry to be deleted.
+ * @return >= 0 on success otherwise an error code <0
+ */
+int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
+
+/**
+ * Parse the key/value pairs list and add to a dictionary.
+ *
+ * @param key_val_sep a 0-terminated list of characters used to separate
+ * key from value
+ * @param pairs_sep a 0-terminated list of characters used to separate
+ * two pairs from each other
+ * @param flags flags to use when adding to dictionary.
+ * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL
+ * are ignored since the key/value tokens will always
+ * be duplicated.
+ * @return 0 on success, negative AVERROR code on failure
+ */
+int av_dict_parse_string(AVDictionary **pm, const char *str,
+ const char *key_val_sep, const char *pairs_sep,
+ int flags);
+
+/**
+ * Copy entries from one AVDictionary struct into another.
+ * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL,
+ * this function will allocate a struct for you and put it in *dst
+ * @param src pointer to source AVDictionary struct
+ * @param flags flags to use when setting entries in *dst
+ * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag
+ */
+void av_dict_copy(AVDictionary **dst, AVDictionary *src, int flags);
+
+/**
+ * Free all the memory allocated for an AVDictionary struct
+ * and all keys and values.
+ */
+void av_dict_free(AVDictionary **m);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_DICT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/downmix_info.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/downmix_info.h
new file mode 100644
index 000000000..69969f6fb
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/downmix_info.h
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2014 Tim Walker <tdskywalker@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_DOWNMIX_INFO_H
+#define AVUTIL_DOWNMIX_INFO_H
+
+#include "frame.h"
+
+/**
+ * @file
+ * audio downmix medatata
+ */
+
+/**
+ * @addtogroup lavu_audio
+ * @{
+ */
+
+/**
+ * @defgroup downmix_info Audio downmix metadata
+ * @{
+ */
+
+/**
+ * Possible downmix types.
+ */
+enum AVDownmixType {
+ AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */
+ AV_DOWNMIX_TYPE_LORO, /**< Lo/Ro 2-channel downmix (Stereo). */
+ AV_DOWNMIX_TYPE_LTRT, /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */
+ AV_DOWNMIX_TYPE_DPLII, /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */
+ AV_DOWNMIX_TYPE_NB /**< Number of downmix types. Not part of ABI. */
+};
+
+/**
+ * This structure describes optional metadata relevant to a downmix procedure.
+ *
+ * All fields are set by the decoder to the value indicated in the audio
+ * bitstream (if present), or to a "sane" default otherwise.
+ */
+typedef struct AVDownmixInfo {
+ /**
+ * Type of downmix preferred by the mastering engineer.
+ */
+ enum AVDownmixType preferred_downmix_type;
+
+ /**
+ * Absolute scale factor representing the nominal level of the center
+ * channel during a regular downmix.
+ */
+ double center_mix_level;
+
+ /**
+ * Absolute scale factor representing the nominal level of the center
+ * channel during an Lt/Rt compatible downmix.
+ */
+ double center_mix_level_ltrt;
+
+ /**
+ * Absolute scale factor representing the nominal level of the surround
+ * channels during a regular downmix.
+ */
+ double surround_mix_level;
+
+ /**
+ * Absolute scale factor representing the nominal level of the surround
+ * channels during an Lt/Rt compatible downmix.
+ */
+ double surround_mix_level_ltrt;
+
+ /**
+ * Absolute scale factor representing the level at which the LFE data is
+ * mixed into L/R channels during downmixing.
+ */
+ double lfe_mix_level;
+} AVDownmixInfo;
+
+/**
+ * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing.
+ *
+ * The side data is created and added to the frame if it's absent.
+ *
+ * @param frame the frame for which the side data is to be obtained.
+ *
+ * @return the AVDownmixInfo structure to be edited by the caller.
+ */
+AVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_DOWNMIX_INFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/error.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/error.h
new file mode 100644
index 000000000..268a0320a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/error.h
@@ -0,0 +1,82 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * error code definitions
+ */
+
+#ifndef AVUTIL_ERROR_H
+#define AVUTIL_ERROR_H
+
+#include <errno.h>
+#include <stddef.h>
+
+/**
+ * @addtogroup lavu_error
+ *
+ * @{
+ */
+
+
+/* error handling */
+#if EDOM > 0
+#define AVERROR(e) (-(e)) ///< Returns a negative error code from a POSIX error code, to return from library functions.
+#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
+#else
+/* Some platforms have E* and errno already negated. */
+#define AVERROR(e) (e)
+#define AVUNERROR(e) (e)
+#endif
+
+#define AVERROR_BSF_NOT_FOUND (-0x39acbd08) ///< Bitstream filter not found
+#define AVERROR_DECODER_NOT_FOUND (-0x3cbabb08) ///< Decoder not found
+#define AVERROR_DEMUXER_NOT_FOUND (-0x32babb08) ///< Demuxer not found
+#define AVERROR_ENCODER_NOT_FOUND (-0x3cb1ba08) ///< Encoder not found
+#define AVERROR_EOF (-0x5fb9b0bb) ///< End of file
+#define AVERROR_EXIT (-0x2bb6a7bb) ///< Immediate exit was requested; the called function should not be restarted
+#define AVERROR_FILTER_NOT_FOUND (-0x33b6b908) ///< Filter not found
+#define AVERROR_INVALIDDATA (-0x3ebbb1b7) ///< Invalid data found when processing input
+#define AVERROR_MUXER_NOT_FOUND (-0x27aab208) ///< Muxer not found
+#define AVERROR_OPTION_NOT_FOUND (-0x2bafb008) ///< Option not found
+#define AVERROR_PATCHWELCOME (-0x3aa8beb0) ///< Not yet implemented in Libav, patches welcome
+#define AVERROR_PROTOCOL_NOT_FOUND (-0x30adaf08) ///< Protocol not found
+#define AVERROR_STREAM_NOT_FOUND (-0x2dabac08) ///< Stream not found
+#define AVERROR_BUG (-0x5fb8aabe) ///< Bug detected, please report the issue
+#define AVERROR_UNKNOWN (-0x31b4b1ab) ///< Unknown error, typically from an external library
+#define AVERROR_EXPERIMENTAL (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
+
+/**
+ * Put a description of the AVERROR code errnum in errbuf.
+ * In case of failure the global variable errno is set to indicate the
+ * error. Even in case of failure av_strerror() will print a generic
+ * error message indicating the errnum provided to errbuf.
+ *
+ * @param errnum error code to describe
+ * @param errbuf buffer to which description is written
+ * @param errbuf_size the size in bytes of errbuf
+ * @return 0 on success, a negative value if a description for errnum
+ * cannot be found
+ */
+int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_ERROR_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/eval.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/eval.h
new file mode 100644
index 000000000..ccb29e7a3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/eval.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * simple arithmetic expression evaluator
+ */
+
+#ifndef AVUTIL_EVAL_H
+#define AVUTIL_EVAL_H
+
+#include "avutil.h"
+
+typedef struct AVExpr AVExpr;
+
+/**
+ * Parse and evaluate an expression.
+ * Note, this is significantly slower than av_expr_eval().
+ *
+ * @param res a pointer to a double where is put the result value of
+ * the expression, or NAN in case of error
+ * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
+ * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
+ * @param const_values a zero terminated array of values for the identifiers from const_names
+ * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers
+ * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument
+ * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers
+ * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments
+ * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
+ * @param log_ctx parent logging context
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_expr_parse_and_eval(double *res, const char *s,
+ const char * const *const_names, const double *const_values,
+ const char * const *func1_names, double (* const *funcs1)(void *, double),
+ const char * const *func2_names, double (* const *funcs2)(void *, double, double),
+ void *opaque, int log_offset, void *log_ctx);
+
+/**
+ * Parse an expression.
+ *
+ * @param expr a pointer where is put an AVExpr containing the parsed
+ * value in case of successful parsing, or NULL otherwise.
+ * The pointed to AVExpr must be freed with av_expr_free() by the user
+ * when it is not needed anymore.
+ * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
+ * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
+ * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers
+ * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument
+ * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers
+ * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments
+ * @param log_ctx parent logging context
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_expr_parse(AVExpr **expr, const char *s,
+ const char * const *const_names,
+ const char * const *func1_names, double (* const *funcs1)(void *, double),
+ const char * const *func2_names, double (* const *funcs2)(void *, double, double),
+ int log_offset, void *log_ctx);
+
+/**
+ * Evaluate a previously parsed expression.
+ *
+ * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names
+ * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
+ * @return the value of the expression
+ */
+double av_expr_eval(AVExpr *e, const double *const_values, void *opaque);
+
+/**
+ * Free a parsed expression previously created with av_expr_parse().
+ */
+void av_expr_free(AVExpr *e);
+
+/**
+ * Parse the string in numstr and return its value as a double. If
+ * the string is empty, contains only whitespaces, or does not contain
+ * an initial substring that has the expected syntax for a
+ * floating-point number, no conversion is performed. In this case,
+ * returns a value of zero and the value returned in tail is the value
+ * of numstr.
+ *
+ * @param numstr a string representing a number, may contain one of
+ * the International System number postfixes, for example 'K', 'M',
+ * 'G'. If 'i' is appended after the postfix, powers of 2 are used
+ * instead of powers of 10. The 'B' postfix multiplies the value for
+ * 8, and can be appended after another postfix or used alone. This
+ * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix.
+ * @param tail if non-NULL puts here the pointer to the char next
+ * after the last parsed character
+ */
+double av_strtod(const char *numstr, char **tail);
+
+#endif /* AVUTIL_EVAL_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/fifo.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/fifo.h
new file mode 100644
index 000000000..ea30f5d2b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/fifo.h
@@ -0,0 +1,131 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * a very simple circular buffer FIFO implementation
+ */
+
+#ifndef AVUTIL_FIFO_H
+#define AVUTIL_FIFO_H
+
+#include <stdint.h>
+#include "avutil.h"
+#include "attributes.h"
+
+typedef struct AVFifoBuffer {
+ uint8_t *buffer;
+ uint8_t *rptr, *wptr, *end;
+ uint32_t rndx, wndx;
+} AVFifoBuffer;
+
+/**
+ * Initialize an AVFifoBuffer.
+ * @param size of FIFO
+ * @return AVFifoBuffer or NULL in case of memory allocation failure
+ */
+AVFifoBuffer *av_fifo_alloc(unsigned int size);
+
+/**
+ * Free an AVFifoBuffer.
+ * @param f AVFifoBuffer to free
+ */
+void av_fifo_free(AVFifoBuffer *f);
+
+/**
+ * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied.
+ * @param f AVFifoBuffer to reset
+ */
+void av_fifo_reset(AVFifoBuffer *f);
+
+/**
+ * Return the amount of data in bytes in the AVFifoBuffer, that is the
+ * amount of data you can read from it.
+ * @param f AVFifoBuffer to read from
+ * @return size
+ */
+int av_fifo_size(AVFifoBuffer *f);
+
+/**
+ * Return the amount of space in bytes in the AVFifoBuffer, that is the
+ * amount of data you can write into it.
+ * @param f AVFifoBuffer to write into
+ * @return size
+ */
+int av_fifo_space(AVFifoBuffer *f);
+
+/**
+ * Feed data from an AVFifoBuffer to a user-supplied callback.
+ * @param f AVFifoBuffer to read from
+ * @param buf_size number of bytes to read
+ * @param func generic read function
+ * @param dest data destination
+ */
+int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
+
+/**
+ * Feed data from a user-supplied callback to an AVFifoBuffer.
+ * @param f AVFifoBuffer to write to
+ * @param src data source; non-const since it may be used as a
+ * modifiable context by the function defined in func
+ * @param size number of bytes to write
+ * @param func generic write function; the first parameter is src,
+ * the second is dest_buf, the third is dest_buf_size.
+ * func must return the number of bytes written to dest_buf, or <= 0 to
+ * indicate no more data available to write.
+ * If func is NULL, src is interpreted as a simple byte array for source data.
+ * @return the number of bytes written to the FIFO
+ */
+int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int));
+
+/**
+ * Resize an AVFifoBuffer.
+ * @param f AVFifoBuffer to resize
+ * @param size new AVFifoBuffer size in bytes
+ * @return <0 for failure, >=0 otherwise
+ */
+int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
+
+/**
+ * Read and discard the specified amount of data from an AVFifoBuffer.
+ * @param f AVFifoBuffer to read from
+ * @param size amount of data to read in bytes
+ */
+void av_fifo_drain(AVFifoBuffer *f, int size);
+
+/**
+ * Return a pointer to the data stored in a FIFO buffer at a certain offset.
+ * The FIFO buffer is not modified.
+ *
+ * @param f AVFifoBuffer to peek at, f must be non-NULL
+ * @param offs an offset in bytes, its absolute value must be less
+ * than the used buffer size or the returned pointer will
+ * point outside to the buffer data.
+ * The used buffer size can be checked with av_fifo_size().
+ */
+static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs)
+{
+ uint8_t *ptr = f->rptr + offs;
+ if (ptr >= f->end)
+ ptr = f->buffer + (ptr - f->end);
+ else if (ptr < f->buffer)
+ ptr = f->end - (f->buffer - ptr);
+ return ptr;
+}
+
+#endif /* AVUTIL_FIFO_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/file.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/file.h
new file mode 100644
index 000000000..e3f02a830
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/file.h
@@ -0,0 +1,54 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_FILE_H
+#define AVUTIL_FILE_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+
+/**
+ * @file
+ * Misc file utilities.
+ */
+
+/**
+ * Read the file with name filename, and put its content in a newly
+ * allocated buffer or map it with mmap() when available.
+ * In case of success set *bufptr to the read or mmapped buffer, and
+ * *size to the size in bytes of the buffer in *bufptr.
+ * The returned buffer must be released with av_file_unmap().
+ *
+ * @param log_offset loglevel offset used for logging
+ * @param log_ctx context used for logging
+ * @return a non negative number in case of success, a negative value
+ * corresponding to an AVERROR error code in case of failure
+ */
+int av_file_map(const char *filename, uint8_t **bufptr, size_t *size,
+ int log_offset, void *log_ctx);
+
+/**
+ * Unmap or free the buffer bufptr created by av_file_map().
+ *
+ * @param size size in bytes of bufptr, must be the same as returned
+ * by av_file_map()
+ */
+void av_file_unmap(uint8_t *bufptr, size_t size);
+
+#endif /* AVUTIL_FILE_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/frame.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/frame.h
new file mode 100644
index 000000000..63ed219f4
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/frame.h
@@ -0,0 +1,552 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @ingroup lavu_frame
+ * reference-counted frame API
+ */
+
+#ifndef AVUTIL_FRAME_H
+#define AVUTIL_FRAME_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+#include "buffer.h"
+#include "dict.h"
+#include "rational.h"
+#include "samplefmt.h"
+#include "version.h"
+
+
+/**
+ * @defgroup lavu_frame AVFrame
+ * @ingroup lavu_data
+ *
+ * @{
+ * AVFrame is an abstraction for reference-counted raw multimedia data.
+ */
+
+enum AVFrameSideDataType {
+ /**
+ * The data is the AVPanScan struct defined in libavcodec.
+ */
+ AV_FRAME_DATA_PANSCAN,
+ /**
+ * ATSC A53 Part 4 Closed Captions.
+ * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data.
+ * The number of bytes of CC data is AVFrameSideData.size.
+ */
+ AV_FRAME_DATA_A53_CC,
+ /**
+ * Stereoscopic 3d metadata.
+ * The data is the AVStereo3D struct defined in libavutil/stereo3d.h.
+ */
+ AV_FRAME_DATA_STEREO3D,
+ /**
+ * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h.
+ */
+ AV_FRAME_DATA_MATRIXENCODING,
+ /**
+ * Metadata relevant to a downmix procedure.
+ * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h.
+ */
+ AV_FRAME_DATA_DOWNMIX_INFO,
+};
+
+typedef struct AVFrameSideData {
+ enum AVFrameSideDataType type;
+ uint8_t *data;
+ int size;
+ AVDictionary *metadata;
+} AVFrameSideData;
+
+/**
+ * This structure describes decoded (raw) audio or video data.
+ *
+ * AVFrame must be allocated using av_frame_alloc(). Note that this only
+ * allocates the AVFrame itself, the buffers for the data must be managed
+ * through other means (see below).
+ * AVFrame must be freed with av_frame_free().
+ *
+ * AVFrame is typically allocated once and then reused multiple times to hold
+ * different data (e.g. a single AVFrame to hold frames received from a
+ * decoder). In such a case, av_frame_unref() will free any references held by
+ * the frame and reset it to its original clean state before it
+ * is reused again.
+ *
+ * The data described by an AVFrame is usually reference counted through the
+ * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /
+ * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at
+ * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,
+ * every single data plane must be contained in one of the buffers in
+ * AVFrame.buf or AVFrame.extended_buf.
+ * There may be a single buffer for all the data, or one separate buffer for
+ * each plane, or anything in between.
+ *
+ * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
+ * to the end with a minor bump.
+ */
+typedef struct AVFrame {
+#define AV_NUM_DATA_POINTERS 8
+ /**
+ * pointer to the picture/channel planes.
+ * This might be different from the first allocated byte
+ */
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+
+ /**
+ * For video, size in bytes of each picture line.
+ * For audio, size in bytes of each plane.
+ *
+ * For audio, only linesize[0] may be set. For planar audio, each channel
+ * plane must be the same size.
+ *
+ * @note The linesize may be larger than the size of usable data -- there
+ * may be extra padding present for performance reasons.
+ */
+ int linesize[AV_NUM_DATA_POINTERS];
+
+ /**
+ * pointers to the data planes/channels.
+ *
+ * For video, this should simply point to data[].
+ *
+ * For planar audio, each channel has a separate data pointer, and
+ * linesize[0] contains the size of each channel buffer.
+ * For packed audio, there is just one data pointer, and linesize[0]
+ * contains the total size of the buffer for all channels.
+ *
+ * Note: Both data and extended_data should always be set in a valid frame,
+ * but for planar audio with more channels that can fit in data,
+ * extended_data must be used in order to access all channels.
+ */
+ uint8_t **extended_data;
+
+ /**
+ * width and height of the video frame
+ */
+ int width, height;
+
+ /**
+ * number of audio samples (per channel) described by this frame
+ */
+ int nb_samples;
+
+ /**
+ * format of the frame, -1 if unknown or unset
+ * Values correspond to enum AVPixelFormat for video frames,
+ * enum AVSampleFormat for audio)
+ */
+ int format;
+
+ /**
+ * 1 -> keyframe, 0-> not
+ */
+ int key_frame;
+
+ /**
+ * Picture type of the frame.
+ */
+ enum AVPictureType pict_type;
+
+#if FF_API_AVFRAME_LAVC
+ attribute_deprecated
+ uint8_t *base[AV_NUM_DATA_POINTERS];
+#endif
+
+ /**
+ * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * Presentation timestamp in time_base units (time when frame should be shown to user).
+ */
+ int64_t pts;
+
+ /**
+ * PTS copied from the AVPacket that was decoded to produce this frame.
+ */
+ int64_t pkt_pts;
+
+ /**
+ * DTS copied from the AVPacket that triggered returning this frame.
+ */
+ int64_t pkt_dts;
+
+ /**
+ * picture number in bitstream order
+ */
+ int coded_picture_number;
+ /**
+ * picture number in display order
+ */
+ int display_picture_number;
+
+ /**
+ * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
+ */
+ int quality;
+
+#if FF_API_AVFRAME_LAVC
+ attribute_deprecated
+ int reference;
+
+ /**
+ * QP table
+ */
+ attribute_deprecated
+ int8_t *qscale_table;
+ /**
+ * QP store stride
+ */
+ attribute_deprecated
+ int qstride;
+
+ attribute_deprecated
+ int qscale_type;
+
+ /**
+ * mbskip_table[mb]>=1 if MB didn't change
+ * stride= mb_width = (width+15)>>4
+ */
+ attribute_deprecated
+ uint8_t *mbskip_table;
+
+ /**
+ * motion vector table
+ * @code
+ * example:
+ * int mv_sample_log2= 4 - motion_subsample_log2;
+ * int mb_width= (width+15)>>4;
+ * int mv_stride= (mb_width << mv_sample_log2) + 1;
+ * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
+ * @endcode
+ */
+ attribute_deprecated
+ int16_t (*motion_val[2])[2];
+
+ /**
+ * macroblock type table
+ * mb_type_base + mb_width + 2
+ */
+ attribute_deprecated
+ uint32_t *mb_type;
+
+ /**
+ * DCT coefficients
+ */
+ attribute_deprecated
+ short *dct_coeff;
+
+ /**
+ * motion reference frame index
+ * the order in which these are stored can depend on the codec.
+ */
+ attribute_deprecated
+ int8_t *ref_index[2];
+#endif
+
+ /**
+ * for some private data of the user
+ */
+ void *opaque;
+
+ /**
+ * error
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+#if FF_API_AVFRAME_LAVC
+ attribute_deprecated
+ int type;
+#endif
+
+ /**
+ * When decoding, this signals how much the picture must be delayed.
+ * extra_delay = repeat_pict / (2*fps)
+ */
+ int repeat_pict;
+
+ /**
+ * The content of the picture is interlaced.
+ */
+ int interlaced_frame;
+
+ /**
+ * If the content is interlaced, is top field displayed first.
+ */
+ int top_field_first;
+
+ /**
+ * Tell user application that palette has changed from previous frame.
+ */
+ int palette_has_changed;
+
+#if FF_API_AVFRAME_LAVC
+ attribute_deprecated
+ int buffer_hints;
+
+ /**
+ * Pan scan.
+ */
+ attribute_deprecated
+ struct AVPanScan *pan_scan;
+#endif
+
+ /**
+ * reordered opaque 64bit (generally an integer or a double precision float
+ * PTS but can be anything).
+ * The user sets AVCodecContext.reordered_opaque to represent the input at
+ * that time,
+ * the decoder reorders values as needed and sets AVFrame.reordered_opaque
+ * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ */
+ int64_t reordered_opaque;
+
+#if FF_API_AVFRAME_LAVC
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated void *hwaccel_picture_private;
+
+ attribute_deprecated
+ struct AVCodecContext *owner;
+ attribute_deprecated
+ void *thread_opaque;
+
+ /**
+ * log2 of the size of the block which a single vector in motion_val represents:
+ * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
+ */
+ attribute_deprecated
+ uint8_t motion_subsample_log2;
+#endif
+
+ /**
+ * Sample rate of the audio data.
+ */
+ int sample_rate;
+
+ /**
+ * Channel layout of the audio data.
+ */
+ uint64_t channel_layout;
+
+ /**
+ * AVBuffer references backing the data for this frame. If all elements of
+ * this array are NULL, then this frame is not reference counted.
+ *
+ * There may be at most one AVBuffer per data plane, so for video this array
+ * always contains all the references. For planar audio with more than
+ * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
+ * this array. Then the extra AVBufferRef pointers are stored in the
+ * extended_buf array.
+ */
+ AVBufferRef *buf[AV_NUM_DATA_POINTERS];
+
+ /**
+ * For planar audio which requires more than AV_NUM_DATA_POINTERS
+ * AVBufferRef pointers, this array will hold all the references which
+ * cannot fit into AVFrame.buf.
+ *
+ * Note that this is different from AVFrame.extended_data, which always
+ * contains all the pointers. This array only contains the extra pointers,
+ * which cannot fit into AVFrame.buf.
+ *
+ * This array is always allocated using av_malloc() by whoever constructs
+ * the frame. It is freed in av_frame_unref().
+ */
+ AVBufferRef **extended_buf;
+ /**
+ * Number of elements in extended_buf.
+ */
+ int nb_extended_buf;
+
+ AVFrameSideData **side_data;
+ int nb_side_data;
+
+/**
+ * @defgroup lavu_frame_flags AV_FRAME_FLAGS
+ * Flags describing additional frame properties.
+ *
+ * @{
+ */
+
+/**
+ * The frame data may be corrupted, e.g. due to decoding errors.
+ */
+#define AV_FRAME_FLAG_CORRUPT (1 << 0)
+/**
+ * @}
+ */
+
+ /**
+ * Frame flags, a combination of @ref lavu_frame_flags
+ */
+ int flags;
+} AVFrame;
+
+/**
+ * Allocate an AVFrame and set its fields to default values. The resulting
+ * struct must be freed using av_frame_free().
+ *
+ * @return An AVFrame filled with default values or NULL on failure.
+ *
+ * @note this only allocates the AVFrame itself, not the data buffers. Those
+ * must be allocated through other means, e.g. with av_frame_get_buffer() or
+ * manually.
+ */
+AVFrame *av_frame_alloc(void);
+
+/**
+ * Free the frame and any dynamically allocated objects in it,
+ * e.g. extended_data. If the frame is reference counted, it will be
+ * unreferenced first.
+ *
+ * @param frame frame to be freed. The pointer will be set to NULL.
+ */
+void av_frame_free(AVFrame **frame);
+
+/**
+ * Set up a new reference to the data described by the source frame.
+ *
+ * Copy frame properties from src to dst and create a new reference for each
+ * AVBufferRef from src.
+ *
+ * If src is not reference counted, new buffers are allocated and the data is
+ * copied.
+ *
+ * @return 0 on success, a negative AVERROR on error
+ */
+int av_frame_ref(AVFrame *dst, const AVFrame *src);
+
+/**
+ * Create a new frame that references the same data as src.
+ *
+ * This is a shortcut for av_frame_alloc()+av_frame_ref().
+ *
+ * @return newly created AVFrame on success, NULL on error.
+ */
+AVFrame *av_frame_clone(const AVFrame *src);
+
+/**
+ * Unreference all the buffers referenced by frame and reset the frame fields.
+ */
+void av_frame_unref(AVFrame *frame);
+
+/**
+ * Move everythnig contained in src to dst and reset src.
+ */
+void av_frame_move_ref(AVFrame *dst, AVFrame *src);
+
+/**
+ * Allocate new buffer(s) for audio or video data.
+ *
+ * The following fields must be set on frame before calling this function:
+ * - format (pixel format for video, sample format for audio)
+ * - width and height for video
+ * - nb_samples and channel_layout for audio
+ *
+ * This function will fill AVFrame.data and AVFrame.buf arrays and, if
+ * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.
+ * For planar formats, one buffer will be allocated for each plane.
+ *
+ * @param frame frame in which to store the new buffers.
+ * @param align required buffer size alignment
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ */
+int av_frame_get_buffer(AVFrame *frame, int align);
+
+/**
+ * Check if the frame data is writable.
+ *
+ * @return A positive value if the frame data is writable (which is true if and
+ * only if each of the underlying buffers has only one reference, namely the one
+ * stored in this frame). Return 0 otherwise.
+ *
+ * If 1 is returned the answer is valid until av_buffer_ref() is called on any
+ * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).
+ *
+ * @see av_frame_make_writable(), av_buffer_is_writable()
+ */
+int av_frame_is_writable(AVFrame *frame);
+
+/**
+ * Ensure that the frame data is writable, avoiding data copy if possible.
+ *
+ * Do nothing if the frame is writable, allocate new buffers and copy the data
+ * if it is not.
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ *
+ * @see av_frame_is_writable(), av_buffer_is_writable(),
+ * av_buffer_make_writable()
+ */
+int av_frame_make_writable(AVFrame *frame);
+
+/**
+ * Copy only "metadata" fields from src to dst.
+ *
+ * Metadata for the purpose of this function are those fields that do not affect
+ * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample
+ * aspect ratio (for video), but not width/height or channel layout.
+ * Side data is also copied.
+ */
+int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
+
+/**
+ * Get the buffer reference a given data plane is stored in.
+ *
+ * @param plane index of the data plane of interest in frame->extended_data.
+ *
+ * @return the buffer reference that contains the plane or NULL if the input
+ * frame is not valid.
+ */
+AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane);
+
+/**
+ * Add a new side data to a frame.
+ *
+ * @param frame a frame to which the side data should be added
+ * @param type type of the added side data
+ * @param size size of the side data
+ *
+ * @return newly added side data on success, NULL on error
+ */
+AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
+ enum AVFrameSideDataType type,
+ int size);
+
+/**
+ * @return a pointer to the side data of a given type on success, NULL if there
+ * is no side data with such type in this frame.
+ */
+AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
+ enum AVFrameSideDataType type);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_FRAME_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/hmac.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/hmac.h
new file mode 100644
index 000000000..28c2062b1
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/hmac.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012 Martin Storsjo
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_HMAC_H
+#define AVUTIL_HMAC_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_hmac HMAC
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+enum AVHMACType {
+ AV_HMAC_MD5,
+ AV_HMAC_SHA1,
+};
+
+typedef struct AVHMAC AVHMAC;
+
+/**
+ * Allocate an AVHMAC context.
+ * @param type The hash function used for the HMAC.
+ */
+AVHMAC *av_hmac_alloc(enum AVHMACType type);
+
+/**
+ * Free an AVHMAC context.
+ * @param ctx The context to free, may be NULL
+ */
+void av_hmac_free(AVHMAC *ctx);
+
+/**
+ * Initialize an AVHMAC context with an authentication key.
+ * @param ctx The HMAC context
+ * @param key The authentication key
+ * @param keylen The length of the key, in bytes
+ */
+void av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen);
+
+/**
+ * Hash data with the HMAC.
+ * @param ctx The HMAC context
+ * @param data The data to hash
+ * @param len The length of the data, in bytes
+ */
+void av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len);
+
+/**
+ * Finish hashing and output the HMAC digest.
+ * @param ctx The HMAC context
+ * @param out The output buffer to write the digest into
+ * @param outlen The length of the out buffer, in bytes
+ * @return The number of bytes written to out, or a negative error code.
+ */
+int av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen);
+
+/**
+ * Hash an array of data with a key.
+ * @param ctx The HMAC context
+ * @param data The data to hash
+ * @param len The length of the data, in bytes
+ * @param key The authentication key
+ * @param keylen The length of the key, in bytes
+ * @param out The output buffer to write the digest into
+ * @param outlen The length of the out buffer, in bytes
+ * @return The number of bytes written to out, or a negative error code.
+ */
+int av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len,
+ const uint8_t *key, unsigned int keylen,
+ uint8_t *out, unsigned int outlen);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_HMAC_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/imgutils.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/imgutils.h
new file mode 100644
index 000000000..71510132a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/imgutils.h
@@ -0,0 +1,138 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_IMGUTILS_H
+#define AVUTIL_IMGUTILS_H
+
+/**
+ * @file
+ * misc image utilities
+ *
+ * @addtogroup lavu_picture
+ * @{
+ */
+
+#include "avutil.h"
+#include "pixdesc.h"
+
+/**
+ * Compute the max pixel step for each plane of an image with a
+ * format described by pixdesc.
+ *
+ * The pixel step is the distance in bytes between the first byte of
+ * the group of bytes which describe a pixel component and the first
+ * byte of the successive group in the same plane for the same
+ * component.
+ *
+ * @param max_pixsteps an array which is filled with the max pixel step
+ * for each plane. Since a plane may contain different pixel
+ * components, the computed max_pixsteps[plane] is relative to the
+ * component in the plane with the max pixel step.
+ * @param max_pixstep_comps an array which is filled with the component
+ * for each plane which has the max pixel step. May be NULL.
+ */
+void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4],
+ const AVPixFmtDescriptor *pixdesc);
+
+/**
+ * Compute the size of an image line with format pix_fmt and width
+ * width for the plane plane.
+ *
+ * @return the computed size in bytes
+ */
+int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane);
+
+/**
+ * Fill plane linesizes for an image with pixel format pix_fmt and
+ * width width.
+ *
+ * @param linesizes array to be filled with the linesize for each plane
+ * @return >= 0 in case of success, a negative error code otherwise
+ */
+int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width);
+
+/**
+ * Fill plane data pointers for an image with pixel format pix_fmt and
+ * height height.
+ *
+ * @param data pointers array to be filled with the pointer for each image plane
+ * @param ptr the pointer to a buffer which will contain the image
+ * @param linesizes the array containing the linesize for each
+ * plane, should be filled by av_image_fill_linesizes()
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height,
+ uint8_t *ptr, const int linesizes[4]);
+
+/**
+ * Allocate an image with size w and h and pixel format pix_fmt, and
+ * fill pointers and linesizes accordingly.
+ * The allocated image buffer has to be freed by using
+ * av_freep(&pointers[0]).
+ *
+ * @param align the value to use for buffer size alignment
+ * @return the size in bytes required for the image buffer, a negative
+ * error code in case of failure
+ */
+int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
+ int w, int h, enum AVPixelFormat pix_fmt, int align);
+
+/**
+ * Copy image plane from src to dst.
+ * That is, copy "height" number of lines of "bytewidth" bytes each.
+ * The first byte of each successive line is separated by *_linesize
+ * bytes.
+ *
+ * @param dst_linesize linesize for the image plane in dst
+ * @param src_linesize linesize for the image plane in src
+ */
+void av_image_copy_plane(uint8_t *dst, int dst_linesize,
+ const uint8_t *src, int src_linesize,
+ int bytewidth, int height);
+
+/**
+ * Copy image in src_data to dst_data.
+ *
+ * @param dst_linesizes linesizes for the image in dst_data
+ * @param src_linesizes linesizes for the image in src_data
+ */
+void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
+ const uint8_t *src_data[4], const int src_linesizes[4],
+ enum AVPixelFormat pix_fmt, int width, int height);
+
+/**
+ * Check if the given dimension of an image is valid, meaning that all
+ * bytes of the image can be addressed with a signed int.
+ *
+ * @param w the width of the picture
+ * @param h the height of the picture
+ * @param log_offset the offset to sum to the log level for logging with log_ctx
+ * @param log_ctx the parent logging context, it may be NULL
+ * @return >= 0 if valid, a negative error code otherwise
+ */
+int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);
+
+int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt);
+
+/**
+ * @}
+ */
+
+
+#endif /* AVUTIL_IMGUTILS_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/intfloat.h
new file mode 100644
index 000000000..38d26ad87
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/intfloat.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2011 Mans Rullgard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTFLOAT_H
+#define AVUTIL_INTFLOAT_H
+
+#include <stdint.h>
+#include "attributes.h"
+
+union av_intfloat32 {
+ uint32_t i;
+ float f;
+};
+
+union av_intfloat64 {
+ uint64_t i;
+ double f;
+};
+
+/**
+ * Reinterpret a 32-bit integer as a float.
+ */
+static av_always_inline float av_int2float(uint32_t i)
+{
+ union av_intfloat32 v;
+ v.i = i;
+ return v.f;
+}
+
+/**
+ * Reinterpret a float as a 32-bit integer.
+ */
+static av_always_inline uint32_t av_float2int(float f)
+{
+ union av_intfloat32 v;
+ v.f = f;
+ return v.i;
+}
+
+/**
+ * Reinterpret a 64-bit integer as a double.
+ */
+static av_always_inline double av_int2double(uint64_t i)
+{
+ union av_intfloat64 v;
+ v.i = i;
+ return v.f;
+}
+
+/**
+ * Reinterpret a double as a 64-bit integer.
+ */
+static av_always_inline uint64_t av_double2int(double f)
+{
+ union av_intfloat64 v;
+ v.f = f;
+ return v.i;
+}
+
+#endif /* AVUTIL_INTFLOAT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/intreadwrite.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/intreadwrite.h
new file mode 100644
index 000000000..f77fd60f3
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/intreadwrite.h
@@ -0,0 +1,549 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_INTREADWRITE_H
+#define AVUTIL_INTREADWRITE_H
+
+#include <stdint.h>
+#include "libavutil/avconfig.h"
+#include "attributes.h"
+#include "bswap.h"
+
+typedef union {
+ uint64_t u64;
+ uint32_t u32[2];
+ uint16_t u16[4];
+ uint8_t u8 [8];
+ double f64;
+ float f32[2];
+} av_alias av_alias64;
+
+typedef union {
+ uint32_t u32;
+ uint16_t u16[2];
+ uint8_t u8 [4];
+ float f32;
+} av_alias av_alias32;
+
+typedef union {
+ uint16_t u16;
+ uint8_t u8 [2];
+} av_alias av_alias16;
+
+/*
+ * Arch-specific headers can provide any combination of
+ * AV_[RW][BLN](16|24|32|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.
+ * Preprocessor symbols must be defined, even if these are implemented
+ * as inline functions.
+ */
+
+#ifdef HAVE_AV_CONFIG_H
+
+#include "config.h"
+
+#if ARCH_ARM
+# include "arm/intreadwrite.h"
+#elif ARCH_AVR32
+# include "avr32/intreadwrite.h"
+#elif ARCH_MIPS
+# include "mips/intreadwrite.h"
+#elif ARCH_PPC
+# include "ppc/intreadwrite.h"
+#elif ARCH_TOMI
+# include "tomi/intreadwrite.h"
+#elif ARCH_X86
+# include "x86/intreadwrite.h"
+#endif
+
+#endif /* HAVE_AV_CONFIG_H */
+
+/*
+ * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
+ */
+
+#if AV_HAVE_BIGENDIAN
+
+# if defined(AV_RN16) && !defined(AV_RB16)
+# define AV_RB16(p) AV_RN16(p)
+# elif !defined(AV_RN16) && defined(AV_RB16)
+# define AV_RN16(p) AV_RB16(p)
+# endif
+
+# if defined(AV_WN16) && !defined(AV_WB16)
+# define AV_WB16(p, v) AV_WN16(p, v)
+# elif !defined(AV_WN16) && defined(AV_WB16)
+# define AV_WN16(p, v) AV_WB16(p, v)
+# endif
+
+# if defined(AV_RN24) && !defined(AV_RB24)
+# define AV_RB24(p) AV_RN24(p)
+# elif !defined(AV_RN24) && defined(AV_RB24)
+# define AV_RN24(p) AV_RB24(p)
+# endif
+
+# if defined(AV_WN24) && !defined(AV_WB24)
+# define AV_WB24(p, v) AV_WN24(p, v)
+# elif !defined(AV_WN24) && defined(AV_WB24)
+# define AV_WN24(p, v) AV_WB24(p, v)
+# endif
+
+# if defined(AV_RN32) && !defined(AV_RB32)
+# define AV_RB32(p) AV_RN32(p)
+# elif !defined(AV_RN32) && defined(AV_RB32)
+# define AV_RN32(p) AV_RB32(p)
+# endif
+
+# if defined(AV_WN32) && !defined(AV_WB32)
+# define AV_WB32(p, v) AV_WN32(p, v)
+# elif !defined(AV_WN32) && defined(AV_WB32)
+# define AV_WN32(p, v) AV_WB32(p, v)
+# endif
+
+# if defined(AV_RN64) && !defined(AV_RB64)
+# define AV_RB64(p) AV_RN64(p)
+# elif !defined(AV_RN64) && defined(AV_RB64)
+# define AV_RN64(p) AV_RB64(p)
+# endif
+
+# if defined(AV_WN64) && !defined(AV_WB64)
+# define AV_WB64(p, v) AV_WN64(p, v)
+# elif !defined(AV_WN64) && defined(AV_WB64)
+# define AV_WN64(p, v) AV_WB64(p, v)
+# endif
+
+#else /* AV_HAVE_BIGENDIAN */
+
+# if defined(AV_RN16) && !defined(AV_RL16)
+# define AV_RL16(p) AV_RN16(p)
+# elif !defined(AV_RN16) && defined(AV_RL16)
+# define AV_RN16(p) AV_RL16(p)
+# endif
+
+# if defined(AV_WN16) && !defined(AV_WL16)
+# define AV_WL16(p, v) AV_WN16(p, v)
+# elif !defined(AV_WN16) && defined(AV_WL16)
+# define AV_WN16(p, v) AV_WL16(p, v)
+# endif
+
+# if defined(AV_RN24) && !defined(AV_RL24)
+# define AV_RL24(p) AV_RN24(p)
+# elif !defined(AV_RN24) && defined(AV_RL24)
+# define AV_RN24(p) AV_RL24(p)
+# endif
+
+# if defined(AV_WN24) && !defined(AV_WL24)
+# define AV_WL24(p, v) AV_WN24(p, v)
+# elif !defined(AV_WN24) && defined(AV_WL24)
+# define AV_WN24(p, v) AV_WL24(p, v)
+# endif
+
+# if defined(AV_RN32) && !defined(AV_RL32)
+# define AV_RL32(p) AV_RN32(p)
+# elif !defined(AV_RN32) && defined(AV_RL32)
+# define AV_RN32(p) AV_RL32(p)
+# endif
+
+# if defined(AV_WN32) && !defined(AV_WL32)
+# define AV_WL32(p, v) AV_WN32(p, v)
+# elif !defined(AV_WN32) && defined(AV_WL32)
+# define AV_WN32(p, v) AV_WL32(p, v)
+# endif
+
+# if defined(AV_RN64) && !defined(AV_RL64)
+# define AV_RL64(p) AV_RN64(p)
+# elif !defined(AV_RN64) && defined(AV_RL64)
+# define AV_RN64(p) AV_RL64(p)
+# endif
+
+# if defined(AV_WN64) && !defined(AV_WL64)
+# define AV_WL64(p, v) AV_WN64(p, v)
+# elif !defined(AV_WN64) && defined(AV_WL64)
+# define AV_WN64(p, v) AV_WL64(p, v)
+# endif
+
+#endif /* !AV_HAVE_BIGENDIAN */
+
+/*
+ * Define AV_[RW]N helper macros to simplify definitions not provided
+ * by per-arch headers.
+ */
+
+#if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__)
+
+union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;
+union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;
+union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
+
+# define AV_RN(s, p) (((const union unaligned_##s *) (p))->l)
+# define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v))
+
+#elif defined(__DECC)
+
+# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))
+# define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v))
+
+#elif AV_HAVE_FAST_UNALIGNED
+
+# define AV_RN(s, p) (((const av_alias##s*)(p))->u##s)
+# define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v))
+
+#else
+
+#ifndef AV_RB16
+# define AV_RB16(x) \
+ ((((const uint8_t*)(x))[0] << 8) | \
+ ((const uint8_t*)(x))[1])
+#endif
+#ifndef AV_WB16
+# define AV_WB16(p, d) do { \
+ ((uint8_t*)(p))[1] = (d); \
+ ((uint8_t*)(p))[0] = (d)>>8; \
+ } while(0)
+#endif
+
+#ifndef AV_RL16
+# define AV_RL16(x) \
+ ((((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL16
+# define AV_WL16(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ } while(0)
+#endif
+
+#ifndef AV_RB32
+# define AV_RB32(x) \
+ (((uint32_t)((const uint8_t*)(x))[0] << 24) | \
+ (((const uint8_t*)(x))[1] << 16) | \
+ (((const uint8_t*)(x))[2] << 8) | \
+ ((const uint8_t*)(x))[3])
+#endif
+#ifndef AV_WB32
+# define AV_WB32(p, d) do { \
+ ((uint8_t*)(p))[3] = (d); \
+ ((uint8_t*)(p))[2] = (d)>>8; \
+ ((uint8_t*)(p))[1] = (d)>>16; \
+ ((uint8_t*)(p))[0] = (d)>>24; \
+ } while(0)
+#endif
+
+#ifndef AV_RL32
+# define AV_RL32(x) \
+ (((uint32_t)((const uint8_t*)(x))[3] << 24) | \
+ (((const uint8_t*)(x))[2] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL32
+# define AV_WL32(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ ((uint8_t*)(p))[3] = (d)>>24; \
+ } while(0)
+#endif
+
+#ifndef AV_RB64
+# define AV_RB64(x) \
+ (((uint64_t)((const uint8_t*)(x))[0] << 56) | \
+ ((uint64_t)((const uint8_t*)(x))[1] << 48) | \
+ ((uint64_t)((const uint8_t*)(x))[2] << 40) | \
+ ((uint64_t)((const uint8_t*)(x))[3] << 32) | \
+ ((uint64_t)((const uint8_t*)(x))[4] << 24) | \
+ ((uint64_t)((const uint8_t*)(x))[5] << 16) | \
+ ((uint64_t)((const uint8_t*)(x))[6] << 8) | \
+ (uint64_t)((const uint8_t*)(x))[7])
+#endif
+#ifndef AV_WB64
+# define AV_WB64(p, d) do { \
+ ((uint8_t*)(p))[7] = (d); \
+ ((uint8_t*)(p))[6] = (d)>>8; \
+ ((uint8_t*)(p))[5] = (d)>>16; \
+ ((uint8_t*)(p))[4] = (d)>>24; \
+ ((uint8_t*)(p))[3] = (d)>>32; \
+ ((uint8_t*)(p))[2] = (d)>>40; \
+ ((uint8_t*)(p))[1] = (d)>>48; \
+ ((uint8_t*)(p))[0] = (d)>>56; \
+ } while(0)
+#endif
+
+#ifndef AV_RL64
+# define AV_RL64(x) \
+ (((uint64_t)((const uint8_t*)(x))[7] << 56) | \
+ ((uint64_t)((const uint8_t*)(x))[6] << 48) | \
+ ((uint64_t)((const uint8_t*)(x))[5] << 40) | \
+ ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
+ ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
+ ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
+ ((uint64_t)((const uint8_t*)(x))[1] << 8) | \
+ (uint64_t)((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL64
+# define AV_WL64(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ ((uint8_t*)(p))[3] = (d)>>24; \
+ ((uint8_t*)(p))[4] = (d)>>32; \
+ ((uint8_t*)(p))[5] = (d)>>40; \
+ ((uint8_t*)(p))[6] = (d)>>48; \
+ ((uint8_t*)(p))[7] = (d)>>56; \
+ } while(0)
+#endif
+
+#if AV_HAVE_BIGENDIAN
+# define AV_RN(s, p) AV_RB##s(p)
+# define AV_WN(s, p, v) AV_WB##s(p, v)
+#else
+# define AV_RN(s, p) AV_RL##s(p)
+# define AV_WN(s, p, v) AV_WL##s(p, v)
+#endif
+
+#endif /* HAVE_FAST_UNALIGNED */
+
+#ifndef AV_RN16
+# define AV_RN16(p) AV_RN(16, p)
+#endif
+
+#ifndef AV_RN32
+# define AV_RN32(p) AV_RN(32, p)
+#endif
+
+#ifndef AV_RN64
+# define AV_RN64(p) AV_RN(64, p)
+#endif
+
+#ifndef AV_WN16
+# define AV_WN16(p, v) AV_WN(16, p, v)
+#endif
+
+#ifndef AV_WN32
+# define AV_WN32(p, v) AV_WN(32, p, v)
+#endif
+
+#ifndef AV_WN64
+# define AV_WN64(p, v) AV_WN(64, p, v)
+#endif
+
+#if AV_HAVE_BIGENDIAN
+# define AV_RB(s, p) AV_RN##s(p)
+# define AV_WB(s, p, v) AV_WN##s(p, v)
+# define AV_RL(s, p) av_bswap##s(AV_RN##s(p))
+# define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v))
+#else
+# define AV_RB(s, p) av_bswap##s(AV_RN##s(p))
+# define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v))
+# define AV_RL(s, p) AV_RN##s(p)
+# define AV_WL(s, p, v) AV_WN##s(p, v)
+#endif
+
+#define AV_RB8(x) (((const uint8_t*)(x))[0])
+#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
+
+#define AV_RL8(x) AV_RB8(x)
+#define AV_WL8(p, d) AV_WB8(p, d)
+
+#ifndef AV_RB16
+# define AV_RB16(p) AV_RB(16, p)
+#endif
+#ifndef AV_WB16
+# define AV_WB16(p, v) AV_WB(16, p, v)
+#endif
+
+#ifndef AV_RL16
+# define AV_RL16(p) AV_RL(16, p)
+#endif
+#ifndef AV_WL16
+# define AV_WL16(p, v) AV_WL(16, p, v)
+#endif
+
+#ifndef AV_RB32
+# define AV_RB32(p) AV_RB(32, p)
+#endif
+#ifndef AV_WB32
+# define AV_WB32(p, v) AV_WB(32, p, v)
+#endif
+
+#ifndef AV_RL32
+# define AV_RL32(p) AV_RL(32, p)
+#endif
+#ifndef AV_WL32
+# define AV_WL32(p, v) AV_WL(32, p, v)
+#endif
+
+#ifndef AV_RB64
+# define AV_RB64(p) AV_RB(64, p)
+#endif
+#ifndef AV_WB64
+# define AV_WB64(p, v) AV_WB(64, p, v)
+#endif
+
+#ifndef AV_RL64
+# define AV_RL64(p) AV_RL(64, p)
+#endif
+#ifndef AV_WL64
+# define AV_WL64(p, v) AV_WL(64, p, v)
+#endif
+
+#ifndef AV_RB24
+# define AV_RB24(x) \
+ ((((const uint8_t*)(x))[0] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[2])
+#endif
+#ifndef AV_WB24
+# define AV_WB24(p, d) do { \
+ ((uint8_t*)(p))[2] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[0] = (d)>>16; \
+ } while(0)
+#endif
+
+#ifndef AV_RL24
+# define AV_RL24(x) \
+ ((((const uint8_t*)(x))[2] << 16) | \
+ (((const uint8_t*)(x))[1] << 8) | \
+ ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL24
+# define AV_WL24(p, d) do { \
+ ((uint8_t*)(p))[0] = (d); \
+ ((uint8_t*)(p))[1] = (d)>>8; \
+ ((uint8_t*)(p))[2] = (d)>>16; \
+ } while(0)
+#endif
+
+/*
+ * The AV_[RW]NA macros access naturally aligned data
+ * in a type-safe way.
+ */
+
+#define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s)
+#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v))
+
+#ifndef AV_RN16A
+# define AV_RN16A(p) AV_RNA(16, p)
+#endif
+
+#ifndef AV_RN32A
+# define AV_RN32A(p) AV_RNA(32, p)
+#endif
+
+#ifndef AV_RN64A
+# define AV_RN64A(p) AV_RNA(64, p)
+#endif
+
+#ifndef AV_WN16A
+# define AV_WN16A(p, v) AV_WNA(16, p, v)
+#endif
+
+#ifndef AV_WN32A
+# define AV_WN32A(p, v) AV_WNA(32, p, v)
+#endif
+
+#ifndef AV_WN64A
+# define AV_WN64A(p, v) AV_WNA(64, p, v)
+#endif
+
+/*
+ * The AV_COPYxxU macros are suitable for copying data to/from unaligned
+ * memory locations.
+ */
+
+#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s));
+
+#ifndef AV_COPY16U
+# define AV_COPY16U(d, s) AV_COPYU(16, d, s)
+#endif
+
+#ifndef AV_COPY32U
+# define AV_COPY32U(d, s) AV_COPYU(32, d, s)
+#endif
+
+#ifndef AV_COPY64U
+# define AV_COPY64U(d, s) AV_COPYU(64, d, s)
+#endif
+
+#ifndef AV_COPY128U
+# define AV_COPY128U(d, s) \
+ do { \
+ AV_COPY64U(d, s); \
+ AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \
+ } while(0)
+#endif
+
+/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
+ * naturally aligned. They may be implemented using MMX,
+ * so emms_c() must be called before using any float code
+ * afterwards.
+ */
+
+#define AV_COPY(n, d, s) \
+ (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)
+
+#ifndef AV_COPY16
+# define AV_COPY16(d, s) AV_COPY(16, d, s)
+#endif
+
+#ifndef AV_COPY32
+# define AV_COPY32(d, s) AV_COPY(32, d, s)
+#endif
+
+#ifndef AV_COPY64
+# define AV_COPY64(d, s) AV_COPY(64, d, s)
+#endif
+
+#ifndef AV_COPY128
+# define AV_COPY128(d, s) \
+ do { \
+ AV_COPY64(d, s); \
+ AV_COPY64((char*)(d)+8, (char*)(s)+8); \
+ } while(0)
+#endif
+
+#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b))
+
+#ifndef AV_SWAP64
+# define AV_SWAP64(a, b) AV_SWAP(64, a, b)
+#endif
+
+#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0)
+
+#ifndef AV_ZERO16
+# define AV_ZERO16(d) AV_ZERO(16, d)
+#endif
+
+#ifndef AV_ZERO32
+# define AV_ZERO32(d) AV_ZERO(32, d)
+#endif
+
+#ifndef AV_ZERO64
+# define AV_ZERO64(d) AV_ZERO(64, d)
+#endif
+
+#ifndef AV_ZERO128
+# define AV_ZERO128(d) \
+ do { \
+ AV_ZERO64(d); \
+ AV_ZERO64((char*)(d)+8); \
+ } while(0)
+#endif
+
+#endif /* AVUTIL_INTREADWRITE_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/lfg.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/lfg.h
new file mode 100644
index 000000000..5e526c1da
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/lfg.h
@@ -0,0 +1,62 @@
+/*
+ * Lagged Fibonacci PRNG
+ * Copyright (c) 2008 Michael Niedermayer
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LFG_H
+#define AVUTIL_LFG_H
+
+typedef struct AVLFG {
+ unsigned int state[64];
+ int index;
+} AVLFG;
+
+void av_lfg_init(AVLFG *c, unsigned int seed);
+
+/**
+ * Get the next random unsigned 32-bit number using an ALFG.
+ *
+ * Please also consider a simple LCG like state= state*1664525+1013904223,
+ * it may be good enough and faster for your specific use case.
+ */
+static inline unsigned int av_lfg_get(AVLFG *c){
+ c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
+ return c->state[c->index++ & 63];
+}
+
+/**
+ * Get the next random unsigned 32-bit number using a MLFG.
+ *
+ * Please also consider av_lfg_get() above, it is faster.
+ */
+static inline unsigned int av_mlfg_get(AVLFG *c){
+ unsigned int a= c->state[(c->index-55) & 63];
+ unsigned int b= c->state[(c->index-24) & 63];
+ return c->state[c->index++ & 63] = 2*a*b+a+b;
+}
+
+/**
+ * Get the next two numbers generated by a Box-Muller Gaussian
+ * generator using the random numbers issued by lfg.
+ *
+ * @param out array where the two generated numbers are placed
+ */
+void av_bmg_get(AVLFG *lfg, double out[2]);
+
+#endif /* AVUTIL_LFG_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/log.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/log.h
new file mode 100644
index 000000000..6d26b67db
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/log.h
@@ -0,0 +1,262 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LOG_H
+#define AVUTIL_LOG_H
+
+#include <stdarg.h>
+#include "avutil.h"
+#include "attributes.h"
+
+/**
+ * Describe the class of an AVClass context structure. That is an
+ * arbitrary struct of which the first field is a pointer to an
+ * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
+ */
+typedef struct AVClass {
+ /**
+ * The name of the class; usually it is the same name as the
+ * context structure type to which the AVClass is associated.
+ */
+ const char* class_name;
+
+ /**
+ * A pointer to a function which returns the name of a context
+ * instance ctx associated with the class.
+ */
+ const char* (*item_name)(void* ctx);
+
+ /**
+ * a pointer to the first option specified in the class if any or NULL
+ *
+ * @see av_set_default_options()
+ */
+ const struct AVOption *option;
+
+ /**
+ * LIBAVUTIL_VERSION with which this structure was created.
+ * This is used to allow fields to be added without requiring major
+ * version bumps everywhere.
+ */
+
+ int version;
+
+ /**
+ * Offset in the structure where log_level_offset is stored.
+ * 0 means there is no such variable
+ */
+ int log_level_offset_offset;
+
+ /**
+ * Offset in the structure where a pointer to the parent context for
+ * logging is stored. For example a decoder could pass its AVCodecContext
+ * to eval as such a parent context, which an av_log() implementation
+ * could then leverage to display the parent context.
+ * The offset can be NULL.
+ */
+ int parent_log_context_offset;
+
+ /**
+ * Return next AVOptions-enabled child or NULL
+ */
+ void* (*child_next)(void *obj, void *prev);
+
+ /**
+ * Return an AVClass corresponding to the next potential
+ * AVOptions-enabled child.
+ *
+ * The difference between child_next and this is that
+ * child_next iterates over _already existing_ objects, while
+ * child_class_next iterates over _all possible_ children.
+ */
+ const struct AVClass* (*child_class_next)(const struct AVClass *prev);
+} AVClass;
+
+/**
+ * @addtogroup lavu_log
+ *
+ * @{
+ *
+ * @defgroup lavu_log_constants Logging Constants
+ *
+ * @{
+ */
+
+/**
+ * Print no output.
+ */
+#define AV_LOG_QUIET -8
+
+/**
+ * Something went really wrong and we will crash now.
+ */
+#define AV_LOG_PANIC 0
+
+/**
+ * Something went wrong and recovery is not possible.
+ * For example, no header was found for a format which depends
+ * on headers or an illegal combination of parameters is used.
+ */
+#define AV_LOG_FATAL 8
+
+/**
+ * Something went wrong and cannot losslessly be recovered.
+ * However, not all future data is affected.
+ */
+#define AV_LOG_ERROR 16
+
+/**
+ * Something somehow does not look correct. This may or may not
+ * lead to problems. An example would be the use of '-vstrict -2'.
+ */
+#define AV_LOG_WARNING 24
+
+/**
+ * Standard information.
+ */
+#define AV_LOG_INFO 32
+
+/**
+ * Detailed information.
+ */
+#define AV_LOG_VERBOSE 40
+
+/**
+ * Stuff which is only useful for libav* developers.
+ */
+#define AV_LOG_DEBUG 48
+
+/**
+ * @}
+ */
+
+/**
+ * Send the specified message to the log if the level is less than or equal
+ * to the current av_log_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different logging callback
+ * function.
+ * @see av_log_set_callback
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message expressed using a @ref
+ * lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ */
+void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
+
+
+/**
+ * Send the specified message to the log if the level is less than or equal
+ * to the current av_log_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different logging callback
+ * function.
+ * @see av_log_set_callback
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message expressed using a @ref
+ * lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ * @param vl The arguments referenced by the format string.
+ */
+void av_vlog(void *avcl, int level, const char *fmt, va_list vl);
+
+/**
+ * Get the current log level
+ *
+ * @see lavu_log_constants
+ *
+ * @return Current log level
+ */
+int av_log_get_level(void);
+
+/**
+ * Set the log level
+ *
+ * @see lavu_log_constants
+ *
+ * @param level Logging level
+ */
+void av_log_set_level(int level);
+
+/**
+ * Set the logging callback
+ *
+ * @see av_log_default_callback
+ *
+ * @param callback A logging function with a compatible signature.
+ */
+void av_log_set_callback(void (*callback)(void*, int, const char*, va_list));
+
+/**
+ * Default logging callback
+ *
+ * It prints the message to stderr, optionally colorizing it.
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ * pointer to an AVClass struct.
+ * @param level The importance level of the message expressed using a @ref
+ * lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ * subsequent arguments are converted to output.
+ * @param vl The arguments referenced by the format string.
+ */
+void av_log_default_callback(void *avcl, int level, const char *fmt,
+ va_list vl);
+
+/**
+ * Return the context name
+ *
+ * @param ctx The AVClass context
+ *
+ * @return The AVClass class_name
+ */
+const char* av_default_item_name(void* ctx);
+
+/**
+ * av_dlog macros
+ * Useful to print debug messages that shouldn't get compiled in normally.
+ */
+
+#ifdef DEBUG
+# define av_dlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
+#else
+# define av_dlog(pctx, ...)
+#endif
+
+/**
+ * Skip repeated messages, this requires the user app to use av_log() instead of
+ * (f)printf as the 2 would otherwise interfere and lead to
+ * "Last message repeated x times" messages below (f)printf messages with some
+ * bad luck.
+ * Also to receive the last, "last repeated" line if any, the user app must
+ * call av_log(NULL, AV_LOG_QUIET, ""); at the end
+ */
+#define AV_LOG_SKIP_REPEATED 1
+void av_log_set_flags(int arg);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_LOG_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/lzo.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/lzo.h
new file mode 100644
index 000000000..9d7e8f1dc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/lzo.h
@@ -0,0 +1,66 @@
+/*
+ * LZO 1x decompression
+ * copyright (c) 2006 Reimar Doeffinger
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LZO_H
+#define AVUTIL_LZO_H
+
+/**
+ * @defgroup lavu_lzo LZO
+ * @ingroup lavu_crypto
+ *
+ * @{
+ */
+
+#include <stdint.h>
+
+/** @name Error flags returned by av_lzo1x_decode
+ * @{ */
+/// end of the input buffer reached before decoding finished
+#define AV_LZO_INPUT_DEPLETED 1
+/// decoded data did not fit into output buffer
+#define AV_LZO_OUTPUT_FULL 2
+/// a reference to previously decoded data was wrong
+#define AV_LZO_INVALID_BACKPTR 4
+/// a non-specific error in the compressed bitstream
+#define AV_LZO_ERROR 8
+/** @} */
+
+#define AV_LZO_INPUT_PADDING 8
+#define AV_LZO_OUTPUT_PADDING 12
+
+/**
+ * @brief Decodes LZO 1x compressed data.
+ * @param out output buffer
+ * @param outlen size of output buffer, number of bytes left are returned here
+ * @param in input buffer
+ * @param inlen size of input buffer, number of bytes left are returned here
+ * @return 0 on success, otherwise a combination of the error flags above
+ *
+ * Make sure all buffers are appropriately padded, in must provide
+ * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes.
+ */
+int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_LZO_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/macros.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/macros.h
new file mode 100644
index 000000000..bf3eb9b9a
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/macros.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @ingroup lavu
+ * Utility Preprocessor macros
+ */
+
+#ifndef AVUTIL_MACROS_H
+#define AVUTIL_MACROS_H
+
+/**
+ * @addtogroup preproc_misc Preprocessor String Macros
+ *
+ * String manipulation macros
+ *
+ * @{
+ */
+
+#define AV_STRINGIFY(s) AV_TOSTRING(s)
+#define AV_TOSTRING(s) #s
+
+#define AV_GLUE(a, b) a ## b
+#define AV_JOIN(a, b) AV_GLUE(a, b)
+
+/**
+ * @}
+ */
+
+#define AV_PRAGMA(s) _Pragma(#s)
+
+#endif /* AVUTIL_MACROS_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/mathematics.h
new file mode 100644
index 000000000..043dd0faf
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/mathematics.h
@@ -0,0 +1,111 @@
+/*
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MATHEMATICS_H
+#define AVUTIL_MATHEMATICS_H
+
+#include <stdint.h>
+#include <math.h>
+#include "attributes.h"
+#include "rational.h"
+#include "intfloat.h"
+
+#ifndef M_LOG2_10
+#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
+#endif
+#ifndef M_PHI
+#define M_PHI 1.61803398874989484820 /* phi / golden ratio */
+#endif
+#ifndef NAN
+#define NAN av_int2float(0x7fc00000)
+#endif
+#ifndef INFINITY
+#define INFINITY av_int2float(0x7f800000)
+#endif
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+
+enum AVRounding {
+ AV_ROUND_ZERO = 0, ///< Round toward zero.
+ AV_ROUND_INF = 1, ///< Round away from zero.
+ AV_ROUND_DOWN = 2, ///< Round toward -infinity.
+ AV_ROUND_UP = 3, ///< Round toward +infinity.
+ AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
+};
+
+/**
+ * Return the greatest common divisor of a and b.
+ * If both a and b are 0 or either or both are <0 then behavior is
+ * undefined.
+ */
+int64_t av_const av_gcd(int64_t a, int64_t b);
+
+/**
+ * Rescale a 64-bit integer with rounding to nearest.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
+
+/**
+ * Rescale a 64-bit integer with specified rounding.
+ * A simple a*b/c isn't possible as it can overflow.
+ */
+int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers.
+ */
+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
+
+/**
+ * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
+ */
+int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
+ enum AVRounding) av_const;
+
+/**
+ * Compare 2 timestamps each in its own timebases.
+ * The result of the function is undefined if one of the timestamps
+ * is outside the int64_t range when represented in the others timebase.
+ * @return -1 if ts_a is before ts_b, 1 if ts_a is after ts_b or 0 if they represent the same position
+ */
+int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
+
+/**
+ * Compare 2 integers modulo mod.
+ * That is we compare integers a and b for which only the least
+ * significant log2(mod) bits are known.
+ *
+ * @param mod must be a power of 2
+ * @return a negative value if a is smaller than b
+ * a positive value if a is greater than b
+ * 0 if a equals b
+ */
+int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MATHEMATICS_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/md5.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/md5.h
new file mode 100644
index 000000000..29e4e7c2b
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/md5.h
@@ -0,0 +1,51 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_MD5_H
+#define AVUTIL_MD5_H
+
+#include <stdint.h>
+
+#include "attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavu_md5 MD5
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#if FF_API_CONTEXT_SIZE
+extern attribute_deprecated const int av_md5_size;
+#endif
+
+struct AVMD5;
+
+struct AVMD5 *av_md5_alloc(void);
+void av_md5_init(struct AVMD5 *ctx);
+void av_md5_update(struct AVMD5 *ctx, const uint8_t *src, const int len);
+void av_md5_final(struct AVMD5 *ctx, uint8_t *dst);
+void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MD5_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/mem.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/mem.h
new file mode 100644
index 000000000..4a5e362ce
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/mem.h
@@ -0,0 +1,265 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * memory handling functions
+ */
+
+#ifndef AVUTIL_MEM_H
+#define AVUTIL_MEM_H
+
+#include <limits.h>
+#include <stdint.h>
+
+#include "attributes.h"
+#include "avutil.h"
+
+/**
+ * @addtogroup lavu_mem
+ * @{
+ */
+
+
+#if defined(__ICC) && __ICC < 1200 || defined(__SUNPRO_C)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v
+#elif defined(__TI_COMPILER_VERSION__)
+ #define DECLARE_ALIGNED(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ t __attribute__((aligned(n))) v
+ #define DECLARE_ASM_CONST(n,t,v) \
+ AV_PRAGMA(DATA_ALIGN(v,n)) \
+ static const t __attribute__((aligned(n))) v
+#elif defined(__GNUC__)
+ #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v
+ #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v
+#elif defined(_MSC_VER)
+ #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
+ #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v
+#else
+ #define DECLARE_ALIGNED(n,t,v) t v
+ #define DECLARE_ASM_CONST(n,t,v) static const t v
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(3,1)
+ #define av_malloc_attrib __attribute__((__malloc__))
+#else
+ #define av_malloc_attrib
+#endif
+
+#if AV_GCC_VERSION_AT_LEAST(4,3)
+ #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
+#else
+ #define av_alloc_size(...)
+#endif
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU).
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ */
+void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Allocate a block of size * nmemb bytes with av_malloc().
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_malloc()
+ */
+av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size)
+{
+ if (!size || nmemb >= INT_MAX / size)
+ return NULL;
+ return av_malloc(nmemb * size);
+}
+
+/**
+ * Allocate or reallocate a block of memory.
+ * If ptr is NULL and size > 0, allocate a new block. If
+ * size is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a memory block already allocated with
+ * av_realloc() or NULL.
+ * @param size Size in bytes of the memory block to be allocated or
+ * reallocated.
+ * @return Pointer to a newly-reallocated block or NULL if the block
+ * cannot be reallocated or the function is used to free the memory block.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_realloc(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ * @see av_fast_realloc()
+ */
+void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
+
+/**
+ * Allocate or reallocate a block of memory.
+ * If *ptr is NULL and size > 0, allocate a new block. If
+ * size is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a pointer to a memory block already allocated
+ * with av_realloc(), or pointer to a pointer to NULL.
+ * The pointer is updated on success, or freed on failure.
+ * @param size Size in bytes for the memory block to be allocated or
+ * reallocated
+ * @return Zero on success, an AVERROR error code on failure.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_reallocp(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ */
+int av_reallocp(void *ptr, size_t size);
+
+/**
+ * Allocate or reallocate an array.
+ * If ptr is NULL and nmemb > 0, allocate a new block. If
+ * nmemb is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a memory block already allocated with
+ * av_realloc() or NULL.
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to a newly-reallocated block or NULL if the block
+ * cannot be reallocated or the function is used to free the memory block.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_realloc(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ */
+av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size);
+
+/**
+ * Allocate or reallocate an array through a pointer to a pointer.
+ * If *ptr is NULL and nmemb > 0, allocate a new block. If
+ * nmemb is zero, free the memory block pointed to by ptr.
+ * @param ptr Pointer to a pointer to a memory block already allocated
+ * with av_realloc(), or pointer to a pointer to NULL.
+ * The pointer is updated on success, or freed on failure.
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Zero on success, an AVERROR error code on failure.
+ * @warning Pointers originating from the av_malloc() family of functions must
+ * not be passed to av_realloc(). The former can be implemented using
+ * memalign() (or other functions), and there is no guarantee that
+ * pointers from such functions can be passed to realloc() at all.
+ * The situation is undefined according to POSIX and may crash with
+ * some libc implementations.
+ */
+av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc().
+ * @param ptr Pointer to the memory block which should be freed.
+ * @note ptr = NULL is explicitly allowed.
+ * @note It is recommended that you use av_freep() instead.
+ * @see av_freep()
+ */
+void av_free(void *ptr);
+
+/**
+ * Allocate a block of size bytes with alignment suitable for all
+ * memory accesses (including vectors if available on the CPU) and
+ * zero all the bytes of the block.
+ * @param size Size in bytes for the memory block to be allocated.
+ * @return Pointer to the allocated block, NULL if it cannot be allocated.
+ * @see av_malloc()
+ */
+void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
+
+/**
+ * Allocate a block of size * nmemb bytes with av_mallocz().
+ * @param nmemb Number of elements
+ * @param size Size of the single element
+ * @return Pointer to the allocated block, NULL if the block cannot
+ * be allocated.
+ * @see av_mallocz()
+ * @see av_malloc_array()
+ */
+av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size)
+{
+ if (!size || nmemb >= INT_MAX / size)
+ return NULL;
+ return av_mallocz(nmemb * size);
+}
+
+/**
+ * Duplicate the string s.
+ * @param s string to be duplicated
+ * @return Pointer to a newly-allocated string containing a
+ * copy of s or NULL if the string cannot be allocated.
+ */
+char *av_strdup(const char *s) av_malloc_attrib;
+
+/**
+ * Free a memory block which has been allocated with av_malloc(z)() or
+ * av_realloc() and set the pointer pointing to it to NULL.
+ * @param ptr Pointer to the pointer to the memory block which should
+ * be freed.
+ * @see av_free()
+ */
+void av_freep(void *ptr);
+
+/**
+ * deliberately overlapping memcpy implementation
+ * @param dst destination buffer
+ * @param back how many bytes back we start (the initial size of the overlapping window)
+ * @param cnt number of bytes to copy, must be >= 0
+ *
+ * cnt > back is valid, this will copy the bytes we just copied,
+ * thus creating a repeating pattern with a period length of back.
+ */
+void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
+
+/**
+ * Reallocate the given block if it is not large enough, otherwise do nothing.
+ *
+ * @see av_realloc
+ */
+void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * Allocate a buffer, reusing the given one if large enough.
+ *
+ * Contrary to av_fast_realloc the current buffer contents might not be
+ * preserved and on error the old buffer is freed, thus no special
+ * handling to avoid memleaks is necessary.
+ *
+ * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer
+ * @param size size of the buffer *ptr points to
+ * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and
+ * *size 0 if an error occurred.
+ */
+void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_MEM_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/old_pix_fmts.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/old_pix_fmts.h
new file mode 100644
index 000000000..d3e1e5b24
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/old_pix_fmts.h
@@ -0,0 +1,134 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_OLD_PIX_FMTS_H
+#define AVUTIL_OLD_PIX_FMTS_H
+
+/*
+ * This header exists to prevent new pixel formats from being accidentally added
+ * to the deprecated list.
+ * Do not include it directly. It will be removed on next major bump
+ *
+ * Do not add new items to this list. Use the AVPixelFormat enum instead.
+ */
+ PIX_FMT_NONE = AV_PIX_FMT_NONE,
+ PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ PIX_FMT_GRAY8, ///< Y , 8bpp
+ PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette
+ PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range
+ PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range
+ PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range
+#if FF_API_XVMC
+ PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ PIX_FMT_XVMC_MPEG2_IDCT,
+#endif /* FF_API_XVMC */
+ PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range
+ PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+#if FF_API_VDPAU
+ PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+#endif
+ PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0
+ PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0
+
+ PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1
+ PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1
+
+ PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+
+ PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+#if FF_API_VDPAU
+ PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+#endif
+ PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
+ PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
+ PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
+ PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
+ PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha
+ PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+ PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+ PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big endian
+ PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little endian
+ PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big endian
+ PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little endian
+ PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big endian
+ PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little endian
+ PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+
+#endif /* AVUTIL_OLD_PIX_FMTS_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/opt.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/opt.h
new file mode 100644
index 000000000..0181379b7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/opt.h
@@ -0,0 +1,516 @@
+/*
+ * AVOptions
+ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_OPT_H
+#define AVUTIL_OPT_H
+
+/**
+ * @file
+ * AVOptions
+ */
+
+#include "rational.h"
+#include "avutil.h"
+#include "dict.h"
+#include "log.h"
+
+/**
+ * @defgroup avoptions AVOptions
+ * @ingroup lavu_data
+ * @{
+ * AVOptions provide a generic system to declare options on arbitrary structs
+ * ("objects"). An option can have a help text, a type and a range of possible
+ * values. Options may then be enumerated, read and written to.
+ *
+ * @section avoptions_implement Implementing AVOptions
+ * This section describes how to add AVOptions capabilities to a struct.
+ *
+ * All AVOptions-related information is stored in an AVClass. Therefore
+ * the first member of the struct must be a pointer to an AVClass describing it.
+ * The option field of the AVClass must be set to a NULL-terminated static array
+ * of AVOptions. Each AVOption must have a non-empty name, a type, a default
+ * value and for number-type AVOptions also a range of allowed values. It must
+ * also declare an offset in bytes from the start of the struct, where the field
+ * associated with this AVOption is located. Other fields in the AVOption struct
+ * should also be set when applicable, but are not required.
+ *
+ * The following example illustrates an AVOptions-enabled struct:
+ * @code
+ * typedef struct test_struct {
+ * AVClass *class;
+ * int int_opt;
+ * char *str_opt;
+ * uint8_t *bin_opt;
+ * int bin_len;
+ * } test_struct;
+ *
+ * static const AVOption test_options[] = {
+ * { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),
+ * AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX },
+ * { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),
+ * AV_OPT_TYPE_STRING },
+ * { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),
+ * AV_OPT_TYPE_BINARY },
+ * { NULL },
+ * };
+ *
+ * static const AVClass test_class = {
+ * .class_name = "test class",
+ * .item_name = av_default_item_name,
+ * .option = test_options,
+ * .version = LIBAVUTIL_VERSION_INT,
+ * };
+ * @endcode
+ *
+ * Next, when allocating your struct, you must ensure that the AVClass pointer
+ * is set to the correct value. Then, av_opt_set_defaults() must be called to
+ * initialize defaults. After that the struct is ready to be used with the
+ * AVOptions API.
+ *
+ * When cleaning up, you may use the av_opt_free() function to automatically
+ * free all the allocated string and binary options.
+ *
+ * Continuing with the above example:
+ *
+ * @code
+ * test_struct *alloc_test_struct(void)
+ * {
+ * test_struct *ret = av_malloc(sizeof(*ret));
+ * ret->class = &test_class;
+ * av_opt_set_defaults(ret);
+ * return ret;
+ * }
+ * void free_test_struct(test_struct **foo)
+ * {
+ * av_opt_free(*foo);
+ * av_freep(foo);
+ * }
+ * @endcode
+ *
+ * @subsection avoptions_implement_nesting Nesting
+ * It may happen that an AVOptions-enabled struct contains another
+ * AVOptions-enabled struct as a member (e.g. AVCodecContext in
+ * libavcodec exports generic options, while its priv_data field exports
+ * codec-specific options). In such a case, it is possible to set up the
+ * parent struct to export a child's options. To do that, simply
+ * implement AVClass.child_next() and AVClass.child_class_next() in the
+ * parent struct's AVClass.
+ * Assuming that the test_struct from above now also contains a
+ * child_struct field:
+ *
+ * @code
+ * typedef struct child_struct {
+ * AVClass *class;
+ * int flags_opt;
+ * } child_struct;
+ * static const AVOption child_opts[] = {
+ * { "test_flags", "This is a test option of flags type.",
+ * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX },
+ * { NULL },
+ * };
+ * static const AVClass child_class = {
+ * .class_name = "child class",
+ * .item_name = av_default_item_name,
+ * .option = child_opts,
+ * .version = LIBAVUTIL_VERSION_INT,
+ * };
+ *
+ * void *child_next(void *obj, void *prev)
+ * {
+ * test_struct *t = obj;
+ * if (!prev && t->child_struct)
+ * return t->child_struct;
+ * return NULL
+ * }
+ * const AVClass child_class_next(const AVClass *prev)
+ * {
+ * return prev ? NULL : &child_class;
+ * }
+ * @endcode
+ * Putting child_next() and child_class_next() as defined above into
+ * test_class will now make child_struct's options accessible through
+ * test_struct (again, proper setup as described above needs to be done on
+ * child_struct right after it is created).
+ *
+ * From the above example it might not be clear why both child_next()
+ * and child_class_next() are needed. The distinction is that child_next()
+ * iterates over actually existing objects, while child_class_next()
+ * iterates over all possible child classes. E.g. if an AVCodecContext
+ * was initialized to use a codec which has private options, then its
+ * child_next() will return AVCodecContext.priv_data and finish
+ * iterating. OTOH child_class_next() on AVCodecContext.av_class will
+ * iterate over all available codecs with private options.
+ *
+ * @subsection avoptions_implement_named_constants Named constants
+ * It is possible to create named constants for options. Simply set the unit
+ * field of the option the constants should apply to to a string and
+ * create the constants themselves as options of type AV_OPT_TYPE_CONST
+ * with their unit field set to the same string.
+ * Their default_val field should contain the value of the named
+ * constant.
+ * For example, to add some named constants for the test_flags option
+ * above, put the following into the child_opts array:
+ * @code
+ * { "test_flags", "This is a test option of flags type.",
+ * offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" },
+ * { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" },
+ * @endcode
+ *
+ * @section avoptions_use Using AVOptions
+ * This section deals with accessing options in an AVOptions-enabled struct.
+ * Such structs in Libav are e.g. AVCodecContext in libavcodec or
+ * AVFormatContext in libavformat.
+ *
+ * @subsection avoptions_use_examine Examining AVOptions
+ * The basic functions for examining options are av_opt_next(), which iterates
+ * over all options defined for one object, and av_opt_find(), which searches
+ * for an option with the given name.
+ *
+ * The situation is more complicated with nesting. An AVOptions-enabled struct
+ * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag
+ * to av_opt_find() will make the function search children recursively.
+ *
+ * For enumerating there are basically two cases. The first is when you want to
+ * get all options that may potentially exist on the struct and its children
+ * (e.g. when constructing documentation). In that case you should call
+ * av_opt_child_class_next() recursively on the parent struct's AVClass. The
+ * second case is when you have an already initialized struct with all its
+ * children and you want to get all options that can be actually written or read
+ * from it. In that case you should call av_opt_child_next() recursively (and
+ * av_opt_next() on each result).
+ *
+ * @subsection avoptions_use_get_set Reading and writing AVOptions
+ * When setting options, you often have a string read directly from the
+ * user. In such a case, simply passing it to av_opt_set() is enough. For
+ * non-string type options, av_opt_set() will parse the string according to the
+ * option type.
+ *
+ * Similarly av_opt_get() will read any option type and convert it to a string
+ * which will be returned. Do not forget that the string is allocated, so you
+ * have to free it with av_free().
+ *
+ * In some cases it may be more convenient to put all options into an
+ * AVDictionary and call av_opt_set_dict() on it. A specific case of this
+ * are the format/codec open functions in lavf/lavc which take a dictionary
+ * filled with option as a parameter. This allows to set some options
+ * that cannot be set otherwise, since e.g. the input file format is not known
+ * before the file is actually opened.
+ */
+
+enum AVOptionType{
+ AV_OPT_TYPE_FLAGS,
+ AV_OPT_TYPE_INT,
+ AV_OPT_TYPE_INT64,
+ AV_OPT_TYPE_DOUBLE,
+ AV_OPT_TYPE_FLOAT,
+ AV_OPT_TYPE_STRING,
+ AV_OPT_TYPE_RATIONAL,
+ AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length
+ AV_OPT_TYPE_CONST = 128,
+};
+
+/**
+ * AVOption
+ */
+typedef struct AVOption {
+ const char *name;
+
+ /**
+ * short English help text
+ * @todo What about other languages?
+ */
+ const char *help;
+
+ /**
+ * The offset relative to the context structure where the option
+ * value is stored. It should be 0 for named constants.
+ */
+ int offset;
+ enum AVOptionType type;
+
+ /**
+ * the default value for scalar options
+ */
+ union {
+ int64_t i64;
+ double dbl;
+ const char *str;
+ /* TODO those are unused now */
+ AVRational q;
+ } default_val;
+ double min; ///< minimum valid value for the option
+ double max; ///< maximum valid value for the option
+
+ int flags;
+#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding
+#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding
+#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ...
+#define AV_OPT_FLAG_AUDIO_PARAM 8
+#define AV_OPT_FLAG_VIDEO_PARAM 16
+#define AV_OPT_FLAG_SUBTITLE_PARAM 32
+//FIXME think about enc-audio, ... style flags
+
+ /**
+ * The logical unit to which the option belongs. Non-constant
+ * options and corresponding named constants share the same
+ * unit. May be NULL.
+ */
+ const char *unit;
+} AVOption;
+
+/**
+ * Show the obj options.
+ *
+ * @param req_flags requested flags for the options to show. Show only the
+ * options for which it is opt->flags & req_flags.
+ * @param rej_flags rejected flags for the options to show. Show only the
+ * options for which it is !(opt->flags & req_flags).
+ * @param av_log_obj log context to use for showing the options
+ */
+int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
+
+/**
+ * Set the values of all AVOption fields to their default values.
+ *
+ * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
+ */
+void av_opt_set_defaults(void *s);
+
+/**
+ * Parse the key/value pairs list in opts. For each key/value pair
+ * found, stores the value in the field in ctx that is named like the
+ * key. ctx must be an AVClass context, storing is done using
+ * AVOptions.
+ *
+ * @param key_val_sep a 0-terminated list of characters used to
+ * separate key from value
+ * @param pairs_sep a 0-terminated list of characters used to separate
+ * two pairs from each other
+ * @return the number of successfully set key/value pairs, or a negative
+ * value corresponding to an AVERROR code in case of error:
+ * AVERROR(EINVAL) if opts cannot be parsed,
+ * the error code issued by av_set_string3() if a key/value pair
+ * cannot be set
+ */
+int av_set_options_string(void *ctx, const char *opts,
+ const char *key_val_sep, const char *pairs_sep);
+
+/**
+ * Free all string and binary options in obj.
+ */
+void av_opt_free(void *obj);
+
+/**
+ * Check whether a particular flag is set in a flags field.
+ *
+ * @param field_name the name of the flag field option
+ * @param flag_name the name of the flag to check
+ * @return non-zero if the flag is set, zero if the flag isn't set,
+ * isn't of the right type, or the flags field doesn't exist.
+ */
+int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
+
+/*
+ * Set all the options from a given dictionary on an object.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass
+ * @param options options to process. This dictionary will be freed and replaced
+ * by a new one containing all options not found in obj.
+ * Of course this new dictionary needs to be freed by caller
+ * with av_dict_free().
+ *
+ * @return 0 on success, a negative AVERROR if some option was found in obj,
+ * but could not be set.
+ *
+ * @see av_dict_copy()
+ */
+int av_opt_set_dict(void *obj, struct AVDictionary **options);
+
+/**
+ * @defgroup opt_eval_funcs Evaluating option strings
+ * @{
+ * This group of functions can be used to evaluate option strings
+ * and get numbers out of them. They do the same thing as av_opt_set(),
+ * except the result is written into the caller-supplied pointer.
+ *
+ * @param obj a struct whose first element is a pointer to AVClass.
+ * @param o an option for which the string is to be evaluated.
+ * @param val string to be evaluated.
+ * @param *_out value of the string will be written here.
+ *
+ * @return 0 on success, a negative number on failure.
+ */
+int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out);
+int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out);
+int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out);
+int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out);
+int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out);
+int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out);
+/**
+ * @}
+ */
+
+#define AV_OPT_SEARCH_CHILDREN 0x0001 /**< Search in possible children of the
+ given object first. */
+/**
+ * The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
+ * instead of a required pointer to a struct containing AVClass. This is
+ * useful for searching for options without needing to allocate the corresponding
+ * object.
+ */
+#define AV_OPT_SEARCH_FAKE_OBJ 0x0002
+
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ * pointer to an AVClass.
+ * Alternatively a double pointer to an AVClass, if
+ * AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ * it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ * was found.
+ *
+ * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable
+ * directly with av_set_string3(). Use special calls which take an options
+ * AVDictionary (e.g. avformat_open_input()) to set options found with this
+ * flag.
+ */
+const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
+ int opt_flags, int search_flags);
+
+/**
+ * Look for an option in an object. Consider only options which
+ * have all the specified flags set.
+ *
+ * @param[in] obj A pointer to a struct whose first element is a
+ * pointer to an AVClass.
+ * Alternatively a double pointer to an AVClass, if
+ * AV_OPT_SEARCH_FAKE_OBJ search flag is set.
+ * @param[in] name The name of the option to look for.
+ * @param[in] unit When searching for named constants, name of the unit
+ * it belongs to.
+ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
+ * @param search_flags A combination of AV_OPT_SEARCH_*.
+ * @param[out] target_obj if non-NULL, an object to which the option belongs will be
+ * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present
+ * in search_flags. This parameter is ignored if search_flags contain
+ * AV_OPT_SEARCH_FAKE_OBJ.
+ *
+ * @return A pointer to the option found, or NULL if no option
+ * was found.
+ */
+const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
+ int opt_flags, int search_flags, void **target_obj);
+
+/**
+ * Iterate over all AVOptions belonging to obj.
+ *
+ * @param obj an AVOptions-enabled struct or a double pointer to an
+ * AVClass describing it.
+ * @param prev result of the previous call to av_opt_next() on this object
+ * or NULL
+ * @return next AVOption or NULL
+ */
+const AVOption *av_opt_next(void *obj, const AVOption *prev);
+
+/**
+ * Iterate over AVOptions-enabled children of obj.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return next AVOptions-enabled child or NULL
+ */
+void *av_opt_child_next(void *obj, void *prev);
+
+/**
+ * Iterate over potential AVOptions-enabled children of parent.
+ *
+ * @param prev result of a previous call to this function or NULL
+ * @return AVClass corresponding to next potential child or NULL
+ */
+const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *prev);
+
+/**
+ * @defgroup opt_set_funcs Option setting functions
+ * @{
+ * Those functions set the field of obj with the given name to value.
+ *
+ * @param[in] obj A struct whose first element is a pointer to an AVClass.
+ * @param[in] name the name of the field to set
+ * @param[in] val The value to set. In case of av_opt_set() if the field is not
+ * of a string type, then the given string is parsed.
+ * SI postfixes and some named scalars are supported.
+ * If the field is of a numeric type, it has to be a numeric or named
+ * scalar. Behavior with more than one scalar and +- infix operators
+ * is undefined.
+ * If the field is of a flags type, it has to be a sequence of numeric
+ * scalars or named flags separated by '+' or '-'. Prefixing a flag
+ * with '+' causes it to be set without affecting the other flags;
+ * similarly, '-' unsets a flag.
+ * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be set on a child of obj.
+ *
+ * @return 0 if the value has been set, or an AVERROR code in case of
+ * error:
+ * AVERROR_OPTION_NOT_FOUND if no matching option exists
+ * AVERROR(ERANGE) if the value is out of range
+ * AVERROR(EINVAL) if the value is not valid
+ */
+int av_opt_set (void *obj, const char *name, const char *val, int search_flags);
+int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags);
+int av_opt_set_double(void *obj, const char *name, double val, int search_flags);
+int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags);
+int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags);
+/**
+ * @}
+ */
+
+/**
+ * @defgroup opt_get_funcs Option getting functions
+ * @{
+ * Those functions get a value of the option with the given name from an object.
+ *
+ * @param[in] obj a struct whose first element is a pointer to an AVClass.
+ * @param[in] name name of the option to get.
+ * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
+ * is passed here, then the option may be found in a child of obj.
+ * @param[out] out_val value of the option will be written here
+ * @return 0 on success, a negative error code otherwise
+ */
+/**
+ * @note the returned string will av_malloc()ed and must be av_free()ed by the caller
+ */
+int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val);
+int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val);
+int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val);
+int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val);
+/**
+ * @}
+ * @}
+ */
+
+#endif /* AVUTIL_OPT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/parseutils.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/parseutils.h
new file mode 100644
index 000000000..0844abb2f
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/parseutils.h
@@ -0,0 +1,124 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PARSEUTILS_H
+#define AVUTIL_PARSEUTILS_H
+
+#include <time.h>
+
+#include "rational.h"
+
+/**
+ * @file
+ * misc parsing utilities
+ */
+
+/**
+ * Parse str and put in width_ptr and height_ptr the detected values.
+ *
+ * @param[in,out] width_ptr pointer to the variable which will contain the detected
+ * width value
+ * @param[in,out] height_ptr pointer to the variable which will contain the detected
+ * height value
+ * @param[in] str the string to parse: it has to be a string in the format
+ * width x height or a valid video size abbreviation.
+ * @return >= 0 on success, a negative error code otherwise
+ */
+int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str);
+
+/**
+ * Parse str and store the detected values in *rate.
+ *
+ * @param[in,out] rate pointer to the AVRational which will contain the detected
+ * frame rate
+ * @param[in] str the string to parse: it has to be a string in the format
+ * rate_num / rate_den, a float number or a valid video rate abbreviation
+ * @return >= 0 on success, a negative error code otherwise
+ */
+int av_parse_video_rate(AVRational *rate, const char *str);
+
+/**
+ * Put the RGBA values that correspond to color_string in rgba_color.
+ *
+ * @param color_string a string specifying a color. It can be the name of
+ * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence,
+ * possibly followed by "@" and a string representing the alpha
+ * component.
+ * The alpha component may be a string composed by "0x" followed by an
+ * hexadecimal number or a decimal number between 0.0 and 1.0, which
+ * represents the opacity value (0x00/0.0 means completely transparent,
+ * 0xff/1.0 completely opaque).
+ * If the alpha component is not specified then 0xff is assumed.
+ * The string "random" will result in a random color.
+ * @param slen length of the initial part of color_string containing the
+ * color. It can be set to -1 if color_string is a null terminated string
+ * containing nothing else than the color.
+ * @return >= 0 in case of success, a negative value in case of
+ * failure (for example if color_string cannot be parsed).
+ */
+int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
+ void *log_ctx);
+
+/**
+ * Parse timestr and return in *time a corresponding number of
+ * microseconds.
+ *
+ * @param timeval puts here the number of microseconds corresponding
+ * to the string in timestr. If the string represents a duration, it
+ * is the number of microseconds contained in the time interval. If
+ * the string is a date, is the number of microseconds since 1st of
+ * January, 1970 up to the time of the parsed date. If timestr cannot
+ * be successfully parsed, set *time to INT64_MIN.
+
+ * @param timestr a string representing a date or a duration.
+ * - If a date the syntax is:
+ * @code
+ * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z]
+ * now
+ * @endcode
+ * If the value is "now" it takes the current time.
+ * Time is local time unless Z is appended, in which case it is
+ * interpreted as UTC.
+ * If the year-month-day part is not specified it takes the current
+ * year-month-day.
+ * - If a duration the syntax is:
+ * @code
+ * [-]HH[:MM[:SS[.m...]]]
+ * [-]S+[.m...]
+ * @endcode
+ * @param duration flag which tells how to interpret timestr, if not
+ * zero timestr is interpreted as a duration, otherwise as a date
+ * @return 0 in case of success, a negative value corresponding to an
+ * AVERROR code otherwise
+ */
+int av_parse_time(int64_t *timeval, const char *timestr, int duration);
+
+/**
+ * Attempt to find a specific tag in a URL.
+ *
+ * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
+ * Return 1 if found.
+ */
+int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);
+
+/**
+ * Convert the decomposed UTC time in tm to a time_t value.
+ */
+time_t av_timegm(struct tm *tm);
+
+#endif /* AVUTIL_PARSEUTILS_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/pixdesc.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/pixdesc.h
new file mode 100644
index 000000000..e5a16f418
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/pixdesc.h
@@ -0,0 +1,276 @@
+/*
+ * pixel format descriptor
+ * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXDESC_H
+#define AVUTIL_PIXDESC_H
+
+#include <inttypes.h>
+
+#include "attributes.h"
+#include "pixfmt.h"
+
+typedef struct AVComponentDescriptor{
+ uint16_t plane :2; ///< which of the 4 planes contains the component
+
+ /**
+ * Number of elements between 2 horizontally consecutive pixels minus 1.
+ * Elements are bits for bitstream formats, bytes otherwise.
+ */
+ uint16_t step_minus1 :3;
+
+ /**
+ * Number of elements before the component of the first pixel plus 1.
+ * Elements are bits for bitstream formats, bytes otherwise.
+ */
+ uint16_t offset_plus1 :3;
+ uint16_t shift :3; ///< number of least significant bits that must be shifted away to get the value
+ uint16_t depth_minus1 :4; ///< number of bits in the component minus 1
+}AVComponentDescriptor;
+
+/**
+ * Descriptor that unambiguously describes how the bits of a pixel are
+ * stored in the up to 4 data planes of an image. It also stores the
+ * subsampling factors and number of components.
+ *
+ * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV
+ * and all the YUV variants) AVPixFmtDescriptor just stores how values
+ * are stored not what these values represent.
+ */
+typedef struct AVPixFmtDescriptor{
+ const char *name;
+ uint8_t nb_components; ///< The number of components each pixel has, (1-4)
+
+ /**
+ * Amount to shift the luma width right to find the chroma width.
+ * For YV12 this is 1 for example.
+ * chroma_width = -((-luma_width) >> log2_chroma_w)
+ * The note above is needed to ensure rounding up.
+ * This value only refers to the chroma components.
+ */
+ uint8_t log2_chroma_w; ///< chroma_width = -((-luma_width )>>log2_chroma_w)
+
+ /**
+ * Amount to shift the luma height right to find the chroma height.
+ * For YV12 this is 1 for example.
+ * chroma_height= -((-luma_height) >> log2_chroma_h)
+ * The note above is needed to ensure rounding up.
+ * This value only refers to the chroma components.
+ */
+ uint8_t log2_chroma_h;
+ uint8_t flags;
+
+ /**
+ * Parameters that describe how pixels are packed. If the format
+ * has chroma components, they must be stored in comp[1] and
+ * comp[2].
+ */
+ AVComponentDescriptor comp[4];
+}AVPixFmtDescriptor;
+
+/**
+ * Pixel format is big-endian.
+ */
+#define AV_PIX_FMT_FLAG_BE (1 << 0)
+/**
+ * Pixel format has a palette in data[1], values are indexes in this palette.
+ */
+#define AV_PIX_FMT_FLAG_PAL (1 << 1)
+/**
+ * All values of a component are bit-wise packed end to end.
+ */
+#define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2)
+/**
+ * Pixel format is an HW accelerated format.
+ */
+#define AV_PIX_FMT_FLAG_HWACCEL (1 << 3)
+/**
+ * At least one pixel component is not in the first data plane.
+ */
+#define AV_PIX_FMT_FLAG_PLANAR (1 << 4)
+/**
+ * The pixel format contains RGB-like data (as opposed to YUV/grayscale).
+ */
+#define AV_PIX_FMT_FLAG_RGB (1 << 5)
+/**
+ * The pixel format is "pseudo-paletted". This means that Libav treats it as
+ * paletted internally, but the palette is generated by the decoder and is not
+ * stored in the file.
+ */
+#define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6)
+/**
+ * The pixel format has an alpha channel.
+ */
+#define AV_PIX_FMT_FLAG_ALPHA (1 << 7)
+
+#if FF_API_PIX_FMT
+/**
+ * @deprecated use the AV_PIX_FMT_FLAG_* flags
+ */
+#define PIX_FMT_BE AV_PIX_FMT_FLAG_BE
+#define PIX_FMT_PAL AV_PIX_FMT_FLAG_PAL
+#define PIX_FMT_BITSTREAM AV_PIX_FMT_FLAG_BITSTREAM
+#define PIX_FMT_HWACCEL AV_PIX_FMT_FLAG_HWACCEL
+#define PIX_FMT_PLANAR AV_PIX_FMT_FLAG_PLANAR
+#define PIX_FMT_RGB AV_PIX_FMT_FLAG_RGB
+#define PIX_FMT_PSEUDOPAL AV_PIX_FMT_FLAG_PSEUDOPAL
+#define PIX_FMT_ALPHA AV_PIX_FMT_FLAG_ALPHA
+#endif
+
+#if FF_API_PIX_FMT_DESC
+/**
+ * The array of all the pixel format descriptors.
+ */
+extern attribute_deprecated const AVPixFmtDescriptor av_pix_fmt_descriptors[];
+#endif
+
+/**
+ * Read a line from an image, and write the values of the
+ * pixel format component c to dst.
+ *
+ * @param data the array containing the pointers to the planes of the image
+ * @param linesize the array containing the linesizes of the image
+ * @param desc the pixel format descriptor for the image
+ * @param x the horizontal coordinate of the first pixel to read
+ * @param y the vertical coordinate of the first pixel to read
+ * @param w the width of the line to read, that is the number of
+ * values to write to dst
+ * @param read_pal_component if not zero and the format is a paletted
+ * format writes the values corresponding to the palette
+ * component c in data[1] to dst, rather than the palette indexes in
+ * data[0]. The behavior is undefined if the format is not paletted.
+ */
+void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
+ const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component);
+
+/**
+ * Write the values from src to the pixel format component c of an
+ * image line.
+ *
+ * @param src array containing the values to write
+ * @param data the array containing the pointers to the planes of the
+ * image to write into. It is supposed to be zeroed.
+ * @param linesize the array containing the linesizes of the image
+ * @param desc the pixel format descriptor for the image
+ * @param x the horizontal coordinate of the first pixel to write
+ * @param y the vertical coordinate of the first pixel to write
+ * @param w the width of the line to write, that is the number of
+ * values to write to the image line
+ */
+void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
+ const AVPixFmtDescriptor *desc, int x, int y, int c, int w);
+
+/**
+ * Return the pixel format corresponding to name.
+ *
+ * If there is no pixel format with name name, then looks for a
+ * pixel format with the name corresponding to the native endian
+ * format of name.
+ * For example in a little-endian system, first looks for "gray16",
+ * then for "gray16le".
+ *
+ * Finally if no pixel format has been found, returns PIX_FMT_NONE.
+ */
+enum AVPixelFormat av_get_pix_fmt(const char *name);
+
+/**
+ * Return the short name for a pixel format, NULL in case pix_fmt is
+ * unknown.
+ *
+ * @see av_get_pix_fmt(), av_get_pix_fmt_string()
+ */
+const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt);
+
+/**
+ * Print in buf the string corresponding to the pixel format with
+ * number pix_fmt, or an header if pix_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param pix_fmt the number of the pixel format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ */
+char *av_get_pix_fmt_string (char *buf, int buf_size, enum AVPixelFormat pix_fmt);
+
+/**
+ * Return the number of bits per pixel used by the pixel format
+ * described by pixdesc. Note that this is not the same as the number
+ * of bits per sample.
+ *
+ * The returned number of bits refers to the number of bits actually
+ * used for storing the pixel information, that is padding bits are
+ * not counted.
+ */
+int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);
+
+/**
+ * @return a pixel format descriptor for provided pixel format or NULL if
+ * this pixel format is unknown.
+ */
+const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);
+
+/**
+ * Iterate over all pixel format descriptors known to libavutil.
+ *
+ * @param prev previous descriptor. NULL to get the first descriptor.
+ *
+ * @return next descriptor or NULL after the last descriptor
+ */
+const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev);
+
+/**
+ * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc
+ * is not a valid pointer to a pixel format descriptor.
+ */
+enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc);
+
+/**
+ * Utility function to access log2_chroma_w log2_chroma_h from
+ * the pixel format AVPixFmtDescriptor.
+ *
+ * @param[in] pix_fmt the pixel format
+ * @param[out] h_shift store log2_chroma_h
+ * @param[out] v_shift store log2_chroma_w
+ *
+ * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format
+ */
+int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
+ int *h_shift, int *v_shift);
+
+/**
+ * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a
+ * valid pixel format.
+ */
+int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt);
+
+
+/**
+ * Utility function to swap the endianness of a pixel format.
+ *
+ * @param[in] pix_fmt the pixel format
+ *
+ * @return pixel format with swapped endianness if it exists,
+ * otherwise AV_PIX_FMT_NONE
+ */
+enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt);
+
+
+#endif /* AVUTIL_PIXDESC_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/pixfmt.h
new file mode 100644
index 000000000..0d6e0a300
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/pixfmt.h
@@ -0,0 +1,283 @@
+/*
+ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_PIXFMT_H
+#define AVUTIL_PIXFMT_H
+
+/**
+ * @file
+ * pixel format definitions
+ *
+ */
+
+#include "libavutil/avconfig.h"
+#include "version.h"
+
+/**
+ * Pixel format.
+ *
+ * @note
+ * PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
+ * color is put together as:
+ * (A << 24) | (R << 16) | (G << 8) | B
+ * This is stored as BGRA on little-endian CPU architectures and ARGB on
+ * big-endian CPUs.
+ *
+ * @par
+ * When the pixel format is palettized RGB (PIX_FMT_PAL8), the palettized
+ * image data is stored in AVFrame.data[0]. The palette is transported in
+ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
+ * formatted the same as in PIX_FMT_RGB32 described above (i.e., it is
+ * also endian-specific). Note also that the individual RGB palette
+ * components stored in AVFrame.data[1] should be in the range 0..255.
+ * This is important as many custom PAL8 video codecs that were designed
+ * to run on the IBM VGA graphics adapter use 6-bit palette components.
+ *
+ * @par
+ * For all the 8bit per pixel formats, an RGB32 palette is in data[1] like
+ * for pal8. This palette is filled in automatically by the function
+ * allocating the picture.
+ *
+ * @note
+ * Make sure that all newly added big-endian formats have pix_fmt & 1 == 1
+ * and that all newly added little-endian formats have pix_fmt & 1 == 0.
+ * This allows simpler detection of big vs little-endian.
+ */
+enum AVPixelFormat {
+ AV_PIX_FMT_NONE = -1,
+ AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
+ AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
+ AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
+ AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
+ AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
+ AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
+ AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
+ AV_PIX_FMT_GRAY8, ///< Y , 8bpp
+ AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
+ AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
+ AV_PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette
+ AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range
+ AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range
+ AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range
+#if FF_API_XVMC
+ AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing
+ AV_PIX_FMT_XVMC_MPEG2_IDCT,
+#endif /* FF_API_XVMC */
+ AV_PIX_FMT_UYVY422, ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
+ AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
+ AV_PIX_FMT_BGR8, ///< packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
+ AV_PIX_FMT_BGR4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
+ AV_PIX_FMT_RGB8, ///< packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
+ AV_PIX_FMT_RGB4, ///< packed RGB 1:2:1 bitstream, 4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
+ AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
+ AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
+
+ AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
+ AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
+ AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
+ AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
+
+ AV_PIX_FMT_GRAY16BE, ///< Y , 16bpp, big-endian
+ AV_PIX_FMT_GRAY16LE, ///< Y , 16bpp, little-endian
+ AV_PIX_FMT_YUV440P, ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
+ AV_PIX_FMT_YUVJ440P, ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range
+ AV_PIX_FMT_YUVA420P, ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
+#if FF_API_VDPAU
+ AV_PIX_FMT_VDPAU_H264,///< H.264 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_MPEG1,///< MPEG-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_MPEG2,///< MPEG-2 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_WMV3,///< WMV3 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+ AV_PIX_FMT_VDPAU_VC1, ///< VC-1 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+#endif
+ AV_PIX_FMT_RGB48BE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
+ AV_PIX_FMT_RGB48LE, ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
+
+ AV_PIX_FMT_RGB565BE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
+ AV_PIX_FMT_RGB565LE, ///< packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
+ AV_PIX_FMT_RGB555BE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), big-endian, most significant bit to 0
+ AV_PIX_FMT_RGB555LE, ///< packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), little-endian, most significant bit to 0
+
+ AV_PIX_FMT_BGR565BE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
+ AV_PIX_FMT_BGR565LE, ///< packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
+ AV_PIX_FMT_BGR555BE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), big-endian, most significant bit to 1
+ AV_PIX_FMT_BGR555LE, ///< packed BGR 5:5:5, 16bpp, (msb)1A 5B 5G 5R(lsb), little-endian, most significant bit to 1
+
+ AV_PIX_FMT_VAAPI_MOCO, ///< HW acceleration through VA API at motion compensation entry-point, Picture.data[3] contains a vaapi_render_state struct which contains macroblocks as well as various fields extracted from headers
+ AV_PIX_FMT_VAAPI_IDCT, ///< HW acceleration through VA API at IDCT entry-point, Picture.data[3] contains a vaapi_render_state struct which contains fields extracted from headers
+ AV_PIX_FMT_VAAPI_VLD, ///< HW decoding through VA API, Picture.data[3] contains a vaapi_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+
+ AV_PIX_FMT_YUV420P16LE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P16BE, ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV422P16LE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P16BE, ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P16LE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+#if FF_API_VDPAU
+ AV_PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers
+#endif
+ AV_PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
+
+ AV_PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0
+ AV_PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0
+ AV_PIX_FMT_BGR444LE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), little-endian, most significant bits to 1
+ AV_PIX_FMT_BGR444BE, ///< packed BGR 4:4:4, 16bpp, (msb)4A 4B 4G 4R(lsb), big-endian, most significant bits to 1
+ AV_PIX_FMT_Y400A, ///< 8bit gray, 8bit alpha
+ AV_PIX_FMT_BGR48BE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
+ AV_PIX_FMT_BGR48LE, ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
+ AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
+ AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
+ AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
+ AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
+ AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_VDA_VLD, ///< hardware decoding through VDA
+ AV_PIX_FMT_GBRP, ///< planar GBR 4:4:4 24bpp
+ AV_PIX_FMT_GBRP9BE, ///< planar GBR 4:4:4 27bpp, big-endian
+ AV_PIX_FMT_GBRP9LE, ///< planar GBR 4:4:4 27bpp, little-endian
+ AV_PIX_FMT_GBRP10BE, ///< planar GBR 4:4:4 30bpp, big-endian
+ AV_PIX_FMT_GBRP10LE, ///< planar GBR 4:4:4 30bpp, little-endian
+ AV_PIX_FMT_GBRP16BE, ///< planar GBR 4:4:4 48bpp, big-endian
+ AV_PIX_FMT_GBRP16LE, ///< planar GBR 4:4:4 48bpp, little-endian
+ AV_PIX_FMT_YUVA422P, ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
+ AV_PIX_FMT_YUVA444P, ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
+ AV_PIX_FMT_YUVA420P9BE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA420P9LE, ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA422P9BE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA422P9LE, ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA444P9BE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
+ AV_PIX_FMT_YUVA444P9LE, ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
+ AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
+ AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
+ AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
+ AV_PIX_FMT_VDPAU, ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface
+ AV_PIX_FMT_XYZ12LE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0
+ AV_PIX_FMT_XYZ12BE, ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0
+ AV_PIX_FMT_NV16, ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
+ AV_PIX_FMT_NV20LE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
+ AV_PIX_FMT_NV20BE, ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
+ AV_PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
+
+#if FF_API_PIX_FMT
+#include "old_pix_fmts.h"
+#endif
+};
+
+#if AV_HAVE_BIGENDIAN
+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be
+#else
+# define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le
+#endif
+
+#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA)
+#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR)
+#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA)
+#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB)
+
+#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE)
+#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE)
+#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE)
+#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE)
+#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE)
+#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE)
+#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE)
+#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE)
+#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE)
+
+#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE)
+#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE)
+#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE)
+#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
+#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
+#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE)
+#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
+#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
+#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
+
+#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE , GBRP9LE)
+#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE)
+#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE)
+
+#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE)
+#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE)
+#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE)
+#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE)
+#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE)
+#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE)
+#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE)
+#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE)
+#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE)
+
+#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE)
+#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE)
+
+#if FF_API_PIX_FMT
+#define PixelFormat AVPixelFormat
+
+#define PIX_FMT_NE(be, le) AV_PIX_FMT_NE(be, le)
+
+#define PIX_FMT_RGB32 AV_PIX_FMT_RGB32
+#define PIX_FMT_RGB32_1 AV_PIX_FMT_RGB32_1
+#define PIX_FMT_BGR32 AV_PIX_FMT_BGR32
+#define PIX_FMT_BGR32_1 AV_PIX_FMT_BGR32_1
+
+#define PIX_FMT_GRAY16 AV_PIX_FMT_GRAY16
+#define PIX_FMT_RGB48 AV_PIX_FMT_RGB48
+#define PIX_FMT_RGB565 AV_PIX_FMT_RGB565
+#define PIX_FMT_RGB555 AV_PIX_FMT_RGB555
+#define PIX_FMT_RGB444 AV_PIX_FMT_RGB444
+#define PIX_FMT_BGR48 AV_PIX_FMT_BGR48
+#define PIX_FMT_BGR565 AV_PIX_FMT_BGR565
+#define PIX_FMT_BGR555 AV_PIX_FMT_BGR555
+#define PIX_FMT_BGR444 AV_PIX_FMT_BGR444
+
+#define PIX_FMT_YUV420P9 AV_PIX_FMT_YUV420P9
+#define PIX_FMT_YUV422P9 AV_PIX_FMT_YUV422P9
+#define PIX_FMT_YUV444P9 AV_PIX_FMT_YUV444P9
+#define PIX_FMT_YUV420P10 AV_PIX_FMT_YUV420P10
+#define PIX_FMT_YUV422P10 AV_PIX_FMT_YUV422P10
+#define PIX_FMT_YUV444P10 AV_PIX_FMT_YUV444P10
+#define PIX_FMT_YUV420P16 AV_PIX_FMT_YUV420P16
+#define PIX_FMT_YUV422P16 AV_PIX_FMT_YUV422P16
+#define PIX_FMT_YUV444P16 AV_PIX_FMT_YUV444P16
+
+#define PIX_FMT_GBRP9 AV_PIX_FMT_GBRP9
+#define PIX_FMT_GBRP10 AV_PIX_FMT_GBRP10
+#define PIX_FMT_GBRP16 AV_PIX_FMT_GBRP16
+#endif
+
+#endif /* AVUTIL_PIXFMT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/random_seed.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/random_seed.h
new file mode 100644
index 000000000..b1fad13d0
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/random_seed.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudurier@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_RANDOM_SEED_H
+#define AVUTIL_RANDOM_SEED_H
+
+#include <stdint.h>
+/**
+ * @addtogroup lavu_crypto
+ * @{
+ */
+
+/**
+ * Get random data.
+ *
+ * This function can be called repeatedly to generate more random bits
+ * as needed. It is generally quite slow, and usually used to seed a
+ * PRNG. As it uses /dev/urandom and /dev/random, the quality of the
+ * returned random data depends on the platform.
+ */
+uint32_t av_get_random_seed(void);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RANDOM_SEED_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/rational.h
new file mode 100644
index 000000000..5d7dab7fd
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/rational.h
@@ -0,0 +1,155 @@
+/*
+ * rational numbers
+ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * rational numbers
+ * @author Michael Niedermayer <michaelni@gmx.at>
+ */
+
+#ifndef AVUTIL_RATIONAL_H
+#define AVUTIL_RATIONAL_H
+
+#include <stdint.h>
+#include <limits.h>
+#include "attributes.h"
+
+/**
+ * @addtogroup lavu_math
+ * @{
+ */
+
+/**
+ * rational number numerator/denominator
+ */
+typedef struct AVRational{
+ int num; ///< numerator
+ int den; ///< denominator
+} AVRational;
+
+/**
+ * Compare two rationals.
+ * @param a first rational
+ * @param b second rational
+ * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
+ * values is of the form 0/0
+ */
+static inline int av_cmp_q(AVRational a, AVRational b){
+ const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
+
+ if(tmp) return ((tmp ^ a.den ^ b.den)>>63)|1;
+ else if(b.den && a.den) return 0;
+ else if(a.num && b.num) return (a.num>>31) - (b.num>>31);
+ else return INT_MIN;
+}
+
+/**
+ * Convert rational to double.
+ * @param a rational to convert
+ * @return (double) a
+ */
+static inline double av_q2d(AVRational a){
+ return a.num / (double) a.den;
+}
+
+/**
+ * Reduce a fraction.
+ * This is useful for framerate calculations.
+ * @param dst_num destination numerator
+ * @param dst_den destination denominator
+ * @param num source numerator
+ * @param den source denominator
+ * @param max the maximum allowed for dst_num & dst_den
+ * @return 1 if exact, 0 otherwise
+ */
+int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);
+
+/**
+ * Multiply two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b*c
+ */
+AVRational av_mul_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Divide one rational by another.
+ * @param b first rational
+ * @param c second rational
+ * @return b/c
+ */
+AVRational av_div_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Add two rationals.
+ * @param b first rational
+ * @param c second rational
+ * @return b+c
+ */
+AVRational av_add_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Subtract one rational from another.
+ * @param b first rational
+ * @param c second rational
+ * @return b-c
+ */
+AVRational av_sub_q(AVRational b, AVRational c) av_const;
+
+/**
+ * Invert a rational.
+ * @param q value
+ * @return 1 / q
+ */
+static av_always_inline AVRational av_inv_q(AVRational q)
+{
+ AVRational r = { q.den, q.num };
+ return r;
+}
+
+/**
+ * Convert a double precision floating point number to a rational.
+ * inf is expressed as {1,0} or {-1,0} depending on the sign.
+ *
+ * @param d double to convert
+ * @param max the maximum allowed numerator and denominator
+ * @return (AVRational) d
+ */
+AVRational av_d2q(double d, int max) av_const;
+
+/**
+ * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
+ * than q1, 0 if they have the same distance.
+ */
+int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
+
+/**
+ * Find the nearest value in q_list to q.
+ * @param q_list an array of rationals terminated by {0, 0}
+ * @return the index of the nearest value found in the array
+ */
+int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_RATIONAL_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/samplefmt.h
new file mode 100644
index 000000000..33cbdedf5
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/samplefmt.h
@@ -0,0 +1,220 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SAMPLEFMT_H
+#define AVUTIL_SAMPLEFMT_H
+
+#include <stdint.h>
+
+#include "avutil.h"
+#include "attributes.h"
+
+/**
+ * Audio Sample Formats
+ *
+ * @par
+ * The data described by the sample format is always in native-endian order.
+ * Sample values can be expressed by native C types, hence the lack of a signed
+ * 24-bit sample format even though it is a common raw audio data format.
+ *
+ * @par
+ * The floating-point formats are based on full volume being in the range
+ * [-1.0, 1.0]. Any values outside this range are beyond full volume level.
+ *
+ * @par
+ * The data layout as used in av_samples_fill_arrays() and elsewhere in Libav
+ * (such as AVFrame in libavcodec) is as follows:
+ *
+ * For planar sample formats, each audio channel is in a separate data plane,
+ * and linesize is the buffer size, in bytes, for a single plane. All data
+ * planes must be the same size. For packed sample formats, only the first data
+ * plane is used, and samples for each channel are interleaved. In this case,
+ * linesize is the buffer size, in bytes, for the 1 plane.
+ */
+enum AVSampleFormat {
+ AV_SAMPLE_FMT_NONE = -1,
+ AV_SAMPLE_FMT_U8, ///< unsigned 8 bits
+ AV_SAMPLE_FMT_S16, ///< signed 16 bits
+ AV_SAMPLE_FMT_S32, ///< signed 32 bits
+ AV_SAMPLE_FMT_FLT, ///< float
+ AV_SAMPLE_FMT_DBL, ///< double
+
+ AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar
+ AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar
+ AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar
+ AV_SAMPLE_FMT_FLTP, ///< float, planar
+ AV_SAMPLE_FMT_DBLP, ///< double, planar
+
+ AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically
+};
+
+/**
+ * Return the name of sample_fmt, or NULL if sample_fmt is not
+ * recognized.
+ */
+const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);
+
+/**
+ * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE
+ * on error.
+ */
+enum AVSampleFormat av_get_sample_fmt(const char *name);
+
+/**
+ * Get the packed alternative form of the given sample format.
+ *
+ * If the passed sample_fmt is already in packed format, the format returned is
+ * the same as the input.
+ *
+ * @return the packed alternative form of the given sample format or
+ AV_SAMPLE_FMT_NONE on error.
+ */
+enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the planar alternative form of the given sample format.
+ *
+ * If the passed sample_fmt is already in planar format, the format returned is
+ * the same as the input.
+ *
+ * @return the planar alternative form of the given sample format or
+ AV_SAMPLE_FMT_NONE on error.
+ */
+enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt);
+
+/**
+ * Generate a string corresponding to the sample format with
+ * sample_fmt, or a header if sample_fmt is negative.
+ *
+ * @param buf the buffer where to write the string
+ * @param buf_size the size of buf
+ * @param sample_fmt the number of the sample format to print the
+ * corresponding info string, or a negative value to print the
+ * corresponding header.
+ * @return the pointer to the filled buffer or NULL if sample_fmt is
+ * unknown or in case of other errors
+ */
+char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt);
+
+/**
+ * Return number of bytes per sample.
+ *
+ * @param sample_fmt the sample format
+ * @return number of bytes per sample or zero if unknown for the given
+ * sample format
+ */
+int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
+
+/**
+ * Check if the sample format is planar.
+ *
+ * @param sample_fmt the sample format to inspect
+ * @return 1 if the sample format is planar, 0 if it is interleaved
+ */
+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
+
+/**
+ * Get the required buffer size for the given audio parameters.
+ *
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return required buffer size, or negative error code on failure
+ */
+int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Fill channel data pointers and linesize for samples with sample
+ * format sample_fmt.
+ *
+ * The pointers array is filled with the pointers to the samples data:
+ * for planar, set the start point of each channel's data within the buffer,
+ * for packed, set the start point of the entire buffer only.
+ *
+ * The linesize array is filled with the aligned size of each channel's data
+ * buffer for planar layout, or the aligned size of the buffer for all channels
+ * for packed layout.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize calculated linesize, may be NULL
+ * @param buf the pointer to a buffer containing the samples
+ * @param nb_channels the number of channels
+ * @param nb_samples the number of samples in a single channel
+ * @param sample_fmt the sample format
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return 0 on success or a negative error code on failure
+ */
+int av_samples_fill_arrays(uint8_t **audio_data, int *linesize,
+ const uint8_t *buf,
+ int nb_channels, int nb_samples,
+ enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
+ * linesize accordingly.
+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
+ * Allocated data will be initialized to silence.
+ *
+ * @see enum AVSampleFormat
+ * The documentation for AVSampleFormat describes the data layout.
+ *
+ * @param[out] audio_data array to be filled with the pointer for each channel
+ * @param[out] linesize aligned size for audio buffer(s), may be NULL
+ * @param nb_channels number of audio channels
+ * @param nb_samples number of samples per channel
+ * @param align buffer size alignment (0 = default, 1 = no alignment)
+ * @return 0 on success or a negative error code on failure
+ * @see av_samples_fill_arrays()
+ */
+int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
+ int nb_samples, enum AVSampleFormat sample_fmt, int align);
+
+/**
+ * Copy samples from src to dst.
+ *
+ * @param dst destination array of pointers to data planes
+ * @param src source array of pointers to data planes
+ * @param dst_offset offset in samples at which the data will be written to dst
+ * @param src_offset offset in samples at which the data will be read from src
+ * @param nb_samples number of samples to be copied
+ * @param nb_channels number of audio channels
+ * @param sample_fmt audio sample format
+ */
+int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset,
+ int src_offset, int nb_samples, int nb_channels,
+ enum AVSampleFormat sample_fmt);
+
+/**
+ * Fill an audio buffer with silence.
+ *
+ * @param audio_data array of pointers to data planes
+ * @param offset offset in samples at which to start filling
+ * @param nb_samples number of samples to fill
+ * @param nb_channels number of audio channels
+ * @param sample_fmt audio sample format
+ */
+int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples,
+ int nb_channels, enum AVSampleFormat sample_fmt);
+
+#endif /* AVUTIL_SAMPLEFMT_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/sha.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/sha.h
new file mode 100644
index 000000000..4c9a0c909
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/sha.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_SHA_H
+#define AVUTIL_SHA_H
+
+#include <stdint.h>
+
+#include "attributes.h"
+#include "version.h"
+
+/**
+ * @defgroup lavu_sha SHA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+#if FF_API_CONTEXT_SIZE
+extern attribute_deprecated const int av_sha_size;
+#endif
+
+struct AVSHA;
+
+/**
+ * Allocate an AVSHA context.
+ */
+struct AVSHA *av_sha_alloc(void);
+
+/**
+ * Initialize SHA-1 or SHA-2 hashing.
+ *
+ * @param context pointer to the function context (of size av_sha_size)
+ * @param bits number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits)
+ * @return zero if initialization succeeded, -1 otherwise
+ */
+int av_sha_init(struct AVSHA* context, int bits);
+
+/**
+ * Update hash value.
+ *
+ * @param context hash function context
+ * @param data input data to update hash with
+ * @param len input data length
+ */
+void av_sha_update(struct AVSHA* context, const uint8_t* data, unsigned int len);
+
+/**
+ * Finish hashing and output digest value.
+ *
+ * @param context hash function context
+ * @param digest buffer where output digest value is stored
+ */
+void av_sha_final(struct AVSHA* context, uint8_t *digest);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_SHA_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/stereo3d.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/stereo3d.h
new file mode 100644
index 000000000..695d6f1ba
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/stereo3d.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2013 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdint.h>
+
+#include "frame.h"
+
+/**
+ * List of possible 3D Types
+ */
+enum AVStereo3DType {
+ /**
+ * Video is not stereoscopic (and metadata has to be there).
+ */
+ AV_STEREO3D_2D,
+
+ /**
+ * Views are next to each other.
+ *
+ * LLLLRRRR
+ * LLLLRRRR
+ * LLLLRRRR
+ * ...
+ */
+ AV_STEREO3D_SIDEBYSIDE,
+
+ /**
+ * Views are on top of each other.
+ *
+ * LLLLLLLL
+ * LLLLLLLL
+ * RRRRRRRR
+ * RRRRRRRR
+ */
+ AV_STEREO3D_TOPBOTTOM,
+
+ /**
+ * Views are alternated temporally.
+ *
+ * frame0 frame1 frame2 ...
+ * LLLLLLLL RRRRRRRR LLLLLLLL
+ * LLLLLLLL RRRRRRRR LLLLLLLL
+ * LLLLLLLL RRRRRRRR LLLLLLLL
+ * ... ... ...
+ */
+ AV_STEREO3D_FRAMESEQUENCE,
+
+ /**
+ * Views are packed in a checkerboard-like structure per pixel.
+ *
+ * LRLRLRLR
+ * RLRLRLRL
+ * LRLRLRLR
+ * ...
+ */
+ AV_STEREO3D_CHECKERBOARD,
+
+ /**
+ * Views are next to each other, but when upscaling
+ * apply a checkerboard pattern.
+ *
+ * LLLLRRRR L L L L R R R R
+ * LLLLRRRR => L L L L R R R R
+ * LLLLRRRR L L L L R R R R
+ * LLLLRRRR L L L L R R R R
+ */
+ AV_STEREO3D_SIDEBYSIDE_QUINCUNX,
+
+ /**
+ * Views are packed per line, as if interlaced.
+ *
+ * LLLLLLLL
+ * RRRRRRRR
+ * LLLLLLLL
+ * ...
+ */
+ AV_STEREO3D_LINES,
+
+ /**
+ * Views are packed per column.
+ *
+ * LRLRLRLR
+ * LRLRLRLR
+ * LRLRLRLR
+ * ...
+ */
+ AV_STEREO3D_COLUMNS,
+};
+
+
+/**
+ * Inverted views, Right/Bottom represents the left view.
+ */
+#define AV_STEREO3D_FLAG_INVERT (1 << 0)
+
+/**
+ * Stereo 3D type: this structure describes how two videos are packed
+ * within a single video surface, with additional information as needed.
+ *
+ * @note The struct must be allocated with av_stereo3d_alloc() and
+ * its size is not a part of the public ABI.
+ */
+typedef struct AVStereo3D {
+ /**
+ * How views are packed within the video.
+ */
+ enum AVStereo3DType type;
+
+ /**
+ * Additional information about the frame packing.
+ */
+ int flags;
+} AVStereo3D;
+
+/**
+ * Allocate an AVStereo3D structure and set its fields to default values.
+ * The resulting struct can be freed using av_freep().
+ *
+ * @return An AVStereo3D filled with default values or NULL on failure.
+ */
+AVStereo3D *av_stereo3d_alloc(void);
+
+/**
+ * Allocate a complete AVFrameSideData and add it to the frame.
+ *
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVStereo3D structure to be filled by caller.
+ */
+AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame);
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/time.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/time.h
new file mode 100644
index 000000000..b01a97d77
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/time.h
@@ -0,0 +1,39 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_TIME_H
+#define AVUTIL_TIME_H
+
+#include <stdint.h>
+
+/**
+ * Get the current time in microseconds.
+ */
+int64_t av_gettime(void);
+
+/**
+ * Sleep for a period of time. Although the duration is expressed in
+ * microseconds, the actual delay may be rounded to the precision of the
+ * system timer.
+ *
+ * @param usec Number of microseconds to sleep.
+ * @return zero on success or (negative) error code.
+ */
+int av_usleep(unsigned usec);
+
+#endif /* AVUTIL_TIME_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/version.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/version.h
new file mode 100644
index 000000000..5196a674d
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/version.h
@@ -0,0 +1,116 @@
+/*
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_VERSION_H
+#define AVUTIL_VERSION_H
+
+#include "macros.h"
+
+/**
+ * @defgroup version_utils Library Version Macros
+ *
+ * Useful to check and match library version in order to maintain
+ * backward compatibility.
+ *
+ * @{
+ */
+
+#define AV_VERSION_INT(a, b, c) (a<<16 | b<<8 | c)
+#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
+
+/**
+ * @}
+ */
+
+/**
+ * @file
+ * @ingroup lavu
+ * Libavutil version macros
+ */
+
+/**
+ * @defgroup lavu_ver Version and Build diagnostics
+ *
+ * Macros and function useful to check at compiletime and at runtime
+ * which version of libavutil is in use.
+ *
+ * @{
+ */
+
+#define LIBAVUTIL_VERSION_MAJOR 53
+#define LIBAVUTIL_VERSION_MINOR 3
+#define LIBAVUTIL_VERSION_MICRO 0
+
+#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_VERSION AV_VERSION(LIBAVUTIL_VERSION_MAJOR, \
+ LIBAVUTIL_VERSION_MINOR, \
+ LIBAVUTIL_VERSION_MICRO)
+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT
+
+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
+
+/**
+ * @}
+ *
+ * @defgroup depr_guards Deprecation guards
+ * FF_API_* defines may be placed below to indicate public API that will be
+ * dropped at a future version bump. The defines themselves are not part of
+ * the public API and may change, break or disappear at any time.
+ *
+ * @{
+ */
+
+#ifndef FF_API_PIX_FMT
+#define FF_API_PIX_FMT (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_CONTEXT_SIZE
+#define FF_API_CONTEXT_SIZE (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_PIX_FMT_DESC
+#define FF_API_PIX_FMT_DESC (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AV_REVERSE
+#define FF_API_AV_REVERSE (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AUDIOCONVERT
+#define FF_API_AUDIOCONVERT (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_CPU_FLAG_MMX2
+#define FF_API_CPU_FLAG_MMX2 (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_LLS_PRIVATE
+#define FF_API_LLS_PRIVATE (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_AVFRAME_LAVC
+#define FF_API_AVFRAME_LAVC (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_VDPAU
+#define FF_API_VDPAU (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+#ifndef FF_API_XVMC
+#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 54)
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_VERSION_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/include/libavutil/xtea.h b/dom/media/platforms/ffmpeg/libav55/include/libavutil/xtea.h
new file mode 100644
index 000000000..7d2b07bbc
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/include/libavutil/xtea.h
@@ -0,0 +1,61 @@
+/*
+ * A 32-bit implementation of the XTEA algorithm
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_XTEA_H
+#define AVUTIL_XTEA_H
+
+#include <stdint.h>
+
+/**
+ * @defgroup lavu_xtea XTEA
+ * @ingroup lavu_crypto
+ * @{
+ */
+
+typedef struct AVXTEA {
+ uint32_t key[16];
+} AVXTEA;
+
+/**
+ * Initialize an AVXTEA context.
+ *
+ * @param ctx an AVXTEA context
+ * @param key a key of 16 bytes used for encryption/decryption
+ */
+void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]);
+
+/**
+ * Encrypt or decrypt a buffer using a previously initialized context.
+ *
+ * @param ctx an AVXTEA context
+ * @param dst destination array, can be equal to src
+ * @param src source array, can be equal to dst
+ * @param count number of 8 byte blocks
+ * @param iv initialization vector for CBC mode, if NULL then ECB will be used
+ * @param decrypt 0 for encryption, 1 for decryption
+ */
+void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src,
+ int count, uint8_t *iv, int decrypt);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_XTEA_H */
diff --git a/dom/media/platforms/ffmpeg/libav55/moz.build b/dom/media/platforms/ffmpeg/libav55/moz.build
new file mode 100644
index 000000000..6bd5db8d7
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/libav55/moz.build
@@ -0,0 +1,25 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ '../FFmpegAudioDecoder.cpp',
+ '../FFmpegDataDecoder.cpp',
+ '../FFmpegDecoderModule.cpp',
+ '../FFmpegVideoDecoder.cpp',
+]
+LOCAL_INCLUDES += [
+ '..',
+ 'include',
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += [ '-Wno-deprecated-declarations' ]
+if CONFIG['CLANG_CXX']:
+ CXXFLAGS += [
+ '-Wno-unknown-attributes',
+ ]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/ffmpeg/moz.build b/dom/media/platforms/ffmpeg/moz.build
new file mode 100644
index 000000000..604e445aa
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/moz.build
@@ -0,0 +1,22 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'FFmpegRuntimeLinker.h',
+]
+
+DIRS += [
+ 'libav53',
+ 'libav54',
+ 'libav55',
+ 'ffmpeg57',
+]
+
+UNIFIED_SOURCES += [
+ 'FFmpegRuntimeLinker.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/platforms/gonk/GonkAudioDecoderManager.cpp b/dom/media/platforms/gonk/GonkAudioDecoderManager.cpp
new file mode 100644
index 000000000..0bc3fbea9
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkAudioDecoderManager.cpp
@@ -0,0 +1,268 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "MediaCodecProxy.h"
+#include <OMX_IVCommon.h>
+#include <gui/Surface.h>
+#include <ICrypto.h>
+#include "GonkAudioDecoderManager.h"
+#include "MediaDecoderReader.h"
+#include "VideoUtils.h"
+#include "nsTArray.h"
+#include "mozilla/Logging.h"
+#include "stagefright/MediaBuffer.h"
+#include "stagefright/MetaData.h"
+#include "stagefright/MediaErrors.h"
+#include <stagefright/foundation/AMessage.h>
+#include <stagefright/foundation/ALooper.h>
+#include "media/openmax/OMX_Audio.h"
+#include "MediaData.h"
+#include "MediaInfo.h"
+
+#define CODECCONFIG_TIMEOUT_US 10000LL
+#define READ_OUTPUT_BUFFER_TIMEOUT_US 0LL
+
+#include <android/log.h>
+#define GADM_LOG(...) __android_log_print(ANDROID_LOG_DEBUG, "GonkAudioDecoderManager", __VA_ARGS__)
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+using namespace android;
+typedef android::MediaCodecProxy MediaCodecProxy;
+
+namespace mozilla {
+
+GonkAudioDecoderManager::GonkAudioDecoderManager(const AudioInfo& aConfig)
+ : mAudioChannels(aConfig.mChannels)
+ , mAudioRate(aConfig.mRate)
+ , mAudioProfile(aConfig.mProfile)
+ , mAudioCompactor(mAudioQueue)
+{
+ MOZ_COUNT_CTOR(GonkAudioDecoderManager);
+ MOZ_ASSERT(mAudioChannels);
+ mCodecSpecificData = aConfig.mCodecSpecificConfig;
+ mMimeType = aConfig.mMimeType;
+}
+
+GonkAudioDecoderManager::~GonkAudioDecoderManager()
+{
+ MOZ_COUNT_DTOR(GonkAudioDecoderManager);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+GonkAudioDecoderManager::Init()
+{
+ if (InitMediaCodecProxy()) {
+ return InitPromise::CreateAndResolve(TrackType::kAudioTrack, __func__);
+ } else {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+}
+
+bool
+GonkAudioDecoderManager::InitMediaCodecProxy()
+{
+ status_t rv = OK;
+ if (!InitLoopers(MediaData::AUDIO_DATA)) {
+ return false;
+ }
+
+ mDecoder = MediaCodecProxy::CreateByType(mDecodeLooper, mMimeType.get(), false);
+ if (!mDecoder.get()) {
+ return false;
+ }
+ if (!mDecoder->AllocateAudioMediaCodec())
+ {
+ mDecoder = nullptr;
+ return false;
+ }
+ sp<AMessage> format = new AMessage;
+ // Fixed values
+ GADM_LOG("Configure audio mime type:%s, chan no:%d, sample-rate:%d, profile:%d",
+ mMimeType.get(), mAudioChannels, mAudioRate, mAudioProfile);
+ format->setString("mime", mMimeType.get());
+ format->setInt32("channel-count", mAudioChannels);
+ format->setInt32("sample-rate", mAudioRate);
+ format->setInt32("aac-profile", mAudioProfile);
+ status_t err = mDecoder->configure(format, nullptr, nullptr, 0);
+ if (err != OK || !mDecoder->Prepare()) {
+ return false;
+ }
+
+ if (mMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ rv = mDecoder->Input(mCodecSpecificData->Elements(), mCodecSpecificData->Length(), 0,
+ android::MediaCodec::BUFFER_FLAG_CODECCONFIG,
+ CODECCONFIG_TIMEOUT_US);
+ }
+
+ if (rv == OK) {
+ return true;
+ } else {
+ GADM_LOG("Failed to input codec specific data!");
+ return false;
+ }
+}
+
+nsresult
+GonkAudioDecoderManager::CreateAudioData(MediaBuffer* aBuffer, int64_t aStreamOffset)
+{
+ if (!(aBuffer != nullptr && aBuffer->data() != nullptr)) {
+ GADM_LOG("Audio Buffer is not valid!");
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ int64_t timeUs;
+ if (!aBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ if (aBuffer->range_length() == 0) {
+ // Some decoders may return spurious empty buffers that we just want to ignore
+ // quoted from Android's AwesomePlayer.cpp
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ if (mLastTime > timeUs) {
+ GADM_LOG("Output decoded sample time is revert. time=%lld", timeUs);
+ MOZ_ASSERT(false);
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ mLastTime = timeUs;
+
+ const uint8_t *data = static_cast<const uint8_t*>(aBuffer->data());
+ size_t dataOffset = aBuffer->range_offset();
+ size_t size = aBuffer->range_length();
+
+ uint32_t frames = size / (2 * mAudioChannels);
+
+ CheckedInt64 duration = FramesToUsecs(frames, mAudioRate);
+ if (!duration.isValid()) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ typedef AudioCompactor::NativeCopy OmxCopy;
+ mAudioCompactor.Push(aStreamOffset,
+ timeUs,
+ mAudioRate,
+ frames,
+ mAudioChannels,
+ OmxCopy(data+dataOffset,
+ size,
+ mAudioChannels));
+ return NS_OK;
+}
+
+nsresult
+GonkAudioDecoderManager::Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutData)
+{
+ aOutData = nullptr;
+ if (mAudioQueue.GetSize() > 0) {
+ aOutData = mAudioQueue.PopFront();
+ return mAudioQueue.AtEndOfStream() ? NS_ERROR_ABORT : NS_OK;
+ }
+
+ status_t err;
+ MediaBuffer* audioBuffer = nullptr;
+ err = mDecoder->Output(&audioBuffer, READ_OUTPUT_BUFFER_TIMEOUT_US);
+ AutoReleaseMediaBuffer a(audioBuffer, mDecoder.get());
+
+ switch (err) {
+ case OK:
+ {
+ nsresult rv = CreateAudioData(audioBuffer, aStreamOffset);
+ NS_ENSURE_SUCCESS(rv, rv);
+ break;
+ }
+ case android::INFO_FORMAT_CHANGED:
+ {
+ // If the format changed, update our cached info.
+ GADM_LOG("Decoder format changed");
+ sp<AMessage> audioCodecFormat;
+
+ if (mDecoder->getOutputFormat(&audioCodecFormat) != OK ||
+ audioCodecFormat == nullptr) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ int32_t codec_channel_count = 0;
+ int32_t codec_sample_rate = 0;
+
+ if (!audioCodecFormat->findInt32("channel-count", &codec_channel_count) ||
+ !audioCodecFormat->findInt32("sample-rate", &codec_sample_rate)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ // Update AudioInfo
+ AudioConfig::ChannelLayout layout(codec_channel_count);
+ if (!layout.IsValid()) {
+ return NS_ERROR_FAILURE;
+ }
+ mAudioChannels = codec_channel_count;
+ mAudioRate = codec_sample_rate;
+
+ return Output(aStreamOffset, aOutData);
+ }
+ case android::INFO_OUTPUT_BUFFERS_CHANGED:
+ {
+ GADM_LOG("Info Output Buffers Changed");
+ if (mDecoder->UpdateOutputBuffers()) {
+ return Output(aStreamOffset, aOutData);
+ }
+ return NS_ERROR_FAILURE;
+ }
+ case -EAGAIN:
+ {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ case android::ERROR_END_OF_STREAM:
+ {
+ GADM_LOG("Got EOS frame!");
+ nsresult rv = CreateAudioData(audioBuffer, aStreamOffset);
+ NS_ENSURE_SUCCESS(rv, NS_ERROR_ABORT);
+ MOZ_ASSERT(mAudioQueue.GetSize() > 0);
+ mAudioQueue.Finish();
+ break;
+ }
+ case -ETIMEDOUT:
+ {
+ GADM_LOG("Timeout. can try again next time");
+ return NS_ERROR_UNEXPECTED;
+ }
+ default:
+ {
+ GADM_LOG("Decoder failed, err=%d", err);
+ return NS_ERROR_UNEXPECTED;
+ }
+ }
+
+ if (mAudioQueue.GetSize() > 0) {
+ aOutData = mAudioQueue.PopFront();
+ // Return NS_ERROR_ABORT at the last sample.
+ return mAudioQueue.AtEndOfStream() ? NS_ERROR_ABORT : NS_OK;
+ }
+
+ return NS_ERROR_NOT_AVAILABLE;
+}
+
+void
+GonkAudioDecoderManager::ProcessFlush()
+{
+ GADM_LOG("FLUSH<<<");
+ mAudioQueue.Reset();
+ GADM_LOG(">>>FLUSH");
+ GonkDecoderManager::ProcessFlush();
+}
+
+void
+GonkAudioDecoderManager::ResetEOS()
+{
+ GADM_LOG("ResetEOS(<<<");
+ mAudioQueue.Reset();
+ GADM_LOG(">>>ResetEOS(");
+ GonkDecoderManager::ResetEOS();
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/gonk/GonkAudioDecoderManager.h b/dom/media/platforms/gonk/GonkAudioDecoderManager.h
new file mode 100644
index 000000000..aa35d620e
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkAudioDecoderManager.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GonkAudioDecoderManager_h_)
+#define GonkAudioDecoderManager_h_
+
+#include "AudioCompactor.h"
+#include "mozilla/RefPtr.h"
+#include "GonkMediaDataDecoder.h"
+
+using namespace android;
+
+namespace android {
+class MOZ_EXPORT MediaBuffer;
+} // namespace android
+
+namespace mozilla {
+
+class GonkAudioDecoderManager : public GonkDecoderManager {
+typedef android::MediaCodecProxy MediaCodecProxy;
+public:
+ GonkAudioDecoderManager(const AudioInfo& aConfig);
+
+ virtual ~GonkAudioDecoderManager();
+
+ RefPtr<InitPromise> Init() override;
+
+ nsresult Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutput) override;
+
+ void ProcessFlush() override;
+ virtual void ResetEOS() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "gonk audio decoder";
+ }
+
+private:
+ bool InitMediaCodecProxy();
+
+ nsresult CreateAudioData(MediaBuffer* aBuffer, int64_t aStreamOffset);
+
+ uint32_t mAudioChannels;
+ uint32_t mAudioRate;
+ const uint32_t mAudioProfile;
+
+ MediaQueue<AudioData> mAudioQueue;
+
+ AudioCompactor mAudioCompactor;
+
+};
+
+} // namespace mozilla
+
+#endif // GonkAudioDecoderManager_h_
diff --git a/dom/media/platforms/gonk/GonkDecoderModule.cpp b/dom/media/platforms/gonk/GonkDecoderModule.cpp
new file mode 100644
index 000000000..537bc299c
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkDecoderModule.cpp
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "GonkDecoderModule.h"
+#include "GonkVideoDecoderManager.h"
+#include "GonkAudioDecoderManager.h"
+#include "mozilla/DebugOnly.h"
+#include "GonkMediaDataDecoder.h"
+
+namespace mozilla {
+GonkDecoderModule::GonkDecoderModule()
+{
+}
+
+GonkDecoderModule::~GonkDecoderModule()
+{
+}
+
+already_AddRefed<MediaDataDecoder>
+GonkDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<MediaDataDecoder> decoder =
+ new GonkMediaDataDecoder(new GonkVideoDecoderManager(aParams.mImageContainer, aParams.VideoConfig()),
+ aParams.mCallback);
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+GonkDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<MediaDataDecoder> decoder =
+ new GonkMediaDataDecoder(new GonkAudioDecoderManager(aParams.AudioConfig()),
+ aParams.mCallback);
+ return decoder.forget();
+}
+
+PlatformDecoderModule::ConversionRequired
+GonkDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ if (aConfig.IsVideo()) {
+ return ConversionRequired::kNeedAnnexB;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+}
+
+bool
+GonkDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ return aMimeType.EqualsLiteral("audio/mp4a-latm") ||
+ aMimeType.EqualsLiteral("audio/3gpp") ||
+ aMimeType.EqualsLiteral("audio/amr-wb") ||
+ aMimeType.EqualsLiteral("audio/mpeg") ||
+ aMimeType.EqualsLiteral("video/mp4") ||
+ aMimeType.EqualsLiteral("video/mp4v-es") ||
+ aMimeType.EqualsLiteral("video/avc") ||
+ aMimeType.EqualsLiteral("video/3gpp");
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/gonk/GonkDecoderModule.h b/dom/media/platforms/gonk/GonkDecoderModule.h
new file mode 100644
index 000000000..4f29f0e75
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkDecoderModule.h
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GonkPlatformDecoderModule_h_)
+#define GonkPlatformDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class GonkDecoderModule : public PlatformDecoderModule {
+public:
+ GonkDecoderModule();
+ virtual ~GonkDecoderModule();
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ // Decode thread.
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/gonk/GonkMediaDataDecoder.cpp b/dom/media/platforms/gonk/GonkMediaDataDecoder.cpp
new file mode 100644
index 000000000..6d59d72e1
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkMediaDataDecoder.cpp
@@ -0,0 +1,385 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "GonkMediaDataDecoder.h"
+#include "VideoUtils.h"
+#include "nsTArray.h"
+#include "MediaCodecProxy.h"
+
+#include <stagefright/foundation/ADebug.h>
+
+#include "mozilla/Logging.h"
+#include <android/log.h>
+#define GMDD_LOG(...) __android_log_print(ANDROID_LOG_DEBUG, "GonkMediaDataDecoder", __VA_ARGS__)
+#define INPUT_TIMEOUT_US 0LL // Don't wait for buffer if none is available.
+#define MIN_QUEUED_SAMPLES 2
+
+#ifdef DEBUG
+#include <utils/AndroidThreads.h>
+#endif
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+using namespace android;
+
+namespace mozilla {
+
+bool
+GonkDecoderManager::InitLoopers(MediaData::Type aType)
+{
+ MOZ_ASSERT(mDecodeLooper.get() == nullptr && mTaskLooper.get() == nullptr);
+ MOZ_ASSERT(aType == MediaData::VIDEO_DATA || aType == MediaData::AUDIO_DATA);
+
+ const char* suffix = (aType == MediaData::VIDEO_DATA ? "video" : "audio");
+ mDecodeLooper = new ALooper;
+ android::AString name("MediaCodecProxy/");
+ name.append(suffix);
+ mDecodeLooper->setName(name.c_str());
+
+ mTaskLooper = new ALooper;
+ name.setTo("GonkDecoderManager/");
+ name.append(suffix);
+ mTaskLooper->setName(name.c_str());
+ mTaskLooper->registerHandler(this);
+
+#ifdef DEBUG
+ sp<AMessage> findThreadId(new AMessage(kNotifyFindLooperId, id()));
+ findThreadId->post();
+#endif
+
+ return mDecodeLooper->start() == OK && mTaskLooper->start() == OK;
+}
+
+nsresult
+GonkDecoderManager::Input(MediaRawData* aSample)
+{
+ RefPtr<MediaRawData> sample;
+
+ if (aSample) {
+ sample = aSample;
+ } else {
+ // It means EOS with empty sample.
+ sample = new MediaRawData();
+ }
+ {
+ MutexAutoLock lock(mMutex);
+ mQueuedSamples.AppendElement(sample);
+ }
+
+ sp<AMessage> input = new AMessage(kNotifyProcessInput, id());
+ if (!aSample) {
+ input->setInt32("input-eos", 1);
+ }
+ input->post();
+ return NS_OK;
+}
+
+int32_t
+GonkDecoderManager::ProcessQueuedSamples()
+{
+ MOZ_ASSERT(OnTaskLooper());
+
+ MutexAutoLock lock(mMutex);
+ status_t rv;
+ while (mQueuedSamples.Length()) {
+ RefPtr<MediaRawData> data = mQueuedSamples.ElementAt(0);
+ rv = mDecoder->Input(reinterpret_cast<const uint8_t*>(data->Data()),
+ data->Size(),
+ data->mTime,
+ 0,
+ INPUT_TIMEOUT_US);
+ if (rv == OK) {
+ mQueuedSamples.RemoveElementAt(0);
+ mWaitOutput.AppendElement(WaitOutputInfo(data->mOffset, data->mTime,
+ /* eos */ data->Data() == nullptr));
+ } else if (rv == -EAGAIN || rv == -ETIMEDOUT) {
+ // In most cases, EAGAIN or ETIMEOUT are safe because OMX can't fill
+ // buffer on time.
+ break;
+ } else {
+ return rv;
+ }
+ }
+ return mQueuedSamples.Length();
+}
+
+nsresult
+GonkDecoderManager::Flush()
+{
+ if (mDecoder == nullptr) {
+ GMDD_LOG("Decoder is not initialized");
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ if (!mInitPromise.IsEmpty()) {
+ return NS_OK;
+ }
+
+ {
+ MutexAutoLock lock(mMutex);
+ mQueuedSamples.Clear();
+ }
+
+ MonitorAutoLock lock(mFlushMonitor);
+ mIsFlushing = true;
+ sp<AMessage> flush = new AMessage(kNotifyProcessFlush, id());
+ flush->post();
+ while (mIsFlushing) {
+ lock.Wait();
+ }
+ return NS_OK;
+}
+
+nsresult
+GonkDecoderManager::Shutdown()
+{
+ if (mDecoder.get()) {
+ mDecoder->stop();
+ mDecoder->ReleaseMediaResources();
+ mDecoder = nullptr;
+ }
+
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+
+ return NS_OK;
+}
+
+size_t
+GonkDecoderManager::NumQueuedSamples()
+{
+ MutexAutoLock lock(mMutex);
+ return mQueuedSamples.Length();
+}
+
+void
+GonkDecoderManager::ProcessInput(bool aEndOfStream)
+{
+ MOZ_ASSERT(OnTaskLooper());
+
+ status_t rv = ProcessQueuedSamples();
+ if (rv >= 0) {
+ if (!aEndOfStream && rv <= MIN_QUEUED_SAMPLES) {
+ mDecodeCallback->InputExhausted();
+ }
+
+ if (mToDo.get() == nullptr) {
+ mToDo = new AMessage(kNotifyDecoderActivity, id());
+ if (aEndOfStream) {
+ mToDo->setInt32("input-eos", 1);
+ }
+ mDecoder->requestActivityNotification(mToDo);
+ } else if (aEndOfStream) {
+ mToDo->setInt32("input-eos", 1);
+ }
+ } else {
+ GMDD_LOG("input processed: error#%d", rv);
+ mDecodeCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ __func__));
+ }
+}
+
+void
+GonkDecoderManager::ProcessFlush()
+{
+ MOZ_ASSERT(OnTaskLooper());
+
+ mLastTime = INT64_MIN;
+ MonitorAutoLock lock(mFlushMonitor);
+ mWaitOutput.Clear();
+ if (mDecoder->flush() != OK) {
+ GMDD_LOG("flush error");
+ mDecodeCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ __func__));
+ }
+ mIsFlushing = false;
+ lock.NotifyAll();
+}
+
+// Use output timestamp to determine which output buffer is already returned
+// and remove corresponding info, except for EOS, from the waiting list.
+// This method handles the cases that audio decoder sends multiple output
+// buffers for one input.
+void
+GonkDecoderManager::UpdateWaitingList(int64_t aForgetUpTo)
+{
+ MOZ_ASSERT(OnTaskLooper());
+
+ size_t i;
+ for (i = 0; i < mWaitOutput.Length(); i++) {
+ const auto& item = mWaitOutput.ElementAt(i);
+ if (item.mEOS || item.mTimestamp > aForgetUpTo) {
+ break;
+ }
+ }
+ if (i > 0) {
+ mWaitOutput.RemoveElementsAt(0, i);
+ }
+}
+
+void
+GonkDecoderManager::ProcessToDo(bool aEndOfStream)
+{
+ MOZ_ASSERT(OnTaskLooper());
+
+ MOZ_ASSERT(mToDo.get() != nullptr);
+ mToDo.clear();
+
+ if (NumQueuedSamples() > 0 && ProcessQueuedSamples() < 0) {
+ mDecodeCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ __func__));
+ return;
+ }
+
+ while (mWaitOutput.Length() > 0) {
+ RefPtr<MediaData> output;
+ WaitOutputInfo wait = mWaitOutput.ElementAt(0);
+ nsresult rv = Output(wait.mOffset, output);
+ if (rv == NS_OK) {
+ MOZ_ASSERT(output);
+ mDecodeCallback->Output(output);
+ UpdateWaitingList(output->mTime);
+ } else if (rv == NS_ERROR_ABORT) {
+ // EOS
+ MOZ_ASSERT(mQueuedSamples.IsEmpty());
+ if (output) {
+ mDecodeCallback->Output(output);
+ UpdateWaitingList(output->mTime);
+ }
+ MOZ_ASSERT(mWaitOutput.Length() == 1);
+ mWaitOutput.RemoveElementAt(0);
+ mDecodeCallback->DrainComplete();
+ ResetEOS();
+ return;
+ } else if (rv == NS_ERROR_NOT_AVAILABLE) {
+ break;
+ } else {
+ mDecodeCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ __func__));
+ return;
+ }
+ }
+
+ if (!aEndOfStream && NumQueuedSamples() <= MIN_QUEUED_SAMPLES) {
+ mDecodeCallback->InputExhausted();
+ // No need to shedule todo task this time because InputExhausted() will
+ // cause Input() to be invoked and do it for us.
+ return;
+ }
+
+ if (NumQueuedSamples() || mWaitOutput.Length() > 0) {
+ mToDo = new AMessage(kNotifyDecoderActivity, id());
+ if (aEndOfStream) {
+ mToDo->setInt32("input-eos", 1);
+ }
+ mDecoder->requestActivityNotification(mToDo);
+ }
+}
+
+void
+GonkDecoderManager::ResetEOS()
+{
+ // After eos, android::MediaCodec needs to be flushed to receive next input
+ mWaitOutput.Clear();
+ if (mDecoder->flush() != OK) {
+ GMDD_LOG("flush error");
+ mDecodeCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ __func__));
+ }
+}
+
+void
+GonkDecoderManager::onMessageReceived(const sp<AMessage> &aMessage)
+{
+ switch (aMessage->what()) {
+ case kNotifyProcessInput:
+ {
+ int32_t eos = 0;
+ ProcessInput(aMessage->findInt32("input-eos", &eos) && eos);
+ break;
+ }
+ case kNotifyProcessFlush:
+ {
+ ProcessFlush();
+ break;
+ }
+ case kNotifyDecoderActivity:
+ {
+ int32_t eos = 0;
+ ProcessToDo(aMessage->findInt32("input-eos", &eos) && eos);
+ break;
+ }
+#ifdef DEBUG
+ case kNotifyFindLooperId:
+ {
+ mTaskLooperId = androidGetThreadId();
+ MOZ_ASSERT(mTaskLooperId);
+ break;
+ }
+#endif
+ default:
+ {
+ TRESPASS();
+ break;
+ }
+ }
+}
+
+#ifdef DEBUG
+bool
+GonkDecoderManager::OnTaskLooper()
+{
+ return androidGetThreadId() == mTaskLooperId;
+}
+#endif
+
+GonkMediaDataDecoder::GonkMediaDataDecoder(GonkDecoderManager* aManager,
+ MediaDataDecoderCallback* aCallback)
+ : mManager(aManager)
+{
+ MOZ_COUNT_CTOR(GonkMediaDataDecoder);
+ mManager->SetDecodeCallback(aCallback);
+}
+
+GonkMediaDataDecoder::~GonkMediaDataDecoder()
+{
+ MOZ_COUNT_DTOR(GonkMediaDataDecoder);
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+GonkMediaDataDecoder::Init()
+{
+ return mManager->Init();
+}
+
+void
+GonkMediaDataDecoder::Shutdown()
+{
+ mManager->Shutdown();
+
+ // Because codec allocated runnable and init promise is at reader TaskQueue,
+ // so manager needs to be destroyed at reader TaskQueue to prevent racing.
+ mManager = nullptr;
+}
+
+// Inserts data into the decoder's pipeline.
+void
+GonkMediaDataDecoder::Input(MediaRawData* aSample)
+{
+ mManager->Input(aSample);
+}
+
+void
+GonkMediaDataDecoder::Flush()
+{
+ mManager->Flush();
+}
+
+void
+GonkMediaDataDecoder::Drain()
+{
+ mManager->Input(nullptr);
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/gonk/GonkMediaDataDecoder.h b/dom/media/platforms/gonk/GonkMediaDataDecoder.h
new file mode 100644
index 000000000..bba2a8645
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkMediaDataDecoder.h
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GonkMediaDataDecoder_h_)
+#define GonkMediaDataDecoder_h_
+#include "PlatformDecoderModule.h"
+#include <stagefright/foundation/AHandler.h>
+
+namespace android {
+struct ALooper;
+class MediaBuffer;
+class MediaCodecProxy;
+} // namespace android
+
+namespace mozilla {
+class MediaRawData;
+
+// Manage the data flow from inputting encoded data and outputting decode data.
+class GonkDecoderManager : public android::AHandler {
+public:
+ typedef TrackInfo::TrackType TrackType;
+ typedef MediaDataDecoder::InitPromise InitPromise;
+
+ virtual ~GonkDecoderManager() {}
+
+ virtual RefPtr<InitPromise> Init() = 0;
+ virtual const char* GetDescriptionName() const = 0;
+
+ // Asynchronously send sample into mDecoder. If out of input buffer, aSample
+ // will be queued for later re-send.
+ nsresult Input(MediaRawData* aSample);
+
+ // Flush the queued samples and signal decoder to throw all pending input/output away.
+ nsresult Flush();
+
+ // Shutdown decoder and rejects the init promise.
+ virtual nsresult Shutdown();
+
+ // How many samples are waiting for processing.
+ size_t NumQueuedSamples();
+
+ // Set callback for decoder events, such as requesting more input,
+ // returning output, or reporting error.
+ void SetDecodeCallback(MediaDataDecoderCallback* aCallback)
+ {
+ mDecodeCallback = aCallback;
+ }
+
+protected:
+ GonkDecoderManager()
+ : mMutex("GonkDecoderManager")
+ , mLastTime(INT64_MIN)
+ , mFlushMonitor("GonkDecoderManager::Flush")
+ , mIsFlushing(false)
+ , mDecodeCallback(nullptr)
+ {}
+
+ bool InitLoopers(MediaData::Type aType);
+
+ void onMessageReceived(const android::sp<android::AMessage> &aMessage) override;
+
+ // Produces decoded output. It returns NS_OK on success, or NS_ERROR_NOT_AVAILABLE
+ // when output is not produced yet.
+ // If this returns a failure code other than NS_ERROR_NOT_AVAILABLE, an error
+ // will be reported through mDecodeCallback.
+ virtual nsresult Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutput) = 0;
+
+ // Send queued samples to OMX. It returns how many samples are still in
+ // queue after processing, or negative error code if failed.
+ int32_t ProcessQueuedSamples();
+
+ void ProcessInput(bool aEndOfStream);
+ virtual void ProcessFlush();
+ void ProcessToDo(bool aEndOfStream);
+ virtual void ResetEOS();
+
+ RefPtr<MediaByteBuffer> mCodecSpecificData;
+
+ nsAutoCString mMimeType;
+
+ // MediaCodedc's wrapper that performs the decoding.
+ android::sp<android::MediaCodecProxy> mDecoder;
+ // Looper for mDecoder to run on.
+ android::sp<android::ALooper> mDecodeLooper;
+ // Looper to run decode tasks such as processing input, output, flush, and
+ // recycling output buffers.
+ android::sp<android::ALooper> mTaskLooper;
+ // Message codes for tasks running on mTaskLooper.
+ enum {
+ // Decoder will send this to indicate internal state change such as input or
+ // output buffers availability. Used to run pending input & output tasks.
+ kNotifyDecoderActivity = 'nda ',
+ // Signal the decoder to flush.
+ kNotifyProcessFlush = 'npf ',
+ // Used to process queued samples when there is new input.
+ kNotifyProcessInput = 'npi ',
+#ifdef DEBUG
+ kNotifyFindLooperId = 'nfli',
+#endif
+ };
+
+ MozPromiseHolder<InitPromise> mInitPromise;
+
+ Mutex mMutex; // Protects mQueuedSamples.
+ // A queue that stores the samples waiting to be sent to mDecoder.
+ // Empty element means EOS and there shouldn't be any sample be queued after it.
+ // Samples are queued in caller's thread and dequeued in mTaskLooper.
+ nsTArray<RefPtr<MediaRawData>> mQueuedSamples;
+
+ // The last decoded frame presentation time. Only accessed on mTaskLooper.
+ int64_t mLastTime;
+
+ Monitor mFlushMonitor; // Waits for flushing to complete.
+ bool mIsFlushing; // Protected by mFlushMonitor.
+
+ // Remembers the notification that is currently waiting for the decoder event
+ // to avoid requesting more than one notification at the time, which is
+ // forbidden by mDecoder.
+ android::sp<android::AMessage> mToDo;
+
+ // Stores sample info for output buffer processing later.
+ struct WaitOutputInfo {
+ WaitOutputInfo(int64_t aOffset, int64_t aTimestamp, bool aEOS)
+ : mOffset(aOffset)
+ , mTimestamp(aTimestamp)
+ , mEOS(aEOS)
+ {}
+ const int64_t mOffset;
+ const int64_t mTimestamp;
+ const bool mEOS;
+ };
+
+ nsTArray<WaitOutputInfo> mWaitOutput;
+
+ MediaDataDecoderCallback* mDecodeCallback; // Reports decoder output or error.
+
+private:
+ void UpdateWaitingList(int64_t aForgetUpTo);
+
+#ifdef DEBUG
+ typedef void* LooperId;
+
+ bool OnTaskLooper();
+ LooperId mTaskLooperId;
+#endif
+};
+
+class AutoReleaseMediaBuffer
+{
+public:
+ AutoReleaseMediaBuffer(android::MediaBuffer* aBuffer, android::MediaCodecProxy* aCodec)
+ : mBuffer(aBuffer)
+ , mCodec(aCodec)
+ {}
+
+ ~AutoReleaseMediaBuffer()
+ {
+ MOZ_ASSERT(mCodec.get());
+ if (mBuffer) {
+ mCodec->ReleaseMediaBuffer(mBuffer);
+ }
+ }
+
+ android::MediaBuffer* forget()
+ {
+ android::MediaBuffer* tmp = mBuffer;
+ mBuffer = nullptr;
+ return tmp;
+ }
+
+private:
+ android::MediaBuffer* mBuffer;
+ android::sp<android::MediaCodecProxy> mCodec;
+};
+
+// Samples are decoded using the GonkDecoder (MediaCodec)
+// created by the GonkDecoderManager. This class implements
+// the higher-level logic that drives mapping the Gonk to the async
+// MediaDataDecoder interface. The specifics of decoding the exact stream
+// type are handled by GonkDecoderManager and the GonkDecoder it creates.
+class GonkMediaDataDecoder : public MediaDataDecoder {
+public:
+ GonkMediaDataDecoder(GonkDecoderManager* aDecoderManager,
+ MediaDataDecoderCallback* aCallback);
+
+ ~GonkMediaDataDecoder();
+
+ RefPtr<InitPromise> Init() override;
+
+ void Input(MediaRawData* aSample) override;
+
+ void Flush() override;
+
+ void Drain() override;
+
+ void Shutdown() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "gonk decoder";
+ }
+
+private:
+
+ android::sp<GonkDecoderManager> mManager;
+};
+
+} // namespace mozilla
+
+#endif // GonkMediaDataDecoder_h_
diff --git a/dom/media/platforms/gonk/GonkVideoDecoderManager.cpp b/dom/media/platforms/gonk/GonkVideoDecoderManager.cpp
new file mode 100644
index 000000000..0c7b3b6af
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkVideoDecoderManager.cpp
@@ -0,0 +1,772 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#include "MediaCodecProxy.h"
+#include <OMX_IVCommon.h>
+#include <gui/Surface.h>
+#include <ICrypto.h>
+#include "GonkVideoDecoderManager.h"
+#include "GrallocImages.h"
+#include "MediaDecoderReader.h"
+#include "ImageContainer.h"
+#include "VideoUtils.h"
+#include "nsThreadUtils.h"
+#include "Layers.h"
+#include "mozilla/Logging.h"
+#include <stagefright/MediaBuffer.h>
+#include <stagefright/MetaData.h>
+#include <stagefright/MediaErrors.h>
+#include <stagefright/foundation/AString.h>
+#include "GonkNativeWindow.h"
+#include "mozilla/layers/GrallocTextureClient.h"
+#include "mozilla/layers/ImageBridgeChild.h"
+#include "mozilla/layers/TextureClient.h"
+#include "mozilla/layers/TextureClientRecycleAllocator.h"
+#include <cutils/properties.h>
+
+#define CODECCONFIG_TIMEOUT_US 10000LL
+#define READ_OUTPUT_BUFFER_TIMEOUT_US 0LL
+
+#include <android/log.h>
+#define GVDM_LOG(...) __android_log_print(ANDROID_LOG_DEBUG, "GonkVideoDecoderManager", __VA_ARGS__)
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+using namespace mozilla::layers;
+using namespace android;
+typedef android::MediaCodecProxy MediaCodecProxy;
+
+namespace mozilla {
+
+class GonkTextureClientAllocationHelper : public layers::ITextureClientAllocationHelper
+{
+public:
+ GonkTextureClientAllocationHelper(uint32_t aGrallocFormat,
+ gfx::IntSize aSize)
+ : ITextureClientAllocationHelper(gfx::SurfaceFormat::UNKNOWN,
+ aSize,
+ BackendSelector::Content,
+ TextureFlags::DEALLOCATE_CLIENT,
+ ALLOC_DISALLOW_BUFFERTEXTURECLIENT)
+ , mGrallocFormat(aGrallocFormat)
+ {}
+
+ already_AddRefed<TextureClient> Allocate(KnowsCompositor* aAllocator) override
+ {
+ uint32_t usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN |
+ android::GraphicBuffer::USAGE_SW_WRITE_OFTEN |
+ android::GraphicBuffer::USAGE_HW_TEXTURE;
+
+ GrallocTextureData* texData = GrallocTextureData::Create(mSize, mGrallocFormat,
+ gfx::BackendType::NONE,
+ usage, aAllocator->GetTextureForwarder());
+ if (!texData) {
+ return nullptr;
+ }
+ sp<GraphicBuffer> graphicBuffer = texData->GetGraphicBuffer();
+ if (!graphicBuffer.get()) {
+ return nullptr;
+ }
+ RefPtr<TextureClient> textureClient =
+ TextureClient::CreateWithData(texData, TextureFlags::DEALLOCATE_CLIENT, aAllocator->GetTextureForwarder());
+ return textureClient.forget();
+ }
+
+ bool IsCompatible(TextureClient* aTextureClient) override
+ {
+ if (!aTextureClient) {
+ return false;
+ }
+ sp<GraphicBuffer> graphicBuffer =
+ static_cast<GrallocTextureData*>(aTextureClient->GetInternalData())->GetGraphicBuffer();
+ if (!graphicBuffer.get() ||
+ static_cast<uint32_t>(graphicBuffer->getPixelFormat()) != mGrallocFormat ||
+ aTextureClient->GetSize() != mSize) {
+ return false;
+ }
+ return true;
+ }
+
+private:
+ uint32_t mGrallocFormat;
+};
+
+GonkVideoDecoderManager::GonkVideoDecoderManager(
+ mozilla::layers::ImageContainer* aImageContainer,
+ const VideoInfo& aConfig)
+ : mConfig(aConfig)
+ , mImageContainer(aImageContainer)
+ , mColorConverterBufferSize(0)
+ , mPendingReleaseItemsLock("GonkVideoDecoderManager::mPendingReleaseItemsLock")
+ , mNeedsCopyBuffer(false)
+{
+ MOZ_COUNT_CTOR(GonkVideoDecoderManager);
+}
+
+GonkVideoDecoderManager::~GonkVideoDecoderManager()
+{
+ MOZ_COUNT_DTOR(GonkVideoDecoderManager);
+}
+
+nsresult
+GonkVideoDecoderManager::Shutdown()
+{
+ mVideoCodecRequest.DisconnectIfExists();
+ return GonkDecoderManager::Shutdown();
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+GonkVideoDecoderManager::Init()
+{
+ mNeedsCopyBuffer = false;
+
+ uint32_t maxWidth, maxHeight;
+ char propValue[PROPERTY_VALUE_MAX];
+ property_get("ro.moz.omx.hw.max_width", propValue, "-1");
+ maxWidth = -1 == atoi(propValue) ? MAX_VIDEO_WIDTH : atoi(propValue);
+ property_get("ro.moz.omx.hw.max_height", propValue, "-1");
+ maxHeight = -1 == atoi(propValue) ? MAX_VIDEO_HEIGHT : atoi(propValue) ;
+
+ if (uint32_t(mConfig.mImage.width * mConfig.mImage.height) > maxWidth * maxHeight) {
+ GVDM_LOG("Video resolution exceeds hw codec capability");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ // Validate the container-reported frame and pictureRect sizes. This ensures
+ // that our video frame creation code doesn't overflow.
+ if (!IsValidVideoRegion(mConfig.mImage, mConfig.ImageRect(), mConfig.mDisplay)) {
+ GVDM_LOG("It is not a valid region");
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ mReaderTaskQueue = AbstractThread::GetCurrent()->AsTaskQueue();
+ MOZ_ASSERT(mReaderTaskQueue);
+
+ if (mDecodeLooper.get() != nullptr) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ if (!InitLoopers(MediaData::VIDEO_DATA)) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ }
+
+ RefPtr<InitPromise> p = mInitPromise.Ensure(__func__);
+ android::sp<GonkVideoDecoderManager> self = this;
+ mDecoder = MediaCodecProxy::CreateByType(mDecodeLooper,
+ mConfig.mMimeType.get(),
+ false);
+
+ uint32_t capability = MediaCodecProxy::kEmptyCapability;
+ if (mDecoder->getCapability(&capability) == OK && (capability &
+ MediaCodecProxy::kCanExposeGraphicBuffer)) {
+#if ANDROID_VERSION >= 21
+ sp<IGonkGraphicBufferConsumer> consumer;
+ GonkBufferQueue::createBufferQueue(&mGraphicBufferProducer, &consumer);
+ mNativeWindow = new GonkNativeWindow(consumer);
+#else
+ mNativeWindow = new GonkNativeWindow();
+#endif
+ }
+
+ mVideoCodecRequest.Begin(mDecoder->AsyncAllocateVideoMediaCodec()
+ ->Then(mReaderTaskQueue, __func__,
+ [self] (bool) -> void {
+ self->mVideoCodecRequest.Complete();
+ self->codecReserved();
+ }, [self] (bool) -> void {
+ self->mVideoCodecRequest.Complete();
+ self->codecCanceled();
+ }));
+
+ return p;
+}
+
+nsresult
+GonkVideoDecoderManager::CreateVideoData(MediaBuffer* aBuffer,
+ int64_t aStreamOffset,
+ VideoData **v)
+{
+ *v = nullptr;
+ RefPtr<VideoData> data;
+ int64_t timeUs;
+ int32_t keyFrame;
+
+ if (aBuffer == nullptr) {
+ GVDM_LOG("Video Buffer is not valid!");
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ AutoReleaseMediaBuffer autoRelease(aBuffer, mDecoder.get());
+
+ if (!aBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) {
+ GVDM_LOG("Decoder did not return frame time");
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ if (mLastTime > timeUs) {
+ GVDM_LOG("Output decoded sample time is revert. time=%lld", timeUs);
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ mLastTime = timeUs;
+
+ if (aBuffer->range_length() == 0) {
+ // Some decoders may return spurious empty buffers that we just want to ignore
+ // quoted from Android's AwesomePlayer.cpp
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ if (!aBuffer->meta_data()->findInt32(kKeyIsSyncFrame, &keyFrame)) {
+ keyFrame = 0;
+ }
+
+ gfx::IntRect picture =
+ mConfig.ScaledImageRect(mFrameInfo.mWidth, mFrameInfo.mHeight);
+ if (aBuffer->graphicBuffer().get()) {
+ data = CreateVideoDataFromGraphicBuffer(aBuffer, picture);
+ if (data && !mNeedsCopyBuffer) {
+ // RecycleCallback() will be responsible for release the buffer.
+ autoRelease.forget();
+ }
+ mNeedsCopyBuffer = false;
+ } else {
+ data = CreateVideoDataFromDataBuffer(aBuffer, picture);
+ }
+
+ if (!data) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ // Fill necessary info.
+ data->mOffset = aStreamOffset;
+ data->mTime = timeUs;
+ data->mKeyframe = keyFrame;
+
+ data.forget(v);
+ return NS_OK;
+}
+
+// Copy pixels from one planar YUV to another.
+static void
+CopyYUV(PlanarYCbCrData& aSource, PlanarYCbCrData& aDestination)
+{
+ // Fill Y plane.
+ uint8_t* srcY = aSource.mYChannel;
+ gfx::IntSize ySize = aSource.mYSize;
+ uint8_t* destY = aDestination.mYChannel;
+ // Y plane.
+ for (int i = 0; i < ySize.height; i++) {
+ memcpy(destY, srcY, ySize.width);
+ srcY += aSource.mYStride;
+ destY += aDestination.mYStride;
+ }
+
+ // Fill UV plane.
+ // Line start
+ uint8_t* srcU = aSource.mCbChannel;
+ uint8_t* srcV = aSource.mCrChannel;
+ uint8_t* destU = aDestination.mCbChannel;
+ uint8_t* destV = aDestination.mCrChannel;
+
+ gfx::IntSize uvSize = aSource.mCbCrSize;
+ for (int i = 0; i < uvSize.height; i++) {
+ uint8_t* su = srcU;
+ uint8_t* sv = srcV;
+ uint8_t* du = destU;
+ uint8_t* dv =destV;
+ for (int j = 0; j < uvSize.width; j++) {
+ *du++ = *su++;
+ *dv++ = *sv++;
+ // Move to next pixel.
+ su += aSource.mCbSkip;
+ sv += aSource.mCrSkip;
+ du += aDestination.mCbSkip;
+ dv += aDestination.mCrSkip;
+ }
+ // Move to next line.
+ srcU += aSource.mCbCrStride;
+ srcV += aSource.mCbCrStride;
+ destU += aDestination.mCbCrStride;
+ destV += aDestination.mCbCrStride;
+ }
+}
+
+inline static int
+Align(int aX, int aAlign)
+{
+ return (aX + aAlign - 1) & ~(aAlign - 1);
+}
+
+// Venus formats are doucmented in kernel/include/media/msm_media_info.h:
+// * Y_Stride : Width aligned to 128
+// * UV_Stride : Width aligned to 128
+// * Y_Scanlines: Height aligned to 32
+// * UV_Scanlines: Height/2 aligned to 16
+// * Total size = align((Y_Stride * Y_Scanlines
+// * + UV_Stride * UV_Scanlines + 4096), 4096)
+static void
+CopyVenus(uint8_t* aSrc, uint8_t* aDest, uint32_t aWidth, uint32_t aHeight)
+{
+ size_t yStride = Align(aWidth, 128);
+ uint8_t* s = aSrc;
+ uint8_t* d = aDest;
+ for (size_t i = 0; i < aHeight; i++) {
+ memcpy(d, s, aWidth);
+ s += yStride;
+ d += yStride;
+ }
+ size_t uvStride = yStride;
+ size_t uvLines = (aHeight + 1) / 2;
+ size_t ySize = yStride * Align(aHeight, 32);
+ s = aSrc + ySize;
+ d = aDest + ySize;
+ for (size_t i = 0; i < uvLines; i++) {
+ memcpy(d, s, aWidth);
+ s += uvStride;
+ d += uvStride;
+ }
+}
+
+static void
+CopyGraphicBuffer(sp<GraphicBuffer>& aSource, sp<GraphicBuffer>& aDestination)
+{
+ void* srcPtr = nullptr;
+ aSource->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &srcPtr);
+ void* destPtr = nullptr;
+ aDestination->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN, &destPtr);
+ MOZ_ASSERT(srcPtr && destPtr);
+
+ // Build PlanarYCbCrData for source buffer.
+ PlanarYCbCrData srcData;
+ switch (aSource->getPixelFormat()) {
+ case HAL_PIXEL_FORMAT_YV12: {
+ // Android YV12 format is defined in system/core/include/system/graphics.h
+ srcData.mYChannel = static_cast<uint8_t*>(srcPtr);
+ srcData.mYSkip = 0;
+ srcData.mYSize.width = aSource->getWidth();
+ srcData.mYSize.height = aSource->getHeight();
+ srcData.mYStride = aSource->getStride();
+ // 4:2:0.
+ srcData.mCbCrSize.width = srcData.mYSize.width / 2;
+ srcData.mCbCrSize.height = srcData.mYSize.height / 2;
+ srcData.mCrChannel = srcData.mYChannel + (srcData.mYStride * srcData.mYSize.height);
+ // Aligned to 16 bytes boundary.
+ srcData.mCbCrStride = Align(srcData.mYStride / 2, 16);
+ srcData.mCrSkip = 0;
+ srcData.mCbChannel = srcData.mCrChannel + (srcData.mCbCrStride * srcData.mCbCrSize.height);
+ srcData.mCbSkip = 0;
+
+ // Build PlanarYCbCrData for destination buffer.
+ PlanarYCbCrData destData;
+ destData.mYChannel = static_cast<uint8_t*>(destPtr);
+ destData.mYSkip = 0;
+ destData.mYSize.width = aDestination->getWidth();
+ destData.mYSize.height = aDestination->getHeight();
+ destData.mYStride = aDestination->getStride();
+ // 4:2:0.
+ destData.mCbCrSize.width = destData.mYSize.width / 2;
+ destData.mCbCrSize.height = destData.mYSize.height / 2;
+ destData.mCrChannel = destData.mYChannel + (destData.mYStride * destData.mYSize.height);
+ // Aligned to 16 bytes boundary.
+ destData.mCbCrStride = Align(destData.mYStride / 2, 16);
+ destData.mCrSkip = 0;
+ destData.mCbChannel = destData.mCrChannel + (destData.mCbCrStride * destData.mCbCrSize.height);
+ destData.mCbSkip = 0;
+
+ CopyYUV(srcData, destData);
+ break;
+ }
+ case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
+ CopyVenus(static_cast<uint8_t*>(srcPtr),
+ static_cast<uint8_t*>(destPtr),
+ aSource->getWidth(),
+ aSource->getHeight());
+ break;
+ default:
+ NS_ERROR("Unsupported input gralloc image type. Should never be here.");
+ }
+
+
+ aSource->unlock();
+ aDestination->unlock();
+}
+
+already_AddRefed<VideoData>
+GonkVideoDecoderManager::CreateVideoDataFromGraphicBuffer(MediaBuffer* aSource,
+ gfx::IntRect& aPicture)
+{
+ sp<GraphicBuffer> srcBuffer(aSource->graphicBuffer());
+ RefPtr<TextureClient> textureClient;
+
+ if (mNeedsCopyBuffer) {
+ // Copy buffer contents for bug 1199809.
+ if (!mCopyAllocator) {
+ RefPtr<layers::ImageBridgeChild> bridge = layers::ImageBridgeChild::GetSingleton();
+ mCopyAllocator = new TextureClientRecycleAllocator(bridge);
+ }
+ if (!mCopyAllocator) {
+ GVDM_LOG("Create buffer allocator failed!");
+ return nullptr;
+ }
+
+ gfx::IntSize size(srcBuffer->getWidth(), srcBuffer->getHeight());
+ GonkTextureClientAllocationHelper helper(srcBuffer->getPixelFormat(), size);
+ textureClient = mCopyAllocator->CreateOrRecycle(helper);
+ if (!textureClient) {
+ GVDM_LOG("Copy buffer allocation failed!");
+ return nullptr;
+ }
+
+ sp<GraphicBuffer> destBuffer =
+ static_cast<GrallocTextureData*>(textureClient->GetInternalData())->GetGraphicBuffer();
+
+ CopyGraphicBuffer(srcBuffer, destBuffer);
+ } else {
+ textureClient = mNativeWindow->getTextureClientFromBuffer(srcBuffer.get());
+ textureClient->SetRecycleCallback(GonkVideoDecoderManager::RecycleCallback, this);
+ static_cast<GrallocTextureData*>(textureClient->GetInternalData())->SetMediaBuffer(aSource);
+ }
+
+ RefPtr<VideoData> data =
+ VideoData::CreateAndCopyIntoTextureClient(mConfig,
+ 0, // Filled later by caller.
+ 0, // Filled later by caller.
+ 1, // No way to pass sample duration from muxer to
+ // OMX codec, so we hardcode the duration here.
+ textureClient,
+ false, // Filled later by caller.
+ -1,
+ aPicture);
+ return data.forget();
+}
+
+already_AddRefed<VideoData>
+GonkVideoDecoderManager::CreateVideoDataFromDataBuffer(MediaBuffer* aSource, gfx::IntRect& aPicture)
+{
+ if (!aSource->data()) {
+ GVDM_LOG("No data in Video Buffer!");
+ return nullptr;
+ }
+ uint8_t *yuv420p_buffer = (uint8_t *)aSource->data();
+ int32_t stride = mFrameInfo.mStride;
+ int32_t slice_height = mFrameInfo.mSliceHeight;
+
+ // Converts to OMX_COLOR_FormatYUV420Planar
+ if (mFrameInfo.mColorFormat != OMX_COLOR_FormatYUV420Planar) {
+ ARect crop;
+ crop.top = 0;
+ crop.bottom = mFrameInfo.mHeight;
+ crop.left = 0;
+ crop.right = mFrameInfo.mWidth;
+ yuv420p_buffer = GetColorConverterBuffer(mFrameInfo.mWidth, mFrameInfo.mHeight);
+ if (mColorConverter.convertDecoderOutputToI420(aSource->data(),
+ mFrameInfo.mWidth, mFrameInfo.mHeight, crop, yuv420p_buffer) != OK) {
+ GVDM_LOG("Color conversion failed!");
+ return nullptr;
+ }
+ stride = mFrameInfo.mWidth;
+ slice_height = mFrameInfo.mHeight;
+ }
+
+ size_t yuv420p_y_size = stride * slice_height;
+ size_t yuv420p_u_size = ((stride + 1) / 2) * ((slice_height + 1) / 2);
+ uint8_t *yuv420p_y = yuv420p_buffer;
+ uint8_t *yuv420p_u = yuv420p_y + yuv420p_y_size;
+ uint8_t *yuv420p_v = yuv420p_u + yuv420p_u_size;
+
+ VideoData::YCbCrBuffer b;
+ b.mPlanes[0].mData = yuv420p_y;
+ b.mPlanes[0].mWidth = mFrameInfo.mWidth;
+ b.mPlanes[0].mHeight = mFrameInfo.mHeight;
+ b.mPlanes[0].mStride = stride;
+ b.mPlanes[0].mOffset = 0;
+ b.mPlanes[0].mSkip = 0;
+
+ b.mPlanes[1].mData = yuv420p_u;
+ b.mPlanes[1].mWidth = (mFrameInfo.mWidth + 1) / 2;
+ b.mPlanes[1].mHeight = (mFrameInfo.mHeight + 1) / 2;
+ b.mPlanes[1].mStride = (stride + 1) / 2;
+ b.mPlanes[1].mOffset = 0;
+ b.mPlanes[1].mSkip = 0;
+
+ b.mPlanes[2].mData = yuv420p_v;
+ b.mPlanes[2].mWidth =(mFrameInfo.mWidth + 1) / 2;
+ b.mPlanes[2].mHeight = (mFrameInfo.mHeight + 1) / 2;
+ b.mPlanes[2].mStride = (stride + 1) / 2;
+ b.mPlanes[2].mOffset = 0;
+ b.mPlanes[2].mSkip = 0;
+
+ RefPtr<VideoData> data =
+ VideoData::CreateAndCopyData(mConfig,
+ mImageContainer,
+ 0, // Filled later by caller.
+ 0, // Filled later by caller.
+ 1, // We don't know the duration.
+ b,
+ 0, // Filled later by caller.
+ -1,
+ aPicture);
+
+ return data.forget();
+}
+
+bool
+GonkVideoDecoderManager::SetVideoFormat()
+{
+ // read video metadata from MediaCodec
+ sp<AMessage> codecFormat;
+ if (mDecoder->getOutputFormat(&codecFormat) == OK) {
+ AString mime;
+ int32_t width = 0;
+ int32_t height = 0;
+ int32_t stride = 0;
+ int32_t slice_height = 0;
+ int32_t color_format = 0;
+ int32_t crop_left = 0;
+ int32_t crop_top = 0;
+ int32_t crop_right = 0;
+ int32_t crop_bottom = 0;
+ if (!codecFormat->findString("mime", &mime) ||
+ !codecFormat->findInt32("width", &width) ||
+ !codecFormat->findInt32("height", &height) ||
+ !codecFormat->findInt32("stride", &stride) ||
+ !codecFormat->findInt32("slice-height", &slice_height) ||
+ !codecFormat->findInt32("color-format", &color_format) ||
+ !codecFormat->findRect("crop", &crop_left, &crop_top, &crop_right, &crop_bottom)) {
+ GVDM_LOG("Failed to find values");
+ return false;
+ }
+ mFrameInfo.mWidth = width;
+ mFrameInfo.mHeight = height;
+ mFrameInfo.mStride = stride;
+ mFrameInfo.mSliceHeight = slice_height;
+ mFrameInfo.mColorFormat = color_format;
+
+ nsIntSize displaySize(width, height);
+ if (!IsValidVideoRegion(mConfig.mDisplay,
+ mConfig.ScaledImageRect(width, height),
+ displaySize)) {
+ GVDM_LOG("It is not a valid region");
+ return false;
+ }
+ return true;
+ }
+ GVDM_LOG("Fail to get output format");
+ return false;
+}
+
+// Blocks until decoded sample is produced by the deoder.
+nsresult
+GonkVideoDecoderManager::Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutData)
+{
+ aOutData = nullptr;
+ status_t err;
+ if (mDecoder == nullptr) {
+ GVDM_LOG("Decoder is not inited");
+ return NS_ERROR_UNEXPECTED;
+ }
+ MediaBuffer* outputBuffer = nullptr;
+ err = mDecoder->Output(&outputBuffer, READ_OUTPUT_BUFFER_TIMEOUT_US);
+
+ switch (err) {
+ case OK:
+ {
+ RefPtr<VideoData> data;
+ nsresult rv = CreateVideoData(outputBuffer, aStreamOffset, getter_AddRefs(data));
+ if (rv == NS_ERROR_NOT_AVAILABLE) {
+ // Decoder outputs a empty video buffer, try again
+ return NS_ERROR_NOT_AVAILABLE;
+ } else if (rv != NS_OK || data == nullptr) {
+ GVDM_LOG("Failed to create VideoData");
+ return NS_ERROR_UNEXPECTED;
+ }
+ aOutData = data;
+ return NS_OK;
+ }
+ case android::INFO_FORMAT_CHANGED:
+ {
+ // If the format changed, update our cached info.
+ GVDM_LOG("Decoder format changed");
+ if (!SetVideoFormat()) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ return Output(aStreamOffset, aOutData);
+ }
+ case android::INFO_OUTPUT_BUFFERS_CHANGED:
+ {
+ if (mDecoder->UpdateOutputBuffers()) {
+ return Output(aStreamOffset, aOutData);
+ }
+ GVDM_LOG("Fails to update output buffers!");
+ return NS_ERROR_FAILURE;
+ }
+ case -EAGAIN:
+ {
+// GVDM_LOG("Need to try again!");
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ case android::ERROR_END_OF_STREAM:
+ {
+ GVDM_LOG("Got the EOS frame!");
+ RefPtr<VideoData> data;
+ nsresult rv = CreateVideoData(outputBuffer, aStreamOffset, getter_AddRefs(data));
+ if (rv == NS_ERROR_NOT_AVAILABLE) {
+ // For EOS, no need to do any thing.
+ return NS_ERROR_ABORT;
+ }
+ if (rv != NS_OK || data == nullptr) {
+ GVDM_LOG("Failed to create video data");
+ return NS_ERROR_UNEXPECTED;
+ }
+ aOutData = data;
+ return NS_ERROR_ABORT;
+ }
+ case -ETIMEDOUT:
+ {
+ GVDM_LOG("Timeout. can try again next time");
+ return NS_ERROR_UNEXPECTED;
+ }
+ default:
+ {
+ GVDM_LOG("Decoder failed, err=%d", err);
+ return NS_ERROR_UNEXPECTED;
+ }
+ }
+
+ return NS_OK;
+}
+
+void
+GonkVideoDecoderManager::codecReserved()
+{
+ if (mInitPromise.IsEmpty()) {
+ return;
+ }
+ GVDM_LOG("codecReserved");
+ sp<AMessage> format = new AMessage;
+ sp<Surface> surface;
+ status_t rv = OK;
+ // Fixed values
+ GVDM_LOG("Configure video mime type: %s, width:%d, height:%d", mConfig.mMimeType.get(), mConfig.mImage.width, mConfig.mImage.height);
+ format->setString("mime", mConfig.mMimeType.get());
+ format->setInt32("width", mConfig.mImage.width);
+ format->setInt32("height", mConfig.mImage.height);
+ // Set the "moz-use-undequeued-bufs" to use the undeque buffers to accelerate
+ // the video decoding.
+ format->setInt32("moz-use-undequeued-bufs", 1);
+ if (mNativeWindow != nullptr) {
+#if ANDROID_VERSION >= 21
+ surface = new Surface(mGraphicBufferProducer);
+#else
+ surface = new Surface(mNativeWindow->getBufferQueue());
+#endif
+ }
+ mDecoder->configure(format, surface, nullptr, 0);
+ mDecoder->Prepare();
+
+ if (mConfig.mMimeType.EqualsLiteral("video/mp4v-es")) {
+ rv = mDecoder->Input(mConfig.mCodecSpecificConfig->Elements(),
+ mConfig.mCodecSpecificConfig->Length(), 0,
+ android::MediaCodec::BUFFER_FLAG_CODECCONFIG,
+ CODECCONFIG_TIMEOUT_US);
+ }
+
+ if (rv != OK) {
+ GVDM_LOG("Failed to configure codec!!!!");
+ mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ return;
+ }
+
+ mInitPromise.Resolve(TrackType::kVideoTrack, __func__);
+}
+
+void
+GonkVideoDecoderManager::codecCanceled()
+{
+ GVDM_LOG("codecCanceled");
+ mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
+}
+
+// Called on GonkDecoderManager::mTaskLooper thread.
+void
+GonkVideoDecoderManager::onMessageReceived(const sp<AMessage> &aMessage)
+{
+ switch (aMessage->what()) {
+ case kNotifyPostReleaseBuffer:
+ {
+ ReleaseAllPendingVideoBuffers();
+ break;
+ }
+
+ default:
+ {
+ GonkDecoderManager::onMessageReceived(aMessage);
+ break;
+ }
+ }
+}
+
+uint8_t *
+GonkVideoDecoderManager::GetColorConverterBuffer(int32_t aWidth, int32_t aHeight)
+{
+ // Allocate a temporary YUV420Planer buffer.
+ size_t yuv420p_y_size = aWidth * aHeight;
+ size_t yuv420p_u_size = ((aWidth + 1) / 2) * ((aHeight + 1) / 2);
+ size_t yuv420p_v_size = yuv420p_u_size;
+ size_t yuv420p_size = yuv420p_y_size + yuv420p_u_size + yuv420p_v_size;
+ if (mColorConverterBufferSize != yuv420p_size) {
+ mColorConverterBuffer = MakeUnique<uint8_t[]>(yuv420p_size);
+ mColorConverterBufferSize = yuv420p_size;
+ }
+ return mColorConverterBuffer.get();
+}
+
+/* static */
+void
+GonkVideoDecoderManager::RecycleCallback(TextureClient* aClient, void* aClosure)
+{
+ MOZ_ASSERT(aClient && !aClient->IsDead());
+ GonkVideoDecoderManager* videoManager = static_cast<GonkVideoDecoderManager*>(aClosure);
+ GrallocTextureData* client = static_cast<GrallocTextureData*>(aClient->GetInternalData());
+ aClient->ClearRecycleCallback();
+ FenceHandle handle = aClient->GetAndResetReleaseFenceHandle();
+ videoManager->PostReleaseVideoBuffer(client->GetMediaBuffer(), handle);
+}
+
+void GonkVideoDecoderManager::PostReleaseVideoBuffer(
+ android::MediaBuffer *aBuffer,
+ FenceHandle aReleaseFence)
+{
+ {
+ MutexAutoLock autoLock(mPendingReleaseItemsLock);
+ if (aBuffer) {
+ mPendingReleaseItems.AppendElement(ReleaseItem(aBuffer, aReleaseFence));
+ }
+ }
+ sp<AMessage> notify =
+ new AMessage(kNotifyPostReleaseBuffer, id());
+ notify->post();
+
+}
+
+void GonkVideoDecoderManager::ReleaseAllPendingVideoBuffers()
+{
+ nsTArray<ReleaseItem> releasingItems;
+ {
+ MutexAutoLock autoLock(mPendingReleaseItemsLock);
+ releasingItems.AppendElements(mPendingReleaseItems);
+ mPendingReleaseItems.Clear();
+ }
+
+ // Free all pending video buffers without holding mPendingReleaseItemsLock.
+ size_t size = releasingItems.Length();
+ for (size_t i = 0; i < size; i++) {
+ RefPtr<FenceHandle::FdObj> fdObj = releasingItems[i].mReleaseFence.GetAndResetFdObj();
+ sp<Fence> fence = new Fence(fdObj->GetAndResetFd());
+ fence->waitForever("GonkVideoDecoderManager");
+ mDecoder->ReleaseMediaBuffer(releasingItems[i].mBuffer);
+ }
+ releasingItems.Clear();
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/gonk/GonkVideoDecoderManager.h b/dom/media/platforms/gonk/GonkVideoDecoderManager.h
new file mode 100644
index 000000000..343bb2a5c
--- /dev/null
+++ b/dom/media/platforms/gonk/GonkVideoDecoderManager.h
@@ -0,0 +1,149 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GonkVideoDecoderManager_h_)
+#define GonkVideoDecoderManager_h_
+
+#include "nsRect.h"
+#include "GonkMediaDataDecoder.h"
+#include "mozilla/RefPtr.h"
+#include "I420ColorConverterHelper.h"
+#include "MediaCodecProxy.h"
+#include "GonkNativeWindow.h"
+#include "mozilla/layers/FenceUtils.h"
+#include "mozilla/UniquePtr.h"
+#include <ui/Fence.h>
+
+using namespace android;
+
+namespace android {
+class MediaBuffer;
+struct MOZ_EXPORT AString;
+class GonkNativeWindow;
+} // namespace android
+
+namespace mozilla {
+
+namespace layers {
+class TextureClient;
+class TextureClientRecycleAllocator;
+} // namespace mozilla::layers
+
+class GonkVideoDecoderManager : public GonkDecoderManager {
+typedef android::MediaCodecProxy MediaCodecProxy;
+typedef mozilla::layers::TextureClient TextureClient;
+
+public:
+ GonkVideoDecoderManager(mozilla::layers::ImageContainer* aImageContainer,
+ const VideoInfo& aConfig);
+
+ virtual ~GonkVideoDecoderManager();
+
+ RefPtr<InitPromise> Init() override;
+
+ nsresult Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutput) override;
+
+ nsresult Shutdown() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "gonk video decoder";
+ }
+
+ static void RecycleCallback(TextureClient* aClient, void* aClosure);
+
+protected:
+ // Bug 1199809: workaround to avoid sending the graphic buffer by making a
+ // copy of output buffer after calling flush(). Bug 1203859 was created to
+ // reimplementing Gonk PDM on top of OpenMax IL directly. Its buffer
+ // management will work better with Gecko and solve problems like this.
+ void ProcessFlush() override
+ {
+ mNeedsCopyBuffer = true;
+ GonkDecoderManager::ProcessFlush();
+ }
+
+private:
+ struct FrameInfo
+ {
+ int32_t mWidth = 0;
+ int32_t mHeight = 0;
+ int32_t mStride = 0;
+ int32_t mSliceHeight = 0;
+ int32_t mColorFormat = 0;
+ int32_t mCropLeft = 0;
+ int32_t mCropTop = 0;
+ int32_t mCropRight = 0;
+ int32_t mCropBottom = 0;
+ };
+
+ void onMessageReceived(const android::sp<android::AMessage> &aMessage) override;
+
+ bool SetVideoFormat();
+
+ nsresult CreateVideoData(MediaBuffer* aBuffer, int64_t aStreamOffset, VideoData** aOutData);
+ already_AddRefed<VideoData> CreateVideoDataFromGraphicBuffer(android::MediaBuffer* aSource,
+ gfx::IntRect& aPicture);
+ already_AddRefed<VideoData> CreateVideoDataFromDataBuffer(android::MediaBuffer* aSource,
+ gfx::IntRect& aPicture);
+
+ uint8_t* GetColorConverterBuffer(int32_t aWidth, int32_t aHeight);
+
+ // For codec resource management
+ void codecReserved();
+ void codecCanceled();
+
+ void ReleaseAllPendingVideoBuffers();
+ void PostReleaseVideoBuffer(android::MediaBuffer *aBuffer,
+ layers::FenceHandle mReleaseFence);
+
+ VideoInfo mConfig;
+
+ RefPtr<layers::ImageContainer> mImageContainer;
+ RefPtr<layers::TextureClientRecycleAllocator> mCopyAllocator;
+
+ MozPromiseRequestHolder<android::MediaCodecProxy::CodecPromise> mVideoCodecRequest;
+ FrameInfo mFrameInfo;
+
+ // color converter
+ android::I420ColorConverterHelper mColorConverter;
+ UniquePtr<uint8_t[]> mColorConverterBuffer;
+ size_t mColorConverterBufferSize;
+
+ android::sp<android::GonkNativeWindow> mNativeWindow;
+#if ANDROID_VERSION >= 21
+ android::sp<android::IGraphicBufferProducer> mGraphicBufferProducer;
+#endif
+
+ enum {
+ kNotifyPostReleaseBuffer = 'nprb',
+ };
+
+ struct ReleaseItem {
+ ReleaseItem(android::MediaBuffer* aBuffer, layers::FenceHandle& aFence)
+ : mBuffer(aBuffer)
+ , mReleaseFence(aFence) {}
+ android::MediaBuffer* mBuffer;
+ layers::FenceHandle mReleaseFence;
+ };
+ nsTArray<ReleaseItem> mPendingReleaseItems;
+
+ // The lock protects mPendingReleaseItems.
+ Mutex mPendingReleaseItemsLock;
+
+ // This TaskQueue should be the same one in mDecodeCallback->OnReaderTaskQueue().
+ // It is for codec resource mangement, decoding task should not dispatch to it.
+ RefPtr<TaskQueue> mReaderTaskQueue;
+
+ // Bug 1199809: do we need to make a copy of output buffer? Used only when
+ // the decoder outputs graphic buffers.
+ bool mNeedsCopyBuffer;
+};
+
+} // namespace mozilla
+
+#endif // GonkVideoDecoderManager_h_
diff --git a/dom/media/platforms/gonk/moz.build b/dom/media/platforms/gonk/moz.build
new file mode 100644
index 000000000..014594977
--- /dev/null
+++ b/dom/media/platforms/gonk/moz.build
@@ -0,0 +1,39 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'GonkAudioDecoderManager.h',
+ 'GonkDecoderModule.h',
+ 'GonkMediaDataDecoder.h',
+ 'GonkVideoDecoderManager.h',
+]
+UNIFIED_SOURCES += [
+ 'GonkAudioDecoderManager.cpp',
+ 'GonkDecoderModule.cpp',
+ 'GonkMediaDataDecoder.cpp',
+ 'GonkVideoDecoderManager.cpp',
+]
+LOCAL_INCLUDES += [
+ '/dom/media/omx/',
+]
+include('/ipc/chromium/chromium-config.mozbuild')
+
+# Suppress some GCC/clang warnings being treated as errors:
+# - about attributes on forward declarations for types that are already
+# defined, which complains about an important MOZ_EXPORT for android::AString
+# - about multi-character constants which are used in codec-related code
+if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
+ CXXFLAGS += [
+ '-Wno-error=attributes',
+ '-Wno-error=multichar'
+ ]
+
+FINAL_LIBRARY = 'xul'
+
+LOCAL_INCLUDES += [
+ '%' + '%s/%s' % (CONFIG['ANDROID_SOURCE'], d) for d in [
+ 'frameworks/native/opengl/include',]
+]
diff --git a/dom/media/platforms/moz.build b/dom/media/platforms/moz.build
new file mode 100644
index 000000000..310820c91
--- /dev/null
+++ b/dom/media/platforms/moz.build
@@ -0,0 +1,92 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'agnostic/AgnosticDecoderModule.h',
+ 'agnostic/OpusDecoder.h',
+ 'agnostic/TheoraDecoder.h',
+ 'agnostic/VorbisDecoder.h',
+ 'agnostic/VPXDecoder.h',
+ 'MediaTelemetryConstants.h',
+ 'PDMFactory.h',
+ 'PlatformDecoderModule.h',
+ 'wrappers/FuzzingWrapper.h',
+ 'wrappers/H264Converter.h'
+]
+
+UNIFIED_SOURCES += [
+ 'agnostic/AgnosticDecoderModule.cpp',
+ 'agnostic/BlankDecoderModule.cpp',
+ 'agnostic/OpusDecoder.cpp',
+ 'agnostic/TheoraDecoder.cpp',
+ 'agnostic/VorbisDecoder.cpp',
+ 'agnostic/VPXDecoder.cpp',
+ 'agnostic/WAVDecoder.cpp',
+ 'PDMFactory.cpp',
+ 'wrappers/FuzzingWrapper.cpp',
+ 'wrappers/H264Converter.cpp'
+]
+
+DIRS += [
+ 'agnostic/eme',
+ 'agnostic/gmp',
+ 'omx'
+]
+
+if CONFIG['MOZ_WMF']:
+ DIRS += [ 'wmf' ];
+
+if CONFIG['MOZ_FFVPX'] or CONFIG['MOZ_FFMPEG']:
+ # common code to either FFmpeg or FFVPX
+ UNIFIED_SOURCES += [
+ 'ffmpeg/FFmpegLibWrapper.cpp',
+ ]
+
+if CONFIG['MOZ_FFVPX']:
+ DIRS += [
+ 'ffmpeg/ffvpx',
+ ]
+
+if CONFIG['MOZ_FFMPEG']:
+ DIRS += [
+ 'ffmpeg',
+ ]
+
+if CONFIG['MOZ_APPLEMEDIA']:
+ EXPORTS += [
+ 'apple/AppleDecoderModule.h',
+ ]
+ UNIFIED_SOURCES += [
+ 'apple/AppleATDecoder.cpp',
+ 'apple/AppleCMLinker.cpp',
+ 'apple/AppleDecoderModule.cpp',
+ 'apple/AppleVTDecoder.cpp',
+ 'apple/AppleVTLinker.cpp',
+ ]
+ OS_LIBS += [
+ '-framework AudioToolbox',
+ ]
+
+if CONFIG['MOZ_GONK_MEDIACODEC']:
+ DEFINES['MOZ_GONK_MEDIACODEC'] = True
+ DIRS += ['gonk']
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
+ EXPORTS += [
+ 'android/AndroidDecoderModule.h',
+ ]
+ UNIFIED_SOURCES += [
+ 'android/AndroidDecoderModule.cpp',
+ 'android/MediaCodecDataDecoder.cpp',
+ 'android/RemoteDataDecoder.cpp',
+ ]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/platforms/omx/GonkOmxPlatformLayer.cpp b/dom/media/platforms/omx/GonkOmxPlatformLayer.cpp
new file mode 100644
index 000000000..870566cf5
--- /dev/null
+++ b/dom/media/platforms/omx/GonkOmxPlatformLayer.cpp
@@ -0,0 +1,667 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GonkOmxPlatformLayer.h"
+
+#include <binder/MemoryDealer.h>
+#include <cutils/properties.h>
+#include <media/IOMX.h>
+#include <media/stagefright/MediaCodecList.h>
+#include <utils/List.h>
+
+#include "mozilla/Monitor.h"
+#include "mozilla/layers/TextureClient.h"
+#include "mozilla/layers/GrallocTextureClient.h"
+#include "mozilla/layers/ImageBridgeChild.h"
+#include "mozilla/layers/TextureClientRecycleAllocator.h"
+
+#include "ImageContainer.h"
+#include "MediaInfo.h"
+#include "OmxDataDecoder.h"
+
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#define LOG(arg, ...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, ("GonkOmxPlatformLayer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+#define CHECK_ERR(err) \
+ if (err != OK) { \
+ LOG("error %d at %s", err, __func__); \
+ return NS_ERROR_FAILURE; \
+ } \
+
+// Android proprietary value.
+#define ANDROID_OMX_VIDEO_CodingVP8 (static_cast<OMX_VIDEO_CODINGTYPE>(9))
+
+using namespace android;
+
+namespace mozilla {
+
+// In Gonk, the software component name has prefix "OMX.google". It needs to
+// have a way to use hardware codec first.
+bool IsSoftwareCodec(const char* aComponentName)
+{
+ nsAutoCString str(aComponentName);
+ return (str.Find(NS_LITERAL_CSTRING("OMX.google.")) == -1 ? false : true);
+}
+
+bool IsInEmulator()
+{
+ char propQemu[PROPERTY_VALUE_MAX];
+ property_get("ro.kernel.qemu", propQemu, "");
+ return !strncmp(propQemu, "1", 1);
+}
+
+class GonkOmxObserver : public BnOMXObserver {
+public:
+ void onMessage(const omx_message& aMsg)
+ {
+ switch (aMsg.type) {
+ case omx_message::EVENT:
+ {
+ sp<GonkOmxObserver> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self, aMsg] () {
+ if (self->mClient && self->mClient->Event(aMsg.u.event_data.event,
+ aMsg.u.event_data.data1,
+ aMsg.u.event_data.data2))
+ {
+ return;
+ }
+ });
+ mTaskQueue->Dispatch(r.forget());
+ break;
+ }
+ case omx_message::EMPTY_BUFFER_DONE:
+ {
+ sp<GonkOmxObserver> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self, aMsg] () {
+ if (!self->mPromiseLayer) {
+ return;
+ }
+ BufferData::BufferID id = (BufferData::BufferID)aMsg.u.buffer_data.buffer;
+ self->mPromiseLayer->EmptyFillBufferDone(OMX_DirInput, id);
+ });
+ mTaskQueue->Dispatch(r.forget());
+ break;
+ }
+ case omx_message::FILL_BUFFER_DONE:
+ {
+ sp<GonkOmxObserver> self = this;
+ nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([self, aMsg] () {
+ if (!self->mPromiseLayer) {
+ return;
+ }
+
+ // TODO: these codes look a little ugly, it'd be better to improve them.
+ RefPtr<BufferData> buf;
+ BufferData::BufferID id = (BufferData::BufferID)aMsg.u.extended_buffer_data.buffer;
+ buf = self->mPromiseLayer->FindAndRemoveBufferHolder(OMX_DirOutput, id);
+ MOZ_RELEASE_ASSERT(buf);
+ GonkBufferData* gonkBuffer = static_cast<GonkBufferData*>(buf.get());
+
+ // Copy the critical information to local buffer.
+ if (gonkBuffer->IsLocalBuffer()) {
+ gonkBuffer->mBuffer->nOffset = aMsg.u.extended_buffer_data.range_offset;
+ gonkBuffer->mBuffer->nFilledLen = aMsg.u.extended_buffer_data.range_length;
+ gonkBuffer->mBuffer->nFlags = aMsg.u.extended_buffer_data.flags;
+ gonkBuffer->mBuffer->nTimeStamp = aMsg.u.extended_buffer_data.timestamp;
+ }
+ self->mPromiseLayer->EmptyFillBufferDone(OMX_DirOutput, buf);
+ });
+ mTaskQueue->Dispatch(r.forget());
+ break;
+ }
+ default:
+ {
+ LOG("Unhandle event %d", aMsg.type);
+ }
+ }
+ }
+
+ void Shutdown()
+ {
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ mPromiseLayer = nullptr;
+ mClient = nullptr;
+ }
+
+ GonkOmxObserver(TaskQueue* aTaskQueue, OmxPromiseLayer* aPromiseLayer, OmxDataDecoder* aDataDecoder)
+ : mTaskQueue(aTaskQueue)
+ , mPromiseLayer(aPromiseLayer)
+ , mClient(aDataDecoder)
+ {}
+
+protected:
+ RefPtr<TaskQueue> mTaskQueue;
+ // TODO:
+ // we should combine both event handlers into one. And we should provide
+ // an unified way for event handling in OmxPlatformLayer class.
+ RefPtr<OmxPromiseLayer> mPromiseLayer;
+ RefPtr<OmxDataDecoder> mClient;
+};
+
+// This class allocates Gralloc buffer and manages TextureClient's recycle.
+class GonkTextureClientRecycleHandler : public layers::ITextureClientRecycleAllocator
+{
+ typedef MozPromise<layers::TextureClient*, nsresult, /* IsExclusive = */ true> TextureClientRecyclePromise;
+
+public:
+ GonkTextureClientRecycleHandler(OMX_VIDEO_PORTDEFINITIONTYPE& aDef)
+ : ITextureClientRecycleAllocator()
+ , mMonitor("GonkTextureClientRecycleHandler")
+ {
+ RefPtr<layers::ImageBridgeChild> bridge = layers::ImageBridgeChild::GetSingleton();
+
+ // Allocate Gralloc texture memory.
+ layers::GrallocTextureData* textureData =
+ layers::GrallocTextureData::Create(gfx::IntSize(aDef.nFrameWidth, aDef.nFrameHeight),
+ aDef.eColorFormat,
+ gfx::BackendType::NONE,
+ GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_READ_OFTEN,
+ bridge);
+
+ mGraphBuffer = textureData->GetGraphicBuffer();
+ MOZ_ASSERT(mGraphBuffer.get());
+
+ mTextureClient =
+ layers::TextureClient::CreateWithData(textureData,
+ layers::TextureFlags::DEALLOCATE_CLIENT | layers::TextureFlags::RECYCLE,
+ bridge);
+ MOZ_ASSERT(mTextureClient);
+
+ mPromise.SetMonitor(&mMonitor);
+ }
+
+ RefPtr<TextureClientRecyclePromise> WaitforRecycle()
+ {
+ MonitorAutoLock lock(mMonitor);
+ MOZ_ASSERT(!!mGraphBuffer.get());
+
+ mTextureClient->SetRecycleAllocator(this);
+ return mPromise.Ensure(__func__);
+ }
+
+ // DO NOT use smart pointer to receive TextureClient; otherwise it will
+ // distrupt the reference count.
+ layers::TextureClient* GetTextureClient()
+ {
+ return mTextureClient;
+ }
+
+ GraphicBuffer* GetGraphicBuffer()
+ {
+ MonitorAutoLock lock(mMonitor);
+ return mGraphBuffer.get();
+ }
+
+ // This function is called from layers thread.
+ void RecycleTextureClient(layers::TextureClient* aClient) override
+ {
+ MOZ_ASSERT(mTextureClient == aClient);
+
+ // Clearing the recycle allocator drops a reference, so make sure we stay alive
+ // for the duration of this function.
+ RefPtr<GonkTextureClientRecycleHandler> kungFuDeathGrip(this);
+ aClient->SetRecycleAllocator(nullptr);
+
+ {
+ MonitorAutoLock lock(mMonitor);
+ mPromise.ResolveIfExists(mTextureClient, __func__);
+ }
+ }
+
+ void Shutdown()
+ {
+ MonitorAutoLock lock(mMonitor);
+
+ mPromise.RejectIfExists(NS_ERROR_FAILURE, __func__);
+
+ // DO NOT clear TextureClient here.
+ // The ref count could be 1 and RecycleCallback will be called if we clear
+ // the ref count here. That breaks the whole mechanism. (RecycleCallback
+ // should be called from layers)
+ mGraphBuffer = nullptr;
+ }
+
+private:
+ // Because TextureClient calls RecycleCallbackl when ref count is 1, so we
+ // should hold only one reference here and use raw pointer when out of this
+ // class.
+ RefPtr<layers::TextureClient> mTextureClient;
+
+ // It is protected by mMonitor.
+ sp<android::GraphicBuffer> mGraphBuffer;
+
+ // It is protected by mMonitor.
+ MozPromiseHolder<TextureClientRecyclePromise> mPromise;
+
+ Monitor mMonitor;
+};
+
+GonkBufferData::GonkBufferData(bool aLiveInLocal,
+ GonkOmxPlatformLayer* aGonkPlatformLayer)
+ : BufferData(nullptr)
+ , mId(0)
+ , mGonkPlatformLayer(aGonkPlatformLayer)
+{
+ if (!aLiveInLocal) {
+ mMirrorBuffer = new OMX_BUFFERHEADERTYPE;
+ PodZero(mMirrorBuffer.get());
+ mBuffer = mMirrorBuffer.get();
+ }
+}
+
+void
+GonkBufferData::ReleaseBuffer()
+{
+ if (mTextureClientRecycleHandler) {
+ mTextureClientRecycleHandler->Shutdown();
+ mTextureClientRecycleHandler = nullptr;
+ }
+}
+
+nsresult
+GonkBufferData::InitSharedMemory(android::IMemory* aMemory)
+{
+ MOZ_RELEASE_ASSERT(mMirrorBuffer.get());
+
+ // aMemory is a IPC memory, it is safe to use it here.
+ mBuffer->pBuffer = (OMX_U8*)aMemory->pointer();
+ mBuffer->nAllocLen = aMemory->size();
+ return NS_OK;
+}
+
+nsresult
+GonkBufferData::InitLocalBuffer(IOMX::buffer_id aId)
+{
+ MOZ_RELEASE_ASSERT(!mMirrorBuffer.get());
+
+ mBuffer = (OMX_BUFFERHEADERTYPE*)aId;
+ return NS_OK;
+}
+
+nsresult
+GonkBufferData::InitGraphicBuffer(OMX_VIDEO_PORTDEFINITIONTYPE& aDef)
+{
+ mTextureClientRecycleHandler = new GonkTextureClientRecycleHandler(aDef);
+
+ if (!mTextureClientRecycleHandler->GetGraphicBuffer()) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+already_AddRefed<MediaData>
+GonkBufferData::GetPlatformMediaData()
+{
+ if (mGonkPlatformLayer->GetTrackInfo()->GetAsAudioInfo()) {
+ // This is audio decoding.
+ return nullptr;
+ }
+
+ if (!mTextureClientRecycleHandler) {
+ // There is no GraphicBuffer, it should fallback to normal YUV420 VideoData.
+ return nullptr;
+ }
+
+ VideoInfo info(*mGonkPlatformLayer->GetTrackInfo()->GetAsVideoInfo());
+ RefPtr<VideoData> data =
+ VideoData::CreateAndCopyIntoTextureClient(info,
+ 0,
+ mBuffer->nTimeStamp,
+ 1,
+ mTextureClientRecycleHandler->GetTextureClient(),
+ false,
+ 0,
+ info.ImageRect());
+ LOG("%p, disp width %d, height %d, pic width %d, height %d, time %ld",
+ this, info.mDisplay.width, info.mDisplay.height,
+ info.mImage.width, info.mImage.height, mBuffer->nTimeStamp);
+
+ // Get TextureClient Promise here to wait for resolved.
+ RefPtr<GonkBufferData> self(this);
+ mTextureClientRecycleHandler->WaitforRecycle()
+ ->Then(mGonkPlatformLayer->GetTaskQueue(), __func__,
+ [self] () {
+ self->mPromise.ResolveIfExists(self, __func__);
+ },
+ [self] () {
+ OmxBufferFailureHolder failure(OMX_ErrorUndefined, self);
+ self->mPromise.RejectIfExists(failure, __func__);
+ });
+
+ return data.forget();
+}
+
+GonkOmxPlatformLayer::GonkOmxPlatformLayer(OmxDataDecoder* aDataDecoder,
+ OmxPromiseLayer* aPromiseLayer,
+ TaskQueue* aTaskQueue,
+ layers::ImageContainer* aImageContainer)
+ : mTaskQueue(aTaskQueue)
+ , mImageContainer(aImageContainer)
+ , mNode(0)
+{
+ mOmxObserver = new GonkOmxObserver(mTaskQueue, aPromiseLayer, aDataDecoder);
+}
+
+nsresult
+GonkOmxPlatformLayer::AllocateOmxBuffer(OMX_DIRTYPE aType,
+ BUFFERLIST* aBufferList)
+{
+ MOZ_ASSERT(!mMemoryDealer[aType].get());
+
+ // Get port definition.
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ nsTArray<uint32_t> portindex;
+ GetPortIndices(portindex);
+ for (auto idx : portindex) {
+ InitOmxParameter(&def);
+ def.nPortIndex = idx;
+
+ OMX_ERRORTYPE err = GetParameter(OMX_IndexParamPortDefinition,
+ &def,
+ sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+ if (err != OMX_ErrorNone) {
+ return NS_ERROR_FAILURE;
+ } else if (def.eDir == aType) {
+ LOG("Get OMX_IndexParamPortDefinition: port: %d, type: %d", def.nPortIndex, def.eDir);
+ break;
+ }
+ }
+
+ size_t t = 0;
+
+ // Configure video output GraphicBuffer for video decoding acceleration.
+ bool useGralloc = false;
+ if (aType == OMX_DirOutput && mQuirks.test(kRequiresAllocateBufferOnOutputPorts) &&
+ (def.eDomain == OMX_PortDomainVideo)) {
+ if (NS_FAILED(EnableOmxGraphicBufferPort(def))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ LOG("Enable OMX GraphicBuffer port, number %d, width %d, height %d", def.nBufferCountActual,
+ def.format.video.nFrameWidth, def.format.video.nFrameHeight);
+
+ useGralloc = true;
+
+ t = 1024; // MemoryDealer doesn't like 0, it's just for MemoryDealer happy.
+ } else {
+ t = def.nBufferCountActual * def.nBufferSize;
+ LOG("Buffer count %d, buffer size %d", def.nBufferCountActual, def.nBufferSize);
+ }
+
+ bool liveinlocal = mOmx->livesLocally(mNode, getpid());
+
+ // MemoryDealer is a IPC buffer allocator in Gonk because IOMX is actually
+ // lives in mediaserver.
+ mMemoryDealer[aType] = new MemoryDealer(t, "Gecko-OMX");
+ for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) {
+ RefPtr<GonkBufferData> buffer;
+ IOMX::buffer_id bufferID;
+ status_t st;
+ nsresult rv;
+
+ buffer = new GonkBufferData(liveinlocal, this);
+ if (useGralloc) {
+ // Buffer is lived remotely. Use GraphicBuffer for decoded video frame display.
+ rv = buffer->InitGraphicBuffer(def.format.video);
+ NS_ENSURE_SUCCESS(rv, rv);
+ st = mOmx->useGraphicBuffer(mNode,
+ def.nPortIndex,
+ buffer->mTextureClientRecycleHandler->GetGraphicBuffer(),
+ &bufferID);
+ CHECK_ERR(st);
+ } else {
+ sp<IMemory> mem = mMemoryDealer[aType]->allocate(def.nBufferSize);
+ MOZ_ASSERT(mem.get());
+
+ if ((mQuirks.test(kRequiresAllocateBufferOnInputPorts) && aType == OMX_DirInput) ||
+ (mQuirks.test(kRequiresAllocateBufferOnOutputPorts) && aType == OMX_DirOutput)) {
+ // Buffer is lived remotely. We allocate a local OMX_BUFFERHEADERTYPE
+ // as the mirror of the remote OMX_BUFFERHEADERTYPE.
+ st = mOmx->allocateBufferWithBackup(mNode, aType, mem, &bufferID);
+ CHECK_ERR(st);
+ rv = buffer->InitSharedMemory(mem.get());
+ NS_ENSURE_SUCCESS(rv, rv);
+ } else {
+ // Buffer is lived locally, bufferID is the actually OMX_BUFFERHEADERTYPE
+ // pointer.
+ st = mOmx->useBuffer(mNode, aType, mem, &bufferID);
+ CHECK_ERR(st);
+ rv = buffer->InitLocalBuffer(bufferID);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ }
+
+ rv = buffer->SetBufferId(bufferID);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ aBufferList->AppendElement(buffer);
+ }
+
+ return NS_OK;
+}
+
+nsresult
+GonkOmxPlatformLayer::ReleaseOmxBuffer(OMX_DIRTYPE aType,
+ BUFFERLIST* aBufferList)
+{
+ status_t st;
+ uint32_t len = aBufferList->Length();
+ for (uint32_t i = 0; i < len; i++) {
+ GonkBufferData* buffer = static_cast<GonkBufferData*>(aBufferList->ElementAt(i).get());
+ IOMX::buffer_id id = (OMX_BUFFERHEADERTYPE*) buffer->ID();
+ st = mOmx->freeBuffer(mNode, aType, id);
+ if (st != OK) {
+ return NS_ERROR_FAILURE;
+ }
+ buffer->ReleaseBuffer();
+ }
+ aBufferList->Clear();
+ mMemoryDealer[aType].clear();
+
+ return NS_OK;
+}
+
+nsresult
+GonkOmxPlatformLayer::EnableOmxGraphicBufferPort(OMX_PARAM_PORTDEFINITIONTYPE& aDef)
+{
+ status_t st;
+
+ st = mOmx->enableGraphicBuffers(mNode, aDef.nPortIndex, OMX_TRUE);
+ CHECK_ERR(st);
+
+ return NS_OK;
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::GetState(OMX_STATETYPE* aType)
+{
+ return (OMX_ERRORTYPE)mOmx->getState(mNode, aType);
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::GetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize)
+{
+ return (OMX_ERRORTYPE)mOmx->getParameter(mNode,
+ aParamIndex,
+ aComponentParameterStructure,
+ aComponentParameterSize);
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::SetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize)
+{
+ return (OMX_ERRORTYPE)mOmx->setParameter(mNode,
+ aParamIndex,
+ aComponentParameterStructure,
+ aComponentParameterSize);
+}
+
+nsresult
+GonkOmxPlatformLayer::Shutdown()
+{
+ mOmx->freeNode(mNode);
+ mOmxObserver->Shutdown();
+ mOmxObserver = nullptr;
+ mOmxClient.disconnect();
+
+ return NS_OK;
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::InitOmxToStateLoaded(const TrackInfo* aInfo)
+{
+ mInfo = aInfo;
+ status_t err = mOmxClient.connect();
+ if (err != OK) {
+ return OMX_ErrorUndefined;
+ }
+ mOmx = mOmxClient.interface();
+ if (!mOmx.get()) {
+ return OMX_ErrorUndefined;
+ }
+
+ LOG("find componenet for mime type %s", mInfo->mMimeType.Data());
+
+ nsTArray<ComponentInfo> components;
+ if (FindComponents(mInfo->mMimeType, &components)) {
+ for (auto comp : components) {
+ if (LoadComponent(comp)) {
+ return OMX_ErrorNone;
+ }
+ }
+ }
+
+ LOG("no component is loaded");
+ return OMX_ErrorUndefined;
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::EmptyThisBuffer(BufferData* aData)
+{
+ return (OMX_ERRORTYPE)mOmx->emptyBuffer(mNode,
+ (IOMX::buffer_id)aData->ID(),
+ aData->mBuffer->nOffset,
+ aData->mBuffer->nFilledLen,
+ aData->mBuffer->nFlags,
+ aData->mBuffer->nTimeStamp);
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::FillThisBuffer(BufferData* aData)
+{
+ return (OMX_ERRORTYPE)mOmx->fillBuffer(mNode, (IOMX::buffer_id)aData->ID());
+}
+
+OMX_ERRORTYPE
+GonkOmxPlatformLayer::SendCommand(OMX_COMMANDTYPE aCmd,
+ OMX_U32 aParam1,
+ OMX_PTR aCmdData)
+{
+ return (OMX_ERRORTYPE)mOmx->sendCommand(mNode, aCmd, aParam1);
+}
+
+bool
+GonkOmxPlatformLayer::LoadComponent(const ComponentInfo& aComponent)
+{
+ status_t err = mOmx->allocateNode(aComponent.mName, mOmxObserver, &mNode);
+ if (err == OK) {
+ mQuirks = aComponent.mQuirks;
+ LOG("Load OpenMax component %s, alloc input %d, alloc output %d, live locally %d",
+ aComponent.mName, mQuirks.test(kRequiresAllocateBufferOnInputPorts),
+ mQuirks.test(kRequiresAllocateBufferOnOutputPorts),
+ mOmx->livesLocally(mNode, getpid()));
+ return true;
+ }
+ return false;
+}
+
+layers::ImageContainer*
+GonkOmxPlatformLayer::GetImageContainer()
+{
+ return mImageContainer;
+}
+
+const TrackInfo*
+GonkOmxPlatformLayer::GetTrackInfo()
+{
+ return mInfo;
+}
+
+bool
+GonkOmxPlatformLayer::FindComponents(const nsACString& aMimeType,
+ nsTArray<ComponentInfo>* aComponents)
+{
+ static const MediaCodecList* codecs = MediaCodecList::getInstance();
+
+ bool useHardwareCodecOnly = false;
+
+ // H264 and H263 has different profiles, software codec doesn't support high profile.
+ // So we use hardware codec only.
+ if (!IsInEmulator() &&
+ (aMimeType.EqualsLiteral("video/avc") ||
+ aMimeType.EqualsLiteral("video/mp4") ||
+ aMimeType.EqualsLiteral("video/mp4v-es") ||
+ aMimeType.EqualsLiteral("video/3gp"))) {
+ useHardwareCodecOnly = true;
+ }
+
+ const char* mime = aMimeType.Data();
+ // Translate VP8 MIME type to Android format.
+ if (aMimeType.EqualsLiteral("video/webm; codecs=vp8")) {
+ mime = "video/x-vnd.on2.vp8";
+ }
+
+ size_t start = 0;
+ bool found = false;
+ while (true) {
+ ssize_t index = codecs->findCodecByType(mime, false /* encoder */, start);
+ if (index < 0) {
+ break;
+ }
+ start = index + 1;
+
+ const char* name = codecs->getCodecName(index);
+ if (IsSoftwareCodec(name) && useHardwareCodecOnly) {
+ continue;
+ }
+
+ found = true;
+
+ if (!aComponents) {
+ continue;
+ }
+ ComponentInfo* comp = aComponents->AppendElement();
+ comp->mName = name;
+ if (codecs->codecHasQuirk(index, "requires-allocate-on-input-ports")) {
+ comp->mQuirks.set(kRequiresAllocateBufferOnInputPorts);
+ }
+ if (codecs->codecHasQuirk(index, "requires-allocate-on-output-ports")) {
+ comp->mQuirks.set(kRequiresAllocateBufferOnOutputPorts);
+ }
+ }
+
+ return found;
+}
+
+OMX_VIDEO_CODINGTYPE
+GonkOmxPlatformLayer::CompressionFormat()
+{
+ MOZ_ASSERT(mInfo);
+
+ return mInfo->mMimeType.EqualsLiteral("video/webm; codecs=vp8") ?
+ ANDROID_OMX_VIDEO_CodingVP8 : OmxPlatformLayer::CompressionFormat();
+}
+
+} // mozilla
diff --git a/dom/media/platforms/omx/GonkOmxPlatformLayer.h b/dom/media/platforms/omx/GonkOmxPlatformLayer.h
new file mode 100644
index 000000000..aaa8c654d
--- /dev/null
+++ b/dom/media/platforms/omx/GonkOmxPlatformLayer.h
@@ -0,0 +1,205 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(GonkOmxPlatformLayer_h_)
+#define GonkOmxPlatformLayer_h_
+
+#pragma GCC visibility push(default)
+
+#include <bitset>
+
+#include <utils/RefBase.h>
+#include <media/stagefright/OMXClient.h>
+#include "nsAutoPtr.h"
+
+#include "OMX_Component.h"
+
+#include "OmxPlatformLayer.h"
+
+class nsACString;
+
+namespace android {
+class IMemory;
+class MemoryDealer;
+}
+
+namespace mozilla {
+
+class GonkOmxObserver;
+class GonkOmxPlatformLayer;
+class GonkTextureClientRecycleHandler;
+
+/*
+ * Due to Android's omx node could live in local process (client) or remote
+ * process (mediaserver). And there are 3 kinds of buffer in Android OMX.
+ *
+ * 1.
+ * When buffer is in local process, the IOMX::buffer_id is OMX_BUFFERHEADERTYPE
+ * pointer actually, it is safe to use it directly.
+ *
+ * 2.
+ * When buffer is in remote process, the OMX_BUFFERHEADERTYPE pointer is 'IN' the
+ * remote process. It can't be used in local process, so here it allocates a
+ * local OMX_BUFFERHEADERTYPE. The raw/decoded data is in the android shared
+ * memory, IMemory.
+ *
+ * 3.
+ * When buffer is in remote process for the display output port. It uses
+ * GraphicBuffer to accelerate the decoding and display.
+ *
+ */
+class GonkBufferData : public OmxPromiseLayer::BufferData {
+protected:
+ virtual ~GonkBufferData() {}
+
+public:
+ GonkBufferData(bool aLiveInLocal,
+ GonkOmxPlatformLayer* aLayer);
+
+ BufferID ID() override
+ {
+ return mId;
+ }
+
+ already_AddRefed<MediaData> GetPlatformMediaData() override;
+
+ bool IsLocalBuffer()
+ {
+ return !!mMirrorBuffer.get();
+ }
+
+ void ReleaseBuffer();
+
+ nsresult SetBufferId(android::IOMX::buffer_id aId)
+ {
+ mId = aId;
+ return NS_OK;
+ }
+
+ // The mBuffer is in local process. And aId is actually the OMX_BUFFERHEADERTYPE
+ // pointer. It doesn't need a mirror buffer.
+ nsresult InitLocalBuffer(android::IOMX::buffer_id aId);
+
+ // aMemory is an IPC based memory which will be used as the pBuffer in
+ // mBuffer. And the mBuffer will be the mirror OMX_BUFFERHEADERTYPE
+ // of the one in the remote process.
+ nsresult InitSharedMemory(android::IMemory* aMemory);
+
+ // GraphicBuffer is for video decoding acceleration on output port.
+ // Then mBuffer is the mirror OMX_BUFFERHEADERTYPE of the one in the remote
+ // process.
+ nsresult InitGraphicBuffer(OMX_VIDEO_PORTDEFINITIONTYPE& aDef);
+
+ // Android OMX uses this id to pass the buffer between OMX component and
+ // client.
+ android::IOMX::buffer_id mId;
+
+ // mMirrorBuffer are used only when the omx node is in mediaserver.
+ // Due to IPC problem, the mId is the OMX_BUFFERHEADERTYPE address in mediaserver.
+ // It can't mapping to client process, so we need a local OMX_BUFFERHEADERTYPE
+ // here to mirror the remote OMX_BUFFERHEADERTYPE in mediaserver.
+ nsAutoPtr<OMX_BUFFERHEADERTYPE> mMirrorBuffer;
+
+ // It creates GraphicBuffer and manages TextureClient.
+ RefPtr<GonkTextureClientRecycleHandler> mTextureClientRecycleHandler;
+
+ GonkOmxPlatformLayer* mGonkPlatformLayer;
+};
+
+class GonkOmxPlatformLayer : public OmxPlatformLayer {
+public:
+ enum {
+ kRequiresAllocateBufferOnInputPorts = 0,
+ kRequiresAllocateBufferOnOutputPorts,
+ QUIRKS,
+ };
+ typedef std::bitset<QUIRKS> Quirks;
+
+ struct ComponentInfo {
+ const char* mName;
+ Quirks mQuirks;
+ };
+
+ GonkOmxPlatformLayer(OmxDataDecoder* aDataDecoder,
+ OmxPromiseLayer* aPromiseLayer,
+ TaskQueue* aTaskQueue,
+ layers::ImageContainer* aImageContainer);
+
+ nsresult AllocateOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBufferList) override;
+
+ nsresult ReleaseOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBufferList) override;
+
+ OMX_ERRORTYPE GetState(OMX_STATETYPE* aType) override;
+
+ OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize) override;
+
+ OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE nIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize) override;
+
+ OMX_ERRORTYPE InitOmxToStateLoaded(const TrackInfo* aInfo) override;
+
+ OMX_ERRORTYPE EmptyThisBuffer(BufferData* aData) override;
+
+ OMX_ERRORTYPE FillThisBuffer(BufferData* aData) override;
+
+ OMX_ERRORTYPE SendCommand(OMX_COMMANDTYPE aCmd,
+ OMX_U32 aParam1,
+ OMX_PTR aCmdData) override;
+
+ nsresult Shutdown() override;
+
+ static bool FindComponents(const nsACString& aMimeType,
+ nsTArray<ComponentInfo>* aComponents = nullptr);
+
+ // Android/QCOM decoder uses its own OMX_VIDEO_CodingVP8 definition in
+ // frameworks/native/media/include/openmax/OMX_Video.h, not the one defined
+ // in OpenMAX v1.1.2 OMX_VideoExt.h
+ OMX_VIDEO_CODINGTYPE CompressionFormat() override;
+
+protected:
+ friend GonkBufferData;
+
+ layers::ImageContainer* GetImageContainer();
+
+ const TrackInfo* GetTrackInfo();
+
+ TaskQueue* GetTaskQueue()
+ {
+ return mTaskQueue;
+ }
+
+ nsresult EnableOmxGraphicBufferPort(OMX_PARAM_PORTDEFINITIONTYPE& aDef);
+
+ bool LoadComponent(const ComponentInfo& aComponent);
+
+ friend class GonkOmxObserver;
+
+ RefPtr<TaskQueue> mTaskQueue;
+
+ RefPtr<layers::ImageContainer> mImageContainer;
+
+ // OMX_DirInput is 0, OMX_DirOutput is 1.
+ android::sp<android::MemoryDealer> mMemoryDealer[2];
+
+ android::sp<GonkOmxObserver> mOmxObserver;
+
+ android::sp<android::IOMX> mOmx;
+
+ android::IOMX::node_id mNode;
+
+ android::OMXClient mOmxClient;
+
+ Quirks mQuirks;
+};
+
+}
+
+#pragma GCC visibility pop
+
+#endif // GonkOmxPlatformLayer_h_
diff --git a/dom/media/platforms/omx/OmxDataDecoder.cpp b/dom/media/platforms/omx/OmxDataDecoder.cpp
new file mode 100644
index 000000000..33f9dad30
--- /dev/null
+++ b/dom/media/platforms/omx/OmxDataDecoder.cpp
@@ -0,0 +1,1038 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OmxDataDecoder.h"
+
+#include "OMX_Audio.h"
+#include "OMX_Component.h"
+#include "OMX_Types.h"
+
+#include "OmxPlatformLayer.h"
+
+
+#ifdef LOG
+#undef LOG
+#undef LOGL
+#endif
+
+#define LOG(arg, ...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, ("OmxDataDecoder(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+#define LOGL(arg, ...) \
+ { \
+ void* p = self; \
+ MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, \
+ ("OmxDataDecoder(%p)::%s: " arg, p, __func__, ##__VA_ARGS__)); \
+ }
+
+#define CHECK_OMX_ERR(err) \
+ if (err != OMX_ErrorNone) { \
+ NotifyError(err, __func__);\
+ return; \
+ } \
+
+namespace mozilla {
+
+static const char*
+StateTypeToStr(OMX_STATETYPE aType)
+{
+ MOZ_ASSERT(aType == OMX_StateLoaded ||
+ aType == OMX_StateIdle ||
+ aType == OMX_StateExecuting ||
+ aType == OMX_StatePause ||
+ aType == OMX_StateWaitForResources ||
+ aType == OMX_StateInvalid);
+
+ switch (aType) {
+ case OMX_StateLoaded:
+ return "OMX_StateLoaded";
+ case OMX_StateIdle:
+ return "OMX_StateIdle";
+ case OMX_StateExecuting:
+ return "OMX_StateExecuting";
+ case OMX_StatePause:
+ return "OMX_StatePause";
+ case OMX_StateWaitForResources:
+ return "OMX_StateWaitForResources";
+ case OMX_StateInvalid:
+ return "OMX_StateInvalid";
+ default:
+ return "Unknown";
+ }
+}
+
+// A helper class to retrieve AudioData or VideoData.
+class MediaDataHelper {
+protected:
+ virtual ~MediaDataHelper() {}
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDataHelper)
+
+ MediaDataHelper(const TrackInfo* aTrackInfo,
+ layers::ImageContainer* aImageContainer,
+ OmxPromiseLayer* aOmxLayer);
+
+ already_AddRefed<MediaData> GetMediaData(BufferData* aBufferData, bool& aPlatformDepenentData);
+
+protected:
+ already_AddRefed<AudioData> CreateAudioData(BufferData* aBufferData);
+
+ already_AddRefed<VideoData> CreateYUV420VideoData(BufferData* aBufferData);
+
+ const TrackInfo* mTrackInfo;
+
+ OMX_PARAM_PORTDEFINITIONTYPE mOutputPortDef;
+
+ // audio output
+ MediaQueue<AudioData> mAudioQueue;
+
+ AudioCompactor mAudioCompactor;
+
+ // video output
+ RefPtr<layers::ImageContainer> mImageContainer;
+};
+
+OmxDataDecoder::OmxDataDecoder(const TrackInfo& aTrackInfo,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer)
+ : mMonitor("OmxDataDecoder")
+ , mOmxTaskQueue(CreateMediaDecodeTaskQueue())
+ , mImageContainer(aImageContainer)
+ , mWatchManager(this, mOmxTaskQueue)
+ , mOmxState(OMX_STATETYPE::OMX_StateInvalid, "OmxDataDecoder::mOmxState")
+ , mTrackInfo(aTrackInfo.Clone())
+ , mFlushing(false)
+ , mShuttingDown(false)
+ , mCheckingInputExhausted(false)
+ , mPortSettingsChanged(-1, "OmxDataDecoder::mPortSettingsChanged")
+ , mCallback(aCallback)
+{
+ LOG("");
+ mOmxLayer = new OmxPromiseLayer(mOmxTaskQueue, this, aImageContainer);
+
+ mOmxTaskQueue->Dispatch(NewRunnableMethod(this, &OmxDataDecoder::InitializationTask));
+}
+
+OmxDataDecoder::~OmxDataDecoder()
+{
+ LOG("");
+}
+
+void
+OmxDataDecoder::InitializationTask()
+{
+ mWatchManager.Watch(mOmxState, &OmxDataDecoder::OmxStateRunner);
+ mWatchManager.Watch(mPortSettingsChanged, &OmxDataDecoder::PortSettingsChanged);
+}
+
+void
+OmxDataDecoder::EndOfStream()
+{
+ LOG("");
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ mFlushing = true;
+ RefPtr<OmxDataDecoder> self = this;
+ mOmxLayer->SendCommand(OMX_CommandFlush, OMX_ALL, nullptr)
+ ->Then(mReaderTaskQueue, __func__,
+ [self] () {
+ self->mFlushing = false;
+ self->mCallback->DrainComplete();
+ },
+ [self] () {
+ self->mFlushing = false;
+ self->mCallback->DrainComplete();
+ });
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+OmxDataDecoder::Init()
+{
+ LOG("");
+ mReaderTaskQueue = AbstractThread::GetCurrent()->AsTaskQueue();
+ MOZ_ASSERT(mReaderTaskQueue);
+
+ RefPtr<InitPromise> p = mInitPromise.Ensure(__func__);
+ RefPtr<OmxDataDecoder> self = this;
+
+ // TODO: it needs to get permission from resource manager before allocating
+ // Omx component.
+ InvokeAsync(mOmxTaskQueue, mOmxLayer.get(), __func__, &OmxPromiseLayer::Init,
+ mTrackInfo.get())
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () {
+ // Omx state should be OMX_StateIdle.
+ self->mOmxState = self->mOmxLayer->GetState();
+ MOZ_ASSERT(self->mOmxState != OMX_StateIdle);
+ },
+ [self] () {
+ self->RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ });
+
+ return p;
+}
+
+void
+OmxDataDecoder::Input(MediaRawData* aSample)
+{
+ LOG("sample %p", aSample);
+ MOZ_ASSERT(mInitPromise.IsEmpty());
+
+ RefPtr<OmxDataDecoder> self = this;
+ RefPtr<MediaRawData> sample = aSample;
+
+ nsCOMPtr<nsIRunnable> r =
+ NS_NewRunnableFunction([self, sample] () {
+ self->mMediaRawDatas.AppendElement(sample);
+
+ // Start to fill/empty buffers.
+ if (self->mOmxState == OMX_StateIdle ||
+ self->mOmxState == OMX_StateExecuting) {
+ self->FillAndEmptyBuffers();
+ }
+ });
+ mOmxTaskQueue->Dispatch(r.forget());
+}
+
+void
+OmxDataDecoder::Flush()
+{
+ LOG("");
+
+ mFlushing = true;
+
+ mOmxTaskQueue->Dispatch(NewRunnableMethod(this, &OmxDataDecoder::DoFlush));
+
+ // According to the definition of Flush() in PDM:
+ // "the decoder must be ready to accept new input for decoding".
+ // So it needs to wait for the Omx to complete the flush command.
+ MonitorAutoLock lock(mMonitor);
+ while (mFlushing) {
+ lock.Wait();
+ }
+}
+
+void
+OmxDataDecoder::Drain()
+{
+ LOG("");
+
+ mOmxTaskQueue->Dispatch(NewRunnableMethod(this, &OmxDataDecoder::SendEosBuffer));
+}
+
+void
+OmxDataDecoder::Shutdown()
+{
+ LOG("");
+
+ mShuttingDown = true;
+
+ mOmxTaskQueue->Dispatch(NewRunnableMethod(this, &OmxDataDecoder::DoAsyncShutdown));
+
+ {
+ // DoAsyncShutdown() will be running for a while, it could be still running
+ // when reader releasing the decoder and then it causes problem. To avoid it,
+ // Shutdown() must block until DoAsyncShutdown() is completed.
+ MonitorAutoLock lock(mMonitor);
+ while (mShuttingDown) {
+ lock.Wait();
+ }
+ }
+
+ mOmxTaskQueue->BeginShutdown();
+ mOmxTaskQueue->AwaitShutdownAndIdle();
+}
+
+void
+OmxDataDecoder::DoAsyncShutdown()
+{
+ LOG("");
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(!mFlushing);
+
+ mWatchManager.Unwatch(mOmxState, &OmxDataDecoder::OmxStateRunner);
+ mWatchManager.Unwatch(mPortSettingsChanged, &OmxDataDecoder::PortSettingsChanged);
+
+ // Flush to all ports, so all buffers can be returned from component.
+ RefPtr<OmxDataDecoder> self = this;
+ mOmxLayer->SendCommand(OMX_CommandFlush, OMX_ALL, nullptr)
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () -> RefPtr<OmxCommandPromise> {
+ LOGL("DoAsyncShutdown: flush complete");
+ return self->mOmxLayer->SendCommand(OMX_CommandStateSet, OMX_StateIdle, nullptr);
+ },
+ [self] () {
+ self->mOmxLayer->Shutdown();
+ })
+ ->CompletionPromise()
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () -> RefPtr<OmxCommandPromise> {
+ RefPtr<OmxCommandPromise> p =
+ self->mOmxLayer->SendCommand(OMX_CommandStateSet, OMX_StateLoaded, nullptr);
+
+ // According to spec 3.1.1.2.2.1:
+ // OMX_StateLoaded needs to be sent before releasing buffers.
+ // And state transition from OMX_StateIdle to OMX_StateLoaded
+ // is completed when all of the buffers have been removed
+ // from the component.
+ // Here the buffer promises are not resolved due to displaying
+ // in layer, it needs to wait before the layer returns the
+ // buffers.
+ LOGL("DoAsyncShutdown: releasing buffers...");
+ self->ReleaseBuffers(OMX_DirInput);
+ self->ReleaseBuffers(OMX_DirOutput);
+
+ return p;
+ },
+ [self] () {
+ self->mOmxLayer->Shutdown();
+ })
+ ->CompletionPromise()
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () {
+ LOGL("DoAsyncShutdown: OMX_StateLoaded, it is safe to shutdown omx");
+ self->mOmxLayer->Shutdown();
+ self->mWatchManager.Shutdown();
+ self->mOmxLayer = nullptr;
+ self->mMediaDataHelper = nullptr;
+
+ MonitorAutoLock lock(self->mMonitor);
+ self->mShuttingDown = false;
+ self->mMonitor.Notify();
+ },
+ [self] () {
+ self->mOmxLayer->Shutdown();
+ self->mWatchManager.Shutdown();
+ self->mOmxLayer = nullptr;
+ self->mMediaDataHelper = nullptr;
+
+ MonitorAutoLock lock(self->mMonitor);
+ self->mShuttingDown = false;
+ self->mMonitor.Notify();
+ });
+}
+
+void
+OmxDataDecoder::FillBufferDone(BufferData* aData)
+{
+ MOZ_ASSERT(!aData || aData->mStatus == BufferData::BufferStatus::OMX_CLIENT);
+
+ // Don't output sample when flush or shutting down, especially for video
+ // decoded frame. Because video decoded frame has a promise in BufferData
+ // waiting for layer to resolve it via recycle callback on Gonk, if other
+ // module doesn't send it to layer, it will cause a unresolved promise and
+ // waiting for resolve infinitely.
+ if (mFlushing || mShuttingDown) {
+ LOG("mFlush or mShuttingDown, drop data");
+ aData->mStatus = BufferData::BufferStatus::FREE;
+ return;
+ }
+
+ if (aData->mBuffer->nFlags & OMX_BUFFERFLAG_EOS) {
+ // Reach eos, it's an empty data so it doesn't need to output.
+ EndOfStream();
+ aData->mStatus = BufferData::BufferStatus::FREE;
+ } else {
+ Output(aData);
+ FillAndEmptyBuffers();
+ }
+}
+
+void
+OmxDataDecoder::Output(BufferData* aData)
+{
+ if (!mMediaDataHelper) {
+ mMediaDataHelper = new MediaDataHelper(mTrackInfo.get(), mImageContainer, mOmxLayer);
+ }
+
+ bool isPlatformData = false;
+ RefPtr<MediaData> data = mMediaDataHelper->GetMediaData(aData, isPlatformData);
+ if (!data) {
+ aData->mStatus = BufferData::BufferStatus::FREE;
+ return;
+ }
+
+ if (isPlatformData) {
+ // If the MediaData is platform dependnet data, it's mostly a kind of
+ // limited resource, for example, GraphicBuffer on Gonk. So we use promise
+ // to notify when the resource is free.
+ aData->mStatus = BufferData::BufferStatus::OMX_CLIENT_OUTPUT;
+
+ MOZ_RELEASE_ASSERT(aData->mPromise.IsEmpty());
+ RefPtr<OmxBufferPromise> p = aData->mPromise.Ensure(__func__);
+
+ RefPtr<OmxDataDecoder> self = this;
+ RefPtr<BufferData> buffer = aData;
+ p->Then(mOmxTaskQueue, __func__,
+ [self, buffer] () {
+ MOZ_RELEASE_ASSERT(buffer->mStatus == BufferData::BufferStatus::OMX_CLIENT_OUTPUT);
+ buffer->mStatus = BufferData::BufferStatus::FREE;
+ self->FillAndEmptyBuffers();
+ },
+ [buffer] () {
+ MOZ_RELEASE_ASSERT(buffer->mStatus == BufferData::BufferStatus::OMX_CLIENT_OUTPUT);
+ buffer->mStatus = BufferData::BufferStatus::FREE;
+ });
+ } else {
+ aData->mStatus = BufferData::BufferStatus::FREE;
+ }
+
+ mCallback->Output(data);
+}
+
+void
+OmxDataDecoder::FillBufferFailure(OmxBufferFailureHolder aFailureHolder)
+{
+ NotifyError(aFailureHolder.mError, __func__);
+}
+
+void
+OmxDataDecoder::EmptyBufferDone(BufferData* aData)
+{
+ MOZ_ASSERT(!aData || aData->mStatus == BufferData::BufferStatus::OMX_CLIENT);
+
+ // Nothing to do when status of input buffer is OMX_CLIENT.
+ aData->mStatus = BufferData::BufferStatus::FREE;
+ FillAndEmptyBuffers();
+
+ // There is no way to know if component gets enough raw samples to generate
+ // output, especially for video decoding. So here it needs to request raw
+ // samples aggressively.
+ if (!mCheckingInputExhausted && !mMediaRawDatas.Length()) {
+ mCheckingInputExhausted = true;
+
+ RefPtr<OmxDataDecoder> self = this;
+ nsCOMPtr<nsIRunnable> r =
+ NS_NewRunnableFunction([self] () {
+ MOZ_ASSERT(self->mOmxTaskQueue->IsCurrentThreadIn());
+
+ self->mCheckingInputExhausted = false;
+
+ if (self->mMediaRawDatas.Length()) {
+ return;
+ }
+
+ LOGL("Call InputExhausted()");
+ self->mCallback->InputExhausted();
+ });
+
+ mOmxTaskQueue->Dispatch(r.forget());
+ }
+}
+
+void
+OmxDataDecoder::EmptyBufferFailure(OmxBufferFailureHolder aFailureHolder)
+{
+ NotifyError(aFailureHolder.mError, __func__);
+}
+
+void
+OmxDataDecoder::NotifyError(OMX_ERRORTYPE aOmxError, const char* aLine, const MediaResult& aError)
+{
+ LOG("NotifyError %d (%d) at %s", aOmxError, aError.Code(), aLine);
+ mCallback->Error(aError);
+}
+
+void
+OmxDataDecoder::FillAndEmptyBuffers()
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(mOmxState == OMX_StateExecuting);
+
+ // During the port setting changed, it is forbidden to do any buffer operation.
+ if (mPortSettingsChanged != -1 || mShuttingDown || mFlushing) {
+ return;
+ }
+
+ // Trigger input port.
+ while (!!mMediaRawDatas.Length()) {
+ // input buffer must be used by component if there is data available.
+ RefPtr<BufferData> inbuf = FindAvailableBuffer(OMX_DirInput);
+ if (!inbuf) {
+ LOG("no input buffer!");
+ break;
+ }
+
+ RefPtr<MediaRawData> data = mMediaRawDatas[0];
+ // Buffer size should large enough for raw data.
+ MOZ_RELEASE_ASSERT(inbuf->mBuffer->nAllocLen >= data->Size());
+
+ memcpy(inbuf->mBuffer->pBuffer, data->Data(), data->Size());
+ inbuf->mBuffer->nFilledLen = data->Size();
+ inbuf->mBuffer->nOffset = 0;
+ inbuf->mBuffer->nFlags = inbuf->mBuffer->nAllocLen > data->Size() ?
+ OMX_BUFFERFLAG_ENDOFFRAME : 0;
+ inbuf->mBuffer->nTimeStamp = data->mTime;
+ if (data->Size()) {
+ inbuf->mRawData = mMediaRawDatas[0];
+ } else {
+ LOG("send EOS buffer");
+ inbuf->mBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
+ }
+
+ LOG("feed sample %p to omx component, len %d, flag %X", data.get(),
+ inbuf->mBuffer->nFilledLen, inbuf->mBuffer->nFlags);
+ mOmxLayer->EmptyBuffer(inbuf)->Then(mOmxTaskQueue, __func__, this,
+ &OmxDataDecoder::EmptyBufferDone,
+ &OmxDataDecoder::EmptyBufferFailure);
+ mMediaRawDatas.RemoveElementAt(0);
+ }
+
+ // Trigger output port.
+ while (true) {
+ RefPtr<BufferData> outbuf = FindAvailableBuffer(OMX_DirOutput);
+ if (!outbuf) {
+ break;
+ }
+
+ mOmxLayer->FillBuffer(outbuf)->Then(mOmxTaskQueue, __func__, this,
+ &OmxDataDecoder::FillBufferDone,
+ &OmxDataDecoder::FillBufferFailure);
+ }
+}
+
+OmxPromiseLayer::BufferData*
+OmxDataDecoder::FindAvailableBuffer(OMX_DIRTYPE aType)
+{
+ BUFFERLIST* buffers = GetBuffers(aType);
+
+ for (uint32_t i = 0; i < buffers->Length(); i++) {
+ BufferData* buf = buffers->ElementAt(i);
+ if (buf->mStatus == BufferData::BufferStatus::FREE) {
+ return buf;
+ }
+ }
+
+ return nullptr;
+}
+
+nsresult
+OmxDataDecoder::AllocateBuffers(OMX_DIRTYPE aType)
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ return mOmxLayer->AllocateOmxBuffer(aType, GetBuffers(aType));
+}
+
+nsresult
+OmxDataDecoder::ReleaseBuffers(OMX_DIRTYPE aType)
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ return mOmxLayer->ReleaseOmxBuffer(aType, GetBuffers(aType));
+}
+
+nsTArray<RefPtr<OmxPromiseLayer::BufferData>>*
+OmxDataDecoder::GetBuffers(OMX_DIRTYPE aType)
+{
+ MOZ_ASSERT(aType == OMX_DIRTYPE::OMX_DirInput ||
+ aType == OMX_DIRTYPE::OMX_DirOutput);
+
+ if (aType == OMX_DIRTYPE::OMX_DirInput) {
+ return &mInPortBuffers;
+ }
+ return &mOutPortBuffers;
+}
+
+void
+OmxDataDecoder::ResolveInitPromise(const char* aMethodName)
+{
+ LOG("called from %s", aMethodName);
+ RefPtr<OmxDataDecoder> self = this;
+ nsCOMPtr<nsIRunnable> r =
+ NS_NewRunnableFunction([self, aMethodName] () {
+ MOZ_ASSERT(self->mReaderTaskQueue->IsCurrentThreadIn());
+ self->mInitPromise.ResolveIfExists(self->mTrackInfo->GetType(), aMethodName);
+ });
+ mReaderTaskQueue->Dispatch(r.forget());
+}
+
+void
+OmxDataDecoder::RejectInitPromise(MediaResult aError, const char* aMethodName)
+{
+ RefPtr<OmxDataDecoder> self = this;
+ nsCOMPtr<nsIRunnable> r =
+ NS_NewRunnableFunction([self, aError, aMethodName] () {
+ MOZ_ASSERT(self->mReaderTaskQueue->IsCurrentThreadIn());
+ self->mInitPromise.RejectIfExists(aError, aMethodName);
+ });
+ mReaderTaskQueue->Dispatch(r.forget());
+}
+
+void
+OmxDataDecoder::OmxStateRunner()
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+ LOG("OMX state: %s", StateTypeToStr(mOmxState));
+
+ // TODO: maybe it'd be better to use promise CompletionPromise() to replace
+ // this state machine.
+ if (mOmxState == OMX_StateLoaded) {
+ ConfigCodec();
+
+ // Send OpenMax state command to OMX_StateIdle.
+ RefPtr<OmxDataDecoder> self = this;
+ mOmxLayer->SendCommand(OMX_CommandStateSet, OMX_StateIdle, nullptr)
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () {
+ // Current state should be OMX_StateIdle.
+ self->mOmxState = self->mOmxLayer->GetState();
+ MOZ_ASSERT(self->mOmxState == OMX_StateIdle);
+ },
+ [self] () {
+ self->RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ });
+
+ // Allocate input and output buffers.
+ OMX_DIRTYPE types[] = {OMX_DIRTYPE::OMX_DirInput, OMX_DIRTYPE::OMX_DirOutput};
+ for(const auto id : types) {
+ if (NS_FAILED(AllocateBuffers(id))) {
+ LOG("Failed to allocate buffer on port %d", id);
+ RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ break;
+ }
+ }
+ } else if (mOmxState == OMX_StateIdle) {
+ RefPtr<OmxDataDecoder> self = this;
+ mOmxLayer->SendCommand(OMX_CommandStateSet, OMX_StateExecuting, nullptr)
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () {
+ self->mOmxState = self->mOmxLayer->GetState();
+ MOZ_ASSERT(self->mOmxState == OMX_StateExecuting);
+
+ self->ResolveInitPromise(__func__);
+ },
+ [self] () {
+ self->RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
+ });
+ } else if (mOmxState == OMX_StateExecuting) {
+ // Configure codec once it gets OMX_StateExecuting state.
+ FillCodecConfigDataToOmx();
+ } else {
+ MOZ_ASSERT(0);
+ }
+}
+
+void
+OmxDataDecoder::ConfigCodec()
+{
+ OMX_ERRORTYPE err = mOmxLayer->Config();
+ CHECK_OMX_ERR(err);
+}
+
+void
+OmxDataDecoder::FillCodecConfigDataToOmx()
+{
+ // Codec configure data should be the first sample running on Omx TaskQueue.
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(!mMediaRawDatas.Length());
+ MOZ_ASSERT(mOmxState == OMX_StateIdle || mOmxState == OMX_StateExecuting);
+
+
+ RefPtr<BufferData> inbuf = FindAvailableBuffer(OMX_DirInput);
+ RefPtr<MediaByteBuffer> csc;
+ if (mTrackInfo->IsAudio()) {
+ csc = mTrackInfo->GetAsAudioInfo()->mCodecSpecificConfig;
+ } else if (mTrackInfo->IsVideo()) {
+ csc = mTrackInfo->GetAsVideoInfo()->mCodecSpecificConfig;
+ }
+
+ MOZ_RELEASE_ASSERT(csc);
+
+ // Some codecs like h264, its codec specific data is at the first packet, not in container.
+ if (csc->Length()) {
+ memcpy(inbuf->mBuffer->pBuffer,
+ csc->Elements(),
+ csc->Length());
+ inbuf->mBuffer->nFilledLen = csc->Length();
+ inbuf->mBuffer->nOffset = 0;
+ inbuf->mBuffer->nFlags = (OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_CODECCONFIG);
+
+ LOG("Feed codec configure data to OMX component");
+ mOmxLayer->EmptyBuffer(inbuf)->Then(mOmxTaskQueue, __func__, this,
+ &OmxDataDecoder::EmptyBufferDone,
+ &OmxDataDecoder::EmptyBufferFailure);
+ }
+}
+
+bool
+OmxDataDecoder::Event(OMX_EVENTTYPE aEvent, OMX_U32 aData1, OMX_U32 aData2)
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ if (mOmxLayer->Event(aEvent, aData1, aData2)) {
+ return true;
+ }
+
+ switch (aEvent) {
+ case OMX_EventPortSettingsChanged:
+ {
+ // Don't always disable port. See bug 1235340.
+ if (aData2 == 0 ||
+ aData2 == OMX_IndexParamPortDefinition) {
+ // According to spec: "To prevent the loss of any input data, the
+ // component issuing the OMX_EventPortSettingsChanged event on its input
+ // port should buffer all input port data that arrives between the
+ // emission of the OMX_EventPortSettingsChanged event and the arrival of
+ // the command to disable the input port."
+ //
+ // So client needs to disable port and reallocate buffers.
+ MOZ_ASSERT(mPortSettingsChanged == -1);
+ mPortSettingsChanged = aData1;
+ }
+ LOG("Got OMX_EventPortSettingsChanged event");
+ break;
+ }
+ default:
+ {
+ // Got error during decoding, send msg to MFR skipping to next key frame.
+ if (aEvent == OMX_EventError && mOmxState == OMX_StateExecuting) {
+ NotifyError((OMX_ERRORTYPE)aData1, __func__,
+ MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, __func__));
+ return true;
+ }
+ LOG("WARNING: got none handle event: %d, aData1: %d, aData2: %d",
+ aEvent, aData1, aData2);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool
+OmxDataDecoder::BuffersCanBeReleased(OMX_DIRTYPE aType)
+{
+ BUFFERLIST* buffers = GetBuffers(aType);
+ uint32_t len = buffers->Length();
+ for (uint32_t i = 0; i < len; i++) {
+ BufferData::BufferStatus buf_status = buffers->ElementAt(i)->mStatus;
+ if (buf_status == BufferData::BufferStatus::OMX_COMPONENT ||
+ buf_status == BufferData::BufferStatus::OMX_CLIENT_OUTPUT) {
+ return false;
+ }
+ }
+ return true;
+}
+
+OMX_DIRTYPE
+OmxDataDecoder::GetPortDirection(uint32_t aPortIndex)
+{
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOmxParameter(&def);
+ def.nPortIndex = mPortSettingsChanged;
+
+ OMX_ERRORTYPE err = mOmxLayer->GetParameter(OMX_IndexParamPortDefinition,
+ &def,
+ sizeof(def));
+ if (err != OMX_ErrorNone) {
+ return OMX_DirMax;
+ }
+ return def.eDir;
+}
+
+RefPtr<OmxPromiseLayer::OmxBufferPromise::AllPromiseType>
+OmxDataDecoder::CollectBufferPromises(OMX_DIRTYPE aType)
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ nsTArray<RefPtr<OmxBufferPromise>> promises;
+ OMX_DIRTYPE types[] = {OMX_DIRTYPE::OMX_DirInput, OMX_DIRTYPE::OMX_DirOutput};
+ for (const auto type : types) {
+ if ((aType == type) || (aType == OMX_DirMax)) {
+ // find the buffer which has promise.
+ BUFFERLIST* buffers = GetBuffers(type);
+
+ for (uint32_t i = 0; i < buffers->Length(); i++) {
+ BufferData* buf = buffers->ElementAt(i);
+ if (!buf->mPromise.IsEmpty()) {
+ // OmxBufferPromise is not exclusive, it can be multiple "Then"s, so it
+ // is safe to call "Ensure" here.
+ promises.AppendElement(buf->mPromise.Ensure(__func__));
+ }
+ }
+ }
+ }
+
+ LOG("CollectBufferPromises: type %d, total %d promiese", aType, promises.Length());
+ if (promises.Length()) {
+ return OmxBufferPromise::All(mOmxTaskQueue, promises);
+ }
+
+ nsTArray<BufferData*> headers;
+ return OmxBufferPromise::AllPromiseType::CreateAndResolve(headers, __func__);
+}
+
+void
+OmxDataDecoder::PortSettingsChanged()
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ if (mPortSettingsChanged == -1 || mOmxState == OMX_STATETYPE::OMX_StateInvalid) {
+ return;
+ }
+
+ // The PortSettingsChanged algorithm:
+ //
+ // 1. disable port.
+ // 2. wait for port buffers return to client and then release these buffers.
+ // 3. enable port.
+ // 4. allocate port buffers.
+ //
+
+ // Disable port. Get port definition if the target port is enable.
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOmxParameter(&def);
+ def.nPortIndex = mPortSettingsChanged;
+
+ OMX_ERRORTYPE err = mOmxLayer->GetParameter(OMX_IndexParamPortDefinition,
+ &def,
+ sizeof(def));
+ CHECK_OMX_ERR(err);
+
+ RefPtr<OmxDataDecoder> self = this;
+ if (def.bEnabled) {
+ // 1. disable port.
+ LOG("PortSettingsChanged: disable port %d", def.nPortIndex);
+ mOmxLayer->SendCommand(OMX_CommandPortDisable, mPortSettingsChanged, nullptr)
+ ->Then(mOmxTaskQueue, __func__,
+ [self, def] () -> RefPtr<OmxCommandPromise> {
+ // 3. enable port.
+ // Send enable port command.
+ RefPtr<OmxCommandPromise> p =
+ self->mOmxLayer->SendCommand(OMX_CommandPortEnable,
+ self->mPortSettingsChanged,
+ nullptr);
+
+ // 4. allocate port buffers.
+ // Allocate new port buffers.
+ nsresult rv = self->AllocateBuffers(def.eDir);
+ if (NS_FAILED(rv)) {
+ self->NotifyError(OMX_ErrorUndefined, __func__);
+ }
+
+ return p;
+ },
+ [self] () {
+ self->NotifyError(OMX_ErrorUndefined, __func__);
+ })
+ ->CompletionPromise()
+ ->Then(mOmxTaskQueue, __func__,
+ [self] () {
+ LOGL("PortSettingsChanged: port settings changed complete");
+ // finish port setting changed.
+ self->mPortSettingsChanged = -1;
+ self->FillAndEmptyBuffers();
+ },
+ [self] () {
+ self->NotifyError(OMX_ErrorUndefined, __func__);
+ });
+
+ // 2. wait for port buffers return to client and then release these buffers.
+ //
+ // Port buffers will be returned to client soon once OMX_CommandPortDisable
+ // command is sent. Then releasing these buffers.
+ CollectBufferPromises(def.eDir)
+ ->Then(mOmxTaskQueue, __func__,
+ [self, def] () {
+ MOZ_ASSERT(self->BuffersCanBeReleased(def.eDir));
+ nsresult rv = self->ReleaseBuffers(def.eDir);
+ if (NS_FAILED(rv)) {
+ MOZ_RELEASE_ASSERT(0);
+ self->NotifyError(OMX_ErrorUndefined, __func__);
+ }
+ },
+ [self] () {
+ self->NotifyError(OMX_ErrorUndefined, __func__);
+ });
+ }
+}
+
+void
+OmxDataDecoder::SendEosBuffer()
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ // There is no 'Drain' API in OpenMax, so it needs to wait for output sample
+ // with EOS flag. However, MediaRawData doesn't provide EOS information,
+ // so here it generates an empty BufferData with eos OMX_BUFFERFLAG_EOS in queue.
+ // This behaviour should be compliant with spec, I think...
+ RefPtr<MediaRawData> eos_data = new MediaRawData();
+ mMediaRawDatas.AppendElement(eos_data);
+ FillAndEmptyBuffers();
+}
+
+void
+OmxDataDecoder::DoFlush()
+{
+ MOZ_ASSERT(mOmxTaskQueue->IsCurrentThreadIn());
+
+ // 1. Call OMX command OMX_CommandFlush in Omx TaskQueue.
+ // 2. Remove all elements in mMediaRawDatas when flush is completed.
+ mOmxLayer->SendCommand(OMX_CommandFlush, OMX_ALL, nullptr)
+ ->Then(mOmxTaskQueue, __func__, this,
+ &OmxDataDecoder::FlushComplete,
+ &OmxDataDecoder::FlushFailure);
+}
+
+void
+OmxDataDecoder::FlushComplete(OMX_COMMANDTYPE aCommandType)
+{
+ mMediaRawDatas.Clear();
+ mFlushing = false;
+
+ MonitorAutoLock lock(mMonitor);
+ mMonitor.Notify();
+ LOG("Flush complete");
+}
+
+void OmxDataDecoder::FlushFailure(OmxCommandFailureHolder aFailureHolder)
+{
+ NotifyError(OMX_ErrorUndefined, __func__);
+ mFlushing = false;
+
+ MonitorAutoLock lock(mMonitor);
+ mMonitor.Notify();
+}
+
+MediaDataHelper::MediaDataHelper(const TrackInfo* aTrackInfo,
+ layers::ImageContainer* aImageContainer,
+ OmxPromiseLayer* aOmxLayer)
+ : mTrackInfo(aTrackInfo)
+ , mAudioCompactor(mAudioQueue)
+ , mImageContainer(aImageContainer)
+{
+ InitOmxParameter(&mOutputPortDef);
+ mOutputPortDef.nPortIndex = aOmxLayer->OutputPortIndex();
+ aOmxLayer->GetParameter(OMX_IndexParamPortDefinition, &mOutputPortDef, sizeof(mOutputPortDef));
+}
+
+already_AddRefed<MediaData>
+MediaDataHelper::GetMediaData(BufferData* aBufferData, bool& aPlatformDepenentData)
+{
+ aPlatformDepenentData = false;
+ RefPtr<MediaData> data;
+
+ if (mTrackInfo->IsAudio()) {
+ if (!aBufferData->mBuffer->nFilledLen) {
+ return nullptr;
+ }
+ data = CreateAudioData(aBufferData);
+ } else if (mTrackInfo->IsVideo()) {
+ data = aBufferData->GetPlatformMediaData();
+ if (data) {
+ aPlatformDepenentData = true;
+ } else {
+ if (!aBufferData->mBuffer->nFilledLen) {
+ return nullptr;
+ }
+ // Get YUV VideoData, it uses more CPU, in most cases, on software codec.
+ data = CreateYUV420VideoData(aBufferData);
+ }
+
+ // Update video time code, duration... from the raw data.
+ VideoData* video(data->As<VideoData>());
+ if (aBufferData->mRawData) {
+ video->mTime = aBufferData->mRawData->mTime;
+ video->mTimecode = aBufferData->mRawData->mTimecode;
+ video->mOffset = aBufferData->mRawData->mOffset;
+ video->mDuration = aBufferData->mRawData->mDuration;
+ video->mKeyframe = aBufferData->mRawData->mKeyframe;
+ }
+ }
+
+ return data.forget();
+}
+
+already_AddRefed<AudioData>
+MediaDataHelper::CreateAudioData(BufferData* aBufferData)
+{
+ RefPtr<AudioData> audio;
+ OMX_BUFFERHEADERTYPE* buf = aBufferData->mBuffer;
+ const AudioInfo* info = mTrackInfo->GetAsAudioInfo();
+ if (buf->nFilledLen) {
+ uint64_t offset = 0;
+ uint32_t frames = buf->nFilledLen / (2 * info->mChannels);
+ if (aBufferData->mRawData) {
+ offset = aBufferData->mRawData->mOffset;
+ }
+ typedef AudioCompactor::NativeCopy OmxCopy;
+ mAudioCompactor.Push(offset,
+ buf->nTimeStamp,
+ info->mRate,
+ frames,
+ info->mChannels,
+ OmxCopy(buf->pBuffer + buf->nOffset,
+ buf->nFilledLen,
+ info->mChannels));
+ audio = mAudioQueue.PopFront();
+ }
+
+ return audio.forget();
+}
+
+already_AddRefed<VideoData>
+MediaDataHelper::CreateYUV420VideoData(BufferData* aBufferData)
+{
+ uint8_t *yuv420p_buffer = (uint8_t *)aBufferData->mBuffer->pBuffer;
+ int32_t stride = mOutputPortDef.format.video.nStride;
+ int32_t slice_height = mOutputPortDef.format.video.nSliceHeight;
+ int32_t width = mTrackInfo->GetAsVideoInfo()->mImage.width;
+ int32_t height = mTrackInfo->GetAsVideoInfo()->mImage.height;
+
+ // TODO: convert other formats to YUV420.
+ if (mOutputPortDef.format.video.eColorFormat != OMX_COLOR_FormatYUV420Planar) {
+ return nullptr;
+ }
+
+ size_t yuv420p_y_size = stride * slice_height;
+ size_t yuv420p_u_size = ((stride + 1) / 2) * ((slice_height + 1) / 2);
+ uint8_t *yuv420p_y = yuv420p_buffer;
+ uint8_t *yuv420p_u = yuv420p_y + yuv420p_y_size;
+ uint8_t *yuv420p_v = yuv420p_u + yuv420p_u_size;
+
+ VideoData::YCbCrBuffer b;
+ b.mPlanes[0].mData = yuv420p_y;
+ b.mPlanes[0].mWidth = width;
+ b.mPlanes[0].mHeight = height;
+ b.mPlanes[0].mStride = stride;
+ b.mPlanes[0].mOffset = 0;
+ b.mPlanes[0].mSkip = 0;
+
+ b.mPlanes[1].mData = yuv420p_u;
+ b.mPlanes[1].mWidth = (width + 1) / 2;
+ b.mPlanes[1].mHeight = (height + 1) / 2;
+ b.mPlanes[1].mStride = (stride + 1) / 2;
+ b.mPlanes[1].mOffset = 0;
+ b.mPlanes[1].mSkip = 0;
+
+ b.mPlanes[2].mData = yuv420p_v;
+ b.mPlanes[2].mWidth =(width + 1) / 2;
+ b.mPlanes[2].mHeight = (height + 1) / 2;
+ b.mPlanes[2].mStride = (stride + 1) / 2;
+ b.mPlanes[2].mOffset = 0;
+ b.mPlanes[2].mSkip = 0;
+
+ VideoInfo info(*mTrackInfo->GetAsVideoInfo());
+ RefPtr<VideoData> data =
+ VideoData::CreateAndCopyData(info,
+ mImageContainer,
+ 0, // Filled later by caller.
+ 0, // Filled later by caller.
+ 1, // We don't know the duration.
+ b,
+ 0, // Filled later by caller.
+ -1,
+ info.ImageRect());
+
+ LOG("YUV420 VideoData: disp width %d, height %d, pic width %d, height %d, time %ld",
+ info.mDisplay.width, info.mDisplay.height, info.mImage.width,
+ info.mImage.height, aBufferData->mBuffer->nTimeStamp);
+
+ return data.forget();
+}
+
+}
diff --git a/dom/media/platforms/omx/OmxDataDecoder.h b/dom/media/platforms/omx/OmxDataDecoder.h
new file mode 100644
index 000000000..ea75b2a2a
--- /dev/null
+++ b/dom/media/platforms/omx/OmxDataDecoder.h
@@ -0,0 +1,214 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(OmxDataDecoder_h_)
+#define OmxDataDecoder_h_
+
+#include "mozilla/Monitor.h"
+
+#include "AudioCompactor.h"
+#include "ImageContainer.h"
+#include "MediaInfo.h"
+#include "PlatformDecoderModule.h"
+
+#include "OMX_Component.h"
+
+#include "OmxPromiseLayer.h"
+
+namespace mozilla {
+
+class MediaDataHelper;
+
+typedef OmxPromiseLayer::OmxCommandPromise OmxCommandPromise;
+typedef OmxPromiseLayer::OmxBufferPromise OmxBufferPromise;
+typedef OmxPromiseLayer::OmxBufferFailureHolder OmxBufferFailureHolder;
+typedef OmxPromiseLayer::OmxCommandFailureHolder OmxCommandFailureHolder;
+typedef OmxPromiseLayer::BufferData BufferData;
+typedef OmxPromiseLayer::BUFFERLIST BUFFERLIST;
+
+/* OmxDataDecoder is the major class which performs followings:
+ * 1. Translate PDM function into OMX commands.
+ * 2. Keeping the buffers between client and component.
+ * 3. Manage the OMX state.
+ *
+ * From the definition in OpenMax spec. "2.2.1", there are 3 major roles in
+ * OpenMax IL.
+ *
+ * IL client:
+ * "The IL client may be a layer below the GUI application, such as GStreamer,
+ * or may be several layers below the GUI layer."
+ *
+ * OmxDataDecoder acts as the IL client.
+ *
+ * OpenMAX IL component:
+ * "A component that is intended to wrap functionality that is required in the
+ * target system."
+ *
+ * OmxPromiseLayer acts as the OpenMAX IL component.
+ *
+ * OpenMAX IL core:
+ * "Platform-specific code that has the functionality necessary to locate and
+ * then load an OpenMAX IL component into main memory."
+ *
+ * OmxPlatformLayer acts as the OpenMAX IL core.
+ */
+class OmxDataDecoder : public MediaDataDecoder {
+protected:
+ virtual ~OmxDataDecoder();
+
+public:
+ OmxDataDecoder(const TrackInfo& aTrackInfo,
+ MediaDataDecoderCallback* aCallback,
+ layers::ImageContainer* aImageContainer);
+
+ RefPtr<InitPromise> Init() override;
+
+ void Input(MediaRawData* aSample) override;
+
+ void Flush() override;
+
+ void Drain() override;
+
+ void Shutdown() override;
+
+ const char* GetDescriptionName() const override
+ {
+ return "omx decoder";
+ }
+
+ // Return true if event is handled.
+ bool Event(OMX_EVENTTYPE aEvent, OMX_U32 aData1, OMX_U32 aData2);
+
+protected:
+ void InitializationTask();
+
+ void ResolveInitPromise(const char* aMethodName);
+
+ void RejectInitPromise(MediaResult aError, const char* aMethodName);
+
+ void OmxStateRunner();
+
+ void FillAndEmptyBuffers();
+
+ void FillBufferDone(BufferData* aData);
+
+ void FillBufferFailure(OmxBufferFailureHolder aFailureHolder);
+
+ void EmptyBufferDone(BufferData* aData);
+
+ void EmptyBufferFailure(OmxBufferFailureHolder aFailureHolder);
+
+ void NotifyError(OMX_ERRORTYPE aOmxError,
+ const char* aLine,
+ const MediaResult& aError = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR));
+
+ // Configure audio/video codec.
+ // Some codec may just ignore this and rely on codec specific data in
+ // FillCodecConfigDataToOmx().
+ void ConfigCodec();
+
+ // Sending codec specific data to OMX component. OMX component could send a
+ // OMX_EventPortSettingsChanged back to client. And then client needs to
+ // disable port and reallocate buffer.
+ void FillCodecConfigDataToOmx();
+
+ void SendEosBuffer();
+
+ void EndOfStream();
+
+ // It could be called after codec specific data is sent and component found
+ // the port format is changed due to different codec specific.
+ void PortSettingsChanged();
+
+ void Output(BufferData* aData);
+
+ // Buffer can be released if its status is not OMX_COMPONENT or
+ // OMX_CLIENT_OUTPUT.
+ bool BuffersCanBeReleased(OMX_DIRTYPE aType);
+
+ OMX_DIRTYPE GetPortDirection(uint32_t aPortIndex);
+
+ void DoAsyncShutdown();
+
+ void DoFlush();
+
+ void FlushComplete(OMX_COMMANDTYPE aCommandType);
+
+ void FlushFailure(OmxCommandFailureHolder aFailureHolder);
+
+ BUFFERLIST* GetBuffers(OMX_DIRTYPE aType);
+
+ nsresult AllocateBuffers(OMX_DIRTYPE aType);
+
+ nsresult ReleaseBuffers(OMX_DIRTYPE aType);
+
+ BufferData* FindAvailableBuffer(OMX_DIRTYPE aType);
+
+ // aType could be OMX_DirMax for all types.
+ RefPtr<OmxPromiseLayer::OmxBufferPromise::AllPromiseType>
+ CollectBufferPromises(OMX_DIRTYPE aType);
+
+ Monitor mMonitor;
+
+ // The Omx TaskQueue.
+ RefPtr<TaskQueue> mOmxTaskQueue;
+
+ RefPtr<TaskQueue> mReaderTaskQueue;
+
+ RefPtr<layers::ImageContainer> mImageContainer;
+
+ WatchManager<OmxDataDecoder> mWatchManager;
+
+ // It is accessed in omx TaskQueue.
+ Watchable<OMX_STATETYPE> mOmxState;
+
+ RefPtr<OmxPromiseLayer> mOmxLayer;
+
+ UniquePtr<TrackInfo> mTrackInfo;
+
+ // It is accessed in both omx and reader TaskQueue.
+ Atomic<bool> mFlushing;
+
+ // It is accessed in Omx/reader TaskQeueu.
+ Atomic<bool> mShuttingDown;
+
+ // It is accessed in Omx TaskQeueu.
+ bool mCheckingInputExhausted;
+
+ // It is accessed in reader TaskQueue.
+ MozPromiseHolder<InitPromise> mInitPromise;
+
+ // It is written in Omx TaskQeueu. Read in Omx TaskQueue.
+ // It value means the port index which port settings is changed.
+ // -1 means no port setting changed.
+ //
+ // Note: when port setting changed, there should be no buffer operations
+ // via EmptyBuffer or FillBuffer.
+ Watchable<int32_t> mPortSettingsChanged;
+
+ // It is access in Omx TaskQueue.
+ nsTArray<RefPtr<MediaRawData>> mMediaRawDatas;
+
+ BUFFERLIST mInPortBuffers;
+
+ BUFFERLIST mOutPortBuffers;
+
+ RefPtr<MediaDataHelper> mMediaDataHelper;
+
+ MediaDataDecoderCallback* mCallback;
+};
+
+template<class T>
+void InitOmxParameter(T* aParam)
+{
+ PodZero(aParam);
+ aParam->nSize = sizeof(T);
+ aParam->nVersion.s.nVersionMajor = 1;
+}
+
+}
+
+#endif /* OmxDataDecoder_h_ */
diff --git a/dom/media/platforms/omx/OmxDecoderModule.cpp b/dom/media/platforms/omx/OmxDecoderModule.cpp
new file mode 100644
index 000000000..9a3c2f929
--- /dev/null
+++ b/dom/media/platforms/omx/OmxDecoderModule.cpp
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OmxDecoderModule.h"
+
+#include "OmxDataDecoder.h"
+#include "OmxPlatformLayer.h"
+
+namespace mozilla {
+
+already_AddRefed<MediaDataDecoder>
+OmxDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<OmxDataDecoder> decoder = new OmxDataDecoder(aParams.mConfig,
+ aParams.mCallback,
+ aParams.mImageContainer);
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+OmxDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ RefPtr<OmxDataDecoder> decoder = new OmxDataDecoder(aParams.mConfig,
+ aParams.mCallback,
+ nullptr);
+ return decoder.forget();
+}
+
+PlatformDecoderModule::ConversionRequired
+OmxDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ return ConversionRequired::kNeedNone;
+}
+
+bool
+OmxDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ return OmxPlatformLayer::SupportsMimeType(aMimeType);
+}
+
+}
diff --git a/dom/media/platforms/omx/OmxDecoderModule.h b/dom/media/platforms/omx/OmxDecoderModule.h
new file mode 100644
index 000000000..432368a69
--- /dev/null
+++ b/dom/media/platforms/omx/OmxDecoderModule.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(OmxDecoderModule_h_)
+#define OmxDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class OmxDecoderModule : public PlatformDecoderModule {
+public:
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ ConversionRequired DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+};
+
+} // namespace mozilla
+
+#endif // OmxDecoderModule_h_
diff --git a/dom/media/platforms/omx/OmxPlatformLayer.cpp b/dom/media/platforms/omx/OmxPlatformLayer.cpp
new file mode 100644
index 000000000..d1f43144d
--- /dev/null
+++ b/dom/media/platforms/omx/OmxPlatformLayer.cpp
@@ -0,0 +1,327 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OmxPlatformLayer.h"
+
+#include "OMX_VideoExt.h" // For VP8.
+
+#if defined(MOZ_WIDGET_GONK) && (ANDROID_VERSION == 20 || ANDROID_VERSION == 19)
+#define OMX_PLATFORM_GONK
+#include "GonkOmxPlatformLayer.h"
+#endif
+
+#include "VPXDecoder.h"
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#define LOG(arg, ...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, ("OmxPlatformLayer -- %s: " arg, __func__, ##__VA_ARGS__))
+
+#define RETURN_IF_ERR(err) \
+ if (err != OMX_ErrorNone) { \
+ LOG("error: 0x%08x", err); \
+ return err; \
+ } \
+
+// Common OMX decoder configuration code.
+namespace mozilla {
+
+// This helper class encapsulates the details of component parameters setting
+// for different OMX audio & video codecs.
+template<typename ParamType>
+class OmxConfig
+{
+public:
+ virtual ~OmxConfig() {}
+ // Subclasses should implement this method to configure the codec.
+ virtual OMX_ERRORTYPE Apply(OmxPlatformLayer& aOmx, const ParamType& aParam) = 0;
+};
+
+typedef OmxConfig<AudioInfo> OmxAudioConfig;
+typedef OmxConfig<VideoInfo> OmxVideoConfig;
+
+template<typename ConfigType>
+UniquePtr<ConfigType> ConfigForMime(const nsACString&);
+
+static OMX_ERRORTYPE
+ConfigAudioOutputPort(OmxPlatformLayer& aOmx, const AudioInfo& aInfo)
+{
+ OMX_ERRORTYPE err;
+
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOmxParameter(&def);
+ def.nPortIndex = aOmx.OutputPortIndex();
+ err = aOmx.GetParameter(OMX_IndexParamPortDefinition, &def, sizeof(def));
+ RETURN_IF_ERR(err);
+
+ def.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+ err = aOmx.SetParameter(OMX_IndexParamPortDefinition, &def, sizeof(def));
+ RETURN_IF_ERR(err);
+
+ OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
+ InitOmxParameter(&pcmParams);
+ pcmParams.nPortIndex = def.nPortIndex;
+ err = aOmx.GetParameter(OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+ RETURN_IF_ERR(err);
+
+ pcmParams.nChannels = aInfo.mChannels;
+ pcmParams.eNumData = OMX_NumericalDataSigned;
+ pcmParams.bInterleaved = OMX_TRUE;
+ pcmParams.nBitPerSample = 16;
+ pcmParams.nSamplingRate = aInfo.mRate;
+ pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear;
+ err = aOmx.SetParameter(OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+ RETURN_IF_ERR(err);
+
+ LOG("Config OMX_IndexParamAudioPcm, channel %d, sample rate %d",
+ pcmParams.nChannels, pcmParams.nSamplingRate);
+
+ return OMX_ErrorNone;
+}
+
+class OmxAacConfig : public OmxAudioConfig
+{
+public:
+ OMX_ERRORTYPE Apply(OmxPlatformLayer& aOmx, const AudioInfo& aInfo) override
+ {
+ OMX_ERRORTYPE err;
+
+ OMX_AUDIO_PARAM_AACPROFILETYPE aacProfile;
+ InitOmxParameter(&aacProfile);
+ aacProfile.nPortIndex = aOmx.InputPortIndex();
+ err = aOmx.GetParameter(OMX_IndexParamAudioAac, &aacProfile, sizeof(aacProfile));
+ RETURN_IF_ERR(err);
+
+ aacProfile.nChannels = aInfo.mChannels;
+ aacProfile.nSampleRate = aInfo.mRate;
+ aacProfile.eAACProfile = static_cast<OMX_AUDIO_AACPROFILETYPE>(aInfo.mProfile);
+ err = aOmx.SetParameter(OMX_IndexParamAudioAac, &aacProfile, sizeof(aacProfile));
+ RETURN_IF_ERR(err);
+
+ LOG("Config OMX_IndexParamAudioAac, channel %d, sample rate %d, profile %d",
+ aacProfile.nChannels, aacProfile.nSampleRate, aacProfile.eAACProfile);
+
+ return ConfigAudioOutputPort(aOmx, aInfo);
+ }
+};
+
+class OmxMp3Config : public OmxAudioConfig
+{
+public:
+ OMX_ERRORTYPE Apply(OmxPlatformLayer& aOmx, const AudioInfo& aInfo) override
+ {
+ OMX_ERRORTYPE err;
+
+ OMX_AUDIO_PARAM_MP3TYPE mp3Param;
+ InitOmxParameter(&mp3Param);
+ mp3Param.nPortIndex = aOmx.InputPortIndex();
+ err = aOmx.GetParameter(OMX_IndexParamAudioMp3, &mp3Param, sizeof(mp3Param));
+ RETURN_IF_ERR(err);
+
+ mp3Param.nChannels = aInfo.mChannels;
+ mp3Param.nSampleRate = aInfo.mRate;
+ err = aOmx.SetParameter(OMX_IndexParamAudioMp3, &mp3Param, sizeof(mp3Param));
+ RETURN_IF_ERR(err);
+
+ LOG("Config OMX_IndexParamAudioMp3, channel %d, sample rate %d",
+ mp3Param.nChannels, mp3Param.nSampleRate);
+
+ return ConfigAudioOutputPort(aOmx, aInfo);
+ }
+};
+
+enum OmxAmrSampleRate {
+ kNarrowBand = 8000,
+ kWideBand = 16000,
+};
+
+template <OmxAmrSampleRate R>
+class OmxAmrConfig : public OmxAudioConfig
+{
+public:
+ OMX_ERRORTYPE Apply(OmxPlatformLayer& aOmx, const AudioInfo& aInfo) override
+ {
+ OMX_ERRORTYPE err;
+
+ OMX_AUDIO_PARAM_AMRTYPE def;
+ InitOmxParameter(&def);
+ def.nPortIndex = aOmx.InputPortIndex();
+ err = aOmx.GetParameter(OMX_IndexParamAudioAmr, &def, sizeof(def));
+ RETURN_IF_ERR(err);
+
+ def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF;
+ err = aOmx.SetParameter(OMX_IndexParamAudioAmr, &def, sizeof(def));
+ RETURN_IF_ERR(err);
+
+ MOZ_ASSERT(aInfo.mChannels == 1);
+ MOZ_ASSERT(aInfo.mRate == R);
+
+ return ConfigAudioOutputPort(aOmx, aInfo);
+ }
+};
+
+template<>
+UniquePtr<OmxAudioConfig>
+ConfigForMime(const nsACString& aMimeType)
+{
+ UniquePtr<OmxAudioConfig> conf;
+
+ if (OmxPlatformLayer::SupportsMimeType(aMimeType)) {
+ if (aMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ conf.reset(new OmxAacConfig());
+ } else if (aMimeType.EqualsLiteral("audio/mp3") ||
+ aMimeType.EqualsLiteral("audio/mpeg")) {
+ conf.reset(new OmxMp3Config());
+ } else if (aMimeType.EqualsLiteral("audio/3gpp")) {
+ conf.reset(new OmxAmrConfig<OmxAmrSampleRate::kNarrowBand>());
+ } else if (aMimeType.EqualsLiteral("audio/amr-wb")) {
+ conf.reset(new OmxAmrConfig<OmxAmrSampleRate::kWideBand>());
+ }
+ }
+ return Move(conf);
+}
+
+// There should be a better way to calculate it.
+#define MIN_VIDEO_INPUT_BUFFER_SIZE 64 * 1024
+
+class OmxCommonVideoConfig : public OmxVideoConfig
+{
+public:
+ explicit OmxCommonVideoConfig()
+ : OmxVideoConfig()
+ {}
+
+ OMX_ERRORTYPE Apply(OmxPlatformLayer& aOmx, const VideoInfo& aInfo) override
+ {
+ OMX_ERRORTYPE err;
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+
+ // Set up in/out port definition.
+ nsTArray<uint32_t> ports;
+ aOmx.GetPortIndices(ports);
+ for (auto idx : ports) {
+ InitOmxParameter(&def);
+ def.nPortIndex = idx;
+ err = aOmx.GetParameter(OMX_IndexParamPortDefinition, &def, sizeof(def));
+ RETURN_IF_ERR(err);
+
+ def.format.video.nFrameWidth = aInfo.mDisplay.width;
+ def.format.video.nFrameHeight = aInfo.mDisplay.height;
+ def.format.video.nStride = aInfo.mImage.width;
+ def.format.video.nSliceHeight = aInfo.mImage.height;
+
+ if (def.eDir == OMX_DirInput) {
+ def.format.video.eCompressionFormat = aOmx.CompressionFormat();
+ def.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+ if (def.nBufferSize < MIN_VIDEO_INPUT_BUFFER_SIZE) {
+ def.nBufferSize = aInfo.mImage.width * aInfo.mImage.height;
+ LOG("Change input buffer size to %d", def.nBufferSize);
+ }
+ } else {
+ def.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+ }
+
+ err = aOmx.SetParameter(OMX_IndexParamPortDefinition, &def, sizeof(def));
+ }
+ return err;
+ }
+};
+
+template<>
+UniquePtr<OmxVideoConfig>
+ConfigForMime(const nsACString& aMimeType)
+{
+ UniquePtr<OmxVideoConfig> conf;
+
+ if (OmxPlatformLayer::SupportsMimeType(aMimeType)) {
+ conf.reset(new OmxCommonVideoConfig());
+ }
+ return Move(conf);
+}
+
+OMX_ERRORTYPE
+OmxPlatformLayer::Config()
+{
+ MOZ_ASSERT(mInfo);
+
+ OMX_PORT_PARAM_TYPE portParam;
+ InitOmxParameter(&portParam);
+ if (mInfo->IsAudio()) {
+ GetParameter(OMX_IndexParamAudioInit, &portParam, sizeof(portParam));
+ mStartPortNumber = portParam.nStartPortNumber;
+ UniquePtr<OmxAudioConfig> conf(ConfigForMime<OmxAudioConfig>(mInfo->mMimeType));
+ MOZ_ASSERT(conf.get());
+ return conf->Apply(*this, *(mInfo->GetAsAudioInfo()));
+ } else if (mInfo->IsVideo()) {
+ GetParameter(OMX_IndexParamVideoInit, &portParam, sizeof(portParam));
+ UniquePtr<OmxVideoConfig> conf(ConfigForMime<OmxVideoConfig>(mInfo->mMimeType));
+ MOZ_ASSERT(conf.get());
+ return conf->Apply(*this, *(mInfo->GetAsVideoInfo()));
+ } else {
+ MOZ_ASSERT_UNREACHABLE("non-AV data (text?) is not supported.");
+ return OMX_ErrorNotImplemented;
+ }
+}
+
+OMX_VIDEO_CODINGTYPE
+OmxPlatformLayer::CompressionFormat()
+{
+ MOZ_ASSERT(mInfo);
+
+ if (mInfo->mMimeType.EqualsLiteral("video/avc")) {
+ return OMX_VIDEO_CodingAVC;
+ } else if (mInfo->mMimeType.EqualsLiteral("video/mp4v-es") ||
+ mInfo->mMimeType.EqualsLiteral("video/mp4")) {
+ return OMX_VIDEO_CodingMPEG4;
+ } else if (mInfo->mMimeType.EqualsLiteral("video/3gpp")) {
+ return OMX_VIDEO_CodingH263;
+ } else if (VPXDecoder::IsVP8(mInfo->mMimeType)) {
+ return static_cast<OMX_VIDEO_CODINGTYPE>(OMX_VIDEO_CodingVP8);
+ } else {
+ MOZ_ASSERT_UNREACHABLE("Unsupported compression format");
+ return OMX_VIDEO_CodingUnused;
+ }
+}
+
+// Implementations for different platforms will be defined in their own files.
+#ifdef OMX_PLATFORM_GONK
+
+bool
+OmxPlatformLayer::SupportsMimeType(const nsACString& aMimeType)
+{
+ return GonkOmxPlatformLayer::FindComponents(aMimeType);
+}
+
+OmxPlatformLayer*
+OmxPlatformLayer::Create(OmxDataDecoder* aDataDecoder,
+ OmxPromiseLayer* aPromiseLayer,
+ TaskQueue* aTaskQueue,
+ layers::ImageContainer* aImageContainer)
+{
+ return new GonkOmxPlatformLayer(aDataDecoder, aPromiseLayer, aTaskQueue, aImageContainer);
+}
+
+#else // For platforms without OMX IL support.
+
+bool
+OmxPlatformLayer::SupportsMimeType(const nsACString& aMimeType)
+{
+ return false;
+}
+
+OmxPlatformLayer*
+OmxPlatformLayer::Create(OmxDataDecoder* aDataDecoder,
+ OmxPromiseLayer* aPromiseLayer,
+ TaskQueue* aTaskQueue,
+ layers::ImageContainer* aImageContainer)
+{
+ return nullptr;
+}
+
+#endif
+
+}
diff --git a/dom/media/platforms/omx/OmxPlatformLayer.h b/dom/media/platforms/omx/OmxPlatformLayer.h
new file mode 100644
index 000000000..67d9e448f
--- /dev/null
+++ b/dom/media/platforms/omx/OmxPlatformLayer.h
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(OmxPlatformLayer_h_)
+#define OmxPlatformLayer_h_
+
+#include "OMX_Core.h"
+#include "OMX_Types.h"
+
+#include "OmxPromiseLayer.h"
+
+class nsACString;
+
+namespace mozilla {
+
+class TaskQueue;
+class TrackInfo;
+
+/*
+ * This class the the abstract layer of the platform OpenMax IL implementation.
+ *
+ * For some platform like andoird, it exposures its OpenMax IL via IOMX which
+ * is definitions are different comparing to standard.
+ * For other platforms like Raspberry Pi, it will be easy to implement this layer
+ * with the standard OpenMax IL api.
+ */
+class OmxPlatformLayer {
+public:
+ typedef OmxPromiseLayer::BUFFERLIST BUFFERLIST;
+ typedef OmxPromiseLayer::BufferData BufferData;
+
+ virtual OMX_ERRORTYPE InitOmxToStateLoaded(const TrackInfo* aInfo) = 0;
+
+ OMX_ERRORTYPE Config();
+
+ virtual OMX_ERRORTYPE EmptyThisBuffer(BufferData* aData) = 0;
+
+ virtual OMX_ERRORTYPE FillThisBuffer(BufferData* aData) = 0;
+
+ virtual OMX_ERRORTYPE SendCommand(OMX_COMMANDTYPE aCmd,
+ OMX_U32 aParam1,
+ OMX_PTR aCmdData) = 0;
+
+ // Buffer could be platform dependent; for example, video decoding needs gralloc
+ // on Gonk. Therefore, derived class needs to implement its owned buffer
+ // allocate/release API according to its platform type.
+ virtual nsresult AllocateOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBufferList) = 0;
+
+ virtual nsresult ReleaseOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBufferList) = 0;
+
+ virtual OMX_ERRORTYPE GetState(OMX_STATETYPE* aType) = 0;
+
+ virtual OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize) = 0;
+
+ virtual OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE nIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize) = 0;
+
+ virtual nsresult Shutdown() = 0;
+
+ virtual ~OmxPlatformLayer() {}
+
+ // For decoders, input port index is start port number and output port is next.
+ // See OpenMAX IL spec v1.1.2 section 8.6.1 & 8.8.1.
+ OMX_U32 InputPortIndex() { return mStartPortNumber; }
+
+ OMX_U32 OutputPortIndex() { return mStartPortNumber + 1; }
+
+ void GetPortIndices(nsTArray<uint32_t>& aPortIndex) {
+ aPortIndex.AppendElement(InputPortIndex());
+ aPortIndex.AppendElement(OutputPortIndex());
+ }
+
+ virtual OMX_VIDEO_CODINGTYPE CompressionFormat();
+
+ // Check if the platform implementation supports given MIME type.
+ static bool SupportsMimeType(const nsACString& aMimeType);
+
+ // Hide the details of creating implementation objects for different platforms.
+ static OmxPlatformLayer* Create(OmxDataDecoder* aDataDecoder,
+ OmxPromiseLayer* aPromiseLayer,
+ TaskQueue* aTaskQueue,
+ layers::ImageContainer* aImageContainer);
+
+protected:
+ OmxPlatformLayer() : mInfo(nullptr), mStartPortNumber(0) {}
+
+ // The pointee is held by |OmxDataDecoder::mTrackInfo| and will outlive this pointer.
+ const TrackInfo* mInfo;
+ OMX_U32 mStartPortNumber;
+};
+
+}
+
+#endif // OmxPlatformLayer_h_
diff --git a/dom/media/platforms/omx/OmxPromiseLayer.cpp b/dom/media/platforms/omx/OmxPromiseLayer.cpp
new file mode 100644
index 000000000..0c794289d
--- /dev/null
+++ b/dom/media/platforms/omx/OmxPromiseLayer.cpp
@@ -0,0 +1,382 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OmxPromiseLayer.h"
+
+#include "ImageContainer.h"
+
+#include "OmxDataDecoder.h"
+#include "OmxPlatformLayer.h"
+
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#define LOG(arg, ...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, ("OmxPromiseLayer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+OmxPromiseLayer::OmxPromiseLayer(TaskQueue* aTaskQueue,
+ OmxDataDecoder* aDataDecoder,
+ layers::ImageContainer* aImageContainer)
+ : mTaskQueue(aTaskQueue)
+{
+ mPlatformLayer = OmxPlatformLayer::Create(aDataDecoder,
+ this,
+ aTaskQueue,
+ aImageContainer);
+ MOZ_ASSERT(!!mPlatformLayer);
+}
+
+RefPtr<OmxPromiseLayer::OmxCommandPromise>
+OmxPromiseLayer::Init(const TrackInfo* aInfo)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ OMX_ERRORTYPE err = mPlatformLayer->InitOmxToStateLoaded(aInfo);
+ if (err != OMX_ErrorNone) {
+ OmxCommandFailureHolder failure(OMX_ErrorUndefined, OMX_CommandStateSet);
+ return OmxCommandPromise::CreateAndReject(failure, __func__);
+ }
+
+ OMX_STATETYPE state = GetState();
+ if (state == OMX_StateLoaded) {
+ return OmxCommandPromise::CreateAndResolve(OMX_CommandStateSet, __func__);
+ } if (state == OMX_StateIdle) {
+ return SendCommand(OMX_CommandStateSet, OMX_StateIdle, nullptr);
+ }
+
+ OmxCommandFailureHolder failure(OMX_ErrorUndefined, OMX_CommandStateSet);
+ return OmxCommandPromise::CreateAndReject(failure, __func__);
+}
+
+OMX_ERRORTYPE
+OmxPromiseLayer::Config()
+{
+ MOZ_ASSERT(GetState() == OMX_StateLoaded);
+
+ return mPlatformLayer->Config();
+}
+
+RefPtr<OmxPromiseLayer::OmxBufferPromise>
+OmxPromiseLayer::FillBuffer(BufferData* aData)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ LOG("buffer %p", aData->mBuffer);
+
+ RefPtr<OmxBufferPromise> p = aData->mPromise.Ensure(__func__);
+
+ OMX_ERRORTYPE err = mPlatformLayer->FillThisBuffer(aData);
+
+ if (err != OMX_ErrorNone) {
+ OmxBufferFailureHolder failure(err, aData);
+ aData->mPromise.Reject(Move(failure), __func__);
+ } else {
+ aData->mStatus = BufferData::BufferStatus::OMX_COMPONENT;
+ GetBufferHolders(OMX_DirOutput)->AppendElement(aData);
+ }
+
+ return p;
+}
+
+RefPtr<OmxPromiseLayer::OmxBufferPromise>
+OmxPromiseLayer::EmptyBuffer(BufferData* aData)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ LOG("buffer %p, size %d", aData->mBuffer, aData->mBuffer->nFilledLen);
+
+ RefPtr<OmxBufferPromise> p = aData->mPromise.Ensure(__func__);
+
+ OMX_ERRORTYPE err = mPlatformLayer->EmptyThisBuffer(aData);
+
+ if (err != OMX_ErrorNone) {
+ OmxBufferFailureHolder failure(err, aData);
+ aData->mPromise.Reject(Move(failure), __func__);
+ } else {
+ if (aData->mRawData) {
+ mRawDatas.AppendElement(Move(aData->mRawData));
+ }
+ aData->mStatus = BufferData::BufferStatus::OMX_COMPONENT;
+ GetBufferHolders(OMX_DirInput)->AppendElement(aData);
+ }
+
+ return p;
+}
+
+OmxPromiseLayer::BUFFERLIST*
+OmxPromiseLayer::GetBufferHolders(OMX_DIRTYPE aType)
+{
+ MOZ_ASSERT(aType == OMX_DirInput || aType == OMX_DirOutput);
+
+ if (aType == OMX_DirInput) {
+ return &mInbufferHolders;
+ }
+
+ return &mOutbufferHolders;
+}
+
+already_AddRefed<MediaRawData>
+OmxPromiseLayer::FindAndRemoveRawData(OMX_TICKS aTimecode)
+{
+ for (auto raw : mRawDatas) {
+ if (raw->mTime == aTimecode) {
+ mRawDatas.RemoveElement(raw);
+ return raw.forget();
+ }
+ }
+ return nullptr;
+}
+
+already_AddRefed<BufferData>
+OmxPromiseLayer::FindAndRemoveBufferHolder(OMX_DIRTYPE aType,
+ BufferData::BufferID aId)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ RefPtr<BufferData> holder;
+ BUFFERLIST* holders = GetBufferHolders(aType);
+
+ for (uint32_t i = 0; i < holders->Length(); i++) {
+ if (holders->ElementAt(i)->ID() == aId) {
+ holder = holders->ElementAt(i);
+ holders->RemoveElementAt(i);
+ return holder.forget();
+ }
+ }
+
+ return nullptr;
+}
+
+already_AddRefed<BufferData>
+OmxPromiseLayer::FindBufferById(OMX_DIRTYPE aType, BufferData::BufferID aId)
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+
+ RefPtr<BufferData> holder;
+ BUFFERLIST* holders = GetBufferHolders(aType);
+
+ for (uint32_t i = 0; i < holders->Length(); i++) {
+ if (holders->ElementAt(i)->ID() == aId) {
+ holder = holders->ElementAt(i);
+ return holder.forget();
+ }
+ }
+
+ return nullptr;
+}
+
+void
+OmxPromiseLayer::EmptyFillBufferDone(OMX_DIRTYPE aType, BufferData* aData)
+{
+ if (aData) {
+ LOG("type %d, buffer %p", aType, aData->mBuffer);
+ if (aType == OMX_DirOutput) {
+ aData->mRawData = nullptr;
+ aData->mRawData = FindAndRemoveRawData(aData->mBuffer->nTimeStamp);
+ }
+ aData->mStatus = BufferData::BufferStatus::OMX_CLIENT;
+ aData->mPromise.Resolve(aData, __func__);
+ } else {
+ LOG("type %d, no buffer", aType);
+ }
+}
+
+void
+OmxPromiseLayer::EmptyFillBufferDone(OMX_DIRTYPE aType, BufferData::BufferID aID)
+{
+ RefPtr<BufferData> holder = FindAndRemoveBufferHolder(aType, aID);
+ EmptyFillBufferDone(aType, holder);
+}
+
+RefPtr<OmxPromiseLayer::OmxCommandPromise>
+OmxPromiseLayer::SendCommand(OMX_COMMANDTYPE aCmd, OMX_U32 aParam1, OMX_PTR aCmdData)
+{
+ if (aCmd == OMX_CommandFlush) {
+ // It doesn't support another flush commands before previous one is completed.
+ MOZ_RELEASE_ASSERT(!mFlushCommands.Length());
+
+ // Some coomponents don't send event with OMX_ALL, they send flush complete
+ // event with input port and another event for output port.
+ // In prupose of better compatibility, we interpret the OMX_ALL to OMX_DirInput
+ // and OMX_DirOutput flush separately.
+ OMX_DIRTYPE types[] = {OMX_DIRTYPE::OMX_DirInput, OMX_DIRTYPE::OMX_DirOutput};
+ for(const auto type : types) {
+ if ((aParam1 == type) || (aParam1 == OMX_ALL)) {
+ mFlushCommands.AppendElement(FlushCommand({type, aCmdData}));
+ }
+
+ if (type == OMX_DirInput) {
+ // Clear all buffered raw data.
+ mRawDatas.Clear();
+ }
+ }
+
+ // Don't overlay more than one flush command, some components can't overlay flush commands.
+ // So here we send another flush after receiving the previous flush completed event.
+ if (mFlushCommands.Length()) {
+ OMX_ERRORTYPE err =
+ mPlatformLayer->SendCommand(OMX_CommandFlush,
+ mFlushCommands.ElementAt(0).type,
+ mFlushCommands.ElementAt(0).cmd);
+ if (err != OMX_ErrorNone) {
+ OmxCommandFailureHolder failure(OMX_ErrorNotReady, OMX_CommandFlush);
+ return OmxCommandPromise::CreateAndReject(failure, __func__);
+ }
+ } else {
+ LOG("OMX_CommandFlush parameter error");
+ OmxCommandFailureHolder failure(OMX_ErrorNotReady, OMX_CommandFlush);
+ return OmxCommandPromise::CreateAndReject(failure, __func__);
+ }
+ } else {
+ OMX_ERRORTYPE err = mPlatformLayer->SendCommand(aCmd, aParam1, aCmdData);
+ if (err != OMX_ErrorNone) {
+ OmxCommandFailureHolder failure(OMX_ErrorNotReady, aCmd);
+ return OmxCommandPromise::CreateAndReject(failure, __func__);
+ }
+ }
+
+ RefPtr<OmxCommandPromise> p;
+ if (aCmd == OMX_CommandStateSet) {
+ p = mCommandStatePromise.Ensure(__func__);
+ } else if (aCmd == OMX_CommandFlush) {
+ p = mFlushPromise.Ensure(__func__);
+ } else if (aCmd == OMX_CommandPortEnable) {
+ p = mPortEnablePromise.Ensure(__func__);
+ } else if (aCmd == OMX_CommandPortDisable) {
+ p = mPortDisablePromise.Ensure(__func__);
+ } else {
+ LOG("error unsupport command");
+ MOZ_ASSERT(0);
+ }
+
+ return p;
+}
+
+bool
+OmxPromiseLayer::Event(OMX_EVENTTYPE aEvent, OMX_U32 aData1, OMX_U32 aData2)
+{
+ OMX_COMMANDTYPE cmd = (OMX_COMMANDTYPE) aData1;
+ switch (aEvent) {
+ case OMX_EventCmdComplete:
+ {
+ if (cmd == OMX_CommandStateSet) {
+ mCommandStatePromise.Resolve(OMX_CommandStateSet, __func__);
+ } else if (cmd == OMX_CommandFlush) {
+ MOZ_RELEASE_ASSERT(mFlushCommands.ElementAt(0).type == aData2);
+ LOG("OMX_CommandFlush completed port type %d", aData2);
+ mFlushCommands.RemoveElementAt(0);
+
+ // Sending next flush command.
+ if (mFlushCommands.Length()) {
+ OMX_ERRORTYPE err =
+ mPlatformLayer->SendCommand(OMX_CommandFlush,
+ mFlushCommands.ElementAt(0).type,
+ mFlushCommands.ElementAt(0).cmd);
+ if (err != OMX_ErrorNone) {
+ OmxCommandFailureHolder failure(OMX_ErrorNotReady, OMX_CommandFlush);
+ mFlushPromise.Reject(failure, __func__);
+ }
+ } else {
+ mFlushPromise.Resolve(OMX_CommandFlush, __func__);
+ }
+ } else if (cmd == OMX_CommandPortDisable) {
+ mPortDisablePromise.Resolve(OMX_CommandPortDisable, __func__);
+ } else if (cmd == OMX_CommandPortEnable) {
+ mPortEnablePromise.Resolve(OMX_CommandPortEnable, __func__);
+ }
+ break;
+ }
+ case OMX_EventError:
+ {
+ if (cmd == OMX_CommandStateSet) {
+ OmxCommandFailureHolder failure(OMX_ErrorUndefined, OMX_CommandStateSet);
+ mCommandStatePromise.Reject(failure, __func__);
+ } else if (cmd == OMX_CommandFlush) {
+ OmxCommandFailureHolder failure(OMX_ErrorUndefined, OMX_CommandFlush);
+ mFlushPromise.Reject(failure, __func__);
+ } else if (cmd == OMX_CommandPortDisable) {
+ OmxCommandFailureHolder failure(OMX_ErrorUndefined, OMX_CommandPortDisable);
+ mPortDisablePromise.Reject(failure, __func__);
+ } else if (cmd == OMX_CommandPortEnable) {
+ OmxCommandFailureHolder failure(OMX_ErrorUndefined, OMX_CommandPortEnable);
+ mPortEnablePromise.Reject(failure, __func__);
+ } else {
+ return false;
+ }
+ break;
+ }
+ default:
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+nsresult
+OmxPromiseLayer::AllocateOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBuffers)
+{
+ return mPlatformLayer->AllocateOmxBuffer(aType, aBuffers);
+}
+
+nsresult
+OmxPromiseLayer::ReleaseOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBuffers)
+{
+ return mPlatformLayer->ReleaseOmxBuffer(aType, aBuffers);
+}
+
+OMX_STATETYPE
+OmxPromiseLayer::GetState()
+{
+ OMX_STATETYPE state;
+ OMX_ERRORTYPE err = mPlatformLayer->GetState(&state);
+ return err == OMX_ErrorNone ? state : OMX_StateInvalid;
+}
+
+OMX_ERRORTYPE
+OmxPromiseLayer::GetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize)
+{
+ return mPlatformLayer->GetParameter(aParamIndex,
+ aComponentParameterStructure,
+ aComponentParameterSize);
+}
+
+OMX_ERRORTYPE
+OmxPromiseLayer::SetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize)
+{
+ return mPlatformLayer->SetParameter(aParamIndex,
+ aComponentParameterStructure,
+ aComponentParameterSize);
+}
+
+OMX_U32
+OmxPromiseLayer::InputPortIndex()
+{
+ return mPlatformLayer->InputPortIndex();
+}
+
+OMX_U32
+OmxPromiseLayer::OutputPortIndex()
+{
+ return mPlatformLayer->OutputPortIndex();
+}
+
+nsresult
+OmxPromiseLayer::Shutdown()
+{
+ LOG("");
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ MOZ_ASSERT(!GetBufferHolders(OMX_DirInput)->Length());
+ MOZ_ASSERT(!GetBufferHolders(OMX_DirOutput)->Length());
+ return mPlatformLayer->Shutdown();
+}
+
+}
diff --git a/dom/media/platforms/omx/OmxPromiseLayer.h b/dom/media/platforms/omx/OmxPromiseLayer.h
new file mode 100644
index 000000000..ecc6b2a9d
--- /dev/null
+++ b/dom/media/platforms/omx/OmxPromiseLayer.h
@@ -0,0 +1,252 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(OmxPromiseLayer_h_)
+#define OmxPromiseLayer_h_
+
+#include "mozilla/MozPromise.h"
+#include "mozilla/TaskQueue.h"
+#include "nsAutoPtr.h"
+
+#include "OMX_Core.h"
+#include "OMX_Types.h"
+
+namespace mozilla {
+
+namespace layers
+{
+class ImageContainer;
+}
+
+class MediaData;
+class MediaRawData;
+class OmxDataDecoder;
+class OmxPlatformLayer;
+class TrackInfo;
+
+/* This class acts as a middle layer between OmxDataDecoder and the underlying
+ * OmxPlatformLayer.
+ *
+ * This class has two purposes:
+ * 1. Using promise instead of OpenMax async callback function.
+ * For example, OmxCommandPromise is used for OpenMax IL SendCommand.
+ * 2. Manage the buffer exchanged between client and component.
+ * Because omx buffer works crossing threads, so each omx buffer has its own
+ * promise, it is defined in BufferData.
+ *
+ * All of functions and members in this class should be run in the same
+ * TaskQueue.
+ */
+class OmxPromiseLayer {
+protected:
+ virtual ~OmxPromiseLayer() {}
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(OmxPromiseLayer)
+
+ OmxPromiseLayer(TaskQueue* aTaskQueue,
+ OmxDataDecoder* aDataDecoder,
+ layers::ImageContainer* aImageContainer);
+
+ class BufferData;
+
+ typedef nsTArray<RefPtr<BufferData>> BUFFERLIST;
+
+ class OmxBufferFailureHolder {
+ public:
+ OmxBufferFailureHolder(OMX_ERRORTYPE aError, BufferData* aBuffer)
+ : mError(aError)
+ , mBuffer(aBuffer)
+ {}
+
+ OMX_ERRORTYPE mError;
+ BufferData* mBuffer;
+ };
+
+ typedef MozPromise<BufferData*, OmxBufferFailureHolder, /* IsExclusive = */ false> OmxBufferPromise;
+
+ class OmxCommandFailureHolder {
+ public:
+ OmxCommandFailureHolder(OMX_ERRORTYPE aErrorType,
+ OMX_COMMANDTYPE aCommandType)
+ : mErrorType(aErrorType)
+ , mCommandType(aCommandType)
+ {}
+
+ OMX_ERRORTYPE mErrorType;
+ OMX_COMMANDTYPE mCommandType;
+ };
+
+ typedef MozPromise<OMX_COMMANDTYPE, OmxCommandFailureHolder, /* IsExclusive = */ true> OmxCommandPromise;
+
+ typedef MozPromise<uint32_t, bool, /* IsExclusive = */ true> OmxPortConfigPromise;
+
+ // TODO: maybe a generic promise is good enough for this case?
+ RefPtr<OmxCommandPromise> Init(const TrackInfo* aInfo);
+
+ OMX_ERRORTYPE Config();
+
+ RefPtr<OmxBufferPromise> FillBuffer(BufferData* aData);
+
+ RefPtr<OmxBufferPromise> EmptyBuffer(BufferData* aData);
+
+ RefPtr<OmxCommandPromise> SendCommand(OMX_COMMANDTYPE aCmd,
+ OMX_U32 aParam1,
+ OMX_PTR aCmdData);
+
+ nsresult AllocateOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBuffers);
+
+ nsresult ReleaseOmxBuffer(OMX_DIRTYPE aType, BUFFERLIST* aBuffers);
+
+ OMX_STATETYPE GetState();
+
+ OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize);
+
+ OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE nIndex,
+ OMX_PTR aComponentParameterStructure,
+ OMX_U32 aComponentParameterSize);
+
+ OMX_U32 InputPortIndex();
+
+ OMX_U32 OutputPortIndex();
+
+ nsresult Shutdown();
+
+ // BufferData maintains the status of OMX buffer (OMX_BUFFERHEADERTYPE).
+ // mStatus tracks the buffer owner.
+ // And a promise because OMX buffer working among different threads.
+ class BufferData {
+ protected:
+ virtual ~BufferData() {}
+
+ public:
+ explicit BufferData(OMX_BUFFERHEADERTYPE* aBuffer)
+ : mEos(false)
+ , mStatus(BufferStatus::FREE)
+ , mBuffer(aBuffer)
+ {}
+
+ typedef void* BufferID;
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BufferData)
+
+ // In most cases, the ID of this buffer is the pointer address of mBuffer.
+ // However, in platform like gonk, it is another value.
+ virtual BufferID ID()
+ {
+ return mBuffer;
+ }
+
+ // Return the platform dependent MediaData().
+ // For example, it returns the MediaData with Gralloc texture.
+ // If it returns nullptr, then caller uses the normal way to
+ // create MediaData().
+ virtual already_AddRefed<MediaData> GetPlatformMediaData()
+ {
+ return nullptr;
+ }
+
+ // The buffer could be used by several objects. And only one object owns the
+ // buffer the same time.
+ // FREE:
+ // nobody uses it.
+ //
+ // OMX_COMPONENT:
+ // buffer is used by OMX component (OmxPlatformLayer).
+ //
+ // OMX_CLIENT:
+ // buffer is used by client which is wait for audio/video playing
+ // (OmxDataDecoder)
+ //
+ // OMX_CLIENT_OUTPUT:
+ // used by client to output decoded data (for example, Gecko layer in
+ // this case)
+ //
+ // For output port buffer, the status transition is:
+ // FREE -> OMX_COMPONENT -> OMX_CLIENT -> OMX_CLIENT_OUTPUT -> FREE
+ //
+ // For input port buffer, the status transition is:
+ // FREE -> OMX_COMPONENT -> OMX_CLIENT -> FREE
+ //
+ enum BufferStatus {
+ FREE,
+ OMX_COMPONENT,
+ OMX_CLIENT,
+ OMX_CLIENT_OUTPUT,
+ INVALID
+ };
+
+ bool mEos;
+
+ // The raw keeps in OmxPromiseLayer after EmptyBuffer and then passing to
+ // output decoded buffer in EmptyFillBufferDone. It is used to keep the
+ // records of the original data from demuxer, like duration, stream offset...etc.
+ RefPtr<MediaRawData> mRawData;
+
+ // Because OMX buffer works across threads, so it uses a promise
+ // for each buffer when the buffer is used by Omx component.
+ MozPromiseHolder<OmxBufferPromise> mPromise;
+ BufferStatus mStatus;
+ OMX_BUFFERHEADERTYPE* mBuffer;
+ };
+
+ void EmptyFillBufferDone(OMX_DIRTYPE aType, BufferData::BufferID aID);
+
+ void EmptyFillBufferDone(OMX_DIRTYPE aType, BufferData* aData);
+
+ already_AddRefed<BufferData>
+ FindBufferById(OMX_DIRTYPE aType, BufferData::BufferID aId);
+
+ already_AddRefed<BufferData>
+ FindAndRemoveBufferHolder(OMX_DIRTYPE aType, BufferData::BufferID aId);
+
+ // Return true if event is handled.
+ bool Event(OMX_EVENTTYPE aEvent, OMX_U32 aData1, OMX_U32 aData2);
+
+protected:
+ struct FlushCommand {
+ OMX_DIRTYPE type;
+ OMX_PTR cmd;
+ };
+
+ BUFFERLIST* GetBufferHolders(OMX_DIRTYPE aType);
+
+ already_AddRefed<MediaRawData> FindAndRemoveRawData(OMX_TICKS aTimecode);
+
+ RefPtr<TaskQueue> mTaskQueue;
+
+ MozPromiseHolder<OmxCommandPromise> mCommandStatePromise;
+
+ MozPromiseHolder<OmxCommandPromise> mPortDisablePromise;
+
+ MozPromiseHolder<OmxCommandPromise> mPortEnablePromise;
+
+ MozPromiseHolder<OmxCommandPromise> mFlushPromise;
+
+ nsTArray<FlushCommand> mFlushCommands;
+
+ nsAutoPtr<OmxPlatformLayer> mPlatformLayer;
+
+private:
+ // Elements are added to holders when FillBuffer() or FillBuffer(). And
+ // removing element when the promise is resolved. Buffers in these lists
+ // should NOT be used by other component; for example, output it to audio
+ // output. These lists should be empty when engine is about to shutdown.
+ //
+ // Note:
+ // There bufferlist should not be used by other class directly.
+ BUFFERLIST mInbufferHolders;
+
+ BUFFERLIST mOutbufferHolders;
+
+ nsTArray<RefPtr<MediaRawData>> mRawDatas;
+};
+
+}
+
+#endif /* OmxPromiseLayer_h_ */
diff --git a/dom/media/platforms/omx/moz.build b/dom/media/platforms/omx/moz.build
new file mode 100644
index 000000000..9f641d937
--- /dev/null
+++ b/dom/media/platforms/omx/moz.build
@@ -0,0 +1,57 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'OmxDecoderModule.h',
+]
+
+UNIFIED_SOURCES += [
+ 'OmxDataDecoder.cpp',
+ 'OmxDecoderModule.cpp',
+ 'OmxPlatformLayer.cpp',
+ 'OmxPromiseLayer.cpp',
+]
+
+LOCAL_INCLUDES += [
+ '/media/openmax_il/il112',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and (CONFIG['ANDROID_VERSION'] == '19' or CONFIG['ANDROID_VERSION'] == '20'):
+ # Suppress some GCC/clang warnings being treated as errors:
+ # - about attributes on forward declarations for types that are already
+ # defined, which complains about an important MOZ_EXPORT for android::AString
+ # - about multi-character constants which are used in codec-related code
+ if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
+ CXXFLAGS += [
+ '-Wno-error=attributes',
+ '-Wno-error=multichar'
+ ]
+ CXXFLAGS += [
+ '-I%s/%s' % (CONFIG['ANDROID_SOURCE'], d) for d in [
+ 'frameworks/base/include/binder',
+ 'frameworks/base/include/utils',
+ ]
+ ]
+ UNIFIED_SOURCES += [
+ 'GonkOmxPlatformLayer.cpp',
+ ]
+ EXTRA_DSO_LDOPTS += [
+ '-libbinder',
+ ]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
+
+if CONFIG['_MSC_VER']:
+ # Avoid warnings from third-party code that we can not modify.
+ if CONFIG['CLANG_CL']:
+ CXXFLAGS += ['-Wno-invalid-source-encoding']
+ else:
+ CXXFLAGS += ['-validate-charset-']
diff --git a/dom/media/platforms/wmf/DXVA2Manager.cpp b/dom/media/platforms/wmf/DXVA2Manager.cpp
new file mode 100644
index 000000000..9fdb0fa20
--- /dev/null
+++ b/dom/media/platforms/wmf/DXVA2Manager.cpp
@@ -0,0 +1,955 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DXVA2Manager.h"
+#include <d3d11.h>
+#include "nsThreadUtils.h"
+#include "ImageContainer.h"
+#include "gfxWindowsPlatform.h"
+#include "D3D9SurfaceImage.h"
+#include "mozilla/gfx/DeviceManagerDx.h"
+#include "mozilla/layers/D3D11ShareHandleImage.h"
+#include "mozilla/layers/ImageBridgeChild.h"
+#include "mozilla/layers/TextureForwarder.h"
+#include "mozilla/Telemetry.h"
+#include "MediaTelemetryConstants.h"
+#include "mfapi.h"
+#include "gfxPrefs.h"
+#include "MFTDecoder.h"
+#include "DriverCrashGuard.h"
+#include "nsPrintfCString.h"
+#include "gfxCrashReporterUtils.h"
+#include "VideoUtils.h"
+
+const CLSID CLSID_VideoProcessorMFT =
+{
+ 0x88753b26,
+ 0x5b24,
+ 0x49bd,
+ { 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82 }
+};
+
+const GUID MF_XVP_PLAYBACK_MODE =
+{
+ 0x3c5d293f,
+ 0xad67,
+ 0x4e29,
+ { 0xaf, 0x12, 0xcf, 0x3e, 0x23, 0x8a, 0xcc, 0xe9 }
+};
+
+DEFINE_GUID(MF_LOW_LATENCY,
+ 0x9c27891a, 0xed7a, 0x40e1, 0x88, 0xe8, 0xb2, 0x27, 0x27, 0xa0, 0x24, 0xee);
+
+// R600, R700, Evergreen and Cayman AMD cards. These support DXVA via UVD3 or earlier, and don't
+// handle 1080p60 well.
+static const DWORD sAMDPreUVD4[] = {
+ 0x9400, 0x9401, 0x9402, 0x9403, 0x9405, 0x940a, 0x940b, 0x940f, 0x94c0, 0x94c1, 0x94c3, 0x94c4, 0x94c5,
+ 0x94c6, 0x94c7, 0x94c8, 0x94c9, 0x94cb, 0x94cc, 0x94cd, 0x9580, 0x9581, 0x9583, 0x9586, 0x9587, 0x9588,
+ 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9500, 0x9501, 0x9504, 0x9505, 0x9506, 0x9507,
+ 0x9508, 0x9509, 0x950f, 0x9511, 0x9515, 0x9517, 0x9519, 0x95c0, 0x95c2, 0x95c4, 0x95c5, 0x95c6, 0x95c7,
+ 0x95c9, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x9590, 0x9591, 0x9593, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599,
+ 0x959b, 0x9610, 0x9611, 0x9612, 0x9613, 0x9614, 0x9615, 0x9616, 0x9710, 0x9711, 0x9712, 0x9713, 0x9714,
+ 0x9715, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9446, 0x944a, 0x944b, 0x944c, 0x944e, 0x9450, 0x9452,
+ 0x9456, 0x945a, 0x945b, 0x945e, 0x9460, 0x9462, 0x946a, 0x946b, 0x947a, 0x947b, 0x9480, 0x9487, 0x9488,
+ 0x9489, 0x948a, 0x948f, 0x9490, 0x9491, 0x9495, 0x9498, 0x949c, 0x949e, 0x949f, 0x9540, 0x9541, 0x9542,
+ 0x954e, 0x954f, 0x9552, 0x9553, 0x9555, 0x9557, 0x955f, 0x94a0, 0x94a1, 0x94a3, 0x94b1, 0x94b3, 0x94b4,
+ 0x94b5, 0x94b9, 0x68e0, 0x68e1, 0x68e4, 0x68e5, 0x68e8, 0x68e9, 0x68f1, 0x68f2, 0x68f8, 0x68f9, 0x68fa,
+ 0x68fe, 0x68c0, 0x68c1, 0x68c7, 0x68c8, 0x68c9, 0x68d8, 0x68d9, 0x68da, 0x68de, 0x68a0, 0x68a1, 0x68a8,
+ 0x68a9, 0x68b0, 0x68b8, 0x68b9, 0x68ba, 0x68be, 0x68bf, 0x6880, 0x6888, 0x6889, 0x688a, 0x688c, 0x688d,
+ 0x6898, 0x6899, 0x689b, 0x689e, 0x689c, 0x689d, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, 0x9808,
+ 0x9809, 0x980a, 0x9640, 0x9641, 0x9647, 0x9648, 0x964a, 0x964b, 0x964c, 0x964e, 0x964f, 0x9642, 0x9643,
+ 0x9644, 0x9645, 0x9649, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6726, 0x6727, 0x6728, 0x6729,
+ 0x6738, 0x6739, 0x673e, 0x6740, 0x6741, 0x6742, 0x6743, 0x6744, 0x6745, 0x6746, 0x6747, 0x6748, 0x6749,
+ 0x674a, 0x6750, 0x6751, 0x6758, 0x6759, 0x675b, 0x675d, 0x675f, 0x6840, 0x6841, 0x6842, 0x6843, 0x6849,
+ 0x6850, 0x6858, 0x6859, 0x6760, 0x6761, 0x6762, 0x6763, 0x6764, 0x6765, 0x6766, 0x6767, 0x6768, 0x6770,
+ 0x6771, 0x6772, 0x6778, 0x6779, 0x677b, 0x6700, 0x6701, 0x6702, 0x6703, 0x6704, 0x6705, 0x6706, 0x6707,
+ 0x6708, 0x6709, 0x6718, 0x6719, 0x671c, 0x671d, 0x671f, 0x9900, 0x9901, 0x9903, 0x9904, 0x9905, 0x9906,
+ 0x9907, 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990d, 0x990e, 0x990f, 0x9910, 0x9913, 0x9917, 0x9918,
+ 0x9919, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b,
+ 0x999c, 0x999d, 0x99a0, 0x99a2, 0x99a4
+};
+
+// The size we use for our synchronization surface.
+// 16x16 is the size recommended by Microsoft (in the D3D9ExDXGISharedSurf sample) that works
+// best to avoid driver bugs.
+static const uint32_t kSyncSurfaceSize = 16;
+
+namespace mozilla {
+
+using layers::Image;
+using layers::ImageContainer;
+using layers::D3D9SurfaceImage;
+using layers::D3D9RecycleAllocator;
+using layers::D3D11ShareHandleImage;
+using layers::D3D11RecycleAllocator;
+
+class D3D9DXVA2Manager : public DXVA2Manager
+{
+public:
+ D3D9DXVA2Manager();
+ virtual ~D3D9DXVA2Manager();
+
+ HRESULT Init(layers::KnowsCompositor* aKnowsCompositor,
+ nsACString& aFailureReason);
+
+ IUnknown* GetDXVADeviceManager() override;
+
+ // Copies a region (aRegion) of the video frame stored in aVideoSample
+ // into an image which is returned by aOutImage.
+ HRESULT CopyToImage(IMFSample* aVideoSample,
+ const nsIntRect& aRegion,
+ Image** aOutImage) override;
+
+ bool SupportsConfig(IMFMediaType* aType, float aFramerate) override;
+
+private:
+ RefPtr<IDirect3D9Ex> mD3D9;
+ RefPtr<IDirect3DDevice9Ex> mDevice;
+ RefPtr<IDirect3DDeviceManager9> mDeviceManager;
+ RefPtr<D3D9RecycleAllocator> mTextureClientAllocator;
+ RefPtr<IDirectXVideoDecoderService> mDecoderService;
+ RefPtr<IDirect3DSurface9> mSyncSurface;
+ GUID mDecoderGUID;
+ UINT32 mResetToken;
+ bool mFirstFrame;
+ bool mIsAMDPreUVD4;
+};
+
+void GetDXVA2ExtendedFormatFromMFMediaType(IMFMediaType *pType,
+ DXVA2_ExtendedFormat *pFormat)
+{
+ // Get the interlace mode.
+ MFVideoInterlaceMode interlace =
+ (MFVideoInterlaceMode)MFGetAttributeUINT32(pType, MF_MT_INTERLACE_MODE, MFVideoInterlace_Unknown);
+
+ if (interlace == MFVideoInterlace_MixedInterlaceOrProgressive) {
+ pFormat->SampleFormat = DXVA2_SampleFieldInterleavedEvenFirst;
+ } else {
+ pFormat->SampleFormat = (UINT)interlace;
+ }
+
+ pFormat->VideoChromaSubsampling =
+ MFGetAttributeUINT32(pType, MF_MT_VIDEO_CHROMA_SITING, MFVideoChromaSubsampling_Unknown);
+ pFormat->NominalRange =
+ MFGetAttributeUINT32(pType, MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_Unknown);
+ pFormat->VideoTransferMatrix =
+ MFGetAttributeUINT32(pType, MF_MT_YUV_MATRIX, MFVideoTransferMatrix_Unknown);
+ pFormat->VideoLighting =
+ MFGetAttributeUINT32(pType, MF_MT_VIDEO_LIGHTING, MFVideoLighting_Unknown);
+ pFormat->VideoPrimaries =
+ MFGetAttributeUINT32(pType, MF_MT_VIDEO_PRIMARIES, MFVideoPrimaries_Unknown);
+ pFormat->VideoTransferFunction =
+ MFGetAttributeUINT32(pType, MF_MT_TRANSFER_FUNCTION, MFVideoTransFunc_Unknown);
+}
+
+HRESULT ConvertMFTypeToDXVAType(IMFMediaType *pType, DXVA2_VideoDesc *pDesc)
+{
+ ZeroMemory(pDesc, sizeof(*pDesc));
+
+ // The D3D format is the first DWORD of the subtype GUID.
+ GUID subtype = GUID_NULL;
+ HRESULT hr = pType->GetGUID(MF_MT_SUBTYPE, &subtype);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ pDesc->Format = (D3DFORMAT)subtype.Data1;
+
+ UINT32 width = 0;
+ UINT32 height = 0;
+ hr = MFGetAttributeSize(pType, MF_MT_FRAME_SIZE, &width, &height);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ NS_ENSURE_TRUE(width <= MAX_VIDEO_WIDTH, E_FAIL);
+ NS_ENSURE_TRUE(height <= MAX_VIDEO_HEIGHT, E_FAIL);
+ pDesc->SampleWidth = width;
+ pDesc->SampleHeight = height;
+
+ UINT32 fpsNumerator = 0;
+ UINT32 fpsDenominator = 0;
+ hr = MFGetAttributeRatio(pType, MF_MT_FRAME_RATE, &fpsNumerator, &fpsDenominator);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ pDesc->InputSampleFreq.Numerator = fpsNumerator;
+ pDesc->InputSampleFreq.Denominator = fpsDenominator;
+
+ GetDXVA2ExtendedFormatFromMFMediaType(pType, &pDesc->SampleFormat);
+ pDesc->OutputFrameFreq = pDesc->InputSampleFreq;
+ if ((pDesc->SampleFormat.SampleFormat == DXVA2_SampleFieldInterleavedEvenFirst) ||
+ (pDesc->SampleFormat.SampleFormat == DXVA2_SampleFieldInterleavedOddFirst)) {
+ pDesc->OutputFrameFreq.Numerator *= 2;
+ }
+
+ return S_OK;
+}
+
+static const GUID DXVA2_ModeH264_E = {
+ 0x1b81be68, 0xa0c7, 0x11d3, { 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5 }
+};
+
+static const GUID DXVA2_Intel_ModeH264_E = {
+ 0x604F8E68, 0x4951, 0x4c54, { 0x88, 0xFE, 0xAB, 0xD2, 0x5C, 0x15, 0xB3, 0xD6 }
+};
+
+// This tests if a DXVA video decoder can be created for the given media type/resolution.
+// It uses the same decoder device (DXVA2_ModeH264_E - DXVA2_ModeH264_VLD_NoFGT) as the H264
+// decoder MFT provided by windows (CLSID_CMSH264DecoderMFT) uses, so we can use it to determine
+// if the MFT will use software fallback or not.
+bool
+D3D9DXVA2Manager::SupportsConfig(IMFMediaType* aType, float aFramerate)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ gfx::D3D9VideoCrashGuard crashGuard;
+ if (crashGuard.Crashed()) {
+ NS_WARNING("DXVA2D3D9 crash detected");
+ return false;
+ }
+
+ DXVA2_VideoDesc desc;
+ HRESULT hr = ConvertMFTypeToDXVAType(aType, &desc);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ // AMD cards with UVD3 or earlier perform poorly trying to decode 1080p60 in hardware,
+ // so use software instead. Pick 45 as an arbitrary upper bound for the framerate we can
+ // handle.
+ if (mIsAMDPreUVD4 &&
+ (desc.SampleWidth >= 1920 || desc.SampleHeight >= 1088) &&
+ aFramerate > 45) {
+ return false;
+ }
+
+ UINT configCount;
+ DXVA2_ConfigPictureDecode* configs = nullptr;
+ hr = mDecoderService->GetDecoderConfigurations(mDecoderGUID, &desc, nullptr, &configCount, &configs);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ RefPtr<IDirect3DSurface9> surface;
+ hr = mDecoderService->CreateSurface(desc.SampleWidth, desc.SampleHeight, 0, (D3DFORMAT)MAKEFOURCC('N', 'V', '1', '2'),
+ D3DPOOL_DEFAULT, 0, DXVA2_VideoDecoderRenderTarget,
+ surface.StartAssignment(), NULL);
+ if (!SUCCEEDED(hr)) {
+ CoTaskMemFree(configs);
+ return false;
+ }
+
+ for (UINT i = 0; i < configCount; i++) {
+ RefPtr<IDirectXVideoDecoder> decoder;
+ IDirect3DSurface9* surfaces = surface;
+ hr = mDecoderService->CreateVideoDecoder(mDecoderGUID, &desc, &configs[i], &surfaces, 1, decoder.StartAssignment());
+ if (SUCCEEDED(hr) && decoder) {
+ CoTaskMemFree(configs);
+ return true;
+ }
+ }
+ CoTaskMemFree(configs);
+ return false;
+}
+
+D3D9DXVA2Manager::D3D9DXVA2Manager()
+ : mResetToken(0)
+ , mFirstFrame(true)
+ , mIsAMDPreUVD4(false)
+{
+ MOZ_COUNT_CTOR(D3D9DXVA2Manager);
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+D3D9DXVA2Manager::~D3D9DXVA2Manager()
+{
+ MOZ_COUNT_DTOR(D3D9DXVA2Manager);
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+IUnknown*
+D3D9DXVA2Manager::GetDXVADeviceManager()
+{
+ MutexAutoLock lock(mLock);
+ return mDeviceManager;
+}
+
+HRESULT
+D3D9DXVA2Manager::Init(layers::KnowsCompositor* aKnowsCompositor,
+ nsACString& aFailureReason)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ ScopedGfxFeatureReporter reporter("DXVA2D3D9");
+
+ gfx::D3D9VideoCrashGuard crashGuard;
+ if (crashGuard.Crashed()) {
+ NS_WARNING("DXVA2D3D9 crash detected");
+ aFailureReason.AssignLiteral("DXVA2D3D9 crashes detected in the past");
+ return E_FAIL;
+ }
+
+ // Create D3D9Ex.
+ HMODULE d3d9lib = LoadLibraryW(L"d3d9.dll");
+ NS_ENSURE_TRUE(d3d9lib, E_FAIL);
+ decltype(Direct3DCreate9Ex)* d3d9Create =
+ (decltype(Direct3DCreate9Ex)*) GetProcAddress(d3d9lib, "Direct3DCreate9Ex");
+ if (!d3d9Create) {
+ NS_WARNING("Couldn't find Direct3DCreate9Ex symbol in d3d9.dll");
+ aFailureReason.AssignLiteral("Couldn't find Direct3DCreate9Ex symbol in d3d9.dll");
+ return E_FAIL;
+ }
+ RefPtr<IDirect3D9Ex> d3d9Ex;
+ HRESULT hr = d3d9Create(D3D_SDK_VERSION, getter_AddRefs(d3d9Ex));
+ if (!d3d9Ex) {
+ NS_WARNING("Direct3DCreate9 failed");
+ aFailureReason.AssignLiteral("Direct3DCreate9 failed");
+ return E_FAIL;
+ }
+
+ // Ensure we can do the YCbCr->RGB conversion in StretchRect.
+ // Fail if we can't.
+ hr = d3d9Ex->CheckDeviceFormatConversion(D3DADAPTER_DEFAULT,
+ D3DDEVTYPE_HAL,
+ (D3DFORMAT)MAKEFOURCC('N','V','1','2'),
+ D3DFMT_X8R8G8B8);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("CheckDeviceFormatConversion failed with error %X", hr);
+ return hr;
+ }
+
+ // Create D3D9DeviceEx. We pass null HWNDs here even though the documentation
+ // suggests that one of them should not be. At this point in time Chromium
+ // does the same thing for video acceleration.
+ D3DPRESENT_PARAMETERS params = {0};
+ params.BackBufferWidth = 1;
+ params.BackBufferHeight = 1;
+ params.BackBufferFormat = D3DFMT_A8R8G8B8;
+ params.BackBufferCount = 1;
+ params.SwapEffect = D3DSWAPEFFECT_DISCARD;
+ params.hDeviceWindow = nullptr;
+ params.Windowed = TRUE;
+ params.Flags = D3DPRESENTFLAG_VIDEO;
+
+ RefPtr<IDirect3DDevice9Ex> device;
+ hr = d3d9Ex->CreateDeviceEx(D3DADAPTER_DEFAULT,
+ D3DDEVTYPE_HAL,
+ nullptr,
+ D3DCREATE_FPU_PRESERVE |
+ D3DCREATE_MULTITHREADED |
+ D3DCREATE_MIXED_VERTEXPROCESSING,
+ &params,
+ nullptr,
+ getter_AddRefs(device));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("CreateDeviceEx failed with error %X", hr);
+ return hr;
+ }
+
+ // Ensure we can create queries to synchronize operations between devices.
+ // Without this, when we make a copy of the frame in order to share it with
+ // another device, we can't be sure that the copy has finished before the
+ // other device starts using it.
+ RefPtr<IDirect3DQuery9> query;
+
+ hr = device->CreateQuery(D3DQUERYTYPE_EVENT, getter_AddRefs(query));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("CreateQuery failed with error %X", hr);
+ return hr;
+ }
+
+ // Create and initialize IDirect3DDeviceManager9.
+ UINT resetToken = 0;
+ RefPtr<IDirect3DDeviceManager9> deviceManager;
+
+ hr = wmf::DXVA2CreateDirect3DDeviceManager9(&resetToken,
+ getter_AddRefs(deviceManager));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("DXVA2CreateDirect3DDeviceManager9 failed with error %X", hr);
+ return hr;
+ }
+ hr = deviceManager->ResetDevice(device, resetToken);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDirect3DDeviceManager9::ResetDevice failed with error %X", hr);
+ return hr;
+ }
+
+ HANDLE deviceHandle;
+ RefPtr<IDirectXVideoDecoderService> decoderService;
+ hr = deviceManager->OpenDeviceHandle(&deviceHandle);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDirect3DDeviceManager9::OpenDeviceHandle failed with error %X", hr);
+ return hr;
+ }
+
+ hr = deviceManager->GetVideoService(deviceHandle, IID_PPV_ARGS(decoderService.StartAssignment()));
+ deviceManager->CloseDeviceHandle(deviceHandle);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDirectXVideoDecoderServer::GetVideoService failed with error %X", hr);
+ return hr;
+ }
+
+ UINT deviceCount;
+ GUID* decoderDevices = nullptr;
+ hr = decoderService->GetDecoderDeviceGuids(&deviceCount, &decoderDevices);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDirectXVideoDecoderServer::GetDecoderDeviceGuids failed with error %X", hr);
+ return hr;
+ }
+
+ bool found = false;
+ for (UINT i = 0; i < deviceCount; i++) {
+ if (decoderDevices[i] == DXVA2_ModeH264_E ||
+ decoderDevices[i] == DXVA2_Intel_ModeH264_E) {
+ mDecoderGUID = decoderDevices[i];
+ found = true;
+ break;
+ }
+ }
+ CoTaskMemFree(decoderDevices);
+
+ if (!found) {
+ aFailureReason.AssignLiteral("Failed to find an appropriate decoder GUID");
+ return E_FAIL;
+ }
+
+ D3DADAPTER_IDENTIFIER9 adapter;
+ hr = d3d9Ex->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &adapter);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDirect3D9Ex::GetAdapterIdentifier failed with error %X", hr);
+ return hr;
+ }
+
+ if (adapter.VendorId == 0x1022 && !gfxPrefs::PDMWMFSkipBlacklist()) {
+ for (size_t i = 0; i < MOZ_ARRAY_LENGTH(sAMDPreUVD4); i++) {
+ if (adapter.DeviceId == sAMDPreUVD4[i]) {
+ mIsAMDPreUVD4 = true;
+ break;
+ }
+ }
+ }
+
+ RefPtr<IDirect3DSurface9> syncSurf;
+ hr = device->CreateRenderTarget(kSyncSurfaceSize, kSyncSurfaceSize,
+ D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE,
+ 0, TRUE, getter_AddRefs(syncSurf), NULL);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ mDecoderService = decoderService;
+
+ mResetToken = resetToken;
+ mD3D9 = d3d9Ex;
+ mDevice = device;
+ mDeviceManager = deviceManager;
+ mSyncSurface = syncSurf;
+
+ if (layers::ImageBridgeChild::GetSingleton()) {
+ // There's no proper KnowsCompositor for ImageBridge currently (and it
+ // implements the interface), so just use that if it's available.
+ mTextureClientAllocator = new D3D9RecycleAllocator(layers::ImageBridgeChild::GetSingleton().get(),
+ mDevice);
+ } else {
+ mTextureClientAllocator = new D3D9RecycleAllocator(aKnowsCompositor,
+ mDevice);
+ }
+ mTextureClientAllocator->SetMaxPoolSize(5);
+
+ Telemetry::Accumulate(Telemetry::MEDIA_DECODER_BACKEND_USED,
+ uint32_t(media::MediaDecoderBackend::WMFDXVA2D3D9));
+
+ reporter.SetSuccessful();
+
+ return S_OK;
+}
+
+HRESULT
+D3D9DXVA2Manager::CopyToImage(IMFSample* aSample,
+ const nsIntRect& aRegion,
+ Image** aOutImage)
+{
+ RefPtr<IMFMediaBuffer> buffer;
+ HRESULT hr = aSample->GetBufferByIndex(0, getter_AddRefs(buffer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IDirect3DSurface9> surface;
+ hr = wmf::MFGetService(buffer,
+ MR_BUFFER_SERVICE,
+ IID_IDirect3DSurface9,
+ getter_AddRefs(surface));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<D3D9SurfaceImage> image = new D3D9SurfaceImage();
+ hr = image->AllocateAndCopy(mTextureClientAllocator, surface, aRegion);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IDirect3DSurface9> sourceSurf = image->GetD3D9Surface();
+
+ // Copy a small rect into our sync surface, and then map it
+ // to block until decoding/color conversion completes.
+ RECT copyRect = { 0, 0, kSyncSurfaceSize, kSyncSurfaceSize };
+ hr = mDevice->StretchRect(sourceSurf, &copyRect, mSyncSurface, &copyRect, D3DTEXF_NONE);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ D3DLOCKED_RECT lockedRect;
+ hr = mSyncSurface->LockRect(&lockedRect, NULL, D3DLOCK_READONLY);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = mSyncSurface->UnlockRect();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ image.forget(aOutImage);
+ return S_OK;
+}
+
+// Count of the number of DXVAManager's we've created. This is also the
+// number of videos we're decoding with DXVA. Use on main thread only.
+static uint32_t sDXVAVideosCount = 0;
+
+/* static */
+DXVA2Manager*
+DXVA2Manager::CreateD3D9DXVA(layers::KnowsCompositor* aKnowsCompositor,
+ nsACString& aFailureReason)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ HRESULT hr;
+
+ // DXVA processing takes up a lot of GPU resources, so limit the number of
+ // videos we use DXVA with at any one time.
+ uint32_t dxvaLimit = gfxPrefs::PDMWMFMaxDXVAVideos();
+
+ if (sDXVAVideosCount == dxvaLimit) {
+ aFailureReason.AssignLiteral("Too many DXVA videos playing");
+ return nullptr;
+ }
+
+ nsAutoPtr<D3D9DXVA2Manager> d3d9Manager(new D3D9DXVA2Manager());
+ hr = d3d9Manager->Init(aKnowsCompositor, aFailureReason);
+ if (SUCCEEDED(hr)) {
+ return d3d9Manager.forget();
+ }
+
+ // No hardware accelerated video decoding. :(
+ return nullptr;
+}
+
+class D3D11DXVA2Manager : public DXVA2Manager
+{
+public:
+ D3D11DXVA2Manager();
+ virtual ~D3D11DXVA2Manager();
+
+ HRESULT Init(layers::KnowsCompositor* aKnowsCompositor,
+ nsACString& aFailureReason);
+
+ IUnknown* GetDXVADeviceManager() override;
+
+ // Copies a region (aRegion) of the video frame stored in aVideoSample
+ // into an image which is returned by aOutImage.
+ HRESULT CopyToImage(IMFSample* aVideoSample,
+ const nsIntRect& aRegion,
+ Image** aOutImage) override;
+
+ HRESULT ConfigureForSize(uint32_t aWidth, uint32_t aHeight) override;
+
+ bool IsD3D11() override { return true; }
+
+ bool SupportsConfig(IMFMediaType* aType, float aFramerate) override;
+
+private:
+ HRESULT CreateFormatConverter();
+
+ HRESULT CreateOutputSample(RefPtr<IMFSample>& aSample,
+ ID3D11Texture2D* aTexture);
+
+ RefPtr<ID3D11Device> mDevice;
+ RefPtr<ID3D11DeviceContext> mContext;
+ RefPtr<IMFDXGIDeviceManager> mDXGIDeviceManager;
+ RefPtr<MFTDecoder> mTransform;
+ RefPtr<D3D11RecycleAllocator> mTextureClientAllocator;
+ RefPtr<ID3D11Texture2D> mSyncSurface;
+ GUID mDecoderGUID;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ UINT mDeviceManagerToken;
+ bool mIsAMDPreUVD4;
+};
+
+bool
+D3D11DXVA2Manager::SupportsConfig(IMFMediaType* aType, float aFramerate)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ gfx::D3D11VideoCrashGuard crashGuard;
+ if (crashGuard.Crashed()) {
+ NS_WARNING("DXVA2D3D9 crash detected");
+ return false;
+ }
+
+ RefPtr<ID3D11VideoDevice> videoDevice;
+ HRESULT hr = mDevice->QueryInterface(static_cast<ID3D11VideoDevice**>(getter_AddRefs(videoDevice)));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ D3D11_VIDEO_DECODER_DESC desc;
+ desc.Guid = mDecoderGUID;
+
+ UINT32 width = 0;
+ UINT32 height = 0;
+ hr = MFGetAttributeSize(aType, MF_MT_FRAME_SIZE, &width, &height);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ NS_ENSURE_TRUE(width <= MAX_VIDEO_WIDTH, false);
+ NS_ENSURE_TRUE(height <= MAX_VIDEO_HEIGHT, false);
+ desc.SampleWidth = width;
+ desc.SampleHeight = height;
+
+ desc.OutputFormat = DXGI_FORMAT_NV12;
+
+ // AMD cards with UVD3 or earlier perform poorly trying to decode 1080p60 in hardware,
+ // so use software instead. Pick 45 as an arbitrary upper bound for the framerate we can
+ // handle.
+ if (mIsAMDPreUVD4 &&
+ (desc.SampleWidth >= 1920 || desc.SampleHeight >= 1088) &&
+ aFramerate > 45) {
+ return false;
+ }
+
+ UINT configCount = 0;
+ hr = videoDevice->GetVideoDecoderConfigCount(&desc, &configCount);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ for (UINT i = 0; i < configCount; i++) {
+ D3D11_VIDEO_DECODER_CONFIG config;
+ hr = videoDevice->GetVideoDecoderConfig(&desc, i, &config);
+ if (SUCCEEDED(hr)) {
+ RefPtr<ID3D11VideoDecoder> decoder;
+ hr = videoDevice->CreateVideoDecoder(&desc, &config, decoder.StartAssignment());
+ if (SUCCEEDED(hr) && decoder) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+D3D11DXVA2Manager::D3D11DXVA2Manager()
+ : mWidth(0)
+ , mHeight(0)
+ , mDeviceManagerToken(0)
+ , mIsAMDPreUVD4(false)
+{
+}
+
+D3D11DXVA2Manager::~D3D11DXVA2Manager()
+{
+}
+
+IUnknown*
+D3D11DXVA2Manager::GetDXVADeviceManager()
+{
+ MutexAutoLock lock(mLock);
+ return mDXGIDeviceManager;
+}
+
+HRESULT
+D3D11DXVA2Manager::Init(layers::KnowsCompositor* aKnowsCompositor,
+ nsACString& aFailureReason)
+{
+ HRESULT hr;
+
+ ScopedGfxFeatureReporter reporter("DXVA2D3D11");
+
+ gfx::D3D11VideoCrashGuard crashGuard;
+ if (crashGuard.Crashed()) {
+ NS_WARNING("DXVA2D3D11 crash detected");
+ aFailureReason.AssignLiteral("DXVA2D3D11 crashes detected in the past");
+ return E_FAIL;
+ }
+
+ mDevice = gfx::DeviceManagerDx::Get()->CreateDecoderDevice();
+ if (!mDevice) {
+ aFailureReason.AssignLiteral("Failed to create D3D11 device for decoder");
+ return E_FAIL;
+ }
+
+ mDevice->GetImmediateContext(getter_AddRefs(mContext));
+ if (!mContext) {
+ aFailureReason.AssignLiteral("Failed to get immediate context for d3d11 device");
+ return E_FAIL;
+ }
+
+ hr = wmf::MFCreateDXGIDeviceManager(&mDeviceManagerToken, getter_AddRefs(mDXGIDeviceManager));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("MFCreateDXGIDeviceManager failed with code %X", hr);
+ return hr;
+ }
+
+ hr = mDXGIDeviceManager->ResetDevice(mDevice, mDeviceManagerToken);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IMFDXGIDeviceManager::ResetDevice failed with code %X", hr);
+ return hr;
+ }
+
+ mTransform = new MFTDecoder();
+ hr = mTransform->Create(CLSID_VideoProcessorMFT);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("MFTDecoder::Create(CLSID_VideoProcessorMFT) failed with code %X", hr);
+ return hr;
+ }
+
+ hr = mTransform->SendMFTMessage(MFT_MESSAGE_SET_D3D_MANAGER, ULONG_PTR(mDXGIDeviceManager.get()));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("MFTDecoder::SendMFTMessage(MFT_MESSAGE_SET_D3D_MANAGER) failed with code %X", hr);
+ return hr;
+ }
+
+ RefPtr<ID3D11VideoDevice> videoDevice;
+ hr = mDevice->QueryInterface(static_cast<ID3D11VideoDevice**>(getter_AddRefs(videoDevice)));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("QI to ID3D11VideoDevice failed with code %X", hr);
+ return hr;
+ }
+
+ bool found = false;
+ UINT profileCount = videoDevice->GetVideoDecoderProfileCount();
+ for (UINT i = 0; i < profileCount; i++) {
+ GUID id;
+ hr = videoDevice->GetVideoDecoderProfile(i, &id);
+ if (SUCCEEDED(hr) && (id == DXVA2_ModeH264_E || id == DXVA2_Intel_ModeH264_E)) {
+ mDecoderGUID = id;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ aFailureReason.AssignLiteral("Failed to find an appropriate decoder GUID");
+ return E_FAIL;
+ }
+
+ BOOL nv12Support = false;
+ hr = videoDevice->CheckVideoDecoderFormat(&mDecoderGUID, DXGI_FORMAT_NV12, &nv12Support);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("CheckVideoDecoderFormat failed with code %X", hr);
+ return hr;
+ }
+ if (!nv12Support) {
+ aFailureReason.AssignLiteral("Decoder doesn't support NV12 surfaces");
+ return E_FAIL;
+ }
+
+ RefPtr<IDXGIDevice> dxgiDevice;
+ hr = mDevice->QueryInterface(static_cast<IDXGIDevice**>(getter_AddRefs(dxgiDevice)));
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("QI to IDXGIDevice failed with code %X", hr);
+ return hr;
+ }
+
+ RefPtr<IDXGIAdapter> adapter;
+ hr = dxgiDevice->GetAdapter(adapter.StartAssignment());
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDXGIDevice::GetAdapter failed with code %X", hr);
+ return hr;
+ }
+
+ DXGI_ADAPTER_DESC adapterDesc;
+ hr = adapter->GetDesc(&adapterDesc);
+ if (!SUCCEEDED(hr)) {
+ aFailureReason = nsPrintfCString("IDXGIAdapter::GetDesc failed with code %X", hr);
+ return hr;
+ }
+
+ if (adapterDesc.VendorId == 0x1022 && !gfxPrefs::PDMWMFSkipBlacklist()) {
+ for (size_t i = 0; i < MOZ_ARRAY_LENGTH(sAMDPreUVD4); i++) {
+ if (adapterDesc.DeviceId == sAMDPreUVD4[i]) {
+ mIsAMDPreUVD4 = true;
+ break;
+ }
+ }
+ }
+
+ D3D11_TEXTURE2D_DESC desc;
+ desc.Width = kSyncSurfaceSize;
+ desc.Height = kSyncSurfaceSize;
+ desc.MipLevels = 1;
+ desc.ArraySize = 1;
+ desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+ desc.SampleDesc.Count = 1;
+ desc.SampleDesc.Quality = 0;
+ desc.Usage = D3D11_USAGE_STAGING;
+ desc.BindFlags = 0;
+ desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+ desc.MiscFlags = 0;
+
+ hr = mDevice->CreateTexture2D(&desc, NULL, getter_AddRefs(mSyncSurface));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ if (layers::ImageBridgeChild::GetSingleton()) {
+ // There's no proper KnowsCompositor for ImageBridge currently (and it
+ // implements the interface), so just use that if it's available.
+ mTextureClientAllocator = new D3D11RecycleAllocator(layers::ImageBridgeChild::GetSingleton().get(),
+ mDevice);
+ } else {
+ mTextureClientAllocator = new D3D11RecycleAllocator(aKnowsCompositor,
+ mDevice);
+ }
+ mTextureClientAllocator->SetMaxPoolSize(5);
+
+ Telemetry::Accumulate(Telemetry::MEDIA_DECODER_BACKEND_USED,
+ uint32_t(media::MediaDecoderBackend::WMFDXVA2D3D11));
+
+ reporter.SetSuccessful();
+
+ return S_OK;
+}
+
+HRESULT
+D3D11DXVA2Manager::CreateOutputSample(RefPtr<IMFSample>& aSample, ID3D11Texture2D* aTexture)
+{
+ RefPtr<IMFSample> sample;
+ HRESULT hr = wmf::MFCreateSample(getter_AddRefs(sample));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IMFMediaBuffer> buffer;
+ hr = wmf::MFCreateDXGISurfaceBuffer(__uuidof(ID3D11Texture2D), aTexture, 0, FALSE, getter_AddRefs(buffer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ sample->AddBuffer(buffer);
+
+ aSample = sample;
+ return S_OK;
+}
+
+HRESULT
+D3D11DXVA2Manager::CopyToImage(IMFSample* aVideoSample,
+ const nsIntRect& aRegion,
+ Image** aOutImage)
+{
+ NS_ENSURE_TRUE(aVideoSample, E_POINTER);
+ NS_ENSURE_TRUE(aOutImage, E_POINTER);
+
+ // Our video frame is stored in a non-sharable ID3D11Texture2D. We need
+ // to create a copy of that frame as a sharable resource, save its share
+ // handle, and put that handle into the rendering pipeline.
+
+ RefPtr<D3D11ShareHandleImage> image =
+ new D3D11ShareHandleImage(gfx::IntSize(mWidth, mHeight), aRegion);
+ bool ok = image->AllocateTexture(mTextureClientAllocator, mDevice);
+ NS_ENSURE_TRUE(ok, E_FAIL);
+
+ HRESULT hr = mTransform->Input(aVideoSample);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IMFSample> sample;
+ RefPtr<ID3D11Texture2D> texture = image->GetTexture();
+ hr = CreateOutputSample(sample, texture);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = mTransform->Output(&sample);
+
+ RefPtr<ID3D11DeviceContext> ctx;
+ mDevice->GetImmediateContext(getter_AddRefs(ctx));
+
+ // Copy a small rect into our sync surface, and then map it
+ // to block until decoding/color conversion completes.
+ D3D11_BOX rect = { 0, 0, 0, kSyncSurfaceSize, kSyncSurfaceSize, 1 };
+ ctx->CopySubresourceRegion(mSyncSurface, 0, 0, 0, 0, texture, 0, &rect);
+
+ D3D11_MAPPED_SUBRESOURCE mapped;
+ hr = ctx->Map(mSyncSurface, 0, D3D11_MAP_READ, 0, &mapped);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ ctx->Unmap(mSyncSurface, 0);
+
+ image.forget(aOutImage);
+
+ return S_OK;
+}
+
+HRESULT ConfigureOutput(IMFMediaType* aOutput, void* aData)
+{
+ HRESULT hr = aOutput->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = aOutput->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ gfx::IntSize* size = reinterpret_cast<gfx::IntSize*>(aData);
+ hr = MFSetAttributeSize(aOutput, MF_MT_FRAME_SIZE, size->width, size->height);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return S_OK;
+}
+
+HRESULT
+D3D11DXVA2Manager::ConfigureForSize(uint32_t aWidth, uint32_t aHeight)
+{
+ mWidth = aWidth;
+ mHeight = aHeight;
+
+ RefPtr<IMFMediaType> inputType;
+ HRESULT hr = wmf::MFCreateMediaType(getter_AddRefs(inputType));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IMFAttributes> attr = mTransform->GetAttributes();
+
+ hr = attr->SetUINT32(MF_XVP_PLAYBACK_MODE, TRUE);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = attr->SetUINT32(MF_LOW_LATENCY, FALSE);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = MFSetAttributeSize(inputType, MF_MT_FRAME_SIZE, aWidth, aHeight);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IMFMediaType> outputType;
+ hr = wmf::MFCreateMediaType(getter_AddRefs(outputType));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = outputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_ARGB32);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ gfx::IntSize size(mWidth, mHeight);
+ hr = mTransform->SetMediaTypes(inputType, outputType, ConfigureOutput, &size);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return S_OK;
+}
+
+/* static */
+DXVA2Manager*
+DXVA2Manager::CreateD3D11DXVA(layers::KnowsCompositor* aKnowsCompositor,
+ nsACString& aFailureReason)
+{
+ // DXVA processing takes up a lot of GPU resources, so limit the number of
+ // videos we use DXVA with at any one time.
+ uint32_t dxvaLimit = gfxPrefs::PDMWMFMaxDXVAVideos();
+
+ if (sDXVAVideosCount == dxvaLimit) {
+ aFailureReason.AssignLiteral("Too many DXVA videos playing");
+ return nullptr;
+ }
+
+ nsAutoPtr<D3D11DXVA2Manager> manager(new D3D11DXVA2Manager());
+ HRESULT hr = manager->Init(aKnowsCompositor, aFailureReason);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
+
+ return manager.forget();
+}
+
+DXVA2Manager::DXVA2Manager()
+ : mLock("DXVA2Manager")
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ ++sDXVAVideosCount;
+}
+
+DXVA2Manager::~DXVA2Manager()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ --sDXVAVideosCount;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wmf/DXVA2Manager.h b/dom/media/platforms/wmf/DXVA2Manager.h
new file mode 100644
index 000000000..0bdc02dd4
--- /dev/null
+++ b/dom/media/platforms/wmf/DXVA2Manager.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(DXVA2Manager_h_)
+#define DXVA2Manager_h_
+
+#include "WMF.h"
+#include "nsAutoPtr.h"
+#include "mozilla/Mutex.h"
+#include "nsRect.h"
+
+namespace mozilla {
+
+namespace layers {
+class Image;
+class ImageContainer;
+class KnowsCompositor;
+}
+
+class DXVA2Manager {
+public:
+
+ // Creates and initializes a DXVA2Manager. We can use DXVA2 via either
+ // D3D9Ex or D3D11.
+ static DXVA2Manager* CreateD3D9DXVA(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason);
+ static DXVA2Manager* CreateD3D11DXVA(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason);
+
+ // Returns a pointer to the D3D device manager responsible for managing the
+ // device we're using for hardware accelerated video decoding. If we're using
+ // D3D9Ex, this is an IDirect3DDeviceManager9. For D3D11 this is an
+ // IMFDXGIDeviceManager. It is safe to call this on any thread.
+ virtual IUnknown* GetDXVADeviceManager() = 0;
+
+ // Creates an Image for the video frame stored in aVideoSample.
+ virtual HRESULT CopyToImage(IMFSample* aVideoSample,
+ const nsIntRect& aRegion,
+ layers::Image** aOutImage) = 0;
+
+ virtual HRESULT ConfigureForSize(uint32_t aWidth, uint32_t aHeight) { return S_OK; }
+
+ virtual bool IsD3D11() { return false; }
+
+ virtual ~DXVA2Manager();
+
+ virtual bool SupportsConfig(IMFMediaType* aType, float aFramerate) = 0;
+
+protected:
+ Mutex mLock;
+ DXVA2Manager();
+};
+
+} // namespace mozilla
+
+#endif // DXVA2Manager_h_
diff --git a/dom/media/platforms/wmf/MFTDecoder.cpp b/dom/media/platforms/wmf/MFTDecoder.cpp
new file mode 100644
index 000000000..e634fcff9
--- /dev/null
+++ b/dom/media/platforms/wmf/MFTDecoder.cpp
@@ -0,0 +1,305 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MFTDecoder.h"
+#include "nsThreadUtils.h"
+#include "WMFUtils.h"
+#include "mozilla/Logging.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+namespace mozilla {
+
+MFTDecoder::MFTDecoder()
+ : mMFTProvidesOutputSamples(false)
+ , mDiscontinuity(true)
+{
+ memset(&mInputStreamInfo, 0, sizeof(MFT_INPUT_STREAM_INFO));
+ memset(&mOutputStreamInfo, 0, sizeof(MFT_OUTPUT_STREAM_INFO));
+}
+
+MFTDecoder::~MFTDecoder()
+{
+}
+
+HRESULT
+MFTDecoder::Create(const GUID& aMFTClsID)
+{
+ // Create the IMFTransform to do the decoding.
+ HRESULT hr;
+ hr = CoCreateInstance(aMFTClsID,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IMFTransform,
+ reinterpret_cast<void**>(static_cast<IMFTransform**>(getter_AddRefs(mDecoder))));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::SetMediaTypes(IMFMediaType* aInputType,
+ IMFMediaType* aOutputType,
+ ConfigureOutputCallback aCallback,
+ void* aData)
+{
+ mOutputType = aOutputType;
+
+ // Set the input type to the one the caller gave us...
+ HRESULT hr = mDecoder->SetInputType(0, aInputType, 0);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = SetDecoderOutputType(aCallback, aData);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = mDecoder->GetInputStreamInfo(0, &mInputStreamInfo);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = SendMFTMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return S_OK;
+}
+
+already_AddRefed<IMFAttributes>
+MFTDecoder::GetAttributes()
+{
+ RefPtr<IMFAttributes> attr;
+ HRESULT hr = mDecoder->GetAttributes(getter_AddRefs(attr));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
+ return attr.forget();
+}
+
+HRESULT
+MFTDecoder::SetDecoderOutputType(ConfigureOutputCallback aCallback, void* aData)
+{
+ NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER);
+
+ // Iterate the enumerate the output types, until we find one compatible
+ // with what we need.
+ HRESULT hr;
+ RefPtr<IMFMediaType> outputType;
+ UINT32 typeIndex = 0;
+ while (SUCCEEDED(mDecoder->GetOutputAvailableType(0, typeIndex++, getter_AddRefs(outputType)))) {
+ BOOL resultMatch;
+ hr = mOutputType->Compare(outputType, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &resultMatch);
+ if (SUCCEEDED(hr) && resultMatch == TRUE) {
+ if (aCallback) {
+ hr = aCallback(outputType, aData);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ }
+ hr = mDecoder->SetOutputType(0, outputType, 0);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = mDecoder->GetOutputStreamInfo(0, &mOutputStreamInfo);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ mMFTProvidesOutputSamples = IsFlagSet(mOutputStreamInfo.dwFlags, MFT_OUTPUT_STREAM_PROVIDES_SAMPLES);
+
+ return S_OK;
+ }
+ outputType = nullptr;
+ }
+ return E_FAIL;
+}
+
+HRESULT
+MFTDecoder::SendMFTMessage(MFT_MESSAGE_TYPE aMsg, ULONG_PTR aData)
+{
+ NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER);
+ HRESULT hr = mDecoder->ProcessMessage(aMsg, aData);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::CreateInputSample(const uint8_t* aData,
+ uint32_t aDataSize,
+ int64_t aTimestamp,
+ RefPtr<IMFSample>* aOutSample)
+{
+ NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER);
+
+ HRESULT hr;
+ RefPtr<IMFSample> sample;
+ hr = wmf::MFCreateSample(getter_AddRefs(sample));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IMFMediaBuffer> buffer;
+ int32_t bufferSize = std::max<uint32_t>(uint32_t(mInputStreamInfo.cbSize), aDataSize);
+ UINT32 alignment = (mInputStreamInfo.cbAlignment > 1) ? mInputStreamInfo.cbAlignment - 1 : 0;
+ hr = wmf::MFCreateAlignedMemoryBuffer(bufferSize, alignment, getter_AddRefs(buffer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ DWORD maxLength = 0;
+ DWORD currentLength = 0;
+ BYTE* dst = nullptr;
+ hr = buffer->Lock(&dst, &maxLength, &currentLength);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // Copy data into sample's buffer.
+ memcpy(dst, aData, aDataSize);
+
+ hr = buffer->Unlock();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = buffer->SetCurrentLength(aDataSize);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = sample->AddBuffer(buffer);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = sample->SetSampleTime(UsecsToHNs(aTimestamp));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ *aOutSample = sample.forget();
+
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::CreateOutputSample(RefPtr<IMFSample>* aOutSample)
+{
+ NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER);
+
+ HRESULT hr;
+ RefPtr<IMFSample> sample;
+ hr = wmf::MFCreateSample(getter_AddRefs(sample));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ RefPtr<IMFMediaBuffer> buffer;
+ int32_t bufferSize = mOutputStreamInfo.cbSize;
+ UINT32 alignment = (mOutputStreamInfo.cbAlignment > 1) ? mOutputStreamInfo.cbAlignment - 1 : 0;
+ hr = wmf::MFCreateAlignedMemoryBuffer(bufferSize, alignment, getter_AddRefs(buffer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = sample->AddBuffer(buffer);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ *aOutSample = sample.forget();
+
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::Output(RefPtr<IMFSample>* aOutput)
+{
+ NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER);
+
+ HRESULT hr;
+
+ MFT_OUTPUT_DATA_BUFFER output = {0};
+
+ bool providedSample = false;
+ RefPtr<IMFSample> sample;
+ if (*aOutput) {
+ output.pSample = *aOutput;
+ providedSample = true;
+ } else if (!mMFTProvidesOutputSamples) {
+ hr = CreateOutputSample(&sample);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ output.pSample = sample;
+ }
+
+ DWORD status = 0;
+ hr = mDecoder->ProcessOutput(0, 1, &output, &status);
+ if (output.pEvents) {
+ // We must release this, as per the IMFTransform::ProcessOutput()
+ // MSDN documentation.
+ output.pEvents->Release();
+ output.pEvents = nullptr;
+ }
+
+ if (hr == MF_E_TRANSFORM_STREAM_CHANGE) {
+ // Type change, probably geometric aperture change.
+ // Reconfigure decoder output type, so that GetOutputMediaType()
+ // returns the new type, and return the error code to caller.
+ // This is an expected failure, so don't warn on encountering it.
+ hr = SetDecoderOutputType(nullptr, nullptr);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ // Return the error, so that the caller knows to retry.
+ return MF_E_TRANSFORM_STREAM_CHANGE;
+ }
+
+ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
+ // Not enough input to produce output. This is an expected failure,
+ // so don't warn on encountering it.
+ return hr;
+ }
+ // Treat other errors as unexpected, and warn.
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ if (!output.pSample) {
+ return S_OK;
+ }
+
+ if (mDiscontinuity) {
+ output.pSample->SetUINT32(MFSampleExtension_Discontinuity, TRUE);
+ mDiscontinuity = false;
+ }
+
+ *aOutput = output.pSample; // AddRefs
+ if (mMFTProvidesOutputSamples && !providedSample) {
+ // If the MFT is providing samples, we must release the sample here.
+ // Typically only the H.264 MFT provides samples when using DXVA,
+ // and it always re-uses the same sample, so if we don't release it
+ // MFT::ProcessOutput() deadlocks waiting for the sample to be released.
+ output.pSample->Release();
+ output.pSample = nullptr;
+ }
+
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::Input(const uint8_t* aData,
+ uint32_t aDataSize,
+ int64_t aTimestamp)
+{
+ NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER);
+
+ RefPtr<IMFSample> input;
+ HRESULT hr = CreateInputSample(aData, aDataSize, aTimestamp, &input);
+ NS_ENSURE_TRUE(SUCCEEDED(hr) && input != nullptr, hr);
+
+ return Input(input);
+}
+
+HRESULT
+MFTDecoder::Input(IMFSample* aSample)
+{
+ HRESULT hr = mDecoder->ProcessInput(0, aSample, 0);
+ if (hr == MF_E_NOTACCEPTING) {
+ // MFT *already* has enough data to produce a sample. Retrieve it.
+ return MF_E_NOTACCEPTING;
+ }
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::Flush()
+{
+ HRESULT hr = SendMFTMessage(MFT_MESSAGE_COMMAND_FLUSH, 0);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ mDiscontinuity = true;
+
+ return S_OK;
+}
+
+HRESULT
+MFTDecoder::GetOutputMediaType(RefPtr<IMFMediaType>& aMediaType)
+{
+ NS_ENSURE_TRUE(mDecoder, E_POINTER);
+ return mDecoder->GetOutputCurrentType(0, getter_AddRefs(aMediaType));
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wmf/MFTDecoder.h b/dom/media/platforms/wmf/MFTDecoder.h
new file mode 100644
index 000000000..91c18f18c
--- /dev/null
+++ b/dom/media/platforms/wmf/MFTDecoder.h
@@ -0,0 +1,111 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MFTDecoder_h_)
+#define MFTDecoder_h_
+
+#include "WMF.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "nsIThread.h"
+
+namespace mozilla {
+
+class MFTDecoder final {
+ ~MFTDecoder();
+
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MFTDecoder)
+
+ MFTDecoder();
+
+ // Creates the MFT. First thing to do as part of setup.
+ //
+ // Params:
+ // - aMFTClsID the clsid used by CoCreateInstance to instantiate the
+ // decoder MFT.
+ HRESULT Create(const GUID& aMFTClsID);
+
+ // Sets the input and output media types. Call after Init().
+ //
+ // Params:
+ // - aInputType needs at least major and minor types set.
+ // - aOutputType needs at least major and minor types set.
+ // This is used to select the matching output type out
+ // of all the available output types of the MFT.
+ typedef HRESULT (*ConfigureOutputCallback)(IMFMediaType* aOutputType, void* aData);
+ HRESULT SetMediaTypes(IMFMediaType* aInputType,
+ IMFMediaType* aOutputType,
+ ConfigureOutputCallback aCallback = nullptr,
+ void* aData = nullptr);
+
+ // Returns the MFT's IMFAttributes object.
+ already_AddRefed<IMFAttributes> GetAttributes();
+
+ // Retrieves the media type being output. This may not be valid until
+ // the first sample is decoded.
+ HRESULT GetOutputMediaType(RefPtr<IMFMediaType>& aMediaType);
+
+ // Submits data into the MFT for processing.
+ //
+ // Returns:
+ // - MF_E_NOTACCEPTING if the decoder can't accept input. The data
+ // must be resubmitted after Output() stops producing output.
+ HRESULT Input(const uint8_t* aData,
+ uint32_t aDataSize,
+ int64_t aTimestampUsecs);
+ HRESULT Input(IMFSample* aSample);
+
+ HRESULT CreateInputSample(const uint8_t* aData,
+ uint32_t aDataSize,
+ int64_t aTimestampUsecs,
+ RefPtr<IMFSample>* aOutSample);
+
+ // Retrieves output from the MFT. Call this once Input() returns
+ // MF_E_NOTACCEPTING. Some MFTs with hardware acceleration (the H.264
+ // decoder MFT in particular) can't handle it if clients hold onto
+ // references to the output IMFSample, so don't do that.
+ //
+ // Returns:
+ // - MF_E_TRANSFORM_STREAM_CHANGE if the underlying stream output
+ // type changed. Retrieve the output media type and reconfig client,
+ // else you may misinterpret the MFT's output.
+ // - MF_E_TRANSFORM_NEED_MORE_INPUT if no output can be produced
+ // due to lack of input.
+ // - S_OK if an output frame is produced.
+ HRESULT Output(RefPtr<IMFSample>* aOutput);
+
+ // Sends a flush message to the MFT. This causes it to discard all
+ // input data. Use before seeking.
+ HRESULT Flush();
+
+ // Sends a message to the MFT.
+ HRESULT SendMFTMessage(MFT_MESSAGE_TYPE aMsg, ULONG_PTR aData);
+
+
+ HRESULT SetDecoderOutputType(ConfigureOutputCallback aCallback, void* aData);
+private:
+
+
+ HRESULT CreateOutputSample(RefPtr<IMFSample>* aOutSample);
+
+ MFT_INPUT_STREAM_INFO mInputStreamInfo;
+ MFT_OUTPUT_STREAM_INFO mOutputStreamInfo;
+
+ RefPtr<IMFTransform> mDecoder;
+
+ RefPtr<IMFMediaType> mOutputType;
+
+ // True if the IMFTransform allocates the samples that it returns.
+ bool mMFTProvidesOutputSamples;
+
+ // True if we need to mark the next sample as a discontinuity.
+ bool mDiscontinuity;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/wmf/WMF.h b/dom/media/platforms/wmf/WMF.h
new file mode 100644
index 000000000..5ede0d361
--- /dev/null
+++ b/dom/media/platforms/wmf/WMF.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WMF_H_
+#define WMF_H_
+
+#if WINVER < _WIN32_WINNT_WIN7
+#error \
+You must include WMF.h before including mozilla headers, \
+otherwise mozconfig.h will be included \
+and that sets WINVER to WinXP, \
+which makes Windows Media Foundation unavailable.
+#endif
+
+#pragma push_macro("WINVER")
+#undef WINVER
+#define WINVER _WIN32_WINNT_WIN7
+
+#include <windows.h>
+#include <mfapi.h>
+#include <mfidl.h>
+#include <mfreadwrite.h>
+#include <mfobjects.h>
+#include <ks.h>
+#include <stdio.h>
+#include <mferror.h>
+#include <propvarutil.h>
+#include <wmcodecdsp.h>
+#include <d3d9.h>
+#include <dxva2api.h>
+#include <wmcodecdsp.h>
+#include <codecapi.h>
+
+// The Windows headers helpfully declare min and max macros, which don't
+// compile in the prescence of std::min and std::max and unified builds.
+// So undef them here.
+#ifdef min
+#undef min
+#endif
+#ifdef max
+#undef max
+#endif
+
+// Some SDK versions don't define the AAC decoder CLSID.
+#ifndef CLSID_CMSAACDecMFT
+extern "C" const CLSID CLSID_CMSAACDecMFT;
+#define WMF_MUST_DEFINE_AAC_MFT_CLSID
+#endif
+
+namespace mozilla {
+namespace wmf {
+
+// If successful, loads all required WMF DLLs and calls the WMF MFStartup()
+// function.
+HRESULT MFStartup();
+
+// Calls the WMF MFShutdown() function. Call this once for every time
+// wmf::MFStartup() succeeds. Note: does not unload the WMF DLLs loaded by
+// MFStartup(); leaves them in memory to save I/O at next MFStartup() call.
+HRESULT MFShutdown();
+
+// All functions below are wrappers around the corresponding WMF function,
+// and automatically locate and call the corresponding function in the WMF DLLs.
+
+HRESULT MFCreateMediaType(IMFMediaType **aOutMFType);
+
+HRESULT MFGetStrideForBitmapInfoHeader(DWORD aFormat,
+ DWORD aWidth,
+ LONG *aOutStride);
+
+HRESULT MFGetService(IUnknown *punkObject,
+ REFGUID guidService,
+ REFIID riid,
+ LPVOID *ppvObject);
+
+HRESULT DXVA2CreateDirect3DDeviceManager9(UINT *pResetToken,
+ IDirect3DDeviceManager9 **ppDXVAManager);
+
+
+HRESULT MFCreateDXGIDeviceManager(UINT *pResetToken, IMFDXGIDeviceManager **ppDXVAManager);
+
+HRESULT MFCreateSample(IMFSample **ppIMFSample);
+
+HRESULT MFCreateAlignedMemoryBuffer(DWORD cbMaxLength,
+ DWORD fAlignmentFlags,
+ IMFMediaBuffer **ppBuffer);
+
+HRESULT MFCreateDXGISurfaceBuffer(REFIID riid,
+ IUnknown *punkSurface,
+ UINT uSubresourceIndex,
+ BOOL fButtomUpWhenLinear,
+ IMFMediaBuffer **ppBuffer);
+
+} // end namespace wmf
+} // end namespace mozilla
+
+
+
+#pragma pop_macro("WINVER")
+
+#endif
diff --git a/dom/media/platforms/wmf/WMFAudioMFTManager.cpp b/dom/media/platforms/wmf/WMFAudioMFTManager.cpp
new file mode 100644
index 000000000..69b62da51
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFAudioMFTManager.cpp
@@ -0,0 +1,358 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WMFAudioMFTManager.h"
+#include "MediaInfo.h"
+#include "VideoUtils.h"
+#include "WMFUtils.h"
+#include "nsTArray.h"
+#include "TimeUnits.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/Logging.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+namespace mozilla {
+
+static void
+AACAudioSpecificConfigToUserData(uint8_t aAACProfileLevelIndication,
+ const uint8_t* aAudioSpecConfig,
+ uint32_t aConfigLength,
+ nsTArray<BYTE>& aOutUserData)
+{
+ MOZ_ASSERT(aOutUserData.IsEmpty());
+
+ // The MF_MT_USER_DATA for AAC is defined here:
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/dd742784%28v=vs.85%29.aspx
+ //
+ // For MFAudioFormat_AAC, MF_MT_USER_DATA contains the portion of
+ // the HEAACWAVEINFO structure that appears after the WAVEFORMATEX
+ // structure (that is, after the wfx member). This is followed by
+ // the AudioSpecificConfig() data, as defined by ISO/IEC 14496-3.
+ // [...]
+ // The length of the AudioSpecificConfig() data is 2 bytes for AAC-LC
+ // or HE-AAC with implicit signaling of SBR/PS. It is more than 2 bytes
+ // for HE-AAC with explicit signaling of SBR/PS.
+ //
+ // The value of audioObjectType as defined in AudioSpecificConfig()
+ // must be 2, indicating AAC-LC. The value of extensionAudioObjectType
+ // must be 5 for SBR or 29 for PS.
+ //
+ // HEAACWAVEINFO structure:
+ // typedef struct heaacwaveinfo_tag {
+ // WAVEFORMATEX wfx;
+ // WORD wPayloadType;
+ // WORD wAudioProfileLevelIndication;
+ // WORD wStructType;
+ // WORD wReserved1;
+ // DWORD dwReserved2;
+ // }
+ const UINT32 heeInfoLen = 4 * sizeof(WORD) + sizeof(DWORD);
+
+ // The HEAACWAVEINFO must have payload and profile set,
+ // the rest can be all 0x00.
+ BYTE heeInfo[heeInfoLen] = {0};
+ WORD* w = (WORD*)heeInfo;
+ w[0] = 0x0; // Payload type raw AAC packet
+ w[1] = aAACProfileLevelIndication;
+
+ aOutUserData.AppendElements(heeInfo, heeInfoLen);
+
+ if (aAACProfileLevelIndication == 2 && aConfigLength > 2) {
+ // The AudioSpecificConfig is TTTTTFFF|FCCCCGGG
+ // (T=ObjectType, F=Frequency, C=Channel, G=GASpecificConfig)
+ // If frequency = 0xf, then the frequency is explicitly defined on 24 bits.
+ int8_t profile = (aAudioSpecConfig[0] & 0xF8) >> 3;
+ int8_t frequency =
+ (aAudioSpecConfig[0] & 0x7) << 1 | (aAudioSpecConfig[1] & 0x80) >> 7;
+ int8_t channels = (aAudioSpecConfig[1] & 0x78) >> 3;
+ int8_t gasc = aAudioSpecConfig[1] & 0x7;
+ if (frequency != 0xf && channels && !gasc) {
+ // We enter this condition if the AudioSpecificConfig should theorically
+ // be 2 bytes long but it's not.
+ // The WMF AAC decoder will error if unknown extensions are found,
+ // so remove them.
+ aConfigLength = 2;
+ }
+ }
+ aOutUserData.AppendElements(aAudioSpecConfig, aConfigLength);
+}
+
+WMFAudioMFTManager::WMFAudioMFTManager(
+ const AudioInfo& aConfig)
+ : mAudioChannels(aConfig.mChannels)
+ , mAudioRate(aConfig.mRate)
+ , mAudioFrameSum(0)
+ , mMustRecaptureAudioPosition(true)
+{
+ MOZ_COUNT_CTOR(WMFAudioMFTManager);
+
+ if (aConfig.mMimeType.EqualsLiteral("audio/mpeg")) {
+ mStreamType = MP3;
+ } else if (aConfig.mMimeType.EqualsLiteral("audio/mp4a-latm")) {
+ mStreamType = AAC;
+ AACAudioSpecificConfigToUserData(aConfig.mExtendedProfile,
+ aConfig.mCodecSpecificConfig->Elements(),
+ aConfig.mCodecSpecificConfig->Length(),
+ mUserData);
+ } else {
+ mStreamType = Unknown;
+ }
+}
+
+WMFAudioMFTManager::~WMFAudioMFTManager()
+{
+ MOZ_COUNT_DTOR(WMFAudioMFTManager);
+}
+
+const GUID&
+WMFAudioMFTManager::GetMFTGUID()
+{
+ MOZ_ASSERT(mStreamType != Unknown);
+ switch (mStreamType) {
+ case AAC: return CLSID_CMSAACDecMFT;
+ case MP3: return CLSID_CMP3DecMediaObject;
+ default: return GUID_NULL;
+ };
+}
+
+const GUID&
+WMFAudioMFTManager::GetMediaSubtypeGUID()
+{
+ MOZ_ASSERT(mStreamType != Unknown);
+ switch (mStreamType) {
+ case AAC: return MFAudioFormat_AAC;
+ case MP3: return MFAudioFormat_MP3;
+ default: return GUID_NULL;
+ };
+}
+
+bool
+WMFAudioMFTManager::Init()
+{
+ NS_ENSURE_TRUE(mStreamType != Unknown, false);
+
+ RefPtr<MFTDecoder> decoder(new MFTDecoder());
+
+ HRESULT hr = decoder->Create(GetMFTGUID());
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ // Setup input/output media types
+ RefPtr<IMFMediaType> inputType;
+
+ hr = wmf::MFCreateMediaType(getter_AddRefs(inputType));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = inputType->SetGUID(MF_MT_SUBTYPE, GetMediaSubtypeGUID());
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = inputType->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, mAudioRate);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = inputType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, mAudioChannels);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ if (mStreamType == AAC) {
+ hr = inputType->SetUINT32(MF_MT_AAC_PAYLOAD_TYPE, 0x0); // Raw AAC packet
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = inputType->SetBlob(MF_MT_USER_DATA,
+ mUserData.Elements(),
+ mUserData.Length());
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+ }
+
+ RefPtr<IMFMediaType> outputType;
+ hr = wmf::MFCreateMediaType(getter_AddRefs(outputType));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = outputType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = outputType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ hr = decoder->SetMediaTypes(inputType, outputType);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ mDecoder = decoder;
+
+ return true;
+}
+
+HRESULT
+WMFAudioMFTManager::Input(MediaRawData* aSample)
+{
+ return mDecoder->Input(aSample->Data(),
+ uint32_t(aSample->Size()),
+ aSample->mTime);
+}
+
+HRESULT
+WMFAudioMFTManager::UpdateOutputType()
+{
+ HRESULT hr;
+
+ RefPtr<IMFMediaType> type;
+ hr = mDecoder->GetOutputMediaType(type);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = type->GetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, &mAudioRate);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = type->GetUINT32(MF_MT_AUDIO_NUM_CHANNELS, &mAudioChannels);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ AudioConfig::ChannelLayout layout(mAudioChannels);
+ if (!layout.IsValid()) {
+ return E_FAIL;
+ }
+
+ return S_OK;
+}
+
+HRESULT
+WMFAudioMFTManager::Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutData)
+{
+ aOutData = nullptr;
+ RefPtr<IMFSample> sample;
+ HRESULT hr;
+ int typeChangeCount = 0;
+ while (true) {
+ hr = mDecoder->Output(&sample);
+ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
+ return hr;
+ }
+ if (hr == MF_E_TRANSFORM_STREAM_CHANGE) {
+ hr = UpdateOutputType();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ // Catch infinite loops, but some decoders perform at least 2 stream
+ // changes on consecutive calls, so be permissive.
+ // 100 is arbitrarily > 2.
+ NS_ENSURE_TRUE(typeChangeCount < 100, MF_E_TRANSFORM_STREAM_CHANGE);
+ ++typeChangeCount;
+ continue;
+ }
+ break;
+ }
+
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ if (!sample) {
+ LOG("Audio MFTDecoder returned success but null output.");
+ nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([]() -> void {
+ LOG("Reporting telemetry AUDIO_MFT_OUTPUT_NULL_SAMPLES");
+ Telemetry::Accumulate(Telemetry::ID::AUDIO_MFT_OUTPUT_NULL_SAMPLES, 1);
+ });
+ AbstractThread::MainThread()->Dispatch(task.forget());
+ return E_FAIL;
+ }
+
+ RefPtr<IMFMediaBuffer> buffer;
+ hr = sample->ConvertToContiguousBuffer(getter_AddRefs(buffer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ BYTE* data = nullptr; // Note: *data will be owned by the IMFMediaBuffer, we don't need to free it.
+ DWORD maxLength = 0, currentLength = 0;
+ hr = buffer->Lock(&data, &maxLength, &currentLength);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // Sometimes when starting decoding, the AAC decoder gives us samples
+ // with a negative timestamp. AAC does usually have preroll (or encoder
+ // delay) encoded into its bitstream, but the amount encoded to the stream
+ // is variable, and it not signalled in-bitstream. There is sometimes
+ // signalling in the MP4 container what the preroll amount, but it's
+ // inconsistent. It looks like WMF's AAC encoder may take this into
+ // account, so strip off samples with a negative timestamp to get us
+ // to a 0-timestamp start. This seems to maintain A/V sync, so we can run
+ // with this until someone complains...
+
+ // We calculate the timestamp and the duration based on the number of audio
+ // frames we've already played. We don't trust the timestamp stored on the
+ // IMFSample, as sometimes it's wrong, possibly due to buggy encoders?
+
+ // If this sample block comes after a discontinuity (i.e. a gap or seek)
+ // reset the frame counters, and capture the timestamp. Future timestamps
+ // will be offset from this block's timestamp.
+ UINT32 discontinuity = false;
+ sample->GetUINT32(MFSampleExtension_Discontinuity, &discontinuity);
+ if (mMustRecaptureAudioPosition || discontinuity) {
+ // Update the output type, in case this segment has a different
+ // rate. This also triggers on the first sample, which can have a
+ // different rate than is advertised in the container, and sometimes we
+ // don't get a MF_E_TRANSFORM_STREAM_CHANGE when the rate changes.
+ hr = UpdateOutputType();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ mAudioFrameSum = 0;
+ LONGLONG timestampHns = 0;
+ hr = sample->GetSampleTime(&timestampHns);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ mAudioTimeOffset = media::TimeUnit::FromMicroseconds(timestampHns / 10);
+ mMustRecaptureAudioPosition = false;
+ }
+ // We can assume PCM 16 output.
+ int32_t numSamples = currentLength / 2;
+ int32_t numFrames = numSamples / mAudioChannels;
+ MOZ_ASSERT(numFrames >= 0);
+ MOZ_ASSERT(numSamples >= 0);
+ if (numFrames == 0) {
+ // All data from this chunk stripped, loop back and try to output the next
+ // frame, if possible.
+ return S_OK;
+ }
+
+ AlignedAudioBuffer audioData(numSamples);
+ if (!audioData) {
+ return E_OUTOFMEMORY;
+ }
+
+ int16_t* pcm = (int16_t*)data;
+ for (int32_t i = 0; i < numSamples; ++i) {
+ audioData[i] = AudioSampleToFloat(pcm[i]);
+ }
+
+ buffer->Unlock();
+
+ media::TimeUnit timestamp =
+ mAudioTimeOffset + FramesToTimeUnit(mAudioFrameSum, mAudioRate);
+ NS_ENSURE_TRUE(timestamp.IsValid(), E_FAIL);
+
+ mAudioFrameSum += numFrames;
+
+ media::TimeUnit duration = FramesToTimeUnit(numFrames, mAudioRate);
+ NS_ENSURE_TRUE(duration.IsValid(), E_FAIL);
+
+ aOutData = new AudioData(aStreamOffset,
+ timestamp.ToMicroseconds(),
+ duration.ToMicroseconds(),
+ numFrames,
+ Move(audioData),
+ mAudioChannels,
+ mAudioRate);
+
+ #ifdef LOG_SAMPLE_DECODE
+ LOG("Decoded audio sample! timestamp=%lld duration=%lld currentLength=%u",
+ timestamp.ToMicroseconds(), duration.ToMicroseconds(), currentLength);
+ #endif
+
+ return S_OK;
+}
+
+void
+WMFAudioMFTManager::Shutdown()
+{
+ mDecoder = nullptr;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wmf/WMFAudioMFTManager.h b/dom/media/platforms/wmf/WMFAudioMFTManager.h
new file mode 100644
index 000000000..5bbbc6108
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFAudioMFTManager.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(WMFAudioOutputSource_h_)
+#define WMFAudioOutputSource_h_
+
+#include "WMF.h"
+#include "MFTDecoder.h"
+#include "mozilla/RefPtr.h"
+#include "WMFMediaDataDecoder.h"
+
+extern const GUID CLSID_WebmMfVpxDec;
+
+namespace mozilla {
+
+class WMFAudioMFTManager : public MFTManager {
+public:
+ WMFAudioMFTManager(const AudioInfo& aConfig);
+ ~WMFAudioMFTManager();
+
+ bool Init();
+
+ HRESULT Input(MediaRawData* aSample) override;
+
+ // Note WMF's AAC decoder sometimes output negatively timestamped samples,
+ // presumably they're the preroll samples, and we strip them. We may return
+ // a null aOutput in this case.
+ HRESULT Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutput) override;
+
+ void Shutdown() override;
+
+ TrackInfo::TrackType GetType() override {
+ return TrackInfo::kAudioTrack;
+ }
+
+ const char* GetDescriptionName() const override
+ {
+ return "wmf audio decoder";
+ }
+
+private:
+
+ HRESULT UpdateOutputType();
+
+ uint32_t mAudioChannels;
+ uint32_t mAudioRate;
+ nsTArray<BYTE> mUserData;
+
+ // The offset, at which playback started since the
+ // last discontinuity.
+ media::TimeUnit mAudioTimeOffset;
+ // The number of audio frames that we've played since the last
+ // discontinuity.
+ int64_t mAudioFrameSum;
+
+ enum StreamType {
+ Unknown,
+ AAC,
+ MP3
+ };
+ StreamType mStreamType;
+
+ const GUID& GetMFTGUID();
+ const GUID& GetMediaSubtypeGUID();
+
+ // True if we need to re-initialize mAudioTimeOffset and mAudioFrameSum
+ // from the next audio packet we decode. This happens after a seek, since
+ // WMF doesn't mark a stream as having a discontinuity after a seek(0).
+ bool mMustRecaptureAudioPosition;
+};
+
+} // namespace mozilla
+
+#endif // WMFAudioOutputSource_h_
diff --git a/dom/media/platforms/wmf/WMFDecoderModule.cpp b/dom/media/platforms/wmf/WMFDecoderModule.cpp
new file mode 100644
index 000000000..06bf49fa6
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp
@@ -0,0 +1,257 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WMF.h"
+#include "WMFDecoderModule.h"
+#include "WMFVideoMFTManager.h"
+#include "WMFAudioMFTManager.h"
+#include "MFTDecoder.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/Services.h"
+#include "WMFMediaDataDecoder.h"
+#include "nsAutoPtr.h"
+#include "nsIWindowsRegKey.h"
+#include "nsComponentManagerUtils.h"
+#include "nsServiceManagerUtils.h"
+#include "nsIGfxInfo.h"
+#include "nsWindowsHelpers.h"
+#include "GfxDriverInfo.h"
+#include "mozilla/gfx/gfxVars.h"
+#include "MediaInfo.h"
+#include "MediaPrefs.h"
+#include "prsystem.h"
+#include "mozilla/Maybe.h"
+#include "mozilla/StaticMutex.h"
+#include "mozilla/WindowsVersion.h"
+#include "MP4Decoder.h"
+#include "VPXDecoder.h"
+
+namespace mozilla {
+
+static Atomic<bool> sDXVAEnabled(false);
+
+WMFDecoderModule::WMFDecoderModule()
+ : mWMFInitialized(false)
+{
+}
+
+WMFDecoderModule::~WMFDecoderModule()
+{
+ if (mWMFInitialized) {
+ DebugOnly<HRESULT> hr = wmf::MFShutdown();
+ NS_ASSERTION(SUCCEEDED(hr), "MFShutdown failed");
+ }
+}
+
+/* static */
+void
+WMFDecoderModule::Init()
+{
+ sDXVAEnabled = gfx::gfxVars::CanUseHardwareVideoDecoding();
+}
+
+/* static */
+int
+WMFDecoderModule::GetNumDecoderThreads()
+{
+ int32_t numCores = PR_GetNumberOfProcessors();
+
+ // If we have more than 4 cores, let the decoder decide how many threads.
+ // On an 8 core machine, WMF chooses 4 decoder threads
+ const int WMF_DECODER_DEFAULT = -1;
+ int32_t prefThreadCount = WMF_DECODER_DEFAULT;
+ if (XRE_GetProcessType() != GeckoProcessType_GPU) {
+ prefThreadCount = MediaPrefs::PDMWMFThreadCount();
+ }
+ if (prefThreadCount != WMF_DECODER_DEFAULT) {
+ return std::max(prefThreadCount, 1);
+ } else if (numCores > 4) {
+ return WMF_DECODER_DEFAULT;
+ }
+ return std::max(numCores - 1, 1);
+}
+
+nsresult
+WMFDecoderModule::Startup()
+{
+ mWMFInitialized = SUCCEEDED(wmf::MFStartup());
+ return mWMFInitialized ? NS_OK : NS_ERROR_FAILURE;
+}
+
+already_AddRefed<MediaDataDecoder>
+WMFDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
+{
+ nsAutoPtr<WMFVideoMFTManager> manager(
+ new WMFVideoMFTManager(aParams.VideoConfig(),
+ aParams.mKnowsCompositor,
+ aParams.mImageContainer,
+ sDXVAEnabled));
+
+ if (!manager->Init()) {
+ return nullptr;
+ }
+
+ RefPtr<MediaDataDecoder> decoder =
+ new WMFMediaDataDecoder(manager.forget(), aParams.mTaskQueue, aParams.mCallback);
+
+ return decoder.forget();
+}
+
+already_AddRefed<MediaDataDecoder>
+WMFDecoderModule::CreateAudioDecoder(const CreateDecoderParams& aParams)
+{
+ nsAutoPtr<WMFAudioMFTManager> manager(new WMFAudioMFTManager(aParams.AudioConfig()));
+
+ if (!manager->Init()) {
+ return nullptr;
+ }
+
+ RefPtr<MediaDataDecoder> decoder =
+ new WMFMediaDataDecoder(manager.forget(), aParams.mTaskQueue, aParams.mCallback);
+ return decoder.forget();
+}
+
+static bool
+CanCreateMFTDecoder(const GUID& aGuid)
+{
+ if (FAILED(wmf::MFStartup())) {
+ return false;
+ }
+ bool hasdecoder = false;
+ {
+ RefPtr<MFTDecoder> decoder(new MFTDecoder());
+ hasdecoder = SUCCEEDED(decoder->Create(aGuid));
+ }
+ wmf::MFShutdown();
+ return hasdecoder;
+}
+
+template<const GUID& aGuid>
+static bool
+CanCreateWMFDecoder()
+{
+ static StaticMutex sMutex;
+ StaticMutexAutoLock lock(sMutex);
+ static Maybe<bool> result;
+ if (result.isNothing()) {
+ result.emplace(CanCreateMFTDecoder(aGuid));
+ }
+ return result.value();
+}
+
+static bool
+IsH264DecoderBlacklisted()
+{
+#ifdef BLACKLIST_CRASHY_H264_DECODERS
+ WCHAR systemPath[MAX_PATH + 1];
+ if (!ConstructSystem32Path(L"msmpeg2vdec.dll", systemPath, MAX_PATH + 1)) {
+ // Cannot build path -> Assume it's not the blacklisted DLL.
+ return false;
+ }
+
+ DWORD zero;
+ DWORD infoSize = GetFileVersionInfoSizeW(systemPath, &zero);
+ if (infoSize == 0) {
+ // Can't get file info -> Assume we don't have the blacklisted DLL.
+ return false;
+ }
+ auto infoData = MakeUnique<unsigned char[]>(infoSize);
+ VS_FIXEDFILEINFO *vInfo;
+ UINT vInfoLen;
+ if (GetFileVersionInfoW(systemPath, 0, infoSize, infoData.get()) &&
+ VerQueryValueW(infoData.get(), L"\\", (LPVOID*)&vInfo, &vInfoLen))
+ {
+ if ((vInfo->dwFileVersionMS == ((12u << 16) | 0u))
+ && ((vInfo->dwFileVersionLS == ((9200u << 16) | 16426u))
+ || (vInfo->dwFileVersionLS == ((9200u << 16) | 17037u)))) {
+ // 12.0.9200.16426 & .17037 are blacklisted on Win64, see bug 1242343.
+ return true;
+ }
+ }
+#endif // BLACKLIST_CRASHY_H264_DECODERS
+ return false;
+}
+
+/* static */ bool
+WMFDecoderModule::HasH264()
+{
+ if (IsH264DecoderBlacklisted()) {
+ return false;
+ }
+ return CanCreateWMFDecoder<CLSID_CMSH264DecoderMFT>();
+}
+
+/* static */ bool
+WMFDecoderModule::HasAAC()
+{
+ return CanCreateWMFDecoder<CLSID_CMSAACDecMFT>();
+}
+
+bool
+WMFDecoderModule::SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ UniquePtr<TrackInfo> trackInfo = CreateTrackInfoWithMIMEType(aMimeType);
+ if (!trackInfo) {
+ return false;
+ }
+ return Supports(*trackInfo, aDiagnostics);
+}
+
+bool
+WMFDecoderModule::Supports(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const
+{
+ if ((aTrackInfo.mMimeType.EqualsLiteral("audio/mp4a-latm") ||
+ aTrackInfo.mMimeType.EqualsLiteral("audio/mp4")) &&
+ WMFDecoderModule::HasAAC()) {
+ return true;
+ }
+ if (MP4Decoder::IsH264(aTrackInfo.mMimeType) && WMFDecoderModule::HasH264()) {
+ const VideoInfo* videoInfo = aTrackInfo.GetAsVideoInfo();
+ MOZ_ASSERT(videoInfo);
+ // Check Windows format constraints, based on:
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815(v=vs.85).aspx
+ if (IsWin8OrLater()) {
+ // Windows >7 supports at most 4096x2304.
+ if (videoInfo->mImage.width > 4096 || videoInfo->mImage.height > 2304) {
+ return false;
+ }
+ } else {
+ // Windows <=7 supports at most 1920x1088.
+ if (videoInfo->mImage.width > 1920 || videoInfo->mImage.height > 1088) {
+ return false;
+ }
+ }
+ return true;
+ }
+ if (aTrackInfo.mMimeType.EqualsLiteral("audio/mpeg") &&
+ CanCreateWMFDecoder<CLSID_CMP3DecMediaObject>()) {
+ return true;
+ }
+ if (MediaPrefs::PDMWMFVP9DecoderEnabled() && sDXVAEnabled) {
+ if ((VPXDecoder::IsVP8(aTrackInfo.mMimeType) ||
+ VPXDecoder::IsVP9(aTrackInfo.mMimeType)) &&
+ CanCreateWMFDecoder<CLSID_WebmMfVpxDec>()) {
+ return true;
+ }
+ }
+
+ // Some unsupported codec.
+ return false;
+}
+
+PlatformDecoderModule::ConversionRequired
+WMFDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
+{
+ if (aConfig.IsVideo() && MP4Decoder::IsH264(aConfig.mMimeType)) {
+ return ConversionRequired::kNeedAnnexB;
+ } else {
+ return ConversionRequired::kNeedNone;
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wmf/WMFDecoderModule.h b/dom/media/platforms/wmf/WMFDecoderModule.h
new file mode 100644
index 000000000..cd7b8c660
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFDecoderModule.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(WMFPlatformDecoderModule_h_)
+#define WMFPlatformDecoderModule_h_
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+class WMFDecoderModule : public PlatformDecoderModule {
+public:
+ WMFDecoderModule();
+ virtual ~WMFDecoderModule();
+
+ // Initializes the module, loads required dynamic libraries, etc.
+ nsresult Startup() override;
+
+ already_AddRefed<MediaDataDecoder>
+ CreateVideoDecoder(const CreateDecoderParams& aParams) override;
+
+ already_AddRefed<MediaDataDecoder>
+ CreateAudioDecoder(const CreateDecoderParams& aParams) override;
+
+ bool SupportsMimeType(const nsACString& aMimeType,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+ bool Supports(const TrackInfo& aTrackInfo,
+ DecoderDoctorDiagnostics* aDiagnostics) const override;
+
+ ConversionRequired
+ DecoderNeedsConversion(const TrackInfo& aConfig) const override;
+
+ // Called on main thread.
+ static void Init();
+
+ // Called from any thread, must call init first
+ static int GetNumDecoderThreads();
+
+ // Accessors that report whether we have the required MFTs available
+ // on the system to play various codecs. Windows Vista doesn't have the
+ // H.264/AAC decoders if the "Platform Update Supplement for Windows Vista"
+ // is not installed, and Window N and KN variants also require a "Media
+ // Feature Pack" to be installed. Windows XP doesn't have WMF.
+ static bool HasAAC();
+ static bool HasH264();
+
+private:
+ bool mWMFInitialized;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp b/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp
new file mode 100644
index 000000000..d2c13eac7
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFMediaDataDecoder.cpp
@@ -0,0 +1,227 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WMFMediaDataDecoder.h"
+#include "VideoUtils.h"
+#include "WMFUtils.h"
+#include "nsTArray.h"
+#include "mozilla/Telemetry.h"
+
+#include "mozilla/Logging.h"
+#include "mozilla/SyncRunnable.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+namespace mozilla {
+
+WMFMediaDataDecoder::WMFMediaDataDecoder(MFTManager* aMFTManager,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback)
+ : mTaskQueue(aTaskQueue)
+ , mCallback(aCallback)
+ , mMFTManager(aMFTManager)
+ , mIsFlushing(false)
+ , mIsShutDown(false)
+{
+}
+
+WMFMediaDataDecoder::~WMFMediaDataDecoder()
+{
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+WMFMediaDataDecoder::Init()
+{
+ MOZ_ASSERT(!mIsShutDown);
+ return InitPromise::CreateAndResolve(mMFTManager->GetType(), __func__);
+}
+
+// A single telemetry sample is reported for each MediaDataDecoder object
+// that has detected error or produced output successfully.
+static void
+SendTelemetry(unsigned long hr)
+{
+ // Collapse the error codes into a range of 0-0xff that can be viewed in
+ // telemetry histograms. For most MF_E_* errors, unique samples are used,
+ // retaining the least significant 7 or 8 bits. Other error codes are
+ // bucketed.
+ uint32_t sample;
+ if (SUCCEEDED(hr)) {
+ sample = 0;
+ } else if (hr < 0xc00d36b0) {
+ sample = 1; // low bucket
+ } else if (hr < 0xc00d3700) {
+ sample = hr & 0xffU; // MF_E_*
+ } else if (hr <= 0xc00d3705) {
+ sample = 0x80 + (hr & 0xfU); // more MF_E_*
+ } else if (hr < 0xc00d6d60) {
+ sample = 2; // mid bucket
+ } else if (hr <= 0xc00d6d78) {
+ sample = hr & 0xffU; // MF_E_TRANSFORM_*
+ } else {
+ sample = 3; // high bucket
+ }
+
+ nsCOMPtr<nsIRunnable> runnable = NS_NewRunnableFunction(
+ [sample] {
+ Telemetry::Accumulate(Telemetry::MEDIA_WMF_DECODE_ERROR, sample);
+ });
+ NS_DispatchToMainThread(runnable);
+}
+
+void
+WMFMediaDataDecoder::Shutdown()
+{
+ MOZ_DIAGNOSTIC_ASSERT(!mIsShutDown);
+
+ if (mTaskQueue) {
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &WMFMediaDataDecoder::ProcessShutdown));
+ } else {
+ ProcessShutdown();
+ }
+ mIsShutDown = true;
+}
+
+void
+WMFMediaDataDecoder::ProcessShutdown()
+{
+ if (mMFTManager) {
+ mMFTManager->Shutdown();
+ mMFTManager = nullptr;
+ if (!mRecordedError && mHasSuccessfulOutput) {
+ SendTelemetry(S_OK);
+ }
+ }
+}
+
+// Inserts data into the decoder's pipeline.
+void
+WMFMediaDataDecoder::Input(MediaRawData* aSample)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(!mIsShutDown);
+
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod<RefPtr<MediaRawData>>(
+ this,
+ &WMFMediaDataDecoder::ProcessDecode,
+ RefPtr<MediaRawData>(aSample));
+ mTaskQueue->Dispatch(runnable.forget());
+}
+
+void
+WMFMediaDataDecoder::ProcessDecode(MediaRawData* aSample)
+{
+ if (mIsFlushing) {
+ // Skip sample, to be released by runnable.
+ return;
+ }
+
+ HRESULT hr = mMFTManager->Input(aSample);
+ if (FAILED(hr)) {
+ NS_WARNING("MFTManager rejected sample");
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("MFTManager::Input:%x", hr)));
+ if (!mRecordedError) {
+ SendTelemetry(hr);
+ mRecordedError = true;
+ }
+ return;
+ }
+
+ mLastStreamOffset = aSample->mOffset;
+
+ ProcessOutput();
+}
+
+void
+WMFMediaDataDecoder::ProcessOutput()
+{
+ RefPtr<MediaData> output;
+ HRESULT hr = S_OK;
+ while (SUCCEEDED(hr = mMFTManager->Output(mLastStreamOffset, output)) &&
+ output) {
+ mHasSuccessfulOutput = true;
+ mCallback->Output(output);
+ }
+ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
+ mCallback->InputExhausted();
+ } else if (FAILED(hr)) {
+ NS_WARNING("WMFMediaDataDecoder failed to output data");
+ mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("MFTManager::Output:%x", hr)));
+ if (!mRecordedError) {
+ SendTelemetry(hr);
+ mRecordedError = true;
+ }
+ }
+}
+
+void
+WMFMediaDataDecoder::ProcessFlush()
+{
+ if (mMFTManager) {
+ mMFTManager->Flush();
+ }
+}
+
+void
+WMFMediaDataDecoder::Flush()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(!mIsShutDown);
+
+ mIsFlushing = true;
+ nsCOMPtr<nsIRunnable> runnable =
+ NewRunnableMethod(this, &WMFMediaDataDecoder::ProcessFlush);
+ SyncRunnable::DispatchToThread(mTaskQueue, runnable);
+ mIsFlushing = false;
+}
+
+void
+WMFMediaDataDecoder::ProcessDrain()
+{
+ if (!mIsFlushing && mMFTManager) {
+ // Order the decoder to drain...
+ mMFTManager->Drain();
+ // Then extract all available output.
+ ProcessOutput();
+ }
+ mCallback->DrainComplete();
+}
+
+void
+WMFMediaDataDecoder::Drain()
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(!mIsShutDown);
+
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &WMFMediaDataDecoder::ProcessDrain));
+}
+
+bool
+WMFMediaDataDecoder::IsHardwareAccelerated(nsACString& aFailureReason) const {
+ MOZ_ASSERT(!mIsShutDown);
+
+ return mMFTManager && mMFTManager->IsHardwareAccelerated(aFailureReason);
+}
+
+void
+WMFMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime)
+{
+ MOZ_ASSERT(mCallback->OnReaderTaskQueue());
+ MOZ_DIAGNOSTIC_ASSERT(!mIsShutDown);
+
+ RefPtr<WMFMediaDataDecoder> self = this;
+ nsCOMPtr<nsIRunnable> runnable =
+ NS_NewRunnableFunction([self, aTime]() {
+ media::TimeUnit threshold = aTime;
+ self->mMFTManager->SetSeekThreshold(threshold);
+ });
+ mTaskQueue->Dispatch(runnable.forget());
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wmf/WMFMediaDataDecoder.h b/dom/media/platforms/wmf/WMFMediaDataDecoder.h
new file mode 100644
index 000000000..a4dd49f56
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFMediaDataDecoder.h
@@ -0,0 +1,147 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(WMFMediaDataDecoder_h_)
+#define WMFMediaDataDecoder_h_
+
+
+#include "WMF.h"
+#include "MFTDecoder.h"
+#include "mozilla/RefPtr.h"
+#include "nsAutoPtr.h"
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+// Encapsulates the initialization of the MFTDecoder appropriate for decoding
+// a given stream, and the process of converting the IMFSample produced
+// by the MFT into a MediaData object.
+class MFTManager {
+public:
+ virtual ~MFTManager() {}
+
+ // Submit a compressed sample for decoding.
+ // This should forward to the MFTDecoder after performing
+ // any required sample formatting.
+ virtual HRESULT Input(MediaRawData* aSample) = 0;
+
+ // Produces decoded output, if possible. Blocks until output can be produced,
+ // or until no more is able to be produced.
+ // Returns S_OK on success, or MF_E_TRANSFORM_NEED_MORE_INPUT if there's not
+ // enough data to produce more output. If this returns a failure code other
+ // than MF_E_TRANSFORM_NEED_MORE_INPUT, an error will be reported to the
+ // MP4Reader.
+ virtual HRESULT Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutput) = 0;
+
+ virtual void Flush()
+ {
+ mDecoder->Flush();
+ mSeekTargetThreshold.reset();
+ }
+
+ virtual void Drain()
+ {
+ if (FAILED(mDecoder->SendMFTMessage(MFT_MESSAGE_COMMAND_DRAIN, 0))) {
+ NS_WARNING("Failed to send DRAIN command to MFT");
+ }
+ }
+
+ // Destroys all resources.
+ virtual void Shutdown() = 0;
+
+ virtual bool IsHardwareAccelerated(nsACString& aFailureReason) const { return false; }
+
+ virtual TrackInfo::TrackType GetType() = 0;
+
+ virtual const char* GetDescriptionName() const = 0;
+
+ virtual void SetSeekThreshold(const media::TimeUnit& aTime) {
+ mSeekTargetThreshold = Some(aTime);
+ }
+
+protected:
+ // IMFTransform wrapper that performs the decoding.
+ RefPtr<MFTDecoder> mDecoder;
+
+ Maybe<media::TimeUnit> mSeekTargetThreshold;
+};
+
+// Decodes audio and video using Windows Media Foundation. Samples are decoded
+// using the MFTDecoder created by the MFTManager. This class implements
+// the higher-level logic that drives mapping the MFT to the async
+// MediaDataDecoder interface. The specifics of decoding the exact stream
+// type are handled by MFTManager and the MFTDecoder it creates.
+class WMFMediaDataDecoder : public MediaDataDecoder {
+public:
+ WMFMediaDataDecoder(MFTManager* aOutputSource,
+ TaskQueue* aTaskQueue,
+ MediaDataDecoderCallback* aCallback);
+ ~WMFMediaDataDecoder();
+
+ RefPtr<MediaDataDecoder::InitPromise> Init() override;
+
+ void Input(MediaRawData* aSample);
+
+ void Flush() override;
+
+ void Drain() override;
+
+ void Shutdown() override;
+
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
+
+ const char* GetDescriptionName() const override
+ {
+ return mMFTManager ? mMFTManager->GetDescriptionName() : "";
+ }
+
+ virtual void SetSeekThreshold(const media::TimeUnit& aTime) override;
+
+private:
+
+ // Called on the task queue. Inserts the sample into the decoder, and
+ // extracts output if available.
+ void ProcessDecode(MediaRawData* aSample);
+
+ // Called on the task queue. Extracts output if available, and delivers
+ // it to the reader. Called after ProcessDecode() and ProcessDrain().
+ void ProcessOutput();
+
+ // Called on the task queue. Orders the MFT to flush. There is no output to
+ // extract.
+ void ProcessFlush();
+
+ // Called on the task queue. Orders the MFT to drain, and then extracts
+ // all available output.
+ void ProcessDrain();
+
+ void ProcessShutdown();
+
+ const RefPtr<TaskQueue> mTaskQueue;
+ MediaDataDecoderCallback* mCallback;
+
+ nsAutoPtr<MFTManager> mMFTManager;
+
+ // The last offset into the media resource that was passed into Input().
+ // This is used to approximate the decoder's position in the media resource.
+ int64_t mLastStreamOffset;
+
+ // Set on reader/decode thread calling Flush() to indicate that output is
+ // not required and so input samples on mTaskQueue need not be processed.
+ // Cleared on mTaskQueue.
+ Atomic<bool> mIsFlushing;
+
+ bool mIsShutDown;
+
+ // For telemetry
+ bool mHasSuccessfulOutput = false;
+ bool mRecordedError = false;
+};
+
+} // namespace mozilla
+
+#endif // WMFMediaDataDecoder_h_
diff --git a/dom/media/platforms/wmf/WMFUtils.cpp b/dom/media/platforms/wmf/WMFUtils.cpp
new file mode 100644
index 000000000..8aec8a8af
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFUtils.cpp
@@ -0,0 +1,311 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WMFUtils.h"
+#include <stdint.h>
+#include "mozilla/ArrayUtils.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/WindowsVersion.h"
+#include "mozilla/Logging.h"
+#include "nsThreadUtils.h"
+#include "nsWindowsHelpers.h"
+#include "mozilla/CheckedInt.h"
+#include "VideoUtils.h"
+#include <initguid.h>
+#include "nsTArray.h"
+
+#ifdef WMF_MUST_DEFINE_AAC_MFT_CLSID
+// Some SDK versions don't define the AAC decoder CLSID.
+// {32D186A7-218F-4C75-8876-DD77273A8999}
+DEFINE_GUID(CLSID_CMSAACDecMFT, 0x32D186A7, 0x218F, 0x4C75, 0x88, 0x76, 0xDD, 0x77, 0x27, 0x3A, 0x89, 0x99);
+#endif
+
+namespace mozilla {
+
+HRESULT
+HNsToFrames(int64_t aHNs, uint32_t aRate, int64_t* aOutFrames)
+{
+ MOZ_ASSERT(aOutFrames);
+ const int64_t HNS_PER_S = USECS_PER_S * 10;
+ CheckedInt<int64_t> i = aHNs;
+ i *= aRate;
+ i /= HNS_PER_S;
+ NS_ENSURE_TRUE(i.isValid(), E_FAIL);
+ *aOutFrames = i.value();
+ return S_OK;
+}
+
+HRESULT
+GetDefaultStride(IMFMediaType *aType, uint32_t aWidth, uint32_t* aOutStride)
+{
+ // Try to get the default stride from the media type.
+ HRESULT hr = aType->GetUINT32(MF_MT_DEFAULT_STRIDE, aOutStride);
+ if (SUCCEEDED(hr)) {
+ return S_OK;
+ }
+
+ // Stride attribute not set, calculate it.
+ GUID subtype = GUID_NULL;
+
+ hr = aType->GetGUID(MF_MT_SUBTYPE, &subtype);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = wmf::MFGetStrideForBitmapInfoHeader(subtype.Data1, aWidth, (LONG*)(aOutStride));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return hr;
+}
+
+int32_t
+MFOffsetToInt32(const MFOffset& aOffset)
+{
+ return int32_t(aOffset.value + (aOffset.fract / 65536.0f));
+}
+
+media::TimeUnit
+GetSampleDuration(IMFSample* aSample)
+{
+ NS_ENSURE_TRUE(aSample, media::TimeUnit::Invalid());
+ int64_t duration = 0;
+ aSample->GetSampleDuration(&duration);
+ return media::TimeUnit::FromMicroseconds(HNsToUsecs(duration));
+}
+
+media::TimeUnit
+GetSampleTime(IMFSample* aSample)
+{
+ NS_ENSURE_TRUE(aSample, media::TimeUnit::Invalid());
+ LONGLONG timestampHns = 0;
+ HRESULT hr = aSample->GetSampleTime(&timestampHns);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), media::TimeUnit::Invalid());
+ return media::TimeUnit::FromMicroseconds(HNsToUsecs(timestampHns));
+}
+
+// Gets the sub-region of the video frame that should be displayed.
+// See: http://msdn.microsoft.com/en-us/library/windows/desktop/bb530115(v=vs.85).aspx
+HRESULT
+GetPictureRegion(IMFMediaType* aMediaType, nsIntRect& aOutPictureRegion)
+{
+ // Determine if "pan and scan" is enabled for this media. If it is, we
+ // only display a region of the video frame, not the entire frame.
+ BOOL panScan = MFGetAttributeUINT32(aMediaType, MF_MT_PAN_SCAN_ENABLED, FALSE);
+
+ // If pan and scan mode is enabled. Try to get the display region.
+ HRESULT hr = E_FAIL;
+ MFVideoArea videoArea;
+ memset(&videoArea, 0, sizeof(MFVideoArea));
+ if (panScan) {
+ hr = aMediaType->GetBlob(MF_MT_PAN_SCAN_APERTURE,
+ (UINT8*)&videoArea,
+ sizeof(MFVideoArea),
+ nullptr);
+ }
+
+ // If we're not in pan-and-scan mode, or the pan-and-scan region is not set,
+ // check for a minimimum display aperture.
+ if (!panScan || hr == MF_E_ATTRIBUTENOTFOUND) {
+ hr = aMediaType->GetBlob(MF_MT_MINIMUM_DISPLAY_APERTURE,
+ (UINT8*)&videoArea,
+ sizeof(MFVideoArea),
+ nullptr);
+ }
+
+ if (hr == MF_E_ATTRIBUTENOTFOUND) {
+ // Minimum display aperture is not set, for "backward compatibility with
+ // some components", check for a geometric aperture.
+ hr = aMediaType->GetBlob(MF_MT_GEOMETRIC_APERTURE,
+ (UINT8*)&videoArea,
+ sizeof(MFVideoArea),
+ nullptr);
+ }
+
+ if (SUCCEEDED(hr)) {
+ // The media specified a picture region, return it.
+ aOutPictureRegion = nsIntRect(MFOffsetToInt32(videoArea.OffsetX),
+ MFOffsetToInt32(videoArea.OffsetY),
+ videoArea.Area.cx,
+ videoArea.Area.cy);
+ return S_OK;
+ }
+
+ // No picture region defined, fall back to using the entire video area.
+ UINT32 width = 0, height = 0;
+ hr = MFGetAttributeSize(aMediaType, MF_MT_FRAME_SIZE, &width, &height);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ NS_ENSURE_TRUE(width <= MAX_VIDEO_WIDTH, E_FAIL);
+ NS_ENSURE_TRUE(height <= MAX_VIDEO_HEIGHT, E_FAIL);
+
+ aOutPictureRegion = nsIntRect(0, 0, width, height);
+ return S_OK;
+}
+
+namespace wmf {
+
+static const wchar_t* sDLLs[] = {
+ L"mfplat.dll",
+ L"mf.dll",
+ L"dxva2.dll",
+ L"evr.dll",
+};
+
+HRESULT
+LoadDLLs()
+{
+ static bool sDLLsLoaded = false;
+ static bool sFailedToLoadDlls = false;
+
+ if (sDLLsLoaded) {
+ return S_OK;
+ }
+ if (sFailedToLoadDlls) {
+ return E_FAIL;
+ }
+
+ // Try to load all the required DLLs. If we fail to load any dll,
+ // unload the dlls we succeeded in loading.
+ nsTArray<const wchar_t*> loadedDlls;
+ for (const wchar_t* dll : sDLLs) {
+ if (!LoadLibrarySystem32(dll)) {
+ NS_WARNING("Failed to load WMF DLLs");
+ for (const wchar_t* loadedDll : loadedDlls) {
+ FreeLibrary(GetModuleHandleW(loadedDll));
+ }
+ sFailedToLoadDlls = true;
+ return E_FAIL;
+ }
+ loadedDlls.AppendElement(dll);
+ }
+ sDLLsLoaded = true;
+
+ return S_OK;
+}
+
+#define ENSURE_FUNCTION_PTR_HELPER(FunctionType, FunctionName, DLL) \
+ static FunctionType FunctionName##Ptr = nullptr; \
+ if (!FunctionName##Ptr) { \
+ FunctionName##Ptr = (FunctionType) GetProcAddress(GetModuleHandleW(L ## #DLL), #FunctionName); \
+ if (!FunctionName##Ptr) { \
+ NS_WARNING("Failed to get GetProcAddress of " #FunctionName " from " #DLL); \
+ return E_FAIL; \
+ } \
+ }
+
+#define ENSURE_FUNCTION_PTR(FunctionName, DLL) \
+ ENSURE_FUNCTION_PTR_HELPER(decltype(::FunctionName)*, FunctionName, DLL) \
+
+#define ENSURE_FUNCTION_PTR_(FunctionName, DLL) \
+ ENSURE_FUNCTION_PTR_HELPER(FunctionName##Ptr_t, FunctionName, DLL) \
+
+#define DECL_FUNCTION_PTR(FunctionName, ...) \
+ typedef HRESULT (STDMETHODCALLTYPE * FunctionName##Ptr_t)(__VA_ARGS__)
+
+HRESULT
+MFStartup()
+{
+ if (!IsVistaOrLater() || IsWin7AndPre2000Compatible()) {
+ // *Only* use WMF on Vista and later, as if Firefox is run in Windows 95
+ // compatibility mode on Windows 7 (it does happen!) we may crash trying
+ // to startup WMF. So we need to detect the OS version here, as in
+ // compatibility mode IsVistaOrLater() and friends behave as if we're on
+ // the emulated version of Windows. See bug 1279171.
+ // Using GetVersionEx API which takes compatibility mode into account.
+ return E_FAIL;
+ }
+
+ HRESULT hr = LoadDLLs();
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ const int MF_VISTA_VERSION = (0x0001 << 16 | MF_API_VERSION);
+ const int MF_WIN7_VERSION = (0x0002 << 16 | MF_API_VERSION);
+
+ // decltype is unusable for functions having default parameters
+ DECL_FUNCTION_PTR(MFStartup, ULONG, DWORD);
+ ENSURE_FUNCTION_PTR_(MFStartup, Mfplat.dll)
+ if (!IsWin7OrLater())
+ return MFStartupPtr(MF_VISTA_VERSION, MFSTARTUP_FULL);
+ else
+ return MFStartupPtr(MF_WIN7_VERSION, MFSTARTUP_FULL);
+}
+
+HRESULT
+MFShutdown()
+{
+ ENSURE_FUNCTION_PTR(MFShutdown, Mfplat.dll)
+ return (MFShutdownPtr)();
+}
+
+HRESULT
+MFCreateMediaType(IMFMediaType **aOutMFType)
+{
+ ENSURE_FUNCTION_PTR(MFCreateMediaType, Mfplat.dll)
+ return (MFCreateMediaTypePtr)(aOutMFType);
+}
+
+
+HRESULT
+MFGetStrideForBitmapInfoHeader(DWORD aFormat,
+ DWORD aWidth,
+ LONG *aOutStride)
+{
+ ENSURE_FUNCTION_PTR(MFGetStrideForBitmapInfoHeader, evr.dll)
+ return (MFGetStrideForBitmapInfoHeaderPtr)(aFormat, aWidth, aOutStride);
+}
+
+HRESULT MFGetService(IUnknown *punkObject,
+ REFGUID guidService,
+ REFIID riid,
+ LPVOID *ppvObject)
+{
+ ENSURE_FUNCTION_PTR(MFGetService, mf.dll)
+ return (MFGetServicePtr)(punkObject, guidService, riid, ppvObject);
+}
+
+HRESULT
+DXVA2CreateDirect3DDeviceManager9(UINT *pResetToken,
+ IDirect3DDeviceManager9 **ppDXVAManager)
+{
+ ENSURE_FUNCTION_PTR(DXVA2CreateDirect3DDeviceManager9, dxva2.dll)
+ return (DXVA2CreateDirect3DDeviceManager9Ptr)(pResetToken, ppDXVAManager);
+}
+
+HRESULT
+MFCreateSample(IMFSample **ppIMFSample)
+{
+ ENSURE_FUNCTION_PTR(MFCreateSample, mfplat.dll)
+ return (MFCreateSamplePtr)(ppIMFSample);
+}
+
+HRESULT
+MFCreateAlignedMemoryBuffer(DWORD cbMaxLength,
+ DWORD fAlignmentFlags,
+ IMFMediaBuffer **ppBuffer)
+{
+ ENSURE_FUNCTION_PTR(MFCreateAlignedMemoryBuffer, mfplat.dll)
+ return (MFCreateAlignedMemoryBufferPtr)(cbMaxLength, fAlignmentFlags, ppBuffer);
+}
+
+HRESULT
+MFCreateDXGIDeviceManager(UINT *pResetToken, IMFDXGIDeviceManager **ppDXVAManager)
+{
+ ENSURE_FUNCTION_PTR(MFCreateDXGIDeviceManager, mfplat.dll)
+ return (MFCreateDXGIDeviceManagerPtr)(pResetToken, ppDXVAManager);
+}
+
+HRESULT
+MFCreateDXGISurfaceBuffer(REFIID riid,
+ IUnknown *punkSurface,
+ UINT uSubresourceIndex,
+ BOOL fButtomUpWhenLinear,
+ IMFMediaBuffer **ppBuffer)
+{
+ ENSURE_FUNCTION_PTR(MFCreateDXGISurfaceBuffer, mfplat.dll)
+ return (MFCreateDXGISurfaceBufferPtr)(riid, punkSurface, uSubresourceIndex, fButtomUpWhenLinear, ppBuffer);
+}
+
+} // end namespace wmf
+} // end namespace mozilla
diff --git a/dom/media/platforms/wmf/WMFUtils.h b/dom/media/platforms/wmf/WMFUtils.h
new file mode 100644
index 000000000..ac8779774
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFUtils.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WMFUtils_h
+#define WMFUtils_h
+
+#include "WMF.h"
+#include "nsString.h"
+#include "nsRect.h"
+#include "TimeUnits.h"
+#include "VideoUtils.h"
+
+// Various utilities shared by WMF backend files.
+
+namespace mozilla {
+
+// Converts from microseconds to hundreds of nanoseconds.
+// We use microseconds for our timestamps, whereas WMF uses
+// hundreds of nanoseconds.
+inline int64_t
+UsecsToHNs(int64_t aUsecs) {
+ return aUsecs * 10;
+}
+
+// Converts from hundreds of nanoseconds to microseconds.
+// We use microseconds for our timestamps, whereas WMF uses
+// hundreds of nanoseconds.
+inline int64_t
+HNsToUsecs(int64_t hNanoSecs) {
+ return hNanoSecs / 10;
+}
+
+HRESULT
+HNsToFrames(int64_t aHNs, uint32_t aRate, int64_t* aOutFrames);
+
+HRESULT
+GetDefaultStride(IMFMediaType *aType, uint32_t aWidth, uint32_t* aOutStride);
+
+int32_t
+MFOffsetToInt32(const MFOffset& aOffset);
+
+// Gets the sub-region of the video frame that should be displayed.
+// See: http://msdn.microsoft.com/en-us/library/windows/desktop/bb530115(v=vs.85).aspx
+HRESULT
+GetPictureRegion(IMFMediaType* aMediaType, nsIntRect& aOutPictureRegion);
+
+// Returns the duration of a IMFSample in TimeUnit.
+// Returns media::TimeUnit::Invalid() on failure.
+media::TimeUnit
+GetSampleDuration(IMFSample* aSample);
+
+// Returns the presentation time of a IMFSample in TimeUnit.
+// Returns media::TimeUnit::Invalid() on failure.
+media::TimeUnit
+GetSampleTime(IMFSample* aSample);
+
+inline bool
+IsFlagSet(DWORD flags, DWORD pattern) {
+ return (flags & pattern) == pattern;
+}
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
new file mode 100644
index 000000000..291bc5b74
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
@@ -0,0 +1,1016 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <algorithm>
+#include <winsdkver.h>
+#include <psapi.h>
+#include "WMFVideoMFTManager.h"
+#include "MediaDecoderReader.h"
+#include "gfxPrefs.h"
+#include "WMFUtils.h"
+#include "ImageContainer.h"
+#include "VideoUtils.h"
+#include "DXVA2Manager.h"
+#include "nsThreadUtils.h"
+#include "Layers.h"
+#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/layers/LayersTypes.h"
+#include "MediaInfo.h"
+#include "mozilla/Logging.h"
+#include "nsWindowsHelpers.h"
+#include "gfx2DGlue.h"
+#include "gfxWindowsPlatform.h"
+#include "IMFYCbCrImage.h"
+#include "mozilla/WindowsVersion.h"
+#include "mozilla/Telemetry.h"
+#include "nsPrintfCString.h"
+#include "MediaTelemetryConstants.h"
+#include "GMPUtils.h" // For SplitAt. TODO: Move SplitAt to a central place.
+#include "MP4Decoder.h"
+#include "VPXDecoder.h"
+#include "mozilla/SyncRunnable.h"
+
+#define LOG(...) MOZ_LOG(sPDMLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+using mozilla::layers::Image;
+using mozilla::layers::IMFYCbCrImage;
+using mozilla::layers::LayerManager;
+using mozilla::layers::LayersBackend;
+
+#if WINVER_MAXVER < 0x0A00
+// Windows 10+ SDK has VP80 and VP90 defines
+const GUID MFVideoFormat_VP80 =
+{
+ 0x30385056,
+ 0x0000,
+ 0x0010,
+ {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+};
+
+const GUID MFVideoFormat_VP90 =
+{
+ 0x30395056,
+ 0x0000,
+ 0x0010,
+ {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+};
+#endif
+
+const CLSID CLSID_WebmMfVpxDec =
+{
+ 0xe3aaf548,
+ 0xc9a4,
+ 0x4c6e,
+ { 0x23, 0x4d, 0x5a, 0xda, 0x37, 0x4b, 0x00, 0x00 }
+};
+
+namespace mozilla {
+
+LayersBackend
+GetCompositorBackendType(layers::KnowsCompositor* aKnowsCompositor)
+{
+ if (aKnowsCompositor) {
+ return aKnowsCompositor->GetCompositorBackendType();
+ }
+ return LayersBackend::LAYERS_NONE;
+}
+
+WMFVideoMFTManager::WMFVideoMFTManager(
+ const VideoInfo& aConfig,
+ layers::KnowsCompositor* aKnowsCompositor,
+ layers::ImageContainer* aImageContainer,
+ bool aDXVAEnabled)
+ : mVideoInfo(aConfig)
+ , mVideoStride(0)
+ , mImageSize(aConfig.mImage)
+ , mImageContainer(aImageContainer)
+ , mDXVAEnabled(aDXVAEnabled)
+ , mKnowsCompositor(aKnowsCompositor)
+ , mNullOutputCount(0)
+ , mGotValidOutputAfterNullOutput(false)
+ , mGotExcessiveNullOutput(false)
+ , mIsValid(true)
+ // mVideoStride, mVideoWidth, mVideoHeight, mUseHwAccel are initialized in
+ // Init().
+{
+ MOZ_COUNT_CTOR(WMFVideoMFTManager);
+
+ // Need additional checks/params to check vp8/vp9
+ if (MP4Decoder::IsH264(aConfig.mMimeType)) {
+ mStreamType = H264;
+ } else if (VPXDecoder::IsVP8(aConfig.mMimeType)) {
+ mStreamType = VP8;
+ } else if (VPXDecoder::IsVP9(aConfig.mMimeType)) {
+ mStreamType = VP9;
+ } else {
+ mStreamType = Unknown;
+ }
+}
+
+WMFVideoMFTManager::~WMFVideoMFTManager()
+{
+ MOZ_COUNT_DTOR(WMFVideoMFTManager);
+ // Ensure DXVA/D3D9 related objects are released on the main thread.
+ if (mDXVA2Manager) {
+ DeleteOnMainThread(mDXVA2Manager);
+ }
+
+ // Record whether the video decoder successfully decoded, or output null
+ // samples but did/didn't recover.
+ uint32_t telemetry = (mNullOutputCount == 0) ? 0 :
+ (mGotValidOutputAfterNullOutput && mGotExcessiveNullOutput) ? 1 :
+ mGotExcessiveNullOutput ? 2 :
+ mGotValidOutputAfterNullOutput ? 3 :
+ 4;
+
+ nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([=]() -> void {
+ LOG(nsPrintfCString("Reporting telemetry VIDEO_MFT_OUTPUT_NULL_SAMPLES=%d", telemetry).get());
+ Telemetry::Accumulate(Telemetry::ID::VIDEO_MFT_OUTPUT_NULL_SAMPLES, telemetry);
+ });
+ AbstractThread::MainThread()->Dispatch(task.forget());
+}
+
+const GUID&
+WMFVideoMFTManager::GetMFTGUID()
+{
+ MOZ_ASSERT(mStreamType != Unknown);
+ switch (mStreamType) {
+ case H264: return CLSID_CMSH264DecoderMFT;
+ case VP8: return CLSID_WebmMfVpxDec;
+ case VP9: return CLSID_WebmMfVpxDec;
+ default: return GUID_NULL;
+ };
+}
+
+const GUID&
+WMFVideoMFTManager::GetMediaSubtypeGUID()
+{
+ MOZ_ASSERT(mStreamType != Unknown);
+ switch (mStreamType) {
+ case H264: return MFVideoFormat_H264;
+ case VP8: return MFVideoFormat_VP80;
+ case VP9: return MFVideoFormat_VP90;
+ default: return GUID_NULL;
+ };
+}
+
+struct D3DDLLBlacklistingCache
+{
+ // Blacklist pref value last seen.
+ nsCString mBlacklistPref;
+ // Non-empty if a blacklisted DLL was found.
+ nsCString mBlacklistedDLL;
+};
+StaticAutoPtr<D3DDLLBlacklistingCache> sD3D11BlacklistingCache;
+StaticAutoPtr<D3DDLLBlacklistingCache> sD3D9BlacklistingCache;
+
+// If a blacklisted DLL is found, return its information, otherwise "".
+static const nsCString&
+FindDXVABlacklistedDLL(StaticAutoPtr<D3DDLLBlacklistingCache>& aDLLBlacklistingCache,
+ const nsCString& aBlacklist,
+ const char* aDLLBlacklistPrefName)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Must be on main thread.");
+
+ if (!aDLLBlacklistingCache) {
+ // First time here, create persistent data that will be reused in all
+ // D3D11-blacklisting checks.
+ aDLLBlacklistingCache = new D3DDLLBlacklistingCache();
+ ClearOnShutdown(&aDLLBlacklistingCache);
+ }
+
+ if (aBlacklist.IsEmpty()) {
+ // Empty blacklist -> No blacklisting.
+ aDLLBlacklistingCache->mBlacklistPref.SetLength(0);
+ aDLLBlacklistingCache->mBlacklistedDLL.SetLength(0);
+ return aDLLBlacklistingCache->mBlacklistedDLL;
+ }
+
+ // Detect changes in pref.
+ if (aDLLBlacklistingCache->mBlacklistPref.Equals(aBlacklist)) {
+ // Same blacklist -> Return same result (i.e., don't check DLLs again).
+ return aDLLBlacklistingCache->mBlacklistedDLL;
+ }
+ // Adopt new pref now, so we don't work on it again.
+ aDLLBlacklistingCache->mBlacklistPref = aBlacklist;
+
+ HANDLE hProcess = GetCurrentProcess();
+ mozilla::UniquePtr<HMODULE[]> hMods;
+ unsigned int modulesNum = 0;
+ if (hProcess != NULL) {
+ DWORD modulesSize;
+ EnumProcessModules(hProcess, nullptr, 0, &modulesSize);
+ modulesNum = modulesSize / sizeof(HMODULE);
+ hMods = mozilla::MakeUnique<HMODULE[]>(modulesNum);
+ EnumProcessModules(hProcess, hMods.get(), modulesNum * sizeof(HMODULE), &modulesSize);
+ }
+
+ // media.wmf.disable-d3d*-for-dlls format: (whitespace is trimmed)
+ // "dll1.dll: 1.2.3.4[, more versions...][; more dlls...]"
+ nsTArray<nsCString> dlls;
+ SplitAt(";", aBlacklist, dlls);
+ for (const auto& dll : dlls) {
+ nsTArray<nsCString> nameAndVersions;
+ SplitAt(":", dll, nameAndVersions);
+ if (nameAndVersions.Length() != 2) {
+ NS_WARNING(nsPrintfCString("Skipping incorrect '%s' dll:versions format",
+ aDLLBlacklistPrefName).get());
+ continue;
+ }
+
+ nameAndVersions[0].CompressWhitespace();
+ NS_ConvertUTF8toUTF16 name(nameAndVersions[0]);
+
+ for (unsigned int i = 0; i <= modulesNum; i++) {
+ WCHAR dllPath[MAX_PATH + 1];
+
+ if (i < modulesNum) {
+ if (!GetModuleFileNameEx(hProcess, hMods[i], dllPath, sizeof(dllPath) / sizeof(WCHAR))) {
+ continue;
+ }
+
+ nsCOMPtr<nsIFile> file;
+ if (NS_WARN_IF(NS_FAILED(NS_NewLocalFile(nsDependentString(dllPath), false, getter_AddRefs(file))))) {
+ continue;
+ }
+
+ nsAutoString leafName;
+ if (NS_WARN_IF(NS_FAILED(file->GetLeafName(leafName)))) {
+ continue;
+ }
+
+ if (_wcsicmp(leafName.get(), name.get())) {
+ continue;
+ }
+ } else {
+ if (!ConstructSystem32Path(name.get(), dllPath, MAX_PATH + 1)) {
+ // Cannot build path -> Assume it's not the blacklisted DLL.
+ continue;
+ }
+ }
+
+ DWORD zero;
+ DWORD infoSize = GetFileVersionInfoSizeW(dllPath, &zero);
+ if (infoSize == 0) {
+ // Can't get file info -> Assume we don't have the blacklisted DLL.
+ continue;
+ }
+ // vInfo is a pointer into infoData, that's why we keep it outside of the loop.
+ auto infoData = MakeUnique<unsigned char[]>(infoSize);
+ VS_FIXEDFILEINFO *vInfo;
+ UINT vInfoLen;
+ if (!GetFileVersionInfoW(dllPath, 0, infoSize, infoData.get())
+ || !VerQueryValueW(infoData.get(), L"\\", (LPVOID*)&vInfo, &vInfoLen)
+ || !vInfo) {
+ // Can't find version -> Assume it's not blacklisted.
+ continue;
+ }
+
+ nsTArray<nsCString> versions;
+ SplitAt(",", nameAndVersions[1], versions);
+ for (const auto& version : versions) {
+ nsTArray<nsCString> numberStrings;
+ SplitAt(".", version, numberStrings);
+ if (numberStrings.Length() != 4) {
+ NS_WARNING(nsPrintfCString("Skipping incorrect '%s' a.b.c.d version format",
+ aDLLBlacklistPrefName).get());
+ continue;
+ }
+ DWORD numbers[4];
+ nsresult errorCode = NS_OK;
+ for (int i = 0; i < 4; ++i) {
+ numberStrings[i].CompressWhitespace();
+ numbers[i] = DWORD(numberStrings[i].ToInteger(&errorCode));
+ if (NS_FAILED(errorCode)) {
+ break;
+ }
+ if (numbers[i] > UINT16_MAX) {
+ errorCode = NS_ERROR_FAILURE;
+ break;
+ }
+ }
+
+ if (NS_FAILED(errorCode)) {
+ NS_WARNING(nsPrintfCString("Skipping incorrect '%s' a.b.c.d version format",
+ aDLLBlacklistPrefName).get());
+ continue;
+ }
+
+ if (vInfo->dwFileVersionMS == ((numbers[0] << 16) | numbers[1])
+ && vInfo->dwFileVersionLS == ((numbers[2] << 16) | numbers[3])) {
+ // Blacklisted! Record bad DLL.
+ aDLLBlacklistingCache->mBlacklistedDLL.SetLength(0);
+ aDLLBlacklistingCache->mBlacklistedDLL.AppendPrintf(
+ "%s (%lu.%lu.%lu.%lu)",
+ nameAndVersions[0].get(), numbers[0], numbers[1], numbers[2], numbers[3]);
+ return aDLLBlacklistingCache->mBlacklistedDLL;
+ }
+ }
+ }
+ }
+
+ // No blacklisted DLL.
+ aDLLBlacklistingCache->mBlacklistedDLL.SetLength(0);
+ return aDLLBlacklistingCache->mBlacklistedDLL;
+}
+
+static const nsCString&
+FindD3D11BlacklistedDLL() {
+ return FindDXVABlacklistedDLL(sD3D11BlacklistingCache,
+ gfx::gfxVars::PDMWMFDisableD3D11Dlls(),
+ "media.wmf.disable-d3d11-for-dlls");
+}
+
+static const nsCString&
+FindD3D9BlacklistedDLL() {
+ return FindDXVABlacklistedDLL(sD3D9BlacklistingCache,
+ gfx::gfxVars::PDMWMFDisableD3D9Dlls(),
+ "media.wmf.disable-d3d9-for-dlls");
+}
+
+class CreateDXVAManagerEvent : public Runnable {
+public:
+ CreateDXVAManagerEvent(LayersBackend aBackend,
+ layers::KnowsCompositor* aKnowsCompositor,
+ nsCString& aFailureReason)
+ : mBackend(aBackend)
+ , mKnowsCompositor(aKnowsCompositor)
+ , mFailureReason(aFailureReason)
+ {}
+
+ NS_IMETHOD Run() override {
+ NS_ASSERTION(NS_IsMainThread(), "Must be on main thread.");
+ nsACString* failureReason = &mFailureReason;
+ nsCString secondFailureReason;
+ if (mBackend == LayersBackend::LAYERS_D3D11 &&
+ gfxPrefs::PDMWMFAllowD3D11() && IsWin8OrLater()) {
+ const nsCString& blacklistedDLL = FindD3D11BlacklistedDLL();
+ if (!blacklistedDLL.IsEmpty()) {
+ failureReason->AppendPrintf("D3D11 blacklisted with DLL %s",
+ blacklistedDLL.get());
+ } else {
+ mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(mKnowsCompositor, *failureReason);
+ if (mDXVA2Manager) {
+ return NS_OK;
+ }
+ }
+ // Try again with d3d9, but record the failure reason
+ // into a new var to avoid overwriting the d3d11 failure.
+ failureReason = &secondFailureReason;
+ mFailureReason.Append(NS_LITERAL_CSTRING("; "));
+ }
+
+ const nsCString& blacklistedDLL = FindD3D9BlacklistedDLL();
+ if (!blacklistedDLL.IsEmpty()) {
+ mFailureReason.AppendPrintf("D3D9 blacklisted with DLL %s",
+ blacklistedDLL.get());
+ } else {
+ mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(mKnowsCompositor, *failureReason);
+ // Make sure we include the messages from both attempts (if applicable).
+ mFailureReason.Append(secondFailureReason);
+ }
+ return NS_OK;
+ }
+ nsAutoPtr<DXVA2Manager> mDXVA2Manager;
+ layers::LayersBackend mBackend;
+ KnowsCompositor* mKnowsCompositor;
+ nsACString& mFailureReason;
+};
+
+bool
+WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9)
+{
+ // If we use DXVA but aren't running with a D3D layer manager then the
+ // readback of decoded video frames from GPU to CPU memory grinds painting
+ // to a halt, and makes playback performance *worse*.
+ if (!mDXVAEnabled) {
+ mDXVAFailureReason.AssignLiteral("Hardware video decoding disabled or blacklisted");
+ return false;
+ }
+ MOZ_ASSERT(!mDXVA2Manager);
+ LayersBackend backend = GetCompositorBackendType(mKnowsCompositor);
+ if (backend != LayersBackend::LAYERS_D3D9 &&
+ backend != LayersBackend::LAYERS_D3D11) {
+ mDXVAFailureReason.AssignLiteral("Unsupported layers backend");
+ return false;
+ }
+
+ // The DXVA manager must be created on the main thread.
+ RefPtr<CreateDXVAManagerEvent> event =
+ new CreateDXVAManagerEvent(aForceD3D9 ? LayersBackend::LAYERS_D3D9
+ : backend,
+ mKnowsCompositor,
+ mDXVAFailureReason);
+
+ if (NS_IsMainThread()) {
+ event->Run();
+ } else {
+ // This logic needs to run on the main thread
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ mozilla::SyncRunnable::DispatchToThread(mainThread, event);
+ }
+ mDXVA2Manager = event->mDXVA2Manager;
+
+ return mDXVA2Manager != nullptr;
+}
+
+bool
+WMFVideoMFTManager::ValidateVideoInfo()
+{
+ // The WMF H.264 decoder is documented to have a minimum resolution
+ // 48x48 pixels. We've observed the decoder working for output smaller than
+ // that, but on some output it hangs in IMFTransform::ProcessOutput(), so
+ // we just reject streams which are less than the documented minimum.
+ // https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815(v=vs.85).aspx
+ static const int32_t MIN_H264_FRAME_DIMENSION = 48;
+ if (mStreamType == H264 &&
+ (mVideoInfo.mImage.width < MIN_H264_FRAME_DIMENSION ||
+ mVideoInfo.mImage.height < MIN_H264_FRAME_DIMENSION)) {
+ LogToBrowserConsole(NS_LITERAL_STRING(
+ "Can't decode H.264 stream with width or height less than 48 pixels."));
+ mIsValid = false;
+ }
+
+ return mIsValid;
+}
+
+bool
+WMFVideoMFTManager::Init()
+{
+ if (!ValidateVideoInfo()) {
+ return false;
+ }
+
+ bool success = InitInternal(/* aForceD3D9 = */ false);
+
+ if (success && mDXVA2Manager) {
+ // If we had some failures but eventually made it work,
+ // make sure we preserve the messages.
+ if (mDXVA2Manager->IsD3D11()) {
+ mDXVAFailureReason.Append(NS_LITERAL_CSTRING("Using D3D11 API"));
+ } else {
+ mDXVAFailureReason.Append(NS_LITERAL_CSTRING("Using D3D9 API"));
+ }
+ }
+
+ return success;
+}
+
+bool
+WMFVideoMFTManager::InitInternal(bool aForceD3D9)
+{
+ mUseHwAccel = false; // default value; changed if D3D setup succeeds.
+ bool useDxva = InitializeDXVA(aForceD3D9);
+
+ RefPtr<MFTDecoder> decoder(new MFTDecoder());
+
+ HRESULT hr = decoder->Create(GetMFTGUID());
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ RefPtr<IMFAttributes> attr(decoder->GetAttributes());
+ UINT32 aware = 0;
+ if (attr) {
+ attr->GetUINT32(MF_SA_D3D_AWARE, &aware);
+ attr->SetUINT32(CODECAPI_AVDecNumWorkerThreads,
+ WMFDecoderModule::GetNumDecoderThreads());
+ if (gfxPrefs::PDMWMFLowLatencyEnabled()) {
+ hr = attr->SetUINT32(CODECAPI_AVLowLatencyMode, TRUE);
+ if (SUCCEEDED(hr)) {
+ LOG("Enabling Low Latency Mode");
+ } else {
+ LOG("Couldn't enable Low Latency Mode");
+ }
+ }
+ }
+
+ if (useDxva) {
+ if (aware) {
+ // TODO: Test if I need this anywhere... Maybe on Vista?
+ //hr = attr->SetUINT32(CODECAPI_AVDecVideoAcceleration_H264, TRUE);
+ //NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ MOZ_ASSERT(mDXVA2Manager);
+ ULONG_PTR manager = ULONG_PTR(mDXVA2Manager->GetDXVADeviceManager());
+ hr = decoder->SendMFTMessage(MFT_MESSAGE_SET_D3D_MANAGER, manager);
+ if (SUCCEEDED(hr)) {
+ mUseHwAccel = true;
+ } else {
+ DeleteOnMainThread(mDXVA2Manager);
+ mDXVAFailureReason = nsPrintfCString("MFT_MESSAGE_SET_D3D_MANAGER failed with code %X", hr);
+ }
+ }
+ else {
+ mDXVAFailureReason.AssignLiteral("Decoder returned false for MF_SA_D3D_AWARE");
+ }
+ }
+
+ if (!mUseHwAccel) {
+ // Use VP8/9 MFT only if HW acceleration is available
+ if (mStreamType == VP9 || mStreamType == VP8) {
+ return false;
+ }
+ Telemetry::Accumulate(Telemetry::MEDIA_DECODER_BACKEND_USED,
+ uint32_t(media::MediaDecoderBackend::WMFSoftware));
+ }
+
+ mDecoder = decoder;
+ hr = SetDecoderMediaTypes();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), false);
+
+ LOG("Video Decoder initialized, Using DXVA: %s", (mUseHwAccel ? "Yes" : "No"));
+
+ return true;
+}
+
+HRESULT
+WMFVideoMFTManager::SetDecoderMediaTypes()
+{
+ // Setup the input/output media types.
+ RefPtr<IMFMediaType> inputType;
+ HRESULT hr = wmf::MFCreateMediaType(getter_AddRefs(inputType));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetGUID(MF_MT_SUBTYPE, GetMediaSubtypeGUID());
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = inputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_MixedInterlaceOrProgressive);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // MSFT MFT needs this frame size set for VP9?
+ if (mStreamType == VP9 || mStreamType == VP8) {
+ hr = inputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = MFSetAttributeSize(inputType, MF_MT_FRAME_SIZE, mVideoInfo.ImageRect().width, mVideoInfo.ImageRect().height);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ }
+
+ RefPtr<IMFMediaType> outputType;
+ hr = wmf::MFCreateMediaType(getter_AddRefs(outputType));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ hr = outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ GUID outputSubType = mUseHwAccel ? MFVideoFormat_NV12 : MFVideoFormat_YV12;
+ hr = outputType->SetGUID(MF_MT_SUBTYPE, outputSubType);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ return mDecoder->SetMediaTypes(inputType, outputType);
+}
+
+HRESULT
+WMFVideoMFTManager::Input(MediaRawData* aSample)
+{
+ if (!mIsValid) {
+ return E_FAIL;
+ }
+
+ if (!mDecoder) {
+ // This can happen during shutdown.
+ return E_FAIL;
+ }
+
+ HRESULT hr = mDecoder->CreateInputSample(aSample->Data(),
+ uint32_t(aSample->Size()),
+ aSample->mTime,
+ &mLastInput);
+ NS_ENSURE_TRUE(SUCCEEDED(hr) && mLastInput != nullptr, hr);
+
+ mLastDuration = aSample->mDuration;
+ mLastTime = aSample->mTime;
+ mSamplesCount++;
+
+ // Forward sample data to the decoder.
+ return mDecoder->Input(mLastInput);
+}
+
+class SupportsConfigEvent : public Runnable {
+public:
+ SupportsConfigEvent(DXVA2Manager* aDXVA2Manager, IMFMediaType* aMediaType, float aFramerate)
+ : mDXVA2Manager(aDXVA2Manager)
+ , mMediaType(aMediaType)
+ , mFramerate(aFramerate)
+ , mSupportsConfig(false)
+ {}
+
+ NS_IMETHOD Run() {
+ MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread.");
+ mSupportsConfig = mDXVA2Manager->SupportsConfig(mMediaType, mFramerate);
+ return NS_OK;
+ }
+ DXVA2Manager* mDXVA2Manager;
+ IMFMediaType* mMediaType;
+ float mFramerate;
+ bool mSupportsConfig;
+};
+
+// The MFTransform we use for decoding h264 video will silently fall
+// back to software decoding (even if we've negotiated DXVA) if the GPU
+// doesn't support decoding the given resolution. It will then upload
+// the software decoded frames into d3d textures to preserve behaviour.
+//
+// Unfortunately this seems to cause corruption (see bug 1193547) and is
+// slow because the upload is done into a non-shareable texture and requires
+// us to copy it.
+//
+// This code tests if the given resolution can be supported directly on the GPU,
+// and makes sure we only ask the MFT for DXVA if it can be supported properly.
+//
+// Ideally we'd know the framerate during initialization and would also ensure
+// that new decoders are created if the resolution changes. Then we could move
+// this check into Init and consolidate the main thread blocking code.
+bool
+WMFVideoMFTManager::CanUseDXVA(IMFMediaType* aType)
+{
+ MOZ_ASSERT(mDXVA2Manager);
+ // SupportsConfig only checks for valid h264 decoders currently.
+ if (mStreamType != H264) {
+ return true;
+ }
+
+ // Assume the current samples duration is representative for the
+ // entire video.
+ float framerate = 1000000.0 / mLastDuration;
+
+ // The supports config check must be done on the main thread since we have
+ // a crash guard protecting it.
+ RefPtr<SupportsConfigEvent> event =
+ new SupportsConfigEvent(mDXVA2Manager, aType, framerate);
+
+ if (NS_IsMainThread()) {
+ event->Run();
+ } else {
+ // This logic needs to run on the main thread
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ mozilla::SyncRunnable::DispatchToThread(mainThread, event);
+ }
+
+ return event->mSupportsConfig;
+}
+
+HRESULT
+WMFVideoMFTManager::ConfigureVideoFrameGeometry()
+{
+ RefPtr<IMFMediaType> mediaType;
+ HRESULT hr = mDecoder->GetOutputMediaType(mediaType);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // If we enabled/disabled DXVA in response to a resolution
+ // change then we need to renegotiate our media types,
+ // and resubmit our previous frame (since the MFT appears
+ // to lose it otherwise).
+ if (mUseHwAccel && !CanUseDXVA(mediaType)) {
+ mDXVAEnabled = false;
+ if (!Init()) {
+ return E_FAIL;
+ }
+
+ mDecoder->Input(mLastInput);
+ return S_OK;
+ }
+
+ // Verify that the video subtype is what we expect it to be.
+ // When using hardware acceleration/DXVA2 the video format should
+ // be NV12, which is DXVA2's preferred format. For software decoding
+ // we use YV12, as that's easier for us to stick into our rendering
+ // pipeline than NV12. NV12 has interleaved UV samples, whereas YV12
+ // is a planar format.
+ GUID videoFormat;
+ hr = mediaType->GetGUID(MF_MT_SUBTYPE, &videoFormat);
+ NS_ENSURE_TRUE(videoFormat == MFVideoFormat_NV12 || !mUseHwAccel, E_FAIL);
+ NS_ENSURE_TRUE(videoFormat == MFVideoFormat_YV12 || mUseHwAccel, E_FAIL);
+
+ nsIntRect pictureRegion;
+ hr = GetPictureRegion(mediaType, pictureRegion);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ UINT32 width = pictureRegion.width;
+ UINT32 height = pictureRegion.height;
+ mImageSize = nsIntSize(width, height);
+ // Calculate and validate the picture region and frame dimensions after
+ // scaling by the pixel aspect ratio.
+ pictureRegion = mVideoInfo.ScaledImageRect(width, height);
+ if (!IsValidVideoRegion(mImageSize, pictureRegion, mVideoInfo.mDisplay)) {
+ // Video track's frame sizes will overflow. Ignore the video track.
+ return E_FAIL;
+ }
+
+ if (mDXVA2Manager) {
+ hr = mDXVA2Manager->ConfigureForSize(width, height);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ }
+
+ // Success! Save state.
+ GetDefaultStride(mediaType, width, &mVideoStride);
+
+ LOG("WMFVideoMFTManager frame geometry frame=(%u,%u) stride=%u picture=(%d, %d, %d, %d) display=(%d,%d)",
+ width, height,
+ mVideoStride,
+ pictureRegion.x, pictureRegion.y, pictureRegion.width, pictureRegion.height,
+ mVideoInfo.mDisplay.width, mVideoInfo.mDisplay.height);
+
+ return S_OK;
+}
+
+HRESULT
+WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample,
+ int64_t aStreamOffset,
+ VideoData** aOutVideoData)
+{
+ NS_ENSURE_TRUE(aSample, E_POINTER);
+ NS_ENSURE_TRUE(aOutVideoData, E_POINTER);
+
+ *aOutVideoData = nullptr;
+
+ HRESULT hr;
+ RefPtr<IMFMediaBuffer> buffer;
+
+ // Must convert to contiguous buffer to use IMD2DBuffer interface.
+ hr = aSample->ConvertToContiguousBuffer(getter_AddRefs(buffer));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+
+ // Try and use the IMF2DBuffer interface if available, otherwise fallback
+ // to the IMFMediaBuffer interface. Apparently IMF2DBuffer is more efficient,
+ // but only some systems (Windows 8?) support it.
+ BYTE* data = nullptr;
+ LONG stride = 0;
+ RefPtr<IMF2DBuffer> twoDBuffer;
+ hr = buffer->QueryInterface(static_cast<IMF2DBuffer**>(getter_AddRefs(twoDBuffer)));
+ if (SUCCEEDED(hr)) {
+ hr = twoDBuffer->Lock2D(&data, &stride);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ } else {
+ hr = buffer->Lock(&data, nullptr, nullptr);
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ stride = mVideoStride;
+ }
+
+ // YV12, planar format: [YYYY....][VVVV....][UUUU....]
+ // i.e., Y, then V, then U.
+ VideoData::YCbCrBuffer b;
+
+ uint32_t videoWidth = mImageSize.width;
+ uint32_t videoHeight = mImageSize.height;
+
+ // Y (Y') plane
+ b.mPlanes[0].mData = data;
+ b.mPlanes[0].mStride = stride;
+ b.mPlanes[0].mHeight = videoHeight;
+ b.mPlanes[0].mWidth = videoWidth;
+ b.mPlanes[0].mOffset = 0;
+ b.mPlanes[0].mSkip = 0;
+
+ // The V and U planes are stored 16-row-aligned, so we need to add padding
+ // to the row heights to ensure the Y'CbCr planes are referenced properly.
+ uint32_t padding = 0;
+ if (videoHeight % 16 != 0) {
+ padding = 16 - (videoHeight % 16);
+ }
+ uint32_t y_size = stride * (videoHeight + padding);
+ uint32_t v_size = stride * (videoHeight + padding) / 4;
+ uint32_t halfStride = (stride + 1) / 2;
+ uint32_t halfHeight = (videoHeight + 1) / 2;
+ uint32_t halfWidth = (videoWidth + 1) / 2;
+
+ // U plane (Cb)
+ b.mPlanes[1].mData = data + y_size + v_size;
+ b.mPlanes[1].mStride = halfStride;
+ b.mPlanes[1].mHeight = halfHeight;
+ b.mPlanes[1].mWidth = halfWidth;
+ b.mPlanes[1].mOffset = 0;
+ b.mPlanes[1].mSkip = 0;
+
+ // V plane (Cr)
+ b.mPlanes[2].mData = data + y_size;
+ b.mPlanes[2].mStride = halfStride;
+ b.mPlanes[2].mHeight = halfHeight;
+ b.mPlanes[2].mWidth = halfWidth;
+ b.mPlanes[2].mOffset = 0;
+ b.mPlanes[2].mSkip = 0;
+
+ media::TimeUnit pts = GetSampleTime(aSample);
+ NS_ENSURE_TRUE(pts.IsValid(), E_FAIL);
+ media::TimeUnit duration = GetSampleDuration(aSample);
+ NS_ENSURE_TRUE(duration.IsValid(), E_FAIL);
+ nsIntRect pictureRegion = mVideoInfo.ScaledImageRect(videoWidth, videoHeight);
+
+ LayersBackend backend = GetCompositorBackendType(mKnowsCompositor);
+ if (backend != LayersBackend::LAYERS_D3D9 &&
+ backend != LayersBackend::LAYERS_D3D11) {
+ RefPtr<VideoData> v =
+ VideoData::CreateAndCopyData(mVideoInfo,
+ mImageContainer,
+ aStreamOffset,
+ pts.ToMicroseconds(),
+ duration.ToMicroseconds(),
+ b,
+ false,
+ -1,
+ pictureRegion);
+ if (twoDBuffer) {
+ twoDBuffer->Unlock2D();
+ } else {
+ buffer->Unlock();
+ }
+ v.forget(aOutVideoData);
+ return S_OK;
+ }
+
+ RefPtr<layers::PlanarYCbCrImage> image =
+ new IMFYCbCrImage(buffer, twoDBuffer);
+
+ VideoData::SetVideoDataToImage(image,
+ mVideoInfo,
+ b,
+ pictureRegion,
+ false);
+
+ RefPtr<VideoData> v =
+ VideoData::CreateFromImage(mVideoInfo,
+ aStreamOffset,
+ pts.ToMicroseconds(),
+ duration.ToMicroseconds(),
+ image.forget(),
+ false,
+ -1,
+ pictureRegion);
+
+ v.forget(aOutVideoData);
+ return S_OK;
+}
+
+HRESULT
+WMFVideoMFTManager::CreateD3DVideoFrame(IMFSample* aSample,
+ int64_t aStreamOffset,
+ VideoData** aOutVideoData)
+{
+ NS_ENSURE_TRUE(aSample, E_POINTER);
+ NS_ENSURE_TRUE(aOutVideoData, E_POINTER);
+ NS_ENSURE_TRUE(mDXVA2Manager, E_ABORT);
+ NS_ENSURE_TRUE(mUseHwAccel, E_ABORT);
+
+ *aOutVideoData = nullptr;
+ HRESULT hr;
+
+ nsIntRect pictureRegion =
+ mVideoInfo.ScaledImageRect(mImageSize.width, mImageSize.height);
+ RefPtr<Image> image;
+ hr = mDXVA2Manager->CopyToImage(aSample,
+ pictureRegion,
+ getter_AddRefs(image));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ NS_ENSURE_TRUE(image, E_FAIL);
+
+ media::TimeUnit pts = GetSampleTime(aSample);
+ NS_ENSURE_TRUE(pts.IsValid(), E_FAIL);
+ media::TimeUnit duration = GetSampleDuration(aSample);
+ NS_ENSURE_TRUE(duration.IsValid(), E_FAIL);
+ RefPtr<VideoData> v = VideoData::CreateFromImage(mVideoInfo,
+ aStreamOffset,
+ pts.ToMicroseconds(),
+ duration.ToMicroseconds(),
+ image.forget(),
+ false,
+ -1,
+ pictureRegion);
+
+ NS_ENSURE_TRUE(v, E_FAIL);
+ v.forget(aOutVideoData);
+
+ return S_OK;
+}
+
+// Blocks until decoded sample is produced by the deoder.
+HRESULT
+WMFVideoMFTManager::Output(int64_t aStreamOffset,
+ RefPtr<MediaData>& aOutData)
+{
+ RefPtr<IMFSample> sample;
+ HRESULT hr;
+ aOutData = nullptr;
+ int typeChangeCount = 0;
+ bool wasDraining = mDraining;
+ int64_t sampleCount = mSamplesCount;
+ if (wasDraining) {
+ mSamplesCount = 0;
+ mDraining = false;
+ }
+
+ media::TimeUnit pts;
+ media::TimeUnit duration;
+
+ // Loop until we decode a sample, or an unexpected error that we can't
+ // handle occurs.
+ while (true) {
+ hr = mDecoder->Output(&sample);
+ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
+ return MF_E_TRANSFORM_NEED_MORE_INPUT;
+ }
+ if (hr == MF_E_TRANSFORM_STREAM_CHANGE) {
+ // Video stream output type change. Probably a geometric apperature
+ // change. Reconfigure the video geometry, so that we output the
+ // correct size frames.
+ MOZ_ASSERT(!sample);
+ hr = ConfigureVideoFrameGeometry();
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ // Catch infinite loops, but some decoders perform at least 2 stream
+ // changes on consecutive calls, so be permissive.
+ // 100 is arbitrarily > 2.
+ NS_ENSURE_TRUE(typeChangeCount < 100, MF_E_TRANSFORM_STREAM_CHANGE);
+ // Loop back and try decoding again...
+ ++typeChangeCount;
+ continue;
+ }
+ if (SUCCEEDED(hr)) {
+ if (!sample) {
+ LOG("Video MFTDecoder returned success but no output!");
+ // On some machines/input the MFT returns success but doesn't output
+ // a video frame. If we detect this, try again, but only up to a
+ // point; after 250 failures, give up. Note we count all failures
+ // over the life of the decoder, as we may end up exiting with a
+ // NEED_MORE_INPUT and coming back to hit the same error. So just
+ // counting with a local variable (like typeChangeCount does) may
+ // not work in this situation.
+ ++mNullOutputCount;
+ if (mNullOutputCount > 250) {
+ LOG("Excessive Video MFTDecoder returning success but no output; giving up");
+ mGotExcessiveNullOutput = true;
+ return E_FAIL;
+ }
+ continue;
+ }
+ pts = GetSampleTime(sample);
+ duration = GetSampleDuration(sample);
+ if (!pts.IsValid() || !duration.IsValid()) {
+ return E_FAIL;
+ }
+ if (wasDraining && sampleCount == 1 && pts == media::TimeUnit()) {
+ // WMF is unable to calculate a duration if only a single sample
+ // was parsed. Additionally, the pts always comes out at 0 under those
+ // circumstances.
+ // Seeing that we've only fed the decoder a single frame, the pts
+ // and duration are known, it's of the last sample.
+ pts = media::TimeUnit::FromMicroseconds(mLastTime);
+ duration = media::TimeUnit::FromMicroseconds(mLastDuration);
+ }
+ if (mSeekTargetThreshold.isSome()) {
+ if ((pts + duration) < mSeekTargetThreshold.ref()) {
+ LOG("Dropping video frame which pts is smaller than seek target.");
+ // It is necessary to clear the pointer to release the previous output
+ // buffer.
+ sample = nullptr;
+ continue;
+ }
+ mSeekTargetThreshold.reset();
+ }
+ break;
+ }
+ // Else unexpected error, assert, and bail.
+ NS_WARNING("WMFVideoMFTManager::Output() unexpected error");
+ return hr;
+ }
+
+ RefPtr<VideoData> frame;
+ if (mUseHwAccel) {
+ hr = CreateD3DVideoFrame(sample, aStreamOffset, getter_AddRefs(frame));
+ } else {
+ hr = CreateBasicVideoFrame(sample, aStreamOffset, getter_AddRefs(frame));
+ }
+ // Frame should be non null only when we succeeded.
+ MOZ_ASSERT((frame != nullptr) == SUCCEEDED(hr));
+ NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
+ NS_ENSURE_TRUE(frame, E_FAIL);
+
+ aOutData = frame;
+ // Set the potentially corrected pts and duration.
+ aOutData->mTime = pts.ToMicroseconds();
+ aOutData->mDuration = duration.ToMicroseconds();
+
+ if (mNullOutputCount) {
+ mGotValidOutputAfterNullOutput = true;
+ }
+
+ return S_OK;
+}
+
+void
+WMFVideoMFTManager::Shutdown()
+{
+ mDecoder = nullptr;
+ DeleteOnMainThread(mDXVA2Manager);
+}
+
+bool
+WMFVideoMFTManager::IsHardwareAccelerated(nsACString& aFailureReason) const
+{
+ aFailureReason = mDXVAFailureReason;
+ return mDecoder && mUseHwAccel;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.h b/dom/media/platforms/wmf/WMFVideoMFTManager.h
new file mode 100644
index 000000000..b8dfa6336
--- /dev/null
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.h
@@ -0,0 +1,125 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(WMFVideoMFTManager_h_)
+#define WMFVideoMFTManager_h_
+
+#include "WMF.h"
+#include "MFTDecoder.h"
+#include "nsAutoPtr.h"
+#include "nsRect.h"
+#include "WMFMediaDataDecoder.h"
+#include "mozilla/RefPtr.h"
+
+namespace mozilla {
+
+class DXVA2Manager;
+
+class WMFVideoMFTManager : public MFTManager {
+public:
+ WMFVideoMFTManager(const VideoInfo& aConfig,
+ layers::KnowsCompositor* aKnowsCompositor,
+ layers::ImageContainer* aImageContainer,
+ bool aDXVAEnabled);
+ ~WMFVideoMFTManager();
+
+ bool Init();
+
+ HRESULT Input(MediaRawData* aSample) override;
+
+ HRESULT Output(int64_t aStreamOffset, RefPtr<MediaData>& aOutput) override;
+
+ void Shutdown() override;
+
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
+
+ TrackInfo::TrackType GetType() override {
+ return TrackInfo::kVideoTrack;
+ }
+
+ const char* GetDescriptionName() const override
+ {
+ nsCString failureReason;
+ return IsHardwareAccelerated(failureReason)
+ ? "wmf hardware video decoder" : "wmf software video decoder";
+ }
+
+ void Flush() override
+ {
+ MFTManager::Flush();
+ mDraining = false;
+ mSamplesCount = 0;
+ }
+
+ void Drain() override
+ {
+ MFTManager::Drain();
+ mDraining = true;
+ }
+
+private:
+
+ bool ValidateVideoInfo();
+
+ bool InitializeDXVA(bool aForceD3D9);
+
+ bool InitInternal(bool aForceD3D9);
+
+ HRESULT ConfigureVideoFrameGeometry();
+
+ HRESULT CreateBasicVideoFrame(IMFSample* aSample,
+ int64_t aStreamOffset,
+ VideoData** aOutVideoData);
+
+ HRESULT CreateD3DVideoFrame(IMFSample* aSample,
+ int64_t aStreamOffset,
+ VideoData** aOutVideoData);
+
+ HRESULT SetDecoderMediaTypes();
+
+ bool CanUseDXVA(IMFMediaType* aType);
+
+ // Video frame geometry.
+ VideoInfo mVideoInfo;
+ uint32_t mVideoStride;
+ nsIntSize mImageSize;
+
+ RefPtr<layers::ImageContainer> mImageContainer;
+ RefPtr<layers::KnowsCompositor> mKnowsCompositor;
+ nsAutoPtr<DXVA2Manager> mDXVA2Manager;
+
+ RefPtr<IMFSample> mLastInput;
+ float mLastDuration;
+ int64_t mLastTime = 0;
+ bool mDraining = false;
+ int64_t mSamplesCount = 0;
+
+ bool mDXVAEnabled;
+ bool mUseHwAccel;
+
+ nsCString mDXVAFailureReason;
+
+ enum StreamType {
+ Unknown,
+ H264,
+ VP8,
+ VP9
+ };
+
+ StreamType mStreamType;
+
+ const GUID& GetMFTGUID();
+ const GUID& GetMediaSubtypeGUID();
+
+ uint32_t mNullOutputCount;
+ bool mGotValidOutputAfterNullOutput;
+ bool mGotExcessiveNullOutput;
+ bool mIsValid;
+};
+
+} // namespace mozilla
+
+#endif // WMFVideoMFTManager_h_
diff --git a/dom/media/platforms/wmf/moz.build b/dom/media/platforms/wmf/moz.build
new file mode 100644
index 000000000..fa966bea2
--- /dev/null
+++ b/dom/media/platforms/wmf/moz.build
@@ -0,0 +1,34 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'DXVA2Manager.h',
+ 'MFTDecoder.h',
+ 'WMF.h',
+ 'WMFAudioMFTManager.h',
+ 'WMFDecoderModule.h',
+ 'WMFMediaDataDecoder.h',
+ 'WMFUtils.h',
+ 'WMFVideoMFTManager.h',
+]
+UNIFIED_SOURCES += [
+ 'DXVA2Manager.cpp',
+ 'MFTDecoder.cpp',
+ 'WMFAudioMFTManager.cpp',
+ 'WMFDecoderModule.cpp',
+ 'WMFMediaDataDecoder.cpp',
+ 'WMFVideoMFTManager.cpp',
+]
+
+SOURCES += [
+ 'WMFUtils.cpp',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+
+CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
diff --git a/dom/media/platforms/wrappers/FuzzingWrapper.cpp b/dom/media/platforms/wrappers/FuzzingWrapper.cpp
new file mode 100644
index 000000000..7df020f46
--- /dev/null
+++ b/dom/media/platforms/wrappers/FuzzingWrapper.cpp
@@ -0,0 +1,328 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "FuzzingWrapper.h"
+
+mozilla::LogModule* GetFuzzingWrapperLog() {
+ static mozilla::LazyLogModule log("MediaFuzzingWrapper");
+ return log;
+}
+#define DFW_LOGD(arg, ...) MOZ_LOG(GetFuzzingWrapperLog(), mozilla::LogLevel::Debug, ("DecoderFuzzingWrapper(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define DFW_LOGV(arg, ...) MOZ_LOG(GetFuzzingWrapperLog(), mozilla::LogLevel::Verbose, ("DecoderFuzzingWrapper(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define CFW_LOGD(arg, ...) MOZ_LOG(GetFuzzingWrapperLog(), mozilla::LogLevel::Debug, ("DecoderCallbackFuzzingWrapper(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+#define CFW_LOGV(arg, ...) MOZ_LOG(GetFuzzingWrapperLog(), mozilla::LogLevel::Verbose, ("DecoderCallbackFuzzingWrapper(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+DecoderFuzzingWrapper::DecoderFuzzingWrapper(
+ already_AddRefed<MediaDataDecoder> aDecoder,
+ already_AddRefed<DecoderCallbackFuzzingWrapper> aCallbackWrapper)
+ : mDecoder(aDecoder)
+ , mCallbackWrapper(aCallbackWrapper)
+{
+ DFW_LOGV("aDecoder=%p aCallbackWrapper=%p", mDecoder.get(), mCallbackWrapper.get());
+}
+
+DecoderFuzzingWrapper::~DecoderFuzzingWrapper()
+{
+ DFW_LOGV("");
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+DecoderFuzzingWrapper::Init()
+{
+ DFW_LOGV("");
+ MOZ_ASSERT(mDecoder);
+ return mDecoder->Init();
+}
+
+void
+DecoderFuzzingWrapper::Input(MediaRawData* aData)
+{
+ DFW_LOGV("aData.mTime=%lld", aData->mTime);
+ MOZ_ASSERT(mDecoder);
+ mDecoder->Input(aData);
+}
+
+void
+DecoderFuzzingWrapper::Flush()
+{
+ DFW_LOGV("Calling mDecoder[%p]->Flush()", mDecoder.get());
+ MOZ_ASSERT(mDecoder);
+ // Flush may output some frames (though unlikely).
+ // Flush may block a bit, it's ok if we output some frames in the meantime.
+ mDecoder->Flush();
+ DFW_LOGV("mDecoder[%p]->Flush()", mDecoder.get());
+ // Clear any delayed output we may have.
+ mCallbackWrapper->ClearDelayedOutput();
+}
+
+void
+DecoderFuzzingWrapper::Drain()
+{
+ DFW_LOGV("");
+ MOZ_ASSERT(mDecoder);
+ // Note: The decoder should callback DrainComplete(), we'll drain the
+ // delayed output (if any) then.
+ mDecoder->Drain();
+}
+
+void
+DecoderFuzzingWrapper::Shutdown()
+{
+ DFW_LOGV("");
+ MOZ_ASSERT(mDecoder);
+ // Both shutdowns below may block a bit.
+ mDecoder->Shutdown();
+ mCallbackWrapper->Shutdown();
+}
+
+bool
+DecoderFuzzingWrapper::IsHardwareAccelerated(nsACString& aFailureReason) const
+{
+ DFW_LOGV("");
+ MOZ_ASSERT(mDecoder);
+ return mDecoder->IsHardwareAccelerated(aFailureReason);
+}
+
+DecoderCallbackFuzzingWrapper::DecoderCallbackFuzzingWrapper(MediaDataDecoderCallback* aCallback)
+ : mCallback(aCallback)
+ , mDontDelayInputExhausted(false)
+ , mDraining(false)
+ , mTaskQueue(new TaskQueue(SharedThreadPool::Get(NS_LITERAL_CSTRING("MediaFuzzingWrapper"), 1)))
+{
+ CFW_LOGV("aCallback=%p", aCallback);
+}
+
+DecoderCallbackFuzzingWrapper::~DecoderCallbackFuzzingWrapper()
+{
+ CFW_LOGV("");
+}
+
+void
+DecoderCallbackFuzzingWrapper::SetVideoOutputMinimumInterval(
+ TimeDuration aFrameOutputMinimumInterval)
+{
+ CFW_LOGD("aFrameOutputMinimumInterval=%fms",
+ aFrameOutputMinimumInterval.ToMilliseconds());
+ mFrameOutputMinimumInterval = aFrameOutputMinimumInterval;
+}
+
+void
+DecoderCallbackFuzzingWrapper::SetDontDelayInputExhausted(
+ bool aDontDelayInputExhausted)
+{
+ CFW_LOGD("aDontDelayInputExhausted=%d",
+ aDontDelayInputExhausted);
+ mDontDelayInputExhausted = aDontDelayInputExhausted;
+}
+
+void
+DecoderCallbackFuzzingWrapper::Output(MediaData* aData)
+{
+ if (!mTaskQueue->IsCurrentThreadIn()) {
+ nsCOMPtr<nsIRunnable> task =
+ NewRunnableMethod<StorensRefPtrPassByPtr<MediaData>>(
+ this, &DecoderCallbackFuzzingWrapper::Output, aData);
+ mTaskQueue->Dispatch(task.forget());
+ return;
+ }
+ CFW_LOGV("aData.mTime=%lld", aData->mTime);
+ MOZ_ASSERT(mCallback);
+ if (mFrameOutputMinimumInterval) {
+ if (!mPreviousOutput.IsNull()) {
+ if (!mDelayedOutput.empty()) {
+ // We already have some delayed frames, just add this one to the queue.
+ mDelayedOutput.push_back(MakePair<RefPtr<MediaData>, bool>(aData, false));
+ CFW_LOGD("delaying output of sample@%lld, total queued:%d",
+ aData->mTime, int(mDelayedOutput.size()));
+ return;
+ }
+ if (TimeStamp::Now() < mPreviousOutput + mFrameOutputMinimumInterval) {
+ // Frame arriving too soon after the previous one, start queuing.
+ mDelayedOutput.push_back(MakePair<RefPtr<MediaData>, bool>(aData, false));
+ CFW_LOGD("delaying output of sample@%lld, first queued", aData->mTime);
+ if (!mDelayedOutputTimer) {
+ mDelayedOutputTimer = new MediaTimer();
+ }
+ ScheduleOutputDelayedFrame();
+ return;
+ }
+ }
+ // If we're here, we're going to actually output a frame -> Record time.
+ mPreviousOutput = TimeStamp::Now();
+ }
+
+ // Passing the data straight through, no need to dispatch to another queue,
+ // callback should deal with that.
+ mCallback->Output(aData);
+}
+
+void
+DecoderCallbackFuzzingWrapper::Error(const MediaResult& aError)
+{
+ if (!mTaskQueue->IsCurrentThreadIn()) {
+ mTaskQueue->Dispatch(NewRunnableMethod<MediaResult>(
+ this, &DecoderCallbackFuzzingWrapper::Error, aError));
+ return;
+ }
+ CFW_LOGV("");
+ MOZ_ASSERT(mCallback);
+ ClearDelayedOutput();
+ mCallback->Error(aError);
+}
+
+void
+DecoderCallbackFuzzingWrapper::InputExhausted()
+{
+ if (!mTaskQueue->IsCurrentThreadIn()) {
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &DecoderCallbackFuzzingWrapper::InputExhausted));
+ return;
+ }
+ if (!mDontDelayInputExhausted && !mDelayedOutput.empty()) {
+ MediaDataAndInputExhausted& last = mDelayedOutput.back();
+ CFW_LOGD("InputExhausted delayed until after output of sample@%lld",
+ last.first()->mTime);
+ last.second() = true;
+ return;
+ }
+ CFW_LOGV("");
+ MOZ_ASSERT(mCallback);
+ mCallback->InputExhausted();
+}
+
+void
+DecoderCallbackFuzzingWrapper::DrainComplete()
+{
+ if (!mTaskQueue->IsCurrentThreadIn()) {
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &DecoderCallbackFuzzingWrapper::DrainComplete));
+ return;
+ }
+ MOZ_ASSERT(mCallback);
+ if (mDelayedOutput.empty()) {
+ // No queued output -> Draining is complete now.
+ CFW_LOGV("No delayed output -> DrainComplete now");
+ mCallback->DrainComplete();
+ } else {
+ // Queued output waiting -> Make sure we call DrainComplete when it's empty.
+ CFW_LOGD("Delayed output -> DrainComplete later");
+ mDraining = true;
+ }
+}
+
+void
+DecoderCallbackFuzzingWrapper::ReleaseMediaResources()
+{
+ if (!mTaskQueue->IsCurrentThreadIn()) {
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &DecoderCallbackFuzzingWrapper::ReleaseMediaResources));
+ return;
+ }
+ CFW_LOGV("");
+ MOZ_ASSERT(mCallback);
+ mCallback->ReleaseMediaResources();
+}
+
+bool
+DecoderCallbackFuzzingWrapper::OnReaderTaskQueue()
+{
+ CFW_LOGV("");
+ MOZ_ASSERT(mCallback);
+ return mCallback->OnReaderTaskQueue();
+}
+
+void
+DecoderCallbackFuzzingWrapper::ScheduleOutputDelayedFrame()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mDelayedOutputRequest.Exists()) {
+ // A delayed output is already scheduled, no need for more than one timer.
+ return;
+ }
+ RefPtr<DecoderCallbackFuzzingWrapper> self = this;
+ mDelayedOutputRequest.Begin(
+ mDelayedOutputTimer->WaitUntil(
+ mPreviousOutput + mFrameOutputMinimumInterval,
+ __func__)
+ ->Then(mTaskQueue, __func__,
+ [self] () -> void {
+ if (self->mDelayedOutputRequest.Exists()) {
+ self->mDelayedOutputRequest.Complete();
+ self->OutputDelayedFrame();
+ }
+ },
+ [self] () -> void {
+ if (self->mDelayedOutputRequest.Exists()) {
+ self->mDelayedOutputRequest.Complete();
+ self->ClearDelayedOutput();
+ }
+ }));
+}
+
+void
+DecoderCallbackFuzzingWrapper::OutputDelayedFrame()
+{
+ MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
+ if (mDelayedOutput.empty()) {
+ if (mDraining) {
+ // No more output, and we were draining -> Send DrainComplete.
+ mDraining = false;
+ mCallback->DrainComplete();
+ }
+ return;
+ }
+ MediaDataAndInputExhausted& data = mDelayedOutput.front();
+ CFW_LOGD("Outputting delayed sample@%lld, remaining:%d",
+ data.first()->mTime, int(mDelayedOutput.size() - 1));
+ mPreviousOutput = TimeStamp::Now();
+ mCallback->Output(data.first());
+ if (data.second()) {
+ CFW_LOGD("InputExhausted after delayed sample@%lld", data.first()->mTime);
+ mCallback->InputExhausted();
+ }
+ mDelayedOutput.pop_front();
+ if (!mDelayedOutput.empty()) {
+ // More output -> Send it later.
+ ScheduleOutputDelayedFrame();
+ } else if (mDraining) {
+ // No more output, and we were draining -> Send DrainComplete.
+ CFW_LOGD("DrainComplete");
+ mDraining = false;
+ mCallback->DrainComplete();
+ }
+}
+
+void
+DecoderCallbackFuzzingWrapper::ClearDelayedOutput()
+{
+ if (!mTaskQueue->IsCurrentThreadIn()) {
+ DFW_LOGV("(dispatching self)");
+ mTaskQueue->Dispatch(NewRunnableMethod(this, &DecoderCallbackFuzzingWrapper::ClearDelayedOutput));
+ return;
+ }
+ DFW_LOGV("");
+ // In case a timer hasn't lapsed yet, before destroying the timer and its
+ // attached waitUntil() promise, the 'Then' request must be disconnected.
+ mDelayedOutputRequest.DisconnectIfExists();
+ mDelayedOutputTimer = nullptr;
+ mDelayedOutput.clear();
+}
+
+void
+DecoderCallbackFuzzingWrapper::Shutdown()
+{
+ CFW_LOGV("Clear delayed output (if any) before shutting down mTaskQueue");
+ ClearDelayedOutput();
+ // Await idle here, so that 'ClearDelayedOutput' runs to completion before
+ // the task queue is shutdown (and tasks can't be queued anymore).
+ mTaskQueue->AwaitIdle();
+
+ CFW_LOGV("Shutting down mTaskQueue");
+ mTaskQueue->BeginShutdown();
+ mTaskQueue->AwaitIdle();
+ CFW_LOGV("mTaskQueue shut down");
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wrappers/FuzzingWrapper.h b/dom/media/platforms/wrappers/FuzzingWrapper.h
new file mode 100644
index 000000000..c2b737520
--- /dev/null
+++ b/dom/media/platforms/wrappers/FuzzingWrapper.h
@@ -0,0 +1,124 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(FuzzingWrapper_h_)
+#define FuzzingWrapper_h_
+
+#include "mozilla/Pair.h"
+#include "PlatformDecoderModule.h"
+
+#include <deque>
+
+namespace mozilla {
+
+// Fuzzing wrapper for media decoders.
+//
+// DecoderFuzzingWrapper owns the DecoderCallbackFuzzingWrapper, and inserts
+// itself between the reader and the decoder.
+// DecoderCallbackFuzzingWrapper inserts itself between a decoder and its
+// callback.
+// Together they are used to introduce some fuzzing, (e.g. delay output).
+//
+// Normally:
+// ====================================>
+// reader decoder
+// <------------------------------------
+//
+// With fuzzing:
+// ======> DecoderFuzzingWrapper ======>
+// reader v decoder
+// <-- DecoderCallbackFuzzingWrapper <--
+//
+// Creation order should be:
+// 1. Create DecoderCallbackFuzzingWrapper, give the expected callback target.
+// 2. Create actual decoder, give DecoderCallbackFuzzingWrapper as callback.
+// 3. Create DecoderFuzzingWrapper, give decoder and DecoderCallbackFuzzingWrapper.
+// DecoderFuzzingWrapper is what the reader sees as decoder, it owns the
+// real decoder and the DecoderCallbackFuzzingWrapper.
+
+class DecoderCallbackFuzzingWrapper : public MediaDataDecoderCallback
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DecoderCallbackFuzzingWrapper)
+
+ explicit DecoderCallbackFuzzingWrapper(MediaDataDecoderCallback* aCallback);
+
+ // Enforce a minimum interval between output frames (i.e., limit frame rate).
+ // Of course, if the decoder is even slower, this won't have any effect.
+ void SetVideoOutputMinimumInterval(TimeDuration aFrameOutputMinimumInterval);
+ // If false (default), if frames are delayed, any InputExhausted is delayed to
+ // be later sent after the corresponding delayed frame.
+ // If true, InputExhausted are passed through immediately; This could result
+ // in lots of frames being decoded and queued for delayed output!
+ void SetDontDelayInputExhausted(bool aDontDelayInputExhausted);
+
+private:
+ virtual ~DecoderCallbackFuzzingWrapper();
+
+ // MediaDataDecoderCallback implementation.
+ void Output(MediaData* aData) override;
+ void Error(const MediaResult& aError) override;
+ void InputExhausted() override;
+ void DrainComplete() override;
+ void ReleaseMediaResources() override;
+ bool OnReaderTaskQueue() override;
+
+ MediaDataDecoderCallback* mCallback;
+
+ // Settings for minimum frame output interval & InputExhausted,
+ // should be set during init and then only read on mTaskQueue.
+ TimeDuration mFrameOutputMinimumInterval;
+ bool mDontDelayInputExhausted;
+ // Members for minimum frame output interval & InputExhausted,
+ // should only be accessed on mTaskQueue.
+ TimeStamp mPreviousOutput;
+ // First member is the frame to be delayed.
+ // Second member is true if an 'InputExhausted' arrived after that frame; in
+ // which case an InputExhausted will be sent after finally outputting the frame.
+ typedef Pair<RefPtr<MediaData>, bool> MediaDataAndInputExhausted;
+ std::deque<MediaDataAndInputExhausted> mDelayedOutput;
+ RefPtr<MediaTimer> mDelayedOutputTimer;
+ MozPromiseRequestHolder<MediaTimerPromise> mDelayedOutputRequest;
+ // If draining, a 'DrainComplete' will be sent after all delayed frames have
+ // been output.
+ bool mDraining;
+ // All callbacks are redirected through this task queue, both to avoid locking
+ // and to have a consistent sequencing of callbacks.
+ RefPtr<TaskQueue> mTaskQueue;
+ void ScheduleOutputDelayedFrame();
+ void OutputDelayedFrame();
+public: // public for the benefit of DecoderFuzzingWrapper.
+ void ClearDelayedOutput();
+ void Shutdown();
+};
+
+class DecoderFuzzingWrapper : public MediaDataDecoder
+{
+public:
+ DecoderFuzzingWrapper(already_AddRefed<MediaDataDecoder> aDecoder,
+ already_AddRefed<DecoderCallbackFuzzingWrapper> aCallbackWrapper);
+
+ // MediaDataDecoder implementation.
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
+ const char* GetDescriptionName() const override
+ {
+ return mDecoder->GetDescriptionName();
+ }
+
+private:
+ virtual ~DecoderFuzzingWrapper();
+ RefPtr<MediaDataDecoder> mDecoder;
+ RefPtr<DecoderCallbackFuzzingWrapper> mCallbackWrapper;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/platforms/wrappers/H264Converter.cpp b/dom/media/platforms/wrappers/H264Converter.cpp
new file mode 100644
index 000000000..0edbfc10c
--- /dev/null
+++ b/dom/media/platforms/wrappers/H264Converter.cpp
@@ -0,0 +1,311 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/TaskQueue.h"
+
+#include "H264Converter.h"
+#include "ImageContainer.h"
+#include "MediaInfo.h"
+#include "mp4_demuxer/AnnexB.h"
+#include "mp4_demuxer/H264.h"
+
+namespace mozilla
+{
+
+H264Converter::H264Converter(PlatformDecoderModule* aPDM,
+ const CreateDecoderParams& aParams)
+ : mPDM(aPDM)
+ , mCurrentConfig(aParams.VideoConfig())
+ , mKnowsCompositor(aParams.mKnowsCompositor)
+ , mImageContainer(aParams.mImageContainer)
+ , mTaskQueue(aParams.mTaskQueue)
+ , mCallback(aParams.mCallback)
+ , mDecoder(nullptr)
+ , mGMPCrashHelper(aParams.mCrashHelper)
+ , mNeedAVCC(aPDM->DecoderNeedsConversion(aParams.mConfig)
+ == PlatformDecoderModule::ConversionRequired::kNeedAVCC)
+ , mLastError(NS_OK)
+{
+ CreateDecoder(aParams.mDiagnostics);
+}
+
+H264Converter::~H264Converter()
+{
+}
+
+RefPtr<MediaDataDecoder::InitPromise>
+H264Converter::Init()
+{
+ if (mDecoder) {
+ return mDecoder->Init();
+ }
+
+ // We haven't been able to initialize a decoder due to a missing SPS/PPS.
+ return MediaDataDecoder::InitPromise::CreateAndResolve(
+ TrackType::kVideoTrack, __func__);
+}
+
+void
+H264Converter::Input(MediaRawData* aSample)
+{
+ if (!mp4_demuxer::AnnexB::ConvertSampleToAVCC(aSample)) {
+ // We need AVCC content to be able to later parse the SPS.
+ // This is a no-op if the data is already AVCC.
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("ConvertSampleToAVCC")));
+ return;
+ }
+
+ if (mInitPromiseRequest.Exists()) {
+ if (mNeedKeyframe) {
+ if (!aSample->mKeyframe) {
+ // Frames dropped, we need a new one.
+ mCallback->InputExhausted();
+ return;
+ }
+ mNeedKeyframe = false;
+ }
+ mMediaRawSamples.AppendElement(aSample);
+ return;
+ }
+
+ nsresult rv;
+ if (!mDecoder) {
+ // It is not possible to create an AVCC H264 decoder without SPS.
+ // As such, creation will fail if the extra_data just extracted doesn't
+ // contain a SPS.
+ rv = CreateDecoderAndInit(aSample);
+ if (rv == NS_ERROR_NOT_INITIALIZED) {
+ // We are missing the required SPS to create the decoder.
+ // Ignore for the time being, the MediaRawData will be dropped.
+ mCallback->InputExhausted();
+ return;
+ }
+ } else {
+ rv = CheckForSPSChange(aSample);
+ if (rv == NS_ERROR_NOT_INITIALIZED) {
+ // The decoder is pending initialization.
+ mCallback->InputExhausted();
+ return;
+ }
+ }
+ if (NS_FAILED(rv)) {
+ mCallback->Error(
+ MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Unable to create H264 decoder")));
+ return;
+ }
+
+ if (mNeedKeyframe && !aSample->mKeyframe) {
+ mCallback->InputExhausted();
+ return;
+ }
+
+ if (!mNeedAVCC &&
+ !mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("ConvertSampleToAnnexB")));
+ return;
+ }
+
+ mNeedKeyframe = false;
+
+ aSample->mExtraData = mCurrentConfig.mExtraData;
+
+ mDecoder->Input(aSample);
+}
+
+void
+H264Converter::Flush()
+{
+ mNeedKeyframe = true;
+ if (mDecoder) {
+ mDecoder->Flush();
+ }
+}
+
+void
+H264Converter::Drain()
+{
+ mNeedKeyframe = true;
+ if (mDecoder) {
+ mDecoder->Drain();
+ return;
+ }
+ mCallback->DrainComplete();
+}
+
+void
+H264Converter::Shutdown()
+{
+ if (mDecoder) {
+ mDecoder->Shutdown();
+ mInitPromiseRequest.DisconnectIfExists();
+ mDecoder = nullptr;
+ }
+}
+
+bool
+H264Converter::IsHardwareAccelerated(nsACString& aFailureReason) const
+{
+ if (mDecoder) {
+ return mDecoder->IsHardwareAccelerated(aFailureReason);
+ }
+ return MediaDataDecoder::IsHardwareAccelerated(aFailureReason);
+}
+
+void
+H264Converter::SetSeekThreshold(const media::TimeUnit& aTime)
+{
+ if (mDecoder) {
+ mDecoder->SetSeekThreshold(aTime);
+ } else {
+ MediaDataDecoder::SetSeekThreshold(aTime);
+ }
+}
+
+nsresult
+H264Converter::CreateDecoder(DecoderDoctorDiagnostics* aDiagnostics)
+{
+ if (!mp4_demuxer::AnnexB::HasSPS(mCurrentConfig.mExtraData)) {
+ // nothing found yet, will try again later
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ UpdateConfigFromExtraData(mCurrentConfig.mExtraData);
+
+ mp4_demuxer::SPSData spsdata;
+ if (mp4_demuxer::H264::DecodeSPSFromExtraData(mCurrentConfig.mExtraData, spsdata)) {
+ // Do some format check here.
+ // WMF H.264 Video Decoder and Apple ATDecoder do not support YUV444 format.
+ if (spsdata.profile_idc == 244 /* Hi444PP */ ||
+ spsdata.chroma_format_idc == PDMFactory::kYUV444) {
+ mLastError = NS_ERROR_FAILURE;
+ if (aDiagnostics) {
+ aDiagnostics->SetVideoNotSupported();
+ }
+ return NS_ERROR_FAILURE;
+ }
+ } else {
+ // SPS was invalid.
+ mLastError = NS_ERROR_FAILURE;
+ return NS_ERROR_FAILURE;
+ }
+
+ mDecoder = mPDM->CreateVideoDecoder({
+ mCurrentConfig,
+ mTaskQueue,
+ mCallback,
+ aDiagnostics,
+ mImageContainer,
+ mKnowsCompositor,
+ mGMPCrashHelper
+ });
+
+ if (!mDecoder) {
+ mLastError = NS_ERROR_FAILURE;
+ return NS_ERROR_FAILURE;
+ }
+
+ mNeedKeyframe = true;
+
+ return NS_OK;
+}
+
+nsresult
+H264Converter::CreateDecoderAndInit(MediaRawData* aSample)
+{
+ RefPtr<MediaByteBuffer> extra_data =
+ mp4_demuxer::AnnexB::ExtractExtraData(aSample);
+ if (!mp4_demuxer::AnnexB::HasSPS(extra_data)) {
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ UpdateConfigFromExtraData(extra_data);
+
+ nsresult rv = CreateDecoder(/* DecoderDoctorDiagnostics* */ nullptr);
+
+ if (NS_SUCCEEDED(rv)) {
+ // Queue the incoming sample.
+ mMediaRawSamples.AppendElement(aSample);
+
+ mInitPromiseRequest.Begin(mDecoder->Init()
+ ->Then(AbstractThread::GetCurrent()->AsTaskQueue(), __func__, this,
+ &H264Converter::OnDecoderInitDone,
+ &H264Converter::OnDecoderInitFailed));
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ return rv;
+}
+
+void
+H264Converter::OnDecoderInitDone(const TrackType aTrackType)
+{
+ mInitPromiseRequest.Complete();
+ bool gotInput = false;
+ for (uint32_t i = 0 ; i < mMediaRawSamples.Length(); i++) {
+ const RefPtr<MediaRawData>& sample = mMediaRawSamples[i];
+ if (mNeedKeyframe) {
+ if (!sample->mKeyframe) {
+ continue;
+ }
+ mNeedKeyframe = false;
+ }
+ if (!mNeedAVCC &&
+ !mp4_demuxer::AnnexB::ConvertSampleToAnnexB(sample, mNeedKeyframe)) {
+ mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY,
+ RESULT_DETAIL("ConvertSampleToAnnexB")));
+ mMediaRawSamples.Clear();
+ return;
+ }
+ mDecoder->Input(sample);
+ }
+ if (!gotInput) {
+ mCallback->InputExhausted();
+ }
+ mMediaRawSamples.Clear();
+}
+
+void
+H264Converter::OnDecoderInitFailed(MediaResult aError)
+{
+ mInitPromiseRequest.Complete();
+ mCallback->Error(
+ MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("Unable to initialize H264 decoder")));
+}
+
+nsresult
+H264Converter::CheckForSPSChange(MediaRawData* aSample)
+{
+ RefPtr<MediaByteBuffer> extra_data =
+ mp4_demuxer::AnnexB::ExtractExtraData(aSample);
+ if (!mp4_demuxer::AnnexB::HasSPS(extra_data) ||
+ mp4_demuxer::AnnexB::CompareExtraData(extra_data,
+ mCurrentConfig.mExtraData)) {
+ return NS_OK;
+ }
+ // The SPS has changed, signal to flush the current decoder and create a
+ // new one.
+ mDecoder->Flush();
+ Shutdown();
+ return CreateDecoderAndInit(aSample);
+}
+
+void
+H264Converter::UpdateConfigFromExtraData(MediaByteBuffer* aExtraData)
+{
+ mp4_demuxer::SPSData spsdata;
+ if (mp4_demuxer::H264::DecodeSPSFromExtraData(aExtraData, spsdata) &&
+ spsdata.pic_width > 0 && spsdata.pic_height > 0) {
+ mp4_demuxer::H264::EnsureSPSIsSane(spsdata);
+ mCurrentConfig.mImage.width = spsdata.pic_width;
+ mCurrentConfig.mImage.height = spsdata.pic_height;
+ mCurrentConfig.mDisplay.width = spsdata.display_width;
+ mCurrentConfig.mDisplay.height = spsdata.display_height;
+ }
+ mCurrentConfig.mExtraData = aExtraData;
+}
+
+} // namespace mozilla
diff --git a/dom/media/platforms/wrappers/H264Converter.h b/dom/media/platforms/wrappers/H264Converter.h
new file mode 100644
index 000000000..6905b1c74
--- /dev/null
+++ b/dom/media/platforms/wrappers/H264Converter.h
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_H264Converter_h
+#define mozilla_H264Converter_h
+
+#include "PlatformDecoderModule.h"
+
+namespace mozilla {
+
+// H264Converter is a MediaDataDecoder wrapper used to ensure that
+// only AVCC or AnnexB is fed to the underlying MediaDataDecoder.
+// The H264Converter allows playback of content where the SPS NAL may not be
+// provided in the init segment (e.g. AVC3 or Annex B)
+// H264Converter will monitor the input data, and will delay creation of the
+// MediaDataDecoder until a SPS and PPS NALs have been extracted.
+
+class H264Converter : public MediaDataDecoder {
+public:
+
+ H264Converter(PlatformDecoderModule* aPDM,
+ const CreateDecoderParams& aParams);
+ virtual ~H264Converter();
+
+ RefPtr<InitPromise> Init() override;
+ void Input(MediaRawData* aSample) override;
+ void Flush() override;
+ void Drain() override;
+ void Shutdown() override;
+ bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
+ const char* GetDescriptionName() const override
+ {
+ if (mDecoder) {
+ return mDecoder->GetDescriptionName();
+ }
+ return "H264Converter decoder (pending)";
+ }
+ void SetSeekThreshold(const media::TimeUnit& aTime) override;
+
+ nsresult GetLastError() const { return mLastError; }
+
+private:
+ // Will create the required MediaDataDecoder if need AVCC and we have a SPS NAL.
+ // Returns NS_ERROR_FAILURE if error is permanent and can't be recovered and
+ // will set mError accordingly.
+ nsresult CreateDecoder(DecoderDoctorDiagnostics* aDiagnostics);
+ nsresult CreateDecoderAndInit(MediaRawData* aSample);
+ nsresult CheckForSPSChange(MediaRawData* aSample);
+ void UpdateConfigFromExtraData(MediaByteBuffer* aExtraData);
+
+ void OnDecoderInitDone(const TrackType aTrackType);
+ void OnDecoderInitFailed(MediaResult aError);
+
+ RefPtr<PlatformDecoderModule> mPDM;
+ VideoInfo mCurrentConfig;
+ RefPtr<layers::KnowsCompositor> mKnowsCompositor;
+ RefPtr<layers::ImageContainer> mImageContainer;
+ const RefPtr<TaskQueue> mTaskQueue;
+ nsTArray<RefPtr<MediaRawData>> mMediaRawSamples;
+ MediaDataDecoderCallback* mCallback;
+ RefPtr<MediaDataDecoder> mDecoder;
+ MozPromiseRequestHolder<InitPromise> mInitPromiseRequest;
+ RefPtr<GMPCrashHelper> mGMPCrashHelper;
+ bool mNeedAVCC;
+ nsresult mLastError;
+ bool mNeedKeyframe = true;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_H264Converter_h
diff --git a/dom/media/standalone/moz.build b/dom/media/standalone/moz.build
new file mode 100644
index 000000000..5d2c5a6e7
--- /dev/null
+++ b/dom/media/standalone/moz.build
@@ -0,0 +1,46 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+if CONFIG['OS_TARGET'] != 'WINNT' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk':
+ Library('media_standalone')
+
+UNIFIED_SOURCES += [
+ '../AudioChannelFormat.cpp',
+ '../AudioSegment.cpp',
+ '../SimpleImageBuffer.cpp',
+ '../VideoSegment.cpp',
+]
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
+ UNIFIED_SOURCES += ['../systemservices/OSXRunLoopSingleton.cpp']
+
+LOCAL_INCLUDES += [
+ '/caps',
+ '/dom/base',
+ '/layout/generic',
+ '/layout/xul',
+ '/netwerk/base',
+]
+
+if CONFIG['MOZ_WEBRTC']:
+ LOCAL_INCLUDES += [
+ '/media/webrtc/signaling/src/common',
+ '/media/webrtc/trunk',
+ ]
+
+DEFINES['MOZILLA_INTERNAL_API'] = True
+DEFINES['MOZILLA_EXTERNAL_LINKAGE'] = True
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+# Suppress some GCC warnings being treated as errors:
+# - about attributes on forward declarations for types that are already
+# defined, which complains about an important MOZ_EXPORT for android::AString
+if CONFIG['GNU_CC']:
+ CXXFLAGS += [
+ '-Wno-error=attributes',
+ '-Wno-error=shadow',
+ ]
diff --git a/dom/media/systemservices/CamerasChild.cpp b/dom/media/systemservices/CamerasChild.cpp
new file mode 100644
index 000000000..0f7d1c1df
--- /dev/null
+++ b/dom/media/systemservices/CamerasChild.cpp
@@ -0,0 +1,724 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "CamerasChild.h"
+
+#include "webrtc/video_engine/include/vie_capture.h"
+#undef FF
+
+#include "mozilla/Assertions.h"
+#include "mozilla/ipc/BackgroundChild.h"
+#include "mozilla/ipc/PBackgroundChild.h"
+#include "mozilla/Logging.h"
+#include "mozilla/SyncRunnable.h"
+#include "mozilla/WeakPtr.h"
+#include "mozilla/Unused.h"
+#include "MediaUtils.h"
+#include "nsThreadUtils.h"
+
+#undef LOG
+#undef LOG_ENABLED
+mozilla::LazyLogModule gCamerasChildLog("CamerasChild");
+#define LOG(args) MOZ_LOG(gCamerasChildLog, mozilla::LogLevel::Debug, args)
+#define LOG_ENABLED() MOZ_LOG_TEST(gCamerasChildLog, mozilla::LogLevel::Debug)
+
+#define FAKE_ONDEVICECHANGE_EVENT_PERIOD_IN_MS 5000
+#define FAKE_ONDEVICECHANGE_EVENT_REPEAT_COUNT 30
+
+namespace mozilla {
+namespace camera {
+
+CamerasSingleton::CamerasSingleton()
+ : mCamerasMutex("CamerasSingleton::mCamerasMutex"),
+ mCameras(nullptr),
+ mCamerasChildThread(nullptr),
+ mFakeDeviceChangeEventThread(nullptr) {
+ LOG(("CamerasSingleton: %p", this));
+}
+
+CamerasSingleton::~CamerasSingleton() {
+ LOG(("~CamerasSingleton: %p", this));
+}
+
+class FakeOnDeviceChangeEventRunnable : public Runnable
+{
+public:
+ explicit FakeOnDeviceChangeEventRunnable(uint8_t counter)
+ : mCounter(counter) {}
+
+ NS_IMETHOD Run() override
+ {
+ OffTheBooksMutexAutoLock lock(CamerasSingleton::Mutex());
+
+ CamerasChild* child = CamerasSingleton::Child();
+ if (child) {
+ child->OnDeviceChange();
+
+ if (mCounter++ < FAKE_ONDEVICECHANGE_EVENT_REPEAT_COUNT) {
+ RefPtr<FakeOnDeviceChangeEventRunnable> evt = new FakeOnDeviceChangeEventRunnable(mCounter);
+ CamerasSingleton::FakeDeviceChangeEventThread()->DelayedDispatch(evt.forget(),
+ FAKE_ONDEVICECHANGE_EVENT_PERIOD_IN_MS);
+ }
+ }
+
+ return NS_OK;
+ }
+
+private:
+ uint8_t mCounter;
+};
+
+class InitializeIPCThread : public Runnable
+{
+public:
+ InitializeIPCThread()
+ : mCamerasChild(nullptr) {}
+
+ NS_IMETHOD Run() override {
+ // Try to get the PBackground handle
+ ipc::PBackgroundChild* existingBackgroundChild =
+ ipc::BackgroundChild::GetForCurrentThread();
+ // If it's not spun up yet, block until it is, and retry
+ if (!existingBackgroundChild) {
+ LOG(("No existingBackgroundChild"));
+ existingBackgroundChild =
+ ipc::BackgroundChild::SynchronouslyCreateForCurrentThread();
+ LOG(("BackgroundChild: %p", existingBackgroundChild));
+ if (!existingBackgroundChild) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+
+ // Create CamerasChild
+ // We will be returning the resulting pointer (synchronously) to our caller.
+ mCamerasChild =
+ static_cast<mozilla::camera::CamerasChild*>(existingBackgroundChild->SendPCamerasConstructor());
+
+ return NS_OK;
+ }
+
+ CamerasChild* GetCamerasChild() {
+ return mCamerasChild;
+ }
+
+private:
+ CamerasChild* mCamerasChild;
+};
+
+CamerasChild*
+GetCamerasChild() {
+ CamerasSingleton::Mutex().AssertCurrentThreadOwns();
+ if (!CamerasSingleton::Child()) {
+ MOZ_ASSERT(!NS_IsMainThread(), "Should not be on the main Thread");
+ MOZ_ASSERT(!CamerasSingleton::Thread());
+ LOG(("No sCameras, setting up IPC Thread"));
+ nsresult rv = NS_NewNamedThread("Cameras IPC",
+ getter_AddRefs(CamerasSingleton::Thread()));
+ if (NS_FAILED(rv)) {
+ LOG(("Error launching IPC Thread"));
+ return nullptr;
+ }
+
+ // At this point we are in the MediaManager thread, and the thread we are
+ // dispatching to is the specific Cameras IPC thread that was just made
+ // above, so now we will fire off a runnable to run
+ // BackgroundChild::SynchronouslyCreateForCurrentThread there, while we
+ // block in this thread.
+ // We block until the following happens in the Cameras IPC thread:
+ // 1) Creation of PBackground finishes
+ // 2) Creation of PCameras finishes by sending a message to the parent
+ RefPtr<InitializeIPCThread> runnable = new InitializeIPCThread();
+ RefPtr<SyncRunnable> sr = new SyncRunnable(runnable);
+ sr->DispatchToThread(CamerasSingleton::Thread());
+ CamerasSingleton::Child() = runnable->GetCamerasChild();
+ }
+ if (!CamerasSingleton::Child()) {
+ LOG(("Failed to set up CamerasChild, are we in shutdown?"));
+ }
+ return CamerasSingleton::Child();
+}
+
+CamerasChild*
+GetCamerasChildIfExists() {
+ OffTheBooksMutexAutoLock lock(CamerasSingleton::Mutex());
+ return CamerasSingleton::Child();
+}
+
+int CamerasChild::AddDeviceChangeCallback(DeviceChangeCallback* aCallback)
+{
+ // According to the spec, if the script sets
+ // navigator.mediaDevices.ondevicechange and the permission state is
+ // "always granted", the User Agent MUST fires a devicechange event when
+ // a new media input device is made available, even the script never
+ // call getusermedia or enumerateDevices.
+
+ // In order to detect the event, we need to init the camera engine.
+ // Currently EnsureInitialized(aCapEngine) is only called when one of
+ // CamerasaParent api, e.g., RecvNumberOfCaptureDevices(), is called.
+
+ // So here we setup camera engine via EnsureInitialized(aCapEngine)
+
+ EnsureInitialized(CameraEngine);
+ return DeviceChangeCallback::AddDeviceChangeCallback(aCallback);
+}
+
+bool
+CamerasChild::RecvReplyFailure(void)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = false;
+ monitor.Notify();
+ return true;
+}
+
+bool
+CamerasChild::RecvReplySuccess(void)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = true;
+ monitor.Notify();
+ return true;
+}
+
+bool
+CamerasChild::RecvReplyNumberOfCapabilities(const int& numdev)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = true;
+ mReplyInteger = numdev;
+ monitor.Notify();
+ return true;
+}
+
+// Helper function to dispatch calls to the IPC Thread and
+// CamerasChild object. Takes the needed locks and dispatches.
+// Takes a "failed" value and a reference to the output variable
+// as parameters, will return the right one depending on whether
+// dispatching succeeded.
+template <class T = int>
+class LockAndDispatch
+{
+public:
+ LockAndDispatch(CamerasChild* aCamerasChild,
+ const char* aRequestingFunc,
+ nsIRunnable *aRunnable,
+ const T& aFailureValue = T(-1), const T& aSuccessValue = T(0))
+ : mCamerasChild(aCamerasChild), mRequestingFunc(aRequestingFunc),
+ mRunnable(aRunnable),
+ mReplyLock(aCamerasChild->mReplyMonitor),
+ mRequestLock(aCamerasChild->mRequestMutex),
+ mSuccess(true),
+ mFailureValue(aFailureValue), mSuccessValue(aSuccessValue)
+ {
+ Dispatch();
+ }
+
+ const T& ReturnValue() const {
+ if (mSuccess) {
+ return mSuccessValue;
+ } else {
+ return mFailureValue;
+ }
+ }
+
+ const bool& Success() const {
+ return mSuccess;
+ }
+
+private:
+ void Dispatch() {
+ if (!mCamerasChild->DispatchToParent(mRunnable, mReplyLock)) {
+ LOG(("Cameras dispatch for IPC failed in %s", mRequestingFunc));
+ mSuccess = false;
+ }
+ }
+
+ CamerasChild* mCamerasChild;
+ const char* mRequestingFunc;
+ nsIRunnable* mRunnable;
+ // Prevent concurrent use of the reply variables by holding
+ // the mReplyMonitor. Note that this is unlocked while waiting for
+ // the reply to be filled in, necessitating the additional mRequestLock/Mutex;
+ MonitorAutoLock mReplyLock;
+ MutexAutoLock mRequestLock;
+ bool mSuccess;
+ const T& mFailureValue;
+ const T& mSuccessValue;
+};
+
+bool
+CamerasChild::DispatchToParent(nsIRunnable* aRunnable,
+ MonitorAutoLock& aMonitor)
+{
+ CamerasSingleton::Mutex().AssertCurrentThreadOwns();
+ CamerasSingleton::Thread()->Dispatch(aRunnable, NS_DISPATCH_NORMAL);
+ // We can't see if the send worked, so we need to be able to bail
+ // out on shutdown (when it failed and we won't get a reply).
+ if (!mIPCIsAlive) {
+ return false;
+ }
+ // Guard against spurious wakeups.
+ mReceivedReply = false;
+ // Wait for a reply
+ do {
+ aMonitor.Wait();
+ } while (!mReceivedReply && mIPCIsAlive);
+ if (!mReplySuccess) {
+ return false;
+ }
+ return true;
+}
+
+int
+CamerasChild::NumberOfCapabilities(CaptureEngine aCapEngine,
+ const char* deviceUniqueIdUTF8)
+{
+ LOG((__PRETTY_FUNCTION__));
+ LOG(("NumberOfCapabilities for %s", deviceUniqueIdUTF8));
+ nsCString unique_id(deviceUniqueIdUTF8);
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, nsCString>
+ (this, &CamerasChild::SendNumberOfCapabilities, aCapEngine, unique_id);
+ LockAndDispatch<> dispatcher(this, __func__, runnable, 0, mReplyInteger);
+ LOG(("Capture capability count: %d", dispatcher.ReturnValue()));
+ return dispatcher.ReturnValue();
+}
+
+int
+CamerasChild::NumberOfCaptureDevices(CaptureEngine aCapEngine)
+{
+ LOG((__PRETTY_FUNCTION__));
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine>
+ (this, &CamerasChild::SendNumberOfCaptureDevices, aCapEngine);
+ LockAndDispatch<> dispatcher(this, __func__, runnable, 0, mReplyInteger);
+ LOG(("Capture Devices: %d", dispatcher.ReturnValue()));
+ return dispatcher.ReturnValue();
+}
+
+bool
+CamerasChild::RecvReplyNumberOfCaptureDevices(const int& numdev)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = true;
+ mReplyInteger = numdev;
+ monitor.Notify();
+ return true;
+}
+
+int
+CamerasChild::EnsureInitialized(CaptureEngine aCapEngine)
+{
+ LOG((__PRETTY_FUNCTION__));
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine>
+ (this, &CamerasChild::SendEnsureInitialized, aCapEngine);
+ LockAndDispatch<> dispatcher(this, __func__, runnable, 0, mReplyInteger);
+ LOG(("Capture Devices: %d", dispatcher.ReturnValue()));
+ return dispatcher.ReturnValue();
+}
+
+int
+CamerasChild::GetCaptureCapability(CaptureEngine aCapEngine,
+ const char* unique_idUTF8,
+ const unsigned int capability_number,
+ webrtc::CaptureCapability& capability)
+{
+ LOG(("GetCaptureCapability: %s %d", unique_idUTF8, capability_number));
+ nsCString unique_id(unique_idUTF8);
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, nsCString, unsigned int>
+ (this, &CamerasChild::SendGetCaptureCapability, aCapEngine, unique_id, capability_number);
+ LockAndDispatch<> dispatcher(this, __func__, runnable);
+ if (dispatcher.Success()) {
+ capability = mReplyCapability;
+ }
+ return dispatcher.ReturnValue();
+}
+
+bool
+CamerasChild::RecvReplyGetCaptureCapability(const CaptureCapability& ipcCapability)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = true;
+ mReplyCapability.width = ipcCapability.width();
+ mReplyCapability.height = ipcCapability.height();
+ mReplyCapability.maxFPS = ipcCapability.maxFPS();
+ mReplyCapability.expectedCaptureDelay = ipcCapability.expectedCaptureDelay();
+ mReplyCapability.rawType = static_cast<webrtc::RawVideoType>(ipcCapability.rawType());
+ mReplyCapability.codecType = static_cast<webrtc::VideoCodecType>(ipcCapability.codecType());
+ mReplyCapability.interlaced = ipcCapability.interlaced();
+ monitor.Notify();
+ return true;
+}
+
+int
+CamerasChild::GetCaptureDevice(CaptureEngine aCapEngine,
+ unsigned int list_number, char* device_nameUTF8,
+ const unsigned int device_nameUTF8Length,
+ char* unique_idUTF8,
+ const unsigned int unique_idUTF8Length,
+ bool* scary)
+{
+ LOG((__PRETTY_FUNCTION__));
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, unsigned int>
+ (this, &CamerasChild::SendGetCaptureDevice, aCapEngine, list_number);
+ LockAndDispatch<> dispatcher(this, __func__, runnable);
+ if (dispatcher.Success()) {
+ base::strlcpy(device_nameUTF8, mReplyDeviceName.get(), device_nameUTF8Length);
+ base::strlcpy(unique_idUTF8, mReplyDeviceID.get(), unique_idUTF8Length);
+ if (scary) {
+ *scary = mReplyScary;
+ }
+ LOG(("Got %s name %s id", device_nameUTF8, unique_idUTF8));
+ }
+ return dispatcher.ReturnValue();
+}
+
+bool
+CamerasChild::RecvReplyGetCaptureDevice(const nsCString& device_name,
+ const nsCString& device_id,
+ const bool& scary)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = true;
+ mReplyDeviceName = device_name;
+ mReplyDeviceID = device_id;
+ mReplyScary = scary;
+ monitor.Notify();
+ return true;
+}
+
+int
+CamerasChild::AllocateCaptureDevice(CaptureEngine aCapEngine,
+ const char* unique_idUTF8,
+ const unsigned int unique_idUTF8Length,
+ int& capture_id,
+ const nsACString& aOrigin)
+{
+ LOG((__PRETTY_FUNCTION__));
+ nsCString unique_id(unique_idUTF8);
+ nsCString origin(aOrigin);
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, nsCString, nsCString>
+ (this, &CamerasChild::SendAllocateCaptureDevice, aCapEngine, unique_id, origin);
+ LockAndDispatch<> dispatcher(this, __func__, runnable);
+ if (dispatcher.Success()) {
+ LOG(("Capture Device allocated: %d", mReplyInteger));
+ capture_id = mReplyInteger;
+ }
+ return dispatcher.ReturnValue();
+}
+
+
+bool
+CamerasChild::RecvReplyAllocateCaptureDevice(const int& numdev)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MonitorAutoLock monitor(mReplyMonitor);
+ mReceivedReply = true;
+ mReplySuccess = true;
+ mReplyInteger = numdev;
+ monitor.Notify();
+ return true;
+}
+
+int
+CamerasChild::ReleaseCaptureDevice(CaptureEngine aCapEngine,
+ const int capture_id)
+{
+ LOG((__PRETTY_FUNCTION__));
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, int>
+ (this, &CamerasChild::SendReleaseCaptureDevice, aCapEngine, capture_id);
+ LockAndDispatch<> dispatcher(this, __func__, runnable);
+ return dispatcher.ReturnValue();
+}
+
+void
+CamerasChild::AddCallback(const CaptureEngine aCapEngine, const int capture_id,
+ webrtc::ExternalRenderer* render)
+{
+ MutexAutoLock lock(mCallbackMutex);
+ CapturerElement ce;
+ ce.engine = aCapEngine;
+ ce.id = capture_id;
+ ce.callback = render;
+ mCallbacks.AppendElement(ce);
+}
+
+void
+CamerasChild::RemoveCallback(const CaptureEngine aCapEngine, const int capture_id)
+{
+ MutexAutoLock lock(mCallbackMutex);
+ for (unsigned int i = 0; i < mCallbacks.Length(); i++) {
+ CapturerElement ce = mCallbacks[i];
+ if (ce.engine == aCapEngine && ce.id == capture_id) {
+ mCallbacks.RemoveElementAt(i);
+ break;
+ }
+ }
+}
+
+int
+CamerasChild::StartCapture(CaptureEngine aCapEngine,
+ const int capture_id,
+ webrtc::CaptureCapability& webrtcCaps,
+ webrtc::ExternalRenderer* cb)
+{
+ LOG((__PRETTY_FUNCTION__));
+ AddCallback(aCapEngine, capture_id, cb);
+ CaptureCapability capCap(webrtcCaps.width,
+ webrtcCaps.height,
+ webrtcCaps.maxFPS,
+ webrtcCaps.expectedCaptureDelay,
+ webrtcCaps.rawType,
+ webrtcCaps.codecType,
+ webrtcCaps.interlaced);
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, int, CaptureCapability>
+ (this, &CamerasChild::SendStartCapture, aCapEngine, capture_id, capCap);
+ LockAndDispatch<> dispatcher(this, __func__, runnable);
+ return dispatcher.ReturnValue();
+}
+
+int
+CamerasChild::StopCapture(CaptureEngine aCapEngine, const int capture_id)
+{
+ LOG((__PRETTY_FUNCTION__));
+ nsCOMPtr<nsIRunnable> runnable =
+ mozilla::NewNonOwningRunnableMethod<CaptureEngine, int>
+ (this, &CamerasChild::SendStopCapture, aCapEngine, capture_id);
+ LockAndDispatch<> dispatcher(this, __func__, runnable);
+ if (dispatcher.Success()) {
+ RemoveCallback(aCapEngine, capture_id);
+ }
+ return dispatcher.ReturnValue();
+}
+
+void
+Shutdown(void)
+{
+ OffTheBooksMutexAutoLock lock(CamerasSingleton::Mutex());
+ CamerasChild* child = CamerasSingleton::Child();
+ if (!child) {
+ // We don't want to cause everything to get fired up if we're
+ // really already shut down.
+ LOG(("Shutdown when already shut down"));
+ return;
+ }
+ child->ShutdownAll();
+}
+
+class ShutdownRunnable : public Runnable {
+public:
+ explicit
+ ShutdownRunnable(already_AddRefed<Runnable>&& aReplyEvent)
+ : mReplyEvent(aReplyEvent) {};
+
+ NS_IMETHOD Run() override {
+ LOG(("Closing BackgroundChild"));
+ ipc::BackgroundChild::CloseForCurrentThread();
+
+ NS_DispatchToMainThread(mReplyEvent.forget());
+
+ return NS_OK;
+ }
+
+private:
+ RefPtr<Runnable> mReplyEvent;
+};
+
+void
+CamerasChild::ShutdownAll()
+{
+ // Called with CamerasSingleton::Mutex() held
+ ShutdownParent();
+ ShutdownChild();
+}
+
+void
+CamerasChild::ShutdownParent()
+{
+ // Called with CamerasSingleton::Mutex() held
+ {
+ MonitorAutoLock monitor(mReplyMonitor);
+ mIPCIsAlive = false;
+ monitor.NotifyAll();
+ }
+ if (CamerasSingleton::Thread()) {
+ LOG(("Dispatching actor deletion"));
+ // Delete the parent actor.
+ // CamerasChild (this) will remain alive and is only deleted by the
+ // IPC layer when SendAllDone returns.
+ nsCOMPtr<nsIRunnable> deleteRunnable =
+ mozilla::NewNonOwningRunnableMethod(this, &CamerasChild::SendAllDone);
+ CamerasSingleton::Thread()->Dispatch(deleteRunnable, NS_DISPATCH_NORMAL);
+ } else {
+ LOG(("ShutdownParent called without PBackground thread"));
+ }
+}
+
+void
+CamerasChild::ShutdownChild()
+{
+ // Called with CamerasSingleton::Mutex() held
+ if (CamerasSingleton::Thread()) {
+ LOG(("PBackground thread exists, dispatching close"));
+ // Dispatch closing the IPC thread back to us when the
+ // BackgroundChild is closed.
+ RefPtr<ShutdownRunnable> runnable =
+ new ShutdownRunnable(NewRunnableMethod(CamerasSingleton::Thread(),
+ &nsIThread::Shutdown));
+ CamerasSingleton::Thread()->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
+ } else {
+ LOG(("Shutdown called without PBackground thread"));
+ }
+ LOG(("Erasing sCameras & thread refs (original thread)"));
+ CamerasSingleton::Child() = nullptr;
+ CamerasSingleton::Thread() = nullptr;
+
+ if (CamerasSingleton::FakeDeviceChangeEventThread()) {
+ RefPtr<ShutdownRunnable> runnable =
+ new ShutdownRunnable(NewRunnableMethod(CamerasSingleton::FakeDeviceChangeEventThread(),
+ &nsIThread::Shutdown));
+ CamerasSingleton::FakeDeviceChangeEventThread()->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
+ }
+ CamerasSingleton::FakeDeviceChangeEventThread() = nullptr;
+}
+
+bool
+CamerasChild::RecvDeliverFrame(const CaptureEngine& capEngine,
+ const int& capId,
+ mozilla::ipc::Shmem&& shmem,
+ const size_t& size,
+ const uint32_t& time_stamp,
+ const int64_t& ntp_time,
+ const int64_t& render_time)
+{
+ MutexAutoLock lock(mCallbackMutex);
+ if (Callback(capEngine, capId)) {
+ unsigned char* image = shmem.get<unsigned char>();
+ Callback(capEngine, capId)->DeliverFrame(image, size,
+ time_stamp,
+ ntp_time, render_time,
+ nullptr);
+ } else {
+ LOG(("DeliverFrame called with dead callback"));
+ }
+ SendReleaseFrame(shmem);
+ return true;
+}
+
+bool
+CamerasChild::RecvDeviceChange()
+{
+ this->OnDeviceChange();
+ return true;
+}
+
+int
+CamerasChild::SetFakeDeviceChangeEvents()
+{
+ CamerasSingleton::Mutex().AssertCurrentThreadOwns();
+
+ if(!CamerasSingleton::FakeDeviceChangeEventThread()) {
+ nsresult rv = NS_NewNamedThread("Fake DC Event",
+ getter_AddRefs(CamerasSingleton::FakeDeviceChangeEventThread()));
+ if (NS_FAILED(rv)) {
+ LOG(("Error launching Fake OnDeviceChange Event Thread"));
+ return -1;
+ }
+ }
+
+ // To simulate the devicechange event in mochitest,
+ // we fire a fake devicechange event in Camera IPC thread periodically
+ RefPtr<FakeOnDeviceChangeEventRunnable> evt = new FakeOnDeviceChangeEventRunnable(0);
+ CamerasSingleton::FakeDeviceChangeEventThread()->Dispatch(evt.forget(), NS_DISPATCH_NORMAL);
+
+ return 0;
+}
+
+bool
+CamerasChild::RecvFrameSizeChange(const CaptureEngine& capEngine,
+ const int& capId,
+ const int& w, const int& h)
+{
+ LOG((__PRETTY_FUNCTION__));
+ MutexAutoLock lock(mCallbackMutex);
+ if (Callback(capEngine, capId)) {
+ Callback(capEngine, capId)->FrameSizeChange(w, h, 0);
+ } else {
+ LOG(("Frame size change with dead callback"));
+ }
+ return true;
+}
+
+void
+CamerasChild::ActorDestroy(ActorDestroyReason aWhy)
+{
+ MonitorAutoLock monitor(mReplyMonitor);
+ mIPCIsAlive = false;
+ // Hopefully prevent us from getting stuck
+ // on replies that'll never come.
+ monitor.NotifyAll();
+}
+
+CamerasChild::CamerasChild()
+ : mCallbackMutex("mozilla::cameras::CamerasChild::mCallbackMutex"),
+ mIPCIsAlive(true),
+ mRequestMutex("mozilla::cameras::CamerasChild::mRequestMutex"),
+ mReplyMonitor("mozilla::cameras::CamerasChild::mReplyMonitor")
+{
+ LOG(("CamerasChild: %p", this));
+
+ MOZ_COUNT_CTOR(CamerasChild);
+}
+
+CamerasChild::~CamerasChild()
+{
+ LOG(("~CamerasChild: %p", this));
+
+ {
+ OffTheBooksMutexAutoLock lock(CamerasSingleton::Mutex());
+ // In normal circumstances we've already shut down and the
+ // following does nothing. But on fatal IPC errors we will
+ // get destructed immediately, and should not try to reach
+ // the parent.
+ ShutdownChild();
+ }
+
+ MOZ_COUNT_DTOR(CamerasChild);
+}
+
+webrtc::ExternalRenderer* CamerasChild::Callback(CaptureEngine aCapEngine,
+ int capture_id)
+{
+ for (unsigned int i = 0; i < mCallbacks.Length(); i++) {
+ CapturerElement ce = mCallbacks[i];
+ if (ce.engine == aCapEngine && ce.id == capture_id) {
+ return ce.callback;
+ }
+ }
+
+ return nullptr;
+}
+
+}
+}
diff --git a/dom/media/systemservices/CamerasChild.h b/dom/media/systemservices/CamerasChild.h
new file mode 100644
index 000000000..1530714e9
--- /dev/null
+++ b/dom/media/systemservices/CamerasChild.h
@@ -0,0 +1,250 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_CamerasChild_h
+#define mozilla_CamerasChild_h
+
+#include "mozilla/Move.h"
+#include "mozilla/Pair.h"
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/camera/PCamerasChild.h"
+#include "mozilla/camera/PCamerasParent.h"
+#include "mozilla/media/DeviceChangeCallback.h"
+#include "mozilla/Mutex.h"
+#include "base/singleton.h"
+#include "nsCOMPtr.h"
+
+// conflicts with #include of scoped_ptr.h
+#undef FF
+#include "webrtc/common.h"
+// Video Engine
+#include "webrtc/video_engine/include/vie_base.h"
+#include "webrtc/video_engine/include/vie_capture.h"
+#include "webrtc/video_engine/include/vie_render.h"
+
+namespace mozilla {
+
+namespace ipc {
+class BackgroundChildImpl;
+}
+
+namespace camera {
+
+struct CapturerElement {
+ CaptureEngine engine;
+ int id;
+ webrtc::ExternalRenderer* callback;
+};
+
+// Forward declaration so we can work with pointers to it.
+class CamerasChild;
+// Helper class in impl that we friend.
+template <class T> class LockAndDispatch;
+
+// We emulate the sync webrtc.org API with the help of singleton
+// CamerasSingleton, which manages a pointer to an IPC object, a thread
+// where IPC operations should run on, and a mutex.
+// The static function Cameras() will use that Singleton to set up,
+// if needed, both the thread and the associated IPC objects and return
+// a pointer to the IPC object. Users can then do IPC calls on that object
+// after dispatching them to aforementioned thread.
+
+// 2 Threads are involved in this code:
+// - the MediaManager thread, which will call the (static, sync API) functions
+// through MediaEngineRemoteVideoSource
+// - the Cameras IPC thread, which will be doing our IPC to the parent process
+// via PBackground
+
+// Our main complication is that we emulate a sync API while (having to do)
+// async messaging. We dispatch the messages to another thread to send them
+// async and hold a Monitor to wait for the result to be asynchronously received
+// again. The requirement for async messaging originates on the parent side:
+// it's not reasonable to block all PBackground IPC there while waiting for
+// something like device enumeration to complete.
+
+class CamerasSingleton {
+public:
+ CamerasSingleton();
+ ~CamerasSingleton();
+
+ static OffTheBooksMutex& Mutex() {
+ return gTheInstance.get()->mCamerasMutex;
+ }
+
+ static CamerasChild*& Child() {
+ Mutex().AssertCurrentThreadOwns();
+ return gTheInstance.get()->mCameras;
+ }
+
+ static nsCOMPtr<nsIThread>& Thread() {
+ Mutex().AssertCurrentThreadOwns();
+ return gTheInstance.get()->mCamerasChildThread;
+ }
+
+ static nsCOMPtr<nsIThread>& FakeDeviceChangeEventThread() {
+ Mutex().AssertCurrentThreadOwns();
+ return gTheInstance.get()->mFakeDeviceChangeEventThread;
+ }
+
+private:
+ static Singleton<CamerasSingleton> gTheInstance;
+
+ // Reinitializing CamerasChild will change the pointers below.
+ // We don't want this to happen in the middle of preparing IPC.
+ // We will be alive on destruction, so this needs to be off the books.
+ mozilla::OffTheBooksMutex mCamerasMutex;
+
+ // This is owned by the IPC code, and the same code controls the lifetime.
+ // It will set and clear this pointer as appropriate in setup/teardown.
+ // We'd normally make this a WeakPtr but unfortunately the IPC code already
+ // uses the WeakPtr mixin in a protected base class of CamerasChild, and in
+ // any case the object becomes unusable as soon as IPC is tearing down, which
+ // will be before actual destruction.
+ CamerasChild* mCameras;
+ nsCOMPtr<nsIThread> mCamerasChildThread;
+ nsCOMPtr<nsIThread> mFakeDeviceChangeEventThread;
+};
+
+// Get a pointer to a CamerasChild object we can use to do IPC with.
+// This does everything needed to set up, including starting the IPC
+// channel with PBackground, blocking until thats done, and starting the
+// thread to do IPC on. This will fail if we're in shutdown. On success
+// it will set up the CamerasSingleton.
+CamerasChild* GetCamerasChild();
+
+CamerasChild* GetCamerasChildIfExists();
+
+// Shut down the IPC channel and everything associated, like WebRTC.
+// This is a static call because the CamerasChild object may not even
+// be alive when we're called.
+void Shutdown(void);
+
+// Obtain the CamerasChild object (if possible, i.e. not shutting down),
+// and maintain a grip on the object for the duration of the call.
+template <class MEM_FUN, class... ARGS>
+int GetChildAndCall(MEM_FUN&& f, ARGS&&... args)
+{
+ OffTheBooksMutexAutoLock lock(CamerasSingleton::Mutex());
+ CamerasChild* child = GetCamerasChild();
+ if (child) {
+ return (child->*f)(mozilla::Forward<ARGS>(args)...);
+ } else {
+ return -1;
+ }
+}
+
+class CamerasChild final : public PCamerasChild
+ ,public DeviceChangeCallback
+{
+ friend class mozilla::ipc::BackgroundChildImpl;
+ template <class T> friend class mozilla::camera::LockAndDispatch;
+
+public:
+ // We are owned by the PBackground thread only. CamerasSingleton
+ // takes a non-owning reference.
+ NS_INLINE_DECL_REFCOUNTING(CamerasChild)
+
+ // IPC messages recevied, received on the PBackground thread
+ // these are the actual callbacks with data
+ virtual bool RecvDeliverFrame(const CaptureEngine&, const int&, mozilla::ipc::Shmem&&,
+ const size_t&, const uint32_t&, const int64_t&,
+ const int64_t&) override;
+ virtual bool RecvFrameSizeChange(const CaptureEngine&, const int&,
+ const int& w, const int& h) override;
+
+ virtual bool RecvDeviceChange() override;
+ virtual int AddDeviceChangeCallback(DeviceChangeCallback* aCallback) override;
+ int SetFakeDeviceChangeEvents();
+
+ // these are response messages to our outgoing requests
+ virtual bool RecvReplyNumberOfCaptureDevices(const int&) override;
+ virtual bool RecvReplyNumberOfCapabilities(const int&) override;
+ virtual bool RecvReplyAllocateCaptureDevice(const int&) override;
+ virtual bool RecvReplyGetCaptureCapability(const CaptureCapability& capability) override;
+ virtual bool RecvReplyGetCaptureDevice(const nsCString& device_name,
+ const nsCString& device_id,
+ const bool& scary) override;
+ virtual bool RecvReplyFailure(void) override;
+ virtual bool RecvReplySuccess(void) override;
+ virtual void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ // the webrtc.org ViECapture calls are mirrored here, but with access
+ // to a specific PCameras instance to communicate over. These also
+ // run on the MediaManager thread
+ int NumberOfCaptureDevices(CaptureEngine aCapEngine);
+ int NumberOfCapabilities(CaptureEngine aCapEngine,
+ const char* deviceUniqueIdUTF8);
+ int ReleaseCaptureDevice(CaptureEngine aCapEngine,
+ const int capture_id);
+ int StartCapture(CaptureEngine aCapEngine,
+ const int capture_id, webrtc::CaptureCapability& capability,
+ webrtc::ExternalRenderer* func);
+ int StopCapture(CaptureEngine aCapEngine, const int capture_id);
+ int AllocateCaptureDevice(CaptureEngine aCapEngine,
+ const char* unique_idUTF8,
+ const unsigned int unique_idUTF8Length,
+ int& capture_id,
+ const nsACString& aOrigin);
+ int GetCaptureCapability(CaptureEngine aCapEngine,
+ const char* unique_idUTF8,
+ const unsigned int capability_number,
+ webrtc::CaptureCapability& capability);
+ int GetCaptureDevice(CaptureEngine aCapEngine,
+ unsigned int list_number, char* device_nameUTF8,
+ const unsigned int device_nameUTF8Length,
+ char* unique_idUTF8,
+ const unsigned int unique_idUTF8Length,
+ bool* scary = nullptr);
+ void ShutdownAll();
+ int EnsureInitialized(CaptureEngine aCapEngine);
+
+ webrtc::ExternalRenderer* Callback(CaptureEngine aCapEngine, int capture_id);
+
+private:
+ CamerasChild();
+ ~CamerasChild();
+ // Dispatch a Runnable to the PCamerasParent, by executing it on the
+ // decidecated Cameras IPC/PBackground thread.
+ bool DispatchToParent(nsIRunnable* aRunnable,
+ MonitorAutoLock& aMonitor);
+ void AddCallback(const CaptureEngine aCapEngine, const int capture_id,
+ webrtc::ExternalRenderer* render);
+ void RemoveCallback(const CaptureEngine aCapEngine, const int capture_id);
+ void ShutdownParent();
+ void ShutdownChild();
+
+ nsTArray<CapturerElement> mCallbacks;
+ // Protects the callback arrays
+ Mutex mCallbackMutex;
+
+ bool mIPCIsAlive;
+
+ // Hold to prevent multiple outstanding requests. We don't use
+ // request IDs so we only support one at a time. Don't want try
+ // to use the webrtc.org API from multiple threads simultanously.
+ // The monitor below isn't sufficient for this, as it will drop
+ // the lock when Wait-ing for a response, allowing us to send a new
+ // request. The Notify on receiving the response will then unblock
+ // both waiters and one will be guaranteed to get the wrong result.
+ // Take this one before taking mReplyMonitor.
+ Mutex mRequestMutex;
+ // Hold to wait for an async response to our calls
+ Monitor mReplyMonitor;
+ // Async response valid?
+ bool mReceivedReply;
+ // Async responses data contents;
+ bool mReplySuccess;
+ int mReplyInteger;
+ webrtc::CaptureCapability mReplyCapability;
+ nsCString mReplyDeviceName;
+ nsCString mReplyDeviceID;
+ bool mReplyScary;
+};
+
+} // namespace camera
+} // namespace mozilla
+
+#endif // mozilla_CamerasChild_h
diff --git a/dom/media/systemservices/CamerasParent.cpp b/dom/media/systemservices/CamerasParent.cpp
new file mode 100644
index 000000000..808a076d7
--- /dev/null
+++ b/dom/media/systemservices/CamerasParent.cpp
@@ -0,0 +1,1094 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "CamerasParent.h"
+#include "MediaEngine.h"
+#include "MediaUtils.h"
+
+#include "mozilla/Assertions.h"
+#include "mozilla/Unused.h"
+#include "mozilla/Services.h"
+#include "mozilla/Logging.h"
+#include "mozilla/ipc/BackgroundParent.h"
+#include "mozilla/Preferences.h"
+#include "nsIPermissionManager.h"
+#include "nsThreadUtils.h"
+#include "nsXPCOM.h"
+#include "nsNetUtil.h"
+
+#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
+
+#if defined(_WIN32)
+#include <process.h>
+#define getpid() _getpid()
+#endif
+
+#undef LOG
+#undef LOG_ENABLED
+mozilla::LazyLogModule gCamerasParentLog("CamerasParent");
+#define LOG(args) MOZ_LOG(gCamerasParentLog, mozilla::LogLevel::Debug, args)
+#define LOG_ENABLED() MOZ_LOG_TEST(gCamerasParentLog, mozilla::LogLevel::Debug)
+
+namespace mozilla {
+namespace camera {
+
+// 3 threads are involved in this code:
+// - the main thread for some setups, and occassionally for video capture setup
+// calls that don't work correctly elsewhere.
+// - the IPC thread on which PBackground is running and which receives and
+// sends messages
+// - a thread which will execute the actual (possibly slow) camera access
+// called "VideoCapture". On Windows this is a thread with an event loop
+// suitable for UI access.
+
+// InputObserver is owned by CamerasParent, and it has a ref to CamerasParent
+void InputObserver::DeviceChange() {
+ LOG((__PRETTY_FUNCTION__));
+ MOZ_ASSERT(mParent);
+
+ RefPtr<InputObserver> self(this);
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self]() -> nsresult {
+ if (self->mParent->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ Unused << self->mParent->SendDeviceChange();
+ return NS_OK;
+ });
+
+ nsIThread* thread = mParent->GetBackgroundThread();
+ MOZ_ASSERT(thread != nullptr);
+ thread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+};
+
+class FrameSizeChangeRunnable : public Runnable {
+public:
+ FrameSizeChangeRunnable(CamerasParent *aParent, CaptureEngine capEngine,
+ int cap_id, unsigned int aWidth, unsigned int aHeight)
+ : mParent(aParent), mCapEngine(capEngine), mCapId(cap_id),
+ mWidth(aWidth), mHeight(aHeight) {}
+
+ NS_IMETHOD Run() override {
+ if (mParent->IsShuttingDown()) {
+ // Communication channel is being torn down
+ LOG(("FrameSizeChangeRunnable is active without active Child"));
+ mResult = 0;
+ return NS_OK;
+ }
+ if (!mParent->SendFrameSizeChange(mCapEngine, mCapId, mWidth, mHeight)) {
+ mResult = -1;
+ } else {
+ mResult = 0;
+ }
+ return NS_OK;
+ }
+
+ int GetResult() {
+ return mResult;
+ }
+
+private:
+ RefPtr<CamerasParent> mParent;
+ CaptureEngine mCapEngine;
+ int mCapId;
+ unsigned int mWidth;
+ unsigned int mHeight;
+ int mResult;
+};
+
+int
+CallbackHelper::FrameSizeChange(unsigned int w, unsigned int h,
+ unsigned int streams)
+{
+ LOG(("CallbackHelper Video FrameSizeChange: %ux%u", w, h));
+ RefPtr<FrameSizeChangeRunnable> runnable =
+ new FrameSizeChangeRunnable(mParent, mCapEngine, mCapturerId, w, h);
+ MOZ_ASSERT(mParent);
+ nsIThread * thread = mParent->GetBackgroundThread();
+ MOZ_ASSERT(thread != nullptr);
+ thread->Dispatch(runnable, NS_DISPATCH_NORMAL);
+ return 0;
+}
+
+class DeliverFrameRunnable : public Runnable {
+public:
+ DeliverFrameRunnable(CamerasParent *aParent,
+ CaptureEngine engine,
+ int cap_id,
+ ShmemBuffer buffer,
+ unsigned char* altbuffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time)
+ : mParent(aParent), mCapEngine(engine), mCapId(cap_id), mBuffer(Move(buffer)),
+ mSize(size), mTimeStamp(time_stamp), mNtpTime(ntp_time),
+ mRenderTime(render_time) {
+ // No ShmemBuffer (of the right size) was available, so make an
+ // extra buffer here. We have no idea when we are going to run and
+ // it will be potentially long after the webrtc frame callback has
+ // returned, so the copy needs to be no later than here.
+ // We will need to copy this back into a Shmem later on so we prefer
+ // using ShmemBuffers to avoid the extra copy.
+ if (altbuffer != nullptr) {
+ mAlternateBuffer.reset(new unsigned char[size]);
+ memcpy(mAlternateBuffer.get(), altbuffer, size);
+ }
+ };
+
+ NS_IMETHOD Run() override {
+ if (mParent->IsShuttingDown()) {
+ // Communication channel is being torn down
+ mResult = 0;
+ return NS_OK;
+ }
+ if (!mParent->DeliverFrameOverIPC(mCapEngine, mCapId,
+ Move(mBuffer), mAlternateBuffer.get(),
+ mSize, mTimeStamp,
+ mNtpTime, mRenderTime)) {
+ mResult = -1;
+ } else {
+ mResult = 0;
+ }
+ return NS_OK;
+ }
+
+ int GetResult() {
+ return mResult;
+ }
+
+private:
+ RefPtr<CamerasParent> mParent;
+ CaptureEngine mCapEngine;
+ int mCapId;
+ ShmemBuffer mBuffer;
+ mozilla::UniquePtr<unsigned char[]> mAlternateBuffer;
+ size_t mSize;
+ uint32_t mTimeStamp;
+ int64_t mNtpTime;
+ int64_t mRenderTime;
+ int mResult;
+};
+
+NS_IMPL_ISUPPORTS(CamerasParent, nsIObserver)
+
+NS_IMETHODIMP
+CamerasParent::Observe(nsISupports *aSubject,
+ const char *aTopic,
+ const char16_t *aData)
+{
+ MOZ_ASSERT(!strcmp(aTopic, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID));
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ MOZ_ASSERT(obs);
+ obs->RemoveObserver(this, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID);
+ StopVideoCapture();
+ return NS_OK;
+}
+
+nsresult
+CamerasParent::DispatchToVideoCaptureThread(Runnable* event)
+{
+ // Don't try to dispatch if we're already on the right thread.
+ // There's a potential deadlock because the mThreadMonitor is likely
+ // to be taken already.
+ MOZ_ASSERT(!mVideoCaptureThread ||
+ mVideoCaptureThread->thread_id() != PlatformThread::CurrentId());
+
+ MonitorAutoLock lock(mThreadMonitor);
+
+ while(mChildIsAlive && mWebRTCAlive &&
+ (!mVideoCaptureThread || !mVideoCaptureThread->IsRunning())) {
+ mThreadMonitor.Wait();
+ }
+ if (!mVideoCaptureThread || !mVideoCaptureThread->IsRunning()) {
+ return NS_ERROR_FAILURE;
+ }
+ RefPtr<Runnable> addrefedEvent = event;
+ mVideoCaptureThread->message_loop()->PostTask(addrefedEvent.forget());
+ return NS_OK;
+}
+
+void
+CamerasParent::StopVideoCapture()
+{
+ LOG((__PRETTY_FUNCTION__));
+ // We are called from the main thread (xpcom-shutdown) or
+ // from PBackground (when the Actor shuts down).
+ // Shut down the WebRTC stack (on the capture thread)
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self]() -> nsresult {
+ MonitorAutoLock lock(self->mThreadMonitor);
+ self->CloseEngines();
+ self->mThreadMonitor.NotifyAll();
+ return NS_OK;
+ });
+ DebugOnly<nsresult> rv = DispatchToVideoCaptureThread(webrtc_runnable);
+#ifdef DEBUG
+ // It's ok for the dispatch to fail if the cleanup it has to do
+ // has been done already.
+ MOZ_ASSERT(NS_SUCCEEDED(rv) || !mWebRTCAlive);
+#endif
+ // Hold here until the WebRTC thread is gone. We need to dispatch
+ // the thread deletion *now*, or there will be no more possibility
+ // to get to the main thread.
+ MonitorAutoLock lock(mThreadMonitor);
+ while (mWebRTCAlive) {
+ mThreadMonitor.Wait();
+ }
+ // After closing the WebRTC stack, clean up the
+ // VideoCapture thread.
+ if (self->mVideoCaptureThread) {
+ base::Thread *thread = self->mVideoCaptureThread;
+ self->mVideoCaptureThread = nullptr;
+ RefPtr<Runnable> threadShutdown =
+ media::NewRunnableFrom([thread]() -> nsresult {
+ if (thread->IsRunning()) {
+ thread->Stop();
+ }
+ delete thread;
+ return NS_OK;
+ });
+ if (NS_FAILED(NS_DispatchToMainThread(threadShutdown))) {
+ LOG(("Could not dispatch VideoCaptureThread destruction"));
+ }
+ }
+}
+
+int
+CamerasParent::DeliverFrameOverIPC(CaptureEngine cap_engine,
+ int cap_id,
+ ShmemBuffer buffer,
+ unsigned char* altbuffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time)
+{
+ // No ShmemBuffers were available, so construct one now of the right size
+ // and copy into it. That is an extra copy, but we expect this to be
+ // the exceptional case, because we just assured the next call *will* have a
+ // buffer of the right size.
+ if (altbuffer != nullptr) {
+ // Get a shared memory buffer from the pool, at least size big
+ ShmemBuffer shMemBuff = mShmemPool.Get(this, size);
+
+ if (!shMemBuff.Valid()) {
+ LOG(("No usable Video shmem in DeliverFrame (out of buffers?)"));
+ // We can skip this frame if we run out of buffers, it's not a real error.
+ return 0;
+ }
+
+ // get() and Size() check for proper alignment of the segment
+ memcpy(shMemBuff.GetBytes(), altbuffer, size);
+
+ if (!SendDeliverFrame(cap_engine, cap_id,
+ shMemBuff.Get(), size,
+ time_stamp, ntp_time, render_time)) {
+ return -1;
+ }
+ } else {
+ MOZ_ASSERT(buffer.Valid());
+ // ShmemBuffer was available, we're all good. A single copy happened
+ // in the original webrtc callback.
+ if (!SendDeliverFrame(cap_engine, cap_id,
+ buffer.Get(), size,
+ time_stamp, ntp_time, render_time)) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+ShmemBuffer
+CamerasParent::GetBuffer(size_t aSize)
+{
+ return mShmemPool.GetIfAvailable(aSize);
+}
+
+int
+CallbackHelper::DeliverFrame(unsigned char* buffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time,
+ void *handle)
+{
+ // Get a shared memory buffer to copy the frame data into
+ ShmemBuffer shMemBuffer = mParent->GetBuffer(size);
+ if (!shMemBuffer.Valid()) {
+ // Either we ran out of buffers or they're not the right size yet
+ LOG(("Correctly sized Video shmem not available in DeliverFrame"));
+ // We will do the copy into a(n extra) temporary buffer inside
+ // the DeliverFrameRunnable constructor.
+ } else {
+ // Shared memory buffers of the right size are available, do the copy here.
+ memcpy(shMemBuffer.GetBytes(), buffer, size);
+ // Mark the original buffer as cleared.
+ buffer = nullptr;
+ }
+ RefPtr<DeliverFrameRunnable> runnable =
+ new DeliverFrameRunnable(mParent, mCapEngine, mCapturerId,
+ Move(shMemBuffer), buffer, size, time_stamp,
+ ntp_time, render_time);
+ MOZ_ASSERT(mParent);
+ nsIThread* thread = mParent->GetBackgroundThread();
+ MOZ_ASSERT(thread != nullptr);
+ thread->Dispatch(runnable, NS_DISPATCH_NORMAL);
+ return 0;
+}
+// XXX!!! FIX THIS -- we should move to pure DeliverI420Frame
+int
+CallbackHelper::DeliverI420Frame(const webrtc::I420VideoFrame& webrtc_frame)
+{
+ return DeliverFrame(const_cast<uint8_t*>(webrtc_frame.buffer(webrtc::kYPlane)),
+ CalcBufferSize(webrtc::kI420, webrtc_frame.width(), webrtc_frame.height()),
+ webrtc_frame.timestamp(),
+ webrtc_frame.ntp_time_ms(),
+ webrtc_frame.render_time_ms(),
+ (void*) webrtc_frame.native_handle());
+}
+
+bool
+CamerasParent::RecvReleaseFrame(mozilla::ipc::Shmem&& s) {
+ mShmemPool.Put(ShmemBuffer(s));
+ return true;
+}
+
+bool
+CamerasParent::SetupEngine(CaptureEngine aCapEngine)
+{
+ MOZ_ASSERT(mVideoCaptureThread->thread_id() == PlatformThread::CurrentId());
+ EngineHelper *helper = &mEngines[aCapEngine];
+
+ // Already initialized
+ if (helper->mEngine) {
+ return true;
+ }
+
+ webrtc::CaptureDeviceInfo *captureDeviceInfo = nullptr;
+
+ switch (aCapEngine) {
+ case ScreenEngine:
+ captureDeviceInfo =
+ new webrtc::CaptureDeviceInfo(webrtc::CaptureDeviceType::Screen);
+ break;
+ case BrowserEngine:
+ captureDeviceInfo =
+ new webrtc::CaptureDeviceInfo(webrtc::CaptureDeviceType::Browser);
+ break;
+ case WinEngine:
+ captureDeviceInfo =
+ new webrtc::CaptureDeviceInfo(webrtc::CaptureDeviceType::Window);
+ break;
+ case AppEngine:
+ captureDeviceInfo =
+ new webrtc::CaptureDeviceInfo(webrtc::CaptureDeviceType::Application);
+ break;
+ case CameraEngine:
+ captureDeviceInfo =
+ new webrtc::CaptureDeviceInfo(webrtc::CaptureDeviceType::Camera);
+ break;
+ default:
+ LOG(("Invalid webrtc Video engine"));
+ MOZ_CRASH();
+ break;
+ }
+
+ helper->mConfig.Set<webrtc::CaptureDeviceInfo>(captureDeviceInfo);
+ helper->mEngine = webrtc::VideoEngine::Create(helper->mConfig);
+
+ if (!helper->mEngine) {
+ LOG(("VideoEngine::Create failed"));
+ return false;
+ }
+
+ helper->mPtrViEBase = webrtc::ViEBase::GetInterface(helper->mEngine);
+ if (!helper->mPtrViEBase) {
+ LOG(("ViEBase::GetInterface failed"));
+ return false;
+ }
+
+ if (helper->mPtrViEBase->Init() < 0) {
+ LOG(("ViEBase::Init failed"));
+ return false;
+ }
+
+ helper->mPtrViECapture = webrtc::ViECapture::GetInterface(helper->mEngine);
+ if (!helper->mPtrViECapture) {
+ LOG(("ViECapture::GetInterface failed"));
+ return false;
+ }
+
+ RefPtr<InputObserver>* observer = mObservers.AppendElement(new InputObserver(this));
+
+#ifdef DEBUG
+ MOZ_ASSERT(0 == helper->mPtrViECapture->RegisterInputObserver(observer->get()));
+#else
+ helper->mPtrViECapture->RegisterInputObserver(observer->get());
+#endif
+
+ helper->mPtrViERender = webrtc::ViERender::GetInterface(helper->mEngine);
+ if (!helper->mPtrViERender) {
+ LOG(("ViERender::GetInterface failed"));
+ return false;
+ }
+
+ return true;
+}
+
+void
+CamerasParent::CloseEngines()
+{
+ LOG((__PRETTY_FUNCTION__));
+ if (!mWebRTCAlive) {
+ return;
+ }
+ MOZ_ASSERT(mVideoCaptureThread->thread_id() == PlatformThread::CurrentId());
+
+ // Stop the callers
+ while (mCallbacks.Length()) {
+ auto capEngine = mCallbacks[0]->mCapEngine;
+ auto capNum = mCallbacks[0]->mCapturerId;
+ LOG(("Forcing shutdown of engine %d, capturer %d", capEngine, capNum));
+ StopCapture(capEngine, capNum);
+ Unused << ReleaseCaptureDevice(capEngine, capNum);
+ }
+
+ for (int i = 0; i < CaptureEngine::MaxEngine; i++) {
+ if (mEngines[i].mEngineIsRunning) {
+ LOG(("Being closed down while engine %d is running!", i));
+ }
+ if (mEngines[i].mPtrViERender) {
+ mEngines[i].mPtrViERender->Release();
+ mEngines[i].mPtrViERender = nullptr;
+ }
+ if (mEngines[i].mPtrViECapture) {
+#ifdef DEBUG
+ MOZ_ASSERT(0 == mEngines[i].mPtrViECapture->DeregisterInputObserver());
+#else
+ mEngines[i].mPtrViECapture->DeregisterInputObserver();
+#endif
+
+ mEngines[i].mPtrViECapture->Release();
+ mEngines[i].mPtrViECapture = nullptr;
+ }
+ if(mEngines[i].mPtrViEBase) {
+ mEngines[i].mPtrViEBase->Release();
+ mEngines[i].mPtrViEBase = nullptr;
+ }
+ if (mEngines[i].mEngine) {
+ mEngines[i].mEngine->SetTraceCallback(nullptr);
+ webrtc::VideoEngine::Delete(mEngines[i].mEngine);
+ mEngines[i].mEngine = nullptr;
+ }
+ }
+
+ mObservers.Clear();
+
+ mWebRTCAlive = false;
+}
+
+bool
+CamerasParent::EnsureInitialized(int aEngine)
+{
+ LOG((__PRETTY_FUNCTION__));
+ // We're shutting down, don't try to do new WebRTC ops.
+ if (!mWebRTCAlive) {
+ return false;
+ }
+ CaptureEngine capEngine = static_cast<CaptureEngine>(aEngine);
+ if (!SetupEngine(capEngine)) {
+ LOG(("CamerasParent failed to initialize engine"));
+ return false;
+ }
+
+ return true;
+}
+
+// Dispatch the runnable to do the camera operation on the
+// specific Cameras thread, preventing us from blocking, and
+// chain a runnable to send back the result on the IPC thread.
+// It would be nice to get rid of the code duplication here,
+// perhaps via Promises.
+bool
+CamerasParent::RecvNumberOfCaptureDevices(const CaptureEngine& aCapEngine)
+{
+ LOG((__PRETTY_FUNCTION__));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, aCapEngine]() -> nsresult {
+ int num = -1;
+ if (self->EnsureInitialized(aCapEngine)) {
+ num = self->mEngines[aCapEngine].mPtrViECapture->NumberOfCaptureDevices();
+ }
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, num]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ if (num < 0) {
+ LOG(("RecvNumberOfCaptureDevices couldn't find devices"));
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ } else {
+ LOG(("RecvNumberOfCaptureDevices: %d", num));
+ Unused << self->SendReplyNumberOfCaptureDevices(num);
+ return NS_OK;
+ }
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+bool
+CamerasParent::RecvEnsureInitialized(const CaptureEngine& aCapEngine)
+{
+ LOG((__PRETTY_FUNCTION__));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, aCapEngine]() -> nsresult {
+ bool result = self->EnsureInitialized(aCapEngine);
+
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, result]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!result) {
+ LOG(("RecvEnsureInitialized failed"));
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ } else {
+ LOG(("RecvEnsureInitialized succeeded"));
+ Unused << self->SendReplySuccess();
+ return NS_OK;
+ }
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+bool
+CamerasParent::RecvNumberOfCapabilities(const CaptureEngine& aCapEngine,
+ const nsCString& unique_id)
+{
+ LOG((__PRETTY_FUNCTION__));
+ LOG(("Getting caps for %s", unique_id.get()));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, unique_id, aCapEngine]() -> nsresult {
+ int num = -1;
+ if (self->EnsureInitialized(aCapEngine)) {
+ num =
+ self->mEngines[aCapEngine].mPtrViECapture->NumberOfCapabilities(
+ unique_id.get(),
+ MediaEngineSource::kMaxUniqueIdLength);
+ }
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, num]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ if (num < 0) {
+ LOG(("RecvNumberOfCapabilities couldn't find capabilities"));
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ } else {
+ LOG(("RecvNumberOfCapabilities: %d", num));
+ }
+ Unused << self->SendReplyNumberOfCapabilities(num);
+ return NS_OK;
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+bool
+CamerasParent::RecvGetCaptureCapability(const CaptureEngine& aCapEngine,
+ const nsCString& unique_id,
+ const int& num)
+{
+ LOG((__PRETTY_FUNCTION__));
+ LOG(("RecvGetCaptureCapability: %s %d", unique_id.get(), num));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, unique_id, aCapEngine, num]() -> nsresult {
+ webrtc::CaptureCapability webrtcCaps;
+ int error = -1;
+ if (self->EnsureInitialized(aCapEngine)) {
+ error = self->mEngines[aCapEngine].mPtrViECapture->GetCaptureCapability(
+ unique_id.get(), MediaEngineSource::kMaxUniqueIdLength, num, webrtcCaps);
+ }
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, webrtcCaps, error]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ CaptureCapability capCap(webrtcCaps.width,
+ webrtcCaps.height,
+ webrtcCaps.maxFPS,
+ webrtcCaps.expectedCaptureDelay,
+ webrtcCaps.rawType,
+ webrtcCaps.codecType,
+ webrtcCaps.interlaced);
+ LOG(("Capability: %u %u %u %u %d %d",
+ webrtcCaps.width,
+ webrtcCaps.height,
+ webrtcCaps.maxFPS,
+ webrtcCaps.expectedCaptureDelay,
+ webrtcCaps.rawType,
+ webrtcCaps.codecType));
+ if (error) {
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ }
+ Unused << self->SendReplyGetCaptureCapability(capCap);
+ return NS_OK;
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+bool
+CamerasParent::RecvGetCaptureDevice(const CaptureEngine& aCapEngine,
+ const int& aListNumber)
+{
+ LOG((__PRETTY_FUNCTION__));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, aCapEngine, aListNumber]() -> nsresult {
+ char deviceName[MediaEngineSource::kMaxDeviceNameLength];
+ char deviceUniqueId[MediaEngineSource::kMaxUniqueIdLength];
+ nsCString name;
+ nsCString uniqueId;
+ int devicePid = 0;
+ int error = -1;
+ if (self->EnsureInitialized(aCapEngine)) {
+ error = self->mEngines[aCapEngine].mPtrViECapture->GetCaptureDevice(aListNumber,
+ deviceName,
+ sizeof(deviceName),
+ deviceUniqueId,
+ sizeof(deviceUniqueId),
+ &devicePid);
+ }
+ if (!error) {
+ name.Assign(deviceName);
+ uniqueId.Assign(deviceUniqueId);
+ }
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, error, name, uniqueId, devicePid]() {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ if (error) {
+ LOG(("GetCaptureDevice failed: %d", error));
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ }
+ bool scary = (devicePid == getpid());
+
+ LOG(("Returning %s name %s id (pid = %d)%s", name.get(),
+ uniqueId.get(), devicePid, (scary? " (scary)" : "")));
+ Unused << self->SendReplyGetCaptureDevice(name, uniqueId, scary);
+ return NS_OK;
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+static nsresult
+GetPrincipalFromOrigin(const nsACString& aOrigin, nsIPrincipal** aPrincipal)
+{
+ nsAutoCString originNoSuffix;
+ mozilla::PrincipalOriginAttributes attrs;
+ if (!attrs.PopulateFromOrigin(aOrigin, originNoSuffix)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsCOMPtr<nsIURI> uri;
+ nsresult rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsIPrincipal> principal = mozilla::BasePrincipal::CreateCodebasePrincipal(uri, attrs);
+ principal.forget(aPrincipal);
+ return NS_OK;
+}
+
+// Find out whether the given origin has permission to use the
+// camera. If the permission is not persistent, we'll make it
+// a one-shot by removing the (session) permission.
+static bool
+HasCameraPermission(const nsCString& aOrigin)
+{
+ // Name used with nsIPermissionManager
+ static const char* cameraPermission = "MediaManagerVideo";
+ bool allowed = false;
+ nsresult rv;
+ nsCOMPtr<nsIPermissionManager> mgr =
+ do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
+ if (NS_SUCCEEDED(rv)) {
+ nsCOMPtr<nsIIOService> ioServ(do_GetIOService());
+ nsCOMPtr<nsIURI> uri;
+ rv = ioServ->NewURI(aOrigin, nullptr, nullptr, getter_AddRefs(uri));
+ if (NS_SUCCEEDED(rv)) {
+ // Permanent permissions are only retrievable via principal, not uri
+ nsCOMPtr<nsIPrincipal> principal;
+ rv = GetPrincipalFromOrigin(aOrigin, getter_AddRefs(principal));
+ if (NS_SUCCEEDED(rv)) {
+ uint32_t video = nsIPermissionManager::UNKNOWN_ACTION;
+ rv = mgr->TestExactPermissionFromPrincipal(principal,
+ cameraPermission,
+ &video);
+ if (NS_SUCCEEDED(rv)) {
+ allowed = (video == nsIPermissionManager::ALLOW_ACTION);
+ }
+ // Session permissions are removed after one use.
+ if (allowed) {
+ mgr->RemoveFromPrincipal(principal, cameraPermission);
+ }
+ }
+ }
+ }
+ return allowed;
+}
+
+bool
+CamerasParent::RecvAllocateCaptureDevice(const CaptureEngine& aCapEngine,
+ const nsCString& unique_id,
+ const nsCString& aOrigin)
+{
+ LOG(("%s: Verifying permissions for %s", __PRETTY_FUNCTION__, aOrigin.get()));
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> mainthread_runnable =
+ media::NewRunnableFrom([self, aCapEngine, unique_id, aOrigin]() -> nsresult {
+ // Verify whether the claimed origin has received permission
+ // to use the camera, either persistently or this session (one shot).
+ bool allowed = HasCameraPermission(aOrigin);
+ if (!allowed) {
+ // Developer preference for turning off permission check.
+ if (Preferences::GetBool("media.navigator.permission.disabled", false)
+ || Preferences::GetBool("media.navigator.permission.fake")) {
+ allowed = true;
+ LOG(("No permission but checks are disabled or fake sources active"));
+ } else {
+ LOG(("No camera permission for this origin"));
+ }
+ }
+ // After retrieving the permission (or not) on the main thread,
+ // bounce to the WebRTC thread to allocate the device (or not),
+ // then bounce back to the IPC thread for the reply to content.
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, allowed, aCapEngine, unique_id]() -> nsresult {
+ int numdev = -1;
+ int error = -1;
+ if (allowed && self->EnsureInitialized(aCapEngine)) {
+ error = self->mEngines[aCapEngine].mPtrViECapture->AllocateCaptureDevice(
+ unique_id.get(), MediaEngineSource::kMaxUniqueIdLength, numdev);
+ }
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, numdev, error]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ if (error) {
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ } else {
+ LOG(("Allocated device nr %d", numdev));
+ Unused << self->SendReplyAllocateCaptureDevice(numdev);
+ return NS_OK;
+ }
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ self->DispatchToVideoCaptureThread(webrtc_runnable);
+ return NS_OK;
+ });
+ NS_DispatchToMainThread(mainthread_runnable);
+ return true;
+}
+
+int
+CamerasParent::ReleaseCaptureDevice(const CaptureEngine& aCapEngine,
+ const int& capnum)
+{
+ int error = -1;
+ if (EnsureInitialized(aCapEngine)) {
+ error = mEngines[aCapEngine].mPtrViECapture->ReleaseCaptureDevice(capnum);
+ }
+ return error;
+}
+
+bool
+CamerasParent::RecvReleaseCaptureDevice(const CaptureEngine& aCapEngine,
+ const int& numdev)
+{
+ LOG((__PRETTY_FUNCTION__));
+ LOG(("RecvReleaseCamera device nr %d", numdev));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, aCapEngine, numdev]() -> nsresult {
+ int error = self->ReleaseCaptureDevice(aCapEngine, numdev);
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, error, numdev]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ LOG(("In Shutdown, not Releasing"));
+ return NS_ERROR_FAILURE;
+ }
+ if (error) {
+ Unused << self->SendReplyFailure();
+ LOG(("Failed to free device nr %d", numdev));
+ return NS_ERROR_FAILURE;
+ } else {
+ Unused << self->SendReplySuccess();
+ LOG(("Freed device nr %d", numdev));
+ return NS_OK;
+ }
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+bool
+CamerasParent::RecvStartCapture(const CaptureEngine& aCapEngine,
+ const int& capnum,
+ const CaptureCapability& ipcCaps)
+{
+ LOG((__PRETTY_FUNCTION__));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, aCapEngine, capnum, ipcCaps]() -> nsresult {
+ CallbackHelper** cbh;
+ webrtc::ExternalRenderer* render;
+ EngineHelper* helper = nullptr;
+ int error = -1;
+ if (self->EnsureInitialized(aCapEngine)) {
+ cbh = self->mCallbacks.AppendElement(
+ new CallbackHelper(static_cast<CaptureEngine>(aCapEngine), capnum, self));
+ render = static_cast<webrtc::ExternalRenderer*>(*cbh);
+
+ helper = &self->mEngines[aCapEngine];
+ error =
+ helper->mPtrViERender->AddRenderer(capnum, webrtc::kVideoI420, render);
+ if (!error) {
+ error = helper->mPtrViERender->StartRender(capnum);
+ }
+
+ webrtc::CaptureCapability capability;
+ capability.width = ipcCaps.width();
+ capability.height = ipcCaps.height();
+ capability.maxFPS = ipcCaps.maxFPS();
+ capability.expectedCaptureDelay = ipcCaps.expectedCaptureDelay();
+ capability.rawType = static_cast<webrtc::RawVideoType>(ipcCaps.rawType());
+ capability.codecType = static_cast<webrtc::VideoCodecType>(ipcCaps.codecType());
+ capability.interlaced = ipcCaps.interlaced();
+
+ if (!error) {
+ error = helper->mPtrViECapture->StartCapture(capnum, capability);
+ }
+ if (!error) {
+ helper->mEngineIsRunning = true;
+ }
+ }
+ RefPtr<nsIRunnable> ipc_runnable =
+ media::NewRunnableFrom([self, error]() -> nsresult {
+ if (self->IsShuttingDown()) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!error) {
+ Unused << self->SendReplySuccess();
+ return NS_OK;
+ } else {
+ Unused << self->SendReplyFailure();
+ return NS_ERROR_FAILURE;
+ }
+ });
+ self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);
+ return NS_OK;
+ });
+ DispatchToVideoCaptureThread(webrtc_runnable);
+ return true;
+}
+
+void
+CamerasParent::StopCapture(const CaptureEngine& aCapEngine,
+ const int& capnum)
+{
+ if (EnsureInitialized(aCapEngine)) {
+ mEngines[aCapEngine].mPtrViECapture->StopCapture(capnum);
+ mEngines[aCapEngine].mPtrViERender->StopRender(capnum);
+ mEngines[aCapEngine].mPtrViERender->RemoveRenderer(capnum);
+ mEngines[aCapEngine].mEngineIsRunning = false;
+
+ for (size_t i = 0; i < mCallbacks.Length(); i++) {
+ if (mCallbacks[i]->mCapEngine == aCapEngine
+ && mCallbacks[i]->mCapturerId == capnum) {
+ delete mCallbacks[i];
+ mCallbacks.RemoveElementAt(i);
+ break;
+ }
+ }
+ }
+}
+
+bool
+CamerasParent::RecvStopCapture(const CaptureEngine& aCapEngine,
+ const int& capnum)
+{
+ LOG((__PRETTY_FUNCTION__));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> webrtc_runnable =
+ media::NewRunnableFrom([self, aCapEngine, capnum]() -> nsresult {
+ self->StopCapture(aCapEngine, capnum);
+ return NS_OK;
+ });
+ nsresult rv = DispatchToVideoCaptureThread(webrtc_runnable);
+ if (self->IsShuttingDown()) {
+ return NS_SUCCEEDED(rv);
+ } else {
+ if (NS_SUCCEEDED(rv)) {
+ return SendReplySuccess();
+ } else {
+ return SendReplyFailure();
+ }
+ }
+}
+
+void
+CamerasParent::StopIPC()
+{
+ MOZ_ASSERT(!mDestroyed);
+ // Release shared memory now, it's our last chance
+ mShmemPool.Cleanup(this);
+ // We don't want to receive callbacks or anything if we can't
+ // forward them anymore anyway.
+ mChildIsAlive = false;
+ mDestroyed = true;
+}
+
+bool
+CamerasParent::RecvAllDone()
+{
+ LOG((__PRETTY_FUNCTION__));
+ // Don't try to send anything to the child now
+ mChildIsAlive = false;
+ return Send__delete__(this);
+}
+
+void
+CamerasParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ // No more IPC from here
+ LOG((__PRETTY_FUNCTION__));
+ StopIPC();
+ // Shut down WebRTC (if we're not in full shutdown, else this
+ // will already have happened)
+ StopVideoCapture();
+}
+
+CamerasParent::CamerasParent()
+ : mShmemPool(CaptureEngine::MaxEngine),
+ mThreadMonitor("CamerasParent::mThreadMonitor"),
+ mVideoCaptureThread(nullptr),
+ mChildIsAlive(true),
+ mDestroyed(false),
+ mWebRTCAlive(true)
+{
+ LOG(("CamerasParent: %p", this));
+
+ mPBackgroundThread = NS_GetCurrentThread();
+ MOZ_ASSERT(mPBackgroundThread != nullptr, "GetCurrentThread failed");
+
+ LOG(("Spinning up WebRTC Cameras Thread"));
+
+ RefPtr<CamerasParent> self(this);
+ RefPtr<Runnable> threadStart =
+ media::NewRunnableFrom([self]() -> nsresult {
+ // Register thread shutdown observer
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (NS_WARN_IF(!obs)) {
+ return NS_ERROR_FAILURE;
+ }
+ nsresult rv =
+ obs->AddObserver(self, NS_XPCOM_WILL_SHUTDOWN_OBSERVER_ID, false);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ // Start the thread
+ MonitorAutoLock lock(self->mThreadMonitor);
+ self->mVideoCaptureThread = new base::Thread("VideoCapture");
+ base::Thread::Options options;
+#if defined(_WIN32)
+ options.message_loop_type = MessageLoop::TYPE_MOZILLA_NONMAINUITHREAD;
+#else
+
+ options.message_loop_type = MessageLoop::TYPE_MOZILLA_NONMAINTHREAD;
+#endif
+ if (!self->mVideoCaptureThread->StartWithOptions(options)) {
+ MOZ_CRASH();
+ }
+ self->mThreadMonitor.NotifyAll();
+ return NS_OK;
+ });
+ NS_DispatchToMainThread(threadStart);
+
+ MOZ_COUNT_CTOR(CamerasParent);
+}
+
+CamerasParent::~CamerasParent()
+{
+ LOG(("~CamerasParent: %p", this));
+
+ MOZ_COUNT_DTOR(CamerasParent);
+#ifdef DEBUG
+ // Verify we have shut down the webrtc engines, this is
+ // supposed to happen in ActorDestroy.
+ // That runnable takes a ref to us, so it must have finished
+ // by the time we get here.
+ for (int i = 0; i < CaptureEngine::MaxEngine; i++) {
+ MOZ_ASSERT(!mEngines[i].mEngine);
+ }
+#endif
+}
+
+already_AddRefed<CamerasParent>
+CamerasParent::Create() {
+ mozilla::ipc::AssertIsOnBackgroundThread();
+ RefPtr<CamerasParent> camerasParent = new CamerasParent();
+ return camerasParent.forget();
+}
+
+}
+}
diff --git a/dom/media/systemservices/CamerasParent.h b/dom/media/systemservices/CamerasParent.h
new file mode 100644
index 000000000..2c1869410
--- /dev/null
+++ b/dom/media/systemservices/CamerasParent.h
@@ -0,0 +1,187 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_CamerasParent_h
+#define mozilla_CamerasParent_h
+
+#include "nsIObserver.h"
+#include "mozilla/dom/ContentParent.h"
+#include "mozilla/camera/PCamerasParent.h"
+#include "mozilla/ipc/Shmem.h"
+#include "mozilla/ShmemPool.h"
+#include "mozilla/Atomics.h"
+
+// conflicts with #include of scoped_ptr.h
+#undef FF
+#include "webrtc/common.h"
+// Video Engine
+#include "webrtc/video_engine/include/vie_base.h"
+#include "webrtc/video_engine/include/vie_capture.h"
+#include "webrtc/video_engine/include/vie_render.h"
+#include "CamerasChild.h"
+
+#include "base/thread.h"
+
+namespace mozilla {
+namespace camera {
+
+class CamerasParent;
+
+class CallbackHelper : public webrtc::ExternalRenderer
+{
+public:
+ CallbackHelper(CaptureEngine aCapEng, int aCapId, CamerasParent *aParent)
+ : mCapEngine(aCapEng), mCapturerId(aCapId), mParent(aParent) {};
+
+ // ViEExternalRenderer implementation. These callbacks end up
+ // running on the VideoCapture thread.
+ virtual int FrameSizeChange(unsigned int w, unsigned int h,
+ unsigned int streams) override;
+ virtual int DeliverFrame(unsigned char* buffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time,
+ void *handle) override;
+ virtual int DeliverI420Frame(const webrtc::I420VideoFrame& webrtc_frame) override;
+ virtual bool IsTextureSupported() override { return false; };
+
+ friend CamerasParent;
+
+private:
+ CaptureEngine mCapEngine;
+ int mCapturerId;
+ CamerasParent *mParent;
+};
+
+class EngineHelper
+{
+public:
+ EngineHelper() :
+ mEngine(nullptr), mPtrViEBase(nullptr), mPtrViECapture(nullptr),
+ mPtrViERender(nullptr), mEngineIsRunning(false) {};
+
+ webrtc::VideoEngine *mEngine;
+ webrtc::ViEBase *mPtrViEBase;
+ webrtc::ViECapture *mPtrViECapture;
+ webrtc::ViERender *mPtrViERender;
+
+ // The webrtc code keeps a reference to this one.
+ webrtc::Config mConfig;
+
+ // Engine alive
+ bool mEngineIsRunning;
+};
+
+class InputObserver : public webrtc::ViEInputObserver
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(InputObserver)
+
+ explicit InputObserver(CamerasParent* aParent)
+ : mParent(aParent) {};
+ virtual void DeviceChange();
+
+ friend CamerasParent;
+
+private:
+ ~InputObserver() {}
+
+ RefPtr<CamerasParent> mParent;
+};
+
+class CamerasParent : public PCamerasParent,
+ public nsIObserver
+{
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+public:
+ static already_AddRefed<CamerasParent> Create();
+
+ // Messages received form the child. These run on the IPC/PBackground thread.
+ virtual bool RecvAllocateCaptureDevice(const CaptureEngine&, const nsCString&,
+ const nsCString&) override;
+ virtual bool RecvReleaseCaptureDevice(const CaptureEngine&,
+ const int&) override;
+ virtual bool RecvNumberOfCaptureDevices(const CaptureEngine&) override;
+ virtual bool RecvNumberOfCapabilities(const CaptureEngine&,
+ const nsCString&) override;
+ virtual bool RecvGetCaptureCapability(const CaptureEngine&, const nsCString&,
+ const int&) override;
+ virtual bool RecvGetCaptureDevice(const CaptureEngine&, const int&) override;
+ virtual bool RecvStartCapture(const CaptureEngine&, const int&,
+ const CaptureCapability&) override;
+ virtual bool RecvStopCapture(const CaptureEngine&, const int&) override;
+ virtual bool RecvReleaseFrame(mozilla::ipc::Shmem&&) override;
+ virtual bool RecvAllDone() override;
+ virtual void ActorDestroy(ActorDestroyReason aWhy) override;
+ virtual bool RecvEnsureInitialized(const CaptureEngine&) override;
+
+ nsIThread* GetBackgroundThread() { return mPBackgroundThread; };
+ bool IsShuttingDown() { return !mChildIsAlive
+ || mDestroyed
+ || !mWebRTCAlive; };
+ ShmemBuffer GetBuffer(size_t aSize);
+
+ // helper to forward to the PBackground thread
+ int DeliverFrameOverIPC(CaptureEngine capEng,
+ int cap_id,
+ ShmemBuffer buffer,
+ unsigned char* altbuffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time);
+
+
+ CamerasParent();
+
+protected:
+ virtual ~CamerasParent();
+
+ // We use these helpers for shutdown and for the respective IPC commands.
+ void StopCapture(const CaptureEngine& aCapEngine, const int& capnum);
+ int ReleaseCaptureDevice(const CaptureEngine& aCapEngine, const int& capnum);
+
+ bool SetupEngine(CaptureEngine aCapEngine);
+ bool EnsureInitialized(int aEngine);
+ void CloseEngines();
+ void StopIPC();
+ void StopVideoCapture();
+ // Can't take already_AddRefed because it can fail in stupid ways.
+ nsresult DispatchToVideoCaptureThread(Runnable* event);
+
+ EngineHelper mEngines[CaptureEngine::MaxEngine];
+ nsTArray<CallbackHelper*> mCallbacks;
+
+ // image buffers
+ mozilla::ShmemPool mShmemPool;
+
+ // PBackground parent thread
+ nsCOMPtr<nsIThread> mPBackgroundThread;
+
+ // Monitors creation of the thread below
+ Monitor mThreadMonitor;
+
+ // video processing thread - where webrtc.org capturer code runs
+ base::Thread* mVideoCaptureThread;
+
+ // Shutdown handling
+ bool mChildIsAlive;
+ bool mDestroyed;
+ // Above 2 are PBackground only, but this is potentially
+ // read cross-thread.
+ mozilla::Atomic<bool> mWebRTCAlive;
+ nsTArray<RefPtr<InputObserver>> mObservers;
+};
+
+PCamerasParent* CreateCamerasParent();
+
+} // namespace camera
+} // namespace mozilla
+
+#endif // mozilla_CameraParent_h
diff --git a/dom/media/systemservices/CamerasTypes.h b/dom/media/systemservices/CamerasTypes.h
new file mode 100644
index 000000000..9ae564e9a
--- /dev/null
+++ b/dom/media/systemservices/CamerasTypes.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_CamerasTypes_h
+#define mozilla_CamerasTypes_h
+
+#include "ipc/IPCMessageUtils.h"
+
+namespace mozilla {
+
+namespace camera {
+
+enum CaptureEngine : int {
+ InvalidEngine = 0,
+ ScreenEngine,
+ BrowserEngine,
+ WinEngine,
+ AppEngine,
+ CameraEngine,
+ MaxEngine
+};
+
+} // namespace camera
+} // namespace mozilla
+
+namespace IPC {
+template<>
+struct ParamTraits<mozilla::camera::CaptureEngine> :
+ public ContiguousEnumSerializer<mozilla::camera::CaptureEngine,
+ mozilla::camera::CaptureEngine::InvalidEngine,
+ mozilla::camera::CaptureEngine::MaxEngine>
+{ };
+}
+
+#endif // mozilla_CamerasTypes_h
diff --git a/dom/media/systemservices/DeviceChangeCallback.h b/dom/media/systemservices/DeviceChangeCallback.h
new file mode 100644
index 000000000..d153e9cd4
--- /dev/null
+++ b/dom/media/systemservices/DeviceChangeCallback.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_DeviceChangeCallback_h
+#define mozilla_DeviceChangeCallback_h
+
+namespace mozilla {
+
+class DeviceChangeCallback
+{
+public:
+ virtual void OnDeviceChange()
+ {
+ MutexAutoLock lock(mCallbackMutex);
+ for (DeviceChangeCallback* observer : mDeviceChangeCallbackList)
+ {
+ observer->OnDeviceChange();
+ }
+ }
+
+ virtual int AddDeviceChangeCallback(DeviceChangeCallback* aCallback)
+ {
+ MutexAutoLock lock(mCallbackMutex);
+ if (mDeviceChangeCallbackList.IndexOf(aCallback) == mDeviceChangeCallbackList.NoIndex)
+ mDeviceChangeCallbackList.AppendElement(aCallback);
+ return 0;
+ }
+
+ virtual int RemoveDeviceChangeCallback(DeviceChangeCallback* aCallback)
+ {
+ MutexAutoLock lock(mCallbackMutex);
+ return RemoveDeviceChangeCallbackLocked(aCallback);
+ }
+
+ virtual int RemoveDeviceChangeCallbackLocked(DeviceChangeCallback* aCallback)
+ {
+ mCallbackMutex.AssertCurrentThreadOwns();
+ if (mDeviceChangeCallbackList.IndexOf(aCallback) != mDeviceChangeCallbackList.NoIndex)
+ mDeviceChangeCallbackList.RemoveElement(aCallback);
+ return 0;
+ }
+
+ DeviceChangeCallback() : mCallbackMutex("mozilla::media::DeviceChangeCallback::mCallbackMutex")
+ {
+ }
+
+ virtual ~DeviceChangeCallback()
+ {
+ }
+
+protected:
+ nsTArray<DeviceChangeCallback*> mDeviceChangeCallbackList;
+ Mutex mCallbackMutex;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_DeviceChangeCallback_h
diff --git a/dom/media/systemservices/LoadManager.cpp b/dom/media/systemservices/LoadManager.cpp
new file mode 100644
index 000000000..f0f4f83a7
--- /dev/null
+++ b/dom/media/systemservices/LoadManager.cpp
@@ -0,0 +1,227 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "LoadManager.h"
+#include "LoadMonitor.h"
+#include "nsString.h"
+#include "mozilla/Logging.h"
+#include "prtime.h"
+#include "prinrval.h"
+#include "prsystem.h"
+
+#include "nsString.h"
+#include "nsThreadUtils.h"
+#include "nsReadableUtils.h"
+#include "nsIObserverService.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/ArrayUtils.h"
+
+// MOZ_LOG=LoadManager:5
+mozilla::LazyLogModule gLoadManagerLog("LoadManager");
+#undef LOG
+#undef LOG_ENABLED
+#define LOG(args) MOZ_LOG(gLoadManagerLog, mozilla::LogLevel::Debug, args)
+#define LOG_ENABLED() MOZ_LOG_TEST(gLoadManagerLog, mozilla::LogLevel::Verbose)
+
+namespace mozilla {
+
+/* static */ StaticRefPtr<LoadManagerSingleton> LoadManagerSingleton::sSingleton;
+
+NS_IMPL_ISUPPORTS(LoadManagerSingleton, nsIObserver)
+
+
+LoadManagerSingleton::LoadManagerSingleton(bool aEncoderOnly,
+ int aLoadMeasurementInterval,
+ int aAveragingMeasurements,
+ float aHighLoadThreshold,
+ float aLowLoadThreshold)
+ : mLock("LoadManager"),
+ mCurrentState(webrtc::kLoadNormal),
+ mOveruseActive(false),
+ mLoadSum(0.0f),
+ mLoadSumMeasurements(0),
+ mLoadMeasurementInterval(aLoadMeasurementInterval),
+ mAveragingMeasurements(aAveragingMeasurements),
+ mHighLoadThreshold(aHighLoadThreshold),
+ mLowLoadThreshold(aLowLoadThreshold)
+{
+ LOG(("LoadManager - Initializing (%dms x %d, %f, %f)",
+ mLoadMeasurementInterval, mAveragingMeasurements,
+ mHighLoadThreshold, mLowLoadThreshold));
+ MOZ_ASSERT(mHighLoadThreshold > mLowLoadThreshold);
+ if (!aEncoderOnly) {
+ mLoadMonitor = new LoadMonitor(mLoadMeasurementInterval);
+ mLoadMonitor->Init(mLoadMonitor);
+ mLoadMonitor->SetLoadChangeCallback(this);
+ }
+
+ mLastStateChange = TimeStamp::Now();
+ for (auto &in_state : mTimeInState) {
+ in_state = 0;
+ }
+}
+
+LoadManagerSingleton::~LoadManagerSingleton()
+{
+ LOG(("LoadManager: shutting down LoadMonitor"));
+ MOZ_ASSERT(!mLoadMonitor, "why wasn't the LoadMonitor shut down in xpcom-shutdown?");
+ if (mLoadMonitor) {
+ mLoadMonitor->Shutdown();
+ }
+}
+
+nsresult
+LoadManagerSingleton::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ NS_ASSERTION(NS_IsMainThread(), "Observer invoked off the main thread");
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+
+ if (!strcmp(aTopic, "xpcom-shutdown")) {
+ obs->RemoveObserver(this, "xpcom-shutdown");
+ {
+ MutexAutoLock lock(mLock);
+ mObservers.Clear();
+ }
+ if (mLoadMonitor) {
+ mLoadMonitor->Shutdown();
+ mLoadMonitor = nullptr;
+ }
+
+ LOG(("Releasing LoadManager singleton and thread"));
+ // Note: won't be released immediately as the Observer has a ref to us
+ sSingleton = nullptr;
+ }
+ return NS_OK;
+}
+
+void
+LoadManagerSingleton::LoadChanged(float aSystemLoad, float aProcesLoad)
+{
+ MutexAutoLock lock(mLock);
+ // Update total load, and total amount of measured seconds.
+ mLoadSum += aSystemLoad;
+ mLoadSumMeasurements++;
+
+ if (mLoadSumMeasurements >= mAveragingMeasurements) {
+ double averagedLoad = mLoadSum / (float)mLoadSumMeasurements;
+
+ webrtc::CPULoadState newState = mCurrentState;
+
+ if (mOveruseActive || averagedLoad > mHighLoadThreshold) {
+ LOG(("LoadManager - LoadStressed"));
+ newState = webrtc::kLoadStressed;
+ } else if (averagedLoad < mLowLoadThreshold) {
+ LOG(("LoadManager - LoadRelaxed"));
+ newState = webrtc::kLoadRelaxed;
+ } else {
+ LOG(("LoadManager - LoadNormal"));
+ newState = webrtc::kLoadNormal;
+ }
+
+ if (newState != mCurrentState) {
+ LoadHasChanged(newState);
+ }
+
+ mLoadSum = 0;
+ mLoadSumMeasurements = 0;
+ }
+}
+
+void
+LoadManagerSingleton::OveruseDetected()
+{
+ LOG(("LoadManager - Overuse Detected"));
+ MutexAutoLock lock(mLock);
+ mOveruseActive = true;
+ if (mCurrentState != webrtc::kLoadStressed) {
+ LoadHasChanged(webrtc::kLoadStressed);
+ }
+}
+
+void
+LoadManagerSingleton::NormalUsage()
+{
+ LOG(("LoadManager - Overuse finished"));
+ MutexAutoLock lock(mLock);
+ mOveruseActive = false;
+}
+
+void
+LoadManagerSingleton::LoadHasChanged(webrtc::CPULoadState aNewState)
+{
+ mLock.AssertCurrentThreadOwns();
+ LOG(("LoadManager - Signaling LoadHasChanged from %d to %d to %d listeners",
+ mCurrentState, aNewState, mObservers.Length()));
+
+ // Record how long we spent in this state for later Telemetry or display
+ TimeStamp now = TimeStamp::Now();
+ mTimeInState[mCurrentState] += (now - mLastStateChange).ToMilliseconds();
+ mLastStateChange = now;
+
+ mCurrentState = aNewState;
+ for (size_t i = 0; i < mObservers.Length(); i++) {
+ mObservers.ElementAt(i)->onLoadStateChanged(mCurrentState);
+ }
+}
+
+void
+LoadManagerSingleton::AddObserver(webrtc::CPULoadStateObserver * aObserver)
+{
+ LOG(("LoadManager - Adding Observer"));
+ MutexAutoLock lock(mLock);
+ mObservers.AppendElement(aObserver);
+}
+
+void
+LoadManagerSingleton::RemoveObserver(webrtc::CPULoadStateObserver * aObserver)
+{
+ LOG(("LoadManager - Removing Observer"));
+ MutexAutoLock lock(mLock);
+ if (!mObservers.RemoveElement(aObserver)) {
+ LOG(("LoadManager - Element to remove not found"));
+ }
+ if (mObservers.Length() == 0) {
+ // Record how long we spent in the final state for later Telemetry or display
+ TimeStamp now = TimeStamp::Now();
+ mTimeInState[mCurrentState] += (now - mLastStateChange).ToMilliseconds();
+
+ float total = 0;
+ for (size_t i = 0; i < MOZ_ARRAY_LENGTH(mTimeInState); i++) {
+ total += mTimeInState[i];
+ }
+ // Don't include short calls; we don't have reasonable load data, and
+ // such short calls rarely reach a stable state. Keep relatively
+ // short calls separate from longer ones
+ bool log = total > 5*PR_MSEC_PER_SEC;
+ bool small = log && total < 30*PR_MSEC_PER_SEC;
+ if (log) {
+ // Note: We don't care about rounding here; thus total may be < 100
+ Telemetry::Accumulate(small ? Telemetry::WEBRTC_LOAD_STATE_RELAXED_SHORT :
+ Telemetry::WEBRTC_LOAD_STATE_RELAXED,
+ (uint32_t) (mTimeInState[webrtc::CPULoadState::kLoadRelaxed]/total * 100));
+ Telemetry::Accumulate(small ? Telemetry::WEBRTC_LOAD_STATE_NORMAL_SHORT :
+ Telemetry::WEBRTC_LOAD_STATE_NORMAL,
+ (uint32_t) (mTimeInState[webrtc::CPULoadState::kLoadNormal]/total * 100));
+ Telemetry::Accumulate(small ? Telemetry::WEBRTC_LOAD_STATE_STRESSED_SHORT :
+ Telemetry::WEBRTC_LOAD_STATE_STRESSED,
+ (uint32_t) (mTimeInState[webrtc::CPULoadState::kLoadStressed]/total * 100));
+ }
+ for (auto &in_state : mTimeInState) {
+ in_state = 0;
+ }
+
+ if (mLoadMonitor) {
+ // Dance to avoid deadlock on mLock!
+ RefPtr<LoadMonitor> loadMonitor = mLoadMonitor.forget();
+ MutexAutoUnlock unlock(mLock);
+
+ loadMonitor->Shutdown();
+ }
+ }
+}
+
+
+}
diff --git a/dom/media/systemservices/LoadManager.h b/dom/media/systemservices/LoadManager.h
new file mode 100644
index 000000000..96824a308
--- /dev/null
+++ b/dom/media/systemservices/LoadManager.h
@@ -0,0 +1,111 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _LOADMANAGER_H_
+#define _LOADMANAGER_H_
+
+#include "LoadMonitor.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/TimeStamp.h"
+#include "mozilla/Services.h"
+#include "nsTArray.h"
+#include "nsIObserver.h"
+
+#include "webrtc/common_types.h"
+#include "webrtc/video_engine/include/vie_base.h"
+
+extern mozilla::LazyLogModule gLoadManagerLog;
+
+namespace mozilla {
+
+class LoadManagerSingleton : public LoadNotificationCallback,
+ public webrtc::CPULoadStateCallbackInvoker,
+ public webrtc::CpuOveruseObserver,
+ public nsIObserver
+
+{
+public:
+ static LoadManagerSingleton* Get();
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+ // LoadNotificationCallback interface
+ void LoadChanged(float aSystemLoad, float aProcessLoad) override;
+ // CpuOveruseObserver interface
+ // Called as soon as an overuse is detected.
+ void OveruseDetected() override;
+ // Called periodically when the system is not overused any longer.
+ void NormalUsage() override;
+ // CPULoadStateCallbackInvoker interface
+ void AddObserver(webrtc::CPULoadStateObserver * aObserver) override;
+ void RemoveObserver(webrtc::CPULoadStateObserver * aObserver) override;
+
+private:
+ LoadManagerSingleton(bool aEncoderOnly,
+ int aLoadMeasurementInterval,
+ int aAveragingMeasurements,
+ float aHighLoadThreshold,
+ float aLowLoadThreshold);
+ ~LoadManagerSingleton();
+
+ void LoadHasChanged(webrtc::CPULoadState aNewState);
+
+ RefPtr<LoadMonitor> mLoadMonitor;
+
+ // This protects access to the mObservers list, the current state, and
+ // pretty much all the other members (below).
+ Mutex mLock;
+ nsTArray<webrtc::CPULoadStateObserver*> mObservers;
+ webrtc::CPULoadState mCurrentState;
+ TimeStamp mLastStateChange;
+ float mTimeInState[static_cast<int>(webrtc::kLoadLast)];
+
+ // Set when overuse was signaled to us, and hasn't been un-signaled yet.
+ bool mOveruseActive;
+ float mLoadSum;
+ int mLoadSumMeasurements;
+ // Load measurement settings
+ int mLoadMeasurementInterval;
+ int mAveragingMeasurements;
+ float mHighLoadThreshold;
+ float mLowLoadThreshold;
+
+ static StaticRefPtr<LoadManagerSingleton> sSingleton;
+};
+
+class LoadManager final : public webrtc::CPULoadStateCallbackInvoker,
+ public webrtc::CpuOveruseObserver
+{
+public:
+ explicit LoadManager(LoadManagerSingleton* aManager)
+ : mManager(aManager)
+ {}
+ ~LoadManager() {}
+
+ void AddObserver(webrtc::CPULoadStateObserver * aObserver) override
+ {
+ mManager->AddObserver(aObserver);
+ }
+ void RemoveObserver(webrtc::CPULoadStateObserver * aObserver) override
+ {
+ mManager->RemoveObserver(aObserver);
+ }
+ void OveruseDetected() override
+ {
+ mManager->OveruseDetected();
+ }
+ void NormalUsage() override
+ {
+ mManager->NormalUsage();
+ }
+
+private:
+ RefPtr<LoadManagerSingleton> mManager;
+};
+
+} //namespace
+
+#endif /* _LOADMANAGER_H_ */
diff --git a/dom/media/systemservices/LoadManagerFactory.cpp b/dom/media/systemservices/LoadManagerFactory.cpp
new file mode 100644
index 000000000..be22a75fe
--- /dev/null
+++ b/dom/media/systemservices/LoadManagerFactory.cpp
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "LoadManager.h"
+#include "LoadManagerFactory.h"
+#include "MainThreadUtils.h"
+#include "nsIObserverService.h"
+
+#include "mozilla/Preferences.h"
+
+namespace mozilla {
+
+// Assume stored in an nsAutoPtr<>
+LoadManager *
+LoadManagerBuild(void)
+{
+ return new LoadManager(LoadManagerSingleton::Get());
+}
+
+/* static */ LoadManagerSingleton*
+LoadManagerSingleton::Get() {
+ if (!sSingleton) {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ bool loadEncoderOnly =
+ mozilla::Preferences::GetBool("media.navigator.load_adapt.encoder_only", true);
+ int loadMeasurementInterval =
+ mozilla::Preferences::GetInt("media.navigator.load_adapt.measure_interval", 1000);
+ int averagingSeconds =
+ mozilla::Preferences::GetInt("media.navigator.load_adapt.avg_seconds", 3);
+ float highLoadThreshold =
+ mozilla::Preferences::GetFloat("media.navigator.load_adapt.high_load", 0.90f);
+ float lowLoadThreshold =
+ mozilla::Preferences::GetFloat("media.navigator.load_adapt.low_load", 0.40f);
+
+ sSingleton = new LoadManagerSingleton(loadEncoderOnly,
+ loadMeasurementInterval,
+ averagingSeconds,
+ highLoadThreshold,
+ lowLoadThreshold);
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ obs->AddObserver(sSingleton, "xpcom-shutdown", false);
+ }
+ }
+ return sSingleton;
+}
+
+}; // namespace
diff --git a/dom/media/systemservices/LoadManagerFactory.h b/dom/media/systemservices/LoadManagerFactory.h
new file mode 100644
index 000000000..4868756f5
--- /dev/null
+++ b/dom/media/systemservices/LoadManagerFactory.h
@@ -0,0 +1,18 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _LOADMANAGERFACTORY_H_
+#define _LOADMANAGERFACTORY_H_
+
+namespace mozilla {
+
+class LoadManager;
+
+mozilla::LoadManager* LoadManagerBuild();
+void LoadManagerDestroy(mozilla::LoadManager* aLoadManager);
+
+} //namespace
+
+#endif /* _LOADMANAGERFACTORY_H_ */
diff --git a/dom/media/systemservices/LoadMonitor.cpp b/dom/media/systemservices/LoadMonitor.cpp
new file mode 100644
index 000000000..7a64c4fb0
--- /dev/null
+++ b/dom/media/systemservices/LoadMonitor.cpp
@@ -0,0 +1,658 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "LoadMonitor.h"
+#include "LoadManager.h"
+#include "nsString.h"
+#include "mozilla/Logging.h"
+#include "prtime.h"
+#include "prinrval.h"
+#include "prsystem.h"
+#include "prprf.h"
+
+#include "nsString.h"
+#include "nsThreadUtils.h"
+#include "nsReadableUtils.h"
+#include "nsNetUtil.h"
+#include "nsIInputStream.h"
+#include "nsIFile.h"
+#include "nsILineInputStream.h"
+#include "nsIObserverService.h"
+#include "nsIServiceManager.h"
+
+#include "mozilla/TimeStamp.h"
+#include "mozilla/Services.h"
+
+#ifdef XP_UNIX
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#endif
+
+#ifdef XP_MACOSX
+#include <mach/mach_host.h>
+#include <mach/mach_init.h>
+#include <mach/host_info.h>
+#endif
+
+#if defined(__DragonFly__) || defined(__FreeBSD__) \
+ || defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/sysctl.h>
+# if defined(__OpenBSD__)
+#define KERN_CP_TIME KERN_CPTIME
+# endif
+#endif
+
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/sched.h>
+#endif
+
+#ifdef XP_WIN
+#include <pdh.h>
+#include <tchar.h>
+#pragma comment(lib, "pdh.lib")
+#endif
+
+// MOZ_LOG=LoadManager:5
+#undef LOG
+#undef LOG_ENABLED
+#define LOG(args) MOZ_LOG(gLoadManagerLog, mozilla::LogLevel::Debug, args)
+#define LOG_ENABLED() MOZ_LOG_TEST(gLoadManagerLog, mozilla::LogLevel::Debug)
+#define LOG_MANY_ENABLED() MOZ_LOG_TEST(gLoadManagerLog, mozilla::LogLevel::Verbose)
+
+namespace mozilla {
+
+NS_IMPL_ISUPPORTS(LoadMonitor, nsIObserver)
+
+LoadMonitor::LoadMonitor(int aLoadUpdateInterval)
+ : mLoadUpdateInterval(aLoadUpdateInterval),
+ mLock("LoadMonitor.mLock"),
+ mCondVar(mLock, "LoadMonitor.mCondVar"),
+ mShutdownPending(false),
+ mLoadInfoThread(nullptr),
+ mSystemLoad(0.0f),
+ mProcessLoad(0.0f),
+ mLoadNotificationCallback(nullptr)
+{
+}
+
+LoadMonitor::~LoadMonitor()
+{
+ Shutdown();
+}
+
+NS_IMETHODIMP
+LoadMonitor::Observe(nsISupports* /* aSubject */,
+ const char* aTopic,
+ const char16_t* /* aData */)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");
+ MOZ_ASSERT(!strcmp("xpcom-shutdown-threads", aTopic), "Bad topic!");
+ Shutdown();
+ return NS_OK;
+}
+
+class LoadMonitorAddObserver : public Runnable
+{
+public:
+ explicit LoadMonitorAddObserver(RefPtr<LoadMonitor> loadMonitor)
+ {
+ mLoadMonitor = loadMonitor;
+ }
+
+ NS_IMETHOD Run() override
+ {
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+ if (!observerService)
+ return NS_ERROR_FAILURE;
+
+ nsresult rv = observerService->AddObserver(mLoadMonitor, "xpcom-shutdown-threads", false);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+ }
+
+private:
+ RefPtr<LoadMonitor> mLoadMonitor;
+};
+
+class LoadMonitorRemoveObserver : public Runnable
+{
+public:
+ explicit LoadMonitorRemoveObserver(RefPtr<LoadMonitor> loadMonitor)
+ {
+ mLoadMonitor = loadMonitor;
+ }
+
+ NS_IMETHOD Run() override
+ {
+ // remove xpcom shutdown observer
+ nsCOMPtr<nsIObserverService> observerService =
+ mozilla::services::GetObserverService();
+
+ if (observerService)
+ observerService->RemoveObserver(mLoadMonitor, "xpcom-shutdown-threads");
+
+ return NS_OK;
+ }
+
+private:
+ RefPtr<LoadMonitor> mLoadMonitor;
+};
+
+void LoadMonitor::Shutdown()
+{
+ if (mLoadInfoThread) {
+ {
+ MutexAutoLock lock(mLock);
+ LOG(("LoadMonitor: shutting down"));
+ mShutdownPending = true;
+ mCondVar.Notify();
+ }
+
+ // Note: can't just call ->Shutdown() from here; that spins the event
+ // loop here, causing re-entrancy issues if we're invoked from cycle
+ // collection. Argh.
+ mLoadInfoThread = nullptr;
+
+ RefPtr<LoadMonitorRemoveObserver> remObsRunner = new LoadMonitorRemoveObserver(this);
+ if (!NS_IsMainThread()) {
+ NS_DispatchToMainThread(remObsRunner);
+ } else {
+ remObsRunner->Run();
+ }
+ }
+}
+
+#ifdef XP_WIN
+static LPCTSTR TotalCounterPath = _T("\\Processor(_Total)\\% Processor Time");
+
+class WinProcMon
+{
+public:
+ WinProcMon():
+ mQuery(0), mCounter(0) {};
+ ~WinProcMon();
+ nsresult Init();
+ nsresult QuerySystemLoad(float* load_percent);
+ static const uint64_t TicksPerSec = 10000000; //100nsec tick (10MHz)
+private:
+ PDH_HQUERY mQuery;
+ PDH_HCOUNTER mCounter;
+};
+
+WinProcMon::~WinProcMon()
+{
+ if (mQuery != 0) {
+ PdhCloseQuery(mQuery);
+ mQuery = 0;
+ }
+}
+
+nsresult
+WinProcMon::Init()
+{
+ PDH_HQUERY query;
+ PDH_HCOUNTER counter;
+
+ // Get a query handle to the Performance Data Helper
+ PDH_STATUS status = PdhOpenQuery(
+ NULL, // No log file name: use real-time source
+ 0, // zero out user data token: unsued
+ &query);
+
+ if (status != ERROR_SUCCESS) {
+ LOG(("PdhOpenQuery error = %X", status));
+ return NS_ERROR_FAILURE;
+ }
+
+ // Add a pre-defined high performance counter to the query.
+ // This one is for the total CPU usage.
+ status = PdhAddCounter(query, TotalCounterPath, 0, &counter);
+
+ if (status != ERROR_SUCCESS) {
+ PdhCloseQuery(query);
+ LOG(("PdhAddCounter (_Total) error = %X", status));
+ return NS_ERROR_FAILURE;
+ }
+
+ // Need to make an initial query call to set up data capture.
+ status = PdhCollectQueryData(query);
+
+ if (status != ERROR_SUCCESS) {
+ PdhCloseQuery(query);
+ LOG(("PdhCollectQueryData (init) error = %X", status));
+ return NS_ERROR_FAILURE;
+ }
+
+ mQuery = query;
+ mCounter = counter;
+ return NS_OK;
+}
+
+nsresult WinProcMon::QuerySystemLoad(float* load_percent)
+{
+ *load_percent = 0;
+
+ if (mQuery == 0) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Update all counters associated with this query object.
+ PDH_STATUS status = PdhCollectQueryData(mQuery);
+
+ if (status != ERROR_SUCCESS) {
+ LOG(("PdhCollectQueryData error = %X", status));
+ return NS_ERROR_FAILURE;
+ }
+
+ PDH_FMT_COUNTERVALUE counter;
+ // maximum is 100% regardless of CPU core count.
+ status = PdhGetFormattedCounterValue(
+ mCounter,
+ PDH_FMT_DOUBLE,
+ (LPDWORD)NULL,
+ &counter);
+
+ if (ERROR_SUCCESS != status ||
+ // There are multiple success return values.
+ !IsSuccessSeverity(counter.CStatus)) {
+ LOG(("PdhGetFormattedCounterValue error"));
+ return NS_ERROR_FAILURE;
+ }
+
+ // The result is a percent value, reduce to match expected scale.
+ *load_percent = (float)(counter.doubleValue / 100.0f);
+ return NS_OK;
+}
+#endif
+
+// Use a non-generic class name, because otherwise we can get name collisions
+// with other classes in the codebase. The normal way of dealing with that is
+// to put the class in an anonymous namespace, but this class is used as a
+// member of RTCLoadInfo, which can't be in the anonymous namespace, so it also
+// can't be in an anonymous namespace: gcc warns about that setup and this
+// directory is fail-on-warnings.
+class RTCLoadStats
+{
+public:
+ RTCLoadStats() :
+ mPrevTotalTimes(0),
+ mPrevCpuTimes(0),
+ mPrevLoad(0) {};
+
+ double GetLoad() { return (double)mPrevLoad; };
+
+ uint64_t mPrevTotalTimes;
+ uint64_t mPrevCpuTimes;
+ float mPrevLoad; // Previous load value.
+};
+
+// Use a non-generic class name, because otherwise we can get name collisions
+// with other classes in the codebase. The normal way of dealing with that is
+// to put the class in an anonymous namespace, but this class is used as a
+// member of LoadInfoCollectRunner, which can't be in the anonymous namespace,
+// so it also can't be in an anonymous namespace: gcc warns about that setup
+// and this directory is fail-on-warnings.
+class RTCLoadInfo final
+{
+private:
+ ~RTCLoadInfo() {}
+
+public:
+ NS_INLINE_DECL_REFCOUNTING(RTCLoadInfo)
+
+ RTCLoadInfo(): mLoadUpdateInterval(0) {};
+ nsresult Init(int aLoadUpdateInterval);
+ double GetSystemLoad() { return mSystemLoad.GetLoad(); };
+ double GetProcessLoad() { return mProcessLoad.GetLoad(); };
+ nsresult UpdateSystemLoad();
+ nsresult UpdateProcessLoad();
+
+private:
+ void UpdateCpuLoad(uint64_t ticks_per_interval,
+ uint64_t current_total_times,
+ uint64_t current_cpu_times,
+ RTCLoadStats* loadStat);
+#ifdef XP_WIN
+ WinProcMon mSysMon;
+ HANDLE mProcHandle;
+ int mNumProcessors;
+#endif
+ RTCLoadStats mSystemLoad;
+ RTCLoadStats mProcessLoad;
+ uint64_t mTicksPerInterval;
+ int mLoadUpdateInterval;
+};
+
+nsresult RTCLoadInfo::Init(int aLoadUpdateInterval)
+{
+ mLoadUpdateInterval = aLoadUpdateInterval;
+#ifdef XP_WIN
+ mTicksPerInterval = (WinProcMon::TicksPerSec /*Hz*/
+ * mLoadUpdateInterval /*msec*/) / 1000 ;
+ mNumProcessors = PR_GetNumberOfProcessors();
+ mProcHandle = GetCurrentProcess();
+ return mSysMon.Init();
+#else
+ mTicksPerInterval = (sysconf(_SC_CLK_TCK) * mLoadUpdateInterval) / 1000;
+ return NS_OK;
+#endif
+}
+
+void RTCLoadInfo::UpdateCpuLoad(uint64_t ticks_per_interval,
+ uint64_t current_total_times,
+ uint64_t current_cpu_times,
+ RTCLoadStats *loadStat) {
+ // Check if we get an inconsistent number of ticks.
+ if (((current_total_times - loadStat->mPrevTotalTimes)
+ > (ticks_per_interval * 10))
+ || current_total_times < loadStat->mPrevTotalTimes
+ || current_cpu_times < loadStat->mPrevCpuTimes) {
+ // Bug at least on the Nexus 4 and Galaxy S4
+ // https://code.google.com/p/android/issues/detail?id=41630
+ // We do need to update our previous times, or we can get stuck
+ // when there is a blip upwards and then we get a bunch of consecutive
+ // lower times. Just skip the load calculation.
+ LOG(("Inconsistent time values are passed. ignored"));
+ // Try to recover next tick
+ loadStat->mPrevTotalTimes = current_total_times;
+ loadStat->mPrevCpuTimes = current_cpu_times;
+ return;
+ }
+
+ const uint64_t cpu_diff = current_cpu_times - loadStat->mPrevCpuTimes;
+ const uint64_t total_diff = current_total_times - loadStat->mPrevTotalTimes;
+ if (total_diff > 0) {
+#ifdef XP_WIN
+ float result = (float)cpu_diff / (float)total_diff/ (float)mNumProcessors;
+#else
+ float result = (float)cpu_diff / (float)total_diff;
+#endif
+ loadStat->mPrevLoad = result;
+ }
+ loadStat->mPrevTotalTimes = current_total_times;
+ loadStat->mPrevCpuTimes = current_cpu_times;
+}
+
+nsresult RTCLoadInfo::UpdateSystemLoad()
+{
+#if defined(LINUX) || defined(ANDROID)
+ nsCOMPtr<nsIFile> procStatFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID);
+ procStatFile->InitWithPath(NS_LITERAL_STRING("/proc/stat"));
+
+ nsCOMPtr<nsIInputStream> fileInputStream;
+ nsresult rv = NS_NewLocalFileInputStream(getter_AddRefs(fileInputStream),
+ procStatFile);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsILineInputStream> lineInputStream = do_QueryInterface(fileInputStream, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsAutoCString buffer;
+ bool isMore = true;
+ lineInputStream->ReadLine(buffer, &isMore);
+
+ uint64_t user;
+ uint64_t nice;
+ uint64_t system;
+ uint64_t idle;
+ if (PR_sscanf(buffer.get(), "cpu %llu %llu %llu %llu",
+ &user, &nice,
+ &system, &idle) != 4) {
+ LOG(("Error parsing /proc/stat"));
+ return NS_ERROR_FAILURE;
+ }
+
+ const uint64_t cpu_times = nice + system + user;
+ const uint64_t total_times = cpu_times + idle;
+
+ UpdateCpuLoad(mTicksPerInterval,
+ total_times,
+ cpu_times,
+ &mSystemLoad);
+ return NS_OK;
+#elif defined(XP_MACOSX)
+ mach_msg_type_number_t info_cnt = HOST_CPU_LOAD_INFO_COUNT;
+ host_cpu_load_info_data_t load_info;
+ kern_return_t rv = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO,
+ (host_info_t)(&load_info), &info_cnt);
+
+ if (rv != KERN_SUCCESS || info_cnt != HOST_CPU_LOAD_INFO_COUNT) {
+ LOG(("Error from mach/host_statistics call"));
+ return NS_ERROR_FAILURE;
+ }
+
+ const uint64_t cpu_times = load_info.cpu_ticks[CPU_STATE_NICE]
+ + load_info.cpu_ticks[CPU_STATE_SYSTEM]
+ + load_info.cpu_ticks[CPU_STATE_USER];
+ const uint64_t total_times = cpu_times + load_info.cpu_ticks[CPU_STATE_IDLE];
+
+ UpdateCpuLoad(mTicksPerInterval,
+ total_times,
+ cpu_times,
+ &mSystemLoad);
+ return NS_OK;
+#elif defined(__DragonFly__) || defined(__FreeBSD__) \
+ || defined(__NetBSD__) || defined(__OpenBSD__)
+#if defined(__NetBSD__)
+ uint64_t cp_time[CPUSTATES];
+#else
+ long cp_time[CPUSTATES];
+#endif // __NetBSD__
+ size_t sz = sizeof(cp_time);
+#ifdef KERN_CP_TIME
+ int mib[] = {
+ CTL_KERN,
+ KERN_CP_TIME,
+ };
+ u_int miblen = sizeof(mib) / sizeof(mib[0]);
+ if (sysctl(mib, miblen, &cp_time, &sz, nullptr, 0)) {
+#else
+ if (sysctlbyname("kern.cp_time", &cp_time, &sz, nullptr, 0)) {
+#endif // KERN_CP_TIME
+ LOG(("sysctl kern.cp_time failed"));
+ return NS_ERROR_FAILURE;
+ }
+
+ const uint64_t cpu_times = cp_time[CP_NICE]
+ + cp_time[CP_SYS]
+ + cp_time[CP_INTR]
+ + cp_time[CP_USER];
+ const uint64_t total_times = cpu_times + cp_time[CP_IDLE];
+
+ UpdateCpuLoad(mTicksPerInterval,
+ total_times,
+ cpu_times,
+ &mSystemLoad);
+ return NS_OK;
+#elif defined(XP_WIN)
+ float load;
+ nsresult rv = mSysMon.QuerySystemLoad(&load);
+
+ if (rv == NS_OK) {
+ mSystemLoad.mPrevLoad = load;
+ }
+
+ return rv;
+#else
+ // Not implemented
+ return NS_OK;
+#endif
+}
+
+nsresult RTCLoadInfo::UpdateProcessLoad() {
+#if defined(XP_UNIX)
+ struct timeval tv;
+ gettimeofday(&tv, nullptr);
+ const uint64_t total_times = tv.tv_sec * PR_USEC_PER_SEC + tv.tv_usec;
+
+ rusage usage;
+ if (getrusage(RUSAGE_SELF, &usage) < 0) {
+ LOG(("getrusage failed"));
+ return NS_ERROR_FAILURE;
+ }
+
+ const uint64_t cpu_times =
+ (usage.ru_utime.tv_sec + usage.ru_stime.tv_sec) * PR_USEC_PER_SEC +
+ usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
+
+ UpdateCpuLoad(PR_USEC_PER_MSEC * mLoadUpdateInterval,
+ total_times,
+ cpu_times,
+ &mProcessLoad);
+#elif defined(XP_WIN)
+ FILETIME clk_time, sys_time, user_time;
+ uint64_t total_times, cpu_times;
+
+ GetSystemTimeAsFileTime(&clk_time);
+ total_times = (((uint64_t)clk_time.dwHighDateTime) << 32)
+ + (uint64_t)clk_time.dwLowDateTime;
+ BOOL ok = GetProcessTimes(mProcHandle, &clk_time, &clk_time, &sys_time, &user_time);
+
+ if (ok == 0) {
+ return NS_ERROR_FAILURE;
+ }
+
+ cpu_times = (((uint64_t)sys_time.dwHighDateTime
+ + (uint64_t)user_time.dwHighDateTime) << 32)
+ + (uint64_t)sys_time.dwLowDateTime
+ + (uint64_t)user_time.dwLowDateTime;
+
+ UpdateCpuLoad(mTicksPerInterval,
+ total_times,
+ cpu_times,
+ &mProcessLoad);
+#endif
+ return NS_OK;
+}
+
+// Note: This class can't be in the anonymous namespace, because then we can't
+// declare it as a friend of LoadMonitor.
+class LoadInfoCollectRunner : public Runnable
+{
+public:
+ LoadInfoCollectRunner(RefPtr<LoadMonitor> loadMonitor,
+ RefPtr<RTCLoadInfo> loadInfo,
+ nsIThread *loadInfoThread)
+ : mThread(loadInfoThread),
+ mLoadUpdateInterval(loadMonitor->mLoadUpdateInterval),
+ mLoadNoiseCounter(0)
+ {
+ mLoadMonitor = loadMonitor;
+ mLoadInfo = loadInfo;
+ }
+
+ NS_IMETHOD Run() override
+ {
+ if (NS_IsMainThread()) {
+ if (mThread) {
+ // Don't leak threads!
+ mThread->Shutdown(); // can't Shutdown from the thread itself, darn
+ // Don't null out mThread!
+ // See bug 999104. We must hold a ref to the thread across Dispatch()
+ // since the internal mThread ref could be released while processing
+ // the Dispatch(), and Dispatch/PutEvent itself doesn't hold a ref; it
+ // assumes the caller does.
+ }
+ return NS_OK;
+ }
+
+ MutexAutoLock lock(mLoadMonitor->mLock);
+ while (!mLoadMonitor->mShutdownPending) {
+ mLoadInfo->UpdateSystemLoad();
+ mLoadInfo->UpdateProcessLoad();
+ float sysLoad = mLoadInfo->GetSystemLoad();
+ float procLoad = mLoadInfo->GetProcessLoad();
+
+ if ((++mLoadNoiseCounter % (LOG_MANY_ENABLED() ? 1 : 10)) == 0) {
+ LOG(("System Load: %f Process Load: %f", sysLoad, procLoad));
+ mLoadNoiseCounter = 0;
+ }
+ mLoadMonitor->SetSystemLoad(sysLoad);
+ mLoadMonitor->SetProcessLoad(procLoad);
+ mLoadMonitor->FireCallbacks();
+
+ mLoadMonitor->mCondVar.Wait(PR_MillisecondsToInterval(mLoadUpdateInterval));
+ }
+ // ok, we need to exit safely and can't shut ourselves down (DARN)
+ NS_DispatchToMainThread(this);
+ return NS_OK;
+ }
+
+private:
+ nsCOMPtr<nsIThread> mThread;
+ RefPtr<RTCLoadInfo> mLoadInfo;
+ RefPtr<LoadMonitor> mLoadMonitor;
+ int mLoadUpdateInterval;
+ int mLoadNoiseCounter;
+};
+
+void
+LoadMonitor::SetProcessLoad(float load) {
+ mLock.AssertCurrentThreadOwns();
+ mProcessLoad = load;
+}
+
+void
+LoadMonitor::SetSystemLoad(float load) {
+ mLock.AssertCurrentThreadOwns();
+ mSystemLoad = load;
+}
+
+float
+LoadMonitor::GetProcessLoad() {
+ MutexAutoLock lock(mLock);
+ float load = mProcessLoad;
+ return load;
+}
+
+void
+LoadMonitor::FireCallbacks() {
+ if (mLoadNotificationCallback) {
+ mLoadNotificationCallback->LoadChanged(mSystemLoad, mProcessLoad);
+ }
+}
+
+float
+LoadMonitor::GetSystemLoad() {
+ MutexAutoLock lock(mLock);
+ float load = mSystemLoad;
+ return load;
+}
+
+nsresult
+LoadMonitor::Init(RefPtr<LoadMonitor> &self)
+{
+ LOG(("Initializing LoadMonitor"));
+
+ RefPtr<RTCLoadInfo> load_info = new RTCLoadInfo();
+ nsresult rv = load_info->Init(mLoadUpdateInterval);
+
+ if (NS_FAILED(rv)) {
+ LOG(("RTCLoadInfo::Init error"));
+ return rv;
+ }
+
+ RefPtr<LoadMonitorAddObserver> addObsRunner = new LoadMonitorAddObserver(self);
+ NS_DispatchToMainThread(addObsRunner);
+
+ NS_NewNamedThread("Sys Load Info", getter_AddRefs(mLoadInfoThread));
+
+ RefPtr<LoadInfoCollectRunner> runner =
+ new LoadInfoCollectRunner(self, load_info, mLoadInfoThread);
+ mLoadInfoThread->Dispatch(runner, NS_DISPATCH_NORMAL);
+
+ return NS_OK;
+}
+
+void
+LoadMonitor::SetLoadChangeCallback(LoadNotificationCallback* aCallback)
+{
+ mLoadNotificationCallback = aCallback;
+}
+
+}
diff --git a/dom/media/systemservices/LoadMonitor.h b/dom/media/systemservices/LoadMonitor.h
new file mode 100644
index 000000000..3731b97dc
--- /dev/null
+++ b/dom/media/systemservices/LoadMonitor.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _LOADMONITOR_H_
+#define _LOADMONITOR_H_
+
+#include "mozilla/Mutex.h"
+#include "mozilla/CondVar.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/Atomics.h"
+#include "nsCOMPtr.h"
+#include "nsIThread.h"
+#include "nsIObserver.h"
+
+namespace mozilla {
+class LoadInfoCollectRunner;
+
+class LoadNotificationCallback
+{
+public:
+ virtual void LoadChanged(float aSystemLoad, float aProcessLoad) = 0;
+};
+
+class LoadMonitor final : public nsIObserver
+{
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+ explicit LoadMonitor(int aLoadUpdateInterval);
+
+ nsresult Init(RefPtr<LoadMonitor> &self);
+ void SetLoadChangeCallback(LoadNotificationCallback* aCallback);
+ void Shutdown();
+ float GetSystemLoad();
+ float GetProcessLoad();
+
+ friend class LoadInfoCollectRunner;
+
+private:
+ ~LoadMonitor();
+
+ void SetProcessLoad(float load);
+ void SetSystemLoad(float load);
+ void FireCallbacks();
+
+ int mLoadUpdateInterval;
+ mozilla::Mutex mLock;
+ mozilla::CondVar mCondVar;
+ bool mShutdownPending;
+ nsCOMPtr<nsIThread> mLoadInfoThread;
+ float mSystemLoad;
+ float mProcessLoad;
+ LoadNotificationCallback* mLoadNotificationCallback;
+};
+
+} //namespace
+
+#endif /* _LOADMONITOR_H_ */
diff --git a/dom/media/systemservices/MediaChild.cpp b/dom/media/systemservices/MediaChild.cpp
new file mode 100644
index 000000000..327ea3c4a
--- /dev/null
+++ b/dom/media/systemservices/MediaChild.cpp
@@ -0,0 +1,115 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaChild.h"
+#include "MediaParent.h"
+
+#include "nsGlobalWindow.h"
+#include "mozilla/MediaManager.h"
+#include "mozilla/Logging.h"
+#include "nsQueryObject.h"
+
+#undef LOG
+mozilla::LazyLogModule gMediaChildLog("MediaChild");
+#define LOG(args) MOZ_LOG(gMediaChildLog, mozilla::LogLevel::Debug, args)
+
+namespace mozilla {
+namespace media {
+
+already_AddRefed<Pledge<nsCString>>
+GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing, bool aPersist)
+{
+ RefPtr<MediaManager> mgr = MediaManager::GetInstance();
+ MOZ_ASSERT(mgr);
+
+ RefPtr<Pledge<nsCString>> p = new Pledge<nsCString>();
+ uint32_t id = mgr->mGetOriginKeyPledges.Append(*p);
+
+ if (XRE_GetProcessType() == GeckoProcessType_Default) {
+ mgr->GetNonE10sParent()->RecvGetOriginKey(id, aOrigin, aPrivateBrowsing,
+ aPersist);
+ } else {
+ Child::Get()->SendGetOriginKey(id, aOrigin, aPrivateBrowsing, aPersist);
+ }
+ return p.forget();
+}
+
+void
+SanitizeOriginKeys(const uint64_t& aSinceWhen, bool aOnlyPrivateBrowsing)
+{
+ LOG(("SanitizeOriginKeys since %llu %s", aSinceWhen,
+ (aOnlyPrivateBrowsing? "in Private Browsing." : ".")));
+
+ if (XRE_GetProcessType() == GeckoProcessType_Default) {
+ // Avoid opening MediaManager in this case, since this is called by
+ // sanitize.js when cookies are cleared, which can happen on startup.
+ RefPtr<Parent<NonE10s>> tmpParent = new Parent<NonE10s>();
+ tmpParent->RecvSanitizeOriginKeys(aSinceWhen, aOnlyPrivateBrowsing);
+ } else {
+ Child::Get()->SendSanitizeOriginKeys(aSinceWhen, aOnlyPrivateBrowsing);
+ }
+}
+
+static Child* sChild;
+
+Child* Child::Get()
+{
+ MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_Content);
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!sChild) {
+ sChild = static_cast<Child*>(dom::ContentChild::GetSingleton()->SendPMediaConstructor());
+ }
+ return sChild;
+}
+
+Child::Child()
+ : mActorDestroyed(false)
+{
+ LOG(("media::Child: %p", this));
+ MOZ_COUNT_CTOR(Child);
+}
+
+Child::~Child()
+{
+ LOG(("~media::Child: %p", this));
+ sChild = nullptr;
+ MOZ_COUNT_DTOR(Child);
+}
+
+void Child::ActorDestroy(ActorDestroyReason aWhy)
+{
+ mActorDestroyed = true;
+}
+
+bool
+Child::RecvGetOriginKeyResponse(const uint32_t& aRequestId, const nsCString& aKey)
+{
+ RefPtr<MediaManager> mgr = MediaManager::GetInstance();
+ if (!mgr) {
+ return false;
+ }
+ RefPtr<Pledge<nsCString>> pledge = mgr->mGetOriginKeyPledges.Remove(aRequestId);
+ if (pledge) {
+ pledge->Resolve(aKey);
+ }
+ return true;
+}
+
+PMediaChild*
+AllocPMediaChild()
+{
+ return new Child();
+}
+
+bool
+DeallocPMediaChild(media::PMediaChild *aActor)
+{
+ delete static_cast<Child*>(aActor);
+ return true;
+}
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaChild.h b/dom/media/systemservices/MediaChild.h
new file mode 100644
index 000000000..b013c4a5f
--- /dev/null
+++ b/dom/media/systemservices/MediaChild.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_MediaChild_h
+#define mozilla_MediaChild_h
+
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/media/PMediaChild.h"
+#include "mozilla/media/PMediaParent.h"
+#include "MediaUtils.h"
+
+namespace mozilla {
+namespace media {
+
+// media::Child implements proxying to the chrome process for some media-related
+// functions, for the moment just:
+//
+// GetOriginKey() - get a cookie-like persisted unique key for a given origin.
+// SanitizeOriginKeys() - reset persisted unique keys.
+
+// GetOriginKey and SanitizeOriginKeys are asynchronous APIs that return pledges
+// (promise-like objects) with the future value. Use pledge.Then(func) to access.
+
+already_AddRefed<Pledge<nsCString>>
+GetOriginKey(const nsCString& aOrigin, bool aPrivateBrowsing, bool aPersist);
+
+void
+SanitizeOriginKeys(const uint64_t& aSinceWhen, bool aOnlyPrivateBrowsing);
+
+class Child : public PMediaChild
+{
+public:
+ static Child* Get();
+
+ Child();
+
+ bool RecvGetOriginKeyResponse(const uint32_t& aRequestId, const nsCString& aKey) override;
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+ virtual ~Child();
+private:
+
+ bool mActorDestroyed;
+};
+
+PMediaChild* AllocPMediaChild();
+bool DeallocPMediaChild(PMediaChild *aActor);
+
+} // namespace media
+} // namespace mozilla
+
+#endif // mozilla_MediaChild_h
diff --git a/dom/media/systemservices/MediaParent.cpp b/dom/media/systemservices/MediaParent.cpp
new file mode 100644
index 000000000..109a44a28
--- /dev/null
+++ b/dom/media/systemservices/MediaParent.cpp
@@ -0,0 +1,516 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaParent.h"
+
+#include "mozilla/Base64.h"
+#include <mozilla/StaticMutex.h>
+
+#include "MediaUtils.h"
+#include "MediaEngine.h"
+#include "VideoUtils.h"
+#include "nsAutoPtr.h"
+#include "nsThreadUtils.h"
+#include "nsNetCID.h"
+#include "nsNetUtil.h"
+#include "nsIInputStream.h"
+#include "nsILineInputStream.h"
+#include "nsIOutputStream.h"
+#include "nsISafeOutputStream.h"
+#include "nsAppDirectoryServiceDefs.h"
+#include "nsISupportsImpl.h"
+#include "mozilla/Logging.h"
+
+#undef LOG
+mozilla::LazyLogModule gMediaParentLog("MediaParent");
+#define LOG(args) MOZ_LOG(gMediaParentLog, mozilla::LogLevel::Debug, args)
+
+// A file in the profile dir is used to persist mOriginKeys used to anonymize
+// deviceIds to be unique per origin, to avoid them being supercookies.
+
+#define ORIGINKEYS_FILE "enumerate_devices.txt"
+#define ORIGINKEYS_VERSION "1"
+
+namespace mozilla {
+namespace media {
+
+static OriginKeyStore* sOriginKeyStore = nullptr;
+
+class OriginKeyStore : public nsISupports
+{
+ NS_DECL_THREADSAFE_ISUPPORTS
+ class OriginKey
+ {
+ public:
+ static const size_t DecodedLength = 18;
+ static const size_t EncodedLength = DecodedLength * 4 / 3;
+
+ explicit OriginKey(const nsACString& aKey, int64_t aSecondsStamp = 0) // 0 = temporal
+ : mKey(aKey)
+ , mSecondsStamp(aSecondsStamp) {}
+
+ nsCString mKey; // Base64 encoded.
+ int64_t mSecondsStamp;
+ };
+
+ class OriginKeysTable
+ {
+ public:
+ OriginKeysTable() : mPersistCount(0) {}
+
+ nsresult
+ GetOriginKey(const nsACString& aOrigin, nsCString& aResult, bool aPersist = false)
+ {
+ OriginKey* key;
+ if (!mKeys.Get(aOrigin, &key)) {
+ nsCString salt; // Make a new one
+ nsresult rv = GenerateRandomName(salt, key->EncodedLength);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ key = new OriginKey(salt);
+ mKeys.Put(aOrigin, key);
+ }
+ if (aPersist && !key->mSecondsStamp) {
+ key->mSecondsStamp = PR_Now() / PR_USEC_PER_SEC;
+ mPersistCount++;
+ }
+ aResult = key->mKey;
+ return NS_OK;
+ }
+
+ void Clear(int64_t aSinceWhen)
+ {
+ // Avoid int64_t* <-> void* casting offset
+ OriginKey since(nsCString(), aSinceWhen / PR_USEC_PER_SEC);
+ for (auto iter = mKeys.Iter(); !iter.Done(); iter.Next()) {
+ nsAutoPtr<OriginKey>& originKey = iter.Data();
+ LOG((((originKey->mSecondsStamp >= since.mSecondsStamp)?
+ "%s: REMOVE %lld >= %lld" :
+ "%s: KEEP %lld < %lld"),
+ __FUNCTION__, originKey->mSecondsStamp, since.mSecondsStamp));
+
+ if (originKey->mSecondsStamp >= since.mSecondsStamp) {
+ iter.Remove();
+ }
+ }
+ mPersistCount = 0;
+ }
+
+ protected:
+ nsClassHashtable<nsCStringHashKey, OriginKey> mKeys;
+ size_t mPersistCount;
+ };
+
+ class OriginKeysLoader : public OriginKeysTable
+ {
+ public:
+ OriginKeysLoader() {}
+
+ nsresult
+ GetOriginKey(const nsACString& aOrigin, nsCString& aResult, bool aPersist)
+ {
+ auto before = mPersistCount;
+ OriginKeysTable::GetOriginKey(aOrigin, aResult, aPersist);
+ if (mPersistCount != before) {
+ Save();
+ }
+ return NS_OK;
+ }
+
+ already_AddRefed<nsIFile>
+ GetFile()
+ {
+ MOZ_ASSERT(mProfileDir);
+ nsCOMPtr<nsIFile> file;
+ nsresult rv = mProfileDir->Clone(getter_AddRefs(file));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return nullptr;
+ }
+ file->Append(NS_LITERAL_STRING(ORIGINKEYS_FILE));
+ return file.forget();
+ }
+
+ // Format of file is key secondsstamp origin (first line is version #):
+ //
+ // 1
+ // rOMAAbFujNwKyIpj4RJ3Wt5Q 1424733961 http://fiddle.jshell.net
+ // rOMAAbFujNwKyIpj4RJ3Wt5Q 1424734841 http://mozilla.github.io
+ // etc.
+
+ nsresult Read()
+ {
+ nsCOMPtr<nsIFile> file = GetFile();
+ if (NS_WARN_IF(!file)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ bool exists;
+ nsresult rv = file->Exists(&exists);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ if (!exists) {
+ return NS_OK;
+ }
+
+ nsCOMPtr<nsIInputStream> stream;
+ rv = NS_NewLocalFileInputStream(getter_AddRefs(stream), file);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ nsCOMPtr<nsILineInputStream> i = do_QueryInterface(stream);
+ MOZ_ASSERT(i);
+ MOZ_ASSERT(!mPersistCount);
+
+ nsCString line;
+ bool hasMoreLines;
+ rv = i->ReadLine(line, &hasMoreLines);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ if (!line.EqualsLiteral(ORIGINKEYS_VERSION)) {
+ // If version on disk is newer than we can understand then ignore it.
+ return NS_OK;
+ }
+
+ while (hasMoreLines) {
+ rv = i->ReadLine(line, &hasMoreLines);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ // Read key secondsstamp origin.
+ // Ignore any lines that don't fit format in the comment above exactly.
+ int32_t f = line.FindChar(' ');
+ if (f < 0) {
+ continue;
+ }
+ const nsACString& key = Substring(line, 0, f);
+ const nsACString& s = Substring(line, f+1);
+ f = s.FindChar(' ');
+ if (f < 0) {
+ continue;
+ }
+ int64_t secondsstamp = nsCString(Substring(s, 0, f)).ToInteger64(&rv);
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+ const nsACString& origin = Substring(s, f+1);
+
+ // Validate key
+ if (key.Length() != OriginKey::EncodedLength) {
+ continue;
+ }
+ nsCString dummy;
+ rv = Base64Decode(key, dummy);
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+ mKeys.Put(origin, new OriginKey(key, secondsstamp));
+ }
+ mPersistCount = mKeys.Count();
+ return NS_OK;
+ }
+
+ nsresult
+ Write()
+ {
+ nsCOMPtr<nsIFile> file = GetFile();
+ if (NS_WARN_IF(!file)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ nsCOMPtr<nsIOutputStream> stream;
+ nsresult rv = NS_NewSafeLocalFileOutputStream(getter_AddRefs(stream), file);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ nsAutoCString versionBuffer;
+ versionBuffer.AppendLiteral(ORIGINKEYS_VERSION);
+ versionBuffer.Append('\n');
+
+ uint32_t count;
+ rv = stream->Write(versionBuffer.Data(), versionBuffer.Length(), &count);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ if (count != versionBuffer.Length()) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ for (auto iter = mKeys.Iter(); !iter.Done(); iter.Next()) {
+ const nsACString& origin = iter.Key();
+ OriginKey* originKey = iter.UserData();
+
+ if (!originKey->mSecondsStamp) {
+ continue; // don't write temporal ones
+ }
+
+ nsCString originBuffer;
+ originBuffer.Append(originKey->mKey);
+ originBuffer.Append(' ');
+ originBuffer.AppendInt(originKey->mSecondsStamp);
+ originBuffer.Append(' ');
+ originBuffer.Append(origin);
+ originBuffer.Append('\n');
+
+ rv = stream->Write(originBuffer.Data(), originBuffer.Length(), &count);
+ if (NS_WARN_IF(NS_FAILED(rv)) || count != originBuffer.Length()) {
+ break;
+ }
+ }
+
+ nsCOMPtr<nsISafeOutputStream> safeStream = do_QueryInterface(stream);
+ MOZ_ASSERT(safeStream);
+
+ rv = safeStream->Finish();
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ return NS_OK;
+ }
+
+ nsresult Load()
+ {
+ nsresult rv = Read();
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ Delete();
+ }
+ return rv;
+ }
+
+ nsresult Save()
+ {
+ nsresult rv = Write();
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ NS_WARNING("Failed to write data for EnumerateDevices id-persistence.");
+ Delete();
+ }
+ return rv;
+ }
+
+ void Clear(int64_t aSinceWhen)
+ {
+ OriginKeysTable::Clear(aSinceWhen);
+ Delete();
+ Save();
+ }
+
+ nsresult Delete()
+ {
+ nsCOMPtr<nsIFile> file = GetFile();
+ if (NS_WARN_IF(!file)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ nsresult rv = file->Remove(false);
+ if (rv == NS_ERROR_FILE_NOT_FOUND) {
+ return NS_OK;
+ }
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ return NS_OK;
+ }
+
+ void
+ SetProfileDir(nsIFile* aProfileDir)
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ bool first = !mProfileDir;
+ mProfileDir = aProfileDir;
+ // Load from disk when we first get a profileDir, but not subsequently.
+ if (first) {
+ Load();
+ }
+ }
+ private:
+ nsCOMPtr<nsIFile> mProfileDir;
+ };
+
+private:
+ virtual ~OriginKeyStore()
+ {
+ sOriginKeyStore = nullptr;
+ LOG((__FUNCTION__));
+ }
+
+public:
+ static OriginKeyStore* Get()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!sOriginKeyStore) {
+ sOriginKeyStore = new OriginKeyStore();
+ }
+ return sOriginKeyStore;
+ }
+
+ // Only accessed on StreamTS thread
+ OriginKeysLoader mOriginKeys;
+ OriginKeysTable mPrivateBrowsingOriginKeys;
+};
+
+NS_IMPL_ISUPPORTS0(OriginKeyStore)
+
+bool NonE10s::SendGetOriginKeyResponse(const uint32_t& aRequestId,
+ nsCString aKey) {
+ MediaManager* mgr = MediaManager::GetIfExists();
+ if (!mgr) {
+ return false;
+ }
+ RefPtr<Pledge<nsCString>> pledge = mgr->mGetOriginKeyPledges.Remove(aRequestId);
+ if (pledge) {
+ pledge->Resolve(aKey);
+ }
+ return true;
+}
+
+template<class Super> bool
+Parent<Super>::RecvGetOriginKey(const uint32_t& aRequestId,
+ const nsCString& aOrigin,
+ const bool& aPrivateBrowsing,
+ const bool& aPersist)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // First, get profile dir.
+
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIFile> profileDir;
+ nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
+ getter_AddRefs(profileDir));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+
+ // Then over to stream-transport thread to do the actual file io.
+ // Stash a pledge to hold the answer and get an id for this request.
+
+ RefPtr<Pledge<nsCString>> p = new Pledge<nsCString>();
+ uint32_t id = mOutstandingPledges.Append(*p);
+
+ nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
+ MOZ_ASSERT(sts);
+ RefPtr<Parent<Super>> that(this);
+
+ rv = sts->Dispatch(NewRunnableFrom([this, that, id, profileDir, aOrigin,
+ aPrivateBrowsing, aPersist]() -> nsresult {
+ MOZ_ASSERT(!NS_IsMainThread());
+ mOriginKeyStore->mOriginKeys.SetProfileDir(profileDir);
+ nsCString result;
+ if (aPrivateBrowsing) {
+ mOriginKeyStore->mPrivateBrowsingOriginKeys.GetOriginKey(aOrigin, result);
+ } else {
+ mOriginKeyStore->mOriginKeys.GetOriginKey(aOrigin, result, aPersist);
+ }
+
+ // Pass result back to main thread.
+ nsresult rv;
+ rv = NS_DispatchToMainThread(NewRunnableFrom([this, that, id,
+ result]() -> nsresult {
+ if (mDestroyed) {
+ return NS_OK;
+ }
+ RefPtr<Pledge<nsCString>> p = mOutstandingPledges.Remove(id);
+ if (!p) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ p->Resolve(result);
+ return NS_OK;
+ }), NS_DISPATCH_NORMAL);
+
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ return NS_OK;
+ }), NS_DISPATCH_NORMAL);
+
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ p->Then([this, that, aRequestId](const nsCString& aKey) mutable {
+ if (mDestroyed) {
+ return NS_OK;
+ }
+ Unused << this->SendGetOriginKeyResponse(aRequestId, aKey);
+ return NS_OK;
+ });
+ return true;
+}
+
+template<class Super> bool
+Parent<Super>::RecvSanitizeOriginKeys(const uint64_t& aSinceWhen,
+ const bool& aOnlyPrivateBrowsing)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsIFile> profileDir;
+ nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
+ getter_AddRefs(profileDir));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ // Over to stream-transport thread to do the file io.
+
+ nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
+ MOZ_ASSERT(sts);
+ RefPtr<OriginKeyStore> store(mOriginKeyStore);
+
+ rv = sts->Dispatch(NewRunnableFrom([profileDir, store, aSinceWhen,
+ aOnlyPrivateBrowsing]() -> nsresult {
+ MOZ_ASSERT(!NS_IsMainThread());
+ store->mPrivateBrowsingOriginKeys.Clear(aSinceWhen);
+ if (!aOnlyPrivateBrowsing) {
+ store->mOriginKeys.SetProfileDir(profileDir);
+ store->mOriginKeys.Clear(aSinceWhen);
+ }
+ return NS_OK;
+ }), NS_DISPATCH_NORMAL);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ return true;
+}
+
+template<class Super> void
+Parent<Super>::ActorDestroy(ActorDestroyReason aWhy)
+{
+ // No more IPC from here
+ mDestroyed = true;
+ LOG((__FUNCTION__));
+}
+
+template<class Super>
+Parent<Super>::Parent()
+ : mOriginKeyStore(OriginKeyStore::Get())
+ , mDestroyed(false)
+{
+ LOG(("media::Parent: %p", this));
+}
+
+template<class Super>
+Parent<Super>::~Parent()
+{
+ LOG(("~media::Parent: %p", this));
+}
+
+PMediaParent*
+AllocPMediaParent()
+{
+ Parent<PMediaParent>* obj = new Parent<PMediaParent>();
+ obj->AddRef();
+ return obj;
+}
+
+bool
+DeallocPMediaParent(media::PMediaParent *aActor)
+{
+ static_cast<Parent<PMediaParent>*>(aActor)->Release();
+ return true;
+}
+
+} // namespace media
+} // namespace mozilla
+
+// Instantiate templates to satisfy linker
+template class mozilla::media::Parent<mozilla::media::NonE10s>;
diff --git a/dom/media/systemservices/MediaParent.h b/dom/media/systemservices/MediaParent.h
new file mode 100644
index 000000000..b5dcd84ad
--- /dev/null
+++ b/dom/media/systemservices/MediaParent.h
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_MediaParent_h
+#define mozilla_MediaParent_h
+
+#include "MediaChild.h"
+
+#include "mozilla/dom/ContentParent.h"
+#include "mozilla/media/PMediaParent.h"
+
+namespace mozilla {
+namespace media {
+
+// media::Parent implements the chrome-process side of ipc for media::Child APIs
+// A same-process version may also be created to service non-e10s calls.
+
+class OriginKeyStore;
+
+class NonE10s
+{
+ typedef mozilla::ipc::IProtocol::ActorDestroyReason
+ ActorDestroyReason;
+public:
+ virtual ~NonE10s() {}
+protected:
+ virtual bool RecvGetOriginKey(const uint32_t& aRequestId,
+ const nsCString& aOrigin,
+ const bool& aPrivateBrowsing,
+ const bool& aPersist) = 0;
+ virtual bool RecvSanitizeOriginKeys(const uint64_t& aSinceWhen,
+ const bool& aOnlyPrivateBrowsing) = 0;
+ virtual void
+ ActorDestroy(ActorDestroyReason aWhy) = 0;
+
+ bool SendGetOriginKeyResponse(const uint32_t& aRequestId,
+ nsCString aKey);
+};
+
+// Super = PMediaParent or NonE10s
+
+template<class Super>
+class Parent : public Super
+{
+ typedef mozilla::ipc::IProtocol::ActorDestroyReason
+ ActorDestroyReason;
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Parent<Super>)
+
+ virtual bool RecvGetOriginKey(const uint32_t& aRequestId,
+ const nsCString& aOrigin,
+ const bool& aPrivateBrowsing,
+ const bool& aPersist) override;
+ virtual bool RecvSanitizeOriginKeys(const uint64_t& aSinceWhen,
+ const bool& aOnlyPrivateBrowsing) override;
+ virtual void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ Parent();
+private:
+ virtual ~Parent();
+
+ RefPtr<OriginKeyStore> mOriginKeyStore;
+ bool mDestroyed;
+
+ CoatCheck<Pledge<nsCString>> mOutstandingPledges;
+};
+
+PMediaParent* AllocPMediaParent();
+bool DeallocPMediaParent(PMediaParent *aActor);
+
+} // namespace media
+} // namespace mozilla
+
+#endif // mozilla_MediaParent_h
diff --git a/dom/media/systemservices/MediaSystemResourceClient.cpp b/dom/media/systemservices/MediaSystemResourceClient.cpp
new file mode 100644
index 000000000..e1ad38aef
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceClient.cpp
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/Monitor.h"
+#include "mozilla/ReentrantMonitor.h"
+
+#include "MediaSystemResourceClient.h"
+
+namespace mozilla {
+
+Atomic<uint32_t> MediaSystemResourceClient::sSerialCounter(0);
+
+MediaSystemResourceClient::MediaSystemResourceClient(MediaSystemResourceType aReourceType)
+ : mResourceType(aReourceType)
+ , mId(++sSerialCounter)
+ , mListener(nullptr)
+ , mResourceState(RESOURCE_STATE_START)
+ , mIsSync(false)
+ , mAcquireSyncWaitMonitor(nullptr)
+ , mAcquireSyncWaitDone(nullptr)
+{
+ mManager = MediaSystemResourceManager::Get();
+ if (mManager) {
+ mManager->Register(this);
+ }
+}
+
+MediaSystemResourceClient::~MediaSystemResourceClient()
+{
+ ReleaseResource();
+ if (mManager) {
+ mManager->Unregister(this);
+ }
+}
+
+bool
+MediaSystemResourceClient::SetListener(MediaSystemResourceReservationListener* aListener)
+{
+ if (!mManager) {
+ return false;
+ }
+ return mManager->SetListener(this, aListener);
+}
+
+void
+MediaSystemResourceClient::Acquire()
+{
+ if (!mManager) {
+ return;
+ }
+ mManager->Acquire(this);
+}
+
+bool
+MediaSystemResourceClient::AcquireSyncNoWait()
+{
+ if (!mManager) {
+ return false;
+ }
+ return mManager->AcquireSyncNoWait(this);
+}
+
+void
+MediaSystemResourceClient::ReleaseResource()
+{
+ if (!mManager) {
+ return;
+ }
+ mManager->ReleaseResource(this);
+}
+
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaSystemResourceClient.h b/dom/media/systemservices/MediaSystemResourceClient.h
new file mode 100644
index 000000000..29e769a92
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceClient.h
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceClient_h_)
+#define MediaSystemResourceClient_h_
+
+#include "MediaSystemResourceManager.h"
+#include "MediaSystemResourceTypes.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/media/MediaSystemResourceTypes.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/RefPtr.h"
+
+namespace mozilla {
+
+class MediaSystemResourceManager;
+
+
+/**
+ * This is a base class for listener callbacks.
+ * This callback is invoked when the media system resource reservation state
+ * is changed.
+ */
+class MediaSystemResourceReservationListener {
+public:
+ virtual void ResourceReserved() = 0;
+ virtual void ResourceReserveFailed() = 0;
+};
+
+/**
+ * MediaSystemResourceClient is used to reserve a media system resource
+ * like hw decoder. When system has a limitation of a media resource,
+ * use this class to mediate use rights of the resource.
+ */
+class MediaSystemResourceClient
+{
+public:
+
+ // Enumeration for the valid decoding states
+ enum ResourceState {
+ RESOURCE_STATE_START,
+ RESOURCE_STATE_WAITING,
+ RESOURCE_STATE_ACQUIRED,
+ RESOURCE_STATE_NOT_ACQUIRED,
+ RESOURCE_STATE_END
+ };
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSystemResourceClient)
+
+ explicit MediaSystemResourceClient(MediaSystemResourceType aReourceType);
+
+ bool SetListener(MediaSystemResourceReservationListener* aListener);
+
+ // Try to acquire media resource asynchronously.
+ // If the resource is used by others, wait until acquired.
+ void Acquire();
+
+ // Try to acquire media resource synchronously. If the resource is not immediately
+ // available, fail to acquire it.
+ // return false if resource is not acquired.
+ // return true if resource is acquired.
+ //
+ // This function should not be called on ImageBridge thread.
+ // It should be used only for compatibility with legacy code.
+ bool AcquireSyncNoWait();
+
+ void ReleaseResource();
+
+private:
+ ~MediaSystemResourceClient();
+
+ RefPtr<MediaSystemResourceManager> mManager;
+ const MediaSystemResourceType mResourceType;
+ const uint32_t mId;
+
+ // Modified only by MediaSystemResourceManager.
+ // Accessed and modified with MediaSystemResourceManager::mReentrantMonitor held.
+ MediaSystemResourceReservationListener* mListener;
+ ResourceState mResourceState;
+ bool mIsSync;
+ ReentrantMonitor* mAcquireSyncWaitMonitor;
+ bool* mAcquireSyncWaitDone;
+
+ static mozilla::Atomic<uint32_t> sSerialCounter;
+
+ friend class MediaSystemResourceManager;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/systemservices/MediaSystemResourceManager.cpp b/dom/media/systemservices/MediaSystemResourceManager.cpp
new file mode 100644
index 000000000..29db0ef3e
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceManager.cpp
@@ -0,0 +1,387 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/TaskQueue.h"
+
+#include "gfxPrefs.h"
+#include "MediaSystemResourceManagerChild.h"
+#include "mozilla/layers/ImageBridgeChild.h"
+
+#include "MediaSystemResourceManager.h"
+
+namespace mozilla {
+
+using namespace mozilla::ipc;
+using namespace mozilla::layers;
+
+/* static */ StaticRefPtr<MediaSystemResourceManager> MediaSystemResourceManager::sSingleton;
+
+/* static */ MediaSystemResourceManager*
+MediaSystemResourceManager::Get()
+{
+ if (sSingleton) {
+ return sSingleton;
+ }
+ MediaSystemResourceManager::Init();
+ return sSingleton;
+}
+
+/* static */ void
+MediaSystemResourceManager::Shutdown()
+{
+ MOZ_ASSERT(InImageBridgeChildThread());
+ if (sSingleton) {
+ sSingleton->CloseIPC();
+ sSingleton = nullptr;
+ }
+}
+
+/* static */ void
+MediaSystemResourceManager::Init()
+{
+ RefPtr<ImageBridgeChild> imageBridge = ImageBridgeChild::GetSingleton();
+ if (!imageBridge) {
+ NS_WARNING("ImageBridge does not exist");
+ return;
+ }
+
+ if (InImageBridgeChildThread()) {
+ if (!sSingleton) {
+#ifdef DEBUG
+ static int timesCreated = 0;
+ timesCreated++;
+ MOZ_ASSERT(timesCreated == 1);
+#endif
+ sSingleton = new MediaSystemResourceManager();
+ }
+ return;
+ }
+
+ ReentrantMonitor barrier("MediaSystemResourceManager::Init");
+ ReentrantMonitorAutoEnter mainThreadAutoMon(barrier);
+ bool done = false;
+
+ RefPtr<Runnable> runnable =
+ NS_NewRunnableFunction([&]() {
+ if (!sSingleton) {
+ sSingleton = new MediaSystemResourceManager();
+ }
+ ReentrantMonitorAutoEnter childThreadAutoMon(barrier);
+ done = true;
+ barrier.NotifyAll();
+ });
+
+ imageBridge->GetMessageLoop()->PostTask(runnable.forget());
+
+ // should stop the thread until done.
+ while (!done) {
+ barrier.Wait();
+ }
+}
+
+MediaSystemResourceManager::MediaSystemResourceManager()
+ : mReentrantMonitor("MediaSystemResourceManager.mReentrantMonitor")
+ , mShutDown(false)
+ , mChild(nullptr)
+{
+ MOZ_ASSERT(InImageBridgeChildThread());
+ OpenIPC();
+}
+
+MediaSystemResourceManager::~MediaSystemResourceManager()
+{
+ MOZ_ASSERT(IsIpcClosed());
+}
+
+void
+MediaSystemResourceManager::OpenIPC()
+{
+ MOZ_ASSERT(InImageBridgeChildThread());
+ MOZ_ASSERT(!mChild);
+
+ media::PMediaSystemResourceManagerChild* child =
+ ImageBridgeChild::GetSingleton()->SendPMediaSystemResourceManagerConstructor();
+ mChild = static_cast<media::MediaSystemResourceManagerChild*>(child);
+ mChild->SetManager(this);
+}
+
+void
+MediaSystemResourceManager::CloseIPC()
+{
+ MOZ_ASSERT(InImageBridgeChildThread());
+
+ if (!mChild) {
+ return;
+ }
+ mChild->Destroy();
+ mChild = nullptr;
+ mShutDown = true;
+}
+
+void
+MediaSystemResourceManager::OnIpcClosed()
+{
+ mChild = nullptr;
+}
+
+bool
+MediaSystemResourceManager::IsIpcClosed()
+{
+ return mChild ? true : false;
+}
+
+void
+MediaSystemResourceManager::Register(MediaSystemResourceClient* aClient)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MOZ_ASSERT(aClient);
+ MOZ_ASSERT(!mResourceClients.Get(aClient->mId));
+
+ mResourceClients.Put(aClient->mId, aClient);
+}
+
+void
+MediaSystemResourceManager::Unregister(MediaSystemResourceClient* aClient)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MOZ_ASSERT(aClient);
+ MOZ_ASSERT(mResourceClients.Get(aClient->mId));
+ MOZ_ASSERT(mResourceClients.Get(aClient->mId) == aClient);
+
+ mResourceClients.Remove(aClient->mId);
+}
+
+bool
+MediaSystemResourceManager::SetListener(MediaSystemResourceClient* aClient,
+ MediaSystemResourceReservationListener* aListener)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MOZ_ASSERT(aClient);
+
+ MediaSystemResourceClient* client = mResourceClients.Get(aClient->mId);
+ MOZ_ASSERT(client);
+
+ if (!client) {
+ return false;
+ }
+ // State Check
+ if (aClient->mResourceState != MediaSystemResourceClient::RESOURCE_STATE_START) {
+ return false;
+ }
+ aClient->mListener = aListener;
+ return true;
+}
+
+void
+MediaSystemResourceManager::Acquire(MediaSystemResourceClient* aClient)
+{
+ MOZ_ASSERT(aClient);
+ MOZ_ASSERT(!InImageBridgeChildThread());
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MediaSystemResourceClient* client = mResourceClients.Get(aClient->mId);
+ MOZ_ASSERT(client);
+ MOZ_ASSERT(client == aClient);
+
+ aClient->mIsSync = false; // async request
+
+ if (!client) {
+ HandleAcquireResult(aClient->mId, false);
+ return;
+ }
+ // State Check
+ if (aClient->mResourceState != MediaSystemResourceClient::RESOURCE_STATE_START) {
+ HandleAcquireResult(aClient->mId, false);
+ return;
+ }
+ aClient->mResourceState = MediaSystemResourceClient::RESOURCE_STATE_WAITING;
+ ImageBridgeChild::GetSingleton()->GetMessageLoop()->PostTask(
+ NewRunnableMethod<uint32_t>(
+ this,
+ &MediaSystemResourceManager::DoAcquire,
+ aClient->mId));
+}
+
+bool
+MediaSystemResourceManager::AcquireSyncNoWait(MediaSystemResourceClient* aClient)
+{
+ MOZ_ASSERT(aClient);
+ MOZ_ASSERT(!InImageBridgeChildThread());
+
+ ReentrantMonitor barrier("MediaSystemResourceManager::AcquireSyncNoWait");
+ ReentrantMonitorAutoEnter autoMon(barrier);
+ bool done = false;
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MediaSystemResourceClient* client = mResourceClients.Get(aClient->mId);
+ MOZ_ASSERT(client);
+ MOZ_ASSERT(client == aClient);
+
+ aClient->mIsSync = true; // sync request
+
+ if (InImageBridgeChildThread()) {
+ HandleAcquireResult(aClient->mId, false);
+ return false;
+ }
+ if (!client || client != aClient) {
+ HandleAcquireResult(aClient->mId, false);
+ return false;
+ }
+ // State Check
+ if (aClient->mResourceState != MediaSystemResourceClient::RESOURCE_STATE_START) {
+ HandleAcquireResult(aClient->mId, false);
+ return false;
+ }
+ // Hold barrier Monitor until acquire task end.
+ aClient->mAcquireSyncWaitMonitor = &barrier;
+ aClient->mAcquireSyncWaitDone = &done;
+ aClient->mResourceState = MediaSystemResourceClient::RESOURCE_STATE_WAITING;
+ }
+
+ ImageBridgeChild::GetSingleton()->GetMessageLoop()->PostTask(
+ NewRunnableMethod<uint32_t>(
+ this,
+ &MediaSystemResourceManager::DoAcquire,
+ aClient->mId));
+
+ // should stop the thread until done.
+ while (!done) {
+ barrier.Wait();
+ }
+
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ if (aClient->mResourceState != MediaSystemResourceClient::RESOURCE_STATE_ACQUIRED) {
+ return false;
+ }
+ return true;
+ }
+}
+
+void
+MediaSystemResourceManager::DoAcquire(uint32_t aId)
+{
+ MOZ_ASSERT(InImageBridgeChildThread());
+ if (mShutDown || !mChild) {
+ HandleAcquireResult(aId, false);
+ return;
+ }
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MediaSystemResourceClient* client = mResourceClients.Get(aId);
+ MOZ_ASSERT(client);
+
+ if (!client ||
+ client->mResourceState != MediaSystemResourceClient::RESOURCE_STATE_WAITING) {
+ HandleAcquireResult(aId, false);
+ return;
+ }
+ MOZ_ASSERT(aId == client->mId);
+ bool willWait = !client->mAcquireSyncWaitMonitor ? true : false;
+ mChild->SendAcquire(client->mId,
+ client->mResourceType,
+ willWait);
+ }
+}
+
+void
+MediaSystemResourceManager::ReleaseResource(MediaSystemResourceClient* aClient)
+{
+ MOZ_ASSERT(aClient);
+ {
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MediaSystemResourceClient* client = mResourceClients.Get(aClient->mId);
+ MOZ_ASSERT(client);
+ MOZ_ASSERT(client == aClient);
+
+ if (!client ||
+ client != aClient ||
+ aClient->mResourceState == MediaSystemResourceClient::RESOURCE_STATE_START ||
+ aClient->mResourceState == MediaSystemResourceClient::RESOURCE_STATE_END) {
+
+ aClient->mResourceState = MediaSystemResourceClient::RESOURCE_STATE_END;
+ return;
+ }
+
+ aClient->mResourceState = MediaSystemResourceClient::RESOURCE_STATE_END;
+
+ ImageBridgeChild::GetSingleton()->GetMessageLoop()->PostTask(
+ NewRunnableMethod<uint32_t>(
+ this,
+ &MediaSystemResourceManager::DoRelease,
+ aClient->mId));
+ }
+}
+
+void
+MediaSystemResourceManager::DoRelease(uint32_t aId)
+{
+ MOZ_ASSERT(InImageBridgeChildThread());
+ if (mShutDown || !mChild) {
+ return;
+ }
+ mChild->SendRelease(aId);
+}
+
+void
+MediaSystemResourceManager::RecvResponse(uint32_t aId, bool aSuccess)
+{
+ HandleAcquireResult(aId, aSuccess);
+}
+
+void
+MediaSystemResourceManager::HandleAcquireResult(uint32_t aId, bool aSuccess)
+{
+ if (!InImageBridgeChildThread()) {
+ ImageBridgeChild::GetSingleton()->GetMessageLoop()->PostTask(
+ NewRunnableMethod<uint32_t, bool>(
+ this,
+ &MediaSystemResourceManager::HandleAcquireResult,
+ aId,
+ aSuccess));
+ return;
+ }
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ MediaSystemResourceClient* client = mResourceClients.Get(aId);
+ if (!client) {
+ // Client was already unregistered.
+ return;
+ }
+ if (client->mResourceState != MediaSystemResourceClient::RESOURCE_STATE_WAITING) {
+ return;
+ }
+
+ // Update state
+ if (aSuccess) {
+ client->mResourceState = MediaSystemResourceClient::RESOURCE_STATE_ACQUIRED;
+ } else {
+ client->mResourceState = MediaSystemResourceClient::RESOURCE_STATE_NOT_ACQUIRED;
+ }
+
+ if (client->mIsSync) {
+ if (client->mAcquireSyncWaitMonitor) {
+ // Notify AcquireSync() complete
+ MOZ_ASSERT(client->mAcquireSyncWaitDone);
+ ReentrantMonitorAutoEnter autoMon(*client->mAcquireSyncWaitMonitor);
+ *client->mAcquireSyncWaitDone = true;
+ client->mAcquireSyncWaitMonitor->NotifyAll();
+ client->mAcquireSyncWaitMonitor = nullptr;
+ client->mAcquireSyncWaitDone = nullptr;
+ }
+ } else {
+ // Notify Acquire() result
+ if (client->mListener) {
+ if (aSuccess) {
+ client->mListener->ResourceReserved();
+ } else {
+ client->mListener->ResourceReserveFailed();
+ }
+ }
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaSystemResourceManager.h b/dom/media/systemservices/MediaSystemResourceManager.h
new file mode 100644
index 000000000..36869e202
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceManager.h
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceManager_h_)
+#define MediaSystemResourceManager_h_
+
+#include <queue>
+
+#include "MediaSystemResourceTypes.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/StaticPtr.h"
+#include "nsDataHashtable.h"
+#include "nsISupportsImpl.h"
+
+namespace mozilla {
+
+namespace media {
+class MediaSystemResourceManagerChild;
+} // namespace media
+
+class MediaSystemResourceClient;
+class MediaSystemResourceReservationListener;
+class ReentrantMonitor;
+class TaskQueue;
+
+/**
+ * Manage media system resource allocation requests within a process.
+ */
+class MediaSystemResourceManager
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSystemResourceManager)
+
+ static MediaSystemResourceManager* Get();
+ static void Init();
+ static void Shutdown();
+
+ void OnIpcClosed();
+
+ void Register(MediaSystemResourceClient* aClient);
+ void Unregister(MediaSystemResourceClient* aClient);
+
+ bool SetListener(MediaSystemResourceClient* aClient,
+ MediaSystemResourceReservationListener* aListener);
+
+ void Acquire(MediaSystemResourceClient* aClient);
+ bool AcquireSyncNoWait(MediaSystemResourceClient* aClient);
+ void ReleaseResource(MediaSystemResourceClient* aClient);
+
+ void RecvResponse(uint32_t aId, bool aSuccess);
+
+private:
+ MediaSystemResourceManager();
+ virtual ~MediaSystemResourceManager();
+
+ void OpenIPC();
+ void CloseIPC();
+ bool IsIpcClosed();
+
+ void DoAcquire(uint32_t aId);
+
+ void DoRelease(uint32_t aId);
+
+ void HandleAcquireResult(uint32_t aId, bool aSuccess);
+
+ ReentrantMonitor mReentrantMonitor;
+
+ bool mShutDown;
+
+ media::MediaSystemResourceManagerChild* mChild;
+
+ nsDataHashtable<nsUint32HashKey, MediaSystemResourceClient*> mResourceClients;
+
+ static StaticRefPtr<MediaSystemResourceManager> sSingleton;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/systemservices/MediaSystemResourceManagerChild.cpp b/dom/media/systemservices/MediaSystemResourceManagerChild.cpp
new file mode 100644
index 000000000..284473821
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceManagerChild.cpp
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaSystemResourceManager.h"
+
+#include "MediaSystemResourceManagerChild.h"
+
+namespace mozilla {
+namespace media {
+
+MediaSystemResourceManagerChild::MediaSystemResourceManagerChild()
+ : mDestroyed(false)
+{
+}
+
+MediaSystemResourceManagerChild::~MediaSystemResourceManagerChild()
+{
+}
+
+bool
+MediaSystemResourceManagerChild::RecvResponse(const uint32_t& aId,
+ const bool& aSuccess)
+{
+ if (mManager) {
+ mManager->RecvResponse(aId, aSuccess);
+ }
+ return true;
+}
+
+void
+MediaSystemResourceManagerChild::ActorDestroy(ActorDestroyReason aActorDestroyReason)
+{
+ MOZ_ASSERT(!mDestroyed);
+ if (mManager) {
+ mManager->OnIpcClosed();
+ }
+ mDestroyed = true;
+}
+
+void
+MediaSystemResourceManagerChild::Destroy()
+{
+ if (mDestroyed) {
+ return;
+ }
+ SendRemoveResourceManager();
+ // WARNING: |this| is dead, hands off
+}
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaSystemResourceManagerChild.h b/dom/media/systemservices/MediaSystemResourceManagerChild.h
new file mode 100644
index 000000000..51d4de8d1
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceManagerChild.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceManagerChild_h_)
+#define MediaSystemResourceManagerChild_h_
+
+#include "mozilla/media/PMediaSystemResourceManagerChild.h"
+#include "nsISupportsImpl.h"
+
+namespace mozilla {
+
+class MediaSystemResourceManager;
+
+namespace ipc {
+class BackgroundChildImpl;
+} // namespace ipc
+
+namespace media {
+
+/**
+ * Handle MediaSystemResourceManager's IPC
+ */
+class MediaSystemResourceManagerChild final : public PMediaSystemResourceManagerChild
+{
+public:
+ struct ResourceListener {
+ /* The resource is reserved and can be granted.
+ * The client can allocate the requested resource.
+ */
+ virtual void resourceReserved() = 0;
+ /* The resource is not reserved any more.
+ * The client should release the resource as soon as possible if the
+ * resource is still being held.
+ */
+ virtual void resourceCanceled() = 0;
+ };
+
+ MediaSystemResourceManagerChild();
+ virtual ~MediaSystemResourceManagerChild();
+
+ void Destroy();
+
+ void SetManager(MediaSystemResourceManager* aManager)
+ {
+ mManager = aManager;
+ }
+
+protected:
+ bool RecvResponse(const uint32_t& aId,
+ const bool& aSuccess) override;
+
+private:
+ void ActorDestroy(ActorDestroyReason aActorDestroyReason) override;
+
+ bool mDestroyed;
+ MediaSystemResourceManager* mManager;
+
+ friend class mozilla::ipc::BackgroundChildImpl;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/systemservices/MediaSystemResourceManagerParent.cpp b/dom/media/systemservices/MediaSystemResourceManagerParent.cpp
new file mode 100644
index 000000000..9e15c0c48
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceManagerParent.cpp
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/Unused.h"
+
+#include "MediaSystemResourceManagerParent.h"
+
+namespace mozilla {
+namespace media {
+
+using namespace ipc;
+
+MediaSystemResourceManagerParent::MediaSystemResourceManagerParent()
+ : mDestroyed(false)
+{
+ mMediaSystemResourceService = MediaSystemResourceService::Get();
+}
+
+MediaSystemResourceManagerParent::~MediaSystemResourceManagerParent()
+{
+ MOZ_ASSERT(mDestroyed);
+}
+
+bool
+MediaSystemResourceManagerParent::RecvAcquire(const uint32_t& aId,
+ const MediaSystemResourceType& aResourceType,
+ const bool& aWillWait)
+{
+ MediaSystemResourceRequest* request = mResourceRequests.Get(aId);
+ MOZ_ASSERT(!request);
+ if (request) {
+ // Send fail response
+ mozilla::Unused << SendResponse(aId, false /* fail */);
+ return true;
+ }
+
+ request = new MediaSystemResourceRequest(aId, aResourceType);
+ mResourceRequests.Put(aId, request);
+ mMediaSystemResourceService->Acquire(this, aId, aResourceType, aWillWait);
+ return true;
+}
+
+bool
+MediaSystemResourceManagerParent::RecvRelease(const uint32_t& aId)
+{
+ MediaSystemResourceRequest* request = mResourceRequests.Get(aId);
+ if (!request) {
+ return true;
+ }
+
+ mMediaSystemResourceService->ReleaseResource(this, aId, request->mResourceType);
+ mResourceRequests.Remove(aId);
+ return true;
+}
+
+bool
+MediaSystemResourceManagerParent::RecvRemoveResourceManager()
+{
+ return PMediaSystemResourceManagerParent::Send__delete__(this);
+}
+
+void
+MediaSystemResourceManagerParent::ActorDestroy(ActorDestroyReason aReason)
+{
+ MOZ_ASSERT(!mDestroyed);
+
+ // Release all resource requests of the MediaSystemResourceManagerParent.
+ // Clears all remaining pointers to this object.
+ mMediaSystemResourceService->ReleaseResource(this);
+
+ mDestroyed = true;
+}
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaSystemResourceManagerParent.h b/dom/media/systemservices/MediaSystemResourceManagerParent.h
new file mode 100644
index 000000000..9080cb385
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceManagerParent.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceManagerParent_h_)
+#define MediaSystemResourceManagerParent_h_
+
+#include "MediaSystemResourceManager.h"
+#include "MediaSystemResourceService.h"
+#include "MediaSystemResourceTypes.h"
+#include "mozilla/media/PMediaSystemResourceManagerParent.h"
+
+namespace mozilla {
+namespace media {
+
+/**
+ * Handle MediaSystemResourceManager's IPC
+ */
+class MediaSystemResourceManagerParent final : public PMediaSystemResourceManagerParent
+{
+public:
+ MediaSystemResourceManagerParent();
+ virtual ~MediaSystemResourceManagerParent();
+
+protected:
+ bool RecvAcquire(const uint32_t& aId,
+ const MediaSystemResourceType& aResourceType,
+ const bool& aWillWait) override;
+
+ bool RecvRelease(const uint32_t& aId) override;
+
+ bool RecvRemoveResourceManager() override;
+
+private:
+ void ActorDestroy(ActorDestroyReason aActorDestroyReason) override;
+
+ struct MediaSystemResourceRequest {
+ MediaSystemResourceRequest()
+ : mId(-1), mResourceType(MediaSystemResourceType::INVALID_RESOURCE) {}
+ MediaSystemResourceRequest(uint32_t aId, MediaSystemResourceType aResourceType)
+ : mId(aId), mResourceType(aResourceType) {}
+ int32_t mId;
+ MediaSystemResourceType mResourceType;
+ };
+
+ bool mDestroyed;
+
+ RefPtr<MediaSystemResourceService> mMediaSystemResourceService;
+
+ nsClassHashtable<nsUint32HashKey, MediaSystemResourceRequest> mResourceRequests;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/systemservices/MediaSystemResourceMessageUtils.h b/dom/media/systemservices/MediaSystemResourceMessageUtils.h
new file mode 100644
index 000000000..851fbb253
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceMessageUtils.h
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceMessageUtils_h_)
+#define MediaSystemResourceMessageUtils_h_
+
+#include "ipc/IPCMessageUtils.h"
+#include "MediaSystemResourceTypes.h"
+
+namespace IPC {
+
+template <>
+struct ParamTraits<mozilla::MediaSystemResourceType>
+ : public ContiguousEnumSerializer<
+ mozilla::MediaSystemResourceType,
+ mozilla::MediaSystemResourceType::VIDEO_DECODER,
+ mozilla::MediaSystemResourceType::INVALID_RESOURCE>
+{};
+
+} // namespace IPC
+
+#endif
diff --git a/dom/media/systemservices/MediaSystemResourceService.cpp b/dom/media/systemservices/MediaSystemResourceService.cpp
new file mode 100644
index 000000000..0e5d6a50c
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceService.cpp
@@ -0,0 +1,256 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaSystemResourceManagerParent.h"
+#include "mozilla/layers/CompositorThread.h"
+#include "mozilla/Unused.h"
+
+#include "MediaSystemResourceService.h"
+
+using namespace mozilla::layers;
+
+namespace mozilla {
+
+/* static */ StaticRefPtr<MediaSystemResourceService> MediaSystemResourceService::sSingleton;
+
+/* static */ MediaSystemResourceService*
+MediaSystemResourceService::Get()
+{
+ if (sSingleton) {
+ return sSingleton;
+ }
+ Init();
+ return sSingleton;
+}
+
+/* static */ void
+MediaSystemResourceService::Init()
+{
+ if (!sSingleton) {
+ sSingleton = new MediaSystemResourceService();
+ }
+}
+
+/* static */ void
+MediaSystemResourceService::Shutdown()
+{
+ if (sSingleton) {
+ sSingleton->Destroy();
+ sSingleton = nullptr;
+ }
+}
+
+MediaSystemResourceService::MediaSystemResourceService()
+ : mDestroyed(false)
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+#ifdef MOZ_WIDGET_GONK
+ // The maximum number of hardware resoureces available.
+ // XXX need to hange to a dynamic way.
+ enum
+ {
+ VIDEO_DECODER_COUNT = 1,
+ VIDEO_ENCODER_COUNT = 1
+ };
+
+ MediaSystemResource* resource;
+
+ resource = new MediaSystemResource(VIDEO_DECODER_COUNT);
+ mResources.Put(static_cast<uint32_t>(MediaSystemResourceType::VIDEO_DECODER), resource);
+
+ resource = new MediaSystemResource(VIDEO_ENCODER_COUNT);
+ mResources.Put(static_cast<uint32_t>(MediaSystemResourceType::VIDEO_ENCODER), resource);
+#endif
+}
+
+MediaSystemResourceService::~MediaSystemResourceService()
+{
+}
+
+void
+MediaSystemResourceService::Destroy()
+{
+ mDestroyed = true;
+}
+
+void
+MediaSystemResourceService::Acquire(media::MediaSystemResourceManagerParent* aParent,
+ uint32_t aId,
+ MediaSystemResourceType aResourceType,
+ bool aWillWait)
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+ MOZ_ASSERT(aParent);
+
+ if (mDestroyed) {
+ return;
+ }
+
+ MediaSystemResource* resource = mResources.Get(static_cast<uint32_t>(aResourceType));
+
+ if (!resource ||
+ resource->mResourceCount == 0) {
+ // Resource does not exit
+ // Send fail response
+ mozilla::Unused << aParent->SendResponse(aId, false /* fail */);
+ return;
+ }
+
+ // Try to acquire a resource
+ if (resource->mAcquiredRequests.size() < resource->mResourceCount) {
+ // Resource is available
+ resource->mAcquiredRequests.push_back(
+ MediaSystemResourceRequest(aParent, aId));
+ // Send success response
+ mozilla::Unused << aParent->SendResponse(aId, true /* success */);
+ return;
+ } else if (!aWillWait) {
+ // Resource is not available and do not wait.
+ // Send fail response
+ mozilla::Unused << aParent->SendResponse(aId, false /* fail */);
+ return;
+ }
+ // Wait until acquire.
+ resource->mWaitingRequests.push_back(
+ MediaSystemResourceRequest(aParent, aId));
+}
+
+void
+MediaSystemResourceService::ReleaseResource(media::MediaSystemResourceManagerParent* aParent,
+ uint32_t aId,
+ MediaSystemResourceType aResourceType)
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+ MOZ_ASSERT(aParent);
+
+ if (mDestroyed) {
+ return;
+ }
+
+ MediaSystemResource* resource = mResources.Get(static_cast<uint32_t>(aResourceType));
+
+ if (!resource ||
+ resource->mResourceCount == 0) {
+ // Resource does not exit
+ return;
+ }
+ RemoveRequest(aParent, aId, aResourceType);
+ UpdateRequests(aResourceType);
+}
+
+void
+MediaSystemResourceService::ReleaseResource(media::MediaSystemResourceManagerParent* aParent)
+{
+ MOZ_ASSERT(aParent);
+
+ if (mDestroyed) {
+ return;
+ }
+
+ for (auto iter = mResources.Iter(); !iter.Done(); iter.Next()) {
+ const uint32_t& key = iter.Key();
+ RemoveRequests(aParent, static_cast<MediaSystemResourceType>(key));
+ UpdateRequests(static_cast<MediaSystemResourceType>(key));
+ }
+}
+
+void
+MediaSystemResourceService::RemoveRequest(media::MediaSystemResourceManagerParent* aParent,
+ uint32_t aId,
+ MediaSystemResourceType aResourceType)
+{
+ MOZ_ASSERT(aParent);
+
+ MediaSystemResource* resource = mResources.Get(static_cast<uint32_t>(aResourceType));
+ if (!resource) {
+ return;
+ }
+
+ std::deque<MediaSystemResourceRequest>::iterator it;
+ std::deque<MediaSystemResourceRequest>& acquiredRequests =
+ resource->mAcquiredRequests;
+ for (it = acquiredRequests.begin(); it != acquiredRequests.end(); it++) {
+ if (((*it).mParent == aParent) && ((*it).mId == aId)) {
+ acquiredRequests.erase(it);
+ return;
+ }
+ }
+
+ std::deque<MediaSystemResourceRequest>& waitingRequests =
+ resource->mWaitingRequests;
+ for (it = waitingRequests.begin(); it != waitingRequests.end(); it++) {
+ if (((*it).mParent == aParent) && ((*it).mId == aId)) {
+ waitingRequests.erase(it);
+ return;
+ }
+ }
+}
+
+void
+MediaSystemResourceService::RemoveRequests(media::MediaSystemResourceManagerParent* aParent,
+ MediaSystemResourceType aResourceType)
+{
+ MOZ_ASSERT(aParent);
+
+ MediaSystemResource* resource = mResources.Get(static_cast<uint32_t>(aResourceType));
+
+ if (!resource ||
+ resource->mResourceCount == 0) {
+ // Resource does not exit
+ return;
+ }
+
+ std::deque<MediaSystemResourceRequest>::iterator it;
+ std::deque<MediaSystemResourceRequest>& acquiredRequests =
+ resource->mAcquiredRequests;
+ for (it = acquiredRequests.begin(); it != acquiredRequests.end();) {
+ if ((*it).mParent == aParent) {
+ it = acquiredRequests.erase(it);
+ } else {
+ it++;
+ }
+ }
+
+ std::deque<MediaSystemResourceRequest>& waitingRequests =
+ resource->mWaitingRequests;
+ for (it = waitingRequests.begin(); it != waitingRequests.end();) {
+ if ((*it).mParent == aParent) {
+ it = waitingRequests.erase(it);
+ } else {
+ it++;
+ }
+ }
+}
+
+void
+MediaSystemResourceService::UpdateRequests(MediaSystemResourceType aResourceType)
+{
+ MediaSystemResource* resource = mResources.Get(static_cast<uint32_t>(aResourceType));
+
+ if (!resource ||
+ resource->mResourceCount == 0) {
+ // Resource does not exit
+ return;
+ }
+
+ std::deque<MediaSystemResourceRequest>& acquiredRequests =
+ resource->mAcquiredRequests;
+ std::deque<MediaSystemResourceRequest>& waitingRequests =
+ resource->mWaitingRequests;
+
+ while ((acquiredRequests.size() < resource->mResourceCount) &&
+ (waitingRequests.size() > 0)) {
+ MediaSystemResourceRequest& request = waitingRequests.front();
+ MOZ_ASSERT(request.mParent);
+ // Send response
+ mozilla::Unused << request.mParent->SendResponse(request.mId, true /* success */);
+ // Move request to mAcquiredRequests
+ acquiredRequests.push_back(waitingRequests.front());
+ waitingRequests.pop_front();
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaSystemResourceService.h b/dom/media/systemservices/MediaSystemResourceService.h
new file mode 100644
index 000000000..06e1b537c
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceService.h
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceService_h_)
+#define MediaSystemResourceService_h_
+
+#include <deque>
+
+#include "MediaSystemResourceTypes.h"
+#include "mozilla/StaticPtr.h"
+#include "nsClassHashtable.h"
+
+namespace mozilla {
+
+namespace media {
+class MediaSystemResourceManagerParent;
+} // namespace media
+
+/**
+ * Manage media system resource allocation requests within system.
+ */
+class MediaSystemResourceService
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaSystemResourceService)
+
+ static MediaSystemResourceService* Get();
+ static void Init();
+ static void Shutdown();
+
+ void Acquire(media::MediaSystemResourceManagerParent* aParent,
+ uint32_t aId,
+ MediaSystemResourceType aResourceType,
+ bool aWillWait);
+
+ void ReleaseResource(media::MediaSystemResourceManagerParent* aParent,
+ uint32_t aId,
+ MediaSystemResourceType aResourceType);
+
+ void ReleaseResource(media::MediaSystemResourceManagerParent* aParent);
+
+private:
+ MediaSystemResourceService();
+ ~MediaSystemResourceService();
+
+ struct MediaSystemResourceRequest {
+ MediaSystemResourceRequest()
+ : mParent(nullptr), mId(-1) {}
+ MediaSystemResourceRequest(media::MediaSystemResourceManagerParent* aParent, uint32_t aId)
+ : mParent(aParent), mId(aId) {}
+ media::MediaSystemResourceManagerParent* mParent;
+ uint32_t mId;
+ };
+
+ struct MediaSystemResource {
+ MediaSystemResource()
+ : mResourceCount(0) {}
+ explicit MediaSystemResource(uint32_t aResourceCount)
+ : mResourceCount(aResourceCount) {}
+
+ std::deque<MediaSystemResourceRequest> mWaitingRequests;
+ std::deque<MediaSystemResourceRequest> mAcquiredRequests;
+ uint32_t mResourceCount;
+ };
+
+ void Destroy();
+
+ void RemoveRequest(media::MediaSystemResourceManagerParent* aParent,
+ uint32_t aId,
+ MediaSystemResourceType aResourceType);
+
+ void RemoveRequests(media::MediaSystemResourceManagerParent* aParent,
+ MediaSystemResourceType aResourceType);
+
+ void UpdateRequests(MediaSystemResourceType aResourceType);
+
+ bool mDestroyed;
+
+ nsClassHashtable<nsUint32HashKey, MediaSystemResource> mResources;
+
+ static StaticRefPtr<MediaSystemResourceService> sSingleton;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/systemservices/MediaSystemResourceTypes.h b/dom/media/systemservices/MediaSystemResourceTypes.h
new file mode 100644
index 000000000..3257d89d2
--- /dev/null
+++ b/dom/media/systemservices/MediaSystemResourceTypes.h
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#if !defined(MediaSystemResourceTypes_h_)
+#define MediaSystemResourceTypes_h_
+
+namespace mozilla {
+
+enum class MediaSystemResourceType : uint32_t {
+ VIDEO_DECODER = 0,
+ AUDIO_DECODER, // Not supported currently.
+ VIDEO_ENCODER,
+ AUDIO_ENCODER, // Not supported currently.
+ CAMERA, // Not supported currently.
+ INVALID_RESOURCE,
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/systemservices/MediaTaskUtils.h b/dom/media/systemservices/MediaTaskUtils.h
new file mode 100644
index 000000000..c9b64fd2a
--- /dev/null
+++ b/dom/media/systemservices/MediaTaskUtils.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_MediaTaskUtils_h
+#define mozilla_MediaTaskUtils_h
+
+#include "nsThreadUtils.h"
+
+// The main reason this file is separate from MediaUtils.h
+#include "base/task.h"
+
+namespace mozilla {
+namespace media {
+
+/* media::NewTaskFrom() - Create a Task from a lambda.
+ *
+ * Similar to media::NewRunnableFrom() - Create an nsRunnable from a lambda.
+ */
+
+template<typename OnRunType>
+class LambdaTask : public Runnable
+{
+public:
+ explicit LambdaTask(OnRunType&& aOnRun) : mOnRun(Move(aOnRun)) {}
+private:
+ NS_IMETHOD
+ Run() override
+ {
+ mOnRun();
+ return NS_OK;
+ }
+ OnRunType mOnRun;
+};
+
+template<typename OnRunType>
+already_AddRefed<LambdaTask<OnRunType>>
+NewTaskFrom(OnRunType&& aOnRun)
+{
+ typedef LambdaTask<OnRunType> LambdaType;
+ RefPtr<LambdaType> lambda = new LambdaType(Forward<OnRunType>(aOnRun));
+ return lambda.forget();
+}
+
+} // namespace media
+} // namespace mozilla
+
+#endif // mozilla_MediaTaskUtils_h
diff --git a/dom/media/systemservices/MediaUtils.cpp b/dom/media/systemservices/MediaUtils.cpp
new file mode 100644
index 000000000..a77e3404a
--- /dev/null
+++ b/dom/media/systemservices/MediaUtils.cpp
@@ -0,0 +1,15 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaUtils.h"
+
+namespace mozilla {
+namespace media {
+
+NS_IMPL_ISUPPORTS(ShutdownBlocker, nsIAsyncShutdownBlocker)
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/systemservices/MediaUtils.h b/dom/media/systemservices/MediaUtils.h
new file mode 100644
index 000000000..18f7d3e41
--- /dev/null
+++ b/dom/media/systemservices/MediaUtils.h
@@ -0,0 +1,373 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_MediaUtils_h
+#define mozilla_MediaUtils_h
+
+#include "nsThreadUtils.h"
+#include "nsIAsyncShutdown.h"
+#include "mozilla/UniquePtr.h"
+
+namespace mozilla {
+namespace media {
+
+/*
+ * media::Pledge - A promise-like pattern for c++ that takes lambda functions.
+ *
+ * Asynchronous APIs that proxy to another thread or to the chrome process and
+ * back may find it useful to return a pledge to callers who then use
+ * pledge.Then(func) to specify a lambda function to be invoked with the result
+ * later back on this same thread.
+ *
+ * Callers will enjoy that lambdas allow "capturing" of local variables, much
+ * like closures in JavaScript (safely by-copy by default).
+ *
+ * Callers will also enjoy that they do not need to be thread-safe (their code
+ * runs on the same thread after all).
+ *
+ * Advantageously, pledges are non-threadsafe by design (because locking and
+ * event queues are redundant). This means none of the lambdas you pass in,
+ * or variables you lambda-capture into them, need be threasafe or support
+ * threadsafe refcounting. After all, they'll run later on the same thread.
+ *
+ * RefPtr<media::Pledge<Foo>> p = GetFooAsynchronously(); // returns a pledge
+ * p->Then([](const Foo& foo) {
+ * // use foo here (same thread. Need not be thread-safe!)
+ * });
+ *
+ * See media::CoatCheck below for an example of GetFooAsynchronously().
+ */
+
+class PledgeBase
+{
+public:
+ NS_INLINE_DECL_REFCOUNTING(PledgeBase);
+protected:
+ virtual ~PledgeBase() {};
+};
+
+template<typename ValueType, typename ErrorType = nsresult>
+class Pledge : public PledgeBase
+{
+ // TODO: Remove workaround once mozilla allows std::function from <functional>
+ // wo/std::function support, do template + virtual trick to accept lambdas
+ class FunctorsBase
+ {
+ public:
+ FunctorsBase() {}
+ virtual void Succeed(ValueType& result) = 0;
+ virtual void Fail(ErrorType& error) = 0;
+ virtual ~FunctorsBase() {};
+ };
+
+public:
+ explicit Pledge() : mDone(false), mRejected(false) {}
+ Pledge(const Pledge& aOther) = delete;
+ Pledge& operator = (const Pledge&) = delete;
+
+ template<typename OnSuccessType>
+ void Then(OnSuccessType&& aOnSuccess)
+ {
+ Then(Forward<OnSuccessType>(aOnSuccess), [](ErrorType&){});
+ }
+
+ template<typename OnSuccessType, typename OnFailureType>
+ void Then(OnSuccessType&& aOnSuccess, OnFailureType&& aOnFailure)
+ {
+ class Functors : public FunctorsBase
+ {
+ public:
+ Functors(OnSuccessType&& aOnSuccessRef, OnFailureType&& aOnFailureRef)
+ : mOnSuccess(Move(aOnSuccessRef)), mOnFailure(Move(aOnFailureRef)) {}
+
+ void Succeed(ValueType& result)
+ {
+ mOnSuccess(result);
+ }
+ void Fail(ErrorType& error)
+ {
+ mOnFailure(error);
+ };
+
+ OnSuccessType mOnSuccess;
+ OnFailureType mOnFailure;
+ };
+ mFunctors = MakeUnique<Functors>(Forward<OnSuccessType>(aOnSuccess),
+ Forward<OnFailureType>(aOnFailure));
+ if (mDone) {
+ if (!mRejected) {
+ mFunctors->Succeed(mValue);
+ } else {
+ mFunctors->Fail(mError);
+ }
+ }
+ }
+
+ void Resolve(const ValueType& aValue)
+ {
+ mValue = aValue;
+ Resolve();
+ }
+
+ void Reject(ErrorType rv)
+ {
+ if (!mDone) {
+ mDone = mRejected = true;
+ mError = rv;
+ if (mFunctors) {
+ mFunctors->Fail(mError);
+ }
+ }
+ }
+
+protected:
+ void Resolve()
+ {
+ if (!mDone) {
+ mDone = true;
+ MOZ_ASSERT(!mRejected);
+ if (mFunctors) {
+ mFunctors->Succeed(mValue);
+ }
+ }
+ }
+
+ ValueType mValue;
+private:
+ ~Pledge() {};
+ bool mDone;
+ bool mRejected;
+ ErrorType mError;
+ UniquePtr<FunctorsBase> mFunctors;
+};
+
+/* media::NewRunnableFrom() - Create a Runnable from a lambda.
+ *
+ * Passing variables (closures) to an async function is clunky with Runnable:
+ *
+ * void Foo()
+ * {
+ * class FooRunnable : public Runnable
+ * {
+ * public:
+ * FooRunnable(const Bar &aBar) : mBar(aBar) {}
+ * NS_IMETHOD Run() override
+ * {
+ * // Use mBar
+ * }
+ * private:
+ * RefPtr<Bar> mBar;
+ * };
+ *
+ * RefPtr<Bar> bar = new Bar();
+ * NS_DispatchToMainThread(new FooRunnable(bar);
+ * }
+ *
+ * It's worse with more variables. Lambdas have a leg up with variable capture:
+ *
+ * void Foo()
+ * {
+ * RefPtr<Bar> bar = new Bar();
+ * NS_DispatchToMainThread(media::NewRunnableFrom([bar]() mutable {
+ * // use bar
+ * });
+ * }
+ *
+ * Capture is by-copy by default, so the nsRefPtr 'bar' is safely copied for
+ * access on the other thread (threadsafe refcounting in bar is assumed).
+ *
+ * The 'mutable' keyword is only needed for non-const access to bar.
+ */
+
+template<typename OnRunType>
+class LambdaRunnable : public Runnable
+{
+public:
+ explicit LambdaRunnable(OnRunType&& aOnRun) : mOnRun(Move(aOnRun)) {}
+private:
+ NS_IMETHODIMP
+ Run() override
+ {
+ return mOnRun();
+ }
+ OnRunType mOnRun;
+};
+
+template<typename OnRunType>
+already_AddRefed<LambdaRunnable<OnRunType>>
+NewRunnableFrom(OnRunType&& aOnRun)
+{
+ typedef LambdaRunnable<OnRunType> LambdaType;
+ RefPtr<LambdaType> lambda = new LambdaType(Forward<OnRunType>(aOnRun));
+ return lambda.forget();
+}
+
+/* media::CoatCheck - There and back again. Park an object in exchange for an id.
+ *
+ * A common problem with calling asynchronous functions that do work on other
+ * threads or processes is how to pass in a heap object for use once the
+ * function completes, without requiring that object to have threadsafe
+ * refcounting, contain mutexes, be marshaled, or leak if things fail
+ * (or worse, intermittent use-after-free because of lifetime issues).
+ *
+ * One solution is to set up a coat-check on the caller side, park your object
+ * in exchange for an id, and send the id. Common in IPC, but equally useful
+ * for same-process thread-hops, because by never leaving the thread there's
+ * no need for objects to be threadsafe or use threadsafe refcounting. E.g.
+ *
+ * class FooDoer
+ * {
+ * CoatCheck<Foo> mOutstandingFoos;
+ *
+ * public:
+ * void DoFoo()
+ * {
+ * RefPtr<Foo> foo = new Foo();
+ * uint32_t requestId = mOutstandingFoos.Append(*foo);
+ * sChild->SendFoo(requestId);
+ * }
+ *
+ * void RecvFooResponse(uint32_t requestId)
+ * {
+ * RefPtr<Foo> foo = mOutstandingFoos.Remove(requestId);
+ * if (foo) {
+ * // use foo
+ * }
+ * }
+ * };
+ *
+ * If you read media::Pledge earlier, here's how this is useful for pledges:
+ *
+ * class FooGetter
+ * {
+ * CoatCheck<Pledge<Foo>> mOutstandingPledges;
+ *
+ * public:
+ * already_addRefed<Pledge<Foo>> GetFooAsynchronously()
+ * {
+ * RefPtr<Pledge<Foo>> p = new Pledge<Foo>();
+ * uint32_t requestId = mOutstandingPledges.Append(*p);
+ * sChild->SendFoo(requestId);
+ * return p.forget();
+ * }
+ *
+ * void RecvFooResponse(uint32_t requestId, const Foo& fooResult)
+ * {
+ * RefPtr<Foo> p = mOutstandingPledges.Remove(requestId);
+ * if (p) {
+ * p->Resolve(fooResult);
+ * }
+ * }
+ * };
+ *
+ * This helper is currently optimized for very small sets (i.e. not optimized).
+ * It is also not thread-safe as the whole point is to stay on the same thread.
+ */
+
+template<class T>
+class CoatCheck
+{
+public:
+ typedef std::pair<uint32_t, RefPtr<T>> Element;
+
+ uint32_t Append(T& t)
+ {
+ uint32_t id = GetNextId();
+ mElements.AppendElement(Element(id, RefPtr<T>(&t)));
+ return id;
+ }
+
+ already_AddRefed<T> Remove(uint32_t aId)
+ {
+ for (auto& element : mElements) {
+ if (element.first == aId) {
+ RefPtr<T> ref;
+ ref.swap(element.second);
+ mElements.RemoveElement(element);
+ return ref.forget();
+ }
+ }
+ MOZ_ASSERT_UNREACHABLE("Received id with no matching parked object!");
+ return nullptr;
+ }
+
+private:
+ static uint32_t GetNextId()
+ {
+ static uint32_t counter = 0;
+ return ++counter;
+ };
+ AutoTArray<Element, 3> mElements;
+};
+
+/* media::Refcountable - Add threadsafe ref-counting to something that isn't.
+ *
+ * Often, reference counting is the most practical way to share an object with
+ * another thread without imposing lifetime restrictions, even if there's
+ * otherwise no concurrent access happening on the object. For instance, an
+ * algorithm on another thread may find it more expedient to modify a passed-in
+ * object, rather than pass expensive copies back and forth.
+ *
+ * Lists in particular often aren't ref-countable, yet are expensive to copy,
+ * e.g. nsTArray<RefPtr<Foo>>. Refcountable can be used to make such objects
+ * (or owning smart-pointers to such objects) refcountable.
+ *
+ * Technical limitation: A template specialization is needed for types that take
+ * a constructor. Please add below (UniquePtr covers a lot of ground though).
+ */
+
+template<typename T>
+class Refcountable : public T
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Refcountable<T>)
+private:
+ ~Refcountable<T>() {}
+};
+
+template<typename T>
+class Refcountable<UniquePtr<T>> : public UniquePtr<T>
+{
+public:
+ explicit Refcountable<UniquePtr<T>>(T* aPtr) : UniquePtr<T>(aPtr) {}
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Refcountable<T>)
+private:
+ ~Refcountable<UniquePtr<T>>() {}
+};
+
+/* media::ShutdownBlocker - Async shutdown helper.
+ */
+
+class ShutdownBlocker : public nsIAsyncShutdownBlocker
+{
+public:
+ ShutdownBlocker(const nsString& aName) : mName(aName) {}
+
+ NS_IMETHOD
+ BlockShutdown(nsIAsyncShutdownClient* aProfileBeforeChange) override = 0;
+
+ NS_IMETHOD GetName(nsAString& aName) override
+ {
+ aName = mName;
+ return NS_OK;
+ }
+
+ NS_IMETHOD GetState(nsIPropertyBag**) override
+ {
+ return NS_OK;
+ }
+
+ NS_DECL_ISUPPORTS
+protected:
+ virtual ~ShutdownBlocker() {}
+private:
+ const nsString mName;
+};
+
+} // namespace media
+} // namespace mozilla
+
+#endif // mozilla_MediaUtils_h
diff --git a/dom/media/systemservices/OSXRunLoopSingleton.cpp b/dom/media/systemservices/OSXRunLoopSingleton.cpp
new file mode 100644
index 000000000..6211d5c12
--- /dev/null
+++ b/dom/media/systemservices/OSXRunLoopSingleton.cpp
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OSXRunLoopSingleton.h"
+#include <mozilla/StaticMutex.h>
+
+#include <AudioUnit/AudioUnit.h>
+#include <CoreAudio/AudioHardware.h>
+#include <CoreAudio/HostTime.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+static bool gRunLoopSet = false;
+static mozilla::StaticMutex gMutex;
+
+void mozilla_set_coreaudio_notification_runloop_if_needed()
+{
+ mozilla::StaticMutexAutoLock lock(gMutex);
+ if (gRunLoopSet) {
+ return;
+ }
+
+ /* This is needed so that AudioUnit listeners get called on this thread, and
+ * not the main thread. If we don't do that, they are not called, or a crash
+ * occur, depending on the OSX version. */
+ AudioObjectPropertyAddress runloop_address = {
+ kAudioHardwarePropertyRunLoop,
+ kAudioObjectPropertyScopeGlobal,
+ kAudioObjectPropertyElementMaster
+ };
+
+ CFRunLoopRef run_loop = nullptr;
+
+ OSStatus r;
+ r = AudioObjectSetPropertyData(kAudioObjectSystemObject,
+ &runloop_address,
+ 0, NULL, sizeof(CFRunLoopRef), &run_loop);
+ if (r != noErr) {
+ NS_WARNING("Could not make global CoreAudio notifications use their own thread.");
+ }
+
+ gRunLoopSet = true;
+}
diff --git a/dom/media/systemservices/OSXRunLoopSingleton.h b/dom/media/systemservices/OSXRunLoopSingleton.h
new file mode 100644
index 000000000..d06365e14
--- /dev/null
+++ b/dom/media/systemservices/OSXRunLoopSingleton.h
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef OSXRUNLOOPSINGLETON_H_
+#define OSXRUNLOOPSINGLETON_H_
+
+#include <mozilla/Types.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/* This function tells CoreAudio to use its own thread for device change
+ * notifications, and can be called from any thread without external
+ * synchronization. */
+void MOZ_EXPORT
+mozilla_set_coreaudio_notification_runloop_if_needed();
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif // OSXRUNLOOPSINGLETON_H_
diff --git a/dom/media/systemservices/OpenSLESProvider.cpp b/dom/media/systemservices/OpenSLESProvider.cpp
new file mode 100644
index 000000000..c7348afa0
--- /dev/null
+++ b/dom/media/systemservices/OpenSLESProvider.cpp
@@ -0,0 +1,189 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OpenSLESProvider.h"
+#include "mozilla/Logging.h"
+#include "nsDebug.h"
+
+#include <dlfcn.h>
+#include <SLES/OpenSLES_Android.h>
+#include <SLES/OpenSLES_AndroidConfiguration.h>
+
+// MOZ_LOG=OpenSLESProvider:5
+#undef LOG
+#undef LOG_ENABLED
+mozilla::LazyLogModule gOpenSLESProviderLog("OpenSLESProvider");
+#define LOG(args) MOZ_LOG(gOpenSLESProviderLog, mozilla::LogLevel::Debug, args)
+#define LOG_ENABLED() MOZ_LOG_TEST(gOpenSLESProviderLog, mozilla::LogLevel::Debug)
+
+namespace mozilla {
+
+OpenSLESProvider::OpenSLESProvider()
+ : mLock("OpenSLESProvider.mLock"),
+ mSLEngine(nullptr),
+ mSLEngineUsers(0),
+ mIsRealized(false),
+ mOpenSLESLib(nullptr)
+{
+ LOG(("OpenSLESProvider being initialized"));
+}
+
+OpenSLESProvider::~OpenSLESProvider()
+{
+ if (mOpenSLESLib) {
+ LOG(("OpenSLES Engine was not properly Destroyed"));
+ (void)dlclose(mOpenSLESLib);
+ }
+}
+
+/* static */
+OpenSLESProvider& OpenSLESProvider::getInstance()
+{
+ // This doesn't need a Mutex in C++11 or GCC 4.3+, see N2660 and
+ // https://gcc.gnu.org/projects/cxx0x.html
+ static OpenSLESProvider instance;
+ return instance;
+}
+
+/* static */
+SLresult OpenSLESProvider::Get(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions)
+{
+ OpenSLESProvider& provider = OpenSLESProvider::getInstance();
+ return provider.GetEngine(aObjectm, aOptionCount, aOptions);
+}
+
+SLresult OpenSLESProvider::GetEngine(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions)
+{
+ MutexAutoLock lock(mLock);
+ LOG(("Getting OpenSLES engine"));
+ // Bug 1042051: Validate options are the same
+ if (mSLEngine != nullptr) {
+ *aObjectm = mSLEngine;
+ mSLEngineUsers++;
+ LOG(("Returning existing engine, %d users", mSLEngineUsers));
+ return SL_RESULT_SUCCESS;
+ } else {
+ int res = ConstructEngine(aObjectm, aOptionCount, aOptions);
+ if (res == SL_RESULT_SUCCESS) {
+ // Bug 1042051: Store engine options
+ mSLEngine = *aObjectm;
+ mSLEngineUsers++;
+ LOG(("Returning new engine"));
+ } else {
+ LOG(("Error getting engine: %d", res));
+ }
+ return res;
+ }
+}
+
+SLresult OpenSLESProvider::ConstructEngine(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions)
+{
+ mLock.AssertCurrentThreadOwns();
+
+ if (!mOpenSLESLib) {
+ mOpenSLESLib = dlopen("libOpenSLES.so", RTLD_LAZY);
+ if (!mOpenSLESLib) {
+ LOG(("Failed to dlopen OpenSLES library"));
+ return SL_RESULT_MEMORY_FAILURE;
+ }
+ }
+
+ typedef SLresult (*slCreateEngine_t)(SLObjectItf *,
+ SLuint32,
+ const SLEngineOption *,
+ SLuint32,
+ const SLInterfaceID *,
+ const SLboolean *);
+
+ slCreateEngine_t f_slCreateEngine =
+ (slCreateEngine_t)dlsym(mOpenSLESLib, "slCreateEngine");
+ int result = f_slCreateEngine(aObjectm, aOptionCount, aOptions, 0, NULL, NULL);
+ return result;
+}
+
+/* static */
+void OpenSLESProvider::Destroy(SLObjectItf * aObjectm)
+{
+ OpenSLESProvider& provider = OpenSLESProvider::getInstance();
+ provider.DestroyEngine(aObjectm);
+}
+
+void OpenSLESProvider::DestroyEngine(SLObjectItf * aObjectm)
+{
+ MutexAutoLock lock(mLock);
+ NS_ASSERTION(mOpenSLESLib, "OpenSLES destroy called but library is not open");
+
+ mSLEngineUsers--;
+ LOG(("Freeing engine, %d users left", mSLEngineUsers));
+ if (mSLEngineUsers) {
+ return;
+ }
+
+ (*(*aObjectm))->Destroy(*aObjectm);
+ // This assumes SLObjectItf is a pointer, but given the previous line,
+ // that's a given.
+ *aObjectm = nullptr;
+
+ (void)dlclose(mOpenSLESLib);
+ mOpenSLESLib = nullptr;
+ mIsRealized = false;
+}
+
+/* static */
+SLresult OpenSLESProvider::Realize(SLObjectItf aObjectm)
+{
+ OpenSLESProvider& provider = OpenSLESProvider::getInstance();
+ return provider.RealizeEngine(aObjectm);
+}
+
+SLresult OpenSLESProvider::RealizeEngine(SLObjectItf aObjectm)
+{
+ MutexAutoLock lock(mLock);
+ NS_ASSERTION(mOpenSLESLib, "OpenSLES realize called but library is not open");
+ NS_ASSERTION(aObjectm != nullptr, "OpenSLES realize engine with empty ObjectItf");
+
+ if (mIsRealized) {
+ LOG(("Not realizing already realized engine"));
+ return SL_RESULT_SUCCESS;
+ } else {
+ SLresult res = (*aObjectm)->Realize(aObjectm, SL_BOOLEAN_FALSE);
+ if (res != SL_RESULT_SUCCESS) {
+ LOG(("Error realizing OpenSLES engine: %d", res));
+ } else {
+ LOG(("Realized OpenSLES engine"));
+ mIsRealized = true;
+ }
+ return res;
+ }
+}
+
+} // namespace mozilla
+
+extern "C" {
+SLresult mozilla_get_sles_engine(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions)
+{
+ return mozilla::OpenSLESProvider::Get(aObjectm, aOptionCount, aOptions);
+}
+
+void mozilla_destroy_sles_engine(SLObjectItf * aObjectm)
+{
+ mozilla::OpenSLESProvider::Destroy(aObjectm);
+}
+
+SLresult mozilla_realize_sles_engine(SLObjectItf aObjectm)
+{
+ return mozilla::OpenSLESProvider::Realize(aObjectm);
+}
+
+}
+
diff --git a/dom/media/systemservices/OpenSLESProvider.h b/dom/media/systemservices/OpenSLESProvider.h
new file mode 100644
index 000000000..6253e9519
--- /dev/null
+++ b/dom/media/systemservices/OpenSLESProvider.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _OPENSLESPROVIDER_H_
+#define _OPENSLESPROVIDER_H_
+
+#include <SLES/OpenSLES.h>
+#include <mozilla/Types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern MOZ_EXPORT
+SLresult mozilla_get_sles_engine(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions);
+extern MOZ_EXPORT
+void mozilla_destroy_sles_engine(SLObjectItf * aObjectm);
+/* Realize is always in synchronous mode. */
+extern MOZ_EXPORT
+SLresult mozilla_realize_sles_engine(SLObjectItf aObjectm);
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+#include "mozilla/Mutex.h"
+
+extern mozilla::LazyLogModule gOpenSLESProviderLog;
+
+namespace mozilla {
+
+class OpenSLESProvider {
+public:
+ static SLresult Get(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions);
+ static void Destroy(SLObjectItf * aObjectm);
+ static SLresult Realize(SLObjectItf aObjectm);
+private:
+ OpenSLESProvider();
+ ~OpenSLESProvider();
+ OpenSLESProvider(OpenSLESProvider const&); // NO IMPLEMENTATION
+ void operator=(OpenSLESProvider const&); // NO IMPLEMENTATION
+ static OpenSLESProvider& getInstance();
+ SLresult GetEngine(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions);
+ SLresult ConstructEngine(SLObjectItf * aObjectm,
+ SLuint32 aOptionCount,
+ const SLEngineOption *aOptions);
+ SLresult RealizeEngine(SLObjectItf aObjectm);
+ void DestroyEngine(SLObjectItf * aObjectm);
+
+ // Protect all our internal variables
+ mozilla::Mutex mLock;
+ SLObjectItf mSLEngine;
+ int mSLEngineUsers;
+ bool mIsRealized;
+ void *mOpenSLESLib;
+};
+
+} //namespace
+#endif // cplusplus
+
+#endif /* _OPENSLESPROVIDER_H_ */
diff --git a/dom/media/systemservices/PCameras.ipdl b/dom/media/systemservices/PCameras.ipdl
new file mode 100644
index 000000000..b9fa58329
--- /dev/null
+++ b/dom/media/systemservices/PCameras.ipdl
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PContent;
+include protocol PBackground;
+
+using mozilla::camera::CaptureEngine from "mozilla/media/CamerasTypes.h";
+
+namespace mozilla {
+namespace camera {
+
+struct CaptureCapability
+{
+ int width;
+ int height;
+ int maxFPS;
+ int expectedCaptureDelay;
+ int rawType;
+ int codecType;
+ bool interlaced;
+};
+
+async protocol PCameras
+{
+ manager PBackground;
+
+child:
+ async FrameSizeChange(CaptureEngine capEngine, int cap_id, int w, int h);
+ // transfers ownership of |buffer| from parent to child
+ async DeliverFrame(CaptureEngine capEngine, int cap_id,
+ Shmem buffer, size_t size, uint32_t time_stamp,
+ int64_t ntp_time, int64_t render_time);
+ async DeviceChange();
+ async ReplyNumberOfCaptureDevices(int numdev);
+ async ReplyNumberOfCapabilities(int numdev);
+ async ReplyAllocateCaptureDevice(int numdev);
+ async ReplyGetCaptureCapability(CaptureCapability cap);
+ async ReplyGetCaptureDevice(nsCString device_name, nsCString device_id, bool scary);
+ async ReplyFailure();
+ async ReplySuccess();
+ async __delete__();
+
+parent:
+ async NumberOfCaptureDevices(CaptureEngine engine);
+ async NumberOfCapabilities(CaptureEngine engine, nsCString deviceUniqueIdUTF8);
+
+ async GetCaptureCapability(CaptureEngine engine, nsCString unique_idUTF8, int capability_number);
+ async GetCaptureDevice(CaptureEngine engine, int num);
+
+ async AllocateCaptureDevice(CaptureEngine engine, nsCString unique_idUTF8, nsCString origin);
+ async ReleaseCaptureDevice(CaptureEngine engine, int numdev);
+ async StartCapture(CaptureEngine engine, int numdev, CaptureCapability capability);
+ async StopCapture(CaptureEngine engine, int numdev);
+ // transfers frame back
+ async ReleaseFrame(Shmem s);
+
+ // Ask parent to delete us
+ async AllDone();
+ // setup camera engine
+ async EnsureInitialized(CaptureEngine engine);
+};
+
+} // namespace camera
+} // namespace mozilla
diff --git a/dom/media/systemservices/PMedia.ipdl b/dom/media/systemservices/PMedia.ipdl
new file mode 100644
index 000000000..c060f030e
--- /dev/null
+++ b/dom/media/systemservices/PMedia.ipdl
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PContent;
+
+namespace mozilla {
+namespace media {
+
+protocol PMedia
+{
+ manager PContent;
+
+parent:
+ /**
+ * Requests a potentially persistent unique secret key for each origin.
+ * Has no expiry, but is cleared by age along with cookies.
+ * This is needed by mediaDevices.enumerateDevices() to produce persistent
+ * deviceIds that wont work cross-origin.
+ *
+ * If aPrivateBrowsing is false, a key for this origin is returned from a
+ * primary pool of temporal in-memory keys and persistent keys read from disk.
+ * If no key exists, a temporal one is created.
+ * If aPersist is true and key is temporal, the key is promoted to persistent.
+ * Once persistent, a key cannot become temporal again.
+ *
+ * If aPrivateBrowsing is true, a different key for this origin is returned
+ * from a secondary pool that is never persisted to disk, and aPersist is
+ * ignored.
+ */
+ async GetOriginKey(uint32_t aRequestId, nsCString aOrigin, bool aPrivateBrowsing,
+ bool aPersist);
+
+ /**
+ * Clear per-orgin list of persistent deviceIds stored for enumerateDevices
+ * Fire and forget.
+ *
+ * aSinceTime - milliseconds since 1 January 1970 00:00:00 UTC. 0 = clear all
+ *
+ * aOnlyPrivateBrowsing - if true then only purge the separate in-memory
+ * per-origin list used in Private Browsing.
+ */
+ async SanitizeOriginKeys(uint64_t aSinceWhen, bool aOnlyPrivateBrowsing);
+
+child:
+ async GetOriginKeyResponse(uint32_t aRequestId, nsCString key);
+ async __delete__();
+};
+
+} // namespace media
+} // namespace mozilla
diff --git a/dom/media/systemservices/PMediaSystemResourceManager.ipdl b/dom/media/systemservices/PMediaSystemResourceManager.ipdl
new file mode 100644
index 000000000..8ba546765
--- /dev/null
+++ b/dom/media/systemservices/PMediaSystemResourceManager.ipdl
@@ -0,0 +1,37 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PImageBridge;
+include "mozilla/media/MediaSystemResourceMessageUtils.h";
+
+using mozilla::MediaSystemResourceType from "mozilla/media/MediaSystemResourceTypes.h";
+
+namespace mozilla {
+namespace media {
+
+/*
+ * The PMediaSystemResourceManager is a sub-protocol in PImageBridge
+ */
+sync protocol PMediaSystemResourceManager
+{
+ manager PImageBridge;
+
+child:
+ async Response(uint32_t aId, bool aSuccess);
+ async __delete__();
+
+parent:
+ async Acquire(uint32_t aId, MediaSystemResourceType aResourceType, bool aWillWait);
+ async Release(uint32_t aId);
+
+ /**
+ * Asynchronously tell the parent side to remove the PMediaSystemResourceManager.
+ */
+ async RemoveResourceManager();
+};
+
+} // namespace media
+} // namespace mozilla
+
diff --git a/dom/media/systemservices/ShmemPool.cpp b/dom/media/systemservices/ShmemPool.cpp
new file mode 100644
index 000000000..334a94e35
--- /dev/null
+++ b/dom/media/systemservices/ShmemPool.cpp
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/Assertions.h"
+#include "mozilla/Logging.h"
+#include "mozilla/ShmemPool.h"
+#include "mozilla/Move.h"
+
+namespace mozilla {
+
+ShmemPool::ShmemPool(size_t aPoolSize)
+ : mMutex("mozilla::ShmemPool"),
+ mPoolFree(aPoolSize)
+#ifdef DEBUG
+ ,mMaxPoolUse(0)
+#endif
+{
+ mShmemPool.SetLength(aPoolSize);
+}
+
+mozilla::ShmemBuffer ShmemPool::GetIfAvailable(size_t aSize)
+{
+ MutexAutoLock lock(mMutex);
+
+ // Pool is empty, don't block caller.
+ if (mPoolFree == 0) {
+ // This isn't initialized, so will be understood as an error.
+ return ShmemBuffer();
+ }
+
+ ShmemBuffer& res = mShmemPool[mPoolFree - 1];
+
+ if (!res.mInitialized) {
+ LOG(("No free preallocated Shmem"));
+ return ShmemBuffer();
+ }
+
+ MOZ_ASSERT(res.mShmem.IsWritable(), "Pool in Shmem is not writable?");
+
+ if (res.mShmem.Size<char>() < aSize) {
+ LOG(("Free Shmem but not of the right size"));
+ return ShmemBuffer();
+ }
+
+ mPoolFree--;
+#ifdef DEBUG
+ size_t poolUse = mShmemPool.Length() - mPoolFree;
+ if (poolUse > mMaxPoolUse) {
+ mMaxPoolUse = poolUse;
+ LOG(("Maximum ShmemPool use increased: %d buffers", mMaxPoolUse));
+ }
+#endif
+ return Move(res);
+}
+
+void ShmemPool::Put(ShmemBuffer&& aShmem)
+{
+ MutexAutoLock lock(mMutex);
+ MOZ_ASSERT(mPoolFree < mShmemPool.Length());
+ mShmemPool[mPoolFree] = Move(aShmem);
+ mPoolFree++;
+#ifdef DEBUG
+ size_t poolUse = mShmemPool.Length() - mPoolFree;
+ if (poolUse > 0) {
+ LOG(("ShmemPool usage reduced to %d buffers", poolUse));
+ }
+#endif
+}
+
+ShmemPool::~ShmemPool()
+{
+#ifdef DEBUG
+ for (size_t i = 0; i < mShmemPool.Length(); i++) {
+ MOZ_ASSERT(!mShmemPool[i].Valid());
+ }
+#endif
+}
+
+} // namespace mozilla
diff --git a/dom/media/systemservices/ShmemPool.h b/dom/media/systemservices/ShmemPool.h
new file mode 100644
index 000000000..95901ffa0
--- /dev/null
+++ b/dom/media/systemservices/ShmemPool.h
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_ShmemPool_h
+#define mozilla_ShmemPool_h
+
+#include "mozilla/ipc/Shmem.h"
+#include "mozilla/Mutex.h"
+
+#undef LOG
+#undef LOG_ENABLED
+extern mozilla::LazyLogModule gCamerasParentLog;
+#define LOG(args) MOZ_LOG(gCamerasParentLog, mozilla::LogLevel::Debug, args)
+#define LOG_ENABLED() MOZ_LOG_TEST(gCamerasParentLog, mozilla::LogLevel::Debug)
+
+namespace mozilla {
+
+class ShmemPool;
+
+class ShmemBuffer {
+public:
+ ShmemBuffer() : mInitialized(false) {}
+ explicit ShmemBuffer(mozilla::ipc::Shmem aShmem) {
+ mInitialized = true;
+ mShmem = aShmem;
+ }
+
+ ShmemBuffer(ShmemBuffer&& rhs) {
+ mInitialized = rhs.mInitialized;
+ mShmem = Move(rhs.mShmem);
+ }
+
+ ShmemBuffer& operator=(ShmemBuffer&& rhs) {
+ MOZ_ASSERT(&rhs != this, "self-moves are prohibited");
+ mInitialized = rhs.mInitialized;
+ mShmem = Move(rhs.mShmem);
+ return *this;
+ }
+
+ // No copies allowed
+ ShmemBuffer(const ShmemBuffer&) = delete;
+ ShmemBuffer& operator=(const ShmemBuffer&) = delete;
+
+ bool Valid() {
+ return mInitialized;
+ }
+
+ char* GetBytes() {
+ return mShmem.get<char>();
+ }
+
+ mozilla::ipc::Shmem& Get() {
+ return mShmem;
+ }
+
+private:
+ friend class ShmemPool;
+
+ bool mInitialized;
+ mozilla::ipc::Shmem mShmem;
+};
+
+class ShmemPool {
+public:
+ explicit ShmemPool(size_t aPoolSize);
+ ~ShmemPool();
+ // Get/GetIfAvailable differ in what thread they can run on. GetIfAvailable
+ // can run anywhere but won't allocate if the right size isn't available.
+ ShmemBuffer GetIfAvailable(size_t aSize);
+ void Put(ShmemBuffer&& aShmem);
+
+ // We need to use the allocation/deallocation functions
+ // of a specific IPC child/parent instance.
+ template <class T>
+ void Cleanup(T* aInstance)
+ {
+ MutexAutoLock lock(mMutex);
+ for (size_t i = 0; i < mShmemPool.Length(); i++) {
+ if (mShmemPool[i].mInitialized) {
+ aInstance->DeallocShmem(mShmemPool[i].Get());
+ mShmemPool[i].mInitialized = false;
+ }
+ }
+ }
+
+ template <class T>
+ ShmemBuffer Get(T* aInstance, size_t aSize)
+ {
+ MutexAutoLock lock(mMutex);
+
+ // Pool is empty, don't block caller.
+ if (mPoolFree == 0) {
+ // This isn't initialized, so will be understood as an error.
+ return ShmemBuffer();
+ }
+
+ ShmemBuffer& res = mShmemPool[mPoolFree - 1];
+
+ if (!res.mInitialized) {
+ LOG(("Initializing new Shmem in pool"));
+ if (!aInstance->AllocShmem(aSize, ipc::SharedMemory::TYPE_BASIC, &res.mShmem)) {
+ LOG(("Failure allocating new Shmem buffer"));
+ return ShmemBuffer();
+ }
+ res.mInitialized = true;
+ }
+
+ MOZ_ASSERT(res.mShmem.IsWritable(), "Shmem in Pool is not writable?");
+
+ // Prepare buffer, increase size if needed (we never shrink as we don't
+ // maintain seperate sized pools and we don't want to keep reallocating)
+ if (res.mShmem.Size<char>() < aSize) {
+ LOG(("Size change/increase in Shmem Pool"));
+ aInstance->DeallocShmem(res.mShmem);
+ res.mInitialized = false;
+ // this may fail; always check return value
+ if (!aInstance->AllocShmem(aSize, ipc::SharedMemory::TYPE_BASIC, &res.mShmem)) {
+ LOG(("Failure allocating resized Shmem buffer"));
+ return ShmemBuffer();
+ } else {
+ res.mInitialized = true;
+ }
+ }
+
+ MOZ_ASSERT(res.mShmem.IsWritable(), "Shmem in Pool is not writable post resize?");
+
+ mPoolFree--;
+#ifdef DEBUG
+ size_t poolUse = mShmemPool.Length() - mPoolFree;
+ if (poolUse > mMaxPoolUse) {
+ mMaxPoolUse = poolUse;
+ LOG(("Maximum ShmemPool use increased: %d buffers", mMaxPoolUse));
+ }
+#endif
+ return Move(res);
+ }
+
+private:
+ Mutex mMutex;
+ size_t mPoolFree;
+#ifdef DEBUG
+ size_t mMaxPoolUse;
+#endif
+ nsTArray<ShmemBuffer> mShmemPool;
+};
+
+
+} // namespace mozilla
+
+#endif // mozilla_ShmemPool_h
diff --git a/dom/media/systemservices/moz.build b/dom/media/systemservices/moz.build
new file mode 100644
index 000000000..33e5ed1f1
--- /dev/null
+++ b/dom/media/systemservices/moz.build
@@ -0,0 +1,104 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+if CONFIG['MOZ_WEBRTC']:
+ EXPORTS += [
+ 'CamerasChild.h',
+ 'CamerasParent.h',
+ 'LoadManager.h',
+ 'LoadManagerFactory.h',
+ 'LoadMonitor.h',
+ ]
+ UNIFIED_SOURCES += [
+ 'CamerasChild.cpp',
+ 'CamerasParent.cpp',
+ 'LoadManager.cpp',
+ 'LoadManagerFactory.cpp',
+ 'LoadMonitor.cpp',
+ 'ShmemPool.cpp',
+ ]
+ LOCAL_INCLUDES += [
+ '/media/webrtc/signaling',
+ '/media/webrtc/trunk',
+ ]
+if CONFIG['OS_TARGET'] == 'WINNT':
+ DEFINES['WEBRTC_WIN'] = True
+else:
+ DEFINES['WEBRTC_POSIX'] = True
+
+
+if CONFIG['OS_TARGET'] == 'Android':
+ EXPORTS += [
+ 'OpenSLESProvider.h'
+ ]
+ UNIFIED_SOURCES += [
+ 'OpenSLESProvider.cpp',
+ ]
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
+ UNIFIED_SOURCES += ['OSXRunLoopSingleton.cpp']
+ EXPORTS += ['OSXRunLoopSingleton.h']
+
+if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
+ if CONFIG['ANDROID_VERSION'] >= '17':
+ LOCAL_INCLUDES += [
+ '%' + '%s/frameworks/wilhelm/include' % CONFIG['ANDROID_SOURCE'],
+ ]
+ else:
+ LOCAL_INCLUDES += [
+ '%' + '%s/system/media/wilhelm/include' % CONFIG['ANDROID_SOURCE'],
+ ]
+
+if CONFIG['_MSC_VER']:
+ DEFINES['__PRETTY_FUNCTION__'] = '__FUNCSIG__'
+
+ # This is intended as a temporary workaround to enable building with VS2015.
+ # media\webrtc\trunk\webrtc/base/criticalsection.h(59): warning C4312:
+ # 'reinterpret_cast': conversion from 'DWORD' to 'HANDLE' of greater size
+ CXXFLAGS += ['-wd4312']
+
+EXPORTS.mozilla += ['ShmemPool.h',]
+
+EXPORTS.mozilla.media += ['CamerasTypes.h',
+ 'DeviceChangeCallback.h',
+ 'MediaChild.h',
+ 'MediaParent.h',
+ 'MediaSystemResourceClient.h',
+ 'MediaSystemResourceManager.h',
+ 'MediaSystemResourceManagerChild.h',
+ 'MediaSystemResourceManagerParent.h',
+ 'MediaSystemResourceMessageUtils.h',
+ 'MediaSystemResourceService.h',
+ 'MediaSystemResourceTypes.h',
+ 'MediaTaskUtils.h',
+ 'MediaUtils.h',
+]
+UNIFIED_SOURCES += [
+ 'MediaChild.cpp',
+ 'MediaParent.cpp',
+ 'MediaSystemResourceClient.cpp',
+ 'MediaSystemResourceManager.cpp',
+ 'MediaSystemResourceManagerChild.cpp',
+ 'MediaSystemResourceManagerParent.cpp',
+ 'MediaSystemResourceService.cpp',
+ 'MediaUtils.cpp',
+]
+IPDL_SOURCES += [
+ 'PCameras.ipdl',
+ 'PMedia.ipdl',
+ 'PMediaSystemResourceManager.ipdl',
+]
+# /dom/base needed for nsGlobalWindow.h in MediaChild.cpp
+LOCAL_INCLUDES += [
+ '/dom/base',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/test/16bit_wave_extrametadata.wav b/dom/media/test/16bit_wave_extrametadata.wav
new file mode 100644
index 000000000..443ec73a3
--- /dev/null
+++ b/dom/media/test/16bit_wave_extrametadata.wav
Binary files differ
diff --git a/dom/media/test/16bit_wave_extrametadata.wav^headers^ b/dom/media/test/16bit_wave_extrametadata.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/16bit_wave_extrametadata.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/320x240.ogv b/dom/media/test/320x240.ogv
new file mode 100644
index 000000000..093158432
--- /dev/null
+++ b/dom/media/test/320x240.ogv
Binary files differ
diff --git a/dom/media/test/320x240.ogv^headers^ b/dom/media/test/320x240.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/320x240.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/448636.ogv b/dom/media/test/448636.ogv
new file mode 100644
index 000000000..628df924f
--- /dev/null
+++ b/dom/media/test/448636.ogv
Binary files differ
diff --git a/dom/media/test/448636.ogv^headers^ b/dom/media/test/448636.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/448636.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/A4.ogv b/dom/media/test/A4.ogv
new file mode 100644
index 000000000..de99616ec
--- /dev/null
+++ b/dom/media/test/A4.ogv
Binary files differ
diff --git a/dom/media/test/A4.ogv^headers^ b/dom/media/test/A4.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/A4.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/VID_0001.ogg b/dom/media/test/VID_0001.ogg
new file mode 100644
index 000000000..0068b9af8
--- /dev/null
+++ b/dom/media/test/VID_0001.ogg
Binary files differ
diff --git a/dom/media/test/VID_0001.ogg^headers^ b/dom/media/test/VID_0001.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/VID_0001.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/allowed.sjs b/dom/media/test/allowed.sjs
new file mode 100644
index 000000000..3c2258557
--- /dev/null
+++ b/dom/media/test/allowed.sjs
@@ -0,0 +1,56 @@
+function parseQuery(request, key) {
+ var params = request.queryString.split('&');
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") == 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key == "")
+ return p;
+ }
+ return false;
+}
+
+var types = {
+ js: "text/javascript",
+ m4s: "video/mp4",
+ mp4: "video/mp4",
+ ogg: "video/ogg",
+ ogv: "video/ogg",
+ oga: "audio/ogg",
+ webm: "video/webm",
+ wav: "audio/x-wav"
+};
+
+// Return file with name as per the query string with access control
+// allow headers.
+function handleRequest(request, response)
+{
+ var resource = parseQuery(request, "");
+
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/test/" + resource;
+ var split = paths.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+ dump("file=" + file + "\n");
+ bis.setInputStream(fis);
+ var bytes = bis.readBytes(bis.available());
+ response.setStatusLine(request.httpVersion, 206, "Partial Content");
+ response.setHeader("Content-Range", "bytes 0-" + (bytes.length - 1) + "/" + bytes.length);
+ response.setHeader("Content-Length", ""+bytes.length, false);
+ var ext = resource.substring(resource.lastIndexOf(".")+1);
+ response.setHeader("Content-Type", types[ext], false);
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ response.write(bytes, bytes.length);
+ bis.close();
+}
diff --git a/dom/media/test/audio-gaps-short.ogg b/dom/media/test/audio-gaps-short.ogg
new file mode 100644
index 000000000..e01a24bfd
--- /dev/null
+++ b/dom/media/test/audio-gaps-short.ogg
Binary files differ
diff --git a/dom/media/test/audio-gaps-short.ogg^headers^ b/dom/media/test/audio-gaps-short.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/audio-gaps-short.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/audio-gaps.ogg b/dom/media/test/audio-gaps.ogg
new file mode 100644
index 000000000..ce96748cc
--- /dev/null
+++ b/dom/media/test/audio-gaps.ogg
Binary files differ
diff --git a/dom/media/test/audio-gaps.ogg^headers^ b/dom/media/test/audio-gaps.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/audio-gaps.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/audio-overhang.ogg b/dom/media/test/audio-overhang.ogg
new file mode 100644
index 000000000..c07986e7a
--- /dev/null
+++ b/dom/media/test/audio-overhang.ogg
Binary files differ
diff --git a/dom/media/test/audio-overhang.ogg^headers^ b/dom/media/test/audio-overhang.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/audio-overhang.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/audio.wav b/dom/media/test/audio.wav
new file mode 100644
index 000000000..c6fd5cb86
--- /dev/null
+++ b/dom/media/test/audio.wav
Binary files differ
diff --git a/dom/media/test/audio.wav^headers^ b/dom/media/test/audio.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/audio.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/background_video.js b/dom/media/test/background_video.js
new file mode 100644
index 000000000..06618d30f
--- /dev/null
+++ b/dom/media/test/background_video.js
@@ -0,0 +1,115 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+/* jshint esversion: 6, -W097 */
+/* globals SimpleTest, SpecialPowers, info, is, ok */
+
+"use strict";
+
+function startTest(test) {
+ info(test.desc);
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({ 'set': test.prefs }, () => {
+ manager.runTests(test.tests, test.runTest);
+ });
+}
+
+/**
+ * @param {string} url video src.
+ * @returns {HTMLMediaElement} The created video element.
+ */
+function appendVideoToDoc(url, token, width, height) {
+ // Default size of (160, 120) is used by other media tests.
+ if (width === undefined) { width = 160; }
+ if (height === undefined) { height = 3*width/4; }
+
+ let v = document.createElement('video');
+ v.token = token;
+ document.body.appendChild(v);
+ v.width = width;
+ v.height = height;
+ v.src = url;
+ return v;
+}
+
+/**
+ * @param {HTMLMediaElement} video Video element under test.
+ * @returns {Promise} Promise that is resolved when video 'playing' event fires and rejected on error.
+ */
+function waitUntilPlaying(video) {
+ var p = once(video, 'playing', () => { ok(true, video.token + " played."); });
+ Log(video.token, "Start playing");
+ video.play();
+ return p;
+}
+
+/**
+ * @param {HTMLMediaElement} video Video element under test.
+ * @returns {Promise} Promise which is resolved when video 'ended' event fires.
+ */
+function waitUntilEnded(video) {
+ Log(video.token, "Waiting for ended");
+ if (video.ended) {
+ ok(true, video.token + " already ended");
+ return Promise.resolve();
+ }
+
+ return once(video, 'ended', () => { ok(true, video.token + " ended"); });
+}
+
+/**
+ * @param {HTMLMediaElement} video Video element under test.
+ * @returns {Promise} Promise that is resolved when video decode suspends.
+ */
+function testVideoSuspendsWhenHidden(video) {
+ let p = once(video, 'mozentervideosuspend').then(() => {
+ ok(true, video.token + " suspends");
+ });
+ Log(video.token, "Set hidden");
+ video.setVisible(false);
+ return p;
+}
+
+/**
+ * @param {HTMLMediaElement} video Video element under test.
+ * @returns {Promise} Promise that is resolved when video decode resumes.
+ */
+function testVideoResumesWhenShown(video) {
+ var p = once(video, 'mozexitvideosuspend').then(() => {
+ ok(true, video.token + " resumes");
+ });
+ Log(video.token, "Set visible");
+ video.setVisible(true);
+ return p;
+}
+
+/**
+ * @param {HTMLVideoElement} video Video element under test.
+ * @returns {Promise} Promise that is resolved if video ends and rejects if video suspends.
+ */
+function checkVideoDoesntSuspend(video) {
+ let p = Promise.race([
+ waitUntilEnded(video).then(() => { ok(true, video.token + ' ended before decode was suspended')}),
+ once(video, 'mozentervideosuspend', () => { Promise.reject(new Error(video.token + ' suspended')) })
+ ]);
+ Log(video.token, "Set hidden.");
+ video.setVisible(false);
+ return p;
+}
+
+/**
+ * @param {HTMLMediaElement} video Video element under test.
+ * @param {number} time video current time to wait til.
+ * @returns {Promise} Promise that is resolved once currentTime passes time.
+ */
+function waitTil(video, time) {
+ Log(video.token, "Waiting for time to reach " + time + "s");
+ return new Promise(resolve => {
+ video.addEventListener('timeupdate', function timeUpdateEvent() {
+ if (video.currentTime > time) {
+ video.removeEventListener(name, timeUpdateEvent);
+ resolve();
+ }
+ });
+ });
+}
diff --git a/dom/media/test/bad-signature.vtt b/dom/media/test/bad-signature.vtt
new file mode 100644
index 000000000..c9a59b35e
--- /dev/null
+++ b/dom/media/test/bad-signature.vtt
@@ -0,0 +1 @@
+WEB
diff --git a/dom/media/test/badtags.ogg b/dom/media/test/badtags.ogg
new file mode 100644
index 000000000..12d835873
--- /dev/null
+++ b/dom/media/test/badtags.ogg
Binary files differ
diff --git a/dom/media/test/badtags.ogg^headers^ b/dom/media/test/badtags.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/badtags.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/basic.vtt b/dom/media/test/basic.vtt
new file mode 100644
index 000000000..7781790d0
--- /dev/null
+++ b/dom/media/test/basic.vtt
@@ -0,0 +1,27 @@
+WEBVTT
+Region: id=testOne lines=2 width=30%
+Region: id=testTwo lines=4 width=20%
+
+1
+00:00.500 --> 00:00.700 region:testOne
+This
+
+2
+00:01.200 --> 00:02.400 region:testTwo
+Is
+
+2.5
+00:02.000 --> 00:03.500 region:testOne
+(Over here?!)
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+5
+00:03.217 --> 00:03.989
+And more!
diff --git a/dom/media/test/beta-phrasebook.ogg b/dom/media/test/beta-phrasebook.ogg
new file mode 100644
index 000000000..7e6ef77ec
--- /dev/null
+++ b/dom/media/test/beta-phrasebook.ogg
Binary files differ
diff --git a/dom/media/test/beta-phrasebook.ogg^headers^ b/dom/media/test/beta-phrasebook.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/beta-phrasebook.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/big-short.wav b/dom/media/test/big-short.wav
new file mode 100644
index 000000000..c850e5fd1
--- /dev/null
+++ b/dom/media/test/big-short.wav
Binary files differ
diff --git a/dom/media/test/big-short.wav^headers^ b/dom/media/test/big-short.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/big-short.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/big.wav b/dom/media/test/big.wav
new file mode 100644
index 000000000..5f66bc1f0
--- /dev/null
+++ b/dom/media/test/big.wav
Binary files differ
diff --git a/dom/media/test/big.wav^headers^ b/dom/media/test/big.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/big.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-audio-key1.xml b/dom/media/test/bipbop-cenc-audio-key1.xml
new file mode 100644
index 000000000..a1672eece
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio-key1.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ This XML file describes the encryption applied to |bipbop_<res>-cenc*|. To
+ generate the encrypted files, run bipbop-cenc.sh
+-->
+
+<GPACDRM type="CENC AES-CTR">
+
+ <DRMInfo type="pssh" version="1">
+ <!--
+ SystemID specified in
+ https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/cenc-format.html
+ -->
+ <BS ID128="1077efecc0b24d02ace33c1e52e2fb4b" />
+ <!-- Number of KeyIDs = 1 -->
+ <BS bits="32" value="1" />
+ <!-- KeyID -->
+ <BS ID128="0x7e571d047e571d047e571d047e571d21" />
+ </DRMInfo>
+
+ <CrypTrack trackID="2" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d047e571d047e571d047e571d21"
+ value="0x7e5744447e5744447e5744447e574421" />
+ </CrypTrack>
+
+</GPACDRM>
diff --git a/dom/media/test/bipbop-cenc-audio-key2.xml b/dom/media/test/bipbop-cenc-audio-key2.xml
new file mode 100644
index 000000000..b70660905
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio-key2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ This XML file describes the encryption applied to |bipbop_<res>-cenc*|. To
+ generate the encrypted files, run bipbop-cenc.sh
+-->
+
+<GPACDRM type="CENC AES-CTR">
+
+ <DRMInfo type="pssh" version="1">
+ <!--
+ SystemID specified in
+ https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/cenc-format.html
+ -->
+ <BS ID128="1077efecc0b24d02ace33c1e52e2fb4b" />
+ <!-- Number of KeyIDs = 1 -->
+ <BS bits="32" value="1" />
+ <!-- KeyID -->
+ <BS ID128="0x7e571d047e571d047e571d047e571d22" />
+ </DRMInfo>
+
+ <CrypTrack trackID="2" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d047e571d047e571d047e571d22"
+ value="0x7e5744447e5744447e5744447e574422" />
+ </CrypTrack>
+
+</GPACDRM>
diff --git a/dom/media/test/bipbop-cenc-audio1.m4s b/dom/media/test/bipbop-cenc-audio1.m4s
new file mode 100644
index 000000000..63cfd66f7
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-audio1.m4s^headers^ b/dom/media/test/bipbop-cenc-audio1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-audio2.m4s b/dom/media/test/bipbop-cenc-audio2.m4s
new file mode 100644
index 000000000..04a6cb6ff
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-audio2.m4s^headers^ b/dom/media/test/bipbop-cenc-audio2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-audio3.m4s b/dom/media/test/bipbop-cenc-audio3.m4s
new file mode 100644
index 000000000..ad0cd72f9
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-audio3.m4s^headers^ b/dom/media/test/bipbop-cenc-audio3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audio3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-audioinit.mp4 b/dom/media/test/bipbop-cenc-audioinit.mp4
new file mode 100644
index 000000000..b827aa49a
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audioinit.mp4
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-audioinit.mp4^headers^ b/dom/media/test/bipbop-cenc-audioinit.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-audioinit.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-video-key1.xml b/dom/media/test/bipbop-cenc-video-key1.xml
new file mode 100644
index 000000000..f0d9878fa
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-video-key1.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ This XML file describes the encryption applied to |bipbop_<res>-cenc*|. To
+ generate the encrypted files, run bipbop-cenc.sh
+-->
+
+<GPACDRM type="CENC AES-CTR">
+
+ <DRMInfo type="pssh" version="1">
+ <!--
+ SystemID specified in
+ https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/cenc-format.html
+ -->
+ <BS ID128="1077efecc0b24d02ace33c1e52e2fb4b" />
+ <!-- Number of KeyIDs = 1 -->
+ <BS bits="32" value="1" />
+ <!-- KeyID -->
+ <BS ID128="0x7e571d037e571d037e571d037e571d11" />
+ </DRMInfo>
+
+ <CrypTrack trackID="1" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d037e571d037e571d037e571d11"
+ value="0x7e5733337e5733337e5733337e573311" />
+ </CrypTrack>
+
+</GPACDRM>
diff --git a/dom/media/test/bipbop-cenc-video-key2.xml b/dom/media/test/bipbop-cenc-video-key2.xml
new file mode 100644
index 000000000..1f320e633
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-video-key2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ This XML file describes the encryption applied to |bipbop_<res>-cenc*|. To
+ generate the encrypted files, run bipbop-cenc.sh
+-->
+
+<GPACDRM type="CENC AES-CTR">
+
+ <DRMInfo type="pssh" version="1">
+ <!--
+ SystemID specified in
+ https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/cenc-format.html
+ -->
+ <BS ID128="1077efecc0b24d02ace33c1e52e2fb4b" />
+ <!-- Number of KeyIDs = 1 -->
+ <BS bits="32" value="1" />
+ <!-- KeyID -->
+ <BS ID128="0x7e571d037e571d037e571d037e571d12" />
+ </DRMInfo>
+
+ <CrypTrack trackID="1" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d037e571d037e571d037e571d12"
+ value="0x7e5733337e5733337e5733337e573312" />
+ </CrypTrack>
+
+</GPACDRM>
diff --git a/dom/media/test/bipbop-cenc-video1.m4s b/dom/media/test/bipbop-cenc-video1.m4s
new file mode 100644
index 000000000..755013c11
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-video1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-video1.m4s^headers^ b/dom/media/test/bipbop-cenc-video1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-video1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-video2.m4s b/dom/media/test/bipbop-cenc-video2.m4s
new file mode 100644
index 000000000..c884bd95f
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-video2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-video2.m4s^headers^ b/dom/media/test/bipbop-cenc-video2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-video2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc-videoinit.mp4 b/dom/media/test/bipbop-cenc-videoinit.mp4
new file mode 100644
index 000000000..aa87d0bbe
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-videoinit.mp4
Binary files differ
diff --git a/dom/media/test/bipbop-cenc-videoinit.mp4^headers^ b/dom/media/test/bipbop-cenc-videoinit.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-cenc-videoinit.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-cenc.sh b/dom/media/test/bipbop-cenc.sh
new file mode 100755
index 000000000..a00c38ae8
--- /dev/null
+++ b/dom/media/test/bipbop-cenc.sh
@@ -0,0 +1,29 @@
+mkdir work.tmp
+
+for r in 225w_175kbps 300_215kbps 300wp_227kbps 360w_253kbps 480_624kbps 480wp_663kbps 480_959kbps 480wp_1001kbps
+do
+ for k in 1 2
+ do
+ # Encrypt bipbop_<res>.mp4 with the keys specified in this file,
+ # and output to |bipbop_<res>-cenc-{video,audio}.mp4|
+ MP4Box -crypt bipbop-cenc-audio-key${k}.xml -rem 1 -out work.tmp/bipbop_${r}-cenc-audio-key${k}.mp4 bipbop_${r}.mp4
+ MP4Box -crypt bipbop-cenc-video-key${k}.xml -rem 2 -out work.tmp/bipbop_${r}-cenc-video-key${k}.mp4 bipbop_${r}.mp4
+
+ # Fragment |bipbop_<res>-cenc-*.mp4| into 500ms segments:
+ MP4Box -dash 500 -rap -segment-name work.tmp/bipbop_${r}-cenc-audio-key${k}- -subsegs-per-sidx 5 work.tmp/bipbop_${r}-cenc-audio-key${k}.mp4
+ MP4Box -dash 500 -rap -segment-name work.tmp/bipbop_${r}-cenc-video-key${k}- -subsegs-per-sidx 5 work.tmp/bipbop_${r}-cenc-video-key${k}.mp4
+
+ # The above command will generate a set of fragments |bipbop_<res>-cenc-{video,audio}-*.m4s
+ # and |bipbop_<res>-cenc-{video,audio}-init.mp4| containing just the init segment.
+
+ # Remove unneeded mpd files.
+ rm bipbop_${r}-cenc-{audio,video}-key${k}_dash.mpd
+ done
+done
+
+# Only keep the first 4 audio & 2 video segments:
+cp work.tmp/*-init[.]mp4 ./
+cp work.tmp/*audio*-[1234][.]m4s ./
+cp work.tmp/*video*-[12][.]m4s ./
+
+rm -Rf work.tmp
diff --git a/dom/media/test/bipbop-frag-cenc.xml b/dom/media/test/bipbop-frag-cenc.xml
new file mode 100644
index 000000000..6f6a4d90a
--- /dev/null
+++ b/dom/media/test/bipbop-frag-cenc.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ This XML file describes the encryption applied to |bipbop-cenc*|. To
+ generate the bipbop-cenc files, run the following commands:
+
+ Encrypt bipbop-no-edts.mp4 with the keys specified in this file,
+ and output to |bipbop-cenc-{video,audio}.mp4|
+ MP4Box -crypt bipbop-frag-cenc.xml -rem 2 -out bipbop-cenc-video.mp4 bipbop-no-edts.mp4
+ MP4Box -crypt bipbop-frag-cenc.xml -rem 1 -out bipbop-cenc-audio.mp4 bipbop-no-edts.mp4
+
+ Fragment |bipbop-cenc-*.mp4| into 500ms segments:
+ MP4Box -dash 500 -rap -segment-name bipbop-cenc-video -subsegs-per-sidx 5 bipbop-cenc-video.mp4
+ MP4Box -dash 500 -rap -segment-name bipbop-cenc-audio -subsegs-per-sidx 5 bipbop-cenc-audio.mp4
+
+ The above command will generate a set of fragments in |bipbop-cenc-{video,audio}*.m4s
+ and |bipbop-cenc-{video,audio}init.mp4| containing just the init segment.
+
+ To cut down the duration, we throw out all but the first 3 audio & 2 video segments:
+ rm bipbop-cenc-audio{[^123],[123][^.]}.m4s
+ rm bipbop-cenc-video{[^12],[12][^.]}.m4s
+
+ MP4Box will also have generated some *.mpd files we don't need:
+ rm bipbop-cenc-*.mpd
+
+ Delete intermediate encrypted files:
+ rm bipbop-cenc-{audio,video}.mp4
+-->
+
+<GPACDRM type="CENC AES-CTR">
+
+ <DRMInfo type="pssh" version="1">
+ <!--
+ SystemID specified in
+ https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/cenc-format.html
+ -->
+ <BS ID128="1077efecc0b24d02ace33c1e52e2fb4b" />
+ <!-- Number of KeyIDs = 2 -->
+ <BS bits="32" value="2" />
+ <!-- KeyID -->
+ <BS ID128="0x7e571d037e571d037e571d037e571d03" />
+ <BS ID128="0x7e571d047e571d047e571d047e571d04" />
+ </DRMInfo>
+
+ <CrypTrack trackID="1" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d037e571d037e571d037e571d03"
+ value="0x7e5733337e5733337e5733337e573333" />
+ </CrypTrack>
+
+ <CrypTrack trackID="2" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d047e571d047e571d047e571d04"
+ value="0x7e5744447e5744447e5744447e574444" />
+ </CrypTrack>
+
+</GPACDRM>
diff --git a/dom/media/test/bipbop-lateaudio.mp4 b/dom/media/test/bipbop-lateaudio.mp4
new file mode 100644
index 000000000..5b4cc5709
--- /dev/null
+++ b/dom/media/test/bipbop-lateaudio.mp4
Binary files differ
diff --git a/dom/media/test/bipbop-lateaudio.mp4^headers^ b/dom/media/test/bipbop-lateaudio.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop-lateaudio.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop-no-edts.mp4 b/dom/media/test/bipbop-no-edts.mp4
new file mode 100644
index 000000000..63435887d
--- /dev/null
+++ b/dom/media/test/bipbop-no-edts.mp4
Binary files differ
diff --git a/dom/media/test/bipbop.mp4 b/dom/media/test/bipbop.mp4
new file mode 100644
index 000000000..017d658f3
--- /dev/null
+++ b/dom/media/test/bipbop.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..40c3a7bb9
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..986e5fb18
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..547950e51
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..3214f131d
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..08713078d
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..0b13fed5f
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_225w_175kbps.mp4 b/dom/media/test/bipbop_225w_175kbps.mp4
new file mode 100644
index 000000000..abe37b9f9
--- /dev/null
+++ b/dom/media/test/bipbop_225w_175kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..21f386327
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..bc741cdf8
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..9c6818d06
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s
new file mode 100644
index 000000000..f327aaa57
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..543f18c24
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..f850ceaf0
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s
new file mode 100644
index 000000000..a28a106da
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..a05a87997
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300_215kbps.mp4 b/dom/media/test/bipbop_300_215kbps.mp4
new file mode 100644
index 000000000..af01e5fa3
--- /dev/null
+++ b/dom/media/test/bipbop_300_215kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..40c3a7bb9
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..986e5fb18
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..9c6818d06
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s
new file mode 100644
index 000000000..ce2e64eb3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..8592a5b0a
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..f850ceaf0
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s
new file mode 100644
index 000000000..d07ce9753
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..9d2fa23dd
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_300wp_227kbps.mp4 b/dom/media/test/bipbop_300wp_227kbps.mp4
new file mode 100644
index 000000000..149935531
--- /dev/null
+++ b/dom/media/test/bipbop_300wp_227kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..40c3a7bb9
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..986e5fb18
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..a571d47cf
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..42dbfec1e
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..9e4224cac
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..21763ecbd
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm b/dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm
new file mode 100644
index 000000000..4be8f340c
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm^headers^ b/dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-clearkey-audio.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm
new file mode 100644
index 000000000..56cf4c483
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm^headers^ b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp8.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm
new file mode 100644
index 000000000..9f411d0e3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm
Binary files differ
diff --git a/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm^headers^ b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps-clearkey-video-vp9.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_360w_253kbps.mp4 b/dom/media/test/bipbop_360w_253kbps.mp4
new file mode 100644
index 000000000..6c796f4e1
--- /dev/null
+++ b/dom/media/test/bipbop_360w_253kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..e626fa456
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..d7cbb2b6b
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..805f4bbf3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s
new file mode 100644
index 000000000..5bf999473
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..77c7daba5
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..c5127beec
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s
new file mode 100644
index 000000000..b0ff51f74
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..cfa099c04
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_624kbps.mp4 b/dom/media/test/bipbop_480_624kbps.mp4
new file mode 100644
index 000000000..27928b85f
--- /dev/null
+++ b/dom/media/test/bipbop_480_624kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..c9106aad9
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..888b20ab6
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..796ad1367
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s
new file mode 100644
index 000000000..d02be5319
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..6e0c60f98
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..06778e6f2
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s
new file mode 100644
index 000000000..4c1c603e8
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..f4a98eca9
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480_959kbps.mp4 b/dom/media/test/bipbop_480_959kbps.mp4
new file mode 100644
index 000000000..4a9f2ee82
--- /dev/null
+++ b/dom/media/test/bipbop_480_959kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..416bc7a7c
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..73d542cfe
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..796ad1367
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s
new file mode 100644
index 000000000..80824e9ff
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..5db21d091
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..06778e6f2
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s
new file mode 100644
index 000000000..38a081187
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..bc8bddf50
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_1001kbps.mp4 b/dom/media/test/bipbop_480wp_1001kbps.mp4
new file mode 100644
index 000000000..600376cf8
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_1001kbps.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s
new file mode 100644
index 000000000..e2bd754c7
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s
new file mode 100644
index 000000000..347835fee
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s
new file mode 100644
index 000000000..64b0da69a
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s
new file mode 100644
index 000000000..864f4248a
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4 b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4
new file mode 100644
index 000000000..416bc7a7c
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s
new file mode 100644
index 000000000..a8896e069
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s
new file mode 100644
index 000000000..0f0a35ce7
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s
new file mode 100644
index 000000000..fece52ff4
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-3.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s
new file mode 100644
index 000000000..70e61e3d5
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-4.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4 b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4
new file mode 100644
index 000000000..73d542cfe
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-audio-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s
new file mode 100644
index 000000000..805f4bbf3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s
new file mode 100644
index 000000000..0a40d1cb7
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4 b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4
new file mode 100644
index 000000000..5db21d091
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key1-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s
new file mode 100644
index 000000000..c5127beec
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-1.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s
new file mode 100644
index 000000000..3f344022a
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-2.m4s^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4 b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4
new file mode 100644
index 000000000..bc8bddf50
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4
Binary files differ
diff --git a/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4^headers^ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps-cenc-video-key2-init.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bipbop_480wp_663kbps.mp4 b/dom/media/test/bipbop_480wp_663kbps.mp4
new file mode 100644
index 000000000..3cc1da69d
--- /dev/null
+++ b/dom/media/test/bipbop_480wp_663kbps.mp4
Binary files differ
diff --git a/dom/media/test/black100x100-aspect3to2.ogv b/dom/media/test/black100x100-aspect3to2.ogv
new file mode 100644
index 000000000..81fe51ffb
--- /dev/null
+++ b/dom/media/test/black100x100-aspect3to2.ogv
Binary files differ
diff --git a/dom/media/test/black100x100-aspect3to2.ogv^headers^ b/dom/media/test/black100x100-aspect3to2.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/black100x100-aspect3to2.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bogus.duh b/dom/media/test/bogus.duh
new file mode 100644
index 000000000..528ae275d
--- /dev/null
+++ b/dom/media/test/bogus.duh
@@ -0,0 +1,45 @@
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
diff --git a/dom/media/test/bogus.ogv b/dom/media/test/bogus.ogv
new file mode 100644
index 000000000..528ae275d
--- /dev/null
+++ b/dom/media/test/bogus.ogv
@@ -0,0 +1,45 @@
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
diff --git a/dom/media/test/bogus.ogv^headers^ b/dom/media/test/bogus.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bogus.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bogus.wav b/dom/media/test/bogus.wav
new file mode 100644
index 000000000..528ae275d
--- /dev/null
+++ b/dom/media/test/bogus.wav
@@ -0,0 +1,45 @@
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
+bogus bogus bogus
diff --git a/dom/media/test/bogus.wav^headers^ b/dom/media/test/bogus.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bogus.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug1066943.webm b/dom/media/test/bug1066943.webm
new file mode 100644
index 000000000..64a24ec89
--- /dev/null
+++ b/dom/media/test/bug1066943.webm
Binary files differ
diff --git a/dom/media/test/bug1066943.webm^headers^ b/dom/media/test/bug1066943.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug1066943.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug1301226-odd.wav b/dom/media/test/bug1301226-odd.wav
new file mode 100644
index 000000000..dd2df4e4d
--- /dev/null
+++ b/dom/media/test/bug1301226-odd.wav
Binary files differ
diff --git a/dom/media/test/bug1301226-odd.wav^headers^ b/dom/media/test/bug1301226-odd.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug1301226-odd.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug1301226.wav b/dom/media/test/bug1301226.wav
new file mode 100644
index 000000000..0128486f0
--- /dev/null
+++ b/dom/media/test/bug1301226.wav
Binary files differ
diff --git a/dom/media/test/bug1301226.wav^headers^ b/dom/media/test/bug1301226.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug1301226.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug461281.ogg b/dom/media/test/bug461281.ogg
new file mode 100644
index 000000000..d7f6a0ccf
--- /dev/null
+++ b/dom/media/test/bug461281.ogg
Binary files differ
diff --git a/dom/media/test/bug461281.ogg^headers^ b/dom/media/test/bug461281.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug461281.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug482461-theora.ogv b/dom/media/test/bug482461-theora.ogv
new file mode 100644
index 000000000..941b8d8ef
--- /dev/null
+++ b/dom/media/test/bug482461-theora.ogv
Binary files differ
diff --git a/dom/media/test/bug482461-theora.ogv^headers^ b/dom/media/test/bug482461-theora.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug482461-theora.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug482461.ogv b/dom/media/test/bug482461.ogv
new file mode 100644
index 000000000..6cf6aed33
--- /dev/null
+++ b/dom/media/test/bug482461.ogv
Binary files differ
diff --git a/dom/media/test/bug482461.ogv^headers^ b/dom/media/test/bug482461.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug482461.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug495129.ogv b/dom/media/test/bug495129.ogv
new file mode 100644
index 000000000..44eb9296f
--- /dev/null
+++ b/dom/media/test/bug495129.ogv
Binary files differ
diff --git a/dom/media/test/bug495129.ogv^headers^ b/dom/media/test/bug495129.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug495129.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug495794.ogg b/dom/media/test/bug495794.ogg
new file mode 100644
index 000000000..1c19a6406
--- /dev/null
+++ b/dom/media/test/bug495794.ogg
Binary files differ
diff --git a/dom/media/test/bug495794.ogg^headers^ b/dom/media/test/bug495794.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug495794.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug498380.ogv b/dom/media/test/bug498380.ogv
new file mode 100644
index 000000000..1179ecb70
--- /dev/null
+++ b/dom/media/test/bug498380.ogv
Binary files differ
diff --git a/dom/media/test/bug498380.ogv^headers^ b/dom/media/test/bug498380.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug498380.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug498855-1.ogv b/dom/media/test/bug498855-1.ogv
new file mode 100644
index 000000000..95a524da4
--- /dev/null
+++ b/dom/media/test/bug498855-1.ogv
Binary files differ
diff --git a/dom/media/test/bug498855-1.ogv^headers^ b/dom/media/test/bug498855-1.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug498855-1.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug498855-2.ogv b/dom/media/test/bug498855-2.ogv
new file mode 100644
index 000000000..795a308ae
--- /dev/null
+++ b/dom/media/test/bug498855-2.ogv
Binary files differ
diff --git a/dom/media/test/bug498855-2.ogv^headers^ b/dom/media/test/bug498855-2.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug498855-2.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug498855-3.ogv b/dom/media/test/bug498855-3.ogv
new file mode 100644
index 000000000..714858dfe
--- /dev/null
+++ b/dom/media/test/bug498855-3.ogv
Binary files differ
diff --git a/dom/media/test/bug498855-3.ogv^headers^ b/dom/media/test/bug498855-3.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug498855-3.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug499519.ogv b/dom/media/test/bug499519.ogv
new file mode 100644
index 000000000..62c0922d3
--- /dev/null
+++ b/dom/media/test/bug499519.ogv
Binary files differ
diff --git a/dom/media/test/bug499519.ogv^headers^ b/dom/media/test/bug499519.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug499519.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug500311.ogv b/dom/media/test/bug500311.ogv
new file mode 100644
index 000000000..2cf27ef1e
--- /dev/null
+++ b/dom/media/test/bug500311.ogv
Binary files differ
diff --git a/dom/media/test/bug500311.ogv^headers^ b/dom/media/test/bug500311.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug500311.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug501279.ogg b/dom/media/test/bug501279.ogg
new file mode 100644
index 000000000..e266f07ee
--- /dev/null
+++ b/dom/media/test/bug501279.ogg
Binary files differ
diff --git a/dom/media/test/bug501279.ogg^headers^ b/dom/media/test/bug501279.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug501279.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug504613.ogv b/dom/media/test/bug504613.ogv
new file mode 100644
index 000000000..5c7fd015e
--- /dev/null
+++ b/dom/media/test/bug504613.ogv
Binary files differ
diff --git a/dom/media/test/bug504613.ogv^headers^ b/dom/media/test/bug504613.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug504613.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug504644.ogv b/dom/media/test/bug504644.ogv
new file mode 100644
index 000000000..46fb4a876
--- /dev/null
+++ b/dom/media/test/bug504644.ogv
Binary files differ
diff --git a/dom/media/test/bug504644.ogv^headers^ b/dom/media/test/bug504644.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug504644.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug504843.ogv b/dom/media/test/bug504843.ogv
new file mode 100644
index 000000000..94b475086
--- /dev/null
+++ b/dom/media/test/bug504843.ogv
Binary files differ
diff --git a/dom/media/test/bug504843.ogv^headers^ b/dom/media/test/bug504843.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug504843.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug506094.ogv b/dom/media/test/bug506094.ogv
new file mode 100644
index 000000000..142b7b9ad
--- /dev/null
+++ b/dom/media/test/bug506094.ogv
Binary files differ
diff --git a/dom/media/test/bug506094.ogv^headers^ b/dom/media/test/bug506094.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug506094.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug516323.indexed.ogv b/dom/media/test/bug516323.indexed.ogv
new file mode 100644
index 000000000..7bd76eecc
--- /dev/null
+++ b/dom/media/test/bug516323.indexed.ogv
Binary files differ
diff --git a/dom/media/test/bug516323.indexed.ogv^headers^ b/dom/media/test/bug516323.indexed.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug516323.indexed.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug516323.ogv b/dom/media/test/bug516323.ogv
new file mode 100644
index 000000000..8f2f38b98
--- /dev/null
+++ b/dom/media/test/bug516323.ogv
Binary files differ
diff --git a/dom/media/test/bug516323.ogv^headers^ b/dom/media/test/bug516323.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug516323.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug520493.ogg b/dom/media/test/bug520493.ogg
new file mode 100644
index 000000000..6eb23198f
--- /dev/null
+++ b/dom/media/test/bug520493.ogg
Binary files differ
diff --git a/dom/media/test/bug520493.ogg^headers^ b/dom/media/test/bug520493.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug520493.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug520500.ogg b/dom/media/test/bug520500.ogg
new file mode 100644
index 000000000..b91d3dd97
--- /dev/null
+++ b/dom/media/test/bug520500.ogg
Binary files differ
diff --git a/dom/media/test/bug520500.ogg^headers^ b/dom/media/test/bug520500.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug520500.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug520908.ogv b/dom/media/test/bug520908.ogv
new file mode 100644
index 000000000..093158432
--- /dev/null
+++ b/dom/media/test/bug520908.ogv
Binary files differ
diff --git a/dom/media/test/bug520908.ogv^headers^ b/dom/media/test/bug520908.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug520908.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug523816.ogv b/dom/media/test/bug523816.ogv
new file mode 100644
index 000000000..ca9a31b6d
--- /dev/null
+++ b/dom/media/test/bug523816.ogv
Binary files differ
diff --git a/dom/media/test/bug523816.ogv^headers^ b/dom/media/test/bug523816.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug523816.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug533822.ogg b/dom/media/test/bug533822.ogg
new file mode 100644
index 000000000..a8e506910
--- /dev/null
+++ b/dom/media/test/bug533822.ogg
Binary files differ
diff --git a/dom/media/test/bug533822.ogg^headers^ b/dom/media/test/bug533822.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug533822.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug556821.ogv b/dom/media/test/bug556821.ogv
new file mode 100644
index 000000000..8d76fee45
--- /dev/null
+++ b/dom/media/test/bug556821.ogv
Binary files differ
diff --git a/dom/media/test/bug556821.ogv^headers^ b/dom/media/test/bug556821.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug556821.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug557094.ogv b/dom/media/test/bug557094.ogv
new file mode 100644
index 000000000..b4fc0799a
--- /dev/null
+++ b/dom/media/test/bug557094.ogv
Binary files differ
diff --git a/dom/media/test/bug557094.ogv^headers^ b/dom/media/test/bug557094.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug557094.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug580982.webm b/dom/media/test/bug580982.webm
new file mode 100644
index 000000000..802019f39
--- /dev/null
+++ b/dom/media/test/bug580982.webm
Binary files differ
diff --git a/dom/media/test/bug580982.webm^headers^ b/dom/media/test/bug580982.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug580982.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug603918.webm b/dom/media/test/bug603918.webm
new file mode 100644
index 000000000..c430e97f4
--- /dev/null
+++ b/dom/media/test/bug603918.webm
Binary files differ
diff --git a/dom/media/test/bug603918.webm^headers^ b/dom/media/test/bug603918.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug603918.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug604067.webm b/dom/media/test/bug604067.webm
new file mode 100644
index 000000000..86bdfdc91
--- /dev/null
+++ b/dom/media/test/bug604067.webm
Binary files differ
diff --git a/dom/media/test/bug604067.webm^headers^ b/dom/media/test/bug604067.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/bug604067.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/bug883173.vtt b/dom/media/test/bug883173.vtt
new file mode 100644
index 000000000..61f086bcc
--- /dev/null
+++ b/dom/media/test/bug883173.vtt
@@ -0,0 +1,16 @@
+WEBVTT
+
+00:03.000 --> 00:04.000
+Should display fifth.
+
+00:01.000 --> 00:02.000
+Should display first.
+
+00:01.000 --> 00:03.000
+Should display second.
+
+00:02.000 --> 00:04.000
+Should display forth.
+
+00:02.000 --> 00:03.000
+Should display third.
diff --git a/dom/media/test/can_play_type_dash.js b/dom/media/test/can_play_type_dash.js
new file mode 100644
index 000000000..ec5764be2
--- /dev/null
+++ b/dom/media/test/can_play_type_dash.js
@@ -0,0 +1,27 @@
+function check_dash(v, enabled) {
+ function check(type, expected) {
+ is(v.canPlayType(type), enabled ? expected : "", type);
+ }
+
+ // DASH types
+ check("application/dash+xml", "probably");
+
+ // Supported Webm codecs
+ check("application/dash+xml; codecs=vorbis", "probably");
+ check("application/dash+xml; codecs=vorbis", "probably");
+ check("application/dash+xml; codecs=vorbis,vp8", "probably");
+ check("application/dash+xml; codecs=vorbis,vp8.0", "probably");
+ check("application/dash+xml; codecs=\"vorbis,vp8\"", "probably");
+ check("application/dash+xml; codecs=\"vorbis,vp8.0\"", "probably");
+ check("application/dash+xml; codecs=\"vp8, vorbis\"", "probably");
+ check("application/dash+xml; codecs=\"vp8.0, vorbis\"", "probably");
+ check("application/dash+xml; codecs=vp8", "probably");
+ check("application/dash+xml; codecs=vp8.0", "probably");
+
+ // Unsupported codecs
+ check("application/dash+xml; codecs=xyz", "");
+ check("application/dash+xml; codecs=xyz,vorbis", "");
+ check("application/dash+xml; codecs=vorbis,xyz", "");
+ check("application/dash+xml; codecs=xyz,vp8.0", "");
+ check("application/dash+xml; codecs=vp8.0,xyz", "");
+}
diff --git a/dom/media/test/can_play_type_ogg.js b/dom/media/test/can_play_type_ogg.js
new file mode 100644
index 000000000..b9678bcac
--- /dev/null
+++ b/dom/media/test/can_play_type_ogg.js
@@ -0,0 +1,78 @@
+
+function check_ogg(v, enabled, finish) {
+ function check(type, expected) {
+ is(v.canPlayType(type), enabled ? expected : "", type);
+ }
+
+ function basic_test() {
+ return new Promise(function(resolve, reject) {
+ // Ogg types
+ check("video/ogg", "maybe");
+ check("audio/ogg", "maybe");
+ check("application/ogg", "maybe");
+
+ // Supported Ogg codecs
+ check("audio/ogg; codecs=vorbis", "probably");
+ check("video/ogg; codecs=vorbis", "probably");
+ check("video/ogg; codecs=vorbis,theora", "probably");
+ check("video/ogg; codecs=\"vorbis, theora\"", "probably");
+ check("video/ogg; codecs=theora", "probably");
+
+ resolve();
+ });
+ }
+
+ // Verify Opus support
+ function verify_opus_support() {
+ return new Promise(function(resolve, reject) {
+ var OpusEnabled = undefined;
+ try {
+ OpusEnabled = SpecialPowers.getBoolPref("media.opus.enabled");
+ } catch (ex) {
+ // SpecialPowers failed, perhaps because Opus isn't compiled in
+ console.log("media.opus.enabled pref not found; skipping Opus validation");
+ }
+ if (OpusEnabled != undefined) {
+ resolve();
+ } else {
+ reject();
+ }
+ });
+ }
+
+ function opus_enable() {
+ return new Promise(function(resolve, reject) {
+ SpecialPowers.pushPrefEnv({"set": [['media.opus.enabled', true]]},
+ function() {
+ check("audio/ogg; codecs=opus", "probably");
+ resolve();
+ });
+ });
+ }
+
+ function opus_disable() {
+ return new Promise(function(resolve, reject) {
+ SpecialPowers.pushPrefEnv({"set": [['media.opus.enabled', false]]},
+ function() {
+ check("audio/ogg; codecs=opus", "");
+ resolve();
+ });
+ });
+ }
+
+ function unspported_ogg() {
+ // Unsupported Ogg codecs
+ check("video/ogg; codecs=xyz", "");
+ check("video/ogg; codecs=xyz,vorbis", "");
+ check("video/ogg; codecs=vorbis,xyz", "");
+
+ finish.call();
+ }
+
+ basic_test()
+ .then(verify_opus_support)
+ .then(opus_enable)
+ .then(opus_disable)
+ .then(unspported_ogg, unspported_ogg);
+
+}
diff --git a/dom/media/test/can_play_type_wave.js b/dom/media/test/can_play_type_wave.js
new file mode 100644
index 000000000..d3ce534f9
--- /dev/null
+++ b/dom/media/test/can_play_type_wave.js
@@ -0,0 +1,29 @@
+function check_wave(v, enabled) {
+ function check(type, expected) {
+ is(v.canPlayType(type), enabled ? expected : "", type);
+ }
+
+ // Wave types
+ check("audio/wave", "maybe");
+ check("audio/wav", "maybe");
+ check("audio/x-wav", "maybe");
+ check("audio/x-pn-wav", "maybe");
+
+ // Supported Wave codecs
+ check("audio/wave; codecs=1", "probably");
+ check("audio/wave; codecs=6", "probably");
+ check("audio/wave; codecs=7", "probably");
+ // "no codecs" should be supported, I guess
+ check("audio/wave; codecs=", "probably");
+ check("audio/wave; codecs=\"\"", "probably");
+
+ // Unsupported Wave codecs
+ check("audio/wave; codecs=0", "");
+ check("audio/wave; codecs=2", "");
+ check("audio/wave; codecs=xyz,1", "");
+ check("audio/wave; codecs=1,xyz", "");
+ check("audio/wave; codecs=\"xyz, 1\"", "");
+ // empty codec names
+ check("audio/wave; codecs=,", "");
+ check("audio/wave; codecs=\"0, 1,\"", "");
+}
diff --git a/dom/media/test/can_play_type_webm.js b/dom/media/test/can_play_type_webm.js
new file mode 100644
index 000000000..eeb79b278
--- /dev/null
+++ b/dom/media/test/can_play_type_webm.js
@@ -0,0 +1,54 @@
+function check_webm(v, enabled) {
+ function check(type, expected) {
+ is(v.canPlayType(type), enabled ? expected : "", type);
+ }
+
+ // WebM types
+ check("video/webm", "maybe");
+ check("audio/webm", "maybe");
+
+ var video = ['vp8', 'vp8.0', 'vp9', 'vp9.0'];
+ var audio = ['vorbis', 'opus'];
+ // Check for FxOS case.
+ // Since we want to use OMX webm HW acceleration to speed up vp8 decoding,
+ // we enabled it after Android version 16(JB) as MOZ_OMX_WEBM_DECODER
+ // defined in moz.build. More information is on Bug 986381.
+ // Currently OMX (KK included) webm decoders can only support vp8 and vorbis,
+ // so only vp8 and vorbis will be tested when OMX webm decoder is enabled.
+ if (navigator.userAgent.indexOf("Mobile") != -1 &&
+ navigator.userAgent.indexOf("Android") == -1) {
+ // See nsSystemInfo.cpp, the getProperty('version') and
+ // getProperty('sdk_version') are different.
+ var androidSDKVer = SpecialPowers.Cc['@mozilla.org/system-info;1']
+ .getService(SpecialPowers.Ci.nsIPropertyBag2)
+ .getProperty('sdk_version');
+ info("android version:"+androidSDKVer);
+
+ // Since from Android KK, vp9 sw decoder is supported.
+ if (androidSDKVer > 18) {
+ video = ['vp8', 'vp8.0', 'vp9', 'vp9.0'];
+ audio = ['vorbis'];
+ } else if (androidSDKVer > 15) {
+ video = ['vp8', 'vp8.0'];
+ audio = ['vorbis'];
+ }
+
+ }
+
+ audio.forEach(function(acodec) {
+ check("audio/webm; codecs=" + acodec, "probably");
+ check("video/webm; codecs=" + acodec, "probably");
+ });
+ video.forEach(function(vcodec) {
+ check("video/webm; codecs=" + vcodec, "probably");
+ audio.forEach(function(acodec) {
+ check("video/webm; codecs=\"" + vcodec + ", " + acodec + "\"", "probably");
+ check("video/webm; codecs=\"" + acodec + ", " + vcodec + "\"", "probably");
+ });
+ });
+
+ // Unsupported WebM codecs
+ check("video/webm; codecs=xyz", "");
+ check("video/webm; codecs=xyz,vorbis", "");
+ check("video/webm; codecs=vorbis,xyz", "");
+}
diff --git a/dom/media/test/cancellable_request.sjs b/dom/media/test/cancellable_request.sjs
new file mode 100644
index 000000000..5b458e73c
--- /dev/null
+++ b/dom/media/test/cancellable_request.sjs
@@ -0,0 +1,154 @@
+function parseQuery(request, key) {
+ var params = request.queryString.split('&');
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") == 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key == "")
+ return p;
+ }
+ return false;
+}
+
+function push32BE(array, input) {
+ array.push(String.fromCharCode((input >> 24) & 0xff));
+ array.push(String.fromCharCode((input >> 16) & 0xff));
+ array.push(String.fromCharCode((input >> 8) & 0xff));
+ array.push(String.fromCharCode((input) & 0xff));
+}
+
+function push32LE(array, input) {
+ array.push(String.fromCharCode((input) & 0xff));
+ array.push(String.fromCharCode((input >> 8) & 0xff));
+ array.push(String.fromCharCode((input >> 16) & 0xff));
+ array.push(String.fromCharCode((input >> 24) & 0xff));
+}
+
+function push16LE(array, input) {
+ array.push(String.fromCharCode((input) & 0xff));
+ array.push(String.fromCharCode((input >> 8) & 0xff));
+}
+
+function buildWave(samples, sample_rate) {
+ const RIFF_MAGIC = 0x52494646;
+ const WAVE_MAGIC = 0x57415645;
+ const FRMT_MAGIC = 0x666d7420;
+ const DATA_MAGIC = 0x64617461;
+ const RIFF_SIZE = 44;
+
+ var header = [];
+ push32BE(header, RIFF_MAGIC);
+ push32LE(header, RIFF_SIZE + samples.length * 2);
+ push32BE(header, WAVE_MAGIC);
+ push32BE(header, FRMT_MAGIC);
+ push32LE(header, 16);
+ push16LE(header, 1);
+ push16LE(header, 1);
+ push32LE(header, sample_rate);
+ push32LE(header, sample_rate);
+ push16LE(header, 2);
+ push16LE(header, 16);
+ push32BE(header, DATA_MAGIC);
+ push32LE(header, samples.length * 2);
+ for (var i = 0; i < samples.length; ++i) {
+ push16LE(header, samples[i], 2);
+ }
+ return header;
+}
+
+const Ci = Components.interfaces;
+const CC = Components.Constructor;
+const Timer = CC("@mozilla.org/timer;1", "nsITimer", "initWithCallback");
+const BinaryOutputStream = CC("@mozilla.org/binaryoutputstream;1",
+ "nsIBinaryOutputStream",
+ "setOutputStream");
+
+function poll(f) {
+ if (f()) {
+ return;
+ }
+ new Timer(function() { poll(f); }, 100, Ci.nsITimer.TYPE_ONE_SHOT);
+}
+
+function handleRequest(request, response)
+{
+ var cancel = parseQuery(request, "cancelkey");
+ if (cancel) {
+ setState(cancel[1], "cancelled");
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write("Cancel approved!");
+ return;
+ }
+
+ var samples = [];
+ for (var i = 0; i < 1000000; ++i) {
+ samples.push(0);
+ }
+ var bytes = buildWave(samples, 44100).join("");
+
+ var key = parseQuery(request, "key");
+ response.setHeader("Content-Type", "audio/x-wav");
+ response.setHeader("Content-Length", ""+bytes.length, false);
+
+ var out = new BinaryOutputStream(response.bodyOutputStream);
+
+ var start = 0, end = bytes.length - 1;
+ if (request.hasHeader("Range"))
+ {
+ var rangeMatch = request.getHeader("Range").match(/^bytes=(\d+)?-(\d+)?$/);
+
+ if (rangeMatch[1] !== undefined)
+ start = parseInt(rangeMatch[1], 10);
+
+ if (rangeMatch[2] !== undefined)
+ end = parseInt(rangeMatch[2], 10);
+
+ // No start given, so the end is really the count of bytes from the
+ // end of the file.
+ if (start === undefined)
+ {
+ start = Math.max(0, bytes.length - end);
+ end = bytes.length - 1;
+ }
+
+ // start and end are inclusive
+ if (end === undefined || end >= bytes.length)
+ end = bytes.length - 1;
+
+ if (end < start)
+ {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ start = 0;
+ end = bytes.length - 1;
+ }
+ else
+ {
+ response.setStatusLine(request.httpVersion, 206, "Partial Content");
+ var contentRange = "bytes " + start + "-" + end + "/" + bytes.length;
+ response.setHeader("Content-Range", contentRange);
+ }
+ }
+
+ if (start > 0) {
+ // Send all requested data
+ out.write(bytes.slice(start, end + 1), end + 1 - start);
+ return;
+ }
+
+ // Write the first 1.2M of the Wave file. We know the cache size is set to
+ // 100K so this will fill the cache and and cause a "suspend" event on
+ // the loading element.
+ out.write(bytes, 1200000);
+
+ response.processAsync();
+ // Now wait for the message to cancel this response
+ poll(function() {
+ if (getState(key[1]) != "cancelled") {
+ return false;
+ }
+ response.finish();
+ return true;
+ });
+}
diff --git a/dom/media/test/chain.ogg b/dom/media/test/chain.ogg
new file mode 100644
index 000000000..3535b280f
--- /dev/null
+++ b/dom/media/test/chain.ogg
Binary files differ
diff --git a/dom/media/test/chain.ogg^headers^ b/dom/media/test/chain.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/chain.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/chain.ogv b/dom/media/test/chain.ogv
new file mode 100644
index 000000000..3e684b64a
--- /dev/null
+++ b/dom/media/test/chain.ogv
Binary files differ
diff --git a/dom/media/test/chain.ogv^headers^ b/dom/media/test/chain.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/chain.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/chain.opus b/dom/media/test/chain.opus
new file mode 100644
index 000000000..9fa67f94c
--- /dev/null
+++ b/dom/media/test/chain.opus
Binary files differ
diff --git a/dom/media/test/chain.opus^headers^ b/dom/media/test/chain.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/chain.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/chained-audio-video.ogg b/dom/media/test/chained-audio-video.ogg
new file mode 100644
index 000000000..adda68bb4
--- /dev/null
+++ b/dom/media/test/chained-audio-video.ogg
Binary files differ
diff --git a/dom/media/test/chained-audio-video.ogg^headers^ b/dom/media/test/chained-audio-video.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/chained-audio-video.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/chained-video.ogv b/dom/media/test/chained-video.ogv
new file mode 100644
index 000000000..a6288ef6c
--- /dev/null
+++ b/dom/media/test/chained-video.ogv
Binary files differ
diff --git a/dom/media/test/chained-video.ogv^headers^ b/dom/media/test/chained-video.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/chained-video.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/contentType.sjs b/dom/media/test/contentType.sjs
new file mode 100644
index 000000000..d79cdf034
--- /dev/null
+++ b/dom/media/test/contentType.sjs
@@ -0,0 +1,77 @@
+// Parse the query string, and give us the value for a certain key, or false if
+// it does not exist.
+function parseQuery(request, key) {
+ var params = request.queryString.split('?')[0].split('&');
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") == 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key == "")
+ return p;
+ }
+ return false;
+}
+
+function handleRequest(request, response) {
+ try {
+ // Get the filename to send back.
+ var filename = parseQuery(request, "file");
+
+ const CC = Components.Constructor;
+ const BinaryOutputStream = CC("@mozilla.org/binaryoutputstream;1",
+ "nsIBinaryOutputStream",
+ "setOutputStream");
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/test/" + filename;
+ dump(paths + '\n');
+ var split = paths.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+
+ // handle range requests
+ var partialstart = 0,
+ partialend = file.fileSize - 1;
+ if (request.hasHeader("Range")) {
+ var range = request.getHeader("Range");
+ var parts = range.replace(/bytes=/, "").split("-");
+ var partialstart = parts[0];
+ var partialend = parts[1];
+ if (!partialend.length) {
+ partialend = file.fileSize - 1;
+ }
+ response.setStatusLine(request.httpVersion, 206, "Partial Content");
+ var contentRange = "bytes " + partialstart + "-" + partialend + "/" + file.fileSize;
+ response.setHeader("Content-Range", contentRange);
+ }
+
+ fis.seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, partialstart);
+ bis.setInputStream(fis);
+
+ var sendContentType = parseQuery(request, "nomime");
+ if (sendContentType == false) {
+ var contentType = parseQuery(request, "type");
+ if (contentType == false) {
+ // This should not happen.
+ dump("No type specified without having \'nomime\' in parameters.");
+ return;
+ }
+ response.setHeader("Content-Type", contentType, false);
+ }
+ response.setHeader("Content-Length", ""+bis.available(), false);
+
+ var bytes = bis.readBytes(bis.available());
+ response.write(bytes, bytes.length);
+ } catch (e) {
+ dump ("ERROR : " + e + "\n");
+ }
+}
diff --git a/dom/media/test/crashtests/0-timescale.html b/dom/media/test/crashtests/0-timescale.html
new file mode 100644
index 000000000..db845096d
--- /dev/null
+++ b/dom/media/test/crashtests/0-timescale.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+</head>
+<body>
+<!-- This video file has a timescale of 0 in the mdhd atom -->
+<video src="0-timescale.mp4"
+ autoplay
+ onerror="document.documentElement.className=undefined"
+ onloadedmetadata="this.src=''; document.documentElement.className=undefined">
+<!-- Note we reset 'src' to release decoder resources and cubeb streams to prevent OOM or OpenCubeb() failures. -->
+</video>
+</body>
+</html>
diff --git a/dom/media/test/crashtests/0-timescale.mp4 b/dom/media/test/crashtests/0-timescale.mp4
new file mode 100644
index 000000000..32df5dc5a
--- /dev/null
+++ b/dom/media/test/crashtests/0-timescale.mp4
Binary files differ
diff --git a/dom/media/test/crashtests/1012609.html b/dom/media/test/crashtests/1012609.html
new file mode 100644
index 000000000..1dad783a0
--- /dev/null
+++ b/dom/media/test/crashtests/1012609.html
@@ -0,0 +1,9 @@
+<script>
+try{var r0=new AudioContext();}catch(e){}
+try{var r32=r0.createOscillator();}catch(e){}
+try{var r58=r0.createPeriodicWave(new Float32Array(1997),new Float32Array(1997));}catch(e){}
+try{r32.start(0);}catch(e){}
+try{r32.setPeriodicWave(r58);}catch(e){}
+try{r32.frequency.value=-1;}catch(e){}
+</script>
+
diff --git a/dom/media/test/crashtests/1015662.html b/dom/media/test/crashtests/1015662.html
new file mode 100644
index 000000000..20407c807
--- /dev/null
+++ b/dom/media/test/crashtests/1015662.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<body>
+<video><track src="javascript:5"></track></video>
+</body>
diff --git a/dom/media/test/crashtests/1020205.html b/dom/media/test/crashtests/1020205.html
new file mode 100644
index 000000000..e9efc4096
--- /dev/null
+++ b/dom/media/test/crashtests/1020205.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.AudioContext();
+var source = context.createBufferSource();
+source.connect(context.destination);
+source.playbackRate.value = 0.01;
+source.buffer = context.createBuffer(2, 32, context.sampleRate);
+source.start(0);
+
+setTimeout(
+ function() {
+ source.buffer = context.createBuffer(1, 10, context.sampleRate);
+ source.playbackRate.value = 1;
+ source.onended =
+ function() {
+ document.documentElement.removeAttribute("class");
+ };
+ }, 0);
+
+</script>
+</html>
diff --git a/dom/media/test/crashtests/1028458.html b/dom/media/test/crashtests/1028458.html
new file mode 100644
index 000000000..c78ac046b
--- /dev/null
+++ b/dom/media/test/crashtests/1028458.html
@@ -0,0 +1,23 @@
+<html class="reftest-wait">
+<audio id="testAudio" controls></audio>
+<script type="text/javascript">
+navigator.mozGetUserMedia({audio: true, fake: true}, function(stream) {
+ stream.getAudioTracks()[0].enabled = false;
+ var testAudio = document.getElementById('testAudio');
+ // Wait some time for good measure
+ var eventReceived = 0;
+ testAudio.addEventListener("timeupdate", function() {
+ if (++eventReceived == 3) {
+ document.querySelector("html").className = "";
+ }
+ })
+ testAudio.mozSrcObject = stream;
+ testAudio.play();
+ }, function(err) {
+ // Don't go orange if we can't get an audio input stream,
+ // as this is not what we are trying to test and can happen on Windows.
+ document.querySelector("html").className = "";
+ });
+</script>
+
+</html>
diff --git a/dom/media/test/crashtests/1041466.html b/dom/media/test/crashtests/1041466.html
new file mode 100644
index 000000000..0f064d186
--- /dev/null
+++ b/dom/media/test/crashtests/1041466.html
@@ -0,0 +1,21 @@
+<html>
+<script>
+try{var Context1= new (window.webkitAudioContext || window.AudioContext)()}catch(e){}
+try{var Delay0=Context1.createDelay();}catch(e){}
+try{var ScriptProcessor0=Context1.createScriptProcessor(512,26,7);}catch(e){}
+try{var ChannelSplitter0=Context1.createChannelSplitter(91);}catch(e){}
+try{var Gain1=Context1.createGain();}catch(e){}
+try{var WaveShaper0=Context1.createWaveShaper();}catch(e){}
+try{var Analyser1=Context1.createAnalyser();}catch(e){}
+try{Gain1.connect(Delay0);}catch(e){}
+try{Analyser1.connect(BiquadFilter0);}catch(e){}
+try{Gain1.connect(Context1.destination);}catch(e){}
+try{WaveShaper0.connect(ScriptProcessor0);}catch(e){}
+try{ChannelSplitter0.connect(BiquadFilter1);}catch(e){}
+try{Delay0.connect(Gain1);}catch(e){}
+try{ScriptProcessor0.connect(Context1.destination);}catch(e){}
+try{WaveShaper0.connect(Gain1);}catch(e){}
+try{WaveShaper0.connect(ChannelSplitter0);}catch(e){}
+try{ScriptProcessor0.connect(WaveShaper0);}catch(e){}
+</script>
+</html>
diff --git a/dom/media/test/crashtests/1045650.html b/dom/media/test/crashtests/1045650.html
new file mode 100644
index 000000000..32acd2ce7
--- /dev/null
+++ b/dom/media/test/crashtests/1045650.html
@@ -0,0 +1,18 @@
+<html><body><script>
+
+var r0=new AudioContext();
+
+var splitter=r0.createChannelSplitter();
+var delay=r0.createDelay();
+var scriptp=r0.createScriptProcessor();
+var cmerger=r0.createChannelMerger();
+var gain=r0.createGain();
+
+splitter.connect(delay,2);
+delay.connect(scriptp);
+scriptp.connect(cmerger);
+cmerger.connect(splitter);
+gain.connect(gain);
+gain.connect(cmerger);
+
+</script></body></html>
diff --git a/dom/media/test/crashtests/1080986.html b/dom/media/test/crashtests/1080986.html
new file mode 100644
index 000000000..1de307516
--- /dev/null
+++ b/dom/media/test/crashtests/1080986.html
@@ -0,0 +1,3 @@
+<html>
+<audio autoplay src="1080986.wav"></audio>
+</html>
diff --git a/dom/media/test/crashtests/1080986.wav b/dom/media/test/crashtests/1080986.wav
new file mode 100644
index 000000000..b96c59b7e
--- /dev/null
+++ b/dom/media/test/crashtests/1080986.wav
Binary files differ
diff --git a/dom/media/test/crashtests/1122218.html b/dom/media/test/crashtests/1122218.html
new file mode 100644
index 000000000..984487dd2
--- /dev/null
+++ b/dom/media/test/crashtests/1122218.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<script>
+function boom() {
+ var r0=new AudioContext();
+
+ var cm=r0.createChannelMerger(20);
+
+ var o1=r0.createOscillator();
+ var o2=r0.createOscillator();
+
+ var pw=r0.createPeriodicWave(new Float32Array(4),new Float32Array(4));
+ o2.setPeriodicWave(pw);
+
+ o1.connect(cm);
+ cm.connect(o2.frequency);
+
+ o1.start();
+ o2.start(0.476);
+}
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/1127188.html b/dom/media/test/crashtests/1127188.html
new file mode 100644
index 000000000..650f07dd4
--- /dev/null
+++ b/dom/media/test/crashtests/1127188.html
@@ -0,0 +1,3 @@
+<script>
+ (new AudioContext).close();
+</script>
diff --git a/dom/media/test/crashtests/1157994.html b/dom/media/test/crashtests/1157994.html
new file mode 100644
index 000000000..2e3001302
--- /dev/null
+++ b/dom/media/test/crashtests/1157994.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+function boom()
+{
+ var ac = new AudioContext();
+ // first "suspended" -> "running" transition
+ ac.onstatechange = function() {
+ ac.onstatechange = null;
+ ac.suspend();
+ ac.close();
+ }
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
+
diff --git a/dom/media/test/crashtests/1158427.html b/dom/media/test/crashtests/1158427.html
new file mode 100644
index 000000000..b544a942a
--- /dev/null
+++ b/dom/media/test/crashtests/1158427.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+function boom()
+{
+ dump("before capture\n");
+ document.createElement("audio").mozCaptureStreamUntilEnded();
+ dump("before context\n");
+ new window.AudioContext();
+ dump("before gc\n");
+ SpecialPowers.forceCC();
+ dump("after gc\n");
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
+
diff --git a/dom/media/test/crashtests/1185176.html b/dom/media/test/crashtests/1185176.html
new file mode 100644
index 000000000..d5e9b68a2
--- /dev/null
+++ b/dom/media/test/crashtests/1185176.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<script>
+
+function boom()
+{
+ var ac = new window.AudioContext();
+ var oscillator = ac.createOscillator();
+ oscillator.start(0);
+ oscillator.stop(0.1);
+ setTimeout(function() {
+ oscillator.channelCount = 1;
+ oscillator.channelCountMode = "explicit";
+ oscillator.channelInterpretation = "speakers";
+ document.documentElement.removeAttribute("class");
+ }, 1000);
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
+
diff --git a/dom/media/test/crashtests/1185192.html b/dom/media/test/crashtests/1185192.html
new file mode 100644
index 000000000..46fa311aa
--- /dev/null
+++ b/dom/media/test/crashtests/1185192.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+function boom()
+{
+ new Audio().mozCaptureStreamUntilEnded();
+ var ac = new window.AudioContext();
+ ac.resume();
+ ac.close();
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
+
diff --git a/dom/media/test/crashtests/1223670.html b/dom/media/test/crashtests/1223670.html
new file mode 100644
index 000000000..94cad43e2
--- /dev/null
+++ b/dom/media/test/crashtests/1223670.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<script>
+
+function boom()
+{
+
+ var ac = new window.AudioContext("publicnotification");
+
+ setTimeout(function() {
+ document.documentElement.removeAttribute("class");
+ var htmlAudio = new Audio();
+ var stream = htmlAudio.mozCaptureStreamUntilEnded();
+ ac.createMediaStreamSource(stream);
+ }, 0);
+}
+
+</script>
+</head>
+<body onload="boom();">
+</body>
+</html>
diff --git a/dom/media/test/crashtests/1228484.html b/dom/media/test/crashtests/1228484.html
new file mode 100644
index 000000000..2b2e9b0f9
--- /dev/null
+++ b/dom/media/test/crashtests/1228484.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+var htmlAudio = new Audio(URL.createObjectURL(new window.MediaSource()));
+
+(new window.AudioContext("ringer")).createMediaElementSource(htmlAudio);
+(new window.AudioContext("alarm")).createMediaElementSource(htmlAudio);
+
+</script>
+</head>
+</html>
diff --git a/dom/media/test/crashtests/1236639.html b/dom/media/test/crashtests/1236639.html
new file mode 100644
index 000000000..5c4634a4d
--- /dev/null
+++ b/dom/media/test/crashtests/1236639.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Bug 1236639: Crash on audio playback due to invalid XING headers</title>
+</head>
+<body>
+<audio autoplay src="1236639.mp3"></audio>
+</body>
+</html>
diff --git a/dom/media/test/crashtests/1236639.mp3 b/dom/media/test/crashtests/1236639.mp3
new file mode 100644
index 000000000..8ef96e8cc
--- /dev/null
+++ b/dom/media/test/crashtests/1236639.mp3
Binary files differ
diff --git a/dom/media/test/crashtests/1291702.html b/dom/media/test/crashtests/1291702.html
new file mode 100644
index 000000000..facc52af7
--- /dev/null
+++ b/dom/media/test/crashtests/1291702.html
@@ -0,0 +1,72 @@
+<script>
+Logger={}; Logger.JSError=function(e){};
+try { o0 = new Audio("media/audio/mono-uncompressed-8bit-44100hz.wav") } catch(e) { Logger.JSError(e); }
+try { o1 = o0.mozCaptureStreamUntilEnded() } catch(e) { Logger.JSError(e); }
+try { o2 = new window.AudioContext(); } catch(e) { Logger.JSError(e); }
+try { o3 = o2.createBufferSource(); } catch(e) { Logger.JSError(e); }
+try { o5 = o2.createChannelMerger(3); } catch(e) { Logger.JSError(e); }
+try { o3.start(0) } catch(e) { Logger.JSError(e); }
+try { o2.listener.setPosition(0.0417049336344248, 0.9932504594310304, 32) } catch(e) { Logger.JSError(e); }
+try { o5.disconnect(0) } catch(e) { Logger.JSError(e); }
+try { o0.mozGetMetadata() } catch(e) { Logger.JSError(e); }
+try { o3.channelCount = 1; } catch(e) { Logger.JSError(e); }
+try { o3.buffer = function anonymous() {
+var buffer = o2.createBuffer(1, 512, o2.sampleRate);for(var c=0;c<1;c++) {var data = buffer.getChannelData(c);for(var i=0;i<512;i++) {data[i] = i % 512}}return buffer;
+}(); } catch(e) { Logger.JSError(e); }
+try { o3.loop = false; } catch(e) { Logger.JSError(e); }
+try { o0.mozPreservesPitch = false; } catch(e) { Logger.JSError(e); }
+try { o2.destination.channelCount = 1; } catch(e) { Logger.JSError(e); }
+try { o3.loopStart = 8; } catch(e) { Logger.JSError(e); }
+try { o3.playbackRate.value = 0.46271130895770884; } catch(e) { Logger.JSError(e); }
+try { o2.listener.setVelocity(0.34781960219792546, 4, 2048) } catch(e) { Logger.JSError(e); }
+try { o5.connect(o5, 0, 0) } catch(e) { Logger.JSError(e); }
+try { o3.loopStart = -0.24696638021780326; } catch(e) { Logger.JSError(e); }
+try { o0.mozSetup(1, 44100) } catch(e) { Logger.JSError(e); }
+try { o3.buffer.copyToChannel(function anonymous() {
+var buffer=new Float32Array(256);for(var i=0;i<256;i++){buffer[i]=i / 256}return buffer;
+}(), 1, 2048, 64) } catch(e) { Logger.JSError(e); }
+try { o3.loop = false; } catch(e) { Logger.JSError(e); }
+try { setInterval(function anonymous() {
+try { o0.pause() } catch(e) { Logger.JSError(e); }
+}, 12.902067779658143) } catch(e) { Logger.JSError(e); }
+try { o2.listener.setPosition(256, 256, 16) } catch(e) { Logger.JSError(e); }
+try { o3.playbackRate.setValueCurveAtTime(function anonymous() {
+var buffer=new Float32Array(4);for(var i=0;i<4;i++){buffer[i]=i / 4}return buffer;
+}(), 2, 0.40792575814014437) } catch(e) { Logger.JSError(e); }
+try { o3.playbackRate.value = 0.4997270553139334; } catch(e) { Logger.JSError(e); }
+try { o0.loop = true; } catch(e) { Logger.JSError(e); }
+try { o3.loopStart = 4; } catch(e) { Logger.JSError(e); }
+try { setInterval(function anonymous() {
+try { o3.buffer = function anonymous() {
+var buffer = o2.createBuffer(1, 1, o2.sampleRate);for(var c=0;c<1;c++) {var data = buffer.getChannelData(c);for(var i=0;i<1;i++) {data[i] = Math.sin(Math.sin(i))}}return buffer;
+}() } catch(e) { Logger.JSError(e); }
+}, 54.32078602859342) } catch(e) { Logger.JSError(e); }
+try { o3.connect(o2.destination); } catch(e) { Logger.JSError(e); }
+try { o3.channelCountMode = 'max'; } catch(e) { Logger.JSError(e); }
+try { setInterval(function anonymous() {
+try { o3.channelCount = 1; } catch(e) { Logger.JSError(e); }
+}, 55.448587039802966) } catch(e) { Logger.JSError(e); }
+try { o3.playbackRate.cancelScheduledValues(0.7190983131805198) } catch(e) { Logger.JSError(e); }
+try { o3.playbackRate.cancelScheduledValues(16) } catch(e) { Logger.JSError(e); }
+try { o3.connect(o5, 0, 2) } catch(e) { Logger.JSError(e); }
+try { o3.loopEnd = 0.5864771678080962; } catch(e) { Logger.JSError(e); }
+try { o0.playbackRate = 0.2781783298771312; } catch(e) { Logger.JSError(e); }
+try { o0.loop = false; } catch(e) { Logger.JSError(e); }
+try { setInterval(function anonymous() {
+try { o5.disconnect(0) } catch(e) { Logger.JSError(e); }
+}, 29.75776777646425) } catch(e) { Logger.JSError(e); }
+try { o3.playbackRate.setValueCurveAtTime(function anonymous() {
+var buffer=new Float32Array(8);for(var i=0;i<8;i++){buffer[i]=8 % 8}return buffer;
+}(), 0.4972710112336257, 64) } catch(e) { Logger.JSError(e); }
+try { setInterval(function anonymous() {
+try { o0.controls = false; } catch(e) { Logger.JSError(e); }
+}, 22.550249570567694) } catch(e) { Logger.JSError(e); }
+try { o2.listener.setOrientation(0.6531494410366634, 64, 0.5120918081402992, -64, 0.32912433155093446, 256) } catch(e) { Logger.JSError(e); }
+try { o3.loop = true; } catch(e) { Logger.JSError(e); }
+try { o3.connect(o5, 0, 0) } catch(e) { Logger.JSError(e); }
+try { o3.buffer = function anonymous() {
+var buffer = o2.createBuffer(1, 2048, 48000);for(var c=0;c<1;c++) {var data = buffer.getChannelData(c);for(var i=0;i<2048;i++) {data[i] = Math.sin(Math.sin(2048 * 0.2519529190035427))}}return buffer;
+}(); } catch(e) { Logger.JSError(e); }
+try { o3.disconnect(0) } catch(e) { Logger.JSError(e); }
+</script>
+
diff --git a/dom/media/test/crashtests/1304948.html b/dom/media/test/crashtests/1304948.html
new file mode 100644
index 000000000..667a13d06
--- /dev/null
+++ b/dom/media/test/crashtests/1304948.html
@@ -0,0 +1,33 @@
+<html class="reftest-wait">
+<head>
+ <title> Bug 1304948 : Crash if a texttrack remove a cue not belongs to it. </title>
+</head>
+<meta charset="utf-8">
+<script type="text/javascript">
+
+window.onload = function() {
+ var a = document.createElementNS('http://www.w3.org/1999/xhtml', 'video');
+ a.src = "";
+ document.body.appendChild(a);
+ var b = a.addTextTrack('chapters', "AAAAAAAAAAAAAAAA", "de");
+ var c = new VTTCue(0.6, 0.3, "AA");
+ b.addCue(c);
+ var d = document.createElementNS('http://www.w3.org/1999/xhtml', 'video');
+ var e = d.addTextTrack('chapters', "AAAA", "en-US");
+ a.currentTime = 2;
+ a.play();
+ try {
+ // This will queue a TimeMarchesOn task on mainthread, so use
+ // timer to wait the TimeMarchesOn crash.
+ e.removeCue(c);
+ } catch (e) {
+ if (e.name == "NotFoundError") {
+ setTimeout(function() {
+ document.documentElement.removeAttribute("class");}, 0);
+ }
+ }
+};
+
+</script>
+</body>
+</html>
diff --git a/dom/media/test/crashtests/1319486.html b/dom/media/test/crashtests/1319486.html
new file mode 100644
index 000000000..74bdb2147
--- /dev/null
+++ b/dom/media/test/crashtests/1319486.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title> Bug 1319486 : Crash if a texttrackcue added to different texttracks. </title>
+</head>
+<body>
+<video id=v1></video>
+<video id=v2></video>
+</body>
+<meta charset="utf-8">
+<script type="text/javascript">
+
+addEventListener('DOMContentLoaded', function(){
+ let cue,tt1,tt2;
+ v1.play();
+ tt1 = v1.addTextTrack('metadata', "", "");
+ v1.play();
+ v1.currentTime = 8;
+ cue = new VTTCue(0, 0.5, "");
+ tt1.addCue(cue);
+ tt2 = v2.addTextTrack('captions', "", "");
+ tt2.addCue(cue);
+ tt2.removeCue(cue);
+ tt1.addCue(new VTTCue(0.7, 2, ""));
+});
+</script>
+</html>
diff --git a/dom/media/test/crashtests/459439-1.html b/dom/media/test/crashtests/459439-1.html
new file mode 100644
index 000000000..7bb0131d5
--- /dev/null
+++ b/dom/media/test/crashtests/459439-1.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<script type="text/javascript">
+var i = 0;
+function boom()
+{
+ var div = document.getElementById("div");
+ var audio = document.getElementById("audio");
+
+ audio.onload = null;
+
+ div.textContent = "FAIL";
+ audio.src += "";
+ div.textContent = "PASS?";
+
+ ++i;
+
+ setTimeout(done, 1);
+}
+
+function done()
+{
+ // Note we reset 'src' to release decoder resources and cubeb streams to
+ // prevent OOM or OpenCubeb() failures.
+ var audio = document.getElementById("audio");
+ audio.src = "";
+ document.documentElement.removeAttribute("class");
+}
+</script>
+</head>
+<body>
+<audio id="audio" autoplay src="sound.ogg" oncanplaythrough="setTimeout(boom, 1);"></audio>
+<div id="div"></div>
+</body>
+</html>
diff --git a/dom/media/test/crashtests/466607-1.html b/dom/media/test/crashtests/466607-1.html
new file mode 100644
index 000000000..e154223ef
--- /dev/null
+++ b/dom/media/test/crashtests/466607-1.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+<script type="text/javascript">
+
+function boom()
+{
+ document.body.appendChild(document.createElementNS("bar", "audio"));
+ document.body.appendChild(document.createElementNS("bar", "video"));
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/466945-1.html b/dom/media/test/crashtests/466945-1.html
new file mode 100644
index 000000000..ac1ba29e3
--- /dev/null
+++ b/dom/media/test/crashtests/466945-1.html
@@ -0,0 +1,25 @@
+<html class="reftest-wait">
+<head>
+<script type="text/javascript">
+
+var s;
+
+function boom()
+{
+ s = document.createElement("span");
+ s.innerHTML = "<video src='data:text/html,' autoplay='autoplay'><\/video>";
+ document.body.appendChild(document.createElement("iframe"));
+ setTimeout(boom2, 0);
+}
+
+function boom2()
+{
+ s.innerHTML = "";
+ document.documentElement.removeAttribute("class");
+}
+
+</script>
+</head>
+
+<body onload="setTimeout(boom, 0);"></body>
+</html>
diff --git a/dom/media/test/crashtests/468763-1.html b/dom/media/test/crashtests/468763-1.html
new file mode 100644
index 000000000..d21e5bc38
--- /dev/null
+++ b/dom/media/test/crashtests/468763-1.html
@@ -0,0 +1 @@
+<html><head></head><body><video src="nosuchprotocol:"></video></body></html> \ No newline at end of file
diff --git a/dom/media/test/crashtests/474744-1.html b/dom/media/test/crashtests/474744-1.html
new file mode 100644
index 000000000..8a7c70cf0
--- /dev/null
+++ b/dom/media/test/crashtests/474744-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script type="text/javascript">
+
+function boom()
+{
+ document.body.innerHTML += "<video src='aim:yaz'><\/video>";
+}
+
+</script>
+</head>
+<body onload="boom();">
+</body>
+</html>
diff --git a/dom/media/test/crashtests/481136-1.html b/dom/media/test/crashtests/481136-1.html
new file mode 100644
index 000000000..bd264058d
--- /dev/null
+++ b/dom/media/test/crashtests/481136-1.html
@@ -0,0 +1,3 @@
+<html>
+<div><object data='sound.ogg'></div>
+</html>
diff --git a/dom/media/test/crashtests/492286-1.xhtml b/dom/media/test/crashtests/492286-1.xhtml
new file mode 100644
index 000000000..627ac3872
--- /dev/null
+++ b/dom/media/test/crashtests/492286-1.xhtml
@@ -0,0 +1 @@
+<source xmlns="http://www.w3.org/1999/xhtml"/> \ No newline at end of file
diff --git a/dom/media/test/crashtests/493915-1.html b/dom/media/test/crashtests/493915-1.html
new file mode 100644
index 000000000..2a6ae9bd6
--- /dev/null
+++ b/dom/media/test/crashtests/493915-1.html
@@ -0,0 +1,18 @@
+<html>
+<head>
+<script type="text/javascript">
+
+function boom()
+{
+ s = document.createElement("span");
+ a = document.createElement("audio");
+ a['src'] = "javascript:4";
+ a['loopend'] = 3;
+ s.appendChild(a);
+}
+
+</script>
+</head>
+
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/495794-1.html b/dom/media/test/crashtests/495794-1.html
new file mode 100644
index 000000000..2db69206a
--- /dev/null
+++ b/dom/media/test/crashtests/495794-1.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+ <body>
+ <audio src="495794-1.ogg" autoplay onended="this.src=''; document.documentElement.className=undefined"></audio>
+ <!-- Note we reset 'src' to release decoder resources and cubeb streams to prevent OOM or OpenCubeb() failures. -->
+ </body>
+</html>
+
diff --git a/dom/media/test/crashtests/495794-1.ogg b/dom/media/test/crashtests/495794-1.ogg
new file mode 100644
index 000000000..1c19a6406
--- /dev/null
+++ b/dom/media/test/crashtests/495794-1.ogg
Binary files differ
diff --git a/dom/media/test/crashtests/576612-1.html b/dom/media/test/crashtests/576612-1.html
new file mode 100644
index 000000000..04f993e78
--- /dev/null
+++ b/dom/media/test/crashtests/576612-1.html
@@ -0,0 +1,15 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script>
+function boom()
+{
+
+ var v = document.getElementById("v");
+ v.src = "data:text/plain,_";
+ document.documentElement.appendChild(v);
+
+}
+</script>
+</head>
+<body onload="boom();"><video id="v" src="data:video/ogg;codecs=&quot;theora,vorbis&quot;,1"></video></body>
+</html>
diff --git a/dom/media/test/crashtests/691096-1.html b/dom/media/test/crashtests/691096-1.html
new file mode 100644
index 000000000..3c3ebfc12
--- /dev/null
+++ b/dom/media/test/crashtests/691096-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<script>
+var ITERATIONS = 200;
+
+function stoptest (evt)
+{
+ if (evt) {
+ // Note we reset 'src' to release decoder resources and cubeb streams to
+ // prevent OOM or OpenCubeb() failures.
+ evt.target.src = "";
+ }
+ document.documentElement.removeAttribute("class");
+}
+
+function boom()
+{
+ for (var i = 0; i < ITERATIONS; ++i) {
+ a = document.createElementNS("http://www.w3.org/1999/xhtml", "audio");
+ a.addEventListener("loadedmetadata", stoptest);
+ a.setAttributeNS(null, "autoplay", "");
+ a.setAttributeNS(null, "src", "sound.ogg");
+ }
+ setTimeout(stoptest, 250);
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/752784-1.html b/dom/media/test/crashtests/752784-1.html
new file mode 100644
index 000000000..4644eeb89
--- /dev/null
+++ b/dom/media/test/crashtests/752784-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function boom()
+{
+ document.getElementById("a").mozCaptureStream();
+}
+</script>
+</head>
+
+<body onload="boom();">
+<audio id="a" src="sound.ogg">
+</body>
+</html>
diff --git a/dom/media/test/crashtests/789075-1.html b/dom/media/test/crashtests/789075-1.html
new file mode 100644
index 000000000..6f857573a
--- /dev/null
+++ b/dom/media/test/crashtests/789075-1.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+</head>
+<body>
+<video src="789075.webm" preload="metadata" onloadedmetadata="this.src=''; document.documentElement.className=undefined"></video>
+<!-- Note we reset 'src' to release decoder resources and cubeb streams to prevent OOM or OpenCubeb() failures. -->
+</body>
+</html>
diff --git a/dom/media/test/crashtests/789075.webm b/dom/media/test/crashtests/789075.webm
new file mode 100644
index 000000000..602e53fca
--- /dev/null
+++ b/dom/media/test/crashtests/789075.webm
Binary files differ
diff --git a/dom/media/test/crashtests/795892-1.html b/dom/media/test/crashtests/795892-1.html
new file mode 100644
index 000000000..d73cea7f2
--- /dev/null
+++ b/dom/media/test/crashtests/795892-1.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<script>
+function boom()
+{
+ var a = document.getElementById("a");
+ a.play();
+ a.onplaying = function () {
+ a.onplaying = null;
+ // Note we reset 'src' to release decoder resources and cubeb streams to
+ // prevent OOM or OpenCubeb() failures.
+ a.src = "";
+ document.documentElement.className = "";
+ }
+}
+</script>
+</head>
+
+<body>
+<video id="a" src="cors.webm" crossorigin preload="metadata" onloadedmetadata="boom();">
+</body>
+</html>
diff --git a/dom/media/test/crashtests/844563.html b/dom/media/test/crashtests/844563.html
new file mode 100644
index 000000000..7f9365511
--- /dev/null
+++ b/dom/media/test/crashtests/844563.html
@@ -0,0 +1,5 @@
+<script>
+var a = document.createElementNS("http://www.w3.org/1999/xhtml", "audio");
+a.mozPreservesPitch = a;
+</script>
+
diff --git a/dom/media/test/crashtests/846612.html b/dom/media/test/crashtests/846612.html
new file mode 100644
index 000000000..070c37538
--- /dev/null
+++ b/dom/media/test/crashtests/846612.html
@@ -0,0 +1,8 @@
+<script>
+document.addEventListener("DOMContentLoaded", function() {
+ var a = document.querySelector("audio");
+ a.playbackRate = 2;
+ a.play();
+});
+</script>
+<audio src="495794-1.ogg"></audio>
diff --git a/dom/media/test/crashtests/852838.html b/dom/media/test/crashtests/852838.html
new file mode 100644
index 000000000..0bea29351
--- /dev/null
+++ b/dom/media/test/crashtests/852838.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script>
+ var o0 = new window.AudioContext();
+ var o1 = o0.createBuffer(536870912, 1, 8192);
+ </script>
+ </head>
+ <body>
+ </body>
+</html>
diff --git a/dom/media/test/crashtests/865537-1.html b/dom/media/test/crashtests/865537-1.html
new file mode 100644
index 000000000..4065eb360
--- /dev/null
+++ b/dom/media/test/crashtests/865537-1.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<body onload="doTest()">
+<base href="../unknown">
+<div id="test3"></div>
+<video id="test4"><source src="white.webm"></video>
+<script>
+function doTest() {
+ test3.appendChild(test4);
+}
+</script>
+</body>
+</html>
diff --git a/dom/media/test/crashtests/868504.html b/dom/media/test/crashtests/868504.html
new file mode 100644
index 000000000..94090c1c0
--- /dev/null
+++ b/dom/media/test/crashtests/868504.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+function boom()
+{
+ new AudioContext().createBufferSource().playbackRate.linearRampToValueAtTime(0, -1);
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/874869.html b/dom/media/test/crashtests/874869.html
new file mode 100644
index 000000000..1fe3dbd2f
--- /dev/null
+++ b/dom/media/test/crashtests/874869.html
@@ -0,0 +1,15 @@
+<script>
+var Context0= new AudioContext()
+var Panner0=Context0.createPanner();
+var BufferSource3=Context0.createBufferSource();
+Panner0.channelCount=0;
+BufferSource3.connect(Panner0);
+BufferSource3.buffer=function(){
+ var length=1;
+ var Buffer=Context0.createBuffer(1,length,'44200');
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = 255;};
+ return Buffer;
+}();
+
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/874915.html b/dom/media/test/crashtests/874915.html
new file mode 100644
index 000000000..59218b3da
--- /dev/null
+++ b/dom/media/test/crashtests/874915.html
@@ -0,0 +1,24 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource6=Context0.createBufferSource();
+
+setInterval(function(){
+BufferSource6.buffer=function(){
+ var length=11283;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(624))};
+ return Buffer;
+}();
+},0)
+
+BufferSource6.start(0.15831333969254047,0.23571860056836158,0.529235512483865);
+
+BufferSource6.buffer=function(){
+ var length=48517;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(365))};
+ return Buffer;
+}();
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/874934.html b/dom/media/test/crashtests/874934.html
new file mode 100644
index 000000000..350ce2810
--- /dev/null
+++ b/dom/media/test/crashtests/874934.html
@@ -0,0 +1,23 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource0=Context0.createBufferSource();
+BufferSource0.start(0.01932738965842873,0.33345631847623736,0.3893404237460345);
+BufferSource0.buffer=function(){
+ var length=35887;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(0.39765272522345185))};
+ return Buffer;
+}();
+
+BufferSource0.buffer=function(){
+ var length=15952;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(85))};
+ return Buffer;
+}();
+
+BufferSource0.playbackRate.value=20.401213286832185;
+
+</script>
diff --git a/dom/media/test/crashtests/874952.html b/dom/media/test/crashtests/874952.html
new file mode 100644
index 000000000..a9a398fdb
--- /dev/null
+++ b/dom/media/test/crashtests/874952.html
@@ -0,0 +1,11 @@
+<script>
+var Context0= new AudioContext()
+var ChannelSplitter0=Context0.createChannelSplitter();
+var BiquadFilter0=Context0.createBiquadFilter();
+var WaveShaper0=Context0.createWaveShaper();
+
+ChannelSplitter0.connect(BiquadFilter0,3,0);
+ChannelSplitter0.connect(WaveShaper0);
+BiquadFilter0.disconnect();
+WaveShaper0.connect(ChannelSplitter0);
+</script>
diff --git a/dom/media/test/crashtests/875144.html b/dom/media/test/crashtests/875144.html
new file mode 100644
index 000000000..bf5d0d086
--- /dev/null
+++ b/dom/media/test/crashtests/875144.html
@@ -0,0 +1,81 @@
+<script>
+Logger = {}
+Logger.error = function(e) {}
+Logger.comment = function(e) {}
+
+try { o0 = document.createElement('audio'); } catch(e) { Logger.error(Logger.comment(e)); }
+try { (document.body || document.documentElement).appendChild(o0); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o1 = new AudioContext(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o2 = o1.createGain(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3 = o1.createBufferSource(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o4 = o1.createBuffer(1, 3, 52970);
+o5 = o4.getChannelData(0);
+for(var i=0; i<3; ++i) {
+o5[i] = Math.sin(i * 63);
+}
+return o4;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o6 = o1.createBuffer(1, 15, 41218);
+o7 = o6.getChannelData(0);
+for(var i=0; i<15; ++i) {
+o7[i] = Math.sin(i * 0);
+}
+return o6;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o8 = o1.createBuffer(1, 0, 49074);
+o9 = o8.getChannelData(0);
+for(var i=0; i<0; ++i) {
+o9[i] = Math.sin(i * 0);
+}
+return o8;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o10 = o1.createBuffer(1, 31, 86527);
+o11 = o10.getChannelData(0);
+for(var i=0; i<31; ++i) {
+o11[i] = Math.sin(i * 127);
+}
+return o10;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.stop(-1) } catch(e) { Logger.error(Logger.comment(e)); }
+/* [Exception... "An attempt was made to use an object that is not, or is no longer, usable" code: "11" nsresult: "0x8053000b (InvalidStateError)" location: "file:///Users/cdiehl/dev/projects/peach/Peach/Utilities/JS/undefined.js Line: 602"] */
+try { o3.channelCountMode = 'explicit'; } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12 = o1.createBiquadFilter(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o13 = o1.createBuffer(1, 63, 28347);
+o14 = o13.getChannelData(0);
+for(var i=0; i<63; ++i) {
+o14[i] = Math.sin(i * 15);
+}
+return o13;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12.channelCount = 1; } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12.connect(GainNode, 65536, 0) } catch(e) { Logger.error(Logger.comment(e)); }
+/* TypeError: Value does not implement interface AudioNode. */
+try { o3.buffer = function() { o15 = o1.createBuffer(1, 1, 72540);
+o16 = o15.getChannelData(0);
+for(var i=0; i<1; ++i) {
+o16[i] = Math.sin(i * 7);
+}
+return o15;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12.getFrequencyResponse(new Float32Array(7), new Float32Array(127), new Float32Array(7)) } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12.getFrequencyResponse(new Float32Array(15), new Float32Array(127), new Float32Array(7)) } catch(e) { Logger.error(Logger.comment(e)); }
+try { o17 = document.createElement('audio'); } catch(e) { Logger.error(Logger.comment(e)); }
+try { (document.body || document.documentElement).appendChild(o0); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o18 = o1.createBuffer(1, 7, 91261);
+o19 = o18.getChannelData(0);
+for(var i=0; i<7; ++i) {
+o19[i] = Math.sin(i * 7);
+}
+return o18;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12.getFrequencyResponse(new Float32Array(31), new Float32Array(31), new Float32Array(127)) } catch(e) { Logger.error(Logger.comment(e)); }
+try { o20 = o1.createChannelSplitter(1, 2, 4, 16, 32); } catch(e) { Logger.error(Logger.comment(e)); }
+try { o12.channelCountMode = 'explicit'; } catch(e) { Logger.error(Logger.comment(e)); }
+try { o3.buffer = function() { o21 = o1.createBuffer(1, 0, 14451);
+o22 = o21.getChannelData(0);
+for(var i=0; i<0; ++i) {
+o22[i] = Math.sin(i * 63);
+}
+return o21;
+}(); } catch(e) { Logger.error(Logger.comment(e)); }
+</script>
diff --git a/dom/media/test/crashtests/875596.html b/dom/media/test/crashtests/875596.html
new file mode 100644
index 000000000..7bac09dab
--- /dev/null
+++ b/dom/media/test/crashtests/875596.html
@@ -0,0 +1,12 @@
+<script>
+try { o1 = new AudioContext(); } catch(e) { }
+try { o6 = o1.createGain(); } catch(e) { }
+try { o8 = o1.createBufferSource(); } catch(e) { }
+try { o6.gain.setValueCurveAtTime(new Float32Array(7), 0, 0) } catch(e) { }
+try { o8.connect(o6, 0, 0) } catch(e) { }
+try { o8.buffer = function() {
+ o19 = o1.createBuffer(1, 1, 76309);
+ for(var i=0; i<1; ++i) { }
+ return o19;
+}(); } catch(e) { }
+</script>
diff --git a/dom/media/test/crashtests/875911.html b/dom/media/test/crashtests/875911.html
new file mode 100644
index 000000000..fbc52642b
--- /dev/null
+++ b/dom/media/test/crashtests/875911.html
@@ -0,0 +1,3 @@
+<script>
+ new OfflineAudioContext(1, 10, 48000);
+</script>
diff --git a/dom/media/test/crashtests/876024-1.html b/dom/media/test/crashtests/876024-1.html
new file mode 100644
index 000000000..5502d8e42
--- /dev/null
+++ b/dom/media/test/crashtests/876024-1.html
@@ -0,0 +1,5 @@
+<script>
+o1 = new window.AudioContext(2, 8, 44100);
+o4 = o1.createBiquadFilter();
+o4.detune.setValueAtTime(0.0843, 1.7976931348623157e+308);
+</script>
diff --git a/dom/media/test/crashtests/876024-2.html b/dom/media/test/crashtests/876024-2.html
new file mode 100644
index 000000000..4b9beb745
--- /dev/null
+++ b/dom/media/test/crashtests/876024-2.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+
+function boom()
+{
+ var bufferSource = new AudioContext().createScriptProcessor().context.createBufferSource();
+ bufferSource.start(0, 0, 0);
+ bufferSource.stop(562949953421313);
+}
+
+</script></head>
+
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/876118.html b/dom/media/test/crashtests/876118.html
new file mode 100644
index 000000000..bc0630350
--- /dev/null
+++ b/dom/media/test/crashtests/876118.html
@@ -0,0 +1,16 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource7=Context0.createBufferSource();
+
+BufferSource7.connect(Context0.destination);
+BufferSource7.buffer=function(){
+ var length=7;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(-1))};
+ return Buffer;
+}();
+
+
+Context0.destination.channelCountMode="explicit";
+Context0.destination.channelCount=519910189000000;
+</script>
diff --git a/dom/media/test/crashtests/876207.html b/dom/media/test/crashtests/876207.html
new file mode 100644
index 000000000..7bfcb096b
--- /dev/null
+++ b/dom/media/test/crashtests/876207.html
@@ -0,0 +1,30 @@
+<script>
+try { o1 = new window.OfflineAudioContext(1, 10, 44100); } catch(e) { }
+try { o2 = o1.createChannelSplitter(1); } catch(e) { }
+try { o3 = o1.createAnalyser(); } catch(e) { }
+try { o4 = o1.createWaveShaper(); } catch(e) { }
+try { o5 = o1.createChannelSplitter(6); } catch(e) { }
+try { o6 = o1.createAnalyser(); } catch(e) { }
+try { o7 = o1.createBufferSource(); } catch(e) { }
+try { o7.connect(o1.destination); } catch(e) { }
+try { o7.buffer = function() {
+o8 = o1.createBuffer(1, 3, o1.sampleRate);
+o9 = o8.getChannelData(0);
+for(var i = 0; i < 3; ++i) {
+o9[i] = Math.sin(i * 127);
+}
+return o8;
+}()
+; } catch(e) { }
+try { o7.playbackRate.cancelScheduledValues(0) } catch(e) { }
+try { o7.channelInterpretation = 'speakers'; } catch(e) { }
+try { o1.destination.channelInterpretation = 'speakers'; } catch(e) { }
+try { o5.connect(o1.destination, 1, 1) } catch(e) { }
+try { o1.listener.setOrientation(0, 1073741824, 1073741824, 4194304, 1, 0) } catch(e) { }
+try { o4.curve = new Float32Array(127); } catch(e) { }
+try { o6.getByteFrequencyData(new Uint8Array(12)) } catch(e) { }
+try { o6.disconnect() } catch(e) { }
+try { o1.destination.channelCount = 33554432; } catch(e) { }
+try { o7.playbackRate.setTargetAtTime(0, 8388608, 1) } catch(e) { }
+try { o6.getByteTimeDomainData(new Uint8Array(12)) } catch(e) { }
+</script>
diff --git a/dom/media/test/crashtests/876215.html b/dom/media/test/crashtests/876215.html
new file mode 100644
index 000000000..07135e362
--- /dev/null
+++ b/dom/media/test/crashtests/876215.html
@@ -0,0 +1,14 @@
+<script>
+try { o1 = new window.OfflineAudioContext(1, 10, 44100); } catch(e) { }
+try { o6 = o1.createScriptProcessor(0, 0, 2); } catch(e) { }
+try { o8 = o1.createBufferSource(); } catch(e) { }
+try { o8.connect(o1.destination); } catch(e) { }
+try { o8.connect(o6) } catch(e) { }
+try { o3.disconnect() } catch(e) { }
+try { o8.buffer = function() {
+o21 = o1.createBuffer(1, 3, o1.sampleRate);
+o22 = o21.getChannelData(0);
+return o21;
+}()
+; } catch(e) { }
+</script>
diff --git a/dom/media/test/crashtests/876249.html b/dom/media/test/crashtests/876249.html
new file mode 100644
index 000000000..6f72b40bc
--- /dev/null
+++ b/dom/media/test/crashtests/876249.html
@@ -0,0 +1,27 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource0=Context0.createBufferSource();
+var BiquadFilter0=Context0.createBiquadFilter();
+BufferSource0.start(0,0.6167310480959713,0.7142638498917222);
+BiquadFilter0.connect(Context0.destination);
+BufferSource0.buffer=function(){
+ var length=86333;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(-1))};
+ return Buffer;
+}();
+
+BufferSource0.connect(BiquadFilter0);
+
+BufferSource0.buffer=function(){
+ var length=21989;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(0))};
+ return Buffer;
+}();
+
+BufferSource0.stop(0.04184641852043569);
+
+</script>
diff --git a/dom/media/test/crashtests/876252.html b/dom/media/test/crashtests/876252.html
new file mode 100644
index 000000000..cb9cb63ed
--- /dev/null
+++ b/dom/media/test/crashtests/876252.html
@@ -0,0 +1,23 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource4=Context0.createBufferSource();
+BufferSource4.start(0.05386466556228697,0.397192713804543,0.48810303467325866);
+
+BufferSource4.buffer=function(){
+ var length=109076;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(370))};
+ return Buffer;
+}();
+
+BufferSource4.buffer=function(){
+ var length=19339;
+ var Buffer=Context0.createBuffer(1,length,53362);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(-0.16235407581552863))};
+ return Buffer;
+}();
+
+BufferSource4.stop(0.46482366253621876);
+</script>
diff --git a/dom/media/test/crashtests/876834.html b/dom/media/test/crashtests/876834.html
new file mode 100644
index 000000000..f4ca6ee55
--- /dev/null
+++ b/dom/media/test/crashtests/876834.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+new OfflineAudioContext(0, 0, 3229622);
+</script>
diff --git a/dom/media/test/crashtests/877527.html b/dom/media/test/crashtests/877527.html
new file mode 100644
index 000000000..c639d501b
--- /dev/null
+++ b/dom/media/test/crashtests/877527.html
@@ -0,0 +1,37 @@
+<script>
+try { o1 = new window.AudioContext(2, 5, 44100); } catch(e) { }
+try { o2 = o1.createChannelMerger(1); } catch(e) { }
+try { o3 = o1.createDelay(10); } catch(e) { }
+try { o4 = o1.createBuffer(2, 2048, 8000); } catch(e) { }
+try { o5 = o1.createPanner(); } catch(e) { }
+try { o6 = o1.createBufferSource(); } catch(e) { }
+try { o7 = (function() {
+var buf = o1.createBuffer(1, 50000, o1.sampleRate);
+for(var j=0; j<1; ++j) {
+for(var i=0; i<50000; ++i) { buf.getChannelData(j)[i] = Math.sin(i * (9.8));}
+}
+return buf;
+})(); } catch(e) { }
+try { o6.buffer = o7; } catch(e) { }
+try { o6.connect(o5); } catch(e) { }
+try { o5.connect(o1.destination); } catch(e) { }
+try { o1.listener.speedOfSound = 0.0000019073486328125; } catch(e) { }
+try { o6.loop = true; } catch(e) { }
+try { o8 = (function() {
+var buf = o1.createBuffer(2, 1000, o1.sampleRate);
+for(var j=0; j<2; ++j) {
+for(var i=0; i<1000; ++i) { buf.getChannelData(j)[i] = Math.sin(i * (1));}
+}
+return buf;
+})(); } catch(e) { }
+try { o6.buffer = o7; } catch(e) { }
+try { o6.connect(o5); } catch(e) { }
+try { o5.connect(o1.destination); } catch(e) { }
+try { o6.loopEnd = 1.4901161193847656e-8; } catch(e) { }
+try { o6.connect(o1.destination); } catch(e) { }
+try { o6.buffer = o8; } catch(e) { }
+try { o5.setPosition(0.36, o1.destination.context.destination.channelCountMode, o1.destination.context.destination.channelInterpretation) } catch(e) { }
+try { o2.channelCountMode = 'explicit'; } catch(e) { }
+try { o1.listener.speedOfSound = 4; } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+</script>
diff --git a/dom/media/test/crashtests/877820.html b/dom/media/test/crashtests/877820.html
new file mode 100644
index 000000000..6d65c1e9d
--- /dev/null
+++ b/dom/media/test/crashtests/877820.html
@@ -0,0 +1,4 @@
+<script>
+o1 = new window.OfflineAudioContext(2, 5, 0.39);
+window.location.reload();
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/878014.html b/dom/media/test/crashtests/878014.html
new file mode 100644
index 000000000..4a0ca6dce
--- /dev/null
+++ b/dom/media/test/crashtests/878014.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+try { o2 = new window.AudioContext(1, 15, 44100); } catch(e) { }
+try { o5 = o2.createDelay(0.1); } catch(e) { }
+try { o6 = o2.createPanner(); } catch(e) { }
+try { o8 = o2.createBufferSource(); } catch(e) { }
+try { o9 = (function() {
+var buf = o2.createBuffer(1, 12134, o2.sampleRate);
+for(var j=0; j<1; ++j) {
+for(var i=0; i<12134; ++i) { buf.getChannelData(j)[i] = Math.sin(i * (-127));}
+}
+return buf;
+})(); } catch(e) { }
+try { o8.buffer = o9; } catch(e) { }
+try { o8.connect(o6); } catch(e) { }
+try { o6.connect(o5, 0, 0) } catch(e) { }
+try { o8.buffer = (function() {
+var buf = o2.createBuffer(1, 5409, o2.sampleRate);
+for(var j=0; j<1; ++j) {
+for(var i=0; i<5409; ++i) { buf.getChannelData(j)[i] = Math.sin(i * (-1));}
+}
+return buf;
+})(); } catch(e) { }
+setTimeout(function() { try { o5.delayTime.setValueAtTime(0.78, 121560862.56366833); } catch(e) { } setTimeout(done, 0); },128)
+try { o5.delayTime.value = 0.4283; } catch(e) { }
+
+function done() {
+ document.documentElement.removeAttribute("class");
+}
+</script>
diff --git a/dom/media/test/crashtests/878328.html b/dom/media/test/crashtests/878328.html
new file mode 100644
index 000000000..ec7b39871
--- /dev/null
+++ b/dom/media/test/crashtests/878328.html
@@ -0,0 +1,5 @@
+<script>
+o1 = new window.AudioContext(2, 7, 44100);
+o5 = o1.createDelay(1);
+o5.delayTime.setValueCurveAtTime(new Float32Array(3), 1.7976931348623157e+308, 0.64);
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/878407.html b/dom/media/test/crashtests/878407.html
new file mode 100644
index 000000000..ae2918dc8
--- /dev/null
+++ b/dom/media/test/crashtests/878407.html
@@ -0,0 +1,11 @@
+<script>
+o1 = new window.AudioContext();
+o4 = o1.createDelay(0.4468);
+o6 = o1.createPanner();
+o7 = (function() {var buf = o1.createBuffer(1, 1000, o1.sampleRate);for(var j=0; j<1; ++j) {for(var i=0; i<1000; ++i) {buf.getChannelData(j)[i] = Math.sin(i * (-15));}}return buf;})();
+o8 = o1.createBufferSource();
+o8.buffer = o7;
+o8.connect(o6);
+o6.connect(o4)
+o4.delayTime.setValueAtTime(0.6019893103749466289898, 0.26)
+</script>
diff --git a/dom/media/test/crashtests/878478.html b/dom/media/test/crashtests/878478.html
new file mode 100644
index 000000000..89a47ddb5
--- /dev/null
+++ b/dom/media/test/crashtests/878478.html
@@ -0,0 +1,30 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource0=Context0.createBufferSource();
+
+BufferSource0.loop=true;
+
+BufferSource0.buffer=function(){
+ var channels=3;
+ var length=97252;
+ var Buffer=Context0.createBuffer(channels,length,Context0.sampleRate);
+ for(var y=0;y<channels;y++){
+ var bufferData= Buffer.getChannelData(y);
+ for (var i = 0; i < length; ++i) { bufferData[i] = 1;}
+ };
+ return Buffer;
+}();
+
+BufferSource0.playbackRate.cancelScheduledValues(0.4);
+
+BufferSource0.loopEnd=5e-324;
+
+BufferSource0.buffer=function(){
+ var length=26590;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = 1};
+ return Buffer;
+}();
+
+</script>
diff --git a/dom/media/test/crashtests/880129.html b/dom/media/test/crashtests/880129.html
new file mode 100644
index 000000000..775e9d80b
--- /dev/null
+++ b/dom/media/test/crashtests/880129.html
@@ -0,0 +1,9 @@
+<script>
+try { o1 = new window.AudioContext(3, 2, 44100); } catch(e) { }
+try { o6 = o1.createBufferSource(); } catch(e) { }
+try { o15 = o1.createAnalyser(); } catch(e) { }
+try { o15.fftSize = 32; } catch(e) { }
+try { o6.connect(o15,0,0) } catch(e) { }
+try { o27 = o1.createPanner(); } catch(e) { }
+try { o6.buffer = function(){var buffer = o1.createBuffer(2, 1148, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<1148; i++) {buffer.getChannelData(c)[i] = 0;}}return buffer;}() } catch(e) { }
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/880202.html b/dom/media/test/crashtests/880202.html
new file mode 100644
index 000000000..dc0fade9d
--- /dev/null
+++ b/dom/media/test/crashtests/880202.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var Context0= new window.OfflineAudioContext(15,12119,44100)
+var BufferSource1=Context0.createBufferSource();
+var Gain0=Context0.createGain();
+var Panner0=Context0.createPanner();
+Context0.listener.setPosition(29,135,158);
+
+BufferSource1.connect(Gain0);
+
+BufferSource1.buffer=function(){
+ var channels=3;
+ var length=53325;
+ var Buffer=Context0.createBuffer(channels,length,Context0.sampleRate);
+ for(var y=0;y<channels;y++){
+ var bufferData= Buffer.getChannelData(y);
+ for (var i = 0; i < length; ++i) {
+ bufferData[i] = i*(270);
+ }
+ };
+ return Buffer;
+}();
+
+Gain0.connect(Panner0);
+Panner0.panningModel="equalpower";
+
+
+setTimeout(function(){
+document.documentElement.removeAttribute("class");
+},500)
+
+</script>
diff --git a/dom/media/test/crashtests/880342-1.html b/dom/media/test/crashtests/880342-1.html
new file mode 100644
index 000000000..7d1aa0c3e
--- /dev/null
+++ b/dom/media/test/crashtests/880342-1.html
@@ -0,0 +1,208 @@
+<script>
+try { o1 = new window.AudioContext(2, 10, 1019159); } catch(e) { }
+try { o2 = o1.createBufferSource(); } catch(e) { }
+try { o3 = o1.createConvolver(); } catch(e) { }
+try { o4 = o1.createChannelMerger(2); } catch(e) { }
+try { o5 = o1.createAnalyser(); } catch(e) { }
+try { o6 = o1.createPanner(); } catch(e) { }
+try { o7 = o1.createDynamicsCompressor(); } catch(e) { }
+try { o8 = o1.createWaveShaper(); } catch(e) { }
+try { o9 = o1.createChannelSplitter(6); } catch(e) { }
+try { o10 = o1.createScriptProcessor(8192, 2, 3); } catch(e) { }
+try { o1.listener.setPosition(-144115188075855870, 0, -5e-324) } catch(e) { }
+try { o3.buffer = function(){var buffer = o1.createBuffer(2, 741, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<741; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}(); } catch(e) { }
+try { o10.onaudioprocess = function(e) { /* onEvent */ }; } catch(e) { }
+try { o3.connect(o5,0,0) } catch(e) { }
+try { o9.channelCountMode = 'max'; } catch(e) { }
+try { o10.onaudioprocess = function(e) { /* onEvent */ }; } catch(e) { }
+try { o7.channelInterpretation = 'speakers'; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 1887, 63346);for(var c=0; c<2; c++) {for(var i=0; i<1887; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.playbackRate.exponentialRampToValueAtTime(3.819464020334534, 32) } catch(e) { }
+try { o5.connect(o9,2,0) } catch(e) { }
+try { o9.channelCountMode = 'explicit'; } catch(e) { }
+try { o1.listener.speedOfSound = 72057594037927940; } catch(e) { }
+try { o1.destination.channelCountMode = 'explicit'; } catch(e) { }
+try { o7.threshold.value = 0.0646435404346891590021684237399313133209944; } catch(e) { }
+try { o7.connect(o10,0,0) } catch(e) { }
+try { o1.destination.channelInterpretation = 'speakers'; } catch(e) { }
+try { o3.connect(o4,0,0) } catch(e) { }
+try { o7.release.value = 23.030355486273447; } catch(e) { }
+try { o9.connect(o9,4,0) } catch(e) { }
+try { o6.channelCountMode = 'max'; } catch(e) { }
+try { o7.threshold.value = 0.6395867363641939418172910336579661816358566284179687500; } catch(e) { }
+try { o2.connect(o9,3,0) } catch(e) { }
+try { o10.onaudioprocess = function(e) { /* onEvent */ }; } catch(e) { }
+try { o7.connect(o10,0,0) } catch(e) { }
+try { o5.connect(o5,0,0) } catch(e) { }
+try { o2.playbackRate.value = 5e-324; } catch(e) { }
+try { o4.channelInterpretation = 'discrete'; } catch(e) { }
+try { o2.playbackRate.value = 1.2211628339508704; } catch(e) { }
+try { o2.channelCountMode = 'clamped-max'; } catch(e) { }
+try { o1.listener.dopplerFactor = 32; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(22, 1811, 21177);for(var c=0; c<22; c++) {for(var i=0; i<1811; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o5.channelCountMode = 'max'; } catch(e) { }
+try { o1.listener.speedOfSound = 1024; } catch(e) { }
+try { o2.playbackRate.value = 9.999999999999998e-91; } catch(e) { }
+try { o1.listener.speedOfSound = 16; } catch(e) { }
+try { o8.curve = new Float32Array(256); } catch(e) { }
+try { o1.listener.setVelocity(0, 128, 4) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(23, 483, o1.sampleRate);for(var c=0; c<23; c++) {for(var i=0; i<483; i++) {buffer.getChannelData(c)[i] = 0.026;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 945, 43803);for(var c=0; c<3; c++) {for(var i=0; i<945; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(19, 997, 23781);for(var c=0; c<19; c++) {for(var i=0; i<997; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.listener.speedOfSound = -8; } catch(e) { }
+try { o3.channelCountMode = 'explicit'; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 1740, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<1740; i++) {buffer.getChannelData(c)[i] = 8;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 1057, 30602);for(var c=0; c<1; c++) {for(var i=0; i<1057; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 78, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<78; i++) {buffer.getChannelData(c)[i] = 10;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.listener.setPosition(9.999999999999995e-275, 0.0001, 2) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 863, o1.sampleRate);for(var c=0; c<1; c++) {for(var i=0; i<863; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o8.channelCount = 3; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 1821, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<1821; i++) {buffer.getChannelData(c)[i] = 0.3655;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o6.connect(o6,0,0) } catch(e) { }
+try { o1.listener.setOrientation(128, -0.479527496, 128, 1, 1, -16) } catch(e) { }
+try { o4.connect(o8,0,0) } catch(e) { }
+try { o7.reduction.exponentialRampToValueAtTime(1.7976931348623157e+308, 2048) } catch(e) { }
+try { o1.listener.dopplerFactor = 0.5754; } catch(e) { }
+try { o7.release.value = 0; } catch(e) { }
+try { o5.getFloatFrequencyData(new Float32Array(2048)) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 120, 42419);for(var c=0; c<2; c++) {for(var i=0; i<120; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o3.buffer = function(){var buffer = o1.createBuffer(1, 1620, o1.sampleRate);for(var c=0; c<1; c++) {for(var i=0; i<1620; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}(); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 823, 77239);for(var c=0; c<1; c++) {for(var i=0; i<823; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.destination.channelInterpretation = 'speakers'; } catch(e) { }
+try { o1.listener.setPosition(2048, 0.000522899209, -4503599627370495) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 84028, 75483);for(var c=0; c<3; c++) {for(var i=0; i<84028; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.playbackRate.setTargetAtTime(5e-324, 9.999999999999998e-104, 0) } catch(e) { }
+try { o7.attack.value = 9.999999999999994e-236; } catch(e) { }
+try { o1.listener.dopplerFactor = 1024; } catch(e) { }
+try { o3.connect(o7,0,0) } catch(e) { }
+try { o2.playbackRate.linearRampToValueAtTime(0, 0) } catch(e) { }
+try { o4.connect(o10,0,0) } catch(e) { }
+try { o1.listener.setVelocity(0.682, 32, 1e-76) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 201, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<201; i++) {buffer.getChannelData(c)[i] = 4;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.connect(o6,0,0) } catch(e) { }
+try { o5.getByteFrequencyData(new Uint8Array(32)) } catch(e) { }
+try { o3.connect(o6,0,0) } catch(e) { }
+try { o7.channelCount = 1; } catch(e) { }
+try { o2.playbackRate.setValueCurveAtTime(new Float32Array(512), 8, 1) } catch(e) { }
+try { o3.connect(o4,0,1) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 1996, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<1996; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.listener.dopplerFactor = 2; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 983, 60517);for(var c=0; c<2; c++) {for(var i=0; i<983; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o6.coneInnerAngle = 360; } catch(e) { }
+try { o8.curve = new Float32Array(512); } catch(e) { }
+try { o1.listener.setPosition(32, 16, 9.999999999999995e-280) } catch(e) { }
+try { o6.connect(o6,0,0) } catch(e) { }
+try { o1.listener.setPosition(2097151, 512, 5e-324) } catch(e) { }
+try { o7.channelCountMode = 'clamped-max'; } catch(e) { }
+try { o1.destination.channelCountMode = 'max'; } catch(e) { }
+try { o1.listener.setPosition(0, 1000000, 64) } catch(e) { }
+try { o4.connect(o5,0,0) } catch(e) { }
+try { o9.connect(o4,0,1) } catch(e) { }
+try { o7.attack.setValueCurveAtTime(new Float32Array(8), 256, 2048) } catch(e) { }
+try { o9.channelCountMode = 'explicit'; } catch(e) { }
+try { o1.listener.dopplerFactor = 5e-324; } catch(e) { }
+try { o4.connect(o10,0,0) } catch(e) { }
+try { o7.ratio.cancelScheduledValues(1) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 1590, 9733);for(var c=0; c<1; c++) {for(var i=0; i<1590; i++) {buffer.getChannelData(c)[i] = 2;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.destination.channelCount = 2; } catch(e) { }
+try { o1.destination.channelInterpretation = 'speakers'; } catch(e) { }
+try { o5.channelCountMode = 'max'; } catch(e) { }
+try { o9.channelCountMode = 'clamped-max'; } catch(e) { }
+try { o7.attack.setTargetAtTime(0.11499421161482907549622467513472656719386577606201171875000, 1, 1.7976931348623157e+308) } catch(e) { }
+try { o2.playbackRate.value = 1; } catch(e) { }
+try { o3.normalize = false; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 1866, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<1866; i++) {buffer.getChannelData(c)[i] = 0.174908422905697580329587026426452212035655975341797;}}return buffer;}(); } catch(e) { }
+try { o2.playbackRate.value = 1.0; } catch(e) { }
+try { o7.threshold.value = 100; } catch(e) { }
+try { o1.listener.setVelocity(961.4441892370145, 9.999999999999999e-157, 1) } catch(e) { }
+try { o5.getByteFrequencyData(new Uint8Array(2)) } catch(e) { }
+try { o6.connect(o10,0,0) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 1176, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<1176; i++) {buffer.getChannelData(c)[i] = 9.753993292300242;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.playbackRate.linearRampToValueAtTime(0.8687, 32) } catch(e) { }
+try { o5.channelCountMode = 'explicit'; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(13, 703, 12723);for(var c=0; c<13; c++) {for(var i=0; i<703; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.loopEnd = 1.7976931348623157e+308; } catch(e) { }
+try { o3.connect(o7,0,0) } catch(e) { }
+try { o1.destination.channelCountMode = 'clamped-max'; } catch(e) { }
+try { o1.destination.channelInterpretation = 'discrete'; } catch(e) { }
+try { o2.connect(o10,0,0) } catch(e) { }
+try { o3.normalize = false; } catch(e) { }
+try { /* switch-case did not return anything. */ } catch(e) { }
+try { o10.connect(o8,0,0) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 132, 88507);for(var c=0; c<3; c++) {for(var i=0; i<132; i++) {buffer.getChannelData(c)[i] = 1.7976931348623157e+308;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.loopStart = 1.7976931348623157e+308; } catch(e) { }
+try { o1.listener.dopplerFactor = 1024; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 40, o1.sampleRate);for(var c=0; c<1; c++) {for(var i=0; i<40; i++) {buffer.getChannelData(c)[i] = 1.3785770335346594;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o4.connect(o9,5,0) } catch(e) { }
+try { o8.curve = new Float32Array(16); } catch(e) { }
+try { o10.onaudioprocess = function(e) { /* onEvent */ }; } catch(e) { }
+try { o6.channelCountMode = 'explicit'; } catch(e) { }
+try { o2.playbackRate.value = 0; } catch(e) { }
+try { o4.channelCount = 3; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 220, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<220; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.destination.channelInterpretation = 'discrete'; } catch(e) { }
+try { o1.listener.setPosition(70368744177664, 2048, 1.7976931348623157e+308) } catch(e) { }
+try { o2.playbackRate.setValueCurveAtTime(new Float32Array(128), 1.7976931348623157e+308, 0.75) } catch(e) { }
+try { o5.fftSize = 118; } catch(e) { }
+try { o5.minDecibels = 1; } catch(e) { }
+try { o7.release.value = 5e-324; } catch(e) { }
+try { o2.channelCount = 3; } catch(e) { }
+try { o2.channelCountMode = 'clamped-max'; } catch(e) { }
+try { o3.normalize = false; } catch(e) { }
+try { o1.listener.speedOfSound = 2; } catch(e) { }
+try { o2.loopStart = 32; } catch(e) { }
+try { o3.channelCountMode = 'max'; } catch(e) { }
+try { o1.listener.setPosition(0.37976588317653304, -274877906943, 64) } catch(e) { }
+try { o8.curve = new Float32Array(4); } catch(e) { }
+try { o1.listener.setVelocity(16, -1024, 0) } catch(e) { }
+try { o5.minDecibels = 10000; } catch(e) { }
+try { o2.playbackRate.value = 5e-324; } catch(e) { }
+try { o3.connect(o9,1,0) } catch(e) { }
+try { o10.onaudioprocess = function(e) { /* onEvent */ }; } catch(e) { }
+try { o5.connect(o8,0,0) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(3, 554, o1.sampleRate);for(var c=0; c<3; c++) {for(var i=0; i<554; i++) {buffer.getChannelData(c)[i] = 0.000001;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o7.release.value = 0; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 1289, 29583);for(var c=0; c<1; c++) {for(var i=0; i<1289; i++) {buffer.getChannelData(c)[i] = 5e-324;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.listener.setOrientation(1024, 64, 16, 1024, 1, 68719476735) } catch(e) { }
+try { o1.listener.setOrientation(512, 10000000, 274877906944, 9.999999999999998e-113, -8, 3.6191134923595274) } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(1, 1453, 15258);for(var c=0; c<1; c++) {for(var i=0; i<1453; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o8.channelInterpretation = 'discrete'; } catch(e) { }
+try { o5.channelInterpretation = 'discrete'; } catch(e) { }
+try { o7.connect(o9,4,0) } catch(e) { }
+try { o8.connect(o10,0,0) } catch(e) { }
+try { o1.listener.setPosition(18014398509481984, 16, 0.505129302503804056279079759406158700585365295410156250000) } catch(e) { }
+try { o10.connect(o9,5,0) } catch(e) { }
+try { o2.loop = false; } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(11, 1673, o1.sampleRate);for(var c=0; c<11; c++) {for(var i=0; i<1673; i++) {buffer.getChannelData(c)[i] = 0;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 577, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<577; i++) {buffer.getChannelData(c)[i] = 0.5611;}}return buffer;}() } catch(e) { }
+try { o2.connect(o1.destination); } catch(e) { }
+try { o1.listener.setOrientation(64, 2049, 5e-324, 0.1777, 2, 7) } catch(e) { }
+try { o5.maxDecibels = 128; } catch(e) { }
+try { o2.start(0) } catch(e) { }
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/880342-2.html b/dom/media/test/crashtests/880342-2.html
new file mode 100644
index 000000000..a8ef88ae7
--- /dev/null
+++ b/dom/media/test/crashtests/880342-2.html
@@ -0,0 +1,8 @@
+<script>
+try { o1 = new window.AudioContext(2, 10, 1019159); } catch(e) { }
+try { o2 = o1.createBufferSource(); } catch(e) { }
+try { o3 = o1.createConvolver(); } catch(e) { }
+try { o3.buffer = function(){var buffer = o1.createBuffer(2, 741, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<741; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}(); } catch(e) { }
+try { o2.buffer = function(){var buffer = o1.createBuffer(2, 120, 42419);for(var c=0; c<2; c++) {for(var i=0; i<120; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}() } catch(e) { }
+try { o3.buffer = function(){var buffer = o1.createBuffer(1, 1620, o1.sampleRate);for(var c=0; c<1; c++) {for(var i=0; i<1620; i++) {buffer.getChannelData(c)[i] = -1;}}return buffer;}(); } catch(e) { }
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/880384.html b/dom/media/test/crashtests/880384.html
new file mode 100644
index 000000000..798fbf133
--- /dev/null
+++ b/dom/media/test/crashtests/880384.html
@@ -0,0 +1,8 @@
+<script>
+o1 = new window.AudioContext(3, 256, 44100);
+o2 = o1.createBufferSource();
+o3 = o1.createConvolver();
+o3.normalize = false;
+o3.buffer = function(){var buffer = o1.createBuffer(2, 1051, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<1051; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}();
+o3.buffer = function(){var buffer = o1.createBuffer(2, 1112, o1.sampleRate);for(var c=0; c<2; c++) {for(var i=0; i<1112; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}();
+</script>
diff --git a/dom/media/test/crashtests/880404.html b/dom/media/test/crashtests/880404.html
new file mode 100644
index 000000000..bf3493238
--- /dev/null
+++ b/dom/media/test/crashtests/880404.html
@@ -0,0 +1,6 @@
+<script>
+o1 = new window.OfflineAudioContext(2, 32, 44100);
+o12 = o1.createConvolver();
+o12.buffer = function(){var buffer = o1.createBuffer(1, 78, o1.sampleRate);for(var c=0; c<1; c++) {for(var i=0; i<78; i++) {buffer.getChannelData(c)[i] = 1;}}return buffer;}();
+o1.startRendering();
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/880724.html b/dom/media/test/crashtests/880724.html
new file mode 100644
index 000000000..b57b5f996
--- /dev/null
+++ b/dom/media/test/crashtests/880724.html
@@ -0,0 +1,13 @@
+<script>
+o1 = new window.AudioContext();
+o5 = o1.createConvolver();
+o5.buffer = function() {
+ var buffer = o1.createBuffer(2, 3, 33120);
+ for(var c=0; c<2; c++) {
+ for(var i=0; i<3; i++) {
+ buffer.getChannelData(c)[i] = -1;
+ }
+ }
+ return buffer;
+}();
+</script> \ No newline at end of file
diff --git a/dom/media/test/crashtests/881775.html b/dom/media/test/crashtests/881775.html
new file mode 100644
index 000000000..d55c45d17
--- /dev/null
+++ b/dom/media/test/crashtests/881775.html
@@ -0,0 +1,25 @@
+<script>
+o1 = new window.AudioContext(2, 16, 44100);
+o2 = o1.createBufferSource();
+o12 = o1.createBiquadFilter();
+o1.destination.channelCountMode = 'max';
+o2.buffer = function(){
+ var buffer = o1.createBuffer(2, 326, 77632);
+ for(var c=0; c<2; c++) {
+ for(var i=0; i<326; i++) {
+ buffer.getChannelData(c)[i] = -1;
+ }
+ }
+ return buffer;
+}();
+o2.connect(o1.destination);
+o2.buffer = function(){
+ var buffer = o1.createBuffer(3, 405, o1.sampleRate);
+ for(var c=0; c<3; c++) {
+ for(var i=0; i<405; i++) {
+ buffer.getChannelData(c)[i] = 1;
+ }
+ }
+ return buffer;
+}();
+</script>
diff --git a/dom/media/test/crashtests/882549.html b/dom/media/test/crashtests/882549.html
new file mode 100644
index 000000000..8a720c3e1
--- /dev/null
+++ b/dom/media/test/crashtests/882549.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script>
+ var o0 = new VTTCue(0.000, 1.000, 'Bug882549');
+ var o1 = o0.getCueAsHTML();
+ </script>
+ </head>
+ <body>
+ </body>
+</html>
+<script>
+</script>
diff --git a/dom/media/test/crashtests/882956.html b/dom/media/test/crashtests/882956.html
new file mode 100644
index 000000000..ae7b441f9
--- /dev/null
+++ b/dom/media/test/crashtests/882956.html
@@ -0,0 +1,15 @@
+<script>
+o1 = new window.AudioContext(1, 2048, 44100);
+o2 = o1.createBufferSource();
+o1.destination.channelCountMode = 'max';
+o2.connect(o1.destination);
+o2.buffer = function(){
+ var buffer = o1.createBuffer(30, 442, 94933);
+ for(var c=0; c<30; c++) {
+ for(var i=0; i<442; i++) {
+ buffer.getChannelData(c)[i] = 1;
+ }
+ }
+ return buffer;
+}();
+</script>
diff --git a/dom/media/test/crashtests/884459.html b/dom/media/test/crashtests/884459.html
new file mode 100644
index 000000000..e321d569f
--- /dev/null
+++ b/dom/media/test/crashtests/884459.html
@@ -0,0 +1,12 @@
+<script>
+var Context0= new window.OfflineAudioContext(14,191531,44100)
+var BufferSource1=Context0.createBufferSource();
+
+setInterval(function(){
+BufferSource1.playbackRate.setTargetAtTime(0xC8F461D3EE6B2,(Context0.currentTime+0.0677539280615747),0.826130285160616);
+BufferSource1.playbackRate.setValueAtTime(35467.63924283907536607336193,0);
+},1)
+
+Context0.startRendering();
+
+</script>
diff --git a/dom/media/test/crashtests/889042.html b/dom/media/test/crashtests/889042.html
new file mode 100644
index 000000000..9f74979c5
--- /dev/null
+++ b/dom/media/test/crashtests/889042.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+ (new AudioContext()).createConvolver().buffer = null;
+</script>
diff --git a/dom/media/test/crashtests/894104.html b/dom/media/test/crashtests/894104.html
new file mode 100644
index 000000000..d021994e7
--- /dev/null
+++ b/dom/media/test/crashtests/894104.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+
+function boom()
+{
+ var frame = document.getElementById("f");
+ var frameWin = frame.contentWindow;
+ frameWin.VTTCue;
+ document.body.removeChild(frame);
+ new frameWin.VTTCue(0, 1, "Bug 894104").getCueAsHTML();
+}
+
+</script>
+</head>
+
+<body onload="boom();"><iframe id="f" src="data:text/html,1"></iframe></body>
+</html>
diff --git a/dom/media/test/crashtests/907986-1.html b/dom/media/test/crashtests/907986-1.html
new file mode 100644
index 000000000..320b8eadd
--- /dev/null
+++ b/dom/media/test/crashtests/907986-1.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 100, 48000);
+context.oncomplete = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+// zero front vector
+context.listener.setOrientation(0, 0, 0, 6.311749985202524e+307, 0, 0);
+var panner = context.createPanner();
+panner.setPosition(6.311749985202524e+307, 4, 6.311749985202524e+307);
+panner.connect(context.destination);
+var source = context.createOscillator();
+source.connect(panner);
+source.start(0);
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/907986-2.html b/dom/media/test/crashtests/907986-2.html
new file mode 100644
index 000000000..e0626ba2c
--- /dev/null
+++ b/dom/media/test/crashtests/907986-2.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 100, 48000);
+context.oncomplete = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+// zero up vector
+context.listener.setOrientation(0, 6.311749985202524e+307, 0, 0, 0, 0);
+var panner = context.createPanner();
+panner.setPosition(1, 2, 3);
+panner.connect(context.destination);
+var source = context.createOscillator();
+source.connect(panner);
+source.start(0);
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/907986-3.html b/dom/media/test/crashtests/907986-3.html
new file mode 100644
index 000000000..75b756c36
--- /dev/null
+++ b/dom/media/test/crashtests/907986-3.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 100, 48000);
+context.oncomplete = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+// linearly dependent
+context.listener.setOrientation(0, 0, -6.311749985202524e+307, 0, 0, 6.311749985202524e+307);
+var panner = context.createPanner();
+panner.setPosition(1, 2, 3);
+panner.connect(context.destination);
+var source = context.createOscillator();
+source.connect(panner);
+source.start(0);
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/907986-4.html b/dom/media/test/crashtests/907986-4.html
new file mode 100644
index 000000000..a73500efc
--- /dev/null
+++ b/dom/media/test/crashtests/907986-4.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 100, 48000);
+context.oncomplete = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+var panner = context.createPanner();
+panner.setPosition(0, 3, 0); // directly overhead
+panner.connect(context.destination);
+var source = context.createOscillator();
+source.connect(panner);
+source.start(0);
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/910171-1.html b/dom/media/test/crashtests/910171-1.html
new file mode 100644
index 000000000..9f3ec831b
--- /dev/null
+++ b/dom/media/test/crashtests/910171-1.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 4096, 48000);
+context.oncomplete = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+var delay = context.createDelay();
+delay.connect(context.destination);
+delay.delayTime.value = 1.0;
+var buffer = context.createBuffer(1, 2048, context.sampleRate);
+var source = context.createBufferSource();
+source.buffer = buffer;
+source.connect(delay);
+source.start();
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/920987.html b/dom/media/test/crashtests/920987.html
new file mode 100644
index 000000000..6e8b2992a
--- /dev/null
+++ b/dom/media/test/crashtests/920987.html
@@ -0,0 +1,6 @@
+<script>
+var ctx = new AudioContext();
+var buffer = ctx.createBuffer(1, 1000, ctx.sampleRate);
+var array = new Float32Array(900);
+buffer.copyToChannel(array, 0, 0xfffffff8);
+</script>
diff --git a/dom/media/test/crashtests/925619-1.html b/dom/media/test/crashtests/925619-1.html
new file mode 100644
index 000000000..146c531f9
--- /dev/null
+++ b/dom/media/test/crashtests/925619-1.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+// 1024 > 89478.5 * 48000 - (1 << 32)
+var context = new window.OfflineAudioContext(1, 1024, 48000);
+context.oncomplete = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+var buffer = context.createBuffer(1, 2048, context.sampleRate);
+var source = context.createBufferSource();
+source.buffer = buffer;
+source.start(89478.5); // 89478.5 is a little greater than 2^32 / 48000.
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/925619-2.html b/dom/media/test/crashtests/925619-2.html
new file mode 100644
index 000000000..e734b8bca
--- /dev/null
+++ b/dom/media/test/crashtests/925619-2.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 2048, 48000);
+// 1024 > 89478.5 * 48000 - (1 << 32)
+var buffer = context.createBuffer(1, 1024, context.sampleRate);
+var source = context.createBufferSource();
+source.buffer = buffer;
+source.onended = function(e) {
+ document.documentElement.removeAttribute("class");
+};
+source.start(0);
+source.stop(89478.5); // 89478.5 is a little greater than 2^32 / 48000.
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/926619.html b/dom/media/test/crashtests/926619.html
new file mode 100644
index 000000000..2ead02af4
--- /dev/null
+++ b/dom/media/test/crashtests/926619.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+
+function boom()
+{
+ var ac = new window.AudioContext();
+
+ var _ChannelMergerNode = ac.createChannelMerger(4);
+
+ var _MediaStreamAudioDestinationNode = ac.createMediaStreamDestination();
+ var _MediaStream = _MediaStreamAudioDestinationNode.stream;
+ var _MediaStreamAudioSourceNode = ac.createMediaStreamSource(_MediaStream);
+
+ _ChannelMergerNode.connect(_MediaStreamAudioDestinationNode, 0, 0);
+ _MediaStreamAudioSourceNode.connect(_ChannelMergerNode, 0, 0);
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/933151.html b/dom/media/test/crashtests/933151.html
new file mode 100644
index 000000000..3d45f7af3
--- /dev/null
+++ b/dom/media/test/crashtests/933151.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+function boom()
+{
+ var ac = new window.AudioContext();
+ var buffer = ac.createBuffer(1, 24313, 47250);
+ buffer.copyFromChannel(buffer.getChannelData(0), '');
+}
+
+</script>
+</head>
+<body onload="boom();"></body>
+</html>
diff --git a/dom/media/test/crashtests/933156.html b/dom/media/test/crashtests/933156.html
new file mode 100644
index 000000000..b89445a43
--- /dev/null
+++ b/dom/media/test/crashtests/933156.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+function boom()
+{
+ var ac = new window.AudioContext();
+
+ var panner = ac.createPanner();
+ panner.setPosition(8, 0.7643051305237005, 0.10292575673733972);
+
+ var oscillator = ac.createOscillator();
+ oscillator.connect(panner);
+ oscillator.start(0);
+
+ setTimeout(function() {
+ panner.panningModel = 'equalpower';
+ oscillator.stop(0);
+ document.documentElement.removeAttribute("class");
+ }, 0.5);
+}
+boom();
+</script>
+</html>
diff --git a/dom/media/test/crashtests/944851.html b/dom/media/test/crashtests/944851.html
new file mode 100644
index 000000000..4f663accc
--- /dev/null
+++ b/dom/media/test/crashtests/944851.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+
+var ac = new AudioContext(1, 1354, 44100);
+var shaper = ac.createWaveShaper();
+var biquad = ac.createBiquadFilter();
+shaper.connect(biquad.frequency);
+biquad.getFrequencyResponse(new Float32Array(55785),
+ new Float32Array(62876),
+ new Float32Array(45111));
+
+</script>
+</head>
+</html>
diff --git a/dom/media/test/crashtests/952756.html b/dom/media/test/crashtests/952756.html
new file mode 100644
index 000000000..ffced2e40
--- /dev/null
+++ b/dom/media/test/crashtests/952756.html
@@ -0,0 +1,19 @@
+<script>
+var Context0= new AudioContext()
+var BufferSource0=Context0.createBufferSource();
+BufferSource0.buffer=function(){
+ var length=35887;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(0.39765272522345185))};
+ return Buffer;
+}();
+BufferSource0.start(0.01932738965842873,0.33345631847623736,0.3893404237460345);
+BufferSource0.buffer=function(){
+ var length=15952;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) { bufferData[i] = Math.sin(i*(85))};
+ return Buffer;
+}();
+</script>
diff --git a/dom/media/test/crashtests/966636.html b/dom/media/test/crashtests/966636.html
new file mode 100644
index 000000000..acc9758c8
--- /dev/null
+++ b/dom/media/test/crashtests/966636.html
@@ -0,0 +1,45 @@
+<html class="reftest-wait">
+<head>
+<script>
+function boom() {
+ var Context0= new window.AudioContext();
+ var BufferSource0=Context0.createBufferSource();
+ BufferSource0.start(0);
+ BufferSource0.playbackRate.value = 1.0/128.0;
+
+ setTimeout(
+ function(){
+ BufferSource0.buffer=
+ function(){
+ var length=1;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) {
+ bufferData[i] = Math.sin(i*(626))
+ };return Buffer;
+ }();
+ setTimeout(
+ function(){
+ document.documentElement.removeAttribute("class");
+ }, 0)
+ },4)
+
+ BufferSource0.buffer=
+ function(){
+ const resample_filter_length = 64;
+ // Small enough so that resampler tail latency is triggered immediately,
+ // but large enough that skip_zeros does not consume resampler tail
+ // latency.
+ var length=resample_filter_length/2 + 1;
+ var Buffer=Context0.createBuffer(1,length,Context0.sampleRate);
+ var bufferData= Buffer.getChannelData(0);
+ for (var i = 0; i < length; ++i) {
+ bufferData[i] = Math.sin(i*(311980))
+ };
+ return Buffer;
+ }();
+}
+</script>
+</head>
+<body onload="boom();">
+</body>
diff --git a/dom/media/test/crashtests/986901.html b/dom/media/test/crashtests/986901.html
new file mode 100644
index 000000000..343df2c0e
--- /dev/null
+++ b/dom/media/test/crashtests/986901.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<script>
+ var ac = new window.AudioContext();
+ var delay1 = ac.createDelay(0.02);
+ var delay2 = ac.createDelay(0.002);
+ var source = ac.createOscillator();
+ source.start(0);
+ source.connect(delay1, 0, 0);
+ delay2.connect(delay1, 0, 0);
+ delay1.connect(delay2, 0, 0);
+</script>
+</head>
+</html>
diff --git a/dom/media/test/crashtests/990794.html b/dom/media/test/crashtests/990794.html
new file mode 100644
index 000000000..8b40088b1
--- /dev/null
+++ b/dom/media/test/crashtests/990794.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script>
+var ctx = new AudioContext();
+var source = ctx.createOscillator();
+source.start(0);
+
+function appendMerger(src) {
+ const inputCount = 18;
+
+ var merger = ctx.createChannelMerger(32);
+
+ for (var i = 0; i < inputCount; ++i) {
+ src.connect(merger, 0, i);
+ }
+
+ return merger;
+}
+
+for (var i = 0; i < 6; ++i) {
+ source = appendMerger(source);
+}
+</script>
diff --git a/dom/media/test/crashtests/995289.html b/dom/media/test/crashtests/995289.html
new file mode 100644
index 000000000..c988f41fa
--- /dev/null
+++ b/dom/media/test/crashtests/995289.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script>
+var r0=new AudioContext();
+var r5=r0.createOscillator();
+var r6=r0.createPeriodicWave(new Float32Array(1),new Float32Array(1));
+r5.frequency.value = 4294967295;
+r5.start(0);
+r5.setPeriodicWave(r6);
+</script>
diff --git a/dom/media/test/crashtests/analyser-channels-1.html b/dom/media/test/crashtests/analyser-channels-1.html
new file mode 100644
index 000000000..2f3133cf1
--- /dev/null
+++ b/dom/media/test/crashtests/analyser-channels-1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+ var context = new window.OfflineAudioContext(1, 256, 48000);
+ var analyser = context.createAnalyser();
+ analyser.channelCount = 2;
+ analyser.channelCountMode = "explicit";
+ analyser.fftSize = 32;
+ var source = context.createOscillator();
+ source.connect(analyser);
+ source.start(0);
+ context.startRendering().
+ then(function() {
+ document.documentElement.removeAttribute("class");
+ });
+</script>
diff --git a/dom/media/test/crashtests/audiocontext-double-suspend.html b/dom/media/test/crashtests/audiocontext-double-suspend.html
new file mode 100644
index 000000000..98399549b
--- /dev/null
+++ b/dom/media/test/crashtests/audiocontext-double-suspend.html
@@ -0,0 +1,5 @@
+<script>
+var ac = new AudioContext();
+ac.resume();
+ac.resume();
+</script>
diff --git a/dom/media/test/crashtests/buffer-source-duration-1.html b/dom/media/test/crashtests/buffer-source-duration-1.html
new file mode 100644
index 000000000..df8d7a37d
--- /dev/null
+++ b/dom/media/test/crashtests/buffer-source-duration-1.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+const rate = 44100;
+var context = new window.OfflineAudioContext(1, 512, rate);
+var buffer = context.createBuffer(1, 128, rate);
+var source = context.createBufferSource();
+source.buffer = buffer;
+source.start(0, 0, 86400);
+context.startRendering().
+ then(function() {
+ document.documentElement.removeAttribute("class");
+ });
+</script>
diff --git a/dom/media/test/crashtests/buffer-source-ended-1.html b/dom/media/test/crashtests/buffer-source-ended-1.html
new file mode 100644
index 000000000..de8546316
--- /dev/null
+++ b/dom/media/test/crashtests/buffer-source-ended-1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new AudioContext();
+
+var source = context.createBufferSource();
+source.buffer = context.createBuffer(1, 2.0 * context.sampleRate, context.sampleRate);
+source.onended = function(e) {
+ document.documentElement.removeAttribute("class");
+}
+source.start(0.0, 1.0);
+setTimeout(
+ function() {
+ source.buffer = context.createBuffer(1, 1, context.sampleRate);
+ }, 0);
+</script>
diff --git a/dom/media/test/crashtests/buffer-source-resampling-start-1.html b/dom/media/test/crashtests/buffer-source-resampling-start-1.html
new file mode 100644
index 000000000..55db8591e
--- /dev/null
+++ b/dom/media/test/crashtests/buffer-source-resampling-start-1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+const rate = 44101; // not divisible by 2
+var context = new window.OfflineAudioContext(1, 512, rate);
+var buffer = context.createBuffer(1, 128, rate);
+buffer.getChannelData(0)[0] = 1.0;
+var source = context.createBufferSource();
+source.buffer = buffer;
+source.playbackRate.value = rate / (Math.pow(2, 30) * 1.0000001);
+source.start(512 / rate);
+context.startRendering().
+ then(function() {
+ document.documentElement.removeAttribute("class");
+ });
+</script>
diff --git a/dom/media/test/crashtests/cors.webm b/dom/media/test/crashtests/cors.webm
new file mode 100644
index 000000000..72b029723
--- /dev/null
+++ b/dom/media/test/crashtests/cors.webm
Binary files differ
diff --git a/dom/media/test/crashtests/cors.webm^headers^ b/dom/media/test/crashtests/cors.webm^headers^
new file mode 100644
index 000000000..cb762eff8
--- /dev/null
+++ b/dom/media/test/crashtests/cors.webm^headers^
@@ -0,0 +1 @@
+Access-Control-Allow-Origin: *
diff --git a/dom/media/test/crashtests/crashtests.list b/dom/media/test/crashtests/crashtests.list
new file mode 100644
index 000000000..496fe5ee5
--- /dev/null
+++ b/dom/media/test/crashtests/crashtests.list
@@ -0,0 +1,103 @@
+load 0-timescale.html # bug 1229166
+skip-if(Android) load 459439-1.html # bug 888557
+load 466607-1.html
+load 466945-1.html
+load 468763-1.html
+load 474744-1.html
+HTTP load 481136-1.html # needs to be HTTP to recognize the ogg as an audio file?
+load 492286-1.xhtml
+load 493915-1.html
+load 495794-1.html
+load 576612-1.html
+load 752784-1.html
+load 789075-1.html
+HTTP load 795892-1.html
+load 844563.html
+load 846612.html
+load 852838.html
+load 865537-1.html
+load 868504.html
+load 874869.html
+load 874915.html
+load 874934.html
+load 874952.html
+load 875144.html
+load 875596.html
+load 875911.html
+load 876024-1.html
+load 876024-2.html
+load 876118.html
+load 876207.html
+load 876215.html
+load 876249.html
+load 876252.html
+load 876834.html
+load 877527.html
+load 877820.html
+load 878014.html
+load 878328.html
+load 878407.html
+load 878478.html
+load 880129.html
+load 880202.html
+load 880342-1.html
+load 880342-2.html
+load 880384.html
+load 880404.html
+load 880724.html
+load 881775.html
+load 882549.html
+load 882956.html
+load 884459.html
+load 889042.html
+load 894104.html
+load 907986-1.html
+load 907986-2.html
+load 907986-3.html
+load 907986-4.html
+load 910171-1.html
+load 920987.html
+load 925619-1.html
+load 925619-2.html
+load 926619.html
+load 933151.html
+load 933156.html
+load 944851.html
+load 952756.html
+load 966636.html
+load 986901.html
+load 990794.html
+load 995289.html
+load 1012609.html
+load 1015662.html
+load 1020205.html
+skip-if(Android) test-pref(media.navigator.permission.disabled,true) load 1028458.html # bug 1048863
+load 1041466.html
+load 1045650.html
+load 1080986.html
+load 1122218.html
+load 1127188.html
+load 1157994.html
+load 1158427.html
+load 1185176.html
+load 1185192.html
+load 1223670.html
+load 1228484.html
+load 1304948.html
+load 1319486.html
+load 1291702.html
+load disconnect-wrong-destination.html
+load analyser-channels-1.html
+load audiocontext-double-suspend.html
+load buffer-source-duration-1.html
+load buffer-source-ended-1.html
+load buffer-source-resampling-start-1.html
+load doppler-1.html
+HTTP load media-element-source-seek-1.html
+load offline-buffer-source-ended-1.html
+load oscillator-ended-1.html
+load oscillator-ended-2.html
+load video-replay-after-audio-end.html
+# This needs to run at the end to avoid leaking busted state into other tests.
+load 691096-1.html
+load 1236639.html
diff --git a/dom/media/test/crashtests/disconnect-wrong-destination.html b/dom/media/test/crashtests/disconnect-wrong-destination.html
new file mode 100644
index 000000000..515ca3c87
--- /dev/null
+++ b/dom/media/test/crashtests/disconnect-wrong-destination.html
@@ -0,0 +1,13 @@
+<script>
+ var oc = new OfflineAudioContext(1, 1, 44100);
+ var splitter = oc.createChannelSplitter(2);
+ var merger0 = oc.createChannelMerger(2);
+ var merger1 = oc.createChannelMerger(2);
+ splitter.connect(merger0, 0);
+ splitter.connect(merger0, 1);
+ splitter.connect(merger1, 0);
+ splitter.connect(merger1, 1);
+
+ splitter.disconnect(merger0, 0);
+ splitter.disconnect(merger1, 1);
+</script>
diff --git a/dom/media/test/crashtests/doppler-1.html b/dom/media/test/crashtests/doppler-1.html
new file mode 100644
index 000000000..2af3c8f46
--- /dev/null
+++ b/dom/media/test/crashtests/doppler-1.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.AudioContext();
+var source = context.createBufferSource();
+source.buffer = context.createBuffer(1, 1, context.sampleRate);
+source.onended =
+ function(e) {
+ setTimeout(
+ function() {
+ var panner = context.createPanner();
+ source.connect(panner);
+ panner.setVelocity(1.0, 0.0, 0.0);
+ setTimeout(
+ function() {
+ document.documentElement.removeAttribute("class");
+ },
+ 0);
+ },
+ 0);
+ };
+source.start(0);
+</script>
diff --git a/dom/media/test/crashtests/media-element-source-seek-1.html b/dom/media/test/crashtests/media-element-source-seek-1.html
new file mode 100644
index 000000000..5c3aed5ae
--- /dev/null
+++ b/dom/media/test/crashtests/media-element-source-seek-1.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var audioElement = document.createElement("audio");
+audioElement.autoplay = true;
+audioElement.src = "sound.ogg";
+audioElement.onplaying =
+ function() {
+ audioElement.onplaying = null;
+ setTimeout(
+ function() {
+ audioElement.onseeked =
+ function() {
+ // Note we reset 'src' to release decoder resources and cubeb
+ // streams to prevent OOM or OpenCubeb() failures.
+ audioElement.src = "";
+ document.documentElement.removeAttribute("class");
+ };
+ audioElement.currentTime = 0;
+ }, 100);
+ };
+
+var context = new window.AudioContext();
+var source = context.createMediaElementSource(audioElement);
+source.connect(context.destination);
+</script>
+</html>
diff --git a/dom/media/test/crashtests/offline-buffer-source-ended-1.html b/dom/media/test/crashtests/offline-buffer-source-ended-1.html
new file mode 100644
index 000000000..063102112
--- /dev/null
+++ b/dom/media/test/crashtests/offline-buffer-source-ended-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+var context = new window.OfflineAudioContext(1, 12001, 12000);
+
+var source = context.createBufferSource();
+source.buffer = context.createBuffer(1, 12000, context.sampleRate);
+source.onended = function(e) {
+ document.documentElement.removeAttribute("class");
+}
+source.connect(context.destination);
+source.start(0);
+
+context.startRendering();
+</script>
diff --git a/dom/media/test/crashtests/oscillator-ended-1.html b/dom/media/test/crashtests/oscillator-ended-1.html
new file mode 100644
index 000000000..831111261
--- /dev/null
+++ b/dom/media/test/crashtests/oscillator-ended-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+function createContext() {
+ var context = new window.AudioContext();
+ var source = context.createOscillator();
+ source.onended = function(e) {
+ document.documentElement.removeAttribute("class");
+ };
+ source.connect(context.destination);
+ source.start(0.49);
+ source.stop(0.5);
+}
+createContext();
+</script>
diff --git a/dom/media/test/crashtests/oscillator-ended-2.html b/dom/media/test/crashtests/oscillator-ended-2.html
new file mode 100644
index 000000000..ee9b8cf30
--- /dev/null
+++ b/dom/media/test/crashtests/oscillator-ended-2.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<script>
+function createContext() {
+ var context = new window.AudioContext();
+ var source = context.createOscillator();
+ source.onended = function(e) {
+ document.documentElement.removeAttribute("class");
+ };
+ source.connect(context.destination);
+ source.start(60);
+ source.stop(0.5);
+}
+createContext();
+</script>
diff --git a/dom/media/test/crashtests/sound.ogg b/dom/media/test/crashtests/sound.ogg
new file mode 100644
index 000000000..edda4e912
--- /dev/null
+++ b/dom/media/test/crashtests/sound.ogg
Binary files differ
diff --git a/dom/media/test/crashtests/video-crash.webm b/dom/media/test/crashtests/video-crash.webm
new file mode 100644
index 000000000..9532113d8
--- /dev/null
+++ b/dom/media/test/crashtests/video-crash.webm
Binary files differ
diff --git a/dom/media/test/crashtests/video-replay-after-audio-end.html b/dom/media/test/crashtests/video-replay-after-audio-end.html
new file mode 100644
index 000000000..9ffd6078d
--- /dev/null
+++ b/dom/media/test/crashtests/video-replay-after-audio-end.html
@@ -0,0 +1,43 @@
+<html class="reftest-wait">
+<head>
+ <title> Bug 1242774 : video crashed if pause and play again after audio track ends </title>
+</head>
+<body>
+<script type="text/javascript">
+function assert(value, msg) {
+ if (!value) {
+ dump("### Error : " + msg + "\n");
+ }
+}
+
+var AUDIO_END_TIME = 4.5;
+var video = document.createElement('video');
+video.src = "video-crash.webm";
+video.play();
+
+video.ontimeupdate = function () {
+ assert(AUDIO_END_TIME < video.duration,
+ "AUDIO_END_TIME should be smaller than the duration!");
+
+ if (video.currentTime > AUDIO_END_TIME) {
+ dump("### Pause video during silent part.\n");
+ video.ontimeupdate = null;
+ video.pause();
+ }
+
+ video.onpause = function () {
+ video.onpause = null;
+ setTimeout(function() {
+ dump("### Re-play after pausing during silent part.\n");
+ video.play();
+ video.onended = function () {
+ video.onended = null;
+ dump("### Video is ended.\n");
+ document.documentElement.removeAttribute("class");
+ }
+ }, 1000);
+ }
+}
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/dash/dash-manifest-garbled-webm.mpd b/dom/media/test/dash/dash-manifest-garbled-webm.mpd
new file mode 100644
index 000000000..aa78ded3e
--- /dev/null
+++ b/dom/media/test/dash/dash-manifest-garbled-webm.mpd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MPD
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:mpeg:DASH:schema:MPD:2011"
+ xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011"
+ type="static"
+ mediaPresentationDuration="PT3.958S"
+ minBufferTime="PT1S"
+ profiles="urn:webm:dash:profile:webm-on-demand:2012">
+ <BaseURL>./</BaseURL>
+ <Period id="0" start="PT0S" duration="PT3.958S" >
+ <AdaptationSet id="0" mimeType="video/webm" codecs="vp8" lang="eng" subsegmentAlignment="true" subsegmentStartsWithSAP="1" bitstreamSwitching="true">
+ <Representation id="0" bandwidth="54207" width="320" height="180">
+ <BaseURL>garbled.webm</BaseURL>
+ <SegmentBase indexRange="35090-35123">
+ <Initialization range="0-228" />
+ </SegmentBase>
+ </Representation>
+ <Representation id="1" bandwidth="78006" width="428" height="240">
+ <BaseURL>dash-webm-video-428x240.webm</BaseURL>
+ <SegmentBase indexRange="50173-50206">
+ <Initialization range="0-228" />
+ </SegmentBase>
+ </Representation>
+ </AdaptationSet>
+ <AdaptationSet id="1" mimeType="audio/webm" codecs="vorbis" lang="eng" audioSamplingRate="48000" subsegmentStartsWithSAP="1">
+ <Representation id="2" bandwidth="57264">
+ <BaseURL>dash-webm-audio-128k.webm</BaseURL>
+ <SegmentBase indexRange="41927-41946">
+ <Initialization range="0-4521" />
+ </SegmentBase>
+ </Representation>
+ </AdaptationSet>
+ </Period>
+</MPD>
diff --git a/dom/media/test/dash/dash-manifest-garbled.mpd b/dom/media/test/dash/dash-manifest-garbled.mpd
new file mode 100644
index 000000000..ac8eadbdd
--- /dev/null
+++ b/dom/media/test/dash/dash-manifest-garbled.mpd
@@ -0,0 +1 @@
+PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxNUEQgbWVkaWFQcmVzZW50YXRpb25EdXJhdGlvbj0iUFQxOS41MVMiIG1pbkJ1ZmZlclRpbWU9IlBUMVMiIHByb2ZpbGVzPSJ1cm46d2VibTpkYXNoOnByb2ZpbGU6d2VibS1vbi1kZW1hbmQ6MjAxMiIgdHlwZT0ic3RhdGljIiB4bWxucz0idXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0idXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTEiPjxCYXNlVVJMPmh0dHA6Ly93d3cuZ29vZ2xlLmNvbTwvQmFzZVVSTD48UGVyaW9kIGR1cmF0aW9uPSJQVDE5LjUxUyIgaWQ9IjAiIHN0YXJ0PSJQVDBTIj48QWRhcHRhdGlvblNldCBhdWRpb1NhbXBsaW5nUmF0ZT0iNDgwMDAiIGNvZGVjcz0idm9yYmlzIiBpZD0iMSIgbGFuZz0iZW5nIiBtaW1lVHlwZT0iYXVkaW8vd2VibSIgc3Vic2VnbWVudFN0YXJ0c1dpdGhTQVA9IjEiPjxSZXByZXNlbnRhdGlvbiBiYW5kd2lkdGg9IjIwMTA5IiBpZD0iMiI+PEJhc2VVUkwvPjxTZWdtZW50QmFzZSBpbmRleFJhbmdlPSIzMTk3ODAtMzIwNjEyIj48SW5pdGlhbGl6YXRpb24gcmFuZ2U9IjAtMjA4NzAiLz48L1NlZ21lbnRCYXNlPjwvUmVwcmVzZW50YXRpb24+PC9BZGFwdGF0aW9uU2V0PjwvUGVyaW9kPjwvTVBEPg
diff --git a/dom/media/test/dash/dash-manifest-sjs.mpd b/dom/media/test/dash/dash-manifest-sjs.mpd
new file mode 100644
index 000000000..c7ecba3c6
--- /dev/null
+++ b/dom/media/test/dash/dash-manifest-sjs.mpd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MPD
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:mpeg:DASH:schema:MPD:2011"
+ xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011"
+ type="static"
+ mediaPresentationDuration="PT3.958S"
+ minBufferTime="PT1S"
+ profiles="urn:webm:dash:profile:webm-on-demand:2012">
+ <BaseURL>./dash_detect_stream_switch.sjs?name=</BaseURL>
+ <Period id="0" start="PT0S" duration="PT3.958S" >
+ <AdaptationSet id="0" mimeType="video/webm" codecs="vp8" lang="eng" subsegmentAlignment="true" subsegmentStartsWithSAP="1" bitstreamSwitching="true">
+ <Representation id="0" bandwidth="54207" width="320" height="180">
+ <BaseURL>dash-webm-video-320x180.webm</BaseURL>
+ <SegmentBase indexRange="35090-35123">
+ <Initialization range="0-228" />
+ </SegmentBase>
+ </Representation>
+ <Representation id="1" bandwidth="78006" width="428" height="240">
+ <BaseURL>dash-webm-video-428x240.webm</BaseURL>
+ <SegmentBase indexRange="50173-50206">
+ <Initialization range="0-228" />
+ </SegmentBase>
+ </Representation>
+ </AdaptationSet>
+ <AdaptationSet id="1" mimeType="audio/webm" codecs="vorbis" lang="eng" audioSamplingRate="48000" subsegmentStartsWithSAP="1">
+ <Representation id="2" bandwidth="57264">
+ <BaseURL>dash-webm-audio-128k.webm</BaseURL>
+ <SegmentBase indexRange="41927-41946">
+ <Initialization range="0-4521" />
+ </SegmentBase>
+ </Representation>
+ </AdaptationSet>
+ </Period>
+</MPD>
diff --git a/dom/media/test/dash/dash-manifest.mpd b/dom/media/test/dash/dash-manifest.mpd
new file mode 100644
index 000000000..98c7a9048
--- /dev/null
+++ b/dom/media/test/dash/dash-manifest.mpd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<MPD
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:mpeg:DASH:schema:MPD:2011"
+ xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011"
+ type="static"
+ mediaPresentationDuration="PT3.958S"
+ minBufferTime="PT1S"
+ profiles="urn:webm:dash:profile:webm-on-demand:2012">
+ <BaseURL>./</BaseURL>
+ <Period id="0" start="PT0S" duration="PT3.958S" >
+ <AdaptationSet id="0" mimeType="video/webm" codecs="vp8" lang="eng" subsegmentAlignment="true" subsegmentStartsWithSAP="1" bitstreamSwitching="true">
+ <Representation id="0" bandwidth="54207" width="320" height="180">
+ <BaseURL>dash-webm-video-320x180.webm</BaseURL>
+ <SegmentBase indexRange="35090-35123">
+ <Initialization range="0-228" />
+ </SegmentBase>
+ </Representation>
+ <Representation id="1" bandwidth="78006" width="428" height="240">
+ <BaseURL>dash-webm-video-428x240.webm</BaseURL>
+ <SegmentBase indexRange="50173-50206">
+ <Initialization range="0-228" />
+ </SegmentBase>
+ </Representation>
+ </AdaptationSet>
+ <AdaptationSet id="1" mimeType="audio/webm" codecs="vorbis" lang="eng" audioSamplingRate="48000" subsegmentStartsWithSAP="1">
+ <Representation id="2" bandwidth="57264">
+ <BaseURL>dash-webm-audio-128k.webm</BaseURL>
+ <SegmentBase indexRange="41927-41946">
+ <Initialization range="0-4521" />
+ </SegmentBase>
+ </Representation>
+ </AdaptationSet>
+ </Period>
+</MPD>
diff --git a/dom/media/test/dash/dash-webm-audio-128k.webm b/dom/media/test/dash/dash-webm-audio-128k.webm
new file mode 100644
index 000000000..f56c04205
--- /dev/null
+++ b/dom/media/test/dash/dash-webm-audio-128k.webm
Binary files differ
diff --git a/dom/media/test/dash/dash-webm-video-320x180.webm b/dom/media/test/dash/dash-webm-video-320x180.webm
new file mode 100644
index 000000000..282e6a2cc
--- /dev/null
+++ b/dom/media/test/dash/dash-webm-video-320x180.webm
Binary files differ
diff --git a/dom/media/test/dash/dash-webm-video-428x240.webm b/dom/media/test/dash/dash-webm-video-428x240.webm
new file mode 100644
index 000000000..23f2c8961
--- /dev/null
+++ b/dom/media/test/dash/dash-webm-video-428x240.webm
Binary files differ
diff --git a/dom/media/test/dash/garbled.webm b/dom/media/test/dash/garbled.webm
new file mode 100644
index 000000000..ac8eadbdd
--- /dev/null
+++ b/dom/media/test/dash/garbled.webm
@@ -0,0 +1 @@
+PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxNUEQgbWVkaWFQcmVzZW50YXRpb25EdXJhdGlvbj0iUFQxOS41MVMiIG1pbkJ1ZmZlclRpbWU9IlBUMVMiIHByb2ZpbGVzPSJ1cm46d2VibTpkYXNoOnByb2ZpbGU6d2VibS1vbi1kZW1hbmQ6MjAxMiIgdHlwZT0ic3RhdGljIiB4bWxucz0idXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0idXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTEiPjxCYXNlVVJMPmh0dHA6Ly93d3cuZ29vZ2xlLmNvbTwvQmFzZVVSTD48UGVyaW9kIGR1cmF0aW9uPSJQVDE5LjUxUyIgaWQ9IjAiIHN0YXJ0PSJQVDBTIj48QWRhcHRhdGlvblNldCBhdWRpb1NhbXBsaW5nUmF0ZT0iNDgwMDAiIGNvZGVjcz0idm9yYmlzIiBpZD0iMSIgbGFuZz0iZW5nIiBtaW1lVHlwZT0iYXVkaW8vd2VibSIgc3Vic2VnbWVudFN0YXJ0c1dpdGhTQVA9IjEiPjxSZXByZXNlbnRhdGlvbiBiYW5kd2lkdGg9IjIwMTA5IiBpZD0iMiI+PEJhc2VVUkwvPjxTZWdtZW50QmFzZSBpbmRleFJhbmdlPSIzMTk3ODAtMzIwNjEyIj48SW5pdGlhbGl6YXRpb24gcmFuZ2U9IjAtMjA4NzAiLz48L1NlZ21lbnRCYXNlPjwvUmVwcmVzZW50YXRpb24+PC9BZGFwdGF0aW9uU2V0PjwvUGVyaW9kPjwvTVBEPg
diff --git a/dom/media/test/dash_detect_stream_switch.sjs b/dom/media/test/dash_detect_stream_switch.sjs
new file mode 100644
index 000000000..378db10ca
--- /dev/null
+++ b/dom/media/test/dash_detect_stream_switch.sjs
@@ -0,0 +1,114 @@
+/* -*- Mode: JavaScript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* dash_detect_stream_switch.sjs
+ *
+ * Parses requests for DASH manifests and ensures stream switching takes place
+ * by verifying the subsegments downloaded and the streams they belong to.
+ * If unexpected subsegments (byte ranges) are requested, the script will
+ * will respond with a 404.
+ */
+
+var DEBUG = false;
+
+function parseQuery(request, key) {
+ var params = request.queryString.split('&');
+ if (DEBUG) {
+ dump("DASH-SJS: request params = \"" + params + "\"\n");
+ }
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") === 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key === "")
+ return p;
+ }
+ return false;
+}
+
+function handleRequest(request, response)
+{
+ try {
+ var name = parseQuery(request, "name");
+ var range = request.hasHeader("Range") ? request.getHeader("Range")
+ : undefined;
+
+ // Should not get request for 1st subsegment from 2nd stream, nor 2nd
+ // subsegment from 1st stream.
+ if (name == "dash-webm-video-320x180.webm" && range == "bytes=25514-32767" ||
+ name == "dash-webm-video-428x240.webm" && range == "bytes=228-35852")
+ {
+ throw "Should not request " + name + " with byte-range " + range;
+ } else {
+ var rangeSplit = range.split("=");
+ if (rangeSplit.length != 2) {
+ throw "DASH-SJS: ERROR: invalid number of tokens (" + rangeSplit.length +
+ ") delimited by \'=\' in \'Range\' header.";
+ }
+ var offsets = rangeSplit[1].split("-");
+ if (offsets.length != 2) {
+ throw "DASH-SJS: ERROR: invalid number of tokens (" + offsets.length +
+ ") delimited by \'-\' in \'Range\' header.";
+ }
+ var startOffset = parseInt(offsets[0]);
+ var endOffset = parseInt(offsets[1]);
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+
+ var paths = "tests/dom/media/test/" + name;
+ var split = paths.split("/");
+ for (var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+
+ fis.init(file, -1, -1, false);
+ // Exception: start offset should be within file bounds.
+ if (startOffset > file.fileSize) {
+ throw "Starting offset [" + startOffset + "] is after end of file [" +
+ file.fileSize + "].";
+ }
+ // End offset may be too large in the MPD. Real world HTTP servers just
+ // return what data they can; do the same here - reduce the end offset.
+ if (endOffset >= file.fileSize) {
+ if (DEBUG) {
+ dump("DASH-SJS: reducing endOffset [" + endOffset + "] to fileSize [" +
+ (file.fileSize-1) + "]\n");
+ }
+ endOffset = file.fileSize-1;
+ }
+ fis.seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, startOffset);
+ bis.setInputStream(fis);
+
+ var byteLengthToRead = endOffset + 1 - startOffset;
+ var totalBytesExpected = byteLengthToRead + startOffset;
+ if (DEBUG) {
+ dump("DASH-SJS: byteLengthToRead = " + byteLengthToRead +
+ " byteLengthToRead+startOffset = " + totalBytesExpected +
+ " fileSize = " + file.fileSize + "\n");
+ }
+
+ var bytes = bis.readBytes(byteLengthToRead);
+ response.setStatusLine(request.httpVersion, 206, "Partial Content");
+ response.setHeader("Content-Length", ""+bytes.length, false);
+ response.setHeader("Content-Type", "application/dash+xml", false);
+ var contentRange = "bytes " + startOffset + "-" + endOffset + "/" +
+ file.fileSize;
+ response.setHeader("Content-Range", contentRange, false);
+ response.write(bytes, bytes.length);
+ bis.close();
+ }
+ } catch (e) {
+ dump ("DASH-SJS-ERROR: " + e + "\n");
+ response.setStatusLine(request.httpVersion, 404, "Not found");
+ }
+}
diff --git a/dom/media/test/detodos-recorder-test.opus b/dom/media/test/detodos-recorder-test.opus
new file mode 100644
index 000000000..88b2eab0f
--- /dev/null
+++ b/dom/media/test/detodos-recorder-test.opus
Binary files differ
diff --git a/dom/media/test/detodos-recorder-test.opus^headers^ b/dom/media/test/detodos-recorder-test.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/detodos-recorder-test.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/detodos-short.opus b/dom/media/test/detodos-short.opus
new file mode 100644
index 000000000..8bda283fc
--- /dev/null
+++ b/dom/media/test/detodos-short.opus
Binary files differ
diff --git a/dom/media/test/detodos-short.opus^headers^ b/dom/media/test/detodos-short.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/detodos-short.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/detodos-short.webm b/dom/media/test/detodos-short.webm
new file mode 100644
index 000000000..45af2675a
--- /dev/null
+++ b/dom/media/test/detodos-short.webm
Binary files differ
diff --git a/dom/media/test/detodos-short.webm^headers^ b/dom/media/test/detodos-short.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/detodos-short.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/detodos.opus b/dom/media/test/detodos.opus
new file mode 100644
index 000000000..6c7ba88a6
--- /dev/null
+++ b/dom/media/test/detodos.opus
Binary files differ
diff --git a/dom/media/test/detodos.opus^headers^ b/dom/media/test/detodos.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/detodos.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/detodos.webm b/dom/media/test/detodos.webm
new file mode 100644
index 000000000..39cfa7f53
--- /dev/null
+++ b/dom/media/test/detodos.webm
Binary files differ
diff --git a/dom/media/test/detodos.webm^headers^ b/dom/media/test/detodos.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/detodos.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/dirac.ogg b/dom/media/test/dirac.ogg
new file mode 100644
index 000000000..2986cf1e8
--- /dev/null
+++ b/dom/media/test/dirac.ogg
Binary files differ
diff --git a/dom/media/test/dirac.ogg^headers^ b/dom/media/test/dirac.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/dirac.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/dynamic_redirect.sjs b/dom/media/test/dynamic_redirect.sjs
new file mode 100644
index 000000000..4e43dfae2
--- /dev/null
+++ b/dom/media/test/dynamic_redirect.sjs
@@ -0,0 +1,67 @@
+function parseQuery(query, key) {
+ for (let p of query.split('&')) {
+ if (p == key) {
+ return true;
+ }
+ if (p.startsWith(key + "=")) {
+ return p.substring(key.length + 1);
+ }
+ }
+}
+
+// Return seek.ogv file content for the first request with a given key.
+// All subsequent requests return a redirect to a different-origin resource.
+function handleRequest(request, response)
+{
+ var query = request.queryString;
+ var key = parseQuery(query, "key");
+ var resource = parseQuery(query, "res");
+ var nested = parseQuery(query, "nested") || false;
+
+ dump("Received request for key = "+ key +"\n");
+ if (!nested) {
+ if (getState(key) == "redirect") {
+ var origin = request.host == "mochi.test" ? "example.org" : "mochi.test:8888";
+ response.setStatusLine(request.httpVersion, 303, "See Other");
+ let url = "http://" + origin +
+ "/tests/dom/media/test/dynamic_redirect.sjs?nested&" + query;
+ dump("Redirecting to "+ url + "\n");
+ response.setHeader("Location", url);
+ response.setHeader("Content-Type", "text/html");
+ return;
+ }
+ setState(key, "redirect");
+ }
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/test/" + resource;
+ var split = paths.split("/");
+ for (var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+
+ bis.setInputStream(fis);
+ var bytes = bis.readBytes(bis.available());
+ let [from, to] = request.getHeader("range").split("=")[1].split("-").map(s => parseInt(s));
+ to = to || Math.max(from, bytes.length - 1);
+ byterange = bytes.substring(from, to + 1);
+
+ let contentRange = "bytes "+ from +"-"+ to +"/"+ bytes.length;
+ let contentLength = (to - from + 1).toString();
+ dump("Response Content-Range = "+ contentRange +"\n");
+ dump("Response Content-Length = "+ contentLength +"\n");
+
+ response.setStatusLine(request.httpVersion, 206, "Partial Content");
+ response.setHeader("Content-Range", contentRange);
+ response.setHeader("Content-Length", contentLength, false);
+ response.setHeader("Content-Type", "video/ogg", false);
+ response.setHeader("Accept-Ranges", "bytes", false);
+ response.write(byterange, byterange.length);
+ bis.close();
+}
diff --git a/dom/media/test/dynamic_resource.sjs b/dom/media/test/dynamic_resource.sjs
new file mode 100644
index 000000000..12a43f92a
--- /dev/null
+++ b/dom/media/test/dynamic_resource.sjs
@@ -0,0 +1,48 @@
+function parseQuery(request, key) {
+ var params = request.queryString.split('&');
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") == 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key == "")
+ return p;
+ }
+ return false;
+}
+
+// Return resource1 file content for the first request with a given key.
+// All subsequent requests return resource2. Both must be video/ogg.
+function handleRequest(request, response)
+{
+ var key = parseQuery(request, "key");
+ var resource1 = parseQuery(request, "res1");
+ var resource2 = parseQuery(request, "res2");
+
+ var resource = getState(key) == "2" ? resource2 : resource1;
+ setState(key, "2");
+
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/test/" + resource;
+ var split = paths.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+ dump("file=" + file + "\n");
+ bis.setInputStream(fis);
+ var bytes = bis.readBytes(bis.available());
+ response.setStatusLine(request.httpVersion, 206, "Partial Content");
+ response.setHeader("Content-Range", "bytes 0-" + (bytes.length - 1) + "/" + bytes.length);
+ response.setHeader("Content-Length", ""+bytes.length, false);
+ response.setHeader("Content-Type", "video/ogg", false);
+ response.write(bytes, bytes.length);
+ bis.close();
+}
diff --git a/dom/media/test/eme.js b/dom/media/test/eme.js
new file mode 100644
index 000000000..81f679762
--- /dev/null
+++ b/dom/media/test/eme.js
@@ -0,0 +1,495 @@
+const CLEARKEY_KEYSYSTEM = "org.w3.clearkey";
+
+const gCencMediaKeySystemConfig = [{
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{ contentType: 'video/mp4' }],
+ audioCapabilities: [{ contentType: 'audio/mp4' }],
+}];
+
+function IsMacOSSnowLeopardOrEarlier() {
+ var re = /Mac OS X (\d+)\.(\d+)/;
+ var ver = navigator.userAgent.match(re);
+ if (!ver || ver.length != 3) {
+ return false;
+ }
+ var major = ver[1] | 0;
+ var minor = ver[2] | 0;
+ return major == 10 && minor <= 6;
+}
+
+function bail(message)
+{
+ return function(err) {
+ if (err) {
+ message += "; " + String(err)
+ }
+ ok(false, message);
+ if (err) {
+ info(String(err));
+ }
+ SimpleTest.finish();
+ }
+}
+
+function ArrayBufferToString(arr)
+{
+ var str = '';
+ var view = new Uint8Array(arr);
+ for (var i = 0; i < view.length; i++) {
+ str += String.fromCharCode(view[i]);
+ }
+ return str;
+}
+
+function StringToArrayBuffer(str)
+{
+ var arr = new ArrayBuffer(str.length);
+ var view = new Uint8Array(arr);
+ for (var i = 0; i < str.length; i++) {
+ view[i] = str.charCodeAt(i);
+ }
+ return arr;
+}
+
+function StringToHex(str){
+ var res = "";
+ for (var i = 0; i < str.length; ++i) {
+ res += ("0" + str.charCodeAt(i).toString(16)).slice(-2);
+ }
+ return res;
+}
+
+function Base64ToHex(str)
+{
+ var bin = window.atob(str.replace(/-/g, "+").replace(/_/g, "/"));
+ var res = "";
+ for (var i = 0; i < bin.length; i++) {
+ res += ("0" + bin.charCodeAt(i).toString(16)).substr(-2);
+ }
+ return res;
+}
+
+function HexToBase64(hex)
+{
+ var bin = "";
+ for (var i = 0; i < hex.length; i += 2) {
+ bin += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
+ }
+ return window.btoa(bin).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
+}
+
+function TimeRangesToString(trs)
+{
+ var l = trs.length;
+ if (l === 0) { return "-"; }
+ var s = "";
+ var i = 0;
+ for (;;) {
+ s += trs.start(i) + "-" + trs.end(i);
+ if (++i === l) { return s; }
+ s += ",";
+ }
+}
+
+function SourceBufferToString(sb)
+{
+ return ("SourceBuffer{"
+ + "AppendMode=" + (sb.AppendMode || "-")
+ + ", updating=" + (sb.updating ? "true" : "false")
+ + ", buffered=" + TimeRangesToString(sb.buffered)
+ + ", audioTracks=" + (sb.audioTracks ? sb.audioTracks.length : "-")
+ + ", videoTracks=" + (sb.videoTracks ? sb.videoTracks.length : "-")
+ + "}");
+}
+
+function SourceBufferListToString(sbl)
+{
+ return "SourceBufferList[" + sbl.map(SourceBufferToString).join(", ") + "]";
+}
+
+function UpdateSessionFunc(test, token, sessionType, resolve, reject) {
+ return function(ev) {
+ var msgStr = ArrayBufferToString(ev.message);
+ var msg = JSON.parse(msgStr);
+
+ Log(token, "got message from CDM: " + msgStr);
+ is(msg.type, sessionType, TimeStamp(token) + " key session type should match");
+ ok(msg.kids, TimeStamp(token) + " message event should contain key ID array");
+
+ var outKeys = [];
+
+ for (var i = 0; i < msg.kids.length; i++) {
+ var id64 = msg.kids[i];
+ var idHex = Base64ToHex(msg.kids[i]).toLowerCase();
+ var key = test.keys[idHex];
+
+ if (key) {
+ Log(token, "found key " + key + " for key id " + idHex);
+ outKeys.push({
+ "kty":"oct",
+ "kid":id64,
+ "k":HexToBase64(key)
+ });
+ } else {
+ bail(token + " couldn't find key for key id " + idHex);
+ }
+ }
+
+ var update = JSON.stringify({
+ "keys" : outKeys,
+ "type" : msg.type
+ });
+ Log(token, "sending update message to CDM: " + update);
+
+ ev.target.update(StringToArrayBuffer(update)).then(function() {
+ Log(token, "MediaKeySession update ok!");
+ resolve(ev.target);
+ }).catch(function(reason) {
+ bail(token + " MediaKeySession update failed")(reason);
+ reject();
+ });
+ }
+}
+
+function MaybeCrossOriginURI(test, uri)
+{
+ if (test.crossOrigin) {
+ return "http://test2.mochi.test:8888/tests/dom/media/test/allowed.sjs?" + uri;
+ } else {
+ return uri;
+ }
+}
+
+function AppendTrack(test, ms, track, token, loadParams)
+{
+ return new Promise(function(resolve, reject) {
+ var sb;
+ var curFragment = 0;
+ var resolved = false;
+ var fragments = track.fragments;
+ var fragmentFile;
+
+ if (loadParams && loadParams.onlyLoadFirstFragments) {
+ fragments = fragments.slice(0, loadParams.onlyLoadFirstFragments);
+ }
+
+ function addNextFragment() {
+ if (curFragment >= fragments.length) {
+ Log(token, track.name + ": end of track");
+ resolve();
+ resolved = true;
+ return;
+ }
+
+ fragmentFile = MaybeCrossOriginURI(test, fragments[curFragment++]);
+
+ var req = new XMLHttpRequest();
+ req.open("GET", fragmentFile);
+ req.responseType = "arraybuffer";
+
+ req.addEventListener("load", function() {
+ Log(token, track.name + ": fetch of " + fragmentFile + " complete, appending");
+ sb.appendBuffer(new Uint8Array(req.response));
+ });
+
+ req.addEventListener("error", function(){info(token + " error fetching " + fragmentFile);});
+ req.addEventListener("abort", function(){info(token + " aborted fetching " + fragmentFile);});
+
+ Log(token, track.name + ": addNextFragment() fetching next fragment " + fragmentFile);
+ req.send(null);
+ }
+
+ Log(token, track.name + ": addSourceBuffer(" + track.type + ")");
+ sb = ms.addSourceBuffer(track.type);
+ sb.addEventListener("updateend", function() {
+ if (ms.readyState == "ended") {
+ /* We can get another updateevent as a result of calling ms.endOfStream() if
+ the highest end time of our source buffers is different from that of the
+ media source duration. Due to bug 1065207 this can happen because of
+ inaccuracies in the frame duration calculations. Check if we are already
+ "ended" and ignore the update event */
+ Log(token, track.name + ": updateend when readyState already 'ended'");
+ if (!resolved) {
+ // Needed if decoder knows this was the last fragment and ended by itself.
+ Log(token, track.name + ": but promise not resolved yet -> end of track");
+ resolve();
+ resolved = true;
+ }
+ return;
+ }
+ Log(token, track.name + ": updateend for " + fragmentFile + ", " + SourceBufferToString(sb));
+ addNextFragment();
+ });
+
+ addNextFragment();
+ });
+}
+
+//Returns a promise that is resolved when the media element is ready to have
+//its play() function called; when it's loaded MSE fragments.
+function LoadTest(test, elem, token, loadParams)
+{
+ if (!test.tracks) {
+ ok(false, token + " test does not have a tracks list");
+ return Promise.reject();
+ }
+
+ var ms = new MediaSource();
+ elem.src = URL.createObjectURL(ms);
+
+ return new Promise(function (resolve, reject) {
+ var firstOpen = true;
+ ms.addEventListener("sourceopen", function () {
+ if (!firstOpen) {
+ Log(token, "sourceopen again?");
+ return;
+ }
+
+ firstOpen = false;
+ Log(token, "sourceopen");
+ return Promise.all(test.tracks.map(function(track) {
+ return AppendTrack(test, ms, track, token, loadParams);
+ })).then(function() {
+ if (loadParams && loadParams.noEndOfStream) {
+ Log(token, "Tracks loaded");
+ } else {
+ Log(token, "Tracks loaded, calling MediaSource.endOfStream()");
+ ms.endOfStream();
+ }
+ resolve();
+ }).catch(function() {
+ Log(token, "error while loading tracks");
+ });
+ })
+ });
+}
+
+// Same as LoadTest, but manage a token+"_load" start&finished.
+// Also finish main token if loading fails.
+function LoadTestWithManagedLoadToken(test, elem, manager, token, loadParams)
+{
+ manager.started(token + "_load");
+ return LoadTest(test, elem, token, loadParams)
+ .catch(function (reason) {
+ ok(false, TimeStamp(token) + " - Error during load: " + reason);
+ manager.finished(token + "_load");
+ manager.finished(token);
+ })
+ .then(function () {
+ manager.finished(token + "_load");
+ });
+}
+
+function SetupEME(test, token, params)
+{
+ var v = document.createElement("video");
+ v.crossOrigin = test.crossOrigin || false;
+ v.sessions = [];
+
+ v.closeSessions = function() {
+ return Promise.all(v.sessions.map(s => s.close().then(() => s.closed))).then(
+ () => {
+ v.setMediaKeys(null);
+ if (v.parentNode) {
+ v.parentNode.removeChild(v);
+ }
+ v.onerror = null;
+ v.src = null;
+ });
+ };
+
+ // Log events dispatched to make debugging easier...
+ [ "canplay", "canplaythrough", "ended", "error", "loadeddata",
+ "loadedmetadata", "loadstart", "pause", "play", "playing", "progress",
+ "stalled", "suspend", "waiting", "waitingforkey",
+ ].forEach(function (e) {
+ v.addEventListener(e, function(event) {
+ Log(token, "" + e);
+ }, false);
+ });
+
+ // Finish the test when error is encountered.
+ v.onerror = bail(token + " got error event");
+
+ var onSetKeysFail = (params && params.onSetKeysFail)
+ ? params.onSetKeysFail
+ : bail(token + " Failed to set MediaKeys on <video> element");
+
+ // null: No session management in progress, just go ahead and update the session.
+ // [...]: Session management in progress, add {initDataType, initData} to
+ // this queue to get it processed when possible.
+ var initDataQueue = [];
+ function pushInitData(ev)
+ {
+ if (initDataQueue === null) {
+ initDataQueue = [];
+ }
+ initDataQueue.push(ev);
+ if (params && params.onInitDataQueued) {
+ params.onInitDataQueued(ev, ev.initDataType, StringToHex(ArrayBufferToString(ev.initData)));
+ }
+ }
+
+ function processInitDataQueue()
+ {
+ if (initDataQueue === null) { return; }
+ // If we're processed all our init data null the queue to indicate encrypted event handled.
+ if (initDataQueue.length === 0) {
+ initDataQueue = null;
+ return;
+ }
+ var ev = initDataQueue.shift();
+
+ var sessionType = (params && params.sessionType) ? params.sessionType : "temporary";
+ Log(token, "createSession(" + sessionType + ") for (" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ")");
+ var session = v.mediaKeys.createSession(sessionType);
+ if (params && params.onsessioncreated) {
+ params.onsessioncreated(session);
+ }
+ v.sessions.push(session);
+
+ return new Promise(function (resolve, reject) {
+ session.addEventListener("message", UpdateSessionFunc(test, token, sessionType, resolve, reject));
+ Log(token, "session[" + session.sessionId + "].generateRequest(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ")");
+ session.generateRequest(ev.initDataType, ev.initData).catch(function(reason) {
+ // Reject the promise if generateRequest() failed. Otherwise it will
+ // be resolve in UpdateSessionFunc().
+ bail(token + ": session[" + session.sessionId + "].generateRequest(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ") failed")(reason);
+ reject();
+ });
+ })
+
+ .then(function(aSession) {
+ Log(token, "session[" + session.sessionId + "].generateRequest(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ") succeeded");
+ if (params && params.onsessionupdated) {
+ params.onsessionupdated(aSession);
+ }
+ processInitDataQueue();
+ });
+ }
+
+ function streamType(type) {
+ var x = test.tracks.find(o => o.name == type);
+ return x ? x.type : undefined;
+ }
+
+ // If sessions are to be delayed we won't peform any processing until the
+ // callback the assigned here is called by the test.
+ if (params && params.delaySessions) {
+ params.ProcessSessions = processInitDataQueue;
+ }
+
+ // Is this the first piece of init data we're processing?
+ var firstInitData = true;
+ v.addEventListener("encrypted", function(ev) {
+ if (firstInitData) {
+ Log(token, "got first encrypted(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + "), setup session");
+ firstInitData = false;
+ pushInitData(ev);
+
+ function chain(promise, onReject) {
+ return promise.then(function(value) {
+ return Promise.resolve(value);
+ }).catch(function(reason) {
+ onReject(reason);
+ return Promise.reject();
+ })
+ }
+
+ var options = { initDataTypes: [ev.initDataType] };
+ if (streamType("video")) {
+ options.videoCapabilities = [{contentType: streamType("video")}];
+ }
+ if (streamType("audio")) {
+ options.audioCapabilities = [{contentType: streamType("audio")}];
+ }
+
+ var p = navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, [options]);
+ var r = bail(token + " Failed to request key system access.");
+ chain(p, r)
+ .then(function(keySystemAccess) {
+ var p = keySystemAccess.createMediaKeys();
+ var r = bail(token + " Failed to create MediaKeys object");
+ return chain(p, r);
+ })
+
+ .then(function(mediaKeys) {
+ Log(token, "created MediaKeys object ok");
+ mediaKeys.sessions = [];
+ var p = v.setMediaKeys(mediaKeys);
+ return chain(p, onSetKeysFail);
+ })
+
+ .then(function() {
+ Log(token, "set MediaKeys on <video> element ok");
+ if (params && params.onMediaKeysSet) {
+ params.onMediaKeysSet();
+ }
+ if (!(params && params.delaySessions)) {
+ processInitDataQueue();
+ }
+ })
+ } else {
+ if (params && params.delaySessions) {
+ Log(token, "got encrypted(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ") event, queue it in because we're delaying sessions");
+ pushInitData(ev);
+ } else if (initDataQueue !== null) {
+ Log(token, "got encrypted(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ") event, queue it for later session update");
+ pushInitData(ev);
+ } else {
+ Log(token, "got encrypted(" + ev.initDataType + ", " + StringToHex(ArrayBufferToString(ev.initData)) + ") event, update session now");
+ pushInitData(ev);
+ processInitDataQueue();
+ }
+ }
+ });
+ return v;
+}
+
+function SetupEMEPref(callback) {
+ var prefs = [
+ [ "media.mediasource.enabled", true ],
+ [ "media.eme.apiVisible", true ],
+ [ "media.mediasource.webm.enabled", true ],
+ ];
+
+ if (SpecialPowers.Services.appinfo.name == "B2G" ||
+ !manifestVideo().canPlayType("video/mp4")) {
+ // XXX remove once we have mp4 PlatformDecoderModules on all platforms.
+ prefs.push([ "media.use-blank-decoder", true ]);
+ }
+
+ SpecialPowers.pushPrefEnv({ "set" : prefs }, callback);
+}
+
+function fetchWithXHR(uri, onLoadFunction) {
+ var p = new Promise(function(resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", uri, true);
+ xhr.responseType = "arraybuffer";
+ xhr.addEventListener("load", function () {
+ is(xhr.status, 200, "fetchWithXHR load uri='" + uri + "' status=" + xhr.status);
+ resolve(xhr.response);
+ });
+ xhr.send();
+ });
+
+ if (onLoadFunction) {
+ p.then(onLoadFunction);
+ }
+
+ return p;
+};
+
+function once(target, name, cb) {
+ var p = new Promise(function(resolve, reject) {
+ target.addEventListener(name, function onceEvent(arg) {
+ target.removeEventListener(name, onceEvent);
+ resolve(arg);
+ });
+ });
+ if (cb) {
+ p.then(cb);
+ }
+ return p;
+}
diff --git a/dom/media/test/external/MANIFEST.in b/dom/media/test/external/MANIFEST.in
new file mode 100644
index 000000000..fe0b96e77
--- /dev/null
+++ b/dom/media/test/external/MANIFEST.in
@@ -0,0 +1,4 @@
+exclude MANIFEST.in
+include requirements.txt
+recursive-include external_media_harness *
+recursive-include external_media_tests *
diff --git a/dom/media/test/external/README.md b/dom/media/test/external/README.md
new file mode 100644
index 000000000..e806f03bc
--- /dev/null
+++ b/dom/media/test/external/README.md
@@ -0,0 +1,5 @@
+external-media-tests
+===================
+
+Documentation for this library has moved to https://developer.mozilla.org/en-US/docs/Mozilla/QA/external-media-tests.
+
diff --git a/dom/media/test/external/docs/Makefile b/dom/media/test/external/docs/Makefile
new file mode 100644
index 000000000..78c1b7379
--- /dev/null
+++ b/dom/media/test/external/docs/Makefile
@@ -0,0 +1,216 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = _build
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " applehelp to make an Apple Help Book"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " texinfo to make Texinfo files"
+ @echo " info to make Texinfo files and run them through makeinfo"
+ @echo " gettext to make PO message catalogs"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " xml to make Docutils-native XML files"
+ @echo " pseudoxml to make pseudoxml-XML files for display purposes"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+ @echo " coverage to run coverage check of the documentation (if enabled)"
+
+.PHONY: clean
+clean:
+ rm -rf $(BUILDDIR)/*
+
+.PHONY: html
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+.PHONY: dirhtml
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+.PHONY: singlehtml
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+.PHONY: pickle
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+.PHONY: json
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+.PHONY: htmlhelp
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+.PHONY: qthelp
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ExternalMediaTests.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ExternalMediaTests.qhc"
+
+.PHONY: applehelp
+applehelp:
+ $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
+ @echo
+ @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
+ @echo "N.B. You won't be able to view it unless you put it in" \
+ "~/Library/Documentation/Help or install it in your application" \
+ "bundle."
+
+.PHONY: devhelp
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/ExternalMediaTests"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ExternalMediaTests"
+ @echo "# devhelp"
+
+.PHONY: epub
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+.PHONY: latex
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+.PHONY: latexpdf
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: latexpdfja
+latexpdfja:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through platex and dvipdfmx..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: text
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+.PHONY: man
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+.PHONY: texinfo
+texinfo:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo
+ @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+ @echo "Run \`make' in that directory to run these through makeinfo" \
+ "(use \`make info' here to do that automatically)."
+
+.PHONY: info
+info:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo "Running Texinfo files through makeinfo..."
+ make -C $(BUILDDIR)/texinfo info
+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+.PHONY: gettext
+gettext:
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+ @echo
+ @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+.PHONY: changes
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+.PHONY: linkcheck
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+.PHONY: doctest
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
+
+.PHONY: coverage
+coverage:
+ $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
+ @echo "Testing of coverage in the sources finished, look at the " \
+ "results in $(BUILDDIR)/coverage/python.txt."
+
+.PHONY: xml
+xml:
+ $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
+ @echo
+ @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+
+.PHONY: pseudoxml
+pseudoxml:
+ $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
+ @echo
+ @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/dom/media/test/external/docs/conf.py b/dom/media/test/external/docs/conf.py
new file mode 100644
index 000000000..09b15a3fd
--- /dev/null
+++ b/dom/media/test/external/docs/conf.py
@@ -0,0 +1,297 @@
+# -*- coding: utf-8 -*-
+#
+# External Media Tests documentation build configuration file, created by
+# sphinx-quickstart on Tue Mar 15 15:58:18 2016.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'sphinx.ext.autodoc',
+ 'sphinx.ext.viewcode',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'External Media Tests'
+copyright = u'2015-2016, Mozilla, Inc.'
+author = u'Syd Polk and Maja Frydrychowicz'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = u'0.1'
+# The full version, including alpha/beta/rc tags.
+release = u'0.1'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
+
+if not on_rtd:
+ try:
+ import sphinx_rtd_theme
+ html_theme = 'sphinx_rtd_theme'
+ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
+ except ImportError:
+ pass
+
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+#html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+#html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'ExternalMediaTestsdoc'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+
+# Latex figure (float) alignment
+#'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (master_doc, 'ExternalMediaTests.tex', u'External Media Tests Documentation',
+ u'Syd Polk and Maja Frydrychowicz', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (master_doc, 'externalmediatests', u'External Media Tests Documentation',
+ [author], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (master_doc, 'ExternalMediaTests', u'External Media Tests Documentation',
+ author, 'ExternalMediaTests', 'One line description of project.',
+ 'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
diff --git a/dom/media/test/external/docs/external_media_harness.rst b/dom/media/test/external/docs/external_media_harness.rst
new file mode 100644
index 000000000..b484ce68c
--- /dev/null
+++ b/dom/media/test/external/docs/external_media_harness.rst
@@ -0,0 +1,19 @@
+external_media_harness package
+==============================
+
+Test case classes for use in video tests
+
+external_media_harness.testcase module
+--------------------------------------
+
+.. autoclass:: external_media_harness.testcase.MediaTestCase
+ :members:
+ :show-inheritance:
+
+.. autoclass:: external_media_harness.testcase.NetworkBandwidthTestCase
+ :members:
+ :show-inheritance:
+
+.. autoclass:: external_media_harness.testcase.VideoPlaybackTestsMixin
+ :members:
+ :show-inheritance:
diff --git a/dom/media/test/external/docs/external_media_tests.media_tests.video_puppeteer.rst b/dom/media/test/external/docs/external_media_tests.media_tests.video_puppeteer.rst
new file mode 100644
index 000000000..92b8749c8
--- /dev/null
+++ b/dom/media/test/external/docs/external_media_tests.media_tests.video_puppeteer.rst
@@ -0,0 +1,27 @@
+VideoPuppeteer
+==============
+
+
+video_puppeteer.VideoPuppeteer
+------------------------------
+
+.. autoclass:: external_media_tests.media_utils.video_puppeteer.VideoPuppeteer
+ :members:
+ :show-inheritance:
+
+video_puppeteer.VideoException
+------------------------------
+
+.. autoexception:: external_media_tests.media_utils.video_puppeteer.VideoException
+
+video_puppeteer.playback_started
+--------------------------------
+
+.. autofunction:: external_media_tests.media_utils.video_puppeteer.playback_started
+
+video_puppeteer.playback_done
+-----------------------------
+
+.. autofunction:: external_media_tests.media_utils.video_puppeteer.playback_done
+
+
diff --git a/dom/media/test/external/docs/external_media_tests.media_tests.youtube_puppeteer.rst b/dom/media/test/external/docs/external_media_tests.media_tests.youtube_puppeteer.rst
new file mode 100644
index 000000000..613823e6e
--- /dev/null
+++ b/dom/media/test/external/docs/external_media_tests.media_tests.youtube_puppeteer.rst
@@ -0,0 +1,26 @@
+YoutubePuppeteer
+================
+
+youtube_puppeteer.YouTubePuppeteer
+----------------------------------
+
+.. autoclass:: external_media_tests.media_utils.youtube_puppeteer.YouTubePuppeteer
+ :members:
+ :show-inheritance:
+
+youtube_puppeteer.playback_started
+----------------------------------
+
+.. autofunction:: external_media_tests.media_utils.youtube_puppeteer.playback_started
+
+youtube_puppeteer.playback_done
+-------------------------------
+
+.. autofunction:: external_media_tests.media_utils.youtube_puppeteer.playback_done
+
+youtbue_puppeteer.wait_for_almost_done
+--------------------------------------
+
+.. autofunction:: external_media_tests.media_utils.youtube_puppeteer.wait_for_almost_done
+
+
diff --git a/dom/media/test/external/docs/external_media_tests.rst b/dom/media/test/external/docs/external_media_tests.rst
new file mode 100644
index 000000000..619fc5343
--- /dev/null
+++ b/dom/media/test/external/docs/external_media_tests.rst
@@ -0,0 +1,26 @@
+
+external_media_tests package
+============================
+
+This document highlights the utility classes for tests. In general, the indvidiual tests are not documented here.
+
+Test pacakges
+-------------
+
+.. toctree::
+
+ external_media_tests.media_tests.video_puppeteer
+ external_media_tests.media_tests.youtube_puppeteer
+
+
+external_media_tests.utils.verbose_until
+----------------------------------------
+
+.. autofunction:: external_media_tests.utils.verbose_until
+
+external_media_tests.utils.save_memory_report
+---------------------------------------------
+
+.. autofunction:: external_media_tests.utils.save_memory_report
+
+
diff --git a/dom/media/test/external/docs/index.rst b/dom/media/test/external/docs/index.rst
new file mode 100644
index 000000000..7891346c5
--- /dev/null
+++ b/dom/media/test/external/docs/index.rst
@@ -0,0 +1,33 @@
+.. py:currentmodule:: external_media_tests
+
+External Media Tests
+====================
+
+External Media Tests is a library built on top of `Firefox Puppeter`_ and the `Marionette python client`_. It is designed to test playback of video elements embedded in web pages, independent of vendor. Using this library, you can write tests which play, pause, and stop videos, as well as inspect properties such as currentTime().
+
+.. _Marionette python client: http://marionette-client.readthedocs.org/en/latest
+.. _Firefox Puppeter: http://firefox-puppeteer.readthedocs.org/en/latest/
+
+Installation
+------------
+
+External Media Tests lives in `External Media Tests Source`_. Documentation for installation and usage lives on `External Media Tests`_; this documentation is API documentation for the various pieces of the test library.
+
+.. _External Media Tests Source: https://hg.mozilla.org/dom/media/test/external
+.. _External Media Tests: https://developer.mozilla.org/en-US/docs/Mozilla/QA/external-media-tests
+
+Contents
+--------
+
+.. toctree::
+
+ external_media_harness
+ external_media_tests
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/dom/media/test/external/docs/make.bat b/dom/media/test/external/docs/make.bat
new file mode 100644
index 000000000..79bf88203
--- /dev/null
+++ b/dom/media/test/external/docs/make.bat
@@ -0,0 +1,263 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+ set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+ :help
+ echo.Please use `make ^<target^>` where ^<target^> is one of
+ echo. html to make standalone HTML files
+ echo. dirhtml to make HTML files named index.html in directories
+ echo. singlehtml to make a single large HTML file
+ echo. pickle to make pickle files
+ echo. json to make JSON files
+ echo. htmlhelp to make HTML files and a HTML help project
+ echo. qthelp to make HTML files and a qthelp project
+ echo. devhelp to make HTML files and a Devhelp project
+ echo. epub to make an epub
+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+ echo. text to make text files
+ echo. man to make manual pages
+ echo. texinfo to make Texinfo files
+ echo. gettext to make PO message catalogs
+ echo. changes to make an overview over all changed/added/deprecated items
+ echo. xml to make Docutils-native XML files
+ echo. pseudoxml to make pseudoxml-XML files for display purposes
+ echo. linkcheck to check all external links for integrity
+ echo. doctest to run all doctests embedded in the documentation if enabled
+ echo. coverage to run coverage check of the documentation if enabled
+ goto end
+)
+
+if "%1" == "clean" (
+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+ del /q /s %BUILDDIR%\*
+ goto end
+)
+
+
+REM Check if sphinx-build is available and fallback to Python version if any
+%SPHINXBUILD% 1>NUL 2>NUL
+if errorlevel 9009 goto sphinx_python
+goto sphinx_ok
+
+:sphinx_python
+
+set SPHINXBUILD=python -m sphinx.__init__
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+:sphinx_ok
+
+
+if "%1" == "html" (
+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+ goto end
+)
+
+if "%1" == "dirhtml" (
+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+ goto end
+)
+
+if "%1" == "singlehtml" (
+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+ goto end
+)
+
+if "%1" == "pickle" (
+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the pickle files.
+ goto end
+)
+
+if "%1" == "json" (
+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the JSON files.
+ goto end
+)
+
+if "%1" == "htmlhelp" (
+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+ goto end
+)
+
+if "%1" == "qthelp" (
+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\ExternalMediaTests.qhcp
+ echo.To view the help file:
+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\ExternalMediaTests.ghc
+ goto end
+)
+
+if "%1" == "devhelp" (
+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished.
+ goto end
+)
+
+if "%1" == "epub" (
+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
+ goto end
+)
+
+if "%1" == "latex" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdf" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf
+ cd %~dp0
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdfja" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf-ja
+ cd %~dp0
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "text" (
+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The text files are in %BUILDDIR%/text.
+ goto end
+)
+
+if "%1" == "man" (
+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
+ goto end
+)
+
+if "%1" == "texinfo" (
+ %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+ goto end
+)
+
+if "%1" == "gettext" (
+ %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+ goto end
+)
+
+if "%1" == "changes" (
+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.The overview file is in %BUILDDIR%/changes.
+ goto end
+)
+
+if "%1" == "linkcheck" (
+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+ goto end
+)
+
+if "%1" == "doctest" (
+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+ goto end
+)
+
+if "%1" == "coverage" (
+ %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of coverage in the sources finished, look at the ^
+results in %BUILDDIR%/coverage/python.txt.
+ goto end
+)
+
+if "%1" == "xml" (
+ %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The XML files are in %BUILDDIR%/xml.
+ goto end
+)
+
+if "%1" == "pseudoxml" (
+ %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
+ goto end
+)
+
+:end
diff --git a/dom/media/test/external/external_media_harness/__init__.py b/dom/media/test/external/external_media_harness/__init__.py
new file mode 100644
index 000000000..906473f0b
--- /dev/null
+++ b/dom/media/test/external/external_media_harness/__init__.py
@@ -0,0 +1,5 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from runtests import cli
diff --git a/dom/media/test/external/external_media_harness/runtests.py b/dom/media/test/external/external_media_harness/runtests.py
new file mode 100644
index 000000000..08d1a323b
--- /dev/null
+++ b/dom/media/test/external/external_media_harness/runtests.py
@@ -0,0 +1,103 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+import sys
+
+import mozlog
+
+from manifestparser import read_ini
+from marionette_harness import (
+ BaseMarionetteTestRunner,
+ BaseMarionetteArguments,
+ BrowserMobProxyArguments,
+)
+from marionette_harness.runtests import MarionetteHarness, cli as mn_cli
+
+import external_media_tests
+from testcase import MediaTestCase
+from external_media_tests.media_utils.video_puppeteer import debug_script
+
+
+class MediaTestArgumentsBase(object):
+ name = 'Firefox Media Tests'
+ args = [
+ [['--urls'], {
+ 'help': 'ini file of urls to make available to all tests',
+ 'default': os.path.join(external_media_tests.urls, 'default.ini'),
+ }],
+ ]
+
+ def verify_usage_handler(self, args):
+ if args.urls:
+ if not os.path.isfile(args.urls):
+ raise ValueError('--urls must provide a path to an ini file')
+ else:
+ path = os.path.abspath(args.urls)
+ args.video_urls = MediaTestArgumentsBase.get_urls(path)
+ if not args.video_urls:
+ raise ValueError('list of video URLs cannot be empty')
+
+ def parse_args_handler(self, args):
+ if not args.tests:
+ args.tests = [external_media_tests.manifest]
+
+
+ @staticmethod
+ def get_urls(manifest):
+ with open(manifest, 'r'):
+ return [line[0] for line in read_ini(manifest)]
+
+
+class MediaTestArguments(BaseMarionetteArguments):
+ def __init__(self, **kwargs):
+ BaseMarionetteArguments.__init__(self, **kwargs)
+ self.register_argument_container(MediaTestArgumentsBase())
+ self.register_argument_container(BrowserMobProxyArguments())
+
+
+class MediaTestRunner(BaseMarionetteTestRunner):
+ def __init__(self, **kwargs):
+ BaseMarionetteTestRunner.__init__(self, **kwargs)
+ if not self.server_root:
+ self.server_root = external_media_tests.resources
+ # pick up prefs from marionette_driver.geckoinstance.DesktopInstance
+ self.app = 'fxdesktop'
+ self.test_handlers = [MediaTestCase]
+
+ # Used in HTML report (--log-html)
+ def gather_media_debug(test, status):
+ rv = {}
+ marionette = test._marionette_weakref()
+
+ if marionette.session is not None:
+ try:
+ with marionette.using_context(marionette.CONTEXT_CHROME):
+ debug_lines = marionette.execute_script(debug_script)
+ if debug_lines:
+ name = 'mozMediaSourceObject.mozDebugReaderData'
+ rv[name] = '\n'.join(debug_lines)
+ else:
+ logger = mozlog.get_default_logger()
+ logger.info('No data available about '
+ 'mozMediaSourceObject')
+ except:
+ logger = mozlog.get_default_logger()
+ logger.warning('Failed to gather test failure media debug',
+ exc_info=True)
+ return rv
+
+ self.result_callbacks.append(gather_media_debug)
+
+
+class FirefoxMediaHarness(MarionetteHarness):
+ def parse_args(self, *args, **kwargs):
+ return MarionetteHarness.parse_args(self, {'mach': sys.stdout})
+
+
+def cli():
+ mn_cli(MediaTestRunner, MediaTestArguments, FirefoxMediaHarness)
+
+if __name__ == '__main__':
+ cli()
diff --git a/dom/media/test/external/external_media_harness/testcase.py b/dom/media/test/external/external_media_harness/testcase.py
new file mode 100644
index 000000000..56350ccd9
--- /dev/null
+++ b/dom/media/test/external/external_media_harness/testcase.py
@@ -0,0 +1,362 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import re
+import os
+
+from marionette_driver import Wait
+from marionette_driver.errors import TimeoutException
+from marionette_harness import (
+ BrowserMobProxyTestCaseMixin,
+ MarionetteTestCase,
+ Marionette,
+ SkipTest,
+)
+
+from firefox_puppeteer import PuppeteerMixin
+from external_media_tests.utils import (timestamp_now, verbose_until)
+from external_media_tests.media_utils.video_puppeteer import (
+ VideoException,
+ VideoPuppeteer
+)
+
+
+class MediaTestCase(PuppeteerMixin, MarionetteTestCase):
+
+ """
+ Necessary methods for MSE playback
+
+ :param video_urls: Urls you are going to play as part of the tests.
+ """
+
+ def __init__(self, *args, **kwargs):
+ self.video_urls = kwargs.pop('video_urls', False)
+ super(MediaTestCase, self).__init__(*args, **kwargs)
+
+ def save_screenshot(self):
+ """
+ Make a screenshot of the window that is currently playing the video
+ element.
+ """
+ screenshot_dir = os.path.join(self.marionette.instance.workspace or '',
+ 'screenshots')
+ filename = ''.join([self.id().replace(' ', '-'),
+ '_',
+ str(timestamp_now()),
+ '.png'])
+ path = os.path.join(screenshot_dir, filename)
+ if not os.path.exists(screenshot_dir):
+ os.makedirs(screenshot_dir)
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ img_data = self.marionette.screenshot()
+ with open(path, 'wb') as f:
+ f.write(img_data.decode('base64'))
+ self.marionette.log('Screenshot saved in {}'
+ .format(os.path.abspath(path)))
+
+ def log_video_debug_lines(self, video):
+ """
+ Log the debugging information that Firefox provides for video elements.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ debug_lines = video.get_debug_lines()
+ if debug_lines:
+ self.marionette.log('\n'.join(debug_lines))
+
+ def run_playback(self, video):
+ """
+ Play the video all of the way through, or for the requested duration,
+ whichever comes first. Raises if the video stalls for too long.
+
+ :param video: VideoPuppeteer instance to play.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ self.logger.info(video.test_url)
+ try:
+ verbose_until(Wait(video, interval=video.interval,
+ timeout=video.expected_duration * 1.3 +
+ video.stall_wait_time),
+ video, VideoPuppeteer.playback_done)
+ except VideoException as e:
+ raise self.failureException(e)
+
+ def check_playback_starts(self, video):
+ """
+ Check to see if a given video will start. Raises if the video does not
+ start.
+
+ :param video: VideoPuppeteer instance to play.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ self.logger.info(video.test_url)
+ try:
+ verbose_until(Wait(video, timeout=video.timeout),
+ video, VideoPuppeteer.playback_started)
+ except TimeoutException as e:
+ raise self.failureException(e)
+
+ def skipTest(self, reason):
+ """
+ Skip this test.
+
+ Skip with marionette.marionette_test import SkipTest so that it
+ gets recognized a skip in marionette.marionette_test.CommonTestCase.run
+ """
+ raise SkipTest(reason)
+
+
+class NetworkBandwidthTestCase(MediaTestCase):
+ """
+ Test MSE playback while network bandwidth is limited. Uses browsermobproxy
+ (https://bmp.lightbody.net/). Please see
+ https://developer.mozilla.org/en-US/docs/Mozilla/QA/external-media-tests
+ for more information on setting up browsermob_proxy.
+ """
+
+ def __init__(self, *args, **kwargs):
+ super(NetworkBandwidthTestCase, self).__init__(*args, **kwargs)
+ BrowserMobProxyTestCaseMixin.__init__(self, *args, **kwargs)
+ self.proxy = None
+
+ def setUp(self):
+ super(NetworkBandwidthTestCase, self).setUp()
+ BrowserMobProxyTestCaseMixin.setUp(self)
+ self.proxy = self.create_browsermob_proxy()
+
+ def tearDown(self):
+ super(NetworkBandwidthTestCase, self).tearDown()
+ BrowserMobProxyTestCaseMixin.tearDown(self)
+ self.proxy = None
+
+ def run_videos(self, timeout=60):
+ """
+ Run each of the videos in the video list. Raises if something goes
+ wrong in playback.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for url in self.video_urls:
+ video = VideoPuppeteer(self.marionette, url, stall_wait_time=60,
+ set_duration=60, timeout=timeout)
+ self.run_playback(video)
+
+
+class VideoPlaybackTestsMixin(object):
+
+ """
+ Test MSE playback in HTML5 video element.
+
+ These tests should pass on any site where a single video element plays
+ upon loading and is uninterrupted (by ads, for example).
+
+ This tests both starting videos and performing partial playback at one
+ minute each, and is the test that should be run frequently in automation.
+ """
+
+ def test_playback_starts(self):
+ """
+ Test to make sure that playback of the video element starts for each
+ video.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for url in self.video_urls:
+ try:
+ video = VideoPuppeteer(self.marionette, url, timeout=60)
+ # Second playback_started check in case video._start_time
+ # is not 0
+ self.check_playback_starts(video)
+ video.pause()
+ except TimeoutException as e:
+ raise self.failureException(e)
+
+ def test_video_playback_partial(self):
+ """
+ Test to make sure that playback of 60 seconds works for each video.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for url in self.video_urls:
+ video = VideoPuppeteer(self.marionette, url,
+ stall_wait_time=10,
+ set_duration=60)
+ self.run_playback(video)
+
+
+class NetworkBandwidthTestsMixin(object):
+
+ """
+ Test video urls with various bandwidth settings.
+ """
+
+ def test_playback_limiting_bandwidth_250(self):
+ self.proxy.limits({'downstream_kbps': 250})
+ self.run_videos(timeout=120)
+
+ def test_playback_limiting_bandwidth_500(self):
+ self.proxy.limits({'downstream_kbps': 500})
+ self.run_videos(timeout=120)
+
+ def test_playback_limiting_bandwidth_1000(self):
+ self.proxy.limits({'downstream_kbps': 1000})
+ self.run_videos(timeout=120)
+
+
+reset_adobe_gmp_script = """
+navigator.requestMediaKeySystemAccess('com.adobe.primetime',
+[{initDataTypes: ['cenc']}]).then(
+ function(access) {
+ marionetteScriptFinished('success');
+ },
+ function(ex) {
+ marionetteScriptFinished(ex);
+ }
+);
+"""
+
+
+reset_widevine_gmp_script = """
+navigator.requestMediaKeySystemAccess('com.widevine.alpha',
+[{initDataTypes: ['cenc']}]).then(
+ function(access) {
+ marionetteScriptFinished('success');
+ },
+ function(ex) {
+ marionetteScriptFinished(ex);
+ }
+);
+"""
+
+
+class EMESetupMixin(object):
+
+ """
+ An object that needs to use the Adobe or Widevine GMP system must inherit
+ from this class, and then call check_eme_system() to insure that everything
+ is setup correctly.
+ """
+
+ version_needs_reset = True
+
+ def check_eme_system(self):
+ """
+ Download the most current version of the Adobe and Widevine GMP
+ Plugins. Verify that all MSE and EME prefs are set correctly. Raises
+ if things are not OK.
+ """
+ self.set_eme_prefs()
+ self.reset_GMP_version()
+ assert(self.check_eme_prefs())
+
+ def set_eme_prefs(self):
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1187471#c28
+ # 2015-09-28 cpearce says this is no longer necessary, but in case
+ # we are working with older firefoxes...
+ self.marionette.set_pref('media.gmp.trial-create.enabled', False)
+
+ def reset_GMP_version(self):
+ if EMESetupMixin.version_needs_reset:
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ if self.marionette.get_pref('media.gmp-eme-adobe.version'):
+ self.marionette.reset_pref('media.gmp-eme-adobe.version')
+ if self.marionette.get_pref('media.gmp-widevinecdm.version'):
+ self.marionette.reset_pref('media.gmp-widevinecdm.version')
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ adobe_result = self.marionette.execute_async_script(
+ reset_adobe_gmp_script,
+ script_timeout=60000)
+ widevine_result = self.marionette.execute_async_script(
+ reset_widevine_gmp_script,
+ script_timeout=60000)
+ if not adobe_result == 'success':
+ raise VideoException(
+ 'ERROR: Resetting Adobe GMP failed {}'
+ .format(adobe_result))
+ if not widevine_result == 'success':
+ raise VideoException(
+ 'ERROR: Resetting Widevine GMP failed {}'
+ .format(widevine_result))
+
+ EMESetupMixin.version_needs_reset = False
+
+ def check_and_log_boolean_pref(self, pref_name, expected_value):
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ pref_value = self.marionette.get_pref(pref_name)
+
+ if pref_value is None:
+ self.logger.info('Pref {} has no value.'.format(pref_name))
+ return False
+ else:
+ self.logger.info('Pref {} = {}'.format(pref_name, pref_value))
+ if pref_value != expected_value:
+ self.logger.info('Pref {} has unexpected value.'
+ .format(pref_name))
+ return False
+
+ return True
+
+ def check_and_log_integer_pref(self, pref_name, minimum_value=0):
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ pref_value = self.marionette.get_pref(pref_name)
+
+ if pref_value is None:
+ self.logger.info('Pref {} has no value.'.format(pref_name))
+ return False
+ else:
+ self.logger.info('Pref {} = {}'.format(pref_name, pref_value))
+
+ match = re.search('^\d+$', pref_value)
+ if not match:
+ self.logger.info('Pref {} is not an integer'
+ .format(pref_name))
+ return False
+
+ return pref_value >= minimum_value
+
+ def chceck_and_log_version_string_pref(self, pref_name, minimum_value='0'):
+ """
+ Compare a pref made up of integers separated by stops .s, with a
+ version string of the same format. The number of integers in each
+ string does not need to match. The comparison is done by converting
+ each to an integer array and comparing those. Both version strings
+ must be made up of only integers, or this method will raise an
+ unhandled exception of type ValueError when the conversion to int
+ fails.
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ pref_value = self.marionette.get_pref(pref_name)
+
+ if pref_value is None:
+ self.logger.info('Pref {} has no value.'.format(pref_name))
+ return False
+ else:
+ self.logger.info('Pref {} = {}'.format(pref_name, pref_value))
+
+ match = re.search('^\d(.\d+)*$', pref_value)
+ if not match:
+ self.logger.info('Pref {} is not a version string'
+ .format(pref_name))
+ return False
+
+ pref_ints = [int(n) for n in pref_value.split('.')]
+ minumum_ints = [int(n) for n in minimum_value.split('.')]
+
+ return pref_ints >= minumum_ints
+
+ def check_eme_prefs(self):
+ with self.marionette.using_context(Marionette.CONTEXT_CHROME):
+ return all([
+ self.check_and_log_boolean_pref(
+ 'media.mediasource.enabled', True),
+ self.check_and_log_boolean_pref(
+ 'media.eme.enabled', True),
+ self.check_and_log_boolean_pref(
+ 'media.mediasource.mp4.enabled', True),
+ self.check_and_log_boolean_pref(
+ 'media.gmp-eme-adobe.enabled', True),
+ self.check_and_log_integer_pref(
+ 'media.gmp-eme-adobe.version', 1),
+ self.check_and_log_boolean_pref(
+ 'media.gmp-widevinecdm.enabled', True),
+ self.chceck_and_log_version_string_pref(
+ 'media.gmp-widevinecdm.version', '1.0.0.0')
+ ])
diff --git a/dom/media/test/external/external_media_tests/__init__.py b/dom/media/test/external/external_media_tests/__init__.py
new file mode 100644
index 000000000..bf7ceec47
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/__init__.py
@@ -0,0 +1,10 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+
+root = os.path.abspath(os.path.dirname(__file__))
+manifest = os.path.join(root, 'manifest.ini')
+resources = os.path.join(root, 'resources')
+urls = os.path.join(root, 'urls')
diff --git a/dom/media/test/external/external_media_tests/manifest.ini b/dom/media/test/external/external_media_tests/manifest.ini
new file mode 100644
index 000000000..e370fd679
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/manifest.ini
@@ -0,0 +1 @@
+[include:playback/manifest.ini]
diff --git a/dom/media/test/external/external_media_tests/media_utils/__init__.py b/dom/media/test/external/external_media_tests/media_utils/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/media_utils/__init__.py
diff --git a/dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py b/dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
new file mode 100644
index 000000000..b904267dd
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
@@ -0,0 +1,448 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from collections import namedtuple
+from time import clock, sleep
+
+from marionette_driver import By, expected, Wait
+from marionette_harness import Marionette
+
+from external_media_tests.utils import verbose_until
+
+
+# Adapted from
+# https://github.com/gavinsharp/aboutmedia/blob/master/chrome/content/aboutmedia.xhtml
+debug_script = """
+var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIDOMWindow);
+var tabbrowser = mainWindow.gBrowser;
+for (var i=0; i < tabbrowser.browsers.length; ++i) {
+ var b = tabbrowser.getBrowserAtIndex(i);
+ var media = b.contentDocumentAsCPOW.getElementsByTagName('video');
+ for (var j=0; j < media.length; ++j) {
+ var ms = media[j].mozMediaSourceObject;
+ if (ms) {
+ debugLines = ms.mozDebugReaderData.split(\"\\n\");
+ return debugLines;
+ }
+ }
+}"""
+
+
+class VideoPuppeteer(object):
+ """
+ Wrapper to control and introspect HTML5 video elements.
+
+ A note about properties like current_time and duration:
+ These describe whatever stream is playing when the state is checked.
+ It is possible that many different streams are dynamically spliced
+ together, so the video stream that is currently playing might be the main
+ video or it might be something else, like an ad, for example.
+
+ :param marionette: The marionette instance this runs in.
+ :param url: the URL of the page containing the video element.
+ :param video_selector: the selector of the element that we want to watch.
+ This is set by default to 'video', which is what most sites use, but
+ others should work.
+ :param interval: The polling interval that is used to check progress.
+ :param set_duration: When set to >0, the polling and checking will stop at
+ the number of seconds specified. Otherwise, this will stop at the end
+ of the video.
+ :param stall_wait_time: The amount of time to wait to see if a stall has
+ cleared. If 0, do not check for stalls.
+ :param timeout: The amount of time to wait until the video starts.
+ """
+
+ _video_var_script = (
+ 'var video = arguments[0];'
+ 'var baseURI = arguments[0].baseURI;'
+ 'var currentTime = video.wrappedJSObject.currentTime;'
+ 'var duration = video.wrappedJSObject.duration;'
+ 'var buffered = video.wrappedJSObject.buffered;'
+ 'var bufferedRanges = [];'
+ 'for (var i = 0; i < buffered.length; i++) {'
+ 'bufferedRanges.push([buffered.start(i), buffered.end(i)]);'
+ '}'
+ 'var played = video.wrappedJSObject.played;'
+ 'var playedRanges = [];'
+ 'for (var i = 0; i < played.length; i++) {'
+ 'playedRanges.push([played.start(i), played.end(i)]);'
+ '}'
+ 'var totalFrames = '
+ 'video.getVideoPlaybackQuality()["totalVideoFrames"];'
+ 'var droppedFrames = '
+ 'video.getVideoPlaybackQuality()["droppedVideoFrames"];'
+ 'var corruptedFrames = '
+ 'video.getVideoPlaybackQuality()["corruptedVideoFrames"];'
+ )
+ """
+ A string containing JS that assigns video state to variables.
+ The purpose of this string script is to be appended to by this and
+ any inheriting classes to return these and other variables. In the case
+ of an inheriting class the script can be added to in order to fetch
+ further relevant variables -- keep in mind we only want one script
+ execution to prevent races, so it wouldn't do to have child classes
+ run this script then their own, as there is potential for lag in
+ between.
+
+ This script assigns a subset of the vars used later by the
+ `_video_state_named_tuple` function. Please see that function's
+ documentation for further information on these variables.
+ """
+
+ def __init__(self, marionette, url, video_selector='video', interval=1,
+ set_duration=0, stall_wait_time=0, timeout=60,
+ autostart=True):
+ self.marionette = marionette
+ self.test_url = url
+ self.interval = interval
+ self.stall_wait_time = stall_wait_time
+ self.timeout = timeout
+ self._set_duration = set_duration
+ self.video = None
+ self.expected_duration = 0
+ self._first_seen_time = 0
+ self._first_seen_wall_time = 0
+ self._fetch_state_script_string = None
+ self._last_seen_video_state = None
+ wait = Wait(self.marionette, timeout=self.timeout)
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ self.marionette.navigate(self.test_url)
+ self.marionette.execute_script("""
+ log('URL: {0}');""".format(self.test_url))
+ verbose_until(wait, self,
+ expected.element_present(By.TAG_NAME, 'video'))
+ videos_found = self.marionette.find_elements(By.CSS_SELECTOR,
+ video_selector)
+ if len(videos_found) > 1:
+ self.marionette.log(type(self).__name__ + ': multiple video '
+ 'elements found. '
+ 'Using first.')
+ if len(videos_found) <= 0:
+ self.marionette.log(type(self).__name__ + ': no video '
+ 'elements found.')
+ return
+ self.video = videos_found[0]
+ self.marionette.execute_script("log('video element obtained');")
+ if autostart:
+ self.start()
+
+ def start(self):
+ # To get an accurate expected_duration, playback must have started
+ self._refresh_state()
+ wait = Wait(self, timeout=self.timeout)
+ verbose_until(wait, self, VideoPuppeteer.playback_started,
+ "Check if video has played some range")
+ self._first_seen_time = self._last_seen_video_state.current_time
+ self._first_seen_wall_time = clock()
+ self._update_expected_duration()
+
+ def get_debug_lines(self):
+ """
+ Get Firefox internal debugging for the video element.
+
+ :return: A text string that has Firefox-internal debugging information.
+ """
+ with self.marionette.using_context('chrome'):
+ debug_lines = self.marionette.execute_script(debug_script)
+ return debug_lines
+
+ def play(self):
+ """
+ Tell the video element to Play.
+ """
+ self._execute_video_script('arguments[0].wrappedJSObject.play();')
+
+ def pause(self):
+ """
+ Tell the video element to Pause.
+ """
+ self._execute_video_script('arguments[0].wrappedJSObject.pause();')
+
+ def playback_started(self):
+ """
+ Determine if video has started
+
+ :param self: The VideoPuppeteer instance that we are interested in.
+
+ :return: True if is playing; False otherwise
+ """
+ self._refresh_state()
+ try:
+ played_ranges = self._last_seen_video_state.played
+ return (
+ played_ranges.length > 0 and
+ played_ranges.start(0) < played_ranges.end(0) and
+ played_ranges.end(0) > 0.0
+ )
+ except Exception as e:
+ print ('Got exception {}'.format(e))
+ return False
+
+ def playback_done(self):
+ """
+ If we are near the end and there is still a video element, then
+ we are essentially done. If this happens to be last time we are polled
+ before the video ends, we won't get another chance.
+
+ :param self: The VideoPuppeteer instance that we are interested in.
+
+ :return: True if we are close enough to the end of playback; False
+ otherwise.
+ """
+ self._refresh_state()
+
+ if self._last_seen_video_state.remaining_time < self.interval:
+ return True
+
+ # Check to see if the video has stalled. Accumulate the amount of lag
+ # since the video started, and if it is too high, then raise.
+ if (self.stall_wait_time and
+ self._last_seen_video_state.lag > self.stall_wait_time):
+ raise VideoException('Video {} stalled.\n{}'
+ .format(self._last_seen_video_state.video_uri,
+ self))
+
+ # We are cruising, so we are not done.
+ return False
+
+ def _update_expected_duration(self):
+ """
+ Update the duration of the target video at self.test_url (in seconds).
+ This is based on the last seen state, so the state should be,
+ refreshed at least once before this is called.
+
+ expected_duration represents the following: how long do we expect
+ playback to last before we consider the video to be 'complete'?
+ If we only want to play the first n seconds of the video,
+ expected_duration is set to n.
+ """
+
+ # self._last_seen_video_state.duration is the duration of whatever was
+ # playing when the state was checked. In this case, we assume the video
+ # element always shows the same stream throughout playback (i.e. the
+ # are no ads spliced into the main video, for example), so
+ # self._last_seen_video_state.duration is the duration of the main
+ # video.
+ video_duration = self._last_seen_video_state.duration
+ # Do our best to figure out where the video started playing
+ played_ranges = self._last_seen_video_state.played
+ if played_ranges.length > 0:
+ # If we have a range we should only have on continuous range
+ assert played_ranges.length == 1
+ start_position = played_ranges.start(0)
+ else:
+ # If we don't have a range we should have a current time
+ start_position = self._first_seen_time
+ # In case video starts at t > 0, adjust target time partial playback
+ remaining_video = video_duration - start_position
+ if 0 < self._set_duration < remaining_video:
+ self.expected_duration = self._set_duration
+ else:
+ self.expected_duration = remaining_video
+
+ @staticmethod
+ def _video_state_named_tuple():
+ """
+ Create a named tuple class that can be used to store state snapshots
+ of the wrapped element. The fields in the tuple should be used as
+ follows:
+
+ base_uri: the baseURI attribute of the wrapped element.
+ current_time: the current time of the wrapped element.
+ duration: the duration of the wrapped element.
+ buffered: the buffered ranges of the wrapped element. In its raw form
+ this is as a list where the first element is the length and the second
+ element is a list of 2 item lists, where each two items are a buffered
+ range. Once assigned to the tuple this data should be wrapped in the
+ TimeRanges class.
+ played: the played ranges of the wrapped element. In its raw form this
+ is as a list where the first element is the length and the second
+ element is a list of 2 item lists, where each two items are a played
+ range. Once assigned to the tuple this data should be wrapped in the
+ TimeRanges class.
+ lag: the difference in real world time and wrapped element time.
+ Calculated as real world time passed - element time passed.
+ totalFrames: number of total frames for the wrapped element
+ droppedFrames: number of dropped frames for the wrapped element.
+ corruptedFrames: number of corrupted frames for the wrapped.
+ video_src: the src attribute of the wrapped element.
+
+ :return: A 'video_state_info' named tuple class.
+ """
+ return namedtuple('video_state_info',
+ ['base_uri',
+ 'current_time',
+ 'duration',
+ 'remaining_time',
+ 'buffered',
+ 'played',
+ 'lag',
+ 'total_frames',
+ 'dropped_frames',
+ 'corrupted_frames',
+ 'video_src'])
+
+ def _create_video_state_info(self, **video_state_info_kwargs):
+ """
+ Create an instance of the video_state_info named tuple. This function
+ expects a dictionary populated with the following keys: current_time,
+ duration, raw_played_ranges, total_frames, dropped_frames, and
+ corrupted_frames.
+
+ Aside from raw_played_ranges, see `_video_state_named_tuple` for more
+ information on the above keys and values. For raw_played_ranges a
+ list is expected that can be consumed to make a TimeRanges object.
+
+ :return: A named tuple 'video_state_info' derived from arguments and
+ state information from the puppeteer.
+ """
+ raw_buffered_ranges = video_state_info_kwargs['raw_buffered_ranges']
+ raw_played_ranges = video_state_info_kwargs['raw_played_ranges']
+ # Remove raw ranges from dict as they are not used in the final named
+ # tuple and will provide an unexpected kwarg if kept.
+ del video_state_info_kwargs['raw_buffered_ranges']
+ del video_state_info_kwargs['raw_played_ranges']
+ # Create buffered ranges
+ video_state_info_kwargs['buffered'] = (
+ TimeRanges(raw_buffered_ranges[0], raw_buffered_ranges[1]))
+ # Create played ranges
+ video_state_info_kwargs['played'] = (
+ TimeRanges(raw_played_ranges[0], raw_played_ranges[1]))
+ # Calculate elapsed times
+ elapsed_current_time = (video_state_info_kwargs['current_time'] -
+ self._first_seen_time)
+ elapsed_wall_time = clock() - self._first_seen_wall_time
+ # Calculate lag
+ video_state_info_kwargs['lag'] = (
+ elapsed_wall_time - elapsed_current_time)
+ # Calculate remaining time
+ if video_state_info_kwargs['played'].length > 0:
+ played_duration = (video_state_info_kwargs['played'].end(0) -
+ video_state_info_kwargs['played'].start(0))
+ video_state_info_kwargs['remaining_time'] = (
+ self.expected_duration - played_duration)
+ else:
+ # No playback has happened yet, remaining time is duration
+ video_state_info_kwargs['remaining_time'] = self.expected_duration
+ # Fetch non time critical source information
+ video_state_info_kwargs['video_src'] = self.video.get_attribute('src')
+ # Create video state snapshot
+ state_info = self._video_state_named_tuple()
+ return state_info(**video_state_info_kwargs)
+
+ @property
+ def _fetch_state_script(self):
+ if not self._fetch_state_script_string:
+ self._fetch_state_script_string = (
+ self._video_var_script +
+ 'return ['
+ 'baseURI,'
+ 'currentTime,'
+ 'duration,'
+ '[buffered.length, bufferedRanges],'
+ '[played.length, playedRanges],'
+ 'totalFrames,'
+ 'droppedFrames,'
+ 'corruptedFrames];')
+ return self._fetch_state_script_string
+
+ def _refresh_state(self):
+ """
+ Refresh the snapshot of the underlying video state. We do this all
+ in one so that the state doesn't change in between queries.
+
+ We also store information that can be derived from the snapshotted
+ information, such as lag. This is stored in the last seen state to
+ stress that it's based on the snapshot.
+ """
+ keys = ['base_uri', 'current_time', 'duration', 'raw_buffered_ranges',
+ 'raw_played_ranges', 'total_frames', 'dropped_frames',
+ 'corrupted_frames']
+ values = self._execute_video_script(self._fetch_state_script)
+ self._last_seen_video_state = (
+ self._create_video_state_info(**dict(zip(keys, values))))
+
+ def _measure_progress(self):
+ self._refresh_state()
+ initial = self._last_seen_video_state.current_time
+ sleep(1)
+ self._refresh_state()
+ return self._last_seen_video_state.current_time - initial
+
+ def _execute_video_script(self, script):
+ """
+ Execute JS script in content context with access to video element.
+
+ :param script: script to be executed
+ :return: value returned by script
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ return self.marionette.execute_script(script,
+ script_args=[self.video])
+
+ def __str__(self):
+ messages = ['{} - test url: {}: '
+ .format(type(self).__name__, self.test_url)]
+ if not self.video:
+ messages += ['\tvideo: None']
+ return '\n'.join(messages)
+ if not self._last_seen_video_state:
+ messages += ['\tvideo: No last seen state']
+ return '\n'.join(messages)
+ # Have video and state info
+ messages += [
+ '{',
+ '\t(video)'
+ ]
+ messages += ['\tinterval: {}'.format(self.interval)]
+ messages += ['\texpected duration: {}'.format(self.expected_duration)]
+ messages += ['\tstall wait time: {}'.format(self.stall_wait_time)]
+ messages += ['\ttimeout: {}'.format(self.timeout)]
+ # Print each field on its own line
+ for field in self._last_seen_video_state._fields:
+ # For compatibility with different test environments we force ascii
+ field_ascii = (
+ unicode(getattr(self._last_seen_video_state, field))
+ .encode('ascii','replace'))
+ messages += [('\t{}: {}'.format(field, field_ascii))]
+ messages += '}'
+ return '\n'.join(messages)
+
+
+class VideoException(Exception):
+ """
+ Exception class to use for video-specific error processing.
+ """
+ pass
+
+
+class TimeRanges:
+ """
+ Class to represent the TimeRanges data returned by played(). Exposes a
+ similar interface to the JavaScript TimeRanges object.
+ """
+ def __init__(self, length, ranges):
+ # These should be the same,. Theoretically we don't need the length,
+ # but since this should be used to consume data coming back from
+ # JS exec, this is a valid sanity check.
+ assert length == len(ranges)
+ self.length = length
+ self.ranges = [(pair[0], pair[1]) for pair in ranges]
+
+ def __repr__(self):
+ return (
+ 'TimeRanges: length: {}, ranges: {}'
+ .format(self.length, self.ranges)
+ )
+
+ def start(self, index):
+ return self.ranges[index][0]
+
+ def end(self, index):
+ return self.ranges[index][1]
diff --git a/dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py b/dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
new file mode 100644
index 000000000..e42bbcc87
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
@@ -0,0 +1,496 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import re
+
+from collections import namedtuple
+from json import loads
+from time import sleep
+
+from marionette_driver import By, expected, Wait
+from marionette_driver.errors import TimeoutException, NoSuchElementException
+from marionette_harness import Marionette
+
+from video_puppeteer import VideoPuppeteer, VideoException
+from external_media_tests.utils import verbose_until
+
+
+class YouTubePuppeteer(VideoPuppeteer):
+ """
+ Wrapper around a YouTube .html5-video-player element.
+
+ Can be used with youtube videos or youtube videos at embedded URLS. E.g.
+ both https://www.youtube.com/watch?v=AbAACm1IQE0 and
+ https://www.youtube.com/embed/AbAACm1IQE0 should work.
+
+ Using an embedded video has the advantage of not auto-playing more videos
+ while a test is running.
+
+ Compared to video puppeteer, this class has the benefit of accessing the
+ youtube player object as well as the video element. The YT player will
+ report information for the underlying video even if an add is playing (as
+ opposed to the video element behaviour, which will report on whatever
+ is play at the time of query), and can also report if an ad is playing.
+
+ Partial reference: https://developers.google.com/youtube/iframe_api_reference.
+ This reference is useful for site-specific features such as interacting
+ with ads, or accessing YouTube's debug data.
+ """
+
+ _player_var_script = (
+ 'var player_duration = arguments[1].wrappedJSObject.getDuration();'
+ 'var player_current_time = '
+ 'arguments[1].wrappedJSObject.getCurrentTime();'
+ 'var player_playback_quality = '
+ 'arguments[1].wrappedJSObject.getPlaybackQuality();'
+ 'var player_movie_id = '
+ 'arguments[1].wrappedJSObject.getVideoData()["video_id"];'
+ 'var player_movie_title = '
+ 'arguments[1].wrappedJSObject.getVideoData()["title"];'
+ 'var player_url = '
+ 'arguments[1].wrappedJSObject.getVideoUrl();'
+ 'var player_state = '
+ 'arguments[1].wrappedJSObject.getPlayerState();'
+ 'var player_ad_state = arguments[1].wrappedJSObject.getAdState();'
+ 'var player_breaks_count = '
+ 'arguments[1].wrappedJSObject.getOption("ad", "breakscount");'
+ )
+ """
+ A string containing JS that will assign player state to
+ variables. This is similar to `_video_var_script` from
+ `VideoPuppeteer`. See `_video_var_script` for more information on the
+ motivation for this method.
+
+ This script assigns a subset of the vars used later by the
+ `_yt_state_named_tuple` function. Please see that functions
+ documentation for further information on these variables.
+ """
+
+ _yt_player_state = {
+ 'UNSTARTED': -1,
+ 'ENDED': 0,
+ 'PLAYING': 1,
+ 'PAUSED': 2,
+ 'BUFFERING': 3,
+ 'CUED': 5
+ }
+ _yt_player_state_name = {v: k for k, v in _yt_player_state.items()}
+ _time_pattern = re.compile('(?P<minute>\d+):(?P<second>\d+)')
+
+ def __init__(self, marionette, url, autostart=True, **kwargs):
+ self.player = None
+ self._last_seen_player_state = None
+ super(YouTubePuppeteer,
+ self).__init__(marionette, url,
+ video_selector='.html5-video-player video',
+ autostart=False,
+ **kwargs)
+ wait = Wait(self.marionette, timeout=30)
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ verbose_until(wait, self,
+ expected.element_present(By.CLASS_NAME,
+ 'html5-video-player'))
+ self.player = self.marionette.find_element(By.CLASS_NAME,
+ 'html5-video-player')
+ self.marionette.execute_script("log('.html5-video-player "
+ "element obtained');")
+ # When an ad is playing, self.player_duration indicates the duration
+ # of the spliced-in ad stream, not the duration of the main video, so
+ # we attempt to skip the ad first.
+ for attempt in range(5):
+ sleep(1)
+ self.process_ad()
+ if (self._last_seen_player_state.player_ad_inactive and
+ self._last_seen_video_state.duration and not
+ self._last_seen_player_state.player_buffering):
+ break
+ self._update_expected_duration()
+ if autostart:
+ self.start()
+
+ def player_play(self):
+ """
+ Play via YouTube API.
+ """
+ self._execute_yt_script('arguments[1].wrappedJSObject.playVideo();')
+
+ def player_pause(self):
+ """
+ Pause via YouTube API.
+ """
+ self._execute_yt_script('arguments[1].wrappedJSObject.pauseVideo();')
+
+ def _player_measure_progress(self):
+ """
+ Determine player progress. Refreshes state.
+
+ :return: Playback progress in seconds via YouTube API with snapshots.
+ """
+ self._refresh_state()
+ initial = self._last_seen_player_state.player_current_time
+ sleep(1)
+ self._refresh_state()
+ return self._last_seen_player_state.player_current_time - initial
+
+ def _get_player_debug_dict(self):
+ text = self._execute_yt_script('return arguments[1].'
+ 'wrappedJSObject.getDebugText();')
+ if text:
+ try:
+ return loads(text)
+ except ValueError:
+ self.marionette.log('Error loading json: DebugText',
+ level='DEBUG')
+
+ def _execute_yt_script(self, script):
+ """
+ Execute JS script in content context with access to video element and
+ YouTube .html5-video-player element.
+
+ :param script: script to be executed.
+
+ :return: value returned by script
+ """
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ return self.marionette.execute_script(script,
+ script_args=[self.video,
+ self.player])
+
+ def _check_if_ad_ended(self):
+ self._refresh_state()
+ return self._last_seen_player_state.player_ad_ended
+
+ def process_ad(self):
+ """
+ Wait for this ad to finish. Refreshes state.
+ """
+ self._refresh_state()
+ if self._last_seen_player_state.player_ad_inactive:
+ return
+ ad_timeout = (self._search_ad_duration() or 30) + 5
+ wait = Wait(self, timeout=ad_timeout, interval=1)
+ try:
+ self.marionette.log('process_ad: waiting {} s for ad'
+ .format(ad_timeout))
+ verbose_until(wait,
+ self,
+ YouTubePuppeteer._check_if_ad_ended,
+ "Check if ad ended")
+ except TimeoutException:
+ self.marionette.log('Waiting for ad to end timed out',
+ level='WARNING')
+
+ def _search_ad_duration(self):
+ """
+ Try and determine ad duration. Refreshes state.
+
+ :return: ad duration in seconds, if currently displayed in player
+ """
+ self._refresh_state()
+ if not (self._last_seen_player_state.player_ad_playing or
+ self._player_measure_progress() == 0):
+ return None
+ if (self._last_seen_player_state.player_ad_playing and
+ self._last_seen_video_state.duration):
+ return self._last_seen_video_state.duration
+ selector = '.html5-video-player .videoAdUiAttribution'
+ wait = Wait(self.marionette, timeout=5)
+ try:
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ wait.until(expected.element_present(By.CSS_SELECTOR,
+ selector))
+ countdown = self.marionette.find_element(By.CSS_SELECTOR,
+ selector)
+ ad_time = self._time_pattern.search(countdown.text)
+ if ad_time:
+ ad_minutes = int(ad_time.group('minute'))
+ ad_seconds = int(ad_time.group('second'))
+ return 60 * ad_minutes + ad_seconds
+ except (TimeoutException, NoSuchElementException):
+ self.marionette.log('Could not obtain '
+ 'element: {}'.format(selector),
+ level='WARNING')
+ return None
+
+ def _player_stalled(self):
+ """
+ Checks if the player has stalled. Refreshes state.
+
+ :return: True if playback is not making progress for 4-9 seconds. This
+ excludes ad breaks. Note that the player might just be busy with
+ buffering due to a slow network.
+ """
+
+ # `current_time` stands still while ad is playing
+ def condition():
+ # no ad is playing and current_time stands still
+ return (not self._last_seen_player_state.player_ad_playing and
+ self._measure_progress() < 0.1 and
+ self._player_measure_progress() < 0.1 and
+ (self._last_seen_player_state.player_playing or
+ self._last_seen_player_state.player_buffering))
+
+ if condition():
+ sleep(2)
+ self._refresh_state()
+ if self._last_seen_player_state.player_buffering:
+ sleep(5)
+ self._refresh_state()
+ return condition()
+ else:
+ return False
+
+ @staticmethod
+ def _yt_state_named_tuple():
+ """
+ Create a named tuple class that can be used to store state snapshots
+ of the wrapped youtube player. The fields in the tuple should be used
+ as follows:
+
+ player_duration: the duration as fetched from the wrapped player.
+ player_current_time: the current playback time as fetched from the
+ wrapped player.
+ player_remaining_time: the remaining time as calculated based on the
+ puppeteers expected time and the players current time.
+ player_playback_quality: the playback quality as fetched from the
+ wrapped player. See:
+ https://developers.google.com/youtube/js_api_reference#Playback_quality
+ player_movie_id: the movie id fetched from the wrapped player.
+ player_movie_title: the title fetched from the wrapped player.
+ player_url: the self reported url fetched from the wrapped player.
+ player_state: the current state of playback as fetch from the wrapped
+ player. See:
+ https://developers.google.com/youtube/js_api_reference#Playback_status
+ player_unstarted, player_ended, player_playing, player_paused,
+ player_buffering, and player_cued: these are all shortcuts to the
+ player state, only one should be true at any time.
+ player_ad_state: as player_state, but reports for the current ad.
+ player_ad_state, player_ad_inactive, player_ad_playing, and
+ player_ad_ended: these are all shortcuts to the ad state, only one
+ should be true at any time.
+ player_breaks_count: the number of ads as fetched from the wrapped
+ player. This includes both played and unplayed ads, and includes
+ streaming ads as well as pop up ads.
+
+ :return: A 'player_state_info' named tuple class.
+ """
+ return namedtuple('player_state_info',
+ ['player_duration',
+ 'player_current_time',
+ 'player_remaining_time',
+ 'player_playback_quality',
+ 'player_movie_id',
+ 'player_movie_title',
+ 'player_url',
+ 'player_state',
+ 'player_unstarted',
+ 'player_ended',
+ 'player_playing',
+ 'player_paused',
+ 'player_buffering',
+ 'player_cued',
+ 'player_ad_state',
+ 'player_ad_inactive',
+ 'player_ad_playing',
+ 'player_ad_ended',
+ 'player_breaks_count'
+ ])
+
+ def _create_player_state_info(self, **player_state_info_kwargs):
+ """
+ Create an instance of the state info named tuple. This function
+ expects a dictionary containing the following keys:
+ player_duration, player_current_time, player_playback_quality,
+ player_movie_id, player_movie_title, player_url, player_state,
+ player_ad_state, and player_breaks_count.
+
+ For more information on the above keys and their values see
+ `_yt_state_named_tuple`.
+
+ :return: A named tuple 'yt_state_info', derived from arguments and
+ state information from the puppeteer.
+ """
+ player_state_info_kwargs['player_remaining_time'] = (
+ self.expected_duration -
+ player_state_info_kwargs['player_current_time'])
+ # Calculate player state convenience info
+ player_state = player_state_info_kwargs['player_state']
+ player_state_info_kwargs['player_unstarted'] = (
+ player_state == self._yt_player_state['UNSTARTED'])
+ player_state_info_kwargs['player_ended'] = (
+ player_state == self._yt_player_state['ENDED'])
+ player_state_info_kwargs['player_playing'] = (
+ player_state == self._yt_player_state['PLAYING'])
+ player_state_info_kwargs['player_paused'] = (
+ player_state == self._yt_player_state['PAUSED'])
+ player_state_info_kwargs['player_buffering'] = (
+ player_state == self._yt_player_state['BUFFERING'])
+ player_state_info_kwargs['player_cued'] = (
+ player_state == self._yt_player_state['CUED'])
+ # Calculate ad state convenience info
+ player_ad_state = player_state_info_kwargs['player_ad_state']
+ player_state_info_kwargs['player_ad_inactive'] = (
+ player_ad_state == self._yt_player_state['UNSTARTED'])
+ player_state_info_kwargs['player_ad_playing'] = (
+ player_ad_state == self._yt_player_state['PLAYING'])
+ player_state_info_kwargs['player_ad_ended'] = (
+ player_ad_state == self._yt_player_state['ENDED'])
+ # Create player snapshot
+ state_info = self._yt_state_named_tuple()
+ return state_info(**player_state_info_kwargs)
+
+ @property
+ def _fetch_state_script(self):
+ if not self._fetch_state_script_string:
+ self._fetch_state_script_string = (
+ self._video_var_script +
+ self._player_var_script +
+ 'return ['
+ 'baseURI,'
+ 'currentTime,'
+ 'duration,'
+ '[buffered.length, bufferedRanges],'
+ '[played.length, playedRanges],'
+ 'totalFrames,'
+ 'droppedFrames,'
+ 'corruptedFrames,'
+ 'player_duration,'
+ 'player_current_time,'
+ 'player_playback_quality,'
+ 'player_movie_id,'
+ 'player_movie_title,'
+ 'player_url,'
+ 'player_state,'
+ 'player_ad_state,'
+ 'player_breaks_count];')
+ return self._fetch_state_script_string
+
+ def _refresh_state(self):
+ """
+ Refresh the snapshot of the underlying video and player state. We do
+ this allin one so that the state doesn't change in between queries.
+
+ We also store information that can be derived from the snapshotted
+ information, such as lag. This is stored in the last seen state to
+ stress that it's based on the snapshot.
+ """
+ values = self._execute_yt_script(self._fetch_state_script)
+ video_keys = ['base_uri', 'current_time', 'duration',
+ 'raw_buffered_ranges', 'raw_played_ranges',
+ 'total_frames', 'dropped_frames', 'corrupted_frames']
+ player_keys = ['player_duration', 'player_current_time',
+ 'player_playback_quality', 'player_movie_id',
+ 'player_movie_title', 'player_url', 'player_state',
+ 'player_ad_state', 'player_breaks_count']
+ # Get video state
+ self._last_seen_video_state = (
+ self._create_video_state_info(**dict(
+ zip(video_keys, values[:len(video_keys)]))))
+ # Get player state
+ self._last_seen_player_state = (
+ self._create_player_state_info(**dict(
+ zip(player_keys, values[-len(player_keys):]))))
+
+ def mse_enabled(self):
+ """
+ Check if the video source indicates mse usage for current video.
+ Refreshes state.
+
+ :return: True if MSE is being used, False if not.
+ """
+ self._refresh_state()
+ return self._last_seen_video_state.video_src.startswith('blob')
+
+ def playback_started(self):
+ """
+ Check whether playback has started. Refreshes state.
+
+ :return: True if play back has started, False if not.
+ """
+ self._refresh_state()
+ # usually, ad is playing during initial buffering
+ if (self._last_seen_player_state.player_playing or
+ self._last_seen_player_state.player_buffering):
+ return True
+ if (self._last_seen_video_state.current_time > 0 or
+ self._last_seen_player_state.player_current_time > 0):
+ return True
+ return False
+
+ def playback_done(self):
+ """
+ Check whether playback is done. Refreshes state.
+
+ :return: True if play back has ended, False if not.
+ """
+ # in case ad plays at end of video
+ self._refresh_state()
+ if self._last_seen_player_state.player_ad_playing:
+ return False
+ return (self._last_seen_player_state.player_ended or
+ self._last_seen_player_state.player_remaining_time < 1)
+
+ def wait_for_almost_done(self, final_piece=120):
+ """
+ Allow the given video to play until only `final_piece` seconds remain,
+ skipping ads mid-way as much as possible.
+ `final_piece` should be short enough to not be interrupted by an ad.
+
+ Depending on the length of the video, check the ad status every 10-30
+ seconds, skip an active ad if possible.
+
+ This call refreshes state.
+
+ :param final_piece: The length in seconds of the desired remaining time
+ to wait until.
+ """
+ self._refresh_state()
+ rest = 10
+ duration = remaining_time = self.expected_duration
+ if duration < final_piece:
+ # video is short so don't attempt to skip more ads
+ return duration
+ elif duration > 600:
+ # for videos that are longer than 10 minutes
+ # wait longer between checks
+ rest = duration / 50
+
+ while remaining_time > final_piece:
+ if self._player_stalled():
+ if self._last_seen_player_state.player_buffering:
+ # fall back on timeout in 'wait' call that comes after this
+ # in test function
+ self.marionette.log('Buffering and no playback progress.')
+ break
+ else:
+ message = '\n'.join(['Playback stalled', str(self)])
+ raise VideoException(message)
+ if self._last_seen_player_state.player_breaks_count > 0:
+ self.process_ad()
+ if remaining_time > 1.5 * rest:
+ sleep(rest)
+ else:
+ sleep(rest / 2)
+ # TODO during an ad, remaining_time will be based on ad's current_time
+ # rather than current_time of target video
+ remaining_time = self._last_seen_player_state.player_remaining_time
+ return remaining_time
+
+ def __str__(self):
+ messages = [super(YouTubePuppeteer, self).__str__()]
+ if not self.player:
+ messages += ['\t.html5-media-player: None']
+ return '\n'.join(messages)
+ if not self._last_seen_player_state:
+ messages += ['\t.html5-media-player: No last seen state']
+ return '\n'.join(messages)
+ messages += ['.html5-media-player: {']
+ for field in self._last_seen_player_state._fields:
+ # For compatibility with different test environments we force ascii
+ field_ascii = (
+ unicode(getattr(self._last_seen_player_state, field))
+ .encode('ascii', 'replace'))
+ messages += [('\t{}: {}'.format(field, field_ascii))]
+ messages += '}'
+ return '\n'.join(messages)
diff --git a/dom/media/test/external/external_media_tests/playback/eme.ini b/dom/media/test/external/external_media_tests/playback/eme.ini
new file mode 100644
index 000000000..6f08919bf
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/eme.ini
@@ -0,0 +1 @@
+[test_eme_playback.py]
diff --git a/dom/media/test/external/external_media_tests/playback/limiting_bandwidth.ini b/dom/media/test/external/external_media_tests/playback/limiting_bandwidth.ini
new file mode 100644
index 000000000..77c144d80
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/limiting_bandwidth.ini
@@ -0,0 +1,2 @@
+[test_playback_limiting_bandwidth.py]
+[test_ultra_low_bandwidth.py]
diff --git a/dom/media/test/external/external_media_tests/playback/manifest.ini b/dom/media/test/external/external_media_tests/playback/manifest.ini
new file mode 100644
index 000000000..f7271cbfb
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/manifest.ini
@@ -0,0 +1 @@
+[test_video_playback.py]
diff --git a/dom/media/test/external/external_media_tests/playback/netflix_limiting_bandwidth.ini b/dom/media/test/external/external_media_tests/playback/netflix_limiting_bandwidth.ini
new file mode 100644
index 000000000..dd0ce3601
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/netflix_limiting_bandwidth.ini
@@ -0,0 +1 @@
+[test_eme_playback_limiting_bandwidth.py]
diff --git a/dom/media/test/external/external_media_tests/playback/test_eme_playback.py b/dom/media/test/external/external_media_tests/playback/test_eme_playback.py
new file mode 100644
index 000000000..9c7eb6725
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_eme_playback.py
@@ -0,0 +1,18 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from external_media_harness.testcase import (
+ MediaTestCase,
+ VideoPlaybackTestsMixin,
+ EMESetupMixin
+)
+
+
+class TestEMEPlayback(MediaTestCase, VideoPlaybackTestsMixin, EMESetupMixin):
+
+ def setUp(self):
+ super(TestEMEPlayback, self).setUp()
+ self.check_eme_system()
+
+ # Tests are implemented in VideoPlaybackTestsMixin
diff --git a/dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py b/dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py
new file mode 100644
index 000000000..44cbb44f1
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py
@@ -0,0 +1,24 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette_harness import BrowserMobProxyTestCaseMixin
+
+from external_media_harness.testcase import (
+ EMESetupMixin,
+ NetworkBandwidthTestCase,
+ NetworkBandwidthTestsMixin,
+)
+
+
+class TestEMEPlaybackLimitingBandwidth(NetworkBandwidthTestCase,
+ BrowserMobProxyTestCaseMixin,
+ NetworkBandwidthTestsMixin,
+ EMESetupMixin):
+
+
+ def setUp(self):
+ super(TestEMEPlaybackLimitingBandwidth, self).setUp()
+ self.check_eme_system()
+
+ # Tests in NetworkBandwidthTestsMixin
diff --git a/dom/media/test/external/external_media_tests/playback/test_full_playback.py b/dom/media/test/external/external_media_tests/playback/test_full_playback.py
new file mode 100644
index 000000000..0db504682
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_full_playback.py
@@ -0,0 +1,25 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette_harness import Marionette
+
+from external_media_harness.testcase import MediaTestCase
+from external_media_tests.media_utils.video_puppeteer import VideoPuppeteer
+
+
+class TestFullPlayback(MediaTestCase):
+ """ Test MSE playback in HTML5 video element.
+
+ These tests should pass on any site where a single video element plays
+ upon loading and is uninterrupted (by ads, for example). This will play
+ the full videos, so it could take a while depending on the videos playing.
+ It should be run much less frequently in automated systems.
+ """
+
+ def test_video_playback_full(self):
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for url in self.video_urls:
+ video = VideoPuppeteer(self.marionette, url,
+ stall_wait_time=10)
+ self.run_playback(video)
diff --git a/dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py b/dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
new file mode 100644
index 000000000..81f1e8a59
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
@@ -0,0 +1,17 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette_harness import BrowserMobProxyTestCaseMixin
+
+from external_media_harness.testcase import (
+ NetworkBandwidthTestCase, NetworkBandwidthTestsMixin
+)
+
+
+class TestPlaybackLimitingBandwidth(NetworkBandwidthTestCase,
+ NetworkBandwidthTestsMixin,
+ BrowserMobProxyTestCaseMixin):
+
+ # Tests are in NetworkBandwidthTestsMixin
+ pass
diff --git a/dom/media/test/external/external_media_tests/playback/test_shaka_playback.py b/dom/media/test/external/external_media_tests/playback/test_shaka_playback.py
new file mode 100644
index 000000000..a2ecb4a2c
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_shaka_playback.py
@@ -0,0 +1,42 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette_harness import Marionette
+
+from external_media_harness.testcase import MediaTestCase
+from external_media_tests.media_utils.video_puppeteer import VideoPuppeteer
+
+
+class TestShakaPlayback(MediaTestCase):
+ """ Test Widevine playback in shaka-player
+
+ This test takes manifest URLs rather than URLs for pages with videos. These
+ manifests are loaded with shaka-player
+ """
+
+ def test_video_playback_partial(self):
+ """ Plays 60 seconds of the video from the manifest URLs given
+ """
+ shakaUrl = "http://shaka-player-demo.appspot.com"
+ self.marionette.set_pref('media.mediasource.webm.enabled', True)
+
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for manifestUrl in self.video_urls:
+ vp = VideoPuppeteer(self.marionette,
+ shakaUrl,
+ stall_wait_time=10,
+ set_duration=60,
+ video_selector="video#video",
+ autostart=False)
+
+
+ manifestInput = self.marionette.find_element("id",
+ "manifestUrlInput")
+ manifestInput.clear()
+ manifestInput.send_keys(manifestUrl)
+ loadButton = self.marionette.find_element("id", "loadButton")
+ loadButton.click()
+
+ vp.start()
+ self.run_playback(vp)
diff --git a/dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py b/dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
new file mode 100644
index 000000000..d49ff7d94
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
@@ -0,0 +1,15 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette_harness import BrowserMobProxyTestCaseMixin
+
+from external_media_harness.testcase import NetworkBandwidthTestCase
+
+
+class TestUltraLowBandwidth(NetworkBandwidthTestCase,
+ BrowserMobProxyTestCaseMixin):
+
+ def test_playback_limiting_bandwidth_160(self):
+ self.proxy.limits({'downstream_kbps': 160})
+ self.run_videos(timeout=120)
diff --git a/dom/media/test/external/external_media_tests/playback/test_video_playback.py b/dom/media/test/external/external_media_tests/playback/test_video_playback.py
new file mode 100644
index 000000000..b841ec08c
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/test_video_playback.py
@@ -0,0 +1,15 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from external_media_harness.testcase import (
+ MediaTestCase,
+ VideoPlaybackTestsMixin
+)
+
+
+class TestVideoPlayback(MediaTestCase, VideoPlaybackTestsMixin):
+
+ # Tests are actually implemented in VideoPlaybackTestsMixin.
+
+ pass
diff --git a/dom/media/test/external/external_media_tests/playback/youtube/manifest.ini b/dom/media/test/external/external_media_tests/playback/youtube/manifest.ini
new file mode 100644
index 000000000..d9ad7eb19
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/youtube/manifest.ini
@@ -0,0 +1 @@
+[test_basic_playback.py ]
diff --git a/dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py b/dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
new file mode 100644
index 000000000..edd0afc5e
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
@@ -0,0 +1,74 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette_driver import Wait
+from marionette_driver.errors import TimeoutException
+from marionette_harness import Marionette
+
+from external_media_tests.utils import verbose_until
+from external_media_harness.testcase import MediaTestCase
+from external_media_tests.media_utils.video_puppeteer import VideoException
+from external_media_tests.media_utils.youtube_puppeteer import YouTubePuppeteer
+
+
+class TestBasicYouTubePlayback(MediaTestCase):
+ def test_mse_is_enabled_by_default(self):
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ youtube = YouTubePuppeteer(self.marionette, self.video_urls[0],
+ timeout=60)
+ wait = Wait(youtube,
+ timeout=min(300, youtube.expected_duration * 1.3),
+ interval=1)
+ try:
+ verbose_until(wait, youtube,
+ YouTubePuppeteer.mse_enabled,
+ "Failed to find 'blob' in video src url.")
+ except TimeoutException as e:
+ raise self.failureException(e)
+
+ def test_video_playing_in_one_tab(self):
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for url in self.video_urls:
+ self.logger.info(url)
+ youtube = YouTubePuppeteer(self.marionette, url)
+ self.logger.info('Expected duration: {}'
+ .format(youtube.expected_duration))
+
+ final_piece = 60
+ try:
+ time_left = youtube.wait_for_almost_done(
+ final_piece=final_piece)
+ except VideoException as e:
+ raise self.failureException(e)
+ duration = abs(youtube.expected_duration) + 1
+ if duration > 1:
+ self.logger.info('Almost done: {} - {} seconds left.'
+ .format(url, time_left))
+ if time_left > final_piece:
+ self.marionette.log('time_left greater than '
+ 'final_piece - {}'
+ .format(time_left),
+ level='WARNING')
+ self.save_screenshot()
+ else:
+ self.marionette.log('Duration close to 0 - {}'
+ .format(youtube),
+ level='WARNING')
+ self.save_screenshot()
+ try:
+ verbose_until(Wait(youtube,
+ timeout=max(100, time_left) * 1.3,
+ interval=1),
+ youtube,
+ YouTubePuppeteer.playback_done)
+ except TimeoutException as e:
+ raise self.failureException(e)
+
+ def test_playback_starts(self):
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ for url in self.video_urls:
+ try:
+ YouTubePuppeteer(self.marionette, url, timeout=60)
+ except TimeoutException as e:
+ raise self.failureException(e)
diff --git a/dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py b/dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py
new file mode 100644
index 000000000..4c07ca008
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py
@@ -0,0 +1,46 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from external_media_harness.testcase import MediaTestCase
+from marionette_driver import Wait
+
+from external_media_tests.utils import verbose_until
+from external_media_tests.media_utils.youtube_puppeteer import YouTubePuppeteer
+
+
+class TestMediaSourcePrefs(MediaTestCase):
+ def setUp(self):
+ MediaTestCase.setUp(self)
+ self.test_urls = self.video_urls[:2]
+ self.max_timeout = 60
+
+ def tearDown(self):
+ MediaTestCase.tearDown(self)
+
+ def test_mse_prefs(self):
+ """ mediasource should only be used if MSE prefs are enabled."""
+ self.set_mse_enabled_prefs(False)
+ self.check_mse_src(False, self.test_urls[0])
+
+ self.set_mse_enabled_prefs(True)
+ self.check_mse_src(True, self.test_urls[0])
+
+ def set_mse_enabled_prefs(self, value):
+ with self.marionette.using_context('chrome'):
+ self.marionette.set_pref('media.mediasource.enabled', value)
+ self.marionette.set_pref('media.mediasource.mp4.enabled', value)
+ self.marionette.set_pref('media.mediasource.webm.enabled', value)
+
+ def check_mse_src(self, mse_expected, url):
+ with self.marionette.using_context('content'):
+ youtube = YouTubePuppeteer(self.marionette, url)
+ wait = Wait(youtube,
+ timeout=min(self.max_timeout,
+ youtube.expected_duration * 1.3),
+ interval=1)
+
+ def cond(y):
+ return y.mse_enabled == mse_expected
+
+ verbose_until(wait, youtube, cond)
diff --git a/dom/media/test/external/external_media_tests/resources/mozilla.html b/dom/media/test/external/external_media_tests/resources/mozilla.html
new file mode 100644
index 000000000..1cdf0fb4f
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/resources/mozilla.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+<head>
+ <title>Mozilla</title>
+ <link rel="shortcut icon" type="image/ico" href="../images/mozilla_favicon.ico" />
+</head>
+
+<body>
+ <a href="mozilla.html">
+ <img id="mozilla_logo" src="../images/mozilla_logo.jpg" />
+ </a>
+
+ <a href="#community">RARARARARARA</a> |
+ <a href="#project">Project</a> |
+ <a href="#organization">Organization</a>
+
+ <div id="content">
+ <h1 id="page-title">
+ <strong>RARARARARARA</strong> that the internet should be public,
+ open and accessible.
+ </h1>
+
+ <h2><a name="community">RARARARARARA</a></h2>
+ <p id="community">
+ We're a global community of thousands who believe in the power
+ of technology to enrich people's lives.
+ <a href="mozilla_community.html">More</a>
+ </p>
+
+ <h2><a name="project">Project</a></h2>
+ <p id="project">
+ We're an open source project whose code is used for some of the
+ Internet's most innovative applications.
+ <a href="mozilla_projects.html">More</a>
+ </p>
+
+ <h2><a name="organization">Organization</a></h2>
+ <p id="organization">
+ We're a public benefit organization dedicated to making the
+ Internet better for everyone.
+ <a href="mozilla_mission.html">More</a>
+ </p>
+ </div>
+</body>
+</html>
diff --git a/dom/media/test/external/external_media_tests/test_example.py b/dom/media/test/external/external_media_tests/test_example.py
new file mode 100644
index 000000000..99782014f
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/test_example.py
@@ -0,0 +1,21 @@
+from marionette_harness import Marionette
+
+from external_media_harness.testcase import MediaTestCase
+
+
+class TestSomethingElse(MediaTestCase):
+ def setUp(self):
+ MediaTestCase.setUp(self)
+ self.test_urls = [
+ 'mozilla.html',
+ ]
+ self.test_urls = [self.marionette.absolute_url(t)
+ for t in self.test_urls]
+
+ def tearDown(self):
+ MediaTestCase.tearDown(self)
+
+ def test_foo(self):
+ self.logger.info('foo!')
+ with self.marionette.using_context(Marionette.CONTEXT_CONTENT):
+ self.marionette.navigate(self.test_urls[0])
diff --git a/dom/media/test/external/external_media_tests/urls/default.ini b/dom/media/test/external/external_media_tests/urls/default.ini
new file mode 100644
index 000000000..b1e26abbd
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/default.ini
@@ -0,0 +1,9 @@
+# short videos; no ads; embedded; max 5 minutes
+# 0:12
+[https://youtube.com/embed/AbAACm1IQE0?autoplay=1]
+# 2:18
+[https://youtube.com/embed/yOQQCoxs8-k?autoplay=1]
+# 0:08
+[https://youtube.com/embed/1visYpIREUM?autoplay=1]
+# 2:09
+[https://youtube.com/embed/rjmuKV9BTkE?autoplay=1]
diff --git a/dom/media/test/external/external_media_tests/urls/netflix/default.ini b/dom/media/test/external/external_media_tests/urls/netflix/default.ini
new file mode 100644
index 000000000..ed14b69b8
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/netflix/default.ini
@@ -0,0 +1,8 @@
+# YouTube test
+#[https://www.youtube.com/watch?v=AbAACm1IQE0]
+# ClearKey - 11:07
+[http://www.netflix.com/watch/70136810]
+# NoDRM - 2:24:xx
+[http://www.netflix.com/watch/70304192]
+# DRM - 24:47
+[http://www.netflix.com/watch/80015538]
diff --git a/dom/media/test/external/external_media_tests/urls/shaka-player/default.ini b/dom/media/test/external/external_media_tests/urls/shaka-player/default.ini
new file mode 100644
index 000000000..8a42d7603
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/shaka-player/default.ini
@@ -0,0 +1,30 @@
+# The Shaka-player tests take manifest URLs rather than URLs for a page that
+# plays a video (since shaka-player is the page that plays the video)
+# This file contains the manifest URLs that shaka-player provides in it's
+# dropdown
+
+# "Angel One" (TNG clip) - multilingual, subtitles, VP8
+[http://shaka-player-demo.appspot.com/assets/angel_one.mpd]
+# "Car" (YT DASH test) - MP4
+[http://shaka-player-demo.appspot.com/assets/car-20120827-manifest.mpd]
+# "Car/CENC" (YT DASH EME test) - MP4, ClearKey
+[http://shaka-player-demo.appspot.com/assets/car_cenc-20120827-manifest.mpd]
+# "Feelings" (YT DASH test) - VP9
+[http://shaka-player-demo.appspot.com/assets/feelings_vp9-20130806-manifest.mpd]
+# "Feelings" (YT DASH test) - Audio only
+[http://shaka-player-demo.appspot.com/assets/feelings_audio_only-20130806-manifest.mpd]
+# "Car/SegmentTemplate" (Chromecast test) - MP4 (no SIDX, video only), Widevine
+[http://shaka-player-demo.appspot.com/assets/car_segmenttemplate.mpd]
+# "GPAC/SegmentList" (conformance test)
+[http://download.tsi.telecom-paristech.fr/gpac/DASH_CONFORMANCE/TelecomParisTech/mp4-main-multi/mp4-main-multi-mpd-AV-NBS.mpd]
+# "Oops" (modified YT DASH EME test) - MP4, multi-DRM
+[http://shaka-player-demo.appspot.com/assets/oops_cenc-20121114-signedlicenseurl-manifest.mpd]
+# "Oops" (modified YT DASH EME test) - MP4, Widevine, PSSH in MPD
+# This stream currently does not load
+#[http://shaka-player-demo.appspot.com/assets/oops_cenc_pssh.mpd]
+# "Sintel" (1080p high bitrate test) - MP4
+[http://storage.googleapis.com/widevine-demo-media/sintel-1080p/dash.mpd]
+# "Sintel" (4k) - MP4, VP8, VP9
+[http://storage.googleapis.com/widevine-demo-media/sintel-multicodec-4k/dash.mpd]
+# "Sintel" (4k) - MP4, Widevine
+[http://storage.googleapis.com/widevine-demo-media/sintel-4k-widevine/sintel.mpd]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/archive/crash_videos.ini b/dom/media/test/external/external_media_tests/urls/youtube/archive/crash_videos.ini
new file mode 100644
index 000000000..e7d420254
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/archive/crash_videos.ini
@@ -0,0 +1,25 @@
+[https://www.youtube.com/watch?v=2GfaRuIMdos]
+[https://www.youtube.com/watch?v=9vKvcCNt40g]
+[https://www.youtube.com/watch?v=SHLLHya2pNo]
+[https://www.youtube.com/watch?v=isMEMDE2enU]
+[https://www.youtube.com/watch?v=H81M_MebLsk]
+[https://www.youtube.com/watch?v=yopNkcDzQQw]
+[https://www.youtube.com/watch?v=r_bG5beSqw0]
+[https://www.youtube.com/watch?v=Ki9sSZKClO0]
+[https://www.youtube.com/watch?v=gNS04P8djk4]
+[https://www.youtube.com/watch?v=DwC_6fIBW0w]
+[https://www.youtube.com/watch?v=g1D3A14o0NA]
+[https://www.youtube.com/watch?v=cs-XZ_dN4Hc]
+[https://www.youtube.com/watch?v=ZEWZ3AAH98c]
+[https://www.youtube.com/watch?v=hwbVGE4GBJI]
+[https://www.youtube.com/watch?v=cvcMnbkasIs]
+[https://www.youtube.com/watch?v=cHaBuoHwQ0Y]
+[https://www.youtube.com/watch?v=VKIYoAG9MZ0]
+[https://www.youtube.com/watch?v=WWDb2_unEJc]
+[https://www.youtube.com/watch?v=ybw5zonQffE]
+[https://www.youtube.com/watch?v=hS6ps2Xph_o]
+[https://www.youtube.com/watch?v=Bjb3xhgIqv4]
+[https://www.youtube.com/watch?v=fOzvEhX4Kvk]
+[https://www.youtube.com/watch?v=_TNsUxp_BxM]
+[https://www.youtube.com/watch?v=QRdwCSHF3oo]
+[https://www.youtube.com/watch?v=VwaHFcKJSYA]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/archive/other_videos.ini b/dom/media/test/external/external_media_tests/urls/youtube/archive/other_videos.ini
new file mode 100644
index 000000000..732d2405c
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/archive/other_videos.ini
@@ -0,0 +1,19 @@
+# backlog of videos
+[http://youtu.be/2iVAvSnofy8]
+
+# 300s <= duration <= 1200s (5-20min)
+[http://youtu.be/9bZkp7q19f0]
+[http://youtu.be/KQ6zr6kCPj8]
+
+# duration > 1200s (>20min)
+[http://youtu.be/wZZ7oFKsKzY]
+[http://youtu.be/eHUrC_UiZwY]
+[http://youtu.be/FLX64H5FYa8]
+[http://youtu.be/Fu2DcHzokew]
+
+#no_ad_tests_youtube
+#[http://youtu.be/pWI8RB2dmfU]
+#[http://youtu.be/6GBtEmtVObw]
+
+#playlist_tests_youtube
+#[http://youtu.be/R6KJjPqlPz4?list=PL75_HhpYGJQ1Fzv9a46FlHfiy-fJusKBZ]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/archive/video_data.ini b/dom/media/test/external/external_media_tests/urls/youtube/archive/video_data.ini
new file mode 100644
index 000000000..ff8f58866
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/archive/video_data.ini
@@ -0,0 +1,21 @@
+# duration < 300s (5min)
+[http://youtu.be/065dlrJoHcw]
+[http://youtu.be/1visYpIREUM]
+[http://youtu.be/mDf7CR5QKcE]
+[http://youtu.be/Aebs62bX0dA]
+[http://youtu.be/6SFp1z7uA6g]
+[http://youtu.be/tDDVAErOI5U]
+
+# ad testing
+[https://www.youtube.com/watch?v=l5ODwR6FPRQ]
+[https://www.youtube.com/watch?v=7RMQksXpQSk]
+
+# duration > 5 min
+# video with ad in the middle
+[https://www.youtube.com/watch?v=cht9Xq9suGg]
+
+# long video (>30 min), no ads
+[https://www.youtube.com/watch?v=-qXxNPvqHtQ]
+
+# bug 1144172, duration ~ 1hr
+#[https://www.youtube.com/watch?v=AYYDshv8C4g]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/archive/youtube.ini b/dom/media/test/external/external_media_tests/urls/youtube/archive/youtube.ini
new file mode 100644
index 000000000..0676b9ef4
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/archive/youtube.ini
@@ -0,0 +1,38 @@
+# < 1 no ads
+[https://youtu.be/AbAACm1IQE0]
+[https://www.youtube.com/watch?v=KdHZwWQWNyM]
+[https://www.youtube.com/watch?v=-hVmkA_I9EE]
+[https://www.youtube.com/watch?v=1visYpIREUM]
+
+# 1 < t <= 5 no ads
+[https://www.youtube.com/watch?v=rpYRAs6ePY8]
+[https://www.youtube.com/watch?v=xcgUKzwg0Mo]
+[https://youtu.be/sEAT2EFIJow]
+[https://www.youtube.com/watch?v=SSgnbQ5UC48]
+[https://youtu.be/4oQu26IhiaA]
+[https://youtu.be/IbND63HOb0M]
+[https://youtu.be/-9sJp9wrdAk]
+[https://www.youtube.com/watch?v=yIQGH4aQWI0]
+
+# 1 < t <= 5
+[https://www.youtube.com/watch?v=-hVmkA_I9EE]
+[https://www.youtube.com/watch?v=l5ODwR6FPRQ]
+[https://www.youtube.com/watch?v=7RMQksXpQSk]
+[https://www.youtube.com/watch?v=TsXMe8H6iyc]
+[https://www.youtube.com/watch?v=tDDVAErOI5U]
+
+# 5 < t <= 10
+[https://youtu.be/Tl-hI2IsCo0] # no ad
+[https://www.youtube.com/watch?v=IX_d_vMKswE] #no ad
+[https://www.youtube.com/watch?v=YVQeTY-Ayko] #no ad
+[https://www.youtube.com/watch?v=rE3j_RHkqJc]
+[https://www.youtube.com/watch?v=l4bmZ1gRqCc]
+
+# 10 < t <= 30
+[https://www.youtube.com/watch?v=RvymAHt3nPc] # no ads
+[https://www.youtube.com/watch?v=8XQ1onjXJK0]
+[https://www.youtube.com/watch?v=6Lm9EHhbJAY]
+[https://www.youtube.com/watch?v=cht9Xq9suGg]
+
+# long video (>30 min), no ads
+[https://www.youtube.com/watch?v=-qXxNPvqHtQ]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/long1-720.ini b/dom/media/test/external/external_media_tests/urls/youtube/long1-720.ini
new file mode 100644
index 000000000..cabb823b1
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/long1-720.ini
@@ -0,0 +1,5 @@
+# a couple of very long videos, < 12 hours total
+# 6:00:00 - can't embed due to copyright
+[https://www.youtube.com/watch?v=5N8sUccRiTA]
+# 2:09:00
+[https://www.youtube.com/embed/b6q5N16dje4?autoplay=1]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/long2-crashes-720.ini b/dom/media/test/external/external_media_tests/urls/youtube/long2-crashes-720.ini
new file mode 100644
index 000000000..de449f882
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/long2-crashes-720.ini
@@ -0,0 +1,39 @@
+# It appears these are not currently used by tests. They are left here as they
+# reference failure scenarios. If tese are fixed that can be removed.
+
+# videos from crashes, < 12 hours
+
+# hang | NtUserMessageCall | SendMessageW
+# 1:10:00
+[https://www.youtube.com/watch?v=Ztie4DqeOak]
+
+# nsPluginInstanceOwner::GetDocument(nsIDocument**)
+# 22:40
+[https://www.youtube.com/watch?v=D4cLM_JRrAU]
+# 16:47
+[https://www.youtube.com/watch?v=3C2r05Lxsrk]
+
+# F1398665248_____________________________
+# 1:06:00
+[https://www.youtube.com/watch?v=59gTMBss8o0]
+# 50:58
+[https://www.youtube.com/watch?v=_7VFIZhR744]
+# 44:54
+[https://www.youtube.com/watch?v=d6ro4Oq5msA]
+
+# hang | WaitForMultipleObjectsEx | RealMsgWaitForMultipleObjectsEx | MsgWaitForMultipleObjects | F_1152915508___________________________________
+#1:07:12
+[https://www.youtube.com/watch?v=Ffkf3tosmKw]
+# 1:02:00
+[https://www.youtube.com/watch?v=dC3AHEao2MI]
+
+# hang | BaseGetNamedObjectDirectory | RealMsgWaitForMultipleObjectsEx | MsgWaitForMultipleObjects | F_1152915508___________________________________
+# 10:00
+[https://www.youtube.com/watch?v=fn3Qb56ujNQ]
+# 5:00
+[https://www.youtube.com/watch?v=gBsh1bT8ltI]
+# 03:50:12
+[https://www.youtube.com/watch?v=TdW4S8zbmJQ]
+
+
+
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/long3-crashes-900.ini b/dom/media/test/external/external_media_tests/urls/youtube/long3-crashes-900.ini
new file mode 100644
index 000000000..70081b986
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/long3-crashes-900.ini
@@ -0,0 +1,86 @@
+# It appears these are not currently used by tests. They are left here as they
+# reference failure scenarios. If tese are fixed that can be removed.
+
+# Total time: about 12-13 hours + unskippable ads
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=50&platform=Windows&version=37.0&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dhang+%7C+NtUserMessageCall+%7C+SendMessageW&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3DOOM+%7C+small&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dmozilla%3A%3Alayers%3A%3ACompositorD3D11%3A%3AHandleError%28long%2C+mozilla%3A%3Alayers%3A%3ACompositorD3D11%3A%3ASeverity%29+%7C+mozilla%3A%3Alayers%3A%3ACompositorD3D11%3A%3AFailed%28long%2C+mozilla%3A%3Alayers%3A%3ACompositorD3D11%3A%3ASeverity%29+%7C+mozilla%3A%3Alayers%3A%3ACompositorD3D11%3A%3AUpdateRenderTarget%28%29&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3DOOM+%7C+large+%7C+mozalloc_abort%28char+const%2A+const%29+%7C+mozalloc_handle_oom%28unsigned+int%29+%7C+moz_xmalloc+%7C+nsTArray_base%3CnsTArrayInfallibleAllocator%2C+nsTArray_CopyWithMemutils%3E%3A%3AEnsureCapacity%28unsigned+int%2C+unsigned+int%29+%7C+nsTArray_base%3CnsTArrayInfallibleAllo...&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dshutdownhang+%7C+WaitForSingleObjectEx+%7C+WaitForSingleObject+%7C+PR_Wait+%7C+nsThread%3A%3AProcessNextEvent%28bool%2C+bool%2A%29+%7C+NS_ProcessNextEvent%28nsIThread%2A%2C+bool%29+%7C+mozilla%3A%3AMediaShutdownManager%3A%3AShutdown%28%29&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dmozilla%3A%3Alayers%3A%3ACompositorD3D11%3A%3AUpdateConstantBuffers%28%29&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dmsvcr120.dll%400xf20c&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Djs%3A%3AGCMarker%3A%3AprocessMarkStackTop%28js%3A%3ASliceBudget%26%29&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dshutdownhang+%7C+WaitForSingleObjectEx+%7C+WaitForSingleObject+%7C+PR_Wait+%7C+nsThread%3A%3AProcessNextEvent%28bool%2C+bool%2A%29+%7C+NS_ProcessNextEvent%28nsIThread%2A%2C+bool%29+%7C+mozilla%3A%3Alayers%3A%3ACompositorParent%3A%3AShutDown%28%29&date=%3E2015-03-26
+
+#Request url: https://crash-stats.mozilla.com/api/SuperSearchUnredacted/?product=Firefox&url=%24https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D&url=%21~list&url=%21~index&_results_number=5&platform=Windows&version=37.0&signature=%3Dshutdownhang+%7C+WaitForSingleObjectEx+%7C+WaitForSingleObject+%7C+PR_Wait+%7C+mozilla%3A%3AReentrantMonitor%3A%3AWait%28unsigned+int%29+%7C+mozilla%3A%3Alayers%3A%3AImageBridgeChild%3A%3AShutDown%28%29&date=%3E2015-03-26
+
+# shutdownhang | WaitForSingleObjectEx | WaitForSingleObject | PR_Wait | nsThread::ProcessNextEvent(bool, bool*) | NS_ProcessNextEvent(nsIThread*, bool) | mozilla::MediaShutdownManager::Shutdown()
+[https://www.youtube.com/watch?v=PnwS01Yu9bs]
+[https://www.youtube.com/watch?v=6hNOMhEqI9g]
+[https://www.youtube.com/watch?v=gK9eCjYEwH4]
+#[https://www.youtube.com/watch?v=E9DFupLEV7c] Geographic restriction
+[https://www.youtube.com/watch?v=sLEVm0OGImU]
+# hang | NtUserMessageCall | SendMessageW
+[https://www.youtube.com/watch?v=kt0g4dWxEBo]
+[https://www.youtube.com/watch?v=cvwMS6UmesQ]
+[https://www.youtube.com/watch?v=Bj3YSTu3jUs]
+[https://www.youtube.com/watch?v=J9bgaoXLbFI]
+[https://www.youtube.com/watch?v=d5GUd6IElIw]
+# shutdownhang | WaitForSingleObjectEx | WaitForSingleObject | PR_Wait | mozilla::ReentrantMonitor::Wait(unsigned int) | mozilla::layers::ImageBridgeChild::ShutDown()
+[https://www.youtube.com/watch?v=6FMNFvKEy4c]
+[https://www.youtube.com/watch?v=w4RNIyJw9RI]
+#[https://www.youtube.com/watch?v=tKB5S1yp5MA] Account terminated
+[https://www.youtube.com/watch?v=Tct2Iv1QRUU]
+[https://www.youtube.com/watch?v=zDHOW9PdQYE]
+# shutdownhang | WaitForSingleObjectEx | WaitForSingleObject | PR_Wait | nsThread::ProcessNextEvent(bool, bool*) | NS_ProcessNextEvent(nsIThread*, bool) | mozilla::layers::CompositorParent::ShutDown()
+[https://www.youtube.com/watch?v=AGo24nC3_HU]
+[https://www.youtube.com/watch?v=GsVaCnud57U]
+[https://www.youtube.com/watch?v=zFg55zva7ok]
+#[https://www.youtube.com/watch?v=5VSk7bwPPOM] Policy violation
+[https://www.youtube.com/watch?v=2OYa5kR5EQ4]
+# OOM | large | mozalloc_abort(char const* const) | mozalloc_handle_oom(unsigned int) | moz_xmalloc | nsTArray_base<nsTArrayInfallibleAllocator, nsTArray_CopyWithMemutils>::EnsureCapacity(unsigned int, unsigned int) | nsTArray_base<nsTArrayInfallibleAllo...
+#[https://www.youtube.com/watch?v=1g91CAubt1c] Policy violation
+[https://www.youtube.com/watch?v=HE_7UFHPfQ0]
+# [https://www.youtube.com/watch?v=vhrM1JXG8-k] Live stream, Flash only
+[https://www.youtube.com/watch?v=ERWFf0JS94E]
+#[https://www.youtube.com/watch?v=8tmiawwVreE] Age restriction
+# mozilla::layers::CompositorD3D11::UpdateConstantBuffers()
+[https://www.youtube.com/watch?v=7azYa518LvE]
+[https://www.youtube.com/watch?v=Zg5JvdXHUqg]
+[https://www.youtube.com/watch?v=Q_kcoEY2wNw]
+[https://www.youtube.com/watch?v=eNzUJa0WjfU]
+[https://www.youtube.com/watch?v=B5V12xYb7hE]
+# OOM | small
+[https://www.youtube.com/watch?v=TS9Z8dN4OPo]
+[https://www.youtube.com/watch?v=EpngdStzhmQ]
+[https://www.youtube.com/watch?v=dUiDCX3BnM0]
+[https://www.youtube.com/watch?v=Ii4Su6Z8pCw]
+[https://www.youtube.com/watch?v=vviBJS6WQno]
+# msvcr120.dll@0xf20c
+[https://www.youtube.com/watch?v=hRE2VO9oa_g]
+[https://www.youtube.com/watch?v=qLL8VanC3zI]
+[https://www.youtube.com/watch?v=YX2LIztg2EI]
+[https://www.youtube.com/watch?v=-7Eh28eatBo]
+[https://www.youtube.com/watch?v=a32AMX55sZM]
+# js::GCMarker::processMarkStackTop(js::SliceBudget&)
+[https://www.youtube.com/watch?v=f0L2RzygE5k]
+[https://www.youtube.com/watch?v=-1RGIDgwHgM]
+[https://www.youtube.com/watch?v=iL1CEn7SQfQ]
+[https://www.youtube.com/watch?v=450p7goxZqg]
+[https://www.youtube.com/watch?v=Eo8c2sZ2eOY]
+# mozilla::layers::CompositorD3D11::HandleError(long, mozilla::layers::CompositorD3D11::Severity) | mozilla::layers::CompositorD3D11::Failed(long, mozilla::layers::CompositorD3D11::Severity) | mozilla::layers::CompositorD3D11::UpdateRenderTarget()
+[https://www.youtube.com/watch?v=a79R7bPhVhw]
+[https://www.youtube.com/watch?v=JRNCgvZs5v4]
+[https://www.youtube.com/watch?v=q8y58dWKfY8]
+[https://www.youtube.com/watch?v=Ns9M6sUvqxs]
+[https://www.youtube.com/watch?v=Ii-PCeTgR-A]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/medium1-60.ini b/dom/media/test/external/external_media_tests/urls/youtube/medium1-60.ini
new file mode 100644
index 000000000..65ccef11a
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/medium1-60.ini
@@ -0,0 +1,18 @@
+# mix of shorter/longer videos with/without ads, < 60 min
+# 4:59 - can't embed
+[https://www.youtube.com/watch?v=pWI8RB2dmfU]
+# 0:46 ad at start
+[https://www.youtube.com/embed/6SFp1z7uA6g?autoplay=1]
+# 0:58 ad at start
+[https://www.youtube.com/embed/Aebs62bX0dA?autoplay=1]
+# 1:43 ad
+[https://www.youtube.com/embed/l5ODwR6FPRQ?autoplay=1]
+# 8:00 ad - can't embed
+[https://www.youtube.com/watch?v=KlyXNRrsk4A]
+# video with ad in beginning and in the middle 20:00
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1176815
+[https://www.youtube.com/embed/cht9Xq9suGg?autoplay=1]
+# 1:35 ad
+[https://www.youtube.com/embed/orybDrUj4vA?autoplay=1]
+# 3:02 ad
+[https://www.youtube.com/embed/tDDVAErOI5U?autoplay=1]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/short1-10.ini b/dom/media/test/external/external_media_tests/urls/youtube/short1-10.ini
new file mode 100644
index 000000000..a8b4016dc
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/short1-10.ini
@@ -0,0 +1,13 @@
+# short videos; no ads; max 10 minutes
+# 0:12
+[https://youtu.be/AbAACm1IQE0]
+# 0:30
+[https://www.youtube.com/watch?v=KdHZwWQWNyM]
+# 0:08
+[https://www.youtube.com/watch?v=1visYpIREUM]
+# 3:27
+[https://www.youtube.com/watch?v=xcgUKzwg0Mo]
+# 1:21
+[https://youtu.be/sEAT2EFIJow]
+# 1:23
+[https://www.youtube.com/watch?v=SSgnbQ5UC48]
diff --git a/dom/media/test/external/external_media_tests/urls/youtube/short2-crashes-15.ini b/dom/media/test/external/external_media_tests/urls/youtube/short2-crashes-15.ini
new file mode 100644
index 000000000..bfcba4101
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/urls/youtube/short2-crashes-15.ini
@@ -0,0 +1,17 @@
+# It appears these are not currently used by tests. They are left here as they
+# reference failure scenarios. If tese are fixed that can be removed.
+
+# crash-data videos, < 15 minutes total
+
+# hang | NtUserMessageCall | SendMessageW
+# 5:40
+[https://www.youtube.com/watch?v=UIobdRNLNek]
+
+# F1398665248_____________________________
+# 3:59
+[https://www.youtube.com/watch?v=XGotQYd-X6o]
+
+# hang | WaitForMultipleObjectsEx | RealMsgWaitForMultipleObjectsEx | MsgWaitForMultipleObjects | F_1152915508___________________________________
+# 4:07
+[https://www.youtube.com/watch?v=wQgppPHXJSs]
+
diff --git a/dom/media/test/external/external_media_tests/utils.py b/dom/media/test/external/external_media_tests/utils.py
new file mode 100644
index 000000000..4ac0d5f62
--- /dev/null
+++ b/dom/media/test/external/external_media_tests/utils.py
@@ -0,0 +1,68 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import datetime
+import time
+import types
+
+from marionette_driver.errors import TimeoutException
+
+
+def timestamp_now():
+ return int(time.mktime(datetime.datetime.now().timetuple()))
+
+
+def verbose_until(wait, target, condition, message=""):
+ """
+ Performs a `wait`.until(condition)` and adds information about the state of
+ `target` to any resulting `TimeoutException`.
+
+ :param wait: a `marionette.Wait` instance
+ :param target: the object you want verbose output about if a
+ `TimeoutException` is raised
+ This is usually the input value provided to the `condition` used by
+ `wait`. Ideally, `target` should implement `__str__`
+ :param condition: callable function used by `wait.until()`
+ :param message: optional message to log when exception occurs
+
+ :return: the result of `wait.until(condition)`
+ """
+ if isinstance(condition, types.FunctionType):
+ name = condition.__name__
+ else:
+ name = str(condition)
+ err_message = '\n'.join([message,
+ 'condition: ' + name,
+ str(target)])
+
+ return wait.until(condition, message=err_message)
+
+
+
+def save_memory_report(marionette):
+ """
+ Saves memory report (like about:memory) to current working directory.
+
+ :param marionette: Marionette instance to use for executing.
+ """
+ with marionette.using_context('chrome'):
+ marionette.execute_async_script("""
+ Components.utils.import("resource://gre/modules/Services.jsm");
+ let Cc = Components.classes;
+ let Ci = Components.interfaces;
+ let dumper = Cc["@mozilla.org/memory-info-dumper;1"].
+ getService(Ci.nsIMemoryInfoDumper);
+ // Examples of dirs: "CurProcD" usually 'browser' dir in
+ // current FF dir; "DfltDwnld" default download dir
+ let file = Services.dirsvc.get("CurProcD", Ci.nsIFile);
+ file.append("media-memory-report");
+ file.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 0777);
+ file.append("media-memory-report.json.gz");
+ dumper.dumpMemoryReportsToNamedFile(file.path, null, null, false);
+ log('Saved memory report to ' + file.path);
+ // for dmd-enabled build
+ dumper.dumpMemoryInfoToTempDir("media", false, false);
+ marionetteScriptFinished(true);
+ return;
+ """, script_timeout=30000)
diff --git a/dom/media/test/external/mach_commands.py b/dom/media/test/external/mach_commands.py
new file mode 100644
index 000000000..e309f3c55
--- /dev/null
+++ b/dom/media/test/external/mach_commands.py
@@ -0,0 +1,74 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from __future__ import absolute_import, unicode_literals
+
+import os
+import sys
+
+from mozbuild.base import (
+ MachCommandBase,
+ MachCommandConditions as conditions,
+)
+
+from mach.decorators import (
+ CommandProvider,
+ Command,
+)
+
+def setup_argument_parser():
+ from external_media_harness.runtests import MediaTestArguments
+ from mozlog.structured import commandline
+ parser = MediaTestArguments()
+ commandline.add_logging_group(parser)
+ return parser
+
+
+def run_external_media_test(tests, testtype=None, topsrcdir=None, **kwargs):
+ from external_media_harness.runtests import (
+ FirefoxMediaHarness,
+ MediaTestArguments,
+ MediaTestRunner,
+ mn_cli,
+ )
+
+ from mozlog.structured import commandline
+
+ from argparse import Namespace
+
+ parser = setup_argument_parser()
+
+ if not tests:
+ tests = [os.path.join(topsrcdir,
+ 'dom/media/test/external/external_media_tests/manifest.ini')]
+
+ args = Namespace(tests=tests)
+
+ for k, v in kwargs.iteritems():
+ setattr(args, k, v)
+
+ parser.verify_usage(args)
+
+ args.logger = commandline.setup_logging("Firefox External Media Tests",
+ args,
+ {"mach": sys.stdout})
+ failed = mn_cli(MediaTestRunner, MediaTestArguments, FirefoxMediaHarness,
+ args=vars(args))
+
+ if failed > 0:
+ return 1
+ else:
+ return 0
+
+
+@CommandProvider
+class MachCommands(MachCommandBase):
+ @Command('external-media-tests', category='testing',
+ description='Run Firefox external media tests.',
+ conditions=[conditions.is_firefox],
+ parser=setup_argument_parser,
+ )
+ def run_external_media_test(self, tests, **kwargs):
+ kwargs['binary'] = kwargs['binary'] or self.get_binary_path('app')
+ return run_external_media_test(tests, topsrcdir=self.topsrcdir, **kwargs)
diff --git a/dom/media/test/external/requirements-docs.txt b/dom/media/test/external/requirements-docs.txt
new file mode 100644
index 000000000..a5109fff1
--- /dev/null
+++ b/dom/media/test/external/requirements-docs.txt
@@ -0,0 +1,5 @@
+sphinx
+sphinx-rtd-theme
+
+-e dom/media/test/external
+
diff --git a/dom/media/test/external/requirements.txt b/dom/media/test/external/requirements.txt
new file mode 100644
index 000000000..07133ca9f
--- /dev/null
+++ b/dom/media/test/external/requirements.txt
@@ -0,0 +1,5 @@
+firefox-puppeteer >= 52.1.0, <53.0.0
+manifestparser==1.1
+marionette-driver==2.2.0
+marionette-harness==4.0.0
+mozlog==3.3
diff --git a/dom/media/test/external/setup.py b/dom/media/test/external/setup.py
new file mode 100644
index 000000000..8520f9c8a
--- /dev/null
+++ b/dom/media/test/external/setup.py
@@ -0,0 +1,42 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+from setuptools import setup, find_packages
+
+PACKAGE_VERSION = '2.1'
+
+THIS_DIR = os.path.dirname(os.path.realpath(__name__))
+
+
+def read(*parts):
+ with open(os.path.join(THIS_DIR, *parts)) as f:
+ return f.read()
+
+setup(name='external-media-tests',
+ version=PACKAGE_VERSION,
+ description=('A collection of Mozilla Firefox media playback tests run '
+ 'with Marionette'),
+ classifiers=[
+ 'Environment :: Console',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ ],
+ keywords='mozilla',
+ author='Mozilla Automation and Tools Team',
+ author_email='tools@lists.mozilla.org',
+ url='https://hg.mozilla.org/mozilla-central/dom/media/test/external/',
+ license='MPL 2.0',
+ packages=find_packages(),
+ zip_safe=False,
+ install_requires=read('requirements.txt').splitlines(),
+ include_package_data=True,
+ entry_points="""
+ [console_scripts]
+ external-media-tests = external_media_harness:cli
+ """)
diff --git a/dom/media/test/file_access_controls.html b/dom/media/test/file_access_controls.html
new file mode 100644
index 000000000..ae55154c0
--- /dev/null
+++ b/dom/media/test/file_access_controls.html
@@ -0,0 +1,156 @@
+<html>
+<head>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="setTimeout(load, 0);" onunload="done()">
+<script>
+
+// Page URL: http://example.org/tests/dom/media/test/file_access_controls.html
+
+var gResource = getPlayableVideo(gSmallTests).name;
+
+var gTests = [
+ {
+ // Test 0
+ url: "redirect.sjs?domain=example.com&file="+ gResource,
+ result: "error",
+ description: "Won't load when redirected to different domain",
+ },{
+ // Test 1
+ url: "redirect.sjs?domain=example.com&allowed&file=" + gResource,
+ result: "loadeddata",
+ description: "Can load when redirected to different domain with allow-origin",
+ },{
+ // Test 2
+ url: "redirect.sjs?domain=test1.example.org&file=" + gResource,
+ result: "error",
+ description: "Won't load when redirected to subdomain",
+ },{
+ // Test 3
+ url: "redirect.sjs?domain=test1.example.org&allowed&file=" + gResource,
+ result: "loadeddata",
+ description: "Can load when redirected to subdomain with allow-origin",
+ },{
+ // Test 4
+ url: "redirect.sjs?domain=example.org&file=" + gResource,
+ result: "loadeddata",
+ description: "Can load when redirected to same domain",
+ },{
+ // Test 5
+ url: "http://example.org/tests/dom/media/test/" + gResource,
+ result: "loadeddata",
+ description: "Can load from same domain"
+ },{
+ // Test 6
+ url: "http://example.org:8000/tests/dom/media/test/" + gResource,
+ result: "error",
+ description: "Won't load from different port on same domain"
+ },{
+ // Test 7
+ url: "http://example.org:8000/tests/dom/media/test/allowed.sjs?" + gResource,
+ result: "loadeddata",
+ description: "Can load from different port on same domain with allow-origin",
+ },{
+ // Test 8
+ url: "http://example.com/tests/dom/media/test/" + gResource,
+ result: "error",
+ description: "Won't load cross domain",
+ },{
+ // Test 9
+ url: "http://example.com/tests/dom/media/test/allowed.sjs?" + gResource,
+ result: "loadeddata",
+ description: "Can load cross domain with allow-origin",
+ },{
+ // Test 10
+ url: "http://test1.example.org/tests/dom/media/test/allowed.sjs?" + gResource,
+ result: "loadeddata",
+ description: "Can load from subdomain with allow-origin",
+ },{
+ // Test 11
+ url: "http://test1.example.org/tests/dom/media/test/" + gResource,
+ result: "error",
+ description: "Won't load from subdomain",
+ }
+];
+
+var gTestNum = 0;
+var gVideo = null;
+var gTestedRemoved = false;
+
+function eventHandler(event) {
+ //dump((gTestNum - 1) + ": " + event.type + "\n");
+ var video = event.target;
+ opener.postMessage({"result": (event.type == video.expectedResult),
+ "message": video.testDescription + (gTestedRemoved ? " (element not in document)" : " (element in document)")},
+ "http://mochi.test:8888");
+ // Make sure any extra events cause an error
+ video.expectedResult = "<none>";
+ nextTest();
+}
+
+function createVideo() {
+ var v = document.createElement('video');
+ v.addEventListener('loadeddata', eventHandler, false);
+ v.addEventListener('error', eventHandler, false);
+ v.crossOrigin = 'anonymous';
+ return v;
+}
+
+function load() {
+ opener.postMessage({"result": (window.location.href == "http://example.org/tests/dom/media/test/file_access_controls.html"),
+ "message": "We must be on a example.org:80"},
+ "http://mochi.test:8888");
+
+ nextTest();
+}
+
+function nextTest() {
+ //dump("nextTest() called, gTestNum="+gTestNum+" gTestedRemoved="+gTestedRemoved+"\n");
+ if (gTestNum == gTests.length) {
+ //dump("gTestNum == gTests.length\n");
+ if (!gTestedRemoved) {
+ // Repeat all tests with element removed from doc, should get same result.
+ gTestedRemoved = true;
+ gTestNum = 0;
+ } else {
+ //dump("Exiting...\n");
+ // We're done, exit the test.
+ window.close();
+ return;
+ }
+ }
+
+ if (gVideo && gVideo.parentNode)
+ gVideo.parentNode.removeChild(gVideo);
+
+ gVideo = null;
+ SpecialPowers.forceGC();
+
+ gVideo = createVideo();
+ gVideo.expectedResult = gTests[gTestNum].result;
+ gVideo.testDescription = gTests[gTestNum].description;
+ // Uniquify the resource URL to ensure that the resources loaded by earlier or subsequent tests
+ // don't overlap with the resources we load here, which are loaded with non-default preferences set.
+ // We also want to make sure that an HTTP fetch actually happens for each testcase.
+ var url = gTests[gTestNum].url;
+ var random = Math.floor(Math.random()*1000000000);
+ url += (url.search(/\?/) < 0 ? "?" : "&") + "rand=" + random;
+ gVideo.src = url;
+ //dump("Starting test " + gTestNum + " at " + gVideo.src + " expecting:" + gVideo.expectedResult + "\n");
+ if (!gTestedRemoved) {
+ document.body.appendChild(gVideo);
+ // Will cause load() to be invoked.
+ } else {
+ gVideo.load();
+ }
+ gTestNum++;
+}
+
+function done() {
+ opener.postMessage({"done": "true"}, "http://mochi.test:8888");
+}
+
+</script>
+</body>
+</html>
+
diff --git a/dom/media/test/flac-noheader-s16.flac b/dom/media/test/flac-noheader-s16.flac
new file mode 100755
index 000000000..01152142a
--- /dev/null
+++ b/dom/media/test/flac-noheader-s16.flac
Binary files differ
diff --git a/dom/media/test/flac-noheader-s16.flac^headers^ b/dom/media/test/flac-noheader-s16.flac^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/flac-noheader-s16.flac^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/flac-s24.flac b/dom/media/test/flac-s24.flac
new file mode 100644
index 000000000..1ba5e27a1
--- /dev/null
+++ b/dom/media/test/flac-s24.flac
Binary files differ
diff --git a/dom/media/test/flac-s24.flac^headers^ b/dom/media/test/flac-s24.flac^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/flac-s24.flac^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/fragment_noplay.js b/dom/media/test/fragment_noplay.js
new file mode 100644
index 000000000..9c761b1b3
--- /dev/null
+++ b/dom/media/test/fragment_noplay.js
@@ -0,0 +1,14 @@
+function test_fragment_noplay(v, start, end, is, ok, finish) {
+
+function onLoadedMetadata() {
+ var s = start == null ? 0 : start;
+ var e = end == null ? v.duration : end;
+ var a = s - 0.15;
+ var b = s + 0.15;
+ ok(v.currentTime >= a && v.currentTime <= b, "loadedmetadata currentTime is " + a + " < " + v.currentTime + " < " + b);
+ ok(v.mozFragmentEnd == e, "mozFragmentEnd (" + v.mozFragmentEnd + ") == end Time (" + e + ")");
+ finish();
+}
+
+v.addEventListener("loadedmetadata", onLoadedMetadata, false);
+}
diff --git a/dom/media/test/fragment_play.js b/dom/media/test/fragment_play.js
new file mode 100644
index 000000000..df98f6b09
--- /dev/null
+++ b/dom/media/test/fragment_play.js
@@ -0,0 +1,67 @@
+function test_fragment_play(v, start, end, is, ok, finish) {
+
+var completed = false;
+var loadedMetadataRaised = false;
+var seekedRaised = false;
+var pausedRaised = false;
+
+function onLoadedMetadata() {
+ var s = start == null ? 0 : start;
+ var e = end == null ? v.duration : end;
+ ok(v.currentTime == s, "loadedmetadata currentTime is " + v.currentTime + " != " + s);
+ ok(v.mozFragmentEnd == e, "mozFragmentEnd (" + v.mozFragmentEnd + ") == end Time (" + e + ")");
+ loadedMetadataRaised = true;
+ v.play();
+}
+
+function onSeeked() {
+ if (completed)
+ return;
+
+ var s = start == null ? 0 : start;
+ ok(v.currentTime - s < 0.1, "seeked currentTime is " + v.currentTime + " != " + s + " (fuzzy compare +-0.1)");
+
+ seekedRaised = true;
+}
+
+function onTimeUpdate() {
+ if (completed)
+ return;
+
+ v._lastTimeUpdate = v.currentTime;
+}
+
+function onPause() {
+ if (completed)
+ return;
+
+ var e = end == null ? v.duration : end;
+ var a = e - 0.05;
+ var b = e + 0.05;
+ ok(v.currentTime >= a && v.currentTime <= b, "paused currentTime is " + a + " < " + v.currentTime + " < " + b + " ? " + v._lastTimeUpdate);
+ pausedRaised = true;
+ v.play();
+}
+
+
+function onEnded() {
+ if (completed)
+ return;
+
+ completed = true;
+ ok(loadedMetadataRaised, "loadedmetadata event");
+ if (start) {
+ ok(seekedRaised, "seeked event");
+ }
+ if (end) {
+ ok(pausedRaised, "paused event: " + end + " " + v.duration);
+ }
+ finish();
+}
+
+v.addEventListener("ended", onEnded, false);
+v.addEventListener("loadedmetadata", onLoadedMetadata, false);
+v.addEventListener("seeked", onSeeked, false);
+v.addEventListener("pause", onPause, false);
+v.addEventListener("timeupdate", onTimeUpdate, false);
+}
diff --git a/dom/media/test/gizmo-frag.mp4 b/dom/media/test/gizmo-frag.mp4
new file mode 100644
index 000000000..f6980663c
--- /dev/null
+++ b/dom/media/test/gizmo-frag.mp4
Binary files differ
diff --git a/dom/media/test/gizmo-noaudio.mp4 b/dom/media/test/gizmo-noaudio.mp4
new file mode 100644
index 000000000..24732a406
--- /dev/null
+++ b/dom/media/test/gizmo-noaudio.mp4
Binary files differ
diff --git a/dom/media/test/gizmo-noaudio.mp4^headers^ b/dom/media/test/gizmo-noaudio.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/gizmo-noaudio.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/gizmo-noaudio.webm b/dom/media/test/gizmo-noaudio.webm
new file mode 100644
index 000000000..9f412cb6e
--- /dev/null
+++ b/dom/media/test/gizmo-noaudio.webm
Binary files differ
diff --git a/dom/media/test/gizmo-noaudio.webm^headers^ b/dom/media/test/gizmo-noaudio.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/gizmo-noaudio.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/gizmo-short.mp4 b/dom/media/test/gizmo-short.mp4
new file mode 100644
index 000000000..f8caec741
--- /dev/null
+++ b/dom/media/test/gizmo-short.mp4
Binary files differ
diff --git a/dom/media/test/gizmo-short.mp4^headers^ b/dom/media/test/gizmo-short.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/gizmo-short.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/gizmo.mp4 b/dom/media/test/gizmo.mp4
new file mode 100644
index 000000000..87efad5ad
--- /dev/null
+++ b/dom/media/test/gizmo.mp4
Binary files differ
diff --git a/dom/media/test/gizmo.mp4^headers^ b/dom/media/test/gizmo.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/gizmo.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/gizmo.webm b/dom/media/test/gizmo.webm
new file mode 100644
index 000000000..518531a93
--- /dev/null
+++ b/dom/media/test/gizmo.webm
Binary files differ
diff --git a/dom/media/test/gizmo.webm^headers^ b/dom/media/test/gizmo.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/gizmo.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/graph_latency.py b/dom/media/test/graph_latency.py
new file mode 100644
index 000000000..576f58d86
--- /dev/null
+++ b/dom/media/test/graph_latency.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+# graph_latency.py - graph media latency
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# needs matplotlib (sudo aptitude install python-matplotlib)
+
+import matplotlib.pyplot as plt
+from matplotlib import rc
+import sys
+from pprint import pprint
+import re
+
+
+# FIX! needs to be sum of a single mediastreamtrack and any output overhead for it
+# So there is one sum per MST
+def compute_sum(data):
+ 'Compute the sum for each timestamp. This expects the output of parse_data.'
+ last_values = {}
+ out = ([],[])
+
+ for i in data:
+ if i[0] not in last_values.keys():
+ last_values[i[0]] = 0
+ last_values[i[0]] = float(i[3])
+ print last_values
+ out[0].append(i[2])
+ out[1].append(sum(last_values.values()))
+ return out
+
+
+def clean_data(raw_data):
+ '''
+ Remove the PR_LOG cruft at the beginning of each line and returns a list of
+ tuple.
+ '''
+ out = []
+ for line in raw_data:
+ match = re.match(r'(.*)#(.*)', line)
+ if match:
+ continue
+ else:
+ out.append(line.split(": ")[1])
+ return out
+
+# returns a list of tuples
+def parse_data(raw_lines):
+ '''
+ Split each line by , and put every bit in a tuple.
+ '''
+ out = []
+ for line in raw_lines:
+ out.append(line.split(','))
+ return out
+
+if len(sys.argv) == 3:
+ name = sys.argv[1]
+ channels = int(sys.argv[2])
+else:
+ print sys.argv[0] + "latency_log"
+
+try:
+ f = open(sys.argv[1])
+except:
+ print "cannot open " + name
+
+raw_lines = f.readlines()
+lines = clean_data(raw_lines)
+data = parse_data(lines)
+
+final_data = {}
+
+for tupl in data:
+ name = tupl[0]
+ if tupl[1] != 0:
+ name = name+tupl[1]
+ if name not in final_data.keys():
+ final_data[name] = ([], [])
+# sanity-check values
+ if float(tupl[3]) < 10*1000:
+ final_data[name][0].append(float(tupl[2]))
+ final_data[name][1].append(float(tupl[3]))
+
+#overall = compute_sum(data)
+#final_data["overall"] = overall
+
+pprint(final_data)
+
+fig = plt.figure()
+for i in final_data.keys():
+ plt.plot(final_data[i][0], final_data[i][1], label=i)
+
+plt.legend()
+plt.suptitle("Latency in ms (y-axis) against time in ms (x-axis).")
+
+size = fig.get_size_inches()
+# make it gigantic so we can see things. sometimes, if the graph is too big,
+# this errors. reduce the factor so it stays under 2**15.
+fig.set_size_inches((size[0]*10, size[1]*2))
+name = sys.argv[1][:-4] + ".pdf"
+fig.savefig(name)
+
diff --git a/dom/media/test/huge-id3.mp3 b/dom/media/test/huge-id3.mp3
new file mode 100644
index 000000000..41cb93d80
--- /dev/null
+++ b/dom/media/test/huge-id3.mp3
Binary files differ
diff --git a/dom/media/test/huge-id3.mp3^headers^ b/dom/media/test/huge-id3.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/huge-id3.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/id3tags.mp3 b/dom/media/test/id3tags.mp3
new file mode 100644
index 000000000..bad506cf1
--- /dev/null
+++ b/dom/media/test/id3tags.mp3
Binary files differ
diff --git a/dom/media/test/id3tags.mp3^headers^ b/dom/media/test/id3tags.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/id3tags.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-cmap-s0c0.opus b/dom/media/test/invalid-cmap-s0c0.opus
new file mode 100644
index 000000000..0b9958786
--- /dev/null
+++ b/dom/media/test/invalid-cmap-s0c0.opus
Binary files differ
diff --git a/dom/media/test/invalid-cmap-s0c0.opus^headers^ b/dom/media/test/invalid-cmap-s0c0.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-cmap-s0c0.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-cmap-s0c2.opus b/dom/media/test/invalid-cmap-s0c2.opus
new file mode 100644
index 000000000..a921894fe
--- /dev/null
+++ b/dom/media/test/invalid-cmap-s0c2.opus
Binary files differ
diff --git a/dom/media/test/invalid-cmap-s0c2.opus^headers^ b/dom/media/test/invalid-cmap-s0c2.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-cmap-s0c2.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-cmap-s1c2.opus b/dom/media/test/invalid-cmap-s1c2.opus
new file mode 100644
index 000000000..95a84f523
--- /dev/null
+++ b/dom/media/test/invalid-cmap-s1c2.opus
Binary files differ
diff --git a/dom/media/test/invalid-cmap-s1c2.opus^headers^ b/dom/media/test/invalid-cmap-s1c2.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-cmap-s1c2.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-cmap-short.opus b/dom/media/test/invalid-cmap-short.opus
new file mode 100644
index 000000000..fcd7eb506
--- /dev/null
+++ b/dom/media/test/invalid-cmap-short.opus
Binary files differ
diff --git a/dom/media/test/invalid-cmap-short.opus^headers^ b/dom/media/test/invalid-cmap-short.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-cmap-short.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-discard_on_multi_blocks.webm b/dom/media/test/invalid-discard_on_multi_blocks.webm
new file mode 100644
index 000000000..f39ab5bcb
--- /dev/null
+++ b/dom/media/test/invalid-discard_on_multi_blocks.webm
Binary files differ
diff --git a/dom/media/test/invalid-discard_on_multi_blocks.webm^headers^ b/dom/media/test/invalid-discard_on_multi_blocks.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-discard_on_multi_blocks.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-excess_discard.webm b/dom/media/test/invalid-excess_discard.webm
new file mode 100644
index 000000000..5b34aca1a
--- /dev/null
+++ b/dom/media/test/invalid-excess_discard.webm
Binary files differ
diff --git a/dom/media/test/invalid-excess_discard.webm^headers^ b/dom/media/test/invalid-excess_discard.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-excess_discard.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-excess_neg_discard.webm b/dom/media/test/invalid-excess_neg_discard.webm
new file mode 100644
index 000000000..2bfad6ed2
--- /dev/null
+++ b/dom/media/test/invalid-excess_neg_discard.webm
Binary files differ
diff --git a/dom/media/test/invalid-excess_neg_discard.webm^headers^ b/dom/media/test/invalid-excess_neg_discard.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-excess_neg_discard.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-m0c0.opus b/dom/media/test/invalid-m0c0.opus
new file mode 100644
index 000000000..86555f60e
--- /dev/null
+++ b/dom/media/test/invalid-m0c0.opus
Binary files differ
diff --git a/dom/media/test/invalid-m0c0.opus^headers^ b/dom/media/test/invalid-m0c0.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-m0c0.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-m0c3.opus b/dom/media/test/invalid-m0c3.opus
new file mode 100644
index 000000000..2c681a8c0
--- /dev/null
+++ b/dom/media/test/invalid-m0c3.opus
Binary files differ
diff --git a/dom/media/test/invalid-m0c3.opus^headers^ b/dom/media/test/invalid-m0c3.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-m0c3.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-m1c0.opus b/dom/media/test/invalid-m1c0.opus
new file mode 100644
index 000000000..c7728f79e
--- /dev/null
+++ b/dom/media/test/invalid-m1c0.opus
Binary files differ
diff --git a/dom/media/test/invalid-m1c0.opus^headers^ b/dom/media/test/invalid-m1c0.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-m1c0.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-m1c9.opus b/dom/media/test/invalid-m1c9.opus
new file mode 100644
index 000000000..1ef6e9f9c
--- /dev/null
+++ b/dom/media/test/invalid-m1c9.opus
Binary files differ
diff --git a/dom/media/test/invalid-m1c9.opus^headers^ b/dom/media/test/invalid-m1c9.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-m1c9.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-m2c0.opus b/dom/media/test/invalid-m2c0.opus
new file mode 100644
index 000000000..5c3f97e2a
--- /dev/null
+++ b/dom/media/test/invalid-m2c0.opus
Binary files differ
diff --git a/dom/media/test/invalid-m2c0.opus^headers^ b/dom/media/test/invalid-m2c0.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-m2c0.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-m2c1.opus b/dom/media/test/invalid-m2c1.opus
new file mode 100644
index 000000000..5ecb95ee2
--- /dev/null
+++ b/dom/media/test/invalid-m2c1.opus
Binary files differ
diff --git a/dom/media/test/invalid-m2c1.opus^headers^ b/dom/media/test/invalid-m2c1.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-m2c1.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-neg_discard.webm b/dom/media/test/invalid-neg_discard.webm
new file mode 100644
index 000000000..3f665c0b5
--- /dev/null
+++ b/dom/media/test/invalid-neg_discard.webm
Binary files differ
diff --git a/dom/media/test/invalid-neg_discard.webm^headers^ b/dom/media/test/invalid-neg_discard.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-neg_discard.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/invalid-preskip.webm b/dom/media/test/invalid-preskip.webm
new file mode 100644
index 000000000..99b4f2ca7
--- /dev/null
+++ b/dom/media/test/invalid-preskip.webm
Binary files differ
diff --git a/dom/media/test/invalid-preskip.webm^headers^ b/dom/media/test/invalid-preskip.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/invalid-preskip.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/long.vtt b/dom/media/test/long.vtt
new file mode 100644
index 000000000..23984b0c8
--- /dev/null
+++ b/dom/media/test/long.vtt
@@ -0,0 +1,8001 @@
+WEBVTT
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
+
+1
+00:00.500 --> 00:00.700
+This
+
+2
+00:01.200 --> 00:02.400
+Is
+
+3
+00:02.710 --> 00:02.910
+A
+
+4
+00:03.217 --> 00:03.989
+Test
diff --git a/dom/media/test/make-headers.sh b/dom/media/test/make-headers.sh
new file mode 100644
index 000000000..35d9bd90f
--- /dev/null
+++ b/dom/media/test/make-headers.sh
@@ -0,0 +1,18 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Script to generate ^header^ files for all media files we use.
+# This is to ensure that our media files are not cached by necko,
+# so that our detection as to whether the server supports byte range
+# requests is not interferred with by Necko's cache. See bug 977398
+# for details. Necko will fix this in bug 977314.
+
+FILES=(`ls *.ogg *.ogv *.webm *.mp3 *.opus *.mp4 *.m4s *.wav`)
+
+rm -f *.ogg^headers^ *.ogv^headers^ *.webm^headers^ *.mp3^headers^ *.opus^headers^ *.mp4^headers^ *.m4s^headers^ *.wav^headers^
+
+for i in "${FILES[@]}"
+do
+ echo "Cache-Control: no-store" >> $i^headers^
+done
diff --git a/dom/media/test/manifest.js b/dom/media/test/manifest.js
new file mode 100644
index 000000000..c6d533c1b
--- /dev/null
+++ b/dom/media/test/manifest.js
@@ -0,0 +1,1725 @@
+// In each list of tests below, test file types that are not supported should
+// be ignored. To make sure tests respect that, we include a file of type
+// "bogus/duh" in each list.
+
+// Make sure to not touch navigator in here, since we want to push prefs that
+// will affect the APIs it exposes, but the set of exposed APIs is determined
+// when Navigator.prototype is created. So if we touch navigator before pushing
+// the prefs, the APIs it exposes will not take those prefs into account. We
+// work around this by using a navigator object from a different global for our
+// UA string testing.
+var gManifestNavigatorSource = document.documentElement.appendChild(document.createElement("iframe"));
+gManifestNavigatorSource.style.display = "none";
+function manifestNavigator() {
+ return gManifestNavigatorSource.contentWindow.navigator;
+}
+
+// Similarly, use a <video> element from a different global for canPlayType or
+// other feature testing. If we used one from our global and did so before our
+// prefs are pushed, then we'd instantiate HTMLMediaElement.prototype before the
+// prefs are pushed and APIs we expect to be on that object would not be there.
+function manifestVideo() {
+ return gManifestNavigatorSource.contentDocument.createElement('video');
+}
+
+// These are small test files, good for just seeing if something loads. We
+// really only need one test file per backend here.
+var gSmallTests = [
+ { name:"small-shot.ogg", type:"audio/ogg", duration:0.276 },
+ { name:"small-shot.m4a", type:"audio/mp4", duration:0.29 },
+ { name:"small-shot.mp3", type:"audio/mpeg", duration:0.27 },
+ { name:"small-shot-mp3.mp4", type:"audio/mp4; codecs=mp3", duration:0.34 },
+ { name:"small-shot.flac", type:"audio/flac", duration:0.197 },
+ { name:"r11025_s16_c1-short.wav", type:"audio/x-wav", duration:0.37 },
+ { name:"320x240.ogv", type:"video/ogg", width:320, height:240, duration:0.266 },
+ { name:"seek-short.webm", type:"video/webm", width:320, height:240, duration:0.23 },
+ { name:"vp9-short.webm", type:"video/webm", width:320, height:240, duration:0.20 },
+ { name:"detodos-short.opus", type:"audio/ogg; codecs=opus", duration:0.22 },
+ { name:"gizmo-short.mp4", type:"video/mp4", width:560, height:320, duration:0.27 },
+ { name:"flac-s24.flac", type:"audio/flac", duration:4.04 },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+if (SpecialPowers.Services.appinfo.name != "B2G") {
+ // We only run mochitests on b2g desktop and b2g emulator. The 3gp codecs
+ // aren't present on desktop, and the emulator codecs (which are different
+ // from the real device codecs) don't pass all of our tests, so we need
+ // to disable them.
+
+ gSmallTests = gSmallTests.concat([
+ { name:"sample.3gp", type:"video/3gpp", duration:4.933 },
+ { name:"sample.3g2", type:"video/3gpp2", duration:4.933 }
+ ]);
+}
+
+// Used by test_bug654550.html, for videoStats preference
+var gVideoTests = [
+ { name:"320x240.ogv", type:"video/ogg", width:320, height:240, duration:0.266 },
+ { name:"seek-short.webm", type:"video/webm", width:320, height:240, duration:0.23 },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+// Temp hack for trackIDs and captureStream() -- bug 1215769
+var gLongerTests = [
+ { name:"seek.webm", type:"video/webm", width:320, height:240, duration:3.966 },
+ { name:"gizmo.mp4", type:"video/mp4", width:560, height:320, duration:5.56 },
+];
+
+// Used by test_progress to ensure we get the correct progress information
+// during resource download.
+var gProgressTests = [
+ { name:"r11025_u8_c1.wav", type:"audio/x-wav", duration:1.0, size:11069 },
+ { name:"big-short.wav", type:"audio/x-wav", duration:1.11, size:12366 },
+ { name:"seek-short.ogv", type:"video/ogg", duration:1.03, size:79921 },
+ { name:"320x240.ogv", type:"video/ogg", width:320, height:240, duration:0.266, size:28942 },
+ { name:"seek-short.webm", type:"video/webm", duration:0.23, size:19267 },
+ { name:"gizmo-short.mp4", type:"video/mp4", duration:0.27, size:29905 },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+// Used by test_played.html
+var gPlayedTests = [
+ { name:"big-short.wav", type:"audio/x-wav", duration:1.11 },
+ { name:"seek-short.ogv", type:"video/ogg", duration:1.03 },
+ { name:"seek-short.webm", type:"video/webm", duration:0.23 },
+ { name:"gizmo-short.mp4", type:"video/mp4", duration:0.27 },
+ { name:"owl-short.mp3", type:"audio/mpeg", duration:0.52 },
+ // Disable vbr.mp3 to see if it reduces the error of AUDCLNT_E_CPUUSAGE_EXCEEDED.
+ // See bug 1110922 comment 26.
+ //{ name:"vbr.mp3", type:"audio/mpeg", duration:10.0 },
+ { name:"bug495794.ogg", type:"audio/ogg", duration:0.3 },
+];
+
+// Used by test_mozLoadFrom. Need one test file per decoder backend, plus
+// anything for testing clone-specific bugs.
+var cloneKey = Math.floor(Math.random()*100000000);
+var gCloneTests = gSmallTests.concat([
+ { name:"bug520908.ogv", type:"video/ogg", duration:0.2 },
+ // short-video is more like 1s, so if you load this twice you'll get an unexpected duration
+ { name:"dynamic_resource.sjs?key=" + cloneKey + "&res1=320x240.ogv&res2=short-video.ogv",
+ type:"video/ogg", duration:0.266 },
+]);
+
+// Used by test_play_twice. Need one test file per decoder backend, plus
+// anything for testing bugs that occur when replying a played file.
+var gReplayTests = gSmallTests.concat([
+ { name:"bug533822.ogg", type:"audio/ogg" },
+]);
+
+// Used by test_paused_after_ended. Need one test file per decoder backend, plus
+// anything for testing bugs that occur when replying a played file.
+var gPausedAfterEndedTests = gSmallTests.concat([
+ { name:"r11025_u8_c1.wav", type:"audio/x-wav", duration:1.0 },
+ { name:"small-shot.ogg", type:"video/ogg", duration:0.276 }
+]);
+
+// Test the mozHasAudio property, and APIs that detect different kinds of
+// tracks
+var gTrackTests = [
+ { name:"big-short.wav", type:"audio/x-wav", duration:1.11, size:12366, hasAudio:true, hasVideo:false },
+ { name:"320x240.ogv", type:"video/ogg", width:320, height:240, duration:0.266, size:28942, hasAudio:false, hasVideo:true },
+ { name:"short-video.ogv", type:"video/ogg", duration:1.081, hasAudio:true, hasVideo:true },
+ { name:"seek-short.webm", type:"video/webm", duration:0.23, size:19267, hasAudio:false, hasVideo:true },
+ { name:"flac-s24.flac", type:"audio/flac", duration:4.04, hasAudio:true, hasVideo:false },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+var gClosingConnectionsTest = [
+ { name:"seek-short.ogv", type:"video/ogg", duration:1.03 },
+];
+
+// Used by any media recorder test. Need one test file per decoder backend
+// currently supported by the media encoder.
+var gMediaRecorderTests = [
+ // Duration should be greater than 500ms because we will record 2
+ // time slices (250ms per slice)
+ { name:"detodos-recorder-test.opus", type:"audio/ogg; codecs=opus", duration:0.62 }
+];
+
+// Used by video media recorder tests
+var gMediaRecorderVideoTests = [
+ { name:"seek-short.webm", type:"video/webm", width:320, height:240, duration:0.23 },
+];
+
+// These are files that we want to make sure we can play through. We can
+// also check metadata. Put files of the same type together in this list so if
+// something crashes we have some idea of which backend is responsible.
+// Used by test_playback, which expects no error event and one ended event.
+var gPlayTests = [
+ // Test playback of a WebM file with vp9 video
+ { name:"vp9cake-short.webm", type:"video/webm", duration:1.00 },
+
+ // 8-bit samples
+ { name:"r11025_u8_c1.wav", type:"audio/x-wav", duration:1.0 },
+ // 8-bit samples, file is truncated
+ { name:"r11025_u8_c1_trunc.wav", type:"audio/x-wav", duration:1.8 },
+ // file has trailing non-PCM data
+ { name:"r11025_s16_c1_trailing.wav", type:"audio/x-wav", duration:1.0 },
+ // file with list chunk
+ { name:"r16000_u8_c1_list.wav", type:"audio/x-wav", duration:4.2 },
+ // file with 2 extra bytes of metadata
+ { name:"16bit_wave_extrametadata.wav", type:"audio/x-wav", duration:1.108 },
+ // 24-bit samples
+ { name:"wavedata_s24.wav", type:"audio/x-wav", duration:1.0 },
+ // aLaw compressed wave file
+ { name:"wavedata_alaw.wav", type:"audio/x-wav", duration:1.0 },
+ // uLaw compressed wave file
+ { name:"wavedata_ulaw.wav", type:"audio/x-wav", duration:1.0 },
+ // Data length 0xFFFFFFFF
+ { name:"bug1301226.wav", type:"audio/x-wav", duration:0.003673 },
+ // Data length 0xFFFFFFFF and odd chunk lengths.
+ { name:"bug1301226-odd.wav", type:"audio/x-wav", duration:0.003673 },
+
+ // Ogg stream without eof marker
+ { name:"bug461281.ogg", type:"application/ogg", duration:2.208 },
+
+ // oggz-chop stream
+ { name:"bug482461.ogv", type:"video/ogg", duration:4.34 },
+ // Theora only oggz-chop stream
+ { name:"bug482461-theora.ogv", type:"video/ogg", duration:4.138 },
+ // With first frame a "duplicate" (empty) frame.
+ { name:"bug500311.ogv", type:"video/ogg", duration:1.96 },
+ // Small audio file
+ { name:"small-shot.ogg", type:"audio/ogg", duration:0.276 },
+ // More audio in file than video.
+ { name:"short-video.ogv", type:"video/ogg", duration:1.081 },
+ // First Theora data packet is zero bytes.
+ { name:"bug504613.ogv", type:"video/ogg", duration:Number.NaN },
+ // Multiple audio streams.
+ { name:"bug516323.ogv", type:"video/ogg", duration:4.208 },
+ // oggz-chop with non-keyframe as first frame
+ { name:"bug556821.ogv", type:"video/ogg", duration:2.936 },
+
+ // Encoded with vorbis beta1, includes unusually sized codebooks
+ { name:"beta-phrasebook.ogg", type:"audio/ogg", duration:4.01 },
+ // Small file, only 1 frame with audio only.
+ { name:"bug520493.ogg", type:"audio/ogg", duration:0.458 },
+ // Small file with vorbis comments with 0 length values and names.
+ { name:"bug520500.ogg", type:"audio/ogg", duration:0.123 },
+
+ // Various weirdly formed Ogg files
+ { name:"bug499519.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug506094.ogv", type:"video/ogg", duration:0 },
+ { name:"bug498855-1.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug498855-2.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug498855-3.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug504644.ogv", type:"video/ogg", duration:1.6 },
+ { name:"chain.ogv", type:"video/ogg", duration:Number.NaN },
+ { name:"bug523816.ogv", type:"video/ogg", duration:0.766 },
+ { name:"bug495129.ogv", type:"video/ogg", duration:2.41 },
+ { name:"bug498380.ogv", type:"video/ogg", duration:0.7663 },
+ { name:"bug495794.ogg", type:"audio/ogg", duration:0.3 },
+ { name:"bug557094.ogv", type:"video/ogg", duration:0.24 },
+ { name:"multiple-bos.ogg", type:"video/ogg", duration:0.431 },
+ { name:"audio-overhang.ogg", type:"audio/ogg", duration:2.3 },
+ { name:"video-overhang.ogg", type:"audio/ogg", duration:3.966 },
+
+ // bug461281.ogg with the middle second chopped out.
+ { name:"audio-gaps.ogg", type:"audio/ogg", duration:2.208 },
+
+ // Test playback/metadata work after a redirect
+ { name:"redirect.sjs?domain=mochi.test:8888&file=320x240.ogv",
+ type:"video/ogg", duration:0.266 },
+
+ // Test playback of a webm file
+ { name:"seek-short.webm", type:"video/webm", duration:0.23 },
+
+ // Test playback of a WebM file with non-zero start time.
+ { name:"split.webm", type:"video/webm", duration:1.967 },
+
+ // Test playback of a WebM file with resolution changes.
+ { name:"resolution-change.webm", type:"video/webm", duration:6.533 },
+
+ // Test playback of a raw file
+ { name:"seek.yuv", type:"video/x-raw-yuv", duration:1.833 },
+
+ // A really short, low sample rate, single channel file. This tests whether
+ // we can handle playing files when only push very little audio data to the
+ // hardware.
+ { name:"spacestorm-1000Hz-100ms.ogg", type:"audio/ogg", duration:0.099 },
+
+ // Opus data in an ogg container
+ { name:"detodos-short.opus", type:"audio/ogg; codecs=opus", duration:0.22 },
+ // Opus data in a webm container
+ { name:"detodos-short.webm", type:"audio/webm; codecs=opus", duration:0.26 },
+ { name:"bug1066943.webm", type:"audio/webm; codecs=opus", duration:1.383 },
+
+ // Multichannel Opus in an ogg container
+ { name:"test-1-mono.opus", type:"audio/ogg; codecs=opus", duration:1.044 },
+ { name:"test-2-stereo.opus", type:"audio/ogg; codecs=opus", duration:2.925 },
+ { name:"test-3-LCR.opus", type:"audio/ogg; codecs=opus", duration:4.214 },
+ { name:"test-4-quad.opus", type:"audio/ogg; codecs=opus", duration:6.234 },
+ { name:"test-5-5.0.opus", type:"audio/ogg; codecs=opus", duration:7.558 },
+ { name:"test-6-5.1.opus", type:"audio/ogg; codecs=opus", duration:10.333 },
+ { name:"test-7-6.1.opus", type:"audio/ogg; codecs=opus", duration:11.690 },
+ { name:"test-8-7.1.opus", type:"audio/ogg; codecs=opus", duration:13.478 },
+
+ { name:"gizmo-short.mp4", type:"video/mp4", duration:0.27 },
+ // Test playback of a MP4 file with a non-zero start time (and audio starting
+ // a second later).
+ { name:"bipbop-lateaudio.mp4", type:"video/mp4" },
+
+ { name:"small-shot.m4a", type:"audio/mp4", duration:0.29 },
+ { name:"small-shot.mp3", type:"audio/mpeg", duration:0.27 },
+ { name:"owl.mp3", type:"audio/mpeg", duration:3.343 },
+ // owl.mp3 as above, but with something funny going on in the ID3v2 tag
+ // that causes DirectShow to fail.
+ { name:"owl-funny-id3.mp3", type:"audio/mpeg", duration:3.343 },
+ // owl.mp3 as above, but with something even funnier going on in the ID3v2 tag
+ // that causes DirectShow to fail.
+ { name:"owl-funnier-id3.mp3", type:"audio/mpeg", duration:3.343 },
+ // One second of silence with ~140KB of ID3 tags. Usually when the first MP3
+ // frame is at such a high offset into the file, MP3FrameParser will give up
+ // and report that the stream is not MP3. However, it does not count ID3 tags
+ // in that offset. This test case makes sure that ID3 exclusion holds.
+ { name:"huge-id3.mp3", type:"audio/mpeg", duration:1.00 },
+ // A truncated VBR MP3 with just enough frames to keep most decoders happy.
+ // The Xing header reports the length of the file to be around 10 seconds, but
+ // there is really only one second worth of data. We want MP3FrameParser to
+ // trust the header, so this should be reported as 10 seconds.
+ { name:"vbr-head.mp3", type:"audio/mpeg", duration:10.00 },
+
+ // A flac file where the STREAMINFO block was removed.
+ // It is necessary to parse the file to find an audio frame instead.
+ { name:"flac-noheader-s16.flac", type:"audio/flac", duration:4.0 },
+ { name:"flac-s24.flac", type:"audio/flac", duration:4.04 },
+ // Ogg with theora video and flac audio.
+ { name:"A4.ogv", type:"video/ogg", width:320, height:240, duration:3.13 },
+
+ // Invalid file
+ { name:"bogus.duh", type:"bogus/duh", duration:Number.NaN },
+];
+
+var gSeekToNextFrameTests = [
+ // Test playback of a WebM file with vp9 video
+ { name:"vp9-short.webm", type:"video/webm", duration:0.20 },
+ { name:"vp9cake-short.webm", type:"video/webm", duration:1.00 },
+ // oggz-chop stream
+ { name:"bug482461.ogv", type:"video/ogg", duration:4.34 },
+ // Theora only oggz-chop stream
+ { name:"bug482461-theora.ogv", type:"video/ogg", duration:4.138 },
+ // With first frame a "duplicate" (empty) frame.
+ { name:"bug500311.ogv", type:"video/ogg", duration:1.96 },
+
+ // More audio in file than video.
+ { name:"short-video.ogv", type:"video/ogg", duration:1.081 },
+ // First Theora data packet is zero bytes.
+ { name:"bug504613.ogv", type:"video/ogg", duration:Number.NaN },
+ // Multiple audio streams.
+ { name:"bug516323.ogv", type:"video/ogg", duration:4.208 },
+ // oggz-chop with non-keyframe as first frame
+ { name:"bug556821.ogv", type:"video/ogg", duration:2.936 },
+ // Various weirdly formed Ogg files
+ { name:"bug498855-1.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug498855-2.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug498855-3.ogv", type:"video/ogg", duration:0.24 },
+ { name:"bug504644.ogv", type:"video/ogg", duration:1.6 },
+
+ { name:"bug523816.ogv", type:"video/ogg", duration:0.766 },
+
+ { name:"bug498380.ogv", type:"video/ogg", duration:0.766 },
+ { name:"bug557094.ogv", type:"video/ogg", duration:0.24 },
+ { name:"multiple-bos.ogg", type:"video/ogg", duration:0.431 },
+ // Test playback/metadata work after a redirect
+ { name:"redirect.sjs?domain=mochi.test:8888&file=320x240.ogv",
+ type:"video/ogg", duration:0.266 },
+ // Test playback of a webm file
+ { name:"seek-short.webm", type:"video/webm", duration:0.23 },
+ // Test playback of a WebM file with non-zero start time.
+ { name:"split.webm", type:"video/webm", duration:1.967 },
+ // Test playback of a raw file
+ { name:"seek.yuv", type:"video/x-raw-yuv", duration:1.833 },
+
+ { name:"gizmo-short.mp4", type:"video/mp4", duration:0.27 },
+
+ // Test playback of a MP4 file with a non-zero start time (and audio starting
+ // a second later).
+ { name:"bipbop-lateaudio.mp4", type:"video/mp4" },
+];
+
+// A file for each type we can support.
+var gSnifferTests = [
+ { name:"big.wav", type:"audio/x-wav", duration:9.278982, size:102444 },
+ { name:"320x240.ogv", type:"video/ogg", width:320, height:240, duration:0.233, size:28942 },
+ { name:"seek.webm", type:"video/webm", duration:3.966, size:215529 },
+ { name:"gizmo.mp4", type:"video/mp4", duration:5.56, size:383631 },
+ // A mp3 file with id3 tags.
+ { name:"id3tags.mp3", type:"audio/mpeg", duration:0.28, size:3530},
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+// Files that contain resolution changes
+var gResolutionChangeTests = [
+ { name:"resolution-change.webm", type:"video/webm", duration:6.533 },
+];
+
+// Files we must reject as invalid.
+var gInvalidTests = [
+ { name:"invalid-m0c0.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-m0c3.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-m1c0.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-m1c9.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-m2c0.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-m2c1.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-cmap-short.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-cmap-s0c0.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-cmap-s0c2.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-cmap-s1c2.opus", type:"audio/ogg; codecs=opus"},
+ { name:"invalid-preskip.webm", type:"audio/webm; codecs=opus"},
+];
+
+var gInvalidPlayTests = [
+ { name:"invalid-excess_discard.webm", type:"audio/webm; codecs=opus"},
+ { name:"invalid-excess_neg_discard.webm", type:"audio/webm; codecs=opus"},
+ { name:"invalid-neg_discard.webm", type:"audio/webm; codecs=opus"},
+ { name:"invalid-discard_on_multi_blocks.webm", type:"audio/webm; codecs=opus"},
+];
+
+// Files to check different cases of ogg skeleton information.
+// sample-fisbone-skeleton4.ogv
+// - Skeleton v4, w/ Content-Type,Role,Name,Language,Title for both theora/vorbis
+// sample-fisbone-wrong-header.ogv
+// - Skeleton v4, wrong message field sequence for vorbis
+// multiple-bos-more-header-fields.ogg
+// - Skeleton v3, w/ Content-Type,Role,Name,Language,Title for both theora/vorbis
+// seek-short.ogv
+// - No skeleton, but theora
+// audio-gaps-short.ogg
+// - No skeleton, but vorbis
+var gMultitrackInfoOggPlayList = [
+ { name:"sample-fisbone-skeleton4.ogv", type:"video/ogg", duration:1.00 },
+ { name:"sample-fisbone-wrong-header.ogv", type:"video/ogg", duration:1.00 },
+ { name:"multiple-bos-more-header-fileds.ogg", type:"video/ogg", duration:0.431 },
+ { name:"seek-short.ogv", type:"video/ogg", duration:1.03 },
+ { name:"audio-gaps-short.ogg", type:"audio/ogg", duration:0.50 }
+];
+// Pre-parsed results of gMultitrackInfoOggPlayList.
+var gOggTrackInfoResults = {
+ "sample-fisbone-skeleton4.ogv" : {
+ "audio_id":" audio_1",
+ "audio_kind":"main",
+ "audio_language":" en-US",
+ "audio_label":" Audio track for test",
+ "video_id":" video_1",
+ "video_kind":"main",
+ "video_language":" fr",
+ "video_label":" Video track for test"
+ },
+ "sample-fisbone-wrong-header.ogv" : {
+ "audio_id":"1",
+ "audio_kind":"main",
+ "audio_language":"",
+ "audio_label":"",
+ "video_id":" video_1",
+ "video_kind":"main",
+ "video_language":" fr",
+ "video_label":" Video track for test"
+ },
+ "multiple-bos-more-header-fileds.ogg" : {
+ "audio_id":"1",
+ "audio_kind":"main",
+ "audio_language":"",
+ "audio_label":"",
+ "video_id":"2",
+ "video_kind":"main",
+ "video_language":"",
+ "video_label":""
+ },
+ "seek-short.ogv" : {
+ "video_id":"2",
+ "video_kind":"main",
+ "video_language":"",
+ "video_label":""
+ },
+ "audio-gaps-short.ogg" : {
+ "audio_id":"1",
+ "audio_kind":"main",
+ "audio_language":"",
+ "audio_label":""
+ }
+};
+
+// Converts a path/filename to a file:// URI which we can load from disk.
+// Optionally checks whether the file actually exists on disk at the location
+// we've specified.
+function fileUriToSrc(path, mustExist) {
+ // android mochitest doesn't support file://
+ if (manifestNavigator().appVersion.indexOf("Android") != -1 || SpecialPowers.Services.appinfo.name == "B2G")
+ return path;
+
+ const Ci = SpecialPowers.Ci;
+ const Cc = SpecialPowers.Cc;
+ const Cr = SpecialPowers.Cr;
+ var dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+ var f = dirSvc.get("CurWorkD", Ci.nsILocalFile);
+ var split = path.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ f.append(split[i]);
+ }
+ if (mustExist && !f.exists()) {
+ ok(false, "We expected '" + path + "' to exist, but it doesn't!");
+ }
+ return f.path;
+}
+
+// Returns true if two TimeRanges are equal, false otherwise
+function range_equals(r1, r2) {
+ if (r1.length != r2.length) {
+ return false;
+ }
+ for (var i = 0; i < r1.length; i++) {
+ if (r1.start(i) != r2.start(i) || r1.end(i) != r2.end(i)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+// These are URIs to files that we use to check that we don't leak any state
+// or other information such that script can determine stuff about a user's
+// environment. Used by test_info_leak.
+var gInfoLeakTests = [
+ {
+ type: 'video/ogg',
+ src: fileUriToSrc("tests/dom/media/test/320x240.ogv", true),
+ },{
+ type: 'video/ogg',
+ src: fileUriToSrc("tests/dom/media/test/404.ogv", false),
+ }, {
+ type: 'audio/x-wav',
+ src: fileUriToSrc("tests/dom/media/test/r11025_s16_c1.wav", true),
+ }, {
+ type: 'audio/x-wav',
+ src: fileUriToSrc("tests/dom/media/test/404.wav", false),
+ }, {
+ type: 'audio/ogg',
+ src: fileUriToSrc("tests/dom/media/test/bug461281.ogg", true),
+ }, {
+ type: 'audio/ogg',
+ src: fileUriToSrc("tests/dom/media/test/404.ogg", false),
+ }, {
+ type: 'video/webm',
+ src: fileUriToSrc("tests/dom/media/test/seek.webm", true),
+ }, {
+ type: 'video/webm',
+ src: fileUriToSrc("tests/dom/media/test/404.webm", false),
+ }, {
+ type: 'video/ogg',
+ src: 'http://localhost/404.ogv',
+ }, {
+ type: 'audio/x-wav',
+ src: 'http://localhost/404.wav',
+ }, {
+ type: 'video/webm',
+ src: 'http://localhost/404.webm',
+ }, {
+ type: 'video/ogg',
+ src: 'http://example.com/tests/dom/media/test/test_info_leak.html'
+ }, {
+ type: 'audio/ogg',
+ src: 'http://example.com/tests/dom/media/test/test_info_leak.html'
+ }
+];
+
+// These are files that must fire an error during load or playback, and do not
+// cause a crash. Used by test_playback_errors, which expects one error event
+// and no ended event. Put files of the same type together in this list so if
+// something crashes we have some idea of which backend is responsible.
+var gErrorTests = [
+ { name:"bogus.wav", type:"audio/x-wav" },
+ { name:"bogus.ogv", type:"video/ogg" },
+ { name:"448636.ogv", type:"video/ogg" },
+ { name:"bug504843.ogv", type:"video/ogg" },
+ { name:"bug501279.ogg", type:"audio/ogg" },
+ { name:"bug580982.webm", type:"video/webm" },
+ { name:"bug603918.webm", type:"video/webm" },
+ { name:"bug604067.webm", type:"video/webm" },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+function IsWindowsVistaOrLater() {
+ var re = /Windows NT (\d+.\d)/;
+ var winver = manifestNavigator().userAgent.match(re);
+ return winver && winver.length == 2 && parseFloat(winver[1]) >= 6.0;
+}
+
+// Windows' H.264 decoder cannot handle H.264 streams with resolution
+// less than 48x48 pixels. We refuse to play and error on such streams.
+if (IsWindowsVistaOrLater() &&
+ manifestVideo().canPlayType('video/mp4; codecs="avc1.42E01E"')) {
+ gErrorTests = gErrorTests.concat({name: "red-46x48.mp4", type:"video/mp4"},
+ {name: "red-48x46.mp4", type:"video/mp4"});
+}
+
+// These are files that have nontrivial duration and are useful for seeking within.
+var gSeekTests = [
+ { name:"r11025_s16_c1.wav", type:"audio/x-wav", duration:1.0 },
+ { name:"audio.wav", type:"audio/x-wav", duration:0.031247 },
+ { name:"seek.ogv", type:"video/ogg", duration:3.966 },
+ { name:"320x240.ogv", type:"video/ogg", duration:0.266 },
+ { name:"seek.webm", type:"video/webm", duration:3.966 },
+ { name:"sine.webm", type:"audio/webm", duration:4.001 },
+ { name:"bug516323.indexed.ogv", type:"video/ogg", duration:4.208333 },
+ { name:"split.webm", type:"video/webm", duration:1.967 },
+ { name:"detodos.opus", type:"audio/ogg; codecs=opus", duration:2.9135 },
+ { name:"gizmo.mp4", type:"video/mp4", duration:5.56 },
+ { name:"owl.mp3", type:"audio/mpeg", duration:3.343 },
+ { name:"bogus.duh", type:"bogus/duh", duration:123 },
+
+ // Bug 1242338: hit a numerical problem while seeking to the duration.
+ { name:"bug482461-theora.ogv", type:"video/ogg", duration:4.138 },
+];
+
+var gFastSeekTests = [
+ { name:"gizmo.mp4", type:"video/mp4", keyframes:[0, 1.0, 2.0, 3.0, 4.0, 5.0 ] },
+ // Note: Not all keyframes in the file are actually referenced in the Cues in this file.
+ { name:"seek.webm", type:"video/webm", keyframes:[0, 0.8, 1.6, 2.4, 3.2]},
+ // Note: the sync points are the points on both the audio and video streams
+ // before the keyframes. You can't just assume that the keyframes are the sync
+ // points, as the audio required for that sync point may be before the keyframe.
+ { name:"bug516323.indexed.ogv", type:"video/ogg", keyframes:[0, 0.46, 3.06] },
+];
+
+// These files are WebMs without cues. They're seekable within their buffered
+// ranges. If work renders WebMs fully seekable these files should be moved
+// into gSeekTests
+var gCuelessWebMTests = [
+ { name:"no-cues.webm", type:"video/webm", duration:3.967 },
+];
+
+// These are files that are non seekable, due to problems with the media,
+// for example broken or missing indexes.
+var gUnseekableTests = [
+ { name:"bogus.duh", type:"bogus/duh"}
+];
+
+var androidVersion = -1; // non-Android platforms
+if (manifestNavigator().userAgent.indexOf("Mobile") != -1 ||
+ manifestNavigator().userAgent.indexOf("Tablet") != -1) {
+ // See nsSystemInfo.cpp, the getProperty('version') returns different value
+ // on each platforms, so we need to distinguish the android and B2G platform.
+ var versionString = manifestNavigator().userAgent.indexOf("Android") != -1 ?
+ 'version' : 'sdk_version';
+ androidVersion = SpecialPowers.Cc['@mozilla.org/system-info;1']
+ .getService(SpecialPowers.Ci.nsIPropertyBag2)
+ .getProperty(versionString);
+}
+
+function getAndroidVersion() {
+ return androidVersion;
+}
+
+//Android supports fragmented MP4 playback from 4.3.
+//Fragmented MP4.
+if (getAndroidVersion() >= 18) {
+ gUnseekableTests = gUnseekableTests.concat([
+ { name:"street.mp4", type:"video/mp4" }
+ ]);
+}
+
+// These are files suitable for using with a "new Audio" constructor.
+var gAudioTests = [
+ { name:"r11025_s16_c1.wav", type:"audio/x-wav", duration:1.0 },
+ { name:"sound.ogg", type:"audio/ogg" },
+ { name:"owl.mp3", type:"audio/mpeg", duration:3.343 },
+ { name:"small-shot.m4a", type:"audio/mp4", duration:0.29 },
+ { name:"bogus.duh", type:"bogus/duh", duration:123 }
+];
+
+// These files ensure our handling of 404 errors is consistent across the
+// various backends.
+var g404Tests = [
+ { name:"404.wav", type:"audio/x-wav" },
+ { name:"404.ogv", type:"video/ogg" },
+ { name:"404.oga", type:"audio/ogg" },
+ { name:"404.webm", type:"video/webm" },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+// These are files suitable for testing various decoder failures that are
+// expected to fire MEDIA_ERR_DECODE. Used by test_decode_error, which expects
+// an error and emptied event, and no loadedmetadata or ended event.
+var gDecodeErrorTests = [
+ // Valid files with unsupported codecs
+ { name:"r11025_msadpcm_c1.wav", type:"audio/x-wav" },
+ { name:"dirac.ogg", type:"video/ogg" },
+ // Invalid files
+ { name:"bogus.wav", type:"audio/x-wav" },
+ { name:"bogus.ogv", type:"video/ogg" },
+
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+// These are files that are used for media fragments tests
+var gFragmentTests = [
+ { name:"big.wav", type:"audio/x-wav", duration:9.278982, size:102444 }
+];
+
+// Used by test_chaining.html. The |links| attributes is the number of links in
+// this file that we should be able to play.
+var gChainingTests = [
+ // Vorbis and Opus chained file. They have user comments |index=n| where `n`
+ // is the index of this segment in the file, 0 indexed.
+ { name:"chain.ogg", type:"audio/ogg", links: 4},
+ { name:"chain.opus", type:"audio/ogg; codec=opus", links: 4},
+ // Those files are chained files with a different number of channels in each
+ // part. This is not supported and should stop playing after the first part.
+ { name:"variable-channel.ogg", type:"audio/ogg", links: 1 },
+ { name:"variable-channel.opus", type:"audio/ogg; codec=opus", links: 1 },
+ // Those files are chained files with a different sample rate in each
+ // part. This is not supported and should stop playing after the first part.
+ { name:"variable-samplerate.ogg", type:"audio/ogg", links: 1 },
+ // Opus decoding in Firefox outputs 48 kHz PCM despite having a different
+ // original sample rate, so we can safely play Opus chained media that have
+ // different samplerate accross links.
+ { name:"variable-samplerate.opus", type:"audio/ogg; codec=opus", links: 2 },
+ // A chained video file. We don't support those, so only one link should be
+ // reported.
+ { name:"chained-video.ogv", type:"video/ogg", links: 1 },
+ // A file that consist in 4 links of audio, then another link that has video.
+ // We should stop right after the 4 audio links.
+ { name:"chained-audio-video.ogg", type:"video/ogg", links: 4 },
+ // An opus file that has two links, with a different preskip value for each
+ // link. We should be able to play both links.
+ { name:"variable-preskip.opus", type:"audio/ogg; codec=opus", links: 2 },
+ { name:"bogus.duh", type:"bogus/duh" }
+];
+
+// Videos with an aspect ratio. Used for testing that displaying frames
+// on a canvas works correctly in the case of non-standard aspect ratios.
+// See bug 874897 for an example.
+var gAspectRatioTests = [
+ { name:"VID_0001.ogg", type:"video/ogg", duration:19.966 }
+];
+
+// These are files with non-trivial tag sets.
+// Used by test_metadata.html.
+var gMetadataTests = [
+ // Ogg Vorbis files
+ { name:"short-video.ogv", tags: {
+ TITLE:"Lepidoptera",
+ ARTIST:"Epoq",
+ ALBUM:"Kahvi Collective",
+ DATE:"2002",
+ COMMENT:"http://www.kahvi.org",
+ }
+ },
+ { name:"bug516323.ogv", tags: {
+ GENRE:"Open Movie",
+ ENCODER:"Audacity",
+ TITLE:"Elephants Dream",
+ ARTIST:"Silvia Pfeiffer",
+ COMMENTS:"Audio Description"
+ }
+ },
+ { name:"bug516323.indexed.ogv", tags: {
+ GENRE:"Open Movie",
+ ENCODER:"Audacity",
+ TITLE:"Elephants Dream",
+ ARTIST:"Silvia Pfeiffer",
+ COMMENTS:"Audio Description"
+ }
+ },
+ { name:"detodos.opus", tags: {
+ title:"De todos. Para todos.",
+ artist:"Mozilla.org"
+ }
+ },
+ { name:"sound.ogg", tags: { } },
+ { name:"small-shot.ogg", tags: {
+ title:"Pew SFX"
+ }
+ },
+ { name:"badtags.ogg", tags: {
+ // We list only the valid tags here, and verify
+ // the invalid ones are filtered out.
+ title:"Invalid comments test file",
+ empty:"",
+ "":"empty",
+ "{- [(`!@\"#$%^&')] -}":"valid tag name, surprisingly"
+ // The file also includes the following invalid tags.
+ // "A description with no separator is a common problem.",
+ // "雨":"Likely, but an invalid key (non-ascii).",
+ // "not\nval\x1fid":"invalid tag name",
+ // "not~valid":"this isn't a valid name either",
+ // "not-utf-8":"invalid sequences: \xff\xfe\xfa\xfb\0eol"
+ }
+ },
+ { name:"wave_metadata.wav", tags: {
+ name:"Track Title",
+ artist:"Artist Name",
+ comments:"Comments",
+ }
+ },
+ { name:"wave_metadata_utf8.wav", tags: {
+ name:"歌曲名稱",
+ artist:"作曲者",
+ comments:"註解",
+ }
+ },
+ { name:"wave_metadata_unknown_tag.wav", tags: {
+ name:"Track Title",
+ comments:"Comments",
+ }
+ },
+ { name:"wave_metadata_bad_len.wav", tags: {
+ name:"Track Title",
+ artist:"Artist Name",
+ comments:"Comments",
+ }
+ },
+ { name:"wave_metadata_bad_no_null.wav", tags: {
+ name:"Track Title",
+ artist:"Artist Name",
+ comments:"Comments!!",
+ }
+ },
+ { name:"wave_metadata_bad_utf8.wav", tags: {
+ name:"歌曲名稱",
+ comments:"註解",
+ }
+ },
+ { name:"wavedata_u8.wav", tags: { }
+ },
+ { name:"flac-s24.flac", tags: {
+ ALBUM:"Seascapes",
+ TITLE:"(La Mer) - II. Jeux de vagues. Allegro",
+ COMPOSER:"Debussy, Claude",
+ TRACKNUMBER:"2/9",
+ DISCNUMBER:"1/1",
+ encoder:"Lavf57.41.100",
+ }
+ },
+];
+
+// Test files for Encrypted Media Extensions
+var gEMETests = [
+ {
+ name:"video-only with 2 keys",
+ tracks: [
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop-cenc-videoinit.mp4",
+ "bipbop-cenc-video1.m4s",
+ "bipbop-cenc-video2.m4s",
+ ]
+ }
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d03" : "7e5733337e5733337e5733337e573333",
+ "7e571d047e571d047e571d047e571d04" : "7e5744447e5744447e5744447e574444",
+ },
+ sessionType:"temporary",
+ sessionCount:1,
+ duration:1.60,
+ },
+ {
+ name:"video-only with 2 keys, CORS",
+ tracks: [
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop-cenc-videoinit.mp4",
+ "bipbop-cenc-video1.m4s",
+ "bipbop-cenc-video2.m4s",
+ ]
+ }
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d03" : "7e5733337e5733337e5733337e573333",
+ "7e571d047e571d047e571d047e571d04" : "7e5744447e5744447e5744447e574444",
+ },
+ sessionType:"temporary",
+ sessionCount:1,
+ crossOrigin:true,
+ duration:1.60,
+ },
+ {
+ name:"audio&video tracks, both with all keys",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop-cenc-audioinit.mp4",
+ "bipbop-cenc-audio1.m4s",
+ "bipbop-cenc-audio2.m4s",
+ "bipbop-cenc-audio3.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop-cenc-videoinit.mp4",
+ "bipbop-cenc-video1.m4s",
+ "bipbop-cenc-video2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d03" : "7e5733337e5733337e5733337e573333",
+ "7e571d047e571d047e571d047e571d04" : "7e5744447e5744447e5744447e574444",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"audio&video tracks, both with all keys, CORS",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop-cenc-audioinit.mp4",
+ "bipbop-cenc-audio1.m4s",
+ "bipbop-cenc-audio2.m4s",
+ "bipbop-cenc-audio3.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop-cenc-videoinit.mp4",
+ "bipbop-cenc-video1.m4s",
+ "bipbop-cenc-video2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d03" : "7e5733337e5733337e5733337e573333",
+ "7e571d047e571d047e571d047e571d04" : "7e5744447e5744447e5744447e574444",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ crossOrigin:true,
+ duration:1.60,
+ },
+ {
+ name:"400x300 audio&video tracks, each with its key",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_300_215kbps-cenc-audio-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-audio-key1-1.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-2.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-3.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_300_215kbps-cenc-video-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-video-key1-1.m4s",
+ "bipbop_300_215kbps-cenc-video-key1-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"640x480@624kbps audio&video tracks, each with its key",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_624kbps-cenc-audio-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-audio-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-2.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-3.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_624kbps-cenc-video-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-video-key1-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"640x480@959kbps audio&video tracks, each with its key",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_959kbps-cenc-audio-key1-init.mp4",
+ "bipbop_480_959kbps-cenc-audio-key1-1.m4s",
+ "bipbop_480_959kbps-cenc-audio-key1-2.m4s",
+ "bipbop_480_959kbps-cenc-audio-key1-3.m4s",
+ "bipbop_480_959kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_959kbps-cenc-video-key1-init.mp4",
+ "bipbop_480_959kbps-cenc-video-key1-1.m4s",
+ "bipbop_480_959kbps-cenc-video-key1-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"640x480 then 400x300, same key (1st) per track",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_624kbps-cenc-audio-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-audio-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-2.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-3.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_624kbps-cenc-video-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key1-1.m4s",
+ "bipbop_300_215kbps-cenc-video-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-video-key1-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"640x480 then 400x300, same key (2nd) per track",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_624kbps-cenc-audio-key2-init.mp4",
+ "bipbop_480_624kbps-cenc-audio-key2-1.m4s",
+ "bipbop_480_624kbps-cenc-audio-key2-2.m4s",
+ "bipbop_480_624kbps-cenc-audio-key2-3.m4s",
+ "bipbop_480_624kbps-cenc-audio-key2-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_624kbps-cenc-video-key2-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key2-1.m4s",
+ "bipbop_300_215kbps-cenc-video-key2-init.mp4",
+ "bipbop_300_215kbps-cenc-video-key2-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ "7e571d047e571d047e571d047e571d22" : "7e5744447e5744447e5744447e574422",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"640x480 with 1st keys then 400x300 with 2nd keys",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_624kbps-cenc-audio-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-audio-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-2.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-3.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_624kbps-cenc-video-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key1-1.m4s",
+ "bipbop_300_215kbps-cenc-video-key2-init.mp4",
+ "bipbop_300_215kbps-cenc-video-key2-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"400x300 with 1st keys then 640x480 with 2nd keys",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_300_215kbps-cenc-audio-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-audio-key1-1.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-2.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-3.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_300_215kbps-cenc-video-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-video-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-video-key2-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key2-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"640x480@959kbps with 1st keys then 640x480@624kbps with 2nd keys",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_959kbps-cenc-audio-key1-init.mp4",
+ "bipbop_480_959kbps-cenc-audio-key1-1.m4s",
+ "bipbop_480_959kbps-cenc-audio-key1-2.m4s",
+ "bipbop_480_959kbps-cenc-audio-key1-3.m4s",
+ "bipbop_480_959kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_959kbps-cenc-video-key1-init.mp4",
+ "bipbop_480_959kbps-cenc-video-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-video-key2-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key2-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"640x480@624kbps with 1st keys then 640x480@959kbps with 2nd keys",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_480_624kbps-cenc-audio-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-audio-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-2.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-3.m4s",
+ "bipbop_480_624kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_480_624kbps-cenc-video-key1-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key1-1.m4s",
+ "bipbop_480_959kbps-cenc-video-key2-init.mp4",
+ "bipbop_480_959kbps-cenc-video-key2-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"400x300 with presentation size 533x300",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_300wp_227kbps-cenc-audio-key1-init.mp4",
+ "bipbop_300wp_227kbps-cenc-audio-key1-1.m4s",
+ "bipbop_300wp_227kbps-cenc-audio-key1-2.m4s",
+ "bipbop_300wp_227kbps-cenc-audio-key1-3.m4s",
+ "bipbop_300wp_227kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_300wp_227kbps-cenc-video-key1-init.mp4",
+ "bipbop_300wp_227kbps-cenc-video-key1-1.m4s",
+ "bipbop_300wp_227kbps-cenc-video-key1-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"400x300 as-is then 400x300 presented as 533x300",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[
+ "bipbop_300_215kbps-cenc-audio-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-audio-key1-1.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-2.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-3.m4s",
+ "bipbop_300_215kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_300_215kbps-cenc-video-key1-init.mp4",
+ "bipbop_300_215kbps-cenc-video-key1-1.m4s",
+ "bipbop_300wp_227kbps-cenc-video-key1-init.mp4",
+ "bipbop_300wp_227kbps-cenc-video-key1-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"400x225",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_225w_175kbps-cenc-audio-key1-init.mp4",
+ "bipbop_225w_175kbps-cenc-audio-key1-1.m4s",
+ "bipbop_225w_175kbps-cenc-audio-key1-2.m4s",
+ "bipbop_225w_175kbps-cenc-audio-key1-3.m4s",
+ "bipbop_225w_175kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_225w_175kbps-cenc-video-key1-init.mp4",
+ "bipbop_225w_175kbps-cenc-video-key1-1.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"640x360",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_360w_253kbps-cenc-audio-key1-init.mp4",
+ "bipbop_360w_253kbps-cenc-audio-key1-1.m4s",
+ "bipbop_360w_253kbps-cenc-audio-key1-2.m4s",
+ "bipbop_360w_253kbps-cenc-audio-key1-3.m4s",
+ "bipbop_360w_253kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_360w_253kbps-cenc-video-key1-init.mp4",
+ "bipbop_360w_253kbps-cenc-video-key1-1.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name:"400x225 then 640x360",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_225w_175kbps-cenc-audio-key1-init.mp4",
+ "bipbop_225w_175kbps-cenc-audio-key1-1.m4s",
+ "bipbop_225w_175kbps-cenc-audio-key1-2.m4s",
+ "bipbop_225w_175kbps-cenc-audio-key1-3.m4s",
+ "bipbop_225w_175kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_225w_175kbps-cenc-video-key1-init.mp4",
+ "bipbop_225w_175kbps-cenc-video-key1-1.m4s",
+ "bipbop_360w_253kbps-cenc-video-key2-init.mp4",
+ "bipbop_360w_253kbps-cenc-video-key2-1.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name:"640x360 then 640x480",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/mp4; codecs=\"mp4a.40.2\"",
+ fragments:[ "bipbop_360w_253kbps-cenc-audio-key1-init.mp4",
+ "bipbop_360w_253kbps-cenc-audio-key1-1.m4s",
+ "bipbop_360w_253kbps-cenc-audio-key1-2.m4s",
+ "bipbop_360w_253kbps-cenc-audio-key1-3.m4s",
+ "bipbop_360w_253kbps-cenc-audio-key1-4.m4s",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/mp4; codecs=\"avc1.64000d\"",
+ fragments:[ "bipbop_360w_253kbps-cenc-video-key1-init.mp4",
+ "bipbop_360w_253kbps-cenc-video-key1-1.m4s",
+ "bipbop_480_624kbps-cenc-video-key2-init.mp4",
+ "bipbop_480_624kbps-cenc-video-key2-2.m4s",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
+ "7e571d047e571d047e571d047e571d21" : "7e5744447e5744447e5744447e574421",
+ "7e571d037e571d037e571d037e571d12" : "7e5733337e5733337e5733337e573312",
+ },
+ sessionType:"temporary",
+ sessionCount:3,
+ duration:1.60,
+ },
+ {
+ name: "WebM vorbis audio & vp8 video clearkey",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/webm; codecs=\"vorbis\"",
+ fragments:[ "bipbop_360w_253kbps-clearkey-audio.webm",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/webm; codecs=\"vp8\"",
+ fragments:[ "bipbop_360w_253kbps-clearkey-video-vp8.webm",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "f1f3ee1790527e9de47217d43835f76a" : "97b9ddc459c8d5ff23c1f2754c95abe8",
+ "8b5df745ad84145b5617c33116e35a67" : "bddfd35dd9be033ee73bc18bc1885056",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+ {
+ name: "WebM vorbis audio & vp9 video clearkey",
+ tracks: [
+ {
+ name:"audio",
+ type:"audio/webm; codecs=\"vorbis\"",
+ fragments:[ "bipbop_360w_253kbps-clearkey-audio.webm",
+ ],
+ },
+ {
+ name:"video",
+ type:"video/webm; codecs=\"vp9\"",
+ fragments:[ "bipbop_360w_253kbps-clearkey-video-vp9.webm",
+ ],
+ },
+ ],
+ keys: {
+ // "keyid" : "key"
+ "f1f3ee1790527e9de47217d43835f76a" : "97b9ddc459c8d5ff23c1f2754c95abe8",
+ "eedf63a94fa7c398ee094f123a4ee709" : "973b679a746c82f3acdb856b30e9378e",
+ },
+ sessionType:"temporary",
+ sessionCount:2,
+ duration:1.60,
+ },
+];
+
+var gEMENonMSEFailTests = [
+ {
+ name:"short-cenc.mp4",
+ audioType:"audio/mp4; codecs=\"mp4a.40.2\"",
+ videoType:"video/mp4; codecs=\"avc1.64000d\"",
+ duration:0.47,
+ },
+];
+
+// These are files that are used for video decode suspend in
+// background tabs tests.
+var gDecodeSuspendTests = [
+ { name:"gizmo.mp4", type:"video/mp4", duration:5.56 },
+ { name:"gizmo-noaudio.mp4", type:"video/mp4", duration:5.56 },
+ { name:"gizmo.webm", type:'video/webm; codecs="vp9,opus"', duration:5.56 },
+ { name:"gizmo-noaudio.webm", type:'video/webm; codecs="vp9"', duration:5.56 }
+];
+
+function checkMetadata(msg, e, test) {
+ if (test.width) {
+ is(e.videoWidth, test.width, msg + " video width");
+ }
+ if (test.height) {
+ is(e.videoHeight, test.height, msg + " video height");
+ }
+ if (test.duration) {
+ ok(Math.abs(e.duration - test.duration) < 0.1,
+ msg + " duration (" + e.duration + ") should be around " + test.duration);
+ }
+ is(!!test.keys, SpecialPowers.do_lookupGetter(e, "isEncrypted").apply(e),
+ msg + " isEncrypted should be true if we have decryption keys");
+}
+
+// Returns the first test from candidates array which we can play with the
+// installed video backends.
+function getPlayableVideo(candidates) {
+ var resources = getPlayableVideos(candidates);
+ if (resources.length > 0)
+ return resources[0];
+ return null;
+}
+
+function getPlayableVideos(candidates) {
+ var v = manifestVideo();
+ return candidates.filter(function(x){return /^video/.test(x.type) && v.canPlayType(x.type);});
+}
+
+function getPlayableAudio(candidates) {
+ var v = manifestVideo();
+ var resources = candidates.filter(function(x){return /^audio/.test(x.type) && v.canPlayType(x.type);});
+ if (resources.length > 0)
+ return resources[0];
+ return null;
+}
+
+// Returns the type of element that should be created for the given mimetype.
+function getMajorMimeType(mimetype) {
+ if (/^video/.test(mimetype)) {
+ return "video";
+ } else {
+ return "audio";
+ }
+}
+
+// Force releasing decoder to avoid timeout in waiting for decoding resource.
+function removeNodeAndSource(n) {
+ n.remove();
+ // Clearing srcObject and/or src will actually set them to some default
+ // URI that will fail to load, so make sure we don't produce a spurious
+ // bailing error.
+ n.onerror = null;
+ // reset |srcObject| first since it takes precedence over |src|.
+ n.srcObject = null;
+ n.src = "";
+ while (n.firstChild) {
+ n.removeChild(n.firstChild);
+ }
+}
+
+function once(target, name, cb) {
+ var p = new Promise(function(resolve, reject) {
+ target.addEventListener(name, function onceEvent() {
+ target.removeEventListener(name, onceEvent);
+ resolve();
+ });
+ });
+ if (cb) {
+ p.then(cb);
+ }
+ return p;
+}
+
+function TimeStamp(token) {
+ function pad(x) {
+ return (x < 10) ? "0" + x : x;
+ }
+ var now = new Date();
+ var ms = now.getMilliseconds();
+ var time = "[" +
+ pad(now.getHours()) + ":" +
+ pad(now.getMinutes()) + ":" +
+ pad(now.getSeconds()) + "." +
+ ms +
+ "]" +
+ (ms < 10 ? " " : (ms < 100 ? " " : ""));
+ return token ? (time + " " + token) : time;
+}
+
+function Log(token, msg) {
+ info(TimeStamp(token) + " " + msg);
+}
+
+// Number of tests to run in parallel.
+var PARALLEL_TESTS = 2;
+
+// Prefs to set before running tests. Use this to improve coverage of
+// conditions that might not otherwise be encountered on the test data.
+var gTestPrefs = [
+ ['media.recorder.max_memory', 1024],
+];
+
+// When true, we'll loop forever on whatever test we run. Use this to debug
+// intermittent test failures.
+const DEBUG_TEST_LOOP_FOREVER = false;
+
+// Manages a run of media tests. Runs them in chunks in order to limit
+// the number of media elements/threads running in parallel. This limits peak
+// memory use, particularly on Linux x86 where thread stacks use 10MB of
+// virtual address space.
+// Usage:
+// 1. Create a new MediaTestManager object.
+// 2. Create a test startTest function. This takes a test object and a token,
+// and performs anything necessary to start the test. The test object is an
+// element in one of the g*Tests above. Your startTest function must call
+// MediaTestManager.start(token) if it starts a test. The test object is
+// guaranteed to be playable by our supported decoders; you don't need to
+// check canPlayType.
+// 3. When your tests finishes, call MediaTestManager.finished(), passing
+// the token back to the manager. The manager may either start the next run
+// or end the mochitest if all the tests are done.
+function MediaTestManager() {
+
+ // Return how many seconds elapsed since |begin|.
+ function elapsedTime(begin) {
+ var end = new Date();
+ return (end.getTime() - begin.getTime()) / 1000;
+ }
+ // Sets up a MediaTestManager to runs through the 'tests' array, which needs
+ // to be one of, or have the same fields as, the g*Test arrays of tests. Uses
+ // the user supplied 'startTest' function to initialize the test. This
+ // function must accept two arguments, the test entry from the 'tests' array,
+ // and a token. Call MediaTestManager.started(token) if you start the test,
+ // and MediaTestManager.finished(token) when the test finishes. You don't have
+ // to start every test, but if you call started() you *must* call finish()
+ // else you'll timeout.
+ this.runTests = function(tests, startTest) {
+ this.startTime = new Date();
+ SimpleTest.info("Started " + this.startTime + " (" + this.startTime.getTime()/1000 + "s)");
+ this.testNum = 0;
+ this.tests = tests;
+ this.startTest = startTest;
+ this.tokens = [];
+ this.isShutdown = false;
+ this.numTestsRunning = 0;
+ this.handlers = {};
+
+ // Always wait for explicit finish.
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({'set': gTestPrefs}, (function() {
+ this.nextTest();
+ }).bind(this));
+
+ SimpleTest.registerCleanupFunction(function() {
+ if (this.tokens.length > 0) {
+ info("Test timed out. Remaining tests=" + this.tokens);
+ }
+ for (var token of this.tokens) {
+ var handler = this.handlers[token];
+ if (handler && handler.ontimeout) {
+ handler.ontimeout();
+ }
+ }
+ }.bind(this));
+ }
+
+ // Registers that the test corresponding to 'token' has been started.
+ // Don't call more than once per token.
+ this.started = function(token, handler) {
+ this.tokens.push(token);
+ this.numTestsRunning++;
+ this.handlers[token] = handler;
+ is(this.numTestsRunning, this.tokens.length,
+ "[started " + token + " t=" + elapsedTime(this.startTime) + "] Length of array should match number of running tests");
+ }
+
+ // Registers that the test corresponding to 'token' has finished. Call when
+ // you've finished your test. If all tests are complete this will finish the
+ // run, otherwise it may start up the next run. It's ok to call multiple times
+ // per token.
+ this.finished = function(token) {
+ var i = this.tokens.indexOf(token);
+ if (i != -1) {
+ // Remove the element from the list of running tests.
+ this.tokens.splice(i, 1);
+ }
+
+ info("[finished " + token + "] remaining= " + this.tokens);
+ this.numTestsRunning--;
+ is(this.numTestsRunning, this.tokens.length,
+ "[finished " + token + " t=" + elapsedTime(this.startTime) + "] Length of array should match number of running tests");
+ if (this.tokens.length < PARALLEL_TESTS) {
+ this.nextTest();
+ }
+ }
+
+ // Starts the next batch of tests, or finishes if they're all done.
+ // Don't call this directly, call finished(token) when you're done.
+ this.nextTest = function() {
+ while (this.testNum < this.tests.length && this.tokens.length < PARALLEL_TESTS) {
+ var test = this.tests[this.testNum];
+ var token = (test.name ? (test.name + "-"): "") + this.testNum;
+ this.testNum++;
+
+ if (DEBUG_TEST_LOOP_FOREVER && this.testNum == this.tests.length) {
+ this.testNum = 0;
+ }
+
+ // Ensure we can play the resource type.
+ if (test.type && !document.createElement('video').canPlayType(test.type))
+ continue;
+
+ // Do the init. This should start the test.
+ this.startTest(test, token);
+ }
+
+ if (this.testNum == this.tests.length &&
+ !DEBUG_TEST_LOOP_FOREVER &&
+ this.tokens.length == 0 &&
+ !this.isShutdown)
+ {
+ this.isShutdown = true;
+ if (this.onFinished) {
+ this.onFinished();
+ }
+ var onCleanup = function() {
+ var end = new Date();
+ SimpleTest.info("Finished at " + end + " (" + (end.getTime() / 1000) + "s)");
+ SimpleTest.info("Running time: " + elapsedTime(this.startTime) + "s");
+ SimpleTest.finish();
+ }.bind(this);
+ mediaTestCleanup(onCleanup);
+ return;
+ }
+ }
+}
+
+// Ensures we've got no active video or audio elements in the document, and
+// forces a GC to release the address space reserved by the decoders' threads'
+// stacks.
+function mediaTestCleanup(callback) {
+ var V = document.getElementsByTagName("video");
+ for (i=0; i<V.length; i++) {
+ removeNodeAndSource(V[i]);
+ V[i] = null;
+ }
+ var A = document.getElementsByTagName("audio");
+ for (i=0; i<A.length; i++) {
+ removeNodeAndSource(A[i]);
+ A[i] = null;
+ }
+ SpecialPowers.exactGC(callback);
+}
+
+// B2G emulator and Android 2.3 are condidered slow platforms
+function isSlowPlatform() {
+ return SpecialPowers.Services.appinfo.name == "B2G" || getAndroidVersion() == 10;
+}
+
+// Could be undefined in a page opened by the parent test page
+// like file_access_controls.html.
+if ("SimpleTest" in window) {
+ SimpleTest.requestFlakyTimeout("untriaged");
+
+ // Register timeout function to dump debugging logs.
+ SimpleTest.registerTimeoutFunction(function() {
+ for (var v of document.getElementsByTagName("video")) {
+ v.mozDumpDebugInfo();
+ }
+ for (var a of document.getElementsByTagName("audio")) {
+ a.mozDumpDebugInfo();
+ }
+ });
+}
diff --git a/dom/media/test/mochitest.ini b/dom/media/test/mochitest.ini
new file mode 100644
index 000000000..ddabf78b6
--- /dev/null
+++ b/dom/media/test/mochitest.ini
@@ -0,0 +1,922 @@
+# Media tests should be backend independent, i.e., not conditioned on ogg,
+# wave etc. (The only exception is the can_play_type tests, which
+# necessarily depend on the backend(s) configured.) As far as possible, each
+# test should work with any resource type. This makes it easy to add new
+# backends and reduces the amount of test duplication.
+
+# For each supported backend, resources that can be played by that backend
+# should be added to the lists in manifest.js. Media tests that aren't
+# testing for a bug in handling a specific resource type should pick one of
+# the lists in manifest.js and run the test for each resource in the list
+# that is supported in the current build (the canPlayType API is useful for
+# this).
+
+# To test whether a valid resource can simply be played through correctly,
+# and optionally that its metadata is read correctly, just add it to
+# gPlayTests in manifest.js. To test whether an invalid resource correctly
+# throws an error (and does not cause a crash or hang), just add it to
+# gErrorTests in manifest.js.
+
+# To test for a specific bug in handling a specific resource type, make the
+# test first check canPlayType for the type, and if it's not supported, just
+# do ok(true, "Type not supported") and stop the test.
+
+[DEFAULT]
+subsuite = media
+skip-if = android_version == '18' # Run on real devices via autophone
+support-files =
+ 16bit_wave_extrametadata.wav
+ 16bit_wave_extrametadata.wav^headers^
+ 320x240.ogv
+ 320x240.ogv^headers^
+ 448636.ogv
+ 448636.ogv^headers^
+ A4.ogv
+ A4.ogv^headers^
+ VID_0001.ogg
+ VID_0001.ogg^headers^
+ allowed.sjs
+ audio-gaps.ogg
+ audio-gaps.ogg^headers^
+ audio-gaps-short.ogg
+ audio-gaps-short.ogg^headers^
+ audio-overhang.ogg
+ audio-overhang.ogg^headers^
+ audio.wav
+ audio.wav^headers^
+ background_video.js
+ badtags.ogg
+ badtags.ogg^headers^
+ basic.vtt
+ bad-signature.vtt
+ beta-phrasebook.ogg
+ beta-phrasebook.ogg^headers^
+ big.wav
+ big.wav^headers^
+ big-short.wav
+ big-short.wav^headers^
+ bipbop-cenc-audio1.m4s
+ bipbop-cenc-audio1.m4s^headers^
+ bipbop-cenc-audio2.m4s
+ bipbop-cenc-audio2.m4s^headers^
+ bipbop-cenc-audio3.m4s
+ bipbop-cenc-audio3.m4s^headers^
+ bipbop-cenc-audioinit.mp4
+ bipbop-cenc-audioinit.mp4^headers^
+ bipbop-cenc-video1.m4s
+ bipbop-cenc-video1.m4s^headers^
+ bipbop-cenc-video2.m4s
+ bipbop-cenc-video2.m4s^headers^
+ bipbop-cenc-videoinit.mp4
+ bipbop-cenc-videoinit.mp4^headers^
+ bipbop_225w_175kbps-cenc-audio-key1-1.m4s
+ bipbop_225w_175kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key1-2.m4s
+ bipbop_225w_175kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key1-3.m4s
+ bipbop_225w_175kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key1-4.m4s
+ bipbop_225w_175kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key1-init.mp4
+ bipbop_225w_175kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_225w_175kbps-cenc-audio-key2-1.m4s
+ bipbop_225w_175kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key2-2.m4s
+ bipbop_225w_175kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key2-3.m4s
+ bipbop_225w_175kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key2-4.m4s
+ bipbop_225w_175kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_225w_175kbps-cenc-audio-key2-init.mp4
+ bipbop_225w_175kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_225w_175kbps-cenc-video-key1-1.m4s
+ bipbop_225w_175kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_225w_175kbps-cenc-video-key1-init.mp4
+ bipbop_225w_175kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_225w_175kbps-cenc-video-key2-1.m4s
+ bipbop_225w_175kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_225w_175kbps-cenc-video-key2-init.mp4
+ bipbop_225w_175kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_300_215kbps-cenc-audio-key1-1.m4s
+ bipbop_300_215kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key1-2.m4s
+ bipbop_300_215kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key1-3.m4s
+ bipbop_300_215kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key1-4.m4s
+ bipbop_300_215kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key1-init.mp4
+ bipbop_300_215kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_300_215kbps-cenc-audio-key2-1.m4s
+ bipbop_300_215kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key2-2.m4s
+ bipbop_300_215kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key2-3.m4s
+ bipbop_300_215kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key2-4.m4s
+ bipbop_300_215kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_300_215kbps-cenc-audio-key2-init.mp4
+ bipbop_300_215kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_300_215kbps-cenc-video-key1-1.m4s
+ bipbop_300_215kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_300_215kbps-cenc-video-key1-2.m4s
+ bipbop_300_215kbps-cenc-video-key1-2.m4s^headers^
+ bipbop_300_215kbps-cenc-video-key1-init.mp4
+ bipbop_300_215kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_300_215kbps-cenc-video-key2-1.m4s
+ bipbop_300_215kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_300_215kbps-cenc-video-key2-2.m4s
+ bipbop_300_215kbps-cenc-video-key2-2.m4s^headers^
+ bipbop_300_215kbps-cenc-video-key2-init.mp4
+ bipbop_300_215kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_300wp_227kbps-cenc-audio-key1-1.m4s
+ bipbop_300wp_227kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key1-2.m4s
+ bipbop_300wp_227kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key1-3.m4s
+ bipbop_300wp_227kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key1-4.m4s
+ bipbop_300wp_227kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key1-init.mp4
+ bipbop_300wp_227kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_300wp_227kbps-cenc-audio-key2-1.m4s
+ bipbop_300wp_227kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key2-2.m4s
+ bipbop_300wp_227kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key2-3.m4s
+ bipbop_300wp_227kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key2-4.m4s
+ bipbop_300wp_227kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_300wp_227kbps-cenc-audio-key2-init.mp4
+ bipbop_300wp_227kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_300wp_227kbps-cenc-video-key1-1.m4s
+ bipbop_300wp_227kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_300wp_227kbps-cenc-video-key1-2.m4s
+ bipbop_300wp_227kbps-cenc-video-key1-2.m4s^headers^
+ bipbop_300wp_227kbps-cenc-video-key1-init.mp4
+ bipbop_300wp_227kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_300wp_227kbps-cenc-video-key2-1.m4s
+ bipbop_300wp_227kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_300wp_227kbps-cenc-video-key2-2.m4s
+ bipbop_300wp_227kbps-cenc-video-key2-2.m4s^headers^
+ bipbop_300wp_227kbps-cenc-video-key2-init.mp4
+ bipbop_300wp_227kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_360w_253kbps-cenc-audio-key1-1.m4s
+ bipbop_360w_253kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key1-2.m4s
+ bipbop_360w_253kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key1-3.m4s
+ bipbop_360w_253kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key1-4.m4s
+ bipbop_360w_253kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key1-init.mp4
+ bipbop_360w_253kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_360w_253kbps-cenc-audio-key2-1.m4s
+ bipbop_360w_253kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key2-2.m4s
+ bipbop_360w_253kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key2-3.m4s
+ bipbop_360w_253kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key2-4.m4s
+ bipbop_360w_253kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_360w_253kbps-cenc-audio-key2-init.mp4
+ bipbop_360w_253kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_360w_253kbps-cenc-video-key1-1.m4s
+ bipbop_360w_253kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_360w_253kbps-cenc-video-key1-init.mp4
+ bipbop_360w_253kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_360w_253kbps-cenc-video-key2-1.m4s
+ bipbop_360w_253kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_360w_253kbps-cenc-video-key2-init.mp4
+ bipbop_360w_253kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_360w_253kbps-clearkey-audio.webm
+ bipbop_360w_253kbps-clearkey-audio.webm^headers^
+ bipbop_360w_253kbps-clearkey-video-vp8.webm
+ bipbop_360w_253kbps-clearkey-video-vp8.webm^headers^
+ bipbop_360w_253kbps-clearkey-video-vp9.webm
+ bipbop_360w_253kbps-clearkey-video-vp9.webm^headers^
+ bipbop_480_624kbps-cenc-audio-key1-1.m4s
+ bipbop_480_624kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key1-2.m4s
+ bipbop_480_624kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key1-3.m4s
+ bipbop_480_624kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key1-4.m4s
+ bipbop_480_624kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key1-init.mp4
+ bipbop_480_624kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_480_624kbps-cenc-audio-key2-1.m4s
+ bipbop_480_624kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key2-2.m4s
+ bipbop_480_624kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key2-3.m4s
+ bipbop_480_624kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key2-4.m4s
+ bipbop_480_624kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_480_624kbps-cenc-audio-key2-init.mp4
+ bipbop_480_624kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_480_624kbps-cenc-video-key1-1.m4s
+ bipbop_480_624kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_480_624kbps-cenc-video-key1-2.m4s
+ bipbop_480_624kbps-cenc-video-key1-2.m4s^headers^
+ bipbop_480_624kbps-cenc-video-key1-init.mp4
+ bipbop_480_624kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_480_624kbps-cenc-video-key2-1.m4s
+ bipbop_480_624kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_480_624kbps-cenc-video-key2-2.m4s
+ bipbop_480_624kbps-cenc-video-key2-2.m4s^headers^
+ bipbop_480_624kbps-cenc-video-key2-init.mp4
+ bipbop_480_624kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_480_959kbps-cenc-audio-key1-1.m4s
+ bipbop_480_959kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key1-2.m4s
+ bipbop_480_959kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key1-3.m4s
+ bipbop_480_959kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key1-4.m4s
+ bipbop_480_959kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key1-init.mp4
+ bipbop_480_959kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_480_959kbps-cenc-audio-key2-1.m4s
+ bipbop_480_959kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key2-2.m4s
+ bipbop_480_959kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key2-3.m4s
+ bipbop_480_959kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key2-4.m4s
+ bipbop_480_959kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_480_959kbps-cenc-audio-key2-init.mp4
+ bipbop_480_959kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_480_959kbps-cenc-video-key1-1.m4s
+ bipbop_480_959kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_480_959kbps-cenc-video-key1-2.m4s
+ bipbop_480_959kbps-cenc-video-key1-2.m4s^headers^
+ bipbop_480_959kbps-cenc-video-key1-init.mp4
+ bipbop_480_959kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_480_959kbps-cenc-video-key2-1.m4s
+ bipbop_480_959kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_480_959kbps-cenc-video-key2-2.m4s
+ bipbop_480_959kbps-cenc-video-key2-2.m4s^headers^
+ bipbop_480_959kbps-cenc-video-key2-init.mp4
+ bipbop_480_959kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_480wp_663kbps-cenc-audio-key1-1.m4s
+ bipbop_480wp_663kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key1-2.m4s
+ bipbop_480wp_663kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key1-3.m4s
+ bipbop_480wp_663kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key1-4.m4s
+ bipbop_480wp_663kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key1-init.mp4
+ bipbop_480wp_663kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_480wp_663kbps-cenc-audio-key2-1.m4s
+ bipbop_480wp_663kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key2-2.m4s
+ bipbop_480wp_663kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key2-3.m4s
+ bipbop_480wp_663kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key2-4.m4s
+ bipbop_480wp_663kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_480wp_663kbps-cenc-audio-key2-init.mp4
+ bipbop_480wp_663kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_480wp_663kbps-cenc-video-key1-1.m4s
+ bipbop_480wp_663kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_480wp_663kbps-cenc-video-key1-2.m4s
+ bipbop_480wp_663kbps-cenc-video-key1-2.m4s^headers^
+ bipbop_480wp_663kbps-cenc-video-key1-init.mp4
+ bipbop_480wp_663kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_480wp_663kbps-cenc-video-key2-1.m4s
+ bipbop_480wp_663kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_480wp_663kbps-cenc-video-key2-2.m4s
+ bipbop_480wp_663kbps-cenc-video-key2-2.m4s^headers^
+ bipbop_480wp_663kbps-cenc-video-key2-init.mp4
+ bipbop_480wp_663kbps-cenc-video-key2-init.mp4^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key1-1.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key1-2.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key1-3.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key1-4.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4
+ bipbop_480wp_1001kbps-cenc-audio-key1-init.mp4^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key2-1.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key2-2.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key2-3.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s
+ bipbop_480wp_1001kbps-cenc-audio-key2-4.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4
+ bipbop_480wp_1001kbps-cenc-audio-key2-init.mp4^headers^
+ bipbop_480wp_1001kbps-cenc-video-key1-1.m4s
+ bipbop_480wp_1001kbps-cenc-video-key1-1.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-video-key1-2.m4s
+ bipbop_480wp_1001kbps-cenc-video-key1-2.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-video-key1-init.mp4
+ bipbop_480wp_1001kbps-cenc-video-key1-init.mp4^headers^
+ bipbop_480wp_1001kbps-cenc-video-key2-1.m4s
+ bipbop_480wp_1001kbps-cenc-video-key2-1.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-video-key2-2.m4s
+ bipbop_480wp_1001kbps-cenc-video-key2-2.m4s^headers^
+ bipbop_480wp_1001kbps-cenc-video-key2-init.mp4
+ bipbop_480wp_1001kbps-cenc-video-key2-init.mp4^headers^
+ bipbop-lateaudio.mp4
+ bipbop-lateaudio.mp4^headers^
+ black100x100-aspect3to2.ogv
+ black100x100-aspect3to2.ogv^headers^
+ bogus.duh
+ bogus.ogv
+ bogus.ogv^headers^
+ bogus.wav
+ bogus.wav^headers^
+ bug461281.ogg
+ bug461281.ogg^headers^
+ bug482461-theora.ogv
+ bug482461-theora.ogv^headers^
+ bug482461.ogv
+ bug482461.ogv^headers^
+ bug495129.ogv
+ bug495129.ogv^headers^
+ bug495794.ogg
+ bug495794.ogg^headers^
+ bug498380.ogv
+ bug498380.ogv^headers^
+ bug498855-1.ogv
+ bug498855-1.ogv^headers^
+ bug498855-2.ogv
+ bug498855-2.ogv^headers^
+ bug498855-3.ogv
+ bug498855-3.ogv^headers^
+ bug499519.ogv
+ bug499519.ogv^headers^
+ bug500311.ogv
+ bug500311.ogv^headers^
+ bug501279.ogg
+ bug501279.ogg^headers^
+ bug504613.ogv
+ bug504613.ogv^headers^
+ bug504644.ogv
+ bug504644.ogv^headers^
+ bug504843.ogv
+ bug504843.ogv^headers^
+ bug506094.ogv
+ bug506094.ogv^headers^
+ bug516323.indexed.ogv
+ bug516323.indexed.ogv^headers^
+ bug516323.ogv
+ bug516323.ogv^headers^
+ bug520493.ogg
+ bug520493.ogg^headers^
+ bug520500.ogg
+ bug520500.ogg^headers^
+ bug520908.ogv
+ bug520908.ogv^headers^
+ bug523816.ogv
+ bug523816.ogv^headers^
+ bug533822.ogg
+ bug533822.ogg^headers^
+ bug556821.ogv
+ bug556821.ogv^headers^
+ bug557094.ogv
+ bug557094.ogv^headers^
+ bug580982.webm
+ bug580982.webm^headers^
+ bug603918.webm
+ bug603918.webm^headers^
+ bug604067.webm
+ bug604067.webm^headers^
+ bug883173.vtt
+ bug1066943.webm
+ bug1066943.webm^headers^
+ bug1301226.wav
+ bug1301226.wav^headers^
+ bug1301226-odd.wav
+ bug1301226-odd.wav^headers^
+ can_play_type_dash.js
+ can_play_type_ogg.js
+ can_play_type_wave.js
+ can_play_type_webm.js
+ cancellable_request.sjs
+ chain.ogg
+ chain.ogg^headers^
+ chain.ogv
+ chain.ogv^headers^
+ chain.opus
+ chain.opus^headers^
+ chained-audio-video.ogg
+ chained-audio-video.ogg^headers^
+ chained-video.ogv
+ chained-video.ogv^headers^
+ contentType.sjs
+ detodos.opus
+ detodos.opus^headers^
+ detodos.webm
+ detodos.webm^headers^
+ detodos-short.webm
+ detodos-short.webm^headers^
+ detodos-recorder-test.opus
+ detodos-recorder-test.opus^headers^
+ detodos-short.opus
+ detodos-short.opus^headers^
+ dirac.ogg
+ dirac.ogg^headers^
+ dynamic_redirect.sjs
+ dynamic_resource.sjs
+ eme.js
+ file_access_controls.html
+ flac-s24.flac
+ flac-s24.flac^headers^
+ flac-noheader-s16.flac
+ flac-noheader-s16.flac^headers^
+ fragment_noplay.js
+ fragment_play.js
+ gizmo.mp4
+ gizmo.mp4^headers^
+ gizmo-noaudio.mp4
+ gizmo-noaudio.mp4^headers^
+ gizmo-short.mp4
+ gizmo-short.mp4^headers^
+ gizmo.webm
+ gizmo.webm^headers^
+ gizmo-noaudio.webm
+ gizmo-noaudio.webm^headers^
+ huge-id3.mp3
+ huge-id3.mp3^headers^
+ id3tags.mp3
+ id3tags.mp3^headers^
+ invalid-cmap-s0c0.opus
+ invalid-cmap-s0c0.opus^headers^
+ invalid-cmap-s0c2.opus
+ invalid-cmap-s0c2.opus^headers^
+ invalid-cmap-s1c2.opus
+ invalid-cmap-s1c2.opus^headers^
+ invalid-cmap-short.opus
+ invalid-cmap-short.opus^headers^
+ invalid-discard_on_multi_blocks.webm
+ invalid-discard_on_multi_blocks.webm^headers^
+ invalid-excess_discard.webm
+ invalid-excess_discard.webm^headers^
+ invalid-excess_neg_discard.webm
+ invalid-excess_neg_discard.webm^headers^
+ invalid-m0c0.opus
+ invalid-m0c0.opus^headers^
+ invalid-m0c3.opus
+ invalid-m0c3.opus^headers^
+ invalid-m1c0.opus
+ invalid-m1c0.opus^headers^
+ invalid-m1c9.opus
+ invalid-m1c9.opus^headers^
+ invalid-m2c0.opus
+ invalid-m2c0.opus^headers^
+ invalid-m2c1.opus
+ invalid-m2c1.opus^headers^
+ invalid-neg_discard.webm
+ invalid-neg_discard.webm^headers^
+ invalid-preskip.webm
+ invalid-preskip.webm^headers^
+ long.vtt
+ manifest.js
+ multiple-bos.ogg
+ multiple-bos.ogg^headers^
+ multiple-bos-more-header-fileds.ogg
+ multiple-bos-more-header-fileds.ogg^headers^
+ no-cues.webm
+ no-cues.webm^headers^
+ notags.mp3
+ notags.mp3^headers^
+ owl-funnier-id3.mp3
+ owl-funnier-id3.mp3^headers^
+ owl-funny-id3.mp3
+ owl-funny-id3.mp3^headers^
+ owl.mp3
+ owl.mp3^headers^
+ owl-short.mp3
+ owl-short.mp3^headers^
+ parser.vtt
+ pixel_aspect_ratio.mp4
+ r11025_msadpcm_c1.wav
+ r11025_msadpcm_c1.wav^headers^
+ r11025_s16_c1.wav
+ r11025_s16_c1.wav^headers^
+ r11025_s16_c1_trailing.wav
+ r11025_s16_c1_trailing.wav^headers^
+ r11025_s16_c1-short.wav
+ r11025_s16_c1-short.wav^headers^
+ r11025_u8_c1.wav
+ r11025_u8_c1.wav^headers^
+ r11025_u8_c1_trunc.wav
+ r11025_u8_c1_trunc.wav^headers^
+ r16000_u8_c1_list.wav
+ r16000_u8_c1_list.wav^headers^
+ reactivate_helper.html
+ red-46x48.mp4
+ red-46x48.mp4^headers^
+ red-48x46.mp4
+ red-48x46.mp4^headers^
+ redirect.sjs
+ referer.sjs
+ region.vtt
+ resolution-change.webm
+ resolution-change.webm^headers^
+ sample.3gp
+ sample.3g2
+ sample-fisbone-skeleton4.ogv
+ sample-fisbone-skeleton4.ogv^headers^
+ sample-fisbone-wrong-header.ogv
+ sample-fisbone-wrong-header.ogv^headers^
+ seek.ogv
+ seek.ogv^headers^
+ seek-short.ogv
+ seek-short.ogv^headers^
+ seek.webm
+ seek.webm^headers^
+ seek-short.webm
+ seek-short.webm^headers^
+ seek.yuv
+ seek_support.js
+ seekLies.sjs
+ seek_with_sound.ogg^headers^
+ sequential.vtt
+ short-cenc.mp4
+ sine.webm
+ sine.webm^headers^
+ short.mp4
+ short.mp4^headers^
+ short-audio-fragmented-cenc-without-pssh.mp4
+ short-audio-fragmented-cenc-without-pssh.mp4^headers^
+ short-video.ogv
+ short-video.ogv^headers^
+ small-shot-mp3.mp4
+ small-shot-mp3.mp4^headers^
+ small-shot.m4a
+ small-shot.mp3
+ small-shot.mp3^headers^
+ small-shot.ogg
+ small-shot.ogg^headers^
+ small-shot.flac
+ sound.ogg
+ sound.ogg^headers^
+ spacestorm-1000Hz-100ms.ogg
+ spacestorm-1000Hz-100ms.ogg^headers^
+ split.webm
+ split.webm^headers^
+ street.mp4
+ street.mp4^headers^
+ test-1-mono.opus
+ test-1-mono.opus^headers^
+ test-2-stereo.opus
+ test-2-stereo.opus^headers^
+ test-3-LCR.opus
+ test-3-LCR.opus^headers^
+ test-4-quad.opus
+ test-4-quad.opus^headers^
+ test-5-5.0.opus
+ test-5-5.0.opus^headers^
+ test-6-5.1.opus
+ test-6-5.1.opus^headers^
+ test-7-6.1.opus
+ test-7-6.1.opus^headers^
+ test-8-7.1.opus
+ test-8-7.1.opus^headers^
+ variable-channel.ogg
+ variable-channel.ogg^headers^
+ variable-channel.opus
+ variable-channel.opus^headers^
+ variable-preskip.opus
+ variable-preskip.opus^headers^
+ variable-samplerate.ogg
+ variable-samplerate.ogg^headers^
+ variable-samplerate.opus
+ variable-samplerate.opus^headers^
+ vbr-head.mp3
+ vbr-head.mp3^headers^
+ vbr.mp3
+ vbr.mp3^headers^
+ video-overhang.ogg
+ video-overhang.ogg^headers^
+ vp9.webm
+ vp9.webm^headers^
+ vp9-short.webm
+ vp9-short.webm^headers^
+ vp9cake.webm
+ vp9cake.webm^headers^
+ vp9cake-short.webm
+ vp9cake-short.webm^headers^
+ vttPositionAlign.vtt
+ wave_metadata.wav
+ wave_metadata.wav^headers^
+ wave_metadata_bad_len.wav
+ wave_metadata_bad_len.wav^headers^
+ wave_metadata_bad_no_null.wav
+ wave_metadata_bad_no_null.wav^headers^
+ wave_metadata_bad_utf8.wav
+ wave_metadata_bad_utf8.wav^headers^
+ wave_metadata_unknown_tag.wav
+ wave_metadata_unknown_tag.wav^headers^
+ wave_metadata_utf8.wav
+ wave_metadata_utf8.wav^headers^
+ wavedata_alaw.wav
+ wavedata_alaw.wav^headers^
+ wavedata_s24.wav
+ wavedata_s24.wav^headers^
+ wavedata_s16.wav
+ wavedata_s16.wav^headers^
+ wavedata_u8.wav
+ wavedata_u8.wav^headers^
+ wavedata_ulaw.wav
+ wavedata_ulaw.wav^headers^
+ !/dom/canvas/test/captureStream_common.js
+ !/dom/html/test/reflect.js
+
+[test_access_control.html]
+[test_aspectratio_mp4.html]
+[test_audio1.html]
+[test_audio2.html]
+[test_audioDocumentTitle.html]
+skip-if = true # bug 475110 - disabled since we don't play Wave files standalone
+[test_autoplay.html]
+[test_autoplay_contentEditable.html]
+[test_buffered.html]
+[test_bug448534.html]
+[test_bug463162.xhtml]
+[test_bug465498.html]
+[test_bug495145.html]
+skip-if = (os == 'mac' && os_version == '10.6') # bug 1021174
+[test_bug495300.html]
+[test_bug654550.html]
+[test_bug686942.html]
+[test_bug726904.html]
+[test_bug874897.html]
+[test_bug879717.html]
+tags=capturestream
+[test_bug883173.html]
+[test_bug895091.html]
+tags=webvtt
+[test_bug895305.html]
+[test_bug919265.html]
+[test_bug957847.html]
+[test_bug1018933.html]
+[test_bug1113600.html]
+tags=capturestream
+[test_bug1242338.html]
+[test_bug1242594.html]
+[test_bug1248229.html]
+tags=capturestream
+[test_can_play_type.html]
+[test_can_play_type_mpeg.html]
+[test_can_play_type_no_ogg.html]
+[test_can_play_type_ogg.html]
+[test_chaining.html]
+[test_clone_media_element.html]
+[test_closing_connections.html]
+[test_constants.html]
+[test_controls.html]
+[test_cueless_webm_seek-1.html]
+[test_cueless_webm_seek-2.html]
+[test_cueless_webm_seek-3.html]
+[test_currentTime.html]
+[test_decode_error.html]
+[test_decoder_disable.html]
+[test_defaultMuted.html]
+[test_delay_load.html]
+[test_eme_session_callable_value.html]
+[test_eme_canvas_blocked.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_detach_media_keys.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_initDataTypes.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_missing_pssh.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_non_mse_fails.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_request_notifications.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_playback.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_requestKeySystemAccess.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_setMediaKeys_before_attach_MediaSource.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_stream_capture_blocked_case1.html]
+tags=msg capturestream
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_stream_capture_blocked_case2.html]
+tags=msg capturestream
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_stream_capture_blocked_case3.html]
+tags=msg capturestream
+skip-if = toolkit == 'android' # bug 1149374
+[test_eme_waitingforkey.html]
+skip-if = toolkit == 'android' # bug 1149374
+[test_empty_resource.html]
+[test_error_in_video_document.html]
+[test_error_on_404.html]
+[test_fastSeek.html]
+[test_fastSeek-forwards.html]
+[test_gmp_playback.html]
+skip-if = (os != 'win' || os_version == '5.1') # Only gmp-clearkey on Windows Vista and later decodes
+[test_imagecapture.html]
+[test_info_leak.html]
+[test_invalid_reject.html]
+[test_invalid_reject_play.html]
+[test_invalid_seek.html]
+[test_load.html]
+[test_load_candidates.html]
+[test_load_same_resource.html]
+[test_load_source.html]
+[test_loop.html]
+[test_media_selection.html]
+[test_media_sniffer.html]
+[test_mediarecorder_avoid_recursion.html]
+skip-if = os == 'win' && !debug # bug 1228605
+tags=msg
+[test_mediarecorder_bitrate.html]
+tags=msg
+[test_mediarecorder_creation.html]
+tags=msg capturestream
+[test_mediarecorder_creation_fail.html]
+tags=msg
+[test_mediarecorder_getencodeddata.html]
+tags=msg
+[test_mediarecorder_principals.html]
+skip-if = (os == 'linux' && bits == 64) # See bug 1266345
+tags=msg
+[test_mediarecorder_record_4ch_audiocontext.html]
+tags=msg
+[test_mediarecorder_record_audiocontext.html]
+tags=msg
+[test_mediarecorder_record_audiocontext_mlk.html]
+tags=msg
+[test_mediarecorder_record_audionode.html]
+tags=msg
+[test_mediarecorder_record_canvas_captureStream.html]
+tags=msg
+[test_mediarecorder_record_changing_video_resolution.html]
+tags=msg
+[test_mediarecorder_record_gum_video_timeslice.html]
+tags=msg
+[test_mediarecorder_record_immediate_stop.html]
+tags=msg capturestream
+[test_mediarecorder_record_no_timeslice.html]
+tags=msg capturestream
+[test_mediarecorder_record_session.html]
+tags=msg capturestream
+[test_mediarecorder_record_startstopstart.html]
+tags=msg
+[test_mediarecorder_record_stopms.html]
+tags=msg
+[test_mediarecorder_record_timeslice.html]
+tags=msg capturestream
+[test_mediarecorder_reload_crash.html]
+tags=msg capturestream
+[test_mediarecorder_unsupported_src.html]
+tags=msg
+[test_mediarecorder_webm_support.html]
+skip-if = os == 'android' || arch == 'arm' || arch == 'arm64'
+tags=msg
+[test_mediarecorder_record_getdata_afterstart.html]
+tags=msg capturestream
+[test_mediatrack_consuming_mediaresource.html]
+[test_mediatrack_consuming_mediastream.html]
+tags=msg
+[test_mediatrack_events.html]
+[test_mediatrack_parsing_ogg.html]
+[test_mediatrack_replay_from_end.html]
+[test_metadata.html]
+[test_mixed_principals.html]
+[test_mozHasAudio.html]
+[test_multiple_mediastreamtracks.html]
+[test_networkState.html]
+[test_new_audio.html]
+[test_no_load_event.html]
+[test_paused.html]
+[test_paused_after_ended.html]
+[test_play_events.html]
+[test_play_events_2.html]
+[test_play_twice.html]
+# Seamonkey: Bug 598252
+skip-if = appname == "seamonkey"
+[test_playback.html]
+[test_playback_errors.html]
+[test_playback_rate.html]
+[test_playback_rate_playpause.html]
+[test_playback_reactivate.html]
+[test_played.html]
+[test_preload_actions.html]
+[test_preload_attribute.html]
+[test_preload_suspend.html]
+[test_preserve_playbackrate_after_ui_play.html]
+[test_progress.html]
+[test_reactivate.html]
+[test_readyState.html]
+[test_referer.html]
+[test_replay_metadata.html]
+[test_reset_events_async.html]
+[test_reset_src.html]
+[test_video_dimensions.html]
+[test_resolution_change.html]
+tags=capturestream
+[test_resume.html]
+skip-if = true # bug 1021673
+[test_seek_negative.html]
+[test_seek_nosrc.html]
+[test_seek_out_of_range.html]
+[test_seek-1.html]
+[test_seek-2.html]
+[test_seek-3.html]
+[test_seek-4.html]
+[test_seek-5.html]
+[test_seek-6.html]
+[test_seek-7.html]
+[test_seek-8.html]
+[test_seek-9.html]
+[test_seek-10.html]
+[test_seek-11.html]
+[test_seek-12.html]
+[test_seek-13.html]
+[test_seekable1.html]
+[test_seekLies.html]
+[test_seekToNextFrame.html]
+tags=seektonextframe
+[test_source.html]
+[test_source_media.html]
+[test_source_null.html]
+[test_source_write.html]
+[test_standalone.html]
+[test_streams_autoplay.html]
+tags=msg capturestream
+[test_streams_capture_origin.html]
+tags=msg capturestream
+[test_streams_element_capture.html]
+tags=msg capturestream
+[test_streams_element_capture_createObjectURL.html]
+tags=msg capturestream
+[test_streams_element_capture_playback.html]
+tags=msg capturestream
+[test_streams_element_capture_reset.html]
+tags=msg capturestream
+[test_streams_gc.html]
+tags=msg capturestream
+[test_streams_individual_pause.html]
+tags=msg
+[test_streams_srcObject.html]
+tags=msg capturestream
+[test_streams_tracks.html]
+tags=msg capturestream
+[test_texttrack.html]
+tags = webvtt
+[test_texttrackcue.html]
+tags = webvtt
+[test_texttrackcue_moz.html]
+tags = webvtt
+[test_texttrackevents_video.html]
+tags = webvtt
+[test_texttracklist.html]
+tags = webvtt
+[test_texttracklist_moz.html]
+tags = webvtt
+[test_texttrackregion.html]
+tags = webvtt
+[test_texttrack_moz.html]
+tags = webvtt
+[test_timeupdate_small_files.html]
+[test_trackelementevent.html]
+tags = webvtt
+[test_trackelementsrc.html]
+tags = webvtt
+[test_trackevent.html]
+tags = webvtt
+[test_unseekable.html]
+[test_video_to_canvas.html]
+[test_video_in_audio_element.html]
+[test_videoDocumentTitle.html]
+[test_VideoPlaybackQuality.html]
+[test_VideoPlaybackQuality_disabled.html]
+[test_volume.html]
+[test_vttparser.html]
+tags = webvtt
+[test_webvtt_empty_displaystate.html]
+tags = webvtt
+[test_webvtt_positionalign.html]
+tags = webvtt
+
+# The tests below contain backend-specific tests. Write backend independent
+# tests rather than adding to this list.
+[test_can_play_type_webm.html]
+[test_can_play_type_wave.html]
+[test_fragment_noplay.html]
+[test_fragment_play.html]
+
+[test_background_video_suspend.html]
+tags = suspend
+[test_background_video_suspend_ends.html]
+tags = suspend
+[test_background_video_no_suspend_short_vid.html]
+tags = suspend
+[test_background_video_no_suspend_disabled.html]
+tags = suspend
+[test_temporary_file_blob_video_plays.html]
diff --git a/dom/media/test/multiple-bos-more-header-fileds.ogg b/dom/media/test/multiple-bos-more-header-fileds.ogg
new file mode 100644
index 000000000..c9721cb98
--- /dev/null
+++ b/dom/media/test/multiple-bos-more-header-fileds.ogg
Binary files differ
diff --git a/dom/media/test/multiple-bos-more-header-fileds.ogg^headers^ b/dom/media/test/multiple-bos-more-header-fileds.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/multiple-bos-more-header-fileds.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/multiple-bos.ogg b/dom/media/test/multiple-bos.ogg
new file mode 100644
index 000000000..193200868
--- /dev/null
+++ b/dom/media/test/multiple-bos.ogg
Binary files differ
diff --git a/dom/media/test/multiple-bos.ogg^headers^ b/dom/media/test/multiple-bos.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/multiple-bos.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/no-cues.webm b/dom/media/test/no-cues.webm
new file mode 100644
index 000000000..8ed761099
--- /dev/null
+++ b/dom/media/test/no-cues.webm
Binary files differ
diff --git a/dom/media/test/no-cues.webm^headers^ b/dom/media/test/no-cues.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/no-cues.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/notags.mp3 b/dom/media/test/notags.mp3
new file mode 100644
index 000000000..7f298131a
--- /dev/null
+++ b/dom/media/test/notags.mp3
Binary files differ
diff --git a/dom/media/test/notags.mp3^headers^ b/dom/media/test/notags.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/notags.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/owl-funnier-id3.mp3 b/dom/media/test/owl-funnier-id3.mp3
new file mode 100644
index 000000000..05ec50753
--- /dev/null
+++ b/dom/media/test/owl-funnier-id3.mp3
Binary files differ
diff --git a/dom/media/test/owl-funnier-id3.mp3^headers^ b/dom/media/test/owl-funnier-id3.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/owl-funnier-id3.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/owl-funny-id3.mp3 b/dom/media/test/owl-funny-id3.mp3
new file mode 100644
index 000000000..6533755a3
--- /dev/null
+++ b/dom/media/test/owl-funny-id3.mp3
Binary files differ
diff --git a/dom/media/test/owl-funny-id3.mp3^headers^ b/dom/media/test/owl-funny-id3.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/owl-funny-id3.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/owl-short.mp3 b/dom/media/test/owl-short.mp3
new file mode 100644
index 000000000..9b31531f2
--- /dev/null
+++ b/dom/media/test/owl-short.mp3
Binary files differ
diff --git a/dom/media/test/owl-short.mp3^headers^ b/dom/media/test/owl-short.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/owl-short.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/owl.mp3 b/dom/media/test/owl.mp3
new file mode 100644
index 000000000..9fafa32f9
--- /dev/null
+++ b/dom/media/test/owl.mp3
Binary files differ
diff --git a/dom/media/test/owl.mp3^headers^ b/dom/media/test/owl.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/owl.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/parser.vtt b/dom/media/test/parser.vtt
new file mode 100644
index 000000000..2a56c65f8
--- /dev/null
+++ b/dom/media/test/parser.vtt
@@ -0,0 +1,6 @@
+WEBVTT
+
+00:00.500 --> 00:00.700
+Test
+00:00.500 --> 00:00.700
+Stuff
diff --git a/dom/media/test/pixel_aspect_ratio.mp4 b/dom/media/test/pixel_aspect_ratio.mp4
new file mode 100644
index 000000000..fce12cc03
--- /dev/null
+++ b/dom/media/test/pixel_aspect_ratio.mp4
Binary files differ
diff --git a/dom/media/test/r11025_msadpcm_c1.wav b/dom/media/test/r11025_msadpcm_c1.wav
new file mode 100644
index 000000000..2e883ba5e
--- /dev/null
+++ b/dom/media/test/r11025_msadpcm_c1.wav
Binary files differ
diff --git a/dom/media/test/r11025_msadpcm_c1.wav^headers^ b/dom/media/test/r11025_msadpcm_c1.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r11025_msadpcm_c1.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/r11025_s16_c1-short.wav b/dom/media/test/r11025_s16_c1-short.wav
new file mode 100644
index 000000000..e08d5bbdc
--- /dev/null
+++ b/dom/media/test/r11025_s16_c1-short.wav
Binary files differ
diff --git a/dom/media/test/r11025_s16_c1-short.wav^headers^ b/dom/media/test/r11025_s16_c1-short.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r11025_s16_c1-short.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/r11025_s16_c1.wav b/dom/media/test/r11025_s16_c1.wav
new file mode 100644
index 000000000..ab2e08bef
--- /dev/null
+++ b/dom/media/test/r11025_s16_c1.wav
Binary files differ
diff --git a/dom/media/test/r11025_s16_c1.wav^headers^ b/dom/media/test/r11025_s16_c1.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r11025_s16_c1.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/r11025_s16_c1_trailing.wav b/dom/media/test/r11025_s16_c1_trailing.wav
new file mode 100644
index 000000000..af53beaf2
--- /dev/null
+++ b/dom/media/test/r11025_s16_c1_trailing.wav
Binary files differ
diff --git a/dom/media/test/r11025_s16_c1_trailing.wav^headers^ b/dom/media/test/r11025_s16_c1_trailing.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r11025_s16_c1_trailing.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/r11025_u8_c1.wav b/dom/media/test/r11025_u8_c1.wav
new file mode 100644
index 000000000..97dc453b9
--- /dev/null
+++ b/dom/media/test/r11025_u8_c1.wav
Binary files differ
diff --git a/dom/media/test/r11025_u8_c1.wav^headers^ b/dom/media/test/r11025_u8_c1.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r11025_u8_c1.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/r11025_u8_c1_trunc.wav b/dom/media/test/r11025_u8_c1_trunc.wav
new file mode 100644
index 000000000..4d2db3977
--- /dev/null
+++ b/dom/media/test/r11025_u8_c1_trunc.wav
Binary files differ
diff --git a/dom/media/test/r11025_u8_c1_trunc.wav^headers^ b/dom/media/test/r11025_u8_c1_trunc.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r11025_u8_c1_trunc.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/r16000_u8_c1_list.wav b/dom/media/test/r16000_u8_c1_list.wav
new file mode 100644
index 000000000..afde32e9a
--- /dev/null
+++ b/dom/media/test/r16000_u8_c1_list.wav
Binary files differ
diff --git a/dom/media/test/r16000_u8_c1_list.wav^headers^ b/dom/media/test/r16000_u8_c1_list.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/r16000_u8_c1_list.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/reactivate_helper.html b/dom/media/test/reactivate_helper.html
new file mode 100644
index 000000000..af4c8b9ca
--- /dev/null
+++ b/dom/media/test/reactivate_helper.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<script>
+var loadsWaiting = 0;
+var elements = [];
+
+function checkAllLoaded() {
+ --loadsWaiting;
+ if (loadsWaiting == 0) {
+ parent.loadedAll(elements);
+ }
+}
+
+function loadedData(event) {
+ var e = event.target;
+ parent.ok(elements.indexOf(e) == -1, "Element already loaded: " + e._name);
+ parent.info("Loaded " + e._name);
+ elements.push(e);
+ // Reset "onerror" handler to avoid triggering another error in removeNodeAndSource().
+ e.onerror = null;
+ checkAllLoaded();
+
+}
+
+function error(event) {
+ var e = event.target;
+ parent.info("Error " + e._name);
+ // Don't wait for the element encounting errors.
+ checkAllLoaded();
+}
+
+for (var i = 0; i < parent.gSmallTests.length; ++i) {
+ var test = parent.gSmallTests[i];
+ var elemType = /^audio/.test(test.type) ? "audio" : "video";
+ // Associate these elements with the subframe's document
+ var e = document.createElement(elemType);
+ e.preload = "metadata";
+ if (e.canPlayType(test.type)) {
+ e.src = test.name;
+ e._name = test.name;
+ e.onloadeddata = loadedData;
+ e.onerror = error;
+ e.load();
+ ++loadsWaiting;
+ parent.info("Loading " + e._name);
+ }
+}
+
+if (loadsWaiting == 0) {
+ parent.todo(false, "Can't play anything");
+} else {
+ parent.SimpleTest.waitForExplicitFinish();
+}
+</script>
+</body>
+</html>
diff --git a/dom/media/test/red-46x48.mp4 b/dom/media/test/red-46x48.mp4
new file mode 100644
index 000000000..0760cc1c1
--- /dev/null
+++ b/dom/media/test/red-46x48.mp4
Binary files differ
diff --git a/dom/media/test/red-46x48.mp4^headers^ b/dom/media/test/red-46x48.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/red-46x48.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/red-48x46.mp4 b/dom/media/test/red-48x46.mp4
new file mode 100644
index 000000000..d83de4027
--- /dev/null
+++ b/dom/media/test/red-48x46.mp4
Binary files differ
diff --git a/dom/media/test/red-48x46.mp4^headers^ b/dom/media/test/red-48x46.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/red-48x46.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/redirect.sjs b/dom/media/test/redirect.sjs
new file mode 100644
index 000000000..1653e8efc
--- /dev/null
+++ b/dom/media/test/redirect.sjs
@@ -0,0 +1,26 @@
+function parseQuery(request, key) {
+ var params = request.queryString.split('&');
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") == 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key == "")
+ return p;
+ }
+ return false;
+}
+
+// Return file content for the first request with a given key.
+// All subsequent requests return a redirect to a different-origin resource.
+function handleRequest(request, response)
+{
+ var domain = parseQuery(request, "domain");
+ var file = parseQuery(request, "file");
+ var allowed = parseQuery(request, "allowed");
+
+ response.setStatusLine(request.httpVersion, 303, "See Other");
+ response.setHeader("Location", "http://" + domain + "/tests/dom/media/test/" + (allowed ? "allowed.sjs?" : "") + file);
+ response.setHeader("Content-Type", "text/html");
+}
diff --git a/dom/media/test/referer.sjs b/dom/media/test/referer.sjs
new file mode 100644
index 000000000..1ddec5721
--- /dev/null
+++ b/dom/media/test/referer.sjs
@@ -0,0 +1,45 @@
+function parseQuery(request, key) {
+ var params = request.queryString.split('&');
+ for (var j = 0; j < params.length; ++j) {
+ var p = params[j];
+ if (p == key)
+ return true;
+ if (p.indexOf(key + "=") == 0)
+ return p.substring(key.length + 1);
+ if (p.indexOf("=") < 0 && key == "")
+ return p;
+ }
+ return false;
+}
+
+function handleRequest(request, response)
+{
+ var referer = request.hasHeader("Referer") ? request.getHeader("Referer")
+ : undefined;
+ if (referer == "http://mochi.test:8888/tests/dom/media/test/test_referer.html") {
+ var name = parseQuery(request, "name");
+ var type = parseQuery(request, "type");
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/test/" + name;
+ var split = paths.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+ bis.setInputStream(fis);
+ var bytes = bis.readBytes(bis.available());
+ response.setHeader("Content-Length", ""+bytes.length, false);
+ response.setHeader("Content-Type", type, false);
+ response.write(bytes, bytes.length);
+ bis.close();
+ }
+ else {
+ response.setStatusLine(request.httpVersion, 404, "Not found");
+ }
+}
diff --git a/dom/media/test/region.vtt b/dom/media/test/region.vtt
new file mode 100644
index 000000000..883341fc6
--- /dev/null
+++ b/dom/media/test/region.vtt
@@ -0,0 +1,5 @@
+WEBVTT
+Region: id=fred width=62% lines=5 regionanchor=4%,78% viewportanchor=10%,90% scroll=up
+
+00:01.000 --> 00:02.000 region:fred
+Test here.
diff --git a/dom/media/test/resolution-change.webm b/dom/media/test/resolution-change.webm
new file mode 100644
index 000000000..29aad93b9
--- /dev/null
+++ b/dom/media/test/resolution-change.webm
Binary files differ
diff --git a/dom/media/test/resolution-change.webm^headers^ b/dom/media/test/resolution-change.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/resolution-change.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/sample-fisbone-skeleton4.ogv b/dom/media/test/sample-fisbone-skeleton4.ogv
new file mode 100644
index 000000000..8afe0be7a
--- /dev/null
+++ b/dom/media/test/sample-fisbone-skeleton4.ogv
Binary files differ
diff --git a/dom/media/test/sample-fisbone-skeleton4.ogv^headers^ b/dom/media/test/sample-fisbone-skeleton4.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/sample-fisbone-skeleton4.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/sample-fisbone-wrong-header.ogv b/dom/media/test/sample-fisbone-wrong-header.ogv
new file mode 100644
index 000000000..46c3933da
--- /dev/null
+++ b/dom/media/test/sample-fisbone-wrong-header.ogv
Binary files differ
diff --git a/dom/media/test/sample-fisbone-wrong-header.ogv^headers^ b/dom/media/test/sample-fisbone-wrong-header.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/sample-fisbone-wrong-header.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/sample.3g2 b/dom/media/test/sample.3g2
new file mode 100644
index 000000000..769cb01db
--- /dev/null
+++ b/dom/media/test/sample.3g2
Binary files differ
diff --git a/dom/media/test/sample.3gp b/dom/media/test/sample.3gp
new file mode 100644
index 000000000..4a3d8ea66
--- /dev/null
+++ b/dom/media/test/sample.3gp
Binary files differ
diff --git a/dom/media/test/seek-short.ogv b/dom/media/test/seek-short.ogv
new file mode 100644
index 000000000..a5ca6951d
--- /dev/null
+++ b/dom/media/test/seek-short.ogv
Binary files differ
diff --git a/dom/media/test/seek-short.ogv^headers^ b/dom/media/test/seek-short.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/seek-short.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/seek-short.webm b/dom/media/test/seek-short.webm
new file mode 100644
index 000000000..36abd1570
--- /dev/null
+++ b/dom/media/test/seek-short.webm
Binary files differ
diff --git a/dom/media/test/seek-short.webm^headers^ b/dom/media/test/seek-short.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/seek-short.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/seek.ogv b/dom/media/test/seek.ogv
new file mode 100644
index 000000000..ac7ece351
--- /dev/null
+++ b/dom/media/test/seek.ogv
Binary files differ
diff --git a/dom/media/test/seek.ogv^headers^ b/dom/media/test/seek.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/seek.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/seek.webm b/dom/media/test/seek.webm
new file mode 100644
index 000000000..72b029723
--- /dev/null
+++ b/dom/media/test/seek.webm
Binary files differ
diff --git a/dom/media/test/seek.webm^headers^ b/dom/media/test/seek.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/seek.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/seek.yuv b/dom/media/test/seek.yuv
new file mode 100644
index 000000000..69485e8e1
--- /dev/null
+++ b/dom/media/test/seek.yuv
Binary files differ
diff --git a/dom/media/test/seekLies.sjs b/dom/media/test/seekLies.sjs
new file mode 100644
index 000000000..d9c6fd051
--- /dev/null
+++ b/dom/media/test/seekLies.sjs
@@ -0,0 +1,23 @@
+function handleRequest(request, response)
+{
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/test/seek.ogv";
+ var split = paths.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+ bis.setInputStream(fis);
+ var bytes = bis.readBytes(bis.available());
+ response.setHeader("Content-Length", ""+bytes.length, false);
+ response.setHeader("Content-Type", "video/ogg", false);
+ response.setHeader("Accept-Ranges", "bytes", false);
+ response.write(bytes, bytes.length);
+ bis.close();
+}
diff --git a/dom/media/test/seek_support.js b/dom/media/test/seek_support.js
new file mode 100644
index 000000000..b193fb60a
--- /dev/null
+++ b/dom/media/test/seek_support.js
@@ -0,0 +1,55 @@
+SimpleTest.requestLongerTimeout(3);
+var manager = new MediaTestManager;
+
+// https://bugzilla.mozilla.org/show_bug.cgi?id=634747
+if (navigator.platform.startsWith("Win")) {
+ SimpleTest.expectAssertions(0, 5);
+} else {
+ // This is "###!!! ASSERTION: Page read cursor should be inside range: 'mPageOffset <= endOffset'"
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=846769
+ SimpleTest.expectAssertions(0, 5);
+}
+
+function createTestArray() {
+ var tests = [];
+ var tmpVid = document.createElement("video");
+
+ for (var testNum=0; testNum<gSeekTests.length; testNum++) {
+ var test = gSeekTests[testNum];
+ if (!tmpVid.canPlayType(test.type)) {
+ continue;
+ }
+
+ var t = new Object;
+ t.name = test.name;
+ t.type = test.type;
+ t.duration = test.duration;
+ t.number = SEEK_TEST_NUMBER;
+ tests.push(t);
+ }
+ return tests;
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.token = token += "-seek" + test.number + ".js";
+ manager.started(v.token);
+ v.src = test.name;
+ v.preload = "metadata";
+ document.body.appendChild(v);
+ var name = test.name + " seek test " + test.number;
+ var localIs = function(name) { return function(a, b, msg) {
+ is(a, b, name + ": " + msg);
+ }}(name);
+ var localOk = function(name) { return function(a, msg) {
+ ok(a, name + ": " + msg);
+ }}(name);
+ var localFinish = function(v, manager) { return function() {
+ v.onerror = null;
+ removeNodeAndSource(v);
+ dump("SEEK-TEST: Finished " + name + " token: " + v.token + "\n");
+ manager.finished(v.token);
+ }}(v, manager);
+ dump("SEEK-TEST: Started " + name + "\n");
+ window['test_seek' + test.number](v, test.duration/2, localIs, localOk, localFinish);
+}
diff --git a/dom/media/test/seek_with_sound.ogg b/dom/media/test/seek_with_sound.ogg
new file mode 100644
index 000000000..c86d9946b
--- /dev/null
+++ b/dom/media/test/seek_with_sound.ogg
Binary files differ
diff --git a/dom/media/test/seek_with_sound.ogg^headers^ b/dom/media/test/seek_with_sound.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/seek_with_sound.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/sequential.vtt b/dom/media/test/sequential.vtt
new file mode 100644
index 000000000..94e92e38a
--- /dev/null
+++ b/dom/media/test/sequential.vtt
@@ -0,0 +1,10 @@
+WEBVTT
+
+00:01.000 --> 00:02.000
+This
+
+00:03.000 --> 00:04.000
+Is
+
+00:05.000 --> 00:06.000
+A Test
diff --git a/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4 b/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4
new file mode 100644
index 000000000..bc5862399
--- /dev/null
+++ b/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4
Binary files differ
diff --git a/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4^headers^ b/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/short-cenc.mp4 b/dom/media/test/short-cenc.mp4
new file mode 100644
index 000000000..aa44c3b9a
--- /dev/null
+++ b/dom/media/test/short-cenc.mp4
Binary files differ
diff --git a/dom/media/test/short-cenc.xml b/dom/media/test/short-cenc.xml
new file mode 100644
index 000000000..9658c3e32
--- /dev/null
+++ b/dom/media/test/short-cenc.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ This XML file describes the encryption applied to short-cenc.mp4. To generate
+ short-cenc, run the following command:
+
+ MP4Box -crypt short-cenc.xml -out short-cenc.mp4 short.mp4
+-->
+
+<GPACDRM type="CENC AES-CTR">
+
+ <DRMInfo type="pssh" version="1">
+ <!--
+ SystemID specified in
+ https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/cenc-format.html
+ -->
+ <BS ID128="1077efecc0b24d02ace33c1e52e2fb4b" />
+ <!-- Number of KeyIDs = 2 -->
+ <BS bits="32" value="2" />
+ <!-- KeyID -->
+ <BS ID128="0x7e571d017e571d017e571d017e571d01" />
+ <BS ID128="0x7e571d027e571d027e571d027e571d02" />
+ </DRMInfo>
+
+ <CrypTrack trackID="1" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d017e571d017e571d017e571d01"
+ value="0x7e5711117e5711117e5711117e571111" />
+ </CrypTrack>
+
+ <CrypTrack trackID="2" isEncrypted="1" IV_size="16" saiSavedBox="senc"
+ first_IV="0x00000000000000000000000000000000">
+ <key KID="0x7e571d027e571d027e571d027e571d02"
+ value="0x7e5722227e5722227e5722227e572222" />
+ </CrypTrack>
+
+</GPACDRM>
diff --git a/dom/media/test/short-video.ogv b/dom/media/test/short-video.ogv
new file mode 100644
index 000000000..68dee3cf2
--- /dev/null
+++ b/dom/media/test/short-video.ogv
Binary files differ
diff --git a/dom/media/test/short-video.ogv^headers^ b/dom/media/test/short-video.ogv^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/short-video.ogv^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/short.mp4 b/dom/media/test/short.mp4
new file mode 100644
index 000000000..a674b7eb6
--- /dev/null
+++ b/dom/media/test/short.mp4
Binary files differ
diff --git a/dom/media/test/short.mp4^headers^ b/dom/media/test/short.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/short.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/sine.webm b/dom/media/test/sine.webm
new file mode 100644
index 000000000..3913ffa87
--- /dev/null
+++ b/dom/media/test/sine.webm
Binary files differ
diff --git a/dom/media/test/sine.webm^headers^ b/dom/media/test/sine.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/sine.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/small-shot-mp3.mp4 b/dom/media/test/small-shot-mp3.mp4
new file mode 100644
index 000000000..61fe0ac71
--- /dev/null
+++ b/dom/media/test/small-shot-mp3.mp4
Binary files differ
diff --git a/dom/media/test/small-shot-mp3.mp4^headers^ b/dom/media/test/small-shot-mp3.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/small-shot-mp3.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/small-shot.flac b/dom/media/test/small-shot.flac
new file mode 100644
index 000000000..0da7c9044
--- /dev/null
+++ b/dom/media/test/small-shot.flac
Binary files differ
diff --git a/dom/media/test/small-shot.m4a b/dom/media/test/small-shot.m4a
new file mode 100644
index 000000000..51a23c5b4
--- /dev/null
+++ b/dom/media/test/small-shot.m4a
Binary files differ
diff --git a/dom/media/test/small-shot.mp3 b/dom/media/test/small-shot.mp3
new file mode 100644
index 000000000..f9397a510
--- /dev/null
+++ b/dom/media/test/small-shot.mp3
Binary files differ
diff --git a/dom/media/test/small-shot.mp3^headers^ b/dom/media/test/small-shot.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/small-shot.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/small-shot.ogg b/dom/media/test/small-shot.ogg
new file mode 100644
index 000000000..1a41623f8
--- /dev/null
+++ b/dom/media/test/small-shot.ogg
Binary files differ
diff --git a/dom/media/test/small-shot.ogg^headers^ b/dom/media/test/small-shot.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/small-shot.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/sound.ogg b/dom/media/test/sound.ogg
new file mode 100644
index 000000000..edda4e912
--- /dev/null
+++ b/dom/media/test/sound.ogg
Binary files differ
diff --git a/dom/media/test/sound.ogg^headers^ b/dom/media/test/sound.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/sound.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/spacestorm-1000Hz-100ms.ogg b/dom/media/test/spacestorm-1000Hz-100ms.ogg
new file mode 100644
index 000000000..994041e1b
--- /dev/null
+++ b/dom/media/test/spacestorm-1000Hz-100ms.ogg
Binary files differ
diff --git a/dom/media/test/spacestorm-1000Hz-100ms.ogg^headers^ b/dom/media/test/spacestorm-1000Hz-100ms.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/spacestorm-1000Hz-100ms.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/split.webm b/dom/media/test/split.webm
new file mode 100644
index 000000000..9207017fb
--- /dev/null
+++ b/dom/media/test/split.webm
Binary files differ
diff --git a/dom/media/test/split.webm^headers^ b/dom/media/test/split.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/split.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/street.mp4 b/dom/media/test/street.mp4
new file mode 100644
index 000000000..837d23b38
--- /dev/null
+++ b/dom/media/test/street.mp4
Binary files differ
diff --git a/dom/media/test/street.mp4^headers^ b/dom/media/test/street.mp4^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/street.mp4^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-1-mono.opus b/dom/media/test/test-1-mono.opus
new file mode 100644
index 000000000..d5198e9ce
--- /dev/null
+++ b/dom/media/test/test-1-mono.opus
Binary files differ
diff --git a/dom/media/test/test-1-mono.opus^headers^ b/dom/media/test/test-1-mono.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-1-mono.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-2-stereo.opus b/dom/media/test/test-2-stereo.opus
new file mode 100644
index 000000000..7115cac24
--- /dev/null
+++ b/dom/media/test/test-2-stereo.opus
Binary files differ
diff --git a/dom/media/test/test-2-stereo.opus^headers^ b/dom/media/test/test-2-stereo.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-2-stereo.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-3-LCR.opus b/dom/media/test/test-3-LCR.opus
new file mode 100644
index 000000000..145536f3e
--- /dev/null
+++ b/dom/media/test/test-3-LCR.opus
Binary files differ
diff --git a/dom/media/test/test-3-LCR.opus^headers^ b/dom/media/test/test-3-LCR.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-3-LCR.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-4-quad.opus b/dom/media/test/test-4-quad.opus
new file mode 100644
index 000000000..731b867b2
--- /dev/null
+++ b/dom/media/test/test-4-quad.opus
Binary files differ
diff --git a/dom/media/test/test-4-quad.opus^headers^ b/dom/media/test/test-4-quad.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-4-quad.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-5-5.0.opus b/dom/media/test/test-5-5.0.opus
new file mode 100644
index 000000000..7eb2faa81
--- /dev/null
+++ b/dom/media/test/test-5-5.0.opus
Binary files differ
diff --git a/dom/media/test/test-5-5.0.opus^headers^ b/dom/media/test/test-5-5.0.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-5-5.0.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-6-5.1.opus b/dom/media/test/test-6-5.1.opus
new file mode 100644
index 000000000..526515eb7
--- /dev/null
+++ b/dom/media/test/test-6-5.1.opus
Binary files differ
diff --git a/dom/media/test/test-6-5.1.opus^headers^ b/dom/media/test/test-6-5.1.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-6-5.1.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-7-6.1.opus b/dom/media/test/test-7-6.1.opus
new file mode 100644
index 000000000..8b6a7ce32
--- /dev/null
+++ b/dom/media/test/test-7-6.1.opus
Binary files differ
diff --git a/dom/media/test/test-7-6.1.opus^headers^ b/dom/media/test/test-7-6.1.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-7-6.1.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test-8-7.1.opus b/dom/media/test/test-8-7.1.opus
new file mode 100644
index 000000000..e56176a30
--- /dev/null
+++ b/dom/media/test/test-8-7.1.opus
Binary files differ
diff --git a/dom/media/test/test-8-7.1.opus^headers^ b/dom/media/test/test-8-7.1.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/test-8-7.1.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/test_VideoPlaybackQuality.html b/dom/media/test/test_VideoPlaybackQuality.html
new file mode 100644
index 000000000..be051c0a6
--- /dev/null
+++ b/dom/media/test/test_VideoPlaybackQuality.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test basic functionality of VideoPlaybackQuality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function test() {
+ var video = document.createElement("video");
+ ok(video.getVideoPlaybackQuality, "getVideoPlaybackQuality should be exposed with pref set");
+
+ var vpq = video.getVideoPlaybackQuality();
+ ok(vpq, "getVideoPlaybackQuality should return an object");
+ ok(vpq.creationTime <= performance.now(), "creationTime should be in the past");
+ is(vpq.totalVideoFrames, 0, "totalVideoFrames should be 0");
+ is(vpq.droppedVideoFrames, 0, "droppedVideoFrames should be 0");
+ is(vpq.corruptedVideoFrames, 0, "corruptedVideoFrames should be 0");
+
+ var vpq2 = video.getVideoPlaybackQuality();
+ ok(vpq !== vpq2, "getVideoPlaybackQuality should return a new object");
+ ok(vpq.creationTime <= vpq2.creationTime, "VideoPlaybackQuality objects should have increasing creationTime");
+
+ var audio = document.createElement("audio");
+ ok(!audio.getVideoPlaybackQuality, "getVideoPlaybackQuality should not be available on Audio elements");
+
+ video.src = "seek.webm";
+ video.play();
+ video.addEventListener("ended", function () {
+ vpq = video.getVideoPlaybackQuality();
+ ok(vpq.creationTime <= performance.now(), "creationTime should be in the past");
+ ok(vpq.totalVideoFrames > 0, "totalVideoFrames should be > 0");
+ ok(vpq.droppedVideoFrames >= 0, "droppedVideoFrames should be >= 0");
+ ok(vpq.droppedVideoFrames <= vpq.totalVideoFrames, "droppedVideoFrames should be <= totalVideoFrames");
+ ok(vpq.corruptedVideoFrames >= 0, "corruptedVideoFrames should be >= 0");
+
+ SpecialPowers.pushPrefEnv({"set": [["media.video_stats.enabled", false]]}, function () {
+ vpq = video.getVideoPlaybackQuality();
+ is(vpq.creationTime, 0, "creationTime should be 0");
+ is(vpq.totalVideoFrames, 0, "totalVideoFrames should be 0");
+ is(vpq.droppedVideoFrames, 0, "droppedVideoFrames should be 0");
+ is(vpq.corruptedVideoFrames, 0, "corruptedVideoFrames should be 0");
+
+ SimpleTest.finish();
+ });
+ });
+}
+
+addLoadEvent(function() {
+ SpecialPowers.pushPrefEnv({"set":
+ [
+ ["media.mediasource.enabled", true],
+ ]
+ }, test);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_VideoPlaybackQuality_disabled.html b/dom/media/test/test_VideoPlaybackQuality_disabled.html
new file mode 100644
index 000000000..756c3bedc
--- /dev/null
+++ b/dom/media/test/test_VideoPlaybackQuality_disabled.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test basic functionality of VideoPlaybackQuality</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function test() {
+ var video = document.createElement("video");
+ ok(!video.getVideoPlaybackQuality, "getVideoPlaybackQuality should be hidden behind a pref");
+ var accessThrows = false;
+ try {
+ video.getVideoPlaybackQuality();
+ } catch (e) {
+ accessThrows = true;
+ }
+ ok(accessThrows, "getVideoPlaybackQuality should be hidden behind a pref");
+ SimpleTest.finish();
+}
+
+addLoadEvent(function() {
+ SpecialPowers.pushPrefEnv({"set":
+ [
+ ["media.mediasource.enabled", false],
+ ]
+ }, test);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_access_control.html b/dom/media/test/test_access_control.html
new file mode 100644
index 000000000..57bfeb97b
--- /dev/null
+++ b/dom/media/test/test_access_control.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=451958
+-->
+<head>
+ <title>Test for Bug 451958</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=451958">Mozilla Bug 451958</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 451958 **/
+
+function run() {
+ window.open("http://example.org:80/tests/dom/media/test/file_access_controls.html", "", "width=500,height=500");
+}
+
+function done() {
+ mediaTestCleanup();
+ SimpleTest.finish();
+}
+
+addLoadEvent(run);
+SimpleTest.waitForExplicitFinish();
+
+
+window.addEventListener("message", receiveMessage, false);
+
+function receiveMessage(event)
+{
+ if (event.origin !== "http://example.org") {
+ ok(false, "Received message from wrong domain");
+ return;
+ }
+
+ if (event.data.done == "true")
+ return done();
+
+ ok(event.data.result, event.data.message);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_aspectratio_mp4.html b/dom/media/test/test_aspectratio_mp4.html
new file mode 100644
index 000000000..27ad9bb1f
--- /dev/null
+++ b/dom/media/test/test_aspectratio_mp4.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=975978
+-->
+
+<head>
+ <title>Media test: default video size</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=975978">Mozilla Bug 975978</a>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function IsWindows7OrLater() {
+ var re = /Windows NT (\d.\d)/;
+ var winver = navigator.userAgent.match(re);
+ return winver && winver.length == 2 && parseFloat(winver[1]) >= 6.1;
+}
+
+SimpleTest.waitForExplicitFinish();
+
+// MP4 video with display size is difference to decode frame size.
+// The display size is recorded in TrackHeaderBox 'tkhd' of this mp4 video.
+var resource =
+ { name:"pixel_aspect_ratio.mp4", type:"video/mp4", width:525, height:288 };
+
+var v = document.createElement("video");
+v.onloadedmetadata = function() {
+ is(v.videoWidth, resource.width, "Intrinsic width should match video width");
+ is(v.videoHeight, resource.height, "Intrinsic height should match video height");
+ SimpleTest.finish();
+}
+v.addEventListener("error", function(ev) {
+ if (v.readyState < v.HAVE_METADATA) {
+ info("Video element returns with readyState " + v.readyState + " error.code " + v.error.code);
+ todo(false, "This platform doesn't support to retrieve MP4 metadata.");
+ SimpleTest.finish();
+ }
+}, false);
+
+v.src = resource.name;
+v.preload = "auto";
+
+document.body.appendChild(v);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_audio1.html b/dom/media/test/test_audio1.html
new file mode 100644
index 000000000..8d9ca7b68
--- /dev/null
+++ b/dom/media/test/test_audio1.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: Audio Constructor Test 1</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var a1 = new Audio();
+ if (!a1.canPlayType(test.type))
+ return;
+ manager.started(token);
+
+ is(a1.getAttribute("preload"), "auto", "preload:auto automatically set");
+ is(a1.src, "", "Src set?");
+ a1 = null;
+ manager.finished(token);
+}
+
+manager.runTests(gAudioTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_audio2.html b/dom/media/test/test_audio2.html
new file mode 100644
index 000000000..ae0126189
--- /dev/null
+++ b/dom/media/test/test_audio2.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: Audio Constructor Test 2</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var tmpAudio = new Audio();
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ if (!tmpAudio.canPlayType(test.type))
+ return;
+ manager.started(token);
+ var a1 = new Audio(test.name);
+ is(a1.getAttribute("preload"), "auto", "Preload automatically set to auto");
+ ok(a1.src.endsWith("/" + test.name), "src OK");
+ manager.finished(token);
+}
+
+manager.runTests(gAudioTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_audioDocumentTitle.html b/dom/media/test/test_audioDocumentTitle.html
new file mode 100644
index 000000000..d8d84a563
--- /dev/null
+++ b/dom/media/test/test_audioDocumentTitle.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=463830
+-->
+<head>
+ <title>Test for Bug 463830</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=463830">Mozilla Bug 463830</a>
+<p id="display"></p>
+<iframe id="i"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 463830 **/
+
+var gTests = [
+ { file: "r11025_s16_c1.wav", title: "r11025_s16_c1.wav" }
+];
+
+var gTestNum = 0;
+
+addLoadEvent(runTest);
+
+var title;
+var i = document.getElementById("i");
+
+function runTest() {
+ if (gTestNum == gTests.length) {
+ SimpleTest.finish();
+ return;
+ }
+ if (gTestNum == 0) {
+ i.addEventListener("load", function() {
+ is(i.contentDocument.title, title, "Doc title incorrect");
+ setTimeout(runTest, 0);
+ }, false);
+ }
+
+ title = gTests[gTestNum].title;
+ i.src = gTests[gTestNum].file;
+ gTestNum++;
+}
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_autoplay.html b/dom/media/test/test_autoplay.html
new file mode 100644
index 000000000..ea3191b4b
--- /dev/null
+++ b/dom/media/test/test_autoplay.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: autoplay attribute</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<video id='v1'"></video><audio id='a1'></audio>
+<video id='v2' autoplay></video><audio id='a2' autoplay></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var v2 = document.getElementById('v2');
+var a2 = document.getElementById('a2');
+ok(!v1.autoplay, "v1.autoplay should be false by default");
+ok(!a1.autoplay, "v1.autoplay should be false by default");
+ok(v2.autoplay, "v2.autoplay should be true");
+ok(a2.autoplay, "v2.autoplay should be true");
+
+v1.autoplay = true;
+a1.autoplay = true;
+ok(v1.autoplay, "video.autoplay not true");
+ok(a1.autoplay, "audio.autoplay not true");
+is(v1.getAttribute("autoplay"), "", "video autoplay attribute not set");
+is(a1.getAttribute("autoplay"), "", "video autoplay attribute not set");
+
+mediaTestCleanup();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_autoplay_contentEditable.html b/dom/media/test/test_autoplay_contentEditable.html
new file mode 100644
index 000000000..e2375d18b
--- /dev/null
+++ b/dom/media/test/test_autoplay_contentEditable.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: play() method</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body contenteditable="true">
+<pre id="test">
+
+<script>
+
+var manager = new MediaTestManager;
+
+var tokens = {
+ 0: ["canplay"],
+ "canplay": ["canplay", "canplaythrough"],
+ "canplaythrough": ["canplay", "canplaythrough"]
+};
+
+var eventList = ["play", "canplay", "playing", "canplaythrough", "ended"];
+
+function gotPlayEvent(event) {
+ var v = event.target;
+ ok(tokens[v._state].indexOf(event.type) >= 0,
+ "Check expected event got " + uneval(event.type) +
+ " at " + uneval(v._state) + " for " + v._name);
+ v._state = event.type;
+ if (event.type == 'canplaythrough') {
+ // Remove all event listeners to avoid running tests after finishing test case.
+ eventList.forEach(function (e) {
+ v.removeEventListener(e, gotPlayEvent, false);
+ });
+ v.pause();
+ goToNext(v);
+ }
+}
+
+function goToNext(v) {
+ v.parentNode.removeChild(v);
+ manager.finished(v.token);
+}
+
+function initTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ manager.started(token);
+ v._state = 0;
+
+ eventList.forEach(function (e) {
+ v.addEventListener(e, gotPlayEvent, false);
+ });
+
+ v.src = test.name;
+ v._name = test.name;
+ v.autoplay = true;
+ document.body.appendChild(v); // Causes load.
+}
+
+manager.runTests(gSmallTests, initTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_background_video_no_suspend_disabled.html b/dom/media/test/test_background_video_no_suspend_disabled.html
new file mode 100644
index 000000000..81a253b6c
--- /dev/null
+++ b/dom/media/test/test_background_video_no_suspend_disabled.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Background Video Doesn't Suspend When Feature Disabled</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<script src="manifest.js"></script>
+<script src="background_video.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+<script>
+"use strict";
+
+var manager = new MediaTestManager;
+
+startTest({
+ desc: "Test Background Video Doesn't Suspend When Feature Disabled.",
+ prefs: [
+ [ 'media.test.setVisible', true ],
+ [ 'media.suspend-bkgnd-video.enabled', false ],
+ [ 'media.suspend-bkgnd-video.delay-ms', 0 ]
+ ],
+ tests: gDecodeSuspendTests,
+ runTest: (test, token) => {
+ let v = appendVideoToDoc(test.name, token);
+ manager.started(token);
+
+ /* This test checks that suspend doesn't occur when the feature is disabled */
+ waitUntilPlaying(v)
+ .then(() => checkVideoDoesntSuspend(v))
+ .then(() => {
+ ok(true, 'Video ended before decode was suspended');
+ manager.finished(token); })
+ .catch((e) => {
+ ok(false, 'Test Failed: ' + e.toString());
+ manager.finished(token); });
+ }
+});
+</script> \ No newline at end of file
diff --git a/dom/media/test/test_background_video_no_suspend_short_vid.html b/dom/media/test/test_background_video_no_suspend_short_vid.html
new file mode 100644
index 000000000..980c1b2b3
--- /dev/null
+++ b/dom/media/test/test_background_video_no_suspend_short_vid.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Background Video Doesn't Suspend When Timeout Is Longer Than Video</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<script src="manifest.js"></script>
+<script src="background_video.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+<script>
+"use strict";
+
+var manager = new MediaTestManager;
+
+startTest({
+ desc: "Test Background Video Doesn't Suspend When Timeout Is Longer Than Video.",
+ prefs: [
+ [ 'media.test.setVisible', true ],
+ [ 'media.suspend-bkgnd-video.enabled', true ],
+ // Gizmo.mp4 is about 5.6s
+ [ 'media.suspend-bkgnd-video.delay-ms', 10000 ]
+ ],
+ tests: gDecodeSuspendTests,
+ runTest: (test, token) => {
+ let v = appendVideoToDoc(test.name, token);
+ manager.started(token);
+
+ /* This test checks that suspend doesn't occur when the delay is longer
+ than the duration of the video that's playing */
+ waitUntilPlaying(v)
+ .then(() => checkVideoDoesntSuspend(v))
+ .then(() => {
+ ok(true, 'Video ended before decode was suspended');
+ manager.finished(token); })
+ .catch((e) => {
+ ok(false, 'Test Failed: ' + e.toString());
+ manager.finished(token); });
+ }
+});
+</script> \ No newline at end of file
diff --git a/dom/media/test/test_background_video_suspend.html b/dom/media/test/test_background_video_suspend.html
new file mode 100644
index 000000000..e872eacf8
--- /dev/null
+++ b/dom/media/test/test_background_video_suspend.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Background Video Suspends</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<script src="manifest.js"></script>
+<script src="background_video.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+<script type="text/javascript">
+"use strict";
+
+var manager = new MediaTestManager;
+
+var MIN_DELAY = 100;
+
+function testDelay(v, start, min) {
+ let end = performance.now();
+ let delay = end - start;
+ ok(delay > min, `${v.token} suspended with a delay of ${delay} ms`);
+}
+
+startTest({
+ desc: 'Test Background Video Suspends',
+ prefs: [
+ [ "media.test.setVisible", true ],
+ [ "media.suspend-bkgnd-video.enabled", true ],
+ // User a short delay to ensure video decode suspend happens before end
+ // of video.
+ [ "media.suspend-bkgnd-video.delay-ms", MIN_DELAY ]
+ ],
+ tests: gDecodeSuspendTests,
+ runTest: (test, token) => {
+ let v = appendVideoToDoc(test.name, token);
+ manager.started(token);
+
+ let start;
+ waitUntilPlaying(v)
+ .then(() => { start = performance.now(); })
+ .then(() => testVideoSuspendsWhenHidden(v))
+ .then(() => {
+ testDelay(v, start, MIN_DELAY);
+ return testVideoResumesWhenShown(v);
+ })
+ .then(() => waitUntilEnded(v))
+ .then(() => {
+ removeNodeAndSource(v);
+ manager.finished(token);
+ });
+ }
+});
+</script>
diff --git a/dom/media/test/test_background_video_suspend_ends.html b/dom/media/test/test_background_video_suspend_ends.html
new file mode 100644
index 000000000..e1b72c07a
--- /dev/null
+++ b/dom/media/test/test_background_video_suspend_ends.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Background Suspended Video Fires 'ended' Event</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<script src="manifest.js"></script>
+<script src="background_video.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+<script type="text/javascript">
+"use strict";
+
+var manager = new MediaTestManager;
+
+startTest({
+ desc: "Test Background Suspended Video Fires 'ended' Event",
+ prefs: [
+ [ "media.test.setVisible", true ],
+ [ "media.suspend-bkgnd-video.enabled", true ],
+ // User a short delay to ensure video decode suspend happens before end
+ // of video.
+ [ "media.suspend-bkgnd-video.delay-ms", 1000 ]
+ ],
+ tests: gDecodeSuspendTests,
+ runTest: (test, token) => {
+ let v = appendVideoToDoc(test.name, token);
+ manager.started(token);
+
+ // This test checks that 'ended' event is received for videos with
+ // suspended video decoding. This is important for looping video logic
+ // handling in HTMLMediaElement.
+ waitUntilPlaying(v)
+ .then(() => testVideoSuspendsWhenHidden(v))
+ .then(() => waitUntilEnded(v))
+ .then(() => {
+ ok(v.currentTime >= v.duration, 'current time approximates duration.');
+ manager.finished(token);
+ });
+ }
+});
+</script>
diff --git a/dom/media/test/test_buffered.html b/dom/media/test/test_buffered.html
new file mode 100644
index 000000000..407ae7404
--- /dev/null
+++ b/dom/media/test/test_buffered.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=462957
+-->
+<head>
+ <title>Test for Bug 462957</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=462957">Mozilla Bug 462957</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+// Test for Bug 462957; HTMLMediaElement.buffered.
+
+var manager = new MediaTestManager;
+
+function testBuffered(e) {
+ var v = e.target;
+ v.removeEventListener('timeupdate', testBuffered);
+
+ // The whole media should be buffered...
+ var b = v.buffered;
+ is(b.length, 1, v._name + ": Should be buffered in one range");
+ is(b.start(0), 0, v._name + ": First range start should be media start");
+ ok(Math.abs(b.end(0) - v.duration) < 0.1, v._name + ": First range end should be media end");
+
+ // Ensure INDEX_SIZE_ERR is thrown when we access outside the range
+ var caught = false;
+ try {
+ b.start(-1);
+ } catch (e) {
+ caught = e.name == "IndexSizeError" && e.code == DOMException.INDEX_SIZE_ERR;
+ }
+ is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on under start bounds range");
+
+ caught = false;
+ try {
+ b.end(-1);
+ } catch (e) {
+ caught = e.name == "IndexSizeError" && e.code == DOMException.INDEX_SIZE_ERR;
+ }
+ is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on under end bounds range");
+
+ caught = false;
+ try {
+ b.start(b.length);
+ } catch (e) {
+ caught = e.name == "IndexSizeError" && e.code == DOMException.INDEX_SIZE_ERR;
+ }
+ is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on over start bounds range");
+
+ caught = false;
+ try {
+ b.end(b.length);
+ } catch (e) {
+ caught = e.name == "IndexSizeError" && e.code == DOMException.INDEX_SIZE_ERR;
+ }
+ is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on over end bounds range");
+
+ removeNodeAndSource(v);
+ manager.finished(v._token);
+}
+
+function fetch(url, fetched_callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, true);
+ xhr.responseType = "blob";
+
+ var loaded = function (event) {
+ if (xhr.status == 200 || xhr.status == 206) {
+ // Request fulfilled. Note sometimes we get 206... Presumably because either
+ // httpd.js or Necko cached the result.
+ fetched_callback(window.URL.createObjectURL(xhr.response));
+ } else {
+ ok(false, "Fetch failed headers=" + xhr.getAllResponseHeaders());
+ }
+ };
+
+ xhr.addEventListener("load", loaded, false);
+ xhr.send();
+}
+
+function startTest(test, token) {
+ // Fetch the media resource using XHR so we can be sure the entire
+ // resource is loaded before we test buffered ranges. This ensures
+ // we have deterministic behaviour.
+ var onfetched = function(uri) {
+ var v = document.createElement('video');
+ v.autoplay = true;
+ v._token = token;
+ v.src = uri;
+ v._name = test.name;
+ v._test = test;
+ v.addEventListener("timeupdate", testBuffered, false);
+ document.body.appendChild(v);
+ };
+
+ manager.started(token);
+ fetch(test.name, onfetched);
+}
+
+// Note: No need to set media test prefs, since we're using XHR to fetch
+// media data.
+SimpleTest.waitForExplicitFinish();
+manager.runTests(gSeekTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug1018933.html b/dom/media/test/test_bug1018933.html
new file mode 100644
index 000000000..3159588ae
--- /dev/null
+++ b/dom/media/test/test_bug1018933.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1018933
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Regression test for bug 1018933 - HTMLTrackElement should create only one TextTrack</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+video.src = "seek.webm";
+video.preload = "auto";
+
+var trackElement = document.createElement("track");
+trackElement.src = "basic.vtt";
+trackElement.kind = "subtitles";
+
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+
+// Accessing the track now would have caused the bug as the track element
+// shouldn't have had time to bind to the tree yet.
+trackElement.track.mode = 'showing';
+
+video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+
+ is(video.textTracks.length, 1, "Video should have one TextTrack.");
+ SimpleTest.finish();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug1113600.html b/dom/media/test/test_bug1113600.html
new file mode 100644
index 000000000..394994d0a
--- /dev/null
+++ b/dom/media/test/test_bug1113600.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that a video element captured to a stream mid-playback can be played to the end</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+PARALLEL_TESTS = 1;
+SimpleTest.requestCompleteLog();
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.style = "background-color:#aca;";
+ v.width = 160;
+ v.height = 120;
+
+ manager.started(token);
+
+ v.src = test.name;
+
+ v.ontimeupdate = function() {
+ if (v.currentTime < test.duration / 4) {
+ // Allow some time to pass before starting the capture.
+ return;
+ }
+ v.ontimeupdate = null;
+ v.mozCaptureStreamUntilEnded();
+ info(test.name + " capture started at " + v.currentTime + ". Duration=" + test.duration);
+ };
+
+ v.onended = function() {
+ ok(true, test.name + " ended");
+ removeNodeAndSource(v);
+ manager.finished(token);
+ };
+
+ document.body.appendChild(v);
+ v.play();
+}
+
+manager.runTests(gSmallTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug1242338.html b/dom/media/test/test_bug1242338.html
new file mode 100644
index 000000000..c404d7b1d
--- /dev/null
+++ b/dom/media/test/test_bug1242338.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Bug 1242338</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var video = document.createElement('video');
+ video.preload = "metadata";
+ video.token = token;
+
+ var handler = {
+ "ontimeout": function() {
+ Log(token, "timed out");
+ }
+ };
+ manager.started(token, handler);
+
+ video.src = test.name;
+ video.name = test.name;
+
+ function finish() {
+ video.finished = true;
+ video.removeEventListener("loadedmetadata", onLoadedmetadata, false);
+ video.removeEventListener("ended", onEnded, false);
+ removeNodeAndSource(video);
+ manager.finished(video.token);
+ }
+
+ function onLoadedmetadata() {
+ // seek to the media's duration
+ var duration = video.duration;
+ console.log("onloadedmetadata(), duration = " + duration);
+ video.currentTime = duration;
+ }
+
+ function onEnded() {
+ ok(video.ended, test.name + " checking playback has ended");
+ ok(!video.finished, test.name + " shouldn't be finished");
+ ok(!video.seenEnded, test.name + " shouldn't be ended");
+ video.seenEnded = true;
+
+ ok(true, "Seeking to the duration triggers ended event");
+ finish();
+ }
+
+ video.addEventListener("loadedmetadata", onLoadedmetadata, false);
+ video.addEventListener("ended", onEnded, false);
+
+ document.body.appendChild(video);
+}
+
+manager.runTests(gSeekTests, startTest);
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_bug1242594.html b/dom/media/test/test_bug1242594.html
new file mode 100644
index 000000000..780de0005
--- /dev/null
+++ b/dom/media/test/test_bug1242594.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1242594
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Bug 1242594 - Unbind a video element with HTMLTrackElement
+ should not remove the TextTrack</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+video.src = "seek.webm";
+video.preload = "auto";
+
+var trackElement = document.createElement("track");
+trackElement.src = "basic.vtt";
+trackElement.kind = "subtitles";
+
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+
+// Bug 1242599, access video.textTracks.length immediately after
+// the track element binds into the media element.
+is(video.textTracks.length, 1, "Video should have one TextTrack.");
+var parent = video.parentNode;
+parent.removeChild(video);
+is(video.textTracks.length, 1, "After unbind the video element, should have one TextTrack.");
+parent.appendChild(video);
+is(video.textTracks.length, 1, "After bind the video element, should have one TextTrack.");
+SimpleTest.finish();
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_bug1248229.html b/dom/media/test/test_bug1248229.html
new file mode 100644
index 000000000..4feb265a3
--- /dev/null
+++ b/dom/media/test/test_bug1248229.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test garbage collection of captured stream (bug 1248229)</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="doTest()">
+<video id="v" src="black100x100-aspect3to2.ogv"></video>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+function doTest() {
+ window.oak = v.mozCaptureStreamUntilEnded();
+ v.mozCaptureStreamUntilEnded();
+ v.play();
+
+ v.onended = function() {
+ info("Got ended.");
+ v.onended = null;
+ SpecialPowers.exactGC(function() {
+ info("GC completed.");
+ v.play();
+ SimpleTest.finish();
+ });
+ }
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug448534.html b/dom/media/test/test_bug448534.html
new file mode 100644
index 000000000..d768ccced
--- /dev/null
+++ b/dom/media/test/test_bug448534.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=448534
+-->
+
+<head>
+ <title>Test for Bug 448534</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=448535">Mozilla Bug 448534</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function loaded(event) {
+ var v = event.target;
+ info(v.token + ": event=" + event.type);
+ if (v._finished)
+ return;
+ v.play();
+}
+
+function started(event) {
+ var v = event.target;
+ info(v.token + ": event=" + event.type);
+ // For a short file, it could reach the end before 'play' received. We will
+ // skip the test for 'paused' would be true when ended.
+ if (v._finished || v.ended)
+ return;
+ ok(!v.paused, v.token + ": Video should not be paused while playing");
+ v.parentNode.removeChild(v);
+ v._played = true;
+}
+
+function stopped(event) {
+ var v = event.target;
+ info(v.token + ": event=" + event.type);
+ if (v._finished)
+ return;
+ v._finished = true;
+ ok(v.paused, v.token + ": Video should be paused after removing from the Document");
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._played = false;
+ v._finished = false;
+ v.addEventListener("loadedmetadata", loaded, false);
+ v.addEventListener("play", started, false);
+ v.addEventListener("pause", stopped, false);
+ document.body.appendChild(v);
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug463162.xhtml b/dom/media/test/test_bug463162.xhtml
new file mode 100644
index 000000000..3d1dde405
--- /dev/null
+++ b/dom/media/test/test_bug463162.xhtml
@@ -0,0 +1,78 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ xmlns:svg="http://www.w3.org/2000/svg">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=463162
+-->
+<head>
+ <title>Test for Bug 463162</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"/>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=463162">Mozilla Bug 463162</a>
+
+<script class="testbody" type="text/javascript">
+<![CDATA[
+
+var gExpectedResult = {
+ 'a1' : 'error',
+ 'a2' : 'loaded',
+ 'a3' : 'loaded',
+ 'a4' : 'error',
+};
+
+var gResultCount = 0;
+
+function onError(event, id) {
+ is('error', gExpectedResult[id], 'unexpected error loading ' + id);
+ gResultCount++;
+ dump('error('+id+') expected ' + gExpectedResult[id] + ' gResultCount=' + gResultCount + '\n');
+ if (gResultCount == 4)
+ SimpleTest.finish();
+}
+
+function onMetaData(id) {
+ is('loaded', gExpectedResult[id], 'unexpected loadedmetadata loading ' + id);
+ gResultCount++;
+ dump('onMetaData('+id+') expected ' + gExpectedResult[id] + ' gResultCount=' + gResultCount + '\n');
+ if (gResultCount == 4)
+ SimpleTest.finish();
+}
+
+]]>
+</script>
+
+<video id="a1" preload="metadata" onloadedmetadata="onMetaData('a1');"><sauce/><source type="bad" src="404" onerror="onError(event, 'a1');"/></video>
+<video id="a2" preload="metadata" onloadedmetadata="onMetaData('a2');"><source onerror="onError(event, 'a2');"/></video>
+<video id="a3" preload="metadata" onloadedmetadata="onMetaData('a3');"><html:source onerror="onError(event, 'a3');"/></video>
+<video id="a4" preload="metadata" onloadedmetadata="onMetaData('a4');"><svg:source/><source onerror="onError(event, 'a4');" type="bad" src="404"/></video>
+
+<script class="testbody" type="text/javascript">
+<![CDATA[
+
+function setSource(id, res) {
+ var v = document.getElementById(id);
+ v.firstChild.src = res.name;
+ v.firstChild.type = res.type;
+}
+
+var t = getPlayableVideo(gSmallTests);
+
+setSource('a1', t);
+setSource('a2', t);
+setSource('a3', t);
+setSource('a4', t);
+
+SimpleTest.waitForExplicitFinish();
+
+]]>
+</script>
+
+<pre id="test">
+
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug465498.html b/dom/media/test/test_bug465498.html
new file mode 100644
index 000000000..77bc68e71
--- /dev/null
+++ b/dom/media/test/test_bug465498.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: Bug 465498 - Seeking after playback ended</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=465498">Mozilla Bug 465498</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(e) {
+ var v = e.target;
+ info(v._name + " loadedmetadata");
+ e.target.play();
+}
+
+function playbackEnded(e) {
+ var v = e.target;
+ info(v._name + " ended");
+ if (v._finished)
+ return;
+ ok(v.currentTime >= v.duration - 0.1 && v.currentTime <= v.duration + 0.1,
+ "Checking currentTime at end: " + v.currentTime + " for " + v._name);
+ ok(v.ended, "Checking playback has ended for " + v._name);
+ v.pause();
+ v.currentTime = 0;
+ ok(!v.ended, "Checking ended is no longer true for " + v._name);
+ v._seeked = true;
+}
+
+function seekEnded(e) {
+ var v = e.target;
+ info(v._name + " seeked");
+ if (v._finished)
+ return;
+ ok(v.currentTime == 0, "Checking currentTime after seek: " +
+ v.currentTime + " for " + v._name);
+ ok(!v.ended, "Checking ended is false for " + v._name);
+ v._finished = true;
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function seeking(e) {
+ var v = e.target;
+ info(v._name + " seeking");
+}
+
+function initTest(test, token) {
+ var type = getMajorMimeType(test.type);
+ var v = document.createElement(type);
+ if (!v.canPlayType(test.type))
+ return;
+ v.preload = "metadata";
+ v.token = token;
+ manager.started(token);
+ v._name = test.name;
+
+ var s = document.createElement("source");
+ s.type = test.type;
+ s.src = test.name;
+ v.appendChild(s);
+
+ v._seeked = false;
+ v._finished = false;
+ v.addEventListener("loadedmetadata", startTest, false);
+ v.addEventListener("ended", playbackEnded, false);
+ v.addEventListener("seeked", seekEnded, false);
+ v.addEventListener("seeking", seeking, false);
+ document.body.appendChild(v);
+}
+
+manager.runTests(gSmallTests, initTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug495145.html b/dom/media/test/test_bug495145.html
new file mode 100644
index 000000000..ea7007ce8
--- /dev/null
+++ b/dom/media/test/test_bug495145.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=495145
+-->
+
+<head>
+ <title>Bug 495145 - pausing while ended shouldn't cause problems</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=495145">Mozilla Bug 495145</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+//longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(1.5);
+}
+
+var manager = new MediaTestManager;
+
+function start(e) {
+ e.target.play();
+}
+
+function ended1(e) {
+ var v = e.target;
+ if (v._finished)
+ return;
+
+ ++v._endCount;
+ if (v._endCount == 2) {
+ ok(true, "Playing after pause while ended works for " + v._name);
+ v._finished = true;
+ v.removeEventListener("loadedmetadata", start, false);
+ v.removeEventListener("ended", ended1, false);
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ return;
+ }
+
+ v.pause();
+ v.play();
+}
+
+function ended2(e) {
+ var v = e.target;
+ if (v._finished)
+ return;
+
+ v.pause();
+ v.currentTime = 0;
+}
+
+function seeked2(e) {
+ var v = e.target;
+ if (v._finished)
+ return;
+
+ ok(v.paused, "Paused after seek after pause while ended for " + v._name);
+ v._finished = true;
+ v.removeEventListener("loadedmetadata", start, false);
+ v.removeEventListener("ended", ended2, false);
+ v.removeEventListener("seeked", seeked2, false);
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function createVideo(test, x, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._name = test.name + "#" + x;
+ v._endCount = 0;
+ v._finished = false;
+ v.addEventListener("loadedmetadata", start, false);
+ v.addEventListener("ended", x == 1 ? ended1 : ended2, false);
+ if (x == 2)
+ v.addEventListener("seeked", seeked2, false);
+ document.body.appendChild(v);
+}
+
+function startTest(test, token) {
+ createVideo(test, 1, token + "a");
+ createVideo(test, 2, token + "b");
+}
+
+manager.runTests(gSmallTests, startTest);
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug495300.html b/dom/media/test/test_bug495300.html
new file mode 100644
index 000000000..49a23c214
--- /dev/null
+++ b/dom/media/test/test_bug495300.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=495300
+-->
+
+<head>
+ <title>Bug 495300 - seeking to the end should behave as "ended"</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=495300">Mozilla Bug 495300</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+function mediaEnded(event) {
+ ok(true, "Got expected 'ended' event: " + filename(event.target.currentSrc));
+
+ if (event.target._expectedDuration)
+ ok(Math.abs(event.target.currentTime - event.target._expectedDuration) < 0.1,
+ "currentTime equals duration: " + filename(event.target.currentSrc));
+
+ event.target.removeEventListener("ended", mediaEnded, false);
+ manager.finished(event.target.token);
+ removeNodeAndSource(event.target);
+}
+
+function mediaLoadedmetadata(event) {
+ event.target.currentTime = event.target.duration;
+ event.target.removeEventListener("loadedmetadata", mediaLoadedmetadata, false);
+}
+
+function startTest(test, token) {
+ var elemType = /^audio/.test(test.type) ? "audio" : "video";
+ var v1 = document.createElement(elemType);
+ v1.preload = "auto";
+
+ v1.src = test.name;
+ if (test.duration) {
+ v1._expectedDuration = test.duration;
+ }
+ v1.addEventListener("loadedmetadata", mediaLoadedmetadata, false);
+ v1.addEventListener("ended", mediaEnded, false);
+ v1.load();
+
+ v1.token = token;
+ manager.started(token);
+}
+
+manager.runTests(gSeekTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug654550.html b/dom/media/test/test_bug654550.html
new file mode 100644
index 000000000..07922874d
--- /dev/null
+++ b/dom/media/test/test_bug654550.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=654550
+-->
+
+<head>
+ <title>Test for Bug 654550</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=654550">Mozilla Bug 654550</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+ /* Test for Bug 654550 */
+
+ // Parallel test must be disabled for media.video_stats.enabled is a global setting
+ // to prevent the setting from changing unexpectedly in the middle of the test.
+ PARALLEL_TESTS = 1;
+ SimpleTest.waitForExplicitFinish();
+ var manager = new MediaTestManager;
+
+ function checkStats(v, aShouldBeEnabled) {
+ if (aShouldBeEnabled) {
+ ok(v.mozParsedFrames != 0,
+ "At least one value should be different from 0 if stats are enabled");
+ } else {
+ ok(!v.mozParsedFrames,
+ "mozParsedFrames should be 0 if stats are disabled");
+ ok(!v.mozDecodedFrames,
+ "mozDecodedFrames should be 0 if stats are disabled");
+ ok(!v.mozPresentedFrames,
+ "mozPresentedFrames should be 0 if stats are disabled");
+ ok(!v.mozPaintedFrames,
+ "mozPaintedFrames should be 0 if stats are disabled");
+ }
+
+ }
+
+ function ontimeupdate_statsEnabled(event) {
+ var v = event.target;
+ v.removeEventListener('timeupdate', ontimeupdate_statsEnabled, false);
+ checkStats(v, true);
+ SpecialPowers.popPrefEnv(
+ function() {
+ v.addEventListener("timeupdate", ontimeupdate_statsDisabled);
+ });
+ }
+
+ function ontimeupdate_statsDisabled(event) {
+ var v = event.target;
+ v.removeEventListener('timeupdate', ontimeupdate_statsDisabled, false);
+ checkStats(v, false);
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ }
+
+ function startTest(test, token) {
+ var v = document.createElement('video');
+ v.token = token;
+ v.src = test.name;
+ // playback may reach the end before pref is changed for the duration is short
+ // set 'loop' to true to keep playing so that we won't miss 'timeupdate' events
+ v.loop = true;
+ manager.started(token);
+ SpecialPowers.pushPrefEnv({"set": [["media.video_stats.enabled", true]]},
+ function() {
+ v.play();
+ v.addEventListener("timeupdate", ontimeupdate_statsEnabled);
+ });
+ }
+
+ SpecialPowers.pushPrefEnv({"set": [["media.video_stats.enabled", false]]},
+ function() {
+ manager.runTests(gVideoTests, startTest);
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug686942.html b/dom/media/test/test_bug686942.html
new file mode 100644
index 000000000..2f67dfa6e
--- /dev/null
+++ b/dom/media/test/test_bug686942.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=686942
+-->
+
+<head>
+ <title>Test for Bug 448534</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=686942">Mozilla Bug 686942</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+if (navigator.platform.startsWith("Win")) {
+ SimpleTest.expectAssertions(0, 2);
+}
+
+var manager = new MediaTestManager;
+
+function onloaded(event) {
+ var v = event.target;
+ v.removeEventListener("loadedmetadata", onloaded);
+ v.currentTime = v.duration;
+ return;
+}
+
+function checkNotPlaying(v) {
+ ok(v.currentTime == 0, "Should not be playing after seek to end and back to beginning");
+ v._finished = true;
+ manager.finished(v.token);
+ removeNodeAndSource(v);
+}
+
+function onseeked(event) {
+ var v = event.target;
+ v.removeEventListener("seeked", onseeked);
+ setTimeout(function() { checkNotPlaying(v); }, 500);
+}
+
+function onended(event) {
+ var v = event.target;
+ v.removeEventListener("ended", onended);
+ if (v._finished)
+ return;
+ v.addEventListener("seeked", onseeked, false);
+ v.currentTime = 0;
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "auto";
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._played = false;
+ v._finished = false;
+ v.addEventListener("loadedmetadata", onloaded, false);
+ v.addEventListener("ended", onended, false);
+
+ document.body.appendChild(v);
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug726904.html b/dom/media/test/test_bug726904.html
new file mode 100644
index 000000000..7c319bbc7
--- /dev/null
+++ b/dom/media/test/test_bug726904.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=726904
+-->
+
+<head>
+ <title>Media test: default video size</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="bodyLoaded();">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=726904">Mozilla Bug 726904</a>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var v1 = document.createElement("video"),
+ v2 = document.createElement("video"),
+ poster = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAAAAACl1GkQAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAALJJREFUeNrtwQENAAAAwqD3T20ON6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHg0cq4AATRk8BYAAAAASUVORK5CYII",
+ resource = getPlayableVideo(gSmallTests);
+
+function bodyLoaded(){
+ // Note: For DASH, width and height would vary once the video started playing, so
+ // the values would not correlate with those in manifest.js. Since this test has
+ // no playing, this should not affect the result.
+ is(v1.videoWidth, resource.width, "Intrinsic width should match video width");
+ is(v1.videoHeight, resource.height, "Intrinsic height should match video height");
+ is(v2.clientWidth, 400, "clientWidth should be 400");
+ is(v2.clientHeight, 400, "clientHeight should be 400");
+ SimpleTest.finish();
+}
+
+if (resource) {
+ v1.poster = v2.poster = poster;
+
+ v1.src = v2.src = "http://mochi.test:8888/tests/dom/media/test/" + resource.name;
+
+ v1.preload = "auto";
+ v2.preload = "none";
+
+ v1.muted = v2.muted = true;
+
+ document.body.appendChild(v1);
+ document.body.appendChild(v2);
+} else {
+ todo(false, "No types supported");
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug874897.html b/dom/media/test/test_bug874897.html
new file mode 100644
index 000000000..f22bb89e4
--- /dev/null
+++ b/dom/media/test/test_bug874897.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=874897
+-->
+
+<head>
+ <title>Test for Bug 874897</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function loadeddata(e) {
+ var v = e.target;
+ ok(v.readyState >= v.HAVE_CURRENT_DATA,
+ "readyState must be >= HAVE_CURRENT_DATA for " + v._name);
+
+ var canvas = document.createElement("canvas");
+ canvas.width = 210;
+ canvas.height = 120;
+ document.body.appendChild(canvas);
+ var ctx = canvas.getContext("2d");
+ try {
+ ctx.drawImage(v, 0, 0, v.videoWidth, v.videoHeight, 0, 0, canvas.width, canvas.height);
+ ok(true, "Shouldn't throw exception while drawing to canvas from video for " + v._name);
+ } catch (ex) {
+ ok(false, "Shouldn't throw exception while drawing to canvas from video for " + v._name);
+ }
+
+ v._finished = true;
+ v.parentNode.removeChild(v);
+ manager.finished(v.token);
+}
+
+function startTest(test, token) {
+ var type = getMajorMimeType(test.type);
+ if (type != "video")
+ return;
+
+ var v = document.createElement('video');
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._name = test.name;
+ v._finished = false;
+ v.autoplay = true;
+ v.style.display = "none";
+ v.addEventListener("loadeddata", loadeddata, false);
+ document.body.appendChild(v);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
+function beginTest() {
+ manager.runTests(gAspectRatioTests, startTest);
+}
+
+</script>
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_bug879717.html b/dom/media/test/test_bug879717.html
new file mode 100644
index 000000000..37c9a402a
--- /dev/null
+++ b/dom/media/test/test_bug879717.html
@@ -0,0 +1,134 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for bug 879717, check that a video element can be drawn into a canvas at various states of playback</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+//longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(1.5);
+}
+
+var manager = new MediaTestManager;
+
+var canvas = document.createElement('canvas');
+document.body.appendChild(canvas);
+
+var checkDrawImage = function(eventName, videoElement) {
+ var exception = null;
+ var exceptionName = "nothing";
+ try {
+ var ctx = canvas.getContext('2d');
+ ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
+ } catch (e) {
+ exception = e;
+ exceptionName = e.name;
+ }
+ ok(exception === null,
+ "drawImage shouldn't throw an exception on " + eventName +
+ " of " + videoElement.testName + ", got " + exceptionName);
+};
+
+var checkDrawImageEventHandler = function(ev) {
+ checkDrawImage(ev.type, ev.target);
+};
+var startTest = function(media, token) {
+ manager.started(token);
+
+ // File playback
+ var v1 = document.createElement("video");
+ v1.autoplay = true;
+
+ // Captured file playback
+ var v2 = document.createElement("video");
+
+ // Stream playback
+ var v3 = document.createElement("video");
+ v3.autoplay = true;
+
+ v1.gotLoadeddata = false;
+ v2.gotLoadeddata = false;
+ v3.gotLoadeddata = false;
+
+ v1.testName = "v1 (" + media.name + ")";
+ v2.testName = "v2 (Captured " + media.name + ")";
+ v3.testName = "v3 (Stream of " + media.name + ")";
+
+ checkDrawImage("beforeplay", v1);
+ checkDrawImage("beforeplay", v2);
+ checkDrawImage("beforeplay", v3);
+
+ v1.onloadedmetadata = checkDrawImageEventHandler;
+ v2.onloadedmetadata = checkDrawImageEventHandler;
+ v3.onloadedmetadata = checkDrawImageEventHandler;
+
+ v1.onplay = checkDrawImageEventHandler;
+ v2.onplay = checkDrawImageEventHandler;
+ v3.onplay = checkDrawImageEventHandler;
+
+ function onplaying(ev) {
+ if (!ev.target.gotPlaying) {
+ ev.target.gotPlaying = true;
+ checkDrawImageEventHandler(ev);
+ }
+ }
+ v1.onplaying = onplaying;
+ v2.onplaying = onplaying;
+ v3.onplaying = onplaying;
+
+ var onloadeddata = function(ev) {
+ ev.target.gotLoadeddata = true;
+ checkDrawImageEventHandler(ev);
+ };
+
+ v1.onloadeddata = onloadeddata;
+ v2.onloadeddata = onloadeddata;
+ v3.onloadeddata = onloadeddata;
+
+ var checkFinished = function() {
+ if (!v1.testFinished || !v2.testFinished || !v3.testFinished) {
+ return;
+ }
+
+ ok(v1.gotLoadeddata, v1.testName + " should have gotten the 'loadeddata' event callback");
+ ok(v2.gotLoadeddata, v2.testName + " should have gotten the 'loadeddata' event callback");
+ ok(v3.gotLoadeddata, v3.testName + " should have gotten the 'loadeddata' event callback");
+
+ manager.finished(token);
+ };
+
+ var onended = function(ev) {
+ checkDrawImageEventHandler(ev);
+ removeNodeAndSource(ev.target);
+ ev.target.testFinished = true;
+ checkFinished();
+ };
+
+ v1.onended = onended;
+ v2.onended = onended;
+ v3.onended = onended;
+
+ document.body.appendChild(v1);
+ document.body.appendChild(v2);
+ document.body.appendChild(v3);
+
+ v1.src = media.name;
+ v2.src = media.name;
+ v2.preload = 'metadata';
+
+ v2.addEventListener('loadedmetadata', function () {
+ v3.srcObject = v2.mozCaptureStreamUntilEnded();
+ v2.play();
+ });
+}
+
+manager.runTests(getPlayableVideos(gSmallTests), startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug883173.html b/dom/media/test/test_bug883173.html
new file mode 100644
index 000000000..4ccd9c0bd
--- /dev/null
+++ b/dom/media/test/test_bug883173.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=883173
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 883173 - TextTrackCue(List) Sorting</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+video.src = "seek.webm";
+video.preload = "metadata";
+
+var trackElement = document.createElement("track");
+trackElement.src = "bug883173.vtt";
+trackElement.kind = "subtitles";
+
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+video.addEventListener("loadedmetadata",
+ function run_tests() {
+ // Re-queue run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+
+ // Set mode to hidden so that the active cue lists are being updated.
+ trackElement.track.mode = "hidden";
+
+ var expected = [[1, 3], [1, 2], [2, 4], [2, 3], [3, 4]];
+ var cueList = trackElement.track.cues;
+ is(cueList.length, expected.length, "Cue list length should be 5.");
+
+ for (var i = 0; i < expected.length; i++) {
+ is(cueList[i].startTime, expected[i][0], "Cue's start time should be " + expected[i][0]);
+ is(cueList[i].endTime, expected[i][1], "Cue's end time should be " + expected[i][1]);
+ }
+
+ SimpleTest.finish();
+ }
+);
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_bug895091.html b/dom/media/test/test_bug895091.html
new file mode 100644
index 000000000..ae370ac59
--- /dev/null
+++ b/dom/media/test/test_bug895091.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=895091
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 895091 - Integrating vtt.js</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+video.src = "seek.webm";
+video.preload = "metadata";
+
+var trackElement = document.createElement("track");
+trackElement.src = "long.vtt";
+trackElement.kind = "subtitles";
+
+var trackElementTwo = document.createElement("track");
+trackElementTwo.src = "long.vtt";
+trackElementTwo.kind = "subtitles";
+
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+video.appendChild(trackElementTwo);
+
+video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1 || trackElementTwo.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+
+ // Set mode to hidden so that the active cue lists are being updated.
+ trackElement.track.mode = "hidden";
+ trackElementTwo.track.mode = "hidden";
+
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+ is(trackElementTwo.readyState, 2, "Track::ReadyState should be set to LOADED.");
+
+ is(trackElement.track.cues.length, 2000, "Cue list length should be 2000.");
+ is(trackElementTwo.track.cues.length, 2000, "Cue list length should be 2000.");
+
+ SimpleTest.finish();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug895305.html b/dom/media/test/test_bug895305.html
new file mode 100644
index 000000000..2b1b55c3f
--- /dev/null
+++ b/dom/media/test/test_bug895305.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=895305
+https://bugzilla.mozilla.org/show_bug.cgi?id=905320
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Regression test for bug 895305 and 905320 - TextTrack* leaks</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var audio = document.createElement("audio");
+
+// Check leaking on TextTrackList objects.
+window.ttl = audio.textTracks;
+ttl.addEventListener("click", function(){}, false);
+
+// Check leaking on VTTCue objects.
+window.ttc = new VTTCue(3, 4, "Test.");
+ttc.addEventListener("click", function() {}, false);
+
+// Check leaking on TextTrack objects.
+audio.addTextTrack("subtitles", "label", "en-CA");
+ttl[0].addEventListener("click", function() {}, false);
+
+ok(true); // Need to have at least one assertion for Mochitest to be happy.
+SimpleTest.finish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug919265.html b/dom/media/test/test_bug919265.html
new file mode 100644
index 000000000..3ebdd37eb
--- /dev/null
+++ b/dom/media/test/test_bug919265.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=919265
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Regression test for bug 919265 - Leak on VTTCue::GetCueAsHTML()</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+// We shouldn't leak upon shutdown.
+(new VTTCue(0, 0, "")).getCueAsHTML();
+
+// We need to assert something for Mochitest to be happy.
+ok(true);
+SimpleTest.finish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_bug957847.html b/dom/media/test/test_bug957847.html
new file mode 100644
index 000000000..b0ab59531
--- /dev/null
+++ b/dom/media/test/test_bug957847.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=957847
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Regression test for bug 957847 - Crash on TextTrack::AddCue </title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var trackElement = document.createElement('track');
+trackElement.track.addCue(new VTTCue(0, 1, "A"));
+
+// We need to assert something for Mochitest to be happy.
+ok(true);
+SimpleTest.finish();
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_can_play_type.html b/dom/media/test/test_can_play_type.html
new file mode 100644
index 000000000..2deae49f1
--- /dev/null
+++ b/dom/media/test/test_can_play_type.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=469247
+-->
+<head>
+ <title>Test for Bug 469247</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=469247">Mozill
+a Bug 469247</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+
+<video id="v"></video>
+
+<pre id="test">
+<script type="application/javascript">
+
+var v = document.getElementById('v');
+
+function check(type, expected) {
+ is(v.canPlayType(type), expected, type);
+}
+
+// Invalid types
+check("foo/bar", "");
+check("", "");
+check("!!!", "");
+
+mediaTestCleanup();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_can_play_type_mpeg.html b/dom/media/test/test_can_play_type_mpeg.html
new file mode 100644
index 000000000..89e5fabef
--- /dev/null
+++ b/dom/media/test/test_can_play_type_mpeg.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=799315
+-->
+<head>
+ <title>Test for MP4 and MP3 support</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+
+<video id="v"></video>
+
+<pre id="test">
+<script>
+
+function check_mp4(v, enabled) {
+ function check(type, expected) {
+ var ex = enabled ? expected : "";
+ is(v.canPlayType(type), ex, type + "='" + ex + "'");
+ }
+
+ check("video/mp4", "maybe");
+ check("video/x-m4v", "maybe");
+ check("audio/mp4", "maybe");
+ check("audio/x-m4a", "maybe");
+
+ // Not the MIME type that other browsers respond to, so we won't either.
+ check("audio/m4a", "");
+ check("video/m4v", "");
+
+ check("audio/aac", "maybe");
+ check("audio/aacp", "maybe");
+
+ // H.264 Constrained Baseline Profile Level 3.0, AAC-LC
+ check("video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"", "probably");
+
+ // H.264 Constrained Baseline Profile Level 3.0, mp3
+ check("video/mp4; codecs=\"avc1.42E01E, mp3\"", "probably");
+
+ check("video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"", "probably");
+ check("video/mp4; codecs=\"avc1.58A01E, mp4a.40.2\"", "probably");
+
+ // H.264 Main Profile Level 3.0, AAC-LC
+ check("video/mp4; codecs=\"avc1.4D401E, mp4a.40.2\"", "probably");
+ // H.264 Main Profile Level 3.1, AAC-LC
+ check("video/mp4; codecs=\"avc1.4D401F, mp4a.40.2\"", "probably");
+ // H.264 Main Profile Level 4.0, AAC-LC
+ check("video/mp4; codecs=\"avc1.4D4028, mp4a.40.2\"", "probably");
+ // H.264 High Profile Level 3.0, AAC-LC
+ check("video/mp4; codecs=\"avc1.64001E, mp4a.40.2\"", "probably");
+ // H.264 High Profile Level 3.1, AAC-LC
+ check("video/mp4; codecs=\"avc1.64001F, mp4a.40.2\"", "probably");
+
+ check("video/mp4; codecs=\"avc1.42E01E\"", "probably");
+ check("video/mp4; codecs=\"avc1.42001E\"", "probably");
+ check("video/mp4; codecs=\"avc1.58A01E\"", "probably");
+ check("video/mp4; codecs=\"avc1.4D401E\"", "probably");
+ check("video/mp4; codecs=\"avc1.64001F\"", "probably");
+
+ // AAC-LC
+ check("audio/mp4; codecs=\"mp4a.40.2\"", "probably");
+ check("audio/mp4; codecs=mp4a.40.2", "probably");
+ check("audio/x-m4a; codecs=\"mp4a.40.2\"", "probably");
+ check("audio/x-m4a; codecs=mp4a.40.2", "probably");
+
+ check("audio/mp4; codecs=\"mp4a.40.2,\"", ""); // Invalid codecs string
+
+ // HE-AAC v1
+ check("audio/mp4; codecs=\"mp4a.40.5\"", "probably");
+ check("audio/mp4; codecs=mp4a.40.5", "probably");
+ check("audio/x-m4a; codecs=\"mp4a.40.5\"", "probably");
+ check("audio/x-m4a; codecs=mp4a.40.5", "probably");
+ // HE-AAC v2
+ check("audio/mp4; codecs=\"mp4a.40.29\"", "probably");
+
+ // Opus
+ check("audio/mp4; codecs=\"opus\"", "probably");
+ check("audio/mp4; codecs=opus", "probably");
+
+ // Flac.
+ // Not available on Android yet.
+ var expectedResult = IsSupportedAndroid() ? "" : "probably";
+ check("audio/mp4; codecs=\"flac\"", expectedResult);
+ check("audio/mp4; codecs=flac", expectedResult);
+}
+
+function check_mp3(v, enabled) {
+ function check(type, expected) {
+ var ex = enabled ? expected : "";
+ is(v.canPlayType(type), ex, type + "='" + ex + "'");
+ }
+
+ check("audio/mpeg", "maybe");
+ check("audio/mp3", "maybe");
+
+ check("audio/mpeg; codecs=\"mp3\"", "probably");
+ check("audio/mpeg; codecs=mp3", "probably");
+
+ check("audio/mp3; codecs=\"mp3\"", "probably");
+ check("audio/mp3; codecs=mp3", "probably");
+}
+
+function IsWindowsVistaOrLater() {
+ var re = /Windows NT (\d+\.\d)/;
+ var winver = navigator.userAgent.match(re);
+ return winver && winver.length == 2 && parseFloat(winver[1]) >= 6.0;
+}
+
+function IsMacOSSnowLeopardOrLater() {
+ var re = /Mac OS X (\d+)\.(\d+)/;
+ var ver = navigator.userAgent.match(re);
+ if (!ver || ver.length != 3) {
+ return false;
+ }
+ var major = ver[1] | 0;
+ var minor = ver[2] | 0;
+ return major == 10 && minor >= 6;
+}
+
+function IsLinux() {
+ return navigator.userAgent.indexOf("Linux") != -1;
+}
+
+function getPref(name) {
+ var pref = false;
+ try {
+ pref = SpecialPowers.getBoolPref(name);
+ } catch(ex) { }
+ return pref;
+}
+
+function IsSupportedAndroid() {
+ return getAndroidVersion() >= 14;
+}
+
+function IsJellyBeanOrLater() {
+ return getAndroidVersion() >= 16;
+}
+
+var haveMp4 = (getPref("media.wmf.enabled") && IsWindowsVistaOrLater()) ||
+ IsMacOSSnowLeopardOrLater() ||
+ (IsSupportedAndroid() &&
+ (IsJellyBeanOrLater() || getPref("media.plugins.enabled"))) ||
+ (IsLinux() && getPref("media.ffmpeg.enabled"));
+
+check_mp4(document.getElementById('v'), haveMp4);
+
+var haveMp3 = getPref("media.directshow.enabled") ||
+ (getPref("media.wmf.enabled") && IsWindowsVistaOrLater()) ||
+ (IsLinux() && getPref("media.ffmpeg.enabled")) ||
+ (IsSupportedAndroid() &&
+ ((IsJellyBeanOrLater() && getPref("media.android-media-codec.enabled")) ||
+ getPref("media.plugins.enabled"))) ||
+ getPref("media.apple.mp3.enabled");
+check_mp3(document.getElementById('v'), haveMp3);
+
+mediaTestCleanup();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_can_play_type_no_ogg.html b/dom/media/test/test_can_play_type_no_ogg.html
new file mode 100644
index 000000000..03f336b8d
--- /dev/null
+++ b/dom/media/test/test_can_play_type_no_ogg.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=469247
+-->
+<head>
+ <title>Test for Bug 469247: Ogg backend disabled</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=469247">Mozill
+a Bug 469247</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+
+<video id="v"></video>
+
+<pre id="test">
+<script src="can_play_type_ogg.js"></script>
+<script>
+
+SimpleTest.waitForExplicitFinish();
+
+function finish() {
+ mediaTestCleanup();
+ SimpleTest.finish();
+}
+
+SpecialPowers.pushPrefEnv({"set": [["media.ogg.enabled", false]]},
+ function() {
+ check_ogg(document.getElementById('v'), false, finish);
+ }
+);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_can_play_type_ogg.html b/dom/media/test/test_can_play_type_ogg.html
new file mode 100644
index 000000000..9a3359322
--- /dev/null
+++ b/dom/media/test/test_can_play_type_ogg.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=469247
+-->
+<head>
+ <title>Test for Bug 469247: Ogg backend</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=469247">Mozill
+a Bug 469247</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+
+<video id="v"></video>
+
+<pre id="test">
+<script src="can_play_type_ogg.js"></script>
+<script>
+
+SimpleTest.waitForExplicitFinish();
+
+function finish() {
+ mediaTestCleanup();
+ SimpleTest.finish();
+}
+
+check_ogg(document.getElementById('v'), true, finish);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_can_play_type_wave.html b/dom/media/test/test_can_play_type_wave.html
new file mode 100644
index 000000000..95b6fa429
--- /dev/null
+++ b/dom/media/test/test_can_play_type_wave.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=469247
+-->
+<head>
+ <title>Test for Bug 469247: WAVE backend</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=469247">Mozill
+a Bug 469247</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+
+<video id="v"></video>
+
+<pre id="test">
+<script src="can_play_type_wave.js"></script>
+<script>
+check_wave(document.getElementById('v'), true);
+
+mediaTestCleanup();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_can_play_type_webm.html b/dom/media/test/test_can_play_type_webm.html
new file mode 100644
index 000000000..8763d4f04
--- /dev/null
+++ b/dom/media/test/test_can_play_type_webm.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=566245
+-->
+<head>
+ <title>Test for Bug 566245: WebM backend</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=566245">Mozill
+a Bug 566245</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+
+<video id="v"></video>
+
+<pre id="test">
+<script src="can_play_type_webm.js"></script>
+<script>
+check_webm(document.getElementById('v'), true);
+mediaTestCleanup();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_chaining.html b/dom/media/test/test_chaining.html
new file mode 100644
index 000000000..8e74393b7
--- /dev/null
+++ b/dom/media/test/test_chaining.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: chained ogg files.</title>
+ <meta charset='utf-8'>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function finish_test(element) {
+ removeNodeAndSource(element);
+ manager.finished(element.token);
+}
+
+function onended(e) {
+ var t = e.target;
+ is(t._metadataCount, t._links, "We should have received "+ t._links +
+ " metadataloaded event. " + t.src);
+
+ // If we encounter a file that has links with a different numbers of channel,
+ // we stop the decoding at the end of the first link. Hence, we report normal
+ // |seekable| and |buffered| values.
+ if (t._links != 1) {
+ is(t.seekable.length, 0, "No seekable ranges should be reported." + t.src);
+ is(t.buffered.length, 0, "No buffered region should be reported." + t.src);
+ }
+
+ is(t.played.length, 1, "The played region should be continuous." + t.src);
+
+ if (t._links != 1) {
+ var oldCurrentTime = t.currentTime;
+ t.currentTime = 0.0;
+ is(t.currentTime, oldCurrentTime,
+ "Seeking should be disabled when playing chained media." + t.src);
+ }
+
+ finish_test(t);
+}
+
+function onmetadataloaded(e) {
+ var t = e.target;
+ if (! t._metadataCount) {
+ t._metadataCount = 0;
+ }
+
+ if (t._metadataCount > 1 && t._links === 1) {
+ ok(false, "We should receive only one \"loadedmetadata\" event for a chained file we don't support.")
+ }
+
+ // We should be able to assert equality here, but somehow it fails (rarely but
+ // still) on try. Instead, we give it a little slack and assert that the index
+ // increases monotonically.
+ ok(t.mozGetMetadata().index >= t._metadataCount || t._links === 1,
+ "The metadata index value should increase." + t.src);
+
+ // The files have all a user comment name 'index' that increments at each link
+ // in the chained media.
+ t._metadataCount++;
+ if (!t.playing && !t.ended) {
+ t.play();
+ }
+}
+
+function startTest(test, token) {
+ var elemType = /^audio/.test(test.type) ? "audio" : "video";
+ var element = document.createElement(elemType);
+ document.body.appendChild(element);
+ manager.started(token);
+ element._links= test.links;
+ element.src = test.name;
+ element.token = token;
+ element.controls = true;
+ element.addEventListener("loadedmetadata", onmetadataloaded);
+ element.addEventListener("ended", onended);
+ element.preload = "metadata";
+}
+
+manager.runTests(gChainingTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_clone_media_element.html b/dom/media/test/test_clone_media_element.html
new file mode 100644
index 000000000..cfd8388da
--- /dev/null
+++ b/dom/media/test/test_clone_media_element.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test: cloned media element should continue to play to the end even after the source of the original element is cleared</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// tests must run in sequence otherwise concurrent running test will also
+// update media cache which will hide the fact media cache not updated
+// after changes in media cache streams.
+PARALLEL_TESTS = 1;
+
+function startTest(test, token) {
+ manager.started(token);
+ info("Trying to load " + token);
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ v.src = test.name;
+
+ v.onloadedmetadata = function(evt) {
+ info(evt.target.token + " metadata loaded.");
+ evt.target.onloadedmetadata = null;
+ var clone = evt.target.cloneNode(false);
+ clone.token = evt.target.token;
+ clone.play();
+
+ clone.onloadstart = function(evt) {
+ info("cloned " + evt.target.token + " start loading.");
+ evt.target.onloadstart = null;
+ removeNodeAndSource(v);
+ }
+
+ clone.onended = function(evt) {
+ ok(true, "cloned " + evt.target.token + " ended.");
+ evt.target.onended = null;
+ removeNodeAndSource(evt.target);
+ manager.finished(evt.target.token);
+ }
+ }
+}
+
+var manager = new MediaTestManager;
+manager.runTests(gSmallTests.concat(gPlayedTests), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_closing_connections.html b/dom/media/test/test_closing_connections.html
new file mode 100644
index 000000000..177f54da9
--- /dev/null
+++ b/dom/media/test/test_closing_connections.html
@@ -0,0 +1,58 @@
+hg diff<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=479863
+-->
+<head>
+ <title>Test for Bug 479863 --- loading many connections</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="use_large_cache.js"></script>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=479863">Mozilla Bug 479863</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+
+<script type="application/javascript">
+window.onload = function() {
+ ok(true, "loaded metadata for all videos");
+ mediaTestCleanup();
+ SimpleTest.finish();
+}
+
+/* With normal per-domain connection limits and a naive implementation, we
+ won't ever be able to load all these videos because the first 15 (or whatever)
+ will each take up one HTTP connection (which will be suspended) and then
+ the others will be blocked by the per-domain HTTP connection limit. We
+ pass this test by closing the connection for non-buffered videos after
+ we've got the first frame.
+*/
+
+var resource = getPlayableVideo(gClosingConnectionsTest);
+
+SimpleTest.waitForExplicitFinish();
+function beginTest() {
+ if (resource != null) {
+ for (var i=0; i<20; ++i) {
+ var v = document.createElement("video");
+ v.src = resource.name;
+ v.preload = "metadata";
+ document.body.appendChild(v);
+ }
+ } else {
+ todo(false, "No types supported");
+ }
+}
+beginTest();
+</script>
+
+<pre id="test">
+<script type="application/javascript">
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_constants.html b/dom/media/test/test_constants.html
new file mode 100644
index 000000000..644088b82
--- /dev/null
+++ b/dom/media/test/test_constants.html
@@ -0,0 +1,228 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+ Adapted from:
+ http://simon.html5.org/test/html/dom/interfaces/htmlelement/htmlmediaelement/const-unsigned-short/001.htm
+-->
+<head>
+ <title>Media test: constants</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<video><source></video><audio><source></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+is(HTMLElement.NETWORK_EMPTY, undefined);
+is(HTMLElement.NETWORK_IDLE, undefined);
+is(HTMLElement.NETWORK_LOADING, undefined);
+is(HTMLElement.NETWORK_NO_SOURCE, undefined);
+is(HTMLElement.HAVE_NOTHING, undefined);
+is(HTMLElement.HAVE_METADATA, undefined);
+is(HTMLElement.HAVE_CURRENT_DATA, undefined);
+is(HTMLElement.HAVE_FUTURE_DATA, undefined);
+is(HTMLElement.HAVE_ENOUGH_DATA, undefined);
+is(HTMLElement.MEDIA_ERR_ABORTED, undefined);
+is(HTMLElement.MEDIA_ERR_NETWORK, undefined);
+is(HTMLElement.MEDIA_ERR_DECODE, undefined);
+is(HTMLElement.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLMediaElement.NETWORK_EMPTY, 0);
+is(HTMLMediaElement.NETWORK_IDLE, 1);
+is(HTMLMediaElement.NETWORK_LOADING, 2);
+is(HTMLMediaElement.NETWORK_NO_SOURCE, 3);
+is(HTMLMediaElement.HAVE_NOTHING, 0);
+is(HTMLMediaElement.HAVE_METADATA, 1);
+is(HTMLMediaElement.HAVE_CURRENT_DATA, 2);
+is(HTMLMediaElement.HAVE_FUTURE_DATA, 3);
+is(HTMLMediaElement.HAVE_ENOUGH_DATA, 4);
+is(HTMLMediaElement.MEDIA_ERR_ABORTED, undefined);
+is(HTMLMediaElement.MEDIA_ERR_NETWORK, undefined);
+is(HTMLMediaElement.MEDIA_ERR_DECODE, undefined);
+is(HTMLMediaElement.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLVideoElement.NETWORK_EMPTY, 0);
+is(HTMLVideoElement.NETWORK_IDLE, 1);
+is(HTMLVideoElement.NETWORK_LOADING, 2);
+is(HTMLVideoElement.NETWORK_NO_SOURCE, 3);
+is(HTMLVideoElement.HAVE_NOTHING, 0);
+is(HTMLVideoElement.HAVE_METADATA, 1);
+is(HTMLVideoElement.HAVE_CURRENT_DATA, 2);
+is(HTMLVideoElement.HAVE_FUTURE_DATA, 3);
+is(HTMLVideoElement.HAVE_ENOUGH_DATA, 4);
+is(HTMLVideoElement.MEDIA_ERR_ABORTED, undefined);
+is(HTMLVideoElement.MEDIA_ERR_NETWORK, undefined);
+is(HTMLVideoElement.MEDIA_ERR_DECODE, undefined);
+is(HTMLVideoElement.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLAudioElement.NETWORK_EMPTY, 0);
+is(HTMLAudioElement.NETWORK_IDLE, 1);
+is(HTMLAudioElement.NETWORK_LOADING, 2);
+is(HTMLAudioElement.NETWORK_NO_SOURCE, 3);
+is(HTMLAudioElement.HAVE_NOTHING, 0);
+is(HTMLAudioElement.HAVE_METADATA, 1);
+is(HTMLAudioElement.HAVE_CURRENT_DATA, 2);
+is(HTMLAudioElement.HAVE_FUTURE_DATA, 3);
+is(HTMLAudioElement.HAVE_ENOUGH_DATA, 4);
+is(HTMLAudioElement.MEDIA_ERR_ABORTED, undefined);
+is(HTMLAudioElement.MEDIA_ERR_NETWORK, undefined);
+is(HTMLAudioElement.MEDIA_ERR_DECODE, undefined);
+is(HTMLAudioElement.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLSourceElement.NETWORK_EMPTY, undefined);
+is(HTMLSourceElement.NETWORK_IDLE, undefined);
+is(HTMLSourceElement.NETWORK_LOADING, undefined);
+is(HTMLSourceElement.NETWORK_NO_SOURCE, undefined);
+is(HTMLSourceElement.HAVE_NOTHING, undefined);
+is(HTMLSourceElement.HAVE_METADATA, undefined);
+is(HTMLSourceElement.HAVE_CURRENT_DATA, undefined);
+is(HTMLSourceElement.HAVE_FUTURE_DATA, undefined);
+is(HTMLSourceElement.HAVE_ENOUGH_DATA, undefined);
+is(HTMLSourceElement.MEDIA_ERR_ABORTED, undefined);
+is(HTMLSourceElement.MEDIA_ERR_NETWORK, undefined);
+is(HTMLSourceElement.MEDIA_ERR_DECODE, undefined);
+is(HTMLSourceElement.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(MediaError.NETWORK_EMPTY, undefined);
+is(MediaError.NETWORK_IDLE, undefined);
+is(MediaError.NETWORK_LOADING, undefined);
+is(MediaError.NETWORK_NO_SOURCE, undefined);
+is(MediaError.HAVE_NOTHING, undefined);
+is(MediaError.HAVE_METADATA, undefined);
+is(MediaError.HAVE_CURRENT_DATA, undefined);
+is(MediaError.HAVE_FUTURE_DATA, undefined);
+is(MediaError.HAVE_ENOUGH_DATA, undefined);
+is(MediaError.MEDIA_ERR_ABORTED, 1);
+is(MediaError.MEDIA_ERR_NETWORK, 2);
+is(MediaError.MEDIA_ERR_DECODE, 3);
+is(MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, 4);
+is(document.body.NETWORK_EMPTY, undefined);
+is(document.body.NETWORK_IDLE, undefined);
+is(document.body.NETWORK_LOADING, undefined);
+is(document.body.NETWORK_NO_SOURCE, undefined);
+is(document.body.HAVE_NOTHING, undefined);
+is(document.body.HAVE_METADATA, undefined);
+is(document.body.HAVE_CURRENT_DATA, undefined);
+is(document.body.HAVE_FUTURE_DATA, undefined);
+is(document.body.HAVE_ENOUGH_DATA, undefined);
+is(document.body.MEDIA_ERR_ABORTED, undefined);
+is(document.body.MEDIA_ERR_NETWORK, undefined);
+is(document.body.MEDIA_ERR_DECODE, undefined);
+is(document.body.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(document.getElementsByTagName("video")[0].NETWORK_EMPTY, 0);
+is(document.getElementsByTagName("video")[0].NETWORK_IDLE, 1);
+is(document.getElementsByTagName("video")[0].NETWORK_LOADING, 2);
+is(document.getElementsByTagName("video")[0].NETWORK_NO_SOURCE, 3);
+is(document.getElementsByTagName("video")[0].HAVE_NOTHING, 0);
+is(document.getElementsByTagName("video")[0].HAVE_METADATA, 1);
+is(document.getElementsByTagName("video")[0].HAVE_CURRENT_DATA, 2);
+is(document.getElementsByTagName("video")[0].HAVE_FUTURE_DATA, 3);
+is(document.getElementsByTagName("video")[0].HAVE_ENOUGH_DATA, 4);
+is(document.getElementsByTagName("video")[0].MEDIA_ERR_ABORTED, undefined);
+is(document.getElementsByTagName("video")[0].MEDIA_ERR_NETWORK, undefined);
+is(document.getElementsByTagName("video")[0].MEDIA_ERR_DECODE, undefined);
+is(document.getElementsByTagName("video")[0].MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(document.getElementsByTagName("audio")[0].NETWORK_EMPTY, 0);
+is(document.getElementsByTagName("audio")[0].NETWORK_IDLE, 1);
+is(document.getElementsByTagName("audio")[0].NETWORK_LOADING, 2);
+is(document.getElementsByTagName("audio")[0].NETWORK_NO_SOURCE, 3);
+is(document.getElementsByTagName("audio")[0].HAVE_NOTHING, 0);
+is(document.getElementsByTagName("audio")[0].HAVE_METADATA, 1);
+is(document.getElementsByTagName("audio")[0].HAVE_CURRENT_DATA, 2);
+is(document.getElementsByTagName("audio")[0].HAVE_FUTURE_DATA, 3);
+is(document.getElementsByTagName("audio")[0].HAVE_ENOUGH_DATA, 4);
+is(document.getElementsByTagName("audio")[0].MEDIA_ERR_ABORTED, undefined);
+is(document.getElementsByTagName("audio")[0].MEDIA_ERR_NETWORK, undefined);
+is(document.getElementsByTagName("audio")[0].MEDIA_ERR_DECODE, undefined);
+is(document.getElementsByTagName("audio")[0].MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(document.getElementsByTagName("source")[0].NETWORK_EMPTY, undefined);
+is(document.getElementsByTagName("source")[0].NETWORK_IDLE, undefined);
+is(document.getElementsByTagName("source")[0].NETWORK_LOADING, undefined);
+is(document.getElementsByTagName("source")[0].NETWORK_NO_SOURCE, undefined);
+is(document.getElementsByTagName("source")[0].HAVE_NOTHING, undefined);
+is(document.getElementsByTagName("source")[0].HAVE_METADATA, undefined);
+is(document.getElementsByTagName("source")[0].HAVE_CURRENT_DATA, undefined);
+is(document.getElementsByTagName("source")[0].HAVE_FUTURE_DATA, undefined);
+is(document.getElementsByTagName("source")[0].HAVE_ENOUGH_DATA, undefined);
+is(document.getElementsByTagName("source")[0].MEDIA_ERR_ABORTED, undefined);
+is(document.getElementsByTagName("source")[0].MEDIA_ERR_NETWORK, undefined);
+is(document.getElementsByTagName("source")[0].MEDIA_ERR_DECODE, undefined);
+is(document.getElementsByTagName("source")[0].MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLElement.prototype.NETWORK_EMPTY, undefined);
+is(HTMLElement.prototype.NETWORK_IDLE, undefined);
+is(HTMLElement.prototype.NETWORK_LOADING, undefined);
+is(HTMLElement.prototype.NETWORK_NO_SOURCE, undefined);
+is(HTMLElement.prototype.HAVE_NOTHING, undefined);
+is(HTMLElement.prototype.HAVE_METADATA, undefined);
+is(HTMLElement.prototype.HAVE_CURRENT_DATA, undefined);
+is(HTMLElement.prototype.HAVE_FUTURE_DATA, undefined);
+is(HTMLElement.prototype.HAVE_ENOUGH_DATA, undefined);
+is(HTMLElement.prototype.MEDIA_ERR_ABORTED, undefined);
+is(HTMLElement.prototype.MEDIA_ERR_NETWORK, undefined);
+is(HTMLElement.prototype.MEDIA_ERR_DECODE, undefined);
+is(HTMLElement.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLMediaElement.prototype.NETWORK_EMPTY, 0, "HTMLMediaElement.prototype.NETWORK_EMPTY");
+is(HTMLMediaElement.prototype.NETWORK_IDLE, 1, "HTMLMediaElement.prototype.NETWORK_IDLE");
+is(HTMLMediaElement.prototype.NETWORK_LOADING, 2, "HTMLMediaElement.prototype.NETWORK_LOADING");
+is(HTMLMediaElement.prototype.NETWORK_NO_SOURCE, 3, "HTMLMediaElement.prototype.NETWORK_NO_SOURCE");
+is(HTMLMediaElement.prototype.HAVE_NOTHING, 0, "HTMLMediaElement.prototype.HAVE_NOTHING");
+is(HTMLMediaElement.prototype.HAVE_METADATA, 1, "HTMLMediaElement.prototype.HAVE_METADATA");
+is(HTMLMediaElement.prototype.HAVE_CURRENT_DATA, 2, "HTMLMediaElement.prototype.HAVE_CURRENT_DATA");
+is(HTMLMediaElement.prototype.HAVE_FUTURE_DATA, 3, "HTMLMediaElement.prototype.HAVE_FUTURE_DATA");
+is(HTMLMediaElement.prototype.HAVE_ENOUGH_DATA, 4, "HTMLMediaElement.prototype.HAVE_ENOUGH_DATA");
+is(HTMLMediaElement.prototype.MEDIA_ERR_ABORTED, undefined, "HTMLMediaElement.prototype.MEDIA_ERR_ABORTED");
+is(HTMLMediaElement.prototype.MEDIA_ERR_NETWORK, undefined, "HTMLMediaElement.prototype.MEDIA_ERR_NETWORK");
+is(HTMLMediaElement.prototype.MEDIA_ERR_DECODE, undefined, "HTMLMediaElement.prototype.MEDIA_ERR_DECODE");
+is(HTMLMediaElement.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined, "HTMLMediaElement.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED");
+is(HTMLVideoElement.prototype.NETWORK_EMPTY, 0);
+is(HTMLVideoElement.prototype.NETWORK_IDLE, 1);
+is(HTMLVideoElement.prototype.NETWORK_LOADING, 2);
+is(HTMLVideoElement.prototype.NETWORK_NO_SOURCE, 3);
+is(HTMLVideoElement.prototype.HAVE_NOTHING, 0);
+is(HTMLVideoElement.prototype.HAVE_METADATA, 1);
+is(HTMLVideoElement.prototype.HAVE_CURRENT_DATA, 2);
+is(HTMLVideoElement.prototype.HAVE_FUTURE_DATA, 3);
+is(HTMLVideoElement.prototype.HAVE_ENOUGH_DATA, 4);
+is(HTMLVideoElement.prototype.MEDIA_ERR_ABORTED, undefined);
+is(HTMLVideoElement.prototype.MEDIA_ERR_NETWORK, undefined);
+is(HTMLVideoElement.prototype.MEDIA_ERR_DECODE, undefined);
+is(HTMLVideoElement.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLAudioElement.prototype.NETWORK_EMPTY, 0);
+is(HTMLAudioElement.prototype.NETWORK_IDLE, 1);
+is(HTMLAudioElement.prototype.NETWORK_LOADING, 2);
+is(HTMLAudioElement.prototype.NETWORK_NO_SOURCE, 3);
+is(HTMLAudioElement.prototype.HAVE_NOTHING, 0);
+is(HTMLAudioElement.prototype.HAVE_METADATA, 1);
+is(HTMLAudioElement.prototype.HAVE_CURRENT_DATA, 2);
+is(HTMLAudioElement.prototype.HAVE_FUTURE_DATA, 3);
+is(HTMLAudioElement.prototype.HAVE_ENOUGH_DATA, 4);
+is(HTMLAudioElement.prototype.MEDIA_ERR_ABORTED, undefined);
+is(HTMLAudioElement.prototype.MEDIA_ERR_NETWORK, undefined);
+is(HTMLAudioElement.prototype.MEDIA_ERR_DECODE, undefined);
+is(HTMLAudioElement.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(HTMLSourceElement.prototype.NETWORK_EMPTY, undefined);
+is(HTMLSourceElement.prototype.NETWORK_IDLE, undefined);
+is(HTMLSourceElement.prototype.NETWORK_LOADING, undefined);
+is(HTMLSourceElement.prototype.NETWORK_NO_SOURCE, undefined);
+is(HTMLSourceElement.prototype.HAVE_NOTHING, undefined);
+is(HTMLSourceElement.prototype.HAVE_METADATA, undefined);
+is(HTMLSourceElement.prototype.HAVE_CURRENT_DATA, undefined);
+is(HTMLSourceElement.prototype.HAVE_FUTURE_DATA, undefined);
+is(HTMLSourceElement.prototype.HAVE_ENOUGH_DATA, undefined);
+is(HTMLSourceElement.prototype.MEDIA_ERR_ABORTED, undefined);
+is(HTMLSourceElement.prototype.MEDIA_ERR_NETWORK, undefined);
+is(HTMLSourceElement.prototype.MEDIA_ERR_DECODE, undefined);
+is(HTMLSourceElement.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED, undefined);
+is(MediaError.prototype.NETWORK_EMPTY, undefined);
+is(MediaError.prototype.NETWORK_IDLE, undefined);
+is(MediaError.prototype.NETWORK_LOADING, undefined);
+is(MediaError.prototype.NETWORK_NO_SOURCE, undefined);
+is(MediaError.prototype.HAVE_NOTHING, undefined);
+is(MediaError.prototype.HAVE_METADATA, undefined);
+is(MediaError.prototype.HAVE_CURRENT_DATA, undefined);
+is(MediaError.prototype.HAVE_FUTURE_DATA, undefined);
+is(MediaError.prototype.HAVE_ENOUGH_DATA, undefined);
+is(MediaError.prototype.MEDIA_ERR_ABORTED, 1);
+is(MediaError.prototype.MEDIA_ERR_NETWORK, 2);
+is(MediaError.prototype.MEDIA_ERR_DECODE, 3);
+is(MediaError.prototype.MEDIA_ERR_SRC_NOT_SUPPORTED, 4);
+ok(document.getElementsByTagName("video")[0].buffered instanceof TimeRanges, "video.buffered must be TimeRanges object");
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_controls.html b/dom/media/test/test_controls.html
new file mode 100644
index 000000000..1c80cc7d8
--- /dev/null
+++ b/dom/media/test/test_controls.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: controls</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<video id='v1'></video><audio id='a1'></audio>
+<video id='v2' controls></video><audio id='a2' controls></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var v2 = document.getElementById('v2');
+var a2 = document.getElementById('a2');
+ok(!v1.controls, "v1.controls should be false by default");
+ok(!a1.controls, "v1.controls should be false by default");
+ok(v2.controls, "v2.controls should be true");
+ok(a2.controls, "v2.controls should be true");
+v2.controls=false;
+a2.controls=false;
+ok(!v2.controls, "v2.controls should be false");
+ok(!a2.controls, "a2.controls should be false");
+v2.controls=true;
+a2.controls=true;
+ok(v2.controls, "v2.controls should be true");
+ok(a2.controls, "a2.controls should be true");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_cueless_webm_seek-1.html b/dom/media/test/test_cueless_webm_seek-1.html
new file mode 100644
index 000000000..8e501a61e
--- /dev/null
+++ b/dom/media/test/test_cueless_webm_seek-1.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=657791
+-->
+<head>
+ <title>Test for Bug 657791</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=657791">Mozilla Bug 657791</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+// Subset of seek tests for cueless WebMs. When random seeking (rather than just
+// in buffered ranges) is implemented for WebM, these tests can be removed and
+// the cueless WebM(s) references can be moved to the general test_seek test
+// array.
+// Test array is defined in manifest.js
+
+var manager = new MediaTestManager;
+
+// Exercise functionality as in test_seek-1
+function testWebM1(e) {
+ var v = e.target;
+ v.removeEventListener('loadeddata', testWebM1);
+
+ var startPassed = false;
+ var endPassed = false;
+ var seekFlagStart = false;
+ var seekFlagEnd = false;
+ var readonly = true;
+ var completed = false;
+
+ ok(v.buffered.length >= 1, "Should have a buffered range");
+ var halfBuffered = v.buffered.end(0) / 2;
+
+ function startTest() {
+ is(v.seekable.start(0), v.buffered.start(0), "Seekable start should be buffered start");
+ is(v.seekable.end(0), v.buffered.end(0), "Seekable end should be buffered end");
+ ok(!completed, "Should not be completed yet");
+ ok(!v.seeking, "seeking should default to false");
+ try {
+ v.seeking = true;
+ readonly = v.seeking === false;
+ }
+ catch(e) {
+ readonly = "threw exception: " + e;
+ }
+ is(readonly, true, "seeking should be readonly");
+
+ v.currentTime = halfBuffered;
+ seekFlagStart = v.seeking;
+ }
+
+ function seekStarted() {
+ ok(!completed, "should not be completed yet");
+ startPassed = true;
+ }
+
+ function seekEnded() {
+ ok(!completed, "should not be completed yet");
+ ok(Math.abs(v.currentTime - halfBuffered) < 0.1,
+ "Video currentTime should be around " + halfBuffered + ": " + v.currentTime + " (seeked)");
+ endPassed = true;
+ seekFlagEnd = v.seeking;
+ v.play();
+ }
+
+ function playbackEnded() {
+ ok(!completed, "should not be completed yet");
+
+ completed = true;
+ ok(startPassed, "seeking event");
+ ok(endPassed, "seeked event");
+ ok(seekFlagStart, "seeking flag on start should be true");
+ ok(!seekFlagEnd, "seeking flag on end should be false");
+ removeNodeAndSource(v);
+ manager.finished(v._token);
+ }
+
+ once(v, "ended", playbackEnded);
+ once(v, "seeking", seekStarted);
+ once(v, "seeked", seekEnded);
+
+ startTest();
+}
+
+// Fetch the media resource using XHR so we can be sure the entire
+// resource is loaded before we test buffered ranges. This ensures
+// we have deterministic behaviour.
+function fetch(url, fetched_callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, true);
+ xhr.responseType = "blob";
+
+ var loaded = function (event) {
+ if (xhr.status == 200 || xhr.status == 206) {
+ // Request fulfilled. Note sometimes we get 206... Presumably because either
+ // httpd.js or Necko cached the result.
+ fetched_callback(window.URL.createObjectURL(xhr.response));
+ } else {
+ ok(false, "Fetch failed headers=" + xhr.getAllResponseHeaders());
+ }
+ };
+
+ xhr.addEventListener("load", loaded, false);
+ xhr.send();
+}
+
+function startTest(test, token) {
+ var onfetched = function(uri) {
+ var v = document.createElement('video');
+ v._token = token;
+ v.src = uri;
+ v.addEventListener("loadeddata", testWebM1, false);
+ document.body.appendChild(v);
+ }
+ manager.started(token);
+ fetch(test.name, onfetched);
+}
+
+SimpleTest.waitForExplicitFinish();
+manager.runTests(gCuelessWebMTests, startTest);
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_cueless_webm_seek-2.html b/dom/media/test/test_cueless_webm_seek-2.html
new file mode 100644
index 000000000..baf14c8a5
--- /dev/null
+++ b/dom/media/test/test_cueless_webm_seek-2.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=657791
+-->
+<head>
+ <title>Test for Bug 657791</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=657791">Mozilla Bug 657791</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+// Subset of seek tests for cueless WebMs. When random seeking (rather than just
+// in buffered ranges) is implemented for WebM, these tests can be removed and
+// the cueless WebM(s) references can be moved to the general test_seek test
+// array.
+// Test array is defined in manifest.js
+
+var manager = new MediaTestManager;
+
+// Exercise functionality as in test_seek-2
+function testWebM2(e) {
+ var v = e.target;
+ v.removeEventListener('loadeddata', testWebM2);
+
+ var startPassed = false;
+ var endPassed = false;
+ var completed = false;
+
+ ok(v.buffered.length >= 1, "Should have a buffered range");
+ var halfBuffered = v.buffered.end(0) / 2;
+
+ function startTest() {
+ if (completed)
+ return;
+
+ is(v.seekable.start(0), v.buffered.start(0), "Seekable start should be buffered start");
+ is(v.seekable.end(0), v.buffered.end(0), "Seekable end should be buffered end");
+ v.currentTime=halfBuffered;
+ v.play();
+ }
+
+ function seekStarted() {
+ if (completed)
+ return;
+
+ startPassed = true;
+ }
+
+ function seekEnded() {
+ if (completed)
+ return;
+
+ endPassed = true;
+ }
+
+ function playbackEnded() {
+ if (completed)
+ return;
+
+ completed = true;
+ ok(startPassed, "send seeking event");
+ ok(endPassed, "send seeked event");
+ ok(v.ended, "Checking playback has ended");
+ ok(Math.abs(v.currentTime - v.duration) <= 0.1, "Checking currentTime at end: " + v.currentTime);
+ removeNodeAndSource(v);
+ manager.finished(v._token);
+ }
+
+ v.addEventListener("ended", playbackEnded, false);
+ v.addEventListener("seeking", seekStarted, false);
+ v.addEventListener("seeked", seekEnded, false);
+
+ startTest();
+}
+
+// Fetch the media resource using XHR so we can be sure the entire
+// resource is loaded before we test buffered ranges. This ensures
+// we have deterministic behaviour.
+function fetch(url, fetched_callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, true);
+ xhr.responseType = "blob";
+
+ var loaded = function (event) {
+ if (xhr.status == 200 || xhr.status == 206) {
+ // Request fulfilled. Note sometimes we get 206... Presumably because either
+ // httpd.js or Necko cached the result.
+ fetched_callback(window.URL.createObjectURL(xhr.response));
+ } else {
+ ok(false, "Fetch failed headers=" + xhr.getAllResponseHeaders());
+ }
+ };
+
+ xhr.addEventListener("load", loaded, false);
+ xhr.send();
+}
+
+function startTest(test, token) {
+ var onfetched = function(uri) {
+ var v = document.createElement('video');
+ v._token = token;
+ v.src = uri;
+ v.addEventListener("loadeddata", testWebM2, false);
+ document.body.appendChild(v);
+ }
+ manager.started(token);
+ fetch(test.name, onfetched);
+}
+
+SimpleTest.waitForExplicitFinish();
+manager.runTests(gCuelessWebMTests, startTest);
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_cueless_webm_seek-3.html b/dom/media/test/test_cueless_webm_seek-3.html
new file mode 100644
index 000000000..9058bdf05
--- /dev/null
+++ b/dom/media/test/test_cueless_webm_seek-3.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=657791
+-->
+<head>
+ <title>Test for Bug 657791</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=657791">Mozilla Bug 657791</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+// Subset of seek tests for cueless WebMs. When random seeking (rather than just
+// in buffered ranges) is implemented for WebM, these tests can be removed and
+// the cueless WebM(s) references can be moved to the general test_seek test
+// array.
+// Test array is defined in manifest.js
+
+var manager = new MediaTestManager;
+
+// Exercise functionality as in test_seek-3
+function testWebM3(e) {
+ var v = e.target;
+ v.removeEventListener('loadeddata', testWebM3);
+
+ var startPassed = false;
+ var completed = false;
+ var gotTimeupdate = false;
+
+ ok(v.buffered.length >= 1, "Should have a buffered range");
+ var halfBuffered = v.buffered.end(0) / 2;
+
+ function startTest() {
+ if (completed)
+ return;
+
+ is(v.seekable.start(0), v.buffered.start(0), "Seekable start should be buffered start");
+ is(v.seekable.end(0), v.buffered.end(0), "Seekable end should be buffered end");
+ v.currentTime=halfBuffered;
+ }
+
+ function timeupdate() {
+ gotTimeupdate = true;
+ v.removeEventListener("timeupdate", timeupdate, false);
+ }
+
+ function seekStarted() {
+ if (completed)
+ return;
+
+ v.addEventListener("timeupdate", timeupdate, false);
+ startPassed = true;
+ }
+
+ function seekEnded() {
+ if (completed)
+ return;
+
+ var t = v.currentTime;
+ ok(Math.abs(t - halfBuffered) <= 0.1, "Video currentTime should be around " + halfBuffered + ": " + t);
+ ok(gotTimeupdate, "Should have got timeupdate between seeking and seekended");
+ completed = true;
+ removeNodeAndSource(v);
+ manager.finished(v._token);
+ }
+
+ v.addEventListener("seeking", seekStarted, false);
+ v.addEventListener("seeked", seekEnded, false);
+
+ startTest()
+}
+
+// Fetch the media resource using XHR so we can be sure the entire
+// resource is loaded before we test buffered ranges. This ensures
+// we have deterministic behaviour.
+function fetch(url, fetched_callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, true);
+ xhr.responseType = "blob";
+
+ var loaded = function (event) {
+ if (xhr.status == 200 || xhr.status == 206) {
+ // Request fulfilled. Note sometimes we get 206... Presumably because either
+ // httpd.js or Necko cached the result.
+ fetched_callback(window.URL.createObjectURL(xhr.response));
+ } else {
+ ok(false, "Fetch failed headers=" + xhr.getAllResponseHeaders());
+ }
+ };
+
+ xhr.addEventListener("load", loaded, false);
+ xhr.send();
+}
+
+function startTest(test, token) {
+ var onfetched = function(uri) {
+ var v = document.createElement('video');
+ v._token = token;
+ v.src = uri;
+ v.addEventListener("loadeddata", testWebM3, false);
+ document.body.appendChild(v);
+ }
+ manager.started(token);
+ fetch(test.name, onfetched);
+}
+
+SimpleTest.waitForExplicitFinish();
+manager.runTests(gCuelessWebMTests, startTest);
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_currentTime.html b/dom/media/test/test_currentTime.html
new file mode 100644
index 000000000..67b3a4b26
--- /dev/null
+++ b/dom/media/test/test_currentTime.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: currentTime</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<video id='v1'></video><audio id='a1'></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+is(v1.currentTime, 0.0);
+is(a1.currentTime, 0.0);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_decode_error.html b/dom/media/test/test_decode_error.html
new file mode 100644
index 000000000..e940fcd18
--- /dev/null
+++ b/dom/media/test/test_decode_error.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: unknown/invalid formats raise decode error</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var ok = function (condition, name) {
+ SimpleTest.ok(condition, test.name + ": " + name);
+ }
+ var is = function (a, b, name) {
+ SimpleTest.is(a, b, test.name + ": " + name);
+ }
+
+ var v = document.createElement("video");
+ manager.started(token);
+ v.addEventListener("error", function (event) {
+ var el = event.currentTarget;
+ is(event.type, "error", "Expected event of type 'error'");
+ ok(el.error, "Element 'error' attr expected to have a value");
+ ok(el.error instanceof MediaError, "Element 'error' attr expected to be MediaError");
+ if (v.readyState == v.HAVE_NOTHING) {
+ is(el.error.code, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, "Expected media not supported error");
+ } else {
+ is(el.error.code, MediaError.MEDIA_ERR_DECODE, "Expected a decode error");
+ }
+ ok(typeof el.error.message === 'string' || el.error.essage instanceof String, "Element 'message' attr expected to be a string");
+ ok(el.error.message.length > 0, "Element 'message' attr has content");
+ el._sawError = true;
+ manager.finished(token);
+ }, false);
+
+ v.addEventListener("loadeddata", function () {
+ ok(false, "Unexpected loadeddata event");
+ manager.finished(token);
+ }, false);
+
+ v.autoplay = true;
+ v.addEventListener("ended", function () {
+ ok(false, "Unexpected ended event");
+ manager.finished(token);
+ }, false);
+
+ v.src = test.name; // implicitly starts a load.
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({
+ "set": [
+ ["media.cache_size", 40000],
+ ]
+}, beginTest);
+function beginTest() {
+ manager.runTests(gDecodeErrorTests, startTest);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_decoder_disable.html b/dom/media/test/test_decoder_disable.html
new file mode 100644
index 000000000..218d527f2
--- /dev/null
+++ b/dom/media/test/test_decoder_disable.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=448600
+-->
+<head>
+ <title>Test for Bug 448600</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=448600">Mozilla Bug 448600</a>
+<p id="display"></p>
+
+
+<pre id="test">
+<script type="application/javascript">
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+function e(id) {
+ return document.getElementById(id);
+}
+
+var gLoadError = new Object();
+
+gLoadError['video1'] = 0;
+gLoadError['video2'] = 0;
+gLoadError['video3'] = 0;
+
+var gErrorCount = 0;
+
+SimpleTest.waitForExplicitFinish();
+
+function finishTest() {
+ is(e('video1').currentSrc,
+ "",
+ 'video1 currentSrc should be empty when there\'s no playable typed source children');
+ is(filename(e('video2').currentSrc),
+ filename(e('video2').src),
+ 'video2 currentSrc should match src');
+ is(filename(e('video3').currentSrc),
+ filename(e('video3').src),
+ 'video3 currentSrc should match src');
+
+ is(gLoadError['video1'], 2, "Expect one error per invalid source child on video1");
+ is(gLoadError['video2'], 1, "Expect one error on video2");
+ is(gLoadError['video3'], 1, "Expect one error on video3");
+
+ SimpleTest.finish();
+}
+
+function videoError(event, id) {
+ gLoadError[id]++;
+ gErrorCount++;
+ if (gErrorCount >= 4) {
+ finishTest();
+ }
+}
+
+</script>
+<!-- We make the resource URIs unique to ensure that they are (re)loaded with the new disable-decoder prefs. -->
+<div id="content">
+</div>
+<script>
+function makeVideos() {
+ document.getElementById('content').innerHTML = '<video id="video1" preload="metadata"><source type="video/ogg" src="320x240.ogv?decoder_disabled=1" onerror="videoError(event, \'video1\');"/><source type="audio/wave" src="r11025_u8_c1.wav?decoder_disabled=1" id=\'s2\' onerror="videoError(event, \'video1\');"/></video><video id="video2" preload="metadata" src="320x240.ogv?decoder_disabled=2" onerror="videoError(event, \'video2\');"></video><video id="video3" preload="metadata" src="r11025_u8_c1.wav?decoder_disabled=2" onerror="videoError(event, \'video3\');"></video>';
+}
+
+SpecialPowers.pushPrefEnv({"set": [["media.ogg.enabled", false], ["media.wave.enabled", false]]}, makeVideos);
+</script>
+
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_defaultMuted.html b/dom/media/test/test_defaultMuted.html
new file mode 100644
index 000000000..de6d642e5
--- /dev/null
+++ b/dom/media/test/test_defaultMuted.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: defaultMuted</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="../../../dom/html/test/reflect.js"></script>
+</head>
+<body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=706731">Mozilla Bug 706731</a>
+ <p id="display"></p>
+ <div id="content" style="display: none"></div>
+ <video id='v1'></video><audio id='a1'></audio>
+ <video id='v2' muted></video><audio id='a2' muted></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ reflectBoolean({
+ element: document.createElement("video"),
+ attribute: { content: "muted", idl: "defaultMuted" },
+ });
+
+ reflectBoolean({
+ element: document.createElement("audio"),
+ attribute: { content: "muted", idl: "defaultMuted" },
+ });
+
+ var v1 = document.getElementById('v1');
+ var a1 = document.getElementById('a1');
+ var v2 = document.getElementById('v2');
+ var a2 = document.getElementById('a2');
+
+ // Check that muted state correspond to the default value.
+ is(v1.muted, false, "v1.muted should be false by default");
+ is(a1.muted, false, "a1.muted should be false by default");
+ is(v2.muted, true, "v2.muted should be true by default");
+ is(a2.muted, true, "a2.muted should be true by default");
+
+ // Changing defaultMuted value should not change current muted state.
+ v1.defaultMuted = true;
+ a1.defaultMuted = true;
+ v2.defaultMuted = false;
+ a2.defaultMuted = false;
+
+ is(v1.muted, false, "v1.muted should not have changed");
+ is(a1.muted, false, "a1.muted should not have changed");
+ is(v2.muted, true, "v2.muted should not have changed");
+ is(a2.muted, true, "a2.muted should not have changed");
+
+ mediaTestCleanup();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_delay_load.html b/dom/media/test/test_delay_load.html
new file mode 100644
index 000000000..419f0d636
--- /dev/null
+++ b/dom/media/test/test_delay_load.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=479711
+-->
+<head>
+ <title>Test for Bug 479711</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+ <script>
+
+ var gRegisteredElements = [];
+ var testWindows = [];
+
+ function register(v) {
+ gRegisteredElements.push(v);
+ }
+
+ function loaded() {
+ info("onload fired!");
+
+ for (var i = 0; i < gRegisteredElements.length; ++i) {
+ var v = gRegisteredElements[i];
+ ok(v.readyState >= v.HAVE_CURRENT_DATA,
+ v._name + ":" + v.id + " is not ready before onload fired (" + v.readyState + ")");
+ }
+
+ for (i=0; i<testWindows.length; ++i) {
+ testWindows[i].close();
+ }
+
+ mediaTestCleanup();
+
+ SimpleTest.finish();
+ }
+
+ addLoadEvent(loaded);
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=479711">Mozilla Bug 479711</a>
+<p id="display"></p>
+<div id="content" style="display: none"></div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 479711 **/
+
+function createVideo(name, type, id) {
+ var v = document.createElement("video");
+ v.preload = "metadata";
+ // Make sure each video is a unique resource
+ v.src = name + "?" + id;
+ v._name = name;
+ v.id = id;
+ register(v);
+ return v;
+}
+
+var test = getPlayableVideo(gSmallTests);
+
+// Straightforward add, causing a load.
+var v = createVideo(test.name, test.type, "1");
+document.body.appendChild(v);
+
+// Load, add, then remove.
+v = createVideo(test.name, test.type, "1");
+v.load();
+document.body.appendChild(v);
+v.remove();
+
+// Load and add.
+v = createVideo(test.name, test.type, "2");
+v.load();
+document.body.appendChild(v);
+
+// Load outside of doc.
+v = createVideo(test.name, test.type, "3");
+v.load();
+
+// Open a new window for the following test. We open it here instead of in
+// the event handler to ensure that our document load event doesn't fire while
+// window.open is spinning the event loop.
+var w = window.open("", "testWindow", "width=400,height=400");
+testWindows.push(w);
+
+v = createVideo(test.name, test.type, "4");
+v.onloadstart = function(e) {
+ // Using a new window to do this is a bit annoying, but if we use an iframe here,
+ // delaying of the iframe's load event might interfere with the firing of our load event
+ // in some confusing way. So it's simpler just to use another window.
+ w.document.body.appendChild(v);
+};
+v.load(); // load started while in this document, this doc's load will block until
+ // the video's finished loading (in the other document).
+
+if (gRegisteredElements.length > 0) {
+ SimpleTest.waitForExplicitFinish();
+} else {
+ todo(false, "No types supported");
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_canvas_blocked.html b/dom/media/test/test_eme_canvas_blocked.html
new file mode 100644
index 000000000..e84b6db40
--- /dev/null
+++ b/dom/media/test/test_eme_canvas_blocked.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token)
+{
+ manager.started(token);
+
+ var sessions = [];
+
+ var v = SetupEME(test, token);
+ v.preload = "auto"; // Required due to "canplay" not firing for MSE unless we do this.
+
+ v.addEventListener("loadeddata", function(ev) {
+ var video = ev.target;
+ var canvas = document.createElement("canvas");
+ canvas.width = video.videoWidth;
+ canvas.height = video.videoHeight;
+ document.body.appendChild(canvas);
+ var ctx = canvas.getContext("2d");
+ var threwError = false;
+ try {
+ ctx.drawImage(video, 0, 0);
+ } catch (ex) {
+ threwError = true;
+ }
+ ok(threwError, TimeStamp(token) + " - Should throw an error when trying to draw EME video to canvas.");
+ manager.finished(token);
+ });
+
+ LoadTestWithManagedLoadToken(test, v, manager, token,
+ { onlyLoadFirstFragments:2, noEndOfStream:false });
+}
+
+function beginTest() {
+ manager.runTests(gEMETests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_detach_media_keys.html b/dom/media/test/test_eme_detach_media_keys.html
new file mode 100644
index 000000000..6d3dc8467
--- /dev/null
+++ b/dom/media/test/test_eme_detach_media_keys.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<video id="v" controls></video>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function createAndSet() {
+ return new Promise(function(resolve, reject) {
+ var m;
+ navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, gCencMediaKeySystemConfig)
+ .then(function (access) {
+ return access.createMediaKeys();
+ })
+ .then(function (mediaKeys) {
+ m = mediaKeys;
+ return document.getElementById("v").setMediaKeys(mediaKeys);
+ })
+ .then(function() {
+ resolve(m);
+ });
+ }
+)}
+
+var m1,m2;
+
+// Test that if we create and set two MediaKeys on one video element,
+// that if the first MediaKeys we set on the media elemnt is still usable
+// after the second MediaKeys has been set on the media element.
+SetupEMEPref(() => {
+ createAndSet().then((m) => {
+ m1 = m; // Stash MediaKeys.
+ return createAndSet();
+ })
+ .then((m) => {
+ m2 = m;
+ is(document.getElementById("v").mediaKeys, m2, "Should have set MediaKeys on media element");
+ ok(document.getElementById("v").mediaKeys != m1, "First MediaKeys should no longer be set on media element");
+ var s = m1.createSession("temporary");
+ return s.generateRequest("webm", StringToArrayBuffer(atob('YAYeAX5Hfod+V9ANHtANHg==')));
+ })
+ .then(() => {
+ ok(true, "Was able to generateRequest using second CDM");
+ SimpleTest.finish();
+ }, () => {
+ ok(false, "Was *NOT* able to generateRequest using second CDM");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_initDataTypes.html b/dom/media/test/test_eme_initDataTypes.html
new file mode 100644
index 000000000..4821c3cb8
--- /dev/null
+++ b/dom/media/test/test_eme_initDataTypes.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var tests = [
+ {
+ name: "One keyId",
+ initDataType: 'keyids',
+ initData: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A"]}',
+ expectedRequest: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A"],"type":"temporary"}',
+ sessionType: 'temporary',
+ expectPass: true,
+ },
+ {
+ name: "Two keyIds",
+ initDataType: 'keyids',
+ initData: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A", "0DdtU9od-Bh5L3xbv0Xf_A"]}',
+ expectedRequest: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A","0DdtU9od-Bh5L3xbv0Xf_A"],"type":"temporary"}',
+ sessionType: 'temporary',
+ expectPass: true,
+ },
+ {
+ name: "Two keyIds, temporary session",
+ initDataType: 'keyids',
+ initData: '{"type":"temporary", "kids":["LwVHf8JLtPrv2GUXFW2v_A", "0DdtU9od-Bh5L3xbv0Xf_A"]}',
+ expectedRequest: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A","0DdtU9od-Bh5L3xbv0Xf_A"],"type":"temporary"}',
+ sessionType: 'temporary',
+ expectPass: true,
+ },
+ {
+ name: "Two keyIds, persistent session, type before kids",
+ initDataType: 'keyids',
+ initData: '{"type":"persistent-license", "kids":["LwVHf8JLtPrv2GUXFW2v_A", "0DdtU9od-Bh5L3xbv0Xf_A"]}',
+ expectedRequest: '{"kids":["LwVHf8JLtPrv2GUXFW2v_A","0DdtU9od-Bh5L3xbv0Xf_A"],"type":"persistent-license"}',
+ sessionType: 'persistent-license',
+ expectPass: false,
+ },
+ {
+ name: "Invalid keyId",
+ initDataType: 'keyids',
+ initData: '{"kids":["0"]}',
+ sessionType: 'temporary',
+ expectPass: false,
+ },
+ {
+ name: "Empty keyId",
+ initDataType: 'keyids',
+ initData: '{"kids":[""]}',
+ sessionType: 'temporary',
+ expectPass: false,
+ },
+ {
+ name: "Invalid initData",
+ initDataType: 'keyids',
+ initData: 'invalid initData',
+ sessionType: 'temporary',
+ expectPass: false,
+ },
+ {
+ name: "'webm' initDataType",
+ initDataType: 'webm',
+ initData: 'YAYeAX5Hfod+V9ANHtANHg==',
+ expectedRequest: '{"kids":["YAYeAX5Hfod-V9ANHtANHg"],"type":"temporary"}',
+ sessionType: 'temporary',
+ expectPass: true,
+ },
+ {
+ name: "'webm' initDataType with non 16 byte keyid",
+ initDataType: 'webm',
+ initData: 'YAYeAX5Hfod',
+ expectedRequest: '{\"kids\":[\"YAYeAX5Hfoc\"],\"type\":\"temporary\"}',
+ sessionType: 'temporary',
+ expectPass: true,
+ },
+];
+
+function PrepareInitData(initDataType, initData)
+{
+ if (initDataType == "keyids") {
+ return new TextEncoder().encode(initData);
+ } else if (initDataType == "webm") {
+ return StringToArrayBuffer(atob(initData));
+ }
+}
+
+function Test(test) {
+ return new Promise(function(resolve, reject) {
+ var configs = [{
+ initDataTypes: [test.initDataType],
+ videoCapabilities: [{contentType: 'video/mp4' }],
+ }];
+ navigator.requestMediaKeySystemAccess('org.w3.clearkey', configs)
+ .then((access) => access.createMediaKeys())
+ .then((mediaKeys) => {
+ var session = mediaKeys.createSession(test.sessionType);
+ session.addEventListener("message", function(event) {
+ is(event.messageType, "license-request", "'" + test.name + "' MediaKeyMessage type should be license-request.");
+ var text = new TextDecoder().decode(event.message);
+ is(text, test.expectedRequest, "'" + test.name + "' got expected response.");
+ is(text == test.expectedRequest, test.expectPass,
+ "'" + test.name + "' expected to " + (test.expectPass ? "pass" : "fail"));
+ resolve();
+ });
+ var initData = PrepareInitData(test.initDataType, test.initData);
+ return session.generateRequest(test.initDataType, initData);
+ }
+ ).catch((x) => {
+ ok(!test.expectPass, "'" + test.name + "' expected to fail.");
+ resolve();
+ });
+ });
+}
+
+function beginTest() {
+ Promise.all(tests.map(Test)).then(function() { SimpleTest.finish(); });
+}
+
+SimpleTest.waitForExplicitFinish();
+SetupEMEPref(beginTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_missing_pssh.html b/dom/media/test/test_eme_missing_pssh.html
new file mode 100644
index 000000000..196ced402
--- /dev/null
+++ b/dom/media/test/test_eme_missing_pssh.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+ </head>
+ <body>
+ <audio controls id="audio"></audio>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+
+ // Tests that a fragmented MP4 file without a PSSH, but with valid encrypted
+ // tracks with valid TENC boxes, is able to load with EME.
+ // We setup MSE before starting up EME, so that we exercise the "waiting for
+ // cdm" step in the MediaDecoderStateMachine.
+
+ SimpleTest.waitForExplicitFinish();
+
+ var pssh = [
+ 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x73, 0x73, 0x68, // BMFF box header (76 bytes, 'pssh')
+ 0x01, 0x00, 0x00, 0x00, // Full box header (version = 1, flags = 0)
+ 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // SystemID
+ 0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
+ 0x00, 0x00, 0x00, 0x01, // KID_count (1)
+ 0x2f, 0xef, 0x8a, 0xd8, 0x12, 0xdf, 0x42, 0x97,
+ 0x83, 0xe9, 0xbf, 0x6e, 0x5e, 0x49, 0x3e, 0x53,
+ 0x00, 0x00, 0x00, 0x00 // Size of Data (0)
+ ];
+
+ var audio = document.getElementById("audio");
+
+ function LoadEME() {
+ var options = [{
+ initDataType: 'cenc',
+ audioType: 'audio/mp4; codecs="mp4a.40.2"',
+ }];
+ navigator.requestMediaKeySystemAccess("org.w3.clearkey", options)
+ .then((keySystemAccess) => {
+ return keySystemAccess.createMediaKeys();
+ }, bail("Failed to request key system access."))
+
+ .then((mediaKeys) => {
+ audio.setMediaKeys(mediaKeys);
+ var session = mediaKeys.createSession();
+ once(session, "message", (message) => {
+ is(message.messageType, 'license-request', "Expected a license-request");
+ var license = new TextEncoder().encode(JSON.stringify({
+ 'keys': [{
+ 'kty':'oct',
+ 'kid':'L--K2BLfQpeD6b9uXkk-Uw',
+ 'k':HexToBase64('7f412f0575f44f718259beef56ec7771')
+ }],
+ 'type': 'temporary'
+ }));
+ session.update(license);
+ });
+ session.generateRequest('cenc', new Uint8Array(pssh));
+ });
+ }
+
+ function DownloadMedia(url, type, mediaSource) {
+ return new Promise(function(resolve, reject) {
+ var sourceBuffer = mediaSource.addSourceBuffer(type);
+ fetchWithXHR(url, (response) => {
+ once(sourceBuffer, "updateend", resolve);
+ sourceBuffer.appendBuffer(new Uint8Array(response));
+ });
+ });
+ }
+
+ function LoadMSE() {
+ var ms = new MediaSource();
+ audio.src = URL.createObjectURL(ms);
+
+ once(ms, "sourceopen", ()=>{
+ DownloadMedia('short-audio-fragmented-cenc-without-pssh.mp4', 'audio/mp4; codecs="mp4a.40.2"', ms)
+ .then(() => { ms.endOfStream(); LoadEME();});
+ });
+
+ audio.addEventListener("loadeddata", SimpleTest.finish);
+ }
+
+ SetupEMEPref(LoadMSE);
+
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/test/test_eme_non_mse_fails.html b/dom/media/test/test_eme_non_mse_fails.html
new file mode 100644
index 000000000..ede3edc5f
--- /dev/null
+++ b/dom/media/test/test_eme_non_mse_fails.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 1131392 - Test that EME does not work for non-MSE media</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function DoSetMediaKeys(v, test)
+{
+ var options = [{
+ initDataTypes: ["cenc"],
+ audioCapabilities: [{contentType: test.audioType}],
+ videoCapabilities: [{contentType: test.videoType}],
+ }];
+
+ return navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, options)
+
+ .then(function(keySystemAccess) {
+ return keySystemAccess.createMediaKeys();
+ })
+
+ .catch(function() {
+ ok(false, token + " was not expecting failure (yet)");
+ })
+
+ .then(function(mediaKeys) {
+ return v.setMediaKeys(mediaKeys);
+ });
+}
+
+function TestSetMediaKeys(test, token)
+{
+ manager.started(token);
+
+ var v = document.createElement("video");
+
+ v.addEventListener("encrypted", function() {
+ ok(false, token + " should not fire encrypted event");
+ });
+
+ var loadedMetadata = false;
+ v.addEventListener("loadedmetadata", function() {
+ loadedMetadata = true;
+ });
+
+ v.addEventListener("error", function() {
+ ok(true, token + " expected error event");
+ ok(loadedMetadata, token + " expected loadedmetadata to have fired");
+ manager.finished(token);
+ });
+
+ v.src = test.name;
+}
+
+function TestSetSrc(test, token)
+{
+ manager.started(token);
+
+ var v = document.createElement("video");
+ v.addEventListener("error", function(err) {
+ ok(true, token + " got error setting src on video element, as expected");
+ manager.finished(token);
+ });
+
+ DoSetMediaKeys(v, test)
+
+ .then(function() {
+ v.src = test.name;
+ })
+
+ .catch(function() {
+ ok(false, token + " got error setting media keys");
+ });
+}
+
+function startTest(test, token)
+{
+ TestSetMediaKeys(test, token + "_setMediaKeys");
+ TestSetSrc(test, token + "_setSrc");
+}
+
+function beginTest() {
+ manager.runTests(gEMENonMSEFailTests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_eme_playback.html b/dom/media/test/test_eme_playback.html
new file mode 100644
index 000000000..a568402cd
--- /dev/null
+++ b/dom/media/test/test_eme_playback.html
@@ -0,0 +1,188 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="http://test1.mochi.test:8888/tests/dom/media/test/eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function ArrayBuffersEqual(a, b) {
+ if (a.byteLength != b.byteLength) {
+ return false;
+ }
+ var ua = new Uint8Array(a);
+ var ub = new Uint8Array(b);
+ for (var i = 0; i < ua.length; i++) {
+ if (ua[i] != ub[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function KeysChangeFunc(session, keys, token) {
+ session.keyIdsReceived = [];
+ for (var keyid in keys) {
+ Log(token, "Set " + keyid + " to false in session[" + session.sessionId + "].keyIdsReceived");
+ session.keyIdsReceived[keyid] = false;
+ }
+ return function(ev) {
+ var session = ev.target;
+ session.gotKeysChanged = true;
+
+ var keyList = [];
+ var valueList = [];
+ var map = session.keyStatuses;
+
+ // Test that accessing keys not known to the CDM has expected behaviour.
+ var absentKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
+ 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
+ is(map.has(absentKey), false, "Shouldn't have a key that's not in the media");
+ is(map.get(absentKey), undefined, "Unknown keys should undefined status");
+
+ // Verify known keys have expected status.
+ for (var [key, val] of map.entries()) {
+ is(key.constructor, ArrayBuffer, "keyId should be ArrayBuffer");
+ ok(map.has(key), "MediaKeyStatusMap.has() should work.");
+ is(map.get(key), val, "MediaKeyStatusMap.get() should work.");
+ keyList.push(key);
+ valueList.push(val);
+ is(val, "usable", token + ": key status should be usable");
+ var kid = Base64ToHex(window.btoa(ArrayBufferToString(key)));
+ ok(kid in session.keyIdsReceived, TimeStamp(token) + " session[" + session.sessionId + "].keyIdsReceived contained " + kid + " as expected.");
+ session.keyIdsReceived[kid] = true;
+ }
+
+ var index = 0;
+ for (var keyId of map.keys()) {
+ ok(ArrayBuffersEqual(keyId, keyList[index]), "MediaKeyStatusMap.keys() should correspond to entries");
+ index++;
+ }
+ index = 0;
+ for (var val of map.values()) {
+ is(val, valueList[index], "MediaKeyStatusMap.values() should correspond to entries");
+ index++;
+ }
+ }
+}
+
+function startTest(test, token)
+{
+ manager.started(token);
+
+ var sessions = [];
+
+ var v = SetupEME(test, token,
+ {
+ onsessioncreated: function(session) {
+ sessions.push(session);
+ session.addEventListener("keystatuseschange", KeysChangeFunc(session, test.keys, token), false);
+
+ session.numKeystatuseschangeEvents = 0;
+ session.numOnkeystatuseschangeEvents = 0;
+
+ session.addEventListener("keystatuseschange", function() {
+ session.numKeystatuseschangeEvents += 1;
+ });
+ session.onkeystatuseschange = function() {
+ session.numOnkeystatuseschangeEvents += 1;
+ };
+
+ session.numMessageEvents = 0;
+ session.numOnMessageEvents = 0;
+ session.addEventListener("message", function() {
+ session.numMessageEvents += 1;
+ });
+ session.onmessage = function() {
+ session.numOnMessageEvents += 1;
+ };
+ }
+ }
+ );
+
+ document.body.appendChild(v);
+
+ var gotEncrypted = 0;
+
+ v.addEventListener("encrypted", function(ev) {
+ gotEncrypted += 1;
+ });
+
+ v.addEventListener("loadedmetadata", function() {
+ ok(SpecialPowers.do_lookupGetter(v, "isEncrypted").apply(v),
+ TimeStamp(token) + " isEncrypted should be true");
+ is(v.isEncrypted, undefined, "isEncrypted should not be accessible from content");
+ });
+
+ v.addEventListener("ended", function(ev) {
+ ok(true, TimeStamp(token) + " got ended event");
+
+ is(gotEncrypted, test.sessionCount,
+ TimeStamp(token) + " encrypted events expected: " + test.sessionCount
+ + ", actual: " + gotEncrypted);
+
+ ok(Math.abs(test.duration - v.duration) < 0.1,
+ TimeStamp(token) + " Duration of video should be corrrect");
+ ok(Math.abs(test.duration - v.currentTime) < 0.1,
+ TimeStamp(token) + " Current time should be same as duration");
+
+ // Verify all sessions had all keys went sent to the CDM usable, and thus
+ // that we received keystatuseschange event(s).
+ is(sessions.length, test.sessionCount, TimeStamp(token) + " should have "
+ + test.sessionCount
+ + " session" + (test.sessionCount === 1 ? "" : "s"));
+ var keyIdsReceived = [];
+ for (var keyid in test.keys) { keyIdsReceived[keyid] = false; }
+ for (var i = 0; i < sessions.length; i++) {
+ var session = sessions[i];
+ ok(session.gotKeysChanged,
+ TimeStamp(token) + " session[" + session.sessionId
+ + "] should have received at least one keychange event");
+ for (var kid in session.keyIdsReceived) {
+ Log(token, "session[" + session.sessionId + "] key " + kid + " = " + (session.keyIdsReceived[kid] ? "true" : "false"));
+ if (session.keyIdsReceived[kid]) { keyIdsReceived[kid] = true; }
+ }
+ ok(session.numKeystatuseschangeEvents > 0, TimeStamp(token) + " should get key status changes");
+ is(session.numKeystatuseschangeEvents, session.numOnkeystatuseschangeEvents,
+ TimeStamp(token) + " should have as many keystatuseschange event listener calls as event handler calls.");
+
+ ok(session.numMessageEvents > 0, TimeStamp(token) + " should get message events");
+ is(session.numMessageEvents, session.numOnMessageEvents,
+ TimeStamp(token) + " should have as many message event listener calls as event handler calls.");
+ }
+ for (var kid in keyIdsReceived) {
+ ok(keyIdsReceived[kid], TimeStamp(token) + " key with id " + kid + " was usable as expected");
+ }
+
+ v.closeSessions().then(() => manager.finished(token));
+ });
+
+ LoadTest(test, v, token)
+ .then(function() {
+ v.play();
+ }).catch(function() {
+ ok(false, token + " failed to load");
+ manager.finished(token);
+ });
+}
+
+function beginTest() {
+ manager.runTests(gEMETests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_requestKeySystemAccess.html b/dom/media/test/test_eme_requestKeySystemAccess.html
new file mode 100644
index 000000000..21ee91a68
--- /dev/null
+++ b/dom/media/test/test_eme_requestKeySystemAccess.html
@@ -0,0 +1,484 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+const SUPPORTED_LABEL = "pass label";
+
+function ValidateConfig(name, expected, observed) {
+ info("ValidateConfig " + name);
+ info("expected cfg=" + JSON.stringify(expected));
+ info("observed cfg=" + JSON.stringify(observed));
+
+ is(observed.label, expected.label, name + " label should match");
+ if (expected.initDataTypes) {
+ ok(expected.initDataTypes.every((element, index, array) => observed.initDataTypes.includes(element)), name + " initDataTypes should match.");
+ }
+
+ if (expected.audioCapabilities) {
+ ok(expected.audioCapabilities.length == 1, "Test function can only handle one capability.");
+ ok(observed.audioCapabilities.length == 1, "Test function can only handle one capability.");
+ is(observed.audioCapabilities[0].contentType, expected.audioCapabilities[0].contentType, name + " audioCapabilities should match.");
+ }
+ if (typeof expected.videoCapabilities !== 'undefined') {
+ info("expected.videoCapabilities=" + expected.videoCapabilities);
+ dump("expected.videoCapabilities=" + expected.videoCapabilities + "\n");
+ ok(expected.videoCapabilities.length == 1, "Test function can only handle one capability.");
+ ok(observed.videoCapabilities.length == 1, "Test function can only handle one capability.");
+ is(observed.videoCapabilities[0].contentType, expected.videoCapabilities[0].contentType, name + " videoCapabilities should match.");
+ }
+ if (expected.sessionTypes) {
+ is(expected.sessionTypes.length, observed.sessionTypes.length, "Should have expected number of sessionTypes");
+ for (var i = 0; i < expected.sessionTypes.length; i++) {
+ is(expected[i], observed[i], "Session type " + i + " should match");
+ }
+ }
+}
+
+function Test(test) {
+ var name = "'" + test.name + "'";
+ return new Promise(function(resolve, reject) {
+ var p;
+ if (test.options) {
+ var keySystem = (test.keySystem !== undefined) ? test.keySystem : CLEARKEY_KEYSYSTEM;
+ p = navigator.requestMediaKeySystemAccess(keySystem, test.options);
+ } else {
+ p = navigator.requestMediaKeySystemAccess(keySystem);
+ }
+ p.then(
+ function(keySystemAccess) {
+ ok(test.shouldPass, name + " passed and was expected to " + (test.shouldPass ? "pass" : "fail"));
+ is(keySystemAccess.keySystem, CLEARKEY_KEYSYSTEM, "CDM keySystem should be in MediaKeySystemAccess.keySystem");
+ ValidateConfig(name, test.expectedConfig, keySystemAccess.getConfiguration());
+ resolve();
+ },
+ function(ex) {
+ if (test.shouldPass) {
+ info(name + " failed: " + ex);
+ }
+ ok(!test.shouldPass, name + " failed and was expected to " + (test.shouldPass ? "pass" : "fail"));
+ resolve();
+ });
+ });
+}
+
+var tests = [
+ {
+ name: 'Empty keySystem string',
+ keySystem: '',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Empty options specified',
+ options: [ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Undefined options',
+ shouldPass: false,
+ },
+ {
+ name: 'Basic MP4 cenc',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Invalid keysystem failure',
+ keySystem: 'bogusKeySystem',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Invalid initDataType',
+ options: [
+ {
+ initDataTypes: ['bogus'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Valid initDataType after invalid',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['bogus', 'invalid', 'cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Invalid videoType',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/bogus'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Invalid distinctiveIdentifier fails',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ distinctiveIdentifier: 'bogus',
+ persistentState: 'bogus',
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'distinctiveIdentifier is prohibited for ClearKey',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ distinctiveIdentifier: 'required',
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Invalid persistentState fails',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ persistentState: 'bogus',
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Invalid robustness unsupported',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4', robustness: 'very much so'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Unexpected config entry should be ignored',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ unexpectedEntry: 'this should be ignored',
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Invalid option followed by valid',
+ options: [
+ {
+ label: "this config should not be supported",
+ initDataTypes: ['bogus'],
+ },
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Persistent-license should not be supported by ClearKey',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ sessionTypes: ['persistent-license'],
+ persistentState: 'optional',
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'Persistent-usage-record should not be supported by ClearKey',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4'}],
+ sessionTypes: ['persistent-usage-record'],
+ persistentState: 'optional',
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 audio container',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'MP4 audio container with AAC-LC',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'MP4 audio container with invalid codecs',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="bogus"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 audio container with mp3 is unsupported',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="mp3"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 video container type with an mp3 codec is unsupported',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="mp3"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 audio container type with a video codec is unsupported',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="avc1.42E01E"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 video container with constrained baseline h.264',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'MP4 video container with invalid codecs',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="bogus"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 video container with both audio and video codec type in videoType',
+ options: [
+ {
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E,mp4a.40.2"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+ {
+ name: 'MP4 audio and video type both specified',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['cenc'],
+ videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
+ audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Basic WebM video',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Basic WebM audio',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ audioCapabilities: [{contentType: 'audio/webm'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ audioCapabilities: [{contentType: 'audio/webm'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Webm with Vorbis audio and VP8 video.',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm;codecs="vp8"'}],
+ audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm;codecs="vp8"'}],
+ audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Webm with Vorbis audio and VP9 video.',
+ options: [
+ {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm;codecs="vp9"'}],
+ audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
+ }
+ ],
+ expectedConfig: {
+ label: SUPPORTED_LABEL,
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm;codecs="vp9"'}],
+ audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
+ },
+ shouldPass: true,
+ },
+ {
+ name: 'Webm with bogus video.',
+ options: [
+ {
+ initDataTypes: ['webm'],
+ videoCapabilities: [{contentType: 'video/webm;codecs="bogus"'}],
+ }
+ ],
+ shouldPass: false,
+ },
+];
+
+function beginTest() {
+ Promise.all(tests.map(Test)).then(function() { SimpleTest.finish(); });
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_request_notifications.html b/dom/media/test/test_eme_request_notifications.html
new file mode 100644
index 000000000..c2fab5b15
--- /dev/null
+++ b/dom/media/test/test_eme_request_notifications.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function SetPrefs(prefs) {
+ return new Promise(function(resolve, reject) {
+ SpecialPowers.pushPrefEnv({"set": prefs}, function() { resolve(); });
+ });
+}
+
+function observe() {
+ return new Promise(function(resolve, reject) {
+ var observer = function(subject, topic, data) {
+ SpecialPowers.Services.obs.removeObserver(observer, "mediakeys-request");
+ resolve(JSON.parse(data).status);
+ };
+ SpecialPowers.Services.obs.addObserver(observer, "mediakeys-request", false);
+ });
+}
+
+function Test(test) {
+ var p = test.prefs ? SetPrefs(test.prefs) : Promise.resolve();
+ observedStatus = "nothing";
+ var name = "'" + test.keySystem + "'";
+
+ var res = observe().then((status) => {
+ is(status, test.expectedStatus, name + " expected status");
+ });
+
+ p.then(() => navigator.requestMediaKeySystemAccess(test.keySystem, gCencMediaKeySystemConfig))
+ .then((keySystemAccess) => keySystemAccess.createMediaKeys());
+
+ return res;
+}
+
+const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+
+var tests = [
+ {
+ keySystem: CLEARKEY_KEYSYSTEM,
+ expectedStatus: 'cdm-created',
+ prefs: [["media.eme.enabled", false]]
+ },
+ {
+ keySystem: "com.widevine.alpha",
+ expectedStatus: 'api-disabled',
+ prefs: [["media.eme.enabled", false]]
+ },
+ {
+ keySystem: "com.widevine.alpha",
+ expectedStatus: (isWinXP ? 'cdm-not-supported' : 'cdm-disabled'),
+ prefs: [["media.eme.enabled", true], ["media.gmp-widevinecdm.enabled", false]]
+ },
+ {
+ keySystem: "com.widevine.alpha",
+ expectedStatus: (isWinXP ? 'cdm-not-supported' : 'cdm-not-installed'),
+ prefs: [["media.eme.enabled", true], , ["media.gmp-widevinecdm.enabled", true]]
+ },
+ {
+ keySystem: CLEARKEY_KEYSYSTEM,
+ expectedStatus: 'cdm-created',
+ prefs: [["media.eme.enabled", true]]
+ }
+];
+
+SetupEMEPref(function() {
+ tests.reduce(function(p,c,i,array) {
+ return p.then(function() { return Test(c); });
+ }, Promise.resolve()).then(SimpleTest.finish);
+});
+
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_session_callable_value.html b/dom/media/test/test_eme_session_callable_value.html
new file mode 100644
index 000000000..5c5f51e30
--- /dev/null
+++ b/dom/media/test/test_eme_session_callable_value.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function Test() {
+ navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, gCencMediaKeySystemConfig)
+ .then(access => access.createMediaKeys())
+ .then(mediaKeys => {
+ var initData = (new TextEncoder()).encode( 'this is an invalid license, and that is ok');
+ var s = mediaKeys.createSession("temporary");
+ s.generateRequest("cenc", initData); // ignore result.
+ // "update()" call should fail, because MediaKeySession is "not callable"
+ // yet, since CDM won't have had a chance to set the sessionId on MediaKeySession.
+ return s.update(initData);
+ })
+ .then(()=>{ok(false, "An exception should be thrown; MediaKeySession should be not callable."); SimpleTest.finish();},
+ ()=>{ok(true, "We expect this to fail; MediaKeySession should be not callable."); SimpleTest.finish();});
+}
+
+SimpleTest.waitForExplicitFinish();
+SetupEMEPref(Test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_setMediaKeys_before_attach_MediaSource.html b/dom/media/test/test_eme_setMediaKeys_before_attach_MediaSource.html
new file mode 100644
index 000000000..72bc77124
--- /dev/null
+++ b/dom/media/test/test_eme_setMediaKeys_before_attach_MediaSource.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function beginTest() {
+ var video = document.createElement("video");
+
+ navigator.requestMediaKeySystemAccess(CLEARKEY_KEYSYSTEM, gCencMediaKeySystemConfig)
+ .then(function(keySystemAccess) {
+ return keySystemAccess.createMediaKeys();
+ })
+ .then(mediaKeys => {
+ return video.setMediaKeys(mediaKeys);
+ })
+ .then(() => {
+ var ms = new MediaSource();
+ ms.addEventListener("sourceopen", ()=>{ok(true, "MediaSource should open"); SimpleTest.finish();});
+ video.addEventListener("error", ()=>{ok(false, "Shouldn't error."); SimpleTest.finish();});
+ video.src = URL.createObjectURL(ms);
+ });
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_stream_capture_blocked_case1.html b/dom/media/test/test_eme_stream_capture_blocked_case1.html
new file mode 100644
index 000000000..61e8d673f
--- /dev/null
+++ b/dom/media/test/test_eme_stream_capture_blocked_case1.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token)
+{
+ // Three cases:
+ // 1. setting MediaKeys on an element captured by MediaElementSource should fail, and
+ // 2. creating a MediaElementSource on a media element with a MediaKeys should fail, and
+ // 3. capturing a media element with mozCaptureStream that has a MediaKeys should fail.
+
+ // Case 1. setting MediaKeys on an element captured by MediaElementSource should fail.
+ var case1token = token + "_case1";
+ var setKeysFailed = function() {
+ ok(true, TimeStamp(case1token) + " setMediaKeys failed as expected.");
+ manager.finished(case1token);
+ };
+ var v1 = SetupEME(test, case1token, { onSetKeysFail: setKeysFailed });
+ var context = new AudioContext();
+ var node = context.createMediaElementSource(v1);
+ v1.addEventListener("loadeddata", function(ev) {
+ ok(false, TimeStamp(case1token) + " should never reach loadeddata, as setMediaKeys should fail");
+ });
+ manager.started(case1token);
+ LoadTestWithManagedLoadToken(test, v1, manager, case1token,
+ { onlyLoadFirstFragments:2, noEndOfStream:false });
+}
+
+function beginTest() {
+ manager.runTests(gEMETests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_stream_capture_blocked_case2.html b/dom/media/test/test_eme_stream_capture_blocked_case2.html
new file mode 100644
index 000000000..48c8bf3e4
--- /dev/null
+++ b/dom/media/test/test_eme_stream_capture_blocked_case2.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token)
+{
+ // Three cases:
+ // 1. setting MediaKeys on an element captured by MediaElementSource should fail, and
+ // 2. creating a MediaElementSource on a media element with a MediaKeys should fail, and
+ // 3. capturing a media element with mozCaptureStream that has a MediaKeys should fail.
+
+ // Case 2. creating a MediaElementSource on a media element with a MediaKeys should fail.
+ var case2token = token + "_case2";
+ var v2 = SetupEME(test, case2token);
+ v2.addEventListener("loadeddata", function(ev) {
+ ok(true, case2token + " should reach loadeddata");
+ var threw = false;
+ try {
+ var context = new AudioContext();
+ var node = context.createMediaElementSource(v2);
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw, "Should throw an error creating a MediaElementSource on an EME video.");
+ manager.finished(case2token);
+ });
+ manager.started(case2token);
+ LoadTestWithManagedLoadToken(test, v2, manager, case2token,
+ { onlyLoadFirstFragments:2, noEndOfStream:false });
+}
+
+function beginTest() {
+ manager.runTests(gEMETests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_stream_capture_blocked_case3.html b/dom/media/test/test_eme_stream_capture_blocked_case3.html
new file mode 100644
index 000000000..1af4e0aad
--- /dev/null
+++ b/dom/media/test/test_eme_stream_capture_blocked_case3.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token)
+{
+ // Three cases:
+ // 1. setting MediaKeys on an element captured by MediaElementSource should fail, and
+ // 2. creating a MediaElementSource on a media element with a MediaKeys should fail, and
+ // 3. capturing a media element with mozCaptureStream that has a MediaKeys should fail.
+
+ // Case 3. capturing a media element with mozCaptureStream that has a MediaKeys should fail.
+ var case3token = token + "_case3";
+ var v3 = SetupEME(test, case3token);
+ v3.addEventListener("loadeddata", function(ev) {
+ ok(true, TimeStamp(case3token) + " should reach loadeddata");
+ var threw = false;
+ try {
+ var stream = v3.mozCaptureStreamUntilEnded();
+ } catch (e) {
+ threw = true;
+ }
+ ok(threw, TimeStamp(case3token) + " Should throw an error calling mozCaptureStreamUntilEnded an EME video.");
+ manager.finished(case3token);
+ });
+ manager.started(case3token);
+ LoadTestWithManagedLoadToken(test, v3, manager, case3token,
+ { onlyLoadFirstFragments:2, noEndOfStream:false });
+}
+
+function beginTest() {
+ manager.runTests(gEMETests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_eme_waitingforkey.html b/dom/media/test/test_eme_waitingforkey.html
new file mode 100644
index 000000000..ce808342b
--- /dev/null
+++ b/dom/media/test/test_eme_waitingforkey.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Encrypted Media Extensions</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="http://test1.mochi.test:8888/tests/dom/media/test/eme.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token)
+{
+ // Test if the appropriate preconditions are met such that we can start
+ // prcoessing delayed sessions.
+ function TestIfDoneDelaying()
+ {
+ var got = "Got:";
+ if (loaded) { got += " loaded,"; }
+ got += " " + gotEncrypted + "/" + test.sessionCount + " sessions,";
+ got += " " + gotWaitingForKey + " waiting for key events"
+ if (loaded && gotEncrypted == test.sessionCount && gotWaitingForKey > 0) {
+ Log(token, got + " -> Update sessions with keys");
+ params.ProcessSessions();
+ } else {
+ Log(token, got + " -> Wait for more...");
+ }
+ }
+
+ manager.started(token);
+
+ var updatedSessionsCount = 0;
+ var loaded = false;
+
+ var params = {
+ // params will be populated with a ProcessSessions() callback, that can be
+ // called to process delayed sessions.
+ delaySessions: true,
+ // Function to be called once we start processing and updating sessions.
+ // This should only be called once the preconditions in TestIfDoneDealying
+ // are met.
+ onsessionupdated: function(session) {
+ updatedSessionsCount += 1;
+ if (updatedSessionsCount == test.sessionCount) {
+ info(TimeStamp(token) + " Updated all sessions, loading complete -> Play");
+ v.play();
+ } else {
+ info(TimeStamp(token) + " Updated " + updatedSessionsCount + "/" + test.sessionCount + " sessions so far");
+ }
+ },
+ };
+ var v = SetupEME(test, token, params);
+
+ document.body.appendChild(v);
+
+ var gotEncrypted = 0;
+ var gotWaitingForKey = 0;
+ var gotOnwaitingforkey = 0;
+
+ v.addEventListener("encrypted", function() {
+ gotEncrypted += 1;
+ TestIfDoneDelaying();
+ });
+
+ v.addEventListener("waitingforkey", function() {
+ gotWaitingForKey += 1;
+ TestIfDoneDelaying()
+ });
+
+ v.onwaitingforkey = function() {
+ gotOnwaitingforkey += 1;
+ };
+
+ v.addEventListener("loadedmetadata", function() {
+ ok(SpecialPowers.do_lookupGetter(v, "isEncrypted").apply(v),
+ TimeStamp(token) + " isEncrypted should be true");
+ is(v.isEncrypted, undefined, "isEncrypted should not be accessible from content");
+ });
+
+ v.addEventListener("ended", function() {
+ ok(true, TimeStamp(token) + " got ended event");
+ // We expect only one waitingForKey as we delay until all sessions are ready.
+ // I.e. one waitingForKey should be fired, after which, we process all sessions,
+ // so it should not be possible to be blocked by a key after that point.
+ ok(gotWaitingForKey == 1, "Expected number 1 wait, got: " + gotWaitingForKey);
+ ok(gotOnwaitingforkey == gotWaitingForKey, "Should have as many event listener calls as event handler calls, got: " + gotOnwaitingforkey);
+
+ v.closeSessions().then(() => manager.finished(token));
+ });
+
+ LoadTest(test, v, token)
+ .then(function() {
+ loaded = true;
+ TestIfDoneDelaying();
+ }).catch(function() {
+ ok(false, token + " failed to load");
+ manager.finished(token);
+ });
+}
+
+function beginTest() {
+ manager.runTests(gEMETests, startTest);
+}
+
+if (!IsMacOSSnowLeopardOrEarlier()) {
+ SimpleTest.waitForExplicitFinish();
+ SetupEMEPref(beginTest);
+} else {
+ todo(false, "Test disabled on this platform.");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_empty_resource.html b/dom/media/test/test_empty_resource.html
new file mode 100644
index 000000000..da3f54cee
--- /dev/null
+++ b/dom/media/test/test_empty_resource.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1094549
+-->
+<head>
+ <title>Test for Bug 1094549</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1094549">Mozilla Bug 1094549</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+// Shorter timeout for this test should finish soon.
+SimpleTest.requestLongerTimeout(0.3);
+
+function finish(v) {
+ isnot(v.error, null, "should've got an error event");
+ SimpleTest.finish();
+}
+
+function onload() {
+ info("iframe loaded");
+ var v = document.body.getElementsByTagName("iframe")[0]
+ .contentDocument.body.getElementsByTagName("video")[0];
+
+ // Got 'error' as expected, finish the test.
+ if (v.error) {
+ finish(v);
+ return;
+ }
+
+ // Otherwise, wait for it.
+ v.onerror = function() {
+ finish(v);
+ }
+}
+
+SimpleTest.waitForExplicitFinish();
+var f = document.createElement("iframe");
+// Assign a resource file with zero length and expect the error event from
+// the video element since decoding metadata will fail.
+f.src = "data:video/webm,";
+f.addEventListener("load", onload, false);
+document.body.appendChild(f);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_error_in_video_document.html b/dom/media/test/test_error_in_video_document.html
new file mode 100644
index 000000000..f0404c4d8
--- /dev/null
+++ b/dom/media/test/test_error_in_video_document.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=604067
+-->
+<head>
+ <title>Test for Bug 604067</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=604067">Mozilla Bug 604067</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 604067 **/
+
+function documentVideo() {
+ return document.body.getElementsByTagName("iframe")[0]
+ .contentDocument.body.getElementsByTagName("video")[0];
+}
+
+function check() {
+ var v = documentVideo();
+
+ // Debug info for Bug 608634
+ ok(true, "iframe src=" + document.body.getElementsByTagName("iframe")[0].src);
+ is(v.readyState, v.HAVE_NOTHING, "Ready state");
+
+ isnot(v.error, null, "Error object");
+ is(v.networkState, v.NETWORK_NO_SOURCE, "Network state");
+ is(v.error.code, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, "Expected media not supported error");
+ SimpleTest.finish();
+}
+
+// Find an error test that we'd think we should be able to play (if it
+// wasn't already known to fail).
+var t = getPlayableVideo(gErrorTests);
+if (!t) {
+ todo(false, "No types supported");
+} else {
+ SimpleTest.waitForExplicitFinish();
+
+ var f = document.createElement("iframe");
+ f.src = t.name;
+ f.addEventListener("load", function() {
+ if (documentVideo().error) {
+ info("Error occured by the time we got |load| - checking directly.");
+ check();
+ } else {
+ //TODO: Fix this todo in Bug 1295923.
+ todo(false, "Error hasn't occurred yet - adding |error| event listener. This shouldn't happen, see bug 608634.");
+ documentVideo().addEventListener("error", check);
+ }
+ }, false);
+ document.body.appendChild(f);
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_error_on_404.html b/dom/media/test/test_error_on_404.html
new file mode 100644
index 000000000..e49f03e22
--- /dev/null
+++ b/dom/media/test/test_error_on_404.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=476731
+-->
+<head>
+ <title>Test for Bug 476731</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=476731">Mozilla Bug </a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script type="application/javascript">
+/** Test for Bug 476731 **/
+
+var videos = [];
+
+function FinishedLoads() {
+ if (videos.length == 0)
+ return false;
+ for (var i=0; i<videos.length; ++i) {
+ if (videos[i]._loadedData) {
+ // A video loadeddata, it should have 404'd. Signal the end of the test
+ // so the error will be reported.
+ return true;
+ }
+ if (!videos[i]._loadError) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function loadError(evt) {
+ var v = evt.target;
+ is(v._loadError, false, "Shouldn't receive multiple error events for " + v.src);
+ v._loadError = true;
+ is(v._loadStart, true, "Receive loadstart for " + v.src);
+ is(v._loadedData, false, "Shouldn't receive loadeddata for " + v.src);
+ if (FinishedLoads(videos))
+ SimpleTest.finish();
+}
+
+function loadedData(evt) {
+ evt.target._loadedData = true;
+}
+
+function loadStart(evt) {
+ evt.target._loadStart = true;
+}
+
+// Create all video objects.
+for (var i=0; i<g404Tests.length; ++i) {
+ var v = document.createElement("video");
+ v.preload = "metadata";
+ var test = g404Tests[i];
+ if (!v.canPlayType(test.type)) {
+ continue;
+ }
+ v.src = test.name;
+ v._loadedData = false;
+ v._loadStart = false;
+ v._loadError = false;
+ v.addEventListener("error", loadError, false);
+ v.addEventListener("loadstart", loadStart, false);
+ v.addEventListener("loadeddata", loadedData, false);
+ document.body.appendChild(v); // Will start load.
+ videos.push(v);
+}
+
+if (videos.length == 0) {
+ todo(false, "No types supported");
+} else {
+ SimpleTest.waitForExplicitFinish();
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_fastSeek-forwards.html b/dom/media/test/test_fastSeek-forwards.html
new file mode 100644
index 000000000..7c16e5151
--- /dev/null
+++ b/dom/media/test/test_fastSeek-forwards.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1022913
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1022913</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1022913">Mozilla Bug 1022913</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+ <script type="application/javascript">
+
+ // Test that if we're doing a fastSeek() forwards that we don't end up
+ // seeking backwards. This can happen if the keyframe before the seek
+ // target is before the current playback position. We'd prefer to seek to
+ // the keyframe after the seek target in this case, but we don't implement
+ // this yet (bug 1026330).
+ var manager = new MediaTestManager;
+
+ var onSecondSeekComplete = function(event) {
+ var v = event.target;
+ v.removeEventListener("seeked", onSecondSeekComplete);
+ ok(v.currentTime >= v.firstSeekTarget, v.name + " seek never go backwards. time=" + v.currentTime + " firstSeekTarget=" + v.firstSeekTarget + " secondSeekTarget=" + v.secondSeekTarget);
+ manager.finished(v.token);
+ removeNodeAndSource(v);
+ };
+
+ var onFirstSeekComplete = function(event) {
+ var v = event.target;
+ v.removeEventListener("seeked", onFirstSeekComplete);
+ // Seek to 75% of the way between the start and the first keyframe
+ // using fastSeek. We then test that the currentTime doesn't drop back
+ // to the previous keyframe, currentTime should go forwards.
+ v.addEventListener("seeked", onSecondSeekComplete);
+ v.secondSeekTarget = v.keyframes[1] * 0.75;
+ v.fastSeek(v.secondSeekTarget);
+ }
+
+ var onLoadedMetadata = function(event) {
+ // Seek to the mid-point between the start and the first keyframe.
+ var v = event.target;
+ v.removeEventListener("loadedmetadata", onLoadedMetadata);
+ v.addEventListener("seeked", onFirstSeekComplete);
+ v.firstSeekTarget = v.keyframes[1] * 0.5;
+ v.currentTime = v.firstSeekTarget;
+ }
+
+ function startTest(test, token) {
+ manager.started(token);
+ v = document.createElement("video");
+ v.src = test.name;
+ v.name = test.name;
+ v.preload = "metadata";
+ v.token = token;
+ v.target = 0;
+ v.keyframes = test.keyframes;
+ v.keyframeIndex = 0;
+ ok(v.keyframes.length >= 2, v.name + " - video should have at least two sync points");
+ v.addEventListener("loadedmetadata", onLoadedMetadata);
+ document.body.appendChild(v);
+ }
+
+ manager.runTests(gFastSeekTests, startTest);
+
+ </script>
+</body>
+</html>
diff --git a/dom/media/test/test_fastSeek.html b/dom/media/test/test_fastSeek.html
new file mode 100644
index 000000000..c14fa531b
--- /dev/null
+++ b/dom/media/test/test_fastSeek.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=778077
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 778077</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=778077">Mozilla Bug 778077</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+ <script type="application/javascript">
+
+ /** Test for Bug 778077 - HTMLMediaElement.fastSeek() **/
+ // Iterate through a list of keyframe timestamps, and seek to
+ // halfway between the keyframe and the keyframe after it.
+ var manager = new MediaTestManager;
+
+ function doSeek(v) {
+ // fastSeek to half way between this keyframe and the next, or if this is the last
+ // keyframe seek to halfway between this keyframe and the end of media.
+ var nextKeyFrame = (v.keyframeIndex + 1) < v.keyframes.length ? v.keyframes[v.keyframeIndex + 1] : v.duration;
+ v.target = (v.keyframes[v.keyframeIndex] + nextKeyFrame) / 2;
+ v.fastSeek(v.target);
+ ok(Math.abs(v.currentTime - v.target) < 0.01,
+ v.name + " seekTo=" + v.target + " currentTime (" + v.currentTime + ") should be close to seek target initially");
+ }
+
+ function onloadedmetadata(event) {
+ var v = event.target;
+ doSeek(v);
+ }
+
+ function onseeked(event) {
+ var v = event.target;
+ var keyframe = v.keyframes[v.keyframeIndex];
+
+ // Check that the current time ended up roughly after the keyframe.
+ // We must be a bit fuzzy here, as the decoder backend may actually
+ // seek to the audio sample prior to the keyframe.
+ ok(v.currentTime >= keyframe - 0.05,
+ v.name + " seekTo=" + v.target + " currentTime (" + v.currentTime +
+ ") should be end up roughly after keyframe (" + keyframe + ") after fastSeek");
+
+ ok(v.currentTime <= v.target,
+ v.name + " seekTo=" + v.target + " currentTime (" + v.currentTime +
+ ") should be end up less than target after fastSeek");
+
+ v.keyframeIndex++
+ if (v.keyframeIndex == v.keyframes.length) {
+ v.src = "";
+ v.parentNode.removeChild(v);
+ manager.finished(v.token);
+ } else {
+ doSeek(v);
+ }
+ }
+
+ function startTest(test, token) {
+ manager.started(token);
+ v = document.createElement("video");
+ v.src = test.name;
+ v.name = test.name;
+ v.preload = "metadata";
+ v.token = token;
+ v.target = 0;
+ v.keyframes = test.keyframes;
+ v.keyframeIndex = 0;
+ ok(v.keyframes.length > 0, v.name + " - video should have at least one sync point");
+ v.addEventListener("loadedmetadata", onloadedmetadata);
+ v.addEventListener("seeked", onseeked);
+ document.body.appendChild(v);
+ }
+
+ manager.runTests(gFastSeekTests, startTest);
+
+ </script>
+</body>
+</html>
diff --git a/dom/media/test/test_fragment_noplay.html b/dom/media/test/test_fragment_noplay.html
new file mode 100644
index 000000000..802ec08c9
--- /dev/null
+++ b/dom/media/test/test_fragment_noplay.html
@@ -0,0 +1,135 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: fragment tests</title>
+ <script type="text/javascript" src="/MochiKit/packed.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="fragment_noplay.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+//longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(1.5);
+}
+
+var manager = new MediaTestManager;
+
+// Fragment parameters to try
+var gFragmentParams = [
+ // W3C Media fragment tests
+ // http://www.w3.org/2008/WebVideo/Fragments/TC/ua-test-cases
+ { fragment: "#t=banana", start: null, end: null }, // TC0027-UA
+ { fragment: "#t=3,banana", start: null, end: null }, // TC0028-UA
+ { fragment: "#t=banana,7", start: null, end: null }, // TC0029-UA
+ { fragment: "#t='3'", start: null, end: null }, // TC0030-UA
+ { fragment: "#t=3-7", start: null, end: null }, // TC0031-UA
+ { fragment: "#t=3:7", start: null, end: null }, // TC0032-UA
+ { fragment: "#t=3,7,9", start: null, end: null }, // TC0033-UA
+ { fragment: "#t%3D3", start: null, end: null }, // TC0034-UA
+ { fragment: "#%74=3", start: 3, end: null }, // TC0035-UA
+ { fragment: "#t=%33", start: 3, end: null }, // TC0036-UA
+ { fragment: "#t=3%2C7", start: 3, end: 7 }, // TC0037-UA
+ { fragment: "#t=%6Ept:3", start: 3, end: null }, // TC0038-UA
+ { fragment: "#t=npt%3A3", start: 3, end: null }, // TC0039-UA
+ { fragment: "#t=-1,3", start: null, end: null }, // TC0044-UA
+ { fragment: "#t=3&", start: 3, end: null }, // TC0051-UA
+ { fragment: "#u=12&t=3", start: 3, end: null }, // TC0052-UA
+ { fragment: "#t=foo:7&t=npt:3", start: 3, end: null }, // TC0053-UA
+ { fragment: "#&&=&=tom&jerry=&t=3&t=meow:0#", start: 3, end: null }, // TC0054-UA
+ { fragment: "#t=7&t=3", start: 3, end: null }, // TC0055-UA
+ { fragment: "#T=3,7", start: null, end: null }, // TC0058-UA
+ { fragment: "#t=", start: null, end: null }, // TC0061-UA
+ { fragment: "#t=.", start: null, end: null }, // TC0062-UA
+ { fragment: "#t=.0", start: null, end: null }, // TC0063-UA
+ { fragment: "#t=0s", start: null, end: null }, // TC0064-UA
+ { fragment: "#t=,0s", start: null, end: null }, // TC0065-UA
+ { fragment: "#t=0s,0s", start: null, end: null }, // TC0066-UA
+ { fragment: "#t=00:00:00s", start: null, end: null }, // TC0067-UA
+ { fragment: "#t=s", start: null, end: null }, // TC0068-UA
+ { fragment: "#t=npt:", start: null, end: null }, // TC0069-UA
+ { fragment: "#t=1e-1:", start: null, end: null }, // TC0070-UA
+ { fragment: "#t=00:00:01.1e-1", start: null, end: null }, // TC0071-UA
+ { fragment: "#t=3.", start: 3, end: null }, // TC0072-UA
+ { fragment: "#t=0:0:0", start: null, end: null }, // TC0073-UA
+ { fragment: "#t=0:00:60", start: null, end: null }, // TC0074-UA
+ { fragment: "#t=0:01:60", start: null, end: null }, // TC0075-UA
+ { fragment: "#t=0:60:00", start: null, end: null }, // TC0076-UA
+ { fragment: "#t=0:000:000", start: null, end: null }, // TC0077-UA
+ { fragment: "#t=00:00:03,00:00:07", start: 3, end: 7 }, // TC0078-UA
+ { fragment: "#t=3,00:00:07", start: 3, end: 7 }, // TC0079-UA
+ { fragment: "#t=00:00.", start: null, end: null }, // TC0080-UA
+ { fragment: "#t=0:00:00.", start: null, end: null }, // TC0081-UA
+ { fragment: "#t=0:00:10e-1", start: null, end: null }, // TC0082-UA
+ { fragment: "#t=0:00:60.000", start: null, end: null }, // TC0083-UA
+ { fragment: "#t=0:60:00.000", start: null, end: null }, // TC0084-UA
+ { fragment: "#t=3,7&t=foo", start: 3, end: 7 }, // TC0085-UA
+ { fragment: "#foo&t=3,7", start: 3, end: 7 }, // TC0086-UA
+ { fragment: "#t=3,7&foo", start: 3, end: 7 }, // TC0087-UA
+ { fragment: "#t=3,7&&", start: 3, end: 7 }, // TC0088-UA
+ { fragment: "#&t=3,7", start: 3, end: 7 }, // TC0089-UA
+ { fragment: "#&&t=3,7", start: 3, end: 7 }, // TC0090-UA
+ { fragment: "#&t=3,7&", start: 3, end: 7 }, // TC0091-UA
+ { fragment: "#t%3d10", start: null, end: null }, // TC0092-UA
+ { fragment: "#t=10%26", start: null, end: null }, // TC0093-UA
+ { fragment: "#&t=3,7,", start: null, end: null } // TC0094-UA
+];
+
+function createTestArray() {
+ var tests = [];
+ var tmpVid = document.createElement("video");
+
+ for (var testNum=0; testNum<gFragmentTests.length; testNum++) {
+ var test = gFragmentTests[testNum];
+ if (!tmpVid.canPlayType(test.type)) {
+ continue;
+ }
+
+ for (var fragNum=0; fragNum<gFragmentParams.length; fragNum++) {
+ var p = gFragmentParams[fragNum];
+ var t = new Object;
+ t.name = test.name + p.fragment;
+ t.type = test.type;
+ t.duration = test.duration;
+ t.start = p.start;
+ t.end = p.end;
+ tests.push(t);
+ }
+ }
+ return tests;
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ manager.started(token);
+ v.preload = "metadata";
+ v.src = test.name;
+ v.token = token;
+ v.controls = true;
+ document.body.appendChild(v);
+ var name = test.name + " fragment test";
+ var localIs = function(name) { return function(a, b, msg) {
+ is(a, b, name + ": " + msg);
+ }}(name);
+ var localOk = function(name) { return function(a, msg) {
+ ok(a, name + ": " + msg);
+ }}(name);
+ var localFinish = function(v, manager) { return function() {
+ if (v.parentNode) {
+ v.parentNode.removeChild(v);
+ }
+ manager.finished(v.token);
+ }}(v, manager);
+ window['test_fragment_noplay'](v, test.start, test.end, localIs, localOk, localFinish);
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_fragment_play.html b/dom/media/test/test_fragment_play.html
new file mode 100644
index 000000000..cd6e9d141
--- /dev/null
+++ b/dom/media/test/test_fragment_play.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/MochiKit/packed.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="fragment_play.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+PARALLEL_TESTS = 1;
+var manager = new MediaTestManager;
+
+// Fragment parameters to try. These tests
+// try playing the video. Tests for other fragment
+// formats are in test_fragment_noplay.html.
+var gFragmentParams = [
+ { fragment: "", start: null, end: null },
+ { fragment: "#t=,", start: null, end: null },
+ { fragment: "#t=3,3", start: null, end: null },
+ { fragment: "#t=7,3", start: null, end: null },
+ { fragment: "#t=7,15", start: 7, end: null },
+ { fragment: "#t=15,20", start: 9.287982, end: null },
+ { fragment: "#t=5", start: 5, end: null },
+ { fragment: "#t=5.5", start: 5.5, end: null },
+ { fragment: "#t=5,", start: null, end: null },
+ { fragment: "#t=,5", start: 0, end: 5, todo: "See bugs 682141 and 720248" },
+ { fragment: "#t=2.5,5.5", start: 2.5, end: 5.5, todo: "See bugs 682141 and 720248" },
+ { fragment: "#t=1,2.5", start: 1, end: 2.5, todo: "See bugs 682141 and 720248" },
+ { fragment: "#t=,15", start: 0, end: null }
+];
+
+function createTestArray() {
+ var tests = [];
+ var tmpVid = document.createElement("video");
+
+ for (var testNum=0; testNum<gFragmentTests.length; testNum++) {
+ var test = gFragmentTests[testNum];
+ if (!tmpVid.canPlayType(test.type)) {
+ continue;
+ }
+
+ for (var fragNum=0; fragNum<gFragmentParams.length; fragNum++) {
+ var p = gFragmentParams[fragNum];
+ var t = new Object;
+ t.name = test.name + p.fragment;
+ t.type = test.type;
+ t.duration = test.duration;
+ t.start = p.start;
+ t.end = p.end;
+ t.todo = p.todo;
+ tests.push(t);
+ }
+ }
+ return tests;
+}
+
+function startTest(test, token) {
+ if (test.todo) {
+ todo(false, test.todo);
+ return;
+ }
+ var v = document.createElement('video');
+ manager.started(token);
+ v.preload = "metadata";
+ v.src = test.name;
+ v.token = token;
+ v.controls = true;
+ document.body.appendChild(v);
+ var name = test.name + " fragment test";
+ var localIs = function(name) { return function(a, b, msg) {
+ is(a, b, name + ": " + msg);
+ }}(name);
+ var localOk = function(name) { return function(a, msg) {
+ ok(a, name + ": " + msg);
+ }}(name);
+ var localFinish = function(v, manager) { return function() {
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ }}(v, manager);
+ window['test_fragment_play'](v, test.start, test.end, localIs, localOk, localFinish);
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_gmp_playback.html b/dom/media/test/test_gmp_playback.html
new file mode 100644
index 000000000..b65a4203c
--- /dev/null
+++ b/dom/media/test/test_gmp_playback.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback of media files that should play OK</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function startTest() {
+ var v = document.createElement("video");
+ ok(v.canPlayType('video/mp4; codecs="avc1.64000d,mp4a.40.2"') != "",
+ "Should be able to play MP4/H.264/AAC via <video> using GMP");
+ v.src = "short.mp4";
+ v.addEventListener("ended", function(event) {
+ ok(true, "Reached end");
+ SimpleTest.finish();
+ });
+ document.body.appendChild(v);
+ v.play();
+}
+
+var testPrefs = [
+ ['media.gmp.decoder.aac', 1], // gmp-clearkey
+ ['media.gmp.decoder.h264', 1], // gmp-clearkey
+ ['media.gmp.decoder.enabled', true]
+];
+
+SpecialPowers.pushPrefEnv({'set': testPrefs}, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_imagecapture.html b/dom/media/test/test_imagecapture.html
new file mode 100644
index 000000000..f6da9e231
--- /dev/null
+++ b/dom/media/test/test_imagecapture.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1041393
+-->
+<head>
+ <meta charset="utf-8">
+ <title>ImageCapture tests</title>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1041393">ImageCapture tests</a>
+<script type="application/javascript">
+
+var repeat = 100;
+var count;
+
+// Check if the callback returns even no JS reference on it.
+function gcTest(track) {
+ return new Promise(function(resolve, reject) {
+ count = 0;
+ var i;
+ var imageCapture;
+ for(i = 0; i < repeat; i++) {
+ imageCapture = new ImageCapture(track);
+ imageCapture.onphoto = function(blob) {
+ count++;
+ if (count == repeat) {
+ ok(true, "pass gc testing");
+ resolve(track);
+ }
+ };
+ imageCapture.onerror = function(error) {
+ ok(false, "takePhoto failure in gc testing");
+ reject();
+ };
+
+ imageCapture.takePhoto();
+ }
+ info("Call gc ");
+ SpecialPowers.gc();
+ });
+}
+
+// Continue calling takePhoto() in rapid succession.
+function rapidTest(track) {
+ return new Promise(function(resolve, reject) {
+ var imageCapture = new ImageCapture(track);
+ imageCapture.onphoto = function(blob) {
+ count++;
+ if (count == repeat) {
+ ok(true, "pass raipd takePhoto() testing");
+ resolve(track);
+ }
+ };
+ imageCapture.onerror = function(error) {
+ ok(false, "takePhoto() failure in rapid testing");
+ reject();
+ };
+
+ count = 0;
+ var i;
+ for(i = 0; i < repeat; i++) {
+ imageCapture.takePhoto();
+ }
+ });
+}
+
+// Check if the blob is decodable.
+function blobTest(track) {
+ return new Promise(function(resolve, reject) {
+ var imageCapture = new ImageCapture(track);
+ imageCapture.onphoto = function(blob) {
+ var img = new Image();
+ img.onerror = function() {
+ ok(false, "fail to decode blob");
+ reject();
+ }
+ img.onload = function() {
+ ok(true, "decode blob success");
+ resolve(track);
+ }
+ img.src = URL.createObjectURL(blob.data);
+ };
+ imageCapture.onerror = function(error) {
+ ok(false, "fail to capture image");
+ };
+
+ imageCapture.takePhoto();
+ });
+}
+
+// It should return an error event after disabling video track.
+function trackTest(track) {
+ return new Promise(function(resolve, reject) {
+ var imageCapture = new ImageCapture(track);
+ imageCapture.onphoto = function(blob) {
+ ok(false, "expect error when video track is disable");
+ reject();
+ };
+ imageCapture.onerror = function(error) {
+ ok(error.imageCaptureError.code == error.imageCaptureError.PHOTO_ERROR, "error code is PHOTO_ERROR")
+ track.enabled = true;
+ resolve(track);
+ };
+
+ track.enabled = false;
+ imageCapture.takePhoto()
+ });
+}
+
+function init() {
+ return new Promise(function(resolve, reject) {
+ // use fake camera, MediaStreamGraph will be the backend of ImageCapture.
+ var constraints = {video: true, fake: true}
+
+ window.navigator.mozGetUserMedia(
+ constraints,
+ function(stream) {
+ var track = stream.getVideoTracks()[0];
+ resolve(track);
+ },
+ function(err) {
+ reject(err);
+ }
+ );
+ });
+}
+
+function start() {
+ init().then(function(track) {
+ info("ImageCapture track disable test.");
+ return trackTest(track);
+ }).then(function(track) {
+ info("ImageCapture blob test.");
+ return blobTest(track);
+ }).then(function(track) {
+ info("ImageCapture rapid takePhoto() test.");
+ return rapidTest(track);
+ }).then(function(track) {
+ info("ImageCapture multiple instances test.");
+ return gcTest(track);
+ }).then(SimpleTest.finish);
+}
+
+SimpleTest.requestCompleteLog();
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv({"set": [["dom.imagecapture.enabled", true],
+ ["media.navigator.permission.disabled", true]
+ ]}, start);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_info_leak.html b/dom/media/test/test_info_leak.html
new file mode 100644
index 000000000..e3ff057cf
--- /dev/null
+++ b/dom/media/test/test_info_leak.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=478957
+-->
+<head>
+ <title>Test for Bug 478957</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=478957">Mozilla Bug 478957</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+
+<div id="log" style="font-size: small;"></div>
+
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 478957 **/
+
+// Tests whether we leak events and state change info when loading stuff from local files from a webserver.
+
+var manager = new MediaTestManager;
+
+var gEventTypes = [ 'loadstart', 'progress', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'play', 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'canplay', 'canplaythrough', 'seeking', 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ];
+
+var gExpectedEvents = ['ratechange', 'loadstart', 'error'];
+
+function createTestArray() {
+ var tests = [];
+ var tmpVid = document.createElement("video");
+
+ for (var testNum=0; testNum<gInfoLeakTests.length; testNum++) {
+ var test = gInfoLeakTests[testNum];
+ if (!tmpVid.canPlayType(test.type)) {
+ continue;
+ }
+
+ var t = new Object;
+ t.name = test.src;
+ t.type = test.type;
+
+ tests.push(t);
+ }
+ return tests;
+}
+
+function log(msg) {
+ info(msg);
+ var l = document.getElementById('log');
+ l.innerHTML += msg + "<br>";
+}
+
+function finish(v) {
+ log("finish: " + v.name);
+ clearInterval(v.checkStateInterval);
+
+ for (var i=0; i<gEventTypes.length; i++) {
+ v.removeEventListener(gEventTypes[i], listener, false);
+ }
+ removeNodeAndSource(v);
+
+ manager.finished(v.token);
+ v = null;
+}
+
+function listener(evt) {
+ var v = evt.target;
+ log(filename(v.name) + ': got ' + evt.type);
+
+ // On slow machines like B2G emulator, progress timer could time out before
+ // receiving any HTTP notification. We will ignore the 'stalled' event to
+ // pass the tests.
+ if (evt.type == 'stalled') {
+ return;
+ }
+
+ ok(v.eventNum < gExpectedEvents.length, filename(v.name) + " Too many events received");
+ var expected = (v.eventNum < gExpectedEvents.length) ? gExpectedEvents[v.eventNum] : "NoEvent";
+ is(evt.type, expected, filename(v.name) + " Events received in wrong order");
+ v.eventNum++;
+ if (v.eventNum == gExpectedEvents.length) {
+ // In one second, move onto the next test. This give a chance for any
+ // other events to come in. Note: we don't expect any events to come
+ // in, unless we've leaked some info, and 1 second should be enough time
+ // for the leak to show up.
+ setTimeout(function() {finish(v);}, 1000);
+ }
+}
+
+function createMedia(type, src, token) {
+ var tag = getMajorMimeType(type);
+ var v = document.createElement(tag);
+ for (var i=0; i<gEventTypes.length; i++) {
+ v.addEventListener(gEventTypes[i], listener, false);
+ }
+ v.preload = "metadata";
+ v.src = src;
+ v.name = src;
+ document.body.appendChild(v);
+ v.eventNum = 0;
+ v.token = token;
+ setTimeout(
+ function() {
+ v.checkStateInterval = setInterval(function(){checkState(v);},1);
+ }, 0);
+}
+
+// Define our own ok() and is() functions. The mochitest ones take ages constructing the log
+// of all the passes, so only report failures.
+function test_ok(b, msg) {
+ if (!b) {
+ log("FAILED test_ok: " + msg);
+ ok(b, msg);
+ }
+}
+
+function test_is(a, b, msg) {
+ if (a != b) {
+ log("FAILED test_is: " + msg);
+ is(a,b,msg);
+ }
+}
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+function checkState(v) {
+ test_ok(v.networkState <= HTMLMediaElement.NETWORK_LOADING ||
+ v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
+ "NetworkState of " + v.networkState + " was leaked.");
+ test_ok(v.readyState == HTMLMediaElement.HAVE_NOTHING,
+ "Ready state of " + v.readyState + " was leaked");
+ test_is(v.seeking, false, "Seeking leaked");
+ test_is(v.currentTime, 0, "Leaked currentTime");
+ test_ok(isNaN(v.duration), "Leaked duration");
+ test_is(v.paused, true, "Paused leaked");
+ test_is(v.ended, false, "Ended leaked");
+ test_is(v.autoplay, false, "Autoplay leaked");
+ test_is(v.controls, false, "Controls leaked");
+ test_is(v.muted, false, "muted leaked");
+ test_ok(v.error==null || v.error.code==MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,
+ "Error code should not exist or be SRC_NOT_SUPPORTED. v.error=" +
+ (v.error ? v.error.code : "null"));
+ test_ok(filename(v.currentSrc) == filename(v.name) ||
+ v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
+ "currentSrc should match candidate uri, if we've got a valid source");
+}
+
+
+function startTest(test, token) {
+ manager.started(token);
+ log("Testing: " + test.type + " @ " + test.name);
+ createMedia(test.type, test.name, token);
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_invalid_reject.html b/dom/media/test/test_invalid_reject.html
new file mode 100644
index 000000000..ac9b102de
--- /dev/null
+++ b/dom/media/test/test_invalid_reject.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="UTF-8" />
+ <title>Test rejection of invalid files</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ manager.started(token);
+
+ // Set up event handlers. Seeing any of these is a failure.
+ function badEvent(type) { return function(e) {
+ ok(false, test.name + " should not fire '" + type + "' event");
+ }};
+ var events = [
+ 'loadeddata', 'load',
+ 'canplay', 'canplaythrough',
+ 'playing'
+ ];
+ events.forEach( function(e) {
+ v.addEventListener(e, badEvent(e));
+ });
+
+ // Seeing a decoder error is a success.
+ v.addEventListener("error", function onerror(e) {
+ if (v.readyState == v.HAVE_NOTHING) {
+ is(v.error.code, v.error.MEDIA_ERR_SRC_NOT_SUPPORTED,
+ "decoder should reject " + test.name);
+ } else {
+ is(v.error.code, v.error.MEDIA_ERR_DECODE,
+ "decoder should reject " + test.name);
+ }
+ v.removeEventListener('error', onerror, false);
+ manager.finished(token);
+ });
+
+ // Now try to load and play the file, which should result in the
+ // error event handler above being called, terminating the test.
+ document.body.appendChild(v);
+ v.src = test.name;
+ v.play();
+}
+
+manager.runTests(gInvalidTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_invalid_reject_play.html b/dom/media/test/test_invalid_reject_play.html
new file mode 100644
index 000000000..5d9252d53
--- /dev/null
+++ b/dom/media/test/test_invalid_reject_play.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="UTF-8" />
+ <title>Test rejection of invalid files during playback</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ manager.started(token);
+
+ // Seeing a decoder error is a success.
+ v.addEventListener("error", function onerror(e) {
+ is(v.error.code, v.error.MEDIA_ERR_DECODE,
+ "decoder should reject " + test.name);
+ v.removeEventListener("error", onerror, false);
+ manager.finished(token);
+ });
+
+ v.addEventListener("ended", function onended(e) {
+ ok(false, "decoder should have rejected file before playback ended");
+ v.removeEventListener("ended", onended, false);
+ manager.finished(token);
+ });
+
+ document.body.appendChild(v);
+ v.src = test.name;
+ v.play();
+}
+
+manager.runTests(gInvalidPlayTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_invalid_seek.html b/dom/media/test/test_invalid_seek.html
new file mode 100644
index 000000000..481e15107
--- /dev/null
+++ b/dom/media/test/test_invalid_seek.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: invalide seek test</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<video id='v'></video>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+// http://www.whatwg.org/specs/web-apps/current-work/#dom-media-seek
+// If the media element's readyState is HAVE_NOTHING, then the user agent
+// must raise an InvalidStateError exception.
+var v = document.getElementById('v');
+var passed = false;
+
+ok(v.readyState == HTMLMediaElement.HAVE_NOTHING,
+ "Invalid ready state in media element");
+
+try {
+ v.seek(1);
+}
+catch(e) {
+ passed = true;
+}
+
+ok(passed, "Video did not raise error during invalid seek");
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_load.html b/dom/media/test/test_load.html
new file mode 100644
index 000000000..f300ea57b
--- /dev/null
+++ b/dom/media/test/test_load.html
@@ -0,0 +1,226 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=479859
+-->
+<head>
+ <title>Test for Bug 479859</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=479859">Mozilla Bug 479859</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+
+function log(msg) {
+ //document.getElementById('log').innerHTML += "<p>" + msg + "</p>";
+}
+
+// We don't track: progress, canplay, canplaythrough and stalled events,
+// as these can be delivered out of order, and/or multiple times.
+var gEventTypes = [ 'loadstart', 'abort', 'error', 'emptied', 'play',
+ 'pause', 'loadedmetadata', 'loadeddata', 'waiting', 'playing', 'seeking',
+ 'seeked', 'timeupdate', 'ended', 'ratechange', 'durationchange', 'volumechange' ];
+
+var gEventNum = 0;
+var gTestNum = 0;
+var gTestFileNum = 0;
+var gExpectedEvents = null;
+var gTest = null;
+var gTestName = "?";
+
+function listener(evt) {
+ log('event ' + evt.type);
+ ok(gEventNum < gExpectedEvents.length, gTestName+" - corrent number of events received");
+ var expected = (gEventNum < gExpectedEvents.length) ? gExpectedEvents[gEventNum] : "NoEvent";
+ is(evt.type, expected, gTestName+" - events received in order");
+ gEventNum++;
+ if (gEventNum == gExpectedEvents.length) {
+ setTimeout(nextTest, 0);
+ }
+}
+
+function source_error(evt) {
+ log('event source_error');
+ ok(evt.type == "error", "Should only get error events here");
+ ok(gEventNum < gExpectedEvents.length, gTestName+" - corrent number of events received");
+ var expected = (gEventNum < gExpectedEvents.length) ? gExpectedEvents[gEventNum] : "NoEvent";
+ is("source_error", expected, gTestName+" - events received in order");
+ gEventNum++;
+ if (gEventNum == gExpectedEvents.length) {
+ setTimeout(nextTest, 0);
+ }
+}
+
+var gMedia = null;
+
+function createMedia(tag) {
+ gMedia = document.createElement(tag);
+ gMedia.preload = "metadata";
+ for (var i=0; i<gEventTypes.length; i++) {
+ gMedia.addEventListener(gEventTypes[i], listener, false);
+ }
+}
+
+function addSource(src, type) {
+ var s = document.createElement("source");
+ s.addEventListener("error", source_error, false);
+ s.src = src;
+ s.type = type;
+ gMedia.appendChild(s);
+ return s;
+}
+
+function prependSource(src, type) {
+ var s = document.createElement("source");
+ s.addEventListener("error", source_error, false);
+ s.src = src;
+ s.type = type;
+ gMedia.insertBefore(s, gMedia.firstChild);
+ return s;
+}
+
+var gTests = [
+ {
+ // Test 0: adding video to doc, then setting src should load implicitly.
+ create:
+ function(src, type) {
+ document.body.appendChild(gMedia);
+ gMedia.src = src;
+ },
+ expectedEvents: ['ratechange', 'loadstart', 'durationchange', 'loadedmetadata', 'loadeddata']
+ }, {
+ // Test 1: adding video to doc, then adding source.
+ create:
+ function(src, type) {
+ document.body.appendChild(gMedia);
+ addSource(src, type);
+ },
+ expectedEvents: ['loadstart', 'durationchange', 'loadedmetadata', 'loadeddata']
+ },{
+ // Test 2: video with multiple source, the first of which are bad, we should load the last,
+ // and receive error events for failed loads on the source children.
+ create:
+ function(src, type) {
+ document.body.appendChild(gMedia);
+ addSource("404a", type);
+ addSource("404b", type);
+ addSource(src, type);
+ },
+ expectedEvents: ['loadstart', 'source_error', 'source_error', 'durationchange', 'loadedmetadata', 'loadeddata']
+ }, {
+ // Test 3: video with bad src, good <source>, ensure that <source> aren't used.
+ create:
+ function(src, type) {
+ gMedia.src = "404a";
+ addSource(src, type);
+ document.body.appendChild(gMedia);
+ },
+ expectedEvents: ['ratechange', 'loadstart', 'error']
+ }, {
+ // Test 4: video with only bad source, loading, then adding a good source
+ // - should resume load.
+ create:
+ function(src, type) {
+ addSource("404a", type);
+ var s2 = addSource("404b", type);
+ s2.addEventListener("error",
+ function(e) {
+ // Should awaken waiting load, causing successful load.
+ addSource(src, type);
+ },
+ false);
+ document.body.appendChild(gMedia);
+ },
+ expectedEvents: ['loadstart', 'source_error', 'source_error', 'durationchange', 'loadedmetadata', 'loadeddata']
+ }, {
+ // Test 5: video with only 1 bad source, let it fail to load, then prepend
+ // a good <source> to the video, it shouldn't be selected, because the
+ // "pointer" should be after the last child - the bad source.
+ prepended: false,
+ create:
+ function(src, type) {
+ var prepended = false;
+ addSource("404a", type);
+ var s2 = addSource("404b", type);
+ s2.addEventListener("error",
+ function(e) {
+ // Should awaken waiting load, causing successful load.
+ if (!prepended) {
+ prependSource(src, type);
+ prepended = true;
+ }
+ },
+ false);
+ document.body.appendChild(gMedia);
+ },
+ expectedEvents: ['loadstart', 'source_error', 'source_error']
+ }, {
+ // Test 6: (Bug 1165203) preload="none" then followed by an explicit
+ // call to load() should load metadata
+ create:
+ function(src, type) {
+ gMedia.preload = "none";
+ gMedia.src = src;
+ document.body.appendChild(gMedia);
+ addSource(src, type);
+ gMedia.load();
+ },
+ expectedEvents: ['emptied', 'ratechange', 'loadstart', 'durationchange', 'loadedmetadata', 'loadeddata']
+ }
+];
+
+function nextTest() {
+ if (gMedia) {
+ for (var i=0; i<gEventTypes.length; i++) {
+ gMedia.removeEventListener(gEventTypes[i], listener, false);
+ }
+ removeNodeAndSource(gMedia);
+ gMedia = null;
+ }
+ gEventNum = 0;
+
+ if (gTestNum == gTests.length) {
+ gTestNum = 0;
+ ++gTestFileNum;
+ if (gTestFileNum == gSmallTests.length) {
+ SimpleTest.finish();
+ return;
+ }
+ }
+
+ var src = gSmallTests[gTestFileNum].name;
+ var type = gSmallTests[gTestFileNum].type;
+
+ var t = gTests[gTestNum];
+ gTestNum++;
+
+ createMedia(type.match(/^audio\//) ? "audio" : "video");
+ if (!gMedia.canPlayType(type)) {
+ // Unsupported type, skip to next test
+ nextTest();
+ return;
+ }
+
+ gTestName = "Test " + src + " " + (gTestNum - 1);
+ log("Starting " + gTestName);
+ gExpectedEvents = t.expectedEvents;
+
+ t.create(src, type);
+}
+
+addLoadEvent(nextTest);
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+
+<div id="log" style="font-size: small"></div>
+</body>
+</html>
diff --git a/dom/media/test/test_load_candidates.html b/dom/media/test/test_load_candidates.html
new file mode 100644
index 000000000..621f1e85b
--- /dev/null
+++ b/dom/media/test/test_load_candidates.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=465458
+-->
+<head>
+ <title>Test for Bug 465458</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=465458">Mozilla Bug 465458</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 465458 **/
+
+var manager = new MediaTestManager;
+
+function finish(evt) {
+ var v = evt.target;
+ is(v._error, 2, "Should have received 2 error events before loaded");
+ v._finished = true;
+ // remove error event handler, because this would otherwise
+ // cause a failure on Windows 7, see bug 1024535
+ v.onerror = null;
+ v.parentNode.removeChild(v);
+ manager.finished(v.token);
+}
+
+function errorHandler(evt) {
+ evt.target.parentNode._error++;
+}
+
+var extension = {
+ "audio/wav" : "wav",
+ "audio/x-wav": "wav",
+ "video/ogg" : "ogv",
+ "audio/ogg" : "oga",
+ "video/webm" : "webm"
+};
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "auto";
+ v.onerror = function(){ok(false,"Error events on source children should not bubble");}
+ v.token = token;
+ manager.started(token);
+ v._error = 0;
+ v._finished = false;
+ v._name = test.name;
+
+ var s1 = document.createElement("source");
+ s1.type = test.type;
+ s1.src = "404." + extension[test.type];
+ s1.addEventListener("error", errorHandler, false);
+ v.appendChild(s1);
+
+ var s2 = document.createElement("source");
+ s2.type = test.type;
+ s2.src = "test_load_candidates.html"; // definitely an invalid media file, regardless of its actual mime type...
+ s2.addEventListener("error", errorHandler, false);
+ v.appendChild(s2);
+
+ var s3 = document.createElement("source");
+ s3.type = test.type;
+ s3.src = test.name;
+ v.appendChild(s3);
+
+ v.addEventListener("loadeddata", finish, false);
+ document.body.appendChild(v);
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_load_same_resource.html b/dom/media/test/test_load_same_resource.html
new file mode 100644
index 000000000..b87abda32
--- /dev/null
+++ b/dom/media/test/test_load_same_resource.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test loading of the same resource in multiple elements</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.requestCompleteLog();
+var manager = new MediaTestManager;
+
+function cloneLoaded(event) {
+ ok(true, "Clone loaded OK");
+ var e = event.target;
+
+ if (e._expectedDuration) {
+ ok(Math.abs(e.duration - e._expectedDuration) < 0.1,
+ "Clone " + e.currentSrc + " duration: " + e.duration + " expected: " + e._expectedDuration);
+ }
+
+ e.removeEventListener("loadeddata", cloneLoaded, false);
+ removeNodeAndSource(e);
+ manager.finished(e.token);
+}
+
+function tryClone(event) {
+ var e = event.target;
+ var clone = e.cloneNode(false);
+ clone.token = e.token;
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(evt) {
+ var e = evt.target;
+ info(e.token + ": got " + evt.type);
+ }
+ events.forEach(function(e) {
+ clone.addEventListener(e, logEvent, false);
+ });
+
+
+ if (e._expectedDuration) {
+ ok(Math.abs(e.duration - e._expectedDuration) < 0.1,
+ e.currentSrc + " duration: " + e.duration + " expected: " + e._expectedDuration);
+ clone._expectedDuration = e._expectedDuration;
+ }
+
+ clone.addEventListener("loadeddata", cloneLoaded, false);
+ clone.onloadstart = function(evt) {
+ info("cloned " + evt.target.token + " start loading.");
+ evt.target.onloadstart = null;
+ // Since there is only one H264 decoder instance, we have to delete the
+ // decoder of the original element for the cloned element to load. However,
+ // we can't delete the decoder too early otherwise cloning decoder will
+ // fail to kick in. We wait for 'loadstart' event of the cloned element to
+ // know when the decoder is already cloned and we can delete the decoder of
+ // the original element.
+ removeNodeAndSource(e);
+ }
+
+ e.removeEventListener("loadeddata", tryClone, false);
+}
+
+// This test checks that loading the same URI twice in different elements at the same time
+// uses the same resource without doing another network fetch. One of the gCloneTests
+// uses dynamic_resource.sjs to return one resource on the first fetch and a different resource
+// on the second fetch. These resources have different lengths, so if the cloned element
+// does a network fetch it will get a resource with the wrong length and we get a test
+// failure.
+
+function initTest(test, token) {
+ var elemType = /^audio/.test(test.type) ? "audio" : "video";
+ var e = document.createElement(elemType);
+ e.preload = "auto";
+ if (e.canPlayType(test.type)) {
+ e.src = test.name;
+ if (test.duration) {
+ e._expectedDuration = test.duration;
+ }
+ ok(true, "Trying to load " + test.name);
+ e.addEventListener("loadeddata", tryClone, false);
+ e.load();
+ e.token = token;
+ manager.started(token);
+ }
+}
+
+manager.runTests(gCloneTests, initTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_load_source.html b/dom/media/test/test_load_source.html
new file mode 100644
index 000000000..49db96b93
--- /dev/null
+++ b/dom/media/test/test_load_source.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=534571
+-->
+<head>
+ <title>Test for Bug 534571</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=534571">Mozilla Bug 534571</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 534571 **/
+
+// Test that when we load a video from a source child and then change the
+// source's src attribute and load again, that the subsequent loads work.
+
+var v = null;
+var s = null;
+
+function finish(event) {
+ ok(true, "Should have played both videos");
+ SimpleTest.finish();
+}
+
+var first = null;
+var second = null;
+
+function ended(event) {
+ s.type = second.type;
+ s.src = second.name;
+ v.removeEventListener("ended", ended, false);
+ v.addEventListener("ended", finish, false);
+ v.load();
+}
+
+// Find 2 videos we can play.
+v = document.createElement('video');
+for (var i=0; i<gPlayTests.length; i++) {
+ if (!v.canPlayType(gPlayTests[i].type))
+ continue;
+ if (!first) {
+ first = gPlayTests[i];
+ } else if (!second) {
+ second = gPlayTests[i];
+ break;
+ }
+}
+
+if (first && second) {
+ s = document.createElement('source');
+ s.type = first.type;
+ s.src = first.name;
+ v.appendChild(s);
+ v.autoplay = true;
+ v.addEventListener("ended", ended, false);
+ document.body.appendChild(v);
+ SimpleTest.waitForExplicitFinish();
+} else {
+ todo(false, "Need at least two media of supported types for this test!");
+}
+
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_loop.html b/dom/media/test/test_loop.html
new file mode 100644
index 000000000..d657ac696
--- /dev/null
+++ b/dom/media/test/test_loop.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test looping support</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+//longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(2);
+}
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ manager.started(token);
+ var v = document.createElement('video');
+ v.token = token;
+ v.src = test.name;
+ v.name = test.name;
+ v.playCount = 0;
+ v.seekingCount = 0;
+ v.seekedCount = 0;
+ v.loop = true;
+
+ v.addEventListener("play", function (e) {
+ e.target.playCount += 1;
+ ok(e.target.playCount == 1, "Should get exactly one play event.");
+ }, false);
+
+ v.addEventListener("seeking", function (e) {
+ e.target.seekingCount += 1;
+ }, false);
+
+ v.addEventListener("seeked", function (e) {
+ e.target.seekedCount += 1;
+ if (e.target.seekedCount == 2) {
+ ok(e.target.seekingCount == 2, "Expect matched pairs of seeking/seeked events.");
+ e.target.loop = false;
+ }
+ }, false);
+
+ v.addEventListener("ended", function (e) {
+ ok(!e.target.loop, "Shouldn't get ended event while looping.");
+ removeNodeAndSource(e.target);
+ manager.finished(e.target.token);
+ }, false);
+
+ document.body.appendChild(v);
+ v.play();
+}
+
+manager.runTests(gSmallTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_media_selection.html b/dom/media/test/test_media_selection.html
new file mode 100644
index 000000000..51234f121
--- /dev/null
+++ b/dom/media/test/test_media_selection.html
@@ -0,0 +1,146 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: media selection</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="application/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+//longer timeout for sometimes B2G emulator runs very slowly
+if (SpecialPowers.Services.appinfo.name == "B2G") {
+ SimpleTest.requestLongerTimeout(3);
+}
+
+var manager = new MediaTestManager;
+
+function maketest(attach_media, name, type, check_metadata) {
+ return function (token) {
+ var e = document.createElement('video');
+ e.preload = "metadata";
+ token = name + "-" + token;
+ manager.started(token);
+ var errorRun = false;
+ if (check_metadata) {
+ e.addEventListener('loadedmetadata', function () {
+ ok(e.readyState >= HTMLMediaElement.HAVE_METADATA,
+ 'test ' + token + ' readyState ' + e.readyState + ' expected >= ' + HTMLMediaElement.HAVE_METADATA);
+ is(e.currentSrc.substring(e.currentSrc.length - name.length), name, 'test ' + token);
+ // The load can go idle due to cache size limits
+ ok(e.networkState >= HTMLMediaElement.NETWORK_IDLE,
+ 'test ' + token + ' networkState = ' + e.networkState + ' expected >= ' + HTMLMediaElement.NETWORK_IDLE);
+ check_metadata(e);
+ removeNodeAndSource(e);
+ manager.finished(token);
+ }, false);
+ } else {
+ e.addEventListener('error', function onerror(event) {
+ is(errorRun, false, "error handler should run once only!");
+ errorRun = true;
+ is(e.readyState, HTMLMediaElement.HAVE_NOTHING,
+ 'test ' + token + ' readyState should be HAVE_NOTHING when load fails.');
+ e.removeEventListener('error', onerror, true);
+ removeNodeAndSource(e);
+ manager.finished(token);
+ }, true);
+ }
+ attach_media(e, name, type);
+ }
+}
+
+function set_src(element, name, type) {
+ element.src = name;
+ document.body.appendChild(element);
+}
+
+function add_source(element, name, type) {
+ do_add_source(element, name, type);
+ document.body.appendChild(element);
+}
+
+function do_add_source(element, name, type) {
+ var source = document.createElement('source');
+ if (type) {
+ source.type = type;
+ }
+ source.src = name;
+ element.appendChild(source);
+}
+
+function add_sources_last(element, name, type) {
+ do_add_source(element, name, 'unsupported/type');
+ do_add_source(element, name, type);
+ document.body.appendChild(element);
+}
+
+function add_sources_first(element, name, type) {
+ do_add_source(element, name, type);
+ do_add_source(element, name, 'unsupported/type');
+ document.body.appendChild(element);
+}
+
+function late_add_sources_last(element, name, type) {
+ document.body.appendChild(element);
+ do_add_source(element, name, 'unsupported/type');
+ do_add_source(element, name, type);
+}
+
+function late_add_sources_first(element, name, type) {
+ document.body.appendChild(element);
+ do_add_source(element, name, type);
+ do_add_source(element, name, 'unsupported/type');
+}
+
+var nextTest = 0;
+var subtests = [
+ maketest(add_source, 'unknown.raw', 'bogus/type', null)
+];
+
+var tmpVid = document.createElement('video');
+
+for (var i = 0; i < gSmallTests.length; ++i) {
+ var test = gSmallTests[i];
+ var src = test.name;
+ var type = test.type;
+
+ if (!tmpVid.canPlayType(type))
+ continue;
+
+ // The following nested function hack is to ensure that 'test' is correctly
+ // captured in the closure and we don't end up getting the value 'test'
+ // had in the last iteration of the loop. I blame Brendan.
+ var check = function(test) { return function (e) {
+ checkMetadata(test.name, e, test);
+ }}(test);
+
+ var otherType = type.match(/^video\//) ? "audio/x-wav" : "video/ogg";
+ subtests.push(maketest(set_src, src, null, check),
+ maketest(add_source, src, null, check),
+ maketest(add_source, src, type, check),
+ maketest(add_sources_last, src, null, check),
+ maketest(add_sources_first, src, type, check),
+
+ // type hint matches a decoder, actual type matches different decoder
+ maketest(add_source, src, otherType, check),
+ maketest(add_source, 'unknown.raw', type, null),
+
+ // should not start loading, type excludes it from media candiate list
+ maketest(add_source, src, 'bogus/type', null),
+
+ // element doesn't notice source children attached later, needs bug 462455 fixed
+ maketest(late_add_sources_last, src, type, check),
+ maketest(late_add_sources_first, src, type, check));
+}
+
+function startTest(test, token) {
+ test(token);
+}
+
+manager.runTests(subtests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_media_sniffer.html b/dom/media/test/test_media_sniffer.html
new file mode 100644
index 000000000..a4988e710
--- /dev/null
+++ b/dom/media/test/test_media_sniffer.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: sniffing</title>
+ <meta charset='utf-8'>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function finish_test(element) {
+ element.removeEventListener("error", onerror, false);
+ removeNodeAndSource(element);
+ manager.finished(element.token);
+}
+
+function onmetadataloaded(e) {
+ var t = e.target;
+ ++t.srcIndex;
+ ok(true, "The media loads when loaded via " + t.src);
+ if (t.srcIndex < t.srcList.length) {
+ t.src = t.srcList[t.srcIndex];
+ } else {
+ finish_test(t);
+ }
+}
+
+function onerror(e) {
+ var t = e.target;
+ t.removeEventListener('error', onerror);
+ ok(false, "The media could not be loaded." + t.src + "\n");
+ finish_test(t);
+}
+
+function startTest(test, token) {
+ var elemType = /^audio/.test(test.type) ? "audio" : "video";
+ var element = document.createElement(elemType);
+ // This .sjs file serve the media file without Content-Type header, or with a
+ // specific Content-Type header.
+ var baseSrc = 'contentType.sjs?file=' + test.name;
+ element.srcList = [
+ baseSrc + "&nomime",
+ baseSrc + "&type=application/octet-stream",
+ baseSrc + "&type=audio/wav",
+ baseSrc + "&type=text/html",
+ baseSrc + "&type=absolute_nonsense"
+ ];
+ element.srcIndex = 0;
+ element.src = element.srcList[element.srcIndex];
+ element.token = token;
+ element.controls = true;
+ element.preload = "metadata";
+ document.body.appendChild(element);
+ manager.started(token);
+ element.addEventListener("loadedmetadata", onmetadataloaded);
+ element.addEventListener("error", onerror);
+}
+
+manager.runTests(gSnifferTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_avoid_recursion.html b/dom/media/test/test_mediarecorder_avoid_recursion.html
new file mode 100644
index 000000000..fd4500512
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_avoid_recursion.html
@@ -0,0 +1,51 @@
+<html>
+<head>
+ <title>MediaRecorder infinite recursion with requestData() calls in "dataavailable" event</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=897776">Mozill
+a Bug 897776</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+function startTest() {
+ navigator.mozGetUserMedia({audio: true, fake: true}, function(stream) {
+ var mediaRecorder = new MediaRecorder(stream);
+ var count = 0;
+ mediaRecorder.start();
+ info("mediaRecorder start");
+ mediaRecorder.ondataavailable = function (e) {
+ ++count;
+ info("got ondataavailable data size = " + e.data.size);
+ // no more requestData() to prevent busy main thread from starving
+ // the encoding thread
+ if (count == 30) {
+ info("stream.stop");
+ stream.stop();
+ } else if (count < 30 && mediaRecorder.state == 'recording') {
+ info("requestData again");
+ mediaRecorder.requestData();
+ }
+ }
+ mediaRecorder.requestData();
+ info("mediaRecorder requestData");
+ mediaRecorder.onstop = function () {
+ ok(true, "requestData within ondataavailable successfully avoided infinite recursion");
+ SimpleTest.finish();
+ }
+ }, function(err) {
+ ok(false, 'Unexpected error fired with: ' + err);
+ SimpleTest.finish();
+ });
+}
+
+SimpleTest.waitForExplicitFinish();
+startTest();
+
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_mediarecorder_bitrate.html b/dom/media/test/test_mediarecorder_bitrate.html
new file mode 100644
index 000000000..21e6f5b90
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_bitrate.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Bitrate</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+var results = [];
+
+/**
+ * Starts a test on every media recorder file included to check that
+ * the bitrate control works
+ */
+function startTest(test, token) {
+ manager.started(token);
+ runTest(test, token, 1000000);
+ runTest(test, token, 100000);
+}
+
+function runTest(test, token, bitrate) {
+ var element = document.createElement('video');
+ var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
+
+ element.token = token;
+
+ element.src = test.name;
+ element.preload = "metadata";
+ element.onloadedmetadata = function () {
+ info("loadedmetadata");
+ const stream = element.mozCaptureStreamUntilEnded();
+ element.onloadedmetadata = null;
+ element.play();
+
+ const mediaRecorder = new MediaRecorder(stream, {videoBitsPerSecond: bitrate});
+ mediaRecorder.start();
+ is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
+ is(mediaRecorder.stream, stream,
+ 'Media recorder stream = element stream at the start of recording');
+
+ var onStopFired = false;
+ var onDataAvailableFired = false;
+ var encoded_size = 0;
+
+ mediaRecorder.onerror = function () {
+ ok(false, 'Unexpected onerror callback fired');
+ };
+
+ mediaRecorder.onwarning = function () {
+ ok(false, 'Unexpected onwarning callback fired');
+ };
+
+ // This handler verifies that only a single onstop event handler is fired.
+ mediaRecorder.onstop = function () {
+ if (onStopFired) {
+ ok(false, 'onstop unexpectedly fired more than once');
+ } else {
+ onStopFired = true;
+
+ // ondataavailable should always fire before onstop
+ if (onDataAvailableFired) {
+ ok(true, 'onstop fired after ondataavailable');
+ info("test " + test.name + " encoded@" + bitrate + "=" + encoded_size);
+ if (results[test.name]) {
+ var big, small, temp;
+ big = {};
+ big.bitrate = bitrate;
+ big.size = encoded_size;
+ small = results[test.name];
+ // Don't assume the order that these will finish in
+ if (results[test.name].bitrate > bitrate) {
+ temp = big;
+ big = small;
+ small = temp;
+ }
+ // Ensure there is a big enough difference in the encoded
+ // sizes
+ ok(small.size*1.25 < big.size,
+ test.name + ' encoded@' + big.bitrate + '=' + big.size +
+ ' > encoded@' + small.bitrate + '=' + small.size);
+ manager.finished(token);
+ } else {
+ results[test.name] = {};
+ results[test.name].bitrate = bitrate;
+ results[test.name].size = encoded_size;
+ }
+ } else {
+ ok(false, 'onstop fired without an ondataavailable event first');
+ }
+ }
+ };
+
+ // This handler verifies that only a single ondataavailable event handler
+ // is fired with the blob generated having greater than zero size
+ // and a correct mime type.
+ mediaRecorder.ondataavailable = function (evt) {
+ if (onDataAvailableFired) {
+ ok(false, 'ondataavailable unexpectedly fired more than once');
+ } else {
+ onDataAvailableFired = true;
+
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+ ok(evt.data.size > 0,
+ 'Blob data received should be greater than zero');
+ encoded_size = evt.data.size;
+
+ // onstop should not have fired before ondataavailable
+ if (onStopFired) {
+ ok(false, 'ondataavailable unexpectedly fired later than onstop');
+ manager.finished(token);
+ }
+ }
+ };
+ };
+}
+
+manager.runTests(gMediaRecorderVideoTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_creation.html b/dom/media/test/test_mediarecorder_creation.html
new file mode 100644
index 000000000..4ce2b6560
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_creation.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Creation</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+/**
+ * Starts a test on every media recorder file included to check that
+ * a media recorder object created with a stream derived from a media
+ * element with that file produces the correct starting attribute values.
+ */
+function startTest(test, token) {
+ var element = document.createElement('audio');
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStreamUntilEnded();
+
+ var mediaRecorder = new MediaRecorder(element.stream);
+
+ is(mediaRecorder.stream, element.stream,
+ 'Stream should be provided stream on creation');
+ is(mediaRecorder.mimeType, '',
+ 'mimeType should be an empty string on creation');
+ is(mediaRecorder.state, 'inactive',
+ 'state should be inactive on creation');
+
+ manager.finished(token);
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_creation_fail.html b/dom/media/test/test_mediarecorder_creation_fail.html
new file mode 100644
index 000000000..903bf1cc7
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_creation_fail.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record with media.ogg.enabled = false</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ // the expect sequence should be
+ // 1. onerror
+ // 2. ondataavailable
+ // 3. onstop
+ var callbackStep = 0;
+ var stream = new AudioContext().createMediaStreamDestination().stream;
+ var mediaRecorder = new MediaRecorder(stream);
+
+ mediaRecorder.onerror = function (e) {
+ is(callbackStep, 0, 'should fired onstop callback');
+ is(e.name, 'GenericError', 'error name should be GenericError');
+ is(mediaRecorder.mimeType, '', 'mimetype should be empty');
+ is(mediaRecorder.state, 'recording', 'state is recording');
+ info('onerror callback fired');
+ callbackStep = 1;
+ };
+
+ mediaRecorder.onwarning = function () {
+ ok(false, 'Unexpected onwarning callback fired');
+ };
+
+ mediaRecorder.onstop = function () {
+ info('onstop callback fired');
+ is(mediaRecorder.state, 'inactive', 'state should be inactive');
+ is(callbackStep, 2, 'should fired onstop callback');
+ SimpleTest.finish();
+ };
+
+ // This handler fires every 250ms to generate a blob.
+ mediaRecorder.ondataavailable = function (evt) {
+ info('ondataavailable callback fired');
+ is(callbackStep, 1, 'should fired ondataavailable callback');
+ is(evt.data.size, 0, 'data size should be zero');
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.data.type, '', 'encoder start fail, blob miemType should be empty');
+ callbackStep = 2;
+ };
+
+ // Start recording
+ mediaRecorder.start(250);
+ is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
+ is(mediaRecorder.stream, stream,
+ 'Media recorder stream = element stream at the start of recording');
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.ogg.enabled", false]]}, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_getencodeddata.html b/dom/media/test/test_mediarecorder_getencodeddata.html
new file mode 100644
index 000000000..426552ce7
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_getencodeddata.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 957452 Test GetEncodedData problem on asan build</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("untriaged");
+SpecialPowers.pushPrefEnv({"set": [["media.ogg.enabled", false]]},
+ function () {
+ var ac = new window.AudioContext();
+ var dest = ac.createMediaStreamDestination();
+ var stream = dest.stream;
+ var onErrorFired = false;
+ var expectedMimeType = '';
+ var ondataavailableFired = false;
+ setTimeout(function() {
+ var mediaRecorder = new MediaRecorder(stream);
+ mediaRecorder.onstop = function(e) {
+ is(e.target.state, 'inactive',
+ 'Media recorder is inactive after being stopped');
+ ok(onErrorFired, 'onStop after onError');
+ ok(ondataavailableFired, 'ondataavailableFired');
+
+ //Apparently, as soon as the document is unloading, mediaRecorder.ondataavailable
+ //fires again, so set it to null to avoid failures
+ mediaRecorder.ondataavailable = null;
+ SimpleTest.finish();
+ }
+ mediaRecorder.ondataavailable = function(evt) {
+ ondataavailableFired = true;
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+ is(evt.data.size, 0,
+ 'Blob data size received is equal to zero');
+ is(evt.data.type, expectedMimeType,
+ 'Blob data received should have type = ' + expectedMimeType);
+ is(evt.target.mimeType, expectedMimeType,
+ 'Mime type in ondataavailable = ' + expectedMimeType);
+ }
+ mediaRecorder.onerror = function(evt) {
+ ok(evt instanceof RecordErrorEvent,
+ 'Events fired from onerror should be RecordErrorEvent');
+ is(evt.type, 'error',
+ 'Event type should onerror');
+ is(evt.name, 'GenericError',
+ 'Event name is GenericError');
+ onErrorFired = true;
+ }
+ mediaRecorder.start(0);
+ is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
+ is(mediaRecorder.stream, stream,
+ 'Media recorder stream = element stream at the start of recording');
+ mediaRecorder.requestData();
+ }, 100);
+ }
+);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_principals.html b/dom/media/test/test_mediarecorder_principals.html
new file mode 100644
index 000000000..d60f70f54
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_principals.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=489415
+-->
+<head>
+ <title>Test for MediaRecorder Reaction to Principal Change</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<div>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1018299">Test for MediaRecorder Principal Handling</a>
+</div>
+
+<video id="v1" preload="auto"></video>
+<video id="v2" preload="auto"></video>
+
+<pre id="test">
+<script type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+var throwOutside = e => setTimeout(() => { throw e; });
+
+// Generate a random key. The first load with that key will return
+// data, the second and subsequent loads with that key will return a redirect
+// to a different origin ('localhost:8888' will be redirected to 'example.org',
+// and 'example.org' will be redirected to 'localhost:8888'). We rely on the
+// fact that Ogg will do a seek to the end of the resource, triggering a new
+// load with the same key which will return a same-origin resource.
+// Loading data from two different origins should be detected by the media
+// cache and result in a null principal so that the MediaRecorder usages below
+// fail.
+let key = Math.floor(Math.random()*100000000);
+let interval;
+
+function testPrincipals(resource) {
+ if (!resource) {
+ todo(false, "No types supported");
+ return;
+ }
+ // Reduce cache size and cache-ahead to make HTMLMediaElement do partial requests.
+ return pushPrefs(['media.cache_readahead_limit', 2],
+ ['media.cache_size', 192])
+ .then(() => {
+ // First test: Load file from same-origin first, then get redirected to
+ // another origin before attempting to record stream.
+ let video = document.getElementById("v1");
+ video.src =
+ "http://mochi.test:8888/tests/dom/media/test/dynamic_redirect.sjs?key=v1_" +
+ key + "&res=" + resource.name;
+ video.load();
+ // To limit readahead, avoid racing with playback and "catching up" mode.
+ return new Promise(resolve => video.oncanplaythrough = resolve).then(() => {
+ video.play();
+ interval = setInterval(() => info("video.currentTime = "+ video.currentTime), 1000);
+
+ let msg = "mediaRecorder.start() must throw SecurityError";
+ return new Promise(resolve => video.onplaying = resolve)
+ .then(() => waitUntil(() => video.currentTime > resource.duration / 2))
+ // Test failure of the next step only, so "catch-bypass" any errors above.
+ .then(() => Promise.resolve()
+ .then(() => new MediaRecorder(video.mozCaptureStreamUntilEnded()).start())
+ .then(() => ok(false, msg), e => is(e.name, "SecurityError", msg)), 0)
+ .then(() => clearInterval(interval));
+ });
+ })
+ .then(() => {
+ // Second test: Load file from same-origin first, but record ASAP, before
+ // getting redirected to another origin.
+ let video = document.getElementById("v2");
+ video.src =
+ "http://mochi.test:8888/tests/dom/media/test/dynamic_redirect.sjs?key=v2_" +
+ key + "&res=" + resource.name;
+ video.load();
+ let rec, hasStopped, hasEnded = new Promise(r => video.onended = r);
+ let data = [];
+
+ let msgNoThrow = "mediaRecorder.start() should not throw here";
+ let msgSecErr = "mediaRecorder.onerror must fire SecurityError";
+ let msgOnStop = "mediaRecorder.onstop must also have fired";
+ return new Promise(resolve => video.onloadedmetadata = resolve).then(() => {
+ rec = new MediaRecorder(video.mozCaptureStreamUntilEnded());
+ rec.ondataavailable = e => data.push(e.data);
+ rec.start();
+ hasStopped = new Promise(resolve => rec.onstop = resolve);
+ video.play();
+ })
+ .then(() => ok(true, msgNoThrow), e => is(e.name, null, msgNoThrow))
+ .then(() => Promise.race([
+ new Promise((_, reject) => rec.onerror = e => reject(new DOMException("", e.name))),
+ hasEnded
+ ]))
+ .then(() => ok(false, msgSecErr), e => is(e.name, "SecurityError", msgSecErr))
+ .then(() => Promise.race([hasStopped, hasEnded.then(() => Promise.reject())]))
+ .then(() => ok(true, msgOnStop), e => ok(false, msgOnStop))
+ .then(() => clearInterval(interval));
+ });
+}
+
+testPrincipals(getPlayableVideo(gSeekTests))
+.catch(e => throwOutside(e))
+.then(() => SimpleTest.finish())
+.catch(e => throwOutside(e));
+
+var stop = stream => stream.getTracks().forEach(track => track.stop());
+var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
+var waitUntil = f => new Promise(resolve => {
+ var ival = setInterval(() => f() && resolve(clearInterval(ival)), 100);
+});
+
+</script>
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_4ch_audiocontext.html b/dom/media/test/test_mediarecorder_record_4ch_audiocontext.html
new file mode 100644
index 000000000..2ea3d867d
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_4ch_audiocontext.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record AudioContext with four channels</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(4, 80920, context.sampleRate);
+ for (var i = 0; i < 80920; ++i) {
+ for(var j = 0; j < 4; ++j) {
+ buffer.getChannelData(j)[i] = Math.sin(1000 * 2 * Math.PI * i / context.sampleRate);
+ }
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.loop = true;
+ var dest = context.createMediaStreamDestination();
+ var stopTriggered = false;
+ var onstopTriggered = false;
+ dest.channelCount = 4;
+ var expectedMimeType = 'audio/ogg';
+ var totalBlobSize = 0;
+ source.channelCountMode = 'explicit';
+ source.connect(dest);
+ var elem = document.createElement('audio');
+ elem.srcObject = dest.stream;
+ mMediaStream = dest.stream;
+ source.start(0);
+ elem.play();
+ mMediaRecorder = new MediaRecorder(dest.stream);
+ mMediaRecorder.onwarning = function() {
+ ok(false, 'onwarning unexpectedly fired');
+ };
+
+ mMediaRecorder.onerror = function() {
+ ok(false, 'onerror unexpectedly fired');
+ };
+
+ mMediaRecorder.onstop = function() {
+ ok(true, 'onstop fired successfully');
+ is(mMediaRecorder.state, 'inactive', 'check recording status is inactive');
+ onstopTriggered = true;
+ SimpleTest.finish();
+ };
+ mMediaRecorder.ondataavailable = function (e) {
+ if (mMediaRecorder.state == 'recording') {
+ ok(e.data.size > 0, 'check blob has data');
+ }
+ totalBlobSize += e.data.size;
+ ok(totalBlobSize > 0, 'check the totalBlobSize');
+ is(mMediaRecorder.mimeType, expectedMimeType, 'blob should has mimetype, return ' + mMediaRecorder.mimeType);
+ if (!stopTriggered) {
+ mMediaRecorder.stop();
+ stopTriggered = true;
+ } else if (onstopTriggered) {
+ ok(false, 'ondataavailable should come before onstop event');
+ }
+ };
+ try {
+ mMediaRecorder.start(1000);
+ is('recording', mMediaRecorder.state, "check record state recording");
+ } catch (e) {
+ ok(false, 'Can t record audio context');
+ }
+}
+
+startTest();
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_audiocontext.html b/dom/media/test/test_mediarecorder_record_audiocontext.html
new file mode 100644
index 000000000..2697ad8d0
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_audiocontext.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record AudioContext</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ var context = new AudioContext();
+ var hasonstop = false;
+ var buffer = context.createBuffer(1, 80920, context.sampleRate);
+ for (var i = 0; i < 80920; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(1000 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.loop = true;
+
+ var dest = context.createMediaStreamDestination();
+ source.connect(dest);
+ var elem = document.createElement('audio');
+ elem.srcObject = dest.stream;
+ mMediaStream = dest.stream;
+ source.start(0);
+ elem.play();
+ mMediaRecorder = new MediaRecorder(dest.stream);
+ mMediaRecorder.onwarning = function() {
+ ok(false, 'onwarning unexpectedly fired');
+ };
+
+ mMediaRecorder.onerror = function() {
+ ok(false, 'onerror unexpectedly fired');
+ };
+
+ mMediaRecorder.onstop = function() {
+ ok(true, 'onstop fired successfully');
+ is(mMediaRecorder.state, 'inactive', 'check recording status is inactive');
+ SimpleTest.finish();
+ };
+ mMediaRecorder.ondataavailable = function (e) {
+ if (mMediaRecorder.state == 'recording') {
+ is('audio/ogg', mMediaRecorder.mimeType, "check the record mimetype return " + mMediaRecorder.mimeType);
+ ok(e.data.size > 0, 'check blob has data');
+ mMediaRecorder.stop();
+ }
+ };
+ try {
+ mMediaRecorder.start(1000);
+ is('recording', mMediaRecorder.state, "check record state recording");
+ } catch (e) {
+ ok(false, 'Can t record audio context');
+ }
+}
+
+startTest();
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_audiocontext_mlk.html b/dom/media/test/test_mediarecorder_record_audiocontext_mlk.html
new file mode 100644
index 000000000..4dc645285
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_audiocontext_mlk.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>capture for possible memory leak when record AudioContext</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=973765">Mozill
+a Bug 973765</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ // This test case want to capture the memory leak if exit the browser after running those script.
+ var ac = new window.AudioContext();
+ var destStream = ac.createMediaStreamDestination().stream;
+ var recorder = new MediaRecorder(destStream);
+ recorder.start(1000);
+ is(recorder.state, 'recording', 'Media recorder should be recording');
+ is(recorder.stream, destStream,
+ 'Media recorder stream = element stream at the start of recording');
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_audionode.html b/dom/media/test/test_mediarecorder_record_audionode.html
new file mode 100644
index 000000000..ec38609e7
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_audionode.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record AudioContext Node</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=968109">Mozilla Bug 968109</a>
+
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function setUpSource(contextType, nodeType) {
+ // Use contextType to choose offline or real-time context.
+ var context = contextType === 'offline'?
+ new OfflineAudioContext(2 , 80920, 44100) : new AudioContext();
+ var buffer = context.createBuffer(2, 80920, context.sampleRate);
+ for (var i = 0; i < 80920; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(1000 * 2 * Math.PI * i / context.sampleRate);
+ buffer.getChannelData(1)[i] = Math.sin(1000 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.loop = true;
+
+ source.start(0);
+
+ // nodeType decides which node in graph should be the source of recording.
+ var node;
+ if (nodeType === 'source') {
+ node = source;
+ } else if (nodeType === 'splitter') {
+ var splitter = context.createChannelSplitter();
+ source.connect(splitter);
+ node = splitter;
+ } else if (nodeType == 'destination') {
+ source.connect(context.destination);
+ node = context.destination;
+ }
+ // Explicitly start offline context.
+ if (contextType === 'offline') {
+ context.startRendering();
+ }
+
+ return node;
+}
+
+function testRecord(source, done) {
+ ok(source, 'source node should be ok');
+ var recorder;
+ var didThrow = false;
+ try {
+ recorder = new MediaRecorder(source);
+ } catch (e) {
+ didThrow = true;
+ }
+ ok(!didThrow, 'MediaRecorder(AudioNode) should be visible after pref turned on');
+
+ recorder.onwarning = function() {
+ ok(false, 'should not fire onwarning');
+ };
+
+ recorder.onerror = function() {
+ ok(false, 'should not fire onerror');
+ };
+
+ recorder.onstop = function() {
+ is(recorder.state, 'inactive', 'state should become "inactive" after calling stop()');
+ done();
+ };
+
+ recorder.ondataavailable = function (e) {
+ if (recorder.state == 'recording') {
+ is('audio/ogg', recorder.mimeType, 'mimetype should be audio/ogg, not ' + recorder.mimeType);
+ ok(e.data && e.data.size > 0, 'should get data and its length should be > 0');
+ recorder.stop();
+ }
+ };
+
+ try {
+ recorder.start(1000);
+ is('recording', recorder.state, 'state should become "recording" after calling start()');
+ } catch (e) {
+ didThrow = true;
+ }
+ ok(!didThrow, 'start() should succeed');
+}
+
+addLoadEvent(function() {
+ var src = setUpSource();
+ var recorder;
+ var didThrow = false;
+ try {
+ recorder = new MediaRecorder(src);
+ } catch (e) {
+ didThrow = true;
+ }
+ ok(didThrow, 'MediaRecorder(AudioNode) should be hidden behind a pref');
+
+ SpecialPowers.pushPrefEnv({"set": [[ 'media.recorder.audio_node.enabled', true ]]},
+ function () {
+ // Test with various context and source node types.
+ var done1 = new Promise(function (resolve, reject) {
+ testRecord(setUpSource('', 'source'), resolve);
+ });
+ var done2 = new Promise(function (resolve, reject) {
+ testRecord(setUpSource('', 'splitter'), resolve);
+ });
+ var done3 = new Promise(function (resolve, reject) {
+ testRecord(setUpSource('offline', 'destination'), resolve);
+ });
+ // Finish test after all is done.
+ Promise.all([done1, done2, done3]).then(
+ function () { SimpleTest.finish(); }
+ );
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_canvas_captureStream.html b/dom/media/test/test_mediarecorder_record_canvas_captureStream.html
new file mode 100644
index 000000000..7f440fba9
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_canvas_captureStream.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Recording canvas stream</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="/tests/dom/canvas/test/captureStream_common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<div id="content">
+</div>
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ var canvas = document.createElement("canvas");
+ canvas.width = canvas.height = 100;
+ document.getElementById("content").appendChild(canvas);
+
+ var helper = new CaptureStreamTestHelper2D(100, 100);
+ helper.drawColor(canvas, helper.red);
+
+ var stream = canvas.captureStream(0);
+
+ var blob;
+
+ mediaRecorder = new MediaRecorder(stream);
+ is(mediaRecorder.stream, stream,
+ "Media recorder stream = canvas stream at the start of recording");
+
+ mediaRecorder.onwarning = () => ok(false, "warning unexpectedly fired");
+
+ mediaRecorder.onerror = () => ok(false, "Recording failed");
+
+ mediaRecorder.ondataavailable = ev => {
+ is(blob, undefined, "Should only get one dataavailable event");
+ blob = ev.data;
+ };
+
+ mediaRecorder.onstart = () => {
+ info("Got 'start' event");
+ // We just want one frame encoded, to see that the recorder produces something readable.
+ mediaRecorder.stop();
+ };
+
+ mediaRecorder.onstop = () => {
+ info("Got 'stop' event");
+ ok(blob, "Should have gotten a data blob");
+
+ var video = document.createElement("video");
+ video.id = "recorded-video";
+ video.src = URL.createObjectURL(blob);
+ video.play();
+ video.onerror = err => {
+ ok(false, "Should be able to play the recording. Got error. code=" + video.error.code);
+ SimpleTest.finish();
+ };
+ document.getElementById("content").appendChild(video);
+ helper.waitForPixelColor(video, helper.red, 128, "Should become red")
+ .then(SimpleTest.finish);
+ };
+
+ mediaRecorder.start();
+ is(mediaRecorder.state, "recording", "Media recorder should be recording");
+}
+
+SimpleTest.waitForExplicitFinish();
+startTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_changing_video_resolution.html b/dom/media/test/test_mediarecorder_record_changing_video_resolution.html
new file mode 100644
index 000000000..96329ff2c
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_changing_video_resolution.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Recording canvas stream that dynamically changes resolution</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<div id="content">
+</div>
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ var content = document.getElementById("content");
+
+ var canvas = document.createElement("canvas");
+ canvas.width = canvas.height = 100;
+
+ var ctx = canvas.getContext("2d");
+ ctx.fillStyle = "red";
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+
+ var stream = canvas.captureStream(0);
+
+ var numErrorRaised = 0;
+ var numDataAvailabledRaised = 0;
+
+ mediaRecorder = new MediaRecorder(stream);
+ is(mediaRecorder.stream, stream,
+ "Media recorder stream = canvas stream at the start of recording");
+
+ mediaRecorder.onwarning = () => ok(false, "onwarning unexpectedly fired");
+
+ mediaRecorder.onerror = err => {
+ info("Got 'error' event, " + err.name + " (" + err.message + ")");
+ ++numErrorRaised;
+ };
+
+ mediaRecorder.ondataavailable = ev => {
+ info("Got 'dataavailable' event");
+ ++numDataAvailabledRaised;
+ };
+
+ mediaRecorder.onstart = () => {
+ canvas.width = canvas.height = canvas.width * 1.1;
+ ctx.fillStyle = "blue";
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ stream.requestFrame();
+ };
+
+ mediaRecorder.onstop = () => {
+ info("Got 'stop' event");
+ is(numErrorRaised, 1, "Should have gotten 1 error event");
+ is(numDataAvailabledRaised, 1, "Should have gotten 1 dataavailable event");
+ SimpleTest.finish();
+ };
+
+ mediaRecorder.start();
+ is(mediaRecorder.state, "recording", "Media recorder should be recording");
+}
+
+SimpleTest.waitForExplicitFinish();
+startTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_getdata_afterstart.html b/dom/media/test/test_mediarecorder_record_getdata_afterstart.html
new file mode 100644
index 000000000..04e4ec7c8
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_getdata_afterstart.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bug 951008 Test MediaRecorder Record has start event</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+
+ var element = document.createElement('audio');
+ var hasonstart = false;
+ var hasondataavailable = false;
+ var mMediaRecorder;
+
+ element.token = token;
+ manager.started(token);
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStream();
+
+ mMediaRecorder = new MediaRecorder(element.stream);
+ mMediaRecorder.onwarning = function() {
+ ok(false, 'onwarning unexpectedly fired');
+ };
+
+ mMediaRecorder.onerror = function() {
+ ok(false, 'onerror unexpectedly fired');
+ };
+
+ mMediaRecorder.onstart = function() {
+ info('onstart fired successfully');
+ hasonstart = true;
+ // On audio only case, we produce audio/ogg as mimeType.
+ is('audio/ogg', mMediaRecorder.mimeType, "check the record mimetype return " + mMediaRecorder.mimeType);
+ mMediaRecorder.requestData();
+ };
+
+ mMediaRecorder.onstop = function() {
+ info('onstop fired successfully');
+ ok (hasondataavailable, "should have ondataavailable before onstop");
+ is(mMediaRecorder.state, 'inactive', 'check recording status is inactive');
+ SimpleTest.finish();
+ };
+
+ mMediaRecorder.ondataavailable = function (e) {
+ info('ondataavailable fired successfully');
+ if (mMediaRecorder.state == 'recording') {
+ hasondataavailable = true;
+ ok(hasonstart, "should has onstart event first");
+ ok(e.data.size > 0, 'check blob has data');
+ mMediaRecorder.stop();
+ }
+ };
+
+ // Start recording once metadata are parsed.
+ element.onloadedmetadata = function() {
+ element.oncanplaythrough = null;
+ mMediaRecorder.start(0);
+ is(mMediaRecorder.state, 'recording', 'Media recorder should be recording');
+ is(mMediaRecorder.stream, element.stream,
+ 'Media recorder stream = element stream at the start of recording');
+ };
+
+ element.play();
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_gum_video_timeslice.html b/dom/media/test/test_mediarecorder_record_gum_video_timeslice.html
new file mode 100644
index 000000000..efdd98303
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_gum_video_timeslice.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record gUM video with Timeslice</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<div id="content" style="display: none">
+</div>
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ navigator.mozGetUserMedia({audio: true, video: true, fake: true}, function(stream) {
+ var dataAvailableCount = 0;
+ var onDataAvailableFirst = false;
+
+ mediaRecorder = new MediaRecorder(stream);
+ is(mediaRecorder.stream, stream,
+ 'Media recorder stream = element stream at the start of recording');
+ mediaRecorder.onwarning = function() {
+ ok(false, 'onwarning unexpectedly fired');
+ };
+
+ mediaRecorder.onerror = function() {
+ ok(false, 'onerror unexpectedly fired');
+ };
+
+ mediaRecorder.onstop = function() {
+ ok(false, 'Unexpected onstop callback fired');
+ };
+
+ mediaRecorder.ondataavailable = function (evt) {
+ info('ondataavailable fired');
+ dataAvailableCount++;
+
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+ ok(evt.data.size >= 0,
+ 'Blob data size ' + evt.data.size + ' received is greater than or equal to zero');
+ is(mediaRecorder.mimeType, evt.data.type,
+ 'Mime type in MediaRecorder and ondataavailable : '
+ + mediaRecorder.mimeType + ' == ' + evt.data.type);
+
+ // We'll stop recording upon the 1st blob being received
+ if (dataAvailableCount === 1) {
+ mediaRecorder.onstop = function (evt) {
+ info('onstop fired');
+
+ if (!onDataAvailableFirst) {
+ ok(false, 'onstop unexpectedly fired before ondataavailable');
+ }
+
+ ok(true, 'onstop fired successfully');
+ is(mediaRecorder.state, 'inactive',
+ 'check recording status is inactive');
+ SimpleTest.finish();
+ };
+
+ mediaRecorder.stop();
+ is(mediaRecorder.state, 'inactive',
+ 'Media recorder is inactive after being stopped');
+
+ } else if (dataAvailableCount === 2) {
+ // Ensure we've received at least two ondataavailable events before
+ // onstop
+ onDataAvailableFirst = true;
+ }
+ };
+
+ mediaRecorder.start(250);
+ is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
+ }, function(err) {
+ ok(false, 'Unexpected error fired with: ' + err);
+ SimpleTest.finish();
+ });
+}
+
+SimpleTest.waitForExplicitFinish();
+startTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_immediate_stop.html b/dom/media/test/test_mediarecorder_record_immediate_stop.html
new file mode 100644
index 000000000..fd0f64c8a
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_immediate_stop.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Immediate Stop</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+/**
+ * Stops the media recorder immediately after starting the recorder. This test
+ * verifies whether the media recorder can handle this scenario nicely. The
+ * return blob size should be greater than zero, but its duration would be zero
+ * length when play.
+ */
+function startTest(test, token) {
+ var element = document.createElement('audio');
+ var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStreamUntilEnded();
+
+ var mediaRecorder = new MediaRecorder(element.stream);
+ var onStopFired = false;
+ var onDataAvailableFired = false;
+
+ mediaRecorder.onerror = function () {
+ ok(false, 'Unexpected onerror callback fired');
+ };
+
+ mediaRecorder.onwarning = function () {
+ ok(false, 'Unexpected onwarning callback fired');
+ };
+
+ // This handler verifies that only a single onstop event handler is fired.
+ mediaRecorder.onstop = function () {
+ if (onStopFired) {
+ ok(false, 'onstop unexpectedly fired more than once');
+ } else {
+ onStopFired = true;
+
+ // ondataavailable should always fire before onstop
+ if (onDataAvailableFired) {
+ manager.finished(token);
+ } else {
+ ok(false, 'onstop fired without an ondataavailable event first');
+ }
+ }
+ };
+
+ // This handler verifies that only a single ondataavailable event handler
+ // is fired with the blob generated having greater than zero size
+ // and a correct mime type.
+ mediaRecorder.ondataavailable = function (evt) {
+ if (onDataAvailableFired) {
+ ok(false, 'ondataavailable unexpectedly fired more than once');
+ } else {
+ onDataAvailableFired = true;
+
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+
+ // The initialization of encoder can be cancelled.
+ // On some platforms, the stop method may run after media stream track
+ // available, so the blob can contain the header data.
+ if (evt.data.size > 0) {
+ is(evt.data.type, expectedMimeType,
+ 'Blob data received and should have mime type');
+ is(mediaRecorder.mimeType, expectedMimeType,
+ 'Media Recorder mime type in ondataavailable = ' + expectedMimeType);
+ } else if (evt.data.size === 0) {
+ is(mediaRecorder.mimeType, '',
+ 'Blob data mime type is empty');
+ is(mediaRecorder.mimeType, '',
+ 'Media Recorder mime type in ondataavailable is empty');
+ } else {
+ ok(false, 'Blob size can not be negative');
+ }
+
+ // onstop should not have fired before ondataavailable
+ if (onStopFired) {
+ ok(false, 'ondataavailable unexpectedly fired later than onstop');
+ manager.finished(token);
+ }
+ }
+ };
+
+ // This handler completes a start and stop of recording and verifies
+ // respective media recorder state.
+ element.onloadedmetadata = function () {
+ element.onloadedmetadata = null;
+ element.play();
+ mediaRecorder.start();
+ is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
+ is(mediaRecorder.stream, element.stream,
+ 'Media recorder stream = element stream at the start of recording');
+
+ mediaRecorder.stop();
+ is(mediaRecorder.state, 'inactive',
+ 'Media recorder is inactive after being stopped');
+ is(mediaRecorder.stream, element.stream,
+ 'Media recorder stream = element stream post recording');
+ };
+
+ element.preload = "metadata";
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_no_timeslice.html b/dom/media/test/test_mediarecorder_record_no_timeslice.html
new file mode 100644
index 000000000..a408160a5
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_no_timeslice.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record No Timeslice</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+/**
+ * Starts a test on every media recorder file included to check that a
+ * stream derived from the file can be recorded with no time slice provided.
+ */
+function startTest(test, token) {
+ var element = document.createElement('audio');
+ var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStreamUntilEnded();
+
+ var mediaRecorder = new MediaRecorder(element.stream);
+ var onStopFired = false;
+ var onDataAvailableFired = false;
+
+ mediaRecorder.onerror = function () {
+ ok(false, 'Unexpected onerror callback fired');
+ };
+
+ mediaRecorder.onwarning = function () {
+ ok(false, 'Unexpected onwarning callback fired');
+ };
+
+ // This handler verifies that only a single onstop event handler is fired.
+ mediaRecorder.onstop = function () {
+ if (onStopFired) {
+ ok(false, 'onstop unexpectedly fired more than once');
+ } else {
+ onStopFired = true;
+
+ // ondataavailable should always fire before onstop
+ if (onDataAvailableFired) {
+ ok(true, 'onstop fired after ondataavailable');
+ manager.finished(token);
+ } else {
+ ok(false, 'onstop fired without an ondataavailable event first');
+ }
+ }
+ };
+
+ // This handler verifies that only a single ondataavailable event handler
+ // is fired with the blob generated having greater than zero size
+ // and a correct mime type.
+ mediaRecorder.ondataavailable = function (evt) {
+ if (onDataAvailableFired) {
+ ok(false, 'ondataavailable unexpectedly fired more than once');
+ } else {
+ onDataAvailableFired = true;
+
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+ ok(evt.data.size > 0,
+ 'Blob data received should be greater than zero');
+ is(evt.data.type, expectedMimeType,
+ 'Blob data received should have type = ' + expectedMimeType);
+
+ is(mediaRecorder.mimeType, expectedMimeType,
+ 'Mime type in ondataavailable = ' + expectedMimeType);
+
+ // onstop should not have fired before ondataavailable
+ if (onStopFired) {
+ ok(false, 'ondataavailable unexpectedly fired later than onstop');
+ manager.finished(token);
+ }
+ }
+ };
+
+ element.preload = "metadata";
+
+ element.onloadedmetadata = function () {
+ element.onloadedmetadata = null;
+ mediaRecorder.start();
+ is(mediaRecorder.state, 'recording',
+ 'Media recorder should be recording');
+ is(mediaRecorder.stream, element.stream,
+ 'Media recorder stream = element stream at the start of recording');
+
+ element.play();
+ }
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_session.html b/dom/media/test/test_mediarecorder_record_session.html
new file mode 100644
index 000000000..3c179ced0
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_session.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=909670
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Media Recoder recording session</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var element = document.createElement('audio');
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStream();
+
+ var mStopCount = 0;
+ // Start and stop recording session three times continuously.
+ var mExpectStopCount = 3;
+ var mediaRecorder = new MediaRecorder(element.stream);
+
+ // Stop callback.
+ // Suppose to receive mExpectStopCount
+ mediaRecorder.onstop = function stopCallback() {
+ mStopCount++;
+
+ info("MediaRecorder.onstop callback: (" + mStopCount + ")");
+
+ if (mExpectStopCount === mStopCount)
+ {
+ manager.finished(token);
+ }
+ }
+
+ // data avaliable.
+ mediaRecorder.ondataavailable = function(evt) {}
+
+ mediaRecorder.onerror = function(err) {
+ ok(false, 'Unexpected error fired with:' + err);
+ }
+
+ mediaRecorder.onwarning = function() {
+ ok(false, 'Unexpected warning fired');
+ }
+
+ element.preload = "metadata";
+
+ element.onloadedmetadata = function () {
+ element.onloadedmetadata = null;
+ element.play();
+ for (var i = 0; i < mExpectStopCount; i++) {
+ mediaRecorder.start(1000);
+ mediaRecorder.stop();
+ }
+ }
+
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_record_startstopstart.html b/dom/media/test/test_mediarecorder_record_startstopstart.html
new file mode 100644
index 000000000..1d90a782b
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_startstopstart.html
@@ -0,0 +1,77 @@
+ <!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder crash on sequence start stop start method</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<div id="content" style="display: none">
+</div>
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ var ac = new window.AudioContext();
+ var dest = ac.createMediaStreamDestination();
+ var recorder = new MediaRecorder(dest.stream);
+ var stopCount = 0;
+ var dataavailable = 0;
+ // mobile device may produce another format, but not landed.
+ // In audio only case, we should produce opus type.
+ var expectedMimeType = 'audio/ogg';
+ recorder.onstop = function (e) {
+ info('onstop fired');
+ is(recorder.stream, dest.stream,
+ 'Media recorder stream = element stream post recording');
+ stopCount++;
+ if (stopCount == 2) {
+ if (dataavailable >= 2) {
+ SimpleTest.finish();
+ } else {
+ ok(false, 'Should have at least two dataavailable events');
+ }
+ }
+ }
+ recorder.ondataavailable = function (evt) {
+ info('ondataavailable fired');
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+ // If script runs slower, it may generate header data in blob from encoder
+ if (evt.data.size > 0) {
+ info('blob size = ' + evt.data.size);
+ is(evt.data.type, expectedMimeType,
+ 'Blob data received should have type = ' + expectedMimeType);
+ }
+ dataavailable++;
+ }
+ recorder.onerror = function (e) {
+ ok(false, 'it should execute normally without exception');
+ }
+ recorder.onwarning = function() {
+ ok(false, 'onwarning unexpectedly fired');
+ };
+
+ recorder.start(2000);
+ is(recorder.state, 'recording', 'Media recorder should be recording');
+ recorder.stop();
+ is(recorder.state, 'inactive', 'check recording status is inactive');
+ recorder.start(10000); // This bug would crash on this line without this fix.
+ is(recorder.state, 'recording', 'check recording status is recording');
+ // Simulate delay stop, only delay stop no no stop can trigger crash.
+ setTimeout(function() {
+ recorder.stop();
+ is(recorder.state, 'inactive','check recording status is recording');
+ }, 1000);
+}
+
+SimpleTest.requestFlakyTimeout("untriaged");
+startTest();
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_mediarecorder_record_stopms.html b/dom/media/test/test_mediarecorder_record_stopms.html
new file mode 100644
index 000000000..0dad5ba61
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_stopms.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record Stopped Stream</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<div id="content" style="display: none">
+ <audio id="testAudio"></audio>
+</div>
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ navigator.mozGetUserMedia({audio: true, fake: true}, function(stream) {
+ var testAudio = document.getElementById('testAudio');
+
+ testAudio.onended = function() {
+ var mediaRecorder = new MediaRecorder(stream);
+ try {
+ mediaRecorder.start();
+ ok(false, 'Recording a stopped stream failed to throw an exception');
+ } catch (e) {
+ is(e.name, 'InvalidStateError',
+ 'Recording a stopped stream threw an InvalidStateError');
+ } finally {
+ SimpleTest.finish();
+ }
+ };
+
+ testAudio.mozSrcObject = stream;
+ testAudio.play();
+ stream.stop();
+ }, function(err) {
+ ok(false, 'Unexpected error fired with: ' + err);
+ SimpleTest.finish();
+ });
+}
+
+SimpleTest.waitForExplicitFinish();
+startTest();
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_mediarecorder_record_timeslice.html b/dom/media/test/test_mediarecorder_record_timeslice.html
new file mode 100644
index 000000000..f1e4e9927
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_record_timeslice.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Record Timeslice</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+/**
+ * Starts a test on every media recorder file included to check that a stream
+ * derived from the file can be recorded with a timeslice provided
+ */
+function startTest(test, token) {
+ var element = document.createElement('audio');
+ var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.preload = "auto";
+
+ // Set up MediaRecorder once loadedmetadata fires and tracks are available.
+ element.onloadedmetadata = function() {
+ element.onloadedmetadata = null;
+
+ const stream = element.mozCaptureStream();
+ const mediaRecorder = new MediaRecorder(stream);
+
+ mediaRecorder.onerror = function () {
+ ok(false, 'Unexpected onerror callback fired');
+ };
+
+ mediaRecorder.onwarning = function () {
+ ok(false, 'Unexpected onwarning callback fired');
+ };
+
+ mediaRecorder.onstop = function () {
+ ok(false, 'Unexpected onstop callback fired');
+ };
+
+ var dataAvailableCount = 0;
+ var onDataAvailableFirst = false;
+
+ // This handler fires every 250ms to generate a blob.
+ mediaRecorder.ondataavailable = function (evt) {
+ info('ondataavailable fired');
+ dataAvailableCount++;
+
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.type, 'dataavailable',
+ 'Event type should dataavailable');
+ ok(evt.data.size >= 0,
+ 'Blob data size received is greater than or equal to zero');
+
+ is(evt.data.type, expectedMimeType,
+ 'Blob data received should have type = ' + expectedMimeType);
+ is(mediaRecorder.mimeType, expectedMimeType,
+ 'Mime type in ondataavailable = ' + mediaRecorder.mimeType);
+
+ // We'll stop recording upon the 1st blob being received
+ if (dataAvailableCount === 1) {
+ mediaRecorder.onstop = function (evt) {
+ info('onstop fired');
+
+ if (!onDataAvailableFirst) {
+ ok(false, 'onstop unexpectedly fired before ondataavailable');
+ }
+ element.pause();
+ manager.finished(token);
+ };
+
+ mediaRecorder.stop();
+ is(mediaRecorder.state, 'inactive',
+ 'Media recorder is inactive after being stopped');
+ is(mediaRecorder.stream, stream,
+ 'Media recorder stream = element stream post recording');
+
+ } else if (dataAvailableCount === 2) {
+ // Ensure we've received at least two ondataavailable events before onstop
+ onDataAvailableFirst = true;
+ }
+ };
+
+ mediaRecorder.start(1);
+ element.play();
+ is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
+ is(mediaRecorder.stream, stream,
+ 'Media recorder stream = element stream at the start of recording');
+ };
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_reload_crash.html b/dom/media/test/test_mediarecorder_reload_crash.html
new file mode 100644
index 000000000..f292ed7df
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_reload_crash.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that reloading media recorder object</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=894348">Mozill
+a Bug 894348</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ for (i = 0; i< 5; i++) {
+ try { o0 = document.createElement('audio') } catch(e) { }
+ try { o0.src = "sound.ogg" } catch(e) { }
+ try { (document.body || document.documentElement).appendChild(o0) } catch(e) { }
+ try { o1 = o0.mozCaptureStreamUntilEnded(); } catch(e) { }
+ try { o2 = new MediaRecorder(o1) } catch(e) { }
+ try { o2.start(0) } catch(e) { }
+ SpecialPowers.gc();
+ }
+ ok(true, "pass the crash test");
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_state_transition.html b/dom/media/test/test_mediarecorder_state_transition.html
new file mode 100644
index 000000000..7b224c5fc
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_state_transition.html
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder State Transition</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+// List of operation tests for media recorder objects to verify if running
+// these operations should result in an exception or not
+var operationTests = [
+ {
+ operations: ['stop'],
+ isValid: false
+ },
+ {
+ operations: ['requestData'],
+ isValid: false
+ },
+ {
+ operations: ['pause'],
+ isValid: false
+ },
+ {
+ operations: ['resume'],
+ isValid: false
+ },
+ {
+ operations: ['start'],
+ isValid: true
+ },
+ {
+ operations: ['start'],
+ isValid: true,
+ timeSlice: 200
+ },
+ {
+ operations: ['start', 'pause'],
+ isValid: true
+ },
+ {
+ operations: ['start', 'pause'],
+ isValid: true,
+ timeSlice: 200
+ },
+ {
+ operations: ['start', 'start'],
+ isValid: false
+ },
+ {
+ operations: ['start', 'resume'],
+ isValid: false
+ },
+ {
+ operations: ['start', 'stop'],
+ isValid: true
+ },
+ {
+ operations: ['start', 'stop'],
+ isValid: true,
+ timeSlice: 200
+ },
+ {
+ operations: ['start', 'requestData'],
+ isValid: true
+ },
+ {
+ operations: ['start', 'requestData'],
+ isValid: true,
+ timeSlice: 200
+ },
+ {
+ operations: ['start', 'pause', 'stop'],
+ isValid: true
+ },
+ {
+ operations: ['start', 'pause', 'start'],
+ isValid: false
+ },
+ {
+ operations: ['start', 'pause', 'pause'],
+ isValid: false
+ },
+ {
+ operations: ['start', 'pause', 'requestData'],
+ isValid: false
+ },
+ {
+ operations: ['start', 'pause', 'resume'],
+ isValid: true
+ },
+ {
+ operations: ['start', 'pause', 'resume'],
+ isValid: true,
+ timeSlice: 200
+ }
+];
+
+/**
+ * Runs through each available state transition test by running all
+ * available operations on a media recorder object. Then, we report
+ * back if the test was expected through an exception or not.
+ *
+ * @param {MediaStream} testStream the media stream used for media recorder
+ * operation tests
+ */
+function runStateTransitionTests(testStream) {
+ for (operationTest of operationTests) {
+ var mediaRecorder = new MediaRecorder(testStream);
+ var operationsString = operationTest.operations.toString();
+
+ try {
+ for (operation of operationTest.operations) {
+ if (operationTest.timeSlice && operation === 'start') {
+ operationsString += ' with timeslice ' + operationTest.timeSlice;
+ mediaRecorder[operation](operationTest.timeSlice);
+ } else {
+ mediaRecorder[operation]();
+ }
+ }
+
+ if (operationTest.isValid) {
+ ok(true, 'Successful transitions for ' + operationsString);
+ } else {
+ ok(false, 'Failed transitions for ' + operationsString);
+ }
+ } catch (err) {
+ if (!operationTest.isValid && err.name === 'InvalidStateError') {
+ ok(true, 'InvalidStateError fired for ' + operationsString);
+ } else {
+ ok(false, 'No InvalidStateError for ' + operationsString);
+ }
+ }
+ }
+}
+
+/**
+ * Starts a test on every media recorder file included to check that various
+ * state transition flows that can happen in the media recorder object throw
+ * exceptions when they are expected to and vice versa.
+ */
+function startTest(test, token) {
+ var element = document.createElement('audio');
+ var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStream();
+
+ element.oncanplaythrough = function () {
+ element.oncanplaythrough = null;
+ runStateTransitionTests(element.stream);
+ manager.finished(token);
+ };
+
+ element.play();
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediarecorder_unsupported_src.html b/dom/media/test/test_mediarecorder_unsupported_src.html
new file mode 100644
index 000000000..cbbc82e7d
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_unsupported_src.html
@@ -0,0 +1,99 @@
+<html>
+<head>
+ <title>Bug 957439 - Media Recording - Assertion fail at Pause if unsupported input stream.</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=957439">Mozilla Bug 957439</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+
+function startTest() {
+ // also do general checks on mimetype support for audio-only
+ ok(MediaRecorder.isTypeSupported("audio/ogg"), 'Should support audio/ogg');
+ ok(MediaRecorder.isTypeSupported('audio/ogg; codecs="opus"'), 'Should support audio/ogg+opus');
+ ok(!MediaRecorder.isTypeSupported('audio/ogg; codecs="foobar"'), 'Should not support audio/ogg + unknown_codec');
+ ok(!MediaRecorder.isTypeSupported("video/webm"), 'Should not support video/webm');
+ ok(!MediaRecorder.isTypeSupported("video/mp4"), 'Should not support video/mp4');
+
+ navigator.mozGetUserMedia({audio: false, video: true, fake: true},
+ function(stream) {
+
+ // Expected callback sequence should be:
+ // 1. onerror (from start)
+ // 2. onerror (from pause)
+ // 3. ondataavailable
+ // 4. onstop
+ var callbackStep = 0;
+ var mediaRecorder = new MediaRecorder(stream);
+
+ is(mediaRecorder.stream, stream, 'Stream should be provided on creation');
+
+ mediaRecorder.onerror = function (e) {
+ callbackStep++;
+ if (callbackStep == 1) {
+ try {
+ mediaRecorder.pause();
+ } catch(e) {
+ ok(false, 'Should not get exception in pause call.');
+ }
+ }
+ ok(callbackStep < 3, 'onerror callback fired as expected.');
+ is(e.name, 'GenericError', 'Error name should be GenericError.');
+ is(mediaRecorder.mimeType, '', 'mimetype should be empty');
+ is(mediaRecorder.state, 'recording', 'state is recording');
+ info('onerror callback fired');
+ }
+
+ mediaRecorder.onwarning = function () {
+ ok(false, 'Unexpected onwarning callback fired.');
+ };
+
+ mediaRecorder.ondataavailable = function (evt) {
+ callbackStep++;
+ info('ondataavailable callback fired');
+ is(callbackStep, 3, 'should fired ondataavailable callback');
+ is(evt.data.size, 0, 'data size should be zero');
+ ok(evt instanceof BlobEvent,
+ 'Events fired from ondataavailable should be BlobEvent');
+ is(evt.data.type, '', 'encoder start fail, blob miemType should be empty');
+ };
+
+ mediaRecorder.onstop = function() {
+ callbackStep++;
+ info('onstop callback fired');
+ is(mediaRecorder.state, 'inactive', 'state should be inactive');
+ is(callbackStep, 4, 'should fired onstop callback');
+ SimpleTest.finish();
+ };
+
+ try {
+ mediaRecorder.start();
+ } catch(e) {
+ ok(false, 'Should not get exception in start call.');
+ }
+ },
+ function(err) {
+ ok(false, 'Unexpected error fired with: ' + err);
+ SimpleTest.finish();
+ }
+ );
+}
+
+SimpleTest.waitForExplicitFinish();
+
+// In order to generate an "unsupported stream", pref off video encoding to
+// make the platform support audio encoding only.
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [
+ ["media.encoder.webm.enabled", false],
+ ]
+ }, startTest);
+
+</script>
+</head>
+</html>
diff --git a/dom/media/test/test_mediarecorder_webm_support.html b/dom/media/test/test_mediarecorder_webm_support.html
new file mode 100644
index 000000000..b17bd0bfd
--- /dev/null
+++ b/dom/media/test/test_mediarecorder_webm_support.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media Recording - test WebM MIME support</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ok(MediaRecorder.isTypeSupported('video/webm'), 'Should support video/webm');
+ok(!MediaRecorder.isTypeSupported('video/webm; codecs="vp8, vorbis"'), 'Should not support video/webm + vp8/vorbis');
+ok(!MediaRecorder.isTypeSupported('video/webm; codecs="vp9, vorbis"'), 'Should not support video/webm + vp9/vorbis');
+ok(MediaRecorder.isTypeSupported('video/webm; codecs="vp8, opus"'), 'Should support video/webm + vp8/opus');
+ok(!MediaRecorder.isTypeSupported('video/webm; codecs="vp9, opus"'), 'Should not support video/webm + vp9/opus');
+</script>
+</head>
+</html>
diff --git a/dom/media/test/test_mediatrack_consuming_mediaresource.html b/dom/media/test/test_mediatrack_consuming_mediaresource.html
new file mode 100644
index 000000000..c8ce3a8b4
--- /dev/null
+++ b/dom/media/test/test_mediatrack_consuming_mediaresource.html
@@ -0,0 +1,181 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test track interfaces when consuming media resources</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var elemType = getMajorMimeType(test.type);
+ var element = document.createElement(elemType);
+
+ var audioOnchange = 0;
+ var audioOnaddtrack = 0;
+ var audioOnremovetrack = 0;
+ var videoOnchange = 0;
+ var videoOnaddtrack = 0;
+ var videoOnremovetrack = 0;
+ var isPlaying = false;
+
+ isnot(element.audioTracks, undefined,
+ 'HTMLMediaElement::AudioTracks() property should be available.');
+ isnot(element.videoTracks, undefined,
+ 'HTMLMediaElement::VideoTracks() property should be available.');
+
+ element.audioTracks.onaddtrack = function(e) {
+ audioOnaddtrack++;
+ }
+
+ element.audioTracks.onremovetrack = function(e) {
+ audioOnremovetrack++;
+ }
+
+ element.audioTracks.onchange = function(e) {
+ audioOnchange++;
+ }
+
+ element.videoTracks.onaddtrack = function(e) {
+ videoOnaddtrack++;
+ }
+
+ element.videoTracks.onremovetrack = function(e) {
+ videoOnremovetrack++;
+ }
+
+ element.videoTracks.onchange = function(e) {
+ videoOnchange++;
+ }
+
+ function checkTrackRemoved() {
+ if (isPlaying) {
+ if (test.hasAudio) {
+ is(audioOnremovetrack, 1, 'Calls of onremovetrack on audioTracks should be 1.');
+ is(element.audioTracks.length, 0, 'The length of audioTracks should be 0.');
+ }
+ if (test.hasVideo) {
+ is(videoOnremovetrack, 1, 'Calls of onremovetrack on videoTracks should be 1.');
+ is(element.videoTracks.length, 0, 'The length of videoTracks should be 0.');
+ }
+ }
+ }
+
+ function onended() {
+ ok(true, 'Event ended is expected to be fired on element.');
+ checkTrackRemoved();
+ element.onended = null;
+ element.onplaying = null;
+ element.onpause = null;
+ manager.finished(element.token);
+ }
+
+ function checkTrackAdded() {
+ isPlaying = true;
+ if (test.hasAudio) {
+ is(audioOnaddtrack, 1, 'Calls of onaddtrack on audioTracks should be 1.');
+ is(element.audioTracks.length, 1, 'The length of audioTracks should be 1.');
+ ok(element.audioTracks[0].enabled, 'Audio track should be enabled as default.');
+ }
+ if (test.hasVideo) {
+ is(videoOnaddtrack, 1, 'Calls of onaddtrack on videoTracks should be 1.');
+ is(element.videoTracks.length, 1, 'The length of videoTracks should be 1.');
+ is(element.videoTracks.selectedIndex, 0,
+ 'The first video track is set selected as default.');
+ }
+ }
+
+ function setTrackEnabled(enabled) {
+ if (test.hasAudio) {
+ element.audioTracks[0].enabled = enabled;
+ }
+ if (test.hasVideo) {
+ element.videoTracks[0].selected = enabled;
+ }
+ }
+
+ function checkTrackChanged(calls, enabled) {
+ if (test.hasAudio) {
+ is(audioOnchange, calls, 'Calls of onchange on audioTracks should be '+calls);
+ is(element.audioTracks[0].enabled, enabled,
+ 'Enabled value of the audio track should be ' +enabled);
+ }
+ if (test.hasVideo) {
+ is(videoOnchange, calls, 'Calls of onchange on videoTracks should be '+calls);
+ is(element.videoTracks[0].selected, enabled,
+ 'Selected value of the video track should be ' +enabled);
+ var index = enabled ? 0 : -1;
+ is(element.videoTracks.selectedIndex, index,
+ 'SelectedIndex of video tracks should be ' +index);
+ }
+ }
+
+ function onpause() {
+ element.onpause = null;
+ if (element.ended) {
+ return;
+ }
+ if (steps == 1) {
+ setTrackEnabled(false);
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ } else if (steps == 2) {
+ setTrackEnabled(true);
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ }
+ }
+
+ function onplaying() {
+ element.onplaying = null;
+ if (element.ended) {
+ return;
+ }
+ if (steps == 1) {
+ element.onpause = onpause;
+ element.pause();
+ checkTrackAdded();
+ } else if (steps == 2) {
+ element.onpause = onpause;
+ element.pause();
+ checkTrackChanged(1, false);
+ } else if (steps == 3) {
+ checkTrackChanged(2, true);
+ }
+ }
+
+ var steps = 0;
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.onplaying = onplaying;
+ element.onended = onended;
+ element.play();
+ steps++;
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [
+ ["media.track.enabled", true]
+ ]
+ },
+ function() {
+ manager.runTests(gTrackTests, startTest);
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediatrack_consuming_mediastream.html b/dom/media/test/test_mediatrack_consuming_mediastream.html
new file mode 100644
index 000000000..a0961d0ff
--- /dev/null
+++ b/dom/media/test/test_mediatrack_consuming_mediastream.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test track interfaces when consuming a MediaStream from gUM</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+function startTest() {
+ navigator.mozGetUserMedia({audio:true, video:true, fake:true},
+ function(stream) {
+ var element = document.createElement("video");
+
+ var audioOnchange = 0;
+ var audioOnaddtrack = 0;
+ var audioOnremovetrack = 0;
+ var videoOnchange = 0;
+ var videoOnaddtrack = 0;
+ var videoOnremovetrack = 0;
+ var isPlaying = false;
+
+ element.audioTracks.onaddtrack = function(e) {
+ audioOnaddtrack++;
+ }
+
+ element.audioTracks.onremovetrack = function(e) {
+ audioOnremovetrack++;
+ }
+
+ element.audioTracks.onchange = function(e) {
+ audioOnchange++;
+ }
+
+ element.videoTracks.onaddtrack = function(e) {
+ videoOnaddtrack++;
+ }
+
+ element.videoTracks.onremovetrack = function(e) {
+ videoOnremovetrack++;
+ }
+
+ element.videoTracks.onchange = function(e) {
+ videoOnchange++;
+ }
+
+ function checkTrackRemoved() {
+ if (isPlaying) {
+ is(element.audioTracks.length, 0, 'The length of audioTracks should be 0.');
+ is(element.videoTracks.length, 0, 'The length of videoTracks should be 0.');
+ }
+ }
+
+ function onended() {
+ ok(true, 'Event ended is expected to be fired on element.');
+ checkTrackRemoved();
+ element.onended = null;
+ element.onplaying = null;
+ element.onpause = null;
+ SimpleTest.finish();
+ }
+
+ function checkTrackAdded() {
+ isPlaying = true;
+ is(audioOnaddtrack, 1, 'Calls of onaddtrack on audioTracks should be 1.');
+ is(element.audioTracks.length, 1, 'The length of audioTracks should be 1.');
+ ok(element.audioTracks[0].enabled, 'Audio track should be enabled as default.');
+ is(videoOnaddtrack, 1, 'Calls of onaddtrack on videoTracks should be 1.');
+ is(element.videoTracks.length, 1, 'The length of videoTracks should be 1.');
+ is(element.videoTracks.selectedIndex, 0,
+ 'The first video track is set selected as default.');
+ }
+
+ function setTrackEnabled(enabled) {
+ element.audioTracks[0].enabled = enabled;
+ element.videoTracks[0].selected = enabled;
+ }
+
+ function checkTrackChanged(calls, enabled) {
+ is(audioOnchange, calls, 'Calls of onchange on audioTracks should be '+calls);
+ is(element.audioTracks[0].enabled, enabled,
+ 'Enabled value of the audio track should be ' +enabled);
+ is(videoOnchange, calls, 'Calls of onchange on videoTracks should be '+calls);
+ is(element.videoTracks[0].selected, enabled,
+ 'Selected value of the video track should be ' +enabled);
+ var index = enabled ? 0 : -1;
+ is(element.videoTracks.selectedIndex, index,
+ 'SelectedIndex of video tracks should be ' +index);
+ }
+
+ function onpause() {
+ element.onpause = null;
+ if (element.ended) {
+ return;
+ }
+ if (steps == 1) {
+ setTrackEnabled(false);
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ } else if (steps == 2) {
+ setTrackEnabled(true);
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ }
+ }
+
+ function onplaying() {
+ element.onplaying = null;
+ if (element.ended) {
+ return;
+ }
+ if (steps == 1) {
+ element.onpause = onpause;
+ element.pause();
+ checkTrackAdded();
+ } else if (steps == 2) {
+ element.onpause = onpause;
+ element.pause();
+ checkTrackChanged(1, false);
+ } else if (steps == 3) {
+ checkTrackChanged(2, true);
+ stream.stop();
+ }
+ }
+
+ var steps = 0;
+ element.srcObject = stream;
+ element.onplaying = onplaying;
+ element.onended = onended;
+ element.play();
+ steps++;
+ },
+ function(err) {
+ ok(false, 'Unexpected error fired with: ' + err);
+ SimpleTest.finish();
+ }
+ );
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [
+ ["media.track.enabled", true]
+ ]
+ }, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediatrack_events.html b/dom/media/test/test_mediatrack_events.html
new file mode 100644
index 000000000..2f9686598
--- /dev/null
+++ b/dom/media/test/test_mediatrack_events.html
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test events of media track interfaces</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+function startTest() {
+ navigator.mozGetUserMedia({audio:true, video:true, fake:true},
+ function(stream) {
+ var element = document.createElement("video");
+
+ isnot(element.audioTracks, undefined,
+ 'HTMLMediaElement::AudioTracks() property should be available.');
+ isnot(element.videoTracks, undefined,
+ 'HTMLMediaElement::VideoTracks() property should be available.');
+
+ function verifyEvent(e, type) {
+ is(e.type, type, "Event type should be " + type);
+ ok(e.isTrusted, "Event should be trusted.");
+ ok(!e.bubbles, "Event shouldn't bubble.");
+ ok(!e.cancelable, "Event shouldn't be cancelable.");
+ }
+
+ element.audioTracks.onaddtrack = function(e) {
+ ok(e instanceof TrackEvent, "Event fired from onaddtrack should be a TrackEvent");
+ ok(true, 'onaddtrack is expected to be called from audioTracks.');
+ verifyEvent(e, "addtrack");
+ }
+
+ element.audioTracks.onremovetrack = function(e) {
+ ok(e instanceof TrackEvent, "Event fired from onremovetrack should be a TrackEvent");
+ ok(true, 'onremovetrack is expected to be called from audioTracks.');
+ verifyEvent(e, "removetrack");
+ }
+
+ element.audioTracks.onchange = function(e) {
+ ok(e instanceof window.Event, "Event fired from onchange should be a simple event.");
+ ok(true, 'onchange is expected to be called from audioTracks.');
+ verifyEvent(e, "change");
+ }
+
+ element.videoTracks.onaddtrack = function(e) {
+ ok(e instanceof TrackEvent, "Event fired from onaddtrack should be a TrackEvent");
+ ok(true, 'onaddtrack is expected to be called from videoTracks.');
+ verifyEvent(e, "addtrack");
+ }
+
+ element.videoTracks.onremovetrack = function(e) {
+ ok(e instanceof TrackEvent, "Event fired from onremovetrack should be a TrackEvent");
+ ok(true, 'onremovetrack is expected to be called from videoTracks.');
+ verifyEvent(e, "removetrack");
+ }
+
+ element.videoTracks.onchange = function(e) {
+ ok(e instanceof window.Event, "Event fired from onchange should be a simple event.");
+ ok(true, 'onchange is expected to be called from videoTracks.');
+ verifyEvent(e, "change");
+ }
+
+ function onended() {
+ ok(true, 'Event ended is expected to be fired on element.');
+ element.onended = null;
+ element.onplaying = null;
+ element.onpause = null;
+ //This helps to prevent these events from firing after SimpleTest.finish()
+ //on B2G ICS Emulator, but not sure they have been run at all, then
+ element.audioTracks.onremovetrack = null;
+ element.audioTracks.onaddtrack = null;
+ element.audioTracks.onchange = null;
+ element.videoTracks.onremovetrack = null;
+ element.videoTracks.onaddtrack = null;
+ element.videoTracks.onchange = null;
+ SimpleTest.finish();
+ }
+
+ function onpause() {
+ element.onpause = null;
+ if (element.ended) {
+ return;
+ }
+ if (steps == 1) {
+ element.audioTracks[0].enabled = false;
+ element.videoTracks[0].selected = false;
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ }
+ }
+
+ function onplaying() {
+ element.onplaying = null;
+ if (element.ended) {
+ return;
+ }
+ if (steps == 1) {
+ element.onpause = onpause;
+ element.pause();
+ } else if (steps == 2) {
+ stream.stop();
+ }
+ }
+
+ var steps = 0;
+ element.mozSrcObject = stream;
+ element.onplaying = onplaying;
+ element.onended = onended;
+ element.play();
+ steps++;
+ },
+ function(err) {
+ ok(false, 'Unexpected error fired with: ' + err);
+ SimpleTest.finish();
+ }
+ );
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [
+ ["media.track.enabled", true]
+ ]
+ }, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediatrack_parsing_ogg.html b/dom/media/test/test_mediatrack_parsing_ogg.html
new file mode 100644
index 000000000..e98636c2d
--- /dev/null
+++ b/dom/media/test/test_mediatrack_parsing_ogg.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test events of media track interfaces</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function localCheckMetadata(msg, e) {
+ ok(msg in gOggTrackInfoResults, "File: " + msg + " is in pre-parsed gOggTrackInfoResults list");
+ var r = gOggTrackInfoResults[msg];
+
+ var hasExpectedAudio = r && r.hasOwnProperty("audio_id");
+ var hasExpectedVideo = r && r.hasOwnProperty("video_id");
+
+ var hasParsedAudio = e.audioTracks.length >= 1;
+ var hasParsedVideo = e.videoTracks.length >= 1;
+
+ ok(!(hasExpectedAudio ^ hasParsedAudio), "Check availability of expected/parsed audio");
+ ok(!(hasExpectedVideo ^ hasParsedVideo), "Check availability of expected/parsed video");
+ if (hasParsedAudio) {
+ is(e.audioTracks.length, 1, "The length of audio track should be 1");
+ is(e.audioTracks[0].id, r.audio_id, "File: " + msg + ", Audio track id");
+ is(e.audioTracks[0].kind, r.audio_kind, "File: " + msg + ", Audio track kind");
+ is(e.audioTracks[0].language, r.audio_language, "File: " + msg + ", Audio track language");
+ is(e.audioTracks[0].label, r.audio_label, "File: " + msg + ", Audio track label");
+ }
+ if (hasParsedVideo) {
+ is(e.videoTracks.length, 1, "The length of video track should be 1");
+ is(e.videoTracks[0].id, r.video_id, "File: " + msg + ", Video track id");
+ is(e.videoTracks[0].kind, r.video_kind, "File: " + msg + ", Video track kind");
+ is(e.videoTracks[0].language, r.video_language, "File: " + msg + ", Video track language");
+ is(e.videoTracks[0].label, r.video_label, "File: " + msg + ", Video track label");
+ }
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ manager.started(token);
+
+ v.src = test.name;
+ v.name = test.name;
+
+ v.onloadedmetadata = function(evt) {
+ localCheckMetadata(evt.target.name, evt.target);
+ evt.target.finished = true;
+ evt.target.onloadedmetadata = null;
+ removeNodeAndSource(evt.target);
+ manager.finished(evt.target.token);
+ };
+
+ document.body.appendChild(v);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.track.enabled", true]]},
+ function() {
+ manager.runTests(gMultitrackInfoOggPlayList, startTest);
+ }
+);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mediatrack_replay_from_end.html b/dom/media/test/test_mediatrack_replay_from_end.html
new file mode 100644
index 000000000..584849a59
--- /dev/null
+++ b/dom/media/test/test_mediatrack_replay_from_end.html
@@ -0,0 +1,146 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test media tracks if replay after playback has ended</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ // Scenario to test:
+ // 1. Audio tracks and video tracks should be added to the track list when
+ // playing, and all tracks should be removed from the list after we seek
+ // to the end.
+ // 2. All tracks should be added back to the list if we replay from the end,
+ // and all tracks should be removed from the list after we seek to the end.
+ // 3. After seek to the middle from end of playback, all tracks should be
+ // added back to the list if we play from here, and all tracks should be
+ // removed from the list after we seek to the end.
+
+ var elemType = getMajorMimeType(test.type);
+ var element = document.createElement(elemType);
+
+ var audioOnchange = 0;
+ var audioOnaddtrack = 0;
+ var audioOnremovetrack = 0;
+ var videoOnchange = 0;
+ var videoOnaddtrack = 0;
+ var videoOnremovetrack = 0;
+ var isPlaying = false;
+ var steps = 0;
+
+ element.audioTracks.onaddtrack = function(e) {
+ audioOnaddtrack++;
+ }
+
+ element.audioTracks.onremovetrack = function(e) {
+ audioOnremovetrack++;
+ }
+
+ element.videoTracks.onaddtrack = function(e) {
+ videoOnaddtrack++;
+ }
+
+ element.videoTracks.onremovetrack = function(e) {
+ videoOnremovetrack++;
+ }
+
+ function testTrackEventCalls(expectedCalls) {
+ if (test.hasAudio) {
+ is(audioOnaddtrack, expectedCalls,
+ 'Calls of onaddtrack on audioTracks should be '+expectedCalls+' times.');
+ is(audioOnremovetrack, expectedCalls,
+ 'Calls of onremovetrack on audioTracks should be '+expectedCalls+' times.');
+ }
+ if (test.hasVideo) {
+ is(videoOnaddtrack, expectedCalls,
+ 'Calls of onaddtrack on videoTracks should be '+expectedCalls+' times.');
+ is(videoOnremovetrack, expectedCalls,
+ 'Calls of onremovetrack on videoTracks should be '+expectedCalls+' times.');
+ }
+ }
+
+ function finishTesting() {
+ element.onpause = null;
+ element.onseeked = null;
+ element.onplaying = null;
+ element.onended = null;
+ manager.finished(element.token);
+ }
+
+ function onended() {
+ if (isPlaying) {
+ switch(steps) {
+ case 1:
+ testTrackEventCalls(1);
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ break;
+ case 2:
+ testTrackEventCalls(2);
+ element.currentTime = element.duration * 0.5;
+ element.onplaying = onplaying;
+ element.play();
+ steps++;
+ break;
+ case 3:
+ testTrackEventCalls(3);
+ finishTesting();
+ break;
+ }
+ } else {
+ ok(true, 'Finish the test anyway if ended is fired before other events.');
+ finishTesting();
+ }
+ }
+
+ function seekToEnd() {
+ element.onpause = null;
+ element.currentTime = element.duration * 1.1;
+ }
+
+ function onseeked() {
+ element.onseeked = null;
+ element.onpause = seekToEnd;
+ element.pause();
+ }
+
+ function onplaying() {
+ isPlaying = true;
+ element.onplaying = null;
+ element.onseeked = onseeked;
+ }
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.onplaying = onplaying;
+ element.onended = onended;
+ element.play();
+ steps++;
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [
+ ["media.track.enabled", true]
+ ]
+ },
+ function() {
+ manager.runTests(gTrackTests, startTest);
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_metadata.html b/dom/media/test/test_metadata.html
new file mode 100644
index 000000000..29b2f30ff
--- /dev/null
+++ b/dom/media/test/test_metadata.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test returning metadata from media files with mozGetMetadata()</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<div id="output"></div>
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var a = document.createElement('audio');
+ a.preload = "metadata";
+ a.token = token;
+ manager.started(token);
+
+ a.src = test.name;
+ a.name = test.name;
+
+ // Tags should not be available immediately.
+ var exception_fired = false;
+ try {
+ var m = a.mozGetMetadata();
+ } catch (e) {
+ is(e.name, 'InvalidStateError',
+ "early mozGetMetadata() should throw InvalidStateError");
+ exception_fired = true;
+ }
+ ok(exception_fired,
+ "mozGetMetadata() should throw an exception before HAVE_METADATA");
+
+ // Wait until metadata has loaded.
+ a.addEventListener('loadedmetadata', function() {
+ // read decoded tags
+ tags = a.mozGetMetadata();
+ ok(tags, "mozGetMetadata() should return a truthy value");
+ // Dump them out.
+ var d = document.getElementById('output');
+ var html = '<table>\n';
+ html += '<caption><p>Called getMozMetadata()'
+ html += ' on '+test.name+'</p></caption>\n';
+ html += '<tr><th>tag</th>';
+ html += '<th>decoded value</th><th>expected value</th></tr>\n';
+ for (tag in tags) {
+ html += '<tr><td>'+tag+'</td>';
+ html += '<td>'+tags[tag]+'</td>';
+ html += '<td>'+test.tags[tag]+'</td>';
+ html += '</tr>\n';
+ }
+ if (!Object.keys(tags).length) {
+ html += '<tr><td colspan=3 align=center><em>no tags</em></td></tr>\n';
+ }
+ html += '</table>\n';
+ var div = document.createElement('div');
+ div.innerHTML = html;
+ d.appendChild(div);
+ // Verify decoded tag values.
+ for (tag in tags) {
+ is(tags[tag], test.tags[tag], "Tag '"+tag+"' should match");
+ }
+ // Verify expected tag values
+ for (tag in test.tags) {
+ is(tags[tag], test.tags[tag], "Tag '"+tag+"' should match");
+ }
+ removeNodeAndSource(a);
+ manager.finished(token);
+ }, false);
+}
+
+manager.runTests(gMetadataTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_mixed_principals.html b/dom/media/test/test_mixed_principals.html
new file mode 100644
index 000000000..d3f7ec257
--- /dev/null
+++ b/dom/media/test/test_mixed_principals.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=489415
+-->
+<head>
+ <title>Test for Bug 489415</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=489415">Mozilla Bug 489415</a>
+<p id="display"></p>
+
+<video id="v1" preload="metadata" onended="onendedcb('v1')"></video>
+<video id="v2" preload="metadata" onended="onendedcb('v2')"></video>
+
+<pre id="test">
+<script type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+
+var v1 = document.getElementById("v1");
+var v2 = document.getElementById("v2");
+var count = 0;
+
+function onendedcb(id) {
+ var c = document.createElement("canvas");
+ var ctx = c.getContext("2d");
+ var v = document.getElementById(id);
+ ctx.drawImage(v, 0, 0);
+ try {
+ c.toDataURL();
+ ok(false, "Failed to throw exception in toDataURL for " + id);
+ } catch (ex) {
+ ok(true, "Threw exception in toDataURL for " + id);
+ }
+ if (++count == 2) {
+ SimpleTest.finish();
+ }
+}
+
+function testMixedPrincipals(resource) {
+ // In some OS(XP) can not play mp4. Add this checking for the test failure.
+ if (!resource || !v1.canPlayType(resource.type)) {
+ todo(false, "No types supported");
+ SimpleTest.finish();
+ return;
+ }
+ // Make sure the media cache size(50MB) is large enough that the data could
+ // be download in MediaCache completely.
+ return pushPrefs(['media.cache_size', 50*1024])
+ .then(() => {
+
+ // Generate a random key. The first load with that key will return
+ // data, the second and subsequent loads with that key will return a redirect
+ // to a different origin ('localhost:8888' will be redirected to 'example.org',
+ // and 'example.org' will be redirected to 'localhost:8888'). We rely on the
+ // fact that Ogg will do a seek to the end of the resource, triggering a new
+ // load with the same key which will return a same-origin resource.
+ // Loading data from two different origins should be detected by the media
+ // cache and result in a null principal so that the canvas usage above fails.
+ var key = Math.floor(Math.random()*100000000);
+
+ // In v1, try loading from same-origin first and then getting redirected to
+ // another origin.
+ v1.src =
+ "http://mochi.test:8888/tests/dom/media/test/dynamic_redirect.sjs?key=v1_" +
+ key + "&res=" + resource.name;
+ v1.onloadeddata = function () {
+ // To limit readahead, avoid racing with playback and "catching up" mode.
+ v1.play();
+ }
+
+ // In v2, try loading cross-origin first and then getting redirected to
+ // our origin.
+ v2.src = "http://example.org/tests/dom/media/test/dynamic_redirect.sjs?key=v2_" + key + "&res=" + resource.name;
+ v2.onloadeddata = function () {
+ // To limit readahead, avoid racing with playback and "catching up" mode.
+ v2.play();
+ }
+ });
+}
+
+testMixedPrincipals({ name:"pixel_aspect_ratio.mp4", type:"video/mp4", duration:28});
+
+</script>
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_mozHasAudio.html b/dom/media/test/test_mozHasAudio.html
new file mode 100644
index 000000000..22da492bb
--- /dev/null
+++ b/dom/media/test/test_mozHasAudio.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback of media files that should play OK</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function onloadedmetadata(e) {
+ var t = e.target;
+ is(t.mozHasAudio, t.hasAudio, "The element reports the wrong audio property." + t.token);
+ manager.finished(t.token);
+}
+
+function startTest(test, token) {
+ var elemType = /^audio/.test(test.type) ? "audio" : "video";
+ var element = document.createElement(elemType);
+ element.preload = "auto";
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.name = test.name;
+ element.hasAudio = elemType == "video" ? test.hasAudio : undefined;
+ element.addEventListener("loadedmetadata", onloadedmetadata, false);
+
+ element.load();
+}
+
+manager.runTests(gTrackTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_multiple_mediastreamtracks.html b/dom/media/test/test_multiple_mediastreamtracks.html
new file mode 100644
index 000000000..afc172733
--- /dev/null
+++ b/dom/media/test/test_multiple_mediastreamtracks.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the ability of MediaStream with multiple MediaStreamTracks</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+function startTest() {
+ navigator.mediaDevices.getUserMedia({audio:true, video:true, fake:true})
+ .then(function(orgStream) {
+ var a = orgStream.getAudioTracks()[0];
+ var v = orgStream.getVideoTracks()[0];
+ var stream = new MediaStream([a, a, a, a, v, v, v].map(track => track.clone()));
+ var element = document.createElement("video");
+
+ element.onloadedmetadata = function() {
+ is(stream.getAudioTracks().length, 4, 'Length of audio tracks should be 4.');
+ is(stream.getVideoTracks().length, 3, 'Length of vudio tracks should be 3.');
+ SimpleTest.finish();
+ };
+
+ element.srcObject = stream;
+ element.play();
+ })
+ .catch(function(reason) {
+ ok(false, "unexpected error = " + reason.message);
+ SimpleTest.finish();
+ });
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [
+ ["media.track.enabled", true]
+ ]
+ }, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_networkState.html b/dom/media/test/test_networkState.html
new file mode 100644
index 000000000..1e645a1d3
--- /dev/null
+++ b/dom/media/test/test_networkState.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: networkState</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onunload="mediaTestCleanup();">
+<video id='v1'></video><audio id='a1'></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+"use strict";
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var passed = "truthy";
+
+try {
+ v1.networkState = 0;
+} catch (e) {
+ passed = !passed;
+}
+try {
+ a1.networkState = 0;
+} catch (e) {
+ passed = !passed;
+}
+ok(passed === true,
+ "Setting networkState throws in strict mode (readonly attribute)");
+</script>
+
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var passed = false;
+
+var oldv1ns = v1.networkState, olda1ns = a1.networkState;
+try {
+ v1.networkState = 0;
+ a1.networkState = 0;
+ passed = v1.networkState === oldv1ns && a1.networkState === olda1ns;
+} catch (e) { }
+ok(passed, "Should not be able to modify networkState (readonly attribute)");
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_new_audio.html b/dom/media/test/test_new_audio.html
new file mode 100644
index 000000000..61c284f8d
--- /dev/null
+++ b/dom/media/test/test_new_audio.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=528566
+-->
+<head>
+ <title>Test for Bug 528566</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=528566">Mozilla Bug 528566</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 528566 **/
+
+var manager = new MediaTestManager;
+
+var player = new Audio();
+
+function startTest(test, token) {
+ if (!player.canPlayType(test.type)) {
+ return;
+ }
+ manager.started(token);
+ var a = new Audio(test.name);
+ a.autoplay = true;
+ document.body.appendChild(a);
+ a.addEventListener("ended",
+ function(e){
+ ok(true, "[" + a.src + "]We should get to the end. Oh look we did.");
+ a.remove();
+ manager.finished(token);
+ },
+ false);
+}
+
+manager.runTests(gAudioTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_no_load_event.html b/dom/media/test/test_no_load_event.html
new file mode 100644
index 000000000..1e6e82524
--- /dev/null
+++ b/dom/media/test/test_no_load_event.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=715469
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 715469</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="start();">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=715469">Mozilla Bug 715469</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+
+<script type="application/javascript">
+
+/** Test for Bug 715469 **/
+
+var gotLoadEvent = false;
+
+function start() {
+ var resource = getPlayableVideo(gSmallTests);
+ if (resource == null) {
+ todo(false, "No types supported");
+ } else {
+ SimpleTest.waitForExplicitFinish();
+ var v = document.createElement("video");
+ v.src = resource.name;
+
+ v.addEventListener("load", function() {
+ gotLoadEvent = true;
+ }, false);
+
+ v.addEventListener("ended", finished, false);
+ document.body.appendChild(v);
+ v.play();
+ }
+}
+
+function finished() {
+ is(gotLoadEvent, false, "Should not receive a load on the video element");
+ SimpleTest.finish();
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_paused.html b/dom/media/test/test_paused.html
new file mode 100644
index 000000000..332622c3d
--- /dev/null
+++ b/dom/media/test/test_paused.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: paused</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<video id='v1'></video><audio id='a1'></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+ok(v1.paused, "v1.paused must initially be true");
+ok(a1.paused, "a1.paused must initially be true");
+mediaTestCleanup();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_paused_after_ended.html b/dom/media/test/test_paused_after_ended.html
new file mode 100644
index 000000000..22e2a3a54
--- /dev/null
+++ b/dom/media/test/test_paused_after_ended.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: paused</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function ended(evt) {
+ var v = evt.target;
+ v.removeEventListener("ended", ended);
+ is(v.gotPause, true, "We should have received a \"pause\" event.")
+ is(v.paused, true, v._name + " must be paused after end");
+ manager.finished(v.token);
+ removeNodeAndSource(v);
+}
+
+function pause(evt) {
+ var v = evt.target;
+ v.removeEventListener("pause", pause);
+ v.gotPause = true;
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ document.body.appendChild(v);
+ v.token = token;
+ manager.started(v.token);
+ v.src = test.name;
+ v._name = test.name;
+ v._finished = false;
+ v.load();
+ is(v.paused, true, v._name + " must be paused at start");
+
+ v.play();
+ is(v.paused, false, v._name + " must not be paused after play");
+
+ v.addEventListener("pause", pause, false);
+ v.addEventListener("ended", ended, false);
+}
+
+manager.runTests(gPausedAfterEndedTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_play_events.html b/dom/media/test/test_play_events.html
new file mode 100644
index 000000000..69bd2edce
--- /dev/null
+++ b/dom/media/test/test_play_events.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: play() method</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+
+<script>
+
+var manager = new MediaTestManager;
+
+var tokens = {
+ 0: ["play"],
+ "play": ["canplay"],
+ "canplay": ["playing"],
+ "playing": ["canplay", "canplaythrough"],
+ "canplaythrough": ["canplay", "canplaythrough"]
+};
+
+function gotPlayEvent(event) {
+ var v = event.target;
+ ok(tokens[v._state].indexOf(event.type) >= 0,
+ "Check expected event got " + event.type + " at " + v._state + " for " + v.src +
+ " uneval(event.type)=" + uneval(event.type) + " typeof(event.type)=" + typeof(event.type) +
+ " uneval(v._state)=" + uneval(v._state) + " typeof(v._state)=" + typeof(v._state) +
+ " tokens["+v._state+"]=" + tokens[v._state] +
+ " tokens["+v._state+"].indexOf(event.type)=" + tokens[v._state].indexOf(event.type));
+ v._state = event.type;
+}
+
+function ended(event) {
+ var v = event.target;
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function initTest(test, token) {
+ var v = document.createElement('video');
+ v.token = token;
+ manager.started(token);
+ v._state = 0;
+
+ ["play", "canplay", "playing", "canplaythrough"].forEach(function (e) {
+ v.addEventListener(e, gotPlayEvent, false);
+ });
+
+ v.addEventListener("ended", ended, false);
+
+ v.src = test.name;
+ document.body.appendChild(v); // Causes load.
+ v.play();
+}
+
+manager.runTests(gSmallTests, initTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_play_events_2.html b/dom/media/test/test_play_events_2.html
new file mode 100644
index 000000000..6689851df
--- /dev/null
+++ b/dom/media/test/test_play_events_2.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: play() method via DOM 0 handlers</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+
+<script>
+var manager = new MediaTestManager;
+
+var tokens = {
+ 0: ["play"],
+ "play": ["canplay"],
+ "canplay": ["playing"],
+ "playing": ["canplay", "canplaythrough"],
+ "canplaythrough": ["canplay", "canplaythrough"]
+};
+
+function gotPlayEvent(event) {
+ var v = event.target;
+ ok(tokens[v._state].indexOf(event.type) >= 0,
+ "Check expected event got " + event.type + " at " + v._state + " for " + v.src);
+ v._state = event.type;
+}
+
+function ended(event) {
+ var v = event.target;
+ v._finished = true;
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.token = token;
+ manager.started(token);
+ v._state = 0;
+ v._finished = false;
+
+ ["play", "canplay", "playing", "canplaythrough"].forEach(function (e) {
+ v["on" + e] = gotPlayEvent;
+ });
+
+ v.onended = ended;
+
+ v.src = test.name;
+ document.body.appendChild(v); // Causes load.
+ v.play();
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_play_twice.html b/dom/media/test/test_play_twice.html
new file mode 100644
index 000000000..a1dd07e67
--- /dev/null
+++ b/dom/media/test/test_play_twice.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback of media files that should play OK</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v.name = test.name;
+ v.playingCount = 0;
+ v._playedOnce = false;
+
+ var check = function(test, v) { return function() {
+ checkMetadata(test.name, v, test);
+ }}(test, v);
+
+ var noLoad = function(test, v) { return function() {
+ ok(false, test.name + " should not fire 'load' event");
+ }}(test, v);
+
+ function finish(v) {
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ }
+
+ function mayFinish(v) {
+ if (v.seenEnded && v.seenSuspend) {
+ finish(v);
+ }
+ }
+
+ var checkEnded = function(test, v) { return function() {
+ if (test.duration) {
+ ok(Math.abs(v.currentTime - test.duration) < 0.1,
+ test.name + " current time at end: " + v.currentTime);
+ }
+
+ is(v.readyState, v.HAVE_CURRENT_DATA, test.name + " checking readyState");
+ ok(v.ended, test.name + " checking playback has ended");
+ ok(v.playingCount > 0, "Expect at least one playing event");
+ v.playingCount = 0;
+
+ if (v._playedOnce) {
+ v.seenEnded = true;
+ mayFinish(v);
+ } else {
+ v._playedOnce = true;
+ v.play();
+ }
+ }}(test, v);
+
+ var checkSuspended = function(test, v) { return function() {
+ if (v.seenSuspend) {
+ return;
+ }
+
+ v.seenSuspend = true;
+ ok(true, test.name + " got suspend");
+ mayFinish(v);
+ }}(test, v);
+
+ var checkPlaying = function(test, v) { return function() {
+ is(test.name, v.name, "Should be testing file we think we're testing...");
+ v.playingCount++;
+ }}(test, v);
+
+ v.addEventListener("load", noLoad, false);
+ v.addEventListener("loadedmetadata", check, false);
+ v.addEventListener("playing", checkPlaying, false);
+
+ // We should get "ended" and "suspend" events for every resource
+ v.addEventListener("ended", checkEnded, false);
+ v.addEventListener("suspend", checkSuspended, false);
+
+ document.body.appendChild(v);
+ v.play();
+}
+
+manager.runTests(gReplayTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_playback.html b/dom/media/test/test_playback.html
new file mode 100644
index 000000000..2df6df85f
--- /dev/null
+++ b/dom/media/test/test_playback.html
@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback of media files that should play OK</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(3);
+ SimpleTest.requestCompleteLog();
+}
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ v.prevTime = 0;
+ v.seenEnded = false;
+ v.seenSuspend = false;
+
+ var handler = {
+ "ontimeout": function() {
+ Log(token, "timed out: ended=" + v.seenEnded + ", suspend=" + v.seenSuspend);
+ }
+ };
+ manager.started(token, handler);
+
+ v.src = test.name;
+ v.name = test.name;
+
+ var check = function(test, v) { return function() {
+ is(test.name, v.name, test.name + ": Name should match #1");
+ checkMetadata(test.name, v, test);
+ }}(test, v);
+
+ var noLoad = function(test, v) { return function() {
+ ok(false, test.name + " should not fire 'load' event");
+ }}(test, v);
+
+ var finish = function() {
+ v.finished = true;
+ v.removeEventListener("timeupdate", timeUpdate, false);
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ }
+
+ // We should get "ended" and "suspend" events to finish the test.
+ var mayFinish = function() {
+ if (v.seenEnded && v.seenSuspend) {
+ finish();
+ }
+ }
+
+ var checkEnded = function(test, v) { return function() {
+ is(test.name, v.name, test.name + ": Name should match #2");
+ checkMetadata(test.name, v, test);
+ is(v.readyState, v.HAVE_CURRENT_DATA, test.name + " checking readyState");
+ ok(v.ended, test.name + " checking playback has ended");
+ ok(!v.finished, test.name + " shouldn't be finished");
+ ok(!v.seenEnded, test.name + " shouldn't be ended");
+
+ v.seenEnded = true;
+ mayFinish();
+ }}(test, v);
+
+ var checkSuspended = function(test, v) { return function() {
+ if (v.seenSuspend) {
+ return;
+ }
+ is(test.name, v.name, test.name + ": Name should match #3");
+
+ v.seenSuspend = true;
+ mayFinish();
+ }}(test, v);
+
+ var timeUpdate = function(test, v) { return function() {
+ if (v.prevTime > v.currentTime) {
+ ok(false, test.name + " time should run forwards: p=" +
+ v.prevTime + " c=" + v.currentTime);
+ }
+ v.prevTime = v.currentTime;
+ }}(test, v);
+
+ v.addEventListener("load", noLoad, false);
+ v.addEventListener("loadedmetadata", check, false);
+ v.addEventListener("timeupdate", timeUpdate, false);
+
+ // We should get "ended" and "suspend" events for every resource
+ v.addEventListener("ended", checkEnded, false);
+ v.addEventListener("suspend", checkSuspended, false);
+
+ document.body.appendChild(v);
+ v.play();
+
+ // Debug timeouts on slow platforms.
+ if (isSlowPlatform()) {
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ var v = e.target;
+ Log(e.target.token, "got " + e.type);
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ });
+ }
+}
+
+manager.runTests(gPlayTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_playback_errors.html b/dom/media/test/test_playback_errors.html
new file mode 100644
index 000000000..02915fb25
--- /dev/null
+++ b/dom/media/test/test_playback_errors.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback of media files that should have errors</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ manager.started(token);
+ v._errorCount = 0;
+ v._ignore = false;
+ function endedTest(v) {
+ if (v._ignore)
+ return;
+ v._ignore = true;
+ v.parentNode.removeChild(v);
+ manager.finished(token);
+ }
+ var checkError = function(test, v) { return function(evt) {
+ v._errorCount++;
+ is(v._errorCount, 1, test.name + " only one error fired");
+ endedTest(v);
+ }}(test, v);
+ var checkEnded = function(test, v) { return function() {
+ ok(false, test.name + " successfully played");
+ endedTest(v);
+ }}(test, v);
+ v.addEventListener("error", checkError, false);
+ v.addEventListener("ended", checkEnded, false);
+ v.src = test.name;
+ document.body.appendChild(v);
+ v.play();
+}
+
+manager.runTests(gErrorTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_playback_rate.html b/dom/media/test/test_playback_rate.html
new file mode 100644
index 000000000..a81e7b800
--- /dev/null
+++ b/dom/media/test/test_playback_rate.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for the playbackRate property </title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type='application/javascript;version=1.8'>
+
+let manager = new MediaTestManager;
+
+function rangeCheck(lhs, rhs, threshold) {
+ var diff = Math.abs(lhs - rhs);
+ if (diff < threshold) {
+ return true;
+ }
+ return false;
+}
+
+function checkPlaybackRate(wallclock, media, expected, threshold) {
+ if (rangeCheck(media / wallclock, expected, threshold)) {
+ return true;
+ }
+ return false;
+}
+
+// Those value are expected to match those at the top of HTMLMediaElement.cpp.
+let VERY_SLOW_RATE = 0.1,
+ SLOW_RATE = 0.25,
+ FAST_RATE = 5,
+ VERY_FAST_RATE = 20,
+ NULL_RATE = 0.0;
+
+function ontimeupdate(e) {
+ var t = e.target;
+ // Skip short files for SoundTouch doesn't work well on small number of samples.
+ if (t.gotEnded || t.duration < 2) {
+ return;
+ }
+ t.testedForSlowdown = true;
+ if (t.currentTime > t.duration / 2) {
+ t.oldCurrentTime = t.currentTime;
+ t.timestamp = Date.now();
+ var delta = t.oldCurrentTime,
+ delta_wallclock = (t.timestamp - t.startTimestamp - t.bufferingTime) / 1000;
+
+ t.mozPreservesPitch = false;
+ is(t.mozPreservesPitch, false, t.name + ": If we disable the pitch preservation, it should appear as such.");
+
+ t.bufferingTime = 0;
+
+ is(t.playbackRate, SLOW_RATE, t.name + ": The playback rate shoud be "+SLOW_RATE+".");
+ ok(checkPlaybackRate(delta_wallclock, delta, SLOW_RATE, 0.25), t.name + ": We are effectively slowing down playback. (" + delta_wallclock + ", " + delta + ")");
+ t.removeEventListener("timeupdate", ontimeupdate);
+ t.addEventListener("pause", onpaused);
+ t.playbackRate = NULL_RATE;
+ t.oldCurrentTime = t.currentTime;
+ setTimeout(function() {
+ afterNullPlaybackRate(e);
+ }, 100);
+ }
+}
+
+function onpaused(e) {
+ var t = e.target;
+ t.pausedReceived = true;
+}
+
+function afterNullPlaybackRate(e) {
+ var t = e.target;
+
+ // skip if we have received 'ended' event or 'ended' event is pending.
+ if (t.gotEnded || t.ended) {
+ return;
+ }
+
+ t.testedForNull = true;
+
+ ok(t.currentTime == t.oldCurrentTime, t.name + ": Current time should not change when playbackRate is null (" + t.currentTime + " " + t.oldCurrentTime + ").");
+ ok(!t.paused, t.name + ": The element should not be in paused state.");
+ t.removeEventListener("paused", onpaused);
+ is(t.pausedReceived, undefined, t.name + ": Paused event should not have been received.");
+ t.timestamp = Date.now();
+ t.oldCurrentTime = t.currentTime;
+ t.playbackRate = VERY_FAST_RATE;
+ is(t.playbackRate, FAST_RATE, t.name + ": Playback rate should be clamped to " + FAST_RATE + ".");
+}
+
+function onended(e) {
+ var t = e.target;
+ t.gotEnded = true;
+
+ t.bufferingTime = 0;
+ // If we got "ended" too early, skip these tests.
+ if (t.testedForSlowdown && t.testedForNull) {
+ is(t.playbackRate, FAST_RATE, t.name + ": The playback rate should still be "+FAST_RATE+".");
+ ok(!t.muted, t.name + ": The audio should be muted when playing at high speed, but should not appear as such.");
+ is(t.currentTime, t.duration, t.name + ": Current time should be equal to the duration (not change by playback rate).");
+ }
+ finish_test(t);
+}
+
+function onratechange(e) {
+ if (!e.target.ratechangecount) {
+ e.target.ratechangecount = 0;
+ }
+ e.target.ratechangecount++;
+}
+
+function finish_test(element) {
+ removeNodeAndSource(element);
+ manager.finished(element.token);
+}
+
+// These two functions handle the case when the playback pauses for buffering. It
+// adjusts the timestamps to be accurate. Despite the fact that the web servers
+// is supposed to be on the same machine, buffering pauses can occur (rarely,
+// but still).
+function onplaying(e) {
+ var t = e.target;
+ if (t.bufferingTimestamp != undefined) {
+ t.bufferingTime += (Date.now() - t.bufferingTimestamp);
+ t.bufferingTimestamp = undefined;
+ }
+}
+
+function onwaiting(e) {
+ var t = e.target;
+ t.bufferingTimestamp = Date.now();
+}
+
+function onvolumechange(e) {
+ ok(false, e.target.name + ": We should not receive a volumechange event when changing the playback rate.");
+}
+
+function startTest(test, token) {
+ let elemType = /^audio/.test(test.type) ? "audio" : "video";
+ let element = document.createElement(elemType);
+ element.src = test.name;
+ element.name = test.name;
+ element.preload = "metadata";
+ element.token = token;
+ element.controls = true;
+ element.bufferingTime = 0;
+ document.body.appendChild(element);
+ element.addEventListener("ratechange", onratechange);
+ element.addEventListener("timeupdate", ontimeupdate);
+ element.addEventListener("ended", onended);
+ element.addEventListener("waiting", onwaiting);
+ element.addEventListener("playing", onplaying);
+ element.addEventListener("volumechange", onvolumechange);
+ manager.started(token);
+ element.startTimestamp = Date.now();
+ is(element.mozPreservesPitch, true, test.name + ": Pitch preservation should be enabled by default.");
+ element.addEventListener("loadedmetadata", function() {
+ is(element.playbackRate, 1.0, test.name + ": playbackRate should be initially 1.0");
+ is(element.defaultPlaybackRate, 1.0, test.name + ": defaultPlaybackRate should be initially 1.0");
+ element.playbackRate = VERY_SLOW_RATE;
+ is(element.playbackRate, SLOW_RATE, test.name + ": PlaybackRate should be clamped to " + SLOW_RATE + ".");
+ element.play();
+ element.playbackRate = SLOW_RATE;
+ });
+}
+
+manager.runTests(gPlayedTests, startTest);
+
+</script>
+</pre>
+<div id="elements">
+</div>
+</body>
+</html>
diff --git a/dom/media/test/test_playback_rate_playpause.html b/dom/media/test/test_playback_rate_playpause.html
new file mode 100644
index 000000000..dcf852a8f
--- /dev/null
+++ b/dom/media/test/test_playback_rate_playpause.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that the playbackRate property is not reset when resuming the playback</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type='application/javascript;version=1.8'>
+
+let manager = new MediaTestManager;
+
+function ontimeupdate(e) {
+ var t = e.target;
+ if (t.currentTime != 0.0) {
+ dump(t.token + " t.currentTime != 0.0.\n");
+ t.removeEventListener("timeupdate", ontimeupdate);
+ t.pause();
+ is(t.playbackRate, 0.5, "PlaybackRate should not have changed after pause.");
+ } else {
+ dump(t.token + " t.currentTime == 0.0.\n");
+ }
+}
+
+function onpaused(e) {
+ var t = e.target;
+ dump(t.token + " onpaused.\n");
+ t.play();
+ is(t.playbackRate, 0.5, "PlaybackRate should not have changed after resuming playback.");
+ finish_test(t);
+}
+
+function finish_test(element) {
+ dump(element.token + " finish_test.\n");
+ removeNodeAndSource(element);
+ manager.finished(element.token);
+}
+
+function startTest(test, token) {
+ let elemType = /^audio/.test(test.type) ? "audio" : "video";
+ let element = document.createElement(elemType);
+ element.src = test.name;
+ element.token = token;
+ element.controls = true;
+ element.playbackRate = 0.5;
+ element.preload = "metadata";
+ element.addEventListener("timeupdate", ontimeupdate);
+ element.addEventListener("pause", onpaused);
+ element.addEventListener("loadedmetadata", function() {
+ dump(element.token + " loadedmetadata\n");
+ element.play();
+ });
+ document.body.appendChild(element);
+ manager.started(token);
+}
+
+manager.runTests(gPlayedTests, startTest);
+
+</script>
+</pre>
+<div id="elements">
+</div>
+</body>
+</html>
diff --git a/dom/media/test/test_playback_reactivate.html b/dom/media/test/test_playback_reactivate.html
new file mode 100644
index 000000000..8b768c8e7
--- /dev/null
+++ b/dom/media/test/test_playback_reactivate.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback with dormant of media files that should play OK</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/* This testcase wants to test a video element's playback is not break
+ by dormant.
+ When the metadata is loaded, we remove the video element to trigger dormant.
+ Then set a timer to append the video element back and play it.
+ Test pass if the video plays to the end.
+*/
+
+// longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(1.5);
+ SimpleTest.requestCompleteLog();
+}
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+
+ var handler = {
+ "ontimeout": function() {
+ Log(token, "timed out: ended=" + v.seenEnded + ", suspend=" + v.seenSuspend);
+ }
+ };
+ manager.started(token, handler);
+
+ v.src = test.name;
+ v.name = test.name;
+
+ var check = function(test, v) { return function() {
+ is(test.name, v.name, test.name + ": Name should match #1");
+ Log(v.token, "removeChild: " + v.name);
+ document.body.removeChild(v);
+ var appendAndPlayElement = function() {
+ Log(v.token, "appendChild: " + v.name);
+ document.body.appendChild(v);
+ Log(v.token, "Element play: " + v.name);
+ v.play();
+ }
+ setTimeout(appendAndPlayElement, 2000);
+ }}(test, v);
+
+ var finish = function() {
+ v.finished = true;
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ }
+
+ var checkEnded = function(test, v) { return function() {
+ is(test.name, v.name, test.name + ": Name should match #2");
+ checkMetadata(test.name, v, test);
+ is(v.readyState, v.HAVE_CURRENT_DATA, test.name + " checking readyState");
+ ok(v.ended, test.name + " checking playback has ended");
+
+ finish();
+ }}(test, v);
+
+
+ v.addEventListener("loadedmetadata", check, false);
+ v.addEventListener("ended", checkEnded, false);
+
+ document.body.appendChild(v);
+
+ // Debug timeouts on slow platforms.
+ if (isSlowPlatform()) {
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ var v = e.target;
+ Log(e.target.token, "got " + e.type);
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ });
+ }
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_played.html b/dom/media/test/test_played.html
new file mode 100644
index 000000000..52d3ab45f
--- /dev/null
+++ b/dom/media/test/test_played.html
@@ -0,0 +1,250 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>Test played member for media elements</title>
+<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+<script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id='test'>
+<script class="testbody" type='application/javascript;version=1.8'>
+//longer timeout for sometimes B2G emulator runs very slowly
+if (SpecialPowers.Services.appinfo.name == "B2G") {
+ SimpleTest.requestLongerTimeout(3);
+}
+
+SimpleTest.requestCompleteLog();
+let manager = new MediaTestManager;
+
+function finish_test(element) {
+ removeNodeAndSource(element);
+ manager.finished(element.token);
+}
+
+// Check that a file has been played in its entirety.
+function check_full_file_played(element) {
+ element.addEventListener('ended', (function(e) {
+ let interval_count = e.target.played.length;
+ is(interval_count, 1, element.token + ": played.length must be 1");
+ is(element.played.start(0), 0, element.token + ": start time shall be 0");
+ is(element.played.end(0), e.target.duration, element.token + ": end time shall be duration");
+ finish_test(e.target);
+ }), false);
+}
+
+var tests = [
+// Without playing, check that player.played.length == 0.
+{
+ setup : function(element) {
+ element.addEventListener("loadedmetadata", function() {
+ is(element.played.length, 0, element.token + ": initial played.length equals zero");
+ finish_test(element);
+ });
+ },
+ name: "test1"
+},
+// Play the file, test the range we have.
+{
+ setup : function(element) {
+ check_full_file_played(element);
+ element.play();
+ },
+ name: "test2"
+},
+
+// Play the second half of the file, pause, play
+// an check we have only one range.
+{
+ setup : function (element) {
+ element.onended = function (e) {
+ var t = e.target;
+ t.onended = null;
+ check_full_file_played(t);
+ t.pause();
+ t.currentTime = 0;
+ t.play();
+ };
+ element.addEventListener("loadedmetadata", function() {
+ element.currentTime = element.duration / 2;
+ element.play();
+ }, false);
+ },
+ name: "test3"
+},
+
+// Play the first half of the file, seek back, while
+// continuing to play. We shall have only one range.
+{
+ setup : function (element) {
+ let onTimeUpdate = function() {
+ if (element.currentTime > element.duration / 2) {
+ info(element.token + ": currentTime=" + element.currentTime + ", duration=" + element.duration);
+ element.removeEventListener("timeupdate", onTimeUpdate, false);
+ element.pause();
+ var oldEndRange = element.played.end(0);
+ element.currentTime = element.duration / 4;
+ is(element.played.end(0), oldEndRange,
+ element.token + ": When seeking back, |played| should not be changed");
+ element.play();
+ }
+ }
+ element.addEventListener("timeupdate", onTimeUpdate, false);
+ check_full_file_played(element);
+ element.play();
+ },
+ name: "test4"
+},
+
+// Play and seek to have two ranges, and check that, as well a
+// boundaries.
+{
+ setup : function (element) {
+ let seekTarget = 0;
+ let onTimeUpdate = function() {
+ if (element.currentTime > element.duration / 2) {
+ info(element.token + ": currentTime=" + element.currentTime + ", duration=" + element.duration);
+ element.removeEventListener("timeupdate", onTimeUpdate, false);
+ element.pause();
+ // Remember seek target for later comparison since duration may change
+ // during playback.
+ seekTarget = element.currentTime = element.duration / 10;
+ element.currentTime = seekTarget;
+ element.play();
+ }
+ }
+
+ element.addEventListener("loadedmetadata", function() {
+ element.addEventListener("timeupdate", onTimeUpdate, false);
+ }, false);
+
+
+ element.addEventListener("ended", (function() {
+ if(element.played.length > 1) {
+ is(element.played.length, 2, element.token + ": element.played.length == 2");
+ is(element.played.start(1), seekTarget, element.token + ": we should have seeked forward by one tenth of the duration");
+ is(element.played.end(1), element.duration, element.token + ": end of second range shall be the total duration");
+ }
+ is(element.played.start(0), 0, element.token + ": start of first range shall be 0");
+ finish_test(element);
+ }), false);
+
+ element.play();
+ },
+ name: "test5"
+},
+
+// Play to create two ranges, in the reverse order. check that they are sorted.
+{
+ setup : function (element) {
+ function end() {
+ element.pause();
+ let p = element.played;
+ ok(p.length >= 1, element.token + ": There should be at least one range=" + p.length);
+ is(p.start(0), seekTarget, element.token + ": Start of first range should be the sixth of the duration");
+ ok(p.end(p.length - 1) > 5 * element.duration / 6, element.token + ": End of last range should be greater that five times the sixth of the duration");
+ finish_test(element);
+ }
+
+ let seekTarget = 0;
+ function pauseseekrestart() {
+ element.pause();
+ // Remember seek target for later comparison since duration may change
+ // during playback.
+ seekTarget = element.duration / 6;
+ element.currentTime = seekTarget;
+ element.play();
+ }
+
+ function onTimeUpdate_pauseseekrestart() {
+ if (element.currentTime > 5 * element.duration / 6) {
+ element.removeEventListener("timeupdate", onTimeUpdate_pauseseekrestart, false);
+ pauseseekrestart();
+ element.addEventListener("timeupdate", onTimeUpdate_end, false);
+ }
+ }
+
+ function onTimeUpdate_end() {
+ if (element.currentTime > 3 * element.duration / 6) {
+ element.removeEventListener("timeupdate", onTimeUpdate_end, false);
+ end();
+ }
+ }
+
+ element.addEventListener("timeupdate", onTimeUpdate_pauseseekrestart, false);
+
+ element.addEventListener('loadedmetadata', function() {
+ element.currentTime = 4 * element.duration / 6;
+ element.play();
+ }, false);
+ },
+ name: "test6"
+},
+// Seek repeatedly without playing. No range should appear.
+{
+ setup : function(element) {
+ let index = 1;
+
+ element.addEventListener('seeked', function() {
+ index++;
+ element.currentTime = index * element.duration / 5;
+ is(element.played.length, 0, element.token + ": played.length should be 0");
+ if (index == 5) {
+ finish_test(element);
+ }
+ }, false);
+
+ element.addEventListener('loadedmetadata', function() {
+ element.currentTime = element.duration / 5;
+ }, false);
+ },
+ name: "test7"
+}
+];
+
+function createTestArray() {
+ var A = [];
+ for (var i=0; i<tests.length; i++) {
+ for (var k=0; k<gPlayedTests.length; k++) {
+ var t = new Object();
+ t.setup = tests[i].setup;
+ t.name = tests[i].name + "-" + gPlayedTests[k].name;
+ t.type = gPlayedTests[k].type;
+ t.src = gPlayedTests[k].name;
+ A.push(t);
+ }
+ }
+ return A;
+}
+
+function startTest(test, token) {
+ var elemType = getMajorMimeType(test.type);
+ var element = document.createElement(elemType);
+ element.src = test.src;
+ element.token = token;
+ element.preload = "metadata";
+ test.setup(element);
+ manager.started(token);
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ var v = e.target;
+ info(v.token + ": got " + e.type);
+ }
+ events.forEach(function(e) {
+ element.addEventListener(e, logEvent, false);
+ });
+
+}
+
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_preload_actions.html b/dom/media/test/test_preload_actions.html
new file mode 100644
index 000000000..1dbe1b0a1
--- /dev/null
+++ b/dom/media/test/test_preload_actions.html
@@ -0,0 +1,618 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=548523
+-->
+<head>
+ <title>Test for Bug 548523</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=548523">Mozilla Bug 548523</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<!-- <button onClick="SimpleTest.finish();">Finish</button> -->
+<div>Tests complete: <span id="log" style="font-size: small;"></span></div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 548523 **/
+
+SimpleTest.requestCompleteLog();
+var manager = new MediaTestManager;
+
+manager.onFinished = function() {
+ is(gotLoadEvent, true, "Should not have delayed the load event indefinitely");
+};
+
+var test = getPlayableVideo(gSeekTests);
+var baseName = test.name;
+var gTest = test;
+var bogusSrc = "bogus.duh";
+var bogusType = "video/bogus";
+var gotLoadEvent = false;
+var finished = false;
+
+addLoadEvent(function() {gotLoadEvent=true;});
+
+function log(m) {
+ var l = document.getElementById("log");
+ l.innerHTML += m;
+}
+
+function maybeFinish(v, n) {
+ if (v._finished) {
+ return;
+ }
+ v._finished = true;
+ log(n + ",");
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+// Every test must have a setup(v) function, and must call maybeFinish() when test is complete.
+var tests = [
+ {
+ // 1. Add preload:none video with src to document. Load should halt at NETWORK_IDLE and HAVE_NOTHING,
+ // after receiving a suspend event. Should not receive loaded events until after we call load().
+ // Note the suspend event is explictly sent by our "stop the load" code, but other tests can't rely
+ // on it for the preload:metadata case, as there can be multiple suspend events when loading metadata.
+ suspend:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(1) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(1) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(1) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(1) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 1);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("suspend", this.suspend, false);
+ v.src = test.name;
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to preload:none.
+ },
+
+ name: "test1",
+ },
+ {
+ // 2. Add preload:metadata video with src to document. Should halt with NETWORK_IDLE, HAVE_CURRENT_DATA
+ // after suspend event and after loadedmetadata.
+ loadeddata:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(2) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(2) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(2) ReadyState must be >= HAVE_CURRENT_DATA");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(2) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 2);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "metadata";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadeddata", this.loadeddata, false);
+ v.src = test.name;
+ document.body.appendChild(v); // Causes implicit load, which will be halted after
+ // metadata due to preload:metadata.
+ },
+
+ name: "test2",
+ },
+ {
+ // 3. Add preload:auto to document. Should receive canplaythrough eventually.
+ canplaythrough:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(3) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(3) Must get loadedmetadata.");
+ maybeFinish(v, 3);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "auto";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("canplaythrough", this.canplaythrough, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test3",
+ },
+ {
+ // 4. Add preload:none video to document. Call play(), should load then play through.
+ suspend:
+ function(e) {
+ var v = e.target;
+ if (v._gotSuspend) {
+ return; // We can receive multiple suspend events, like the one after download completes.
+ }
+ v._gotSuspend = true;
+ is(v._gotLoadStart, true, "(4) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(4) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(4) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(4) NetworkState must be NETWORK_IDLE");
+ v.play(); // Should load and play through.
+ },
+
+ ended:
+ function(e) {
+ ok(true, "(4) Got playback ended");
+ maybeFinish(e.target, 4);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v._gotSuspend = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("suspend", this.suspend, false);
+ v.addEventListener("ended", this.ended, false);
+ v.src = test.name;
+ document.body.appendChild(v);
+ },
+
+ name: "test4",
+ },
+ {
+ // 5. preload:none video without resource, add to document, will implicitly start a
+ // preload:none load. Add a src, it shouldn't load.
+ suspend:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(5) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(5) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(5) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(5) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 5);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("suspend", this.suspend, false);
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to no resource.
+ v.src = test.name; // Load should start, and halt at preload:none.
+ },
+
+ name: "test5",
+ },
+ {
+ // 6. preload:none video without resource, add to document, will implicitly start a
+ // preload:none load. Add a source, it shouldn't load.
+ suspend:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(6) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(6) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(6) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(6) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 6);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("suspend", this.suspend, false);
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to no resource.
+ var s = document.createElement("source");
+ s.src = test.name;
+ s.type = test.type;
+ v.appendChild(s); // Load should start, and halt at preload:none.
+ },
+
+ name: "test6",
+ },
+ {
+ // 7. create a preload:none document with multiple sources, the first of which is invalid.
+ // Add to document, then play. It should load and play through the second source.
+ suspend:
+ function(e) {
+ var v = e.target;
+ if (v._gotSuspend)
+ return; // We can receive multiple suspend events, like the one after download completes.
+ v._gotSuspend = true;
+ is(v._gotLoadStart, true, "(7) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(7) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(7) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(7) NetworkState must be NETWORK_IDLE");
+ v.play(); // Should load and play through.
+ },
+
+ ended:
+ function(e) {
+ ok(true, "(7) Got playback ended");
+ var v = e.target;
+ is(v._gotErrorEvent, true, "(7) Should get error event from first source load failure");
+ maybeFinish(v, 7);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v._gotErrorEvent = false;
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("suspend", this.suspend, false);
+ v.addEventListener("ended", this.ended, false);
+ var s1 = document.createElement("source");
+ s1.src = "not-a-real-file.404"
+ s1.type = test.type;
+ s1.addEventListener("error", function(e){v._gotErrorEvent = true;}, false);
+ v.appendChild(s1);
+ var s2 = document.createElement("source");
+ s2.src = test.name;
+ s2.type = test.type;
+ v.appendChild(s2);
+ document.body.appendChild(v); // Causes implicit load, which will be halt at preload:none on the second resource.
+ },
+
+ name: "test7",
+ },
+ {
+ // 8. Change preload value from none to metadata should cause metadata to be loaded.
+ loadeddata:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadedMetaData, true, "(8) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(8) ReadyState must be >= HAVE_CURRENT_DATA on suspend.");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(8) NetworkState must be NETWORK_IDLE when load is halted");
+ maybeFinish(v, 8);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadstart", function(e){v.preload = "metadata";}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadeddata", this.loadeddata, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test8",
+ },
+ /*{
+ // 9. Change preload value from metadata to auto should cause entire media to be loaded.
+ // For some reason we don't always receive the canplaythrough event, particuarly on this test.
+ // We've disabled this test until bug 568402 is fixed.
+ canplaythrough:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(9) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(9) Must get loadedmetadata.");
+ maybeFinish(v, 9);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "metadata";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadeddata", function(){v.preload = "auto"}, false);
+ v.addEventListener("canplaythrough", this.canplaythrough, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+ },*/
+ {
+ // 10. Change preload value from none to auto should cause entire media to be loaded.
+ canplaythrough:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadedMetaData, true, "(10) Must get loadedmetadata.");
+ maybeFinish(v, 10);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadstart", function(e){v.preload = "auto";}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("canplaythrough", this.canplaythrough, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test10",
+ },
+ {
+ // 11. Change preload value from none to metadata should cause metadata to load.
+ loadeddata:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadedMetaData, true, "(11) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(11) ReadyState must be >= HAVE_CURRENT_DATA.");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(11) NetworkState must be NETWORK_IDLE.");
+ maybeFinish(v, 11);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.addEventListener("loadstart", function(e){v.preload = "metadata";}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadeddata", this.loadeddata, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test11",
+ },
+ {
+ // 13. Change preload value from auto to none after specifying a src
+ // should load according to preload none, no buffering should have taken place
+ suspend:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(13) Must get loadstart.");
+ is(v._gotLoadedMetaData, false, "(13) Must not get loadedmetadata.");
+ is(v.readyState, v.HAVE_NOTHING, "(13) ReadyState must be HAVE_NOTHING");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(13) NetworkState must be NETWORK_IDLE");
+ maybeFinish(v, 13);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "auto";
+ v.src = test.name;
+ v.preload = "none";
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("suspend", this.suspend, false);
+ document.body.appendChild(v); // Causes implicit load, should load according to preload none
+ var s = document.createElement("source");
+ },
+
+ name: "test13",
+ },
+ {
+ // 14. Add preload:metadata video with src to document. Play(), should play through.
+ loadeddata:
+ function(e) {
+ var v = e.target;
+ is(v._gotLoadStart, true, "(14) Must get loadstart.");
+ is(v._gotLoadedMetaData, true, "(14) Must get loadedmetadata.");
+ ok(v.readyState >= v.HAVE_CURRENT_DATA, "(14) ReadyState must be >= HAVE_CURRENT_DATA");
+ // bug 962949
+ // is(v.networkState, v.NETWORK_IDLE, "(14) NetworkState must be NETWORK_IDLE");
+ v.play();
+ },
+
+ ended:
+ function(e) {
+ ok(true, "(14) Got playback ended");
+ var v = e.target;
+ maybeFinish(v, 14);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "metadata";
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("ended", this.ended, false);
+ v.addEventListener("loadeddata", this.loadeddata, false);
+ v.src = test.name;
+ document.body.appendChild(v); // Causes implicit load, which will be halted after
+ // metadata due to preload:metadata.
+ },
+
+ name: "test14",
+ },
+ {
+ // 15. Autoplay should override preload:none.
+ ended:
+ function(e) {
+ ok(true, "(15) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 15);
+ },
+
+ setup:
+ function(v) {
+ v._gotLoadStart = false;
+ v._gotLoadedMetaData = false;
+ v.preload = "none";
+ v.autoplay = true;
+ v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false);
+ v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false);
+ v.addEventListener("ended", this.ended, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ var v = e.target;
+ info(e.target.token + ": got " + e.type);
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ });
+ },
+
+ name: "test15",
+ },
+ {
+ // 16. Autoplay should override preload:metadata.
+ ended:
+ function(e) {
+ ok(true, "(16) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 16);
+ },
+
+ setup:
+ function(v) {
+ v.preload = "metadata";
+ v.autoplay = true;
+ v.addEventListener("ended", this.ended, false);
+ v.src = test.name; // Causes implicit load.
+ document.body.appendChild(v);
+ },
+
+ name: "test16",
+ },
+ {
+ // 17. On a preload:none video, adding autoplay should disable preload none, i.e. don't break autoplay!
+ ended:
+ function(e) {
+ ok(true, "(17) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 17);
+ },
+
+ setup:
+ function(v) {
+ v.addEventListener("ended", this.ended, false);
+ v.preload = "none";
+ document.body.appendChild(v); // Causes implicit load, which will be halted due to preload:none.
+ v.autoplay = true;
+ v.src = test.name;
+ },
+
+ name: "test17",
+ },
+ {
+ // 18. On a preload='none' video, call play() before load algorithms's sync
+ // has run, the play() call should override preload='none'.
+ ended:
+ function(e) {
+ ok(true, "(18) Got playback ended.");
+ var v = e.target;
+ maybeFinish(v, 18);
+ },
+
+ setup:
+ function(v) {
+ v.addEventListener("ended", this.ended, false);
+ v.preload = "none";
+ v.src = test.name; // Schedules async section to continue load algorithm.
+ document.body.appendChild(v);
+ v.play(); // Should cause preload:none to be overridden.
+ },
+
+ name: "test18",
+ },
+ {
+ // 19. Set preload='auto' on first video source then switching preload='none' and swapping the video source to another.
+ // The second video should not start playing as it's preload state has been changed to 'none' from 'auto'
+ setup:
+ function(v) {
+ v.preload = "auto";
+ v.src = test.name;
+ // add a listener for when the video has loaded, so we know preload auto has worked
+ v.onloadedmetadata = function() {
+ is(v.preload, "auto", "(19) preload is initially auto");
+ // set preload state to none and switch video sources
+ v.preload="none";
+ v.src = test.name + "?asdf";
+
+ v.onloadedmetadata = function() {
+ ok(false, "(19) 'loadedmetadata' shouldn't fire when preload is none");
+ }
+
+ var ontimeout = function() {
+ v.removeEventListener("suspend", onsuspend, false);
+ ok(false, "(19) 'suspend' should've fired");
+ maybeFinish(v, 19);
+ }
+ var cancel = setTimeout(ontimeout, 10000);
+
+ var onsuspend = function() {
+ v.removeEventListener("suspend", onsuspend, false);
+ clearTimeout(cancel);
+ is(v.readyState, 0, "(19) no buffering has taken place");
+ maybeFinish(v, 19);
+ }
+ v.addEventListener("suspend", onsuspend, false);
+ }
+ document.body.appendChild(v);
+ },
+
+ name: "test19",
+ }
+];
+
+var iterationCount = 0;
+function startTest(test, token) {
+ if (test == tests[0]) {
+ ++iterationCount;
+ info("iterationCount=" + iterationCount);
+ }
+ if (iterationCount == 2) {
+ // Do this series of tests on logically different resources
+ test.name = baseName + "?" + Math.floor(Math.random()*100000);
+ }
+ var v = document.createElement("video");
+ v.token = token;
+ test.setup(v);
+ manager.started(token);
+}
+
+var twiceTests = tests.concat(tests);
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
+function beginTest() {
+ manager.runTests(twiceTests, startTest);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_preload_attribute.html b/dom/media/test/test_preload_attribute.html
new file mode 100644
index 000000000..685ad969c
--- /dev/null
+++ b/dom/media/test/test_preload_attribute.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=479863
+-->
+<head>
+ <title>Test for Bug 479863</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=479863">Mozilla Bug 479863</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+
+<video id='v1'></video><audio id='a1'></audio>
+<video id='v2' preload="auto"></video><audio id='a2' preload="auto"></audio>
+
+<pre id="test">
+<script type="application/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var v2 = document.getElementById('v2');
+var a2 = document.getElementById('a2');
+is(v1.getAttribute("preload"), null, "video preload via getAttribute should be null by default");
+is(a1.getAttribute("preload"), null, "video preload via getAttribute should be null by default");
+is(v1.preload, "", "v1.preload should be empty by default");
+is(a1.preload, "", "a1.preload should be empty by default");
+is(v2.preload, "auto", "v2.preload should be auto");
+is(a2.preload, "auto", "a2.preload should be auto");
+
+v1.preload = "auto";
+a1.preload = "auto";
+is(v1.preload, "auto", "video.preload should be auto");
+is(a1.preload, "auto", "audio.preload should be auto");
+is(v1.getAttribute("preload"), "auto", "video preload attribute should be auto");
+is(a1.getAttribute("preload"), "auto", "video preload attribute should be auto");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_preload_suspend.html b/dom/media/test/test_preload_suspend.html
new file mode 100644
index 000000000..4a9478462
--- /dev/null
+++ b/dom/media/test/test_preload_suspend.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for Bug 479863</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function checkSuspendCount(evt) {
+ var v = evt.target;
+ ++v.suspendCount;
+ is(v.networkState, v.NETWORK_IDLE, v.name + " got suspended, count=" + v.suspendCount);
+ if (v.suspendCount == v.expectedSuspendCount) {
+ removeNodeAndSource(v);
+ manager.finished(v.name);
+ }
+ if (v.suspendCount > v.expectedSuspendCount) {
+ ok(false, v.name + " got too many suspend events");
+ }
+}
+
+var tests = [
+ {
+ name: 'v1',
+ preload: 'none',
+ expectedSuspendCount: 2,
+ onsuspend: function(evt) {
+ checkSuspendCount(evt);
+ if (evt.target.suspendCount == 1) {
+ evt.target.preload = 'auto';
+ }
+ }
+ },
+ {
+ name: 'v2',
+ preload: 'auto',
+ expectedSuspendCount: 1,
+ onsuspend: checkSuspendCount
+ },
+ {
+ name: 'v3',
+ preload: 'none',
+ autoplay: true,
+ expectedSuspendCount: 1,
+ onsuspend: checkSuspendCount
+ },
+ {
+ name: 'v4',
+ preload: 'none',
+ expectedSuspendCount: 2,
+ onsuspend: function(evt) {
+ checkSuspendCount(evt);
+ if (evt.target.suspendCount == 1) {
+ evt.target.play();
+ }
+ }
+ },
+ // disable v5 since media element doesn't support 'load' event anymore.
+ /*{
+ name: 'v5',
+ preload: 'none',
+ expectedSuspendCount: 2,
+ onsuspend: function(evt) {
+ checkSuspendCount(evt);
+ if (evt.target.suspendCount == 1) {
+ evt.target.currentTime = 0.1;
+ }
+ }
+ },*/
+ {
+ name: 'v6',
+ preload: 'none',
+ expectedSuspendCount: 2,
+ onsuspend: function(evt) {
+ checkSuspendCount(evt);
+ if (evt.target.suspendCount == 1) {
+ evt.target.autoplay = true;
+ }
+ }
+ }
+];
+
+function startTest(test, token) {
+ var v = document.createElement("video");
+ v.name = test.name;
+ var key = Math.random();
+ v.src = "seek.ogv?key=" + key + "&id=" + v.name;
+ v.preload = test.preload;
+ v.suspendCount = 0;
+ v.expectedSuspendCount = test.expectedSuspendCount;
+ if (test.autoplay) {
+ v.autoplay = true;
+ }
+ v.onsuspend = test.onsuspend;
+ document.body.appendChild(v);
+ manager.started(v.name);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, function() {
+ manager.runTests(tests, startTest);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_preserve_playbackrate_after_ui_play.html b/dom/media/test/test_preserve_playbackrate_after_ui_play.html
new file mode 100644
index 000000000..628d5c0c7
--- /dev/null
+++ b/dom/media/test/test_preserve_playbackrate_after_ui_play.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title> Bug 1013933 - preserve playbackRate after clicking play button </title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+ <script type="application/javascript" src="browserElementTestHelpers.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+<div id="content">
+ <video width="320" height="240" id="video" controls mozNoDynamicControls preload="auto"></video>
+</div>
+
+<script type="text/javascript">
+/*
+ * Positions of the UI elements, relative to the upper-left corner of the
+ * <video> box.
+ */
+const videoHeight = 240;
+const playButtonWidth = 28;
+const playButtonHeight = 28;
+const playButtonCenterX = 0 + Math.round(playButtonWidth / 2);
+const playButtonCenterY = videoHeight - Math.round(playButtonHeight / 2);
+
+var expectedPlaybackRate = 0.5
+
+function runTest() {
+ var video = document.getElementById("video");
+ video.src = "audio.wav";
+ video.loop = true;
+ video.playbackRate = expectedPlaybackRate;
+
+ video.oncanplaythrough = function() {
+ video.oncanplaythrough = null;
+ is(video.paused, true, "video is not playing yet.");
+ is(video.playbackRate, expectedPlaybackRate,
+ "playbackRate is correct before clicking play button.");
+
+ // Click the play button
+ synthesizeMouse(video, playButtonCenterX, playButtonCenterY, { });
+ };
+
+ video.onplay = function() {
+ video.onplay = null;
+ is(video.paused, false, "video starts playing.");
+ is(video.playbackRate, expectedPlaybackRate,
+ "playbackRate is correct after clicking play button.");
+ video.pause();
+ SimpleTest.finish();
+ };
+}
+
+window.addEventListener("load", runTest, false);
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_progress.html b/dom/media/test/test_progress.html
new file mode 100644
index 000000000..846ecbd4f
--- /dev/null
+++ b/dom/media/test/test_progress.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: progress events</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function do_progress(e) {
+ var v = e.target;
+ ok(!v._finished, "Check no progress events after completed for " + v._name);
+}
+
+function do_ended(e) {
+ var v = e.target;
+ ok(!v._finished, "Only one ended event for " + v._name);
+ v._finished = true;
+ v.removeEventListener("ended", do_ended, false);
+ v.removeEventListener("progress", do_progress, false);
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function startTest(test, token) {
+ var type = /^video/.test(test.type) ? "video" : "audio";
+ var v = document.createElement(type);
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v.autoplay = true;
+ v._name = test.name;
+ v._finished = false;
+ v.addEventListener("ended", do_ended, false);
+ v.addEventListener("progress", do_progress, false);
+ document.body.appendChild(v);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
+function beginTest() {
+ manager.runTests(gProgressTests, startTest);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_reactivate.html b/dom/media/test/test_reactivate.html
new file mode 100644
index 000000000..fd876660c
--- /dev/null
+++ b/dom/media/test/test_reactivate.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test reactivation of a media element from a dead document</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+
+<iframe id="frame" src="reactivate_helper.html"></iframe>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var elements;
+
+function playElement(e) {
+ // All elements played out, finish the test case.
+ if (!e) {
+ SimpleTest.finish();
+ return;
+ }
+
+ e.play();
+ info("Element play: " + e._name);
+ var reviveElement = function() {
+ document.body.appendChild(e);
+ e.onended = function() {
+ info("Element ended: " + e._name);
+ removeNodeAndSource(e);
+ // Play next element.
+ playElement(elements.pop());
+ }
+ }
+ setTimeout(reviveElement, 2000);
+}
+
+function loadedAll(elementList) {
+ elements = elementList;
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ info(e.target._name + ": got " + e.type);
+ }
+ elementList.forEach(function(element) {
+ events.forEach(function(evt) {
+ element.addEventListener(evt, logEvent, false);
+ });
+ });
+
+ // Blow away the subframe
+ document.body.removeChild(document.getElementById("frame"));
+
+ // Play elements one by one to avoid hitting bug 847903 on MacOSX.
+ playElement(elements.pop());
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_readyState.html b/dom/media/test/test_readyState.html
new file mode 100644
index 000000000..caa244b6d
--- /dev/null
+++ b/dom/media/test/test_readyState.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: readyState</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<video id='v1'></video><audio id='a1'></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+"use strict";
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var passed = "truthy";
+
+is(v1.readyState, 0);
+is(a1.readyState, 0);
+
+try {
+ v1.readyState = 0;
+} catch (e) {
+ passed = !passed;
+}
+try {
+ a1.readyState = 0;
+} catch (e) {
+ passed = !passed;
+}
+ok(passed === true,
+ "Setting readyState throws in strict mode (readonly attribute)");
+</script>
+
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById('v1');
+var a1 = document.getElementById('a1');
+var passed = false;
+
+is(v1.readyState, 0);
+is(a1.readyState, 0);
+
+try {
+ v1.readyState = 1;
+ a1.readyState = 1;
+ passed = v1.readyState === 0 && a1.readyState === 0;
+} catch(e) { }
+ok(passed, "Should not be able to set readyState (readonly attribute)");
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_referer.html b/dom/media/test/test_referer.html
new file mode 100644
index 000000000..4af45ab19
--- /dev/null
+++ b/dom/media/test/test_referer.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=584480
+-->
+<head>
+ <title>Test for Bug 584480</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=584480">Mozilla Bug </a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+var media = [];
+
+function checkComplete() {
+ for (var i=0; i<media.length; ++i) {
+ if (!media[i]._complete) {
+ return;
+ }
+ }
+
+ SimpleTest.finish();
+}
+
+function removeNode(v) {
+ v.removeEventListener("error", loadError, false);
+ v.removeEventListener("loadedmetadata", loadedMetadata, false);
+ v.remove();
+ v.src = "";
+}
+
+function loadError(evt) {
+ // If no referer is sent then the sjs returns an error
+ ok(false, "check referer is sent with media request");
+ evt.target._complete = true;
+ checkComplete();
+ removeNode(evt.target);
+}
+
+function loadedMetadata(evt) {
+ // If a referer is sent then the sjs returns a valid media
+ ok(true, "check referer is sent with media request");
+ evt.target._complete = true;
+ checkComplete();
+ removeNode(evt.target);
+}
+
+// Create all media objects.
+for (var i=0; i<gSmallTests.length; ++i) {
+ var test = gSmallTests[i];
+ var type;
+ if (/^video/.test(test.type)) {
+ type = "video"
+ } else {
+ type = "audio";
+ }
+ var v = document.createElement(type);
+ if (!v.canPlayType(test.type)) {
+ continue;
+ }
+ // ensure metadata is loaded for default preload is none on b2g
+ v.preload = "metadata";
+ v.autoplay = "true";
+ v._complete = false;
+ v.addEventListener("error", loadError, false);
+ v.addEventListener("loadedmetadata", loadedMetadata, false);
+ v.src = 'referer.sjs?name=' + test.name + '&type=' + test.type;
+ document.body.appendChild(v); // Will start load.
+ media.push(v);
+}
+
+if (media.length == 0) {
+ todo(false, "No types supported");
+} else {
+ SimpleTest.waitForExplicitFinish();
+}
+</script>
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_replay_metadata.html b/dom/media/test/test_replay_metadata.html
new file mode 100644
index 000000000..312a38197
--- /dev/null
+++ b/dom/media/test/test_replay_metadata.html
@@ -0,0 +1,120 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=467972
+-->
+<head>
+ <title>Test for Bug 467972</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=467972">Mozilla Bug 467972</a>
+
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+// Test for Bug 467972. Tests that when we play to end, seek to 0, and play again, that we don't
+// send/receive multiple loadeddata and loadedmetadata events.
+
+var manager = new MediaTestManager;
+
+function seekStarted(evt) {
+ var v = evt.target;
+ v._gotSeekStarted = true;
+}
+
+function seekEnded(evt) {
+ var v = evt.target;
+ v._gotSeekEnded = true;
+ v.play();
+}
+
+function loadedData(evt) {
+ var v = evt.target;
+ v._loadedDataCount++;
+ ok(v._loadedDataCount <= 1, "No more than 1 onloadeddata event for " + v._name);
+}
+
+function loadedMetaData(evt) {
+ var v = evt.target;
+ v._loadedMetaDataCount++;
+ ok(v._loadedMetaDataCount <= 1, "No more than 1 onloadedmetadata event for " + v._name);
+ checkMetadata(v._name, v, v._test);
+ v.play();
+}
+
+function playing(evt) {
+ evt.target._playingCount++;
+}
+
+function removeNodeAndListener(n) {
+ n.removeEventListener("loadedmetadata", loadedMetaData, false);
+ n.removeEventListener("ended", playbackEnded, false);
+ n.removeEventListener("playing", playing, false);
+ n.removeEventListener("loadeddata", loadedData, false);
+ n.removeEventListener("seeking", seekStarted, false);
+ n.removeEventListener("seeked", seekEnded, false);
+ removeNodeAndSource(n);
+}
+
+function playbackEnded(evt) {
+ var v = evt.target;
+ v._endCount++;
+ ok(v.currentTime >= v.duration-0.1 && v.currentTime <= v.duration + 0.1,
+ "CurrentTime (" + v.currentTime + ") should be around " + v.duration
+ + " for " + v._name);
+ if (!v._playedOnce) {
+ v.currentTime = 0;
+ ok(v.seeking, "seeking should be true for " + v._name);
+ ok(!v.ended, "ended shouldn't be true once seeking has begun for " + v._name);
+ v._playedOnce = true;
+ } else {
+ ok(v._gotSeekEnded, "Should have received seekended for " + v._name);
+ ok(v._gotSeekStarted, "Should have received seekstarted for " + v._name);
+ is(v._loadedDataCount, 1, "Should have 1 onloadeddata event for " + v._name);
+ is(v._loadedMetaDataCount, 1, "Should have 1 onloadedmetadata event for " + v._name);
+ is(v._endCount, 2, "Should have received two ended events for " + v._name);
+ ok(v._playingCount > 0, "Should have at least one playing event for " + v._name);
+ v._finished = true;
+ removeNodeAndListener(v);
+ manager.finished(v.token);
+ }
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "auto";
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._name = test.name;
+ v._playedOnce = false;
+ v._gotSeekEnded = false;
+ v._gotSeekStarted = false;
+ v._loadedDataCount = 0;
+ v._loadedMetaDataCount = 0;
+ v._playingCount = 0;
+ v._endCount = 0;
+ v._test = test;
+ v._finished = false;
+ v.addEventListener("loadedmetadata", loadedMetaData, false);
+ v.addEventListener("ended", playbackEnded, false);
+ v.addEventListener("playing", playing, false);
+ v.addEventListener("loadeddata", loadedData, false);
+ v.addEventListener("seeking", seekStarted, false);
+ v.addEventListener("seeked", seekEnded, false);
+ document.body.appendChild(v);
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_reset_events_async.html b/dom/media/test/test_reset_events_async.html
new file mode 100644
index 000000000..d47f33d32
--- /dev/null
+++ b/dom/media/test/test_reset_events_async.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=975270
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug </title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="manifest.js"></script>
+ <script type="application/javascript">
+
+ /** Test for Bug 975270 **/
+ // Test that 'emptied' and 'abort' events are fired asynchronously when re-starting
+ // media load.
+ SimpleTest.waitForExplicitFinish();
+
+ var a = document.createElement("audio");
+ a._abort = 0;
+ a._emptied = 0;
+ a.preload = "metadata"; // On B2G we default to preload:none.
+
+ is(a.networkState, HTMLMediaElement.NETWORK_EMPTY, "Shouldn't be loading");
+
+ a.addEventListener("abort", function(e) { a._abort++; });
+ a.addEventListener("emptied", function(e) { a._emptied++; });
+ a.addEventListener("loadedmetadata",
+ function(e) {
+ is(a._abort, 0, "Should not have received 'abort' before 'loadedmetadata");
+ is(a._emptied, 0, "Should not have received 'emptied' before 'loadedmetadata");
+
+ a.addEventListener("loadstart",
+ function(e) {
+ is(a._abort, 1, "Should have received 'abort' before 'loadstart");
+ is(a._emptied, 1, "Should have received 'emptied' before 'loadstart");
+ SimpleTest.finish();
+ });
+
+ a.src = "";
+ is(a._abort, 0, "Should not have received 'abort' during setting a.src=''");
+ is(a._emptied, 0, "Should not have received 'emptied' during setting a.src=''");
+ });
+
+ a.src = getPlayableAudio(gSmallTests).name;
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_reset_src.html b/dom/media/test/test_reset_src.html
new file mode 100644
index 000000000..0b05eba49
--- /dev/null
+++ b/dom/media/test/test_reset_src.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=804875
+-->
+
+<head>
+ <title>Test for bug 804875</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="manifest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank"
+href="https://bugzilla.mozilla.org/show_bug.cgi?id=804875">Mozilla Bug 804875</a>
+
+<canvas></canvas>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function finish(v) {
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function onLoadedData_Audio(e) {
+ var t = e.target;
+ is(t.videoHeight, 0, t.name + ": videoHeight should be zero when there is no video.");
+ is(t.videoWidth, 0, t.name + ": videoWidth should be zero when there is no video.");
+ is(t.mozPaintedFrames, 0, t.name + ": mozPaintedFrames should be zero when there is no video.");
+ is(t.mozFrameDelay, 0, t.name + ": mozFrameDelay should be zero when there is no video.");
+ var c = document.getElementsByTagName("canvas")[0].getContext("2d");
+ try {
+ c.drawImage(t, 0, 0, t.videoHeight, t.videoWidth);
+ } catch (e) {
+ ok(true, t.name + ": Trying to draw to a canvas should throw, since we don't have a frame anymore");
+ finish(t);
+ return;
+ }
+ ok(false, t.name + ": We should not succeed to draw a video frame on the canvas.");
+ finish(t);
+}
+
+function onTimeUpdate_Video(e) {
+ var t = e.target;
+ if (t.currentTime < t.duration / 4) {
+ return;
+ }
+ t.removeEventListener("timeupdate", onTimeUpdate_Video);
+ // There's no guarantee that a video frame composite notification reaches
+ // us before timeupdate fires.
+ ok(t.mozPaintedFrames >= 0, t.name + ": mozPaintedFrames should be positive or zero, is " + t.mozPaintedFrames + ".");
+ ok(t.mozFrameDelay >= 0, t.name + ": mozFrameDelay should be positive or zero, is " + t.mozFrameDelay + ".");
+
+ if (t._firstTime) {
+ t.src = t.src;
+ t._firstTime = false;
+ } else {
+ var source = getPlayableAudio(gPlayTests);
+ if (!source) {
+ todo("No audio file available.")
+ finish(t);
+ } else {
+ t.removeEventListener("loadeddata", onLoadedData_Video);
+ t.addEventListener("loadeddata", onLoadedData_Audio);
+ t.src = source.name;
+ }
+ }
+}
+
+function onLoadedData_Video(e) {
+ var t = e.target;
+ isnot(t.videoHeight, 0, t.name + ": We should have a videoHeight.");
+ isnot(t.videoWidth, 0, t.name + ": We should have a videoWidth.");
+ t.addEventListener("timeupdate", onTimeUpdate_Video);
+ t.play();
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ document.body.appendChild(v);
+ v._firstTime = true;
+ v.addEventListener("loadeddata", onLoadedData_Video);
+ v.src = test.name;
+ v.token = token;
+ v.name = test.name;
+ v.play();
+ manager.started(token);
+}
+
+manager.runTests(getPlayableVideos(gSmallTests.concat(gSeekTests)), startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_resolution_change.html b/dom/media/test/test_resolution_change.html
new file mode 100644
index 000000000..e1b8c2476
--- /dev/null
+++ b/dom/media/test/test_resolution_change.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test playback of files with resolution changes</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function loadedData(e) {
+ var v = e.target;
+ v.addEventListener("resize", resize, false);
+ v.play();
+}
+
+function resize(e) {
+ var v = e.target;
+ v.seenResolutionChange = true;
+}
+
+function ended(e) {
+ var v = e.target;
+ ok(v.seenResolutionChange, v.token + ": A resolution change should have ocurred by the end of playback");
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ v.src = test.name;
+ v.seenResolutionChange = false;
+
+ v.addEventListener("loadeddata", loadedData, false)
+ v.addEventListener("ended", ended, false);
+
+ manager.started(token);
+ document.body.appendChild(v);
+}
+
+manager.runTests(gResolutionChangeTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_resume.html b/dom/media/test/test_resume.html
new file mode 100644
index 000000000..c5dcb67d1
--- /dev/null
+++ b/dom/media/test/test_resume.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: Test resume of server-dropped connections</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<audio preload="auto" id="a"></audio>
+<iframe id="f"></iframe>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var key = Math.round(Math.random()*1000000000);
+var a = document.getElementById("a");
+var f = document.getElementById("f");
+
+function didEnd() {
+ ok(a.currentTime > 2.26, "Reached correct end time (got " + a.currentTime + ", expected > 2.26");
+ SimpleTest.finish();
+}
+
+function didSendCancel() {
+ a.addEventListener("ended", didEnd, false);
+ a.play();
+}
+
+function didSuspend() {
+ a.removeEventListener("suspend", didSuspend, false);
+
+ // Cache must have filled up, or something. Tell the Web server to drop
+ // our connection.
+ f.addEventListener("load", didSendCancel, false);
+ f.src = "cancellable_request.sjs?cancelkey=" + key;
+}
+
+if (!a.canPlayType("audio/wave")) {
+ todo(false, "Test requires support for audio/wave");
+} else {
+ a.addEventListener("suspend", didSuspend, false);
+ a.src = "cancellable_request.sjs?key=" + key;
+ SimpleTest.waitForExplicitFinish();
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-1.html b/dom/media/test/test_seek-1.html
new file mode 100644
index 000000000..accf38a8e
--- /dev/null
+++ b/dom/media/test/test_seek-1.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 1;
+
+function test_seek1(v, seekTime, is, ok, finish) {
+
+var startPassed = false;
+var endPassed = false;
+var seekFlagStart = false;
+var seekFlagEnd = false;
+var readonly = true;
+var completed = false;
+
+function startTest() {
+ ok(!completed, "Should not be completed yet");
+ ok(!v.seeking, "seeking should default to false");
+ try {
+ v.seeking = true;
+ readonly = v.seeking === false;
+ }
+ catch(e) {
+ readonly = "threw exception: " + e;
+ }
+ is(readonly, true, "seeking should be readonly");
+
+ v.currentTime = seekTime;
+ seekFlagStart = v.seeking;
+}
+
+function seekStarted() {
+ ok(!completed, "should not be completed yet");
+ ok(Math.abs(v.currentTime - seekTime) < 0.1,
+ "Video currentTime should be around " + seekTime + ": " + v.currentTime + " (seeking)");
+ startPassed = true;
+}
+
+function seekEnded() {
+ ok(!completed, "shuld not be completed yet");
+ ok(Math.abs(v.currentTime - seekTime) < 0.1,
+ "Video currentTime should be around " + seekTime + ": " + v.currentTime + " (seeked)");
+ endPassed = true;
+ seekFlagEnd = v.seeking;
+ v.play();
+}
+
+function playbackEnded() {
+ ok(!completed, "should not be completed yet");
+
+ completed = true;
+ ok(startPassed, "seeking event");
+ ok(endPassed, "seeked event");
+ ok(seekFlagStart, "seeking flag on start should be true");
+ ok(!seekFlagEnd, "seeking flag on end should be false");
+ finish();
+}
+
+once(v, "ended", playbackEnded);
+once(v, "loadedmetadata", startTest);
+once(v, "seeking", seekStarted);
+once(v, "seeked", seekEnded);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-10.html b/dom/media/test/test_seek-10.html
new file mode 100644
index 000000000..7a16397b3
--- /dev/null
+++ b/dom/media/test/test_seek-10.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 10;
+
+function test_seek10(v, seekTime, is, ok, finish) {
+
+// Test bug 523335 - ensure that if we close a stream while seeking, we
+// don't hang during shutdown. This test won't "fail" per se if it's regressed,
+// it will instead start to cause random hangs in the mochitest harness on
+// shutdown.
+
+function startTest() {
+ // Must be duration*0.9 rather than seekTime, else we don't hit that problem.
+ // This is probably due to the seek bisection finishing too quickly, before
+ // we can close the stream.
+ v.currentTime = v.duration * 0.9;
+}
+
+function done(evt) {
+ ok(true, "We don't acutally test anything...");
+ finish();
+}
+
+function seeking() {
+ ok(v.currentTime >= seekTime - 0.1, "Video currentTime should be around " + seekTime + ": " + v.currentTime);
+ v.onerror = done;
+ v.src = "not a valid video file.";
+ v.load(); // Cause the existing stream to close.
+}
+
+v.addEventListener("loadeddata", startTest, false);
+v.addEventListener("seeking", seeking, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-11.html b/dom/media/test/test_seek-11.html
new file mode 100644
index 000000000..53b9a3269
--- /dev/null
+++ b/dom/media/test/test_seek-11.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+PARALLEL_TESTS = 1;
+const SEEK_TEST_NUMBER = 11;
+
+function test_seek11(v, seekTime, is, ok, finish) {
+
+// Test for bug 476973, multiple seeks to the same position shouldn't cause problems.
+
+var seekedNonZero = false;
+var completed = false;
+var target = 0;
+
+function startTest() {
+ if (completed)
+ return;
+ target = v.duration / 2;
+ v.currentTime = target;
+ v.currentTime = target;
+ v._seekTarget = target;
+}
+
+function startSeeking() {
+ ok(v.currentTime >= v._seekTarget - 0.1,
+ "Video currentTime should be around " + v._seekTarget + ": " + v.currentTime);
+ if (!seekedNonZero) {
+ v.currentTime = target;
+ v._seekTarget = target;
+ seekedNonZero = true;
+ }
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+
+ if (v.currentTime > 0) {
+ ok(v.currentTime > target - 0.1 && v.currentTime < target + 0.1,
+ "Seek to wrong destination " + v.currentTime);
+ v.currentTime = 0.0;
+ v._seekTarget = 0.0;
+ } else {
+ ok(seekedNonZero, "Successfully seeked to nonzero");
+ ok(true, "Seek back to zero was successful");
+ completed = true;
+ finish();
+ }
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", startSeeking, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-12.html b/dom/media/test/test_seek-12.html
new file mode 100644
index 000000000..66c4c342c
--- /dev/null
+++ b/dom/media/test/test_seek-12.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 12;
+
+function test_seek12(v, seekTime, is, ok, finish) {
+var completed = false;
+
+function startTest() {
+ if (completed)
+ return;
+ ok(!v.seeking, "seeking should default to false");
+ v.currentTime = seekTime;
+ is(v.currentTime, seekTime, "currentTime must report seek target immediately");
+ is(v.seeking, true, "seeking flag on start should be true");
+}
+
+function seekStarted() {
+ if (completed)
+ return;
+ //is(v.currentTime, seekTime, "seeking: currentTime must be seekTime");
+ ok(Math.abs(v.currentTime - seekTime) < 0.01, "seeking: currentTime must be seekTime");
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+ completed = true;
+ //is(v.currentTime, seekTime, "seeked: currentTime must be seekTime");
+ ok(Math.abs(v.currentTime - seekTime) < 0.01, "seeked: currentTime must be seekTime");
+ is(v.seeking, false, "seeking flag on end should be false");
+ finish();
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", seekStarted, false);
+v.addEventListener("seeked", seekEnded, false);
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-13.html b/dom/media/test/test_seek-13.html
new file mode 100644
index 000000000..810957c51
--- /dev/null
+++ b/dom/media/test/test_seek-13.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 13;
+
+function test_seek13(v, seekTime, is, ok, finish) {
+var completed = false;
+
+function startTest() {
+ if (completed)
+ return;
+ ok(!v.seeking, "seeking should default to false");
+ v.currentTime = v.duration;
+ is(v.currentTime, v.duration, "currentTime must report seek target immediately");
+ is(v.seeking, true, "seeking flag on start should be true");
+}
+
+function seekStarted() {
+ if (completed)
+ return;
+ //is(v.currentTime, v.duration, "seeking: currentTime must be duration");
+ ok(Math.abs(v.currentTime - v.duration) < 0.01,
+ "seeking: currentTime (" + v.currentTime + ") must be duration (" + v.duration + ")");
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+ //is(v.currentTime, v.duration, "seeked: currentTime must be duration");
+ ok(Math.abs(v.currentTime - v.duration) < 0.01,
+ "seeked: currentTime (" + v.currentTime + ") must be duration (" + v.duration + ")");
+ is(v.seeking, false, "seeking flag on end should be false");
+}
+
+function playbackEnded() {
+ if (completed)
+ return;
+ completed = true;
+ //is(v.currentTime, v.duration, "ended: currentTime must be duration");
+ ok(Math.abs(v.currentTime - v.duration) < 0.01,
+ "ended: currentTime (" + v.currentTime + ") must be duration (" + v.duration + ")");
+ is(v.seeking, false, "seeking flag on end should be false");
+ is(v.ended, true, "ended must be true");
+ finish();
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", seekStarted, false);
+v.addEventListener("seeked", seekEnded, false);
+v.addEventListener("ended", playbackEnded, false);
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-2.html b/dom/media/test/test_seek-2.html
new file mode 100644
index 000000000..69484f0be
--- /dev/null
+++ b/dom/media/test/test_seek-2.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+PARALLEL_TESTS = 1;
+const SEEK_TEST_NUMBER = 2;
+
+function test_seek2(v, seekTime, is, ok, finish) {
+
+// Test seeking works if current time is set before video is
+// playing.
+var startPassed = false;
+var endPassed = false;
+var completed = false;
+
+function startTest() {
+ if (completed)
+ return;
+
+ v.currentTime=seekTime;
+ v.play();
+}
+
+function seekStarted() {
+ if (completed)
+ return;
+
+ ok(v.currentTime >= seekTime - 0.1, "Video currentTime should be around " + seekTime + ": " + v.currentTime);
+ startPassed = true;
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+
+ endPassed = true;
+}
+
+function playbackEnded() {
+ if (completed)
+ return;
+
+ completed = true;
+ ok(startPassed, "send seeking event");
+ ok(endPassed, "send seeked event");
+ ok(v.ended, "Checking playback has ended");
+ ok(Math.abs(v.currentTime - v.duration) <= 0.1, "Checking currentTime at end: " + v.currentTime);
+ finish();
+}
+
+v.addEventListener("ended", playbackEnded, false);
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", seekStarted, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-3.html b/dom/media/test/test_seek-3.html
new file mode 100644
index 000000000..04e5176e9
--- /dev/null
+++ b/dom/media/test/test_seek-3.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 3;
+
+function test_seek3(v, seekTime, is, ok, finish) {
+
+// Test seeking works if current time is set but video is not played.
+var startPassed = false;
+var completed = false;
+var gotTimeupdate = false;
+
+function startTest() {
+ if (completed)
+ return;
+
+ v.currentTime=seekTime;
+}
+
+function timeupdate() {
+ gotTimeupdate = true;
+ v.removeEventListener("timeupdate", timeupdate, false);
+}
+
+function seekStarted() {
+ if (completed)
+ return;
+
+ ok(v.currentTime >= seekTime - 0.1, "Video currentTime should be around " + seekTime + ": " + v.currentTime);
+ v.addEventListener("timeupdate", timeupdate, false);
+ startPassed = true;
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+
+ var t = v.currentTime;
+ ok(Math.abs(t - seekTime) <= 0.1, "Video currentTime should be around " + seekTime + ": " + t);
+ ok(gotTimeupdate, "Should have got timeupdate between seeking and seekended");
+ completed = true;
+ finish();
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", seekStarted, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-4.html b/dom/media/test/test_seek-4.html
new file mode 100644
index 000000000..4d34e3e58
--- /dev/null
+++ b/dom/media/test/test_seek-4.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 4;
+
+function test_seek4(v, seekTime, is, ok, finish) {
+
+// Test for a seek, followed by another seek before the first is complete.
+var seekCount = 0;
+var completed = false;
+
+function startTest() {
+ if (completed)
+ return;
+
+ v.currentTime=seekTime;
+ v._seekTarget=seekTime;
+}
+
+function seekStarted() {
+ if (completed)
+ return;
+
+ seekCount += 1;
+
+ ok(v.currentTime >= v._seekTarget - 0.1,
+ "Video currentTime should be around " + v._seekTarget + ": " + v.currentTime);
+ if (seekCount == 1) {
+ v.currentTime=seekTime/2;
+ v._seekTarget=seekTime/2;
+ }
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+
+ if (seekCount == 2) {
+ ok(Math.abs(v.currentTime - seekTime/2) <= 0.1, "seek on target: " + v.currentTime);
+ completed = true;
+ finish();
+ }
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", seekStarted, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-5.html b/dom/media/test/test_seek-5.html
new file mode 100644
index 000000000..c045070d2
--- /dev/null
+++ b/dom/media/test/test_seek-5.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 5;
+
+function test_seek5(v, seekTime, is, ok, finish) {
+
+// Test for a seek, followed by a play before the seek completes, ensure we play at the end of the seek.
+var startPassed = false;
+var endPassed = false;
+var completed = false;
+
+function startTest() {
+ if (completed)
+ return;
+
+ v.currentTime=seekTime;
+}
+
+function seekStarted() {
+ if (completed)
+ return;
+ ok(v.currentTime >= seekTime - 0.1, "Video currentTime should be around " + seekTime + ": " + v.currentTime);
+ startPassed = true;
+ v.play();
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+ endPassed = true;
+}
+
+function playbackEnded() {
+ if (completed)
+ return;
+ ok(startPassed, "Got seeking event");
+ ok(endPassed, "Got seeked event");
+ completed = true;
+ finish();
+}
+
+v.addEventListener("ended", playbackEnded, false);
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeking", seekStarted, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-6.html b/dom/media/test/test_seek-6.html
new file mode 100644
index 000000000..2c1063dd4
--- /dev/null
+++ b/dom/media/test/test_seek-6.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 6;
+
+function test_seek6(v, seekTime, is, ok, finish) {
+
+// Test for bug identified by Chris Pearce in comment 40 on
+// bug 449159.
+var seekCount = 0;
+var completed = false;
+var interval;
+var sum = 0;
+
+function poll() {
+ sum += v.currentTime;
+}
+
+function startTest() {
+ if (completed)
+ return;
+ interval = setInterval(poll, 10);
+ v.currentTime = Math.random() * v.duration;
+}
+
+function seekEnded() {
+ if (completed)
+ return;
+
+ seekCount++;
+ ok(true, "Seek " + seekCount);
+ if (seekCount == 3) {
+ clearInterval(interval);
+ completed = true;
+ finish();
+ } else {
+ v.currentTime = Math.random() * v.duration;
+ }
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-7.html b/dom/media/test/test_seek-7.html
new file mode 100644
index 000000000..faef7f80e
--- /dev/null
+++ b/dom/media/test/test_seek-7.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 7;
+
+function test_seek7(v, seekTime, is, ok, finish) {
+
+// If a NaN is passed to currentTime, make sure this is caught
+// otherwise an infinite loop in the Ogg backend occurs.
+var completed = false;
+var thrown1 = false;
+var thrown2 = false;
+var thrown3 = false;
+
+function startTest() {
+ if (completed)
+ return;
+
+ try {
+ v.currentTime = NaN;
+ } catch(e) {
+ thrown1 = true;
+ }
+
+ try {
+ v.currentTime = Math.random;
+ } catch(e) {
+ thrown3 = true;
+ }
+
+ completed = true;
+ ok(thrown1, "Setting currentTime to invalid value of NaN");
+ ok(thrown3, "Setting currentTime to invalid value of a function");
+ finish();
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-8.html b/dom/media/test/test_seek-8.html
new file mode 100644
index 000000000..23ea32f17
--- /dev/null
+++ b/dom/media/test/test_seek-8.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 8;
+
+function test_seek8(v, seekTime, is, ok, finish) {
+
+function startTest() {
+ v.currentTime = 1000;
+}
+
+function seekEnded() {
+ ok(Math.abs(v.currentTime - v.duration) < 0.2,
+ "currentTime " + v.currentTime + " close to " + v.duration);
+ finish();
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek-9.html b/dom/media/test/test_seek-9.html
new file mode 100644
index 000000000..69562ac4b
--- /dev/null
+++ b/dom/media/test/test_seek-9.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// The data being used in these tests is specified in manifest.js.
+// The functions to build the test array and to run a specific test are in
+// seek_support.js.
+
+const SEEK_TEST_NUMBER = 9;
+
+function test_seek9(v, seekTime, is, ok, finish) {
+
+function startTest() {
+ v.currentTime = -1000;
+}
+
+function seekEnded() {
+ is(v.currentTime, 0, "currentTime clamped to 0");
+ finish();
+}
+
+v.addEventListener("loadedmetadata", startTest, false);
+v.addEventListener("seeked", seekEnded, false);
+
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seekLies.html b/dom/media/test/test_seekLies.html
new file mode 100644
index 000000000..3c4231434
--- /dev/null
+++ b/dom/media/test/test_seekLies.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: server lies about range requests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="manifest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body onunload="mediaTestCleanup();">
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function on_metadataloaded() {
+ var v = document.getElementById('v');
+ var d = Math.round(v.duration*1000);
+ ok(d == 4000, "Checking duration: " + d);
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+<video id='v'
+ preload="metadata"
+ src='seekLies.sjs'
+ onloadedmetadata='on_metadataloaded();'></video>
+</body>
+</html>
diff --git a/dom/media/test/test_seekToNextFrame.html b/dom/media/test/test_seekToNextFrame.html
new file mode 100644
index 000000000..b6869556c
--- /dev/null
+++ b/dom/media/test/test_seekToNextFrame.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test seekToNextFrame of media files that should play OK</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.token = token;
+ v.seenSeeking = false;
+ v.seenEnded = false;
+
+ var handler = {
+ "ontimeout": function() {
+ Log(token, "timed out: ended=" + v.seenEnded);
+ }
+ };
+ manager.started(token, handler);
+
+ v.src = test.name;
+ v.name = test.name;
+
+ function callSeekToNextFrame() {
+ v.seekToNextFrame().then(
+ () => {
+ ok(v.seenSeeking, "Should have already received seeking event.")
+ v.seenSeeking = false;
+ if (!v.seenEnded)
+ callSeekToNextFrame();
+ },
+ () => {
+ ok(false, "seekToNextFrame() failed.");
+ }
+ );
+ }
+
+ var onLoadedmetadata = function(test, v) { return function() {
+ callSeekToNextFrame();
+ }}(test, v);
+
+ var finish = function() {
+ v.finished = true;
+ v.removeEventListener("loadedmetadata", onLoadedmetadata, false);
+ v.removeEventListener("seeking", onSeeking, false);
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ }
+
+ var onEnded = function(test, v) { return function() {
+ v.seenEnded = true;
+ finish();
+ }}(test, v);
+
+ var onSeeking = function(test, v) { return function() {
+ ok(!v.seenSeeking, "Should yet receive seeking event.")
+ v.seenSeeking = true;
+ }}(test, v);
+
+ v.addEventListener("loadedmetadata", onLoadedmetadata, false);
+ v.addEventListener("seeking", onSeeking, false);
+ v.addEventListener("ended", onEnded, false);
+
+ document.body.appendChild(v);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv(
+ {
+ "set": [["media.seekToNextFrame.enabled", true ]]
+ },
+ function() {
+ manager.runTests(gSeekToNextFrameTests, startTest);
+ });
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/test/test_seek_negative.html b/dom/media/test/test_seek_negative.html
new file mode 100644
index 000000000..e87d1ae4b
--- /dev/null
+++ b/dom/media/test/test_seek_negative.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seeking to a negative time with readyState HAVE_NOTHING</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function startTest(test, token) {
+ var type = getMajorMimeType(test.type);
+ var v = document.createElement(type);
+ v.token = token;
+ manager.started(token);
+
+ // Seek to negative start time.
+ v.currentTime = -123;
+ is(v.readyState, v.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ ok(!v.seeking, "can't be seeking prior src defined");
+ is(v.currentTime, -123, "currentTime is original seek time");
+
+ v.src = test.name;
+
+ // Initialize running variables.
+ v._name = test.name;
+ v._seekStarted = false;
+ v._seekCompleted = false;
+ v._metadata = false;
+
+ var events = [ "suspend", "play", "canplay", "canplaythrough", "loadstart",
+ "loadedmetadata", "loadeddata", "playing", "ended", "error",
+ "stalled", "emptied", "abort", "waiting", "pause" ];
+ function logEvent(e) {
+ var v = e.target;
+ Log(e.target.token, "got " + e.type + " with currentTime = " + v.currentTime);
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ });
+
+ once(v, "seeking", function() {
+ v._seekStarted = true;
+ ok(v.currentTime >= 0, "currentTime should be positive");
+ });
+ once(v, "seeked", function() {
+ v._seekCompleted = true;
+ ok(v.currentTime >= 0, "currentTime should be positive");
+ });
+ once(v, "loadedmetadata", function() {
+ v._metadata = true;
+ ok(v.seeking, "element is seeking once readyState is HAVE_METADATA");
+ ok(v.currentTime >= 0, "currentTime should be positive");
+ });
+ once(v, "ended", function() {
+ ok(v._seekStarted, "seek should have started");
+ ok(v._seekCompleted, "seek should have completed");
+ ok(v._metadata, "loadedmetadata fired");
+ ok(v.currentTime >= 0, "currentTime should be positive");
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ });
+
+ v.play();
+}
+
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek_nosrc.html b/dom/media/test/test_seek_nosrc.html
new file mode 100644
index 000000000..8fc92b443
--- /dev/null
+++ b/dom/media/test/test_seek_nosrc.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seek tests</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var SEEK_TIME = 3.5;
+var seekStarted = false;
+var seekCompleted = false;
+var metadata = false;
+
+var v = document.createElement('video');
+document.body.appendChild(v);
+SimpleTest.registerCleanupFunction(function () {
+ v.remove();
+});
+
+try {
+ v.currentTime = SEEK_TIME;
+} catch (e) {
+ ok(false, "should not fire '" + e + "' event");
+}
+is(v.readyState, v.HAVE_NOTHING, "readyState is HAVE_NOTHING");
+ok(!v.seeking, "can't be seeking prior src defined");
+is(v.currentTime, SEEK_TIME, "currentTime is default playback start position");
+once(v, "seeking", function() {
+ seekStarted = true;
+});
+once(v, "seeked", function() {
+ seekCompleted = true;
+});
+once(v, "loadedmetadata", function() {
+ metadata = true;
+ ok(v.seeking, "element is seeking once readyState is HAVE_METADATA");
+});
+once(v, "ended", function() {
+ ok(seekStarted, "seek should have started");
+ ok(seekCompleted, "seek should have completed");
+ ok(metadata, "loadedmetadata fired");
+ ok(v.currentTime >= SEEK_TIME, "currentTime should be after seek time");
+ SimpleTest.finish();
+});
+
+v.src = "seek.webm";
+v.play();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seek_out_of_range.html b/dom/media/test/test_seek_out_of_range.html
new file mode 100644
index 000000000..210f6c3df
--- /dev/null
+++ b/dom/media/test/test_seek_out_of_range.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: seeking off the end of a file</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+if (navigator.platform.startsWith("Win")) {
+ SimpleTest.expectAssertions(0, 10);
+}
+
+var manager = new MediaTestManager;
+
+// Test if the ended event works correctly.
+
+function startTest(e) {
+ var v = e.target;
+ checkMetadata(v._name, v, v._test);
+ is(v._loadedMetadata, false, "Should only receive one loadedmetadata event for " + v._name);
+ v._loadedMetadata = true;
+ v.currentTime = 3.0 * v.duration;
+}
+
+function playbackEnded(e) {
+ var v = e.target;
+ // We should have dispatched an ended event when we seeked to the end of
+ // media, but we want the ended event which dispatches once playback has
+ // completed after the seek to the beginning.
+ if (!v._played)
+ return;
+ ok(v.ended, "Checking ended set after seeking to EOF and playing for " + v._name);
+ ok(!v._finished, "Should only hit the end once for " + v._name);
+ v._finished = true;
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+}
+
+function endSeek(e) {
+ var v = e.target;
+ if (v._seeked)
+ return;
+ v._seeked = true;
+ ok(Math.abs(v.duration - v.currentTime) < 0.1,
+ "Should be at end of media for " + v._name + " t=" + v.currentTime + " d=" + v.duration);
+ v.play();
+}
+
+function playing(e) {
+ e.target._played = true;
+}
+
+function initTest(test, token) {
+ var type = getMajorMimeType(test.type);
+ var v = document.createElement(type);
+ v.preload = "auto";
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._name = test.name;
+ v._finished = false;
+ v._test = test;
+ v._loadedMetadata = false;
+ v._seeked = false;
+ v._played = false;
+ v.addEventListener("loadedmetadata", startTest, false);
+ v.addEventListener("playing", playing, false);
+ v.addEventListener("seeked", endSeek, false);
+ v.addEventListener("ended", playbackEnded, false);
+ document.body.appendChild(v);
+}
+
+manager.runTests(gSmallTests, initTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_seekable1.html b/dom/media/test/test_seekable1.html
new file mode 100644
index 000000000..f63e0a634
--- /dev/null
+++ b/dom/media/test/test_seekable1.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>Test seekable member for media elements</title>
+<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+<script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id='test'>
+<script class="testbody" type='application/javascript;version=1.8'>
+
+let manager = new MediaTestManager;
+
+function finish_test(element) {
+ if (element.parentNode)
+ element.parentNode.removeChild(element);
+ element.src="";
+ manager.finished(element.token);
+}
+
+var tests = [
+// Test using a finite media stream, and a server supporting range requests
+{
+setup : function(element) {
+ is(element.seekable.length, 0, "seekable.length should be initialy 0.");
+ element.addEventListener("loadedmetadata", function() {
+ is(element.seekable.length, 1, "seekable.length should be 1 for a server supporting range requests.");
+
+ is(element.seekable.start(0), 0.0, "The start of the first range should be the initialTime.");
+ is(element.seekable.end(0), element.duration, "The end of the first range should be the duration.")
+ finish_test(element);
+ }, false);
+ }
+}
+];
+
+function createTestArray() {
+ var A = [];
+ for (var k=0; k < gProgressTests.length; k++) {
+ var t = new Object();
+ t.setup = tests[0].setup;
+ t.name = gProgressTests[k].name;
+ t.type = gProgressTests[k].type;
+ A.push(t);
+ }
+ return A;
+}
+
+function startTest(test, token) {
+ var elemType = getMajorMimeType(test.type);
+ var element = document.createElement(elemType);
+ element.preload = "auto";
+ element.src = test.name;
+ element.token = token;
+ test.setup(element);
+ manager.started(token);
+}
+
+manager.runTests(createTestArray(), startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_source.html b/dom/media/test/test_source.html
new file mode 100644
index 000000000..f64c0a3f7
--- /dev/null
+++ b/dom/media/test/test_source.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: append source child</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<video id="v1"></video>
+<audio id="a1"></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var v1 = document.getElementById("v1");
+var a1 = document.getElementById("a1");
+v1.preload = "auto";
+a1.preload = "auto";
+
+is(v1.src, "", "src should be null");
+is(a1.src, "", "src should be null");
+is(v1.currentSrc, "", "currentSrc should be null");
+is(a1.currentSrc, "", "currentSrc should be null");
+is(v1.childNodes.length, 0, "should have no children");
+is(a1.childNodes.length, 0, "should have no children");
+
+function newSource(filter) {
+ var test = null;
+ var candidates = gSmallTests.filter(function(x){return filter.test(x.type);});
+ if (candidates.length > 0) {
+ var e = document.createElement("source");
+ e.type = candidates[0].type;
+ e.src = candidates[0].name;
+ return e;
+ } else {
+ return null
+ }
+}
+
+var audioLoaded = false;
+var videoLoaded = false;
+
+function loaded(e) {
+ var media = e.target;
+ ok(media.networkState > 0, "networkState should be > 0");
+ is(media.childNodes.length, 1, "should have 1 child");
+ var sourceFile = media.currentSrc.substring(media.currentSrc.lastIndexOf('/')+1);
+ var resource = media.firstChild.src.substring(media.firstChild.src.lastIndexOf('/')+1);
+ is(sourceFile, resource, "loaded wrong resource!");
+ if (media == a1)
+ audioLoaded = true;
+ else if (media == v1)
+ videoLoaded = true;
+ if (audioLoaded && videoLoaded) {
+ SimpleTest.finish();
+ }
+}
+
+v1.addEventListener('loadeddata', loaded, false);
+a1.addEventListener('loadeddata', loaded, false);
+
+var videoSource = newSource(/^video/);
+if (videoSource) {
+ v1.appendChild(videoSource);
+ v1.load();
+} else {
+ // No video backends? Don't test anything.
+ videoLoaded = true;
+}
+
+var audioSource = newSource(/^audio/);
+if (audioSource) {
+ a1.appendChild(audioSource);
+ a1.load();
+} else {
+ audioLoaded = true;
+}
+
+if (!audioLoaded && !videoLoaded) {
+ SimpleTest.waitForExplicitFinish();
+} else {
+ if (audioLoaded) {
+ todo(false, "No audio types supported");
+ }
+ if (videoLoaded) {
+ todo(false, "No video types supported");
+ }
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_source_media.html b/dom/media/test/test_source_media.html
new file mode 100644
index 000000000..0889ef050
--- /dev/null
+++ b/dom/media/test/test_source_media.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Media test: media attribute for the source element.</title>
+<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+<script type="text/javascript" src="manifest.js"></script>
+<script type="text/javascript" src="../../../dom/html/test/reflect.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="text/javascript">
+ var testCount = 0;
+ function notifyFinished() {
+ testCount++;
+ if (testCount == 2) {
+ SimpleTest.finish();
+ }
+ }
+
+ function clearNode(n) {
+ n.remove();
+ n.src = "";
+ while (n.firstChild) {
+ n.removeChild(n.firstChild);
+ }
+ }
+
+ SimpleTest.waitForExplicitFinish();
+
+ reflectString({
+ element: document.createElement("source"),
+ attribute: "media",
+ });
+
+ var media = getPlayableVideo(gSmallTests);
+
+ if (media == null) {
+ todo(false, "No media supported.");
+ SimpleTest.finish();
+ } else {
+ var v = document.createElement('video');
+ v.preload = "metadata";
+ v.innerHTML = "<source src=\"" + media.name + "?fail\" media=\"not all\">" +
+ "<source src=\""+ media.name + "?pass\" media=\"all\">";
+ var v2 = document.createElement("video");
+ v2.preload = "metadata";
+ v2.innerHTML = "<source src=\""+ media.name +"?pass\">" +
+ "<source src=\""+ media.name + "?fail\" media=\"all\">";
+ document.body.appendChild(v);
+ document.body.appendChild(v2);
+
+ v.addEventListener("loadedmetadata", function(e) {
+ ok(/pass/.test(e.target.currentSrc),
+ "The source has been chosen according to the media attribute.");
+ clearNode(e.target);
+ notifyFinished();
+ });
+ v2.addEventListener("loadedmetadata", function(e) {
+ ok(/pass/.test(e.target.currentSrc),
+ "If no media attribute is specified, it defaults to \'all\'.")
+ clearNode(e.target);
+ notifyFinished();
+ });
+ }
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_source_null.html b/dom/media/test/test_source_null.html
new file mode 100644
index 000000000..e6a536749
--- /dev/null
+++ b/dom/media/test/test_source_null.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=752087
+-->
+<head>
+ <title>Test for Bug 752087</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=752087">Mozilla Bug 752087</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+
+<video id="v">
+<script>
+var v = document.getElementById('v');
+v.src = null; // crashes on NULL access if not handled
+
+ok(true, "setting video.src to null didn't crash!");
+</script>
+</video>
+</body>
+</html>
diff --git a/dom/media/test/test_source_write.html b/dom/media/test/test_source_write.html
new file mode 100644
index 000000000..6c55f8fdd
--- /dev/null
+++ b/dom/media/test/test_source_write.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=462455
+-->
+<head>
+ <title>Test for Bug 462455</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=462455">Mozilla Bug 462455</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+
+<video id="v">
+<script>
+var loadStarted = false;
+document.write('Pause parsing!');
+var v = document.getElementById('v');
+
+var resource = getPlayableVideo(gSmallTests);
+if (resource != null) {
+ var s = document.createElement("source");
+ s.src = resource.name;
+ s.type = resource.type;
+ v.appendChild(s);
+}
+
+ok(v.networkState == HTMLMediaElement.NETWORK_NO_SOURCE,
+ "We shouldn't start network load until the current task returns.");
+</script>
+</video>
+</body>
+</html>
diff --git a/dom/media/test/test_standalone.html b/dom/media/test/test_standalone.html
new file mode 100644
index 000000000..65733a19f
--- /dev/null
+++ b/dom/media/test/test_standalone.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: standalone video documents</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="doTest()">
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var iframes = [];
+
+for (var i=0; i<gSmallTests.length; ++i) {
+ var test = gSmallTests[i];
+
+ // We can't play WAV files in stand alone documents, so just don't
+ // run the test on non-video content types.
+ var tag = getMajorMimeType(test.type);
+ if (tag != "video" || !document.createElement("video").canPlayType(test.type))
+ continue;
+
+ var f = document.createElement("iframe");
+ f.src = test.name;
+ f._test = test;
+ f.id = "frame" + i;
+ iframes.push(f);
+ document.body.appendChild(f);
+}
+
+
+function filename(uri) {
+ return uri.substr(uri.lastIndexOf("/")+1);
+}
+
+function doTest()
+{
+ for (var i=0; i<iframes.length; ++i) {
+ var f = document.getElementById(iframes[i].id);
+ var v = f.contentDocument.body.firstChild;
+ is(v.tagName.toLowerCase(), "video", "Is video element");
+ var src = filename(v.currentSrc);
+ is(src, iframes[i]._test.name, "Name ("+src+") should match ("+iframes[i]._test.name+")");
+ is(v.controls, true, "Controls set (" + src + ")");
+ is(v.autoplay, true, "Autoplay set (" + src + ")");
+ }
+ SimpleTest.finish();
+}
+
+if (iframes.length == 0) {
+ todo(false, "No types supported");
+} else {
+ SimpleTest.waitForExplicitFinish();
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_autoplay.html b/dom/media/test/test_streams_autoplay.html
new file mode 100644
index 000000000..75f0579e6
--- /dev/null
+++ b/dom/media/test/test_streams_autoplay.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that a MediaStream source triggers autoplay</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var media = getPlayableVideo(gSmallTests);
+
+if (media == null) {
+ todo(false, "No media supported.");
+ SimpleTest.finish();
+} else {
+ function startTest() {
+ var v1 = document.createElement('video');
+ var v2 = document.createElement('video');
+ v1.preload = 'metadata';
+ v2.autoplay = true;
+ document.body.appendChild(v1);
+ document.body.appendChild(v2);
+
+ v1.src = media.name;
+ v1.onloadedmetadata = function() {
+ v2.srcObject = v1.mozCaptureStream();
+ v1.play();
+ };
+
+ v2.addEventListener('playing', function() {
+ ok(true, "playback started");
+ SimpleTest.finish();
+ }, {once: true});
+ }
+
+ startTest();
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_capture_origin.html b/dom/media/test/test_streams_capture_origin.html
new file mode 100644
index 000000000..916163e9c
--- /dev/null
+++ b/dom/media/test/test_streams_capture_origin.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for Bug 1189506</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1189506">Mozilla Bug 1189506</a>
+<p id="display"></p>
+<video id="vin"></video>
+<video id="vout" style="position:absolute; top:0; left:0"></video>
+<canvas id="c"></canvas>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1189506 **/
+
+SimpleTest.waitForExplicitFinish();
+
+var resource = getPlayableVideo(gSmallTests).name;
+
+vin.src = "http://example.org:8000/tests/dom/media/test/" + resource;
+vin.preload = "metadata";
+
+vin.onloadedmetadata = function () {
+ vout.srcObject = vin.mozCaptureStreamUntilEnded();
+ vin.play();
+ vout.play();
+};
+
+vout.onended = function() {
+ var ctx = SpecialPowers.wrap(c.getContext("2d"));
+ ctx.drawWindow(window, 0, 0, 10, 10, "rgb(255, 255, 0)", 0);
+ var data = ctx.getImageData(2, 2, 1, 1);
+ // Captured cross-origin video streams should render entirely black.
+ is(data.data.join(','), "0,0,0,255", "expected black");
+ vout.style.position = "";
+ SimpleTest.finish();
+};
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_element_capture.html b/dom/media/test/test_streams_element_capture.html
new file mode 100644
index 000000000..5e30a3ce4
--- /dev/null
+++ b/dom/media/test/test_streams_element_capture.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that a MediaStream captured from one element plays back in another</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+// longer timeout for slow platforms
+if (isSlowPlatform()) {
+ SimpleTest.requestLongerTimeout(3);
+ SimpleTest.requestCompleteLog();
+}
+
+function checkDrawImage(vout) {
+ var canvas = document.createElement("canvas");
+ var ctx = canvas.getContext("2d");
+ ctx.drawImage(vout, 0, 0);
+ var imgData = ctx.getImageData(0, 0, 1, 1);
+ is(imgData.data[3], 255, "Check video frame pixel has been drawn");
+}
+
+function isGreaterThanOrEqualEps(a, b, msg) {
+ ok(a >= b - 0.01,
+ "Got " + a + ", expected at least " + b + "; " + msg);
+}
+
+function startTest(test) {
+ var v = document.createElement('video');
+ var vout = document.createElement('video');
+
+ v.src = test.name;
+ var stream;
+
+ var checkEnded = function() {
+ is(stream.currentTime, vout.currentTime, test.name + " stream final currentTime");
+ if (test.duration) {
+ isGreaterThanOrEqualEps(vout.currentTime, test.duration,
+ test.name + " current time at end");
+ }
+ is(vout.readyState, vout.HAVE_CURRENT_DATA, test.name + " checking readyState");
+ ok(vout.ended, test.name + " checking playback has ended");
+ if (test.type.match(/^video/)) {
+ checkDrawImage(vout);
+ }
+ vout.parentNode.removeChild(vout);
+ removeNodeAndSource(v);
+ SimpleTest.finish();
+ };
+ vout.addEventListener("ended", checkEnded, false);
+
+ document.body.appendChild(vout);
+
+ var onloadedmetadata = function (ev) {
+ stream = v.mozCaptureStreamUntilEnded();
+ is(stream.currentTime, 0, test.name + " stream initial currentTime");
+ vout.srcObject = stream;
+ is(vout.srcObject, stream, test.name + " set output element .srcObject correctly");
+ v.play();
+ vout.play();
+ }
+
+ v.preload = 'metadata';
+ v.addEventListener('loadedmetadata', onloadedmetadata, false);
+
+ // Log events for debugging.
+ var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+ function logEvent(e) {
+ Log(e.target.name, "got " + e.type);
+ }
+ events.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ vout.addEventListener(e, logEvent, false);
+ });
+
+}
+
+// We only test one playable video because for some of the audio files
+// --- small-shot.mp3.mp4 and small-shot.m4a --- GStreamer doesn't decode
+// as much data as indicated by the duration, causing this test to fail on
+// Linux. See bug 1084185.
+var testVideo = getPlayableVideo(gSmallTests);
+if (testVideo) {
+ startTest(testVideo);
+} else {
+ todo(false, "No playable video");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_element_capture_createObjectURL.html b/dom/media/test/test_streams_element_capture_createObjectURL.html
new file mode 100644
index 000000000..d5d7efc5c
--- /dev/null
+++ b/dom/media/test/test_streams_element_capture_createObjectURL.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that a MediaStream captured from one element plays back in another</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var manager = new MediaTestManager;
+
+function checkDrawImage(vout) {
+ var canvas = document.createElement("canvas");
+ var ctx = canvas.getContext("2d");
+ ctx.drawImage(vout, 0, 0);
+ var imgData = ctx.getImageData(0, 0, 1, 1);
+ is(imgData.data[3], 255, "Check video frame pixel has been drawn");
+}
+
+function isGreaterThanOrEqualEps(a, b, msg) {
+ ok(a >= b - 0.01,
+ "Got " + a + ", expected at least " + b + "; " + msg);
+}
+
+function startTest(test, token) {
+ manager.started(token);
+
+ var v = document.createElement('video');
+ var vout = document.createElement('video');
+ vout.token = token;
+
+ v.src = test.name;
+ v.preload = "metadata"
+ var stream;
+
+ var checkEnded = function() {
+ is(stream.currentTime, vout.currentTime, test.name + " stream final currentTime");
+ if (test.duration) {
+ isGreaterThanOrEqualEps(vout.currentTime, test.duration,
+ test.name + " current time at end");
+ }
+ is(vout.readyState, vout.HAVE_CURRENT_DATA, test.name + " checking readyState");
+ ok(vout.ended, test.name + " checking playback has ended");
+ if (test.type.match(/^video/)) {
+ checkDrawImage(vout);
+ }
+ vout.parentNode.removeChild(vout);
+ URL.revokeObjectURL(vout.src);
+ manager.finished(vout.token);
+ };
+ vout.addEventListener("ended", checkEnded, false);
+
+ document.body.appendChild(vout);
+ v.onloadedmetadata = function () {
+ stream = v.mozCaptureStreamUntilEnded();
+ is(stream.currentTime, 0, test.name + " stream initial currentTime");
+ vout.src = URL.createObjectURL(stream);
+ v.play();
+ vout.play();
+ };
+}
+
+manager.runTests([getPlayableVideo(gSmallTests)], startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_element_capture_playback.html b/dom/media/test/test_streams_element_capture_playback.html
new file mode 100644
index 000000000..a49c38735
--- /dev/null
+++ b/dom/media/test/test_streams_element_capture_playback.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that capturing a stream doesn't stop the underlying element from firing events</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<audio id="a"></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var a = document.getElementById('a');
+var validTimeUpdate = false;
+
+function startTest() {
+ a.src = "big.wav";
+ var context = new AudioContext();
+ var node = context.createMediaElementSource(a);
+ node.connect(context.destination);
+ a.addEventListener("timeupdate", function() {
+ if (a.currentTime > 0.0 && a.currentTime < 5.0 && !validTimeUpdate) {
+ validTimeUpdate = true;
+ ok(true, "Received reasonable currentTime in a timeupdate");
+ SimpleTest.finish();
+ }
+ });
+ a.addEventListener("ended", function() {
+ if (!validTimeUpdate) {
+ ok(false, "Received reasonable currentTime in a timeupdate");
+ SimpleTest.finish();
+ }
+ });
+ a.play();
+}
+
+if (a.canPlayType("audio/wave")) {
+ startTest();
+} else {
+ todo(false, "No playable audio");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_element_capture_reset.html b/dom/media/test/test_streams_element_capture_reset.html
new file mode 100644
index 000000000..888c3bec9
--- /dev/null
+++ b/dom/media/test/test_streams_element_capture_reset.html
@@ -0,0 +1,134 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that reloading and seeking in a media element that's being captured doesn't crash</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<video id="v"></video>
+<video id="vout"></video>
+<video id="vout_untilended"></video>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var v = document.getElementById('v');
+var vout = document.getElementById('vout');
+var vout_untilended = document.getElementById('vout_untilended');
+
+function dumpEvent(event) {
+ var v = event.target;
+ info(v.name + " GOT EVENT " + event.type +
+ " currentTime=" + v.currentTime +
+ " paused=" + v.paused +
+ " ended=" + v.ended +
+ " readyState=" + v.readyState);
+}
+
+var events = ["timeupdate", "seeking", "seeked", "ended", "playing", "pause"];
+for (var i = 0; i < events.length; ++i) {
+ v.addEventListener(events[i], dumpEvent, false);
+}
+
+function isWithinEps(a, b, msg) {
+ ok(Math.abs(a - b) < 0.01,
+ "Got " + a + ", expected " + b + "; " + msg);
+}
+
+function isGreaterThanOrEqualEps(a, b, msg) {
+ ok(a >= b - 0.01,
+ "Got " + a + ", expected at least " + b + "; " + msg);
+}
+
+function startTest(test) {
+ var seekTime = test.duration/2;
+
+ function endedAfterReplay() {
+ isGreaterThanOrEqualEps(v.currentTime, test.duration, "checking v.currentTime at third 'ended' event");
+ isGreaterThanOrEqualEps(vout.currentTime, (test.duration - seekTime) + test.duration*2,
+ "checking vout.currentTime after seeking, playing through and reloading");
+ SimpleTest.finish();
+ };
+
+ function endedAfterSeek() {
+ isGreaterThanOrEqualEps(v.currentTime, test.duration, "checking v.currentTime at second 'ended' event");
+ isGreaterThanOrEqualEps(vout.currentTime, (test.duration - seekTime) + test.duration,
+ "checking vout.currentTime after seeking and playing through again");
+ v.removeEventListener("ended", endedAfterSeek, false);
+ v.addEventListener("ended", endedAfterReplay, false);
+ v.src = test.name + "?1";
+ v.play();
+ };
+
+ function seeked() {
+ isGreaterThanOrEqualEps(v.currentTime, seekTime, "Finished seeking");
+ isGreaterThanOrEqualEps(vout.currentTime, test.duration,
+ "checking vout.currentTime has not changed after seeking");
+ v.removeEventListener("seeked", seeked, false);
+ function dontPlayAgain() {
+ ok(false, "vout_untilended should not play again");
+ }
+ vout_untilended.addEventListener("playing", dontPlayAgain, false);
+ vout_untilended.addEventListener("ended", dontPlayAgain, false);
+ v.addEventListener("ended", endedAfterSeek, false);
+ v.play();
+ };
+
+ function ended() {
+ // Don't compare current time until both v and vout_untilended are ended,
+ // otherwise, current time could be smaller than the duration.
+ if (!v.ended || !vout_untilended.ended) {
+ return;
+ }
+
+ isGreaterThanOrEqualEps(vout.currentTime, test.duration, "checking vout.currentTime at first 'ended' event");
+ isGreaterThanOrEqualEps(v.currentTime, test.duration, "checking v.currentTime at first 'ended' event");
+ is(vout.ended, false, "checking vout has not ended");
+ is(vout_untilended.ended, true, "checking vout_untilended has actually ended");
+
+ v.removeEventListener("ended", ended, false);
+ vout_untilended.removeEventListener("ended", ended, false);
+
+ v.pause();
+ v.currentTime = seekTime;
+ v.addEventListener("seeked", seeked, false);
+ };
+
+ v.addEventListener("ended", ended, false);
+ vout_untilended.addEventListener("ended", ended, false);
+
+ function checkNoEnded() {
+ ok(false, "ended event received unexpectedly");
+ };
+
+ vout.addEventListener("ended", checkNoEnded, false);
+
+ v.src = test.name;
+ v.name = test.name;
+ v.preload = "metadata";
+
+ function loadedmetadata() {
+ vout.srcObject = v.mozCaptureStream();
+ vout.play();
+
+ vout_untilended.srcObject = v.mozCaptureStreamUntilEnded();
+ vout_untilended.play();
+
+ v.play();
+ };
+
+ v.addEventListener("loadedmetadata", loadedmetadata, {once: true});
+}
+
+var testVideo = getPlayableVideo(gSmallTests);
+if (testVideo) {
+ startTest(testVideo);
+} else {
+ todo(false, "No playable video");
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_gc.html b/dom/media/test/test_streams_gc.html
new file mode 100644
index 000000000..e7a356099
--- /dev/null
+++ b/dom/media/test/test_streams_gc.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test garbage collection of captured stream (bug 806754)</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="doTest()">
+<audio id="a" preload="metadata"></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var a = document.getElementById('a');
+a.src = getPlayableAudio(gSmallTests).name;
+
+function forceGC() {
+ SpecialPowers.gc();
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+}
+
+function doTest() {
+ a.mozCaptureStreamUntilEnded();
+
+ a.addEventListener("seeked", function() {
+ a.play();
+
+ a.addEventListener("play", function() {
+ a.addEventListener("ended", function() {
+ ok(true, "GC completed OK");
+ SimpleTest.finish();
+ }, false);
+ }, false);
+ }, false);
+
+ a.currentTime = a.duration;
+ setTimeout(forceGC, 0);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_individual_pause.html b/dom/media/test/test_streams_individual_pause.html
new file mode 100644
index 000000000..a6abc65ff
--- /dev/null
+++ b/dom/media/test/test_streams_individual_pause.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for bug 1073406. Pausing a video element should not pause another playing the same stream.</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<video id="video1" autoplay></video>
+<video id="video2" autoplay></video>
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var getVideoImagePixelData = function(v) {
+ var canvas = document.createElement("canvas");
+ var ctx = canvas.getContext("2d");
+ ctx.drawImage(v, 0, 0);
+ var imgData = ctx.getImageData(canvas.width/2, canvas.height/2, 1, 1).data;
+ return "r" + imgData[0] +
+ "g" + imgData[1] +
+ "b" + imgData[2] +
+ "a" + imgData[3];
+}
+
+// This test does not appear to work with the "Dummy video source" provided on
+// linux through the "media.video_loopback_dev" pref in the tree test environment.
+// We force a stream always by requesting `fake: true` here.
+
+navigator.mozGetUserMedia({video: true, fake: true },
+ function(stream) {
+ var stream = stream;
+ var video1 = document.getElementById('video1');
+ var video2 = document.getElementById('video2');
+
+ var src = URL.createObjectURL(stream);
+ video1.src = src;
+ video2.src = src;
+
+ video1.onplaying = () => video1.pause();
+
+ var v1PausedImageData;
+ var v2PausedImageData;
+
+ video1.onpause = function() {
+ v1PausedImageData = getVideoImagePixelData(video1);
+ v2PausedImageData = getVideoImagePixelData(video2);
+ v2TimesToTest = 3;
+ video2.ontimeupdate = function() {
+ if (getVideoImagePixelData(video2) === v2PausedImageData) {
+ // Wait until video2 has progressed it's video.
+ // If it doesn't, we'll time out and fail.
+ info("video2 has not progressed. Waiting.");
+ return;
+ }
+
+ if (--v2TimesToTest > 0) {
+ // Wait for a while to be sure video1 would have gotten a frame
+ // if it is playing.
+ info("video2 progressed OK");
+ return;
+ }
+
+ video2.ontimeupdate = null;
+ ok(true, "video2 is playing");
+ isnot(video1.currentTime, video2.currentTime,
+ "v1 and v2 should not be at the same currentTime");
+ is(v1PausedImageData, getVideoImagePixelData(video1),
+ "video1 video frame should not have updated since video1 paused");
+ SimpleTest.finish();
+ };
+ };
+}, function(error) {
+ ok(false, "getUserMedia should not fail, got " + error.name);
+ SimpleTest.finish();
+});
+</script>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_srcObject.html b/dom/media/test/test_streams_srcObject.html
new file mode 100644
index 000000000..a5a4205cd
--- /dev/null
+++ b/dom/media/test/test_streams_srcObject.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test interactions of src and srcObject</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body onload="doTests()">
+<audio id="a1"></audio>
+<audio id="a2"></audio>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var doTest = srcObject => new Promise(resolve => {
+ var a = document.getElementById('a1');
+ a.src = getPlayableAudio(gSmallTests).name;
+ var b = new Audio();
+
+ var newSrc = a.src + "?2";
+ b.src = newSrc;
+ is(b[srcObject], null, "Initial srcObject is null");
+ var stream = a.mozCaptureStream();
+ b[srcObject] = stream;
+ is(b[srcObject], stream, "Stream set correctly");
+ try {
+ b[srcObject] = "invalid";
+ ok(false, "Setting srcObject to an invalid value should throw.");
+ } catch (e) {
+ ok(e instanceof TypeError, "Exception should be a TypeError");
+ }
+ is(b[srcObject], stream, "Stream not set to invalid value");
+ is(b.src, newSrc, "src attribute not affected by setting srcObject");
+ var step = 0;
+ b.addEventListener("loadedmetadata", function() {
+ if (step == 0) {
+ is(b.currentSrc, "", "currentSrc set to empty string while playing srcObject");
+ b[srcObject] = null;
+ is(b[srcObject], null, "Stream set to null");
+ // The resource selection algorithm will run again and choose b.src
+ } else if (step == 1) {
+ is(b.currentSrc, b.src, "currentSrc set to src now that srcObject is null");
+ resolve();
+ }
+ ++step;
+ });
+ a.play();
+ b.play();
+});
+
+// TODO: remove prefixed version soon (1183495).
+
+var doTests = () => doTest("srcObject").then(() => doTest("mozSrcObject"))
+ .catch(e => ok(false, "Unexpected error: " + e))
+ .then(() => SimpleTest.finish())
+ .catch(e => ok(false, "Coding error: " + e));
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_streams_tracks.html b/dom/media/test/test_streams_tracks.html
new file mode 100644
index 000000000..4157f25d5
--- /dev/null
+++ b/dom/media/test/test_streams_tracks.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaStreamTrack interfaces</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+function testTracks(tracks, hasTrack, kind, src) {
+ is(tracks.length, hasTrack ? 1 : 0, "Correct track count for " + src);
+ for (var i = 0; i < tracks.length; ++i) {
+ var track = tracks[i];
+ is(track.kind, kind, "Correct track kind for track " + i + " of " + src);
+ var id = track.id;
+ ok(/\{........-....-....-....-............\}/.test(track.id),
+ "id " + track.id + " for track " + i + " of " + src + " has correct form");
+ }
+}
+
+function onended(e) {
+ var t = e.target;
+ var audioTracks = t.stream.getAudioTracks();
+ var videoTracks = t.stream.getVideoTracks();
+
+ testTracks(audioTracks, t.test.hasAudio, "audio", t.src);
+ testTracks(videoTracks, t.test.hasVideo, "video", t.src);
+
+ manager.finished(t.token);
+}
+
+function startTest(test, token) {
+ var element = document.createElement("video");
+
+ element.token = token;
+ manager.started(token);
+
+ element.src = test.name;
+ element.test = test;
+ element.stream = element.mozCaptureStreamUntilEnded();
+ element.addEventListener("ended", onended, false);
+
+ element.play();
+}
+
+manager.runTests(gTrackTests, startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_temporary_file_blob_video_plays.html b/dom/media/test/test_temporary_file_blob_video_plays.html
new file mode 100644
index 000000000..c1c1867e7
--- /dev/null
+++ b/dom/media/test/test_temporary_file_blob_video_plays.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaRecorder Recording canvas stream</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="/tests/dom/canvas/test/captureStream_common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<div id="content">
+</div>
+<script class="testbody" type="text/javascript">
+
+function startTest() {
+ var canvas = document.createElement("canvas");
+ canvas.width = canvas.height = 100;
+ document.getElementById("content").appendChild(canvas);
+
+ var helper = new CaptureStreamTestHelper2D(100, 100);
+ helper.drawColor(canvas, helper.red);
+
+ var stream = canvas.captureStream(0);
+
+ var blob;
+
+ mediaRecorder = new MediaRecorder(stream);
+ is(mediaRecorder.stream, stream,
+ "Media recorder stream = canvas stream at the start of recording");
+
+ mediaRecorder.onwarning = () => ok(false, "warning unexpectedly fired");
+
+ mediaRecorder.onerror = () => ok(false, "Recording failed");
+
+ mediaRecorder.ondataavailable = ev => {
+ is(blob, undefined, "Should only get one dataavailable event");
+ blob = ev.data;
+ };
+
+ mediaRecorder.onstart = () => {
+ info("Got 'start' event");
+ // We just want one frame encoded, to see that the recorder produces something readable.
+ mediaRecorder.stop();
+ };
+
+ mediaRecorder.onstop = () => {
+ info("Got 'stop' event");
+ ok(blob, "Should have gotten a data blob");
+
+ var video = document.createElement("video");
+ video.id = "recorded-video";
+ video.src = URL.createObjectURL(blob);
+ video.play();
+ video.onerror = err => {
+ ok(false, "Should be able to play the recording. Got error. code=" + video.error.code);
+ SimpleTest.finish();
+ };
+ document.getElementById("content").appendChild(video);
+ helper.waitForPixelColor(video, helper.red, 128, "Should become red")
+ .then(SimpleTest.finish);
+ };
+
+ mediaRecorder.start();
+ is(mediaRecorder.state, "recording", "Media recorder should be recording");
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({set:[["media.recorder.max_memory", 1]]}, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttrack.html b/dom/media/test/test_texttrack.html
new file mode 100644
index 000000000..f40552c6d
--- /dev/null
+++ b/dom/media/test/test_texttrack.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=833386
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 833386 - TextTrackList</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]},
+ function() {
+ var video = document.createElement("video");
+
+ isnot(video.textTracks, undefined, "HTMLMediaElement::TextTrack() property should be available.")
+
+ var trackList = video.textTracks;
+ is(trackList.length, 0, "Length should be 0.");
+
+ ok(typeof video.addTextTrack == "function", "HTMLMediaElement::AddTextTrack() function should be available.")
+ video.addTextTrack("subtitles", "third", "en-CA");
+ is(trackList.length, 1, "Length should be 1.");
+
+ var textTrack = video.textTracks[0];
+ is(textTrack.label, "third", "Label should be set to third.");
+ is(textTrack.language, "en-CA", "Language should be en-CA.");
+ is(textTrack.kind, "subtitles", "Default kind should be subtitles.");
+ is(textTrack.mode, "hidden", "Default mode should be hidden.");
+
+ // Mode should not allow a bogus value.
+ textTrack.mode = 'bogus';
+ is(textTrack.mode, 'hidden', "Mode should be not allow a bogus value.");
+
+ // Should allow all these values for mode.
+ checkMode("showing", "Mode should allow \"showing\"");
+ checkMode("disabled", "Mode should allow \"disabled\"");
+ checkMode("hidden", "Mode should allow \"hidden\"");
+
+ // All below are read-only properties and so should not allow setting.
+ textTrack.label = "French subtitles";
+ is(textTrack.label, "third", "Label is read-only so should still be \"label\".");
+
+ textTrack.language = "en";
+ is(textTrack.language, "en-CA", "Language is read-only so should still be \"en-CA\".");
+
+ textTrack.kind = "captions";
+ is(textTrack.kind, "subtitles", "Kind is read-only so should still be \"subtitles\"");
+
+ function checkMode(value, message) {
+ textTrack.mode = value;
+ is(textTrack.mode, value, message);
+ }
+
+ // Insert some tracks in an order that is not sorted, we will test if they
+ // are sorted later.
+ var trackOne = document.createElement("track");
+ trackOne.label = "first";
+ trackOne.src = "basic.vtt";
+ trackOne.default = true;
+ trackOne.id = "2";
+ video.appendChild(trackOne);
+
+ video.addTextTrack("subtitles", "fourth", "en-CA");
+
+ var trackTwo = document.createElement("track");
+ trackTwo.label = "second";
+ trackTwo.src = "basic.vtt";
+ trackTwo.default = true;
+ video.appendChild(trackTwo);
+
+ video.src = "seek.webm";
+ video.preload = "metadata";
+
+ document.getElementById("content").appendChild(video);
+
+ video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackOne.readyState == 1 || trackTwo.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+ is(trackOne.readyState, 2, "First Track::ReadyState should be set to LOADED.");
+ is(trackTwo.readyState, 2, "Second Track::ReadyState should be set to LOADED.");
+
+ // We're testing two things here, firstly that tracks created from a track
+ // element have a default mode 'disabled' and tracks created with the
+ // 'addTextTrack' method have a default mode of 'hidden'.
+ // Secondly we're testing that the tracks are sorted properly.
+ // For the tracks to be sorted the first two tracks, added through a
+ // TrackElement, must occupy the first two indexes in their TrackElement
+ // tree order. The second two tracks, added through the 'addTextTrack'
+ // method, will occupy the last two indexes in the order that they were
+ // added in.
+ var trackData = [
+ { label: "first", mode: "showing", id: "2" },
+ { label: "second", mode: "disabled", id: "" },
+ { label: "third", mode: "hidden", id: "" },
+ { label: "fourth", mode: "hidden", id: "" }
+ ];
+ is(video.textTracks.length, trackData.length, "TextTracks length should be " + trackData.length);
+ for (var i = 0; i < trackData.length; i++) {
+ var track = video.textTracks[i];
+ isnot(track, null, "Video should have a text track at index " + i);
+ var info = trackData[i];
+ for (var key in info) {
+ is(track[key], info[key], "Track at index " + i + " should have a '" + key + "'' property " +
+ "with a value of '" + info[key] + "'.");
+ }
+ }
+ SimpleTest.finish();
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttrack_moz.html b/dom/media/test/test_texttrack_moz.html
new file mode 100644
index 000000000..0b319746a
--- /dev/null
+++ b/dom/media/test/test_texttrack_moz.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=881976
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 881976 - TextTrackCue Computed Position</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+ SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]},
+ function() {
+ var video = document.createElement("video");
+
+ // Check if adding a text track manually sets the TextTrackList correctly.
+
+ // HTMLTrackElement.textTrackList is an extension available only to
+ // privileged code, so we need to access it through the SpecialPowers
+ // object.
+ video.addTextTrack("subtitles", "", "");
+ is(SpecialPowers.unwrap(SpecialPowers.wrap(video.textTracks[0]).textTrackList),
+ video.textTracks,
+ "The Track's TextTrackList should be the Video's TextTrackList.");
+
+
+ // Check if loading a Track via a TrackElement sets the TextTrackList correctly.
+ video.src = "seek.webm";
+ video.preload = "auto";
+
+ var trackElement = document.createElement("track");
+ trackElement.src = "basic.vtt";
+ trackElement.kind = "subtitles";
+
+ video.appendChild(trackElement);
+ document.getElementById("content").appendChild(video);
+
+ video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == HTMLTrackElement.LOADING) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+ is(trackElement.readyState, HTMLTrackElement.LOADED,
+ "Track::ReadyState should be set to LOADED.");
+ is(SpecialPowers.unwrap(SpecialPowers.wrap(trackElement.track).textTrackList),
+ video.textTracks,
+ "TrackElement's Track's TextTrackList should be the Video's TextTrackList.");
+
+ SimpleTest.finish();
+ });
+ }
+ );
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttrackcue.html b/dom/media/test/test_texttrackcue.html
new file mode 100644
index 000000000..bfb109ea6
--- /dev/null
+++ b/dom/media/test/test_texttrackcue.html
@@ -0,0 +1,269 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=833386
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 833386 - HTMLTrackElement</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]},
+ function() {
+ var video = document.createElement("video");
+ video.src = "seek.webm";
+ video.preload = "metadata";
+
+ var trackElement = document.createElement("track");
+ trackElement.src = "basic.vtt";
+ trackElement.kind = "subtitles";
+
+ document.getElementById("content").appendChild(video);
+ video.appendChild(trackElement);
+ video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+ // Set mode to hidden so that the active cue lists are being updated.
+ trackElement.track.mode = "hidden";
+
+ var cueList = trackElement.track.cues;
+ is(cueList.length, 6, "Cue list length should be 6.");
+
+ // Check that the typedef of TextTrackCue works in Gecko.
+ isnot(window.TextTrackCue, undefined, "TextTrackCue should be defined.");
+ isnot(window.VTTCue, undefined, "VTTCue should be defined.");
+
+ // Check if first cue was parsed correctly.
+ var cue = cueList[0];
+ ok(cue instanceof TextTrackCue, "Cue should be an instanceof TextTrackCue.");
+ ok(cue instanceof VTTCue, "Cue should be an instanceof VTTCue.");
+ is(cue.id, "1", "Cue's ID should be 1.");
+ is(cue.startTime, 0.5, "Cue's start time should be 0.5.");
+ is(cue.endTime, 0.7, "Cue's end time should be 0.7.");
+ is(cue.pauseOnExit, false, "Cue's pause on exit flag should be false.");
+ is(cue.text, "This", "Cue's text should be set correctly.");
+ is(cue.track, trackElement.track, "Cue's track should be defined.");
+
+ cue.track = null;
+ isnot(cue.track, null, "Cue's track should not be able to be set.");
+
+ // Check that all cue times were not rounded
+ is(cueList[1].startTime, 1.2, "Second cue's start time should be 1.2.");
+ is(cueList[1].endTime, 2.4, "Second cue's end time should be 2.4.");
+ is(cueList[2].startTime, 2, "Third cue's start time should be 2.");
+ is(cueList[2].endTime, 3.5, "Third cue's end time should be 3.5.");
+ is(cueList[3].startTime, 2.71, "Fourth cue's start time should be 2.71.");
+ is(cueList[3].endTime, 2.91, "Fourth cue's end time should be 2.91.");
+ is(cueList[4].startTime, 3.217, "Fifth cue's start time should be 3.217.");
+ is(cueList[4].endTime, 3.989, "Fifth cue's end time should be 3.989.");
+ is(cueList[5].startTime, 3.217, "Sixth cue's start time should be 3.217.");
+ is(cueList[5].endTime, 3.989, "Sixth cue's end time should be 3.989.");
+
+ // Check that Cue setters are working correctly.
+ cue.id = "Cue 01";
+ is(cue.id, "Cue 01", "Cue's ID should be 'Cue 01'.");
+ cue.startTime = 0.51;
+ is(cue.startTime, 0.51, "Cue's start time should be 0.51.");
+ cue.endTime = 0.71;
+ is(cue.endTime, 0.71, "Cue's end time should be 0.71.");
+ cue.pauseOnExit = true;
+ is(cue.pauseOnExit, true, "Cue's pause on exit flag should be true.");
+ video.addEventListener("pause", function pauseOnExit() {
+ video.removeEventListener("pause", pauseOnExit, false);
+ video.play();
+ });
+
+ var exceptionHappened;
+ function checkPercentageValue(prop, initialVal) {
+ ok(prop in cue, prop + " should be a property on VTTCue.");
+ cue[prop] = initialVal;
+ is(cue[prop], initialVal, "Cue's " + prop + " should initially be " + initialVal);
+ [ 101, -1 ].forEach(function(val) {
+ exceptionHappened = false;
+ try {
+ cue[prop] = val;
+ } catch(e) {
+ exceptionHappened = true;
+ is(e.name, "IndexSizeError", "Should have thrown IndexSizeError.");
+ }
+ ok(exceptionHappened, "Exception should have happened.");
+ });
+ }
+
+ checkPercentageValue("size", 100.0);
+ cue.size = 50.5;
+ is(cue.size, 50.5, "Cue's size should be 50.5.")
+
+ // Check cue.position
+ checkPercentageValue("position", "auto");
+ cue.position = 50.5;
+ is(cue.position, 50.5, "Cue's position value should now be 50.5.");
+
+ ok(cue.snapToLines, "Cue's snapToLines should be set by set.");
+ cue.snapToLines = false;
+ ok(!cue.snapToLines, "Cue's snapToLines should not be set.");
+
+ function checkEnumValue(prop, initialVal, acceptedValues) {
+ ok(prop in cue, prop + " should be a property on VTTCue.");
+ is(cue[prop], initialVal, "Cue's " + prop + " should be " + initialVal);
+ cue[prop] = "bogus";
+ is(cue[prop], initialVal, "Cue's " + prop + " should be " + initialVal);
+ acceptedValues.forEach(function(val) {
+ cue[prop] = val;
+ is(cue[prop], val, "Cue's " + prop + " should be " + val);
+ if (typeof val === "string") {
+ cue[prop] = val.toUpperCase();
+ is(cue[prop], val, "Cue's " + prop + " should be " + val);
+ }
+ });
+ }
+
+ checkEnumValue("align", "center", [ "start", "left", "center", "right", "end" ]);
+ checkEnumValue("lineAlign", "start", [ "start", "center", "end" ]);
+ checkEnumValue("vertical", "", [ "", "lr", "rl" ]);
+
+ cue.lineAlign = "center";
+ is(cue.lineAlign, "center", "Cue's line align should be center.");
+ cue.lineAlign = "START";
+ is(cue.lineAlign, "center", "Cue's line align should be center.");
+ cue.lineAlign = "end";
+ is(cue.lineAlign, "end", "Cue's line align should be end.");
+
+ // Check that cue position align works properly
+ is(cue.positionAlign, "center", "Cue's default position alignment should be center.");
+
+ cue.positionAlign = "line-left";
+ is(cue.positionAlign, "line-left", "Cue's position align should be line-left.");
+ cue.positionAlign = "auto";
+ is(cue.positionAlign, "auto", "Cue's position align should be auto.");
+ cue.positionAlign = "line-right";
+ is(cue.positionAlign, "line-right", "Cue's position align should be line-right.");
+
+ // Check cue.line
+ is(cue.line, "auto", "Cue's line value should initially be auto.");
+ cue.line = 0.5;
+ is(cue.line, 0.5, "Cue's line value should now be 0.5.");
+ cue.line = "auto";
+ is(cue.line, "auto", "Cue's line value should now be auto.");
+
+ // Check that we can create and add new VTTCues
+ var vttCue = new VTTCue(3.999, 4, "foo");
+ is(vttCue.track, null, "Cue's track should be null.");
+ trackElement.track.addCue(vttCue);
+ is(cue.track, trackElement.track, "Cue's track should be defined.");
+ is(cueList.length, 7, "Cue list length should now be 7.");
+
+ // Check that new VTTCue was added correctly
+ cue = cueList[6];
+ is(cue.startTime, 3.999, "Cue's start time should be 3.999.");
+ is(cue.endTime, 4, "Cue's end time should be 4.");
+ is(cue.text, "foo", "Cue's text should be foo.");
+
+ // Adding the same cue again should not increase the cue count.
+ trackElement.track.addCue(vttCue);
+ is(cueList.length, 7, "Cue list length should be 7.");
+
+ // Check that we are able to remove cues.
+ trackElement.track.removeCue(cue);
+ is(cueList.length, 6, "Cue list length should be 6.");
+
+ exceptionHappened = false;
+ try {
+ // We should not be able to remove a cue that is not in the list.
+ cue = new VTTCue(1, 2, "foo");
+ trackElement.track.removeCue(cue);
+ } catch (e) {
+ // "NotFoundError" should be thrown when trying to remove a cue that is
+ // not in the list.
+ is(e.name, "NotFoundError", "Should have thrown NotFoundError.");
+ exceptionHappened = true;
+ }
+ // If this is false then we did not throw an error and probably removed a cue
+ // when we shouln't have.
+ ok(exceptionHappened, "Exception should have happened.");
+
+ is(cueList.length, 6, "Cue list length should be 6.");
+
+ video.currentTime = 2;
+ isnot(trackElement.track.activeCues, null);
+
+ trackElement.track.mode = "disabled";
+ is(trackElement.track.activeCues, null);
+
+ trackElement.track.mode = "showing";
+ video.currentTime = 0;
+
+ var regionInfo = [
+ { lines: 2, width: 30 },
+ { lines: 4, width: 20 },
+ { lines: 2, width: 30 }
+ ];
+
+ for (var i = 0; i < regionInfo.length; i++) {
+ var cue = cueList[i];
+ isnot(cue.region, null, "Cue at " + i + " should have a region.");
+ for (var key in regionInfo[i]) {
+ is(cue.region[key], regionInfo[i][key], "Region should have a " + key +
+ " property with a value of " + regionInfo[i][key])
+ }
+ }
+
+ // Test TextTrack::ActiveCues.
+ var cueInfo = [
+ { startTime: 0.51, endTime: 0.71, ids: ["Cue 01"] },
+ { startTime: 0.72, endTime: 1.19, ids: [] },
+ { startTime: 1.2, endTime: 1.9, ids: [2] },
+ { startTime: 2, endTime: 2.4, ids: [2, 2.5] },
+ { startTime: 2.41, endTime: 2.70, ids: [2.5] },
+ { startTime: 2.71, endTime: 2.91, ids: [2.5, 3] },
+ { startTime: 2.92, endTime: 3.216, ids: [2.5] },
+ { startTime: 3.217, endTime: 3.5, ids: [2.5, 4, 5] },
+ { startTime: 3.51, endTime: 3.989, ids: [4, 5] },
+ { startTime: 3.99, endTime: 4, ids: [] }
+ ];
+
+ video.addEventListener("timeupdate", function() {
+ var activeCues = trackElement.track.activeCues,
+ found = false,
+ playbackTime = video.currentTime;
+
+ for (var i = 0; i < cueInfo.length; i++) {
+ var cue = cueInfo[i];
+ if (playbackTime >= cue.startTime && playbackTime <= cue.endTime) {
+ is(activeCues.length, cue.ids.length, "There should be " + cue.ids.length + " currently active cue(s).");
+ for (var j = 0; j < cue.ids.length; j++) {
+ isnot(activeCues.getCueById(cue.ids[j]), undefined, "The cue with ID " + cue.ids[j] + " should be active.");
+ }
+ break;
+ }
+ }
+ });
+
+ video.addEventListener("ended", function(){
+ SimpleTest.finish();
+ });
+
+ video.play();
+ });
+ }
+);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttrackcue_moz.html b/dom/media/test/test_texttrackcue_moz.html
new file mode 100644
index 000000000..97f8b9120
--- /dev/null
+++ b/dom/media/test/test_texttrackcue_moz.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=967157
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 967157 - Setting TextTrackCue::DisplayState should set TextTrackCue::HasBeenReset to false</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ var cue = SpecialPowers.wrap(new VTTCue(0, 1, "Some text."));
+ is(cue.hasBeenReset, false, "Cue's hasBeenReset flag should be false.");
+ is(cue.displayState, null, "Cue's displayState should be null.");
+
+ cue.startTime = 0.5;
+ is(cue.hasBeenReset, true, "Cue's hasBeenReset flag should now be true.");
+
+ cue.displayState = document.createElement("div");
+ is(cue.hasBeenReset, false, "Cue's hasBeenReset flag should now be false.");
+
+ SimpleTest.finish();
+</script>
+</body>
+</html>
diff --git a/dom/media/test/test_texttrackevents_video.html b/dom/media/test/test_texttrackevents_video.html
new file mode 100644
index 000000000..b187a91dc
--- /dev/null
+++ b/dom/media/test/test_texttrackevents_video.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Tests for TextTrack DOM Events</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+video.src = "vp9cake.webm";
+video.preload = "auto";
+video.controls = true;
+var trackElement = document.createElement("track");
+trackElement.src = "sequential.vtt";
+trackElement.kind = "subtitles";
+trackElement.default = true;
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+
+var trackElementCueChangeCount = 0;
+var trackCueChangeCount = 0;
+var cueEnterCount = 0;
+var cueExitCount = 0;
+
+video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-queue run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ return setTimeout(run_tests, 0);
+ }
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+ ok('oncuechange' in trackElement.track, "Track::OnCueChange should exist.");
+
+ var textTrack = trackElement.track;
+ is(textTrack.cues.length, 3, "textTrack.cues.length should 3.");
+ textTrack.cues[0].onenter = function() {
+ ++cueEnterCount;
+ };
+ textTrack.cues[0].onexit = function() {
+ ++cueExitCount;
+ };
+ textTrack.cues[1].onenter = function() {
+ ++cueEnterCount;
+ };
+ textTrack.cues[1].onexit = function() {
+ ++cueExitCount;
+ };
+ textTrack.cues[2].onenter = function() {
+ ++cueEnterCount;
+ };
+ textTrack.cues[2].onexit = function() {
+ ++cueExitCount;
+ };
+
+ trackElement.track.oncuechange = function() {
+ ++trackElementCueChangeCount;
+ };
+
+ trackElement.addEventListener("cuechange", function() {
+ ++trackCueChangeCount;
+ });
+
+ video.play();
+});
+
+video.addEventListener('ended', function() {
+ // Should be fired 1 to 6 times, as there are 3 cues,
+ // with a change event for when it is activated/deactivated
+ // (6 events at most).
+ isnot(trackElementCueChangeCount, 0, "TrackElement should fire cue change at least one time.");
+ ok(trackElementCueChangeCount <= 6, 'trackElementCueChangeCount should <= 6');
+ isnot(trackCueChangeCount, 0, "TrackElement.track should fire cue change at least one time.");
+ ok(trackCueChangeCount <= 6, 'trackCueChangeCount should <= 6');
+ is(cueEnterCount, 3, "cueEnterCount should fire three times.");
+ is(cueExitCount, 3, "cueExitCount should fire three times.");
+ SimpleTest.finish()
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttracklist.html b/dom/media/test/test_texttracklist.html
new file mode 100644
index 000000000..a9f41ed06
--- /dev/null
+++ b/dom/media/test/test_texttracklist.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=882703
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Media test: TextTrackList change event</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+video = document.createElement("video");
+
+isnot(video.textTracks, null, "Video should have a list of TextTracks.");
+
+video.addTextTrack("subtitles", "", "");
+
+track = video.textTracks[0];
+video.textTracks.addEventListener("change", changed);
+
+is(track.mode, "hidden", "New TextTrack's mode should be hidden.");
+track.mode = "showing";
+// Bug882674: change the mode again to see if we receive only one
+// change event.
+track.mode = "hidden";
+
+var eventCount = 0;
+function changed(event) {
+ eventCount++;
+ is(eventCount, 1, "change event dispatched multiple times.");
+ is(event.target, video.textTracks, "change event's target should be video.textTracks.");
+ ok(event instanceof window.Event, "change event should be a simple event.");
+ ok(!event.bubbles, "change event should not bubble.");
+ ok(event.isTrusted, "change event should be trusted.");
+ ok(!event.cancelable, "change event should not be cancelable.");
+
+ // Delay the finish function call for testing the change event count.
+ setTimeout(SimpleTest.finish, 0);
+}
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttracklist_moz.html b/dom/media/test/test_texttracklist_moz.html
new file mode 100644
index 000000000..e889f7910
--- /dev/null
+++ b/dom/media/test/test_texttracklist_moz.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=881976
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 881976 - TextTrackCue Computed Position</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+var trackList = video.textTracks;
+ok(trackList instanceof TextTrackList,
+ "Video's textTracks should be a TextTrackList");
+var trackParent = SpecialPowers.unwrap(
+ SpecialPowers.wrap(trackList).mediaElement
+);
+is(trackParent, video,
+ "Video's TextTrackList's MediaElement reference should be set to the video.");
+SimpleTest.finish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_texttrackregion.html b/dom/media/test/test_texttrackregion.html
new file mode 100644
index 000000000..57689b88a
--- /dev/null
+++ b/dom/media/test/test_texttrackregion.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=917945
+-->
+<head>
+ <meta charset='utf-8'>
+ <title>Test for Bug 917945 - VTTRegion</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]},
+ function() {
+ var video = document.createElement("video");
+ video.src = "seek.webm";
+ video.preload = "auto";
+
+ var trackElement = document.createElement("track");
+ trackElement.src = "region.vtt";
+ trackElement.kind = "subtitles";
+
+ document.getElementById("content").appendChild(video);
+ video.appendChild(trackElement);
+ video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+
+ // Set mode to hidden so that the active cue lists are being updated.
+ trackElement.track.mode = "hidden";
+
+ var cues = trackElement.track.cues;
+ is(cues.length, 1, "Cue list length should be 1.");
+
+ var region = cues[0].region;
+ isnot(region, null, "Region should not be null.");
+ is(region.width, 62, "Region width should be 50.");
+ is(region.lines, 5, "Region lines should be 5.");
+ is(region.regionAnchorX, 4, "Region regionAnchorX should be 4.");
+ is(region.regionAnchorY, 78, "Region regionAnchorY should be 78.");
+ is(region.viewportAnchorX, 10, "Region viewportAnchorX should be 10.");
+ is(region.viewportAnchorY, 90, "Region viewportAnchorY should be 90.");
+ is(region.scroll, "up", "Region scroll should be 'up'");
+
+ SimpleTest.finish();
+ });
+ }
+);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_timeupdate_small_files.html b/dom/media/test/test_timeupdate_small_files.html
new file mode 100644
index 000000000..9eac499e2
--- /dev/null
+++ b/dom/media/test/test_timeupdate_small_files.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=495319
+-->
+
+<head>
+ <title>Bug 495319 - playing back small audio files should fire timeupdate</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=495319">Mozilla Bug 495319</a>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function ended(e) {
+ var v = e.target;
+ ++v.counter["ended"];
+ is(v.counter["ended"], 1, v._name + " should see ended only once");
+ ok(v.counter["timeupdate"] > 0, v._name + " should see at least one timeupdate: " + v.currentTime);
+
+ // Rest event counters for we don't allow events after ended.
+ eventsToLog.forEach(function(e) {
+ v.counter[e] = 0;
+ });
+
+ // Finish the test after 500ms. We shouldn't receive any timeupdate events
+ // after the ended event, so this gives time for any pending timeupdate events
+ // to fire so we can ensure we don't regress behaviour.
+ setTimeout(
+ function() {
+ // Remove the event listeners before removing the video from the document.
+ // We should receive a timeupdate and pause event when we remove the element
+ // from the document (as the element is specified to behave as if pause() was
+ // invoked when it's removed from a document), and we don't want those
+ // confusing the test results.
+ v.removeEventListener("ended", ended, false);
+ eventsToLog.forEach(function(e) {
+ v.removeEventListener(e, logEvent, false);
+ });
+ removeNodeAndSource(v);
+ manager.finished(v.token);
+ },
+ 500);
+}
+
+var eventsToLog = ["play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
+ "loadeddata", "playing", "timeupdate", "error", "stalled", "emptied", "abort",
+ "waiting", "pause"];
+
+function logEvent(event) {
+ var v = event.target;
+ ++v.counter[event.type];
+ if (v.counter["ended"] > 0) {
+ is(v.counter[event.type], 0, v._name + " got unexpected " + event.type + " after ended");
+ }
+}
+
+function startTest(test, token) {
+ var type = getMajorMimeType(test.type);
+ var v = document.createElement(type);
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._name = test.name;
+
+ // Keep how many events received for each event type.
+ v.counter = {};
+ eventsToLog.forEach(function(e) {
+ v.addEventListener(e, logEvent, false);
+ v.counter[e] = 0;
+ });
+ v.addEventListener("ended", ended, false);
+ v.counter["ended"] = 0;
+ document.body.appendChild(v);
+ v.play();
+}
+
+manager.runTests(gSmallTests, startTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_trackelementevent.html b/dom/media/test/test_trackelementevent.html
new file mode 100644
index 000000000..18dbdfa93
--- /dev/null
+++ b/dom/media/test/test_trackelementevent.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for Bug 882677 - Implement the 'sourcing out of band text tracks' algorithm</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]},
+ function() {
+ var video = document.createElement("video");
+ video.src = "seek.webm";
+ video.preload = "auto";
+
+ var trackOne = document.createElement("track");
+ trackOne.src = "basic.vtt";
+ trackOne.kind = "subtitles";
+
+ var trackTwo = document.createElement("track");
+ trackTwo.src = "bad-signature.vtt";
+ trackTwo.kind = "captions";
+
+ var trackThree = document.createElement("track");
+ trackThree.src = "bad.vtt";
+ trackThree.kind = "chapters";
+
+ var events = 0;
+ function trackOneEvent() {
+ ok(true, "A load event for trackOne should have happened.");
+ events++ && events == 3 && SimpleTest.finish();
+ }
+ function trackTwoEvent() {
+ ok(true, "An error event for trackTwo should have happened.");
+ events++ && events == 3 && SimpleTest.finish();
+ }
+ function trackThreeEvent() {
+ ok(true, "An error event for trackThree should have happened.");
+ events++ && events == 3 && SimpleTest.finish();
+ }
+
+ function shouldNotBeCalled() {
+ ok(false, "Event should not have been called.");
+ }
+
+ trackOne.addEventListener("load", trackOneEvent);
+ trackOne.addEventListener("error", shouldNotBeCalled)
+ trackTwo.addEventListener("load", shouldNotBeCalled);
+ trackTwo.addEventListener("error", trackTwoEvent);
+ trackThree.addEventListener("load", shouldNotBeCalled);
+ trackThree.addEventListener("error", trackThreeEvent);
+
+ document.getElementById("content").appendChild(video);
+ video.appendChild(trackOne);
+ video.appendChild(trackTwo);
+ video.appendChild(trackThree);
+ }
+);
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_trackelementsrc.html b/dom/media/test/test_trackelementsrc.html
new file mode 100644
index 000000000..31f78ee7b
--- /dev/null
+++ b/dom/media/test/test_trackelementsrc.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1281418 - Change the src attribue for TrackElement.</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]},
+ function() {
+ var video = document.createElement("video");
+ video.src = "seek.webm";
+ video.preload = "metadata";
+ var trackElement = document.createElement("track");
+ trackElement.src = "basic.vtt";
+ trackElement.default = true;
+
+ document.getElementById("content").appendChild(video);
+ video.appendChild(trackElement);
+
+ video.addEventListener("loadedmetadata", function metadata() {
+ if (trackElement.readyState <= 1) {
+ return setTimeout(metadata, 0);
+ }
+ is(video.textTracks.length, 1, "Length should be 1.");
+ is(video.textTracks[0].cues.length, 6, "Cue length should be 6.");
+
+ trackElement.src = "sequential.vtt";
+ trackElement.track.mode = "showing";
+ video.play();
+ });
+
+ video.addEventListener("ended", function end() {
+ is(trackElement.readyState, 2, "readyState should be 2.")
+ is(video.textTracks.length, 1, "Length should be 1.");
+ is(video.textTracks[0].cues.length, 3, "Cue length should be 3.");
+ SimpleTest.finish();
+ });
+});
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_trackevent.html b/dom/media/test/test_trackevent.html
new file mode 100644
index 000000000..e09db8336
--- /dev/null
+++ b/dom/media/test/test_trackevent.html
@@ -0,0 +1,70 @@
+
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for Bug 893309 - Implement TrackEvent</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+isnot(video.textTracks, undefined, "HTMLMediaElement::TextTrack() property should be available.")
+ok(typeof video.addTextTrack == "function", "HTMLMediaElement::AddTextTrack() function should be available.")
+
+var trackList = video.textTracks;
+is(trackList.length, 0, "Length should be 0.");
+
+var evtTextTrack, numOfCalls = 0, tt;
+trackList.onaddtrack = function(event) {
+ ok(event instanceof TrackEvent, "Fired event from onaddtrack should be a TrackEvent");
+ is(event.type, "addtrack", "Event type should be addtrack");
+ ok(event.isTrusted, "Event should be trusted!");
+ ok(!event.bubbles, "Event shouldn't bubble!");
+ ok(!event.cancelable, "Event shouldn't be cancelable!");
+
+ evtTextTrack = event.track;
+ tt = textTrack[numOfCalls].track || textTrack[numOfCalls];
+
+ ok(tt === evtTextTrack, "Text tracks should be the same");
+ is(evtTextTrack.label, label[numOfCalls], "Label should be set to "+ label[numOfCalls]);
+ is(evtTextTrack.language, language[numOfCalls], "Language should be " + language[numOfCalls]);
+ is(evtTextTrack.kind, kind[numOfCalls], "Kind should be " + kind[numOfCalls]);
+
+ if (++numOfCalls == 4) {
+ SimpleTest.finish();
+ }
+};
+
+var label = ["Oasis", "Coldplay", "t.A.T.u", ""];
+language = ["en-CA", "en-GB", "ru", ""];
+kind = ["subtitles", "captions", "chapters", "subtitles"];
+
+var textTrack = new Array(4);
+for (var i = 0; i < 3; ++i) {
+ textTrack[i] = video.addTextTrack(kind[i], label[i], language[i]);
+ is(trackList.length, i + 1, "Length should be " + (i+1));
+}
+
+video.src = "seek.webm";
+video.preload = "auto";
+var trackElement = document.createElement("track");
+trackElement.src = "basic.vtt";
+textTrack[3] = trackElement;
+
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+
+//TODO: Tests for removetrack event to be added along with bug 882677
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/test/test_unseekable.html b/dom/media/test/test_unseekable.html
new file mode 100644
index 000000000..a1b8820b2
--- /dev/null
+++ b/dom/media/test/test_unseekable.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: unseekable</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/*
+
+Test that unseekable media can't be seeked. We load a media that shouldn't
+be seekable, and play through once. While playing through we repeatedly try
+to seek and check that nothing happens when we do. We also verify that the
+seekable ranges are empty.
+
+*/
+
+var manager = new MediaTestManager;
+
+var onseeking = function(event) {
+ var v = event.target;
+ v.actuallySeeked = true;
+};
+
+var onseeked = function(event) {
+ var v = event.target;
+ v.actuallySeeked = true;
+};
+
+var ontimeupdate = function(event) {
+ var v = event.target;
+
+ // Check that when we seek nothing happens.
+ var t = v.currentTime;
+ v.currentTime = v.currentTime /= 2;
+ ok(Math.abs(t - v.currentTime) < 0.01, "Current time shouldn't change when seeking in unseekable media: " + v.name);
+
+ // Check that the seekable ranges are empty.
+ is(v.seekable.length, 0, "Should have no seekable ranges in unseekable media: " + v.name);
+};
+
+var onended = function(event) {
+ var v = event.target;
+
+ // Remove the event listeners so that they can't run if there are any pending
+ // events.
+ v.removeEventListener("seeking", onseeking, false);
+ v.removeEventListener("seeked", onseeked, false);
+ v.removeEventListener("timeupdate", ontimeupdate, false);
+ v.removeEventListener("ended", onended, false);
+
+ v.src = "";
+ if (v.parentNode) {
+ v.parentNode.removeChild(v);
+ }
+
+ // Verify that none of the seeks we did in timeupdate actually seeked.
+ ok(!v.actuallySeeked, "Should not be able to seek in unseekable media: " + v.name);
+
+ manager.finished(v.token);
+}
+
+function startTest(test, token) {
+ var v = document.createElement('video');
+ manager.started(token);
+ v.name = test.name;
+ v.src = test.name;
+ v.token = token;
+ v.autoplay = "true";
+
+ v.actuallySeeked = false;
+
+ v.addEventListener("seeking", onseeking, false);
+ v.addEventListener("seeked", onseeked, false);
+ v.addEventListener("timeupdate", ontimeupdate, false);
+ v.addEventListener("ended", onended, false);
+
+ document.body.appendChild(v);
+}
+
+function canPlay(candidates) {
+ var v = document.createElement("video");
+ var resources = candidates.filter(function(x){return v.canPlayType(x.type);});
+ return (resources.length > 0);
+}
+
+if (canPlay(gUnseekableTests)) {
+ manager.runTests(gUnseekableTests, startTest);
+} else {
+ todo(false, "No files of supported format to test");
+}
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_videoDocumentTitle.html b/dom/media/test/test_videoDocumentTitle.html
new file mode 100644
index 000000000..c231582d3
--- /dev/null
+++ b/dom/media/test/test_videoDocumentTitle.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=463830
+-->
+<head>
+ <title>Test for Bug 463830</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=463830">Mozilla Bug 463830</a>
+<p id="display"></p>
+<iframe id="i"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 463830 **/
+
+var gTests = [
+ { file: "320x240.ogv", title: "320x240.ogv" },
+ { file: "bug461281.ogg", title: "bug461281.ogg" },
+];
+
+var gTestNum = 0;
+
+addLoadEvent(runTest);
+
+var title;
+var i = document.getElementById("i");
+
+function runTest() {
+ if (gTestNum == gTests.length) {
+ SimpleTest.finish();
+ return;
+ }
+ if (gTestNum == 0) {
+ i.addEventListener("load", function() {
+ is(i.contentDocument.title, title, "Doc title incorrect");
+ setTimeout(runTest, 0);
+ }, false);
+ }
+
+ title = gTests[gTestNum].title;
+ i.src = gTests[gTestNum].file;
+ gTestNum++;
+}
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_video_dimensions.html b/dom/media/test/test_video_dimensions.html
new file mode 100644
index 000000000..87a6a37cf
--- /dev/null
+++ b/dom/media/test/test_video_dimensions.html
@@ -0,0 +1,96 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that a video element has set video dimensions on loadedmetadata</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+var startTest = function(test, token) {
+ manager.started(token);
+ var v1 = document.createElement('video');
+ var v2 = document.createElement('video');
+ var vout = document.createElement('video');
+
+ // Avoid a race for hardware resources between v1 and v2 on platforms with
+ // a hardware decoder, like B2G.
+ v1.preload = 'none';
+ v2.preload = 'none';
+
+ var numVideoElementsFinished = 0;
+
+ var ondurationchange = function(ev) {
+ var v = ev.target;
+ info(v.testName + " got durationchange");
+ v.durationchange = true;
+ };
+ var onresize = function(ev) {
+ var v = ev.target;
+ info(v.testName + " got resize");
+ ok(!v.resize, v.testName + " should only fire resize once for same size");
+ v.resize = true;
+ ok(v.durationchange, v.testName +
+ " durationchange event should have been emitted before resize");
+ is(v.videoWidth, test.width, v.testName + " width should be set on resize");
+ is(v.videoHeight, test.height, v.testName + " height should be set on resize");
+ };
+ var onloadedmetadata = function(ev) {
+ var v = ev.target;
+ info(v.testName + " got loadedmetadata");
+ ok(!v.loadedmetadata, v.testName + " should only fire loadedmetadata once");
+ v.loadedmetadata = true;
+ ok(v.resize, v.testName +
+ " resize event should have been emitted before loadedmetadata");
+
+ numVideoElementsFinished += 1;
+ if (v === v1) {
+ removeNodeAndSource(v1);
+ v2.load();
+ }
+
+ if (v === v2) {
+ vout.src = URL.createObjectURL(v2.mozCaptureStreamUntilEnded());
+ v2.play();
+ vout.play();
+ }
+
+ if (numVideoElementsFinished === 3) {
+ removeNodeAndSource(v2);
+ removeNodeAndSource(vout);
+ manager.finished(token);
+ }
+ };
+ var setupElement = function(v, id) {
+ v.durationchange = false;
+ v.ondurationchange = ondurationchange;
+ v.resize = false;
+ v.onresize = onresize;
+ v.loadedmetadata = false;
+ v.onloadedmetadata = onloadedmetadata;
+ document.body.appendChild(v);
+ };
+
+ v1.testName = test.name;
+ v2.testName = test.name + " (Captured)";
+ vout.testName = test.name + " (Stream)";
+
+ v1.src = test.name;
+ v2.src = test.name;
+
+ setupElement(v1, "v1");
+ setupElement(v2, "v2");
+ setupElement(vout, "vout");
+
+ v1.play();
+};
+
+manager.runTests(getPlayableVideos(gSmallTests), startTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_video_in_audio_element.html b/dom/media/test/test_video_in_audio_element.html
new file mode 100644
index 000000000..45e6a8166
--- /dev/null
+++ b/dom/media/test/test_video_in_audio_element.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1060896
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1060896</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="text/javascript" src="manifest.js"></script>
+ <script type="application/javascript">
+
+ /**
+ * Test for Bug 1060896; tests that loading a video inside an audio element works.
+ **/
+
+ var manager = new MediaTestManager;
+
+ function error(event) {
+ var a = event.target;
+ ok(!a.mozHasAudio, "Media must've had no active tracks to play");
+ a.removeEventListener("error", error);
+ a.removeEventListener("ended", ended);
+ removeNodeAndSource(a);
+ manager.finished(a.token);
+ }
+
+ function ended(event) {
+ var a = event.target;
+ a.removeEventListener("error", error);
+ a.removeEventListener("ended", ended);
+ removeNodeAndSource(a);
+ manager.finished(a.token);
+ }
+
+ function initTest(test, token) {
+ var a = document.createElement('audio');
+ a.token = token;
+ manager.started(token);
+ a.autoplay = true;
+
+ a.addEventListener("error", error);
+ a.addEventListener("ended", ended);
+
+ a.src = test.name;
+ }
+
+ var videos = getPlayableVideos(gSmallTests);
+ // Bug 1216012, skip the test on emulator-kk.
+ if (getAndroidVersion() == 19) {
+ todo(false, "Test disabled on emulator-kk.");
+ } else {
+ manager.runTests(videos, initTest);
+ }
+
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1060896">Mozilla Bug 1060896</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_video_to_canvas.html b/dom/media/test/test_video_to_canvas.html
new file mode 100644
index 000000000..b4a9f3752
--- /dev/null
+++ b/dom/media/test/test_video_to_canvas.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=486646
+-->
+
+<head>
+ <title>Test for Bug 486646</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<script class="testbody" type="text/javascript">
+
+var manager = new MediaTestManager;
+
+function loaded(e) {
+ var v = e.target;
+ ok(v.readyState >= v.HAVE_CURRENT_DATA,
+ "readyState must be >= HAVE_CURRENT_DATA for " + v._name);
+
+ var canvas = document.createElement("canvas");
+ canvas.width = v.videoWidth;
+ canvas.height = v.videoHeight;
+ document.body.appendChild(canvas);
+ var ctx = canvas.getContext("2d");
+ try {
+ ctx.drawImage(v, 0, 0);
+ ok(true, "Shouldn't throw exception while drawing to canvas from video for " + v._name);
+ } catch (ex) {
+ ok(false, "Shouldn't throw exception while drawing to canvas from video for " + v._name);
+ }
+
+ v._finished = true;
+ v.parentNode.removeChild(v);
+ manager.finished(v.token);
+}
+
+function startTest(test, token) {
+ var type = getMajorMimeType(test.type);
+ if (type != "video")
+ return;
+
+ var v = document.createElement('video');
+ v.token = token;
+ manager.started(token);
+ v.src = test.name;
+ v._name = test.name;
+ v._finished = false;
+ v.autoplay = true;
+ v.style.display = "none";
+ v.addEventListener("ended", loaded, false);
+ document.body.appendChild(v);
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
+function beginTest() {
+ manager.runTests(gSmallTests, startTest);
+}
+
+</script>
+</pre>
+
+</body>
+</html>
diff --git a/dom/media/test/test_volume.html b/dom/media/test/test_volume.html
new file mode 100644
index 000000000..07f51f52a
--- /dev/null
+++ b/dom/media/test/test_volume.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Media test: volume attribute set</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+
+<video id='v1'></video><audio id='a1'></audio>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function test(element, value, shouldThrow) {
+ var threw = null;
+ try {
+ element.volume = value;
+ } catch (ex) {
+ threw = ex.name;
+ }
+ is(shouldThrow, threw, "Case: " +element.id+ " setVolume=" + value);
+}
+
+
+var ids = new Array(document.getElementById('v1'), document.getElementById('a1'));
+
+for (i=0; i<ids.length; i++) {
+ var element = ids[i];
+ test(element, 0.0, null);
+ test(element, 1.0, null);
+ test(element, -0.1, "IndexSizeError");
+ test(element, 1.1, "IndexSizeError");
+ test(element, undefined, "TypeError");
+ test(element, NaN, "TypeError");
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_vttparser.html b/dom/media/test/test_vttparser.html
new file mode 100644
index 000000000..b727080ef
--- /dev/null
+++ b/dom/media/test/test_vttparser.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='utf-8'>
+ <title>WebVTT Parser Regression Tests</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+video.src = "seek.webm";
+video.preload = "auto";
+
+var trackElement = document.createElement("track");
+trackElement.src = "parser.vtt";
+trackElement.kind = "subtitles";
+trackElement.default = true;
+
+document.getElementById("content").appendChild(video);
+video.appendChild(trackElement);
+video.addEventListener("loadedmetadata", function run_tests() {
+ // Re-que run_tests() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ setTimeout(run_tests, 0);
+ return;
+ }
+
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+ is(trackElement.track.cues.length, 2, "Track should have two Cues.");
+ SimpleTest.finish();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/test/test_wav_ended1.html b/dom/media/test/test_wav_ended1.html
new file mode 100644
index 000000000..7680e136f
--- /dev/null
+++ b/dom/media/test/test_wav_ended1.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Wave Media test: ended</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+// Test if the ended event works correctly.
+var endPassed = false;
+var completed = false;
+
+function startTest() {
+ if (completed)
+ return;
+ var v = document.getElementById('v');
+ v.play();
+}
+
+function playbackEnded() {
+ if (completed)
+ return;
+
+ var v = document.getElementById('v');
+ completed = true;
+ ok(v.currentTime >= 0.9 && v.currentTime <= 1.1,
+ "Checking currentTime at end: " + v.currentTime);
+ ok(v.ended, "Checking playback has ended");
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+<audio id='v'
+ onloadedmetadata='return startTest();'
+ onended='return playbackEnded();'>
+ <source type='audio/x-wav' src='r11025_s16_c1.wav'>
+</audio>
+</body>
+</html>
diff --git a/dom/media/test/test_wav_ended2.html b/dom/media/test/test_wav_ended2.html
new file mode 100644
index 000000000..44a6d9867
--- /dev/null
+++ b/dom/media/test/test_wav_ended2.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Wave Media test: ended and replaying</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<!-- try with autoplay and no v.play in starttest, also with both -->
+<pre id="test">
+<script class="testbody" type="text/javascript">
+// Test if audio can be replayed after ended.
+var completed = false;
+var playingCount = 0;
+var endCount = 0;
+
+function startTest() {
+ if (completed)
+ return;
+
+ var v = document.getElementById('v');
+ v.play();
+}
+
+function playbackStarted() {
+ if (completed)
+ return;
+
+ playingCount++;
+}
+
+function playbackEnded() {
+ if (completed)
+ return;
+
+ endCount++;
+ var v = document.getElementById('v');
+ ok(v.currentTime >= 0.9 && v.currentTime <= 1.1,
+ "Checking currentTime at end: " + v.currentTime);
+ ok(v.ended, "Checking playback has ended");
+ ok(playingCount > 0, "Expect at least one playing event");
+ playingCount = 0;
+ if (endCount < 2) {
+ v.play();
+ } else {
+ ok(endCount == 2, "Check playback after ended event");
+ completed = true;
+ SimpleTest.finish();
+ }
+}
+
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+<audio id='v'
+ onloadedmetadata='return startTest();'
+ onplaying='return playbackStarted();'
+ onended='return playbackEnded();'>
+ <source type='audio/x-wav' src='r11025_s16_c1.wav'>
+</audio>
+</body>
+</html>
diff --git a/dom/media/test/test_webvtt_empty_displaystate.html b/dom/media/test/test_webvtt_empty_displaystate.html
new file mode 100644
index 000000000..54de86e61
--- /dev/null
+++ b/dom/media/test/test_webvtt_empty_displaystate.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='utf-8'>
+ <title>WebVTT : cue's displaystate should be empty when its active flag is unset</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<div id="content">
+</div>
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var isReceivedOnEnterEvent = false;
+var isReceivedOnExitEvent = false;
+
+function checkCueEvents() {
+ ok(isReceivedOnEnterEvent, "Already received cue's onEnter event.");
+ ok(isReceivedOnExitEvent, "Already received cue's onExit event.");
+ SimpleTest.finish();
+}
+
+function checkCueDisplayState(cue, expectedState) {
+ var cueChrome = SpecialPowers.wrap(cue);
+ if (expectedState) {
+ ok(cueChrome.displayState, "Cue's displayState shouldn't be empty.");
+ } else {
+ ok(!cueChrome.displayState, "Cue's displayState should be empty.");
+ }
+}
+
+function runTest() {
+ info("--- create video ---");
+ var video = document.createElement("video");
+ video.src = "seek.webm";
+ video.autoplay = true;
+ document.getElementById("content").appendChild(video);
+
+ video.onended = function () {
+ video.onended = null;
+ checkCueEvents();
+ };
+
+ video.onpause = function () {
+ video.onpause = null;
+ checkCueEvents();
+ }
+
+ info("--- create the type of track ---");
+ isnot(window.TextTrack, undefined, "TextTrack should be defined.");
+
+ var track = video.addTextTrack("subtitles", "A", "en");
+ track.mode = "showing";
+ ok(track instanceof TextTrack, "Track should be an instanceof TextTrack.");
+
+ info("--- check the type of cue ---");
+ isnot(window.TextTrackCue, undefined, "TextTrackCue should be defined.");
+ isnot(window.VTTCue, undefined, "VTTCue should be defined.");
+
+ var cue = new VTTCue(0, 1, "Test cue");
+ ok(cue instanceof TextTrackCue, "Cue should be an instanceof TextTrackCue.");
+ ok(cue instanceof VTTCue, "Cue should be an instanceof VTTCue.");
+
+ info("--- add cue ---");
+ track.addCue(cue);
+
+ cue.onenter = function () {
+ cue.onenter = null;
+ isReceivedOnEnterEvent = true;
+ checkCueDisplayState(cue, true /* has display-state */);
+
+ cue.onexit = function () {
+ cue.onexit = null;
+ isReceivedOnExitEvent = true;
+ checkCueDisplayState(cue, false /* no display-state */);
+ video.pause();
+ }
+ }
+}
+
+onload = runTest;
+</script>
+</body>
+</html>
diff --git a/dom/media/test/test_webvtt_positionalign.html b/dom/media/test/test_webvtt_positionalign.html
new file mode 100644
index 000000000..47593bdf9
--- /dev/null
+++ b/dom/media/test/test_webvtt_positionalign.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset='utf-8'>
+ <title>WebVTT : position align test</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<div id="content">
+</div>
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+var trackElement = document.createElement("track");
+var cuesNumber = 8;
+
+function isTrackElemenLoaded() {
+ // Re-que isTrackElemenLoaded() at the end of the event loop until the track
+ // element has loaded its data.
+ if (trackElement.readyState == 1) {
+ setTimeout(isTrackElemenLoaded, 0);
+ return;
+ }
+
+ is(trackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
+ runTest();
+}
+
+function runTest() {
+ info("--- check cues number ---");
+ var cues = trackElement.track.cues;
+ is(cues.length, cuesNumber, "Cues number is correct.");
+
+ info("--- check the typedef of TextTrackCue and VTTCue ---");
+ isnot(window.TextTrackCue, undefined, "TextTrackCue should be defined.");
+ isnot(window.VTTCue, undefined, "VTTCue should be defined.");
+
+ info("--- check the type of first parsed cue ---");
+ ok(cues[0] instanceof TextTrackCue, "Cue should be an instanceof TextTrackCue.");
+ ok(cues[0] instanceof VTTCue, "Cue should be an instanceof VTTCue.");
+
+ info("--- check the cue's position alignment ---");
+ is(cues[0].positionAlign, "center", cues[0].text);
+ is(cues[1].positionAlign, "line-left", cues[1].text);
+ is(cues[2].positionAlign, "center", cues[2].text);
+ is(cues[3].positionAlign, "line-right", cues[3].text);
+ is(cues[4].positionAlign, "auto", cues[4].text);
+
+ info("--- check the cue's computed position alignment ---");
+ // The "computedPositionAlign" is the chrome-only attributes, we need to get
+ // the chrome privilege for cues.
+ cuesChrome = SpecialPowers.wrap(cues);
+ is(cuesChrome[5].computedPositionAlign, "line-left", cuesChrome[5].text);
+ is(cuesChrome[6].computedPositionAlign, "line-right", cuesChrome[6].text);
+ is(cuesChrome[7].computedPositionAlign, "center", cuesChrome[7].text);
+
+ info("--- check the cue's computed position alignment from DOM API ---");
+ is(cuesChrome[0].computedPositionAlign, "center", "Cue's computedPositionAlign align is center.");
+
+ cuesChrome[0].positionAlign = "auto";
+ is(cuesChrome[0].positionAlign, "auto", "Change cue's position align to \"auto\"");
+
+ cuesChrome[0].align = "left";
+ is(cuesChrome[0].align, "left", "Change cue's align to \"left\".");
+
+ is(cuesChrome[0].computedPositionAlign, "line-left", "Cue's computedPositionAlign becomes to \"line-left\"");
+
+ info("--- finish test ---");
+ SimpleTest.finish();
+}
+
+function setupTest() {
+ info("--- setup test ---");
+ video.src = "seek.webm";
+ video.preload = "auto";
+
+ trackElement.src = "vttPositionAlign.vtt";
+ trackElement.kind = "subtitles";
+ trackElement.default = true;
+
+ document.getElementById("content").appendChild(video);
+ video.appendChild(trackElement);
+ video.addEventListener("loadedmetadata", function() {
+ video.removeEventListener("loadedmetadata", runTest);
+ isTrackElemenLoaded();
+ });
+}
+
+onload = setupTest;
+</script>
+</body>
+</html>
diff --git a/dom/media/test/variable-channel.ogg b/dom/media/test/variable-channel.ogg
new file mode 100644
index 000000000..77e116889
--- /dev/null
+++ b/dom/media/test/variable-channel.ogg
Binary files differ
diff --git a/dom/media/test/variable-channel.ogg^headers^ b/dom/media/test/variable-channel.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/variable-channel.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/variable-channel.opus b/dom/media/test/variable-channel.opus
new file mode 100644
index 000000000..76b899116
--- /dev/null
+++ b/dom/media/test/variable-channel.opus
Binary files differ
diff --git a/dom/media/test/variable-channel.opus^headers^ b/dom/media/test/variable-channel.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/variable-channel.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/variable-preskip.opus b/dom/media/test/variable-preskip.opus
new file mode 100644
index 000000000..a82e831ce
--- /dev/null
+++ b/dom/media/test/variable-preskip.opus
Binary files differ
diff --git a/dom/media/test/variable-preskip.opus^headers^ b/dom/media/test/variable-preskip.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/variable-preskip.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/variable-samplerate.ogg b/dom/media/test/variable-samplerate.ogg
new file mode 100644
index 000000000..0c2726e83
--- /dev/null
+++ b/dom/media/test/variable-samplerate.ogg
Binary files differ
diff --git a/dom/media/test/variable-samplerate.ogg^headers^ b/dom/media/test/variable-samplerate.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/variable-samplerate.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/variable-samplerate.opus b/dom/media/test/variable-samplerate.opus
new file mode 100644
index 000000000..1d1517079
--- /dev/null
+++ b/dom/media/test/variable-samplerate.opus
Binary files differ
diff --git a/dom/media/test/variable-samplerate.opus^headers^ b/dom/media/test/variable-samplerate.opus^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/variable-samplerate.opus^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vbr-head.mp3 b/dom/media/test/vbr-head.mp3
new file mode 100644
index 000000000..35f410549
--- /dev/null
+++ b/dom/media/test/vbr-head.mp3
Binary files differ
diff --git a/dom/media/test/vbr-head.mp3^headers^ b/dom/media/test/vbr-head.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/vbr-head.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vbr.mp3 b/dom/media/test/vbr.mp3
new file mode 100644
index 000000000..38eb376a9
--- /dev/null
+++ b/dom/media/test/vbr.mp3
Binary files differ
diff --git a/dom/media/test/vbr.mp3^headers^ b/dom/media/test/vbr.mp3^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/vbr.mp3^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/video-overhang.ogg b/dom/media/test/video-overhang.ogg
new file mode 100644
index 000000000..e11b28fb5
--- /dev/null
+++ b/dom/media/test/video-overhang.ogg
Binary files differ
diff --git a/dom/media/test/video-overhang.ogg^headers^ b/dom/media/test/video-overhang.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/video-overhang.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vp9-short.webm b/dom/media/test/vp9-short.webm
new file mode 100644
index 000000000..16d32abee
--- /dev/null
+++ b/dom/media/test/vp9-short.webm
Binary files differ
diff --git a/dom/media/test/vp9-short.webm^headers^ b/dom/media/test/vp9-short.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/vp9-short.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vp9.webm b/dom/media/test/vp9.webm
new file mode 100644
index 000000000..221877e30
--- /dev/null
+++ b/dom/media/test/vp9.webm
Binary files differ
diff --git a/dom/media/test/vp9.webm^headers^ b/dom/media/test/vp9.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/vp9.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vp9cake-short.webm b/dom/media/test/vp9cake-short.webm
new file mode 100644
index 000000000..2d353d98a
--- /dev/null
+++ b/dom/media/test/vp9cake-short.webm
Binary files differ
diff --git a/dom/media/test/vp9cake-short.webm^headers^ b/dom/media/test/vp9cake-short.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/vp9cake-short.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vp9cake.webm b/dom/media/test/vp9cake.webm
new file mode 100644
index 000000000..4ea70ed30
--- /dev/null
+++ b/dom/media/test/vp9cake.webm
Binary files differ
diff --git a/dom/media/test/vp9cake.webm^headers^ b/dom/media/test/vp9cake.webm^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/vp9cake.webm^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/vttPositionAlign.vtt b/dom/media/test/vttPositionAlign.vtt
new file mode 100644
index 000000000..79f7c49f8
--- /dev/null
+++ b/dom/media/test/vttPositionAlign.vtt
@@ -0,0 +1,25 @@
+WEBVTT
+
+00:00.000 --> 00:00.500
+Cue 0 : PositionAlign should be "center".
+
+00:00.700 --> 00:00.800 position:50%,line-left
+Cue 1 : PositionAlign should be "line-left".
+
+00:00.700 --> 00:00.800 position:50%,center
+Cue 2 : PositionAlign should be "center".
+
+00:00.700 --> 00:00.800 position:50%,line-right
+Cue 3 : PositionAlign should be "line-right".
+
+00:00.700 --> 00:00.800 position:50%,auto
+Cue 4 : PositionAlign should be "auto"
+
+00:00.700 --> 00:00.800 position:50%,auto align:left
+Cue 5 : PositionAlign should be "auto", but computedPositionAlign should be "line-left".
+
+00:00.700 --> 00:00.800 position:50%,auto align:right
+Cue 6 : PositionAlign should be "auto", but computedPositionAlign should be "line-right".
+
+00:00.700 --> 00:00.800 position:50%,auto align:middle
+Cue 7 : PositionAlign should be "auto", but computedPositionAlign should be "center". \ No newline at end of file
diff --git a/dom/media/test/wave_metadata.wav b/dom/media/test/wave_metadata.wav
new file mode 100644
index 000000000..5e17547c3
--- /dev/null
+++ b/dom/media/test/wave_metadata.wav
Binary files differ
diff --git a/dom/media/test/wave_metadata.wav^headers^ b/dom/media/test/wave_metadata.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wave_metadata.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wave_metadata_bad_len.wav b/dom/media/test/wave_metadata_bad_len.wav
new file mode 100644
index 000000000..b89c4818b
--- /dev/null
+++ b/dom/media/test/wave_metadata_bad_len.wav
Binary files differ
diff --git a/dom/media/test/wave_metadata_bad_len.wav^headers^ b/dom/media/test/wave_metadata_bad_len.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wave_metadata_bad_len.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wave_metadata_bad_no_null.wav b/dom/media/test/wave_metadata_bad_no_null.wav
new file mode 100644
index 000000000..18063048c
--- /dev/null
+++ b/dom/media/test/wave_metadata_bad_no_null.wav
Binary files differ
diff --git a/dom/media/test/wave_metadata_bad_no_null.wav^headers^ b/dom/media/test/wave_metadata_bad_no_null.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wave_metadata_bad_no_null.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wave_metadata_bad_utf8.wav b/dom/media/test/wave_metadata_bad_utf8.wav
new file mode 100644
index 000000000..b6f2a675b
--- /dev/null
+++ b/dom/media/test/wave_metadata_bad_utf8.wav
Binary files differ
diff --git a/dom/media/test/wave_metadata_bad_utf8.wav^headers^ b/dom/media/test/wave_metadata_bad_utf8.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wave_metadata_bad_utf8.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wave_metadata_unknown_tag.wav b/dom/media/test/wave_metadata_unknown_tag.wav
new file mode 100644
index 000000000..b19fb5170
--- /dev/null
+++ b/dom/media/test/wave_metadata_unknown_tag.wav
Binary files differ
diff --git a/dom/media/test/wave_metadata_unknown_tag.wav^headers^ b/dom/media/test/wave_metadata_unknown_tag.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wave_metadata_unknown_tag.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wave_metadata_utf8.wav b/dom/media/test/wave_metadata_utf8.wav
new file mode 100644
index 000000000..352db285b
--- /dev/null
+++ b/dom/media/test/wave_metadata_utf8.wav
Binary files differ
diff --git a/dom/media/test/wave_metadata_utf8.wav^headers^ b/dom/media/test/wave_metadata_utf8.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wave_metadata_utf8.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wavedata_alaw.wav b/dom/media/test/wavedata_alaw.wav
new file mode 100644
index 000000000..ef090d16e
--- /dev/null
+++ b/dom/media/test/wavedata_alaw.wav
Binary files differ
diff --git a/dom/media/test/wavedata_alaw.wav^headers^ b/dom/media/test/wavedata_alaw.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wavedata_alaw.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wavedata_s16.wav b/dom/media/test/wavedata_s16.wav
new file mode 100644
index 000000000..6a69cd78f
--- /dev/null
+++ b/dom/media/test/wavedata_s16.wav
Binary files differ
diff --git a/dom/media/test/wavedata_s16.wav^headers^ b/dom/media/test/wavedata_s16.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wavedata_s16.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wavedata_s24.wav b/dom/media/test/wavedata_s24.wav
new file mode 100644
index 000000000..dbdb6aac1
--- /dev/null
+++ b/dom/media/test/wavedata_s24.wav
Binary files differ
diff --git a/dom/media/test/wavedata_s24.wav^headers^ b/dom/media/test/wavedata_s24.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wavedata_s24.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wavedata_u8.wav b/dom/media/test/wavedata_u8.wav
new file mode 100644
index 000000000..1d895c2ce
--- /dev/null
+++ b/dom/media/test/wavedata_u8.wav
Binary files differ
diff --git a/dom/media/test/wavedata_u8.wav^headers^ b/dom/media/test/wavedata_u8.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wavedata_u8.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/test/wavedata_ulaw.wav b/dom/media/test/wavedata_ulaw.wav
new file mode 100644
index 000000000..0874face2
--- /dev/null
+++ b/dom/media/test/wavedata_ulaw.wav
Binary files differ
diff --git a/dom/media/test/wavedata_ulaw.wav^headers^ b/dom/media/test/wavedata_ulaw.wav^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/test/wavedata_ulaw.wav^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/tests/crashtests/780790.html b/dom/media/tests/crashtests/780790.html
new file mode 100644
index 000000000..27eb2a961
--- /dev/null
+++ b/dom/media/tests/crashtests/780790.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=780790
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Simple gUM test - null success callback</title>
+ <script type="application/javascript">
+ navigator.mozGetUserMedia({video: true, fake: true}, null, null);
+ </script>
+</head>
+
+<body>
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/791270.html b/dom/media/tests/crashtests/791270.html
new file mode 100644
index 000000000..627552fb8
--- /dev/null
+++ b/dom/media/tests/crashtests/791270.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=791270
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Simple PeerConnection Video Test</title>
+ <script type="application/javascript">
+ var pc = new RTCPeerConnection();
+ pc.addStream(undefined);
+ </script>
+</head>
+
+<body>
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/791278.html b/dom/media/tests/crashtests/791278.html
new file mode 100644
index 000000000..fd538f678
--- /dev/null
+++ b/dom/media/tests/crashtests/791278.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=791278
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Simple PeerConnection Video Test - Invalid callback</title>
+ <script type="application/javascript">
+ var pc1 = new RTCPeerConnection();
+ pc1.setLocalDescription(function() {});
+
+ var pc2 = new RTCPeerConnection();
+ pc2.setRemoteDescription(function() {});
+ </script>
+</head>
+
+<body>
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/791330.html b/dom/media/tests/crashtests/791330.html
new file mode 100644
index 000000000..e1e1f24a0
--- /dev/null
+++ b/dom/media/tests/crashtests/791330.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=791330
+-->
+<head>
+ <meta charset="utf-8">
+ <title>PeerConnection test - operate on closed connection</title>
+ <script type="application/javascript">
+ function finish() {
+ document.documentElement.removeAttribute("class");
+ }
+
+ function runTest() {
+ var pc = new RTCPeerConnection();
+ pc.close();
+
+ navigator.mozGetUserMedia({audio: true, fake: true}, function (stream) {
+ try {
+ pc.addStream(stream);
+ pc.createOffer(function (offer) {});
+ }
+ finally {
+ stream.stop();
+
+ finish();
+ }
+ }, function () {});
+ }
+ </script>
+</head>
+
+<body onload="setTimeout(runTest, 100)">
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/799419.html b/dom/media/tests/crashtests/799419.html
new file mode 100644
index 000000000..7f815e73c
--- /dev/null
+++ b/dom/media/tests/crashtests/799419.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=799419
+-->
+<head>
+ <meta charset="utf-8">
+ <title>2 Peer Connections Create and Close + Fake Video</title>
+ <script type="application/javascript">
+ function finish() {
+ document.documentElement.removeAttribute("class");
+ }
+
+ function boom() {
+ var v0 = new RTCPeerConnection();
+ var v1 = new RTCPeerConnection();
+ var v2 = document.getElementById("pc1video");
+ var v3 = document.getElementById("pc2video");
+ navigator.mozGetUserMedia({video:true, fake: true},
+ function(stream) {}, function() {});
+ v0.close();
+ v1.close();
+
+ finish();
+ }
+ </script>
+</head>
+<body onload="setTimeout(boom, 100)">
+<video id="pc1video" width="100" height="100" controls></video>
+<video id="pc2video" width="100" height="100" controls></video>
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/801227.html b/dom/media/tests/crashtests/801227.html
new file mode 100644
index 000000000..2dded5451
--- /dev/null
+++ b/dom/media/tests/crashtests/801227.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=801227
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Abort due to page reload</title>
+ <script type="application/javascript">
+ var pc = new RTCPeerConnection();
+
+ var index = localStorage.index || 0;
+ if (index < 3) {
+ localStorage.index = index + 1;
+ window.location.reload();
+ }
+
+ function finish() {
+ delete localStorage["index"];
+
+ pc.close();
+ document.documentElement.removeAttribute("class");
+ }
+
+ navigator.mozGetUserMedia({ audio: true, fake: true }, function (aStream) {
+ pc.addStream(aStream);
+ finish();
+ }, finish);
+ </script>
+</head>
+
+<body>
+</body>
+</html>
+
diff --git a/dom/media/tests/crashtests/802982.html b/dom/media/tests/crashtests/802982.html
new file mode 100644
index 000000000..032f3085c
--- /dev/null
+++ b/dom/media/tests/crashtests/802982.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=802982
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Excessive getUserMedia calls</title>
+ <script type="application/javascript">
+
+ function finish() {
+ document.documentElement.removeAttribute("class");
+ }
+
+ function boom()
+ {
+ for (var j = 0; j < 100; ++j) {
+ navigator.mozGetUserMedia({}, function(){}, function(){});
+ }
+ finish(); // we're not waiting for success/error callbacks here
+ }
+
+ </script>
+</head>
+
+<body onload="setTimeout(boom, 100)">
+</html>
diff --git a/dom/media/tests/crashtests/812785.html b/dom/media/tests/crashtests/812785.html
new file mode 100644
index 000000000..f26168e49
--- /dev/null
+++ b/dom/media/tests/crashtests/812785.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=812785
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Bug 812785 - WebRTC use-after-free crash</title>
+ <script type="application/javascript">
+ var pc1, pc2, pc1_offer, pc2_answer, localAudio, remoteAudio;
+
+ function onFailure(code) {
+ stop();
+ }
+
+ function stop() {
+ pc1.close(); pc1 = null;
+ pc2.close(); pc2 = null;
+
+ var index = localStorage.index || 0;
+ if (index < 5) {
+ localStorage.index = index + 1;
+ window.location.reload();
+ }
+ else {
+ finish();
+ }
+ }
+
+ function start() {
+ localAudio = document.getElementById("local");
+ remoteAudio = document.getElementById("remote");
+
+ var stream = localAudio.mozCaptureStreamUntilEnded();
+
+ pc1 = new RTCPeerConnection();
+ pc2 = new RTCPeerConnection();
+
+ pc1.addStream(stream);
+ pc1.createOffer(function (offer) {
+ pc1_offer = offer;
+ pc1.setLocalDescription(pc1_offer, function () {
+ pc2.setRemoteDescription(pc1_offer, function () {
+ pc2.createAnswer(function (answer) {
+ pc2_answer = answer;
+ pc2.setLocalDescription(pc2_answer, function () {
+ pc1.setRemoteDescription(pc2_answer, function step6() {
+ stop();
+ }, onFailure);
+ }, onFailure);
+ }, onFailure);
+ }, onFailure);
+ }, onFailure);
+ }, onFailure);
+ }
+
+ function finish() {
+ delete localStorage["index"];
+
+ document.documentElement.removeAttribute("class");
+ }
+ </script>
+</head>
+
+<body onload="setTimeout(start, 100)">
+ <audio id="local" controls autoplay><source type="audio/wav" src="" /></audio>
+ <audio id="remote" controls></audio>
+</body>
+</html>
+
diff --git a/dom/media/tests/crashtests/822197.html b/dom/media/tests/crashtests/822197.html
new file mode 100644
index 000000000..97abc4422
--- /dev/null
+++ b/dom/media/tests/crashtests/822197.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=822197
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Bug 822197 - Many PeerConnections with CreateOffer</title>
+ <script type="application/javascript">
+ var pcArray = [];
+
+ function finish() {
+ document.documentElement.removeAttribute("class");
+ }
+
+ function start() {
+ for(var i = 0; i < 70; i++) {
+ var pc = new RTCPeerConnection();
+ pc.createOffer(function() {}, function() {});
+ pcArray.push(pc);
+ }
+ finish();
+ }
+ </script>
+</head>
+
+<body onload="setTimeout(start, 100)">
+</html>
diff --git a/dom/media/tests/crashtests/834100.html b/dom/media/tests/crashtests/834100.html
new file mode 100644
index 000000000..004258156
--- /dev/null
+++ b/dom/media/tests/crashtests/834100.html
@@ -0,0 +1,25 @@
+<html class="reftest-wait">
+ <head>
+ <script language="javascript">
+
+function start() {
+ remotePC = new RTCPeerConnection();
+ var cand = new RTCIceCandidate(
+ {candidate: "1 1 UDP 1 127.0.0.1 34567 type host",
+ sdpMid: "helloworld",
+ sdbMid: "helloworld", // Mis-spelt attribute for bug 833948 compatibility.
+ sdpMLineIndex: 1
+ });
+ try {remotePC.addIceCandidate(cand);} catch(e) {} // bug 842075 - remove try when fixed
+ try {remotePC.addIceCandidate(cand, function(sdp){}, finish);} catch(e) {} // bug 842075 - remove try when fixed
+ finish();
+}
+
+function finish(arg) {
+ document.documentElement.removeAttribute("class");
+}
+ </script>
+ </head>
+ <body onload="setTimeout(start, 100)">
+ </body>
+</html>
diff --git a/dom/media/tests/crashtests/836349.html b/dom/media/tests/crashtests/836349.html
new file mode 100644
index 000000000..651fde46a
--- /dev/null
+++ b/dom/media/tests/crashtests/836349.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=836349
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Bug 836349</title>
+ <script type="application/javascript">
+ function crash()
+ {
+ var pc = new RTCPeerConnection();
+ var ld = pc.localDescription;
+ dump(ld.sdp);
+ }
+ </script>
+</head>
+
+<body onload="crash();">
+</html>
diff --git a/dom/media/tests/crashtests/837324.html b/dom/media/tests/crashtests/837324.html
new file mode 100644
index 000000000..63162a336
--- /dev/null
+++ b/dom/media/tests/crashtests/837324.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=837324
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Bug 837324</title>
+ <script type="application/javascript">
+ function finish() {
+ document.documentElement.removeAttribute("class");
+ }
+
+ function start() {
+ var o0 = new RTCPeerConnection();
+ var o1 = new RTCIceCandidate({"candidate":"0 -65535 IP 0 stun.sipgate.net 3227326073 type ::ffff:192.0.2.128 host 2302600701","sdpMid":"video 3907077665 RTP/SAVPF 5000","sdpMLineIndex":7});
+ try {o0.addIceCandidate(o1);} catch(e) {} // bug 842075 - remove try when fixed
+
+ finish();
+ }
+ </script>
+</head>
+
+<body onload="setTimeout(start, 100)">
+</html>
diff --git a/dom/media/tests/crashtests/855796.html b/dom/media/tests/crashtests/855796.html
new file mode 100644
index 000000000..da46276c5
--- /dev/null
+++ b/dom/media/tests/crashtests/855796.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=855796
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Bug 855796</title>
+ <script type="application/javascript">
+ var pc1, pc2, pc1_offer, pc2_answer;
+
+ function onFailure(code) {
+ stop();
+ }
+
+ function stop() {
+ pc1.close();
+ pc1 = null;
+ pc2.close();
+ pc2 = null;
+ document.documentElement.removeAttribute("class");
+ }
+
+ function step1(offer) {
+ pc1_offer = offer;
+ pc1_offer.sdp = "v=0\r\no=Mozilla-SIPUA 2208 0 IN IP4 0.0.0.0\r\ns=SIP Call\r\nt=0 0\r\na=ice-pwd:4450d5a4a5f097855c16fa079893be18\r\na=fingerprint:sha-256 23:9A:2E:43:94:42:CF:46:68:FC:62:F9:F4:48:61:DB:2F:8C:C9:FF:6B:25:54:9D:41:09:EF:83:A8:19:FC:B6\r\nm=audio 56187 RTP/SAVPF 109 0 8 101\r\nc=IN IP4 77.9.79.167\r\na=rtpmap:109 opus/48000/2\r\na=ptime:20\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\na=sendrecv\r\na=candidate:0 1 UDP 2113601791 192.168.178.20 56187 typ host\r\na=candidate:1 1 UDP 1694236671 77.9.79.167 56187 typ srflx raddr 192.168.178.20 rport 56187\r\na=candidate:0 2 UDP 2113601790 192.168.178.20 52955 typ host\r\na=candidate:1 2 UDP 1694236670 77.9.79.167 52955 typ srflx raddr 192.168.178.20 rport 52955\r\nm=video 49929 RTP/SAVPF 120\r\nc=IN IP4 77.9.79.167\r\na=rtpmap:120 VP8/90000\r\na=recvonly\r\na=candidate:0 1 UDP 2113601791 192.168.178.20 49929 typ host\r\na=candidate:1 1 UDP 1694236671 77.9.79.167 49929 typ srflx raddr 192.168.178.20 rport 49929\r\na=candidate:0 2 UDP 2113601790 192.168.178.20 50769 typ host\r\na=candidate:1 2 UDP 1694236670 77.9.79.167 50769 typ srflx raddr 192.168.178.20 rport 50769\r\nm=application 54054 SCTP/DTLS 5000 \r\nc=IN IP4 77.9.79.167\r\na=fmtp:HuRUu]Dtcl\\zM,7(OmEU%O$gU]x/z\tD protocol=webrtc-datachannel;streams=16\r\na=sendrecv\r\n";
+ pc1.setLocalDescription(pc1_offer, step2, onFailure);
+ }
+
+ function step2() {
+ pc2.setRemoteDescription(pc1_offer, step3, onFailure);
+ }
+
+ function step3() {
+ pc2.createAnswer(step4, onFailure);
+ }
+
+ function step4(answer) {
+ pc2_answer = answer;
+ pc2.setLocalDescription(pc2_answer, step5, onFailure);
+ }
+
+ function step5() {
+ pc1.setRemoteDescription(pc2_answer, step6, onFailure);
+ }
+
+ function step6() {
+ stop();
+ }
+
+ function start() {
+ pc1 = new RTCPeerConnection();
+ pc2 = new RTCPeerConnection();
+ navigator.mozGetUserMedia({audio:true, video:true, fake:true}, function(s) {
+ pc1.addStream(s);
+ navigator.mozGetUserMedia({audio:true, video:true, fake:true}, function(s) {
+ pc2.addStream(s);
+ pc1.createOffer(step1, onFailure);
+ }, onFailure);
+ }, onFailure);
+ }
+ </script>
+</head>
+
+<body onload="setTimeout(start, 100)">
+</html>
diff --git a/dom/media/tests/crashtests/860143.html b/dom/media/tests/crashtests/860143.html
new file mode 100644
index 000000000..2d17a8dac
--- /dev/null
+++ b/dom/media/tests/crashtests/860143.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=860143
+-->
+<head>
+ <meta charset="utf-8">
+ <title>bug 860143</title>
+ <script type="application/javascript">
+ function start() {
+ var o0 = new window.RTCPeerConnection({
+ iceServers: [
+ {
+ url: "turn:AAAAAAAAAAAAAAAAA AAAAAAAAAAA AAAAAAAAAAAAA AA AAAAA AAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAA AAAAAAAAAA, AAAAAAAAAAAAAAAA AAA AAAAAAAAAAAAAAA"
+ }
+ ]
+ });
+ o0.close();
+ }
+ </script>
+</head>
+
+<body onload="start()">
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/861958.html b/dom/media/tests/crashtests/861958.html
new file mode 100644
index 000000000..d6ea7e2e8
--- /dev/null
+++ b/dom/media/tests/crashtests/861958.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=861958
+-->
+<head>
+ <meta charset="utf-8">
+ <title>bug 861958</title>
+ <script type="application/javascript">
+ function start() {
+ var o0 = new window.RTCPeerConnection();
+ var o1 = o0.createDataChannel("foo", {
+ "protocol": "text/char",
+ "preset": false,
+ "stream": 512
+ });
+ o0.close();
+ }
+ </script>
+</head>
+
+<body onload="start()">
+</body>
+</html>
diff --git a/dom/media/tests/crashtests/863929.html b/dom/media/tests/crashtests/863929.html
new file mode 100644
index 000000000..dc534e264
--- /dev/null
+++ b/dom/media/tests/crashtests/863929.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=863929
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Bug 863929</title>
+ <script type="application/javascript">
+ var pc1, pc2, pc1_offer, pc2_answer;
+
+ function onFailure(code) {
+ stop();
+ }
+
+ function stop() {
+ pc1.close();
+ pc1 = null;
+ pc2.close();
+ pc2 = null;
+ document.documentElement.removeAttribute("class");
+ }
+
+ function step1(offer) {
+ pc1_offer = offer;
+ pc1_offer.sdp = 'v=0\r\no=Mozilla-SIPUA 2208 0 IN IP4 0.0.0.0\r\ns=SIP Call\r\nt=0 0\r\na=ice-ufrag:96e36277\r\na=ice-pwd:4450d5a4a5f097855c16fa079893be18\r\na=fingerprint:sha-256 23:9A:2E:43:94:42:CF:46:68:FC:62:F9:F4:48:61:DB:2F:8C:C9:FF:6B:25:54:9D:41:09:EF:83:A8:19:FC:B6\r\nm=audio 56187 RTP/SAVPF 109 0 8 101\r\nc=IN IP4 77.9.79.167\r\na=rtpmap:109 opus/48000/2\r\na=ptime:20\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000\r\na=fmtp:101 0-15\r\na=sendrecv\r\na=candidate:0 1 UDP 2113601791 192.168.178.20 56187 typ host\r\na=candidate:1 1 UDP 1694236671 77.9.79.167 56187 typ srflx raddr 192.168.178.20 rport 56187\r\na=candidate:0 2 UDP 2113601790 192.168.178.20 52955 typ host\r\na=candidate:1 2 UDP 1694236670 77.9.79.167 52955 typ srflx raddr 192.168.178.20 rport 52955\r\nm=video 49929 RTP/SAVPF 120\r\nc=IN IP4 77.9.79.167\r\na=rtpmap:120 telephone-event/90000\r\na=recvonly\r\na=candidate:0 1 UDP 2113601791 192.168.178.20 49929 typ host\r\na=candidate:1 1 UDP 1694236671 77.9.79.167 49929 typ srflx raddr 192.168.178.20 rport 49929\r\na=candidate:0 2 UDP 2113601790 192.168.178.20 50769 typ host\r\na=candidate:1 2 UDP 1694236670 77.9.79.167 50769 typ srflx raddr 192.168.178.20 rport 50769\r\nm=application 54054 SCTP/DTLS 5000 \r\nc=IN IP4 77.9.79.167\r\na=fmtp:5000 protocol=webrtc-datachannel;streams=16\r\na=sendrecv\r\n';
+ pc1.setLocalDescription(pc1_offer, step2, onFailure);
+ }
+
+ function step2() {
+ pc2.setRemoteDescription(pc1_offer, step3, onFailure);
+ }
+
+ function step3() {
+ pc2.createAnswer(step4, onFailure);
+ }
+
+ function step4(answer) {
+ pc2_answer = answer;
+ pc2.setLocalDescription(pc2_answer, step5, onFailure);
+ }
+
+ function step5() {
+ pc1.setRemoteDescription(pc2_answer, step6, onFailure);
+ }
+
+ function step6() {
+ stop();
+ }
+
+ function start() {
+ pc1 = new RTCPeerConnection();
+ pc2 = new RTCPeerConnection();
+ navigator.mozGetUserMedia({audio:true, video:true, fake:true}, function(s) {
+ pc1.addStream(s);
+ navigator.mozGetUserMedia({audio:true, video:true, fake:true}, function(s) {
+ pc2.addStream(s);
+ pc1.createOffer(step1, onFailure);
+ }, onFailure);
+ }, onFailure);
+ }
+ </script>
+</head>
+
+<body onload="start()">
+</html>
diff --git a/dom/media/tests/crashtests/crashtests.list b/dom/media/tests/crashtests/crashtests.list
new file mode 100644
index 000000000..2acec6650
--- /dev/null
+++ b/dom/media/tests/crashtests/crashtests.list
@@ -0,0 +1,16 @@
+default-preferences pref(media.peerconnection.enabled,true) pref(media.navigator.permission.disabled,true)
+
+load 780790.html
+load 791270.html
+load 791278.html
+load 791330.html
+load 799419.html
+load 802982.html
+load 812785.html
+load 834100.html
+load 836349.html
+load 837324.html
+load 855796.html
+load 860143.html
+load 861958.html
+load 863929.html
diff --git a/dom/media/tests/mochitest/NetworkPreparationChromeScript.js b/dom/media/tests/mochitest/NetworkPreparationChromeScript.js
new file mode 100644
index 000000000..1de778778
--- /dev/null
+++ b/dom/media/tests/mochitest/NetworkPreparationChromeScript.js
@@ -0,0 +1,62 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
+const { Services } = Cu.import('resource://gre/modules/Services.jsm');
+
+var browser = Services.wm.getMostRecentWindow('navigator:browser');
+var connection = browser.navigator.mozMobileConnections[0];
+
+// provide a fake APN and enable data connection.
+function enableDataConnection() {
+ let setLock = browser.navigator.mozSettings.createLock();
+ setLock.set({
+ 'ril.data.enabled': true,
+ 'ril.data.apnSettings': [
+ [
+ {'carrier':'T-Mobile US',
+ 'apn':'epc.tmobile.com',
+ 'mmsc':'http://mms.msg.eng.t-mobile.com/mms/wapenc',
+ 'types':['default','supl','mms']}
+ ]
+ ]
+ });
+}
+
+// enable 3G radio
+function enableRadio() {
+ if (connection.radioState !== 'enabled') {
+ connection.setRadioEnabled(true);
+ }
+}
+
+// disable 3G radio
+function disableRadio() {
+ if (connection.radioState === 'enabled') {
+ connection.setRadioEnabled(false);
+ }
+}
+
+addMessageListener('prepare-network', function(message) {
+ connection.addEventListener('datachange', function onDataChange() {
+ if (connection.data.connected) {
+ connection.removeEventListener('datachange', onDataChange);
+ Services.prefs.setIntPref('network.proxy.type', 2);
+ sendAsyncMessage('network-ready', true);
+ }
+ });
+
+ enableRadio();
+ enableDataConnection();
+});
+
+addMessageListener('network-cleanup', function(message) {
+ connection.addEventListener('datachange', function onDataChange() {
+ if (!connection.data.connected) {
+ connection.removeEventListener('datachange', onDataChange);
+ Services.prefs.setIntPref('network.proxy.type', 2);
+ sendAsyncMessage('network-disabled', true);
+ }
+ });
+ disableRadio();
+});
diff --git a/dom/media/tests/mochitest/blacksilence.js b/dom/media/tests/mochitest/blacksilence.js
new file mode 100644
index 000000000..cad3b5515
--- /dev/null
+++ b/dom/media/tests/mochitest/blacksilence.js
@@ -0,0 +1,121 @@
+(function(global) {
+ 'use strict';
+
+ // an invertible check on the condition.
+ // if the constraint is applied, then the check is direct
+ // if not applied, then the result should be reversed
+ function check(constraintApplied, condition, message) {
+ var good = constraintApplied ? condition : !condition;
+ message = (constraintApplied ? 'with' : 'without') +
+ ' constraint: should ' + (constraintApplied ? '' : 'not ') +
+ message + ' = ' + (good ? 'OK' : 'waiting...');
+ info(message);
+ return good;
+ }
+
+ function mkElement(type) {
+ // This makes an unattached element.
+ // It's not rendered to save the cycles that costs on b2g emulator
+ // and it gets dropped (and GC'd) when the test is done.
+ var e = document.createElement(type);
+ e.width = 32;
+ e.height = 24;
+ document.getElementById('display').appendChild(e);
+ return e;
+ }
+
+ // Runs checkFunc until it reports success.
+ // This is kludgy, but you have to wait for media to start flowing, and it
+ // can't be any old media, it has to include real data, for which we have no
+ // reliable signals to use as a trigger.
+ function periodicCheck(checkFunc) {
+ var resolve;
+ var done = false;
+ // This returns a function so that we create 10 closures in the loop, not
+ // one; and so that the timers don't all start straight away
+ var waitAndCheck = counter => () => {
+ if (done) {
+ return Promise.resolve();
+ }
+ return new Promise(r => setTimeout(r, 200 << counter))
+ .then(() => {
+ if (checkFunc()) {
+ done = true;
+ resolve();
+ }
+ });
+ };
+
+ var chain = Promise.resolve();
+ for (var i = 0; i < 10; ++i) {
+ chain = chain.then(waitAndCheck(i));
+ }
+ return new Promise(r => resolve = r);
+ }
+
+ function isSilence(audioData) {
+ var silence = true;
+ for (var i = 0; i < audioData.length; ++i) {
+ if (audioData[i] !== 128) {
+ silence = false;
+ }
+ }
+ return silence;
+ }
+
+ function checkAudio(constraintApplied, stream) {
+ var audio = mkElement('audio');
+ audio.srcObject = stream;
+ audio.play();
+
+ var context = new AudioContext();
+ var source = context.createMediaStreamSource(stream);
+ var analyser = context.createAnalyser();
+ source.connect(analyser);
+ analyser.connect(context.destination);
+
+ return periodicCheck(() => {
+ var sampleCount = analyser.frequencyBinCount;
+ info('got some audio samples: ' + sampleCount);
+ var buffer = new Uint8Array(sampleCount);
+ analyser.getByteTimeDomainData(buffer);
+
+ var silent = check(constraintApplied, isSilence(buffer),
+ 'be silence for audio');
+ return sampleCount > 0 && silent;
+ }).then(() => {
+ source.disconnect();
+ analyser.disconnect();
+ audio.pause();
+ ok(true, 'audio is ' + (constraintApplied ? '' : 'not ') + 'silent');
+ });
+ }
+
+ function checkVideo(constraintApplied, stream) {
+ var video = mkElement('video');
+ video.srcObject = stream;
+ video.play();
+
+ return periodicCheck(() => {
+ try {
+ var canvas = mkElement('canvas');
+ var ctx = canvas.getContext('2d');
+ // Have to guard drawImage with the try as well, due to bug 879717. If
+ // we get an error, this round fails, but that failure is usually just
+ // transitory.
+ ctx.drawImage(video, 0, 0);
+ ctx.getImageData(0, 0, 1, 1);
+ return check(constraintApplied, false, 'throw on getImageData for video');
+ } catch (e) {
+ return check(constraintApplied, e.name === 'SecurityError',
+ 'get a security error: ' + e.name);
+ }
+ }).then(() => {
+ video.pause();
+ ok(true, 'video is ' + (constraintApplied ? '' : 'not ') + 'protected');
+ });
+ }
+
+ global.audioIsSilence = checkAudio;
+ global.videoIsBlack = checkVideo;
+}(this));
diff --git a/dom/media/tests/mochitest/dataChannel.js b/dom/media/tests/mochitest/dataChannel.js
new file mode 100644
index 000000000..fc0251469
--- /dev/null
+++ b/dom/media/tests/mochitest/dataChannel.js
@@ -0,0 +1,191 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Returns the contents of a blob as text
+ *
+ * @param {Blob} blob
+ The blob to retrieve the contents from
+ */
+function getBlobContent(blob) {
+ return new Promise(resolve => {
+ var reader = new FileReader();
+ // Listen for 'onloadend' which will always be called after a success or failure
+ reader.onloadend = event => resolve(event.target.result);
+ reader.readAsText(blob);
+ });
+}
+
+var commandsCreateDataChannel = [
+ function PC_REMOTE_EXPECT_DATA_CHANNEL(test) {
+ test.pcRemote.expectDataChannel();
+ },
+
+ function PC_LOCAL_CREATE_DATA_CHANNEL(test) {
+ var channel = test.pcLocal.createDataChannel({});
+ is(channel.binaryType, "blob", channel + " is of binary type 'blob'");
+ is(channel.readyState, "connecting", channel + " is in state: 'connecting'");
+
+ is(test.pcLocal.signalingState, STABLE,
+ "Create datachannel does not change signaling state");
+ return test.pcLocal.observedNegotiationNeeded;
+ }
+];
+
+var commandsWaitForDataChannel = [
+ function PC_LOCAL_VERIFY_DATA_CHANNEL_STATE(test) {
+ return test.pcLocal.dataChannels[0].opened;
+ },
+
+ function PC_REMOTE_VERIFY_DATA_CHANNEL_STATE(test) {
+ return test.pcRemote.nextDataChannel.then(channel => channel.opened);
+ },
+];
+
+var commandsCheckDataChannel = [
+ function SEND_MESSAGE(test) {
+ var message = "Lorem ipsum dolor sit amet";
+
+ return test.send(message).then(result => {
+ is(result.data, message, "Message correctly transmitted from pcLocal to pcRemote.");
+ });
+ },
+
+ function SEND_BLOB(test) {
+ var contents = "At vero eos et accusam et justo duo dolores et ea rebum.";
+ var blob = new Blob([contents], { "type" : "text/plain" });
+
+ return test.send(blob).then(result => {
+ ok(result.data instanceof Blob, "Received data is of instance Blob");
+ is(result.data.size, blob.size, "Received data has the correct size.");
+
+ return getBlobContent(result.data);
+ }).then(recv_contents =>
+ is(recv_contents, contents, "Received data has the correct content."));
+ },
+
+ function CREATE_SECOND_DATA_CHANNEL(test) {
+ return test.createDataChannel({ }).then(result => {
+ var sourceChannel = result.local;
+ var targetChannel = result.remote;
+ is(sourceChannel.readyState, "open", sourceChannel + " is in state: 'open'");
+ is(targetChannel.readyState, "open", targetChannel + " is in state: 'open'");
+
+ is(targetChannel.binaryType, "blob", targetChannel + " is of binary type 'blob'");
+ });
+ },
+
+ function SEND_MESSAGE_THROUGH_LAST_OPENED_CHANNEL(test) {
+ var channels = test.pcRemote.dataChannels;
+ var message = "I am the Omega";
+
+ return test.send(message).then(result => {
+ is(channels.indexOf(result.channel), channels.length - 1, "Last channel used");
+ is(result.data, message, "Received message has the correct content.");
+ });
+ },
+
+
+ function SEND_MESSAGE_THROUGH_FIRST_CHANNEL(test) {
+ var message = "Message through 1st channel";
+ var options = {
+ sourceChannel: test.pcLocal.dataChannels[0],
+ targetChannel: test.pcRemote.dataChannels[0]
+ };
+
+ return test.send(message, options).then(result => {
+ is(test.pcRemote.dataChannels.indexOf(result.channel), 0, "1st channel used");
+ is(result.data, message, "Received message has the correct content.");
+ });
+ },
+
+
+ function SEND_MESSAGE_BACK_THROUGH_FIRST_CHANNEL(test) {
+ var message = "Return a message also through 1st channel";
+ var options = {
+ sourceChannel: test.pcRemote.dataChannels[0],
+ targetChannel: test.pcLocal.dataChannels[0]
+ };
+
+ return test.send(message, options).then(result => {
+ is(test.pcLocal.dataChannels.indexOf(result.channel), 0, "1st channel used");
+ is(result.data, message, "Return message has the correct content.");
+ });
+ },
+
+ function CREATE_NEGOTIATED_DATA_CHANNEL(test) {
+ var options = {
+ negotiated:true,
+ id: 5,
+ protocol: "foo/bar",
+ ordered: false,
+ maxRetransmits: 500
+ };
+ return test.createDataChannel(options).then(result => {
+ var sourceChannel2 = result.local;
+ var targetChannel2 = result.remote;
+ is(sourceChannel2.readyState, "open", sourceChannel2 + " is in state: 'open'");
+ is(targetChannel2.readyState, "open", targetChannel2 + " is in state: 'open'");
+
+ is(targetChannel2.binaryType, "blob", targetChannel2 + " is of binary type 'blob'");
+
+ is(sourceChannel2.id, options.id, sourceChannel2 + " id is:" + sourceChannel2.id);
+ var reliable = !options.ordered ? false : (options.maxRetransmits || options.maxRetransmitTime);
+ is(sourceChannel2.protocol, options.protocol, sourceChannel2 + " protocol is:" + sourceChannel2.protocol);
+ is(sourceChannel2.reliable, reliable, sourceChannel2 + " reliable is:" + sourceChannel2.reliable);
+ /*
+ These aren't exposed by IDL yet
+ is(sourceChannel2.ordered, options.ordered, sourceChannel2 + " ordered is:" + sourceChannel2.ordered);
+ is(sourceChannel2.maxRetransmits, options.maxRetransmits, sourceChannel2 + " maxRetransmits is:" +
+ sourceChannel2.maxRetransmits);
+ is(sourceChannel2.maxRetransmitTime, options.maxRetransmitTime, sourceChannel2 + " maxRetransmitTime is:" +
+ sourceChannel2.maxRetransmitTime);
+ */
+
+ is(targetChannel2.id, options.id, targetChannel2 + " id is:" + targetChannel2.id);
+ is(targetChannel2.protocol, options.protocol, targetChannel2 + " protocol is:" + targetChannel2.protocol);
+ is(targetChannel2.reliable, reliable, targetChannel2 + " reliable is:" + targetChannel2.reliable);
+ /*
+ These aren't exposed by IDL yet
+ is(targetChannel2.ordered, options.ordered, targetChannel2 + " ordered is:" + targetChannel2.ordered);
+ is(targetChannel2.maxRetransmits, options.maxRetransmits, targetChannel2 + " maxRetransmits is:" +
+ targetChannel2.maxRetransmits);
+ is(targetChannel2.maxRetransmitTime, options.maxRetransmitTime, targetChannel2 + " maxRetransmitTime is:" +
+ targetChannel2.maxRetransmitTime);
+ */
+ });
+ },
+
+ function SEND_MESSAGE_THROUGH_LAST_OPENED_CHANNEL2(test) {
+ var channels = test.pcRemote.dataChannels;
+ var message = "I am the walrus; Goo goo g'joob";
+
+ return test.send(message).then(result => {
+ is(channels.indexOf(result.channel), channels.length - 1, "Last channel used");
+ is(result.data, message, "Received message has the correct content.");
+ });
+ }
+];
+
+var commandsCheckLargeXfer = [
+ function SEND_BIG_BUFFER(test) {
+ var size = 512*1024; // SCTP internal buffer is 256K, so we'll have ~256K queued
+ var buffer = new ArrayBuffer(size);
+ // note: type received is always blob for binary data
+ var options = {};
+ options.bufferedAmountLowThreshold = 64*1024;
+ return test.send(buffer, options).then(result => {
+ ok(result.data instanceof Blob, "Received data is of instance Blob");
+ is(result.data.size, size, "Received data has the correct size.");
+ });
+ },
+];
+
+function addInitialDataChannel(chain) {
+ chain.insertBefore('PC_LOCAL_CREATE_OFFER', commandsCreateDataChannel);
+ chain.insertBefore('PC_LOCAL_WAIT_FOR_MEDIA_FLOW', commandsWaitForDataChannel);
+ chain.removeAfter('PC_REMOTE_CHECK_ICE_CONNECTIONS');
+ chain.append(commandsCheckLargeXfer);
+ chain.append(commandsCheckDataChannel);
+}
diff --git a/dom/media/tests/mochitest/head.js b/dom/media/tests/mochitest/head.js
new file mode 100644
index 000000000..e4d86c750
--- /dev/null
+++ b/dom/media/tests/mochitest/head.js
@@ -0,0 +1,970 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+var Cc = SpecialPowers.Cc;
+var Ci = SpecialPowers.Ci;
+
+// Specifies whether we are using fake streams to run this automation
+var FAKE_ENABLED = true;
+var TEST_AUDIO_FREQ = 1000;
+try {
+ var audioDevice = SpecialPowers.getCharPref('media.audio_loopback_dev');
+ var videoDevice = SpecialPowers.getCharPref('media.video_loopback_dev');
+ dump('TEST DEVICES: Using media devices:\n');
+ dump('audio: ' + audioDevice + '\nvideo: ' + videoDevice + '\n');
+ FAKE_ENABLED = false;
+ TEST_AUDIO_FREQ = 440;
+} catch (e) {
+ dump('TEST DEVICES: No test devices found (in media.{audio,video}_loopback_dev, using fake streams.\n');
+ FAKE_ENABLED = true;
+}
+
+/**
+ * This class provides helpers around analysing the audio content in a stream
+ * using WebAudio AnalyserNodes.
+ *
+ * @constructor
+ * @param {object} stream
+ * A MediaStream object whose audio track we shall analyse.
+ */
+function AudioStreamAnalyser(ac, stream) {
+ this.audioContext = ac;
+ this.stream = stream;
+ this.sourceNodes = [];
+ this.analyser = this.audioContext.createAnalyser();
+ // Setting values lower than default for speedier testing on emulators
+ this.analyser.smoothingTimeConstant = 0.2;
+ this.analyser.fftSize = 1024;
+ this.connectTrack = t => {
+ let source = this.audioContext.createMediaStreamSource(new MediaStream([t]));
+ this.sourceNodes.push(source);
+ source.connect(this.analyser);
+ };
+ this.stream.getAudioTracks().forEach(t => this.connectTrack(t));
+ this.onaddtrack = ev => this.connectTrack(ev.track);
+ this.stream.addEventListener("addtrack", this.onaddtrack);
+ this.data = new Uint8Array(this.analyser.frequencyBinCount);
+}
+
+AudioStreamAnalyser.prototype = {
+ /**
+ * Get an array of frequency domain data for our stream's audio track.
+ *
+ * @returns {array} A Uint8Array containing the frequency domain data.
+ */
+ getByteFrequencyData: function() {
+ this.analyser.getByteFrequencyData(this.data);
+ return this.data;
+ },
+
+ /**
+ * Append a canvas to the DOM where the frequency data are drawn.
+ * Useful to debug tests.
+ */
+ enableDebugCanvas: function() {
+ var cvs = this.debugCanvas = document.createElement("canvas");
+ const content = document.getElementById("content");
+ content.insertBefore(cvs, content.children[0]);
+
+ // Easy: 1px per bin
+ cvs.width = this.analyser.frequencyBinCount;
+ cvs.height = 128;
+ cvs.style.border = "1px solid red";
+
+ var c = cvs.getContext('2d');
+ c.fillStyle = 'black';
+
+ var self = this;
+ function render() {
+ c.clearRect(0, 0, cvs.width, cvs.height);
+ var array = self.getByteFrequencyData();
+ for (var i = 0; i < array.length; i++) {
+ c.fillRect(i, (cvs.height - (array[i] / 2)), 1, cvs.height);
+ }
+ if (!cvs.stopDrawing) {
+ requestAnimationFrame(render);
+ }
+ }
+ requestAnimationFrame(render);
+ },
+
+ /**
+ * Stop drawing of and remove the debug canvas from the DOM if it was
+ * previously added.
+ */
+ disableDebugCanvas: function() {
+ if (!this.debugCanvas || !this.debugCanvas.parentElement) {
+ return;
+ }
+
+ this.debugCanvas.stopDrawing = true;
+ this.debugCanvas.parentElement.removeChild(this.debugCanvas);
+ },
+
+ /**
+ * Disconnects the input stream from our internal analyser node.
+ * Call this to reduce main thread processing, mostly necessary on slow
+ * devices.
+ */
+ disconnect: function() {
+ this.disableDebugCanvas();
+ this.sourceNodes.forEach(n => n.disconnect());
+ this.sourceNodes = [];
+ this.stream.removeEventListener("addtrack", this.onaddtrack);
+ },
+
+ /**
+ * Return a Promise, that will be resolved when the function passed as
+ * argument, when called, returns true (meaning the analysis was a
+ * success).
+ *
+ * @param {function} analysisFunction
+ * A fonction that performs an analysis, and returns true if the
+ * analysis was a success (i.e. it found what it was looking for)
+ */
+ waitForAnalysisSuccess: function(analysisFunction) {
+ var self = this;
+ return new Promise((resolve, reject) => {
+ function analysisLoop() {
+ var success = analysisFunction(self.getByteFrequencyData());
+ if (success) {
+ resolve();
+ return;
+ }
+ // else, we need more time
+ requestAnimationFrame(analysisLoop);
+ }
+ // We need to give the Analyser some time to start gathering data.
+ wait(200).then(analysisLoop);
+ });
+ },
+
+ /**
+ * Return the FFT bin index for a given frequency.
+ *
+ * @param {double} frequency
+ * The frequency for whicht to return the bin number.
+ * @returns {integer} the index of the bin in the FFT array.
+ */
+ binIndexForFrequency: function(frequency) {
+ return 1 + Math.round(frequency *
+ this.analyser.fftSize /
+ this.audioContext.sampleRate);
+ },
+
+ /**
+ * Reverse operation, get the frequency for a bin index.
+ *
+ * @param {integer} index an index in an FFT array
+ * @returns {double} the frequency for this bin
+ */
+ frequencyForBinIndex: function(index) {
+ return (index - 1) *
+ this.audioContext.sampleRate /
+ this.analyser.fftSize;
+ }
+};
+
+/**
+ * Creates a MediaStream with an audio track containing a sine tone at the
+ * given frequency.
+ *
+ * @param {AudioContext} ac
+ * AudioContext in which to create the OscillatorNode backing the stream
+ * @param {double} frequency
+ * The frequency in Hz of the generated sine tone
+ * @returns {MediaStream} the MediaStream containing sine tone audio track
+ */
+function createOscillatorStream(ac, frequency) {
+ var osc = ac.createOscillator();
+ osc.frequency.value = frequency;
+
+ var oscDest = ac.createMediaStreamDestination();
+ osc.connect(oscDest);
+ osc.start();
+ return oscDest.stream;
+}
+
+/**
+ * Create the necessary HTML elements for head and body as used by Mochitests
+ *
+ * @param {object} meta
+ * Meta information of the test
+ * @param {string} meta.title
+ * Description of the test
+ * @param {string} [meta.bug]
+ * Bug the test was created for
+ * @param {boolean} [meta.visible=false]
+ * Visibility of the media elements
+ */
+function realCreateHTML(meta) {
+ var test = document.getElementById('test');
+
+ // Create the head content
+ var elem = document.createElement('meta');
+ elem.setAttribute('charset', 'utf-8');
+ document.head.appendChild(elem);
+
+ var title = document.createElement('title');
+ title.textContent = meta.title;
+ document.head.appendChild(title);
+
+ // Create the body content
+ var anchor = document.createElement('a');
+ anchor.textContent = meta.title;
+ if (meta.bug) {
+ anchor.setAttribute('href', 'https://bugzilla.mozilla.org/show_bug.cgi?id=' + meta.bug);
+ } else {
+ anchor.setAttribute('target', '_blank');
+ }
+
+ document.body.insertBefore(anchor, test);
+
+ var display = document.createElement('p');
+ display.setAttribute('id', 'display');
+ document.body.insertBefore(display, test);
+
+ var content = document.createElement('div');
+ content.setAttribute('id', 'content');
+ content.style.display = meta.visible ? 'block' : "none";
+ document.body.appendChild(content);
+}
+
+/**
+ * Creates an element of the given type, assigns the given id, sets the controls
+ * and autoplay attributes and adds it to the content node.
+ *
+ * @param {string} type
+ * Defining if we should create an "audio" or "video" element
+ * @param {string} id
+ * A string to use as the element id.
+ */
+function createMediaElement(type, id) {
+ const element = document.createElement(type);
+ element.setAttribute('id', id);
+ element.setAttribute('height', 100);
+ element.setAttribute('width', 150);
+ element.setAttribute('controls', 'controls');
+ element.setAttribute('autoplay', 'autoplay');
+ document.getElementById('content').appendChild(element);
+
+ return element;
+}
+
+/**
+ * Returns an existing element for the given track with the given idPrefix,
+ * as it was added by createMediaElementForTrack().
+ *
+ * @param {MediaStreamTrack} track
+ * Track used as the element's source.
+ * @param {string} idPrefix
+ * A string to use as the element id. The track id will also be appended.
+ */
+function getMediaElementForTrack(track, idPrefix) {
+ return document.getElementById(idPrefix + '_' + track.id);
+}
+
+/**
+ * Create a media element with a track as source and attach it to the content
+ * node.
+ *
+ * @param {MediaStreamTrack} track
+ * Track for use as source.
+ * @param {string} idPrefix
+ * A string to use as the element id. The track id will also be appended.
+ * @return {HTMLMediaElement} The created HTML media element
+ */
+function createMediaElementForTrack(track, idPrefix) {
+ const id = idPrefix + '_' + track.id;
+ const element = createMediaElement(track.kind, id);
+ element.srcObject = new MediaStream([track]);
+
+ return element;
+}
+
+
+/**
+ * Wrapper function for mediaDevices.getUserMedia used by some tests. Whether
+ * to use fake devices or not is now determined in pref further below instead.
+ *
+ * @param {Dictionary} constraints
+ * The constraints for this mozGetUserMedia callback
+ */
+function getUserMedia(constraints) {
+ info("Call getUserMedia for " + JSON.stringify(constraints));
+ return navigator.mediaDevices.getUserMedia(constraints)
+ .then(stream => (checkMediaStreamTracks(constraints, stream), stream));
+}
+
+// These are the promises we use to track that the prerequisites for the test
+// are in place before running it.
+var setTestOptions;
+var testConfigured = new Promise(r => setTestOptions = r);
+
+function setupEnvironment() {
+ if (!window.SimpleTest) {
+ // Running under Steeplechase
+ return;
+ }
+
+ var defaultMochitestPrefs = {
+ 'set': [
+ ['media.peerconnection.enabled', true],
+ ['media.peerconnection.identity.enabled', true],
+ ['media.peerconnection.identity.timeout', 120000],
+ ['media.peerconnection.ice.stun_client_maximum_transmits', 14],
+ ['media.peerconnection.ice.trickle_grace_period', 30000],
+ ['media.navigator.permission.disabled', true],
+ ['media.navigator.streams.fake', FAKE_ENABLED],
+ ['media.getusermedia.screensharing.enabled', true],
+ ['media.getusermedia.screensharing.allowed_domains', "mochi.test"],
+ ['media.getusermedia.audiocapture.enabled', true],
+ ['media.recorder.audio_node.enabled', true]
+ ]
+ };
+
+ const isAndroid = !!navigator.userAgent.includes("Android");
+
+ if (isAndroid) {
+ defaultMochitestPrefs.set.push(
+ ["media.navigator.video.default_width", 320],
+ ["media.navigator.video.default_height", 240],
+ ["media.navigator.video.max_fr", 10],
+ ["media.autoplay.enabled", true]
+ );
+ }
+
+ // Running as a Mochitest.
+ SimpleTest.requestFlakyTimeout("WebRTC inherently depends on timeouts");
+ window.finish = () => SimpleTest.finish();
+ SpecialPowers.pushPrefEnv(defaultMochitestPrefs, setTestOptions);
+
+ // We don't care about waiting for this to complete, we just want to ensure
+ // that we don't build up a huge backlog of GC work.
+ SpecialPowers.exactGC();
+}
+
+// This is called by steeplechase; which provides the test configuration options
+// directly to the test through this function. If we're not on steeplechase,
+// the test is configured directly and immediately.
+function run_test(is_initiator,timeout) {
+ var options = { is_local: is_initiator,
+ is_remote: !is_initiator };
+
+ setTimeout(() => {
+ unexpectedEventArrived(new Error("PeerConnectionTest timed out after "+timeout+"s"));
+ }, timeout);
+
+ // Also load the steeplechase test code.
+ var s = document.createElement("script");
+ s.src = "/test.js";
+ s.onload = () => setTestOptions(options);
+ document.head.appendChild(s);
+}
+
+function runTestWhenReady(testFunc) {
+ setupEnvironment();
+ return testConfigured.then(options => testFunc(options))
+ .catch(e => {
+ ok(false, 'Error executing test: ' + e +
+ ((typeof e.stack === 'string') ?
+ (' ' + e.stack.split('\n').join(' ... ')) : ''));
+ SimpleTest.finish();
+ });
+}
+
+
+/**
+ * Checks that the media stream tracks have the expected amount of tracks
+ * with the correct kind and id based on the type and constraints given.
+ *
+ * @param {Object} constraints specifies whether the stream should have
+ * audio, video, or both
+ * @param {String} type the type of media stream tracks being checked
+ * @param {sequence<MediaStreamTrack>} mediaStreamTracks the media stream
+ * tracks being checked
+ */
+function checkMediaStreamTracksByType(constraints, type, mediaStreamTracks) {
+ if (constraints[type]) {
+ is(mediaStreamTracks.length, 1, 'One ' + type + ' track shall be present');
+
+ if (mediaStreamTracks.length) {
+ is(mediaStreamTracks[0].kind, type, 'Track kind should be ' + type);
+ ok(mediaStreamTracks[0].id, 'Track id should be defined');
+ }
+ } else {
+ is(mediaStreamTracks.length, 0, 'No ' + type + ' tracks shall be present');
+ }
+}
+
+/**
+ * Check that the given media stream contains the expected media stream
+ * tracks given the associated audio & video constraints provided.
+ *
+ * @param {Object} constraints specifies whether the stream should have
+ * audio, video, or both
+ * @param {MediaStream} mediaStream the media stream being checked
+ */
+function checkMediaStreamTracks(constraints, mediaStream) {
+ checkMediaStreamTracksByType(constraints, 'audio',
+ mediaStream.getAudioTracks());
+ checkMediaStreamTracksByType(constraints, 'video',
+ mediaStream.getVideoTracks());
+}
+
+/**
+ * Check that a media stream contains exactly a set of media stream tracks.
+ *
+ * @param {MediaStream} mediaStream the media stream being checked
+ * @param {Array} tracks the tracks that should exist in mediaStream
+ * @param {String} [message] an optional message to pass to asserts
+ */
+function checkMediaStreamContains(mediaStream, tracks, message) {
+ message = message ? (message + ": ") : "";
+ tracks.forEach(t => ok(mediaStream.getTrackById(t.id),
+ message + "MediaStream " + mediaStream.id +
+ " contains track " + t.id));
+ is(mediaStream.getTracks().length, tracks.length,
+ message + "MediaStream " + mediaStream.id + " contains no extra tracks");
+}
+
+function checkMediaStreamCloneAgainstOriginal(clone, original) {
+ isnot(clone.id.length, 0, "Stream clone should have an id string");
+ isnot(clone, original,
+ "Stream clone should be different from the original");
+ isnot(clone.id, original.id,
+ "Stream clone's id should be different from the original's");
+ is(clone.getAudioTracks().length, original.getAudioTracks().length,
+ "All audio tracks should get cloned");
+ is(clone.getVideoTracks().length, original.getVideoTracks().length,
+ "All video tracks should get cloned");
+ is(clone.active, original.active,
+ "Active state should be preserved");
+ original.getTracks()
+ .forEach(t => ok(!clone.getTrackById(t.id),
+ "The clone's tracks should be originals"));
+}
+
+function checkMediaStreamTrackCloneAgainstOriginal(clone, original) {
+ isnot(clone.id.length, 0,
+ "Track clone should have an id string");
+ isnot(clone, original,
+ "Track clone should be different from the original");
+ isnot(clone.id, original.id,
+ "Track clone's id should be different from the original's");
+ is(clone.kind, original.kind,
+ "Track clone's kind should be same as the original's");
+ is(clone.enabled, original.enabled,
+ "Track clone's kind should be same as the original's");
+ is(clone.readyState, original.readyState,
+ "Track clone's readyState should be same as the original's");
+}
+
+/*** Utility methods */
+
+/** The dreadful setTimeout, use sparingly */
+function wait(time, message) {
+ return new Promise(r => setTimeout(() => r(message), time));
+}
+
+/** The even more dreadful setInterval, use even more sparingly */
+function waitUntil(func, time) {
+ return new Promise(resolve => {
+ var interval = setInterval(() => {
+ if (func()) {
+ clearInterval(interval);
+ resolve();
+ }
+ }, time || 200);
+ });
+}
+
+/** Time out while waiting for a promise to get resolved or rejected. */
+var timeout = (promise, time, msg) =>
+ Promise.race([promise, wait(time).then(() => Promise.reject(new Error(msg)))]);
+
+/** Adds a |finally| function to a promise whose argument is invoked whether the
+ * promise is resolved or rejected, and that does not interfere with chaining.*/
+var addFinallyToPromise = promise => {
+ promise.finally = func => {
+ return promise.then(
+ result => {
+ func();
+ return Promise.resolve(result);
+ },
+ error => {
+ func();
+ return Promise.reject(error);
+ }
+ );
+ }
+ return promise;
+}
+
+/** Use event listener to call passed-in function on fire until it returns true */
+var listenUntil = (target, eventName, onFire) => {
+ return new Promise(resolve => target.addEventListener(eventName,
+ function callback(event) {
+ var result = onFire(event);
+ if (result) {
+ target.removeEventListener(eventName, callback, false);
+ resolve(result);
+ }
+ }, false));
+};
+
+/* Test that a function throws the right error */
+function mustThrowWith(msg, reason, f) {
+ try {
+ f();
+ ok(false, msg + " must throw");
+ } catch (e) {
+ is(e.name, reason, msg + " must throw: " + e.message);
+ }
+};
+
+
+/*** Test control flow methods */
+
+/**
+ * Generates a callback function fired only under unexpected circumstances
+ * while running the tests. The generated function kills off the test as well
+ * gracefully.
+ *
+ * @param {String} [message]
+ * An optional message to show if no object gets passed into the
+ * generated callback method.
+ */
+function generateErrorCallback(message) {
+ var stack = new Error().stack.split("\n");
+ stack.shift(); // Don't include this instantiation frame
+
+ /**
+ * @param {object} aObj
+ * The object fired back from the callback
+ */
+ return aObj => {
+ if (aObj) {
+ if (aObj.name && aObj.message) {
+ ok(false, "Unexpected callback for '" + aObj.name +
+ "' with message = '" + aObj.message + "' at " +
+ JSON.stringify(stack));
+ } else {
+ ok(false, "Unexpected callback with = '" + aObj +
+ "' at: " + JSON.stringify(stack));
+ }
+ } else {
+ ok(false, "Unexpected callback with message = '" + message +
+ "' at: " + JSON.stringify(stack));
+ }
+ throw new Error("Unexpected callback");
+ }
+}
+
+var unexpectedEventArrived;
+var rejectOnUnexpectedEvent = new Promise((x, reject) => {
+ unexpectedEventArrived = reject;
+});
+
+/**
+ * Generates a callback function fired only for unexpected events happening.
+ *
+ * @param {String} description
+ Description of the object for which the event has been fired
+ * @param {String} eventName
+ Name of the unexpected event
+ */
+function unexpectedEvent(message, eventName) {
+ var stack = new Error().stack.split("\n");
+ stack.shift(); // Don't include this instantiation frame
+
+ return e => {
+ var details = "Unexpected event '" + eventName + "' fired with message = '" +
+ message + "' at: " + JSON.stringify(stack);
+ ok(false, details);
+ unexpectedEventArrived(new Error(details));
+ }
+}
+
+/**
+ * Implements the one-shot event pattern used throughout. Each of the 'onxxx'
+ * attributes on the wrappers can be set with a custom handler. Prior to the
+ * handler being set, if the event fires, it causes the test execution to halt.
+ * That handler is used exactly once, after which the original, error-generating
+ * handler is re-installed. Thus, each event handler is used at most once.
+ *
+ * @param {object} wrapper
+ * The wrapper on which the psuedo-handler is installed
+ * @param {object} obj
+ * The real source of events
+ * @param {string} event
+ * The name of the event
+ */
+function createOneShotEventWrapper(wrapper, obj, event) {
+ var onx = 'on' + event;
+ var unexpected = unexpectedEvent(wrapper, event);
+ wrapper[onx] = unexpected;
+ obj[onx] = e => {
+ info(wrapper + ': "on' + event + '" event fired');
+ e.wrapper = wrapper;
+ wrapper[onx](e);
+ wrapper[onx] = unexpected;
+ };
+}
+
+/**
+ * Returns a promise that resolves when `target` has raised an event with the
+ * given name the given number of times. Cancel the returned promise by passing
+ * in a `cancelPromise` and resolve it.
+ *
+ * @param {object} target
+ * The target on which the event should occur.
+ * @param {string} name
+ * The name of the event that should occur.
+ * @param {integer} count
+ * Optional number of times the event should be raised before resolving.
+ * @param {promise} cancelPromise
+ * Optional promise that on resolving rejects the returned promise,
+ * so we can avoid logging results after a test has finished.
+ * @returns {promise} A promise that resolves to the last of the seen events.
+ */
+function haveEvents(target, name, count, cancelPromise) {
+ var listener;
+ var counter = count || 1;
+ return Promise.race([
+ (cancelPromise || new Promise(() => {})).then(e => Promise.reject(e)),
+ new Promise(resolve =>
+ target.addEventListener(name, listener = e => (--counter < 1 && resolve(e))))
+ ])
+ .then(e => (target.removeEventListener(name, listener), e));
+};
+
+/**
+ * Returns a promise that resolves when `target` has raised an event with the
+ * given name. Cancel the returned promise by passing in a `cancelPromise` and
+ * resolve it.
+ *
+ * @param {object} target
+ * The target on which the event should occur.
+ * @param {string} name
+ * The name of the event that should occur.
+ * @param {promise} cancelPromise
+ * Optional promise that on resolving rejects the returned promise,
+ * so we can avoid logging results after a test has finished.
+ * @returns {promise} A promise that resolves to the seen event.
+ */
+function haveEvent(target, name, cancelPromise) {
+ return haveEvents(target, name, 1, cancelPromise);
+};
+
+/**
+ * Returns a promise that resolves if the target has not seen the given event
+ * after one crank (or until the given timeoutPromise resolves) of the event
+ * loop.
+ *
+ * @param {object} target
+ * The target on which the event should not occur.
+ * @param {string} name
+ * The name of the event that should not occur.
+ * @param {promise} timeoutPromise
+ * Optional promise defining how long we should wait before resolving.
+ * @returns {promise} A promise that is rejected if we see the given event, or
+ * resolves after a timeout otherwise.
+ */
+function haveNoEvent(target, name, timeoutPromise) {
+ return haveEvent(target, name, timeoutPromise || wait(0))
+ .then(() => Promise.reject(new Error("Too many " + name + " events")),
+ () => {});
+};
+
+/**
+ * Returns a promise that resolves after the target has seen the given number
+ * of events but no such event in a following crank of the event loop.
+ *
+ * @param {object} target
+ * The target on which the events should occur.
+ * @param {string} name
+ * The name of the event that should occur.
+ * @param {integer} count
+ * Optional number of times the event should be raised before resolving.
+ * @param {promise} cancelPromise
+ * Optional promise that on resolving rejects the returned promise,
+ * so we can avoid logging results after a test has finished.
+ * @returns {promise} A promise that resolves to the last of the seen events.
+ */
+function haveEventsButNoMore(target, name, count, cancelPromise) {
+ return haveEvents(target, name, count, cancelPromise)
+ .then(e => haveNoEvent(target, name).then(() => e));
+};
+
+/**
+ * This class executes a series of functions in a continuous sequence.
+ * Promise-bearing functions are executed after the previous promise completes.
+ *
+ * @constructor
+ * @param {object} framework
+ * A back reference to the framework which makes use of the class. It is
+ * passed to each command callback.
+ * @param {function[]} commandList
+ * Commands to set during initialization
+ */
+function CommandChain(framework, commandList) {
+ this._framework = framework;
+ this.commands = commandList || [ ];
+}
+
+CommandChain.prototype = {
+ /**
+ * Start the command chain. This returns a promise that always resolves
+ * cleanly (this catches errors and fails the test case).
+ */
+ execute: function () {
+ return this.commands.reduce((prev, next, i) => {
+ if (typeof next !== 'function' || !next.name) {
+ throw new Error('registered non-function' + next);
+ }
+
+ return prev.then(() => {
+ info('Run step ' + (i + 1) + ': ' + next.name);
+ return Promise.race([ next(this._framework), rejectOnUnexpectedEvent ]);
+ });
+ }, Promise.resolve())
+ .catch(e =>
+ ok(false, 'Error in test execution: ' + e +
+ ((typeof e.stack === 'string') ?
+ (' ' + e.stack.split('\n').join(' ... ')) : '')));
+ },
+
+ /**
+ * Add new commands to the end of the chain
+ */
+ append: function(commands) {
+ this.commands = this.commands.concat(commands);
+ },
+
+ /**
+ * Returns the index of the specified command in the chain.
+ * @param {occurrence} Optional param specifying which occurrence to match,
+ * with 0 representing the first occurrence.
+ */
+ indexOf: function(functionOrName, occurrence) {
+ occurrence = occurrence || 0;
+ return this.commands.findIndex(func => {
+ if (typeof functionOrName === 'string') {
+ if (func.name !== functionOrName) {
+ return false;
+ }
+ } else if (func !== functionOrName) {
+ return false;
+ }
+ if (occurrence) {
+ --occurrence;
+ return false;
+ }
+ return true;
+ });
+ },
+
+ mustHaveIndexOf: function(functionOrName, occurrence) {
+ var index = this.indexOf(functionOrName, occurrence);
+ if (index == -1) {
+ throw new Error("Unknown test: " + functionOrName);
+ }
+ return index;
+ },
+
+ /**
+ * Inserts the new commands after the specified command.
+ */
+ insertAfter: function(functionOrName, commands, all, occurrence) {
+ this._insertHelper(functionOrName, commands, 1, all, occurrence);
+ },
+
+ /**
+ * Inserts the new commands after every occurrence of the specified command
+ */
+ insertAfterEach: function(functionOrName, commands) {
+ this._insertHelper(functionOrName, commands, 1, true);
+ },
+
+ /**
+ * Inserts the new commands before the specified command.
+ */
+ insertBefore: function(functionOrName, commands, all, occurrence) {
+ this._insertHelper(functionOrName, commands, 0, all, occurrence);
+ },
+
+ _insertHelper: function(functionOrName, commands, delta, all, occurrence) {
+ occurrence = occurrence || 0;
+ for (var index = this.mustHaveIndexOf(functionOrName, occurrence);
+ index !== -1;
+ index = this.indexOf(functionOrName, ++occurrence)) {
+ this.commands = [].concat(
+ this.commands.slice(0, index + delta),
+ commands,
+ this.commands.slice(index + delta));
+ if (!all) {
+ break;
+ }
+ }
+ },
+
+ /**
+ * Removes the specified command, returns what was removed.
+ */
+ remove: function(functionOrName, occurrence) {
+ return this.commands.splice(this.mustHaveIndexOf(functionOrName, occurrence), 1);
+ },
+
+ /**
+ * Removes all commands after the specified one, returns what was removed.
+ */
+ removeAfter: function(functionOrName, occurrence) {
+ return this.commands.splice(this.mustHaveIndexOf(functionOrName, occurrence) + 1);
+ },
+
+ /**
+ * Removes all commands before the specified one, returns what was removed.
+ */
+ removeBefore: function(functionOrName, occurrence) {
+ return this.commands.splice(0, this.mustHaveIndexOf(functionOrName, occurrence));
+ },
+
+ /**
+ * Replaces a single command, returns what was removed.
+ */
+ replace: function(functionOrName, commands) {
+ this.insertBefore(functionOrName, commands);
+ return this.remove(functionOrName);
+ },
+
+ /**
+ * Replaces all commands after the specified one, returns what was removed.
+ */
+ replaceAfter: function(functionOrName, commands, occurrence) {
+ var oldCommands = this.removeAfter(functionOrName, occurrence);
+ this.append(commands);
+ return oldCommands;
+ },
+
+ /**
+ * Replaces all commands before the specified one, returns what was removed.
+ */
+ replaceBefore: function(functionOrName, commands) {
+ var oldCommands = this.removeBefore(functionOrName);
+ this.insertBefore(functionOrName, commands);
+ return oldCommands;
+ },
+
+ /**
+ * Remove all commands whose name match the specified regex.
+ */
+ filterOut: function (id_match) {
+ this.commands = this.commands.filter(c => !id_match.test(c.name));
+ },
+};
+
+function AudioStreamHelper() {
+ this._context = new AudioContext();
+}
+
+AudioStreamHelper.prototype = {
+ checkAudio: function(stream, analyser, fun) {
+ /*
+ analyser.enableDebugCanvas();
+ return analyser.waitForAnalysisSuccess(fun)
+ .then(() => analyser.disableDebugCanvas());
+ */
+ return analyser.waitForAnalysisSuccess(fun);
+ },
+
+ checkAudioFlowing: function(stream) {
+ var analyser = new AudioStreamAnalyser(this._context, stream);
+ var freq = analyser.binIndexForFrequency(TEST_AUDIO_FREQ);
+ return this.checkAudio(stream, analyser, array => array[freq] > 200);
+ },
+
+ checkAudioNotFlowing: function(stream) {
+ var analyser = new AudioStreamAnalyser(this._context, stream);
+ var freq = analyser.binIndexForFrequency(TEST_AUDIO_FREQ);
+ return this.checkAudio(stream, analyser, array => array[freq] < 50);
+ }
+}
+
+function VideoStreamHelper() {
+ this._helper = new CaptureStreamTestHelper2D(50,50);
+ this._canvas = this._helper.createAndAppendElement('canvas', 'source_canvas');
+ // Make sure this is initted
+ this._helper.drawColor(this._canvas, this._helper.green);
+ this._stream = this._canvas.captureStream(10);
+}
+
+VideoStreamHelper.prototype = {
+ stream: function() {
+ return this._stream;
+ },
+
+ startCapturingFrames: function() {
+ var i = 0;
+ var helper = this;
+ return setInterval(function() {
+ try {
+ helper._helper.drawColor(helper._canvas,
+ i ? helper._helper.green : helper._helper.red);
+ i = 1 - i;
+ helper._stream.requestFrame();
+ } catch (e) {
+ // ignore; stream might have shut down, and we don't bother clearing
+ // the setInterval.
+ }
+ }, 500);
+ },
+
+ waitForFrames: function(canvas, timeout_value) {
+ var intervalId = this.startCapturingFrames();
+ timeout_value = timeout_value || 8000;
+
+ return addFinallyToPromise(timeout(
+ Promise.all([
+ this._helper.waitForPixelColor(canvas, this._helper.green, 128,
+ canvas.id + " should become green"),
+ this._helper.waitForPixelColor(canvas, this._helper.red, 128,
+ canvas.id + " should become red")
+ ]),
+ timeout_value,
+ "Timed out waiting for frames")).finally(() => clearInterval(intervalId));
+ },
+
+ verifyNoFrames: function(canvas) {
+ return this.waitForFrames(canvas).then(
+ () => ok(false, "Color should not change"),
+ () => ok(true, "Color should not change")
+ );
+ }
+}
+
+
+function IsMacOSX10_6orOlder() {
+ if (navigator.platform.indexOf("Mac") !== 0) {
+ return false;
+ }
+
+ var version = Cc["@mozilla.org/system-info;1"]
+ .getService(Ci.nsIPropertyBag2)
+ .getProperty("version");
+ // the next line is correct: Mac OS 10.6 corresponds to Darwin version 10.x !
+ // Mac OS 10.7 is Darwin version 11.x. the |version| string we've got here
+ // is the Darwin version.
+ return (parseFloat(version) < 11.0);
+}
+
+(function(){
+ var el = document.createElement("link");
+ el.rel = "stylesheet";
+ el.type = "text/css";
+ el.href= "/tests/SimpleTest/test.css";
+ document.head.appendChild(el);
+}());
diff --git a/dom/media/tests/mochitest/identity/identityPcTest.js b/dom/media/tests/mochitest/identity/identityPcTest.js
new file mode 100644
index 000000000..e5fcbc5db
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/identityPcTest.js
@@ -0,0 +1,53 @@
+function identityPcTest(remoteOptions) {
+ var user = 'someone';
+ var domain1 = 'test1.example.com';
+ var domain2 = 'test2.example.com';
+ var id1 = user + '@' + domain1;
+ var id2 = user + '@' + domain2;
+
+ test = new PeerConnectionTest({
+ config_local: {
+ peerIdentity: id2
+ },
+ config_remote: {
+ peerIdentity: id1
+ }
+ });
+ test.setMediaConstraints([{
+ audio: true,
+ video: true,
+ peerIdentity: id2
+ }], [remoteOptions || {
+ audio: true,
+ video: true,
+ peerIdentity: id1
+ }]);
+ test.pcLocal.setIdentityProvider('test1.example.com', 'idp.js');
+ test.pcRemote.setIdentityProvider('test2.example.com', 'idp.js');
+ test.chain.append([
+ function PEER_IDENTITY_IS_SET_CORRECTLY(test) {
+ // no need to wait to check identity in this case,
+ // setRemoteDescription should wait for the IdP to complete
+ function checkIdentity(pc, pfx, idp, name) {
+ return pc.peerIdentity.then(peerInfo => {
+ is(peerInfo.idp, idp, pfx + "IdP check");
+ is(peerInfo.name, name + "@" + idp, pfx + "identity check");
+ });
+ }
+
+ return Promise.all([
+ checkIdentity(test.pcLocal._pc, "local: ", "test2.example.com", "someone"),
+ checkIdentity(test.pcRemote._pc, "remote: ", "test1.example.com", "someone")
+ ]);
+ },
+
+ function REMOTE_STREAMS_ARE_RESTRICTED(test) {
+ var remoteStream = test.pcLocal._pc.getRemoteStreams()[0];
+ return Promise.all([
+ audioIsSilence(true, remoteStream),
+ videoIsBlack(true, remoteStream)
+ ]);
+ }
+ ]);
+ test.run();
+}
diff --git a/dom/media/tests/mochitest/identity/idp-bad.js b/dom/media/tests/mochitest/identity/idp-bad.js
new file mode 100644
index 000000000..86e1cb7a3
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-bad.js
@@ -0,0 +1 @@
+<This isn't valid JS>
diff --git a/dom/media/tests/mochitest/identity/idp-min.js b/dom/media/tests/mochitest/identity/idp-min.js
new file mode 100644
index 000000000..8e228b688
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-min.js
@@ -0,0 +1,24 @@
+(function(global) {
+ 'use strict';
+ // A minimal implementation of the interface.
+ // Though this isn't particularly functional.
+ // This is needed so that we can have a "working" IdP served
+ // from two different locations in the tree.
+ global.rtcIdentityProvider.register({
+ generateAssertion: function(payload, origin, usernameHint) {
+ dump('idp: generateAssertion(' + payload + ')\n');
+ return Promise.resolve({
+ idp: { domain: 'example.com', protocol: 'idp.js' },
+ assertion: 'bogus'
+ });
+ },
+
+ validateAssertion: function(assertion, origin) {
+ dump('idp: validateAssertion(' + assertion + ')\n');
+ return Promise.resolve({
+ identity: 'user@example.com',
+ contents: 'bogus'
+ });
+ }
+ });
+}(this));
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-http-trick.js b/dom/media/tests/mochitest/identity/idp-redirect-http-trick.js
new file mode 100644
index 000000000..5d35ac0ca
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-http-trick.js
@@ -0,0 +1,3 @@
+(function() {
+ dump('ERROR\n');
+}());
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-http-trick.js^headers^ b/dom/media/tests/mochitest/identity/idp-redirect-http-trick.js^headers^
new file mode 100644
index 000000000..b3a2afd90
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-http-trick.js^headers^
@@ -0,0 +1,2 @@
+HTTP 301 Moved Permanently
+Location: http://example.com/.well-known/idp-proxy/idp-redirect-https.js
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-http.js b/dom/media/tests/mochitest/identity/idp-redirect-http.js
new file mode 100644
index 000000000..5d35ac0ca
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-http.js
@@ -0,0 +1,3 @@
+(function() {
+ dump('ERROR\n');
+}());
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-http.js^headers^ b/dom/media/tests/mochitest/identity/idp-redirect-http.js^headers^
new file mode 100644
index 000000000..d2380984e
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-http.js^headers^
@@ -0,0 +1,2 @@
+HTTP 301 Moved Permanently
+Location: http://example.com/.well-known/idp-proxy/idp.js
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-https-double.js b/dom/media/tests/mochitest/identity/idp-redirect-https-double.js
new file mode 100644
index 000000000..5d35ac0ca
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-https-double.js
@@ -0,0 +1,3 @@
+(function() {
+ dump('ERROR\n');
+}());
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-https-double.js^headers^ b/dom/media/tests/mochitest/identity/idp-redirect-https-double.js^headers^
new file mode 100644
index 000000000..3fb8a35ae
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-https-double.js^headers^
@@ -0,0 +1,2 @@
+HTTP 301 Moved Permanently
+Location: https://example.com/.well-known/idp-proxy/idp-redirect-https.js
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js b/dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js
new file mode 100644
index 000000000..5d35ac0ca
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js
@@ -0,0 +1,3 @@
+(function() {
+ dump('ERROR\n');
+}());
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js^headers^ b/dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js^headers^
new file mode 100644
index 000000000..6e2931eda
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-https-odd-path.js^headers^
@@ -0,0 +1,2 @@
+HTTP 301 Moved Permanently
+Location: https://example.com/.well-known/idp-min.js
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-https.js b/dom/media/tests/mochitest/identity/idp-redirect-https.js
new file mode 100644
index 000000000..5d35ac0ca
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-https.js
@@ -0,0 +1,3 @@
+(function() {
+ dump('ERROR\n');
+}());
diff --git a/dom/media/tests/mochitest/identity/idp-redirect-https.js^headers^ b/dom/media/tests/mochitest/identity/idp-redirect-https.js^headers^
new file mode 100644
index 000000000..77d56ac44
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp-redirect-https.js^headers^
@@ -0,0 +1,2 @@
+HTTP 301 Moved Permanently
+Location: https://example.com/.well-known/idp-proxy/idp.js
diff --git a/dom/media/tests/mochitest/identity/idp.js b/dom/media/tests/mochitest/identity/idp.js
new file mode 100644
index 000000000..6cc3a1706
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp.js
@@ -0,0 +1,110 @@
+(function(global) {
+ 'use strict';
+
+ // rather than create a million different IdP configurations and litter the
+ // world with files all containing near-identical code, let's use the hash/URL
+ // fragment as a way of generating instructions for the IdP
+ var instructions = global.location.hash.replace('#', '').split(':');
+ function is(target) {
+ return function(instruction) {
+ return instruction === target;
+ };
+ }
+
+ function IDPJS() {
+ this.domain = global.location.host;
+ var path = global.location.pathname;
+ this.protocol =
+ path.substring(path.lastIndexOf('/') + 1) + global.location.hash;
+ this.id = crypto.getRandomValues(new Uint8Array(10)).join('.');
+ }
+
+ IDPJS.prototype = {
+ getLogin: function() {
+ return fetch('https://example.com/.well-known/idp-proxy/idp.sjs?' + this.id)
+ .then(response => response.status === 200);
+ },
+ checkLogin: function(result) {
+ return this.getLogin()
+ .then(loggedIn => {
+ if (loggedIn) {
+ return result;
+ }
+ return Promise.reject({
+ name: 'IdpLoginError',
+ loginUrl: 'https://example.com/.well-known/idp-proxy/login.html#' +
+ this.id
+ });
+ });
+ },
+
+ borkResult: function(result) {
+ if (instructions.some(is('throw'))) {
+ throw new Error('Throwing!');
+ }
+ if (instructions.some(is('fail'))) {
+ return Promise.reject(new Error('Failing!'));
+ }
+ if (instructions.some(is('login'))) {
+ return this.checkLogin(result);
+ }
+ if (instructions.some(is('hang'))) {
+ return new Promise(r => {});
+ }
+ dump('idp: result=' + JSON.stringify(result) + '\n');
+ return Promise.resolve(result);
+ },
+
+ _selectUsername: function(usernameHint) {
+ var username = 'someone@' + this.domain;
+ if (usernameHint) {
+ var at = usernameHint.indexOf('@');
+ if (at < 0) {
+ username = usernameHint + '@' + this.domain;
+ } else if (usernameHint.substring(at + 1) === this.domain) {
+ username = usernameHint;
+ }
+ }
+ return username;
+ },
+
+ generateAssertion: function(payload, origin, usernameHint) {
+ dump('idp: generateAssertion(' + payload + ')\n');
+ var idpDetails = {
+ domain: this.domain,
+ protocol: this.protocol
+ };
+ if (instructions.some(is('bad-assert'))) {
+ idpDetails = {};
+ }
+ return this.borkResult({
+ idp: idpDetails,
+ assertion: JSON.stringify({
+ username: this._selectUsername(usernameHint),
+ contents: payload
+ })
+ });
+ },
+
+ validateAssertion: function(assertion, origin) {
+ dump('idp: validateAssertion(' + assertion + ')\n');
+ var assertion = JSON.parse(assertion);
+ if (instructions.some(is('bad-validate'))) {
+ assertion.contents = {};
+ }
+ return this.borkResult({
+ identity: assertion.username,
+ contents: assertion.contents
+ });
+ }
+ };
+
+ if (!instructions.some(is('not_ready'))) {
+ dump('registering idp.js' + global.location.hash + '\n');
+ var idp = new IDPJS();
+ global.rtcIdentityProvider.register({
+ generateAssertion: idp.generateAssertion.bind(idp),
+ validateAssertion: idp.validateAssertion.bind(idp)
+ });
+ }
+}(this));
diff --git a/dom/media/tests/mochitest/identity/idp.sjs b/dom/media/tests/mochitest/identity/idp.sjs
new file mode 100644
index 000000000..b6313297b
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/idp.sjs
@@ -0,0 +1,18 @@
+function handleRequest(request, response) {
+ var key = '/.well-known/idp-proxy/' + request.queryString;
+ dump(getState(key) + '\n');
+ if (request.method === 'GET') {
+ if (getState(key)) {
+ response.setStatusLine(request.httpVersion, 200, 'OK');
+ } else {
+ response.setStatusLine(request.httpVersion, 404, 'Not Found');
+ }
+ } else if (request.method === 'PUT') {
+ setState(key, 'OK');
+ response.setStatusLine(request.httpVersion, 200, 'OK');
+ } else {
+ response.setStatusLine(request.httpVersion, 406, 'Method Not Allowed');
+ }
+ response.setHeader('Content-Type', 'text/plain;charset=UTF-8');
+ response.write('OK');
+}
diff --git a/dom/media/tests/mochitest/identity/login.html b/dom/media/tests/mochitest/identity/login.html
new file mode 100644
index 000000000..eafba22f2
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/login.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Identity Provider Login</title>
+ <script type="application/javascript">
+ window.onload = () => {
+ var xhr = new XMLHttpRequest();
+ xhr.open("PUT", "https://example.com/.well-known/idp-proxy/idp.sjs?" +
+ window.location.hash.replace('#', ''));
+ xhr.onload = () => {
+ var isFramed = (window !== window.top);
+ var parent = isFramed ? window.parent : window.opener;
+ // Using '*' is cheating, but that's OK.
+ parent.postMessage('LOGINDONE', '*');
+ var done = document.createElement('div');
+
+ done.textContent = 'Done';
+ document.body.appendChild(done);
+
+ if (!isFramed) {
+ window.close();
+ }
+ };
+ xhr.send();
+ };
+ </script>
+</head>
+<body>
+ <div>Logging in...</div>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/mochitest.ini b/dom/media/tests/mochitest/identity/mochitest.ini
new file mode 100644
index 000000000..85f01083d
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/mochitest.ini
@@ -0,0 +1,42 @@
+[DEFAULT]
+# Android 4.3 - bug 981881
+subsuite = media
+skip-if = android_version == '18' || (os == 'linux' && !debug && !e10s)
+support-files =
+ /.well-known/idp-proxy/idp.js
+ identityPcTest.js
+ !/dom/media/tests/mochitest/blacksilence.js
+ !/dom/media/tests/mochitest/dataChannel.js
+ !/dom/media/tests/mochitest/head.js
+ !/dom/media/tests/mochitest/network.js
+ !/dom/media/tests/mochitest/pc.js
+ !/dom/media/tests/mochitest/sdpUtils.js
+ !/dom/media/tests/mochitest/templates.js
+ !/dom/media/tests/mochitest/turnConfig.js
+tags = msg
+
+[test_idpproxy.html]
+support-files =
+ /.well-known/idp-proxy/idp-redirect-http.js
+ /.well-known/idp-proxy/idp-redirect-http.js^headers^
+ /.well-known/idp-proxy/idp-redirect-http-trick.js
+ /.well-known/idp-proxy/idp-redirect-http-trick.js^headers^
+ /.well-known/idp-proxy/idp-redirect-https.js
+ /.well-known/idp-proxy/idp-redirect-https.js^headers^
+ /.well-known/idp-proxy/idp-redirect-https-double.js
+ /.well-known/idp-proxy/idp-redirect-https-double.js^headers^
+ /.well-known/idp-proxy/idp-redirect-https-odd-path.js
+ /.well-known/idp-proxy/idp-redirect-https-odd-path.js^headers^
+ /.well-known/idp-min.js
+ /.well-known/idp-proxy/idp-bad.js
+
+[test_fingerprints.html]
+[test_getIdentityAssertion.html]
+[test_setIdentityProvider.html]
+[test_setIdentityProviderWithErrors.html]
+[test_peerConnection_peerIdentity.html]
+[test_peerConnection_asymmetricIsolation.html]
+[test_loginNeeded.html]
+support-files =
+ /.well-known/idp-proxy/login.html
+ /.well-known/idp-proxy/idp.sjs
diff --git a/dom/media/tests/mochitest/identity/test_fingerprints.html b/dom/media/tests/mochitest/identity/test_fingerprints.html
new file mode 100644
index 000000000..0fd065af2
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_fingerprints.html
@@ -0,0 +1,112 @@
+<html>
+<head>
+<meta charset="utf-8" />
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+</head>
+<body>
+ <script class="testbody" type="application/javascript">
+'use strict';
+
+// here we call the identity provider directly
+function getIdentityAssertion(fpArray) {
+ var Cu = SpecialPowers.Cu;
+ var rtcid = Cu.import('resource://gre/modules/media/IdpSandbox.jsm');
+ var sandbox = new rtcid.IdpSandbox('example.com', 'idp.js', window);
+ return sandbox.start()
+ .then(idp => SpecialPowers.wrap(idp)
+ .generateAssertion(JSON.stringify({ fingerprint: fpArray }),
+ 'https://example.com'))
+ .then(assertion => {
+ assertion = SpecialPowers.wrap(assertion);
+ var assertionString = btoa(JSON.stringify(assertion));
+ sandbox.stop();
+ return assertionString;
+ });
+}
+
+// This takes a real fingerprint and makes some extra bad ones.
+function makeFingerprints(algo, digest) {
+ var fingerprints = [];
+ fingerprints.push({ algorithm: algo, digest: digest });
+ for (var i = 0; i < 3; ++i) {
+ fingerprints.push({
+ algorithm: algo,
+ digest: digest.replace(/:./g, ':' + i.toString(16))
+ });
+ }
+ return fingerprints;
+}
+
+var fingerprintRegex = /^a=fingerprint:(\S+) (\S+)/m;
+var identityRegex = /^a=identity:(\S+)/m;
+
+function fingerprintSdp(fingerprints) {
+ return fingerprints.map(fp => 'a=fInGeRpRiNt:' + fp.algorithm +
+ ' ' + fp.digest + '\n').join('');
+}
+
+// Firefox only uses a single fingerprint.
+// That doesn't mean we have it create SDP that describes two.
+// This function synthesizes that SDP and tries to set it.
+function testMultipleFingerprints() {
+ // this one fails setRemoteDescription if the identity is not good
+ var pcStrict = new RTCPeerConnection({ peerIdentity: 'someone@example.com'});
+ // this one will be manually tweaked to have two fingerprints
+ var pcDouble = new RTCPeerConnection({});
+
+ var offer, match, fingerprints;
+
+ var fail = msg =>
+ (e => ok(false, 'error in ' + msg + ': ' +
+ (e.message ? (e.message + '\n' + e.stack) : e)));
+
+ navigator.mediaDevices.getUserMedia({ audio: true, fake: true })
+ .then(stream => {
+ ok(stream, 'Got fake stream');
+ pcDouble.addStream(stream);
+ return pcDouble.createOffer();
+ })
+ .then(o => {
+ offer = o;
+ ok(offer, 'Got offer');
+
+ match = offer.sdp.match(fingerprintRegex);
+ if (!match) {
+ throw new Error('No fingerprint in offer SDP');
+ }
+ fingerprints = makeFingerprints(match[1], match[2]);
+ return getIdentityAssertion(fingerprints);
+ })
+ .then(assertion => {
+ ok(assertion, 'Should have assertion');
+
+ var sdp = offer.sdp.slice(0, match.index) +
+ 'a=identity:' + assertion + '\n' +
+ fingerprintSdp(fingerprints.slice(1)) +
+ offer.sdp.slice(match.index);
+
+ var desc = new RTCSessionDescription({ type: 'offer', sdp: sdp });
+ return pcStrict.setRemoteDescription(desc);
+ })
+ .then(() => {
+ ok(true, 'Modified fingerprints were accepted');
+ }, error => {
+ var e = SpecialPowers.wrap(error);
+ ok(false, 'error in test: ' +
+ (e.message ? (e.message + '\n' + e.stack) : e));
+ })
+ .then(() => {
+ pcStrict.close();
+ pcDouble.close();
+ SimpleTest.finish();
+ });
+}
+
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({
+ set: [ [ 'media.peerconnection.identity.enabled', true ] ]
+}, testMultipleFingerprints);
+</script>
+ </body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_getIdentityAssertion.html b/dom/media/tests/mochitest/identity/test_getIdentityAssertion.html
new file mode 100644
index 000000000..662981613
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_getIdentityAssertion.html
@@ -0,0 +1,96 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript">var scriptRelativePath = "../";</script>
+ <script type="application/javascript" src="../pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getIdentityAssertion Tests",
+ bug: "942367"
+ });
+
+function checkIdentity(assertion, identity) {
+ // here we dig into the payload, which means we need to know something
+ // about how the IdP actually works (not good in general, but OK here)
+ var assertion = JSON.parse(atob(assertion)).assertion;
+ var user = JSON.parse(assertion).username;
+ is(user, identity, 'id should be "' + identity + '" is "' + user + '"');
+}
+
+function getAssertion(t, instructions, userHint) {
+ t.pcLocal.setIdentityProvider('example.com', 'idp.js' + instructions,
+ userHint);
+ return t.pcLocal._pc.getIdentityAssertion();
+}
+
+var test;
+function theTest() {
+ test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter('PC_REMOTE_CHECK_INITIAL_SIGNALINGSTATE');
+ test.chain.append([
+ function PC_LOCAL_IDENTITY_ASSERTION_FAILS_WITHOUT_PROVIDER(t) {
+ return t.pcLocal._pc.getIdentityAssertion()
+ .then(a => ok(false, 'should fail without provider'),
+ e => ok(e, 'should fail without provider'));
+ },
+
+ function PC_LOCAL_IDENTITY_ASSERTION_FAILS_WITH_BAD_PROVIDER(t) {
+ t.pcLocal._pc.setIdentityProvider('example.com', 'idp-bad.js', '');
+ return t.pcLocal._pc.getIdentityAssertion()
+ .then(a => ok(false, 'should fail with bad provider'),
+ e => {
+ is(e.name, 'IdpError', 'should fail with bad provider');
+ ok(e.message, 'should include a nice message');
+ });
+ },
+
+ function PC_LOCAL_GET_TWO_ASSERTIONS(t) {
+ return Promise.all([
+ getAssertion(t, ''),
+ getAssertion(t, '')
+ ]).then(assertions => {
+ is(assertions.length, 2, "Two assertions generated");
+ assertions.forEach(a => checkIdentity(a, 'someone@example.com'));
+ });
+ },
+
+ function PC_LOCAL_IDP_FAILS(t) {
+ return getAssertion(t, '#fail')
+ .then(a => ok(false, '#fail should not get an identity result'),
+ e => is(e.name, 'IdpError', '#fail should cause rejection'));
+ },
+
+ function PC_LOCAL_IDP_LOGIN_ERROR(t) {
+ return getAssertion(t, '#login')
+ .then(a => ok(false, '#login should not work'),
+ e => {
+ is(e.name, 'IdpLoginError', 'name is IdpLoginError');
+ is(t.pcLocal._pc.idpLoginUrl.split('#')[0],
+ 'https://example.com/.well-known/idp-proxy/login.html',
+ 'got the right login URL from the IdP');
+ });
+ },
+
+ function PC_LOCAL_IDP_NOT_READY(t) {
+ return getAssertion(t, '#not_ready')
+ .then(a => ok(false, '#not_ready should not get an identity result'),
+ e => is(e.name, 'IdpError', '#not_ready should cause rejection'));
+ },
+
+ function PC_LOCAL_ASSERTION_WITH_SPECIFIC_NAME(t) {
+ return getAssertion(t, '', 'user@example.com')
+ .then(a => checkIdentity(a, 'user@example.com'));
+ }
+ ]);
+ test.run();
+}
+runNetworkTest(theTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_idpproxy.html b/dom/media/tests/mochitest/identity/test_idpproxy.html
new file mode 100644
index 000000000..c8860d1f4
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_idpproxy.html
@@ -0,0 +1,176 @@
+<html>
+<head>
+<meta charset="utf-8" />
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+</head>
+<body>
+ <script class="testbody" type="application/javascript">
+"use strict";
+var Cu = SpecialPowers.Cu;
+var rtcid = Cu.import("resource://gre/modules/media/IdpSandbox.jsm");
+var IdpSandbox = rtcid.IdpSandbox;
+var dummyPayload = JSON.stringify({
+ this: 'is',
+ a: ['stu', 6],
+ obj: null
+});
+
+function test_domain_sandbox() {
+ var diabolical = {
+ toString : function() {
+ return 'example.com/path';
+ }
+ };
+ var domains = [ 'ex/foo', 'user@ex', 'user:pass@ex', 'ex#foo', 'ex?foo',
+ '', 12, null, diabolical, true ];
+ domains.forEach(function(domain) {
+ try {
+ var idp = new IdpSandbox(domain, undefined, window);
+ ok(false, 'IdpSandbox allowed a bad domain: ' + domain);
+ } catch (e) {
+ var str = (typeof domain === 'string') ? domain : typeof domain;
+ ok(true, 'Evil domain "' + str + '" raises exception');
+ }
+ });
+}
+
+function test_protocol_sandbox() {
+ var protos = [ '../evil/proto', '..%2Fevil%2Fproto',
+ '\\evil', '%5cevil', 12, true, {} ];
+ protos.forEach(function(proto) {
+ try {
+ var idp = new IdpSandbox('example.com', proto, window);
+ ok(false, 'IdpSandbox allowed a bad protocol: ' + proto);
+ } catch (e) {
+ var str = (typeof proto === 'string') ? proto : typeof proto;
+ ok(true, 'Evil protocol "' + proto + '" raises exception');
+ }
+ });
+}
+
+function idpName(hash) {
+ return 'idp.js' + (hash ? ('#' + hash) : '');
+}
+
+function makeSandbox(js) {
+ var name = js || idpName();
+ info('Creating a sandbox for the protocol: ' + name);
+ var sandbox = new IdpSandbox('example.com', name, window);
+ return sandbox.start().then(idp => SpecialPowers.wrap(idp));
+}
+
+function test_generate_assertion() {
+ return makeSandbox()
+ .then(idp => idp.generateAssertion(dummyPayload,
+ 'https://example.net'))
+ .then(response => {
+ response = SpecialPowers.wrap(response);
+ is(response.idp.domain, 'example.com', 'domain is correct');
+ is(response.idp.protocol, 'idp.js', 'protocol is correct');
+ ok(typeof response.assertion === 'string', 'assertion is present');
+ });
+}
+
+// test that the test IdP can eat its own dogfood; which is the only way to test
+// validateAssertion, since that consumes the output of generateAssertion (in
+// theory, generateAssertion could identify a different IdP domain).
+
+function test_validate_assertion() {
+ return makeSandbox()
+ .then(idp => idp.generateAssertion(dummyPayload,
+ 'https://example.net', 'user'))
+ .then(assertion => {
+ var wrapped = SpecialPowers.wrap(assertion);
+ return makeSandbox()
+ .then(idp => idp.validateAssertion(wrapped.assertion,
+ 'https://example.net'));
+ }).then(response => {
+ response = SpecialPowers.wrap(response);
+ is(response.identity, 'user@example.com');
+ is(response.contents, dummyPayload);
+ });
+}
+
+// We don't want to test the #bad or the #hang instructions,
+// errors of the sort those generate aren't handled by the sandbox code.
+function test_assertion_failure(reason) {
+ return () => {
+ return makeSandbox(idpName(reason))
+ .then(idp => idp.generateAssertion('hello', 'example.net'))
+ .then(r => ok(false, 'should not succeed on ' + reason),
+ e => ok(true, 'failed correctly on ' + reason));
+ };
+}
+
+function test_load_failure() {
+ return makeSandbox('non-existent-file')
+ .then(() => ok(false, 'Should fail to load non-existent file'),
+ e => ok(e, 'Should fail to load non-existent file'));
+}
+
+function test_redirect_ok(from) {
+ return () => {
+ return makeSandbox(from)
+ .then(idp => idp.generateAssertion('hello', 'example.net'))
+ .then(r => ok(SpecialPowers.wrap(r).assertion,
+ 'Redirect to https should be OK'));
+ };
+}
+
+function test_redirect_fail(from) {
+ return () => {
+ return makeSandbox(from)
+ .then(() => ok(false, 'Redirect to https should fail'),
+ e => ok(e, 'Redirect to https should fail'));
+ };
+}
+
+function test_bad_js() {
+ return makeSandbox('idp-bad.js')
+ .then(() => ok(false, 'Bad JS should not load'),
+ e => ok(e, 'Bad JS should not load'));
+}
+
+function run_all_tests() {
+ [
+ test_domain_sandbox,
+ test_protocol_sandbox,
+ test_generate_assertion,
+ test_validate_assertion,
+
+ // fail of the IdP fails
+ test_assertion_failure('fail'),
+ // fail if the IdP throws
+ test_assertion_failure('throw'),
+ // fail if the IdP is not ready
+ test_assertion_failure('not_ready'),
+
+ test_load_failure(),
+ // Test a redirect to an HTTPS origin, which should be OK
+ test_redirect_ok('idp-redirect-https.js'),
+ // Two redirects is fine too
+ test_redirect_ok('idp-redirect-https-double.js'),
+ // A secure redirect to a path other than /.well-known/idp-proxy/* should
+ // also work fine.
+ test_redirect_ok('idp-redirect-https-odd-path.js'),
+ // A redirect to HTTP is not-cool
+ test_redirect_fail('idp-redirect-http.js'),
+ // Also catch tricks like https->http->https
+ test_redirect_fail('idp-redirect-http-trick.js'),
+
+ test_bad_js
+ ].reduce((p, test) => {
+ return p.then(test)
+ .catch(e => ok(false, test.name + ' failed: ' +
+ SpecialPowers.wrap(e).message + '\n' +
+ SpecialPowers.wrap(e).stack));
+ }, Promise.resolve())
+ .then(() => SimpleTest.finish());
+}
+
+SimpleTest.waitForExplicitFinish();
+run_all_tests();
+</script>
+ </body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_loginNeeded.html b/dom/media/tests/mochitest/identity/test_loginNeeded.html
new file mode 100644
index 000000000..4c95a7978
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_loginNeeded.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript">var scriptRelativePath = "../";</script>
+ <script type="application/javascript" src="../pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: 'RTCPeerConnection identity with login',
+ bug: '1153314'
+ });
+
+function waitForLoginDone() {
+ return new Promise(resolve => {
+ window.addEventListener('message', function listener(e) {
+ is(e.origin, 'https://example.com', 'got the right message origin');
+ is(e.data, 'LOGINDONE', 'got the right message');
+ window.removeEventListener('message', listener);
+ resolve();
+ }, false);
+ });
+}
+
+function checkLogin(t, name, onLoginNeeded) {
+ t.pcLocal.setIdentityProvider('example.com', 'idp.js#login:' + name);
+ return t.pcLocal._pc.getIdentityAssertion()
+ .then(a => ok(false, 'should request login'),
+ e => {
+ is(e.name, 'IdpLoginError', 'name is IdpLoginError');
+ is(t.pcLocal._pc.idpLoginUrl.split('#')[0],
+ 'https://example.com/.well-known/idp-proxy/login.html',
+ 'got the right login URL from the IdP');
+ return t.pcLocal._pc.idpLoginUrl;
+ })
+ .then(onLoginNeeded)
+ .then(waitForLoginDone)
+ .then(() => t.pcLocal._pc.getIdentityAssertion())
+ .then(a => ok(a, 'got assertion'));
+}
+
+function theTest() {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter('PC_REMOTE_CHECK_INITIAL_SIGNALINGSTATE');
+ test.chain.append([
+ function PC_LOCAL_IDENTITY_ASSERTION_WITH_IFRAME_LOGIN(t) {
+ return checkLogin(t, 'iframe', loginUrl => {
+ var iframe = document.createElement('iframe');
+ iframe.setAttribute('src', loginUrl);
+ iframe.frameBorder = 0;
+ iframe.width = 400;
+ iframe.height = 60;
+ document.getElementById('display').appendChild(iframe);
+ });
+ },
+ function PC_LOCAL_IDENTITY_ASSERTION_WITH_WINDOW_LOGIN(t) {
+ return checkLogin(t, 'openwin', loginUrl => {
+ window.open(loginUrl, 'login', 'width=400,height=60');
+ });
+ }
+ ]);
+ test.run();
+}
+runNetworkTest(theTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html b/dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html
new file mode 100644
index 000000000..5ea0f5c77
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript">var scriptRelativePath = "../";</script>
+ <script type="application/javascript" src="../pc.js"></script>
+ <script type="application/javascript" src="../blacksilence.js"></script>
+ <script type="application/javascript" src="identityPcTest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({
+ title: "Non-isolated media entering an isolated session becomes isolated",
+ bug: "996238"
+});
+
+function theTest() {
+ // Override the remote media capture options to remove isolation for the
+ // remote party; the test verifies that the media it receives on the local
+ // side is isolated anyway.
+ identityPcTest({
+ audio: true,
+ video: true
+ });
+}
+runNetworkTest(theTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html b/dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html
new file mode 100644
index 000000000..a8116cc45
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript">var scriptRelativePath = "../";</script>
+ <script type="application/javascript" src="../pc.js"></script>
+ <script type="application/javascript" src="../blacksilence.js"></script>
+ <script type="application/javascript" src="identityPcTest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({
+ title: "setIdentityProvider leads to peerIdentity and assertions in SDP",
+ bug: "942367"
+});
+
+runNetworkTest(identityPcTest);
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_setIdentityProvider.html b/dom/media/tests/mochitest/identity/test_setIdentityProvider.html
new file mode 100644
index 000000000..ee65d5af5
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_setIdentityProvider.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript">var scriptRelativePath = "../";</script>
+ <script type="application/javascript" src="../pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "setIdentityProvider leads to peerIdentity and assertions in SDP",
+ bug: "942367"
+ });
+
+function checkIdentity(peer, prefix, idp, name) {
+ prefix = prefix + ": ";
+ return peer._pc.peerIdentity.then(peerIdentity => {
+ ok(peerIdentity, prefix + "peerIdentity is set");
+ is(peerIdentity.idp, idp, prefix + "IdP is correct");
+ is(peerIdentity.name, name + "@" + idp, prefix + "identity is correct");
+ });
+}
+
+function theTest() {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.pcLocal.setIdentityProvider("test1.example.com", "idp.js", "someone");
+ test.pcRemote.setIdentityProvider("test2.example.com", "idp.js", "someone");
+
+ test.chain.append([
+ function PC_LOCAL_PEER_IDENTITY_IS_SET_CORRECTLY(test) {
+ return checkIdentity(test.pcLocal, "local", "test2.example.com", "someone");
+ },
+ function PC_REMOTE_PEER_IDENTITY_IS_SET_CORRECTLY(test) {
+ return checkIdentity(test.pcRemote, "remote", "test1.example.com", "someone");
+ },
+
+ function OFFER_AND_ANSWER_INCLUDES_IDENTITY(test) {
+ ok(test.originalOffer.sdp.includes("a=identity"), "a=identity is in the offer SDP");
+ ok(test.originalAnswer.sdp.includes("a=identity"), "a=identity is in the answer SDP");
+ },
+
+ function PC_LOCAL_DESCRIPTIONS_CONTAIN_IDENTITY(test) {
+ ok(test.pcLocal.localDescription.sdp.includes("a=identity"),
+ "a=identity is in the local copy of the offer");
+ ok(test.pcLocal.remoteDescription.sdp.includes("a=identity"),
+ "a=identity is in the local copy of the answer");
+ },
+ function PC_REMOTE_DESCRIPTIONS_CONTAIN_IDENTITY(test) {
+ ok(test.pcRemote.localDescription.sdp.includes("a=identity"),
+ "a=identity is in the remote copy of the offer");
+ ok(test.pcRemote.remoteDescription.sdp.includes("a=identity"),
+ "a=identity is in the remote copy of the answer");
+ }
+ ]);
+ test.run();
+}
+runNetworkTest(theTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html b/dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html
new file mode 100644
index 000000000..ce6276a2b
--- /dev/null
+++ b/dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript">var scriptRelativePath = "../";</script>
+ <script type="application/javascript" src="../pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+'use strict';
+ createHTML({
+ title: "Identity Provider returning errors is handled correctly",
+ bug: "942367"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ // No IdP for local.
+ // Remote generates a bad assertion, but that only fails to validate
+ test.pcRemote.setIdentityProvider('example.com', 'idp.js#bad-validate', 'nobody');
+
+ // Save the peerIdentity promises now, since when they reject they are
+ // replaced and we expect them to be rejected this time
+ var peerIdentityLocal = test.pcLocal._pc.peerIdentity;
+ var peerIdentityRemote = test.pcRemote._pc.peerIdentity;
+
+ test.chain.append([
+ function ONLY_REMOTE_SDP_INCLUDES_IDENTITY_ASSERTION(t) {
+ ok(!t.originalOffer.sdp.includes('a=identity'),
+ 'a=identity not contained in the offer SDP');
+ ok(t.originalAnswer.sdp.includes('a=identity'),
+ 'a=identity is contained in the answer SDP');
+ },
+ function PEER_IDENTITY_IS_EMPTY(t) {
+ // we are only waiting for the local side to complete
+ // an error on the remote side is immediately fatal though
+ return Promise.race([
+ peerIdentityLocal.then(
+ () => ok(false, t.pcLocal + ' incorrectly received valid peer identity'),
+ e => ok(e, t.pcLocal + ' correctly failed to validate peer identity')),
+ peerIdentityRemote.then(
+ () => ok(false, t.pcRemote + ' incorrecly received a valid peer identity'),
+ e => ok(false, t.pcRemote + ' incorrectly rejected peer identity'))
+ ]);
+ }
+ ]);
+
+ test.run();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/mediaStreamPlayback.js b/dom/media/tests/mochitest/mediaStreamPlayback.js
new file mode 100644
index 000000000..a72d65f3f
--- /dev/null
+++ b/dom/media/tests/mochitest/mediaStreamPlayback.js
@@ -0,0 +1,252 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const ENDED_TIMEOUT_LENGTH = 30000;
+
+/* The time we wait depends primarily on the canplaythrough event firing
+ * Note: this needs to be at least 30s because the
+ * B2G emulator in VMs is really slow. */
+const VERIFYPLAYING_TIMEOUT_LENGTH = 60000;
+
+/**
+ * This class manages playback of a HTMLMediaElement with a MediaStream.
+ * When constructed by a caller, an object instance is created with
+ * a media element and a media stream object.
+ *
+ * @param {HTMLMediaElement} mediaElement the media element for playback
+ * @param {MediaStream} mediaStream the media stream used in
+ * the mediaElement for playback
+ */
+function MediaStreamPlayback(mediaElement, mediaStream) {
+ this.mediaElement = mediaElement;
+ this.mediaStream = mediaStream;
+}
+
+MediaStreamPlayback.prototype = {
+
+ /**
+ * Starts media element with a media stream, runs it until a canplaythrough
+ * and timeupdate event fires, and calls stop() on all its tracks.
+ *
+ * @param {Boolean} isResume specifies if this media element is being resumed
+ * from a previous run
+ */
+ playMedia : function(isResume) {
+ this.startMedia(isResume);
+ return this.verifyPlaying()
+ .then(() => this.stopTracksForStreamInMediaPlayback())
+ .then(() => this.detachFromMediaElement());
+ },
+
+ /**
+ * Stops the local media stream's tracks while it's currently in playback in
+ * a media element.
+ *
+ * Precondition: The media stream and element should both be actively
+ * being played. All the stream's tracks must be local.
+ */
+ stopTracksForStreamInMediaPlayback : function () {
+ var elem = this.mediaElement;
+ return Promise.all([
+ haveEvent(elem, "ended", wait(ENDED_TIMEOUT_LENGTH, new Error("Timeout"))),
+ ...this.mediaStream.getTracks().map(t => (t.stop(), haveNoEvent(t, "ended")))
+ ]);
+ },
+
+ /**
+ * Starts media with a media stream, runs it until a canplaythrough and
+ * timeupdate event fires, and detaches from the element without stopping media.
+ *
+ * @param {Boolean} isResume specifies if this media element is being resumed
+ * from a previous run
+ */
+ playMediaWithoutStoppingTracks : function(isResume) {
+ this.startMedia(isResume);
+ return this.verifyPlaying()
+ .then(() => this.detachFromMediaElement());
+ },
+
+ /**
+ * Starts the media with the associated stream.
+ *
+ * @param {Boolean} isResume specifies if the media element playback
+ * is being resumed from a previous run
+ */
+ startMedia : function(isResume) {
+
+ // If we're playing media element for the first time, check that time is zero.
+ if (!isResume) {
+ is(this.mediaElement.currentTime, 0,
+ "Before starting the media element, currentTime = 0");
+ }
+ this.canPlayThroughFired = listenUntil(this.mediaElement, 'canplaythrough',
+ () => true);
+
+ // Hooks up the media stream to the media element and starts playing it
+ this.mediaElement.srcObject = this.mediaStream;
+ this.mediaElement.play();
+ },
+
+ /**
+ * Verifies that media is playing.
+ */
+ verifyPlaying : function() {
+ var lastStreamTime = this.mediaStream.currentTime;
+ var lastElementTime = this.mediaElement.currentTime;
+
+ var mediaTimeProgressed = listenUntil(this.mediaElement, 'timeupdate',
+ () => this.mediaStream.currentTime > lastStreamTime &&
+ this.mediaElement.currentTime > lastElementTime);
+
+ return timeout(Promise.all([this.canPlayThroughFired, mediaTimeProgressed]),
+ VERIFYPLAYING_TIMEOUT_LENGTH, "verifyPlaying timed out")
+ .then(() => {
+ is(this.mediaElement.paused, false,
+ "Media element should be playing");
+ is(this.mediaElement.duration, Number.POSITIVE_INFINITY,
+ "Duration should be infinity");
+
+ // When the media element is playing with a real-time stream, we
+ // constantly switch between having data to play vs. queuing up data,
+ // so we can only check that the ready state is one of those two values
+ ok(this.mediaElement.readyState === HTMLMediaElement.HAVE_ENOUGH_DATA ||
+ this.mediaElement.readyState === HTMLMediaElement.HAVE_CURRENT_DATA,
+ "Ready state shall be HAVE_ENOUGH_DATA or HAVE_CURRENT_DATA");
+
+ is(this.mediaElement.seekable.length, 0,
+ "Seekable length shall be zero");
+ is(this.mediaElement.buffered.length, 0,
+ "Buffered length shall be zero");
+
+ is(this.mediaElement.seeking, false,
+ "MediaElement is not seekable with MediaStream");
+ ok(isNaN(this.mediaElement.startOffsetTime),
+ "Start offset time shall not be a number");
+ is(this.mediaElement.loop, false, "Loop shall be false");
+ is(this.mediaElement.preload, "", "Preload should not exist");
+ is(this.mediaElement.src, "", "No src should be defined");
+ is(this.mediaElement.currentSrc, "",
+ "Current src should still be an empty string");
+ });
+ },
+
+ /**
+ * Detaches from the element without stopping the media.
+ *
+ * Precondition: The media stream and element should both be actively
+ * being played.
+ */
+ detachFromMediaElement : function() {
+ this.mediaElement.pause();
+ this.mediaElement.srcObject = null;
+ }
+}
+
+
+/**
+ * This class is basically the same as MediaStreamPlayback except
+ * ensures that the instance provided startMedia is a MediaStream.
+ *
+ * @param {HTMLMediaElement} mediaElement the media element for playback
+ * @param {LocalMediaStream} mediaStream the media stream used in
+ * the mediaElement for playback
+ */
+function LocalMediaStreamPlayback(mediaElement, mediaStream) {
+ ok(mediaStream instanceof LocalMediaStream,
+ "Stream should be a LocalMediaStream");
+ MediaStreamPlayback.call(this, mediaElement, mediaStream);
+}
+
+LocalMediaStreamPlayback.prototype = Object.create(MediaStreamPlayback.prototype, {
+
+ /**
+ * DEPRECATED - MediaStream.stop() is going away. Use MediaStreamTrack.stop()!
+ *
+ * Starts media with a media stream, runs it until a canplaythrough and
+ * timeupdate event fires, and calls stop() on the stream.
+ *
+ * @param {Boolean} isResume specifies if this media element is being resumed
+ * from a previous run
+ */
+ playMediaWithDeprecatedStreamStop : {
+ value: function(isResume) {
+ this.startMedia(isResume);
+ return this.verifyPlaying()
+ .then(() => this.deprecatedStopStreamInMediaPlayback())
+ .then(() => this.detachFromMediaElement());
+ }
+ },
+
+ /**
+ * DEPRECATED - MediaStream.stop() is going away. Use MediaStreamTrack.stop()!
+ *
+ * Stops the local media stream while it's currently in playback in
+ * a media element.
+ *
+ * Precondition: The media stream and element should both be actively
+ * being played.
+ *
+ */
+ deprecatedStopStreamInMediaPlayback : {
+ value: function () {
+ return new Promise((resolve, reject) => {
+ /**
+ * Callback fired when the ended event fires when stop() is called on the
+ * stream.
+ */
+ var endedCallback = () => {
+ this.mediaElement.removeEventListener('ended', endedCallback, false);
+ ok(true, "ended event successfully fired");
+ resolve();
+ };
+
+ this.mediaElement.addEventListener('ended', endedCallback, false);
+ this.mediaStream.stop();
+
+ // If ended doesn't fire in enough time, then we fail the test
+ setTimeout(() => {
+ reject(new Error("ended event never fired"));
+ }, ENDED_TIMEOUT_LENGTH);
+ });
+ }
+ }
+});
+
+// haxx to prevent SimpleTest from failing at window.onload
+function addLoadEvent() {}
+
+var scriptsReady = Promise.all([
+ "/tests/SimpleTest/SimpleTest.js",
+ "head.js"
+].map(script => {
+ var el = document.createElement("script");
+ el.src = script;
+ document.head.appendChild(el);
+ return new Promise(r => el.onload = r);
+}));
+
+function createHTML(options) {
+ return scriptsReady.then(() => realCreateHTML(options));
+}
+
+var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+
+// noGum - Helper to detect whether active guM tracks still exist.
+//
+// It relies on the fact that, by spec, device labels from enumerateDevices are
+// only visible during active gum calls. They're also visible when persistent
+// permissions are granted, so turn off media.navigator.permission.disabled
+// (which is normally on otherwise in our tests). Lastly, we must turn on
+// media.navigator.permission.fake otherwise fake devices don't count as active.
+
+var noGum = () => pushPrefs(["media.navigator.permission.disabled", false],
+ ["media.navigator.permission.fake", true])
+ .then(() => navigator.mediaDevices.enumerateDevices())
+ .then(([device]) => device &&
+ is(device.label, "", "Test must leave no active gUM streams behind."));
+
+var runTest = testFunction => scriptsReady
+ .then(() => runTestWhenReady(testFunction))
+ .then(() => noGum())
+ .then(() => finish());
diff --git a/dom/media/tests/mochitest/mochitest.ini b/dom/media/tests/mochitest/mochitest.ini
new file mode 100644
index 000000000..22006ffa2
--- /dev/null
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -0,0 +1,272 @@
+[DEFAULT]
+tags = msg webrtc
+subsuite = media
+support-files =
+ head.js
+ dataChannel.js
+ mediaStreamPlayback.js
+ network.js
+ nonTrickleIce.js
+ pc.js
+ templates.js
+ NetworkPreparationChromeScript.js
+ blacksilence.js
+ turnConfig.js
+ sdpUtils.js
+ !/dom/canvas/test/captureStream_common.js
+ !/dom/canvas/test/webgl-mochitest/webgl-util.js
+ !/dom/media/test/manifest.js
+ !/dom/media/test/320x240.ogv
+ !/dom/media/test/r11025_s16_c1.wav
+ !/dom/media/test/bug461281.ogg
+ !/dom/media/test/seek.webm
+ !/dom/media/test/gizmo.mp4
+
+[test_a_noOp.html]
+[test_dataChannel_basicAudio.html]
+skip-if = (android_version == '18') # Bug 962984 for debug, bug 963244 for opt
+[test_dataChannel_basicAudioVideo.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_dataChannel_basicAudioVideoNoBundle.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_dataChannel_basicAudioVideoCombined.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_dataChannel_basicDataOnly.html]
+[test_dataChannel_basicVideo.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_dataChannel_bug1013809.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_dataChannel_noOffer.html]
+[test_enumerateDevices.html]
+[test_enumerateDevices_iframe.html]
+skip-if = true # needed by test_enumerateDevices.html on builders
+[test_ondevicechange.html]
+skip-if = os == 'android'
+[test_getUserMedia_active_autoplay.html]
+[test_getUserMedia_audioCapture.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_getUserMedia_addTrackRemoveTrack.html]
+[test_getUserMedia_addtrack_removetrack_events.html]
+[test_getUserMedia_basicAudio.html]
+[test_getUserMedia_basicVideo.html]
+[test_getUserMedia_basicVideo_playAfterLoadedmetadata.html]
+[test_getUserMedia_basicScreenshare.html]
+skip-if = toolkit == 'android' # no screenshare on android
+[test_getUserMedia_basicTabshare.html]
+skip-if = toolkit == 'android' # no windowshare on android
+[test_getUserMedia_basicWindowshare.html]
+skip-if = toolkit == 'android' # no windowshare on android
+[test_getUserMedia_basicVideoAudio.html]
+[test_getUserMedia_bug1223696.html]
+[test_getUserMedia_constraints.html]
+[test_getUserMedia_callbacks.html]
+[test_getUserMedia_getTrackById.html]
+[test_getUserMedia_gumWithinGum.html]
+[test_getUserMedia_loadedmetadata.html]
+[test_getUserMedia_mediaElementCapture_audio.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_getUserMedia_mediaElementCapture_tracks.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_getUserMedia_mediaElementCapture_video.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_getUserMedia_mediaStreamClone.html]
+[test_getUserMedia_mediaStreamConstructors.html]
+[test_getUserMedia_mediaStreamTrackClone.html]
+[test_getUserMedia_playAudioTwice.html]
+[test_getUserMedia_playVideoAudioTwice.html]
+[test_getUserMedia_playVideoTwice.html]
+[test_getUserMedia_scarySources.html]
+skip-if = toolkit == 'android' # no screenshare or windowshare on android
+[test_getUserMedia_spinEventLoop.html]
+[test_getUserMedia_stopAudioStream.html]
+[test_getUserMedia_stopAudioStreamWithFollowupAudio.html]
+[test_getUserMedia_stopVideoAudioStream.html]
+[test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html]
+[test_getUserMedia_stopVideoStream.html]
+[test_getUserMedia_stopVideoStreamWithFollowupVideo.html]
+[test_getUserMedia_trackCloneCleanup.html]
+[test_getUserMedia_trackEnded.html]
+[test_getUserMedia_peerIdentity.html]
+[test_peerConnection_addIceCandidate.html]
+[test_peerConnection_addtrack_removetrack_events.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudio.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioNATSrflx.html]
+skip-if = toolkit == 'android' # websockets don't work on android (bug 1266217)
+[test_peerConnection_basicAudioNATRelay.html]
+skip-if = toolkit == 'android' # websockets don't work on android (bug 1266217)
+[test_peerConnection_basicAudioNATRelayTCP.html]
+skip-if = toolkit == 'android' # websockets don't work on android (bug 1266217)
+[test_peerConnection_basicAudioRequireEOC.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioPcmaPcmuOnly.html]
+skip-if = android_version == '18'
+[test_peerConnection_basicAudioDynamicPtMissingRtpmap.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioVideo.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioVideoCombined.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioVideoNoBundle.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicAudioVideoNoRtcpMux.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicVideo.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_basicScreenshare.html]
+# frequent timeouts/crashes on e10s (bug 1048455)
+skip-if = toolkit == 'android' # no screenshare on android
+[test_peerConnection_basicWindowshare.html]
+# frequent timeouts/crashes on e10s (bug 1048455)
+skip-if = toolkit == 'android' # no screenshare on android
+[test_peerConnection_basicH264Video.html]
+skip-if = os == 'android' # bug 1043403
+[test_peerConnection_bug822674.html]
+[test_peerConnection_bug825703.html]
+[test_peerConnection_bug827843.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_bug834153.html]
+[test_peerConnection_bug1013809.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_bug1042791.html]
+skip-if = os == 'android' # bug 1043403
+[test_peerConnection_bug1064223.html]
+[test_peerConnection_capturedVideo.html]
+tags=capturestream
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_captureStream_canvas_2d.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_multiple_captureStream_canvas_2d.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_captureStream_canvas_webgl.html]
+# [test_peerConnection_certificates.html] # bug 1180968
+[test_peerConnection_close.html]
+[test_peerConnection_closeDuringIce.html]
+[test_peerConnection_constructedStream.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_errorCallbacks.html]
+[test_peerConnection_iceFailure.html]
+skip-if = os == 'linux' || os == 'mac' || os == 'win' || android_version == '18' # (Bug 1180388 for win, mac and linux), android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_insertDTMF.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_forwarding_basicAudioVideoCombined.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_noTrickleAnswer.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_noTrickleOffer.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_noTrickleOfferAnswer.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_offerRequiresReceiveAudio.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_offerRequiresReceiveVideo.html]
+[test_peerConnection_offerRequiresReceiveVideoAudio.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_promiseSendOnly.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_renderAfterRenegotiation.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_restartIce.html]
+skip-if = android_version
+[test_peerConnection_restartIceNoBundle.html]
+skip-if = android_version
+[test_peerConnection_restartIceNoBundleNoRtcpMux.html]
+skip-if = android_version
+[test_peerConnection_restartIceNoRtcpMux.html]
+skip-if = android_version
+[test_peerConnection_restartIceLocalRollback.html]
+skip-if = android_version
+[test_peerConnection_restartIceLocalAndRemoteRollback.html]
+skip-if = android_version
+[test_peerConnection_scaleResolution.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_simulcastOffer.html]
+skip-if = android_version # no simulcast support on android
+#[test_peerConnection_relayOnly.html]
+[test_peerConnection_callbacks.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_replaceTrack.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_syncSetDescription.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_setLocalAnswerInHaveLocalOffer.html]
+[test_peerConnection_setLocalAnswerInStable.html]
+[test_peerConnection_setLocalOfferInHaveRemoteOffer.html]
+[test_peerConnection_setParameters.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html]
+[test_peerConnection_setRemoteAnswerInStable.html]
+[test_peerConnection_setRemoteOfferInHaveLocalOffer.html]
+[test_peerConnection_throwInCallbacks.html]
+[test_peerConnection_toJSON.html]
+[test_peerConnection_trackDisabling_clones.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_trackDisabling.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_twoAudioStreams.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_twoAudioTracksInOneStream.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_twoAudioVideoStreams.html]
+skip-if = (os == 'linux' && debug && e10s) || android_version == '18' # Bug 1171255 for Linux debug e10s, android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_twoAudioVideoStreamsCombined.html]
+skip-if = (os == 'linux' && debug && e10s) || android_version == '18' # Bug 1127828 for Linux debug e10s, android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_twoVideoStreams.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_twoVideoTracksInOneStream.html]
+skip-if = os == "android" # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_addAudioTrackToExistingVideoStream.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_addSecondAudioStream.html]
+skip-if = (android_version == '18') # emulator is too slow to finish a renegotiation test in under 5 minutes
+[test_peerConnection_answererAddSecondAudioStream.html]
+skip-if = (android_version == '18') # emulator is too slow to finish a renegotiation test in under 5 minutes
+[test_peerConnection_removeAudioTrack.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_removeThenAddAudioTrack.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_addSecondVideoStream.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_removeVideoTrack.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_removeThenAddVideoTrack.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_replaceVideoThenRenegotiate.html]
+skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_addSecondAudioStreamNoBundle.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_removeThenAddAudioTrackNoBundle.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_addSecondVideoStreamNoBundle.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_removeThenAddVideoTrackNoBundle.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_addDataChannel.html]
+skip-if = (android_version == '18') # android(bug 1240256, intermittent ICE failures starting w/bug 1232082, possibly from timeout)
+[test_peerConnection_addDataChannelNoBundle.html]
+skip-if = (android_version == '18') # android(bug 1240256, intermittent ICE failures starting w/bug 1232082, possibly from timeout) android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_verifyAudioAfterRenegotiation.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_verifyVideoAfterRenegotiation.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_audioRenegotiationInactiveAnswer.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_videoRenegotiationInactiveAnswer.html]
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_webAudio.html]
+tags = webaudio webrtc
+skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_localRollback.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_localReofferRollback.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_remoteRollback.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_remoteReofferRollback.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_selftest.html]
+# Bug 1227781: Crash with bogus TURN server.
+[test_peerConnection_bug1227781.html]
diff --git a/dom/media/tests/mochitest/network.js b/dom/media/tests/mochitest/network.js
new file mode 100644
index 000000000..286ec5b71
--- /dev/null
+++ b/dom/media/tests/mochitest/network.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * A stub function for preparing the network if needed
+ *
+ */
+function startNetworkAndTest() {
+ return Promise.resolve();
+}
+
+/**
+ * A stub function to shutdown the network if needed
+ */
+function networkTestFinished() {
+ return Promise.resolve().then(() => finish());
+}
diff --git a/dom/media/tests/mochitest/nonTrickleIce.js b/dom/media/tests/mochitest/nonTrickleIce.js
new file mode 100644
index 000000000..2733b6494
--- /dev/null
+++ b/dom/media/tests/mochitest/nonTrickleIce.js
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function removeTrickleOption(desc) {
+ var sdp = desc.sdp.replace(/\r\na=ice-options:trickle\r\n/, "\r\n");
+ return new mozRTCSessionDescription({ type: desc.type, sdp: sdp });
+}
+
+function makeOffererNonTrickle(chain) {
+ chain.replace('PC_LOCAL_SETUP_ICE_HANDLER', [
+ function PC_LOCAL_SETUP_NOTRICKLE_ICE_HANDLER(test) {
+ // We need to install this callback before calling setLocalDescription
+ // otherwise we might miss callbacks
+ test.pcLocal.setupIceCandidateHandler(test, () => {});
+ // We ignore ICE candidates because we want the full offer
+ }
+ ]);
+ chain.replace('PC_REMOTE_GET_OFFER', [
+ function PC_REMOTE_GET_FULL_OFFER(test) {
+ return test.pcLocal.endOfTrickleIce.then(() => {
+ test._local_offer = removeTrickleOption(test.pcLocal.localDescription);
+ test._offer_constraints = test.pcLocal.constraints;
+ test._offer_options = test.pcLocal.offerOptions;
+ });
+ }
+ ]);
+ chain.insertAfter('PC_REMOTE_SANE_REMOTE_SDP', [
+ function PC_REMOTE_REQUIRE_REMOTE_SDP_CANDIDATES(test) {
+ info("test.pcLocal.localDescription.sdp: " + JSON.stringify(test.pcLocal.localDescription.sdp));
+ info("test._local_offer.sdp" + JSON.stringify(test._local_offer.sdp));
+ is(test.pcRemote._pc.canTrickleIceCandidates, false,
+ "Remote thinks that trickle isn't supported");
+ ok(!test.localRequiresTrickleIce, "Local does NOT require trickle");
+ ok(test._local_offer.sdp.includes("a=candidate"), "offer has ICE candidates")
+ ok(test._local_offer.sdp.includes("a=end-of-candidates"), "offer has end-of-candidates");
+ }
+ ]);
+ chain.remove('PC_REMOTE_CHECK_CAN_TRICKLE_SYNC');
+}
+
+function makeAnswererNonTrickle(chain) {
+ chain.replace('PC_REMOTE_SETUP_ICE_HANDLER', [
+ function PC_REMOTE_SETUP_NOTRICKLE_ICE_HANDLER(test) {
+ // We need to install this callback before calling setLocalDescription
+ // otherwise we might miss callbacks
+ test.pcRemote.setupIceCandidateHandler(test, () => {});
+ // We ignore ICE candidates because we want the full offer
+ }
+ ]);
+ chain.replace('PC_LOCAL_GET_ANSWER', [
+ function PC_LOCAL_GET_FULL_ANSWER(test) {
+ return test.pcRemote.endOfTrickleIce.then(() => {
+ test._remote_answer = removeTrickleOption(test.pcRemote.localDescription);
+ test._answer_constraints = test.pcRemote.constraints;
+ });
+ }
+ ]);
+ chain.insertAfter('PC_LOCAL_SANE_REMOTE_SDP', [
+ function PC_LOCAL_REQUIRE_REMOTE_SDP_CANDIDATES(test) {
+ info("test.pcRemote.localDescription.sdp: " + JSON.stringify(test.pcRemote.localDescription.sdp));
+ info("test._remote_answer.sdp" + JSON.stringify(test._remote_answer.sdp));
+ is(test.pcLocal._pc.canTrickleIceCandidates, false,
+ "Local thinks that trickle isn't supported");
+ ok(!test.remoteRequiresTrickleIce, "Remote does NOT require trickle");
+ ok(test._remote_answer.sdp.includes("a=candidate"), "answer has ICE candidates")
+ ok(test._remote_answer.sdp.includes("a=end-of-candidates"), "answer has end-of-candidates");
+ }
+ ]);
+ chain.remove('PC_LOCAL_CHECK_CAN_TRICKLE_SYNC');
+}
diff --git a/dom/media/tests/mochitest/pc.js b/dom/media/tests/mochitest/pc.js
new file mode 100644
index 000000000..a9383358f
--- /dev/null
+++ b/dom/media/tests/mochitest/pc.js
@@ -0,0 +1,1878 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const LOOPBACK_ADDR = "127.0.0.";
+
+const iceStateTransitions = {
+ "new": ["checking", "closed"], //Note: 'failed' might need to added here
+ // even though it is not in the standard
+ "checking": ["new", "connected", "failed", "closed"], //Note: do we need to
+ // allow 'completed' in
+ // here as well?
+ "connected": ["new", "completed", "disconnected", "closed"],
+ "completed": ["new", "disconnected", "closed"],
+ "disconnected": ["new", "connected", "completed", "failed", "closed"],
+ "failed": ["new", "disconnected", "closed"],
+ "closed": []
+ }
+
+const signalingStateTransitions = {
+ "stable": ["have-local-offer", "have-remote-offer", "closed"],
+ "have-local-offer": ["have-remote-pranswer", "stable", "closed", "have-local-offer"],
+ "have-remote-pranswer": ["stable", "closed", "have-remote-pranswer"],
+ "have-remote-offer": ["have-local-pranswer", "stable", "closed", "have-remote-offer"],
+ "have-local-pranswer": ["stable", "closed", "have-local-pranswer"],
+ "closed": []
+}
+
+var makeDefaultCommands = () => {
+ return [].concat(commandsPeerConnectionInitial,
+ commandsGetUserMedia,
+ commandsPeerConnectionOfferAnswer);
+};
+
+/**
+ * This class handles tests for peer connections.
+ *
+ * @constructor
+ * @param {object} [options={}]
+ * Optional options for the peer connection test
+ * @param {object} [options.commands=commandsPeerConnection]
+ * Commands to run for the test
+ * @param {bool} [options.is_local=true]
+ * true if this test should run the tests for the "local" side.
+ * @param {bool} [options.is_remote=true]
+ * true if this test should run the tests for the "remote" side.
+ * @param {object} [options.config_local=undefined]
+ * Configuration for the local peer connection instance
+ * @param {object} [options.config_remote=undefined]
+ * Configuration for the remote peer connection instance. If not defined
+ * the configuration from the local instance will be used
+ */
+function PeerConnectionTest(options) {
+ // If no options are specified make it an empty object
+ options = options || { };
+ options.commands = options.commands || makeDefaultCommands();
+ options.is_local = "is_local" in options ? options.is_local : true;
+ options.is_remote = "is_remote" in options ? options.is_remote : true;
+
+ options.h264 = "h264" in options ? options.h264 : false;
+ options.bundle = "bundle" in options ? options.bundle : true;
+ options.rtcpmux = "rtcpmux" in options ? options.rtcpmux : true;
+ options.opus = "opus" in options ? options.opus : true;
+
+ if (iceServersArray.length) {
+ if (!options.turn_disabled_local) {
+ options.config_local = options.config_local || {}
+ options.config_local.iceServers = iceServersArray;
+ }
+ if (!options.turn_disabled_remote) {
+ options.config_remote = options.config_remote || {}
+ options.config_remote.iceServers = iceServersArray;
+ }
+ }
+ else if (typeof turnServers !== "undefined") {
+ if ((!options.turn_disabled_local) && (turnServers.local)) {
+ if (!options.hasOwnProperty("config_local")) {
+ options.config_local = {};
+ }
+ if (!options.config_local.hasOwnProperty("iceServers")) {
+ options.config_local.iceServers = turnServers.local.iceServers;
+ }
+ }
+ if ((!options.turn_disabled_remote) && (turnServers.remote)) {
+ if (!options.hasOwnProperty("config_remote")) {
+ options.config_remote = {};
+ }
+ if (!options.config_remote.hasOwnProperty("iceServers")) {
+ options.config_remote.iceServers = turnServers.remote.iceServers;
+ }
+ }
+ }
+
+ if (options.is_local) {
+ this.pcLocal = new PeerConnectionWrapper('pcLocal', options.config_local);
+ } else {
+ this.pcLocal = null;
+ }
+
+ if (options.is_remote) {
+ this.pcRemote = new PeerConnectionWrapper('pcRemote', options.config_remote || options.config_local);
+ } else {
+ this.pcRemote = null;
+ }
+
+ options.steeplechase = !options.is_local || !options.is_remote;
+
+ // Create command chain instance and assign default commands
+ this.chain = new CommandChain(this, options.commands);
+
+ this.testOptions = options;
+}
+
+/** TODO: consider removing this dependency on timeouts */
+function timerGuard(p, time, message) {
+ return Promise.race([
+ p,
+ wait(time).then(() => {
+ throw new Error('timeout after ' + (time / 1000) + 's: ' + message);
+ })
+ ]);
+}
+
+/**
+ * Closes the peer connection if it is active
+ */
+PeerConnectionTest.prototype.closePC = function() {
+ info("Closing peer connections");
+
+ var closeIt = pc => {
+ if (!pc || pc.signalingState === "closed") {
+ return Promise.resolve();
+ }
+
+ var promise = Promise.all([
+ new Promise(resolve => {
+ pc.onsignalingstatechange = e => {
+ is(e.target.signalingState, "closed", "signalingState is closed");
+ resolve();
+ };
+ }),
+ Promise.all(pc._pc.getReceivers()
+ .filter(receiver => receiver.track.readyState == "live")
+ .map(receiver => {
+ info("Waiting for track " + receiver.track.id + " (" +
+ receiver.track.kind + ") to end.");
+ return haveEvent(receiver.track, "ended", wait(50000))
+ .then(event => {
+ is(event.target, receiver.track, "Event target should be the correct track");
+ info("ended fired for track " + receiver.track.id);
+ }, e => e ? Promise.reject(e)
+ : ok(false, "ended never fired for track " +
+ receiver.track.id));
+ }))
+ ]);
+ pc.close();
+ return promise;
+ };
+
+ return timerGuard(Promise.all([
+ closeIt(this.pcLocal),
+ closeIt(this.pcRemote)
+ ]), 60000, "failed to close peer connection");
+};
+
+/**
+ * Close the open data channels, followed by the underlying peer connection
+ */
+PeerConnectionTest.prototype.close = function() {
+ var allChannels = (this.pcLocal || this.pcRemote).dataChannels;
+ return timerGuard(
+ Promise.all(allChannels.map((channel, i) => this.closeDataChannels(i))),
+ 120000, "failed to close data channels")
+ .then(() => this.closePC());
+};
+
+/**
+ * Close the specified data channels
+ *
+ * @param {Number} index
+ * Index of the data channels to close on both sides
+ */
+PeerConnectionTest.prototype.closeDataChannels = function(index) {
+ info("closeDataChannels called with index: " + index);
+ var localChannel = null;
+ if (this.pcLocal) {
+ localChannel = this.pcLocal.dataChannels[index];
+ }
+ var remoteChannel = null;
+ if (this.pcRemote) {
+ remoteChannel = this.pcRemote.dataChannels[index];
+ }
+
+ // We need to setup all the close listeners before calling close
+ var setupClosePromise = channel => {
+ if (!channel) {
+ return Promise.resolve();
+ }
+ return new Promise(resolve => {
+ channel.onclose = () => {
+ is(channel.readyState, "closed", name + " channel " + index + " closed");
+ resolve();
+ };
+ });
+ };
+
+ // make sure to setup close listeners before triggering any actions
+ var allClosed = Promise.all([
+ setupClosePromise(localChannel),
+ setupClosePromise(remoteChannel)
+ ]);
+ var complete = timerGuard(allClosed, 120000, "failed to close data channel pair");
+
+ // triggering close on one side should suffice
+ if (remoteChannel) {
+ remoteChannel.close();
+ } else if (localChannel) {
+ localChannel.close();
+ }
+
+ return complete;
+};
+
+/**
+ * Send data (message or blob) to the other peer
+ *
+ * @param {String|Blob} data
+ * Data to send to the other peer. For Blobs the MIME type will be lost.
+ * @param {Object} [options={ }]
+ * Options to specify the data channels to be used
+ * @param {DataChannelWrapper} [options.sourceChannel=pcLocal.dataChannels[length - 1]]
+ * Data channel to use for sending the message
+ * @param {DataChannelWrapper} [options.targetChannel=pcRemote.dataChannels[length - 1]]
+ * Data channel to use for receiving the message
+ */
+PeerConnectionTest.prototype.send = function(data, options) {
+ options = options || { };
+ var source = options.sourceChannel ||
+ this.pcLocal.dataChannels[this.pcLocal.dataChannels.length - 1];
+ var target = options.targetChannel ||
+ this.pcRemote.dataChannels[this.pcRemote.dataChannels.length - 1];
+ var bufferedamount = options.bufferedAmountLowThreshold || 0;
+ var bufferlow_fired = true; // to make testing later easier
+ if (bufferedamount != 0) {
+ source.bufferedAmountLowThreshold = bufferedamount;
+ bufferlow_fired = false;
+ source.onbufferedamountlow = function() {
+ bufferlow_fired = true;
+ };
+ }
+
+ return new Promise(resolve => {
+ // Register event handler for the target channel
+ target.onmessage = e => {
+ ok(bufferlow_fired, "bufferedamountlow event fired");
+ resolve({ channel: target, data: e.data });
+ };
+
+ source.send(data);
+ });
+};
+
+/**
+ * Create a data channel
+ *
+ * @param {Dict} options
+ * Options for the data channel (see nsIPeerConnection)
+ */
+PeerConnectionTest.prototype.createDataChannel = function(options) {
+ var remotePromise;
+ if (!options.negotiated) {
+ this.pcRemote.expectDataChannel();
+ remotePromise = this.pcRemote.nextDataChannel;
+ }
+
+ // Create the datachannel
+ var localChannel = this.pcLocal.createDataChannel(options)
+ var localPromise = localChannel.opened;
+
+ if (options.negotiated) {
+ remotePromise = localPromise.then(localChannel => {
+ // externally negotiated - we need to open from both ends
+ options.id = options.id || channel.id; // allow for no id on options
+ var remoteChannel = this.pcRemote.createDataChannel(options);
+ return remoteChannel.opened;
+ });
+ }
+
+ // pcRemote.observedNegotiationNeeded might be undefined if
+ // !options.negotiated, which means we just wait on pcLocal
+ return Promise.all([this.pcLocal.observedNegotiationNeeded,
+ this.pcRemote.observedNegotiationNeeded]).then(() => {
+ return Promise.all([localPromise, remotePromise]).then(result => {
+ return { local: result[0], remote: result[1] };
+ });
+ });
+};
+
+/**
+ * Creates an answer for the specified peer connection instance
+ * and automatically handles the failure case.
+ *
+ * @param {PeerConnectionWrapper} peer
+ * The peer connection wrapper to run the command on
+ */
+PeerConnectionTest.prototype.createAnswer = function(peer) {
+ return peer.createAnswer().then(answer => {
+ // make a copy so this does not get updated with ICE candidates
+ this.originalAnswer = new RTCSessionDescription(JSON.parse(JSON.stringify(answer)));
+ return answer;
+ });
+};
+
+/**
+ * Creates an offer for the specified peer connection instance
+ * and automatically handles the failure case.
+ *
+ * @param {PeerConnectionWrapper} peer
+ * The peer connection wrapper to run the command on
+ */
+PeerConnectionTest.prototype.createOffer = function(peer) {
+ return peer.createOffer().then(offer => {
+ // make a copy so this does not get updated with ICE candidates
+ this.originalOffer = new RTCSessionDescription(JSON.parse(JSON.stringify(offer)));
+ return offer;
+ });
+};
+
+/**
+ * Sets the local description for the specified peer connection instance
+ * and automatically handles the failure case.
+ *
+ * @param {PeerConnectionWrapper} peer
+ The peer connection wrapper to run the command on
+ * @param {RTCSessionDescription} desc
+ * Session description for the local description request
+ */
+PeerConnectionTest.prototype.setLocalDescription =
+function(peer, desc, stateExpected) {
+ var eventFired = new Promise(resolve => {
+ peer.onsignalingstatechange = e => {
+ info(peer + ": 'signalingstatechange' event received");
+ var state = e.target.signalingState;
+ if (stateExpected === state) {
+ peer.setLocalDescStableEventDate = new Date();
+ resolve();
+ } else {
+ ok(false, "This event has either already fired or there has been a " +
+ "mismatch between event received " + state +
+ " and event expected " + stateExpected);
+ }
+ };
+ });
+
+ var stateChanged = peer.setLocalDescription(desc).then(() => {
+ peer.setLocalDescDate = new Date();
+ });
+
+ peer.endOfTrickleSdp = peer.endOfTrickleIce.then(() => {
+ if (this.testOptions.steeplechase) {
+ send_message({"type": "end_of_trickle_ice"});
+ }
+ return peer._pc.localDescription;
+ })
+ .catch(e => ok(false, "Sending EOC message failed: " + e));
+
+ return Promise.all([eventFired, stateChanged]);
+};
+
+/**
+ * Sets the media constraints for both peer connection instances.
+ *
+ * @param {object} constraintsLocal
+ * Media constrains for the local peer connection instance
+ * @param constraintsRemote
+ */
+PeerConnectionTest.prototype.setMediaConstraints =
+function(constraintsLocal, constraintsRemote) {
+ if (this.pcLocal) {
+ this.pcLocal.constraints = constraintsLocal;
+ }
+ if (this.pcRemote) {
+ this.pcRemote.constraints = constraintsRemote;
+ }
+};
+
+/**
+ * Sets the media options used on a createOffer call in the test.
+ *
+ * @param {object} options the media constraints to use on createOffer
+ */
+PeerConnectionTest.prototype.setOfferOptions = function(options) {
+ if (this.pcLocal) {
+ this.pcLocal.offerOptions = options;
+ }
+};
+
+/**
+ * Sets the remote description for the specified peer connection instance
+ * and automatically handles the failure case.
+ *
+ * @param {PeerConnectionWrapper} peer
+ The peer connection wrapper to run the command on
+ * @param {RTCSessionDescription} desc
+ * Session description for the remote description request
+ */
+PeerConnectionTest.prototype.setRemoteDescription =
+function(peer, desc, stateExpected) {
+ var eventFired = new Promise(resolve => {
+ peer.onsignalingstatechange = e => {
+ info(peer + ": 'signalingstatechange' event received");
+ var state = e.target.signalingState;
+ if (stateExpected === state) {
+ peer.setRemoteDescStableEventDate = new Date();
+ resolve();
+ } else {
+ ok(false, "This event has either already fired or there has been a " +
+ "mismatch between event received " + state +
+ " and event expected " + stateExpected);
+ }
+ };
+ });
+
+ var stateChanged = peer.setRemoteDescription(desc).then(() => {
+ peer.setRemoteDescDate = new Date();
+ peer.checkMediaTracks();
+ });
+
+ return Promise.all([eventFired, stateChanged]);
+};
+
+/**
+ * Adds and removes steps to/from the execution chain based on the configured
+ * testOptions.
+ */
+PeerConnectionTest.prototype.updateChainSteps = function() {
+ if (this.testOptions.h264) {
+ this.chain.insertAfterEach(
+ 'PC_LOCAL_CREATE_OFFER',
+ [PC_LOCAL_REMOVE_ALL_BUT_H264_FROM_OFFER]);
+ }
+ if (!this.testOptions.bundle) {
+ this.chain.insertAfterEach(
+ 'PC_LOCAL_CREATE_OFFER',
+ [PC_LOCAL_REMOVE_BUNDLE_FROM_OFFER]);
+ }
+ if (!this.testOptions.rtcpmux) {
+ this.chain.insertAfterEach(
+ 'PC_LOCAL_CREATE_OFFER',
+ [PC_LOCAL_REMOVE_RTCPMUX_FROM_OFFER]);
+ }
+ if (!this.testOptions.is_local) {
+ this.chain.filterOut(/^PC_LOCAL/);
+ }
+ if (!this.testOptions.is_remote) {
+ this.chain.filterOut(/^PC_REMOTE/);
+ }
+};
+
+/**
+ * Start running the tests as assigned to the command chain.
+ */
+PeerConnectionTest.prototype.run = function() {
+ /* We have to modify the chain here to allow tests which modify the default
+ * test chain instantiating a PeerConnectionTest() */
+ this.updateChainSteps();
+ var finished = () => {
+ if (window.SimpleTest) {
+ networkTestFinished();
+ } else {
+ finish();
+ }
+ };
+ return this.chain.execute()
+ .then(() => this.close())
+ .catch(e =>
+ ok(false, 'Error in test execution: ' + e +
+ ((typeof e.stack === 'string') ?
+ (' ' + e.stack.split('\n').join(' ... ')) : '')))
+ .then(() => finished())
+ .catch(e =>
+ ok(false, "Error in finished()"));
+};
+
+/**
+ * Routes ice candidates from one PCW to the other PCW
+ */
+PeerConnectionTest.prototype.iceCandidateHandler = function(caller, candidate) {
+ info("Received: " + JSON.stringify(candidate) + " from " + caller);
+
+ var target = null;
+ if (caller.includes("pcLocal")) {
+ if (this.pcRemote) {
+ target = this.pcRemote;
+ }
+ } else if (caller.includes("pcRemote")) {
+ if (this.pcLocal) {
+ target = this.pcLocal;
+ }
+ } else {
+ ok(false, "received event from unknown caller: " + caller);
+ return;
+ }
+
+ if (target) {
+ target.storeOrAddIceCandidate(candidate);
+ } else {
+ info("sending ice candidate to signaling server");
+ send_message({"type": "ice_candidate", "ice_candidate": candidate});
+ }
+};
+
+/**
+ * Installs a polling function for the socket.io client to read
+ * all messages from the chat room into a message queue.
+ */
+PeerConnectionTest.prototype.setupSignalingClient = function() {
+ this.signalingMessageQueue = [];
+ this.signalingCallbacks = {};
+ this.signalingLoopRun = true;
+
+ var queueMessage = message => {
+ info("Received signaling message: " + JSON.stringify(message));
+ var fired = false;
+ Object.keys(this.signalingCallbacks).forEach(name => {
+ if (name === message.type) {
+ info("Invoking callback for message type: " + name);
+ this.signalingCallbacks[name](message);
+ fired = true;
+ }
+ });
+ if (!fired) {
+ this.signalingMessageQueue.push(message);
+ info("signalingMessageQueue.length: " + this.signalingMessageQueue.length);
+ }
+ if (this.signalingLoopRun) {
+ wait_for_message().then(queueMessage);
+ } else {
+ info("Exiting signaling message event loop");
+ }
+ };
+ wait_for_message().then(queueMessage);
+}
+
+/**
+ * Sets a flag to stop reading further messages from the chat room.
+ */
+PeerConnectionTest.prototype.signalingMessagesFinished = function() {
+ this.signalingLoopRun = false;
+}
+
+/**
+ * Register a callback function to deliver messages from the chat room
+ * directly instead of storing them in the message queue.
+ *
+ * @param {string} messageType
+ * For which message types should the callback get invoked.
+ *
+ * @param {function} onMessage
+ * The function which gets invoked if a message of the messageType
+ * has been received from the chat room.
+ */
+PeerConnectionTest.prototype.registerSignalingCallback = function(messageType, onMessage) {
+ this.signalingCallbacks[messageType] = onMessage;
+};
+
+/**
+ * Searches the message queue for the first message of a given type
+ * and invokes the given callback function, or registers the callback
+ * function for future messages if the queue contains no such message.
+ *
+ * @param {string} messageType
+ * The type of message to search and register for.
+ */
+PeerConnectionTest.prototype.getSignalingMessage = function(messageType) {
+ var i = this.signalingMessageQueue.findIndex(m => m.type === messageType);
+ if (i >= 0) {
+ info("invoking callback on message " + i + " from message queue, for message type:" + messageType);
+ return Promise.resolve(this.signalingMessageQueue.splice(i, 1)[0]);
+ }
+ return new Promise(resolve =>
+ this.registerSignalingCallback(messageType, resolve));
+};
+
+
+/**
+ * This class acts as a wrapper around a DataChannel instance.
+ *
+ * @param dataChannel
+ * @param peerConnectionWrapper
+ * @constructor
+ */
+function DataChannelWrapper(dataChannel, peerConnectionWrapper) {
+ this._channel = dataChannel;
+ this._pc = peerConnectionWrapper;
+
+ info("Creating " + this);
+
+ /**
+ * Setup appropriate callbacks
+ */
+ createOneShotEventWrapper(this, this._channel, 'close');
+ createOneShotEventWrapper(this, this._channel, 'error');
+ createOneShotEventWrapper(this, this._channel, 'message');
+ createOneShotEventWrapper(this, this._channel, 'bufferedamountlow');
+
+ this.opened = timerGuard(new Promise(resolve => {
+ this._channel.onopen = () => {
+ this._channel.onopen = unexpectedEvent(this, 'onopen');
+ is(this.readyState, "open", "data channel is 'open' after 'onopen'");
+ resolve(this);
+ };
+ }), 180000, "channel didn't open in time");
+}
+
+DataChannelWrapper.prototype = {
+ /**
+ * Returns the binary type of the channel
+ *
+ * @returns {String} The binary type
+ */
+ get binaryType() {
+ return this._channel.binaryType;
+ },
+
+ /**
+ * Sets the binary type of the channel
+ *
+ * @param {String} type
+ * The new binary type of the channel
+ */
+ set binaryType(type) {
+ this._channel.binaryType = type;
+ },
+
+ /**
+ * Returns the label of the underlying data channel
+ *
+ * @returns {String} The label
+ */
+ get label() {
+ return this._channel.label;
+ },
+
+ /**
+ * Returns the protocol of the underlying data channel
+ *
+ * @returns {String} The protocol
+ */
+ get protocol() {
+ return this._channel.protocol;
+ },
+
+ /**
+ * Returns the id of the underlying data channel
+ *
+ * @returns {number} The stream id
+ */
+ get id() {
+ return this._channel.id;
+ },
+
+ /**
+ * Returns the reliable state of the underlying data channel
+ *
+ * @returns {bool} The stream's reliable state
+ */
+ get reliable() {
+ return this._channel.reliable;
+ },
+
+ // ordered, maxRetransmits and maxRetransmitTime not exposed yet
+
+ /**
+ * Returns the readyState bit of the data channel
+ *
+ * @returns {String} The state of the channel
+ */
+ get readyState() {
+ return this._channel.readyState;
+ },
+
+ /**
+ * Sets the bufferlowthreshold of the channel
+ *
+ * @param {integer} amoutn
+ * The new threshold for the chanel
+ */
+ set bufferedAmountLowThreshold(amount) {
+ this._channel.bufferedAmountLowThreshold = amount;
+ },
+
+ /**
+ * Close the data channel
+ */
+ close : function () {
+ info(this + ": Closing channel");
+ this._channel.close();
+ },
+
+ /**
+ * Send data through the data channel
+ *
+ * @param {String|Object} data
+ * Data which has to be sent through the data channel
+ */
+ send: function(data) {
+ info(this + ": Sending data '" + data + "'");
+ this._channel.send(data);
+ },
+
+ /**
+ * Returns the string representation of the class
+ *
+ * @returns {String} The string representation
+ */
+ toString: function() {
+ return "DataChannelWrapper (" + this._pc.label + '_' + this._channel.label + ")";
+ }
+};
+
+
+/**
+ * This class acts as a wrapper around a PeerConnection instance.
+ *
+ * @constructor
+ * @param {string} label
+ * Description for the peer connection instance
+ * @param {object} configuration
+ * Configuration for the peer connection instance
+ */
+function PeerConnectionWrapper(label, configuration) {
+ this.configuration = configuration;
+ if (configuration && configuration.label_suffix) {
+ label = label + "_" + configuration.label_suffix;
+ }
+ this.label = label;
+ this.whenCreated = Date.now();
+
+ this.constraints = [ ];
+ this.offerOptions = {};
+
+ this.dataChannels = [ ];
+
+ this._local_ice_candidates = [];
+ this._remote_ice_candidates = [];
+ this.localRequiresTrickleIce = false;
+ this.remoteRequiresTrickleIce = false;
+ this.localMediaElements = [];
+ this.remoteMediaElements = [];
+ this.audioElementsOnly = false;
+
+ this.expectedLocalTrackInfoById = {};
+ this.expectedRemoteTrackInfoById = {};
+ this.observedRemoteTrackInfoById = {};
+
+ this.disableRtpCountChecking = false;
+
+ this.iceConnectedResolve;
+ this.iceConnectedReject;
+ this.iceConnected = new Promise((resolve, reject) => {
+ this.iceConnectedResolve = resolve;
+ this.iceConnectedReject = reject;
+ });
+ this.iceCheckingRestartExpected = false;
+ this.iceCheckingIceRollbackExpected = false;
+
+ info("Creating " + this);
+ this._pc = new RTCPeerConnection(this.configuration);
+
+ /**
+ * Setup callback handlers
+ */
+ // This allows test to register their own callbacks for ICE connection state changes
+ this.ice_connection_callbacks = {};
+
+ this._pc.oniceconnectionstatechange = e => {
+ isnot(typeof this._pc.iceConnectionState, "undefined",
+ "iceConnectionState should not be undefined");
+ var iceState = this._pc.iceConnectionState;
+ info(this + ": oniceconnectionstatechange fired, new state is: " + iceState);
+ Object.keys(this.ice_connection_callbacks).forEach(name => {
+ this.ice_connection_callbacks[name]();
+ });
+ if (iceState === "connected") {
+ this.iceConnectedResolve();
+ } else if (iceState === "failed") {
+ this.iceConnectedReject();
+ }
+ };
+
+ createOneShotEventWrapper(this, this._pc, 'datachannel');
+ this._pc.addEventListener('datachannel', e => {
+ var wrapper = new DataChannelWrapper(e.channel, this);
+ this.dataChannels.push(wrapper);
+ });
+
+ createOneShotEventWrapper(this, this._pc, 'signalingstatechange');
+ createOneShotEventWrapper(this, this._pc, 'negotiationneeded');
+}
+
+PeerConnectionWrapper.prototype = {
+
+ /**
+ * Returns the local description.
+ *
+ * @returns {object} The local description
+ */
+ get localDescription() {
+ return this._pc.localDescription;
+ },
+
+ /**
+ * Sets the local description.
+ *
+ * @param {object} desc
+ * The new local description
+ */
+ set localDescription(desc) {
+ this._pc.localDescription = desc;
+ },
+
+ /**
+ * Returns the remote description.
+ *
+ * @returns {object} The remote description
+ */
+ get remoteDescription() {
+ return this._pc.remoteDescription;
+ },
+
+ /**
+ * Sets the remote description.
+ *
+ * @param {object} desc
+ * The new remote description
+ */
+ set remoteDescription(desc) {
+ this._pc.remoteDescription = desc;
+ },
+
+ /**
+ * Returns the signaling state.
+ *
+ * @returns {object} The local description
+ */
+ get signalingState() {
+ return this._pc.signalingState;
+ },
+ /**
+ * Returns the ICE connection state.
+ *
+ * @returns {object} The local description
+ */
+ get iceConnectionState() {
+ return this._pc.iceConnectionState;
+ },
+
+ setIdentityProvider: function(provider, protocol, identity) {
+ this._pc.setIdentityProvider(provider, protocol, identity);
+ },
+
+ ensureMediaElement : function(track, direction) {
+ const idPrefix = [this.label, direction].join('_');
+ var element = getMediaElementForTrack(track, idPrefix);
+
+ if (!element) {
+ element = createMediaElementForTrack(track, idPrefix);
+ if (direction == "local") {
+ this.localMediaElements.push(element);
+ } else if (direction == "remote") {
+ this.remoteMediaElements.push(element);
+ }
+ }
+
+ // We do this regardless, because sometimes we end up with a new stream with
+ // an old id (ie; the rollback tests cause the same stream to be added
+ // twice)
+ element.srcObject = new MediaStream([track]);
+ element.play();
+ },
+
+ /**
+ * Attaches a local track to this RTCPeerConnection using
+ * RTCPeerConnection.addTrack().
+ *
+ * Also creates a media element playing a MediaStream containing all
+ * tracks that have been added to `stream` using `attachLocalTrack()`.
+ *
+ * @param {MediaStreamTrack} track
+ * MediaStreamTrack to handle
+ * @param {MediaStream} stream
+ * MediaStream to use as container for `track` on remote side
+ */
+ attachLocalTrack : function(track, stream) {
+ info("Got a local " + track.kind + " track");
+
+ this.expectNegotiationNeeded();
+ var sender = this._pc.addTrack(track, stream);
+ is(sender.track, track, "addTrack returns sender");
+
+ ok(track.id, "track has id");
+ ok(track.kind, "track has kind");
+ ok(stream.id, "stream has id");
+ this.expectedLocalTrackInfoById[track.id] = {
+ type: track.kind,
+ streamId: stream.id,
+ };
+
+ // This will create one media element per track, which might not be how
+ // we set up things with the RTCPeerConnection. It's the only way
+ // we can ensure all sent tracks are flowing however.
+ this.ensureMediaElement(track, "local");
+
+ return this.observedNegotiationNeeded;
+ },
+
+ /**
+ * Callback when we get local media. Also an appropriate HTML media element
+ * will be created and added to the content node.
+ *
+ * @param {MediaStream} stream
+ * Media stream to handle
+ */
+ attachLocalStream : function(stream) {
+ info("Got local media stream: (" + stream.id + ")");
+
+ this.expectNegotiationNeeded();
+ // In order to test both the addStream and addTrack APIs, we do half one
+ // way, half the other, at random.
+ if (Math.random() < 0.5) {
+ info("Using addStream.");
+ this._pc.addStream(stream);
+ ok(this._pc.getSenders().find(sender => sender.track == stream.getTracks()[0]),
+ "addStream returns sender");
+ } else {
+ info("Using addTrack (on PC).");
+ stream.getTracks().forEach(track => {
+ var sender = this._pc.addTrack(track, stream);
+ is(sender.track, track, "addTrack returns sender");
+ });
+ }
+
+ stream.getTracks().forEach(track => {
+ ok(track.id, "track has id");
+ ok(track.kind, "track has kind");
+ this.expectedLocalTrackInfoById[track.id] = {
+ type: track.kind,
+ streamId: stream.id
+ };
+ this.ensureMediaElement(track, "local");
+ });
+ },
+
+ removeSender : function(index) {
+ var sender = this._pc.getSenders()[index];
+ delete this.expectedLocalTrackInfoById[sender.track.id];
+ this.expectNegotiationNeeded();
+ this._pc.removeTrack(sender);
+ return this.observedNegotiationNeeded;
+ },
+
+ senderReplaceTrack : function(index, withTrack, withStreamId) {
+ var sender = this._pc.getSenders()[index];
+ delete this.expectedLocalTrackInfoById[sender.track.id];
+ this.expectedLocalTrackInfoById[withTrack.id] = {
+ type: withTrack.kind,
+ streamId: withStreamId
+ };
+ return sender.replaceTrack(withTrack);
+ },
+
+ /**
+ * Requests all the media streams as specified in the constrains property.
+ *
+ * @param {array} constraintsList
+ * Array of constraints for GUM calls
+ */
+ getAllUserMedia : function(constraintsList) {
+ if (constraintsList.length === 0) {
+ info("Skipping GUM: no UserMedia requested");
+ return Promise.resolve();
+ }
+
+ info("Get " + constraintsList.length + " local streams");
+ return Promise.all(constraintsList.map(constraints => {
+ return getUserMedia(constraints).then(stream => {
+ if (constraints.audio) {
+ stream.getAudioTracks().map(track => {
+ info(this + " gUM local stream " + stream.id +
+ " with audio track " + track.id);
+ });
+ }
+ if (constraints.video) {
+ stream.getVideoTracks().map(track => {
+ info(this + " gUM local stream " + stream.id +
+ " with video track " + track.id);
+ });
+ }
+ return this.attachLocalStream(stream);
+ });
+ }));
+ },
+
+ /**
+ * Create a new data channel instance. Also creates a promise called
+ * `this.nextDataChannel` that resolves when the next data channel arrives.
+ */
+ expectDataChannel: function(message) {
+ this.nextDataChannel = new Promise(resolve => {
+ this.ondatachannel = e => {
+ ok(e.channel, message);
+ resolve(e.channel);
+ };
+ });
+ },
+
+ /**
+ * Create a new data channel instance
+ *
+ * @param {Object} options
+ * Options which get forwarded to nsIPeerConnection.createDataChannel
+ * @returns {DataChannelWrapper} The created data channel
+ */
+ createDataChannel : function(options) {
+ var label = 'channel_' + this.dataChannels.length;
+ info(this + ": Create data channel '" + label);
+
+ if (!this.dataChannels.length) {
+ this.expectNegotiationNeeded();
+ }
+ var channel = this._pc.createDataChannel(label, options);
+ var wrapper = new DataChannelWrapper(channel, this);
+ this.dataChannels.push(wrapper);
+ return wrapper;
+ },
+
+ /**
+ * Creates an offer and automatically handles the failure case.
+ */
+ createOffer : function() {
+ return this._pc.createOffer(this.offerOptions).then(offer => {
+ info("Got offer: " + JSON.stringify(offer));
+ // note: this might get updated through ICE gathering
+ this._latest_offer = offer;
+ return offer;
+ });
+ },
+
+ /**
+ * Creates an answer and automatically handles the failure case.
+ */
+ createAnswer : function() {
+ return this._pc.createAnswer().then(answer => {
+ info(this + ": Got answer: " + JSON.stringify(answer));
+ this._last_answer = answer;
+ return answer;
+ });
+ },
+
+ /**
+ * Sets the local description and automatically handles the failure case.
+ *
+ * @param {object} desc
+ * RTCSessionDescription for the local description request
+ */
+ setLocalDescription : function(desc) {
+ this.observedNegotiationNeeded = undefined;
+ return this._pc.setLocalDescription(desc).then(() => {
+ info(this + ": Successfully set the local description");
+ });
+ },
+
+ /**
+ * Tries to set the local description and expect failure. Automatically
+ * causes the test case to fail if the call succeeds.
+ *
+ * @param {object} desc
+ * RTCSessionDescription for the local description request
+ * @returns {Promise}
+ * A promise that resolves to the expected error
+ */
+ setLocalDescriptionAndFail : function(desc) {
+ return this._pc.setLocalDescription(desc).then(
+ generateErrorCallback("setLocalDescription should have failed."),
+ err => {
+ info(this + ": As expected, failed to set the local description");
+ return err;
+ });
+ },
+
+ /**
+ * Sets the remote description and automatically handles the failure case.
+ *
+ * @param {object} desc
+ * RTCSessionDescription for the remote description request
+ */
+ setRemoteDescription : function(desc) {
+ this.observedNegotiationNeeded = undefined;
+ return this._pc.setRemoteDescription(desc).then(() => {
+ info(this + ": Successfully set remote description");
+ if (desc.type == "rollback") {
+ this.holdIceCandidates = new Promise(r => this.releaseIceCandidates = r);
+
+ } else {
+ this.releaseIceCandidates();
+ }
+ });
+ },
+
+ /**
+ * Tries to set the remote description and expect failure. Automatically
+ * causes the test case to fail if the call succeeds.
+ *
+ * @param {object} desc
+ * RTCSessionDescription for the remote description request
+ * @returns {Promise}
+ * a promise that resolve to the returned error
+ */
+ setRemoteDescriptionAndFail : function(desc) {
+ return this._pc.setRemoteDescription(desc).then(
+ generateErrorCallback("setRemoteDescription should have failed."),
+ err => {
+ info(this + ": As expected, failed to set the remote description");
+ return err;
+ });
+ },
+
+ /**
+ * Registers a callback for the signaling state change and
+ * appends the new state to an array for logging it later.
+ */
+ logSignalingState: function() {
+ this.signalingStateLog = [this._pc.signalingState];
+ this._pc.addEventListener('signalingstatechange', e => {
+ var newstate = this._pc.signalingState;
+ var oldstate = this.signalingStateLog[this.signalingStateLog.length - 1]
+ if (Object.keys(signalingStateTransitions).indexOf(oldstate) >= 0) {
+ ok(signalingStateTransitions[oldstate].indexOf(newstate) >= 0, this + ": legal signaling state transition from " + oldstate + " to " + newstate);
+ } else {
+ ok(false, this + ": old signaling state " + oldstate + " missing in signaling transition array");
+ }
+ this.signalingStateLog.push(newstate);
+ });
+ },
+
+ /**
+ * Checks whether a given track is expected, has not been observed yet, and
+ * is of the correct type. Then, moves the track from
+ * |expectedTrackInfoById| to |observedTrackInfoById|.
+ */
+ checkTrackIsExpected : function(track,
+ expectedTrackInfoById,
+ observedTrackInfoById) {
+ ok(expectedTrackInfoById[track.id], "track id " + track.id + " was expected");
+ ok(!observedTrackInfoById[track.id], "track id " + track.id + " was not yet observed");
+ var observedKind = track.kind;
+ var expectedKind = expectedTrackInfoById[track.id].type;
+ is(observedKind, expectedKind,
+ "track id " + track.id + " was of kind " +
+ observedKind + ", which matches " + expectedKind);
+ observedTrackInfoById[track.id] = expectedTrackInfoById[track.id];
+ },
+
+ isTrackOnPC: function(track) {
+ return this._pc.getRemoteStreams().some(s => !!s.getTrackById(track.id));
+ },
+
+ allExpectedTracksAreObserved: function(expected, observed) {
+ return Object.keys(expected).every(trackId => observed[trackId]);
+ },
+
+ setupTrackEventHandler: function() {
+ this._pc.addEventListener('track', event => {
+ info(this + ": 'ontrack' event fired for " + JSON.stringify(event.track));
+
+ this.checkTrackIsExpected(event.track,
+ this.expectedRemoteTrackInfoById,
+ this.observedRemoteTrackInfoById);
+ ok(this.isTrackOnPC(event.track), "Found track " + event.track.id);
+
+ this.ensureMediaElement(event.track, 'remote');
+ });
+ },
+
+ /**
+ * Either adds a given ICE candidate right away or stores it to be added
+ * later, depending on the state of the PeerConnection.
+ *
+ * @param {object} candidate
+ * The RTCIceCandidate to be added or stored
+ */
+ storeOrAddIceCandidate : function(candidate) {
+ this._remote_ice_candidates.push(candidate);
+ if (this.signalingState === 'closed') {
+ info("Received ICE candidate for closed PeerConnection - discarding");
+ return;
+ }
+ this.holdIceCandidates.then(() => {
+ info(this + ": adding ICE candidate " + JSON.stringify(candidate));
+ return this._pc.addIceCandidate(candidate);
+ })
+ .then(() => ok(true, this + " successfully added an ICE candidate"))
+ .catch(e =>
+ // The onicecandidate callback runs independent of the test steps
+ // and therefore errors thrown from in there don't get caught by the
+ // race of the Promises around our test steps.
+ // Note: as long as we are queuing ICE candidates until the success
+ // of sRD() this should never ever happen.
+ ok(false, this + " adding ICE candidate failed with: " + e.message)
+ );
+ },
+
+ /**
+ * Registers a callback for the ICE connection state change and
+ * appends the new state to an array for logging it later.
+ */
+ logIceConnectionState: function() {
+ this.iceConnectionLog = [this._pc.iceConnectionState];
+ this.ice_connection_callbacks.logIceStatus = () => {
+ var newstate = this._pc.iceConnectionState;
+ var oldstate = this.iceConnectionLog[this.iceConnectionLog.length - 1]
+ if (Object.keys(iceStateTransitions).indexOf(oldstate) != -1) {
+ if (this.iceCheckingRestartExpected) {
+ is(newstate, "checking",
+ "iceconnectionstate event \'" + newstate +
+ "\' matches expected state \'checking\'");
+ this.iceCheckingRestartExpected = false;
+ } else if (this.iceCheckingIceRollbackExpected) {
+ is(newstate, "connected",
+ "iceconnectionstate event \'" + newstate +
+ "\' matches expected state \'connected\'");
+ this.iceCheckingIceRollbackExpected = false;
+ } else {
+ ok(iceStateTransitions[oldstate].indexOf(newstate) != -1, this + ": legal ICE state transition from " + oldstate + " to " + newstate);
+ }
+ } else {
+ ok(false, this + ": old ICE state " + oldstate + " missing in ICE transition array");
+ }
+ this.iceConnectionLog.push(newstate);
+ };
+ },
+
+ /**
+ * Resets the ICE connected Promise and allows ICE connection state monitoring
+ * to go backwards to 'checking'.
+ */
+ expectIceChecking : function() {
+ this.iceCheckingRestartExpected = true;
+ this.iceConnected = new Promise((resolve, reject) => {
+ this.iceConnectedResolve = resolve;
+ this.iceConnectedReject = reject;
+ });
+ },
+
+ /**
+ * Waits for ICE to either connect or fail.
+ *
+ * @returns {Promise}
+ * resolves when connected, rejects on failure
+ */
+ waitForIceConnected : function() {
+ return this.iceConnected;
+ },
+
+ /**
+ * Setup a onicecandidate handler
+ *
+ * @param {object} test
+ * A PeerConnectionTest object to which the ice candidates gets
+ * forwarded.
+ */
+ setupIceCandidateHandler : function(test, candidateHandler) {
+ candidateHandler = candidateHandler || test.iceCandidateHandler.bind(test);
+
+ var resolveEndOfTrickle;
+ this.endOfTrickleIce = new Promise(r => resolveEndOfTrickle = r);
+ this.holdIceCandidates = new Promise(r => this.releaseIceCandidates = r);
+
+ this._pc.onicecandidate = anEvent => {
+ if (!anEvent.candidate) {
+ this._pc.onicecandidate = () =>
+ ok(false, this.label + " received ICE candidate after end of trickle");
+ info(this.label + ": received end of trickle ICE event");
+ /* Bug 1193731. Accroding to WebRTC spec 4.3.1 the ICE Agent first sets
+ * the gathering state to completed (step 3.) before sending out the
+ * null newCandidate in step 4. */
+ todo(this._pc.iceGatheringState === 'completed',
+ "ICE gathering state has reached completed");
+ resolveEndOfTrickle(this.label);
+ return;
+ }
+
+ info(this.label + ": iceCandidate = " + JSON.stringify(anEvent.candidate));
+ ok(anEvent.candidate.candidate.length > 0, "ICE candidate contains candidate");
+ ok(anEvent.candidate.sdpMid.length > 0, "SDP mid not empty");
+
+ // only check the m-section for the updated default addr that corresponds
+ // with this candidate.
+ var mSections = this.localDescription.sdp.split("\r\nm=");
+ sdputils.checkSdpCLineNotDefault(
+ mSections[anEvent.candidate.sdpMLineIndex+1], this.label
+ );
+
+ ok(typeof anEvent.candidate.sdpMLineIndex === 'number', "SDP MLine Index needs to exist");
+ this._local_ice_candidates.push(anEvent.candidate);
+ candidateHandler(this.label, anEvent.candidate);
+ };
+ },
+
+ checkLocalMediaTracks : function() {
+ var observed = {};
+ info(this + " Checking local tracks " + JSON.stringify(this.expectedLocalTrackInfoById));
+ this._pc.getSenders().forEach(sender => {
+ this.checkTrackIsExpected(sender.track, this.expectedLocalTrackInfoById, observed);
+ });
+
+ Object.keys(this.expectedLocalTrackInfoById).forEach(
+ id => ok(observed[id], this + " local id " + id + " was observed"));
+ },
+
+ /**
+ * Checks that we are getting the media tracks we expect.
+ */
+ checkMediaTracks : function() {
+ this.checkLocalMediaTracks();
+
+ info(this + " Checking remote tracks " +
+ JSON.stringify(this.expectedRemoteTrackInfoById));
+
+ ok(this.allExpectedTracksAreObserved(this.expectedRemoteTrackInfoById,
+ this.observedRemoteTrackInfoById),
+ "All expected tracks have been observed"
+ + "\nexpected: " + JSON.stringify(this.expectedRemoteTrackInfoById)
+ + "\nobserved: " + JSON.stringify(this.observedRemoteTrackInfoById));
+ },
+
+ checkMsids: function() {
+ var checkSdpForMsids = (desc, expectedTrackInfo, side) => {
+ Object.keys(expectedTrackInfo).forEach(trackId => {
+ var streamId = expectedTrackInfo[trackId].streamId;
+ ok(desc.sdp.match(new RegExp("a=msid:" + streamId + " " + trackId)),
+ this + ": " + side + " SDP contains stream " + streamId +
+ " and track " + trackId );
+ });
+ };
+
+ checkSdpForMsids(this.localDescription, this.expectedLocalTrackInfoById,
+ "local");
+ checkSdpForMsids(this.remoteDescription, this.expectedRemoteTrackInfoById,
+ "remote");
+ },
+
+ markRemoteTracksAsNegotiated: function() {
+ Object.values(this.observedRemoteTrackInfoById).forEach(
+ trackInfo => trackInfo.negotiated = true);
+ },
+
+ rollbackRemoteTracksIfNotNegotiated: function() {
+ Object.keys(this.observedRemoteTrackInfoById).forEach(
+ id => {
+ if (!this.observedRemoteTrackInfoById[id].negotiated) {
+ delete this.observedRemoteTrackInfoById[id];
+ }
+ });
+ },
+
+ /**
+ * Check that media flow is present for the given media element by checking
+ * that it reaches ready state HAVE_ENOUGH_DATA and progresses time further
+ * than the start of the check.
+ *
+ * This ensures, that the stream being played is producing
+ * data and, in case it contains a video track, that at least one video frame
+ * has been displayed.
+ *
+ * @param {HTMLMediaElement} track
+ * The media element to check
+ * @returns {Promise}
+ * A promise that resolves when media data is flowing.
+ */
+ waitForMediaElementFlow : function(element) {
+ info("Checking data flow for element: " + element.id);
+ is(element.ended, !element.srcObject.active,
+ "Element ended should be the inverse of the MediaStream's active state");
+ if (element.ended) {
+ is(element.readyState, element.HAVE_CURRENT_DATA,
+ "Element " + element.id + " is ended and should have had data");
+ return Promise.resolve();
+ }
+
+ const haveEnoughData = (element.readyState == element.HAVE_ENOUGH_DATA ?
+ Promise.resolve() :
+ haveEvent(element, "canplay", wait(60000,
+ new Error("Timeout for element " + element.id))))
+ .then(_ => info("Element " + element.id + " has enough data."));
+
+ const startTime = element.currentTime;
+ const timeProgressed = timeout(
+ listenUntil(element, "timeupdate", _ => element.currentTime > startTime),
+ 60000, "Element " + element.id + " should progress currentTime")
+ .then();
+
+ return Promise.all([haveEnoughData, timeProgressed]);
+ },
+
+ /**
+ * Wait for RTP packet flow for the given MediaStreamTrack.
+ *
+ * @param {object} track
+ * A MediaStreamTrack to wait for data flow on.
+ * @returns {Promise}
+ * A promise that resolves when media is flowing.
+ */
+ waitForRtpFlow(track) {
+ var hasFlow = stats => {
+ var rtp = stats.get([...stats.keys()].find(key =>
+ !stats.get(key).isRemote && stats.get(key).type.endsWith("boundrtp")));
+ ok(rtp, "Should have RTP stats for track " + track.id);
+ if (!rtp) {
+ return false;
+ }
+ var nrPackets = rtp[rtp.type == "outboundrtp" ? "packetsSent"
+ : "packetsReceived"];
+ info("Track " + track.id + " has " + nrPackets + " " +
+ rtp.type + " RTP packets.");
+ return nrPackets > 0;
+ };
+
+ info("Checking RTP packet flow for track " + track.id);
+
+ var retry = (delay) => this._pc.getStats(track)
+ .then(stats => hasFlow(stats)? ok(true, "RTP flowing for track " + track.id) :
+ wait(delay).then(retry(1000)));
+ return retry(200);
+ },
+
+ /**
+ * Wait for presence of video flow on all media elements and rtp flow on
+ * all sending and receiving track involved in this test.
+ *
+ * @returns {Promise}
+ * A promise that resolves when media flows for all elements and tracks
+ */
+ waitForMediaFlow : function() {
+ return Promise.all([].concat(
+ this.localMediaElements.map(element => this.waitForMediaElementFlow(element)),
+ Object.keys(this.expectedRemoteTrackInfoById)
+ .map(id => this.remoteMediaElements
+ .find(e => e.srcObject.getTracks().some(t => t.id == id)))
+ .map(e => this.waitForMediaElementFlow(e)),
+ this._pc.getSenders().map(sender => this.waitForRtpFlow(sender.track)),
+ this._pc.getReceivers().map(receiver => this.waitForRtpFlow(receiver.track))));
+ },
+
+ /**
+ * Check that correct audio (typically a flat tone) is flowing to this
+ * PeerConnection. Uses WebAudio AnalyserNodes to compare input and output
+ * audio data in the frequency domain.
+ *
+ * @param {object} from
+ * A PeerConnectionWrapper whose audio RTPSender we use as source for
+ * the audio flow check.
+ * @returns {Promise}
+ * A promise that resolves when we're receiving the tone from |from|.
+ */
+ checkReceivingToneFrom : function(audiocontext, from) {
+ var inputElem = from.localMediaElements[0];
+
+ // As input we use the stream of |from|'s first available audio sender.
+ var inputSenderTracks = from._pc.getSenders().map(sn => sn.track);
+ var inputAudioStream = from._pc.getLocalStreams()
+ .find(s => inputSenderTracks.some(t => t.kind == "audio" && s.getTrackById(t.id)));
+ var inputAnalyser = new AudioStreamAnalyser(audiocontext, inputAudioStream);
+
+ // It would have been nice to have a working getReceivers() here, but until
+ // we do, let's use what remote streams we have.
+ var outputAudioStream = this._pc.getRemoteStreams()
+ .find(s => s.getAudioTracks().length > 0);
+ var outputAnalyser = new AudioStreamAnalyser(audiocontext, outputAudioStream);
+
+ var maxWithIndex = (a, b, i) => (b >= a.value) ? { value: b, index: i } : a;
+ var initial = { value: -1, index: -1 };
+
+ return new Promise((resolve, reject) => inputElem.ontimeupdate = () => {
+ var inputData = inputAnalyser.getByteFrequencyData();
+ var outputData = outputAnalyser.getByteFrequencyData();
+
+ var inputMax = inputData.reduce(maxWithIndex, initial);
+ var outputMax = outputData.reduce(maxWithIndex, initial);
+ info("Comparing maxima; input[" + inputMax.index + "] = " + inputMax.value +
+ ", output[" + outputMax.index + "] = " + outputMax.value);
+ if (!inputMax.value || !outputMax.value) {
+ return;
+ }
+
+ // When the input and output maxima are within reasonable distance
+ // from each other, we can be sure that the input tone has made it
+ // through the peer connection.
+ if (Math.abs(inputMax.index - outputMax.index) < 10) {
+ ok(true, "input and output audio data matches");
+ inputElem.ontimeupdate = null;
+ resolve();
+ }
+ });
+ },
+
+ /**
+ * Check that stats are present by checking for known stats.
+ */
+ getStats : function(selector) {
+ return this._pc.getStats(selector).then(stats => {
+ info(this + ": Got stats: " + JSON.stringify(stats));
+ this._last_stats = stats;
+ return stats;
+ });
+ },
+
+ /**
+ * Checks that we are getting the media streams we expect.
+ *
+ * @param {object} stats
+ * The stats to check from this PeerConnectionWrapper
+ */
+ checkStats : function(stats, twoMachines) {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+
+ // Use spec way of enumerating stats
+ var counters = {};
+ for (let [key, res] of stats) {
+ // validate stats
+ ok(res.id == key, "Coherent stats id");
+ var nowish = Date.now() + 1000; // TODO: clock drift observed
+ var minimum = this.whenCreated - 1000; // on Windows XP (Bug 979649)
+ if (isWinXP) {
+ todo(false, "Can't reliably test rtcp timestamps on WinXP (Bug 979649)");
+ } else if (!twoMachines) {
+ // Bug 1225729: On android, sometimes the first RTCP of the first
+ // test run gets this value, likely because no RTP has been sent yet.
+ if (res.timestamp != 2085978496000) {
+ ok(res.timestamp >= minimum,
+ "Valid " + (res.isRemote? "rtcp" : "rtp") + " timestamp " +
+ res.timestamp + " >= " + minimum + " (" +
+ (res.timestamp - minimum) + " ms)");
+ ok(res.timestamp <= nowish,
+ "Valid " + (res.isRemote? "rtcp" : "rtp") + " timestamp " +
+ res.timestamp + " <= " + nowish + " (" +
+ (res.timestamp - nowish) + " ms)");
+ } else {
+ info("Bug 1225729: Uninitialized timestamp (" + res.timestamp +
+ "), should be >=" + minimum + " and <= " + nowish);
+ }
+ }
+ if (res.isRemote) {
+ continue;
+ }
+ counters[res.type] = (counters[res.type] || 0) + 1;
+
+ switch (res.type) {
+ case "inboundrtp":
+ case "outboundrtp": {
+ // ssrc is a 32 bit number returned as a string by spec
+ ok(res.ssrc.length > 0, "Ssrc has length");
+ ok(res.ssrc.length < 11, "Ssrc not lengthy");
+ ok(!/[^0-9]/.test(res.ssrc), "Ssrc numeric");
+ ok(parseInt(res.ssrc) < Math.pow(2,32), "Ssrc within limits");
+
+ if (res.type == "outboundrtp") {
+ ok(res.packetsSent !== undefined, "Rtp packetsSent");
+ // We assume minimum payload to be 1 byte (guess from RFC 3550)
+ ok(res.bytesSent >= res.packetsSent, "Rtp bytesSent");
+ } else {
+ ok(res.packetsReceived !== undefined, "Rtp packetsReceived");
+ ok(res.bytesReceived >= res.packetsReceived, "Rtp bytesReceived");
+ }
+ if (res.remoteId) {
+ var rem = stats[res.remoteId];
+ ok(rem.isRemote, "Remote is rtcp");
+ ok(rem.remoteId == res.id, "Remote backlink match");
+ if(res.type == "outboundrtp") {
+ ok(rem.type == "inboundrtp", "Rtcp is inbound");
+ ok(rem.packetsReceived !== undefined, "Rtcp packetsReceived");
+ ok(rem.packetsLost !== undefined, "Rtcp packetsLost");
+ ok(rem.bytesReceived >= rem.packetsReceived, "Rtcp bytesReceived");
+ if (!this.disableRtpCountChecking) {
+ ok(rem.packetsReceived <= res.packetsSent, "No more than sent packets");
+ ok(rem.bytesReceived <= res.bytesSent, "No more than sent bytes");
+ }
+ ok(rem.jitter !== undefined, "Rtcp jitter");
+ ok(rem.mozRtt !== undefined, "Rtcp rtt");
+ ok(rem.mozRtt >= 0, "Rtcp rtt " + rem.mozRtt + " >= 0");
+ ok(rem.mozRtt < 60000, "Rtcp rtt " + rem.mozRtt + " < 1 min");
+ } else {
+ ok(rem.type == "outboundrtp", "Rtcp is outbound");
+ ok(rem.packetsSent !== undefined, "Rtcp packetsSent");
+ // We may have received more than outdated Rtcp packetsSent
+ ok(rem.bytesSent >= rem.packetsSent, "Rtcp bytesSent");
+ }
+ ok(rem.ssrc == res.ssrc, "Remote ssrc match");
+ } else {
+ info("No rtcp info received yet");
+ }
+ }
+ break;
+ }
+ }
+
+ // Use legacy way of enumerating stats
+ var counters2 = {};
+ for (let key in stats) {
+ if (!stats.hasOwnProperty(key)) {
+ continue;
+ }
+ var res = stats[key];
+ if (!res.isRemote) {
+ counters2[res.type] = (counters2[res.type] || 0) + 1;
+ }
+ }
+ is(JSON.stringify(counters), JSON.stringify(counters2),
+ "Spec and legacy variant of RTCStatsReport enumeration agree");
+ var nin = Object.keys(this.expectedRemoteTrackInfoById).length;
+ var nout = Object.keys(this.expectedLocalTrackInfoById).length;
+ var ndata = this.dataChannels.length;
+
+ // TODO(Bug 957145): Restore stronger inboundrtp test once Bug 948249 is fixed
+ //is((counters["inboundrtp"] || 0), nin, "Have " + nin + " inboundrtp stat(s)");
+ ok((counters.inboundrtp || 0) >= nin, "Have at least " + nin + " inboundrtp stat(s) *");
+
+ is(counters.outboundrtp || 0, nout, "Have " + nout + " outboundrtp stat(s)");
+
+ var numLocalCandidates = counters.localcandidate || 0;
+ var numRemoteCandidates = counters.remotecandidate || 0;
+ // If there are no tracks, there will be no stats either.
+ if (nin + nout + ndata > 0) {
+ ok(numLocalCandidates, "Have localcandidate stat(s)");
+ ok(numRemoteCandidates, "Have remotecandidate stat(s)");
+ } else {
+ is(numLocalCandidates, 0, "Have no localcandidate stats");
+ is(numRemoteCandidates, 0, "Have no remotecandidate stats");
+ }
+ },
+
+ /**
+ * Compares the Ice server configured for this PeerConnectionWrapper
+ * with the ICE candidates received in the RTCP stats.
+ *
+ * @param {object} stats
+ * The stats to be verified for relayed vs. direct connection.
+ */
+ checkStatsIceConnectionType : function(stats, expectedLocalCandidateType) {
+ let lId;
+ let rId;
+ for (let stat of stats.values()) {
+ if (stat.type == "candidatepair" && stat.selected) {
+ lId = stat.localCandidateId;
+ rId = stat.remoteCandidateId;
+ break;
+ }
+ }
+ isnot(lId, undefined, "Got local candidate ID " + lId + " for selected pair");
+ isnot(rId, undefined, "Got remote candidate ID " + rId + " for selected pair");
+ let lCand = stats.get(lId);
+ let rCand = stats.get(rId);
+ if (!lCand || !rCand) {
+ ok(false,
+ "failed to find candidatepair IDs or stats for local: "+ lId +" remote: "+ rId);
+ return;
+ }
+
+ info("checkStatsIceConnectionType verifying: local=" +
+ JSON.stringify(lCand) + " remote=" + JSON.stringify(rCand));
+ expectedLocalCandidateType = expectedLocalCandidateType || "host";
+ var candidateType = lCand.candidateType;
+ if ((lCand.mozLocalTransport === "tcp") && (candidateType === "relayed")) {
+ candidateType = "relayed-tcp";
+ }
+
+ if ((expectedLocalCandidateType === "serverreflexive") &&
+ (candidateType === "peerreflexive")) {
+ // Be forgiving of prflx when expecting srflx, since that can happen due
+ // to timing.
+ candidateType = "serverreflexive";
+ }
+
+ is(candidateType,
+ expectedLocalCandidateType,
+ "Local candidate type is what we expected for selected pair");
+ },
+
+ /**
+ * Compares amount of established ICE connection according to ICE candidate
+ * pairs in the stats reporting with the expected amount of connection based
+ * on the constraints.
+ *
+ * @param {object} stats
+ * The stats to check for ICE candidate pairs
+ * @param {object} counters
+ * The counters for media and data tracks based on constraints
+ * @param {object} testOptions
+ * The test options object from the PeerConnectionTest
+ */
+ checkStatsIceConnections : function(stats,
+ offerConstraintsList, offerOptions, testOptions) {
+ var numIceConnections = 0;
+ Object.keys(stats).forEach(key => {
+ if ((stats[key].type === "candidatepair") && stats[key].selected) {
+ numIceConnections += 1;
+ }
+ });
+ info("ICE connections according to stats: " + numIceConnections);
+ isnot(numIceConnections, 0, "Number of ICE connections according to stats is not zero");
+ if (testOptions.bundle) {
+ if (testOptions.rtcpmux) {
+ is(numIceConnections, 1, "stats reports exactly 1 ICE connection");
+ } else {
+ is(numIceConnections, 2, "stats report exactly 2 ICE connections for media and RTCP");
+ }
+ } else {
+ // This code assumes that no media sections have been rejected due to
+ // codec mismatch or other unrecoverable negotiation failures.
+ var numAudioTracks =
+ sdputils.countTracksInConstraint('audio', offerConstraintsList) ||
+ ((offerOptions && offerOptions.offerToReceiveAudio) ? 1 : 0);
+
+ var numVideoTracks =
+ sdputils.countTracksInConstraint('video', offerConstraintsList) ||
+ ((offerOptions && offerOptions.offerToReceiveVideo) ? 1 : 0);
+
+ var numExpectedTransports = numAudioTracks + numVideoTracks;
+ if (!testOptions.rtcpmux) {
+ numExpectedTransports *= 2;
+ }
+
+ if (this.dataChannels.length) {
+ ++numExpectedTransports;
+ }
+
+ info("expected audio + video + data transports: " + numExpectedTransports);
+ is(numIceConnections, numExpectedTransports, "stats ICE connections matches expected A/V transports");
+ }
+ },
+
+ expectNegotiationNeeded : function() {
+ if (!this.observedNegotiationNeeded) {
+ this.observedNegotiationNeeded = new Promise((resolve) => {
+ this.onnegotiationneeded = resolve;
+ });
+ }
+ },
+
+ /**
+ * Property-matching function for finding a certain stat in passed-in stats
+ *
+ * @param {object} stats
+ * The stats to check from this PeerConnectionWrapper
+ * @param {object} props
+ * The properties to look for
+ * @returns {boolean} Whether an entry containing all match-props was found.
+ */
+ hasStat : function(stats, props) {
+ for (let res of stats.values()) {
+ var match = true;
+ for (let prop in props) {
+ if (res[prop] !== props[prop]) {
+ match = false;
+ break;
+ }
+ }
+ if (match) {
+ return true;
+ }
+ }
+ return false;
+ },
+
+ /**
+ * Closes the connection
+ */
+ close : function() {
+ this._pc.close();
+ this.localMediaElements.forEach(e => e.pause());
+ info(this + ": Closed connection.");
+ },
+
+ /**
+ * Returns the string representation of the class
+ *
+ * @returns {String} The string representation
+ */
+ toString : function() {
+ return "PeerConnectionWrapper (" + this.label + ")";
+ }
+};
+
+// haxx to prevent SimpleTest from failing at window.onload
+function addLoadEvent() {}
+
+var scriptsReady = Promise.all([
+ "/tests/SimpleTest/SimpleTest.js",
+ "head.js",
+ "templates.js",
+ "turnConfig.js",
+ "dataChannel.js",
+ "network.js",
+ "sdpUtils.js"
+].map(script => {
+ var el = document.createElement("script");
+ if (typeof scriptRelativePath === 'string' && script.charAt(0) !== '/') {
+ script = scriptRelativePath + script;
+ }
+ el.src = script;
+ document.head.appendChild(el);
+ return new Promise(r => { el.onload = r; el.onerror = r; });
+}));
+
+function createHTML(options) {
+ return scriptsReady.then(() => realCreateHTML(options));
+}
+
+var iceServerWebsocket;
+var iceServersArray = [];
+
+var setupIceServerConfig = useIceServer => {
+ // We disable ICE support for HTTP proxy when using a TURN server, because
+ // mochitest uses a fake HTTP proxy to serve content, which will eat our STUN
+ // packets for TURN TCP.
+ var enableHttpProxy = enable => new Promise(resolve => {
+ SpecialPowers.pushPrefEnv(
+ {'set': [['media.peerconnection.disable_http_proxy', !enable]]},
+ resolve);
+ });
+
+ var spawnIceServer = () => new Promise( (resolve, reject) => {
+ iceServerWebsocket = new WebSocket("ws://localhost:8191/");
+ iceServerWebsocket.onopen = (event) => {
+ info("websocket/process bridge open, starting ICE Server...");
+ iceServerWebsocket.send("iceserver");
+ }
+
+ iceServerWebsocket.onmessage = event => {
+ // The first message will contain the iceServers configuration, subsequent
+ // messages are just logging.
+ info("ICE Server: " + event.data);
+ resolve(event.data);
+ }
+
+ iceServerWebsocket.onerror = () => {
+ reject("ICE Server error: Is the ICE server websocket up?");
+ }
+
+ iceServerWebsocket.onclose = () => {
+ info("ICE Server websocket closed");
+ reject("ICE Server gone before getting configuration");
+ }
+ });
+
+ if (!useIceServer) {
+ info("Skipping ICE Server for this test");
+ return enableHttpProxy(true);
+ }
+
+ return enableHttpProxy(false)
+ .then(spawnIceServer)
+ .then(iceServersStr => { iceServersArray = JSON.parse(iceServersStr); });
+};
+
+function runNetworkTest(testFunction, fixtureOptions) {
+ fixtureOptions = fixtureOptions || {}
+ return scriptsReady.then(() =>
+ runTestWhenReady(options =>
+ startNetworkAndTest()
+ .then(() => setupIceServerConfig(fixtureOptions.useIceServer))
+ .then(() => testFunction(options))
+ )
+ );
+}
diff --git a/dom/media/tests/mochitest/sdpUtils.js b/dom/media/tests/mochitest/sdpUtils.js
new file mode 100644
index 000000000..ba8dad562
--- /dev/null
+++ b/dom/media/tests/mochitest/sdpUtils.js
@@ -0,0 +1,148 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var sdputils = {
+
+checkSdpAfterEndOfTrickle: function(sdp, testOptions, label) {
+ info("EOC-SDP: " + JSON.stringify(sdp));
+
+ ok(sdp.sdp.includes("a=end-of-candidates"), label + ": SDP contains end-of-candidates");
+ sdputils.checkSdpCLineNotDefault(sdp.sdp, label);
+
+ if (testOptions.rtcpmux) {
+ ok(sdp.sdp.includes("a=rtcp-mux"), label + ": SDP contains rtcp-mux");
+ } else {
+ ok(sdp.sdp.includes("a=rtcp:"), label + ": SDP contains rtcp port");
+ }
+},
+
+// takes sdp in string form (or possibly a fragment, say an m-section), and
+// verifies that the default 0.0.0.0 addr is not present.
+checkSdpCLineNotDefault: function(sdpStr, label) {
+ info("CLINE-NO-DEFAULT-ADDR-SDP: " + JSON.stringify(sdpStr));
+ ok(!sdpStr.includes("c=IN IP4 0.0.0.0"), label + ": SDP contains non-zero IP c line");
+},
+
+// Note, we don't bother removing the fmtp lines, which makes a good test
+// for some SDP parsing issues. It would be good to have a "removeAllButCodec(sdp, codec)" too.
+removeCodec: function(sdp, codec) {
+ var updated_sdp = sdp.replace(new RegExp("a=rtpmap:" + codec + ".*\\/90000\\r\\n",""),"");
+ updated_sdp = updated_sdp.replace(new RegExp("(RTP\\/SAVPF.*)( " + codec + ")(.*\\r\\n)",""),"$1$3");
+ updated_sdp = updated_sdp.replace(new RegExp("a=rtcp-fb:" + codec + " nack\\r\\n",""),"");
+ updated_sdp = updated_sdp.replace(new RegExp("a=rtcp-fb:" + codec + " nack pli\\r\\n",""),"");
+ updated_sdp = updated_sdp.replace(new RegExp("a=rtcp-fb:" + codec + " ccm fir\\r\\n",""),"");
+ return updated_sdp;
+},
+
+removeRtcpMux: function(sdp) {
+ return sdp.replace(/a=rtcp-mux\r\n/g,"");
+},
+
+removeBundle: function(sdp) {
+ return sdp.replace(/a=group:BUNDLE .*\r\n/g, "");
+},
+
+reduceAudioMLineToPcmuPcma: function(sdp) {
+ return sdp.replace(/m=audio .*\r\n/g, "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n");
+},
+
+setAllMsectionsInactive: function(sdp) {
+ return sdp.replace(/\r\na=sendrecv/g, "\r\na=inactive")
+ .replace(/\r\na=sendonly/g, "\r\na=inactive")
+ .replace(/\r\na=recvonly/g, "\r\na=inactive");
+},
+
+removeAllRtpMaps: function(sdp) {
+ return sdp.replace(/a=rtpmap:.*\r\n/g, "");
+},
+
+reduceAudioMLineToDynamicPtAndOpus: function(sdp) {
+ return sdp.replace(/m=audio .*\r\n/g, "m=audio 9 UDP/TLS/RTP/SAVPF 101 109\r\n");
+},
+
+transferSimulcastProperties: function(offer_sdp, answer_sdp) {
+ if (!offer_sdp.includes("a=simulcast:")) {
+ return answer_sdp;
+ }
+ var o_simul = offer_sdp.match(/simulcast: send rid=(.*)([\n$])*/i);
+ var o_rids = offer_sdp.match(/a=rid:(.*)/ig);
+ var new_answer_sdp = answer_sdp + "a=simulcast: recv rid=" + o_simul[1] + "\r\n";
+ o_rids.forEach((o_rid) => {
+ new_answer_sdp = new_answer_sdp + o_rid.replace(/send/, "recv") + "\r\n";
+ });
+ return new_answer_sdp;
+},
+
+verifySdp: function(desc, expectedType, offerConstraintsList, offerOptions,
+ testOptions) {
+ info("Examining this SessionDescription: " + JSON.stringify(desc));
+ info("offerConstraintsList: " + JSON.stringify(offerConstraintsList));
+ info("offerOptions: " + JSON.stringify(offerOptions));
+ ok(desc, "SessionDescription is not null");
+ is(desc.type, expectedType, "SessionDescription type is " + expectedType);
+ ok(desc.sdp.length > 10, "SessionDescription body length is plausible");
+ ok(desc.sdp.includes("a=ice-ufrag"), "ICE username is present in SDP");
+ ok(desc.sdp.includes("a=ice-pwd"), "ICE password is present in SDP");
+ ok(desc.sdp.includes("a=fingerprint"), "ICE fingerprint is present in SDP");
+ //TODO: update this for loopback support bug 1027350
+ ok(!desc.sdp.includes(LOOPBACK_ADDR), "loopback interface is absent from SDP");
+ var requiresTrickleIce = !desc.sdp.includes("a=candidate");
+ if (requiresTrickleIce) {
+ info("No ICE candidate in SDP -> requiring trickle ICE");
+ } else {
+ info("at least one ICE candidate is present in SDP");
+ }
+
+ //TODO: how can we check for absence/presence of m=application?
+
+ var audioTracks =
+ sdputils.countTracksInConstraint('audio', offerConstraintsList) ||
+ ((offerOptions && offerOptions.offerToReceiveAudio) ? 1 : 0);
+
+ info("expected audio tracks: " + audioTracks);
+ if (audioTracks == 0) {
+ ok(!desc.sdp.includes("m=audio"), "audio m-line is absent from SDP");
+ } else {
+ ok(desc.sdp.includes("m=audio"), "audio m-line is present in SDP");
+ is(testOptions.opus, desc.sdp.includes("a=rtpmap:109 opus/48000/2"), "OPUS codec is present in SDP");
+ //TODO: ideally the rtcp-mux should be for the m=audio, and not just
+ // anywhere in the SDP (JS SDP parser bug 1045429)
+ is(testOptions.rtcpmux, desc.sdp.includes("a=rtcp-mux"), "RTCP Mux is offered in SDP");
+ }
+
+ var videoTracks =
+ sdputils.countTracksInConstraint('video', offerConstraintsList) ||
+ ((offerOptions && offerOptions.offerToReceiveVideo) ? 1 : 0);
+
+ info("expected video tracks: " + videoTracks);
+ if (videoTracks == 0) {
+ ok(!desc.sdp.includes("m=video"), "video m-line is absent from SDP");
+ } else {
+ ok(desc.sdp.includes("m=video"), "video m-line is present in SDP");
+ if (testOptions.h264) {
+ ok(desc.sdp.includes("a=rtpmap:126 H264/90000"), "H.264 codec is present in SDP");
+ } else {
+ ok(desc.sdp.includes("a=rtpmap:120 VP8/90000") ||
+ desc.sdp.includes("a=rtpmap:121 VP9/90000"), "VP8 or VP9 codec is present in SDP");
+ }
+ is(testOptions.rtcpmux, desc.sdp.includes("a=rtcp-mux"), "RTCP Mux is offered in SDP");
+ }
+
+ return requiresTrickleIce;
+},
+
+/**
+ * Counts the amount of audio tracks in a given media constraint.
+ *
+ * @param constraints
+ * The contraint to be examined.
+ */
+countTracksInConstraint: function(type, constraints) {
+ if (!Array.isArray(constraints)) {
+ return 0;
+ }
+ return constraints.reduce((sum, c) => sum + (c[type] ? 1 : 0), 0);
+},
+
+};
diff --git a/dom/media/tests/mochitest/steeplechase.ini b/dom/media/tests/mochitest/steeplechase.ini
new file mode 100644
index 000000000..686049a43
--- /dev/null
+++ b/dom/media/tests/mochitest/steeplechase.ini
@@ -0,0 +1,11 @@
+[DEFAULT]
+support-files =
+ head.js
+ mediaStreamPlayback.js
+ network.js
+ pc.js
+ sdpUtils.js
+ templates.js
+ turnConfig.js
+
+[test_peerConnection_basicAudio.html]
diff --git a/dom/media/tests/mochitest/steeplechase_long/long.js b/dom/media/tests/mochitest/steeplechase_long/long.js
new file mode 100644
index 000000000..8e8030946
--- /dev/null
+++ b/dom/media/tests/mochitest/steeplechase_long/long.js
@@ -0,0 +1,217 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ * Returns true if res is a local rtp
+ *
+ * @param {Object} statObject
+ * One of the objects comprising the report received from getStats()
+ * @returns {boolean}
+ * True if object is a local rtp
+ */
+function isLocalRtp(statObject) {
+ return (typeof statObject === 'object' &&
+ statObject.isRemote === false);
+}
+
+
+/**
+ * Dumps the local, dynamic parts of the stats object as a formatted block
+ * Used for capturing and monitoring test status during execution
+ *
+ * @param {Object} stats
+ * Stats object to use for output
+ * @param {string} label
+ * Used in the header of the output
+ */
+function outputPcStats(stats, label) {
+ var outputStr = '\n\n';
+ function appendOutput(line) {
+ outputStr += line.toString() + '\n';
+ }
+
+ var firstRtp = true;
+ for (var prop in stats) {
+ if (isLocalRtp(stats[prop])) {
+ var rtp = stats[prop];
+ if (firstRtp) {
+ appendOutput(label.toUpperCase() + ' STATS ' +
+ '(' + new Date(rtp.timestamp).toISOString() + '):');
+ firstRtp = false;
+ }
+ appendOutput(' ' + rtp.id + ':');
+ if (rtp.type === 'inboundrtp') {
+ appendOutput(' bytesReceived: ' + rtp.bytesReceived);
+ appendOutput(' jitter: ' + rtp.jitter);
+ appendOutput(' packetsLost: ' + rtp.packetsLost);
+ appendOutput(' packetsReceived: ' + rtp.packetsReceived);
+ } else {
+ appendOutput(' bytesSent: ' + rtp.bytesSent);
+ appendOutput(' packetsSent: ' + rtp.packetsSent);
+ }
+ }
+ }
+ outputStr += '\n\n';
+ dump(outputStr);
+}
+
+
+var _lastStats = {};
+
+const MAX_ERROR_CYCLES = 5;
+var _errorCount = {};
+
+/**
+ * Verifies the peer connection stats interval over interval
+ *
+ * @param {Object} stats
+ * Stats object to use for verification
+ * @param {string} label
+ * Identifies the peer connection. Differentiates stats for
+ * interval-over-interval verification in cases where more than one set
+ * is being verified
+ */
+function verifyPcStats(stats, label) {
+ const INCREASING_INBOUND_STAT_NAMES = [
+ 'bytesReceived',
+ 'packetsReceived'
+ ];
+
+ const INCREASING_OUTBOUND_STAT_NAMES = [
+ 'bytesSent',
+ 'packetsSent'
+ ];
+
+ if (_lastStats[label] !== undefined) {
+ var errorsInCycle = false;
+
+ function verifyIncrease(rtpName, statNames) {
+ var timestamp = new Date(stats[rtpName].timestamp).toISOString();
+
+ statNames.forEach(function (statName) {
+ var passed = stats[rtpName][statName] >
+ _lastStats[label][rtpName][statName];
+ if (!passed) {
+ errorsInCycle = true;
+ }
+ ok(passed,
+ timestamp + '.' + label + '.' + rtpName + '.' + statName,
+ label + '.' + rtpName + '.' + statName + ' increased (value=' +
+ stats[rtpName][statName] + ')');
+ });
+ }
+
+ for (var prop in stats) {
+ if (isLocalRtp(stats[prop])) {
+ if (stats[prop].type === 'inboundrtp') {
+ verifyIncrease(prop, INCREASING_INBOUND_STAT_NAMES);
+ } else {
+ verifyIncrease(prop, INCREASING_OUTBOUND_STAT_NAMES);
+ }
+ }
+ }
+
+ if (errorsInCycle) {
+ _errorCount[label] += 1;
+ info(label +": increased error counter to " + _errorCount[label]);
+ } else {
+ // looks like we recovered from a temp glitch
+ if (_errorCount[label] > 0) {
+ info(label + ": reseting error counter to zero");
+ }
+ _errorCount[label] = 0;
+ }
+ } else {
+ _errorCount[label] = 0;
+ }
+
+ _lastStats[label] = stats;
+}
+
+
+/**
+ * Retrieves and performs a series of operations on PeerConnection stats
+ *
+ * @param {PeerConnectionWrapper} pc
+ * PeerConnectionWrapper from which to get stats
+ * @param {string} label
+ * Label for the peer connection, passed to each stats callback
+ * @param {Array} operations
+ * Array of stats callbacks, each as function (stats, label)
+ */
+function processPcStats(pc, label, operations) {
+ pc.getStats(null, function (stats) {
+ operations.forEach(function (operation) {
+ operation(stats, label);
+ });
+ });
+}
+
+
+/**
+ * Outputs and verifies the status for local and/or remote PeerConnection as
+ * appropriate
+ *
+ * @param {Object} test
+ * Test containing the peer connection(s) for verification
+ */
+function verifyConnectionStatus(test) {
+ const OPERATIONS = [outputPcStats, verifyPcStats];
+
+ if (test.pcLocal) {
+ processPcStats(test.pcLocal, 'LOCAL', OPERATIONS);
+ }
+
+ if (test.pcRemote) {
+ processPcStats(test.pcRemote, 'REMOTE', OPERATIONS);
+ }
+}
+
+
+/**
+ * Generates a setInterval wrapper command link for use in pc.js command chains
+ *
+ * This function returns a promise that will resolve once the link repeatedly
+ * calls the given callback function every interval ms
+ * until duration ms have passed, then it will continue the test.
+ *
+ * @param {function} callback
+ * Function to be called on each interval
+ * @param {number} [interval=1000]
+ * Frequency in milliseconds with which callback will be called
+ * @param {number} [duration=3 hours]
+ * Length of time in milliseconds for which callback will be called
+
+
+ */
+function generateIntervalCommand(callback, interval, duration) {
+ interval = interval || 1000;
+ duration = duration || 1000 * 3600 * 3;
+
+ return function INTERVAL_COMMAND(test) {
+ return new Promise (resolve=>{
+ var startTime = Date.now();
+ var intervalId = setInterval(function () {
+ if (callback) {
+ callback(test);
+ }
+
+ var failed = false;
+ Object.keys(_errorCount).forEach(function (label) {
+ if (_errorCount[label] > MAX_ERROR_CYCLES) {
+ ok(false, "Encountered more then " + MAX_ERROR_CYCLES + " cycles" +
+ " with errors on " + label);
+ failed = true;
+ }
+ });
+ var timeElapsed = Date.now() - startTime;
+ if ((timeElapsed >= duration) || failed) {
+ clearInterval(intervalId);
+ resolve();
+ }
+ }, interval);
+ });
+ };
+}
diff --git a/dom/media/tests/mochitest/steeplechase_long/steeplechase_long.ini b/dom/media/tests/mochitest/steeplechase_long/steeplechase_long.ini
new file mode 100644
index 000000000..5832c4a24
--- /dev/null
+++ b/dom/media/tests/mochitest/steeplechase_long/steeplechase_long.ini
@@ -0,0 +1,12 @@
+[DEFAULT]
+support-files =
+ long.js
+ ../head.js
+ ../mediaStreamPlayback.js
+ ../pc.js
+ ../templates.js
+ ../turnConfig.js
+ ../network.js
+
+[test_peerConnection_basicAudioVideoCombined_long.html]
+
diff --git a/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudioVideoCombined_long.html b/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudioVideoCombined_long.html
new file mode 100644
index 000000000..d2f03cd60
--- /dev/null
+++ b/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudioVideoCombined_long.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<html>
+<head>
+ <script type="application/javascript" src="long.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1014328",
+ title: "Basic audio/video (combined) peer connection, long running",
+ visible: true
+ });
+
+ var STEEPLECHASE_TIMEOUT = 1000 * 3600 * 3;
+ var test;
+ runNetworkTest(function (options) {
+ options = options || {};
+ options.commands = makeDefaultCommands();
+ options.commands.push(generateIntervalCommand(verifyConnectionStatus,
+ 1000 * 10,
+ STEEPLECHASE_TIMEOUT));
+
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true, video: true, fake: false}],
+ [{audio: true, video: true, fake: false}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudio_long.html b/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudio_long.html
new file mode 100644
index 000000000..ef92c0c95
--- /dev/null
+++ b/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicAudio_long.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<html>
+<head>
+ <script type="application/javascript" src="long.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796892",
+ title: "Basic audio-only peer connection",
+ visible: true
+ });
+
+ var STEEPLECHASE_TIMEOUT = 1000 * 3600 * 3;
+ var test;
+ runNetworkTest(function (options) {
+ options = options || {};
+ options.commands = makeDefaultCommands();
+ options.commands.push(generateIntervalCommand(verifyConnectionStatus,
+ 1000 * 10,
+ STEEPLECHASE_TIMEOUT));
+
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true, fake: false}],
+ [{audio: true, fake: false}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicVideo_long.html b/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicVideo_long.html
new file mode 100644
index 000000000..64e4ef8f6
--- /dev/null
+++ b/dom/media/tests/mochitest/steeplechase_long/test_peerConnection_basicVideo_long.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<html>
+<head>
+ <script type="application/javascript" src="long.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796888",
+ title: "Basic video-only peer connection",
+ visible: true
+ });
+
+ var STEEPLECHASE_TIMEOUT = 1000 * 3600 * 3;
+ var test;
+ runNetworkTest(function (options) {
+ options = options || {};
+ options.commands = makeDefaultCommands();
+ options.commands.push(generateIntervalCommand(verifyConnectionStatus,
+ 1000 * 10,
+ STEEPLECHASE_TIMEOUT));
+
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{video: true, fake: false}],
+ [{video: true, fake: false}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/templates.js b/dom/media/tests/mochitest/templates.js
new file mode 100644
index 000000000..3a8e0dd49
--- /dev/null
+++ b/dom/media/tests/mochitest/templates.js
@@ -0,0 +1,525 @@
+/**
+ * Default list of commands to execute for a PeerConnection test.
+ */
+
+const STABLE = "stable";
+const HAVE_LOCAL_OFFER = "have-local-offer";
+const HAVE_REMOTE_OFFER = "have-remote-offer";
+const CLOSED = "closed";
+
+const ICE_NEW = "new";
+const GATH_NEW = "new";
+const GATH_GATH = "gathering";
+const GATH_COMPLETE = "complete"
+
+function deltaSeconds(date1, date2) {
+ return (date2.getTime() - date1.getTime())/1000;
+}
+
+function dumpSdp(test) {
+ if (typeof test._local_offer !== 'undefined') {
+ dump("ERROR: SDP offer: " + test._local_offer.sdp.replace(/[\r]/g, ''));
+ }
+ if (typeof test._remote_answer !== 'undefined') {
+ dump("ERROR: SDP answer: " + test._remote_answer.sdp.replace(/[\r]/g, ''));
+ }
+
+ if ((test.pcLocal) && (typeof test.pcLocal._local_ice_candidates !== 'undefined')) {
+ dump("pcLocal._local_ice_candidates: " + JSON.stringify(test.pcLocal._local_ice_candidates) + "\n");
+ dump("pcLocal._remote_ice_candidates: " + JSON.stringify(test.pcLocal._remote_ice_candidates) + "\n");
+ dump("pcLocal._ice_candidates_to_add: " + JSON.stringify(test.pcLocal._ice_candidates_to_add) + "\n");
+ }
+ if ((test.pcRemote) && (typeof test.pcRemote._local_ice_candidates !== 'undefined')) {
+ dump("pcRemote._local_ice_candidates: " + JSON.stringify(test.pcRemote._local_ice_candidates) + "\n");
+ dump("pcRemote._remote_ice_candidates: " + JSON.stringify(test.pcRemote._remote_ice_candidates) + "\n");
+ dump("pcRemote._ice_candidates_to_add: " + JSON.stringify(test.pcRemote._ice_candidates_to_add) + "\n");
+ }
+
+ if ((test.pcLocal) && (typeof test.pcLocal.iceConnectionLog !== 'undefined')) {
+ dump("pcLocal ICE connection state log: " + test.pcLocal.iceConnectionLog + "\n");
+ }
+ if ((test.pcRemote) && (typeof test.pcRemote.iceConnectionLog !== 'undefined')) {
+ dump("pcRemote ICE connection state log: " + test.pcRemote.iceConnectionLog + "\n");
+ }
+
+ if ((test.pcLocal) && (test.pcRemote) &&
+ (typeof test.pcLocal.setRemoteDescDate !== 'undefined') &&
+ (typeof test.pcRemote.setLocalDescDate !== 'undefined')) {
+ var delta = deltaSeconds(test.pcLocal.setRemoteDescDate, test.pcRemote.setLocalDescDate);
+ dump("Delay between pcLocal.setRemote <-> pcRemote.setLocal: " + delta + "\n");
+ }
+ if ((test.pcLocal) && (test.pcRemote) &&
+ (typeof test.pcLocal.setRemoteDescDate !== 'undefined') &&
+ (typeof test.pcLocal.setRemoteDescStableEventDate !== 'undefined')) {
+ var delta = deltaSeconds(test.pcLocal.setRemoteDescDate, test.pcLocal.setRemoteDescStableEventDate);
+ dump("Delay between pcLocal.setRemote <-> pcLocal.signalingStateStable: " + delta + "\n");
+ }
+ if ((test.pcLocal) && (test.pcRemote) &&
+ (typeof test.pcRemote.setLocalDescDate !== 'undefined') &&
+ (typeof test.pcRemote.setLocalDescStableEventDate !== 'undefined')) {
+ var delta = deltaSeconds(test.pcRemote.setLocalDescDate, test.pcRemote.setLocalDescStableEventDate);
+ dump("Delay between pcRemote.setLocal <-> pcRemote.signalingStateStable: " + delta + "\n");
+ }
+}
+
+// We need to verify that at least one candidate has been (or will be) gathered.
+function waitForAnIceCandidate(pc) {
+ return new Promise(resolve => {
+ if (!pc.localRequiresTrickleIce ||
+ pc._local_ice_candidates.length > 0) {
+ resolve();
+ } else {
+ // In some circumstances, especially when both PCs are on the same
+ // browser, even though we are connected, the connection can be
+ // established without receiving a single candidate from one or other
+ // peer. So we wait for at least one...
+ pc._pc.addEventListener('icecandidate', resolve);
+ }
+ }).then(() => {
+ ok(pc._local_ice_candidates.length > 0,
+ pc + " received local trickle ICE candidates");
+ isnot(pc._pc.iceGatheringState, GATH_NEW,
+ pc + " ICE gathering state is not 'new'");
+ });
+}
+
+function checkTrackStats(pc, rtpSenderOrReceiver, outbound) {
+ var track = rtpSenderOrReceiver.track;
+ var audio = (track.kind == "audio");
+ var msg = pc + " stats " + (outbound ? "outbound " : "inbound ") +
+ (audio ? "audio" : "video") + " rtp track id " + track.id;
+ return pc.getStats(track).then(stats => {
+ ok(pc.hasStat(stats, {
+ type: outbound ? "outboundrtp" : "inboundrtp",
+ isRemote: false,
+ mediaType: audio ? "audio" : "video"
+ }), msg + " - found expected stats");
+ ok(!pc.hasStat(stats, {
+ type: outbound ? "inboundrtp" : "outboundrtp",
+ isRemote: false
+ }), msg + " - did not find extra stats with wrong direction");
+ ok(!pc.hasStat(stats, {
+ mediaType: audio ? "video" : "audio"
+ }), msg + " - did not find extra stats with wrong media type");
+ });
+}
+
+var checkAllTrackStats = pc => {
+ return Promise.all([].concat(
+ pc._pc.getSenders().map(sender => checkTrackStats(pc, sender, true)),
+ pc._pc.getReceivers().map(receiver => checkTrackStats(pc, receiver, false))));
+}
+
+// Commands run once at the beginning of each test, even when performing a
+// renegotiation test.
+var commandsPeerConnectionInitial = [
+ function PC_SETUP_SIGNALING_CLIENT(test) {
+ if (test.testOptions.steeplechase) {
+ test.setupSignalingClient();
+ test.registerSignalingCallback("ice_candidate", function (message) {
+ var pc = test.pcRemote ? test.pcRemote : test.pcLocal;
+ pc.storeOrAddIceCandidate(new RTCIceCandidate(message.ice_candidate));
+ });
+ test.registerSignalingCallback("end_of_trickle_ice", function (message) {
+ test.signalingMessagesFinished();
+ });
+ }
+ },
+
+ function PC_LOCAL_SETUP_ICE_LOGGER(test) {
+ test.pcLocal.logIceConnectionState();
+ },
+
+ function PC_REMOTE_SETUP_ICE_LOGGER(test) {
+ test.pcRemote.logIceConnectionState();
+ },
+
+ function PC_LOCAL_SETUP_SIGNALING_LOGGER(test) {
+ test.pcLocal.logSignalingState();
+ },
+
+ function PC_REMOTE_SETUP_SIGNALING_LOGGER(test) {
+ test.pcRemote.logSignalingState();
+ },
+
+ function PC_LOCAL_SETUP_TRACK_HANDLER(test) {
+ test.pcLocal.setupTrackEventHandler();
+ },
+
+ function PC_REMOTE_SETUP_TRACK_HANDLER(test) {
+ test.pcRemote.setupTrackEventHandler();
+ },
+
+ function PC_LOCAL_CHECK_INITIAL_SIGNALINGSTATE(test) {
+ is(test.pcLocal.signalingState, STABLE,
+ "Initial local signalingState is 'stable'");
+ },
+
+ function PC_REMOTE_CHECK_INITIAL_SIGNALINGSTATE(test) {
+ is(test.pcRemote.signalingState, STABLE,
+ "Initial remote signalingState is 'stable'");
+ },
+
+ function PC_LOCAL_CHECK_INITIAL_ICE_STATE(test) {
+ is(test.pcLocal.iceConnectionState, ICE_NEW,
+ "Initial local ICE connection state is 'new'");
+ },
+
+ function PC_REMOTE_CHECK_INITIAL_ICE_STATE(test) {
+ is(test.pcRemote.iceConnectionState, ICE_NEW,
+ "Initial remote ICE connection state is 'new'");
+ },
+
+ function PC_LOCAL_CHECK_INITIAL_CAN_TRICKLE_SYNC(test) {
+ is(test.pcLocal._pc.canTrickleIceCandidates, null,
+ "Local trickle status should start out unknown");
+ },
+
+ function PC_REMOTE_CHECK_INITIAL_CAN_TRICKLE_SYNC(test) {
+ is(test.pcRemote._pc.canTrickleIceCandidates, null,
+ "Remote trickle status should start out unknown");
+ },
+];
+
+var commandsGetUserMedia = [
+ function PC_LOCAL_GUM(test) {
+ return test.pcLocal.getAllUserMedia(test.pcLocal.constraints);
+ },
+
+ function PC_REMOTE_GUM(test) {
+ return test.pcRemote.getAllUserMedia(test.pcRemote.constraints);
+ },
+];
+
+var commandsPeerConnectionOfferAnswer = [
+ function PC_LOCAL_SETUP_ICE_HANDLER(test) {
+ test.pcLocal.setupIceCandidateHandler(test);
+ },
+
+ function PC_REMOTE_SETUP_ICE_HANDLER(test) {
+ test.pcRemote.setupIceCandidateHandler(test);
+ },
+
+ function PC_LOCAL_STEEPLECHASE_SIGNAL_EXPECTED_LOCAL_TRACKS(test) {
+ if (test.testOptions.steeplechase) {
+ send_message({"type": "local_expected_tracks",
+ "expected_tracks": test.pcLocal.expectedLocalTrackInfoById});
+ }
+ },
+
+ function PC_REMOTE_STEEPLECHASE_SIGNAL_EXPECTED_LOCAL_TRACKS(test) {
+ if (test.testOptions.steeplechase) {
+ send_message({"type": "remote_expected_tracks",
+ "expected_tracks": test.pcRemote.expectedLocalTrackInfoById});
+ }
+ },
+
+ function PC_LOCAL_GET_EXPECTED_REMOTE_TRACKS(test) {
+ if (test.testOptions.steeplechase) {
+ return test.getSignalingMessage("remote_expected_tracks").then(
+ message => {
+ test.pcLocal.expectedRemoteTrackInfoById = message.expected_tracks;
+ });
+ }
+
+ // Deep copy, as similar to steeplechase as possible
+ test.pcLocal.expectedRemoteTrackInfoById =
+ JSON.parse(JSON.stringify(test.pcRemote.expectedLocalTrackInfoById));
+ },
+
+ function PC_REMOTE_GET_EXPECTED_REMOTE_TRACKS(test) {
+ if (test.testOptions.steeplechase) {
+ return test.getSignalingMessage("local_expected_tracks").then(
+ message => {
+ test.pcRemote.expectedRemoteTrackInfoById = message.expected_tracks;
+ });
+ }
+
+ // Deep copy, as similar to steeplechase as possible
+ test.pcRemote.expectedRemoteTrackInfoById =
+ JSON.parse(JSON.stringify(test.pcLocal.expectedLocalTrackInfoById));
+ },
+
+ function PC_LOCAL_CREATE_OFFER(test) {
+ return test.createOffer(test.pcLocal).then(offer => {
+ is(test.pcLocal.signalingState, STABLE,
+ "Local create offer does not change signaling state");
+ });
+ },
+
+ function PC_LOCAL_STEEPLECHASE_SIGNAL_OFFER(test) {
+ if (test.testOptions.steeplechase) {
+ send_message({"type": "offer",
+ "offer": test.originalOffer,
+ "offer_constraints": test.pcLocal.constraints,
+ "offer_options": test.pcLocal.offerOptions});
+ test._local_offer = test.originalOffer;
+ test._offer_constraints = test.pcLocal.constraints;
+ test._offer_options = test.pcLocal.offerOptions;
+ }
+ },
+
+ function PC_LOCAL_SET_LOCAL_DESCRIPTION(test) {
+ return test.setLocalDescription(test.pcLocal, test.originalOffer, HAVE_LOCAL_OFFER)
+ .then(() => {
+ is(test.pcLocal.signalingState, HAVE_LOCAL_OFFER,
+ "signalingState after local setLocalDescription is 'have-local-offer'");
+ });
+ },
+
+ function PC_REMOTE_GET_OFFER(test) {
+ if (!test.testOptions.steeplechase) {
+ test._local_offer = test.originalOffer;
+ test._offer_constraints = test.pcLocal.constraints;
+ test._offer_options = test.pcLocal.offerOptions;
+ return Promise.resolve();
+ }
+ return test.getSignalingMessage("offer")
+ .then(message => {
+ ok("offer" in message, "Got an offer message");
+ test._local_offer = new RTCSessionDescription(message.offer);
+ test._offer_constraints = message.offer_constraints;
+ test._offer_options = message.offer_options;
+ });
+ },
+
+ function PC_REMOTE_SET_REMOTE_DESCRIPTION(test) {
+ return test.setRemoteDescription(test.pcRemote, test._local_offer, HAVE_REMOTE_OFFER)
+ .then(() => {
+ is(test.pcRemote.signalingState, HAVE_REMOTE_OFFER,
+ "signalingState after remote setRemoteDescription is 'have-remote-offer'");
+ });
+ },
+
+ function PC_REMOTE_CHECK_CAN_TRICKLE_SYNC(test) {
+ is(test.pcRemote._pc.canTrickleIceCandidates, true,
+ "Remote thinks that local can trickle");
+ },
+
+ function PC_LOCAL_SANE_LOCAL_SDP(test) {
+ test.pcLocal.localRequiresTrickleIce =
+ sdputils.verifySdp(test._local_offer, "offer",
+ test._offer_constraints, test._offer_options,
+ test.testOptions);
+ },
+
+ function PC_REMOTE_SANE_REMOTE_SDP(test) {
+ test.pcRemote.remoteRequiresTrickleIce =
+ sdputils.verifySdp(test._local_offer, "offer",
+ test._offer_constraints, test._offer_options,
+ test.testOptions);
+ },
+
+ function PC_REMOTE_CREATE_ANSWER(test) {
+ return test.createAnswer(test.pcRemote)
+ .then(answer => {
+ is(test.pcRemote.signalingState, HAVE_REMOTE_OFFER,
+ "Remote createAnswer does not change signaling state");
+ if (test.testOptions.steeplechase) {
+ send_message({"type": "answer",
+ "answer": test.originalAnswer,
+ "answer_constraints": test.pcRemote.constraints});
+ test._remote_answer = test.pcRemote._last_answer;
+ test._answer_constraints = test.pcRemote.constraints;
+ }
+ });
+ },
+
+ function PC_REMOTE_SET_LOCAL_DESCRIPTION(test) {
+ return test.setLocalDescription(test.pcRemote, test.originalAnswer, STABLE)
+ .then(() => {
+ is(test.pcRemote.signalingState, STABLE,
+ "signalingState after remote setLocalDescription is 'stable'");
+ })
+ .then(() => test.pcRemote.markRemoteTracksAsNegotiated());
+ },
+
+ function PC_LOCAL_GET_ANSWER(test) {
+ if (!test.testOptions.steeplechase) {
+ test._remote_answer = test.originalAnswer;
+ test._answer_constraints = test.pcRemote.constraints;
+ return Promise.resolve();
+ }
+
+ return test.getSignalingMessage("answer").then(message => {
+ ok("answer" in message, "Got an answer message");
+ test._remote_answer = new RTCSessionDescription(message.answer);
+ test._answer_constraints = message.answer_constraints;
+ });
+ },
+
+ function PC_LOCAL_SET_REMOTE_DESCRIPTION(test) {
+ return test.setRemoteDescription(test.pcLocal, test._remote_answer, STABLE)
+ .then(() => {
+ is(test.pcLocal.signalingState, STABLE,
+ "signalingState after local setRemoteDescription is 'stable'");
+ })
+ .then(() => test.pcLocal.markRemoteTracksAsNegotiated());
+ },
+
+ function PC_REMOTE_SANE_LOCAL_SDP(test) {
+ test.pcRemote.localRequiresTrickleIce =
+ sdputils.verifySdp(test._remote_answer, "answer",
+ test._offer_constraints, test._offer_options,
+ test.testOptions);
+ },
+ function PC_LOCAL_SANE_REMOTE_SDP(test) {
+ test.pcLocal.remoteRequiresTrickleIce =
+ sdputils.verifySdp(test._remote_answer, "answer",
+ test._offer_constraints, test._offer_options,
+ test.testOptions);
+ },
+
+ function PC_LOCAL_CHECK_CAN_TRICKLE_SYNC(test) {
+ is(test.pcLocal._pc.canTrickleIceCandidates, true,
+ "Local thinks that remote can trickle");
+ },
+
+ function PC_LOCAL_WAIT_FOR_ICE_CONNECTED(test) {
+ return test.pcLocal.waitForIceConnected()
+ .then(() => {
+ info(test.pcLocal + ": ICE connection state log: " + test.pcLocal.iceConnectionLog);
+ });
+ },
+
+ function PC_REMOTE_WAIT_FOR_ICE_CONNECTED(test) {
+ return test.pcRemote.waitForIceConnected()
+ .then(() => {
+ info(test.pcRemote + ": ICE connection state log: " + test.pcRemote.iceConnectionLog);
+ });
+ },
+
+ function PC_LOCAL_VERIFY_ICE_GATHERING(test) {
+ return waitForAnIceCandidate(test.pcLocal);
+ },
+
+ function PC_REMOTE_VERIFY_ICE_GATHERING(test) {
+ return waitForAnIceCandidate(test.pcRemote);
+ },
+
+ function PC_LOCAL_WAIT_FOR_MEDIA_FLOW(test) {
+ return test.pcLocal.waitForMediaFlow();
+ },
+
+ function PC_REMOTE_WAIT_FOR_MEDIA_FLOW(test) {
+ return test.pcRemote.waitForMediaFlow();
+ },
+
+ function PC_LOCAL_CHECK_STATS(test) {
+ return test.pcLocal.getStats().then(stats => {
+ test.pcLocal.checkStats(stats, test.testOptions.steeplechase);
+ });
+ },
+
+ function PC_REMOTE_CHECK_STATS(test) {
+ return test.pcRemote.getStats().then(stats => {
+ test.pcRemote.checkStats(stats, test.testOptions.steeplechase);
+ });
+ },
+
+ function PC_LOCAL_CHECK_ICE_CONNECTION_TYPE(test) {
+ return test.pcLocal.getStats().then(stats => {
+ test.pcLocal.checkStatsIceConnectionType(stats,
+ test.testOptions.expectedLocalCandidateType);
+ });
+ },
+
+ function PC_REMOTE_CHECK_ICE_CONNECTION_TYPE(test) {
+ return test.pcRemote.getStats().then(stats => {
+ test.pcRemote.checkStatsIceConnectionType(stats,
+ test.testOptions.expectedRemoteCandidateType);
+ });
+ },
+
+ function PC_LOCAL_CHECK_ICE_CONNECTIONS(test) {
+ return test.pcLocal.getStats().then(stats => {
+ test.pcLocal.checkStatsIceConnections(stats,
+ test._offer_constraints,
+ test._offer_options,
+ test.testOptions);
+ });
+ },
+
+ function PC_REMOTE_CHECK_ICE_CONNECTIONS(test) {
+ return test.pcRemote.getStats().then(stats => {
+ test.pcRemote.checkStatsIceConnections(stats,
+ test._offer_constraints,
+ test._offer_options,
+ test.testOptions);
+ });
+ },
+
+ function PC_LOCAL_CHECK_MSID(test) {
+ return test.pcLocal.checkMsids();
+ },
+ function PC_REMOTE_CHECK_MSID(test) {
+ return test.pcRemote.checkMsids();
+ },
+
+ function PC_LOCAL_CHECK_TRACK_STATS(test) {
+ return checkAllTrackStats(test.pcLocal);
+ },
+ function PC_REMOTE_CHECK_TRACK_STATS(test) {
+ return checkAllTrackStats(test.pcRemote);
+ },
+ function PC_LOCAL_VERIFY_SDP_AFTER_END_OF_TRICKLE(test) {
+ if (test.pcLocal.endOfTrickleSdp) {
+ /* In case the endOfTrickleSdp promise is resolved already it will win the
+ * race because it gets evaluated first. But if endOfTrickleSdp is still
+ * pending the rejection will win the race. */
+ return Promise.race([
+ test.pcLocal.endOfTrickleSdp,
+ Promise.reject("No SDP")
+ ])
+ .then(sdp => sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcLocal.label),
+ () => info("pcLocal: Gathering is not complete yet, skipping post-gathering SDP check"));
+ }
+ },
+ function PC_REMOTE_VERIFY_SDP_AFTER_END_OF_TRICKLE(test) {
+ if (test.pcRemote.endOfTrickleSdp) {
+ /* In case the endOfTrickleSdp promise is resolved already it will win the
+ * race because it gets evaluated first. But if endOfTrickleSdp is still
+ * pending the rejection will win the race. */
+ return Promise.race([
+ test.pcRemote.endOfTrickleSdp,
+ Promise.reject("No SDP")
+ ])
+ .then(sdp => sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcRemote.label),
+ () => info("pcRemote: Gathering is not complete yet, skipping post-gathering SDP check"));
+ }
+ }
+];
+
+function PC_LOCAL_REMOVE_ALL_BUT_H264_FROM_OFFER(test) {
+ isnot(test.originalOffer.sdp.search("H264/90000"), -1, "H.264 should be present in the SDP offer");
+ test.originalOffer.sdp = sdputils.removeCodec(sdputils.removeCodec(sdputils.removeCodec(
+ test.originalOffer.sdp, 120), 121, 97));
+ info("Updated H264 only offer: " + JSON.stringify(test.originalOffer));
+};
+
+function PC_LOCAL_REMOVE_BUNDLE_FROM_OFFER(test) {
+ test.originalOffer.sdp = sdputils.removeBundle(test.originalOffer.sdp);
+ info("Updated no bundle offer: " + JSON.stringify(test.originalOffer));
+};
+
+function PC_LOCAL_REMOVE_RTCPMUX_FROM_OFFER(test) {
+ test.originalOffer.sdp = sdputils.removeRtcpMux(test.originalOffer.sdp);
+ info("Updated no RTCP-Mux offer: " + JSON.stringify(test.originalOffer));
+};
+
+var addRenegotiation = (chain, commands, checks) => {
+ chain.append(commands);
+ chain.append(commandsPeerConnectionOfferAnswer);
+ if (checks) {
+ chain.append(checks);
+ }
+};
+
+var addRenegotiationAnswerer = (chain, commands, checks) => {
+ chain.append(function SWAP_PC_LOCAL_PC_REMOTE(test) {
+ var temp = test.pcLocal;
+ test.pcLocal = test.pcRemote;
+ test.pcRemote = temp;
+ });
+ addRenegotiation(chain, commands, checks);
+};
diff --git a/dom/media/tests/mochitest/test_a_noOp.html b/dom/media/tests/mochitest/test_a_noOp.html
new file mode 100644
index 000000000..aa6cfa90a
--- /dev/null
+++ b/dom/media/tests/mochitest/test_a_noOp.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1264772
+-->
+<head>
+ <title>Test for Bug 1264772</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1264772">Mozilla Bug 1264772</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for Bug 1264772 **/
+// The WebRTC tests seem to have more problems with intermittents (at
+// least on Android) if they run first in a test run. This is a dummy test
+// to ensure that the browser is ready prior to running any actual WebRTC
+// tests.
+//
+// Note: mochitests are run in alphabetical order, so it is not sufficient
+// for this test to appear first in the manifest.
+ok(true, "test passed");
+
+</script>
+</pre>
+</body>
diff --git a/dom/media/tests/mochitest/test_dataChannel_basicAudio.html b/dom/media/tests/mochitest/test_dataChannel_basicAudio.html
new file mode 100644
index 000000000..411c032ed
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_basicAudio.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796895",
+ title: "Basic data channel audio connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html b/dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html
new file mode 100644
index 000000000..c012c9e3b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796891",
+ title: "Basic data channel audio/video connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html b/dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html
new file mode 100644
index 000000000..14e38e222
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796891",
+ title: "Basic data channel audio/video connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ test.setMediaConstraints([{audio: true, video: true}],
+ [{audio: true, video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html b/dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html
new file mode 100644
index 000000000..dc8725f5a
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1016476",
+ title: "Basic data channel audio/video connection without bundle"
+ });
+
+var test;
+runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html b/dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html
new file mode 100644
index 000000000..83aa6edc1
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796894",
+ title: "Basic datachannel only connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_basicVideo.html b/dom/media/tests/mochitest/test_dataChannel_basicVideo.html
new file mode 100644
index 000000000..becee6776
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_basicVideo.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796889",
+ title: "Basic data channel video connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_bug1013809.html b/dom/media/tests/mochitest/test_dataChannel_bug1013809.html
new file mode 100644
index 000000000..b74f9deca
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_bug1013809.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796895",
+ title: "Basic data channel audio connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addInitialDataChannel(test.chain);
+ var sld = test.chain.remove("PC_REMOTE_SET_LOCAL_DESCRIPTION");
+ test.chain.insertAfter("PC_LOCAL_SET_REMOTE_DESCRIPTION", sld);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_dataChannel_noOffer.html b/dom/media/tests/mochitest/test_dataChannel_noOffer.html
new file mode 100644
index 000000000..1b14910c1
--- /dev/null
+++ b/dom/media/tests/mochitest/test_dataChannel_noOffer.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "856319",
+ title: "Don't offer m=application unless createDataChannel is called first"
+ });
+
+ runNetworkTest(function () {
+ var pc = new RTCPeerConnection();
+
+ // necessary to circumvent bug 864109
+ var options = { offerToReceiveAudio: true };
+
+ pc.createOffer(options).then(offer => {
+ ok(!offer.sdp.includes("m=application"),
+ "m=application is not contained in the SDP");
+
+ networkTestFinished();
+ })
+ .catch(generateErrorCallback());
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_enumerateDevices.html b/dom/media/tests/mochitest/test_enumerateDevices.html
new file mode 100644
index 000000000..dd4db59d7
--- /dev/null
+++ b/dom/media/tests/mochitest/test_enumerateDevices.html
@@ -0,0 +1,134 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({ title: "Run enumerateDevices code", bug: "1046245" });
+/**
+ Tests covering enumerateDevices API and deviceId constraint. Exercise code.
+*/
+
+async function mustSucceed(msg, f) {
+ try {
+ await f();
+ ok(true, msg + " must succeed");
+ } catch (e) {
+ is(e.name, null, msg + " must succeed: " + e.message);
+ }
+}
+
+async function mustFailWith(msg, reason, constraint, f) {
+ try {
+ await f();
+ ok(false, msg + " must fail");
+ } catch(e) {
+ is(e.name, reason, msg + " must fail: " + e.message);
+ if (constraint) {
+ is(e.constraint, constraint, msg + " must fail w/correct constraint.");
+ }
+ }
+}
+
+var pushPrefs = (...p) => SpecialPowers.pushPrefEnv({set: p});
+var gUM = c => navigator.mediaDevices.getUserMedia(c);
+
+var validateDevice = ({kind, label, deviceId, groupId}) => {
+ ok(kind == "videoinput" || kind == "audioinput", "Known device kind");
+ is(deviceId.length, 44, "deviceId length id as expected for Firefox");
+ ok(label.length !== undefined, "Device label: " + label);
+
+ // TODO: s/todo_// once Bug 1213453 is fixed.
+ todo_isnot(groupId, "", "groupId must be present.");
+}
+
+runTest(async () => {
+ await pushPrefs(["media.navigator.streams.fake", true]);
+
+ // Validate enumerated devices.
+
+ let devices = await navigator.mediaDevices.enumerateDevices();
+ ok(devices.length > 0, "At least one device found");
+ let jsoned = JSON.parse(JSON.stringify(devices));
+ is(jsoned[0].kind, devices[0].kind, "kind survived serializer");
+ is(jsoned[0].deviceId, devices[0].deviceId, "deviceId survived serializer");
+ for (let device of devices) {
+ validateDevice(device);
+ // Test deviceId constraint
+ let deviceId = device.deviceId;
+ let constraints = (device.kind == "videoinput") ? { video: { deviceId } }
+ : { audio: { deviceId } };
+ for (let track of (await gUM(constraints)).getTracks()) {
+ is(typeof(track.label), "string", "Track label is a string");
+ is(track.label, device.label, "Track label is the device label");
+ track.stop();
+ }
+ }
+
+ const unknownId = "unknown9qHr8B0JIbcHlbl9xR+jMbZZ8WyoPfpCXPfc=";
+
+ // Check deviceId failure paths for video.
+
+ await mustSucceed("unknown plain deviceId on video",
+ () => gUM({ video: { deviceId: unknownId } }));
+ await mustSucceed("unknown plain deviceId on audio",
+ () => gUM({ audio: { deviceId: unknownId } }));
+ await mustFailWith("unknown exact deviceId on video",
+ "OverconstrainedError", "deviceId",
+ () => gUM({ video: { deviceId: { exact: unknownId } } }));
+ await mustFailWith("unknown exact deviceId on audio",
+ "OverconstrainedError", "deviceId",
+ () => gUM({ audio: { deviceId: { exact: unknownId } } }));
+
+ // Check that deviceIds are stable for same origin and differ across origins.
+
+ const path = "/tests/dom/media/tests/mochitest/test_enumerateDevices_iframe.html";
+ const origins = ["http://mochi.test:8888", "http://test1.mochi.test:8888"];
+ info(window.location);
+
+ let haveDevicesMap = new Promise(resolve => {
+ let map = new Map();
+ window.addEventListener("message", ({origin, data}) => {
+ ok(origins.includes(origin), "Got message from expected origin");
+ map.set(origin, JSON.parse(data));
+ if (map.size < origins.length) return;
+ resolve(map);
+ });
+ });
+
+ await Promise.all(origins.map(origin => {
+ let iframe = document.createElement("iframe");
+ iframe.src = origin + path;
+ info(iframe.src);
+ document.documentElement.appendChild(iframe);
+ return new Promise(resolve => iframe.onload = resolve);
+ }));
+ let devicesMap = await haveDevicesMap;
+ let [sameOriginDevices, differentOriginDevices] = origins.map(o => devicesMap.get(o));
+
+ is(sameOriginDevices.length, devices.length);
+ is(differentOriginDevices.length, devices.length);
+ [...sameOriginDevices, ...differentOriginDevices].forEach(d => validateDevice(d));
+
+ for (let device of sameOriginDevices) {
+ ok(devices.find(d => d.deviceId == device.deviceId),
+ "Same origin deviceId for " + device.label + " must match");
+ }
+ for (let device of differentOriginDevices) {
+ ok(!devices.find(d => d.deviceId == device.deviceId),
+ "Different origin deviceId for " + device.label + " must be different");
+ }
+
+ // Check the special case of no devices found.
+ await pushPrefs(["media.navigator.streams.fake", false],
+ ["media.audio_loopback_dev", "none"],
+ ["media.video_loopback_dev", "none"]);
+ devices = await navigator.mediaDevices.enumerateDevices();
+ ok(devices.length === 0, "No devices found");
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_enumerateDevices_iframe.html b/dom/media/tests/mochitest/test_enumerateDevices_iframe.html
new file mode 100644
index 000000000..6a9054677
--- /dev/null
+++ b/dom/media/tests/mochitest/test_enumerateDevices_iframe.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<pre id="test">
+<script type="application/javascript">
+/**
+ Runs inside iframe in test_enumerateDevices.html.
+*/
+
+var pushPrefs = (...p) => SpecialPowers.pushPrefEnv({set: p});
+var gUM = c => navigator.mediaDevices.getUserMedia(c);
+
+(async () => {
+ await pushPrefs(["media.navigator.streams.fake", true]);
+
+ let devices = await navigator.mediaDevices.enumerateDevices();
+ parent.postMessage(JSON.stringify(devices), "http://mochi.test:8888");
+
+})().catch(e => setTimeout(() => { throw e; }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_active_autoplay.html b/dom/media/tests/mochitest/test_getUserMedia_active_autoplay.html
new file mode 100644
index 000000000..c1a39cdd4
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_active_autoplay.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<video id="testAutoplay" autoplay></video>
+<script type="application/javascript">
+"use strict";
+
+const video = document.getElementById("testAutoplay");
+var stream;
+var otherVideoTrack;
+var otherAudioTrack;
+
+createHTML({
+ title: "MediaStream can be autoplayed in media element after going inactive and then active",
+ bug: "1208316"
+});
+
+runTest(() => getUserMedia({audio: true, video: true}).then(s => {
+ stream = s;
+ otherVideoTrack = stream.getVideoTracks()[0].clone();
+ otherAudioTrack = stream.getAudioTracks()[0].clone();
+
+ video.srcObject = stream;
+ return haveEvent(video, "playing", wait(5000, new Error("Timeout")));
+})
+.then(() => {
+ ok(!video.ended, "Video element should be playing after adding a gUM stream");
+ stream.getTracks().forEach(t => t.stop());
+ return haveEvent(video, "ended", wait(5000, new Error("Timeout")));
+})
+.then(() => {
+ ok(video.ended, "Video element should be ended");
+ stream.addTrack(otherVideoTrack);
+ return haveEvent(video, "playing", wait(5000, new Error("Timeout")));
+})
+.then(() => {
+ ok(!video.ended, "Video element should be playing after adding a video track");
+ stream.getTracks().forEach(t => t.stop());
+ return haveEvent(video, "ended", wait(5000, new Error("Timeout")));
+})
+.then(() => {
+ ok(video.ended, "Video element should be ended");
+ stream.addTrack(otherAudioTrack);
+ return haveEvent(video, "playing", wait(5000, new Error("Timeout")));
+})
+.then(() => {
+ ok(!video.ended, "Video element should be playing after adding a audio track");
+ stream.getTracks().forEach(t => t.stop());
+ return haveEvent(video, "ended", wait(5000, new Error("Timeout")));
+})
+.then(() => {
+ ok(video.ended, "Video element should be ended");
+}));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html b/dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html
new file mode 100644
index 000000000..2159fc917
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "MediaStream's addTrack() and removeTrack() with getUserMedia streams Test",
+ bug: "1103188"
+ });
+
+ runTest(() => Promise.resolve()
+ .then(() => getUserMedia({audio: true})).then(stream =>
+ getUserMedia({video: true}).then(otherStream => {
+ info("Test addTrack()ing a video track to an audio-only gUM stream");
+ var track = stream.getTracks()[0];
+ var otherTrack = otherStream.getTracks()[0];
+
+ stream.addTrack(track);
+ checkMediaStreamContains(stream, [track], "Re-added audio");
+
+ stream.addTrack(otherTrack);
+ checkMediaStreamContains(stream, [track, otherTrack], "Added video");
+
+ var testElem = createMediaElement('video', 'testAddTrackAudioVideo');
+ var playback = new LocalMediaStreamPlayback(testElem, stream);
+ return playback.playMedia(false);
+ }))
+ .then(() => getUserMedia({video: true})).then(stream =>
+ getUserMedia({video: true}).then(otherStream => {
+ info("Test addTrack()ing a video track to a video-only gUM stream");
+ var track = stream.getTracks()[0];
+ var otherTrack = otherStream.getTracks()[0];
+
+ stream.addTrack(track);
+ checkMediaStreamContains(stream, [track], "Re-added video");
+
+ stream.addTrack(otherTrack);
+ checkMediaStreamContains(stream, [track, otherTrack], "Added video");
+
+ var test = createMediaElement('video', 'testAddTrackDoubleVideo');
+ var playback = new LocalMediaStreamPlayback(test, stream);
+ return playback.playMedia(false);
+ }))
+ .then(() => getUserMedia({video: true})).then(stream =>
+ getUserMedia({video: true}).then(otherStream => {
+ info("Test removeTrack() existing and added video tracks from a video-only gUM stream");
+ var track = stream.getTracks()[0];
+ var otherTrack = otherStream.getTracks()[0];
+
+ stream.removeTrack(otherTrack);
+ checkMediaStreamContains(stream, [track], "Removed non-existing video");
+
+ stream.addTrack(otherTrack);
+ checkMediaStreamContains(stream, [track, otherTrack], "Added video");
+
+ stream.removeTrack(otherTrack);
+ checkMediaStreamContains(stream, [track], "Removed added video");
+
+ stream.removeTrack(otherTrack);
+ checkMediaStreamContains(stream, [track], "Re-removed added video");
+
+ stream.removeTrack(track);
+ checkMediaStreamContains(stream, [], "Removed original video");
+
+ var elem = createMediaElement('video', 'testRemoveAllVideo');
+ var loadeddata = false;
+ elem.onloadeddata = () => { loadeddata = true; elem.onloadeddata = null; };
+ elem.srcObject = stream;
+ elem.play();
+ return wait(500).then(() => {
+ ok(!loadeddata, "Stream without tracks shall not raise 'loadeddata' on media element");
+ elem.pause();
+ elem.srcObject = null;
+ })
+ .then(() => {
+ stream.addTrack(track);
+ checkMediaStreamContains(stream, [track], "Re-added added-then-removed track");
+ var playback = new LocalMediaStreamPlayback(elem, stream);
+ return playback.playMedia(false);
+ })
+ .then(() => otherTrack.stop());
+ }))
+ .then(() => getUserMedia({ audio: true })).then(audioStream =>
+ getUserMedia({ video: true }).then(videoStream => {
+ info("Test adding track and removing the original");
+ var audioTrack = audioStream.getTracks()[0];
+ var videoTrack = videoStream.getTracks()[0];
+ videoStream.removeTrack(videoTrack);
+ audioStream.addTrack(videoTrack);
+
+ checkMediaStreamContains(videoStream, [], "1, Removed original track");
+ checkMediaStreamContains(audioStream, [audioTrack, videoTrack],
+ "2, Added external track");
+
+ var elem = createMediaElement('video', 'testAddRemoveOriginalTrackVideo');
+ var playback = new LocalMediaStreamPlayback(elem, audioStream);
+ return playback.playMedia(false);
+ }))
+ .then(() => getUserMedia({ audio: true, video: true })).then(stream => {
+ info("Test removing stopped tracks");
+ stream.getTracks().forEach(t => {
+ t.stop();
+ stream.removeTrack(t);
+ });
+ checkMediaStreamContains(stream, [], "Removed stopped tracks");
+ })
+ .then(() => {
+ var ac = new AudioContext();
+
+ var osc1k = createOscillatorStream(ac, 1000);
+ var audioTrack1k = osc1k.getTracks()[0];
+
+ var osc5k = createOscillatorStream(ac, 5000);
+ var audioTrack5k = osc5k.getTracks()[0];
+
+ var osc10k = createOscillatorStream(ac, 10000);
+ var audioTrack10k = osc10k.getTracks()[0];
+
+ var stream = osc1k;
+ return Promise.resolve().then(() => {
+ info("Analysing audio output with original 1k track");
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(5000)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] < 50);
+ }).then(() => {
+ info("Analysing audio output with removed original 1k track and added 5k track");
+ stream.removeTrack(audioTrack1k);
+ stream.addTrack(audioTrack5k);
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50);
+ }).then(() => {
+ info("Analysing audio output with removed 5k track and added 10k track");
+ stream.removeTrack(audioTrack5k);
+ stream.addTrack(audioTrack10k);
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] > 200);
+ }).then(() => {
+ info("Analysing audio output with re-added 1k, 5k and added 10k tracks");
+ stream.addTrack(audioTrack1k);
+ stream.addTrack(audioTrack5k);
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(7500)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] > 200 &&
+ array[analyser.binIndexForFrequency(11000)] < 50);
+ });
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html b/dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html
new file mode 100644
index 000000000..833653ebb
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+"use strict";
+
+createHTML({
+ title: "MediaStream's 'addtrack' and 'removetrack' events shouldn't fire on manual operations",
+ bug: "1208328"
+});
+
+var spinEventLoop = () => new Promise(r => setTimeout(r, 0));
+
+var stream;
+var clone;
+var newStream;
+var tracks = [];
+
+var addTrack = track => {
+ info("Adding track " + track.id);
+ stream.addTrack(track);
+};
+var removeTrack = track => {
+ info("Removing track " + track.id);
+ stream.removeTrack(track);
+};
+var stopTrack = track => {
+ if (track.readyState == "live") {
+ info("Stopping track " + track.id);
+ }
+ track.stop();
+};
+
+runTest(() => getUserMedia({audio: true, video: true})
+ .then(s => {
+ stream = s;
+ clone = s.clone();
+ stream.addEventListener("addtrack", function onAddtrack(event) {
+ ok(false, "addtrack fired unexpectedly for track " + event.track.id);
+ });
+ stream.addEventListener("removetrack", function onRemovetrack(event) {
+ ok(false, "removetrack fired unexpectedly for track " + event.track.id);
+ });
+
+ return getUserMedia({audio: true, video: true});
+ })
+ .then(s => {
+ newStream = s;
+ info("Stopping an original track");
+ stopTrack(stream.getTracks()[0]);
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Removing original tracks");
+ stream.getTracks().forEach(t => (stream.removeTrack(t), tracks.push(t)));
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Adding other gUM tracks");
+ newStream.getTracks().forEach(t => addTrack(t))
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Adding cloned tracks");
+ let clone = stream.clone();
+ clone.getTracks().forEach(t => addTrack(t));
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Removing a clone");
+ removeTrack(clone.getTracks()[0]);
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Stopping clones");
+ clone.getTracks().forEach(t => stopTrack(t));
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Stopping originals");
+ stream.getTracks().forEach(t => stopTrack(t));
+ tracks.forEach(t => stopTrack(t));
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ info("Removing remaining tracks");
+ stream.getTracks().forEach(t => removeTrack(t));
+
+ return spinEventLoop();
+ })
+ .then(() => {
+ // Test MediaStreamTrackEvent required args here.
+ mustThrowWith("MediaStreamTrackEvent without required args",
+ "TypeError", () => new MediaStreamTrackEvent("addtrack", {}));
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_audioCapture.html b/dom/media/tests/mochitest/test_getUserMedia_audioCapture.html
new file mode 100644
index 000000000..1b5d6f144
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_audioCapture.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioCapture </title>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script>
+
+createHTML({
+ bug: "1156472",
+ title: "Test AudioCapture with regular HTMLMediaElement, AudioContext, and HTMLMediaElement playing a MediaStream",
+ visible: true
+});
+
+scriptsReady
+.then(() => FAKE_ENABLED = false)
+.then(() => {
+ runTestWhenReady(function() {
+ // Get an opus file containing a sine wave at maximum amplitude, of duration
+ // `lengthSeconds`, and of frequency `frequency`.
+ function getSineWaveFile(frequency, lengthSeconds, callback) {
+ var chunks = [];
+ var off = new OfflineAudioContext(1, lengthSeconds * 48000, 48000);
+ var osc = off.createOscillator();
+ var rec = new MediaRecorder(osc);
+ rec.ondataavailable = function(e) {
+ chunks.push(e.data);
+ };
+ rec.onstop = function(e) {
+ var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
+ callback(blob);
+ }
+ osc.frequency.value = frequency;
+ osc.start();
+ rec.start();
+ off.startRendering().then(function(buffer) {
+ rec.stop();
+ });
+ }
+ /**
+ * Get two HTMLMediaElements:
+ * - One playing a sine tone from a blob (of an opus file created on the fly)
+ * - One being the output for an AudioContext's OscillatorNode, connected to
+ * a MediaSourceDestinationNode.
+ *
+ * Also, use the AudioContext playing through its AudioDestinationNode another
+ * tone, using another OscillatorNode.
+ *
+ * Capture the output of the document, feed that back into the AudioContext,
+ * with an AnalyserNode, and check the frequency content to make sure we
+ * have recorded the three sources.
+ *
+ * The three sine tones have frequencies far apart from each other, so that we
+ * can check that the spectrum of the capture stream contains three
+ * components with a high magnitude.
+ */
+ var wavtone = createMediaElement("audio", "WaveTone");
+ var acTone = createMediaElement("audio", "audioContextTone");
+ var ac = new AudioContext();
+
+ var oscThroughMediaElement = ac.createOscillator();
+ oscThroughMediaElement.frequency.value = 1000;
+ var oscThroughAudioDestinationNode = ac.createOscillator();
+ oscThroughAudioDestinationNode.frequency.value = 5000;
+ var msDest = ac.createMediaStreamDestination();
+
+ oscThroughMediaElement.connect(msDest);
+ oscThroughAudioDestinationNode.connect(ac.destination);
+
+ acTone.mozSrcObject = msDest.stream;
+
+ getSineWaveFile(10000, 10, function(blob) {
+ wavtone.src = URL.createObjectURL(blob);
+ oscThroughMediaElement.start();
+ oscThroughAudioDestinationNode.start();
+ wavtone.loop = true;
+ wavtone.play();
+ acTone.play();
+ });
+
+ var constraints = {audio: {mediaSource: "audioCapture"}};
+
+ return getUserMedia(constraints).then((stream) => {
+ window.grip = stream;
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ analyser.enableDebugCanvas();
+ return analyser.waitForAnalysisSuccess(function(array) {
+ // We want to find three frequency components here, around 1000, 5000
+ // and 10000Hz. Frequency are logarithmic. Also make sure we have low
+ // energy in between, not just a flat white noise.
+ return (array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(7500)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] > 200);
+ }).then(finish);
+ }).catch(finish);
+ });
+});
+
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicAudio.html b/dom/media/tests/mochitest/test_getUserMedia_basicAudio.html
new file mode 100644
index 000000000..c69f5d418
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicAudio.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Basic Audio Test", bug: "781534" });
+ /**
+ * Run a test to verify that we can complete a start and stop media playback
+ * cycle for an audio LocalMediaStream on an audio HTMLMediaElement.
+ */
+ runTest(function () {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ var constraints = {audio: true};
+
+ return getUserMedia(constraints).then(stream => {
+ var playback = new LocalMediaStreamPlayback(testAudio, stream);
+ return playback.playMedia(false);
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html b/dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html
new file mode 100644
index 000000000..90a553566
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Basic Screenshare Test",
+ bug: "1211656"
+ });
+
+ var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+
+ /**
+ * Run a test to verify that we can complete a start and stop media playback
+ * cycle for a screenshare LocalMediaStream on a video HTMLMediaElement.
+ */
+ runTest(function () {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+ if (IsMacOSX10_6orOlder() || isWinXP) {
+ ok(true, "Screensharing disabled for OSX10.6 and WinXP");
+ return;
+ }
+ var testVideo = createMediaElement('video', 'testVideo');
+
+ var constraints = {
+ video: {
+ mozMediaSource: "screen",
+ mediaSource: "screen"
+ },
+ fake: false
+ };
+ var videoConstraints = [
+ {
+ mediaSource: 'screen',
+ width: {
+ min: '10',
+ max: '100'
+ },
+ height: {
+ min: '10',
+ max: '100'
+ },
+ frameRate: {
+ min: '10',
+ max: '15'
+ }
+ },
+ {
+ mediaSource: 'screen',
+ width: 200,
+ height: 200,
+ frameRate: {
+ min: '5',
+ max: '10'
+ }
+ }
+ ];
+ return Promise.resolve()
+ // Screensharing must work even without "mochi.test," in allowed_domains
+ .then(() => pushPrefs(["media.getusermedia.screensharing.allowed_domains",
+ "mozilla.github.io,*.bugzilla.mozilla.org"]))
+ .then(() => getUserMedia(constraints).then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ return playback.playMediaWithDeprecatedStreamStop(false);
+ }))
+ .then(() => getUserMedia({video: videoConstraints[0], fake: false}))
+ .then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ playback.startMedia(false);
+ return playback.verifyPlaying()
+ .then(() => Promise.all([
+ () => testVideo.srcObject.getVideoTracks()[0].applyConstraints(videoConstraints[1]),
+ () => listenUntil(testVideo, "resize", () => true)
+ ]))
+ .then(() => playback.verifyPlaying()) // still playing
+ .then(() => playback.deprecatedStopStreamInMediaPlayback())
+ .then(() => playback.detachFromMediaElement());
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicTabshare.html b/dom/media/tests/mochitest/test_getUserMedia_basicTabshare.html
new file mode 100644
index 000000000..c61b5c9b1
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicTabshare.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Basic Tabshare Test",
+ bug: "1193075"
+ });
+ /**
+ * Run a test to verify that we can complete a start and stop media playback
+ * cycle for a tabshare LocalMediaStream on a video HTMLMediaElement.
+ *
+ * Additionally, exercise applyConstraints code for tabshare viewport offset.
+ */
+ runTest(function () {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+ if (IsMacOSX10_6orOlder() || isWinXP) {
+ ok(true, "Screensharing disabled for OSX10.6 and WinXP");
+ return;
+ }
+ var testVideo = createMediaElement('video', 'testVideo');
+
+ return Promise.resolve()
+ .then(() => getUserMedia({
+ video: { mediaSource: "browser",
+ scrollWithPage: true },
+ fake: false
+ }))
+ .then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ return playback.playMediaWithDeprecatedStreamStop(false);
+ })
+ .then(() => getUserMedia({
+ video: {
+ mediaSource: "browser",
+ viewportOffsetX: 0,
+ viewportOffsetY: 0,
+ viewportWidth: 100,
+ viewportHeight: 100
+ },
+ fake: false
+ }))
+ .then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ playback.startMedia(false);
+ return playback.verifyPlaying()
+ .then(() => Promise.all([
+ () => testVideo.srcObject.getVideoTracks()[0].applyConstraints({
+ mediaSource: "browser",
+ viewportOffsetX: 10,
+ viewportOffsetY: 50,
+ viewportWidth: 90,
+ viewportHeight: 50
+ }),
+ () => listenUntil(testVideo, "resize", () => true)
+ ]))
+ .then(() => playback.verifyPlaying()) // still playing
+ .then(() => playback.deprecatedStopStreamInMediaPlayback())
+ .then(() => playback.detachFromMediaElement());
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicVideo.html b/dom/media/tests/mochitest/test_getUserMedia_basicVideo.html
new file mode 100644
index 000000000..e0bce3530
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicVideo.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Basic Video Test",
+ bug: "781534"
+ });
+ /**
+ * Run a test to verify that we can complete a start and stop media playback
+ * cycle for an video LocalMediaStream on a video HTMLMediaElement.
+ */
+ runTest(function () {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var constraints = {video: true};
+
+ return getUserMedia(constraints).then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ return playback.playMedia(false);
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html b/dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html
new file mode 100644
index 000000000..d8cc9c533
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Basic Video & Audio Test",
+ bug: "781534"
+ });
+ /**
+ * Run a test to verify that we can complete a start and stop media playback
+ * cycle for a video and audio LocalMediaStream on a video HTMLMediaElement.
+ */
+ runTest(function () {
+ var testVideoAudio = createMediaElement('video', 'testVideoAudio');
+ var constraints = {video: true, audio: true};
+
+ return getUserMedia(constraints).then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideoAudio, stream);
+ return playback.playMedia(false);
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html b/dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html
new file mode 100644
index 000000000..27cfe6aff
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Basic Video shall receive 'loadedmetadata' without play()ing",
+ bug: "1149494"
+ });
+ /**
+ * Run a test to verify that we will always get 'loadedmetadata' from a video
+ * HTMLMediaElement playing a gUM MediaStream.
+ */
+ runTest(() => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var constraints = {video: true};
+
+ return getUserMedia(constraints).then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ var video = playback.mediaElement;
+
+ video.srcObject = stream;
+ return new Promise(resolve => {
+ ok(playback.mediaElement.paused,
+ "Media element should be paused before play()ing");
+ video.addEventListener('loadedmetadata', function() {
+ ok(video.videoWidth > 0, "Expected nonzero video width");
+ ok(video.videoHeight > 0, "Expected nonzero video width");
+ resolve();
+ });
+ })
+ .then(() => stream.getTracks().forEach(t => t.stop()));
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html b/dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html
new file mode 100644
index 000000000..204e51f78
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Basic Windowshare Test",
+ bug: "1038926"
+ });
+ /**
+ * Run a test to verify that we can complete a start and stop media playback
+ * cycle for an screenshare LocalMediaStream on a video HTMLMediaElement.
+ */
+ runTest(function () {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+ if (IsMacOSX10_6orOlder() || isWinXP) {
+ ok(true, "Screensharing disabled for OSX10.6 and WinXP");
+ return;
+ }
+ var testVideo = createMediaElement('video', 'testVideo');
+ var constraints = {
+ video: {
+ mozMediaSource: "window",
+ mediaSource: "window"
+ },
+ fake: false
+ };
+
+ return getUserMedia(constraints).then(stream => {
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+ return playback.playMediaWithDeprecatedStreamStop(false);
+ });
+
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_bug1223696.html b/dom/media/tests/mochitest/test_getUserMedia_bug1223696.html
new file mode 100644
index 000000000..975815be8
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_bug1223696.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "Testing that removeTrack+addTrack of video tracks still render the correct track in a media element",
+ bug: "1223696",
+ visible: true
+ });
+
+ runTest(() => Promise.resolve()
+ .then(() => getUserMedia({audio:true, video: true})).then(stream => {
+ info("Test addTrack()ing a video track to an audio-only gUM stream");
+
+ var video = createMediaElement("video", "test_video_track");
+ video.srcObject = stream;
+ video.play();
+
+ var h = new CaptureStreamTestHelper2D();
+ var removedTrack = stream.getVideoTracks()[0];
+ stream.removeTrack(removedTrack);
+ video.onloadeddata = () => {
+ info("loadeddata");
+ var canvas = document.createElement("canvas");
+ canvas.getContext("2d");
+ var canvasStream = canvas.captureStream();
+ setInterval(() => h.drawColor(canvas, h.grey), 1000);
+
+ stream.addTrack(canvasStream.getVideoTracks()[0]);
+
+ checkMediaStreamContains(stream, [stream.getAudioTracks()[0],
+ canvasStream.getVideoTracks()[0]]);
+ };
+
+ return listenUntil(video, "loadeddata", () => true)
+ .then(() => h.waitForPixelColor(video, h.grey, 5,
+ "The canvas track should be rendered by the media element"))
+ .then(() => {
+ [removedTrack, ...stream.getAudioTracks()].forEach(t => t.stop());
+ });
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_callbacks.html b/dom/media/tests/mochitest/test_getUserMedia_callbacks.html
new file mode 100644
index 000000000..5c1f6a6a8
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_callbacks.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "navigator.mozGetUserMedia Callback Test",
+ bug: "1119593"
+ });
+ /**
+ * Check that the old fashioned callback-based function works.
+ */
+ runTest(function () {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ var constraints = {audio: true};
+
+ SimpleTest.waitForExplicitFinish();
+ return new Promise(resolve =>
+ navigator.mozGetUserMedia(constraints, stream => {
+ checkMediaStreamTracks(constraints, stream);
+
+ var playback = new LocalMediaStreamPlayback(testAudio, stream);
+ return playback.playMedia(false)
+ .then(() => resolve(), generateErrorCallback());
+ }, generateErrorCallback())
+ );
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_constraints.html b/dom/media/tests/mochitest/test_getUserMedia_constraints.html
new file mode 100644
index 000000000..d6aa88980
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_constraints.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script src="mediaStreamPlayback.js"></script>
+ <script src="constraints.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({ title: "Test getUserMedia constraints", bug: "882145" });
+/**
+ Tests covering gUM constraints API for audio, video and fake video. Exercise
+ successful parsing code and ensure that unknown required constraints and
+ overconstraining cases produce appropriate errors.
+*/
+var tests = [
+ // Each test here tests a different constraint or codepath.
+ { message: "unknown required constraint on video ignored",
+ constraints: { video: { somethingUnknown: { exact: 0 } } },
+ error: null },
+ { message: "unknown required constraint on audio ignored",
+ constraints: { audio: { somethingUnknown: { exact: 0 } } },
+ error: null },
+ { message: "audio overconstrained by facingMode ignored",
+ constraints: { audio: { facingMode: { exact: 'left' } } },
+ error: null },
+ { message: "full screensharing requires permission",
+ constraints: { video: { mediaSource: 'screen' } },
+ error: "NotAllowedError" },
+ { message: "application screensharing requires permission",
+ constraints: { video: { mediaSource: 'application' } },
+ error: "NotAllowedError" },
+ { message: "window screensharing requires permission",
+ constraints: { video: { mediaSource: 'window' } },
+ error: "NotAllowedError" },
+ { message: "browser screensharing requires permission",
+ constraints: { video: { mediaSource: 'browser' } },
+ error: "NotAllowedError" },
+ { message: "unknown mediaSource in video fails",
+ constraints: { video: { mediaSource: 'uncle' } },
+ error: "OverconstrainedError",
+ constraint: "mediaSource" },
+ { message: "unknown mediaSource in audio fails",
+ constraints: { audio: { mediaSource: 'uncle' } },
+ error: "OverconstrainedError",
+ constraint: "mediaSource" },
+ { message: "emtpy constraint fails",
+ constraints: { },
+ error: "NotSupportedError" },
+ { message: "Triggering mock failure in default video device fails",
+ constraints: { video: { deviceId: 'bad device' }, fake: true },
+ error: "NotReadableError" },
+ { message: "Triggering mock failure in default audio device fails",
+ constraints: { audio: { deviceId: 'bad device' }, fake: true },
+ error: "NotReadableError" },
+ { message: "Success-path: optional video facingMode + audio ignoring facingMode",
+ constraints: { audio: { mediaSource: 'microphone',
+ facingMode: 'left',
+ foo: 0,
+ advanced: [{ facingMode: 'environment' },
+ { facingMode: 'user' },
+ { bar: 0 }] },
+ video: { mediaSource: 'camera',
+ foo: 0,
+ advanced: [{ facingMode: 'environment' },
+ { facingMode: ['user'] },
+ { facingMode: ['left', 'right', 'user'] },
+ { bar: 0 }] } },
+ error: null },
+ { message: "legacy facingMode ignored",
+ constraints: { video: { mandatory: { facingMode: 'left' } } },
+ error: null },
+];
+
+var mustSupport = [
+ 'width', 'height', 'frameRate', 'facingMode', 'deviceId',
+ // Yet to add:
+ // 'aspectRatio', 'frameRate', 'volume', 'sampleRate', 'sampleSize',
+ // 'latency', 'groupId'
+
+ // http://fluffy.github.io/w3c-screen-share/#screen-based-video-constraints
+ // OBE by http://w3c.github.io/mediacapture-screen-share
+ 'mediaSource',
+
+ // Experimental https://bugzilla.mozilla.org/show_bug.cgi?id=1131568#c3
+ 'browserWindow', 'scrollWithPage',
+ 'viewportOffsetX', 'viewportOffsetY', 'viewportWidth', 'viewportHeight',
+
+ 'echoCancellation', 'mozNoiseSuppression', 'mozAutoGainControl'
+];
+
+var mustFailWith = (msg, reason, constraint, f) =>
+ f().then(() => ok(false, msg + " must fail"), e => {
+ is(e.name, reason, msg + " must fail: " + e.message);
+ if (constraint !== undefined) {
+ is(e.constraint, constraint, msg + " must fail w/correct constraint.");
+ }
+ });
+
+/**
+ * Starts the test run by running through each constraint
+ * test by verifying that the right resolution and rejection is fired.
+ */
+
+runTest(() => Promise.resolve()
+ .then(() => {
+ // Check supported constraints first.
+ var dict = navigator.mediaDevices.getSupportedConstraints();
+ var supported = Object.keys(dict);
+
+ mustSupport.forEach(key => ok(supported.indexOf(key) != -1 && dict[key],
+ "Supports " + key));
+
+ var unexpected = supported.filter(key => mustSupport.indexOf(key) == -1);
+ is(unexpected.length, 0,
+ "Unanticipated support (please update test): " + unexpected);
+ })
+ .then(() => pushPrefs(["media.getusermedia.browser.enabled", false],
+ ["media.getusermedia.screensharing.enabled", false]))
+ .then(() => tests.reduce((p, test) => p.then(() => getUserMedia(test.constraints))
+ .then(stream => {
+ is(null, test.error, test.message);
+ stream.getTracks().forEach(t => t.stop());
+ }, e => {
+ is(e.name, test.error, test.message + ": " + e.message);
+ if (test.constraint) {
+ is(e.constraint, test.constraint,
+ test.message + " w/correct constraint.");
+ }
+ }), Promise.resolve()))
+ .then(() => getUserMedia({video: true, audio: true}))
+ .then(stream => stream.getVideoTracks()[0].applyConstraints({ width: 320 })
+ .then(() => stream.getAudioTracks()[0].applyConstraints({ }))
+ .then(() => {
+ stream.getTracks().forEach(track => track.stop());
+ ok(true, "applyConstraints code exercised");
+ }))
+ // TODO: Test outcome once fake devices support constraints (Bug 1088621)
+ .then(() => mustFailWith("applyConstraints fails on non-Gum tracks",
+ "OverconstrainedError", "",
+ () => (new AudioContext())
+ .createMediaStreamDestination().stream
+ .getAudioTracks()[0].applyConstraints()))
+ .then(() => mustFailWith(
+ "getUserMedia with unsatisfied required constraint",
+ "OverconstrainedError", "deviceId",
+ () => getUserMedia({ audio: true,
+ video: { deviceId: { exact: "unheardof" } } }))));
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_getTrackById.html b/dom/media/tests/mochitest/test_getUserMedia_getTrackById.html
new file mode 100644
index 000000000..161bf631e
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_getTrackById.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "Basic getTrackById test of gUM stream",
+ bug: "1208390",
+ });
+
+ runTest(() => {
+ var constraints = {audio: true, video: true};
+ return getUserMedia(constraints).then(stream => {
+ is(stream.getTrackById(""), null,
+ "getTrackById of non-matching string should return null");
+
+ let audioTrack = stream.getAudioTracks()[0];
+ is(stream.getTrackById(audioTrack.id), audioTrack,
+ "getTrackById with matching id should return the track");
+
+ let videoTrack = stream.getVideoTracks()[0];
+ is(stream.getTrackById(videoTrack.id), videoTrack,
+ "getTrackById with matching id should return the track");
+
+ stream.removeTrack(audioTrack);
+ is(stream.getTrackById(audioTrack.id), null,
+ "getTrackById with id of removed track should return null");
+
+ let newStream = new MediaStream();
+ is(newStream.getTrackById(videoTrack.id), null,
+ "getTrackById with id of track in other stream should return null");
+
+ newStream.addTrack(audioTrack);
+ is(newStream.getTrackById(audioTrack.id), audioTrack,
+ "getTrackByid with matching id should return the track");
+
+ newStream.addTrack(videoTrack);
+ is(newStream.getTrackById(videoTrack.id), videoTrack,
+ "getTrackByid with matching id should return the track");
+ [audioTrack, videoTrack].forEach(t => t.stop());
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html b/dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html
new file mode 100644
index 000000000..f8cecd9d9
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({title: "getUserMedia within getUserMedia", bug: "822109" });
+ /**
+ * Run a test that we can complete a playback cycle for a video,
+ * then upon completion, do a playback cycle with audio, such that
+ * the audio gum call happens within the video gum call.
+ */
+ runTest(function () {
+ return getUserMedia({video: true})
+ .then(videoStream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var videoPlayback = new LocalMediaStreamPlayback(testVideo,
+ videoStream);
+
+ return videoPlayback.playMedia(false)
+ .then(() => getUserMedia({audio: true}))
+ .then(audioStream => {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ var audioPlayback = new LocalMediaStreamPlayback(testAudio,
+ audioStream);
+
+ return audioPlayback.playMedia(false)
+ .then(() => audioStream.stop());
+ })
+ .then(() => videoStream.stop());
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html b/dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html
new file mode 100644
index 000000000..d6efac465
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia in media element should have video dimensions on loadedmetadata",
+ bug: "1240478"
+ });
+ /**
+ * Tests that assigning a stream to a media element results in the
+ * "loadedmetadata" event without having to play() the media element.
+ *
+ * Also makes sure that the video size has been set on "loadedmetadata".
+ */
+ runTest(function () {
+ var v = document.createElement("video");
+ document.body.appendChild(v);
+ v.preload = "metadata";
+
+ var constraints = {video: true, audio: true};
+ return getUserMedia(constraints).then(stream => new Promise(resolve => {
+ v.srcObject = stream;
+ v.onloadedmetadata = () => {
+ isnot(v.videoWidth, 0, "videoWidth shall be set on 'loadedmetadata'");
+ isnot(v.videoHeight, 0, "videoHeight shall be set on 'loadedmetadata'");
+ resolve();
+ };
+ })
+ .then(() => stream.getTracks().forEach(t => t.stop())));
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html b/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html
new file mode 100644
index 000000000..6d99f2e11
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<pre id="test">
+<script>
+
+createHTML({
+ bug: "1259788",
+ title: "Test CaptureStream audio content on HTMLMediaElement playing a gUM MediaStream",
+ visible: true
+});
+
+var audioContext;
+var gUMAudioElement;
+var analyser;
+runTest(() => getUserMedia({audio: true})
+ .then(stream => {
+ gUMAudioElement = createMediaElement("audio", "gUMAudio");
+ gUMAudioElement.srcObject = stream;
+
+ audioContext = new AudioContext();
+ info("Capturing");
+
+ analyser = new AudioStreamAnalyser(audioContext,
+ gUMAudioElement.mozCaptureStream());
+ analyser.enableDebugCanvas();
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50);
+ })
+ .then(() => {
+ info("Audio flowing. Pausing.");
+ gUMAudioElement.pause();
+
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] < 50 &&
+ array[analyser.binIndexForFrequency(2500)] < 50);
+ })
+ .then(() => {
+ info("Audio stopped flowing. Playing.");
+ gUMAudioElement.play();
+
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50);
+ })
+ .then(() => {
+ info("Audio flowing. Removing source.");
+ var stream = gUMAudioElement.srcObject;
+ gUMAudioElement.srcObject = null;
+
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] < 50 &&
+ array[analyser.binIndexForFrequency(2500)] < 50)
+ .then(() => stream);
+ })
+ .then(stream => {
+ info("Audio stopped flowing. Setting source.");
+ gUMAudioElement.srcObject = stream;
+
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50);
+ })
+ .then(() => {
+ info("Audio flowing from new source. Adding a track.");
+ let oscillator = audioContext.createOscillator();
+ oscillator.type = 'sine';
+ oscillator.frequency.value = 2000;
+ oscillator.start();
+
+ let oscOut = audioContext.createMediaStreamDestination();
+ oscillator.connect(oscOut);
+
+ gUMAudioElement.srcObject.addTrack(oscOut.stream.getTracks()[0]);
+
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] > 200 &&
+ array[analyser.binIndexForFrequency(1500)] < 50 &&
+ array[analyser.binIndexForFrequency(2000)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50);
+ })
+ .then(() => {
+ info("Audio flowing from new track. Removing a track.");
+
+ const gUMTrack = gUMAudioElement.srcObject.getTracks()[0];
+ gUMAudioElement.srcObject.removeTrack(gUMTrack);
+
+ is(gUMAudioElement.srcObject.getTracks().length, 1,
+ "A track should have been removed");
+
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(TEST_AUDIO_FREQ)] < 50 &&
+ array[analyser.binIndexForFrequency(1500)] < 50 &&
+ array[analyser.binIndexForFrequency(2000)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50)
+ .then(() => [gUMTrack, ...gUMAudioElement.srcObject.getTracks()]
+ .forEach(t => t.stop()));
+ })
+ .then(() => ok(true, "Test passed."))
+ .catch(e => ok(false, "Test failed: " + e + (e.stack ? "\n" + e.stack : ""))));
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html b/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html
new file mode 100644
index 000000000..646cc15db
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html
@@ -0,0 +1,185 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<pre id="test">
+<script>
+
+createHTML({
+ bug: "1259788",
+ title: "Test CaptureStream track output on HTMLMediaElement playing a gUM MediaStream",
+ visible: true
+});
+
+var audioElement;
+var audioCaptureStream;
+var videoElement;
+var videoCaptureStream;
+var untilEndedElement;
+var streamUntilEnded;
+var tracks = [];
+runTest(() => getUserMedia({audio: true, video: true})
+ .then(stream => {
+ // We need to test with multiple tracks. We add an extra of each kind.
+ stream.getTracks().forEach(t => stream.addTrack(t.clone()));
+
+ audioElement = createMediaElement("audio", "gUMAudio");
+ audioElement.srcObject = stream;
+
+ return haveEvent(audioElement, "loadedmetadata", wait(50000, new Error("Timeout")));
+ })
+ .then(() => {
+ info("Capturing audio element (loadedmetadata -> captureStream)");
+ audioCaptureStream = audioElement.mozCaptureStream();
+
+ is(audioCaptureStream.getAudioTracks().length, 2,
+ "audio element should capture two audio tracks");
+ is(audioCaptureStream.getVideoTracks().length, 0,
+ "audio element should not capture any video tracks");
+
+ return haveNoEvent(audioCaptureStream, "addtrack");
+ })
+ .then(() => {
+ videoElement = createMediaElement("video", "gUMVideo");
+
+ info("Capturing video element (captureStream -> loadedmetadata)");
+ videoCaptureStream = videoElement.mozCaptureStream();
+ videoElement.srcObject = audioElement.srcObject.clone();
+
+ is(videoCaptureStream.getTracks().length, 0,
+ "video element should have no tracks before metadata known");
+
+ return haveEventsButNoMore(
+ videoCaptureStream, "addtrack", 3, wait(50000, new Error("No event")));
+ })
+ .then(() => {
+ is(videoCaptureStream.getAudioTracks().length, 2,
+ "video element should capture two audio tracks");
+ is(videoCaptureStream.getVideoTracks().length, 1,
+ "video element should capture one video track at most");
+
+ info("Testing dynamically adding audio track to audio element");
+ audioElement.srcObject.addTrack(
+ audioElement.srcObject.getAudioTracks()[0].clone());
+ return haveEventsButNoMore(
+ audioCaptureStream, "addtrack", 1, wait(50000, new Error("No event")));
+ })
+ .then(() => {
+ is(audioCaptureStream.getAudioTracks().length, 3,
+ "Audio element should have three audio tracks captured.");
+
+ info("Testing dynamically adding video track to audio element");
+ audioElement.srcObject.addTrack(
+ audioElement.srcObject.getVideoTracks()[0].clone());
+ return haveNoEvent(audioCaptureStream, "addtrack");
+ })
+ .then(() => {
+ is(audioCaptureStream.getVideoTracks().length, 0,
+ "Audio element should have no video tracks captured.");
+
+ info("Testing dynamically adding audio track to video element");
+ videoElement.srcObject.addTrack(
+ videoElement.srcObject.getAudioTracks()[0].clone());
+ return haveEventsButNoMore(
+ videoCaptureStream, "addtrack", 1, wait(50000, new Error("Timeout")));
+ })
+ .then(() => {
+ is(videoCaptureStream.getAudioTracks().length, 3,
+ "Captured video stream should have three audio tracks captured.");
+
+ info("Testing dynamically adding video track to video element");
+ videoElement.srcObject.addTrack(
+ videoElement.srcObject.getVideoTracks()[0].clone());
+ return haveNoEvent(videoCaptureStream, "addtrack");
+ })
+ .then(() => {
+ is(videoCaptureStream.getVideoTracks().length, 1,
+ "Captured video stream should have at most one video tracks captured.");
+
+ info("Testing track removal.");
+ tracks.push(...videoElement.srcObject.getTracks());
+ videoElement.srcObject.getVideoTracks().reverse().forEach(t =>
+ videoElement.srcObject.removeTrack(t));
+ is(videoCaptureStream.getVideoTracks()
+ .filter(t => t.readyState == "live").length, 1,
+ "Captured video should have still have one video track captured.");
+
+ return haveEvent(videoCaptureStream.getVideoTracks()[0], "ended",
+ wait(50000, new Error("Timeout")));
+ })
+ .then(() => {
+ is(videoCaptureStream.getVideoTracks()
+ .filter(t => t.readyState == "live").length, 0,
+ "Captured video stream should have no video tracks captured after removal.");
+
+ info("Testing source reset.");
+ })
+ .then(() => getUserMedia({audio: true, video: true}))
+ .then(stream => {
+ videoElement.srcObject = stream;
+ return Promise.all(videoCaptureStream.getTracks()
+ .filter(t => t.readyState == "live")
+ .map(t => haveEvent(t, "ended", wait(50000, new Error("Timeout")))));
+ })
+ .then(() => haveEventsButNoMore(
+ videoCaptureStream, "addtrack", 2, wait(50000, new Error("Timeout"))))
+ .then(() => {
+ is(videoCaptureStream.getAudioTracks()
+ .filter(t => t.readyState == "ended").length, 3,
+ "Captured video stream should have three ended audio tracks");
+ is(videoCaptureStream.getAudioTracks()
+ .filter(t => t.readyState == "live").length, 1,
+ "Captured video stream should have one live audio track");
+
+ is(videoCaptureStream.getVideoTracks()
+ .filter(t => t.readyState == "ended").length, 1,
+ "Captured video stream should have one ended video tracks");
+ is(videoCaptureStream.getVideoTracks()
+ .filter(t => t.readyState == "live").length, 1,
+ "Captured video stream should have one live video track");
+
+ info("Testing CaptureStreamUntilEnded");
+ untilEndedElement =
+ createMediaElement("video", "gUMVideoUntilEnded");
+ untilEndedElement.srcObject = audioElement.srcObject;
+
+ return haveEvent(untilEndedElement, "loadedmetadata",
+ wait(50000, new Error("Timeout")));
+ })
+ .then(() => {
+ streamUntilEnded = untilEndedElement.mozCaptureStreamUntilEnded();
+
+ is(streamUntilEnded.getAudioTracks().length, 3,
+ "video element should capture all 3 audio tracks until ended");
+ is(streamUntilEnded.getVideoTracks().length, 1,
+ "video element should capture only 1 video track until ended");
+
+ untilEndedElement.srcObject.getTracks().forEach(t => t.stop());
+ // TODO(1208316) We stop the stream to make the media element end.
+ untilEndedElement.srcObject.stop();
+
+ return Promise.all([
+ haveEvent(untilEndedElement, "ended", wait(50000, new Error("Timeout"))),
+ ...streamUntilEnded.getTracks()
+ .map(t => haveEvent(t, "ended", wait(50000, new Error("Timeout"))))
+ ]);
+ })
+ .then(() => {
+ info("Element and tracks ended. Ensuring that new tracks aren't created.");
+ untilEndedElement.srcObject = videoElement.srcObject;
+ return haveEventsButNoMore(
+ untilEndedElement, "loadedmetadata", 1, wait(50000, new Error("Timeout")));
+ })
+ .then(() => is(streamUntilEnded.getTracks().length, 4,
+ "Should still have 4 tracks"))
+ .catch(e => ok(false, "Test failed: " + e + (e && e.stack ? "\n" + e.stack : "")))
+ .then(() => [...tracks,
+ ...videoElement.srcObject.getTracks()].forEach(t => t.stop())));
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html b/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html
new file mode 100644
index 000000000..a1097094e
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<pre id="test">
+<script>
+
+createHTML({
+ bug: "1259788",
+ title: "Test CaptureStream video content on HTMLMediaElement playing a gUM MediaStream",
+ visible: true
+});
+
+var gUMVideoElement;
+var captureStreamElement;
+
+// We check a pixel somewhere away from the top left corner since
+// MediaEngineDefault puts semi-transparent time indicators there.
+const offsetX = 20;
+const offsetY = 20;
+const threshold = 16;
+const pausedTimeout = 1000;
+const h = new CaptureStreamTestHelper2D(50, 50);
+
+var checkHasFrame = video => h.waitForPixel(video, offsetX, offsetY, px => {
+ let result = h.isOpaquePixelNot(px, h.black, threshold);
+ info("Checking that we have a frame, got [" +
+ Array.slice(px) + "]. Pass=" + result);
+ return result;
+});
+
+var checkVideoPlaying = video => checkHasFrame(video)
+ .then(() => {
+ let startPixel = { data: h.getPixel(video, offsetX, offsetY)
+ , name: "startcolor"
+ };
+ return h.waitForPixel(video, offsetX, offsetY, px => {
+ let result = h.isPixelNot(px, startPixel, threshold)
+ info("Checking playing, [" + Array.slice(px) + "] vs [" +
+ Array.slice(startPixel.data) + "]. Pass=" + result);
+ return result;
+ });
+ });
+
+var checkVideoPaused = video => checkHasFrame(video)
+ .then(() => {
+ let startPixel = { data: h.getPixel(video, offsetX, offsetY)
+ , name: "startcolor"
+ };
+ return h.waitForPixel(video, offsetX, offsetY, px => {
+ let result = h.isOpaquePixelNot(px, startPixel, threshold);
+ info("Checking paused, [" + Array.slice(px) + "] vs [" +
+ Array.slice(startPixel.data) + "]. Pass=" + result);
+ return result;
+ }, pausedTimeout);
+ }).then(result => ok(!result, "Frame shouldn't change within " + pausedTimeout / 1000 + " seconds."));
+
+runTest(() => getUserMedia({video: true, fake: true})
+ .then(stream => {
+ gUMVideoElement =
+ createMediaElement("video", "gUMVideo");
+ gUMVideoElement.srcObject = stream;
+ gUMVideoElement.play();
+
+ info("Capturing");
+ captureStreamElement =
+ createMediaElement("video", "captureStream");
+ captureStreamElement.srcObject = gUMVideoElement.mozCaptureStream();
+ captureStreamElement.play();
+
+ // Adding a dummy audio track to the stream will keep a consuming media
+ // element from ending.
+ // We could also solve it by repeatedly play()ing or autoplay, but then we
+ // wouldn't be sure the media element stopped rendering video because it
+ // went to the ended state or because there were no frames for the track.
+ let osc = createOscillatorStream(new AudioContext(), 1000);
+ captureStreamElement.srcObject.addTrack(osc.getTracks()[0]);
+
+ return checkVideoPlaying(captureStreamElement);
+ })
+ .then(() => {
+ info("Video flowing. Pausing.");
+ gUMVideoElement.pause();
+
+ return checkVideoPaused(captureStreamElement);
+ })
+ .then(() => {
+ info("Video stopped flowing. Playing.");
+ gUMVideoElement.play();
+
+ return checkVideoPlaying(captureStreamElement);
+ })
+ .then(() => {
+ info("Video flowing. Removing source.");
+ var stream = gUMVideoElement.srcObject;
+ gUMVideoElement.srcObject = null;
+
+ return checkVideoPaused(captureStreamElement).then(() => stream);
+ })
+ .then(stream => {
+ info("Video stopped flowing. Setting source.");
+ gUMVideoElement.srcObject = stream;
+ return checkVideoPlaying(captureStreamElement);
+ })
+ .then(() => {
+ info("Video flowing. Changing source by track manipulation. Remove first.");
+ var track = gUMVideoElement.srcObject.getTracks()[0];
+ gUMVideoElement.srcObject.removeTrack(track);
+ return checkVideoPaused(captureStreamElement).then(() => track);
+ })
+ .then(track => {
+ info("Video paused. Changing source by track manipulation. Add first.");
+ gUMVideoElement.srcObject.addTrack(track);
+ gUMVideoElement.play();
+ return checkVideoPlaying(captureStreamElement);
+ })
+ .then(() => {
+ gUMVideoElement.srcObject.getTracks().forEach(t => t.stop());
+ ok(true, "Test passed.");
+ })
+ .catch(e => ok(false, "Test failed: " + e + (e.stack ? "\n" + e.stack : ""))));
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
new file mode 100644
index 000000000..8d4d5e559
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
@@ -0,0 +1,251 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "MediaStream.clone()",
+ bug: "1208371"
+ });
+
+ runTest(() => Promise.resolve()
+ .then(() => getUserMedia({audio: true, video: true})).then(stream => {
+ info("Test clone()ing an audio/video gUM stream");
+ var clone = stream.clone();
+
+ checkMediaStreamCloneAgainstOriginal(clone, stream);
+ checkMediaStreamTrackCloneAgainstOriginal(clone.getAudioTracks()[0],
+ stream.getAudioTracks()[0]);
+ checkMediaStreamTrackCloneAgainstOriginal(clone.getVideoTracks()[0],
+ stream.getVideoTracks()[0]);
+
+ isnot(clone.id.length, 0, "Stream clone should have an id string");
+ isnot(clone.getAudioTracks()[0].id.length, 0,
+ "Audio track clone should have an id string");
+ isnot(clone.getVideoTracks()[0].id.length, 0,
+ "Audio track clone should have an id string");
+
+ info("Stopping original tracks");
+ stream.getTracks().forEach(t => t.stop());
+
+ info("Playing from track clones");
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, clone);
+ return playback.playMedia(false);
+ })
+ .then(() => getUserMedia({video: true})).then(stream =>
+ getUserMedia({video: true}).then(otherStream => {
+ info("Test addTrack()ing a video track to a stream without affecting its clone");
+ var track = stream.getTracks()[0];
+ var otherTrack = otherStream.getTracks()[0];
+
+ var streamClone = stream.clone();
+ var trackClone = streamClone.getTracks()[0];
+ checkMediaStreamContains(streamClone, [trackClone], "Initial clone");
+
+ stream.addTrack(otherTrack);
+ checkMediaStreamContains(stream, [track, otherTrack],
+ "Added video to original");
+ checkMediaStreamContains(streamClone, [trackClone],
+ "Clone not affected");
+
+ stream.removeTrack(track);
+ streamClone.addTrack(track);
+ checkMediaStreamContains(streamClone, [trackClone, track],
+ "Added video to clone");
+ checkMediaStreamContains(stream, [otherTrack],
+ "Original not affected");
+
+ // Not part of streamClone. Does not get stopped by the playback test.
+ otherTrack.stop();
+ otherStream.stop();
+
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, streamClone);
+ return playback.playMedia(false)
+ .then(() => stream.getTracks().forEach(t => t.stop()))
+ .then(() => stream.stop());
+ }))
+ .then(() => getUserMedia({audio: true, video: true})).then(stream => {
+ info("Test cloning a stream into inception");
+ var clone = stream;
+ var clones = Array(10).fill().map(() => clone = clone.clone());
+ var inceptionClone = clones.pop();
+ checkMediaStreamCloneAgainstOriginal(inceptionClone, stream);
+ stream.getTracks().forEach(t => (stream.removeTrack(t),
+ inceptionClone.addTrack(t)));
+ is(inceptionClone.getAudioTracks().length, 2,
+ "The inception clone should contain the original audio track and a track clone");
+ is(inceptionClone.getVideoTracks().length, 2,
+ "The inception clone should contain the original video track and a track clone");
+
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, inceptionClone);
+ return playback.playMedia(false)
+ .then(() => clones.forEach(c => c.getTracks().forEach(t => t.stop())));
+ })
+ .then(() => getUserMedia({audio: true, video: true})).then(stream => {
+ info("Test adding tracks from many stream clones to the original stream");
+
+ const LOOPS = 3;
+ for (var i = 0; i < LOOPS; i++) {
+ stream.clone().getTracks().forEach(t => stream.addTrack(t));
+ }
+ is(stream.getAudioTracks().length, Math.pow(2, LOOPS),
+ "The original track should contain the original audio track and all the audio clones");
+ is(stream.getVideoTracks().length, Math.pow(2, LOOPS),
+ "The original track should contain the original video track and all the video clones");
+ stream.getTracks().forEach(t1 => is(stream.getTracks()
+ .filter(t2 => t1.id == t2.id)
+ .length,
+ 1, "Each track should be unique"));
+
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, stream);
+ return playback.playMedia(false);
+ })
+ .then(() => {
+ info("Testing audio content routing with MediaStream.clone()");
+ var ac = new AudioContext();
+
+ var osc1kOriginal = createOscillatorStream(ac, 1000);
+ var audioTrack1kOriginal = osc1kOriginal.getTracks()[0];
+ var audioTrack1kClone = osc1kOriginal.clone().getTracks()[0];
+
+ var osc5kOriginal = createOscillatorStream(ac, 5000);
+ var audioTrack5kOriginal = osc5kOriginal.getTracks()[0];
+ var audioTrack5kClone = osc5kOriginal.clone().getTracks()[0];
+
+ return Promise.resolve().then(() => {
+ info("Analysing audio output of original stream (1k + 5k)");
+ var stream = new MediaStream();
+ stream.addTrack(audioTrack1kOriginal);
+ stream.addTrack(audioTrack5kOriginal);
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => {
+ info("Waiting for original tracks to stop");
+ stream.getTracks().forEach(t => t.stop());
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ // WebAudioDestination streams do not handle stop()
+ // XXX Should they? Plan to resolve that in bug 1208384.
+ // array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ // array[analyser.binIndexForFrequency(5000)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] < 50);
+ })
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output of stream clone (1k + 5k)");
+ var stream = new MediaStream();
+ stream.addTrack(audioTrack1kClone);
+ stream.addTrack(audioTrack5kClone);
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output of clone of clone (1k + 5k)");
+ var stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]).clone();
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output of clone() + addTrack()ed tracks (1k + 5k)");
+ var stream =
+ new MediaStream(new MediaStream([ audioTrack1kClone
+ , audioTrack5kClone
+ ]).clone().getTracks());
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output of clone()d tracks in original stream (1k) " +
+ "and clone()d tracks in stream clone (5k)");
+ var stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
+ var streamClone = stream.clone();
+
+ stream.getTracks().forEach(t => stream.removeTrack(t));
+ stream.addTrack(streamClone.getTracks()[0]);
+ streamClone.removeTrack(streamClone.getTracks()[0]);
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50)
+ .then(() => {
+ analyser.disconnect();
+ var cloneAnalyser = new AudioStreamAnalyser(ac, streamClone);
+ return cloneAnalyser.waitForAnalysisSuccess(array =>
+ array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50)
+ .then(() => cloneAnalyser.disconnect());
+ });
+ }).then(() => {
+ info("Analysing audio output enabled and disabled tracks that don't affect each other");
+ var stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
+ var clone = stream.clone();
+
+ stream.getTracks()[0].enabled = true;
+ stream.getTracks()[1].enabled = false;
+
+ clone.getTracks()[0].enabled = false;
+ clone.getTracks()[1].enabled = true;
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50)
+ .then(() => {
+ analyser.disconnect();
+ var cloneAnalyser = new AudioStreamAnalyser(ac, clone);
+ return cloneAnalyser.waitForAnalysisSuccess(array =>
+ array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50)
+ .then(() => cloneAnalyser.disconnect());
+ })
+ // Restore original tracks
+ .then(() => stream.getTracks().forEach(t => t.enabled = true));
+ });
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html
new file mode 100644
index 000000000..4ea6e3f44
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "MediaStream constructors with getUserMedia streams Test",
+ bug: "1070216"
+ });
+
+ var audioContext = new AudioContext();
+ var videoElement;
+
+ runTest(() => Promise.resolve()
+ .then(() => videoElement = createMediaElement('video', 'constructorsTest'))
+ .then(() => getUserMedia({video: true})).then(gUMStream => {
+ info("Test default constructor with video");
+ ok(gUMStream.active, "gUMStream with one track should be active");
+ var track = gUMStream.getTracks()[0];
+
+ var stream = new MediaStream();
+ ok(!stream.active, "New MediaStream should be inactive");
+ checkMediaStreamContains(stream, [], "Default constructed stream");
+
+ stream.addTrack(track);
+ ok(stream.active, "MediaStream should be active after adding a track");
+ checkMediaStreamContains(stream, [track], "Added video track");
+
+ var playback = new MediaStreamPlayback(videoElement, stream);
+ return playback.playMedia(false).then(() => {
+ ok(!gUMStream.active, "gUMStream should be inactive after stopping");
+ ok(!stream.active, "stream with stopped tracks should be inactive");
+ });
+ })
+ .then(() => getUserMedia({video: true})).then(gUMStream => {
+ info("Test copy constructor with gUM stream");
+ ok(gUMStream.active, "gUMStream with one track should be active");
+ var track = gUMStream.getTracks()[0];
+
+ var stream = new MediaStream(gUMStream);
+ ok(stream.active, "List constructed MediaStream should be active");
+ checkMediaStreamContains(stream, [track], "Copy constructed video track");
+
+ var playback = new MediaStreamPlayback(videoElement, stream);
+ return playback.playMedia(false).then(() => {
+ ok(!gUMStream.active, "gUMStream should be inactive after stopping");
+ ok(!stream.active, "stream with stopped tracks should be inactive");
+ });
+ })
+ .then(() => getUserMedia({video: true})).then(gUMStream => {
+ info("Test list constructor with empty list");
+ ok(gUMStream.active, "gUMStream with one track should be active");
+ var track = gUMStream.getTracks()[0];
+
+ var stream = new MediaStream([]);
+ ok(!stream.active, "Empty-list constructed MediaStream should be inactive");
+ checkMediaStreamContains(stream, [], "Empty-list constructed stream");
+
+ stream.addTrack(track);
+ ok(stream.active, "MediaStream should be active after adding a track");
+ checkMediaStreamContains(stream, [track], "Added video track");
+
+ var playback = new MediaStreamPlayback(videoElement, stream);
+ return playback.playMedia(false).then(() => {
+ ok(!gUMStream.active, "gUMStream should be inactive after stopping");
+ ok(!stream.active, "stream with stopped tracks should be inactive");
+ });
+ })
+ .then(() => getUserMedia({audio: true, video: true})).then(gUMStream => {
+ info("Test list constructor with a gUM audio/video stream");
+ ok(gUMStream.active, "gUMStream with two tracks should be active");
+ var audioTrack = gUMStream.getAudioTracks()[0];
+ var videoTrack = gUMStream.getVideoTracks()[0];
+
+ var stream = new MediaStream([audioTrack, videoTrack]);
+ ok(stream.active, "List constructed MediaStream should be active");
+ checkMediaStreamContains(stream, [audioTrack, videoTrack],
+ "List constructed audio and video tracks");
+
+ var playback = new MediaStreamPlayback(videoElement, stream);
+ return playback.playMedia(false).then(() => {
+ ok(!gUMStream.active, "gUMStream should be inactive after stopping");
+ ok(!stream.active, "stream with stopped tracks should be inactive");
+ });
+ })
+ .then(() => getUserMedia({video: true})).then(gUMStream => {
+ info("Test list constructor with gUM-video and WebAudio tracks");
+ ok(gUMStream.active, "gUMStream with one track should be active");
+ var audioStream = createOscillatorStream(audioContext, 2000);
+ ok(audioStream.active, "WebAudio stream should be active");
+
+ var audioTrack = audioStream.getTracks()[0];
+ var videoTrack = gUMStream.getTracks()[0];
+
+ var stream = new MediaStream([audioTrack, videoTrack]);
+ ok(stream.active, "List constructed MediaStream should be active");
+ checkMediaStreamContains(stream, [audioTrack, videoTrack],
+ "List constructed WebAudio and gUM-video tracks");
+
+ var playback = new MediaStreamPlayback(videoElement, stream);
+ return playback.playMedia(false).then(() => {
+ gUMStream.getTracks().forEach(t => t.stop());
+ ok(!gUMStream.active, "gUMStream should be inactive after stopping");
+ ok(!stream.active, "stream with stopped tracks should be inactive");
+ });
+ })
+ .then(() => {
+ var osc1k = createOscillatorStream(audioContext, 1000);
+ var audioTrack1k = osc1k.getTracks()[0];
+
+ var osc5k = createOscillatorStream(audioContext, 5000);
+ var audioTrack5k = osc5k.getTracks()[0];
+
+ var osc10k = createOscillatorStream(audioContext, 10000);
+ var audioTrack10k = osc10k.getTracks()[0];
+
+ return Promise.resolve().then(() => {
+ info("Analysing audio output with empty default constructed stream");
+ var stream = new MediaStream();
+ var analyser = new AudioStreamAnalyser(audioContext, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output with copy constructed 5k stream");
+ var stream = new MediaStream(osc5k);
+ is(stream.active, osc5k.active,
+ "Copy constructed MediaStream should preserve active state");
+ var analyser = new AudioStreamAnalyser(audioContext, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output with empty-list constructed stream");
+ var stream = new MediaStream([]);
+ var analyser = new AudioStreamAnalyser(audioContext, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output with list constructed 1k, 5k and 10k tracks");
+ var stream = new MediaStream([audioTrack1k, audioTrack5k, audioTrack10k]);
+ ok(stream.active,
+ "List constructed MediaStream from WebAudio should be active");
+ var analyser = new AudioStreamAnalyser(audioContext, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(2500)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(7500)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] > 200 &&
+ array[analyser.binIndexForFrequency(11000)] < 50)
+ .then(() => analyser.disconnect());
+ });
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html
new file mode 100644
index 000000000..e5e076442
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html
@@ -0,0 +1,170 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "MediaStreamTrack.clone()",
+ bug: "1208371"
+ });
+
+ var testSingleTrackClonePlayback = constraints =>
+ getUserMedia(constraints).then(stream => {
+ info("Test clone()ing an " + constraints + " gUM track");
+ var track = stream.getTracks()[0];
+ var clone = track.clone();
+
+ checkMediaStreamTrackCloneAgainstOriginal(clone, track);
+
+ info("Stopping original track");
+ track.stop();
+
+ info("Creating new stream for clone");
+ var cloneStream = new MediaStream([clone]);
+ checkMediaStreamContains(cloneStream, [clone]);
+
+ info("Testing playback of track clone");
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, cloneStream);
+ return playback.playMedia(false);
+ });
+
+ runTest(() => Promise.resolve()
+ .then(() => testSingleTrackClonePlayback({audio: true}))
+ .then(() => testSingleTrackClonePlayback({video: true}))
+ .then(() => getUserMedia({video: true})).then(stream => {
+ info("Test cloning a track into inception");
+ var track = stream.getTracks()[0];
+ var clone = track;
+ var clones = Array(10).fill().map(() => clone = clone.clone());
+ var inceptionClone = clones.pop();
+ checkMediaStreamTrackCloneAgainstOriginal(inceptionClone, track);
+
+ var cloneStream = new MediaStream();
+ cloneStream.addTrack(inceptionClone);
+
+ // cloneStream is now essentially the same as stream.clone();
+ checkMediaStreamCloneAgainstOriginal(cloneStream, stream);
+
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, cloneStream);
+ return playback.playMedia(false).then(() => {
+ info("Testing that clones of ended tracks are ended");
+ cloneStream.clone().getTracks().forEach(t =>
+ is(t.readyState, "ended", "Track " + t.id + " should be ended"));
+ })
+ .then(() => {
+ clones.forEach(t => t.stop());
+ track.stop();
+ });
+ })
+ .then(() => getUserMedia({audio: true, video: true})).then(stream => {
+ info("Test adding many track clones to the original stream");
+
+ const LOOPS = 3;
+ for (var i = 0; i < LOOPS; i++) {
+ stream.getTracks().forEach(t => stream.addTrack(t.clone()));
+ }
+ is(stream.getVideoTracks().length, Math.pow(2, LOOPS),
+ "The original track should contain the original video track and all the video clones");
+ stream.getTracks().forEach(t1 => is(stream.getTracks()
+ .filter(t2 => t1.id == t2.id)
+ .length,
+ 1, "Each track should be unique"));
+
+ var test = createMediaElement('video', 'testClonePlayback');
+ var playback = new MediaStreamPlayback(test, stream);
+ return playback.playMedia(false);
+ })
+ .then(() => {
+ info("Testing audio content routing with MediaStreamTrack.clone()");
+ var ac = new AudioContext();
+
+ var osc1kOriginal = createOscillatorStream(ac, 1000);
+ var audioTrack1kOriginal = osc1kOriginal.getTracks()[0];
+ var audioTrack1kClone = audioTrack1kOriginal.clone();
+
+ var osc5kOriginal = createOscillatorStream(ac, 5000);
+ var audioTrack5kOriginal = osc5kOriginal.getTracks()[0];
+ var audioTrack5kClone = audioTrack5kOriginal.clone();
+
+ return Promise.resolve().then(() => {
+ info("Analysing audio output enabled and disabled tracks that don't affect each other");
+ audioTrack1kOriginal.enabled = true;
+ audioTrack5kOriginal.enabled = false;
+
+ audioTrack1kClone.enabled = false;
+ audioTrack5kClone.enabled = true;
+
+ var analyser =
+ new AudioStreamAnalyser(ac, new MediaStream([audioTrack1kOriginal,
+ audioTrack5kOriginal]));
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50)
+ .then(() => analyser.disconnect())
+ .then(() => {
+ var cloneAnalyser =
+ new AudioStreamAnalyser(ac, new MediaStream([audioTrack1kClone,
+ audioTrack5kClone]));
+ return cloneAnalyser.waitForAnalysisSuccess(array =>
+ array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+ array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+ array[cloneAnalyser.binIndexForFrequency(10000)] < 50)
+ .then(() => cloneAnalyser.disconnect());
+ })
+ // Restore original tracks
+ .then(() => [audioTrack1kOriginal,
+ audioTrack5kOriginal,
+ audioTrack1kClone,
+ audioTrack5kClone].forEach(t => t.enabled = true));
+ }).then(() => {
+ info("Analysing audio output of 1k original and 5k clone.");
+ var stream = new MediaStream();
+ stream.addTrack(audioTrack1kOriginal);
+ stream.addTrack(audioTrack5kClone);
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => {
+ info("Waiting for tracks to stop");
+ stream.getTracks().forEach(t => t.stop());
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] < 50 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] < 50 &&
+ array[analyser.binIndexForFrequency(10000)] < 50);
+ }).then(() => analyser.disconnect());
+ }).then(() => {
+ info("Analysing audio output of clones of clones (1kx2 + 5kx4)");
+ var stream = new MediaStream([audioTrack1kClone.clone(),
+ audioTrack5kOriginal.clone().clone().clone().clone()]);
+
+ var analyser = new AudioStreamAnalyser(ac, stream);
+ return analyser.waitForAnalysisSuccess(array =>
+ array[analyser.binIndexForFrequency(50)] < 50 &&
+ array[analyser.binIndexForFrequency(1000)] > 200 &&
+ array[analyser.binIndexForFrequency(3000)] < 50 &&
+ array[analyser.binIndexForFrequency(5000)] > 200 &&
+ array[analyser.binIndexForFrequency(10000)] < 50)
+ .then(() => analyser.disconnect());
+ });
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html b/dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html
new file mode 100644
index 000000000..ab75eea77
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+ <script type="application/javascript" src="blacksilence.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({
+ title: "Test getUserMedia peerIdentity Constraint",
+ bug: "942367"
+});
+function theTest() {
+ function testPeerIdentityConstraint(withConstraint) {
+ var config = { audio: true, video: true };
+ if (withConstraint) {
+ config.peerIdentity = 'user@example.com';
+ }
+ info('getting media with constraints: ' + JSON.stringify(config));
+ return getUserMedia(config)
+ .then(stream => Promise.all([
+ audioIsSilence(withConstraint, stream),
+ videoIsBlack(withConstraint, stream)
+ ]).then(() => stream.getTracks().forEach(t => t.stop())));
+ };
+
+ // both without and with the constraint
+ return testPeerIdentityConstraint(false)
+ .then(() => testPeerIdentityConstraint(true));
+}
+
+runTest(theTest);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html b/dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html
new file mode 100644
index 000000000..99339a831
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({title: "getUserMedia Play Audio Twice", bug: "822109" });
+ /**
+ * Run a test that we can complete an audio playback cycle twice in a row.
+ */
+ runTest(function () {
+ return getUserMedia({audio: true}).then(audioStream => {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ var playback = new LocalMediaStreamPlayback(testAudio, audioStream);
+
+ return playback.playMediaWithoutStoppingTracks(false)
+ .then(() => playback.playMedia(true));
+ });
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html b/dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html
new file mode 100644
index 000000000..04c56c062
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({title: "getUserMedia Play Video and Audio Twice", bug: "822109" });
+ /**
+ * Run a test that we can complete a video playback cycle twice in a row.
+ */
+ runTest(function () {
+ return getUserMedia({video: true, audio: true}).then(stream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+
+ return playback.playMediaWithoutStoppingTracks(false)
+ .then(() => playback.playMedia(true));
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html b/dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html
new file mode 100644
index 000000000..784235e08
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Play Video Twice", bug: "822109" });
+ /**
+ * Run a test that we can complete a video playback cycle twice in a row.
+ */
+ runTest(function () {
+ return getUserMedia({video: true}).then(stream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
+
+ return streamPlayback.playMediaWithoutStoppingTracks(false)
+ .then(() => streamPlayback.playMedia(true));
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_scarySources.html b/dom/media/tests/mochitest/test_getUserMedia_scarySources.html
new file mode 100644
index 000000000..2f1b2195b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_scarySources.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="head.js"></script>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+
+createHTML({title: "Detect screensharing sources that are firefox", bug: "1311048"});
+
+netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+const { Services } = SpecialPowers.Cu.import('resource://gre/modules/Services.jsm');
+
+let observe = topic => new Promise(r => Services.obs.addObserver(function o(...args) {
+ Services.obs.removeObserver(o, topic);
+ r(args);
+}, topic, false));
+
+let getDevices = async constraints => {
+ let [{ windowID, innerWindowID, callID }] = await Promise.race([
+ getUserMedia(constraints),
+ observe("getUserMedia:request")
+ ]);
+ let window = Services.wm.getOuterWindowWithId(windowID);
+ let devices = await new Promise((resolve, reject) =>
+ window.navigator.mozGetUserMediaDevices({}, resolve, reject,
+ innerWindowID, callID));
+ return devices.map(d => d.QueryInterface(Ci.nsIMediaDevice));
+};
+
+runTest(async () => {
+ try {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+ if (IsMacOSX10_6orOlder() || isWinXP) {
+ ok(true, "Screensharing disabled for OSX10.6 and WinXP");
+ return;
+ }
+
+ await pushPrefs(["media.navigator.permission.disabled", true],
+ ["media.navigator.permission.fake", true],
+ ["media.navigator.permission.force", true]);
+ let devices = await getDevices({video: { mediaSource: "window" }});
+ ok(devices.length, "Found one or more windows.");
+ devices = devices.filter(d => d.scary);
+ ok(devices.length, "Found one or more scary windows (our own counts).");
+ devices.filter(d => d.name.includes("MochiTest"));
+ ok(devices.length,
+ "Our own window is among the scary: " + devices.map(d => `"${d.name}"`));
+
+ devices = await getDevices({video: { mediaSource: "screen" }});
+ let numScreens = devices.length;
+ ok(numScreens, "Found one or more screens.");
+ devices = devices.filter(d => d.scary);
+ is(devices.length, numScreens, "All screens are scary.");
+ } catch(e) {
+ ok(false, e);
+ }
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_spinEventLoop.html b/dom/media/tests/mochitest/test_getUserMedia_spinEventLoop.html
new file mode 100644
index 000000000..ae691785f
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_spinEventLoop.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Basic Audio Test", bug: "1208656" });
+ /**
+ * Run a test to verify that we can spin the event loop from within a mozGUM callback.
+ */
+ runTest(() => {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ return new Promise((resolve, reject) => {
+ navigator.mozGetUserMedia({ audio: true }, stream => {
+ SpecialPowers.spinEventLoop(window);
+ ok(true, "Didn't crash");
+ stream.getTracks().forEach(t => t.stop());
+ resolve();
+ }, () => {});
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html b/dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html
new file mode 100644
index 000000000..133e398d5
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Stop Audio Stream", bug: "822109" });
+ /**
+ * Run a test to verify that we can start an audio stream in a media element,
+ * call stop() on the stream, and successfully get an ended event fired.
+ */
+ runTest(function () {
+ return getUserMedia({audio: true})
+ .then(stream => {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ var streamPlayback = new LocalMediaStreamPlayback(testAudio, stream);
+
+ return streamPlayback.playMediaWithDeprecatedStreamStop(false);
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html b/dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html
new file mode 100644
index 000000000..32c03b258
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Stop Audio Stream With Followup Audio", bug: "822109" });
+ /**
+ * Run a test to verify that I can complete an audio gum playback in a media
+ * element, stop the stream, and then complete another audio gum playback
+ * in a media element.
+ */
+ runTest(function () {
+ return getUserMedia({audio: true})
+ .then(firstStream => {
+ var testAudio = createMediaElement('audio', 'testAudio');
+ var streamPlayback = new LocalMediaStreamPlayback(testAudio, firstStream);
+
+ return streamPlayback.playMediaWithDeprecatedStreamStop(false)
+ .then(() => getUserMedia({audio: true}))
+ .then(secondStream => {
+ streamPlayback.mediaStream = secondStream;
+
+ return streamPlayback.playMedia(false)
+ .then(() => secondStream.stop());
+ });
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html b/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html
new file mode 100644
index 000000000..697fc9773
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Stop Video Audio Stream", bug: "822109" });
+ /**
+ * Run a test to verify that we can start a video+audio stream in a
+ * media element, call stop() on the stream, and successfully get an
+ * ended event fired.
+ */
+ runTest(function () {
+ return getUserMedia({video: true, audio: true})
+ .then(stream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var playback = new LocalMediaStreamPlayback(testVideo, stream);
+
+ return playback.playMediaWithDeprecatedStreamStop(false);
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html b/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html
new file mode 100644
index 000000000..c22985dc2
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ title: "getUserMedia Stop Video+Audio Stream With Followup Video+Audio",
+ bug: "822109"
+ });
+ /**
+ * Run a test to verify that I can complete an video+audio gum playback in a
+ * media element, stop the stream, and then complete another video+audio gum
+ * playback in a media element.
+ */
+ runTest(function () {
+ return getUserMedia({video: true, audio: true})
+ .then(stream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
+
+ return streamPlayback.playMediaWithDeprecatedStreamStop(false)
+ .then(() => getUserMedia({video: true, audio: true}))
+ .then(secondStream => {
+ streamPlayback.mediaStream = secondStream;
+
+ return streamPlayback.playMedia(false)
+ .then(() => secondStream.stop());
+ });
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html b/dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html
new file mode 100644
index 000000000..823e42a18
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Stop Video Stream", bug: "822109" });
+ /**
+ * Run a test to verify that we can start a video stream in a
+ * media element, call stop() on the stream, and successfully get an
+ * ended event fired.
+ */
+ runTest(function () {
+ return getUserMedia({video: true})
+ .then(stream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
+
+ return streamPlayback.playMediaWithDeprecatedStreamStop(false);
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html b/dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html
new file mode 100644
index 000000000..c2c5591ff
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({ title: "getUserMedia Stop Video Stream With Followup Video", bug: "822109" });
+ /**
+ * Run a test to verify that I can complete an video gum playback in a
+ * media element, stop the stream, and then complete another video gum
+ * playback in a media element.
+ */
+ runTest(function () {
+ return getUserMedia({video: true})
+ .then(stream => {
+ var testVideo = createMediaElement('video', 'testVideo');
+ var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
+
+ return streamPlayback.playMediaWithDeprecatedStreamStop(false)
+ .then(() => getUserMedia({video: true}))
+ .then(secondStream => {
+ streamPlayback.mediaStream = secondStream;
+
+ return streamPlayback.playMedia(false)
+ .then(() => secondStream.stop());
+ });
+ });
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_trackCloneCleanup.html b/dom/media/tests/mochitest/test_getUserMedia_trackCloneCleanup.html
new file mode 100644
index 000000000..ae72b54a9
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_trackCloneCleanup.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "Stopping a MediaStreamTrack and its clones should deallocate the device",
+ bug: "1294605"
+ });
+
+ runTest(() => getUserMedia({audio: true, video: true}).then(stream => {
+ let clone = stream.clone();
+ stream.getTracks().forEach(t => t.stop());
+ stream.clone().getTracks().forEach(t => stream.addTrack(t));
+ is(stream.getTracks().filter(t => t.readyState == "live").length, 0,
+ "Cloning ended tracks should make them ended");
+ [...stream.getTracks(), ...clone.getTracks()].forEach(t => t.stop());
+
+ // Bug 1295352: better to be explicit about noGum here wrt future refactoring.
+ return noGum();
+ }));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_getUserMedia_trackEnded.html b/dom/media/tests/mochitest/test_getUserMedia_trackEnded.html
new file mode 100644
index 000000000..46d0cabc5
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_trackEnded.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<pre id="test">
+<iframe id="iframe" srcdoc="
+ <script type='application/javascript'>
+ document.gUM = (constraints, success, failure) =>
+ navigator.mediaDevices.getUserMedia(constraints).then(success, failure);
+ </script>">
+</iframe>
+<script type="application/javascript">
+ "use strict";
+
+ createHTML({
+ title: "getUserMedia MediaStreamTrack 'ended' event on navigating",
+ bug: "1208373",
+ });
+
+ runTest(() => {
+ let iframe = document.getElementById("iframe");
+ let stream;
+ // We're passing callbacks into a method in the iframe here, because
+ // a Promise created in the iframe is unusable after the iframe has
+ // navigated away (see bug 1269400 for details).
+ return new Promise((resolve, reject) =>
+ iframe.contentDocument.gUM({audio: true, video: true}, resolve, reject))
+ .then(s => {
+ // We're cloning a stream containing identical tracks (an original
+ // and its clone) to test that ended works both for originals
+ // clones when they're both owned by the same MediaStream.
+ // (Bug 1274221)
+ stream = new MediaStream([].concat(s.getTracks(), s.getTracks())
+ .map(t => t.clone())).clone();
+ var allTracksEnded = Promise.all(stream.getTracks().map(t => {
+ info("Set up ended handler for track " + t.id);
+ return haveEvent(t, "ended", wait(50000))
+ .then(event => {
+ info("ended handler invoked for track " + t.id);
+ is(event.target, t, "Target should be correct");
+ }, e => e ? Promise.reject(e)
+ : ok(false, "ended event never raised for track " + t.id));
+ }));
+ stream.getTracks().forEach(t =>
+ is(t.readyState, "live",
+ "Non-ended track should have readyState 'live'"));
+ iframe.srcdoc = "";
+ info("iframe has been reset. Waiting for tracks to end.");
+ return allTracksEnded;
+ })
+ .then(() => stream.getTracks().forEach(t =>
+ is(t.readyState, "ended",
+ "Ended track should have readyState 'ended'")));
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_ondevicechange.html b/dom/media/tests/mochitest/test_ondevicechange.html
new file mode 100644
index 000000000..20894cff7
--- /dev/null
+++ b/dom/media/tests/mochitest/test_ondevicechange.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1041393
+-->
+<head>
+ <meta charset="utf-8">
+ <title>onndevicechange tests</title>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1152383">ondevicechange tests</a>
+<script type="application/javascript">
+
+const RESPONSE_WAIT_TIME_MS = 10000;
+
+function wait(time, message) {
+ return new Promise(r => setTimeout(() => r(message), time));
+}
+
+function OnDeviceChangeEvent() {
+ return new Promise(resolve => navigator.mediaDevices.ondevicechange = resolve);
+}
+
+function OnDeviceChangeEventReceived() {
+ return Promise.race([
+ OnDeviceChangeEvent(),
+ wait(RESPONSE_WAIT_TIME_MS).then(() => Promise.reject("Timed out while waiting for devicechange event"))
+ ]);
+}
+
+function OnDeviceChangeEventNotReceived() {
+ return Promise.race([
+ OnDeviceChangeEvent().then(() => Promise.reject("ondevicechange event is fired unexpectedly.")),
+ wait(RESPONSE_WAIT_TIME_MS)
+ ]);
+}
+
+var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+
+var videoTracks;
+
+SimpleTest.requestCompleteLog();
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("Fake devicechange event is fired periodically, \
+so we need to wait a while to make sure the event is fired or not as we expect.");
+
+var videoTracks;
+
+function wait(time, message) {
+ return new Promise(r => setTimeout(() => r(message), time));
+}
+
+pushPrefs(["media.ondevicechange.fakeDeviceChangeEvent.enabled", true])
+.then(() => pushPrefs(["media.navigator.permission.disabled", false]))
+.then(() => pushPrefs(["media.ondevicechange.enabled", true]))
+.then(() => info("assure devicechange event is NOT fired when gUM is NOT in use and permanent permission is NOT granted"))
+.then(() => OnDeviceChangeEventNotReceived())
+.then(() => ok(true, "devicechange event is NOT fired when gUM is NOT in use and permanent permission is NOT granted"))
+.then(() => pushPrefs(['media.navigator.permission.disabled', true]))
+.then(() => info("assure devicechange event is fired when gUM is NOT in use and permanent permission is granted"))
+.then(() => OnDeviceChangeEventReceived())
+.then(() => ok(true, "devicechange event is fired when gUM is NOT in use and permanent permission is granted"))
+.then(() => navigator.mediaDevices.getUserMedia({video: true, fake: true}))
+.then(st => {videoTracks = st.getVideoTracks();})
+.then(() => info("assure devicechange event is fired when gUM is in use"))
+.then(() => OnDeviceChangeEventReceived())
+.then(() => ok(true, "devicechange event is fired when gUM is in use"))
+.catch(e => ok(false, "Error: " + e))
+.then(() => {
+ if(videoTracks)
+ videoTracks.forEach(track => track.stop());
+})
+.then(() => SimpleTest.finish());
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html b/dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html
new file mode 100644
index 000000000..0d1ea10b6
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1246310",
+ title: "Renegotiation: add audio track to existing video-only stream",
+ });
+
+ runNetworkTest(function (options) {
+ var test = new PeerConnectionTest(options);
+ test.chain.replace("PC_LOCAL_GUM",
+ [
+ function PC_LOCAL_GUM_ATTACH_VIDEO_ONLY(test) {
+ var localConstraints = {audio: true, video: true};
+ test.setMediaConstraints([{video: true}], []);
+ return getUserMedia(localConstraints)
+ .then(s => test.originalGumStream = s)
+ .then(() => is(test.originalGumStream.getAudioTracks().length, 1,
+ "Should have 1 audio track"))
+ .then(() => is(test.originalGumStream.getVideoTracks().length, 1,
+ "Should have 1 video track"))
+ .then(() => test.pcLocal.attachLocalTrack(
+ test.originalGumStream.getVideoTracks()[0],
+ test.originalGumStream));
+ },
+ ]
+ );
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ATTACH_SECOND_TRACK_AUDIO(test) {
+ test.setMediaConstraints([{audio: true, video: true}], []);
+ return test.pcLocal.attachLocalTrack(
+ test.originalGumStream.getAudioTracks()[0],
+ test.originalGumStream);
+ },
+ ],
+ [
+ function PC_CHECK_REMOTE_AUDIO_FLOW(test) {
+ return test.pcRemote.checkReceivingToneFrom(new AudioContext(), test.pcLocal);
+ }
+ ]
+ );
+
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addDataChannel.html b/dom/media/tests/mochitest/test_peerConnection_addDataChannel.html
new file mode 100644
index 000000000..366e8fe41
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addDataChannel.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: add DataChannel"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ commandsCreateDataChannel,
+ commandsCheckDataChannel);
+
+ // Insert before the second PC_LOCAL_WAIT_FOR_MEDIA_FLOW
+ test.chain.insertBefore('PC_LOCAL_WAIT_FOR_MEDIA_FLOW',
+ commandsWaitForDataChannel,
+ false,
+ 1);
+
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html
new file mode 100644
index 000000000..782c8fddd
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: add DataChannel"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ commandsCreateDataChannel.concat(
+ [
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ },
+ ]
+ ),
+ commandsCheckDataChannel);
+
+ // Insert before the second PC_LOCAL_WAIT_FOR_MEDIA_FLOW
+ test.chain.insertBefore('PC_LOCAL_WAIT_FOR_MEDIA_FLOW',
+ commandsWaitForDataChannel,
+ false,
+ 1);
+
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html b/dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html
new file mode 100644
index 000000000..93cbdd083
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1087551",
+ title: "addIceCandidate behavior (local and remote) including invalid data"
+ });
+
+ var test;
+ runNetworkTest(function () {
+ test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_LOCAL_GET_ANSWER");
+
+ test.chain.insertAfter("PC_LOCAL_SET_LOCAL_DESCRIPTION", [
+ function PC_LOCAL_ADD_CANDIDATE_EARLY(test) {
+ var candidate = new RTCIceCandidate(
+ {candidate:"candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host",
+ sdpMLineIndex: 0});
+ return test.pcLocal._pc.addIceCandidate(candidate).then(
+ generateErrorCallback("addIceCandidate should have failed."),
+ err => {
+ is(err.name, "InvalidStateError", "Error is InvalidStateError");
+ });
+ }
+ ]);
+ test.chain.insertAfter("PC_REMOTE_SET_LOCAL_DESCRIPTION", [
+ function PC_REMOTE_ADD_CANDIDATE_INVALID_INDEX(test) {
+ var invalid_index = new RTCIceCandidate(
+ {candidate:"candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host",
+ sdpMLineIndex: 2});
+ return test.pcRemote._pc.addIceCandidate(invalid_index)
+ .then(
+ generateErrorCallback("addIceCandidate should have failed."),
+ err => {
+ is(err.name, "InvalidCandidateError", "Error is InvalidCandidateError");
+ }
+ );
+ },
+ function PC_REMOTE_ADD_BOGUS_CANDIDATE(test) {
+ var bogus = new RTCIceCandidate(
+ {candidate:"Pony Lords, jump!",
+ sdpMLineIndex: 0});
+ return test.pcRemote._pc.addIceCandidate(bogus)
+ .then(
+ generateErrorCallback("addIceCandidate should have failed."),
+ err => {
+ is(err.name, "InvalidCandidateError", "Error is InvalidCandidateError");
+ }
+ );
+ },
+ function PC_REMOTE_ADD_CANDIDATE_MISSING_INDEX(test) {
+ // Note: it is probably not a good idea to automatically fill a missing
+ // MLineIndex with a default value of zero, see bug 1157034
+ var broken = new RTCIceCandidate(
+ {candidate:"candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host"});
+ return test.pcRemote._pc.addIceCandidate(broken)
+ .then(
+ // FIXME this needs to be updated once bug 1157034 is fixed
+ todo(false, "Missing index in got automatically set to a valid value bz://1157034")
+ );
+ },
+ function PC_REMOTE_ADD_VALID_CANDIDATE(test) {
+ var candidate = new RTCIceCandidate(
+ {candidate:"candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host",
+ sdpMLineIndex: 0});
+ return test.pcRemote._pc.addIceCandidate(candidate)
+ .then(ok(true, "Successfully added valid ICE candidate"));
+ },
+ // bug 1095793
+ function PC_REMOTE_ADD_MISMATCHED_MID_AND_LEVEL_CANDIDATE(test) {
+ var bogus = new mozRTCIceCandidate(
+ {candidate:"candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host",
+ sdpMLineIndex: 0,
+ sdpMid: "sdparta_1"});
+ return test.pcRemote._pc.addIceCandidate(bogus)
+ .then(
+ generateErrorCallback("addIceCandidate should have failed."),
+ err => {
+ is(err.name, "InvalidCandidateError", "Error is InvalidCandidateError");
+ }
+ );
+ },
+ function PC_REMOTE_ADD_MATCHING_MID_AND_LEVEL_CANDIDATE(test) {
+ var candidate = new mozRTCIceCandidate(
+ {candidate:"candidate:1 1 UDP 2130706431 192.168.2.1 50005 typ host",
+ sdpMLineIndex: 0,
+ sdpMid: "sdparta_0"});
+ return test.pcRemote._pc.addIceCandidate(candidate)
+ .then(ok(true, "Successfully added valid ICE candidate with matching mid and level"));
+ }
+ ]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html b/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html
new file mode 100644
index 000000000..73b28f1af
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: add second audio stream"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}]);
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html
new file mode 100644
index 000000000..cf9736e87
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: add second audio stream, no bundle"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}]);
+ // Since this is a NoBundle variant, adding a track will cause us to
+ // go back to checking.
+ test.pcLocal.expectIceChecking();
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html b/dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html
new file mode 100644
index 000000000..ebe7d46b1
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: add second video stream"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{video: true}, {video: true}],
+ [{video: true}]);
+ return test.pcLocal.getAllUserMedia([{video: true}]);
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html
new file mode 100644
index 000000000..64dc97fc7
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: add second video stream, no bundle"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{video: true}, {video: true}],
+ [{video: true}]);
+ // Since this is a NoBundle variant, adding a track will cause us to
+ // go back to checking.
+ test.pcLocal.expectIceChecking();
+ return test.pcLocal.getAllUserMedia([{video: true}]);
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html b/dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html
new file mode 100644
index 000000000..7f4b52b06
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+"use strict";
+
+createHTML({
+ title: "MediaStream's 'addtrack' and 'removetrack' events with gUM",
+ bug: "1208328"
+});
+
+runNetworkTest(function (options) {
+ let test = new PeerConnectionTest(options);
+ let eventsPromise;
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_SWAP_VIDEO_TRACKS(test) {
+ return getUserMedia({video: true}).then(stream => {
+ const localStream = test.pcLocal._pc.getLocalStreams()[0];
+ ok(localStream, "Should have local stream");
+
+ const remoteStream = test.pcRemote._pc.getRemoteStreams()[0];
+ ok(remoteStream, "Should have remote stream");
+
+ const newTrack = stream.getTracks()[0];
+
+ const videoSenderIndex =
+ test.pcLocal._pc.getSenders().findIndex(s => s.track.kind == "video");
+ isnot(videoSenderIndex, -1, "Should have video sender");
+
+ test.pcLocal.removeSender(videoSenderIndex);
+ test.pcLocal.attachLocalTrack(stream.getTracks()[0], localStream);
+
+ const addTrackPromise = haveEvent(remoteStream, "addtrack",
+ wait(50000, new Error("No addtrack event")))
+ .then(trackEvent => {
+ ok(trackEvent instanceof MediaStreamTrackEvent,
+ "Expected event to be instance of MediaStreamTrackEvent");
+ is(trackEvent.type, "addtrack",
+ "Expected addtrack event type");
+ is(trackEvent.track.id, newTrack.id, "Expected track in event");
+ is(trackEvent.track.readyState, "live",
+ "added track should be live");
+ })
+ .then(() => haveNoEvent(remoteStream, "addtrack"));
+
+ const remoteTrack = test.pcRemote._pc.getReceivers()
+ .map(r => r.track)
+ .find(t => t.kind == "video");
+ ok(remoteTrack, "Should have received remote track");
+ const endedPromise = haveEvent(remoteTrack, "ended",
+ wait(50000, new Error("No ended event")));
+
+ eventsPromise = Promise.all([addTrackPromise, endedPromise]);
+
+ remoteStream.addEventListener("removetrack",
+ function onRemovetrack(trackEvent) {
+ ok(false, "UA shouldn't raise 'removetrack' when receiving peer connection");
+ })
+ });
+ },
+ ],
+ [
+ function PC_REMOTE_CHECK_EVENTS(test) {
+ return eventsPromise;
+ },
+ ]
+ );
+
+ test.setMediaConstraints([{audio: true, video: true}], []);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html b/dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html
new file mode 100644
index 000000000..6efc4cf8b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: answerer adds second audio stream"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiationAnswerer(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}]);
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ ]
+ );
+
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html b/dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html
new file mode 100644
index 000000000..8160a5edc
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="sdpUtils.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1213773",
+ title: "Renegotiation: answerer uses a=inactive for audio"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ var helper = new AudioStreamHelper();
+
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}], []);
+
+ test.chain.append([
+ function PC_REMOTE_CHECK_AUDIO_FLOWING() {
+ return helper.checkAudioFlowing(test.pcRemote._pc.getRemoteStreams()[0]);
+ }
+ ]);
+
+ addRenegotiation(test.chain, []);
+
+ test.chain.insertAfter("PC_LOCAL_GET_ANSWER", [
+ function PC_LOCAL_REWRITE_REMOTE_SDP_INACTIVE(test) {
+ test._remote_answer.sdp =
+ sdputils.setAllMsectionsInactive(test._remote_answer.sdp);
+ }
+ ], false, 1);
+
+ test.chain.append([
+ function PC_REMOTE_CHECK_AUDIO_NOT_FLOWING() {
+ return helper.checkAudioNotFlowing(test.pcRemote._pc.getRemoteStreams()[0]);
+ }
+ ]);
+
+ test.chain.remove("PC_REMOTE_CHECK_STATS", 1);
+ test.chain.remove("PC_LOCAL_CHECK_STATS", 1);
+
+ addRenegotiation(test.chain, []);
+
+ test.chain.append([
+ function PC_REMOTE_CHECK_AUDIO_FLOWING_2() {
+ return helper.checkAudioFlowing(test.pcRemote._pc.getRemoteStreams()[0]);
+ }
+ ]);
+
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudio.html b/dom/media/tests/mochitest/test_peerConnection_basicAudio.html
new file mode 100644
index 000000000..9dfd11ea7
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudio.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796892",
+ title: "Basic audio-only peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ // pc.js uses video elements by default, we want to test audio elements here
+ test.pcLocal.audioElementsOnly = true;
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html
new file mode 100644
index 000000000..6a5379d37
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1246011",
+ title: "Offer with dynamic PT but missing rtpmap"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ // we want Opus to get selected and 101 to be ignored
+ options.opus = true;
+ test = new PeerConnectionTest(options);
+ test.chain.insertBefore("PC_REMOTE_GET_OFFER", [
+ function PC_LOCAL_REDUCE_MLINE_REMOVE_RTPMAPS(test) {
+ test.originalOffer.sdp =
+ sdputils.reduceAudioMLineToDynamicPtAndOpus(test.originalOffer.sdp);
+ test.originalOffer.sdp =
+ sdputils.removeAllRtpMaps(test.originalOffer.sdp);
+ test.originalOffer.sdp = test.originalOffer.sdp + "a=rtpmap:109 opus/48000/2\r\n";
+ info("SDP with dyn PT and no Rtpmap: " + JSON.stringify(test.originalOffer));
+ }
+ ]);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html
new file mode 100644
index 000000000..898ecba19
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="nonTrickleIce.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1231975",
+ title: "Basic audio-only peer connection with port dependent NAT"
+ });
+
+ var test;
+ runNetworkTest(options => {
+ SpecialPowers.pushPrefEnv(
+ {
+ 'set': [
+ ['media.peerconnection.nat_simulator.filtering_type', 'PORT_DEPENDENT'],
+ ['media.peerconnection.nat_simulator.mapping_type', 'PORT_DEPENDENT']
+ ]
+ }, function (options) {
+ options = options || {};
+ options.expectedLocalCandidateType = "serverreflexive";
+ options.expectedRemoteCandidateType = "relayed";
+ // If both have TURN, it is a toss-up which one will end up using a
+ // relay.
+ options.turn_disabled_local = true;
+ test = new PeerConnectionTest(options);
+ // Make sure we don't end up choosing the wrong thing due to delays in
+ // trickle. Once we are willing to accept trickle after ICE success, we
+ // can maybe wait a bit to allow things to stabilize.
+ // TODO(bug 1238249)
+ makeOffererNonTrickle(test.chain);
+ makeAnswererNonTrickle(test.chain);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ })
+ }, { useIceServer: true });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html
new file mode 100644
index 000000000..d2ef92b37
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1231975",
+ title: "Basic audio-only peer connection with port dependent NAT that blocks UDP"
+ });
+
+ var test;
+ runNetworkTest(options => {
+ SpecialPowers.pushPrefEnv(
+ {
+ 'set': [
+ ['media.peerconnection.nat_simulator.filtering_type', 'PORT_DEPENDENT'],
+ ['media.peerconnection.nat_simulator.mapping_type', 'PORT_DEPENDENT'],
+ ['media.peerconnection.nat_simulator.block_udp', true]
+ ]
+ }, function (options) {
+ options = options || {};
+ options.expectedLocalCandidateType = "relayed-tcp";
+ options.expectedRemoteCandidateType = "relayed-tcp";
+ // No reason to wait for gathering to complete like the other NAT tests,
+ // since relayed-tcp is the only thing that can work.
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ })
+ }, { useIceServer: true });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html
new file mode 100644
index 000000000..d6414d64b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="nonTrickleIce.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1231975",
+ title: "Basic audio-only peer connection with endpoint independent NAT"
+ });
+
+ var test;
+ runNetworkTest(options => {
+ SpecialPowers.pushPrefEnv(
+ {
+ 'set': [
+ ['media.peerconnection.nat_simulator.filtering_type', 'ENDPOINT_INDEPENDENT'],
+ ['media.peerconnection.nat_simulator.mapping_type', 'ENDPOINT_INDEPENDENT']
+ ]
+ }, function (options) {
+ options = options || {};
+ options.expectedLocalCandidateType = "serverreflexive";
+ options.expectedRemoteCandidateType = "serverreflexive";
+ test = new PeerConnectionTest(options);
+ // Make sure we don't end up choosing the wrong thing due to delays in
+ // trickle. Once we are willing to accept trickle after ICE success, we
+ // can maybe wait a bit to allow things to stabilize.
+ // TODO(bug 1238249)
+ makeOffererNonTrickle(test.chain);
+ makeAnswererNonTrickle(test.chain);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ })
+ }, { useIceServer: true });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html
new file mode 100644
index 000000000..bd5e4c25d
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1221837",
+ title: "Only offer PCMA and PMCU in mline (no rtpmaps)"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.opus = false;
+ test = new PeerConnectionTest(options);
+ test.chain.insertBefore("PC_REMOTE_GET_OFFER", [
+ function PC_LOCAL_REDUCE_MLINE_REMOVE_RTPMAPS(test) {
+ test.originalOffer.sdp =
+ sdputils.reduceAudioMLineToPcmuPcma(test.originalOffer.sdp);
+ test.originalOffer.sdp =
+ sdputils.removeAllRtpMaps(test.originalOffer.sdp);
+ info("SDP without Rtpmaps: " + JSON.stringify(test.originalOffer));
+ }
+ ]);
+ test.chain.insertAfter("PC_REMOTE_SANE_LOCAL_SDP", [
+ function PC_REMOTE_VERIFY_PCMU(test) {
+ ok(test._remote_answer.sdp.includes("a=rtpmap:0 PCMU/8000"), "PCMU codec is present in SDP");
+ }
+ ]);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html
new file mode 100644
index 000000000..e3e44cf1b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1167443",
+ title: "Basic audio-only peer connection which waits for end-of-candidates"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.chain.replace("PC_LOCAL_VERIFY_SDP_AFTER_END_OF_TRICKLE", [
+ function PC_LOCAL_REQUIRE_SDP_AFTER_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleSdp.then(sdp =>
+ sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcLocal.label));
+ }
+ ]);
+ test.chain.replace("PC_REMOTE_VERIFY_SDP_AFTER_END_OF_TRICKLE", [
+ function PC_REMOTE_REQUIRE_SDP_AFTER_END_OF_TRICKLE(test) {
+ return test.pcRemote.endOfTrickleSdp.then(sdp =>
+ sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcRemote.label));
+ }
+ ]);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html
new file mode 100644
index 000000000..0af2b207a
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796890",
+ title: "Basic audio/video (separate) peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html
new file mode 100644
index 000000000..ae51e4a1c
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796890",
+ title: "Basic audio/video (combined) peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true, video: true}],
+ [{audio: true, video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html
new file mode 100644
index 000000000..c840804a6
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1016476",
+ title: "Basic audio/video peer connection with no Bundle"
+ });
+
+ runNetworkTest(options => {
+ options = options || { };
+ options.bundle = false;
+ var test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html
new file mode 100644
index 000000000..f9e6c81cd
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1167443",
+ title: "Basic audio & video call with disabled bundle and disbaled RTCP-Mux"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ options.rtcpmux = false;
+ test = new PeerConnectionTest(options);
+ test.chain.replace("PC_LOCAL_VERIFY_SDP_AFTER_END_OF_TRICKLE", [
+ function PC_LOCAL_REQUIRE_SDP_AFTER_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleSdp .then(sdp =>
+ sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcLocal.label));
+ }
+ ]);
+ test.chain.replace("PC_REMOTE_VERIFY_SDP_AFTER_END_OF_TRICKLE", [
+ function PC_REMOTE_REQUIRE_SDP_AFTER_END_OF_TRICKLE(test) {
+ return test.pcRemote.endOfTrickleSdp .then(sdp =>
+ sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcRemote.label));
+ }
+ ]);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html
new file mode 100644
index 000000000..da8dd2d55
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1167443",
+ title: "Basic audio & video call with disabled RTCP-Mux"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.rtcpmux = false;
+ test = new PeerConnectionTest(options);
+ test.chain.replace("PC_LOCAL_VERIFY_SDP_AFTER_END_OF_TRICKLE", [
+ function PC_LOCAL_REQUIRE_SDP_AFTER_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleSdp .then(sdp =>
+ sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcLocal.label));
+ }
+ ]);
+ test.chain.replace("PC_REMOTE_VERIFY_SDP_AFTER_END_OF_TRICKLE", [
+ function PC_REMOTE_REQUIRE_SDP_AFTER_END_OF_TRICKLE(test) {
+ return test.pcRemote.endOfTrickleSdp .then(sdp =>
+ sdputils.checkSdpAfterEndOfTrickle(sdp, test.testOptions, test.pcRemote.label));
+ }
+ ]);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicH264Video.html b/dom/media/tests/mochitest/test_peerConnection_basicH264Video.html
new file mode 100644
index 000000000..520a812c2
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicH264Video.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1040346",
+ title: "Basic H.264 GMP video-only peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.h264 = true;
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html b/dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html
new file mode 100644
index 000000000..08db1b161
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1039666",
+ title: "Basic screenshare-only peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+ if (IsMacOSX10_6orOlder() || isWinXP) {
+ ok(true, "Screensharing disabled for OSX10.6 and WinXP");
+ SimpleTest.finish();
+ return;
+ }
+ test = new PeerConnectionTest(options);
+ var constraints = {
+ video: {
+ mozMediaSource: "screen",
+ mediaSource: "screen"
+ },
+ fake: false
+ };
+ test.setMediaConstraints([constraints], [constraints]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicVideo.html b/dom/media/tests/mochitest/test_peerConnection_basicVideo.html
new file mode 100644
index 000000000..ce071a516
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicVideo.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "796888",
+ title: "Basic video-only peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html b/dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html
new file mode 100644
index 000000000..387ea9aec
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1038926",
+ title: "Basic windowshare-only peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ const isWinXP = navigator.userAgent.indexOf("Windows NT 5.1") != -1;
+ if (IsMacOSX10_6orOlder() || isWinXP) {
+ ok(true, "Screensharing disabled for OSX10.6 and WinXP");
+ SimpleTest.finish();
+ return;
+ }
+ test = new PeerConnectionTest(options);
+ var constraints = {
+ video: {
+ mozMediaSource: "window",
+ mediaSource: "window"
+ },
+ fake: false
+ };
+ test.setMediaConstraints([constraints], [constraints]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug1013809.html b/dom/media/tests/mochitest/test_peerConnection_bug1013809.html
new file mode 100644
index 000000000..69d36ee39
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug1013809.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1013809",
+ title: "Audio-only peer connection with swapped setLocal and setRemote steps"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ var sld = test.chain.remove("PC_REMOTE_SET_LOCAL_DESCRIPTION");
+ test.chain.insertAfter("PC_LOCAL_SET_REMOTE_DESCRIPTION", sld);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug1042791.html b/dom/media/tests/mochitest/test_peerConnection_bug1042791.html
new file mode 100644
index 000000000..f5710e68d
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug1042791.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1040346",
+ title: "Basic H.264 GMP video-only peer connection"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.h264 = true;
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.chain.removeAfter("PC_LOCAL_CREATE_OFFER");
+
+ test.chain.append([
+ function PC_LOCAL_VERIFY_H264_OFFER(test) {
+ ok(!test.pcLocal._latest_offer.sdp.toLowerCase().includes("profile-level-id=0x42e0"),
+ "H264 offer does not contain profile-level-id=0x42e0");
+ ok(test.pcLocal._latest_offer.sdp.toLowerCase().includes("profile-level-id=42e0"),
+ "H264 offer contains profile-level-id=42e0");
+ }
+ ]);
+
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug1064223.html b/dom/media/tests/mochitest/test_peerConnection_bug1064223.html
new file mode 100644
index 000000000..acb72d0ba
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug1064223.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1064223",
+ title: "CreateOffer fails without streams or modern RTCOfferOptions"
+ });
+
+ runNetworkTest(function () {
+ var pc = new mozRTCPeerConnection();
+ var options = { mandatory: { OfferToReceiveVideo: true } }; // obsolete
+
+ pc.createOffer(options).then(() => ok(false, "createOffer must fail"),
+ e => is(e.name, "InternalError",
+ "createOffer must fail"))
+ .catch(e => ok(false, e.message))
+ .then(() => {
+ pc.close();
+ networkTestFinished();
+ })
+ .catch(e => ok(false, e.message));
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug1227781.html b/dom/media/tests/mochitest/test_peerConnection_bug1227781.html
new file mode 100644
index 000000000..17a7c1106
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug1227781.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1227781",
+ title: "Test with invalid TURN server"
+ });
+
+ var turnConfig = { iceServers: [{"username":"mozilla","credential"
+ :"mozilla","url":"turn:test@10.0.0.1"}] };
+ var test;
+ runNetworkTest(function (options) {
+ var exception = false;
+
+ try {
+ pc = new RTCPeerConnection(turnConfig);
+ } catch (e) {
+ info(e);
+ exception = true;
+ }
+ is(exception, true, "Exception fired");
+ ok("Success");
+ SimpleTest.finish();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug822674.html b/dom/media/tests/mochitest/test_peerConnection_bug822674.html
new file mode 100644
index 000000000..b757ec7cd
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug822674.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "822674",
+ title: "RTCPeerConnection isn't a true javascript object as it should be"
+ });
+
+ runNetworkTest(function () {
+ var pc = new RTCPeerConnection();
+
+ pc.thereIsNeverGoingToBeAPropertyWithThisNameOnThisInterface = 1;
+ is(pc.thereIsNeverGoingToBeAPropertyWithThisNameOnThisInterface, 1,
+ "Can set expandos on an RTCPeerConnection");
+
+ pc = null;
+ networkTestFinished();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug825703.html b/dom/media/tests/mochitest/test_peerConnection_bug825703.html
new file mode 100644
index 000000000..c25079753
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug825703.html
@@ -0,0 +1,162 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "825703",
+ title: "RTCConfiguration valid/invalid permutations"
+ });
+
+// ^^^ Don't insert data above this line without adjusting line number below!
+var lineNumberAndFunction = {
+// <--- 16 is the line this must be.
+ line: 17, func: () => new RTCPeerConnection().onaddstream = () => {}
+};
+
+var makePC = (config, expected_error) => {
+ var exception;
+ try {
+ new RTCPeerConnection(config).close();
+ } catch (e) {
+ exception = e;
+ }
+ is((exception? exception.name : "success"), expected_error || "success",
+ "RTCPeerConnection(" + JSON.stringify(config) + ")");
+};
+
+// The order of properties in objects is not guaranteed in JavaScript, so this
+// transform produces json-comparable dictionaries. The resulting copy is only
+// meant to be used in comparisons (e.g. array-ness is not preserved).
+
+var toComparable = o =>
+ (typeof o != 'object' || !o)? o : Object.keys(o).sort().reduce((co, key) => {
+ co[key] = toComparable(o[key]);
+ return co;
+}, {});
+
+// This is a test of the iceServers parsing code + readable errors
+runNetworkTest(() => {
+ var exception = null;
+
+ try {
+ new RTCPeerConnection().close();
+ } catch (e) {
+ exception = e;
+ }
+ ok(!exception, "RTCPeerConnection() succeeds");
+ exception = null;
+
+ makePC();
+
+ makePC(1, "TypeError");
+
+ makePC({});
+
+ makePC({ iceServers: [] });
+
+ makePC({ iceServers: [{ urls:"" }] }, "SyntaxError");
+
+ makePC({ iceServers: [
+ { urls:"stun:127.0.0.1" },
+ { urls:"stun:localhost", foo:"" },
+ { urls: ["stun:127.0.0.1", "stun:localhost"] },
+ { urls:"stuns:localhost", foo:"" },
+ { urls:"turn:[::1]:3478", username:"p", credential:"p" },
+ { urls:"turn:[::1]:3478", username:"", credential:"" },
+ { urls:"turns:[::1]:3478", username:"", credential:"" },
+ { urls:"turn:localhost:3478?transport=udp", username:"p", credential:"p" },
+ { urls: ["turn:[::1]:3478", "turn:localhost"], username:"p", credential:"p" },
+ { urls:"turns:localhost:3478?transport=udp", username:"p", credential:"p" },
+ { url:"stun:localhost", foo:"" },
+ { url:"turn:localhost", username:"p", credential:"p" }
+ ]});
+
+ makePC({ iceServers: [{ urls: ["stun:127.0.0.1", ""] }] }, "SyntaxError");
+
+ makePC({ iceServers: [{ urls:"turns:localhost:3478", username:"p" }] }, "InvalidAccessError");
+
+ makePC({ iceServers: [{ url:"turns:localhost:3478", credential:"p" }] }, "InvalidAccessError");
+
+ makePC({ iceServers: [{ urls:"http:0.0.0.0" }] }, "SyntaxError");
+
+ try {
+ new RTCPeerConnection({ iceServers: [{ url:"http:0.0.0.0" }] }).close();
+ } catch (e) {
+ ok(e.message.indexOf("http") > 0,
+ "RTCPeerConnection() constructor has readable exceptions");
+ }
+
+ // Test getConfiguration
+ var config = {
+ bundlePolicy: "max-bundle",
+ iceTransportPolicy: "relay",
+ peerIdentity: null,
+ iceServers: [
+ { urls: ["stun:127.0.0.1", "stun:localhost"], credentialType:"password" },
+ { urls: ["turn:[::1]:3478"], username:"p", credential:"p", credentialType:"token" },
+ ],
+ };
+ var pc = new RTCPeerConnection(config);
+ is(JSON.stringify(toComparable(pc.getConfiguration())),
+ JSON.stringify(toComparable(config)), "getConfiguration");
+ pc.close();
+
+ var push = prefs => new Promise(resolve =>
+ SpecialPowers.pushPrefEnv(prefs, resolve));
+
+ Promise.resolve()
+ // This set of tests are setting the about:config User preferences for default
+ // ice servers and checking the outputs when RTCPeerConnection() is
+ // invoked. See Bug 1167922 for more information.
+ .then(() => push({ set: [['media.peerconnection.default_iceservers', ""]] })
+ .then(() => makePC())
+ .then(() => push({ set: [['media.peerconnection.default_iceservers', "k"]] }))
+ .then(() => makePC())
+ .then(() => push({ set: [['media.peerconnection.default_iceservers', "[{\"urls\": [\"stun:stun.services.mozilla.com\"]}]"]] }))
+ .then(() => makePC()))
+ // This set of tests check that warnings work. See Bug 1254839 for more.
+ .then(() => {
+ var consoleService = SpecialPowers.Cc["@mozilla.org/consoleservice;1"]
+ .getService(SpecialPowers.Ci.nsIConsoleService);
+ var warning = "";
+ var listener = SpecialPowers.wrapCallbackObject({
+ QueryInterface(iid) {
+ if (![SpecialPowers.Ci.nsIConsoleListener,
+ SpecialPowers.Ci.nsISupports].some(i => iid.equals(i))) {
+ throw SpecialPowers.Cr.NS_NOINTERFACE;
+ }
+ return this;
+ },
+
+ observe(msg) {
+ if (msg.message.includes("JavaScript Warning")) {
+ warning = msg.message;
+ }
+ }
+ });
+ consoleService.registerListener(listener);
+ lineNumberAndFunction.func();
+ // Console output is asynchronous, so we must queue a task.
+ return wait(0).then(() => {
+ is(warning.split('"')[1],
+ "onaddstream is deprecated! Use peerConnection.ontrack instead.",
+ "warning logged");
+ var remainder = warning.split('"').slice(2).join('"');
+ info(remainder);
+ ok(remainder.includes('file: "' + window.location + '"'),
+ "warning has this file");
+ ok(remainder.includes('line: ' + lineNumberAndFunction.line),
+ "warning has correct line number");
+ consoleService.unregisterListener(listener);
+ });
+ })
+ .then(networkTestFinished);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug827843.html b/dom/media/tests/mochitest/test_peerConnection_bug827843.html
new file mode 100644
index 000000000..01d566981
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug827843.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "827843",
+ title: "Ensure that localDescription and remoteDescription are null after close"
+ });
+
+var steps = [
+ function CHECK_SDP_ON_CLOSED_PC(test) {
+ var description;
+ var exception = null;
+
+ // handle the event which the close() triggers
+ var localClosed = new Promise(resolve => {
+ test.pcLocal.onsignalingstatechange = e => {
+ is(e.target.signalingState, "closed",
+ "Received expected onsignalingstatechange event on 'closed'");
+ resolve();
+ }
+ });
+
+ test.pcLocal.close();
+
+ try { description = test.pcLocal.localDescription; } catch (e) { exception = e; }
+ ok(exception, "Attempt to access localDescription of pcLocal after close throws exception");
+ exception = null;
+
+ try { description = test.pcLocal.remoteDescription; } catch (e) { exception = e; }
+ ok(exception, "Attempt to access remoteDescription of pcLocal after close throws exception");
+ exception = null;
+
+ // handle the event which the close() triggers
+ var remoteClosed = new Promise(resolve => {
+ test.pcRemote.onsignalingstatechange = e => {
+ is(e.target.signalingState, "closed",
+ "Received expected onsignalingstatechange event on 'closed'");
+ resolve();
+ }
+ });
+
+ test.pcRemote.close();
+
+ try { description = test.pcRemote.localDescription; } catch (e) { exception = e; }
+ ok(exception, "Attempt to access localDescription of pcRemote after close throws exception");
+ exception = null;
+
+ try { description = test.pcRemote.remoteDescription; } catch (e) { exception = e; }
+ ok(exception, "Attempt to access remoteDescription of pcRemote after close throws exception");
+
+ return Promise.all([localClosed, remoteClosed]);
+ }
+];
+
+var test;
+runNetworkTest(() => {
+ test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.append(steps);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug834153.html b/dom/media/tests/mochitest/test_peerConnection_bug834153.html
new file mode 100644
index 000000000..40c25eecf
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_bug834153.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "834153",
+ title: "Queue CreateAnswer in PeerConnection.js"
+ });
+
+ runNetworkTest(function () {
+ var pc1 = new RTCPeerConnection();
+ var pc2 = new RTCPeerConnection();
+
+ pc1.createOffer({ offerToReceiveAudio: true }).then(offer => {
+ // The whole point of this test is not to wait for the
+ // setRemoteDescription call to succesfully complete, so we
+ // don't wait for it to succeed.
+ pc2.setRemoteDescription(offer);
+ return pc2.createAnswer();
+ })
+ .then(answer => is(answer.type, "answer", "CreateAnswer created an answer"))
+ .catch(reason => ok(false, reason.message))
+ .then(() => {
+ pc1.close();
+ pc2.close();
+ networkTestFinished();
+ })
+ .catch(reason => ok(false, reason.message));
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_callbacks.html b/dom/media/tests/mochitest/test_peerConnection_callbacks.html
new file mode 100644
index 000000000..8bf4b106d
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_callbacks.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ title: "PeerConnection using callback functions",
+ bug: "1119593",
+ visible: true
+ });
+
+// This still aggressively uses promises, but it is testing that the callback functions
+// are properly in place.
+
+// wrapper that turns a callback-based function call into a promise
+function pcall(o, f, beforeArg) {
+ return new Promise((resolve, reject) => {
+ var args = [resolve, reject];
+ if (typeof beforeArg !== 'undefined') {
+ args.unshift(beforeArg);
+ }
+ info('Calling ' + f.name);
+ f.apply(o, args);
+ });
+}
+
+var pc1 = new RTCPeerConnection();
+var pc2 = new RTCPeerConnection();
+
+var pc2_haveRemoteOffer = new Promise(resolve => {
+ pc2.onsignalingstatechange =
+ e => (e.target.signalingState == "have-remote-offer") && resolve();
+});
+var pc1_stable = new Promise(resolve => {
+ pc1.onsignalingstatechange =
+ e => (e.target.signalingState == "stable") && resolve();
+});
+
+pc1.onicecandidate = e => {
+ pc2_haveRemoteOffer
+ .then(() => !e.candidate || pcall(pc2, pc2.addIceCandidate, e.candidate))
+ .catch(generateErrorCallback());
+};
+pc2.onicecandidate = e => {
+ pc1_stable
+ .then(() => !e.candidate || pcall(pc1, pc1.addIceCandidate, e.candidate))
+ .catch(generateErrorCallback());
+};
+
+var v1, v2;
+var delivered = new Promise(resolve => {
+ pc2.onaddstream = e => {
+ v2.mozSrcObject = e.stream;
+ resolve(e.stream);
+ };
+});
+
+runNetworkTest(function() {
+ v1 = createMediaElement('video', 'v1');
+ v2 = createMediaElement('video', 'v2');
+ var canPlayThrough = new Promise(resolve => v2.canplaythrough = resolve);
+ is(v2.currentTime, 0, "v2.currentTime is zero at outset");
+
+ // not testing legacy gUM here
+ navigator.mediaDevices.getUserMedia({ video: true, audio: true })
+ .then(stream => pc1.addStream(v1.mozSrcObject = stream))
+ .then(() => pcall(pc1, pc1.createOffer))
+ .then(offer => pcall(pc1, pc1.setLocalDescription, offer))
+ .then(() => pcall(pc2, pc2.setRemoteDescription, pc1.localDescription))
+ .then(() => pcall(pc2, pc2.createAnswer))
+ .then(answer => pcall(pc2, pc2.setLocalDescription, answer))
+ .then(() => pcall(pc1, pc1.setRemoteDescription, pc2.localDescription))
+ .then(() => delivered)
+ // .then(() => canPlayThrough) // why doesn't this fire?
+ .then(() => waitUntil(() => v2.currentTime > 0 && v2.mozSrcObject.currentTime > 0))
+ .then(() => ok(v2.currentTime > 0, "v2.currentTime is moving (" + v2.currentTime + ")"))
+ .then(() => ok(true, "Connected."))
+ .then(() => pcall(pc1, pc1.getStats, null))
+ .then(stats => ok(Object.keys(stats).length > 0, "pc1 has stats"))
+ .then(() => pcall(pc2, pc2.getStats, null))
+ .then(stats => ok(Object.keys(stats).length > 0, "pc2 has stats"))
+ .then(() => { v1.pause(); v2.pause(); })
+ .catch(reason => ok(false, "unexpected failure: " + reason))
+ .then(networkTestFinished);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html b/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html
new file mode 100644
index 000000000..97010929a
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1032848",
+ title: "Canvas(2D)::CaptureStream as video-only input to peerconnection",
+ visible: true
+});
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ var mediaElement;
+ var h = new CaptureStreamTestHelper2D();
+ var canvas = document.createElement('canvas');
+ var stream;
+ canvas.id = 'source_canvas';
+ canvas.width = canvas.height = 10;
+ document.getElementById('content').appendChild(canvas);
+
+ test.setMediaConstraints([{video: true}], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_DRAW_INITIAL_LOCAL_GREEN(test) {
+ h.drawColor(canvas, h.green);
+ },
+ function PC_LOCAL_CANVAS_CAPTURESTREAM(test) {
+ stream = canvas.captureStream(0);
+ test.pcLocal.attachLocalStream(stream);
+ }
+ ]);
+ test.chain.append([
+ function PC_REMOTE_WAIT_FOR_REMOTE_GREEN() {
+ mediaElement = test.pcRemote.remoteMediaElements[0];
+ ok(!!mediaElement, "Should have remote video element for pcRemote");
+ return h.waitForPixelColor(mediaElement, h.green, 128,
+ "pcRemote's remote should become green");
+ },
+ function PC_LOCAL_DRAW_LOCAL_RED() {
+ // After requesting a frame it will be captured at the time of next render.
+ // Next render will happen at next stable state, at the earliest,
+ // i.e., this order of `requestFrame(); draw();` should work.
+ stream.requestFrame();
+ h.drawColor(canvas, h.red);
+ },
+ function PC_REMOTE_WAIT_FOR_REMOTE_RED() {
+ return h.waitForPixelColor(mediaElement, h.red, 128,
+ "pcRemote's remote should become red");
+ }
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html b/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html
new file mode 100644
index 000000000..d0ebee6ad
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/webgl-mochitest/webgl-util.js"></script>
+</head>
+<body>
+<pre id="test">
+<script id="v-shader" type="x-shader/x-vertex">
+ attribute vec2 aPosition;
+ void main() {
+ gl_Position = vec4(aPosition, 0, 1);
+}
+</script>
+<script id="f-shader" type="x-shader/x-fragment">
+ precision mediump float;
+ uniform vec4 uColor;
+ void main() { gl_FragColor = uColor; }
+</script>
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1032848",
+ title: "Canvas(WebGL)::CaptureStream as video-only input to peerconnection"
+});
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ var vremote;
+ var h = new CaptureStreamTestHelperWebGL();
+ var canvas = document.createElement('canvas');
+ canvas.id = 'source_canvas';
+ canvas.width = canvas.height = 10;
+ canvas.style.display = 'none';
+ document.getElementById('content').appendChild(canvas);
+
+ var gl = WebGLUtil.getWebGL(canvas.id, false);
+ if (!gl) {
+ todo(false, "WebGL unavailable.");
+ networkTestFinished();
+ return;
+ }
+
+ var errorFunc = str => ok(false, 'Error: ' + str);
+ WebGLUtil.setErrorFunc(errorFunc);
+ WebGLUtil.setWarningFunc(errorFunc);
+
+ test.setMediaConstraints([{video: true}], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function WEBGL_SETUP(test) {
+ var program = WebGLUtil.createProgramByIds(gl, 'v-shader', 'f-shader');
+
+ if (!program) {
+ ok(false, "Program should link");
+ return Promise.reject();
+ }
+ gl.useProgram(program);
+
+ var uColorLocation = gl.getUniformLocation(program, "uColor");
+ h.setFragmentColorLocation(uColorLocation);
+
+ var squareBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, squareBuffer);
+
+ var vertices = [ 0, 0,
+ -1, 0,
+ 0, 1,
+ -1, 1 ];
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
+ squareBuffer.itemSize = 2;
+ squareBuffer.numItems = 4;
+
+ program.aPosition = gl.getAttribLocation(program, "aPosition");
+ gl.enableVertexAttribArray(program.aPosition);
+ gl.vertexAttribPointer(program.aPosition, squareBuffer.itemSize, gl.FLOAT, false, 0, 0);
+ },
+ function DRAW_LOCAL_GREEN(test) {
+ h.drawColor(canvas, h.green);
+ },
+ function PC_LOCAL_CANVAS_CAPTURESTREAM(test) {
+ test.pcLocal.canvasStream = canvas.captureStream(0.0);
+ is(test.pcLocal.canvasStream.canvas, canvas, "Canvas attribute is correct");
+ test.pcLocal.attachLocalStream(test.pcLocal.canvasStream);
+ }
+ ]);
+ test.chain.append([
+ function FIND_REMOTE_VIDEO() {
+ vremote = test.pcRemote.remoteMediaElements[0];
+ ok(!!vremote, "Should have remote video element for pcRemote");
+ },
+ function WAIT_FOR_REMOTE_GREEN() {
+ return h.waitForPixelColor(vremote, h.green, 128,
+ "pcRemote's remote should become green");
+ },
+ function REQUEST_FRAME(test) {
+ // After requesting a frame it will be captured at the time of next render.
+ // Next render will happen at next stable state, at the earliest,
+ // i.e., this order of `requestFrame(); draw();` should work.
+ test.pcLocal.canvasStream.requestFrame();
+ },
+ function DRAW_LOCAL_RED() {
+ h.drawColor(canvas, h.red);
+ },
+ function WAIT_FOR_REMOTE_RED() {
+ return h.waitForPixelColor(vremote, h.red, 128,
+ "pcRemote's remote should become red");
+ }
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_capturedVideo.html b/dom/media/tests/mochitest/test_peerConnection_capturedVideo.html
new file mode 100644
index 000000000..27bcc9a52
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_capturedVideo.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="text/javascript" src="../../test/manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+var manager = new MediaTestManager;
+
+createHTML({
+ bug: "1081409",
+ title: "Captured video-only over peer connection",
+ visible: true
+}).then(() => new Promise(resolve => {
+ manager.runTests(getPlayableVideos(gLongerTests), startTest);
+ manager.onFinished = () => {
+ // Tear down before SimpleTest.finish.
+ if ("nsINetworkInterfaceListService" in SpecialPowers.Ci) {
+ getNetworkUtils().tearDownNetwork();
+ }
+ resolve();
+ };
+}))
+.catch(e => ok(false, "Unexpected " + e + ":\n" + e.stack));
+
+// Run tests in sequence for log readability.
+PARALLEL_TESTS = 1;
+
+function startTest(media, token) {
+ manager.started(token);
+ var video = document.createElement('video');
+ video.id = "id_" + media.name;
+ video.width = 160;
+ video.height = 120;
+ video.muted = true;
+ video.loop = true;
+ video.preload = "metadata";
+ video.src = "../../test/" + media.name;
+
+ document.getElementById("content").appendChild(video);
+
+ var test;
+ new Promise((resolve, reject) => {
+ video.onloadedmetadata = resolve;
+ video.onerror = () => reject(video.error);
+ })
+ .then(() => {
+ video.onerror = () => ok(false, media.name + " failed in playback (code=" +
+ video.error.code + "). Stream should be OK. " +
+ "Continuing test.");
+ return runNetworkTest(() => {
+ var stream = video.mozCaptureStream();
+ test = new PeerConnectionTest({ config_local: { label_suffix: media.name },
+ config_remote: { label_suffix: media.name } });
+ test.setOfferOptions({ offerToReceiveVideo: false,
+ offerToReceiveAudio: false });
+ var hasVideo = stream.getVideoTracks().length > 0;
+ var hasAudio = stream.getAudioTracks().length > 0;
+ test.setMediaConstraints([{ video: hasVideo, audio: hasAudio }], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_CAPTUREVIDEO(test) {
+ test.pcLocal.attachLocalStream(stream);
+ video.play();
+ }
+ ]);
+ return test.chain.execute();
+ });
+ })
+ // Handle both MediaErrors (with the `code` attribute) and other errors.
+ .catch(e => ok(false, "Error (" + e + ")" +
+ (e.code ? " (code=" + e.code + ")" : "") +
+ " in test for " + media.name +
+ (e.stack ? ":\n" + e.stack : "")))
+ .then(() => test && test.close())
+ .then(() => {
+ removeNodeAndSource(video);
+ manager.finished(token);
+ })
+ .catch(e => ok(false, "Error (" + e + ") during shutdown."));
+};
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_certificates.html b/dom/media/tests/mochitest/test_peerConnection_certificates.html
new file mode 100644
index 000000000..6582446bf
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_certificates.html
@@ -0,0 +1,180 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1172785",
+ title: "Certificate management"
+ });
+
+ function badCertificate(config, expectedError, message) {
+ return RTCPeerConnection.generateCertificate(config)
+ .then(() => ok(false, message),
+ e => is(e.name, expectedError, message));
+ }
+
+ // Checks a handful of obviously bad options to RTCCertificate.create(). Most
+ // of the checking is done by the WebCrypto code underpinning this, hence the
+ // baffling error codes, but a sanity check is still in order.
+ function checkBadParameters() {
+ return Promise.all([
+ badCertificate({
+ name: "RSASSA-PKCS1-v1_5",
+ hash: "SHA-256",
+ modulusLength: 1023,
+ publicExponent: new Uint8Array([1, 0, 1])
+ }, "NotSupportedError", "1023-bit is too small to succeed"),
+
+ badCertificate({
+ name: "RSASSA-PKCS1-v1_5",
+ hash: "SHA-384",
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1])
+ }, "NotSupportedError", "SHA-384 isn't supported yet"),
+
+ badCertificate({
+ name: "ECDH",
+ namedCurve: "P-256"
+ }, "DataError", "otherwise valid ECDH config is rejected"),
+
+ badCertificate({
+ name: "not a valid algorithm"
+ }, "SyntaxError", "not a valid algorithm"),
+
+ badCertificate("ECDSA", "SyntaxError", "a bare name is not enough"),
+
+ badCertificate({
+ name: "ECDSA",
+ namedCurve: "not a curve"
+ }, "NotSupportedError", "ECDSA with an unknown curve")
+ ]);
+ }
+
+ function createDB() {
+ var openDB = indexedDB.open("genericstore");
+ openDB.onupgradeneeded = e => {
+ var db = e.target.result;
+ db.createObjectStore("data");
+ };
+ return new Promise(resolve => {
+ openDB.onsuccess = e => resolve(e.target.result);
+ });
+ }
+
+ function resultPromise(tx, op) {
+ return new Promise((resolve, reject) => {
+ op.onsuccess = e => resolve(e.target.result);
+ op.onerror = () => reject(op.error);
+ tx.onabort = () => reject(tx.error);
+ });
+ }
+
+ function store(db, value) {
+ var tx = db.transaction("data", "readwrite");
+ var store = tx.objectStore("data");
+ return resultPromise(tx, store.put(value, "value"));
+ }
+
+ function retrieve(db) {
+ var tx = db.transaction("data", "readonly");
+ var store = tx.objectStore("data");
+ return resultPromise(tx, store.get("value"));
+ }
+
+ // Creates a database, stores a value, retrieves it.
+ function storeAndRetrieve(value) {
+ return createDB().then(db => {
+ return store(db, value)
+ .then(() => retrieve(db))
+ .then(retrieved => {
+ db.close();
+ return retrieved;
+ });
+ });
+ }
+
+ var test;
+ runNetworkTest(function (options) {
+ var expiredCert;
+ return Promise.resolve()
+ .then(() => RTCPeerConnection.generateCertificate({
+ name: "ECDSA",
+ namedCurve: "P-256",
+ expires: 1 // smallest possible expiration window
+ }))
+ .then(cert => {
+ ok(!isNaN(cert.expires), 'cert has expiration time');
+ info('Expires at ' + new Date(cert.expires));
+ expiredCert = cert;
+ })
+
+ .then(() => checkBadParameters())
+
+ .then(() => {
+ var delay = expiredCert.expires - Date.now();
+ // Hopefully this delay is never needed.
+ if (delay > 0) {
+ return new Promise(r => setTimeout(r, delay));
+ }
+ })
+ .then(() => {
+ ok(expiredCert.expires <= Date.now(), 'Cert should be at or past expiration');
+ try {
+ new RTCPeerConnection({ certificates: [expiredCert] });
+ ok(false, 'Constructing peer connection with an expired cert is not allowed');
+ } catch(e) {
+ is(e.name, 'InvalidParameterError',
+ 'Constructing peer connection with an expired certs is not allowed');
+ }
+ })
+
+ .then(() => Promise.all([
+ RTCPeerConnection.generateCertificate({
+ name: "ECDSA",
+ namedCurve: "P-256"
+ }),
+ RTCPeerConnection.generateCertificate({
+ name: "RSASSA-PKCS1-v1_5",
+ hash: "SHA-256",
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1])
+ })
+ ]))
+
+ // A round trip through indexedDB should not do anything.
+ .then(storeAndRetrieve)
+ .then(certs => {
+ try {
+ new RTCPeerConnection({ certificates: certs });
+ ok(false, 'Constructing peer connection with multiple certs is not allowed');
+ } catch(e) {
+ is(e.name, 'NotSupportedError',
+ 'Constructing peer connection with multiple certs is not allowed');
+ }
+ return certs;
+ })
+ .then(certs => {
+ test = new PeerConnectionTest({
+ config_local: {
+ certificates: [certs[0]]
+ },
+ config_remote: {
+ certificates: [certs[1]]
+ }
+ });
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ return test.run();
+ })
+ .catch(e => {
+ console.log('test failure', e);
+ ok(false, 'test failed: ' + e);
+ });
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_close.html b/dom/media/tests/mochitest/test_peerConnection_close.html
new file mode 100644
index 000000000..54cae5637
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_close.html
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "991877",
+ title: "Basic RTCPeerConnection.close() tests"
+ });
+
+ runNetworkTest(function () {
+ var pc = new RTCPeerConnection();
+ var exception = null;
+ var eTimeout = null;
+
+ // everything should be in initial state
+ is(pc.signalingState, "stable", "Initial signalingState is 'stable'");
+ is(pc.iceConnectionState, "new", "Initial iceConnectionState is 'new'");
+ is(pc.iceGatheringState, "new", "Initial iceGatheringState is 'new'");
+
+ var finish;
+ var finished = new Promise(resolve => finish = resolve);
+
+ pc.onsignalingstatechange = function(e) {
+ clearTimeout(eTimeout);
+ is(pc.signalingState, "closed", "signalingState is 'closed'");
+ is(pc.iceConnectionState, "closed", "iceConnectionState is 'closed'");
+
+ // test that pc is really closed (and doesn't crash, bug 1259728)
+ try {
+ pc.getLocalStreams();
+ } catch (e) {
+ exception = e;
+ }
+ is(exception && exception.name, "InvalidStateError",
+ "pc.getLocalStreams should throw when closed");
+ exception = null;
+
+ try {
+ pc.close();
+ } catch (e) {
+ exception = e;
+ }
+ is(exception, null, "A second close() should not raise an exception");
+ is(pc.signalingState, "closed", "Final signalingState stays at 'closed'");
+ is(pc.iceConnectionState, "closed", "Final iceConnectionState stays at 'closed'");
+
+ // Due to a limitation in our WebIDL compiler that prevents overloads with
+ // both Promise and non-Promise return types, legacy APIs with callbacks
+ // are unable to continue to throw exceptions. Luckily the spec uses
+ // exceptions solely for "programming errors" so this should not hinder
+ // working code from working, which is the point of the legacy API. All
+ // new code should use the promise API.
+ //
+ // The legacy methods that no longer throw on programming errors like
+ // "invalid-on-close" are:
+ // - createOffer
+ // - createAnswer
+ // - setLocalDescription
+ // - setRemoteDescription
+ // - addIceCandidate
+ // - getStats
+ //
+ // These legacy methods fire the error callback instead. This is not
+ // entirely to spec but is better than ignoring programming errors.
+
+ var offer = new RTCSessionDescription({ sdp: "sdp", type: "offer" });
+ var answer = new RTCSessionDescription({ sdp: "sdp", type: "answer" });
+ var candidate = new RTCIceCandidate({ candidate: "dummy",
+ sdpMid: "test",
+ sdpMLineIndex: 3 });
+
+ var doesFail = (p, msg) => p.then(generateErrorCallback(),
+ r => is(r.name, "InvalidStateError", msg));
+
+ doesFail(pc.createOffer(), "createOffer fails on close")
+ .then(() => doesFail(pc.createAnswer(), "createAnswer fails on close"))
+ .then(() => doesFail(pc.setLocalDescription(offer),
+ "setLocalDescription fails on close"))
+ .then(() => doesFail(pc.setRemoteDescription(answer),
+ "setRemoteDescription fails on close"))
+ .then(() => doesFail(pc.addIceCandidate(candidate),
+ "addIceCandidate fails on close"))
+ .then(() => doesFail(new Promise((y, n) => pc.createOffer(y, n)),
+ "Legacy createOffer fails on close"))
+ .then(() => doesFail(new Promise((y, n) => pc.createAnswer(y, n)),
+ "Legacy createAnswer fails on close"))
+ .then(() => doesFail(new Promise((y, n) => pc.setLocalDescription(offer, y, n)),
+ "Legacy setLocalDescription fails on close"))
+ .then(() => doesFail(new Promise((y, n) => pc.setRemoteDescription(answer, y, n)),
+ "Legacy setRemoteDescription fails on close"))
+ .then(() => doesFail(new Promise((y, n) => pc.addIceCandidate(candidate, y, n)),
+ "Legacy addIceCandidate fails on close"))
+ .catch(reason => ok(false, "unexpected failure: " + reason))
+ .then(finish);
+
+ // Other methods are unaffected.
+
+ SimpleTest.doesThrow(function() {
+ pc.updateIce("Invalid RTC Configuration")},
+ "updateIce() on closed PC raised expected exception");
+
+ SimpleTest.doesThrow(function() {
+ pc.addStream("Invalid Media Stream")},
+ "addStream() on closed PC raised expected exception");
+
+ SimpleTest.doesThrow(function() {
+ pc.createDataChannel({})},
+ "createDataChannel() on closed PC raised expected exception");
+
+ SimpleTest.doesThrow(function() {
+ pc.setIdentityProvider("Invalid Provider")},
+ "setIdentityProvider() on closed PC raised expected exception");
+ };
+
+ // This prevents a mochitest timeout in case the event does not fire
+ eTimeout = setTimeout(function() {
+ ok(false, "Failed to receive expected onsignalingstatechange event in 60s");
+ finish();
+ }, 60000);
+
+ var mustNotSettle = (p, ms, msg) => Promise.race([
+ p.then(() => ok(false, msg + " must not settle"),
+ e => ok(false, msg + " must not settle. Got " + e.name)),
+ wait(ms).then(() => ok(true, msg + " must not settle"))
+ ]);
+
+ var silence = mustNotSettle(pc.createOffer(), 1000,
+ "createOffer immediately followed by close");
+ try {
+ pc.close();
+ } catch (e) {
+ exception = e;
+ }
+ is(exception, null, "closing the connection raises no exception");
+ is(pc.signalingState, "closed", "Final signalingState is 'closed'");
+ is(pc.iceConnectionState, "closed", "Final iceConnectionState is 'closed'");
+
+ Promise.all([finished, silence]).then(networkTestFinished);
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html b/dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html
new file mode 100644
index 000000000..eb8228d03
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1087629",
+ title: "Close PCs during ICE connectivity check"
+ });
+
+// Test closeDuringIce to simulate problems during peer connections
+
+
+function PC_LOCAL_SETUP_NULL_ICE_HANDLER(test) {
+ test.pcLocal.setupIceCandidateHandler(test, function() {}, function () {});
+}
+function PC_REMOTE_SETUP_NULL_ICE_HANDLER(test) {
+ test.pcRemote.setupIceCandidateHandler(test, function() {}, function () {});
+}
+function PC_REMOTE_ADD_FAKE_ICE_CANDIDATE(test) {
+ var cand = new RTCIceCandidate({"candidate":"candidate:0 1 UDP 2130379007 192.0.2.1 12345 typ host","sdpMid":"","sdpMLineIndex":0});
+ test.pcRemote.storeOrAddIceCandidate(cand);
+ info(test.pcRemote + " Stored fake candidate: " + JSON.stringify(cand));
+}
+function PC_LOCAL_ADD_FAKE_ICE_CANDIDATE(test) {
+ var cand = new RTCIceCandidate({"candidate":"candidate:0 1 UDP 2130379007 192.0.2.2 56789 typ host","sdpMid":"","sdpMLineIndex":0});
+ test.pcLocal.storeOrAddIceCandidate(cand);
+ info(test.pcLocal + " Stored fake candidate: " + JSON.stringify(cand));
+}
+function PC_LOCAL_CLOSE_DURING_ICE(test) {
+ return test.pcLocal.iceChecking.then(() => {
+ test.pcLocal.onsignalingstatechange = function () {};
+ test.pcLocal.close();
+ });
+}
+function PC_REMOTE_CLOSE_DURING_ICE(test) {
+ return test.pcRemote.iceChecking.then(() => {
+ test.pcRemote.onsignalingstatechange = function () {};
+ test.pcRemote.close();
+ });
+}
+function PC_LOCAL_WAIT_FOR_ICE_CHECKING(test) {
+ var resolveIceChecking;
+ test.pcLocal.iceChecking = new Promise(r => resolveIceChecking = r);
+ test.pcLocal.ice_connection_callbacks.checkIceStatus = () => {
+ if (test.pcLocal._pc.iceConnectionState === "checking") {
+ resolveIceChecking();
+ }
+ }
+}
+function PC_REMOTE_WAIT_FOR_ICE_CHECKING(test) {
+ var resolveIceChecking;
+ test.pcRemote.iceChecking = new Promise(r => resolveIceChecking = r);
+ test.pcRemote.ice_connection_callbacks.checkIceStatus = () => {
+ if (test.pcRemote._pc.iceConnectionState === "checking") {
+ resolveIceChecking();
+ }
+ }
+}
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.replace("PC_LOCAL_SETUP_ICE_HANDLER", PC_LOCAL_SETUP_NULL_ICE_HANDLER);
+ test.chain.replace("PC_REMOTE_SETUP_ICE_HANDLER", PC_REMOTE_SETUP_NULL_ICE_HANDLER);
+ test.chain.insertAfter("PC_REMOTE_SETUP_NULL_ICE_HANDLER", PC_LOCAL_WAIT_FOR_ICE_CHECKING);
+ test.chain.insertAfter("PC_LOCAL_WAIT_FOR_ICE_CHECKING", PC_REMOTE_WAIT_FOR_ICE_CHECKING);
+ test.chain.removeAfter("PC_LOCAL_SET_REMOTE_DESCRIPTION");
+ test.chain.append([PC_REMOTE_ADD_FAKE_ICE_CANDIDATE, PC_LOCAL_ADD_FAKE_ICE_CANDIDATE,
+ PC_LOCAL_CLOSE_DURING_ICE, PC_REMOTE_CLOSE_DURING_ICE]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_constructedStream.html b/dom/media/tests/mochitest/test_peerConnection_constructedStream.html
new file mode 100644
index 000000000..36df228ee
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_constructedStream.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1271669",
+ title: "Test that pc.addTrack() accepts any MediaStream",
+ visible: true
+});
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ var constructedStream;
+ var dummyStream = new MediaStream();
+ var dummyStreamTracks = [];
+
+ test.setMediaConstraints([ {audio: true, video: true}
+ , {audio: true}
+ , {video: true}
+ ], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_GUM_CONSTRUCTED_STREAM(test) {
+ return getUserMedia(test.pcLocal.constraints[0]).then(stream => {
+ constructedStream = new MediaStream(stream.getTracks());
+ test.pcLocal.attachLocalStream(constructedStream);
+ });
+ },
+ function PC_LOCAL_GUM_DUMMY_STREAM(test) {
+ return getUserMedia(test.pcLocal.constraints[1])
+ .then(stream => dummyStreamTracks.push(...stream.getTracks()))
+ .then(() => getUserMedia(test.pcLocal.constraints[2]))
+ .then(stream => dummyStreamTracks.push(...stream.getTracks()))
+ .then(() => dummyStreamTracks.forEach(t =>
+ test.pcLocal.attachLocalTrack(t, dummyStream)));
+ },
+ ]);
+
+ let checkSentTracksReceived = (sentStreamId, sentTracks) => {
+ let receivedStream =
+ test.pcRemote._pc.getRemoteStreams().find(s => s.id == sentStreamId);
+ ok(receivedStream, "We should receive a stream with with the sent stream's id (" + sentStreamId + ")");
+ if (!receivedStream) {
+ return;
+ }
+
+ is(receivedStream.getTracks().length, sentTracks.length,
+ "Should receive same number of tracks as were sent");
+ sentTracks.forEach(t =>
+ ok(receivedStream.getTracks().find(t2 => t.id == t2.id),
+ "The sent track (" + t.id + ") should exist on the receive side"));
+ };
+
+ test.chain.append([
+ function PC_REMOTE_CHECK_RECEIVED_CONSTRUCTED_STREAM() {
+ checkSentTracksReceived(constructedStream.id, constructedStream.getTracks());
+ },
+ function PC_REMOTE_CHECK_RECEIVED_DUMMY_STREAM() {
+ checkSentTracksReceived(dummyStream.id, dummyStreamTracks);
+ },
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_errorCallbacks.html b/dom/media/tests/mochitest/test_peerConnection_errorCallbacks.html
new file mode 100644
index 000000000..6d152a4fa
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_errorCallbacks.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "834270",
+ title: "Align PeerConnection error handling with WebRTC specification"
+ });
+
+ function validateReason(reason) {
+ ok(reason.name.length, "Reason name = " + reason.name);
+ ok(reason.message.length, "Reason message = " + reason.message);
+ };
+
+ function testCreateAnswerError() {
+ var pc = new RTCPeerConnection();
+ info ("Testing createAnswer error");
+ return pc.createAnswer()
+ .then(generateErrorCallback("createAnswer before offer should fail"),
+ validateReason);
+ };
+
+ function testSetLocalDescriptionError() {
+ var pc = new RTCPeerConnection();
+ info ("Testing setLocalDescription error");
+ return pc.setLocalDescription(new RTCSessionDescription({ sdp: "Picklechips!",
+ type: "offer" }))
+ .then(generateErrorCallback("setLocalDescription with nonsense SDP should fail"),
+ validateReason);
+ };
+
+ function testSetRemoteDescriptionError() {
+ var pc = new RTCPeerConnection();
+ info ("Testing setRemoteDescription error");
+ return pc.setRemoteDescription(new RTCSessionDescription({ sdp: "Who?",
+ type: "offer" }))
+ .then(generateErrorCallback("setRemoteDescription with nonsense SDP should fail"),
+ validateReason);
+ };
+
+ // No test for createOffer errors -- there's nothing we can do at this
+ // level to evoke an error in createOffer.
+
+ runNetworkTest(function () {
+ testCreateAnswerError()
+ .then(testSetLocalDescriptionError)
+ .then(testSetRemoteDescriptionError)
+ .catch(reason => ok(false, "unexpected error: " + reason))
+ .then(networkTestFinished);
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html b/dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html
new file mode 100644
index 000000000..5d1253808
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "931903",
+ title: "Forwarding a stream from a combined audio/video peerconnection to another"
+ });
+
+runNetworkTest(function() {
+ var gumTest = new PeerConnectionTest();
+
+ var forwardingOptions = { config_local: { label_suffix: "forwarded" },
+ config_remote: { label_suffix: "forwarded" } };
+ var forwardingTest = new PeerConnectionTest(forwardingOptions);
+
+ gumTest.setMediaConstraints([{audio: true, video: true}], []);
+ forwardingTest.setMediaConstraints([{audio: true, video: true}], []);
+ forwardingTest.chain.replace("PC_LOCAL_GUM", [
+ function PC_FORWARDING_CAPTUREVIDEO(test) {
+ var streams = gumTest.pcRemote._pc.getRemoteStreams();
+ is(streams.length, 1, "One stream to forward");
+ is(streams[0].getTracks().length, 2, "Forwarded stream has 2 tracks");
+ forwardingTest.pcLocal.attachLocalStream(streams[0]);
+ return Promise.resolve();
+ }
+ ]);
+ gumTest.chain.removeAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW");
+ gumTest.chain.execute()
+ .then(() => forwardingTest.chain.execute())
+ .then(() => gumTest.close())
+ .then(() => forwardingTest.close())
+ .then(() => networkTestFinished());
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_iceFailure.html b/dom/media/tests/mochitest/test_peerConnection_iceFailure.html
new file mode 100644
index 000000000..cbdfd018a
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_iceFailure.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1087629",
+ title: "Wait for ICE failure"
+ });
+
+// Test iceFailure
+
+function PC_LOCAL_SETUP_NULL_ICE_HANDLER(test) {
+ test.pcLocal.setupIceCandidateHandler(test, function() {}, function () {});
+}
+function PC_REMOTE_SETUP_NULL_ICE_HANDLER(test) {
+ test.pcRemote.setupIceCandidateHandler(test, function() {}, function () {});
+}
+function PC_REMOTE_ADD_FAKE_ICE_CANDIDATE(test) {
+ var cand = new RTCIceCandidate({"candidate":"candidate:0 1 UDP 2130379007 192.0.2.1 12345 typ host","sdpMid":"","sdpMLineIndex":0});
+ test.pcRemote.storeOrAddIceCandidate(cand);
+ info(test.pcRemote + " Stored fake candidate: " + JSON.stringify(cand));
+}
+function PC_LOCAL_ADD_FAKE_ICE_CANDIDATE(test) {
+ var cand = new RTCIceCandidate({"candidate":"candidate:0 1 UDP 2130379007 192.0.2.2 56789 typ host","sdpMid":"","sdpMLineIndex":0});
+ test.pcLocal.storeOrAddIceCandidate(cand);
+ info(test.pcLocal + " Stored fake candidate: " + JSON.stringify(cand));
+}
+function PC_LOCAL_WAIT_FOR_ICE_FAILURE(test) {
+ return test.pcLocal.iceFailed.then(() => {
+ ok(true, this.pcLocal + " Ice Failure Reached.");
+ });
+}
+function PC_REMOTE_WAIT_FOR_ICE_FAILURE(test) {
+ return test.pcRemote.iceFailed.then(() => {
+ ok(true, this.pcRemote + " Ice Failure Reached.");
+ });
+}
+function PC_LOCAL_WAIT_FOR_ICE_FAILED(test) {
+ var resolveIceFailed;
+ test.pcLocal.iceFailed = new Promise(r => resolveIceFailed = r);
+ test.pcLocal.ice_connection_callbacks.checkIceStatus = () => {
+ if (test.pcLocal._pc.iceConnectionState === "failed") {
+ resolveIceFailed();
+ }
+ }
+}
+function PC_REMOTE_WAIT_FOR_ICE_FAILED(test) {
+ var resolveIceFailed;
+ test.pcRemote.iceFailed = new Promise(r => resolveIceFailed = r);
+ test.pcRemote.ice_connection_callbacks.checkIceStatus = () => {
+ if (test.pcRemote._pc.iceConnectionState === "failed") {
+ resolveIceFailed();
+ }
+ }
+}
+
+runNetworkTest(() => {
+ SpecialPowers.pushPrefEnv({
+ 'set': [
+ ['media.peerconnection.ice.stun_client_maximum_transmits', 3],
+ ['media.peerconnection.ice.trickle_grace_period', 3000],
+ ]
+ }, function() {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.replace("PC_LOCAL_SETUP_ICE_HANDLER", PC_LOCAL_SETUP_NULL_ICE_HANDLER);
+ test.chain.replace("PC_REMOTE_SETUP_ICE_HANDLER", PC_REMOTE_SETUP_NULL_ICE_HANDLER);
+ test.chain.insertAfter("PC_REMOTE_SETUP_NULL_ICE_HANDLER", PC_LOCAL_WAIT_FOR_ICE_FAILED);
+ test.chain.insertAfter("PC_LOCAL_WAIT_FOR_ICE_FAILED", PC_REMOTE_WAIT_FOR_ICE_FAILED);
+ test.chain.removeAfter("PC_LOCAL_SET_REMOTE_DESCRIPTION");
+ test.chain.append([PC_REMOTE_ADD_FAKE_ICE_CANDIDATE, PC_LOCAL_ADD_FAKE_ICE_CANDIDATE,
+ PC_LOCAL_WAIT_FOR_ICE_FAILURE, PC_REMOTE_WAIT_FOR_ICE_FAILURE]);
+ test.run();
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_insertDTMF.html b/dom/media/tests/mochitest/test_peerConnection_insertDTMF.html
new file mode 100644
index 000000000..0bfb4eef6
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_insertDTMF.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1291715",
+ title: "Test insertDTMF on sender",
+ visible: true
+});
+
+function insertdtmftest(pc) {
+ ok(pc.getSenders().length > 0, "have senders");
+ var sender = pc.getSenders()[0];
+ ok(sender.dtmf, "sender has dtmf object");
+
+ ok(sender.dtmf.toneBuffer === "", "sender should start with empty tonebuffer");
+
+ // These will trigger assertions on debug builds if we do not enforce the
+ // specified minimums and maximums for duration and interToneGap.
+ sender.dtmf.insertDTMF("A", 10);
+ sender.dtmf.insertDTMF("A", 10000);
+ sender.dtmf.insertDTMF("A", 70, 10);
+
+ var threw = false;
+ try {
+ sender.dtmf.insertDTMF("bad tones");
+ } catch (ex) {
+ threw = true;
+ is(ex.code, DOMException.INVALID_CHARACTER_ERR, "Expected InvalidCharacterError");
+ }
+ ok(threw, "Expected exception");
+
+ sender.dtmf.insertDTMF("A");
+ sender.dtmf.insertDTMF("B");
+ ok(sender.dtmf.toneBuffer.indexOf("A") == -1, "calling insertDTMF should replace current characters");
+
+ sender.dtmf.insertDTMF("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+ ok(sender.dtmf.toneBuffer.indexOf("A") != -1, "lowercase characters should be normalized");
+
+ pc.removeTrack(sender);
+ threw = false;
+ try {
+ sender.dtmf.insertDTMF("AAA");
+ } catch (ex) {
+ threw = true;
+ is(ex.code, DOMException.INVALID_STATE_ERR, "Expected InvalidStateError");
+ }
+ ok(threw, "Expected exception");
+}
+
+runNetworkTest(() => {
+ test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW");
+
+ // Test sender dtmf.
+ test.chain.append([
+ function PC_LOCAL_INSERT_DTMF(test) {
+ // We want to call removeTrack
+ test.pcLocal.expectNegotiationNeeded();
+ return insertdtmftest(test.pcLocal._pc);
+ }
+ ]);
+
+ var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+
+ return pushPrefs(['media.peerconnection.dtmf.enabled', true])
+ .then(() => { test.run() })
+ .catch(e => ok(false, "unexpected failure: " + e));
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html b/dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html
new file mode 100644
index 000000000..0b0b35fe8
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "952145",
+ title: "Rollback local reoffer"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain, [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}]);
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+
+ function PC_REMOTE_SETUP_ICE_HANDLER(test) {
+ test.pcRemote.setupIceCandidateHandler(test);
+ if (test.testOptions.steeplechase) {
+ test.pcRemote.endOfTrickleIce.then(() => {
+ send_message({"type": "end_of_trickle_ice"});
+ });
+ }
+ },
+
+ function PC_REMOTE_CREATE_AND_SET_OFFER(test) {
+ return test.createOffer(test.pcRemote).then(offer => {
+ return test.setLocalDescription(test.pcRemote, offer, HAVE_LOCAL_OFFER);
+ });
+ },
+
+ function PC_REMOTE_ROLLBACK(test) {
+ return test.setLocalDescription(
+ test.pcRemote,
+ new RTCSessionDescription({ type: "rollback", sdp: ""}),
+ STABLE);
+ },
+
+ // Rolling back should shut down gathering
+ function PC_REMOTE_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcRemote.endOfTrickleIce;
+ },
+ ]);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_localRollback.html b/dom/media/tests/mochitest/test_peerConnection_localRollback.html
new file mode 100644
index 000000000..2a35920ba
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_localRollback.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "952145",
+ title: "Rollback local offer"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.insertBefore('PC_LOCAL_CREATE_OFFER', [
+ function PC_REMOTE_CREATE_AND_SET_OFFER(test) {
+ return test.createOffer(test.pcRemote).then(offer => {
+ return test.setLocalDescription(test.pcRemote, offer, HAVE_LOCAL_OFFER);
+ });
+ },
+
+ function PC_REMOTE_ROLLBACK(test) {
+ return test.setLocalDescription(
+ test.pcRemote,
+ new RTCSessionDescription({ type: "rollback", sdp: ""}),
+ STABLE);
+ },
+
+ // Rolling back should shut down gathering
+ function PC_REMOTE_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcRemote.endOfTrickleIce;
+ },
+
+ function PC_REMOTE_SETUP_ICE_HANDLER(test) {
+ test.pcRemote.setupIceCandidateHandler(test);
+ if (test.testOptions.steeplechase) {
+ test.pcRemote.endOfTrickleIce.then(() => {
+ send_message({"type": "end_of_trickle_ice"});
+ });
+ }
+ },
+ ]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html b/dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html
new file mode 100644
index 000000000..557cdb791
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({
+ bug: "1166832",
+ title: "Canvas(2D)::Multiple CaptureStream as video-only input to peerconnection",
+ visible: true
+});
+
+/**
+ * Test to verify using multiple capture streams concurrently.
+ */
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ var h = new CaptureStreamTestHelper2D(50, 50);
+
+ var vremote1;
+ var stream1;
+ var canvas1 = h.createAndAppendElement('canvas', 'source_canvas1');
+
+ var vremote2;
+ var stream2;
+ var canvas2 = h.createAndAppendElement('canvas', 'source_canvas2');
+
+ test.setMediaConstraints([{video: true}, {video: true}], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function DRAW_INITIAL_LOCAL1_GREEN(test) {
+ h.drawColor(canvas1, h.green);
+ },
+ function DRAW_INITIAL_LOCAL2_BLUE(test) {
+ h.drawColor(canvas2, h.blue);
+ },
+ function PC_LOCAL_CANVAS_CAPTURESTREAM(test) {
+ stream1 = canvas1.captureStream(0); // fps = 0 to capture single frame
+ test.pcLocal.attachLocalStream(stream1);
+ stream2 = canvas2.captureStream(0); // fps = 0 to capture single frame
+ test.pcLocal.attachLocalStream(stream2);
+ }
+ ]);
+
+ test.chain.append([
+ function CHECK_REMOTE_VIDEO() {
+ is(test.pcRemote.remoteMediaElements.length, 2, "pcRemote Should have 2 remote media elements");
+ vremote1 = test.pcRemote.remoteMediaElements[0];
+ vremote2 = test.pcRemote.remoteMediaElements[1];
+
+ // since we don't know which remote video is created first, we don't know
+ // which should be blue or green, but this will make sure that one is
+ // green and one is blue
+ return Promise.race([
+ Promise.all([
+ h.waitForPixelColor(vremote1, h.green, 128,
+ "pcRemote's remote1 should become green"),
+ h.waitForPixelColor(vremote2, h.blue, 128,
+ "pcRemote's remote2 should become blue")
+ ]),
+ Promise.all([
+ h.waitForPixelColor(vremote2, h.green, 128,
+ "pcRemote's remote2 should become green"),
+ h.waitForPixelColor(vremote1, h.blue, 128,
+ "pcRemote's remote1 should become blue")
+ ])
+ ]);
+ },
+ function DRAW_LOCAL1_RED() {
+ // After requesting a frame it will be captured at the time of next render.
+ // Next render will happen at next stable state, at the earliest,
+ // i.e., this order of `requestFrame(); draw();` should work.
+ stream1.requestFrame();
+ h.drawColor(canvas1, h.red);
+ },
+ function DRAW_LOCAL2_RED() {
+ // After requesting a frame it will be captured at the time of next render.
+ // Next render will happen at next stable state, at the earliest,
+ // i.e., this order of `requestFrame(); draw();` should work.
+ stream2.requestFrame();
+ h.drawColor(canvas2, h.red);
+ },
+ function WAIT_FOR_REMOTE1_RED() {
+ return h.waitForPixelColor(vremote1, h.red, 128,
+ "pcRemote's remote1 should become red");
+ },
+ function WAIT_FOR_REMOTE2_RED() {
+ return h.waitForPixelColor(vremote2, h.red, 128,
+ "pcRemote's remote2 should become red");
+ }
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html b/dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html
new file mode 100644
index 000000000..88db25f39
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="nonTrickleIce.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1060102",
+ title: "Basic audio only SDP answer without trickle ICE"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ makeAnswererNonTrickle(test.chain);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html b/dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html
new file mode 100644
index 000000000..ac88277a2
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="nonTrickleIce.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1060102",
+ title: "Basic audio only SDP offer without trickle ICE"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ makeOffererNonTrickle(test.chain);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html b/dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html
new file mode 100644
index 000000000..9f8668eb6
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="nonTrickleIce.js"></script>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1060102",
+ title: "Basic audio only SDP offer and answer without trickle ICE"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ makeOffererNonTrickle(test.chain);
+ makeAnswererNonTrickle(test.chain);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html
new file mode 100644
index 000000000..c050c6198
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "850275",
+ title: "Simple offer media constraint test with audio"
+ });
+
+ runNetworkTest(function() {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([], [{audio: true}]);
+ test.setOfferOptions({ offerToReceiveAudio: true });
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html
new file mode 100644
index 000000000..975091679
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "850275",
+ title: "Simple offer media constraint test with video"
+ });
+
+ runNetworkTest(function() {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([], [{video: true}]);
+ test.setOfferOptions({ offerToReceiveVideo: true });
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html
new file mode 100644
index 000000000..ec8007971
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "850275",
+ title: "Simple offer media constraint test with video/audio"
+ });
+
+ runNetworkTest(function() {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([], [{audio: true, video: true}]);
+ test.setOfferOptions({ offerToReceiveVideo: true, offerToReceiveAudio: true });
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html b/dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html
new file mode 100644
index 000000000..61cecafb5
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1091898",
+ title: "PeerConnection with promises (sendonly)",
+ visible: true
+ });
+
+ var pc1 = new RTCPeerConnection();
+ var pc2 = new RTCPeerConnection();
+
+ var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
+ pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback());
+ pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback());
+
+ var v1, v2;
+ var delivered = new Promise(resolve => pc2.ontrack = e => {
+ // Test RTCTrackEvent here.
+ ok(e.streams.length > 0, "has streams");
+ ok(e.streams[0].getTrackById(e.track.id), "has track");
+ ok(pc2.getReceivers().some(receiver => receiver == e.receiver), "has receiver");
+ if (e.streams[0].getTracks().length == 2) {
+ // Test RTCTrackEvent required args here.
+ mustThrowWith("RTCTrackEvent wo/required args",
+ "TypeError", () => new RTCTrackEvent("track", {}));
+ v2.srcObject = e.streams[0];
+ resolve();
+ }
+ });
+
+ runNetworkTest(function() {
+ v1 = createMediaElement('video', 'v1');
+ v2 = createMediaElement('video', 'v2');
+ var canPlayThrough = new Promise(resolve => v2.canplaythrough = e => resolve());
+
+ is(v2.currentTime, 0, "v2.currentTime is zero at outset");
+
+ navigator.mediaDevices.getUserMedia({ video: true, audio: true })
+ .then(stream => (v1.srcObject = stream).getTracks().forEach(t => pc1.addTrack(t, stream)))
+ .then(() => pc1.createOffer({})) // check that createOffer accepts arg.
+ .then(offer => pc1.setLocalDescription(offer))
+ .then(() => pc2.setRemoteDescription(pc1.localDescription))
+ .then(() => pc2.createAnswer({})) // check that createAnswer accepts arg.
+ .then(answer => pc2.setLocalDescription(answer))
+ .then(() => pc1.setRemoteDescription(pc2.localDescription))
+ .then(() => delivered)
+// .then(() => canPlayThrough) // why doesn't this fire?
+ .then(() => waitUntil(() => v2.currentTime > 0 && v2.srcObject.currentTime > 0))
+ .then(() => ok(v2.currentTime > 0, "v2.currentTime is moving (" + v2.currentTime + ")"))
+ .then(() => ok(true, "Connected."))
+ .catch(reason => ok(false, "unexpected failure: " + reason))
+ .then(networkTestFinished);
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_relayOnly.html b/dom/media/tests/mochitest/test_peerConnection_relayOnly.html
new file mode 100644
index 000000000..49f4eca2b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_relayOnly.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+createHTML({
+ bug: "1187775",
+ title: "peer connection ICE fails on relay-only without TURN"
+});
+
+function PC_LOCAL_NO_CANDIDATES(test) {
+ var isnt = can => is(can, null, "No candidates: " + JSON.stringify(can));
+ test.pcLocal._pc.addEventListener("icecandidate", e => isnt(e.candidate));
+}
+
+function PC_BOTH_WAIT_FOR_ICE_FAILED(test) {
+ var isFail = (f, reason, msg) =>
+ f().then(() => { throw new Error(msg + " must fail"); },
+ e => is(e.message, reason, msg + " must fail with: " + e.message));
+
+ return Promise.all([
+ isFail(() => waitForIceConnected(test, test.pcLocal), "ICE failed", "Local ICE"),
+ isFail(() => waitForIceConnected(test, test.pcRemote), "ICE failed", "Remote ICE")
+ ])
+ .then(() => ok(true, "ICE on both sides must fail."));
+}
+
+var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+var test;
+
+runNetworkTest(options =>
+ pushPrefs(['media.peerconnection.ice.stun_client_maximum_transmits', 3],
+ ['media.peerconnection.ice.trickle_grace_period', 5000]).then(() => {
+ options = options || {};
+ options.config_local = options.config_local || {};
+ var servers = options.config_local.iceServers || [];
+ // remove any turn servers
+ options.config_local.iceServers = servers.filter(server =>
+ server.urls.every(u => !u.toLowerCase().startsWith('turn')));
+
+ // Here's the setting we're testing. Comment out and this test should fail:
+ options.config_local.iceTransportPolicy = "relay";
+
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.chain.remove("PC_LOCAL_SETUP_ICE_LOGGER"); // Needed to suppress failing
+ test.chain.remove("PC_REMOTE_SETUP_ICE_LOGGER"); // on ICE-failure.
+ test.chain.insertAfter("PC_LOCAL_SETUP_ICE_HANDLER", PC_LOCAL_NO_CANDIDATES);
+ test.chain.replace("PC_LOCAL_WAIT_FOR_ICE_CONNECTED", PC_BOTH_WAIT_FOR_ICE_FAILED);
+ test.chain.removeAfter("PC_BOTH_WAIT_FOR_ICE_FAILED");
+ test.run();
+}));
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html b/dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html
new file mode 100644
index 000000000..6b518e1d2
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "952145",
+ title: "Rollback remote reoffer"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}]);
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ ]
+ );
+ test.chain.replaceAfter('PC_REMOTE_SET_REMOTE_DESCRIPTION',
+ [
+ function PC_LOCAL_SETUP_ICE_HANDLER(test) {
+ test.pcLocal.setupIceCandidateHandler(test);
+ if (test.testOptions.steeplechase) {
+ test.pcLocal.endOfTrickleIce.then(() => {
+ send_message({"type": "end_of_trickle_ice"});
+ });
+ }
+ },
+
+ function PC_REMOTE_ROLLBACK(test) {
+ return test.setRemoteDescription(
+ test.pcRemote,
+ new RTCSessionDescription({ type: "rollback" }),
+ STABLE)
+ .then(() => test.pcRemote.rollbackRemoteTracksIfNotNegotiated());
+ },
+
+ function PC_LOCAL_ROLLBACK(test) {
+ // We haven't negotiated the new stream yet.
+ test.pcLocal.expectNegotiationNeeded();
+ return test.setLocalDescription(
+ test.pcLocal,
+ new RTCSessionDescription({ type: "rollback", sdp: ""}),
+ STABLE);
+ },
+
+ // Rolling back should shut down gathering
+ function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleIce;
+ },
+ ],
+ 1 // Second PC_REMOTE_SET_REMOTE_DESCRIPTION
+ );
+ test.chain.append(commandsPeerConnectionOfferAnswer);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/tests/mochitest/test_peerConnection_remoteRollback.html b/dom/media/tests/mochitest/test_peerConnection_remoteRollback.html
new file mode 100644
index 000000000..099628ab8
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_remoteRollback.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "952145",
+ title: "Rollback remote offer"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter('PC_REMOTE_CHECK_CAN_TRICKLE_SYNC');
+ test.chain.append([
+ function PC_REMOTE_ROLLBACK(test) {
+ // We still haven't negotiated the tracks
+ test.pcRemote.expectNegotiationNeeded();
+ return test.setRemoteDescription(
+ test.pcRemote,
+ new RTCSessionDescription({ type: "rollback" }),
+ STABLE)
+ .then(() => test.pcRemote.rollbackRemoteTracksIfNotNegotiated());
+ },
+
+ function PC_REMOTE_CHECK_CAN_TRICKLE_REVERT_SYNC(test) {
+ is(test.pcRemote._pc.canTrickleIceCandidates, null,
+ "Remote canTrickleIceCandidates is reverted to null");
+ },
+
+ function PC_LOCAL_ROLLBACK(test) {
+ // We still haven't negotiated the tracks
+ test.pcLocal.expectNegotiationNeeded();
+ return test.setLocalDescription(
+ test.pcLocal,
+ new RTCSessionDescription({ type: "rollback", sdp: ""}),
+ STABLE);
+ },
+
+ // Rolling back should shut down gathering
+ function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleIce;
+ },
+ ]);
+ test.chain.append(commandsPeerConnectionOfferAnswer);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html b/dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html
new file mode 100644
index 000000000..dfb5c5b4c
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: remove audio track"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REMOVE_AUDIO_TRACK(test) {
+ test.setOfferOptions({ offerToReceiveAudio: true });
+ return test.pcLocal.removeSender(0);
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify that media stopped flowing from pcLocal
+
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html b/dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html
new file mode 100644
index 000000000..097cbcc86
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: remove then add audio track"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REMOVE_AUDIO_TRACK(test) {
+ return test.pcLocal.removeSender(0);
+ },
+ function PC_LOCAL_ADD_AUDIO_TRACK(test) {
+ // The new track's pipeline will start with a packet count of
+ // 0, but the remote side will keep its old pipeline and packet
+ // count.
+ test.pcLocal.disableRtpCountChecking = true;
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html
new file mode 100644
index 000000000..6d814bcae
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: remove then add audio track"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REMOVE_AUDIO_TRACK(test) {
+ // The new track's pipeline will start with a packet count of
+ // 0, but the remote side will keep its old pipeline and packet
+ // count.
+ test.pcLocal.disableRtpCountChecking = true;
+ return test.pcLocal.removeSender(0);
+ },
+ function PC_LOCAL_ADD_AUDIO_TRACK(test) {
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ ]
+ );
+
+ test.chain.insertAfterEach('PC_LOCAL_CREATE_OFFER',
+ PC_LOCAL_REMOVE_BUNDLE_FROM_OFFER);
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html b/dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html
new file mode 100644
index 000000000..7335266ea
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: remove then add video track"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REMOVE_AUDIO_TRACK(test) {
+ // The new track's pipeline will start with a packet count of
+ // 0, but the remote side will keep its old pipeline and packet
+ // count.
+ test.pcLocal.disableRtpCountChecking = true;
+ return test.pcLocal.removeSender(0);
+ },
+ function PC_LOCAL_ADD_AUDIO_TRACK(test) {
+ return test.pcLocal.getAllUserMedia([{video: true}]);
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html
new file mode 100644
index 000000000..40f037683
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: remove then add video track, no bundle"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REMOVE_AUDIO_TRACK(test) {
+ // The new track's pipeline will start with a packet count of
+ // 0, but the remote side will keep its old pipeline and packet
+ // count.
+ test.pcLocal.disableRtpCountChecking = true;
+ return test.pcLocal.removeSender(0);
+ },
+ function PC_LOCAL_ADD_AUDIO_TRACK(test) {
+ return test.pcLocal.getAllUserMedia([{video: true}]);
+ },
+ ]
+ );
+
+ test.chain.insertAfterEach('PC_LOCAL_CREATE_OFFER',
+ PC_LOCAL_REMOVE_BUNDLE_FROM_OFFER);
+
+ // TODO(bug 1093835): figure out how to verify if media flows through the new stream
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html b/dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html
new file mode 100644
index 000000000..88fff9531
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: remove video track"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REMOVE_VIDEO_TRACK(test) {
+ test.setOfferOptions({ offerToReceiveVideo: true });
+ test.setMediaConstraints([], [{video: true}]);
+ return test.pcLocal.removeSender(0);
+ },
+ ]
+ );
+
+ // TODO(bug 1093835): figure out how to verify that media stopped flowing from pcLocal
+
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html b/dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html
new file mode 100644
index 000000000..b034eb9af
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1273652",
+ title: "Video receiver still renders after renegotiation",
+ visible: true
+ });
+
+ var pc1 = new RTCPeerConnection();
+ var pc2 = new RTCPeerConnection();
+
+ var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
+ pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback());
+ pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback());
+
+ var v1, v2;
+ var delivered = new Promise(resolve => pc2.ontrack = e => {
+ // Test RTCTrackEvent here.
+ ok(e.streams.length > 0, "has streams");
+ ok(e.streams[0].getTrackById(e.track.id), "has track");
+ ok(pc2.getReceivers().some(receiver => receiver == e.receiver), "has receiver");
+ if (e.streams[0].getTracks().length == 1) {
+ // Test RTCTrackEvent required args here.
+ mustThrowWith("RTCTrackEvent wo/required args",
+ "TypeError", () => new RTCTrackEvent("track", {}));
+ v2.srcObject = e.streams[0];
+ resolve();
+ }
+ });
+
+ runNetworkTest(function() {
+ var h = new CaptureStreamTestHelper2D();
+ var canvas = document.createElement('canvas');
+ canvas.id = 'source_canvas';
+ canvas.width = canvas.height = 10;
+ document.getElementById('content').appendChild(canvas);
+
+ v2 = createMediaElement('video', 'v2');
+ is(v2.currentTime, 0, "v2.currentTime is zero at outset");
+
+ h.drawColor(canvas, h.blue);
+ var stream = canvas.captureStream(0);
+ stream.getTracks().forEach(t => pc1.addTrack(t, stream));
+
+ pc1.createOffer({})
+ .then(offer => pc1.setLocalDescription(offer))
+ .then(() => pc2.setRemoteDescription(pc1.localDescription))
+ .then(() => pc2.createAnswer({})) // check that createAnswer accepts arg.
+ .then(answer => pc2.setLocalDescription(answer))
+ .then(() => pc1.setRemoteDescription(pc2.localDescription))
+
+ // re-negotiate to trigger the race condition in the jitter buffer
+ .then(() => pc1.createOffer({})) // check that createOffer accepts arg.
+ .then(offer => pc1.setLocalDescription(offer))
+ .then(() => pc2.setRemoteDescription(pc1.localDescription))
+ .then(() => pc2.createAnswer({}))
+ .then(answer => pc2.setLocalDescription(answer))
+ .then(() => pc1.setRemoteDescription(pc2.localDescription))
+ .then(() => delivered)
+
+ // now verify that actually something gets rendered into the remote video
+ // element
+ .then(() => h.waitForPixelColor(v2, h.blue, 128,
+ "pcRemote's video should become green"))
+ .then(() => {
+ stream.requestFrame();
+ h.drawColor(canvas, h.red);
+ })
+ .then(() => h.waitForPixelColor(v2, h.red, 128,
+ "pcRemote's video should become green"))
+
+ .catch(reason => ok(false, "unexpected failure: " + reason))
+ .then(networkTestFinished);
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_replaceTrack.html b/dom/media/tests/mochitest/test_peerConnection_replaceTrack.html
new file mode 100644
index 000000000..8eb224f8d
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_replaceTrack.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1032839",
+ title: "Replace video and audio (with WebAudio) tracks",
+ visible: true
+ });
+
+ function allLocalStreamsHaveSender(pc) {
+ return pc.getLocalStreams()
+ .every(s => s.getTracks() // Every local stream,
+ .some(t => pc.getSenders() // should have some track,
+ .some(sn => sn.track == t))) // that's being sent over |pc|.
+ }
+
+ function allRemoteStreamsHaveReceiver(pc) {
+ return pc.getRemoteStreams()
+ .every(s => s.getTracks() // Every remote stream,
+ .some(t => pc.getReceivers() // should have some track,
+ .some(sn => sn.track == t))) // that's being received over |pc|.
+ }
+
+ function replacetest(wrapper) {
+ var pc = wrapper._pc;
+ var oldSenderCount = pc.getSenders().length;
+ var sender = pc.getSenders().find(sn => sn.track.kind == "video");
+ var oldTrack = sender.track;
+ ok(sender, "We have a sender for video");
+ ok(allLocalStreamsHaveSender(pc),
+ "Shouldn't have any local streams without a corresponding sender");
+ ok(allRemoteStreamsHaveReceiver(pc),
+ "Shouldn't have any remote streams without a corresponding receiver");
+
+ var newTrack;
+ var audiotrack;
+ return navigator.mediaDevices.getUserMedia({video:true, audio:true})
+ .then(newStream => {
+ window.grip = newStream;
+ newTrack = newStream.getVideoTracks()[0];
+ audiotrack = newStream.getAudioTracks()[0];
+ isnot(newTrack, sender.track, "replacing with a different track");
+ ok(!pc.getLocalStreams().some(s => s == newStream),
+ "from a different stream");
+ return sender.replaceTrack(newTrack);
+ })
+ .then(() => {
+ is(pc.getSenders().length, oldSenderCount, "same sender count");
+ is(sender.track, newTrack, "sender.track has been replaced");
+ ok(!pc.getSenders().map(sn => sn.track).some(t => t == oldTrack),
+ "old track not among senders");
+ ok(pc.getLocalStreams().some(s => s.getTracks()
+ .some(t => t == sender.track)),
+ "track exists among pc's local streams");
+ return sender.replaceTrack(audiotrack)
+ .then(() => ok(false, "replacing with different kind should fail"),
+ e => is(e.name, "IncompatibleMediaStreamTrackError",
+ "replacing with different kind should fail"));
+ });
+ }
+
+ runNetworkTest(function () {
+ test = new PeerConnectionTest();
+ test.audioCtx = new AudioContext();
+ test.setMediaConstraints([{video: true, audio: true}], [{video: true}]);
+ test.chain.removeAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW");
+
+ // Test replaceTrack on pcRemote separately since it's video only.
+ test.chain.append([
+ function PC_REMOTE_VIDEOONLY_REPLACE_VIDEOTRACK(test) {
+ return replacetest(test.pcRemote);
+ },
+ function PC_LOCAL_NEW_VIDEOTRACK_WAIT_FOR_MEDIA_FLOW(test) {
+ return test.pcLocal.waitForMediaFlow();
+ }
+ ]);
+
+ // Replace video twice on pcLocal to make sure it still works
+ // (does audio twice too, but hey)
+ test.chain.append([
+ function PC_LOCAL_AUDIOVIDEO_REPLACE_VIDEOTRACK_1(test) {
+ return replacetest(test.pcLocal);
+ },
+ function PC_REMOTE_NEW_VIDEOTRACK_WAIT_FOR_MEDIA_FLOW_1(test) {
+ return test.pcRemote.waitForMediaFlow();
+ },
+ function PC_LOCAL_AUDIOVIDEO_REPLACE_VIDEOTRACK_2(test) {
+ return replacetest(test.pcLocal);
+ },
+ function PC_REMOTE_NEW_VIDEOTRACK_WAIT_FOR_MEDIA_FLOW_2(test) {
+ return test.pcRemote.waitForMediaFlow();
+ }
+ ]);
+
+ test.chain.append([
+ function PC_LOCAL_AUDIOVIDEO_REPLACE_VIDEOTRACK_WITHSAME(test) {
+ var pc = test.pcLocal._pc;
+ var sender = pc.getSenders().find(sn => sn.track.kind == "video");
+ ok(sender, "should still have a sender of video");
+ return sender.replaceTrack(sender.track)
+ .then(() => ok(true, "replacing with itself should succeed"));
+ },
+ function PC_REMOTE_NEW_SAME_VIDEOTRACK_WAIT_FOR_MEDIA_FLOW(test) {
+ return test.pcRemote.waitForMediaFlow();
+ }
+ ]);
+
+ // Replace the gUM audio track on pcLocal with a WebAudio track.
+ test.chain.append([
+ function PC_LOCAL_AUDIOVIDEO_REPLACE_AUDIOTRACK_WEBAUDIO(test) {
+ var pc = test.pcLocal._pc;
+ var sender = pc.getSenders().find(sn => sn.track.kind == "audio");
+ ok(sender, "track has a sender");
+ var oldSenderCount = pc.getSenders().length;
+ var oldTrack = sender.track;
+
+ var sourceNode = test.audioCtx.createOscillator();
+ sourceNode.type = 'sine';
+ // We need a frequency not too close to the fake audio track
+ // (440Hz for loopback devices, 1kHz for fake tracks).
+ sourceNode.frequency.value = 2000;
+ sourceNode.start();
+
+ var destNode = test.audioCtx.createMediaStreamDestination();
+ sourceNode.connect(destNode);
+ var newTrack = destNode.stream.getAudioTracks()[0];
+
+ return sender.replaceTrack(newTrack)
+ .then(() => {
+ is(pc.getSenders().length, oldSenderCount, "same sender count");
+ ok(!pc.getSenders().some(sn => sn.track == oldTrack),
+ "Replaced track should be removed from senders");
+ ok(allLocalStreamsHaveSender(pc),
+ "Shouldn't have any streams without a corresponding sender");
+ is(sender.track, newTrack, "sender.track has been replaced");
+ ok(pc.getLocalStreams().some(s => s.getTracks()
+ .some(t => t == sender.track)),
+ "track exists among pc's local streams");
+ });
+ }
+ ]);
+ test.chain.append([
+ function PC_LOCAL_CHECK_WEBAUDIO_FLOW_PRESENT(test) {
+ return test.pcRemote.checkReceivingToneFrom(test.audioCtx, test.pcLocal);
+ }
+ ]);
+ test.chain.append([
+ function PC_LOCAL_INVALID_ADD_VIDEOTRACKS(test) {
+ var stream = test.pcLocal._pc.getLocalStreams()[0];
+ var track = stream.getVideoTracks()[0];
+ try {
+ test.pcLocal._pc.addTrack(track, stream);
+ ok(false, "addTrack existing track should fail");
+ } catch (e) {
+ is(e.name, "InvalidParameterError",
+ "addTrack existing track should fail");
+ }
+ try {
+ test.pcLocal._pc.addTrack(track, stream);
+ ok(false, "addTrack existing track should fail");
+ } catch (e) {
+ is(e.name, "InvalidParameterError",
+ "addTrack existing track should fail");
+ }
+ }
+ ]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html b/dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html
new file mode 100644
index 000000000..5e36d7a5e
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1017888",
+ title: "Renegotiation: replaceTrack followed by adding a second video stream"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{video:true}], [{video:true}]);
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_REPLACE_VIDEO_TRACK_THEN_ADD_SECOND_STREAM(test) {
+ var oldstream = test.pcLocal._pc.getLocalStreams()[0];
+ var oldtrack = oldstream.getVideoTracks()[0];
+ var sender = test.pcLocal._pc.getSenders()[0];
+ return navigator.mediaDevices.getUserMedia({video:true})
+ .then(newstream => {
+ var newtrack = newstream.getVideoTracks()[0];
+ return test.pcLocal.senderReplaceTrack(0, newtrack, newstream.id);
+ })
+ .then(() => {
+ test.setMediaConstraints([{video: true}, {video: true}],
+ [{video: true}]);
+ return test.pcLocal.getAllUserMedia([{video: true}]);
+ });
+ },
+ ]
+ );
+
+ // TODO(bug 1093835):
+ // figure out how to verify if media flows through the new stream
+ // figure out how to verify that media stopped flowing from old stream
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_restartIce.html b/dom/media/tests/mochitest/test_peerConnection_restartIce.html
new file mode 100644
index 000000000..009fe0ff0
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIce.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "906986",
+ title: "Renegotiation: restart ice"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+
+ addRenegotiation(test.chain,
+ [
+ // causes a full, normal ice restart
+ function PC_LOCAL_SET_OFFER_OPTION(test) {
+ test.setOfferOptions({ iceRestart: true });
+ },
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ }
+ ]
+ );
+
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html
new file mode 100644
index 000000000..e92617164
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "906986",
+ title: "Renegotiation: restart ice, local and remote rollback"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+
+ addRenegotiation(test.chain,
+ [
+ // causes a full, normal ice restart
+ function PC_LOCAL_SET_OFFER_OPTION(test) {
+ test.setOfferOptions({ iceRestart: true });
+ }
+ ]
+ );
+
+ test.chain.replaceAfter('PC_REMOTE_CREATE_ANSWER',
+ [
+ function PC_LOCAL_SETUP_ICE_HANDLER(test) {
+ test.pcLocal.setupIceCandidateHandler(test);
+ if (test.testOptions.steeplechase) {
+ test.pcLocal.endOfTrickleIce.then(() => {
+ send_message({"type": "end_of_trickle_ice"});
+ });
+ }
+ },
+ function PC_REMOTE_SETUP_ICE_HANDLER(test) {
+ test.pcRemote.setupIceCandidateHandler(test);
+ if (test.testOptions.steeplechase) {
+ test.pcRemote.endOfTrickleIce.then(() => {
+ send_message({"type": "end_of_trickle_ice"});
+ });
+ }
+ },
+
+ function PC_LOCAL_EXPECT_ICE_CONNECTED(test) {
+ test.pcLocal.iceCheckingIceRollbackExpected = true;
+ },
+ function PC_REMOTE_EXPECT_ICE_CONNECTED(test) {
+ test.pcRemote.iceCheckingIceRollbackExpected = true;
+ },
+
+ function PC_REMOTE_ROLLBACK(test) {
+ return test.setRemoteDescription(
+ test.pcRemote,
+ new RTCSessionDescription({ type: "rollback" }),
+ STABLE);
+ },
+
+ function PC_LOCAL_ROLLBACK(test) {
+ // We haven't negotiated the new stream yet.
+ test.pcLocal.expectNegotiationNeeded();
+ return test.setLocalDescription(
+ test.pcLocal,
+ new RTCSessionDescription({ type: "rollback", sdp: ""}),
+ STABLE);
+ },
+
+ // Rolling back should shut down gathering
+ function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleIce;
+ },
+ function PC_REMOTE_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcRemote.endOfTrickleIce;
+ },
+
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ }
+ ],
+ 1 // Replaces after second PC_REMOTE_CREATE_ANSWER
+ );
+ test.chain.append(commandsPeerConnectionOfferAnswer);
+
+ // for now, only use one stream, because rollback doesn't seem to
+ // like multiple streams. See bug 1259465.
+ test.setMediaConstraints([{audio: true}],
+ [{audio: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html
new file mode 100644
index 000000000..c1ac186de
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "906986",
+ title: "Renegotiation: restart ice, local rollback"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+
+ addRenegotiation(test.chain,
+ [
+ // causes a full, normal ice restart
+ function PC_LOCAL_SET_OFFER_OPTION(test) {
+ test.setOfferOptions({ iceRestart: true });
+ },
+ // causes an ice restart and then rolls it back
+ // (does not result in sending an offer)
+ function PC_LOCAL_SETUP_ICE_HANDLER(test) {
+ test.pcLocal.setupIceCandidateHandler(test);
+ if (test.testOptions.steeplechase) {
+ test.pcLocal.endOfTrickleIce.then(() => {
+ send_message({"type": "end_of_trickle_ice"});
+ });
+ }
+ },
+ function PC_LOCAL_CREATE_AND_SET_OFFER(test) {
+ return test.createOffer(test.pcLocal).then(offer => {
+ return test.setLocalDescription(test.pcLocal,
+ offer,
+ HAVE_LOCAL_OFFER);
+ });
+ },
+ function PC_LOCAL_EXPECT_ICE_CONNECTED(test) {
+ test.pcLocal.iceCheckingIceRollbackExpected = true;
+ },
+ function PC_LOCAL_ROLLBACK(test) {
+ return test.setLocalDescription(
+ test.pcLocal,
+ new RTCSessionDescription({ type: "rollback",
+ sdp: ""}),
+ STABLE);
+ },
+ // Rolling back should shut down gathering
+ function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
+ return test.pcLocal.endOfTrickleIce;
+ },
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ }
+ ]
+ );
+
+ // for now, only use one stream, because rollback doesn't seem to
+ // like multiple streams. See bug 1259465.
+ test.setMediaConstraints([{audio: true}],
+ [{audio: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html b/dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html
new file mode 100644
index 000000000..ffb20e77d
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "906986",
+ title: "Renegotiation: restart ice, no bundle"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ test = new PeerConnectionTest(options);
+
+ addRenegotiation(test.chain,
+ [
+ // causes a full, normal ice restart
+ function PC_LOCAL_SET_OFFER_OPTION(test) {
+ test.setOfferOptions({ iceRestart: true });
+ },
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ }
+ ]
+ );
+
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html b/dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html
new file mode 100644
index 000000000..77720b575
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "906986",
+ title: "Renegotiation: restart ice, no bundle and disabled RTCP-Mux"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.bundle = false;
+ options.rtcpmux = false;
+ test = new PeerConnectionTest(options);
+
+ addRenegotiation(test.chain,
+ [
+ // causes a full, normal ice restart
+ function PC_LOCAL_SET_OFFER_OPTION(test) {
+ test.setOfferOptions({ iceRestart: true });
+ },
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ }
+ ]
+ );
+
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html b/dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html
new file mode 100644
index 000000000..f3591d0b4
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "906986",
+ title: "Renegotiation: restart ice, with disabled RTCP-Mux"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ options = options || { };
+ options.rtcpmux = false;
+ test = new PeerConnectionTest(options);
+
+ addRenegotiation(test.chain,
+ [
+ // causes a full, normal ice restart
+ function PC_LOCAL_SET_OFFER_OPTION(test) {
+ test.setOfferOptions({ iceRestart: true });
+ },
+ function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
+ test.pcLocal.expectIceChecking();
+ },
+ function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
+ test.pcRemote.expectIceChecking();
+ }
+ ]
+ );
+
+ test.setMediaConstraints([{audio: true}, {video: true}],
+ [{audio: true}, {video: true}]);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_scaleResolution.html b/dom/media/tests/mochitest/test_peerConnection_scaleResolution.html
new file mode 100644
index 000000000..ec83780b8
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_scaleResolution.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1244913",
+ title: "Scale resolution down on a PeerConnection",
+ visible: true
+ });
+
+ var mustRejectWith = (msg, reason, f) =>
+ f().then(() => ok(false, msg),
+ e => is(e.name, reason, msg));
+
+ var removeAllButCodec = (d, codec) =>
+ (d.sdp = d.sdp.replace(/m=video (\w) UDP\/TLS\/RTP\/SAVPF \w.*\r\n/,
+ "m=video $1 UDP/TLS/RTP/SAVPF " + codec + "\r\n"), d);
+
+ function testScale(codec) {
+ var pc1 = new RTCPeerConnection();
+ var pc2 = new RTCPeerConnection();
+
+ var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
+ pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback());
+ pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback());
+
+ info("testing scaling with " + codec);
+
+ pc1.onnegotiationneeded = e =>
+ pc1.createOffer()
+ .then(d => pc1.setLocalDescription(codec == "VP8" ? d : removeAllButCodec(d, 126)))
+ .then(() => pc2.setRemoteDescription(pc1.localDescription))
+ .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d))
+ .then(() => pc1.setRemoteDescription(pc2.localDescription))
+ .catch(generateErrorCallback());
+
+ return navigator.mediaDevices.getUserMedia({ video: true })
+ .then(stream => {
+ var v1 = createMediaElement('video', 'v1');
+ var v2 = createMediaElement('video', 'v2');
+
+ is(v2.currentTime, 0, "v2.currentTime is zero at outset");
+
+ v1.srcObject = stream;
+ var sender = pc1.addTrack(stream.getVideoTracks()[0], stream);
+
+ return mustRejectWith("Invalid scaleResolutionDownBy must reject", "RangeError",
+ () => sender.setParameters({ encodings:
+ [{ scaleResolutionDownBy: 0.5 } ] }))
+ .then(() => sender.setParameters({ encodings: [{ maxBitrate: 60000,
+ scaleResolutionDownBy: 2 }] }))
+ .then(() => new Promise(resolve => pc2.ontrack = e => resolve(e)))
+ .then(e => v2.srcObject = e.streams[0])
+ .then(() => new Promise(resolve => v2.onloadedmetadata = resolve))
+ .then(() => waitUntil(() => v2.currentTime > 0 && v2.srcObject.currentTime > 0))
+ .then(() => ok(v2.currentTime > 0, "v2.currentTime is moving (" + v2.currentTime + ")"))
+ .then(() => wait(3000)) // TODO: Bug 1248154
+ .then(() => {
+ ok(v1.videoWidth > 0, "source width is positive");
+ ok(v1.videoHeight > 0, "source height is positive");
+ if (v2.videoWidth == 640 && v2.videoHeight == 480) { // TODO: Bug 1248154
+ info("Skipping test due to Bug 1248154");
+ } else {
+ is(v2.videoWidth, v1.videoWidth / 2, "sink is half the width of source");
+ is(v2.videoHeight, v1.videoHeight / 2, "sink is half the height of source");
+ }
+ })
+ .then(() => {
+ stream.getTracks().forEach(track => track.stop());
+ v1.srcObject = v2.srcObject = null;
+ })
+ })
+ .catch(generateErrorCallback());
+ }
+
+ runNetworkTest(() => testScale("VP8").then(() => testScale("H264"))
+ .then(networkTestFinished));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html b/dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html
new file mode 100644
index 000000000..ab5ff099e
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "784519",
+ title: "setLocalDescription (answer) in 'have-local-offer'"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_LOCAL_SET_LOCAL_DESCRIPTION");
+
+ test.chain.append([
+ function PC_LOCAL_SET_LOCAL_ANSWER(test) {
+ test.pcLocal._latest_offer.type = "answer";
+ return test.pcLocal.setLocalDescriptionAndFail(test.pcLocal._latest_offer)
+ .then(err => {
+ is(err.name, "InvalidStateError", "Error is InvalidStateError");
+ });
+ }
+ ]);
+
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html b/dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html
new file mode 100644
index 000000000..35e0654d1
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "784519",
+ title: "setLocalDescription (answer) in 'stable'"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_LOCAL_CREATE_OFFER");
+
+ test.chain.append([
+ function PC_LOCAL_SET_LOCAL_ANSWER(test) {
+ test.pcLocal._latest_offer.type = "answer";
+ return test.pcLocal.setLocalDescriptionAndFail(test.pcLocal._latest_offer)
+ .then(err => {
+ is(err.name, "InvalidStateError", "Error is InvalidStateError");
+ });
+ }
+ ]);
+
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html b/dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html
new file mode 100644
index 000000000..5ac150290
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "784519",
+ title: "setLocalDescription (offer) in 'have-remote-offer'"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_REMOTE_SET_REMOTE_DESCRIPTION");
+
+ test.chain.append([
+ function PC_REMOTE_SET_LOCAL_OFFER(test) {
+ test.pcRemote.setLocalDescriptionAndFail(test.pcLocal._latest_offer)
+ .then(err => {
+ is(err.name, "InvalidStateError", "Error is InvalidStateError");
+ });
+ }
+ ]);
+
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setParameters.html b/dom/media/tests/mochitest/test_peerConnection_setParameters.html
new file mode 100644
index 000000000..1dc7cfb12
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setParameters.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1230184",
+ title: "Set parameters on sender",
+ visible: true
+});
+
+function parameterstest(pc) {
+ ok(pc.getSenders().length > 0, "have senders");
+ var sender = pc.getSenders()[0];
+
+ var testParameters = (params, errorName, errorMsg) => {
+
+ var validateParameters = (a, b) => {
+ var validateEncoding = (a, b) => {
+ is(a.rid, b.rid || "", "same rid");
+ is(a.maxBitrate, b.maxBitrate, "same maxBitrate");
+ is(a.scaleResolutionDownBy, b.scaleResolutionDownBy,
+ "same scaleResolutionDownBy");
+ };
+ is(a.encodings.length, (b.encodings || []).length, "same encodings");
+ a.encodings.forEach((en, i) => validateEncoding(en, b.encodings[i]));
+ };
+
+ var before = JSON.stringify(sender.getParameters());
+ isnot(JSON.stringify(params), before, "starting condition");
+
+ var p = sender.setParameters(params)
+ .then(() => {
+ isnot(JSON.stringify(sender.getParameters()), before, "parameters changed");
+ validateParameters(sender.getParameters(), params);
+ is(null, errorName || null, "is success expected");
+ }, e => {
+ is(e.name, errorName, "correct error name");
+ is(e.message, errorMsg, "correct error message");
+ });
+ is(JSON.stringify(sender.getParameters()), before, "parameters not set yet");
+ return p;
+ };
+
+ return [
+ [{ encodings: [ { rid: "foo", maxBitrate: 40000, scaleResolutionDownBy: 2 },
+ { rid: "bar", maxBitrate: 10000, scaleResolutionDownBy: 4 }]
+ }],
+ [{ encodings: [{ maxBitrate: 10000, scaleResolutionDownBy: 4 }]}],
+ [{ encodings: [{ maxBitrate: 40000 },
+ { rid: "bar", maxBitrate: 10000 }] }, "TypeError", "Missing rid"],
+ [{ encodings: [{ rid: "foo", maxBitrate: 40000 },
+ { rid: "bar", maxBitrate: 10000 },
+ { rid: "bar", maxBitrate: 20000 }] }, "TypeError", "Duplicate rid"],
+ [{}]
+ ].reduce((p, args) => p.then(() => testParameters.apply(this, args)),
+ Promise.resolve());
+}
+
+runNetworkTest(() => {
+
+ test = new PeerConnectionTest();
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.chain.removeAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW");
+
+ // Test sender parameters.
+ test.chain.append([
+ function PC_LOCAL_SET_PARAMETERS(test) {
+ return parameterstest(test.pcLocal._pc);
+ }
+ ]);
+
+ return test.run()
+ .catch(e => ok(false, "unexpected failure: " + e));
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html b/dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html
new file mode 100644
index 000000000..da1b2451e
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "784519",
+ title: "setRemoteDescription (answer) in 'have-remote-offer'"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_REMOTE_SET_REMOTE_DESCRIPTION");
+
+ test.chain.append([
+ function PC_REMOTE_SET_REMOTE_ANSWER(test) {
+ test.pcLocal._latest_offer.type = "answer";
+ test.pcRemote._pc.setRemoteDescription(test.pcLocal._latest_offer)
+ .then(generateErrorCallback('setRemoteDescription should fail'),
+ err =>
+ is(err.name, "InvalidStateError", "Error is InvalidStateError"));
+ }
+ ]);
+
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html b/dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html
new file mode 100644
index 000000000..6c9546bf0
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "784519",
+ title: "setRemoteDescription (answer) in 'stable'"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_LOCAL_CREATE_OFFER");
+
+ test.chain.append([
+ function PC_LOCAL_SET_REMOTE_ANSWER(test) {
+ test.pcLocal._latest_offer.type = "answer";
+ test.pcLocal._pc.setRemoteDescription(test.pcLocal._latest_offer)
+ .then(generateErrorCallback('setRemoteDescription should fail'),
+ err =>
+ is(err.name, "InvalidStateError", "Error is InvalidStateError"));
+ }
+ ]);
+
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html b/dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html
new file mode 100644
index 000000000..d651a14f1
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "784519",
+ title: "setRemoteDescription (offer) in 'have-local-offer'"
+ });
+
+runNetworkTest(function () {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{audio: true}], [{audio: true}]);
+ test.chain.removeAfter("PC_LOCAL_SET_LOCAL_DESCRIPTION");
+
+ test.chain.append([
+ function PC_LOCAL_SET_REMOTE_OFFER(test) {
+ test.pcLocal._pc.setRemoteDescription(test.pcLocal._latest_offer)
+ .then(generateErrorCallback('setRemoteDescription should fail'),
+ err =>
+ is(err.name, "InvalidStateError", "Error is InvalidStateError"));
+ }
+ ]);
+
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html b/dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html
new file mode 100644
index 000000000..de6aeb038
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html
@@ -0,0 +1,142 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1231507",
+ title: "Basic video-only peer connection with Simulcast offer",
+ visible: true
+ });
+
+ var test;
+ var pushPrefs = (...p) => new Promise(r => SpecialPowers.pushPrefEnv({set: p}, r));
+
+ function selectRecvSsrc(pc, index) {
+ var receivers = pc._pc.getReceivers();
+ is(receivers.length, 1, "We have exactly one RTP receiver");
+ var receiver = receivers[0];
+
+ SpecialPowers.wrap(pc._pc).mozSelectSsrc(receiver, index);
+ }
+
+ runNetworkTest(() =>
+ pushPrefs(['media.peerconnection.simulcast', true],
+ // 180Kbps was determined empirically, set well-higher than
+ // the 80Kbps+overhead needed for the two simulcast streams.
+ // 100Kbps was apparently too low.
+ ['media.peerconnection.video.min_bitrate_estimate', 180*1000]).then(() => {
+ SimpleTest.requestCompleteLog();
+ var helper;
+
+ test = new PeerConnectionTest({bundle: false});
+ test.setMediaConstraints([{video: true}], []);
+
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_CANVAS_CAPTURESTREAM(test) {
+ helper = new VideoStreamHelper();
+ test.pcLocal.attachLocalStream(helper.stream());
+ }
+ ]);
+
+ test.chain.insertBefore('PC_LOCAL_CREATE_OFFER', [
+ function PC_LOCAL_SET_RIDS(test) {
+ var senders = test.pcLocal._pc.getSenders();
+ is(senders.length, 1, "We have exactly one RTP sender");
+ var sender = senders[0];
+ ok(sender.track, "Sender has a track");
+
+ return sender.setParameters({
+ encodings: [{ rid: "foo", maxBitrate: 40000 },
+ { rid: "bar", maxBitrate: 40000, scaleResolutionDownBy: 2 }]
+ });
+ }
+ ]);
+
+ test.chain.insertAfter('PC_LOCAL_GET_ANSWER', [
+ function PC_LOCAL_ADD_RIDS_TO_ANSWER(test) {
+ test._remote_answer.sdp = sdputils.transferSimulcastProperties(
+ test.originalOffer.sdp, test._remote_answer.sdp);
+ info("Answer with RIDs: " + JSON.stringify(test._remote_answer));
+ ok(test._remote_answer.sdp.match(/a=simulcast:/), "Modified answer has simulcast");
+ ok(test._remote_answer.sdp.match(/a=rid:/), "Modified answer has rid");
+ }
+ ]);
+
+ test.chain.insertAfter('PC_REMOTE_WAIT_FOR_MEDIA_FLOW',[
+ function PC_REMOTE_SET_RTP_FIRST_RID(test) {
+ // Cause pcRemote to filter out everything but the first SSRC. This
+ // lets only one of the simulcast streams through.
+ selectRecvSsrc(test.pcRemote, 0);
+ }
+ ]);
+
+ test.chain.append([
+ function PC_REMOTE_WAIT_FOR_FRAMES() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.waitForFrames(vremote);
+ },
+ function PC_REMOTE_CHECK_SIZE_1() {
+ var vlocal = test.pcLocal.localMediaElements[0];
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vlocal, "Should have local video element for pcLocal");
+ ok(vremote, "Should have remote video element for pcRemote");
+ ok(vlocal.videoWidth > 0, "source width is positive");
+ ok(vlocal.videoHeight > 0, "source height is positive");
+ is(vremote.videoWidth, vlocal.videoWidth, "sink is same width as source");
+ is(vremote.videoHeight, vlocal.videoHeight, "sink is same height as source");
+ },
+ function PC_REMOTE_SET_RTP_SECOND_RID(test) {
+ // Now, cause pcRemote to filter out everything but the second SSRC.
+ // This lets only the other simulcast stream through.
+ selectRecvSsrc(test.pcRemote, 1);
+ },
+ function PC_REMOTE_WAIT_FOR_SECOND_MEDIA_FLOW(test) {
+ return test.pcRemote.waitForMediaFlow();
+ },
+ function PC_REMOTE_WAIT_FOR_FRAMES_2() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.waitForFrames(vremote);
+ },
+ // For some reason, even though we're getting a 25x25 stream, sometimes
+ // the resolution isn't updated on the video element on the first frame.
+ function PC_REMOTE_WAIT_FOR_FRAMES_3() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.waitForFrames(vremote);
+ },
+ function PC_REMOTE_CHECK_SIZE_2() {
+ var vlocal = test.pcLocal.localMediaElements[0];
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vlocal, "Should have local video element for pcLocal");
+ ok(vremote, "Should have remote video element for pcRemote");
+ ok(vlocal.videoWidth > 0, "source width is positive");
+ ok(vlocal.videoHeight > 0, "source height is positive");
+ is(vremote.videoWidth, vlocal.videoWidth / 2, "sink is 1/2 width of source");
+ is(vremote.videoHeight, vlocal.videoHeight / 2, "sink is 1/2 height of source");
+ },
+ function PC_REMOTE_SET_RTP_NONEXISTENT_RID(test) {
+ // Now, cause pcRemote to filter out everything, just to make sure
+ // selectRecvSsrc is working.
+ selectRecvSsrc(test.pcRemote, 2);
+ },
+ function PC_REMOTE_ENSURE_NO_FRAMES() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.verifyNoFrames(vremote);
+ },
+ ]);
+
+ return test.run();
+ })
+ .catch(e => ok(false, "unexpected failure: " + e)));
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html b/dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html
new file mode 100644
index 000000000..bc998d641
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "1063971",
+ title: "Legacy sync setDescription calls",
+ visible: true
+ });
+
+// Test setDescription without callbacks, which many webrtc examples still do
+
+function PC_LOCAL_SET_LOCAL_DESCRIPTION_SYNC(test) {
+ test.pcLocal.onsignalingstatechange = function() {};
+ test.pcLocal._pc.setLocalDescription(test.originalOffer);
+}
+
+function PC_REMOTE_SET_REMOTE_DESCRIPTION_SYNC(test) {
+ test.pcRemote.onsignalingstatechange = function() {};
+ test.pcRemote._pc.setRemoteDescription(test._local_offer,
+ test.pcRemote.releaseIceCandidates,
+ generateErrorCallback("pcRemote._pc.setRemoteDescription() sync failed"));
+}
+function PC_REMOTE_SET_LOCAL_DESCRIPTION_SYNC(test) {
+ test.pcRemote.onsignalingstatechange = function() {};
+ test.pcRemote._pc.setLocalDescription(test.originalAnswer);
+}
+function PC_LOCAL_SET_REMOTE_DESCRIPTION_SYNC(test) {
+ test.pcLocal.onsignalingstatechange = function() {};
+ test.pcLocal._pc.setRemoteDescription(test._remote_answer,
+ test.pcLocal.releaseIceCandidates,
+ generateErrorCallback("pcLocal._pc.setRemoteDescription() sync failed"));
+}
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ test.chain.replace("PC_LOCAL_SET_LOCAL_DESCRIPTION", PC_LOCAL_SET_LOCAL_DESCRIPTION_SYNC);
+ test.chain.replace("PC_REMOTE_SET_REMOTE_DESCRIPTION", PC_REMOTE_SET_REMOTE_DESCRIPTION_SYNC);
+ test.chain.remove("PC_REMOTE_CHECK_CAN_TRICKLE_SYNC");
+ test.chain.replace("PC_REMOTE_SET_LOCAL_DESCRIPTION", PC_REMOTE_SET_LOCAL_DESCRIPTION_SYNC);
+ test.chain.replace("PC_LOCAL_SET_REMOTE_DESCRIPTION", PC_LOCAL_SET_REMOTE_DESCRIPTION_SYNC);
+ test.chain.remove("PC_LOCAL_CHECK_CAN_TRICKLE_SYNC");
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_throwInCallbacks.html b/dom/media/tests/mochitest/test_peerConnection_throwInCallbacks.html
new file mode 100644
index 000000000..ad5cb7d86
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_throwInCallbacks.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ bug: "857765",
+ title: "Throw in PeerConnection callbacks"
+ });
+
+runNetworkTest(function () {
+ function finish() {
+ window.onerror = oldOnError;
+ is(error_count, 7, "Seven expected errors verified.");
+ networkTestFinished();
+ }
+
+ function getFail() {
+ return err => {
+ window.onerror = oldOnError;
+ generateErrorCallback()(err);
+ };
+ }
+
+ let error_count = 0;
+ let oldOnError = window.onerror;
+ window.onerror = (errorMsg, url, lineNumber) => {
+ if (errorMsg.indexOf("Expected") == -1) {
+ getFail()(errorMsg);
+ }
+ error_count += 1;
+ info("onerror " + error_count + ": " + errorMsg);
+ if (error_count == 7) {
+ finish();
+ }
+ throw new Error("window.onerror may throw");
+ return false;
+ }
+
+ let pc0, pc1, pc2;
+ // Test failure callbacks (limited to 1 for now)
+ pc0 = new RTCPeerConnection();
+ pc0.createOffer(getFail(), function(err) {
+ pc1 = new RTCPeerConnection();
+ pc2 = new RTCPeerConnection();
+
+ // Test success callbacks (happy path)
+ navigator.mozGetUserMedia({video:true}, function(video1) {
+ pc1.addStream(video1);
+ pc1.createOffer(function(offer) {
+ pc1.setLocalDescription(offer, function() {
+ pc2.setRemoteDescription(offer, function() {
+ pc2.createAnswer(function(answer) {
+ pc2.setLocalDescription(answer, function() {
+ pc1.setRemoteDescription(answer, function() {
+ throw new Error("Expected");
+ }, getFail());
+ throw new Error("Expected");
+ }, getFail());
+ throw new Error("Expected");
+ }, getFail());
+ throw new Error("Expected");
+ }, getFail());
+ throw new Error("Expected");
+ }, getFail());
+ throw new Error("Expected");
+ }, getFail());
+ }, getFail());
+ throw new Error("Expected");
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_toJSON.html b/dom/media/tests/mochitest/test_peerConnection_toJSON.html
new file mode 100644
index 000000000..52a619c47
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_toJSON.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "928304",
+ title: "test toJSON() on RTCSessionDescription and RTCIceCandidate"
+ });
+
+ runNetworkTest(function () {
+ /** Test for Bug 872377 **/
+
+ var rtcSession = new RTCSessionDescription({ sdp: "Picklechips!",
+ type: "offer" });
+ var jsonCopy = JSON.parse(JSON.stringify(rtcSession));
+ for (key in rtcSession) {
+ if (typeof(rtcSession[key]) == "function") continue;
+ is(rtcSession[key], jsonCopy[key], "key " + key + " should match.");
+ }
+
+ /** Test for Bug 928304 **/
+
+ var rtcIceCandidate = new RTCIceCandidate({ candidate: "dummy",
+ sdpMid: "test",
+ sdpMLineIndex: 3 });
+ jsonCopy = JSON.parse(JSON.stringify(rtcIceCandidate));
+ for (key in rtcIceCandidate) {
+ if (typeof(rtcIceCandidate[key]) == "function") continue;
+ is(rtcIceCandidate[key], jsonCopy[key], "key " + key + " should match.");
+ }
+ networkTestFinished();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_trackDisabling.html b/dom/media/tests/mochitest/test_peerConnection_trackDisabling.html
new file mode 100644
index 000000000..7bd8f5f1b
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_trackDisabling.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1219711",
+ title: "Disabling locally should be reflected remotely"
+});
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+
+ // Always use fake tracks since we depend on video to be somewhat green and
+ // audio to have a large 1000Hz component (or 440Hz if using fake devices).
+ test.setMediaConstraints([{audio: true, video: true, fake: true}], []);
+ test.chain.append([
+ function CHECK_ASSUMPTIONS() {
+ is(test.pcLocal.localMediaElements.length, 2,
+ "pcLocal should have one media element");
+ is(test.pcRemote.remoteMediaElements.length, 2,
+ "pcRemote should have one media element");
+ is(test.pcLocal._pc.getLocalStreams().length, 1,
+ "pcLocal should have one stream");
+ is(test.pcRemote._pc.getRemoteStreams().length, 1,
+ "pcRemote should have one stream");
+ },
+ function CHECK_VIDEO() {
+ var h = new CaptureStreamTestHelper2D();
+ var localVideo = test.pcLocal.localMediaElements
+ .find(e => e instanceof HTMLVideoElement);
+ var remoteVideo = test.pcRemote.remoteMediaElements
+ .find(e => e instanceof HTMLVideoElement);
+ // We check a pixel somewhere away from the top left corner since
+ // MediaEngineDefault puts semi-transparent time indicators there.
+ const offsetX = 50;
+ const offsetY = 50;
+ const threshold = 128;
+
+ // We're regarding black as disabled here, and we're setting the alpha
+ // channel of the pixel to 255 to disregard alpha when testing.
+ var checkVideoEnabled = video =>
+ h.waitForPixel(video, offsetX, offsetY,
+ px => (px[3] = 255, h.isPixelNot(px, h.black, threshold)));
+ var checkVideoDisabled = video =>
+ h.waitForPixel(video, offsetX, offsetY,
+ px => (px[3] = 255, h.isPixel(px, h.black, threshold, offsetX*2, offsetY*2)));
+ return Promise.resolve()
+ .then(() => info("Checking local video enabled"))
+ .then(() => checkVideoEnabled(localVideo))
+ .then(() => info("Checking remote video enabled"))
+ .then(() => checkVideoEnabled(remoteVideo))
+
+ .then(() => info("Disabling original"))
+ .then(() => test.pcLocal._pc.getLocalStreams()[0].getVideoTracks()[0].enabled = false)
+
+ .then(() => info("Checking local video disabled"))
+ .then(() => checkVideoDisabled(localVideo))
+ .then(() => info("Checking remote video disabled"))
+ .then(() => checkVideoDisabled(remoteVideo))
+ },
+ function CHECK_AUDIO() {
+ var ac = new AudioContext();
+ var localAnalyser = new AudioStreamAnalyser(ac, test.pcLocal._pc.getLocalStreams()[0]);
+ var remoteAnalyser = new AudioStreamAnalyser(ac, test.pcRemote._pc.getRemoteStreams()[0]);
+
+ var checkAudio = (analyser, fun) => analyser.waitForAnalysisSuccess(fun);
+
+ var freq1k = localAnalyser.binIndexForFrequency(1000);
+ var checkAudioEnabled = analyser =>
+ checkAudio(analyser, array => array[freq1k] > 200);
+ var checkAudioDisabled = analyser =>
+ checkAudio(analyser, array => array[freq1k] < 50);
+
+ return Promise.resolve()
+ .then(() => info("Checking local audio enabled"))
+ .then(() => checkAudioEnabled(localAnalyser))
+ .then(() => info("Checking remote audio enabled"))
+ .then(() => checkAudioEnabled(remoteAnalyser))
+
+ .then(() => test.pcLocal._pc.getLocalStreams()[0].getAudioTracks()[0].enabled = false)
+
+ .then(() => info("Checking local audio disabled"))
+ .then(() => checkAudioDisabled(localAnalyser))
+ .then(() => info("Checking remote audio disabled"))
+ .then(() => checkAudioDisabled(remoteAnalyser))
+ }
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html b/dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html
new file mode 100644
index 000000000..98548b215
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1219711",
+ title: "Disabling locally should be reflected remotely, individually for clones"
+});
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+
+ var originalStream;
+ var localVideoOriginal;
+
+ // Always use fake tracks since we depend on audio to have a large 1000Hz
+ // component.
+ test.setMediaConstraints([{audio: true, video: true, fake: true}], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_GUM_CLONE() {
+ return getUserMedia(test.pcLocal.constraints[0]).then(stream => {
+ originalStream = stream;
+ localVideoOriginal =
+ createMediaElement("video", "local-original");
+ localVideoOriginal.srcObject = stream;
+ test.pcLocal.attachLocalStream(originalStream.clone());
+ });
+ }
+ ]);
+ test.chain.append([
+ function CHECK_ASSUMPTIONS() {
+ is(test.pcLocal.localMediaElements.length, 2,
+ "pcLocal should have one media element");
+ is(test.pcRemote.remoteMediaElements.length, 2,
+ "pcRemote should have one media element");
+ is(test.pcLocal._pc.getLocalStreams().length, 1,
+ "pcLocal should have one stream");
+ is(test.pcRemote._pc.getRemoteStreams().length, 1,
+ "pcRemote should have one stream");
+ },
+ function CHECK_VIDEO() {
+ info("Checking video");
+ var h = new CaptureStreamTestHelper2D();
+ var localVideoClone = test.pcLocal.localMediaElements
+ .find(e => e instanceof HTMLVideoElement);
+ var remoteVideoClone = test.pcRemote.remoteMediaElements
+ .find(e => e instanceof HTMLVideoElement);
+
+ // We check a pixel somewhere away from the top left corner since
+ // MediaEngineDefault puts semi-transparent time indicators there.
+ const offsetX = 50;
+ const offsetY = 50;
+ const threshold = 128;
+ const remoteDisabledColor = h.black;
+
+ // We're regarding black as disabled here, and we're setting the alpha
+ // channel of the pixel to 255 to disregard alpha when testing.
+ var checkVideoEnabled = video =>
+ h.waitForPixel(video, offsetX, offsetY,
+ px => (px[3] = 255, h.isPixelNot(px, h.black, threshold)));
+ var checkVideoDisabled = video =>
+ h.waitForPixel(video, offsetX, offsetY,
+ px => (px[3] = 255, h.isPixel(px, h.black, threshold)));
+
+ return Promise.resolve()
+ .then(() => info("Checking local original enabled"))
+ .then(() => checkVideoEnabled(localVideoOriginal))
+ .then(() => info("Checking local clone enabled"))
+ .then(() => checkVideoEnabled(localVideoClone))
+ .then(() => info("Checking remote clone enabled"))
+ .then(() => checkVideoEnabled(remoteVideoClone))
+
+ .then(() => info("Disabling original"))
+ .then(() => originalStream.getVideoTracks()[0].enabled = false)
+
+ .then(() => info("Checking local original disabled"))
+ .then(() => checkVideoDisabled(localVideoOriginal))
+ .then(() => info("Checking local clone enabled"))
+ .then(() => checkVideoEnabled(localVideoClone))
+ .then(() => info("Checking remote clone enabled"))
+ .then(() => checkVideoEnabled(remoteVideoClone))
+
+ .then(() => info("Re-enabling original; disabling clone"))
+ .then(() => originalStream.getVideoTracks()[0].enabled = true)
+ .then(() => test.pcLocal._pc.getLocalStreams()[0].getVideoTracks()[0].enabled = false)
+
+ .then(() => info("Checking local original enabled"))
+ .then(() => checkVideoEnabled(localVideoOriginal))
+ .then(() => info("Checking local clone disabled"))
+ .then(() => checkVideoDisabled(localVideoClone))
+ .then(() => info("Checking remote clone disabled"))
+ .then(() => checkVideoDisabled(remoteVideoClone))
+ },
+ function CHECK_AUDIO() {
+ info("Checking audio");
+ var ac = new AudioContext();
+ var localAnalyserOriginal = new AudioStreamAnalyser(ac, originalStream);
+ var localAnalyserClone =
+ new AudioStreamAnalyser(ac, test.pcLocal._pc.getLocalStreams()[0]);
+ var remoteAnalyserClone =
+ new AudioStreamAnalyser(ac, test.pcRemote._pc.getRemoteStreams()[0]);
+
+ var freq1k = localAnalyserOriginal.binIndexForFrequency(1000);
+ var checkAudioEnabled = analyser =>
+ analyser.waitForAnalysisSuccess(array => array[freq1k] > 200);
+ var checkAudioDisabled = analyser =>
+ analyser.waitForAnalysisSuccess(array => array[freq1k] < 50);
+
+ return Promise.resolve()
+ .then(() => info("Checking local original enabled"))
+ .then(() => checkAudioEnabled(localAnalyserOriginal))
+ .then(() => info("Checking local clone enabled"))
+ .then(() => checkAudioEnabled(localAnalyserClone))
+ .then(() => info("Checking remote clone enabled"))
+ .then(() => checkAudioEnabled(remoteAnalyserClone))
+
+ .then(() => info("Disabling original"))
+ .then(() => originalStream.getAudioTracks()[0].enabled = false)
+
+ .then(() => info("Checking local original disabled"))
+ .then(() => checkAudioDisabled(localAnalyserOriginal))
+ .then(() => info("Checking local clone enabled"))
+ .then(() => checkAudioEnabled(localAnalyserClone))
+ .then(() => info("Checking remote clone enabled"))
+ .then(() => checkAudioEnabled(remoteAnalyserClone))
+
+ .then(() => info("Re-enabling original; disabling clone"))
+ .then(() => originalStream.getAudioTracks()[0].enabled = true)
+ .then(() => test.pcLocal._pc.getLocalStreams()[0].getAudioTracks()[0].enabled = false)
+
+ .then(() => info("Checking local original enabled"))
+ .then(() => checkAudioEnabled(localAnalyserOriginal))
+ .then(() => info("Checking local clone disabled"))
+ .then(() => checkAudioDisabled(localAnalyserClone))
+ .then(() => info("Checking remote clone disabled"))
+ .then(() => checkAudioDisabled(remoteAnalyserClone))
+ }
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html b/dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html
new file mode 100644
index 000000000..a88623163
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1091242",
+ title: "Multistream: Two audio streams"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}, {audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html b/dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html
new file mode 100644
index 000000000..2ad0569cf
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1145407",
+ title: "Multistream: Two audio tracks in one stream"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.chain.insertAfter("PC_REMOTE_GET_OFFER", [
+ function PC_REMOTE_OVERRIDE_STREAM_IDS_IN_OFFER(test) {
+ test._local_offer.sdp = test._local_offer.sdp.replace(
+ /a=msid:[^\s]*/g,
+ "a=msid:foo");
+ },
+ function PC_REMOTE_OVERRIDE_EXPECTED_STREAM_IDS(test) {
+ Object.keys(
+ test.pcRemote.expectedRemoteTrackInfoById).forEach(trackId => {
+ test.pcRemote.expectedRemoteTrackInfoById[trackId].streamId = "foo";
+ });
+ }
+ ]);
+ test.chain.insertAfter("PC_LOCAL_GET_ANSWER", [
+ function PC_LOCAL_OVERRIDE_STREAM_IDS_IN_ANSWER(test) {
+ test._remote_answer.sdp = test._remote_answer.sdp.replace(
+ /a=msid:[^\s]*/g,
+ "a=msid:foo");
+ },
+ function PC_LOCAL_OVERRIDE_EXPECTED_STREAM_IDS(test) {
+ Object.keys(
+ test.pcLocal.expectedRemoteTrackInfoById).forEach(trackId => {
+ test.pcLocal.expectedRemoteTrackInfoById[trackId].streamId = "foo";
+ });
+ }
+ ]);
+ test.setMediaConstraints([{audio: true}, {audio: true}],
+ [{audio: true}, {audio: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html b/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html
new file mode 100644
index 000000000..6264e7cc8
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+
+ createHTML({
+ bug: "1091242",
+ title: "Multistream: Two audio streams, two video streams"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true}, {video: true}, {audio: true},
+ {video: true}],
+ [{audio: true}, {video: true}, {audio: true},
+ {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html b/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html
new file mode 100644
index 000000000..61e0313b4
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+
+ createHTML({
+ bug: "1091242",
+ title: "Multistream: Two audio/video streams"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{audio: true, video: true},
+ {audio: true, video: true}],
+ [{audio: true, video: true},
+ {audio: true, video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html b/dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html
new file mode 100644
index 000000000..102c2f11c
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1091242",
+ title: "Multistream: Two video streams"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.setMediaConstraints([{video: true}, {video: true}],
+ [{video: true}, {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html b/dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html
new file mode 100644
index 000000000..c60c37838
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1145407",
+ title: "Multistream: Two video tracks in offerer stream"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.chain.insertAfter("PC_REMOTE_GET_OFFER", [
+ function PC_REMOTE_OVERRIDE_STREAM_IDS_IN_OFFER(test) {
+ test._local_offer.sdp = test._local_offer.sdp.replace(
+ /a=msid:[^\s]*/g,
+ "a=msid:foo");
+ },
+ function PC_REMOTE_OVERRIDE_EXPECTED_STREAM_IDS(test) {
+ Object.keys(
+ test.pcRemote.expectedRemoteTrackInfoById).forEach(trackId => {
+ test.pcRemote.expectedRemoteTrackInfoById[trackId].streamId = "foo";
+ });
+ }
+ ]);
+ test.chain.insertAfter("PC_LOCAL_GET_ANSWER", [
+ function PC_LOCAL_OVERRIDE_STREAM_IDS_IN_ANSWER(test) {
+ test._remote_answer.sdp = test._remote_answer.sdp.replace(
+ /a=msid:[^\s]*/g,
+ "a=msid:foo");
+ },
+ function PC_LOCAL_OVERRIDE_EXPECTED_STREAM_IDS(test) {
+ Object.keys(
+ test.pcLocal.expectedRemoteTrackInfoById).forEach(trackId => {
+ test.pcLocal.expectedRemoteTrackInfoById[trackId].streamId = "foo";
+ });
+ }
+ ]);
+ test.setMediaConstraints([{video: true}, {video: true}],
+ [{video: true}, {video: true}]);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html b/dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html
new file mode 100644
index 000000000..b5fab06b7
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1166832",
+ title: "Renegotiation: verify audio after renegotiation"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ var helper = new AudioStreamHelper();
+
+ test.chain.append([
+ function CHECK_ASSUMPTIONS() {
+ is(test.pcLocal.localMediaElements.length, 1,
+ "pcLocal should have one media element");
+ is(test.pcRemote.remoteMediaElements.length, 1,
+ "pcRemote should have one media element");
+ is(test.pcLocal._pc.getLocalStreams().length, 1,
+ "pcLocal should have one stream");
+ is(test.pcRemote._pc.getRemoteStreams().length, 1,
+ "pcRemote should have one stream");
+ },
+ function CHECK_AUDIO() {
+ return Promise.resolve()
+ .then(() => info("Checking local audio enabled"))
+ .then(() => helper.checkAudioFlowing(test.pcLocal._pc.getLocalStreams()[0]))
+ .then(() => info("Checking remote audio enabled"))
+ .then(() => helper.checkAudioFlowing(test.pcRemote._pc.getRemoteStreams()[0]))
+
+ .then(() => test.pcLocal._pc.getLocalStreams()[0].getAudioTracks()[0].enabled = false)
+
+ .then(() => info("Checking local audio disabled"))
+ .then(() => helper.checkAudioNotFlowing(test.pcLocal._pc.getLocalStreams()[0]))
+ .then(() => info("Checking remote audio disabled"))
+ .then(() => helper.checkAudioNotFlowing(test.pcRemote._pc.getRemoteStreams()[0]))
+ }
+ ]);
+
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ test.setMediaConstraints([{audio: true}],
+ []);
+ return test.pcLocal.getAllUserMedia([{audio: true}]);
+ },
+ ]
+ );
+
+ test.chain.append([
+ function CHECK_ASSUMPTIONS2() {
+ is(test.pcLocal.localMediaElements.length, 2,
+ "pcLocal should have two media elements");
+ is(test.pcRemote.remoteMediaElements.length, 2,
+ "pcRemote should have two media elements");
+ is(test.pcLocal._pc.getLocalStreams().length, 2,
+ "pcLocal should have two streams");
+ is(test.pcRemote._pc.getRemoteStreams().length, 2,
+ "pcRemote should have two streams");
+ },
+ function RE_CHECK_AUDIO() {
+ return Promise.resolve()
+ .then(() => info("Checking local audio enabled"))
+ .then(() => helper.checkAudioNotFlowing(test.pcLocal._pc.getLocalStreams()[0]))
+ .then(() => info("Checking remote audio enabled"))
+ .then(() => helper.checkAudioNotFlowing(test.pcRemote._pc.getRemoteStreams()[0]))
+
+ .then(() => info("Checking local2 audio enabled"))
+ .then(() => helper.checkAudioFlowing(test.pcLocal._pc.getLocalStreams()[1]))
+ .then(() => info("Checking remote2 audio enabled"))
+ .then(() => helper.checkAudioFlowing(test.pcRemote._pc.getRemoteStreams()[1]))
+
+ .then(() => test.pcLocal._pc.getLocalStreams()[1].getAudioTracks()[0].enabled = false)
+ .then(() => test.pcLocal._pc.getLocalStreams()[0].getAudioTracks()[0].enabled = true)
+
+ .then(() => info("Checking local2 audio disabled"))
+ .then(() => helper.checkAudioNotFlowing(test.pcLocal._pc.getLocalStreams()[1]))
+ .then(() => info("Checking remote2 audio disabled"))
+ .then(() => helper.checkAudioNotFlowing(test.pcRemote._pc.getRemoteStreams()[1]))
+
+ .then(() => info("Checking local audio enabled"))
+ .then(() => helper.checkAudioFlowing(test.pcLocal._pc.getLocalStreams()[0]))
+ .then(() => info("Checking remote audio enabled"))
+ .then(() => helper.checkAudioFlowing(test.pcRemote._pc.getRemoteStreams()[0]))
+ }
+ ]);
+
+ test.setMediaConstraints([{audio: true}], []);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html b/dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html
new file mode 100644
index 000000000..4aeb5e7ed
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1166832",
+ title: "Renegotiation: verify video after renegotiation"
+ });
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+
+ var h1 = new CaptureStreamTestHelper2D(50, 50);
+ var canvas1 = h1.createAndAppendElement('canvas', 'source_canvas1');
+ var stream1;
+ var vremote1;
+
+ var h2 = new CaptureStreamTestHelper2D(50, 50);
+ var canvas2;
+ var stream2;
+ var vremote2;
+
+ test.setMediaConstraints([{video: true}], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function DRAW_INITIAL_LOCAL_GREEN(test) {
+ h1.drawColor(canvas1, h1.green);
+ },
+ function PC_LOCAL_CANVAS_CAPTURESTREAM(test) {
+ stream1 = canvas1.captureStream(0);
+ test.pcLocal.attachLocalStream(stream1);
+ }
+ ]);
+
+ test.chain.append([
+ function FIND_REMOTE_VIDEO() {
+ vremote1 = test.pcRemote.remoteMediaElements[0];
+ ok(!!vremote1, "Should have remote video element for pcRemote");
+ },
+ function WAIT_FOR_REMOTE_GREEN() {
+ return h1.waitForPixelColor(vremote1, h1.green, 128,
+ "pcRemote's remote should become green");
+ },
+ function DRAW_LOCAL_RED() {
+ // After requesting a frame it will be captured at the time of next render.
+ // Next render will happen at next stable state, at the earliest,
+ // i.e., this order of `requestFrame(); draw();` should work.
+ stream1.requestFrame();
+ h1.drawColor(canvas1, h1.red);
+ },
+ function WAIT_FOR_REMOTE_RED() {
+ return h1.waitForPixelColor(vremote1, h1.red, 128,
+ "pcRemote's remote should become red");
+ }
+ ]);
+
+ addRenegotiation(test.chain,
+ [
+ function PC_LOCAL_ADD_SECOND_STREAM(test) {
+ canvas2 = h2.createAndAppendElement('canvas', 'source_canvas2');
+ h2.drawColor(canvas2, h2.blue);
+ stream2 = canvas2.captureStream(0);
+
+ // can't use test.pcLocal.getAllUserMedia([{video: true}]);
+ // because it doesn't let us substitute the capture stream
+ test.pcLocal.attachLocalStream(stream2);
+ }
+ ]
+ );
+
+ test.chain.append([
+ function FIND_REMOTE2_VIDEO() {
+ vremote2 = test.pcRemote.remoteMediaElements[1];
+ ok(!!vremote2, "Should have remote2 video element for pcRemote");
+ },
+ function WAIT_FOR_REMOTE2_BLUE() {
+ return h2.waitForPixelColor(vremote2, h2.blue, 128,
+ "pcRemote's remote2 should become blue");
+ },
+ function DRAW_NEW_LOCAL_GREEN(test) {
+ stream1.requestFrame();
+ h1.drawColor(canvas1, h1.green);
+ },
+ function WAIT_FOR_REMOTE1_GREEN() {
+ return h1.waitForPixelColor(vremote1, h1.green, 128,
+ "pcRemote's remote1 should become green");
+ }
+ ]);
+
+ test.run();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html b/dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html
new file mode 100644
index 000000000..fb77c332f
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="sdpUtils.js"></script>
+ <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1213773",
+ title: "Renegotiation: answerer uses a=inactive for video"
+ });
+
+ var test;
+ runNetworkTest(function (options) {
+ var helper;
+
+ test = new PeerConnectionTest(options);
+
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_CANVAS_CAPTURESTREAM(test) {
+ helper = new VideoStreamHelper();
+ test.pcLocal.attachLocalStream(helper.stream());
+ }
+ ]);
+
+ test.chain.append([
+ function PC_REMOTE_WAIT_FOR_FRAMES() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.waitForFrames(vremote);
+ }
+ ]);
+
+ addRenegotiation(test.chain, []);
+
+ test.chain.insertAfter("PC_LOCAL_GET_ANSWER", [
+ function PC_LOCAL_REWRITE_REMOTE_SDP_INACTIVE(test) {
+ test._remote_answer.sdp =
+ sdputils.setAllMsectionsInactive(test._remote_answer.sdp);
+ }
+ ], false, 1);
+
+ test.chain.append([
+ function PC_REMOTE_ENSURE_NO_FRAMES() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.verifyNoFrames(vremote);
+ },
+ ]);
+
+ test.chain.remove("PC_REMOTE_CHECK_STATS", 1);
+ test.chain.remove("PC_LOCAL_CHECK_STATS", 1);
+
+ addRenegotiation(test.chain, []);
+
+ test.chain.append([
+ function PC_REMOTE_WAIT_FOR_FRAMES_2() {
+ var vremote = test.pcRemote.remoteMediaElements[0];
+ ok(vremote, "Should have remote video element for pcRemote");
+ return helper.waitForFrames(vremote);
+ }
+ ]);
+
+ test.setMediaConstraints([{video: true}], []);
+ test.run();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_peerConnection_webAudio.html b/dom/media/tests/mochitest/test_peerConnection_webAudio.html
new file mode 100644
index 000000000..ffe7ed49d
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_webAudio.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+createHTML({
+ bug: "1081819",
+ title: "WebAudio on both input and output side of peerconnection"
+});
+
+// This tests WebAudio (a 700Hz OscillatorNode) as input to a PeerConnection.
+// It also tests that a PeerConnection works as input to WebAudio as the remote
+// stream is connected to an AnalyserNode and compared to the source node.
+
+runNetworkTest(function() {
+ var test = new PeerConnectionTest();
+ test.audioContext = new AudioContext();
+ test.setMediaConstraints([{audio: true}], []);
+ test.chain.replace("PC_LOCAL_GUM", [
+ function PC_LOCAL_WEBAUDIO_SOURCE(test) {
+ var oscillator = test.audioContext.createOscillator();
+ oscillator.type = 'sine';
+ oscillator.frequency.value = 700;
+ oscillator.start();
+ var dest = test.audioContext.createMediaStreamDestination();
+ oscillator.connect(dest);
+ test.pcLocal.attachLocalStream(dest.stream);
+ }
+ ]);
+ test.chain.append([
+ function CHECK_AUDIO_FLOW(test) {
+ return test.pcRemote.checkReceivingToneFrom(test.audioContext, test.pcLocal);
+ }
+ ]);
+ test.run();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/test_selftest.html b/dom/media/tests/mochitest/test_selftest.html
new file mode 100644
index 000000000..e755939a2
--- /dev/null
+++ b/dom/media/tests/mochitest/test_selftest.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+ createHTML({
+ title: "Self-test of harness functions",
+ visible: true
+ });
+
+function TEST(test) {}
+
+var catcher = func => {
+ try {
+ func();
+ return null;
+ } catch (e) {
+ return e.message;
+ }
+};
+
+runNetworkTest(() => {
+ var test = new PeerConnectionTest();
+ test.setMediaConstraints([{video: true}], [{video: true}]);
+ is(catcher(() => test.chain.replace("PC_LOCAL_SET_LOCAL_DESCRIPTION", TEST)),
+ null, "test.chain.replace works");
+ is(catcher(() => test.chain.replace("FOO", TEST)),
+ "Unknown test: FOO", "test.chain.replace catches typos");
+ networkTestFinished();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/tests/mochitest/turnConfig.js b/dom/media/tests/mochitest/turnConfig.js
new file mode 100644
index 000000000..49e6b1c89
--- /dev/null
+++ b/dom/media/tests/mochitest/turnConfig.js
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* An example of how to specify two TURN server configs:
+ *
+ * Note: If turn URL uses FQDN rather then an IP address the TURN relay
+ * verification step in checkStatsIceConnectionType might fail.
+ *
+ * var turnServers = {
+ * local: { iceServers: [{"username":"mozilla","credential":"mozilla","url":"turn:10.0.0.1"}] },
+ * remote: { iceServers: [{"username":"firefox","credential":"firefox","url":"turn:10.0.0.2"}] }
+ * };
+ */
+
+var turnServers = { };
diff --git a/dom/media/wave/WaveDecoder.cpp b/dom/media/wave/WaveDecoder.cpp
new file mode 100644
index 000000000..b31191baa
--- /dev/null
+++ b/dom/media/wave/WaveDecoder.cpp
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WaveDemuxer.h"
+#include "MediaDecoderStateMachine.h"
+#include "WaveDecoder.h"
+#include "MediaFormatReader.h"
+#include "PDMFactory.h"
+
+namespace mozilla {
+
+MediaDecoder*
+WaveDecoder::Clone(MediaDecoderOwner* aOwner)
+{
+ return new WaveDecoder(aOwner);
+}
+
+MediaDecoderStateMachine*
+WaveDecoder::CreateStateMachine()
+{
+ return new MediaDecoderStateMachine(
+ this, new MediaFormatReader(this, new WAVDemuxer(GetResource())));
+}
+
+/* static */
+bool
+WaveDecoder::CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs)
+{
+ if (!IsWaveEnabled()) {
+ return false;
+ }
+ if (aType.EqualsASCII("audio/wave") || aType.EqualsASCII("audio/x-wav") ||
+ aType.EqualsASCII("audio/wav") || aType.EqualsASCII("audio/x-pn-wav")) {
+ return (aCodecs.IsEmpty() || aCodecs.EqualsASCII("1") ||
+ aCodecs.EqualsASCII("6") || aCodecs.EqualsASCII("7"));
+ }
+
+ return false;
+}
+
+} // namespace mozilla
diff --git a/dom/media/wave/WaveDecoder.h b/dom/media/wave/WaveDecoder.h
new file mode 100644
index 000000000..4ed61ce85
--- /dev/null
+++ b/dom/media/wave/WaveDecoder.h
@@ -0,0 +1,26 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(WaveDecoder_h_)
+#define WaveDecoder_h_
+
+#include "MediaDecoder.h"
+
+namespace mozilla {
+
+class WaveDecoder : public MediaDecoder {
+public:
+ // MediaDecoder interface.
+ explicit WaveDecoder(MediaDecoderOwner* aOwner) : MediaDecoder(aOwner) {}
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override;
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ static bool CanHandleMediaType(const nsACString& aType,
+ const nsAString& aCodecs);
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/wave/WaveDemuxer.cpp b/dom/media/wave/WaveDemuxer.cpp
new file mode 100644
index 000000000..387a75675
--- /dev/null
+++ b/dom/media/wave/WaveDemuxer.cpp
@@ -0,0 +1,898 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WaveDemuxer.h"
+
+#include <inttypes.h>
+#include <algorithm>
+
+#include "mozilla/Assertions.h"
+#include "mozilla/EndianUtils.h"
+#include "nsAutoPtr.h"
+#include "VideoUtils.h"
+#include "TimeUnits.h"
+#include "prenv.h"
+
+using mozilla::media::TimeUnit;
+using mozilla::media::TimeIntervals;
+using mp4_demuxer::ByteReader;
+
+namespace mozilla {
+
+// WAVDemuxer
+
+WAVDemuxer::WAVDemuxer(MediaResource* aSource)
+ : mSource(aSource)
+{
+}
+
+bool
+WAVDemuxer::InitInternal()
+{
+ if (!mTrackDemuxer) {
+ mTrackDemuxer = new WAVTrackDemuxer(mSource);
+ }
+ return mTrackDemuxer->Init();
+}
+
+RefPtr<WAVDemuxer::InitPromise>
+WAVDemuxer::Init()
+{
+ if (!InitInternal()) {
+ return InitPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+bool
+WAVDemuxer::HasTrackType(TrackInfo::TrackType aType) const
+{
+ return aType == TrackInfo::kAudioTrack;
+}
+
+uint32_t
+WAVDemuxer::GetNumberTracks(TrackInfo::TrackType aType) const
+{
+ return aType == TrackInfo::kAudioTrack ? 1u : 0u;
+}
+
+already_AddRefed<MediaTrackDemuxer>
+WAVDemuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber)
+{
+ if (!mTrackDemuxer) {
+ return nullptr;
+ }
+ return RefPtr<WAVTrackDemuxer>(mTrackDemuxer).forget();
+}
+
+bool
+WAVDemuxer::IsSeekable() const
+{
+ return true;
+}
+
+// WAVTrackDemuxer
+
+WAVTrackDemuxer::WAVTrackDemuxer(MediaResourceIndex aSource)
+ : mSource(aSource)
+ , mOffset(0)
+ , mFirstChunkOffset(0)
+ , mNumParsedChunks(0)
+ , mChunkIndex(0)
+ , mTotalChunkLen(0)
+ , mSamplesPerChunk(0)
+ , mSamplesPerSecond(0)
+ , mChannels(0)
+{
+ Reset();
+}
+
+bool
+WAVTrackDemuxer::Init()
+{
+ Reset();
+ FastSeek(TimeUnit());
+
+ if (!mInfo) {
+ mInfo = MakeUnique<AudioInfo>();
+ }
+
+ if (!RIFFParserInit()) {
+ return false;
+ }
+
+ while (true) {
+ if (!HeaderParserInit()) {
+ return false;
+ }
+
+ uint32_t aChunkName = mHeaderParser.GiveHeader().ChunkName();
+ uint32_t aChunkSize = mHeaderParser.GiveHeader().ChunkSize();
+
+ if (aChunkName == FRMT_CODE) {
+ if (!FmtChunkParserInit()) {
+ return false;
+ }
+ } else if (aChunkName == LIST_CODE) {
+ mHeaderParser.Reset();
+ uint64_t endOfListChunk = static_cast<uint64_t>(mOffset) + aChunkSize;
+ if (endOfListChunk > UINT32_MAX) {
+ return false;
+ }
+ if (!ListChunkParserInit(aChunkSize)) {
+ mOffset = endOfListChunk;
+ }
+ } else if (aChunkName == DATA_CODE) {
+ mDataLength = aChunkSize;
+ if (mFirstChunkOffset != mOffset) {
+ mFirstChunkOffset = mOffset;
+ }
+ break;
+ } else {
+ mOffset += aChunkSize; // Skip other irrelevant chunks.
+ }
+ if (mOffset & 1) {
+ // Wave files are 2-byte aligned so we need to round up
+ mOffset += 1;
+ }
+ mHeaderParser.Reset();
+ }
+
+ if (mDataLength > StreamLength() - mFirstChunkOffset) {
+ mDataLength = StreamLength() - mFirstChunkOffset;
+ }
+
+ mSamplesPerSecond = mFmtParser.FmtChunk().SampleRate();
+ mChannels = mFmtParser.FmtChunk().Channels();
+ mSampleFormat = mFmtParser.FmtChunk().SampleFormat();
+ if (!mSamplesPerSecond || !mChannels || !mSampleFormat) {
+ return false;
+ }
+ mSamplesPerChunk = DATA_CHUNK_SIZE * 8 / mChannels / mSampleFormat;
+
+ mInfo->mRate = mSamplesPerSecond;
+ mInfo->mChannels = mChannels;
+ mInfo->mBitDepth = mSampleFormat;
+ mInfo->mProfile = mFmtParser.FmtChunk().WaveFormat() & 0x00FF;
+ mInfo->mExtendedProfile = (mFmtParser.FmtChunk().WaveFormat() & 0xFF00) >> 8;
+ mInfo->mMimeType = "audio/wave; codecs=";
+ mInfo->mMimeType.AppendInt(mFmtParser.FmtChunk().WaveFormat());
+ mInfo->mDuration = Duration().ToMicroseconds();
+
+ return !!(mInfo->mDuration);
+}
+
+bool
+WAVTrackDemuxer::RIFFParserInit()
+{
+ RefPtr<MediaRawData> riffHeader = GetFileHeader(FindRIFFHeader());
+ if (!riffHeader) {
+ return false;
+ }
+ ByteReader RIFFReader(riffHeader->Data(), 12);
+ mRIFFParser.Parse(RIFFReader);
+ return mRIFFParser.RiffHeader().IsValid(11);
+}
+
+bool
+WAVTrackDemuxer::HeaderParserInit()
+{
+ RefPtr<MediaRawData> header = GetFileHeader(FindChunkHeader());
+ if (!header) {
+ return false;
+ }
+ ByteReader HeaderReader(header->Data(), 8);
+ mHeaderParser.Parse(HeaderReader);
+ return true;
+}
+
+bool
+WAVTrackDemuxer::FmtChunkParserInit()
+{
+ RefPtr<MediaRawData> fmtChunk = GetFileHeader(FindFmtChunk());
+ if (!fmtChunk) {
+ return false;
+ }
+ ByteReader fmtReader(fmtChunk->Data(), mHeaderParser.GiveHeader().ChunkSize());
+ mFmtParser.Parse(fmtReader);
+ return true;
+}
+
+bool
+WAVTrackDemuxer::ListChunkParserInit(uint32_t aChunkSize)
+{
+ uint32_t bytesRead = 0;
+
+ RefPtr<MediaRawData> infoTag = GetFileHeader(FindInfoTag());
+ if (!infoTag) {
+ return false;
+ }
+ ByteReader infoTagReader(infoTag->Data(), 4);
+ if (!infoTagReader.CanRead32() || infoTagReader.ReadU32() != INFO_CODE) {
+ return false;
+ }
+
+ bytesRead += 4;
+
+ while (bytesRead < aChunkSize) {
+ if (!HeaderParserInit()) {
+ return false;
+ }
+
+ bytesRead += 8;
+
+ uint32_t id = mHeaderParser.GiveHeader().ChunkName();
+ uint32_t length = mHeaderParser.GiveHeader().ChunkSize();
+
+ // SubChunk Length Cannot Exceed List Chunk length.
+ if (length > aChunkSize - bytesRead) {
+ length = aChunkSize - bytesRead;
+ }
+
+ MediaByteRange mRange = { mOffset, mOffset + length };
+ RefPtr<MediaRawData> mChunkData = GetFileHeader(mRange);
+ if (!mChunkData) {
+ return false;
+ }
+
+ const char* rawData = reinterpret_cast<const char*>(mChunkData->Data());
+
+ nsCString val(rawData, length);
+ if (length > 0 && val[length - 1] == '\0') {
+ val.SetLength(length - 1);
+ }
+
+ if (length % 2) {
+ mOffset += 1;
+ length += length % 2;
+ }
+
+ bytesRead += length;
+
+ if (!IsUTF8(val)) {
+ mHeaderParser.Reset();
+ continue;
+ }
+
+ switch (id) {
+ case 0x49415254: // IART
+ mInfo->mTags.AppendElement(MetadataTag(NS_LITERAL_CSTRING("artist"), val));
+ break;
+ case 0x49434d54: // ICMT
+ mInfo->mTags.AppendElement(MetadataTag(NS_LITERAL_CSTRING("comments"), val));
+ break;
+ case 0x49474e52: // IGNR
+ mInfo->mTags.AppendElement(MetadataTag(NS_LITERAL_CSTRING("genre"), val));
+ break;
+ case 0x494e414d: // INAM
+ mInfo->mTags.AppendElement(MetadataTag(NS_LITERAL_CSTRING("name"), val));
+ break;
+ }
+
+ mHeaderParser.Reset();
+ }
+ return true;
+}
+
+media::TimeUnit
+WAVTrackDemuxer::SeekPosition() const
+{
+ TimeUnit pos = Duration(mChunkIndex);
+ if (Duration() > TimeUnit()) {
+ pos = std::min(Duration(), pos);
+ }
+ return pos;
+}
+
+RefPtr<MediaRawData>
+WAVTrackDemuxer::DemuxSample()
+{
+ return GetNextChunk(FindNextChunk());
+}
+
+UniquePtr<TrackInfo>
+WAVTrackDemuxer::GetInfo() const
+{
+ return mInfo->Clone();
+}
+
+RefPtr<WAVTrackDemuxer::SeekPromise>
+WAVTrackDemuxer::Seek(TimeUnit aTime)
+{
+ FastSeek(aTime);
+ const TimeUnit seekTime = ScanUntil(aTime);
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+}
+
+TimeUnit
+WAVTrackDemuxer::FastSeek(const TimeUnit& aTime)
+{
+ if (aTime.ToMicroseconds()) {
+ mChunkIndex = ChunkIndexFromTime(aTime);
+ } else {
+ mChunkIndex = 0;
+ }
+
+ mOffset = OffsetFromChunkIndex(mChunkIndex);
+
+ if (mOffset > mFirstChunkOffset && StreamLength() > 0) {
+ mOffset = std::min(StreamLength() - 1, mOffset);
+ }
+
+ return Duration(mChunkIndex);
+}
+
+TimeUnit
+WAVTrackDemuxer::ScanUntil(const TimeUnit& aTime)
+{
+ if (!aTime.ToMicroseconds()) {
+ return FastSeek(aTime);
+ }
+
+ if (Duration(mChunkIndex) > aTime) {
+ FastSeek(aTime);
+ }
+
+ return SeekPosition();
+}
+
+RefPtr<WAVTrackDemuxer::SamplesPromise>
+WAVTrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ MOZ_ASSERT(aNumSamples);
+
+ RefPtr<SamplesHolder> datachunks = new SamplesHolder();
+
+ while (aNumSamples--) {
+ RefPtr<MediaRawData> datachunk = GetNextChunk(FindNextChunk());
+ if (!datachunk) {
+ break;
+ }
+ datachunks->mSamples.AppendElement(datachunk);
+ }
+
+ if (datachunks->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(
+ NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ }
+
+ return SamplesPromise::CreateAndResolve(datachunks, __func__);
+}
+
+void
+WAVTrackDemuxer::Reset()
+{
+ FastSeek(TimeUnit());
+ mParser.Reset();
+ mHeaderParser.Reset();
+ mRIFFParser.Reset();
+ mFmtParser.Reset();
+}
+
+RefPtr<WAVTrackDemuxer::SkipAccessPointPromise>
+WAVTrackDemuxer::SkipToNextRandomAccessPoint(TimeUnit aTimeThreshold)
+{
+ return SkipAccessPointPromise::CreateAndReject(
+ SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__);
+}
+
+int64_t
+WAVTrackDemuxer::GetResourceOffset() const
+{
+ return mOffset;
+}
+
+TimeIntervals
+WAVTrackDemuxer::GetBuffered()
+{
+ TimeUnit duration = Duration();
+
+ if (duration <= TimeUnit()) {
+ return TimeIntervals();
+ }
+
+ AutoPinned<MediaResource> stream(mSource.GetResource());
+ return GetEstimatedBufferedTimeRanges(stream, duration.ToMicroseconds());
+}
+
+int64_t
+WAVTrackDemuxer::StreamLength() const
+{
+ return mSource.GetLength();
+}
+
+TimeUnit
+WAVTrackDemuxer::Duration() const
+{
+ if (!mDataLength ||!mChannels || !mSampleFormat) {
+ return TimeUnit();
+ }
+
+ int64_t numSamples =
+ static_cast<int64_t>(mDataLength) * 8 / mChannels / mSampleFormat;
+
+ int64_t numUSeconds = USECS_PER_S * numSamples / mSamplesPerSecond;
+
+ if (USECS_PER_S * numSamples % mSamplesPerSecond > mSamplesPerSecond / 2) {
+ numUSeconds++;
+ }
+
+ return TimeUnit::FromMicroseconds(numUSeconds);
+}
+
+TimeUnit
+WAVTrackDemuxer::Duration(int64_t aNumDataChunks) const
+{
+ if (!mSamplesPerSecond || !mSamplesPerChunk) {
+ return TimeUnit();
+ }
+ const double usPerDataChunk = USECS_PER_S *
+ static_cast<double>(mSamplesPerChunk) /
+ mSamplesPerSecond;
+ return TimeUnit::FromMicroseconds(aNumDataChunks * usPerDataChunk);
+}
+
+TimeUnit
+WAVTrackDemuxer::DurationFromBytes(uint32_t aNumBytes) const
+{
+ if (!mSamplesPerSecond || !mChannels || !mSampleFormat) {
+ return TimeUnit();
+ }
+
+ int64_t numSamples = aNumBytes * 8 / mChannels / mSampleFormat;
+
+ int64_t numUSeconds = USECS_PER_S * numSamples / mSamplesPerSecond;
+
+ if (USECS_PER_S * numSamples % mSamplesPerSecond > mSamplesPerSecond / 2) {
+ numUSeconds++;
+ }
+
+ return TimeUnit::FromMicroseconds(numUSeconds);
+}
+
+MediaByteRange
+WAVTrackDemuxer::FindNextChunk()
+{
+ if (mOffset + DATA_CHUNK_SIZE < mFirstChunkOffset + mDataLength) {
+ return { mOffset, mOffset + DATA_CHUNK_SIZE };
+ } else {
+ return { mOffset, mFirstChunkOffset + mDataLength };
+ }
+}
+
+MediaByteRange
+WAVTrackDemuxer::FindChunkHeader()
+{
+ return { mOffset, mOffset + CHUNK_HEAD_SIZE };
+}
+
+MediaByteRange
+WAVTrackDemuxer::FindRIFFHeader()
+{
+ return { mOffset, mOffset + RIFF_CHUNK_SIZE };
+}
+
+MediaByteRange
+WAVTrackDemuxer::FindFmtChunk()
+{
+ return { mOffset, mOffset + mHeaderParser.GiveHeader().ChunkSize() };
+}
+
+MediaByteRange
+WAVTrackDemuxer::FindListChunk()
+{
+ return { mOffset, mOffset + mHeaderParser.GiveHeader().ChunkSize() };
+}
+
+MediaByteRange
+WAVTrackDemuxer::FindInfoTag()
+{
+ return { mOffset, mOffset + 4 };
+}
+
+bool
+WAVTrackDemuxer::SkipNextChunk(const MediaByteRange& aRange)
+{
+ UpdateState(aRange);
+ return true;
+}
+
+already_AddRefed<MediaRawData>
+WAVTrackDemuxer::GetNextChunk(const MediaByteRange& aRange)
+{
+ if (!aRange.Length()) {
+ return nullptr;
+ }
+
+ RefPtr<MediaRawData> datachunk = new MediaRawData();
+ datachunk->mOffset = aRange.mStart;
+
+ nsAutoPtr<MediaRawDataWriter> chunkWriter(datachunk->CreateWriter());
+ if (!chunkWriter->SetSize(aRange.Length())) {
+ return nullptr;
+ }
+
+ const uint32_t read = Read(chunkWriter->Data(),
+ datachunk->mOffset,
+ datachunk->Size());
+
+ if (read != aRange.Length()) {
+ return nullptr;
+ }
+
+ UpdateState(aRange);
+ ++mNumParsedChunks;
+ ++mChunkIndex;
+
+ datachunk->mTime = Duration(mChunkIndex - 1).ToMicroseconds();
+
+ if (static_cast<uint32_t>(mChunkIndex) * DATA_CHUNK_SIZE < mDataLength) {
+ datachunk->mDuration = Duration(1).ToMicroseconds();
+ } else {
+ uint32_t mBytesRemaining =
+ mDataLength - mChunkIndex * DATA_CHUNK_SIZE;
+ datachunk->mDuration = DurationFromBytes(mBytesRemaining).ToMicroseconds();
+ }
+ datachunk->mTimecode = datachunk->mTime;
+ datachunk->mKeyframe = true;
+
+ MOZ_ASSERT(datachunk->mTime >= 0);
+ MOZ_ASSERT(datachunk->mDuration >= 0);
+
+ return datachunk.forget();
+}
+
+already_AddRefed<MediaRawData>
+WAVTrackDemuxer::GetFileHeader(const MediaByteRange& aRange)
+{
+ if (!aRange.Length()) {
+ return nullptr;
+ }
+
+ RefPtr<MediaRawData> fileHeader = new MediaRawData();
+ fileHeader->mOffset = aRange.mStart;
+
+ nsAutoPtr<MediaRawDataWriter> headerWriter(fileHeader->CreateWriter());
+ if (!headerWriter->SetSize(aRange.Length())) {
+ return nullptr;
+ }
+
+ const uint32_t read = Read(headerWriter->Data(),
+ fileHeader->mOffset,
+ fileHeader->Size());
+
+ if (read != aRange.Length()) {
+ return nullptr;
+ }
+
+ UpdateState(aRange);
+
+ return fileHeader.forget();
+}
+
+int64_t
+WAVTrackDemuxer::OffsetFromChunkIndex(int64_t aChunkIndex) const
+{
+ return mFirstChunkOffset + aChunkIndex * DATA_CHUNK_SIZE;
+}
+
+int64_t
+WAVTrackDemuxer::ChunkIndexFromOffset(int64_t aOffset) const
+{
+ int64_t chunkIndex = (aOffset - mFirstChunkOffset) / DATA_CHUNK_SIZE;
+ return std::max<int64_t>(0, chunkIndex);
+}
+
+int64_t
+WAVTrackDemuxer::ChunkIndexFromTime(const media::TimeUnit& aTime) const
+{
+ if (!mSamplesPerChunk || !mSamplesPerSecond) {
+ return 0;
+ }
+ int64_t chunkIndex =
+ (aTime.ToSeconds() * mSamplesPerSecond / mSamplesPerChunk) - 1;
+ return chunkIndex;
+}
+
+void
+WAVTrackDemuxer::UpdateState(const MediaByteRange& aRange)
+{
+ // Full chunk parsed, move offset to its end.
+ mOffset = aRange.mEnd;
+ mTotalChunkLen += aRange.Length();
+}
+
+int32_t
+WAVTrackDemuxer::Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize)
+{
+ const int64_t streamLen = StreamLength();
+ if (mInfo && streamLen > 0) {
+ aSize = std::min<int64_t>(aSize, streamLen - aOffset);
+ }
+ uint32_t read = 0;
+ const nsresult rv = mSource.ReadAt(aOffset,
+ reinterpret_cast<char*>(aBuffer),
+ static_cast<uint32_t>(aSize),
+ &read);
+ NS_ENSURE_SUCCESS(rv, 0);
+ return static_cast<int32_t>(read);
+}
+
+// RIFFParser
+
+uint32_t
+RIFFParser::Parse(ByteReader& aReader)
+{
+ while (aReader.CanRead8() && !mRiffHeader.ParseNext(aReader.ReadU8())) { }
+
+ if (mRiffHeader.IsValid()) {
+ return RIFF_CHUNK_SIZE;
+ }
+
+ return 0;
+}
+
+void
+RIFFParser::Reset()
+{
+ mRiffHeader.Reset();
+}
+
+const RIFFParser::RIFFHeader&
+RIFFParser::RiffHeader() const
+{
+ return mRiffHeader;
+}
+
+// RIFFParser::RIFFHeader
+
+RIFFParser::RIFFHeader::RIFFHeader()
+{
+ Reset();
+}
+
+void
+RIFFParser::RIFFHeader::Reset()
+{
+ memset(mRaw, 0, sizeof(mRaw));
+ mPos = 0;
+}
+
+bool
+RIFFParser::RIFFHeader::ParseNext(uint8_t c)
+{
+ if (!Update(c)) {
+ Reset();
+ if (!Update(c)) {
+ Reset();
+ }
+ }
+ return IsValid();
+}
+
+bool
+RIFFParser::RIFFHeader::IsValid(int aPos) const
+{
+ if (aPos > -1 && aPos < 4) {
+ return RIFF[aPos] == mRaw[aPos];
+ } else if (aPos > 7 && aPos < 12) {
+ return WAVE[aPos - 8] == mRaw[aPos];
+ } else {
+ return true;
+ }
+}
+
+bool
+RIFFParser::RIFFHeader::IsValid() const
+{
+ return mPos >= RIFF_CHUNK_SIZE;
+}
+
+bool
+RIFFParser::RIFFHeader::Update(uint8_t c)
+{
+ if (mPos < RIFF_CHUNK_SIZE) {
+ mRaw[mPos] = c;
+ }
+ return IsValid(mPos++);
+}
+
+// HeaderParser
+
+uint32_t
+HeaderParser::Parse(ByteReader& aReader)
+{
+ while (aReader.CanRead8() && !mHeader.ParseNext(aReader.ReadU8())) { }
+
+ if (mHeader.IsValid()) {
+ return CHUNK_HEAD_SIZE;
+ }
+
+ return 0;
+}
+
+void
+HeaderParser::Reset()
+{
+ mHeader.Reset();
+}
+
+const HeaderParser::ChunkHeader&
+HeaderParser::GiveHeader() const
+{
+ return mHeader;
+}
+
+// HeaderParser::ChunkHeader
+
+HeaderParser::ChunkHeader::ChunkHeader()
+{
+ Reset();
+}
+
+void
+HeaderParser::ChunkHeader::Reset()
+{
+ memset(mRaw, 0, sizeof(mRaw));
+ mPos = 0;
+}
+
+bool
+HeaderParser::ChunkHeader::ParseNext(uint8_t c)
+{
+ Update(c);
+ return IsValid();
+}
+
+bool
+HeaderParser::ChunkHeader::IsValid() const
+{
+ return mPos >= CHUNK_HEAD_SIZE;
+}
+
+uint32_t
+HeaderParser::ChunkHeader::ChunkName() const
+{
+ return ((mRaw[0] << 24) | (mRaw[1] << 16) |
+ (mRaw[2] << 8 ) | (mRaw[3]));
+}
+
+uint32_t
+HeaderParser::ChunkHeader::ChunkSize() const
+{
+ return ((mRaw[7] << 24) | (mRaw[6] << 16) |
+ (mRaw[5] << 8 ) | (mRaw[4]));
+}
+
+void
+HeaderParser::ChunkHeader::Update(uint8_t c)
+{
+ if (mPos < CHUNK_HEAD_SIZE) {
+ mRaw[mPos++] = c;
+ }
+}
+
+// FormatParser
+
+uint32_t
+FormatParser::Parse(ByteReader& aReader)
+{
+ while (aReader.CanRead8() && !mFmtChunk.ParseNext(aReader.ReadU8())) { }
+
+ if (mFmtChunk.IsValid()) {
+ return FMT_CHUNK_MIN_SIZE;
+ }
+
+ return 0;
+}
+
+void
+FormatParser::Reset()
+{
+ mFmtChunk.Reset();
+}
+
+const FormatParser::FormatChunk&
+FormatParser::FmtChunk() const
+{
+ return mFmtChunk;
+}
+
+// FormatParser::FormatChunk
+
+FormatParser::FormatChunk::FormatChunk()
+{
+ Reset();
+}
+
+void
+FormatParser::FormatChunk::Reset()
+{
+ memset(mRaw, 0, sizeof(mRaw));
+ mPos = 0;
+}
+
+uint16_t
+FormatParser::FormatChunk::WaveFormat() const
+{
+ return (mRaw[1] << 8) | (mRaw[0]);
+}
+
+uint16_t
+FormatParser::FormatChunk::Channels() const
+{
+ return (mRaw[3] << 8) | (mRaw[2]);
+}
+
+uint32_t
+FormatParser::FormatChunk::SampleRate() const
+{
+ return (mRaw[7] << 24) | (mRaw[6] << 16) |
+ (mRaw[5] << 8 ) | (mRaw[4]);
+}
+
+uint16_t
+FormatParser::FormatChunk::FrameSize() const
+{
+ return (mRaw[13] << 8) | (mRaw[12]);
+}
+
+uint16_t
+FormatParser::FormatChunk::SampleFormat() const
+{
+ return (mRaw[15] << 8) | (mRaw[14]);
+}
+
+bool
+FormatParser::FormatChunk::ParseNext(uint8_t c)
+{
+ Update(c);
+ return IsValid();
+}
+
+bool
+FormatParser::FormatChunk::IsValid() const
+{
+ return (FrameSize() == SampleRate() * Channels() / 8) &&
+ (mPos >= FMT_CHUNK_MIN_SIZE);
+}
+
+void
+FormatParser::FormatChunk::Update(uint8_t c)
+{
+ if (mPos < FMT_CHUNK_MIN_SIZE) {
+ mRaw[mPos++] = c;
+ }
+}
+
+// DataParser
+
+DataParser::DataParser()
+{
+}
+
+void
+DataParser::Reset()
+{
+ mChunk.Reset();
+}
+
+const DataParser::DataChunk&
+DataParser::CurrentChunk() const
+{
+ return mChunk;
+}
+
+// DataParser::DataChunk
+
+void
+DataParser::DataChunk::Reset()
+{
+ mPos = 0;
+}
+
+} // namespace mozilla
diff --git a/dom/media/wave/WaveDemuxer.h b/dom/media/wave/WaveDemuxer.h
new file mode 100644
index 000000000..3424e1630
--- /dev/null
+++ b/dom/media/wave/WaveDemuxer.h
@@ -0,0 +1,262 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * Licence, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WAV_DEMUXER_H_
+#define WAV_DEMUXER_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/Maybe.h"
+#include "MediaDataDemuxer.h"
+#include "MediaResource.h"
+#include "mp4_demuxer/ByteReader.h"
+
+using mp4_demuxer::ByteReader;
+
+namespace mozilla {
+
+static const uint32_t FRMT_CODE = 0x666d7420;
+static const uint32_t DATA_CODE = 0x64617461;
+static const uint32_t LIST_CODE = 0x4c495354;
+static const uint32_t INFO_CODE = 0x494e464f;
+
+static const uint8_t RIFF[4] = {'R', 'I', 'F', 'F'};
+static const uint8_t WAVE[4] = {'W', 'A', 'V', 'E'};
+
+static const uint16_t RIFF_CHUNK_SIZE = 12;
+static const uint16_t CHUNK_HEAD_SIZE = 8;
+static const uint16_t FMT_CHUNK_MIN_SIZE = 16;
+static const uint16_t DATA_CHUNK_SIZE = 768;
+
+class WAVTrackDemuxer;
+
+class WAVDemuxer : public MediaDataDemuxer {
+public:
+ // MediaDataDemuxer interface.
+ explicit WAVDemuxer(MediaResource* aSource);
+ RefPtr<InitPromise> Init() override;
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(
+ TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
+ bool IsSeekable() const override;
+
+private:
+ // Synchronous Initialization.
+ bool InitInternal();
+
+ MediaResourceIndex mSource;
+ RefPtr<WAVTrackDemuxer> mTrackDemuxer;
+};
+
+class RIFFParser {
+private:
+ class RIFFHeader;
+public:
+ const RIFFHeader& RiffHeader() const;
+
+ uint32_t Parse(ByteReader& aReader);
+
+ void Reset();
+
+private:
+ class RIFFHeader {
+ public:
+ RIFFHeader();
+ void Reset();
+
+ bool IsValid() const;
+ bool IsValid(int aPos) const;
+
+ bool ParseNext(uint8_t c);
+
+ private:
+ bool Update(uint8_t c);
+
+ uint8_t mRaw[RIFF_CHUNK_SIZE];
+
+ int mPos;
+ };
+
+ RIFFHeader mRiffHeader;
+};
+
+class HeaderParser {
+private:
+ class ChunkHeader;
+public:
+ const ChunkHeader& GiveHeader() const;
+
+ uint32_t Parse(ByteReader& aReader);
+
+ void Reset();
+
+private:
+ class ChunkHeader {
+ public:
+ ChunkHeader();
+ void Reset();
+
+ bool IsValid() const;
+
+ uint32_t ChunkName() const;
+ uint32_t ChunkSize() const;
+
+ bool ParseNext(uint8_t c);
+
+ private:
+ void Update(uint8_t c);
+
+ uint8_t mRaw[CHUNK_HEAD_SIZE];
+
+ int mPos;
+ };
+
+ ChunkHeader mHeader;
+};
+
+class FormatParser {
+private:
+ class FormatChunk;
+public:
+ const FormatChunk& FmtChunk() const;
+
+ uint32_t Parse(ByteReader& aReader);
+
+ void Reset();
+
+private:
+ class FormatChunk {
+ public:
+ FormatChunk();
+ void Reset();
+
+ uint16_t WaveFormat() const;
+ uint16_t Channels() const;
+ uint32_t SampleRate() const;
+ uint16_t FrameSize() const;
+ uint16_t SampleFormat() const;
+
+ bool IsValid() const;
+ bool ParseNext(uint8_t c);
+
+ private:
+ void Update(uint8_t c);
+
+ uint8_t mRaw[FMT_CHUNK_MIN_SIZE];
+
+ int mPos;
+ };
+
+ FormatChunk mFmtChunk;
+};
+
+class DataParser {
+private:
+ class DataChunk;
+public:
+ DataParser();
+
+ const DataChunk& CurrentChunk() const;
+
+ void Reset();
+
+private:
+ class DataChunk {
+ public:
+ void Reset();
+ private:
+ int mPos; // To Check Alignment
+ };
+
+ DataChunk mChunk;
+};
+
+class WAVTrackDemuxer : public MediaTrackDemuxer {
+public:
+ explicit WAVTrackDemuxer(MediaResourceIndex aSource);
+
+ bool Init();
+
+ int64_t StreamLength() const;
+
+ media::TimeUnit Duration() const;
+ media::TimeUnit Duration(int64_t aNumDataChunks) const;
+ media::TimeUnit DurationFromBytes(uint32_t aNumBytes) const;
+
+ media::TimeUnit SeekPosition() const;
+
+ RefPtr<MediaRawData> DemuxSample();
+
+ // MediaTrackDemuxer interface.
+ UniquePtr<TrackInfo> GetInfo() const override;
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples) override;
+ void Reset() override;
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(
+ media::TimeUnit aTimeThreshold) override;
+ int64_t GetResourceOffset() const override;
+ media::TimeIntervals GetBuffered() override;
+
+private:
+ ~WAVTrackDemuxer() {}
+
+ media::TimeUnit FastSeek(const media::TimeUnit& aTime);
+ media::TimeUnit ScanUntil(const media::TimeUnit& aTime);
+
+ MediaByteRange FindNextChunk();
+
+ MediaByteRange FindChunkHeader();
+ MediaByteRange FindRIFFHeader();
+ MediaByteRange FindFmtChunk();
+ MediaByteRange FindListChunk();
+ MediaByteRange FindInfoTag();
+
+ bool RIFFParserInit();
+ bool HeaderParserInit();
+ bool FmtChunkParserInit();
+ bool ListChunkParserInit(uint32_t aChunkSize);
+
+ bool SkipNextChunk(const MediaByteRange& aRange);
+
+ already_AddRefed<MediaRawData> GetNextChunk(const MediaByteRange& aRange);
+ already_AddRefed<MediaRawData> GetFileHeader(const MediaByteRange& aRange);
+
+ void UpdateState(const MediaByteRange& aRange);
+
+ int64_t OffsetFromChunkIndex(int64_t aChunkIndex) const;
+ int64_t ChunkIndexFromOffset(int64_t aOffet) const;
+ int64_t ChunkIndexFromTime(const media::TimeUnit& aTime) const;
+
+ int32_t Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize);
+
+ MediaResourceIndex mSource;
+
+ DataParser mParser;
+ RIFFParser mRIFFParser;
+ HeaderParser mHeaderParser;
+
+ FormatParser mFmtParser;
+ // ListChunkParser mListChunkParser;
+
+ int64_t mOffset;
+ int64_t mFirstChunkOffset;
+
+ uint32_t mNumParsedChunks;
+ int32_t mChunkIndex;
+
+ uint32_t mDataLength;
+ uint64_t mTotalChunkLen;
+
+ int32_t mSamplesPerChunk;
+ int32_t mSamplesPerSecond;
+
+ int32_t mChannels;
+ int32_t mSampleFormat;
+
+ UniquePtr<AudioInfo> mInfo;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/wave/moz.build b/dom/media/wave/moz.build
new file mode 100644
index 000000000..f91e8eaeb
--- /dev/null
+++ b/dom/media/wave/moz.build
@@ -0,0 +1,20 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'WaveDecoder.h',
+ 'WaveDemuxer.h',
+]
+
+UNIFIED_SOURCES += [
+ 'WaveDecoder.cpp',
+ 'WaveDemuxer.cpp',
+]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/webaudio/AlignedTArray.h b/dom/media/webaudio/AlignedTArray.h
new file mode 100644
index 000000000..afd2f1f48
--- /dev/null
+++ b/dom/media/webaudio/AlignedTArray.h
@@ -0,0 +1,121 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AlignedTArray_h__
+#define AlignedTArray_h__
+
+#include "mozilla/Alignment.h"
+#include "nsTArray.h"
+
+/**
+ * E: element type, must be a POD type.
+ * N: N bytes alignment for the first element, defaults to 32
+ * S: S bytes of inline storage
+ */
+template <typename E, int S, int N = 32>
+class AlignedAutoTArray : private AutoTArray<E, S + N>
+{
+ static_assert((N & (N-1)) == 0, "N must be power of 2");
+ typedef AutoTArray<E, S + N> base_type;
+public:
+ typedef E elem_type;
+ typedef typename base_type::size_type size_type;
+ typedef typename base_type::index_type index_type;
+
+ AlignedAutoTArray() {}
+ explicit AlignedAutoTArray(size_type capacity) : base_type(capacity + sExtra) {}
+ elem_type* Elements() { return getAligned(base_type::Elements()); }
+ const elem_type* Elements() const { return getAligned(base_type::Elements()); }
+ elem_type& operator[](index_type i) { return Elements()[i];}
+ const elem_type& operator[](index_type i) const { return Elements()[i]; }
+
+ void SetLength(size_type newLen)
+ {
+ base_type::SetLength(newLen + sExtra);
+ }
+
+ MOZ_MUST_USE
+ bool SetLength(size_type newLen, const mozilla::fallible_t&)
+ {
+ return base_type::SetLength(newLen + sExtra, mozilla::fallible);
+ }
+
+ size_type Length() const {
+ return base_type::Length() <= sExtra ? 0 : base_type::Length() - sExtra;
+ }
+
+ using base_type::ShallowSizeOfExcludingThis;
+ using base_type::ShallowSizeOfIncludingThis;
+
+private:
+ AlignedAutoTArray(const AlignedAutoTArray& other) = delete;
+ void operator=(const AlignedAutoTArray& other) = delete;
+
+ static const size_type sPadding = N <= MOZ_ALIGNOF(E) ? 0 : N - MOZ_ALIGNOF(E);
+ static const size_type sExtra = (sPadding + sizeof(E) - 1) / sizeof(E);
+
+ template <typename U>
+ static U* getAligned(U* p)
+ {
+ return reinterpret_cast<U*>(((uintptr_t)p + N - 1) & ~(N-1));
+ }
+};
+
+/**
+ * E: element type, must be a POD type.
+ * N: N bytes alignment for the first element, defaults to 32
+ */
+template <typename E, int N = 32>
+class AlignedTArray : private nsTArray_Impl<E, nsTArrayInfallibleAllocator>
+{
+ static_assert((N & (N-1)) == 0, "N must be power of 2");
+ typedef nsTArray_Impl<E, nsTArrayInfallibleAllocator> base_type;
+public:
+ typedef E elem_type;
+ typedef typename base_type::size_type size_type;
+ typedef typename base_type::index_type index_type;
+
+ AlignedTArray() {}
+ explicit AlignedTArray(size_type capacity) : base_type(capacity + sExtra) {}
+ elem_type* Elements() { return getAligned(base_type::Elements()); }
+ const elem_type* Elements() const { return getAligned(base_type::Elements()); }
+ elem_type& operator[](index_type i) { return Elements()[i];}
+ const elem_type& operator[](index_type i) const { return Elements()[i]; }
+
+ void SetLength(size_type newLen)
+ {
+ base_type::SetLength(newLen + sExtra);
+ }
+
+ MOZ_MUST_USE
+ bool SetLength(size_type newLen, const mozilla::fallible_t&)
+ {
+ return base_type::SetLength(newLen + sExtra, mozilla::fallible);
+ }
+
+ size_type Length() const {
+ return base_type::Length() <= sExtra ? 0 : base_type::Length() - sExtra;
+ }
+
+ using base_type::ShallowSizeOfExcludingThis;
+ using base_type::ShallowSizeOfIncludingThis;
+
+private:
+ AlignedTArray(const AlignedTArray& other) = delete;
+ void operator=(const AlignedTArray& other) = delete;
+
+ static const size_type sPadding = N <= MOZ_ALIGNOF(E) ? 0 : N - MOZ_ALIGNOF(E);
+ static const size_type sExtra = (sPadding + sizeof(E) - 1) / sizeof(E);
+
+ template <typename U>
+ static U* getAligned(U* p)
+ {
+ return reinterpret_cast<U*>(((uintptr_t)p + N - 1) & ~(N-1));
+ }
+};
+
+
+#endif // AlignedTArray_h__
diff --git a/dom/media/webaudio/AlignmentUtils.h b/dom/media/webaudio/AlignmentUtils.h
new file mode 100644
index 000000000..6b145a8ca
--- /dev/null
+++ b/dom/media/webaudio/AlignmentUtils.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AlignmentUtils_h__
+#define AlignmentUtils_h__
+
+#define IS_ALIGNED16(ptr) ((((uintptr_t)ptr + 15) & ~0x0F) == (uintptr_t)ptr)
+
+#ifdef DEBUG
+ #define ASSERT_ALIGNED16(ptr) \
+ MOZ_ASSERT(IS_ALIGNED16(ptr), \
+ #ptr " has to be aligned to a 16 byte boundary");
+#else
+ #define ASSERT_ALIGNED16(ptr)
+#endif
+
+#ifdef DEBUG
+ #define ASSERT_MULTIPLE16(v) \
+ MOZ_ASSERT(v % 16 == 0, #v " has to be a a multiple of 16");
+#else
+ #define ASSERT_MULTIPLE16(v)
+#endif
+
+#define ALIGNED16(ptr) (float*)(((uintptr_t)ptr + 15) & ~0x0F);
+
+#endif
diff --git a/dom/media/webaudio/AnalyserNode.cpp b/dom/media/webaudio/AnalyserNode.cpp
new file mode 100644
index 000000000..64c3cf4da
--- /dev/null
+++ b/dom/media/webaudio/AnalyserNode.cpp
@@ -0,0 +1,387 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/AnalyserNode.h"
+#include "mozilla/dom/AnalyserNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/PodOperations.h"
+
+namespace mozilla {
+
+static const uint32_t MAX_FFT_SIZE = 32768;
+static const size_t CHUNK_COUNT = MAX_FFT_SIZE >> WEBAUDIO_BLOCK_SIZE_BITS;
+static_assert(MAX_FFT_SIZE == CHUNK_COUNT * WEBAUDIO_BLOCK_SIZE,
+ "MAX_FFT_SIZE must be a multiple of WEBAUDIO_BLOCK_SIZE");
+static_assert((CHUNK_COUNT & (CHUNK_COUNT - 1)) == 0,
+ "CHUNK_COUNT must be power of 2 for remainder behavior");
+
+namespace dom {
+
+NS_IMPL_ISUPPORTS_INHERITED0(AnalyserNode, AudioNode)
+
+class AnalyserNodeEngine final : public AudioNodeEngine
+{
+ class TransferBuffer final : public Runnable
+ {
+ public:
+ TransferBuffer(AudioNodeStream* aStream,
+ const AudioChunk& aChunk)
+ : mStream(aStream)
+ , mChunk(aChunk)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<AnalyserNode> node =
+ static_cast<AnalyserNode*>(mStream->Engine()->NodeMainThread());
+ if (node) {
+ node->AppendChunk(mChunk);
+ }
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<AudioNodeStream> mStream;
+ AudioChunk mChunk;
+ };
+
+public:
+ explicit AnalyserNodeEngine(AnalyserNode* aNode)
+ : AudioNodeEngine(aNode)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+
+ virtual void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ *aOutput = aInput;
+
+ if (aInput.IsNull()) {
+ // If AnalyserNode::mChunks has only null chunks, then there is no need
+ // to send further null chunks.
+ if (mChunksToProcess == 0) {
+ return;
+ }
+
+ --mChunksToProcess;
+ if (mChunksToProcess == 0) {
+ aStream->ScheduleCheckForInactive();
+ }
+
+ } else {
+ // This many null chunks will be required to empty AnalyserNode::mChunks.
+ mChunksToProcess = CHUNK_COUNT;
+ }
+
+ RefPtr<TransferBuffer> transfer =
+ new TransferBuffer(aStream, aInput.AsAudioChunk());
+ NS_DispatchToMainThread(transfer);
+ }
+
+ virtual bool IsActive() const override
+ {
+ return mChunksToProcess != 0;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ uint32_t mChunksToProcess = 0;
+};
+
+AnalyserNode::AnalyserNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 1,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mAnalysisBlock(2048)
+ , mMinDecibels(-100.)
+ , mMaxDecibels(-30.)
+ , mSmoothingTimeConstant(.8)
+{
+ mStream = AudioNodeStream::Create(aContext,
+ new AnalyserNodeEngine(this),
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+
+ // Enough chunks must be recorded to handle the case of fftSize being
+ // increased to maximum immediately before getFloatTimeDomainData() is
+ // called, for example.
+ Unused << mChunks.SetLength(CHUNK_COUNT, fallible);
+
+ AllocateBuffer();
+}
+
+size_t
+AnalyserNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mAnalysisBlock.SizeOfExcludingThis(aMallocSizeOf);
+ amount += mChunks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mOutputBuffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+AnalyserNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+AnalyserNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AnalyserNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+AnalyserNode::SetFftSize(uint32_t aValue, ErrorResult& aRv)
+{
+ // Disallow values that are not a power of 2 and outside the [32,32768] range
+ if (aValue < 32 ||
+ aValue > MAX_FFT_SIZE ||
+ (aValue & (aValue - 1)) != 0) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+ if (FftSize() != aValue) {
+ mAnalysisBlock.SetFFTSize(aValue);
+ AllocateBuffer();
+ }
+}
+
+void
+AnalyserNode::SetMinDecibels(double aValue, ErrorResult& aRv)
+{
+ if (aValue >= mMaxDecibels) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+ mMinDecibels = aValue;
+}
+
+void
+AnalyserNode::SetMaxDecibels(double aValue, ErrorResult& aRv)
+{
+ if (aValue <= mMinDecibels) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+ mMaxDecibels = aValue;
+}
+
+void
+AnalyserNode::SetSmoothingTimeConstant(double aValue, ErrorResult& aRv)
+{
+ if (aValue < 0 || aValue > 1) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+ mSmoothingTimeConstant = aValue;
+}
+
+void
+AnalyserNode::GetFloatFrequencyData(const Float32Array& aArray)
+{
+ if (!FFTAnalysis()) {
+ // Might fail to allocate memory
+ return;
+ }
+
+ aArray.ComputeLengthAndData();
+
+ float* buffer = aArray.Data();
+ size_t length = std::min(size_t(aArray.Length()), mOutputBuffer.Length());
+
+ for (size_t i = 0; i < length; ++i) {
+ buffer[i] = WebAudioUtils::ConvertLinearToDecibels(mOutputBuffer[i], mMinDecibels);
+ }
+}
+
+void
+AnalyserNode::GetByteFrequencyData(const Uint8Array& aArray)
+{
+ if (!FFTAnalysis()) {
+ // Might fail to allocate memory
+ return;
+ }
+
+ const double rangeScaleFactor = 1.0 / (mMaxDecibels - mMinDecibels);
+
+ aArray.ComputeLengthAndData();
+
+ unsigned char* buffer = aArray.Data();
+ size_t length = std::min(size_t(aArray.Length()), mOutputBuffer.Length());
+
+ for (size_t i = 0; i < length; ++i) {
+ const double decibels = WebAudioUtils::ConvertLinearToDecibels(mOutputBuffer[i], mMinDecibels);
+ // scale down the value to the range of [0, UCHAR_MAX]
+ const double scaled = std::max(0.0, std::min(double(UCHAR_MAX),
+ UCHAR_MAX * (decibels - mMinDecibels) * rangeScaleFactor));
+ buffer[i] = static_cast<unsigned char>(scaled);
+ }
+}
+
+void
+AnalyserNode::GetFloatTimeDomainData(const Float32Array& aArray)
+{
+ aArray.ComputeLengthAndData();
+
+ float* buffer = aArray.Data();
+ size_t length = std::min(aArray.Length(), FftSize());
+
+ GetTimeDomainData(buffer, length);
+}
+
+void
+AnalyserNode::GetByteTimeDomainData(const Uint8Array& aArray)
+{
+ aArray.ComputeLengthAndData();
+
+ size_t length = std::min(aArray.Length(), FftSize());
+
+ AlignedTArray<float> tmpBuffer;
+ if (!tmpBuffer.SetLength(length, fallible)) {
+ return;
+ }
+
+ GetTimeDomainData(tmpBuffer.Elements(), length);
+
+ unsigned char* buffer = aArray.Data();
+ for (size_t i = 0; i < length; ++i) {
+ const float value = tmpBuffer[i];
+ // scale the value to the range of [0, UCHAR_MAX]
+ const float scaled = std::max(0.0f, std::min(float(UCHAR_MAX),
+ 128.0f * (value + 1.0f)));
+ buffer[i] = static_cast<unsigned char>(scaled);
+ }
+}
+
+bool
+AnalyserNode::FFTAnalysis()
+{
+ AlignedTArray<float> tmpBuffer;
+ size_t fftSize = FftSize();
+ if (!tmpBuffer.SetLength(fftSize, fallible)) {
+ return false;
+ }
+
+ float* inputBuffer = tmpBuffer.Elements();
+ GetTimeDomainData(inputBuffer, fftSize);
+ ApplyBlackmanWindow(inputBuffer, fftSize);
+ mAnalysisBlock.PerformFFT(inputBuffer);
+
+ // Normalize so than an input sine wave at 0dBfs registers as 0dBfs (undo FFT scaling factor).
+ const double magnitudeScale = 1.0 / fftSize;
+
+ for (uint32_t i = 0; i < mOutputBuffer.Length(); ++i) {
+ double scalarMagnitude = NS_hypot(mAnalysisBlock.RealData(i),
+ mAnalysisBlock.ImagData(i)) *
+ magnitudeScale;
+ mOutputBuffer[i] = mSmoothingTimeConstant * mOutputBuffer[i] +
+ (1.0 - mSmoothingTimeConstant) * scalarMagnitude;
+ }
+
+ return true;
+}
+
+void
+AnalyserNode::ApplyBlackmanWindow(float* aBuffer, uint32_t aSize)
+{
+ double alpha = 0.16;
+ double a0 = 0.5 * (1.0 - alpha);
+ double a1 = 0.5;
+ double a2 = 0.5 * alpha;
+
+ for (uint32_t i = 0; i < aSize; ++i) {
+ double x = double(i) / aSize;
+ double window = a0 - a1 * cos(2 * M_PI * x) + a2 * cos(4 * M_PI * x);
+ aBuffer[i] *= window;
+ }
+}
+
+bool
+AnalyserNode::AllocateBuffer()
+{
+ bool result = true;
+ if (mOutputBuffer.Length() != FrequencyBinCount()) {
+ if (!mOutputBuffer.SetLength(FrequencyBinCount(), fallible)) {
+ return false;
+ }
+ memset(mOutputBuffer.Elements(), 0, sizeof(float) * FrequencyBinCount());
+ }
+ return result;
+}
+
+void
+AnalyserNode::AppendChunk(const AudioChunk& aChunk)
+{
+ if (mChunks.Length() == 0) {
+ return;
+ }
+
+ ++mCurrentChunk;
+ mChunks[mCurrentChunk & (CHUNK_COUNT - 1)] = aChunk;
+}
+
+// Reads into aData the oldest aLength samples of the fftSize most recent
+// samples.
+void
+AnalyserNode::GetTimeDomainData(float* aData, size_t aLength)
+{
+ size_t fftSize = FftSize();
+ MOZ_ASSERT(aLength <= fftSize);
+
+ if (mChunks.Length() == 0) {
+ PodZero(aData, aLength);
+ return;
+ }
+
+ size_t readChunk =
+ mCurrentChunk - ((fftSize - 1) >> WEBAUDIO_BLOCK_SIZE_BITS);
+ size_t readIndex = (0 - fftSize) & (WEBAUDIO_BLOCK_SIZE - 1);
+ MOZ_ASSERT(readIndex == 0 || readIndex + fftSize == WEBAUDIO_BLOCK_SIZE);
+
+ for (size_t writeIndex = 0; writeIndex < aLength; ) {
+ const AudioChunk& chunk = mChunks[readChunk & (CHUNK_COUNT - 1)];
+ const size_t channelCount = chunk.ChannelCount();
+ size_t copyLength =
+ std::min<size_t>(aLength - writeIndex, WEBAUDIO_BLOCK_SIZE);
+ float* dataOut = &aData[writeIndex];
+
+ if (channelCount == 0) {
+ PodZero(dataOut, copyLength);
+ } else {
+ float scale = chunk.mVolume / channelCount;
+ { // channel 0
+ auto channelData =
+ static_cast<const float*>(chunk.mChannelData[0]) + readIndex;
+ AudioBufferCopyWithScale(channelData, scale, dataOut, copyLength);
+ }
+ for (uint32_t i = 1; i < channelCount; ++i) {
+ auto channelData =
+ static_cast<const float*>(chunk.mChannelData[i]) + readIndex;
+ AudioBufferAddWithScale(channelData, scale, dataOut, copyLength);
+ }
+ }
+
+ readChunk++;
+ writeIndex += copyLength;
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/AnalyserNode.h b/dom/media/webaudio/AnalyserNode.h
new file mode 100644
index 000000000..7fca5df6f
--- /dev/null
+++ b/dom/media/webaudio/AnalyserNode.h
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AnalyserNode_h_
+#define AnalyserNode_h_
+
+#include "AudioNode.h"
+#include "FFTBlock.h"
+#include "AlignedTArray.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class AnalyserNode final : public AudioNode
+{
+public:
+ explicit AnalyserNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void GetFloatFrequencyData(const Float32Array& aArray);
+ void GetByteFrequencyData(const Uint8Array& aArray);
+ void GetFloatTimeDomainData(const Float32Array& aArray);
+ void GetByteTimeDomainData(const Uint8Array& aArray);
+ uint32_t FftSize() const
+ {
+ return mAnalysisBlock.FFTSize();
+ }
+ void SetFftSize(uint32_t aValue, ErrorResult& aRv);
+ uint32_t FrequencyBinCount() const
+ {
+ return FftSize() / 2;
+ }
+ double MinDecibels() const
+ {
+ return mMinDecibels;
+ }
+ void SetMinDecibels(double aValue, ErrorResult& aRv);
+ double MaxDecibels() const
+ {
+ return mMaxDecibels;
+ }
+ void SetMaxDecibels(double aValue, ErrorResult& aRv);
+ double SmoothingTimeConstant() const
+ {
+ return mSmoothingTimeConstant;
+ }
+ void SetSmoothingTimeConstant(double aValue, ErrorResult& aRv);
+
+ virtual const char* NodeType() const override
+ {
+ return "AnalyserNode";
+ }
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ ~AnalyserNode() {}
+
+private:
+ friend class AnalyserNodeEngine;
+ void AppendChunk(const AudioChunk& aChunk);
+ bool AllocateBuffer();
+ bool FFTAnalysis();
+ void ApplyBlackmanWindow(float* aBuffer, uint32_t aSize);
+ void GetTimeDomainData(float* aData, size_t aLength);
+
+private:
+ FFTBlock mAnalysisBlock;
+ nsTArray<AudioChunk> mChunks;
+ double mMinDecibels;
+ double mMaxDecibels;
+ double mSmoothingTimeConstant;
+ size_t mCurrentChunk = 0;
+ AlignedTArray<float> mOutputBuffer;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioBlock.cpp b/dom/media/webaudio/AudioBlock.cpp
new file mode 100644
index 000000000..a8c714019
--- /dev/null
+++ b/dom/media/webaudio/AudioBlock.cpp
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioBlock.h"
+#include "AlignmentUtils.h"
+
+namespace mozilla {
+
+/**
+ * Heap-allocated buffer of channels of 128-sample float arrays, with
+ * threadsafe refcounting. Typically you would allocate one of these, fill it
+ * in, and then treat it as immutable while it's shared.
+ *
+ * Downstream references are accounted specially so that the creator of the
+ * buffer can reuse and modify its contents next iteration if other references
+ * are all downstream temporary references held by AudioBlock.
+ *
+ * We guarantee 16 byte alignment of the channel data.
+ */
+class AudioBlockBuffer final : public ThreadSharedObject {
+public:
+
+ virtual AudioBlockBuffer* AsAudioBlockBuffer() override { return this; };
+
+ float* ChannelData(uint32_t aChannel)
+ {
+ float* base = reinterpret_cast<float*>(((uintptr_t)(this + 1) + 15) & ~0x0F);
+ ASSERT_ALIGNED16(base);
+ return base + aChannel * WEBAUDIO_BLOCK_SIZE;
+ }
+
+ static already_AddRefed<AudioBlockBuffer> Create(uint32_t aChannelCount)
+ {
+ CheckedInt<size_t> size = WEBAUDIO_BLOCK_SIZE;
+ size *= aChannelCount;
+ size *= sizeof(float);
+ size += sizeof(AudioBlockBuffer);
+ size += 15; //padding for alignment
+ if (!size.isValid()) {
+ MOZ_CRASH();
+ }
+
+ void* m = moz_xmalloc(size.value());
+ RefPtr<AudioBlockBuffer> p = new (m) AudioBlockBuffer();
+ NS_ASSERTION((reinterpret_cast<char*>(p.get() + 1) - reinterpret_cast<char*>(p.get())) % 4 == 0,
+ "AudioBlockBuffers should be at least 4-byte aligned");
+ return p.forget();
+ }
+
+ // Graph thread only.
+ void DownstreamRefAdded() { ++mDownstreamRefCount; }
+ void DownstreamRefRemoved() {
+ MOZ_ASSERT(mDownstreamRefCount > 0);
+ --mDownstreamRefCount;
+ }
+ // Whether this is shared by any owners that are not downstream.
+ // Called only from owners with a reference that is not a downstream
+ // reference. Graph thread only.
+ bool HasLastingShares()
+ {
+ // mRefCnt is atomic and so reading its value is defined even when
+ // modifications may happen on other threads. mDownstreamRefCount is
+ // not modified on any other thread.
+ //
+ // If all other references are downstream references (managed on this, the
+ // graph thread), then other threads are not using this buffer and cannot
+ // add further references. This method can safely return false. The
+ // buffer contents can be modified.
+ //
+ // If there are other references that are not downstream references, then
+ // this method will return true. The buffer will be assumed to be still
+ // in use and so will not be reused.
+ nsrefcnt count = mRefCnt;
+ // This test is strictly less than because the caller has a reference
+ // that is not a downstream reference.
+ MOZ_ASSERT(mDownstreamRefCount < count);
+ return count != mDownstreamRefCount + 1;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ AudioBlockBuffer() {}
+ ~AudioBlockBuffer() override { MOZ_ASSERT(mDownstreamRefCount == 0); }
+
+ nsAutoRefCnt mDownstreamRefCount;
+};
+
+AudioBlock::~AudioBlock()
+{
+ ClearDownstreamMark();
+}
+
+void
+AudioBlock::SetBuffer(ThreadSharedObject* aNewBuffer)
+{
+ if (aNewBuffer == mBuffer) {
+ return;
+ }
+
+ ClearDownstreamMark();
+
+ mBuffer = aNewBuffer;
+
+ if (!aNewBuffer) {
+ return;
+ }
+
+ AudioBlockBuffer* buffer = aNewBuffer->AsAudioBlockBuffer();
+ if (buffer) {
+ buffer->DownstreamRefAdded();
+ mBufferIsDownstreamRef = true;
+ }
+}
+
+void
+AudioBlock::ClearDownstreamMark() {
+ if (mBufferIsDownstreamRef) {
+ mBuffer->AsAudioBlockBuffer()->DownstreamRefRemoved();
+ mBufferIsDownstreamRef = false;
+ }
+}
+
+bool
+AudioBlock::CanWrite() {
+ // If mBufferIsDownstreamRef is set then the buffer is not ours to use.
+ // It may be in use by another node which is not downstream.
+ return !mBufferIsDownstreamRef &&
+ !mBuffer->AsAudioBlockBuffer()->HasLastingShares();
+}
+
+void
+AudioBlock::AllocateChannels(uint32_t aChannelCount)
+{
+ MOZ_ASSERT(mDuration == WEBAUDIO_BLOCK_SIZE);
+
+ if (mBufferIsDownstreamRef) {
+ // This is not our buffer to re-use.
+ ClearDownstreamMark();
+ } else if (mBuffer && ChannelCount() == aChannelCount) {
+ AudioBlockBuffer* buffer = mBuffer->AsAudioBlockBuffer();
+ if (buffer && !buffer->HasLastingShares()) {
+ MOZ_ASSERT(mBufferFormat == AUDIO_FORMAT_FLOAT32);
+ // No need to allocate again.
+ mVolume = 1.0f;
+ return;
+ }
+ }
+
+ RefPtr<AudioBlockBuffer> buffer = AudioBlockBuffer::Create(aChannelCount);
+ mChannelData.SetLength(aChannelCount);
+ for (uint32_t i = 0; i < aChannelCount; ++i) {
+ mChannelData[i] = buffer->ChannelData(i);
+ }
+ mBuffer = buffer.forget();
+ mVolume = 1.0f;
+ mBufferFormat = AUDIO_FORMAT_FLOAT32;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioBlock.h b/dom/media/webaudio/AudioBlock.h
new file mode 100644
index 000000000..c9a5bb400
--- /dev/null
+++ b/dom/media/webaudio/AudioBlock.h
@@ -0,0 +1,136 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MOZILLA_AUDIOBLOCK_H_
+#define MOZILLA_AUDIOBLOCK_H_
+
+#include "AudioSegment.h"
+
+namespace mozilla {
+
+/**
+ * An AudioChunk whose buffer contents need to be valid only for one
+ * processing block iteration, after which contents can be overwritten if the
+ * buffer has not been passed to longer term storage or to another thread,
+ * which may happen though AsAudioChunk() or AsMutableChunk().
+ *
+ * Use on graph thread only.
+ */
+class AudioBlock : private AudioChunk
+{
+public:
+ AudioBlock() {
+ mDuration = WEBAUDIO_BLOCK_SIZE;
+ mBufferFormat = AUDIO_FORMAT_SILENCE;
+ }
+ // No effort is made in constructors to ensure that mBufferIsDownstreamRef
+ // is set because the block is expected to be a temporary and so the
+ // reference will be released before the next iteration.
+ // The custom copy constructor is required so as not to set
+ // mBufferIsDownstreamRef without notifying AudioBlockBuffer.
+ AudioBlock(const AudioBlock& aBlock) : AudioChunk(aBlock.AsAudioChunk()) {}
+ explicit AudioBlock(const AudioChunk& aChunk)
+ : AudioChunk(aChunk)
+ {
+ MOZ_ASSERT(aChunk.mDuration == WEBAUDIO_BLOCK_SIZE);
+ }
+ ~AudioBlock();
+
+ using AudioChunk::GetDuration;
+ using AudioChunk::IsNull;
+ using AudioChunk::ChannelCount;
+ using AudioChunk::ChannelData;
+ using AudioChunk::SizeOfExcludingThisIfUnshared;
+ using AudioChunk::SizeOfExcludingThis;
+ // mDuration is not exposed. Use GetDuration().
+ // mBuffer is not exposed. Use SetBuffer().
+ using AudioChunk::mChannelData;
+ using AudioChunk::mVolume;
+ using AudioChunk::mBufferFormat;
+
+ const AudioChunk& AsAudioChunk() const { return *this; }
+ AudioChunk* AsMutableChunk() {
+ ClearDownstreamMark();
+ return this;
+ }
+
+ /**
+ * Allocates, if necessary, aChannelCount buffers of WEBAUDIO_BLOCK_SIZE float
+ * samples for writing.
+ */
+ void AllocateChannels(uint32_t aChannelCount);
+
+ /**
+ * ChannelFloatsForWrite() should only be used when the buffers have been
+ * created with AllocateChannels().
+ */
+ float* ChannelFloatsForWrite(size_t aChannel)
+ {
+ MOZ_ASSERT(mBufferFormat == AUDIO_FORMAT_FLOAT32);
+ MOZ_ASSERT(CanWrite());
+ return static_cast<float*>(const_cast<void*>(mChannelData[aChannel]));
+ }
+
+ void SetBuffer(ThreadSharedObject* aNewBuffer);
+ void SetNull(StreamTime aDuration) {
+ MOZ_ASSERT(aDuration == WEBAUDIO_BLOCK_SIZE);
+ SetBuffer(nullptr);
+ mChannelData.Clear();
+ mVolume = 1.0f;
+ mBufferFormat = AUDIO_FORMAT_SILENCE;
+ }
+
+ AudioBlock& operator=(const AudioBlock& aBlock) {
+ // Instead of just copying, mBufferIsDownstreamRef must be first cleared
+ // if set. It is set again for the new mBuffer if possible. This happens
+ // in SetBuffer().
+ return *this = aBlock.AsAudioChunk();
+ }
+ AudioBlock& operator=(const AudioChunk& aChunk) {
+ MOZ_ASSERT(aChunk.mDuration == WEBAUDIO_BLOCK_SIZE);
+ SetBuffer(aChunk.mBuffer);
+ mChannelData = aChunk.mChannelData;
+ mVolume = aChunk.mVolume;
+ mBufferFormat = aChunk.mBufferFormat;
+ return *this;
+ }
+
+ bool IsMuted() const { return mVolume == 0.0f; }
+
+ bool IsSilentOrSubnormal() const
+ {
+ if (!mBuffer) {
+ return true;
+ }
+
+ for (uint32_t i = 0, length = mChannelData.Length(); i < length; ++i) {
+ const float* channel = static_cast<const float*>(mChannelData[i]);
+ for (StreamTime frame = 0; frame < mDuration; ++frame) {
+ if (fabs(channel[frame]) >= FLT_MIN) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+private:
+ void ClearDownstreamMark();
+ bool CanWrite();
+
+ // mBufferIsDownstreamRef is set only when mBuffer references an
+ // AudioBlockBuffer created in a different AudioBlock. That can happen when
+ // this AudioBlock is on a node downstream from the node which created the
+ // buffer. When this is set, the AudioBlockBuffer is notified that this
+ // reference does prevent the upstream node from re-using the buffer next
+ // iteration and modifying its contents. The AudioBlockBuffer is also
+ // notified when mBuffer releases this reference.
+ bool mBufferIsDownstreamRef = false;
+};
+
+} // namespace mozilla
+
+#endif // MOZILLA_AUDIOBLOCK_H_
diff --git a/dom/media/webaudio/AudioBuffer.cpp b/dom/media/webaudio/AudioBuffer.cpp
new file mode 100644
index 000000000..cb834f6a5
--- /dev/null
+++ b/dom/media/webaudio/AudioBuffer.cpp
@@ -0,0 +1,421 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioBuffer.h"
+#include "mozilla/dom/AudioBufferBinding.h"
+#include "jsfriendapi.h"
+#include "mozilla/ErrorResult.h"
+#include "AudioSegment.h"
+#include "AudioChannelFormat.h"
+#include "mozilla/PodOperations.h"
+#include "mozilla/CheckedInt.h"
+#include "mozilla/MemoryReporting.h"
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(AudioBuffer)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioBuffer)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mJSChannels)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
+ tmp->ClearJSChannels();
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AudioBuffer)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(AudioBuffer)
+ NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
+ for (uint32_t i = 0; i < tmp->mJSChannels.Length(); ++i) {
+ NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mJSChannels[i])
+ }
+NS_IMPL_CYCLE_COLLECTION_TRACE_END
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AudioBuffer, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AudioBuffer, Release)
+
+/**
+ * AudioBuffers can be shared between AudioContexts, so we need a separate
+ * mechanism to track their memory usage. This thread-safe class keeps track of
+ * all the AudioBuffers, and gets called back by the memory reporting system
+ * when a memory report is needed, reporting how much memory is used by the
+ * buffers backing AudioBuffer objects. */
+class AudioBufferMemoryTracker : public nsIMemoryReporter
+{
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIMEMORYREPORTER
+
+private:
+ AudioBufferMemoryTracker();
+ virtual ~AudioBufferMemoryTracker();
+
+public:
+ /* Those methods can be called on any thread. */
+ static void RegisterAudioBuffer(const AudioBuffer* aAudioBuffer);
+ static void UnregisterAudioBuffer(const AudioBuffer* aAudioBuffer);
+private:
+ static AudioBufferMemoryTracker* GetInstance();
+ /* Those methods must be called with the lock held. */
+ void RegisterAudioBufferInternal(const AudioBuffer* aAudioBuffer);
+ /* Returns the number of buffers still present in the hash table. */
+ uint32_t UnregisterAudioBufferInternal(const AudioBuffer* aAudioBuffer);
+ void Init();
+
+ /* This protects all members of this class. */
+ static StaticMutex sMutex;
+ static StaticRefPtr<AudioBufferMemoryTracker> sSingleton;
+ nsTHashtable<nsPtrHashKey<const AudioBuffer>> mBuffers;
+};
+
+StaticRefPtr<AudioBufferMemoryTracker> AudioBufferMemoryTracker::sSingleton;
+StaticMutex AudioBufferMemoryTracker::sMutex;
+
+NS_IMPL_ISUPPORTS(AudioBufferMemoryTracker, nsIMemoryReporter);
+
+AudioBufferMemoryTracker* AudioBufferMemoryTracker::GetInstance()
+{
+ sMutex.AssertCurrentThreadOwns();
+ if (!sSingleton) {
+ sSingleton = new AudioBufferMemoryTracker();
+ sSingleton->Init();
+ }
+ return sSingleton;
+}
+
+AudioBufferMemoryTracker::AudioBufferMemoryTracker()
+{
+}
+
+void
+AudioBufferMemoryTracker::Init()
+{
+ RegisterWeakMemoryReporter(this);
+}
+
+AudioBufferMemoryTracker::~AudioBufferMemoryTracker()
+{
+ UnregisterWeakMemoryReporter(this);
+}
+
+void
+AudioBufferMemoryTracker::RegisterAudioBuffer(const AudioBuffer* aAudioBuffer)
+{
+ StaticMutexAutoLock lock(sMutex);
+ AudioBufferMemoryTracker* tracker = AudioBufferMemoryTracker::GetInstance();
+ tracker->RegisterAudioBufferInternal(aAudioBuffer);
+}
+
+void
+AudioBufferMemoryTracker::UnregisterAudioBuffer(const AudioBuffer* aAudioBuffer)
+{
+ StaticMutexAutoLock lock(sMutex);
+ AudioBufferMemoryTracker* tracker = AudioBufferMemoryTracker::GetInstance();
+ uint32_t count;
+ count = tracker->UnregisterAudioBufferInternal(aAudioBuffer);
+ if (count == 0) {
+ sSingleton = nullptr;
+ }
+}
+
+void
+AudioBufferMemoryTracker::RegisterAudioBufferInternal(const AudioBuffer* aAudioBuffer)
+{
+ sMutex.AssertCurrentThreadOwns();
+ mBuffers.PutEntry(aAudioBuffer);
+}
+
+uint32_t
+AudioBufferMemoryTracker::UnregisterAudioBufferInternal(const AudioBuffer* aAudioBuffer)
+{
+ sMutex.AssertCurrentThreadOwns();
+ mBuffers.RemoveEntry(aAudioBuffer);
+ return mBuffers.Count();
+}
+
+MOZ_DEFINE_MALLOC_SIZE_OF(AudioBufferMemoryTrackerMallocSizeOf)
+
+NS_IMETHODIMP
+AudioBufferMemoryTracker::CollectReports(nsIHandleReportCallback* aHandleReport,
+ nsISupports* aData, bool)
+{
+ size_t amount = 0;
+
+ for (auto iter = mBuffers.Iter(); !iter.Done(); iter.Next()) {
+ amount += iter.Get()->GetKey()->SizeOfIncludingThis(AudioBufferMemoryTrackerMallocSizeOf);
+ }
+
+ MOZ_COLLECT_REPORT(
+ "explicit/webaudio/audiobuffer", KIND_HEAP, UNITS_BYTES, amount,
+ "Memory used by AudioBuffer objects (Web Audio).");
+
+ return NS_OK;
+}
+
+AudioBuffer::AudioBuffer(AudioContext* aContext, uint32_t aNumberOfChannels,
+ uint32_t aLength, float aSampleRate,
+ already_AddRefed<ThreadSharedFloatArrayBufferList>
+ aInitialContents)
+ : mOwnerWindow(do_GetWeakReference(aContext->GetOwner())),
+ mSharedChannels(aInitialContents),
+ mLength(aLength),
+ mSampleRate(aSampleRate)
+{
+ MOZ_ASSERT(!mSharedChannels ||
+ mSharedChannels->GetChannels() == aNumberOfChannels);
+ mJSChannels.SetLength(aNumberOfChannels);
+ mozilla::HoldJSObjects(this);
+ AudioBufferMemoryTracker::RegisterAudioBuffer(this);
+}
+
+AudioBuffer::~AudioBuffer()
+{
+ AudioBufferMemoryTracker::UnregisterAudioBuffer(this);
+ ClearJSChannels();
+ mozilla::DropJSObjects(this);
+}
+
+void
+AudioBuffer::ClearJSChannels()
+{
+ mJSChannels.Clear();
+}
+
+/* static */ already_AddRefed<AudioBuffer>
+AudioBuffer::Create(AudioContext* aContext, uint32_t aNumberOfChannels,
+ uint32_t aLength, float aSampleRate,
+ already_AddRefed<ThreadSharedFloatArrayBufferList>
+ aInitialContents,
+ ErrorResult& aRv)
+{
+ // Note that a buffer with zero channels is permitted here for the sake of
+ // AudioProcessingEvent, where channel counts must match parameters passed
+ // to createScriptProcessor(), one of which may be zero.
+ if (aSampleRate < WebAudioUtils::MinSampleRate ||
+ aSampleRate > WebAudioUtils::MaxSampleRate ||
+ aNumberOfChannels > WebAudioUtils::MaxChannelCount ||
+ !aLength || aLength > INT32_MAX) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ RefPtr<AudioBuffer> buffer =
+ new AudioBuffer(aContext, aNumberOfChannels, aLength, aSampleRate,
+ Move(aInitialContents));
+
+ return buffer.forget();
+}
+
+JSObject*
+AudioBuffer::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioBufferBinding::Wrap(aCx, this, aGivenProto);
+}
+
+bool
+AudioBuffer::RestoreJSChannelData(JSContext* aJSContext)
+{
+ for (uint32_t i = 0; i < mJSChannels.Length(); ++i) {
+ if (mJSChannels[i]) {
+ // Already have data in JS array.
+ continue;
+ }
+
+ // The following code first zeroes the array and then copies our data
+ // into it. We could avoid this with additional JS APIs to construct
+ // an array (or ArrayBuffer) containing initial data.
+ JS::Rooted<JSObject*> array(aJSContext,
+ JS_NewFloat32Array(aJSContext, mLength));
+ if (!array) {
+ return false;
+ }
+ if (mSharedChannels) {
+ // "4. Attach ArrayBuffers containing copies of the data to the
+ // AudioBuffer, to be returned by the next call to getChannelData."
+ const float* data = mSharedChannels->GetData(i);
+ JS::AutoCheckCannotGC nogc;
+ bool isShared;
+ mozilla::PodCopy(JS_GetFloat32ArrayData(array, &isShared, nogc), data, mLength);
+ MOZ_ASSERT(!isShared); // Was created as unshared above
+ }
+ mJSChannels[i] = array;
+ }
+
+ mSharedChannels = nullptr;
+
+ return true;
+}
+
+void
+AudioBuffer::CopyFromChannel(const Float32Array& aDestination, uint32_t aChannelNumber,
+ uint32_t aStartInChannel, ErrorResult& aRv)
+{
+ aDestination.ComputeLengthAndData();
+
+ uint32_t length = aDestination.Length();
+ CheckedInt<uint32_t> end = aStartInChannel;
+ end += length;
+ if (aChannelNumber >= NumberOfChannels() ||
+ !end.isValid() || end.value() > mLength) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ JS::AutoCheckCannotGC nogc;
+ JSObject* channelArray = mJSChannels[aChannelNumber];
+ const float* sourceData = nullptr;
+ if (channelArray) {
+ if (JS_GetTypedArrayLength(channelArray) != mLength) {
+ // The array's buffer was detached.
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ bool isShared = false;
+ sourceData = JS_GetFloat32ArrayData(channelArray, &isShared, nogc);
+ // The sourceData arrays should all have originated in
+ // RestoreJSChannelData, where they are created unshared.
+ MOZ_ASSERT(!isShared);
+ } else if (mSharedChannels) {
+ sourceData = mSharedChannels->GetData(aChannelNumber);
+ }
+
+ if (sourceData) {
+ PodMove(aDestination.Data(), sourceData + aStartInChannel, length);
+ } else {
+ PodZero(aDestination.Data(), length);
+ }
+}
+
+void
+AudioBuffer::CopyToChannel(JSContext* aJSContext, const Float32Array& aSource,
+ uint32_t aChannelNumber, uint32_t aStartInChannel,
+ ErrorResult& aRv)
+{
+ aSource.ComputeLengthAndData();
+
+ uint32_t length = aSource.Length();
+ CheckedInt<uint32_t> end = aStartInChannel;
+ end += length;
+ if (aChannelNumber >= NumberOfChannels() ||
+ !end.isValid() || end.value() > mLength) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ if (!RestoreJSChannelData(aJSContext)) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return;
+ }
+
+ JS::AutoCheckCannotGC nogc;
+ JSObject* channelArray = mJSChannels[aChannelNumber];
+ if (JS_GetTypedArrayLength(channelArray) != mLength) {
+ // The array's buffer was detached.
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ bool isShared = false;
+ float* channelData = JS_GetFloat32ArrayData(channelArray, &isShared, nogc);
+ // The channelData arrays should all have originated in
+ // RestoreJSChannelData, where they are created unshared.
+ MOZ_ASSERT(!isShared);
+ PodMove(channelData + aStartInChannel, aSource.Data(), length);
+}
+
+void
+AudioBuffer::GetChannelData(JSContext* aJSContext, uint32_t aChannel,
+ JS::MutableHandle<JSObject*> aRetval,
+ ErrorResult& aRv)
+{
+ if (aChannel >= NumberOfChannels()) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return;
+ }
+
+ if (!RestoreJSChannelData(aJSContext)) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return;
+ }
+
+ aRetval.set(mJSChannels[aChannel]);
+}
+
+already_AddRefed<ThreadSharedFloatArrayBufferList>
+AudioBuffer::StealJSArrayDataIntoSharedChannels(JSContext* aJSContext)
+{
+ // "1. If any of the AudioBuffer's ArrayBuffer have been detached, abort
+ // these steps, and return a zero-length channel data buffers to the
+ // invoker."
+ for (uint32_t i = 0; i < mJSChannels.Length(); ++i) {
+ JSObject* channelArray = mJSChannels[i];
+ if (!channelArray || mLength != JS_GetTypedArrayLength(channelArray)) {
+ // Either empty buffer or one of the arrays' buffers was detached.
+ return nullptr;
+ }
+ }
+
+ // "2. Detach all ArrayBuffers for arrays previously returned by
+ // getChannelData on this AudioBuffer."
+ // "3. Retain the underlying data buffers from those ArrayBuffers and return
+ // references to them to the invoker."
+ RefPtr<ThreadSharedFloatArrayBufferList> result =
+ new ThreadSharedFloatArrayBufferList(mJSChannels.Length());
+ for (uint32_t i = 0; i < mJSChannels.Length(); ++i) {
+ JS::Rooted<JSObject*> arrayBufferView(aJSContext, mJSChannels[i]);
+ bool isSharedMemory;
+ JS::Rooted<JSObject*> arrayBuffer(aJSContext,
+ JS_GetArrayBufferViewBuffer(aJSContext,
+ arrayBufferView,
+ &isSharedMemory));
+ // The channel data arrays should all have originated in
+ // RestoreJSChannelData, where they are created unshared.
+ MOZ_ASSERT(!isSharedMemory);
+ auto stolenData = arrayBuffer
+ ? static_cast<float*>(JS_StealArrayBufferContents(aJSContext,
+ arrayBuffer))
+ : nullptr;
+ if (stolenData) {
+ result->SetData(i, stolenData, js_free, stolenData);
+ } else {
+ NS_ASSERTION(i == 0, "some channels lost when contents not acquired");
+ return nullptr;
+ }
+ }
+
+ for (uint32_t i = 0; i < mJSChannels.Length(); ++i) {
+ mJSChannels[i] = nullptr;
+ }
+
+ return result.forget();
+}
+
+ThreadSharedFloatArrayBufferList*
+AudioBuffer::GetThreadSharedChannelsForRate(JSContext* aJSContext)
+{
+ if (!mSharedChannels) {
+ mSharedChannels = StealJSArrayDataIntoSharedChannels(aJSContext);
+ }
+
+ return mSharedChannels;
+}
+
+size_t
+AudioBuffer::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+ amount += mJSChannels.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ if (mSharedChannels) {
+ amount += mSharedChannels->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioBuffer.h b/dom/media/webaudio/AudioBuffer.h
new file mode 100644
index 000000000..2f2aef5fe
--- /dev/null
+++ b/dom/media/webaudio/AudioBuffer.h
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioBuffer_h_
+#define AudioBuffer_h_
+
+#include "nsWrapperCache.h"
+#include "nsCycleCollectionParticipant.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/StaticMutex.h"
+#include "nsTArray.h"
+#include "AudioContext.h"
+#include "js/TypeDecls.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace mozilla {
+
+class ErrorResult;
+class ThreadSharedFloatArrayBufferList;
+
+namespace dom {
+
+class AudioContext;
+
+/**
+ * An AudioBuffer keeps its data either in the mJSChannels objects, which
+ * are Float32Arrays, or in mSharedChannels if the mJSChannels objects' buffers
+ * are detached.
+ */
+class AudioBuffer final : public nsWrapperCache
+{
+public:
+ // If non-null, aInitialContents must have number of channels equal to
+ // aNumberOfChannels and their lengths must be at least aLength.
+ static already_AddRefed<AudioBuffer>
+ Create(AudioContext* aContext, uint32_t aNumberOfChannels,
+ uint32_t aLength, float aSampleRate,
+ already_AddRefed<ThreadSharedFloatArrayBufferList> aInitialContents,
+ ErrorResult& aRv);
+
+ static already_AddRefed<AudioBuffer>
+ Create(AudioContext* aContext, uint32_t aNumberOfChannels,
+ uint32_t aLength, float aSampleRate,
+ ErrorResult& aRv)
+ {
+ return Create(aContext, aNumberOfChannels, aLength, aSampleRate,
+ nullptr, aRv);
+ }
+
+ size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AudioBuffer)
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioBuffer)
+
+ nsPIDOMWindowInner* GetParentObject() const
+ {
+ nsCOMPtr<nsPIDOMWindowInner> parentObject = do_QueryReferent(mOwnerWindow);
+ return parentObject;
+ }
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ float SampleRate() const
+ {
+ return mSampleRate;
+ }
+
+ uint32_t Length() const
+ {
+ return mLength;
+ }
+
+ double Duration() const
+ {
+ return mLength / static_cast<double> (mSampleRate);
+ }
+
+ uint32_t NumberOfChannels() const
+ {
+ return mJSChannels.Length();
+ }
+
+ /**
+ * If mSharedChannels is non-null, copies its contents to
+ * new Float32Arrays in mJSChannels. Returns a Float32Array.
+ */
+ void GetChannelData(JSContext* aJSContext, uint32_t aChannel,
+ JS::MutableHandle<JSObject*> aRetval,
+ ErrorResult& aRv);
+
+ void CopyFromChannel(const Float32Array& aDestination, uint32_t aChannelNumber,
+ uint32_t aStartInChannel, ErrorResult& aRv);
+ void CopyToChannel(JSContext* aJSContext, const Float32Array& aSource,
+ uint32_t aChannelNumber, uint32_t aStartInChannel,
+ ErrorResult& aRv);
+
+ /**
+ * Returns a ThreadSharedFloatArrayBufferList containing the sample data.
+ * Can return null if there is no data.
+ */
+ ThreadSharedFloatArrayBufferList* GetThreadSharedChannelsForRate(JSContext* aContext);
+
+protected:
+ AudioBuffer(AudioContext* aContext, uint32_t aNumberOfChannels,
+ uint32_t aLength, float aSampleRate,
+ already_AddRefed<ThreadSharedFloatArrayBufferList>
+ aInitialContents);
+ ~AudioBuffer();
+
+ bool RestoreJSChannelData(JSContext* aJSContext);
+
+ already_AddRefed<ThreadSharedFloatArrayBufferList>
+ StealJSArrayDataIntoSharedChannels(JSContext* aJSContext);
+
+ void ClearJSChannels();
+
+ nsWeakPtr mOwnerWindow;
+ // Float32Arrays
+ AutoTArray<JS::Heap<JSObject*>, 2> mJSChannels;
+
+ // mSharedChannels aggregates the data from mJSChannels. This is non-null
+ // if and only if the mJSChannels' buffers are detached.
+ RefPtr<ThreadSharedFloatArrayBufferList> mSharedChannels;
+
+ uint32_t mLength;
+ float mSampleRate;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioBufferSourceNode.cpp b/dom/media/webaudio/AudioBufferSourceNode.cpp
new file mode 100644
index 000000000..51b6bab4a
--- /dev/null
+++ b/dom/media/webaudio/AudioBufferSourceNode.cpp
@@ -0,0 +1,853 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioBufferSourceNode.h"
+#include "nsDebug.h"
+#include "mozilla/dom/AudioBufferSourceNodeBinding.h"
+#include "mozilla/dom/AudioParam.h"
+#include "mozilla/FloatingPoint.h"
+#include "nsContentUtils.h"
+#include "nsMathUtils.h"
+#include "AlignmentUtils.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "AudioParamTimeline.h"
+#include <limits>
+#include <algorithm>
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(AudioBufferSourceNode, AudioNode, mBuffer, mPlaybackRate, mDetune)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioBufferSourceNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(AudioBufferSourceNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(AudioBufferSourceNode, AudioNode)
+
+/**
+ * Media-thread playback engine for AudioBufferSourceNode.
+ * Nothing is played until a non-null buffer has been set (via
+ * AudioNodeStream::SetBuffer) and a non-zero mBufferEnd has been set (via
+ * AudioNodeStream::SetInt32Parameter).
+ */
+class AudioBufferSourceNodeEngine final : public AudioNodeEngine
+{
+public:
+ AudioBufferSourceNodeEngine(AudioNode* aNode,
+ AudioDestinationNode* aDestination) :
+ AudioNodeEngine(aNode),
+ mStart(0.0), mBeginProcessing(0),
+ mStop(STREAM_TIME_MAX),
+ mResampler(nullptr), mRemainingResamplerTail(0),
+ mBufferEnd(0),
+ mLoopStart(0), mLoopEnd(0),
+ mBufferPosition(0), mBufferSampleRate(0),
+ // mResamplerOutRate is initialized in UpdateResampler().
+ mChannels(0),
+ mDopplerShift(1.0f),
+ mDestination(aDestination->Stream()),
+ mPlaybackRateTimeline(1.0f),
+ mDetuneTimeline(0.0f),
+ mLoop(false)
+ {}
+
+ ~AudioBufferSourceNodeEngine()
+ {
+ if (mResampler) {
+ speex_resampler_destroy(mResampler);
+ }
+ }
+
+ void SetSourceStream(AudioNodeStream* aSource)
+ {
+ mSource = aSource;
+ }
+
+ void RecvTimelineEvent(uint32_t aIndex,
+ dom::AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case AudioBufferSourceNode::PLAYBACKRATE:
+ mPlaybackRateTimeline.InsertEvent<int64_t>(aEvent);
+ break;
+ case AudioBufferSourceNode::DETUNE:
+ mDetuneTimeline.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad AudioBufferSourceNodeEngine TimelineParameter");
+ }
+ }
+ void SetStreamTimeParameter(uint32_t aIndex, StreamTime aParam) override
+ {
+ switch (aIndex) {
+ case AudioBufferSourceNode::STOP: mStop = aParam; break;
+ default:
+ NS_ERROR("Bad AudioBufferSourceNodeEngine StreamTimeParameter");
+ }
+ }
+ void SetDoubleParameter(uint32_t aIndex, double aParam) override
+ {
+ switch (aIndex) {
+ case AudioBufferSourceNode::START:
+ MOZ_ASSERT(!mStart, "Another START?");
+ mStart = aParam * mDestination->SampleRate();
+ // Round to nearest
+ mBeginProcessing = mStart + 0.5;
+ break;
+ case AudioBufferSourceNode::DOPPLERSHIFT:
+ mDopplerShift = (aParam <= 0 || mozilla::IsNaN(aParam)) ? 1.0 : aParam;
+ break;
+ default:
+ NS_ERROR("Bad AudioBufferSourceNodeEngine double parameter.");
+ };
+ }
+ void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
+ {
+ switch (aIndex) {
+ case AudioBufferSourceNode::SAMPLE_RATE:
+ MOZ_ASSERT(aParam > 0);
+ mBufferSampleRate = aParam;
+ mSource->SetActive();
+ break;
+ case AudioBufferSourceNode::BUFFERSTART:
+ MOZ_ASSERT(aParam >= 0);
+ if (mBufferPosition == 0) {
+ mBufferPosition = aParam;
+ }
+ break;
+ case AudioBufferSourceNode::BUFFEREND:
+ MOZ_ASSERT(aParam >= 0);
+ mBufferEnd = aParam;
+ break;
+ case AudioBufferSourceNode::LOOP: mLoop = !!aParam; break;
+ case AudioBufferSourceNode::LOOPSTART:
+ MOZ_ASSERT(aParam >= 0);
+ mLoopStart = aParam;
+ break;
+ case AudioBufferSourceNode::LOOPEND:
+ MOZ_ASSERT(aParam >= 0);
+ mLoopEnd = aParam;
+ break;
+ default:
+ NS_ERROR("Bad AudioBufferSourceNodeEngine Int32Parameter");
+ }
+ }
+ void SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList> aBuffer) override
+ {
+ mBuffer = aBuffer;
+ }
+
+ bool BegunResampling()
+ {
+ return mBeginProcessing == -STREAM_TIME_MAX;
+ }
+
+ void UpdateResampler(int32_t aOutRate, uint32_t aChannels)
+ {
+ if (mResampler &&
+ (aChannels != mChannels ||
+ // If the resampler has begun, then it will have moved
+ // mBufferPosition to after the samples it has read, but it hasn't
+ // output its buffered samples. Keep using the resampler, even if
+ // the rates now match, so that this latent segment is output.
+ (aOutRate == mBufferSampleRate && !BegunResampling()))) {
+ speex_resampler_destroy(mResampler);
+ mResampler = nullptr;
+ mRemainingResamplerTail = 0;
+ mBeginProcessing = mStart + 0.5;
+ }
+
+ if (aChannels == 0 ||
+ (aOutRate == mBufferSampleRate && !mResampler)) {
+ mResamplerOutRate = aOutRate;
+ return;
+ }
+
+ if (!mResampler) {
+ mChannels = aChannels;
+ mResampler = speex_resampler_init(mChannels, mBufferSampleRate, aOutRate,
+ SPEEX_RESAMPLER_QUALITY_MIN,
+ nullptr);
+ } else {
+ if (mResamplerOutRate == aOutRate) {
+ return;
+ }
+ if (speex_resampler_set_rate(mResampler, mBufferSampleRate, aOutRate) != RESAMPLER_ERR_SUCCESS) {
+ NS_ASSERTION(false, "speex_resampler_set_rate failed");
+ return;
+ }
+ }
+
+ mResamplerOutRate = aOutRate;
+
+ if (!BegunResampling()) {
+ // Low pass filter effects from the resampler mean that samples before
+ // the start time are influenced by resampling the buffer. The input
+ // latency indicates half the filter width.
+ int64_t inputLatency = speex_resampler_get_input_latency(mResampler);
+ uint32_t ratioNum, ratioDen;
+ speex_resampler_get_ratio(mResampler, &ratioNum, &ratioDen);
+ // The output subsample resolution supported in aligning the resampler
+ // is ratioNum. First round the start time to the nearest subsample.
+ int64_t subsample = mStart * ratioNum + 0.5;
+ // Now include the leading effects of the filter, and round *up* to the
+ // next whole tick, because there is no effect on samples outside the
+ // filter width.
+ mBeginProcessing =
+ (subsample - inputLatency * ratioDen + ratioNum - 1) / ratioNum;
+ }
+ }
+
+ // Borrow a full buffer of size WEBAUDIO_BLOCK_SIZE from the source buffer
+ // at offset aSourceOffset. This avoids copying memory.
+ void BorrowFromInputBuffer(AudioBlock* aOutput,
+ uint32_t aChannels)
+ {
+ aOutput->SetBuffer(mBuffer);
+ aOutput->mChannelData.SetLength(aChannels);
+ for (uint32_t i = 0; i < aChannels; ++i) {
+ aOutput->mChannelData[i] = mBuffer->GetData(i) + mBufferPosition;
+ }
+ aOutput->mVolume = 1.0f;
+ aOutput->mBufferFormat = AUDIO_FORMAT_FLOAT32;
+ }
+
+ // Copy aNumberOfFrames frames from the source buffer at offset aSourceOffset
+ // and put it at offset aBufferOffset in the destination buffer.
+ void CopyFromInputBuffer(AudioBlock* aOutput,
+ uint32_t aChannels,
+ uintptr_t aOffsetWithinBlock,
+ uint32_t aNumberOfFrames) {
+ for (uint32_t i = 0; i < aChannels; ++i) {
+ float* baseChannelData = aOutput->ChannelFloatsForWrite(i);
+ memcpy(baseChannelData + aOffsetWithinBlock,
+ mBuffer->GetData(i) + mBufferPosition,
+ aNumberOfFrames * sizeof(float));
+ }
+ }
+
+ // Resamples input data to an output buffer, according to |mBufferSampleRate| and
+ // the playbackRate/detune.
+ // The number of frames consumed/produced depends on the amount of space
+ // remaining in both the input and output buffer, and the playback rate (that
+ // is, the ratio between the output samplerate and the input samplerate).
+ void CopyFromInputBufferWithResampling(AudioBlock* aOutput,
+ uint32_t aChannels,
+ uint32_t* aOffsetWithinBlock,
+ uint32_t aAvailableInOutput,
+ StreamTime* aCurrentPosition,
+ uint32_t aBufferMax)
+ {
+ if (*aOffsetWithinBlock == 0) {
+ aOutput->AllocateChannels(aChannels);
+ }
+ SpeexResamplerState* resampler = mResampler;
+ MOZ_ASSERT(aChannels > 0);
+
+ if (mBufferPosition < aBufferMax) {
+ uint32_t availableInInputBuffer = aBufferMax - mBufferPosition;
+ uint32_t ratioNum, ratioDen;
+ speex_resampler_get_ratio(resampler, &ratioNum, &ratioDen);
+ // Limit the number of input samples copied and possibly
+ // format-converted for resampling by estimating how many will be used.
+ // This may be a little small if still filling the resampler with
+ // initial data, but we'll get called again and it will work out.
+ uint32_t inputLimit = aAvailableInOutput * ratioNum / ratioDen + 10;
+ if (!BegunResampling()) {
+ // First time the resampler is used.
+ uint32_t inputLatency = speex_resampler_get_input_latency(resampler);
+ inputLimit += inputLatency;
+ // If starting after mStart, then play from the beginning of the
+ // buffer, but correct for input latency. If starting before mStart,
+ // then align the resampler so that the time corresponding to the
+ // first input sample is mStart.
+ int64_t skipFracNum = static_cast<int64_t>(inputLatency) * ratioDen;
+ double leadTicks = mStart - *aCurrentPosition;
+ if (leadTicks > 0.0) {
+ // Round to nearest output subsample supported by the resampler at
+ // these rates.
+ int64_t leadSubsamples = leadTicks * ratioNum + 0.5;
+ MOZ_ASSERT(leadSubsamples <= skipFracNum,
+ "mBeginProcessing is wrong?");
+ skipFracNum -= leadSubsamples;
+ }
+ speex_resampler_set_skip_frac_num(resampler,
+ std::min<int64_t>(skipFracNum, UINT32_MAX));
+
+ mBeginProcessing = -STREAM_TIME_MAX;
+ }
+ inputLimit = std::min(inputLimit, availableInInputBuffer);
+
+ for (uint32_t i = 0; true; ) {
+ uint32_t inSamples = inputLimit;
+ const float* inputData = mBuffer->GetData(i) + mBufferPosition;
+
+ uint32_t outSamples = aAvailableInOutput;
+ float* outputData =
+ aOutput->ChannelFloatsForWrite(i) + *aOffsetWithinBlock;
+
+ WebAudioUtils::SpeexResamplerProcess(resampler, i,
+ inputData, &inSamples,
+ outputData, &outSamples);
+ if (++i == aChannels) {
+ mBufferPosition += inSamples;
+ MOZ_ASSERT(mBufferPosition <= mBufferEnd || mLoop);
+ *aOffsetWithinBlock += outSamples;
+ *aCurrentPosition += outSamples;
+ if (inSamples == availableInInputBuffer && !mLoop) {
+ // We'll feed in enough zeros to empty out the resampler's memory.
+ // This handles the output latency as well as capturing the low
+ // pass effects of the resample filter.
+ mRemainingResamplerTail =
+ 2 * speex_resampler_get_input_latency(resampler) - 1;
+ }
+ return;
+ }
+ }
+ } else {
+ for (uint32_t i = 0; true; ) {
+ uint32_t inSamples = mRemainingResamplerTail;
+ uint32_t outSamples = aAvailableInOutput;
+ float* outputData =
+ aOutput->ChannelFloatsForWrite(i) + *aOffsetWithinBlock;
+
+ // AudioDataValue* for aIn selects the function that does not try to
+ // copy and format-convert input data.
+ WebAudioUtils::SpeexResamplerProcess(resampler, i,
+ static_cast<AudioDataValue*>(nullptr), &inSamples,
+ outputData, &outSamples);
+ if (++i == aChannels) {
+ MOZ_ASSERT(inSamples <= mRemainingResamplerTail);
+ mRemainingResamplerTail -= inSamples;
+ *aOffsetWithinBlock += outSamples;
+ *aCurrentPosition += outSamples;
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Fill aOutput with as many zero frames as we can, and advance
+ * aOffsetWithinBlock and aCurrentPosition based on how many frames we write.
+ * This will never advance aOffsetWithinBlock past WEBAUDIO_BLOCK_SIZE or
+ * aCurrentPosition past aMaxPos. This function knows when it needs to
+ * allocate the output buffer, and also optimizes the case where it can avoid
+ * memory allocations.
+ */
+ void FillWithZeroes(AudioBlock* aOutput,
+ uint32_t aChannels,
+ uint32_t* aOffsetWithinBlock,
+ StreamTime* aCurrentPosition,
+ StreamTime aMaxPos)
+ {
+ MOZ_ASSERT(*aCurrentPosition < aMaxPos);
+ uint32_t numFrames =
+ std::min<StreamTime>(WEBAUDIO_BLOCK_SIZE - *aOffsetWithinBlock,
+ aMaxPos - *aCurrentPosition);
+ if (numFrames == WEBAUDIO_BLOCK_SIZE || !aChannels) {
+ aOutput->SetNull(numFrames);
+ } else {
+ if (*aOffsetWithinBlock == 0) {
+ aOutput->AllocateChannels(aChannels);
+ }
+ WriteZeroesToAudioBlock(aOutput, *aOffsetWithinBlock, numFrames);
+ }
+ *aOffsetWithinBlock += numFrames;
+ *aCurrentPosition += numFrames;
+ }
+
+ /**
+ * Copy as many frames as possible from the source buffer to aOutput, and
+ * advance aOffsetWithinBlock and aCurrentPosition based on how many frames
+ * we write. This will never advance aOffsetWithinBlock past
+ * WEBAUDIO_BLOCK_SIZE, or aCurrentPosition past mStop. It takes data from
+ * the buffer at aBufferOffset, and never takes more data than aBufferMax.
+ * This function knows when it needs to allocate the output buffer, and also
+ * optimizes the case where it can avoid memory allocations.
+ */
+ void CopyFromBuffer(AudioBlock* aOutput,
+ uint32_t aChannels,
+ uint32_t* aOffsetWithinBlock,
+ StreamTime* aCurrentPosition,
+ uint32_t aBufferMax)
+ {
+ MOZ_ASSERT(*aCurrentPosition < mStop);
+ uint32_t availableInOutput =
+ std::min<StreamTime>(WEBAUDIO_BLOCK_SIZE - *aOffsetWithinBlock,
+ mStop - *aCurrentPosition);
+ if (mResampler) {
+ CopyFromInputBufferWithResampling(aOutput, aChannels,
+ aOffsetWithinBlock, availableInOutput,
+ aCurrentPosition, aBufferMax);
+ return;
+ }
+
+ if (aChannels == 0) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ // There is no attempt here to limit advance so that mBufferPosition is
+ // limited to aBufferMax. The only observable affect of skipping the
+ // check would be in the precise timing of the ended event if the loop
+ // attribute is reset after playback has looped.
+ *aOffsetWithinBlock += availableInOutput;
+ *aCurrentPosition += availableInOutput;
+ // Rounding at the start and end of the period means that fractional
+ // increments essentially accumulate if outRate remains constant. If
+ // outRate is varying, then accumulation happens on average but not
+ // precisely.
+ TrackTicks start = *aCurrentPosition *
+ mBufferSampleRate / mResamplerOutRate;
+ TrackTicks end = (*aCurrentPosition + availableInOutput) *
+ mBufferSampleRate / mResamplerOutRate;
+ mBufferPosition += end - start;
+ return;
+ }
+
+ uint32_t numFrames = std::min(aBufferMax - mBufferPosition,
+ availableInOutput);
+
+ bool inputBufferAligned = true;
+ for (uint32_t i = 0; i < aChannels; ++i) {
+ if (!IS_ALIGNED16(mBuffer->GetData(i) + mBufferPosition)) {
+ inputBufferAligned = false;
+ }
+ }
+
+ if (numFrames == WEBAUDIO_BLOCK_SIZE && inputBufferAligned) {
+ MOZ_ASSERT(mBufferPosition < aBufferMax);
+ BorrowFromInputBuffer(aOutput, aChannels);
+ } else {
+ if (*aOffsetWithinBlock == 0) {
+ aOutput->AllocateChannels(aChannels);
+ }
+ MOZ_ASSERT(mBufferPosition < aBufferMax);
+ CopyFromInputBuffer(aOutput, aChannels, *aOffsetWithinBlock, numFrames);
+ }
+ *aOffsetWithinBlock += numFrames;
+ *aCurrentPosition += numFrames;
+ mBufferPosition += numFrames;
+ }
+
+ int32_t ComputeFinalOutSampleRate(float aPlaybackRate, float aDetune)
+ {
+ float computedPlaybackRate = aPlaybackRate * pow(2, aDetune / 1200.f);
+ // Make sure the playback rate and the doppler shift are something
+ // our resampler can work with.
+ int32_t rate = WebAudioUtils::
+ TruncateFloatToInt<int32_t>(mSource->SampleRate() /
+ (computedPlaybackRate * mDopplerShift));
+ return rate ? rate : mBufferSampleRate;
+ }
+
+ void UpdateSampleRateIfNeeded(uint32_t aChannels, StreamTime aStreamPosition)
+ {
+ float playbackRate;
+ float detune;
+
+ if (mPlaybackRateTimeline.HasSimpleValue()) {
+ playbackRate = mPlaybackRateTimeline.GetValue();
+ } else {
+ playbackRate = mPlaybackRateTimeline.GetValueAtTime(aStreamPosition);
+ }
+ if (mDetuneTimeline.HasSimpleValue()) {
+ detune = mDetuneTimeline.GetValue();
+ } else {
+ detune = mDetuneTimeline.GetValueAtTime(aStreamPosition);
+ }
+ if (playbackRate <= 0 || mozilla::IsNaN(playbackRate)) {
+ playbackRate = 1.0f;
+ }
+
+ detune = std::min(std::max(-1200.f, detune), 1200.f);
+
+ int32_t outRate = ComputeFinalOutSampleRate(playbackRate, detune);
+ UpdateResampler(outRate, aChannels);
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ if (mBufferSampleRate == 0) {
+ // start() has not yet been called or no buffer has yet been set
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ StreamTime streamPosition = mDestination->GraphTimeToStreamTime(aFrom);
+ uint32_t channels = mBuffer ? mBuffer->GetChannels() : 0;
+
+ UpdateSampleRateIfNeeded(channels, streamPosition);
+
+ uint32_t written = 0;
+ while (written < WEBAUDIO_BLOCK_SIZE) {
+ if (mStop != STREAM_TIME_MAX &&
+ streamPosition >= mStop) {
+ FillWithZeroes(aOutput, channels, &written, &streamPosition, STREAM_TIME_MAX);
+ continue;
+ }
+ if (streamPosition < mBeginProcessing) {
+ FillWithZeroes(aOutput, channels, &written, &streamPosition,
+ mBeginProcessing);
+ continue;
+ }
+ if (mLoop) {
+ // mLoopEnd can become less than mBufferPosition when a LOOPEND engine
+ // parameter is received after "loopend" is changed on the node or a
+ // new buffer with lower samplerate is set.
+ if (mBufferPosition >= mLoopEnd) {
+ mBufferPosition = mLoopStart;
+ }
+ CopyFromBuffer(aOutput, channels, &written, &streamPosition, mLoopEnd);
+ } else {
+ if (mBufferPosition < mBufferEnd || mRemainingResamplerTail) {
+ CopyFromBuffer(aOutput, channels, &written, &streamPosition, mBufferEnd);
+ } else {
+ FillWithZeroes(aOutput, channels, &written, &streamPosition, STREAM_TIME_MAX);
+ }
+ }
+ }
+
+ // We've finished if we've gone past mStop, or if we're past mDuration when
+ // looping is disabled.
+ if (streamPosition >= mStop ||
+ (!mLoop && mBufferPosition >= mBufferEnd && !mRemainingResamplerTail)) {
+ *aFinished = true;
+ }
+ }
+
+ bool IsActive() const override
+ {
+ // Whether buffer has been set and start() has been called.
+ return mBufferSampleRate != 0;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mBuffer - shared w/ AudioNode
+ // - mPlaybackRateTimeline - shared w/ AudioNode
+ // - mDetuneTimeline - shared w/ AudioNode
+
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+
+ // NB: We need to modify speex if we want the full memory picture, internal
+ // fields that need measuring noted below.
+ // - mResampler->mem
+ // - mResampler->sinc_table
+ // - mResampler->last_sample
+ // - mResampler->magic_samples
+ // - mResampler->samp_frac_num
+ amount += aMallocSizeOf(mResampler);
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ double mStart; // including the fractional position between ticks
+ // Low pass filter effects from the resampler mean that samples before the
+ // start time are influenced by resampling the buffer. mBeginProcessing
+ // includes the extent of this filter. The special value of -STREAM_TIME_MAX
+ // indicates that the resampler has begun processing.
+ StreamTime mBeginProcessing;
+ StreamTime mStop;
+ RefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
+ SpeexResamplerState* mResampler;
+ // mRemainingResamplerTail, like mBufferPosition, and
+ // mBufferEnd, is measured in input buffer samples.
+ uint32_t mRemainingResamplerTail;
+ uint32_t mBufferEnd;
+ uint32_t mLoopStart;
+ uint32_t mLoopEnd;
+ uint32_t mBufferPosition;
+ int32_t mBufferSampleRate;
+ int32_t mResamplerOutRate;
+ uint32_t mChannels;
+ float mDopplerShift;
+ AudioNodeStream* mDestination;
+ AudioNodeStream* mSource;
+ AudioParamTimeline mPlaybackRateTimeline;
+ AudioParamTimeline mDetuneTimeline;
+ bool mLoop;
+};
+
+AudioBufferSourceNode::AudioBufferSourceNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mLoopStart(0.0)
+ , mLoopEnd(0.0)
+ // mOffset and mDuration are initialized in Start().
+ , mPlaybackRate(new AudioParam(this, PLAYBACKRATE, 1.0f, "playbackRate"))
+ , mDetune(new AudioParam(this, DETUNE, 0.0f, "detune"))
+ , mLoop(false)
+ , mStartCalled(false)
+{
+ AudioBufferSourceNodeEngine* engine = new AudioBufferSourceNodeEngine(this, aContext->Destination());
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED,
+ aContext->Graph());
+ engine->SetSourceStream(mStream);
+ mStream->AddMainThreadListener(this);
+}
+
+AudioBufferSourceNode::~AudioBufferSourceNode()
+{
+}
+
+void
+AudioBufferSourceNode::DestroyMediaStream()
+{
+ bool hadStream = mStream;
+ if (hadStream) {
+ mStream->RemoveMainThreadListener(this);
+ }
+ AudioNode::DestroyMediaStream();
+ if (hadStream && Context()) {
+ Context()->UnregisterAudioBufferSourceNode(this);
+ }
+}
+
+size_t
+AudioBufferSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+
+ /* mBuffer can be shared and is accounted for separately. */
+
+ amount += mPlaybackRate->SizeOfIncludingThis(aMallocSizeOf);
+ amount += mDetune->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+AudioBufferSourceNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+AudioBufferSourceNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioBufferSourceNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+AudioBufferSourceNode::Start(double aWhen, double aOffset,
+ const Optional<double>& aDuration, ErrorResult& aRv)
+{
+ if (!WebAudioUtils::IsTimeValid(aWhen) ||
+ (aDuration.WasPassed() && !WebAudioUtils::IsTimeValid(aDuration.Value()))) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ if (mStartCalled) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ mStartCalled = true;
+
+ AudioNodeStream* ns = mStream;
+ if (!ns) {
+ // Nothing to play, or we're already dead for some reason
+ return;
+ }
+
+ // Remember our arguments so that we can use them when we get a new buffer.
+ mOffset = aOffset;
+ mDuration = aDuration.WasPassed() ? aDuration.Value()
+ : std::numeric_limits<double>::min();
+
+ WEB_AUDIO_API_LOG("%f: %s %u Start(%f, %g, %g)", Context()->CurrentTime(),
+ NodeType(), Id(), aWhen, aOffset, mDuration);
+
+ // We can't send these parameters without a buffer because we don't know the
+ // buffer's sample rate or length.
+ if (mBuffer) {
+ SendOffsetAndDurationParametersToStream(ns);
+ }
+
+ // Don't set parameter unnecessarily
+ if (aWhen > 0.0) {
+ ns->SetDoubleParameter(START, aWhen);
+ }
+}
+
+void
+AudioBufferSourceNode::SendBufferParameterToStream(JSContext* aCx)
+{
+ AudioNodeStream* ns = mStream;
+ if (!ns) {
+ return;
+ }
+
+ if (mBuffer) {
+ RefPtr<ThreadSharedFloatArrayBufferList> data =
+ mBuffer->GetThreadSharedChannelsForRate(aCx);
+ ns->SetBuffer(data.forget());
+
+ if (mStartCalled) {
+ SendOffsetAndDurationParametersToStream(ns);
+ }
+ } else {
+ ns->SetInt32Parameter(BUFFEREND, 0);
+ ns->SetBuffer(nullptr);
+
+ MarkInactive();
+ }
+}
+
+void
+AudioBufferSourceNode::SendOffsetAndDurationParametersToStream(AudioNodeStream* aStream)
+{
+ NS_ASSERTION(mBuffer && mStartCalled,
+ "Only call this when we have a buffer and start() has been called");
+
+ float rate = mBuffer->SampleRate();
+ aStream->SetInt32Parameter(SAMPLE_RATE, rate);
+
+ int32_t bufferEnd = mBuffer->Length();
+ int32_t offsetSamples = std::max(0, NS_lround(mOffset * rate));
+
+ // Don't set parameter unnecessarily
+ if (offsetSamples > 0) {
+ aStream->SetInt32Parameter(BUFFERSTART, offsetSamples);
+ }
+
+ if (mDuration != std::numeric_limits<double>::min()) {
+ MOZ_ASSERT(mDuration >= 0.0); // provided by Start()
+ MOZ_ASSERT(rate >= 0.0f); // provided by AudioBuffer::Create()
+ static_assert(std::numeric_limits<double>::digits >=
+ std::numeric_limits<decltype(bufferEnd)>::digits,
+ "bufferEnd should be represented exactly by double");
+ // + 0.5 rounds mDuration to nearest sample when assigned to bufferEnd.
+ bufferEnd = std::min<double>(bufferEnd,
+ offsetSamples + mDuration * rate + 0.5);
+ }
+ aStream->SetInt32Parameter(BUFFEREND, bufferEnd);
+
+ MarkActive();
+}
+
+void
+AudioBufferSourceNode::Stop(double aWhen, ErrorResult& aRv)
+{
+ if (!WebAudioUtils::IsTimeValid(aWhen)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ if (!mStartCalled) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ WEB_AUDIO_API_LOG("%f: %s %u Stop(%f)", Context()->CurrentTime(),
+ NodeType(), Id(), aWhen);
+
+ AudioNodeStream* ns = mStream;
+ if (!ns || !Context()) {
+ // We've already stopped and had our stream shut down
+ return;
+ }
+
+ ns->SetStreamTimeParameter(STOP, Context(), std::max(0.0, aWhen));
+}
+
+void
+AudioBufferSourceNode::NotifyMainThreadStreamFinished()
+{
+ MOZ_ASSERT(mStream->IsFinished());
+
+ class EndedEventDispatcher final : public Runnable
+ {
+ public:
+ explicit EndedEventDispatcher(AudioBufferSourceNode* aNode)
+ : mNode(aNode) {}
+ NS_IMETHOD Run() override
+ {
+ // If it's not safe to run scripts right now, schedule this to run later
+ if (!nsContentUtils::IsSafeToRunScript()) {
+ nsContentUtils::AddScriptRunner(this);
+ return NS_OK;
+ }
+
+ mNode->DispatchTrustedEvent(NS_LITERAL_STRING("ended"));
+ // Release stream resources.
+ mNode->DestroyMediaStream();
+ return NS_OK;
+ }
+ private:
+ RefPtr<AudioBufferSourceNode> mNode;
+ };
+
+ NS_DispatchToMainThread(new EndedEventDispatcher(this));
+
+ // Drop the playing reference
+ // Warning: The below line might delete this.
+ MarkInactive();
+}
+
+void
+AudioBufferSourceNode::SendDopplerShiftToStream(double aDopplerShift)
+{
+ MOZ_ASSERT(mStream, "Should have disconnected panner if no stream");
+ SendDoubleParameterToStream(DOPPLERSHIFT, aDopplerShift);
+}
+
+void
+AudioBufferSourceNode::SendLoopParametersToStream()
+{
+ if (!mStream) {
+ return;
+ }
+ // Don't compute and set the loop parameters unnecessarily
+ if (mLoop && mBuffer) {
+ float rate = mBuffer->SampleRate();
+ double length = (double(mBuffer->Length()) / mBuffer->SampleRate());
+ double actualLoopStart, actualLoopEnd;
+ if (mLoopStart >= 0.0 && mLoopEnd > 0.0 &&
+ mLoopStart < mLoopEnd) {
+ MOZ_ASSERT(mLoopStart != 0.0 || mLoopEnd != 0.0);
+ actualLoopStart = (mLoopStart > length) ? 0.0 : mLoopStart;
+ actualLoopEnd = std::min(mLoopEnd, length);
+ } else {
+ actualLoopStart = 0.0;
+ actualLoopEnd = length;
+ }
+ int32_t loopStartTicks = NS_lround(actualLoopStart * rate);
+ int32_t loopEndTicks = NS_lround(actualLoopEnd * rate);
+ if (loopStartTicks < loopEndTicks) {
+ SendInt32ParameterToStream(LOOPSTART, loopStartTicks);
+ SendInt32ParameterToStream(LOOPEND, loopEndTicks);
+ SendInt32ParameterToStream(LOOP, 1);
+ } else {
+ // Be explicit about looping not happening if the offsets make
+ // looping impossible.
+ SendInt32ParameterToStream(LOOP, 0);
+ }
+ } else {
+ SendInt32ParameterToStream(LOOP, 0);
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioBufferSourceNode.h b/dom/media/webaudio/AudioBufferSourceNode.h
new file mode 100644
index 000000000..d982ec5cc
--- /dev/null
+++ b/dom/media/webaudio/AudioBufferSourceNode.h
@@ -0,0 +1,149 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioBufferSourceNode_h_
+#define AudioBufferSourceNode_h_
+
+#include "AudioNode.h"
+#include "AudioBuffer.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioParam;
+
+class AudioBufferSourceNode final : public AudioNode,
+ public MainThreadMediaStreamListener
+{
+public:
+ explicit AudioBufferSourceNode(AudioContext* aContext);
+
+ void DestroyMediaStream() override;
+
+ uint16_t NumberOfInputs() const final override
+ {
+ return 0;
+ }
+ AudioBufferSourceNode* AsAudioBufferSourceNode() override
+ {
+ return this;
+ }
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioBufferSourceNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void Start(double aWhen, double aOffset,
+ const Optional<double>& aDuration, ErrorResult& aRv);
+ void Stop(double aWhen, ErrorResult& aRv);
+
+ AudioBuffer* GetBuffer(JSContext* aCx) const
+ {
+ return mBuffer;
+ }
+ void SetBuffer(JSContext* aCx, AudioBuffer* aBuffer)
+ {
+ mBuffer = aBuffer;
+ SendBufferParameterToStream(aCx);
+ SendLoopParametersToStream();
+ }
+ AudioParam* PlaybackRate() const
+ {
+ return mPlaybackRate;
+ }
+ AudioParam* Detune() const
+ {
+ return mDetune;
+ }
+ bool Loop() const
+ {
+ return mLoop;
+ }
+ void SetLoop(bool aLoop)
+ {
+ mLoop = aLoop;
+ SendLoopParametersToStream();
+ }
+ double LoopStart() const
+ {
+ return mLoopStart;
+ }
+ void SetLoopStart(double aStart)
+ {
+ mLoopStart = aStart;
+ SendLoopParametersToStream();
+ }
+ double LoopEnd() const
+ {
+ return mLoopEnd;
+ }
+ void SetLoopEnd(double aEnd)
+ {
+ mLoopEnd = aEnd;
+ SendLoopParametersToStream();
+ }
+ void SendDopplerShiftToStream(double aDopplerShift);
+
+ IMPL_EVENT_HANDLER(ended)
+
+ void NotifyMainThreadStreamFinished() override;
+
+ const char* NodeType() const override
+ {
+ return "AudioBufferSourceNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~AudioBufferSourceNode();
+
+private:
+ friend class AudioBufferSourceNodeEngine;
+ // START is sent during Start().
+ // STOP is sent during Stop().
+ // BUFFERSTART and BUFFEREND are sent when SetBuffer() and Start() have
+ // been called (along with sending the buffer).
+ enum EngineParameters {
+ SAMPLE_RATE,
+ START,
+ STOP,
+ // BUFFERSTART is the "offset" passed to start(), multiplied by
+ // buffer.sampleRate.
+ BUFFERSTART,
+ // BUFFEREND is the sum of "offset" and "duration" passed to start(),
+ // multiplied by buffer.sampleRate, or the size of the buffer, if smaller.
+ BUFFEREND,
+ LOOP,
+ LOOPSTART,
+ LOOPEND,
+ PLAYBACKRATE,
+ DETUNE,
+ DOPPLERSHIFT
+ };
+
+ void SendLoopParametersToStream();
+ void SendBufferParameterToStream(JSContext* aCx);
+ void SendOffsetAndDurationParametersToStream(AudioNodeStream* aStream);
+
+private:
+ double mLoopStart;
+ double mLoopEnd;
+ double mOffset;
+ double mDuration;
+ RefPtr<AudioBuffer> mBuffer;
+ RefPtr<AudioParam> mPlaybackRate;
+ RefPtr<AudioParam> mDetune;
+ bool mLoop;
+ bool mStartCalled;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioContext.cpp b/dom/media/webaudio/AudioContext.cpp
new file mode 100644
index 000000000..f61226a48
--- /dev/null
+++ b/dom/media/webaudio/AudioContext.cpp
@@ -0,0 +1,1247 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioContext.h"
+
+#include "blink/PeriodicWave.h"
+
+#include "mozilla/ErrorResult.h"
+#include "mozilla/OwningNonNull.h"
+
+#include "mozilla/dom/AnalyserNode.h"
+#include "mozilla/dom/AudioContextBinding.h"
+#include "mozilla/dom/HTMLMediaElement.h"
+#include "mozilla/dom/OfflineAudioContextBinding.h"
+#include "mozilla/dom/Promise.h"
+
+#include "AudioBuffer.h"
+#include "AudioBufferSourceNode.h"
+#include "AudioChannelService.h"
+#include "AudioDestinationNode.h"
+#include "AudioListener.h"
+#include "AudioStream.h"
+#include "BiquadFilterNode.h"
+#include "ChannelMergerNode.h"
+#include "ChannelSplitterNode.h"
+#include "ConstantSourceNode.h"
+#include "ConvolverNode.h"
+#include "DelayNode.h"
+#include "DynamicsCompressorNode.h"
+#include "GainNode.h"
+#include "IIRFilterNode.h"
+#include "MediaElementAudioSourceNode.h"
+#include "MediaStreamAudioDestinationNode.h"
+#include "MediaStreamAudioSourceNode.h"
+#include "MediaStreamGraph.h"
+#include "nsContentUtils.h"
+#include "nsNetCID.h"
+#include "nsNetUtil.h"
+#include "nsPIDOMWindow.h"
+#include "nsPrintfCString.h"
+#include "OscillatorNode.h"
+#include "PannerNode.h"
+#include "PeriodicWave.h"
+#include "ScriptProcessorNode.h"
+#include "StereoPannerNode.h"
+#include "WaveShaperNode.h"
+
+namespace mozilla {
+namespace dom {
+
+// 0 is a special value that MediaStreams use to denote they are not part of a
+// AudioContext.
+static dom::AudioContext::AudioContextId gAudioContextId = 1;
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(AudioContext)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioContext)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mDestination)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mListener)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mPromiseGripArray)
+ if (!tmp->mIsStarted) {
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mActiveNodes)
+ }
+ // mDecodeJobs owns the WebAudioDecodeJob objects whose lifetime is managed explicitly.
+ // mAllNodes is an array of weak pointers, ignore it here.
+ // mPannerNodes is an array of weak pointers, ignore it here.
+ // mBasicWaveFormCache cannot participate in cycles, ignore it here.
+
+ // Remove weak reference on the global window as the context is not usable
+ // without mDestination.
+ tmp->DisconnectFromWindow();
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(DOMEventTargetHelper)
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(AudioContext,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDestination)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mListener)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromiseGripArray)
+ if (!tmp->mIsStarted) {
+ MOZ_ASSERT(tmp->mIsOffline,
+ "Online AudioContexts should always be started");
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mActiveNodes)
+ }
+ // mDecodeJobs owns the WebAudioDecodeJob objects whose lifetime is managed explicitly.
+ // mAllNodes is an array of weak pointers, ignore it here.
+ // mPannerNodes is an array of weak pointers, ignore it here.
+ // mBasicWaveFormCache cannot participate in cycles, ignore it here.
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_ADDREF_INHERITED(AudioContext, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(AudioContext, DOMEventTargetHelper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioContext)
+ NS_INTERFACE_MAP_ENTRY(nsIMemoryReporter)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+static float GetSampleRateForAudioContext(bool aIsOffline, float aSampleRate)
+{
+ if (aIsOffline) {
+ return aSampleRate;
+ } else {
+ return static_cast<float>(CubebUtils::PreferredSampleRate());
+ }
+}
+
+AudioContext::AudioContext(nsPIDOMWindowInner* aWindow,
+ bool aIsOffline,
+ AudioChannel aChannel,
+ uint32_t aNumberOfChannels,
+ uint32_t aLength,
+ float aSampleRate)
+ : DOMEventTargetHelper(aWindow)
+ , mId(gAudioContextId++)
+ , mSampleRate(GetSampleRateForAudioContext(aIsOffline, aSampleRate))
+ , mAudioContextState(AudioContextState::Suspended)
+ , mNumberOfChannels(aNumberOfChannels)
+ , mIsOffline(aIsOffline)
+ , mIsStarted(!aIsOffline)
+ , mIsShutDown(false)
+ , mCloseCalled(false)
+ , mSuspendCalled(false)
+{
+ bool mute = aWindow->AddAudioContext(this);
+
+ // Note: AudioDestinationNode needs an AudioContext that must already be
+ // bound to the window.
+ mDestination = new AudioDestinationNode(this, aIsOffline, aChannel,
+ aNumberOfChannels, aLength, aSampleRate);
+
+ // The context can't be muted until it has a destination.
+ if (mute) {
+ Mute();
+ }
+}
+
+nsresult
+AudioContext::Init()
+{
+ if (!mIsOffline) {
+ nsresult rv = mDestination->CreateAudioChannelAgent();
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ }
+
+ return NS_OK;
+}
+
+void
+AudioContext::DisconnectFromWindow()
+{
+ nsPIDOMWindowInner* window = GetOwner();
+ if (window) {
+ window->RemoveAudioContext(this);
+ }
+}
+
+AudioContext::~AudioContext()
+{
+ DisconnectFromWindow();
+ UnregisterWeakMemoryReporter(this);
+}
+
+JSObject*
+AudioContext::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ if (mIsOffline) {
+ return OfflineAudioContextBinding::Wrap(aCx, this, aGivenProto);
+ } else {
+ return AudioContextBinding::Wrap(aCx, this, aGivenProto);
+ }
+}
+
+/* static */ already_AddRefed<AudioContext>
+AudioContext::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ return AudioContext::Constructor(aGlobal,
+ AudioChannelService::GetDefaultAudioChannel(),
+ aRv);
+}
+
+/* static */ already_AddRefed<AudioContext>
+AudioContext::Constructor(const GlobalObject& aGlobal,
+ AudioChannel aChannel,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ RefPtr<AudioContext> object = new AudioContext(window, false, aChannel);
+ aRv = object->Init();
+ if (NS_WARN_IF(aRv.Failed())) {
+ return nullptr;
+ }
+
+ RegisterWeakMemoryReporter(object);
+
+ return object.forget();
+}
+
+/* static */ already_AddRefed<AudioContext>
+AudioContext::Constructor(const GlobalObject& aGlobal,
+ uint32_t aNumberOfChannels,
+ uint32_t aLength,
+ float aSampleRate,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!window) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return nullptr;
+ }
+
+ if (aNumberOfChannels == 0 ||
+ aNumberOfChannels > WebAudioUtils::MaxChannelCount ||
+ aLength == 0 ||
+ aSampleRate < WebAudioUtils::MinSampleRate ||
+ aSampleRate > WebAudioUtils::MaxSampleRate) {
+ // The DOM binding protects us against infinity and NaN
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ RefPtr<AudioContext> object = new AudioContext(window,
+ true,
+ AudioChannel::Normal,
+ aNumberOfChannels,
+ aLength,
+ aSampleRate);
+
+ RegisterWeakMemoryReporter(object);
+
+ return object.forget();
+}
+
+bool AudioContext::CheckClosed(ErrorResult& aRv)
+{
+ if (mAudioContextState == AudioContextState::Closed) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return true;
+ }
+ return false;
+}
+
+already_AddRefed<AudioBufferSourceNode>
+AudioContext::CreateBufferSource(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<AudioBufferSourceNode> bufferNode =
+ new AudioBufferSourceNode(this);
+ return bufferNode.forget();
+}
+
+already_AddRefed<ConstantSourceNode>
+AudioContext::CreateConstantSource(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<ConstantSourceNode> constantSourceNode =
+ new ConstantSourceNode(this);
+ return constantSourceNode.forget();
+}
+
+already_AddRefed<AudioBuffer>
+AudioContext::CreateBuffer(uint32_t aNumberOfChannels, uint32_t aLength,
+ float aSampleRate,
+ ErrorResult& aRv)
+{
+ if (!aNumberOfChannels) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ return AudioBuffer::Create(this, aNumberOfChannels, aLength,
+ aSampleRate, aRv);
+}
+
+namespace {
+
+bool IsValidBufferSize(uint32_t aBufferSize) {
+ switch (aBufferSize) {
+ case 0: // let the implementation choose the buffer size
+ case 256:
+ case 512:
+ case 1024:
+ case 2048:
+ case 4096:
+ case 8192:
+ case 16384:
+ return true;
+ default:
+ return false;
+ }
+}
+
+} // namespace
+
+already_AddRefed<MediaStreamAudioDestinationNode>
+AudioContext::CreateMediaStreamDestination(ErrorResult& aRv)
+{
+ if (mIsOffline) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<MediaStreamAudioDestinationNode> node =
+ new MediaStreamAudioDestinationNode(this);
+ return node.forget();
+}
+
+already_AddRefed<ScriptProcessorNode>
+AudioContext::CreateScriptProcessor(uint32_t aBufferSize,
+ uint32_t aNumberOfInputChannels,
+ uint32_t aNumberOfOutputChannels,
+ ErrorResult& aRv)
+{
+ if ((aNumberOfInputChannels == 0 && aNumberOfOutputChannels == 0) ||
+ aNumberOfInputChannels > WebAudioUtils::MaxChannelCount ||
+ aNumberOfOutputChannels > WebAudioUtils::MaxChannelCount ||
+ !IsValidBufferSize(aBufferSize)) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<ScriptProcessorNode> scriptProcessor =
+ new ScriptProcessorNode(this, aBufferSize, aNumberOfInputChannels,
+ aNumberOfOutputChannels);
+ return scriptProcessor.forget();
+}
+
+already_AddRefed<AnalyserNode>
+AudioContext::CreateAnalyser(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<AnalyserNode> analyserNode = new AnalyserNode(this);
+ return analyserNode.forget();
+}
+
+already_AddRefed<StereoPannerNode>
+AudioContext::CreateStereoPanner(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<StereoPannerNode> stereoPannerNode = new StereoPannerNode(this);
+ return stereoPannerNode.forget();
+}
+
+already_AddRefed<MediaElementAudioSourceNode>
+AudioContext::CreateMediaElementSource(HTMLMediaElement& aMediaElement,
+ ErrorResult& aRv)
+{
+ if (mIsOffline) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ if (aMediaElement.ContainsRestrictedContent()) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<DOMMediaStream> stream =
+ aMediaElement.CaptureAudio(aRv, mDestination->Stream()->Graph());
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ return MediaElementAudioSourceNode::Create(this, stream, aRv);
+}
+
+already_AddRefed<MediaStreamAudioSourceNode>
+AudioContext::CreateMediaStreamSource(DOMMediaStream& aMediaStream,
+ ErrorResult& aRv)
+{
+ if (mIsOffline) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ return MediaStreamAudioSourceNode::Create(this, &aMediaStream, aRv);
+}
+
+already_AddRefed<GainNode>
+AudioContext::CreateGain(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<GainNode> gainNode = new GainNode(this);
+ return gainNode.forget();
+}
+
+already_AddRefed<WaveShaperNode>
+AudioContext::CreateWaveShaper(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<WaveShaperNode> waveShaperNode = new WaveShaperNode(this);
+ return waveShaperNode.forget();
+}
+
+already_AddRefed<DelayNode>
+AudioContext::CreateDelay(double aMaxDelayTime, ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ if (aMaxDelayTime > 0. && aMaxDelayTime < 180.) {
+ RefPtr<DelayNode> delayNode = new DelayNode(this, aMaxDelayTime);
+ return delayNode.forget();
+ }
+
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+}
+
+already_AddRefed<PannerNode>
+AudioContext::CreatePanner(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<PannerNode> pannerNode = new PannerNode(this);
+ mPannerNodes.PutEntry(pannerNode);
+ return pannerNode.forget();
+}
+
+already_AddRefed<ConvolverNode>
+AudioContext::CreateConvolver(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<ConvolverNode> convolverNode = new ConvolverNode(this);
+ return convolverNode.forget();
+}
+
+already_AddRefed<ChannelSplitterNode>
+AudioContext::CreateChannelSplitter(uint32_t aNumberOfOutputs, ErrorResult& aRv)
+{
+ if (aNumberOfOutputs == 0 ||
+ aNumberOfOutputs > WebAudioUtils::MaxChannelCount) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<ChannelSplitterNode> splitterNode =
+ new ChannelSplitterNode(this, aNumberOfOutputs);
+ return splitterNode.forget();
+}
+
+already_AddRefed<ChannelMergerNode>
+AudioContext::CreateChannelMerger(uint32_t aNumberOfInputs, ErrorResult& aRv)
+{
+ if (aNumberOfInputs == 0 ||
+ aNumberOfInputs > WebAudioUtils::MaxChannelCount) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<ChannelMergerNode> mergerNode =
+ new ChannelMergerNode(this, aNumberOfInputs);
+ return mergerNode.forget();
+}
+
+already_AddRefed<DynamicsCompressorNode>
+AudioContext::CreateDynamicsCompressor(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<DynamicsCompressorNode> compressorNode =
+ new DynamicsCompressorNode(this);
+ return compressorNode.forget();
+}
+
+already_AddRefed<BiquadFilterNode>
+AudioContext::CreateBiquadFilter(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<BiquadFilterNode> filterNode =
+ new BiquadFilterNode(this);
+ return filterNode.forget();
+}
+
+already_AddRefed<IIRFilterNode>
+AudioContext::CreateIIRFilter(const mozilla::dom::binding_detail::AutoSequence<double>& aFeedforward,
+ const mozilla::dom::binding_detail::AutoSequence<double>& aFeedback,
+ mozilla::ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ if (aFeedforward.Length() == 0 || aFeedforward.Length() > 20) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ if (aFeedback.Length() == 0 || aFeedback.Length() > 20) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ bool feedforwardAllZeros = true;
+ for (size_t i = 0; i < aFeedforward.Length(); ++i) {
+ if (aFeedforward.Elements()[i] != 0.0) {
+ feedforwardAllZeros = false;
+ }
+ }
+
+ if (feedforwardAllZeros || aFeedback.Elements()[0] == 0.0) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+
+ RefPtr<IIRFilterNode> filterNode =
+ new IIRFilterNode(this, aFeedforward, aFeedback);
+ return filterNode.forget();
+}
+
+already_AddRefed<OscillatorNode>
+AudioContext::CreateOscillator(ErrorResult& aRv)
+{
+ if (CheckClosed(aRv)) {
+ return nullptr;
+ }
+
+ RefPtr<OscillatorNode> oscillatorNode =
+ new OscillatorNode(this);
+ return oscillatorNode.forget();
+}
+
+already_AddRefed<PeriodicWave>
+AudioContext::CreatePeriodicWave(const Float32Array& aRealData,
+ const Float32Array& aImagData,
+ const PeriodicWaveConstraints& aConstraints,
+ ErrorResult& aRv)
+{
+ aRealData.ComputeLengthAndData();
+ aImagData.ComputeLengthAndData();
+
+ if (aRealData.Length() != aImagData.Length() ||
+ aRealData.Length() == 0) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return nullptr;
+ }
+
+ RefPtr<PeriodicWave> periodicWave =
+ new PeriodicWave(this, aRealData.Data(), aImagData.Data(),
+ aImagData.Length(), aConstraints.mDisableNormalization,
+ aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ return periodicWave.forget();
+}
+
+AudioListener*
+AudioContext::Listener()
+{
+ if (!mListener) {
+ mListener = new AudioListener(this);
+ }
+ return mListener;
+}
+
+already_AddRefed<Promise>
+AudioContext::DecodeAudioData(const ArrayBuffer& aBuffer,
+ const Optional<OwningNonNull<DecodeSuccessCallback> >& aSuccessCallback,
+ const Optional<OwningNonNull<DecodeErrorCallback> >& aFailureCallback,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject());
+ RefPtr<Promise> promise;
+ AutoJSAPI jsapi;
+ jsapi.Init();
+ JSContext* cx = jsapi.cx();
+ JSAutoCompartment ac(cx, aBuffer.Obj());
+
+ promise = Promise::Create(parentObject, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ aBuffer.ComputeLengthAndData();
+
+ if (aBuffer.IsShared()) {
+ // Throw if the object is mapping shared memory (must opt in).
+ aRv.ThrowTypeError<MSG_TYPEDARRAY_IS_SHARED>(NS_LITERAL_STRING("Argument of AudioContext.decodeAudioData"));
+ return nullptr;
+ }
+
+ // Detach the array buffer
+ size_t length = aBuffer.Length();
+ JS::RootedObject obj(cx, aBuffer.Obj());
+
+ uint8_t* data = static_cast<uint8_t*>(JS_StealArrayBufferContents(cx, obj));
+
+ // Sniff the content of the media.
+ // Failed type sniffing will be handled by AsyncDecodeWebAudio.
+ nsAutoCString contentType;
+ NS_SniffContent(NS_DATA_SNIFFER_CATEGORY, nullptr, data, length, contentType);
+
+ RefPtr<DecodeErrorCallback> failureCallback;
+ RefPtr<DecodeSuccessCallback> successCallback;
+ if (aFailureCallback.WasPassed()) {
+ failureCallback = &aFailureCallback.Value();
+ }
+ if (aSuccessCallback.WasPassed()) {
+ successCallback = &aSuccessCallback.Value();
+ }
+ RefPtr<WebAudioDecodeJob> job(
+ new WebAudioDecodeJob(contentType, this,
+ promise, successCallback, failureCallback));
+ AsyncDecodeWebAudio(contentType.get(), data, length, *job);
+ // Transfer the ownership to mDecodeJobs
+ mDecodeJobs.AppendElement(job.forget());
+
+ return promise.forget();
+}
+
+void
+AudioContext::RemoveFromDecodeQueue(WebAudioDecodeJob* aDecodeJob)
+{
+ mDecodeJobs.RemoveElement(aDecodeJob);
+}
+
+void
+AudioContext::RegisterActiveNode(AudioNode* aNode)
+{
+ if (!mIsShutDown) {
+ mActiveNodes.PutEntry(aNode);
+ }
+}
+
+void
+AudioContext::UnregisterActiveNode(AudioNode* aNode)
+{
+ mActiveNodes.RemoveEntry(aNode);
+}
+
+void
+AudioContext::UnregisterAudioBufferSourceNode(AudioBufferSourceNode* aNode)
+{
+ UpdatePannerSource();
+}
+
+void
+AudioContext::UnregisterPannerNode(PannerNode* aNode)
+{
+ mPannerNodes.RemoveEntry(aNode);
+ if (mListener) {
+ mListener->UnregisterPannerNode(aNode);
+ }
+}
+
+void
+AudioContext::UpdatePannerSource()
+{
+ for (auto iter = mPannerNodes.Iter(); !iter.Done(); iter.Next()) {
+ iter.Get()->GetKey()->FindConnectedSources();
+ }
+}
+
+uint32_t
+AudioContext::MaxChannelCount() const
+{
+ return mIsOffline ? mNumberOfChannels : CubebUtils::MaxNumberOfChannels();
+}
+
+uint32_t
+AudioContext::ActiveNodeCount() const
+{
+ return mActiveNodes.Count();
+}
+
+MediaStreamGraph*
+AudioContext::Graph() const
+{
+ return Destination()->Stream()->Graph();
+}
+
+MediaStream*
+AudioContext::DestinationStream() const
+{
+ if (Destination()) {
+ return Destination()->Stream();
+ }
+ return nullptr;
+}
+
+double
+AudioContext::CurrentTime() const
+{
+ MediaStream* stream = Destination()->Stream();
+ return stream->StreamTimeToSeconds(stream->GetCurrentTime());
+}
+
+void
+AudioContext::Shutdown()
+{
+ mIsShutDown = true;
+
+ if (!mIsOffline) {
+ ErrorResult dummy;
+ RefPtr<Promise> ignored = Close(dummy);
+ }
+
+ for (auto p : mPromiseGripArray) {
+ p->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
+ }
+
+ mPromiseGripArray.Clear();
+
+ // Release references to active nodes.
+ // Active AudioNodes don't unregister in destructors, at which point the
+ // Node is already unregistered.
+ mActiveNodes.Clear();
+
+ // For offline contexts, we can destroy the MediaStreamGraph at this point.
+ if (mIsOffline && mDestination) {
+ mDestination->OfflineShutdown();
+ }
+}
+
+StateChangeTask::StateChangeTask(AudioContext* aAudioContext,
+ void* aPromise,
+ AudioContextState aNewState)
+ : mAudioContext(aAudioContext)
+ , mPromise(aPromise)
+ , mAudioNodeStream(nullptr)
+ , mNewState(aNewState)
+{
+ MOZ_ASSERT(NS_IsMainThread(),
+ "This constructor should be used from the main thread.");
+}
+
+StateChangeTask::StateChangeTask(AudioNodeStream* aStream,
+ void* aPromise,
+ AudioContextState aNewState)
+ : mAudioContext(nullptr)
+ , mPromise(aPromise)
+ , mAudioNodeStream(aStream)
+ , mNewState(aNewState)
+{
+ MOZ_ASSERT(!NS_IsMainThread(),
+ "This constructor should be used from the graph thread.");
+}
+
+NS_IMETHODIMP
+StateChangeTask::Run()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mAudioContext && !mAudioNodeStream) {
+ return NS_OK;
+ }
+ if (mAudioNodeStream) {
+ AudioNode* node = mAudioNodeStream->Engine()->NodeMainThread();
+ if (!node) {
+ return NS_OK;
+ }
+ mAudioContext = node->Context();
+ if (!mAudioContext) {
+ return NS_OK;
+ }
+ }
+
+ mAudioContext->OnStateChanged(mPromise, mNewState);
+ // We have can't call Release() on the AudioContext on the MSG thread, so we
+ // unref it here, on the main thread.
+ mAudioContext = nullptr;
+
+ return NS_OK;
+}
+
+/* This runnable allows to fire the "statechange" event */
+class OnStateChangeTask final : public Runnable
+{
+public:
+ explicit OnStateChangeTask(AudioContext* aAudioContext)
+ : mAudioContext(aAudioContext)
+ {}
+
+ NS_IMETHODIMP
+ Run() override
+ {
+ nsPIDOMWindowInner* parent = mAudioContext->GetParentObject();
+ if (!parent) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsIDocument* doc = parent->GetExtantDoc();
+ if (!doc) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return nsContentUtils::DispatchTrustedEvent(doc,
+ static_cast<DOMEventTargetHelper*>(mAudioContext),
+ NS_LITERAL_STRING("statechange"),
+ false, false);
+ }
+
+private:
+ RefPtr<AudioContext> mAudioContext;
+};
+
+void
+AudioContext::OnStateChanged(void* aPromise, AudioContextState aNewState)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // This can happen if close() was called right after creating the
+ // AudioContext, before the context has switched to "running".
+ if (mAudioContextState == AudioContextState::Closed &&
+ aNewState == AudioContextState::Running &&
+ !aPromise) {
+ return;
+ }
+
+ // This can happen if this is called in reaction to a
+ // MediaStreamGraph shutdown, and a AudioContext was being
+ // suspended at the same time, for example if a page was being
+ // closed.
+ if (mAudioContextState == AudioContextState::Closed &&
+ aNewState == AudioContextState::Suspended) {
+ return;
+ }
+
+#ifndef WIN32 // Bug 1170547
+#ifndef XP_MACOSX
+#ifdef DEBUG
+
+ if (!((mAudioContextState == AudioContextState::Suspended &&
+ aNewState == AudioContextState::Running) ||
+ (mAudioContextState == AudioContextState::Running &&
+ aNewState == AudioContextState::Suspended) ||
+ (mAudioContextState == AudioContextState::Running &&
+ aNewState == AudioContextState::Closed) ||
+ (mAudioContextState == AudioContextState::Suspended &&
+ aNewState == AudioContextState::Closed) ||
+ (mAudioContextState == aNewState))) {
+ fprintf(stderr,
+ "Invalid transition: mAudioContextState: %d -> aNewState %d\n",
+ static_cast<int>(mAudioContextState), static_cast<int>(aNewState));
+ MOZ_ASSERT(false);
+ }
+
+#endif // DEBUG
+#endif // XP_MACOSX
+#endif // WIN32
+
+ MOZ_ASSERT(
+ mIsOffline || aPromise || aNewState == AudioContextState::Running,
+ "We should have a promise here if this is a real-time AudioContext."
+ "Or this is the first time we switch to \"running\".");
+
+ if (aPromise) {
+ Promise* promise = reinterpret_cast<Promise*>(aPromise);
+ // It is possible for the promise to have been removed from
+ // mPromiseGripArray if the cycle collector has severed our connections. DO
+ // NOT dereference the promise pointer in that case since it may point to
+ // already freed memory.
+ if (mPromiseGripArray.Contains(promise)) {
+ promise->MaybeResolveWithUndefined();
+ DebugOnly<bool> rv = mPromiseGripArray.RemoveElement(promise);
+ MOZ_ASSERT(rv, "Promise wasn't in the grip array?");
+ }
+ }
+
+ if (mAudioContextState != aNewState) {
+ RefPtr<OnStateChangeTask> onStateChangeTask =
+ new OnStateChangeTask(this);
+ NS_DispatchToMainThread(onStateChangeTask);
+ }
+
+ mAudioContextState = aNewState;
+}
+
+nsTArray<MediaStream*>
+AudioContext::GetAllStreams() const
+{
+ nsTArray<MediaStream*> streams;
+ for (auto iter = mAllNodes.ConstIter(); !iter.Done(); iter.Next()) {
+ MediaStream* s = iter.Get()->GetKey()->GetStream();
+ if (s) {
+ streams.AppendElement(s);
+ }
+ }
+ return streams;
+}
+
+already_AddRefed<Promise>
+AudioContext::Suspend(ErrorResult& aRv)
+{
+ nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject());
+ RefPtr<Promise> promise;
+ promise = Promise::Create(parentObject, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ if (mIsOffline) {
+ promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return promise.forget();
+ }
+
+ if (mAudioContextState == AudioContextState::Closed ||
+ mCloseCalled) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return promise.forget();
+ }
+
+ Destination()->Suspend();
+
+ mPromiseGripArray.AppendElement(promise);
+
+ nsTArray<MediaStream*> streams;
+ // If mSuspendCalled is true then we already suspended all our streams,
+ // so don't suspend them again (since suspend(); suspend(); resume(); should
+ // cancel both suspends). But we still need to do ApplyAudioContextOperation
+ // to ensure our new promise is resolved.
+ if (!mSuspendCalled) {
+ streams = GetAllStreams();
+ }
+ Graph()->ApplyAudioContextOperation(DestinationStream()->AsAudioNodeStream(),
+ streams,
+ AudioContextOperation::Suspend, promise);
+
+ mSuspendCalled = true;
+
+ return promise.forget();
+}
+
+already_AddRefed<Promise>
+AudioContext::Resume(ErrorResult& aRv)
+{
+ nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject());
+ RefPtr<Promise> promise;
+ promise = Promise::Create(parentObject, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ if (mIsOffline) {
+ promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return promise.forget();
+ }
+
+ if (mAudioContextState == AudioContextState::Closed ||
+ mCloseCalled) {
+ promise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return promise.forget();
+ }
+
+ Destination()->Resume();
+
+ nsTArray<MediaStream*> streams;
+ // If mSuspendCalled is false then we already resumed all our streams,
+ // so don't resume them again (since suspend(); resume(); resume(); should
+ // be OK). But we still need to do ApplyAudioContextOperation
+ // to ensure our new promise is resolved.
+ if (mSuspendCalled) {
+ streams = GetAllStreams();
+ }
+ mPromiseGripArray.AppendElement(promise);
+ Graph()->ApplyAudioContextOperation(DestinationStream()->AsAudioNodeStream(),
+ streams,
+ AudioContextOperation::Resume, promise);
+
+ mSuspendCalled = false;
+
+ return promise.forget();
+}
+
+already_AddRefed<Promise>
+AudioContext::Close(ErrorResult& aRv)
+{
+ nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject());
+ RefPtr<Promise> promise;
+ promise = Promise::Create(parentObject, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ if (mIsOffline) {
+ promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return promise.forget();
+ }
+
+ if (mAudioContextState == AudioContextState::Closed) {
+ promise->MaybeResolve(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return promise.forget();
+ }
+
+ if (Destination()) {
+ Destination()->DestroyAudioChannelAgent();
+ }
+
+ mPromiseGripArray.AppendElement(promise);
+
+ // This can be called when freeing a document, and the streams are dead at
+ // this point, so we need extra null-checks.
+ MediaStream* ds = DestinationStream();
+ if (ds) {
+ nsTArray<MediaStream*> streams;
+ // If mSuspendCalled or mCloseCalled are true then we already suspended
+ // all our streams, so don't suspend them again. But we still need to do
+ // ApplyAudioContextOperation to ensure our new promise is resolved.
+ if (!mSuspendCalled && !mCloseCalled) {
+ streams = GetAllStreams();
+ }
+ Graph()->ApplyAudioContextOperation(ds->AsAudioNodeStream(), streams,
+ AudioContextOperation::Close, promise);
+ }
+ mCloseCalled = true;
+
+ return promise.forget();
+}
+
+void
+AudioContext::RegisterNode(AudioNode* aNode)
+{
+ MOZ_ASSERT(!mAllNodes.Contains(aNode));
+ mAllNodes.PutEntry(aNode);
+}
+
+void
+AudioContext::UnregisterNode(AudioNode* aNode)
+{
+ MOZ_ASSERT(mAllNodes.Contains(aNode));
+ mAllNodes.RemoveEntry(aNode);
+}
+
+JSObject*
+AudioContext::GetGlobalJSObject() const
+{
+ nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject());
+ if (!parentObject) {
+ return nullptr;
+ }
+
+ // This can also return null.
+ return parentObject->GetGlobalJSObject();
+}
+
+already_AddRefed<Promise>
+AudioContext::StartRendering(ErrorResult& aRv)
+{
+ nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject());
+
+ MOZ_ASSERT(mIsOffline, "This should only be called on OfflineAudioContext");
+ if (mIsStarted) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return nullptr;
+ }
+
+ mIsStarted = true;
+ RefPtr<Promise> promise = Promise::Create(parentObject, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ mDestination->StartRendering(promise);
+
+ OnStateChanged(nullptr, AudioContextState::Running);
+
+ return promise.forget();
+}
+
+unsigned long
+AudioContext::Length()
+{
+ MOZ_ASSERT(mIsOffline);
+ return mDestination->Length();
+}
+
+void
+AudioContext::Mute() const
+{
+ MOZ_ASSERT(!mIsOffline);
+ if (mDestination) {
+ mDestination->Mute();
+ }
+}
+
+void
+AudioContext::Unmute() const
+{
+ MOZ_ASSERT(!mIsOffline);
+ if (mDestination) {
+ mDestination->Unmute();
+ }
+}
+
+AudioChannel
+AudioContext::MozAudioChannelType() const
+{
+ return mDestination->MozAudioChannelType();
+}
+
+AudioChannel
+AudioContext::TestAudioChannelInAudioNodeStream()
+{
+ MediaStream* stream = mDestination->Stream();
+ MOZ_ASSERT(stream);
+
+ return stream->AudioChannelType();
+}
+
+size_t
+AudioContext::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ // AudioNodes are tracked separately because we do not want the AudioContext
+ // to track all of the AudioNodes it creates, so we wouldn't be able to
+ // traverse them from here.
+
+ size_t amount = aMallocSizeOf(this);
+ if (mListener) {
+ amount += mListener->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ amount += mDecodeJobs.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (uint32_t i = 0; i < mDecodeJobs.Length(); ++i) {
+ amount += mDecodeJobs[i]->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ amount += mActiveNodes.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mPannerNodes.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+NS_IMETHODIMP
+AudioContext::CollectReports(nsIHandleReportCallback* aHandleReport,
+ nsISupports* aData, bool aAnonymize)
+{
+ const nsLiteralCString
+ nodeDescription("Memory used by AudioNode DOM objects (Web Audio).");
+ for (auto iter = mAllNodes.ConstIter(); !iter.Done(); iter.Next()) {
+ AudioNode* node = iter.Get()->GetKey();
+ int64_t amount = node->SizeOfIncludingThis(MallocSizeOf);
+ nsPrintfCString domNodePath("explicit/webaudio/audio-node/%s/dom-nodes",
+ node->NodeType());
+ aHandleReport->Callback(EmptyCString(), domNodePath, KIND_HEAP, UNITS_BYTES,
+ amount, nodeDescription, aData);
+ }
+
+ int64_t amount = SizeOfIncludingThis(MallocSizeOf);
+ MOZ_COLLECT_REPORT(
+ "explicit/webaudio/audiocontext", KIND_HEAP, UNITS_BYTES, amount,
+ "Memory used by AudioContext objects (Web Audio).");
+
+ return NS_OK;
+}
+
+BasicWaveFormCache*
+AudioContext::GetBasicWaveFormCache()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!mBasicWaveFormCache) {
+ mBasicWaveFormCache = new BasicWaveFormCache(SampleRate());
+ }
+ return mBasicWaveFormCache;
+}
+
+BasicWaveFormCache::BasicWaveFormCache(uint32_t aSampleRate)
+ : mSampleRate(aSampleRate)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+}
+BasicWaveFormCache::~BasicWaveFormCache()
+{ }
+
+WebCore::PeriodicWave*
+BasicWaveFormCache::GetBasicWaveForm(OscillatorType aType)
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ if (aType == OscillatorType::Sawtooth) {
+ if (!mSawtooth) {
+ mSawtooth = WebCore::PeriodicWave::createSawtooth(mSampleRate);
+ }
+ return mSawtooth;
+ } else if (aType == OscillatorType::Square) {
+ if (!mSquare) {
+ mSquare = WebCore::PeriodicWave::createSquare(mSampleRate);
+ }
+ return mSquare;
+ } else if (aType == OscillatorType::Triangle) {
+ if (!mTriangle) {
+ mTriangle = WebCore::PeriodicWave::createTriangle(mSampleRate);
+ }
+ return mTriangle;
+ } else {
+ MOZ_ASSERT(false, "Not reached");
+ return nullptr;
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioContext.h b/dom/media/webaudio/AudioContext.h
new file mode 100644
index 000000000..069efa986
--- /dev/null
+++ b/dom/media/webaudio/AudioContext.h
@@ -0,0 +1,382 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioContext_h_
+#define AudioContext_h_
+
+#include "mozilla/dom/AudioChannelBinding.h"
+#include "MediaBufferDecoder.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/MemoryReporting.h"
+#include "mozilla/dom/TypedArray.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsHashKeys.h"
+#include "nsTHashtable.h"
+#include "js/TypeDecls.h"
+#include "nsIMemoryReporter.h"
+
+// X11 has a #define for CurrentTime. Unbelievable :-(.
+// See dom/media/DOMMediaStream.h for more fun!
+#ifdef CurrentTime
+#undef CurrentTime
+#endif
+
+namespace WebCore {
+ class PeriodicWave;
+} // namespace WebCore
+
+class nsPIDOMWindowInner;
+
+namespace mozilla {
+
+class DOMMediaStream;
+class ErrorResult;
+class MediaStream;
+class MediaStreamGraph;
+class AudioNodeStream;
+
+namespace dom {
+
+enum class AudioContextState : uint32_t;
+class AnalyserNode;
+class AudioBuffer;
+class AudioBufferSourceNode;
+class AudioDestinationNode;
+class AudioListener;
+class AudioNode;
+class BiquadFilterNode;
+class ChannelMergerNode;
+class ChannelSplitterNode;
+class ConstantSourceNode;
+class ConvolverNode;
+class DelayNode;
+class DynamicsCompressorNode;
+class GainNode;
+class GlobalObject;
+class HTMLMediaElement;
+class IIRFilterNode;
+class MediaElementAudioSourceNode;
+class MediaStreamAudioDestinationNode;
+class MediaStreamAudioSourceNode;
+class OscillatorNode;
+class PannerNode;
+class ScriptProcessorNode;
+class StereoPannerNode;
+class WaveShaperNode;
+class PeriodicWave;
+struct PeriodicWaveConstraints;
+class Promise;
+enum class OscillatorType : uint32_t;
+
+// This is addrefed by the OscillatorNodeEngine on the main thread
+// and then used from the MSG thread.
+// It can be released either from the graph thread or the main thread.
+class BasicWaveFormCache
+{
+public:
+ explicit BasicWaveFormCache(uint32_t aSampleRate);
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BasicWaveFormCache)
+ WebCore::PeriodicWave* GetBasicWaveForm(OscillatorType aType);
+private:
+ ~BasicWaveFormCache();
+ RefPtr<WebCore::PeriodicWave> mSawtooth;
+ RefPtr<WebCore::PeriodicWave> mSquare;
+ RefPtr<WebCore::PeriodicWave> mTriangle;
+ uint32_t mSampleRate;
+};
+
+
+/* This runnable allows the MSG to notify the main thread when audio is actually
+ * flowing */
+class StateChangeTask final : public Runnable
+{
+public:
+ /* This constructor should be used when this event is sent from the main
+ * thread. */
+ StateChangeTask(AudioContext* aAudioContext, void* aPromise, AudioContextState aNewState);
+
+ /* This constructor should be used when this event is sent from the audio
+ * thread. */
+ StateChangeTask(AudioNodeStream* aStream, void* aPromise, AudioContextState aNewState);
+
+ NS_IMETHOD Run() override;
+
+private:
+ RefPtr<AudioContext> mAudioContext;
+ void* mPromise;
+ RefPtr<AudioNodeStream> mAudioNodeStream;
+ AudioContextState mNewState;
+};
+
+enum class AudioContextOperation { Suspend, Resume, Close };
+
+class AudioContext final : public DOMEventTargetHelper,
+ public nsIMemoryReporter
+{
+ AudioContext(nsPIDOMWindowInner* aParentWindow,
+ bool aIsOffline,
+ AudioChannel aChannel,
+ uint32_t aNumberOfChannels = 0,
+ uint32_t aLength = 0,
+ float aSampleRate = 0.0f);
+ ~AudioContext();
+
+ nsresult Init();
+
+public:
+ typedef uint64_t AudioContextId;
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioContext,
+ DOMEventTargetHelper)
+ MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf)
+
+ nsPIDOMWindowInner* GetParentObject() const
+ {
+ return GetOwner();
+ }
+
+ void Shutdown(); // idempotent
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ using DOMEventTargetHelper::DispatchTrustedEvent;
+
+ // Constructor for regular AudioContext
+ static already_AddRefed<AudioContext>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
+
+ // Constructor for regular AudioContext. A default audio channel is needed.
+ static already_AddRefed<AudioContext>
+ Constructor(const GlobalObject& aGlobal,
+ AudioChannel aChannel,
+ ErrorResult& aRv);
+
+ // Constructor for offline AudioContext
+ static already_AddRefed<AudioContext>
+ Constructor(const GlobalObject& aGlobal,
+ uint32_t aNumberOfChannels,
+ uint32_t aLength,
+ float aSampleRate,
+ ErrorResult& aRv);
+
+ // AudioContext methods
+
+ AudioDestinationNode* Destination() const
+ {
+ return mDestination;
+ }
+
+ float SampleRate() const
+ {
+ return mSampleRate;
+ }
+
+ bool ShouldSuspendNewStream() const { return mSuspendCalled; }
+
+ double CurrentTime() const;
+
+ AudioListener* Listener();
+
+ AudioContextState State() const { return mAudioContextState; }
+
+ // Those three methods return a promise to content, that is resolved when an
+ // (possibly long) operation is completed on the MSG (and possibly other)
+ // thread(s). To avoid having to match the calls and asychronous result when
+ // the operation is completed, we keep a reference to the promises on the main
+ // thread, and then send the promises pointers down the MSG thread, as a void*
+ // (to make it very clear that the pointer is to merely be treated as an ID).
+ // When back on the main thread, we can resolve or reject the promise, by
+ // casting it back to a `Promise*` while asserting we're back on the main
+ // thread and removing the reference we added.
+ already_AddRefed<Promise> Suspend(ErrorResult& aRv);
+ already_AddRefed<Promise> Resume(ErrorResult& aRv);
+ already_AddRefed<Promise> Close(ErrorResult& aRv);
+ IMPL_EVENT_HANDLER(statechange)
+
+ already_AddRefed<AudioBufferSourceNode> CreateBufferSource(ErrorResult& aRv);
+
+ already_AddRefed<ConstantSourceNode> CreateConstantSource(ErrorResult& aRv);
+
+ already_AddRefed<AudioBuffer>
+ CreateBuffer(uint32_t aNumberOfChannels, uint32_t aLength, float aSampleRate,
+ ErrorResult& aRv);
+
+ already_AddRefed<MediaStreamAudioDestinationNode>
+ CreateMediaStreamDestination(ErrorResult& aRv);
+
+ already_AddRefed<ScriptProcessorNode>
+ CreateScriptProcessor(uint32_t aBufferSize,
+ uint32_t aNumberOfInputChannels,
+ uint32_t aNumberOfOutputChannels,
+ ErrorResult& aRv);
+
+ already_AddRefed<StereoPannerNode>
+ CreateStereoPanner(ErrorResult& aRv);
+
+ already_AddRefed<AnalyserNode>
+ CreateAnalyser(ErrorResult& aRv);
+
+ already_AddRefed<GainNode>
+ CreateGain(ErrorResult& aRv);
+
+ already_AddRefed<WaveShaperNode>
+ CreateWaveShaper(ErrorResult& aRv);
+
+ already_AddRefed<MediaElementAudioSourceNode>
+ CreateMediaElementSource(HTMLMediaElement& aMediaElement, ErrorResult& aRv);
+ already_AddRefed<MediaStreamAudioSourceNode>
+ CreateMediaStreamSource(DOMMediaStream& aMediaStream, ErrorResult& aRv);
+
+ already_AddRefed<DelayNode>
+ CreateDelay(double aMaxDelayTime, ErrorResult& aRv);
+
+ already_AddRefed<PannerNode>
+ CreatePanner(ErrorResult& aRv);
+
+ already_AddRefed<ConvolverNode>
+ CreateConvolver(ErrorResult& aRv);
+
+ already_AddRefed<ChannelSplitterNode>
+ CreateChannelSplitter(uint32_t aNumberOfOutputs, ErrorResult& aRv);
+
+ already_AddRefed<ChannelMergerNode>
+ CreateChannelMerger(uint32_t aNumberOfInputs, ErrorResult& aRv);
+
+ already_AddRefed<DynamicsCompressorNode>
+ CreateDynamicsCompressor(ErrorResult& aRv);
+
+ already_AddRefed<BiquadFilterNode>
+ CreateBiquadFilter(ErrorResult& aRv);
+
+ already_AddRefed<IIRFilterNode>
+ CreateIIRFilter(const mozilla::dom::binding_detail::AutoSequence<double>& aFeedforward,
+ const mozilla::dom::binding_detail::AutoSequence<double>& aFeedback,
+ mozilla::ErrorResult& aRv);
+
+ already_AddRefed<OscillatorNode>
+ CreateOscillator(ErrorResult& aRv);
+
+ already_AddRefed<PeriodicWave>
+ CreatePeriodicWave(const Float32Array& aRealData, const Float32Array& aImagData,
+ const PeriodicWaveConstraints& aConstraints,
+ ErrorResult& aRv);
+
+ already_AddRefed<Promise>
+ DecodeAudioData(const ArrayBuffer& aBuffer,
+ const Optional<OwningNonNull<DecodeSuccessCallback> >& aSuccessCallback,
+ const Optional<OwningNonNull<DecodeErrorCallback> >& aFailureCallback,
+ ErrorResult& aRv);
+
+ // OfflineAudioContext methods
+ already_AddRefed<Promise> StartRendering(ErrorResult& aRv);
+ IMPL_EVENT_HANDLER(complete)
+ unsigned long Length();
+
+ bool IsOffline() const { return mIsOffline; }
+
+ MediaStreamGraph* Graph() const;
+ MediaStream* DestinationStream() const;
+
+ // Nodes register here if they will produce sound even if they have silent
+ // or no input connections. The AudioContext will keep registered nodes
+ // alive until the context is collected. This takes care of "playing"
+ // references and "tail-time" references.
+ void RegisterActiveNode(AudioNode* aNode);
+ // Nodes unregister when they have finished producing sound for the
+ // foreseeable future.
+ // Do NOT call UnregisterActiveNode from an AudioNode destructor.
+ // If the destructor is called, then the Node has already been unregistered.
+ // The destructor may be called during hashtable enumeration, during which
+ // unregistering would not be safe.
+ void UnregisterActiveNode(AudioNode* aNode);
+
+ void UnregisterAudioBufferSourceNode(AudioBufferSourceNode* aNode);
+ void UnregisterPannerNode(PannerNode* aNode);
+ void UpdatePannerSource();
+
+ uint32_t MaxChannelCount() const;
+
+ uint32_t ActiveNodeCount() const;
+
+ void Mute() const;
+ void Unmute() const;
+
+ JSObject* GetGlobalJSObject() const;
+
+ AudioChannel MozAudioChannelType() const;
+
+ AudioChannel TestAudioChannelInAudioNodeStream();
+
+ void RegisterNode(AudioNode* aNode);
+ void UnregisterNode(AudioNode* aNode);
+
+ void OnStateChanged(void* aPromise, AudioContextState aNewState);
+
+ BasicWaveFormCache* GetBasicWaveFormCache();
+
+ IMPL_EVENT_HANDLER(mozinterruptbegin)
+ IMPL_EVENT_HANDLER(mozinterruptend)
+
+private:
+ void DisconnectFromWindow();
+ void RemoveFromDecodeQueue(WebAudioDecodeJob* aDecodeJob);
+ void ShutdownDecoder();
+
+ size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+ NS_DECL_NSIMEMORYREPORTER
+
+ friend struct ::mozilla::WebAudioDecodeJob;
+
+ bool CheckClosed(ErrorResult& aRv);
+
+ nsTArray<MediaStream*> GetAllStreams() const;
+
+private:
+ // Each AudioContext has an id, that is passed down the MediaStreams that
+ // back the AudioNodes, so we can easily compute the set of all the
+ // MediaStreams for a given context, on the MediasStreamGraph side.
+ const AudioContextId mId;
+ // Note that it's important for mSampleRate to be initialized before
+ // mDestination, as mDestination's constructor needs to access it!
+ const float mSampleRate;
+ AudioContextState mAudioContextState;
+ RefPtr<AudioDestinationNode> mDestination;
+ RefPtr<AudioListener> mListener;
+ nsTArray<RefPtr<WebAudioDecodeJob> > mDecodeJobs;
+ // This array is used to keep the suspend/resume/close promises alive until
+ // they are resolved, so we can safely pass them accross threads.
+ nsTArray<RefPtr<Promise>> mPromiseGripArray;
+ // See RegisterActiveNode. These will keep the AudioContext alive while it
+ // is rendering and the window remains alive.
+ nsTHashtable<nsRefPtrHashKey<AudioNode> > mActiveNodes;
+ // Raw (non-owning) references to all AudioNodes for this AudioContext.
+ nsTHashtable<nsPtrHashKey<AudioNode> > mAllNodes;
+ // Hashsets containing all the PannerNodes, to compute the doppler shift.
+ // These are weak pointers.
+ nsTHashtable<nsPtrHashKey<PannerNode> > mPannerNodes;
+ // Cache to avoid recomputing basic waveforms all the time.
+ RefPtr<BasicWaveFormCache> mBasicWaveFormCache;
+ // Number of channels passed in the OfflineAudioContext ctor.
+ uint32_t mNumberOfChannels;
+ bool mIsOffline;
+ bool mIsStarted;
+ bool mIsShutDown;
+ // Close has been called, reject suspend and resume call.
+ bool mCloseCalled;
+ // Suspend has been called with no following resume.
+ bool mSuspendCalled;
+};
+
+static const dom::AudioContext::AudioContextId NO_AUDIO_CONTEXT = 0;
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioDestinationNode.cpp b/dom/media/webaudio/AudioDestinationNode.cpp
new file mode 100644
index 000000000..29a9de736
--- /dev/null
+++ b/dom/media/webaudio/AudioDestinationNode.cpp
@@ -0,0 +1,680 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioDestinationNode.h"
+#include "AlignmentUtils.h"
+#include "AudioContext.h"
+#include "mozilla/dom/AudioDestinationNodeBinding.h"
+#include "mozilla/dom/ScriptSettings.h"
+#include "mozilla/Services.h"
+#include "AudioChannelAgent.h"
+#include "AudioChannelService.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "MediaStreamGraph.h"
+#include "OfflineAudioCompletionEvent.h"
+#include "nsContentUtils.h"
+#include "nsIInterfaceRequestorUtils.h"
+#include "nsIDocShell.h"
+#include "nsIPermissionManager.h"
+#include "nsIScriptObjectPrincipal.h"
+#include "nsServiceManagerUtils.h"
+#include "mozilla/dom/Promise.h"
+
+namespace mozilla {
+namespace dom {
+
+static uint8_t gWebAudioOutputKey;
+
+class OfflineDestinationNodeEngine final : public AudioNodeEngine
+{
+public:
+ OfflineDestinationNodeEngine(AudioDestinationNode* aNode,
+ uint32_t aNumberOfChannels,
+ uint32_t aLength,
+ float aSampleRate)
+ : AudioNodeEngine(aNode)
+ , mWriteIndex(0)
+ , mNumberOfChannels(aNumberOfChannels)
+ , mLength(aLength)
+ , mSampleRate(aSampleRate)
+ , mBufferAllocated(false)
+ {
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ // Do this just for the sake of political correctness; this output
+ // will not go anywhere.
+ *aOutput = aInput;
+
+ // The output buffer is allocated lazily, on the rendering thread, when
+ // non-null input is received.
+ if (!mBufferAllocated && !aInput.IsNull()) {
+ // These allocations might fail if content provides a huge number of
+ // channels or size, but it's OK since we'll deal with the failure
+ // gracefully.
+ mBuffer = ThreadSharedFloatArrayBufferList::
+ Create(mNumberOfChannels, mLength, fallible);
+ if (mBuffer && mWriteIndex) {
+ // Zero leading for any null chunks that were skipped.
+ for (uint32_t i = 0; i < mNumberOfChannels; ++i) {
+ float* channelData = mBuffer->GetDataForWrite(i);
+ PodZero(channelData, mWriteIndex);
+ }
+ }
+
+ mBufferAllocated = true;
+ }
+
+ // Skip copying if there is no buffer.
+ uint32_t outputChannelCount = mBuffer ? mNumberOfChannels : 0;
+
+ // Record our input buffer
+ MOZ_ASSERT(mWriteIndex < mLength, "How did this happen?");
+ const uint32_t duration = std::min(WEBAUDIO_BLOCK_SIZE, mLength - mWriteIndex);
+ const uint32_t inputChannelCount = aInput.ChannelCount();
+ for (uint32_t i = 0; i < outputChannelCount; ++i) {
+ float* outputData = mBuffer->GetDataForWrite(i) + mWriteIndex;
+ if (aInput.IsNull() || i >= inputChannelCount) {
+ PodZero(outputData, duration);
+ } else {
+ const float* inputBuffer = static_cast<const float*>(aInput.mChannelData[i]);
+ if (duration == WEBAUDIO_BLOCK_SIZE && IS_ALIGNED16(inputBuffer)) {
+ // Use the optimized version of the copy with scale operation
+ AudioBlockCopyChannelWithScale(inputBuffer, aInput.mVolume,
+ outputData);
+ } else {
+ if (aInput.mVolume == 1.0f) {
+ PodCopy(outputData, inputBuffer, duration);
+ } else {
+ for (uint32_t j = 0; j < duration; ++j) {
+ outputData[j] = aInput.mVolume * inputBuffer[j];
+ }
+ }
+ }
+ }
+ }
+ mWriteIndex += duration;
+
+ if (mWriteIndex >= mLength) {
+ NS_ASSERTION(mWriteIndex == mLength, "Overshot length");
+ // Go to finished state. When the graph's current time eventually reaches
+ // the end of the stream, then the main thread will be notified and we'll
+ // shut down the AudioContext.
+ *aFinished = true;
+ }
+ }
+
+ bool IsActive() const override
+ {
+ // Keep processing to track stream time, which is used for all timelines
+ // associated with the same AudioContext.
+ return true;
+ }
+
+
+ class OnCompleteTask final : public Runnable
+ {
+ public:
+ OnCompleteTask(AudioContext* aAudioContext, AudioBuffer* aRenderedBuffer)
+ : mAudioContext(aAudioContext)
+ , mRenderedBuffer(aRenderedBuffer)
+ {}
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<OfflineAudioCompletionEvent> event =
+ new OfflineAudioCompletionEvent(mAudioContext, nullptr, nullptr);
+ event->InitEvent(mRenderedBuffer);
+ mAudioContext->DispatchTrustedEvent(event);
+
+ return NS_OK;
+ }
+ private:
+ RefPtr<AudioContext> mAudioContext;
+ RefPtr<AudioBuffer> mRenderedBuffer;
+ };
+
+ void FireOfflineCompletionEvent(AudioDestinationNode* aNode)
+ {
+ AudioContext* context = aNode->Context();
+ context->Shutdown();
+ // Shutdown drops self reference, but the context is still referenced by aNode,
+ // which is strongly referenced by the runnable that called
+ // AudioDestinationNode::FireOfflineCompletionEvent.
+
+ // Create the input buffer
+ ErrorResult rv;
+ RefPtr<AudioBuffer> renderedBuffer =
+ AudioBuffer::Create(context, mNumberOfChannels, mLength, mSampleRate,
+ mBuffer.forget(), rv);
+ if (rv.Failed()) {
+ rv.SuppressException();
+ return;
+ }
+
+ aNode->ResolvePromise(renderedBuffer);
+
+ RefPtr<OnCompleteTask> onCompleteTask =
+ new OnCompleteTask(context, renderedBuffer);
+ NS_DispatchToMainThread(onCompleteTask);
+
+ context->OnStateChanged(nullptr, AudioContextState::Closed);
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ if (mBuffer) {
+ amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ // The input to the destination node is recorded in mBuffer.
+ // When this buffer fills up with mLength frames, the buffered input is sent
+ // to the main thread in order to dispatch OfflineAudioCompletionEvent.
+ RefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
+ // An index representing the next offset in mBuffer to be written to.
+ uint32_t mWriteIndex;
+ uint32_t mNumberOfChannels;
+ // How many frames the OfflineAudioContext intends to produce.
+ uint32_t mLength;
+ float mSampleRate;
+ bool mBufferAllocated;
+};
+
+class InputMutedRunnable final : public Runnable
+{
+public:
+ InputMutedRunnable(AudioNodeStream* aStream,
+ bool aInputMuted)
+ : mStream(aStream)
+ , mInputMuted(aInputMuted)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<AudioNode> node = mStream->Engine()->NodeMainThread();
+
+ if (node) {
+ RefPtr<AudioDestinationNode> destinationNode =
+ static_cast<AudioDestinationNode*>(node.get());
+ destinationNode->InputMuted(mInputMuted);
+ }
+ return NS_OK;
+ }
+
+private:
+ RefPtr<AudioNodeStream> mStream;
+ bool mInputMuted;
+};
+
+class DestinationNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit DestinationNodeEngine(AudioDestinationNode* aNode)
+ : AudioNodeEngine(aNode)
+ , mVolume(1.0f)
+ , mLastInputMuted(true)
+ , mSuspended(false)
+ {
+ MOZ_ASSERT(aNode);
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ *aOutput = aInput;
+ aOutput->mVolume *= mVolume;
+
+ if (mSuspended) {
+ return;
+ }
+
+ bool newInputMuted = aInput.IsNull() || aInput.IsMuted();
+ if (newInputMuted != mLastInputMuted) {
+ mLastInputMuted = newInputMuted;
+
+ RefPtr<InputMutedRunnable> runnable =
+ new InputMutedRunnable(aStream, newInputMuted);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(runnable.forget());
+ }
+ }
+
+ bool IsActive() const override
+ {
+ // Keep processing to track stream time, which is used for all timelines
+ // associated with the same AudioContext. If there are no other engines
+ // for the AudioContext, then this could return false to suspend the
+ // stream, but the stream is blocked anyway through
+ // AudioDestinationNode::SetIsOnlyNodeForContext().
+ return true;
+ }
+
+ void SetDoubleParameter(uint32_t aIndex, double aParam) override
+ {
+ if (aIndex == VOLUME) {
+ mVolume = aParam;
+ }
+ }
+
+ void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
+ {
+ if (aIndex == SUSPENDED) {
+ mSuspended = !!aParam;
+ if (mSuspended) {
+ mLastInputMuted = true;
+ }
+ }
+ }
+
+ enum Parameters {
+ VOLUME,
+ SUSPENDED,
+ };
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ float mVolume;
+ bool mLastInputMuted;
+ bool mSuspended;
+};
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(AudioDestinationNode, AudioNode,
+ mAudioChannelAgent,
+ mOfflineRenderingPromise)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioDestinationNode)
+ NS_INTERFACE_MAP_ENTRY(nsIAudioChannelAgentCallback)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(AudioDestinationNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(AudioDestinationNode, AudioNode)
+
+AudioDestinationNode::AudioDestinationNode(AudioContext* aContext,
+ bool aIsOffline,
+ AudioChannel aChannel,
+ uint32_t aNumberOfChannels,
+ uint32_t aLength, float aSampleRate)
+ : AudioNode(aContext, aIsOffline ? aNumberOfChannels : 2,
+ ChannelCountMode::Explicit, ChannelInterpretation::Speakers)
+ , mFramesToProduce(aLength)
+ , mAudioChannel(AudioChannel::Normal)
+ , mIsOffline(aIsOffline)
+ , mAudioChannelSuspended(false)
+ , mCaptured(false)
+{
+ MediaStreamGraph* graph = aIsOffline ?
+ MediaStreamGraph::CreateNonRealtimeInstance(aSampleRate) :
+ MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER, aChannel);
+ AudioNodeEngine* engine = aIsOffline ?
+ new OfflineDestinationNodeEngine(this, aNumberOfChannels,
+ aLength, aSampleRate) :
+ static_cast<AudioNodeEngine*>(new DestinationNodeEngine(this));
+
+ AudioNodeStream::Flags flags =
+ AudioNodeStream::NEED_MAIN_THREAD_CURRENT_TIME |
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED |
+ AudioNodeStream::EXTERNAL_OUTPUT;
+ mStream = AudioNodeStream::Create(aContext, engine, flags, graph);
+ mStream->AddMainThreadListener(this);
+ mStream->AddAudioOutput(&gWebAudioOutputKey);
+
+ if (!aIsOffline) {
+ graph->NotifyWhenGraphStarted(mStream);
+ }
+
+ if (aChannel != AudioChannel::Normal) {
+ ErrorResult rv;
+ SetMozAudioChannelType(aChannel, rv);
+ }
+}
+
+AudioDestinationNode::~AudioDestinationNode()
+{
+}
+
+size_t
+AudioDestinationNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ // Might be useful in the future:
+ // - mAudioChannelAgent
+ return amount;
+}
+
+size_t
+AudioDestinationNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+AudioDestinationNode::DestroyAudioChannelAgent()
+{
+ if (mAudioChannelAgent && !Context()->IsOffline()) {
+ mAudioChannelAgent->NotifyStoppedPlaying();
+ mAudioChannelAgent = nullptr;
+ }
+}
+
+void
+AudioDestinationNode::DestroyMediaStream()
+{
+ DestroyAudioChannelAgent();
+
+ if (!mStream)
+ return;
+
+ mStream->RemoveMainThreadListener(this);
+ MediaStreamGraph* graph = mStream->Graph();
+ if (graph->IsNonRealtime()) {
+ MediaStreamGraph::DestroyNonRealtimeInstance(graph);
+ }
+ AudioNode::DestroyMediaStream();
+}
+
+void
+AudioDestinationNode::NotifyMainThreadStreamFinished()
+{
+ MOZ_ASSERT(mStream->IsFinished());
+
+ if (mIsOffline) {
+ NS_DispatchToCurrentThread(NewRunnableMethod(this,
+ &AudioDestinationNode::FireOfflineCompletionEvent));
+ }
+}
+
+void
+AudioDestinationNode::FireOfflineCompletionEvent()
+{
+ OfflineDestinationNodeEngine* engine =
+ static_cast<OfflineDestinationNodeEngine*>(Stream()->Engine());
+ engine->FireOfflineCompletionEvent(this);
+}
+
+void
+AudioDestinationNode::ResolvePromise(AudioBuffer* aRenderedBuffer)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mIsOffline);
+ mOfflineRenderingPromise->MaybeResolve(aRenderedBuffer);
+}
+
+uint32_t
+AudioDestinationNode::MaxChannelCount() const
+{
+ return Context()->MaxChannelCount();
+}
+
+void
+AudioDestinationNode::SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv)
+{
+ if (aChannelCount > MaxChannelCount()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ AudioNode::SetChannelCount(aChannelCount, aRv);
+}
+
+void
+AudioDestinationNode::Mute()
+{
+ MOZ_ASSERT(Context() && !Context()->IsOffline());
+ SendDoubleParameterToStream(DestinationNodeEngine::VOLUME, 0.0f);
+}
+
+void
+AudioDestinationNode::Unmute()
+{
+ MOZ_ASSERT(Context() && !Context()->IsOffline());
+ SendDoubleParameterToStream(DestinationNodeEngine::VOLUME, 1.0f);
+}
+
+void
+AudioDestinationNode::Suspend()
+{
+ DestroyAudioChannelAgent();
+ SendInt32ParameterToStream(DestinationNodeEngine::SUSPENDED, 1);
+}
+
+void
+AudioDestinationNode::Resume()
+{
+ CreateAudioChannelAgent();
+ SendInt32ParameterToStream(DestinationNodeEngine::SUSPENDED, 0);
+}
+
+void
+AudioDestinationNode::OfflineShutdown()
+{
+ MOZ_ASSERT(Context() && Context()->IsOffline(),
+ "Should only be called on a valid OfflineAudioContext");
+
+ MediaStreamGraph::DestroyNonRealtimeInstance(mStream->Graph());
+ mOfflineRenderingRef.Drop(this);
+}
+
+JSObject*
+AudioDestinationNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioDestinationNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+AudioDestinationNode::StartRendering(Promise* aPromise)
+{
+ mOfflineRenderingPromise = aPromise;
+ mOfflineRenderingRef.Take(this);
+ mStream->Graph()->StartNonRealtimeProcessing(mFramesToProduce);
+}
+
+NS_IMETHODIMP
+AudioDestinationNode::WindowVolumeChanged(float aVolume, bool aMuted)
+{
+ if (!mStream) {
+ return NS_OK;
+ }
+
+ float volume = aMuted ? 0.0 : aVolume;
+ mStream->SetAudioOutputVolume(&gWebAudioOutputKey, volume);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+AudioDestinationNode::WindowSuspendChanged(nsSuspendedTypes aSuspend)
+{
+ if (!mStream) {
+ return NS_OK;
+ }
+
+ bool suspended = (aSuspend != nsISuspendedTypes::NONE_SUSPENDED);
+ if (mAudioChannelSuspended == suspended) {
+ return NS_OK;
+ }
+
+ mAudioChannelSuspended = suspended;
+ Context()->DispatchTrustedEvent(!suspended ?
+ NS_LITERAL_STRING("mozinterruptend") :
+ NS_LITERAL_STRING("mozinterruptbegin"));
+
+ DisabledTrackMode disabledMode = suspended ? DisabledTrackMode::SILENCE_BLACK
+ : DisabledTrackMode::ENABLED;
+ mStream->SetTrackEnabled(AudioNodeStream::AUDIO_TRACK, disabledMode);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+AudioDestinationNode::WindowAudioCaptureChanged(bool aCapture)
+{
+ MOZ_ASSERT(mAudioChannelAgent);
+
+ if (!mStream || Context()->IsOffline()) {
+ return NS_OK;
+ }
+
+ nsCOMPtr<nsPIDOMWindowInner> ownerWindow = GetOwner();
+ if (!ownerWindow) {
+ return NS_OK;
+ }
+
+ if (aCapture != mCaptured) {
+ if (aCapture) {
+ nsCOMPtr<nsPIDOMWindowInner> window = Context()->GetParentObject();
+ uint64_t id = window->WindowID();
+ mCaptureStreamPort =
+ mStream->Graph()->ConnectToCaptureStream(id, mStream);
+ } else {
+ mCaptureStreamPort->Destroy();
+ }
+ mCaptured = aCapture;
+ }
+
+ return NS_OK;
+}
+
+AudioChannel
+AudioDestinationNode::MozAudioChannelType() const
+{
+ return mAudioChannel;
+}
+
+void
+AudioDestinationNode::SetMozAudioChannelType(AudioChannel aValue, ErrorResult& aRv)
+{
+ if (Context()->IsOffline()) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (aValue != mAudioChannel &&
+ CheckAudioChannelPermissions(aValue)) {
+ mAudioChannel = aValue;
+
+ if (mStream) {
+ mStream->SetAudioChannelType(mAudioChannel);
+ }
+
+ if (mAudioChannelAgent) {
+ CreateAudioChannelAgent();
+ }
+ }
+}
+
+bool
+AudioDestinationNode::CheckAudioChannelPermissions(AudioChannel aValue)
+{
+ // Only normal channel doesn't need permission.
+ if (aValue == AudioChannel::Normal) {
+ return true;
+ }
+
+ // Maybe this audio channel is equal to the default one.
+ if (aValue == AudioChannelService::GetDefaultAudioChannel()) {
+ return true;
+ }
+
+ nsCOMPtr<nsIPermissionManager> permissionManager =
+ services::GetPermissionManager();
+ if (!permissionManager) {
+ return false;
+ }
+
+ nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(GetOwner());
+ NS_ASSERTION(sop, "Window didn't QI to nsIScriptObjectPrincipal!");
+ nsCOMPtr<nsIPrincipal> principal = sop->GetPrincipal();
+
+ uint32_t perm = nsIPermissionManager::UNKNOWN_ACTION;
+
+ nsCString channel;
+ channel.AssignASCII(AudioChannelValues::strings[uint32_t(aValue)].value,
+ AudioChannelValues::strings[uint32_t(aValue)].length);
+ permissionManager->TestExactPermissionFromPrincipal(principal,
+ nsCString(NS_LITERAL_CSTRING("audio-channel-") + channel).get(),
+ &perm);
+
+ return perm == nsIPermissionManager::ALLOW_ACTION;
+}
+
+nsresult
+AudioDestinationNode::CreateAudioChannelAgent()
+{
+ if (mIsOffline) {
+ return NS_OK;
+ }
+
+ nsresult rv = NS_OK;
+ if (mAudioChannelAgent) {
+ rv = mAudioChannelAgent->NotifyStoppedPlaying();
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+ }
+
+ mAudioChannelAgent = new AudioChannelAgent();
+ rv = mAudioChannelAgent->InitWithWeakCallback(GetOwner(),
+ static_cast<int32_t>(mAudioChannel),
+ this);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ return NS_OK;
+}
+
+void
+AudioDestinationNode::InputMuted(bool aMuted)
+{
+ MOZ_ASSERT(Context() && !Context()->IsOffline());
+
+ if (!mAudioChannelAgent) {
+ if (aMuted) {
+ return;
+ }
+ CreateAudioChannelAgent();
+ }
+
+ if (aMuted) {
+ mAudioChannelAgent->NotifyStoppedPlaying();
+ return;
+ }
+
+ AudioPlaybackConfig config;
+ nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config,
+ AudioChannelService::AudibleState::eAudible);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ WindowVolumeChanged(config.mVolume, config.mMuted);
+ WindowSuspendChanged(config.mSuspend);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioDestinationNode.h b/dom/media/webaudio/AudioDestinationNode.h
new file mode 100644
index 000000000..cf0db7862
--- /dev/null
+++ b/dom/media/webaudio/AudioDestinationNode.h
@@ -0,0 +1,115 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioDestinationNode_h_
+#define AudioDestinationNode_h_
+
+#include "mozilla/dom/AudioChannelBinding.h"
+#include "AudioNode.h"
+#include "nsIAudioChannelAgent.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class AudioDestinationNode final : public AudioNode
+ , public nsIAudioChannelAgentCallback
+ , public MainThreadMediaStreamListener
+{
+public:
+ // This node type knows what MediaStreamGraph to use based on
+ // whether it's in offline mode.
+ AudioDestinationNode(AudioContext* aContext,
+ bool aIsOffline,
+ AudioChannel aChannel = AudioChannel::Normal,
+ uint32_t aNumberOfChannels = 0,
+ uint32_t aLength = 0,
+ float aSampleRate = 0.0f);
+
+ void DestroyMediaStream() override;
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioDestinationNode, AudioNode)
+ NS_DECL_NSIAUDIOCHANNELAGENTCALLBACK
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint16_t NumberOfOutputs() const final override
+ {
+ return 0;
+ }
+
+ uint32_t MaxChannelCount() const;
+ void SetChannelCount(uint32_t aChannelCount,
+ ErrorResult& aRv) override;
+
+ // Returns the stream or null after unlink.
+ AudioNodeStream* Stream() { return mStream; }
+
+ void Mute();
+ void Unmute();
+
+ void Suspend();
+ void Resume();
+
+ void StartRendering(Promise* aPromise);
+
+ void OfflineShutdown();
+
+ AudioChannel MozAudioChannelType() const;
+
+ void NotifyMainThreadStreamFinished() override;
+ void FireOfflineCompletionEvent();
+
+ nsresult CreateAudioChannelAgent();
+ void DestroyAudioChannelAgent();
+
+ const char* NodeType() const override
+ {
+ return "AudioDestinationNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+ void InputMuted(bool aInputMuted);
+ void ResolvePromise(AudioBuffer* aRenderedBuffer);
+
+ unsigned long Length()
+ {
+ MOZ_ASSERT(mIsOffline);
+ return mFramesToProduce;
+ }
+
+protected:
+ virtual ~AudioDestinationNode();
+
+private:
+ void SetMozAudioChannelType(AudioChannel aValue, ErrorResult& aRv);
+ bool CheckAudioChannelPermissions(AudioChannel aValue);
+
+ SelfReference<AudioDestinationNode> mOfflineRenderingRef;
+ uint32_t mFramesToProduce;
+
+ nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent;
+ RefPtr<MediaInputPort> mCaptureStreamPort;
+
+ RefPtr<Promise> mOfflineRenderingPromise;
+
+ // Audio Channel Type.
+ AudioChannel mAudioChannel;
+ bool mIsOffline;
+ bool mAudioChannelSuspended;
+
+ bool mCaptured;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioEventTimeline.cpp b/dom/media/webaudio/AudioEventTimeline.cpp
new file mode 100644
index 000000000..a6a7bbf66
--- /dev/null
+++ b/dom/media/webaudio/AudioEventTimeline.cpp
@@ -0,0 +1,315 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioEventTimeline.h"
+
+#include "mozilla/ErrorResult.h"
+
+static float LinearInterpolate(double t0, float v0, double t1, float v1, double t)
+{
+ return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));
+}
+
+static float ExponentialInterpolate(double t0, float v0, double t1, float v1, double t)
+{
+ return v0 * powf(v1 / v0, (t - t0) / (t1 - t0));
+}
+
+static float ExponentialApproach(double t0, double v0, float v1, double timeConstant, double t)
+{
+ if (!mozilla::dom::WebAudioUtils::FuzzyEqual(timeConstant, 0.0)) {
+ return v1 + (v0 - v1) * expf(-(t - t0) / timeConstant);
+ } else {
+ return v1;
+ }
+}
+
+static float ExtractValueFromCurve(double startTime, float* aCurve, uint32_t aCurveLength, double duration, double t)
+{
+ if (t >= startTime + duration) {
+ // After the duration, return the last curve value
+ return aCurve[aCurveLength - 1];
+ }
+ double ratio = std::max((t - startTime) / duration, 0.0);
+ if (ratio >= 1.0) {
+ return aCurve[aCurveLength - 1];
+ }
+ uint32_t current = uint32_t(floor((aCurveLength - 1) * ratio));
+ uint32_t next = current + 1;
+ double step = duration / double(aCurveLength - 1);
+ if (next < aCurveLength) {
+ double t0 = current * step;
+ double t1 = next * step;
+ return LinearInterpolate(t0, aCurve[current], t1, aCurve[next], t - startTime);
+ } else {
+ return aCurve[current];
+ }
+}
+
+namespace mozilla {
+namespace dom {
+
+// This method computes the AudioParam value at a given time based on the event timeline
+template<class TimeType> void
+AudioEventTimeline::GetValuesAtTimeHelper(TimeType aTime, float* aBuffer,
+ const size_t aSize)
+{
+ MOZ_ASSERT(aBuffer);
+ MOZ_ASSERT(aSize);
+
+ auto TimeOf = [](const AudioTimelineEvent& aEvent) -> TimeType {
+ return aEvent.template Time<TimeType>();
+ };
+
+ size_t eventIndex = 0;
+ const AudioTimelineEvent* previous = nullptr;
+
+ // Let's remove old events except the last one: we need it to calculate some curves.
+ CleanupEventsOlderThan(aTime);
+
+ for (size_t bufferIndex = 0; bufferIndex < aSize; ++bufferIndex, ++aTime) {
+
+ bool timeMatchesEventIndex = false;
+ const AudioTimelineEvent* next;
+ for (; ; ++eventIndex) {
+
+ if (eventIndex >= mEvents.Length()) {
+ next = nullptr;
+ break;
+ }
+
+ next = &mEvents[eventIndex];
+ if (aTime < TimeOf(*next)) {
+ break;
+ }
+
+#ifdef DEBUG
+ MOZ_ASSERT(next->mType == AudioTimelineEvent::SetValueAtTime ||
+ next->mType == AudioTimelineEvent::SetTarget ||
+ next->mType == AudioTimelineEvent::LinearRamp ||
+ next->mType == AudioTimelineEvent::ExponentialRamp ||
+ next->mType == AudioTimelineEvent::SetValueCurve);
+#endif
+
+ if (TimesEqual(aTime, TimeOf(*next))) {
+ mLastComputedValue = mComputedValue;
+ // Find the last event with the same time
+ while (eventIndex < mEvents.Length() - 1 &&
+ TimesEqual(aTime, TimeOf(mEvents[eventIndex + 1]))) {
+ mLastComputedValue = GetValueAtTimeOfEvent<TimeType>(&mEvents[eventIndex]);
+ ++eventIndex;
+ }
+
+ timeMatchesEventIndex = true;
+ break;
+ }
+
+ previous = next;
+ }
+
+ if (timeMatchesEventIndex) {
+ // The time matches one of the events exactly.
+ MOZ_ASSERT(TimesEqual(aTime, TimeOf(mEvents[eventIndex])));
+ mComputedValue = GetValueAtTimeOfEvent<TimeType>(&mEvents[eventIndex]);
+ } else {
+ mComputedValue = GetValuesAtTimeHelperInternal(aTime, previous, next);
+ }
+
+ aBuffer[bufferIndex] = mComputedValue;
+ }
+}
+template void
+AudioEventTimeline::GetValuesAtTimeHelper(double aTime, float* aBuffer,
+ const size_t aSize);
+template void
+AudioEventTimeline::GetValuesAtTimeHelper(int64_t aTime, float* aBuffer,
+ const size_t aSize);
+
+template<class TimeType> float
+AudioEventTimeline::GetValueAtTimeOfEvent(const AudioTimelineEvent* aNext)
+{
+ TimeType time = aNext->template Time<TimeType>();
+ switch (aNext->mType) {
+ case AudioTimelineEvent::SetTarget:
+ // SetTarget nodes can be handled no matter what their next node is
+ // (if they have one).
+ // Follow the curve, without regard to the next event, starting at
+ // the last value of the last event.
+ return ExponentialApproach(time,
+ mLastComputedValue, aNext->mValue,
+ aNext->mTimeConstant, time);
+ break;
+ case AudioTimelineEvent::SetValueCurve:
+ // SetValueCurve events can be handled no matter what their event
+ // node is (if they have one)
+ return ExtractValueFromCurve(time,
+ aNext->mCurve,
+ aNext->mCurveLength,
+ aNext->mDuration, time);
+ break;
+ default:
+ // For other event types
+ return aNext->mValue;
+ }
+}
+
+template<class TimeType> float
+AudioEventTimeline::GetValuesAtTimeHelperInternal(TimeType aTime,
+ const AudioTimelineEvent* aPrevious,
+ const AudioTimelineEvent* aNext)
+{
+ // If the requested time is before all of the existing events
+ if (!aPrevious) {
+ return mValue;
+ }
+
+ auto TimeOf = [](const AudioTimelineEvent* aEvent) -> TimeType {
+ return aEvent->template Time<TimeType>();
+ };
+
+ // SetTarget nodes can be handled no matter what their next node is (if
+ // they have one)
+ if (aPrevious->mType == AudioTimelineEvent::SetTarget) {
+ return ExponentialApproach(TimeOf(aPrevious),
+ mLastComputedValue, aPrevious->mValue,
+ aPrevious->mTimeConstant, aTime);
+ }
+
+ // SetValueCurve events can be handled no matter what their next node is
+ // (if they have one)
+ if (aPrevious->mType == AudioTimelineEvent::SetValueCurve) {
+ return ExtractValueFromCurve(TimeOf(aPrevious),
+ aPrevious->mCurve, aPrevious->mCurveLength,
+ aPrevious->mDuration, aTime);
+ }
+
+ // If the requested time is after all of the existing events
+ if (!aNext) {
+ switch (aPrevious->mType) {
+ case AudioTimelineEvent::SetValueAtTime:
+ case AudioTimelineEvent::LinearRamp:
+ case AudioTimelineEvent::ExponentialRamp:
+ // The value will be constant after the last event
+ return aPrevious->mValue;
+ case AudioTimelineEvent::SetValueCurve:
+ return ExtractValueFromCurve(TimeOf(aPrevious),
+ aPrevious->mCurve, aPrevious->mCurveLength,
+ aPrevious->mDuration, aTime);
+ case AudioTimelineEvent::SetTarget:
+ MOZ_FALLTHROUGH_ASSERT("AudioTimelineEvent::SetTarget");
+ case AudioTimelineEvent::SetValue:
+ case AudioTimelineEvent::Cancel:
+ case AudioTimelineEvent::Stream:
+ MOZ_ASSERT(false, "Should have been handled earlier.");
+ }
+ MOZ_ASSERT(false, "unreached");
+ }
+
+ // Finally, handle the case where we have both a previous and a next event
+
+ // First, handle the case where our range ends up in a ramp event
+ switch (aNext->mType) {
+ case AudioTimelineEvent::LinearRamp:
+ return LinearInterpolate(TimeOf(aPrevious),
+ aPrevious->mValue,
+ TimeOf(aNext),
+ aNext->mValue, aTime);
+
+ case AudioTimelineEvent::ExponentialRamp:
+ return ExponentialInterpolate(TimeOf(aPrevious),
+ aPrevious->mValue,
+ TimeOf(aNext),
+ aNext->mValue, aTime);
+
+ case AudioTimelineEvent::SetValueAtTime:
+ case AudioTimelineEvent::SetTarget:
+ case AudioTimelineEvent::SetValueCurve:
+ break;
+ case AudioTimelineEvent::SetValue:
+ case AudioTimelineEvent::Cancel:
+ case AudioTimelineEvent::Stream:
+ MOZ_ASSERT(false, "Should have been handled earlier.");
+ }
+
+ // Now handle all other cases
+ switch (aPrevious->mType) {
+ case AudioTimelineEvent::SetValueAtTime:
+ case AudioTimelineEvent::LinearRamp:
+ case AudioTimelineEvent::ExponentialRamp:
+ // If the next event type is neither linear or exponential ramp, the
+ // value is constant.
+ return aPrevious->mValue;
+ case AudioTimelineEvent::SetValueCurve:
+ return ExtractValueFromCurve(TimeOf(aPrevious),
+ aPrevious->mCurve, aPrevious->mCurveLength,
+ aPrevious->mDuration, aTime);
+ case AudioTimelineEvent::SetTarget:
+ MOZ_FALLTHROUGH_ASSERT("AudioTimelineEvent::SetTarget");
+ case AudioTimelineEvent::SetValue:
+ case AudioTimelineEvent::Cancel:
+ case AudioTimelineEvent::Stream:
+ MOZ_ASSERT(false, "Should have been handled earlier.");
+ }
+
+ MOZ_ASSERT(false, "unreached");
+ return 0.0f;
+}
+template float
+AudioEventTimeline::GetValuesAtTimeHelperInternal(double aTime,
+ const AudioTimelineEvent* aPrevious,
+ const AudioTimelineEvent* aNext);
+template float
+AudioEventTimeline::GetValuesAtTimeHelperInternal(int64_t aTime,
+ const AudioTimelineEvent* aPrevious,
+ const AudioTimelineEvent* aNext);
+
+const AudioTimelineEvent*
+AudioEventTimeline::GetPreviousEvent(double aTime) const
+{
+ const AudioTimelineEvent* previous = nullptr;
+ const AudioTimelineEvent* next = nullptr;
+
+ auto TimeOf = [](const AudioTimelineEvent& aEvent) -> double {
+ return aEvent.template Time<double>();
+ };
+
+ bool bailOut = false;
+ for (unsigned i = 0; !bailOut && i < mEvents.Length(); ++i) {
+ switch (mEvents[i].mType) {
+ case AudioTimelineEvent::SetValueAtTime:
+ case AudioTimelineEvent::SetTarget:
+ case AudioTimelineEvent::LinearRamp:
+ case AudioTimelineEvent::ExponentialRamp:
+ case AudioTimelineEvent::SetValueCurve:
+ if (aTime == TimeOf(mEvents[i])) {
+ // Find the last event with the same time
+ do {
+ ++i;
+ } while (i < mEvents.Length() &&
+ aTime == TimeOf(mEvents[i]));
+ return &mEvents[i - 1];
+ }
+ previous = next;
+ next = &mEvents[i];
+ if (aTime < TimeOf(mEvents[i])) {
+ bailOut = true;
+ }
+ break;
+ default:
+ MOZ_ASSERT(false, "unreached");
+ }
+ }
+ // Handle the case where the time is past all of the events
+ if (!bailOut) {
+ previous = next;
+ }
+
+ return previous;
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/AudioEventTimeline.h b/dom/media/webaudio/AudioEventTimeline.h
new file mode 100644
index 000000000..ae06ad4db
--- /dev/null
+++ b/dom/media/webaudio/AudioEventTimeline.h
@@ -0,0 +1,474 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioEventTimeline_h_
+#define AudioEventTimeline_h_
+
+#include <algorithm>
+#include "mozilla/Assertions.h"
+#include "mozilla/FloatingPoint.h"
+#include "mozilla/PodOperations.h"
+
+#include "MainThreadUtils.h"
+#include "nsTArray.h"
+#include "math.h"
+#include "WebAudioUtils.h"
+
+namespace mozilla {
+
+class MediaStream;
+
+namespace dom {
+
+struct AudioTimelineEvent final
+{
+ enum Type : uint32_t
+ {
+ SetValue,
+ SetValueAtTime,
+ LinearRamp,
+ ExponentialRamp,
+ SetTarget,
+ SetValueCurve,
+ Stream,
+ Cancel
+ };
+
+ AudioTimelineEvent(Type aType, double aTime, float aValue, double aTimeConstant = 0.0,
+ double aDuration = 0.0, const float* aCurve = nullptr,
+ uint32_t aCurveLength = 0)
+ : mType(aType)
+ , mCurve(nullptr)
+ , mTimeConstant(aTimeConstant)
+ , mDuration(aDuration)
+#ifdef DEBUG
+ , mTimeIsInTicks(false)
+#endif
+ {
+ mTime = aTime;
+ if (aType == AudioTimelineEvent::SetValueCurve) {
+ SetCurveParams(aCurve, aCurveLength);
+ } else {
+ mValue = aValue;
+ }
+ }
+
+ explicit AudioTimelineEvent(MediaStream* aStream)
+ : mType(Stream)
+ , mCurve(nullptr)
+ , mStream(aStream)
+ , mTimeConstant(0.0)
+ , mDuration(0.0)
+#ifdef DEBUG
+ , mTimeIsInTicks(false)
+#endif
+ {
+ }
+
+ AudioTimelineEvent(const AudioTimelineEvent& rhs)
+ {
+ PodCopy(this, &rhs, 1);
+
+ if (rhs.mType == AudioTimelineEvent::SetValueCurve) {
+ SetCurveParams(rhs.mCurve, rhs.mCurveLength);
+ } else if (rhs.mType == AudioTimelineEvent::Stream) {
+ new (&mStream) decltype(mStream)(rhs.mStream);
+ }
+ }
+
+ ~AudioTimelineEvent()
+ {
+ if (mType == AudioTimelineEvent::SetValueCurve) {
+ delete[] mCurve;
+ }
+ }
+
+ template <class TimeType>
+ TimeType Time() const;
+
+ void SetTimeInTicks(int64_t aTimeInTicks)
+ {
+ mTimeInTicks = aTimeInTicks;
+#ifdef DEBUG
+ mTimeIsInTicks = true;
+#endif
+ }
+
+ void SetCurveParams(const float* aCurve, uint32_t aCurveLength) {
+ mCurveLength = aCurveLength;
+ if (aCurveLength) {
+ mCurve = new float[aCurveLength];
+ PodCopy(mCurve, aCurve, aCurveLength);
+ } else {
+ mCurve = nullptr;
+ }
+ }
+
+ Type mType;
+ union {
+ float mValue;
+ uint32_t mCurveLength;
+ };
+ // mCurve contains a buffer of SetValueCurve samples. We sample the
+ // values in the buffer depending on how far along we are in time.
+ // If we're at time T and the event has started as time T0 and has a
+ // duration of D, we sample the buffer at floor(mCurveLength*(T-T0)/D)
+ // if T<T0+D, and just take the last sample in the buffer otherwise.
+ float* mCurve;
+ RefPtr<MediaStream> mStream;
+ double mTimeConstant;
+ double mDuration;
+#ifdef DEBUG
+ bool mTimeIsInTicks;
+#endif
+
+private:
+ // This member is accessed using the `Time` method, for safety.
+ //
+ // The time for an event can either be in absolute value or in ticks.
+ // Initially the time of the event is always in absolute value.
+ // In order to convert it to ticks, call SetTimeInTicks. Once this
+ // method has been called for an event, the time cannot be converted
+ // back to absolute value.
+ union {
+ double mTime;
+ int64_t mTimeInTicks;
+ };
+};
+
+template <>
+inline double AudioTimelineEvent::Time<double>() const
+{
+ MOZ_ASSERT(!mTimeIsInTicks);
+ return mTime;
+}
+
+template <>
+inline int64_t AudioTimelineEvent::Time<int64_t>() const
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ MOZ_ASSERT(mTimeIsInTicks);
+ return mTimeInTicks;
+}
+
+/**
+ * Some methods in this class will be instantiated with different ErrorResult
+ * template arguments for testing and production code.
+ *
+ * ErrorResult is a type which satisfies the following:
+ * - Implements a Throw() method taking an nsresult argument, representing an error code.
+ */
+class AudioEventTimeline
+{
+public:
+ explicit AudioEventTimeline(float aDefaultValue)
+ : mValue(aDefaultValue),
+ mComputedValue(aDefaultValue),
+ mLastComputedValue(aDefaultValue)
+ { }
+
+ template <class ErrorResult>
+ bool ValidateEvent(AudioTimelineEvent& aEvent, ErrorResult& aRv)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ auto TimeOf = [](const AudioTimelineEvent& aEvent) -> double {
+ return aEvent.template Time<double>();
+ };
+
+ // Validate the event itself
+ if (!WebAudioUtils::IsTimeValid(TimeOf(aEvent)) ||
+ !WebAudioUtils::IsTimeValid(aEvent.mTimeConstant)) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+
+ if (aEvent.mType == AudioTimelineEvent::SetValueCurve) {
+ if (!aEvent.mCurve || !aEvent.mCurveLength) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ for (uint32_t i = 0; i < aEvent.mCurveLength; ++i) {
+ if (!IsValid(aEvent.mCurve[i])) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ }
+ }
+
+ bool timeAndValueValid = IsValid(aEvent.mValue) &&
+ IsValid(aEvent.mDuration);
+ if (!timeAndValueValid) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+
+ // Make sure that non-curve events don't fall within the duration of a
+ // curve event.
+ for (unsigned i = 0; i < mEvents.Length(); ++i) {
+ if (mEvents[i].mType == AudioTimelineEvent::SetValueCurve &&
+ !(aEvent.mType == AudioTimelineEvent::SetValueCurve &&
+ TimeOf(aEvent) == TimeOf(mEvents[i])) &&
+ TimeOf(mEvents[i]) <= TimeOf(aEvent) &&
+ TimeOf(mEvents[i]) + mEvents[i].mDuration >= TimeOf(aEvent)) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ }
+
+ // Make sure that curve events don't fall in a range which includes other
+ // events.
+ if (aEvent.mType == AudioTimelineEvent::SetValueCurve) {
+ for (unsigned i = 0; i < mEvents.Length(); ++i) {
+ // In case we have two curve at the same time
+ if (mEvents[i].mType == AudioTimelineEvent::SetValueCurve &&
+ TimeOf(mEvents[i]) == TimeOf(aEvent)) {
+ continue;
+ }
+ if (TimeOf(mEvents[i]) > TimeOf(aEvent) &&
+ TimeOf(mEvents[i]) < TimeOf(aEvent) + aEvent.mDuration) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ }
+ }
+
+ // Make sure that invalid values are not used for exponential curves
+ if (aEvent.mType == AudioTimelineEvent::ExponentialRamp) {
+ if (aEvent.mValue <= 0.f) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ const AudioTimelineEvent* previousEvent = GetPreviousEvent(TimeOf(aEvent));
+ if (previousEvent) {
+ if (previousEvent->mValue <= 0.f) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ } else {
+ if (mValue <= 0.f) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ template<typename TimeType>
+ void InsertEvent(const AudioTimelineEvent& aEvent)
+ {
+ for (unsigned i = 0; i < mEvents.Length(); ++i) {
+ if (aEvent.template Time<TimeType>() == mEvents[i].template Time<TimeType>()) {
+ if (aEvent.mType == mEvents[i].mType) {
+ // If times and types are equal, replace the event
+ mEvents.ReplaceElementAt(i, aEvent);
+ } else {
+ // Otherwise, place the element after the last event of another type
+ do {
+ ++i;
+ } while (i < mEvents.Length() &&
+ aEvent.mType != mEvents[i].mType &&
+ aEvent.template Time<TimeType>() == mEvents[i].template Time<TimeType>());
+ mEvents.InsertElementAt(i, aEvent);
+ }
+ return;
+ }
+ // Otherwise, place the event right after the latest existing event
+ if (aEvent.template Time<TimeType>() < mEvents[i].template Time<TimeType>()) {
+ mEvents.InsertElementAt(i, aEvent);
+ return;
+ }
+ }
+
+ // If we couldn't find a place for the event, just append it to the list
+ mEvents.AppendElement(aEvent);
+ }
+
+ bool HasSimpleValue() const
+ {
+ return mEvents.IsEmpty();
+ }
+
+ float GetValue() const
+ {
+ // This method should only be called if HasSimpleValue() returns true
+ MOZ_ASSERT(HasSimpleValue());
+ return mValue;
+ }
+
+ float Value() const
+ {
+ // TODO: Return the current value based on the timeline of the AudioContext
+ return mValue;
+ }
+
+ void SetValue(float aValue)
+ {
+ // Silently don't change anything if there are any events
+ if (mEvents.IsEmpty()) {
+ mLastComputedValue = mComputedValue = mValue = aValue;
+ }
+ }
+
+ template <class ErrorResult>
+ void SetValueAtTime(float aValue, double aStartTime, ErrorResult& aRv)
+ {
+ AudioTimelineEvent event(AudioTimelineEvent::SetValueAtTime, aStartTime, aValue);
+
+ if (ValidateEvent(event, aRv)) {
+ InsertEvent<double>(event);
+ }
+ }
+
+ template <class ErrorResult>
+ void LinearRampToValueAtTime(float aValue, double aEndTime, ErrorResult& aRv)
+ {
+ AudioTimelineEvent event(AudioTimelineEvent::LinearRamp, aEndTime, aValue);
+
+ if (ValidateEvent(event, aRv)) {
+ InsertEvent<double>(event);
+ }
+ }
+
+ template <class ErrorResult>
+ void ExponentialRampToValueAtTime(float aValue, double aEndTime, ErrorResult& aRv)
+ {
+ AudioTimelineEvent event(AudioTimelineEvent::ExponentialRamp, aEndTime, aValue);
+
+ if (ValidateEvent(event, aRv)) {
+ InsertEvent<double>(event);
+ }
+ }
+
+ template <class ErrorResult>
+ void SetTargetAtTime(float aTarget, double aStartTime, double aTimeConstant, ErrorResult& aRv)
+ {
+ AudioTimelineEvent event(AudioTimelineEvent::SetTarget, aStartTime, aTarget, aTimeConstant);
+
+ if (ValidateEvent(event, aRv)) {
+ InsertEvent<double>(event);
+ }
+ }
+
+ template <class ErrorResult>
+ void SetValueCurveAtTime(const float* aValues, uint32_t aValuesLength, double aStartTime, double aDuration, ErrorResult& aRv)
+ {
+ AudioTimelineEvent event(AudioTimelineEvent::SetValueCurve, aStartTime, 0.0f, 0.0f, aDuration, aValues, aValuesLength);
+ if (ValidateEvent(event, aRv)) {
+ InsertEvent<double>(event);
+ }
+ }
+
+ template<typename TimeType>
+ void CancelScheduledValues(TimeType aStartTime)
+ {
+ for (unsigned i = 0; i < mEvents.Length(); ++i) {
+ if (mEvents[i].template Time<TimeType>() >= aStartTime) {
+#ifdef DEBUG
+ // Sanity check: the array should be sorted, so all of the following
+ // events should have a time greater than aStartTime too.
+ for (unsigned j = i + 1; j < mEvents.Length(); ++j) {
+ MOZ_ASSERT(mEvents[j].template Time<TimeType>() >= aStartTime);
+ }
+#endif
+ mEvents.TruncateLength(i);
+ break;
+ }
+ }
+ }
+
+ void CancelAllEvents()
+ {
+ mEvents.Clear();
+ }
+
+ static bool TimesEqual(int64_t aLhs, int64_t aRhs)
+ {
+ return aLhs == aRhs;
+ }
+
+ // Since we are going to accumulate error by adding 0.01 multiple time in a
+ // loop, we want to fuzz the equality check in GetValueAtTime.
+ static bool TimesEqual(double aLhs, double aRhs)
+ {
+ const float kEpsilon = 0.0000000001f;
+ return fabs(aLhs - aRhs) < kEpsilon;
+ }
+
+ template<class TimeType>
+ float GetValueAtTime(TimeType aTime)
+ {
+ float result;
+ GetValuesAtTimeHelper(aTime, &result, 1);
+ return result;
+ }
+
+ template<class TimeType>
+ void GetValuesAtTime(TimeType aTime, float* aBuffer, const size_t aSize)
+ {
+ MOZ_ASSERT(aBuffer);
+ GetValuesAtTimeHelper(aTime, aBuffer, aSize);
+ }
+
+ // Return the number of events scheduled
+ uint32_t GetEventCount() const
+ {
+ return mEvents.Length();
+ }
+
+ template<class TimeType>
+ void CleanupEventsOlderThan(TimeType aTime)
+ {
+ while (mEvents.Length() > 1 &&
+ aTime > mEvents[1].template Time<TimeType>()) {
+
+ if (mEvents[1].mType == AudioTimelineEvent::SetTarget) {
+ mLastComputedValue = GetValuesAtTimeHelperInternal(
+ mEvents[1].template Time<TimeType>(),
+ &mEvents[0], nullptr);
+ }
+
+ mEvents.RemoveElementAt(0);
+ }
+ }
+
+private:
+ template<class TimeType>
+ void GetValuesAtTimeHelper(TimeType aTime, float* aBuffer, const size_t aSize);
+
+ template<class TimeType>
+ float GetValueAtTimeOfEvent(const AudioTimelineEvent* aNext);
+
+ template<class TimeType>
+ float GetValuesAtTimeHelperInternal(TimeType aTime,
+ const AudioTimelineEvent* aPrevious,
+ const AudioTimelineEvent* aNext);
+
+ const AudioTimelineEvent* GetPreviousEvent(double aTime) const;
+
+ static bool IsValid(double value)
+ {
+ return mozilla::IsFinite(value);
+ }
+
+ // This is a sorted array of the events in the timeline. Queries of this
+ // data structure should probably be more frequent than modifications to it,
+ // and that is the reason why we're using a simple array as the data structure.
+ // We can optimize this in the future if the performance of the array ends up
+ // being a bottleneck.
+ nsTArray<AudioTimelineEvent> mEvents;
+ float mValue;
+ // This is the value of this AudioParam we computed at the last tick.
+ float mComputedValue;
+ // This is the value of this AudioParam at the last tick of the previous event.
+ float mLastComputedValue;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/AudioListener.cpp b/dom/media/webaudio/AudioListener.cpp
new file mode 100644
index 000000000..0bd11156a
--- /dev/null
+++ b/dom/media/webaudio/AudioListener.cpp
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioListener.h"
+#include "AudioContext.h"
+#include "mozilla/dom/AudioListenerBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AudioListener, mContext)
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AudioListener, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AudioListener, Release)
+
+AudioListener::AudioListener(AudioContext* aContext)
+ : mContext(aContext)
+ , mPosition()
+ , mFrontVector(0., 0., -1.)
+ , mRightVector(1., 0., 0.)
+ , mVelocity()
+ , mDopplerFactor(1.)
+ , mSpeedOfSound(343.3) // meters/second
+{
+ MOZ_ASSERT(aContext);
+}
+
+JSObject*
+AudioListener::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioListenerBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+AudioListener::SetOrientation(double aX, double aY, double aZ,
+ double aXUp, double aYUp, double aZUp)
+{
+ ThreeDPoint front(aX, aY, aZ);
+ // The panning effect and the azimuth and elevation calculation in the Web
+ // Audio spec becomes undefined with linearly dependent vectors, so keep
+ // existing state in these situations.
+ if (front.IsZero()) {
+ return;
+ }
+ // Normalize before using CrossProduct() to avoid overflow.
+ front.Normalize();
+ ThreeDPoint up(aXUp, aYUp, aZUp);
+ if (up.IsZero()) {
+ return;
+ }
+ up.Normalize();
+ ThreeDPoint right = front.CrossProduct(up);
+ if (right.IsZero()) {
+ return;
+ }
+ right.Normalize();
+
+ if (!mFrontVector.FuzzyEqual(front)) {
+ mFrontVector = front;
+ SendThreeDPointParameterToStream(PannerNode::LISTENER_FRONT_VECTOR, front);
+ }
+ if (!mRightVector.FuzzyEqual(right)) {
+ mRightVector = right;
+ SendThreeDPointParameterToStream(PannerNode::LISTENER_RIGHT_VECTOR, right);
+ }
+}
+
+void
+AudioListener::RegisterPannerNode(PannerNode* aPannerNode)
+{
+ mPanners.AppendElement(aPannerNode);
+
+ // Let the panner node know about our parameters
+ aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_POSITION, mPosition);
+ aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_FRONT_VECTOR, mFrontVector);
+ aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_RIGHT_VECTOR, mRightVector);
+ aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_VELOCITY, mVelocity);
+ aPannerNode->SendDoubleParameterToStream(PannerNode::LISTENER_DOPPLER_FACTOR, mDopplerFactor);
+ aPannerNode->SendDoubleParameterToStream(PannerNode::LISTENER_SPEED_OF_SOUND, mSpeedOfSound);
+ UpdatePannersVelocity();
+}
+
+void AudioListener::UnregisterPannerNode(PannerNode* aPannerNode)
+{
+ mPanners.RemoveElement(aPannerNode);
+}
+
+void
+AudioListener::SendDoubleParameterToStream(uint32_t aIndex, double aValue)
+{
+ for (uint32_t i = 0; i < mPanners.Length(); ++i) {
+ if (mPanners[i]) {
+ mPanners[i]->SendDoubleParameterToStream(aIndex, aValue);
+ }
+ }
+}
+
+void
+AudioListener::SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint& aValue)
+{
+ for (uint32_t i = 0; i < mPanners.Length(); ++i) {
+ if (mPanners[i]) {
+ mPanners[i]->SendThreeDPointParameterToStream(aIndex, aValue);
+ }
+ }
+}
+
+void AudioListener::UpdatePannersVelocity()
+{
+ for (uint32_t i = 0; i < mPanners.Length(); ++i) {
+ if (mPanners[i]) {
+ mPanners[i]->SendDopplerToSourcesIfNeeded();
+ }
+ }
+}
+
+size_t
+AudioListener::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+ // AudioNodes are tracked separately
+ amount += mPanners.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/AudioListener.h b/dom/media/webaudio/AudioListener.h
new file mode 100644
index 000000000..e3eaf1ca4
--- /dev/null
+++ b/dom/media/webaudio/AudioListener.h
@@ -0,0 +1,133 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioListener_h_
+#define AudioListener_h_
+
+#include "nsWrapperCache.h"
+#include "nsCycleCollectionParticipant.h"
+#include "mozilla/Attributes.h"
+#include "ThreeDPoint.h"
+#include "AudioContext.h"
+#include "PannerNode.h"
+#include "WebAudioUtils.h"
+#include "js/TypeDecls.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace mozilla {
+
+namespace dom {
+
+class AudioListener final : public nsWrapperCache
+{
+public:
+ explicit AudioListener(AudioContext* aContext);
+
+ NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AudioListener)
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioListener)
+
+ size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ AudioContext* GetParentObject() const
+ {
+ return mContext;
+ }
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ double DopplerFactor() const
+ {
+ return mDopplerFactor;
+ }
+ void SetDopplerFactor(double aDopplerFactor)
+ {
+ if (WebAudioUtils::FuzzyEqual(mDopplerFactor, aDopplerFactor)) {
+ return;
+ }
+ mDopplerFactor = aDopplerFactor;
+ SendDoubleParameterToStream(PannerNode::LISTENER_DOPPLER_FACTOR, mDopplerFactor);
+ }
+
+ double SpeedOfSound() const
+ {
+ return mSpeedOfSound;
+ }
+ void SetSpeedOfSound(double aSpeedOfSound)
+ {
+ if (WebAudioUtils::FuzzyEqual(mSpeedOfSound, aSpeedOfSound)) {
+ return;
+ }
+ mSpeedOfSound = aSpeedOfSound;
+ SendDoubleParameterToStream(PannerNode::LISTENER_SPEED_OF_SOUND, mSpeedOfSound);
+ }
+
+ void SetPosition(double aX, double aY, double aZ)
+ {
+ if (WebAudioUtils::FuzzyEqual(mPosition.x, aX) &&
+ WebAudioUtils::FuzzyEqual(mPosition.y, aY) &&
+ WebAudioUtils::FuzzyEqual(mPosition.z, aZ)) {
+ return;
+ }
+ mPosition.x = aX;
+ mPosition.y = aY;
+ mPosition.z = aZ;
+ SendThreeDPointParameterToStream(PannerNode::LISTENER_POSITION, mPosition);
+ }
+
+ const ThreeDPoint& Position() const
+ {
+ return mPosition;
+ }
+
+ void SetOrientation(double aX, double aY, double aZ,
+ double aXUp, double aYUp, double aZUp);
+
+ const ThreeDPoint& Velocity() const
+ {
+ return mVelocity;
+ }
+
+ void SetVelocity(double aX, double aY, double aZ)
+ {
+ if (WebAudioUtils::FuzzyEqual(mVelocity.x, aX) &&
+ WebAudioUtils::FuzzyEqual(mVelocity.y, aY) &&
+ WebAudioUtils::FuzzyEqual(mVelocity.z, aZ)) {
+ return;
+ }
+ mVelocity.x = aX;
+ mVelocity.y = aY;
+ mVelocity.z = aZ;
+ SendThreeDPointParameterToStream(PannerNode::LISTENER_VELOCITY, mVelocity);
+ UpdatePannersVelocity();
+ }
+
+ void RegisterPannerNode(PannerNode* aPannerNode);
+ void UnregisterPannerNode(PannerNode* aPannerNode);
+
+private:
+ ~AudioListener() {}
+
+ void SendDoubleParameterToStream(uint32_t aIndex, double aValue);
+ void SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint& aValue);
+ void UpdatePannersVelocity();
+
+private:
+ friend class PannerNode;
+ RefPtr<AudioContext> mContext;
+ ThreeDPoint mPosition;
+ ThreeDPoint mFrontVector;
+ ThreeDPoint mRightVector;
+ ThreeDPoint mVelocity;
+ double mDopplerFactor;
+ double mSpeedOfSound;
+ nsTArray<WeakPtr<PannerNode> > mPanners;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioNode.cpp b/dom/media/webaudio/AudioNode.cpp
new file mode 100644
index 000000000..2b64fcf88
--- /dev/null
+++ b/dom/media/webaudio/AudioNode.cpp
@@ -0,0 +1,666 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioNode.h"
+#include "mozilla/ErrorResult.h"
+#include "AudioNodeStream.h"
+#include "AudioNodeEngine.h"
+#include "mozilla/dom/AudioParam.h"
+#include "mozilla/Services.h"
+#include "nsIObserverService.h"
+
+namespace mozilla {
+namespace dom {
+
+static const uint32_t INVALID_PORT = 0xffffffff;
+static uint32_t gId = 0;
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(AudioNode)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(AudioNode, DOMEventTargetHelper)
+ tmp->DisconnectFromGraph();
+ if (tmp->mContext) {
+ tmp->mContext->UnregisterNode(tmp);
+ }
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mContext)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mOutputNodes)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mOutputParams)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(AudioNode,
+ DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContext)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOutputNodes)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOutputParams)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_ADDREF_INHERITED(AudioNode, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(AudioNode, DOMEventTargetHelper)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioNode)
+ NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+AudioNode::AudioNode(AudioContext* aContext,
+ uint32_t aChannelCount,
+ ChannelCountMode aChannelCountMode,
+ ChannelInterpretation aChannelInterpretation)
+ : DOMEventTargetHelper(aContext->GetParentObject())
+ , mContext(aContext)
+ , mChannelCount(aChannelCount)
+ , mChannelCountMode(aChannelCountMode)
+ , mChannelInterpretation(aChannelInterpretation)
+ , mId(gId++)
+ , mPassThrough(false)
+{
+ MOZ_ASSERT(aContext);
+ DOMEventTargetHelper::BindToOwner(aContext->GetParentObject());
+ aContext->RegisterNode(this);
+}
+
+AudioNode::~AudioNode()
+{
+ MOZ_ASSERT(mInputNodes.IsEmpty());
+ MOZ_ASSERT(mOutputNodes.IsEmpty());
+ MOZ_ASSERT(mOutputParams.IsEmpty());
+ MOZ_ASSERT(!mStream,
+ "The webaudio-node-demise notification must have been sent");
+ if (mContext) {
+ mContext->UnregisterNode(this);
+ }
+}
+
+size_t
+AudioNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ // Not owned:
+ // - mContext
+ // - mStream
+ size_t amount = 0;
+
+ amount += mInputNodes.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mInputNodes.Length(); i++) {
+ amount += mInputNodes[i].SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ // Just measure the array. The entire audio node graph is measured via the
+ // MediaStreamGraph's streams, so we don't want to double-count the elements.
+ amount += mOutputNodes.ShallowSizeOfExcludingThis(aMallocSizeOf);
+
+ amount += mOutputParams.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mOutputParams.Length(); i++) {
+ amount += mOutputParams[i]->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+size_t
+AudioNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+template <class InputNode>
+static size_t
+FindIndexOfNode(const nsTArray<InputNode>& aInputNodes, const AudioNode* aNode)
+{
+ for (size_t i = 0; i < aInputNodes.Length(); ++i) {
+ if (aInputNodes[i].mInputNode == aNode) {
+ return i;
+ }
+ }
+ return nsTArray<InputNode>::NoIndex;
+}
+
+template <class InputNode>
+static size_t
+FindIndexOfNodeWithPorts(const nsTArray<InputNode>& aInputNodes,
+ const AudioNode* aNode,
+ uint32_t aInputPort, uint32_t aOutputPort)
+{
+ for (size_t i = 0; i < aInputNodes.Length(); ++i) {
+ if (aInputNodes[i].mInputNode == aNode &&
+ aInputNodes[i].mInputPort == aInputPort &&
+ aInputNodes[i].mOutputPort == aOutputPort) {
+ return i;
+ }
+ }
+ return nsTArray<InputNode>::NoIndex;
+}
+
+void
+AudioNode::DisconnectFromGraph()
+{
+ MOZ_ASSERT(mRefCnt.get() > mInputNodes.Length(),
+ "Caller should be holding a reference");
+
+ // The idea here is that we remove connections one by one, and at each step
+ // the graph is in a valid state.
+
+ // Disconnect inputs. We don't need them anymore.
+ while (!mInputNodes.IsEmpty()) {
+ size_t i = mInputNodes.Length() - 1;
+ RefPtr<AudioNode> input = mInputNodes[i].mInputNode;
+ mInputNodes.RemoveElementAt(i);
+ input->mOutputNodes.RemoveElement(this);
+ }
+
+ while (!mOutputNodes.IsEmpty()) {
+ size_t i = mOutputNodes.Length() - 1;
+ RefPtr<AudioNode> output = mOutputNodes[i].forget();
+ mOutputNodes.RemoveElementAt(i);
+ size_t inputIndex = FindIndexOfNode(output->mInputNodes, this);
+ // It doesn't matter which one we remove, since we're going to remove all
+ // entries for this node anyway.
+ output->mInputNodes.RemoveElementAt(inputIndex);
+ // This effects of this connection will remain.
+ output->NotifyHasPhantomInput();
+ }
+
+ while (!mOutputParams.IsEmpty()) {
+ size_t i = mOutputParams.Length() - 1;
+ RefPtr<AudioParam> output = mOutputParams[i].forget();
+ mOutputParams.RemoveElementAt(i);
+ size_t inputIndex = FindIndexOfNode(output->InputNodes(), this);
+ // It doesn't matter which one we remove, since we're going to remove all
+ // entries for this node anyway.
+ output->RemoveInputNode(inputIndex);
+ }
+
+ DestroyMediaStream();
+}
+
+AudioNode*
+AudioNode::Connect(AudioNode& aDestination, uint32_t aOutput,
+ uint32_t aInput, ErrorResult& aRv)
+{
+ if (aOutput >= NumberOfOutputs() ||
+ aInput >= aDestination.NumberOfInputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return nullptr;
+ }
+
+ if (Context() != aDestination.Context()) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return nullptr;
+ }
+
+ if (FindIndexOfNodeWithPorts(aDestination.mInputNodes,
+ this, aInput, aOutput) !=
+ nsTArray<AudioNode::InputNode>::NoIndex) {
+ // connection already exists.
+ return &aDestination;
+ }
+
+ WEB_AUDIO_API_LOG("%f: %s %u Connect() to %s %u",
+ Context()->CurrentTime(), NodeType(), Id(),
+ aDestination.NodeType(), aDestination.Id());
+
+ // The MediaStreamGraph will handle cycle detection. We don't need to do it
+ // here.
+
+ mOutputNodes.AppendElement(&aDestination);
+ InputNode* input = aDestination.mInputNodes.AppendElement();
+ input->mInputNode = this;
+ input->mInputPort = aInput;
+ input->mOutputPort = aOutput;
+ AudioNodeStream* destinationStream = aDestination.mStream;
+ if (mStream && destinationStream) {
+ // Connect streams in the MediaStreamGraph
+ MOZ_ASSERT(aInput <= UINT16_MAX, "Unexpected large input port number");
+ MOZ_ASSERT(aOutput <= UINT16_MAX, "Unexpected large output port number");
+ input->mStreamPort = destinationStream->
+ AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK, TRACK_ANY,
+ static_cast<uint16_t>(aInput),
+ static_cast<uint16_t>(aOutput));
+ }
+ aDestination.NotifyInputsChanged();
+
+ // This connection may have connected a panner and a source.
+ Context()->UpdatePannerSource();
+
+ return &aDestination;
+}
+
+void
+AudioNode::Connect(AudioParam& aDestination, uint32_t aOutput,
+ ErrorResult& aRv)
+{
+ if (aOutput >= NumberOfOutputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ if (Context() != aDestination.GetParentObject()) {
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return;
+ }
+
+ if (FindIndexOfNodeWithPorts(aDestination.InputNodes(),
+ this, INVALID_PORT, aOutput) !=
+ nsTArray<AudioNode::InputNode>::NoIndex) {
+ // connection already exists.
+ return;
+ }
+
+ mOutputParams.AppendElement(&aDestination);
+ InputNode* input = aDestination.AppendInputNode();
+ input->mInputNode = this;
+ input->mInputPort = INVALID_PORT;
+ input->mOutputPort = aOutput;
+
+ MediaStream* stream = aDestination.Stream();
+ MOZ_ASSERT(stream->AsProcessedStream());
+ ProcessedMediaStream* ps = static_cast<ProcessedMediaStream*>(stream);
+ if (mStream) {
+ // Setup our stream as an input to the AudioParam's stream
+ MOZ_ASSERT(aOutput <= UINT16_MAX, "Unexpected large output port number");
+ input->mStreamPort =
+ ps->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK, TRACK_ANY,
+ 0, static_cast<uint16_t>(aOutput));
+ }
+}
+
+void
+AudioNode::SendDoubleParameterToStream(uint32_t aIndex, double aValue)
+{
+ MOZ_ASSERT(mStream, "How come we don't have a stream here?");
+ mStream->SetDoubleParameter(aIndex, aValue);
+}
+
+void
+AudioNode::SendInt32ParameterToStream(uint32_t aIndex, int32_t aValue)
+{
+ MOZ_ASSERT(mStream, "How come we don't have a stream here?");
+ mStream->SetInt32Parameter(aIndex, aValue);
+}
+
+void
+AudioNode::SendThreeDPointParameterToStream(uint32_t aIndex,
+ const ThreeDPoint& aValue)
+{
+ MOZ_ASSERT(mStream, "How come we don't have a stream here?");
+ mStream->SetThreeDPointParameter(aIndex, aValue);
+}
+
+void
+AudioNode::SendChannelMixingParametersToStream()
+{
+ if (mStream) {
+ mStream->SetChannelMixingParameters(mChannelCount, mChannelCountMode,
+ mChannelInterpretation);
+ }
+}
+
+template<>
+bool
+AudioNode::DisconnectFromOutputIfConnected<AudioNode>(uint32_t aOutputNodeIndex,
+ uint32_t aInputIndex)
+{
+ WEB_AUDIO_API_LOG("%f: %s %u Disconnect()", Context()->CurrentTime(),
+ NodeType(), Id());
+
+ AudioNode* destination = mOutputNodes[aOutputNodeIndex];
+
+ MOZ_ASSERT(aOutputNodeIndex < mOutputNodes.Length());
+ MOZ_ASSERT(aInputIndex < destination->InputNodes().Length());
+
+ // An upstream node may be starting to play on the graph thread, and the
+ // engine for a downstream node may be sending a PlayingRefChangeHandler
+ // ADDREF message to this (main) thread. Wait for a round trip before
+ // releasing nodes, to give engines receiving sound now time to keep their
+ // nodes alive.
+ class RunnableRelease final : public Runnable
+ {
+ public:
+ explicit RunnableRelease(already_AddRefed<AudioNode> aNode)
+ : mNode(aNode) {}
+
+ NS_IMETHOD Run() override
+ {
+ mNode = nullptr;
+ return NS_OK;
+ }
+ private:
+ RefPtr<AudioNode> mNode;
+ };
+
+ InputNode& input = destination->mInputNodes[aInputIndex];
+ if (input.mInputNode != this) {
+ return false;
+ }
+
+ // Remove one instance of 'dest' from mOutputNodes. There could be
+ // others, and it's not correct to remove them all since some of them
+ // could be for different output ports.
+ RefPtr<AudioNode> output = mOutputNodes[aOutputNodeIndex].forget();
+ mOutputNodes.RemoveElementAt(aOutputNodeIndex);
+ // Destroying the InputNode here sends a message to the graph thread
+ // to disconnect the streams, which should be sent before the
+ // RunAfterPendingUpdates() call below.
+ destination->mInputNodes.RemoveElementAt(aInputIndex);
+ output->NotifyInputsChanged();
+ if (mStream) {
+ nsCOMPtr<nsIRunnable> runnable = new RunnableRelease(output.forget());
+ mStream->RunAfterPendingUpdates(runnable.forget());
+ }
+ return true;
+}
+
+template<>
+bool
+AudioNode::DisconnectFromOutputIfConnected<AudioParam>(uint32_t aOutputParamIndex,
+ uint32_t aInputIndex)
+{
+ MOZ_ASSERT(aOutputParamIndex < mOutputParams.Length());
+
+ AudioParam* destination = mOutputParams[aOutputParamIndex];
+
+ MOZ_ASSERT(aInputIndex < destination->InputNodes().Length());
+
+ const InputNode& input = destination->InputNodes()[aInputIndex];
+ if (input.mInputNode != this) {
+ return false;
+ }
+ destination->RemoveInputNode(aInputIndex);
+ // Remove one instance of 'dest' from mOutputParams. There could be
+ // others, and it's not correct to remove them all since some of them
+ // could be for different output ports.
+ mOutputParams.RemoveElementAt(aOutputParamIndex);
+ return true;
+}
+
+template<>
+const nsTArray<AudioNode::InputNode>&
+AudioNode::InputsForDestination<AudioNode>(uint32_t aOutputNodeIndex) const {
+ return mOutputNodes[aOutputNodeIndex]->InputNodes();
+}
+
+template<>
+const nsTArray<AudioNode::InputNode>&
+AudioNode::InputsForDestination<AudioParam>(uint32_t aOutputNodeIndex) const {
+ return mOutputParams[aOutputNodeIndex]->InputNodes();
+}
+
+template<typename DestinationType, typename Predicate>
+bool
+AudioNode::DisconnectMatchingDestinationInputs(uint32_t aDestinationIndex,
+ Predicate aPredicate)
+{
+ bool wasConnected = false;
+ uint32_t inputCount =
+ InputsForDestination<DestinationType>(aDestinationIndex).Length();
+
+ for (int32_t inputIndex = inputCount - 1; inputIndex >= 0; --inputIndex) {
+ const InputNode& input =
+ InputsForDestination<DestinationType>(aDestinationIndex)[inputIndex];
+ if (aPredicate(input)) {
+ if (DisconnectFromOutputIfConnected<DestinationType>(aDestinationIndex,
+ inputIndex)) {
+ wasConnected = true;
+ break;
+ }
+ }
+ }
+ return wasConnected;
+}
+
+void
+AudioNode::Disconnect(ErrorResult& aRv)
+{
+ for (int32_t outputIndex = mOutputNodes.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ DisconnectMatchingDestinationInputs<AudioNode>(outputIndex,
+ [](const InputNode&) {
+ return true;
+ });
+ }
+
+ for (int32_t outputIndex = mOutputParams.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ DisconnectMatchingDestinationInputs<AudioParam>(outputIndex,
+ [](const InputNode&) {
+ return true;
+ });
+ }
+
+ // This disconnection may have disconnected a panner and a source.
+ Context()->UpdatePannerSource();
+}
+
+void
+AudioNode::Disconnect(uint32_t aOutput, ErrorResult& aRv)
+{
+ if (aOutput >= NumberOfOutputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ for (int32_t outputIndex = mOutputNodes.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ DisconnectMatchingDestinationInputs<AudioNode>(
+ outputIndex,
+ [aOutput](const InputNode& aInputNode) {
+ return aInputNode.mOutputPort == aOutput;
+ });
+ }
+
+ for (int32_t outputIndex = mOutputParams.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ DisconnectMatchingDestinationInputs<AudioParam>(
+ outputIndex,
+ [aOutput](const InputNode& aInputNode) {
+ return aInputNode.mOutputPort == aOutput;
+ });
+ }
+
+ // This disconnection may have disconnected a panner and a source.
+ Context()->UpdatePannerSource();
+}
+
+void
+AudioNode::Disconnect(AudioNode& aDestination, ErrorResult& aRv)
+{
+ bool wasConnected = false;
+
+ for (int32_t outputIndex = mOutputNodes.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ if (mOutputNodes[outputIndex] != &aDestination) {
+ continue;
+ }
+ wasConnected |=
+ DisconnectMatchingDestinationInputs<AudioNode>(outputIndex,
+ [](const InputNode&) {
+ return true;
+ });
+ }
+
+ if (!wasConnected) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
+ return;
+ }
+
+ // This disconnection may have disconnected a panner and a source.
+ Context()->UpdatePannerSource();
+}
+
+void
+AudioNode::Disconnect(AudioNode& aDestination,
+ uint32_t aOutput,
+ ErrorResult& aRv)
+{
+ if (aOutput >= NumberOfOutputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ bool wasConnected = false;
+
+ for (int32_t outputIndex = mOutputNodes.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ if (mOutputNodes[outputIndex] != &aDestination) {
+ continue;
+ }
+ wasConnected |=
+ DisconnectMatchingDestinationInputs<AudioNode>(
+ outputIndex,
+ [aOutput](const InputNode& aInputNode) {
+ return aInputNode.mOutputPort == aOutput;
+ });
+ }
+
+ if (!wasConnected) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
+ return;
+ }
+
+ // This disconnection may have disconnected a panner and a source.
+ Context()->UpdatePannerSource();
+}
+
+void
+AudioNode::Disconnect(AudioNode& aDestination,
+ uint32_t aOutput,
+ uint32_t aInput,
+ ErrorResult& aRv)
+{
+ if (aOutput >= NumberOfOutputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ if (aInput >= aDestination.NumberOfInputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ bool wasConnected = false;
+
+ for (int32_t outputIndex = mOutputNodes.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ if (mOutputNodes[outputIndex] != &aDestination) {
+ continue;
+ }
+ wasConnected |=
+ DisconnectMatchingDestinationInputs<AudioNode>(
+ outputIndex,
+ [aOutput, aInput](const InputNode& aInputNode) {
+ return aInputNode.mOutputPort == aOutput &&
+ aInputNode.mInputPort == aInput;
+ });
+ }
+
+ if (!wasConnected) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
+ return;
+ }
+
+ // This disconnection may have disconnected a panner and a source.
+ Context()->UpdatePannerSource();
+}
+
+void
+AudioNode::Disconnect(AudioParam& aDestination, ErrorResult& aRv)
+{
+ bool wasConnected = false;
+
+ for (int32_t outputIndex = mOutputParams.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ if (mOutputParams[outputIndex] != &aDestination) {
+ continue;
+ }
+ wasConnected |=
+ DisconnectMatchingDestinationInputs<AudioParam>(outputIndex,
+ [](const InputNode&) {
+ return true;
+ });
+ }
+
+ if (!wasConnected) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
+ return;
+ }
+}
+
+void
+AudioNode::Disconnect(AudioParam& aDestination,
+ uint32_t aOutput,
+ ErrorResult& aRv)
+{
+ if (aOutput >= NumberOfOutputs()) {
+ aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
+ return;
+ }
+
+ bool wasConnected = false;
+
+ for (int32_t outputIndex = mOutputParams.Length() - 1;
+ outputIndex >= 0; --outputIndex) {
+ if (mOutputParams[outputIndex] != &aDestination) {
+ continue;
+ }
+ wasConnected |=
+ DisconnectMatchingDestinationInputs<AudioParam>(
+ outputIndex,
+ [aOutput](const InputNode& aInputNode) {
+ return aInputNode.mOutputPort == aOutput;
+ });
+ }
+
+ if (!wasConnected) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
+ return;
+ }
+}
+
+void
+AudioNode::DestroyMediaStream()
+{
+ if (mStream) {
+ // Remove the node pointer on the engine.
+ AudioNodeStream* ns = mStream;
+ MOZ_ASSERT(ns, "How come we don't have a stream here?");
+ MOZ_ASSERT(ns->Engine()->NodeMainThread() == this,
+ "Invalid node reference");
+ ns->Engine()->ClearNode();
+
+ mStream->Destroy();
+ mStream = nullptr;
+
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ if (obs) {
+ nsAutoString id;
+ id.AppendPrintf("%u", mId);
+ obs->NotifyObservers(nullptr, "webaudio-node-demise", id.get());
+ }
+ }
+}
+
+void
+AudioNode::RemoveOutputParam(AudioParam* aParam)
+{
+ mOutputParams.RemoveElement(aParam);
+}
+
+bool
+AudioNode::PassThrough() const
+{
+ MOZ_ASSERT(NumberOfInputs() <= 1 && NumberOfOutputs() == 1);
+ return mPassThrough;
+}
+
+void
+AudioNode::SetPassThrough(bool aPassThrough)
+{
+ MOZ_ASSERT(NumberOfInputs() <= 1 && NumberOfOutputs() == 1);
+ mPassThrough = aPassThrough;
+ if (mStream) {
+ mStream->SetPassThrough(mPassThrough);
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioNode.h b/dom/media/webaudio/AudioNode.h
new file mode 100644
index 000000000..ebef129c8
--- /dev/null
+++ b/dom/media/webaudio/AudioNode.h
@@ -0,0 +1,294 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioNode_h_
+#define AudioNode_h_
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "mozilla/dom/AudioNodeBinding.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsTArray.h"
+#include "AudioContext.h"
+#include "MediaStreamGraph.h"
+#include "WebAudioUtils.h"
+#include "mozilla/MemoryReporting.h"
+#include "nsWeakReference.h"
+#include "SelfRef.h"
+
+namespace mozilla {
+
+namespace dom {
+
+class AudioContext;
+class AudioBufferSourceNode;
+class AudioParam;
+class AudioParamTimeline;
+struct ThreeDPoint;
+
+/**
+ * The DOM object representing a Web Audio AudioNode.
+ *
+ * Each AudioNode has a MediaStream representing the actual
+ * real-time processing and output of this AudioNode.
+ *
+ * We track the incoming and outgoing connections to other AudioNodes.
+ * Outgoing connections have strong ownership. Also, AudioNodes that will
+ * produce sound on their output even when they have silent or no input ask
+ * the AudioContext to keep playing or tail-time references to keep them alive
+ * until the context is finished.
+ *
+ * Explicit disconnections will only remove references from output nodes after
+ * the graph is notified and the main thread receives a reply. Similarly,
+ * nodes with playing or tail-time references release these references only
+ * after receiving notification from their engine on the graph thread that
+ * playing has stopped. Engines notifying the main thread that they have
+ * finished do so strictly *after* producing and returning their last block.
+ * In this way, an engine that receives non-null input knows that the input
+ * comes from nodes that are still alive and will keep their output nodes
+ * alive for at least as long as it takes to process messages from the graph
+ * thread. i.e. the engine receiving non-null input knows that its node is
+ * still alive, and will still be alive when it receives a message from the
+ * engine.
+ */
+class AudioNode : public DOMEventTargetHelper,
+ public nsSupportsWeakReference
+{
+protected:
+ // You can only use refcounting to delete this object
+ virtual ~AudioNode();
+
+public:
+ AudioNode(AudioContext* aContext,
+ uint32_t aChannelCount,
+ ChannelCountMode aChannelCountMode,
+ ChannelInterpretation aChannelInterpretation);
+
+ // This should be idempotent (safe to call multiple times).
+ virtual void DestroyMediaStream();
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioNode,
+ DOMEventTargetHelper)
+
+ virtual AudioBufferSourceNode* AsAudioBufferSourceNode()
+ {
+ return nullptr;
+ }
+
+ AudioContext* GetParentObject() const
+ {
+ return mContext;
+ }
+
+ AudioContext* Context() const
+ {
+ return mContext;
+ }
+
+ virtual AudioNode* Connect(AudioNode& aDestination, uint32_t aOutput,
+ uint32_t aInput, ErrorResult& aRv);
+
+ virtual void Connect(AudioParam& aDestination, uint32_t aOutput,
+ ErrorResult& aRv);
+
+ virtual void Disconnect(ErrorResult& aRv);
+ virtual void Disconnect(uint32_t aOutput, ErrorResult& aRv);
+ virtual void Disconnect(AudioNode& aDestination, ErrorResult& aRv);
+ virtual void Disconnect(AudioNode& aDestination, uint32_t aOutput,
+ ErrorResult& aRv);
+ virtual void Disconnect(AudioNode& aDestination,
+ uint32_t aOutput, uint32_t aInput,
+ ErrorResult& aRv);
+ virtual void Disconnect(AudioParam& aDestination, ErrorResult& aRv);
+ virtual void Disconnect(AudioParam& aDestination, uint32_t aOutput,
+ ErrorResult& aRv);
+
+ // Called after input nodes have been explicitly added or removed through
+ // the Connect() or Disconnect() methods.
+ virtual void NotifyInputsChanged() {}
+ // Indicate that the node should continue indefinitely to behave as if an
+ // input is connected, even though there is no longer a corresponding entry
+ // in mInputNodes. Called after an input node has been removed because it
+ // is being garbage collected.
+ virtual void NotifyHasPhantomInput() {}
+
+ // The following two virtual methods must be implemented by each node type
+ // to provide their number of input and output ports. These numbers are
+ // constant for the lifetime of the node. Both default to 1.
+ virtual uint16_t NumberOfInputs() const { return 1; }
+ virtual uint16_t NumberOfOutputs() const { return 1; }
+
+ uint32_t Id() const { return mId; }
+
+ bool PassThrough() const;
+ void SetPassThrough(bool aPassThrough);
+
+ uint32_t ChannelCount() const { return mChannelCount; }
+ virtual void SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv)
+ {
+ if (aChannelCount == 0 ||
+ aChannelCount > WebAudioUtils::MaxChannelCount) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ mChannelCount = aChannelCount;
+ SendChannelMixingParametersToStream();
+ }
+ ChannelCountMode ChannelCountModeValue() const
+ {
+ return mChannelCountMode;
+ }
+ virtual void SetChannelCountModeValue(ChannelCountMode aMode, ErrorResult& aRv)
+ {
+ mChannelCountMode = aMode;
+ SendChannelMixingParametersToStream();
+ }
+ ChannelInterpretation ChannelInterpretationValue() const
+ {
+ return mChannelInterpretation;
+ }
+ void SetChannelInterpretationValue(ChannelInterpretation aMode)
+ {
+ mChannelInterpretation = aMode;
+ SendChannelMixingParametersToStream();
+ }
+
+ struct InputNode final
+ {
+ ~InputNode()
+ {
+ if (mStreamPort) {
+ mStreamPort->Destroy();
+ }
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = 0;
+ if (mStreamPort) {
+ amount += mStreamPort->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ // Weak reference.
+ AudioNode* mInputNode;
+ RefPtr<MediaInputPort> mStreamPort;
+ // The index of the input port this node feeds into.
+ // This is not used for connections to AudioParams.
+ uint32_t mInputPort;
+ // The index of the output port this node comes out of.
+ uint32_t mOutputPort;
+ };
+
+ // Returns the stream, if any.
+ AudioNodeStream* GetStream() const { return mStream; }
+
+ const nsTArray<InputNode>& InputNodes() const
+ {
+ return mInputNodes;
+ }
+ const nsTArray<RefPtr<AudioNode> >& OutputNodes() const
+ {
+ return mOutputNodes;
+ }
+ const nsTArray<RefPtr<AudioParam> >& OutputParams() const
+ {
+ return mOutputParams;
+ }
+
+ template<typename T>
+ const nsTArray<InputNode>&
+ InputsForDestination(uint32_t aOutputIndex) const;
+
+ void RemoveOutputParam(AudioParam* aParam);
+
+ // MarkActive() asks the context to keep the AudioNode alive until the
+ // context is finished. This takes care of "playing" references and
+ // "tail-time" references.
+ void MarkActive() { Context()->RegisterActiveNode(this); }
+ // Active nodes call MarkInactive() when they have finished producing sound
+ // for the foreseeable future.
+ // Do not call MarkInactive from a node destructor. If the destructor is
+ // called, then the node is already inactive.
+ // MarkInactive() may delete |this|.
+ void MarkInactive() { Context()->UnregisterActiveNode(this); }
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
+
+ // Returns a string from constant static storage identifying the dom node
+ // type.
+ virtual const char* NodeType() const = 0;
+
+private:
+ // Given:
+ //
+ // - a DestinationType, that can be an AudioNode or an AudioParam ;
+ // - a Predicate, a function that takes an InputNode& and returns a bool ;
+ //
+ // This method iterates on the InputNodes() of the node at the index
+ // aDestinationIndex, and calls `DisconnectFromOutputIfConnected` with this
+ // input node, if aPredicate returns true.
+ template<typename DestinationType, typename Predicate>
+ bool DisconnectMatchingDestinationInputs(uint32_t aDestinationIndex,
+ Predicate aPredicate);
+
+ virtual void LastRelease() override
+ {
+ // We are about to be deleted, disconnect the object from the graph before
+ // the derived type is destroyed.
+ DisconnectFromGraph();
+ }
+ // Callers must hold a reference to 'this'.
+ void DisconnectFromGraph();
+
+ template<typename DestinationType>
+ bool DisconnectFromOutputIfConnected(uint32_t aOutputIndex, uint32_t aInputIndex);
+
+protected:
+ // Helpers for sending different value types to streams
+ void SendDoubleParameterToStream(uint32_t aIndex, double aValue);
+ void SendInt32ParameterToStream(uint32_t aIndex, int32_t aValue);
+ void SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint& aValue);
+ void SendChannelMixingParametersToStream();
+
+private:
+ RefPtr<AudioContext> mContext;
+
+protected:
+ // Must be set in the constructor. Must not be null unless finished.
+ RefPtr<AudioNodeStream> mStream;
+
+private:
+ // For every InputNode, there is a corresponding entry in mOutputNodes of the
+ // InputNode's mInputNode.
+ nsTArray<InputNode> mInputNodes;
+ // For every mOutputNode entry, there is a corresponding entry in mInputNodes
+ // of the mOutputNode entry. We won't necessarily be able to identify the
+ // exact matching entry, since mOutputNodes doesn't include the port
+ // identifiers and the same node could be connected on multiple ports.
+ nsTArray<RefPtr<AudioNode> > mOutputNodes;
+ // For every mOutputParams entry, there is a corresponding entry in
+ // AudioParam::mInputNodes of the mOutputParams entry. We won't necessarily be
+ // able to identify the exact matching entry, since mOutputParams doesn't
+ // include the port identifiers and the same node could be connected on
+ // multiple ports.
+ nsTArray<RefPtr<AudioParam> > mOutputParams;
+ uint32_t mChannelCount;
+ ChannelCountMode mChannelCountMode;
+ ChannelInterpretation mChannelInterpretation;
+ const uint32_t mId;
+ // Whether the node just passes through its input. This is a devtools API that
+ // only works for some node types.
+ bool mPassThrough;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/AudioNodeEngine.cpp b/dom/media/webaudio/AudioNodeEngine.cpp
new file mode 100644
index 000000000..91170adb3
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeEngine.cpp
@@ -0,0 +1,400 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioNodeEngine.h"
+#ifdef BUILD_ARM_NEON
+#include "mozilla/arm.h"
+#include "AudioNodeEngineNEON.h"
+#endif
+#ifdef USE_SSE2
+#include "mozilla/SSE.h"
+#include "AlignmentUtils.h"
+#include "AudioNodeEngineSSE2.h"
+#endif
+
+namespace mozilla {
+
+already_AddRefed<ThreadSharedFloatArrayBufferList>
+ThreadSharedFloatArrayBufferList::Create(uint32_t aChannelCount,
+ size_t aLength,
+ const mozilla::fallible_t&)
+{
+ RefPtr<ThreadSharedFloatArrayBufferList> buffer =
+ new ThreadSharedFloatArrayBufferList(aChannelCount);
+
+ for (uint32_t i = 0; i < aChannelCount; ++i) {
+ float* channelData = js_pod_malloc<float>(aLength);
+ if (!channelData) {
+ return nullptr;
+ }
+
+ buffer->SetData(i, channelData, js_free, channelData);
+ }
+
+ return buffer.forget();
+}
+
+void
+WriteZeroesToAudioBlock(AudioBlock* aChunk,
+ uint32_t aStart, uint32_t aLength)
+{
+ MOZ_ASSERT(aStart + aLength <= WEBAUDIO_BLOCK_SIZE);
+ MOZ_ASSERT(!aChunk->IsNull(), "You should pass a non-null chunk");
+ if (aLength == 0)
+ return;
+
+ for (uint32_t i = 0; i < aChunk->ChannelCount(); ++i) {
+ PodZero(aChunk->ChannelFloatsForWrite(i) + aStart, aLength);
+ }
+}
+
+void AudioBufferCopyWithScale(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize)
+{
+ if (aScale == 1.0f) {
+ PodCopy(aOutput, aInput, aSize);
+ } else {
+ for (uint32_t i = 0; i < aSize; ++i) {
+ aOutput[i] = aInput[i]*aScale;
+ }
+ }
+}
+
+void AudioBufferAddWithScale(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize)
+{
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ AudioBufferAddWithScale_NEON(aInput, aScale, aOutput, aSize);
+ return;
+ }
+#endif
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse2()) {
+ if (aScale == 1.0f) {
+ while (aSize && (!IS_ALIGNED16(aInput) || !IS_ALIGNED16(aOutput))) {
+ *aOutput += *aInput;
+ ++aOutput;
+ ++aInput;
+ --aSize;
+ }
+ } else {
+ while (aSize && (!IS_ALIGNED16(aInput) || !IS_ALIGNED16(aOutput))) {
+ *aOutput += *aInput*aScale;
+ ++aOutput;
+ ++aInput;
+ --aSize;
+ }
+ }
+
+ // we need to round aSize down to the nearest multiple of 16
+ uint32_t alignedSize = aSize & ~0x0F;
+ if (alignedSize > 0) {
+ AudioBufferAddWithScale_SSE(aInput, aScale, aOutput, alignedSize);
+
+ // adjust parameters for use with scalar operations below
+ aInput += alignedSize;
+ aOutput += alignedSize;
+ aSize -= alignedSize;
+ }
+ }
+#endif
+
+ if (aScale == 1.0f) {
+ for (uint32_t i = 0; i < aSize; ++i) {
+ aOutput[i] += aInput[i];
+ }
+ } else {
+ for (uint32_t i = 0; i < aSize; ++i) {
+ aOutput[i] += aInput[i]*aScale;
+ }
+ }
+}
+
+void
+AudioBlockAddChannelWithScale(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ float aScale,
+ float aOutput[WEBAUDIO_BLOCK_SIZE])
+{
+ AudioBufferAddWithScale(aInput, aScale, aOutput, WEBAUDIO_BLOCK_SIZE);
+}
+
+void
+AudioBlockCopyChannelWithScale(const float* aInput,
+ float aScale,
+ float* aOutput)
+{
+ if (aScale == 1.0f) {
+ memcpy(aOutput, aInput, WEBAUDIO_BLOCK_SIZE*sizeof(float));
+ } else {
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ AudioBlockCopyChannelWithScale_NEON(aInput, aScale, aOutput);
+ return;
+ }
+#endif
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse2()) {
+ AudioBlockCopyChannelWithScale_SSE(aInput, aScale, aOutput);
+ return;
+ }
+#endif
+
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ aOutput[i] = aInput[i]*aScale;
+ }
+ }
+}
+
+void
+BufferComplexMultiply(const float* aInput,
+ const float* aScale,
+ float* aOutput,
+ uint32_t aSize)
+{
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse()) {
+ BufferComplexMultiply_SSE(aInput, aScale, aOutput, aSize);
+ return;
+ }
+#endif
+
+ for (uint32_t i = 0; i < aSize * 2; i += 2) {
+ float real1 = aInput[i];
+ float imag1 = aInput[i + 1];
+ float real2 = aScale[i];
+ float imag2 = aScale[i + 1];
+ float realResult = real1 * real2 - imag1 * imag2;
+ float imagResult = real1 * imag2 + imag1 * real2;
+ aOutput[i] = realResult;
+ aOutput[i + 1] = imagResult;
+ }
+}
+
+float
+AudioBufferPeakValue(const float *aInput, uint32_t aSize)
+{
+ float max = 0.0f;
+ for (uint32_t i = 0; i < aSize; i++) {
+ float mag = fabs(aInput[i]);
+ if (mag > max) {
+ max = mag;
+ }
+ }
+ return max;
+}
+
+void
+AudioBlockCopyChannelWithScale(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ const float aScale[WEBAUDIO_BLOCK_SIZE],
+ float aOutput[WEBAUDIO_BLOCK_SIZE])
+{
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ AudioBlockCopyChannelWithScale_NEON(aInput, aScale, aOutput);
+ return;
+ }
+#endif
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse2()) {
+ AudioBlockCopyChannelWithScale_SSE(aInput, aScale, aOutput);
+ return;
+ }
+#endif
+
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ aOutput[i] = aInput[i]*aScale[i];
+ }
+}
+
+void
+AudioBlockInPlaceScale(float aBlock[WEBAUDIO_BLOCK_SIZE],
+ float aScale)
+{
+ AudioBufferInPlaceScale(aBlock, aScale, WEBAUDIO_BLOCK_SIZE);
+}
+
+void
+AudioBufferInPlaceScale(float* aBlock,
+ float aScale,
+ uint32_t aSize)
+{
+ if (aScale == 1.0f) {
+ return;
+ }
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ AudioBufferInPlaceScale_NEON(aBlock, aScale, aSize);
+ return;
+ }
+#endif
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse2()) {
+ AudioBufferInPlaceScale_SSE(aBlock, aScale, aSize);
+ return;
+ }
+#endif
+
+ for (uint32_t i = 0; i < aSize; ++i) {
+ *aBlock++ *= aScale;
+ }
+}
+
+void
+AudioBlockPanMonoToStereo(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ float aGainL[WEBAUDIO_BLOCK_SIZE],
+ float aGainR[WEBAUDIO_BLOCK_SIZE],
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+ AudioBlockCopyChannelWithScale(aInput, aGainL, aOutputL);
+ AudioBlockCopyChannelWithScale(aInput, aGainR, aOutputR);
+}
+
+void
+AudioBlockPanMonoToStereo(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+ AudioBlockCopyChannelWithScale(aInput, aGainL, aOutputL);
+ AudioBlockCopyChannelWithScale(aInput, aGainR, aOutputR);
+}
+
+void
+AudioBlockPanStereoToStereo(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR, bool aIsOnTheLeft,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ AudioBlockPanStereoToStereo_NEON(aInputL, aInputR,
+ aGainL, aGainR, aIsOnTheLeft,
+ aOutputL, aOutputR);
+ return;
+ }
+#endif
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse2()) {
+ AudioBlockPanStereoToStereo_SSE(aInputL, aInputR,
+ aGainL, aGainR, aIsOnTheLeft,
+ aOutputL, aOutputR);
+ return;
+ }
+#endif
+
+ uint32_t i;
+
+ if (aIsOnTheLeft) {
+ for (i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ aOutputL[i] = aInputL[i] + aInputR[i] * aGainL;
+ aOutputR[i] = aInputR[i] * aGainR;
+ }
+ } else {
+ for (i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ aOutputL[i] = aInputL[i] * aGainL;
+ aOutputR[i] = aInputR[i] + aInputL[i] * aGainR;
+ }
+ }
+}
+
+void
+AudioBlockPanStereoToStereo(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL[WEBAUDIO_BLOCK_SIZE],
+ float aGainR[WEBAUDIO_BLOCK_SIZE],
+ bool aIsOnTheLeft[WEBAUDIO_BLOCK_SIZE],
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ AudioBlockPanStereoToStereo_NEON(aInputL, aInputR,
+ aGainL, aGainR, aIsOnTheLeft,
+ aOutputL, aOutputR);
+ return;
+ }
+#endif
+
+ uint32_t i;
+ for (i = 0; i < WEBAUDIO_BLOCK_SIZE; i++) {
+ if (aIsOnTheLeft[i]) {
+ aOutputL[i] = aInputL[i] + aInputR[i] * aGainL[i];
+ aOutputR[i] = aInputR[i] * aGainR[i];
+ } else {
+ aOutputL[i] = aInputL[i] * aGainL[i];
+ aOutputR[i] = aInputR[i] + aInputL[i] * aGainR[i];
+ }
+ }
+}
+
+float
+AudioBufferSumOfSquares(const float* aInput, uint32_t aLength)
+{
+ float sum = 0.0f;
+
+#ifdef USE_SSE2
+ if (mozilla::supports_sse()) {
+ const float* alignedInput = ALIGNED16(aInput);
+ float vLength = (aLength >> 4) << 4;
+
+ // use scalar operations for any unaligned data at the beginning
+ while (aInput != alignedInput) {
+ sum += *aInput * *aInput;
+ ++aInput;
+ }
+
+ sum += AudioBufferSumOfSquares_SSE(alignedInput, vLength);
+
+ // adjust aInput and aLength to use scalar operations for any
+ // remaining values
+ aInput = alignedInput + 1;
+ aLength -= vLength;
+ }
+#endif
+
+ while (aLength--) {
+ sum += *aInput * *aInput;
+ ++aInput;
+ }
+ return sum;
+}
+
+void
+AudioNodeEngine::ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished)
+{
+ MOZ_ASSERT(mInputCount <= 1 && mOutputCount <= 1);
+ *aOutput = aInput;
+}
+
+void
+AudioNodeEngine::ProcessBlocksOnPorts(AudioNodeStream* aStream,
+ const OutputChunks& aInput,
+ OutputChunks& aOutput,
+ bool* aFinished)
+{
+ MOZ_ASSERT(mInputCount > 1 || mOutputCount > 1);
+ // Only produce one output port, and drop all other input ports.
+ aOutput[0] = aInput[0];
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioNodeEngine.h b/dom/media/webaudio/AudioNodeEngine.h
new file mode 100644
index 000000000..d49b5c906
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeEngine.h
@@ -0,0 +1,410 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef MOZILLA_AUDIONODEENGINE_H_
+#define MOZILLA_AUDIONODEENGINE_H_
+
+#include "AudioSegment.h"
+#include "mozilla/dom/AudioNode.h"
+#include "mozilla/MemoryReporting.h"
+#include "mozilla/Mutex.h"
+
+namespace mozilla {
+
+namespace dom {
+struct ThreeDPoint;
+class AudioParamTimeline;
+class DelayNodeEngine;
+struct AudioTimelineEvent;
+} // namespace dom
+
+class AudioBlock;
+class AudioNodeStream;
+
+/**
+ * This class holds onto a set of immutable channel buffers. The storage
+ * for the buffers must be malloced, but the buffer pointers and the malloc
+ * pointers can be different (e.g. if the buffers are contained inside
+ * some malloced object).
+ */
+class ThreadSharedFloatArrayBufferList final : public ThreadSharedObject
+{
+public:
+ /**
+ * Construct with null channel data pointers.
+ */
+ explicit ThreadSharedFloatArrayBufferList(uint32_t aCount)
+ {
+ mContents.SetLength(aCount);
+ }
+ /**
+ * Create with buffers suitable for transfer to
+ * JS_NewArrayBufferWithContents(). The buffer contents are uninitialized
+ * and so should be set using GetDataForWrite().
+ */
+ static already_AddRefed<ThreadSharedFloatArrayBufferList>
+ Create(uint32_t aChannelCount, size_t aLength, const mozilla::fallible_t&);
+
+ struct Storage final
+ {
+ Storage() :
+ mDataToFree(nullptr),
+ mFree(nullptr),
+ mSampleData(nullptr)
+ {}
+ ~Storage() {
+ if (mFree) {
+ mFree(mDataToFree);
+ } else { MOZ_ASSERT(!mDataToFree); }
+ }
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ // NB: mSampleData might not be owned, if it is it just points to
+ // mDataToFree.
+ return aMallocSizeOf(mDataToFree);
+ }
+ void* mDataToFree;
+ void (*mFree)(void*);
+ float* mSampleData;
+ };
+
+ /**
+ * This can be called on any thread.
+ */
+ uint32_t GetChannels() const { return mContents.Length(); }
+ /**
+ * This can be called on any thread.
+ */
+ const float* GetData(uint32_t aIndex) const { return mContents[aIndex].mSampleData; }
+ /**
+ * This can be called on any thread, but only when the calling thread is the
+ * only owner.
+ */
+ float* GetDataForWrite(uint32_t aIndex)
+ {
+ MOZ_ASSERT(!IsShared());
+ return mContents[aIndex].mSampleData;
+ }
+
+ /**
+ * Call this only during initialization, before the object is handed to
+ * any other thread.
+ */
+ void SetData(uint32_t aIndex, void* aDataToFree, void (*aFreeFunc)(void*), float* aData)
+ {
+ Storage* s = &mContents[aIndex];
+ if (s->mFree) {
+ s->mFree(s->mDataToFree);
+ } else {
+ MOZ_ASSERT(!s->mDataToFree);
+ }
+
+ s->mDataToFree = aDataToFree;
+ s->mFree = aFreeFunc;
+ s->mSampleData = aData;
+ }
+
+ /**
+ * Put this object into an error state where there are no channels.
+ */
+ void Clear() { mContents.Clear(); }
+
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = ThreadSharedObject::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mContents.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mContents.Length(); i++) {
+ amount += mContents[i].SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ AutoTArray<Storage, 2> mContents;
+};
+
+/**
+ * aChunk must have been allocated by AllocateAudioBlock.
+ */
+void WriteZeroesToAudioBlock(AudioBlock* aChunk, uint32_t aStart,
+ uint32_t aLength);
+
+/**
+ * Copy with scale. aScale == 1.0f should be optimized.
+ */
+void AudioBufferCopyWithScale(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize);
+
+/**
+ * Pointwise multiply-add operation. aScale == 1.0f should be optimized.
+ */
+void AudioBufferAddWithScale(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize);
+
+/**
+ * Pointwise multiply-add operation. aScale == 1.0f should be optimized.
+ */
+void AudioBlockAddChannelWithScale(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ float aScale,
+ float aOutput[WEBAUDIO_BLOCK_SIZE]);
+
+/**
+ * Pointwise copy-scaled operation. aScale == 1.0f should be optimized.
+ *
+ * Buffer size is implicitly assumed to be WEBAUDIO_BLOCK_SIZE.
+ */
+void AudioBlockCopyChannelWithScale(const float* aInput,
+ float aScale,
+ float* aOutput);
+
+/**
+ * Vector copy-scaled operation.
+ */
+void AudioBlockCopyChannelWithScale(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ const float aScale[WEBAUDIO_BLOCK_SIZE],
+ float aOutput[WEBAUDIO_BLOCK_SIZE]);
+
+/**
+ * Vector complex multiplication on arbitrary sized buffers.
+ */
+void BufferComplexMultiply(const float* aInput,
+ const float* aScale,
+ float* aOutput,
+ uint32_t aSize);
+
+/**
+ * Vector maximum element magnitude ( max(abs(aInput)) ).
+ */
+float AudioBufferPeakValue(const float* aInput, uint32_t aSize);
+
+/**
+ * In place gain. aScale == 1.0f should be optimized.
+ */
+void AudioBlockInPlaceScale(float aBlock[WEBAUDIO_BLOCK_SIZE],
+ float aScale);
+
+/**
+ * In place gain. aScale == 1.0f should be optimized.
+ */
+void AudioBufferInPlaceScale(float* aBlock,
+ float aScale,
+ uint32_t aSize);
+
+/**
+ * Upmix a mono input to a stereo output, scaling the two output channels by two
+ * different gain value.
+ * This algorithm is specified in the WebAudio spec.
+ */
+void
+AudioBlockPanMonoToStereo(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+
+void
+AudioBlockPanMonoToStereo(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ float aGainL[WEBAUDIO_BLOCK_SIZE],
+ float aGainR[WEBAUDIO_BLOCK_SIZE],
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+/**
+ * Pan a stereo source according to right and left gain, and the position
+ * (whether the listener is on the left of the source or not).
+ * This algorithm is specified in the WebAudio spec.
+ */
+void
+AudioBlockPanStereoToStereo(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR, bool aIsOnTheLeft,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+void
+AudioBlockPanStereoToStereo(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL[WEBAUDIO_BLOCK_SIZE],
+ float aGainR[WEBAUDIO_BLOCK_SIZE],
+ bool aIsOnTheLeft[WEBAUDIO_BLOCK_SIZE],
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+
+/**
+ * Return the sum of squares of all of the samples in the input.
+ */
+float
+AudioBufferSumOfSquares(const float* aInput, uint32_t aLength);
+
+/**
+ * All methods of this class and its subclasses are called on the
+ * MediaStreamGraph thread.
+ */
+class AudioNodeEngine
+{
+public:
+ // This should be compatible with AudioNodeStream::OutputChunks.
+ typedef AutoTArray<AudioBlock, 1> OutputChunks;
+
+ explicit AudioNodeEngine(dom::AudioNode* aNode)
+ : mNode(aNode)
+ , mNodeType(aNode ? aNode->NodeType() : nullptr)
+ , mInputCount(aNode ? aNode->NumberOfInputs() : 1)
+ , mOutputCount(aNode ? aNode->NumberOfOutputs() : 0)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(AudioNodeEngine);
+ }
+ virtual ~AudioNodeEngine()
+ {
+ MOZ_ASSERT(!mNode, "The node reference must be already cleared");
+ MOZ_COUNT_DTOR(AudioNodeEngine);
+ }
+
+ virtual dom::DelayNodeEngine* AsDelayNodeEngine() { return nullptr; }
+
+ virtual void SetStreamTimeParameter(uint32_t aIndex, StreamTime aParam)
+ {
+ NS_ERROR("Invalid SetStreamTimeParameter index");
+ }
+ virtual void SetDoubleParameter(uint32_t aIndex, double aParam)
+ {
+ NS_ERROR("Invalid SetDoubleParameter index");
+ }
+ virtual void SetInt32Parameter(uint32_t aIndex, int32_t aParam)
+ {
+ NS_ERROR("Invalid SetInt32Parameter index");
+ }
+ virtual void RecvTimelineEvent(uint32_t aIndex,
+ dom::AudioTimelineEvent& aValue)
+ {
+ NS_ERROR("Invalid RecvTimelineEvent index");
+ }
+ virtual void SetThreeDPointParameter(uint32_t aIndex,
+ const dom::ThreeDPoint& aValue)
+ {
+ NS_ERROR("Invalid SetThreeDPointParameter index");
+ }
+ virtual void SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList> aBuffer)
+ {
+ NS_ERROR("SetBuffer called on engine that doesn't support it");
+ }
+ // This consumes the contents of aData. aData will be emptied after this returns.
+ virtual void SetRawArrayData(nsTArray<float>& aData)
+ {
+ NS_ERROR("SetRawArrayData called on an engine that doesn't support it");
+ }
+
+ /**
+ * Produce the next block of audio samples, given input samples aInput
+ * (the mixed data for input 0).
+ * aInput is guaranteed to have float sample format (if it has samples at all)
+ * and to have been resampled to the sampling rate for the stream, and to have
+ * exactly WEBAUDIO_BLOCK_SIZE samples.
+ * *aFinished is set to false by the caller. The callee must not set this to
+ * true unless silent output is produced. If set to true, we'll finish the
+ * stream, consider this input inactive on any downstream nodes, and not
+ * call this again.
+ */
+ virtual void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished);
+ /**
+ * Produce the next block of audio samples, before input is provided.
+ * ProcessBlock() will be called later, and it then should not change
+ * aOutput. This is used only for DelayNodeEngine in a feedback loop.
+ */
+ virtual void ProduceBlockBeforeInput(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ AudioBlock* aOutput)
+ {
+ NS_NOTREACHED("ProduceBlockBeforeInput called on wrong engine\n");
+ }
+
+ /**
+ * Produce the next block of audio samples, given input samples in the aInput
+ * array. There is one input sample per active port in aInput, in order.
+ * This is the multi-input/output version of ProcessBlock. Only one kind
+ * of ProcessBlock is called on each node, depending on whether the
+ * number of inputs and outputs are both 1 or not.
+ *
+ * aInput is always guaranteed to not contain more input AudioChunks than the
+ * maximum number of inputs for the node. It is the responsibility of the
+ * overrides of this function to make sure they will only add a maximum number
+ * of AudioChunks to aOutput as advertized by the AudioNode implementation.
+ * An engine may choose to produce fewer inputs than advertizes by the
+ * corresponding AudioNode, in which case it will be interpreted as a channel
+ * of silence.
+ */
+ virtual void ProcessBlocksOnPorts(AudioNodeStream* aStream,
+ const OutputChunks& aInput,
+ OutputChunks& aOutput,
+ bool* aFinished);
+
+ // IsActive() returns true if the engine needs to continue processing an
+ // unfinished stream even when it has silent or no input connections. This
+ // includes tail-times and when sources have been scheduled to start. If
+ // returning false, then the stream can be suspended.
+ virtual bool IsActive() const { return false; }
+
+ bool HasNode() const
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return !!mNode;
+ }
+
+ dom::AudioNode* NodeMainThread() const
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ return mNode;
+ }
+
+ void ClearNode()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(mNode != nullptr);
+ mNode = nullptr;
+ }
+
+ uint16_t InputCount() const { return mInputCount; }
+ uint16_t OutputCount() const { return mOutputCount; }
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ // NB: |mNode| is tracked separately so it is excluded here.
+ return 0;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ void SizeOfIncludingThis(MallocSizeOf aMallocSizeOf,
+ AudioNodeSizes& aUsage) const
+ {
+ aUsage.mEngine = SizeOfIncludingThis(aMallocSizeOf);
+ aUsage.mNodeType = mNodeType;
+ }
+
+private:
+ dom::AudioNode* mNode; // main thread only
+ const char* const mNodeType;
+ const uint16_t mInputCount;
+ const uint16_t mOutputCount;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_AUDIONODEENGINE_H_ */
diff --git a/dom/media/webaudio/AudioNodeEngineNEON.cpp b/dom/media/webaudio/AudioNodeEngineNEON.cpp
new file mode 100644
index 000000000..079a1cc8b
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeEngineNEON.cpp
@@ -0,0 +1,318 @@
+/* -*- mode: c++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* this source code form is subject to the terms of the mozilla public
+ * license, v. 2.0. if a copy of the mpl was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioNodeEngineNEON.h"
+#include <arm_neon.h>
+
+//#ifdef DEBUG
+#if 0 // see bug 921099
+ #define ASSERT_ALIGNED(ptr) \
+ MOZ_ASSERT((((uintptr_t)ptr + 15) & ~0x0F) == (uintptr_t)ptr, \
+ #ptr " has to be aligned 16-bytes aligned.");
+#else
+ #define ASSERT_ALIGNED(ptr)
+#endif
+
+#define ADDRESS_OF(array, index) ((float32_t*)&array[index])
+
+namespace mozilla {
+void AudioBufferAddWithScale_NEON(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize)
+{
+ ASSERT_ALIGNED(aInput);
+ ASSERT_ALIGNED(aOutput);
+
+ float32x4_t vin0, vin1, vin2, vin3;
+ float32x4_t vout0, vout1, vout2, vout3;
+ float32x4_t vscale = vmovq_n_f32(aScale);
+
+ uint32_t dif = aSize % 16;
+ aSize -= dif;
+ unsigned i = 0;
+ for (; i < aSize; i+=16) {
+ vin0 = vld1q_f32(ADDRESS_OF(aInput, i));
+ vin1 = vld1q_f32(ADDRESS_OF(aInput, i+4));
+ vin2 = vld1q_f32(ADDRESS_OF(aInput, i+8));
+ vin3 = vld1q_f32(ADDRESS_OF(aInput, i+12));
+
+ vout0 = vld1q_f32(ADDRESS_OF(aOutput, i));
+ vout1 = vld1q_f32(ADDRESS_OF(aOutput, i+4));
+ vout2 = vld1q_f32(ADDRESS_OF(aOutput, i+8));
+ vout3 = vld1q_f32(ADDRESS_OF(aOutput, i+12));
+
+ vout0 = vmlaq_f32(vout0, vin0, vscale);
+ vout1 = vmlaq_f32(vout1, vin1, vscale);
+ vout2 = vmlaq_f32(vout2, vin2, vscale);
+ vout3 = vmlaq_f32(vout3, vin3, vscale);
+
+ vst1q_f32(ADDRESS_OF(aOutput, i), vout0);
+ vst1q_f32(ADDRESS_OF(aOutput, i+4), vout1);
+ vst1q_f32(ADDRESS_OF(aOutput, i+8), vout2);
+ vst1q_f32(ADDRESS_OF(aOutput, i+12), vout3);
+ }
+
+ for (unsigned j = 0; j < dif; ++i, ++j) {
+ aOutput[i] += aInput[i]*aScale;
+ }
+}
+void
+AudioBlockCopyChannelWithScale_NEON(const float* aInput,
+ float aScale,
+ float* aOutput)
+{
+ ASSERT_ALIGNED(aInput);
+ ASSERT_ALIGNED(aOutput);
+
+ float32x4_t vin0, vin1, vin2, vin3;
+ float32x4_t vout0, vout1, vout2, vout3;
+ float32x4_t vscale = vmovq_n_f32(aScale);
+
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=16) {
+ vin0 = vld1q_f32(ADDRESS_OF(aInput, i));
+ vin1 = vld1q_f32(ADDRESS_OF(aInput, i+4));
+ vin2 = vld1q_f32(ADDRESS_OF(aInput, i+8));
+ vin3 = vld1q_f32(ADDRESS_OF(aInput, i+12));
+
+ vout0 = vmulq_f32(vin0, vscale);
+ vout1 = vmulq_f32(vin1, vscale);
+ vout2 = vmulq_f32(vin2, vscale);
+ vout3 = vmulq_f32(vin3, vscale);
+
+ vst1q_f32(ADDRESS_OF(aOutput, i), vout0);
+ vst1q_f32(ADDRESS_OF(aOutput, i+4), vout1);
+ vst1q_f32(ADDRESS_OF(aOutput, i+8), vout2);
+ vst1q_f32(ADDRESS_OF(aOutput, i+12), vout3);
+ }
+}
+
+void
+AudioBlockCopyChannelWithScale_NEON(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ const float aScale[WEBAUDIO_BLOCK_SIZE],
+ float aOutput[WEBAUDIO_BLOCK_SIZE])
+{
+ ASSERT_ALIGNED(aInput);
+ ASSERT_ALIGNED(aScale);
+ ASSERT_ALIGNED(aOutput);
+
+ float32x4_t vin0, vin1, vin2, vin3;
+ float32x4_t vout0, vout1, vout2, vout3;
+ float32x4_t vscale0, vscale1, vscale2, vscale3;
+
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=16) {
+ vin0 = vld1q_f32(ADDRESS_OF(aInput, i));
+ vin1 = vld1q_f32(ADDRESS_OF(aInput, i+4));
+ vin2 = vld1q_f32(ADDRESS_OF(aInput, i+8));
+ vin3 = vld1q_f32(ADDRESS_OF(aInput, i+12));
+
+ vscale0 = vld1q_f32(ADDRESS_OF(aScale, i));
+ vscale1 = vld1q_f32(ADDRESS_OF(aScale, i+4));
+ vscale2 = vld1q_f32(ADDRESS_OF(aScale, i+8));
+ vscale3 = vld1q_f32(ADDRESS_OF(aScale, i+12));
+
+ vout0 = vmulq_f32(vin0, vscale0);
+ vout1 = vmulq_f32(vin1, vscale1);
+ vout2 = vmulq_f32(vin2, vscale2);
+ vout3 = vmulq_f32(vin3, vscale3);
+
+ vst1q_f32(ADDRESS_OF(aOutput, i), vout0);
+ vst1q_f32(ADDRESS_OF(aOutput, i+4), vout1);
+ vst1q_f32(ADDRESS_OF(aOutput, i+8), vout2);
+ vst1q_f32(ADDRESS_OF(aOutput, i+12), vout3);
+ }
+}
+
+void
+AudioBufferInPlaceScale_NEON(float* aBlock,
+ float aScale,
+ uint32_t aSize)
+{
+ ASSERT_ALIGNED(aBlock);
+
+ float32x4_t vin0, vin1, vin2, vin3;
+ float32x4_t vout0, vout1, vout2, vout3;
+ float32x4_t vscale = vmovq_n_f32(aScale);
+
+ uint32_t dif = aSize % 16;
+ uint32_t vectorSize = aSize - dif;
+ uint32_t i = 0;
+ for (; i < vectorSize; i+=16) {
+ vin0 = vld1q_f32(ADDRESS_OF(aBlock, i));
+ vin1 = vld1q_f32(ADDRESS_OF(aBlock, i+4));
+ vin2 = vld1q_f32(ADDRESS_OF(aBlock, i+8));
+ vin3 = vld1q_f32(ADDRESS_OF(aBlock, i+12));
+
+ vout0 = vmulq_f32(vin0, vscale);
+ vout1 = vmulq_f32(vin1, vscale);
+ vout2 = vmulq_f32(vin2, vscale);
+ vout3 = vmulq_f32(vin3, vscale);
+
+ vst1q_f32(ADDRESS_OF(aBlock, i), vout0);
+ vst1q_f32(ADDRESS_OF(aBlock, i+4), vout1);
+ vst1q_f32(ADDRESS_OF(aBlock, i+8), vout2);
+ vst1q_f32(ADDRESS_OF(aBlock, i+12), vout3);
+ }
+
+ for (unsigned j = 0; j < dif; ++i, ++j) {
+ aBlock[i] *= aScale;
+ }
+}
+
+void
+AudioBlockPanStereoToStereo_NEON(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR, bool aIsOnTheLeft,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+ ASSERT_ALIGNED(aInputL);
+ ASSERT_ALIGNED(aInputR);
+ ASSERT_ALIGNED(aOutputL);
+ ASSERT_ALIGNED(aOutputR);
+
+ float32x4_t vinL0, vinL1;
+ float32x4_t vinR0, vinR1;
+ float32x4_t voutL0, voutL1;
+ float32x4_t voutR0, voutR1;
+ float32x4_t vscaleL = vmovq_n_f32(aGainL);
+ float32x4_t vscaleR = vmovq_n_f32(aGainR);
+
+ if (aIsOnTheLeft) {
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=8) {
+ vinL0 = vld1q_f32(ADDRESS_OF(aInputL, i));
+ vinL1 = vld1q_f32(ADDRESS_OF(aInputL, i+4));
+
+ vinR0 = vld1q_f32(ADDRESS_OF(aInputR, i));
+ vinR1 = vld1q_f32(ADDRESS_OF(aInputR, i+4));
+
+ voutL0 = vmlaq_f32(vinL0, vinR0, vscaleL);
+ voutL1 = vmlaq_f32(vinL1, vinR1, vscaleL);
+
+ vst1q_f32(ADDRESS_OF(aOutputL, i), voutL0);
+ vst1q_f32(ADDRESS_OF(aOutputL, i+4), voutL1);
+
+ voutR0 = vmulq_f32(vinR0, vscaleR);
+ voutR1 = vmulq_f32(vinR1, vscaleR);
+
+ vst1q_f32(ADDRESS_OF(aOutputR, i), voutR0);
+ vst1q_f32(ADDRESS_OF(aOutputR, i+4), voutR1);
+ }
+ } else {
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=8) {
+ vinL0 = vld1q_f32(ADDRESS_OF(aInputL, i));
+ vinL1 = vld1q_f32(ADDRESS_OF(aInputL, i+4));
+
+ vinR0 = vld1q_f32(ADDRESS_OF(aInputR, i));
+ vinR1 = vld1q_f32(ADDRESS_OF(aInputR, i+4));
+
+ voutL0 = vmulq_f32(vinL0, vscaleL);
+ voutL1 = vmulq_f32(vinL1, vscaleL);
+
+ vst1q_f32(ADDRESS_OF(aOutputL, i), voutL0);
+ vst1q_f32(ADDRESS_OF(aOutputL, i+4), voutL1);
+
+ voutR0 = vmlaq_f32(vinR0, vinL0, vscaleR);
+ voutR1 = vmlaq_f32(vinR1, vinL1, vscaleR);
+
+ vst1q_f32(ADDRESS_OF(aOutputR, i), voutR0);
+ vst1q_f32(ADDRESS_OF(aOutputR, i+4), voutR1);
+ }
+ }
+}
+
+void
+AudioBlockPanStereoToStereo_NEON(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL[WEBAUDIO_BLOCK_SIZE],
+ float aGainR[WEBAUDIO_BLOCK_SIZE],
+ const bool aIsOnTheLeft[WEBAUDIO_BLOCK_SIZE],
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+ ASSERT_ALIGNED(aInputL);
+ ASSERT_ALIGNED(aInputR);
+ ASSERT_ALIGNED(aGainL);
+ ASSERT_ALIGNED(aGainR);
+ ASSERT_ALIGNED(aIsOnTheLeft);
+ ASSERT_ALIGNED(aOutputL);
+ ASSERT_ALIGNED(aOutputR);
+
+ float32x4_t vinL0, vinL1;
+ float32x4_t vinR0, vinR1;
+ float32x4_t voutL0, voutL1;
+ float32x4_t voutR0, voutR1;
+ float32x4_t vscaleL0, vscaleL1;
+ float32x4_t vscaleR0, vscaleR1;
+ float32x4_t onleft0, onleft1, notonleft0, notonleft1;
+
+ float32x4_t zero = {0, 0, 0, 0};
+ uint8x8_t isOnTheLeft;
+
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=8) {
+ vinL0 = vld1q_f32(ADDRESS_OF(aInputL, i));
+ vinL1 = vld1q_f32(ADDRESS_OF(aInputL, i+4));
+
+ vinR0 = vld1q_f32(ADDRESS_OF(aInputR, i));
+ vinR1 = vld1q_f32(ADDRESS_OF(aInputR, i+4));
+
+ vscaleL0 = vld1q_f32(ADDRESS_OF(aGainL, i));
+ vscaleL1 = vld1q_f32(ADDRESS_OF(aGainL, i+4));
+
+ vscaleR0 = vld1q_f32(ADDRESS_OF(aGainR, i));
+ vscaleR1 = vld1q_f32(ADDRESS_OF(aGainR, i+4));
+
+ // Load output with boolean "on the left" values. This assumes that
+ // bools are stored as a single byte.
+ isOnTheLeft = vld1_u8((uint8_t *)&aIsOnTheLeft[i]);
+ voutL0 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 0), voutL0, 0);
+ voutL0 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 1), voutL0, 1);
+ voutL0 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 2), voutL0, 2);
+ voutL0 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 3), voutL0, 3);
+ voutL1 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 4), voutL1, 0);
+ voutL1 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 5), voutL1, 1);
+ voutL1 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 6), voutL1, 2);
+ voutL1 = vsetq_lane_f32(vget_lane_u8(isOnTheLeft, 7), voutL1, 3);
+
+ // Convert the boolean values into masks by setting all bits to 1
+ // if true.
+ voutL0 = (float32x4_t)vcgtq_f32(voutL0, zero);
+ voutL1 = (float32x4_t)vcgtq_f32(voutL1, zero);
+
+ // The right output masks are the same as the left masks
+ voutR0 = voutL0;
+ voutR1 = voutL1;
+
+ // Calculate left channel assuming isOnTheLeft
+ onleft0 = vmlaq_f32(vinL0, vinR0, vscaleL0);
+ onleft1 = vmlaq_f32(vinL1, vinR1, vscaleL0);
+
+ // Calculate left channel assuming not isOnTheLeft
+ notonleft0 = vmulq_f32(vinL0, vscaleL0);
+ notonleft1 = vmulq_f32(vinL1, vscaleL1);
+
+ // Write results using previously stored masks
+ voutL0 = vbslq_f32((uint32x4_t)voutL0, onleft0, notonleft0);
+ voutL1 = vbslq_f32((uint32x4_t)voutL1, onleft1, notonleft1);
+
+ // Calculate right channel assuming isOnTheLeft
+ onleft0 = vmulq_f32(vinR0, vscaleR0);
+ onleft1 = vmulq_f32(vinR1, vscaleR1);
+
+ // Calculate right channel assuming not isOnTheLeft
+ notonleft0 = vmlaq_f32(vinR0, vinL0, vscaleR0);
+ notonleft1 = vmlaq_f32(vinR1, vinL1, vscaleR1);
+
+ // Write results using previously stored masks
+ voutR0 = vbslq_f32((uint32x4_t)voutR0, onleft0, notonleft0);
+ voutR1 = vbslq_f32((uint32x4_t)voutR1, onleft1, notonleft1);
+
+ vst1q_f32(ADDRESS_OF(aOutputL, i), voutL0);
+ vst1q_f32(ADDRESS_OF(aOutputL, i+4), voutL1);
+ vst1q_f32(ADDRESS_OF(aOutputR, i), voutR0);
+ vst1q_f32(ADDRESS_OF(aOutputR, i+4), voutR1);
+ }
+}
+}
diff --git a/dom/media/webaudio/AudioNodeEngineNEON.h b/dom/media/webaudio/AudioNodeEngineNEON.h
new file mode 100644
index 000000000..2b3e89b75
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeEngineNEON.h
@@ -0,0 +1,49 @@
+/* -*- mode: c++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* this source code form is subject to the terms of the mozilla public
+ * license, v. 2.0. if a copy of the mpl was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUDIONODEENGINENEON_H_
+#define MOZILLA_AUDIONODEENGINENEON_H_
+
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+void AudioBufferAddWithScale_NEON(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize);
+
+void
+AudioBlockCopyChannelWithScale_NEON(const float* aInput,
+ float aScale,
+ float* aOutput);
+
+void
+AudioBlockCopyChannelWithScale_NEON(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ const float aScale[WEBAUDIO_BLOCK_SIZE],
+ float aOutput[WEBAUDIO_BLOCK_SIZE]);
+
+void
+AudioBufferInPlaceScale_NEON(float* aBlock,
+ float aScale,
+ uint32_t aSize);
+
+void
+AudioBlockPanStereoToStereo_NEON(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR, bool aIsOnTheLeft,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+
+void
+AudioBlockPanStereoToStereo_NEON(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL[WEBAUDIO_BLOCK_SIZE],
+ float aGainR[WEBAUDIO_BLOCK_SIZE],
+ const bool aIsOnTheLeft[WEBAUDIO_BLOCK_SIZE],
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+}
+
+#endif /* MOZILLA_AUDIONODEENGINENEON_H_ */
diff --git a/dom/media/webaudio/AudioNodeEngineSSE2.cpp b/dom/media/webaudio/AudioNodeEngineSSE2.cpp
new file mode 100644
index 000000000..a03323239
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeEngineSSE2.cpp
@@ -0,0 +1,315 @@
+/* -*- mode: c++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* this source code form is subject to the terms of the mozilla public
+ * license, v. 2.0. if a copy of the mpl was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioNodeEngineSSE2.h"
+#include "AlignmentUtils.h"
+#include <emmintrin.h>
+
+
+namespace mozilla {
+void
+AudioBufferAddWithScale_SSE(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize)
+{
+ __m128 vin0, vin1, vin2, vin3,
+ vscaled0, vscaled1, vscaled2, vscaled3,
+ vout0, vout1, vout2, vout3,
+ vgain;
+
+ ASSERT_ALIGNED16(aInput);
+ ASSERT_ALIGNED16(aOutput);
+ ASSERT_MULTIPLE16(aSize);
+
+ vgain = _mm_load1_ps(&aScale);
+
+ for (unsigned i = 0; i < aSize; i+=16) {
+ vin0 = _mm_load_ps(&aInput[i]);
+ vin1 = _mm_load_ps(&aInput[i + 4]);
+ vin2 = _mm_load_ps(&aInput[i + 8]);
+ vin3 = _mm_load_ps(&aInput[i + 12]);
+
+ vscaled0 = _mm_mul_ps(vin0, vgain);
+ vscaled1 = _mm_mul_ps(vin1, vgain);
+ vscaled2 = _mm_mul_ps(vin2, vgain);
+ vscaled3 = _mm_mul_ps(vin3, vgain);
+
+ vin0 = _mm_load_ps(&aOutput[i]);
+ vin1 = _mm_load_ps(&aOutput[i + 4]);
+ vin2 = _mm_load_ps(&aOutput[i + 8]);
+ vin3 = _mm_load_ps(&aOutput[i + 12]);
+
+ vout0 = _mm_add_ps(vin0, vscaled0);
+ vout1 = _mm_add_ps(vin1, vscaled1);
+ vout2 = _mm_add_ps(vin2, vscaled2);
+ vout3 = _mm_add_ps(vin3, vscaled3);
+
+ _mm_store_ps(&aOutput[i], vout0);
+ _mm_store_ps(&aOutput[i + 4], vout1);
+ _mm_store_ps(&aOutput[i + 8], vout2);
+ _mm_store_ps(&aOutput[i + 12], vout3);
+ }
+}
+
+void
+AudioBlockCopyChannelWithScale_SSE(const float* aInput,
+ float aScale,
+ float* aOutput)
+{
+ __m128 vin0, vin1, vin2, vin3,
+ vout0, vout1, vout2, vout3;
+
+ ASSERT_ALIGNED16(aInput);
+ ASSERT_ALIGNED16(aOutput);
+
+ __m128 vgain = _mm_load1_ps(&aScale);
+
+ for (unsigned i = 0 ; i < WEBAUDIO_BLOCK_SIZE; i+=16) {
+ vin0 = _mm_load_ps(&aInput[i]);
+ vin1 = _mm_load_ps(&aInput[i + 4]);
+ vin2 = _mm_load_ps(&aInput[i + 8]);
+ vin3 = _mm_load_ps(&aInput[i + 12]);
+ vout0 = _mm_mul_ps(vin0, vgain);
+ vout1 = _mm_mul_ps(vin1, vgain);
+ vout2 = _mm_mul_ps(vin2, vgain);
+ vout3 = _mm_mul_ps(vin3, vgain);
+ _mm_store_ps(&aOutput[i], vout0);
+ _mm_store_ps(&aOutput[i + 4], vout1);
+ _mm_store_ps(&aOutput[i + 8], vout2);
+ _mm_store_ps(&aOutput[i + 12], vout3);
+ }
+}
+
+void
+AudioBlockCopyChannelWithScale_SSE(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ const float aScale[WEBAUDIO_BLOCK_SIZE],
+ float aOutput[WEBAUDIO_BLOCK_SIZE])
+{
+ __m128 vin0, vin1, vin2, vin3,
+ vscaled0, vscaled1, vscaled2, vscaled3,
+ vout0, vout1, vout2, vout3;
+
+ ASSERT_ALIGNED16(aInput);
+ ASSERT_ALIGNED16(aScale);
+ ASSERT_ALIGNED16(aOutput);
+
+ for (unsigned i = 0 ; i < WEBAUDIO_BLOCK_SIZE; i+=16) {
+ vscaled0 = _mm_load_ps(&aScale[i]);
+ vscaled1 = _mm_load_ps(&aScale[i+4]);
+ vscaled2 = _mm_load_ps(&aScale[i+8]);
+ vscaled3 = _mm_load_ps(&aScale[i+12]);
+
+ vin0 = _mm_load_ps(&aInput[i]);
+ vin1 = _mm_load_ps(&aInput[i + 4]);
+ vin2 = _mm_load_ps(&aInput[i + 8]);
+ vin3 = _mm_load_ps(&aInput[i + 12]);
+
+ vout0 = _mm_mul_ps(vin0, vscaled0);
+ vout1 = _mm_mul_ps(vin1, vscaled1);
+ vout2 = _mm_mul_ps(vin2, vscaled2);
+ vout3 = _mm_mul_ps(vin3, vscaled3);
+
+ _mm_store_ps(&aOutput[i], vout0);
+ _mm_store_ps(&aOutput[i + 4], vout1);
+ _mm_store_ps(&aOutput[i + 8], vout2);
+ _mm_store_ps(&aOutput[i + 12], vout3);
+ }
+}
+
+void
+AudioBufferInPlaceScale_SSE(float* aBlock,
+ float aScale,
+ uint32_t aSize)
+{
+ __m128 vout0, vout1, vout2, vout3,
+ vin0, vin1, vin2, vin3;
+
+ ASSERT_ALIGNED16(aBlock);
+ ASSERT_MULTIPLE16(aSize);
+
+ __m128 vgain = _mm_load1_ps(&aScale);
+
+ for (unsigned i = 0; i < aSize; i+=16) {
+ vin0 = _mm_load_ps(&aBlock[i]);
+ vin1 = _mm_load_ps(&aBlock[i + 4]);
+ vin2 = _mm_load_ps(&aBlock[i + 8]);
+ vin3 = _mm_load_ps(&aBlock[i + 12]);
+ vout0 = _mm_mul_ps(vin0, vgain);
+ vout1 = _mm_mul_ps(vin1, vgain);
+ vout2 = _mm_mul_ps(vin2, vgain);
+ vout3 = _mm_mul_ps(vin3, vgain);
+ _mm_store_ps(&aBlock[i], vout0);
+ _mm_store_ps(&aBlock[i + 4], vout1);
+ _mm_store_ps(&aBlock[i + 8], vout2);
+ _mm_store_ps(&aBlock[i + 12], vout3);
+ }
+}
+
+void
+AudioBlockPanStereoToStereo_SSE(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR, bool aIsOnTheLeft,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE])
+{
+ __m128 vinl0, vinr0, vinl1, vinr1,
+ vout0, vout1,
+ vscaled0, vscaled1,
+ vgainl, vgainr;
+
+ ASSERT_ALIGNED16(aInputL);
+ ASSERT_ALIGNED16(aInputR);
+ ASSERT_ALIGNED16(aOutputL);
+ ASSERT_ALIGNED16(aOutputR);
+
+ vgainl = _mm_load1_ps(&aGainL);
+ vgainr = _mm_load1_ps(&aGainR);
+
+ if (aIsOnTheLeft) {
+ for (unsigned i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=8) {
+ vinl0 = _mm_load_ps(&aInputL[i]);
+ vinr0 = _mm_load_ps(&aInputR[i]);
+ vinl1 = _mm_load_ps(&aInputL[i+4]);
+ vinr1 = _mm_load_ps(&aInputR[i+4]);
+
+ /* left channel : aOutputL = aInputL + aInputR * gainL */
+ vscaled0 = _mm_mul_ps(vinr0, vgainl);
+ vscaled1 = _mm_mul_ps(vinr1, vgainl);
+ vout0 = _mm_add_ps(vscaled0, vinl0);
+ vout1 = _mm_add_ps(vscaled1, vinl1);
+ _mm_store_ps(&aOutputL[i], vout0);
+ _mm_store_ps(&aOutputL[i+4], vout1);
+
+ /* right channel : aOutputR = aInputR * gainR */
+ vscaled0 = _mm_mul_ps(vinr0, vgainr);
+ vscaled1 = _mm_mul_ps(vinr1, vgainr);
+ _mm_store_ps(&aOutputR[i], vscaled0);
+ _mm_store_ps(&aOutputR[i+4], vscaled1);
+ }
+ } else {
+ for (unsigned i = 0; i < WEBAUDIO_BLOCK_SIZE; i+=8) {
+ vinl0 = _mm_load_ps(&aInputL[i]);
+ vinr0 = _mm_load_ps(&aInputR[i]);
+ vinl1 = _mm_load_ps(&aInputL[i+4]);
+ vinr1 = _mm_load_ps(&aInputR[i+4]);
+
+ /* left channel : aInputL * gainL */
+ vscaled0 = _mm_mul_ps(vinl0, vgainl);
+ vscaled1 = _mm_mul_ps(vinl1, vgainl);
+ _mm_store_ps(&aOutputL[i], vscaled0);
+ _mm_store_ps(&aOutputL[i+4], vscaled1);
+
+ /* right channel: aOutputR = aInputR + aInputL * gainR */
+ vscaled0 = _mm_mul_ps(vinl0, vgainr);
+ vscaled1 = _mm_mul_ps(vinl1, vgainr);
+ vout0 = _mm_add_ps(vscaled0, vinr0);
+ vout1 = _mm_add_ps(vscaled1, vinr1);
+ _mm_store_ps(&aOutputR[i], vout0);
+ _mm_store_ps(&aOutputR[i+4], vout1);
+ }
+ }
+}
+
+void BufferComplexMultiply_SSE(const float* aInput,
+ const float* aScale,
+ float* aOutput,
+ uint32_t aSize)
+{
+ unsigned i;
+ __m128 in0, in1, in2, in3,
+ outreal0, outreal1, outreal2, outreal3,
+ outimag0, outimag1, outimag2, outimag3;
+
+ ASSERT_ALIGNED16(aInput);
+ ASSERT_ALIGNED16(aScale);
+ ASSERT_ALIGNED16(aOutput);
+ ASSERT_MULTIPLE16(aSize);
+
+ for (i = 0; i < aSize * 2; i += 16) {
+ in0 = _mm_load_ps(&aInput[i]);
+ in1 = _mm_load_ps(&aInput[i + 4]);
+ in2 = _mm_load_ps(&aInput[i + 8]);
+ in3 = _mm_load_ps(&aInput[i + 12]);
+
+ outreal0 = _mm_shuffle_ps(in0, in1, _MM_SHUFFLE(2, 0, 2, 0));
+ outimag0 = _mm_shuffle_ps(in0, in1, _MM_SHUFFLE(3, 1, 3, 1));
+ outreal2 = _mm_shuffle_ps(in2, in3, _MM_SHUFFLE(2, 0, 2, 0));
+ outimag2 = _mm_shuffle_ps(in2, in3, _MM_SHUFFLE(3, 1, 3, 1));
+
+ in0 = _mm_load_ps(&aScale[i]);
+ in1 = _mm_load_ps(&aScale[i + 4]);
+ in2 = _mm_load_ps(&aScale[i + 8]);
+ in3 = _mm_load_ps(&aScale[i + 12]);
+
+ outreal1 = _mm_shuffle_ps(in0, in1, _MM_SHUFFLE(2, 0, 2, 0));
+ outimag1 = _mm_shuffle_ps(in0, in1, _MM_SHUFFLE(3, 1, 3, 1));
+ outreal3 = _mm_shuffle_ps(in2, in3, _MM_SHUFFLE(2, 0, 2, 0));
+ outimag3 = _mm_shuffle_ps(in2, in3, _MM_SHUFFLE(3, 1, 3, 1));
+
+ in0 = _mm_sub_ps(_mm_mul_ps(outreal0, outreal1),
+ _mm_mul_ps(outimag0, outimag1));
+ in1 = _mm_add_ps(_mm_mul_ps(outreal0, outimag1),
+ _mm_mul_ps(outimag0, outreal1));
+ in2 = _mm_sub_ps(_mm_mul_ps(outreal2, outreal3),
+ _mm_mul_ps(outimag2, outimag3));
+ in3 = _mm_add_ps(_mm_mul_ps(outreal2, outimag3),
+ _mm_mul_ps(outimag2, outreal3));
+
+ outreal0 = _mm_unpacklo_ps(in0, in1);
+ outreal1 = _mm_unpackhi_ps(in0, in1);
+ outreal2 = _mm_unpacklo_ps(in2, in3);
+ outreal3 = _mm_unpackhi_ps(in2, in3);
+
+ _mm_store_ps(&aOutput[i], outreal0);
+ _mm_store_ps(&aOutput[i + 4], outreal1);
+ _mm_store_ps(&aOutput[i + 8], outreal2);
+ _mm_store_ps(&aOutput[i + 12], outreal3);
+ }
+}
+
+float
+AudioBufferSumOfSquares_SSE(const float* aInput, uint32_t aLength)
+{
+ unsigned i;
+ __m128 in0, in1, in2, in3,
+ acc0, acc1, acc2, acc3;
+ float out[4];
+
+ ASSERT_ALIGNED16(aInput);
+ ASSERT_MULTIPLE16(aLength);
+
+ acc0 = _mm_setzero_ps();
+ acc1 = _mm_setzero_ps();
+ acc2 = _mm_setzero_ps();
+ acc3 = _mm_setzero_ps();
+
+ for (i = 0; i < aLength; i+=16) {
+ in0 = _mm_load_ps(&aInput[i]);
+ in1 = _mm_load_ps(&aInput[i + 4]);
+ in2 = _mm_load_ps(&aInput[i + 8]);
+ in3 = _mm_load_ps(&aInput[i + 12]);
+
+ in0 = _mm_mul_ps(in0, in0);
+ in1 = _mm_mul_ps(in1, in1);
+ in2 = _mm_mul_ps(in2, in2);
+ in3 = _mm_mul_ps(in3, in3);
+
+ acc0 = _mm_add_ps(acc0, in0);
+ acc1 = _mm_add_ps(acc1, in1);
+ acc2 = _mm_add_ps(acc2, in2);
+ acc3 = _mm_add_ps(acc3, in3);
+ }
+
+ acc0 = _mm_add_ps(acc0, acc1);
+ acc0 = _mm_add_ps(acc0, acc2);
+ acc0 = _mm_add_ps(acc0, acc3);
+
+ _mm_store_ps(out, acc0);
+
+ return out[0] + out[1] + out[2] + out[3];
+}
+
+}
diff --git a/dom/media/webaudio/AudioNodeEngineSSE2.h b/dom/media/webaudio/AudioNodeEngineSSE2.h
new file mode 100644
index 000000000..d24641249
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeEngineSSE2.h
@@ -0,0 +1,45 @@
+/* -*- mode: c++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* this source code form is subject to the terms of the mozilla public
+ * license, v. 2.0. if a copy of the mpl was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+void
+AudioBufferAddWithScale_SSE(const float* aInput,
+ float aScale,
+ float* aOutput,
+ uint32_t aSize);
+
+void
+AudioBlockCopyChannelWithScale_SSE(const float* aInput,
+ float aScale,
+ float* aOutput);
+
+void
+AudioBlockCopyChannelWithScale_SSE(const float aInput[WEBAUDIO_BLOCK_SIZE],
+ const float aScale[WEBAUDIO_BLOCK_SIZE],
+ float aOutput[WEBAUDIO_BLOCK_SIZE]);
+
+void
+AudioBufferInPlaceScale_SSE(float* aBlock,
+ float aScale,
+ uint32_t aSize);
+
+void
+AudioBlockPanStereoToStereo_SSE(const float aInputL[WEBAUDIO_BLOCK_SIZE],
+ const float aInputR[WEBAUDIO_BLOCK_SIZE],
+ float aGainL, float aGainR, bool aIsOnTheLeft,
+ float aOutputL[WEBAUDIO_BLOCK_SIZE],
+ float aOutputR[WEBAUDIO_BLOCK_SIZE]);
+
+float
+AudioBufferSumOfSquares_SSE(const float* aInput, uint32_t aLength);
+
+void
+BufferComplexMultiply_SSE(const float* aInput,
+ const float* aScale,
+ float* aOutput,
+ uint32_t aSize);
+}
diff --git a/dom/media/webaudio/AudioNodeExternalInputStream.cpp b/dom/media/webaudio/AudioNodeExternalInputStream.cpp
new file mode 100644
index 000000000..2dff1488b
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeExternalInputStream.cpp
@@ -0,0 +1,238 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AlignedTArray.h"
+#include "AlignmentUtils.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeExternalInputStream.h"
+#include "AudioChannelFormat.h"
+#include "mozilla/dom/MediaStreamAudioSourceNode.h"
+
+using namespace mozilla::dom;
+
+namespace mozilla {
+
+AudioNodeExternalInputStream::AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate)
+ : AudioNodeStream(aEngine, NO_STREAM_FLAGS, aSampleRate)
+{
+ MOZ_COUNT_CTOR(AudioNodeExternalInputStream);
+}
+
+AudioNodeExternalInputStream::~AudioNodeExternalInputStream()
+{
+ MOZ_COUNT_DTOR(AudioNodeExternalInputStream);
+}
+
+/* static */ already_AddRefed<AudioNodeExternalInputStream>
+AudioNodeExternalInputStream::Create(MediaStreamGraph* aGraph,
+ AudioNodeEngine* aEngine)
+{
+ AudioContext* ctx = aEngine->NodeMainThread()->Context();
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aGraph->GraphRate() == ctx->SampleRate());
+
+ RefPtr<AudioNodeExternalInputStream> stream =
+ new AudioNodeExternalInputStream(aEngine, aGraph->GraphRate());
+ stream->mSuspendedCount += ctx->ShouldSuspendNewStream();
+ aGraph->AddStream(stream);
+ return stream.forget();
+}
+
+/**
+ * Copies the data in aInput to aOffsetInBlock within aBlock.
+ * aBlock must have been allocated with AllocateInputBlock and have a channel
+ * count that's a superset of the channels in aInput.
+ */
+template <typename T>
+static void
+CopyChunkToBlock(AudioChunk& aInput, AudioBlock *aBlock,
+ uint32_t aOffsetInBlock)
+{
+ uint32_t blockChannels = aBlock->ChannelCount();
+ AutoTArray<const T*,2> channels;
+ if (aInput.IsNull()) {
+ channels.SetLength(blockChannels);
+ PodZero(channels.Elements(), blockChannels);
+ } else {
+ const nsTArray<const T*>& inputChannels = aInput.ChannelData<T>();
+ channels.SetLength(inputChannels.Length());
+ PodCopy(channels.Elements(), inputChannels.Elements(), channels.Length());
+ if (channels.Length() != blockChannels) {
+ // We only need to upmix here because aBlock's channel count has been
+ // chosen to be a superset of the channel count of every chunk.
+ AudioChannelsUpMix(&channels, blockChannels, static_cast<T*>(nullptr));
+ }
+ }
+
+ for (uint32_t c = 0; c < blockChannels; ++c) {
+ float* outputData = aBlock->ChannelFloatsForWrite(c) + aOffsetInBlock;
+ if (channels[c]) {
+ ConvertAudioSamplesWithScale(channels[c], outputData, aInput.GetDuration(), aInput.mVolume);
+ } else {
+ PodZero(outputData, aInput.GetDuration());
+ }
+ }
+}
+
+/**
+ * Converts the data in aSegment to a single chunk aBlock. aSegment must have
+ * duration WEBAUDIO_BLOCK_SIZE. aFallbackChannelCount is a superset of the
+ * channels in every chunk of aSegment. aBlock must be float format or null.
+ */
+static void ConvertSegmentToAudioBlock(AudioSegment* aSegment,
+ AudioBlock* aBlock,
+ int32_t aFallbackChannelCount)
+{
+ NS_ASSERTION(aSegment->GetDuration() == WEBAUDIO_BLOCK_SIZE, "Bad segment duration");
+
+ {
+ AudioSegment::ChunkIterator ci(*aSegment);
+ NS_ASSERTION(!ci.IsEnded(), "Should be at least one chunk!");
+ if (ci->GetDuration() == WEBAUDIO_BLOCK_SIZE &&
+ (ci->IsNull() || ci->mBufferFormat == AUDIO_FORMAT_FLOAT32)) {
+
+ bool aligned = true;
+ for (size_t i = 0; i < ci->mChannelData.Length(); ++i) {
+ if (!IS_ALIGNED16(ci->mChannelData[i])) {
+ aligned = false;
+ break;
+ }
+ }
+
+ // Return this chunk directly to avoid copying data.
+ if (aligned) {
+ *aBlock = *ci;
+ return;
+ }
+ }
+ }
+
+ aBlock->AllocateChannels(aFallbackChannelCount);
+
+ uint32_t duration = 0;
+ for (AudioSegment::ChunkIterator ci(*aSegment); !ci.IsEnded(); ci.Next()) {
+ switch (ci->mBufferFormat) {
+ case AUDIO_FORMAT_S16: {
+ CopyChunkToBlock<int16_t>(*ci, aBlock, duration);
+ break;
+ }
+ case AUDIO_FORMAT_FLOAT32: {
+ CopyChunkToBlock<float>(*ci, aBlock, duration);
+ break;
+ }
+ case AUDIO_FORMAT_SILENCE: {
+ // The actual type of the sample does not matter here, but we still need
+ // to send some audio to the graph.
+ CopyChunkToBlock<float>(*ci, aBlock, duration);
+ break;
+ }
+ }
+ duration += ci->GetDuration();
+ }
+}
+
+void
+AudioNodeExternalInputStream::ProcessInput(GraphTime aFrom, GraphTime aTo,
+ uint32_t aFlags)
+{
+ // According to spec, number of outputs is always 1.
+ MOZ_ASSERT(mLastChunks.Length() == 1);
+
+ // GC stuff can result in our input stream being destroyed before this stream.
+ // Handle that.
+ if (!IsEnabled() || mInputs.IsEmpty() || mPassThrough) {
+ mLastChunks[0].SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ MOZ_ASSERT(mInputs.Length() == 1);
+
+ MediaStream* source = mInputs[0]->GetSource();
+ AutoTArray<AudioSegment,1> audioSegments;
+ uint32_t inputChannels = 0;
+ for (StreamTracks::TrackIter tracks(source->mTracks);
+ !tracks.IsEnded(); tracks.Next()) {
+ const StreamTracks::Track& inputTrack = *tracks;
+ if (!mInputs[0]->PassTrackThrough(tracks->GetID())) {
+ continue;
+ }
+
+ if (inputTrack.GetSegment()->GetType() == MediaSegment::VIDEO) {
+ MOZ_ASSERT(false, "AudioNodeExternalInputStream shouldn't have video tracks");
+ continue;
+ }
+
+ const AudioSegment& inputSegment =
+ *static_cast<AudioSegment*>(inputTrack.GetSegment());
+ if (inputSegment.IsNull()) {
+ continue;
+ }
+
+ AudioSegment& segment = *audioSegments.AppendElement();
+ GraphTime next;
+ for (GraphTime t = aFrom; t < aTo; t = next) {
+ MediaInputPort::InputInterval interval = mInputs[0]->GetNextInputInterval(t);
+ interval.mEnd = std::min(interval.mEnd, aTo);
+ if (interval.mStart >= interval.mEnd)
+ break;
+ next = interval.mEnd;
+
+ // We know this stream does not block during the processing interval ---
+ // we're not finished, we don't underrun, and we're not suspended.
+ StreamTime outputStart = GraphTimeToStreamTime(interval.mStart);
+ StreamTime outputEnd = GraphTimeToStreamTime(interval.mEnd);
+ StreamTime ticks = outputEnd - outputStart;
+
+ if (interval.mInputIsBlocked) {
+ segment.AppendNullData(ticks);
+ } else {
+ // The input stream is not blocked in this interval, so no need to call
+ // GraphTimeToStreamTimeWithBlocking.
+ StreamTime inputStart =
+ std::min(inputSegment.GetDuration(),
+ source->GraphTimeToStreamTime(interval.mStart));
+ StreamTime inputEnd =
+ std::min(inputSegment.GetDuration(),
+ source->GraphTimeToStreamTime(interval.mEnd));
+
+ segment.AppendSlice(inputSegment, inputStart, inputEnd);
+ // Pad if we're looking past the end of the track
+ segment.AppendNullData(ticks - (inputEnd - inputStart));
+ }
+ }
+
+ for (AudioSegment::ChunkIterator iter(segment); !iter.IsEnded(); iter.Next()) {
+ inputChannels = GetAudioChannelsSuperset(inputChannels, iter->ChannelCount());
+ }
+ }
+
+ uint32_t accumulateIndex = 0;
+ if (inputChannels) {
+ DownmixBufferType downmixBuffer;
+ ASSERT_ALIGNED16(downmixBuffer.Elements());
+ for (uint32_t i = 0; i < audioSegments.Length(); ++i) {
+ AudioBlock tmpChunk;
+ ConvertSegmentToAudioBlock(&audioSegments[i], &tmpChunk, inputChannels);
+ if (!tmpChunk.IsNull()) {
+ if (accumulateIndex == 0) {
+ mLastChunks[0].AllocateChannels(inputChannels);
+ }
+ AccumulateInputChunk(accumulateIndex, tmpChunk, &mLastChunks[0], &downmixBuffer);
+ accumulateIndex++;
+ }
+ }
+ }
+ if (accumulateIndex == 0) {
+ mLastChunks[0].SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+}
+
+bool
+AudioNodeExternalInputStream::IsEnabled()
+{
+ return ((MediaStreamAudioSourceNodeEngine*)Engine())->IsEnabled();
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioNodeExternalInputStream.h b/dom/media/webaudio/AudioNodeExternalInputStream.h
new file mode 100644
index 000000000..83d2bba74
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeExternalInputStream.h
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUDIONODEEXTERNALINPUTSTREAM_H_
+#define MOZILLA_AUDIONODEEXTERNALINPUTSTREAM_H_
+
+#include "MediaStreamGraph.h"
+#include "AudioNodeStream.h"
+#include "mozilla/Atomics.h"
+
+namespace mozilla {
+
+/**
+ * This is a MediaStream implementation that acts for a Web Audio node but
+ * unlike other AudioNodeStreams, supports any kind of MediaStream as an
+ * input --- handling any number of audio tracks and handling blocking of
+ * the input MediaStream.
+ */
+class AudioNodeExternalInputStream final : public AudioNodeStream
+{
+public:
+ static already_AddRefed<AudioNodeExternalInputStream>
+ Create(MediaStreamGraph* aGraph, AudioNodeEngine* aEngine);
+
+protected:
+ AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate);
+ ~AudioNodeExternalInputStream();
+
+public:
+ void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) override;
+
+private:
+ /**
+ * Determines if this is enabled or not. Disabled nodes produce silence.
+ * This node becomes disabled if the document principal does not subsume the
+ * DOMMediaStream principal.
+ */
+ bool IsEnabled();
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_AUDIONODESTREAM_H_ */
diff --git a/dom/media/webaudio/AudioNodeStream.cpp b/dom/media/webaudio/AudioNodeStream.cpp
new file mode 100644
index 000000000..0e5aa3fc7
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeStream.cpp
@@ -0,0 +1,783 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioNodeStream.h"
+
+#include "MediaStreamGraphImpl.h"
+#include "MediaStreamListener.h"
+#include "AudioNodeEngine.h"
+#include "ThreeDPoint.h"
+#include "AudioChannelFormat.h"
+#include "AudioParamTimeline.h"
+#include "AudioContext.h"
+#include "nsMathUtils.h"
+
+using namespace mozilla::dom;
+
+namespace mozilla {
+
+/**
+ * An AudioNodeStream produces a single audio track with ID
+ * AUDIO_TRACK. This track has rate AudioContext::sIdealAudioRate
+ * for regular audio contexts, and the rate requested by the web content
+ * for offline audio contexts.
+ * Each chunk in the track is a single block of WEBAUDIO_BLOCK_SIZE samples.
+ * Note: This must be a different value than MEDIA_STREAM_DEST_TRACK_ID
+ */
+
+AudioNodeStream::AudioNodeStream(AudioNodeEngine* aEngine,
+ Flags aFlags,
+ TrackRate aSampleRate)
+ : ProcessedMediaStream(),
+ mEngine(aEngine),
+ mSampleRate(aSampleRate),
+ mFlags(aFlags),
+ mNumberOfInputChannels(2),
+ mIsActive(aEngine->IsActive()),
+ mMarkAsFinishedAfterThisBlock(false),
+ mAudioParamStream(false),
+ mPassThrough(false)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ mSuspendedCount = !(mIsActive || mFlags & EXTERNAL_OUTPUT);
+ mChannelCountMode = ChannelCountMode::Max;
+ mChannelInterpretation = ChannelInterpretation::Speakers;
+ // AudioNodes are always producing data
+ mHasCurrentData = true;
+ mLastChunks.SetLength(std::max(uint16_t(1), mEngine->OutputCount()));
+ MOZ_COUNT_CTOR(AudioNodeStream);
+}
+
+AudioNodeStream::~AudioNodeStream()
+{
+ MOZ_ASSERT(mActiveInputCount == 0);
+ MOZ_COUNT_DTOR(AudioNodeStream);
+}
+
+void
+AudioNodeStream::DestroyImpl()
+{
+ // These are graph thread objects, so clean up on graph thread.
+ mInputChunks.Clear();
+ mLastChunks.Clear();
+
+ ProcessedMediaStream::DestroyImpl();
+}
+
+/* static */ already_AddRefed<AudioNodeStream>
+AudioNodeStream::Create(AudioContext* aCtx, AudioNodeEngine* aEngine,
+ Flags aFlags, MediaStreamGraph* aGraph)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_RELEASE_ASSERT(aGraph);
+
+ // MediaRecorders use an AudioNodeStream, but no AudioNode
+ AudioNode* node = aEngine->NodeMainThread();
+
+ RefPtr<AudioNodeStream> stream =
+ new AudioNodeStream(aEngine, aFlags, aGraph->GraphRate());
+ stream->mSuspendedCount += aCtx->ShouldSuspendNewStream();
+ if (node) {
+ stream->SetChannelMixingParametersImpl(node->ChannelCount(),
+ node->ChannelCountModeValue(),
+ node->ChannelInterpretationValue());
+ }
+ aGraph->AddStream(stream);
+ return stream.forget();
+}
+
+size_t
+AudioNodeStream::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+
+ // Not reported:
+ // - mEngine
+
+ amount += ProcessedMediaStream::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mLastChunks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mLastChunks.Length(); i++) {
+ // NB: This is currently unshared only as there are instances of
+ // double reporting in DMD otherwise.
+ amount += mLastChunks[i].SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+size_t
+AudioNodeStream::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+AudioNodeStream::SizeOfAudioNodesIncludingThis(MallocSizeOf aMallocSizeOf,
+ AudioNodeSizes& aUsage) const
+{
+ // Explicitly separate out the stream memory.
+ aUsage.mStream = SizeOfIncludingThis(aMallocSizeOf);
+
+ if (mEngine) {
+ // This will fill out the rest of |aUsage|.
+ mEngine->SizeOfIncludingThis(aMallocSizeOf, aUsage);
+ }
+}
+
+void
+AudioNodeStream::SetStreamTimeParameter(uint32_t aIndex, AudioContext* aContext,
+ double aStreamTime)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream, uint32_t aIndex, MediaStream* aRelativeToStream,
+ double aStreamTime)
+ : ControlMessage(aStream), mStreamTime(aStreamTime),
+ mRelativeToStream(aRelativeToStream), mIndex(aIndex)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->
+ SetStreamTimeParameterImpl(mIndex, mRelativeToStream, mStreamTime);
+ }
+ double mStreamTime;
+ MediaStream* mRelativeToStream;
+ uint32_t mIndex;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aIndex,
+ aContext->DestinationStream(),
+ aStreamTime));
+}
+
+void
+AudioNodeStream::SetStreamTimeParameterImpl(uint32_t aIndex, MediaStream* aRelativeToStream,
+ double aStreamTime)
+{
+ StreamTime ticks = aRelativeToStream->SecondsToNearestStreamTime(aStreamTime);
+ mEngine->SetStreamTimeParameter(aIndex, ticks);
+}
+
+void
+AudioNodeStream::SetDoubleParameter(uint32_t aIndex, double aValue)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream, uint32_t aIndex, double aValue)
+ : ControlMessage(aStream), mValue(aValue), mIndex(aIndex)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->Engine()->
+ SetDoubleParameter(mIndex, mValue);
+ }
+ double mValue;
+ uint32_t mIndex;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aIndex, aValue));
+}
+
+void
+AudioNodeStream::SetInt32Parameter(uint32_t aIndex, int32_t aValue)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream, uint32_t aIndex, int32_t aValue)
+ : ControlMessage(aStream), mValue(aValue), mIndex(aIndex)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->Engine()->
+ SetInt32Parameter(mIndex, mValue);
+ }
+ int32_t mValue;
+ uint32_t mIndex;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aIndex, aValue));
+}
+
+void
+AudioNodeStream::SendTimelineEvent(uint32_t aIndex,
+ const AudioTimelineEvent& aEvent)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream, uint32_t aIndex,
+ const AudioTimelineEvent& aEvent)
+ : ControlMessage(aStream),
+ mEvent(aEvent),
+ mSampleRate(aStream->SampleRate()),
+ mIndex(aIndex)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->Engine()->
+ RecvTimelineEvent(mIndex, mEvent);
+ }
+ AudioTimelineEvent mEvent;
+ TrackRate mSampleRate;
+ uint32_t mIndex;
+ };
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aIndex, aEvent));
+}
+
+void
+AudioNodeStream::SetThreeDPointParameter(uint32_t aIndex, const ThreeDPoint& aValue)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream, uint32_t aIndex, const ThreeDPoint& aValue)
+ : ControlMessage(aStream), mValue(aValue), mIndex(aIndex)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->Engine()->
+ SetThreeDPointParameter(mIndex, mValue);
+ }
+ ThreeDPoint mValue;
+ uint32_t mIndex;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aIndex, aValue));
+}
+
+void
+AudioNodeStream::SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList>&& aBuffer)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream,
+ already_AddRefed<ThreadSharedFloatArrayBufferList>& aBuffer)
+ : ControlMessage(aStream), mBuffer(aBuffer)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->Engine()->
+ SetBuffer(mBuffer.forget());
+ }
+ RefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aBuffer));
+}
+
+void
+AudioNodeStream::SetRawArrayData(nsTArray<float>& aData)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream,
+ nsTArray<float>& aData)
+ : ControlMessage(aStream)
+ {
+ mData.SwapElements(aData);
+ }
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->Engine()->SetRawArrayData(mData);
+ }
+ nsTArray<float> mData;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aData));
+}
+
+void
+AudioNodeStream::SetChannelMixingParameters(uint32_t aNumberOfChannels,
+ ChannelCountMode aChannelCountMode,
+ ChannelInterpretation aChannelInterpretation)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream,
+ uint32_t aNumberOfChannels,
+ ChannelCountMode aChannelCountMode,
+ ChannelInterpretation aChannelInterpretation)
+ : ControlMessage(aStream),
+ mNumberOfChannels(aNumberOfChannels),
+ mChannelCountMode(aChannelCountMode),
+ mChannelInterpretation(aChannelInterpretation)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->
+ SetChannelMixingParametersImpl(mNumberOfChannels, mChannelCountMode,
+ mChannelInterpretation);
+ }
+ uint32_t mNumberOfChannels;
+ ChannelCountMode mChannelCountMode;
+ ChannelInterpretation mChannelInterpretation;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aNumberOfChannels,
+ aChannelCountMode,
+ aChannelInterpretation));
+}
+
+void
+AudioNodeStream::SetPassThrough(bool aPassThrough)
+{
+ class Message final : public ControlMessage
+ {
+ public:
+ Message(AudioNodeStream* aStream, bool aPassThrough)
+ : ControlMessage(aStream), mPassThrough(aPassThrough)
+ {}
+ void Run() override
+ {
+ static_cast<AudioNodeStream*>(mStream)->mPassThrough = mPassThrough;
+ }
+ bool mPassThrough;
+ };
+
+ GraphImpl()->AppendMessage(MakeUnique<Message>(this, aPassThrough));
+}
+
+void
+AudioNodeStream::SetChannelMixingParametersImpl(uint32_t aNumberOfChannels,
+ ChannelCountMode aChannelCountMode,
+ ChannelInterpretation aChannelInterpretation)
+{
+ // Make sure that we're not clobbering any significant bits by fitting these
+ // values in 16 bits.
+ MOZ_ASSERT(int(aChannelCountMode) < INT16_MAX);
+ MOZ_ASSERT(int(aChannelInterpretation) < INT16_MAX);
+
+ mNumberOfInputChannels = aNumberOfChannels;
+ mChannelCountMode = aChannelCountMode;
+ mChannelInterpretation = aChannelInterpretation;
+}
+
+uint32_t
+AudioNodeStream::ComputedNumberOfChannels(uint32_t aInputChannelCount)
+{
+ switch (mChannelCountMode) {
+ case ChannelCountMode::Explicit:
+ // Disregard the channel count we've calculated from inputs, and just use
+ // mNumberOfInputChannels.
+ return mNumberOfInputChannels;
+ case ChannelCountMode::Clamped_max:
+ // Clamp the computed output channel count to mNumberOfInputChannels.
+ return std::min(aInputChannelCount, mNumberOfInputChannels);
+ default:
+ case ChannelCountMode::Max:
+ // Nothing to do here, just shut up the compiler warning.
+ return aInputChannelCount;
+ }
+}
+
+class AudioNodeStream::AdvanceAndResumeMessage final : public ControlMessage {
+public:
+ AdvanceAndResumeMessage(AudioNodeStream* aStream, StreamTime aAdvance) :
+ ControlMessage(aStream), mAdvance(aAdvance) {}
+ void Run() override
+ {
+ auto ns = static_cast<AudioNodeStream*>(mStream);
+ ns->mTracksStartTime -= mAdvance;
+
+ StreamTracks::Track* track = ns->EnsureTrack(AUDIO_TRACK);
+ track->Get<AudioSegment>()->AppendNullData(mAdvance);
+
+ ns->GraphImpl()->DecrementSuspendCount(mStream);
+ }
+private:
+ StreamTime mAdvance;
+};
+
+void
+AudioNodeStream::AdvanceAndResume(StreamTime aAdvance)
+{
+ mMainThreadCurrentTime += aAdvance;
+ GraphImpl()->AppendMessage(MakeUnique<AdvanceAndResumeMessage>(this, aAdvance));
+}
+
+void
+AudioNodeStream::ObtainInputBlock(AudioBlock& aTmpChunk,
+ uint32_t aPortIndex)
+{
+ uint32_t inputCount = mInputs.Length();
+ uint32_t outputChannelCount = 1;
+ AutoTArray<const AudioBlock*,250> inputChunks;
+ for (uint32_t i = 0; i < inputCount; ++i) {
+ if (aPortIndex != mInputs[i]->InputNumber()) {
+ // This input is connected to a different port
+ continue;
+ }
+ MediaStream* s = mInputs[i]->GetSource();
+ AudioNodeStream* a = static_cast<AudioNodeStream*>(s);
+ MOZ_ASSERT(a == s->AsAudioNodeStream());
+ if (a->IsAudioParamStream()) {
+ continue;
+ }
+
+ const AudioBlock* chunk = &a->mLastChunks[mInputs[i]->OutputNumber()];
+ MOZ_ASSERT(chunk);
+ if (chunk->IsNull() || chunk->mChannelData.IsEmpty()) {
+ continue;
+ }
+
+ inputChunks.AppendElement(chunk);
+ outputChannelCount =
+ GetAudioChannelsSuperset(outputChannelCount, chunk->ChannelCount());
+ }
+
+ outputChannelCount = ComputedNumberOfChannels(outputChannelCount);
+
+ uint32_t inputChunkCount = inputChunks.Length();
+ if (inputChunkCount == 0 ||
+ (inputChunkCount == 1 && inputChunks[0]->ChannelCount() == 0)) {
+ aTmpChunk.SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ if (inputChunkCount == 1 &&
+ inputChunks[0]->ChannelCount() == outputChannelCount) {
+ aTmpChunk = *inputChunks[0];
+ return;
+ }
+
+ if (outputChannelCount == 0) {
+ aTmpChunk.SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ aTmpChunk.AllocateChannels(outputChannelCount);
+ DownmixBufferType downmixBuffer;
+ ASSERT_ALIGNED16(downmixBuffer.Elements());
+
+ for (uint32_t i = 0; i < inputChunkCount; ++i) {
+ AccumulateInputChunk(i, *inputChunks[i], &aTmpChunk, &downmixBuffer);
+ }
+}
+
+void
+AudioNodeStream::AccumulateInputChunk(uint32_t aInputIndex,
+ const AudioBlock& aChunk,
+ AudioBlock* aBlock,
+ DownmixBufferType* aDownmixBuffer)
+{
+ AutoTArray<const float*,GUESS_AUDIO_CHANNELS> channels;
+ UpMixDownMixChunk(&aChunk, aBlock->ChannelCount(), channels, *aDownmixBuffer);
+
+ for (uint32_t c = 0; c < channels.Length(); ++c) {
+ const float* inputData = static_cast<const float*>(channels[c]);
+ float* outputData = aBlock->ChannelFloatsForWrite(c);
+ if (inputData) {
+ if (aInputIndex == 0) {
+ AudioBlockCopyChannelWithScale(inputData, aChunk.mVolume, outputData);
+ } else {
+ AudioBlockAddChannelWithScale(inputData, aChunk.mVolume, outputData);
+ }
+ } else {
+ if (aInputIndex == 0) {
+ PodZero(outputData, WEBAUDIO_BLOCK_SIZE);
+ }
+ }
+ }
+}
+
+void
+AudioNodeStream::UpMixDownMixChunk(const AudioBlock* aChunk,
+ uint32_t aOutputChannelCount,
+ nsTArray<const float*>& aOutputChannels,
+ DownmixBufferType& aDownmixBuffer)
+{
+ for (uint32_t i = 0; i < aChunk->ChannelCount(); i++) {
+ aOutputChannels.AppendElement(static_cast<const float*>(aChunk->mChannelData[i]));
+ }
+ if (aOutputChannels.Length() < aOutputChannelCount) {
+ if (mChannelInterpretation == ChannelInterpretation::Speakers) {
+ AudioChannelsUpMix<float>(&aOutputChannels, aOutputChannelCount, nullptr);
+ NS_ASSERTION(aOutputChannelCount == aOutputChannels.Length(),
+ "We called GetAudioChannelsSuperset to avoid this");
+ } else {
+ // Fill up the remaining aOutputChannels by zeros
+ for (uint32_t j = aOutputChannels.Length(); j < aOutputChannelCount; ++j) {
+ aOutputChannels.AppendElement(nullptr);
+ }
+ }
+ } else if (aOutputChannels.Length() > aOutputChannelCount) {
+ if (mChannelInterpretation == ChannelInterpretation::Speakers) {
+ AutoTArray<float*,GUESS_AUDIO_CHANNELS> outputChannels;
+ outputChannels.SetLength(aOutputChannelCount);
+ aDownmixBuffer.SetLength(aOutputChannelCount * WEBAUDIO_BLOCK_SIZE);
+ for (uint32_t j = 0; j < aOutputChannelCount; ++j) {
+ outputChannels[j] = &aDownmixBuffer[j * WEBAUDIO_BLOCK_SIZE];
+ }
+
+ AudioChannelsDownMix(aOutputChannels, outputChannels.Elements(),
+ aOutputChannelCount, WEBAUDIO_BLOCK_SIZE);
+
+ aOutputChannels.SetLength(aOutputChannelCount);
+ for (uint32_t j = 0; j < aOutputChannels.Length(); ++j) {
+ aOutputChannels[j] = outputChannels[j];
+ }
+ } else {
+ // Drop the remaining aOutputChannels
+ aOutputChannels.RemoveElementsAt(aOutputChannelCount,
+ aOutputChannels.Length() - aOutputChannelCount);
+ }
+ }
+}
+
+// The MediaStreamGraph guarantees that this is actually one block, for
+// AudioNodeStreams.
+void
+AudioNodeStream::ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags)
+{
+ uint16_t outputCount = mLastChunks.Length();
+ MOZ_ASSERT(outputCount == std::max(uint16_t(1), mEngine->OutputCount()));
+
+ if (!mIsActive) {
+ // mLastChunks are already null.
+#ifdef DEBUG
+ for (const auto& chunk : mLastChunks) {
+ MOZ_ASSERT(chunk.IsNull());
+ }
+#endif
+ } else if (InMutedCycle()) {
+ mInputChunks.Clear();
+ for (uint16_t i = 0; i < outputCount; ++i) {
+ mLastChunks[i].SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+ } else {
+ // We need to generate at least one input
+ uint16_t maxInputs = std::max(uint16_t(1), mEngine->InputCount());
+ mInputChunks.SetLength(maxInputs);
+ for (uint16_t i = 0; i < maxInputs; ++i) {
+ ObtainInputBlock(mInputChunks[i], i);
+ }
+ bool finished = false;
+ if (mPassThrough) {
+ MOZ_ASSERT(outputCount == 1, "For now, we only support nodes that have one output port");
+ mLastChunks[0] = mInputChunks[0];
+ } else {
+ if (maxInputs <= 1 && outputCount <= 1) {
+ mEngine->ProcessBlock(this, aFrom,
+ mInputChunks[0], &mLastChunks[0], &finished);
+ } else {
+ mEngine->ProcessBlocksOnPorts(this, mInputChunks, mLastChunks, &finished);
+ }
+ }
+ for (uint16_t i = 0; i < outputCount; ++i) {
+ NS_ASSERTION(mLastChunks[i].GetDuration() == WEBAUDIO_BLOCK_SIZE,
+ "Invalid WebAudio chunk size");
+ }
+ if (finished) {
+ mMarkAsFinishedAfterThisBlock = true;
+ if (mIsActive) {
+ ScheduleCheckForInactive();
+ }
+ }
+
+ if (GetDisabledTrackMode(static_cast<TrackID>(AUDIO_TRACK)) != DisabledTrackMode::ENABLED) {
+ for (uint32_t i = 0; i < outputCount; ++i) {
+ mLastChunks[i].SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+ }
+ }
+
+ if (!mFinished) {
+ // Don't output anything while finished
+ if (mFlags & EXTERNAL_OUTPUT) {
+ AdvanceOutputSegment();
+ }
+ if (mMarkAsFinishedAfterThisBlock && (aFlags & ALLOW_FINISH)) {
+ // This stream was finished the last time that we looked at it, and all
+ // of the depending streams have finished their output as well, so now
+ // it's time to mark this stream as finished.
+ if (mFlags & EXTERNAL_OUTPUT) {
+ FinishOutput();
+ }
+ FinishOnGraphThread();
+ }
+ }
+}
+
+void
+AudioNodeStream::ProduceOutputBeforeInput(GraphTime aFrom)
+{
+ MOZ_ASSERT(mEngine->AsDelayNodeEngine());
+ MOZ_ASSERT(mEngine->OutputCount() == 1,
+ "DelayNodeEngine output count should be 1");
+ MOZ_ASSERT(!InMutedCycle(), "DelayNodes should break cycles");
+ MOZ_ASSERT(mLastChunks.Length() == 1);
+
+ if (!mIsActive) {
+ mLastChunks[0].SetNull(WEBAUDIO_BLOCK_SIZE);
+ } else {
+ mEngine->ProduceBlockBeforeInput(this, aFrom, &mLastChunks[0]);
+ NS_ASSERTION(mLastChunks[0].GetDuration() == WEBAUDIO_BLOCK_SIZE,
+ "Invalid WebAudio chunk size");
+ if (GetDisabledTrackMode(static_cast<TrackID>(AUDIO_TRACK)) != DisabledTrackMode::ENABLED) {
+ mLastChunks[0].SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+ }
+}
+
+void
+AudioNodeStream::AdvanceOutputSegment()
+{
+ StreamTracks::Track* track = EnsureTrack(AUDIO_TRACK);
+ // No more tracks will be coming
+ mTracks.AdvanceKnownTracksTime(STREAM_TIME_MAX);
+
+ AudioSegment* segment = track->Get<AudioSegment>();
+
+ if (!mLastChunks[0].IsNull()) {
+ segment->AppendAndConsumeChunk(mLastChunks[0].AsMutableChunk());
+ } else {
+ segment->AppendNullData(mLastChunks[0].GetDuration());
+ }
+
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ AudioChunk copyChunk = mLastChunks[0].AsAudioChunk();
+ AudioSegment tmpSegment;
+ tmpSegment.AppendAndConsumeChunk(&copyChunk);
+ l->NotifyQueuedTrackChanges(Graph(), AUDIO_TRACK,
+ segment->GetDuration(), TrackEventCommand::TRACK_EVENT_NONE, tmpSegment);
+ }
+}
+
+void
+AudioNodeStream::FinishOutput()
+{
+ StreamTracks::Track* track = EnsureTrack(AUDIO_TRACK);
+ track->SetEnded();
+
+ for (uint32_t j = 0; j < mListeners.Length(); ++j) {
+ MediaStreamListener* l = mListeners[j];
+ AudioSegment emptySegment;
+ l->NotifyQueuedTrackChanges(Graph(), AUDIO_TRACK,
+ track->GetSegment()->GetDuration(),
+ TrackEventCommand::TRACK_EVENT_ENDED, emptySegment);
+ }
+}
+
+void
+AudioNodeStream::AddInput(MediaInputPort* aPort)
+{
+ ProcessedMediaStream::AddInput(aPort);
+ AudioNodeStream* ns = aPort->GetSource()->AsAudioNodeStream();
+ // Streams that are not AudioNodeStreams are considered active.
+ if (!ns || (ns->mIsActive && !ns->IsAudioParamStream())) {
+ IncrementActiveInputCount();
+ }
+}
+void
+AudioNodeStream::RemoveInput(MediaInputPort* aPort)
+{
+ ProcessedMediaStream::RemoveInput(aPort);
+ AudioNodeStream* ns = aPort->GetSource()->AsAudioNodeStream();
+ // Streams that are not AudioNodeStreams are considered active.
+ if (!ns || (ns->mIsActive && !ns->IsAudioParamStream())) {
+ DecrementActiveInputCount();
+ }
+}
+
+void
+AudioNodeStream::SetActive()
+{
+ if (mIsActive || mMarkAsFinishedAfterThisBlock) {
+ return;
+ }
+
+ mIsActive = true;
+ if (!(mFlags & EXTERNAL_OUTPUT)) {
+ GraphImpl()->DecrementSuspendCount(this);
+ }
+ if (IsAudioParamStream()) {
+ // Consumers merely influence stream order.
+ // They do not read from the stream.
+ return;
+ }
+
+ for (const auto& consumer : mConsumers) {
+ AudioNodeStream* ns = consumer->GetDestination()->AsAudioNodeStream();
+ if (ns) {
+ ns->IncrementActiveInputCount();
+ }
+ }
+}
+
+class AudioNodeStream::CheckForInactiveMessage final : public ControlMessage
+{
+public:
+ explicit CheckForInactiveMessage(AudioNodeStream* aStream) :
+ ControlMessage(aStream) {}
+ void Run() override
+ {
+ auto ns = static_cast<AudioNodeStream*>(mStream);
+ ns->CheckForInactive();
+ }
+};
+
+void
+AudioNodeStream::ScheduleCheckForInactive()
+{
+ if (mActiveInputCount > 0 && !mMarkAsFinishedAfterThisBlock) {
+ return;
+ }
+
+ auto message = MakeUnique<CheckForInactiveMessage>(this);
+ GraphImpl()->RunMessageAfterProcessing(Move(message));
+}
+
+void
+AudioNodeStream::CheckForInactive()
+{
+ if (((mActiveInputCount > 0 || mEngine->IsActive()) &&
+ !mMarkAsFinishedAfterThisBlock) ||
+ !mIsActive) {
+ return;
+ }
+
+ mIsActive = false;
+ mInputChunks.Clear(); // not required for foreseeable future
+ for (auto& chunk : mLastChunks) {
+ chunk.SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+ if (!(mFlags & EXTERNAL_OUTPUT)) {
+ GraphImpl()->IncrementSuspendCount(this);
+ }
+ if (IsAudioParamStream()) {
+ return;
+ }
+
+ for (const auto& consumer : mConsumers) {
+ AudioNodeStream* ns = consumer->GetDestination()->AsAudioNodeStream();
+ if (ns) {
+ ns->DecrementActiveInputCount();
+ }
+ }
+}
+
+void
+AudioNodeStream::IncrementActiveInputCount()
+{
+ ++mActiveInputCount;
+ SetActive();
+}
+
+void
+AudioNodeStream::DecrementActiveInputCount()
+{
+ MOZ_ASSERT(mActiveInputCount > 0);
+ --mActiveInputCount;
+ CheckForInactive();
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/AudioNodeStream.h b/dom/media/webaudio/AudioNodeStream.h
new file mode 100644
index 000000000..87f6fa221
--- /dev/null
+++ b/dom/media/webaudio/AudioNodeStream.h
@@ -0,0 +1,239 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUDIONODESTREAM_H_
+#define MOZILLA_AUDIONODESTREAM_H_
+
+#include "MediaStreamGraph.h"
+#include "mozilla/dom/AudioNodeBinding.h"
+#include "nsAutoPtr.h"
+#include "AlignedTArray.h"
+#include "AudioBlock.h"
+#include "AudioSegment.h"
+
+namespace mozilla {
+
+namespace dom {
+struct ThreeDPoint;
+struct AudioTimelineEvent;
+class AudioContext;
+} // namespace dom
+
+class ThreadSharedFloatArrayBufferList;
+class AudioNodeEngine;
+
+typedef AlignedAutoTArray<float, GUESS_AUDIO_CHANNELS*WEBAUDIO_BLOCK_SIZE, 16> DownmixBufferType;
+
+/**
+ * An AudioNodeStream produces one audio track with ID AUDIO_TRACK.
+ * The start time of the AudioTrack is aligned to the start time of the
+ * AudioContext's destination node stream, plus some multiple of BLOCK_SIZE
+ * samples.
+ *
+ * An AudioNodeStream has an AudioNodeEngine plugged into it that does the
+ * actual audio processing. AudioNodeStream contains the glue code that
+ * integrates audio processing with the MediaStreamGraph.
+ */
+class AudioNodeStream : public ProcessedMediaStream
+{
+ typedef dom::ChannelCountMode ChannelCountMode;
+ typedef dom::ChannelInterpretation ChannelInterpretation;
+
+public:
+ typedef mozilla::dom::AudioContext AudioContext;
+
+ enum { AUDIO_TRACK = 1 };
+
+ typedef AutoTArray<AudioBlock, 1> OutputChunks;
+
+ // Flags re main thread updates and stream output.
+ typedef unsigned Flags;
+ enum : Flags {
+ NO_STREAM_FLAGS = 0U,
+ NEED_MAIN_THREAD_FINISHED = 1U << 0,
+ NEED_MAIN_THREAD_CURRENT_TIME = 1U << 1,
+ // Internal AudioNodeStreams can only pass their output to another
+ // AudioNode, whereas external AudioNodeStreams can pass their output
+ // to other ProcessedMediaStreams or hardware audio output.
+ EXTERNAL_OUTPUT = 1U << 2,
+ };
+ /**
+ * Create a stream that will process audio for an AudioNode.
+ * Takes ownership of aEngine.
+ * aGraph is required and equals the graph of aCtx in most cases. An exception
+ * is AudioDestinationNode where the context's graph hasn't been set up yet.
+ */
+ static already_AddRefed<AudioNodeStream>
+ Create(AudioContext* aCtx, AudioNodeEngine* aEngine, Flags aKind,
+ MediaStreamGraph* aGraph);
+
+protected:
+ /**
+ * Transfers ownership of aEngine to the new AudioNodeStream.
+ */
+ AudioNodeStream(AudioNodeEngine* aEngine,
+ Flags aFlags,
+ TrackRate aSampleRate);
+
+ ~AudioNodeStream();
+
+public:
+ // Control API
+ /**
+ * Sets a parameter that's a time relative to some stream's played time.
+ * This time is converted to a time relative to this stream when it's set.
+ */
+ void SetStreamTimeParameter(uint32_t aIndex, AudioContext* aContext,
+ double aStreamTime);
+ void SetDoubleParameter(uint32_t aIndex, double aValue);
+ void SetInt32Parameter(uint32_t aIndex, int32_t aValue);
+ void SetThreeDPointParameter(uint32_t aIndex, const dom::ThreeDPoint& aValue);
+ void SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList>&& aBuffer);
+ // This sends a single event to the timeline on the MSG thread side.
+ void SendTimelineEvent(uint32_t aIndex, const dom::AudioTimelineEvent& aEvent);
+ // This consumes the contents of aData. aData will be emptied after this returns.
+ void SetRawArrayData(nsTArray<float>& aData);
+ void SetChannelMixingParameters(uint32_t aNumberOfChannels,
+ ChannelCountMode aChannelCountMoe,
+ ChannelInterpretation aChannelInterpretation);
+ void SetPassThrough(bool aPassThrough);
+ ChannelInterpretation GetChannelInterpretation()
+ {
+ return mChannelInterpretation;
+ }
+
+ void SetAudioParamHelperStream()
+ {
+ MOZ_ASSERT(!mAudioParamStream, "Can only do this once");
+ mAudioParamStream = true;
+ }
+
+ /*
+ * Resume stream after updating its concept of current time by aAdvance.
+ * Main thread. Used only from AudioDestinationNode when resuming a stream
+ * suspended to save running the MediaStreamGraph when there are no other
+ * nodes in the AudioContext.
+ */
+ void AdvanceAndResume(StreamTime aAdvance);
+
+ AudioNodeStream* AsAudioNodeStream() override { return this; }
+ void AddInput(MediaInputPort* aPort) override;
+ void RemoveInput(MediaInputPort* aPort) override;
+
+ // Graph thread only
+ void SetStreamTimeParameterImpl(uint32_t aIndex, MediaStream* aRelativeToStream,
+ double aStreamTime);
+ void SetChannelMixingParametersImpl(uint32_t aNumberOfChannels,
+ ChannelCountMode aChannelCountMoe,
+ ChannelInterpretation aChannelInterpretation);
+ void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) override;
+ /**
+ * Produce the next block of output, before input is provided.
+ * ProcessInput() will be called later, and it then should not change
+ * the output. This is used only for DelayNodeEngine in a feedback loop.
+ */
+ void ProduceOutputBeforeInput(GraphTime aFrom);
+ bool IsAudioParamStream() const
+ {
+ return mAudioParamStream;
+ }
+
+ const OutputChunks& LastChunks() const
+ {
+ return mLastChunks;
+ }
+ bool MainThreadNeedsUpdates() const override
+ {
+ return ((mFlags & NEED_MAIN_THREAD_FINISHED) && mFinished) ||
+ (mFlags & NEED_MAIN_THREAD_CURRENT_TIME);
+ }
+
+ // Any thread
+ AudioNodeEngine* Engine() { return mEngine; }
+ TrackRate SampleRate() const { return mSampleRate; }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+ void SizeOfAudioNodesIncludingThis(MallocSizeOf aMallocSizeOf,
+ AudioNodeSizes& aUsage) const;
+
+ /*
+ * SetActive() is called when either an active input is added or the engine
+ * for a source node transitions from inactive to active. This is not
+ * called from engines for processing nodes because they only become active
+ * when there are active input streams, in which case this stream is already
+ * active.
+ */
+ void SetActive();
+ /*
+ * ScheduleCheckForInactive() is called during stream processing when the
+ * engine transitions from active to inactive, or the stream finishes. It
+ * schedules a call to CheckForInactive() after stream processing.
+ */
+ void ScheduleCheckForInactive();
+
+protected:
+ class AdvanceAndResumeMessage;
+ class CheckForInactiveMessage;
+
+ void DestroyImpl() override;
+
+ /*
+ * CheckForInactive() is called when the engine transitions from active to
+ * inactive, or an active input is removed, or the stream finishes. If the
+ * stream is now inactive, then mInputChunks will be cleared and mLastChunks
+ * will be set to null. ProcessBlock() will not be called on the engine
+ * again until SetActive() is called.
+ */
+ void CheckForInactive();
+
+ void AdvanceOutputSegment();
+ void FinishOutput();
+ void AccumulateInputChunk(uint32_t aInputIndex, const AudioBlock& aChunk,
+ AudioBlock* aBlock,
+ DownmixBufferType* aDownmixBuffer);
+ void UpMixDownMixChunk(const AudioBlock* aChunk, uint32_t aOutputChannelCount,
+ nsTArray<const float*>& aOutputChannels,
+ DownmixBufferType& aDownmixBuffer);
+
+ uint32_t ComputedNumberOfChannels(uint32_t aInputChannelCount);
+ void ObtainInputBlock(AudioBlock& aTmpChunk, uint32_t aPortIndex);
+ void IncrementActiveInputCount();
+ void DecrementActiveInputCount();
+
+ // The engine that will generate output for this node.
+ nsAutoPtr<AudioNodeEngine> mEngine;
+ // The mixed input blocks are kept from iteration to iteration to avoid
+ // reallocating channel data arrays and any buffers for mixing.
+ OutputChunks mInputChunks;
+ // The last block produced by this node.
+ OutputChunks mLastChunks;
+ // The stream's sampling rate
+ const TrackRate mSampleRate;
+ // Whether this is an internal or external stream
+ const Flags mFlags;
+ // The number of input streams that may provide non-silent input.
+ uint32_t mActiveInputCount = 0;
+ // The number of input channels that this stream requires. 0 means don't care.
+ uint32_t mNumberOfInputChannels;
+ // The mixing modes
+ ChannelCountMode mChannelCountMode;
+ ChannelInterpretation mChannelInterpretation;
+ // Streams are considered active if the stream has not finished and either
+ // the engine is active or there are active input streams.
+ bool mIsActive;
+ // Whether the stream should be marked as finished as soon
+ // as the current time range has been computed block by block.
+ bool mMarkAsFinishedAfterThisBlock;
+ // Whether the stream is an AudioParamHelper stream.
+ bool mAudioParamStream;
+ // Whether the stream just passes its input through.
+ bool mPassThrough;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_AUDIONODESTREAM_H_ */
diff --git a/dom/media/webaudio/AudioParam.cpp b/dom/media/webaudio/AudioParam.cpp
new file mode 100644
index 000000000..6f5574993
--- /dev/null
+++ b/dom/media/webaudio/AudioParam.cpp
@@ -0,0 +1,199 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioParam.h"
+#include "mozilla/dom/AudioParamBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioContext.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(AudioParam)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioParam)
+ tmp->DisconnectFromGraphAndDestroyStream();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mNode)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(AudioParam)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNode)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(AudioParam)
+
+NS_IMPL_CYCLE_COLLECTING_NATIVE_ADDREF(AudioParam)
+NS_IMPL_CYCLE_COLLECTING_NATIVE_RELEASE(AudioParam)
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AudioParam, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AudioParam, Release)
+
+AudioParam::AudioParam(AudioNode* aNode,
+ uint32_t aIndex,
+ float aDefaultValue,
+ const char* aName)
+ : AudioParamTimeline(aDefaultValue)
+ , mNode(aNode)
+ , mName(aName)
+ , mIndex(aIndex)
+ , mDefaultValue(aDefaultValue)
+{
+}
+
+AudioParam::~AudioParam()
+{
+ DisconnectFromGraphAndDestroyStream();
+}
+
+JSObject*
+AudioParam::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioParamBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+AudioParam::DisconnectFromGraphAndDestroyStream()
+{
+ MOZ_ASSERT(mRefCnt.get() > mInputNodes.Length(),
+ "Caller should be holding a reference or have called "
+ "mRefCnt.stabilizeForDeletion()");
+
+ while (!mInputNodes.IsEmpty()) {
+ uint32_t i = mInputNodes.Length() - 1;
+ RefPtr<AudioNode> input = mInputNodes[i].mInputNode;
+ mInputNodes.RemoveElementAt(i);
+ input->RemoveOutputParam(this);
+ }
+
+ if (mNodeStreamPort) {
+ mNodeStreamPort->Destroy();
+ mNodeStreamPort = nullptr;
+ }
+
+ if (mStream) {
+ mStream->Destroy();
+ mStream = nullptr;
+ }
+}
+
+MediaStream*
+AudioParam::Stream()
+{
+ if (mStream) {
+ return mStream;
+ }
+
+ AudioNodeEngine* engine = new AudioNodeEngine(nullptr);
+ RefPtr<AudioNodeStream> stream =
+ AudioNodeStream::Create(mNode->Context(), engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ mNode->Context()->Graph());
+
+ // Force the input to have only one channel, and make it down-mix using
+ // the speaker rules if needed.
+ stream->SetChannelMixingParametersImpl(1, ChannelCountMode::Explicit, ChannelInterpretation::Speakers);
+ // Mark as an AudioParam helper stream
+ stream->SetAudioParamHelperStream();
+
+ mStream = stream.forget();
+
+ // Setup the AudioParam's stream as an input to the owner AudioNode's stream
+ AudioNodeStream* nodeStream = mNode->GetStream();
+ if (nodeStream) {
+ mNodeStreamPort =
+ nodeStream->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK);
+ }
+
+ // Send the stream to the timeline on the MSG side.
+ AudioTimelineEvent event(mStream);
+ SendEventToEngine(event);
+
+ return mStream;
+}
+
+static const char*
+ToString(AudioTimelineEvent::Type aType)
+{
+ switch (aType) {
+ case AudioTimelineEvent::SetValue:
+ return "SetValue";
+ case AudioTimelineEvent::SetValueAtTime:
+ return "SetValueAtTime";
+ case AudioTimelineEvent::LinearRamp:
+ return "LinearRamp";
+ case AudioTimelineEvent::ExponentialRamp:
+ return "ExponentialRamp";
+ case AudioTimelineEvent::SetTarget:
+ return "SetTarget";
+ case AudioTimelineEvent::SetValueCurve:
+ return "SetValueCurve";
+ case AudioTimelineEvent::Stream:
+ return "Stream";
+ case AudioTimelineEvent::Cancel:
+ return "Cancel";
+ default:
+ return "unknown AudioTimelineEvent";
+ }
+}
+
+void
+AudioParam::SendEventToEngine(const AudioTimelineEvent& aEvent)
+{
+ WEB_AUDIO_API_LOG("%f: %s for %u %s %s=%g time=%f %s=%g",
+ GetParentObject()->CurrentTime(),
+ mName, ParentNodeId(), ToString(aEvent.mType),
+ aEvent.mType == AudioTimelineEvent::SetValueCurve ?
+ "length" : "value",
+ aEvent.mType == AudioTimelineEvent::SetValueCurve ?
+ static_cast<double>(aEvent.mCurveLength) :
+ static_cast<double>(aEvent.mValue),
+ aEvent.Time<double>(),
+ aEvent.mType == AudioTimelineEvent::SetValueCurve ?
+ "duration" : "constant",
+ aEvent.mType == AudioTimelineEvent::SetValueCurve ?
+ aEvent.mDuration : aEvent.mTimeConstant);
+
+ AudioNodeStream* stream = mNode->GetStream();
+ if (stream) {
+ stream->SendTimelineEvent(mIndex, aEvent);
+ }
+}
+
+void
+AudioParam::CleanupOldEvents()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ double currentTime = mNode->Context()->CurrentTime();
+
+ CleanupEventsOlderThan(currentTime);
+}
+
+float
+AudioParamTimeline::AudioNodeInputValue(size_t aCounter) const
+{
+ MOZ_ASSERT(mStream);
+
+ // If we have a chunk produced by the AudioNode inputs to the AudioParam,
+ // get its value now. We use aCounter to tell us which frame of the last
+ // AudioChunk to look at.
+ float audioNodeInputValue = 0.0f;
+ const AudioBlock& lastAudioNodeChunk =
+ static_cast<AudioNodeStream*>(mStream.get())->LastChunks()[0];
+ if (!lastAudioNodeChunk.IsNull()) {
+ MOZ_ASSERT(lastAudioNodeChunk.GetDuration() == WEBAUDIO_BLOCK_SIZE);
+ audioNodeInputValue =
+ static_cast<const float*>(lastAudioNodeChunk.mChannelData[0])[aCounter];
+ audioNodeInputValue *= lastAudioNodeChunk.mVolume;
+ }
+
+ return audioNodeInputValue;
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/AudioParam.h b/dom/media/webaudio/AudioParam.h
new file mode 100644
index 000000000..90686cb89
--- /dev/null
+++ b/dom/media/webaudio/AudioParam.h
@@ -0,0 +1,246 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioParam_h_
+#define AudioParam_h_
+
+#include "AudioParamTimeline.h"
+#include "nsWrapperCache.h"
+#include "nsCycleCollectionParticipant.h"
+#include "AudioNode.h"
+#include "mozilla/dom/TypedArray.h"
+#include "WebAudioUtils.h"
+#include "js/TypeDecls.h"
+
+namespace mozilla {
+
+namespace dom {
+
+class AudioParam final : public nsWrapperCache,
+ public AudioParamTimeline
+{
+ virtual ~AudioParam();
+
+public:
+ AudioParam(AudioNode* aNode,
+ uint32_t aIndex,
+ float aDefaultValue,
+ const char* aName);
+
+ NS_IMETHOD_(MozExternalRefCountType) AddRef(void);
+ NS_IMETHOD_(MozExternalRefCountType) Release(void);
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioParam)
+
+ AudioContext* GetParentObject() const
+ {
+ return mNode->Context();
+ }
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // We override SetValueCurveAtTime to convert the Float32Array to the wrapper
+ // object.
+ AudioParam* SetValueCurveAtTime(const Float32Array& aValues,
+ double aStartTime,
+ double aDuration,
+ ErrorResult& aRv)
+ {
+ if (!WebAudioUtils::IsTimeValid(aStartTime)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return this;
+ }
+ aValues.ComputeLengthAndData();
+
+ EventInsertionHelper(aRv, AudioTimelineEvent::SetValueCurve,
+ aStartTime, 0.0f, 0.0f, aDuration, aValues.Data(),
+ aValues.Length());
+ return this;
+ }
+
+ void SetValue(float aValue)
+ {
+ AudioTimelineEvent event(AudioTimelineEvent::SetValue, 0.0f, aValue);
+
+ ErrorResult rv;
+ if (!ValidateEvent(event, rv)) {
+ MOZ_ASSERT(false, "This should not happen, "
+ "setting the value should always work");
+ return;
+ }
+
+ AudioParamTimeline::SetValue(aValue);
+
+ SendEventToEngine(event);
+ }
+
+ AudioParam* SetValueAtTime(float aValue, double aStartTime, ErrorResult& aRv)
+ {
+ if (!WebAudioUtils::IsTimeValid(aStartTime)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return this;
+ }
+ EventInsertionHelper(aRv, AudioTimelineEvent::SetValueAtTime,
+ aStartTime, aValue);
+
+ return this;
+ }
+
+ AudioParam* LinearRampToValueAtTime(float aValue, double aEndTime,
+ ErrorResult& aRv)
+ {
+ if (!WebAudioUtils::IsTimeValid(aEndTime)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return this;
+ }
+ EventInsertionHelper(aRv, AudioTimelineEvent::LinearRamp, aEndTime, aValue);
+ return this;
+ }
+
+ AudioParam* ExponentialRampToValueAtTime(float aValue, double aEndTime,
+ ErrorResult& aRv)
+ {
+ if (!WebAudioUtils::IsTimeValid(aEndTime)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return this;
+ }
+ EventInsertionHelper(aRv, AudioTimelineEvent::ExponentialRamp,
+ aEndTime, aValue);
+ return this;
+ }
+
+ AudioParam* SetTargetAtTime(float aTarget, double aStartTime,
+ double aTimeConstant, ErrorResult& aRv)
+ {
+ if (!WebAudioUtils::IsTimeValid(aStartTime) ||
+ !WebAudioUtils::IsTimeValid(aTimeConstant)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return this;
+ }
+ EventInsertionHelper(aRv, AudioTimelineEvent::SetTarget,
+ aStartTime, aTarget,
+ aTimeConstant);
+
+ return this;
+ }
+
+ AudioParam* CancelScheduledValues(double aStartTime, ErrorResult& aRv)
+ {
+ if (!WebAudioUtils::IsTimeValid(aStartTime)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return this;
+ }
+
+ // Remove some events on the main thread copy.
+ AudioEventTimeline::CancelScheduledValues(aStartTime);
+
+ AudioTimelineEvent event(AudioTimelineEvent::Cancel, aStartTime, 0.0f);
+
+ SendEventToEngine(event);
+
+ return this;
+ }
+
+ uint32_t ParentNodeId()
+ {
+ return mNode->Id();
+ }
+
+ void GetName(nsAString& aName)
+ {
+ aName.AssignASCII(mName);
+ }
+
+ float DefaultValue() const
+ {
+ return mDefaultValue;
+ }
+
+ const nsTArray<AudioNode::InputNode>& InputNodes() const
+ {
+ return mInputNodes;
+ }
+
+ void RemoveInputNode(uint32_t aIndex)
+ {
+ mInputNodes.RemoveElementAt(aIndex);
+ }
+
+ AudioNode::InputNode* AppendInputNode()
+ {
+ return mInputNodes.AppendElement();
+ }
+
+ // May create the stream if it doesn't exist
+ MediaStream* Stream();
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioParamTimeline::SizeOfExcludingThis(aMallocSizeOf);
+ // Not owned:
+ // - mNode
+
+ // Just count the array, actual nodes are counted in mNode.
+ amount += mInputNodes.ShallowSizeOfExcludingThis(aMallocSizeOf);
+
+ if (mNodeStreamPort) {
+ amount += mNodeStreamPort->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ void EventInsertionHelper(ErrorResult& aRv,
+ AudioTimelineEvent::Type aType,
+ double aTime, float aValue,
+ double aTimeConstant = 0.0,
+ float aDuration = 0.0,
+ const float* aCurve = nullptr,
+ uint32_t aCurveLength = 0)
+ {
+ AudioTimelineEvent event(aType, aTime, aValue,
+ aTimeConstant, aDuration, aCurve, aCurveLength);
+
+ if (!ValidateEvent(event, aRv)) {
+ return;
+ }
+
+ AudioEventTimeline::InsertEvent<double>(event);
+
+ SendEventToEngine(event);
+
+ CleanupOldEvents();
+ }
+
+ void CleanupOldEvents();
+
+ void SendEventToEngine(const AudioTimelineEvent& aEvent);
+
+ void DisconnectFromGraphAndDestroyStream();
+
+ nsCycleCollectingAutoRefCnt mRefCnt;
+ NS_DECL_OWNINGTHREAD
+ RefPtr<AudioNode> mNode;
+ // For every InputNode, there is a corresponding entry in mOutputParams of the
+ // InputNode's mInputNode.
+ nsTArray<AudioNode::InputNode> mInputNodes;
+ const char* mName;
+ // The input port used to connect the AudioParam's stream to its node's stream
+ RefPtr<MediaInputPort> mNodeStreamPort;
+ const uint32_t mIndex;
+ const float mDefaultValue;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/AudioParamTimeline.h b/dom/media/webaudio/AudioParamTimeline.h
new file mode 100644
index 000000000..24ef753c3
--- /dev/null
+++ b/dom/media/webaudio/AudioParamTimeline.h
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioParamTimeline_h_
+#define AudioParamTimeline_h_
+
+#include "AudioEventTimeline.h"
+#include "mozilla/ErrorResult.h"
+#include "MediaStreamGraph.h"
+#include "AudioSegment.h"
+
+namespace mozilla {
+
+namespace dom {
+
+// This helper class is used to represent the part of the AudioParam
+// class that gets sent to AudioNodeEngine instances. In addition to
+// AudioEventTimeline methods, it holds a pointer to an optional
+// MediaStream which represents the AudioNode inputs to the AudioParam.
+// This MediaStream is managed by the AudioParam subclass on the main
+// thread, and can only be obtained from the AudioNodeEngine instances
+// consuming this class.
+class AudioParamTimeline : public AudioEventTimeline
+{
+ typedef AudioEventTimeline BaseClass;
+
+public:
+ explicit AudioParamTimeline(float aDefaultValue)
+ : BaseClass(aDefaultValue)
+ {
+ }
+
+ MediaStream* Stream() const
+ {
+ return mStream;
+ }
+
+ bool HasSimpleValue() const
+ {
+ return BaseClass::HasSimpleValue() && !mStream;
+ }
+
+ template<class TimeType>
+ float GetValueAtTime(TimeType aTime)
+ {
+ return GetValueAtTime(aTime, 0);
+ }
+
+ template<typename TimeType>
+ void InsertEvent(const AudioTimelineEvent& aEvent)
+ {
+ if (aEvent.mType == AudioTimelineEvent::Cancel) {
+ CancelScheduledValues(aEvent.template Time<TimeType>());
+ return;
+ }
+ if (aEvent.mType == AudioTimelineEvent::Stream) {
+ mStream = aEvent.mStream;
+ return;
+ }
+ if (aEvent.mType == AudioTimelineEvent::SetValue) {
+ AudioEventTimeline::SetValue(aEvent.mValue);
+ return;
+ }
+ AudioEventTimeline::InsertEvent<TimeType>(aEvent);
+ }
+
+ // Get the value of the AudioParam at time aTime + aCounter.
+ // aCounter here is an offset to aTime if we try to get the value in ticks,
+ // otherwise it should always be zero. aCounter is meant to be used when
+ template<class TimeType>
+ float GetValueAtTime(TimeType aTime, size_t aCounter);
+
+ // Get the values of the AudioParam at time aTime + (0 to aSize).
+ // aBuffer must have the correct aSize.
+ // aSize here is an offset to aTime if we try to get the value in ticks,
+ // otherwise it should always be zero. aSize is meant to be used when
+ // getting the value of an a-rate AudioParam for each tick inside an
+ // AudioNodeEngine implementation.
+ template<class TimeType>
+ void GetValuesAtTime(TimeType aTime, float* aBuffer, const size_t aSize);
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return mStream ? mStream->SizeOfIncludingThis(aMallocSizeOf) : 0;
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+
+private:
+ float AudioNodeInputValue(size_t aCounter) const;
+
+protected:
+ // This is created lazily when needed.
+ RefPtr<MediaStream> mStream;
+};
+
+template<> inline float
+AudioParamTimeline::GetValueAtTime(double aTime, size_t aCounter)
+{
+ MOZ_ASSERT(!aCounter);
+
+ // Getting an AudioParam value on an AudioNode does not consider input from
+ // other AudioNodes, which is managed only on the graph thread.
+ return BaseClass::GetValueAtTime(aTime);
+}
+
+template<> inline float
+AudioParamTimeline::GetValueAtTime(int64_t aTime, size_t aCounter)
+{
+ MOZ_ASSERT(aCounter < WEBAUDIO_BLOCK_SIZE);
+ MOZ_ASSERT(!aCounter || !HasSimpleValue());
+
+ // Mix the value of the AudioParam itself with that of the AudioNode inputs.
+ return BaseClass::GetValueAtTime(static_cast<int64_t>(aTime + aCounter)) +
+ (mStream ? AudioNodeInputValue(aCounter) : 0.0f);
+}
+
+template<> inline void
+AudioParamTimeline::GetValuesAtTime(double aTime, float* aBuffer,
+ const size_t aSize)
+{
+ MOZ_ASSERT(aBuffer);
+ MOZ_ASSERT(aSize == 1);
+
+ // Getting an AudioParam value on an AudioNode does not consider input from
+ // other AudioNodes, which is managed only on the graph thread.
+ *aBuffer = BaseClass::GetValueAtTime(aTime);
+}
+
+template<> inline void
+AudioParamTimeline::GetValuesAtTime(int64_t aTime, float* aBuffer,
+ const size_t aSize)
+{
+ MOZ_ASSERT(aBuffer);
+ MOZ_ASSERT(aSize <= WEBAUDIO_BLOCK_SIZE);
+ MOZ_ASSERT(aSize == 1 || !HasSimpleValue());
+
+ // Mix the value of the AudioParam itself with that of the AudioNode inputs.
+ BaseClass::GetValuesAtTime(aTime, aBuffer, aSize);
+ if (mStream) {
+ for (size_t i = 0; i < aSize; ++i) {
+ aBuffer[i] += AudioNodeInputValue(i);
+ }
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/AudioProcessingEvent.cpp b/dom/media/webaudio/AudioProcessingEvent.cpp
new file mode 100644
index 000000000..01b9585ca
--- /dev/null
+++ b/dom/media/webaudio/AudioProcessingEvent.cpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioProcessingEvent.h"
+#include "mozilla/dom/AudioProcessingEventBinding.h"
+#include "mozilla/dom/ScriptSettings.h"
+#include "AudioContext.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(AudioProcessingEvent, Event,
+ mInputBuffer, mOutputBuffer, mNode)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioProcessingEvent)
+NS_INTERFACE_MAP_END_INHERITING(Event)
+
+NS_IMPL_ADDREF_INHERITED(AudioProcessingEvent, Event)
+NS_IMPL_RELEASE_INHERITED(AudioProcessingEvent, Event)
+
+AudioProcessingEvent::AudioProcessingEvent(ScriptProcessorNode* aOwner,
+ nsPresContext* aPresContext,
+ WidgetEvent* aEvent)
+ : Event(aOwner, aPresContext, aEvent)
+ , mPlaybackTime(0.0)
+ , mNode(aOwner)
+{
+}
+
+AudioProcessingEvent::~AudioProcessingEvent()
+{
+}
+
+JSObject*
+AudioProcessingEvent::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return AudioProcessingEventBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<AudioBuffer>
+AudioProcessingEvent::LazilyCreateBuffer(uint32_t aNumberOfChannels,
+ ErrorResult& aRv)
+{
+ RefPtr<AudioBuffer> buffer =
+ AudioBuffer::Create(mNode->Context(), aNumberOfChannels,
+ mNode->BufferSize(),
+ mNode->Context()->SampleRate(), aRv);
+ MOZ_ASSERT(buffer || aRv.ErrorCodeIs(NS_ERROR_OUT_OF_MEMORY));
+ return buffer.forget();
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/AudioProcessingEvent.h b/dom/media/webaudio/AudioProcessingEvent.h
new file mode 100644
index 000000000..7b3b54d3e
--- /dev/null
+++ b/dom/media/webaudio/AudioProcessingEvent.h
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AudioProcessingEvent_h_
+#define AudioProcessingEvent_h_
+
+#include "AudioBuffer.h"
+#include "ScriptProcessorNode.h"
+#include "mozilla/dom/Event.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioProcessingEvent final : public Event
+{
+public:
+ AudioProcessingEvent(ScriptProcessorNode* aOwner,
+ nsPresContext* aPresContext,
+ WidgetEvent* aEvent);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_FORWARD_TO_EVENT
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioProcessingEvent, Event)
+
+ JSObject* WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void InitEvent(AudioBuffer* aInputBuffer,
+ uint32_t aNumberOfInputChannels,
+ double aPlaybackTime)
+ {
+ InitEvent(NS_LITERAL_STRING("audioprocess"), false, false);
+ mInputBuffer = aInputBuffer;
+ mNumberOfInputChannels = aNumberOfInputChannels;
+ mPlaybackTime = aPlaybackTime;
+ }
+
+ double PlaybackTime() const
+ {
+ return mPlaybackTime;
+ }
+
+ AudioBuffer* GetInputBuffer(ErrorResult& aRv)
+ {
+ if (!mInputBuffer) {
+ mInputBuffer = LazilyCreateBuffer(mNumberOfInputChannels, aRv);
+ }
+ return mInputBuffer;
+ }
+
+ AudioBuffer* GetOutputBuffer(ErrorResult& aRv)
+ {
+ if (!mOutputBuffer) {
+ mOutputBuffer = LazilyCreateBuffer(mNode->NumberOfOutputChannels(), aRv);
+ }
+ return mOutputBuffer;
+ }
+
+ bool HasOutputBuffer() const
+ {
+ return !!mOutputBuffer;
+ }
+
+protected:
+ virtual ~AudioProcessingEvent();
+
+private:
+ already_AddRefed<AudioBuffer>
+ LazilyCreateBuffer(uint32_t aNumberOfChannels, ErrorResult& rv);
+
+private:
+ double mPlaybackTime;
+ RefPtr<AudioBuffer> mInputBuffer;
+ RefPtr<AudioBuffer> mOutputBuffer;
+ RefPtr<ScriptProcessorNode> mNode;
+ uint32_t mNumberOfInputChannels;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/BiquadFilterNode.cpp b/dom/media/webaudio/BiquadFilterNode.cpp
new file mode 100644
index 000000000..0c8c05586
--- /dev/null
+++ b/dom/media/webaudio/BiquadFilterNode.cpp
@@ -0,0 +1,355 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "BiquadFilterNode.h"
+#include "AlignmentUtils.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "PlayingRefChangeHandler.h"
+#include "WebAudioUtils.h"
+#include "blink/Biquad.h"
+#include "mozilla/UniquePtr.h"
+#include "AudioParamTimeline.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(BiquadFilterNode, AudioNode,
+ mFrequency, mDetune, mQ, mGain)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BiquadFilterNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(BiquadFilterNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(BiquadFilterNode, AudioNode)
+
+static void
+SetParamsOnBiquad(WebCore::Biquad& aBiquad,
+ float aSampleRate,
+ BiquadFilterType aType,
+ double aFrequency,
+ double aQ,
+ double aGain,
+ double aDetune)
+{
+ const double nyquist = aSampleRate * 0.5;
+ double normalizedFrequency = aFrequency / nyquist;
+
+ if (aDetune) {
+ normalizedFrequency *= std::pow(2.0, aDetune / 1200);
+ }
+
+ switch (aType) {
+ case BiquadFilterType::Lowpass:
+ aBiquad.setLowpassParams(normalizedFrequency, aQ);
+ break;
+ case BiquadFilterType::Highpass:
+ aBiquad.setHighpassParams(normalizedFrequency, aQ);
+ break;
+ case BiquadFilterType::Bandpass:
+ aBiquad.setBandpassParams(normalizedFrequency, aQ);
+ break;
+ case BiquadFilterType::Lowshelf:
+ aBiquad.setLowShelfParams(normalizedFrequency, aGain);
+ break;
+ case BiquadFilterType::Highshelf:
+ aBiquad.setHighShelfParams(normalizedFrequency, aGain);
+ break;
+ case BiquadFilterType::Peaking:
+ aBiquad.setPeakingParams(normalizedFrequency, aQ, aGain);
+ break;
+ case BiquadFilterType::Notch:
+ aBiquad.setNotchParams(normalizedFrequency, aQ);
+ break;
+ case BiquadFilterType::Allpass:
+ aBiquad.setAllpassParams(normalizedFrequency, aQ);
+ break;
+ default:
+ NS_NOTREACHED("We should never see the alternate names here");
+ break;
+ }
+}
+
+class BiquadFilterNodeEngine final : public AudioNodeEngine
+{
+public:
+ BiquadFilterNodeEngine(AudioNode* aNode,
+ AudioDestinationNode* aDestination,
+ uint64_t aWindowID)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ // Keep the default values in sync with the default values in
+ // BiquadFilterNode::BiquadFilterNode
+ , mType(BiquadFilterType::Lowpass)
+ , mFrequency(350.f)
+ , mDetune(0.f)
+ , mQ(1.f)
+ , mGain(0.f)
+ , mWindowID(aWindowID)
+ {
+ }
+
+ enum Parameteres {
+ TYPE,
+ FREQUENCY,
+ DETUNE,
+ Q,
+ GAIN
+ };
+ void SetInt32Parameter(uint32_t aIndex, int32_t aValue) override
+ {
+ switch (aIndex) {
+ case TYPE: mType = static_cast<BiquadFilterType>(aValue); break;
+ default:
+ NS_ERROR("Bad BiquadFilterNode Int32Parameter");
+ }
+ }
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case FREQUENCY:
+ mFrequency.InsertEvent<int64_t>(aEvent);
+ break;
+ case DETUNE:
+ mDetune.InsertEvent<int64_t>(aEvent);
+ break;
+ case Q:
+ mQ.InsertEvent<int64_t>(aEvent);
+ break;
+ case GAIN:
+ mGain.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad BiquadFilterNodeEngine TimelineParameter");
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ float inputBuffer[WEBAUDIO_BLOCK_SIZE + 4];
+ float* alignedInputBuffer = ALIGNED16(inputBuffer);
+ ASSERT_ALIGNED16(alignedInputBuffer);
+
+ if (aInput.IsNull()) {
+ bool hasTail = false;
+ for (uint32_t i = 0; i < mBiquads.Length(); ++i) {
+ if (mBiquads[i].hasTail()) {
+ hasTail = true;
+ break;
+ }
+ }
+ if (!hasTail) {
+ if (!mBiquads.IsEmpty()) {
+ mBiquads.Clear();
+ aStream->ScheduleCheckForInactive();
+
+ RefPtr<PlayingRefChangeHandler> refchanged =
+ new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ PodArrayZero(inputBuffer);
+
+ } else if(mBiquads.Length() != aInput.ChannelCount()){
+ if (mBiquads.IsEmpty()) {
+ RefPtr<PlayingRefChangeHandler> refchanged =
+ new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ } else { // Help people diagnose bug 924718
+ WebAudioUtils::LogToDeveloperConsole(mWindowID,
+ "BiquadFilterChannelCountChangeWarning");
+ }
+
+ // Adjust the number of biquads based on the number of channels
+ mBiquads.SetLength(aInput.ChannelCount());
+ }
+
+ uint32_t numberOfChannels = mBiquads.Length();
+ aOutput->AllocateChannels(numberOfChannels);
+
+ StreamTime pos = mDestination->GraphTimeToStreamTime(aFrom);
+
+ double freq = mFrequency.GetValueAtTime(pos);
+ double q = mQ.GetValueAtTime(pos);
+ double gain = mGain.GetValueAtTime(pos);
+ double detune = mDetune.GetValueAtTime(pos);
+
+ for (uint32_t i = 0; i < numberOfChannels; ++i) {
+ const float* input;
+ if (aInput.IsNull()) {
+ input = alignedInputBuffer;
+ } else {
+ input = static_cast<const float*>(aInput.mChannelData[i]);
+ if (aInput.mVolume != 1.0) {
+ AudioBlockCopyChannelWithScale(input, aInput.mVolume, alignedInputBuffer);
+ input = alignedInputBuffer;
+ }
+ }
+ SetParamsOnBiquad(mBiquads[i], aStream->SampleRate(), mType, freq, q, gain, detune);
+
+ mBiquads[i].process(input,
+ aOutput->ChannelFloatsForWrite(i),
+ aInput.GetDuration());
+ }
+ }
+
+ bool IsActive() const override
+ {
+ return !mBiquads.IsEmpty();
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mDestination - probably not owned
+ // - AudioParamTimelines - counted in the AudioNode
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mBiquads.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ AudioNodeStream* mDestination;
+ BiquadFilterType mType;
+ AudioParamTimeline mFrequency;
+ AudioParamTimeline mDetune;
+ AudioParamTimeline mQ;
+ AudioParamTimeline mGain;
+ nsTArray<WebCore::Biquad> mBiquads;
+ uint64_t mWindowID;
+};
+
+BiquadFilterNode::BiquadFilterNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mType(BiquadFilterType::Lowpass)
+ , mFrequency(new AudioParam(this, BiquadFilterNodeEngine::FREQUENCY,
+ 350.f, "frequency"))
+ , mDetune(new AudioParam(this, BiquadFilterNodeEngine::DETUNE, 0.f, "detune"))
+ , mQ(new AudioParam(this, BiquadFilterNodeEngine::Q, 1.f, "Q"))
+ , mGain(new AudioParam(this, BiquadFilterNodeEngine::GAIN, 0.f, "gain"))
+{
+ uint64_t windowID = aContext->GetParentObject()->WindowID();
+ BiquadFilterNodeEngine* engine = new BiquadFilterNodeEngine(this, aContext->Destination(), windowID);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+BiquadFilterNode::~BiquadFilterNode()
+{
+}
+
+size_t
+BiquadFilterNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+
+ if (mFrequency) {
+ amount += mFrequency->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ if (mDetune) {
+ amount += mDetune->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ if (mQ) {
+ amount += mQ->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ if (mGain) {
+ amount += mGain->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+size_t
+BiquadFilterNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+BiquadFilterNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return BiquadFilterNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+BiquadFilterNode::SetType(BiquadFilterType aType)
+{
+ mType = aType;
+ SendInt32ParameterToStream(BiquadFilterNodeEngine::TYPE,
+ static_cast<int32_t>(aType));
+}
+
+void
+BiquadFilterNode::GetFrequencyResponse(const Float32Array& aFrequencyHz,
+ const Float32Array& aMagResponse,
+ const Float32Array& aPhaseResponse)
+{
+ aFrequencyHz.ComputeLengthAndData();
+ aMagResponse.ComputeLengthAndData();
+ aPhaseResponse.ComputeLengthAndData();
+
+ uint32_t length = std::min(std::min(aFrequencyHz.Length(), aMagResponse.Length()),
+ aPhaseResponse.Length());
+ if (!length) {
+ return;
+ }
+
+ auto frequencies = MakeUnique<float[]>(length);
+ float* frequencyHz = aFrequencyHz.Data();
+ const double nyquist = Context()->SampleRate() * 0.5;
+
+ // Normalize the frequencies
+ for (uint32_t i = 0; i < length; ++i) {
+ if (frequencyHz[i] >= 0 && frequencyHz[i] <= nyquist) {
+ frequencies[i] = static_cast<float>(frequencyHz[i] / nyquist);
+ } else {
+ frequencies[i] = std::numeric_limits<float>::quiet_NaN();
+ }
+ }
+
+ const double currentTime = Context()->CurrentTime();
+
+ double freq = mFrequency->GetValueAtTime(currentTime);
+ double q = mQ->GetValueAtTime(currentTime);
+ double gain = mGain->GetValueAtTime(currentTime);
+ double detune = mDetune->GetValueAtTime(currentTime);
+
+ WebCore::Biquad biquad;
+ SetParamsOnBiquad(biquad, Context()->SampleRate(), mType, freq, q, gain, detune);
+ biquad.getFrequencyResponse(int(length), frequencies.get(), aMagResponse.Data(), aPhaseResponse.Data());
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/BiquadFilterNode.h b/dom/media/webaudio/BiquadFilterNode.h
new file mode 100644
index 000000000..f81c623f0
--- /dev/null
+++ b/dom/media/webaudio/BiquadFilterNode.h
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef BiquadFilterNode_h_
+#define BiquadFilterNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+#include "mozilla/dom/BiquadFilterNodeBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class BiquadFilterNode final : public AudioNode
+{
+public:
+ explicit BiquadFilterNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(BiquadFilterNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ BiquadFilterType Type() const
+ {
+ return mType;
+ }
+ void SetType(BiquadFilterType aType);
+
+ AudioParam* Frequency() const
+ {
+ return mFrequency;
+ }
+
+ AudioParam* Detune() const
+ {
+ return mDetune;
+ }
+
+ AudioParam* Q() const
+ {
+ return mQ;
+ }
+
+ AudioParam* Gain() const
+ {
+ return mGain;
+ }
+
+ void GetFrequencyResponse(const Float32Array& aFrequencyHz,
+ const Float32Array& aMagResponse,
+ const Float32Array& aPhaseResponse);
+
+ const char* NodeType() const override
+ {
+ return "BiquadFilterNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~BiquadFilterNode();
+
+private:
+ BiquadFilterType mType;
+ RefPtr<AudioParam> mFrequency;
+ RefPtr<AudioParam> mDetune;
+ RefPtr<AudioParam> mQ;
+ RefPtr<AudioParam> mGain;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/BufferDecoder.cpp b/dom/media/webaudio/BufferDecoder.cpp
new file mode 100644
index 000000000..053a13bec
--- /dev/null
+++ b/dom/media/webaudio/BufferDecoder.cpp
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "BufferDecoder.h"
+
+#include "nsISupports.h"
+#include "MediaResource.h"
+#include "GMPService.h"
+
+namespace mozilla {
+
+NS_IMPL_ISUPPORTS0(BufferDecoder)
+
+BufferDecoder::BufferDecoder(MediaResource* aResource, GMPCrashHelper* aCrashHelper)
+ : mResource(aResource)
+ , mCrashHelper(aCrashHelper)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(BufferDecoder);
+}
+
+BufferDecoder::~BufferDecoder()
+{
+ // The dtor may run on any thread, we cannot be sure.
+ MOZ_COUNT_DTOR(BufferDecoder);
+}
+
+void
+BufferDecoder::BeginDecoding(TaskQueue* aTaskQueueIdentity)
+{
+ MOZ_ASSERT(!mTaskQueueIdentity && aTaskQueueIdentity);
+ mTaskQueueIdentity = aTaskQueueIdentity;
+}
+
+MediaResource*
+BufferDecoder::GetResource() const
+{
+ return mResource;
+}
+
+void
+BufferDecoder::NotifyDecodedFrames(const FrameStatisticsData& aStats)
+{
+ // ignore
+}
+
+VideoFrameContainer*
+BufferDecoder::GetVideoFrameContainer()
+{
+ // no video frame
+ return nullptr;
+}
+
+layers::ImageContainer*
+BufferDecoder::GetImageContainer()
+{
+ // no image container
+ return nullptr;
+}
+
+MediaDecoderOwner*
+BufferDecoder::GetOwner() const
+{
+ // unknown
+ return nullptr;
+}
+
+already_AddRefed<GMPCrashHelper>
+BufferDecoder::GetCrashHelper()
+{
+ return do_AddRef(mCrashHelper);
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/BufferDecoder.h b/dom/media/webaudio/BufferDecoder.h
new file mode 100644
index 000000000..52cb92489
--- /dev/null
+++ b/dom/media/webaudio/BufferDecoder.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef BUFFER_DECODER_H_
+#define BUFFER_DECODER_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "mozilla/TaskQueue.h"
+
+#include "AbstractMediaDecoder.h"
+
+namespace mozilla {
+
+/**
+ * This class provides a decoder object which decodes a media file that lives in
+ * a memory buffer.
+ */
+class BufferDecoder final : public AbstractMediaDecoder
+{
+public:
+ // This class holds a weak pointer to MediaResource. It's the responsibility
+ // of the caller to manage the memory of the MediaResource object.
+ explicit BufferDecoder(MediaResource* aResource, GMPCrashHelper* aCrashHelper);
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // This has to be called before decoding begins
+ void BeginDecoding(TaskQueue* aTaskQueueIdentity);
+
+ MediaResource* GetResource() const final override;
+
+ void NotifyDecodedFrames(const FrameStatisticsData& aStats) final override;
+
+ VideoFrameContainer* GetVideoFrameContainer() final override;
+ layers::ImageContainer* GetImageContainer() final override;
+
+ MediaDecoderOwner* GetOwner() const final override;
+
+ already_AddRefed<GMPCrashHelper> GetCrashHelper() override;
+
+private:
+ virtual ~BufferDecoder();
+ RefPtr<TaskQueue> mTaskQueueIdentity;
+ RefPtr<MediaResource> mResource;
+ RefPtr<GMPCrashHelper> mCrashHelper;
+};
+
+} // namespace mozilla
+
+#endif /* BUFFER_DECODER_H_ */
diff --git a/dom/media/webaudio/ChannelMergerNode.cpp b/dom/media/webaudio/ChannelMergerNode.cpp
new file mode 100644
index 000000000..7b63a98a6
--- /dev/null
+++ b/dom/media/webaudio/ChannelMergerNode.cpp
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/ChannelMergerNode.h"
+#include "mozilla/dom/ChannelMergerNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_ISUPPORTS_INHERITED0(ChannelMergerNode, AudioNode)
+
+class ChannelMergerNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit ChannelMergerNodeEngine(ChannelMergerNode* aNode)
+ : AudioNodeEngine(aNode)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+
+ void ProcessBlocksOnPorts(AudioNodeStream* aStream,
+ const OutputChunks& aInput,
+ OutputChunks& aOutput,
+ bool* aFinished) override
+ {
+ MOZ_ASSERT(aInput.Length() >= 1, "Should have one or more input ports");
+
+ // Get the number of output channels, and allocate it
+ size_t channelCount = InputCount();
+ bool allNull = true;
+ for (size_t i = 0; i < channelCount; ++i) {
+ allNull &= aInput[i].IsNull();
+ }
+ if (allNull) {
+ aOutput[0].SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ aOutput[0].AllocateChannels(channelCount);
+
+ for (size_t i = 0; i < channelCount; ++i) {
+ float* output = aOutput[0].ChannelFloatsForWrite(i);
+ if (aInput[i].IsNull()) {
+ PodZero(output, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ AudioBlockCopyChannelWithScale(
+ static_cast<const float*>(aInput[i].mChannelData[0]),
+ aInput[i].mVolume, output);
+ }
+ }
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+};
+
+ChannelMergerNode::ChannelMergerNode(AudioContext* aContext,
+ uint16_t aInputCount)
+ : AudioNode(aContext,
+ 1,
+ ChannelCountMode::Explicit,
+ ChannelInterpretation::Speakers)
+ , mInputCount(aInputCount)
+{
+ mStream = AudioNodeStream::Create(aContext,
+ new ChannelMergerNodeEngine(this),
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+ChannelMergerNode::~ChannelMergerNode()
+{
+}
+
+JSObject*
+ChannelMergerNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return ChannelMergerNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/ChannelMergerNode.h b/dom/media/webaudio/ChannelMergerNode.h
new file mode 100644
index 000000000..d064c8e23
--- /dev/null
+++ b/dom/media/webaudio/ChannelMergerNode.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ChannelMergerNode_h_
+#define ChannelMergerNode_h_
+
+#include "AudioNode.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class ChannelMergerNode final : public AudioNode
+{
+public:
+ ChannelMergerNode(AudioContext* aContext,
+ uint16_t aInputCount);
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint16_t NumberOfInputs() const override { return mInputCount; }
+
+ const char* NodeType() const override
+ {
+ return "ChannelMergerNode";
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+protected:
+ virtual ~ChannelMergerNode();
+
+private:
+ const uint16_t mInputCount;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/ChannelSplitterNode.cpp b/dom/media/webaudio/ChannelSplitterNode.cpp
new file mode 100644
index 000000000..34a414d16
--- /dev/null
+++ b/dom/media/webaudio/ChannelSplitterNode.cpp
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/ChannelSplitterNode.h"
+#include "mozilla/dom/ChannelSplitterNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_ISUPPORTS_INHERITED0(ChannelSplitterNode, AudioNode)
+
+class ChannelSplitterNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit ChannelSplitterNodeEngine(ChannelSplitterNode* aNode)
+ : AudioNodeEngine(aNode)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+
+ void ProcessBlocksOnPorts(AudioNodeStream* aStream,
+ const OutputChunks& aInput,
+ OutputChunks& aOutput,
+ bool* aFinished) override
+ {
+ MOZ_ASSERT(aInput.Length() == 1, "Should only have one input port");
+
+ aOutput.SetLength(OutputCount());
+ for (uint16_t i = 0; i < OutputCount(); ++i) {
+ if (i < aInput[0].ChannelCount()) {
+ // Split out existing channels
+ aOutput[i].AllocateChannels(1);
+ AudioBlockCopyChannelWithScale(
+ static_cast<const float*>(aInput[0].mChannelData[i]),
+ aInput[0].mVolume,
+ aOutput[i].ChannelFloatsForWrite(0));
+ } else {
+ // Pad with silent channels if needed
+ aOutput[i].SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+ }
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+};
+
+ChannelSplitterNode::ChannelSplitterNode(AudioContext* aContext,
+ uint16_t aOutputCount)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mOutputCount(aOutputCount)
+{
+ mStream = AudioNodeStream::Create(aContext,
+ new ChannelSplitterNodeEngine(this),
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+ChannelSplitterNode::~ChannelSplitterNode()
+{
+}
+
+JSObject*
+ChannelSplitterNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return ChannelSplitterNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/ChannelSplitterNode.h b/dom/media/webaudio/ChannelSplitterNode.h
new file mode 100644
index 000000000..3b267eccc
--- /dev/null
+++ b/dom/media/webaudio/ChannelSplitterNode.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ChannelSplitterNode_h_
+#define ChannelSplitterNode_h_
+
+#include "AudioNode.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class ChannelSplitterNode final : public AudioNode
+{
+public:
+ ChannelSplitterNode(AudioContext* aContext,
+ uint16_t aOutputCount);
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint16_t NumberOfOutputs() const override { return mOutputCount; }
+
+ const char* NodeType() const override
+ {
+ return "ChannelSplitterNode";
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+protected:
+ virtual ~ChannelSplitterNode();
+
+private:
+ const uint16_t mOutputCount;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/ConstantSourceNode.cpp b/dom/media/webaudio/ConstantSourceNode.cpp
new file mode 100644
index 000000000..b6884105c
--- /dev/null
+++ b/dom/media/webaudio/ConstantSourceNode.cpp
@@ -0,0 +1,286 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ConstantSourceNode.h"
+
+#include "AudioDestinationNode.h"
+#include "nsContentUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(ConstantSourceNode, AudioNode,
+ mOffset)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ConstantSourceNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(ConstantSourceNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(ConstantSourceNode, AudioNode)
+
+class ConstantSourceNodeEngine final : public AudioNodeEngine
+{
+public:
+ ConstantSourceNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination)
+ : AudioNodeEngine(aNode)
+ , mSource(nullptr)
+ , mDestination(aDestination->Stream())
+ , mStart(-1)
+ , mStop(STREAM_TIME_MAX)
+ // Keep the default values in sync with ConstantSourceNode::ConstantSourceNode.
+ , mOffset(1.0f)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+
+ void SetSourceStream(AudioNodeStream* aSource)
+ {
+ mSource = aSource;
+ }
+
+ enum Parameters {
+ OFFSET,
+ START,
+ STOP,
+ };
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case OFFSET:
+ mOffset.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad ConstantSourceNodeEngine TimelineParameter");
+ }
+ }
+
+ void SetStreamTimeParameter(uint32_t aIndex, StreamTime aParam) override
+ {
+ switch (aIndex) {
+ case START:
+ mStart = aParam;
+ mSource->SetActive();
+ break;
+ case STOP: mStop = aParam; break;
+ default:
+ NS_ERROR("Bad ConstantSourceNodeEngine StreamTimeParameter");
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ MOZ_ASSERT(mSource == aStream, "Invalid source stream");
+
+ StreamTime ticks = mDestination->GraphTimeToStreamTime(aFrom);
+ if (mStart == -1) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ if (ticks + WEBAUDIO_BLOCK_SIZE <= mStart || ticks >= mStop) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ } else {
+ aOutput->AllocateChannels(1);
+ float* output = aOutput->ChannelFloatsForWrite(0);
+
+ if (mOffset.HasSimpleValue()) {
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ output[i] = mOffset.GetValueAtTime(aFrom, 0);
+ }
+ } else {
+ mOffset.GetValuesAtTime(ticks, output, WEBAUDIO_BLOCK_SIZE);
+ }
+ }
+
+ if (ticks + WEBAUDIO_BLOCK_SIZE >= mStop) {
+ // We've finished playing.
+ *aFinished = true;
+ }
+ }
+
+ bool IsActive() const override
+ {
+ // start() has been called.
+ return mStart != -1;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+
+ // Not owned:
+ // - mSource
+ // - mDestination
+ // - mOffset (internal ref owned by node)
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ AudioNodeStream* mSource;
+ AudioNodeStream* mDestination;
+ StreamTime mStart;
+ StreamTime mStop;
+ AudioParamTimeline mOffset;
+};
+
+ConstantSourceNode::ConstantSourceNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 1,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mOffset(new AudioParam(this, ConstantSourceNodeEngine::OFFSET,
+ 1.0, "offset"))
+ , mStartCalled(false)
+{
+ ConstantSourceNodeEngine* engine = new ConstantSourceNodeEngine(this, aContext->Destination());
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED,
+ aContext->Graph());
+ engine->SetSourceStream(mStream);
+ mStream->AddMainThreadListener(this);
+}
+
+ConstantSourceNode::~ConstantSourceNode()
+{
+}
+
+size_t
+ConstantSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+
+ amount += mOffset->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+ConstantSourceNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+ConstantSourceNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return ConstantSourceNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<ConstantSourceNode>
+ConstantSourceNode::Constructor(const GlobalObject& aGlobal,
+ AudioContext& aContext,
+ const ConstantSourceOptions& aOptions,
+ ErrorResult& aRv)
+{
+ RefPtr<ConstantSourceNode> object = new ConstantSourceNode(&aContext);
+ object->mOffset->SetValue(aOptions.mOffset);
+ return object.forget();
+}
+
+void
+ConstantSourceNode::DestroyMediaStream()
+{
+ if (mStream) {
+ mStream->RemoveMainThreadListener(this);
+ }
+ AudioNode::DestroyMediaStream();
+}
+
+void
+ConstantSourceNode::Start(double aWhen, ErrorResult& aRv)
+{
+ if (!WebAudioUtils::IsTimeValid(aWhen)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ if (mStartCalled) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ mStartCalled = true;
+
+ if (!mStream) {
+ return;
+ }
+
+ mStream->SetStreamTimeParameter(ConstantSourceNodeEngine::START,
+ Context(), aWhen);
+
+ MarkActive();
+}
+
+void
+ConstantSourceNode::Stop(double aWhen, ErrorResult& aRv)
+{
+ if (!WebAudioUtils::IsTimeValid(aWhen)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ if (!mStartCalled) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (!mStream || !Context()) {
+ return;
+ }
+
+ mStream->SetStreamTimeParameter(ConstantSourceNodeEngine::STOP,
+ Context(), std::max(0.0, aWhen));
+}
+
+void
+ConstantSourceNode::NotifyMainThreadStreamFinished()
+{
+ MOZ_ASSERT(mStream->IsFinished());
+
+ class EndedEventDispatcher final : public Runnable
+ {
+ public:
+ explicit EndedEventDispatcher(ConstantSourceNode* aNode)
+ : mNode(aNode) {}
+ NS_IMETHOD Run() override
+ {
+ // If it's not safe to run scripts right now, schedule this to run later
+ if (!nsContentUtils::IsSafeToRunScript()) {
+ nsContentUtils::AddScriptRunner(this);
+ return NS_OK;
+ }
+
+ mNode->DispatchTrustedEvent(NS_LITERAL_STRING("ended"));
+ // Release stream resources.
+ mNode->DestroyMediaStream();
+ return NS_OK;
+ }
+ private:
+ RefPtr<ConstantSourceNode> mNode;
+ };
+
+ NS_DispatchToMainThread(new EndedEventDispatcher(this));
+
+ // Drop the playing reference
+ // Warning: The below line might delete this.
+ MarkInactive();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/ConstantSourceNode.h b/dom/media/webaudio/ConstantSourceNode.h
new file mode 100644
index 000000000..7b5e7197e
--- /dev/null
+++ b/dom/media/webaudio/ConstantSourceNode.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ConstantSourceNode_h_
+#define ConstantSourceNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+#include "mozilla/dom/ConstantSourceNodeBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class ConstantSourceNode final : public AudioNode,
+ public MainThreadMediaStreamListener
+{
+public:
+ explicit ConstantSourceNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ConstantSourceNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static already_AddRefed<ConstantSourceNode>
+ Constructor(const GlobalObject& aGlobal,
+ AudioContext& aContext,
+ const ConstantSourceOptions& aOptions,
+ ErrorResult& aRv);
+
+ void DestroyMediaStream() override;
+
+ uint16_t NumberOfInputs() const final override
+ {
+ return 0;
+ }
+
+ AudioParam* Offset() const
+ {
+ return mOffset;
+ }
+
+ void Start(double aWhen, ErrorResult& rv);
+ void Stop(double aWhen, ErrorResult& rv);
+
+ IMPL_EVENT_HANDLER(ended)
+
+ void NotifyMainThreadStreamFinished() override;
+
+ const char* NodeType() const override
+ {
+ return "ConstantSourceNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~ConstantSourceNode();
+
+private:
+ RefPtr<AudioParam> mOffset;
+ bool mStartCalled;
+
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/ConvolverNode.cpp b/dom/media/webaudio/ConvolverNode.cpp
new file mode 100644
index 000000000..314cdf7cf
--- /dev/null
+++ b/dom/media/webaudio/ConvolverNode.cpp
@@ -0,0 +1,295 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ConvolverNode.h"
+#include "mozilla/dom/ConvolverNodeBinding.h"
+#include "nsAutoPtr.h"
+#include "AlignmentUtils.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "blink/Reverb.h"
+#include "PlayingRefChangeHandler.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(ConvolverNode, AudioNode, mBuffer)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ConvolverNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(ConvolverNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(ConvolverNode, AudioNode)
+
+class ConvolverNodeEngine final : public AudioNodeEngine
+{
+ typedef PlayingRefChangeHandler PlayingRefChanged;
+public:
+ ConvolverNodeEngine(AudioNode* aNode, bool aNormalize)
+ : AudioNodeEngine(aNode)
+ , mBufferLength(0)
+ , mLeftOverData(INT32_MIN)
+ , mSampleRate(0.0f)
+ , mUseBackgroundThreads(!aNode->Context()->IsOffline())
+ , mNormalize(aNormalize)
+ {
+ }
+
+ enum Parameters {
+ BUFFER_LENGTH,
+ SAMPLE_RATE,
+ NORMALIZE
+ };
+ void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
+ {
+ switch (aIndex) {
+ case BUFFER_LENGTH:
+ // BUFFER_LENGTH is the first parameter that we set when setting a new buffer,
+ // so we should be careful to invalidate the rest of our state here.
+ mBuffer = nullptr;
+ mSampleRate = 0.0f;
+ mBufferLength = aParam;
+ mLeftOverData = INT32_MIN;
+ break;
+ case SAMPLE_RATE:
+ mSampleRate = aParam;
+ break;
+ case NORMALIZE:
+ mNormalize = !!aParam;
+ break;
+ default:
+ NS_ERROR("Bad ConvolverNodeEngine Int32Parameter");
+ }
+ }
+ void SetDoubleParameter(uint32_t aIndex, double aParam) override
+ {
+ switch (aIndex) {
+ case SAMPLE_RATE:
+ mSampleRate = aParam;
+ AdjustReverb();
+ break;
+ default:
+ NS_ERROR("Bad ConvolverNodeEngine DoubleParameter");
+ }
+ }
+ void SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList> aBuffer) override
+ {
+ mBuffer = aBuffer;
+ AdjustReverb();
+ }
+
+ void AdjustReverb()
+ {
+ // Note about empirical tuning (this is copied from Blink)
+ // The maximum FFT size affects reverb performance and accuracy.
+ // If the reverb is single-threaded and processes entirely in the real-time audio thread,
+ // it's important not to make this too high. In this case 8192 is a good value.
+ // But, the Reverb object is multi-threaded, so we want this as high as possible without losing too much accuracy.
+ // Very large FFTs will have worse phase errors. Given these constraints 32768 is a good compromise.
+ const size_t MaxFFTSize = 32768;
+
+ if (!mBuffer || !mBufferLength || !mSampleRate) {
+ mReverb = nullptr;
+ mLeftOverData = INT32_MIN;
+ return;
+ }
+
+ mReverb = new WebCore::Reverb(mBuffer, mBufferLength,
+ MaxFFTSize, 2, mUseBackgroundThreads,
+ mNormalize, mSampleRate);
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ if (!mReverb) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ AudioBlock input = aInput;
+ if (aInput.IsNull()) {
+ if (mLeftOverData > 0) {
+ mLeftOverData -= WEBAUDIO_BLOCK_SIZE;
+ input.AllocateChannels(1);
+ WriteZeroesToAudioBlock(&input, 0, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ if (mLeftOverData != INT32_MIN) {
+ mLeftOverData = INT32_MIN;
+ aStream->ScheduleCheckForInactive();
+ RefPtr<PlayingRefChanged> refchanged =
+ new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+ } else {
+ if (aInput.mVolume != 1.0f) {
+ // Pre-multiply the input's volume
+ uint32_t numChannels = aInput.ChannelCount();
+ input.AllocateChannels(numChannels);
+ for (uint32_t i = 0; i < numChannels; ++i) {
+ const float* src = static_cast<const float*>(aInput.mChannelData[i]);
+ float* dest = input.ChannelFloatsForWrite(i);
+ AudioBlockCopyChannelWithScale(src, aInput.mVolume, dest);
+ }
+ }
+
+ if (mLeftOverData <= 0) {
+ RefPtr<PlayingRefChanged> refchanged =
+ new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+ mLeftOverData = mBufferLength;
+ MOZ_ASSERT(mLeftOverData > 0);
+ }
+ aOutput->AllocateChannels(2);
+
+ mReverb->process(&input, aOutput);
+ }
+
+ bool IsActive() const override
+ {
+ return mLeftOverData != INT32_MIN;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ if (mBuffer && !mBuffer->IsShared()) {
+ amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ if (mReverb) {
+ amount += mReverb->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ RefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
+ nsAutoPtr<WebCore::Reverb> mReverb;
+ int32_t mBufferLength;
+ int32_t mLeftOverData;
+ float mSampleRate;
+ bool mUseBackgroundThreads;
+ bool mNormalize;
+};
+
+ConvolverNode::ConvolverNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Clamped_max,
+ ChannelInterpretation::Speakers)
+ , mNormalize(true)
+{
+ ConvolverNodeEngine* engine = new ConvolverNodeEngine(this, mNormalize);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+ConvolverNode::~ConvolverNode()
+{
+}
+
+size_t
+ConvolverNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ if (mBuffer) {
+ // NB: mBuffer might be shared with the associated engine, by convention
+ // the AudioNode will report.
+ amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+}
+
+size_t
+ConvolverNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+ConvolverNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return ConvolverNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+ConvolverNode::SetBuffer(JSContext* aCx, AudioBuffer* aBuffer, ErrorResult& aRv)
+{
+ if (aBuffer) {
+ switch (aBuffer->NumberOfChannels()) {
+ case 1:
+ case 2:
+ case 4:
+ // Supported number of channels
+ break;
+ default:
+ aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
+ return;
+ }
+ }
+
+ mBuffer = aBuffer;
+
+ // Send the buffer to the stream
+ AudioNodeStream* ns = mStream;
+ MOZ_ASSERT(ns, "Why don't we have a stream here?");
+ if (mBuffer) {
+ uint32_t length = mBuffer->Length();
+ RefPtr<ThreadSharedFloatArrayBufferList> data =
+ mBuffer->GetThreadSharedChannelsForRate(aCx);
+ if (data && length < WEBAUDIO_BLOCK_SIZE) {
+ // For very small impulse response buffers, we need to pad the
+ // buffer with 0 to make sure that the Reverb implementation
+ // has enough data to compute FFTs from.
+ length = WEBAUDIO_BLOCK_SIZE;
+ RefPtr<ThreadSharedFloatArrayBufferList> paddedBuffer =
+ new ThreadSharedFloatArrayBufferList(data->GetChannels());
+ void* channelData = malloc(sizeof(float) * length * data->GetChannels() + 15);
+ float* alignedChannelData = ALIGNED16(channelData);
+ ASSERT_ALIGNED16(alignedChannelData);
+ for (uint32_t i = 0; i < data->GetChannels(); ++i) {
+ PodCopy(alignedChannelData + length * i, data->GetData(i), mBuffer->Length());
+ PodZero(alignedChannelData + length * i + mBuffer->Length(), WEBAUDIO_BLOCK_SIZE - mBuffer->Length());
+ paddedBuffer->SetData(i, (i == 0) ? channelData : nullptr, free, alignedChannelData);
+ }
+ data = paddedBuffer;
+ }
+ SendInt32ParameterToStream(ConvolverNodeEngine::BUFFER_LENGTH, length);
+ SendDoubleParameterToStream(ConvolverNodeEngine::SAMPLE_RATE,
+ mBuffer->SampleRate());
+ ns->SetBuffer(data.forget());
+ } else {
+ ns->SetBuffer(nullptr);
+ }
+}
+
+void
+ConvolverNode::SetNormalize(bool aNormalize)
+{
+ mNormalize = aNormalize;
+ SendInt32ParameterToStream(ConvolverNodeEngine::NORMALIZE, aNormalize);
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/ConvolverNode.h b/dom/media/webaudio/ConvolverNode.h
new file mode 100644
index 000000000..53cff9d27
--- /dev/null
+++ b/dom/media/webaudio/ConvolverNode.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ConvolverNode_h_
+#define ConvolverNode_h_
+
+#include "AudioNode.h"
+#include "AudioBuffer.h"
+
+namespace mozilla {
+namespace dom {
+
+class ConvolverNode final : public AudioNode
+{
+public:
+ explicit ConvolverNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ConvolverNode, AudioNode);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioBuffer* GetBuffer(JSContext* aCx) const
+ {
+ return mBuffer;
+ }
+
+ void SetBuffer(JSContext* aCx, AudioBuffer* aBufferi, ErrorResult& aRv);
+
+ bool Normalize() const
+ {
+ return mNormalize;
+ }
+
+ void SetNormalize(bool aNormal);
+
+ void SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv) override
+ {
+ if (aChannelCount > 2) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ AudioNode::SetChannelCount(aChannelCount, aRv);
+ }
+ void SetChannelCountModeValue(ChannelCountMode aMode, ErrorResult& aRv) override
+ {
+ if (aMode == ChannelCountMode::Max) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ AudioNode::SetChannelCountModeValue(aMode, aRv);
+ }
+
+ const char* NodeType() const override
+ {
+ return "ConvolverNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~ConvolverNode();
+
+private:
+ RefPtr<AudioBuffer> mBuffer;
+ bool mNormalize;
+};
+
+
+} //end namespace dom
+} //end namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/DelayBuffer.cpp b/dom/media/webaudio/DelayBuffer.cpp
new file mode 100644
index 000000000..c7f7198c9
--- /dev/null
+++ b/dom/media/webaudio/DelayBuffer.cpp
@@ -0,0 +1,263 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DelayBuffer.h"
+
+#include "mozilla/PodOperations.h"
+#include "AudioChannelFormat.h"
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+
+size_t
+DelayBuffer::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+ amount += mChunks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < mChunks.Length(); i++) {
+ amount += mChunks[i].SizeOfExcludingThis(aMallocSizeOf, false);
+ }
+
+ amount += mUpmixChannels.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+void
+DelayBuffer::Write(const AudioBlock& aInputChunk)
+{
+ // We must have a reference to the buffer if there are channels
+ MOZ_ASSERT(aInputChunk.IsNull() == !aInputChunk.ChannelCount());
+#ifdef DEBUG
+ MOZ_ASSERT(!mHaveWrittenBlock);
+ mHaveWrittenBlock = true;
+#endif
+
+ if (!EnsureBuffer()) {
+ return;
+ }
+
+ if (mCurrentChunk == mLastReadChunk) {
+ mLastReadChunk = -1; // invalidate cache
+ }
+ mChunks[mCurrentChunk] = aInputChunk.AsAudioChunk();
+}
+
+void
+DelayBuffer::Read(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
+ AudioBlock* aOutputChunk,
+ ChannelInterpretation aChannelInterpretation)
+{
+ int chunkCount = mChunks.Length();
+ if (!chunkCount) {
+ aOutputChunk->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ // Find the maximum number of contributing channels to determine the output
+ // channel count that retains all signal information. Buffered blocks will
+ // be upmixed if necessary.
+ //
+ // First find the range of "delay" offsets backwards from the current
+ // position. Note that these may be negative for frames that are after the
+ // current position (including i).
+ double minDelay = aPerFrameDelays[0];
+ double maxDelay = minDelay;
+ for (unsigned i = 1; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ minDelay = std::min(minDelay, aPerFrameDelays[i] - i);
+ maxDelay = std::max(maxDelay, aPerFrameDelays[i] - i);
+ }
+
+ // Now find the chunks touched by this range and check their channel counts.
+ int oldestChunk = ChunkForDelay(int(maxDelay) + 1);
+ int youngestChunk = ChunkForDelay(minDelay);
+
+ uint32_t channelCount = 0;
+ for (int i = oldestChunk; true; i = (i + 1) % chunkCount) {
+ channelCount = GetAudioChannelsSuperset(channelCount,
+ mChunks[i].ChannelCount());
+ if (i == youngestChunk) {
+ break;
+ }
+ }
+
+ if (channelCount) {
+ aOutputChunk->AllocateChannels(channelCount);
+ ReadChannels(aPerFrameDelays, aOutputChunk,
+ 0, channelCount, aChannelInterpretation);
+ } else {
+ aOutputChunk->SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+
+ // Remember currentDelayFrames for the next ProcessBlock call
+ mCurrentDelay = aPerFrameDelays[WEBAUDIO_BLOCK_SIZE - 1];
+}
+
+void
+DelayBuffer::ReadChannel(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
+ AudioBlock* aOutputChunk, uint32_t aChannel,
+ ChannelInterpretation aChannelInterpretation)
+{
+ if (!mChunks.Length()) {
+ float* outputChannel = aOutputChunk->ChannelFloatsForWrite(aChannel);
+ PodZero(outputChannel, WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ ReadChannels(aPerFrameDelays, aOutputChunk,
+ aChannel, 1, aChannelInterpretation);
+}
+
+void
+DelayBuffer::ReadChannels(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
+ AudioBlock* aOutputChunk,
+ uint32_t aFirstChannel, uint32_t aNumChannelsToRead,
+ ChannelInterpretation aChannelInterpretation)
+{
+ uint32_t totalChannelCount = aOutputChunk->ChannelCount();
+ uint32_t readChannelsEnd = aFirstChannel + aNumChannelsToRead;
+ MOZ_ASSERT(readChannelsEnd <= totalChannelCount);
+
+ if (mUpmixChannels.Length() != totalChannelCount) {
+ mLastReadChunk = -1; // invalidate cache
+ }
+
+ for (uint32_t channel = aFirstChannel;
+ channel < readChannelsEnd; ++channel) {
+ PodZero(aOutputChunk->ChannelFloatsForWrite(channel), WEBAUDIO_BLOCK_SIZE);
+ }
+
+ for (unsigned i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ double currentDelay = aPerFrameDelays[i];
+ MOZ_ASSERT(currentDelay >= 0.0);
+ MOZ_ASSERT(currentDelay <= (mChunks.Length() - 1) * WEBAUDIO_BLOCK_SIZE);
+
+ // Interpolate two input frames in case the read position does not match
+ // an integer index.
+ // Use the larger delay, for the older frame, first, as this is more
+ // likely to use the cached upmixed channel arrays.
+ int floorDelay = int(currentDelay);
+ double interpolationFactor = currentDelay - floorDelay;
+ int positions[2];
+ positions[1] = PositionForDelay(floorDelay) + i;
+ positions[0] = positions[1] - 1;
+
+ for (unsigned tick = 0; tick < ArrayLength(positions); ++tick) {
+ int readChunk = ChunkForPosition(positions[tick]);
+ // mVolume is not set on default initialized chunks so handle null
+ // chunks specially.
+ if (!mChunks[readChunk].IsNull()) {
+ int readOffset = OffsetForPosition(positions[tick]);
+ UpdateUpmixChannels(readChunk, totalChannelCount,
+ aChannelInterpretation);
+ double multiplier = interpolationFactor * mChunks[readChunk].mVolume;
+ for (uint32_t channel = aFirstChannel;
+ channel < readChannelsEnd; ++channel) {
+ aOutputChunk->ChannelFloatsForWrite(channel)[i] += multiplier *
+ mUpmixChannels[channel][readOffset];
+ }
+ }
+
+ interpolationFactor = 1.0 - interpolationFactor;
+ }
+ }
+}
+
+void
+DelayBuffer::Read(double aDelayTicks, AudioBlock* aOutputChunk,
+ ChannelInterpretation aChannelInterpretation)
+{
+ const bool firstTime = mCurrentDelay < 0.0;
+ double currentDelay = firstTime ? aDelayTicks : mCurrentDelay;
+
+ double computedDelay[WEBAUDIO_BLOCK_SIZE];
+
+ for (unsigned i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ // If the value has changed, smoothly approach it
+ currentDelay += (aDelayTicks - currentDelay) * mSmoothingRate;
+ computedDelay[i] = currentDelay;
+ }
+
+ Read(computedDelay, aOutputChunk, aChannelInterpretation);
+}
+
+bool
+DelayBuffer::EnsureBuffer()
+{
+ if (mChunks.Length() == 0) {
+ // The length of the buffer is at least one block greater than the maximum
+ // delay so that writing an input block does not overwrite the block that
+ // would subsequently be read at maximum delay. Also round up to the next
+ // block size, so that no block of writes will need to wrap.
+ const int chunkCount = (mMaxDelayTicks + 2 * WEBAUDIO_BLOCK_SIZE - 1) >>
+ WEBAUDIO_BLOCK_SIZE_BITS;
+ if (!mChunks.SetLength(chunkCount, fallible)) {
+ return false;
+ }
+
+ mLastReadChunk = -1;
+ }
+ return true;
+}
+
+int
+DelayBuffer::PositionForDelay(int aDelay) {
+ // Adding mChunks.Length() keeps integers positive for defined and
+ // appropriate bitshift, remainder, and bitwise operations.
+ return ((mCurrentChunk + mChunks.Length()) * WEBAUDIO_BLOCK_SIZE) - aDelay;
+}
+
+int
+DelayBuffer::ChunkForPosition(int aPosition)
+{
+ MOZ_ASSERT(aPosition >= 0);
+ return (aPosition >> WEBAUDIO_BLOCK_SIZE_BITS) % mChunks.Length();
+}
+
+int
+DelayBuffer::OffsetForPosition(int aPosition)
+{
+ MOZ_ASSERT(aPosition >= 0);
+ return aPosition & (WEBAUDIO_BLOCK_SIZE - 1);
+}
+
+int
+DelayBuffer::ChunkForDelay(int aDelay)
+{
+ return ChunkForPosition(PositionForDelay(aDelay));
+}
+
+void
+DelayBuffer::UpdateUpmixChannels(int aNewReadChunk, uint32_t aChannelCount,
+ ChannelInterpretation aChannelInterpretation)
+{
+ if (aNewReadChunk == mLastReadChunk) {
+ MOZ_ASSERT(mUpmixChannels.Length() == aChannelCount);
+ return;
+ }
+
+ NS_WARNING_ASSERTION(mHaveWrittenBlock || aNewReadChunk != mCurrentChunk,
+ "Smoothing is making feedback delay too small.");
+
+ mLastReadChunk = aNewReadChunk;
+ mUpmixChannels = mChunks[aNewReadChunk].ChannelData<float>();
+ MOZ_ASSERT(mUpmixChannels.Length() <= aChannelCount);
+ if (mUpmixChannels.Length() < aChannelCount) {
+ if (aChannelInterpretation == ChannelInterpretation::Speakers) {
+ AudioChannelsUpMix(&mUpmixChannels,
+ aChannelCount, SilentChannel::ZeroChannel<float>());
+ MOZ_ASSERT(mUpmixChannels.Length() == aChannelCount,
+ "We called GetAudioChannelsSuperset to avoid this");
+ } else {
+ // Fill up the remaining channels with zeros
+ for (uint32_t channel = mUpmixChannels.Length();
+ channel < aChannelCount; ++channel) {
+ mUpmixChannels.AppendElement(SilentChannel::ZeroChannel<float>());
+ }
+ }
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/DelayBuffer.h b/dom/media/webaudio/DelayBuffer.h
new file mode 100644
index 000000000..e55d0ba83
--- /dev/null
+++ b/dom/media/webaudio/DelayBuffer.h
@@ -0,0 +1,115 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DelayBuffer_h_
+#define DelayBuffer_h_
+
+#include "nsTArray.h"
+#include "AudioSegment.h"
+#include "mozilla/dom/AudioNodeBinding.h" // for ChannelInterpretation
+
+namespace mozilla {
+
+class DelayBuffer final
+{
+ typedef dom::ChannelInterpretation ChannelInterpretation;
+
+public:
+ // See WebAudioUtils::ComputeSmoothingRate() for frame to frame exponential
+ // |smoothingRate| multiplier.
+ DelayBuffer(double aMaxDelayTicks, double aSmoothingRate)
+ : mSmoothingRate(aSmoothingRate)
+ , mCurrentDelay(-1.0)
+ // Round the maximum delay up to the next tick.
+ , mMaxDelayTicks(ceil(aMaxDelayTicks))
+ , mCurrentChunk(0)
+ // mLastReadChunk is initialized in EnsureBuffer
+#ifdef DEBUG
+ , mHaveWrittenBlock(false)
+#endif
+ {
+ // The 180 second limit in AudioContext::CreateDelay() and the
+ // 1 << MEDIA_TIME_FRAC_BITS limit on sample rate provide a limit on the
+ // maximum delay.
+ MOZ_ASSERT(aMaxDelayTicks <=
+ std::numeric_limits<decltype(mMaxDelayTicks)>::max());
+ }
+
+ // Write a WEBAUDIO_BLOCK_SIZE block for aChannelCount channels.
+ void Write(const AudioBlock& aInputChunk);
+
+ // Read a block with an array of delays, in ticks, for each sample frame.
+ // Each delay should be >= 0 and <= MaxDelayTicks().
+ void Read(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
+ AudioBlock* aOutputChunk,
+ ChannelInterpretation aChannelInterpretation);
+ // Read a block with a constant delay, which will be smoothed with the
+ // previous delay. The delay should be >= 0 and <= MaxDelayTicks().
+ void Read(double aDelayTicks, AudioBlock* aOutputChunk,
+ ChannelInterpretation aChannelInterpretation);
+
+ // Read into one of the channels of aOutputChunk, given an array of
+ // delays in ticks. This is useful when delays are different on different
+ // channels. aOutputChunk must have already been allocated with at least as
+ // many channels as were in any of the blocks passed to Write().
+ void ReadChannel(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
+ AudioBlock* aOutputChunk, uint32_t aChannel,
+ ChannelInterpretation aChannelInterpretation);
+
+ // Advance the buffer pointer
+ void NextBlock()
+ {
+ mCurrentChunk = (mCurrentChunk + 1) % mChunks.Length();
+#ifdef DEBUG
+ MOZ_ASSERT(mHaveWrittenBlock);
+ mHaveWrittenBlock = false;
+#endif
+ }
+
+ void Reset() {
+ mChunks.Clear();
+ mCurrentDelay = -1.0;
+ };
+
+ int MaxDelayTicks() const { return mMaxDelayTicks; }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
+
+private:
+ void ReadChannels(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
+ AudioBlock* aOutputChunk,
+ uint32_t aFirstChannel, uint32_t aNumChannelsToRead,
+ ChannelInterpretation aChannelInterpretation);
+ bool EnsureBuffer();
+ int PositionForDelay(int aDelay);
+ int ChunkForPosition(int aPosition);
+ int OffsetForPosition(int aPosition);
+ int ChunkForDelay(int aDelay);
+ void UpdateUpmixChannels(int aNewReadChunk, uint32_t channelCount,
+ ChannelInterpretation aChannelInterpretation);
+
+ // Circular buffer for capturing delayed samples.
+ FallibleTArray<AudioChunk> mChunks;
+ // Cache upmixed channel arrays.
+ AutoTArray<const float*,GUESS_AUDIO_CHANNELS> mUpmixChannels;
+ double mSmoothingRate;
+ // Current delay, in fractional ticks
+ double mCurrentDelay;
+ // Maximum delay, in ticks
+ int mMaxDelayTicks;
+ // The current position in the circular buffer. The next write will be to
+ // this chunk, and the next read may begin before this chunk.
+ int mCurrentChunk;
+ // The chunk owning the pointers in mUpmixChannels
+ int mLastReadChunk;
+#ifdef DEBUG
+ bool mHaveWrittenBlock;
+#endif
+};
+
+} // namespace mozilla
+
+#endif // DelayBuffer_h_
diff --git a/dom/media/webaudio/DelayNode.cpp b/dom/media/webaudio/DelayNode.cpp
new file mode 100644
index 000000000..17dc72514
--- /dev/null
+++ b/dom/media/webaudio/DelayNode.cpp
@@ -0,0 +1,234 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DelayNode.h"
+#include "mozilla/dom/DelayNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "WebAudioUtils.h"
+#include "DelayBuffer.h"
+#include "PlayingRefChangeHandler.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(DelayNode, AudioNode,
+ mDelay)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DelayNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(DelayNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(DelayNode, AudioNode)
+
+class DelayNodeEngine final : public AudioNodeEngine
+{
+ typedef PlayingRefChangeHandler PlayingRefChanged;
+public:
+ DelayNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination,
+ double aMaxDelayTicks)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ // Keep the default value in sync with the default value in DelayNode::DelayNode.
+ , mDelay(0.f)
+ // Use a smoothing range of 20ms
+ , mBuffer(std::max(aMaxDelayTicks,
+ static_cast<double>(WEBAUDIO_BLOCK_SIZE)),
+ WebAudioUtils::ComputeSmoothingRate(0.02,
+ mDestination->SampleRate()))
+ , mMaxDelay(aMaxDelayTicks)
+ , mHaveProducedBeforeInput(false)
+ , mLeftOverData(INT32_MIN)
+ {
+ }
+
+ DelayNodeEngine* AsDelayNodeEngine() override
+ {
+ return this;
+ }
+
+ enum Parameters {
+ DELAY,
+ };
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case DELAY:
+ mDelay.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad DelayNodeEngine TimelineParameter");
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ MOZ_ASSERT(aStream->SampleRate() == mDestination->SampleRate());
+
+ if (!aInput.IsSilentOrSubnormal()) {
+ if (mLeftOverData <= 0) {
+ RefPtr<PlayingRefChanged> refchanged =
+ new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+ mLeftOverData = mBuffer.MaxDelayTicks();
+ } else if (mLeftOverData > 0) {
+ mLeftOverData -= WEBAUDIO_BLOCK_SIZE;
+ } else {
+ if (mLeftOverData != INT32_MIN) {
+ mLeftOverData = INT32_MIN;
+ aStream->ScheduleCheckForInactive();
+
+ // Delete our buffered data now we no longer need it
+ mBuffer.Reset();
+
+ RefPtr<PlayingRefChanged> refchanged =
+ new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ mBuffer.Write(aInput);
+
+ // Skip output update if mLastChunks has already been set by
+ // ProduceBlockBeforeInput() when in a cycle.
+ if (!mHaveProducedBeforeInput) {
+ UpdateOutputBlock(aStream, aFrom, aOutput, 0.0);
+ }
+ mHaveProducedBeforeInput = false;
+ mBuffer.NextBlock();
+ }
+
+ void UpdateOutputBlock(AudioNodeStream* aStream, GraphTime aFrom,
+ AudioBlock* aOutput, double minDelay)
+ {
+ double maxDelay = mMaxDelay;
+ double sampleRate = aStream->SampleRate();
+ ChannelInterpretation channelInterpretation =
+ aStream->GetChannelInterpretation();
+ if (mDelay.HasSimpleValue()) {
+ // If this DelayNode is in a cycle, make sure the delay value is at least
+ // one block, even if that is greater than maxDelay.
+ double delayFrames = mDelay.GetValue() * sampleRate;
+ double delayFramesClamped =
+ std::max(minDelay, std::min(delayFrames, maxDelay));
+ mBuffer.Read(delayFramesClamped, aOutput, channelInterpretation);
+ } else {
+ // Compute the delay values for the duration of the input AudioChunk
+ // If this DelayNode is in a cycle, make sure the delay value is at least
+ // one block.
+ StreamTime tick = mDestination->GraphTimeToStreamTime(aFrom);
+ float values[WEBAUDIO_BLOCK_SIZE];
+ mDelay.GetValuesAtTime(tick, values,WEBAUDIO_BLOCK_SIZE);
+
+ double computedDelay[WEBAUDIO_BLOCK_SIZE];
+ for (size_t counter = 0; counter < WEBAUDIO_BLOCK_SIZE; ++counter) {
+ double delayAtTick = values[counter] * sampleRate;
+ double delayAtTickClamped =
+ std::max(minDelay, std::min(delayAtTick, maxDelay));
+ computedDelay[counter] = delayAtTickClamped;
+ }
+ mBuffer.Read(computedDelay, aOutput, channelInterpretation);
+ }
+ }
+
+ void ProduceBlockBeforeInput(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ AudioBlock* aOutput) override
+ {
+ if (mLeftOverData <= 0) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ } else {
+ UpdateOutputBlock(aStream, aFrom, aOutput, WEBAUDIO_BLOCK_SIZE);
+ }
+ mHaveProducedBeforeInput = true;
+ }
+
+ bool IsActive() const override
+ {
+ return mLeftOverData != INT32_MIN;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ // Not owned:
+ // - mDestination - probably not owned
+ // - mDelay - shares ref with AudioNode, don't count
+ amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ AudioNodeStream* mDestination;
+ AudioParamTimeline mDelay;
+ DelayBuffer mBuffer;
+ double mMaxDelay;
+ bool mHaveProducedBeforeInput;
+ // How much data we have in our buffer which needs to be flushed out when our inputs
+ // finish.
+ int32_t mLeftOverData;
+};
+
+DelayNode::DelayNode(AudioContext* aContext, double aMaxDelay)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mDelay(new AudioParam(this, DelayNodeEngine::DELAY, 0.0f, "delayTime"))
+{
+ DelayNodeEngine* engine =
+ new DelayNodeEngine(this, aContext->Destination(),
+ aContext->SampleRate() * aMaxDelay);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+DelayNode::~DelayNode()
+{
+}
+
+size_t
+DelayNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mDelay->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+DelayNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+DelayNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return DelayNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/DelayNode.h b/dom/media/webaudio/DelayNode.h
new file mode 100644
index 000000000..dfee970bc
--- /dev/null
+++ b/dom/media/webaudio/DelayNode.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DelayNode_h_
+#define DelayNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class DelayNode final : public AudioNode
+{
+public:
+ DelayNode(AudioContext* aContext, double aMaxDelay);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DelayNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioParam* DelayTime() const
+ {
+ return mDelay;
+ }
+
+ const char* NodeType() const override
+ {
+ return "DelayNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~DelayNode();
+
+private:
+ friend class DelayNodeEngine;
+
+private:
+ RefPtr<AudioParam> mDelay;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/DynamicsCompressorNode.cpp b/dom/media/webaudio/DynamicsCompressorNode.cpp
new file mode 100644
index 000000000..3a3dc9849
--- /dev/null
+++ b/dom/media/webaudio/DynamicsCompressorNode.cpp
@@ -0,0 +1,237 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "DynamicsCompressorNode.h"
+#include "mozilla/dom/DynamicsCompressorNodeBinding.h"
+#include "nsAutoPtr.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "WebAudioUtils.h"
+#include "blink/DynamicsCompressor.h"
+
+using WebCore::DynamicsCompressor;
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(DynamicsCompressorNode, AudioNode,
+ mThreshold,
+ mKnee,
+ mRatio,
+ mAttack,
+ mRelease)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DynamicsCompressorNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(DynamicsCompressorNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(DynamicsCompressorNode, AudioNode)
+
+class DynamicsCompressorNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit DynamicsCompressorNodeEngine(AudioNode* aNode,
+ AudioDestinationNode* aDestination)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ // Keep the default value in sync with the default value in
+ // DynamicsCompressorNode::DynamicsCompressorNode.
+ , mThreshold(-24.f)
+ , mKnee(30.f)
+ , mRatio(12.f)
+ , mAttack(0.003f)
+ , mRelease(0.25f)
+ , mCompressor(new DynamicsCompressor(mDestination->SampleRate(), 2))
+ {
+ }
+
+ enum Parameters {
+ THRESHOLD,
+ KNEE,
+ RATIO,
+ ATTACK,
+ RELEASE
+ };
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case THRESHOLD:
+ mThreshold.InsertEvent<int64_t>(aEvent);
+ break;
+ case KNEE:
+ mKnee.InsertEvent<int64_t>(aEvent);
+ break;
+ case RATIO:
+ mRatio.InsertEvent<int64_t>(aEvent);
+ break;
+ case ATTACK:
+ mAttack.InsertEvent<int64_t>(aEvent);
+ break;
+ case RELEASE:
+ mRelease.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad DynamicsCompresssorNodeEngine TimelineParameter");
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ if (aInput.IsNull()) {
+ // Just output silence
+ *aOutput = aInput;
+ return;
+ }
+
+ const uint32_t channelCount = aInput.ChannelCount();
+ if (mCompressor->numberOfChannels() != channelCount) {
+ // Create a new compressor object with a new channel count
+ mCompressor = new WebCore::DynamicsCompressor(aStream->SampleRate(),
+ aInput.ChannelCount());
+ }
+
+ StreamTime pos = mDestination->GraphTimeToStreamTime(aFrom);
+ mCompressor->setParameterValue(DynamicsCompressor::ParamThreshold,
+ mThreshold.GetValueAtTime(pos));
+ mCompressor->setParameterValue(DynamicsCompressor::ParamKnee,
+ mKnee.GetValueAtTime(pos));
+ mCompressor->setParameterValue(DynamicsCompressor::ParamRatio,
+ mRatio.GetValueAtTime(pos));
+ mCompressor->setParameterValue(DynamicsCompressor::ParamAttack,
+ mAttack.GetValueAtTime(pos));
+ mCompressor->setParameterValue(DynamicsCompressor::ParamRelease,
+ mRelease.GetValueAtTime(pos));
+
+ aOutput->AllocateChannels(channelCount);
+ mCompressor->process(&aInput, aOutput, aInput.GetDuration());
+
+ SendReductionParamToMainThread(aStream,
+ mCompressor->parameterValue(DynamicsCompressor::ParamReduction));
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mDestination (probably)
+ // - Don't count the AudioParamTimelines, their inner refs are owned by the
+ // AudioNode.
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mCompressor->sizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ void SendReductionParamToMainThread(AudioNodeStream* aStream, float aReduction)
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+
+ class Command final : public Runnable
+ {
+ public:
+ Command(AudioNodeStream* aStream, float aReduction)
+ : mStream(aStream)
+ , mReduction(aReduction)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<DynamicsCompressorNode> node =
+ static_cast<DynamicsCompressorNode*>
+ (mStream->Engine()->NodeMainThread());
+ if (node) {
+ node->SetReduction(mReduction);
+ }
+ return NS_OK;
+ }
+
+ private:
+ RefPtr<AudioNodeStream> mStream;
+ float mReduction;
+ };
+
+ NS_DispatchToMainThread(new Command(aStream, aReduction));
+ }
+
+private:
+ AudioNodeStream* mDestination;
+ AudioParamTimeline mThreshold;
+ AudioParamTimeline mKnee;
+ AudioParamTimeline mRatio;
+ AudioParamTimeline mAttack;
+ AudioParamTimeline mRelease;
+ nsAutoPtr<DynamicsCompressor> mCompressor;
+};
+
+DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Explicit,
+ ChannelInterpretation::Speakers)
+ , mThreshold(new AudioParam(this, DynamicsCompressorNodeEngine::THRESHOLD,
+ -24.f, "threshold"))
+ , mKnee(new AudioParam(this, DynamicsCompressorNodeEngine::KNEE,
+ 30.f, "knee"))
+ , mRatio(new AudioParam(this, DynamicsCompressorNodeEngine::RATIO,
+ 12.f, "ratio"))
+ , mReduction(0)
+ , mAttack(new AudioParam(this, DynamicsCompressorNodeEngine::ATTACK,
+ 0.003f, "attack"))
+ , mRelease(new AudioParam(this, DynamicsCompressorNodeEngine::RELEASE,
+ 0.25f, "release"))
+{
+ DynamicsCompressorNodeEngine* engine = new DynamicsCompressorNodeEngine(this, aContext->Destination());
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+DynamicsCompressorNode::~DynamicsCompressorNode()
+{
+}
+
+size_t
+DynamicsCompressorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mThreshold->SizeOfIncludingThis(aMallocSizeOf);
+ amount += mKnee->SizeOfIncludingThis(aMallocSizeOf);
+ amount += mRatio->SizeOfIncludingThis(aMallocSizeOf);
+ amount += mAttack->SizeOfIncludingThis(aMallocSizeOf);
+ amount += mRelease->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+DynamicsCompressorNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+DynamicsCompressorNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return DynamicsCompressorNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/DynamicsCompressorNode.h b/dom/media/webaudio/DynamicsCompressorNode.h
new file mode 100644
index 000000000..5bdd5f2d0
--- /dev/null
+++ b/dom/media/webaudio/DynamicsCompressorNode.h
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DynamicsCompressorNode_h_
+#define DynamicsCompressorNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class DynamicsCompressorNode final : public AudioNode
+{
+public:
+ explicit DynamicsCompressorNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DynamicsCompressorNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioParam* Threshold() const
+ {
+ return mThreshold;
+ }
+
+ AudioParam* Knee() const
+ {
+ return mKnee;
+ }
+
+ AudioParam* Ratio() const
+ {
+ return mRatio;
+ }
+
+ AudioParam* Attack() const
+ {
+ return mAttack;
+ }
+
+ // Called GetRelease to prevent clashing with the nsISupports::Release name
+ AudioParam* GetRelease() const
+ {
+ return mRelease;
+ }
+
+ float Reduction() const
+ {
+ return mReduction;
+ }
+
+ const char* NodeType() const override
+ {
+ return "DynamicsCompressorNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+ void SetReduction(float aReduction)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mReduction = aReduction;
+ }
+
+protected:
+ virtual ~DynamicsCompressorNode();
+
+private:
+ RefPtr<AudioParam> mThreshold;
+ RefPtr<AudioParam> mKnee;
+ RefPtr<AudioParam> mRatio;
+ float mReduction;
+ RefPtr<AudioParam> mAttack;
+ RefPtr<AudioParam> mRelease;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/FFTBlock.cpp b/dom/media/webaudio/FFTBlock.cpp
new file mode 100644
index 000000000..f517ef283
--- /dev/null
+++ b/dom/media/webaudio/FFTBlock.cpp
@@ -0,0 +1,226 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:set ts=4 sw=4 sts=4 et cindent: */
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "FFTBlock.h"
+
+#include <complex>
+
+namespace mozilla {
+
+typedef std::complex<double> Complex;
+
+FFTBlock* FFTBlock::CreateInterpolatedBlock(const FFTBlock& block0, const FFTBlock& block1, double interp)
+{
+ FFTBlock* newBlock = new FFTBlock(block0.FFTSize());
+
+ newBlock->InterpolateFrequencyComponents(block0, block1, interp);
+
+ // In the time-domain, the 2nd half of the response must be zero, to avoid circular convolution aliasing...
+ int fftSize = newBlock->FFTSize();
+ AlignedTArray<float> buffer(fftSize);
+ newBlock->GetInverseWithoutScaling(buffer.Elements());
+ AudioBufferInPlaceScale(buffer.Elements(), 1.0f / fftSize, fftSize / 2);
+ PodZero(buffer.Elements() + fftSize / 2, fftSize / 2);
+
+ // Put back into frequency domain.
+ newBlock->PerformFFT(buffer.Elements());
+
+ return newBlock;
+}
+
+void FFTBlock::InterpolateFrequencyComponents(const FFTBlock& block0, const FFTBlock& block1, double interp)
+{
+ // FIXME : with some work, this method could be optimized
+
+ ComplexU* dft = mOutputBuffer.Elements();
+
+ const ComplexU* dft1 = block0.mOutputBuffer.Elements();
+ const ComplexU* dft2 = block1.mOutputBuffer.Elements();
+
+ MOZ_ASSERT(mFFTSize == block0.FFTSize());
+ MOZ_ASSERT(mFFTSize == block1.FFTSize());
+ double s1base = (1.0 - interp);
+ double s2base = interp;
+
+ double phaseAccum = 0.0;
+ double lastPhase1 = 0.0;
+ double lastPhase2 = 0.0;
+
+ int n = mFFTSize / 2;
+
+ dft[0].r = static_cast<float>(s1base * dft1[0].r + s2base * dft2[0].r);
+ dft[n].r = static_cast<float>(s1base * dft1[n].r + s2base * dft2[n].r);
+
+ for (int i = 1; i < n; ++i) {
+ Complex c1(dft1[i].r, dft1[i].i);
+ Complex c2(dft2[i].r, dft2[i].i);
+
+ double mag1 = abs(c1);
+ double mag2 = abs(c2);
+
+ // Interpolate magnitudes in decibels
+ double mag1db = 20.0 * log10(mag1);
+ double mag2db = 20.0 * log10(mag2);
+
+ double s1 = s1base;
+ double s2 = s2base;
+
+ double magdbdiff = mag1db - mag2db;
+
+ // Empirical tweak to retain higher-frequency zeroes
+ double threshold = (i > 16) ? 5.0 : 2.0;
+
+ if (magdbdiff < -threshold && mag1db < 0.0) {
+ s1 = pow(s1, 0.75);
+ s2 = 1.0 - s1;
+ } else if (magdbdiff > threshold && mag2db < 0.0) {
+ s2 = pow(s2, 0.75);
+ s1 = 1.0 - s2;
+ }
+
+ // Average magnitude by decibels instead of linearly
+ double magdb = s1 * mag1db + s2 * mag2db;
+ double mag = pow(10.0, 0.05 * magdb);
+
+ // Now, deal with phase
+ double phase1 = arg(c1);
+ double phase2 = arg(c2);
+
+ double deltaPhase1 = phase1 - lastPhase1;
+ double deltaPhase2 = phase2 - lastPhase2;
+ lastPhase1 = phase1;
+ lastPhase2 = phase2;
+
+ // Unwrap phase deltas
+ if (deltaPhase1 > M_PI)
+ deltaPhase1 -= 2.0 * M_PI;
+ if (deltaPhase1 < -M_PI)
+ deltaPhase1 += 2.0 * M_PI;
+ if (deltaPhase2 > M_PI)
+ deltaPhase2 -= 2.0 * M_PI;
+ if (deltaPhase2 < -M_PI)
+ deltaPhase2 += 2.0 * M_PI;
+
+ // Blend group-delays
+ double deltaPhaseBlend;
+
+ if (deltaPhase1 - deltaPhase2 > M_PI)
+ deltaPhaseBlend = s1 * deltaPhase1 + s2 * (2.0 * M_PI + deltaPhase2);
+ else if (deltaPhase2 - deltaPhase1 > M_PI)
+ deltaPhaseBlend = s1 * (2.0 * M_PI + deltaPhase1) + s2 * deltaPhase2;
+ else
+ deltaPhaseBlend = s1 * deltaPhase1 + s2 * deltaPhase2;
+
+ phaseAccum += deltaPhaseBlend;
+
+ // Unwrap
+ if (phaseAccum > M_PI)
+ phaseAccum -= 2.0 * M_PI;
+ if (phaseAccum < -M_PI)
+ phaseAccum += 2.0 * M_PI;
+
+ dft[i].r = static_cast<float>(mag * cos(phaseAccum));
+ dft[i].i = static_cast<float>(mag * sin(phaseAccum));
+ }
+}
+
+double FFTBlock::ExtractAverageGroupDelay()
+{
+ ComplexU* dft = mOutputBuffer.Elements();
+
+ double aveSum = 0.0;
+ double weightSum = 0.0;
+ double lastPhase = 0.0;
+
+ int halfSize = FFTSize() / 2;
+
+ const double kSamplePhaseDelay = (2.0 * M_PI) / double(FFTSize());
+
+ // Remove DC offset
+ dft[0].r = 0.0f;
+
+ // Calculate weighted average group delay
+ for (int i = 1; i < halfSize; i++) {
+ Complex c(dft[i].r, dft[i].i);
+ double mag = abs(c);
+ double phase = arg(c);
+
+ double deltaPhase = phase - lastPhase;
+ lastPhase = phase;
+
+ // Unwrap
+ if (deltaPhase < -M_PI)
+ deltaPhase += 2.0 * M_PI;
+ if (deltaPhase > M_PI)
+ deltaPhase -= 2.0 * M_PI;
+
+ aveSum += mag * deltaPhase;
+ weightSum += mag;
+ }
+
+ // Note how we invert the phase delta wrt frequency since this is how group delay is defined
+ double ave = aveSum / weightSum;
+ double aveSampleDelay = -ave / kSamplePhaseDelay;
+
+ // Leave 20 sample headroom (for leading edge of impulse)
+ aveSampleDelay -= 20.0;
+ if (aveSampleDelay <= 0.0)
+ return 0.0;
+
+ // Remove average group delay (minus 20 samples for headroom)
+ AddConstantGroupDelay(-aveSampleDelay);
+
+ return aveSampleDelay;
+}
+
+void FFTBlock::AddConstantGroupDelay(double sampleFrameDelay)
+{
+ int halfSize = FFTSize() / 2;
+
+ ComplexU* dft = mOutputBuffer.Elements();
+
+ const double kSamplePhaseDelay = (2.0 * M_PI) / double(FFTSize());
+
+ double phaseAdj = -sampleFrameDelay * kSamplePhaseDelay;
+
+ // Add constant group delay
+ for (int i = 1; i < halfSize; i++) {
+ Complex c(dft[i].r, dft[i].i);
+ double mag = abs(c);
+ double phase = arg(c);
+
+ phase += i * phaseAdj;
+
+ dft[i].r = static_cast<float>(mag * cos(phase));
+ dft[i].i = static_cast<float>(mag * sin(phase));
+ }
+}
+
+} // namespace mozilla
diff --git a/dom/media/webaudio/FFTBlock.h b/dom/media/webaudio/FFTBlock.h
new file mode 100644
index 000000000..84b9f38aa
--- /dev/null
+++ b/dom/media/webaudio/FFTBlock.h
@@ -0,0 +1,319 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef FFTBlock_h_
+#define FFTBlock_h_
+
+#ifdef BUILD_ARM_NEON
+#include <cmath>
+#include "mozilla/arm.h"
+#include "dl/sp/api/omxSP.h"
+#endif
+
+#include "AlignedTArray.h"
+#include "AudioNodeEngine.h"
+#if defined(MOZ_LIBAV_FFT)
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "libavcodec/avfft.h"
+#ifdef __cplusplus
+}
+#endif
+#else
+#include "kiss_fft/kiss_fftr.h"
+#endif
+
+namespace mozilla {
+
+// This class defines an FFT block, loosely modeled after Blink's FFTFrame
+// class to make sharing code with Blink easy.
+// Currently it's implemented on top of KissFFT on all platforms.
+class FFTBlock final
+{
+ union ComplexU {
+#if !defined(MOZ_LIBAV_FFT)
+ kiss_fft_cpx c;
+#endif
+ float f[2];
+ struct {
+ float r;
+ float i;
+ };
+ };
+
+public:
+ explicit FFTBlock(uint32_t aFFTSize)
+#if defined(MOZ_LIBAV_FFT)
+ : mAvRDFT(nullptr)
+ , mAvIRDFT(nullptr)
+#else
+ : mKissFFT(nullptr)
+ , mKissIFFT(nullptr)
+#ifdef BUILD_ARM_NEON
+ , mOmxFFT(nullptr)
+ , mOmxIFFT(nullptr)
+#endif
+#endif
+ {
+ MOZ_COUNT_CTOR(FFTBlock);
+ SetFFTSize(aFFTSize);
+ }
+ ~FFTBlock()
+ {
+ MOZ_COUNT_DTOR(FFTBlock);
+ Clear();
+ }
+
+ // Return a new FFTBlock with frequency components interpolated between
+ // |block0| and |block1| with |interp| between 0.0 and 1.0.
+ static FFTBlock*
+ CreateInterpolatedBlock(const FFTBlock& block0,
+ const FFTBlock& block1, double interp);
+
+ // Transform FFTSize() points of aData and store the result internally.
+ void PerformFFT(const float* aData)
+ {
+ EnsureFFT();
+#if defined(MOZ_LIBAV_FFT)
+ PodCopy(mOutputBuffer.Elements()->f, aData, mFFTSize);
+ av_rdft_calc(mAvRDFT, mOutputBuffer.Elements()->f);
+ // Recover packed Nyquist.
+ mOutputBuffer[mFFTSize / 2].r = mOutputBuffer[0].i;
+ mOutputBuffer[0].i = 0.0f;
+#else
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ omxSP_FFTFwd_RToCCS_F32_Sfs(aData, mOutputBuffer.Elements()->f, mOmxFFT);
+ } else
+#endif
+ {
+ kiss_fftr(mKissFFT, aData, &(mOutputBuffer.Elements()->c));
+ }
+#endif
+ }
+ // Inverse-transform internal data and store the resulting FFTSize()
+ // points in aDataOut.
+ void GetInverse(float* aDataOut)
+ {
+ GetInverseWithoutScaling(aDataOut);
+ AudioBufferInPlaceScale(aDataOut, 1.0f / mFFTSize, mFFTSize);
+ }
+ // Inverse-transform internal frequency data and store the resulting
+ // FFTSize() points in |aDataOut|. If frequency data has not already been
+ // scaled, then the output will need scaling by 1/FFTSize().
+ void GetInverseWithoutScaling(float* aDataOut)
+ {
+ EnsureIFFT();
+#if defined(MOZ_LIBAV_FFT)
+ {
+ // Even though this function doesn't scale, the libav forward transform
+ // gives a value that needs scaling by 2 in order for things to turn out
+ // similar to how we expect from kissfft/openmax.
+ AudioBufferCopyWithScale(mOutputBuffer.Elements()->f, 2.0f,
+ aDataOut, mFFTSize);
+ aDataOut[1] = 2.0f * mOutputBuffer[mFFTSize/2].r; // Packed Nyquist
+ av_rdft_calc(mAvIRDFT, aDataOut);
+ }
+#else
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ omxSP_FFTInv_CCSToR_F32_Sfs_unscaled(mOutputBuffer.Elements()->f, aDataOut, mOmxIFFT);
+ } else
+#endif
+ {
+ kiss_fftri(mKissIFFT, &(mOutputBuffer.Elements()->c), aDataOut);
+ }
+#endif
+ }
+
+ void Multiply(const FFTBlock& aFrame)
+ {
+ uint32_t halfSize = mFFTSize / 2;
+ // DFTs are not packed.
+ MOZ_ASSERT(mOutputBuffer[0].i == 0);
+ MOZ_ASSERT(aFrame.mOutputBuffer[0].i == 0);
+
+ BufferComplexMultiply(mOutputBuffer.Elements()->f,
+ aFrame.mOutputBuffer.Elements()->f,
+ mOutputBuffer.Elements()->f,
+ halfSize);
+ mOutputBuffer[halfSize].r *= aFrame.mOutputBuffer[halfSize].r;
+ // This would have been set to NaN if either real component was NaN.
+ mOutputBuffer[0].i = 0.0f;
+ }
+
+ // Perform a forward FFT on |aData|, assuming zeros after dataSize samples,
+ // and pre-scale the generated internal frequency domain coefficients so
+ // that GetInverseWithoutScaling() can be used to transform to the time
+ // domain. This is useful for convolution kernels.
+ void PadAndMakeScaledDFT(const float* aData, size_t dataSize)
+ {
+ MOZ_ASSERT(dataSize <= FFTSize());
+ AlignedTArray<float> paddedData;
+ paddedData.SetLength(FFTSize());
+ AudioBufferCopyWithScale(aData, 1.0f / FFTSize(),
+ paddedData.Elements(), dataSize);
+ PodZero(paddedData.Elements() + dataSize, mFFTSize - dataSize);
+ PerformFFT(paddedData.Elements());
+ }
+
+ void SetFFTSize(uint32_t aSize)
+ {
+ mFFTSize = aSize;
+ mOutputBuffer.SetLength(aSize / 2 + 1);
+ PodZero(mOutputBuffer.Elements(), aSize / 2 + 1);
+ Clear();
+ }
+
+ // Return the average group delay and removes this from the frequency data.
+ double ExtractAverageGroupDelay();
+
+ uint32_t FFTSize() const
+ {
+ return mFFTSize;
+ }
+ float RealData(uint32_t aIndex) const
+ {
+ return mOutputBuffer[aIndex].r;
+ }
+ float& RealData(uint32_t aIndex)
+ {
+ return mOutputBuffer[aIndex].r;
+ }
+ float ImagData(uint32_t aIndex) const
+ {
+ return mOutputBuffer[aIndex].i;
+ }
+ float& ImagData(uint32_t aIndex)
+ {
+ return mOutputBuffer[aIndex].i;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = 0;
+#if defined(MOZ_LIBAV_FFT)
+ amount += aMallocSizeOf(mAvRDFT);
+ amount += aMallocSizeOf(mAvIRDFT);
+#else
+ amount += aMallocSizeOf(mKissFFT);
+ amount += aMallocSizeOf(mKissIFFT);
+#endif
+ amount += mOutputBuffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ FFTBlock(const FFTBlock& other) = delete;
+ void operator=(const FFTBlock& other) = delete;
+
+ void EnsureFFT()
+ {
+#if defined(MOZ_LIBAV_FFT)
+ if (!mAvRDFT) {
+ mAvRDFT = av_rdft_init(log((double)mFFTSize)/M_LN2, DFT_R2C);
+ }
+#else
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ if (!mOmxFFT) {
+ mOmxFFT = createOmxFFT(mFFTSize);
+ }
+ } else
+#endif
+ {
+ if (!mKissFFT) {
+ mKissFFT = kiss_fftr_alloc(mFFTSize, 0, nullptr, nullptr);
+ }
+ }
+#endif
+ }
+ void EnsureIFFT()
+ {
+#if defined(MOZ_LIBAV_FFT)
+ if (!mAvIRDFT) {
+ mAvIRDFT = av_rdft_init(log((double)mFFTSize)/M_LN2, IDFT_C2R);
+ }
+#else
+#ifdef BUILD_ARM_NEON
+ if (mozilla::supports_neon()) {
+ if (!mOmxIFFT) {
+ mOmxIFFT = createOmxFFT(mFFTSize);
+ }
+ } else
+#endif
+ {
+ if (!mKissIFFT) {
+ mKissIFFT = kiss_fftr_alloc(mFFTSize, 1, nullptr, nullptr);
+ }
+ }
+#endif
+ }
+
+#ifdef BUILD_ARM_NEON
+ static OMXFFTSpec_R_F32* createOmxFFT(uint32_t aFFTSize)
+ {
+ MOZ_ASSERT((aFFTSize & (aFFTSize-1)) == 0);
+ OMX_INT bufSize;
+ OMX_INT order = log((double)aFFTSize)/M_LN2;
+ MOZ_ASSERT(aFFTSize>>order == 1);
+ OMXResult status = omxSP_FFTGetBufSize_R_F32(order, &bufSize);
+ if (status == OMX_Sts_NoErr) {
+ OMXFFTSpec_R_F32* context = static_cast<OMXFFTSpec_R_F32*>(malloc(bufSize));
+ if (omxSP_FFTInit_R_F32(context, order) != OMX_Sts_NoErr) {
+ return nullptr;
+ }
+ return context;
+ }
+ return nullptr;
+ }
+#endif
+
+ void Clear()
+ {
+#if defined(MOZ_LIBAV_FFT)
+ av_rdft_end(mAvRDFT);
+ av_rdft_end(mAvIRDFT);
+ mAvRDFT = mAvIRDFT = nullptr;
+#else
+#ifdef BUILD_ARM_NEON
+ free(mOmxFFT);
+ free(mOmxIFFT);
+ mOmxFFT = mOmxIFFT = nullptr;
+#endif
+ free(mKissFFT);
+ free(mKissIFFT);
+ mKissFFT = mKissIFFT = nullptr;
+#endif
+ }
+ void AddConstantGroupDelay(double sampleFrameDelay);
+ void InterpolateFrequencyComponents(const FFTBlock& block0,
+ const FFTBlock& block1, double interp);
+#if defined(MOZ_LIBAV_FFT)
+ RDFTContext *mAvRDFT;
+ RDFTContext *mAvIRDFT;
+#else
+ kiss_fftr_cfg mKissFFT;
+ kiss_fftr_cfg mKissIFFT;
+#ifdef BUILD_ARM_NEON
+ OMXFFTSpec_R_F32* mOmxFFT;
+ OMXFFTSpec_R_F32* mOmxIFFT;
+#endif
+#endif
+ AlignedTArray<ComplexU> mOutputBuffer;
+ uint32_t mFFTSize;
+};
+
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/GainNode.cpp b/dom/media/webaudio/GainNode.cpp
new file mode 100644
index 000000000..46ac99763
--- /dev/null
+++ b/dom/media/webaudio/GainNode.cpp
@@ -0,0 +1,156 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "GainNode.h"
+#include "mozilla/dom/GainNodeBinding.h"
+#include "AlignmentUtils.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "WebAudioUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(GainNode, AudioNode,
+ mGain)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(GainNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(GainNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(GainNode, AudioNode)
+
+class GainNodeEngine final : public AudioNodeEngine
+{
+public:
+ GainNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ // Keep the default value in sync with the default value in GainNode::GainNode.
+ , mGain(1.f)
+ {
+ }
+
+ enum Parameters {
+ GAIN
+ };
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case GAIN:
+ mGain.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad GainNodeEngine TimelineParameter");
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ if (aInput.IsNull()) {
+ // If input is silent, so is the output
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ } else if (mGain.HasSimpleValue()) {
+ // Optimize the case where we only have a single value set as the volume
+ float gain = mGain.GetValue();
+ if (gain == 0.0f) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ } else {
+ *aOutput = aInput;
+ aOutput->mVolume *= gain;
+ }
+ } else {
+ // First, compute a vector of gains for each track tick based on the
+ // timeline at hand, and then for each channel, multiply the values
+ // in the buffer with the gain vector.
+ aOutput->AllocateChannels(aInput.ChannelCount());
+
+ // Compute the gain values for the duration of the input AudioChunk
+ StreamTime tick = mDestination->GraphTimeToStreamTime(aFrom);
+ float computedGain[WEBAUDIO_BLOCK_SIZE + 4];
+ float* alignedComputedGain = ALIGNED16(computedGain);
+ ASSERT_ALIGNED16(alignedComputedGain);
+ mGain.GetValuesAtTime(tick, alignedComputedGain, WEBAUDIO_BLOCK_SIZE);
+
+ for (size_t counter = 0; counter < WEBAUDIO_BLOCK_SIZE; ++counter) {
+ alignedComputedGain[counter] *= aInput.mVolume;
+ }
+
+ // Apply the gain to the output buffer
+ for (size_t channel = 0; channel < aOutput->ChannelCount(); ++channel) {
+ const float* inputBuffer = static_cast<const float*> (aInput.mChannelData[channel]);
+ float* buffer = aOutput->ChannelFloatsForWrite(channel);
+ AudioBlockCopyChannelWithScale(inputBuffer, alignedComputedGain, buffer);
+ }
+ }
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mDestination (probably)
+ // - mGain - Internal ref owned by AudioNode
+ return AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ AudioNodeStream* mDestination;
+ AudioParamTimeline mGain;
+};
+
+GainNode::GainNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mGain(new AudioParam(this, GainNodeEngine::GAIN, 1.0f, "gain"))
+{
+ GainNodeEngine* engine = new GainNodeEngine(this, aContext->Destination());
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+GainNode::~GainNode()
+{
+}
+
+size_t
+GainNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mGain->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+GainNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+GainNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return GainNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/GainNode.h b/dom/media/webaudio/GainNode.h
new file mode 100644
index 000000000..aab22ad65
--- /dev/null
+++ b/dom/media/webaudio/GainNode.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GainNode_h_
+#define GainNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class GainNode final : public AudioNode
+{
+public:
+ explicit GainNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(GainNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioParam* Gain() const
+ {
+ return mGain;
+ }
+
+ const char* NodeType() const override
+ {
+ return "GainNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~GainNode();
+
+private:
+ RefPtr<AudioParam> mGain;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/IIRFilterNode.cpp b/dom/media/webaudio/IIRFilterNode.cpp
new file mode 100644
index 000000000..3a69a94c8
--- /dev/null
+++ b/dom/media/webaudio/IIRFilterNode.cpp
@@ -0,0 +1,228 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "IIRFilterNode.h"
+#include "AudioNodeEngine.h"
+
+#include "blink/IIRFilter.h"
+
+#include "nsGkAtoms.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_ISUPPORTS_INHERITED0(IIRFilterNode, AudioNode)
+
+class IIRFilterNodeEngine final : public AudioNodeEngine
+{
+public:
+ IIRFilterNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination,
+ const AudioDoubleArray &aFeedforward,
+ const AudioDoubleArray &aFeedback,
+ uint64_t aWindowID)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ , mFeedforward(aFeedforward)
+ , mFeedback(aFeedback)
+ , mWindowID(aWindowID)
+ {
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ float inputBuffer[WEBAUDIO_BLOCK_SIZE + 4];
+ float* alignedInputBuffer = ALIGNED16(inputBuffer);
+ ASSERT_ALIGNED16(alignedInputBuffer);
+
+ if (aInput.IsNull()) {
+ if (!mIIRFilters.IsEmpty()) {
+ bool allZero = true;
+ for (uint32_t i = 0; i < mIIRFilters.Length(); ++i) {
+ allZero &= mIIRFilters[i]->buffersAreZero();
+ }
+
+ // all filter buffer values are zero, so the output will be zero
+ // as well.
+ if (allZero) {
+ mIIRFilters.Clear();
+ aStream->ScheduleCheckForInactive();
+
+ RefPtr<PlayingRefChangeHandler> refchanged =
+ new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ PodZero(alignedInputBuffer, WEBAUDIO_BLOCK_SIZE);
+ }
+ } else if(mIIRFilters.Length() != aInput.ChannelCount()){
+ if (mIIRFilters.IsEmpty()) {
+ RefPtr<PlayingRefChangeHandler> refchanged =
+ new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ } else {
+ WebAudioUtils::LogToDeveloperConsole(mWindowID,
+ "IIRFilterChannelCountChangeWarning");
+ }
+
+ // Adjust the number of filters based on the number of channels
+ mIIRFilters.SetLength(aInput.ChannelCount());
+ for (size_t i = 0; i < aInput.ChannelCount(); ++i) {
+ mIIRFilters[i] = new blink::IIRFilter(&mFeedforward, &mFeedback);
+ }
+ }
+
+ uint32_t numberOfChannels = mIIRFilters.Length();
+ aOutput->AllocateChannels(numberOfChannels);
+
+ for (uint32_t i = 0; i < numberOfChannels; ++i) {
+ const float* input;
+ if (aInput.IsNull()) {
+ input = alignedInputBuffer;
+ } else {
+ input = static_cast<const float*>(aInput.mChannelData[i]);
+ if (aInput.mVolume != 1.0) {
+ AudioBlockCopyChannelWithScale(input, aInput.mVolume, alignedInputBuffer);
+ input = alignedInputBuffer;
+ }
+ }
+
+ mIIRFilters[i]->process(input,
+ aOutput->ChannelFloatsForWrite(i),
+ aInput.GetDuration());
+ }
+ }
+
+ bool IsActive() const override
+ {
+ return !mIIRFilters.IsEmpty();
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mDestination - probably not owned
+ // - AudioParamTimelines - counted in the AudioNode
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mIIRFilters.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ AudioNodeStream* mDestination;
+ nsTArray<nsAutoPtr<blink::IIRFilter>> mIIRFilters;
+ AudioDoubleArray mFeedforward;
+ AudioDoubleArray mFeedback;
+ uint64_t mWindowID;
+};
+
+IIRFilterNode::IIRFilterNode(AudioContext* aContext,
+ const mozilla::dom::binding_detail::AutoSequence<double>& aFeedforward,
+ const mozilla::dom::binding_detail::AutoSequence<double>& aFeedback)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+{
+ mFeedforward.SetLength(aFeedforward.Length());
+ PodCopy(mFeedforward.Elements(), aFeedforward.Elements(), aFeedforward.Length());
+ mFeedback.SetLength(aFeedback.Length());
+ PodCopy(mFeedback.Elements(), aFeedback.Elements(), aFeedback.Length());
+
+ // Scale coefficients -- we guarantee that mFeedback != 0 when creating
+ // the IIRFilterNode.
+ double scale = mFeedback[0];
+ double* elements = mFeedforward.Elements();
+ for (size_t i = 0; i < mFeedforward.Length(); ++i) {
+ elements[i] /= scale;
+ }
+
+ elements = mFeedback.Elements();
+ for (size_t i = 0; i < mFeedback.Length(); ++i) {
+ elements[i] /= scale;
+ }
+
+ // We check that this is exactly equal to one later in blink/IIRFilter.cpp
+ elements[0] = 1.0;
+
+ uint64_t windowID = aContext->GetParentObject()->WindowID();
+ IIRFilterNodeEngine* engine = new IIRFilterNodeEngine(this, aContext->Destination(), mFeedforward, mFeedback, windowID);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+IIRFilterNode::~IIRFilterNode()
+{
+}
+
+size_t
+IIRFilterNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+IIRFilterNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+IIRFilterNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return IIRFilterNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+IIRFilterNode::GetFrequencyResponse(const Float32Array& aFrequencyHz,
+ const Float32Array& aMagResponse,
+ const Float32Array& aPhaseResponse)
+{
+ aFrequencyHz.ComputeLengthAndData();
+ aMagResponse.ComputeLengthAndData();
+ aPhaseResponse.ComputeLengthAndData();
+
+ uint32_t length = std::min(std::min(aFrequencyHz.Length(),
+ aMagResponse.Length()),
+ aPhaseResponse.Length());
+ if (!length) {
+ return;
+ }
+
+ auto frequencies = MakeUnique<float[]>(length);
+ float* frequencyHz = aFrequencyHz.Data();
+ const double nyquist = Context()->SampleRate() * 0.5;
+
+ // Normalize the frequencies
+ for (uint32_t i = 0; i < length; ++i) {
+ if (frequencyHz[i] >= 0 && frequencyHz[i] <= nyquist) {
+ frequencies[i] = static_cast<float>(frequencyHz[i] / nyquist);
+ } else {
+ frequencies[i] = std::numeric_limits<float>::quiet_NaN();
+ }
+ }
+
+ blink::IIRFilter filter(&mFeedforward, &mFeedback);
+ filter.getFrequencyResponse(int(length), frequencies.get(), aMagResponse.Data(), aPhaseResponse.Data());
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/IIRFilterNode.h b/dom/media/webaudio/IIRFilterNode.h
new file mode 100644
index 000000000..78546c3e5
--- /dev/null
+++ b/dom/media/webaudio/IIRFilterNode.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef IIRFilterNode_h_
+#define IIRFilterNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+#include "mozilla/dom/IIRFilterNodeBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class IIRFilterNode final : public AudioNode
+{
+public:
+ explicit IIRFilterNode(AudioContext* aContext,
+ const mozilla::dom::binding_detail::AutoSequence<double>& aFeedforward,
+ const mozilla::dom::binding_detail::AutoSequence<double>& aFeedback);
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+
+ void GetFrequencyResponse(const Float32Array& aFrequencyHz,
+ const Float32Array& aMagResponse,
+ const Float32Array& aPhaseResponse);
+
+ const char* NodeType() const override
+ {
+ return "IIRFilterNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~IIRFilterNode();
+
+private:
+ nsTArray<double> mFeedback;
+ nsTArray<double> mFeedforward;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/MediaBufferDecoder.cpp b/dom/media/webaudio/MediaBufferDecoder.cpp
new file mode 100644
index 000000000..e9f1d5a47
--- /dev/null
+++ b/dom/media/webaudio/MediaBufferDecoder.cpp
@@ -0,0 +1,649 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaBufferDecoder.h"
+#include "BufferDecoder.h"
+#include "mozilla/dom/AudioContextBinding.h"
+#include "mozilla/dom/ScriptSettings.h"
+#include <speex/speex_resampler.h>
+#include "nsXPCOMCIDInternal.h"
+#include "nsComponentManagerUtils.h"
+#include "MediaDecoderReader.h"
+#include "BufferMediaResource.h"
+#include "DecoderTraits.h"
+#include "AudioContext.h"
+#include "AudioBuffer.h"
+#include "nsContentUtils.h"
+#include "nsIScriptObjectPrincipal.h"
+#include "nsIScriptError.h"
+#include "nsMimeTypes.h"
+#include "VideoUtils.h"
+#include "WebAudioUtils.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/Telemetry.h"
+#include "nsPrintfCString.h"
+#include "GMPService.h"
+
+namespace mozilla {
+
+extern LazyLogModule gMediaDecoderLog;
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(WebAudioDecodeJob)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WebAudioDecodeJob)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mContext)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mOutput)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mSuccessCallback)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mFailureCallback)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WebAudioDecodeJob)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContext)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOutput)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSuccessCallback)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFailureCallback)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(WebAudioDecodeJob)
+NS_IMPL_CYCLE_COLLECTION_TRACE_END
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(WebAudioDecodeJob, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(WebAudioDecodeJob, Release)
+
+using namespace dom;
+
+class ReportResultTask final : public Runnable
+{
+public:
+ ReportResultTask(WebAudioDecodeJob& aDecodeJob,
+ WebAudioDecodeJob::ResultFn aFunction,
+ WebAudioDecodeJob::ErrorCode aErrorCode)
+ : mDecodeJob(aDecodeJob)
+ , mFunction(aFunction)
+ , mErrorCode(aErrorCode)
+ {
+ MOZ_ASSERT(aFunction);
+ }
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ (mDecodeJob.*mFunction)(mErrorCode);
+
+ return NS_OK;
+ }
+
+private:
+ // Note that the mDecodeJob member will probably die when mFunction is run.
+ // Therefore, it is not safe to do anything fancy with it in this class.
+ // Really, this class is only used because nsRunnableMethod doesn't support
+ // methods accepting arguments.
+ WebAudioDecodeJob& mDecodeJob;
+ WebAudioDecodeJob::ResultFn mFunction;
+ WebAudioDecodeJob::ErrorCode mErrorCode;
+};
+
+enum class PhaseEnum : int
+{
+ Decode,
+ AllocateBuffer,
+ Done
+};
+
+class MediaDecodeTask final : public Runnable
+{
+public:
+ MediaDecodeTask(const char* aContentType, uint8_t* aBuffer,
+ uint32_t aLength,
+ WebAudioDecodeJob& aDecodeJob)
+ : mContentType(aContentType)
+ , mBuffer(aBuffer)
+ , mLength(aLength)
+ , mDecodeJob(aDecodeJob)
+ , mPhase(PhaseEnum::Decode)
+ , mFirstFrameDecoded(false)
+ {
+ MOZ_ASSERT(aBuffer);
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+
+ NS_IMETHOD Run();
+ bool CreateReader();
+ MediaDecoderReader* Reader() { MOZ_ASSERT(mDecoderReader); return mDecoderReader; }
+
+private:
+ void ReportFailureOnMainThread(WebAudioDecodeJob::ErrorCode aErrorCode) {
+ if (NS_IsMainThread()) {
+ Cleanup();
+ mDecodeJob.OnFailure(aErrorCode);
+ } else {
+ // Take extra care to cleanup on the main thread
+ NS_DispatchToMainThread(NewRunnableMethod(this, &MediaDecodeTask::Cleanup));
+
+ nsCOMPtr<nsIRunnable> event =
+ new ReportResultTask(mDecodeJob, &WebAudioDecodeJob::OnFailure, aErrorCode);
+ NS_DispatchToMainThread(event);
+ }
+ }
+
+ void Decode();
+ void OnMetadataRead(MetadataHolder* aMetadata);
+ void OnMetadataNotRead(const MediaResult& aError);
+ void RequestSample();
+ void SampleDecoded(MediaData* aData);
+ void SampleNotDecoded(const MediaResult& aError);
+ void FinishDecode();
+ void AllocateBuffer();
+ void CallbackTheResult();
+
+ void Cleanup()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ // MediaDecoderReader expects that BufferDecoder is alive.
+ // Destruct MediaDecoderReader first.
+ mDecoderReader = nullptr;
+ mBufferDecoder = nullptr;
+ JS_free(nullptr, mBuffer);
+ }
+
+private:
+ nsCString mContentType;
+ uint8_t* mBuffer;
+ uint32_t mLength;
+ WebAudioDecodeJob& mDecodeJob;
+ PhaseEnum mPhase;
+ RefPtr<BufferDecoder> mBufferDecoder;
+ RefPtr<MediaDecoderReader> mDecoderReader;
+ MediaInfo mMediaInfo;
+ MediaQueue<MediaData> mAudioQueue;
+ bool mFirstFrameDecoded;
+};
+
+NS_IMETHODIMP
+MediaDecodeTask::Run()
+{
+ MOZ_ASSERT(mBufferDecoder);
+ MOZ_ASSERT(mDecoderReader);
+ switch (mPhase) {
+ case PhaseEnum::Decode:
+ Decode();
+ break;
+ case PhaseEnum::AllocateBuffer:
+ AllocateBuffer();
+ break;
+ case PhaseEnum::Done:
+ break;
+ }
+
+ return NS_OK;
+}
+
+class BufferDecoderGMPCrashHelper : public GMPCrashHelper
+{
+public:
+ explicit BufferDecoderGMPCrashHelper(nsPIDOMWindowInner* aParent)
+ : mParent(do_GetWeakReference(aParent))
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ }
+ already_AddRefed<nsPIDOMWindowInner> GetPluginCrashedEventTarget() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ nsCOMPtr<nsPIDOMWindowInner> window = do_QueryReferent(mParent);
+ return window.forget();
+ }
+private:
+ nsWeakPtr mParent;
+};
+
+bool
+MediaDecodeTask::CreateReader()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+
+ nsCOMPtr<nsIPrincipal> principal;
+ nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(mDecodeJob.mContext->GetParentObject());
+ if (sop) {
+ principal = sop->GetPrincipal();
+ }
+
+ RefPtr<BufferMediaResource> resource =
+ new BufferMediaResource(static_cast<uint8_t*> (mBuffer),
+ mLength, principal, mContentType);
+
+ MOZ_ASSERT(!mBufferDecoder);
+ mBufferDecoder = new BufferDecoder(resource,
+ new BufferDecoderGMPCrashHelper(mDecodeJob.mContext->GetParentObject()));
+
+ // If you change this list to add support for new decoders, please consider
+ // updating HTMLMediaElement::CreateDecoder as well.
+
+ mDecoderReader = DecoderTraits::CreateReader(mContentType, mBufferDecoder);
+
+ if (!mDecoderReader) {
+ return false;
+ }
+
+ nsresult rv = mDecoderReader->Init();
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ return true;
+}
+
+class AutoResampler final
+{
+public:
+ AutoResampler()
+ : mResampler(nullptr)
+ {}
+ ~AutoResampler()
+ {
+ if (mResampler) {
+ speex_resampler_destroy(mResampler);
+ }
+ }
+ operator SpeexResamplerState*() const
+ {
+ MOZ_ASSERT(mResampler);
+ return mResampler;
+ }
+ void operator=(SpeexResamplerState* aResampler)
+ {
+ mResampler = aResampler;
+ }
+
+private:
+ SpeexResamplerState* mResampler;
+};
+
+void
+MediaDecodeTask::Decode()
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+
+ mBufferDecoder->BeginDecoding(mDecoderReader->OwnerThread());
+
+ // Tell the decoder reader that we are not going to play the data directly,
+ // and that we should not reject files with more channels than the audio
+ // backend support.
+ mDecoderReader->SetIgnoreAudioOutputFormat();
+
+ mDecoderReader->AsyncReadMetadata()->Then(mDecoderReader->OwnerThread(), __func__, this,
+ &MediaDecodeTask::OnMetadataRead,
+ &MediaDecodeTask::OnMetadataNotRead);
+}
+
+void
+MediaDecodeTask::OnMetadataRead(MetadataHolder* aMetadata)
+{
+ mMediaInfo = aMetadata->mInfo;
+ if (!mMediaInfo.HasAudio()) {
+ mDecoderReader->Shutdown();
+ ReportFailureOnMainThread(WebAudioDecodeJob::NoAudio);
+ return;
+ }
+
+ nsCString codec;
+ if (!mMediaInfo.mAudio.GetAsAudioInfo()->mMimeType.IsEmpty()) {
+ codec = nsPrintfCString("webaudio; %s", mMediaInfo.mAudio.GetAsAudioInfo()->mMimeType.get());
+ } else {
+ codec = nsPrintfCString("webaudio;resource; %s", mContentType.get());
+ }
+
+ nsCOMPtr<nsIRunnable> task = NS_NewRunnableFunction([codec]() -> void {
+ MOZ_ASSERT(!codec.IsEmpty());
+ MOZ_LOG(gMediaDecoderLog,
+ LogLevel::Debug,
+ ("Telemetry (WebAudio) MEDIA_CODEC_USED= '%s'", codec.get()));
+ Telemetry::Accumulate(Telemetry::ID::MEDIA_CODEC_USED, codec);
+ });
+ AbstractThread::MainThread()->Dispatch(task.forget());
+
+ RequestSample();
+}
+
+void
+MediaDecodeTask::OnMetadataNotRead(const MediaResult& aReason)
+{
+ mDecoderReader->Shutdown();
+ ReportFailureOnMainThread(WebAudioDecodeJob::InvalidContent);
+}
+
+void
+MediaDecodeTask::RequestSample()
+{
+ mDecoderReader->RequestAudioData()->Then(mDecoderReader->OwnerThread(), __func__, this,
+ &MediaDecodeTask::SampleDecoded,
+ &MediaDecodeTask::SampleNotDecoded);
+}
+
+void
+MediaDecodeTask::SampleDecoded(MediaData* aData)
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ mAudioQueue.Push(aData);
+ if (!mFirstFrameDecoded) {
+ mDecoderReader->ReadUpdatedMetadata(&mMediaInfo);
+ mFirstFrameDecoded = true;
+ }
+ RequestSample();
+}
+
+void
+MediaDecodeTask::SampleNotDecoded(const MediaResult& aError)
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+ FinishDecode();
+ } else {
+ mDecoderReader->Shutdown();
+ ReportFailureOnMainThread(WebAudioDecodeJob::InvalidContent);
+ }
+}
+
+void
+MediaDecodeTask::FinishDecode()
+{
+ mDecoderReader->Shutdown();
+
+ uint32_t frameCount = mAudioQueue.FrameCount();
+ uint32_t channelCount = mMediaInfo.mAudio.mChannels;
+ uint32_t sampleRate = mMediaInfo.mAudio.mRate;
+
+ if (!frameCount || !channelCount || !sampleRate) {
+ ReportFailureOnMainThread(WebAudioDecodeJob::InvalidContent);
+ return;
+ }
+
+ const uint32_t destSampleRate = mDecodeJob.mContext->SampleRate();
+ AutoResampler resampler;
+
+ uint32_t resampledFrames = frameCount;
+ if (sampleRate != destSampleRate) {
+ resampledFrames = static_cast<uint32_t>(
+ static_cast<uint64_t>(destSampleRate) *
+ static_cast<uint64_t>(frameCount) /
+ static_cast<uint64_t>(sampleRate)
+ );
+
+ resampler = speex_resampler_init(channelCount,
+ sampleRate,
+ destSampleRate,
+ SPEEX_RESAMPLER_QUALITY_DEFAULT, nullptr);
+ speex_resampler_skip_zeros(resampler);
+ resampledFrames += speex_resampler_get_output_latency(resampler);
+ }
+
+ // Allocate the channel buffers. Note that if we end up resampling, we may
+ // write fewer bytes than mResampledFrames to the output buffer, in which
+ // case mWriteIndex will tell us how many valid samples we have.
+ mDecodeJob.mBuffer = ThreadSharedFloatArrayBufferList::
+ Create(channelCount, resampledFrames, fallible);
+ if (!mDecodeJob.mBuffer) {
+ ReportFailureOnMainThread(WebAudioDecodeJob::UnknownError);
+ return;
+ }
+
+ RefPtr<MediaData> mediaData;
+ while ((mediaData = mAudioQueue.PopFront())) {
+ RefPtr<AudioData> audioData = mediaData->As<AudioData>();
+ audioData->EnsureAudioBuffer(); // could lead to a copy :(
+ AudioDataValue* bufferData = static_cast<AudioDataValue*>
+ (audioData->mAudioBuffer->Data());
+
+ if (sampleRate != destSampleRate) {
+ const uint32_t maxOutSamples = resampledFrames - mDecodeJob.mWriteIndex;
+
+ for (uint32_t i = 0; i < audioData->mChannels; ++i) {
+ uint32_t inSamples = audioData->mFrames;
+ uint32_t outSamples = maxOutSamples;
+ float* outData =
+ mDecodeJob.mBuffer->GetDataForWrite(i) + mDecodeJob.mWriteIndex;
+
+ WebAudioUtils::SpeexResamplerProcess(
+ resampler, i, &bufferData[i * audioData->mFrames], &inSamples,
+ outData, &outSamples);
+
+ if (i == audioData->mChannels - 1) {
+ mDecodeJob.mWriteIndex += outSamples;
+ MOZ_ASSERT(mDecodeJob.mWriteIndex <= resampledFrames);
+ MOZ_ASSERT(inSamples == audioData->mFrames);
+ }
+ }
+ } else {
+ for (uint32_t i = 0; i < audioData->mChannels; ++i) {
+ float* outData =
+ mDecodeJob.mBuffer->GetDataForWrite(i) + mDecodeJob.mWriteIndex;
+ ConvertAudioSamples(&bufferData[i * audioData->mFrames],
+ outData, audioData->mFrames);
+
+ if (i == audioData->mChannels - 1) {
+ mDecodeJob.mWriteIndex += audioData->mFrames;
+ }
+ }
+ }
+ }
+
+ if (sampleRate != destSampleRate) {
+ uint32_t inputLatency = speex_resampler_get_input_latency(resampler);
+ const uint32_t maxOutSamples = resampledFrames - mDecodeJob.mWriteIndex;
+ for (uint32_t i = 0; i < channelCount; ++i) {
+ uint32_t inSamples = inputLatency;
+ uint32_t outSamples = maxOutSamples;
+ float* outData =
+ mDecodeJob.mBuffer->GetDataForWrite(i) + mDecodeJob.mWriteIndex;
+
+ WebAudioUtils::SpeexResamplerProcess(
+ resampler, i, (AudioDataValue*)nullptr, &inSamples,
+ outData, &outSamples);
+
+ if (i == channelCount - 1) {
+ mDecodeJob.mWriteIndex += outSamples;
+ MOZ_ASSERT(mDecodeJob.mWriteIndex <= resampledFrames);
+ MOZ_ASSERT(inSamples == inputLatency);
+ }
+ }
+ }
+
+ mPhase = PhaseEnum::AllocateBuffer;
+ NS_DispatchToMainThread(this);
+}
+
+void
+MediaDecodeTask::AllocateBuffer()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mDecodeJob.AllocateBuffer()) {
+ ReportFailureOnMainThread(WebAudioDecodeJob::UnknownError);
+ return;
+ }
+
+ mPhase = PhaseEnum::Done;
+ CallbackTheResult();
+}
+
+void
+MediaDecodeTask::CallbackTheResult()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ Cleanup();
+
+ // Now, we're ready to call the script back with the resulting buffer
+ mDecodeJob.OnSuccess(WebAudioDecodeJob::NoError);
+}
+
+bool
+WebAudioDecodeJob::AllocateBuffer()
+{
+ MOZ_ASSERT(!mOutput);
+ MOZ_ASSERT(NS_IsMainThread());
+
+ // Now create the AudioBuffer
+ ErrorResult rv;
+ uint32_t channelCount = mBuffer->GetChannels();
+ mOutput = AudioBuffer::Create(mContext, channelCount,
+ mWriteIndex, mContext->SampleRate(),
+ mBuffer.forget(), rv);
+ return !rv.Failed();
+}
+
+void
+AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer,
+ uint32_t aLength, WebAudioDecodeJob& aDecodeJob)
+{
+ // Do not attempt to decode the media if we were not successful at sniffing
+ // the content type.
+ if (!*aContentType ||
+ strcmp(aContentType, APPLICATION_OCTET_STREAM) == 0) {
+ nsCOMPtr<nsIRunnable> event =
+ new ReportResultTask(aDecodeJob,
+ &WebAudioDecodeJob::OnFailure,
+ WebAudioDecodeJob::UnknownContent);
+ JS_free(nullptr, aBuffer);
+ NS_DispatchToMainThread(event);
+ return;
+ }
+
+ RefPtr<MediaDecodeTask> task =
+ new MediaDecodeTask(aContentType, aBuffer, aLength, aDecodeJob);
+ if (!task->CreateReader()) {
+ nsCOMPtr<nsIRunnable> event =
+ new ReportResultTask(aDecodeJob,
+ &WebAudioDecodeJob::OnFailure,
+ WebAudioDecodeJob::UnknownError);
+ NS_DispatchToMainThread(event);
+ } else {
+ // If we did this without a temporary:
+ // task->Reader()->OwnerThread()->Dispatch(task.forget())
+ // we might evaluate the task.forget() before calling Reader(). Enforce
+ // a non-crashy order-of-operations.
+ TaskQueue* taskQueue = task->Reader()->OwnerThread();
+ taskQueue->Dispatch(task.forget());
+ }
+}
+
+WebAudioDecodeJob::WebAudioDecodeJob(const nsACString& aContentType,
+ AudioContext* aContext,
+ Promise* aPromise,
+ DecodeSuccessCallback* aSuccessCallback,
+ DecodeErrorCallback* aFailureCallback)
+ : mContentType(aContentType)
+ , mWriteIndex(0)
+ , mContext(aContext)
+ , mPromise(aPromise)
+ , mSuccessCallback(aSuccessCallback)
+ , mFailureCallback(aFailureCallback)
+{
+ MOZ_ASSERT(aContext);
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_CTOR(WebAudioDecodeJob);
+}
+
+WebAudioDecodeJob::~WebAudioDecodeJob()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_COUNT_DTOR(WebAudioDecodeJob);
+}
+
+void
+WebAudioDecodeJob::OnSuccess(ErrorCode aErrorCode)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aErrorCode == NoError);
+
+ if (mSuccessCallback) {
+ ErrorResult rv;
+ mSuccessCallback->Call(*mOutput, rv);
+ // Ignore errors in calling the callback, since there is not much that we can
+ // do about it here.
+ rv.SuppressException();
+ }
+ mPromise->MaybeResolve(mOutput);
+
+ mContext->RemoveFromDecodeQueue(this);
+
+}
+
+void
+WebAudioDecodeJob::OnFailure(ErrorCode aErrorCode)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ const char* errorMessage;
+ switch (aErrorCode) {
+ case NoError:
+ MOZ_FALLTHROUGH_ASSERT("Who passed NoError to OnFailure?");
+ // Fall through to get some sort of a sane error message if this actually
+ // happens at runtime.
+ case UnknownError:
+ errorMessage = "MediaDecodeAudioDataUnknownError";
+ break;
+ case UnknownContent:
+ errorMessage = "MediaDecodeAudioDataUnknownContentType";
+ break;
+ case InvalidContent:
+ errorMessage = "MediaDecodeAudioDataInvalidContent";
+ break;
+ case NoAudio:
+ errorMessage = "MediaDecodeAudioDataNoAudio";
+ break;
+ }
+
+ nsIDocument* doc = nullptr;
+ if (nsPIDOMWindowInner* pWindow = mContext->GetParentObject()) {
+ doc = pWindow->GetExtantDoc();
+ }
+ nsContentUtils::ReportToConsole(nsIScriptError::errorFlag,
+ NS_LITERAL_CSTRING("Media"),
+ doc,
+ nsContentUtils::eDOM_PROPERTIES,
+ errorMessage);
+
+ // Ignore errors in calling the callback, since there is not much that we can
+ // do about it here.
+ if (mFailureCallback) {
+ mFailureCallback->Call();
+ }
+
+ mPromise->MaybeReject(NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR);
+
+ mContext->RemoveFromDecodeQueue(this);
+}
+
+size_t
+WebAudioDecodeJob::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+ amount += mContentType.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+ if (mSuccessCallback) {
+ amount += mSuccessCallback->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ if (mFailureCallback) {
+ amount += mFailureCallback->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ if (mOutput) {
+ amount += mOutput->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ if (mBuffer) {
+ amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+}
+
+size_t
+WebAudioDecodeJob::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/MediaBufferDecoder.h b/dom/media/webaudio/MediaBufferDecoder.h
new file mode 100644
index 000000000..3e79b37ff
--- /dev/null
+++ b/dom/media/webaudio/MediaBufferDecoder.h
@@ -0,0 +1,79 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaBufferDecoder_h_
+#define MediaBufferDecoder_h_
+
+#include "nsWrapperCache.h"
+#include "nsCOMPtr.h"
+#include "nsString.h"
+#include "nsTArray.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace mozilla {
+
+class ThreadSharedFloatArrayBufferList;
+
+namespace dom {
+class AudioBuffer;
+class AudioContext;
+class DecodeErrorCallback;
+class DecodeSuccessCallback;
+class Promise;
+} // namespace dom
+
+struct WebAudioDecodeJob final
+{
+ // You may omit both the success and failure callback, or you must pass both.
+ // The callbacks are only necessary for asynchronous operation.
+ WebAudioDecodeJob(const nsACString& aContentType,
+ dom::AudioContext* aContext,
+ dom::Promise* aPromise,
+ dom::DecodeSuccessCallback* aSuccessCallback = nullptr,
+ dom::DecodeErrorCallback* aFailureCallback = nullptr);
+
+ NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebAudioDecodeJob)
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(WebAudioDecodeJob)
+
+ enum ErrorCode {
+ NoError,
+ UnknownContent,
+ UnknownError,
+ InvalidContent,
+ NoAudio
+ };
+
+ typedef void (WebAudioDecodeJob::*ResultFn)(ErrorCode);
+
+ void OnSuccess(ErrorCode /* ignored */);
+ void OnFailure(ErrorCode aErrorCode);
+
+ bool AllocateBuffer();
+
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+ size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ nsCString mContentType;
+ uint32_t mWriteIndex;
+ RefPtr<dom::AudioContext> mContext;
+ RefPtr<dom::Promise> mPromise;
+ RefPtr<dom::DecodeSuccessCallback> mSuccessCallback;
+ RefPtr<dom::DecodeErrorCallback> mFailureCallback; // can be null
+ RefPtr<dom::AudioBuffer> mOutput;
+ RefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
+
+private:
+ ~WebAudioDecodeJob();
+};
+
+void AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer,
+ uint32_t aLength, WebAudioDecodeJob& aDecodeJob);
+
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/MediaElementAudioSourceNode.cpp b/dom/media/webaudio/MediaElementAudioSourceNode.cpp
new file mode 100644
index 000000000..ebf7dc44f
--- /dev/null
+++ b/dom/media/webaudio/MediaElementAudioSourceNode.cpp
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaElementAudioSourceNode.h"
+#include "mozilla/dom/MediaElementAudioSourceNodeBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+MediaElementAudioSourceNode::MediaElementAudioSourceNode(AudioContext* aContext)
+ : MediaStreamAudioSourceNode(aContext)
+{
+}
+
+/* static */ already_AddRefed<MediaElementAudioSourceNode>
+MediaElementAudioSourceNode::Create(AudioContext* aContext,
+ DOMMediaStream* aStream, ErrorResult& aRv)
+{
+ RefPtr<MediaElementAudioSourceNode> node =
+ new MediaElementAudioSourceNode(aContext);
+
+ node->Init(aStream, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ return node.forget();
+}
+
+JSObject*
+MediaElementAudioSourceNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaElementAudioSourceNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/MediaElementAudioSourceNode.h b/dom/media/webaudio/MediaElementAudioSourceNode.h
new file mode 100644
index 000000000..f6791f355
--- /dev/null
+++ b/dom/media/webaudio/MediaElementAudioSourceNode.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaElementAudioSourceNode_h_
+#define MediaElementAudioSourceNode_h_
+
+#include "MediaStreamAudioSourceNode.h"
+
+namespace mozilla {
+namespace dom {
+
+class MediaElementAudioSourceNode final : public MediaStreamAudioSourceNode
+{
+public:
+ static already_AddRefed<MediaElementAudioSourceNode>
+ Create(AudioContext* aContext, DOMMediaStream* aStream, ErrorResult& aRv);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ const char* NodeType() const override
+ {
+ return "MediaElementAudioSourceNode";
+ }
+
+ const char* CrossOriginErrorString() const override
+ {
+ return "MediaElementAudioSourceNodeCrossOrigin";
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+private:
+ explicit MediaElementAudioSourceNode(AudioContext* aContext);
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
new file mode 100644
index 000000000..d8c732e47
--- /dev/null
+++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamAudioDestinationNode.h"
+#include "nsIDocument.h"
+#include "mozilla/dom/MediaStreamAudioDestinationNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "DOMMediaStream.h"
+#include "MediaStreamTrack.h"
+#include "TrackUnionStream.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioDestinationTrackSource :
+ public MediaStreamTrackSource
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource)
+
+ AudioDestinationTrackSource(MediaStreamAudioDestinationNode* aNode,
+ nsIPrincipal* aPrincipal)
+ : MediaStreamTrackSource(aPrincipal, nsString())
+ , mNode(aNode)
+ {
+ }
+
+ void Destroy() override
+ {
+ if (mNode) {
+ mNode->DestroyMediaStream();
+ mNode = nullptr;
+ }
+ }
+
+ MediaSourceEnum GetMediaSource() const override
+ {
+ return MediaSourceEnum::AudioCapture;
+ }
+
+ void Stop() override
+ {
+ Destroy();
+ }
+
+private:
+ virtual ~AudioDestinationTrackSource() {}
+
+ RefPtr<MediaStreamAudioDestinationNode> mNode;
+};
+
+NS_IMPL_ADDREF_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource)
+NS_IMPL_RELEASE_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioDestinationTrackSource)
+NS_INTERFACE_MAP_END_INHERITING(MediaStreamTrackSource)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource,
+ mNode)
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaStreamAudioDestinationNode, AudioNode, mDOMStream)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamAudioDestinationNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
+
+MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Explicit,
+ ChannelInterpretation::Speakers)
+ , mDOMStream(
+ DOMAudioNodeMediaStream::CreateTrackUnionStreamAsInput(GetOwner(),
+ this,
+ aContext->Graph()))
+{
+ // Ensure an audio track with the correct ID is exposed to JS
+ nsIDocument* doc = aContext->GetParentObject()->GetExtantDoc();
+ RefPtr<MediaStreamTrackSource> source =
+ new AudioDestinationTrackSource(this, doc->NodePrincipal());
+ RefPtr<MediaStreamTrack> track =
+ mDOMStream->CreateDOMTrack(AudioNodeStream::AUDIO_TRACK,
+ MediaSegment::AUDIO, source,
+ MediaTrackConstraints());
+ mDOMStream->AddTrackInternal(track);
+
+ ProcessedMediaStream* outputStream = mDOMStream->GetInputStream()->AsProcessedStream();
+ MOZ_ASSERT(!!outputStream);
+ AudioNodeEngine* engine = new AudioNodeEngine(this);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::EXTERNAL_OUTPUT,
+ aContext->Graph());
+ mPort = outputStream->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK);
+}
+
+MediaStreamAudioDestinationNode::~MediaStreamAudioDestinationNode()
+{
+}
+
+size_t
+MediaStreamAudioDestinationNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ // Future:
+ // - mDOMStream
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mPort->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+MediaStreamAudioDestinationNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+MediaStreamAudioDestinationNode::DestroyMediaStream()
+{
+ AudioNode::DestroyMediaStream();
+ if (mPort) {
+ mPort->Destroy();
+ mPort = nullptr;
+ }
+}
+
+JSObject*
+MediaStreamAudioDestinationNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaStreamAudioDestinationNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/MediaStreamAudioDestinationNode.h b/dom/media/webaudio/MediaStreamAudioDestinationNode.h
new file mode 100644
index 000000000..6c033b466
--- /dev/null
+++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaStreamAudioDestinationNode_h_
+#define MediaStreamAudioDestinationNode_h_
+
+#include "AudioNode.h"
+
+namespace mozilla {
+namespace dom {
+
+class MediaStreamAudioDestinationNode final : public AudioNode
+{
+public:
+ explicit MediaStreamAudioDestinationNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint16_t NumberOfOutputs() const final override
+ {
+ return 0;
+ }
+
+ void DestroyMediaStream() override;
+
+ DOMMediaStream* DOMStream() const
+ {
+ return mDOMStream;
+ }
+
+ const char* NodeType() const override
+ {
+ return "MediaStreamAudioDestinationNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~MediaStreamAudioDestinationNode();
+
+private:
+ RefPtr<DOMMediaStream> mDOMStream;
+ RefPtr<MediaInputPort> mPort;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/MediaStreamAudioSourceNode.cpp b/dom/media/webaudio/MediaStreamAudioSourceNode.cpp
new file mode 100644
index 000000000..beedd5300
--- /dev/null
+++ b/dom/media/webaudio/MediaStreamAudioSourceNode.cpp
@@ -0,0 +1,254 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamAudioSourceNode.h"
+#include "mozilla/dom/MediaStreamAudioSourceNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeExternalInputStream.h"
+#include "AudioStreamTrack.h"
+#include "nsIDocument.h"
+#include "mozilla/CORSMode.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(MediaStreamAudioSourceNode)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaStreamAudioSourceNode)
+ tmp->Destroy();
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mInputStream)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mInputTrack)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(AudioNode)
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaStreamAudioSourceNode, AudioNode)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInputStream)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInputTrack)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamAudioSourceNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(MediaStreamAudioSourceNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(MediaStreamAudioSourceNode, AudioNode)
+
+MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+{
+}
+
+/* static */ already_AddRefed<MediaStreamAudioSourceNode>
+MediaStreamAudioSourceNode::Create(AudioContext* aContext,
+ DOMMediaStream* aStream, ErrorResult& aRv)
+{
+ RefPtr<MediaStreamAudioSourceNode> node =
+ new MediaStreamAudioSourceNode(aContext);
+
+ node->Init(aStream, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+
+ return node.forget();
+}
+
+void
+MediaStreamAudioSourceNode::Init(DOMMediaStream* aMediaStream, ErrorResult& aRv)
+{
+ if (!aMediaStream) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ return;
+ }
+
+ MediaStream* inputStream = aMediaStream->GetPlaybackStream();
+ MediaStreamGraph* graph = Context()->Graph();
+ if (NS_WARN_IF(graph != inputStream->Graph())) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ mInputStream = aMediaStream;
+ AudioNodeEngine* engine = new MediaStreamAudioSourceNodeEngine(this);
+ mStream = AudioNodeExternalInputStream::Create(graph, engine);
+ mInputStream->AddConsumerToKeepAlive(static_cast<nsIDOMEventTarget*>(this));
+
+ mInputStream->RegisterTrackListener(this);
+ AttachToFirstTrack(mInputStream);
+}
+
+void
+MediaStreamAudioSourceNode::Destroy()
+{
+ if (mInputStream) {
+ mInputStream->UnregisterTrackListener(this);
+ mInputStream = nullptr;
+ }
+ DetachFromTrack();
+}
+
+MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode()
+{
+ Destroy();
+}
+
+void
+MediaStreamAudioSourceNode::AttachToTrack(const RefPtr<MediaStreamTrack>& aTrack)
+{
+ MOZ_ASSERT(!mInputTrack);
+ MOZ_ASSERT(aTrack->AsAudioStreamTrack());
+
+ if (!mStream) {
+ return;
+ }
+
+ mInputTrack = aTrack;
+ ProcessedMediaStream* outputStream =
+ static_cast<ProcessedMediaStream*>(mStream.get());
+ mInputPort = mInputTrack->ForwardTrackContentsTo(outputStream);
+ PrincipalChanged(mInputTrack); // trigger enabling/disabling of the connector
+ mInputTrack->AddPrincipalChangeObserver(this);
+}
+
+void
+MediaStreamAudioSourceNode::DetachFromTrack()
+{
+ if (mInputTrack) {
+ mInputTrack->RemovePrincipalChangeObserver(this);
+ mInputTrack = nullptr;
+ }
+ if (mInputPort) {
+ mInputPort->Destroy();
+ mInputPort = nullptr;
+ }
+}
+
+void
+MediaStreamAudioSourceNode::AttachToFirstTrack(const RefPtr<DOMMediaStream>& aMediaStream)
+{
+ nsTArray<RefPtr<AudioStreamTrack>> tracks;
+ aMediaStream->GetAudioTracks(tracks);
+
+ for (const RefPtr<AudioStreamTrack>& track : tracks) {
+ if (track->Ended()) {
+ continue;
+ }
+
+ AttachToTrack(track);
+ MarkActive();
+ return;
+ }
+
+ // There was no track available. We'll allow the node to be garbage collected.
+ MarkInactive();
+}
+
+void
+MediaStreamAudioSourceNode::NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack)
+{
+ if (mInputTrack) {
+ return;
+ }
+
+ if (!aTrack->AsAudioStreamTrack()) {
+ return;
+ }
+
+ AttachToTrack(aTrack);
+}
+
+void
+MediaStreamAudioSourceNode::NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack)
+{
+ if (aTrack != mInputTrack) {
+ return;
+ }
+
+ DetachFromTrack();
+ AttachToFirstTrack(mInputStream);
+}
+
+/**
+ * Changes the principal. Note that this will be called on the main thread, but
+ * changes will be enacted on the MediaStreamGraph thread. If the principal
+ * change results in the document principal losing access to the stream, then
+ * there needs to be other measures in place to ensure that any media that is
+ * governed by the new stream principal is not available to the MediaStreamGraph
+ * before this change completes. Otherwise, a site could get access to
+ * media that they are not authorized to receive.
+ *
+ * One solution is to block the altered content, call this method, then dispatch
+ * another change request to the MediaStreamGraph thread that allows the content
+ * under the new principal to flow. This might be unnecessary if the principal
+ * change is changing to be the document principal.
+ */
+void
+MediaStreamAudioSourceNode::PrincipalChanged(MediaStreamTrack* aMediaStreamTrack)
+{
+ MOZ_ASSERT(aMediaStreamTrack == mInputTrack);
+
+ bool subsumes = false;
+ nsIDocument* doc = nullptr;
+ if (nsPIDOMWindowInner* parent = Context()->GetParentObject()) {
+ doc = parent->GetExtantDoc();
+ if (doc) {
+ nsIPrincipal* docPrincipal = doc->NodePrincipal();
+ nsIPrincipal* trackPrincipal = aMediaStreamTrack->GetPrincipal();
+ if (!trackPrincipal || NS_FAILED(docPrincipal->Subsumes(trackPrincipal, &subsumes))) {
+ subsumes = false;
+ }
+ }
+ }
+ auto stream = static_cast<AudioNodeExternalInputStream*>(mStream.get());
+ bool enabled = subsumes || aMediaStreamTrack->GetCORSMode() != CORS_NONE;
+ stream->SetInt32Parameter(MediaStreamAudioSourceNodeEngine::ENABLE, enabled);
+
+ if (!enabled && doc) {
+ nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
+ NS_LITERAL_CSTRING("Web Audio"),
+ doc,
+ nsContentUtils::eDOM_PROPERTIES,
+ CrossOriginErrorString());
+ }
+}
+
+size_t
+MediaStreamAudioSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ // Future:
+ // - mInputStream
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ if (mInputPort) {
+ amount += mInputPort->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ return amount;
+}
+
+size_t
+MediaStreamAudioSourceNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+MediaStreamAudioSourceNode::DestroyMediaStream()
+{
+ if (mInputPort) {
+ mInputPort->Destroy();
+ mInputPort = nullptr;
+ }
+ AudioNode::DestroyMediaStream();
+}
+
+JSObject*
+MediaStreamAudioSourceNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaStreamAudioSourceNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/MediaStreamAudioSourceNode.h b/dom/media/webaudio/MediaStreamAudioSourceNode.h
new file mode 100644
index 000000000..5383eb2c6
--- /dev/null
+++ b/dom/media/webaudio/MediaStreamAudioSourceNode.h
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaStreamAudioSourceNode_h_
+#define MediaStreamAudioSourceNode_h_
+
+#include "AudioNode.h"
+#include "DOMMediaStream.h"
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+
+namespace dom {
+
+class MediaStreamAudioSourceNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit MediaStreamAudioSourceNodeEngine(AudioNode* aNode)
+ : AudioNodeEngine(aNode), mEnabled(false) {}
+
+ bool IsEnabled() const { return mEnabled; }
+ enum Parameters {
+ ENABLE
+ };
+ void SetInt32Parameter(uint32_t aIndex, int32_t aValue) override
+ {
+ switch (aIndex) {
+ case ENABLE:
+ mEnabled = !!aValue;
+ break;
+ default:
+ NS_ERROR("MediaStreamAudioSourceNodeEngine bad parameter index");
+ }
+ }
+
+private:
+ bool mEnabled;
+};
+
+class MediaStreamAudioSourceNode : public AudioNode,
+ public DOMMediaStream::TrackListener,
+ public PrincipalChangeObserver<MediaStreamTrack>
+{
+public:
+ static already_AddRefed<MediaStreamAudioSourceNode>
+ Create(AudioContext* aContext, DOMMediaStream* aStream, ErrorResult& aRv);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamAudioSourceNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void DestroyMediaStream() override;
+
+ uint16_t NumberOfInputs() const override { return 0; }
+
+ const char* NodeType() const override
+ {
+ return "MediaStreamAudioSourceNode";
+ }
+
+ virtual const char* CrossOriginErrorString() const
+ {
+ return "MediaStreamAudioSourceNodeCrossOrigin";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+ // Attaches to aTrack so that its audio content will be used as input.
+ void AttachToTrack(const RefPtr<MediaStreamTrack>& aTrack);
+
+ // Detaches from the currently attached track if there is one.
+ void DetachFromTrack();
+
+ // Attaches to the first available audio track in aMediaStream.
+ void AttachToFirstTrack(const RefPtr<DOMMediaStream>& aMediaStream);
+
+ // From DOMMediaStream::TrackListener.
+ void NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack) override;
+ void NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack) override;
+
+ // From PrincipalChangeObserver<MediaStreamTrack>.
+ void PrincipalChanged(MediaStreamTrack* aMediaStreamTrack) override;
+
+protected:
+ explicit MediaStreamAudioSourceNode(AudioContext* aContext);
+ void Init(DOMMediaStream* aMediaStream, ErrorResult& aRv);
+ void Destroy();
+ virtual ~MediaStreamAudioSourceNode();
+
+private:
+ RefPtr<MediaInputPort> mInputPort;
+ RefPtr<DOMMediaStream> mInputStream;
+
+ // On construction we set this to the first audio track of mInputStream.
+ RefPtr<MediaStreamTrack> mInputTrack;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/OfflineAudioCompletionEvent.cpp b/dom/media/webaudio/OfflineAudioCompletionEvent.cpp
new file mode 100644
index 000000000..30a571719
--- /dev/null
+++ b/dom/media/webaudio/OfflineAudioCompletionEvent.cpp
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OfflineAudioCompletionEvent.h"
+#include "mozilla/dom/OfflineAudioCompletionEventBinding.h"
+#include "AudioContext.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(OfflineAudioCompletionEvent, Event,
+ mRenderedBuffer)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(OfflineAudioCompletionEvent)
+NS_INTERFACE_MAP_END_INHERITING(Event)
+
+NS_IMPL_ADDREF_INHERITED(OfflineAudioCompletionEvent, Event)
+NS_IMPL_RELEASE_INHERITED(OfflineAudioCompletionEvent, Event)
+
+OfflineAudioCompletionEvent::OfflineAudioCompletionEvent(AudioContext* aOwner,
+ nsPresContext* aPresContext,
+ WidgetEvent* aEvent)
+ : Event(aOwner, aPresContext, aEvent)
+{
+}
+
+OfflineAudioCompletionEvent::~OfflineAudioCompletionEvent()
+{
+}
+
+JSObject*
+OfflineAudioCompletionEvent::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return OfflineAudioCompletionEventBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/OfflineAudioCompletionEvent.h b/dom/media/webaudio/OfflineAudioCompletionEvent.h
new file mode 100644
index 000000000..bc21fdec3
--- /dev/null
+++ b/dom/media/webaudio/OfflineAudioCompletionEvent.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef OfflineAudioCompletionEvent_h_
+#define OfflineAudioCompletionEvent_h_
+
+#include "AudioBuffer.h"
+#include "mozilla/dom/Event.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class OfflineAudioCompletionEvent final : public Event
+{
+public:
+ OfflineAudioCompletionEvent(AudioContext* aOwner,
+ nsPresContext* aPresContext,
+ WidgetEvent* aEvent);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_FORWARD_TO_EVENT
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(OfflineAudioCompletionEvent, Event)
+
+ JSObject* WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void InitEvent(AudioBuffer* aRenderedBuffer)
+ {
+ InitEvent(NS_LITERAL_STRING("complete"), false, false);
+ mRenderedBuffer = aRenderedBuffer;
+ }
+
+ AudioBuffer* RenderedBuffer() const
+ {
+ return mRenderedBuffer;
+ }
+
+protected:
+ virtual ~OfflineAudioCompletionEvent();
+
+private:
+ RefPtr<AudioBuffer> mRenderedBuffer;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/OscillatorNode.cpp b/dom/media/webaudio/OscillatorNode.cpp
new file mode 100644
index 000000000..8e7c103a9
--- /dev/null
+++ b/dom/media/webaudio/OscillatorNode.cpp
@@ -0,0 +1,580 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "OscillatorNode.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "nsContentUtils.h"
+#include "WebAudioUtils.h"
+#include "blink/PeriodicWave.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(OscillatorNode, AudioNode,
+ mPeriodicWave, mFrequency, mDetune)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(OscillatorNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(OscillatorNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(OscillatorNode, AudioNode)
+
+class OscillatorNodeEngine final : public AudioNodeEngine
+{
+public:
+ OscillatorNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination)
+ : AudioNodeEngine(aNode)
+ , mSource(nullptr)
+ , mDestination(aDestination->Stream())
+ , mStart(-1)
+ , mStop(STREAM_TIME_MAX)
+ // Keep the default values in sync with OscillatorNode::OscillatorNode.
+ , mFrequency(440.f)
+ , mDetune(0.f)
+ , mType(OscillatorType::Sine)
+ , mPhase(0.)
+ , mFinalFrequency(0.)
+ , mPhaseIncrement(0.)
+ , mRecomputeParameters(true)
+ , mCustomLength(0)
+ , mCustomDisableNormalization(false)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ mBasicWaveFormCache = aDestination->Context()->GetBasicWaveFormCache();
+ }
+
+ void SetSourceStream(AudioNodeStream* aSource)
+ {
+ mSource = aSource;
+ }
+
+ enum Parameters {
+ FREQUENCY,
+ DETUNE,
+ TYPE,
+ PERIODICWAVE_LENGTH,
+ DISABLE_NORMALIZATION,
+ START,
+ STOP,
+ };
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ mRecomputeParameters = true;
+
+ MOZ_ASSERT(mDestination);
+
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case FREQUENCY:
+ mFrequency.InsertEvent<int64_t>(aEvent);
+ break;
+ case DETUNE:
+ mDetune.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad OscillatorNodeEngine TimelineParameter");
+ }
+ }
+
+ void SetStreamTimeParameter(uint32_t aIndex, StreamTime aParam) override
+ {
+ switch (aIndex) {
+ case START:
+ mStart = aParam;
+ mSource->SetActive();
+ break;
+ case STOP: mStop = aParam; break;
+ default:
+ NS_ERROR("Bad OscillatorNodeEngine StreamTimeParameter");
+ }
+ }
+
+ void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
+ {
+ switch (aIndex) {
+ case TYPE:
+ // Set the new type.
+ mType = static_cast<OscillatorType>(aParam);
+ if (mType == OscillatorType::Sine) {
+ // Forget any previous custom data.
+ mCustomLength = 0;
+ mCustomDisableNormalization = false;
+ mCustom = nullptr;
+ mPeriodicWave = nullptr;
+ mRecomputeParameters = true;
+ }
+ switch (mType) {
+ case OscillatorType::Sine:
+ mPhase = 0.0;
+ break;
+ case OscillatorType::Square:
+ case OscillatorType::Triangle:
+ case OscillatorType::Sawtooth:
+ mPeriodicWave = mBasicWaveFormCache->GetBasicWaveForm(mType);
+ break;
+ case OscillatorType::Custom:
+ break;
+ default:
+ NS_ERROR("Bad OscillatorNodeEngine type parameter.");
+ }
+ // End type switch.
+ break;
+ case PERIODICWAVE_LENGTH:
+ MOZ_ASSERT(aParam >= 0, "negative custom array length");
+ mCustomLength = static_cast<uint32_t>(aParam);
+ break;
+ case DISABLE_NORMALIZATION:
+ MOZ_ASSERT(aParam >= 0, "negative custom array length");
+ mCustomDisableNormalization = static_cast<uint32_t>(aParam);
+ break;
+ default:
+ NS_ERROR("Bad OscillatorNodeEngine Int32Parameter.");
+ }
+ // End index switch.
+ }
+
+ void SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList> aBuffer) override
+ {
+ MOZ_ASSERT(mCustomLength, "Custom buffer sent before length");
+ mCustom = aBuffer;
+ MOZ_ASSERT(mCustom->GetChannels() == 2,
+ "PeriodicWave should have sent two channels");
+ mPeriodicWave = WebCore::PeriodicWave::create(mSource->SampleRate(),
+ mCustom->GetData(0),
+ mCustom->GetData(1),
+ mCustomLength,
+ mCustomDisableNormalization);
+ }
+
+ void IncrementPhase()
+ {
+ const float twoPiFloat = float(2 * M_PI);
+ mPhase += mPhaseIncrement;
+ if (mPhase > twoPiFloat) {
+ mPhase -= twoPiFloat;
+ } else if (mPhase < -twoPiFloat) {
+ mPhase += twoPiFloat;
+ }
+ }
+
+ // Returns true if the final frequency (and thus the phase increment) changed,
+ // false otherwise. This allow some optimizations at callsite.
+ bool UpdateParametersIfNeeded(StreamTime ticks, size_t count)
+ {
+ double frequency, detune;
+
+ // Shortcut if frequency-related AudioParam are not automated, and we
+ // already have computed the frequency information and related parameters.
+ if (!ParametersMayNeedUpdate()) {
+ return false;
+ }
+
+ bool simpleFrequency = mFrequency.HasSimpleValue();
+ bool simpleDetune = mDetune.HasSimpleValue();
+
+ if (simpleFrequency) {
+ frequency = mFrequency.GetValue();
+ } else {
+ frequency = mFrequency.GetValueAtTime(ticks, count);
+ }
+ if (simpleDetune) {
+ detune = mDetune.GetValue();
+ } else {
+ detune = mDetune.GetValueAtTime(ticks, count);
+ }
+
+ float finalFrequency = frequency * pow(2., detune / 1200.);
+ float signalPeriod = mSource->SampleRate() / finalFrequency;
+ mRecomputeParameters = false;
+
+ mPhaseIncrement = 2 * M_PI / signalPeriod;
+
+ if (finalFrequency != mFinalFrequency) {
+ mFinalFrequency = finalFrequency;
+ return true;
+ }
+ return false;
+ }
+
+ void FillBounds(float* output, StreamTime ticks,
+ uint32_t& start, uint32_t& end)
+ {
+ MOZ_ASSERT(output);
+ static_assert(StreamTime(WEBAUDIO_BLOCK_SIZE) < UINT_MAX,
+ "WEBAUDIO_BLOCK_SIZE overflows interator bounds.");
+ start = 0;
+ if (ticks < mStart) {
+ start = mStart - ticks;
+ for (uint32_t i = 0; i < start; ++i) {
+ output[i] = 0.0;
+ }
+ }
+ end = WEBAUDIO_BLOCK_SIZE;
+ if (ticks + end > mStop) {
+ end = mStop - ticks;
+ for (uint32_t i = end; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ output[i] = 0.0;
+ }
+ }
+ }
+
+ void ComputeSine(float * aOutput, StreamTime ticks, uint32_t aStart, uint32_t aEnd)
+ {
+ for (uint32_t i = aStart; i < aEnd; ++i) {
+ // We ignore the return value, changing the frequency has no impact on
+ // performances here.
+ UpdateParametersIfNeeded(ticks, i);
+
+ aOutput[i] = sin(mPhase);
+
+ IncrementPhase();
+ }
+ }
+
+ bool ParametersMayNeedUpdate()
+ {
+ return !mDetune.HasSimpleValue() ||
+ !mFrequency.HasSimpleValue() ||
+ mRecomputeParameters;
+ }
+
+ void ComputeCustom(float* aOutput,
+ StreamTime ticks,
+ uint32_t aStart,
+ uint32_t aEnd)
+ {
+ MOZ_ASSERT(mPeriodicWave, "No custom waveform data");
+
+ uint32_t periodicWaveSize = mPeriodicWave->periodicWaveSize();
+ // Mask to wrap wave data indices into the range [0,periodicWaveSize).
+ uint32_t indexMask = periodicWaveSize - 1;
+ MOZ_ASSERT(periodicWaveSize && (periodicWaveSize & indexMask) == 0,
+ "periodicWaveSize must be power of 2");
+ float* higherWaveData = nullptr;
+ float* lowerWaveData = nullptr;
+ float tableInterpolationFactor;
+ // Phase increment at frequency of 1 Hz.
+ // mPhase runs [0,periodicWaveSize) here instead of [0,2*M_PI).
+ float basePhaseIncrement = mPeriodicWave->rateScale();
+
+ bool needToFetchWaveData = UpdateParametersIfNeeded(ticks, aStart);
+
+ bool parametersMayNeedUpdate = ParametersMayNeedUpdate();
+ mPeriodicWave->waveDataForFundamentalFrequency(mFinalFrequency,
+ lowerWaveData,
+ higherWaveData,
+ tableInterpolationFactor);
+
+ for (uint32_t i = aStart; i < aEnd; ++i) {
+ if (parametersMayNeedUpdate) {
+ if (needToFetchWaveData) {
+ mPeriodicWave->waveDataForFundamentalFrequency(mFinalFrequency,
+ lowerWaveData,
+ higherWaveData,
+ tableInterpolationFactor);
+ }
+ needToFetchWaveData = UpdateParametersIfNeeded(ticks, i);
+ }
+ // Bilinear interpolation between adjacent samples in each table.
+ float floorPhase = floorf(mPhase);
+ int j1Signed = static_cast<int>(floorPhase);
+ uint32_t j1 = j1Signed & indexMask;
+ uint32_t j2 = j1 + 1;
+ j2 &= indexMask;
+
+ float sampleInterpolationFactor = mPhase - floorPhase;
+
+ float lower = (1.0f - sampleInterpolationFactor) * lowerWaveData[j1] +
+ sampleInterpolationFactor * lowerWaveData[j2];
+ float higher = (1.0f - sampleInterpolationFactor) * higherWaveData[j1] +
+ sampleInterpolationFactor * higherWaveData[j2];
+ aOutput[i] = (1.0f - tableInterpolationFactor) * lower +
+ tableInterpolationFactor * higher;
+
+ // Calculate next phase position from wrapped value j1 to avoid loss of
+ // precision at large values.
+ mPhase =
+ j1 + sampleInterpolationFactor + basePhaseIncrement * mFinalFrequency;
+ }
+ }
+
+ void ComputeSilence(AudioBlock *aOutput)
+ {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ MOZ_ASSERT(mSource == aStream, "Invalid source stream");
+
+ StreamTime ticks = mDestination->GraphTimeToStreamTime(aFrom);
+ if (mStart == -1) {
+ ComputeSilence(aOutput);
+ return;
+ }
+
+ if (ticks + WEBAUDIO_BLOCK_SIZE <= mStart || ticks >= mStop) {
+ ComputeSilence(aOutput);
+
+ } else {
+ aOutput->AllocateChannels(1);
+ float* output = aOutput->ChannelFloatsForWrite(0);
+
+ uint32_t start, end;
+ FillBounds(output, ticks, start, end);
+
+ // Synthesize the correct waveform.
+ switch(mType) {
+ case OscillatorType::Sine:
+ ComputeSine(output, ticks, start, end);
+ break;
+ case OscillatorType::Square:
+ case OscillatorType::Triangle:
+ case OscillatorType::Sawtooth:
+ case OscillatorType::Custom:
+ ComputeCustom(output, ticks, start, end);
+ break;
+ default:
+ ComputeSilence(aOutput);
+ };
+ }
+
+ if (ticks + WEBAUDIO_BLOCK_SIZE >= mStop) {
+ // We've finished playing.
+ *aFinished = true;
+ }
+ }
+
+ bool IsActive() const override
+ {
+ // start() has been called.
+ return mStart != -1;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+
+ // Not owned:
+ // - mSource
+ // - mDestination
+ // - mFrequency (internal ref owned by node)
+ // - mDetune (internal ref owned by node)
+
+ if (mCustom) {
+ amount += mCustom->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ if (mPeriodicWave) {
+ amount += mPeriodicWave->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ AudioNodeStream* mSource;
+ AudioNodeStream* mDestination;
+ StreamTime mStart;
+ StreamTime mStop;
+ AudioParamTimeline mFrequency;
+ AudioParamTimeline mDetune;
+ OscillatorType mType;
+ float mPhase;
+ float mFinalFrequency;
+ float mPhaseIncrement;
+ bool mRecomputeParameters;
+ RefPtr<ThreadSharedFloatArrayBufferList> mCustom;
+ RefPtr<BasicWaveFormCache> mBasicWaveFormCache;
+ uint32_t mCustomLength;
+ bool mCustomDisableNormalization;
+ RefPtr<WebCore::PeriodicWave> mPeriodicWave;
+};
+
+OscillatorNode::OscillatorNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mType(OscillatorType::Sine)
+ , mFrequency(new AudioParam(this, OscillatorNodeEngine::FREQUENCY,
+ 440.0f, "frequency"))
+ , mDetune(new AudioParam(this, OscillatorNodeEngine::DETUNE, 0.0f, "detune"))
+ , mStartCalled(false)
+{
+ OscillatorNodeEngine* engine = new OscillatorNodeEngine(this, aContext->Destination());
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED,
+ aContext->Graph());
+ engine->SetSourceStream(mStream);
+ mStream->AddMainThreadListener(this);
+}
+
+OscillatorNode::~OscillatorNode()
+{
+}
+
+size_t
+OscillatorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+
+ // For now only report if we know for sure that it's not shared.
+ if (mPeriodicWave) {
+ amount += mPeriodicWave->SizeOfIncludingThisIfNotShared(aMallocSizeOf);
+ }
+ amount += mFrequency->SizeOfIncludingThis(aMallocSizeOf);
+ amount += mDetune->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+OscillatorNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+OscillatorNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return OscillatorNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+OscillatorNode::DestroyMediaStream()
+{
+ if (mStream) {
+ mStream->RemoveMainThreadListener(this);
+ }
+ AudioNode::DestroyMediaStream();
+}
+
+void
+OscillatorNode::SendTypeToStream()
+{
+ if (!mStream) {
+ return;
+ }
+ if (mType == OscillatorType::Custom) {
+ // The engine assumes we'll send the custom data before updating the type.
+ SendPeriodicWaveToStream();
+ }
+ SendInt32ParameterToStream(OscillatorNodeEngine::TYPE, static_cast<int32_t>(mType));
+}
+
+void OscillatorNode::SendPeriodicWaveToStream()
+{
+ NS_ASSERTION(mType == OscillatorType::Custom,
+ "Sending custom waveform to engine thread with non-custom type");
+ MOZ_ASSERT(mStream, "Missing node stream.");
+ MOZ_ASSERT(mPeriodicWave, "Send called without PeriodicWave object.");
+ SendInt32ParameterToStream(OscillatorNodeEngine::PERIODICWAVE_LENGTH,
+ mPeriodicWave->DataLength());
+ SendInt32ParameterToStream(OscillatorNodeEngine::DISABLE_NORMALIZATION,
+ mPeriodicWave->DisableNormalization());
+ RefPtr<ThreadSharedFloatArrayBufferList> data =
+ mPeriodicWave->GetThreadSharedBuffer();
+ mStream->SetBuffer(data.forget());
+}
+
+void
+OscillatorNode::Start(double aWhen, ErrorResult& aRv)
+{
+ if (!WebAudioUtils::IsTimeValid(aWhen)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ if (mStartCalled) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ mStartCalled = true;
+
+ if (!mStream) {
+ // Nothing to play, or we're already dead for some reason
+ return;
+ }
+
+ // TODO: Perhaps we need to do more here.
+ mStream->SetStreamTimeParameter(OscillatorNodeEngine::START,
+ Context(), aWhen);
+
+ MarkActive();
+}
+
+void
+OscillatorNode::Stop(double aWhen, ErrorResult& aRv)
+{
+ if (!WebAudioUtils::IsTimeValid(aWhen)) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+
+ if (!mStartCalled) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (!mStream || !Context()) {
+ // We've already stopped and had our stream shut down
+ return;
+ }
+
+ // TODO: Perhaps we need to do more here.
+ mStream->SetStreamTimeParameter(OscillatorNodeEngine::STOP,
+ Context(), std::max(0.0, aWhen));
+}
+
+void
+OscillatorNode::NotifyMainThreadStreamFinished()
+{
+ MOZ_ASSERT(mStream->IsFinished());
+
+ class EndedEventDispatcher final : public Runnable
+ {
+ public:
+ explicit EndedEventDispatcher(OscillatorNode* aNode)
+ : mNode(aNode) {}
+ NS_IMETHOD Run() override
+ {
+ // If it's not safe to run scripts right now, schedule this to run later
+ if (!nsContentUtils::IsSafeToRunScript()) {
+ nsContentUtils::AddScriptRunner(this);
+ return NS_OK;
+ }
+
+ mNode->DispatchTrustedEvent(NS_LITERAL_STRING("ended"));
+ // Release stream resources.
+ mNode->DestroyMediaStream();
+ return NS_OK;
+ }
+ private:
+ RefPtr<OscillatorNode> mNode;
+ };
+
+ NS_DispatchToMainThread(new EndedEventDispatcher(this));
+
+ // Drop the playing reference
+ // Warning: The below line might delete this.
+ MarkInactive();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/OscillatorNode.h b/dom/media/webaudio/OscillatorNode.h
new file mode 100644
index 000000000..1e17e319e
--- /dev/null
+++ b/dom/media/webaudio/OscillatorNode.h
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef OscillatorNode_h_
+#define OscillatorNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+#include "PeriodicWave.h"
+#include "mozilla/dom/OscillatorNodeBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class OscillatorNode final : public AudioNode,
+ public MainThreadMediaStreamListener
+{
+public:
+ explicit OscillatorNode(AudioContext* aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(OscillatorNode, AudioNode)
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void DestroyMediaStream() override;
+
+ uint16_t NumberOfInputs() const final override
+ {
+ return 0;
+ }
+
+ OscillatorType Type() const
+ {
+ return mType;
+ }
+ void SetType(OscillatorType aType, ErrorResult& aRv)
+ {
+ if (aType == OscillatorType::Custom) {
+ // ::Custom can only be set by setPeriodicWave().
+ // https://github.com/WebAudio/web-audio-api/issues/105 for exception.
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+ mType = aType;
+ SendTypeToStream();
+ }
+
+ AudioParam* Frequency() const
+ {
+ return mFrequency;
+ }
+ AudioParam* Detune() const
+ {
+ return mDetune;
+ }
+
+ void Start(double aWhen, ErrorResult& aRv);
+ void Stop(double aWhen, ErrorResult& aRv);
+ void SetPeriodicWave(PeriodicWave& aPeriodicWave)
+ {
+ mPeriodicWave = &aPeriodicWave;
+ // SendTypeToStream will call SendPeriodicWaveToStream for us.
+ mType = OscillatorType::Custom;
+ SendTypeToStream();
+ }
+
+ IMPL_EVENT_HANDLER(ended)
+
+ void NotifyMainThreadStreamFinished() override;
+
+ const char* NodeType() const override
+ {
+ return "OscillatorNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~OscillatorNode();
+
+private:
+ void SendTypeToStream();
+ void SendPeriodicWaveToStream();
+
+private:
+ OscillatorType mType;
+ RefPtr<PeriodicWave> mPeriodicWave;
+ RefPtr<AudioParam> mFrequency;
+ RefPtr<AudioParam> mDetune;
+ bool mStartCalled;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/PannerNode.cpp b/dom/media/webaudio/PannerNode.cpp
new file mode 100644
index 000000000..7696e984e
--- /dev/null
+++ b/dom/media/webaudio/PannerNode.cpp
@@ -0,0 +1,786 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "PannerNode.h"
+#include "AlignmentUtils.h"
+#include "AudioDestinationNode.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioListener.h"
+#include "PanningUtils.h"
+#include "AudioBufferSourceNode.h"
+#include "PlayingRefChangeHandler.h"
+#include "blink/HRTFPanner.h"
+#include "blink/HRTFDatabaseLoader.h"
+#include "nsAutoPtr.h"
+
+using WebCore::HRTFDatabaseLoader;
+using WebCore::HRTFPanner;
+
+namespace mozilla {
+namespace dom {
+
+using namespace std;
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(PannerNode)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PannerNode, AudioNode)
+ if (tmp->Context()) {
+ tmp->Context()->UnregisterPannerNode(tmp);
+ }
+NS_IMPL_CYCLE_COLLECTION_UNLINK(mPositionX, mPositionY, mPositionZ, mOrientationX, mOrientationY, mOrientationZ)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PannerNode, AudioNode)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPositionX, mPositionY, mPositionZ, mOrientationX, mOrientationY, mOrientationZ)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(PannerNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(PannerNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(PannerNode, AudioNode)
+
+class PannerNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit PannerNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ // Please keep these default values consistent with PannerNode::PannerNode below.
+ , mPanningModelFunction(&PannerNodeEngine::EqualPowerPanningFunction)
+ , mDistanceModelFunction(&PannerNodeEngine::InverseGainFunction)
+ , mPositionX(0.)
+ , mPositionY(0.)
+ , mPositionZ(0.)
+ , mOrientationX(1.)
+ , mOrientationY(0.)
+ , mOrientationZ(0.)
+ , mVelocity()
+ , mRefDistance(1.)
+ , mMaxDistance(10000.)
+ , mRolloffFactor(1.)
+ , mConeInnerAngle(360.)
+ , mConeOuterAngle(360.)
+ , mConeOuterGain(0.)
+ // These will be initialized when a PannerNode is created, so just initialize them
+ // to some dummy values here.
+ , mListenerDopplerFactor(0.)
+ , mListenerSpeedOfSound(0.)
+ , mLeftOverData(INT_MIN)
+ {
+ }
+
+ void RecvTimelineEvent(uint32_t aIndex, AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+ switch (aIndex) {
+ case PannerNode::POSITIONX:
+ mPositionX.InsertEvent<int64_t>(aEvent);
+ break;
+ case PannerNode::POSITIONY:
+ mPositionY.InsertEvent<int64_t>(aEvent);
+ break;
+ case PannerNode::POSITIONZ:
+ mPositionZ.InsertEvent<int64_t>(aEvent);
+ break;
+ case PannerNode::ORIENTATIONX:
+ mOrientationX.InsertEvent<int64_t>(aEvent);
+ break;
+ case PannerNode::ORIENTATIONY:
+ mOrientationY.InsertEvent<int64_t>(aEvent);
+ break;
+ case PannerNode::ORIENTATIONZ:
+ mOrientationZ.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad PannerNode TimelineParameter");
+ }
+ }
+
+ void CreateHRTFPanner()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ if (mHRTFPanner) {
+ return;
+ }
+ // HRTFDatabaseLoader needs to be fetched on the main thread.
+ already_AddRefed<HRTFDatabaseLoader> loader =
+ HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(NodeMainThread()->Context()->SampleRate());
+ mHRTFPanner = new HRTFPanner(NodeMainThread()->Context()->SampleRate(), Move(loader));
+ }
+
+ void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
+ {
+ switch (aIndex) {
+ case PannerNode::PANNING_MODEL:
+ switch (PanningModelType(aParam)) {
+ case PanningModelType::Equalpower:
+ mPanningModelFunction = &PannerNodeEngine::EqualPowerPanningFunction;
+ break;
+ case PanningModelType::HRTF:
+ mPanningModelFunction = &PannerNodeEngine::HRTFPanningFunction;
+ break;
+ default:
+ NS_NOTREACHED("We should never see the alternate names here");
+ break;
+ }
+ break;
+ case PannerNode::DISTANCE_MODEL:
+ switch (DistanceModelType(aParam)) {
+ case DistanceModelType::Inverse:
+ mDistanceModelFunction = &PannerNodeEngine::InverseGainFunction;
+ break;
+ case DistanceModelType::Linear:
+ mDistanceModelFunction = &PannerNodeEngine::LinearGainFunction;
+ break;
+ case DistanceModelType::Exponential:
+ mDistanceModelFunction = &PannerNodeEngine::ExponentialGainFunction;
+ break;
+ default:
+ NS_NOTREACHED("We should never see the alternate names here");
+ break;
+ }
+ break;
+ default:
+ NS_ERROR("Bad PannerNodeEngine Int32Parameter");
+ }
+ }
+ void SetThreeDPointParameter(uint32_t aIndex, const ThreeDPoint& aParam) override
+ {
+ switch (aIndex) {
+ case PannerNode::LISTENER_POSITION: mListenerPosition = aParam; break;
+ case PannerNode::LISTENER_FRONT_VECTOR: mListenerFrontVector = aParam; break;
+ case PannerNode::LISTENER_RIGHT_VECTOR: mListenerRightVector = aParam; break;
+ case PannerNode::LISTENER_VELOCITY: mListenerVelocity = aParam; break;
+ case PannerNode::POSITION:
+ mPositionX.SetValue(aParam.x);
+ mPositionY.SetValue(aParam.y);
+ mPositionZ.SetValue(aParam.z);
+ break;
+ case PannerNode::ORIENTATION:
+ mOrientationX.SetValue(aParam.x);
+ mOrientationY.SetValue(aParam.y);
+ mOrientationZ.SetValue(aParam.z);
+ break;
+ case PannerNode::VELOCITY: mVelocity = aParam; break;
+ default:
+ NS_ERROR("Bad PannerNodeEngine ThreeDPointParameter");
+ }
+ }
+ void SetDoubleParameter(uint32_t aIndex, double aParam) override
+ {
+ switch (aIndex) {
+ case PannerNode::LISTENER_DOPPLER_FACTOR: mListenerDopplerFactor = aParam; break;
+ case PannerNode::LISTENER_SPEED_OF_SOUND: mListenerSpeedOfSound = aParam; break;
+ case PannerNode::REF_DISTANCE: mRefDistance = aParam; break;
+ case PannerNode::MAX_DISTANCE: mMaxDistance = aParam; break;
+ case PannerNode::ROLLOFF_FACTOR: mRolloffFactor = aParam; break;
+ case PannerNode::CONE_INNER_ANGLE: mConeInnerAngle = aParam; break;
+ case PannerNode::CONE_OUTER_ANGLE: mConeOuterAngle = aParam; break;
+ case PannerNode::CONE_OUTER_GAIN: mConeOuterGain = aParam; break;
+ default:
+ NS_ERROR("Bad PannerNodeEngine DoubleParameter");
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool *aFinished) override
+ {
+ if (aInput.IsNull()) {
+ // mLeftOverData != INT_MIN means that the panning model was HRTF and a
+ // tail-time reference was added. Even if the model is now equalpower,
+ // the reference will need to be removed.
+ if (mLeftOverData > 0 &&
+ mPanningModelFunction == &PannerNodeEngine::HRTFPanningFunction) {
+ mLeftOverData -= WEBAUDIO_BLOCK_SIZE;
+ } else {
+ if (mLeftOverData != INT_MIN) {
+ mLeftOverData = INT_MIN;
+ aStream->ScheduleCheckForInactive();
+ mHRTFPanner->reset();
+
+ RefPtr<PlayingRefChangeHandler> refchanged =
+ new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+ } else if (mPanningModelFunction == &PannerNodeEngine::HRTFPanningFunction) {
+ if (mLeftOverData == INT_MIN) {
+ RefPtr<PlayingRefChangeHandler> refchanged =
+ new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
+ aStream->Graph()->
+ DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget());
+ }
+ mLeftOverData = mHRTFPanner->maxTailFrames();
+ }
+
+ StreamTime tick = mDestination->GraphTimeToStreamTime(aFrom);
+ (this->*mPanningModelFunction)(aInput, aOutput, tick);
+ }
+
+ bool IsActive() const override
+ {
+ return mLeftOverData != INT_MIN;
+ }
+
+ void ComputeAzimuthAndElevation(const ThreeDPoint& position, float& aAzimuth, float& aElevation);
+ float ComputeConeGain(const ThreeDPoint& position, const ThreeDPoint& orientation);
+ // Compute how much the distance contributes to the gain reduction.
+ double ComputeDistanceGain(const ThreeDPoint& position);
+
+ void EqualPowerPanningFunction(const AudioBlock& aInput, AudioBlock* aOutput, StreamTime tick);
+ void HRTFPanningFunction(const AudioBlock& aInput, AudioBlock* aOutput, StreamTime tick);
+
+ float LinearGainFunction(double aDistance);
+ float InverseGainFunction(double aDistance);
+ float ExponentialGainFunction(double aDistance);
+
+ ThreeDPoint ConvertAudioParamTimelineTo3DP(AudioParamTimeline& aX, AudioParamTimeline& aY, AudioParamTimeline& aZ, StreamTime& tick);
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ if (mHRTFPanner) {
+ amount += mHRTFPanner->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ AudioNodeStream* mDestination;
+ // This member is set on the main thread, but is not accessed on the rendering
+ // thread untile mPanningModelFunction has changed, and this happens strictly
+ // later, via a MediaStreamGraph ControlMessage.
+ nsAutoPtr<HRTFPanner> mHRTFPanner;
+ typedef void (PannerNodeEngine::*PanningModelFunction)(const AudioBlock& aInput, AudioBlock* aOutput, StreamTime tick);
+ PanningModelFunction mPanningModelFunction;
+ typedef float (PannerNodeEngine::*DistanceModelFunction)(double aDistance);
+ DistanceModelFunction mDistanceModelFunction;
+ AudioParamTimeline mPositionX;
+ AudioParamTimeline mPositionY;
+ AudioParamTimeline mPositionZ;
+ AudioParamTimeline mOrientationX;
+ AudioParamTimeline mOrientationY;
+ AudioParamTimeline mOrientationZ;
+ ThreeDPoint mVelocity;
+ double mRefDistance;
+ double mMaxDistance;
+ double mRolloffFactor;
+ double mConeInnerAngle;
+ double mConeOuterAngle;
+ double mConeOuterGain;
+ ThreeDPoint mListenerPosition;
+ ThreeDPoint mListenerFrontVector;
+ ThreeDPoint mListenerRightVector;
+ ThreeDPoint mListenerVelocity;
+ double mListenerDopplerFactor;
+ double mListenerSpeedOfSound;
+ int mLeftOverData;
+};
+
+PannerNode::PannerNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Clamped_max,
+ ChannelInterpretation::Speakers)
+ // Please keep these default values consistent with PannerNodeEngine::PannerNodeEngine above.
+ , mPanningModel(PanningModelType::Equalpower)
+ , mDistanceModel(DistanceModelType::Inverse)
+ , mPositionX(new AudioParam(this, PannerNode::POSITIONX, 0., this->NodeType()))
+ , mPositionY(new AudioParam(this, PannerNode::POSITIONY, 0., this->NodeType()))
+ , mPositionZ(new AudioParam(this, PannerNode::POSITIONZ, 0., this->NodeType()))
+ , mOrientationX(new AudioParam(this, PannerNode::ORIENTATIONX, 1., this->NodeType()))
+ , mOrientationY(new AudioParam(this, PannerNode::ORIENTATIONY, 0., this->NodeType()))
+ , mOrientationZ(new AudioParam(this, PannerNode::ORIENTATIONZ, 0., this->NodeType()))
+ , mVelocity()
+ , mRefDistance(1.)
+ , mMaxDistance(10000.)
+ , mRolloffFactor(1.)
+ , mConeInnerAngle(360.)
+ , mConeOuterAngle(360.)
+ , mConeOuterGain(0.)
+{
+ mStream = AudioNodeStream::Create(aContext,
+ new PannerNodeEngine(this, aContext->Destination()),
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+ // We should register once we have set up our stream and engine.
+ Context()->Listener()->RegisterPannerNode(this);
+}
+
+PannerNode::~PannerNode()
+{
+ if (Context()) {
+ Context()->UnregisterPannerNode(this);
+ }
+}
+
+void PannerNode::SetPanningModel(PanningModelType aPanningModel)
+{
+ mPanningModel = aPanningModel;
+ if (mPanningModel == PanningModelType::HRTF) {
+ // We can set the engine's `mHRTFPanner` member here from the main thread,
+ // because the engine will not touch it from the MediaStreamGraph
+ // thread until the PANNING_MODEL message sent below is received.
+ static_cast<PannerNodeEngine*>(mStream->Engine())->CreateHRTFPanner();
+ }
+ SendInt32ParameterToStream(PANNING_MODEL, int32_t(mPanningModel));
+}
+
+size_t
+PannerNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mSources.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+PannerNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+PannerNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return PannerNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void PannerNode::DestroyMediaStream()
+{
+ if (Context()) {
+ Context()->UnregisterPannerNode(this);
+ }
+ AudioNode::DestroyMediaStream();
+}
+
+// Those three functions are described in the spec.
+float
+PannerNodeEngine::LinearGainFunction(double aDistance)
+{
+ return 1 - mRolloffFactor * (std::max(std::min(aDistance, mMaxDistance), mRefDistance) - mRefDistance) / (mMaxDistance - mRefDistance);
+}
+
+float
+PannerNodeEngine::InverseGainFunction(double aDistance)
+{
+ return mRefDistance / (mRefDistance + mRolloffFactor * (std::max(aDistance, mRefDistance) - mRefDistance));
+}
+
+float
+PannerNodeEngine::ExponentialGainFunction(double aDistance)
+{
+ return pow(std::max(aDistance, mRefDistance) / mRefDistance, -mRolloffFactor);
+}
+
+void
+PannerNodeEngine::HRTFPanningFunction(const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ StreamTime tick)
+{
+ // The output of this node is always stereo, no matter what the inputs are.
+ aOutput->AllocateChannels(2);
+
+ float azimuth, elevation;
+
+ ThreeDPoint position = ConvertAudioParamTimelineTo3DP(mPositionX, mPositionY, mPositionZ, tick);
+ ThreeDPoint orientation = ConvertAudioParamTimelineTo3DP(mOrientationX, mOrientationY, mOrientationZ, tick);
+ if (!orientation.IsZero()) {
+ orientation.Normalize();
+ }
+ ComputeAzimuthAndElevation(position, azimuth, elevation);
+
+ AudioBlock input = aInput;
+ // Gain is applied before the delay and convolution of the HRTF.
+ input.mVolume *= ComputeConeGain(position, orientation) * ComputeDistanceGain(position);
+
+ mHRTFPanner->pan(azimuth, elevation, &input, aOutput);
+}
+
+ThreeDPoint
+PannerNodeEngine::ConvertAudioParamTimelineTo3DP(AudioParamTimeline& aX, AudioParamTimeline& aY, AudioParamTimeline& aZ, StreamTime &tick)
+{
+ return ThreeDPoint(aX.GetValueAtTime(tick),
+ aY.GetValueAtTime(tick),
+ aZ.GetValueAtTime(tick));
+}
+
+void
+PannerNodeEngine::EqualPowerPanningFunction(const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ StreamTime tick)
+{
+ float azimuth, elevation, gainL, gainR, normalizedAzimuth, distanceGain, coneGain;
+ int inputChannels = aInput.ChannelCount();
+
+ // Optimize the case where the position and orientation is constant for this
+ // processing block: we can just apply a constant gain on the left and right
+ // channel
+ if (mPositionX.HasSimpleValue() &&
+ mPositionY.HasSimpleValue() &&
+ mPositionZ.HasSimpleValue() &&
+ mOrientationX.HasSimpleValue() &&
+ mOrientationY.HasSimpleValue() &&
+ mOrientationZ.HasSimpleValue()) {
+
+ ThreeDPoint position = ConvertAudioParamTimelineTo3DP(mPositionX, mPositionY, mPositionZ, tick);
+ ThreeDPoint orientation = ConvertAudioParamTimelineTo3DP(mOrientationX, mOrientationY, mOrientationZ, tick);
+ if (!orientation.IsZero()) {
+ orientation.Normalize();
+ }
+
+ // If both the listener are in the same spot, and no cone gain is specified,
+ // this node is noop.
+ if (mListenerPosition == position &&
+ mConeInnerAngle == 360 &&
+ mConeOuterAngle == 360) {
+ *aOutput = aInput;
+ return;
+ }
+
+ // The output of this node is always stereo, no matter what the inputs are.
+ aOutput->AllocateChannels(2);
+
+ ComputeAzimuthAndElevation(position, azimuth, elevation);
+ coneGain = ComputeConeGain(position, orientation);
+
+ // The following algorithm is described in the spec.
+ // Clamp azimuth in the [-90, 90] range.
+ azimuth = min(180.f, max(-180.f, azimuth));
+
+ // Wrap around
+ if (azimuth < -90.f) {
+ azimuth = -180.f - azimuth;
+ } else if (azimuth > 90) {
+ azimuth = 180.f - azimuth;
+ }
+
+ // Normalize the value in the [0, 1] range.
+ if (inputChannels == 1) {
+ normalizedAzimuth = (azimuth + 90.f) / 180.f;
+ } else {
+ if (azimuth <= 0) {
+ normalizedAzimuth = (azimuth + 90.f) / 90.f;
+ } else {
+ normalizedAzimuth = azimuth / 90.f;
+ }
+ }
+
+ distanceGain = ComputeDistanceGain(position);
+
+ // Actually compute the left and right gain.
+ gainL = cos(0.5 * M_PI * normalizedAzimuth);
+ gainR = sin(0.5 * M_PI * normalizedAzimuth);
+
+ // Compute the output.
+ ApplyStereoPanning(aInput, aOutput, gainL, gainR, azimuth <= 0);
+
+ aOutput->mVolume = aInput.mVolume * distanceGain * coneGain;
+ } else {
+ float positionX[WEBAUDIO_BLOCK_SIZE];
+ float positionY[WEBAUDIO_BLOCK_SIZE];
+ float positionZ[WEBAUDIO_BLOCK_SIZE];
+ float orientationX[WEBAUDIO_BLOCK_SIZE];
+ float orientationY[WEBAUDIO_BLOCK_SIZE];
+ float orientationZ[WEBAUDIO_BLOCK_SIZE];
+
+ // The output of this node is always stereo, no matter what the inputs are.
+ aOutput->AllocateChannels(2);
+
+ if (!mPositionX.HasSimpleValue()) {
+ mPositionX.GetValuesAtTime(tick, positionX, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ positionX[0] = mPositionX.GetValueAtTime(tick);
+ }
+ if (!mPositionY.HasSimpleValue()) {
+ mPositionY.GetValuesAtTime(tick, positionY, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ positionY[0] = mPositionY.GetValueAtTime(tick);
+ }
+ if (!mPositionZ.HasSimpleValue()) {
+ mPositionZ.GetValuesAtTime(tick, positionZ, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ positionZ[0] = mPositionZ.GetValueAtTime(tick);
+ }
+ if (!mOrientationX.HasSimpleValue()) {
+ mOrientationX.GetValuesAtTime(tick, orientationX, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ orientationX[0] = mOrientationX.GetValueAtTime(tick);
+ }
+ if (!mOrientationY.HasSimpleValue()) {
+ mOrientationY.GetValuesAtTime(tick, orientationY, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ orientationY[0] = mOrientationY.GetValueAtTime(tick);
+ }
+ if (!mOrientationZ.HasSimpleValue()) {
+ mOrientationZ.GetValuesAtTime(tick, orientationZ, WEBAUDIO_BLOCK_SIZE);
+ } else {
+ orientationZ[0] = mOrientationZ.GetValueAtTime(tick);
+ }
+
+ float computedGain[2*WEBAUDIO_BLOCK_SIZE + 4];
+ bool onLeft[WEBAUDIO_BLOCK_SIZE];
+
+ float* alignedComputedGain = ALIGNED16(computedGain);
+ ASSERT_ALIGNED16(alignedComputedGain);
+ for (size_t counter = 0; counter < WEBAUDIO_BLOCK_SIZE; ++counter) {
+ ThreeDPoint position(mPositionX.HasSimpleValue() ? positionX[0] : positionX[counter],
+ mPositionY.HasSimpleValue() ? positionY[0] : positionY[counter],
+ mPositionZ.HasSimpleValue() ? positionZ[0] : positionZ[counter]);
+ ThreeDPoint orientation(mOrientationX.HasSimpleValue() ? orientationX[0] : orientationX[counter],
+ mOrientationY.HasSimpleValue() ? orientationY[0] : orientationY[counter],
+ mOrientationZ.HasSimpleValue() ? orientationZ[0] : orientationZ[counter]);
+ if (!orientation.IsZero()) {
+ orientation.Normalize();
+ }
+
+ ComputeAzimuthAndElevation(position, azimuth, elevation);
+ coneGain = ComputeConeGain(position, orientation);
+
+ // The following algorithm is described in the spec.
+ // Clamp azimuth in the [-90, 90] range.
+ azimuth = min(180.f, max(-180.f, azimuth));
+
+ // Wrap around
+ if (azimuth < -90.f) {
+ azimuth = -180.f - azimuth;
+ } else if (azimuth > 90) {
+ azimuth = 180.f - azimuth;
+ }
+
+ // Normalize the value in the [0, 1] range.
+ if (inputChannels == 1) {
+ normalizedAzimuth = (azimuth + 90.f) / 180.f;
+ } else {
+ if (azimuth <= 0) {
+ normalizedAzimuth = (azimuth + 90.f) / 90.f;
+ } else {
+ normalizedAzimuth = azimuth / 90.f;
+ }
+ }
+
+ distanceGain = ComputeDistanceGain(position);
+
+ // Actually compute the left and right gain.
+ float gainL = cos(0.5 * M_PI * normalizedAzimuth) * aInput.mVolume * distanceGain * coneGain;
+ float gainR = sin(0.5 * M_PI * normalizedAzimuth) * aInput.mVolume * distanceGain * coneGain;
+
+ alignedComputedGain[counter] = gainL;
+ alignedComputedGain[WEBAUDIO_BLOCK_SIZE + counter] = gainR;
+ onLeft[counter] = azimuth <= 0;
+ }
+
+ // Apply the gain to the output buffer
+ ApplyStereoPanning(aInput, aOutput, alignedComputedGain, &alignedComputedGain[WEBAUDIO_BLOCK_SIZE], onLeft);
+
+ }
+}
+
+// This algorithm is specified in the webaudio spec.
+void
+PannerNodeEngine::ComputeAzimuthAndElevation(const ThreeDPoint& position, float& aAzimuth, float& aElevation)
+{
+ ThreeDPoint sourceListener = position - mListenerPosition;
+ if (sourceListener.IsZero()) {
+ aAzimuth = 0.0;
+ aElevation = 0.0;
+ return;
+ }
+
+ sourceListener.Normalize();
+
+ // Project the source-listener vector on the x-z plane.
+ const ThreeDPoint& listenerFront = mListenerFrontVector;
+ const ThreeDPoint& listenerRight = mListenerRightVector;
+ ThreeDPoint up = listenerRight.CrossProduct(listenerFront);
+
+ double upProjection = sourceListener.DotProduct(up);
+ aElevation = 90 - 180 * acos(upProjection) / M_PI;
+
+ if (aElevation > 90) {
+ aElevation = 180 - aElevation;
+ } else if (aElevation < -90) {
+ aElevation = -180 - aElevation;
+ }
+
+ ThreeDPoint projectedSource = sourceListener - up * upProjection;
+ if (projectedSource.IsZero()) {
+ // source - listener direction is up or down.
+ aAzimuth = 0.0;
+ return;
+ }
+ projectedSource.Normalize();
+
+ // Actually compute the angle, and convert to degrees
+ double projection = projectedSource.DotProduct(listenerRight);
+ aAzimuth = 180 * acos(projection) / M_PI;
+
+ // Compute whether the source is in front or behind the listener.
+ double frontBack = projectedSource.DotProduct(listenerFront);
+ if (frontBack < 0) {
+ aAzimuth = 360 - aAzimuth;
+ }
+ // Rotate the azimuth so it is relative to the listener front vector instead
+ // of the right vector.
+ if ((aAzimuth >= 0) && (aAzimuth <= 270)) {
+ aAzimuth = 90 - aAzimuth;
+ } else {
+ aAzimuth = 450 - aAzimuth;
+ }
+}
+
+// This algorithm is described in the WebAudio spec.
+float
+PannerNodeEngine::ComputeConeGain(const ThreeDPoint& position,
+ const ThreeDPoint& orientation)
+{
+ // Omnidirectional source
+ if (orientation.IsZero() || ((mConeInnerAngle == 360) && (mConeOuterAngle == 360))) {
+ return 1;
+ }
+
+ // Normalized source-listener vector
+ ThreeDPoint sourceToListener = mListenerPosition - position;
+ sourceToListener.Normalize();
+
+ // Angle between the source orientation vector and the source-listener vector
+ double dotProduct = sourceToListener.DotProduct(orientation);
+ double angle = 180 * acos(dotProduct) / M_PI;
+ double absAngle = fabs(angle);
+
+ // Divide by 2 here since API is entire angle (not half-angle)
+ double absInnerAngle = fabs(mConeInnerAngle) / 2;
+ double absOuterAngle = fabs(mConeOuterAngle) / 2;
+ double gain = 1;
+
+ if (absAngle <= absInnerAngle) {
+ // No attenuation
+ gain = 1;
+ } else if (absAngle >= absOuterAngle) {
+ // Max attenuation
+ gain = mConeOuterGain;
+ } else {
+ // Between inner and outer cones
+ // inner -> outer, x goes from 0 -> 1
+ double x = (absAngle - absInnerAngle) / (absOuterAngle - absInnerAngle);
+ gain = (1 - x) + mConeOuterGain * x;
+ }
+
+ return gain;
+}
+
+double
+PannerNodeEngine::ComputeDistanceGain(const ThreeDPoint& position)
+{
+ ThreeDPoint distanceVec = position - mListenerPosition;
+ float distance = sqrt(distanceVec.DotProduct(distanceVec));
+ return std::max(0.0f, (this->*mDistanceModelFunction)(distance));
+}
+
+float
+PannerNode::ComputeDopplerShift()
+{
+ double dopplerShift = 1.0; // Initialize to default value
+
+ AudioListener* listener = Context()->Listener();
+
+ if (listener->DopplerFactor() > 0) {
+ // Don't bother if both source and listener have no velocity.
+ if (!mVelocity.IsZero() || !listener->Velocity().IsZero()) {
+ // Calculate the source to listener vector.
+ ThreeDPoint sourceToListener = ConvertAudioParamTo3DP(mPositionX, mPositionY, mPositionZ) - listener->Velocity();
+
+ double sourceListenerMagnitude = sourceToListener.Magnitude();
+
+ double listenerProjection = sourceToListener.DotProduct(listener->Velocity()) / sourceListenerMagnitude;
+ double sourceProjection = sourceToListener.DotProduct(mVelocity) / sourceListenerMagnitude;
+
+ listenerProjection = -listenerProjection;
+ sourceProjection = -sourceProjection;
+
+ double scaledSpeedOfSound = listener->SpeedOfSound() / listener->DopplerFactor();
+ listenerProjection = min(listenerProjection, scaledSpeedOfSound);
+ sourceProjection = min(sourceProjection, scaledSpeedOfSound);
+
+ dopplerShift = ((listener->SpeedOfSound() - listener->DopplerFactor() * listenerProjection) / (listener->SpeedOfSound() - listener->DopplerFactor() * sourceProjection));
+
+ WebAudioUtils::FixNaN(dopplerShift); // Avoid illegal values
+
+ // Limit the pitch shifting to 4 octaves up and 3 octaves down.
+ dopplerShift = min(dopplerShift, 16.);
+ dopplerShift = max(dopplerShift, 0.125);
+ }
+ }
+
+ return dopplerShift;
+}
+
+void
+PannerNode::FindConnectedSources()
+{
+ mSources.Clear();
+ std::set<AudioNode*> cycleSet;
+ FindConnectedSources(this, mSources, cycleSet);
+}
+
+void
+PannerNode::FindConnectedSources(AudioNode* aNode,
+ nsTArray<AudioBufferSourceNode*>& aSources,
+ std::set<AudioNode*>& aNodesSeen)
+{
+ if (!aNode) {
+ return;
+ }
+
+ const nsTArray<InputNode>& inputNodes = aNode->InputNodes();
+
+ for(unsigned i = 0; i < inputNodes.Length(); i++) {
+ // Return if we find a node that we have seen already.
+ if (aNodesSeen.find(inputNodes[i].mInputNode) != aNodesSeen.end()) {
+ return;
+ }
+ aNodesSeen.insert(inputNodes[i].mInputNode);
+ // Recurse
+ FindConnectedSources(inputNodes[i].mInputNode, aSources, aNodesSeen);
+
+ // Check if this node is an AudioBufferSourceNode that still have a stream,
+ // which means it has not finished playing.
+ AudioBufferSourceNode* node = inputNodes[i].mInputNode->AsAudioBufferSourceNode();
+ if (node && node->GetStream()) {
+ aSources.AppendElement(node);
+ }
+ }
+}
+
+void
+PannerNode::SendDopplerToSourcesIfNeeded()
+{
+ // Don't bother sending the doppler shift if both the source and the listener
+ // are not moving, because the doppler shift is going to be 1.0.
+ if (!(Context()->Listener()->Velocity().IsZero() && mVelocity.IsZero())) {
+ for(uint32_t i = 0; i < mSources.Length(); i++) {
+ mSources[i]->SendDopplerShiftToStream(ComputeDopplerShift());
+ }
+ }
+}
+
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/PannerNode.h b/dom/media/webaudio/PannerNode.h
new file mode 100644
index 000000000..184db4603
--- /dev/null
+++ b/dom/media/webaudio/PannerNode.h
@@ -0,0 +1,296 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef PannerNode_h_
+#define PannerNode_h_
+
+#include "AudioNode.h"
+#include "AudioParam.h"
+#include "mozilla/dom/PannerNodeBinding.h"
+#include "ThreeDPoint.h"
+#include "mozilla/WeakPtr.h"
+#include <limits>
+#include <set>
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+class AudioBufferSourceNode;
+
+class PannerNode final : public AudioNode,
+ public SupportsWeakPtr<PannerNode>
+{
+public:
+ MOZ_DECLARE_WEAKREFERENCE_TYPENAME(PannerNode)
+ explicit PannerNode(AudioContext* aContext);
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void DestroyMediaStream() override;
+
+ void SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv) override
+ {
+ if (aChannelCount > 2) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ AudioNode::SetChannelCount(aChannelCount, aRv);
+ }
+ void SetChannelCountModeValue(ChannelCountMode aMode, ErrorResult& aRv) override
+ {
+ if (aMode == ChannelCountMode::Max) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ AudioNode::SetChannelCountModeValue(aMode, aRv);
+ }
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PannerNode, AudioNode)
+
+ PanningModelType PanningModel() const
+ {
+ return mPanningModel;
+ }
+ void SetPanningModel(PanningModelType aPanningModel);
+
+ DistanceModelType DistanceModel() const
+ {
+ return mDistanceModel;
+ }
+ void SetDistanceModel(DistanceModelType aDistanceModel)
+ {
+ mDistanceModel = aDistanceModel;
+ SendInt32ParameterToStream(DISTANCE_MODEL, int32_t(mDistanceModel));
+ }
+
+ void SetPosition(double aX, double aY, double aZ)
+ {
+ if (fabs(aX) > std::numeric_limits<float>::max() ||
+ fabs(aY) > std::numeric_limits<float>::max() ||
+ fabs(aZ) > std::numeric_limits<float>::max()) {
+ return;
+ }
+ mPositionX->SetValue(aX);
+ mPositionY->SetValue(aY);
+ mPositionZ->SetValue(aZ);
+ SendThreeDPointParameterToStream(POSITION, ConvertAudioParamTo3DP(mPositionX, mPositionY, mPositionZ));
+ }
+
+ void SetOrientation(double aX, double aY, double aZ)
+ {
+ if (fabs(aX) > std::numeric_limits<float>::max() ||
+ fabs(aY) > std::numeric_limits<float>::max() ||
+ fabs(aZ) > std::numeric_limits<float>::max()) {
+ return;
+ }
+ mOrientationX->SetValue(aX);
+ mOrientationY->SetValue(aY);
+ mOrientationZ->SetValue(aZ);
+ SendThreeDPointParameterToStream(ORIENTATION, ConvertAudioParamTo3DP(mOrientationX, mOrientationY, mOrientationZ));
+ }
+
+ void SetVelocity(double aX, double aY, double aZ)
+ {
+ if (WebAudioUtils::FuzzyEqual(mVelocity.x, aX) &&
+ WebAudioUtils::FuzzyEqual(mVelocity.y, aY) &&
+ WebAudioUtils::FuzzyEqual(mVelocity.z, aZ)) {
+ return;
+ }
+ mVelocity.x = aX;
+ mVelocity.y = aY;
+ mVelocity.z = aZ;
+ SendThreeDPointParameterToStream(VELOCITY, mVelocity);
+ SendDopplerToSourcesIfNeeded();
+ }
+
+ double RefDistance() const
+ {
+ return mRefDistance;
+ }
+ void SetRefDistance(double aRefDistance)
+ {
+ if (WebAudioUtils::FuzzyEqual(mRefDistance, aRefDistance)) {
+ return;
+ }
+ mRefDistance = aRefDistance;
+ SendDoubleParameterToStream(REF_DISTANCE, mRefDistance);
+ }
+
+ double MaxDistance() const
+ {
+ return mMaxDistance;
+ }
+ void SetMaxDistance(double aMaxDistance)
+ {
+ if (WebAudioUtils::FuzzyEqual(mMaxDistance, aMaxDistance)) {
+ return;
+ }
+ mMaxDistance = aMaxDistance;
+ SendDoubleParameterToStream(MAX_DISTANCE, mMaxDistance);
+ }
+
+ double RolloffFactor() const
+ {
+ return mRolloffFactor;
+ }
+ void SetRolloffFactor(double aRolloffFactor)
+ {
+ if (WebAudioUtils::FuzzyEqual(mRolloffFactor, aRolloffFactor)) {
+ return;
+ }
+ mRolloffFactor = aRolloffFactor;
+ SendDoubleParameterToStream(ROLLOFF_FACTOR, mRolloffFactor);
+ }
+
+ double ConeInnerAngle() const
+ {
+ return mConeInnerAngle;
+ }
+ void SetConeInnerAngle(double aConeInnerAngle)
+ {
+ if (WebAudioUtils::FuzzyEqual(mConeInnerAngle, aConeInnerAngle)) {
+ return;
+ }
+ mConeInnerAngle = aConeInnerAngle;
+ SendDoubleParameterToStream(CONE_INNER_ANGLE, mConeInnerAngle);
+ }
+
+ double ConeOuterAngle() const
+ {
+ return mConeOuterAngle;
+ }
+ void SetConeOuterAngle(double aConeOuterAngle)
+ {
+ if (WebAudioUtils::FuzzyEqual(mConeOuterAngle, aConeOuterAngle)) {
+ return;
+ }
+ mConeOuterAngle = aConeOuterAngle;
+ SendDoubleParameterToStream(CONE_OUTER_ANGLE, mConeOuterAngle);
+ }
+
+ double ConeOuterGain() const
+ {
+ return mConeOuterGain;
+ }
+ void SetConeOuterGain(double aConeOuterGain)
+ {
+ if (WebAudioUtils::FuzzyEqual(mConeOuterGain, aConeOuterGain)) {
+ return;
+ }
+ mConeOuterGain = aConeOuterGain;
+ SendDoubleParameterToStream(CONE_OUTER_GAIN, mConeOuterGain);
+ }
+
+ AudioParam* PositionX()
+ {
+ return mPositionX;
+ }
+
+ AudioParam* PositionY()
+ {
+ return mPositionY;
+ }
+
+ AudioParam* PositionZ()
+ {
+ return mPositionZ;
+ }
+
+ AudioParam* OrientationX()
+ {
+ return mOrientationX;
+ }
+
+ AudioParam* OrientationY()
+ {
+ return mOrientationY;
+ }
+
+ AudioParam* OrientationZ()
+ {
+ return mOrientationZ;
+ }
+
+
+ float ComputeDopplerShift();
+ void SendDopplerToSourcesIfNeeded();
+ void FindConnectedSources();
+ void FindConnectedSources(AudioNode* aNode, nsTArray<AudioBufferSourceNode*>& aSources, std::set<AudioNode*>& aSeenNodes);
+
+ const char* NodeType() const override
+ {
+ return "PannerNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~PannerNode();
+
+private:
+ friend class AudioListener;
+ friend class PannerNodeEngine;
+ enum EngineParameters {
+ LISTENER_POSITION,
+ LISTENER_FRONT_VECTOR, // unit length
+ LISTENER_RIGHT_VECTOR, // unit length, orthogonal to LISTENER_FRONT_VECTOR
+ LISTENER_VELOCITY,
+ LISTENER_DOPPLER_FACTOR,
+ LISTENER_SPEED_OF_SOUND,
+ PANNING_MODEL,
+ DISTANCE_MODEL,
+ POSITION,
+ POSITIONX,
+ POSITIONY,
+ POSITIONZ,
+ ORIENTATION, // unit length or zero
+ ORIENTATIONX,
+ ORIENTATIONY,
+ ORIENTATIONZ,
+ VELOCITY,
+ REF_DISTANCE,
+ MAX_DISTANCE,
+ ROLLOFF_FACTOR,
+ CONE_INNER_ANGLE,
+ CONE_OUTER_ANGLE,
+ CONE_OUTER_GAIN
+ };
+
+ ThreeDPoint ConvertAudioParamTo3DP(RefPtr <AudioParam> aX, RefPtr <AudioParam> aY, RefPtr <AudioParam> aZ)
+ {
+ return ThreeDPoint(aX->GetValue(), aY->GetValue(), aZ->GetValue());
+ }
+
+ PanningModelType mPanningModel;
+ DistanceModelType mDistanceModel;
+ RefPtr<AudioParam> mPositionX;
+ RefPtr<AudioParam> mPositionY;
+ RefPtr<AudioParam> mPositionZ;
+ RefPtr<AudioParam> mOrientationX;
+ RefPtr<AudioParam> mOrientationY;
+ RefPtr<AudioParam> mOrientationZ;
+ ThreeDPoint mVelocity;
+
+ double mRefDistance;
+ double mMaxDistance;
+ double mRolloffFactor;
+ double mConeInnerAngle;
+ double mConeOuterAngle;
+ double mConeOuterGain;
+
+ // An array of all the AudioBufferSourceNode connected directly or indirectly
+ // to this AudioPannerNode.
+ nsTArray<AudioBufferSourceNode*> mSources;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/PanningUtils.h b/dom/media/webaudio/PanningUtils.h
new file mode 100644
index 000000000..a3be3f45e
--- /dev/null
+++ b/dom/media/webaudio/PanningUtils.h
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef PANNING_UTILS_H
+#define PANNING_UTILS_H
+
+#include "AudioSegment.h"
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+namespace dom {
+
+template<typename T>
+void
+GainMonoToStereo(const AudioBlock& aInput, AudioBlock* aOutput,
+ T aGainL, T aGainR)
+{
+ float* outputL = aOutput->ChannelFloatsForWrite(0);
+ float* outputR = aOutput->ChannelFloatsForWrite(1);
+ const float* input = static_cast<const float*>(aInput.mChannelData[0]);
+
+ MOZ_ASSERT(aInput.ChannelCount() == 1);
+ MOZ_ASSERT(aOutput->ChannelCount() == 2);
+
+ AudioBlockPanMonoToStereo(input, aGainL, aGainR, outputL, outputR);
+}
+
+// T can be float or an array of float, and U can be bool or an array of bool,
+// depending if the value of the parameters are constant for this block.
+template<typename T, typename U>
+void
+GainStereoToStereo(const AudioBlock& aInput, AudioBlock* aOutput,
+ T aGainL, T aGainR, U aOnLeft)
+{
+ float* outputL = aOutput->ChannelFloatsForWrite(0);
+ float* outputR = aOutput->ChannelFloatsForWrite(1);
+ const float* inputL = static_cast<const float*>(aInput.mChannelData[0]);
+ const float* inputR = static_cast<const float*>(aInput.mChannelData[1]);
+
+ MOZ_ASSERT(aInput.ChannelCount() == 2);
+ MOZ_ASSERT(aOutput->ChannelCount() == 2);
+
+ AudioBlockPanStereoToStereo(inputL, inputR, aGainL, aGainR, aOnLeft, outputL, outputR);
+}
+
+// T can be float or an array of float, and U can be bool or an array of bool,
+// depending if the value of the parameters are constant for this block.
+template<typename T, typename U>
+void ApplyStereoPanning(const AudioBlock& aInput, AudioBlock* aOutput,
+ T aGainL, T aGainR, U aOnLeft)
+{
+ if (aInput.ChannelCount() == 1) {
+ GainMonoToStereo(aInput, aOutput, aGainL, aGainR);
+ } else {
+ GainStereoToStereo(aInput, aOutput, aGainL, aGainR, aOnLeft);
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // PANNING_UTILS_H
diff --git a/dom/media/webaudio/PeriodicWave.cpp b/dom/media/webaudio/PeriodicWave.cpp
new file mode 100644
index 000000000..396a93e13
--- /dev/null
+++ b/dom/media/webaudio/PeriodicWave.cpp
@@ -0,0 +1,74 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "PeriodicWave.h"
+#include "AudioContext.h"
+#include "mozilla/dom/PeriodicWaveBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(PeriodicWave, mContext)
+
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(PeriodicWave, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(PeriodicWave, Release)
+
+PeriodicWave::PeriodicWave(AudioContext* aContext,
+ const float* aRealData,
+ const float* aImagData,
+ const uint32_t aLength,
+ const bool aDisableNormalization,
+ ErrorResult& aRv)
+ : mContext(aContext)
+ , mDisableNormalization(aDisableNormalization)
+{
+ MOZ_ASSERT(aContext);
+
+ // Caller should have checked this and thrown.
+ MOZ_ASSERT(aLength > 0);
+ mLength = aLength;
+
+ // Copy coefficient data. The two arrays share an allocation.
+ mCoefficients = new ThreadSharedFloatArrayBufferList(2);
+ float* buffer = static_cast<float*>(malloc(aLength*sizeof(float)*2));
+ if (buffer == nullptr) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return;
+ }
+ PodCopy(buffer, aRealData, aLength);
+ mCoefficients->SetData(0, buffer, free, buffer);
+ PodCopy(buffer+aLength, aImagData, aLength);
+ mCoefficients->SetData(1, nullptr, free, buffer+aLength);
+}
+
+size_t
+PeriodicWave::SizeOfExcludingThisIfNotShared(MallocSizeOf aMallocSizeOf) const
+{
+ // Not owned:
+ // - mContext
+ size_t amount = 0;
+ if (!mCoefficients->IsShared()) {
+ amount += mCoefficients->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+size_t
+PeriodicWave::SizeOfIncludingThisIfNotShared(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThisIfNotShared(aMallocSizeOf);
+}
+
+JSObject*
+PeriodicWave::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return PeriodicWaveBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/PeriodicWave.h b/dom/media/webaudio/PeriodicWave.h
new file mode 100644
index 000000000..b67d597e4
--- /dev/null
+++ b/dom/media/webaudio/PeriodicWave.h
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef PeriodicWave_h_
+#define PeriodicWave_h_
+
+#include "nsWrapperCache.h"
+#include "nsCycleCollectionParticipant.h"
+#include "mozilla/Attributes.h"
+#include "AudioContext.h"
+#include "AudioNodeEngine.h"
+
+namespace mozilla {
+
+namespace dom {
+
+class PeriodicWave final : public nsWrapperCache
+{
+public:
+ PeriodicWave(AudioContext* aContext,
+ const float* aRealData,
+ const float* aImagData,
+ const uint32_t aLength,
+ const bool aDisableNormalization,
+ ErrorResult& aRv);
+
+ NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(PeriodicWave)
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(PeriodicWave)
+
+ AudioContext* GetParentObject() const
+ {
+ return mContext;
+ }
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint32_t DataLength() const
+ {
+ return mLength;
+ }
+
+ bool DisableNormalization() const
+ {
+ return mDisableNormalization;
+ }
+
+ ThreadSharedFloatArrayBufferList* GetThreadSharedBuffer() const
+ {
+ return mCoefficients;
+ }
+
+ size_t SizeOfExcludingThisIfNotShared(MallocSizeOf aMallocSizeOf) const;
+ size_t SizeOfIncludingThisIfNotShared(MallocSizeOf aMallocSizeOf) const;
+
+private:
+ ~PeriodicWave() {}
+
+ RefPtr<AudioContext> mContext;
+ RefPtr<ThreadSharedFloatArrayBufferList> mCoefficients;
+ uint32_t mLength;
+ bool mDisableNormalization;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/PlayingRefChangeHandler.h b/dom/media/webaudio/PlayingRefChangeHandler.h
new file mode 100644
index 000000000..6436d1dbc
--- /dev/null
+++ b/dom/media/webaudio/PlayingRefChangeHandler.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef PlayingRefChangeHandler_h__
+#define PlayingRefChangeHandler_h__
+
+#include "nsThreadUtils.h"
+#include "AudioNodeStream.h"
+
+namespace mozilla {
+namespace dom {
+
+class PlayingRefChangeHandler final : public Runnable
+{
+public:
+ enum ChangeType { ADDREF, RELEASE };
+ PlayingRefChangeHandler(AudioNodeStream* aStream, ChangeType aChange)
+ : mStream(aStream)
+ , mChange(aChange)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<AudioNode> node = mStream->Engine()->NodeMainThread();
+ if (node) {
+ if (mChange == ADDREF) {
+ node->MarkActive();
+ } else if (mChange == RELEASE) {
+ node->MarkInactive();
+ }
+ }
+ return NS_OK;
+ }
+
+private:
+ RefPtr<AudioNodeStream> mStream;
+ ChangeType mChange;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/ReportDecodeResultTask.h b/dom/media/webaudio/ReportDecodeResultTask.h
new file mode 100644
index 000000000..5d34f3438
--- /dev/null
+++ b/dom/media/webaudio/ReportDecodeResultTask.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ReportDecodeResultTask_h_
+#define ReportDecodeResultTask_h_
+
+#include "mozilla/Attributes.h"
+#include "MediaBufferDecoder.h"
+
+namespace mozilla {
+
+class ReportDecodeResultTask final : public Runnable
+{
+public:
+ ReportDecodeResultTask(DecodeJob& aDecodeJob,
+ DecodeJob::ResultFn aFunction)
+ : mDecodeJob(aDecodeJob)
+ , mFunction(aFunction)
+ {
+ MOZ_ASSERT(aFunction);
+ }
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ (mDecodeJob.*mFunction)();
+
+ return NS_OK;
+ }
+
+private:
+ DecodeJob& mDecodeJob;
+ DecodeJob::ResultFn mFunction;
+};
+
+}
+
+#endif
+
diff --git a/dom/media/webaudio/ScriptProcessorNode.cpp b/dom/media/webaudio/ScriptProcessorNode.cpp
new file mode 100644
index 000000000..3b5df51ef
--- /dev/null
+++ b/dom/media/webaudio/ScriptProcessorNode.cpp
@@ -0,0 +1,573 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ScriptProcessorNode.h"
+#include "mozilla/dom/ScriptProcessorNodeBinding.h"
+#include "AudioBuffer.h"
+#include "AudioDestinationNode.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioProcessingEvent.h"
+#include "WebAudioUtils.h"
+#include "mozilla/dom/ScriptSettings.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/PodOperations.h"
+#include "nsAutoPtr.h"
+#include <deque>
+
+namespace mozilla {
+namespace dom {
+
+// The maximum latency, in seconds, that we can live with before dropping
+// buffers.
+static const float MAX_LATENCY_S = 0.5;
+
+NS_IMPL_ISUPPORTS_INHERITED0(ScriptProcessorNode, AudioNode)
+
+// This class manages a queue of output buffers shared between
+// the main thread and the Media Stream Graph thread.
+class SharedBuffers final
+{
+private:
+ class OutputQueue final
+ {
+ public:
+ explicit OutputQueue(const char* aName)
+ : mMutex(aName)
+ {}
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ mMutex.AssertCurrentThreadOwns();
+
+ size_t amount = 0;
+ for (size_t i = 0; i < mBufferList.size(); i++) {
+ amount += mBufferList[i].SizeOfExcludingThis(aMallocSizeOf, false);
+ }
+
+ return amount;
+ }
+
+ Mutex& Lock() const { return const_cast<OutputQueue*>(this)->mMutex; }
+
+ size_t ReadyToConsume() const
+ {
+ // Accessed on both main thread and media graph thread.
+ mMutex.AssertCurrentThreadOwns();
+ return mBufferList.size();
+ }
+
+ // Produce one buffer
+ AudioChunk& Produce()
+ {
+ mMutex.AssertCurrentThreadOwns();
+ MOZ_ASSERT(NS_IsMainThread());
+ mBufferList.push_back(AudioChunk());
+ return mBufferList.back();
+ }
+
+ // Consumes one buffer.
+ AudioChunk Consume()
+ {
+ mMutex.AssertCurrentThreadOwns();
+ MOZ_ASSERT(!NS_IsMainThread());
+ MOZ_ASSERT(ReadyToConsume() > 0);
+ AudioChunk front = mBufferList.front();
+ mBufferList.pop_front();
+ return front;
+ }
+
+ // Empties the buffer queue.
+ void Clear()
+ {
+ mMutex.AssertCurrentThreadOwns();
+ mBufferList.clear();
+ }
+
+ private:
+ typedef std::deque<AudioChunk> BufferList;
+
+ // Synchronizes access to mBufferList. Note that it's the responsibility
+ // of the callers to perform the required locking, and we assert that every
+ // time we access mBufferList.
+ Mutex mMutex;
+ // The list representing the queue.
+ BufferList mBufferList;
+ };
+
+public:
+ explicit SharedBuffers(float aSampleRate)
+ : mOutputQueue("SharedBuffers::outputQueue")
+ , mDelaySoFar(STREAM_TIME_MAX)
+ , mSampleRate(aSampleRate)
+ , mLatency(0.0)
+ , mDroppingBuffers(false)
+ {
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = aMallocSizeOf(this);
+
+ {
+ MutexAutoLock lock(mOutputQueue.Lock());
+ amount += mOutputQueue.SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ // main thread
+ void FinishProducingOutputBuffer(ThreadSharedFloatArrayBufferList* aBuffer,
+ uint32_t aBufferSize)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ TimeStamp now = TimeStamp::Now();
+
+ if (mLastEventTime.IsNull()) {
+ mLastEventTime = now;
+ } else {
+ // When main thread blocking has built up enough so
+ // |mLatency > MAX_LATENCY_S|, frame dropping starts. It continues until
+ // the output buffer is completely empty, at which point the accumulated
+ // latency is also reset to 0.
+ // It could happen that the output queue becomes empty before the input
+ // node has fully caught up. In this case there will be events where
+ // |(now - mLastEventTime)| is very short, making mLatency negative.
+ // As this happens and the size of |mLatency| becomes greater than
+ // MAX_LATENCY_S, frame dropping starts again to maintain an as short
+ // output queue as possible.
+ float latency = (now - mLastEventTime).ToSeconds();
+ float bufferDuration = aBufferSize / mSampleRate;
+ mLatency += latency - bufferDuration;
+ mLastEventTime = now;
+ if (fabs(mLatency) > MAX_LATENCY_S) {
+ mDroppingBuffers = true;
+ }
+ }
+
+ MutexAutoLock lock(mOutputQueue.Lock());
+ if (mDroppingBuffers) {
+ if (mOutputQueue.ReadyToConsume()) {
+ return;
+ }
+ mDroppingBuffers = false;
+ mLatency = 0;
+ }
+
+ for (uint32_t offset = 0; offset < aBufferSize; offset += WEBAUDIO_BLOCK_SIZE) {
+ AudioChunk& chunk = mOutputQueue.Produce();
+ if (aBuffer) {
+ chunk.mDuration = WEBAUDIO_BLOCK_SIZE;
+ chunk.mBuffer = aBuffer;
+ chunk.mChannelData.SetLength(aBuffer->GetChannels());
+ for (uint32_t i = 0; i < aBuffer->GetChannels(); ++i) {
+ chunk.mChannelData[i] = aBuffer->GetData(i) + offset;
+ }
+ chunk.mVolume = 1.0f;
+ chunk.mBufferFormat = AUDIO_FORMAT_FLOAT32;
+ } else {
+ chunk.SetNull(WEBAUDIO_BLOCK_SIZE);
+ }
+ }
+ }
+
+ // graph thread
+ AudioChunk GetOutputBuffer()
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ AudioChunk buffer;
+
+ {
+ MutexAutoLock lock(mOutputQueue.Lock());
+ if (mOutputQueue.ReadyToConsume() > 0) {
+ if (mDelaySoFar == STREAM_TIME_MAX) {
+ mDelaySoFar = 0;
+ }
+ buffer = mOutputQueue.Consume();
+ } else {
+ // If we're out of buffers to consume, just output silence
+ buffer.SetNull(WEBAUDIO_BLOCK_SIZE);
+ if (mDelaySoFar != STREAM_TIME_MAX) {
+ // Remember the delay that we just hit
+ mDelaySoFar += WEBAUDIO_BLOCK_SIZE;
+ }
+ }
+ }
+
+ return buffer;
+ }
+
+ StreamTime DelaySoFar() const
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ return mDelaySoFar == STREAM_TIME_MAX ? 0 : mDelaySoFar;
+ }
+
+ void Reset()
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+ mDelaySoFar = STREAM_TIME_MAX;
+ mLatency = 0.0f;
+ {
+ MutexAutoLock lock(mOutputQueue.Lock());
+ mOutputQueue.Clear();
+ }
+ mLastEventTime = TimeStamp();
+ }
+
+private:
+ OutputQueue mOutputQueue;
+ // How much delay we've seen so far. This measures the amount of delay
+ // caused by the main thread lagging behind in producing output buffers.
+ // STREAM_TIME_MAX means that we have not received our first buffer yet.
+ StreamTime mDelaySoFar;
+ // The samplerate of the context.
+ float mSampleRate;
+ // This is the latency caused by the buffering. If this grows too high, we
+ // will drop buffers until it is acceptable.
+ float mLatency;
+ // This is the time at which we last produced a buffer, to detect if the main
+ // thread has been blocked.
+ TimeStamp mLastEventTime;
+ // True if we should be dropping buffers.
+ bool mDroppingBuffers;
+};
+
+class ScriptProcessorNodeEngine final : public AudioNodeEngine
+{
+public:
+ ScriptProcessorNodeEngine(ScriptProcessorNode* aNode,
+ AudioDestinationNode* aDestination,
+ uint32_t aBufferSize,
+ uint32_t aNumberOfInputChannels)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ , mSharedBuffers(new SharedBuffers(mDestination->SampleRate()))
+ , mBufferSize(aBufferSize)
+ , mInputChannelCount(aNumberOfInputChannels)
+ , mInputWriteIndex(0)
+ {
+ }
+
+ SharedBuffers* GetSharedBuffers() const
+ {
+ return mSharedBuffers;
+ }
+
+ enum {
+ IS_CONNECTED,
+ };
+
+ void SetInt32Parameter(uint32_t aIndex, int32_t aParam) override
+ {
+ switch (aIndex) {
+ case IS_CONNECTED:
+ mIsConnected = aParam;
+ break;
+ default:
+ NS_ERROR("Bad Int32Parameter");
+ } // End index switch.
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ // This node is not connected to anything. Per spec, we don't fire the
+ // onaudioprocess event. We also want to clear out the input and output
+ // buffer queue, and output a null buffer.
+ if (!mIsConnected) {
+ aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
+ mSharedBuffers->Reset();
+ mInputWriteIndex = 0;
+ return;
+ }
+
+ // The input buffer is allocated lazily when non-null input is received.
+ if (!aInput.IsNull() && !mInputBuffer) {
+ mInputBuffer = ThreadSharedFloatArrayBufferList::
+ Create(mInputChannelCount, mBufferSize, fallible);
+ if (mInputBuffer && mInputWriteIndex) {
+ // Zero leading for null chunks that were skipped.
+ for (uint32_t i = 0; i < mInputChannelCount; ++i) {
+ float* channelData = mInputBuffer->GetDataForWrite(i);
+ PodZero(channelData, mInputWriteIndex);
+ }
+ }
+ }
+
+ // First, record our input buffer, if its allocation succeeded.
+ uint32_t inputChannelCount = mInputBuffer ? mInputBuffer->GetChannels() : 0;
+ for (uint32_t i = 0; i < inputChannelCount; ++i) {
+ float* writeData = mInputBuffer->GetDataForWrite(i) + mInputWriteIndex;
+ if (aInput.IsNull()) {
+ PodZero(writeData, aInput.GetDuration());
+ } else {
+ MOZ_ASSERT(aInput.GetDuration() == WEBAUDIO_BLOCK_SIZE, "sanity check");
+ MOZ_ASSERT(aInput.ChannelCount() == inputChannelCount);
+ AudioBlockCopyChannelWithScale(static_cast<const float*>(aInput.mChannelData[i]),
+ aInput.mVolume, writeData);
+ }
+ }
+ mInputWriteIndex += aInput.GetDuration();
+
+ // Now, see if we have data to output
+ // Note that we need to do this before sending the buffer to the main
+ // thread so that our delay time is updated.
+ *aOutput = mSharedBuffers->GetOutputBuffer();
+
+ if (mInputWriteIndex >= mBufferSize) {
+ SendBuffersToMainThread(aStream, aFrom);
+ mInputWriteIndex -= mBufferSize;
+ }
+ }
+
+ bool IsActive() const override
+ {
+ // Could return false when !mIsConnected after all output chunks produced
+ // by main thread events calling
+ // SharedBuffers::FinishProducingOutputBuffer() have been processed.
+ return true;
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Not owned:
+ // - mDestination (probably)
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mSharedBuffers->SizeOfIncludingThis(aMallocSizeOf);
+ if (mInputBuffer) {
+ amount += mInputBuffer->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ void SendBuffersToMainThread(AudioNodeStream* aStream, GraphTime aFrom)
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+
+ // we now have a full input buffer ready to be sent to the main thread.
+ StreamTime playbackTick = mDestination->GraphTimeToStreamTime(aFrom);
+ // Add the duration of the current sample
+ playbackTick += WEBAUDIO_BLOCK_SIZE;
+ // Add the delay caused by the main thread
+ playbackTick += mSharedBuffers->DelaySoFar();
+ // Compute the playback time in the coordinate system of the destination
+ double playbackTime = mDestination->StreamTimeToSeconds(playbackTick);
+
+ class Command final : public Runnable
+ {
+ public:
+ Command(AudioNodeStream* aStream,
+ already_AddRefed<ThreadSharedFloatArrayBufferList> aInputBuffer,
+ double aPlaybackTime)
+ : mStream(aStream)
+ , mInputBuffer(aInputBuffer)
+ , mPlaybackTime(aPlaybackTime)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<ThreadSharedFloatArrayBufferList> output;
+
+ auto engine =
+ static_cast<ScriptProcessorNodeEngine*>(mStream->Engine());
+ {
+ auto node = static_cast<ScriptProcessorNode*>
+ (engine->NodeMainThread());
+ if (!node) {
+ return NS_OK;
+ }
+
+ if (node->HasListenersFor(nsGkAtoms::onaudioprocess)) {
+ output = DispatchAudioProcessEvent(node);
+ }
+ // The node may have been destroyed during event dispatch.
+ }
+
+ // Append it to our output buffer queue
+ engine->GetSharedBuffers()->
+ FinishProducingOutputBuffer(output, engine->mBufferSize);
+
+ return NS_OK;
+ }
+
+ // Returns the output buffers if set in event handlers.
+ ThreadSharedFloatArrayBufferList*
+ DispatchAudioProcessEvent(ScriptProcessorNode* aNode)
+ {
+ AudioContext* context = aNode->Context();
+ if (!context) {
+ return nullptr;
+ }
+
+ AutoJSAPI jsapi;
+ if (NS_WARN_IF(!jsapi.Init(aNode->GetOwner()))) {
+ return nullptr;
+ }
+ JSContext* cx = jsapi.cx();
+ uint32_t inputChannelCount = aNode->ChannelCount();
+
+ // Create the input buffer
+ RefPtr<AudioBuffer> inputBuffer;
+ if (mInputBuffer) {
+ ErrorResult rv;
+ inputBuffer =
+ AudioBuffer::Create(context, inputChannelCount,
+ aNode->BufferSize(), context->SampleRate(),
+ mInputBuffer.forget(), rv);
+ if (rv.Failed()) {
+ rv.SuppressException();
+ return nullptr;
+ }
+ }
+
+ // Ask content to produce data in the output buffer
+ // Note that we always avoid creating the output buffer here, and we try to
+ // avoid creating the input buffer as well. The AudioProcessingEvent class
+ // knows how to lazily create them if needed once the script tries to access
+ // them. Otherwise, we may be able to get away without creating them!
+ RefPtr<AudioProcessingEvent> event =
+ new AudioProcessingEvent(aNode, nullptr, nullptr);
+ event->InitEvent(inputBuffer, inputChannelCount, mPlaybackTime);
+ aNode->DispatchTrustedEvent(event);
+
+ // Steal the output buffers if they have been set.
+ // Don't create a buffer if it hasn't been used to return output;
+ // FinishProducingOutputBuffer() will optimize output = null.
+ // GetThreadSharedChannelsForRate() may also return null after OOM.
+ if (event->HasOutputBuffer()) {
+ ErrorResult rv;
+ AudioBuffer* buffer = event->GetOutputBuffer(rv);
+ // HasOutputBuffer() returning true means that GetOutputBuffer()
+ // will not fail.
+ MOZ_ASSERT(!rv.Failed());
+ return buffer->GetThreadSharedChannelsForRate(cx);
+ }
+
+ return nullptr;
+ }
+ private:
+ RefPtr<AudioNodeStream> mStream;
+ RefPtr<ThreadSharedFloatArrayBufferList> mInputBuffer;
+ double mPlaybackTime;
+ };
+
+ NS_DispatchToMainThread(new Command(aStream, mInputBuffer.forget(),
+ playbackTime));
+ }
+
+ friend class ScriptProcessorNode;
+
+ AudioNodeStream* mDestination;
+ nsAutoPtr<SharedBuffers> mSharedBuffers;
+ RefPtr<ThreadSharedFloatArrayBufferList> mInputBuffer;
+ const uint32_t mBufferSize;
+ const uint32_t mInputChannelCount;
+ // The write index into the current input buffer
+ uint32_t mInputWriteIndex;
+ bool mIsConnected = false;
+};
+
+ScriptProcessorNode::ScriptProcessorNode(AudioContext* aContext,
+ uint32_t aBufferSize,
+ uint32_t aNumberOfInputChannels,
+ uint32_t aNumberOfOutputChannels)
+ : AudioNode(aContext,
+ aNumberOfInputChannels,
+ mozilla::dom::ChannelCountMode::Explicit,
+ mozilla::dom::ChannelInterpretation::Speakers)
+ , mBufferSize(aBufferSize ?
+ aBufferSize : // respect what the web developer requested
+ 4096) // choose our own buffer size -- 4KB for now
+ , mNumberOfOutputChannels(aNumberOfOutputChannels)
+{
+ MOZ_ASSERT(BufferSize() % WEBAUDIO_BLOCK_SIZE == 0, "Invalid buffer size");
+ ScriptProcessorNodeEngine* engine =
+ new ScriptProcessorNodeEngine(this,
+ aContext->Destination(),
+ BufferSize(),
+ aNumberOfInputChannels);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+ScriptProcessorNode::~ScriptProcessorNode()
+{
+}
+
+size_t
+ScriptProcessorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+ScriptProcessorNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+ScriptProcessorNode::EventListenerAdded(nsIAtom* aType)
+{
+ AudioNode::EventListenerAdded(aType);
+ if (aType == nsGkAtoms::onaudioprocess) {
+ UpdateConnectedStatus();
+ }
+}
+
+void
+ScriptProcessorNode::EventListenerRemoved(nsIAtom* aType)
+{
+ AudioNode::EventListenerRemoved(aType);
+ if (aType == nsGkAtoms::onaudioprocess) {
+ UpdateConnectedStatus();
+ }
+}
+
+JSObject*
+ScriptProcessorNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return ScriptProcessorNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+ScriptProcessorNode::UpdateConnectedStatus()
+{
+ bool isConnected = mHasPhantomInput ||
+ !(OutputNodes().IsEmpty() && OutputParams().IsEmpty()
+ && InputNodes().IsEmpty());
+
+ // Events are queued even when there is no listener because a listener
+ // may be added while events are in the queue.
+ SendInt32ParameterToStream(ScriptProcessorNodeEngine::IS_CONNECTED,
+ isConnected);
+
+ if (isConnected && HasListenersFor(nsGkAtoms::onaudioprocess)) {
+ MarkActive();
+ } else {
+ MarkInactive();
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
+
diff --git a/dom/media/webaudio/ScriptProcessorNode.h b/dom/media/webaudio/ScriptProcessorNode.h
new file mode 100644
index 000000000..bd1170e9c
--- /dev/null
+++ b/dom/media/webaudio/ScriptProcessorNode.h
@@ -0,0 +1,147 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ScriptProcessorNode_h_
+#define ScriptProcessorNode_h_
+
+#include "AudioNode.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+class SharedBuffers;
+
+class ScriptProcessorNode final : public AudioNode
+{
+public:
+ ScriptProcessorNode(AudioContext* aContext,
+ uint32_t aBufferSize,
+ uint32_t aNumberOfInputChannels,
+ uint32_t aNumberOfOutputChannels);
+
+ NS_DECL_ISUPPORTS_INHERITED
+
+ IMPL_EVENT_HANDLER(audioprocess)
+
+ void EventListenerAdded(nsIAtom* aType) override;
+ void EventListenerRemoved(nsIAtom* aType) override;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ AudioNode* Connect(AudioNode& aDestination, uint32_t aOutput,
+ uint32_t aInput, ErrorResult& aRv) override
+ {
+ AudioNode* node = AudioNode::Connect(aDestination, aOutput, aInput, aRv);
+ if (!aRv.Failed()) {
+ UpdateConnectedStatus();
+ }
+ return node;
+ }
+
+ void Connect(AudioParam& aDestination, uint32_t aOutput,
+ ErrorResult& aRv) override
+ {
+ AudioNode::Connect(aDestination, aOutput, aRv);
+ if (!aRv.Failed()) {
+ UpdateConnectedStatus();
+ }
+ }
+ void Disconnect(ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aRv);
+ UpdateConnectedStatus();
+ }
+ void Disconnect(uint32_t aOutput, ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aOutput, aRv);
+ UpdateConnectedStatus();
+ }
+ void NotifyInputsChanged() override
+ {
+ UpdateConnectedStatus();
+ }
+ void NotifyHasPhantomInput() override
+ {
+ mHasPhantomInput = true;
+ // No need to UpdateConnectedStatus() because there was previously an
+ // input in InputNodes().
+ }
+ void Disconnect(AudioNode& aDestination, ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aDestination, aRv);
+ UpdateConnectedStatus();
+ }
+ void Disconnect(AudioNode& aDestination, uint32_t aOutput, ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aDestination, aOutput, aRv);
+ UpdateConnectedStatus();
+ }
+ void Disconnect(AudioNode& aDestination, uint32_t aOutput, uint32_t aInput, ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aDestination, aOutput, aInput, aRv);
+ UpdateConnectedStatus();
+ }
+ void Disconnect(AudioParam& aDestination, ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aDestination, aRv);
+ UpdateConnectedStatus();
+ }
+ void Disconnect(AudioParam& aDestination, uint32_t aOutput, ErrorResult& aRv) override
+ {
+ AudioNode::Disconnect(aDestination, aOutput, aRv);
+ UpdateConnectedStatus();
+ }
+ void SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv) override
+ {
+ if (aChannelCount != ChannelCount()) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ }
+ return;
+ }
+ void SetChannelCountModeValue(ChannelCountMode aMode, ErrorResult& aRv) override
+ {
+ if (aMode != ChannelCountMode::Explicit) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ }
+ return;
+ }
+
+ uint32_t BufferSize() const
+ {
+ return mBufferSize;
+ }
+
+ uint32_t NumberOfOutputChannels() const
+ {
+ return mNumberOfOutputChannels;
+ }
+
+ using DOMEventTargetHelper::DispatchTrustedEvent;
+
+ const char* NodeType() const override
+ {
+ return "ScriptProcessorNode";
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+private:
+ virtual ~ScriptProcessorNode();
+
+ void UpdateConnectedStatus();
+
+ const uint32_t mBufferSize;
+ const uint32_t mNumberOfOutputChannels;
+ bool mHasPhantomInput = false;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/StereoPannerNode.cpp b/dom/media/webaudio/StereoPannerNode.cpp
new file mode 100644
index 000000000..fc804e7b4
--- /dev/null
+++ b/dom/media/webaudio/StereoPannerNode.cpp
@@ -0,0 +1,211 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "StereoPannerNode.h"
+#include "mozilla/dom/StereoPannerNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "AudioDestinationNode.h"
+#include "AlignmentUtils.h"
+#include "WebAudioUtils.h"
+#include "PanningUtils.h"
+#include "AudioParamTimeline.h"
+#include "AudioParam.h"
+
+namespace mozilla {
+namespace dom {
+
+using namespace std;
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(StereoPannerNode, AudioNode, mPan)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(StereoPannerNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(StereoPannerNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(StereoPannerNode, AudioNode)
+
+class StereoPannerNodeEngine final : public AudioNodeEngine
+{
+public:
+ StereoPannerNodeEngine(AudioNode* aNode,
+ AudioDestinationNode* aDestination)
+ : AudioNodeEngine(aNode)
+ , mDestination(aDestination->Stream())
+ // Keep the default value in sync with the default value in
+ // StereoPannerNode::StereoPannerNode.
+ , mPan(0.f)
+ {
+ }
+
+ enum Parameters {
+ PAN
+ };
+ void RecvTimelineEvent(uint32_t aIndex,
+ AudioTimelineEvent& aEvent) override
+ {
+ MOZ_ASSERT(mDestination);
+ WebAudioUtils::ConvertAudioTimelineEventToTicks(aEvent,
+ mDestination);
+
+ switch (aIndex) {
+ case PAN:
+ mPan.InsertEvent<int64_t>(aEvent);
+ break;
+ default:
+ NS_ERROR("Bad StereoPannerNode TimelineParameter");
+ }
+ }
+
+ void GetGainValuesForPanning(float aPanning,
+ bool aMonoToStereo,
+ float& aLeftGain,
+ float& aRightGain)
+ {
+ // Clamp and normalize the panning in [0; 1]
+ aPanning = std::min(std::max(aPanning, -1.f), 1.f);
+
+ if (aMonoToStereo) {
+ aPanning += 1;
+ aPanning /= 2;
+ } else if (aPanning <= 0) {
+ aPanning += 1;
+ }
+
+ aLeftGain = cos(0.5 * M_PI * aPanning);
+ aRightGain = sin(0.5 * M_PI * aPanning);
+ }
+
+ void SetToSilentStereoBlock(AudioBlock* aChunk)
+ {
+ for (uint32_t channel = 0; channel < 2; channel++) {
+ float* samples = aChunk->ChannelFloatsForWrite(channel);
+ for (uint32_t i = 0; i < WEBAUDIO_BLOCK_SIZE; i++) {
+ samples[i] = 0.f;
+ }
+ }
+ }
+
+ void UpmixToStereoIfNeeded(const AudioBlock& aInput, AudioBlock* aOutput)
+ {
+ if (aInput.ChannelCount() == 2) {
+ const float* inputL = static_cast<const float*>(aInput.mChannelData[0]);
+ const float* inputR = static_cast<const float*>(aInput.mChannelData[1]);
+ float* outputL = aOutput->ChannelFloatsForWrite(0);
+ float* outputR = aOutput->ChannelFloatsForWrite(1);
+
+ AudioBlockCopyChannelWithScale(inputL, aInput.mVolume, outputL);
+ AudioBlockCopyChannelWithScale(inputR, aInput.mVolume, outputR);
+ } else {
+ MOZ_ASSERT(aInput.ChannelCount() == 1);
+ GainMonoToStereo(aInput, aOutput, aInput.mVolume, aInput.mVolume);
+ }
+ }
+
+ virtual void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool *aFinished) override
+ {
+ // The output of this node is always stereo, no matter what the inputs are.
+ MOZ_ASSERT(aInput.ChannelCount() <= 2);
+ aOutput->AllocateChannels(2);
+ bool monoToStereo = aInput.ChannelCount() == 1;
+
+ if (aInput.IsNull()) {
+ // If input is silent, so is the output
+ SetToSilentStereoBlock(aOutput);
+ } else if (mPan.HasSimpleValue()) {
+ float panning = mPan.GetValue();
+ // If the panning is 0.0, we can simply copy the input to the
+ // output with gain applied, up-mixing to stereo if needed.
+ if (panning == 0.0f) {
+ UpmixToStereoIfNeeded(aInput, aOutput);
+ } else {
+ // Optimize the case where the panning is constant for this processing
+ // block: we can just apply a constant gain on the left and right
+ // channel
+ float gainL, gainR;
+
+ GetGainValuesForPanning(panning, monoToStereo, gainL, gainR);
+ ApplyStereoPanning(aInput, aOutput,
+ gainL * aInput.mVolume,
+ gainR * aInput.mVolume,
+ panning <= 0);
+ }
+ } else {
+ float computedGain[2*WEBAUDIO_BLOCK_SIZE + 4];
+ bool onLeft[WEBAUDIO_BLOCK_SIZE];
+
+ float values[WEBAUDIO_BLOCK_SIZE];
+ StreamTime tick = mDestination->GraphTimeToStreamTime(aFrom);
+ mPan.GetValuesAtTime(tick, values, WEBAUDIO_BLOCK_SIZE);
+
+ float* alignedComputedGain = ALIGNED16(computedGain);
+ ASSERT_ALIGNED16(alignedComputedGain);
+ for (size_t counter = 0; counter < WEBAUDIO_BLOCK_SIZE; ++counter) {
+ float left, right;
+ GetGainValuesForPanning(values[counter], monoToStereo, left, right);
+
+ alignedComputedGain[counter] = left * aInput.mVolume;
+ alignedComputedGain[WEBAUDIO_BLOCK_SIZE + counter] = right * aInput.mVolume;
+ onLeft[counter] = values[counter] <= 0;
+ }
+
+ // Apply the gain to the output buffer
+ ApplyStereoPanning(aInput, aOutput, alignedComputedGain, &alignedComputedGain[WEBAUDIO_BLOCK_SIZE], onLeft);
+ }
+ }
+
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ AudioNodeStream* mDestination;
+ AudioParamTimeline mPan;
+};
+
+StereoPannerNode::StereoPannerNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Clamped_max,
+ ChannelInterpretation::Speakers)
+ , mPan(new AudioParam(this, StereoPannerNodeEngine::PAN, 0.f, "pan"))
+{
+ StereoPannerNodeEngine* engine = new StereoPannerNodeEngine(this, aContext->Destination());
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+StereoPannerNode::~StereoPannerNode()
+{
+}
+
+size_t
+StereoPannerNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mPan->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+StereoPannerNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+JSObject*
+StereoPannerNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return StereoPannerNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/StereoPannerNode.h b/dom/media/webaudio/StereoPannerNode.h
new file mode 100644
index 000000000..68204f757
--- /dev/null
+++ b/dom/media/webaudio/StereoPannerNode.h
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef StereoPannerNode_h_
+#define StereoPannerNode_h_
+
+#include "AudioNode.h"
+#include "mozilla/dom/StereoPannerNodeBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class StereoPannerNode final : public AudioNode
+{
+public:
+ MOZ_DECLARE_REFCOUNTED_TYPENAME(StereoPannerNode)
+ explicit StereoPannerNode(AudioContext* aContext);
+
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ virtual void SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv) override
+ {
+ if (aChannelCount > 2) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ AudioNode::SetChannelCount(aChannelCount, aRv);
+ }
+ virtual void SetChannelCountModeValue(ChannelCountMode aMode, ErrorResult& aRv) override
+ {
+ if (aMode == ChannelCountMode::Max) {
+ aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return;
+ }
+ AudioNode::SetChannelCountModeValue(aMode, aRv);
+ }
+
+ AudioParam* Pan() const
+ {
+ return mPan;
+ }
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(StereoPannerNode, AudioNode)
+
+ virtual const char* NodeType() const override
+ {
+ return "StereoPannerNode";
+ }
+
+ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
+ virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
+
+protected:
+ virtual ~StereoPannerNode();
+
+private:
+ RefPtr<AudioParam> mPan;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/ThreeDPoint.cpp b/dom/media/webaudio/ThreeDPoint.cpp
new file mode 100644
index 000000000..ad816eb89
--- /dev/null
+++ b/dom/media/webaudio/ThreeDPoint.cpp
@@ -0,0 +1,49 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Other similar methods can be added if needed.
+ */
+
+#include "ThreeDPoint.h"
+#include "WebAudioUtils.h"
+
+namespace mozilla {
+
+namespace dom {
+
+bool
+ThreeDPoint::FuzzyEqual(const ThreeDPoint& other)
+{
+ return WebAudioUtils::FuzzyEqual(x, other.x) &&
+ WebAudioUtils::FuzzyEqual(y, other.y) &&
+ WebAudioUtils::FuzzyEqual(z, other.z);
+}
+
+ThreeDPoint operator-(const ThreeDPoint& lhs, const ThreeDPoint& rhs)
+{
+ return ThreeDPoint(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z);
+}
+
+ThreeDPoint operator*(const ThreeDPoint& lhs, const ThreeDPoint& rhs)
+{
+ return ThreeDPoint(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z);
+}
+
+ThreeDPoint operator*(const ThreeDPoint& lhs, const double rhs)
+{
+ return ThreeDPoint(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs);
+}
+
+bool operator==(const ThreeDPoint& lhs, const ThreeDPoint& rhs)
+{
+ return lhs.x == rhs.x &&
+ lhs.y == rhs.y &&
+ lhs.z == rhs.z;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/ThreeDPoint.h b/dom/media/webaudio/ThreeDPoint.h
new file mode 100644
index 000000000..b6d51e69a
--- /dev/null
+++ b/dom/media/webaudio/ThreeDPoint.h
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef ThreeDPoint_h_
+#define ThreeDPoint_h_
+
+#include <cmath>
+#include <algorithm>
+
+namespace mozilla {
+
+namespace dom {
+
+struct ThreeDPoint final
+{
+ ThreeDPoint()
+ : x(0.)
+ , y(0.)
+ , z(0.)
+ {
+ }
+ ThreeDPoint(double aX, double aY, double aZ)
+ : x(aX)
+ , y(aY)
+ , z(aZ)
+ {
+ }
+
+ double Magnitude() const
+ {
+ return sqrt(x * x + y * y + z * z);
+ }
+
+ void Normalize()
+ {
+ // Normalize with the maximum norm first to avoid overflow and underflow.
+ double invMax = 1 / MaxNorm();
+ x *= invMax;
+ y *= invMax;
+ z *= invMax;
+
+ double invDistance = 1 / Magnitude();
+ x *= invDistance;
+ y *= invDistance;
+ z *= invDistance;
+ }
+
+ ThreeDPoint CrossProduct(const ThreeDPoint& rhs) const
+ {
+ return ThreeDPoint(y * rhs.z - z * rhs.y,
+ z * rhs.x - x * rhs.z,
+ x * rhs.y - y * rhs.x);
+ }
+
+ double DotProduct(const ThreeDPoint& rhs)
+ {
+ return x * rhs.x + y * rhs.y + z * rhs.z;
+ }
+
+ bool IsZero() const
+ {
+ return x == 0 && y == 0 && z == 0;
+ }
+
+ // For comparing two vectors of close to unit magnitude.
+ bool FuzzyEqual(const ThreeDPoint& other);
+
+ double x, y, z;
+
+private:
+ double MaxNorm() const
+ {
+ return std::max(fabs(x), std::max(fabs(y), fabs(z)));
+ }
+};
+
+ThreeDPoint operator-(const ThreeDPoint& lhs, const ThreeDPoint& rhs);
+ThreeDPoint operator*(const ThreeDPoint& lhs, const ThreeDPoint& rhs);
+ThreeDPoint operator*(const ThreeDPoint& lhs, const double rhs);
+bool operator==(const ThreeDPoint& lhs, const ThreeDPoint& rhs);
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/WaveShaperNode.cpp b/dom/media/webaudio/WaveShaperNode.cpp
new file mode 100644
index 000000000..d5c617dcd
--- /dev/null
+++ b/dom/media/webaudio/WaveShaperNode.cpp
@@ -0,0 +1,392 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WaveShaperNode.h"
+#include "mozilla/dom/WaveShaperNodeBinding.h"
+#include "AlignmentUtils.h"
+#include "AudioNode.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "mozilla/PodOperations.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(WaveShaperNode)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(WaveShaperNode, AudioNode)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
+ tmp->ClearCurve();
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(WaveShaperNode, AudioNode)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(WaveShaperNode)
+ NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
+ NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mCurve)
+NS_IMPL_CYCLE_COLLECTION_TRACE_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(WaveShaperNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(WaveShaperNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(WaveShaperNode, AudioNode)
+
+static uint32_t ValueOf(OverSampleType aType)
+{
+ switch (aType) {
+ case OverSampleType::None: return 1;
+ case OverSampleType::_2x: return 2;
+ case OverSampleType::_4x: return 4;
+ default:
+ NS_NOTREACHED("We should never reach here");
+ return 1;
+ }
+}
+
+class Resampler final
+{
+public:
+ Resampler()
+ : mType(OverSampleType::None)
+ , mUpSampler(nullptr)
+ , mDownSampler(nullptr)
+ , mChannels(0)
+ , mSampleRate(0)
+ {
+ }
+
+ ~Resampler()
+ {
+ Destroy();
+ }
+
+ void Reset(uint32_t aChannels, TrackRate aSampleRate, OverSampleType aType)
+ {
+ if (aChannels == mChannels &&
+ aSampleRate == mSampleRate &&
+ aType == mType) {
+ return;
+ }
+
+ mChannels = aChannels;
+ mSampleRate = aSampleRate;
+ mType = aType;
+
+ Destroy();
+
+ if (aType == OverSampleType::None) {
+ mBuffer.Clear();
+ return;
+ }
+
+ mUpSampler = speex_resampler_init(aChannels,
+ aSampleRate,
+ aSampleRate * ValueOf(aType),
+ SPEEX_RESAMPLER_QUALITY_MIN,
+ nullptr);
+ mDownSampler = speex_resampler_init(aChannels,
+ aSampleRate * ValueOf(aType),
+ aSampleRate,
+ SPEEX_RESAMPLER_QUALITY_MIN,
+ nullptr);
+ mBuffer.SetLength(WEBAUDIO_BLOCK_SIZE*ValueOf(aType));
+ }
+
+ float* UpSample(uint32_t aChannel, const float* aInputData, uint32_t aBlocks)
+ {
+ uint32_t inSamples = WEBAUDIO_BLOCK_SIZE;
+ uint32_t outSamples = WEBAUDIO_BLOCK_SIZE*aBlocks;
+ float* outputData = mBuffer.Elements();
+
+ MOZ_ASSERT(mBuffer.Length() == outSamples);
+
+ WebAudioUtils::SpeexResamplerProcess(mUpSampler, aChannel,
+ aInputData, &inSamples,
+ outputData, &outSamples);
+
+ MOZ_ASSERT(inSamples == WEBAUDIO_BLOCK_SIZE && outSamples == WEBAUDIO_BLOCK_SIZE*aBlocks);
+
+ return outputData;
+ }
+
+ void DownSample(uint32_t aChannel, float* aOutputData, uint32_t aBlocks)
+ {
+ uint32_t inSamples = WEBAUDIO_BLOCK_SIZE*aBlocks;
+ uint32_t outSamples = WEBAUDIO_BLOCK_SIZE;
+ const float* inputData = mBuffer.Elements();
+
+ MOZ_ASSERT(mBuffer.Length() == inSamples);
+
+ WebAudioUtils::SpeexResamplerProcess(mDownSampler, aChannel,
+ inputData, &inSamples,
+ aOutputData, &outSamples);
+
+ MOZ_ASSERT(inSamples == WEBAUDIO_BLOCK_SIZE*aBlocks && outSamples == WEBAUDIO_BLOCK_SIZE);
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = 0;
+ // Future: properly measure speex memory
+ amount += aMallocSizeOf(mUpSampler);
+ amount += aMallocSizeOf(mDownSampler);
+ amount += mBuffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+private:
+ void Destroy()
+ {
+ if (mUpSampler) {
+ speex_resampler_destroy(mUpSampler);
+ mUpSampler = nullptr;
+ }
+ if (mDownSampler) {
+ speex_resampler_destroy(mDownSampler);
+ mDownSampler = nullptr;
+ }
+ }
+
+private:
+ OverSampleType mType;
+ SpeexResamplerState* mUpSampler;
+ SpeexResamplerState* mDownSampler;
+ uint32_t mChannels;
+ TrackRate mSampleRate;
+ nsTArray<float> mBuffer;
+};
+
+class WaveShaperNodeEngine final : public AudioNodeEngine
+{
+public:
+ explicit WaveShaperNodeEngine(AudioNode* aNode)
+ : AudioNodeEngine(aNode)
+ , mType(OverSampleType::None)
+ {
+ }
+
+ enum Parameteres {
+ TYPE
+ };
+
+ void SetRawArrayData(nsTArray<float>& aCurve) override
+ {
+ mCurve.SwapElements(aCurve);
+ }
+
+ void SetInt32Parameter(uint32_t aIndex, int32_t aValue) override
+ {
+ switch (aIndex) {
+ case TYPE:
+ mType = static_cast<OverSampleType>(aValue);
+ break;
+ default:
+ NS_ERROR("Bad WaveShaperNode Int32Parameter");
+ }
+ }
+
+ template <uint32_t blocks>
+ void ProcessCurve(const float* aInputBuffer, float* aOutputBuffer)
+ {
+ for (uint32_t j = 0; j < WEBAUDIO_BLOCK_SIZE*blocks; ++j) {
+ // Index into the curve array based on the amplitude of the
+ // incoming signal by using an amplitude range of [-1, 1] and
+ // performing a linear interpolation of the neighbor values.
+ float index = (mCurve.Length() - 1) * (aInputBuffer[j] + 1.0f) / 2.0f;
+ if (index < 0.0f) {
+ aOutputBuffer[j] = mCurve[0];
+ } else {
+ int32_t indexLower = index;
+ if (static_cast<uint32_t>(indexLower) >= mCurve.Length() - 1) {
+ aOutputBuffer[j] = mCurve[mCurve.Length() - 1];
+ } else {
+ uint32_t indexHigher = indexLower + 1;
+ float interpolationFactor = index - indexLower;
+ aOutputBuffer[j] = (1.0f - interpolationFactor) * mCurve[indexLower] +
+ interpolationFactor * mCurve[indexHigher];
+ }
+ }
+ }
+ }
+
+ void ProcessBlock(AudioNodeStream* aStream,
+ GraphTime aFrom,
+ const AudioBlock& aInput,
+ AudioBlock* aOutput,
+ bool* aFinished) override
+ {
+ uint32_t channelCount = aInput.ChannelCount();
+ if (!mCurve.Length()) {
+ // Optimize the case where we don't have a curve buffer
+ *aOutput = aInput;
+ return;
+ }
+
+ // If the input is null, check to see if non-null output will be produced
+ bool nullInput = false;
+ if (channelCount == 0) {
+ float index = (mCurve.Length() - 1) * 0.5;
+ uint32_t indexLower = index;
+ uint32_t indexHigher = indexLower + 1;
+ float interpolationFactor = index - indexLower;
+ if ((1.0f - interpolationFactor) * mCurve[indexLower] +
+ interpolationFactor * mCurve[indexHigher] == 0.0) {
+ *aOutput = aInput;
+ return;
+ } else {
+ nullInput = true;
+ channelCount = 1;
+ }
+ }
+
+ aOutput->AllocateChannels(channelCount);
+ for (uint32_t i = 0; i < channelCount; ++i) {
+ const float* inputSamples;
+ float scaledInput[WEBAUDIO_BLOCK_SIZE + 4];
+ float* alignedScaledInput = ALIGNED16(scaledInput);
+ ASSERT_ALIGNED16(alignedScaledInput);
+ if (!nullInput) {
+ if (aInput.mVolume != 1.0f) {
+ AudioBlockCopyChannelWithScale(
+ static_cast<const float*>(aInput.mChannelData[i]),
+ aInput.mVolume,
+ alignedScaledInput);
+ inputSamples = alignedScaledInput;
+ } else {
+ inputSamples = static_cast<const float*>(aInput.mChannelData[i]);
+ }
+ } else {
+ PodZero(alignedScaledInput, WEBAUDIO_BLOCK_SIZE);
+ inputSamples = alignedScaledInput;
+ }
+ float* outputBuffer = aOutput->ChannelFloatsForWrite(i);
+ float* sampleBuffer;
+
+ switch (mType) {
+ case OverSampleType::None:
+ mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::None);
+ ProcessCurve<1>(inputSamples, outputBuffer);
+ break;
+ case OverSampleType::_2x:
+ mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::_2x);
+ sampleBuffer = mResampler.UpSample(i, inputSamples, 2);
+ ProcessCurve<2>(sampleBuffer, sampleBuffer);
+ mResampler.DownSample(i, outputBuffer, 2);
+ break;
+ case OverSampleType::_4x:
+ mResampler.Reset(channelCount, aStream->SampleRate(), OverSampleType::_4x);
+ sampleBuffer = mResampler.UpSample(i, inputSamples, 4);
+ ProcessCurve<4>(sampleBuffer, sampleBuffer);
+ mResampler.DownSample(i, outputBuffer, 4);
+ break;
+ default:
+ NS_NOTREACHED("We should never reach here");
+ }
+ }
+ }
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mCurve.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += mResampler.SizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ nsTArray<float> mCurve;
+ OverSampleType mType;
+ Resampler mResampler;
+};
+
+WaveShaperNode::WaveShaperNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Max,
+ ChannelInterpretation::Speakers)
+ , mCurve(nullptr)
+ , mType(OverSampleType::None)
+{
+ mozilla::HoldJSObjects(this);
+
+ WaveShaperNodeEngine* engine = new WaveShaperNodeEngine(this);
+ mStream = AudioNodeStream::Create(aContext, engine,
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
+}
+
+WaveShaperNode::~WaveShaperNode()
+{
+ ClearCurve();
+}
+
+void
+WaveShaperNode::ClearCurve()
+{
+ mCurve = nullptr;
+ mozilla::DropJSObjects(this);
+}
+
+JSObject*
+WaveShaperNode::WrapObject(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return WaveShaperNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+WaveShaperNode::SetCurve(const Nullable<Float32Array>& aCurve, ErrorResult& aRv)
+{
+ nsTArray<float> curve;
+ if (!aCurve.IsNull()) {
+ const Float32Array& floats = aCurve.Value();
+
+ floats.ComputeLengthAndData();
+ if (floats.IsShared()) {
+ // Throw if the object is mapping shared memory (must opt in).
+ aRv.ThrowTypeError<MSG_TYPEDARRAY_IS_SHARED>(NS_LITERAL_STRING("Argument of WaveShaperNode.setCurve"));
+ return;
+ }
+
+ uint32_t argLength = floats.Length();
+ if (argLength < 2) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (!curve.SetLength(argLength, fallible)) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return;
+ }
+
+ PodCopy(curve.Elements(), floats.Data(), floats.Length());
+
+ mCurve = floats.Obj();
+ } else {
+ mCurve = nullptr;
+ }
+
+ AudioNodeStream* ns = mStream;
+ MOZ_ASSERT(ns, "Why don't we have a stream here?");
+ ns->SetRawArrayData(curve);
+}
+
+void
+WaveShaperNode::SetOversample(OverSampleType aType)
+{
+ mType = aType;
+ SendInt32ParameterToStream(WaveShaperNodeEngine::TYPE, static_cast<int32_t>(aType));
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/WaveShaperNode.h b/dom/media/webaudio/WaveShaperNode.h
new file mode 100644
index 000000000..b58841ee6
--- /dev/null
+++ b/dom/media/webaudio/WaveShaperNode.h
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WaveShaperNode_h_
+#define WaveShaperNode_h_
+
+#include "AudioNode.h"
+#include "mozilla/dom/WaveShaperNodeBinding.h"
+#include "mozilla/dom/TypedArray.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioContext;
+
+class WaveShaperNode final : public AudioNode
+{
+public:
+ explicit WaveShaperNode(AudioContext *aContext);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WaveShaperNode, AudioNode)
+
+ JSObject* WrapObject(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void GetCurve(JSContext* aCx, JS::MutableHandle<JSObject*> aRetval) const
+ {
+ aRetval.set(mCurve);
+ }
+ void SetCurve(const Nullable<Float32Array>& aData, ErrorResult& aRv);
+
+ OverSampleType Oversample() const
+ {
+ return mType;
+ }
+ void SetOversample(OverSampleType aType);
+
+ size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ // Possibly track in the future:
+ // - mCurve
+ return AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+ const char* NodeType() const override
+ {
+ return "WaveShaperNode";
+ }
+
+ size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override
+ {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+ }
+
+protected:
+ virtual ~WaveShaperNode();
+
+private:
+ void ClearCurve();
+
+private:
+ JS::Heap<JSObject*> mCurve;
+ OverSampleType mType;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webaudio/WebAudioUtils.cpp b/dom/media/webaudio/WebAudioUtils.cpp
new file mode 100644
index 000000000..6289f803b
--- /dev/null
+++ b/dom/media/webaudio/WebAudioUtils.cpp
@@ -0,0 +1,151 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WebAudioUtils.h"
+#include "AudioNodeStream.h"
+#include "blink/HRTFDatabaseLoader.h"
+
+#include "nsContentUtils.h"
+#include "nsIConsoleService.h"
+#include "nsIScriptError.h"
+
+namespace mozilla {
+
+LazyLogModule gWebAudioAPILog("WebAudioAPI");
+
+namespace dom {
+
+void WebAudioUtils::ConvertAudioTimelineEventToTicks(AudioTimelineEvent& aEvent,
+ AudioNodeStream* aDest)
+{
+ aEvent.SetTimeInTicks(
+ aDest->SecondsToNearestStreamTime(aEvent.Time<double>()));
+ aEvent.mTimeConstant *= aDest->SampleRate();
+ aEvent.mDuration *= aDest->SampleRate();
+}
+
+void
+WebAudioUtils::Shutdown()
+{
+ WebCore::HRTFDatabaseLoader::shutdown();
+}
+
+int
+WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler,
+ uint32_t aChannel,
+ const float* aIn, uint32_t* aInLen,
+ float* aOut, uint32_t* aOutLen)
+{
+#ifdef MOZ_SAMPLE_TYPE_S16
+ AutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp1;
+ AutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp2;
+ tmp1.SetLength(*aInLen);
+ tmp2.SetLength(*aOutLen);
+ ConvertAudioSamples(aIn, tmp1.Elements(), *aInLen);
+ int result = speex_resampler_process_int(aResampler, aChannel, tmp1.Elements(), aInLen, tmp2.Elements(), aOutLen);
+ ConvertAudioSamples(tmp2.Elements(), aOut, *aOutLen);
+ return result;
+#else
+ return speex_resampler_process_float(aResampler, aChannel, aIn, aInLen, aOut, aOutLen);
+#endif
+}
+
+int
+WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler,
+ uint32_t aChannel,
+ const int16_t* aIn, uint32_t* aInLen,
+ float* aOut, uint32_t* aOutLen)
+{
+ AutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp;
+#ifdef MOZ_SAMPLE_TYPE_S16
+ tmp.SetLength(*aOutLen);
+ int result = speex_resampler_process_int(aResampler, aChannel, aIn, aInLen, tmp.Elements(), aOutLen);
+ ConvertAudioSamples(tmp.Elements(), aOut, *aOutLen);
+ return result;
+#else
+ tmp.SetLength(*aInLen);
+ ConvertAudioSamples(aIn, tmp.Elements(), *aInLen);
+ int result = speex_resampler_process_float(aResampler, aChannel, tmp.Elements(), aInLen, aOut, aOutLen);
+ return result;
+#endif
+}
+
+int
+WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler,
+ uint32_t aChannel,
+ const int16_t* aIn, uint32_t* aInLen,
+ int16_t* aOut, uint32_t* aOutLen)
+{
+#ifdef MOZ_SAMPLE_TYPE_S16
+ return speex_resampler_process_int(aResampler, aChannel, aIn, aInLen, aOut, aOutLen);
+#else
+ AutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp1;
+ AutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp2;
+ tmp1.SetLength(*aInLen);
+ tmp2.SetLength(*aOutLen);
+ ConvertAudioSamples(aIn, tmp1.Elements(), *aInLen);
+ int result = speex_resampler_process_float(aResampler, aChannel, tmp1.Elements(), aInLen, tmp2.Elements(), aOutLen);
+ ConvertAudioSamples(tmp2.Elements(), aOut, *aOutLen);
+ return result;
+#endif
+}
+
+void
+WebAudioUtils::LogToDeveloperConsole(uint64_t aWindowID, const char* aKey)
+{
+ // This implementation is derived from dom/media/VideoUtils.cpp, but we
+ // use a windowID so that the message is delivered to the developer console.
+ // It is similar to ContentUtils::ReportToConsole, but also works off main
+ // thread.
+ if (!NS_IsMainThread()) {
+ nsCOMPtr<nsIRunnable> task =
+ NS_NewRunnableFunction([aWindowID, aKey]() { LogToDeveloperConsole(aWindowID, aKey); });
+ NS_DispatchToMainThread(task.forget(), NS_DISPATCH_NORMAL);
+ return;
+ }
+
+ nsCOMPtr<nsIConsoleService> console(
+ do_GetService("@mozilla.org/consoleservice;1"));
+ if (!console) {
+ NS_WARNING("Failed to log message to console.");
+ return;
+ }
+
+ nsAutoCString spec;
+ uint32_t aLineNumber, aColumnNumber;
+ JSContext *cx = nsContentUtils::GetCurrentJSContext();
+ if (cx) {
+ nsJSUtils::GetCallingLocation(cx, spec, &aLineNumber, &aColumnNumber);
+ }
+
+ nsresult rv;
+ nsCOMPtr<nsIScriptError> errorObject =
+ do_CreateInstance(NS_SCRIPTERROR_CONTRACTID, &rv);
+ if (!errorObject) {
+ NS_WARNING("Failed to log message to console.");
+ return;
+ }
+
+ nsXPIDLString result;
+ rv = nsContentUtils::GetLocalizedString(nsContentUtils::eDOM_PROPERTIES,
+ aKey, result);
+
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Failed to log message to console.");
+ return;
+ }
+
+ errorObject->InitWithWindowID(result,
+ NS_ConvertUTF8toUTF16(spec),
+ EmptyString(),
+ aLineNumber, aColumnNumber,
+ nsIScriptError::warningFlag, "Web Audio",
+ aWindowID);
+ console->LogMessage(errorObject);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webaudio/WebAudioUtils.h b/dom/media/webaudio/WebAudioUtils.h
new file mode 100644
index 000000000..c0b27b837
--- /dev/null
+++ b/dom/media/webaudio/WebAudioUtils.h
@@ -0,0 +1,238 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WebAudioUtils_h_
+#define WebAudioUtils_h_
+
+#include <cmath>
+#include <limits>
+#include "mozilla/TypeTraits.h"
+#include "mozilla/FloatingPoint.h"
+#include "MediaSegment.h"
+
+// Forward declaration
+typedef struct SpeexResamplerState_ SpeexResamplerState;
+
+namespace mozilla {
+
+class AudioNodeStream;
+
+extern LazyLogModule gWebAudioAPILog;
+#define WEB_AUDIO_API_LOG(...) \
+ MOZ_LOG(gWebAudioAPILog, LogLevel::Debug, (__VA_ARGS__))
+
+namespace dom {
+
+struct AudioTimelineEvent;
+
+namespace WebAudioUtils {
+ // 32 is the minimum required by the spec for createBuffer() and
+ // createScriptProcessor() and matches what is used by Blink. The limit
+ // protects against large memory allocations.
+ const size_t MaxChannelCount = 32;
+ // AudioContext::CreateBuffer() "must support sample-rates in at least the
+ // range 22050 to 96000."
+ const uint32_t MinSampleRate = 8000;
+ const uint32_t MaxSampleRate = 192000;
+
+ inline bool FuzzyEqual(float v1, float v2)
+ {
+ using namespace std;
+ return fabsf(v1 - v2) < 1e-7f;
+ }
+ inline bool FuzzyEqual(double v1, double v2)
+ {
+ using namespace std;
+ return fabs(v1 - v2) < 1e-7;
+ }
+
+ /**
+ * Computes an exponential smoothing rate for a time based variable
+ * over aDuration seconds.
+ */
+ inline double ComputeSmoothingRate(double aDuration, double aSampleRate)
+ {
+ return 1.0 - std::exp(-1.0 / (aDuration * aSampleRate));
+ }
+
+ /**
+ * Converts an AudioTimelineEvent's floating point time values to tick values
+ * with respect to a destination AudioNodeStream.
+ *
+ * This needs to be called for each AudioTimelineEvent that gets sent to an
+ * AudioNodeEngine, on the engine side where the AudioTimlineEvent is
+ * received. This means that such engines need to be aware of their
+ * destination streams as well.
+ */
+ void ConvertAudioTimelineEventToTicks(AudioTimelineEvent& aEvent,
+ AudioNodeStream* aDest);
+
+ /**
+ * Converts a linear value to decibels. Returns aMinDecibels if the linear
+ * value is 0.
+ */
+ inline float ConvertLinearToDecibels(float aLinearValue, float aMinDecibels)
+ {
+ return aLinearValue ? 20.0f * std::log10(aLinearValue) : aMinDecibels;
+ }
+
+ /**
+ * Converts a decibel value to a linear value.
+ */
+ inline float ConvertDecibelsToLinear(float aDecibels)
+ {
+ return std::pow(10.0f, 0.05f * aDecibels);
+ }
+
+ /**
+ * Converts a decibel to a linear value.
+ */
+ inline float ConvertDecibelToLinear(float aDecibel)
+ {
+ return std::pow(10.0f, 0.05f * aDecibel);
+ }
+
+ inline void FixNaN(double& aDouble)
+ {
+ if (IsNaN(aDouble) || IsInfinite(aDouble)) {
+ aDouble = 0.0;
+ }
+ }
+
+ inline double DiscreteTimeConstantForSampleRate(double timeConstant, double sampleRate)
+ {
+ return 1.0 - std::exp(-1.0 / (sampleRate * timeConstant));
+ }
+
+ inline bool IsTimeValid(double aTime)
+ {
+ return aTime >= 0 && aTime <= (MEDIA_TIME_MAX >> TRACK_RATE_MAX_BITS);
+ }
+
+ /**
+ * Converts a floating point value to an integral type in a safe and
+ * platform agnostic way. The following program demonstrates the kinds
+ * of ways things can go wrong depending on the CPU architecture you're
+ * compiling for:
+ *
+ * #include <stdio.h>
+ * volatile float r;
+ * int main()
+ * {
+ * unsigned int q;
+ * r = 1e100;
+ * q = r;
+ * printf("%f %d\n", r, q);
+ * r = -1e100;
+ * q = r;
+ * printf("%f %d\n", r, q);
+ * r = 1e15;
+ * q = r;
+ * printf("%f %x\n", r, q);
+ * r = 0/0.;
+ * q = r;
+ * printf("%f %d\n", r, q);
+ * }
+ *
+ * This program, when compiled for unsigned int, generates the following
+ * results depending on the architecture:
+ *
+ * x86 and x86-64
+ * ---
+ * inf 0
+ * -inf 0
+ * 999999995904.000000 -727384064 d4a50000
+ * nan 0
+ *
+ * ARM
+ * ---
+ * inf -1
+ * -inf 0
+ * 999999995904.000000 -1
+ * nan 0
+ *
+ * When compiled for int, this program generates the following results:
+ *
+ * x86 and x86-64
+ * ---
+ * inf -2147483648
+ * -inf -2147483648
+ * 999999995904.000000 -2147483648
+ * nan -2147483648
+ *
+ * ARM
+ * ---
+ * inf 2147483647
+ * -inf -2147483648
+ * 999999995904.000000 2147483647
+ * nan 0
+ *
+ * Note that the caller is responsible to make sure that the value
+ * passed to this function is not a NaN. This function will abort if
+ * it sees a NaN.
+ */
+ template <typename IntType, typename FloatType>
+ IntType TruncateFloatToInt(FloatType f)
+ {
+ using namespace std;
+
+ static_assert(mozilla::IsIntegral<IntType>::value == true,
+ "IntType must be an integral type");
+ static_assert(mozilla::IsFloatingPoint<FloatType>::value == true,
+ "FloatType must be a floating point type");
+
+ if (mozilla::IsNaN(f)) {
+ // It is the responsibility of the caller to deal with NaN values.
+ // If we ever get to this point, we have a serious bug to fix.
+ NS_RUNTIMEABORT("We should never see a NaN here");
+ }
+
+ if (f > FloatType(numeric_limits<IntType>::max())) {
+ // If the floating point value is outside of the range of maximum
+ // integral value for this type, just clamp to the maximum value.
+ return numeric_limits<IntType>::max();
+ }
+
+ if (f < FloatType(numeric_limits<IntType>::min())) {
+ // If the floating point value is outside of the range of minimum
+ // integral value for this type, just clamp to the minimum value.
+ return numeric_limits<IntType>::min();
+ }
+
+ // Otherwise, this conversion must be well defined.
+ return IntType(f);
+ }
+
+ void Shutdown();
+
+ int
+ SpeexResamplerProcess(SpeexResamplerState* aResampler,
+ uint32_t aChannel,
+ const float* aIn, uint32_t* aInLen,
+ float* aOut, uint32_t* aOutLen);
+
+ int
+ SpeexResamplerProcess(SpeexResamplerState* aResampler,
+ uint32_t aChannel,
+ const int16_t* aIn, uint32_t* aInLen,
+ float* aOut, uint32_t* aOutLen);
+
+ int
+ SpeexResamplerProcess(SpeexResamplerState* aResampler,
+ uint32_t aChannel,
+ const int16_t* aIn, uint32_t* aInLen,
+ int16_t* aOut, uint32_t* aOutLen);
+
+ void
+ LogToDeveloperConsole(uint64_t aWindowID, const char* aKey);
+
+ } // namespace WebAudioUtils
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webaudio/blink/Biquad.cpp b/dom/media/webaudio/blink/Biquad.cpp
new file mode 100644
index 000000000..3aa526072
--- /dev/null
+++ b/dom/media/webaudio/blink/Biquad.cpp
@@ -0,0 +1,469 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "Biquad.h"
+
+#include <float.h>
+#include <algorithm>
+#include <math.h>
+
+namespace WebCore {
+
+Biquad::Biquad()
+{
+ // Initialize as pass-thru (straight-wire, no filter effect)
+ setNormalizedCoefficients(1, 0, 0, 1, 0, 0);
+
+ reset(); // clear filter memory
+}
+
+Biquad::~Biquad()
+{
+}
+
+void Biquad::process(const float* sourceP, float* destP, size_t framesToProcess)
+{
+ // Create local copies of member variables
+ double x1 = m_x1;
+ double x2 = m_x2;
+ double y1 = m_y1;
+ double y2 = m_y2;
+
+ double b0 = m_b0;
+ double b1 = m_b1;
+ double b2 = m_b2;
+ double a1 = m_a1;
+ double a2 = m_a2;
+
+ for (size_t i = 0; i < framesToProcess; ++i) {
+ // FIXME: this can be optimized by pipelining the multiply adds...
+ double x = sourceP[i];
+ double y = b0*x + b1*x1 + b2*x2 - a1*y1 - a2*y2;
+
+ destP[i] = y;
+
+ // Update state variables
+ x2 = x1;
+ x1 = x;
+ y2 = y1;
+ y1 = y;
+ }
+
+ // Avoid introducing a stream of subnormals when input is silent and the
+ // tail approaches zero.
+ // TODO: Remove this code when Bug 1157635 is fixed.
+ if (x1 == 0.0 && x2 == 0.0 && (y1 != 0.0 || y2 != 0.0) &&
+ fabs(y1) < FLT_MIN && fabs(y2) < FLT_MIN) {
+ // Flush future values to zero (until there is new input).
+ y1 = y2 = 0.0;
+ // Flush calculated values.
+ for (int i = framesToProcess; i-- && fabsf(destP[i]) < FLT_MIN; ) {
+ destP[i] = 0.0f;
+ }
+ }
+ // Local variables back to member.
+ m_x1 = x1;
+ m_x2 = x2;
+ m_y1 = y1;
+ m_y2 = y2;
+}
+
+void Biquad::reset()
+{
+ m_x1 = m_x2 = m_y1 = m_y2 = 0;
+}
+
+void Biquad::setLowpassParams(double cutoff, double resonance)
+{
+ // Limit cutoff to 0 to 1.
+ cutoff = std::max(0.0, std::min(cutoff, 1.0));
+
+ if (cutoff == 1) {
+ // When cutoff is 1, the z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ } else if (cutoff > 0) {
+ // Compute biquad coefficients for lowpass filter
+ resonance = std::max(0.0, resonance); // can't go negative
+ double g = pow(10.0, -0.05 * resonance);
+ double w0 = M_PI * cutoff;
+ double cos_w0 = cos(w0);
+ double alpha = 0.5 * sin(w0) * g;
+
+ double b1 = 1.0 - cos_w0;
+ double b0 = 0.5 * b1;
+ double b2 = b0;
+ double a0 = 1.0 + alpha;
+ double a1 = -2.0 * cos_w0;
+ double a2 = 1.0 - alpha;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When cutoff is zero, nothing gets through the filter, so set
+ // coefficients up correctly.
+ setNormalizedCoefficients(0, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setHighpassParams(double cutoff, double resonance)
+{
+ // Limit cutoff to 0 to 1.
+ cutoff = std::max(0.0, std::min(cutoff, 1.0));
+
+ if (cutoff == 1) {
+ // The z-transform is 0.
+ setNormalizedCoefficients(0, 0, 0,
+ 1, 0, 0);
+ } else if (cutoff > 0) {
+ // Compute biquad coefficients for highpass filter
+ resonance = std::max(0.0, resonance); // can't go negative
+ double g = pow(10.0, -0.05 * resonance);
+ double w0 = M_PI * cutoff;
+ double cos_w0 = cos(w0);
+ double alpha = 0.5 * sin(w0) * g;
+
+ double b1 = -1.0 - cos_w0;
+ double b0 = -0.5 * b1;
+ double b2 = b0;
+ double a0 = 1.0 + alpha;
+ double a1 = -2.0 * cos_w0;
+ double a2 = 1.0 - alpha;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When cutoff is zero, we need to be careful because the above
+ // gives a quadratic divided by the same quadratic, with poles
+ // and zeros on the unit circle in the same place. When cutoff
+ // is zero, the z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setNormalizedCoefficients(double b0, double b1, double b2, double a0, double a1, double a2)
+{
+ double a0Inverse = 1 / a0;
+
+ m_b0 = b0 * a0Inverse;
+ m_b1 = b1 * a0Inverse;
+ m_b2 = b2 * a0Inverse;
+ m_a1 = a1 * a0Inverse;
+ m_a2 = a2 * a0Inverse;
+}
+
+void Biquad::setLowShelfParams(double frequency, double dbGain)
+{
+ // Clip frequencies to between 0 and 1, inclusive.
+ frequency = std::max(0.0, std::min(frequency, 1.0));
+
+ double A = pow(10.0, dbGain / 40);
+
+ if (frequency == 1) {
+ // The z-transform is a constant gain.
+ setNormalizedCoefficients(A * A, 0, 0,
+ 1, 0, 0);
+ } else if (frequency > 0) {
+ double w0 = M_PI * frequency;
+ double S = 1; // filter slope (1 is max value)
+ double alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2);
+ double k = cos(w0);
+ double k2 = 2 * sqrt(A) * alpha;
+ double aPlusOne = A + 1;
+ double aMinusOne = A - 1;
+
+ double b0 = A * (aPlusOne - aMinusOne * k + k2);
+ double b1 = 2 * A * (aMinusOne - aPlusOne * k);
+ double b2 = A * (aPlusOne - aMinusOne * k - k2);
+ double a0 = aPlusOne + aMinusOne * k + k2;
+ double a1 = -2 * (aMinusOne + aPlusOne * k);
+ double a2 = aPlusOne + aMinusOne * k - k2;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When frequency is 0, the z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setHighShelfParams(double frequency, double dbGain)
+{
+ // Clip frequencies to between 0 and 1, inclusive.
+ frequency = std::max(0.0, std::min(frequency, 1.0));
+
+ double A = pow(10.0, dbGain / 40);
+
+ if (frequency == 1) {
+ // The z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ } else if (frequency > 0) {
+ double w0 = M_PI * frequency;
+ double S = 1; // filter slope (1 is max value)
+ double alpha = 0.5 * sin(w0) * sqrt((A + 1 / A) * (1 / S - 1) + 2);
+ double k = cos(w0);
+ double k2 = 2 * sqrt(A) * alpha;
+ double aPlusOne = A + 1;
+ double aMinusOne = A - 1;
+
+ double b0 = A * (aPlusOne + aMinusOne * k + k2);
+ double b1 = -2 * A * (aMinusOne + aPlusOne * k);
+ double b2 = A * (aPlusOne + aMinusOne * k - k2);
+ double a0 = aPlusOne - aMinusOne * k + k2;
+ double a1 = 2 * (aMinusOne - aPlusOne * k);
+ double a2 = aPlusOne - aMinusOne * k - k2;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When frequency = 0, the filter is just a gain, A^2.
+ setNormalizedCoefficients(A * A, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setPeakingParams(double frequency, double Q, double dbGain)
+{
+ // Clip frequencies to between 0 and 1, inclusive.
+ frequency = std::max(0.0, std::min(frequency, 1.0));
+
+ // Don't let Q go negative, which causes an unstable filter.
+ Q = std::max(0.0, Q);
+
+ double A = pow(10.0, dbGain / 40);
+
+ if (frequency > 0 && frequency < 1) {
+ if (Q > 0) {
+ double w0 = M_PI * frequency;
+ double alpha = sin(w0) / (2 * Q);
+ double k = cos(w0);
+
+ double b0 = 1 + alpha * A;
+ double b1 = -2 * k;
+ double b2 = 1 - alpha * A;
+ double a0 = 1 + alpha / A;
+ double a1 = -2 * k;
+ double a2 = 1 - alpha / A;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When Q = 0, the above formulas have problems. If we look at
+ // the z-transform, we can see that the limit as Q->0 is A^2, so
+ // set the filter that way.
+ setNormalizedCoefficients(A * A, 0, 0,
+ 1, 0, 0);
+ }
+ } else {
+ // When frequency is 0 or 1, the z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setAllpassParams(double frequency, double Q)
+{
+ // Clip frequencies to between 0 and 1, inclusive.
+ frequency = std::max(0.0, std::min(frequency, 1.0));
+
+ // Don't let Q go negative, which causes an unstable filter.
+ Q = std::max(0.0, Q);
+
+ if (frequency > 0 && frequency < 1) {
+ if (Q > 0) {
+ double w0 = M_PI * frequency;
+ double alpha = sin(w0) / (2 * Q);
+ double k = cos(w0);
+
+ double b0 = 1 - alpha;
+ double b1 = -2 * k;
+ double b2 = 1 + alpha;
+ double a0 = 1 + alpha;
+ double a1 = -2 * k;
+ double a2 = 1 - alpha;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When Q = 0, the above formulas have problems. If we look at
+ // the z-transform, we can see that the limit as Q->0 is -1, so
+ // set the filter that way.
+ setNormalizedCoefficients(-1, 0, 0,
+ 1, 0, 0);
+ }
+ } else {
+ // When frequency is 0 or 1, the z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setNotchParams(double frequency, double Q)
+{
+ // Clip frequencies to between 0 and 1, inclusive.
+ frequency = std::max(0.0, std::min(frequency, 1.0));
+
+ // Don't let Q go negative, which causes an unstable filter.
+ Q = std::max(0.0, Q);
+
+ if (frequency > 0 && frequency < 1) {
+ if (Q > 0) {
+ double w0 = M_PI * frequency;
+ double alpha = sin(w0) / (2 * Q);
+ double k = cos(w0);
+
+ double b0 = 1;
+ double b1 = -2 * k;
+ double b2 = 1;
+ double a0 = 1 + alpha;
+ double a1 = -2 * k;
+ double a2 = 1 - alpha;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When Q = 0, the above formulas have problems. If we look at
+ // the z-transform, we can see that the limit as Q->0 is 0, so
+ // set the filter that way.
+ setNormalizedCoefficients(0, 0, 0,
+ 1, 0, 0);
+ }
+ } else {
+ // When frequency is 0 or 1, the z-transform is 1.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setBandpassParams(double frequency, double Q)
+{
+ // No negative frequencies allowed.
+ frequency = std::max(0.0, frequency);
+
+ // Don't let Q go negative, which causes an unstable filter.
+ Q = std::max(0.0, Q);
+
+ if (frequency > 0 && frequency < 1) {
+ double w0 = M_PI * frequency;
+ if (Q > 0) {
+ double alpha = sin(w0) / (2 * Q);
+ double k = cos(w0);
+
+ double b0 = alpha;
+ double b1 = 0;
+ double b2 = -alpha;
+ double a0 = 1 + alpha;
+ double a1 = -2 * k;
+ double a2 = 1 - alpha;
+
+ setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When Q = 0, the above formulas have problems. If we look at
+ // the z-transform, we can see that the limit as Q->0 is 1, so
+ // set the filter that way.
+ setNormalizedCoefficients(1, 0, 0,
+ 1, 0, 0);
+ }
+ } else {
+ // When the cutoff is zero, the z-transform approaches 0, if Q
+ // > 0. When both Q and cutoff are zero, the z-transform is
+ // pretty much undefined. What should we do in this case?
+ // For now, just make the filter 0. When the cutoff is 1, the
+ // z-transform also approaches 0.
+ setNormalizedCoefficients(0, 0, 0,
+ 1, 0, 0);
+ }
+}
+
+void Biquad::setZeroPolePairs(const Complex &zero, const Complex &pole)
+{
+ double b0 = 1;
+ double b1 = -2 * zero.real();
+
+ double zeroMag = abs(zero);
+ double b2 = zeroMag * zeroMag;
+
+ double a1 = -2 * pole.real();
+
+ double poleMag = abs(pole);
+ double a2 = poleMag * poleMag;
+ setNormalizedCoefficients(b0, b1, b2, 1, a1, a2);
+}
+
+void Biquad::setAllpassPole(const Complex &pole)
+{
+ Complex zero = Complex(1, 0) / pole;
+ setZeroPolePairs(zero, pole);
+}
+
+void Biquad::getFrequencyResponse(int nFrequencies,
+ const float* frequency,
+ float* magResponse,
+ float* phaseResponse)
+{
+ // Evaluate the Z-transform of the filter at given normalized
+ // frequency from 0 to 1. (1 corresponds to the Nyquist
+ // frequency.)
+ //
+ // The z-transform of the filter is
+ //
+ // H(z) = (b0 + b1*z^(-1) + b2*z^(-2))/(1 + a1*z^(-1) + a2*z^(-2))
+ //
+ // Evaluate as
+ //
+ // b0 + (b1 + b2*z1)*z1
+ // --------------------
+ // 1 + (a1 + a2*z1)*z1
+ //
+ // with z1 = 1/z and z = exp(j*pi*frequency). Hence z1 = exp(-j*pi*frequency)
+
+ // Make local copies of the coefficients as a micro-optimization.
+ double b0 = m_b0;
+ double b1 = m_b1;
+ double b2 = m_b2;
+ double a1 = m_a1;
+ double a2 = m_a2;
+
+ for (int k = 0; k < nFrequencies; ++k) {
+ double omega = -M_PI * frequency[k];
+ Complex z = Complex(cos(omega), sin(omega));
+ Complex numerator = b0 + (b1 + b2 * z) * z;
+ Complex denominator = Complex(1, 0) + (a1 + a2 * z) * z;
+ // Strangely enough, using complex division:
+ // e.g. Complex response = numerator / denominator;
+ // fails on our test machines, yielding infinities and NaNs, so we do
+ // things the long way here.
+ double n = norm(denominator);
+ double r = (real(numerator)*real(denominator) + imag(numerator)*imag(denominator)) / n;
+ double i = (imag(numerator)*real(denominator) - real(numerator)*imag(denominator)) / n;
+ std::complex<double> response = std::complex<double>(r, i);
+
+ magResponse[k] = static_cast<float>(abs(response));
+ phaseResponse[k] = static_cast<float>(atan2(imag(response), real(response)));
+ }
+}
+
+} // namespace WebCore
+
diff --git a/dom/media/webaudio/blink/Biquad.h b/dom/media/webaudio/blink/Biquad.h
new file mode 100644
index 000000000..f266af441
--- /dev/null
+++ b/dom/media/webaudio/blink/Biquad.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef Biquad_h
+#define Biquad_h
+
+#include <complex>
+
+namespace WebCore {
+
+typedef std::complex<double> Complex;
+
+// A basic biquad (two-zero / two-pole digital filter)
+//
+// It can be configured to a number of common and very useful filters:
+// lowpass, highpass, shelving, parameteric, notch, allpass, ...
+
+class Biquad {
+public:
+ Biquad();
+ ~Biquad();
+
+ void process(const float* sourceP, float* destP, size_t framesToProcess);
+
+ // frequency is 0 - 1 normalized, resonance and dbGain are in decibels.
+ // Q is a unitless quality factor.
+ void setLowpassParams(double frequency, double resonance);
+ void setHighpassParams(double frequency, double resonance);
+ void setBandpassParams(double frequency, double Q);
+ void setLowShelfParams(double frequency, double dbGain);
+ void setHighShelfParams(double frequency, double dbGain);
+ void setPeakingParams(double frequency, double Q, double dbGain);
+ void setAllpassParams(double frequency, double Q);
+ void setNotchParams(double frequency, double Q);
+
+ // Set the biquad coefficients given a single zero (other zero will be conjugate)
+ // and a single pole (other pole will be conjugate)
+ void setZeroPolePairs(const Complex& zero, const Complex& pole);
+
+ // Set the biquad coefficients given a single pole (other pole will be conjugate)
+ // (The zeroes will be the inverse of the poles)
+ void setAllpassPole(const Complex& pole);
+
+ // Return true iff the next output block will contain sound even with
+ // silent input.
+ bool hasTail() const { return m_y1 || m_y2 || m_x1 || m_x2; }
+
+ // Resets filter state
+ void reset();
+
+ // Filter response at a set of n frequencies. The magnitude and
+ // phase response are returned in magResponse and phaseResponse.
+ // The phase response is in radians.
+ void getFrequencyResponse(int nFrequencies,
+ const float* frequency,
+ float* magResponse,
+ float* phaseResponse);
+private:
+ void setNormalizedCoefficients(double b0, double b1, double b2, double a0, double a1, double a2);
+
+ // Filter coefficients. The filter is defined as
+ //
+ // y[n] + m_a1*y[n-1] + m_a2*y[n-2] = m_b0*x[n] + m_b1*x[n-1] + m_b2*x[n-2].
+ double m_b0;
+ double m_b1;
+ double m_b2;
+ double m_a1;
+ double m_a2;
+
+ // Filter memory
+ //
+ // Double precision for the output values is valuable because errors can
+ // accumulate. Input values are also stored as double so they need not be
+ // converted again for computation.
+ double m_x1; // input delayed by 1 sample
+ double m_x2; // input delayed by 2 samples
+ double m_y1; // output delayed by 1 sample
+ double m_y2; // output delayed by 2 samples
+};
+
+} // namespace WebCore
+
+#endif // Biquad_h
diff --git a/dom/media/webaudio/blink/DenormalDisabler.h b/dom/media/webaudio/blink/DenormalDisabler.h
new file mode 100644
index 000000000..241220732
--- /dev/null
+++ b/dom/media/webaudio/blink/DenormalDisabler.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DenormalDisabler_h
+#define DenormalDisabler_h
+
+#include <cmath>
+#include <float.h>
+
+namespace WebCore {
+
+// Deal with denormals. They can very seriously impact performance on x86.
+
+// Define HAVE_DENORMAL if we support flushing denormals to zero.
+#if defined(XP_WIN) && defined(_MSC_VER)
+#define HAVE_DENORMAL
+#endif
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+#define HAVE_DENORMAL
+#endif
+
+#ifdef HAVE_DENORMAL
+class DenormalDisabler {
+public:
+ DenormalDisabler()
+ : m_savedCSR(0)
+ {
+#if defined(XP_WIN) && defined(_MSC_VER)
+ // Save the current state, and set mode to flush denormals.
+ //
+ // http://stackoverflow.com/questions/637175/possible-bug-in-controlfp-s-may-not-restore-control-word-correctly
+ _controlfp_s(&m_savedCSR, 0, 0);
+ unsigned int unused;
+ _controlfp_s(&unused, _DN_FLUSH, _MCW_DN);
+#else
+ m_savedCSR = getCSR();
+ setCSR(m_savedCSR | 0x8040);
+#endif
+ }
+
+ ~DenormalDisabler()
+ {
+#if defined(XP_WIN) && defined(_MSC_VER)
+ unsigned int unused;
+ _controlfp_s(&unused, m_savedCSR, _MCW_DN);
+#else
+ setCSR(m_savedCSR);
+#endif
+ }
+
+ // This is a nop if we can flush denormals to zero in hardware.
+ static inline float flushDenormalFloatToZero(float f)
+ {
+#if defined(XP_WIN) && defined(_MSC_VER) && _M_IX86_FP
+ // For systems using x87 instead of sse, there's no hardware support
+ // to flush denormals automatically. Hence, we need to flush
+ // denormals to zero manually.
+ return (fabs(f) < FLT_MIN) ? 0.0f : f;
+#else
+ return f;
+#endif
+ }
+private:
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ inline int getCSR()
+ {
+ int result;
+ asm volatile("stmxcsr %0" : "=m" (result));
+ return result;
+ }
+
+ inline void setCSR(int a)
+ {
+ int temp = a;
+ asm volatile("ldmxcsr %0" : : "m" (temp));
+ }
+
+#endif
+
+ unsigned int m_savedCSR;
+};
+
+#else
+// FIXME: add implementations for other architectures and compilers
+class DenormalDisabler {
+public:
+ DenormalDisabler() { }
+
+ // Assume the worst case that other architectures and compilers
+ // need to flush denormals to zero manually.
+ static inline float flushDenormalFloatToZero(float f)
+ {
+ return (fabs(f) < FLT_MIN) ? 0.0f : f;
+ }
+};
+
+#endif
+
+} // namespace WebCore
+
+#undef HAVE_DENORMAL
+#endif // DenormalDisabler_h
diff --git a/dom/media/webaudio/blink/DynamicsCompressor.cpp b/dom/media/webaudio/blink/DynamicsCompressor.cpp
new file mode 100644
index 000000000..8f18913c0
--- /dev/null
+++ b/dom/media/webaudio/blink/DynamicsCompressor.cpp
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "DynamicsCompressor.h"
+#include "AlignmentUtils.h"
+#include "AudioBlock.h"
+
+#include <cmath>
+#include "AudioNodeEngine.h"
+#include "nsDebug.h"
+
+using mozilla::WEBAUDIO_BLOCK_SIZE;
+using mozilla::AudioBlockCopyChannelWithScale;
+
+namespace WebCore {
+
+DynamicsCompressor::DynamicsCompressor(float sampleRate, unsigned numberOfChannels)
+ : m_numberOfChannels(numberOfChannels)
+ , m_sampleRate(sampleRate)
+ , m_compressor(sampleRate, numberOfChannels)
+{
+ // Uninitialized state - for parameter recalculation.
+ m_lastFilterStageRatio = -1;
+ m_lastAnchor = -1;
+ m_lastFilterStageGain = -1;
+
+ setNumberOfChannels(numberOfChannels);
+ initializeParameters();
+}
+
+size_t DynamicsCompressor::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+ amount += m_preFilterPacks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_preFilterPacks.Length(); i++) {
+ if (m_preFilterPacks[i]) {
+ amount += m_preFilterPacks[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ amount += m_postFilterPacks.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_postFilterPacks.Length(); i++) {
+ if (m_postFilterPacks[i]) {
+ amount += m_postFilterPacks[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ amount += aMallocSizeOf(m_sourceChannels.get());
+ amount += aMallocSizeOf(m_destinationChannels.get());
+ amount += m_compressor.sizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+void DynamicsCompressor::setParameterValue(unsigned parameterID, float value)
+{
+ MOZ_ASSERT(parameterID < ParamLast);
+ if (parameterID < ParamLast)
+ m_parameters[parameterID] = value;
+}
+
+void DynamicsCompressor::initializeParameters()
+{
+ // Initializes compressor to default values.
+
+ m_parameters[ParamThreshold] = -24; // dB
+ m_parameters[ParamKnee] = 30; // dB
+ m_parameters[ParamRatio] = 12; // unit-less
+ m_parameters[ParamAttack] = 0.003f; // seconds
+ m_parameters[ParamRelease] = 0.250f; // seconds
+ m_parameters[ParamPreDelay] = 0.006f; // seconds
+
+ // Release zone values 0 -> 1.
+ m_parameters[ParamReleaseZone1] = 0.09f;
+ m_parameters[ParamReleaseZone2] = 0.16f;
+ m_parameters[ParamReleaseZone3] = 0.42f;
+ m_parameters[ParamReleaseZone4] = 0.98f;
+
+ m_parameters[ParamFilterStageGain] = 4.4f; // dB
+ m_parameters[ParamFilterStageRatio] = 2;
+ m_parameters[ParamFilterAnchor] = 15000 / nyquist();
+
+ m_parameters[ParamPostGain] = 0; // dB
+ m_parameters[ParamReduction] = 0; // dB
+
+ // Linear crossfade (0 -> 1).
+ m_parameters[ParamEffectBlend] = 1;
+}
+
+float DynamicsCompressor::parameterValue(unsigned parameterID)
+{
+ MOZ_ASSERT(parameterID < ParamLast);
+ return m_parameters[parameterID];
+}
+
+void DynamicsCompressor::setEmphasisStageParameters(unsigned stageIndex, float gain, float normalizedFrequency /* 0 -> 1 */)
+{
+ float gk = 1 - gain / 20;
+ float f1 = normalizedFrequency * gk;
+ float f2 = normalizedFrequency / gk;
+ float r1 = expf(-f1 * M_PI);
+ float r2 = expf(-f2 * M_PI);
+
+ MOZ_ASSERT(m_numberOfChannels == m_preFilterPacks.Length());
+
+ for (unsigned i = 0; i < m_numberOfChannels; ++i) {
+ // Set pre-filter zero and pole to create an emphasis filter.
+ ZeroPole& preFilter = m_preFilterPacks[i]->filters[stageIndex];
+ preFilter.setZero(r1);
+ preFilter.setPole(r2);
+
+ // Set post-filter with zero and pole reversed to create the de-emphasis filter.
+ // If there were no compressor kernel in between, they would cancel each other out (allpass filter).
+ ZeroPole& postFilter = m_postFilterPacks[i]->filters[stageIndex];
+ postFilter.setZero(r2);
+ postFilter.setPole(r1);
+ }
+}
+
+void DynamicsCompressor::setEmphasisParameters(float gain, float anchorFreq, float filterStageRatio)
+{
+ setEmphasisStageParameters(0, gain, anchorFreq);
+ setEmphasisStageParameters(1, gain, anchorFreq / filterStageRatio);
+ setEmphasisStageParameters(2, gain, anchorFreq / (filterStageRatio * filterStageRatio));
+ setEmphasisStageParameters(3, gain, anchorFreq / (filterStageRatio * filterStageRatio * filterStageRatio));
+}
+
+void DynamicsCompressor::process(const AudioBlock* sourceChunk, AudioBlock* destinationChunk, unsigned framesToProcess)
+{
+ // Though numberOfChannels is retrived from destinationBus, we still name it numberOfChannels instead of numberOfDestinationChannels.
+ // It's because we internally match sourceChannels's size to destinationBus by channel up/down mix. Thus we need numberOfChannels
+ // to do the loop work for both m_sourceChannels and m_destinationChannels.
+
+ unsigned numberOfChannels = destinationChunk->ChannelCount();
+ unsigned numberOfSourceChannels = sourceChunk->ChannelCount();
+
+ MOZ_ASSERT(numberOfChannels == m_numberOfChannels && numberOfSourceChannels);
+
+ if (numberOfChannels != m_numberOfChannels || !numberOfSourceChannels) {
+ destinationChunk->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ switch (numberOfChannels) {
+ case 2: // stereo
+ m_sourceChannels[0] = static_cast<const float*>(sourceChunk->mChannelData[0]);
+
+ if (numberOfSourceChannels > 1)
+ m_sourceChannels[1] = static_cast<const float*>(sourceChunk->mChannelData[1]);
+ else
+ // Simply duplicate mono channel input data to right channel for stereo processing.
+ m_sourceChannels[1] = m_sourceChannels[0];
+
+ break;
+ default:
+ // FIXME : support other number of channels.
+ NS_WARNING("Support other number of channels");
+ destinationChunk->SetNull(WEBAUDIO_BLOCK_SIZE);
+ return;
+ }
+
+ for (unsigned i = 0; i < numberOfChannels; ++i)
+ m_destinationChannels[i] = const_cast<float*>(static_cast<const float*>(
+ destinationChunk->mChannelData[i]));
+
+ float filterStageGain = parameterValue(ParamFilterStageGain);
+ float filterStageRatio = parameterValue(ParamFilterStageRatio);
+ float anchor = parameterValue(ParamFilterAnchor);
+
+ if (filterStageGain != m_lastFilterStageGain || filterStageRatio != m_lastFilterStageRatio || anchor != m_lastAnchor) {
+ m_lastFilterStageGain = filterStageGain;
+ m_lastFilterStageRatio = filterStageRatio;
+ m_lastAnchor = anchor;
+
+ setEmphasisParameters(filterStageGain, anchor, filterStageRatio);
+ }
+
+ float sourceWithVolume[WEBAUDIO_BLOCK_SIZE + 4];
+ float* alignedSourceWithVolume = ALIGNED16(sourceWithVolume);
+ ASSERT_ALIGNED16(alignedSourceWithVolume);
+
+ // Apply pre-emphasis filter.
+ // Note that the final three stages are computed in-place in the destination buffer.
+ for (unsigned i = 0; i < numberOfChannels; ++i) {
+ const float* sourceData;
+ if (sourceChunk->mVolume == 1.0f) {
+ // Fast path, the volume scale doesn't need to get taken into account
+ sourceData = m_sourceChannels[i];
+ } else {
+ AudioBlockCopyChannelWithScale(m_sourceChannels[i],
+ sourceChunk->mVolume,
+ alignedSourceWithVolume);
+ sourceData = alignedSourceWithVolume;
+ }
+
+ float* destinationData = m_destinationChannels[i];
+ ZeroPole* preFilters = m_preFilterPacks[i]->filters;
+
+ preFilters[0].process(sourceData, destinationData, framesToProcess);
+ preFilters[1].process(destinationData, destinationData, framesToProcess);
+ preFilters[2].process(destinationData, destinationData, framesToProcess);
+ preFilters[3].process(destinationData, destinationData, framesToProcess);
+ }
+
+ float dbThreshold = parameterValue(ParamThreshold);
+ float dbKnee = parameterValue(ParamKnee);
+ float ratio = parameterValue(ParamRatio);
+ float attackTime = parameterValue(ParamAttack);
+ float releaseTime = parameterValue(ParamRelease);
+ float preDelayTime = parameterValue(ParamPreDelay);
+
+ // This is effectively a master volume on the compressed signal (pre-blending).
+ float dbPostGain = parameterValue(ParamPostGain);
+
+ // Linear blending value from dry to completely processed (0 -> 1)
+ // 0 means the signal is completely unprocessed.
+ // 1 mixes in only the compressed signal.
+ float effectBlend = parameterValue(ParamEffectBlend);
+
+ float releaseZone1 = parameterValue(ParamReleaseZone1);
+ float releaseZone2 = parameterValue(ParamReleaseZone2);
+ float releaseZone3 = parameterValue(ParamReleaseZone3);
+ float releaseZone4 = parameterValue(ParamReleaseZone4);
+
+ // Apply compression to the pre-filtered signal.
+ // The processing is performed in place.
+ m_compressor.process(m_destinationChannels.get(),
+ m_destinationChannels.get(),
+ numberOfChannels,
+ framesToProcess,
+
+ dbThreshold,
+ dbKnee,
+ ratio,
+ attackTime,
+ releaseTime,
+ preDelayTime,
+ dbPostGain,
+ effectBlend,
+
+ releaseZone1,
+ releaseZone2,
+ releaseZone3,
+ releaseZone4
+ );
+
+ // Update the compression amount.
+ setParameterValue(ParamReduction, m_compressor.meteringGain());
+
+ // Apply de-emphasis filter.
+ for (unsigned i = 0; i < numberOfChannels; ++i) {
+ float* destinationData = m_destinationChannels[i];
+ ZeroPole* postFilters = m_postFilterPacks[i]->filters;
+
+ postFilters[0].process(destinationData, destinationData, framesToProcess);
+ postFilters[1].process(destinationData, destinationData, framesToProcess);
+ postFilters[2].process(destinationData, destinationData, framesToProcess);
+ postFilters[3].process(destinationData, destinationData, framesToProcess);
+ }
+}
+
+void DynamicsCompressor::reset()
+{
+ m_lastFilterStageRatio = -1; // for recalc
+ m_lastAnchor = -1;
+ m_lastFilterStageGain = -1;
+
+ for (unsigned channel = 0; channel < m_numberOfChannels; ++channel) {
+ for (unsigned stageIndex = 0; stageIndex < 4; ++stageIndex) {
+ m_preFilterPacks[channel]->filters[stageIndex].reset();
+ m_postFilterPacks[channel]->filters[stageIndex].reset();
+ }
+ }
+
+ m_compressor.reset();
+}
+
+void DynamicsCompressor::setNumberOfChannels(unsigned numberOfChannels)
+{
+ if (m_preFilterPacks.Length() == numberOfChannels)
+ return;
+
+ m_preFilterPacks.Clear();
+ m_postFilterPacks.Clear();
+ for (unsigned i = 0; i < numberOfChannels; ++i) {
+ m_preFilterPacks.AppendElement(new ZeroPoleFilterPack4());
+ m_postFilterPacks.AppendElement(new ZeroPoleFilterPack4());
+ }
+
+ m_sourceChannels = mozilla::MakeUnique<const float* []>(numberOfChannels);
+ m_destinationChannels = mozilla::MakeUnique<float* []>(numberOfChannels);
+
+ m_compressor.setNumberOfChannels(numberOfChannels);
+ m_numberOfChannels = numberOfChannels;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/DynamicsCompressor.h b/dom/media/webaudio/blink/DynamicsCompressor.h
new file mode 100644
index 000000000..f460836b4
--- /dev/null
+++ b/dom/media/webaudio/blink/DynamicsCompressor.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DynamicsCompressor_h
+#define DynamicsCompressor_h
+
+#include "DynamicsCompressorKernel.h"
+#include "ZeroPole.h"
+
+#include "nsTArray.h"
+#include "nsAutoPtr.h"
+#include "mozilla/MemoryReporting.h"
+#include "mozilla/UniquePtr.h"
+
+namespace mozilla {
+class AudioBlock;
+} // namespace mozilla
+
+namespace WebCore {
+
+using mozilla::AudioBlock;
+
+// DynamicsCompressor implements a flexible audio dynamics compression effect such as
+// is commonly used in musical production and game audio. It lowers the volume
+// of the loudest parts of the signal and raises the volume of the softest parts,
+// making the sound richer, fuller, and more controlled.
+
+class DynamicsCompressor {
+public:
+ enum {
+ ParamThreshold,
+ ParamKnee,
+ ParamRatio,
+ ParamAttack,
+ ParamRelease,
+ ParamPreDelay,
+ ParamReleaseZone1,
+ ParamReleaseZone2,
+ ParamReleaseZone3,
+ ParamReleaseZone4,
+ ParamPostGain,
+ ParamFilterStageGain,
+ ParamFilterStageRatio,
+ ParamFilterAnchor,
+ ParamEffectBlend,
+ ParamReduction,
+ ParamLast
+ };
+
+ DynamicsCompressor(float sampleRate, unsigned numberOfChannels);
+
+ void process(const AudioBlock* sourceChunk, AudioBlock* destinationChunk, unsigned framesToProcess);
+ void reset();
+ void setNumberOfChannels(unsigned);
+ unsigned numberOfChannels() const { return m_numberOfChannels; }
+
+ void setParameterValue(unsigned parameterID, float value);
+ float parameterValue(unsigned parameterID);
+
+ float sampleRate() const { return m_sampleRate; }
+ float nyquist() const { return m_sampleRate / 2; }
+
+ double tailTime() const { return 0; }
+ double latencyTime() const { return m_compressor.latencyFrames() / static_cast<double>(sampleRate()); }
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+protected:
+ unsigned m_numberOfChannels;
+
+ // m_parameters holds the tweakable compressor parameters.
+ float m_parameters[ParamLast];
+ void initializeParameters();
+
+ float m_sampleRate;
+
+ // Emphasis filter controls.
+ float m_lastFilterStageRatio;
+ float m_lastAnchor;
+ float m_lastFilterStageGain;
+
+ typedef struct {
+ ZeroPole filters[4];
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+ {
+ return aMallocSizeOf(this);
+ }
+ } ZeroPoleFilterPack4;
+
+ // Per-channel emphasis filters.
+ nsTArray<nsAutoPtr<ZeroPoleFilterPack4> > m_preFilterPacks;
+ nsTArray<nsAutoPtr<ZeroPoleFilterPack4> > m_postFilterPacks;
+
+ mozilla::UniquePtr<const float*[]> m_sourceChannels;
+ mozilla::UniquePtr<float*[]> m_destinationChannels;
+
+ void setEmphasisStageParameters(unsigned stageIndex, float gain, float normalizedFrequency /* 0 -> 1 */);
+ void setEmphasisParameters(float gain, float anchorFreq, float filterStageRatio);
+
+ // The core compressor.
+ DynamicsCompressorKernel m_compressor;
+};
+
+} // namespace WebCore
+
+#endif // DynamicsCompressor_h
diff --git a/dom/media/webaudio/blink/DynamicsCompressorKernel.cpp b/dom/media/webaudio/blink/DynamicsCompressorKernel.cpp
new file mode 100644
index 000000000..e5b4aba2f
--- /dev/null
+++ b/dom/media/webaudio/blink/DynamicsCompressorKernel.cpp
@@ -0,0 +1,491 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "DynamicsCompressorKernel.h"
+
+#include "DenormalDisabler.h"
+#include <algorithm>
+#include <cmath>
+
+#include "mozilla/FloatingPoint.h"
+#include "WebAudioUtils.h"
+
+using namespace std;
+
+using namespace mozilla::dom; // for WebAudioUtils
+using mozilla::IsInfinite;
+using mozilla::IsNaN;
+using mozilla::MakeUnique;
+
+namespace WebCore {
+
+
+// Metering hits peaks instantly, but releases this fast (in seconds).
+const float meteringReleaseTimeConstant = 0.325f;
+
+const float uninitializedValue = -1;
+
+DynamicsCompressorKernel::DynamicsCompressorKernel(float sampleRate, unsigned numberOfChannels)
+ : m_sampleRate(sampleRate)
+ , m_lastPreDelayFrames(DefaultPreDelayFrames)
+ , m_preDelayReadIndex(0)
+ , m_preDelayWriteIndex(DefaultPreDelayFrames)
+ , m_ratio(uninitializedValue)
+ , m_slope(uninitializedValue)
+ , m_linearThreshold(uninitializedValue)
+ , m_dbThreshold(uninitializedValue)
+ , m_dbKnee(uninitializedValue)
+ , m_kneeThreshold(uninitializedValue)
+ , m_kneeThresholdDb(uninitializedValue)
+ , m_ykneeThresholdDb(uninitializedValue)
+ , m_K(uninitializedValue)
+{
+ setNumberOfChannels(numberOfChannels);
+
+ // Initializes most member variables
+ reset();
+
+ m_meteringReleaseK =
+ static_cast<float>(WebAudioUtils::DiscreteTimeConstantForSampleRate(meteringReleaseTimeConstant, sampleRate));
+}
+
+size_t DynamicsCompressorKernel::sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+ amount += m_preDelayBuffers.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_preDelayBuffers.Length(); i++) {
+ amount += aMallocSizeOf(m_preDelayBuffers[i].get());
+ }
+
+ return amount;
+}
+
+void DynamicsCompressorKernel::setNumberOfChannels(unsigned numberOfChannels)
+{
+ if (m_preDelayBuffers.Length() == numberOfChannels)
+ return;
+
+ m_preDelayBuffers.Clear();
+ for (unsigned i = 0; i < numberOfChannels; ++i)
+ m_preDelayBuffers.AppendElement(MakeUnique<float[]>(MaxPreDelayFrames));
+}
+
+void DynamicsCompressorKernel::setPreDelayTime(float preDelayTime)
+{
+ // Re-configure look-ahead section pre-delay if delay time has changed.
+ unsigned preDelayFrames = preDelayTime * sampleRate();
+ if (preDelayFrames > MaxPreDelayFrames - 1)
+ preDelayFrames = MaxPreDelayFrames - 1;
+
+ if (m_lastPreDelayFrames != preDelayFrames) {
+ m_lastPreDelayFrames = preDelayFrames;
+ for (unsigned i = 0; i < m_preDelayBuffers.Length(); ++i)
+ memset(m_preDelayBuffers[i].get(), 0, sizeof(float) * MaxPreDelayFrames);
+
+ m_preDelayReadIndex = 0;
+ m_preDelayWriteIndex = preDelayFrames;
+ }
+}
+
+// Exponential curve for the knee.
+// It is 1st derivative matched at m_linearThreshold and asymptotically approaches the value m_linearThreshold + 1 / k.
+float DynamicsCompressorKernel::kneeCurve(float x, float k)
+{
+ // Linear up to threshold.
+ if (x < m_linearThreshold)
+ return x;
+
+ return m_linearThreshold + (1 - expf(-k * (x - m_linearThreshold))) / k;
+}
+
+// Full compression curve with constant ratio after knee.
+float DynamicsCompressorKernel::saturate(float x, float k)
+{
+ float y;
+
+ if (x < m_kneeThreshold)
+ y = kneeCurve(x, k);
+ else {
+ // Constant ratio after knee.
+ float xDb = WebAudioUtils::ConvertLinearToDecibels(x, -1000.0f);
+ float yDb = m_ykneeThresholdDb + m_slope * (xDb - m_kneeThresholdDb);
+
+ y = WebAudioUtils::ConvertDecibelsToLinear(yDb);
+ }
+
+ return y;
+}
+
+// Approximate 1st derivative with input and output expressed in dB.
+// This slope is equal to the inverse of the compression "ratio".
+// In other words, a compression ratio of 20 would be a slope of 1/20.
+float DynamicsCompressorKernel::slopeAt(float x, float k)
+{
+ if (x < m_linearThreshold)
+ return 1;
+
+ float x2 = x * 1.001;
+
+ float xDb = WebAudioUtils::ConvertLinearToDecibels(x, -1000.0f);
+ float x2Db = WebAudioUtils::ConvertLinearToDecibels(x2, -1000.0f);
+
+ float yDb = WebAudioUtils::ConvertLinearToDecibels(kneeCurve(x, k), -1000.0f);
+ float y2Db = WebAudioUtils::ConvertLinearToDecibels(kneeCurve(x2, k), -1000.0f);
+
+ float m = (y2Db - yDb) / (x2Db - xDb);
+
+ return m;
+}
+
+float DynamicsCompressorKernel::kAtSlope(float desiredSlope)
+{
+ float xDb = m_dbThreshold + m_dbKnee;
+ float x = WebAudioUtils::ConvertDecibelsToLinear(xDb);
+
+ // Approximate k given initial values.
+ float minK = 0.1f;
+ float maxK = 10000;
+ float k = 5;
+
+ for (int i = 0; i < 15; ++i) {
+ // A high value for k will more quickly asymptotically approach a slope of 0.
+ float slope = slopeAt(x, k);
+
+ if (slope < desiredSlope) {
+ // k is too high.
+ maxK = k;
+ } else {
+ // k is too low.
+ minK = k;
+ }
+
+ // Re-calculate based on geometric mean.
+ k = sqrtf(minK * maxK);
+ }
+
+ return k;
+}
+
+float DynamicsCompressorKernel::updateStaticCurveParameters(float dbThreshold, float dbKnee, float ratio)
+{
+ if (dbThreshold != m_dbThreshold || dbKnee != m_dbKnee || ratio != m_ratio) {
+ // Threshold and knee.
+ m_dbThreshold = dbThreshold;
+ m_linearThreshold = WebAudioUtils::ConvertDecibelsToLinear(dbThreshold);
+ m_dbKnee = dbKnee;
+
+ // Compute knee parameters.
+ m_ratio = ratio;
+ m_slope = 1 / m_ratio;
+
+ float k = kAtSlope(1 / m_ratio);
+
+ m_kneeThresholdDb = dbThreshold + dbKnee;
+ m_kneeThreshold = WebAudioUtils::ConvertDecibelsToLinear(m_kneeThresholdDb);
+
+ m_ykneeThresholdDb = WebAudioUtils::ConvertLinearToDecibels(kneeCurve(m_kneeThreshold, k), -1000.0f);
+
+ m_K = k;
+ }
+ return m_K;
+}
+
+void DynamicsCompressorKernel::process(float* sourceChannels[],
+ float* destinationChannels[],
+ unsigned numberOfChannels,
+ unsigned framesToProcess,
+
+ float dbThreshold,
+ float dbKnee,
+ float ratio,
+ float attackTime,
+ float releaseTime,
+ float preDelayTime,
+ float dbPostGain,
+ float effectBlend, /* equal power crossfade */
+
+ float releaseZone1,
+ float releaseZone2,
+ float releaseZone3,
+ float releaseZone4
+ )
+{
+ MOZ_ASSERT(m_preDelayBuffers.Length() == numberOfChannels);
+
+ float sampleRate = this->sampleRate();
+
+ float dryMix = 1 - effectBlend;
+ float wetMix = effectBlend;
+
+ float k = updateStaticCurveParameters(dbThreshold, dbKnee, ratio);
+
+ // Makeup gain.
+ float fullRangeGain = saturate(1, k);
+ float fullRangeMakeupGain = 1 / fullRangeGain;
+
+ // Empirical/perceptual tuning.
+ fullRangeMakeupGain = powf(fullRangeMakeupGain, 0.6f);
+
+ float masterLinearGain = WebAudioUtils::ConvertDecibelsToLinear(dbPostGain) * fullRangeMakeupGain;
+
+ // Attack parameters.
+ attackTime = max(0.001f, attackTime);
+ float attackFrames = attackTime * sampleRate;
+
+ // Release parameters.
+ float releaseFrames = sampleRate * releaseTime;
+
+ // Detector release time.
+ float satReleaseTime = 0.0025f;
+ float satReleaseFrames = satReleaseTime * sampleRate;
+
+ // Create a smooth function which passes through four points.
+
+ // Polynomial of the form
+ // y = a + b*x + c*x^2 + d*x^3 + e*x^4;
+
+ float y1 = releaseFrames * releaseZone1;
+ float y2 = releaseFrames * releaseZone2;
+ float y3 = releaseFrames * releaseZone3;
+ float y4 = releaseFrames * releaseZone4;
+
+ // All of these coefficients were derived for 4th order polynomial curve fitting where the y values
+ // match the evenly spaced x values as follows: (y1 : x == 0, y2 : x == 1, y3 : x == 2, y4 : x == 3)
+ float kA = 0.9999999999999998f*y1 + 1.8432219684323923e-16f*y2 - 1.9373394351676423e-16f*y3 + 8.824516011816245e-18f*y4;
+ float kB = -1.5788320352845888f*y1 + 2.3305837032074286f*y2 - 0.9141194204840429f*y3 + 0.1623677525612032f*y4;
+ float kC = 0.5334142869106424f*y1 - 1.272736789213631f*y2 + 0.9258856042207512f*y3 - 0.18656310191776226f*y4;
+ float kD = 0.08783463138207234f*y1 - 0.1694162967925622f*y2 + 0.08588057951595272f*y3 - 0.00429891410546283f*y4;
+ float kE = -0.042416883008123074f*y1 + 0.1115693827987602f*y2 - 0.09764676325265872f*y3 + 0.028494263462021576f*y4;
+
+ // x ranges from 0 -> 3 0 1 2 3
+ // -15 -10 -5 0db
+
+ // y calculates adaptive release frames depending on the amount of compression.
+
+ setPreDelayTime(preDelayTime);
+
+ const int nDivisionFrames = 32;
+
+ const int nDivisions = framesToProcess / nDivisionFrames;
+
+ unsigned frameIndex = 0;
+ for (int i = 0; i < nDivisions; ++i) {
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // Calculate desired gain
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ // Fix gremlins.
+ if (IsNaN(m_detectorAverage))
+ m_detectorAverage = 1;
+ if (IsInfinite(m_detectorAverage))
+ m_detectorAverage = 1;
+
+ float desiredGain = m_detectorAverage;
+
+ // Pre-warp so we get desiredGain after sin() warp below.
+ float scaledDesiredGain = asinf(desiredGain) / (0.5f * M_PI);
+
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // Deal with envelopes
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ // envelopeRate is the rate we slew from current compressor level to the desired level.
+ // The exact rate depends on if we're attacking or releasing and by how much.
+ float envelopeRate;
+
+ bool isReleasing = scaledDesiredGain > m_compressorGain;
+
+ // compressionDiffDb is the difference between current compression level and the desired level.
+ float compressionDiffDb = WebAudioUtils::ConvertLinearToDecibels(m_compressorGain / scaledDesiredGain, -1000.0f);
+
+ if (isReleasing) {
+ // Release mode - compressionDiffDb should be negative dB
+ m_maxAttackCompressionDiffDb = -1;
+
+ // Fix gremlins.
+ if (IsNaN(compressionDiffDb))
+ compressionDiffDb = -1;
+ if (IsInfinite(compressionDiffDb))
+ compressionDiffDb = -1;
+
+ // Adaptive release - higher compression (lower compressionDiffDb) releases faster.
+
+ // Contain within range: -12 -> 0 then scale to go from 0 -> 3
+ float x = compressionDiffDb;
+ x = max(-12.0f, x);
+ x = min(0.0f, x);
+ x = 0.25f * (x + 12);
+
+ // Compute adaptive release curve using 4th order polynomial.
+ // Normal values for the polynomial coefficients would create a monotonically increasing function.
+ float x2 = x * x;
+ float x3 = x2 * x;
+ float x4 = x2 * x2;
+ float releaseFrames = kA + kB * x + kC * x2 + kD * x3 + kE * x4;
+
+#define kSpacingDb 5
+ float dbPerFrame = kSpacingDb / releaseFrames;
+
+ envelopeRate = WebAudioUtils::ConvertDecibelsToLinear(dbPerFrame);
+ } else {
+ // Attack mode - compressionDiffDb should be positive dB
+
+ // Fix gremlins.
+ if (IsNaN(compressionDiffDb))
+ compressionDiffDb = 1;
+ if (IsInfinite(compressionDiffDb))
+ compressionDiffDb = 1;
+
+ // As long as we're still in attack mode, use a rate based off
+ // the largest compressionDiffDb we've encountered so far.
+ if (m_maxAttackCompressionDiffDb == -1 || m_maxAttackCompressionDiffDb < compressionDiffDb)
+ m_maxAttackCompressionDiffDb = compressionDiffDb;
+
+ float effAttenDiffDb = max(0.5f, m_maxAttackCompressionDiffDb);
+
+ float x = 0.25f / effAttenDiffDb;
+ envelopeRate = 1 - powf(x, 1 / attackFrames);
+ }
+
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ // Inner loop - calculate shaped power average - apply compression.
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ {
+ int preDelayReadIndex = m_preDelayReadIndex;
+ int preDelayWriteIndex = m_preDelayWriteIndex;
+ float detectorAverage = m_detectorAverage;
+ float compressorGain = m_compressorGain;
+
+ int loopFrames = nDivisionFrames;
+ while (loopFrames--) {
+ float compressorInput = 0;
+
+ // Predelay signal, computing compression amount from un-delayed version.
+ for (unsigned i = 0; i < numberOfChannels; ++i) {
+ float* delayBuffer = m_preDelayBuffers[i].get();
+ float undelayedSource = sourceChannels[i][frameIndex];
+ delayBuffer[preDelayWriteIndex] = undelayedSource;
+
+ float absUndelayedSource = undelayedSource > 0 ? undelayedSource : -undelayedSource;
+ if (compressorInput < absUndelayedSource)
+ compressorInput = absUndelayedSource;
+ }
+
+ // Calculate shaped power on undelayed input.
+
+ float scaledInput = compressorInput;
+ float absInput = scaledInput > 0 ? scaledInput : -scaledInput;
+
+ // Put through shaping curve.
+ // This is linear up to the threshold, then enters a "knee" portion followed by the "ratio" portion.
+ // The transition from the threshold to the knee is smooth (1st derivative matched).
+ // The transition from the knee to the ratio portion is smooth (1st derivative matched).
+ float shapedInput = saturate(absInput, k);
+
+ float attenuation = absInput <= 0.0001f ? 1 : shapedInput / absInput;
+
+ float attenuationDb = -WebAudioUtils::ConvertLinearToDecibels(attenuation, -1000.0f);
+ attenuationDb = max(2.0f, attenuationDb);
+
+ float dbPerFrame = attenuationDb / satReleaseFrames;
+
+ float satReleaseRate = WebAudioUtils::ConvertDecibelsToLinear(dbPerFrame) - 1;
+
+ bool isRelease = (attenuation > detectorAverage);
+ float rate = isRelease ? satReleaseRate : 1;
+
+ detectorAverage += (attenuation - detectorAverage) * rate;
+ detectorAverage = min(1.0f, detectorAverage);
+
+ // Fix gremlins.
+ if (IsNaN(detectorAverage))
+ detectorAverage = 1;
+ if (IsInfinite(detectorAverage))
+ detectorAverage = 1;
+
+ // Exponential approach to desired gain.
+ if (envelopeRate < 1) {
+ // Attack - reduce gain to desired.
+ compressorGain += (scaledDesiredGain - compressorGain) * envelopeRate;
+ } else {
+ // Release - exponentially increase gain to 1.0
+ compressorGain *= envelopeRate;
+ compressorGain = min(1.0f, compressorGain);
+ }
+
+ // Warp pre-compression gain to smooth out sharp exponential transition points.
+ float postWarpCompressorGain = sinf(0.5f * M_PI * compressorGain);
+
+ // Calculate total gain using master gain and effect blend.
+ float totalGain = dryMix + wetMix * masterLinearGain * postWarpCompressorGain;
+
+ // Calculate metering.
+ float dbRealGain = 20 * log10(postWarpCompressorGain);
+ if (dbRealGain < m_meteringGain)
+ m_meteringGain = dbRealGain;
+ else
+ m_meteringGain += (dbRealGain - m_meteringGain) * m_meteringReleaseK;
+
+ // Apply final gain.
+ for (unsigned i = 0; i < numberOfChannels; ++i) {
+ float* delayBuffer = m_preDelayBuffers[i].get();
+ destinationChannels[i][frameIndex] = delayBuffer[preDelayReadIndex] * totalGain;
+ }
+
+ frameIndex++;
+ preDelayReadIndex = (preDelayReadIndex + 1) & MaxPreDelayFramesMask;
+ preDelayWriteIndex = (preDelayWriteIndex + 1) & MaxPreDelayFramesMask;
+ }
+
+ // Locals back to member variables.
+ m_preDelayReadIndex = preDelayReadIndex;
+ m_preDelayWriteIndex = preDelayWriteIndex;
+ m_detectorAverage = DenormalDisabler::flushDenormalFloatToZero(detectorAverage);
+ m_compressorGain = DenormalDisabler::flushDenormalFloatToZero(compressorGain);
+ }
+ }
+}
+
+void DynamicsCompressorKernel::reset()
+{
+ m_detectorAverage = 0;
+ m_compressorGain = 1;
+ m_meteringGain = 1;
+
+ // Predelay section.
+ for (unsigned i = 0; i < m_preDelayBuffers.Length(); ++i)
+ memset(m_preDelayBuffers[i].get(), 0, sizeof(float) * MaxPreDelayFrames);
+
+ m_preDelayReadIndex = 0;
+ m_preDelayWriteIndex = DefaultPreDelayFrames;
+
+ m_maxAttackCompressionDiffDb = -1; // uninitialized state
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/DynamicsCompressorKernel.h b/dom/media/webaudio/blink/DynamicsCompressorKernel.h
new file mode 100644
index 000000000..39449949c
--- /dev/null
+++ b/dom/media/webaudio/blink/DynamicsCompressorKernel.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef DynamicsCompressorKernel_h
+#define DynamicsCompressorKernel_h
+
+#include "nsTArray.h"
+#include "mozilla/MemoryReporting.h"
+#include "mozilla/UniquePtr.h"
+
+namespace WebCore {
+
+class DynamicsCompressorKernel {
+public:
+ DynamicsCompressorKernel(float sampleRate, unsigned numberOfChannels);
+
+ void setNumberOfChannels(unsigned);
+
+ // Performs stereo-linked compression.
+ void process(float* sourceChannels[],
+ float* destinationChannels[],
+ unsigned numberOfChannels,
+ unsigned framesToProcess,
+
+ float dbThreshold,
+ float dbKnee,
+ float ratio,
+ float attackTime,
+ float releaseTime,
+ float preDelayTime,
+ float dbPostGain,
+ float effectBlend,
+
+ float releaseZone1,
+ float releaseZone2,
+ float releaseZone3,
+ float releaseZone4
+ );
+
+ void reset();
+
+ unsigned latencyFrames() const { return m_lastPreDelayFrames; }
+
+ float sampleRate() const { return m_sampleRate; }
+
+ float meteringGain() const { return m_meteringGain; }
+
+ size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+protected:
+ float m_sampleRate;
+
+ float m_detectorAverage;
+ float m_compressorGain;
+
+ // Metering
+ float m_meteringReleaseK;
+ float m_meteringGain;
+
+ // Lookahead section.
+ enum { MaxPreDelayFrames = 1024 };
+ enum { MaxPreDelayFramesMask = MaxPreDelayFrames - 1 };
+ enum { DefaultPreDelayFrames = 256 }; // setPreDelayTime() will override this initial value
+ unsigned m_lastPreDelayFrames;
+ void setPreDelayTime(float);
+
+ nsTArray<mozilla::UniquePtr<float[]>> m_preDelayBuffers;
+ int m_preDelayReadIndex;
+ int m_preDelayWriteIndex;
+
+ float m_maxAttackCompressionDiffDb;
+
+ // Static compression curve.
+ float kneeCurve(float x, float k);
+ float saturate(float x, float k);
+ float slopeAt(float x, float k);
+ float kAtSlope(float desiredSlope);
+
+ float updateStaticCurveParameters(float dbThreshold, float dbKnee, float ratio);
+
+ // Amount of input change in dB required for 1 dB of output change.
+ // This applies to the portion of the curve above m_kneeThresholdDb (see below).
+ float m_ratio;
+ float m_slope; // Inverse ratio.
+
+ // The input to output change below the threshold is linear 1:1.
+ float m_linearThreshold;
+ float m_dbThreshold;
+
+ // m_dbKnee is the number of dB above the threshold before we enter the "ratio" portion of the curve.
+ // m_kneeThresholdDb = m_dbThreshold + m_dbKnee
+ // The portion between m_dbThreshold and m_kneeThresholdDb is the "soft knee" portion of the curve
+ // which transitions smoothly from the linear portion to the ratio portion.
+ float m_dbKnee;
+ float m_kneeThreshold;
+ float m_kneeThresholdDb;
+ float m_ykneeThresholdDb;
+
+ // Internal parameter for the knee portion of the curve.
+ float m_K;
+};
+
+} // namespace WebCore
+
+#endif // DynamicsCompressorKernel_h
diff --git a/dom/media/webaudio/blink/FFTConvolver.cpp b/dom/media/webaudio/blink/FFTConvolver.cpp
new file mode 100644
index 000000000..8694073ae
--- /dev/null
+++ b/dom/media/webaudio/blink/FFTConvolver.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "FFTConvolver.h"
+#include "mozilla/PodOperations.h"
+
+using namespace mozilla;
+
+namespace WebCore {
+
+FFTConvolver::FFTConvolver(size_t fftSize, size_t renderPhase)
+ : m_frame(fftSize)
+ , m_readWriteIndex(renderPhase % (fftSize / 2))
+{
+ MOZ_ASSERT(fftSize >= 2 * WEBAUDIO_BLOCK_SIZE);
+ m_inputBuffer.SetLength(fftSize);
+ PodZero(m_inputBuffer.Elements(), fftSize);
+ m_outputBuffer.SetLength(fftSize);
+ PodZero(m_outputBuffer.Elements(), fftSize);
+ m_lastOverlapBuffer.SetLength(fftSize / 2);
+ PodZero(m_lastOverlapBuffer.Elements(), fftSize / 2);
+}
+
+size_t FFTConvolver::sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = 0;
+ amount += m_frame.SizeOfExcludingThis(aMallocSizeOf);
+ amount += m_inputBuffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += m_outputBuffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ amount += m_lastOverlapBuffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t FFTConvolver::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf);
+}
+
+const float* FFTConvolver::process(FFTBlock* fftKernel, const float* sourceP)
+{
+ size_t halfSize = fftSize() / 2;
+
+ // WEBAUDIO_BLOCK_SIZE must be an exact multiple of halfSize,
+ // halfSize must be a multiple of WEBAUDIO_BLOCK_SIZE
+ // and > WEBAUDIO_BLOCK_SIZE.
+ MOZ_ASSERT(halfSize % WEBAUDIO_BLOCK_SIZE == 0 &&
+ WEBAUDIO_BLOCK_SIZE <= halfSize);
+
+ // Copy samples to input buffer (note contraint above!)
+ float* inputP = m_inputBuffer.Elements();
+
+ MOZ_ASSERT(sourceP && inputP && m_readWriteIndex + WEBAUDIO_BLOCK_SIZE <= m_inputBuffer.Length());
+
+ memcpy(inputP + m_readWriteIndex, sourceP, sizeof(float) * WEBAUDIO_BLOCK_SIZE);
+
+ float* outputP = m_outputBuffer.Elements();
+ m_readWriteIndex += WEBAUDIO_BLOCK_SIZE;
+
+ // Check if it's time to perform the next FFT
+ if (m_readWriteIndex == halfSize) {
+ // The input buffer is now filled (get frequency-domain version)
+ m_frame.PerformFFT(m_inputBuffer.Elements());
+ m_frame.Multiply(*fftKernel);
+ m_frame.GetInverseWithoutScaling(m_outputBuffer.Elements());
+
+ // Overlap-add 1st half from previous time
+ AudioBufferAddWithScale(m_lastOverlapBuffer.Elements(), 1.0f,
+ m_outputBuffer.Elements(), halfSize);
+
+ // Finally, save 2nd half of result
+ MOZ_ASSERT(m_outputBuffer.Length() == 2 * halfSize && m_lastOverlapBuffer.Length() == halfSize);
+
+ memcpy(m_lastOverlapBuffer.Elements(), m_outputBuffer.Elements() + halfSize, sizeof(float) * halfSize);
+
+ // Reset index back to start for next time
+ m_readWriteIndex = 0;
+ }
+
+ return outputP + m_readWriteIndex;
+}
+
+void FFTConvolver::reset()
+{
+ PodZero(m_lastOverlapBuffer.Elements(), m_lastOverlapBuffer.Length());
+ m_readWriteIndex = 0;
+}
+
+size_t FFTConvolver::latencyFrames() const
+{
+ return std::max<size_t>(fftSize()/2, WEBAUDIO_BLOCK_SIZE) -
+ WEBAUDIO_BLOCK_SIZE;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/FFTConvolver.h b/dom/media/webaudio/blink/FFTConvolver.h
new file mode 100644
index 000000000..118c6baef
--- /dev/null
+++ b/dom/media/webaudio/blink/FFTConvolver.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FFTConvolver_h
+#define FFTConvolver_h
+
+#include "nsTArray.h"
+#include "mozilla/FFTBlock.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+typedef AlignedTArray<float> AlignedAudioFloatArray;
+using mozilla::FFTBlock;
+
+class FFTConvolver {
+public:
+ // |fftSize| must be a power of two.
+ //
+ // |renderPhase| is the initial offset in the initially zero input buffer.
+ // It is coordinated with the other stages, so they don't all do their
+ // FFTs at the same time.
+ explicit FFTConvolver(size_t fftSize, size_t renderPhase = 0);
+
+ // Process WEBAUDIO_BLOCK_SIZE elements of array |sourceP| and return a
+ // pointer to an output array of the same size.
+ //
+ // |fftKernel| must be pre-scaled for FFTBlock::GetInverseWithoutScaling().
+ //
+ // FIXME: Later, we can do more sophisticated buffering to relax this requirement...
+ const float* process(FFTBlock* fftKernel, const float* sourceP);
+
+ void reset();
+
+ size_t fftSize() const { return m_frame.FFTSize(); }
+
+ // The input to output latency is up to fftSize / 2, but alignment of the
+ // FFTs with the blocks reduces this by one block.
+ size_t latencyFrames() const;
+
+ size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ FFTBlock m_frame;
+
+ // Buffer input until we get fftSize / 2 samples then do an FFT
+ size_t m_readWriteIndex;
+ AlignedAudioFloatArray m_inputBuffer;
+
+ // Stores output which we read a little at a time
+ AlignedAudioFloatArray m_outputBuffer;
+
+ // Saves the 2nd half of the FFT buffer, so we can do an overlap-add with the 1st half of the next one
+ AlignedAudioFloatArray m_lastOverlapBuffer;
+};
+
+} // namespace WebCore
+
+#endif // FFTConvolver_h
diff --git a/dom/media/webaudio/blink/HRTFDatabase.cpp b/dom/media/webaudio/blink/HRTFDatabase.cpp
new file mode 100644
index 000000000..ef236c855
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFDatabase.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "HRTFDatabase.h"
+
+#include "HRTFElevation.h"
+
+using namespace std;
+
+namespace WebCore {
+
+const int HRTFDatabase::MinElevation = -45;
+const int HRTFDatabase::MaxElevation = 90;
+const unsigned HRTFDatabase::RawElevationAngleSpacing = 15;
+const unsigned HRTFDatabase::NumberOfRawElevations = 10; // -45 -> +90 (each 15 degrees)
+const unsigned HRTFDatabase::InterpolationFactor = 1;
+const unsigned HRTFDatabase::NumberOfTotalElevations = NumberOfRawElevations * InterpolationFactor;
+
+nsReturnRef<HRTFDatabase> HRTFDatabase::create(float sampleRate)
+{
+ return nsReturnRef<HRTFDatabase>(new HRTFDatabase(sampleRate));
+}
+
+HRTFDatabase::HRTFDatabase(float sampleRate)
+ : m_sampleRate(sampleRate)
+{
+ m_elevations.SetLength(NumberOfTotalElevations);
+
+ unsigned elevationIndex = 0;
+ for (int elevation = MinElevation; elevation <= MaxElevation; elevation += RawElevationAngleSpacing) {
+ nsAutoRef<HRTFElevation> hrtfElevation(HRTFElevation::createBuiltin(elevation, sampleRate));
+ MOZ_ASSERT(hrtfElevation.get());
+ if (!hrtfElevation.get())
+ return;
+
+ m_elevations[elevationIndex] = hrtfElevation.out();
+ elevationIndex += InterpolationFactor;
+ }
+
+ // Now, go back and interpolate elevations.
+ if (InterpolationFactor > 1) {
+ for (unsigned i = 0; i < NumberOfTotalElevations; i += InterpolationFactor) {
+ unsigned j = (i + InterpolationFactor);
+ if (j >= NumberOfTotalElevations)
+ j = i; // for last elevation interpolate with itself
+
+ // Create the interpolated convolution kernels and delays.
+ for (unsigned jj = 1; jj < InterpolationFactor; ++jj) {
+ float x = static_cast<float>(jj) / static_cast<float>(InterpolationFactor);
+ m_elevations[i + jj] = HRTFElevation::createByInterpolatingSlices(m_elevations[i].get(), m_elevations[j].get(), x, sampleRate);
+ MOZ_ASSERT(m_elevations[i + jj].get());
+ }
+ }
+ }
+}
+
+size_t HRTFDatabase::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+ amount += m_elevations.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_elevations.Length(); i++) {
+ amount += m_elevations[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+void HRTFDatabase::getKernelsFromAzimuthElevation(double azimuthBlend, unsigned azimuthIndex, double elevationAngle, HRTFKernel* &kernelL, HRTFKernel* &kernelR,
+ double& frameDelayL, double& frameDelayR)
+{
+ unsigned elevationIndex = indexFromElevationAngle(elevationAngle);
+ MOZ_ASSERT(elevationIndex < m_elevations.Length() && m_elevations.Length() > 0);
+
+ if (!m_elevations.Length()) {
+ kernelL = 0;
+ kernelR = 0;
+ return;
+ }
+
+ if (elevationIndex > m_elevations.Length() - 1)
+ elevationIndex = m_elevations.Length() - 1;
+
+ HRTFElevation* hrtfElevation = m_elevations[elevationIndex].get();
+ MOZ_ASSERT(hrtfElevation);
+ if (!hrtfElevation) {
+ kernelL = 0;
+ kernelR = 0;
+ return;
+ }
+
+ hrtfElevation->getKernelsFromAzimuth(azimuthBlend, azimuthIndex, kernelL, kernelR, frameDelayL, frameDelayR);
+}
+
+unsigned HRTFDatabase::indexFromElevationAngle(double elevationAngle)
+{
+ // Clamp to allowed range.
+ elevationAngle = mozilla::clamped(elevationAngle,
+ static_cast<double>(MinElevation),
+ static_cast<double>(MaxElevation));
+
+ unsigned elevationIndex = static_cast<int>(InterpolationFactor * (elevationAngle - MinElevation) / RawElevationAngleSpacing);
+ return elevationIndex;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/HRTFDatabase.h b/dom/media/webaudio/blink/HRTFDatabase.h
new file mode 100644
index 000000000..400763b8f
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFDatabase.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HRTFDatabase_h
+#define HRTFDatabase_h
+
+#include "HRTFElevation.h"
+#include "nsAutoRef.h"
+#include "nsTArray.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+class HRTFKernel;
+
+class HRTFDatabase {
+public:
+ static nsReturnRef<HRTFDatabase> create(float sampleRate);
+
+ // getKernelsFromAzimuthElevation() returns a left and right ear kernel, and an interpolated left and right frame delay for the given azimuth and elevation.
+ // azimuthBlend must be in the range 0 -> 1.
+ // Valid values for azimuthIndex are 0 -> HRTFElevation::NumberOfTotalAzimuths - 1 (corresponding to angles of 0 -> 360).
+ // Valid values for elevationAngle are MinElevation -> MaxElevation.
+ void getKernelsFromAzimuthElevation(double azimuthBlend, unsigned azimuthIndex, double elevationAngle, HRTFKernel* &kernelL, HRTFKernel* &kernelR, double& frameDelayL, double& frameDelayR);
+
+ // Returns the number of different azimuth angles.
+ static unsigned numberOfAzimuths() { return HRTFElevation::NumberOfTotalAzimuths; }
+
+ float sampleRate() const { return m_sampleRate; }
+
+ // Number of elevations loaded from resource.
+ static const unsigned NumberOfRawElevations;
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ HRTFDatabase(const HRTFDatabase& other) = delete;
+ void operator=(const HRTFDatabase& other) = delete;
+
+ explicit HRTFDatabase(float sampleRate);
+
+ // Minimum and maximum elevation angles (inclusive) for a HRTFDatabase.
+ static const int MinElevation;
+ static const int MaxElevation;
+ static const unsigned RawElevationAngleSpacing;
+
+ // Interpolates by this factor to get the total number of elevations from every elevation loaded from resource.
+ static const unsigned InterpolationFactor;
+
+ // Total number of elevations after interpolation.
+ static const unsigned NumberOfTotalElevations;
+
+ // Returns the index for the correct HRTFElevation given the elevation angle.
+ static unsigned indexFromElevationAngle(double);
+
+ nsTArray<nsAutoRef<HRTFElevation> > m_elevations;
+ float m_sampleRate;
+};
+
+} // namespace WebCore
+
+template <>
+class nsAutoRefTraits<WebCore::HRTFDatabase> :
+ public nsPointerRefTraits<WebCore::HRTFDatabase> {
+public:
+ static void Release(WebCore::HRTFDatabase* ptr) { delete(ptr); }
+};
+
+#endif // HRTFDatabase_h
diff --git a/dom/media/webaudio/blink/HRTFDatabaseLoader.cpp b/dom/media/webaudio/blink/HRTFDatabaseLoader.cpp
new file mode 100644
index 000000000..090e1b217
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFDatabaseLoader.cpp
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "HRTFDatabaseLoader.h"
+#include "HRTFDatabase.h"
+
+using namespace mozilla;
+
+namespace WebCore {
+
+// Singleton
+nsTHashtable<HRTFDatabaseLoader::LoaderByRateEntry>*
+ HRTFDatabaseLoader::s_loaderMap = nullptr;
+
+size_t HRTFDatabaseLoader::sizeOfLoaders(mozilla::MallocSizeOf aMallocSizeOf)
+{
+ return s_loaderMap ? s_loaderMap->SizeOfIncludingThis(aMallocSizeOf) : 0;
+}
+
+already_AddRefed<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(float sampleRate)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ RefPtr<HRTFDatabaseLoader> loader;
+
+ if (!s_loaderMap) {
+ s_loaderMap = new nsTHashtable<LoaderByRateEntry>();
+ }
+
+ LoaderByRateEntry* entry = s_loaderMap->PutEntry(sampleRate);
+ loader = entry->mLoader;
+ if (loader) { // existing entry
+ MOZ_ASSERT(sampleRate == loader->databaseSampleRate());
+ return loader.forget();
+ }
+
+ loader = new HRTFDatabaseLoader(sampleRate);
+ entry->mLoader = loader;
+
+ loader->loadAsynchronously();
+
+ return loader.forget();
+}
+
+HRTFDatabaseLoader::HRTFDatabaseLoader(float sampleRate)
+ : m_refCnt(0)
+ , m_threadLock("HRTFDatabaseLoader")
+ , m_databaseLoaderThread(nullptr)
+ , m_databaseSampleRate(sampleRate)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+}
+
+HRTFDatabaseLoader::~HRTFDatabaseLoader()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ waitForLoaderThreadCompletion();
+ m_hrtfDatabase.reset();
+
+ if (s_loaderMap) {
+ // Remove ourself from the map.
+ s_loaderMap->RemoveEntry(m_databaseSampleRate);
+ if (s_loaderMap->Count() == 0) {
+ delete s_loaderMap;
+ s_loaderMap = nullptr;
+ }
+ }
+}
+
+size_t HRTFDatabaseLoader::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+
+ // NB: Need to make sure we're not competing with the loader thread.
+ const_cast<HRTFDatabaseLoader*>(this)->waitForLoaderThreadCompletion();
+
+ if (m_hrtfDatabase) {
+ amount += m_hrtfDatabase->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+class HRTFDatabaseLoader::ProxyReleaseEvent final : public Runnable {
+public:
+ explicit ProxyReleaseEvent(HRTFDatabaseLoader* loader) : mLoader(loader) {}
+ NS_IMETHOD Run() override
+ {
+ mLoader->MainThreadRelease();
+ return NS_OK;
+ }
+private:
+ HRTFDatabaseLoader* mLoader;
+};
+
+void HRTFDatabaseLoader::ProxyRelease()
+{
+ nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
+ if (MOZ_LIKELY(mainThread)) {
+ RefPtr<ProxyReleaseEvent> event = new ProxyReleaseEvent(this);
+ DebugOnly<nsresult> rv =
+ mainThread->Dispatch(event, NS_DISPATCH_NORMAL);
+ MOZ_ASSERT(NS_SUCCEEDED(rv), "Failed to dispatch release event");
+ } else {
+ // Should be in XPCOM shutdown.
+ MOZ_ASSERT(NS_IsMainThread(),
+ "Main thread is not available for dispatch.");
+ MainThreadRelease();
+ }
+}
+
+void HRTFDatabaseLoader::MainThreadRelease()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ int count = --m_refCnt;
+ MOZ_ASSERT(count >= 0, "extra release");
+ NS_LOG_RELEASE(this, count, "HRTFDatabaseLoader");
+ if (count == 0) {
+ // It is safe to delete here as the first reference can only be added
+ // on this (main) thread.
+ delete this;
+ }
+}
+
+// Asynchronously load the database in this thread.
+static void databaseLoaderEntry(void* threadData)
+{
+ PR_SetCurrentThreadName("HRTFDatabaseLdr");
+
+ HRTFDatabaseLoader* loader = reinterpret_cast<HRTFDatabaseLoader*>(threadData);
+ MOZ_ASSERT(loader);
+ loader->load();
+}
+
+void HRTFDatabaseLoader::load()
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ MOZ_ASSERT(!m_hrtfDatabase.get(), "Called twice");
+ // Load the default HRTF database.
+ m_hrtfDatabase = HRTFDatabase::create(m_databaseSampleRate);
+ // Notifies the main thread of completion. See loadAsynchronously().
+ Release();
+}
+
+void HRTFDatabaseLoader::loadAsynchronously()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(m_refCnt, "Must not be called before a reference is added");
+
+ // Add a reference so that the destructor won't run and wait for the
+ // loader thread, until load() has completed.
+ AddRef();
+
+ MutexAutoLock locker(m_threadLock);
+
+ MOZ_ASSERT(!m_hrtfDatabase.get() && !m_databaseLoaderThread,
+ "Called twice");
+ // Start the asynchronous database loading process.
+ m_databaseLoaderThread =
+ PR_CreateThread(PR_USER_THREAD, databaseLoaderEntry, this,
+ PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD,
+ PR_JOINABLE_THREAD, 0);
+}
+
+bool HRTFDatabaseLoader::isLoaded() const
+{
+ return m_hrtfDatabase.get();
+}
+
+void HRTFDatabaseLoader::waitForLoaderThreadCompletion()
+{
+ MutexAutoLock locker(m_threadLock);
+
+ // waitForThreadCompletion() should not be called twice for the same thread.
+ if (m_databaseLoaderThread) {
+ DebugOnly<PRStatus> status = PR_JoinThread(m_databaseLoaderThread);
+ MOZ_ASSERT(status == PR_SUCCESS, "PR_JoinThread failed");
+ }
+ m_databaseLoaderThread = nullptr;
+}
+
+void HRTFDatabaseLoader::shutdown()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (s_loaderMap) {
+ // Set s_loaderMap to nullptr so that the hashtable is not modified on
+ // reference release during enumeration.
+ nsTHashtable<LoaderByRateEntry>* loaderMap = s_loaderMap;
+ s_loaderMap = nullptr;
+ for (auto iter = loaderMap->Iter(); !iter.Done(); iter.Next()) {
+ iter.Get()->mLoader->waitForLoaderThreadCompletion();
+ }
+ delete loaderMap;
+ }
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/HRTFDatabaseLoader.h b/dom/media/webaudio/blink/HRTFDatabaseLoader.h
new file mode 100644
index 000000000..50a875b18
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFDatabaseLoader.h
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HRTFDatabaseLoader_h
+#define HRTFDatabaseLoader_h
+
+#include "nsHashKeys.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/MemoryReporting.h"
+#include "mozilla/Mutex.h"
+#include "HRTFDatabase.h"
+
+template <class EntryType> class nsTHashtable;
+template <class T> class nsAutoRef;
+
+namespace WebCore {
+
+// HRTFDatabaseLoader will asynchronously load the default HRTFDatabase in a new thread.
+
+class HRTFDatabaseLoader {
+public:
+ // Lazily creates a HRTFDatabaseLoader (if not already created) for the given sample-rate
+ // and starts loading asynchronously (when created the first time).
+ // Returns the HRTFDatabaseLoader.
+ // Must be called from the main thread.
+ static already_AddRefed<HRTFDatabaseLoader> createAndLoadAsynchronouslyIfNecessary(float sampleRate);
+
+ // AddRef and Release may be called from any thread.
+ void AddRef()
+ {
+#if defined(DEBUG) || defined(NS_BUILD_REFCNT_LOGGING)
+ int count =
+#endif
+ ++m_refCnt;
+ MOZ_ASSERT(count > 0, "invalid ref count");
+ NS_LOG_ADDREF(this, count, "HRTFDatabaseLoader", sizeof(*this));
+ }
+
+ void Release()
+ {
+ // The last reference can't be removed on a non-main thread because
+ // the object can be accessed on the main thread from the hash
+ // table via createAndLoadAsynchronouslyIfNecessary().
+ int count = m_refCnt;
+ MOZ_ASSERT(count > 0, "extra release");
+ // Optimization attempt to possibly skip proxying the release to the
+ // main thread.
+ if (count != 1 && m_refCnt.compareExchange(count, count - 1)) {
+ NS_LOG_RELEASE(this, count - 1, "HRTFDatabaseLoader");
+ return;
+ }
+
+ ProxyRelease();
+ }
+
+ // Returns true once the default database has been completely loaded.
+ bool isLoaded() const;
+
+ // waitForLoaderThreadCompletion() may be called more than once,
+ // on any thread except m_databaseLoaderThread.
+ void waitForLoaderThreadCompletion();
+
+ HRTFDatabase* database() { return m_hrtfDatabase.get(); }
+
+ float databaseSampleRate() const { return m_databaseSampleRate; }
+
+ static void shutdown();
+
+ // Called in asynchronous loading thread.
+ void load();
+
+ // Sums the size of all cached database loaders.
+ static size_t sizeOfLoaders(mozilla::MallocSizeOf aMallocSizeOf);
+
+private:
+ // Both constructor and destructor must be called from the main thread.
+ explicit HRTFDatabaseLoader(float sampleRate);
+ ~HRTFDatabaseLoader();
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+ void ProxyRelease(); // any thread
+ void MainThreadRelease(); // main thread only
+ class ProxyReleaseEvent;
+
+ // If it hasn't already been loaded, creates a new thread and initiates asynchronous loading of the default database.
+ // This must be called from the main thread.
+ void loadAsynchronously();
+
+ // Map from sample-rate to loader.
+ class LoaderByRateEntry : public nsFloatHashKey {
+ public:
+ explicit LoaderByRateEntry(KeyTypePointer aKey)
+ : nsFloatHashKey(aKey)
+ , mLoader() // so PutEntry() will zero-initialize
+ {
+ }
+
+ size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+ {
+ return mLoader ? mLoader->sizeOfIncludingThis(aMallocSizeOf) : 0;
+ }
+
+ HRTFDatabaseLoader* mLoader;
+ };
+
+ // Keeps track of loaders on a per-sample-rate basis.
+ static nsTHashtable<LoaderByRateEntry> *s_loaderMap; // singleton
+
+ mozilla::Atomic<int> m_refCnt;
+
+ nsAutoRef<HRTFDatabase> m_hrtfDatabase;
+
+ // Holding a m_threadLock is required when accessing m_databaseLoaderThread.
+ mozilla::Mutex m_threadLock;
+ PRThread* m_databaseLoaderThread;
+
+ float m_databaseSampleRate;
+};
+
+} // namespace WebCore
+
+#endif // HRTFDatabaseLoader_h
diff --git a/dom/media/webaudio/blink/HRTFElevation.cpp b/dom/media/webaudio/blink/HRTFElevation.cpp
new file mode 100644
index 000000000..2300872f3
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFElevation.cpp
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "HRTFElevation.h"
+
+#include <speex/speex_resampler.h>
+#include "mozilla/PodOperations.h"
+#include "AudioSampleFormat.h"
+
+#include "IRC_Composite_C_R0195-incl.cpp"
+
+using namespace std;
+using namespace mozilla;
+
+namespace WebCore {
+
+const int elevationSpacing = irc_composite_c_r0195_elevation_interval;
+const int firstElevation = irc_composite_c_r0195_first_elevation;
+const int numberOfElevations = MOZ_ARRAY_LENGTH(irc_composite_c_r0195);
+
+const unsigned HRTFElevation::NumberOfTotalAzimuths = 360 / 15 * 8;
+
+const int rawSampleRate = irc_composite_c_r0195_sample_rate;
+
+// Number of frames in an individual impulse response.
+const size_t ResponseFrameSize = 256;
+
+size_t HRTFElevation::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+
+ amount += m_kernelListL.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_kernelListL.Length(); i++) {
+ amount += m_kernelListL[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+size_t HRTFElevation::fftSizeForSampleRate(float sampleRate)
+{
+ // The IRCAM HRTF impulse responses were 512 sample-frames @44.1KHz,
+ // but these have been truncated to 256 samples.
+ // An FFT-size of twice impulse response size is used (for convolution).
+ // So for sample rates of 44.1KHz an FFT size of 512 is good.
+ // We double the FFT-size only for sample rates at least double this.
+ // If the FFT size is too large then the impulse response will be padded
+ // with zeros without the fade-out provided by HRTFKernel.
+ MOZ_ASSERT(sampleRate > 1.0 && sampleRate < 1048576.0);
+
+ // This is the size if we were to use all raw response samples.
+ unsigned resampledLength =
+ floorf(ResponseFrameSize * sampleRate / rawSampleRate);
+ // Keep things semi-sane, with max FFT size of 1024.
+ unsigned size = min(resampledLength, 1023U);
+ // Ensure a minimum of 2 * WEBAUDIO_BLOCK_SIZE (with the size++ below) for
+ // FFTConvolver and set the 8 least significant bits for rounding up to
+ // the next power of 2 below.
+ size |= 2 * WEBAUDIO_BLOCK_SIZE - 1;
+ // Round up to the next power of 2, making the FFT size no more than twice
+ // the impulse response length. This doubles size for values that are
+ // already powers of 2. This works by filling in alls bit to right of the
+ // most significant bit. The most significant bit is no greater than
+ // 1 << 9, and the least significant 8 bits were already set above, so
+ // there is at most one bit to add.
+ size |= (size >> 1);
+ size++;
+ MOZ_ASSERT((size & (size - 1)) == 0);
+
+ return size;
+}
+
+nsReturnRef<HRTFKernel> HRTFElevation::calculateKernelForAzimuthElevation(int azimuth, int elevation, SpeexResamplerState* resampler, float sampleRate)
+{
+ int elevationIndex = (elevation - firstElevation) / elevationSpacing;
+ MOZ_ASSERT(elevationIndex >= 0 && elevationIndex <= numberOfElevations);
+
+ int numberOfAzimuths = irc_composite_c_r0195[elevationIndex].count;
+ int azimuthSpacing = 360 / numberOfAzimuths;
+ MOZ_ASSERT(numberOfAzimuths * azimuthSpacing == 360);
+
+ int azimuthIndex = azimuth / azimuthSpacing;
+ MOZ_ASSERT(azimuthIndex * azimuthSpacing == azimuth);
+
+ const int16_t (&impulse_response_data)[ResponseFrameSize] =
+ irc_composite_c_r0195[elevationIndex].azimuths[azimuthIndex];
+
+ // When libspeex_resampler is compiled with FIXED_POINT, samples in
+ // speex_resampler_process_float are rounded directly to int16_t, which
+ // only works well if the floats are in the range +/-32767. On such
+ // platforms it's better to resample before converting to float anyway.
+#ifdef MOZ_SAMPLE_TYPE_S16
+# define RESAMPLER_PROCESS speex_resampler_process_int
+ const int16_t* response = impulse_response_data;
+ const int16_t* resampledResponse;
+#else
+# define RESAMPLER_PROCESS speex_resampler_process_float
+ float response[ResponseFrameSize];
+ ConvertAudioSamples(impulse_response_data, response, ResponseFrameSize);
+ float* resampledResponse;
+#endif
+
+ // Note that depending on the fftSize returned by the panner, we may be truncating the impulse response.
+ const size_t resampledResponseLength = fftSizeForSampleRate(sampleRate) / 2;
+
+ AutoTArray<AudioDataValue, 2 * ResponseFrameSize> resampled;
+ if (sampleRate == rawSampleRate) {
+ resampledResponse = response;
+ MOZ_ASSERT(resampledResponseLength == ResponseFrameSize);
+ } else {
+ resampled.SetLength(resampledResponseLength);
+ resampledResponse = resampled.Elements();
+ speex_resampler_skip_zeros(resampler);
+
+ // Feed the input buffer into the resampler.
+ spx_uint32_t in_len = ResponseFrameSize;
+ spx_uint32_t out_len = resampled.Length();
+ RESAMPLER_PROCESS(resampler, 0, response, &in_len,
+ resampled.Elements(), &out_len);
+
+ if (out_len < resampled.Length()) {
+ // The input should have all been processed.
+ MOZ_ASSERT(in_len == ResponseFrameSize);
+ // Feed in zeros get the data remaining in the resampler.
+ spx_uint32_t out_index = out_len;
+ in_len = speex_resampler_get_input_latency(resampler);
+ out_len = resampled.Length() - out_index;
+ RESAMPLER_PROCESS(resampler, 0, nullptr, &in_len,
+ resampled.Elements() + out_index, &out_len);
+ out_index += out_len;
+ // There may be some uninitialized samples remaining for very low
+ // sample rates.
+ PodZero(resampled.Elements() + out_index,
+ resampled.Length() - out_index);
+ }
+
+ speex_resampler_reset_mem(resampler);
+ }
+
+#ifdef MOZ_SAMPLE_TYPE_S16
+ AutoTArray<float, 2 * ResponseFrameSize> floatArray;
+ floatArray.SetLength(resampledResponseLength);
+ float *floatResponse = floatArray.Elements();
+ ConvertAudioSamples(resampledResponse,
+ floatResponse, resampledResponseLength);
+#else
+ float *floatResponse = resampledResponse;
+#endif
+#undef RESAMPLER_PROCESS
+
+ return HRTFKernel::create(floatResponse, resampledResponseLength, sampleRate);
+}
+
+// The range of elevations for the IRCAM impulse responses varies depending on azimuth, but the minimum elevation appears to always be -45.
+//
+// Here's how it goes:
+static int maxElevations[] = {
+ // Azimuth
+ //
+ 90, // 0
+ 45, // 15
+ 60, // 30
+ 45, // 45
+ 75, // 60
+ 45, // 75
+ 60, // 90
+ 45, // 105
+ 75, // 120
+ 45, // 135
+ 60, // 150
+ 45, // 165
+ 75, // 180
+ 45, // 195
+ 60, // 210
+ 45, // 225
+ 75, // 240
+ 45, // 255
+ 60, // 270
+ 45, // 285
+ 75, // 300
+ 45, // 315
+ 60, // 330
+ 45 // 345
+};
+
+nsReturnRef<HRTFElevation> HRTFElevation::createBuiltin(int elevation, float sampleRate)
+{
+ if (elevation < firstElevation ||
+ elevation > firstElevation + numberOfElevations * elevationSpacing ||
+ (elevation / elevationSpacing) * elevationSpacing != elevation)
+ return nsReturnRef<HRTFElevation>();
+
+ // Spacing, in degrees, between every azimuth loaded from resource.
+ // Some elevations do not have data for all these intervals.
+ // See maxElevations.
+ static const unsigned AzimuthSpacing = 15;
+ static const unsigned NumberOfRawAzimuths = 360 / AzimuthSpacing;
+ static_assert(AzimuthSpacing * NumberOfRawAzimuths == 360,
+ "Not a multiple");
+ static const unsigned InterpolationFactor =
+ NumberOfTotalAzimuths / NumberOfRawAzimuths;
+ static_assert(NumberOfTotalAzimuths ==
+ NumberOfRawAzimuths * InterpolationFactor, "Not a multiple");
+
+ HRTFKernelList kernelListL;
+ kernelListL.SetLength(NumberOfTotalAzimuths);
+
+ SpeexResamplerState* resampler = sampleRate == rawSampleRate ? nullptr :
+ speex_resampler_init(1, rawSampleRate, sampleRate,
+ SPEEX_RESAMPLER_QUALITY_MIN, nullptr);
+
+ // Load convolution kernels from HRTF files.
+ int interpolatedIndex = 0;
+ for (unsigned rawIndex = 0; rawIndex < NumberOfRawAzimuths; ++rawIndex) {
+ // Don't let elevation exceed maximum for this azimuth.
+ int maxElevation = maxElevations[rawIndex];
+ int actualElevation = min(elevation, maxElevation);
+
+ kernelListL[interpolatedIndex] = calculateKernelForAzimuthElevation(rawIndex * AzimuthSpacing, actualElevation, resampler, sampleRate);
+
+ interpolatedIndex += InterpolationFactor;
+ }
+
+ if (resampler)
+ speex_resampler_destroy(resampler);
+
+ // Now go back and interpolate intermediate azimuth values.
+ for (unsigned i = 0; i < NumberOfTotalAzimuths; i += InterpolationFactor) {
+ int j = (i + InterpolationFactor) % NumberOfTotalAzimuths;
+
+ // Create the interpolated convolution kernels and delays.
+ for (unsigned jj = 1; jj < InterpolationFactor; ++jj) {
+ float x = float(jj) / float(InterpolationFactor); // interpolate from 0 -> 1
+
+ kernelListL[i + jj] = HRTFKernel::createInterpolatedKernel(kernelListL[i], kernelListL[j], x);
+ }
+ }
+
+ return nsReturnRef<HRTFElevation>(new HRTFElevation(&kernelListL, elevation, sampleRate));
+}
+
+nsReturnRef<HRTFElevation> HRTFElevation::createByInterpolatingSlices(HRTFElevation* hrtfElevation1, HRTFElevation* hrtfElevation2, float x, float sampleRate)
+{
+ MOZ_ASSERT(hrtfElevation1 && hrtfElevation2);
+ if (!hrtfElevation1 || !hrtfElevation2)
+ return nsReturnRef<HRTFElevation>();
+
+ MOZ_ASSERT(x >= 0.0 && x < 1.0);
+
+ HRTFKernelList kernelListL;
+ kernelListL.SetLength(NumberOfTotalAzimuths);
+
+ const HRTFKernelList& kernelListL1 = hrtfElevation1->kernelListL();
+ const HRTFKernelList& kernelListL2 = hrtfElevation2->kernelListL();
+
+ // Interpolate kernels of corresponding azimuths of the two elevations.
+ for (unsigned i = 0; i < NumberOfTotalAzimuths; ++i) {
+ kernelListL[i] = HRTFKernel::createInterpolatedKernel(kernelListL1[i], kernelListL2[i], x);
+ }
+
+ // Interpolate elevation angle.
+ double angle = (1.0 - x) * hrtfElevation1->elevationAngle() + x * hrtfElevation2->elevationAngle();
+
+ return nsReturnRef<HRTFElevation>(new HRTFElevation(&kernelListL, static_cast<int>(angle), sampleRate));
+}
+
+void HRTFElevation::getKernelsFromAzimuth(double azimuthBlend, unsigned azimuthIndex, HRTFKernel* &kernelL, HRTFKernel* &kernelR, double& frameDelayL, double& frameDelayR)
+{
+ bool checkAzimuthBlend = azimuthBlend >= 0.0 && azimuthBlend < 1.0;
+ MOZ_ASSERT(checkAzimuthBlend);
+ if (!checkAzimuthBlend)
+ azimuthBlend = 0.0;
+
+ unsigned numKernels = m_kernelListL.Length();
+
+ bool isIndexGood = azimuthIndex < numKernels;
+ MOZ_ASSERT(isIndexGood);
+ if (!isIndexGood) {
+ kernelL = 0;
+ kernelR = 0;
+ return;
+ }
+
+ // Return the left and right kernels,
+ // using symmetry to produce the right kernel.
+ kernelL = m_kernelListL[azimuthIndex];
+ int azimuthIndexR = (numKernels - azimuthIndex) % numKernels;
+ kernelR = m_kernelListL[azimuthIndexR];
+
+ frameDelayL = kernelL->frameDelay();
+ frameDelayR = kernelR->frameDelay();
+
+ int azimuthIndex2L = (azimuthIndex + 1) % numKernels;
+ double frameDelay2L = m_kernelListL[azimuthIndex2L]->frameDelay();
+ int azimuthIndex2R = (numKernels - azimuthIndex2L) % numKernels;
+ double frameDelay2R = m_kernelListL[azimuthIndex2R]->frameDelay();
+
+ // Linearly interpolate delays.
+ frameDelayL = (1.0 - azimuthBlend) * frameDelayL + azimuthBlend * frameDelay2L;
+ frameDelayR = (1.0 - azimuthBlend) * frameDelayR + azimuthBlend * frameDelay2R;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/HRTFElevation.h b/dom/media/webaudio/blink/HRTFElevation.h
new file mode 100644
index 000000000..e50947b12
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFElevation.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HRTFElevation_h
+#define HRTFElevation_h
+
+#include "HRTFKernel.h"
+#include "nsAutoRef.h"
+#include "mozilla/MemoryReporting.h"
+
+struct SpeexResamplerState_;
+typedef struct SpeexResamplerState_ SpeexResamplerState;
+
+namespace WebCore {
+
+// HRTFElevation contains all of the HRTFKernels (one left ear and one right ear per azimuth angle) for a particular elevation.
+
+class HRTFElevation {
+public:
+ // Loads and returns an HRTFElevation with the given HRTF database subject name and elevation from browser (or WebKit.framework) resources.
+ // Normally, there will only be a single HRTF database set, but this API supports the possibility of multiple ones with different names.
+ // Interpolated azimuths will be generated based on InterpolationFactor.
+ // Valid values for elevation are -45 -> +90 in 15 degree increments.
+ static nsReturnRef<HRTFElevation> createBuiltin(int elevation, float sampleRate);
+
+ // Given two HRTFElevations, and an interpolation factor x: 0 -> 1, returns an interpolated HRTFElevation.
+ static nsReturnRef<HRTFElevation> createByInterpolatingSlices(HRTFElevation* hrtfElevation1, HRTFElevation* hrtfElevation2, float x, float sampleRate);
+
+ double elevationAngle() const { return m_elevationAngle; }
+ unsigned numberOfAzimuths() const { return NumberOfTotalAzimuths; }
+ float sampleRate() const { return m_sampleRate; }
+
+ // Returns the left and right kernels for the given azimuth index.
+ // The interpolated delays based on azimuthBlend: 0 -> 1 are returned in frameDelayL and frameDelayR.
+ void getKernelsFromAzimuth(double azimuthBlend, unsigned azimuthIndex, HRTFKernel* &kernelL, HRTFKernel* &kernelR, double& frameDelayL, double& frameDelayR);
+
+ // Total number of azimuths after interpolation.
+ static const unsigned NumberOfTotalAzimuths;
+
+ static size_t fftSizeForSampleRate(float sampleRate);
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ HRTFElevation(const HRTFElevation& other) = delete;
+ void operator=(const HRTFElevation& other) = delete;
+
+ HRTFElevation(HRTFKernelList *kernelListL, int elevation, float sampleRate)
+ : m_elevationAngle(elevation)
+ , m_sampleRate(sampleRate)
+ {
+ m_kernelListL.SwapElements(*kernelListL);
+ }
+
+ // Returns the list of left ear HRTFKernels for all the azimuths going from 0 to 360 degrees.
+ const HRTFKernelList& kernelListL() { return m_kernelListL; }
+
+ // Given a specific azimuth and elevation angle, returns the left HRTFKernel.
+ // Values for azimuth must be multiples of 15 in 0 -> 345,
+ // but not all azimuths are available for elevations > +45.
+ // Valid values for elevation are -45 -> +90 in 15 degree increments.
+ static nsReturnRef<HRTFKernel> calculateKernelForAzimuthElevation(int azimuth, int elevation, SpeexResamplerState* resampler, float sampleRate);
+
+ HRTFKernelList m_kernelListL;
+ double m_elevationAngle;
+ float m_sampleRate;
+};
+
+} // namespace WebCore
+
+template <>
+class nsAutoRefTraits<WebCore::HRTFElevation> :
+ public nsPointerRefTraits<WebCore::HRTFElevation> {
+public:
+ static void Release(WebCore::HRTFElevation* ptr) { delete(ptr); }
+};
+
+#endif // HRTFElevation_h
diff --git a/dom/media/webaudio/blink/HRTFKernel.cpp b/dom/media/webaudio/blink/HRTFKernel.cpp
new file mode 100644
index 000000000..3ee5e63a3
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFKernel.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "HRTFKernel.h"
+namespace WebCore {
+
+// Takes the input audio channel |impulseP| as an input impulse response and calculates the average group delay.
+// This represents the initial delay before the most energetic part of the impulse response.
+// The sample-frame delay is removed from the |impulseP| impulse response, and this value is returned.
+// The |length| of the passed in |impulseP| must be must be a power of 2.
+static float extractAverageGroupDelay(float* impulseP, size_t length)
+{
+ // Check for power-of-2.
+ MOZ_ASSERT(length && (length & (length - 1)) == 0);
+
+ FFTBlock estimationFrame(length);
+ estimationFrame.PerformFFT(impulseP);
+
+ float frameDelay = static_cast<float>(estimationFrame.ExtractAverageGroupDelay());
+ estimationFrame.GetInverse(impulseP);
+
+ return frameDelay;
+}
+
+HRTFKernel::HRTFKernel(float* impulseResponse, size_t length, float sampleRate)
+ : m_frameDelay(0)
+ , m_sampleRate(sampleRate)
+{
+ AlignedTArray<float> buffer;
+ // copy to a 32-byte aligned buffer
+ if (((uintptr_t)impulseResponse & 31) != 0) {
+ buffer.SetLength(length);
+ mozilla::PodCopy(buffer.Elements(), impulseResponse, length);
+ impulseResponse = buffer.Elements();
+ }
+
+ // Determine the leading delay (average group delay) for the response.
+ m_frameDelay = extractAverageGroupDelay(impulseResponse, length);
+
+ // The FFT size (with zero padding) needs to be twice the response length
+ // in order to do proper convolution.
+ unsigned fftSize = 2 * length;
+
+ // Quick fade-out (apply window) at truncation point
+ // because the impulse response has been truncated.
+ unsigned numberOfFadeOutFrames = static_cast<unsigned>(sampleRate / 4410); // 10 sample-frames @44.1KHz sample-rate
+ MOZ_ASSERT(numberOfFadeOutFrames < length);
+ if (numberOfFadeOutFrames < length) {
+ for (unsigned i = length - numberOfFadeOutFrames; i < length; ++i) {
+ float x = 1.0f - static_cast<float>(i - (length - numberOfFadeOutFrames)) / numberOfFadeOutFrames;
+ impulseResponse[i] *= x;
+ }
+ }
+
+ m_fftFrame = new FFTBlock(fftSize);
+ m_fftFrame->PadAndMakeScaledDFT(impulseResponse, length);
+}
+
+// Interpolates two kernels with x: 0 -> 1 and returns the result.
+nsReturnRef<HRTFKernel> HRTFKernel::createInterpolatedKernel(HRTFKernel* kernel1, HRTFKernel* kernel2, float x)
+{
+ MOZ_ASSERT(kernel1 && kernel2);
+ if (!kernel1 || !kernel2)
+ return nsReturnRef<HRTFKernel>();
+
+ MOZ_ASSERT(x >= 0.0 && x < 1.0);
+ x = mozilla::clamped(x, 0.0f, 1.0f);
+
+ float sampleRate1 = kernel1->sampleRate();
+ float sampleRate2 = kernel2->sampleRate();
+ MOZ_ASSERT(sampleRate1 == sampleRate2);
+ if (sampleRate1 != sampleRate2)
+ return nsReturnRef<HRTFKernel>();
+
+ float frameDelay = (1 - x) * kernel1->frameDelay() + x * kernel2->frameDelay();
+
+ nsAutoPtr<FFTBlock> interpolatedFrame(
+ FFTBlock::CreateInterpolatedBlock(*kernel1->fftFrame(), *kernel2->fftFrame(), x));
+ return HRTFKernel::create(interpolatedFrame, frameDelay, sampleRate1);
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/HRTFKernel.h b/dom/media/webaudio/blink/HRTFKernel.h
new file mode 100644
index 000000000..940e69b13
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFKernel.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HRTFKernel_h
+#define HRTFKernel_h
+
+#include "nsAutoPtr.h"
+#include "nsAutoRef.h"
+#include "nsTArray.h"
+#include "mozilla/FFTBlock.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+using mozilla::FFTBlock;
+
+// HRTF stands for Head-Related Transfer Function.
+// HRTFKernel is a frequency-domain representation of an impulse-response used as part of the spatialized panning system.
+// For a given azimuth / elevation angle there will be one HRTFKernel for the left ear transfer function, and one for the right ear.
+// The leading delay (average group delay) for each impulse response is extracted:
+// m_fftFrame is the frequency-domain representation of the impulse response with the delay removed
+// m_frameDelay is the leading delay of the original impulse response.
+class HRTFKernel {
+public:
+ // Note: this is destructive on the passed in |impulseResponse|.
+ // The |length| of |impulseResponse| must be a power of two.
+ // The size of the DFT will be |2 * length|.
+ static nsReturnRef<HRTFKernel> create(float* impulseResponse, size_t length, float sampleRate);
+
+ static nsReturnRef<HRTFKernel> create(nsAutoPtr<FFTBlock> fftFrame, float frameDelay, float sampleRate);
+
+ // Given two HRTFKernels, and an interpolation factor x: 0 -> 1, returns an interpolated HRTFKernel.
+ static nsReturnRef<HRTFKernel> createInterpolatedKernel(HRTFKernel* kernel1, HRTFKernel* kernel2, float x);
+
+ FFTBlock* fftFrame() { return m_fftFrame.get(); }
+
+ size_t fftSize() const { return m_fftFrame->FFTSize(); }
+ float frameDelay() const { return m_frameDelay; }
+
+ float sampleRate() const { return m_sampleRate; }
+ double nyquist() const { return 0.5 * sampleRate(); }
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+ {
+ size_t amount = aMallocSizeOf(this);
+ amount += m_fftFrame->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+ }
+
+private:
+ HRTFKernel(const HRTFKernel& other) = delete;
+ void operator=(const HRTFKernel& other) = delete;
+
+ // Note: this is destructive on the passed in |impulseResponse|.
+ HRTFKernel(float* impulseResponse, size_t fftSize, float sampleRate);
+
+ HRTFKernel(nsAutoPtr<FFTBlock> fftFrame, float frameDelay, float sampleRate)
+ : m_fftFrame(fftFrame)
+ , m_frameDelay(frameDelay)
+ , m_sampleRate(sampleRate)
+ {
+ }
+
+ nsAutoPtr<FFTBlock> m_fftFrame;
+ float m_frameDelay;
+ float m_sampleRate;
+};
+
+typedef nsTArray<nsAutoRef<HRTFKernel> > HRTFKernelList;
+
+} // namespace WebCore
+
+template <>
+class nsAutoRefTraits<WebCore::HRTFKernel> :
+ public nsPointerRefTraits<WebCore::HRTFKernel> {
+public:
+ static void Release(WebCore::HRTFKernel* ptr) { delete(ptr); }
+};
+
+namespace WebCore {
+
+inline nsReturnRef<HRTFKernel> HRTFKernel::create(float* impulseResponse, size_t length, float sampleRate)
+{
+ return nsReturnRef<HRTFKernel>(new HRTFKernel(impulseResponse, length, sampleRate));
+}
+
+inline nsReturnRef<HRTFKernel> HRTFKernel::create(nsAutoPtr<FFTBlock> fftFrame, float frameDelay, float sampleRate)
+{
+ return nsReturnRef<HRTFKernel>(new HRTFKernel(fftFrame, frameDelay, sampleRate));
+}
+
+} // namespace WebCore
+
+#endif // HRTFKernel_h
diff --git a/dom/media/webaudio/blink/HRTFPanner.cpp b/dom/media/webaudio/blink/HRTFPanner.cpp
new file mode 100644
index 000000000..c97ce4767
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFPanner.cpp
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "HRTFPanner.h"
+#include "HRTFDatabaseLoader.h"
+
+#include "FFTConvolver.h"
+#include "HRTFDatabase.h"
+#include "AudioBlock.h"
+
+using namespace std;
+using namespace mozilla;
+using dom::ChannelInterpretation;
+
+namespace WebCore {
+
+// The value of 2 milliseconds is larger than the largest delay which exists in any HRTFKernel from the default HRTFDatabase (0.0136 seconds).
+// We ASSERT the delay values used in process() with this value.
+const double MaxDelayTimeSeconds = 0.002;
+
+const int UninitializedAzimuth = -1;
+const unsigned RenderingQuantum = WEBAUDIO_BLOCK_SIZE;
+
+HRTFPanner::HRTFPanner(float sampleRate, already_AddRefed<HRTFDatabaseLoader> databaseLoader)
+ : m_databaseLoader(databaseLoader)
+ , m_sampleRate(sampleRate)
+ , m_crossfadeSelection(CrossfadeSelection1)
+ , m_azimuthIndex1(UninitializedAzimuth)
+ , m_azimuthIndex2(UninitializedAzimuth)
+ // m_elevation1 and m_elevation2 are initialized in pan()
+ , m_crossfadeX(0)
+ , m_crossfadeIncr(0)
+ , m_convolverL1(HRTFElevation::fftSizeForSampleRate(sampleRate))
+ , m_convolverR1(m_convolverL1.fftSize())
+ , m_convolverL2(m_convolverL1.fftSize())
+ , m_convolverR2(m_convolverL1.fftSize())
+ , m_delayLine(MaxDelayTimeSeconds * sampleRate, 1.0)
+{
+ MOZ_ASSERT(m_databaseLoader);
+ MOZ_COUNT_CTOR(HRTFPanner);
+}
+
+HRTFPanner::~HRTFPanner()
+{
+ MOZ_COUNT_DTOR(HRTFPanner);
+}
+
+size_t HRTFPanner::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+
+ // NB: m_databaseLoader can be shared, so it is not measured here
+ amount += m_convolverL1.sizeOfExcludingThis(aMallocSizeOf);
+ amount += m_convolverR1.sizeOfExcludingThis(aMallocSizeOf);
+ amount += m_convolverL2.sizeOfExcludingThis(aMallocSizeOf);
+ amount += m_convolverR2.sizeOfExcludingThis(aMallocSizeOf);
+ amount += m_delayLine.SizeOfExcludingThis(aMallocSizeOf);
+
+ return amount;
+}
+
+void HRTFPanner::reset()
+{
+ m_azimuthIndex1 = UninitializedAzimuth;
+ m_azimuthIndex2 = UninitializedAzimuth;
+ // m_elevation1 and m_elevation2 are initialized in pan()
+ m_crossfadeSelection = CrossfadeSelection1;
+ m_crossfadeX = 0.0f;
+ m_crossfadeIncr = 0.0f;
+ m_convolverL1.reset();
+ m_convolverR1.reset();
+ m_convolverL2.reset();
+ m_convolverR2.reset();
+ m_delayLine.Reset();
+}
+
+int HRTFPanner::calculateDesiredAzimuthIndexAndBlend(double azimuth, double& azimuthBlend)
+{
+ // Convert the azimuth angle from the range -180 -> +180 into the range 0 -> 360.
+ // The azimuth index may then be calculated from this positive value.
+ if (azimuth < 0)
+ azimuth += 360.0;
+
+ HRTFDatabase* database = m_databaseLoader->database();
+ MOZ_ASSERT(database);
+
+ int numberOfAzimuths = database->numberOfAzimuths();
+ const double angleBetweenAzimuths = 360.0 / numberOfAzimuths;
+
+ // Calculate the azimuth index and the blend (0 -> 1) for interpolation.
+ double desiredAzimuthIndexFloat = azimuth / angleBetweenAzimuths;
+ int desiredAzimuthIndex = static_cast<int>(desiredAzimuthIndexFloat);
+ azimuthBlend = desiredAzimuthIndexFloat - static_cast<double>(desiredAzimuthIndex);
+
+ // We don't immediately start using this azimuth index, but instead approach this index from the last index we rendered at.
+ // This minimizes the clicks and graininess for moving sources which occur otherwise.
+ desiredAzimuthIndex = max(0, desiredAzimuthIndex);
+ desiredAzimuthIndex = min(numberOfAzimuths - 1, desiredAzimuthIndex);
+ return desiredAzimuthIndex;
+}
+
+void HRTFPanner::pan(double desiredAzimuth, double elevation, const AudioBlock* inputBus, AudioBlock* outputBus)
+{
+#ifdef DEBUG
+ unsigned numInputChannels =
+ inputBus->IsNull() ? 0 : inputBus->ChannelCount();
+
+ MOZ_ASSERT(numInputChannels <= 2);
+ MOZ_ASSERT(inputBus->GetDuration() == WEBAUDIO_BLOCK_SIZE);
+#endif
+
+ bool isOutputGood = outputBus && outputBus->ChannelCount() == 2 && outputBus->GetDuration() == WEBAUDIO_BLOCK_SIZE;
+ MOZ_ASSERT(isOutputGood);
+
+ if (!isOutputGood) {
+ if (outputBus)
+ outputBus->SetNull(outputBus->GetDuration());
+ return;
+ }
+
+ HRTFDatabase* database = m_databaseLoader->database();
+ if (!database) { // not yet loaded
+ outputBus->SetNull(outputBus->GetDuration());
+ return;
+ }
+
+ // IRCAM HRTF azimuths values from the loaded database is reversed from the panner's notion of azimuth.
+ double azimuth = -desiredAzimuth;
+
+ bool isAzimuthGood = azimuth >= -180.0 && azimuth <= 180.0;
+ MOZ_ASSERT(isAzimuthGood);
+ if (!isAzimuthGood) {
+ outputBus->SetNull(outputBus->GetDuration());
+ return;
+ }
+
+ // Normally, we'll just be dealing with mono sources.
+ // If we have a stereo input, implement stereo panning with left source processed by left HRTF, and right source by right HRTF.
+
+ // Get destination pointers.
+ float* destinationL =
+ static_cast<float*>(const_cast<void*>(outputBus->mChannelData[0]));
+ float* destinationR =
+ static_cast<float*>(const_cast<void*>(outputBus->mChannelData[1]));
+
+ double azimuthBlend;
+ int desiredAzimuthIndex = calculateDesiredAzimuthIndexAndBlend(azimuth, azimuthBlend);
+
+ // Initially snap azimuth and elevation values to first values encountered.
+ if (m_azimuthIndex1 == UninitializedAzimuth) {
+ m_azimuthIndex1 = desiredAzimuthIndex;
+ m_elevation1 = elevation;
+ }
+ if (m_azimuthIndex2 == UninitializedAzimuth) {
+ m_azimuthIndex2 = desiredAzimuthIndex;
+ m_elevation2 = elevation;
+ }
+
+ // Cross-fade / transition over a period of around 45 milliseconds.
+ // This is an empirical value tuned to be a reasonable trade-off between
+ // smoothness and speed.
+ const double fadeFrames = sampleRate() <= 48000 ? 2048 : 4096;
+
+ // Check for azimuth and elevation changes, initiating a cross-fade if needed.
+ if (!m_crossfadeX && m_crossfadeSelection == CrossfadeSelection1) {
+ if (desiredAzimuthIndex != m_azimuthIndex1 || elevation != m_elevation1) {
+ // Cross-fade from 1 -> 2
+ m_crossfadeIncr = 1 / fadeFrames;
+ m_azimuthIndex2 = desiredAzimuthIndex;
+ m_elevation2 = elevation;
+ }
+ }
+ if (m_crossfadeX == 1 && m_crossfadeSelection == CrossfadeSelection2) {
+ if (desiredAzimuthIndex != m_azimuthIndex2 || elevation != m_elevation2) {
+ // Cross-fade from 2 -> 1
+ m_crossfadeIncr = -1 / fadeFrames;
+ m_azimuthIndex1 = desiredAzimuthIndex;
+ m_elevation1 = elevation;
+ }
+ }
+
+ // Get the HRTFKernels and interpolated delays.
+ HRTFKernel* kernelL1;
+ HRTFKernel* kernelR1;
+ HRTFKernel* kernelL2;
+ HRTFKernel* kernelR2;
+ double frameDelayL1;
+ double frameDelayR1;
+ double frameDelayL2;
+ double frameDelayR2;
+ database->getKernelsFromAzimuthElevation(azimuthBlend, m_azimuthIndex1, m_elevation1, kernelL1, kernelR1, frameDelayL1, frameDelayR1);
+ database->getKernelsFromAzimuthElevation(azimuthBlend, m_azimuthIndex2, m_elevation2, kernelL2, kernelR2, frameDelayL2, frameDelayR2);
+
+ bool areKernelsGood = kernelL1 && kernelR1 && kernelL2 && kernelR2;
+ MOZ_ASSERT(areKernelsGood);
+ if (!areKernelsGood) {
+ outputBus->SetNull(outputBus->GetDuration());
+ return;
+ }
+
+ MOZ_ASSERT(frameDelayL1 / sampleRate() < MaxDelayTimeSeconds && frameDelayR1 / sampleRate() < MaxDelayTimeSeconds);
+ MOZ_ASSERT(frameDelayL2 / sampleRate() < MaxDelayTimeSeconds && frameDelayR2 / sampleRate() < MaxDelayTimeSeconds);
+
+ // Crossfade inter-aural delays based on transitions.
+ double frameDelaysL[WEBAUDIO_BLOCK_SIZE];
+ double frameDelaysR[WEBAUDIO_BLOCK_SIZE];
+ {
+ float x = m_crossfadeX;
+ float incr = m_crossfadeIncr;
+ for (unsigned i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ frameDelaysL[i] = (1 - x) * frameDelayL1 + x * frameDelayL2;
+ frameDelaysR[i] = (1 - x) * frameDelayR1 + x * frameDelayR2;
+ x += incr;
+ }
+ }
+
+ // First run through delay lines for inter-aural time difference.
+ m_delayLine.Write(*inputBus);
+ // "Speakers" means a mono input is read into both outputs (with possibly
+ // different delays).
+ m_delayLine.ReadChannel(frameDelaysL, outputBus, 0,
+ ChannelInterpretation::Speakers);
+ m_delayLine.ReadChannel(frameDelaysR, outputBus, 1,
+ ChannelInterpretation::Speakers);
+ m_delayLine.NextBlock();
+
+ bool needsCrossfading = m_crossfadeIncr;
+
+ const float* convolutionDestinationL1;
+ const float* convolutionDestinationR1;
+ const float* convolutionDestinationL2;
+ const float* convolutionDestinationR2;
+
+ // Now do the convolutions.
+ // Note that we avoid doing convolutions on both sets of convolvers if we're not currently cross-fading.
+
+ if (m_crossfadeSelection == CrossfadeSelection1 || needsCrossfading) {
+ convolutionDestinationL1 =
+ m_convolverL1.process(kernelL1->fftFrame(), destinationL);
+ convolutionDestinationR1 =
+ m_convolverR1.process(kernelR1->fftFrame(), destinationR);
+ }
+
+ if (m_crossfadeSelection == CrossfadeSelection2 || needsCrossfading) {
+ convolutionDestinationL2 =
+ m_convolverL2.process(kernelL2->fftFrame(), destinationL);
+ convolutionDestinationR2 =
+ m_convolverR2.process(kernelR2->fftFrame(), destinationR);
+ }
+
+ if (needsCrossfading) {
+ // Apply linear cross-fade.
+ float x = m_crossfadeX;
+ float incr = m_crossfadeIncr;
+ for (unsigned i = 0; i < WEBAUDIO_BLOCK_SIZE; ++i) {
+ destinationL[i] = (1 - x) * convolutionDestinationL1[i] + x * convolutionDestinationL2[i];
+ destinationR[i] = (1 - x) * convolutionDestinationR1[i] + x * convolutionDestinationR2[i];
+ x += incr;
+ }
+ // Update cross-fade value from local.
+ m_crossfadeX = x;
+
+ if (m_crossfadeIncr > 0 && fabs(m_crossfadeX - 1) < m_crossfadeIncr) {
+ // We've fully made the crossfade transition from 1 -> 2.
+ m_crossfadeSelection = CrossfadeSelection2;
+ m_crossfadeX = 1;
+ m_crossfadeIncr = 0;
+ } else if (m_crossfadeIncr < 0 && fabs(m_crossfadeX) < -m_crossfadeIncr) {
+ // We've fully made the crossfade transition from 2 -> 1.
+ m_crossfadeSelection = CrossfadeSelection1;
+ m_crossfadeX = 0;
+ m_crossfadeIncr = 0;
+ }
+ } else {
+ const float* sourceL;
+ const float* sourceR;
+ if (m_crossfadeSelection == CrossfadeSelection1) {
+ sourceL = convolutionDestinationL1;
+ sourceR = convolutionDestinationR1;
+ } else {
+ sourceL = convolutionDestinationL2;
+ sourceR = convolutionDestinationR2;
+ }
+ PodCopy(destinationL, sourceL, WEBAUDIO_BLOCK_SIZE);
+ PodCopy(destinationR, sourceR, WEBAUDIO_BLOCK_SIZE);
+ }
+}
+
+int HRTFPanner::maxTailFrames() const
+{
+ // Although the ideal tail time would be the length of the impulse
+ // response, there is additional tail time from the approximations in the
+ // implementation. Because HRTFPanner is implemented with a DelayKernel
+ // and a FFTConvolver, the tailTime of the HRTFPanner is the sum of the
+ // tailTime of the DelayKernel and the tailTime of the FFTConvolver. The
+ // FFTs of the convolver are fftSize(), half of which is latency, but this
+ // is aligned with blocks and so is reduced by the one block which is
+ // processed immediately.
+ return m_delayLine.MaxDelayTicks() +
+ m_convolverL1.fftSize()/2 + m_convolverL1.latencyFrames();
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/HRTFPanner.h b/dom/media/webaudio/blink/HRTFPanner.h
new file mode 100644
index 000000000..f56d0d423
--- /dev/null
+++ b/dom/media/webaudio/blink/HRTFPanner.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2010, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HRTFPanner_h
+#define HRTFPanner_h
+
+#include "FFTConvolver.h"
+#include "DelayBuffer.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace mozilla {
+class AudioBlock;
+} // namespace mozilla
+
+namespace WebCore {
+
+typedef nsTArray<float> AudioFloatArray;
+
+class HRTFDatabaseLoader;
+
+using mozilla::AudioBlock;
+
+class HRTFPanner {
+public:
+ HRTFPanner(float sampleRate, already_AddRefed<HRTFDatabaseLoader> databaseLoader);
+ ~HRTFPanner();
+
+ // chunk durations must be 128
+ void pan(double azimuth, double elevation, const AudioBlock* inputBus, AudioBlock* outputBus);
+ void reset();
+
+ size_t fftSize() const { return m_convolverL1.fftSize(); }
+
+ float sampleRate() const { return m_sampleRate; }
+
+ int maxTailFrames() const;
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ // Given an azimuth angle in the range -180 -> +180, returns the corresponding azimuth index for the database,
+ // and azimuthBlend which is an interpolation value from 0 -> 1.
+ int calculateDesiredAzimuthIndexAndBlend(double azimuth, double& azimuthBlend);
+
+ RefPtr<HRTFDatabaseLoader> m_databaseLoader;
+
+ float m_sampleRate;
+
+ // We maintain two sets of convolvers for smooth cross-faded interpolations when
+ // then azimuth and elevation are dynamically changing.
+ // When the azimuth and elevation are not changing, we simply process with one of the two sets.
+ // Initially we use CrossfadeSelection1 corresponding to m_convolverL1 and m_convolverR1.
+ // Whenever the azimuth or elevation changes, a crossfade is initiated to transition
+ // to the new position. So if we're currently processing with CrossfadeSelection1, then
+ // we transition to CrossfadeSelection2 (and vice versa).
+ // If we're in the middle of a transition, then we wait until it is complete before
+ // initiating a new transition.
+
+ // Selects either the convolver set (m_convolverL1, m_convolverR1) or (m_convolverL2, m_convolverR2).
+ enum CrossfadeSelection {
+ CrossfadeSelection1,
+ CrossfadeSelection2
+ };
+
+ CrossfadeSelection m_crossfadeSelection;
+
+ // azimuth/elevation for CrossfadeSelection1.
+ int m_azimuthIndex1;
+ double m_elevation1;
+
+ // azimuth/elevation for CrossfadeSelection2.
+ int m_azimuthIndex2;
+ double m_elevation2;
+
+ // A crossfade value 0 <= m_crossfadeX <= 1.
+ float m_crossfadeX;
+
+ // Per-sample-frame crossfade value increment.
+ float m_crossfadeIncr;
+
+ FFTConvolver m_convolverL1;
+ FFTConvolver m_convolverR1;
+ FFTConvolver m_convolverL2;
+ FFTConvolver m_convolverR2;
+
+ mozilla::DelayBuffer m_delayLine;
+
+ AudioFloatArray m_tempL1;
+ AudioFloatArray m_tempR1;
+ AudioFloatArray m_tempL2;
+ AudioFloatArray m_tempR2;
+};
+
+} // namespace WebCore
+
+#endif // HRTFPanner_h
diff --git a/dom/media/webaudio/blink/IIRFilter.cpp b/dom/media/webaudio/blink/IIRFilter.cpp
new file mode 100644
index 000000000..94ec129c7
--- /dev/null
+++ b/dom/media/webaudio/blink/IIRFilter.cpp
@@ -0,0 +1,166 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "IIRFilter.h"
+
+#include <complex>
+
+namespace blink {
+
+// The length of the memory buffers for the IIR filter. This MUST be a power of two and must be
+// greater than the possible length of the filter coefficients.
+const int kBufferLength = 32;
+static_assert(kBufferLength >= IIRFilter::kMaxOrder + 1,
+ "Internal IIR buffer length must be greater than maximum IIR Filter order.");
+
+IIRFilter::IIRFilter(const AudioDoubleArray* feedforwardCoef, const AudioDoubleArray* feedbackCoef)
+ : m_bufferIndex(0)
+ , m_feedback(feedbackCoef)
+ , m_feedforward(feedforwardCoef)
+{
+ m_xBuffer.SetLength(kBufferLength);
+ m_yBuffer.SetLength(kBufferLength);
+ reset();
+}
+
+IIRFilter::~IIRFilter()
+{
+}
+
+void IIRFilter::reset()
+{
+ memset(m_xBuffer.Elements(), 0, m_xBuffer.Length() * sizeof(double));
+ memset(m_yBuffer.Elements(), 0, m_yBuffer.Length() * sizeof(double));
+}
+
+static std::complex<double> evaluatePolynomial(const double* coef, std::complex<double> z, int order)
+{
+ // Use Horner's method to evaluate the polynomial P(z) = sum(coef[k]*z^k, k, 0, order);
+ std::complex<double> result = 0;
+
+ for (int k = order; k >= 0; --k)
+ result = result * z + std::complex<double>(coef[k]);
+
+ return result;
+}
+
+void IIRFilter::process(const float* sourceP, float* destP, size_t framesToProcess)
+{
+ // Compute
+ //
+ // y[n] = sum(b[k] * x[n - k], k = 0, M) - sum(a[k] * y[n - k], k = 1, N)
+ //
+ // where b[k] are the feedforward coefficients and a[k] are the feedback coefficients of the
+ // filter.
+
+ // This is a Direct Form I implementation of an IIR Filter. Should we consider doing a
+ // different implementation such as Transposed Direct Form II?
+ const double* feedback = m_feedback->Elements();
+ const double* feedforward = m_feedforward->Elements();
+
+ MOZ_ASSERT(feedback);
+ MOZ_ASSERT(feedforward);
+
+ // Sanity check to see if the feedback coefficients have been scaled appropriately. It must
+ // be EXACTLY 1!
+ MOZ_ASSERT(feedback[0] == 1);
+
+ int feedbackLength = m_feedback->Length();
+ int feedforwardLength = m_feedforward->Length();
+ int minLength = std::min(feedbackLength, feedforwardLength);
+
+ double* xBuffer = m_xBuffer.Elements();
+ double* yBuffer = m_yBuffer.Elements();
+
+ for (size_t n = 0; n < framesToProcess; ++n) {
+ // To help minimize roundoff, we compute using double's, even though the filter coefficients
+ // only have single precision values.
+ double yn = feedforward[0] * sourceP[n];
+
+ // Run both the feedforward and feedback terms together, when possible.
+ for (int k = 1; k < minLength; ++k) {
+ int n = (m_bufferIndex - k) & (kBufferLength - 1);
+ yn += feedforward[k] * xBuffer[n];
+ yn -= feedback[k] * yBuffer[n];
+ }
+
+ // Handle any remaining feedforward or feedback terms.
+ for (int k = minLength; k < feedforwardLength; ++k)
+ yn += feedforward[k] * xBuffer[(m_bufferIndex - k) & (kBufferLength - 1)];
+
+ for (int k = minLength; k < feedbackLength; ++k)
+ yn -= feedback[k] * yBuffer[(m_bufferIndex - k) & (kBufferLength - 1)];
+
+ // Save the current input and output values in the memory buffers for the next output.
+ m_xBuffer[m_bufferIndex] = sourceP[n];
+ m_yBuffer[m_bufferIndex] = yn;
+
+ m_bufferIndex = (m_bufferIndex + 1) & (kBufferLength - 1);
+
+ // Avoid introducing a stream of subnormals
+ // TODO: Remove this code when Bug 1157635 is fixed.
+ if (fabs(yn) >= FLT_MIN) {
+ destP[n] = yn;
+ } else {
+ destP[n] = 0.0;
+ }
+ }
+}
+
+void IIRFilter::getFrequencyResponse(int nFrequencies, const float* frequency, float* magResponse, float* phaseResponse)
+{
+ // Evaluate the z-transform of the filter at the given normalized frequencies from 0 to 1. (One
+ // corresponds to the Nyquist frequency.)
+ //
+ // The z-tranform of the filter is
+ //
+ // H(z) = sum(b[k]*z^(-k), k, 0, M) / sum(a[k]*z^(-k), k, 0, N);
+ //
+ // The desired frequency response is H(exp(j*omega)), where omega is in [0, 1).
+ //
+ // Let P(x) = sum(c[k]*x^k, k, 0, P) be a polynomial of order P. Then each of the sums in H(z)
+ // is equivalent to evaluating a polynomial at the point 1/z.
+
+ for (int k = 0; k < nFrequencies; ++k) {
+ // zRecip = 1/z = exp(-j*frequency)
+ double omega = -M_PI * frequency[k];
+ std::complex<double> zRecip = std::complex<double>(cos(omega), sin(omega));
+
+ std::complex<double> numerator = evaluatePolynomial(m_feedforward->Elements(), zRecip, m_feedforward->Length() - 1);
+ std::complex<double> denominator = evaluatePolynomial(m_feedback->Elements(), zRecip, m_feedback->Length() - 1);
+ // Strangely enough, using complex division:
+ // e.g. Complex response = numerator / denominator;
+ // fails on our test machines, yielding infinities and NaNs, so we do
+ // things the long way here.
+ double n = norm(denominator);
+ double r = (real(numerator)*real(denominator) + imag(numerator)*imag(denominator)) / n;
+ double i = (imag(numerator)*real(denominator) - real(numerator)*imag(denominator)) / n;
+ std::complex<double> response = std::complex<double>(r, i);
+
+ magResponse[k] = static_cast<float>(abs(response));
+ phaseResponse[k] = static_cast<float>(atan2(imag(response), real(response)));
+ }
+}
+
+bool IIRFilter::buffersAreZero()
+{
+ double* xBuffer = m_xBuffer.Elements();
+ double* yBuffer = m_yBuffer.Elements();
+
+ for (size_t k = 0; k < m_feedforward->Length(); ++k) {
+ if (xBuffer[(m_bufferIndex - k) & (kBufferLength - 1)] != 0.0) {
+ return false;
+ }
+ }
+
+ for (size_t k = 0; k < m_feedback->Length(); ++k) {
+ if (fabs(yBuffer[(m_bufferIndex - k) & (kBufferLength - 1)]) >= FLT_MIN) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+} // namespace blink
diff --git a/dom/media/webaudio/blink/IIRFilter.h b/dom/media/webaudio/blink/IIRFilter.h
new file mode 100644
index 000000000..5656d959a
--- /dev/null
+++ b/dom/media/webaudio/blink/IIRFilter.h
@@ -0,0 +1,58 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IIRFilter_h
+#define IIRFilter_h
+
+typedef nsTArray<double> AudioDoubleArray;
+
+namespace blink {
+
+class IIRFilter final {
+public:
+ // The maximum IIR filter order. This also limits the number of feedforward coefficients. The
+ // maximum number of coefficients is 20 according to the spec.
+ const static size_t kMaxOrder = 19;
+ IIRFilter(const AudioDoubleArray* feedforwardCoef, const AudioDoubleArray* feedbackCoef);
+ ~IIRFilter();
+
+ void process(const float* sourceP, float* destP, size_t framesToProcess);
+
+ void reset();
+
+ void getFrequencyResponse(int nFrequencies,
+ const float* frequency,
+ float* magResponse,
+ float* phaseResponse);
+
+ bool buffersAreZero();
+
+private:
+ // Filter memory
+ //
+ // For simplicity, we assume |m_xBuffer| and |m_yBuffer| have the same length, and the length is
+ // a power of two. Since the number of coefficients has a fixed upper length, the size of
+ // xBuffer and yBuffer is fixed. |m_xBuffer| holds the old input values and |m_yBuffer| holds
+ // the old output values needed to compute the new output value.
+ //
+ // m_yBuffer[m_bufferIndex] holds the most recent output value, say, y[n]. Then
+ // m_yBuffer[m_bufferIndex - k] is y[n - k]. Similarly for m_xBuffer.
+ //
+ // To minimize roundoff, these arrays are double's instead of floats.
+ AudioDoubleArray m_xBuffer;
+ AudioDoubleArray m_yBuffer;
+
+ // Index into the xBuffer and yBuffer arrays where the most current x and y values should be
+ // stored. xBuffer[bufferIndex] corresponds to x[n], the current x input value and
+ // yBuffer[bufferIndex] is where y[n], the current output value.
+ int m_bufferIndex;
+
+ // Coefficients of the IIR filter.
+ const AudioDoubleArray* m_feedback;
+ const AudioDoubleArray* m_feedforward;
+};
+
+} // namespace blink
+
+#endif // IIRFilter_h
diff --git a/dom/media/webaudio/blink/IRC_Composite_C_R0195-incl.cpp b/dom/media/webaudio/blink/IRC_Composite_C_R0195-incl.cpp
new file mode 100644
index 000000000..daffb114f
--- /dev/null
+++ b/dom/media/webaudio/blink/IRC_Composite_C_R0195-incl.cpp
@@ -0,0 +1,449 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * The sample data in the arrays here was derived for Webkit by Chris Rogers
+ * through averaging of impulse responses from the IRCAM Listen HRTF Database.
+ * The responses here are half the length of the Listen responses. This
+ * sample data has been granted to the Public Domain.
+ *
+ * This file is intended to be included in compilation of a single
+ * implementation file.
+ *
+ * Each elevation (p) contains impulse responses at a varying number of
+ * equally spaced azimuths for the left ear, ordered clockwise from in front
+ * the listener.
+ */
+
+#include "mozilla/ArrayUtils.h"
+
+using mozilla::ArrayLength;
+
+const int16_t irc_composite_c_r0195_p315[][256] =
+ {/* IRC_Composite_C_R0195_T000_P315.wav */
+ {-37,37,-38,39,-39,40,-41,42,-42,43,-43,44,-44,44,-44,44,-43,42,-39,36,-31,23,-10,-10,5,-655,-410,-552,-353,-474,-1525,-758,656,-263,70,1414,-1528,-731,-1811,1646,1312,-1501,-407,8893,-1543,7696,8084,2629,-2452,-234,3799,1676,177,-1077,-474,-1325,3527,985,265,-884,373,971,1024,-412,507,-173,259,-799,635,-628,507,-344,394,-359,178,-276,349,-201,137,-249,377,-311,263,-404,284,-244,173,-243,330,-320,112,-150,164,-142,174,-300,158,-197,13,-141,85,-190,64,-122,41,-122,60,-195,125,-163,10,-67,-6,-122,77,-133,26,-71,-42,-156,48,-152,-12,-89,-120,-104,-37,-154,-57,-139,-80,-165,-95,-242,-81,-146,-111,-178,-109,-208,-48,-178,-131,-163,-68,-169,-94,-190,-139,-190,-118,-204,-160,-220,-140,-204,-171,-238,-126,-203,-114,-209,-138,-177,-124,-184,-130,-175,-170,-185,-180,-231,-189,-233,-210,-236,-245,-288,-208,-329,-246,-274,-199,-273,-189,-267,-208,-215,-199,-187,-209,-206,-210,-123,-197,-156,-173,-142,-97,-123,-97,-107,-73,-84,-39,-50,-66,-11,-50,-12,-51,8,-27,19,-48,-9,-18,5,-42,-15,-35,-31,-27,-27,-64,-33,-54,-1,-98,-47,-56,-7,-76,-47,-70,-42,-54,-65,-76,-43,-57,-9,-61,-39,-58,33,-39,3,-34,20,-19,4,-71,61,-22,10},
+ /* IRC_Composite_C_R0195_T015_P315.wav */
+ {81,-82,83,-84,84,-85,86,-87,87,-87,87,-87,87,-86,84,-82,78,-72,63,-49,23,33,-344,-481,-563,-443,-265,-1527,-713,251,-1453,939,2510,-1221,-1282,-1307,806,585,-990,-82,9029,-4621,9096,11230,4611,-3051,400,2105,749,1644,165,-1556,-1521,3009,1430,723,-902,933,187,28,480,951,-214,122,-730,-95,-137,573,-593,558,-692,-62,28,16,-505,426,-283,227,-320,210,-374,303,-435,127,-128,76,-349,106,-364,139,-348,184,-425,-36,-441,91,-413,93,-444,33,-257,-74,-414,93,-379,19,-327,-43,-366,79,-293,20,-199,-76,-207,149,-239,68,-247,66,-219,61,-232,38,-212,36,-209,-27,-209,-58,-227,-6,-309,-12,-225,-60,-199,-10,-277,19,-207,-69,-211,-30,-261,-24,-233,-102,-217,-131,-247,-144,-229,-111,-256,-104,-254,-130,-241,-66,-249,-88,-223,-144,-199,-148,-229,-101,-242,-189,-240,-163,-308,-147,-285,-217,-239,-224,-291,-173,-269,-220,-209,-208,-240,-180,-212,-201,-217,-169,-184,-174,-178,-146,-209,-108,-186,-96,-108,-90,-120,-44,-101,-49,-39,-22,-44,1,-58,3,-19,-21,-8,-6,-22,-9,18,-15,-7,-23,-12,-24,-11,-43,-33,-33,-31,-57,-5,-64,-22,-45,-16,-87,-8,-40,-45,-57,-14,-53,-5,-47,-21,-45,-8,-33,13,-16,3,-29,6,-18,23,-31,24,-41},
+ /* IRC_Composite_C_R0195_T030_P315.wav */
+ {9,-9,8,-8,8,-8,8,-7,7,-6,5,-4,3,-2,0,2,-5,9,-14,23,-127,-380,-922,-742,-548,257,-2362,972,-1653,1079,1193,1855,-423,-3573,-1945,3974,274,-2796,11656,-988,5085,9362,10293,-750,-3105,-1864,2111,2283,-318,-221,-1158,-110,2923,410,-981,900,122,-303,833,532,-152,20,-462,17,-48,336,235,63,-647,577,-362,-19,-259,102,168,-103,-338,-333,24,-9,-458,287,-470,-273,-216,46,-484,13,-220,-143,-392,-290,-340,-198,-301,-237,-241,-176,-489,-201,-271,-252,-335,-60,-395,-225,-412,-191,-198,-164,-259,-64,-380,-75,-287,-9,-159,-126,-100,-116,-155,-96,-113,-23,-100,-117,-115,-164,-180,8,-173,-57,-208,-89,-129,-73,-188,-102,-184,-93,-204,-81,-217,-128,-180,-66,-279,-127,-244,-206,-146,-178,-190,-135,-228,-154,-205,-100,-196,-143,-185,-140,-235,-135,-209,-144,-158,-250,-202,-234,-227,-157,-214,-201,-260,-180,-244,-184,-234,-151,-192,-198,-223,-199,-199,-202,-189,-164,-233,-143,-220,-175,-186,-107,-156,-84,-181,-106,-116,-72,-63,-29,-76,-11,-83,15,-65,30,-2,-4,-41,4,-49,38,-44,57,-2,9,-61,11,-29,35,-27,2,-50,-23,-17,1,-57,2,-26,-14,-67,-39,-9,-30,-30,-21,-44,-39,-75,-12,-27,-13,-32,13,-22,-16,5,-2,23,-25,48,-24,-32,-30},
+ /* IRC_Composite_C_R0195_T045_P315.wav */
+ {52,-54,57,-59,62,-64,67,-71,74,-78,82,-86,91,-95,100,-104,107,-105,80,-502,-332,-993,-162,-1907,1505,-2021,-314,756,-842,5057,-1148,-2263,-3462,3639,-1435,4503,-272,9367,494,8006,14353,933,-5033,-2453,2315,1073,2918,-1236,-3010,2416,371,1956,-531,-1294,-177,691,1104,-312,402,-1300,693,-586,315,-26,538,-594,294,-267,-119,-580,378,28,261,-1010,385,-342,8,-224,217,-399,43,-603,-1,-295,-252,167,-340,-419,-328,-348,-86,-497,-57,-294,-381,-499,-201,-454,-232,-518,-17,-717,-310,-542,-84,-458,-96,-313,-154,-496,-112,-226,-165,-242,-163,-234,-306,-270,-70,-238,-108,-139,-101,-251,-218,-175,-17,-215,-23,-205,-109,-221,-12,-131,-27,-205,-45,-264,-158,-151,-4,-169,-113,-251,-102,-247,-100,-151,-158,-212,-170,-190,-217,-220,-105,-182,-191,-216,-210,-208,-188,-144,-93,-288,-132,-248,-124,-281,-112,-217,-92,-321,-80,-343,-94,-222,-100,-231,-229,-216,-139,-209,-164,-138,-158,-204,-180,-171,-145,-125,-68,-150,-139,-133,-97,-43,-133,-83,-49,-109,-53,-101,-20,-84,23,-64,-10,-116,38,-50,15,-23,-2,-3,-27,-28,3,14,36,-13,-21,-18,-38,28,-26,9,-12,-28,-46,-29,-8,8,18,-21,-12,-47,16,-23,-21,-22,-28,-21,-46,-32,37,-14,-1,-31,11,-4,-17,51,-42,23,-30,55},
+ /* IRC_Composite_C_R0195_T060_P315.wav */
+ {-9,10,-10,10,-11,11,-11,12,-12,13,-13,14,-14,14,-15,15,-14,14,-237,-853,-211,-839,-537,-1171,1035,-1099,1039,294,-1596,6549,-2739,-2660,-4050,4749,2134,7195,4024,6882,-1377,13010,8996,-6905,-3319,-3088,4606,2892,2461,-4423,-1310,1787,1273,1672,-1868,-79,1190,70,-141,-131,222,-677,570,-820,675,-811,128,-382,165,-353,-183,-560,68,-440,-382,-163,-67,-467,-152,-570,177,-472,-46,-374,-58,-324,-179,-380,-114,-308,-223,-231,-266,-228,-188,-382,-93,-468,-172,-439,-277,-467,-233,-484,-158,-431,-177,-375,-153,-360,-208,-377,-90,-359,-252,-321,-261,-288,-236,-352,-117,-397,-126,-318,-103,-229,-203,-302,-132,-152,-113,-159,-188,-103,-160,-141,-121,-237,-158,-186,-215,-126,-180,-203,-129,-258,-131,-232,-90,-192,-139,-222,-58,-238,-81,-214,-111,-210,-119,-232,-97,-257,-79,-254,-124,-244,-169,-224,-170,-218,-187,-194,-208,-142,-212,-136,-216,-224,-142,-210,-181,-238,-144,-243,-81,-233,-107,-193,-82,-124,-113,-114,-86,-61,-72,-88,-74,-42,-62,-68,-57,-28,-20,-32,-42,-4,-55,-25,11,-34,-17,-21,12,-38,-17,-4,-21,-19,-51,-19,-40,-1,-58,-23,-65,-46,-5,-23,-26,-24,-22,36,-42,4,-20,73,-50,19,-61,15,-46,1,-36,-37,-6,-9,13,-34,18,-10,58,-13,38,32,29,4,16,-6},
+ /* IRC_Composite_C_R0195_T075_P315.wav */
+ {-13,13,-14,14,-14,14,-14,14,-14,13,-13,11,-9,5,2,-16,50,-741,214,-932,242,-1432,-236,-662,1347,-571,-1196,4105,-1805,3633,-3512,-1059,-3340,6144,8904,2949,-3056,13761,4639,6581,1016,-7994,-537,2069,9498,-3772,-2314,-3272,3945,434,437,-1200,-83,923,138,258,258,-7,455,-141,284,-478,398,-1090,528,-789,-29,-665,-287,-554,-73,-808,-317,-229,-409,-754,-201,-562,103,-767,-233,-393,90,-725,-54,-341,-112,-375,-320,-304,-39,-501,-232,-150,-220,-432,-164,-401,-81,-462,-293,-278,-139,-468,-172,-335,-180,-318,-233,-226,-103,-361,-214,-194,-168,-399,-129,-254,-92,-285,-156,-134,-28,-353,-136,-218,-68,-245,-164,-257,-128,-294,-188,-259,-264,-283,-216,-266,-192,-249,-243,-221,-193,-297,-159,-234,-247,-176,-224,-169,-180,-199,-220,-117,-192,-112,-197,-146,-176,-92,-190,-108,-218,-108,-210,-116,-237,-105,-215,-104,-222,-112,-224,-93,-273,-105,-266,-128,-293,-88,-283,-37,-279,-49,-211,-28,-227,20,-197,2,-189,32,-205,58,-176,59,-144,57,-167,132,-119,93,-104,104,-78,87,-109,101,-75,67,-98,89,-87,61,-85,56,-78,56,-103,66,-107,43,-101,53,-122,26,-89,31,-77,5,-71,25,-79,9,-93,21,-74,23,-83,51,-92,20,-72,56,-59,56,-36,38,19,39,4,62,-17,56,-23,68},
+ /* IRC_Composite_C_R0195_T090_P315.wav */
+ {87,-92,97,-103,109,-116,123,-131,140,-150,162,-174,189,-205,224,-244,266,-286,51,-859,535,-1364,139,-1195,1589,-390,911,-1048,4305,473,-5108,558,766,2725,10227,-95,2100,7357,10939,4034,-9033,1273,-876,7923,448,-413,-5710,1509,967,2067,-1395,-1318,853,624,-242,51,284,401,299,341,-114,602,-538,101,-460,-168,-515,-276,-591,-395,-537,-566,-206,-633,-470,-595,-421,-387,-497,-528,-554,-277,-415,-451,-399,-376,-198,-441,-287,-406,-190,-420,-196,-316,-218,-371,-230,-316,-251,-337,-304,-180,-217,-314,-203,-175,-197,-285,-220,-238,-109,-305,-167,-234,-146,-316,-92,-192,-70,-236,-136,-80,-80,-227,-175,-115,-77,-157,-162,-216,-61,-249,-168,-273,-182,-316,-207,-288,-178,-282,-287,-286,-206,-333,-257,-356,-226,-357,-253,-372,-144,-341,-201,-306,-120,-225,-145,-256,-69,-151,-103,-191,-78,-159,-72,-231,-86,-209,-102,-254,-75,-225,-131,-246,-122,-189,-129,-238,-123,-178,-85,-185,-80,-172,-78,-165,-42,-131,-62,-158,-35,-137,-15,-123,-23,-84,14,-68,23,-29,8,12,-7,21,17,-7,6,-12,18,-60,33,-67,51,-69,41,-34,41,-45,33,-37,31,-56,11,-29,-2,-76,4,-43,17,-73,-1,-63,19,-62,-23,-71,-23,-50,-30,-62,24,-59,23,-75,63,-53,35,-32,38,-9,16,4,53,-2,34,-15},
+ /* IRC_Composite_C_R0195_T105_P315.wav */
+ {-4,4,-4,4,-4,4,-4,4,-5,5,-5,6,-7,9,-11,17,-28,67,21,-444,-141,-224,-503,-492,56,581,659,-254,970,3243,-1085,-4435,2584,328,6386,5564,-809,5990,6762,10583,-5626,-2592,332,5216,4379,-2326,-2369,-2841,2364,794,414,-2336,841,434,185,-245,467,54,226,66,291,109,-14,-250,-37,-434,-55,-468,-301,-501,-528,-390,-260,-361,-561,-460,-370,-387,-354,-670,-414,-508,-325,-671,-240,-470,-287,-539,-267,-403,-309,-523,-407,-423,-444,-437,-347,-265,-394,-345,-296,-231,-221,-203,-113,-208,-173,-209,-71,-127,-120,-168,-119,-150,-164,-160,-171,-155,-129,-132,-133,-114,-84,-152,-145,-150,-50,-140,-100,-199,-121,-188,-145,-209,-221,-240,-266,-216,-273,-254,-311,-241,-309,-303,-306,-288,-304,-324,-325,-280,-286,-254,-285,-213,-282,-199,-235,-168,-198,-151,-152,-157,-138,-157,-155,-189,-176,-212,-179,-192,-145,-184,-171,-174,-110,-150,-113,-170,-84,-115,-76,-135,-71,-161,-62,-153,-49,-144,-73,-126,-80,-100,-82,-63,-82,-57,-74,14,-40,-10,-30,25,-21,31,-22,45,-26,43,-15,48,-18,20,-19,34,-32,26,-30,33,-39,33,-38,25,-62,21,-45,-12,-65,-6,-49,-13,-61,8,-71,9,-80,15,-87,37,-62,49,-58,33,-30,20,-31,-30,-19,-18,-22,12,-19,18,-18,62,-6,19},
+ /* IRC_Composite_C_R0195_T120_P315.wav */
+ {-8,8,-9,10,-10,11,-12,13,-14,15,-17,18,-20,22,-24,27,-30,33,-36,-6,-353,-241,59,-307,-656,81,435,931,-462,1098,2228,1185,-5297,2389,1039,4366,5054,563,5052,5065,10308,-3912,-1912,-658,6384,3010,-2420,-2503,-2288,1665,1300,-465,-1526,865,689,-244,192,664,-256,-73,265,-57,-312,-7,-322,-127,-354,-230,-494,-275,-378,-331,-253,-267,-433,-173,-259,-320,-294,-344,-567,-293,-505,-543,-515,-293,-398,-306,-402,-421,-360,-360,-466,-547,-514,-519,-327,-326,-417,-471,-219,-314,-177,-232,-161,-243,-135,-249,-154,-136,-89,-210,-64,-203,-123,-169,-90,-247,-100,-141,-68,-108,-41,-101,-97,-95,-145,-67,-56,-122,-193,-178,-180,-188,-181,-281,-271,-252,-234,-263,-302,-242,-343,-214,-391,-204,-407,-189,-457,-208,-383,-206,-352,-186,-336,-183,-268,-158,-243,-145,-229,-99,-205,-110,-223,-83,-256,-120,-241,-124,-258,-103,-238,-73,-205,-48,-194,-12,-168,-14,-161,-15,-200,-2,-184,-29,-168,-39,-203,-35,-143,-59,-138,-57,-120,-39,-78,-38,-71,4,-85,25,-41,42,-65,60,-35,71,-28,56,-41,66,-43,40,-26,-6,-23,-11,-1,-28,3,-16,-8,-25,-4,-23,-19,-21,-43,6,-38,-12,-49,4,-21,-1,-32,9,-8,22,-23,-1,-11,-14,-32,-12,-40,-9,-31,23,-39,25,-13,20,-8,9},
+ /* IRC_Composite_C_R0195_T135_P315.wav */
+ {-23,24,-24,24,-24,24,-24,24,-24,24,-24,24,-24,23,-23,22,-21,19,-17,12,2,-321,142,-352,-116,-71,-511,212,1241,-690,1132,1447,1818,-2325,-1459,2842,2322,3950,-401,7294,1799,9821,384,-3014,-458,4980,4067,-3265,-1817,-2557,1536,1050,141,-1408,467,945,477,-318,841,-225,-162,-191,333,-541,-289,-847,48,-224,-228,-453,-42,-332,-101,-393,-171,-405,-103,-444,-70,-591,-149,-459,-69,-570,-117,-584,-95,-396,-42,-496,-210,-651,-204,-618,-333,-581,-255,-540,-313,-471,-202,-369,-230,-385,-202,-278,-178,-259,-149,-205,-123,-195,-100,-150,-73,-188,-126,-225,-124,-193,-92,-182,-65,-172,-74,-168,-103,-186,-57,-178,-89,-280,-140,-220,-97,-251,-226,-268,-204,-268,-271,-286,-293,-290,-360,-269,-322,-274,-307,-261,-331,-275,-290,-250,-261,-307,-242,-239,-199,-225,-211,-141,-180,-148,-189,-147,-163,-178,-155,-195,-114,-193,-96,-201,-69,-171,-54,-158,-66,-130,-90,-112,-83,-108,-98,-108,-90,-89,-94,-103,-90,-117,-87,-105,-51,-97,-64,-70,-56,-23,-79,7,-88,34,-80,43,-77,63,-50,59,-68,43,-51,41,-54,60,-92,29,-102,48,-85,28,-79,9,-67,13,-66,37,-57,38,-64,47,-47,53,-38,54,-42,32,-33,27,-15,13,-24,-26,-34,-6,-41,23,-23,1,-31,23,-1,22,-48,-14},
+ /* IRC_Composite_C_R0195_T150_P315.wav */
+ {-14,14,-14,14,-14,14,-14,14,-14,14,-15,15,-15,15,-15,15,-15,15,-15,15,-14,13,-9,-299,105,-109,-149,-174,-101,123,928,331,409,1091,1957,-1219,-1800,2020,2641,4225,-365,6765,1276,7468,2095,-1421,-1941,2847,4183,-2838,-2013,-2585,1301,1369,1048,-1018,299,712,620,-358,419,-160,-391,-365,85,-244,-278,-735,101,-159,-46,-323,-112,-300,-73,-375,-177,-408,-241,-349,-232,-359,-171,-320,-131,-293,-2,-318,-62,-331,-78,-385,-166,-449,-212,-441,-266,-408,-251,-382,-246,-414,-254,-434,-274,-407,-251,-444,-252,-399,-189,-349,-176,-289,-151,-238,-106,-181,-45,-201,-17,-170,-8,-151,12,-150,-68,-196,-148,-187,-145,-232,-247,-286,-284,-266,-250,-295,-275,-287,-281,-302,-308,-288,-299,-267,-330,-280,-301,-267,-269,-255,-300,-276,-267,-240,-267,-229,-279,-186,-258,-159,-229,-176,-170,-148,-137,-189,-140,-182,-128,-193,-123,-144,-95,-99,-87,-75,-90,-47,-89,-71,-115,-103,-102,-112,-110,-131,-87,-120,-99,-104,-130,-68,-115,-50,-116,-33,-115,-23,-91,-20,-77,-32,-46,-36,-20,-19,-1,-1,-16,2,-30,-4,-10,2,-12,-25,-22,-46,-39,-40,-29,-51,-40,-76,-30,-47,-17,-48,-11,-52,8,-41,31,-26,41,1,54,-33,53,-2,35,-28,34,-23,25,-31,33,-25,-2,-7,10,-26,-60,-40},
+ /* IRC_Composite_C_R0195_T165_P315.wav */
+ {-17,17,-18,19,-19,20,-21,21,-22,23,-24,25,-26,27,-29,30,-32,33,-35,37,-39,42,-45,48,-52,67,-40,152,75,-119,-31,837,302,348,1063,1535,471,-104,-785,1551,1039,5803,545,3679,3043,5986,50,-1878,1830,-1451,2642,-2294,-1114,-2432,2146,1209,-135,-693,285,141,308,-50,-77,-237,196,-409,80,-447,-119,-467,-15,-415,-52,-429,-63,-216,-215,-423,-211,-250,-99,-343,-232,-231,-78,-380,-66,-225,10,-172,-61,-149,-128,-331,-281,-369,-348,-420,-336,-400,-303,-402,-320,-360,-377,-402,-338,-363,-356,-382,-392,-353,-371,-352,-344,-280,-280,-250,-233,-166,-154,-160,-136,-102,-71,-93,-69,-118,-111,-164,-179,-223,-230,-272,-255,-285,-312,-330,-270,-347,-306,-400,-338,-356,-324,-353,-315,-327,-313,-301,-321,-289,-309,-258,-317,-227,-285,-196,-252,-189,-237,-155,-182,-95,-165,-128,-123,-87,-127,-113,-150,-118,-122,-92,-114,-79,-90,-44,-70,-19,-82,-37,-76,-88,-84,-86,-94,-117,-109,-92,-108,-75,-136,-74,-119,-62,-120,-51,-126,-38,-97,-20,-110,-3,-105,29,-72,41,-66,43,-69,58,-54,55,-37,38,-45,18,-47,10,-73,-1,-104,15,-120,0,-103,12,-106,19,-73,20,-41,43,-9,42,-5,48,-4,46,3,29,-8,24,11,13,-8,11,55,13,32,16,31,9,-51,-42},
+ /* IRC_Composite_C_R0195_T180_P315.wav */
+ {24,-25,26,-27,28,-30,31,-33,34,-36,38,-40,42,-45,47,-50,53,-57,61,-65,70,-76,82,-90,100,-116,158,-120,110,-47,143,-200,288,-83,509,566,678,584,1717,-752,-218,-645,3620,1547,2553,2618,2850,3932,1154,2478,-3553,2655,-1012,521,-1943,-220,418,465,358,-445,32,572,410,189,111,242,-109,240,99,120,-178,-44,-146,-12,-251,-169,-110,-64,-56,-37,-65,38,137,-75,-42,-159,-127,-127,-11,-39,-7,-121,-97,-173,-207,-322,-357,-395,-311,-334,-329,-369,-303,-285,-259,-281,-323,-274,-364,-264,-415,-314,-459,-317,-463,-346,-399,-298,-323,-239,-217,-185,-167,-162,-146,-115,-142,-125,-194,-139,-196,-150,-224,-208,-224,-201,-206,-219,-254,-241,-239,-289,-306,-358,-320,-362,-312,-398,-353,-429,-362,-421,-352,-421,-332,-364,-272,-351,-188,-256,-150,-222,-109,-165,-57,-142,-72,-111,-54,-116,-66,-134,-87,-132,-39,-149,-55,-144,-3,-111,-37,-108,-57,-98,-89,-106,-109,-135,-117,-147,-114,-137,-99,-140,-85,-140,-56,-119,-68,-119,-57,-94,-53,-95,-61,-85,-42,-76,-22,-61,-39,-37,-44,-27,-31,-14,-37,-23,-16,-39,0,-62,-11,-92,2,-64,-27,-61,-33,-39,-34,-35,-26,-27,5,-20,14,-33,30,-28,12,-27,25,-7,7,29,-15,24,-9,67,32,52,-7,19,-10,-34},
+ /* IRC_Composite_C_R0195_T195_P315.wav */
+ {-3,3,-4,4,-4,4,-4,4,-4,4,-4,4,-5,5,-5,5,-5,5,-6,6,-6,7,-7,8,-10,16,-53,-21,71,-52,123,66,-67,138,16,149,471,552,491,879,834,185,-864,886,1624,2747,1377,2335,2675,2476,2941,-204,-424,-902,1080,-594,-652,-972,-15,737,158,15,-103,673,669,117,134,496,369,6,174,211,204,39,24,7,-16,8,-20,185,63,80,52,87,-18,-50,-107,-83,-58,-90,-149,-191,-215,-179,-280,-228,-426,-325,-403,-260,-377,-309,-454,-294,-358,-263,-350,-288,-312,-298,-376,-336,-392,-351,-440,-368,-423,-300,-356,-221,-309,-156,-237,-133,-233,-159,-209,-147,-233,-211,-247,-210,-236,-217,-261,-238,-270,-208,-309,-227,-327,-269,-364,-336,-391,-375,-368,-412,-407,-388,-417,-354,-411,-328,-386,-273,-319,-198,-244,-162,-205,-101,-178,-129,-177,-104,-161,-77,-156,-48,-139,-49,-168,-54,-132,-40,-129,-49,-113,-43,-97,-66,-144,-76,-174,-72,-177,-115,-186,-100,-175,-109,-149,-106,-124,-101,-86,-76,-56,-81,-27,-107,3,-87,-27,-99,-52,-77,-57,-80,-68,-65,-62,-77,-17,-71,-16,-67,-12,-47,-11,-33,-14,-33,-31,-4,-26,-4,-79,6,-73,-6,-74,-4,-61,-7,-62,10,-50,33,-27,0,-4,51,21,29,16,43,17,21,38,16,70,-26,47,-23},
+ /* IRC_Composite_C_R0195_T210_P315.wav */
+ {6,-6,6,-6,6,-6,6,-6,6,-6,6,-7,7,-7,7,-7,7,-7,8,-8,8,-8,9,-9,9,-9,9,-9,9,-6,-16,-81,-27,-64,-11,-116,37,-7,308,224,339,624,595,47,-450,456,1108,1630,1528,1730,2147,2381,2098,1287,-731,283,215,213,-551,-518,308,203,729,-194,652,579,759,441,763,571,528,360,442,343,364,229,431,125,293,81,275,88,238,45,215,155,198,82,61,12,5,-51,-58,-119,-156,-200,-208,-255,-244,-261,-244,-232,-236,-252,-249,-226,-258,-256,-283,-248,-281,-296,-308,-266,-304,-256,-333,-220,-281,-198,-262,-186,-220,-164,-184,-148,-198,-168,-234,-150,-270,-190,-317,-221,-358,-246,-358,-268,-356,-277,-357,-276,-375,-272,-357,-257,-384,-239,-370,-230,-374,-258,-374,-262,-363,-281,-344,-263,-317,-224,-292,-194,-243,-172,-216,-149,-196,-138,-151,-112,-138,-121,-140,-121,-158,-136,-149,-135,-124,-140,-124,-136,-125,-160,-126,-165,-139,-151,-144,-151,-125,-132,-116,-99,-80,-92,-84,-64,-97,-68,-84,-76,-83,-93,-75,-65,-93,-87,-89,-70,-103,-55,-102,-68,-112,-68,-70,-61,-55,-62,-34,-41,-24,-58,-48,-63,-63,-52,-80,-56,-81,-54,-68,-55,-48,-48,-24,-69,-21,-60,-6,-21,-10,-12,-6,14,-8,19,1,57,22,38,15,27,32,33},
+ /* IRC_Composite_C_R0195_T225_P315.wav */
+ {-7,7,-8,8,-8,8,-8,8,-8,8,-8,8,-8,8,-8,8,-8,8,-8,9,-9,9,-9,9,-9,9,-9,9,-6,33,28,58,51,52,71,102,56,94,137,218,326,455,483,632,249,92,428,904,1132,1053,1398,1725,1892,1761,996,419,-35,393,230,-426,83,187,561,443,405,624,567,778,322,714,220,555,133,272,57,175,33,-14,10,34,86,73,113,24,-32,-47,-92,-107,-159,-198,-236,-286,-255,-307,-290,-357,-323,-402,-335,-423,-329,-409,-335,-383,-288,-312,-274,-328,-286,-276,-227,-303,-252,-323,-243,-382,-269,-374,-281,-400,-300,-362,-289,-363,-292,-337,-287,-341,-275,-329,-275,-353,-270,-350,-272,-365,-283,-346,-284,-356,-310,-344,-298,-351,-295,-331,-289,-350,-307,-364,-293,-334,-305,-333,-280,-301,-259,-287,-211,-253,-202,-233,-185,-196,-178,-176,-188,-164,-153,-127,-135,-117,-145,-120,-134,-127,-143,-116,-126,-80,-113,-89,-119,-102,-89,-86,-92,-78,-108,-66,-94,-63,-86,-58,-73,-44,-52,-66,-55,-76,-50,-92,-33,-91,-19,-106,-44,-97,-52,-76,-62,-65,-52,-53,-56,-64,-38,-57,-27,-67,-32,-61,-26,-56,-44,-40,-36,-27,-22,-5,-13,-6,12,-15,8,-1,18,1,-3,6,-13,24,6,33,17,44,11,63,31,57,47,73,42,34,14,5},
+ /* IRC_Composite_C_R0195_T240_P315.wav */
+ {0,0,0,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,58,78,16,22,51,114,84,41,96,70,113,111,119,154,190,332,340,437,381,393,351,291,690,869,1203,1249,1386,1308,1507,1378,1185,595,424,365,626,420,458,252,382,637,446,207,255,488,305,321,49,221,53,63,79,-40,108,-82,101,-101,-13,-203,-152,-221,-220,-235,-289,-282,-281,-296,-224,-344,-241,-368,-252,-366,-268,-359,-308,-318,-288,-298,-317,-264,-285,-261,-303,-269,-298,-270,-320,-331,-336,-351,-327,-351,-348,-331,-347,-276,-351,-246,-372,-243,-370,-280,-365,-300,-410,-295,-413,-330,-447,-345,-440,-333,-430,-333,-415,-326,-403,-318,-379,-309,-372,-303,-357,-286,-300,-274,-299,-260,-274,-222,-258,-207,-249,-178,-228,-179,-202,-181,-164,-194,-132,-181,-100,-149,-105,-124,-85,-117,-92,-115,-104,-129,-96,-119,-72,-137,-65,-104,-51,-87,-75,-80,-56,-63,-66,-73,-81,-74,-88,-75,-87,-74,-68,-80,-63,-77,-50,-74,-36,-76,-42,-77,-46,-59,-47,-48,-54,-32,-62,-21,-50,-24,-43,-33,-23,-40,-10,-7,-13,-16,-4,2,7,17,-10,37,-7,35,11,27,-4,32,-1,15,-21,-1,-28,7,-9,16,21,30,38,52,37,48,38,34,3},
+ /* IRC_Composite_C_R0195_T255_P315.wav */
+ {-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-3,3,-3,3,-3,4,-6,74,75,79,61,128,72,79,70,94,189,182,258,204,285,366,406,480,409,503,603,776,875,1073,1366,1703,1601,1585,1344,1253,1054,708,209,184,245,471,220,82,328,234,143,-43,229,63,146,52,46,143,-26,108,-162,-81,-337,-290,-357,-257,-274,-266,-282,-295,-253,-242,-177,-217,-241,-242,-180,-187,-261,-282,-286,-285,-278,-318,-290,-350,-241,-329,-216,-356,-250,-344,-253,-301,-333,-307,-381,-310,-406,-310,-398,-327,-389,-328,-383,-321,-397,-364,-416,-386,-447,-400,-469,-437,-477,-423,-470,-435,-472,-439,-441,-374,-396,-361,-359,-340,-300,-318,-278,-293,-236,-257,-203,-214,-171,-197,-164,-178,-159,-160,-150,-162,-167,-187,-166,-177,-176,-193,-156,-159,-125,-174,-110,-158,-92,-129,-96,-113,-107,-94,-103,-101,-73,-98,-45,-93,-27,-108,-14,-122,-36,-134,-52,-131,-66,-121,-83,-114,-73,-107,-51,-91,-32,-79,2,-74,2,-68,4,-68,20,-45,9,-63,-6,-50,8,-15,-2,-22,-9,6,4,25,-11,21,-12,18,-6,-1,-16,-16,-15,-8,7,8,-10,14,-14,21,-9,18,-34,-11,0,0,38,9,28,24,33,41,32,56,10,45},
+ /* IRC_Composite_C_R0195_T270_P315.wav */
+ {5,-5,5,-5,5,-5,5,-6,6,-6,6,-6,6,-6,7,-7,7,-7,8,-8,8,-9,9,-10,10,-11,12,-13,14,-16,19,-24,35,-112,-87,-172,-147,-119,-127,-152,-113,-103,-89,-113,-68,-116,-46,22,42,151,321,392,548,700,898,1192,1367,1289,1342,1432,1348,1134,1055,823,716,745,988,819,628,418,468,438,382,415,357,462,457,454,331,457,286,349,199,216,110,272,103,141,96,107,157,39,151,90,143,187,135,145,132,119,90,29,67,9,33,-99,-4,-78,-31,-119,-118,-125,-133,-39,-116,6,-53,-9,-2,-28,-8,-68,-109,-175,-231,-243,-320,-296,-388,-312,-439,-323,-431,-308,-403,-341,-379,-320,-333,-304,-317,-322,-321,-302,-340,-277,-367,-233,-348,-216,-344,-197,-304,-195,-255,-199,-226,-173,-179,-167,-168,-175,-177,-169,-197,-168,-238,-156,-231,-167,-240,-168,-219,-192,-218,-202,-205,-205,-186,-197,-157,-172,-143,-163,-152,-143,-150,-149,-177,-148,-159,-149,-150,-163,-154,-183,-160,-189,-132,-190,-124,-156,-96,-125,-92,-99,-99,-74,-85,-61,-83,-67,-68,-74,-62,-91,-54,-91,-46,-108,-22,-86,-15,-70,-6,-63,-3,-43,-35,-76,-52,-91,-99,-89,-83,-72,-67,-70,-42,-53,-31,-59,-32,-49,-39,-55,-65,-43,-43,-36,-50,-25,-39,-34,-26,-31},
+ /* IRC_Composite_C_R0195_T285_P315.wav */
+ {0,0,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,3,-3,0,-53,-54,-56,-85,-47,-114,-135,-181,-153,-193,-267,-244,-55,-96,1,65,-104,-149,-27,77,318,544,620,776,1096,1388,1457,1232,925,941,734,587,918,901,616,762,669,803,637,587,517,641,585,459,366,454,473,472,377,381,369,477,434,303,311,258,424,217,330,203,348,239,206,163,147,190,93,131,3,88,29,61,25,-4,30,-29,-32,-79,-68,-48,-73,-75,-119,-13,-30,17,-48,5,-35,5,-39,-80,-142,-105,-167,-166,-226,-200,-281,-233,-317,-276,-334,-290,-353,-338,-366,-316,-342,-297,-343,-306,-273,-252,-266,-278,-281,-276,-239,-265,-258,-270,-226,-250,-191,-215,-181,-217,-149,-202,-131,-195,-119,-225,-148,-263,-146,-220,-148,-221,-170,-215,-156,-215,-188,-262,-202,-269,-194,-235,-202,-241,-188,-209,-153,-204,-154,-203,-167,-217,-151,-214,-172,-225,-158,-182,-145,-170,-150,-164,-121,-136,-87,-134,-90,-102,-41,-87,-63,-73,-53,-73,-60,-73,-67,-76,-98,-68,-64,-72,-69,-72,-35,-71,-32,-55,-37,-56,-47,-39,-69,-58,-90,-53,-99,-57,-83,-34,-50,-55,-58,-67,-57,-63,-70,-62,-74,-53,-70,-30,-49,-56,-37,-35,-21,-10,-19,-29},
+ /* IRC_Composite_C_R0195_T300_P315.wav */
+ {2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-3,4,-10,-133,-133,-170,-242,-249,-433,-299,-139,-159,192,133,-70,22,-303,18,-19,635,218,706,1507,1430,1383,2387,1796,1075,392,368,909,611,309,-168,353,2,566,420,570,464,600,533,643,640,611,592,536,352,641,435,676,299,466,377,487,301,349,330,262,326,234,228,152,89,163,56,54,-10,7,-78,-45,-66,-85,-68,-104,-18,4,-26,41,2,31,0,79,5,36,26,46,69,42,-19,-67,-82,-80,-133,-166,-222,-198,-222,-228,-274,-302,-279,-261,-261,-282,-253,-280,-237,-241,-240,-230,-249,-229,-231,-221,-230,-219,-245,-228,-234,-188,-202,-201,-222,-167,-182,-137,-203,-165,-172,-150,-180,-163,-208,-169,-194,-164,-229,-193,-245,-204,-252,-223,-246,-236,-257,-266,-272,-274,-271,-280,-267,-251,-243,-225,-207,-200,-174,-184,-165,-180,-160,-164,-160,-158,-167,-156,-169,-151,-138,-125,-125,-108,-104,-80,-94,-71,-82,-75,-85,-57,-68,-57,-49,-58,-52,-65,-51,-59,-53,-74,-44,-57,-44,-43,-49,-55,-42,-57,-55,-65,-60,-62,-53,-54,-78,-70,-64,-55,-66,-73,-66,-48,-68,-87,-49,-57,-32,-77,-35,-66,-33,-71,-35,-70,15,-17,-11,-33},
+ /* IRC_Composite_C_R0195_T315_P315.wav */
+ {-3,3,-4,4,-4,4,-4,4,-4,4,-4,5,-5,5,-5,5,-5,5,-6,6,-6,6,-6,6,-6,6,-5,3,2,-152,-177,-483,-235,-110,-653,-348,-150,-38,208,331,33,-385,-315,-27,364,811,-94,2504,888,2086,3574,3328,531,314,789,729,404,-337,56,36,119,405,418,656,613,503,327,557,477,459,703,343,212,405,546,432,317,280,459,304,364,271,334,99,204,199,155,38,34,17,94,27,75,-28,51,-48,69,-29,44,-56,45,-30,20,5,41,-28,41,31,56,13,68,19,90,-37,31,-65,21,-87,-51,-142,-103,-155,-98,-191,-137,-221,-116,-207,-139,-209,-136,-203,-147,-207,-168,-209,-164,-226,-176,-243,-198,-258,-194,-267,-197,-246,-196,-229,-191,-208,-190,-182,-197,-201,-171,-193,-170,-221,-151,-220,-141,-245,-167,-251,-184,-255,-210,-246,-238,-245,-223,-258,-247,-284,-254,-278,-249,-311,-255,-297,-217,-263,-193,-236,-176,-198,-176,-178,-155,-172,-140,-181,-132,-195,-91,-184,-92,-165,-90,-121,-68,-117,-88,-97,-47,-73,-55,-70,-16,-46,-13,-61,-26,-38,-50,-48,-41,-43,-40,-60,-49,-55,-58,-57,-47,-68,-57,-81,-49,-74,-61,-74,-29,-70,-35,-79,-39,-87,-35,-94,-49,-86,-55,-65,-49,-58,-43,-30,-32,-23,-33,-5,-23,19,-13,-17},
+ /* IRC_Composite_C_R0195_T330_P315.wav */
+ {-7,7,-7,7,-7,7,-7,7,-7,7,-7,7,-7,7,-7,7,-7,8,-8,8,-8,9,-9,9,-10,11,-11,-55,-296,-386,-360,-162,-486,-689,-594,323,-279,489,253,-225,-799,-208,-290,1653,-875,1421,3185,831,3972,4758,3089,-835,674,981,1685,-351,-114,-17,248,390,777,359,517,535,503,290,712,58,681,346,142,-203,198,199,331,-307,34,132,139,70,114,91,13,123,184,191,4,23,205,163,125,72,141,-40,14,124,-28,33,-51,40,-5,35,-58,73,-52,-16,56,78,-40,-37,45,32,27,55,-7,-15,-18,29,-29,22,-117,6,-57,-69,-79,-66,-162,-105,-133,-121,-164,-165,-210,-152,-236,-167,-217,-215,-247,-204,-244,-201,-239,-194,-273,-180,-249,-181,-223,-192,-224,-139,-212,-188,-198,-169,-226,-134,-219,-153,-208,-148,-204,-149,-219,-168,-214,-162,-245,-160,-257,-219,-229,-208,-279,-218,-292,-266,-282,-268,-275,-227,-298,-216,-236,-164,-238,-151,-226,-142,-217,-147,-203,-145,-177,-146,-138,-122,-131,-73,-151,-51,-110,-31,-107,-6,-86,-9,-40,-10,-36,-1,-49,-9,-42,-8,-74,2,-73,3,-80,-26,-79,6,-86,-19,-76,-29,-75,-32,-78,-38,-65,-46,-77,-46,-88,-55,-75,-74,-82,-34,-77,-58,-74,-44,-61,-16,-21,-21,-1,-32,25,-5,-9,-4},
+ /* IRC_Composite_C_R0195_T345_P315.wav */
+ {-3,3,-3,3,-3,3,-3,3,-3,3,-2,2,-2,2,-1,1,0,0,1,-2,3,-4,6,-9,13,-23,-205,-456,-570,-178,-609,-516,-1049,-349,515,157,-280,1141,-1675,-135,-1096,1502,703,-567,2409,4580,1615,5569,6660,-925,461,21,3064,-94,275,-939,176,137,1125,718,-145,338,911,169,330,365,552,148,369,-393,179,-127,204,80,-84,-339,8,81,-65,-288,145,50,-22,-24,61,62,45,-71,194,159,54,-19,226,-56,24,48,99,-31,-91,-8,53,24,-79,12,113,-69,-3,43,52,-53,25,22,42,-13,-5,-1,64,-132,-15,-42,-12,-176,-19,-103,-113,-146,-76,-99,-119,-177,-139,-96,-193,-229,-107,-210,-181,-214,-106,-219,-211,-156,-157,-151,-246,-153,-144,-151,-254,-173,-147,-195,-202,-155,-196,-154,-199,-151,-187,-147,-192,-144,-157,-216,-170,-139,-200,-196,-193,-158,-269,-172,-256,-190,-293,-226,-252,-229,-318,-238,-250,-265,-306,-166,-254,-191,-300,-137,-229,-129,-286,-136,-186,-156,-221,-108,-162,-109,-143,-76,-137,-51,-129,-13,-99,-24,-56,17,-62,-20,-41,40,-86,44,-52,39,-123,42,-65,39,-115,-16,-46,0,-101,-28,-69,-10,-115,-27,-101,20,-128,3,-110,13,-133,-3,-101,-28,-103,-3,-79,-10,-82,10,-56,27,-77,25,-50,57,-33,20,-49,39}};
+
+const int16_t irc_composite_c_r0195_p330[][256] =
+ {/* IRC_Composite_C_R0195_T000_P330.wav */
+ {-59,61,-63,65,-67,69,-71,73,-76,78,-81,83,-86,89,-92,95,-98,100,-102,103,-103,99,-90,66,27,-206,-447,-812,-1040,-532,-532,-221,-2282,2737,-1254,634,-40,577,-3131,-820,-289,5598,-4456,4514,11627,-957,5804,7393,108,-5260,1410,3318,1621,-1983,2287,284,1686,1238,2060,-1196,399,489,1551,51,439,-136,620,290,-51,26,548,-418,535,-429,119,-693,256,-317,191,-412,18,-258,-48,-331,42,-245,-151,-84,-244,-168,-112,-248,56,-243,-130,-346,3,-311,-140,-201,-205,-208,-164,-257,-153,-216,-142,-212,-32,-240,-169,-200,-80,-259,-56,-266,-49,-259,-153,-247,-131,-186,-180,-157,-174,-170,-168,-133,-130,-144,-118,-156,-112,-157,-115,-125,-52,-108,-95,-100,-113,-69,-143,-89,-121,-105,-124,-163,-161,-185,-102,-218,-93,-213,-136,-158,-144,-182,-122,-122,-161,-147,-153,-151,-116,-162,-100,-155,-94,-176,-98,-138,-94,-127,-119,-122,-158,-125,-151,-130,-178,-168,-144,-200,-186,-199,-181,-157,-192,-201,-216,-176,-230,-170,-197,-219,-207,-194,-203,-187,-195,-174,-204,-175,-205,-170,-207,-182,-206,-156,-195,-149,-193,-165,-200,-125,-166,-120,-182,-142,-113,-73,-137,-86,-97,-75,-88,-72,-83,-37,-82,-24,-72,-40,-53,24,-38,-23,-48,32,10,7,-19,18,7,43,7,34,32,65,53,56,21,94,55,42},
+ /* IRC_Composite_C_R0195_T015_P330.wav */
+ {-33,32,-32,31,-31,30,-28,27,-25,22,-19,15,-10,4,5,-16,31,-53,84,-136,240,-673,177,-174,-1030,-1321,-76,-1250,-372,289,-2348,2418,1442,-314,-2260,351,-1076,96,-4201,12653,-2793,350,16253,7416,-1734,373,1945,-1722,32,2367,1990,-2906,2200,2573,955,-397,1580,-424,684,371,1473,401,8,-1088,1156,-110,164,-526,361,-233,-337,-706,160,-330,-24,-130,132,-810,170,-491,242,-434,33,-622,355,-505,-308,-68,-61,-264,-71,-244,-294,-284,-179,-295,41,-462,-220,-369,-36,-507,-206,-424,-65,-416,-180,-392,-246,-316,-59,-245,-204,-339,-224,-205,-78,-425,-107,-254,-66,-399,-77,-350,46,-239,-96,-256,-101,-268,-138,-142,-190,-179,-136,-172,-84,-261,-40,-173,25,-283,-32,-282,9,-234,-87,-198,-101,-238,-154,-207,-159,-166,-106,-164,-136,-199,-109,-121,-73,-175,-65,-149,-73,-162,-108,-135,-78,-99,-124,-126,-179,-91,-133,-84,-188,-122,-167,-148,-155,-182,-183,-160,-158,-219,-207,-224,-181,-161,-192,-206,-207,-174,-243,-140,-189,-173,-194,-138,-203,-173,-192,-143,-155,-154,-216,-158,-170,-138,-202,-110,-182,-132,-154,-83,-201,-104,-130,-44,-129,-80,-139,-19,-72,-80,-88,-16,-110,-20,-46,-35,-88,15,-32,6,-67,-9,-16,52,-18,27,27,26,-2,60,51,76,28,98,40,77,33,94,11,62},
+ /* IRC_Composite_C_R0195_T030_P330.wav */
+ {15,-16,18,-19,21,-23,26,-29,32,-36,41,-47,54,-62,73,-86,104,-126,155,-102,601,-1085,-197,-1634,218,-1892,836,-1472,627,332,2248,1679,-4388,-1076,2778,-5228,3611,10385,-5976,10952,11266,9110,-4453,651,-313,-354,33,2898,-224,-1072,2571,1824,-115,539,940,-84,401,1263,337,3,-171,-426,685,-69,-27,-94,-916,-1001,131,-752,-458,-101,-74,-99,-305,-309,-166,-102,238,-512,98,-429,-43,-482,424,-183,-138,-249,-301,-240,-13,-418,-203,-184,-296,-341,-269,-474,-99,-447,-210,-601,-403,-560,-148,-418,-397,-430,-241,-495,-140,-391,-94,-358,-170,-431,-28,-368,-72,-337,-69,-376,-11,-267,-144,-348,-177,-200,-156,-317,-161,-307,-97,-238,-69,-237,-166,-271,-82,-187,-69,-237,-35,-248,-105,-213,-38,-207,-108,-284,-91,-256,-64,-223,-92,-227,-52,-205,-48,-178,-94,-174,-26,-226,-71,-202,-71,-184,-34,-207,-88,-154,-79,-180,-41,-222,-49,-215,-56,-245,-90,-251,-51,-260,-109,-246,-150,-229,-109,-239,-125,-253,-146,-228,-85,-219,-106,-252,-82,-250,-58,-194,-116,-232,-74,-193,-81,-184,-110,-195,-65,-162,-92,-193,-65,-199,-29,-203,0,-193,28,-151,-16,-159,-4,-109,-9,-90,-21,-99,36,-92,27,-82,30,-74,71,-74,64,-43,102,-28,93,18,88,22,98,29,116,21,126,-20,133,-40,143,-66},
+ /* IRC_Composite_C_R0195_T045_P330.wav */
+ {60,-60,60,-60,60,-60,59,-57,55,-51,47,-40,30,-15,-9,50,-138,582,-538,-783,-136,149,-1756,-848,-253,-449,1379,-797,1611,1075,2352,-3846,-4473,1829,1877,4778,13625,-4798,10293,11126,4895,-5087,-2315,-1117,-112,3354,2968,-606,-2642,2599,370,2356,-155,634,-118,50,-430,371,-366,83,83,846,-691,615,-552,-124,-1033,-101,-1482,300,-868,142,-849,-166,-356,234,-620,-26,-586,234,-687,38,-602,184,-537,-8,-502,109,-408,41,-516,144,-611,54,-513,-33,-440,-242,-381,-176,-498,-276,-575,-140,-578,-79,-706,-148,-475,-195,-498,-214,-378,-197,-385,-257,-315,-80,-443,-59,-376,-102,-363,-123,-440,-39,-442,-136,-304,-144,-309,-84,-271,-165,-242,-238,-200,-117,-273,-150,-258,-130,-283,-92,-309,-42,-296,-47,-253,-76,-218,8,-252,-78,-168,-84,-181,-86,-207,-54,-197,-48,-239,-19,-220,-19,-245,-20,-221,-34,-247,-31,-246,-93,-181,-96,-211,-94,-210,-85,-235,-118,-230,-101,-229,-107,-245,-109,-215,-112,-220,-113,-204,-100,-188,-108,-185,-89,-182,-62,-197,-34,-195,-28,-194,-18,-182,-55,-157,-81,-141,-90,-141,-91,-129,-74,-112,-85,-107,-64,-103,-64,-86,-50,-93,-43,-62,-35,-57,-57,-38,-24,-28,-39,-24,-20,-16,22,2,35,17,56,35,75,47,56,59,88,45,61,91,80,67,62,68,59},
+ /* IRC_Composite_C_R0195_T060_P330.wav */
+ {-16,18,-21,24,-27,30,-34,39,-45,51,-59,68,-79,93,-109,120,-488,-209,-843,-446,581,-2538,150,-1048,1674,-298,921,-422,4633,-1379,-3456,-5235,5897,-232,13802,4771,-1871,13790,9150,509,-7321,-2062,426,4376,2825,-66,-4120,2160,1014,1965,-182,10,-66,1012,-1092,605,-694,-103,-630,876,-1446,848,-616,147,-237,208,-605,430,-846,156,-639,-33,-577,-169,-800,-107,-681,-261,-491,-122,-613,-72,-646,-89,-523,-258,-835,-111,-630,-192,-684,-120,-546,-114,-589,-198,-484,-123,-592,-31,-441,-137,-356,-160,-262,-88,-337,-230,-206,-197,-286,-158,-371,-90,-386,-164,-357,-120,-396,-123,-371,-159,-394,-268,-385,-156,-411,-140,-387,-213,-351,-179,-344,-165,-326,-182,-213,-154,-216,-130,-224,-133,-226,-137,-212,-88,-294,-83,-283,-112,-241,-166,-252,-129,-207,-171,-148,-189,-146,-134,-197,-75,-135,-114,-111,-109,-99,-40,-137,-112,-65,-123,-140,-104,-208,-112,-191,-189,-188,-164,-205,-119,-255,-149,-161,-150,-183,-173,-162,-174,-126,-195,-97,-145,-155,-118,-129,-86,-145,-98,-141,-61,-119,-118,-63,-133,-28,-155,2,-161,-3,-128,-39,-100,-78,-65,-82,-72,-98,-47,-85,-70,-46,-75,-12,-101,21,-108,22,-100,40,-92,45,-75,34,-63,31,-40,44,-41,58,-23,74,-14,74,-19,131,-21,113,30,101,49,110,57,108,51},
+ /* IRC_Composite_C_R0195_T075_P330.wav */
+ {19,-20,21,-23,25,-26,28,-31,33,-36,39,-42,45,-49,49,-225,-118,-411,-201,-767,-125,-1198,-1086,1587,699,-114,366,4108,-2207,1045,-7292,822,4055,16836,-2188,1091,15052,6204,1571,-5363,-5126,3112,6714,709,-1466,-3132,1975,682,2154,-1147,580,-537,152,-77,-200,-771,391,-354,-354,-457,389,-921,324,-902,497,-455,-10,-125,532,-709,91,-249,-171,-384,-149,-591,-267,-649,-63,-714,-477,-400,-204,-742,-437,-554,-445,-510,-517,-561,-379,-611,-347,-592,-417,-611,-301,-482,-385,-503,-245,-302,-310,-258,-221,-225,-194,-239,-127,-248,-118,-185,-116,-277,-78,-132,-151,-167,-94,-212,-171,-287,-162,-301,-224,-259,-202,-317,-238,-263,-235,-226,-328,-285,-227,-274,-225,-257,-270,-272,-203,-280,-198,-229,-168,-195,-197,-135,-134,-188,-159,-143,-143,-184,-122,-175,-115,-188,-85,-144,-140,-133,-147,-139,-167,-127,-183,-140,-187,-127,-176,-160,-172,-135,-190,-179,-159,-144,-201,-142,-175,-140,-206,-117,-148,-146,-179,-121,-175,-129,-135,-92,-156,-126,-159,-68,-176,-108,-129,-91,-133,-75,-91,-67,-116,-63,-52,-31,-122,-11,-115,3,-129,15,-110,-22,-119,-11,-83,-62,-34,-39,-48,-27,-43,-19,-79,23,-48,-1,-86,40,-64,16,-37,23,-6,-6,9,18,18,23,24,45,17,82,40,87,28,105,40,116,77,81,80,85},
+ /* IRC_Composite_C_R0195_T090_P330.wav */
+ {6,-4,3,-1,0,3,-5,8,-11,16,-21,29,-39,57,-101,-332,89,-835,-16,8,-1022,-629,-474,1050,924,-984,2683,3640,-2207,-5863,2261,-3476,15168,2953,-3266,10727,14390,3174,-8455,-1966,1449,7129,3075,-3700,-2692,1997,423,1234,-1087,216,-471,1061,-1107,458,-1402,142,319,-88,-425,76,-1043,226,-230,12,-536,-207,-663,129,-455,253,-222,-284,-472,86,-636,265,-368,-261,-539,-160,-407,43,-778,-256,-683,-475,-586,-306,-628,-455,-647,-525,-513,-416,-500,-430,-812,-419,-489,-274,-452,-386,-597,-258,-363,-159,-236,-327,-241,-259,-214,-139,-145,-206,-216,-123,-79,-29,-96,-65,-217,-263,-177,-100,-202,-186,-272,-223,-240,-138,-180,-221,-352,-224,-206,-195,-213,-254,-233,-244,-227,-156,-224,-178,-249,-190,-199,-133,-154,-164,-183,-191,-143,-185,-101,-190,-166,-201,-98,-150,-133,-119,-165,-142,-178,-120,-115,-180,-149,-197,-152,-187,-75,-218,-143,-264,-128,-205,-139,-221,-148,-269,-159,-215,-126,-214,-123,-256,-105,-233,-71,-203,-97,-215,-79,-182,-53,-120,-82,-122,-49,-119,20,-120,24,-141,6,-133,24,-115,14,-116,-39,-71,-8,-71,6,-93,-11,-108,40,-59,43,-147,22,-98,28,-64,17,-87,-13,-67,63,-36,44,-53,62,-77,123,-52,145,-81,82,-33,141,-4,116,8,98,14,137,56,139,-7,138,4},
+ /* IRC_Composite_C_R0195_T105_P330.wav */
+ {61,-61,61,-61,62,-62,62,-62,63,-63,63,-64,64,-65,67,-301,294,-741,-246,-201,457,-1576,-144,-73,2001,-1275,1763,1153,6179,-10039,184,1999,2771,10917,-378,522,13686,11704,-7376,-5609,1748,7382,4547,-1426,-5565,-24,2068,630,-441,-1191,186,450,-243,220,-909,-111,-78,770,-727,124,-899,-156,-79,202,-685,-336,-650,-314,-474,-53,-350,-261,-756,191,-463,128,-417,-139,-484,-53,-226,-113,-375,-280,-491,-342,-457,-195,-589,-428,-623,-328,-572,-393,-551,-458,-577,-399,-453,-401,-526,-392,-496,-278,-442,-319,-518,-259,-377,-158,-346,-171,-366,-187,-308,-53,-156,-44,-233,-111,-203,-9,-156,-124,-286,-249,-248,-172,-147,-210,-273,-296,-215,-151,-154,-166,-209,-170,-207,-76,-118,-174,-253,-208,-154,-172,-145,-172,-242,-211,-169,-70,-176,-103,-198,-93,-133,-36,-100,-118,-191,-149,-134,-127,-138,-220,-229,-254,-179,-191,-192,-230,-211,-235,-161,-158,-161,-230,-195,-206,-174,-165,-144,-216,-190,-173,-127,-136,-156,-157,-179,-150,-128,-122,-138,-124,-152,-83,-109,-30,-73,-66,-103,-55,-77,-32,-75,-113,-125,-86,-47,-60,-39,-89,-29,-60,20,-18,-21,-32,-8,-50,24,-43,-1,-69,-6,-57,11,-53,21,-58,-2,-13,35,-10,30,5,44,12,60,31,79,-4,79,46,97,47,97,36,128,43,132,30,81,38},
+ /* IRC_Composite_C_R0195_T120_P330.wav */
+ {1,4,-8,14,-20,27,-35,44,-54,66,-79,95,-114,135,-159,177,-87,615,-830,163,-909,1304,-1626,-325,297,1206,69,-817,4405,1017,-2560,-616,-3770,4387,14092,-5772,3858,10124,9882,-2074,-2959,-3337,7410,7437,-1780,-6636,-2212,2639,1700,-1078,-1371,-262,1153,-566,417,-320,27,-39,-111,485,-441,-792,-288,-146,-108,-616,-333,-464,-419,-367,-303,-262,-308,-516,-133,-270,-200,-382,-324,-225,-347,-205,-250,-254,-201,-400,-249,-330,-242,-364,-366,-273,-444,-377,-352,-336,-480,-405,-375,-496,-436,-362,-461,-436,-395,-354,-445,-362,-274,-397,-353,-222,-328,-290,-351,-239,-329,-117,-69,-109,-182,-35,-73,-135,-239,-228,-363,-234,-203,-243,-333,-218,-233,-231,-229,-116,-190,-172,-177,-158,-144,-144,-172,-173,-215,-124,-180,-106,-203,-150,-185,-121,-123,-149,-106,-93,-132,-84,-116,-33,-138,-72,-186,-81,-187,-113,-205,-194,-255,-235,-238,-195,-263,-202,-264,-198,-268,-158,-241,-175,-267,-183,-249,-160,-199,-167,-203,-153,-184,-118,-137,-101,-164,-93,-143,-66,-128,-30,-127,-42,-113,-31,-78,-23,-59,-78,-78,-48,-79,-53,-70,-40,-106,-22,-46,-9,-51,-12,-37,-31,-54,-23,-49,-43,-68,-43,-55,-39,-14,-29,-16,-13,-8,32,0,28,5,31,33,68,33,69,42,71,38,89,64,82,64,81,94,57,103,62,51,87},
+ /* IRC_Composite_C_R0195_T135_P330.wav */
+ {13,-11,8,-5,2,2,-7,12,-18,26,-34,45,-58,75,-96,126,-173,263,-756,239,-382,327,-504,374,-988,304,-762,1963,32,1243,612,772,3408,-6680,-2100,10509,4890,-1044,6633,2426,10000,1888,-3554,-3952,7154,5846,-3202,-5792,-2133,1379,2382,-1044,-683,-846,1056,-24,511,18,303,-710,-25,-39,-85,-861,-206,-321,-34,-428,-245,-428,-30,-639,-166,-459,-198,-463,-354,-339,-255,-329,-348,-224,-286,-255,-287,-204,-181,-232,-210,-296,-199,-313,-262,-347,-268,-316,-307,-365,-310,-360,-308,-316,-324,-335,-371,-355,-377,-361,-310,-401,-283,-402,-244,-368,-238,-331,-274,-247,-165,-162,-178,-185,-197,-205,-193,-250,-203,-288,-187,-284,-187,-262,-183,-219,-206,-232,-196,-178,-177,-216,-242,-166,-214,-147,-219,-161,-195,-148,-178,-168,-190,-170,-141,-148,-164,-119,-116,-35,-121,-54,-95,-56,-120,-107,-112,-149,-152,-172,-185,-195,-227,-175,-253,-211,-280,-223,-250,-252,-243,-251,-235,-239,-213,-184,-218,-176,-225,-139,-205,-123,-184,-114,-154,-113,-98,-100,-89,-89,-91,-67,-61,-32,-65,-41,-68,-21,-70,-18,-87,-13,-97,-10,-79,-5,-41,-42,-23,-67,8,-74,15,-75,-43,-63,-41,-18,-81,-7,-69,6,-49,2,-9,-7,21,-8,24,-11,44,32,44,38,36,66,51,91,52,103,44,90,55,87,41,60,28,49},
+ /* IRC_Composite_C_R0195_T150_P330.wav */
+ {15,-18,20,-22,25,-28,31,-35,38,-42,47,-52,57,-63,70,-76,84,-91,97,-95,51,-395,348,-546,384,-515,230,-347,78,797,314,1274,475,2177,1227,-4216,-2348,10076,258,3084,3609,6149,5472,3566,-4049,-1019,5212,3739,-5321,-3637,-1580,2270,1066,-633,-1395,-136,1340,-32,75,-243,507,-628,158,108,-226,-702,-291,-112,-126,-404,-330,-254,-212,-362,-151,-436,-14,-424,-215,-583,-44,-508,-144,-379,-62,-360,-158,-295,-27,-305,-69,-339,-66,-367,-167,-326,-112,-361,-177,-468,-151,-402,-103,-407,-145,-397,-208,-387,-142,-366,-207,-368,-232,-411,-224,-349,-159,-358,-152,-366,-101,-313,-105,-307,-196,-327,-268,-341,-250,-319,-245,-350,-228,-325,-151,-267,-108,-294,-109,-251,-84,-251,-104,-207,-91,-253,-103,-244,-91,-252,-85,-272,-130,-311,-129,-241,-94,-173,-90,-147,-80,-140,-35,-126,-79,-186,-118,-197,-120,-210,-155,-272,-176,-269,-156,-268,-151,-277,-170,-275,-153,-283,-181,-265,-186,-257,-194,-217,-154,-209,-128,-189,-106,-201,-80,-156,-34,-154,-17,-151,12,-97,27,-70,9,-39,-39,-3,-46,-29,-50,-61,-28,-93,-9,-89,-8,-103,1,-74,-1,-70,-9,-35,-44,-51,-51,-29,-31,-30,-13,-35,10,8,7,-4,11,13,35,12,38,37,49,36,56,47,69,81,52,69,15,90,11,52,-17,56},
+ /* IRC_Composite_C_R0195_T165_P330.wav */
+ {-38,38,-39,39,-39,40,-40,41,-42,43,-44,46,-47,49,-52,55,-59,64,-70,79,-90,108,-143,381,-197,374,-312,378,-424,566,-428,1134,331,1309,501,1274,2077,-920,-3821,4175,5452,953,5098,2533,5399,3026,943,-4554,1848,1742,-912,-4176,-875,-267,1882,-418,-1283,-863,1021,217,-28,-198,445,-494,-277,-183,13,-551,-347,-206,-115,-218,-241,-334,-209,-134,-196,-318,-365,-189,-242,-376,-315,-159,-285,-247,-217,-119,-295,-192,-233,-63,-298,-72,-221,-78,-309,-142,-336,-207,-384,-220,-389,-223,-371,-217,-392,-165,-378,-175,-375,-156,-391,-200,-346,-196,-386,-169,-293,-171,-325,-127,-312,-180,-413,-244,-413,-275,-437,-268,-434,-258,-381,-194,-377,-183,-352,-126,-339,-126,-286,-92,-262,-50,-229,-59,-226,-70,-231,-92,-226,-106,-251,-108,-219,-79,-217,-73,-199,-48,-168,-54,-223,-113,-224,-121,-228,-134,-243,-180,-267,-148,-265,-176,-290,-166,-274,-160,-279,-151,-277,-159,-262,-146,-233,-125,-202,-129,-198,-90,-162,-74,-165,-69,-153,-33,-141,-13,-136,2,-114,40,-123,47,-102,43,-95,48,-108,50,-112,44,-100,32,-92,18,-95,22,-82,17,-82,23,-102,19,-84,22,-128,24,-87,44,-69,35,-66,63,-29,79,-26,54,-19,109,-9,110,-5,137,-8,111,4,120,34,92,-13,96,-16,93,-54,92},
+ /* IRC_Composite_C_R0195_T180_P330.wav */
+ {-26,26,-26,25,-25,25,-24,23,-23,22,-21,20,-19,17,-16,14,-11,8,-4,-1,7,-15,27,-46,89,61,-145,147,-71,284,-270,217,-379,526,177,1579,111,1304,-624,3003,-1570,-1854,2371,5215,2766,3717,2594,2071,4289,53,-1269,-2397,2282,-1207,-426,-1536,-96,41,749,-948,-416,181,838,-208,144,-15,-109,-323,76,15,16,-276,4,-8,-1,-123,-108,-209,-91,-130,71,-58,-162,-230,-119,-177,-166,-207,-161,-106,-120,-36,-71,-88,-115,-141,-23,-102,-161,-225,-242,-194,-306,-250,-347,-260,-382,-276,-340,-235,-319,-231,-283,-196,-267,-199,-293,-242,-296,-261,-227,-164,-163,-202,-268,-256,-325,-304,-440,-389,-451,-306,-367,-292,-374,-282,-281,-248,-233,-251,-211,-225,-190,-161,-223,-149,-241,-144,-229,-124,-173,-155,-158,-194,-95,-175,-83,-151,-123,-82,-138,-35,-195,-70,-203,-140,-178,-222,-181,-287,-200,-285,-259,-281,-289,-246,-302,-246,-260,-227,-227,-242,-189,-224,-180,-220,-169,-184,-146,-121,-121,-86,-121,-59,-86,-47,-78,-63,-71,-90,-66,-82,-53,-82,-82,-54,-72,-16,-90,-24,-88,-44,-31,-45,-32,-70,-43,-25,-59,-33,-76,-24,-59,-46,-55,-45,-56,-56,-64,-32,-54,-6,-57,-1,-22,23,2,9,-2,35,54,34,72,22,84,15,94,10,75,34,67,47,21,57,14,36},
+ /* IRC_Composite_C_R0195_T195_P330.wav */
+ {19,-19,19,-20,20,-21,21,-22,23,-23,24,-24,25,-26,26,-27,27,-28,29,-29,30,-30,30,-29,28,-25,18,14,179,64,-45,11,282,14,-136,-276,1166,711,738,-60,1508,162,166,165,449,1532,5355,3392,931,2171,2302,2446,-1456,-644,-2020,1267,216,-603,-1662,-126,427,-150,-158,310,15,459,-99,240,14,137,-140,123,54,92,-77,39,37,33,-11,20,88,136,-9,51,-50,-40,-148,-156,-244,-108,-193,-138,-117,-78,-113,-124,-103,-88,-193,-190,-214,-191,-267,-312,-314,-321,-363,-318,-371,-313,-329,-304,-279,-293,-244,-274,-270,-284,-268,-270,-226,-229,-218,-220,-244,-283,-323,-321,-343,-387,-412,-395,-369,-338,-385,-339,-361,-243,-279,-233,-263,-196,-226,-166,-214,-179,-210,-188,-205,-188,-194,-186,-176,-189,-187,-188,-151,-148,-132,-148,-138,-144,-161,-155,-165,-177,-165,-222,-217,-269,-237,-294,-251,-318,-235,-297,-234,-275,-203,-229,-195,-221,-176,-219,-151,-204,-120,-189,-136,-166,-97,-148,-79,-121,-68,-94,-95,-78,-72,-67,-80,-75,-79,-69,-70,-61,-76,-83,-71,-84,-52,-102,-40,-87,-65,-74,-59,-59,-44,-53,-35,-32,-38,-24,-30,-33,-41,-31,-32,-32,-53,-10,-53,7,-39,3,11,-3,30,29,44,32,63,46,79,39,81,48,51,38,73,36,50,22,77,-11},
+ /* IRC_Composite_C_R0195_T210_P330.wav */
+ {4,-4,4,-4,4,-4,4,-4,4,-4,4,-4,4,-4,4,-4,4,-4,4,-3,3,-3,2,-2,1,0,-1,4,-7,14,-37,-66,67,-14,-33,-186,91,-96,90,124,958,676,187,107,-283,310,1299,1265,1017,1358,3762,3924,898,885,85,1188,235,180,-1266,-91,662,-183,-222,-323,535,278,681,120,382,366,409,299,413,216,314,49,299,205,244,15,349,134,369,-25,355,37,155,-122,149,-90,17,-126,0,-119,-101,-98,-45,-101,-108,-137,-41,-165,-128,-190,-90,-220,-248,-213,-218,-183,-289,-234,-287,-213,-287,-181,-291,-252,-334,-216,-249,-215,-305,-231,-259,-234,-279,-267,-321,-303,-381,-272,-334,-278,-372,-241,-327,-217,-356,-191,-320,-190,-311,-163,-271,-146,-273,-141,-249,-181,-245,-176,-249,-177,-262,-171,-258,-201,-269,-174,-249,-165,-249,-157,-236,-157,-222,-150,-201,-185,-232,-186,-231,-212,-272,-199,-268,-197,-269,-185,-248,-203,-236,-188,-226,-202,-206,-202,-200,-198,-175,-174,-139,-154,-129,-144,-119,-116,-115,-116,-101,-118,-88,-110,-115,-124,-128,-104,-139,-117,-161,-110,-128,-96,-116,-100,-91,-78,-46,-54,-38,-54,-28,-28,-31,-22,-47,-22,-45,-45,-34,-47,-26,-63,-19,-69,15,-46,17,-34,36,-7,28,11,12,21,18,27,33,12,47,14,27,2,38,-2},
+ /* IRC_Composite_C_R0195_T225_P330.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,2,-68,-59,-5,-96,48,-93,-175,-114,61,113,32,173,565,369,-5,6,42,629,908,1232,1079,1509,2842,2279,709,505,658,652,456,31,-132,16,714,22,392,243,724,581,610,769,414,780,295,589,257,440,139,342,210,326,138,213,205,269,65,206,39,192,-75,77,-72,119,-93,32,-98,-25,-124,-61,-115,-124,-100,-152,-32,-169,-66,-171,-60,-174,-142,-204,-153,-209,-250,-258,-282,-284,-268,-319,-270,-333,-243,-293,-243,-293,-258,-255,-244,-253,-268,-246,-247,-251,-255,-254,-239,-252,-237,-244,-241,-235,-232,-243,-208,-257,-193,-268,-204,-268,-227,-248,-235,-265,-257,-230,-233,-218,-240,-222,-215,-193,-210,-173,-175,-183,-176,-191,-180,-202,-196,-223,-223,-252,-229,-258,-254,-257,-250,-252,-220,-262,-227,-250,-215,-243,-223,-230,-208,-202,-158,-170,-134,-160,-123,-166,-123,-164,-100,-174,-109,-180,-112,-164,-109,-168,-131,-171,-106,-158,-104,-162,-121,-153,-114,-132,-112,-125,-95,-82,-74,-52,-73,-50,-54,-44,-32,-38,-20,-57,-17,-36,-14,-46,-36,-11,-10,-23,-34,-7,-16,7,-20,-30,-21,-13,-19,-3,-32,-10,-25,9,-16,17,18,-2,23},
+ /* IRC_Composite_C_R0195_T240_P330.wav */
+ {6,-6,6,-6,6,-6,6,-6,7,-7,7,-7,7,-7,7,-7,7,-7,7,-7,8,-8,8,-8,8,-8,8,-8,1,-47,-37,-124,-93,-95,-58,-38,-70,-58,-105,-121,-151,-76,14,175,104,51,147,291,191,-40,158,429,1090,1311,1373,1241,1326,1526,1181,419,583,828,657,621,656,466,551,572,739,747,685,612,423,667,583,601,619,480,483,323,428,299,276,192,162,105,83,89,89,51,98,-46,97,-2,117,-65,34,-69,1,-69,-69,-127,-170,-131,-173,-121,-145,-147,-134,-204,-102,-232,-83,-273,-123,-325,-159,-309,-183,-275,-249,-249,-252,-185,-266,-178,-245,-201,-259,-208,-248,-243,-270,-238,-253,-227,-254,-209,-249,-203,-269,-184,-271,-141,-258,-121,-230,-113,-188,-120,-198,-167,-178,-200,-214,-242,-233,-264,-244,-276,-244,-267,-267,-261,-267,-239,-274,-233,-272,-226,-277,-260,-268,-247,-282,-253,-289,-226,-270,-213,-255,-189,-247,-158,-192,-146,-173,-170,-171,-177,-143,-184,-151,-187,-146,-147,-141,-154,-121,-150,-139,-166,-139,-155,-135,-176,-141,-174,-144,-174,-160,-177,-162,-156,-152,-157,-114,-126,-89,-103,-86,-98,-78,-68,-62,-53,-84,-35,-53,-7,-51,-15,-38,-6,-34,-13,-34,-15,-32,-28,-35,-19,-32,1,-19,7,-27,9,3,4,-14,3,-5,36,2,41},
+ /* IRC_Composite_C_R0195_T255_P330.wav */
+ {-1,1,-1,1,-1,1,-2,2,-2,2,-2,2,-2,2,-2,2,-2,3,-3,3,-3,3,-3,4,-4,4,-5,5,-6,7,-8,10,-13,22,-83,-97,-106,-152,-99,-59,-90,-92,-128,-74,-117,-122,-12,68,86,137,156,199,190,329,533,767,1036,1233,1574,1651,1491,1169,954,781,906,1168,950,370,704,786,629,605,494,653,561,698,550,738,501,619,385,441,218,218,189,132,100,39,147,27,91,-38,77,-24,27,-36,-30,-17,-41,-95,-49,-122,-68,-169,-78,-186,-103,-225,-135,-197,-120,-153,-145,-183,-142,-167,-150,-231,-159,-244,-153,-214,-165,-219,-193,-224,-173,-215,-157,-238,-162,-231,-149,-238,-155,-243,-185,-203,-182,-175,-206,-184,-214,-165,-184,-162,-168,-165,-138,-160,-133,-192,-158,-236,-216,-272,-273,-290,-295,-306,-316,-279,-301,-261,-303,-259,-299,-287,-289,-292,-273,-302,-247,-283,-207,-253,-202,-230,-201,-189,-205,-172,-192,-162,-193,-165,-169,-166,-191,-174,-179,-167,-155,-172,-157,-151,-142,-148,-140,-156,-161,-162,-168,-167,-172,-156,-177,-164,-174,-152,-168,-156,-171,-153,-173,-152,-171,-139,-162,-124,-144,-85,-111,-53,-108,-40,-71,-33,-75,-21,-62,-20,-68,0,-50,5,-37,-3,-30,28,-23,3,-23,12,-19,28,-12,24,-5,41,17,24,-7,17,-24,23},
+ /* IRC_Composite_C_R0195_T270_P330.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-2,3,-127,-152,-188,-165,-160,-178,-195,-131,-72,-37,-53,-57,-34,48,106,135,127,188,385,765,884,1201,1389,1575,1756,1541,1264,1282,908,615,982,1053,498,403,667,706,647,681,663,732,712,700,422,527,505,426,401,192,156,184,190,100,26,-34,55,-50,19,-119,28,-59,-54,-94,-103,-24,-139,-24,-165,-13,-154,-5,-159,-81,-104,-118,-99,-136,-98,-118,-106,-89,-142,-101,-168,-112,-178,-178,-148,-180,-114,-217,-134,-255,-104,-252,-140,-238,-148,-235,-187,-236,-202,-242,-197,-183,-140,-137,-108,-143,-129,-142,-128,-211,-166,-246,-182,-269,-212,-271,-233,-292,-267,-287,-263,-282,-269,-312,-249,-304,-257,-293,-240,-287,-230,-257,-242,-248,-234,-224,-236,-219,-241,-188,-227,-176,-221,-206,-210,-185,-185,-166,-179,-163,-176,-164,-168,-164,-186,-168,-180,-154,-159,-141,-142,-150,-142,-147,-152,-145,-159,-150,-168,-167,-187,-177,-186,-176,-192,-163,-197,-167,-186,-164,-170,-159,-148,-137,-112,-102,-104,-88,-70,-56,-50,-28,-30,-11,-12,-16,-10,-21,-31,-4,-26,2,15,8,10,-3,-2,5,10,12,-9,0,-5,9,-13,-19,-29,-16},
+ /* IRC_Composite_C_R0195_T285_P330.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,2,-2,3,-6,13,-111,-184,-215,-184,-140,-139,-179,-220,-168,-247,-124,1,-91,-84,42,-80,17,-54,56,218,634,881,967,1181,1587,1636,1273,1643,1650,702,357,915,823,759,711,555,754,615,798,685,720,707,793,638,630,510,595,460,429,211,188,178,148,102,16,162,0,142,-40,140,-32,103,24,-7,-30,11,-24,-1,-87,12,-168,51,-103,64,-105,39,-118,10,-91,-91,-119,-125,-90,-149,-75,-130,-138,-153,-195,-185,-254,-205,-313,-223,-303,-243,-266,-224,-223,-230,-188,-216,-155,-167,-129,-140,-137,-102,-110,-74,-146,-82,-177,-89,-192,-110,-215,-160,-231,-232,-220,-242,-237,-262,-238,-271,-237,-259,-263,-234,-261,-228,-278,-222,-281,-252,-268,-270,-265,-263,-228,-244,-187,-230,-176,-214,-164,-194,-141,-175,-152,-173,-143,-161,-171,-179,-174,-184,-157,-194,-163,-211,-148,-196,-144,-205,-158,-219,-155,-190,-162,-178,-166,-174,-156,-186,-169,-200,-161,-200,-167,-208,-167,-218,-158,-186,-143,-155,-119,-123,-104,-117,-86,-101,-54,-82,-39,-73,-25,-68,-7,-55,-18,-42,23,-14,19,-21,7,-24,19,-4,2,-14,7,-10,12,-14,13,-7,26,-23,8,-14},
+ /* IRC_Composite_C_R0195_T300_P330.wav */
+ {-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,4,-4,4,-4,4,-4,4,-5,-62,-157,-83,-247,-284,-202,-303,-294,-235,-54,-305,15,156,241,-112,-479,-226,774,-232,495,1765,1236,1265,2221,2705,1763,850,505,963,731,757,546,519,206,795,441,708,577,742,596,545,491,526,666,413,377,307,300,457,188,260,34,250,133,251,58,87,249,132,194,-1,200,55,156,95,139,122,50,62,57,84,-3,-71,-62,-99,-113,-176,-122,-254,-180,-227,-166,-230,-202,-293,-196,-279,-248,-326,-256,-320,-217,-260,-211,-244,-154,-191,-125,-171,-113,-160,-81,-135,-55,-102,-70,-95,-24,-42,-53,-78,-73,-93,-89,-149,-139,-195,-180,-235,-192,-245,-233,-268,-234,-245,-224,-256,-221,-249,-225,-220,-233,-215,-250,-226,-218,-236,-221,-224,-181,-198,-176,-191,-173,-185,-156,-184,-162,-178,-171,-172,-156,-184,-183,-174,-192,-186,-179,-189,-180,-212,-184,-191,-167,-199,-217,-182,-203,-172,-210,-178,-224,-155,-220,-185,-224,-199,-194,-203,-201,-206,-192,-196,-188,-165,-158,-177,-147,-145,-112,-128,-98,-113,-74,-77,-54,-65,-67,-32,-44,-10,-54,-13,-29,-7,-15,-1,-23,19,-18,10,-27,11,-16,8,2,12,-12,4,-1,37,18,19,17,36},
+ /* IRC_Composite_C_R0195_T315_P330.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-3,-227,-204,-310,-344,-179,-311,-505,-298,-88,-402,115,712,-76,-577,-211,9,558,-404,914,2627,1047,2118,4245,2542,908,788,1382,865,422,674,-11,248,192,1314,191,817,366,966,306,467,192,289,334,100,222,7,227,236,315,254,209,305,479,300,240,335,445,260,199,112,202,84,42,63,85,-45,-100,-80,-73,-157,-181,-120,-209,-167,-259,-161,-262,-234,-281,-209,-243,-208,-221,-245,-173,-195,-197,-241,-151,-201,-166,-240,-132,-182,-104,-150,-85,-104,-75,-148,-59,-141,-36,-144,-33,-133,-71,-89,-7,-47,-109,-70,-108,-44,-152,-113,-164,-122,-182,-216,-170,-212,-172,-263,-155,-228,-178,-252,-176,-207,-200,-242,-206,-220,-204,-208,-195,-218,-188,-193,-156,-217,-159,-200,-119,-211,-133,-181,-131,-177,-169,-158,-166,-171,-195,-175,-181,-214,-193,-224,-184,-218,-204,-219,-183,-222,-197,-222,-197,-226,-215,-204,-205,-207,-216,-212,-210,-224,-222,-213,-210,-205,-202,-194,-174,-155,-148,-134,-144,-126,-89,-101,-75,-94,-84,-69,-47,-37,-69,-67,-26,-35,-13,-29,-17,-23,-3,13,-18,-8,-26,22,-30,20,-15,30,-13,8,-11,23,49,30,39,22,36,16},
+ /* IRC_Composite_C_R0195_T330_P330.wav */
+ {9,-9,9,-10,10,-10,10,-11,11,-12,12,-12,13,-13,14,-15,15,-16,17,-17,18,-19,20,-22,23,-25,30,-50,-332,-388,-131,-617,-214,-313,-733,-659,255,-155,-66,699,-77,-372,-1255,-242,2041,-707,-6,4736,2036,2809,3545,4509,22,-72,1207,1973,-173,508,959,302,542,540,656,123,461,665,400,314,251,504,190,265,35,373,467,91,154,128,447,203,170,90,232,80,149,193,21,-6,-90,-101,-59,-80,-255,-144,-154,-358,-29,-238,-96,-237,-126,-195,15,-288,-107,-147,-89,-276,-120,-223,-134,-174,-181,-152,-158,-179,-71,-138,-116,-177,-93,-189,-60,-206,-162,-159,-113,-111,-150,-123,-93,-106,-83,-101,-52,-113,-43,-99,-10,-99,-66,-88,-58,-127,-64,-152,-99,-152,-144,-200,-127,-259,-116,-227,-129,-245,-98,-258,-94,-239,-152,-227,-154,-225,-147,-242,-169,-202,-172,-212,-140,-232,-141,-182,-139,-168,-130,-205,-127,-137,-140,-176,-175,-160,-166,-171,-205,-188,-193,-212,-199,-238,-185,-248,-173,-246,-186,-227,-206,-245,-184,-218,-210,-235,-210,-228,-175,-238,-206,-213,-189,-196,-171,-200,-159,-123,-146,-114,-128,-128,-81,-88,-83,-80,-52,-124,-70,-58,-40,-45,-69,-50,-10,-13,-16,-42,-4,-25,50,-37,11,-37,37,-4,24,-11,12,-7,33,10,69,29,60,20,87,-1},
+ /* IRC_Composite_C_R0195_T345_P330.wav */
+ {1,0,0,0,-1,1,-2,2,-3,4,-5,6,-7,8,-9,11,-13,15,-17,20,-24,28,-33,40,-47,52,-211,-235,-688,-550,-297,-690,-704,-444,713,-1568,989,470,-39,-1205,323,-714,276,-2380,5748,2929,602,8080,5302,-453,-722,3812,715,-74,-365,1626,369,1163,1544,781,-4,229,668,441,364,676,214,441,36,409,174,565,-210,423,-90,172,-132,46,-99,78,-186,159,-181,96,-244,13,-280,-20,-156,-41,-291,-109,-365,-55,-322,-117,-274,-136,-169,-159,-189,-140,-191,12,-178,0,-295,-70,-206,-88,-236,-75,-169,-78,-191,-95,-204,-87,-146,-66,-185,-107,-238,-113,-249,-119,-185,-98,-187,-131,-176,-95,-137,-31,-142,-17,-163,-50,-120,-40,-114,-19,-100,-43,-142,-64,-163,-81,-167,-107,-184,-140,-220,-122,-200,-146,-203,-155,-165,-178,-177,-198,-166,-175,-153,-160,-161,-178,-163,-171,-143,-138,-136,-139,-146,-131,-151,-132,-167,-143,-153,-146,-165,-157,-219,-159,-215,-151,-222,-190,-225,-204,-218,-208,-214,-189,-218,-191,-221,-190,-214,-185,-216,-196,-215,-178,-200,-217,-218,-194,-162,-182,-170,-189,-185,-152,-157,-123,-144,-122,-111,-99,-99,-89,-76,-63,-81,-56,-61,-31,-49,-85,-23,-30,-14,-9,-21,-45,-18,-1,16,3,5,-5,5,8,-5,64,39,55,37,73,42,56,31,84}};
+
+const int16_t irc_composite_c_r0195_p345[][256] =
+ {/* IRC_Composite_C_R0195_T000_P345.wav */
+ {2,-1,1,-1,1,-1,1,-1,0,0,0,0,-1,1,-2,2,-3,4,-5,7,-9,11,-15,21,-203,-88,-927,-196,-604,-22,-2141,-496,-650,1585,-548,803,-263,412,-5131,5346,-2103,-7267,12288,1672,1403,10338,7456,-3182,-874,2680,1965,-5296,1356,1865,68,-578,2523,1092,1554,2056,2530,1058,1432,379,1062,-82,-380,-971,369,-376,62,-56,669,-390,190,379,537,98,-46,-35,315,348,110,183,491,-38,19,211,170,-22,-231,-125,-221,138,-512,-336,-126,10,-387,-311,-283,-176,-241,-345,-432,-207,-330,-489,-386,-392,-351,-423,-274,-457,-352,-361,-311,-213,-391,-323,-302,-143,-325,-378,-206,-229,-190,-319,-334,-196,-236,-126,-387,-117,-339,-105,-264,-135,-207,-172,-176,-254,-160,-183,-177,-200,-218,-201,-189,-116,-205,-120,-224,-113,-159,-119,-241,-118,-127,-119,-188,-91,-119,-15,-186,-30,-132,28,-213,-19,-166,21,-190,-46,-185,-49,-159,-65,-168,-65,-190,-59,-218,-46,-217,-24,-231,-74,-204,-52,-181,-89,-211,-94,-196,-70,-219,-104,-200,-55,-181,-86,-186,-39,-155,-66,-178,-1,-187,-47,-188,6,-142,-11,-161,-5,-114,-9,-113,6,-145,-7,-123,-21,-161,-34,-116,-47,-173,-82,-145,-76,-157,-72,-137,-75,-186,-79,-163,-31,-131,-17,-156,-51,-99,26,-74,-5,-101,37,-82,48,-83,35,-130,20},
+ /* IRC_Composite_C_R0195_T015_P345.wav */
+ {-8,8,-9,9,-9,10,-10,11,-11,12,-13,14,-15,17,-19,21,-23,26,-30,34,-31,-453,-1036,-33,-665,328,-1202,-749,-1695,-16,154,1160,807,430,-250,202,-9659,9217,1210,-9352,17225,6331,1506,7124,7939,-4308,-4730,1188,3176,-2475,1424,-48,-469,790,3944,1309,680,1752,2484,1048,341,-282,654,-429,-824,-317,110,-114,-77,514,87,-336,314,152,794,-136,169,-632,188,-172,280,-21,-59,-628,-366,-701,125,-342,195,-484,14,-385,142,-203,-25,-63,-111,-438,-237,-144,-19,-603,-408,-283,-225,-622,-635,-157,-385,-331,-577,-30,-389,-404,-427,-106,-226,-443,-405,-162,-392,-396,-469,17,-462,-322,-529,-39,-465,-308,-396,-19,-390,-307,-364,11,-326,-213,-317,-16,-354,-213,-313,-60,-343,-187,-297,-56,-344,-144,-249,-9,-231,-112,-162,-24,-173,-102,-136,27,-150,-25,-210,56,-219,64,-254,58,-220,23,-244,-12,-203,-8,-244,-39,-226,-35,-259,-51,-231,-34,-263,-76,-247,-60,-275,-44,-227,-27,-295,-46,-242,-22,-251,-17,-192,-18,-252,-5,-165,49,-233,62,-170,73,-217,68,-124,45,-174,23,-102,4,-167,36,-98,28,-187,19,-138,2,-165,-15,-133,-54,-155,-42,-139,-76,-178,-15,-149,-36,-176,14,-154,-30,-174,22,-136,-10,-157,29,-146,8,-148,67,-147,48,-150,87,-144,95,-120,68},
+ /* IRC_Composite_C_R0195_T030_P345.wav */
+ {-5,4,-2,1,1,-3,5,-8,11,-14,18,-22,28,-33,40,-47,52,-40,-408,-1246,-239,-636,412,-1166,-641,-1047,-627,-510,85,1903,1495,1980,-2101,-8149,8335,-7570,2561,15248,-2261,7441,12350,8152,-6960,-897,-1312,-80,35,3139,-1223,-111,782,2694,1229,2248,830,1733,-78,616,211,239,-1106,180,-577,174,-80,366,-414,-235,48,899,-101,-343,251,6,-139,-259,84,-149,-439,-392,-377,-353,-641,-180,-347,-645,-512,18,-444,-412,-353,-372,29,-540,-286,-340,91,-270,81,-387,-257,-287,-105,-191,-258,-436,11,-476,-269,-411,-52,-449,-147,-462,-317,-370,-394,-207,-298,-370,-445,-321,-432,-282,-273,-429,-392,-579,-276,-340,-267,-422,-237,-397,-288,-363,-183,-311,-252,-339,-167,-369,-181,-301,-85,-308,-243,-297,-206,-198,-141,-225,-133,-188,-51,-81,-5,-156,39,-131,-42,-137,-12,-105,-59,-165,-33,-91,-103,-131,-61,-132,-15,-166,-70,-196,-74,-136,-77,-240,-119,-181,-167,-207,-153,-210,-116,-267,-128,-236,-136,-218,-68,-191,-86,-215,-66,-87,-41,-115,-57,-149,39,-73,32,-134,21,-60,58,-96,16,-33,13,-37,-10,-59,0,-62,-11,-108,-26,-126,5,-173,-25,-133,-22,-188,-62,-152,-27,-144,-75,-133,-61,-105,-49,-114,-43,-128,-43,-94,-30,-105,-18,-125,-14,-97,30,-123,23,-65,42,-66,35,-56},
+ /* IRC_Composite_C_R0195_T045_P345.wav */
+ {-8,9,-9,10,-11,12,-14,15,-17,18,-20,23,-26,29,-32,27,-914,-992,248,-1147,746,-600,-1411,-744,-565,-282,187,2409,2683,-221,-1093,-6934,4033,-4276,11276,-297,4328,20553,5592,-1738,-1835,48,-2700,3273,333,-1462,-612,3497,663,1061,1222,2492,754,1168,-36,273,-1174,-272,-1054,891,-844,132,-415,315,-117,257,-335,440,-662,37,-141,164,-657,106,-514,-245,-612,-181,-587,-119,-354,-272,-370,70,-460,-182,-631,-316,-708,-110,-803,-99,-670,-498,-427,-54,-498,-454,-369,-295,-361,-311,-286,-279,-189,-173,-337,-51,-132,-118,-321,-115,-360,-197,-296,-134,-359,-223,-370,-154,-278,-322,-354,-297,-436,-355,-372,-287,-465,-352,-358,-269,-478,-297,-336,-244,-461,-251,-336,-244,-377,-295,-277,-241,-357,-246,-212,-210,-283,-149,-224,-96,-233,-70,-163,-39,-261,-32,-98,-58,-219,-32,-96,-67,-134,7,-101,-50,-139,18,-115,-50,-164,-70,-125,-101,-200,-71,-185,-130,-181,-136,-176,-132,-203,-147,-173,-138,-199,-159,-176,-127,-141,-96,-163,-71,-143,-38,-126,-27,-77,-59,-103,5,-43,-32,-25,-36,-5,-42,40,-34,18,-45,1,-59,7,-47,-28,-49,-55,-63,-33,-55,-79,-59,-82,-109,-94,-40,-81,-89,-121,-82,-83,-49,-111,-62,-79,-97,-59,-52,-74,-97,-50,-98,-31,-116,11,-85,32,-106,43,-88,79,-70},
+ /* IRC_Composite_C_R0195_T060_P345.wav */
+ {2,0,-1,2,-4,7,-10,13,-18,24,-33,46,-69,124,-1066,18,-1103,-58,-112,-921,-201,357,-2572,-292,84,3712,705,1846,-3182,733,-1997,-2694,2428,-595,23701,7754,-2253,5078,3945,-1381,793,-3491,-1163,3714,3613,-2506,296,680,1730,1310,1740,569,508,99,-722,-392,-453,-871,66,-328,-669,-71,-484,-147,-35,146,49,-532,-397,-139,-139,-522,-373,-116,-571,-415,-445,-69,-274,-275,-429,-422,-271,-360,-287,-382,-22,-407,-385,-428,-388,-334,-422,-213,-696,-500,-450,-310,-488,-360,-442,-369,-341,-387,-436,-315,-312,-227,-524,-284,-360,-145,-448,-103,-329,-255,-335,-170,-226,-169,-275,-186,-277,-175,-313,-153,-328,-106,-340,-187,-359,-196,-395,-186,-410,-204,-401,-242,-445,-212,-399,-269,-333,-214,-369,-275,-249,-157,-224,-209,-240,-93,-196,-87,-134,-136,-170,-118,-141,-152,-108,-143,-171,-122,-121,-75,-167,-118,-171,-34,-161,-63,-166,-73,-182,-54,-115,-102,-170,-130,-176,-78,-151,-106,-187,-132,-212,-115,-143,-110,-184,-158,-155,-100,-103,-72,-126,-49,-120,-26,-63,20,-83,6,-50,25,-17,26,-29,39,-31,8,-37,34,-77,20,-77,4,-80,-26,-93,-19,-70,-86,-71,-70,-82,-94,-51,-114,-61,-80,-78,-73,-90,-68,-70,-42,-80,-51,-78,-111,-16,-79,-18,-107,-18,-114,-3,-27,-1,-36,-19,-21,-10,39},
+ /* IRC_Composite_C_R0195_T075_P345.wav */
+ {13,-13,13,-13,13,-13,13,-14,14,-14,14,-14,13,-149,-486,-602,-335,-455,-212,-518,0,-1171,-540,-311,1579,3683,3360,-5772,-426,-1232,-715,5798,-5995,21017,15656,-2523,-3222,5350,1893,1313,-2953,-885,4326,1209,-279,-1161,869,861,1767,953,-85,210,-139,-663,-17,-553,268,-673,-215,-760,-236,-646,-139,-393,-427,-462,-55,-562,-131,-287,-193,-567,-273,-625,-345,-491,-150,-487,-111,-512,-283,-603,-50,-418,-328,-443,-111,-346,-355,-349,-35,-305,-248,-516,-491,-547,-144,-443,-470,-467,-394,-484,-216,-365,-370,-505,-259,-440,-318,-386,-196,-476,-376,-474,-304,-362,-195,-334,-380,-413,-292,-310,-213,-289,-263,-333,-155,-255,-179,-252,-180,-265,-153,-285,-190,-264,-147,-236,-237,-304,-248,-194,-182,-204,-186,-250,-173,-172,-144,-229,-114,-172,-167,-183,-136,-161,-106,-122,-161,-186,-139,-156,-91,-182,-139,-216,-134,-193,-139,-180,-115,-198,-155,-201,-90,-175,-115,-207,-160,-200,-119,-149,-119,-195,-93,-130,-96,-135,-84,-130,-121,-106,-85,-107,-61,-110,-53,-77,2,-45,-15,-51,-20,4,33,-23,-40,-36,1,-53,16,-46,-46,-69,1,-46,-34,-47,-35,-46,-45,-73,-11,-76,-35,-107,-21,-105,-57,-70,-68,-101,-73,-74,-59,-95,-48,-78,-69,-89,-82,-50,-61,-44,-75,-23,-52,-44,10,-43,-23,-47,63,-13,31,19},
+ /* IRC_Composite_C_R0195_T090_P345.wav */
+ {-40,45,-52,60,-69,79,-92,108,-129,156,-197,267,-462,-149,208,-635,-826,268,-390,-920,244,-62,-1260,-320,2937,4521,-564,-4829,2706,-6796,9962,-6783,6356,23745,4526,-4606,-155,5413,3814,-1343,-3207,4343,2939,-733,-2665,998,738,1892,332,-416,-415,112,-618,265,-680,-48,-750,405,-729,216,-673,-99,-730,-121,-855,-310,-693,-146,-680,-198,-695,-260,-522,-283,-523,-143,-597,-333,-173,-342,-516,-211,-519,-364,-344,-136,-671,-213,-411,-202,-398,-103,-578,-290,-294,-138,-306,-230,-402,-283,-321,-289,-337,-289,-473,-414,-279,-358,-413,-275,-431,-453,-313,-307,-448,-301,-341,-461,-354,-322,-417,-358,-269,-383,-284,-242,-302,-305,-257,-285,-308,-182,-268,-314,-270,-212,-228,-190,-249,-276,-158,-168,-143,-161,-146,-207,-91,-103,-158,-110,-126,-88,-73,-13,-110,-35,-46,-106,-57,-116,-140,-215,-98,-197,-197,-174,-246,-265,-202,-185,-227,-181,-218,-214,-125,-146,-175,-178,-153,-217,-80,-87,-137,-151,-98,-122,-94,-88,-136,-141,-168,-115,-121,-70,-143,-102,-56,-76,-36,6,-27,-49,15,48,-26,23,-19,19,-21,34,-59,8,-22,-47,2,-38,-69,-64,-5,-74,-105,-59,-66,-97,-94,-96,-78,-97,-52,-113,-64,-142,-56,-66,-39,-129,-40,-66,-56,-70,5,-96,-30,-55,4,-41,13,-55,20,-26,32,-22,71,-18,17,30},
+ /* IRC_Composite_C_R0195_T105_P345.wav */
+ {-67,70,-74,77,-81,86,-90,96,-101,108,-115,124,-133,69,-792,-387,271,-596,-717,859,-864,-953,-174,2178,-1005,1282,2249,6443,-10856,1162,-3444,7735,12493,-6470,12789,13090,-1110,-7098,1720,6128,6522,-3157,-2418,823,2649,-1545,-82,75,412,176,-227,-1102,-27,27,-108,-705,430,-492,-144,-623,458,-659,-400,-488,-145,-709,-561,-722,-446,-592,-392,-773,-320,-376,-219,-435,-230,-433,-344,-257,-282,-422,-405,-416,-298,-443,-368,-500,-217,-519,-166,-433,-279,-366,-130,-440,-244,-224,-238,-388,-222,-308,-238,-178,-169,-397,-297,-264,-256,-355,-298,-417,-426,-330,-305,-333,-364,-344,-434,-356,-283,-355,-382,-364,-318,-364,-236,-292,-356,-334,-239,-297,-263,-218,-274,-335,-226,-222,-269,-272,-264,-249,-207,-170,-177,-194,-173,-129,-105,-104,-107,-136,-46,-4,64,55,23,-30,-30,-40,-113,-234,-240,-226,-142,-197,-242,-304,-222,-141,-127,-177,-202,-148,-92,-95,-154,-222,-191,-141,-114,-142,-174,-129,-161,-67,-128,-34,-186,-89,-116,-46,-141,-77,-118,-122,-94,-41,-91,-117,-59,-17,-48,-43,-49,-43,-26,26,1,-33,-44,-8,1,24,-53,-52,-67,-16,-53,-12,-77,-55,-119,-25,-52,-50,-119,-50,-99,-48,-93,-38,-125,-90,-97,-23,-111,-77,-96,-23,-117,-28,-57,-25,-82,-14,-37,-3,-37,48,-10,30,-29,94,17,67},
+ /* IRC_Composite_C_R0195_T120_P345.wav */
+ {-3,4,-6,7,-9,12,-14,18,-21,26,-32,40,-51,68,-105,-237,-115,-196,-240,-710,503,-404,-299,-610,1573,-1052,1538,3156,4734,-10274,2428,47,3883,7208,-4454,16464,10228,-4264,-5316,5989,6995,2607,-3203,-668,1640,904,-2642,-469,203,1050,-729,-1586,-33,324,-227,138,-165,-76,50,-374,-903,385,-637,-751,-371,7,-958,-172,-379,-347,-638,-287,-600,-251,-397,-596,-514,-222,-363,-323,-357,-509,-371,-223,-433,-356,-378,-472,-223,-149,-381,-362,-256,-360,-249,-245,-414,-343,-215,-318,-296,-253,-281,-260,-186,-267,-334,-184,-218,-221,-298,-323,-280,-235,-266,-346,-291,-364,-250,-269,-330,-407,-337,-288,-297,-291,-367,-331,-313,-227,-277,-310,-324,-354,-249,-294,-307,-326,-246,-243,-266,-239,-219,-134,-170,-168,-181,-178,-179,-104,-105,-182,-117,-16,21,-1,-16,-123,-97,-70,-125,-190,-191,-224,-174,-191,-187,-240,-111,-186,-142,-146,-92,-134,-84,-176,-166,-110,-109,-146,-139,-231,-119,-73,-70,-193,-83,-143,-72,-63,-63,-163,-69,-90,-96,-97,-84,-157,-37,-91,-88,-116,-29,-99,-31,-73,-68,-76,24,-65,-8,-90,-71,-32,33,-119,-46,-74,-20,-92,37,-144,-45,-100,37,-86,3,-132,2,-42,-29,-104,-4,-152,-16,-85,-19,-175,14,-94,-9,-106,-24,-72,42,-77,-27,-22,2,-33,78,-29,-21,21,111,-5},
+ /* IRC_Composite_C_R0195_T135_P345.wav */
+ {-8,8,-9,9,-9,10,-10,11,-11,11,-12,12,-12,13,-12,12,-14,-199,-345,194,-292,-20,-363,219,-924,441,900,798,-558,3720,1651,-3208,-514,-4991,13814,1350,-1342,10873,8019,1098,-3160,1031,6880,5706,-3917,-4208,1661,708,-1088,-1854,-201,229,-177,-273,-648,-82,475,5,-734,169,-151,-581,-653,471,-491,-236,-587,-109,-475,-248,-581,-317,-480,-514,-555,-293,-524,-197,-571,-212,-393,-202,-577,-116,-375,-344,-418,-218,-355,-263,-348,-305,-348,-210,-371,-214,-394,-179,-361,-184,-347,-189,-348,-251,-234,-293,-267,-213,-252,-242,-269,-147,-370,-183,-325,-201,-333,-191,-269,-230,-243,-283,-228,-273,-293,-252,-342,-267,-359,-215,-428,-224,-365,-239,-330,-269,-348,-257,-251,-286,-250,-246,-272,-177,-242,-155,-277,-116,-236,-94,-218,-96,-109,-104,-71,-63,-76,-143,-84,-111,-151,-139,-218,-149,-229,-159,-185,-165,-192,-165,-156,-158,-137,-140,-159,-114,-167,-123,-164,-97,-148,-122,-112,-140,-90,-115,-78,-111,-104,-86,-114,-49,-142,12,-166,-28,-168,-17,-113,-58,-89,-81,-116,-67,-58,-65,-96,-68,-92,-33,-99,-37,-87,-67,-90,-37,-68,-114,-65,-87,-50,-124,-30,-83,-1,-96,-4,-55,-19,-87,13,-80,-10,-90,-5,-84,-42,-79,4,-67,-63,-38,-27,-36,-23,-7,11,-34,14,-18,51,-74,41,9,19,-7},
+ /* IRC_Composite_C_R0195_T150_P345.wav */
+ {9,-10,11,-12,13,-14,16,-18,20,-22,25,-28,32,-36,41,-48,57,-69,92,-187,-93,-65,148,-471,61,62,-108,-513,1146,660,197,907,4643,-2481,-3069,2384,-436,10331,-1444,3529,10790,4133,-3114,1101,5334,2231,175,-4639,-668,1364,-942,-1832,-179,106,-201,-621,-288,256,-14,7,-70,10,-62,-163,-538,-397,250,-662,-393,-549,-98,-597,-308,-388,-216,-452,-393,-291,-335,-411,-150,-445,-160,-290,-89,-416,-142,-299,-403,-360,-239,-271,-373,-246,-311,-338,-233,-221,-259,-317,-192,-311,-255,-207,-237,-276,-272,-275,-277,-233,-252,-250,-181,-293,-170,-245,-207,-274,-163,-258,-249,-201,-205,-239,-243,-229,-292,-303,-216,-288,-278,-312,-241,-345,-256,-284,-302,-346,-258,-265,-246,-271,-236,-265,-215,-277,-207,-240,-196,-255,-168,-178,-155,-144,-107,-152,-110,-104,-74,-180,-121,-180,-122,-196,-144,-245,-129,-207,-127,-182,-107,-225,-82,-192,-124,-217,-97,-227,-156,-196,-108,-174,-119,-141,-77,-130,-30,-126,-49,-162,-24,-161,-3,-167,-53,-117,-53,-120,-68,-81,-70,-85,-45,-100,-52,-108,-40,-95,-39,-123,-50,-123,-64,-117,-58,-114,-101,-106,-61,-84,-90,-69,-81,-96,-40,-52,-52,-64,-50,-43,-17,-37,-37,-34,-28,-67,-18,-49,-26,-48,-2,-23,-34,-24,7,4,-14,13,9,-1,-21,7,5,3,-11,-9},
+ /* IRC_Composite_C_R0195_T165_P345.wav */
+ {-16,16,-16,16,-16,17,-17,17,-17,18,-18,18,-18,19,-19,19,-19,19,-19,19,-18,15,-25,-180,39,144,-199,84,-114,-19,-188,1254,741,544,587,3703,-1657,-2617,2350,59,8499,1392,3068,7765,4121,-1476,-112,3753,-281,908,-3882,-912,-13,232,-1645,225,-231,30,-284,242,364,101,-416,-192,-215,-224,-211,-588,-413,94,-532,-410,-203,-224,-476,-149,-162,-206,-299,-157,-323,-203,-258,-155,-285,-195,-259,-160,-310,-161,-188,-219,-325,-228,-252,-329,-249,-318,-288,-289,-215,-279,-273,-237,-265,-253,-240,-166,-308,-223,-268,-204,-257,-185,-200,-214,-215,-169,-225,-233,-270,-224,-251,-229,-254,-245,-245,-239,-242,-271,-250,-255,-257,-319,-229,-320,-280,-334,-233,-335,-241,-307,-225,-319,-212,-265,-239,-293,-245,-235,-213,-218,-190,-158,-146,-114,-164,-138,-176,-126,-194,-163,-222,-185,-202,-181,-221,-210,-185,-167,-169,-169,-149,-149,-121,-122,-91,-166,-97,-138,-90,-161,-94,-134,-93,-167,-101,-146,-89,-171,-96,-130,-90,-122,-75,-116,-77,-102,-73,-86,-102,-91,-92,-79,-122,-82,-99,-73,-113,-89,-86,-78,-89,-91,-110,-85,-90,-61,-78,-110,-68,-88,-12,-123,-18,-120,12,-117,12,-119,3,-74,28,-74,-4,-63,7,-46,0,-67,7,-52,21,-52,5,-33,17,5,-5,-18,-6,3,-14,-17,-13,-5},
+ /* IRC_Composite_C_R0195_T180_P345.wav */
+ {14,-14,15,-15,15,-16,16,-17,18,-18,19,-20,20,-21,22,-23,25,-26,28,-31,33,-37,43,-53,84,-38,163,-71,-158,103,194,-92,53,482,91,607,1972,2332,-1572,-66,-260,1180,4049,-804,6508,7047,3077,-817,1693,1744,560,329,-3303,313,-242,-704,-831,249,-87,-229,183,93,110,39,-28,-382,-360,-250,-254,-387,-156,-146,-568,-151,-222,7,-192,-113,-168,-1,-224,-13,-332,-98,-241,-68,-295,-42,-210,-57,-298,-57,-251,-128,-317,-192,-299,-254,-305,-255,-341,-262,-251,-237,-260,-298,-266,-251,-226,-202,-261,-186,-262,-164,-227,-165,-247,-142,-218,-142,-250,-192,-303,-264,-330,-282,-325,-281,-325,-258,-295,-215,-312,-214,-308,-229,-274,-251,-309,-306,-294,-311,-271,-299,-256,-284,-250,-220,-205,-223,-287,-266,-239,-195,-135,-147,-134,-149,-99,-176,-199,-275,-263,-263,-286,-264,-295,-223,-247,-187,-176,-146,-128,-120,-103,-115,-67,-85,-89,-116,-143,-100,-117,-73,-127,-58,-97,-32,-121,-65,-147,-77,-157,-103,-172,-126,-140,-135,-140,-152,-146,-132,-154,-119,-152,-105,-161,-118,-130,-105,-117,-95,-88,-108,-66,-84,-63,-104,-55,-48,-36,-55,-20,-46,-8,-40,5,-55,-25,-61,-13,-59,-44,-51,-47,-33,-43,-29,-37,-41,-40,-27,-26,-28,-32,-23,-2,-7,24,-14,-21,-16,-7,-26,-52,-44},
+ /* IRC_Composite_C_R0195_T195_P345.wav */
+ {6,-6,6,-7,7,-7,7,-7,7,-7,8,-8,8,-8,9,-9,9,-10,10,-11,11,-12,14,-15,17,-21,38,-16,75,-220,-59,106,197,-177,5,-30,-104,721,1540,1146,-1007,1149,558,-528,530,189,5406,5771,1722,1227,2989,2251,-549,199,-1093,649,351,-1192,-797,86,474,-276,161,-98,513,-55,324,-259,35,-250,203,-294,-48,-254,-20,-107,43,-102,74,7,58,5,31,16,-81,-113,-13,-32,-61,-116,-90,-161,-57,-141,-149,-200,-221,-127,-211,-175,-301,-256,-303,-211,-249,-283,-281,-255,-186,-218,-164,-228,-189,-224,-141,-185,-133,-235,-194,-211,-160,-216,-234,-256,-252,-243,-263,-310,-294,-327,-270,-308,-298,-307,-298,-251,-283,-236,-306,-260,-308,-239,-300,-271,-297,-271,-265,-262,-234,-272,-265,-257,-272,-222,-275,-166,-216,-116,-201,-132,-209,-165,-253,-247,-300,-289,-266,-286,-274,-274,-215,-180,-166,-157,-142,-89,-78,-66,-105,-65,-95,-58,-92,-79,-99,-64,-63,-57,-120,-89,-112,-118,-168,-135,-190,-134,-199,-134,-197,-155,-189,-166,-196,-156,-193,-139,-163,-148,-164,-142,-130,-130,-110,-101,-105,-93,-75,-95,-30,-101,-23,-80,-12,-54,-3,-54,-21,-40,-15,-43,-40,-44,-53,-61,-41,-51,-45,-65,-44,-54,-43,-56,-70,-49,-64,-4,-42,4,-66,5,-19,28,-23,-34,-32,-54},
+ /* IRC_Composite_C_R0195_T210_P345.wav */
+ {-2,2,-2,2,-2,2,-2,1,-1,1,-1,1,-1,0,0,0,1,-1,1,-2,3,-3,4,-6,7,-9,13,-20,43,-89,-222,10,103,-107,-34,-36,142,-400,-30,464,582,998,189,-102,357,928,-496,3,2407,3014,4127,2156,97,2572,2367,192,-1077,553,225,383,-471,-511,-191,662,222,22,339,294,362,131,306,286,107,75,262,201,100,126,189,137,172,10,156,70,103,-4,-19,-25,-76,-86,-32,-105,-27,-153,-34,-185,-5,-211,-79,-248,-114,-227,-127,-231,-155,-259,-155,-256,-173,-269,-198,-265,-178,-210,-163,-209,-150,-214,-137,-236,-119,-268,-155,-295,-185,-296,-225,-287,-248,-275,-270,-274,-255,-294,-292,-305,-257,-323,-287,-335,-263,-321,-272,-309,-253,-288,-250,-283,-256,-298,-279,-264,-275,-235,-286,-206,-259,-185,-242,-173,-250,-179,-242,-182,-246,-189,-235,-187,-222,-180,-217,-154,-198,-159,-175,-140,-165,-133,-123,-114,-152,-125,-126,-116,-132,-139,-111,-130,-90,-128,-110,-154,-128,-148,-134,-149,-163,-162,-154,-157,-161,-181,-160,-162,-162,-166,-161,-175,-145,-160,-146,-183,-159,-151,-121,-142,-111,-108,-118,-82,-70,-76,-70,-81,-45,-58,-32,-55,-61,-50,-56,-13,-58,-19,-65,-23,-55,-34,-79,-47,-53,-75,-77,-59,-49,-49,-45,-23,-65,-15,-50,-1,-35,-44,-51,-18},
+ /* IRC_Composite_C_R0195_T225_P345.wav */
+ {4,-4,4,-4,5,-5,5,-5,5,-5,5,-5,5,-5,5,-6,6,-6,6,-6,6,-6,7,-7,7,-7,8,-8,8,-8,9,-22,-68,-102,-39,-33,-2,-125,-43,-65,-81,-88,504,491,271,136,50,242,413,575,246,1154,3270,2343,1173,1360,1386,1335,693,41,-16,626,497,-208,385,-141,534,407,815,196,540,538,608,534,497,553,348,395,314,320,191,167,89,75,-22,80,-26,77,-33,113,-103,86,-85,66,-164,-34,-138,-32,-150,-66,-143,-81,-162,-134,-151,-126,-180,-176,-206,-176,-215,-184,-242,-174,-257,-171,-240,-144,-234,-156,-238,-145,-213,-186,-241,-198,-236,-200,-304,-237,-309,-223,-315,-256,-320,-273,-306,-276,-282,-301,-281,-293,-281,-297,-281,-281,-278,-300,-296,-308,-282,-258,-291,-257,-276,-228,-231,-194,-203,-185,-194,-181,-173,-165,-183,-152,-208,-152,-227,-158,-213,-156,-222,-165,-206,-169,-192,-153,-170,-166,-179,-180,-153,-149,-139,-152,-153,-126,-111,-90,-107,-114,-128,-119,-123,-144,-150,-167,-156,-182,-180,-204,-160,-191,-173,-198,-185,-178,-167,-163,-174,-180,-175,-186,-163,-152,-140,-147,-132,-122,-102,-97,-72,-79,-75,-66,-54,-46,-62,-28,-64,-26,-69,-23,-69,-28,-68,-48,-80,-55,-84,-64,-71,-62,-66,-82,-71,-59,-36,-53,-39,-61,-45,-48,-32,-64},
+ /* IRC_Composite_C_R0195_T240_P345.wav */
+ {1,-1,1,-1,1,-1,1,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,3,-3,3,-3,4,-4,5,-7,11,-87,-91,-69,-34,-17,-83,-130,-72,-103,-104,-134,114,-4,-17,85,373,202,-49,-101,219,365,876,782,785,1628,2056,1505,913,728,668,1183,655,491,465,893,831,430,584,712,1020,649,708,723,730,613,504,566,414,315,187,278,133,226,116,259,129,186,116,185,45,88,-32,30,-121,-4,-138,-59,-242,-77,-196,-88,-164,-95,-154,-158,-144,-123,-166,-155,-131,-163,-193,-126,-158,-197,-221,-177,-191,-199,-207,-207,-232,-259,-213,-257,-223,-245,-210,-232,-214,-199,-250,-237,-259,-286,-308,-300,-276,-316,-306,-323,-315,-283,-322,-259,-334,-262,-308,-246,-279,-237,-252,-210,-235,-204,-211,-204,-216,-219,-187,-208,-184,-188,-172,-182,-147,-178,-171,-209,-148,-207,-140,-214,-153,-202,-132,-178,-141,-158,-129,-140,-132,-148,-104,-170,-94,-160,-103,-179,-127,-186,-148,-195,-164,-196,-178,-176,-178,-191,-206,-200,-201,-208,-201,-208,-200,-195,-166,-167,-160,-164,-138,-176,-171,-170,-145,-157,-125,-127,-91,-104,-77,-96,-65,-75,-71,-96,-65,-84,-60,-84,-57,-72,-49,-85,-51,-85,-52,-82,-51,-93,-48,-69,-42,-81,-54,-69,-69,-69,-62,-61,-61,-54,-82,-67},
+ /* IRC_Composite_C_R0195_T255_P345.wav */
+ {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,3,-3,5,-29,-81,-145,-126,-102,-79,-99,-83,-32,26,-25,-104,-85,-9,-133,-67,-57,165,465,613,590,447,814,1074,1050,1231,1480,1384,1691,1545,721,693,1027,967,911,897,961,823,595,850,817,872,522,568,476,335,222,147,215,189,255,142,248,142,175,30,4,8,-59,-17,-77,-20,-108,-60,-97,-148,-132,-187,-115,-138,-127,-111,-127,-113,-156,-101,-162,-102,-180,-108,-179,-120,-179,-195,-199,-229,-185,-270,-215,-278,-237,-258,-241,-261,-210,-244,-198,-260,-213,-287,-247,-340,-255,-344,-240,-343,-221,-330,-201,-299,-199,-288,-250,-262,-234,-258,-219,-245,-213,-243,-209,-226,-210,-206,-229,-185,-199,-171,-204,-168,-186,-151,-175,-154,-197,-147,-168,-130,-180,-149,-171,-122,-158,-129,-152,-132,-156,-139,-160,-164,-170,-174,-154,-162,-126,-151,-134,-162,-148,-177,-191,-199,-212,-200,-209,-220,-215,-220,-217,-209,-214,-187,-188,-163,-169,-145,-176,-134,-160,-141,-157,-132,-139,-118,-136,-115,-131,-104,-132,-107,-134,-96,-102,-76,-89,-80,-83,-80,-72,-65,-58,-64,-74,-61,-66,-46,-79,-66,-94,-77,-85,-74,-86,-77,-80,-67,-80,-78,-81,-61,-58},
+ /* IRC_Composite_C_R0195_T270_P345.wav */
+ {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,2,-2,2,-3,3,-3,3,-3,4,-4,5,-5,7,-13,-9,25,107,159,235,223,228,197,135,148,180,104,249,332,345,533,679,812,953,1029,929,1077,1230,1424,1718,1696,1725,1631,997,986,1012,146,-166,111,353,347,-6,-43,73,193,90,62,-93,-92,-338,-310,-405,-336,-407,-441,-401,-511,-347,-531,-317,-432,-349,-454,-400,-327,-440,-322,-442,-318,-433,-382,-424,-384,-375,-393,-396,-458,-428,-480,-383,-434,-382,-464,-371,-432,-337,-394,-307,-399,-335,-417,-322,-442,-324,-436,-303,-449,-304,-409,-298,-363,-284,-317,-307,-308,-323,-288,-319,-293,-322,-285,-281,-248,-239,-242,-269,-244,-286,-239,-275,-228,-281,-236,-270,-215,-230,-183,-189,-147,-168,-142,-140,-138,-148,-145,-122,-112,-122,-100,-101,-92,-130,-111,-155,-125,-154,-111,-187,-117,-190,-95,-171,-106,-163,-109,-148,-117,-153,-132,-173,-135,-163,-114,-185,-122,-191,-116,-168,-92,-150,-108,-141,-94,-122,-95,-150,-97,-145,-88,-132,-65,-125,-53,-97,-33,-83,-12,-48,-5,-27,7,-11,35,-15,26,-18,26,-29,3,-32,-9,-39,15,11,7,13,12,6,12,11,20,5,2,4,3,-12,-24,-23,-5,-3,-22,4,5,1,4},
+ /* IRC_Composite_C_R0195_T285_P345.wav */
+ {0,0,0,0,0,0,0,0,0,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-2,2,-2,2,-2,3,-3,3,-4,5,-6,8,-11,22,-196,-173,-113,-87,-175,-179,-137,-214,-236,-209,-197,-203,-89,115,94,63,76,-21,-123,-58,550,837,1139,1631,2133,1768,1607,1992,1501,200,482,1172,950,840,796,772,845,1106,940,1271,764,758,561,601,592,456,196,274,22,269,50,133,94,119,18,4,153,30,97,24,85,20,33,14,-38,-26,-152,-46,-172,-60,-155,-115,-148,-198,-89,-195,-112,-261,-100,-214,-212,-183,-197,-150,-219,-140,-179,-164,-230,-178,-187,-230,-226,-257,-158,-281,-201,-228,-189,-261,-210,-220,-259,-267,-256,-233,-276,-267,-249,-227,-294,-254,-243,-276,-267,-297,-257,-292,-260,-305,-245,-279,-264,-243,-230,-212,-214,-151,-148,-130,-127,-88,-74,-103,-75,-88,-67,-122,-69,-96,-106,-123,-96,-146,-128,-172,-140,-152,-152,-190,-154,-179,-153,-191,-155,-209,-127,-197,-114,-197,-134,-193,-131,-195,-130,-172,-126,-176,-158,-191,-169,-206,-154,-203,-183,-230,-172,-205,-185,-204,-179,-196,-157,-166,-116,-150,-115,-126,-82,-123,-71,-85,-83,-83,-68,-72,-63,-78,-79,-49,-75,-79,-92,-70,-98,-66,-95,-75,-105,-104,-85,-82,-92,-105,-73,-107,-87,-82,-75,-79,-91},
+ /* IRC_Composite_C_R0195_T300_P345.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,3,-3,3,-3,4,-4,5,-6,8,-10,16,-33,4,109,115,258,119,96,128,286,309,258,544,795,778,461,339,836,601,406,1682,1975,1154,2276,2834,1223,701,931,69,-668,-254,489,635,-539,173,339,531,396,94,191,-102,150,-127,-75,-251,-176,-409,-489,-562,-686,-623,-666,-571,-644,-520,-569,-434,-437,-442,-489,-355,-376,-438,-545,-399,-497,-467,-538,-479,-549,-412,-479,-420,-458,-466,-435,-392,-372,-360,-342,-413,-353,-363,-348,-419,-344,-451,-370,-415,-367,-468,-389,-500,-406,-491,-367,-474,-360,-481,-350,-435,-296,-421,-285,-402,-267,-363,-222,-350,-221,-334,-215,-270,-177,-235,-146,-214,-118,-175,-89,-140,-81,-133,-96,-92,-54,-91,-56,-86,-58,-64,-32,-51,-40,-76,-57,-55,-36,-113,-96,-83,-105,-91,-129,-152,-109,-131,-124,-142,-150,-156,-119,-136,-143,-152,-125,-140,-130,-126,-129,-99,-125,-119,-110,-121,-109,-118,-102,-117,-98,-117,-101,-93,-114,-105,-94,-69,-112,-75,-86,-60,-49,-25,-59,6,-33,-1,-8,8,-2,17,23,0,29,13,17,24,18,21,18,23,-13,11,-8,15,5,10,-10,8,-24,7,1,-11,1,27,-4,48,5,53,24,86,43,68,50,99},
+ /* IRC_Composite_C_R0195_T315_P345.wav */
+ {1,-1,1,-1,1,-1,1,-1,1,-1,1,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-1,0,6,-137,-110,-314,-483,-264,-184,-467,-482,89,-336,204,277,141,-93,-770,-71,819,-837,1577,3127,1312,2383,3512,2495,-80,350,890,699,71,561,954,294,1113,1117,1259,495,984,849,877,553,746,524,537,393,441,428,542,429,296,210,204,231,133,-55,33,-7,-111,-11,-91,34,-190,-56,-131,39,-14,66,-79,58,-96,105,-60,169,-64,84,-143,118,-100,-84,-157,-91,-304,-233,-224,-201,-251,-259,-309,-306,-307,-286,-299,-265,-407,-357,-301,-345,-348,-313,-294,-342,-334,-338,-298,-266,-288,-261,-298,-254,-268,-227,-236,-260,-244,-223,-227,-260,-233,-195,-202,-171,-228,-156,-170,-114,-170,-107,-146,-105,-89,-96,-83,-40,-73,-59,-66,-65,-71,-53,-107,-74,-75,-92,-122,-102,-105,-87,-130,-86,-139,-115,-142,-131,-148,-147,-160,-144,-151,-139,-173,-139,-186,-126,-170,-147,-194,-137,-189,-141,-184,-162,-186,-151,-208,-180,-195,-172,-186,-165,-204,-165,-157,-155,-139,-132,-141,-108,-126,-89,-110,-98,-101,-113,-94,-111,-133,-99,-126,-121,-126,-97,-115,-103,-122,-84,-114,-58,-120,-106,-109,-97,-103,-75,-128,-91,-104,-73,-91,-53,-59,-46,-63,-33,-22,-14},
+ /* IRC_Composite_C_R0195_T330_P345.wav */
+ {-9,9,-9,9,-9,9,-9,9,-9,9,-9,9,-9,9,-9,9,-9,9,-9,10,-10,10,-10,10,-10,10,-10,10,-7,-378,-458,118,-356,-539,-320,-251,-977,-150,272,171,262,290,-552,-354,-2031,2393,-54,-667,4888,3245,1575,3792,4173,-210,-907,432,1658,-334,338,623,940,723,1598,1314,1216,764,1038,976,401,116,250,473,239,334,528,294,340,65,340,194,348,152,304,92,279,123,93,-24,89,-192,-125,-56,-130,68,194,-86,77,174,220,128,98,-234,-216,-168,-160,-251,-283,-410,-399,-240,-227,-363,-327,-361,-302,-370,-271,-312,-309,-428,-402,-318,-223,-266,-304,-253,-264,-272,-246,-203,-278,-299,-319,-254,-236,-260,-281,-188,-203,-212,-220,-185,-220,-178,-230,-207,-215,-227,-248,-182,-197,-163,-179,-101,-143,-112,-138,-84,-115,-82,-111,-83,-102,-83,-51,-69,-49,-89,-18,-67,-73,-108,-72,-63,-79,-111,-167,-94,-130,-99,-166,-109,-181,-121,-156,-124,-154,-131,-162,-169,-165,-170,-136,-151,-159,-185,-163,-122,-139,-141,-175,-141,-148,-148,-172,-157,-130,-154,-150,-148,-142,-153,-141,-116,-159,-97,-155,-91,-162,-92,-141,-53,-134,-97,-132,-68,-111,-97,-127,-98,-128,-105,-137,-81,-141,-76,-120,-73,-136,-97,-105,-48,-102,-73,-108,-56,-97,-41,-75,-56,-70,-20,-33,-9,-51,-32},
+ /* IRC_Composite_C_R0195_T345_P345.wav */
+ {1,-2,2,-3,4,-4,5,-6,7,-8,9,-10,11,-13,14,-16,17,-19,21,-22,24,-25,25,-22,13,15,-152,-764,140,-602,18,-900,-519,-1092,-545,489,261,706,-1198,1895,-1912,-2689,2900,30,-3177,8188,3071,2405,4243,6073,615,-3233,507,1858,-510,-537,1688,110,230,1724,2185,1547,1263,1871,1145,573,342,-23,261,-614,-9,-121,805,-137,38,285,272,-29,312,280,184,234,346,-32,603,80,194,153,323,-216,458,198,10,-275,28,-275,-40,-248,-266,-416,-305,-349,-213,-336,-338,-460,-267,-400,-247,-403,-303,-379,-264,-460,-298,-347,-227,-420,-309,-405,-246,-238,-250,-319,-267,-250,-266,-221,-240,-318,-184,-236,-175,-305,-161,-225,-161,-213,-190,-219,-158,-206,-155,-198,-165,-211,-169,-178,-141,-180,-148,-191,-154,-191,-120,-222,-141,-171,-68,-131,-104,-142,-95,-72,-93,-71,-91,-94,-90,-92,-83,-97,-91,-117,-108,-109,-102,-101,-101,-116,-95,-82,-119,-115,-158,-119,-137,-108,-151,-151,-163,-123,-125,-148,-167,-118,-168,-149,-196,-146,-169,-130,-179,-147,-164,-153,-114,-109,-119,-128,-121,-82,-111,-89,-98,-81,-102,-105,-71,-85,-85,-116,-85,-98,-76,-124,-102,-118,-107,-84,-126,-141,-114,-78,-80,-110,-127,-121,-93,-112,-96,-109,-98,-90,-55,-53,-66,-54,-41,-26,-18,-19,-5,-33,-57,-33}};
+
+const int16_t irc_composite_c_r0195_p000[][256] =
+ {/* IRC_Composite_C_R0195_T000_P000.wav */
+ {1,-1,1,-1,0,0,0,0,0,1,-1,2,-2,2,-3,4,-5,6,-7,9,-11,14,-20,33,-756,-534,-348,102,-1032,-582,-1506,65,-959,133,-210,1928,576,-291,-5368,5774,-6962,-2265,14308,-3483,7090,10599,2076,-2731,3149,-192,-3412,-1652,3866,548,-1226,-1088,2012,2077,1960,-209,1087,1404,1871,1150,1665,536,626,1200,1268,592,-114,-160,-95,133,-37,-246,158,-144,-190,-548,421,96,105,-192,181,129,158,143,73,-164,-261,-64,-147,-128,-55,-166,-60,98,349,-253,126,-172,110,-391,-118,265,-317,256,-97,416,-62,274,-244,-355,-104,-427,-357,-741,-368,-489,-365,-418,-498,-150,-384,-361,-530,-257,-297,-381,-491,-511,-393,-429,-294,-395,-373,-408,-292,-342,-260,-297,-286,-427,-324,-291,-291,-276,-319,-244,-386,-221,-241,-141,-260,-273,-231,-153,-86,-203,-202,-152,-95,-140,-176,-127,-110,-156,-237,-148,-139,-94,-248,-190,-202,-85,-155,-205,-223,-169,-158,-183,-216,-167,-164,-146,-219,-103,-162,-71,-220,-10,-169,7,-134,32,-76,-42,-100,-66,-50,-44,-71,-88,-122,-40,-75,21,-78,-18,-125,-33,-69,53,-77,-22,-138,-41,-62,-55,-92,-83,-99,-115,-150,-17,-53,-12,-184,-50,-96,28,-81,-1,-78,-41,-118,-14,-66,38,-82,-29,-104,29,5,34,-62,14,7,47,-61,67,-43,51,-145,61},
+ /* IRC_Composite_C_R0195_T015_P000.wav */
+ {123,-125,127,-129,131,-133,135,-137,138,-140,141,-141,141,-140,137,-131,122,-106,76,-10,-238,-830,-319,-1069,17,-859,165,-1424,-309,-2002,526,695,3378,-155,-423,-6705,9134,-12025,1719,14823,-7846,16119,11510,-1243,-4202,5454,-1293,-2996,-1156,2894,-853,-440,-59,2319,814,827,428,2620,1829,1181,817,1748,469,1133,599,1385,-490,316,-1523,369,-621,391,-835,160,-740,77,-149,751,-195,-103,-622,191,-100,342,-303,-90,-465,82,62,259,-409,-385,44,87,-50,21,54,-467,-207,-79,-324,-108,-90,-152,-620,71,-110,47,-749,-161,-523,-153,-446,-157,-336,40,-137,-86,-507,-177,-322,-14,-430,-277,-557,-360,-326,-296,-274,-463,-359,-502,-263,-388,-316,-369,-353,-459,-464,-335,-293,-324,-333,-369,-324,-380,-288,-268,-287,-294,-317,-270,-395,-181,-204,-149,-383,-214,-212,-113,-188,-174,-211,-188,-99,-166,-173,-203,-111,-134,-148,-226,-166,-126,-86,-216,-199,-234,-119,-193,-118,-250,-172,-245,-101,-156,-114,-172,-153,-162,-98,-70,-71,-106,-70,-81,-14,-14,37,-38,-36,-107,-3,-9,52,-91,-63,-116,20,-50,18,-151,-37,-125,57,-97,31,-149,5,-133,4,-141,9,-132,-7,-168,9,-124,33,-144,22,-166,15,-117,46,-156,11,-127,36,-124,23,-58,69,-65,71,-34,110,-36,130,-45,96,-68,96,-59,38,-71},
+ /* IRC_Composite_C_R0195_T030_P000.wav */
+ {-63,66,-69,73,-76,80,-84,89,-93,98,-102,107,-110,111,-108,95,-54,-154,-785,-302,-1153,268,-1139,240,-1422,320,-2283,272,-629,4046,237,3112,-7137,2285,231,-13166,20036,-5068,11914,16533,2581,-5753,2916,1267,-3077,-1961,1642,-123,210,665,1080,1069,485,1122,1846,1948,901,1486,921,1132,470,865,-186,-57,-358,-153,-489,-118,-724,-365,-517,-156,-335,155,-255,96,-315,376,-169,22,-435,5,-544,-35,-484,-12,-457,280,-453,-177,-399,435,-423,-188,-484,161,-217,-38,-732,-416,-157,73,-480,-440,-302,-140,-260,-335,-490,-420,-470,-291,-617,-112,-315,20,-559,-210,-412,154,-162,-102,-453,-225,-205,-23,-247,-203,-409,-147,-366,-147,-367,-150,-477,-326,-502,-222,-390,-294,-498,-249,-423,-313,-510,-239,-382,-176,-516,-351,-496,-92,-337,-150,-462,-212,-366,-74,-288,-94,-322,-110,-334,-53,-240,11,-306,-108,-332,-45,-271,-52,-295,-76,-308,-99,-319,-57,-226,-50,-303,-130,-254,-54,-183,-89,-261,-98,-193,-6,-184,-12,-164,45,-175,27,-120,129,-69,82,-89,120,-26,113,-48,59,-77,18,-85,-3,-107,0,-78,-29,-159,0,-62,67,-139,-9,-138,19,-136,-3,-124,-27,-149,-30,-136,-11,-97,-7,-137,-19,-96,20,-84,15,-64,28,-92,9,15,121,-12,24,-32,74,36,98,-9,3,-30,36,-42,4},
+ /* IRC_Composite_C_R0195_T045_P000.wav */
+ {72,-74,77,-79,82,-86,91,-96,102,-111,121,-134,152,-179,228,-635,490,-1252,-114,-1202,742,-1779,495,-1563,532,-2895,2675,1167,4718,-4709,4646,-5559,-6673,7608,-8298,21201,11442,4596,920,5308,-1818,-1353,-1082,-283,-725,2349,-984,-140,614,1696,1859,2003,557,2080,1067,416,1112,525,38,-87,-851,-336,38,-375,-495,-291,-403,-90,-299,-393,-130,-647,-37,-270,-227,-182,-2,-485,-21,-380,-221,-179,-364,-244,-343,-247,-161,-213,-443,-201,-386,-349,-198,-453,-401,-479,-187,-349,-331,-486,-40,-343,-132,-248,-346,-150,-185,-498,-200,-280,-512,-271,-152,-472,-405,-421,-235,-444,-272,-369,-299,-285,-209,-483,-192,-140,-287,-241,-120,-328,36,-232,-275,-345,-26,-488,-78,-319,-205,-488,22,-390,-294,-391,-131,-450,-198,-416,-347,-391,-95,-530,-266,-359,-162,-403,-129,-438,-172,-313,-124,-327,-146,-338,-102,-245,-121,-328,-124,-244,-79,-277,-128,-320,-47,-241,-144,-306,-70,-274,-85,-274,-147,-219,-71,-212,-78,-214,-60,-127,0,-182,-21,-106,67,-97,35,-113,84,16,65,-67,99,-24,79,7,29,-85,99,-35,17,-91,57,-100,58,-112,-18,-130,73,-160,-25,-148,6,-136,45,-217,2,-142,79,-180,64,-198,81,-156,114,-200,98,-162,123,-120,152,-170,176,-85,130,-107,189,-99,158,-113,138,-127,161,-140,111,-221},
+ /* IRC_Composite_C_R0195_T060_P000.wav */
+ {123,-132,142,-153,166,-180,196,-215,238,-264,296,-338,397,-545,-26,-1070,548,-1189,312,-1132,-540,-593,703,-1932,23,1834,2821,3650,-4896,2244,-8990,3547,-3667,11688,19991,4002,-67,5265,-1066,-618,257,-237,-93,2490,-1554,-1096,1601,944,1501,1048,1374,1754,1792,566,335,-350,932,-271,-1525,-771,-646,-466,146,-610,113,-1035,510,-222,-23,-608,-443,-725,203,-887,-434,-589,-19,-438,-40,-610,14,-467,-137,-372,-214,-629,-55,-580,-263,-517,-350,-563,-317,-499,-281,-660,-233,-369,6,-533,-180,-457,-90,-331,-140,-395,-150,-246,-124,-225,-134,-388,-151,-322,-330,-363,-280,-394,-241,-503,-138,-532,-169,-402,-263,-433,-255,-363,-244,-372,-271,-364,-268,-337,-126,-472,-58,-441,6,-373,-75,-345,-91,-290,-171,-369,-128,-311,-189,-312,-183,-241,-230,-309,-78,-303,-168,-337,-178,-236,-164,-270,-238,-313,-113,-261,-195,-270,-208,-224,-136,-312,-153,-332,-79,-287,-193,-257,-149,-227,-124,-297,-82,-209,-107,-181,-87,-173,-18,-146,9,-126,28,-74,-22,-25,22,-50,40,-41,25,-17,-14,5,9,-67,23,-34,57,-46,5,3,37,-39,6,-36,11,-54,-39,-69,-61,-79,-35,-99,-38,-98,-29,-88,-12,-86,-19,-71,-19,-37,-12,-58,7,-41,34,-37,47,-22,42,-26,97,2,68,-13,74,7,35,-6,34,-1,0,-38},
+ /* IRC_Composite_C_R0195_T075_P000.wav */
+ {30,-35,41,-47,55,-63,72,-84,97,-113,134,-162,202,-472,-304,-372,274,-1176,-371,-433,-535,-54,364,-1802,1909,3073,5773,-6217,-2323,-1631,-4047,10163,-533,23315,9574,-7064,764,4451,279,-686,938,2910,-1594,-781,31,2302,-241,1013,1336,1127,1162,699,28,761,380,-426,-314,-917,-750,-202,-732,-632,-472,-517,-73,-213,-19,-699,-215,-440,-368,-595,-354,-716,-262,-604,-448,-306,-492,-226,-481,-404,-393,-315,-472,-290,-442,-401,-227,-459,-350,-606,-194,-594,-308,-438,-436,-423,-217,-461,-220,-298,-300,-185,-218,-342,-120,-282,-142,-260,-82,-276,-46,-282,-219,-258,-93,-447,-193,-418,-296,-377,-249,-479,-177,-358,-304,-416,-185,-366,-179,-486,-287,-406,-134,-512,-167,-454,-201,-352,-195,-386,-169,-289,-223,-334,-186,-280,-123,-302,-167,-268,-36,-301,-139,-264,-133,-195,-111,-276,-131,-175,-123,-195,-148,-226,-77,-211,-165,-231,-123,-257,-132,-285,-135,-289,-147,-278,-141,-274,-166,-238,-154,-189,-134,-212,-101,-127,-6,-142,-21,-106,41,-81,41,-105,54,-54,6,-41,-3,-62,27,-57,-25,-42,29,-39,10,-90,56,-38,43,-106,38,-63,27,-58,-21,-110,-19,-82,-36,-124,-57,-83,23,-113,9,-73,55,-109,34,-55,45,-13,62,-54,27,-33,52,12,35,-34,72,-19,33,-32,74,-59,39,-25,53,1,10,-3},
+ /* IRC_Composite_C_R0195_T090_P000.wav */
+ {-3,3,-4,5,-6,7,-9,11,-13,17,-23,36,-967,38,-432,430,-1179,327,-1275,279,-1297,1913,-1800,360,826,8131,-4106,182,-6660,-1308,8763,-6147,21004,13661,-1493,-3341,815,6070,1330,-1696,3689,487,-871,-2812,2923,1220,319,-441,2019,161,1147,-214,819,-1063,179,-1133,125,-1120,701,-1109,-441,-308,-3,-1227,135,-661,-529,-162,-375,-951,-262,-371,-533,-415,-491,-644,-459,-451,-508,-551,-360,-465,-434,-399,-416,-458,-204,-423,-358,-363,-290,-434,-346,-447,-174,-475,-424,-400,-239,-439,-175,-468,-418,-188,-90,-409,-214,-233,-225,-147,-140,-439,-299,-104,-157,-229,-145,-201,-232,-109,-193,-310,-284,-271,-306,-318,-342,-330,-320,-362,-208,-295,-346,-295,-212,-394,-231,-297,-357,-348,-177,-356,-301,-275,-291,-319,-184,-255,-307,-178,-245,-228,-206,-194,-280,-137,-218,-191,-183,-203,-186,-105,-193,-151,-164,-132,-164,-77,-203,-113,-167,-192,-164,-75,-239,-194,-160,-166,-186,-77,-232,-182,-148,-63,-204,-92,-164,-69,-54,4,-140,-18,-43,36,-61,41,-116,-2,-92,42,-126,-61,-150,-8,-117,-15,-62,-69,-114,61,-14,10,-74,8,-25,119,-37,0,-69,10,-56,37,-94,-111,-86,30,-107,-71,-119,4,-92,38,-125,29,-50,58,-57,64,-84,92,-4,67,-73,54,-8,88,-67,71,21,64,-36,123,-7,23,-36,115},
+ /* IRC_Composite_C_R0195_T105_P000.wav */
+ {67,-63,58,-51,43,-33,19,-1,-24,61,-121,244,-927,183,-686,327,-496,-330,-486,-340,-314,396,182,-1212,1259,6063,-556,-2378,-2582,-3838,9614,-8512,18557,14219,-782,-2750,529,5714,4180,-1314,2811,874,-1413,-2611,2334,2590,-537,-811,436,1284,515,-112,-879,-106,-221,-558,-955,-184,-84,-312,-553,-219,-379,-172,-456,-790,-576,-350,-708,-606,-553,-357,-404,-422,-537,-414,-291,-515,-518,-625,-263,-417,-492,-719,-360,-360,-368,-573,-481,-304,-142,-306,-536,-356,-164,-154,-398,-429,-388,-147,-288,-315,-532,-144,-267,-143,-527,-186,-329,6,-447,-226,-375,20,-329,-159,-444,-77,-329,-143,-450,-93,-327,2,-390,-87,-374,55,-418,-96,-445,-37,-436,-129,-505,-118,-444,-152,-487,-172,-395,-135,-432,-170,-368,-96,-414,-145,-394,-32,-326,-123,-434,-83,-276,-94,-355,-149,-242,-56,-256,-166,-269,-75,-228,-119,-313,-87,-207,-58,-304,-97,-234,-23,-285,-126,-259,-11,-242,-91,-247,-1,-204,-10,-242,-5,-194,74,-169,102,-92,170,-62,135,-93,108,-134,5,-190,-8,-203,-47,-223,16,-187,1,-174,58,-131,78,-113,75,-130,98,-75,44,-121,101,-58,53,-146,47,-70,70,-128,-19,-108,21,-89,-23,-119,-27,-39,31,-124,-51,-37,65,-45,0,4,66,6,17,11,14,30,64,44,27,-16,79,-9,-11,-60,55},
+ /* IRC_Composite_C_R0195_T120_P000.wav */
+ {-76,75,-75,74,-72,69,-65,59,-49,35,-14,-21,85,-263,347,27,-533,-67,-385,-42,-335,645,-2065,1305,1033,1922,-2255,6706,-3555,1838,-9048,1510,15767,522,6485,7416,2582,-1635,-1123,7704,6890,-3746,-2349,-815,4058,-1305,633,-1081,2060,-1086,490,-1435,1038,-465,-103,-1558,594,-576,-246,-797,-411,-729,216,-627,-444,-642,122,-670,-147,-796,-255,-906,76,-717,-449,-584,-119,-685,-337,-606,-352,-326,-478,-502,-420,-468,-445,-428,-466,-351,-293,-513,-155,-443,-243,-371,-82,-573,-58,-388,-209,-303,-195,-394,-165,-220,-376,-192,-262,-255,-289,-234,-278,-284,-271,-328,-227,-325,-185,-358,-162,-289,-168,-301,-148,-278,-221,-237,-227,-212,-236,-164,-236,-223,-147,-209,-256,-222,-209,-360,-125,-328,-206,-254,-219,-307,-162,-296,-276,-174,-324,-187,-268,-155,-286,-159,-317,-134,-252,-195,-181,-236,-204,-162,-148,-226,-141,-227,-132,-141,-218,-189,-165,-114,-288,-111,-256,-76,-252,-50,-308,-80,-158,-63,-217,-126,-102,12,-10,-77,13,74,33,49,-22,50,-56,57,-177,-13,-201,19,-144,-101,-181,59,-32,-49,-45,-72,-16,32,-40,-48,-33,-42,-45,64,-145,8,-69,33,-144,44,-92,56,-118,-2,-60,8,-77,-3,-91,-37,-73,-11,-53,0,-49,56,-45,17,-73,100,6,64,-7,125,-47,94,22,33,-55,12,-30,7},
+ /* IRC_Composite_C_R0195_T135_P000.wav */
+ {-47,46,-46,44,-43,40,-37,33,-28,21,-12,-1,20,-48,94,-206,95,-290,-258,153,-592,203,-293,297,-1153,1348,644,1791,-1433,6094,-3856,-260,-5383,6042,11744,-1699,5991,8208,1865,-2201,2510,6226,4590,-5126,-1361,782,2433,-2030,854,-833,853,-1117,568,-1205,680,-1070,-374,-797,196,-738,-381,-460,54,-509,80,-809,-117,-538,-17,-916,203,-876,-170,-815,-257,-782,-178,-520,-324,-433,-344,-353,-383,-382,-403,-522,-240,-512,-312,-523,-189,-533,-114,-477,-247,-366,-173,-363,-247,-204,-351,-273,-220,-239,-329,-247,-257,-330,-207,-331,-212,-342,-200,-298,-246,-261,-277,-228,-264,-213,-328,-212,-273,-219,-256,-244,-234,-265,-159,-264,-191,-244,-157,-229,-190,-221,-203,-203,-265,-198,-238,-189,-235,-164,-189,-220,-183,-216,-189,-257,-194,-227,-199,-234,-209,-214,-214,-195,-212,-179,-255,-200,-207,-151,-257,-182,-194,-172,-200,-169,-219,-215,-208,-180,-207,-192,-215,-173,-203,-137,-219,-101,-232,-121,-175,-4,-148,-45,-92,5,-35,0,-5,-45,0,8,10,-53,-107,-5,-81,6,-157,3,-130,19,-128,39,-138,5,-65,57,-90,7,-52,45,-79,13,-78,29,-109,14,-79,25,-126,7,-61,-11,-75,1,-51,-46,-64,-35,-74,-40,-48,36,-46,3,-64,53,-59,33,-26,105,4,63,13,64,-28,24,-1,3,-80,-21},
+ /* IRC_Composite_C_R0195_T150_P000.wav */
+ {-5,6,-7,7,-8,9,-10,11,-12,13,-15,16,-17,19,-20,20,-17,1,-234,227,-421,117,-50,-175,-40,33,-222,178,1388,586,910,1027,4228,-7050,1223,2017,6153,4669,1121,8628,6102,-3597,1339,6488,2001,-1618,-2670,715,665,-9,-1202,163,-501,22,-977,268,-483,330,-922,182,-469,62,-791,-223,-334,-215,-485,-347,-491,-176,-429,-178,-696,-63,-705,-191,-727,-100,-715,-18,-605,-161,-531,-137,-475,-197,-485,-201,-433,-135,-408,-232,-404,-136,-441,-131,-469,-151,-475,-144,-469,-155,-431,-165,-416,-207,-381,-199,-342,-208,-344,-172,-301,-189,-339,-193,-297,-159,-303,-169,-283,-144,-295,-190,-323,-198,-312,-172,-324,-214,-279,-169,-264,-159,-230,-157,-232,-160,-206,-167,-240,-200,-232,-191,-234,-175,-238,-189,-225,-142,-206,-214,-206,-200,-152,-232,-176,-232,-184,-217,-152,-205,-194,-188,-192,-160,-199,-163,-211,-186,-234,-194,-218,-212,-270,-194,-202,-181,-219,-182,-202,-169,-194,-142,-192,-142,-138,-58,-121,-63,-104,-7,-62,-12,-40,0,-55,-16,-33,-41,-87,-38,-71,-48,-89,-7,-81,-22,-59,5,-41,-28,-47,-20,-14,-23,-20,-10,-31,-22,-25,-11,-55,-34,-32,-33,-44,-53,1,-30,-56,-58,-29,-61,-47,-27,-44,-54,-52,-32,-37,-63,-16,18,1,-3,18,72,0,21,9,42,-23,-7,-40,-42},
+ /* IRC_Composite_C_R0195_T165_P000.wav */
+ {-31,31,-31,31,-30,30,-30,29,-28,27,-25,23,-20,16,-12,5,5,-18,40,-78,187,-74,-49,55,-110,112,-199,218,-425,530,199,1304,62,2352,168,2823,-5315,837,4953,2252,4624,4623,6361,3213,-1540,938,5698,-601,-1840,-1321,415,-514,-55,-892,3,-75,186,-753,471,-260,192,-752,21,-345,-220,-374,-258,-349,-282,-436,-427,-398,-253,-570,-291,-449,-37,-524,-88,-564,-148,-493,-85,-435,-73,-317,-105,-359,-181,-335,-176,-321,-195,-365,-206,-391,-180,-383,-187,-437,-200,-456,-199,-434,-221,-404,-185,-335,-239,-304,-221,-288,-247,-317,-222,-256,-192,-283,-227,-290,-193,-268,-185,-298,-185,-261,-149,-305,-194,-283,-162,-272,-207,-271,-209,-214,-185,-206,-201,-195,-156,-200,-178,-267,-179,-273,-180,-271,-149,-245,-175,-193,-143,-182,-204,-213,-175,-213,-191,-252,-204,-249,-193,-210,-188,-202,-194,-140,-186,-146,-188,-134,-188,-186,-187,-199,-210,-191,-202,-211,-250,-183,-225,-176,-254,-154,-188,-96,-150,-85,-102,-69,-80,-63,-71,-81,-74,-55,-81,-81,-69,-57,-79,-51,-37,-34,-57,-26,-18,6,-12,5,-5,22,-15,19,-13,6,-49,9,-38,-32,-76,-25,-65,-43,-75,-1,-82,-14,-96,-21,-95,-25,-47,-4,-67,-76,-41,-67,-39,-53,-5,-25,-37,30,14,61,-21,72,-39,30,-59,25,-48,-21},
+ /* IRC_Composite_C_R0195_T180_P000.wav */
+ {9,-9,9,-10,10,-11,11,-12,13,-13,14,-15,16,-17,18,-19,20,-21,22,-24,25,-26,25,-17,104,-114,196,-98,54,-126,232,-41,337,459,418,1258,2024,1306,-3081,2067,-322,1935,2599,4829,7530,3384,-1993,2649,3619,-256,-653,-863,-84,-381,-1124,-459,826,-56,-554,-375,247,362,403,-767,-54,-307,253,-528,-72,-499,-251,-538,-224,-365,-429,-387,-270,-98,-240,-189,-323,-221,-114,-200,-172,-265,-34,-233,-42,-325,-228,-392,-171,-360,-298,-341,-265,-231,-220,-299,-332,-289,-282,-307,-286,-295,-293,-265,-194,-288,-280,-341,-219,-319,-258,-367,-240,-308,-190,-294,-215,-308,-212,-271,-223,-283,-231,-230,-192,-212,-231,-187,-195,-184,-197,-212,-220,-239,-198,-224,-201,-254,-209,-229,-205,-256,-239,-265,-231,-229,-194,-202,-206,-179,-140,-169,-205,-189,-208,-194,-220,-219,-227,-219,-190,-210,-179,-230,-143,-194,-136,-216,-131,-181,-147,-210,-176,-226,-209,-222,-193,-214,-206,-190,-190,-205,-213,-200,-179,-148,-109,-85,-53,-73,-40,-100,-69,-150,-91,-144,-106,-152,-99,-85,-54,-38,-16,3,2,19,74,35,28,11,42,13,8,-18,-32,-36,-29,-19,-47,-86,-72,-66,-42,-83,-71,-83,-83,-72,-54,-20,-67,-68,-58,-74,-64,-79,-16,-60,-46,-42,-7,11,22,53,51,32,-13,33,28,3,-22,-46},
+ /* IRC_Composite_C_R0195_T195_P000.wav */
+ {12,-12,12,-12,12,-12,12,-12,12,-12,12,-12,12,-12,12,-12,11,-11,10,-9,8,-6,4,-1,-5,16,-58,-48,-46,77,37,-65,-49,-7,-27,197,332,255,848,1561,1608,-2167,729,-55,1458,1975,2964,6210,4289,99,1163,3083,300,-110,-1053,97,-72,-273,-635,580,371,-146,-5,150,225,128,22,74,-75,62,-60,-62,-162,-184,-359,-146,-99,33,-264,-53,-91,-68,-97,-68,-107,-168,-116,-102,-205,-156,-272,-180,-287,-225,-284,-228,-198,-203,-177,-240,-212,-239,-265,-245,-245,-239,-269,-232,-261,-248,-259,-262,-292,-271,-282,-251,-272,-265,-298,-265,-285,-267,-290,-263,-263,-239,-279,-219,-264,-196,-232,-191,-206,-170,-181,-179,-220,-200,-244,-184,-248,-231,-259,-234,-254,-249,-268,-279,-250,-255,-219,-236,-226,-171,-197,-163,-222,-176,-205,-187,-189,-200,-188,-195,-184,-172,-221,-174,-245,-154,-259,-156,-238,-169,-237,-202,-213,-230,-237,-242,-223,-236,-210,-202,-201,-217,-219,-206,-204,-158,-180,-128,-112,-64,-38,-58,-71,-95,-94,-116,-117,-160,-118,-117,-105,-102,-88,-47,-31,-21,-9,0,24,-11,6,-19,6,1,-16,-22,-27,-22,-10,-73,-58,-79,-51,-76,-65,-82,-99,-73,-70,-36,-82,-58,-110,-76,-105,-83,-46,-122,-54,-86,17,-33,15,14,-1,0,13,44,23,-6,2,-42},
+ /* IRC_Composite_C_R0195_T210_P000.wav */
+ {6,-6,6,-6,7,-7,7,-7,7,-7,7,-7,8,-8,8,-8,8,-9,9,-9,10,-10,10,-11,12,-12,13,-13,-3,-140,-62,16,74,-75,-81,-9,-154,52,75,214,374,933,1063,-50,-424,1215,-28,199,1671,2854,5292,2238,1086,1897,2061,-301,-116,-17,89,220,-368,-4,403,517,47,242,331,363,284,327,289,188,152,291,134,170,136,286,56,186,15,53,-103,44,-142,-179,-241,-86,-171,-94,-229,-133,-165,-58,-222,-146,-225,-113,-173,-105,-202,-191,-235,-184,-216,-202,-258,-257,-241,-211,-214,-256,-271,-278,-250,-239,-276,-254,-285,-245,-277,-265,-277,-285,-295,-284,-275,-264,-248,-242,-249,-215,-225,-190,-221,-208,-231,-195,-210,-191,-211,-203,-222,-199,-222,-228,-234,-247,-238,-233,-235,-232,-214,-216,-211,-201,-215,-188,-250,-191,-224,-183,-218,-210,-195,-212,-196,-217,-202,-221,-224,-225,-263,-219,-268,-220,-277,-225,-254,-223,-243,-232,-228,-229,-221,-217,-194,-205,-169,-170,-122,-124,-95,-89,-83,-76,-91,-74,-103,-96,-96,-80,-91,-101,-107,-123,-107,-115,-88,-113,-70,-93,-25,-70,-18,-56,-11,-38,-15,-23,-20,-23,-29,-31,-55,-70,-58,-57,-52,-93,-74,-95,-46,-80,-63,-97,-83,-108,-85,-90,-88,-102,-101,-88,-79,-54,-29,-30,-33,-9,-5,-3,24,-9,7,-23},
+ /* IRC_Composite_C_R0195_T225_P000.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-2,2,-2,2,-3,4,-4,6,-9,17,-16,-98,-60,-77,48,3,-81,-121,-43,-55,1,19,93,305,537,631,131,-260,545,567,27,1207,2128,2827,2558,1188,1325,1915,744,102,304,255,211,393,327,58,643,377,590,456,611,727,425,704,395,620,277,569,148,252,218,128,12,-134,-32,-106,-54,-94,-7,3,-19,-31,-59,-78,-49,-114,-79,-187,-72,-177,-103,-203,-112,-200,-151,-256,-183,-276,-182,-258,-181,-256,-202,-239,-241,-240,-281,-205,-284,-252,-257,-288,-259,-319,-259,-309,-239,-302,-232,-305,-231,-282,-235,-251,-227,-244,-183,-227,-177,-216,-169,-213,-156,-216,-165,-230,-183,-214,-199,-211,-207,-215,-203,-236,-236,-213,-269,-197,-284,-219,-271,-227,-256,-210,-245,-209,-247,-203,-231,-195,-235,-194,-248,-194,-245,-212,-237,-203,-241,-198,-226,-200,-216,-221,-205,-209,-210,-188,-216,-146,-202,-108,-186,-110,-157,-108,-129,-121,-125,-129,-118,-125,-104,-120,-104,-95,-101,-78,-84,-57,-71,-28,-65,-16,-83,-25,-68,-41,-63,-42,-59,-29,-46,-33,-54,-48,-58,-50,-85,-80,-93,-89,-117,-98,-103,-82,-104,-94,-118,-105,-87,-86,-85,-96,-100,-64,-69,-48,-63,-65,-45,-15,-39,-27,-55,-31},
+ /* IRC_Composite_C_R0195_T240_P000.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,-1,1,-1,1,-1,2,-2,2,-3,5,-9,-97,-133,-196,-147,-157,-47,-93,37,-29,1,0,59,-116,-55,150,274,295,91,361,1004,1112,1011,1324,1700,2156,1559,331,574,1032,523,614,629,882,990,1087,1066,943,977,621,691,470,536,382,281,280,209,295,117,203,196,393,300,250,185,141,127,-15,-42,-136,-73,-208,-111,-261,-80,-157,-42,-115,-38,-121,-105,-155,-167,-199,-209,-235,-206,-227,-259,-253,-267,-251,-281,-214,-260,-213,-271,-234,-259,-192,-277,-204,-294,-201,-341,-226,-327,-238,-309,-206,-263,-189,-240,-185,-208,-186,-211,-192,-209,-158,-223,-155,-231,-165,-251,-159,-233,-168,-259,-189,-266,-206,-255,-200,-268,-211,-290,-218,-286,-233,-302,-227,-283,-216,-289,-207,-262,-193,-248,-196,-236,-182,-219,-173,-221,-200,-230,-207,-207,-205,-216,-209,-217,-217,-212,-207,-184,-207,-178,-189,-131,-147,-115,-129,-101,-99,-95,-93,-92,-108,-91,-105,-77,-114,-73,-104,-68,-90,-52,-74,-36,-70,-50,-80,-45,-81,-54,-78,-26,-78,-29,-94,-58,-114,-94,-144,-115,-134,-101,-99,-82,-78,-81,-65,-58,-71,-110,-125,-130,-133,-109,-102,-88,-107,-78,-90,-39,-58,-31,-64,-17,-39,-13},
+ /* IRC_Composite_C_R0195_T255_P000.wav */
+ {2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-3,3,-3,3,-3,3,-3,3,-3,4,-4,4,-5,5,-6,9,-19,-71,-126,-111,-131,-223,-213,-179,-73,-136,-101,-19,30,101,69,89,95,323,406,515,721,768,1140,1389,925,919,1504,1350,1027,1508,1800,2083,1870,1354,950,539,490,494,392,378,293,344,461,473,522,375,344,271,237,162,56,42,11,83,-5,55,-30,81,-3,71,-18,-50,0,-151,-66,-240,-143,-251,-198,-256,-250,-192,-239,-205,-271,-195,-240,-195,-267,-238,-257,-227,-242,-241,-251,-226,-256,-185,-246,-212,-252,-224,-227,-235,-216,-249,-192,-222,-170,-209,-167,-231,-184,-255,-188,-250,-181,-283,-185,-279,-146,-264,-164,-273,-161,-261,-181,-298,-216,-272,-226,-251,-181,-242,-222,-248,-216,-260,-249,-302,-271,-289,-255,-276,-256,-246,-225,-218,-198,-202,-222,-210,-223,-219,-210,-230,-209,-218,-149,-175,-141,-182,-152,-139,-146,-160,-169,-152,-140,-120,-129,-130,-102,-120,-59,-92,-67,-121,-84,-93,-62,-69,-69,-85,-101,-60,-94,-80,-123,-92,-126,-73,-83,-80,-90,-79,-71,-42,-42,-54,-59,-77,-88,-83,-86,-100,-126,-130,-119,-130,-124,-145,-127,-148,-111,-124,-92,-85,-75,-85,-70,-68,-66,-66,-59,-78,-67,-59,-65},
+ /* IRC_Composite_C_R0195_T270_P000.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,3,-4,9,-91,-159,-163,-111,-130,-163,-90,-102,-89,-163,-184,-188,-171,-83,30,36,169,298,65,214,405,559,898,896,1271,2043,2157,2404,2912,2261,1344,1103,1268,1220,756,484,263,283,379,505,398,413,455,527,338,482,334,406,255,187,211,119,189,4,182,-16,145,-56,26,-74,-83,-100,-148,-133,-197,-139,-191,-198,-217,-194,-192,-215,-224,-197,-182,-180,-242,-199,-243,-153,-261,-180,-264,-151,-250,-164,-239,-176,-235,-178,-231,-191,-258,-227,-259,-218,-280,-188,-268,-159,-259,-154,-260,-137,-244,-185,-245,-228,-251,-260,-250,-247,-239,-233,-209,-205,-224,-262,-274,-268,-248,-262,-263,-277,-234,-255,-222,-233,-226,-262,-221,-257,-211,-267,-218,-251,-186,-221,-179,-224,-195,-213,-161,-226,-193,-212,-178,-219,-191,-204,-183,-190,-175,-182,-165,-164,-140,-131,-97,-107,-80,-102,-45,-85,-60,-81,-66,-74,-59,-82,-82,-91,-88,-102,-100,-120,-85,-122,-72,-129,-98,-137,-55,-101,-62,-69,-41,-72,-56,-83,-69,-90,-53,-98,-81,-105,-80,-107,-83,-112,-102,-115,-97,-125,-111,-136,-123,-145,-118,-131,-95,-114,-62,-70,-59,-73,-48,-57},
+ /* IRC_Composite_C_R0195_T285_P000.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-3,3,-4,6,-9,19,-100,-184,-163,-233,-161,-194,-211,-190,-252,-368,-121,58,37,-12,35,111,-96,-223,-19,464,559,1425,2382,1927,1709,2204,1586,984,1062,1267,1442,1113,1078,1182,1130,1148,848,575,534,584,541,405,456,300,346,294,405,279,183,240,258,176,160,100,-27,100,-24,93,-139,0,-270,60,-268,20,-249,-123,-250,-178,-127,-185,-84,-288,-109,-237,-116,-161,-179,-137,-193,-134,-189,-164,-211,-174,-211,-244,-187,-259,-227,-263,-160,-220,-206,-234,-213,-214,-205,-225,-212,-266,-182,-254,-229,-238,-166,-272,-223,-282,-263,-305,-287,-272,-261,-288,-239,-247,-227,-247,-224,-236,-226,-259,-230,-256,-220,-217,-226,-224,-232,-214,-225,-205,-261,-251,-252,-219,-235,-230,-230,-236,-236,-209,-203,-226,-221,-222,-180,-160,-190,-161,-159,-154,-156,-97,-111,-129,-127,-107,-66,-95,-69,-92,-64,-55,-64,-43,-78,-65,-103,-71,-87,-110,-101,-114,-93,-117,-90,-112,-88,-109,-72,-82,-69,-68,-63,-65,-90,-69,-67,-77,-62,-56,-47,-91,-59,-73,-34,-101,-70,-91,-61,-105,-91,-128,-154,-149,-128,-150,-140,-142,-93,-111,-108,-78,-62,-77,-59,-62},
+ /* IRC_Composite_C_R0195_T300_P000.wav */
+ {4,-4,4,-4,4,-4,4,-4,4,-5,5,-5,5,-5,5,-5,5,-6,6,-6,6,-6,6,-7,7,-7,8,-8,8,-9,10,-11,13,-16,24,-75,-192,-243,-206,-121,-200,-413,-335,-275,-203,-85,-38,193,-95,-382,283,-596,-531,1085,630,1024,2620,2194,1518,1499,1392,607,112,846,1164,950,675,1005,1305,1174,1521,1142,1208,859,1074,771,735,552,498,679,274,454,160,457,127,176,172,280,101,64,67,-27,98,11,3,-150,-68,-72,-105,-163,-160,-139,-135,-141,-133,-136,-55,-184,-109,-200,-81,-104,-78,-213,-147,-100,-188,-136,-214,-162,-281,-139,-265,-190,-228,-184,-320,-138,-205,-130,-238,-158,-209,-100,-297,-175,-328,-233,-318,-199,-385,-256,-355,-254,-336,-269,-310,-262,-286,-237,-272,-206,-279,-217,-262,-212,-280,-260,-296,-269,-321,-249,-293,-297,-294,-263,-252,-259,-248,-231,-189,-223,-204,-205,-214,-202,-172,-186,-170,-216,-162,-160,-149,-167,-137,-119,-139,-138,-127,-91,-90,-111,-123,-105,-94,-88,-92,-101,-104,-94,-87,-104,-82,-106,-68,-106,-75,-113,-53,-76,-65,-86,-59,-75,-81,-73,-84,-59,-75,-52,-59,-73,-55,-69,-45,-87,-49,-62,-47,-76,-53,-57,-57,-74,-83,-72,-109,-94,-135,-114,-127,-112,-128,-125,-121,-104,-114,-94,-97,-102,-114,-98,-73,-61,-46,-72},
+ /* IRC_Composite_C_R0195_T315_P000.wav */
+ {-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-4,4,-4,4,-4,4,-5,5,-5,6,-7,8,-10,14,-29,-234,-230,-266,-204,-305,-247,-524,-359,-150,55,142,71,572,-570,-1004,861,-803,-374,3189,1120,2120,3144,2428,636,1026,1269,59,-187,571,1369,181,332,532,1375,1240,1554,1033,1045,866,1172,1026,1022,606,720,597,671,349,376,201,259,47,222,146,93,-124,20,-35,-174,-23,6,-91,-108,-18,6,38,-2,-118,67,-77,-79,-121,-96,-206,-171,-74,-193,-141,-167,-54,-168,-65,-180,-137,-281,-209,-164,-172,-178,-158,-127,-188,-174,-11,-152,-142,-222,-182,-348,-203,-338,-287,-380,-316,-332,-319,-347,-297,-281,-364,-362,-314,-304,-376,-347,-321,-343,-330,-367,-276,-306,-278,-290,-268,-295,-267,-229,-264,-248,-290,-244,-263,-201,-223,-197,-193,-189,-154,-159,-137,-178,-126,-217,-115,-163,-129,-166,-130,-150,-147,-107,-147,-129,-143,-117,-141,-126,-115,-135,-99,-146,-90,-112,-81,-119,-52,-80,-79,-84,-83,-64,-59,-53,-89,-91,-74,-101,-29,-121,-49,-139,-64,-94,-23,-57,-36,-29,-38,-50,-50,-47,-30,-53,-56,-81,-58,-97,-62,-69,-56,-82,-74,-103,-94,-111,-122,-150,-117,-148,-135,-117,-104,-87,-95,-77,-107,-55,-89,-56,-82,-65,-70,-36,-13},
+ /* IRC_Composite_C_R0195_T330_P000.wav */
+ {-15,15,-15,15,-15,15,-15,16,-16,16,-16,16,-16,16,-16,16,-16,16,-16,16,-16,15,-15,14,-13,11,-8,5,0,-7,12,-293,-526,-71,-505,-401,-1003,-83,-138,277,-121,450,638,-529,-2538,1974,-1021,-928,6018,1862,2117,4170,3177,-540,80,773,465,-382,760,707,287,-96,895,1260,1490,749,709,1138,1758,1405,855,490,661,833,888,382,366,310,491,203,204,155,246,122,-32,-122,-37,50,94,-114,-242,-173,94,-97,-233,-239,44,3,91,-64,-78,-19,148,9,2,-196,62,-119,-154,-277,128,-102,-103,-182,-189,-136,-49,51,-260,-285,-17,-46,-344,-260,-264,-310,-481,-356,-385,-299,-442,-338,-388,-433,-413,-352,-281,-444,-379,-419,-361,-361,-316,-320,-407,-371,-354,-283,-325,-263,-281,-264,-300,-242,-200,-218,-231,-208,-283,-185,-218,-137,-254,-173,-210,-124,-178,-189,-155,-197,-150,-148,-83,-183,-134,-157,-104,-154,-134,-133,-118,-172,-161,-120,-119,-156,-145,-96,-143,-172,-117,-71,-107,-120,-113,-53,-111,-85,-65,-51,-97,-63,-15,-77,-94,-67,-18,-45,-126,-60,-101,-21,-115,3,-114,-45,-90,-5,-69,-55,-89,-42,-99,-38,-100,-24,-95,-21,-116,-37,-113,-13,-85,-64,-143,-57,-122,-61,-126,-85,-123,-78,-94,-71,-113,-55,-72,-37,-93,-41,-42,-10,-34,-37,-13,-34},
+ /* IRC_Composite_C_R0195_T345_P000.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-2,2,-3,-196,-727,-30,-506,-136,-1125,-612,-692,-135,283,619,802,-51,-2221,1398,-964,-5308,8059,961,2013,8066,4451,-858,1438,1808,-955,-2183,475,1387,742,458,140,184,1030,1768,1316,965,1001,1155,1147,1222,1301,1124,461,289,297,592,383,273,-220,-259,-53,323,264,-32,-200,42,191,421,77,-195,-257,18,-154,-38,-140,-135,-290,-47,107,49,-29,-98,-94,-50,49,264,36,153,-148,86,-24,287,-156,101,-86,125,-186,-182,-278,-236,-501,-636,-484,-401,-330,-428,-463,-554,-283,-366,-318,-494,-441,-375,-318,-358,-465,-416,-438,-337,-400,-344,-393,-247,-308,-313,-356,-181,-229,-204,-374,-214,-320,-200,-307,-179,-339,-189,-252,-152,-246,-143,-210,-166,-196,-69,-139,-172,-216,-103,-73,-127,-214,-116,-118,-96,-247,-135,-187,-78,-264,-166,-235,-95,-173,-142,-167,-169,-129,-117,-114,-125,-125,-103,-137,-47,-110,-26,-121,-21,-72,-15,-71,-68,-34,-53,-38,-72,-96,-96,-90,-11,-126,-33,-166,-22,-92,18,-75,-35,-69,-60,-67,-82,-72,-61,-96,-68,-103,-26,-100,-19,-108,0,-110,-34,-106,-39,-54,-75,-76,-83,-35,-42,-69,-51,-59,-38,-55,19,-49,-3,-43,27,-14,-5,-46,-24}};
+
+const int16_t irc_composite_c_r0195_p015[][256] =
+ {/* IRC_Composite_C_R0195_T000_P015.wav */
+ {4,-4,4,-4,4,-4,4,-4,4,-4,4,-5,5,-5,4,-4,4,-4,3,-2,1,2,-5,-101,-665,-424,-897,-170,-507,-460,-1001,-828,-356,47,474,980,404,2103,-3700,-5968,7765,-9133,9741,10867,71,6925,3456,-1455,-2458,2718,-170,-1201,-1751,1809,507,632,-1165,1945,1684,1705,-450,1152,360,1527,269,952,644,931,727,1576,725,835,741,915,186,162,327,384,20,24,-311,60,225,484,-123,-28,-210,118,15,76,-335,-153,-249,49,-120,24,-200,-169,-213,-175,-235,-158,-280,-399,-410,-304,-104,-355,-319,-311,-79,-366,-75,-79,-120,-487,147,-42,-198,-175,135,-242,55,233,123,-314,-58,-179,-96,-352,-26,7,11,-105,-129,125,-110,-293,-276,-461,-507,-406,-422,-497,-481,-446,-459,-325,-336,-443,-420,-320,-391,-360,-309,-407,-375,-288,-289,-385,-315,-272,-292,-271,-256,-318,-173,-220,-185,-329,-142,-239,-76,-219,-117,-277,-107,-204,-117,-233,-199,-220,-177,-238,-171,-170,-187,-285,-154,-168,-145,-192,-131,-239,-194,-170,-109,-205,-155,-164,-163,-187,-126,-85,-138,-195,-140,-189,-84,-134,-22,-177,-51,-128,-26,-105,26,-144,-65,-123,-28,-136,19,-69,-43,-112,40,-43,59,-67,32,-35,97,-21,99,-27,90,23,141,21,38,39,61,12,10,-1,37,-3,7,2,41,-19,-12,-12,16,-53},
+ /* IRC_Composite_C_R0195_T015_P015.wav */
+ {100,-101,102,-102,102,-102,102,-102,101,-99,96,-93,88,-81,71,-58,37,-6,-46,154,-587,-280,-52,-712,-530,-842,-228,-637,-217,-1535,-463,274,2688,1298,-390,-2760,4349,-16532,13572,-2117,2580,22789,-850,559,1346,2618,-4202,397,316,686,-1654,1356,-848,1484,164,1873,376,1720,39,1069,309,1623,748,807,488,1192,547,1364,679,594,48,334,-179,362,98,-149,-587,-275,-81,371,-430,-372,-369,412,-126,-39,-294,169,-117,61,-209,-100,-271,-40,-262,-244,-406,12,-243,-253,-484,54,-243,-283,-575,-138,-358,-262,-307,-61,-567,-206,25,51,-696,-10,-132,-245,-388,187,-132,-194,-316,-92,-71,-291,-374,27,-295,-84,-4,145,-576,122,-217,-153,-724,53,-337,-126,-502,-305,-401,-138,-372,-296,-502,-318,-375,-140,-645,-283,-375,-217,-529,-172,-316,-324,-287,-239,-309,-305,-230,-228,-310,-332,-289,-168,-302,-286,-241,-197,-266,-181,-156,-260,-272,-185,-148,-225,-221,-239,-178,-223,-142,-203,-226,-260,-124,-148,-200,-259,-124,-203,-182,-207,-78,-186,-163,-136,-74,-179,-123,-45,-87,-180,-103,-28,-117,-135,-64,-29,-148,-90,-13,-28,-111,-40,7,-42,-98,-26,-4,-57,-22,22,-38,-72,76,67,1,-21,80,49,39,63,66,26,23,62,97,29,39,49,28,-1,52,74,-6,-4,19,15,-15,-12,17,-50},
+ /* IRC_Composite_C_R0195_T030_P015.wav */
+ {-101,102,-103,105,-105,106,-106,106,-104,102,-97,90,-79,62,-35,-12,109,-431,-649,311,-951,117,-1193,10,-1439,943,-1996,57,-1866,3892,-160,3817,-4940,7695,-14389,320,6811,-6312,29122,1548,2820,2754,2735,-5703,-20,838,313,-2387,2394,-1371,1731,262,1937,34,1456,-294,1713,221,997,660,1535,549,1179,928,928,293,321,-76,273,-164,-356,-622,24,-278,-26,-520,-116,-436,-61,-412,-21,-436,-263,-534,-25,-24,127,-328,-77,-189,107,-200,-313,-487,-278,-245,-413,-269,-216,-100,-434,-149,-238,-270,-527,-94,-144,-244,-529,-94,-120,-125,-544,-205,-477,-214,-375,-52,-404,-184,-361,-14,-189,-53,-346,-89,-276,-127,-233,-126,-417,-169,-225,-263,-470,-227,-238,-276,-329,-339,-304,-226,-209,-212,-255,-261,-275,-96,-168,-289,-298,-134,-296,-334,-291,-248,-272,-268,-362,-278,-286,-108,-360,-215,-330,-76,-394,-179,-365,-104,-449,-206,-420,-128,-409,-167,-434,-175,-416,-105,-318,-125,-408,-157,-270,-45,-277,-160,-326,-56,-220,-114,-280,-69,-199,-100,-242,-24,-143,-39,-214,3,-104,20,-184,20,-140,-7,-183,31,-135,-21,-164,13,-128,42,-188,49,-113,71,-189,90,-97,102,-87,84,-61,147,-63,149,-94,170,-108,183,-108,208,-150,179,-163,250,-98,215,-137,235,-107,214,-135,246,-126,201,-171,186,-149,135,-194,121},
+ /* IRC_Composite_C_R0195_T045_P015.wav */
+ {-146,153,-161,170,-179,189,-200,212,-224,238,-252,266,-278,280,-241,-262,-1208,369,-877,618,-1865,344,-1624,1098,-2418,1166,-2204,3338,-287,6351,-5670,4490,-9471,-5595,10415,-3658,26422,6163,571,640,3020,-3458,345,262,-17,-2379,1504,-915,2155,96,1778,-36,1408,800,1533,117,618,355,1940,474,1443,116,436,-13,320,-248,-589,-590,-422,-164,-365,-343,-251,-474,20,-343,-59,-619,-421,-460,-72,-443,-399,-435,-238,-311,-325,-256,-210,-285,-282,-222,-283,-212,-374,-178,-386,-213,-343,-35,-317,-276,-390,-79,-244,-300,-445,-222,-296,-233,-458,-263,-403,-259,-462,-188,-423,-283,-371,-78,-225,-208,-380,-203,-156,-140,-307,-202,-208,-86,-293,-179,-233,-185,-390,-305,-381,-170,-416,-344,-426,-229,-331,-201,-370,-183,-273,-88,-257,-116,-206,-60,-298,-72,-233,-115,-304,-131,-336,-187,-271,-44,-375,-190,-355,-35,-321,-189,-400,-136,-365,-198,-383,-200,-395,-244,-401,-188,-398,-184,-393,-179,-365,-150,-314,-118,-327,-118,-291,-73,-272,-87,-247,-52,-258,-27,-226,25,-210,8,-202,51,-136,62,-162,35,-135,61,-156,-12,-167,55,-165,15,-174,47,-131,28,-125,76,-91,69,-71,126,-60,104,-40,141,-51,117,-33,141,-58,103,-38,158,-48,95,-52,149,-45,86,-47,120,-68,88,-39,116,-45,74,-35,89,-68,62,-90,53},
+ /* IRC_Composite_C_R0195_T060_P015.wav */
+ {29,-34,39,-45,52,-59,69,-80,93,-110,131,-160,205,-308,-459,-920,-171,388,-674,-719,-1064,350,-1149,552,-1891,2109,-28,5773,-3032,5413,-11840,194,-1388,1646,23561,8535,2547,1107,-66,257,913,517,-131,-1162,-856,344,2136,-879,1332,-592,2048,385,1977,174,2217,-131,2091,-69,1390,-1343,963,-905,515,-1176,-81,-1557,250,-301,-119,-467,-479,-337,138,-523,-373,-525,-22,-558,-74,-857,-193,-765,-208,-1034,-15,-947,-96,-803,45,-665,15,-523,-1,-312,49,-446,-141,-311,-126,-246,-344,-467,-27,-388,-328,-427,-198,-495,-118,-356,-277,-493,-134,-525,-71,-411,-262,-445,-175,-367,-96,-400,-267,-383,-49,-313,-260,-205,-179,-166,-56,-272,-194,-146,-166,-310,-204,-405,-207,-321,-211,-468,-223,-383,-150,-326,-281,-312,-146,-220,-208,-241,-286,-189,-157,-134,-243,-213,-136,-145,-92,-188,-205,-244,-73,-253,-131,-321,-224,-277,-194,-364,-238,-342,-254,-284,-301,-272,-246,-239,-245,-226,-236,-207,-220,-191,-251,-189,-226,-188,-154,-195,-171,-163,-122,-121,-97,-111,-91,-108,-20,-120,-59,-33,-136,-42,-55,-62,-49,-97,-100,16,-97,-13,-104,7,-74,-20,-54,27,-6,45,-12,56,35,24,86,33,48,24,68,72,-3,50,22,52,12,43,-32,109,-68,106,-66,49,-61,102,-74,44,-72,28,-60,21,-71,-4,-76,16},
+ /* IRC_Composite_C_R0195_T075_P015.wav */
+ {19,-16,12,-7,2,4,-11,18,-27,36,-47,59,-68,37,-553,36,-916,-89,-13,-916,-389,-1224,572,-284,1453,853,1354,3254,1573,-10498,-1005,-5881,20609,10333,4130,9878,-3085,-1702,1001,5191,773,-2104,-1269,-41,1645,-349,309,387,447,1304,620,1533,360,1697,867,1545,-94,149,-359,473,-1422,-432,-1225,-246,-886,186,-914,-144,-892,309,-602,60,-603,-112,-520,-150,-750,-486,-681,-262,-736,-448,-1017,-103,-734,-305,-903,-61,-752,39,-644,-19,-565,33,-324,-70,-458,-205,-229,-182,-403,-322,-245,-211,-302,-350,-295,-222,-298,-293,-385,-263,-357,-235,-379,-252,-470,-139,-429,-84,-457,-178,-385,-120,-380,-232,-339,-192,-273,-205,-196,-146,-164,-174,-129,-218,-203,-145,-229,-290,-273,-262,-283,-222,-302,-215,-314,-150,-291,-151,-311,-154,-281,-177,-260,-179,-190,-177,-222,-159,-209,-215,-215,-185,-191,-224,-214,-221,-182,-209,-269,-260,-254,-234,-284,-241,-293,-201,-269,-218,-264,-188,-203,-199,-218,-207,-118,-151,-146,-184,-126,-92,-92,-129,-108,-109,-42,-120,-57,-144,-45,-102,-23,-164,-63,-98,-36,-106,-81,-3,-74,-55,-79,-49,-60,-59,-60,-31,-36,-35,57,-37,99,-7,135,-26,115,14,154,-6,78,28,119,-3,53,-48,80,-38,55,-56,13,-65,74,-45,19,-79,50,-39,24,-95,40,-41,15,-61,55,-129},
+ /* IRC_Composite_C_R0195_T090_P015.wav */
+ {106,-108,111,-113,116,-119,121,-123,125,-125,121,-102,-150,-386,-21,-846,-117,203,-762,-759,-425,-20,26,535,183,3678,866,180,877,-12284,4742,-888,21444,10158,-2546,4612,-145,-630,3778,3819,1940,-4361,-1372,2229,1116,-1596,-423,1713,840,536,1040,2123,618,888,-302,898,-618,52,-845,240,-1279,-435,-1143,105,-929,-50,-1077,-180,-541,98,-930,-161,-671,-158,-656,-338,-774,-263,-620,-260,-792,-238,-787,-172,-874,-235,-797,-199,-767,-178,-702,-101,-607,-63,-479,-72,-504,-49,-400,-118,-387,-113,-404,-73,-442,-100,-429,-15,-496,-79,-480,-58,-494,-80,-498,-112,-411,-138,-447,-136,-406,-145,-485,-166,-440,-131,-485,-87,-417,-104,-413,-102,-426,-31,-350,-62,-299,27,-272,-36,-302,-22,-320,-120,-364,-124,-307,-111,-382,-185,-231,-108,-275,-163,-225,-123,-157,-158,-254,-183,-208,-146,-274,-183,-229,-148,-301,-148,-275,-212,-388,-177,-304,-193,-358,-180,-265,-195,-243,-171,-184,-212,-200,-212,-156,-173,-149,-232,-145,-162,-100,-147,-119,-102,-57,-53,-87,-18,-36,-11,-87,-46,-46,17,-89,-82,-57,6,-100,-61,-101,-38,-60,-46,-108,-40,-41,19,-104,-21,-14,77,-24,51,22,136,25,103,19,102,3,92,-42,26,-51,25,-38,-15,-65,-12,-35,-8,28,24,-31,-1,36,92,2,6,8,52,-33,-7,-25,-27},
+ /* IRC_Composite_C_R0195_T105_P015.wav */
+ {16,-19,23,-28,34,-40,48,-57,68,-82,100,-121,33,-823,199,-561,-96,-481,741,-1752,-67,-480,1840,-966,591,1601,5280,-3652,770,-7901,214,10553,2446,18816,1377,-3359,-1411,6633,5595,-115,-232,1823,-2575,-717,-242,2719,-2255,509,511,2747,225,1585,549,951,-478,-34,-731,-13,-1246,-512,-881,-341,-1127,207,-442,-495,-702,-517,-566,35,-620,-983,-450,-179,-571,-441,-658,-297,-211,-340,-730,-514,-334,-479,-562,-662,-463,-524,-336,-537,-522,-336,-226,-483,-343,-332,-364,-181,-306,-365,-271,-175,-316,-213,-283,-326,-115,-221,-216,-290,-146,-290,-98,-334,-301,-279,-138,-349,-278,-318,-250,-285,-237,-388,-326,-257,-206,-416,-256,-293,-207,-350,-156,-397,-149,-314,-125,-323,-153,-327,-64,-258,-145,-241,-10,-249,-51,-197,-108,-234,33,-286,-138,-267,-26,-273,-117,-347,-77,-229,-117,-301,-119,-229,-104,-247,-175,-311,-162,-227,-248,-287,-181,-293,-170,-318,-206,-285,-159,-334,-167,-232,-161,-235,-76,-246,-154,-204,-10,-221,-106,-229,14,-182,-12,-251,30,-154,32,-190,61,-152,90,-145,48,-122,71,-96,29,-121,6,-57,66,-80,40,-49,59,-112,-8,-129,54,-18,76,-21,97,37,171,23,59,-61,75,-37,21,-127,1,-154,68,-112,-12,-180,86,-58,91,-120,128,-28,129,-100,167,-17,106,-84,94,-49,76,-37},
+ /* IRC_Composite_C_R0195_T120_P015.wav */
+ {39,-39,39,-39,39,-38,38,-37,35,-32,27,-19,0,-223,40,-675,329,-841,457,-348,-274,-1647,1770,432,-494,3,4260,289,887,-4454,-3947,7446,-2378,15614,7773,95,-2028,2409,7171,2953,950,1439,-1677,-1118,-1770,1575,491,137,-1226,1181,2451,1325,-149,862,100,-196,-613,-302,-1148,-1325,-632,-731,-1011,-688,174,-67,-430,-378,-168,-383,-445,-570,-934,-576,-71,-333,-939,-576,-180,-299,-551,-542,-536,-312,-421,-506,-398,-463,-360,-423,-342,-463,-390,-485,-299,-416,-291,-519,-227,-313,-272,-376,-199,-241,-176,-354,-259,-245,-94,-289,-288,-266,-79,-203,-210,-332,-200,-224,-227,-331,-258,-315,-219,-293,-232,-358,-231,-306,-201,-298,-234,-413,-216,-295,-220,-417,-228,-272,-126,-326,-197,-254,-104,-275,-161,-280,-75,-215,-110,-276,-33,-130,-19,-261,-8,-171,30,-242,-55,-229,-65,-254,-74,-218,-134,-301,-99,-211,-155,-300,-156,-234,-131,-322,-164,-311,-142,-349,-229,-334,-148,-297,-165,-289,-133,-215,-100,-254,-101,-185,-51,-234,-38,-186,-6,-168,0,-111,-29,-125,29,-96,-23,-153,22,-59,-32,-103,28,-118,11,-64,83,-103,41,-112,28,-109,99,-41,39,-86,157,43,121,-15,157,-11,121,-30,90,-113,25,-109,38,-172,-47,-151,15,-102,21,-97,16,-33,104,12,59,-55,121,-5,63,-116,114,-30,115,-85},
+ /* IRC_Composite_C_R0195_T135_P015.wav */
+ {15,-17,19,-21,24,-28,32,-37,43,-50,60,-73,90,-115,157,-297,361,-673,287,-116,-598,-544,1021,-902,-263,1113,1563,-848,3395,810,-1816,-1445,-4755,10984,3295,5362,6262,2589,-529,1444,7698,4758,-2233,-2138,-1622,980,-226,100,-517,871,952,682,983,1138,-542,-341,-164,-377,-526,-992,-910,-828,-413,-830,-380,-392,-124,-316,-225,-315,-25,-678,-691,-468,-412,-545,-395,-676,-301,-467,-356,-548,-300,-516,-260,-553,-295,-485,-232,-525,-220,-421,-217,-488,-227,-455,-268,-426,-269,-474,-232,-395,-199,-378,-219,-372,-176,-401,-202,-354,-114,-340,-124,-267,-86,-322,-166,-298,-181,-316,-179,-307,-163,-290,-175,-321,-186,-325,-234,-372,-200,-335,-202,-352,-199,-268,-180,-319,-236,-296,-200,-331,-209,-300,-142,-273,-118,-226,-91,-203,-97,-250,-91,-176,-72,-201,-65,-156,-22,-171,-59,-200,-36,-210,-93,-201,-48,-197,-73,-185,-73,-195,-95,-266,-166,-294,-169,-299,-216,-315,-187,-265,-167,-287,-146,-275,-175,-265,-144,-282,-127,-249,-66,-222,-39,-146,-32,-126,-20,-76,5,-92,18,-56,21,-91,13,-119,-23,-127,37,-71,16,-116,10,-105,12,-96,55,-69,43,-76,137,-20,86,-3,123,28,100,8,49,-58,60,-31,-10,-117,-15,-44,-19,-89,2,-51,-18,-51,62,-39,31,-46,59,-59,67,-57,112,-72,62,-22},
+ /* IRC_Composite_C_R0195_T150_P015.wav */
+ {22,-23,24,-24,25,-26,27,-27,28,-28,28,-28,26,-24,19,-9,-13,134,-205,5,10,-146,-122,-75,-78,-152,345,-100,1711,198,1882,367,2730,-6333,870,5933,2367,6468,4276,4587,970,719,5822,3692,-1207,-2971,-1058,797,482,-202,-740,507,536,875,480,668,-204,-211,-690,500,-1107,-874,-841,-223,-910,-122,-465,-407,-494,-192,-244,-202,-337,-294,-451,-519,-512,-353,-580,-345,-407,-307,-608,-176,-450,-303,-475,-205,-453,-277,-342,-237,-284,-212,-314,-272,-380,-283,-368,-307,-417,-297,-337,-321,-374,-329,-283,-379,-283,-310,-317,-249,-232,-217,-269,-190,-252,-183,-270,-238,-227,-187,-286,-191,-260,-230,-245,-233,-289,-230,-246,-218,-241,-208,-260,-204,-276,-211,-286,-243,-284,-211,-281,-227,-258,-199,-238,-185,-241,-133,-220,-133,-189,-80,-190,-65,-146,-88,-167,-80,-129,-110,-166,-124,-142,-139,-178,-111,-146,-116,-143,-102,-118,-138,-137,-152,-173,-190,-174,-190,-193,-230,-208,-208,-216,-246,-203,-231,-209,-216,-167,-210,-170,-158,-128,-148,-142,-127,-104,-88,-98,-82,-75,-58,-53,-46,-85,-53,-56,-1,-14,17,-80,-58,-41,-57,-6,-70,6,-78,37,-14,58,10,69,35,20,45,42,27,3,3,-29,-5,-10,26,-54,-21,-21,39,-58,-58,-23,10,-16,-35,6,-22,2,-8,54,-13,7,-2,51,6},
+ /* IRC_Composite_C_R0195_T165_P015.wav */
+ {20,-21,21,-22,23,-23,24,-25,26,-26,27,-28,29,-29,30,-30,29,-28,22,-5,163,-209,156,-276,329,-325,157,-151,120,93,1138,522,872,2060,255,503,-4749,3937,3841,3248,5654,4851,3110,1024,1230,4380,981,-2433,-2102,345,461,292,-696,50,937,951,-195,227,100,-111,-682,-242,-295,-695,-542,-371,-167,-471,-237,-441,-313,-257,-355,-428,-338,-330,-347,-256,-340,-455,-298,-395,-419,-365,-319,-336,-313,-224,-306,-223,-245,-277,-258,-289,-268,-318,-289,-331,-299,-363,-319,-390,-363,-384,-327,-342,-339,-372,-297,-284,-259,-319,-264,-296,-233,-297,-258,-289,-255,-235,-239,-231,-238,-221,-219,-255,-237,-261,-205,-265,-219,-253,-180,-250,-196,-250,-200,-248,-207,-278,-194,-276,-219,-261,-199,-283,-219,-241,-187,-217,-180,-196,-141,-180,-121,-175,-110,-181,-79,-171,-84,-195,-62,-164,-99,-185,-115,-180,-164,-155,-140,-152,-147,-164,-113,-154,-117,-178,-132,-201,-137,-183,-162,-227,-171,-200,-151,-199,-165,-161,-150,-178,-144,-157,-158,-179,-144,-176,-163,-168,-98,-168,-122,-152,-52,-148,-86,-125,-9,-56,-37,-107,-79,-44,-26,-30,-92,-55,-14,29,14,24,62,67,48,30,48,10,57,-9,40,-55,25,-77,17,-96,25,-64,21,-101,-1,4,58,-21,25,24,70,3,30,9,36,-16,6,-21,-39,-15},
+ /* IRC_Composite_C_R0195_T180_P015.wav */
+ {-9,9,-9,9,-10,10,-10,10,-11,11,-11,11,-12,12,-13,13,-14,15,-15,16,-17,19,-21,50,-66,25,121,28,-120,155,-168,335,416,671,222,2210,806,1236,-2882,612,2593,898,4860,6139,4465,870,-196,3886,2840,-2197,-1283,-67,115,-435,2,221,731,-37,-52,179,744,-513,-450,-510,328,-437,-225,-503,1,-204,-76,-530,-331,-379,-166,-435,-279,-284,-151,-266,-225,-384,-293,-305,-154,-293,-219,-273,-134,-244,-264,-371,-311,-317,-245,-345,-336,-343,-237,-329,-370,-441,-342,-336,-321,-387,-336,-319,-260,-281,-304,-299,-268,-249,-331,-318,-306,-253,-254,-267,-280,-263,-244,-262,-278,-297,-251,-213,-235,-246,-260,-197,-223,-206,-272,-188,-228,-176,-268,-213,-279,-202,-229,-233,-258,-216,-166,-186,-223,-208,-202,-136,-198,-161,-225,-147,-174,-123,-192,-165,-169,-119,-164,-157,-169,-110,-156,-134,-190,-131,-196,-117,-175,-127,-176,-95,-111,-96,-149,-112,-153,-144,-212,-161,-218,-171,-217,-170,-191,-155,-154,-114,-156,-141,-134,-77,-145,-152,-168,-124,-167,-164,-158,-156,-173,-143,-139,-75,-112,-48,-151,-85,-139,-30,-81,-70,-106,-105,-40,-41,29,15,57,54,103,128,65,65,35,45,-4,-23,-56,-53,-39,-44,-11,-66,11,-23,53,-3,44,26,45,23,36,66,32,13,3,39,11,-14,8,-12},
+ /* IRC_Composite_C_R0195_T195_P015.wav */
+ {3,-3,4,-4,4,-5,5,-5,6,-6,7,-7,8,-9,9,-10,11,-13,14,-16,19,-22,27,-33,44,-87,114,-132,102,-154,155,-97,-20,-37,-29,363,412,474,853,1336,1092,-788,-1724,2098,1099,2640,4844,4905,2895,-39,1681,2632,175,-1400,-248,325,22,-206,196,419,561,41,192,277,401,-173,2,-114,106,-178,-24,-176,30,-91,54,-173,-183,-124,-65,-136,-127,-106,-163,-59,-115,-115,-267,-191,-291,-145,-314,-229,-397,-205,-300,-229,-373,-215,-360,-218,-346,-234,-397,-220,-360,-257,-382,-254,-389,-213,-322,-234,-324,-214,-345,-227,-381,-255,-363,-174,-354,-207,-318,-230,-299,-263,-316,-271,-243,-219,-239,-195,-263,-183,-262,-181,-310,-210,-258,-227,-229,-243,-215,-263,-194,-269,-182,-235,-184,-209,-147,-196,-148,-196,-147,-207,-155,-221,-187,-223,-184,-221,-208,-205,-186,-173,-165,-148,-132,-141,-127,-151,-120,-154,-131,-136,-104,-119,-115,-117,-108,-145,-140,-188,-146,-212,-174,-199,-183,-203,-176,-190,-174,-178,-155,-183,-156,-192,-139,-178,-158,-185,-162,-172,-198,-158,-136,-126,-116,-127,-125,-157,-109,-154,-85,-152,-60,-135,-26,-117,10,-26,16,-15,36,69,64,91,41,52,-5,31,-40,-16,-60,-3,-25,-20,-13,18,23,6,15,15,42,21,45,37,32,17,30,46,26,13,23,-19},
+ /* IRC_Composite_C_R0195_T210_P015.wav */
+ {5,-5,6,-6,6,-6,6,-6,6,-6,7,-7,7,-7,7,-8,8,-8,8,-9,9,-9,9,-9,9,-9,7,-1,-45,-76,21,-111,31,-35,-9,-141,17,-81,104,351,414,314,1167,1284,-698,-334,-392,1578,2039,2332,5286,3230,840,735,2013,886,-250,-668,388,293,-154,194,485,539,373,247,362,554,379,14,200,206,243,111,161,197,127,193,183,265,-4,123,-60,64,-188,-26,-316,-89,-293,-150,-287,-153,-256,-136,-244,-221,-246,-144,-274,-195,-276,-224,-307,-223,-340,-289,-302,-287,-323,-301,-317,-303,-243,-292,-298,-294,-312,-280,-306,-243,-309,-226,-276,-214,-262,-251,-287,-252,-261,-239,-268,-241,-251,-220,-263,-226,-289,-222,-266,-235,-299,-243,-268,-249,-232,-227,-224,-212,-188,-201,-205,-192,-215,-147,-197,-162,-188,-158,-182,-181,-170,-210,-185,-204,-179,-201,-174,-187,-176,-157,-173,-157,-158,-147,-138,-131,-123,-128,-126,-106,-147,-126,-173,-126,-184,-147,-199,-168,-203,-173,-188,-192,-200,-201,-192,-187,-199,-212,-196,-185,-179,-192,-178,-197,-173,-188,-148,-169,-132,-157,-149,-165,-140,-138,-136,-123,-135,-83,-122,-54,-79,-22,-60,-30,-15,-6,29,-8,28,-22,45,-13,39,-33,30,5,20,-21,0,10,30,-5,10,-9,35,17,55,16,50,34,50,43,21,55,18,41},
+ /* IRC_Composite_C_R0195_T225_P015.wav */
+ {3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-2,2,-2,2,-1,1,0,-5,-60,-132,-64,-20,-85,-7,-176,-5,-52,-74,-72,84,430,320,474,759,338,-353,-244,418,1855,1977,2351,3573,2234,1049,638,1145,830,98,-47,162,541,334,496,426,623,595,701,586,611,652,468,517,289,478,320,343,117,277,121,176,-24,22,-90,-30,-74,-66,-98,-115,-117,-110,-81,-130,-60,-133,-100,-189,-113,-212,-176,-266,-224,-323,-264,-344,-286,-346,-280,-345,-296,-322,-294,-296,-283,-287,-282,-269,-247,-271,-247,-275,-227,-292,-244,-283,-265,-275,-259,-269,-255,-263,-256,-260,-233,-264,-234,-273,-263,-267,-260,-261,-252,-268,-235,-241,-202,-245,-183,-233,-168,-240,-165,-221,-162,-203,-155,-192,-162,-177,-157,-183,-162,-190,-153,-205,-157,-215,-152,-221,-147,-199,-142,-182,-144,-171,-142,-156,-148,-173,-154,-163,-157,-167,-170,-162,-167,-179,-174,-184,-178,-180,-174,-206,-178,-198,-188,-207,-204,-201,-199,-190,-214,-206,-229,-200,-212,-173,-192,-170,-215,-166,-189,-131,-174,-137,-168,-105,-105,-64,-83,-43,-48,2,-25,-6,-28,14,-21,8,-16,16,3,33,17,37,28,49,34,62,28,60,13,34,6,35,-8,13,-2,6,11,8,6,-3,12},
+ /* IRC_Composite_C_R0195_T240_P015.wav */
+ {0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,3,-3,3,-4,4,-5,6,-7,9,-12,19,-47,-65,-42,-103,-56,-86,-61,-84,-136,-84,-125,-76,46,139,205,243,514,311,-296,-329,431,1034,1553,1739,2266,2575,1097,709,1340,1199,680,407,592,719,747,950,891,924,905,835,742,679,646,246,443,284,396,76,270,79,360,141,234,132,176,91,44,66,-33,37,-24,-26,-52,-140,-134,-171,-129,-209,-205,-236,-225,-189,-236,-238,-284,-228,-319,-232,-313,-237,-314,-261,-304,-270,-301,-338,-291,-284,-273,-275,-283,-246,-253,-222,-299,-253,-305,-231,-286,-251,-299,-224,-259,-244,-287,-247,-273,-229,-277,-233,-278,-222,-256,-210,-244,-213,-226,-197,-200,-180,-187,-177,-191,-166,-184,-157,-198,-181,-196,-166,-179,-163,-184,-173,-192,-155,-187,-160,-198,-161,-183,-151,-173,-150,-191,-183,-210,-175,-205,-187,-208,-163,-185,-168,-170,-162,-180,-159,-180,-156,-158,-160,-186,-181,-225,-214,-217,-218,-234,-238,-231,-223,-221,-238,-230,-217,-206,-178,-170,-207,-185,-183,-154,-152,-154,-148,-132,-105,-76,-64,-31,-49,-9,-20,6,-12,13,19,25,27,32,34,31,31,36,25,9,26,16,20,-7,0,-5,22,12,4,3,18,14,9,-1,-12,-43},
+ /* IRC_Composite_C_R0195_T255_P015.wav */
+ {1,-1,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,3,-3,3,-3,3,-4,5,-6,10,-30,-120,-103,-93,-24,-84,-108,-106,-140,-67,-76,-73,-121,-133,-119,68,29,241,313,294,61,72,517,913,1238,1676,2099,2348,2019,1198,861,1666,1655,972,1040,933,753,835,866,579,456,471,608,472,520,250,352,304,298,249,242,223,199,145,120,235,93,122,49,3,-39,-15,-81,-71,-213,-81,-243,-130,-266,-181,-248,-213,-210,-258,-180,-292,-166,-311,-258,-301,-258,-288,-304,-246,-283,-255,-296,-284,-260,-336,-252,-351,-234,-370,-214,-328,-219,-303,-234,-296,-242,-261,-235,-272,-252,-263,-194,-230,-174,-222,-179,-253,-165,-264,-178,-236,-165,-217,-158,-210,-155,-187,-164,-190,-169,-218,-178,-196,-162,-199,-188,-233,-170,-224,-161,-189,-146,-207,-166,-198,-168,-188,-182,-169,-203,-189,-199,-180,-192,-203,-183,-200,-212,-208,-215,-216,-240,-188,-209,-178,-223,-162,-198,-167,-209,-211,-239,-196,-203,-168,-214,-197,-239,-145,-209,-149,-231,-167,-214,-131,-185,-129,-161,-129,-137,-105,-119,-97,-124,-84,-109,-56,-30,29,13,51,35,66,39,42,23,8,-3,12,8,29,13,32,3,26,10,21,-16,-7,-1,7,2,-5,-3,-3,-1},
+ /* IRC_Composite_C_R0195_T270_P015.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-2,2,-2,3,-5,38,41,81,155,185,109,43,168,195,276,233,321,381,601,818,813,1005,694,582,706,813,1380,2408,2859,3417,3192,1234,164,601,379,145,-151,-609,-543,-195,49,-120,-111,136,61,-67,-105,-152,-114,-346,-267,-397,-310,-240,-454,-334,-493,-338,-595,-418,-579,-472,-506,-514,-489,-592,-416,-592,-471,-574,-491,-531,-515,-529,-526,-514,-446,-512,-519,-497,-434,-454,-430,-467,-415,-434,-400,-422,-405,-387,-422,-391,-428,-343,-360,-326,-389,-310,-335,-241,-318,-246,-341,-202,-264,-207,-278,-221,-234,-239,-210,-224,-186,-240,-226,-220,-207,-184,-222,-220,-245,-206,-189,-231,-234,-238,-195,-237,-129,-227,-188,-216,-145,-224,-225,-241,-252,-274,-214,-216,-202,-212,-164,-190,-171,-187,-134,-175,-141,-168,-164,-167,-150,-174,-138,-128,-101,-135,-76,-112,-70,-116,-70,-102,-92,-120,-98,-123,-112,-146,-92,-145,-88,-135,-96,-115,-84,-87,-67,-61,-82,-42,-48,11,-13,5,25,35,52,70,95,98,101,116,108,116,94,137,109,102,83,89,88,89,64,59,40,43,14,53,3,16,-3,7,12,-13,16,-2,28,6,37,18},
+ /* IRC_Composite_C_R0195_T285_P015.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,2,-3,6,-109,-159,-182,-252,-225,-252,-209,-220,-323,-249,-123,27,108,237,39,-227,-176,-141,26,983,1563,1989,2256,2042,1443,1643,1525,1088,1602,1474,1170,1150,824,708,924,1176,1036,269,443,781,769,425,308,405,367,433,461,448,234,194,163,218,246,100,-62,56,-52,109,-114,68,-271,33,-231,-10,-251,-107,-211,-189,-193,-271,-173,-258,-220,-344,-246,-222,-245,-241,-310,-276,-282,-207,-275,-244,-325,-317,-257,-224,-252,-269,-249,-255,-262,-227,-233,-233,-271,-256,-189,-188,-164,-249,-173,-198,-150,-210,-124,-172,-127,-154,-156,-239,-193,-248,-200,-220,-169,-212,-123,-176,-157,-249,-249,-297,-272,-295,-303,-316,-296,-263,-235,-217,-173,-234,-208,-250,-182,-255,-227,-234,-247,-244,-205,-187,-219,-199,-160,-156,-146,-178,-163,-199,-166,-183,-164,-214,-208,-196,-160,-168,-196,-193,-160,-204,-162,-188,-175,-206,-218,-198,-177,-203,-194,-169,-169,-172,-168,-160,-149,-149,-113,-128,-93,-92,-23,-69,-13,-56,-10,-44,8,-28,9,-21,0,13,41,16,24,3,43,28,54,11,12,-13,29,-17,4,-27,25,-15,29,-5,31,21,23},
+ /* IRC_Composite_C_R0195_T300_P015.wav */
+ {3,-3,3,-3,3,-3,3,-3,4,-4,4,-4,4,-4,4,-4,4,-4,5,-5,5,-5,5,-6,6,-6,6,-7,7,-8,9,-10,13,-17,28,-93,-234,-180,-207,-251,-293,-262,-250,-346,-376,-130,67,-6,108,-151,-710,-124,223,55,1941,2161,1520,2079,1404,552,750,680,497,384,1277,1177,733,896,1394,1657,1268,1283,1309,1208,892,805,954,655,670,296,482,320,570,596,507,445,118,348,106,469,16,25,-157,191,5,47,-157,-78,-270,-124,-129,-61,-219,-206,-188,-118,-157,-193,-216,-244,-222,-155,-190,-248,-263,-189,-260,-255,-305,-285,-272,-179,-250,-320,-353,-177,-207,-158,-311,-279,-294,-136,-181,-176,-231,-183,-184,-86,-72,-138,-172,-154,-185,-208,-132,-194,-245,-197,-155,-169,-170,-257,-250,-273,-291,-308,-267,-292,-322,-261,-262,-223,-282,-280,-302,-284,-249,-260,-293,-276,-203,-199,-209,-219,-251,-230,-225,-236,-239,-254,-234,-253,-179,-216,-170,-211,-150,-212,-180,-190,-146,-198,-192,-173,-159,-174,-166,-187,-188,-211,-146,-166,-163,-201,-184,-171,-129,-130,-154,-144,-145,-167,-132,-161,-149,-160,-132,-127,-113,-104,-89,-73,-95,-76,-83,-55,-53,-22,-5,-13,-3,5,22,0,15,5,-11,-15,15,-13,-5,-8,7,-15,26,37,33,12,52,50,45,34,80,35,79,31},
+ /* IRC_Composite_C_R0195_T315_P015.wav */
+ {-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,2,-2,2,-3,-145,-419,-273,-234,-320,-494,-368,-332,-137,23,435,141,-274,189,-707,-1152,1545,415,1656,4094,1604,1580,2053,473,-525,351,1046,431,4,613,555,843,494,1071,1048,1375,1139,994,1431,1283,1617,838,1011,491,1146,716,701,358,388,443,310,457,32,-5,-93,169,269,-27,91,-165,86,-189,135,-120,-103,-270,-74,-56,-217,-55,-238,-119,-288,-120,-263,-264,-223,-279,-179,-302,-173,-211,-262,-189,-255,-177,-382,-172,-263,-206,-302,-155,-222,-165,-156,-91,-226,-129,-208,-104,-116,-7,-182,-57,-43,-59,-165,-192,-254,-334,-329,-222,-307,-218,-299,-183,-230,-153,-307,-262,-341,-352,-360,-306,-320,-349,-329,-284,-313,-262,-287,-276,-348,-332,-282,-281,-235,-311,-213,-232,-205,-232,-209,-189,-252,-237,-224,-214,-199,-229,-157,-205,-196,-185,-173,-156,-212,-157,-188,-156,-172,-131,-151,-175,-157,-139,-172,-126,-151,-157,-177,-123,-115,-119,-116,-103,-151,-157,-157,-103,-111,-83,-143,-134,-106,-78,-57,-83,-76,-143,-96,-110,-30,-81,-37,-72,-10,-21,-9,18,1,-1,-42,21,2,14,26,52,25,26,34,53,32,44,40,74,42,66,49,90,62,69,50},
+ /* IRC_Composite_C_R0195_T330_P015.wav */
+ {1,-1,1,0,0,0,0,0,0,0,0,1,-1,1,-2,2,-2,3,-3,4,-5,6,-7,9,-11,14,-18,25,-38,72,-494,-377,-163,-458,-490,-5,-649,-505,-448,737,42,720,-5,-1466,655,-1957,-272,3638,1401,3790,5414,320,1005,1351,716,-1658,736,755,629,-241,367,775,655,1313,522,711,607,1017,814,1153,1014,727,1072,1193,1369,911,877,665,747,788,602,389,-2,301,79,299,235,78,-171,-171,-12,-204,-96,-124,-285,-390,-109,136,-127,-79,-244,-125,-236,-21,-257,-313,-264,-266,-248,-188,-112,-345,-304,-50,-265,-235,-235,-38,-345,-176,-119,-52,-156,-49,-98,-184,-269,-46,-139,-85,-206,-15,-64,-75,-25,28,-69,-306,-216,-145,-321,-127,-396,-359,-364,-161,-402,-370,-313,-329,-419,-337,-409,-317,-386,-319,-505,-396,-337,-244,-368,-365,-380,-286,-289,-230,-330,-297,-331,-175,-233,-184,-243,-195,-204,-144,-176,-187,-238,-158,-239,-170,-186,-124,-214,-122,-133,-166,-196,-122,-151,-204,-200,-147,-209,-159,-148,-140,-151,-108,-106,-148,-137,-107,-109,-157,-138,-152,-159,-152,-143,-132,-169,-84,-121,-99,-110,-53,-57,-49,-65,-56,-59,-72,-39,-80,-76,-50,-24,-78,-31,-4,10,-54,43,12,18,43,54,13,-6,86,38,22,50,62,50,38,99,31,62,60,58,29,11,38},
+ /* IRC_Composite_C_R0195_T345_P015.wav */
+ {-11,11,-12,12,-13,13,-14,15,-16,16,-17,18,-19,20,-22,23,-24,26,-27,29,-32,34,-38,43,-52,76,-328,-363,-214,-611,-509,-335,-643,-447,-869,31,57,1040,355,-374,1188,-2297,-4332,5821,-1811,4636,8422,1800,2573,2446,333,-2543,348,441,1038,-1221,-120,503,1705,557,994,621,1108,529,1387,553,713,268,987,1168,1373,742,1063,633,1079,800,733,478,430,-8,448,243,389,-34,240,-156,40,-68,208,-262,-163,-284,-85,-119,4,-292,-169,-173,-9,-177,-185,-284,-261,-239,-151,-333,-444,-278,-212,-269,-320,-207,-353,-167,-122,5,-101,-146,-236,26,158,-193,-6,31,-110,-13,194,-336,-291,166,-187,-339,71,83,-256,-36,64,-291,-253,-258,-423,-483,-404,-542,-450,-398,-404,-517,-415,-395,-300,-370,-455,-406,-370,-334,-365,-318,-452,-367,-267,-228,-288,-345,-283,-288,-195,-237,-211,-198,-242,-243,-148,-120,-215,-182,-175,-171,-178,-118,-143,-239,-153,-169,-160,-247,-180,-208,-203,-145,-188,-199,-188,-106,-162,-137,-157,-131,-109,-183,-154,-130,-109,-197,-150,-64,-168,-155,-207,-78,-176,15,-176,-113,-192,-34,-58,-13,-144,-90,-50,-81,-89,24,-35,-100,-56,-23,-9,29,37,-35,-51,58,55,55,-8,24,51,71,28,39,46,49,51,27,-11,48,41,22,-3,23,-14,20,-19,-13}};
+
+const int16_t irc_composite_c_r0195_p030[][256] =
+ {/* IRC_Composite_C_R0195_T000_P030.wav */
+ {-54,55,-55,56,-57,57,-58,58,-58,59,-58,58,-58,56,-55,52,-48,42,-34,21,1,-38,103,-854,-293,-223,-413,-662,-699,-525,-649,-153,-821,-339,218,2022,2054,-2330,-2792,1747,-9777,10764,1443,5425,12121,258,-1458,190,2417,73,-781,460,-747,-560,1297,150,875,435,1456,292,1300,-209,948,616,962,-100,649,571,794,577,979,597,904,611,978,804,976,113,890,241,591,176,615,-381,92,-14,208,-196,144,-25,-87,-290,-51,-201,-11,-376,13,-401,6,-326,16,-348,-73,-269,-196,-276,-77,-266,-298,-332,-42,-326,-208,-519,-147,-423,-93,-432,-257,-451,-109,-270,-192,-375,-151,-315,-188,-206,-37,-459,-168,-241,-10,-278,-73,-257,87,-155,-18,-234,-126,-305,-82,-294,-405,-294,-172,-409,-47,-89,-22,-89,128,-65,30,48,-38,-108,-174,-371,-254,-219,-255,-366,-375,-485,-192,-333,-204,-374,-171,-415,-254,-437,-213,-353,-257,-320,-265,-229,-230,-199,-344,-342,-208,-291,-328,-415,-224,-366,-172,-311,-156,-289,-178,-259,-84,-212,-136,-195,-136,-204,-23,-192,-135,-219,-38,-190,-41,-200,-34,-195,-41,-117,-47,-160,-96,-111,-97,-131,-73,-186,-78,-137,-70,-202,-93,-119,-55,-149,-67,-139,-48,-119,-34,-122,-39,-119,-31,-62,-1,-61,-28,-48,31,6,17,-8,75,29,40,45,65,21,45,14},
+ /* IRC_Composite_C_R0195_T015_P030.wav */
+ {45,-49,52,-57,61,-66,71,-77,83,-90,98,-107,116,-126,138,-150,164,-177,188,-179,-73,-966,-102,-989,560,-1173,-327,-1684,597,-1115,259,-1628,2183,1183,3440,-5302,3131,-10502,-529,12738,-6827,21598,5258,-7,-3187,1963,495,327,502,-665,-1769,1964,-371,1009,596,896,151,1819,-137,401,915,974,249,114,559,962,751,584,371,576,838,1123,906,351,-23,332,521,427,-138,-265,-100,55,-54,59,-205,-261,-77,2,-107,-229,-219,-403,-235,-134,-143,-470,-234,-177,-61,-236,-83,-258,-197,-192,-101,-300,-331,-254,-216,-242,-271,-289,-310,-261,-262,-333,-321,-293,-270,-333,-255,-243,-275,-316,-256,-252,-176,-243,-182,-212,-172,-289,-118,-228,-303,-307,-77,-225,-298,-230,-122,-403,-282,-152,-387,-451,8,13,-160,-49,124,-112,-104,87,-45,-358,-217,-135,-206,-167,-172,-229,-317,-197,-162,-307,-272,-363,-290,-325,-168,-360,-289,-359,-212,-286,-239,-278,-241,-270,-234,-333,-266,-308,-234,-344,-218,-357,-274,-331,-208,-244,-205,-284,-219,-226,-149,-177,-181,-201,-159,-198,-109,-172,-113,-218,-95,-145,-67,-151,-73,-148,-84,-129,-52,-118,-51,-142,-54,-113,-29,-150,-66,-118,-44,-150,-8,-105,-59,-133,-10,-103,-51,-102,-26,-114,2,-62,-14,-78,24,-62,35,-36,28,-33,74,-22,57,13,101,-23,94,36,50,32},
+ /* IRC_Composite_C_R0195_T030_P030.wav */
+ {22,-22,22,-22,22,-22,21,-21,20,-19,18,-16,13,-9,3,6,-23,62,-927,-68,-994,540,-922,-246,-1369,328,-1205,-194,-1442,1439,570,2758,-885,3393,-4925,-8851,7444,-11725,26992,7407,2376,4575,-342,-2312,-724,2866,-938,-1366,86,-585,1150,1637,627,500,364,713,726,1042,-231,616,243,1337,315,722,212,833,509,1128,741,763,-23,706,-315,392,-241,100,-771,-188,-212,298,-422,-413,-205,37,-281,-130,-523,-88,-503,-112,-573,-211,-454,-80,-504,-132,-294,-80,-239,-22,-204,-163,-320,-82,-296,-297,-476,-149,-313,-195,-414,-189,-328,-173,-333,-197,-351,-236,-353,-212,-335,-289,-358,-212,-232,-235,-269,-127,-247,-255,-385,-167,-387,-267,-392,-201,-373,-245,-334,-180,-331,-245,-322,-210,-238,-125,-198,-59,-138,-44,-137,-3,-58,9,-199,-115,-324,-112,-304,-122,-334,-195,-342,-88,-186,-146,-296,-157,-238,-181,-256,-164,-321,-198,-320,-193,-346,-189,-318,-169,-297,-240,-369,-178,-273,-261,-370,-222,-299,-226,-327,-186,-311,-192,-283,-157,-277,-144,-267,-140,-249,-109,-220,-95,-203,-109,-172,-51,-152,-88,-149,-49,-133,-83,-123,-30,-107,-62,-145,-55,-94,-23,-81,-49,-86,-1,-42,-24,-119,-38,-58,-5,-105,-50,-71,1,-68,-36,-53,-6,-19,20,-14,18,-29,55,-17,56,-9,73,3,81,35,97,32,73},
+ /* IRC_Composite_C_R0195_T045_P030.wav */
+ {9,-7,5,-3,0,3,-7,12,-18,25,-34,45,-60,79,-107,151,-363,-677,-240,-871,518,-941,-269,-1276,265,-1859,1187,-1350,2149,1,5698,-4523,4866,-12427,-2128,5167,3666,25146,2435,401,417,1825,-3164,2605,613,-1851,-1719,979,-329,2301,-426,1606,-126,1675,119,1149,-57,595,-80,1644,19,793,-129,1326,678,1045,-17,856,-22,267,-380,190,-844,-146,-664,199,-735,-167,-428,32,-402,-217,-411,-308,-427,-284,-543,-438,-454,-307,-561,-259,-430,-199,-381,-181,-382,-148,-228,-87,-405,-169,-303,-91,-361,-175,-378,-291,-318,-127,-301,-269,-260,-171,-316,-164,-268,-241,-361,-178,-341,-229,-322,-201,-335,-221,-314,-343,-328,-221,-321,-372,-308,-210,-400,-380,-322,-269,-386,-304,-356,-223,-292,-166,-317,-192,-91,-100,-158,-51,-73,-116,-23,-56,-150,-243,-92,-175,-169,-181,-177,-294,-169,-187,-210,-286,-130,-227,-213,-253,-159,-238,-150,-211,-249,-260,-144,-232,-247,-283,-227,-289,-178,-293,-252,-299,-148,-285,-211,-271,-197,-276,-200,-222,-204,-252,-176,-235,-205,-223,-107,-218,-119,-198,-109,-182,-35,-149,-101,-171,-62,-123,-44,-128,-75,-141,-37,-172,-54,-143,-11,-144,-27,-104,26,-103,23,-105,37,-73,18,-74,15,-63,4,-83,16,-68,-5,-50,47,-28,24,-35,41,-27,78,-21,77,-17,105,16,96,7,122,24},
+ /* IRC_Composite_C_R0195_T060_P030.wav */
+ {8,-7,7,-6,5,-5,4,-3,3,-3,3,-3,5,-9,20,86,-790,103,-872,55,-678,-196,-962,-387,-893,162,722,1609,608,2929,1713,-6837,-667,-12691,15713,13906,9242,5982,83,-1809,1076,1596,1326,-1529,-1392,-366,731,78,1368,-246,850,592,521,699,1115,310,930,973,592,664,159,708,710,489,-74,485,-697,374,-695,249,-1252,204,-915,137,-777,-91,-241,-403,-350,-466,-269,-521,-499,-540,-380,-320,-709,-233,-517,-228,-634,-244,-652,-290,-447,-147,-545,-241,-352,5,-488,-69,-437,53,-465,-6,-353,-78,-525,-24,-335,-157,-418,-27,-367,-103,-287,-241,-397,-158,-276,-304,-351,-181,-369,-225,-401,-209,-512,-184,-447,-153,-476,-152,-484,-76,-492,-243,-498,-127,-515,-186,-392,-135,-408,-53,-239,-82,-191,13,-138,-32,-118,-6,-177,-44,-187,-143,-246,-50,-262,-108,-264,-71,-256,-48,-325,-90,-349,-63,-352,-110,-280,-159,-311,-153,-350,-187,-295,-152,-318,-137,-192,-178,-252,-142,-284,-157,-277,-190,-286,-151,-282,-119,-257,-91,-310,-54,-224,-93,-207,-75,-245,-9,-203,-48,-237,12,-182,-40,-201,33,-146,-26,-200,-37,-156,-43,-159,-28,-130,-32,-114,20,-143,6,-113,12,-126,58,-103,21,-121,59,-91,44,-108,59,-43,47,-58,60,-38,52,-61,83,-36,62,3,66,27,84,84,65,66,103},
+ /* IRC_Composite_C_R0195_T075_P030.wav */
+ {100,-103,106,-109,112,-115,118,-120,122,-122,119,-110,88,-25,53,-874,378,-897,369,-1226,537,-1263,224,-1798,1274,98,2195,-462,4170,361,-3989,-3149,-11328,17722,9812,11683,3944,-511,-808,1931,2611,1751,-2704,-605,-430,728,-349,908,612,941,-687,931,759,-66,894,2123,310,1489,449,746,475,494,-493,-725,213,-1074,381,-1100,-205,-670,-115,-645,-170,-469,-431,31,-824,-248,-707,-458,-476,-267,-901,-228,-228,-601,-420,-335,-514,-545,-367,-632,-446,-566,-351,-391,-306,-444,-134,-388,-144,-333,-243,-194,-98,-434,-105,-173,-206,-249,-121,-377,-102,-345,-159,-256,-146,-470,-106,-327,-152,-330,-205,-368,-192,-409,-197,-444,-310,-359,-229,-461,-161,-393,-318,-351,-227,-387,-261,-314,-291,-270,-249,-242,-213,-299,-192,-269,-108,-253,-73,-278,80,-171,-11,-111,7,-198,-30,-155,-148,-117,-164,-168,-181,-155,-172,-221,-156,-207,-176,-229,-130,-292,-171,-280,-233,-288,-132,-237,-242,-209,-166,-245,-147,-263,-160,-240,-126,-261,-109,-276,-150,-274,-92,-247,-135,-225,-43,-207,-57,-174,-33,-157,-10,-172,-20,-116,-56,-146,22,-132,-61,-119,-53,-166,-22,-107,-81,-99,-40,-65,-89,-70,-32,-77,-31,-75,-25,-75,36,-146,3,-52,3,-100,13,-55,-5,-17,13,-41,5,-12,59,-13,32,3,61,44,107,53,129,85,118,95},
+ /* IRC_Composite_C_R0195_T090_P030.wav */
+ {-85,89,-94,98,-102,107,-112,116,-119,121,-119,106,-58,-455,60,99,-1054,-36,-88,242,-1635,433,-1255,1196,-1210,2540,-840,5344,-2798,4670,-10472,-874,1281,9198,19443,266,2404,-1705,3816,1662,3038,83,-1499,-2490,1368,-37,500,-334,1490,-626,909,-15,1075,678,1886,658,852,386,1418,146,400,-1073,-338,-633,-165,-1024,-383,-1251,-264,-407,-25,-1062,-140,-559,70,-716,-459,-642,-96,-725,-472,-412,-384,-647,-281,-605,-395,-572,-399,-706,-351,-583,-297,-495,-434,-423,-201,-406,-407,-323,-268,-341,-186,-360,-201,-241,-141,-313,-94,-257,-169,-208,-194,-224,-147,-275,-276,-255,-215,-224,-195,-256,-265,-271,-252,-352,-290,-430,-350,-309,-268,-387,-267,-289,-271,-262,-303,-332,-237,-287,-328,-292,-220,-307,-211,-297,-184,-216,-183,-248,-116,-180,-163,-187,-112,-160,-80,-117,-46,-81,-25,-91,-53,-114,-120,-176,-181,-173,-184,-205,-224,-154,-233,-229,-178,-204,-243,-197,-188,-194,-206,-154,-204,-205,-213,-116,-191,-127,-210,-145,-216,-173,-183,-177,-263,-209,-141,-116,-148,-107,-124,-68,-87,-45,-121,-68,-134,-77,-87,-29,-115,-67,-117,-46,-114,-27,-115,-45,-100,-16,-82,-32,-85,-17,-74,-28,-41,-27,-85,-23,-68,-40,-47,-15,-96,-13,-38,11,-39,-38,-19,1,-19,-3,-8,-15,-22,28,17,70,76,128,80,124,112,151},
+ /* IRC_Composite_C_R0195_T105_P030.wav */
+ {104,-111,117,-125,133,-143,153,-166,180,-197,218,-245,288,-401,132,-429,-287,-538,503,-701,-185,-1083,867,-1151,1236,-192,2589,704,2171,-548,-4634,-1245,-3979,18483,6281,7009,-196,501,1762,4063,3838,-1,-2732,-1085,-409,884,444,-393,-9,733,362,138,1179,1594,1300,947,317,734,700,55,-900,-943,-310,-712,-521,-933,-377,-1554,-143,-410,48,-924,-152,-440,-212,-554,-286,-601,-527,-371,-454,-653,-533,-426,-450,-579,-486,-483,-369,-609,-354,-543,-201,-457,-293,-586,-146,-430,-339,-522,-196,-439,-324,-340,-141,-423,-157,-344,-39,-390,-88,-363,-66,-244,-152,-284,-176,-153,-268,-264,-245,-148,-256,-290,-221,-325,-190,-340,-211,-490,-165,-333,-238,-471,-203,-235,-228,-397,-218,-264,-147,-365,-267,-367,-142,-319,-211,-356,-158,-290,-141,-243,-127,-217,-86,-135,-64,-128,-75,-153,-67,-155,-25,-190,-45,-193,-18,-259,1,-235,-77,-284,-88,-227,-151,-250,-186,-245,-111,-256,-126,-274,-46,-272,-88,-254,-32,-214,-71,-201,-144,-187,-98,-154,-182,-196,-78,-154,-85,-159,-36,-221,-26,-121,-4,-188,-47,-127,-22,-132,-24,-158,-49,-155,-2,-158,-21,-135,-30,-121,10,-87,-16,-118,10,-48,-22,-86,-12,-80,14,-80,13,-86,50,-103,29,-96,64,-85,45,-104,50,-45,64,-67,-11,-39,117,-14,158,27,234,13,225,68},
+ /* IRC_Composite_C_R0195_T120_P030.wav */
+ {28,-28,29,-29,29,-29,29,-27,25,-21,15,-5,-12,43,-140,88,-559,-189,139,-567,198,-314,-739,-383,1538,-450,794,642,4608,-2302,1277,-7331,2563,5148,5379,12280,2713,-323,-1693,7682,3305,1850,-1530,-2098,-1411,1431,-392,275,-715,741,-246,1255,618,1870,987,1146,368,730,-169,18,-891,-805,-1522,-439,-421,-616,-1006,-319,-441,-263,-511,-164,-630,-92,-636,-184,-746,-202,-725,-323,-658,-347,-529,-471,-673,-383,-415,-310,-627,-358,-521,-225,-567,-258,-424,-264,-432,-273,-312,-333,-413,-308,-330,-340,-367,-280,-273,-329,-276,-223,-220,-254,-266,-200,-177,-199,-276,-232,-217,-244,-204,-238,-182,-299,-214,-297,-195,-311,-235,-299,-177,-299,-241,-285,-222,-309,-277,-284,-244,-293,-235,-236,-241,-258,-206,-250,-223,-292,-255,-245,-224,-254,-179,-205,-152,-237,-116,-146,-78,-191,-75,-140,-27,-176,-63,-134,-82,-199,-79,-164,-84,-202,-123,-164,-105,-201,-110,-207,-105,-211,-126,-202,-134,-203,-129,-204,-131,-154,-100,-194,-94,-163,-74,-166,-82,-216,-107,-149,-27,-161,-56,-129,-40,-130,-55,-114,-53,-102,-63,-77,-31,-89,-106,-127,-83,-123,-74,-94,-24,-173,-31,-94,11,-133,-8,-83,-23,-88,12,-65,-46,-111,25,-94,13,-117,28,-88,37,-79,24,-35,51,-27,22,7,50,-3,53,7,103,86,163,91,162,75},
+ /* IRC_Composite_C_R0195_T135_P030.wav */
+ {6,-6,7,-7,8,-8,9,-9,10,-10,11,-12,13,-14,16,-18,-114,-234,-98,-110,-115,-173,-170,-232,-274,363,317,1353,133,2229,1323,703,-7423,4287,1521,5913,8831,4880,804,-872,5713,3941,3130,-2817,-2290,-315,304,-50,-26,-209,494,295,1100,751,1288,533,716,964,54,-449,-399,-528,-808,-934,-947,-951,-457,-538,-157,-625,-308,-385,-95,-571,-310,-374,-278,-494,-514,-429,-461,-556,-433,-529,-432,-535,-327,-580,-236,-492,-287,-555,-216,-430,-280,-451,-246,-351,-270,-341,-290,-325,-254,-404,-265,-383,-232,-420,-232,-398,-198,-399,-199,-300,-210,-291,-213,-230,-263,-273,-261,-215,-220,-262,-203,-257,-189,-275,-199,-298,-243,-292,-198,-258,-246,-263,-220,-238,-243,-271,-259,-242,-227,-263,-220,-247,-166,-281,-180,-274,-165,-251,-184,-245,-176,-216,-217,-207,-158,-156,-155,-166,-106,-127,-108,-139,-81,-152,-98,-167,-88,-170,-109,-150,-125,-150,-119,-119,-124,-135,-111,-142,-113,-144,-112,-168,-76,-193,-154,-199,-103,-124,-149,-137,-125,-90,-105,-96,-120,-90,-84,-94,-99,-96,-69,-90,-69,-82,-94,-80,-67,-60,-94,-70,-110,-76,-102,-51,-103,-55,-74,-38,-105,-57,-91,-76,-96,-51,-36,-59,-52,-57,-56,-61,-46,-70,-31,-32,-25,-47,6,-6,17,-33,-1,20,49,32,43,24,63,112,138,114,43,112},
+ /* IRC_Composite_C_R0195_T150_P030.wav */
+ {40,-42,44,-47,49,-53,56,-60,64,-69,75,-82,90,-99,110,-125,148,-207,85,-316,199,-301,148,-341,137,-377,122,76,967,463,1542,593,2935,-2335,-3746,3892,1126,7018,5853,6116,-1287,2364,4148,3574,181,-2393,-1125,-178,512,-398,-17,-462,310,1083,929,1228,538,479,431,450,-124,-446,-926,-681,-484,-854,-858,-886,-425,-380,-163,-187,-475,-333,-267,-193,-398,-286,-470,-331,-472,-511,-390,-535,-398,-443,-447,-458,-316,-355,-323,-348,-312,-366,-331,-282,-304,-410,-276,-324,-270,-334,-288,-347,-263,-345,-283,-348,-294,-324,-322,-384,-264,-346,-287,-352,-258,-326,-246,-345,-247,-332,-220,-276,-243,-276,-171,-257,-208,-277,-184,-237,-184,-265,-186,-245,-165,-259,-201,-253,-180,-238,-198,-272,-176,-246,-187,-277,-161,-252,-150,-275,-137,-267,-126,-254,-141,-241,-149,-227,-151,-206,-151,-203,-126,-181,-101,-170,-85,-185,-87,-146,-87,-170,-106,-170,-90,-160,-111,-150,-107,-140,-90,-144,-63,-132,-90,-238,-87,-160,-61,-203,-110,-165,-57,-102,-36,-116,-53,-98,-41,-96,-62,-105,-61,-102,-70,-120,-86,-109,-103,-103,-70,-67,-72,-85,-74,-124,-64,-94,-56,-139,-102,-99,-75,-97,-58,-61,-30,-94,-25,-74,-43,-104,-48,-76,-56,-75,-27,-39,-24,-3,21,-10,-1,6,97,22,44,1,101,93,134,63,82,45},
+ /* IRC_Composite_C_R0195_T165_P030.wav */
+ {-5,5,-6,6,-6,6,-6,7,-7,7,-8,8,-9,9,-10,11,-12,14,-17,25,-163,17,-80,12,2,-73,14,-200,92,163,755,471,1371,723,2348,-678,-3403,2150,1314,5172,5430,6608,508,1066,3048,2691,1177,-1954,-1312,-864,1114,-99,-395,-170,755,800,840,925,689,-7,-2,-92,-86,-565,-703,-538,-415,-580,-306,-607,-337,-594,-235,-197,-71,-393,-276,-461,-131,-367,-319,-372,-331,-590,-309,-448,-316,-391,-370,-330,-202,-345,-331,-285,-252,-333,-332,-343,-285,-341,-299,-355,-341,-319,-335,-324,-306,-321,-304,-329,-296,-343,-321,-372,-317,-381,-294,-371,-299,-341,-289,-334,-273,-311,-239,-276,-234,-285,-217,-256,-202,-250,-169,-221,-150,-205,-167,-217,-204,-247,-225,-236,-214,-247,-214,-207,-155,-197,-183,-192,-155,-160,-191,-236,-192,-219,-188,-240,-195,-229,-141,-216,-140,-210,-108,-198,-110,-186,-131,-164,-118,-161,-128,-132,-117,-113,-132,-130,-137,-165,-120,-157,-110,-125,-107,-149,-159,-131,-114,-123,-178,-132,-136,-75,-82,-32,-23,-71,-33,-49,-17,-94,-64,-87,-53,-94,-80,-79,-100,-87,-113,-66,-94,-109,-102,-113,-90,-94,-92,-105,-128,-124,-129,-89,-94,-67,-93,-83,-95,-80,-94,-87,-89,-91,-53,-81,-31,-57,18,-49,-13,-37,25,-7,9,-13,-1,53,58,59,79,109,133,124,84,60},
+ /* IRC_Composite_C_R0195_T180_P030.wav */
+ {11,-12,12,-12,13,-13,14,-14,15,-15,16,-17,18,-19,20,-21,23,-25,28,-33,39,-51,85,16,-87,129,-81,94,33,-96,-40,382,84,940,857,674,1733,496,-329,-2997,2450,4178,3824,5230,3832,1334,27,2852,1755,841,-2811,-750,709,798,-492,-489,295,1105,873,238,383,361,52,-483,-293,-277,-430,-468,-128,-283,-308,-272,-363,-267,-297,-189,-289,-143,-258,-242,-373,-291,-355,-331,-315,-246,-385,-325,-276,-197,-314,-270,-313,-267,-313,-307,-364,-269,-366,-341,-361,-328,-371,-363,-339,-357,-363,-329,-335,-334,-353,-302,-358,-291,-419,-330,-381,-332,-384,-319,-331,-309,-321,-276,-296,-256,-286,-256,-306,-268,-277,-214,-200,-211,-199,-179,-152,-213,-196,-243,-196,-273,-196,-241,-183,-226,-151,-195,-173,-198,-169,-171,-172,-166,-179,-179,-198,-192,-224,-204,-227,-203,-207,-198,-181,-177,-142,-148,-122,-136,-110,-124,-113,-120,-142,-140,-137,-157,-161,-213,-116,-179,-81,-164,-112,-182,-121,-113,-114,-132,-189,-130,-138,-73,-121,-47,-93,-7,-49,37,-29,-7,-77,-47,-80,-70,-85,-99,-107,-91,-49,-61,-81,-124,-69,-122,-37,-160,-57,-192,-64,-193,-77,-181,-87,-158,-111,-159,-105,-113,-89,-109,-88,-83,-83,-88,-75,-44,-73,-39,-53,-1,-6,52,20,54,20,68,72,99,107,107,128,102,141,66},
+ /* IRC_Composite_C_R0195_T195_P030.wav */
+ {-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,1,-1,1,-1,0,0,-1,2,-3,4,-1,20,-103,88,-97,77,-98,0,-92,123,108,628,541,868,946,950,-323,-2426,1960,1868,3655,4432,4145,1520,425,2257,2243,324,-1505,-101,360,566,-340,-97,521,852,598,427,177,417,31,149,-102,-24,-395,-11,-98,-149,-157,-72,-31,-41,-10,-27,-82,-183,-287,-120,-245,-255,-309,-131,-235,-200,-246,-222,-253,-210,-246,-249,-280,-281,-300,-278,-328,-316,-325,-352,-332,-302,-334,-406,-331,-345,-314,-353,-298,-355,-316,-331,-341,-377,-390,-356,-375,-325,-347,-301,-303,-263,-297,-274,-288,-262,-288,-280,-284,-231,-214,-205,-233,-199,-221,-205,-231,-218,-253,-209,-218,-203,-211,-199,-179,-191,-186,-199,-201,-193,-181,-187,-195,-182,-193,-188,-207,-197,-194,-197,-186,-192,-163,-178,-160,-165,-142,-165,-124,-155,-125,-159,-112,-160,-116,-190,-111,-165,-107,-172,-122,-190,-155,-169,-127,-164,-144,-157,-122,-135,-85,-113,-68,-116,-46,-67,-29,-54,-47,-65,-70,-92,-108,-92,-118,-99,-92,-87,-77,-99,-78,-106,-86,-118,-92,-123,-105,-136,-119,-126,-128,-143,-162,-171,-163,-154,-125,-147,-120,-134,-91,-125,-91,-103,-88,-80,-77,-45,-46,-3,16,24,24,27,58,42,84,85,129,127,141,127,125},
+ /* IRC_Composite_C_R0195_T210_P030.wav */
+ {-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,4,-4,4,-4,4,-4,5,-5,6,-6,7,-9,12,-23,-83,-41,-51,-44,-54,-36,-72,-62,13,62,362,515,745,618,964,123,-1474,242,1605,2935,3779,3927,2051,644,1570,1770,938,-679,-243,210,595,104,204,284,657,698,453,338,507,437,72,227,224,63,-55,88,141,215,131,225,97,158,60,38,-69,-107,-265,-85,-124,-202,-245,-131,-257,-191,-192,-178,-241,-145,-269,-233,-270,-235,-338,-254,-338,-292,-359,-271,-388,-290,-377,-344,-357,-293,-419,-370,-380,-349,-397,-346,-388,-357,-344,-302,-335,-306,-279,-276,-246,-273,-284,-282,-237,-264,-250,-226,-225,-248,-218,-230,-247,-240,-246,-259,-217,-216,-201,-233,-193,-207,-183,-205,-202,-228,-190,-207,-213,-222,-215,-237,-186,-220,-176,-235,-136,-217,-116,-201,-133,-200,-133,-159,-165,-150,-164,-152,-134,-165,-144,-175,-119,-164,-116,-139,-114,-152,-126,-132,-128,-147,-152,-173,-154,-145,-152,-115,-135,-100,-99,-65,-75,-79,-71,-101,-104,-126,-96,-135,-132,-139,-125,-80,-131,-108,-168,-90,-142,-81,-142,-146,-133,-121,-109,-142,-113,-121,-117,-148,-144,-150,-144,-150,-171,-140,-133,-106,-126,-118,-107,-114,-61,-79,-59,-59,-5,-31,13,-2,37,21,52,67,76,116,109,131,125},
+ /* IRC_Composite_C_R0195_T225_P030.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,2,-2,3,-3,3,-4,5,-7,14,-133,-89,-52,-68,-90,-53,-98,-77,-65,-141,-33,-38,144,467,407,586,730,265,-702,-561,1147,2053,3022,3625,2128,1090,1205,1750,1123,130,-65,370,545,406,83,446,636,787,529,661,549,526,605,368,384,101,455,156,304,149,290,238,156,207,48,113,-86,-57,-36,-176,-93,-129,-107,-209,-107,-181,-195,-158,-169,-157,-239,-205,-240,-206,-253,-259,-282,-324,-296,-377,-347,-379,-340,-400,-365,-377,-398,-363,-379,-335,-398,-330,-337,-283,-328,-250,-335,-246,-279,-228,-301,-284,-299,-253,-272,-251,-277,-231,-269,-213,-274,-207,-256,-219,-248,-212,-205,-234,-191,-244,-197,-238,-194,-226,-213,-226,-214,-216,-219,-201,-233,-193,-216,-184,-183,-195,-171,-198,-136,-183,-121,-177,-126,-151,-131,-156,-138,-160,-140,-152,-130,-143,-109,-146,-113,-168,-114,-165,-123,-191,-139,-186,-143,-163,-101,-126,-91,-147,-80,-140,-85,-158,-107,-181,-100,-149,-100,-152,-116,-152,-120,-144,-111,-159,-127,-155,-129,-148,-146,-173,-157,-145,-134,-136,-128,-146,-120,-128,-115,-125,-133,-149,-144,-153,-151,-147,-139,-128,-113,-110,-89,-78,-59,-67,-27,-39,-8,-19,9,9,34,44,63,65,98,113},
+ /* IRC_Composite_C_R0195_T240_P030.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-97,-166,-68,-82,-98,-145,6,-178,-148,-79,-61,-4,226,289,466,695,150,-363,-564,127,1778,2371,2730,2418,1314,1333,1958,1573,362,208,618,691,672,358,520,767,841,691,635,738,675,472,476,447,387,278,358,303,322,169,236,146,167,153,93,161,-50,82,-137,22,-215,-48,-220,-102,-183,-156,-150,-189,-134,-246,-183,-293,-242,-320,-276,-333,-344,-324,-341,-336,-359,-336,-345,-340,-353,-365,-331,-325,-327,-353,-302,-293,-288,-330,-303,-271,-296,-272,-313,-253,-304,-231,-298,-228,-279,-211,-267,-230,-276,-219,-263,-229,-267,-208,-254,-187,-265,-150,-261,-152,-276,-148,-255,-165,-256,-184,-237,-198,-227,-197,-220,-180,-224,-157,-210,-127,-200,-118,-181,-83,-171,-100,-162,-99,-139,-124,-137,-122,-137,-107,-131,-113,-152,-146,-173,-133,-190,-141,-182,-105,-142,-132,-151,-164,-146,-160,-134,-193,-153,-203,-128,-188,-144,-178,-164,-173,-166,-129,-130,-161,-160,-179,-136,-174,-125,-201,-162,-176,-100,-152,-132,-174,-152,-170,-137,-167,-127,-157,-111,-151,-85,-120,-73,-114,-88,-97,-72,-75,-82,-80,-55,-47,-53,-51,-32,-31,18,-8,35,22,73,65},
+ /* IRC_Composite_C_R0195_T255_P030.wav */
+ {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,2,-2,2,-2,3,-3,4,-4,5,-6,8,-12,21,-67,-186,-86,-78,-102,-151,-102,-59,-120,-188,-201,-77,-93,-133,190,315,388,642,206,-429,-627,-41,1512,2532,2996,2313,1394,1764,1723,1247,1241,976,437,321,813,834,517,405,589,1007,744,553,490,641,609,429,381,224,460,347,308,191,277,332,175,143,27,143,-12,2,-104,-86,-53,-114,-79,-254,-137,-211,-109,-349,-252,-297,-195,-348,-341,-330,-262,-295,-325,-316,-289,-220,-305,-292,-333,-256,-294,-316,-394,-312,-314,-286,-387,-317,-323,-233,-326,-302,-311,-250,-238,-292,-290,-296,-199,-259,-241,-292,-230,-245,-240,-270,-264,-223,-199,-230,-230,-203,-176,-179,-217,-226,-180,-203,-190,-239,-188,-230,-173,-226,-190,-237,-149,-184,-187,-190,-158,-126,-139,-130,-127,-103,-111,-83,-113,-124,-148,-136,-140,-136,-138,-118,-132,-127,-165,-140,-179,-161,-224,-175,-209,-159,-182,-149,-200,-170,-196,-150,-218,-152,-222,-177,-254,-168,-210,-186,-215,-137,-166,-128,-166,-128,-184,-106,-195,-174,-233,-137,-162,-153,-164,-155,-113,-146,-99,-141,-92,-113,-93,-86,-120,-80,-115,-69,-118,-75,-88,-73,-78,-77,-48,-78,-41,-54,-26,-50,-11,-21,13,14,31},
+ /* IRC_Composite_C_R0195_T270_P030.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,2,-2,4,-6,13,-118,-205,-234,-125,-147,-202,-210,-154,-149,-302,-174,-138,74,139,366,494,501,-30,-788,-660,656,2336,3548,2933,1466,1698,2087,1596,1331,660,745,348,609,649,510,592,471,837,634,881,692,658,657,499,658,390,588,291,406,283,323,211,84,205,87,193,12,79,-62,28,-174,-101,-266,-102,-288,-156,-317,-186,-313,-245,-324,-271,-272,-274,-260,-294,-238,-276,-248,-278,-258,-319,-271,-317,-281,-337,-312,-324,-337,-313,-331,-296,-324,-287,-323,-272,-287,-250,-300,-247,-285,-236,-292,-228,-244,-210,-272,-214,-253,-227,-239,-213,-239,-229,-229,-214,-226,-214,-215,-199,-227,-177,-203,-180,-193,-178,-164,-152,-146,-149,-125,-151,-141,-143,-150,-155,-139,-130,-168,-120,-114,-108,-126,-125,-154,-199,-182,-165,-181,-236,-178,-180,-150,-191,-167,-205,-200,-201,-200,-203,-212,-213,-204,-217,-180,-215,-180,-171,-178,-161,-169,-169,-194,-215,-198,-197,-181,-198,-150,-180,-147,-175,-139,-160,-138,-133,-143,-113,-144,-115,-133,-126,-110,-112,-106,-129,-97,-110,-96,-107,-98,-88,-83,-69,-93,-79,-84,-51,-65,-56,-47,-41,-18,-38,4,-20,19,6},
+ /* IRC_Composite_C_R0195_T285_P030.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,-1,1,-1,1,-1,2,-2,3,-3,4,-7,13,-190,-183,-235,-156,-218,-208,-304,-188,-211,-199,-139,-161,153,336,233,-123,-164,-557,-685,1147,1908,2035,3160,1492,785,1242,1667,1506,818,1143,817,1178,780,1057,657,807,713,683,790,563,729,595,855,599,704,615,614,540,520,362,304,245,337,219,250,133,197,59,126,-65,-70,-160,-89,-159,-231,-254,-291,-203,-274,-185,-304,-208,-285,-189,-264,-256,-331,-243,-311,-262,-308,-280,-304,-246,-335,-250,-318,-269,-309,-282,-300,-260,-340,-268,-307,-236,-284,-269,-325,-251,-300,-247,-310,-244,-277,-183,-239,-198,-269,-229,-228,-237,-229,-245,-249,-264,-220,-228,-201,-208,-179,-162,-96,-70,-76,-134,-147,-121,-145,-142,-175,-192,-136,-108,-69,-153,-156,-210,-206,-236,-198,-320,-233,-263,-173,-277,-125,-224,-144,-166,-131,-224,-164,-197,-216,-260,-240,-244,-177,-196,-187,-157,-155,-171,-202,-195,-206,-203,-187,-195,-236,-200,-188,-186,-176,-232,-177,-163,-133,-189,-164,-179,-140,-153,-146,-152,-146,-135,-108,-114,-110,-119,-88,-135,-96,-118,-89,-127,-122,-110,-95,-72,-108,-98,-91,-59,-48,-71,-44,-52,-26,-30,-20,-36,-34,-3,-13,9,16},
+ /* IRC_Composite_C_R0195_T300_P030.wav */
+ {1,-1,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-3,3,-3,3,-3,3,-4,4,-4,5,-5,5,-6,7,-8,9,-10,12,-16,27,-117,-227,-314,-248,-219,-228,-232,-272,-389,-204,-111,300,56,366,86,-1011,-298,44,-215,2477,2714,2032,2711,645,499,536,1654,449,374,611,764,837,821,1350,980,1002,808,1149,967,761,841,707,633,745,777,758,579,642,512,570,444,429,371,457,296,276,181,191,36,17,10,-72,-108,-107,-232,-151,-205,-165,-300,-163,-265,-253,-269,-203,-258,-301,-275,-269,-292,-272,-260,-302,-297,-289,-229,-300,-264,-305,-243,-283,-264,-269,-279,-280,-287,-259,-269,-276,-247,-263,-262,-247,-231,-256,-218,-280,-241,-295,-239,-252,-218,-256,-230,-258,-241,-251,-148,-189,-159,-149,-45,-91,-37,-119,-83,-194,-47,-124,-58,-134,-130,-231,-259,-239,-276,-269,-285,-258,-248,-198,-188,-240,-206,-250,-202,-249,-205,-247,-163,-226,-240,-217,-219,-189,-209,-212,-237,-257,-142,-184,-180,-176,-167,-213,-202,-187,-188,-191,-235,-229,-241,-179,-197,-185,-210,-199,-189,-160,-163,-174,-186,-151,-189,-138,-133,-147,-130,-137,-107,-118,-101,-102,-120,-113,-110,-78,-102,-64,-110,-74,-76,-59,-92,-76,-85,-71,-79,-43,-88,-39,-85,-19,-81,13,-60,8,-26,31,8,16,23},
+ /* IRC_Composite_C_R0195_T315_P030.wav */
+ {-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-4,4,-4,4,-4,5,-5,6,-7,10,-15,27,-80,-353,-110,-370,-400,-195,-345,-309,-394,-97,-188,193,754,56,-290,-194,-1922,214,1653,1159,4327,2754,1527,1212,743,317,539,1293,-56,-21,321,1262,295,442,708,1213,856,813,872,1000,917,1073,730,897,944,834,864,775,610,537,692,383,605,370,536,245,348,155,280,101,83,31,90,-127,-63,-179,-119,-272,-116,-304,-232,-233,-212,-345,-176,-295,-247,-334,-204,-342,-233,-195,-284,-324,-229,-236,-255,-304,-258,-323,-258,-297,-224,-323,-252,-263,-224,-317,-252,-224,-255,-281,-221,-218,-205,-288,-209,-253,-193,-244,-249,-201,-218,-210,-200,-172,-180,-181,-84,-203,-75,-54,19,-108,-2,-46,-171,-209,-203,-294,-294,-286,-264,-295,-154,-187,-222,-182,-252,-197,-249,-211,-305,-232,-289,-224,-284,-267,-256,-184,-221,-260,-295,-281,-237,-233,-228,-269,-251,-203,-162,-193,-192,-189,-166,-237,-188,-201,-208,-209,-181,-224,-228,-151,-192,-200,-209,-131,-196,-159,-162,-159,-166,-116,-160,-151,-131,-47,-142,-119,-122,-73,-93,-108,-96,-133,-90,-84,-86,-83,-90,-56,-96,-65,-65,-48,-80,-67,-79,-50,-60,-46,-63,-39,-44,-12,-27,9,-35,23,-3,24,6,41},
+ /* IRC_Composite_C_R0195_T330_P030.wav */
+ {-5,5,-5,5,-5,5,-5,5,-5,6,-6,6,-6,6,-6,6,-6,6,-7,7,-7,7,-8,8,-9,9,-11,14,-26,-447,-195,-107,-505,-457,-480,-118,-514,-260,-345,82,416,511,1319,-1763,-994,103,-1768,3014,4385,2231,5234,1274,290,-49,1679,111,-604,148,524,573,-122,973,360,1000,586,1035,552,578,788,885,854,618,749,894,854,1021,930,968,502,1006,765,768,438,460,339,388,236,299,159,177,-65,162,-6,-74,-134,-51,-230,-132,-193,-105,-327,-152,-257,-191,-291,-227,-315,-280,-252,-192,-306,-253,-281,-182,-326,-252,-283,-225,-353,-255,-282,-258,-322,-236,-271,-288,-246,-248,-299,-265,-254,-312,-330,-129,-295,-141,-204,-129,-190,-22,-154,-203,-125,-172,-156,-188,-111,-223,-112,-106,-241,-86,-37,-262,-238,-193,-103,-105,-7,-250,-241,-39,-63,-184,-238,-261,-364,-243,-263,-310,-361,-286,-407,-227,-301,-289,-311,-319,-263,-215,-201,-304,-287,-339,-226,-246,-239,-335,-276,-276,-181,-234,-181,-257,-180,-234,-151,-165,-203,-213,-194,-170,-205,-157,-164,-191,-168,-154,-86,-133,-128,-162,-96,-147,-81,-165,-68,-173,-90,-164,-64,-127,-68,-162,-97,-99,-50,-115,-84,-111,-102,-87,-74,-80,-123,-76,-57,-95,-59,-42,-45,-74,-38,-27,-9,-30,0,-55,36,-23,58,-21,61,-7,59,29},
+ /* IRC_Composite_C_R0195_T345_P030.wav */
+ {0,0,0,0,0,0,0,1,-1,1,-1,2,-2,2,-3,3,-4,5,-5,6,-7,8,-9,10,-10,-1,-563,-328,-175,-595,-424,-853,130,-981,36,-843,608,167,1104,1422,-2010,-2282,1073,-3818,6278,4848,2400,7303,1229,-443,-1130,2494,95,-616,-743,335,108,968,417,599,684,1073,630,810,221,839,469,1136,218,739,427,945,692,942,955,757,852,1008,762,614,598,745,200,403,51,357,29,333,-147,-65,9,35,-114,-161,-231,-52,-197,-139,-202,-61,-310,-211,-214,-165,-307,-207,-293,-261,-259,-204,-201,-310,-323,-244,-250,-260,-335,-226,-421,-206,-333,-191,-401,-188,-244,-264,-283,-225,-208,-338,-233,-69,-304,-181,-213,-18,-265,39,-68,-82,-113,-107,16,-329,-80,-324,-205,-399,-184,-328,-391,-87,-9,36,1,59,-85,124,-60,-143,-307,-231,-406,-296,-456,-311,-297,-269,-433,-350,-189,-283,-277,-303,-343,-325,-287,-213,-328,-275,-279,-293,-296,-268,-217,-284,-286,-294,-277,-236,-247,-201,-305,-195,-224,-135,-244,-185,-128,-225,-126,-186,-74,-235,-93,-209,-95,-133,-90,-131,-165,-80,-89,-69,-148,-104,-72,-157,-77,-134,-88,-171,-67,-113,-124,-110,-76,-110,-130,-59,-96,-88,-119,-61,-109,-81,-81,-67,-82,-54,-22,-49,-19,-18,2,-15,25,13,24,8,45,57,4,20,23,60}};
+
+const int16_t irc_composite_c_r0195_p045[][256] =
+ {/* IRC_Composite_C_R0195_T000_P045.wav */
+ {-30,30,-31,32,-33,34,-35,36,-37,38,-39,40,-41,42,-43,43,-44,44,-42,38,-28,-9,-568,-169,-659,-127,-629,-131,-879,-529,-702,-207,-686,-146,757,1500,46,1169,-4599,-1790,163,-4363,15423,4884,3940,951,722,-172,1158,1933,-227,-750,303,-613,1137,856,493,193,1077,347,1002,300,420,882,521,444,512,395,442,484,453,404,610,620,839,826,758,649,736,767,608,484,493,147,169,427,10,204,-311,19,-245,98,-241,0,-167,16,-127,-26,-105,-158,-191,-79,-246,-206,-268,-177,-349,-216,-328,-216,-366,-178,-332,-214,-308,-168,-352,-204,-312,-132,-301,-215,-309,-152,-304,-202,-336,-200,-308,-229,-340,-205,-331,-196,-326,-240,-274,-198,-310,-200,-321,-159,-282,-190,-264,-176,-207,-74,-246,-157,-167,-77,-245,18,-155,-133,-274,-40,-289,-273,-267,-139,-520,-214,-265,-252,-317,-46,-133,-17,38,121,-153,151,27,-13,-114,13,-297,-74,-188,-147,-332,-197,-268,-297,-199,-221,-310,-309,-263,-206,-258,-237,-414,-155,-291,-200,-367,-189,-287,-139,-241,-261,-247,-142,-190,-233,-239,-158,-249,-110,-242,-173,-207,-82,-217,-136,-180,-136,-164,-112,-177,-97,-134,-40,-164,-32,-115,-16,-91,-12,-112,4,-81,-19,-100,-20,-70,-21,-87,-6,-59,22,-68,-7,-66,36,-20,13,-47,-2,-27,28,-4,13},
+ /* IRC_Composite_C_R0195_T015_P045.wav */
+ {16,-14,12,-9,7,-4,1,3,-7,12,-17,22,-29,36,-45,56,-69,85,-107,143,-247,-403,-616,-230,-517,-270,-663,-670,-583,-556,-570,-300,850,1495,298,1490,-1579,-5393,1137,-9580,17573,8715,3526,4288,-490,-1083,280,3534,-555,-1021,-341,-114,804,1521,139,355,844,673,325,735,-35,1245,91,909,-18,912,280,465,82,792,554,703,257,849,594,952,381,794,169,438,96,219,18,183,-220,-11,-303,284,-345,-44,-429,-44,-355,-58,-224,-155,-342,-30,-264,-140,-360,-95,-355,-133,-396,-161,-354,-174,-312,-65,-314,-194,-357,-142,-289,-170,-390,-213,-337,-152,-369,-215,-364,-191,-332,-194,-330,-206,-298,-234,-318,-198,-344,-225,-368,-198,-333,-240,-308,-215,-230,-223,-291,-224,-258,-133,-220,-212,-260,-84,-207,-164,-294,-157,-248,-263,-285,-134,-218,-267,-295,-223,-237,-192,-163,-155,-68,86,-74,-67,-51,-46,-49,-45,-144,-181,-126,-51,-106,-136,-213,-189,-163,-189,-238,-230,-238,-276,-288,-300,-274,-264,-268,-228,-288,-202,-201,-180,-232,-217,-238,-174,-222,-220,-242,-187,-203,-190,-211,-143,-223,-148,-187,-110,-202,-179,-175,-124,-140,-207,-165,-148,-117,-138,-129,-91,-111,-52,-96,-31,-72,-57,-38,-41,-39,-63,-12,-65,-2,-67,12,-64,37,-48,34,-49,20,-4,26,-16,4,-9,34,-12,34,-23},
+ /* IRC_Composite_C_R0195_T030_P045.wav */
+ {53,-54,56,-58,59,-62,64,-67,70,-73,77,-81,87,-93,100,-110,122,-140,176,-592,-266,-620,-93,-807,111,-1033,-244,-1451,661,-1378,1038,309,3279,-1940,4376,-7187,-1452,-4658,38,22380,4913,3629,1106,-370,-1337,2958,848,-390,-2691,1295,-1155,2599,-36,956,635,787,53,821,200,581,67,983,274,565,247,646,211,751,653,273,546,759,707,776,230,704,98,258,-440,41,-44,-99,-570,-276,125,-89,-316,-287,-67,-256,-409,-175,-243,-300,-369,-371,-102,-291,-350,-382,-109,-199,-343,-360,-210,-168,-316,-283,-194,-249,-97,-252,-166,-374,-161,-245,-317,-297,-364,-202,-337,-267,-324,-305,-165,-347,-151,-302,-171,-371,-213,-207,-334,-383,-313,-191,-297,-398,-235,-273,-140,-391,-214,-292,-119,-316,-254,-221,-194,-227,-232,-269,-229,-362,-187,-364,-206,-335,-144,-247,-146,-237,-158,-174,-97,-117,50,-80,66,-91,178,-80,-68,-202,-96,-198,-132,-223,-177,-186,-153,-217,-140,-249,-182,-298,-91,-285,-230,-334,-153,-250,-218,-295,-154,-260,-140,-294,-141,-233,-87,-273,-133,-222,-68,-214,-169,-225,-107,-209,-114,-264,-92,-242,-49,-295,-99,-226,-66,-252,-85,-193,-65,-189,-57,-171,-14,-172,-4,-179,85,-157,3,-134,92,-113,-4,-109,69,-51,13,-79,68,-27,61,-58,66,-43,79,-23,54,-24,30,-27,66,-41},
+ /* IRC_Composite_C_R0195_T045_P045.wav */
+ {-71,74,-76,79,-82,84,-87,90,-93,96,-99,101,-102,102,-97,85,-52,-97,-607,-227,-812,438,-1024,-204,-760,95,-1636,140,-766,2279,-763,3056,150,2120,-5760,-6480,1711,-14,24602,5276,1036,-813,1031,1166,848,674,-478,-1487,-945,687,1855,-292,799,1002,786,207,559,505,363,364,343,530,502,11,500,785,837,217,463,907,599,564,357,380,-197,84,-367,169,-530,-810,-282,-180,-171,-519,-179,-442,-72,-160,-239,-494,-294,-88,-553,-268,-512,-278,-503,-198,-473,-229,-317,-213,-370,-187,-331,-249,-344,-154,-381,-135,-317,-147,-279,-176,-355,-133,-274,-305,-330,-235,-314,-312,-303,-290,-257,-159,-269,-234,-243,-173,-350,-204,-383,-239,-309,-233,-404,-183,-289,-321,-344,-212,-319,-251,-253,-168,-303,-204,-277,-189,-284,-216,-333,-204,-348,-208,-298,-166,-339,-189,-186,-273,-152,-87,-184,-166,10,48,-40,2,0,-18,-97,-3,-134,-124,-166,-216,-161,-149,-234,-162,-175,-239,-198,-150,-294,-241,-224,-190,-303,-189,-150,-236,-232,-162,-159,-199,-136,-231,-166,-169,-136,-155,-152,-125,-146,-133,-100,-123,-156,-121,-135,-145,-164,-174,-157,-151,-189,-118,-198,-112,-121,-108,-138,-101,-93,-63,-79,-82,-83,-26,-44,-58,-96,20,-91,-15,-43,22,-69,29,5,6,-19,24,3,1,25,26,26,17,31,13,22,22},
+ /* IRC_Composite_C_R0195_T060_P045.wav */
+ {59,-58,56,-55,52,-49,45,-40,34,-25,14,1,-23,55,-108,214,-619,-300,-123,-537,-172,-393,-415,-586,-104,-1306,69,-335,1375,535,2761,-686,3824,-8072,-1237,-7735,11382,19138,4865,2658,-2047,1916,571,2806,-624,-694,-1625,70,232,950,-64,1404,-414,1196,34,1403,-261,1089,343,834,-188,587,-251,1086,518,827,135,641,494,842,-31,161,-360,-291,-317,171,-783,-241,-1031,130,-617,-201,-704,-152,-418,-199,-454,-247,-285,-342,-410,-378,-429,-306,-467,-327,-419,-184,-471,-188,-474,-157,-446,-174,-469,-146,-371,-239,-326,-267,-268,-265,-279,-218,-230,-216,-236,-148,-289,-212,-358,-216,-330,-124,-259,-173,-298,-166,-287,-241,-319,-291,-323,-261,-320,-293,-286,-298,-318,-332,-305,-269,-323,-212,-266,-206,-301,-143,-304,-236,-268,-212,-344,-239,-265,-225,-364,-157,-292,-187,-206,-129,-241,-186,-152,-141,-106,-103,-15,-115,56,-68,26,-47,-92,-125,-141,-154,-176,-196,-181,-250,-197,-136,-112,-240,-89,-180,-145,-235,-146,-223,-248,-178,-229,-152,-219,-112,-250,-98,-141,-152,-155,-116,-137,-150,-110,-137,-128,-94,-113,-72,-189,-29,-176,-93,-125,-129,-123,-190,-65,-169,-92,-169,-68,-159,-48,-109,-46,-109,-25,-81,-31,-72,-27,-71,7,-65,-16,-30,-30,-44,30,-39,8,-56,53,-36,81,-51,97,-64,95,-35,60,-30},
+ /* IRC_Composite_C_R0195_T075_P045.wav */
+ {7,-7,6,-6,5,-5,4,-3,2,0,-2,5,-9,14,-23,45,-729,-86,-463,-18,-765,398,-1336,518,-1262,-130,-544,1878,-781,3861,-694,2694,-2479,-6040,-3168,1816,21907,5475,5383,-2274,1082,1645,3196,-180,-862,-1506,-288,-182,870,-91,1493,-388,779,238,870,64,614,1007,850,122,95,413,1397,214,480,297,844,-36,272,27,-433,-791,-467,60,-441,-446,-697,-441,-417,-402,-239,-587,-268,-547,-343,-464,-296,-435,-388,-347,-416,-430,-420,-403,-296,-406,-376,-408,-228,-422,-330,-353,-273,-416,-325,-234,-301,-372,-327,-219,-336,-296,-307,-215,-240,-202,-250,-161,-199,-207,-315,-154,-247,-142,-267,-158,-266,-221,-313,-201,-303,-302,-339,-264,-278,-318,-314,-301,-319,-312,-315,-204,-334,-223,-340,-127,-300,-165,-343,-198,-307,-246,-285,-207,-293,-254,-293,-183,-246,-202,-252,-100,-213,-78,-138,-60,-197,-164,-160,-109,-141,-50,-142,2,-155,50,-176,0,-217,-67,-265,-39,-241,-180,-198,-196,-186,-182,-111,-135,-134,-125,-176,-98,-184,-100,-212,-114,-228,-113,-95,-140,-143,-141,-78,-133,-100,-67,-178,-75,-161,-2,-319,35,-236,-7,-269,53,-223,-47,-143,-20,-108,-80,-80,-54,-96,-67,-96,-24,-164,-15,-108,-24,-125,-8,-47,-26,-57,4,-8,-39,-35,32,-69,30,-49,58,-82,89,-80,107,-80,104,-56,112},
+ /* IRC_Composite_C_R0195_T090_P045.wav */
+ {82,-84,86,-88,90,-91,93,-94,95,-95,94,-92,87,-78,61,-33,-240,-426,56,-683,113,-744,373,-1306,284,-1194,1644,-667,2652,-291,4245,-2423,-2014,-4070,-4168,13696,10251,10475,-3031,1940,668,3850,1809,-625,-1492,-994,-456,184,563,568,-96,1027,330,539,32,648,1068,571,102,392,437,1555,535,636,312,223,-470,382,-426,-676,-1277,-176,-342,-251,-706,-452,-477,-459,-100,-511,-346,-481,-454,-509,-470,-397,-448,-337,-587,-233,-611,-143,-563,-280,-521,-364,-455,-244,-466,-275,-326,-321,-388,-219,-441,-210,-415,-297,-415,-244,-390,-213,-373,-184,-325,-193,-152,-257,-243,-230,-170,-254,-69,-214,-166,-228,-242,-227,-305,-281,-292,-232,-343,-218,-305,-280,-254,-331,-243,-363,-249,-287,-245,-320,-255,-262,-272,-215,-275,-191,-269,-200,-292,-200,-287,-217,-267,-214,-217,-218,-189,-189,-148,-203,-120,-154,-118,-165,-102,-132,-161,-134,-144,-132,-168,-94,-134,-87,-100,-96,-67,-104,-58,-178,-114,-154,-134,-226,-145,-224,-215,-130,-174,-117,-174,-71,-88,-63,-109,-58,-78,-120,-50,-84,-79,-101,-63,-97,-110,-65,-129,-123,-160,-83,-162,-109,-152,-92,-143,-76,-108,-73,-110,-42,-74,-64,-99,-35,-69,-11,-79,-57,-78,-51,-41,-69,-60,-68,-23,-64,48,-114,27,-96,75,-109,79,-84,99,-121,109,-64,69,-52,115,-98},
+ /* IRC_Composite_C_R0195_T105_P045.wav */
+ {28,-30,31,-33,35,-38,40,-43,47,-51,55,-60,67,-75,85,-99,111,-72,-376,-88,-540,307,-524,-278,-931,669,115,481,924,2601,65,2397,-5614,-1324,-2647,10799,8614,10099,118,-2294,4895,2386,2569,-875,-924,-2723,797,264,147,-195,968,521,465,-376,1032,858,1253,-135,495,389,792,755,975,0,305,-239,-39,-629,-469,-1320,-587,-582,-54,-751,-376,-721,-115,-425,-260,-335,-443,-566,-430,-612,-353,-563,-240,-666,-197,-569,-261,-523,-199,-719,-213,-574,-181,-663,-112,-511,-96,-492,-191,-414,-208,-419,-314,-403,-269,-455,-207,-442,-146,-453,-78,-424,-85,-318,-146,-327,-204,-254,-94,-214,-119,-280,-105,-318,-172,-355,-253,-350,-232,-337,-213,-346,-174,-337,-196,-365,-187,-307,-214,-347,-231,-304,-233,-293,-202,-273,-150,-270,-125,-278,-116,-278,-165,-297,-205,-241,-198,-221,-169,-202,-83,-240,-100,-225,-103,-190,-146,-171,-133,-169,-147,-152,-62,-157,-83,-150,-63,-116,-82,-115,-86,-88,-91,-126,-129,-161,-111,-196,-127,-178,-79,-197,-117,-103,-73,-136,-26,-65,-11,-114,16,-69,41,-165,27,-83,-32,-83,-83,-89,-127,-138,-85,-115,-105,-151,-76,-90,-77,-130,-45,-81,-85,-105,-60,-35,-80,-62,-86,-27,-81,-18,-56,-46,-45,-2,5,-61,-31,-63,-14,-64,-36,8,-66,36,-43,73,-62,61,-61,80},
+ /* IRC_Composite_C_R0195_T120_P045.wav */
+ {-12,12,-13,13,-14,14,-15,16,-17,18,-20,22,-25,29,-34,41,-54,124,-315,231,-915,409,-381,76,-1011,336,-106,1161,-312,2462,834,1649,-538,-4939,-381,2968,10089,6155,8410,-2705,920,4167,3787,745,-2352,-1802,-28,292,-651,645,868,-434,709,424,388,1070,1285,-64,322,849,520,234,673,260,-252,-169,-219,-404,-898,-522,-1000,-760,-659,-37,-489,-625,-480,-117,-279,-318,-554,-444,-479,-476,-447,-397,-506,-426,-374,-367,-517,-341,-428,-392,-509,-321,-429,-316,-424,-291,-372,-230,-336,-266,-337,-314,-357,-245,-417,-326,-393,-223,-400,-276,-346,-207,-347,-196,-289,-214,-324,-195,-253,-149,-240,-179,-253,-165,-279,-187,-327,-224,-367,-235,-338,-247,-316,-185,-311,-218,-272,-162,-301,-187,-304,-196,-322,-148,-322,-157,-312,-104,-274,-142,-240,-141,-246,-193,-235,-171,-192,-186,-214,-189,-212,-181,-191,-123,-229,-156,-208,-159,-193,-117,-178,-146,-179,-127,-164,-97,-166,-64,-139,-51,-149,-26,-150,-13,-111,-43,-117,-85,-121,-102,-128,-113,-107,-143,-80,-75,-82,-86,-55,-52,-89,-61,-20,-13,-63,41,-66,-14,-65,-25,-99,-66,-90,-83,-119,-73,-60,-96,-94,-16,-118,-43,-110,-43,-94,-27,-153,-76,-126,-21,-94,-45,-92,-51,-33,3,-63,-11,-52,-9,-73,9,-41,-20,-40,3,-44,-34,0,0,-32,16},
+ /* IRC_Composite_C_R0195_T135_P045.wav */
+ {15,-16,17,-18,19,-20,21,-22,23,-24,25,-27,28,-29,29,-28,24,-11,-117,-145,-90,-121,-109,-173,-39,-435,83,-128,1107,344,1609,548,3339,-3005,-2346,-79,2825,6596,9304,4876,-1449,2789,1884,4671,84,-2193,-1608,-211,-70,580,333,233,35,298,-56,1401,612,725,299,829,803,425,-150,290,-261,-139,-438,-491,-740,-322,-692,-659,-1013,-400,-489,-130,-431,-461,-332,-161,-302,-454,-443,-489,-403,-443,-472,-442,-454,-357,-427,-305,-456,-382,-411,-333,-418,-365,-303,-376,-334,-316,-292,-311,-265,-339,-352,-281,-323,-329,-379,-310,-346,-316,-320,-334,-291,-274,-280,-297,-290,-272,-270,-230,-233,-229,-239,-263,-224,-254,-270,-293,-279,-264,-289,-263,-287,-260,-261,-232,-231,-207,-225,-198,-204,-183,-223,-189,-221,-183,-247,-188,-250,-189,-248,-190,-209,-183,-176,-163,-144,-170,-178,-173,-185,-158,-195,-164,-234,-222,-222,-206,-165,-198,-160,-175,-170,-167,-137,-130,-154,-126,-141,-104,-142,-91,-116,-80,-71,-71,-88,-42,-93,-59,-74,-48,-70,-66,-85,-79,-76,-90,-60,-94,-51,-65,-11,-46,-25,-16,-13,-19,-24,-51,-74,-67,-91,-21,-96,-77,-66,2,-73,-36,-56,-44,-134,-42,-35,-70,-118,-47,-68,-116,-72,-82,-75,-136,-24,-85,-36,-90,1,-62,-4,-20,-33,-14,1,-17,-33,-28,-35,-37,-9,-16},
+ /* IRC_Composite_C_R0195_T150_P045.wav */
+ {13,-14,16,-17,19,-20,22,-25,27,-30,34,-38,42,-48,55,-63,75,-91,119,-208,14,-179,43,-143,14,-237,127,-445,347,318,882,1092,671,2337,-2,-2406,-2033,3403,2686,9080,6065,1654,-385,2378,3537,1656,-964,-2514,-65,-61,604,313,-548,8,506,751,592,750,799,256,788,738,691,-486,-503,-169,-52,-560,-771,-513,-275,-418,-623,-527,-620,-550,-389,-73,-175,-357,-452,-335,-134,-523,-381,-574,-280,-554,-346,-501,-295,-395,-265,-376,-302,-406,-287,-380,-314,-400,-273,-369,-283,-407,-233,-368,-270,-408,-280,-353,-282,-379,-324,-362,-292,-349,-288,-317,-293,-299,-273,-329,-303,-342,-223,-328,-247,-359,-217,-332,-232,-362,-243,-293,-224,-266,-223,-255,-188,-248,-204,-263,-170,-234,-148,-228,-150,-221,-123,-200,-152,-223,-169,-222,-177,-244,-174,-210,-124,-206,-129,-206,-127,-177,-96,-151,-166,-237,-192,-200,-169,-204,-186,-233,-213,-217,-169,-178,-153,-156,-130,-156,-129,-136,-88,-131,-105,-128,-101,-129,-90,-83,-84,-106,-52,-43,-49,-65,-44,-66,-38,-70,26,-76,6,-88,-13,-82,-34,-41,-4,-34,-1,-14,9,-50,-23,-69,-16,-101,-10,-110,-17,-119,-37,-74,-19,-102,-24,-41,-56,-111,-39,-111,-124,-147,-53,-65,-109,-46,-41,-68,-52,-7,-29,-64,-43,-18,-36,-49,-47,1,-26,-14,-36,-17},
+ /* IRC_Composite_C_R0195_T165_P045.wav */
+ {-5,6,-6,7,-7,8,-9,9,-10,11,-13,14,-16,18,-20,23,-27,31,-37,45,-57,83,-131,98,-140,102,-154,88,-172,82,24,745,704,1159,942,1377,685,-3350,-75,2310,5071,6483,6504,-342,276,2310,3436,1307,-1968,-1879,-504,1149,580,-184,-486,250,728,683,585,651,265,901,267,694,-240,-105,-607,-269,-676,-500,-479,-378,-278,-303,-345,-367,-327,-471,-422,-217,-111,-233,-480,-413,-399,-332,-479,-354,-471,-387,-344,-260,-374,-267,-230,-298,-347,-353,-301,-344,-328,-357,-343,-372,-361,-346,-368,-366,-338,-358,-344,-365,-318,-353,-318,-336,-351,-319,-335,-289,-334,-309,-321,-326,-336,-348,-335,-354,-321,-327,-304,-329,-269,-270,-235,-245,-249,-208,-236,-185,-237,-214,-241,-196,-206,-169,-200,-166,-161,-150,-185,-187,-205,-193,-210,-166,-170,-138,-171,-155,-201,-170,-152,-109,-129,-189,-178,-185,-130,-167,-150,-206,-233,-222,-196,-166,-206,-190,-201,-159,-173,-138,-175,-147,-160,-114,-124,-105,-119,-77,-100,-117,-136,-90,-111,-91,-103,-87,-79,-69,-28,-22,-44,-41,-25,-6,-27,-13,-21,-10,-27,9,1,-13,14,-2,20,6,-17,-7,-23,-45,-82,-88,-89,-86,-91,-67,-101,-82,-96,-74,-71,-81,-64,-98,-60,-94,-66,-105,-103,-119,-65,-33,-28,-21,-24,-24,-66,-22,-25,-29,-63,-45,-61,-77},
+ /* IRC_Composite_C_R0195_T180_P045.wav */
+ {1,-1,1,-1,2,-2,2,-2,2,-2,2,-2,3,-3,3,-3,3,-4,4,-4,4,-4,3,-2,9,-9,70,-59,121,-126,127,-45,222,619,653,1289,587,1432,300,-1888,-1240,3381,3947,6141,5035,479,-148,2113,2998,773,-1353,-1664,690,1041,-58,-664,-159,711,746,445,284,522,787,289,291,216,96,-622,-296,-616,-684,-562,-153,-193,-156,-160,-230,-111,-119,-291,-584,-298,-144,-240,-398,-579,-379,-509,-208,-402,-311,-292,-227,-267,-259,-266,-213,-263,-327,-375,-294,-371,-362,-434,-364,-436,-381,-431,-375,-404,-373,-398,-329,-365,-326,-409,-345,-385,-333,-367,-288,-357,-297,-388,-309,-398,-314,-430,-330,-408,-271,-349,-243,-310,-230,-234,-197,-214,-201,-187,-203,-238,-232,-238,-212,-225,-205,-211,-176,-179,-201,-211,-228,-202,-224,-150,-202,-129,-214,-123,-184,-94,-133,-120,-193,-166,-163,-113,-144,-135,-197,-168,-225,-183,-213,-177,-199,-157,-207,-155,-195,-92,-173,-121,-200,-130,-155,-103,-148,-111,-166,-85,-143,-56,-147,-56,-154,-59,-141,-36,-120,-42,-95,-13,-67,16,-28,44,-44,24,-33,43,-27,82,-21,103,-17,122,-2,81,-69,27,-35,-19,-94,-112,-111,-109,-91,-94,-119,-134,-85,-80,-83,-129,-79,-97,-58,-112,-41,-119,-24,-104,-33,-99,-41,-79,-41,-68,-44,-36,-44,-71,-84,-70},
+ /* IRC_Composite_C_R0195_T195_P045.wav */
+ {-10,11,-11,11,-12,12,-12,13,-13,14,-14,15,-15,16,-17,17,-18,19,-20,21,-22,23,-24,26,-28,29,-70,1,21,-50,-12,7,-98,118,-221,432,295,945,530,962,1220,-497,-1827,293,2669,3717,6133,2421,667,647,2517,2286,876,-1019,-811,715,567,146,-552,68,761,748,406,192,794,584,428,293,114,-104,-113,-153,-376,-408,-234,-64,-66,-15,75,-43,-32,-84,-58,-289,-255,-381,-227,-301,-267,-362,-351,-257,-250,-265,-197,-240,-267,-205,-195,-288,-234,-313,-331,-391,-314,-376,-403,-414,-376,-388,-386,-415,-381,-386,-367,-392,-359,-382,-358,-395,-338,-337,-339,-329,-314,-348,-381,-383,-383,-385,-396,-353,-328,-277,-291,-244,-249,-220,-237,-207,-212,-209,-222,-227,-219,-186,-196,-201,-196,-190,-194,-210,-219,-243,-209,-201,-163,-195,-186,-186,-145,-123,-130,-154,-175,-167,-170,-122,-126,-124,-185,-179,-196,-160,-179,-161,-199,-183,-176,-134,-131,-147,-153,-166,-151,-161,-167,-166,-166,-160,-162,-139,-166,-135,-153,-143,-142,-125,-105,-102,-94,-90,-78,-72,-57,-50,-51,-21,-44,-9,-31,-16,-46,-3,-13,24,10,27,32,25,66,-13,-17,-41,-15,-51,-100,-128,-126,-123,-107,-116,-127,-132,-96,-99,-88,-127,-87,-121,-70,-130,-87,-96,-70,-95,-94,-64,-80,-73,-64,-54,-55,-52,-44,-57},
+ /* IRC_Composite_C_R0195_T210_P045.wav */
+ {-1,1,-1,1,-1,1,-1,1,-2,2,-2,2,-2,2,-2,3,-3,3,-3,4,-4,4,-5,5,-6,6,-7,9,-41,-44,-65,-30,-65,-8,-83,-60,-92,30,110,507,445,762,568,1174,-1167,-1019,628,2221,3797,4340,2039,369,1655,2128,2575,-74,-532,-44,828,327,-261,-60,394,940,522,463,465,701,615,239,186,177,226,24,55,-107,-121,-144,122,80,101,60,168,75,69,-42,-103,-208,-202,-275,-257,-213,-175,-274,-214,-201,-239,-203,-186,-264,-269,-249,-233,-294,-292,-329,-314,-341,-364,-402,-341,-398,-395,-448,-334,-429,-332,-431,-329,-423,-331,-395,-337,-340,-332,-347,-337,-368,-357,-389,-353,-376,-312,-331,-265,-307,-238,-251,-202,-250,-204,-228,-195,-243,-216,-235,-186,-234,-184,-216,-198,-218,-214,-243,-226,-238,-184,-210,-192,-215,-154,-146,-144,-168,-181,-177,-171,-140,-114,-169,-137,-193,-142,-178,-151,-186,-152,-183,-144,-144,-116,-143,-141,-149,-130,-174,-129,-185,-122,-193,-143,-180,-134,-169,-148,-166,-136,-141,-122,-130,-103,-114,-106,-102,-72,-91,-60,-67,-53,-70,-51,-40,-61,-20,-57,16,-56,22,-58,21,-49,-10,-48,3,-48,-36,-55,-46,-67,-83,-96,-101,-127,-82,-139,-122,-145,-101,-121,-109,-139,-130,-124,-118,-116,-120,-95,-97,-71,-73,-66,-58,-48,-24,-31,-11},
+ /* IRC_Composite_C_R0195_T225_P045.wav */
+ {-3,3,-3,3,-3,3,-3,4,-4,4,-4,4,-4,4,-4,5,-5,5,-5,5,-6,6,-6,7,-7,8,-9,10,-13,20,-75,-97,-66,-47,-85,-74,-101,-34,-123,-132,-22,222,292,490,466,903,275,-1049,-389,584,2358,3669,3152,1258,1261,1738,2331,1624,37,-28,186,674,40,219,313,646,713,656,528,603,598,473,348,444,144,373,151,223,11,95,112,186,158,153,282,115,221,30,18,-91,-32,-200,-106,-202,-164,-212,-141,-234,-274,-248,-205,-234,-252,-279,-220,-289,-259,-337,-286,-358,-337,-398,-361,-383,-377,-397,-403,-387,-416,-383,-391,-375,-383,-384,-351,-350,-337,-371,-325,-339,-314,-362,-307,-327,-273,-302,-260,-293,-265,-270,-253,-272,-249,-242,-222,-243,-203,-221,-193,-215,-188,-249,-219,-244,-222,-251,-227,-225,-219,-214,-206,-186,-149,-158,-170,-204,-178,-182,-146,-152,-156,-169,-175,-163,-157,-142,-159,-167,-156,-155,-165,-170,-148,-148,-131,-118,-114,-117,-133,-119,-145,-148,-151,-147,-145,-167,-157,-166,-139,-171,-158,-145,-135,-121,-133,-97,-119,-63,-84,-67,-101,-69,-67,-57,-75,-59,-62,-49,-63,-41,-77,-33,-68,-14,-83,-22,-64,-11,-77,-48,-83,-73,-129,-98,-117,-128,-152,-116,-144,-123,-154,-107,-170,-138,-138,-97,-115,-107,-82,-89,-65,-72,-83,-58,-72,-30},
+ /* IRC_Composite_C_R0195_T240_P045.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,2,-5,-83,-84,-72,-135,-73,-91,-109,-87,-133,-84,-173,-91,-36,199,307,354,685,469,-284,-594,-516,1131,3046,2851,2215,1571,1578,1884,1712,836,241,420,708,320,266,499,693,588,631,732,645,553,384,505,486,415,335,428,309,250,327,166,248,139,364,147,249,184,201,90,89,-4,-84,-57,-140,-149,-268,-170,-229,-181,-241,-235,-260,-225,-272,-259,-355,-270,-344,-221,-429,-254,-394,-305,-443,-348,-406,-390,-405,-383,-420,-382,-385,-345,-366,-308,-315,-295,-317,-301,-307,-307,-319,-316,-337,-273,-310,-260,-332,-260,-287,-238,-267,-235,-236,-259,-223,-218,-231,-226,-221,-205,-245,-216,-236,-203,-244,-208,-224,-221,-211,-210,-180,-186,-192,-188,-204,-183,-150,-161,-144,-182,-151,-199,-152,-176,-159,-170,-168,-142,-147,-118,-110,-117,-97,-125,-84,-116,-88,-125,-124,-122,-160,-117,-177,-157,-199,-179,-171,-156,-148,-174,-137,-139,-117,-130,-135,-112,-124,-104,-131,-80,-123,-82,-99,-80,-101,-46,-83,-75,-90,-80,-63,-59,-51,-122,-65,-82,-66,-92,-66,-83,-92,-88,-117,-122,-158,-126,-150,-152,-142,-139,-83,-139,-101,-146,-84,-121,-95,-110,-91,-88,-79,-72,-47},
+ /* IRC_Composite_C_R0195_T255_P045.wav */
+ {-1,1,-1,1,-1,1,-1,1,-2,2,-2,2,-2,2,-2,2,-3,3,-3,3,-4,4,-4,5,-5,6,-6,7,-8,10,-12,15,-21,35,-138,-127,-91,-119,-131,-100,-136,-154,-123,-162,-225,-17,208,157,422,539,315,-186,-874,-513,1317,2834,3212,2035,1165,1380,1985,1825,760,470,698,708,299,840,390,551,566,771,555,435,745,529,606,365,682,399,459,406,443,291,358,302,320,305,286,249,233,146,69,90,0,-26,-85,-106,-54,-197,-179,-210,-226,-306,-252,-328,-293,-273,-273,-342,-265,-302,-315,-353,-309,-387,-325,-457,-297,-442,-355,-408,-318,-407,-303,-346,-296,-308,-269,-329,-219,-337,-263,-338,-282,-364,-295,-326,-281,-306,-274,-302,-265,-294,-241,-286,-262,-250,-230,-264,-201,-225,-215,-219,-198,-213,-212,-205,-209,-201,-251,-202,-242,-212,-196,-186,-200,-172,-211,-195,-206,-149,-217,-164,-212,-147,-189,-117,-143,-88,-129,-55,-121,-125,-117,-90,-114,-92,-138,-75,-136,-123,-181,-119,-197,-132,-134,-131,-172,-162,-136,-187,-159,-156,-181,-172,-159,-163,-167,-116,-199,-172,-135,-102,-126,-131,-78,-101,-129,-76,-94,-120,-143,-86,-127,-74,-98,-46,-113,-79,-97,-44,-125,-131,-113,-86,-115,-124,-120,-129,-130,-91,-134,-118,-138,-78,-131,-110,-118,-103,-103,-97,-94,-71,-62,-45},
+ /* IRC_Composite_C_R0195_T270_P045.wav */
+ {-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,2,-2,3,-3,4,-4,6,-9,16,-64,-161,-143,-126,-145,-185,-145,-161,-193,-254,-120,-230,-52,146,316,329,329,253,-502,-967,-275,2022,3347,2710,947,1504,1884,1375,1901,809,618,609,671,737,376,610,640,652,766,573,669,526,783,441,547,504,550,598,531,667,314,551,275,554,115,507,96,221,103,170,93,44,90,-71,5,-109,-137,-246,-250,-241,-295,-289,-315,-295,-325,-258,-316,-295,-327,-300,-348,-332,-372,-354,-355,-374,-324,-355,-324,-341,-316,-283,-312,-268,-304,-257,-336,-239,-313,-303,-322,-321,-295,-351,-234,-324,-242,-342,-262,-303,-265,-288,-272,-254,-289,-193,-250,-195,-234,-188,-219,-212,-194,-217,-186,-231,-179,-233,-211,-209,-215,-227,-234,-228,-223,-193,-202,-196,-175,-156,-144,-145,-108,-127,-113,-111,-50,-105,-58,-119,-95,-117,-140,-166,-165,-130,-150,-114,-120,-117,-146,-129,-172,-175,-166,-189,-168,-160,-197,-193,-208,-220,-186,-186,-158,-220,-160,-145,-123,-177,-155,-188,-132,-141,-109,-129,-71,-127,-88,-107,-92,-141,-124,-132,-136,-104,-99,-93,-109,-90,-81,-97,-101,-102,-111,-126,-107,-115,-121,-123,-88,-123,-117,-104,-75,-79,-90,-92,-70,-77,-68,-59},
+ /* IRC_Composite_C_R0195_T285_P045.wav */
+ {5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,6,-6,6,-7,8,-12,29,101,50,50,117,188,58,104,258,239,166,306,686,455,833,834,700,494,424,49,743,2627,3265,3156,1306,-112,1114,559,356,246,113,-51,-113,695,8,344,126,384,-46,304,134,58,125,-42,60,-117,150,-115,60,-66,-74,-290,-174,-222,-336,-410,-393,-454,-500,-436,-457,-579,-566,-638,-618,-691,-652,-777,-695,-736,-701,-743,-633,-655,-650,-600,-573,-602,-585,-524,-544,-563,-496,-527,-483,-513,-414,-513,-387,-442,-351,-441,-335,-395,-360,-389,-346,-380,-350,-337,-339,-350,-286,-303,-303,-289,-278,-317,-289,-279,-256,-274,-224,-223,-201,-206,-165,-204,-151,-205,-147,-195,-148,-200,-177,-178,-170,-179,-162,-156,-149,-146,-135,-109,-105,-142,-94,-76,-93,-61,-56,-26,-52,-21,-71,-105,-113,-130,-140,-154,-74,-110,-107,-129,-114,-156,-108,-147,-143,-197,-121,-103,-164,-177,-160,-133,-135,-137,-138,-104,-105,-75,-105,-83,-126,-87,-67,-44,-97,-18,-59,-13,-45,-23,-53,-56,-43,-12,-14,-6,-40,1,-18,27,-19,35,-53,6,-9,7,11,2,-8,-3,22,16,-2,32,44,18,-5,28,17,14,19,9,27,26,56,44,54,64,65,88},
+ /* IRC_Composite_C_R0195_T300_P045.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-2,6,-170,-102,-259,-234,-199,-268,-51,-528,-137,-354,-180,92,-180,340,604,11,-371,-583,-984,10,2699,3142,3080,1412,327,1987,956,830,764,347,196,382,1091,294,859,889,945,523,1199,597,582,854,625,694,469,918,446,675,763,646,482,552,534,540,563,394,300,434,396,321,144,359,-94,142,-43,165,-138,6,-183,-179,-221,-161,-328,-285,-267,-402,-333,-327,-294,-327,-363,-296,-325,-259,-291,-320,-304,-304,-298,-291,-297,-314,-280,-329,-297,-314,-281,-234,-352,-241,-283,-217,-315,-280,-263,-279,-310,-268,-299,-296,-261,-277,-280,-277,-225,-216,-261,-203,-214,-192,-239,-227,-233,-213,-266,-208,-195,-200,-197,-191,-188,-186,-205,-150,-205,-153,-112,-151,-87,-35,-120,-124,-179,-137,-157,-174,-117,-144,-171,-153,-152,-138,-131,-174,-135,-128,-150,-114,-214,-174,-206,-228,-215,-210,-194,-196,-208,-219,-189,-187,-156,-164,-222,-168,-262,-148,-197,-176,-237,-214,-212,-100,-129,-146,-213,-165,-123,-124,-133,-162,-159,-151,-116,-118,-122,-155,-138,-137,-123,-99,-108,-104,-101,-84,-78,-75,-64,-83,-84,-92,-41,-94,-60,-107,-53,-86,-49,-66,-60,-68,-31,-65,-31,-29},
+ /* IRC_Composite_C_R0195_T315_P045.wav */
+ {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,2,-2,4,-7,17,-100,-204,-340,-371,-160,-344,-275,-415,-419,-249,41,-182,77,891,131,2,-1052,-1535,924,162,4003,4715,1544,1179,621,1424,674,1203,-197,55,273,545,402,710,753,673,897,715,647,832,758,686,732,814,620,688,779,690,604,649,586,620,586,617,478,512,430,467,385,389,275,162,250,131,159,97,100,-42,-92,-107,-156,-193,-270,-280,-274,-295,-312,-336,-301,-367,-310,-306,-332,-327,-275,-299,-308,-302,-264,-320,-240,-345,-250,-325,-245,-353,-231,-309,-234,-308,-240,-335,-236,-284,-266,-330,-242,-316,-259,-281,-275,-309,-222,-254,-279,-277,-236,-254,-242,-235,-247,-199,-188,-240,-203,-141,-139,-214,-131,-200,-170,-111,-70,-193,-145,-148,-101,-173,-117,-218,-163,-214,-197,-208,-111,-206,-113,-191,-104,-100,-70,-142,-89,-169,-106,-184,-156,-187,-185,-255,-195,-151,-192,-223,-180,-149,-215,-245,-216,-248,-232,-230,-274,-292,-203,-223,-171,-218,-208,-215,-141,-139,-194,-204,-163,-184,-155,-159,-154,-164,-134,-151,-130,-134,-130,-152,-122,-129,-133,-120,-106,-118,-102,-72,-84,-69,-84,-65,-68,-55,-55,-56,-72,-45,-57,-43,-50,-64,-34,-44,-40,-36,-22,-14,-32,2},
+ /* IRC_Composite_C_R0195_T330_P045.wav */
+ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-2,2,-2,3,-4,5,-8,-246,-348,-392,-294,-392,-112,-819,-204,-558,205,-381,275,768,476,319,-1186,-2693,1397,173,2904,7126,2191,1840,-141,1440,643,1148,280,-721,280,227,474,413,704,690,753,889,309,920,476,802,503,682,628,623,869,602,783,626,695,707,691,850,635,757,447,558,418,394,227,133,146,217,152,239,143,20,23,13,-113,-130,-110,-235,-231,-231,-223,-290,-311,-279,-339,-297,-335,-258,-358,-326,-332,-275,-283,-293,-287,-240,-279,-296,-244,-248,-261,-257,-280,-251,-271,-271,-291,-272,-276,-292,-293,-287,-273,-297,-261,-259,-291,-282,-238,-254,-285,-269,-242,-239,-234,-237,-211,-232,-160,-167,-153,-54,-121,-133,-68,-127,-55,-93,-170,-253,-307,-209,-255,-315,-307,-329,-320,-102,-172,-106,-41,-45,45,-125,12,-25,-98,-177,-185,-220,-166,-179,-213,-164,-210,-152,-240,-217,-183,-300,-182,-230,-224,-316,-238,-276,-217,-287,-209,-290,-207,-191,-176,-237,-198,-251,-191,-184,-201,-245,-147,-177,-164,-190,-112,-183,-108,-171,-100,-163,-85,-153,-101,-137,-74,-146,-57,-120,-58,-110,-43,-90,-50,-94,-38,-79,-64,-64,-54,-43,-59,-47,-30,-23,-30,-38,-10,-18,12,-13,10,-24,5},
+ /* IRC_Composite_C_R0195_T345_P045.wav */
+ {16,-16,16,-16,16,-16,16,-16,16,-15,15,-14,14,-13,11,-9,7,-4,0,5,-13,25,-45,84,-233,-338,-363,-485,-200,-447,-145,-898,-330,-612,95,-690,294,625,1287,-151,69,-4722,1521,-1345,1556,10396,3052,2742,68,1282,287,1583,813,-614,-309,335,28,768,552,558,584,902,480,734,438,738,500,576,491,546,493,681,435,611,561,752,683,864,812,738,819,537,703,581,367,218,0,254,20,344,-127,37,-166,211,-28,-62,-54,-160,-27,-117,-166,-287,-249,-103,-237,-262,-426,-232,-222,-305,-355,-320,-241,-298,-264,-311,-247,-264,-248,-253,-288,-211,-240,-212,-321,-248,-261,-248,-306,-335,-270,-295,-235,-360,-279,-274,-198,-287,-320,-253,-257,-194,-270,-236,-243,-201,-255,-169,-230,-203,-38,-204,-189,64,-47,-32,-96,-24,-149,-249,-211,-363,-445,-322,-199,-451,-374,-212,-206,-56,-101,52,-41,90,144,4,-84,38,-111,-234,-118,-217,-227,-246,-157,-274,-235,-253,-192,-341,-200,-287,-253,-258,-299,-242,-317,-247,-273,-208,-264,-246,-273,-176,-209,-205,-204,-238,-186,-184,-158,-218,-216,-193,-143,-174,-141,-179,-144,-152,-78,-161,-124,-122,-54,-126,-102,-95,-62,-64,-102,-54,-75,-51,-32,-78,-64,-53,-39,-81,-33,-75,-14,-32,-27,-68,2,-35,2,-22,5,-24,24,-12,-6,0}};
+
+const int16_t irc_composite_c_r0195_p060[][256] =
+ {/* IRC_Composite_C_R0195_T000_P060.wav */
+ {6,-6,6,-6,6,-6,6,-6,6,-6,6,-6,6,-6,5,-5,5,-6,7,-9,18,-62,-477,-304,-336,-458,-335,-491,-402,-829,-409,-707,-293,-66,983,571,504,539,-3665,-1218,-4247,2405,12687,3792,3387,222,562,745,2239,1323,-741,-286,-83,813,783,665,-6,1300,432,669,373,824,513,741,332,740,326,679,126,625,66,777,213,737,590,515,621,819,662,597,612,571,221,378,180,456,-17,193,-19,201,-103,188,-114,-50,-223,41,-272,-7,-204,-73,-274,-27,-179,-118,-266,-52,-236,-150,-298,-185,-328,-211,-330,-359,-321,-288,-288,-390,-233,-301,-238,-287,-186,-257,-179,-231,-185,-249,-207,-244,-242,-257,-261,-239,-326,-213,-312,-252,-311,-214,-308,-230,-270,-210,-269,-227,-231,-256,-281,-231,-249,-231,-210,-238,-174,-214,-204,-218,-156,-225,-179,-158,-114,-151,-171,-128,-150,-184,-87,-97,-145,-171,-201,-199,-179,-259,-239,-309,-310,-314,-227,-196,-170,-192,-26,-115,43,-61,74,-180,-52,-139,-83,-192,-18,-187,-104,-111,-67,-175,-118,-149,-164,-160,-118,-201,-219,-161,-187,-241,-189,-199,-195,-205,-163,-179,-154,-122,-150,-171,-167,-152,-190,-183,-192,-193,-159,-180,-150,-160,-87,-151,-131,-124,-50,-117,-92,-81,-58,-70,-16,-38,-34,-12,39,-10,47,38,87,17,83,31,82,15,52,1},
+ /* IRC_Composite_C_R0195_T030_P060.wav */
+ {20,-21,22,-23,24,-25,26,-28,29,-31,33,-35,37,-40,44,-49,57,-69,99,-268,-386,-296,-341,-306,-439,-461,-219,-926,-450,-515,-185,-151,2064,-248,2208,-557,-2551,-2664,-6482,6173,13499,9000,-215,137,1397,897,1847,1331,-989,-1152,-31,458,894,968,314,922,758,306,312,862,265,458,604,466,114,555,424,349,321,475,497,583,497,442,464,481,505,592,441,239,76,20,163,45,-273,-262,-336,-166,-64,-152,-189,-166,-140,-223,-230,-243,-348,-277,-328,-243,-252,-223,-247,-223,-225,-225,-211,-310,-229,-259,-253,-320,-259,-356,-330,-309,-289,-302,-271,-256,-257,-245,-269,-281,-283,-267,-256,-268,-267,-280,-263,-261,-261,-284,-289,-275,-272,-247,-274,-279,-271,-276,-305,-292,-268,-282,-266,-248,-248,-229,-247,-221,-202,-217,-233,-213,-204,-239,-209,-216,-194,-227,-155,-201,-185,-243,-159,-264,-210,-189,-201,-282,-175,-151,-178,-186,-73,-151,-201,-182,-71,-254,-132,-94,-52,-235,-22,-27,-101,-159,-17,-130,-166,-55,-23,-206,-132,-126,-159,-211,-63,-187,-189,-148,-84,-174,-142,-124,-126,-185,-149,-155,-156,-187,-149,-205,-136,-153,-105,-164,-138,-137,-75,-158,-128,-135,-115,-148,-94,-125,-133,-123,-51,-120,-102,-85,-18,-84,-52,-42,8,-51,10,0,9,-20,40,16,14,24,69,21,25,23,33,2},
+ /* IRC_Composite_C_R0195_T060_P060.wav */
+ {49,-49,50,-50,49,-49,48,-47,45,-43,39,-34,27,-17,1,24,-67,158,-573,27,-273,-533,-199,-358,-57,-1237,277,-801,-585,81,1678,-52,2584,-635,2281,-6550,-1907,-4733,12287,16138,2134,560,-1141,3390,1047,2071,-850,-288,-1730,541,499,654,282,1081,13,1053,-59,982,296,639,439,387,97,735,-102,457,298,541,229,951,144,642,-123,725,239,371,-407,173,-217,5,-418,64,-709,-238,-708,-195,-402,-221,-414,-199,-238,-175,-279,-243,-447,-227,-531,-270,-429,-178,-455,-173,-350,-170,-312,-238,-284,-268,-355,-248,-402,-300,-358,-251,-472,-244,-350,-274,-353,-195,-309,-279,-276,-243,-232,-248,-185,-198,-344,-177,-263,-274,-355,-198,-341,-222,-358,-178,-344,-238,-289,-271,-338,-286,-218,-316,-206,-256,-230,-264,-214,-239,-277,-261,-259,-225,-268,-221,-134,-246,-182,-192,-154,-260,-116,-218,-234,-234,-227,-254,-254,-224,-164,-220,-284,-56,-257,-45,-289,-17,-299,22,-225,103,-264,-36,-33,-158,-37,-147,39,-238,-62,-117,-69,-262,42,-153,-162,-86,-22,-214,-31,-193,-19,-225,-87,-128,-143,-84,-102,-114,-95,-106,-146,-143,-5,-308,-86,-140,-102,-254,41,-68,-208,37,-26,-47,-124,31,-99,-131,-35,-104,-59,-141,32,-115,3,-48,1,-54,32,-67,-4,-31,-40,-50,45,-30,-17,43,3,8,10,37},
+ /* IRC_Composite_C_R0195_T090_P060.wav */
+ {20,-22,23,-25,26,-28,30,-33,35,-38,41,-45,49,-54,60,-66,75,-87,-10,-413,-67,-233,-277,-289,-247,-282,-617,-150,-183,967,613,1964,132,3132,-4890,-30,-7492,6867,13211,9263,1898,-2424,3417,1010,3400,-250,-877,-1856,320,-121,560,520,754,353,491,-65,931,362,494,135,792,604,460,-39,664,258,476,82,671,151,141,64,562,-256,-248,-550,-170,-357,-396,-602,-158,-390,-415,-610,-298,-495,-302,-712,-205,-411,-237,-411,-197,-452,-250,-501,-239,-421,-284,-481,-170,-438,-181,-420,-184,-419,-262,-417,-218,-376,-336,-394,-333,-356,-335,-390,-304,-355,-247,-352,-237,-395,-250,-384,-156,-227,-147,-266,-148,-197,-207,-288,-280,-286,-312,-317,-266,-316,-238,-306,-223,-320,-187,-342,-177,-339,-198,-318,-212,-319,-219,-304,-241,-273,-207,-279,-190,-248,-107,-255,-126,-251,-112,-272,-95,-249,-163,-250,-133,-247,-177,-254,-198,-235,-194,-229,-212,-194,-191,-142,-191,-92,-153,-45,-145,-65,-138,-64,-93,-82,-65,-113,-49,-140,-78,-118,-32,-137,-37,-107,-30,-59,-142,-106,-132,-11,-240,49,-159,20,-179,55,-117,-17,-81,-27,-68,-101,-72,-98,-48,-107,-136,-19,-93,-74,-119,94,-211,28,-129,49,-157,78,-96,21,-143,105,-58,-15,-28,13,-42,14,-40,-16,-41,-38,-39,21,-40,-15,-19,-23,-62,3},
+ /* IRC_Composite_C_R0195_T120_P060.wav */
+ {-11,11,-11,11,-11,10,-10,10,-9,9,-8,7,-6,4,-1,-4,11,-23,54,-588,228,-347,10,-393,78,-279,-133,-619,373,107,880,1033,1066,2024,-241,-1833,-4036,1812,3742,13338,5090,1325,-1146,2733,2814,1516,-118,-2246,-488,96,262,192,815,13,476,529,495,181,475,265,780,210,341,81,498,784,541,47,-30,-8,36,-29,-17,-592,-609,-210,-251,-604,-616,-485,-190,-407,-234,-662,-290,-550,-301,-639,-361,-458,-250,-462,-279,-431,-205,-390,-287,-423,-271,-396,-265,-443,-263,-432,-176,-477,-278,-447,-188,-475,-218,-453,-216,-462,-223,-420,-282,-431,-248,-385,-293,-403,-276,-425,-204,-367,-74,-400,-116,-375,-65,-372,-120,-338,-171,-350,-192,-321,-226,-351,-196,-350,-234,-344,-164,-341,-158,-306,-138,-338,-156,-268,-116,-265,-176,-243,-204,-212,-198,-229,-226,-192,-144,-137,-153,-181,-152,-194,-135,-178,-195,-187,-227,-175,-208,-170,-244,-159,-254,-137,-245,-163,-226,-152,-162,-107,-156,-107,-123,-75,-95,-2,-107,-23,-62,-12,-74,-60,-54,-88,-41,-86,-11,-107,-13,-74,-29,-98,-23,-52,-89,-64,-61,-71,-89,-73,19,-96,13,-86,41,-106,92,-5,1,-25,-7,-37,-56,34,-91,-24,-86,10,-49,-33,-31,-56,10,-83,56,-62,45,-72,47,-53,7,-38,12,-40,-11,-4,-41,-34,-33,-33},
+ /* IRC_Composite_C_R0195_T150_P060.wav */
+ {-16,16,-17,17,-18,18,-19,20,-20,21,-21,22,-22,23,-23,23,-23,22,-20,15,-1,-129,61,-83,-118,-17,-51,-30,-188,-95,109,510,730,1005,940,2137,-1039,-410,-2971,1165,5406,9365,3937,2137,-649,991,4216,933,-931,-1885,270,39,471,-2,92,175,614,97,357,338,829,636,315,-32,510,435,434,61,257,-175,-293,-260,-101,-474,-492,-360,-265,-315,-367,-291,-300,-567,-400,-366,-215,-495,-451,-522,-369,-523,-275,-402,-310,-403,-263,-346,-267,-319,-256,-370,-300,-367,-298,-401,-295,-443,-304,-417,-322,-444,-298,-381,-312,-439,-329,-390,-317,-384,-301,-362,-302,-383,-295,-368,-322,-392,-272,-324,-246,-326,-211,-303,-225,-323,-240,-326,-214,-295,-235,-325,-259,-307,-231,-265,-204,-266,-221,-283,-193,-226,-150,-215,-156,-235,-140,-226,-173,-226,-138,-181,-139,-211,-149,-228,-146,-230,-122,-202,-104,-157,-89,-169,-122,-180,-141,-172,-119,-242,-182,-247,-146,-221,-160,-209,-160,-222,-134,-194,-158,-172,-105,-115,-90,-104,-68,-78,-70,-76,-8,-32,19,-27,16,-5,-14,-32,0,-60,-11,-71,10,-79,-60,-81,-34,-99,-28,-10,-16,0,23,9,-66,-19,-7,-4,-45,41,7,-5,-25,-4,7,-31,-3,22,-19,-42,6,-62,-7,-36,56,-32,47,-21,39,-84,-6,-47,-14,-45,33,-19,-3,-57},
+ /* IRC_Composite_C_R0195_T180_P060.wav */
+ {10,-10,10,-11,11,-10,10,-10,10,-10,10,-10,9,-9,8,-7,6,-5,3,-1,-2,6,-12,19,-22,153,-20,-54,110,44,10,-80,172,36,605,639,998,719,1758,-623,-249,-1810,1268,4590,6942,3540,1131,148,816,4013,533,-755,-1438,271,-13,605,142,55,202,291,-131,465,665,844,217,120,213,663,92,-57,-100,67,-191,-270,-528,-381,-572,-177,-319,-6,-278,-198,-211,58,-313,-463,-592,-248,-465,-368,-496,-344,-514,-270,-361,-242,-341,-263,-349,-193,-335,-278,-416,-272,-416,-335,-439,-313,-451,-348,-453,-349,-443,-392,-472,-363,-430,-386,-408,-312,-392,-320,-379,-310,-370,-331,-403,-335,-385,-348,-366,-269,-311,-276,-302,-234,-290,-316,-341,-275,-241,-217,-208,-227,-228,-238,-222,-184,-224,-208,-241,-186,-232,-205,-245,-203,-214,-163,-151,-128,-135,-145,-180,-187,-204,-171,-188,-145,-158,-112,-157,-75,-116,-69,-149,-129,-160,-136,-115,-133,-152,-184,-177,-167,-165,-197,-218,-169,-194,-138,-205,-133,-162,-112,-132,-87,-117,-57,-79,-38,-55,-39,-50,-29,-58,-18,2,13,-3,31,17,9,8,29,-11,-10,-3,19,-49,-35,-14,-39,-21,-64,-32,-53,-24,-15,-14,-23,27,17,51,-9,-15,-18,18,-37,5,-74,-13,-18,63,0,46,7,63,-15,19,-10,7,-30,-32,-44,-79,-107},
+ /* IRC_Composite_C_R0195_T210_P060.wav */
+ {-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-5,5,-4,4,-4,4,-4,-36,-70,2,-43,-45,-73,17,-83,-76,-100,274,192,709,499,1049,474,192,-1587,-214,1449,4357,5043,2092,784,976,2790,1402,1131,-633,70,310,385,217,300,87,393,309,640,644,573,357,469,403,414,393,291,95,9,177,41,-38,-147,-145,-178,-91,51,-23,82,6,81,-66,-34,-205,-207,-298,-223,-348,-275,-305,-257,-377,-308,-322,-230,-324,-269,-300,-305,-334,-286,-346,-334,-384,-351,-411,-405,-389,-413,-415,-387,-382,-401,-384,-393,-405,-388,-417,-364,-399,-357,-398,-374,-392,-376,-343,-359,-316,-314,-243,-324,-280,-326,-283,-293,-262,-262,-275,-249,-231,-206,-195,-215,-224,-241,-210,-220,-242,-276,-255,-264,-198,-192,-190,-189,-210,-164,-172,-169,-172,-189,-153,-193,-127,-166,-117,-158,-112,-128,-133,-107,-136,-117,-161,-108,-110,-142,-127,-184,-138,-172,-147,-192,-188,-193,-158,-153,-183,-168,-189,-142,-164,-152,-151,-135,-105,-91,-78,-46,-70,-9,-22,-10,6,-3,11,9,0,-18,-34,-49,-47,-78,-56,-80,-88,-84,-41,-76,-89,-89,-34,-62,21,-11,29,-63,38,13,32,-26,-6,-18,-15,-14,-11,-43,-37,-18,40,-10,3,-52,3,-65,-18,-66,-33,-83,-53},
+ /* IRC_Composite_C_R0195_T240_P060.wav */
+ {-5,5,-5,5,-5,6,-6,6,-6,6,-6,6,-6,6,-6,6,-6,6,-6,6,-6,7,-7,7,-6,6,-6,4,1,-68,-141,-43,-120,-98,-71,-122,-111,-111,-115,-151,-61,253,299,522,567,502,242,-1198,-647,857,3187,4265,2111,1152,1068,2588,1288,1124,171,189,245,613,495,306,631,410,664,513,726,614,455,361,493,538,415,305,397,398,328,162,355,127,167,95,91,92,127,159,137,126,136,112,42,-54,-59,-214,-99,-334,-210,-340,-229,-357,-264,-345,-232,-312,-253,-294,-304,-352,-288,-347,-349,-364,-352,-373,-394,-376,-368,-434,-376,-402,-393,-434,-406,-412,-357,-430,-351,-354,-374,-337,-289,-323,-276,-287,-233,-304,-270,-311,-283,-321,-267,-321,-256,-305,-231,-272,-202,-256,-217,-272,-229,-238,-234,-247,-261,-261,-253,-218,-198,-218,-190,-226,-148,-209,-150,-201,-174,-181,-174,-172,-158,-155,-141,-131,-122,-138,-117,-118,-119,-130,-144,-143,-130,-146,-135,-155,-149,-172,-147,-158,-167,-175,-169,-144,-176,-150,-108,-129,-129,-136,-93,-143,-97,-99,-87,-71,-74,-15,-38,-48,-75,-66,-95,-101,-91,-93,-103,-154,-122,-128,-116,-84,-70,-79,-65,-51,-28,-23,-20,-21,-53,-15,-9,15,-49,5,-40,-18,-42,-33,-30,-86,-81,-68,-62,-85,-44,-26,-89,-49,-55,-24,-61,-16},
+ /* IRC_Composite_C_R0195_T270_P060.wav */
+ {5,-5,6,-6,6,-6,6,-6,7,-7,7,-7,8,-8,8,-9,9,-10,10,-11,12,-12,13,-15,16,-19,22,-27,38,-79,-217,-116,-99,-179,-211,-36,-231,-204,-130,-219,-231,-133,80,277,396,430,429,-88,-768,-1080,327,3345,4354,1751,849,1821,1217,1828,885,517,269,311,1017,365,820,357,716,549,590,621,516,736,326,780,263,770,281,705,378,636,371,475,311,429,255,409,238,273,140,314,213,208,138,105,115,-23,74,-205,-25,-248,-155,-287,-280,-252,-297,-307,-288,-293,-267,-333,-245,-352,-304,-348,-348,-351,-433,-337,-451,-334,-472,-324,-423,-375,-381,-372,-314,-375,-276,-267,-321,-301,-279,-273,-291,-287,-302,-304,-304,-290,-236,-296,-289,-263,-294,-284,-324,-265,-281,-292,-245,-245,-266,-260,-214,-224,-254,-200,-260,-209,-252,-220,-200,-254,-196,-233,-158,-228,-136,-185,-148,-205,-143,-175,-148,-149,-166,-120,-148,-104,-128,-140,-125,-152,-101,-130,-77,-199,-88,-178,-108,-197,-126,-198,-117,-194,-113,-172,-133,-128,-87,-131,-57,-112,-60,-136,-71,-150,-125,-162,-106,-205,-139,-165,-138,-149,-118,-134,-84,-134,-83,-120,-64,-109,-79,-116,-53,-90,-64,-49,-97,-69,-54,-86,-38,-63,-120,-64,-43,-89,-78,-45,-32,-110,-9,-49,-30,-91,-36,-87,-34,-90,-12,-62,-20,-67},
+ /* IRC_Composite_C_R0195_T300_P060.wav */
+ {5,-5,5,-5,6,-6,6,-6,6,-6,6,-6,6,-7,7,-7,7,-7,7,-8,8,-8,8,-9,9,-9,10,-11,16,-103,-316,-221,-172,-255,-229,-364,-48,-533,-236,-67,-300,259,642,185,100,427,-1196,-1745,476,2467,5309,2589,680,1682,925,1569,1041,949,-237,234,798,421,371,569,750,604,969,544,826,529,786,297,628,582,490,514,782,585,536,518,533,446,484,585,264,478,477,367,328,417,65,219,65,246,-91,156,-64,72,-138,50,-297,-48,-254,-210,-356,-206,-256,-287,-317,-214,-367,-254,-373,-339,-401,-317,-430,-376,-368,-350,-418,-316,-298,-353,-273,-305,-281,-287,-227,-371,-293,-252,-310,-323,-260,-272,-324,-243,-257,-310,-290,-276,-297,-255,-201,-324,-280,-270,-230,-282,-221,-248,-298,-222,-268,-241,-260,-255,-277,-235,-187,-236,-210,-172,-224,-173,-145,-191,-157,-155,-157,-126,-186,-84,-150,-177,-153,-72,-128,-133,-127,-100,-229,-197,-160,-241,-236,-171,-176,-120,-75,-47,-120,-105,-128,-76,-160,-120,-127,-109,-139,-135,-144,-192,-179,-152,-203,-173,-143,-161,-61,-179,-143,-104,-126,-147,-78,-176,-138,-177,-87,-160,-110,-137,-186,-155,-86,-135,-127,-105,-97,-124,-34,-111,-50,-117,-72,-123,-75,-65,-94,-51,-83,-75,-56,-47,-45,-13,-39,-55,20,-56,36,-41,12,-24},
+ /* IRC_Composite_C_R0195_T330_P060.wav */
+ {3,-3,4,-4,4,-4,5,-5,5,-6,6,-6,7,-7,8,-9,10,-11,13,-15,18,-22,28,-41,71,-233,-373,-96,-345,-318,-371,-265,-252,-594,-439,-312,-197,197,323,301,1318,-757,-1616,-868,-2081,2422,6337,5378,1528,381,1195,1007,1545,810,158,-165,224,315,652,555,370,728,945,600,540,730,606,560,567,567,493,662,473,574,547,639,468,638,527,625,475,584,476,643,403,465,284,372,243,235,43,108,49,102,20,-28,-86,-48,-49,-120,-149,-133,-123,-173,-198,-229,-246,-291,-242,-300,-328,-373,-296,-357,-299,-377,-351,-356,-276,-311,-324,-289,-282,-268,-271,-255,-256,-273,-249,-285,-230,-270,-219,-299,-282,-269,-275,-287,-307,-267,-290,-268,-297,-284,-263,-248,-257,-244,-243,-257,-290,-273,-259,-265,-237,-261,-238,-273,-209,-234,-171,-171,-157,-118,-120,-137,-80,-115,-96,-166,-45,-140,-79,-126,-114,-259,-243,-265,-228,-274,-267,-264,-220,-203,-117,-137,-118,-112,-33,-82,-41,-93,-102,-121,-120,-145,-175,-177,-147,-143,-65,-127,-138,-136,-94,-127,-130,-217,-183,-159,-168,-202,-184,-203,-240,-202,-146,-195,-160,-147,-169,-143,-72,-128,-191,-139,-128,-170,-166,-129,-160,-152,-97,-112,-123,-68,-72,-87,-76,-27,-63,-48,-50,-16,-43,16,-15,-10,-1,57,47,30,49,50,35,14}};
+
+const int16_t irc_composite_c_r0195_p075[][256] =
+ {/* IRC_Composite_C_R0195_T000_P075.wav */
+ {12,-12,13,-13,13,-13,13,-13,14,-14,14,-14,14,-14,15,-15,14,-14,13,-12,7,8,-224,-367,-189,-595,-344,-165,-801,-581,-302,-836,-618,407,530,134,1455,-966,-265,-4329,-4113,4525,6992,8542,304,-199,2762,1323,1544,1359,195,-1272,815,548,454,489,1188,303,1217,433,606,486,940,200,865,394,415,452,439,167,687,262,388,668,618,250,776,505,518,525,594,287,552,461,358,276,304,160,239,30,35,-21,-62,-125,-17,-31,-371,39,-211,-122,-197,40,-391,72,-166,-93,-262,-84,-337,-76,-325,-174,-301,-196,-378,-120,-367,-324,-293,-268,-402,-208,-271,-377,-322,-212,-314,-262,-200,-245,-294,-186,-222,-275,-226,-280,-246,-300,-262,-182,-254,-272,-206,-217,-307,-182,-214,-248,-250,-184,-258,-303,-196,-229,-312,-240,-213,-256,-268,-167,-202,-256,-145,-174,-141,-306,-39,-235,-192,-132,-161,-142,-205,-78,-192,-93,-268,-65,-239,-166,-229,-88,-215,-227,-134,-262,-99,-230,-94,-297,-147,-247,-15,-245,-197,-51,-171,-94,-46,-60,-97,-14,-100,14,-99,-80,-92,-24,-178,55,-112,-23,-104,47,-121,-73,-80,-27,-196,-98,-74,-188,-162,-54,-110,-182,-133,-30,-121,-83,-72,-116,-145,-93,-89,-136,-159,-163,-75,-145,-145,-85,-61,-103,-107,5,-74,-43,-3,-22,-72,-26,-24,6,-85,5},
+ /* IRC_Composite_C_R0195_T060_P075.wav */
+ {-14,15,-15,16,-17,18,-19,20,-21,22,-23,24,-25,27,-28,30,-32,35,-42,65,-281,-389,123,-583,-268,-119,-384,-436,-660,282,-1424,931,-191,1870,-113,1526,243,-2974,-2922,-3038,6766,14120,3000,-177,427,2482,2472,607,1128,-2092,683,-982,2038,-839,1456,-30,1050,188,720,669,391,864,257,483,214,493,238,321,378,114,592,45,886,-9,646,103,701,13,345,57,116,121,-88,171,-386,97,-335,-262,-369,-373,-308,-409,33,-533,5,-484,24,-435,-237,-319,-208,-233,-416,-146,-317,-166,-309,-232,-304,-340,-158,-439,-169,-482,-113,-521,-200,-450,-258,-409,-296,-298,-425,-296,-402,-280,-434,-185,-317,-227,-279,-194,-241,-311,-232,-320,-314,-306,-233,-329,-276,-236,-245,-297,-256,-187,-267,-262,-210,-246,-287,-248,-205,-331,-278,-229,-232,-260,-191,-174,-217,-208,-141,-202,-243,-151,-110,-284,-132,-132,-134,-277,-115,-207,-229,-254,-153,-213,-329,-111,-236,-248,-245,-82,-281,-102,-144,-93,-133,-52,-82,-139,-23,-121,-40,-135,7,-127,-34,-127,-9,-67,-119,-37,-34,-134,4,-70,-77,-81,-62,-64,-127,-18,-109,11,-156,60,-224,27,-77,-130,6,-101,-38,-151,93,-175,-123,0,-32,-129,-111,115,-229,-48,12,-46,-196,-37,-14,-163,-83,-1,-137,-48,-101,91,-141,15,-60,28,-35,-33,-10,-28},
+ /* IRC_Composite_C_R0195_T120_P075.wav */
+ {-13,13,-14,14,-15,15,-16,16,-17,17,-18,18,-19,19,-20,20,-19,19,-16,12,-1,-57,-48,-189,-132,-75,-227,-56,-343,28,-501,199,201,917,964,1130,545,1226,-3782,-981,-1166,8252,10379,3341,-521,-669,4572,428,2096,-1386,-405,-1098,1383,-2,236,525,510,124,361,340,604,403,459,20,703,550,361,4,507,76,379,200,87,66,-36,226,133,30,-418,-183,-144,-119,-262,-333,-294,-550,-263,-353,-297,-518,-525,-481,-405,-172,-382,-282,-383,-195,-329,-205,-358,-340,-304,-296,-417,-305,-321,-319,-400,-254,-454,-283,-418,-294,-482,-262,-427,-329,-482,-271,-419,-319,-403,-345,-351,-373,-409,-381,-310,-297,-225,-271,-290,-302,-223,-252,-250,-249,-220,-293,-267,-259,-270,-267,-281,-238,-321,-208,-300,-203,-357,-197,-295,-169,-277,-177,-273,-210,-234,-196,-252,-188,-188,-144,-221,-121,-160,-150,-180,-111,-124,-171,-110,-188,-133,-213,-124,-220,-168,-203,-176,-182,-229,-156,-255,-117,-221,-99,-240,-61,-158,-122,-129,-39,-92,-133,4,-74,-53,-77,35,-129,8,-50,5,-61,-24,-33,-46,31,-56,58,-35,39,-37,57,-74,2,-108,-10,-136,18,-141,8,-114,4,-132,-22,-37,-31,-20,-71,79,-149,14,-32,50,-85,-47,94,-59,21,-39,82,-145,47,-47,-14,-82,-16,-3,-58,-48,-44,-22,-40},
+ /* IRC_Composite_C_R0195_T180_P075.wav */
+ {-17,17,-17,17,-16,16,-16,16,-15,15,-15,14,-14,14,-13,12,-12,11,-10,9,-7,5,-2,-2,11,164,-118,156,-74,171,-166,281,-259,331,-163,647,483,1342,96,2125,-652,369,-2506,1012,3788,6928,5436,-854,927,1011,2973,419,642,-1377,-224,371,309,-128,78,268,228,233,434,427,397,-91,692,541,379,-60,222,-23,131,178,60,-172,-56,-82,-145,-311,-297,-431,-248,-412,-107,-371,-72,-353,-277,-448,-332,-408,-362,-461,-379,-530,-388,-407,-290,-364,-334,-409,-288,-419,-285,-384,-338,-447,-343,-386,-344,-453,-378,-390,-377,-502,-386,-429,-361,-457,-343,-463,-441,-462,-348,-398,-369,-416,-375,-435,-312,-336,-244,-309,-307,-321,-263,-272,-272,-262,-236,-196,-217,-232,-215,-261,-261,-304,-256,-296,-220,-241,-218,-248,-199,-190,-206,-213,-223,-195,-209,-182,-150,-161,-155,-165,-145,-155,-129,-127,-102,-102,-126,-107,-145,-133,-143,-141,-131,-140,-117,-119,-86,-121,-100,-131,-130,-130,-139,-142,-162,-155,-148,-128,-171,-136,-140,-117,-101,-76,-112,-44,-78,-20,-37,-38,-18,15,-6,2,39,44,55,-20,46,41,30,8,37,20,-14,0,-10,0,-57,-38,-55,-62,-113,-27,-88,-33,-69,-21,-80,1,-86,62,-11,16,23,128,6,102,-12,152,3,46,29,36,-97,2,-15,22,-109,-54},
+ /* IRC_Composite_C_R0195_T240_P075.wav */
+ {3,-3,3,-3,3,-3,3,-2,2,-2,2,-2,1,-1,1,0,0,1,-2,3,-4,5,-7,10,-13,20,-42,-111,-129,-71,-115,-137,-61,-159,-123,-192,-19,-219,406,390,680,549,886,-353,-736,-1471,543,4694,6064,1476,785,1081,2341,1848,567,793,-1054,878,-19,694,-27,624,453,574,713,561,524,289,447,341,517,436,227,504,311,411,259,396,204,319,114,96,38,-78,39,-23,9,123,-104,210,-61,44,-245,-60,-225,-163,-284,-292,-366,-364,-318,-284,-326,-284,-257,-269,-279,-348,-246,-376,-367,-329,-388,-355,-428,-316,-418,-375,-426,-318,-396,-436,-393,-407,-383,-405,-383,-442,-422,-393,-344,-375,-309,-340,-270,-311,-270,-269,-256,-268,-233,-283,-233,-230,-236,-283,-256,-265,-301,-274,-317,-261,-298,-265,-239,-262,-221,-248,-188,-287,-192,-249,-152,-246,-140,-231,-148,-218,-130,-170,-165,-154,-171,-127,-181,-99,-138,-109,-120,-99,-88,-129,-61,-150,-63,-199,-44,-206,-106,-201,-113,-189,-182,-146,-180,-174,-177,-146,-150,-167,-103,-131,-76,-138,-14,-119,-32,-66,-17,-34,-48,8,-80,-30,-22,-34,-12,-52,1,-29,-7,12,-34,-30,-36,-43,-95,-29,-80,-102,-17,-119,-24,-119,10,-78,-16,-105,-38,-66,-45,-15,9,-36,-32,33,-12,-9,-66,-12,-59,8,-23,-10,-6,-22},
+ /* IRC_Composite_C_R0195_T300_P075.wav */
+ {5,-5,5,-6,6,-6,6,-7,7,-7,8,-8,9,-9,10,-10,11,-12,13,-14,16,-19,23,-30,49,-174,-216,-220,-266,-146,-276,-310,-167,-398,-257,-446,-119,2,150,904,282,399,-249,-994,-2605,51,5569,5353,3304,-294,1237,2394,748,1912,84,-494,511,465,372,641,761,120,1277,373,764,283,1087,-27,731,558,213,625,490,578,331,755,261,576,308,533,270,531,241,337,345,292,249,254,130,252,95,124,0,-94,22,-124,-166,-120,-222,-195,-188,-102,-288,-138,-247,-177,-285,-135,-368,-230,-298,-370,-301,-355,-365,-394,-255,-460,-300,-338,-376,-356,-289,-388,-412,-303,-449,-224,-403,-214,-327,-319,-233,-280,-268,-283,-281,-308,-227,-300,-251,-210,-330,-195,-309,-196,-294,-197,-342,-211,-310,-249,-268,-272,-295,-243,-275,-237,-249,-206,-274,-172,-248,-191,-211,-154,-258,-145,-194,-183,-134,-143,-154,-131,-111,-163,-86,-129,-136,-111,-159,-135,-153,-128,-194,-126,-204,-111,-239,-106,-205,-215,-163,-175,-185,-155,-144,-130,-163,-92,-105,-142,-4,-111,-109,-19,-118,13,-189,9,-76,-118,-8,-6,-126,-54,46,-138,-64,43,-92,-25,-132,48,-164,-57,-43,-117,-199,-11,-164,-58,-105,-75,-100,-150,-59,-62,-137,-80,-148,-65,-126,-49,-62,-33,-77,-10,-18,-11,-21,-15,-36,-38,-38,9}};
+
+const int16_t irc_composite_c_r0195_p090[][256] =
+ {/* IRC_Composite_C_R0195_T000_P090.wav */
+ {-1,1,-1,1,-1,1,-1,2,-2,2,-3,3,-3,4,-5,5,-7,8,-10,14,-25,-385,-133,-356,-344,-390,-312,-438,-400,-852,-107,-995,-245,-186,1358,-771,1473,28,-1710,-3762,-3025,4119,8200,5927,-785,1558,2250,1837,2098,631,-318,150,-77,1215,-23,792,865,600,981,659,366,950,511,766,502,516,589,299,331,571,105,609,462,485,538,594,470,640,393,432,325,604,259,355,336,454,33,263,182,-24,-124,121,-231,-50,-93,49,-230,-101,25,-196,-123,-21,-160,-161,-132,-136,-155,-268,-121,-146,-311,-112,-328,-201,-220,-280,-214,-304,-233,-227,-250,-242,-334,-256,-283,-393,-267,-285,-332,-331,-224,-295,-279,-171,-151,-361,-199,-239,-227,-317,-168,-211,-370,-182,-150,-343,-204,-192,-224,-319,-203,-137,-357,-146,-223,-237,-276,-162,-201,-262,-186,-209,-147,-267,-46,-252,-162,-146,-182,-199,-143,-218,-204,-108,-250,-163,-90,-241,-137,-125,-122,-272,-111,-188,-211,-160,-160,-164,-201,-231,-114,-175,-180,-212,-172,-181,-129,-130,-77,-150,-114,-39,12,-122,-9,-11,-46,-21,-4,7,-73,-20,-50,-21,-80,-102,2,-103,-66,-67,-8,-41,-119,-26,29,-208,3,-108,-34,-228,114,-196,-84,-28,1,-109,-92,77,-169,-27,48,-12,-79,3,-100,-44,-53,13,-103,-90,-14,-91,-23,-64,-21,-116}};
+
+struct Elevation
+{
+ /**
+ * An array of |count| impulse responses of 256 samples for the left ear.
+ * The impulse responses in each elevation are at equally spaced azimuths
+ * for a full 360 degree revolution, ordered clockwise from in front the
+ * listener.
+ */
+ const int16_t (*azimuths)[256];
+ int count;
+};
+
+/**
+ * irc_composite_c_r0195 is an array with each element containing data for one
+ * elevation.
+ */
+const Elevation irc_composite_c_r0195[] =
+ {{irc_composite_c_r0195_p315, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p315)},
+ {irc_composite_c_r0195_p330, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p330)},
+ {irc_composite_c_r0195_p345, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p345)},
+ {irc_composite_c_r0195_p000, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p000)},
+ {irc_composite_c_r0195_p015, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p015)},
+ {irc_composite_c_r0195_p030, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p030)},
+ {irc_composite_c_r0195_p045, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p045)},
+ {irc_composite_c_r0195_p060, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p060)},
+ {irc_composite_c_r0195_p075, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p075)},
+ {irc_composite_c_r0195_p090, MOZ_ARRAY_LENGTH(irc_composite_c_r0195_p090)}};
+
+const int irc_composite_c_r0195_first_elevation = -45; /* degrees */
+const int irc_composite_c_r0195_elevation_interval = 15; /* degrees */
+const int irc_composite_c_r0195_sample_rate = 44100; /* Hz */
diff --git a/dom/media/webaudio/blink/PeriodicWave.cpp b/dom/media/webaudio/blink/PeriodicWave.cpp
new file mode 100644
index 000000000..3f949207a
--- /dev/null
+++ b/dom/media/webaudio/blink/PeriodicWave.cpp
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "PeriodicWave.h"
+#include <algorithm>
+#include <cmath>
+#include <limits>
+#include "mozilla/FFTBlock.h"
+
+const unsigned MinPeriodicWaveSize = 4096; // This must be a power of two.
+const unsigned MaxPeriodicWaveSize = 8192; // This must be a power of two.
+const float CentsPerRange = 1200 / 3; // 1/3 Octave.
+
+using namespace mozilla;
+using mozilla::dom::OscillatorType;
+
+namespace WebCore {
+
+already_AddRefed<PeriodicWave>
+PeriodicWave::create(float sampleRate,
+ const float* real,
+ const float* imag,
+ size_t numberOfComponents,
+ bool disableNormalization)
+{
+ bool isGood = real && imag && numberOfComponents > 0;
+ MOZ_ASSERT(isGood);
+ if (isGood) {
+ RefPtr<PeriodicWave> periodicWave =
+ new PeriodicWave(sampleRate, numberOfComponents,
+ disableNormalization);
+
+ // Limit the number of components used to those for frequencies below the
+ // Nyquist of the fixed length inverse FFT.
+ size_t halfSize = periodicWave->m_periodicWaveSize / 2;
+ numberOfComponents = std::min(numberOfComponents, halfSize);
+ periodicWave->m_numberOfComponents = numberOfComponents;
+ periodicWave->m_realComponents = new AudioFloatArray(numberOfComponents);
+ periodicWave->m_imagComponents = new AudioFloatArray(numberOfComponents);
+ memcpy(periodicWave->m_realComponents->Elements(), real,
+ numberOfComponents * sizeof(float));
+ memcpy(periodicWave->m_imagComponents->Elements(), imag,
+ numberOfComponents * sizeof(float));
+
+ return periodicWave.forget();
+ }
+ return nullptr;
+}
+
+already_AddRefed<PeriodicWave>
+PeriodicWave::createSine(float sampleRate)
+{
+ RefPtr<PeriodicWave> periodicWave =
+ new PeriodicWave(sampleRate, MinPeriodicWaveSize, false);
+ periodicWave->generateBasicWaveform(OscillatorType::Sine);
+ return periodicWave.forget();
+}
+
+already_AddRefed<PeriodicWave>
+PeriodicWave::createSquare(float sampleRate)
+{
+ RefPtr<PeriodicWave> periodicWave =
+ new PeriodicWave(sampleRate, MinPeriodicWaveSize, false);
+ periodicWave->generateBasicWaveform(OscillatorType::Square);
+ return periodicWave.forget();
+}
+
+already_AddRefed<PeriodicWave>
+PeriodicWave::createSawtooth(float sampleRate)
+{
+ RefPtr<PeriodicWave> periodicWave =
+ new PeriodicWave(sampleRate, MinPeriodicWaveSize, false);
+ periodicWave->generateBasicWaveform(OscillatorType::Sawtooth);
+ return periodicWave.forget();
+}
+
+already_AddRefed<PeriodicWave>
+PeriodicWave::createTriangle(float sampleRate)
+{
+ RefPtr<PeriodicWave> periodicWave =
+ new PeriodicWave(sampleRate, MinPeriodicWaveSize, false);
+ periodicWave->generateBasicWaveform(OscillatorType::Triangle);
+ return periodicWave.forget();
+}
+
+PeriodicWave::PeriodicWave(float sampleRate, size_t numberOfComponents, bool disableNormalization)
+ : m_sampleRate(sampleRate)
+ , m_centsPerRange(CentsPerRange)
+ , m_maxPartialsInBandLimitedTable(0)
+ , m_normalizationScale(1.0f)
+ , m_disableNormalization(disableNormalization)
+{
+ float nyquist = 0.5 * m_sampleRate;
+
+ if (numberOfComponents <= MinPeriodicWaveSize) {
+ m_periodicWaveSize = MinPeriodicWaveSize;
+ } else {
+ unsigned npow2 = powf(2.0f, floorf(logf(numberOfComponents - 1.0)/logf(2.0f) + 1.0f));
+ m_periodicWaveSize = std::min(MaxPeriodicWaveSize, npow2);
+ }
+
+ m_numberOfRanges = (unsigned)(3.0f*logf(m_periodicWaveSize)/logf(2.0f));
+ m_bandLimitedTables.SetLength(m_numberOfRanges);
+ m_lowestFundamentalFrequency = nyquist / maxNumberOfPartials();
+ m_rateScale = m_periodicWaveSize / m_sampleRate;
+}
+
+size_t PeriodicWave::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+
+ amount += m_bandLimitedTables.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_bandLimitedTables.Length(); i++) {
+ if (m_bandLimitedTables[i]) {
+ amount += m_bandLimitedTables[i]->ShallowSizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ return amount;
+}
+
+void PeriodicWave::waveDataForFundamentalFrequency(float fundamentalFrequency, float* &lowerWaveData, float* &higherWaveData, float& tableInterpolationFactor)
+{
+
+ // Negative frequencies are allowed, in which case we alias
+ // to the positive frequency.
+ fundamentalFrequency = fabsf(fundamentalFrequency);
+
+ // We only need to rebuild to the tables if the new fundamental
+ // frequency is low enough to allow for more partials below the
+ // Nyquist frequency.
+ unsigned numberOfPartials = numberOfPartialsForRange(0);
+ float nyquist = 0.5 * m_sampleRate;
+ if (fundamentalFrequency != 0.0) {
+ numberOfPartials = std::min(numberOfPartials, (unsigned)(nyquist / fundamentalFrequency));
+ }
+ if (numberOfPartials > m_maxPartialsInBandLimitedTable) {
+ for (unsigned rangeIndex = 0; rangeIndex < m_numberOfRanges; ++rangeIndex) {
+ m_bandLimitedTables[rangeIndex] = 0;
+ }
+
+ // We need to create the first table to determine the normalization
+ // constant.
+ createBandLimitedTables(fundamentalFrequency, 0);
+ m_maxPartialsInBandLimitedTable = numberOfPartials;
+ }
+
+ // Calculate the pitch range.
+ float ratio = fundamentalFrequency > 0 ? fundamentalFrequency / m_lowestFundamentalFrequency : 0.5;
+ float centsAboveLowestFrequency = logf(ratio)/logf(2.0f) * 1200;
+
+ // Add one to round-up to the next range just in time to truncate
+ // partials before aliasing occurs.
+ float pitchRange = 1 + centsAboveLowestFrequency / m_centsPerRange;
+
+ pitchRange = std::max(pitchRange, 0.0f);
+ pitchRange = std::min(pitchRange, static_cast<float>(m_numberOfRanges - 1));
+
+ // The words "lower" and "higher" refer to the table data having
+ // the lower and higher numbers of partials. It's a little confusing
+ // since the range index gets larger the more partials we cull out.
+ // So the lower table data will have a larger range index.
+ unsigned rangeIndex1 = static_cast<unsigned>(pitchRange);
+ unsigned rangeIndex2 = rangeIndex1 < m_numberOfRanges - 1 ? rangeIndex1 + 1 : rangeIndex1;
+
+ if (!m_bandLimitedTables[rangeIndex1].get())
+ createBandLimitedTables(fundamentalFrequency, rangeIndex1);
+
+ if (!m_bandLimitedTables[rangeIndex2].get())
+ createBandLimitedTables(fundamentalFrequency, rangeIndex2);
+
+ lowerWaveData = m_bandLimitedTables[rangeIndex2]->Elements();
+ higherWaveData = m_bandLimitedTables[rangeIndex1]->Elements();
+
+ // Ranges from 0 -> 1 to interpolate between lower -> higher.
+ tableInterpolationFactor = rangeIndex2 - pitchRange;
+}
+
+unsigned PeriodicWave::maxNumberOfPartials() const
+{
+ return m_periodicWaveSize / 2;
+}
+
+unsigned PeriodicWave::numberOfPartialsForRange(unsigned rangeIndex) const
+{
+ // Number of cents below nyquist where we cull partials.
+ float centsToCull = rangeIndex * m_centsPerRange;
+
+ // A value from 0 -> 1 representing what fraction of the partials to keep.
+ float cullingScale = pow(2, -centsToCull / 1200);
+
+ // The very top range will have all the partials culled.
+ unsigned numberOfPartials = cullingScale * maxNumberOfPartials();
+
+ return numberOfPartials;
+}
+
+// Convert into time-domain wave buffers.
+// One table is created for each range for non-aliasing playback
+// at different playback rates. Thus, higher ranges have more
+// high-frequency partials culled out.
+void PeriodicWave::createBandLimitedTables(float fundamentalFrequency,
+ unsigned rangeIndex)
+{
+ unsigned fftSize = m_periodicWaveSize;
+ unsigned i;
+
+ const float *realData = m_realComponents->Elements();
+ const float *imagData = m_imagComponents->Elements();
+
+ // This FFTBlock is used to cull partials (represented by frequency bins).
+ FFTBlock frame(fftSize);
+
+ // Find the starting bin where we should start culling the aliasing
+ // partials for this pitch range. We need to clear out the highest
+ // frequencies to band-limit the waveform.
+ unsigned numberOfPartials = numberOfPartialsForRange(rangeIndex);
+ // Also limit to the number of components that are provided.
+ numberOfPartials = std::min(numberOfPartials, m_numberOfComponents - 1);
+
+ // Limit number of partials to those below Nyquist frequency
+ float nyquist = 0.5 * m_sampleRate;
+ if (fundamentalFrequency != 0.0) {
+ numberOfPartials = std::min(numberOfPartials,
+ (unsigned)(nyquist / fundamentalFrequency));
+ }
+
+ // Copy from loaded frequency data and generate complex conjugate
+ // because of the way the inverse FFT is defined.
+ // The coefficients of higher partials remain zero, as initialized in
+ // the FFTBlock constructor.
+ for (i = 0; i < numberOfPartials + 1; ++i) {
+ frame.RealData(i) = realData[i];
+ frame.ImagData(i) = -imagData[i];
+ }
+
+ // Clear any DC-offset.
+ frame.RealData(0) = 0;
+ // Clear value which has no effect.
+ frame.ImagData(0) = 0;
+
+ // Create the band-limited table.
+ AlignedAudioFloatArray* table = new AlignedAudioFloatArray(m_periodicWaveSize);
+ m_bandLimitedTables[rangeIndex] = table;
+
+ // Apply an inverse FFT to generate the time-domain table data.
+ float* data = m_bandLimitedTables[rangeIndex]->Elements();
+ frame.GetInverseWithoutScaling(data);
+
+ // For the first range (which has the highest power), calculate
+ // its peak value then compute normalization scale.
+ if (!m_disableNormalization && !rangeIndex) {
+ float maxValue;
+ maxValue = AudioBufferPeakValue(data, m_periodicWaveSize);
+
+ if (maxValue)
+ m_normalizationScale = 1.0f / maxValue;
+ }
+
+ // Apply normalization scale.
+ if (!m_disableNormalization) {
+ AudioBufferInPlaceScale(data, m_normalizationScale, m_periodicWaveSize);
+ }
+}
+
+void PeriodicWave::generateBasicWaveform(OscillatorType shape)
+{
+ const float piFloat = float(M_PI);
+ unsigned fftSize = periodicWaveSize();
+ unsigned halfSize = fftSize / 2;
+
+ m_numberOfComponents = halfSize;
+ m_realComponents = new AudioFloatArray(halfSize);
+ m_imagComponents = new AudioFloatArray(halfSize);
+ float* realP = m_realComponents->Elements();
+ float* imagP = m_imagComponents->Elements();
+
+ // Clear DC and imag value which is ignored.
+ realP[0] = 0;
+ imagP[0] = 0;
+
+ for (unsigned n = 1; n < halfSize; ++n) {
+ float omega = 2 * piFloat * n;
+ float invOmega = 1 / omega;
+
+ // Fourier coefficients according to standard definition.
+ float a; // Coefficient for cos().
+ float b; // Coefficient for sin().
+
+ // Calculate Fourier coefficients depending on the shape.
+ // Note that the overall scaling (magnitude) of the waveforms
+ // is normalized in createBandLimitedTables().
+ switch (shape) {
+ case OscillatorType::Sine:
+ // Standard sine wave function.
+ a = 0;
+ b = (n == 1) ? 1 : 0;
+ break;
+ case OscillatorType::Square:
+ // Square-shaped waveform with the first half its maximum value
+ // and the second half its minimum value.
+ a = 0;
+ b = invOmega * ((n & 1) ? 2 : 0);
+ break;
+ case OscillatorType::Sawtooth:
+ // Sawtooth-shaped waveform with the first half ramping from
+ // zero to maximum and the second half from minimum to zero.
+ a = 0;
+ b = -invOmega * cos(0.5 * omega);
+ break;
+ case OscillatorType::Triangle:
+ // Triangle-shaped waveform going from its maximum value to
+ // its minimum value then back to the maximum value.
+ a = 0;
+ if (n & 1) {
+ b = 2 * (2 / (n * piFloat) * 2 / (n * piFloat)) * ((((n - 1) >> 1) & 1) ? -1 : 1);
+ } else {
+ b = 0;
+ }
+ break;
+ default:
+ NS_NOTREACHED("invalid oscillator type");
+ a = 0;
+ b = 0;
+ break;
+ }
+
+ realP[n] = a;
+ imagP[n] = b;
+ }
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/PeriodicWave.h b/dom/media/webaudio/blink/PeriodicWave.h
new file mode 100644
index 000000000..47381d450
--- /dev/null
+++ b/dom/media/webaudio/blink/PeriodicWave.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PeriodicWave_h
+#define PeriodicWave_h
+
+#include "mozilla/dom/OscillatorNodeBinding.h"
+#include <nsAutoPtr.h>
+#include <nsTArray.h>
+#include "AlignedTArray.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+typedef AlignedTArray<float> AlignedAudioFloatArray;
+typedef nsTArray<float> AudioFloatArray;
+
+class PeriodicWave {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebCore::PeriodicWave);
+
+ static already_AddRefed<PeriodicWave> createSine(float sampleRate);
+ static already_AddRefed<PeriodicWave> createSquare(float sampleRate);
+ static already_AddRefed<PeriodicWave> createSawtooth(float sampleRate);
+ static already_AddRefed<PeriodicWave> createTriangle(float sampleRate);
+
+ // Creates an arbitrary periodic wave given the frequency components
+ // (Fourier coefficients).
+ static already_AddRefed<PeriodicWave> create(float sampleRate,
+ const float* real,
+ const float* imag,
+ size_t numberOfComponents,
+ bool disableNormalization);
+
+ // Returns pointers to the lower and higher wave data for the pitch range
+ // containing the given fundamental frequency. These two tables are in
+ // adjacent "pitch" ranges where the higher table will have the maximum
+ // number of partials which won't alias when played back at this
+ // fundamental frequency. The lower wave is the next range containing fewer
+ // partials than the higher wave. Interpolation between these two tables
+ // can be made according to tableInterpolationFactor. Where values
+ // from 0 -> 1 interpolate between lower -> higher.
+ void waveDataForFundamentalFrequency(float, float* &lowerWaveData, float* &higherWaveData, float& tableInterpolationFactor);
+
+ // Returns the scalar multiplier to the oscillator frequency to calculate
+ // wave buffer phase increment.
+ float rateScale() const { return m_rateScale; }
+
+ unsigned periodicWaveSize() const { return m_periodicWaveSize; }
+ float sampleRate() const { return m_sampleRate; }
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ explicit PeriodicWave(float sampleRate, size_t numberOfComponents, bool disableNormalization);
+ ~PeriodicWave() {}
+
+ void generateBasicWaveform(mozilla::dom::OscillatorType);
+
+ float m_sampleRate;
+ unsigned m_periodicWaveSize;
+ unsigned m_numberOfRanges;
+ float m_centsPerRange;
+ unsigned m_numberOfComponents;
+ nsAutoPtr<AudioFloatArray> m_realComponents;
+ nsAutoPtr<AudioFloatArray> m_imagComponents;
+
+ // The lowest frequency (in Hertz) where playback will include all of the
+ // partials. Playing back lower than this frequency will gradually lose
+ // more high-frequency information.
+ // This frequency is quite low (~10Hz @ // 44.1KHz)
+ float m_lowestFundamentalFrequency;
+
+ float m_rateScale;
+
+ unsigned numberOfRanges() const { return m_numberOfRanges; }
+
+ // Maximum possible number of partials (before culling).
+ unsigned maxNumberOfPartials() const;
+
+ unsigned numberOfPartialsForRange(unsigned rangeIndex) const;
+
+ // Creates table for specified index based on fundamental frequency.
+ void createBandLimitedTables(float fundamentalFrequency, unsigned rangeIndex);
+ unsigned m_maxPartialsInBandLimitedTable;
+ float m_normalizationScale;
+ bool m_disableNormalization;
+ nsTArray<nsAutoPtr<AlignedAudioFloatArray> > m_bandLimitedTables;
+};
+
+} // namespace WebCore
+
+#endif // PeriodicWave_h
diff --git a/dom/media/webaudio/blink/README b/dom/media/webaudio/blink/README
new file mode 100644
index 000000000..96d209dfc
--- /dev/null
+++ b/dom/media/webaudio/blink/README
@@ -0,0 +1,24 @@
+This directory contains the code originally borrowed from the Blink Web Audio
+implementation. We are forking the code here because in many cases the burden
+of adopting Blink specific utilities is too large compared to the prospect of
+importing upstream fixes by just copying newer versions of the code in the
+future.
+
+The process of borrowing code from Blink is as follows:
+
+* Try to borrow utility classes only, and avoid borrowing code which depends
+ too much on the Blink specific utilities.
+* First, import the pristine files from the Blink repository before adding
+ them to the build system, noting the SVN revision of Blink from which the
+ original files were copied in the commit message.
+* In a separate commit, add the imported source files to the build system,
+ and apply the necessary changes to make it build successfully.
+* Use the code in a separate commit.
+* Never add headers as exported headers. All headers should be included
+ using the following convention: #include "blink/Header.h".
+* Leave the imported code in the WebCore namespace, and import the needed
+ names into the Mozilla code via `using'.
+* Cherry-pick upsteam fixes manually when needed. In case you fix a problem
+ that is not Mozilla specific locally, try to upstream your changes into
+ Blink.
+* Ping ehsan for any questions.
diff --git a/dom/media/webaudio/blink/Reverb.cpp b/dom/media/webaudio/blink/Reverb.cpp
new file mode 100644
index 000000000..4fca0822b
--- /dev/null
+++ b/dom/media/webaudio/blink/Reverb.cpp
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "Reverb.h"
+#include "ReverbConvolverStage.h"
+
+#include <math.h>
+#include "ReverbConvolver.h"
+#include "mozilla/FloatingPoint.h"
+
+using namespace mozilla;
+
+namespace WebCore {
+
+// Empirical gain calibration tested across many impulse responses to ensure perceived volume is same as dry (unprocessed) signal
+const float GainCalibration = -58;
+const float GainCalibrationSampleRate = 44100;
+
+// A minimum power value to when normalizing a silent (or very quiet) impulse response
+const float MinPower = 0.000125f;
+
+static float calculateNormalizationScale(ThreadSharedFloatArrayBufferList* response, size_t aLength, float sampleRate)
+{
+ // Normalize by RMS power
+ size_t numberOfChannels = response->GetChannels();
+
+ float power = 0;
+
+ for (size_t i = 0; i < numberOfChannels; ++i) {
+ float channelPower = AudioBufferSumOfSquares(static_cast<const float*>(response->GetData(i)), aLength);
+ power += channelPower;
+ }
+
+ power = sqrt(power / (numberOfChannels * aLength));
+
+ // Protect against accidental overload
+ if (!IsFinite(power) || IsNaN(power) || power < MinPower)
+ power = MinPower;
+
+ float scale = 1 / power;
+
+ scale *= powf(10, GainCalibration * 0.05f); // calibrate to make perceived volume same as unprocessed
+
+ // Scale depends on sample-rate.
+ if (sampleRate)
+ scale *= GainCalibrationSampleRate / sampleRate;
+
+ // True-stereo compensation
+ if (response->GetChannels() == 4)
+ scale *= 0.5f;
+
+ return scale;
+}
+
+Reverb::Reverb(ThreadSharedFloatArrayBufferList* impulseResponse, size_t impulseResponseBufferLength, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads, bool normalize, float sampleRate)
+{
+ float scale = 1;
+
+ AutoTArray<const float*,4> irChannels;
+ for (size_t i = 0; i < impulseResponse->GetChannels(); ++i) {
+ irChannels.AppendElement(impulseResponse->GetData(i));
+ }
+ AutoTArray<float,1024> tempBuf;
+
+ if (normalize) {
+ scale = calculateNormalizationScale(impulseResponse, impulseResponseBufferLength, sampleRate);
+
+ if (scale) {
+ tempBuf.SetLength(irChannels.Length()*impulseResponseBufferLength);
+ for (uint32_t i = 0; i < irChannels.Length(); ++i) {
+ float* buf = &tempBuf[i*impulseResponseBufferLength];
+ AudioBufferCopyWithScale(irChannels[i], scale, buf,
+ impulseResponseBufferLength);
+ irChannels[i] = buf;
+ }
+ }
+ }
+
+ initialize(irChannels, impulseResponseBufferLength,
+ maxFFTSize, numberOfChannels, useBackgroundThreads);
+}
+
+size_t Reverb::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+ amount += m_convolvers.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_convolvers.Length(); i++) {
+ if (m_convolvers[i]) {
+ amount += m_convolvers[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ amount += m_tempBuffer.SizeOfExcludingThis(aMallocSizeOf, false);
+ return amount;
+}
+
+
+void Reverb::initialize(const nsTArray<const float*>& impulseResponseBuffer,
+ size_t impulseResponseBufferLength,
+ size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads)
+{
+ m_impulseResponseLength = impulseResponseBufferLength;
+
+ // The reverb can handle a mono impulse response and still do stereo processing
+ size_t numResponseChannels = impulseResponseBuffer.Length();
+ m_convolvers.SetCapacity(numberOfChannels);
+
+ int convolverRenderPhase = 0;
+ for (size_t i = 0; i < numResponseChannels; ++i) {
+ const float* channel = impulseResponseBuffer[i];
+ size_t length = impulseResponseBufferLength;
+
+ nsAutoPtr<ReverbConvolver> convolver(new ReverbConvolver(channel, length, maxFFTSize, convolverRenderPhase, useBackgroundThreads));
+ m_convolvers.AppendElement(convolver.forget());
+
+ convolverRenderPhase += WEBAUDIO_BLOCK_SIZE;
+ }
+
+ // For "True" stereo processing we allocate a temporary buffer to avoid repeatedly allocating it in the process() method.
+ // It can be bad to allocate memory in a real-time thread.
+ if (numResponseChannels == 4) {
+ m_tempBuffer.AllocateChannels(2);
+ WriteZeroesToAudioBlock(&m_tempBuffer, 0, WEBAUDIO_BLOCK_SIZE);
+ }
+}
+
+void Reverb::process(const AudioBlock* sourceBus, AudioBlock* destinationBus)
+{
+ // Do a fairly comprehensive sanity check.
+ // If these conditions are satisfied, all of the source and destination pointers will be valid for the various matrixing cases.
+ bool isSafeToProcess = sourceBus && destinationBus && sourceBus->ChannelCount() > 0 && destinationBus->mChannelData.Length() > 0
+ && WEBAUDIO_BLOCK_SIZE <= MaxFrameSize && WEBAUDIO_BLOCK_SIZE <= size_t(sourceBus->GetDuration()) && WEBAUDIO_BLOCK_SIZE <= size_t(destinationBus->GetDuration());
+
+ MOZ_ASSERT(isSafeToProcess);
+ if (!isSafeToProcess)
+ return;
+
+ // For now only handle mono or stereo output
+ MOZ_ASSERT(destinationBus->ChannelCount() <= 2);
+
+ float* destinationChannelL = static_cast<float*>(const_cast<void*>(destinationBus->mChannelData[0]));
+ const float* sourceBusL = static_cast<const float*>(sourceBus->mChannelData[0]);
+
+ // Handle input -> output matrixing...
+ size_t numInputChannels = sourceBus->ChannelCount();
+ size_t numOutputChannels = destinationBus->ChannelCount();
+ size_t numReverbChannels = m_convolvers.Length();
+
+ if (numInputChannels == 2 && numReverbChannels == 2 && numOutputChannels == 2) {
+ // 2 -> 2 -> 2
+ const float* sourceBusR = static_cast<const float*>(sourceBus->mChannelData[1]);
+ float* destinationChannelR = static_cast<float*>(const_cast<void*>(destinationBus->mChannelData[1]));
+ m_convolvers[0]->process(sourceBusL, destinationChannelL);
+ m_convolvers[1]->process(sourceBusR, destinationChannelR);
+ } else if (numInputChannels == 1 && numOutputChannels == 2 && numReverbChannels == 2) {
+ // 1 -> 2 -> 2
+ for (int i = 0; i < 2; ++i) {
+ float* destinationChannel = static_cast<float*>(const_cast<void*>(destinationBus->mChannelData[i]));
+ m_convolvers[i]->process(sourceBusL, destinationChannel);
+ }
+ } else if (numInputChannels == 1 && numReverbChannels == 1 && numOutputChannels == 2) {
+ // 1 -> 1 -> 2
+ m_convolvers[0]->process(sourceBusL, destinationChannelL);
+
+ // simply copy L -> R
+ float* destinationChannelR = static_cast<float*>(const_cast<void*>(destinationBus->mChannelData[1]));
+ bool isCopySafe = destinationChannelL && destinationChannelR && size_t(destinationBus->GetDuration()) >= WEBAUDIO_BLOCK_SIZE;
+ MOZ_ASSERT(isCopySafe);
+ if (!isCopySafe)
+ return;
+ PodCopy(destinationChannelR, destinationChannelL, WEBAUDIO_BLOCK_SIZE);
+ } else if (numInputChannels == 1 && numReverbChannels == 1 && numOutputChannels == 1) {
+ // 1 -> 1 -> 1
+ m_convolvers[0]->process(sourceBusL, destinationChannelL);
+ } else if (numInputChannels == 2 && numReverbChannels == 4 && numOutputChannels == 2) {
+ // 2 -> 4 -> 2 ("True" stereo)
+ const float* sourceBusR = static_cast<const float*>(sourceBus->mChannelData[1]);
+ float* destinationChannelR = static_cast<float*>(const_cast<void*>(destinationBus->mChannelData[1]));
+
+ float* tempChannelL = static_cast<float*>(const_cast<void*>(m_tempBuffer.mChannelData[0]));
+ float* tempChannelR = static_cast<float*>(const_cast<void*>(m_tempBuffer.mChannelData[1]));
+
+ // Process left virtual source
+ m_convolvers[0]->process(sourceBusL, destinationChannelL);
+ m_convolvers[1]->process(sourceBusL, destinationChannelR);
+
+ // Process right virtual source
+ m_convolvers[2]->process(sourceBusR, tempChannelL);
+ m_convolvers[3]->process(sourceBusR, tempChannelR);
+
+ AudioBufferAddWithScale(tempChannelL, 1.0f, destinationChannelL, sourceBus->GetDuration());
+ AudioBufferAddWithScale(tempChannelR, 1.0f, destinationChannelR, sourceBus->GetDuration());
+ } else if (numInputChannels == 1 && numReverbChannels == 4 && numOutputChannels == 2) {
+ // 1 -> 4 -> 2 (Processing mono with "True" stereo impulse response)
+ // This is an inefficient use of a four-channel impulse response, but we should handle the case.
+ float* destinationChannelR = static_cast<float*>(const_cast<void*>(destinationBus->mChannelData[1]));
+
+ float* tempChannelL = static_cast<float*>(const_cast<void*>(m_tempBuffer.mChannelData[0]));
+ float* tempChannelR = static_cast<float*>(const_cast<void*>(m_tempBuffer.mChannelData[1]));
+
+ // Process left virtual source
+ m_convolvers[0]->process(sourceBusL, destinationChannelL);
+ m_convolvers[1]->process(sourceBusL, destinationChannelR);
+
+ // Process right virtual source
+ m_convolvers[2]->process(sourceBusL, tempChannelL);
+ m_convolvers[3]->process(sourceBusL, tempChannelR);
+
+ AudioBufferAddWithScale(tempChannelL, 1.0f, destinationChannelL, sourceBus->GetDuration());
+ AudioBufferAddWithScale(tempChannelR, 1.0f, destinationChannelR, sourceBus->GetDuration());
+ } else {
+ // Handle gracefully any unexpected / unsupported matrixing
+ // FIXME: add code for 5.1 support...
+ destinationBus->SetNull(destinationBus->GetDuration());
+ }
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/Reverb.h b/dom/media/webaudio/blink/Reverb.h
new file mode 100644
index 000000000..35e72283d
--- /dev/null
+++ b/dom/media/webaudio/blink/Reverb.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef Reverb_h
+#define Reverb_h
+
+#include "ReverbConvolver.h"
+#include "nsAutoPtr.h"
+#include "nsTArray.h"
+#include "AudioBlock.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace mozilla {
+class ThreadSharedFloatArrayBufferList;
+} // namespace mozilla
+
+namespace WebCore {
+
+// Multi-channel convolution reverb with channel matrixing - one or more ReverbConvolver objects are used internally.
+
+class Reverb {
+public:
+ enum { MaxFrameSize = 256 };
+
+ // renderSliceSize is a rendering hint, so the FFTs can be optimized to not all occur at the same time (very bad when rendering on a real-time thread).
+ Reverb(mozilla::ThreadSharedFloatArrayBufferList* impulseResponseBuffer,
+ size_t impulseResponseBufferLength, size_t maxFFTSize,
+ size_t numberOfChannels, bool useBackgroundThreads, bool normalize,
+ float sampleRate);
+
+ void process(const mozilla::AudioBlock* sourceBus,
+ mozilla::AudioBlock* destinationBus);
+
+ size_t impulseResponseLength() const { return m_impulseResponseLength; }
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ void initialize(const nsTArray<const float*>& impulseResponseBuffer,
+ size_t impulseResponseBufferLength, size_t maxFFTSize,
+ size_t numberOfChannels, bool useBackgroundThreads);
+
+ size_t m_impulseResponseLength;
+
+ nsTArray<nsAutoPtr<ReverbConvolver> > m_convolvers;
+
+ // For "True" stereo processing
+ mozilla::AudioBlock m_tempBuffer;
+};
+
+} // namespace WebCore
+
+#endif // Reverb_h
diff --git a/dom/media/webaudio/blink/ReverbAccumulationBuffer.cpp b/dom/media/webaudio/blink/ReverbAccumulationBuffer.cpp
new file mode 100644
index 000000000..4405164b2
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbAccumulationBuffer.cpp
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ReverbAccumulationBuffer.h"
+#include "AudioNodeEngine.h"
+#include "mozilla/PodOperations.h"
+#include <algorithm>
+
+using namespace mozilla;
+
+namespace WebCore {
+
+ReverbAccumulationBuffer::ReverbAccumulationBuffer(size_t length)
+ : m_readIndex(0)
+ , m_readTimeFrame(0)
+{
+ m_buffer.SetLength(length);
+ PodZero(m_buffer.Elements(), length);
+}
+
+void ReverbAccumulationBuffer::readAndClear(float* destination, size_t numberOfFrames)
+{
+ size_t bufferLength = m_buffer.Length();
+ bool isCopySafe = m_readIndex <= bufferLength && numberOfFrames <= bufferLength;
+
+ MOZ_ASSERT(isCopySafe);
+ if (!isCopySafe)
+ return;
+
+ size_t framesAvailable = bufferLength - m_readIndex;
+ size_t numberOfFrames1 = std::min(numberOfFrames, framesAvailable);
+ size_t numberOfFrames2 = numberOfFrames - numberOfFrames1;
+
+ float* source = m_buffer.Elements();
+ memcpy(destination, source + m_readIndex, sizeof(float) * numberOfFrames1);
+ memset(source + m_readIndex, 0, sizeof(float) * numberOfFrames1);
+
+ // Handle wrap-around if necessary
+ if (numberOfFrames2 > 0) {
+ memcpy(destination + numberOfFrames1, source, sizeof(float) * numberOfFrames2);
+ memset(source, 0, sizeof(float) * numberOfFrames2);
+ }
+
+ m_readIndex = (m_readIndex + numberOfFrames) % bufferLength;
+ m_readTimeFrame += numberOfFrames;
+}
+
+void ReverbAccumulationBuffer::updateReadIndex(int* readIndex, size_t numberOfFrames) const
+{
+ // Update caller's readIndex
+ *readIndex = (*readIndex + numberOfFrames) % m_buffer.Length();
+}
+
+int ReverbAccumulationBuffer::accumulate(const float* source, size_t numberOfFrames, int* readIndex, size_t delayFrames)
+{
+ size_t bufferLength = m_buffer.Length();
+
+ size_t writeIndex = (*readIndex + delayFrames) % bufferLength;
+
+ // Update caller's readIndex
+ *readIndex = (*readIndex + numberOfFrames) % bufferLength;
+
+ size_t framesAvailable = bufferLength - writeIndex;
+ size_t numberOfFrames1 = std::min(numberOfFrames, framesAvailable);
+ size_t numberOfFrames2 = numberOfFrames - numberOfFrames1;
+
+ float* destination = m_buffer.Elements();
+
+ bool isSafe = writeIndex <= bufferLength && numberOfFrames1 + writeIndex <= bufferLength && numberOfFrames2 <= bufferLength;
+ MOZ_ASSERT(isSafe);
+ if (!isSafe)
+ return 0;
+
+ AudioBufferAddWithScale(source, 1.0f, destination + writeIndex, numberOfFrames1);
+ if (numberOfFrames2 > 0) {
+ AudioBufferAddWithScale(source + numberOfFrames1, 1.0f, destination, numberOfFrames2);
+ }
+
+ return writeIndex;
+}
+
+void ReverbAccumulationBuffer::reset()
+{
+ PodZero(m_buffer.Elements(), m_buffer.Length());
+ m_readIndex = 0;
+ m_readTimeFrame = 0;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/ReverbAccumulationBuffer.h b/dom/media/webaudio/blink/ReverbAccumulationBuffer.h
new file mode 100644
index 000000000..a37741a2e
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbAccumulationBuffer.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ReverbAccumulationBuffer_h
+#define ReverbAccumulationBuffer_h
+
+#include "AlignedTArray.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+// ReverbAccumulationBuffer is a circular delay buffer with one client reading from it and multiple clients
+// writing/accumulating to it at different delay offsets from the read position. The read operation will zero the memory
+// just read from the buffer, so it will be ready for accumulation the next time around.
+class ReverbAccumulationBuffer {
+public:
+ explicit ReverbAccumulationBuffer(size_t length);
+
+ // This will read from, then clear-out numberOfFrames
+ void readAndClear(float* destination, size_t numberOfFrames);
+
+ // Each ReverbConvolverStage will accumulate its output at the appropriate delay from the read position.
+ // We need to pass in and update readIndex here, since each ReverbConvolverStage may be running in
+ // a different thread than the realtime thread calling ReadAndClear() and maintaining m_readIndex
+ // Returns the writeIndex where the accumulation took place
+ int accumulate(const float* source, size_t numberOfFrames, int* readIndex, size_t delayFrames);
+
+ size_t readIndex() const { return m_readIndex; }
+ void updateReadIndex(int* readIndex, size_t numberOfFrames) const;
+
+ size_t readTimeFrame() const { return m_readTimeFrame; }
+
+ void reset();
+
+ size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+ {
+ return m_buffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ }
+
+private:
+ AlignedTArray<float, 16> m_buffer;
+ size_t m_readIndex;
+ size_t m_readTimeFrame; // for debugging (frame on continuous timeline)
+};
+
+} // namespace WebCore
+
+#endif // ReverbAccumulationBuffer_h
diff --git a/dom/media/webaudio/blink/ReverbConvolver.cpp b/dom/media/webaudio/blink/ReverbConvolver.cpp
new file mode 100644
index 000000000..e739400ae
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbConvolver.cpp
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ReverbConvolver.h"
+#include "ReverbConvolverStage.h"
+
+using namespace mozilla;
+
+namespace WebCore {
+
+const int InputBufferSize = 8 * 16384;
+
+// We only process the leading portion of the impulse response in the real-time thread. We don't exceed this length.
+// It turns out then, that the background thread has about 278msec of scheduling slop.
+// Empirically, this has been found to be a good compromise between giving enough time for scheduling slop,
+// while still minimizing the amount of processing done in the primary (high-priority) thread.
+// This was found to be a good value on Mac OS X, and may work well on other platforms as well, assuming
+// the very rough scheduling latencies are similar on these time-scales. Of course, this code may need to be
+// tuned for individual platforms if this assumption is found to be incorrect.
+const size_t RealtimeFrameLimit = 8192 + 4096 // ~278msec @ 44.1KHz
+ - WEBAUDIO_BLOCK_SIZE;
+// First stage will have size MinFFTSize - successive stages will double in
+// size each time until we hit the maximum size.
+const size_t MinFFTSize = 256;
+// If we are using background threads then don't exceed this FFT size for the
+// stages which run in the real-time thread. This avoids having only one or
+// two large stages (size 16384 or so) at the end which take a lot of time
+// every several processing slices. This way we amortize the cost over more
+// processing slices.
+const size_t MaxRealtimeFFTSize = 4096;
+
+ReverbConvolver::ReverbConvolver(const float* impulseResponseData,
+ size_t impulseResponseLength,
+ size_t maxFFTSize,
+ size_t convolverRenderPhase,
+ bool useBackgroundThreads)
+ : m_impulseResponseLength(impulseResponseLength)
+ , m_accumulationBuffer(impulseResponseLength + WEBAUDIO_BLOCK_SIZE)
+ , m_inputBuffer(InputBufferSize)
+ , m_backgroundThread("ConvolverWorker")
+ , m_backgroundThreadCondition(&m_backgroundThreadLock)
+ , m_useBackgroundThreads(useBackgroundThreads)
+ , m_wantsToExit(false)
+ , m_moreInputBuffered(false)
+{
+ // For the moment, a good way to know if we have real-time constraint is to check if we're using background threads.
+ // Otherwise, assume we're being run from a command-line tool.
+ bool hasRealtimeConstraint = useBackgroundThreads;
+
+ const float* response = impulseResponseData;
+ size_t totalResponseLength = impulseResponseLength;
+
+ // The total latency is zero because the first FFT stage is small enough
+ // to return output in the first block.
+ size_t reverbTotalLatency = 0;
+
+ size_t stageOffset = 0;
+ size_t stagePhase = 0;
+ size_t fftSize = MinFFTSize;
+ while (stageOffset < totalResponseLength) {
+ size_t stageSize = fftSize / 2;
+
+ // For the last stage, it's possible that stageOffset is such that we're straddling the end
+ // of the impulse response buffer (if we use stageSize), so reduce the last stage's length...
+ if (stageSize + stageOffset > totalResponseLength) {
+ stageSize = totalResponseLength - stageOffset;
+ // Use smallest FFT that is large enough to cover the last stage.
+ fftSize = MinFFTSize;
+ while (stageSize * 2 > fftSize) {
+ fftSize *= 2;
+ }
+ }
+
+ // This "staggers" the time when each FFT happens so they don't all happen at the same time
+ int renderPhase = convolverRenderPhase + stagePhase;
+
+ nsAutoPtr<ReverbConvolverStage> stage
+ (new ReverbConvolverStage(response, totalResponseLength,
+ reverbTotalLatency, stageOffset, stageSize,
+ fftSize, renderPhase,
+ &m_accumulationBuffer));
+
+ bool isBackgroundStage = false;
+
+ if (this->useBackgroundThreads() && stageOffset > RealtimeFrameLimit) {
+ m_backgroundStages.AppendElement(stage.forget());
+ isBackgroundStage = true;
+ } else
+ m_stages.AppendElement(stage.forget());
+
+ // Figure out next FFT size
+ fftSize *= 2;
+
+ stageOffset += stageSize;
+
+ if (hasRealtimeConstraint && !isBackgroundStage
+ && fftSize > MaxRealtimeFFTSize) {
+ fftSize = MaxRealtimeFFTSize;
+ // Custom phase positions for all but the first of the realtime
+ // stages of largest size. These spread out the work of the
+ // larger realtime stages. None of the FFTs of size 1024, 2048 or
+ // 4096 are performed when processing the same block. The first
+ // MaxRealtimeFFTSize = 4096 stage, at the end of the doubling,
+ // performs its FFT at block 7. The FFTs of size 2048 are
+ // performed in blocks 3 + 8 * n and size 1024 at 1 + 4 * n.
+ const uint32_t phaseLookup[] = { 14, 0, 10, 4 };
+ stagePhase = WEBAUDIO_BLOCK_SIZE *
+ phaseLookup[m_stages.Length() % ArrayLength(phaseLookup)];
+ } else if (fftSize > maxFFTSize) {
+ fftSize = maxFFTSize;
+ // A prime offset spreads out FFTs in a way that all
+ // available phase positions will be used if there are sufficient
+ // stages.
+ stagePhase += 5 * WEBAUDIO_BLOCK_SIZE;
+ } else if (stageSize > WEBAUDIO_BLOCK_SIZE) {
+ // As the stages are doubling in size, the next FFT will occur
+ // mid-way between FFTs for this stage.
+ stagePhase = stageSize - WEBAUDIO_BLOCK_SIZE;
+ }
+ }
+
+ // Start up background thread
+ // FIXME: would be better to up the thread priority here. It doesn't need to be real-time, but higher than the default...
+ if (this->useBackgroundThreads() && m_backgroundStages.Length() > 0) {
+ if (!m_backgroundThread.Start()) {
+ NS_WARNING("Cannot start convolver thread.");
+ return;
+ }
+ m_backgroundThread.message_loop()->PostTask(NewNonOwningRunnableMethod(this,
+ &ReverbConvolver::backgroundThreadEntry));
+ }
+}
+
+ReverbConvolver::~ReverbConvolver()
+{
+ // Wait for background thread to stop
+ if (useBackgroundThreads() && m_backgroundThread.IsRunning()) {
+ m_wantsToExit = true;
+
+ // Wake up thread so it can return
+ {
+ AutoLock locker(m_backgroundThreadLock);
+ m_moreInputBuffered = true;
+ m_backgroundThreadCondition.Signal();
+ }
+
+ m_backgroundThread.Stop();
+ }
+}
+
+size_t ReverbConvolver::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+ amount += m_stages.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_stages.Length(); i++) {
+ if (m_stages[i]) {
+ amount += m_stages[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ amount += m_backgroundStages.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ for (size_t i = 0; i < m_backgroundStages.Length(); i++) {
+ if (m_backgroundStages[i]) {
+ amount += m_backgroundStages[i]->sizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ // NB: The buffer sizes are static, so even though they might be accessed
+ // in another thread it's safe to measure them.
+ amount += m_accumulationBuffer.sizeOfExcludingThis(aMallocSizeOf);
+ amount += m_inputBuffer.sizeOfExcludingThis(aMallocSizeOf);
+
+ // Possible future measurements:
+ // - m_backgroundThread
+ // - m_backgroundThreadLock
+ // - m_backgroundThreadCondition
+ return amount;
+}
+
+void ReverbConvolver::backgroundThreadEntry()
+{
+ while (!m_wantsToExit) {
+ // Wait for realtime thread to give us more input
+ m_moreInputBuffered = false;
+ {
+ AutoLock locker(m_backgroundThreadLock);
+ while (!m_moreInputBuffered && !m_wantsToExit)
+ m_backgroundThreadCondition.Wait();
+ }
+
+ // Process all of the stages until their read indices reach the input buffer's write index
+ int writeIndex = m_inputBuffer.writeIndex();
+
+ // Even though it doesn't seem like every stage needs to maintain its own version of readIndex
+ // we do this in case we want to run in more than one background thread.
+ int readIndex;
+
+ while ((readIndex = m_backgroundStages[0]->inputReadIndex()) != writeIndex) { // FIXME: do better to detect buffer overrun...
+ // Accumulate contributions from each stage
+ for (size_t i = 0; i < m_backgroundStages.Length(); ++i)
+ m_backgroundStages[i]->processInBackground(this);
+ }
+ }
+}
+
+void ReverbConvolver::process(const float* sourceChannelData,
+ float* destinationChannelData)
+{
+ const float* source = sourceChannelData;
+ float* destination = destinationChannelData;
+ bool isDataSafe = source && destination;
+ MOZ_ASSERT(isDataSafe);
+ if (!isDataSafe)
+ return;
+
+ // Feed input buffer (read by all threads)
+ m_inputBuffer.write(source, WEBAUDIO_BLOCK_SIZE);
+
+ // Accumulate contributions from each stage
+ for (size_t i = 0; i < m_stages.Length(); ++i)
+ m_stages[i]->process(source);
+
+ // Finally read from accumulation buffer
+ m_accumulationBuffer.readAndClear(destination, WEBAUDIO_BLOCK_SIZE);
+
+ // Now that we've buffered more input, wake up our background thread.
+
+ // Not using a MutexLocker looks strange, but we use a tryLock() instead because this is run on the real-time
+ // thread where it is a disaster for the lock to be contended (causes audio glitching). It's OK if we fail to
+ // signal from time to time, since we'll get to it the next time we're called. We're called repeatedly
+ // and frequently (around every 3ms). The background thread is processing well into the future and has a considerable amount of
+ // leeway here...
+ if (m_backgroundThreadLock.Try()) {
+ m_moreInputBuffered = true;
+ m_backgroundThreadCondition.Signal();
+ m_backgroundThreadLock.Release();
+ }
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/ReverbConvolver.h b/dom/media/webaudio/blink/ReverbConvolver.h
new file mode 100644
index 000000000..b7eea45b8
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbConvolver.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ReverbConvolver_h
+#define ReverbConvolver_h
+
+#include "ReverbAccumulationBuffer.h"
+#include "ReverbInputBuffer.h"
+#include "nsAutoPtr.h"
+#include "mozilla/MemoryReporting.h"
+#ifdef LOG
+#undef LOG
+#endif
+#include "base/condition_variable.h"
+#include "base/lock.h"
+#include "base/thread.h"
+
+namespace WebCore {
+
+class ReverbConvolverStage;
+
+class ReverbConvolver {
+public:
+ // maxFFTSize can be adjusted (from say 2048 to 32768) depending on how much precision is necessary.
+ // For certain tweaky de-convolving applications the phase errors add up quickly and lead to non-sensical results with
+ // larger FFT sizes and single-precision floats. In these cases 2048 is a good size.
+ // If not doing multi-threaded convolution, then should not go > 8192.
+ ReverbConvolver(const float* impulseResponseData,
+ size_t impulseResponseLength, size_t maxFFTSize,
+ size_t convolverRenderPhase, bool useBackgroundThreads);
+ ~ReverbConvolver();
+
+ void process(const float* sourceChannelData,
+ float* destinationChannelData);
+
+ size_t impulseResponseLength() const { return m_impulseResponseLength; }
+
+ ReverbInputBuffer* inputBuffer() { return &m_inputBuffer; }
+
+ bool useBackgroundThreads() const { return m_useBackgroundThreads; }
+ void backgroundThreadEntry();
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+private:
+ nsTArray<nsAutoPtr<ReverbConvolverStage> > m_stages;
+ nsTArray<nsAutoPtr<ReverbConvolverStage> > m_backgroundStages;
+ size_t m_impulseResponseLength;
+
+ ReverbAccumulationBuffer m_accumulationBuffer;
+
+ // One or more background threads read from this input buffer which is fed from the realtime thread.
+ ReverbInputBuffer m_inputBuffer;
+
+ // Background thread and synchronization
+ base::Thread m_backgroundThread;
+ Lock m_backgroundThreadLock;
+ ConditionVariable m_backgroundThreadCondition;
+ bool m_useBackgroundThreads;
+ bool m_wantsToExit;
+ bool m_moreInputBuffered;
+};
+
+} // namespace WebCore
+
+#endif // ReverbConvolver_h
diff --git a/dom/media/webaudio/blink/ReverbConvolverStage.cpp b/dom/media/webaudio/blink/ReverbConvolverStage.cpp
new file mode 100644
index 000000000..055098e88
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbConvolverStage.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ReverbConvolverStage.h"
+
+#include "ReverbAccumulationBuffer.h"
+#include "ReverbConvolver.h"
+#include "ReverbInputBuffer.h"
+#include "mozilla/PodOperations.h"
+
+using namespace mozilla;
+
+namespace WebCore {
+
+ReverbConvolverStage::ReverbConvolverStage(const float* impulseResponse, size_t,
+ size_t reverbTotalLatency,
+ size_t stageOffset,
+ size_t stageLength,
+ size_t fftSize, size_t renderPhase,
+ ReverbAccumulationBuffer* accumulationBuffer)
+ : m_accumulationBuffer(accumulationBuffer)
+ , m_accumulationReadIndex(0)
+ , m_inputReadIndex(0)
+{
+ MOZ_ASSERT(impulseResponse);
+ MOZ_ASSERT(accumulationBuffer);
+
+ m_fftKernel = new FFTBlock(fftSize);
+ m_fftKernel->PadAndMakeScaledDFT(impulseResponse + stageOffset, stageLength);
+ m_fftConvolver = new FFTConvolver(fftSize, renderPhase);
+
+ // The convolution stage at offset stageOffset needs to have a corresponding delay to cancel out the offset.
+ size_t totalDelay = stageOffset + reverbTotalLatency;
+
+ // But, the FFT convolution itself incurs latency, so subtract this out...
+ size_t fftLatency = m_fftConvolver->latencyFrames();
+ MOZ_ASSERT(totalDelay >= fftLatency);
+ totalDelay -= fftLatency;
+
+ m_postDelayLength = totalDelay;
+}
+
+size_t ReverbConvolverStage::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+{
+ size_t amount = aMallocSizeOf(this);
+
+ if (m_fftKernel) {
+ amount += m_fftKernel->SizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ if (m_fftConvolver) {
+ amount += m_fftConvolver->sizeOfIncludingThis(aMallocSizeOf);
+ }
+
+ return amount;
+}
+
+void ReverbConvolverStage::processInBackground(ReverbConvolver* convolver)
+{
+ ReverbInputBuffer* inputBuffer = convolver->inputBuffer();
+ float* source = inputBuffer->directReadFrom(&m_inputReadIndex,
+ WEBAUDIO_BLOCK_SIZE);
+ process(source);
+}
+
+void ReverbConvolverStage::process(const float* source)
+{
+ MOZ_ASSERT(source);
+ if (!source)
+ return;
+
+ // Now, run the convolution (into the delay buffer).
+ // An expensive FFT will happen every fftSize / 2 frames.
+ const float* output = m_fftConvolver->process(m_fftKernel, source);
+
+ // Now accumulate into reverb's accumulation buffer.
+ m_accumulationBuffer->accumulate(output, WEBAUDIO_BLOCK_SIZE,
+ &m_accumulationReadIndex,
+ m_postDelayLength);
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/ReverbConvolverStage.h b/dom/media/webaudio/blink/ReverbConvolverStage.h
new file mode 100644
index 000000000..0ebc33f3a
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbConvolverStage.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ReverbConvolverStage_h
+#define ReverbConvolverStage_h
+
+#include "FFTConvolver.h"
+
+#include "nsAutoPtr.h"
+#include "nsTArray.h"
+#include "mozilla/FFTBlock.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+using mozilla::FFTBlock;
+
+class ReverbAccumulationBuffer;
+class ReverbConvolver;
+
+// A ReverbConvolverStage represents the convolution associated with a sub-section of a large impulse response.
+// It incorporates a delay line to account for the offset of the sub-section within the larger impulse response.
+class ReverbConvolverStage {
+public:
+ // renderPhase is useful to know so that we can manipulate the pre versus post delay so that stages will perform
+ // their heavy work (FFT processing) on different slices to balance the load in a real-time thread.
+ ReverbConvolverStage(const float* impulseResponse, size_t responseLength, size_t reverbTotalLatency, size_t stageOffset, size_t stageLength, size_t fftSize, size_t renderPhase, ReverbAccumulationBuffer*);
+
+ // |source| must point to an array of WEBAUDIO_BLOCK_SIZE elements.
+ void process(const float* source);
+
+ void processInBackground(ReverbConvolver* convolver);
+
+ // Useful for background processing
+ int inputReadIndex() const { return m_inputReadIndex; }
+
+ size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
+
+private:
+ nsAutoPtr<FFTBlock> m_fftKernel;
+ nsAutoPtr<FFTConvolver> m_fftConvolver;
+
+ ReverbAccumulationBuffer* m_accumulationBuffer;
+ int m_accumulationReadIndex;
+ int m_inputReadIndex;
+
+ size_t m_postDelayLength;
+
+ nsTArray<float> m_temporaryBuffer;
+};
+
+} // namespace WebCore
+
+#endif // ReverbConvolverStage_h
diff --git a/dom/media/webaudio/blink/ReverbInputBuffer.cpp b/dom/media/webaudio/blink/ReverbInputBuffer.cpp
new file mode 100644
index 000000000..8221f8151
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbInputBuffer.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ReverbInputBuffer.h"
+#include "mozilla/PodOperations.h"
+
+using namespace mozilla;
+
+namespace WebCore {
+
+ReverbInputBuffer::ReverbInputBuffer(size_t length)
+ : m_writeIndex(0)
+{
+ m_buffer.SetLength(length);
+ PodZero(m_buffer.Elements(), length);
+}
+
+void ReverbInputBuffer::write(const float* sourceP, size_t numberOfFrames)
+{
+ size_t bufferLength = m_buffer.Length();
+ bool isCopySafe = m_writeIndex + numberOfFrames <= bufferLength;
+ MOZ_ASSERT(isCopySafe);
+ if (!isCopySafe)
+ return;
+
+ memcpy(m_buffer.Elements() + m_writeIndex, sourceP, sizeof(float) * numberOfFrames);
+
+ m_writeIndex += numberOfFrames;
+ MOZ_ASSERT(m_writeIndex <= bufferLength);
+
+ if (m_writeIndex >= bufferLength)
+ m_writeIndex = 0;
+}
+
+float* ReverbInputBuffer::directReadFrom(int* readIndex, size_t numberOfFrames)
+{
+ size_t bufferLength = m_buffer.Length();
+ bool isPointerGood = readIndex && *readIndex >= 0 && *readIndex + numberOfFrames <= bufferLength;
+ MOZ_ASSERT(isPointerGood);
+ if (!isPointerGood) {
+ // Should never happen in practice but return pointer to start of buffer (avoid crash)
+ if (readIndex)
+ *readIndex = 0;
+ return m_buffer.Elements();
+ }
+
+ float* sourceP = m_buffer.Elements();
+ float* p = sourceP + *readIndex;
+
+ // Update readIndex
+ *readIndex = (*readIndex + numberOfFrames) % bufferLength;
+
+ return p;
+}
+
+void ReverbInputBuffer::reset()
+{
+ PodZero(m_buffer.Elements(), m_buffer.Length());
+ m_writeIndex = 0;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/ReverbInputBuffer.h b/dom/media/webaudio/blink/ReverbInputBuffer.h
new file mode 100644
index 000000000..906021c0d
--- /dev/null
+++ b/dom/media/webaudio/blink/ReverbInputBuffer.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ReverbInputBuffer_h
+#define ReverbInputBuffer_h
+
+#include "nsTArray.h"
+#include "mozilla/MemoryReporting.h"
+
+namespace WebCore {
+
+// ReverbInputBuffer is used to buffer input samples for deferred processing by the background threads.
+class ReverbInputBuffer {
+public:
+ explicit ReverbInputBuffer(size_t length);
+
+ // The realtime audio thread keeps writing samples here.
+ // The assumption is that the buffer's length is evenly divisible by numberOfFrames (for nearly all cases this will be fine).
+ // FIXME: remove numberOfFrames restriction...
+ void write(const float* sourceP, size_t numberOfFrames);
+
+ // Background threads can call this to check if there's anything to read...
+ size_t writeIndex() const { return m_writeIndex; }
+
+ // The individual background threads read here (and hope that they can keep up with the buffer writing).
+ // readIndex is updated with the next readIndex to read from...
+ // The assumption is that the buffer's length is evenly divisible by numberOfFrames.
+ // FIXME: remove numberOfFrames restriction...
+ float* directReadFrom(int* readIndex, size_t numberOfFrames);
+
+ void reset();
+
+ size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
+ {
+ return m_buffer.ShallowSizeOfExcludingThis(aMallocSizeOf);
+ }
+
+
+private:
+ nsTArray<float> m_buffer;
+ size_t m_writeIndex;
+};
+
+} // namespace WebCore
+
+#endif // ReverbInputBuffer_h
diff --git a/dom/media/webaudio/blink/ZeroPole.cpp b/dom/media/webaudio/blink/ZeroPole.cpp
new file mode 100644
index 000000000..ac0b15c7a
--- /dev/null
+++ b/dom/media/webaudio/blink/ZeroPole.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ZeroPole.h"
+
+#include <cmath>
+#include <float.h>
+
+namespace WebCore {
+
+void ZeroPole::process(const float *source, float *destination, int framesToProcess)
+{
+ float zero = m_zero;
+ float pole = m_pole;
+
+ // Gain compensation to make 0dB @ 0Hz
+ const float k1 = 1 / (1 - zero);
+ const float k2 = 1 - pole;
+
+ // Member variables to locals.
+ float lastX = m_lastX;
+ float lastY = m_lastY;
+
+ for (int i = 0; i < framesToProcess; ++i) {
+ float input = source[i];
+
+ // Zero
+ float output1 = k1 * (input - zero * lastX);
+ lastX = input;
+
+ // Pole
+ float output2 = k2 * output1 + pole * lastY;
+ lastY = output2;
+
+ destination[i] = output2;
+ }
+
+ // Locals to member variables. Flush denormals here so we don't
+ // slow down the inner loop above.
+ if (lastX == 0.0f && lastY != 0.0f && fabsf(lastY) < FLT_MIN) {
+ // Flush future values to zero (until there is new input).
+ lastY = 0.0;
+ // Flush calculated values.
+ for (int i = framesToProcess; i-- && fabsf(destination[i]) < FLT_MIN; ) {
+ destination[i] = 0.0f;
+ }
+ }
+
+ m_lastX = lastX;
+ m_lastY = lastY;
+}
+
+} // namespace WebCore
diff --git a/dom/media/webaudio/blink/ZeroPole.h b/dom/media/webaudio/blink/ZeroPole.h
new file mode 100644
index 000000000..7381bde3d
--- /dev/null
+++ b/dom/media/webaudio/blink/ZeroPole.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ZeroPole_h
+#define ZeroPole_h
+
+namespace WebCore {
+
+// ZeroPole is a simple filter with one zero and one pole.
+
+class ZeroPole {
+public:
+ ZeroPole()
+ : m_zero(0)
+ , m_pole(0)
+ , m_lastX(0)
+ , m_lastY(0)
+ {
+ }
+
+ void process(const float *source, float *destination, int framesToProcess);
+
+ // Reset filter state.
+ void reset() { m_lastX = 0; m_lastY = 0; }
+
+ void setZero(float zero) { m_zero = zero; }
+ void setPole(float pole) { m_pole = pole; }
+
+ float zero() const { return m_zero; }
+ float pole() const { return m_pole; }
+
+private:
+ float m_zero;
+ float m_pole;
+ float m_lastX;
+ float m_lastY;
+};
+
+} // namespace WebCore
+
+#endif // ZeroPole_h
diff --git a/dom/media/webaudio/blink/moz.build b/dom/media/webaudio/blink/moz.build
new file mode 100644
index 000000000..385614de7
--- /dev/null
+++ b/dom/media/webaudio/blink/moz.build
@@ -0,0 +1,39 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'Biquad.cpp',
+ 'DynamicsCompressor.cpp',
+ 'DynamicsCompressorKernel.cpp',
+ 'FFTConvolver.cpp',
+ 'HRTFDatabase.cpp',
+ 'HRTFDatabaseLoader.cpp',
+ 'HRTFElevation.cpp',
+ 'HRTFKernel.cpp',
+ 'HRTFPanner.cpp',
+ 'IIRFilter.cpp',
+ 'PeriodicWave.cpp',
+ 'Reverb.cpp',
+ 'ReverbAccumulationBuffer.cpp',
+ 'ReverbConvolver.cpp',
+ 'ReverbConvolverStage.cpp',
+ 'ReverbInputBuffer.cpp',
+ 'ZeroPole.cpp',
+]
+
+# Are we targeting x86 or x64? If so, build SSE2 files.
+if CONFIG['INTEL_ARCHITECTURE']:
+ DEFINES['USE_SSE2'] = True
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+LOCAL_INCLUDES += [
+ '/dom/media/webaudio',
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-shadow']
diff --git a/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp b/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp
new file mode 100644
index 000000000..cc731d3e2
--- /dev/null
+++ b/dom/media/webaudio/gtest/TestAudioEventTimeline.cpp
@@ -0,0 +1,450 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioEventTimeline.h"
+#include <sstream>
+#include <limits>
+#include "gtest/gtest.h"
+
+// Mock the MediaStream class
+namespace mozilla {
+class MediaStream
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStream)
+private:
+ ~MediaStream() {
+ };
+};
+}
+
+using namespace mozilla;
+using namespace mozilla::dom;
+using std::numeric_limits;
+
+// Some simple testing primitives
+void ok(bool val, const char* msg)
+{
+ if (!val) {
+ fprintf(stderr, "failure: %s", msg);
+ }
+ ASSERT_TRUE(val);
+}
+
+namespace std {
+
+template <class T>
+basic_ostream<T, char_traits<T> >&
+operator<<(basic_ostream<T, char_traits<T> >& os, nsresult rv)
+{
+ os << static_cast<uint32_t>(rv);
+ return os;
+}
+
+} // namespace std
+
+template <class T, class U>
+void is(const T& a, const U& b, const char* msg)
+{
+ std::stringstream ss;
+ ss << msg << ", Got: " << a << ", expected: " << b << std::endl;
+ ok(a == b, ss.str().c_str());
+}
+
+template <>
+void is(const float& a, const float& b, const char* msg)
+{
+ // stupidly high, since we mostly care about the correctness of the algorithm
+ const float kEpsilon = 0.00001f;
+
+ std::stringstream ss;
+ ss << msg << ", Got: " << a << ", expected: " << b << std::endl;
+ ok(fabsf(a - b) < kEpsilon, ss.str().c_str());
+}
+
+class ErrorResultMock
+{
+public:
+ ErrorResultMock()
+ : mRv(NS_OK)
+ {
+ }
+ void Throw(nsresult aRv)
+ {
+ mRv = aRv;
+ }
+
+ operator nsresult() const
+ {
+ return mRv;
+ }
+
+ ErrorResultMock& operator=(nsresult aRv)
+ {
+ mRv = aRv;
+ return *this;
+ }
+
+private:
+ nsresult mRv;
+};
+
+typedef AudioEventTimeline Timeline;
+
+TEST(AudioEventTimeline, SpecExample)
+{
+ // First, run the basic tests
+ Timeline timeline(10.0f);
+ is(timeline.Value(), 10.0f, "Correct default value returned");
+
+ ErrorResultMock rv;
+
+ uint32_t curveLength = 44100;
+ float* curve = new float[curveLength];
+ for (uint32_t i = 0; i < curveLength; ++i) {
+ curve[i] = sin(M_PI * i / float(curveLength));
+ }
+
+ // This test is copied from the example in the Web Audio spec
+ const double t0 = 0.0,
+ t1 = 0.1,
+ t2 = 0.2,
+ t3 = 0.3,
+ t4 = 0.4,
+ t5 = 0.6,
+ t6 = 0.7,
+ t7 = 1.0;
+ timeline.SetValueAtTime(0.2f, t0, rv);
+ is(rv, NS_OK, "SetValueAtTime succeeded");
+ timeline.SetValueAtTime(0.3f, t1, rv);
+ is(rv, NS_OK, "SetValueAtTime succeeded");
+ timeline.SetValueAtTime(0.4f, t2, rv);
+ is(rv, NS_OK, "SetValueAtTime succeeded");
+ timeline.LinearRampToValueAtTime(1.0f, t3, rv);
+ is(rv, NS_OK, "LinearRampToValueAtTime succeeded");
+ timeline.LinearRampToValueAtTime(0.15f, t4, rv);
+ is(rv, NS_OK, "LinearRampToValueAtTime succeeded");
+ timeline.ExponentialRampToValueAtTime(0.75f, t5, rv);
+ is(rv, NS_OK, "ExponentialRampToValueAtTime succeeded");
+ timeline.ExponentialRampToValueAtTime(0.05f, t6, rv);
+ is(rv, NS_OK, "ExponentialRampToValueAtTime succeeded");
+ timeline.SetValueCurveAtTime(curve, curveLength, t6, t7 - t6, rv);
+ is(rv, NS_OK, "SetValueCurveAtTime succeeded");
+
+ is(timeline.GetValueAtTime(0.0), 0.2f, "Correct value");
+ is(timeline.GetValueAtTime(0.05), 0.2f, "Correct value");
+ is(timeline.GetValueAtTime(0.1), 0.3f, "Correct value");
+ is(timeline.GetValueAtTime(0.15), 0.3f, "Correct value");
+ is(timeline.GetValueAtTime(0.2), 0.4f, "Correct value");
+ is(timeline.GetValueAtTime(0.25), (0.4f + 1.0f) / 2, "Correct value");
+ is(timeline.GetValueAtTime(0.3), 1.0f, "Correct value");
+ is(timeline.GetValueAtTime(0.35), (1.0f + 0.15f) / 2, "Correct value");
+ is(timeline.GetValueAtTime(0.4), 0.15f, "Correct value");
+ is(timeline.GetValueAtTime(0.45), (0.15f * powf(0.75f / 0.15f, 0.05f / 0.2f)), "Correct value");
+ is(timeline.GetValueAtTime(0.5), (0.15f * powf(0.75f / 0.15f, 0.5f)), "Correct value");
+ is(timeline.GetValueAtTime(0.55), (0.15f * powf(0.75f / 0.15f, 0.15f / 0.2f)), "Correct value");
+ is(timeline.GetValueAtTime(0.6), 0.75f, "Correct value");
+ is(timeline.GetValueAtTime(0.65), (0.75f * powf(0.05f / 0.75f, 0.5f)), "Correct value");
+ is(timeline.GetValueAtTime(0.7), 0.0f, "Correct value");
+ is(timeline.GetValueAtTime(0.85), 1.0f, "Correct value");
+ is(timeline.GetValueAtTime(1.0), curve[curveLength - 1], "Correct value");
+
+ delete[] curve;
+}
+
+TEST(AudioEventTimeline, InvalidEvents)
+{
+ static_assert(numeric_limits<float>::has_quiet_NaN, "Platform must have a quiet NaN");
+ const float NaN = numeric_limits<float>::quiet_NaN();
+ const float Infinity = numeric_limits<float>::infinity();
+ Timeline timeline(10.0f);
+
+ float curve[] = { -1.0f, 0.0f, 1.0f };
+ float badCurve1[] = { -1.0f, NaN, 1.0f };
+ float badCurve2[] = { -1.0f, Infinity, 1.0f };
+ float badCurve3[] = { -1.0f, -Infinity, 1.0f };
+
+ ErrorResultMock rv;
+
+ timeline.SetValueAtTime(NaN, 0.1, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueAtTime(Infinity, 0.1, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueAtTime(-Infinity, 0.1, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.LinearRampToValueAtTime(NaN, 0.2, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.LinearRampToValueAtTime(Infinity, 0.2, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.LinearRampToValueAtTime(-Infinity, 0.2, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.ExponentialRampToValueAtTime(NaN, 0.3, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.ExponentialRampToValueAtTime(Infinity, 0.3, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.ExponentialRampToValueAtTime(-Infinity, 0.4, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.ExponentialRampToValueAtTime(0, 0.5, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetTargetAtTime(NaN, 0.4, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetTargetAtTime(Infinity, 0.4, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetTargetAtTime(-Infinity, 0.4, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetTargetAtTime(0.4f, NaN, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetTargetAtTime(0.4f, Infinity, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetTargetAtTime(0.4f, -Infinity, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(nullptr, 0, 1.0, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(badCurve1, ArrayLength(badCurve1), 1.0, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(badCurve2, ArrayLength(badCurve2), 1.0, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(badCurve3, ArrayLength(badCurve3), 1.0, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), NaN, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), Infinity, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), -Infinity, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), 1.0, NaN, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), 1.0, Infinity, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), 1.0, -Infinity, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+}
+
+TEST(AudioEventTimeline, EventReplacement)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ is(timeline.GetEventCount(), 0u, "No events yet");
+ timeline.SetValueAtTime(10.0f, 0.1, rv);
+ is(timeline.GetEventCount(), 1u, "One event scheduled now");
+ timeline.SetValueAtTime(20.0f, 0.1, rv);
+ is(rv, NS_OK, "Event scheduling should be successful");
+ is(timeline.GetEventCount(), 1u, "Event should be replaced");
+ is(timeline.GetValueAtTime(0.1), 20.0f, "The first event should be overwritten");
+ timeline.LinearRampToValueAtTime(30.0f, 0.1, rv);
+ is(rv, NS_OK, "Event scheduling should be successful");
+ is(timeline.GetEventCount(), 2u, "Different event type should be appended");
+ is(timeline.GetValueAtTime(0.1), 30.0f, "The first event should be overwritten");
+}
+
+TEST(AudioEventTimeline, EventRemoval)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetValueAtTime(10.0f, 0.1, rv);
+ timeline.SetValueAtTime(15.0f, 0.15, rv);
+ timeline.SetValueAtTime(20.0f, 0.2, rv);
+ timeline.LinearRampToValueAtTime(30.0f, 0.3, rv);
+ is(timeline.GetEventCount(), 4u, "Should have three events initially");
+ timeline.CancelScheduledValues(0.4);
+ is(timeline.GetEventCount(), 4u, "Trying to delete past the end of the array should have no effect");
+ timeline.CancelScheduledValues(0.3);
+ is(timeline.GetEventCount(), 3u, "Should successfully delete one event");
+ timeline.CancelScheduledValues(0.12);
+ is(timeline.GetEventCount(), 1u, "Should successfully delete two events");
+ timeline.CancelAllEvents();
+ ok(timeline.HasSimpleValue(), "No event should remain scheduled");
+}
+
+TEST(AudioEventTimeline, BeforeFirstEventSetValue)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetValueAtTime(20.0f, 1.0, rv);
+ is(timeline.GetValueAtTime(0.5), 10.0f, "Retrun the default value before the first event");
+}
+
+TEST(AudioEventTimeline, BeforeFirstEventSetTarget)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetTargetAtTime(20.0f, 1.0, 5.0, rv);
+ is(timeline.GetValueAtTime(0.5), 10.0f, "Retrun the default value before the first event");
+}
+
+TEST(AudioEventTimeline, BeforeFirstEventLinearRamp)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.LinearRampToValueAtTime(20.0f, 1.0, rv);
+ is(timeline.GetValueAtTime(0.5), 10.0f, "Retrun the default value before the first event");
+}
+
+TEST(AudioEventTimeline, BeforeFirstEventExponentialRamp)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.ExponentialRampToValueAtTime(20.0f, 1.0, rv);
+ is(timeline.GetValueAtTime(0.5), 10.0f, "Retrun the default value before the first event");
+}
+
+TEST(AudioEventTimeline, AfterLastValueEvent)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetValueAtTime(20.0f, 1.0, rv);
+ is(timeline.GetValueAtTime(1.5), 20.0f, "Return the last value after the last SetValue event");
+}
+
+TEST(AudioEventTimeline, AfterLastTargetValueEvent)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetTargetAtTime(20.0f, 1.0, 5.0, rv);
+ is(timeline.GetValueAtTime(10.), (20.f + (10.f - 20.f) * expf(-9.0f / 5.0f)), "Return the value after the last SetTarget event based on the curve");
+}
+
+TEST(AudioEventTimeline, AfterLastTargetValueEventWithValueSet)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetValue(50.f);
+ timeline.SetTargetAtTime(20.0f, 1.0, 5.0, rv);
+
+ // When using SetTargetValueAtTime, Timeline become stateful: the value for
+ // time t may depend on the time t-1, so we can't just query the value at a
+ // time and get the right value. We have to call GetValueAtTime for the
+ // previous times.
+ for (double i = 0.0; i < 9.99; i+=0.01) {
+ timeline.GetValueAtTime(i);
+ }
+
+ is(timeline.GetValueAtTime(10.), (20.f + (50.f - 20.f) * expf(-9.0f / 5.0f)), "Return the value after SetValue and the last SetTarget event based on the curve");
+}
+
+TEST(AudioEventTimeline, Value)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ is(timeline.Value(), 10.0f, "value should initially match the default value");
+ timeline.SetValue(20.0f);
+ is(timeline.Value(), 20.0f, "Should be able to set the value");
+ timeline.SetValueAtTime(20.0f, 1.0, rv);
+ // TODO: The following check needs to change when we compute the value based on the current time of the context
+ is(timeline.Value(), 20.0f, "TODO...");
+ timeline.SetValue(30.0f);
+ is(timeline.Value(), 20.0f, "Should not be able to set the value");
+}
+
+TEST(AudioEventTimeline, LinearRampAtZero)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.LinearRampToValueAtTime(20.0f, 0.0, rv);
+ is(timeline.GetValueAtTime(0.0), 20.0f, "Should get the correct value when t0 == t1 == 0");
+}
+
+TEST(AudioEventTimeline, ExponentialRampAtZero)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.ExponentialRampToValueAtTime(20.0f, 0.0, rv);
+ is(timeline.GetValueAtTime(0.0), 20.0f, "Should get the correct value when t0 == t1 == 0");
+}
+
+TEST(AudioEventTimeline, LinearRampAtSameTime)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetValueAtTime(5.0f, 1.0, rv);
+ timeline.LinearRampToValueAtTime(20.0f, 1.0, rv);
+ is(timeline.GetValueAtTime(1.0), 20.0f, "Should get the correct value when t0 == t1");
+}
+
+TEST(AudioEventTimeline, ExponentialRampAtSameTime)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetValueAtTime(5.0f, 1.0, rv);
+ timeline.ExponentialRampToValueAtTime(20.0f, 1.0, rv);
+ is(timeline.GetValueAtTime(1.0), 20.0f, "Should get the correct value when t0 == t1");
+}
+
+TEST(AudioEventTimeline, SetTargetZeroTimeConstant)
+{
+ Timeline timeline(10.0f);
+
+ ErrorResultMock rv;
+
+ timeline.SetTargetAtTime(20.0f, 1.0, 0.0, rv);
+ is(timeline.GetValueAtTime(1.0), 20.0f, "Should get the correct value when t0 == t1");
+}
+
+TEST(AudioEventTimeline, ExponentialInvalidPreviousZeroValue)
+{
+ Timeline timeline(0.f);
+
+ ErrorResultMock rv;
+
+ timeline.ExponentialRampToValueAtTime(1.f, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.SetValue(1.f);
+ rv = NS_OK;
+ timeline.ExponentialRampToValueAtTime(1.f, 1.0, rv);
+ is(rv, NS_OK, "Should succeed this time");
+ timeline.CancelScheduledValues(0.0);
+ is(timeline.GetEventCount(), 0u, "Should have no events scheduled");
+ rv = NS_OK;
+ timeline.SetValueAtTime(0.f, 0.5, rv);
+ is(rv, NS_OK, "Should succeed");
+ timeline.ExponentialRampToValueAtTime(1.f, 1.0, rv);
+ is(rv, NS_ERROR_DOM_SYNTAX_ERR, "Correct error code returned");
+ timeline.CancelScheduledValues(0.0);
+ is(timeline.GetEventCount(), 0u, "Should have no events scheduled");
+ rv = NS_OK;
+ timeline.ExponentialRampToValueAtTime(1.f, 1.0, rv);
+ is(rv, NS_OK, "Should succeed this time");
+}
+
+TEST(AudioEventTimeline, SettingValueCurveTwice)
+{
+ Timeline timeline(0.f);
+ float curve[] = { -1.0f, 0.0f, 1.0f };
+
+ ErrorResultMock rv;
+
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), 0.0f, 0.3f, rv);
+ timeline.SetValueCurveAtTime(curve, ArrayLength(curve), 0.0f, 0.3f, rv);
+ is(rv, NS_OK, "SetValueCurveAtTime succeeded");
+}
+
diff --git a/dom/media/webaudio/gtest/moz.build b/dom/media/webaudio/gtest/moz.build
new file mode 100644
index 000000000..2cc13b038
--- /dev/null
+++ b/dom/media/webaudio/gtest/moz.build
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'TestAudioEventTimeline.cpp',
+]
+
+LOCAL_INCLUDES += [
+ '..',
+]
+
+FINAL_LIBRARY = 'xul-gtest'
diff --git a/dom/media/webaudio/moz.build b/dom/media/webaudio/moz.build
new file mode 100644
index 000000000..d1a9f5680
--- /dev/null
+++ b/dom/media/webaudio/moz.build
@@ -0,0 +1,142 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+with Files('*'):
+ BUG_COMPONENT = ('Core', 'Web Audio')
+
+DIRS += ['blink']
+
+TEST_DIRS += ['gtest']
+
+MOCHITEST_MANIFESTS += [
+ 'test/blink/mochitest.ini',
+ 'test/mochitest.ini',
+]
+
+BROWSER_CHROME_MANIFESTS += [
+ 'test/browser.ini',
+]
+
+TEST_HARNESS_FILES.testing.mochitest.tests.dom.media.webaudio.test.blink += [
+ 'test/blink/audio-testing.js',
+ 'test/blink/convolution-testing.js',
+ 'test/blink/panner-model-testing.js',
+]
+
+EXPORTS += [
+ 'AlignedTArray.h',
+ 'AudioBlock.h',
+ 'AudioEventTimeline.h',
+ 'AudioNodeEngine.h',
+ 'AudioNodeExternalInputStream.h',
+ 'AudioNodeStream.h',
+ 'AudioParamTimeline.h',
+ 'MediaBufferDecoder.h',
+ 'ThreeDPoint.h',
+ 'WebAudioUtils.h',
+]
+
+EXPORTS.mozilla += [
+ 'FFTBlock.h',
+ 'MediaStreamAudioDestinationNode.h',
+]
+
+EXPORTS.mozilla.dom += [
+ 'AnalyserNode.h',
+ 'AudioBuffer.h',
+ 'AudioBufferSourceNode.h',
+ 'AudioContext.h',
+ 'AudioDestinationNode.h',
+ 'AudioListener.h',
+ 'AudioNode.h',
+ 'AudioParam.h',
+ 'AudioProcessingEvent.h',
+ 'BiquadFilterNode.h',
+ 'ChannelMergerNode.h',
+ 'ChannelSplitterNode.h',
+ 'ConstantSourceNode.h',
+ 'ConvolverNode.h',
+ 'DelayNode.h',
+ 'DynamicsCompressorNode.h',
+ 'GainNode.h',
+ 'IIRFilterNode.h',
+ 'MediaElementAudioSourceNode.h',
+ 'MediaStreamAudioDestinationNode.h',
+ 'MediaStreamAudioSourceNode.h',
+ 'OfflineAudioCompletionEvent.h',
+ 'OscillatorNode.h',
+ 'PannerNode.h',
+ 'PeriodicWave.h',
+ 'ScriptProcessorNode.h',
+ 'StereoPannerNode.h',
+ 'WaveShaperNode.h',
+]
+
+UNIFIED_SOURCES += [
+ 'AnalyserNode.cpp',
+ 'AudioBlock.cpp',
+ 'AudioBuffer.cpp',
+ 'AudioBufferSourceNode.cpp',
+ 'AudioContext.cpp',
+ 'AudioDestinationNode.cpp',
+ 'AudioEventTimeline.cpp',
+ 'AudioListener.cpp',
+ 'AudioNode.cpp',
+ 'AudioNodeEngine.cpp',
+ 'AudioNodeExternalInputStream.cpp',
+ 'AudioNodeStream.cpp',
+ 'AudioParam.cpp',
+ 'AudioProcessingEvent.cpp',
+ 'BiquadFilterNode.cpp',
+ 'BufferDecoder.cpp',
+ 'ChannelMergerNode.cpp',
+ 'ChannelSplitterNode.cpp',
+ 'ConstantSourceNode.cpp',
+ 'ConvolverNode.cpp',
+ 'DelayBuffer.cpp',
+ 'DelayNode.cpp',
+ 'DynamicsCompressorNode.cpp',
+ 'FFTBlock.cpp',
+ 'GainNode.cpp',
+ 'IIRFilterNode.cpp',
+ 'MediaBufferDecoder.cpp',
+ 'MediaElementAudioSourceNode.cpp',
+ 'MediaStreamAudioDestinationNode.cpp',
+ 'MediaStreamAudioSourceNode.cpp',
+ 'OfflineAudioCompletionEvent.cpp',
+ 'OscillatorNode.cpp',
+ 'PannerNode.cpp',
+ 'PeriodicWave.cpp',
+ 'ScriptProcessorNode.cpp',
+ 'StereoPannerNode.cpp',
+ 'ThreeDPoint.cpp',
+ 'WaveShaperNode.cpp',
+ 'WebAudioUtils.cpp',
+]
+
+if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['BUILD_ARM_NEON']:
+ SOURCES += ['AudioNodeEngineNEON.cpp']
+ SOURCES['AudioNodeEngineNEON.cpp'].flags += CONFIG['NEON_FLAGS']
+ LOCAL_INCLUDES += [
+ '/media/openmax_dl/dl/api/'
+ ]
+
+# Are we targeting x86 or x64? If so, build SSE2 files.
+if CONFIG['INTEL_ARCHITECTURE']:
+ SOURCES += ['AudioNodeEngineSSE2.cpp']
+ DEFINES['USE_SSE2'] = True
+ SOURCES['AudioNodeEngineSSE2.cpp'].flags += CONFIG['SSE2_FLAGS']
+
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+LOCAL_INCLUDES += [
+ '..'
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/webaudio/test/audio-expected.wav b/dom/media/webaudio/test/audio-expected.wav
new file mode 100644
index 000000000..151927077
--- /dev/null
+++ b/dom/media/webaudio/test/audio-expected.wav
Binary files differ
diff --git a/dom/media/webaudio/test/audio-mono-expected-2.wav b/dom/media/webaudio/test/audio-mono-expected-2.wav
new file mode 100644
index 000000000..68c90dfa1
--- /dev/null
+++ b/dom/media/webaudio/test/audio-mono-expected-2.wav
Binary files differ
diff --git a/dom/media/webaudio/test/audio-mono-expected.wav b/dom/media/webaudio/test/audio-mono-expected.wav
new file mode 100644
index 000000000..bf00e5cdf
--- /dev/null
+++ b/dom/media/webaudio/test/audio-mono-expected.wav
Binary files differ
diff --git a/dom/media/webaudio/test/audio-quad.wav b/dom/media/webaudio/test/audio-quad.wav
new file mode 100644
index 000000000..093f0197a
--- /dev/null
+++ b/dom/media/webaudio/test/audio-quad.wav
Binary files differ
diff --git a/dom/media/webaudio/test/audio.ogv b/dom/media/webaudio/test/audio.ogv
new file mode 100644
index 000000000..68dee3cf2
--- /dev/null
+++ b/dom/media/webaudio/test/audio.ogv
Binary files differ
diff --git a/dom/media/webaudio/test/audioBufferSourceNodeDetached_worker.js b/dom/media/webaudio/test/audioBufferSourceNodeDetached_worker.js
new file mode 100644
index 000000000..2a5a4bff8
--- /dev/null
+++ b/dom/media/webaudio/test/audioBufferSourceNodeDetached_worker.js
@@ -0,0 +1,3 @@
+onmessage = function (event) {
+ postMessage("Pong");
+};
diff --git a/dom/media/webaudio/test/audiovideo.mp4 b/dom/media/webaudio/test/audiovideo.mp4
new file mode 100644
index 000000000..fe93122d2
--- /dev/null
+++ b/dom/media/webaudio/test/audiovideo.mp4
Binary files differ
diff --git a/dom/media/webaudio/test/blink/README b/dom/media/webaudio/test/blink/README
new file mode 100644
index 000000000..1d819221f
--- /dev/null
+++ b/dom/media/webaudio/test/blink/README
@@ -0,0 +1,9 @@
+This directory contains tests originally borrowed from the Blink Web Audio test
+suite.
+
+The process of borrowing tests from Blink is as follows:
+
+* Import the pristine file from the Blink repo, noting the revision in the
+ commit message.
+* Modify the test files to turn the LayoutTest into a mochitest-plain and add
+* them to the test suite in a separate commit.
diff --git a/dom/media/webaudio/test/blink/audio-testing.js b/dom/media/webaudio/test/blink/audio-testing.js
new file mode 100644
index 000000000..c66d32c7f
--- /dev/null
+++ b/dom/media/webaudio/test/blink/audio-testing.js
@@ -0,0 +1,192 @@
+if (window.testRunner)
+ testRunner.overridePreference("WebKitWebAudioEnabled", "1");
+
+function writeString(s, a, offset) {
+ for (var i = 0; i < s.length; ++i) {
+ a[offset + i] = s.charCodeAt(i);
+ }
+}
+
+function writeInt16(n, a, offset) {
+ n = Math.floor(n);
+
+ var b1 = n & 255;
+ var b2 = (n >> 8) & 255;
+
+ a[offset + 0] = b1;
+ a[offset + 1] = b2;
+}
+
+function writeInt32(n, a, offset) {
+ n = Math.floor(n);
+ var b1 = n & 255;
+ var b2 = (n >> 8) & 255;
+ var b3 = (n >> 16) & 255;
+ var b4 = (n >> 24) & 255;
+
+ a[offset + 0] = b1;
+ a[offset + 1] = b2;
+ a[offset + 2] = b3;
+ a[offset + 3] = b4;
+}
+
+function writeAudioBuffer(audioBuffer, a, offset) {
+ var n = audioBuffer.length;
+ var channels = audioBuffer.numberOfChannels;
+
+ for (var i = 0; i < n; ++i) {
+ for (var k = 0; k < channels; ++k) {
+ var buffer = audioBuffer.getChannelData(k);
+ var sample = buffer[i] * 32768.0;
+
+ // Clip samples to the limitations of 16-bit.
+ // If we don't do this then we'll get nasty wrap-around distortion.
+ if (sample < -32768)
+ sample = -32768;
+ if (sample > 32767)
+ sample = 32767;
+
+ writeInt16(sample, a, offset);
+ offset += 2;
+ }
+ }
+}
+
+function createWaveFileData(audioBuffer) {
+ var frameLength = audioBuffer.length;
+ var numberOfChannels = audioBuffer.numberOfChannels;
+ var sampleRate = audioBuffer.sampleRate;
+ var bitsPerSample = 16;
+ var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;
+ var blockAlign = numberOfChannels * bitsPerSample/8;
+ var wavDataByteLength = frameLength * numberOfChannels * 2; // 16-bit audio
+ var headerByteLength = 44;
+ var totalLength = headerByteLength + wavDataByteLength;
+
+ var waveFileData = new Uint8Array(totalLength);
+
+ var subChunk1Size = 16; // for linear PCM
+ var subChunk2Size = wavDataByteLength;
+ var chunkSize = 4 + (8 + subChunk1Size) + (8 + subChunk2Size);
+
+ writeString("RIFF", waveFileData, 0);
+ writeInt32(chunkSize, waveFileData, 4);
+ writeString("WAVE", waveFileData, 8);
+ writeString("fmt ", waveFileData, 12);
+
+ writeInt32(subChunk1Size, waveFileData, 16); // SubChunk1Size (4)
+ writeInt16(1, waveFileData, 20); // AudioFormat (2)
+ writeInt16(numberOfChannels, waveFileData, 22); // NumChannels (2)
+ writeInt32(sampleRate, waveFileData, 24); // SampleRate (4)
+ writeInt32(byteRate, waveFileData, 28); // ByteRate (4)
+ writeInt16(blockAlign, waveFileData, 32); // BlockAlign (2)
+ writeInt32(bitsPerSample, waveFileData, 34); // BitsPerSample (4)
+
+ writeString("data", waveFileData, 36);
+ writeInt32(subChunk2Size, waveFileData, 40); // SubChunk2Size (4)
+
+ // Write actual audio data starting at offset 44.
+ writeAudioBuffer(audioBuffer, waveFileData, 44);
+
+ return waveFileData;
+}
+
+function createAudioData(audioBuffer) {
+ return createWaveFileData(audioBuffer);
+}
+
+function finishAudioTest(event) {
+ var audioData = createAudioData(event.renderedBuffer);
+ testRunner.setAudioData(audioData);
+ testRunner.notifyDone();
+}
+
+// Create an impulse in a buffer of length sampleFrameLength
+function createImpulseBuffer(context, sampleFrameLength) {
+ var audioBuffer = context.createBuffer(1, sampleFrameLength, context.sampleRate);
+ var n = audioBuffer.length;
+ var dataL = audioBuffer.getChannelData(0);
+
+ for (var k = 0; k < n; ++k) {
+ dataL[k] = 0;
+ }
+ dataL[0] = 1;
+
+ return audioBuffer;
+}
+
+// Create a buffer of the given length with a linear ramp having values 0 <= x < 1.
+function createLinearRampBuffer(context, sampleFrameLength) {
+ var audioBuffer = context.createBuffer(1, sampleFrameLength, context.sampleRate);
+ var n = audioBuffer.length;
+ var dataL = audioBuffer.getChannelData(0);
+
+ for (var i = 0; i < n; ++i)
+ dataL[i] = i / n;
+
+ return audioBuffer;
+}
+
+// Create a buffer of the given length having a constant value.
+function createConstantBuffer(context, sampleFrameLength, constantValue) {
+ var audioBuffer = context.createBuffer(1, sampleFrameLength, context.sampleRate);
+ var n = audioBuffer.length;
+ var dataL = audioBuffer.getChannelData(0);
+
+ for (var i = 0; i < n; ++i)
+ dataL[i] = constantValue;
+
+ return audioBuffer;
+}
+
+// Create a stereo impulse in a buffer of length sampleFrameLength
+function createStereoImpulseBuffer(context, sampleFrameLength) {
+ var audioBuffer = context.createBuffer(2, sampleFrameLength, context.sampleRate);
+ var n = audioBuffer.length;
+ var dataL = audioBuffer.getChannelData(0);
+ var dataR = audioBuffer.getChannelData(1);
+
+ for (var k = 0; k < n; ++k) {
+ dataL[k] = 0;
+ dataR[k] = 0;
+ }
+ dataL[0] = 1;
+ dataR[0] = 1;
+
+ return audioBuffer;
+}
+
+// Convert time (in seconds) to sample frames.
+function timeToSampleFrame(time, sampleRate) {
+ return Math.floor(0.5 + time * sampleRate);
+}
+
+// Compute the number of sample frames consumed by start with
+// the specified |grainOffset|, |duration|, and |sampleRate|.
+function grainLengthInSampleFrames(grainOffset, duration, sampleRate) {
+ var startFrame = timeToSampleFrame(grainOffset, sampleRate);
+ var endFrame = timeToSampleFrame(grainOffset + duration, sampleRate);
+
+ return endFrame - startFrame;
+}
+
+// True if the number is not an infinity or NaN
+function isValidNumber(x) {
+ return !isNaN(x) && (x != Infinity) && (x != -Infinity);
+}
+
+function shouldThrowTypeError(func, text) {
+ var ok = false;
+ try {
+ func();
+ } catch (e) {
+ if (e instanceof TypeError) {
+ ok = true;
+ }
+ }
+ if (ok) {
+ testPassed(text + " threw TypeError.");
+ } else {
+ testFailed(text + " should throw TypeError.");
+ }
+}
diff --git a/dom/media/webaudio/test/blink/biquad-filters.js b/dom/media/webaudio/test/blink/biquad-filters.js
new file mode 100644
index 000000000..06fff98b1
--- /dev/null
+++ b/dom/media/webaudio/test/blink/biquad-filters.js
@@ -0,0 +1,368 @@
+// Taken from WebKit/LayoutTests/webaudio/resources/biquad-filters.js
+
+// A biquad filter has a z-transform of
+// H(z) = (b0 + b1 / z + b2 / z^2) / (1 + a1 / z + a2 / z^2)
+//
+// The formulas for the various filters were taken from
+// http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt.
+
+
+// Lowpass filter.
+function createLowpassFilter(freq, q, gain) {
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+
+ if (freq == 1) {
+ // The formula below works, except for roundoff. When freq = 1,
+ // the filter is just a wire, so hardwire the coefficients.
+ b0 = 1;
+ b1 = 0;
+ b2 = 0;
+ a0 = 1;
+ a1 = 0;
+ a2 = 0;
+ } else {
+ var w0 = Math.PI * freq;
+ var alpha = 0.5 * Math.sin(w0) / Math.pow(10, q / 20);
+ var cos_w0 = Math.cos(w0);
+
+ b0 = 0.5 * (1 - cos_w0);
+ b1 = 1 - cos_w0;
+ b2 = b0;
+ a0 = 1 + alpha;
+ a1 = -2.0 * cos_w0;
+ a2 = 1 - alpha;
+ }
+
+ return normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+}
+
+function createHighpassFilter(freq, q, gain) {
+ var b0;
+ var b1;
+ var b2;
+ var a1;
+ var a2;
+
+ if (freq == 1) {
+ // The filter is 0
+ b0 = 0;
+ b1 = 0;
+ b2 = 0;
+ a0 = 1;
+ a1 = 0;
+ a2 = 0;
+ } else if (freq == 0) {
+ // The filter is 1. Computation of coefficients below is ok, but
+ // there's a pole at 1 and a zero at 1, so round-off could make
+ // the filter unstable.
+ b0 = 1;
+ b1 = 0;
+ b2 = 0;
+ a0 = 1;
+ a1 = 0;
+ a2 = 0;
+ } else {
+ var w0 = Math.PI * freq;
+ var alpha = 0.5 * Math.sin(w0) / Math.pow(10, q / 20);
+ var cos_w0 = Math.cos(w0);
+
+ b0 = 0.5 * (1 + cos_w0);
+ b1 = -1 - cos_w0;
+ b2 = b0;
+ a0 = 1 + alpha;
+ a1 = -2.0 * cos_w0;
+ a2 = 1 - alpha;
+ }
+
+ return normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+}
+
+function normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2) {
+ var scale = 1 / a0;
+
+ return {b0 : b0 * scale,
+ b1 : b1 * scale,
+ b2 : b2 * scale,
+ a1 : a1 * scale,
+ a2 : a2 * scale};
+}
+
+function createBandpassFilter(freq, q, gain) {
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+ var coef;
+
+ if (freq > 0 && freq < 1) {
+ var w0 = Math.PI * freq;
+ if (q > 0) {
+ var alpha = Math.sin(w0) / (2 * q);
+ var k = Math.cos(w0);
+
+ b0 = alpha;
+ b1 = 0;
+ b2 = -alpha;
+ a0 = 1 + alpha;
+ a1 = -2 * k;
+ a2 = 1 - alpha;
+
+ coef = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // q = 0, and frequency is not 0 or 1. The above formula has a
+ // divide by zero problem. The limit of the z-transform as q
+ // approaches 0 is 1, so set the filter that way.
+ coef = {b0 : 1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+ } else {
+ // When freq = 0 or 1, the z-transform is identically 0,
+ // independent of q.
+ coef = {b0 : 0, b1 : 0, b2 : 0, a1 : 0, a2 : 0}
+ }
+
+ return coef;
+}
+
+function createLowShelfFilter(freq, q, gain) {
+ // q not used
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+ var coef;
+
+ var S = 1;
+ var A = Math.pow(10, gain / 40);
+
+ if (freq == 1) {
+ // The filter is just a constant gain
+ coef = {b0 : A * A, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ } else if (freq == 0) {
+ // The filter is 1
+ coef = {b0 : 1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ } else {
+ var w0 = Math.PI * freq;
+ var alpha = 1 / 2 * Math.sin(w0) * Math.sqrt((A + 1 / A) * (1 / S - 1) + 2);
+ var k = Math.cos(w0);
+ var k2 = 2 * Math.sqrt(A) * alpha;
+ var Ap1 = A + 1;
+ var Am1 = A - 1;
+
+ b0 = A * (Ap1 - Am1 * k + k2);
+ b1 = 2 * A * (Am1 - Ap1 * k);
+ b2 = A * (Ap1 - Am1 * k - k2);
+ a0 = Ap1 + Am1 * k + k2;
+ a1 = -2 * (Am1 + Ap1 * k);
+ a2 = Ap1 + Am1 * k - k2;
+ coef = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+ }
+
+ return coef;
+}
+
+function createHighShelfFilter(freq, q, gain) {
+ // q not used
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+ var coef;
+
+ var A = Math.pow(10, gain / 40);
+
+ if (freq == 1) {
+ // When freq = 1, the z-transform is 1
+ coef = {b0 : 1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ } else if (freq > 0) {
+ var w0 = Math.PI * freq;
+ var S = 1;
+ var alpha = 0.5 * Math.sin(w0) * Math.sqrt((A + 1 / A) * (1 / S - 1) + 2);
+ var k = Math.cos(w0);
+ var k2 = 2 * Math.sqrt(A) * alpha;
+ var Ap1 = A + 1;
+ var Am1 = A - 1;
+
+ b0 = A * (Ap1 + Am1 * k + k2);
+ b1 = -2 * A * (Am1 + Ap1 * k);
+ b2 = A * (Ap1 + Am1 * k - k2);
+ a0 = Ap1 - Am1 * k + k2;
+ a1 = 2 * (Am1 - Ap1*k);
+ a2 = Ap1 - Am1 * k-k2;
+
+ coef = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When freq = 0, the filter is just a gain
+ coef = {b0 : A * A, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+
+ return coef;
+}
+
+function createPeakingFilter(freq, q, gain) {
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+ var coef;
+
+ var A = Math.pow(10, gain / 40);
+
+ if (freq > 0 && freq < 1) {
+ if (q > 0) {
+ var w0 = Math.PI * freq;
+ var alpha = Math.sin(w0) / (2 * q);
+ var k = Math.cos(w0);
+
+ b0 = 1 + alpha * A;
+ b1 = -2 * k;
+ b2 = 1 - alpha * A;
+ a0 = 1 + alpha / A;
+ a1 = -2 * k;
+ a2 = 1 - alpha / A;
+
+ coef = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // q = 0, we have a divide by zero problem in the formulas
+ // above. But if we look at the z-transform, we see that the
+ // limit as q approaches 0 is A^2.
+ coef = {b0 : A * A, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+ } else {
+ // freq = 0 or 1, the z-transform is 1
+ coef = {b0 : 1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+
+ return coef;
+}
+
+function createNotchFilter(freq, q, gain) {
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+ var coef;
+
+ if (freq > 0 && freq < 1) {
+ if (q > 0) {
+ var w0 = Math.PI * freq;
+ var alpha = Math.sin(w0) / (2 * q);
+ var k = Math.cos(w0);
+
+ b0 = 1;
+ b1 = -2 * k;
+ b2 = 1;
+ a0 = 1 + alpha;
+ a1 = -2 * k;
+ a2 = 1 - alpha;
+ coef = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // When q = 0, we get a divide by zero above. The limit of the
+ // z-transform as q approaches 0 is 0, so set the coefficients
+ // appropriately.
+ coef = {b0 : 0, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+ } else {
+ // When freq = 0 or 1, the z-transform is 1
+ coef = {b0 : 1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+
+ return coef;
+}
+
+function createAllpassFilter(freq, q, gain) {
+ var b0;
+ var b1;
+ var b2;
+ var a0;
+ var a1;
+ var a2;
+ var coef;
+
+ if (freq > 0 && freq < 1) {
+ if (q > 0) {
+ var w0 = Math.PI * freq;
+ var alpha = Math.sin(w0) / (2 * q);
+ var k = Math.cos(w0);
+
+ b0 = 1 - alpha;
+ b1 = -2 * k;
+ b2 = 1 + alpha;
+ a0 = 1 + alpha;
+ a1 = -2 * k;
+ a2 = 1 - alpha;
+ coef = normalizeFilterCoefficients(b0, b1, b2, a0, a1, a2);
+ } else {
+ // q = 0
+ coef = {b0 : -1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+ } else {
+ coef = {b0 : 1, b1 : 0, b2 : 0, a1 : 0, a2 : 0};
+ }
+
+ return coef;
+}
+
+function filterData(filterCoef, signal, len) {
+ var y = new Array(len);
+ var b0 = filterCoef.b0;
+ var b1 = filterCoef.b1;
+ var b2 = filterCoef.b2;
+ var a1 = filterCoef.a1;
+ var a2 = filterCoef.a2;
+
+ // Prime the pump. (Assumes the signal has length >= 2!)
+ y[0] = b0 * signal[0];
+ y[1] = b0 * signal[1] + b1 * signal[0] - a1 * y[0];
+
+ // Filter all of the signal that we have.
+ for (var k = 2; k < Math.min(signal.length, len); ++k) {
+ y[k] = b0 * signal[k] + b1 * signal[k-1] + b2 * signal[k-2] - a1 * y[k-1] - a2 * y[k-2];
+ }
+
+ // If we need to filter more, but don't have any signal left,
+ // assume the signal is zero.
+ for (var k = signal.length; k < len; ++k) {
+ y[k] = - a1 * y[k-1] - a2 * y[k-2];
+ }
+
+ return y;
+}
+
+// Map the filter type name to a function that computes the filter coefficents for the given filter
+// type.
+var filterCreatorFunction = {"lowpass": createLowpassFilter,
+ "highpass": createHighpassFilter,
+ "bandpass": createBandpassFilter,
+ "lowshelf": createLowShelfFilter,
+ "highshelf": createHighShelfFilter,
+ "peaking": createPeakingFilter,
+ "notch": createNotchFilter,
+ "allpass": createAllpassFilter};
+
+var filterTypeName = {"lowpass": "Lowpass filter",
+ "highpass": "Highpass filter",
+ "bandpass": "Bandpass filter",
+ "lowshelf": "Lowshelf filter",
+ "highshelf": "Highshelf filter",
+ "peaking": "Peaking filter",
+ "notch": "Notch filter",
+ "allpass": "Allpass filter"};
+
+function createFilter(filterType, freq, q, gain) {
+ return filterCreatorFunction[filterType](freq, q, gain);
+}
diff --git a/dom/media/webaudio/test/blink/biquad-testing.js b/dom/media/webaudio/test/blink/biquad-testing.js
new file mode 100644
index 000000000..795adf601
--- /dev/null
+++ b/dom/media/webaudio/test/blink/biquad-testing.js
@@ -0,0 +1,153 @@
+// Globals, to make testing and debugging easier.
+var context;
+var filter;
+var signal;
+var renderedBuffer;
+var renderedData;
+
+var sampleRate = 44100.0;
+var pulseLengthFrames = .1 * sampleRate;
+
+// Maximum allowed error for the test to succeed. Experimentally determined.
+var maxAllowedError = 5.9e-8;
+
+// This must be large enough so that the filtered result is
+// essentially zero. See comments for createTestAndRun.
+var timeStep = .1;
+
+// Maximum number of filters we can process (mostly for setting the
+// render length correctly.)
+var maxFilters = 5;
+
+// How long to render. Must be long enough for all of the filters we
+// want to test.
+var renderLengthSeconds = timeStep * (maxFilters + 1) ;
+
+var renderLengthSamples = Math.round(renderLengthSeconds * sampleRate);
+
+// Number of filters that will be processed.
+var nFilters;
+
+function createImpulseBuffer(context, length) {
+ var impulse = context.createBuffer(1, length, context.sampleRate);
+ var data = impulse.getChannelData(0);
+ for (var k = 1; k < data.length; ++k) {
+ data[k] = 0;
+ }
+ data[0] = 1;
+
+ return impulse;
+}
+
+
+function createTestAndRun(context, filterType, filterParameters) {
+ // To test the filters, we apply a signal (an impulse) to each of
+ // the specified filters, with each signal starting at a different
+ // time. The output of the filters is summed together at the
+ // output. Thus for filter k, the signal input to the filter
+ // starts at time k * timeStep. For this to work well, timeStep
+ // must be large enough for the output of each filter to have
+ // decayed to zero with timeStep seconds. That way the filter
+ // outputs don't interfere with each other.
+
+ nFilters = Math.min(filterParameters.length, maxFilters);
+
+ signal = new Array(nFilters);
+ filter = new Array(nFilters);
+
+ impulse = createImpulseBuffer(context, pulseLengthFrames);
+
+ // Create all of the signal sources and filters that we need.
+ for (var k = 0; k < nFilters; ++k) {
+ signal[k] = context.createBufferSource();
+ signal[k].buffer = impulse;
+
+ filter[k] = context.createBiquadFilter();
+ filter[k].type = filterType;
+ filter[k].frequency.value = context.sampleRate / 2 * filterParameters[k].cutoff;
+ filter[k].detune.value = (filterParameters[k].detune === undefined) ? 0 : filterParameters[k].detune;
+ filter[k].Q.value = filterParameters[k].q;
+ filter[k].gain.value = filterParameters[k].gain;
+
+ signal[k].connect(filter[k]);
+ filter[k].connect(context.destination);
+
+ signal[k].start(timeStep * k);
+ }
+
+ context.oncomplete = checkFilterResponse(filterType, filterParameters);
+ context.startRendering();
+}
+
+function addSignal(dest, src, destOffset) {
+ // Add src to dest at the given dest offset.
+ for (var k = destOffset, j = 0; k < dest.length, j < src.length; ++k, ++j) {
+ dest[k] += src[j];
+ }
+}
+
+function generateReference(filterType, filterParameters) {
+ var result = new Array(renderLengthSamples);
+ var data = new Array(renderLengthSamples);
+ // Initialize the result array and data.
+ for (var k = 0; k < result.length; ++k) {
+ result[k] = 0;
+ data[k] = 0;
+ }
+ // Make data an impulse.
+ data[0] = 1;
+
+ for (var k = 0; k < nFilters; ++k) {
+ // Filter an impulse
+ var detune = (filterParameters[k].detune === undefined) ? 0 : filterParameters[k].detune;
+ var frequency = filterParameters[k].cutoff * Math.pow(2, detune / 1200); // Apply detune, converting from Cents.
+
+ var filterCoef = createFilter(filterType,
+ frequency,
+ filterParameters[k].q,
+ filterParameters[k].gain);
+ var y = filterData(filterCoef, data, renderLengthSamples);
+
+ // Accumulate this filtered data into the final output at the desired offset.
+ addSignal(result, y, timeToSampleFrame(timeStep * k, sampleRate));
+ }
+
+ return result;
+}
+
+function checkFilterResponse(filterType, filterParameters) {
+ return function(event) {
+ renderedBuffer = event.renderedBuffer;
+ renderedData = renderedBuffer.getChannelData(0);
+
+ reference = generateReference(filterType, filterParameters);
+
+ var len = Math.min(renderedData.length, reference.length);
+
+ var success = true;
+
+ // Maximum error between rendered data and expected data
+ var maxError = 0;
+
+ // Sample offset where the maximum error occurred.
+ var maxPosition = 0;
+
+ // Number of infinities or NaNs that occurred in the rendered data.
+ var invalidNumberCount = 0;
+
+ ok(nFilters == filterParameters.length, "Test wanted " + filterParameters.length + " filters but only " + maxFilters + " allowed.");
+
+ compareChannels(renderedData, reference, len, 0, 0, true);
+
+ // Check for bad numbers in the rendered output too.
+ // There shouldn't be any.
+ for (var k = 0; k < len; ++k) {
+ if (!isValidNumber(renderedData[k])) {
+ ++invalidNumberCount;
+ }
+ }
+
+ ok(invalidNumberCount == 0, "Rendered output has " + invalidNumberCount + " infinities or NaNs.");
+ SimpleTest.finish();
+ }
+}
diff --git a/dom/media/webaudio/test/blink/convolution-testing.js b/dom/media/webaudio/test/blink/convolution-testing.js
new file mode 100644
index 000000000..98ff0c775
--- /dev/null
+++ b/dom/media/webaudio/test/blink/convolution-testing.js
@@ -0,0 +1,182 @@
+var sampleRate = 44100.0;
+
+var renderLengthSeconds = 8;
+var pulseLengthSeconds = 1;
+var pulseLengthFrames = pulseLengthSeconds * sampleRate;
+
+function createSquarePulseBuffer(context, sampleFrameLength) {
+ var audioBuffer = context.createBuffer(1, sampleFrameLength, context.sampleRate);
+
+ var n = audioBuffer.length;
+ var data = audioBuffer.getChannelData(0);
+
+ for (var i = 0; i < n; ++i)
+ data[i] = 1;
+
+ return audioBuffer;
+}
+
+// The triangle buffer holds the expected result of the convolution.
+// It linearly ramps up from 0 to its maximum value (at the center)
+// then linearly ramps down to 0. The center value corresponds to the
+// point where the two square pulses overlap the most.
+function createTrianglePulseBuffer(context, sampleFrameLength) {
+ var audioBuffer = context.createBuffer(1, sampleFrameLength, context.sampleRate);
+
+ var n = audioBuffer.length;
+ var halfLength = n / 2;
+ var data = audioBuffer.getChannelData(0);
+
+ for (var i = 0; i < halfLength; ++i)
+ data[i] = i + 1;
+
+ for (var i = halfLength; i < n; ++i)
+ data[i] = n - i - 1;
+
+ return audioBuffer;
+}
+
+function log10(x) {
+ return Math.log(x)/Math.LN10;
+}
+
+function linearToDecibel(x) {
+ return 20*log10(x);
+}
+
+// Verify that the rendered result is very close to the reference
+// triangular pulse.
+function checkTriangularPulse(rendered, reference) {
+ var match = true;
+ var maxDelta = 0;
+ var valueAtMaxDelta = 0;
+ var maxDeltaIndex = 0;
+
+ for (var i = 0; i < reference.length; ++i) {
+ var diff = rendered[i] - reference[i];
+ var x = Math.abs(diff);
+ if (x > maxDelta) {
+ maxDelta = x;
+ valueAtMaxDelta = reference[i];
+ maxDeltaIndex = i;
+ }
+ }
+
+ // allowedDeviationFraction was determined experimentally. It
+ // is the threshold of the relative error at the maximum
+ // difference between the true triangular pulse and the
+ // rendered pulse.
+ var allowedDeviationDecibels = -129.4;
+ var maxDeviationDecibels = linearToDecibel(maxDelta / valueAtMaxDelta);
+
+ if (maxDeviationDecibels <= allowedDeviationDecibels) {
+ testPassed("Triangular portion of convolution is correct.");
+ } else {
+ testFailed("Triangular portion of convolution is not correct. Max deviation = " + maxDeviationDecibels + " dB at " + maxDeltaIndex);
+ match = false;
+ }
+
+ return match;
+}
+
+// Verify that the rendered data is close to zero for the first part
+// of the tail.
+function checkTail1(data, reference, breakpoint) {
+ var isZero = true;
+ var tail1Max = 0;
+
+ for (var i = reference.length; i < reference.length + breakpoint; ++i) {
+ var mag = Math.abs(data[i]);
+ if (mag > tail1Max) {
+ tail1Max = mag;
+ }
+ }
+
+ // Let's find the peak of the reference (even though we know a
+ // priori what it is).
+ var refMax = 0;
+ for (var i = 0; i < reference.length; ++i) {
+ refMax = Math.max(refMax, Math.abs(reference[i]));
+ }
+
+ // This threshold is experimentally determined by examining the
+ // value of tail1MaxDecibels.
+ var threshold1 = -129.7;
+
+ var tail1MaxDecibels = linearToDecibel(tail1Max/refMax);
+ if (tail1MaxDecibels <= threshold1) {
+ testPassed("First part of tail of convolution is sufficiently small.");
+ } else {
+ testFailed("First part of tail of convolution is not sufficiently small: " + tail1MaxDecibels + " dB");
+ isZero = false;
+ }
+
+ return isZero;
+}
+
+// Verify that the second part of the tail of the convolution is
+// exactly zero.
+function checkTail2(data, reference, breakpoint) {
+ var isZero = true;
+ var tail2Max = 0;
+ // For the second part of the tail, the maximum value should be
+ // exactly zero.
+ var threshold2 = 0;
+ for (var i = reference.length + breakpoint; i < data.length; ++i) {
+ if (Math.abs(data[i]) > 0) {
+ isZero = false;
+ break;
+ }
+ }
+
+ if (isZero) {
+ testPassed("Rendered signal after tail of convolution is silent.");
+ } else {
+ testFailed("Rendered signal after tail of convolution should be silent.");
+ }
+
+ return isZero;
+}
+
+function checkConvolvedResult(trianglePulse) {
+ return function(event) {
+ var renderedBuffer = event.renderedBuffer;
+
+ var referenceData = trianglePulse.getChannelData(0);
+ var renderedData = renderedBuffer.getChannelData(0);
+
+ var success = true;
+
+ // Verify the triangular pulse is actually triangular.
+
+ success = success && checkTriangularPulse(renderedData, referenceData);
+
+ // Make sure that portion after convolved portion is totally
+ // silent. But round-off prevents this from being completely
+ // true. At the end of the triangle, it should be close to
+ // zero. If we go farther out, it should be even closer and
+ // eventually zero.
+
+ // For the tail of the convolution (where the result would be
+ // theoretically zero), we partition the tail into two
+ // parts. The first is the at the beginning of the tail,
+ // where we tolerate a small but non-zero value. The second part is
+ // farther along the tail where the result should be zero.
+
+ // breakpoint is the point dividing the first two tail parts
+ // we're looking at. Experimentally determined.
+ var breakpoint = 12800;
+
+ success = success && checkTail1(renderedData, referenceData, breakpoint);
+
+ success = success && checkTail2(renderedData, referenceData, breakpoint);
+
+ if (success) {
+ testPassed("Test signal was correctly convolved.");
+ } else {
+ testFailed("Test signal was not correctly convolved.");
+ }
+
+ finishJSTest();
+ }
+}
diff --git a/dom/media/webaudio/test/blink/mochitest.ini b/dom/media/webaudio/test/blink/mochitest.ini
new file mode 100644
index 000000000..28bceb3a4
--- /dev/null
+++ b/dom/media/webaudio/test/blink/mochitest.ini
@@ -0,0 +1,23 @@
+[DEFAULT]
+tags=msg
+tags = webaudio
+subsuite = media
+support-files =
+ biquad-filters.js
+ biquad-testing.js
+ ../webaudio.js
+
+[test_biquadFilterNodeAllPass.html]
+[test_biquadFilterNodeAutomation.html]
+skip-if = true # Known problems with Biquad automation, e.g. Bug 1155709
+[test_biquadFilterNodeBandPass.html]
+[test_biquadFilterNodeGetFrequencyResponse.html]
+[test_biquadFilterNodeHighPass.html]
+[test_biquadFilterNodeHighShelf.html]
+[test_biquadFilterNodeLowPass.html]
+[test_biquadFilterNodeLowShelf.html]
+[test_biquadFilterNodeNotch.html]
+[test_biquadFilterNodePeaking.html]
+[test_biquadFilterNodeTail.html]
+[test_iirFilterNode.html]
+[test_iirFilterNodeGetFrequencyResponse.html]
diff --git a/dom/media/webaudio/test/blink/panner-model-testing.js b/dom/media/webaudio/test/blink/panner-model-testing.js
new file mode 100644
index 000000000..45460e276
--- /dev/null
+++ b/dom/media/webaudio/test/blink/panner-model-testing.js
@@ -0,0 +1,210 @@
+var sampleRate = 48000.0;
+
+var numberOfChannels = 1;
+
+// Time step when each panner node starts.
+var timeStep = 0.001;
+
+// Length of the impulse signal.
+var pulseLengthFrames = Math.round(timeStep * sampleRate);
+
+// How many panner nodes to create for the test
+var nodesToCreate = 100;
+
+// Be sure we render long enough for all of our nodes.
+var renderLengthSeconds = timeStep * (nodesToCreate + 1);
+
+// These are global mostly for debugging.
+var context;
+var impulse;
+var bufferSource;
+var panner;
+var position;
+var time;
+
+var renderedBuffer;
+var renderedLeft;
+var renderedRight;
+
+function createGraph(context, nodeCount) {
+ bufferSource = new Array(nodeCount);
+ panner = new Array(nodeCount);
+ position = new Array(nodeCount);
+ time = new Array(nodeCount);
+ // Angle between panner locations. (nodeCount - 1 because we want
+ // to include both 0 and 180 deg.
+ var angleStep = Math.PI / (nodeCount - 1);
+
+ if (numberOfChannels == 2) {
+ impulse = createStereoImpulseBuffer(context, pulseLengthFrames);
+ }
+ else
+ impulse = createImpulseBuffer(context, pulseLengthFrames);
+
+ for (var k = 0; k < nodeCount; ++k) {
+ bufferSource[k] = context.createBufferSource();
+ bufferSource[k].buffer = impulse;
+
+ panner[k] = context.createPanner();
+ panner[k].panningModel = "equalpower";
+ panner[k].distanceModel = "linear";
+
+ var angle = angleStep * k;
+ position[k] = {angle : angle, x : Math.cos(angle), z : Math.sin(angle)};
+ panner[k].positionX.value = position[k].x;
+ panner[k].positionZ.value = position[k].z;
+
+ bufferSource[k].connect(panner[k]);
+ panner[k].connect(context.destination);
+
+ // Start the source
+ time[k] = k * timeStep;
+ bufferSource[k].start(time[k]);
+ }
+}
+
+function createTestAndRun(context, nodeCount, numberOfSourceChannels) {
+ numberOfChannels = numberOfSourceChannels;
+
+ createGraph(context, nodeCount);
+
+ context.oncomplete = checkResult;
+ context.startRendering();
+}
+
+// Map our position angle to the azimuth angle (in degrees).
+//
+// An angle of 0 corresponds to an azimuth of 90 deg; pi, to -90 deg.
+function angleToAzimuth(angle) {
+ return 90 - angle * 180 / Math.PI;
+}
+
+// The gain caused by the EQUALPOWER panning model
+function equalPowerGain(angle) {
+ var azimuth = angleToAzimuth(angle);
+
+ if (numberOfChannels == 1) {
+ var panPosition = (azimuth + 90) / 180;
+
+ var gainL = Math.cos(0.5 * Math.PI * panPosition);
+ var gainR = Math.sin(0.5 * Math.PI * panPosition);
+
+ return { left : gainL, right : gainR };
+ } else {
+ if (azimuth <= 0) {
+ var panPosition = (azimuth + 90) / 90;
+
+ var gainL = 1 + Math.cos(0.5 * Math.PI * panPosition);
+ var gainR = Math.sin(0.5 * Math.PI * panPosition);
+
+ return { left : gainL, right : gainR };
+ } else {
+ var panPosition = azimuth / 90;
+
+ var gainL = Math.cos(0.5 * Math.PI * panPosition);
+ var gainR = 1 + Math.sin(0.5 * Math.PI * panPosition);
+
+ return { left : gainL, right : gainR };
+ }
+ }
+}
+
+function checkResult(event) {
+ renderedBuffer = event.renderedBuffer;
+ renderedLeft = renderedBuffer.getChannelData(0);
+ renderedRight = renderedBuffer.getChannelData(1);
+
+ // The max error we allow between the rendered impulse and the
+ // expected value. This value is experimentally determined. Set
+ // to 0 to make the test fail to see what the actual error is.
+ var maxAllowedError = 1.3e-6;
+
+ var success = true;
+
+ // Number of impulses found in the rendered result.
+ var impulseCount = 0;
+
+ // Max (relative) error and the index of the maxima for the left
+ // and right channels.
+ var maxErrorL = 0;
+ var maxErrorIndexL = 0;
+ var maxErrorR = 0;
+ var maxErrorIndexR = 0;
+
+ // Number of impulses that don't match our expected locations.
+ var timeCount = 0;
+
+ // Locations of where the impulses aren't at the expected locations.
+ var timeErrors = new Array();
+
+ for (var k = 0; k < renderedLeft.length; ++k) {
+ // We assume that the left and right channels start at the same instant.
+ if (renderedLeft[k] != 0 || renderedRight[k] != 0) {
+ // The expected gain for the left and right channels.
+ var pannerGain = equalPowerGain(position[impulseCount].angle);
+ var expectedL = pannerGain.left;
+ var expectedR = pannerGain.right;
+
+ // Absolute error in the gain.
+ var errorL = Math.abs(renderedLeft[k] - expectedL);
+ var errorR = Math.abs(renderedRight[k] - expectedR);
+
+ if (Math.abs(errorL) > maxErrorL) {
+ maxErrorL = Math.abs(errorL);
+ maxErrorIndexL = impulseCount;
+ }
+ if (Math.abs(errorR) > maxErrorR) {
+ maxErrorR = Math.abs(errorR);
+ maxErrorIndexR = impulseCount;
+ }
+
+ // Keep track of the impulses that didn't show up where we
+ // expected them to be.
+ var expectedOffset = timeToSampleFrame(time[impulseCount], sampleRate);
+ if (k != expectedOffset) {
+ timeErrors[timeCount] = { actual : k, expected : expectedOffset};
+ ++timeCount;
+ }
+ ++impulseCount;
+ }
+ }
+
+ if (impulseCount == nodesToCreate) {
+ testPassed("Number of impulses matches the number of panner nodes.");
+ } else {
+ testFailed("Number of impulses is incorrect. (Found " + impulseCount + " but expected " + nodesToCreate + ")");
+ success = false;
+ }
+
+ if (timeErrors.length > 0) {
+ success = false;
+ testFailed(timeErrors.length + " timing errors found in " + nodesToCreate + " panner nodes.");
+ for (var k = 0; k < timeErrors.length; ++k) {
+ testFailed("Impulse at sample " + timeErrors[k].actual + " but expected " + timeErrors[k].expected);
+ }
+ } else {
+ testPassed("All impulses at expected offsets.");
+ }
+
+ if (maxErrorL <= maxAllowedError) {
+ testPassed("Left channel gain values are correct.");
+ } else {
+ testFailed("Left channel gain values are incorrect. Max error = " + maxErrorL + " at time " + time[maxErrorIndexL] + " (threshold = " + maxAllowedError + ")");
+ success = false;
+ }
+
+ if (maxErrorR <= maxAllowedError) {
+ testPassed("Right channel gain values are correct.");
+ } else {
+ testFailed("Right channel gain values are incorrect. Max error = " + maxErrorR + " at time " + time[maxErrorIndexR] + " (threshold = " + maxAllowedError + ")");
+ success = false;
+ }
+
+ if (success) {
+ testPassed("EqualPower panner test passed");
+ } else {
+ testFailed("EqualPower panner test failed");
+ }
+
+ finishJSTest();
+}
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html
new file mode 100644
index 000000000..266521c52
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode All Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ var filterParameters = [{cutoff : 0, q : 10, gain : 1 },
+ {cutoff : 1, q : 10, gain : 1 },
+ {cutoff : .5, q : 0, gain : 1 },
+ {cutoff : 0.25, q : 10, gain : 1 },
+ ];
+ createTestAndRun(context, "allpass", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeAutomation.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeAutomation.html
new file mode 100644
index 000000000..08ce71cce
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeAutomation.html
@@ -0,0 +1,351 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode All Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Don't need to run these tests at high sampling rate, so just use a low one to reduce memory
+ // usage and complexity.
+ var sampleRate = 16000;
+
+ // How long to render for each test.
+ var renderDuration = 1;
+
+ // The definition of the linear ramp automation function.
+ function linearRamp(t, v0, v1, t0, t1) {
+ return v0 + (v1 - v0) * (t - t0) / (t1 - t0);
+ }
+
+ // Generate the filter coefficients for the specified filter using the given parameters for
+ // the given duration. |filterTypeFunction| is a function that returns the filter
+ // coefficients for one set of parameters. |parameters| is a property bag that contains the
+ // start and end values (as an array) for each of the biquad attributes. The properties are
+ // |freq|, |Q|, |gain|, and |detune|. |duration| is the number of seconds for which the
+ // coefficients are generated.
+ //
+ // A property bag with properties |b0|, |b1|, |b2|, |a1|, |a2|. Each propery is an array
+ // consisting of the coefficients for the time-varying biquad filter.
+ function generateFilterCoefficients(filterTypeFunction, parameters, duration) {
+ var endFrame = Math.ceil(duration * sampleRate);
+ var nCoef = endFrame;
+ var b0 = new Float64Array(nCoef);
+ var b1 = new Float64Array(nCoef);
+ var b2 = new Float64Array(nCoef);
+ var a1 = new Float64Array(nCoef);
+ var a2 = new Float64Array(nCoef);
+
+ var k = 0;
+ // If the property is not given, use the defaults.
+ var freqs = parameters.freq || [350, 350];
+ var qs = parameters.Q || [1, 1];
+ var gains = parameters.gain || [0, 0];
+ var detunes = parameters.detune || [0, 0];
+
+ for (var frame = 0; frame < endFrame; ++frame) {
+ // Apply linear ramp at frame |frame|.
+ var f = linearRamp(frame / sampleRate, freqs[0], freqs[1], 0, duration);
+ var q = linearRamp(frame / sampleRate, qs[0], qs[1], 0, duration);
+ var g = linearRamp(frame / sampleRate, gains[0], gains[1], 0, duration);
+ var d = linearRamp(frame / sampleRate, detunes[0], detunes[1], 0, duration);
+
+ // Compute actual frequency parameter
+ f = f * Math.pow(2, d / 1200);
+
+ // Compute filter coefficients
+ var coef = filterTypeFunction(f / (sampleRate / 2), q, g);
+ b0[k] = coef.b0;
+ b1[k] = coef.b1;
+ b2[k] = coef.b2;
+ a1[k] = coef.a1;
+ a2[k] = coef.a2;
+ ++k;
+ }
+
+ return {b0: b0, b1: b1, b2: b2, a1: a1, a2: a2};
+ }
+
+ // Apply the given time-varying biquad filter to the given signal, |signal|. |coef| should be
+ // the time-varying coefficients of the filter, as returned by |generateFilterCoefficients|.
+ function timeVaryingFilter(signal, coef) {
+ var length = signal.length;
+ // Use double precision for the internal computations.
+ var y = new Float64Array(length);
+
+ // Prime the pump. (Assumes the signal has length >= 2!)
+ y[0] = coef.b0[0] * signal[0];
+ y[1] = coef.b0[1] * signal[1] + coef.b1[1] * signal[0] - coef.a1[1] * y[0];
+
+ for (var n = 2; n < length; ++n) {
+ y[n] = coef.b0[n] * signal[n] + coef.b1[n] * signal[n-1] + coef.b2[n] * signal[n-2];
+ y[n] -= coef.a1[n] * y[n-1] + coef.a2[n] * y[n-2];
+ }
+
+ // But convert the result to single precision for comparison.
+ return y.map(Math.fround);
+ }
+
+ // Configure the audio graph using |context|. Returns the biquad filter node and the
+ // AudioBuffer used for the source.
+ function configureGraph(context, toneFrequency) {
+ // The source is just a simple sine wave.
+ var src = context.createBufferSource();
+ var b = context.createBuffer(1, renderDuration * sampleRate, sampleRate);
+ var data = b.getChannelData(0);
+ var omega = 2 * Math.PI * toneFrequency / sampleRate;
+ for (var k = 0; k < data.length; ++k) {
+ data[k] = Math.sin(omega * k);
+ }
+ src.buffer = b;
+ var f = context.createBiquadFilter();
+ src.connect(f);
+ f.connect(context.destination);
+
+ src.start();
+
+ return {filter: f, source: b};
+ }
+
+ function createFilterVerifier(filterCreator, threshold, parameters, input, message) {
+ return function (resultBuffer) {
+ var actual = resultBuffer.getChannelData(0);
+ var coefs = generateFilterCoefficients(filterCreator, parameters, renderDuration);
+
+ reference = timeVaryingFilter(input, coefs);
+
+ compareChannels(actual, reference);
+ };
+ }
+
+ var testPromises = [];
+
+ // Automate just the frequency parameter. A bandpass filter is used where the center
+ // frequency is swept across the source (which is a simple tone).
+ testPromises.push(function () {
+ var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+ // Center frequency of bandpass filter and also the frequency of the test tone.
+ var centerFreq = 10*440;
+
+ // Sweep the frequency +/- 9*440 Hz from the center. This should cause the output to low at
+ // the beginning and end of the test where the done is outside the pass band of the filter,
+ // but high in the center where the tone is near the center of the pass band.
+ var parameters = {
+ freq: [centerFreq - 9*440, centerFreq + 9*440]
+ }
+ var graph = configureGraph(context, centerFreq);
+ var f = graph.filter;
+ var b = graph.source;
+
+ f.type = "bandpass";
+ f.frequency.setValueAtTime(parameters.freq[0], 0);
+ f.frequency.linearRampToValueAtTime(parameters.freq[1], renderDuration);
+
+ return context.startRendering()
+ .then(createFilterVerifier(createBandpassFilter, 5e-5, parameters, b.getChannelData(0),
+ "Output of bandpass filter with frequency automation"));
+ }());
+
+ // Automate just the Q parameter. A bandpass filter is used where the Q of the filter is
+ // swept.
+ testPromises.push(function() {
+ var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+ // The frequency of the test tone.
+ var centerFreq = 440;
+
+ // Sweep the Q paramter between 1 and 200. This will cause the output of the filter to pass
+ // most of the tone at the beginning to passing less of the tone at the end. This is
+ // because we set center frequency of the bandpass filter to be slightly off from the actual
+ // tone.
+ var parameters = {
+ Q: [1, 200],
+ // Center frequency of the bandpass filter is just 25 Hz above the tone frequency.
+ freq: [centerFreq + 25, centerFreq + 25]
+ };
+ var graph = configureGraph(context, centerFreq);
+ var f = graph.filter;
+ var b = graph.source;
+
+ f.type = "bandpass";
+ f.frequency.value = parameters.freq[0];
+ f.Q.setValueAtTime(parameters.Q[0], 0);
+ f.Q.linearRampToValueAtTime(parameters.Q[1], renderDuration);
+
+ return context.startRendering()
+ .then(createFilterVerifier(createBandpassFilter, 1.4e-6, parameters, b.getChannelData(0),
+ "Output of bandpass filter with Q automation"));
+ }());
+
+ // Automate just the gain of the lowshelf filter. A test tone will be in the lowshelf part of
+ // the filter. The output will vary as the gain of the lowshelf is changed.
+ testPromises.push(function() {
+ var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+ // Frequency of the test tone.
+ var centerFreq = 440;
+
+ // Set the cutoff frequency of the lowshelf to be significantly higher than the test tone.
+ // Sweep the gain from 20 dB to -20 dB. (We go from 20 to -20 to easily verify that the
+ // filter didn't go unstable.)
+ var parameters = {
+ freq: [3500, 3500],
+ gain: [20, -20]
+ }
+ var graph = configureGraph(context, centerFreq);
+ var f = graph.filter;
+ var b = graph.source;
+
+ f.type = "lowshelf";
+ f.frequency.value = parameters.freq[0];
+ f.gain.setValueAtTime(parameters.gain[0], 0);
+ f.gain.linearRampToValueAtTime(parameters.gain[1], renderDuration);
+
+ context.startRendering()
+ .then(createFilterVerifier(createLowShelfFilter, 8e-6, parameters, b.getChannelData(0),
+ "Output of lowshelf filter with gain automation"));
+ }());
+
+ // Automate just the detune parameter. Basically the same test as for the frequncy parameter
+ // but we just use the detune parameter to modulate the frequency parameter.
+ testPromises.push(function() {
+ var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+ var centerFreq = 10*440;
+ var parameters = {
+ freq: [centerFreq, centerFreq],
+ detune: [-10*1200, 10*1200]
+ };
+ var graph = configureGraph(context, centerFreq);
+ var f = graph.filter;
+ var b = graph.source;
+
+ f.type = "bandpass";
+ f.frequency.value = parameters.freq[0];
+ f.detune.setValueAtTime(parameters.detune[0], 0);
+ f.detune.linearRampToValueAtTime(parameters.detune[1], renderDuration);
+
+ context.startRendering()
+ .then(createFilterVerifier(createBandpassFilter, 5e-6, parameters, b.getChannelData(0),
+ "Output of bandpass filter with detune automation"));
+ }());
+
+ // Automate all of the filter parameters at once. This is a basic check that everything is
+ // working. A peaking filter is used because it uses all of the parameters.
+ testPromises.push(function() {
+ var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+ var graph = configureGraph(context, 10*440);
+ var f = graph.filter;
+ var b = graph.source;
+
+ // Sweep all of the filter parameters. These are pretty much arbitrary.
+ var parameters = {
+ freq: [10000, 100],
+ Q: [f.Q.value, .0001],
+ gain: [f.gain.value, 20],
+ detune: [2400, -2400]
+ };
+
+ f.type = "peaking";
+ // Set starting points for all parameters of the filter. Start at 10 kHz for the center
+ // frequency, and the defaults for Q and gain.
+ f.frequency.setValueAtTime(parameters.freq[0], 0);
+ f.Q.setValueAtTime(parameters.Q[0], 0);
+ f.gain.setValueAtTime(parameters.gain[0], 0);
+ f.detune.setValueAtTime(parameters.detune[0], 0);
+
+ // Linear ramp each parameter
+ f.frequency.linearRampToValueAtTime(parameters.freq[1], renderDuration);
+ f.Q.linearRampToValueAtTime(parameters.Q[1], renderDuration);
+ f.gain.linearRampToValueAtTime(parameters.gain[1], renderDuration);
+ f.detune.linearRampToValueAtTime(parameters.detune[1], renderDuration);
+
+ context.startRendering()
+ .then(createFilterVerifier(createPeakingFilter, 3.3e-4, parameters, b.getChannelData(0),
+ "Output of peaking filter with automation of all parameters"));
+ }());
+
+ // Test that modulation of the frequency parameter of the filter works. A sinusoid of 440 Hz
+ // is the test signal that is applied to a bandpass biquad filter. The frequency parameter of
+ // the filter is modulated by a sinusoid at 103 Hz, and the frequency modulation varies from
+ // 116 to 412 Hz. (This test was taken from the description in
+ // https://github.com/WebAudio/web-audio-api/issues/509#issuecomment-94731355)
+ testPromises.push(function() {
+ var context = new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
+
+ // Create a graph with the sinusoidal source at 440 Hz as the input to a biquad filter.
+ var graph = configureGraph(context, 440);
+ var f = graph.filter;
+ var b = graph.source;
+
+ f.type = "bandpass";
+ f.Q.value = 5;
+ f.frequency.value = 264;
+
+ // Create the modulation source, a sinusoid with frequency 103 Hz and amplitude 148. (The
+ // amplitude of 148 is added to the filter's frequency value of 264 to produce a sinusoidal
+ // modulation of the frequency parameter from 116 to 412 Hz.)
+ var mod = context.createBufferSource();
+ var mbuffer = context.createBuffer(1, renderDuration * sampleRate, sampleRate);
+ var d = mbuffer.getChannelData(0);
+ var omega = 2 * Math.PI * 103 / sampleRate;
+ for (var k = 0; k < d.length; ++k) {
+ d[k] = 148 * Math.sin(omega * k);
+ }
+ mod.buffer = mbuffer;
+
+ mod.connect(f.frequency);
+
+ mod.start();
+ return context.startRendering()
+ .then(function (resultBuffer) {
+ var actual = resultBuffer.getChannelData(0);
+ // Compute the filter coefficients using the mod sine wave
+
+ var endFrame = Math.ceil(renderDuration * sampleRate);
+ var nCoef = endFrame;
+ var b0 = new Float64Array(nCoef);
+ var b1 = new Float64Array(nCoef);
+ var b2 = new Float64Array(nCoef);
+ var a1 = new Float64Array(nCoef);
+ var a2 = new Float64Array(nCoef);
+
+ // Generate the filter coefficients when the frequency varies from 116 to 248 Hz using
+ // the 103 Hz sinusoid.
+ for (var k = 0; k < nCoef; ++k) {
+ var freq = f.frequency.value + d[k];
+ var c = createBandpassFilter(freq / (sampleRate / 2), f.Q.value, f.gain.value);
+ b0[k] = c.b0;
+ b1[k] = c.b1;
+ b2[k] = c.b2;
+ a1[k] = c.a1;
+ a2[k] = c.a2;
+ }
+ reference = timeVaryingFilter(b.getChannelData(0),
+ {b0: b0, b1: b1, b2: b2, a1: a1, a2: a2});
+
+ compareChannels(actual, reference);
+ });
+ }());
+
+ // Wait for all tests
+ Promise.all(testPromises).then(function () {
+ SimpleTest.finish();
+ }, function () {
+ SimpleTest.finish();
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeBandPass.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeBandPass.html
new file mode 100644
index 000000000..a3a1484f6
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeBandPass.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode Band Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ // The filters we want to test.
+ var filterParameters = [{cutoff : 0, q : 0, gain : 1 },
+ {cutoff : 1, q : 0, gain : 1 },
+ {cutoff : 0.5, q : 0, gain : 1 },
+ {cutoff : 0.25, q : 1, gain : 1 },
+ ];
+
+ createTestAndRun(context, "bandpass", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeGetFrequencyResponse.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeGetFrequencyResponse.html
new file mode 100644
index 000000000..1576db1e8
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeGetFrequencyResponse.html
@@ -0,0 +1,261 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode All Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+// Test the frequency response of a biquad filter. We compute the frequency response for a simple
+// peaking biquad filter and compare it with the expected frequency response. The actual filter
+// used doesn't matter since we're testing getFrequencyResponse and not the actual filter output.
+// The filters are extensively tested in other biquad tests.
+
+var context;
+
+// The biquad filter node.
+var filter;
+
+// The magnitude response of the biquad filter.
+var magResponse;
+
+// The phase response of the biquad filter.
+var phaseResponse;
+
+// Number of frequency samples to take.
+var numberOfFrequencies = 1000;
+
+// The filter parameters.
+var filterCutoff = 1000; // Hz.
+var filterQ = 1;
+var filterGain = 5; // Decibels.
+
+// The maximum allowed error in the magnitude response.
+var maxAllowedMagError = 5.7e-7;
+
+// The maximum allowed error in the phase response.
+var maxAllowedPhaseError = 4.7e-8;
+
+// The magnitudes and phases of the reference frequency response.
+var magResponse;
+var phaseResponse;
+
+// The magnitudes and phases of the reference frequency response.
+var expectedMagnitudes;
+var expectedPhases;
+
+// Convert frequency in Hz to a normalized frequency between 0 to 1 with 1 corresponding to the
+// Nyquist frequency.
+function normalizedFrequency(freqHz, sampleRate)
+{
+ var nyquist = sampleRate / 2;
+ return freqHz / nyquist;
+}
+
+// Get the filter response at a (normalized) frequency |f| for the filter with coefficients |coef|.
+function getResponseAt(coef, f)
+{
+ var b0 = coef.b0;
+ var b1 = coef.b1;
+ var b2 = coef.b2;
+ var a1 = coef.a1;
+ var a2 = coef.a2;
+
+ // H(z) = (b0 + b1 / z + b2 / z^2) / (1 + a1 / z + a2 / z^2)
+ //
+ // Compute H(exp(i * pi * f)). No native complex numbers in javascript, so break H(exp(i * pi * // f))
+ // in to the real and imaginary parts of the numerator and denominator. Let omega = pi * f.
+ // Then the numerator is
+ //
+ // b0 + b1 * cos(omega) + b2 * cos(2 * omega) - i * (b1 * sin(omega) + b2 * sin(2 * omega))
+ //
+ // and the denominator is
+ //
+ // 1 + a1 * cos(omega) + a2 * cos(2 * omega) - i * (a1 * sin(omega) + a2 * sin(2 * omega))
+ //
+ // Compute the magnitude and phase from the real and imaginary parts.
+
+ var omega = Math.PI * f;
+ var numeratorReal = b0 + b1 * Math.cos(omega) + b2 * Math.cos(2 * omega);
+ var numeratorImag = -(b1 * Math.sin(omega) + b2 * Math.sin(2 * omega));
+ var denominatorReal = 1 + a1 * Math.cos(omega) + a2 * Math.cos(2 * omega);
+ var denominatorImag = -(a1 * Math.sin(omega) + a2 * Math.sin(2 * omega));
+
+ var magnitude = Math.sqrt((numeratorReal * numeratorReal + numeratorImag * numeratorImag)
+ / (denominatorReal * denominatorReal + denominatorImag * denominatorImag));
+ var phase = Math.atan2(numeratorImag, numeratorReal) - Math.atan2(denominatorImag, denominatorReal);
+
+ if (phase >= Math.PI) {
+ phase -= 2 * Math.PI;
+ } else if (phase <= -Math.PI) {
+ phase += 2 * Math.PI;
+ }
+
+ return {magnitude : magnitude, phase : phase};
+}
+
+// Compute the reference frequency response for the biquad filter |filter| at the frequency samples
+// given by |frequencies|.
+function frequencyResponseReference(filter, frequencies)
+{
+ var sampleRate = filter.context.sampleRate;
+ var normalizedFreq = normalizedFrequency(filter.frequency.value, sampleRate);
+ var filterCoefficients = createFilter(filter.type, normalizedFreq, filter.Q.value, filter.gain.value);
+
+ var magnitudes = [];
+ var phases = [];
+
+ for (var k = 0; k < frequencies.length; ++k) {
+ var response = getResponseAt(filterCoefficients, normalizedFrequency(frequencies[k], sampleRate));
+ magnitudes.push(response.magnitude);
+ phases.push(response.phase);
+ }
+
+ return {magnitudes : magnitudes, phases : phases};
+}
+
+// Compute a set of linearly spaced frequencies.
+function createFrequencies(nFrequencies, sampleRate)
+{
+ var frequencies = new Float32Array(nFrequencies);
+ var nyquist = sampleRate / 2;
+ var freqDelta = nyquist / nFrequencies;
+
+ for (var k = 0; k < nFrequencies; ++k) {
+ frequencies[k] = k * freqDelta;
+ }
+
+ return frequencies;
+}
+
+function linearToDecibels(x)
+{
+ if (x) {
+ return 20 * Math.log(x) / Math.LN10;
+ } else {
+ return -1000;
+ }
+}
+
+// Look through the array and find any NaN or infinity. Returns the index of the first occurence or
+// -1 if none.
+function findBadNumber(signal)
+{
+ for (var k = 0; k < signal.length; ++k) {
+ if (!isValidNumber(signal[k])) {
+ return k;
+ }
+ }
+ return -1;
+}
+
+// Compute absolute value of the difference between phase angles, taking into account the wrapping
+// of phases.
+function absolutePhaseDifference(x, y)
+{
+ var diff = Math.abs(x - y);
+
+ if (diff > Math.PI) {
+ diff = 2 * Math.PI - diff;
+ }
+ return diff;
+}
+
+// Compare the frequency response with our expected response.
+function compareResponses(filter, frequencies, magResponse, phaseResponse)
+{
+ var expectedResponse = frequencyResponseReference(filter, frequencies);
+
+ expectedMagnitudes = expectedResponse.magnitudes;
+ expectedPhases = expectedResponse.phases;
+
+ var n = magResponse.length;
+ var success = true;
+ var badResponse = false;
+
+ var maxMagError = -1;
+ var maxMagErrorIndex = -1;
+
+ var k;
+ var hasBadNumber;
+
+ hasBadNumber = findBadNumber(magResponse);
+ ok (hasBadNumber < 0, "Magnitude response has NaN or infinity at " + hasBadNumber);
+
+ hasBadNumber = findBadNumber(phaseResponse);
+ ok (hasBadNumber < 0, "Phase response has NaN or infinity at " + hasBadNumber);
+
+ // These aren't testing the implementation itself. Instead, these are sanity checks on the
+ // reference. Failure here does not imply an error in the implementation.
+ hasBadNumber = findBadNumber(expectedMagnitudes);
+ ok (hasBadNumber < 0, "Expected magnitude response has NaN or infinity at " + hasBadNumber);
+
+ hasBadNumber = findBadNumber(expectedPhases);
+ ok (hasBadNumber < 0, "Expected phase response has NaN or infinity at " + hasBadNumber);
+
+ for (k = 0; k < n; ++k) {
+ var error = Math.abs(linearToDecibels(magResponse[k]) - linearToDecibels(expectedMagnitudes[k]));
+ if (error > maxMagError) {
+ maxMagError = error;
+ maxMagErrorIndex = k;
+ }
+ }
+
+ var message = "Magnitude error (" + maxMagError + " dB)";
+ message += " exceeded threshold at " + frequencies[maxMagErrorIndex];
+ message += " Hz. Actual: " + linearToDecibels(magResponse[maxMagErrorIndex]);
+ message += " dB, expected: " + linearToDecibels(expectedMagnitudes[maxMagErrorIndex]) + " dB.";
+ ok(maxMagError < maxAllowedMagError, message);
+
+ var maxPhaseError = -1;
+ var maxPhaseErrorIndex = -1;
+
+ for (k = 0; k < n; ++k) {
+ var error = absolutePhaseDifference(phaseResponse[k], expectedPhases[k]);
+ if (error > maxPhaseError) {
+ maxPhaseError = error;
+ maxPhaseErrorIndex = k;
+ }
+ }
+
+ message = "Phase error (radians) (" + maxPhaseError;
+ message += ") exceeded threshold at " + frequencies[maxPhaseErrorIndex];
+ message += " Hz. Actual: " + phaseResponse[maxPhaseErrorIndex];
+ message += " expected: " + expectedPhases[maxPhaseErrorIndex];
+
+ ok(maxPhaseError < maxAllowedPhaseError, message);
+}
+
+context = new AudioContext();
+
+filter = context.createBiquadFilter();
+
+// Arbitrarily test a peaking filter, but any kind of filter can be tested.
+filter.type = "peaking";
+filter.frequency.value = filterCutoff;
+filter.Q.value = filterQ;
+filter.gain.value = filterGain;
+
+var frequencies = createFrequencies(numberOfFrequencies, context.sampleRate);
+magResponse = new Float32Array(numberOfFrequencies);
+phaseResponse = new Float32Array(numberOfFrequencies);
+
+filter.getFrequencyResponse(frequencies, magResponse, phaseResponse);
+compareResponses(filter, frequencies, magResponse, phaseResponse);
+
+SimpleTest.finish();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeHighPass.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeHighPass.html
new file mode 100644
index 000000000..cb9aa274c
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeHighPass.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode High Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ // The filters we want to test.
+ var filterParameters = [{cutoff : 0, q : 1, gain : 1 },
+ {cutoff : 1, q : 1, gain : 1 },
+ {cutoff : 0.25, q : 1, gain : 1 },
+ ];
+
+ createTestAndRun(context, "highpass", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeHighShelf.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeHighShelf.html
new file mode 100644
index 000000000..3581459b0
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeHighShelf.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode High Shelf Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ // The filters we want to test.
+ var filterParameters = [{cutoff : 0, q : 10, gain : 10 },
+ {cutoff : 1, q : 10, gain : 10 },
+ {cutoff : 0.25, q : 10, gain : 10 },
+ ];
+
+ createTestAndRun(context, "highshelf", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeLowPass.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeLowPass.html
new file mode 100644
index 000000000..b0c12558f
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeLowPass.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode Low Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ // The filters we want to test.
+ var filterParameters = [{cutoff : 0, q : 1, gain : 1 },
+ {cutoff : 1, q : 1, gain : 1 },
+ {cutoff : 0.25, q : 1, gain : 1 },
+ {cutoff : 0.25, q : 1, gain : 1, detune : 100 },
+ {cutoff : 0.01, q : 1, gain : 1, detune : -200 },
+ ];
+ createTestAndRun(context, "lowpass", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeLowShelf.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeLowShelf.html
new file mode 100644
index 000000000..3c83bfaa3
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeLowShelf.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode Low Shelf Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ // The filters we want to test.
+ var filterParameters = [{cutoff : 0, q : 10, gain : 10 },
+ {cutoff : 1, q : 10, gain : 10 },
+ {cutoff : 0.25, q : 10, gain : 10 },
+ ];
+
+ createTestAndRun(context, "lowshelf", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeNotch.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeNotch.html
new file mode 100644
index 000000000..551410c66
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeNotch.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode Notch Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ var filterParameters = [{cutoff : 0, q : 10, gain : 1 },
+ {cutoff : 1, q : 10, gain : 1 },
+ {cutoff : .5, q : 0, gain : 1 },
+ {cutoff : 0.25, q : 10, gain : 1 },
+ ];
+
+ createTestAndRun(context, "notch", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodePeaking.html b/dom/media/webaudio/test/blink/test_biquadFilterNodePeaking.html
new file mode 100644
index 000000000..33fcc225a
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodePeaking.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode Low Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ // The filters we want to test.
+ var filterParameters = [{cutoff : 0, q : 10, gain : 10 },
+ {cutoff : 1, q : 10, gain : 10 },
+ {cutoff : .5, q : 0, gain : 10 },
+ {cutoff : 0.25, q : 10, gain : 10 },
+ ];
+
+ createTestAndRun(context, "peaking", filterParameters);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_biquadFilterNodeTail.html b/dom/media/webaudio/test/blink/test_biquadFilterNodeTail.html
new file mode 100644
index 000000000..fd02e734f
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_biquadFilterNodeTail.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode All Pass Filter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="audio-testing.js"></script>
+<script src="biquad-filters.js"></script>
+<script src="biquad-testing.js"></script>
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ // A high sample rate shows the issue more clearly.
+ var sampleRate = 192000;
+ // Some short duration because we don't need to run the test for very long.
+ var testDurationSec = 0.5;
+ var testDurationFrames = testDurationSec * sampleRate;
+
+ // Amplitude experimentally determined to give a biquad output close to 1. (No attempt was
+ // made to produce exactly 1; it's not needed.)
+ var sourceAmplitude = 100;
+
+ // The output of the biquad filter should not change by more than this much between output
+ // samples. Threshold was determined experimentally.
+ var glitchThreshold = 0.01292;
+
+ // Test that a Biquad filter doesn't have it's output terminated because the input has gone
+ // away. Generally, when a source node is finished, it disconnects itself from any downstream
+ // nodes. This is the correct behavior. Nodes that have no inputs (disconnected) are
+ // generally assumed to output zeroes. This is also desired behavior. However, biquad
+ // filters have memory so they should not suddenly output zeroes when the input is
+ // disconnected. This test checks to see if the output doesn't suddenly change to zero.
+ var context = new OfflineAudioContext(1, testDurationFrames, sampleRate);
+
+ // Create an impulse source.
+ var buffer = context.createBuffer(1, 1, context.sampleRate);
+ buffer.getChannelData(0)[0] = sourceAmplitude;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ // Create the biquad filter. It doesn't really matter what kind, so the default filter type
+ // and parameters is fine. Connect the source to it.
+ var biquad = context.createBiquadFilter();
+ source.connect(biquad);
+ biquad.connect(context.destination);
+
+ source.start();
+
+ context.startRendering().then(function(result) {
+ // There should be no large discontinuities in the output
+ var buffer = result.getChannelData(0);
+ var maxGlitchIndex = 0;
+ var maxGlitchValue = 0.0;
+ for (var i = 1; i < buffer.length; i++) {
+ var diff = Math.abs(buffer[i-1] - buffer[i]);
+ if (diff >= glitchThreshold) {
+ if (diff > maxGlitchValue) {
+ maxGlitchIndex = i;
+ maxGlitchValue = diff;
+ }
+ }
+ }
+ ok(maxGlitchIndex == 0, 'glitches detected in biquad output: maximum glitch at ' + maxGlitchIndex + ' with diff of ' + maxGlitchValue);
+ SimpleTest.finish();
+ })
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_iirFilterNode.html b/dom/media/webaudio/test/blink/test_iirFilterNode.html
new file mode 100644
index 000000000..47f936761
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_iirFilterNode.html
@@ -0,0 +1,467 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test IIRFilterNode GetFrequencyResponse</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <script type="text/javascript" src="biquad-filters.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ var sampleRate = 48000;
+ var testDurationSec = 1;
+ var testFrames = testDurationSec * sampleRate;
+
+ var testPromises = []
+ testPromises.push(function () {
+ // Test that the feedback coefficients are normalized. Do this be creating two
+ // IIRFilterNodes. One has normalized coefficients, and one doesn't. Compute the
+ // difference and make sure they're the same.
+ var context = new OfflineAudioContext(2, testFrames, sampleRate);
+
+ // Use a simple impulse as the source.
+ var buffer = context.createBuffer(1, 1, sampleRate);
+ buffer.getChannelData(0)[0] = 1;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ // Gain node for computing the difference between the filters.
+ var gain = context.createGain();
+ gain.gain.value = -1;
+
+ // The IIR filters. Use a common feedforward array.
+ var ff = [1];
+
+ var fb1 = [1, .9];
+
+ var fb2 = new Float64Array(2);
+ // Scale the feedback coefficients by an arbitrary factor.
+ var coefScaleFactor = 2;
+ for (var k = 0; k < fb2.length; ++k) {
+ fb2[k] = coefScaleFactor * fb1[k];
+ }
+
+ var iir1 = context.createIIRFilter(ff, fb1);
+ var iir2 = context.createIIRFilter(ff, fb2);
+
+ // Create the graph. The output of iir1 (normalized coefficients) is channel 0, and the
+ // output of iir2 (unnormalized coefficients), with appropriate scaling, is channel 1.
+ var merger = context.createChannelMerger(2);
+ source.connect(iir1);
+ source.connect(iir2);
+ iir1.connect(merger, 0, 0);
+ iir2.connect(gain);
+
+ // The gain for the gain node should be set to compensate for the scaling of the
+ // coefficients. Since iir2 has scaled the coefficients by coefScaleFactor, the output is
+ // reduced by the same factor, so adjust the gain to scale the output of iir2 back up.
+ gain.gain.value = coefScaleFactor;
+ gain.connect(merger, 0, 1);
+
+ merger.connect(context.destination);
+
+ source.start();
+
+ // Rock and roll!
+
+ return context.startRendering().then(function (result) {
+ // Find the max amplitude of the result, which should be near zero.
+ var iir1Data = result.getChannelData(0);
+ var iir2Data = result.getChannelData(1);
+
+ // Threshold isn't exactly zero because the arithmetic is done differently between the
+ // IIRFilterNode and the BiquadFilterNode.
+ compareChannels(iir1Data, iir2Data);
+ });
+ }());
+
+ testPromises.push(function () {
+ // Create a simple 1-zero filter and compare with the expected output.
+ var context = new OfflineAudioContext(1, testFrames, sampleRate);
+
+ // Use a simple impulse as the source
+ var buffer = context.createBuffer(1, 1, sampleRate);
+ buffer.getChannelData(0)[0] = 1;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ // The filter is y(n) = 0.5*(x(n) + x(n-1)), a simple 2-point moving average. This is
+ // rather arbitrary; keep it simple.
+
+ var iir = context.createIIRFilter([0.5, 0.5], [1]);
+
+ // Create the graph
+ source.connect(iir);
+ iir.connect(context.destination);
+
+ // Rock and roll!
+ source.start();
+
+ return context.startRendering().then(function (result) {
+ var actual = result.getChannelData(0);
+ var expected = new Float64Array(testFrames);
+ // The filter is a simple 2-point moving average of an impulse, so the first two values
+ // are non-zero and the rest are zero.
+ expected[0] = 0.5;
+ expected[1] = 0.5;
+ compareChannels(actual, expected);
+ });
+ }());
+
+ testPromises.push(function () {
+ // Create a simple 1-pole filter and compare with the expected output.
+
+ // The filter is y(n) + c*y(n-1)= x(n). The analytical response is (-c)^n, so choose a
+ // suitable number of frames to run the test for where the output isn't flushed to zero.
+ var c = 0.9;
+ var eps = 1e-20;
+ var duration = Math.floor(Math.log(eps) / Math.log(Math.abs(c)));
+ var context = new OfflineAudioContext(1, duration, sampleRate);
+
+ // Use a simple impulse as the source
+ var buffer = context.createBuffer(1, 1, sampleRate);
+ buffer.getChannelData(0)[0] = 1;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ var iir = context.createIIRFilter([1], [1, c]);
+
+ // Create the graph
+ source.connect(iir);
+ iir.connect(context.destination);
+
+ // Rock and roll!
+ source.start();
+
+ return context.startRendering().then(function (result) {
+ var actual = result.getChannelData(0);
+ var expected = new Float64Array(actual.length);
+
+ // The filter is a simple 1-pole filter: y(n) = -c*y(n-k)+x(n), with an impulse as the
+ // input.
+ expected[0] = 1;
+ for (k = 1; k < testFrames; ++k) {
+ expected[k] = -c * expected[k-1];
+ }
+
+ compareChannels(actual, expected);
+ });
+ }());
+
+ // This function creates an IIRFilterNode equivalent to the specified
+ // BiquadFilterNode and compares the outputs. The
+ // outputs from the two filters should be virtually identical.
+ function testWithBiquadFilter(filterType) {
+ var context = new OfflineAudioContext(2, testFrames, sampleRate);
+
+ // Use a constant (step function) as the source
+ var buffer = context.createBuffer(1, testFrames, context.sampleRate);
+ for (var i = 0; i < testFrames; ++i) {
+ buffer.getChannelData(0)[i] = 1;
+ }
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ // Create the biquad. Choose some rather arbitrary values for Q and gain for the biquad
+ // so that the shelf filters aren't identical.
+ var biquad = context.createBiquadFilter();
+ biquad.type = filterType;
+ biquad.Q.value = 10;
+ biquad.gain.value = 10;
+
+ // Create the equivalent IIR Filter node by computing the coefficients of the given biquad
+ // filter type.
+ var nyquist = sampleRate / 2;
+ var coef = createFilter(filterType,
+ biquad.frequency.value / nyquist,
+ biquad.Q.value,
+ biquad.gain.value);
+
+ var iir = context.createIIRFilter([coef.b0, coef.b1, coef.b2], [1, coef.a1, coef.a2]);
+
+ var merger = context.createChannelMerger(2);
+ // Create the graph
+ source.connect(biquad);
+ source.connect(iir);
+
+ biquad.connect(merger, 0, 0);
+ iir.connect(merger, 0, 1);
+
+ merger.connect(context.destination);
+
+ // Rock and roll!
+ source.start();
+
+ return context.startRendering().then(function (result) {
+ // Find the max amplitude of the result, which should be near zero.
+ var expected = result.getChannelData(0);
+ var actual = result.getChannelData(1);
+ compareChannels(actual, expected);
+ });
+ }
+
+ biquadFilterTypes = ["lowpass", "highpass", "bandpass", "notch",
+ "allpass", "lowshelf", "highshelf", "peaking"];
+
+ // Create a set of tasks based on biquadTestConfigs.
+ for (var i = 0; i < biquadFilterTypes.length; ++i) {
+ testPromises.push(testWithBiquadFilter(biquadFilterTypes[i]));
+ }
+
+ testPromises.push(function () {
+ // Multi-channel test. Create a biquad filter and the equivalent IIR filter. Filter the
+ // same multichannel signal and compare the results.
+ var nChannels = 3;
+ var context = new OfflineAudioContext(nChannels, testFrames, sampleRate);
+
+ // Create a set of oscillators as the multi-channel source.
+ var source = [];
+
+ for (k = 0; k < nChannels; ++k) {
+ source[k] = context.createOscillator();
+ source[k].type = "sawtooth";
+ // The frequency of the oscillator is pretty arbitrary, but each oscillator should have a
+ // different frequency.
+ source[k].frequency.value = 100 + k * 100;
+ }
+
+ var merger = context.createChannelMerger(3);
+
+ var biquad = context.createBiquadFilter();
+
+ // Create the equivalent IIR Filter node.
+ var nyquist = sampleRate / 2;
+ var coef = createFilter(biquad.type,
+ biquad.frequency.value / nyquist,
+ biquad.Q.value,
+ biquad.gain.value);
+ var fb = [1, coef.a1, coef.a2];
+ var ff = [coef.b0, coef.b1, coef.b2];
+
+ var iir = context.createIIRFilter(ff, fb);
+ // Gain node to compute the difference between the IIR and biquad filter.
+ var gain = context.createGain();
+ gain.gain.value = -1;
+
+ // Create the graph.
+ for (k = 0; k < nChannels; ++k)
+ source[k].connect(merger, 0, k);
+
+ merger.connect(biquad);
+ merger.connect(iir);
+ iir.connect(gain);
+ biquad.connect(context.destination);
+ gain.connect(context.destination);
+
+ for (k = 0; k < nChannels; ++k)
+ source[k].start();
+
+ return context.startRendering().then(function (result) {
+ var errorThresholds = [3.7671e-5, 3.0071e-5, 2.6241e-5];
+
+ // Check the difference signal on each channel
+ for (channel = 0; channel < result.numberOfChannels; ++channel) {
+ // Find the max amplitude of the result, which should be near zero.
+ var data = result.getChannelData(channel);
+ var maxError = data.reduce(function(reducedValue, currentValue) {
+ return Math.max(reducedValue, Math.abs(currentValue));
+ });
+
+ ok(maxError <= errorThresholds[channel], "Max difference between IIR and Biquad on channel " + channel);
+ }
+ });
+ }());
+
+ testPromises.push(function () {
+ // Apply an IIRFilter to the given input signal.
+ //
+ // IIR filter in the time domain is
+ //
+ // y[n] = sum(ff[k]*x[n-k], k, 0, M) - sum(fb[k]*y[n-k], k, 1, N)
+ //
+ function iirFilter(input, feedforward, feedback) {
+ // For simplicity, create an x buffer that contains the input, and a y buffer that contains
+ // the output. Both of these buffers have an initial work space to implement the initial
+ // memory of the filter.
+ var workSize = Math.max(feedforward.length, feedback.length);
+ var x = new Float32Array(input.length + workSize);
+
+ // Float64 because we want to match the implementation that uses doubles to minimize
+ // roundoff.
+ var y = new Float64Array(input.length + workSize);
+
+ // Copy the input over.
+ for (var k = 0; k < input.length; ++k)
+ x[k + feedforward.length] = input[k];
+
+ // Run the filter
+ for (var n = 0; n < input.length; ++n) {
+ var index = n + workSize;
+ var yn = 0;
+ for (var k = 0; k < feedforward.length; ++k)
+ yn += feedforward[k] * x[index - k];
+ for (var k = 0; k < feedback.length; ++k)
+ yn -= feedback[k] * y[index - k];
+
+ y[index] = yn;
+ }
+
+ return y.slice(workSize).map(Math.fround);
+ }
+
+ // Cascade the two given biquad filters to create one IIR filter.
+ function cascadeBiquads(f1Coef, f2Coef) {
+ // The biquad filters are:
+ //
+ // f1 = (b10 + b11/z + b12/z^2)/(1 + a11/z + a12/z^2);
+ // f2 = (b20 + b21/z + b22/z^2)/(1 + a21/z + a22/z^2);
+ //
+ // To cascade them, multiply the two transforms together to get a fourth order IIR filter.
+
+ var numProduct = [f1Coef.b0 * f2Coef.b0,
+ f1Coef.b0 * f2Coef.b1 + f1Coef.b1 * f2Coef.b0,
+ f1Coef.b0 * f2Coef.b2 + f1Coef.b1 * f2Coef.b1 + f1Coef.b2 * f2Coef.b0,
+ f1Coef.b1 * f2Coef.b2 + f1Coef.b2 * f2Coef.b1,
+ f1Coef.b2 * f2Coef.b2
+ ];
+
+ var denProduct = [1,
+ f2Coef.a1 + f1Coef.a1,
+ f2Coef.a2 + f1Coef.a1 * f2Coef.a1 + f1Coef.a2,
+ f1Coef.a1 * f2Coef.a2 + f1Coef.a2 * f2Coef.a1,
+ f1Coef.a2 * f2Coef.a2
+ ];
+
+ return {
+ ff: numProduct,
+ fb: denProduct
+ }
+ }
+
+ // Find the magnitude of the root of the quadratic that has the maximum magnitude.
+ //
+ // The quadratic is z^2 + a1 * z + a2 and we want the root z that has the largest magnitude.
+ function largestRootMagnitude(a1, a2) {
+ var discriminant = a1 * a1 - 4 * a2;
+ if (discriminant < 0) {
+ // Complex roots: -a1/2 +/- i*sqrt(-d)/2. Thus the magnitude of each root is the same
+ // and is sqrt(a1^2/4 + |d|/4)
+ var d = Math.sqrt(-discriminant);
+ return Math.hypot(a1 / 2, d / 2);
+ } else {
+ // Real roots
+ var d = Math.sqrt(discriminant);
+ return Math.max(Math.abs((-a1 + d) / 2), Math.abs((-a1 - d) / 2));
+ }
+ }
+
+ // Cascade 2 lowpass biquad filters and compare that with the equivalent 4th order IIR
+ // filter.
+
+ var nyquist = sampleRate / 2;
+ // Compute the coefficients of a lowpass filter.
+
+ // First some preliminary stuff. Compute the coefficients of the biquad. This is used to
+ // figure out how frames to use in the test.
+ var biquadType = "lowpass";
+ var biquadCutoff = 350;
+ var biquadQ = 5;
+ var biquadGain = 1;
+
+ var coef = createFilter(biquadType,
+ biquadCutoff / nyquist,
+ biquadQ,
+ biquadGain);
+
+ // Cascade the biquads together to create an equivalent IIR filter.
+ var cascade = cascadeBiquads(coef, coef);
+
+ // Since we're cascading two identical biquads, the root of denominator of the IIR filter is
+ // repeated, so the root of the denominator with the largest magnitude occurs twice. The
+ // impulse response of the IIR filter will be roughly c*(r*r)^n at time n, where r is the
+ // root of largest magnitude. This approximation gets better as n increases. We can use
+ // this to get a rough idea of when the response has died down to a small value.
+
+ // This is the value we will use to determine how many frames to render. Rendering too many
+ // is a waste of time and also makes it hard to compare the actual result to the expected
+ // because the magnitudes are so small that they could be mostly round-off noise.
+ //
+ // Find magnitude of the root with largest magnitude
+ var rootMagnitude = largestRootMagnitude(coef.a1, coef.a2);
+
+ // Find n such that |r|^(2*n) <= eps. That is, n = log(eps)/(2*log(r)). Somewhat
+ // arbitrarily choose eps = 1e-20;
+ var eps = 1e-20;
+ var framesForTest = Math.floor(Math.log(eps) / (2 * Math.log(rootMagnitude)));
+
+ // We're ready to create the graph for the test. The offline context has two channels:
+ // channel 0 is the expected (cascaded biquad) result and channel 1 is the actual IIR filter
+ // result.
+ var context = new OfflineAudioContext(2, framesForTest, sampleRate);
+
+ // Use a simple impulse with a large (arbitrary) amplitude as the source
+ var amplitude = 1;
+ var buffer = context.createBuffer(1, testFrames, sampleRate);
+ buffer.getChannelData(0)[0] = amplitude;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ // Create the two biquad filters. Doesn't really matter what, but for simplicity we choose
+ // identical lowpass filters with the same parameters.
+ var biquad1 = context.createBiquadFilter();
+ biquad1.type = biquadType;
+ biquad1.frequency.value = biquadCutoff;
+ biquad1.Q.value = biquadQ;
+
+ var biquad2 = context.createBiquadFilter();
+ biquad2.type = biquadType;
+ biquad2.frequency.value = biquadCutoff;
+ biquad2.Q.value = biquadQ;
+
+ var iir = context.createIIRFilter(cascade.ff, cascade.fb);
+
+ // Create the merger to get the signals into multiple channels
+ var merger = context.createChannelMerger(2);
+
+ // Create the graph, filtering the source through two biquads.
+ source.connect(biquad1);
+ biquad1.connect(biquad2);
+ biquad2.connect(merger, 0, 0);
+
+ source.connect(iir);
+ iir.connect(merger, 0, 1);
+
+ merger.connect(context.destination);
+
+ // Now filter the source through the IIR filter.
+ var y = iirFilter(buffer.getChannelData(0), cascade.ff, cascade.fb);
+
+ // Rock and roll!
+ source.start();
+
+ return context.startRendering().then(function(result) {
+ var expected = result.getChannelData(0);
+ var actual = result.getChannelData(1);
+
+ compareChannels(actual, expected);
+
+ });
+ }());
+
+ // Wait for all tests
+ Promise.all(testPromises).then(function () {
+ SimpleTest.finish();
+ }, function () {
+ SimpleTest.finish();
+ });
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/blink/test_iirFilterNodeGetFrequencyResponse.html b/dom/media/webaudio/test/blink/test_iirFilterNodeGetFrequencyResponse.html
new file mode 100644
index 000000000..cb5cf33ed
--- /dev/null
+++ b/dom/media/webaudio/test/blink/test_iirFilterNodeGetFrequencyResponse.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test IIRFilterNode GetFrequencyResponse</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <script type="text/javascript" src="biquad-filters.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ // Modified from WebKit/LayoutTests/webaudio/iirfilter-getFrequencyResponse.html
+ var sampleRate = 48000;
+ var testDurationSec = 0.01;
+
+ // Compute a set of linearly spaced frequencies.
+ function createFrequencies(nFrequencies, sampleRate)
+ {
+ var frequencies = new Float32Array(nFrequencies);
+ var nyquist = sampleRate / 2;
+ var freqDelta = nyquist / nFrequencies;
+
+ for (var k = 0; k < nFrequencies; ++k) {
+ frequencies[k] = k * freqDelta;
+ }
+
+ return frequencies;
+ }
+
+ // Number of frequency samples to take.
+ var numberOfFrequencies = 1000;
+
+ var context = new OfflineAudioContext(1, testDurationSec * sampleRate, sampleRate);
+
+ var frequencies = createFrequencies(numberOfFrequencies, context.sampleRate);
+
+ // 1-Pole IIR Filter
+ var iir = context.createIIRFilter([1], [1, -0.9]);
+
+ var iirMag = new Float32Array(numberOfFrequencies);
+ var iirPhase = new Float32Array(numberOfFrequencies);
+ var trueMag = new Float32Array(numberOfFrequencies);
+ var truePhase = new Float32Array(numberOfFrequencies);
+
+ // The IIR filter is
+ // H(z) = 1/(1 - 0.9*z^(-1)).
+ //
+ // The frequency response is
+ // H(exp(j*w)) = 1/(1 - 0.9*exp(-j*w)).
+ //
+ // Thus, the magnitude is
+ // |H(exp(j*w))| = 1/sqrt(1.81-1.8*cos(w)).
+ //
+ // The phase is
+ // arg(H(exp(j*w)) = atan(0.9*sin(w)/(.9*cos(w)-1))
+
+ var frequencyScale = Math.PI / (sampleRate / 2);
+
+ for (var k = 0; k < frequencies.length; ++k) {
+ var omega = frequencyScale * frequencies[k];
+ trueMag[k] = 1/Math.sqrt(1.81-1.8*Math.cos(omega));
+ truePhase[k] = Math.atan(0.9 * Math.sin(omega) / (0.9 * Math.cos(omega) - 1));
+ }
+
+ iir.getFrequencyResponse(frequencies, iirMag, iirPhase);
+ compareChannels(iirMag, trueMag);
+ compareChannels(iirPhase, truePhase);
+
+ // Compare IIR and Biquad Filter
+ // Create an IIR filter equivalent to the biquad filter. Compute the frequency response for both and verify that they are the same.
+ var biquad = context.createBiquadFilter();
+ var coef = createFilter(biquad.type,
+ biquad.frequency.value / (context.sampleRate / 2),
+ biquad.Q.value,
+ biquad.gain.value);
+
+ var iir = context.createIIRFilter([coef.b0, coef.b1, coef.b2], [1, coef.a1, coef.a2]);
+
+ var biquadMag = new Float32Array(numberOfFrequencies);
+ var biquadPhase = new Float32Array(numberOfFrequencies);
+ var iirMag = new Float32Array(numberOfFrequencies);
+ var iirPhase = new Float32Array(numberOfFrequencies);
+
+ biquad.getFrequencyResponse(frequencies, biquadMag, biquadPhase);
+ iir.getFrequencyResponse(frequencies, iirMag, iirPhase);
+ compareChannels(iirMag, biquadMag);
+ compareChannels(iirPhase, biquadPhase);
+
+ SimpleTest.finish();
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/browser.ini b/dom/media/webaudio/test/browser.ini
new file mode 100644
index 000000000..60ed969f1
--- /dev/null
+++ b/dom/media/webaudio/test/browser.ini
@@ -0,0 +1 @@
+[browser_bug1181073.js] \ No newline at end of file
diff --git a/dom/media/webaudio/test/browser_bug1181073.js b/dom/media/webaudio/test/browser_bug1181073.js
new file mode 100644
index 000000000..6ee48144c
--- /dev/null
+++ b/dom/media/webaudio/test/browser_bug1181073.js
@@ -0,0 +1,40 @@
+add_task(function*() {
+ // Make the min_background_timeout_value very high to avoid problems on slow machines
+ yield new Promise(resolve => SpecialPowers.pushPrefEnv({
+ 'set': [['dom.min_background_timeout_value', 3000]]
+ }, resolve));
+
+ // Make a new tab, and put it in the background
+ yield BrowserTestUtils.withNewTab("about:blank", function*(browser) {
+ yield BrowserTestUtils.withNewTab("about:blank", function*() {
+ let time = yield ContentTask.spawn(browser, null, function () {
+ return new Promise(resolve => {
+ let start = content.performance.now();
+ let id = content.window.setInterval(function() {
+ let end = content.performance.now();
+ content.window.clearInterval(id);
+ resolve(end - start);
+ }, 0);
+ });
+ });
+
+ ok(time > 2000, "Interval is throttled with no webaudio (" + time + " ms)");
+
+ time = yield ContentTask.spawn(browser, null, function () {
+ return new Promise(resolve => {
+ // Create an audio context, and save it on the window so it doesn't get GCed
+ content.window._audioCtx = new content.window.AudioContext();
+
+ let start = content.performance.now();
+ let id = content.window.setInterval(function() {
+ let end = content.performance.now();
+ content.window.clearInterval(id);
+ resolve(end - start);
+ }, 0);
+ });
+ });
+
+ ok(time < 1000, "Interval is not throttled with an audio context present (" + time + " ms)");
+ });
+ });
+});
diff --git a/dom/media/webaudio/test/corsServer.sjs b/dom/media/webaudio/test/corsServer.sjs
new file mode 100644
index 000000000..1804c7862
--- /dev/null
+++ b/dom/media/webaudio/test/corsServer.sjs
@@ -0,0 +1,25 @@
+function handleRequest(request, response)
+{
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("CurWorkD", Components.interfaces.nsILocalFile);
+ var fis = Components.classes['@mozilla.org/network/file-input-stream;1'].
+ createInstance(Components.interfaces.nsIFileInputStream);
+ var bis = Components.classes["@mozilla.org/binaryinputstream;1"].
+ createInstance(Components.interfaces.nsIBinaryInputStream);
+ var paths = "tests/dom/media/webaudio/test/small-shot.ogg";
+ var split = paths.split("/");
+ for(var i = 0; i < split.length; ++i) {
+ file.append(split[i]);
+ }
+ fis.init(file, -1, -1, false);
+ bis.setInputStream(fis);
+ var bytes = bis.readBytes(bis.available());
+ response.setHeader("Content-Type", "video/ogg", false);
+ response.setHeader("Content-Length", ""+ bytes.length, false);
+ response.setHeader("Access-Control-Allow-Origin", "*", false);
+ response.write(bytes, bytes.length);
+ response.processAsync();
+ response.finish();
+ bis.close();
+}
diff --git a/dom/media/webaudio/test/invalid.txt b/dom/media/webaudio/test/invalid.txt
new file mode 100644
index 000000000..c44840faf
--- /dev/null
+++ b/dom/media/webaudio/test/invalid.txt
@@ -0,0 +1 @@
+Surely this is not an audio file!
diff --git a/dom/media/webaudio/test/layouttest-glue.js b/dom/media/webaudio/test/layouttest-glue.js
new file mode 100644
index 000000000..db1aa563b
--- /dev/null
+++ b/dom/media/webaudio/test/layouttest-glue.js
@@ -0,0 +1,19 @@
+// Reimplementation of the LayoutTest API from Blink so we can easily port
+// WebAudio tests to Simpletest, without touching the internals of the test.
+
+function testFailed(msg) {
+ ok(false, msg);
+}
+
+function testPassed(msg) {
+ ok(true, msg);
+}
+
+function finishJSTest() {
+ SimpleTest.finish();
+}
+
+function description(str) {
+ info(str);
+}
+
diff --git a/dom/media/webaudio/test/mochitest.ini b/dom/media/webaudio/test/mochitest.ini
new file mode 100644
index 000000000..4abcce7e3
--- /dev/null
+++ b/dom/media/webaudio/test/mochitest.ini
@@ -0,0 +1,212 @@
+[DEFAULT]
+tags=msg
+tags = webaudio
+subsuite = media
+support-files =
+ audio-expected.wav
+ audio-mono-expected-2.wav
+ audio-mono-expected.wav
+ audio-quad.wav
+ audio.ogv
+ audiovideo.mp4
+ audioBufferSourceNodeDetached_worker.js
+ corsServer.sjs
+ invalid.txt
+ layouttest-glue.js
+ noaudio.webm
+ small-shot-expected.wav
+ small-shot-mono-expected.wav
+ small-shot.ogg
+ small-shot.mp3
+ sweep-300-330-1sec.opus
+ ting-44.1k-1ch.ogg
+ ting-44.1k-2ch.ogg
+ ting-48k-1ch.ogg
+ ting-48k-2ch.ogg
+ ting-44.1k-1ch.wav
+ ting-44.1k-2ch.wav
+ ting-48k-1ch.wav
+ ting-48k-2ch.wav
+ sine-440-10s.opus
+ webaudio.js
+
+[test_analyserNode.html]
+[test_analyserScale.html]
+[test_analyserNodeOutput.html]
+[test_analyserNodePassThrough.html]
+[test_analyserNodeWithGain.html]
+[test_AudioBuffer.html]
+[test_audioBufferSourceNode.html]
+[test_audioBufferSourceNodeEnded.html]
+[test_audioBufferSourceNodeLazyLoopParam.html]
+[test_audioBufferSourceNodeLoop.html]
+[test_audioBufferSourceNodeLoopStartEnd.html]
+[test_audioBufferSourceNodeLoopStartEndSame.html]
+[test_audioBufferSourceNodeDetached.html]
+skip-if = (toolkit == 'android' && debug) || os == 'win' # bug 1127845, bug 1138468
+[test_audioBufferSourceNodeNoStart.html]
+[test_audioBufferSourceNodeNullBuffer.html]
+[test_audioBufferSourceNodeOffset.html]
+skip-if = (toolkit == 'android') || debug #bug 906752
+[test_audioBufferSourceNodePassThrough.html]
+[test_audioBufferSourceNodeRate.html]
+[test_AudioContext.html]
+[test_AudioContext_disabled.html]
+[test_audioContextSuspendResumeClose.html]
+tags=capturestream
+[test_audioDestinationNode.html]
+[test_AudioListener.html]
+[test_AudioNodeDevtoolsAPI.html]
+[test_audioParamChaining.html]
+[test_AudioParamDevtoolsAPI.html]
+[test_audioParamExponentialRamp.html]
+[test_audioParamGain.html]
+[test_audioParamLinearRamp.html]
+[test_audioParamSetCurveAtTime.html]
+[test_audioParamSetCurveAtTimeTwice.html]
+[test_audioParamSetCurveAtTimeZeroDuration.html]
+[test_audioParamSetTargetAtTime.html]
+[test_audioParamSetTargetAtTimeZeroTimeConstant.html]
+[test_audioParamSetValueAtTime.html]
+[test_audioParamTimelineDestinationOffset.html]
+[test_badConnect.html]
+[test_biquadFilterNode.html]
+[test_biquadFilterNodePassThrough.html]
+[test_biquadFilterNodeWithGain.html]
+[test_bug808374.html]
+[test_bug827541.html]
+[test_bug839753.html]
+[test_bug845960.html]
+[test_bug856771.html]
+[test_bug866570.html]
+[test_bug866737.html]
+[test_bug867089.html]
+[test_bug867104.html]
+[test_bug867174.html]
+[test_bug867203.html]
+[test_bug875221.html]
+[test_bug875402.html]
+[test_bug894150.html]
+[test_bug956489.html]
+[test_bug964376.html]
+[test_bug966247.html]
+tags=capturestream
+[test_bug972678.html]
+[test_bug1113634.html]
+[test_bug1118372.html]
+[test_bug1027864.html]
+[test_bug1056032.html]
+skip-if = toolkit == 'android' # bug 1056706
+[test_bug1255618.html]
+[test_bug1267579.html]
+[test_channelMergerNode.html]
+[test_channelMergerNodeWithVolume.html]
+[test_channelSplitterNode.html]
+[test_channelSplitterNodeWithVolume.html]
+skip-if = (android_version == '18' && debug) # bug 1158417
+[test_convolverNode.html]
+[test_convolverNode_mono_mono.html]
+[test_convolverNodeChannelCount.html]
+[test_convolverNodeDelay.html]
+[test_convolverNodeFiniteInfluence.html]
+[test_convolverNodePassThrough.html]
+[test_convolverNodeWithGain.html]
+[test_currentTime.html]
+[test_decodeMultichannel.html]
+[test_decodeAudioDataPromise.html]
+[test_decodeOpusTail.html]
+[test_delayNode.html]
+[test_delayNodeAtMax.html]
+[test_delayNodeChannelChanges.html]
+skip-if = toolkit == 'android' # bug 1056706
+[test_delayNodeCycles.html]
+[test_delayNodePassThrough.html]
+[test_delayNodeSmallMaxDelay.html]
+[test_delayNodeTailIncrease.html]
+[test_delayNodeTailWithDisconnect.html]
+[test_delayNodeTailWithGain.html]
+[test_delayNodeTailWithReconnect.html]
+[test_delayNodeWithGain.html]
+[test_disconnectAll.html]
+[test_disconnectAudioParam.html]
+[test_disconnectAudioParamFromOutput.html]
+[test_disconnectExceptions.html]
+[test_disconnectFromAudioNode.html]
+[test_disconnectFromAudioNodeAndOutput.html]
+[test_disconnectFromAudioNodeAndOutputAndInput.html]
+[test_disconnectFromAudioNodeMultipleConnection.html]
+[test_disconnectFromOutput.html]
+[test_dynamicsCompressorNode.html]
+[test_dynamicsCompressorNodePassThrough.html]
+[test_dynamicsCompressorNodeWithGain.html]
+[test_gainNode.html]
+[test_gainNodeInLoop.html]
+[test_gainNodePassThrough.html]
+[test_iirFilterNodePassThrough.html]
+[test_maxChannelCount.html]
+[test_mediaDecoding.html]
+[test_mediaElementAudioSourceNode.html]
+tags=capturestream
+[test_mediaElementAudioSourceNodeFidelity.html]
+tags=capturestream
+[test_mediaElementAudioSourceNodePassThrough.html]
+tags=capturestream
+skip-if = toolkit == 'android' # bug 1145816
+[test_mediaElementAudioSourceNodeVideo.html]
+tags=capturestream
+[test_mediaElementAudioSourceNodeCrossOrigin.html]
+tags=capturestream
+skip-if = toolkit == 'android' # bug 1145816
+[test_mediaStreamAudioDestinationNode.html]
+[test_mediaStreamAudioSourceNode.html]
+[test_mediaStreamAudioSourceNodeCrossOrigin.html]
+tags=capturestream
+[test_mediaStreamAudioSourceNodeNoGC.html]
+[test_mediaStreamAudioSourceNodePassThrough.html]
+[test_mediaStreamAudioSourceNodeResampling.html]
+tags=capturestream
+[test_mixingRules.html]
+skip-if = toolkit == 'android' # bug 1091965
+[test_mozaudiochannel.html]
+# Android: bug 1061675; OSX 10.6: bug 1097721
+skip-if = (toolkit == 'android') || (os == 'mac' && os_version == '10.6')
+[test_nodeToParamConnection.html]
+[test_OfflineAudioContext.html]
+[test_offlineDestinationChannelCountLess.html]
+[test_offlineDestinationChannelCountMore.html]
+[test_oscillatorNode.html]
+[test_oscillatorNode2.html]
+[test_oscillatorNodeNegativeFrequency.html]
+[test_oscillatorNodePassThrough.html]
+[test_oscillatorNodeStart.html]
+[test_oscillatorTypeChange.html]
+[test_pannerNode.html]
+[test_pannerNode_equalPower.html]
+[test_pannerNodeAbove.html]
+[test_pannerNodeAtZeroDistance.html]
+[test_pannerNodeChannelCount.html]
+[test_pannerNodeHRTFSymmetry.html]
+[test_pannerNodeTail.html]
+[test_pannerNode_maxDistance.html]
+[test_stereoPannerNode.html]
+[test_stereoPannerNodePassThrough.html]
+[test_periodicWave.html]
+[test_periodicWaveDisableNormalization.html]
+[test_periodicWaveBandLimiting.html]
+[test_ScriptProcessorCollected1.html]
+[test_scriptProcessorNode.html]
+[test_scriptProcessorNodeChannelCount.html]
+[test_scriptProcessorNodePassThrough.html]
+[test_scriptProcessorNode_playbackTime1.html]
+[test_scriptProcessorNodeZeroInputOutput.html]
+[test_scriptProcessorNodeNotConnected.html]
+[test_sequentialBufferSourceWithResampling.html]
+[test_singleSourceDest.html]
+[test_stereoPanningWithGain.html]
+[test_waveDecoder.html]
+[test_waveShaper.html]
+[test_waveShaperGain.html]
+[test_waveShaperNoCurve.html]
+[test_waveShaperPassThrough.html]
+[test_waveShaperInvalidLengthCurve.html]
+[test_WebAudioMemoryReporting.html]
diff --git a/dom/media/webaudio/test/noaudio.webm b/dom/media/webaudio/test/noaudio.webm
new file mode 100644
index 000000000..9207017fb
--- /dev/null
+++ b/dom/media/webaudio/test/noaudio.webm
Binary files differ
diff --git a/dom/media/webaudio/test/sine-440-10s.opus b/dom/media/webaudio/test/sine-440-10s.opus
new file mode 100644
index 000000000..eb9102016
--- /dev/null
+++ b/dom/media/webaudio/test/sine-440-10s.opus
Binary files differ
diff --git a/dom/media/webaudio/test/small-shot-expected.wav b/dom/media/webaudio/test/small-shot-expected.wav
new file mode 100644
index 000000000..2faaa8258
--- /dev/null
+++ b/dom/media/webaudio/test/small-shot-expected.wav
Binary files differ
diff --git a/dom/media/webaudio/test/small-shot-mono-expected.wav b/dom/media/webaudio/test/small-shot-mono-expected.wav
new file mode 100644
index 000000000..d4e2647e4
--- /dev/null
+++ b/dom/media/webaudio/test/small-shot-mono-expected.wav
Binary files differ
diff --git a/dom/media/webaudio/test/small-shot.mp3 b/dom/media/webaudio/test/small-shot.mp3
new file mode 100644
index 000000000..f9397a510
--- /dev/null
+++ b/dom/media/webaudio/test/small-shot.mp3
Binary files differ
diff --git a/dom/media/webaudio/test/small-shot.ogg b/dom/media/webaudio/test/small-shot.ogg
new file mode 100644
index 000000000..1a41623f8
--- /dev/null
+++ b/dom/media/webaudio/test/small-shot.ogg
Binary files differ
diff --git a/dom/media/webaudio/test/sweep-300-330-1sec.opus b/dom/media/webaudio/test/sweep-300-330-1sec.opus
new file mode 100644
index 000000000..619d1e084
--- /dev/null
+++ b/dom/media/webaudio/test/sweep-300-330-1sec.opus
Binary files differ
diff --git a/dom/media/webaudio/test/test_AudioBuffer.html b/dom/media/webaudio/test/test_AudioBuffer.html
new file mode 100644
index 000000000..82bfdd420
--- /dev/null
+++ b/dom/media/webaudio/test/test_AudioBuffer.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can create an AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ SpecialPowers.gc(); // Make sure that our channels are accessible after GC
+ ok(buffer, "Buffer was allocated successfully");
+ is(buffer.sampleRate, context.sampleRate, "Correct sample rate");
+ is(buffer.length, 2048, "Correct length");
+ ok(Math.abs(buffer.duration - 2048 / context.sampleRate) < 0.0001, "Correct duration");
+ is(buffer.numberOfChannels, 2, "Correct number of channels");
+ for (var i = 0; i < buffer.numberOfChannels; ++i) {
+ var buf = buffer.getChannelData(i);
+ ok(buf, "Buffer index " + i + " exists");
+ ok(buf instanceof Float32Array, "Result is a typed array");
+ is(buf.length, buffer.length, "Correct length");
+ var foundNonZero = false;
+ for (var j = 0; j < buf.length; ++j) {
+ if (buf[j] != 0) {
+ foundNonZero = true;
+ break;
+ }
+ buf[j] = j;
+ }
+ ok(!foundNonZero, "Buffer " + i + " should be initialized to 0");
+ }
+
+ // Now test copying the channel data out of a normal buffer
+ var copy = new Float32Array(100);
+ buffer.copyFromChannel(copy, 0, 1024);
+ for (var i = 0; i < copy.length; ++i) {
+ is(copy[i], 1024 + i, "Correct sample");
+ }
+
+ // Test copying the channel data out of a playing buffer
+ var srcNode = context.createBufferSource();
+ srcNode.buffer = buffer;
+ srcNode.start(0);
+ copy = new Float32Array(100);
+ buffer.copyFromChannel(copy, 0, 1024);
+ for (var i = 0; i < copy.length; ++i) {
+ is(copy[i], 1024 + i, "Correct sample");
+ }
+
+ // Test copying to the channel data
+ var newData = new Float32Array(200);
+ buffer.copyToChannel(newData, 0, 100);
+ var changedData = buffer.getChannelData(0);
+ for (var i = 0; i < changedData.length; ++i) {
+ if (i < 100 || i >= 300) {
+ is(changedData[i], i, "Untouched sample");
+ } else {
+ is(changedData[i], 0, "Correct sample");
+ }
+ }
+
+ // Now, detach the array buffer
+ var worker = new Worker("audioBufferSourceNodeDetached_worker.js");
+ var data = buffer.getChannelData(0).buffer;
+ worker.postMessage(data, [data]);
+ SpecialPowers.gc();
+
+ expectException(function() {
+ buffer.copyFromChannel(copy, 0, 1024);
+ }, DOMException.INDEX_SIZE_ERR);
+
+ expectException(function() {
+ buffer.copyToChannel(newData, 0, 100);
+ }, DOMException.INDEX_SIZE_ERR);
+
+ expectException(function() {
+ context.createBuffer(2, 2048, 7999);
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ context.createBuffer(2, 2048, 192001);
+ }, DOMException.INDEX_SIZE_ERR);
+ context.createBuffer(2, 2048, 8000); // no exception
+ context.createBuffer(2, 2048, 192000); // no exception
+ context.createBuffer(32, 2048, 48000); // no exception
+ // Null length
+ expectException(function() {
+ context.createBuffer(2, 0, 48000);
+ }, DOMException.INDEX_SIZE_ERR);
+ // Null number of channels
+ expectException(function() {
+ context.createBuffer(0, 2048, 48000);
+ }, DOMException.INDEX_SIZE_ERR);
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_AudioContext.html b/dom/media/webaudio/test/test_AudioContext.html
new file mode 100644
index 000000000..0cab4354e
--- /dev/null
+++ b/dom/media/webaudio/test/test_AudioContext.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can create an AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ac = new AudioContext();
+ ok(ac, "Create a AudioContext object");
+ ok(ac instanceof EventTarget, "AudioContexts must be EventTargets");
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_AudioContext_disabled.html b/dom/media/webaudio/test/test_AudioContext_disabled.html
new file mode 100644
index 000000000..03e0775ed
--- /dev/null
+++ b/dom/media/webaudio/test/test_AudioContext_disabled.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can disable the AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+const webaudio_interfaces = [
+ "AudioContext",
+ "OfflineAudioContext",
+ "AudioContext",
+ "OfflineAudioCompletionEvent",
+ "AudioNode",
+ "AudioDestinationNode",
+ "AudioParam",
+ "GainNode",
+ "DelayNode",
+ "AudioBuffer",
+ "AudioBufferSourceNode",
+ "MediaElementAudioSourceNode",
+ "ScriptProcessorNode",
+ "AudioProcessingEvent",
+ "PannerNode",
+ "AudioListener",
+ "StereoPannerNode",
+ "ConvolverNode",
+ "AnalyserNode",
+ "ChannelSplitterNode",
+ "ChannelMergerNode",
+ "DynamicsCompressorNode",
+ "BiquadFilterNode",
+ "IIRFilterNode",
+ "WaveShaperNode",
+ "OscillatorNode",
+ "PeriodicWave",
+ "MediaStreamAudioSourceNode",
+ "MediaStreamAudioDestinationNode"
+];
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ SpecialPowers.pushPrefEnv({"set": [["dom.webaudio.enabled", false]]}, function() {
+ webaudio_interfaces.forEach((e) => ok(!window[e], e + " must be disabled when the Web Audio API is disabled"));
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_AudioListener.html b/dom/media/webaudio/test/test_AudioListener.html
new file mode 100644
index 000000000..07ad154d7
--- /dev/null
+++ b/dom/media/webaudio/test/test_AudioListener.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioContext.listener and the AudioListener interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ ok("listener" in context, "AudioContext.listener should exist");
+ ok(Math.abs(context.listener.dopplerFactor - 1.0) < 1e-4, "Correct default doppler factor");
+ ok(Math.abs(context.listener.speedOfSound - 343.3) < 1e-4, "Correct default speed of sound value");
+ context.listener.dopplerFactor = 0.5;
+ ok(Math.abs(context.listener.dopplerFactor - 0.5) < 1e-4, "The doppler factor value can be changed");
+ context.listener.speedOfSound = 400;
+ ok(Math.abs(context.listener.speedOfSound - 400) < 1e-4, "The speed of sound can be changed");
+ // The values set by the following cannot be read from script, but the
+ // implementation is simple enough, so we just make sure that nothing throws.
+ with (context.listener) {
+ setPosition(1.0, 1.0, 1.0);
+ setOrientation(1.0, 1.0, 1.0, 1.0, 1.0, 1.0);
+ setVelocity(0.5, 1.0, 1.5);
+ }
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html b/dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html
new file mode 100644
index 000000000..49f71505d
--- /dev/null
+++ b/dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the devtool AudioNode API</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+ SimpleTest.waitForExplicitFinish();
+
+ function id(node) {
+ return SpecialPowers.getPrivilegedProps(node, "id");
+ }
+
+ var ac = new AudioContext();
+ var ids;
+ var weak;
+ (function() {
+ var src1 = ac.createBufferSource();
+ var src2 = ac.createBufferSource();
+ ok(id(src2) > id(src1), "The ID should be monotonic");
+ ok(id(src1) > id(ac.destination), "The ID of the destination node should be the lowest");
+ ids = [id(src1), id(src2)];
+ weak = SpecialPowers.Cu.getWeakReference(src1);
+ is(SpecialPowers.unwrap(weak.get()), src1, "The node should support a weak reference");
+ })();
+ function observer(subject, topic, data) {
+ var id = parseInt(data);
+ var index = ids.indexOf(id);
+ if (index != -1) {
+ info("Dropping id " + id + " at index " + index);
+ ids.splice(index, 1);
+ if (ids.length == 0) {
+ SimpleTest.executeSoon(function() {
+ is(weak.get(), null, "The weak reference must be dropped now");
+ SpecialPowers.removeObserver(observer, "webaudio-node-demise");
+ SimpleTest.finish();
+ });
+ }
+ }
+ }
+ SpecialPowers.addObserver(observer, "webaudio-node-demise", false);
+
+ forceCC();
+ forceCC();
+
+ function forceCC() {
+ SpecialPowers.DOMWindowUtils.cycleCollect();
+ SpecialPowers.DOMWindowUtils.garbageCollect();
+ SpecialPowers.DOMWindowUtils.garbageCollect();
+ }
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_AudioParamDevtoolsAPI.html b/dom/media/webaudio/test/test_AudioParamDevtoolsAPI.html
new file mode 100644
index 000000000..9b59dda8a
--- /dev/null
+++ b/dom/media/webaudio/test/test_AudioParamDevtoolsAPI.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the devtool AudioParam API</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+ function checkIdAndName(node, name) {
+ is(SpecialPowers.getPrivilegedProps(node, "id"),
+ SpecialPowers.getPrivilegedProps(node[name], "parentNodeId"),
+ "The parent id should be correct");
+ is(SpecialPowers.getPrivilegedProps(node[name], "name"), name,
+ "The name of the AudioParam should be correct.");
+ }
+
+ var ac = new AudioContext(),
+ gain = ac.createGain(),
+ osc = ac.createOscillator(),
+ del = ac.createDelay(),
+ source = ac.createBufferSource(),
+ stereoPanner = ac.createStereoPanner(),
+ comp = ac.createDynamicsCompressor(),
+ biquad = ac.createBiquadFilter();
+
+ checkIdAndName(gain, "gain");
+ checkIdAndName(osc, "frequency");
+ checkIdAndName(osc, "detune");
+ checkIdAndName(del, "delayTime");
+ checkIdAndName(source, "playbackRate");
+ checkIdAndName(source, "detune");
+ checkIdAndName(stereoPanner, "pan");
+ checkIdAndName(comp, "threshold");
+ checkIdAndName(comp, "knee");
+ checkIdAndName(comp, "ratio");
+ checkIdAndName(comp, "attack");
+ checkIdAndName(comp, "release");
+ checkIdAndName(biquad, "frequency");
+ checkIdAndName(biquad, "detune");
+ checkIdAndName(biquad, "Q");
+ checkIdAndName(biquad, "gain");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_OfflineAudioContext.html b/dom/media/webaudio/test/test_OfflineAudioContext.html
new file mode 100644
index 000000000..81d3e2313
--- /dev/null
+++ b/dom/media/webaudio/test/test_OfflineAudioContext.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test OfflineAudioContext</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var renderedBuffer = null;
+var finished = 0;
+
+function finish() {
+ finished++;
+ if (finished == 2) {
+ SimpleTest.finish();
+ }
+}
+
+function setOrCompareRenderedBuffer(aRenderedBuffer) {
+ if (renderedBuffer) {
+ is(renderedBuffer, aRenderedBuffer, "Rendered buffers from the event and the promise should be the same");
+ finish();
+ } else {
+ renderedBuffer = aRenderedBuffer;
+ }
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new OfflineAudioContext(2, 100, 22050);
+ ok(ctx instanceof EventTarget, "OfflineAudioContexts must be EventTargets");
+ is(ctx.length, 100, "OfflineAudioContext.length is equal to the value passed to the ctor.");
+
+ var buf = ctx.createBuffer(2, 100, ctx.sampleRate);
+ for (var i = 0; i < 2; ++i) {
+ for (var j = 0; j < 100; ++j) {
+ buf.getChannelData(i)[j] = Math.sin(2 * Math.PI * 200 * j / ctx.sampleRate);
+ }
+ }
+
+ expectException(function() {
+ ctx.createMediaStreamDestination();
+ }, DOMException.NOT_SUPPORTED_ERR);
+
+ expectException(function() {
+ new OfflineAudioContext(2, 100, 0);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() {
+ new OfflineAudioContext(2, 100, -1);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() {
+ new OfflineAudioContext(0, 100, 44100);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ new OfflineAudioContext(32, 100, 44100);
+ expectException(function() {
+ new OfflineAudioContext(33, 100, 44100);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() {
+ new OfflineAudioContext(2, 0, 44100);
+ }, DOMException.NOT_SUPPORTED_ERR);
+
+ var src = ctx.createBufferSource();
+ src.buffer = buf;
+ src.start(0);
+ src.connect(ctx.destination);
+
+ ctx.addEventListener("complete", function(e) {
+ ok(e instanceof OfflineAudioCompletionEvent, "Correct event received");
+ is(e.renderedBuffer.numberOfChannels, 2, "Correct expected number of buffers");
+ ok(renderedBuffer != null, "The event should be fired after the promise callback.");
+ expectNoException(function() {
+ ctx.startRendering().then(function() {
+ ok(false, "Promise should not resolve when startRendering is called a second time on an OfflineAudioContext")
+ finish();
+ }).catch(function(err) {
+ ok(true, "Promise should reject when startRendering is called a second time on an OfflineAudioContext")
+ finish();
+ });
+ });
+ compareBuffers(e.renderedBuffer, buf);
+ setOrCompareRenderedBuffer(e.renderedBuffer);
+
+ }, false);
+
+ expectNoException(function() {
+ ctx.startRendering().then(function(b) {
+ is(renderedBuffer, null, "The promise callback should be called first.");
+ setOrCompareRenderedBuffer(b);
+ }).catch(function (error) {
+ ok(false, "The promise from OfflineAudioContext.startRendering should never be rejected");
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_ScriptProcessorCollected1.html b/dom/media/webaudio/test/test_ScriptProcessorCollected1.html
new file mode 100644
index 000000000..931f995df
--- /dev/null
+++ b/dom/media/webaudio/test/test_ScriptProcessorCollected1.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ScriptProcessorNode in cycle with no listener is collected</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var observer = function(subject, topic, data) {
+ var id = parseInt(data);
+ var index = ids.indexOf(id);
+ if (index != -1) {
+ ok(true, "Collected AudioNode id " + id + " at index " + index);
+ ids.splice(index, 1);
+ }
+}
+
+SpecialPowers.addObserver(observer, "webaudio-node-demise", false);
+
+SimpleTest.registerCleanupFunction(function() {
+ if (observer) {
+ SpecialPowers.removeObserver(observer, "webaudio-node-demise");
+ }
+});
+
+var ac = new AudioContext();
+
+var testProcessor = ac.createScriptProcessor(256, 1, 0);
+var delay = ac.createDelay();
+testProcessor.connect(delay);
+delay.connect(testProcessor);
+
+var referenceProcessor = ac.createScriptProcessor(256, 1, 0);
+var gain = ac.createGain();
+gain.connect(referenceProcessor);
+
+var processCount = 0;
+testProcessor.onaudioprocess = function(event) {
+ ++processCount;
+ switch (processCount) {
+ case 1:
+ // Switch to listening to referenceProcessor;
+ referenceProcessor.onaudioprocess = event.target.onaudioprocess;
+ referenceProcessor = null;
+ event.target.onaudioprocess = null;
+ case 2:
+ // There are no references to testProcessor and so GC can begin.
+ SpecialPowers.forceGC();
+ break;
+ case 3:
+ // Another GC should not be required after testProcessor would have
+ // received another audioprocess event.
+ SpecialPowers.forceCC();
+ // Expect that webaudio-demise has been queued.
+ // Queue another event to check.
+ SimpleTest.executeSoon(function() {
+ SpecialPowers.removeObserver(observer, "webaudio-node-demise");
+ observer = null;
+ event.target.onaudioprocess = null;
+ ok(ids.length == 0, "All expected nodes should be collected");
+ SimpleTest.finish();
+ });
+ break;
+ }
+};
+
+function id(node) {
+ return SpecialPowers.getPrivilegedProps(node, "id");
+}
+
+// Nodes with these ids should be collected.
+var ids = [ id(testProcessor), id(delay), id(gain) ];
+testProcessor = null;
+delay = null;
+gain = null;
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_WebAudioMemoryReporting.html b/dom/media/webaudio/test/test_WebAudioMemoryReporting.html
new file mode 100644
index 000000000..c753756e7
--- /dev/null
+++ b/dom/media/webaudio/test/test_WebAudioMemoryReporting.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Web Audio memory reporting</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var ac = new AudioContext();
+var sp = ac.createScriptProcessor(4096, 1, 1);
+sp.connect(ac.destination);
+
+// Not started so as to test
+// https://bugzilla.mozilla.org/show_bug.cgi?id=1225003#c2
+var oac = new OfflineAudioContext(1, 1, 48000);
+
+var nodeTypes = ["ScriptProcessorNode", "AudioDestinationNode"];
+var objectTypes = ["dom-nodes", "engine-objects", "stream-objects"];
+
+var usages = { "explicit/webaudio/audiocontext": 0 };
+
+for (var i = 0; i < nodeTypes.length; ++i) {
+ for (var j = 0; j < objectTypes.length; ++j) {
+ usages["explicit/webaudio/audio-node/" +
+ nodeTypes[i] + "/" + objectTypes[j]] = 0;
+ }
+}
+
+var handleReport = function(aProcess, aPath, aKind, aUnits, aAmount, aDesc) {
+ if (aPath in usages) {
+ usages[aPath] += aAmount;
+ }
+}
+
+var finished = function () {
+ ok(true, "Yay didn't crash!");
+ for (var resource in usages) {
+ ok(usages[resource] > 0, "Non-zero usage for " + resource);
+ };
+ SimpleTest.finish();
+}
+
+SpecialPowers.Cc["@mozilla.org/memory-reporter-manager;1"].
+ getService(SpecialPowers.Ci.nsIMemoryReporterManager).
+ getReports(handleReport, null, finished, null, /* anonymized = */ false);
+
+// To test bug 1225003, run a failing decodeAudioData() job over a time when
+// the tasks from getReports() are expected to run.
+ac.decodeAudioData(new ArrayBuffer(4), function(){}, function(){});
+</script>
+</html>
diff --git a/dom/media/webaudio/test/test_analyserNode.html b/dom/media/webaudio/test/test_analyserNode.html
new file mode 100644
index 000000000..7af67a5a5
--- /dev/null
+++ b/dom/media/webaudio/test/test_analyserNode.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AnalyserNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+
+ var context = new AudioContext();
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var destination = context.destination;
+
+ var source = context.createBufferSource();
+
+ var analyser = context.createAnalyser();
+
+ source.buffer = buffer;
+
+ source.connect(analyser);
+ analyser.connect(destination);
+
+ is(analyser.channelCount, 1, "analyser node has 1 input channels by default");
+ is(analyser.channelCountMode, "max", "Correct channelCountMode for the analyser node");
+ is(analyser.channelInterpretation, "speakers", "Correct channelCountInterpretation for the analyser node");
+
+ is(analyser.fftSize, 2048, "Correct default value for fftSize");
+ is(analyser.frequencyBinCount, 1024, "Correct default value for frequencyBinCount");
+ expectException(function() {
+ analyser.fftSize = 0;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 1;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 8;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 100; // non-power of two
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 2049;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 4097;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 8193;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 16385;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 32769;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.fftSize = 65536;
+ }, DOMException.INDEX_SIZE_ERR);
+ analyser.fftSize = 1024;
+ is(analyser.frequencyBinCount, 512, "Correct new value for frequencyBinCount");
+
+ is(analyser.minDecibels, -100, "Correct default value for minDecibels");
+ is(analyser.maxDecibels, -30, "Correct default value for maxDecibels");
+ expectException(function() {
+ analyser.minDecibels = -30;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.minDecibels = -29;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.maxDecibels = -100;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.maxDecibels = -101;
+ }, DOMException.INDEX_SIZE_ERR);
+
+ is(analyser.smoothingTimeConstant, 0.8, "Correct default value for smoothingTimeConstant");
+ expectException(function() {
+ analyser.smoothingTimeConstant = -0.1;
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ analyser.smoothingTimeConstant = 1.1;
+ }, DOMException.INDEX_SIZE_ERR);
+ analyser.smoothingTimeConstant = 0;
+ analyser.smoothingTimeConstant = 1;
+
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_analyserNodeOutput.html b/dom/media/webaudio/test/test_analyserNodeOutput.html
new file mode 100644
index 000000000..e6255fee0
--- /dev/null
+++ b/dom/media/webaudio/test/test_analyserNodeOutput.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AnalyserNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var analyser = context.createAnalyser();
+
+ source.buffer = this.buffer;
+
+ source.connect(analyser);
+
+ source.start(0);
+ return analyser;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_analyserNodePassThrough.html b/dom/media/webaudio/test/test_analyserNodePassThrough.html
new file mode 100644
index 000000000..37d1db510
--- /dev/null
+++ b/dom/media/webaudio/test/test_analyserNodePassThrough.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AnalyserNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var analyser = context.createAnalyser();
+
+ source.buffer = this.buffer;
+
+ source.connect(analyser);
+
+ var analyserWrapped = SpecialPowers.wrap(analyser);
+ ok("passThrough" in analyserWrapped, "AnalyserNode should support the passThrough API");
+ analyserWrapped.passThrough = true;
+
+ source.start(0);
+ return analyser;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_analyserNodeWithGain.html b/dom/media/webaudio/test/test_analyserNodeWithGain.html
new file mode 100644
index 000000000..fa0a2caa7
--- /dev/null
+++ b/dom/media/webaudio/test/test_analyserNodeWithGain.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>Test effect of AnalyserNode on GainNode output</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+promise_test(function() {
+ // fftSize <= bufferSize so that the time domain data is full of input after
+ // processing the buffer.
+ const fftSize = 32;
+ const bufferSize = 128;
+
+ var context = new OfflineAudioContext(1, bufferSize, 48000);
+
+ var analyser1 = context.createAnalyser();
+ analyser1.fftSize = fftSize;
+ analyser1.connect(context.destination);
+ var analyser2 = context.createAnalyser();
+ analyser2.fftSize = fftSize;
+
+ var gain = context.createGain();
+ gain.gain.value = 2.0;
+ gain.connect(analyser1);
+ gain.connect(analyser2);
+
+ // Create a DC input to make getFloatTimeDomainData() output consistent at
+ // any time.
+ var buffer = context.createBuffer(1, 1, context.sampleRate);
+ buffer.getChannelData(0)[0] = 1.0 / gain.gain.value;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.loop = true;
+ source.connect(gain);
+ source.start();
+
+ return context.startRendering().
+ then(function(buffer) {
+ assert_equals(buffer.getChannelData(0)[0], 1.0,
+ "analyser1 output");
+
+ var data = new Float32Array(1);
+ analyser1.getFloatTimeDomainData(data);
+ assert_equals(data[0], 1.0, "analyser1 time domain data");
+ analyser2.getFloatTimeDomainData(data);
+ assert_equals(data[0], 1.0, "analyser2 time domain data");
+ });
+});
+</script>
diff --git a/dom/media/webaudio/test/test_analyserScale.html b/dom/media/webaudio/test/test_analyserScale.html
new file mode 100644
index 000000000..3aec8d22b
--- /dev/null
+++ b/dom/media/webaudio/test/test_analyserScale.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AnalyserNode when the input is scaled </title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+
+ var context = new AudioContext();
+
+ var gain = context.createGain();
+ var analyser = context.createAnalyser();
+ var osc = context.createOscillator();
+
+
+ osc.connect(gain);
+ gain.connect(analyser);
+
+ osc.start();
+
+ var array = new Uint8Array(analyser.frequencyBinCount);
+
+ function getAnalyserData() {
+ gain.gain.setValueAtTime(currentGain, context.currentTime);
+ analyser.getByteTimeDomainData(array);
+ var inrange = true;
+ var max = -1;
+ for (var i = 0; i < array.length; i++) {
+ if (array[i] > max) {
+ max = Math.abs(array[i] - 128);
+ }
+ }
+ if (max <= currentGain * 128) {
+ ok(true, "Analyser got scaled data for " + currentGain);
+ currentGain = tests.shift();
+ if (currentGain == undefined) {
+ SimpleTest.finish();
+ return;
+ }
+ }
+ requestAnimationFrame(getAnalyserData);
+ }
+
+ var tests = [1.0, 0.5, 0.0];
+ var currentGain = tests.shift();
+ requestAnimationFrame(getAnalyserData);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNode.html b/dom/media/webaudio/test/test_audioBufferSourceNode.html
new file mode 100644
index 000000000..875c96c36
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNode.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.start(0);
+ source.buffer = buffer;
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var buffers = [];
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ buffer.getChannelData(1)[i] = buffer.getChannelData(0)[i];
+ }
+ buffers.push(buffer);
+ buffers.push(getEmptyBuffer(context, 2048));
+ return buffers;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html b/dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html
new file mode 100644
index 000000000..4d06c26ca
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode when an AudioBuffer's getChanneData buffer is detached</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function createGarbage() {
+ var s = [];
+ for (var i = 0; i < 10000000; ++i) {
+ s.push(i);
+ }
+ var sum = 0;
+ for (var i = 0; i < s.length; ++i) {
+ sum += s[i];
+ }
+ return sum;
+}
+
+var worker = new Worker("audioBufferSourceNodeDetached_worker.js");
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 10000000, context.sampleRate);
+ var data = buffer.getChannelData(0);
+ for (var i = 0; i < data.length; ++i) {
+ data[i] = (i%100)/100 - 0.5;
+ }
+
+ // Detach the buffer now
+ var data = buffer.getChannelData(0).buffer;
+ worker.postMessage(data, [data]);
+ // Create garbage and GC to replace the buffer data with garbage
+ SpecialPowers.gc();
+ createGarbage();
+ SpecialPowers.gc();
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.start();
+ // This should play silence
+ return source;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeEnded.html b/dom/media/webaudio/test/test_audioBufferSourceNodeEnded.html
new file mode 100644
index 000000000..08616bea6
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeEnded.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ended event on AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+
+ source.onended = function(e) {
+ is(e.target, source, "Correct target for the ended event");
+ SimpleTest.finish();
+ };
+
+ source.start(0);
+ source.buffer = buffer;
+ source.connect(context.destination);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html b/dom/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html
new file mode 100644
index 000000000..0893cf10b
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ // silence for half of the buffer, ones after that.
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 1024; i < 2048; i++) {
+ buffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+
+ // we start at the 1024 frames, we should only have ones.
+ source.loop = true;
+ source.loopStart = 1024 / context.sampleRate;
+ source.loopEnd = 2048 / context.sampleRate;
+ source.buffer = buffer;
+ source.start(0, 1024 / context.sampleRate, 1024 / context.sampleRate);
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 4096, context.sampleRate);
+ for (var i = 0; i < 4096; i++) {
+ expectedBuffer.getChannelData(0)[i] = 1;
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html b/dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html
new file mode 100644
index 000000000..79c78dfe0
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode looping</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048 * 4,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ source.start(0);
+ source.loop = true;
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048 * 4, context.sampleRate);
+ for (var i = 0; i < 4; ++i) {
+ for (var j = 0; j < 2048; ++j) {
+ expectedBuffer.getChannelData(0)[i * 2048 + j] = Math.sin(440 * 2 * Math.PI * j / context.sampleRate);
+ }
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html b/dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html
new file mode 100644
index 000000000..6f60762eb
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode looping</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048 * 4,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.start(0);
+ source.loop = true;
+ source.loopStart = buffer.duration * 0.25;
+ source.loopEnd = buffer.duration * 0.75;
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048 * 4, context.sampleRate);
+ for (var i = 0; i < 1536; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ for (var i = 0; i < 6; ++i) {
+ for (var j = 512; j < 1536; ++j) {
+ expectedBuffer.getChannelData(0)[1536 + i * 1024 + j - 512] = Math.sin(440 * 2 * Math.PI * j / context.sampleRate);
+ }
+ }
+ for (var j = 7680; j < 2048 * 4; ++j) {
+ expectedBuffer.getChannelData(0)[j] = Math.sin(440 * 2 * Math.PI * (j - 7168) / context.sampleRate);
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html b/dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html
new file mode 100644
index 000000000..eca4bf636
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode looping</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ source.loop = true;
+ source.loopStart = source.loopEnd = 1 / context.sampleRate;
+ source.start(0);
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ return buffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeNoStart.html b/dom/media/webaudio/test/test_audioBufferSourceNodeNoStart.html
new file mode 100644
index 000000000..89340ade8
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeNoStart.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode when start() is not called</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ var data = buffer.getChannelData(0);
+ for (var i = 0; i < data.length; ++i) {
+ data[i] = (i%100)/100 - 0.5;
+ }
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ return source;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html b/dom/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html
new file mode 100644
index 000000000..6ca771af1
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ source.start(0);
+ source.buffer = null;
+ is(source.buffer, null, "Try playing back a null buffer");
+ return source;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeOffset.html b/dom/media/webaudio/test/test_audioBufferSourceNodeOffset.html
new file mode 100644
index 000000000..b7a16634e
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeOffset.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the offset property on AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var fuzz = 0.3;
+
+if (navigator.platform.startsWith("Mac")) {
+ // bug 895720
+ fuzz = 0.6;
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var samplesFromSource = 0;
+ var context = new AudioContext();
+ var sp = context.createScriptProcessor(256);
+
+ sp.onaudioprocess = function(e) {
+ samplesFromSource += e.inputBuffer.length;
+ }
+
+ var buffer = context.createBuffer(1, context.sampleRate, context.sampleRate);
+ for (var i = 0; i < context.sampleRate; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+
+ source.onended = function(e) {
+ // The timing at which the audioprocess and ended listeners are called can
+ // change, hence the fuzzy equal here.
+ var errorRatio = samplesFromSource / (0.5 * context.sampleRate);
+ ok(errorRatio > (1.0 - fuzz) && errorRatio < (1.0 + fuzz),
+ "Correct number of samples received (expected: " +
+ (0.5 * context.sampleRate) + ", actual: " + samplesFromSource + ").");
+ SimpleTest.finish();
+ };
+
+ source.buffer = buffer;
+ source.connect(sp);
+ source.start(0, 0.5);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodePassThrough.html b/dom/media/webaudio/test/test_audioBufferSourceNodePassThrough.html
new file mode 100644
index 000000000..5088f1637
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodePassThrough.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+
+ source.buffer = buffer;
+
+ var srcWrapped = SpecialPowers.wrap(source);
+ ok("passThrough" in srcWrapped, "AudioBufferSourceNode should support the passThrough API");
+ srcWrapped.passThrough = true;
+
+ source.start(0);
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+
+ return [expectedBuffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioBufferSourceNodeRate.html b/dom/media/webaudio/test/test_audioBufferSourceNodeRate.html
new file mode 100644
index 000000000..2cdcd7270
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioBufferSourceNodeRate.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var rate = 44100;
+var off = new OfflineAudioContext(1, rate, rate);
+var off2 = new OfflineAudioContext(1, rate, rate);
+
+var source = off.createBufferSource();
+var source2 = off2.createBufferSource();
+
+// a buffer of a 440Hz at half the length. If we detune by -1200 or set the
+// playbackRate to 0.5, we should get 44100 samples back with a sine at 220Hz.
+var buf = off.createBuffer(1, rate / 2, rate);
+var bufarray = buf.getChannelData(0);
+for (var i = 0; i < bufarray.length; i++) {
+ bufarray[i] = Math.sin(i * 440 * 2 * Math.PI / rate);
+}
+
+source.buffer = buf;
+source.playbackRate.value = 0.5; // 50% slowdown
+source.connect(off.destination);
+source.start(0);
+
+source2.buffer = buf;
+source2.detune.value = -1200; // one octave -> 50% slowdown
+source2.connect(off2.destination);
+source2.start(0);
+
+var finished = 0;
+function finish() {
+ finished++;
+ if (finished == 2) {
+ SimpleTest.finish();
+ }
+}
+
+off.startRendering().then((renderedPlaybackRate) => {
+ // we don't care about comparing the value here, we just want to know whether
+ // the second part is noisy.
+ var rmsValue = rms(renderedPlaybackRate, 0, 22050);
+ ok(rmsValue != 0, "Resampling happened (rms of the second part " + rmsValue + ")");
+
+ off2.startRendering().then((renderedDetune) => {
+ var rmsValue = rms(renderedDetune, 0, 22050);
+ ok(rmsValue != 0, "Resampling happened (rms of the second part " + rmsValue + ")");
+ // The two buffers should be the same: detune of -1200 is a 50% slowdown
+ compareBuffers(renderedPlaybackRate, renderedDetune);
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioContextSuspendResumeClose.html b/dom/media/webaudio/test/test_audioContextSuspendResumeClose.html
new file mode 100644
index 000000000..269d5380e
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioContextSuspendResumeClose.html
@@ -0,0 +1,410 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test suspend, resume and close method of the AudioContext</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function tryToCreateNodeOnClosedContext(ctx) {
+ ok(ctx.state, "closed", "The context is in closed state");
+
+ [ { name: "createBufferSource" },
+ { name: "createMediaStreamDestination",
+ onOfflineAudioContext: false},
+ { name: "createScriptProcessor" },
+ { name: "createStereoPanner" },
+ { name: "createAnalyser" },
+ { name: "createGain" },
+ { name: "createDelay" },
+ { name: "createBiquadFilter" },
+ { name: "createWaveShaper" },
+ { name: "createPanner" },
+ { name: "createConvolver" },
+ { name: "createChannelSplitter" },
+ { name: "createChannelMerger" },
+ { name: "createDynamicsCompressor" },
+ { name: "createOscillator" },
+ { name: "createMediaElementSource",
+ args: [new Audio()],
+ onOfflineAudioContext: false },
+ { name: "createMediaStreamSource",
+ args: [new Audio().mozCaptureStream()],
+ onOfflineAudioContext: false } ].forEach(function(e) {
+
+ if (e.onOfflineAudioContext == false &&
+ ctx instanceof OfflineAudioContext) {
+ return;
+ }
+
+ expectException(function() {
+ ctx[e.name].apply(ctx, e.args);
+ }, DOMException.INVALID_STATE_ERR);
+ });
+}
+
+function loadFile(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, true);
+ xhr.responseType = "arraybuffer";
+ xhr.onload = function() {
+ callback(xhr.response);
+ };
+ xhr.send();
+}
+
+// createBuffer, createPeriodicWave and decodeAudioData should work on a context
+// that has `state` == "closed"
+function tryLegalOpeerationsOnClosedContext(ctx) {
+ ok(ctx.state, "closed", "The context is in closed state");
+
+ [ { name: "createBuffer",
+ args: [1, 44100, 44100] },
+ { name: "createPeriodicWave",
+ args: [new Float32Array(10), new Float32Array(10)] }
+ ].forEach(function(e) {
+ expectNoException(function() {
+ ctx[e.name].apply(ctx, e.args);
+ });
+ });
+ loadFile("ting-44.1k-1ch.ogg", function(buf) {
+ ctx.decodeAudioData(buf).then(function(decodedBuf) {
+ ok(true, "decodeAudioData on a closed context should work, it did.")
+ todo(false, "0 " + (ctx instanceof OfflineAudioContext ? "Offline" : "Realtime"));
+ finish();
+ }).catch(function(e){
+ ok(false, "decodeAudioData on a closed context should work, it did not");
+ finish();
+ });
+ });
+}
+
+// Test that MediaStreams that are the output of a suspended AudioContext are
+// producing silence
+// ac1 produce a sine fed to a MediaStreamAudioDestinationNode
+// ac2 is connected to ac1 with a MediaStreamAudioSourceNode, and check that
+// there is silence when ac1 is suspended
+function testMultiContextOutput() {
+ var ac1 = new AudioContext(),
+ ac2 = new AudioContext();
+
+ ac1.onstatechange = function() {
+ ac1.onstatechange = null;
+
+ var osc1 = ac1.createOscillator(),
+ mediaStreamDestination1 = ac1.createMediaStreamDestination();
+
+ var mediaStreamAudioSourceNode2 =
+ ac2.createMediaStreamSource(mediaStreamDestination1.stream),
+ sp2 = ac2.createScriptProcessor(),
+ silentBuffersInARow = 0;
+
+
+ sp2.onaudioprocess = function(e) {
+ ac1.suspend().then(function() {
+ is(ac1.state, "suspended", "ac1 is suspended");
+ sp2.onaudioprocess = checkSilence;
+ });
+ sp2.onaudioprocess = null;
+ }
+
+ function checkSilence(e) {
+ var input = e.inputBuffer.getChannelData(0);
+ var silent = true;
+ for (var i = 0; i < input.length; i++) {
+ if (input[i] != 0.0) {
+ silent = false;
+ }
+ }
+
+ todo(false, "input buffer is " + (silent ? "silent" : "noisy"));
+
+ if (silent) {
+ silentBuffersInARow++;
+ if (silentBuffersInARow == 10) {
+ ok(true,
+ "MediaStreams produce silence when their input is blocked.");
+ sp2.onaudioprocess = null;
+ ac1.close();
+ ac2.close();
+ todo(false,"1");
+ finish();
+ }
+ } else {
+ is(silentBuffersInARow, 0,
+ "No non silent buffer inbetween silent buffers.");
+ }
+ }
+
+ osc1.connect(mediaStreamDestination1);
+
+ mediaStreamAudioSourceNode2.connect(sp2);
+ osc1.start();
+ }
+}
+
+
+// Test that there is no buffering between contexts when connecting a running
+// AudioContext to a suspended AudioContext. Our ScriptProcessorNode does some
+// buffering internally, so we ensure this by using a very very low frequency
+// on a sine, and oberve that the phase has changed by a big enough margin.
+function testMultiContextInput() {
+ var ac1 = new AudioContext(),
+ ac2 = new AudioContext();
+
+ ac1.onstatechange = function() {
+ ac1.onstatechange = null;
+
+ var osc1 = ac1.createOscillator(),
+ mediaStreamDestination1 = ac1.createMediaStreamDestination(),
+ sp1 = ac1.createScriptProcessor();
+
+ var mediaStreamAudioSourceNode2 =
+ ac2.createMediaStreamSource(mediaStreamDestination1.stream),
+ sp2 = ac2.createScriptProcessor(),
+ eventReceived = 0;
+
+
+ osc1.frequency.value = 0.0001;
+
+ function checkDiscontinuity(e) {
+ var inputBuffer = e.inputBuffer.getChannelData(0);
+ if (eventReceived++ == 3) {
+ var delta = Math.abs(inputBuffer[1] - sp2.value),
+ theoreticalIncrement = 2048 * 3 * Math.PI * 2 * osc1.frequency.value / ac1.sampleRate;
+ ok(delta >= theoreticalIncrement,
+ "Buffering did not occur when the context was suspended (delta:" + delta + " increment: " + theoreticalIncrement+")");
+ ac1.close();
+ ac2.close();
+ sp1.onaudioprocess = null;
+ sp2.onaudioprocess = null;
+ todo(false, "2");
+ finish();
+ }
+ }
+
+ sp2.onaudioprocess = function(e) {
+ var inputBuffer = e.inputBuffer.getChannelData(0);
+ sp2.value = inputBuffer[inputBuffer.length - 1];
+ ac2.suspend().then(function() {
+ ac2.resume().then(function() {
+ sp2.onaudioprocess = checkDiscontinuity;
+ });
+ });
+ }
+
+ osc1.connect(mediaStreamDestination1);
+ osc1.connect(sp1);
+
+ mediaStreamAudioSourceNode2.connect(sp2);
+ osc1.start();
+ }
+}
+
+// Test that ScriptProcessorNode's onaudioprocess don't get called while the
+// context is suspended/closed. It is possible that we get the handler called
+// exactly once after suspend, because the event has already been sent to the
+// event loop.
+function testScriptProcessNodeSuspended() {
+ var ac = new AudioContext();
+ var sp = ac.createScriptProcessor();
+ var remainingIterations = 30;
+ var afterResume = false;
+ ac.onstatechange = function() {
+ ac.onstatechange = null;
+ sp.onaudioprocess = function() {
+ ok(ac.state == "running", "If onaudioprocess is called, the context" +
+ " must be running (was " + ac.state + ", remainingIterations:" + remainingIterations +")");
+ remainingIterations--;
+ if (!afterResume) {
+ if (remainingIterations == 0) {
+ ac.suspend().then(function() {
+ ac.resume().then(function() {
+ remainingIterations = 30;
+ afterResume = true;
+ });
+ });
+ }
+ } else {
+ sp.onaudioprocess = null;
+ todo(false,"3");
+ finish();
+ }
+ }
+ }
+ sp.connect(ac.destination);
+}
+
+// Take an AudioContext, make sure it switches to running when the audio starts
+// flowing, and then, call suspend, resume and close on it, tracking its state.
+function testAudioContext() {
+ var ac = new AudioContext();
+ is(ac.state, "suspended", "AudioContext should start in suspended state.");
+ var stateTracker = {
+ previous: ac.state,
+ // no promise for the initial suspended -> running
+ initial: { handler: false },
+ suspend: { promise: false, handler: false },
+ resume: { promise: false, handler: false },
+ close: { promise: false, handler: false }
+ };
+
+ function initialSuspendToRunning() {
+ ok(stateTracker.previous == "suspended" &&
+ ac.state == "running",
+ "AudioContext should switch to \"running\" when the audio hardware is" +
+ " ready.");
+
+ stateTracker.previous = ac.state;
+ ac.onstatechange = afterSuspend;
+ stateTracker.initial.handler = true;
+
+ ac.suspend().then(function() {
+ ok(!stateTracker.suspend.promise && !stateTracker.suspend.handler,
+ "Promise should be resolved before the callback, and only once.")
+ stateTracker.suspend.promise = true;
+ });
+ }
+
+ function afterSuspend() {
+ ok(stateTracker.previous == "running" &&
+ ac.state == "suspended",
+ "AudioContext should switch to \"suspend\" when the audio stream is" +
+ "suspended.");
+ ok(stateTracker.suspend.promise && !stateTracker.suspend.handler,
+ "Handler should be called after the callback, and only once");
+
+ stateTracker.suspend.handler = true;
+ stateTracker.previous = ac.state;
+ ac.onstatechange = afterResume;
+
+ ac.resume().then(function() {
+ ok(!stateTracker.resume.promise && !stateTracker.resume.handler,
+ "Promise should be called before the callback, and only once");
+ stateTracker.resume.promise = true;
+ });
+ }
+
+ function afterResume() {
+ ok(stateTracker.previous == "suspended" &&
+ ac.state == "running",
+ "AudioContext should switch to \"running\" when the audio stream resumes.");
+
+ ok(stateTracker.resume.promise && !stateTracker.resume.handler,
+ "Handler should be called after the callback, and only once");
+
+ stateTracker.resume.handler = true;
+ stateTracker.previous = ac.state;
+ ac.onstatechange = afterClose;
+
+ ac.close().then(function() {
+ ok(!stateTracker.close.promise && !stateTracker.close.handler,
+ "Promise should be called before the callback, and only once");
+ stateTracker.close.promise = true;
+ tryToCreateNodeOnClosedContext(ac);
+ tryLegalOpeerationsOnClosedContext(ac);
+ });
+ }
+
+ function afterClose() {
+ ok(stateTracker.previous == "running" &&
+ ac.state == "closed",
+ "AudioContext should switch to \"closed\" when the audio stream is" +
+ " closed.");
+ ok(stateTracker.close.promise && !stateTracker.close.handler,
+ "Handler should be called after the callback, and only once");
+ }
+
+ ac.onstatechange = initialSuspendToRunning;
+}
+
+function testOfflineAudioContext() {
+ var o = new OfflineAudioContext(1, 44100, 44100);
+ is(o.state, "suspended", "OfflineAudioContext should start in suspended state.");
+
+ expectRejectedPromise(o, "suspend", "NotSupportedError");
+ expectRejectedPromise(o, "resume", "NotSupportedError");
+ expectRejectedPromise(o, "close", "NotSupportedError");
+
+ var previousState = o.state,
+ finishedRendering = false;
+ function beforeStartRendering() {
+ ok(previousState == "suspended" && o.state == "running", "onstatechanged" +
+ "handler is called on state changed, and the new state is running");
+ previousState = o.state;
+ o.onstatechange = onRenderingFinished;
+ }
+
+ function onRenderingFinished() {
+ ok(previousState == "running" && o.state == "closed",
+ "onstatechanged handler is called when rendering finishes, " +
+ "and the new state is closed");
+ ok(finishedRendering, "The Promise that is resolved when the rendering is" +
+ "done should be resolved earlier than the state change.");
+ previousState = o.state;
+ o.onstatechange = afterRenderingFinished;
+
+ tryToCreateNodeOnClosedContext(o);
+ tryLegalOpeerationsOnClosedContext(o);
+ }
+
+ function afterRenderingFinished() {
+ ok(false, "There should be no transition out of the closed state.");
+ }
+
+ o.onstatechange = beforeStartRendering;
+
+ o.startRendering().then(function(buffer) {
+ finishedRendering = true;
+ });
+}
+
+function testSuspendResumeEventLoop() {
+ var ac = new AudioContext();
+ var source = ac.createBufferSource();
+ source.buffer = ac.createBuffer(1, 44100, 44100);
+ source.onended = function() {
+ ok(true, "The AudioContext did resume.");
+ finish();
+ }
+ ac.onstatechange = function() {
+ ac.onstatechange = null;
+
+ ok(ac.state == "running", "initial state is running");
+ ac.suspend();
+ source.start();
+ ac.resume();
+ }
+}
+
+var remaining = 0;
+function finish() {
+ remaining--;
+ if (remaining == 0) {
+ SimpleTest.finish();
+ }
+}
+
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var tests = [
+ testAudioContext,
+ testOfflineAudioContext,
+ testScriptProcessNodeSuspended,
+ testMultiContextOutput,
+ testMultiContextInput,
+ testSuspendResumeEventLoop
+ ];
+ remaining = tests.length;
+ tests.forEach(function(f) { f() });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioDestinationNode.html b/dom/media/webaudio/test/test_audioDestinationNode.html
new file mode 100644
index 000000000..b86c7169d
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioDestinationNode.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioDestinationNode as EventTarget</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var ac = new AudioContext()
+ac.destination.addEventListener("foo", function() {
+ ok(true, "Event received!");
+ SimpleTest.finish();
+}, false);
+ac.destination.dispatchEvent(new CustomEvent("foo"));
+
+</script>
+</pre>
+</body>
+</html>
+
diff --git a/dom/media/webaudio/test/test_audioParamChaining.html b/dom/media/webaudio/test/test_audioParamChaining.html
new file mode 100644
index 000000000..6093e4425
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamChaining.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can create an AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish()
+
+function frameToTime(frame, rate)
+{
+ return frame / rate;
+}
+
+const RATE = 44100;
+
+var oc = new OfflineAudioContext(1, 44100, RATE);
+// This allows us to have a source that is simply a DC offset.
+var source = oc.createBufferSource();
+var buf = oc.createBuffer(1, 1, RATE);
+buf.getChannelData(0)[0] = 1;
+source.loop = true;
+source.buffer = buf;
+
+source.start(0);
+
+var gain = oc.createGain();
+
+source.connect(gain).connect(oc.destination);
+
+var gain2 = oc.createGain();
+var rv2 = gain2.gain.linearRampToValueAtTime(0.1, 0.5);
+ok(rv2 instanceof AudioParam, "linearRampToValueAtTime returns an AudioParam.");
+ok(rv2 == gain2.gain, "linearRampToValueAtTime returns the right AudioParam.");
+
+rv2 = gain2.gain.exponentialRampToValueAtTime(0.01, 1.0);
+ok(rv2 instanceof AudioParam,
+ "exponentialRampToValueAtTime returns an AudioParam.");
+ok(rv2 == gain2.gain,
+ "exponentialRampToValueAtTime returns the right AudioParam.");
+
+rv2 = gain2.gain.setTargetAtTime(1.0, 2.0, 0.1);
+ok(rv2 instanceof AudioParam, "setTargetAtTime returns an AudioParam.");
+ok(rv2 == gain2.gain, "setTargetAtTime returns the right AudioParam.");
+
+var array = new Float32Array(10);
+rv2 = gain2.gain.setValueCurveAtTime(array, 10, 11);
+ok(rv2 instanceof AudioParam, "setValueCurveAtTime returns an AudioParam.");
+ok(rv2 == gain2.gain, "setValueCurveAtTime returns the right AudioParam.");
+
+// We chain three automation methods, making a gain step.
+var rv = gain.gain.setValueAtTime(0, frameToTime(0, RATE))
+ .setValueAtTime(0.5, frameToTime(22000, RATE))
+ .setValueAtTime(1, frameToTime(44000, RATE));
+
+ok(rv instanceof AudioParam, "setValueAtTime returns an AudioParam.");
+ok(rv == gain.gain, "setValueAtTime returns the right AudioParam.");
+
+oc.startRendering().then(function(rendered) {
+ console.log(rendered.getChannelData(0));
+ is(rendered.getChannelData(0)[0], 0,
+ "The value of the first step is correct.");
+ is(rendered.getChannelData(0)[22050], 0.5,
+ "The value of the second step is correct");
+ is(rendered.getChannelData(0)[44099], 1,
+ "The value of the third step is correct.");
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamExponentialRamp.html b/dom/media/webaudio/test/test_audioParamExponentialRamp.html
new file mode 100644
index 000000000..e1b1c5142
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamExponentialRamp.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.exponentialRampToValue</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var V0 = 0.1;
+var V1 = 0.9;
+var T0 = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.setValueAtTime(V0, 0);
+ gain.gain.exponentialRampToValueAtTime(V1, 2048/context.sampleRate);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var T1 = 2048 / context.sampleRate;
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ var t = i / context.sampleRate;
+ expectedBuffer.getChannelData(0)[i] = V0 * Math.pow(V1 / V0, (t - T0) / (T1 - T0));
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamGain.html b/dom/media/webaudio/test/test_audioParamGain.html
new file mode 100644
index 000000000..b971becce
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamGain.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam with pre-gain </title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var ctx = new AudioContext();
+var source = ctx.createOscillator();
+var lfo = ctx.createOscillator();
+var lfoIntensity = ctx.createGain();
+var effect = ctx.createGain();
+var sp = ctx.createScriptProcessor(2048, 1);
+
+source.frequency.value = 440;
+lfo.frequency.value = 2;
+// Very low gain, so the LFO should have very little influence
+// on the source, its RMS value should be close to the nominal value
+// for a sine wave.
+lfoIntensity.gain.value = 0.0001;
+
+lfo.connect(lfoIntensity);
+lfoIntensity.connect(effect.gain);
+source.connect(effect);
+effect.connect(sp);
+
+sp.onaudioprocess = function(e) {
+ var buffer = e.inputBuffer.getChannelData(0);
+ var rms = 0;
+ for (var i = 0; i < buffer.length; i++) {
+ rms += buffer[i] * buffer[i];
+ }
+
+ rms /= buffer.length;
+ rms = Math.sqrt(rms);
+
+ // 1 / Math.sqrt(2) is the theoretical RMS value for a sine wave.
+ ok(fuzzyCompare(rms, 1 / Math.sqrt(2)),
+ "Gain correctly applied to the AudioParam.");
+
+ ctx = null;
+ sp.onaudioprocess = null;
+ lfo.stop(0);
+ source.stop(0);
+
+ SimpleTest.finish();
+}
+
+lfo.start(0);
+source.start(0);
+
+</script>
+</pre>
+</body>
diff --git a/dom/media/webaudio/test/test_audioParamLinearRamp.html b/dom/media/webaudio/test/test_audioParamLinearRamp.html
new file mode 100644
index 000000000..31f1d80d6
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamLinearRamp.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.linearRampToValue</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var V0 = 0.1;
+var V1 = 0.9;
+var T0 = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.setValueAtTime(V0, 0);
+ gain.gain.linearRampToValueAtTime(V1, 2048/context.sampleRate);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var T1 = 2048 / context.sampleRate;
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ var t = i / context.sampleRate;
+ expectedBuffer.getChannelData(0)[i] = V0 + (V1 - V0) * ((t - T0) / (T1 - T0));
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamSetCurveAtTime.html b/dom/media/webaudio/test/test_audioParamSetCurveAtTime.html
new file mode 100644
index 000000000..bcb655b52
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamSetCurveAtTime.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.linearRampToValue</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var T0 = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createConstantSource();
+
+ var gain = context.createGain();
+ gain.gain.setValueCurveAtTime(this.curve, T0, this.duration);
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ this.duration = 1024 / context.sampleRate;
+ this.curve = new Float32Array([1.0, 0.5, 0.75, 0.25]);
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ var data = expectedBuffer.getChannelData(0);
+ var step = 1024 / 3;
+ for (var i = 0; i < 2048; ++i) {
+ if (i < step) {
+ data[i] = 1.0 - 0.5*i/step;
+ } else if (i < 2*step) {
+ data[i] = 0.5 + 0.25*(i - step)/step;
+ } else if (i < 3*step) {
+ data[i] = 0.75 - 0.5*(i - 2*step)/step;
+ } else {
+ data[i] = 0.25;
+ }
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamSetCurveAtTimeTwice.html b/dom/media/webaudio/test/test_audioParamSetCurveAtTimeTwice.html
new file mode 100644
index 000000000..0f976380e
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamSetCurveAtTimeTwice.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.setValueCurveAtTime twice</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+
+function linearInterpolate(t0, v0, t1, v1, t)
+{
+ return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));
+}
+
+var T0 = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var curve2 = new Float32Array(100);
+ for (var i = 0; i < 100; ++i) {
+ curve2[i] = Math.sin(220 * 6 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createConstantSource();
+
+ var gain = context.createGain();
+ gain.gain.setValueCurveAtTime(curve2, T0, this.duration/2);
+ //Set a different curve from the first one
+ gain.gain.setValueCurveAtTime(this.curve, T0, this.duration);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ this.duration = 1024 / context.sampleRate;
+ this.curve = new Float32Array(100);
+ for (var i = 0; i < 100; ++i) {
+ this.curve[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ step = 1024.0/99.0;
+ var current = Math.floor(i / step);
+ var next = current + 1;
+ if (next < this.curve.length) {
+ expectedBuffer.getChannelData(0)[i] = linearInterpolate(current*step, this.curve[current], next*step, this.curve[next], i);
+ } else {
+ expectedBuffer.getChannelData(0)[i] = this.curve[99];
+ }
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamSetCurveAtTimeZeroDuration.html b/dom/media/webaudio/test/test_audioParamSetCurveAtTimeZeroDuration.html
new file mode 100644
index 000000000..174c15c6f
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamSetCurveAtTimeZeroDuration.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.linearRampToValue</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var T0 = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.setValueCurveAtTime(this.curve, this.T0, 0);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ this.T0 = 1024 / context.sampleRate;
+ this.curve = new Float32Array(100);
+ for (var i = 0; i < 100; ++i) {
+ this.curve[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 1024; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 1;
+ }
+ for (var i = 1024; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = this.curve[99];
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamSetTargetAtTime.html b/dom/media/webaudio/test/test_audioParamSetTargetAtTime.html
new file mode 100644
index 000000000..ccb35ca7b
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamSetTargetAtTime.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.setTargetAtTime</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var V0 = 0.9;
+var V1 = 0.1;
+var T0 = 0;
+var TimeConstant = 10;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.value = V0;
+ gain.gain.setTargetAtTime(V1, T0, TimeConstant);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var T1 = 2048 / context.sampleRate;
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ var t = i / context.sampleRate;
+ expectedBuffer.getChannelData(0)[i] = V1 + (V0 - V1) * Math.exp(-(t - T0) / TimeConstant);
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamSetTargetAtTimeZeroTimeConstant.html b/dom/media/webaudio/test/test_audioParamSetTargetAtTimeZeroTimeConstant.html
new file mode 100644
index 000000000..bad12ca31
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamSetTargetAtTimeZeroTimeConstant.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.setTargetAtTime with zero time constant</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var V0 = 0.9;
+var V1 = 0.1;
+var T0 = 0;
+var TimeConstant = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.value = V0;
+ gain.gain.setTargetAtTime(V1, T0, TimeConstant);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var T1 = 2048 / context.sampleRate;
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ var t = i / context.sampleRate;
+ expectedBuffer.getChannelData(0)[i] = V1;
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamSetValueAtTime.html b/dom/media/webaudio/test/test_audioParamSetValueAtTime.html
new file mode 100644
index 000000000..1ab515935
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamSetValueAtTime.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.linearRampToValue</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var V0 = 0.1;
+var V1 = 0.9;
+var T0 = 0;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.value = 0;
+ gain.gain.setValueAtTime(V0, 1024/context.sampleRate);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 1024; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 0.1;
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_audioParamTimelineDestinationOffset.html b/dom/media/webaudio/test/test_audioParamTimelineDestinationOffset.html
new file mode 100644
index 000000000..510beb3c7
--- /dev/null
+++ b/dom/media/webaudio/test/test_audioParamTimelineDestinationOffset.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam timeline events scheduled after the destination stream has started playback</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.requestFlakyTimeout("This test needs to wait until the AudioDestinationNode's stream's timer starts.");
+
+var gTest = {
+ length: 16384,
+ numberOfChannels: 1,
+ createGraphAsync: function(context, callback) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ setTimeout(function() {
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+ source.start(context.currentTime);
+ source.stop(context.currentTime + sourceBuffer.duration);
+
+ var gain = context.createGain();
+ gain.gain.setValueAtTime(0, context.currentTime);
+ gain.gain.setTargetAtTime(0, context.currentTime + sourceBuffer.duration, 1);
+ source.connect(gain);
+
+ callback(gain);
+ }, 100);
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_badConnect.html b/dom/media/webaudio/test/test_badConnect.html
new file mode 100644
index 000000000..b0d7c8f0c
--- /dev/null
+++ b/dom/media/webaudio/test/test_badConnect.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can create an AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context1 = new AudioContext();
+ var context2 = new AudioContext();
+
+ var destination1 = context1.destination;
+ var destination2 = context2.destination;
+
+ isnot(destination1, destination2, "Destination nodes should not be the same");
+ isnot(destination1.context, destination2.context, "Destination nodes should not have the same context");
+
+ var source1 = context1.createBufferSource();
+
+ expectException(function() {
+ source1.connect(destination1, 1);
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ source1.connect(destination1, 0, 1);
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ source1.connect(destination2);
+ }, DOMException.SYNTAX_ERR);
+
+ source1.connect(destination1);
+
+ expectException(function() {
+ source1.disconnect(1);
+ }, DOMException.INDEX_SIZE_ERR);
+
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_biquadFilterNode.html b/dom/media/webaudio/test/test_biquadFilterNode.html
new file mode 100644
index 000000000..078f89179
--- /dev/null
+++ b/dom/media/webaudio/test/test_biquadFilterNode.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+function near(a, b, msg) {
+ ok(Math.abs(a - b) < 1e-3, msg);
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var destination = context.destination;
+
+ var source = context.createBufferSource();
+
+ var filter = context.createBiquadFilter();
+
+ source.buffer = buffer;
+
+ source.connect(filter);
+ filter.connect(destination);
+
+ // Verify default values
+ is(filter.type, "lowpass", "Correct default value for type");
+ near(filter.frequency.defaultValue, 350, "Correct default value for filter frequency");
+ near(filter.detune.defaultValue, 0, "Correct default value for filter detune");
+ near(filter.Q.defaultValue, 1, "Correct default value for filter Q");
+ near(filter.gain.defaultValue, 0, "Correct default value for filter gain");
+ is(filter.channelCount, 2, "Biquad filter node has 2 input channels by default");
+ is(filter.channelCountMode, "max", "Correct channelCountMode for the biquad filter node");
+ is(filter.channelInterpretation, "speakers", "Correct channelCountInterpretation for the biquad filter node");
+
+ // Make sure that we can set all of the valid type values
+ var types = [
+ "lowpass",
+ "highpass",
+ "bandpass",
+ "lowshelf",
+ "highshelf",
+ "peaking",
+ "notch",
+ "allpass",
+ ];
+ for (var i = 0; i < types.length; ++i) {
+ filter.type = types[i];
+ }
+
+ // Make sure getFrequencyResponse handles invalid frequencies properly
+ var frequencies = new Float32Array([-1.0, context.sampleRate*0.5 - 1.0, context.sampleRate]);
+ var magResults = new Float32Array(3);
+ var phaseResults = new Float32Array(3);
+ filter.getFrequencyResponse(frequencies, magResults, phaseResults);
+ ok(isNaN(magResults[0]), "Invalid input frequency should give NaN magnitude response");
+ ok(!isNaN(magResults[1]), "Valid input frequency should not give NaN magnitude response");
+ ok(isNaN(magResults[2]), "Invalid input frequency should give NaN magnitude response");
+ ok(isNaN(phaseResults[0]), "Invalid input frquency should give NaN phase response");
+ ok(!isNaN(phaseResults[1]), "Valid input frquency should not give NaN phase response");
+ ok(isNaN(phaseResults[2]), "Invalid input frquency should give NaN phase response");
+
+ source.start(0);
+ SimpleTest.executeSoon(function() {
+ source.stop(0);
+ source.disconnect();
+ filter.disconnect();
+
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_biquadFilterNodePassThrough.html b/dom/media/webaudio/test/test_biquadFilterNodePassThrough.html
new file mode 100644
index 000000000..59fc8ab4f
--- /dev/null
+++ b/dom/media/webaudio/test/test_biquadFilterNodePassThrough.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var filter = context.createBiquadFilter();
+
+ source.buffer = this.buffer;
+
+ source.connect(filter);
+
+ var filterWrapped = SpecialPowers.wrap(filter);
+ ok("passThrough" in filterWrapped, "BiquadFilterNode should support the passThrough API");
+ filterWrapped.passThrough = true;
+
+ source.start(0);
+ return filter;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_biquadFilterNodeWithGain.html b/dom/media/webaudio/test/test_biquadFilterNodeWithGain.html
new file mode 100644
index 000000000..390f2cdb0
--- /dev/null
+++ b/dom/media/webaudio/test/test_biquadFilterNodeWithGain.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test BiquadFilterNode after a GainNode and tail - Bugs 924286 and 924288</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+const signalLength = 2048;
+
+var gTest = {
+ length: signalLength,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ // Two oscillators scheduled sequentially
+ var signalDuration = signalLength / context.sampleRate;
+ var osc1 = context.createOscillator();
+ osc1.type = "square";
+ osc1.start(0);
+ osc1.stop(signalDuration / 2);
+ var osc2 = context.createOscillator();
+ osc2.start(signalDuration / 2);
+ osc2.stop(signalDuration);
+
+ // Comparing a biquad on each source with one on both sources checks that
+ // the biquad on the first source doesn't shut down early.
+ var biquad1 = context.createBiquadFilter();
+ osc1.connect(biquad1);
+ var biquad2 = context.createBiquadFilter();
+ osc2.connect(biquad2);
+
+ var gain = context.createGain();
+ gain.gain.value = -1;
+ osc1.connect(gain);
+ osc2.connect(gain);
+
+ var biquadWithGain = context.createBiquadFilter();
+ gain.connect(biquadWithGain);
+
+ // The output of biquadWithGain should be the inverse of the sum of the
+ // outputs of biquad1 and biquad2, so blend them together and expect
+ // silence.
+ var blend = context.createGain();
+ biquad1.connect(blend);
+ biquad2.connect(blend);
+ biquadWithGain.connect(blend);
+
+ return blend;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug1027864.html b/dom/media/webaudio/test/test_bug1027864.html
new file mode 100644
index 000000000..0c115d1a0
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1027864.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test bug 1027864</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+function observer(subject, topic, data) {
+ var id = parseInt(data);
+ var index = ids.indexOf(id);
+ if (index != -1) {
+ ok(true, "Dropping id " + id + " at index " + index);
+ ids.splice(index, 1);
+ if (ids.length == 0) {
+ SimpleTest.executeSoon(function() {
+ SimpleTest.finish();
+ });
+ }
+ }
+}
+
+function id(node) {
+ return SpecialPowers.getPrivilegedProps(node, "id");
+}
+
+SpecialPowers.addObserver(observer, "webaudio-node-demise", false);
+
+SimpleTest.registerCleanupFunction(function() {
+ SpecialPowers.removeObserver(observer, "webaudio-node-demise");
+});
+
+var ac = new AudioContext();
+var ids;
+
+(function() {
+ var delay = ac.createDelay();
+ delay.delayTime.value = 0.03;
+
+ var gain = ac.createGain();
+ gain.gain.value = 0.6;
+
+ delay.connect(gain);
+ gain.connect(delay);
+
+ gain.connect(ac.destination);
+
+ var source = ac.createOscillator();
+
+ source.connect(gain);
+ source.start(ac.currentTime);
+ source.stop(ac.currentTime + 0.1);
+
+ ids = [ id(delay), id(gain), id(source) ];
+})();
+
+setInterval(function() {
+ forceCC();
+}, 200);
+
+function forceCC() {
+ SpecialPowers.DOMWindowUtils.cycleCollect();
+ SpecialPowers.DOMWindowUtils.garbageCollect();
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug1056032.html b/dom/media/webaudio/test/test_bug1056032.html
new file mode 100644
index 000000000..98fb159f7
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1056032.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset=utf-8>
+<head>
+ <title>Test that we can decode an mp3 (bug 1056032)</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var filename = "small-shot.mp3";
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", filename);
+ xhr.responseType = "arraybuffer";
+ xhr.onload = function() {
+ var context = new AudioContext();
+ context.decodeAudioData(xhr.response, function(b) {
+ ok(true, "We can decode an mp3 using decodeAudioData");
+ SimpleTest.finish();
+ }, function() {
+ ok(false, "We should be able to decode an mp3 using decodeAudioData but couldn't");
+ SimpleTest.finish();
+ });
+ };
+ xhr.send(null);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug1113634.html b/dom/media/webaudio/test/test_bug1113634.html
new file mode 100644
index 000000000..8995589f3
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1113634.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioParam.setTargetAtTime where the target time is the same as the time of a previous event</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var V0 = 0.9;
+var V1 = 0.1;
+var T0 = 0;
+var TimeConstant = 0.1;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+ gain.gain.setValueAtTime(V0, T0);
+ gain.gain.setTargetAtTime(V1, T0, TimeConstant);
+
+ source.connect(gain);
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ var t = i / context.sampleRate;
+ expectedBuffer.getChannelData(0)[i] = V1 + (V0 - V1) * Math.exp(-(t - T0) / TimeConstant);
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug1118372.html b/dom/media/webaudio/test/test_bug1118372.html
new file mode 100644
index 000000000..ca3fc6b0d
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1118372.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test WaveShaperNode with no curve</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ var context = new OfflineAudioContext(1, 2048, 44100);
+
+ var osc=context.createOscillator();
+ var gain=context.createGain();
+ var shaper=context.createWaveShaper();
+ gain.gain.value=0.1;
+ shaper.curve=new Float32Array([-0.5,-0.5,1,1]);
+
+ osc.connect(gain);
+ gain.connect(shaper);
+ shaper.connect(context.destination);
+ osc.start(0);
+
+ context.startRendering().then(function(buffer) {
+ var samples = buffer.getChannelData(0);
+ // the signal should be scaled
+ var failures = 0;
+ for (var i = 0; i < 2048; ++i) {
+ if (samples[i] > 0.5) {
+ failures = failures + 1;
+ }
+ }
+ ok(failures == 0, "signal should have been rescaled by gain: found " + failures + " points too loud.");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug1255618.html b/dom/media/webaudio/test/test_bug1255618.html
new file mode 100644
index 000000000..246a04438
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1255618.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test sync XHR does not crash unlinked AudioContext</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script>
+SimpleTest.waitForExplicitFinish();
+
+const filename = "test_bug1255618.html";
+
+function collect_and_fetch() {
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", filename, false);
+ var ended = false;
+ xhr.onloadend = function() { ended = true; }
+ // Sync XHR will suspend timeouts, which involves any AudioContexts still
+ // registered with the window.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=1255618#c0
+ xhr.send(null);
+
+ ok(ended, "No crash during fetch");
+ SimpleTest.finish();
+}
+
+var ac = new AudioContext();
+
+ac.onstatechange = function () {
+ ac.onstatechange = null;
+ is(ac.state, "running", "statechange to running");
+ ac = null;
+ SimpleTest.executeSoon(collect_and_fetch);
+}
+
+</script>
+</body>
diff --git a/dom/media/webaudio/test/test_bug1267579.html b/dom/media/webaudio/test/test_bug1267579.html
new file mode 100644
index 000000000..62eda14dc
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug1267579.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test that PeriodicWave handles fundamental fequency of zero</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// This is the smallest value that the test framework will accept
+const testLength = 256;
+
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ runTest();
+});
+
+var gTest = {
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var osc = context.createOscillator();
+ osc.setPeriodicWave(context.
+ createPeriodicWave(new Float32Array([0.0, 1.0]),
+ new Float32Array(2)));
+ osc.frequency.value = 0.0;
+ osc.start();
+ return osc;
+ },
+ createExpectedBuffers: function(context) {
+ var buffer = context.createBuffer(1, testLength, context.sampleRate);
+
+ for (var i = 0; i < buffer.length; ++i) {
+ buffer.getChannelData(0)[i] = 1.0;
+ }
+ return buffer;
+ },
+};
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug808374.html b/dom/media/webaudio/test/test_bug808374.html
new file mode 100644
index 000000000..cc4e02f41
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug808374.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 808374</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+try {
+ var ctx = new AudioContext();
+ ctx.createBuffer(0, 1, ctx.sampleRate);
+} catch (e) {
+ ok(true, "The test should not crash during CC");
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug827541.html b/dom/media/webaudio/test/test_bug827541.html
new file mode 100644
index 000000000..9940c112e
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug827541.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Tell the cycle collector about the audio contexts owned by nsGlobalWindow</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+ var iframe = document.createElementNS("http://www.w3.org/1999/xhtml", "iframe");
+ document.body.appendChild(iframe);
+ var frameWin = iframe.contentWindow;
+ new frameWin.AudioContext();
+ document.body.removeChild(iframe);
+ new frameWin.AudioContext();
+
+ ok(true, "This test should not leak");
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug839753.html b/dom/media/webaudio/test/test_bug839753.html
new file mode 100644
index 000000000..bbab10b25
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug839753.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 839753</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+(new AudioContext()).destination.expando = null;
+ok(true, "The test should not trigger wrapper cache assertions");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug845960.html b/dom/media/webaudio/test/test_bug845960.html
new file mode 100644
index 000000000..4e37f91bf
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug845960.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 845960</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+(new AudioContext()).decodeAudioData(new ArrayBuffer(0), function() {});
+ok(true, "Should not crash when the optional failure callback is not specified");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug856771.html b/dom/media/webaudio/test/test_bug856771.html
new file mode 100644
index 000000000..8a6e622c2
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug856771.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for bug 856771</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+
+ var source = context.createBufferSource();
+ source.connect(context.destination);
+ ok(true, "Nothing should leak");
+
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug866570.html b/dom/media/webaudio/test/test_bug866570.html
new file mode 100644
index 000000000..0a1feca61
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug866570.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 859600</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+(new AudioContext()).foo = null;
+ok(true, "The test should not fatally assert");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug866737.html b/dom/media/webaudio/test/test_bug866737.html
new file mode 100644
index 000000000..40fcf83fd
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug866737.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for bug 866737</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var context = new AudioContext();
+
+(function() {
+ var d = context.createDelay();
+ var panner = context.createPanner();
+ d.connect(panner);
+ var gain = context.createGain();
+ panner.connect(gain);
+ gain.connect(context.destination);
+ gain.disconnect(0);
+})();
+
+SpecialPowers.forceGC();
+SpecialPowers.forceCC();
+
+var gain = context.createGain();
+gain.connect(context.destination);
+gain.disconnect(0);
+
+ok(true, "No crashes should happen!");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug867089.html b/dom/media/webaudio/test/test_bug867089.html
new file mode 100644
index 000000000..650676a44
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug867089.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 867089</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new AudioContext();
+
+ // Test invalid playbackRate values for AudioBufferSourceNode.
+ var source = ctx.createBufferSource();
+ var buffer = ctx.createBuffer(2, 2048, 8000);
+ source.buffer = buffer;
+ source.playbackRate.value = 0.0;
+ source.connect(ctx.destination);
+ source.start(0);
+
+ var source2 = ctx.createBufferSource();
+ source2.buffer = buffer;
+ source2.playbackRate.value = -1.0;
+ source2.connect(ctx.destination);
+ source2.start(0);
+
+ var source3 = ctx.createBufferSource();
+ source3.buffer = buffer;
+ source3.playbackRate.value = 3000000.0;
+ source3.connect(ctx.destination);
+ source3.start(0);
+ ok(true, "We did not crash.");
+ SimpleTest.finish();
+});
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug867104.html b/dom/media/webaudio/test/test_bug867104.html
new file mode 100644
index 000000000..82852ba51
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug867104.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 867104</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new AudioContext();
+ var source = ctx.createBufferSource();
+ var b0 = ctx.createBuffer(32,798,22050);
+ var b1 = ctx.createBuffer(32,28,22050);
+ var sp = ctx.createScriptProcessor(0, 2, 0);
+ source.buffer = b0;
+ source.connect(sp);
+ source.start(0);
+ source.buffer = b1;
+ sp.onaudioprocess = function() {
+ ok(true, "We did not crash.");
+ sp.onaudioprocess = null;
+ SimpleTest.finish();
+ };
+});
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug867174.html b/dom/media/webaudio/test/test_bug867174.html
new file mode 100644
index 000000000..ce88be1b3
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug867174.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 867174</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new AudioContext();
+
+ var source = ctx.createBufferSource();
+ var buffer = ctx.createBuffer(2, 2048, 8000);
+ source.playbackRate.setTargetAtTime(0, 2, 3);
+ var sp = ctx.createScriptProcessor();
+ source.connect(sp);
+ sp.connect(ctx.destination);
+ source.start(0);
+
+ sp.onaudioprocess = function(e) {
+ // Now set the buffer
+ source.buffer = buffer;
+
+ ok(true, "We did not crash.");
+ sp.onaudioprocess = null;
+ SimpleTest.finish();
+ };
+});
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug867203.html b/dom/media/webaudio/test/test_bug867203.html
new file mode 100644
index 000000000..0ca31263d
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug867203.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 867203</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new AudioContext();
+
+ var panner1 = ctx.createPanner();
+ panner1.setVelocity(1, 1, 1);
+ ctx.listener.setVelocity(1, 1, 1);
+ (function() {
+ ctx.createBufferSource().connect(panner1);
+ })();
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+ ctx.createPanner();
+
+ ok(true, "We did not crash.");
+ SimpleTest.finish();
+});
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug875221.html b/dom/media/webaudio/test/test_bug875221.html
new file mode 100644
index 000000000..16560ae75
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug875221.html
@@ -0,0 +1,239 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 875221</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("This test is generated by a fuzzer, so we leave these setTimeouts untouched.");
+
+try { o0 = document.createElement('audio'); } catch(e) { }
+try { (document.body || document.documentElement).appendChild(o0); } catch(e) { }
+try { o1 = new OfflineAudioContext(1, 10, (new AudioContext()).sampleRate); } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o1.listener.dopplerFactor = 1; } catch(e) { }
+try { o2 = o1.createScriptProcessor(); } catch(e) { }
+try { o3 = o1.createChannelMerger(4); } catch(e) { }
+try { o1.listener.dopplerFactor = 3; } catch(e) { }
+try { o1.listener.setPosition(0, 134217728, 64) } catch(e) { }
+try { o1.listener.dopplerFactor = 15; } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o4 = new OfflineAudioContext(1, 10, (new AudioContext()).sampleRate); } catch(e) { }
+try { o4.listener.speedOfSound = 2048; } catch(e) { }
+try { o4.listener.setPosition(32768, 1, 1) } catch(e) { }
+try { o5 = o1.createChannelSplitter(4); } catch(e) { }
+try { o4.listener.setVelocity(4, 1, 0) } catch(e) { }
+try { o4.startRendering(); } catch(e) { }
+try { o4.startRendering(); } catch(e) { }
+try { o4.listener.setPosition(64, 1, 0) } catch(e) { }
+try { o1.listener.setOrientation(4194304, 15, 8388608, 15, 1, 1) } catch(e) { }
+try { o1.listener.dopplerFactor = 256; } catch(e) { }
+try { o6 = o4.createDelay(16); } catch(e) { }
+try { o4.startRendering(); } catch(e) { }
+try { o4.listener.setOrientation(0, 1, 0, 0, 31, 1073741824) } catch(e) { }
+try { o4.listener.speedOfSound = 1; } catch(e) { }
+try { o1.listener.speedOfSound = 0; } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o6.connect(o3, 1, 0) } catch(e) { }
+try { o1.listener.setPosition(4294967296, 32, 1) } catch(e) { }
+try { o1.listener.speedOfSound = 0; } catch(e) { }
+try { o1.listener.speedOfSound = 0; } catch(e) { }
+try { o1.listener.setVelocity(1, 256, 0) } catch(e) { }
+try { o4.startRendering(); } catch(e) { }
+try { o3.disconnect() } catch(e) { }
+setTimeout("try { o4.startRendering(); } catch(e) { }",50)
+try { o4.listener.setOrientation(0, 0, 2048, 128, 16384, 127) } catch(e) { }
+try { o4.listener.setVelocity(0, 4, 1) } catch(e) { }
+try { o7 = o4.createScriptProcessor(1024, 4, 1); } catch(e) { }
+try { o8 = o4.createDynamicsCompressor(); } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+SpecialPowers.forceCC();
+SpecialPowers.forceGC();
+try { o4.listener.setOrientation(8192, 1, 1, 512, 0, 15) } catch(e) { }
+setTimeout("try { o7.onaudioprocess = function() {}; } catch(e) { }",50)
+try { o1.startRendering(); } catch(e) { }
+try { o1.listener.speedOfSound = 1073741824; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o9 = o4.createScriptProcessor(1024, 1, 4); } catch(e) { }
+try { o10 = o4.createAnalyser(); } catch(e) { }
+try { o4.listener.speedOfSound = 0; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+try { o4.listener.setVelocity(524288, 1, 65536) } catch(e) { }
+setTimeout("try { o2.connect(o9); } catch(e) { } setTimeout(done, 0);",1000)
+try { o7.connect(o4); } catch(e) { }
+try { o1.listener.setVelocity(1, 127, 31) } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+setTimeout("try { o5.disconnect() } catch(e) { }",100)
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o4.startRendering(); } catch(e) { }
+setTimeout("try { o1.listener.dopplerFactor = 1; } catch(e) { }",100)
+try { o5.disconnect() } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o10.disconnect() } catch(e) { }
+try { o1.startRendering(); } catch(e) { }
+try { o11 = o1.createGain(); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o4); } catch(e) { }
+try { o4.listener.setOrientation(31, 0, 15, 0, 33554432, 1) } catch(e) { }
+try { o4.listener.dopplerFactor = 1; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+setTimeout("try { o9.connect(o4); } catch(e) { }",50)
+try { o2.connect(o9); } catch(e) { }
+setTimeout("try { o9.connect(o1); } catch(e) { }",200)
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+try { o12 = o4.createDynamicsCompressor(); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+try { o9.onaudioprocess = function() {}; } catch(e) { }
+try { o1.listener.speedOfSound = 262144; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+setTimeout("try { o7.connect(o4); } catch(e) { }",50)
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o13 = o4.createGain(); } catch(e) { }
+try { o4.listener.dopplerFactor = 31; } catch(e) { }
+try { o11.gain.value = 268435456; } catch(e) { }
+try { o1.listener.setOrientation(63, 3, 1, 63, 1, 2147483648) } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o4.listener.setVelocity(1, 0, 1) } catch(e) { }
+try { o11.gain.value = 65536; } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+setTimeout("try { o7.connect(o4); } catch(e) { }",200)
+try { o14 = o4.createDynamicsCompressor(); } catch(e) { }
+setTimeout("try { o2.connect(o9); } catch(e) { }",50)
+try { o7.connect(o1); } catch(e) { }
+try { o15 = o1.createWaveShaper(); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+try { o16 = o1.createWaveShaper(); } catch(e) { }
+try { o11.gain.value = 1; } catch(e) { }
+try { o1.listener.speedOfSound = 16; } catch(e) { }
+try { o4.listener.setVelocity(0, 127, 15) } catch(e) { }
+try { o1.listener.setVelocity(0, 2048, 16777216) } catch(e) { }
+try { o13.gain.value = 0; } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+try { o17 = document.createElement('audio'); } catch(e) { }
+try { (document.body || document.documentElement).appendChild(o0); } catch(e) { }
+try { o4.listener.setVelocity(3, 1, 256) } catch(e) { }
+try { o11.gain.cancelScheduledValues(1) } catch(e) { }
+try { o1.listener.dopplerFactor = 524288; } catch(e) { }
+try { o9.onaudioprocess = function() {}; } catch(e) { }
+setTimeout("try { o7.connect(o13, 0, 0) } catch(e) { }",50)
+try { o1.listener.speedOfSound = 0; } catch(e) { }
+try { o10.disconnect() } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o9.connect(o4); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o4); } catch(e) { }
+try { o1.listener.speedOfSound = 1; } catch(e) { }
+try { o15.disconnect() } catch(e) { }
+try { o11.gain.exponentialRampToValueAtTime(0, 15) } catch(e) { }
+try { o15.curve = new Float32Array(15); } catch(e) { }
+try { o4.listener.setVelocity(1, 1, 1) } catch(e) { }
+try { o14.connect(o6, 0, 0) } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+setTimeout("try { o7.connect(o1); } catch(e) { }",100)
+try { o4.listener.setVelocity(1, 7, 1) } catch(e) { }
+try { o18 = document.createElement('audio'); } catch(e) { }
+try { (document.body || document.documentElement).appendChild(o18); } catch(e) { }
+try { o19 = o4.createGain(); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+try { o4.listener.dopplerFactor = 0; } catch(e) { }
+try { o1.listener.setPosition(256, 16, 1) } catch(e) { }
+setTimeout("try { o2.connect(o9); } catch(e) { }",50)
+try { o7.connect(o1); } catch(e) { }
+try { o4.listener.speedOfSound = 31; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+setTimeout("try { o9.connect(o4); } catch(e) { }",1000)
+try { o11.gain.value = 127; } catch(e) { }
+try { o7.connect(o7, 0, 0) } catch(e) { }
+try { o4.listener.speedOfSound = 63; } catch(e) { }
+try { o11.gain.value = 33554432; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o4); } catch(e) { }
+try { o4.listener.speedOfSound = 16; } catch(e) { }
+try { o4.listener.setVelocity(1048576, 0, 127) } catch(e) { }
+try { o1.listener.dopplerFactor = 0; } catch(e) { }
+try { o6.connect(o2, 0, 1) } catch(e) { }
+try { o5.disconnect() } catch(e) { }
+try { o3.disconnect() } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+try { o16.disconnect() } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+try { o9.disconnect() } catch(e) { }
+try { o4.listener.speedOfSound = 1; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o11.gain.setValueCurveAtTime(new Float32Array(3), 2048, 3) } catch(e) { }
+try { o13.gain.value = 8; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o4); } catch(e) { }
+try { o4.listener.setOrientation(1, 2048, 1, 1, 0, 31) } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o1); } catch(e) { }
+try { o1.listener.speedOfSound = 256; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o4); } catch(e) { }
+try { o4.listener.setVelocity(1, 67108864, 128) } catch(e) { }
+setTimeout("try { o1.listener.setVelocity(0, 1, 1) } catch(e) { }",100)
+try { o2.connect(o9); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+setTimeout("try { o20 = o1.createBiquadFilter(); } catch(e) { }",200)
+try { o13.gain.value = 4096; } catch(e) { }
+try { o1.listener.dopplerFactor = 0; } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+setTimeout("try { o2.connect(o9); } catch(e) { }",200)
+try { o7.connect(o1); } catch(e) { }
+try { o3.connect(o15, 1, 1) } catch(e) { }
+try { o2.connect(o12, 0, 0) } catch(e) { }
+try { o19.gain.exponentialRampToValueAtTime(1, 0) } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+
+function done() {
+ ok(true, "We did not crash.");
+ SimpleTest.finish();
+}
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug875402.html b/dom/media/webaudio/test/test_bug875402.html
new file mode 100644
index 000000000..2dc347fc1
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug875402.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Crashtest for bug 875402</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+SimpleTest.requestFlakyTimeout("This test is generated by a fuzzer, so we leave these setTimeouts untouched.");
+
+try { o1 = new OfflineAudioContext(1, 10, (new AudioContext()).sampleRate); } catch(e) { }
+try { o2 = o1.createScriptProcessor(); } catch(e) { }
+try { o4 = new OfflineAudioContext(1, 10, (new AudioContext()).sampleRate); } catch(e) { }
+try { o5 = o1.createChannelSplitter(4); } catch(e) { }
+try { o7 = o4.createScriptProcessor(1024, 4, 1); } catch(e) { }
+SpecialPowers.forceCC();
+SpecialPowers.forceGC();
+try { o1.startRendering(); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o7.connect(o4); } catch(e) { }
+try { o9 = o4.createScriptProcessor(1024, 1, 4); } catch(e) { }
+try { o2.connect(o7); } catch(e) { }
+try { o9.connect(o1); } catch(e) { }
+setTimeout("try { o2.connect(o9); } catch(e) { } done();",1000)
+try { o7.connect(o4); } catch(e) { }
+setTimeout("try { o5.disconnect() } catch(e) { }",100)
+try { o2.connect(o9); } catch(e) { }
+try { o4.startRendering(); } catch(e) { }
+try { o2.connect(o9); } catch(e) { }
+setTimeout("try { o7.connect(o4); } catch(e) { }",50)
+try { o13 = o4.createGain(); } catch(e) { }
+setTimeout("try { o7.connect(o13, 0, 0) } catch(e) { }",50)
+
+function done() {
+ ok(true, "We did not crash.");
+ SimpleTest.finish();
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug894150.html b/dom/media/webaudio/test/test_bug894150.html
new file mode 100644
index 000000000..08fd72413
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug894150.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can create an AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script>
+
+var ac = new AudioContext();
+ac.createPanner();
+var listener = ac.listener;
+SpecialPowers.forceGC();
+SpecialPowers.forceCC();
+listener.setOrientation(0, 0, -1, 0, 0, 0);
+
+ok(true, "No crashes should happen!");
+
+</script>
+</body>
diff --git a/dom/media/webaudio/test/test_bug956489.html b/dom/media/webaudio/test/test_bug956489.html
new file mode 100644
index 000000000..920889290
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug956489.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test when and currentTime are in the same coordinate system</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("This test needs to wait a while for the AudioContext's timer to start.");
+addLoadEvent(function() {
+ var freq = 330;
+
+ var context = new AudioContext();
+
+ var buffer = context.createBuffer(1, context.sampleRate / freq, context.sampleRate);
+ for (var i = 0; i < buffer.length; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(2 * Math.PI * i / buffer.length);
+ }
+
+ var source = context.createBufferSource();
+ source.loop = true;
+ source.buffer = buffer;
+
+ setTimeout(function () {
+ var finished = false;
+
+ source.start(context.currentTime);
+ var processor = context.createScriptProcessor(256, 1, 1);
+ processor.onaudioprocess = function (e) {
+ if (finished) return;
+ var c = e.inputBuffer.getChannelData(0);
+ var result = true;
+
+ for (var i = 0; i < buffer.length; ++i) {
+ if (Math.abs(c[i] - buffer.getChannelData(0)[i]) > 1e-9) {
+ result = false;
+ break;
+ }
+ }
+ finished = true;
+ ok(result, "when and currentTime are in same time coordinate system");
+ SimpleTest.finish();
+ }
+ processor.connect(context.destination);
+ source.connect(processor);
+ }, 500);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug964376.html b/dom/media/webaudio/test/test_bug964376.html
new file mode 100644
index 000000000..1d9af1c1e
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug964376.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test repeating audio is not distorted</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function gcd(a, b) {
+ if (b === 0) {
+ return a;
+ }
+ return gcd(b, a % b);
+}
+
+var SAMPLE_PLACEMENT = 128;
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+
+ createGraph: function(context) {
+ var freq = Math.round(context.sampleRate / SAMPLE_PLACEMENT);
+ var dur = context.sampleRate / gcd(freq, context.sampleRate);
+ var buffer = context.createBuffer(1, dur, context.sampleRate);
+
+ for (var i = 0; i < context.sampleRate; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(freq * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.loop = true;
+ source.playbackRate.setValueAtTime(0.5, SAMPLE_PLACEMENT / context.sampleRate);
+ source.start(0);
+
+ return source;
+ },
+
+ createExpectedBuffers: function(context) {
+ var freq = Math.round(context.sampleRate / SAMPLE_PLACEMENT);
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ var c = expectedBuffer.getChannelData(0);
+ for (var i = 0; i < c.length; ++i) {
+ if (i < SAMPLE_PLACEMENT) {
+ c[i] = Math.sin(freq * 2 * Math.PI * i / context.sampleRate);
+ } else {
+ c[i] = Math.sin(freq / 2 * 2 * Math.PI * (i + SAMPLE_PLACEMENT) / context.sampleRate);
+ }
+ }
+
+ return expectedBuffer;
+ },
+};
+
+runTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug966247.html b/dom/media/webaudio/test/test_bug966247.html
new file mode 100644
index 000000000..9224ac2d4
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug966247.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether an audio file played with a volume set to 0 plays silence</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<audio preload=none src="ting-48k-1ch.ogg" controls> </audio>
+<script>
+ SimpleTest.waitForExplicitFinish();
+
+ var count = 20;
+
+ function isSilent(b) {
+ for (var i = 0; i < b.length; b++) {
+ if (b[i] != 0.0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ var a = document.getElementsByTagName("audio")[0];
+ a.volume = 0.0;
+ var ac = new AudioContext();
+ var measn = ac.createMediaElementSource(a);
+ var sp = ac.createScriptProcessor();
+
+ sp.onaudioprocess = function(e) {
+ var inputBuffer = e.inputBuffer.getChannelData(0);
+ ok(isSilent(inputBuffer), "The volume is set to 0, so all the elements of the buffer are supposed to be equal to 0.0");
+ }
+ // Connect the MediaElementAudioSourceNode to the ScriptProcessorNode to check
+ // the audio volume.
+ measn.connect(sp);
+ a.play();
+
+ a.addEventListener("ended", function() {
+ sp.onaudioprocess = null;
+ SimpleTest.finish();
+ });
+
+</script>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_bug972678.html b/dom/media/webaudio/test/test_bug972678.html
new file mode 100644
index 000000000..d0cb4e419
--- /dev/null
+++ b/dom/media/webaudio/test/test_bug972678.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test buffers do not interfere when scheduled in sequence</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var OFFSETS = [0.005, 0.01, 0.02, 0.03];
+var LENGTH = 128;
+
+var gTest = {
+ length: 128 * OFFSETS.length,
+ numberOfChannels: 1,
+
+ createGraph: function(context) {
+ var gain = context.createGain();
+
+ // create a repeating sample
+ var repeatingSample = context.createBuffer(1, 2, context.sampleRate);
+ var c = repeatingSample.getChannelData(0);
+ for (var i = 0; i < repeatingSample.length; ++i) {
+ c[i] = i % 2 == 0 ? 1 : -1;
+ }
+
+ OFFSETS.forEach(function (offset, offsetIdx) {
+ // Schedule a set of nodes to repeat the sample.
+ for (var i = 0; i < LENGTH; i += repeatingSample.length) {
+ var source = context.createBufferSource();
+ source.buffer = repeatingSample;
+ source.connect(gain);
+ source.start((offsetIdx * LENGTH + i + offset) / context.sampleRate);
+ }
+
+ buffer = context.createBuffer(1, LENGTH, context.sampleRate);
+ c = buffer.getChannelData(0);
+ for (var i = 0; i < buffer.length; ++i) {
+ c[i] = i % 2 == 0 ? -1 : 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.connect(gain);
+ source.start((offsetIdx * LENGTH + offset) / context.sampleRate);
+ });
+
+ return gain;
+ },
+
+ createExpectedBuffers: function(context) {
+ return context.createBuffer(1, gTest.length, context.sampleRate);
+ },
+};
+
+runTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_channelMergerNode.html b/dom/media/webaudio/test/test_channelMergerNode.html
new file mode 100644
index 000000000..a76aaa2e8
--- /dev/null
+++ b/dom/media/webaudio/test/test_channelMergerNode.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ChannelMergerNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 6,
+ createGraph: function(context) {
+ var buffers = [];
+ for (var j = 0; j < 6; ++j) {
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * (j + 1) * Math.PI * i / context.sampleRate);
+ // Second channel is silent
+ }
+ buffers.push(buffer);
+ }
+
+ var merger = context.createChannelMerger();
+ is(merger.channelCount, 1, "merger node has 1 input channels");
+ is(merger.channelCountMode, "explicit", "Correct channelCountMode for the merger node");
+ is(merger.channelInterpretation, "speakers", "Correct channelCountInterpretation for the merger node");
+
+ for (var i = 0; i < 6; ++i) {
+ var source = context.createBufferSource();
+ source.buffer = buffers[i];
+ source.connect(merger, 0, i);
+ source.start(0);
+ }
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(6, 2048, context.sampleRate);
+ for (var i = 0; i < 6; ++i) {
+ for (var j = 0; j < 2048; ++j) {
+ expectedBuffer.getChannelData(i)[j] = 0.5 * Math.sin(440 * 2 * (i + 1) * Math.PI * j / context.sampleRate);
+ }
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_channelMergerNodeWithVolume.html b/dom/media/webaudio/test/test_channelMergerNodeWithVolume.html
new file mode 100644
index 000000000..22f0a39cb
--- /dev/null
+++ b/dom/media/webaudio/test/test_channelMergerNodeWithVolume.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ChannelMergerNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 6,
+ createGraph: function(context) {
+ var buffers = [];
+ for (var j = 0; j < 6; ++j) {
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * (j + 1) * Math.PI * i / context.sampleRate);
+ // Second channel is silent
+ }
+ buffers.push(buffer);
+ }
+
+ var merger = context.createChannelMerger();
+ is(merger.channelCount, 1, "merger node has 1 input channels");
+ is(merger.channelCountMode, "explicit", "Correct channelCountMode for the merger node");
+ is(merger.channelInterpretation, "speakers", "Correct channelCountInterpretation for the merger node");
+
+ for (var i = 0; i < 6; ++i) {
+ var source = context.createBufferSource();
+ source.buffer = buffers[i];
+ var gain = context.createGain();
+ gain.gain.value = 0.5;
+ source.connect(gain);
+ gain.connect(merger, 0, i);
+ source.start(0);
+ }
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(6, 2048, context.sampleRate);
+ for (var i = 0; i < 6; ++i) {
+ for (var j = 0; j < 2048; ++j) {
+ expectedBuffer.getChannelData(i)[j] = 0.5 * 0.5 * Math.sin(440 * 2 * (i + 1) * Math.PI * j / context.sampleRate);
+ }
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_channelSplitterNode.html b/dom/media/webaudio/test/test_channelSplitterNode.html
new file mode 100644
index 000000000..30cb0028c
--- /dev/null
+++ b/dom/media/webaudio/test/test_channelSplitterNode.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ChannelSplitterNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// We do not use our generic graph test framework here because
+// the splitter node is special in that it creates multiple
+// output ports.
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(4, 2048, context.sampleRate);
+ for (var j = 0; j < 4; ++j) {
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(j)[i] = Math.sin(440 * 2 * (j + 1) * Math.PI * i / context.sampleRate);
+ }
+ }
+ var emptyBuffer = context.createBuffer(1, 2048, context.sampleRate);
+
+ var destination = context.destination;
+
+ var source = context.createBufferSource();
+
+ var splitter = context.createChannelSplitter();
+ is(splitter.channelCount, 2, "splitter node has 2 input channels by default");
+ is(splitter.channelCountMode, "max", "Correct channelCountMode for the splitter node");
+ is(splitter.channelInterpretation, "speakers", "Correct channelCountInterpretation for the splitter node");
+
+ source.buffer = buffer;
+ source.connect(splitter);
+
+ var channelsSeen = 0;
+ function createHandler(i) {
+ return function(e) {
+ is(e.inputBuffer.numberOfChannels, 1, "Correct input channel count");
+ if (i < 4) {
+ compareChannels(e.inputBuffer.getChannelData(0), buffer.getChannelData(i));
+ } else {
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0));
+ }
+ e.target.onaudioprocess = null;
+ ++channelsSeen;
+
+ if (channelsSeen == 6) {
+ SimpleTest.finish();
+ }
+ };
+ }
+
+ for (var i = 0; i < 6; ++i) {
+ var sp = context.createScriptProcessor(2048, 1);
+ splitter.connect(sp, i);
+ sp.onaudioprocess = createHandler(i);
+ sp.connect(destination);
+ }
+
+ source.start(0);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_channelSplitterNodeWithVolume.html b/dom/media/webaudio/test/test_channelSplitterNodeWithVolume.html
new file mode 100644
index 000000000..8e16271f3
--- /dev/null
+++ b/dom/media/webaudio/test/test_channelSplitterNodeWithVolume.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ChannelSplitterNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// We do not use our generic graph test framework here because
+// the splitter node is special in that it creates multiple
+// output ports.
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(4, 2048, context.sampleRate);
+ var expectedBuffer = context.createBuffer(4, 2048, context.sampleRate);
+ for (var j = 0; j < 4; ++j) {
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(j)[i] = Math.sin(440 * 2 * (j + 1) * Math.PI * i / context.sampleRate);
+ expectedBuffer.getChannelData(j)[i] = buffer.getChannelData(j)[i] / 2;
+ }
+ }
+ var emptyBuffer = context.createBuffer(1, 2048, context.sampleRate);
+
+ var destination = context.destination;
+
+ var source = context.createBufferSource();
+
+ var splitter = context.createChannelSplitter();
+ is(splitter.channelCount, 2, "splitter node has 2 input channels by default");
+ is(splitter.channelCountMode, "max", "Correct channelCountMode for the splitter node");
+ is(splitter.channelInterpretation, "speakers", "Correct channelCountInterpretation for the splitter node");
+
+ source.buffer = buffer;
+ var gain = context.createGain();
+ gain.gain.value = 0.5;
+ source.connect(gain);
+ gain.connect(splitter);
+
+ var channelsSeen = 0;
+ function createHandler(i) {
+ return function(e) {
+ is(e.inputBuffer.numberOfChannels, 1, "Correct input channel count");
+ if (i < 4) {
+ compareBuffers(e.inputBuffer.getChannelData(0), expectedBuffer.getChannelData(i));
+ } else {
+ compareBuffers(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0));
+ }
+ e.target.onaudioprocess = null;
+ ++channelsSeen;
+
+ if (channelsSeen == 6) {
+ SimpleTest.finish();
+ }
+ };
+ }
+
+ for (var i = 0; i < 6; ++i) {
+ var sp = context.createScriptProcessor(2048, 1);
+ splitter.connect(sp, i);
+ sp.onaudioprocess = createHandler(i);
+ sp.connect(destination);
+ }
+
+ source.start(0);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_convolverNode.html b/dom/media/webaudio/test/test_convolverNode.html
new file mode 100644
index 000000000..38b58bd9b
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNode.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the ConvolverNode interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var conv = context.createConvolver();
+
+ is(conv.channelCount, 2, "Convolver node has 2 input channels by default");
+ is(conv.channelCountMode, "clamped-max", "Correct channelCountMode for the Convolver node");
+ is(conv.channelInterpretation, "speakers", "Correct channelCountInterpretation for the Convolver node");
+
+ is(conv.buffer, null, "Default buffer value");
+ conv.buffer = context.createBuffer(2, 1024, 22050);
+ is(conv.normalize, true, "Default normalize value");
+
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_convolverNodeChannelCount.html b/dom/media/webaudio/test/test_convolverNodeChannelCount.html
new file mode 100644
index 000000000..d5b261c81
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNodeChannelCount.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ConvolverNode channel count</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+const signalLength = 2048;
+const responseLength = 1000;
+const outputLength = 2048; // < signalLength + responseLength to test bug 910171
+
+var gTest = {
+ length: outputLength,
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(2, signalLength, context.sampleRate);
+ for (var i = 0; i < signalLength; ++i) {
+ var sample = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ // When mixed into a single channel, this produces silence
+ buffer.getChannelData(0)[i] = sample;
+ buffer.getChannelData(1)[i] = -sample;
+ }
+
+ var response = context.createBuffer(2, responseLength, context.sampleRate);
+ for (var i = 0; i < responseLength; ++i) {
+ response.getChannelData(0)[i] = i / responseLength;
+ response.getChannelData(1)[i] = 1 - (i / responseLength);
+ }
+
+ var convolver = context.createConvolver();
+ convolver.buffer = response;
+ convolver.channelCount = 1;
+
+ expectException(function() { convolver.channelCount = 3; },
+ DOMException.NOT_SUPPORTED_ERR);
+ convolver.channelCountMode = "explicit";
+ expectException(function() { convolver.channelCountMode = "max"; },
+ DOMException.NOT_SUPPORTED_ERR);
+ convolver.channelInterpretation = "discrete";
+ convolver.channelInterpretation = "speakers";
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.connect(convolver);
+ source.start(0);
+
+ return convolver;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_convolverNodeDelay.html b/dom/media/webaudio/test/test_convolverNodeDelay.html
new file mode 100644
index 000000000..2e8caf802
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNodeDelay.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<title>Test convolution to delay a triangle pulse</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const sampleRate = 48000;
+const LENGTH = 12800;
+// tolerate 16-bit math.
+const EPSILON = 1.0 / Math.pow(2, 15);
+
+// Triangle pulse
+var sourceBuffer = new OfflineAudioContext(1, 1, sampleRate).
+ createBuffer(1, 2 * 128, sampleRate);
+var channelData = sourceBuffer.getChannelData(0);
+for (var i = 0; i < 128; ++i) {
+ channelData[i] = i/128;
+ channelData[128 + i] = 1.0 - i/128;
+}
+
+function test_delay_index(delayIndex) {
+
+ var context = new OfflineAudioContext(2, LENGTH, sampleRate);
+
+ var merger = context.createChannelMerger(2);
+ merger.connect(context.destination);
+
+ var impulse = context.createBuffer(1, delayIndex + 1, sampleRate);
+ impulse.getChannelData(0)[delayIndex] = 1.0;
+ var convolver = context.createConvolver();
+ convolver.normalize = false;
+ convolver.buffer = impulse;
+ convolver.connect(merger, 0, 0);
+
+ var delayTime = delayIndex/sampleRate;
+ var delay = context.createDelay(delayTime || 1/sampleRate);
+ delay.delayTime.value = delayTime;
+ delay.connect(merger, 0, 1);
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+ source.connect(convolver);
+ source.connect(delay);
+ source.start(0);
+
+ return context.startRendering().
+ then((buffer) => {
+ var convolverOutput = buffer.getChannelData(0);
+ var delayOutput = buffer.getChannelData(1);
+ var maxDiff = 0.0;
+ var maxIndex = 0;
+ for (var i = 0; i < buffer.length; ++i) {
+ var diff = Math.abs(convolverOutput[i] - delayOutput[i]);
+ if (diff > maxDiff) {
+ maxDiff = diff;
+ maxIndex = i;
+ }
+ }
+ // The convolver should produce similar output to the delay.
+ assert_approx_equals(convolverOutput[maxIndex], delayOutput[maxIndex],
+ EPSILON, "output at " + maxIndex);
+ });
+}
+
+// The 5/4 ratio provides sampling across a range of delays and offsets within
+// blocks.
+for (var delayIndex = 0;
+ delayIndex < LENGTH;
+ delayIndex = Math.floor((5 * (delayIndex + 1)) / 4)) {
+ promise_test(test_delay_index.bind(null, delayIndex),
+ "Delay " + delayIndex);
+}
+</script>
diff --git a/dom/media/webaudio/test/test_convolverNodeFiniteInfluence.html b/dom/media/webaudio/test/test_convolverNodeFiniteInfluence.html
new file mode 100644
index 000000000..1cfb51ce8
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNodeFiniteInfluence.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>Test convolution effect has finite duration</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+promise_test(function() {
+
+ const responseLength = 256;
+ // Accept an influence period of twice the responseLength to accept FFT
+ // implementations.
+ const tolerancePeriod = 2 * responseLength;
+ const totalSize = tolerancePeriod + responseLength;
+
+ var context = new OfflineAudioContext(1, totalSize, 48000);
+
+ var responseBuffer =
+ context.createBuffer(1, responseLength, context.sampleRate);
+ var responseChannelData = responseBuffer.getChannelData(0);
+ responseChannelData[0] = 1;
+ responseChannelData[responseLength - 1] = 1;
+ var convolver = context.createConvolver();
+ convolver.buffer = responseBuffer;
+ convolver.connect(context.destination);
+
+ var sourceBuffer = context.createBuffer(1, totalSize, context.sampleRate);
+ sourceBuffer.getChannelData(0)[0] = NaN;
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+ source.connect(convolver);
+ source.start();
+
+ return context.startRendering().
+ then((buffer) => {
+ var convolverOutput = buffer.getChannelData(0);
+ // There should be no non-zeros after the tolerance period.
+ var testIndex = tolerancePeriod;
+ for (;
+ testIndex < buffer.length - 1 && convolverOutput[testIndex] == 0;
+ ++testIndex) {
+ }
+ assert_equals(convolverOutput[testIndex], 0, "output at " + testIndex);
+ });
+});
+</script>
diff --git a/dom/media/webaudio/test/test_convolverNodePassThrough.html b/dom/media/webaudio/test/test_convolverNodePassThrough.html
new file mode 100644
index 000000000..d5f9ef8ab
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNodePassThrough.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ConvolverNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var convolver = context.createConvolver();
+
+ source.buffer = this.buffer;
+ convolver.buffer = this.buffer;
+
+ source.connect(convolver);
+
+ var convolverWrapped = SpecialPowers.wrap(convolver);
+ ok("passThrough" in convolverWrapped, "ConvolverNode should support the passThrough API");
+ convolverWrapped.passThrough = true;
+
+ source.start(0);
+ return convolver;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_convolverNodeWithGain.html b/dom/media/webaudio/test/test_convolverNodeWithGain.html
new file mode 100644
index 000000000..7bbe24089
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNodeWithGain.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ConvolverNode after a GainNode - Bug 891254 </title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+const signalLength = 2048;
+const responseLength = 100;
+const outputLength = 4096; // > signalLength + responseLength
+
+var gTest = {
+ length: outputLength,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, signalLength, context.sampleRate);
+ for (var i = 0; i < signalLength; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(2 * Math.PI * i / signalLength);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.start(0);
+
+ var response = context.createBuffer(1, responseLength, context.sampleRate);
+ for (var i = 0; i < responseLength; ++i) {
+ response.getChannelData(0)[i] = i / responseLength;
+ }
+
+ var gain = context.createGain();
+ gain.gain.value = -1;
+ source.connect(gain);
+
+ var convolver1 = context.createConvolver();
+ convolver1.buffer = response;
+ gain.connect(convolver1);
+
+ var convolver2 = context.createConvolver();
+ convolver2.buffer = response;
+ source.connect(convolver2);
+
+ // The output of convolver1 should be the inverse of convolver2, so blend
+ // them together and expect silence.
+ var blend = context.createGain();
+ convolver1.connect(blend);
+ convolver2.connect(blend);
+
+ return blend;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_convolverNode_mono_mono.html b/dom/media/webaudio/test/test_convolverNode_mono_mono.html
new file mode 100644
index 000000000..f7da2b020
--- /dev/null
+++ b/dom/media/webaudio/test/test_convolverNode_mono_mono.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+<script type="text/javascript" src="webaudio.js"></script>
+<script type="text/javascript" src="layouttest-glue.js"></script>
+<script type="text/javascript" src="blink/audio-testing.js"></script>
+<script type="text/javascript" src="blink/convolution-testing.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+
+<body>
+
+<div id="description"></div>
+<div id="console"></div>
+
+<script>
+description("Tests ConvolverNode processing a mono channel with mono impulse response.");
+SimpleTest.waitForExplicitFinish();
+
+// To test the convolver, we convolve two square pulses together to
+// produce a triangular pulse. To verify the result is correct we
+// check several parts of the result. First, we make sure the initial
+// part of the result is zero (due to the latency in the convolver).
+// Next, the triangular pulse should match the theoretical result to
+// within some roundoff. After the triangular pulse, the result
+// should be exactly zero, but round-off prevents that. We make sure
+// the part after the pulse is sufficiently close to zero. Finally,
+// the result should be exactly zero because the inputs are exactly
+// zero.
+function runTest() {
+ if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+ }
+
+ window.jsTestIsAsync = true;
+
+ // Create offline audio context.
+ var context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+ var squarePulse = createSquarePulseBuffer(context, pulseLengthFrames);
+ var trianglePulse = createTrianglePulseBuffer(context, 2 * pulseLengthFrames);
+
+ var bufferSource = context.createBufferSource();
+ bufferSource.buffer = squarePulse;
+
+ var convolver = context.createConvolver();
+ convolver.normalize = false;
+ convolver.buffer = squarePulse;
+
+ bufferSource.connect(convolver);
+ convolver.connect(context.destination);
+
+ bufferSource.start(0);
+
+ context.oncomplete = checkConvolvedResult(trianglePulse);
+ context.startRendering();
+}
+
+function finishJSTest() {
+ SimpleTest.finish();
+}
+
+runTest();
+successfullyParsed = true;
+
+</script>
+
+<script src="../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_currentTime.html b/dom/media/webaudio/test/test_currentTime.html
new file mode 100644
index 000000000..bb015e5e2
--- /dev/null
+++ b/dom/media/webaudio/test/test_currentTime.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioContext.currentTime</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("This test needs to wait a while for the AudioContext's timer to start.");
+addLoadEvent(function() {
+ var ac = new AudioContext();
+ is(ac.currentTime, 0, "AudioContext.currentTime should be 0 initially");
+ setTimeout(function() {
+ ok(ac.currentTime > 0, "AudioContext.currentTime should have increased by now");
+ SimpleTest.finish();
+ }, 1000);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_decodeAudioDataPromise.html b/dom/media/webaudio/test/test_decodeAudioDataPromise.html
new file mode 100644
index 000000000..d07f55936
--- /dev/null
+++ b/dom/media/webaudio/test/test_decodeAudioDataPromise.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the decodeAudioData API with Promise</title>
+
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ <script src="webaudio.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+
+var finished = 0;
+
+function finish() {
+ if (++finished == 2) {
+ SimpleTest.finish();
+ }
+}
+
+var ac = new AudioContext();
+// Test that a the promise is rejected with an invalid source buffer.
+expectNoException(function() {
+ var p = ac.decodeAudioData(" ");
+ ok(p instanceof Promise, "AudioContext.decodeAudioData should return a Promise");
+ p.then(function(data) {
+ ok(false, "Promise should not resolve with an invalid source buffer.");
+ finish();
+ }).catch(function(e) {
+ ok(true, "Promise should be rejected with an invalid source buffer.");
+ ok(e.name == "TypeError", "The error should be TypeError");
+ finish();
+ })
+});
+
+// Test that a the promise is resolved with a valid source buffer.
+var xhr = new XMLHttpRequest();
+xhr.open("GET", "ting-44.1k-1ch.ogg", true);
+xhr.responseType = "arraybuffer";
+xhr.onload = function() {
+ var p = ac.decodeAudioData(xhr.response);
+ ok(p instanceof Promise, "AudioContext.decodeAudioData should return a Promise");
+ p.then(function(data) {
+ ok(data instanceof AudioBuffer, "Promise should resolve, passing an AudioBuffer");
+ ok(true, "Promise should resolve with a valid source buffer.");
+ finish();
+ }).catch(function() {
+ ok(false, "Promise should not be rejected with a valid source buffer.");
+ finish();
+ });
+};
+xhr.send();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_decodeMultichannel.html b/dom/media/webaudio/test/test_decodeMultichannel.html
new file mode 100644
index 000000000..0fb2f5b3c
--- /dev/null
+++ b/dom/media/webaudio/test/test_decodeMultichannel.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset=utf-8>
+<head>
+ <title>Test that we can decode 4 channel wave file in webaudio, but not in &lt;audio&gt;</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var filename = "audio-quad.wav";
+
+SimpleTest.waitForExplicitFinish();
+
+function finishTest(a) {
+ if (a) {
+ a = null;
+ SimpleTest.finish();
+ }
+}
+
+function decodeUsingAudioElement() {
+ var a = new Audio();
+ a.addEventListener("error", function() {
+ ok(false, "Error loading metadata");
+ finishTest(a);
+ });
+ a.addEventListener("loadedmetadata", function() {
+ ok(true, "Metadata Loaded");
+ finishTest(a);
+ });
+
+ a.src = filename;
+ a.load();
+}
+
+addLoadEvent(function() {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", filename);
+ xhr.responseType = "arraybuffer";
+ xhr.onload = function() {
+ var context = new AudioContext();
+ context.decodeAudioData(xhr.response, function(b) {
+ ok(true, "Decoding of a wave file with four channels succeded.");
+ is(b.numberOfChannels, 4, "The AudioBuffer should have 4 channels.");
+ decodeUsingAudioElement();
+ }, function() {
+ ok(false, "Decoding of a wave file with four channels failed.");
+ decodeUsingAudioElement();
+ });
+ };
+ xhr.send(null);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_decodeOpusTail.html b/dom/media/webaudio/test/test_decodeOpusTail.html
new file mode 100644
index 000000000..b5b53f685
--- /dev/null
+++ b/dom/media/webaudio/test/test_decodeOpusTail.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Regression test to check that opus files don't have a tail at the end.</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+// This gets a 1 second Opus file and decodes it to a buffer. The opus file is
+// decoded at 48kHz, and the OfflineAudioContext is also at 48kHz, no resampling
+// is taking place.
+fetch('sweep-300-330-1sec.opus')
+.then(function(response) { return response.arrayBuffer(); })
+.then(function(buffer) {
+ var off = new OfflineAudioContext(1, 128, 48000);
+ off.decodeAudioData(buffer, function(decoded) {
+ var pcm = decoded.getChannelData(0);
+ is(pcm.length, 48000, "The length of the decoded file is correct.");
+ SimpleTest.finish();
+ });
+});
+
+</script>
diff --git a/dom/media/webaudio/test/test_delayNode.html b/dom/media/webaudio/test/test_delayNode.html
new file mode 100644
index 000000000..a3e314ef7
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNode.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DelayNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+
+ var delay = context.createDelay();
+
+ source.buffer = buffer;
+
+ source.connect(delay);
+
+ ok(delay.delayTime, "The audioparam member must exist");
+ is(delay.delayTime.value, 0, "Correct initial value");
+ is(delay.delayTime.defaultValue, 0, "Correct default value");
+ delay.delayTime.value = 0.5;
+ is(delay.delayTime.value, 0.5, "Correct initial value");
+ is(delay.delayTime.defaultValue, 0, "Correct default value");
+ is(delay.channelCount, 2, "delay node has 2 input channels by default");
+ is(delay.channelCountMode, "max", "Correct channelCountMode for the delay node");
+ is(delay.channelInterpretation, "speakers", "Correct channelCountInterpretation for the delay node");
+
+ expectException(function() {
+ context.createDelay(0);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() {
+ context.createDelay(180);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectTypeError(function() {
+ context.createDelay(NaN);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() {
+ context.createDelay(-1);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ context.createDelay(1); // should not throw
+
+ // Delay the source stream by 2048 frames
+ delay.delayTime.value = 2048 / context.sampleRate;
+
+ source.start(0);
+ return delay;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048 * 2, context.sampleRate);
+ for (var i = 2048; i < 2048 * 2; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * (i - 2048) / context.sampleRate);
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeAtMax.html b/dom/media/webaudio/test/test_delayNodeAtMax.html
new file mode 100644
index 000000000..6c7dde3d1
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeAtMax.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DelayNode with maxDelayTime delay - bug 890528</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+const signalLength = 2048;
+const delayLength = 1000; // Not on a block boundary
+const outputLength = 4096 // > signalLength + 2 * delayLength;
+
+function applySignal(buffer, offset) {
+ for (var i = 0; i < signalLength; ++i) {
+ buffer.getChannelData(0)[offset + i] = Math.cos(Math.PI * i / signalLength);
+ }
+}
+
+var gTest = {
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, signalLength, context.sampleRate);
+ applySignal(buffer, 0);
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ const delayTime = delayLength / context.sampleRate;
+ var delay = context.createDelay(delayTime);
+ delay.delayTime.value = delayTime;
+
+ source.connect(delay);
+
+ source.start(0);
+ return delay;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, outputLength, context.sampleRate);
+ applySignal(expectedBuffer, delayLength);
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeChannelChanges.html b/dom/media/webaudio/test/test_delayNodeChannelChanges.html
new file mode 100644
index 000000000..229bfd069
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeChannelChanges.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>test DelayNode channel count changes</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestCompleteLog();
+
+const bufferSize = 4096;
+
+var ctx;
+var testDelay;
+var stereoDelay;
+var invertor;
+
+function compareOutputs(callback) {
+ var processor = ctx.createScriptProcessor(bufferSize, 2, 0);
+ testDelay.connect(processor);
+ invertor.connect(processor);
+ processor.onaudioprocess =
+ function(e) {
+ compareBuffers(e.inputBuffer,
+ ctx.createBuffer(2, bufferSize, ctx.sampleRate));
+ e.target.onaudioprocess = null;
+ callback();
+ }
+}
+
+function startTest() {
+ // And a two-channel signal
+ var merger = ctx.createChannelMerger();
+ merger.connect(testDelay);
+ merger.connect(stereoDelay);
+ var oscL = ctx.createOscillator();
+ oscL.connect(merger, 0, 0);
+ oscL.start(0);
+ var oscR = ctx.createOscillator();
+ oscR.type = "sawtooth";
+ oscR.connect(merger, 0, 1);
+ oscR.start(0);
+
+ compareOutputs(
+ function () {
+ // Disconnect the two-channel signal and test again
+ merger.disconnect();
+ compareOutputs(SimpleTest.finish);
+ });
+}
+
+function prepareTest() {
+ ctx = new AudioContext();
+
+ // The output of a test delay node with mono and stereo input will be
+ // compared with that of separate mono and stereo delay nodes.
+ const delayTime = 0.3 * bufferSize / ctx.sampleRate;
+ testDelay = ctx.createDelay(delayTime);
+ testDelay.delayTime.value = delayTime;
+ monoDelay = ctx.createDelay(delayTime);
+ monoDelay.delayTime.value = delayTime;
+ stereoDelay = ctx.createDelay(delayTime);
+ stereoDelay.delayTime.value = delayTime;
+
+ // Create a one-channel signal and connect to the delay nodes
+ var monoOsc = ctx.createOscillator();
+ monoOsc.frequency.value = 110;
+ monoOsc.connect(testDelay);
+ monoOsc.connect(monoDelay);
+ monoOsc.start(0);
+
+ // Invert the expected so that mixing with the test will find the difference.
+ invertor = ctx.createGain();
+ invertor.gain.value = -1.0;
+ monoDelay.connect(invertor);
+ stereoDelay.connect(invertor);
+
+ // Start the test after the delay nodes have begun processing.
+ var processor = ctx.createScriptProcessor(bufferSize, 1, 0);
+ processor.connect(ctx.destination);
+
+ processor.onaudioprocess =
+ function(e) {
+ e.target.onaudioprocess = null;
+ processor.disconnect();
+ startTest();
+ };
+}
+prepareTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeCycles.html b/dom/media/webaudio/test/test_delayNodeCycles.html
new file mode 100644
index 000000000..f5f2e6786
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeCycles.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the support of cycles.</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+const sampleRate = 48000;
+const inputLength = 2048;
+
+addLoadEvent(function() {
+ function addSine(b) {
+ for (var i = 0; i < b.length; i++) {
+ b[i] += Math.sin(440 * 2 * Math.PI * i / sampleRate);
+ }
+ }
+
+ function getSineBuffer(ctx) {
+ var buffer = ctx.createBuffer(1, inputLength, ctx.sampleRate);
+ addSine(buffer.getChannelData(0));
+ return buffer;
+ }
+
+ function createAndPlayWithCycleAndDelayNode(ctx, delayFrames) {
+ var source = ctx.createBufferSource();
+ source.buffer = getSineBuffer(ctx);
+
+ var gain = ctx.createGain();
+ var delay = ctx.createDelay();
+ delay.delayTime.value = delayFrames/ctx.sampleRate;
+
+ source.connect(gain);
+ gain.connect(delay);
+ delay.connect(ctx.destination);
+ // cycle
+ delay.connect(gain);
+
+ source.start(0);
+ }
+
+ function createAndPlayWithCycleAndNoDelayNode(ctx) {
+ var source = ctx.createBufferSource();
+ source.loop = true;
+ source.buffer = getSineBuffer(ctx);
+
+ var gain = ctx.createGain();
+ var gain2 = ctx.createGain();
+
+ source.connect(gain);
+ gain.connect(gain2);
+ // cycle
+ gain2.connect(gain);
+ gain2.connect(ctx.destination);
+
+ source.start(0);
+ }
+
+ function createAndPlayWithCycleAndNoDelayNodeInCycle(ctx) {
+ var source = ctx.createBufferSource();
+ source.loop = true;
+ source.buffer = getSineBuffer(ctx);
+
+ var delay = ctx.createDelay();
+ var gain = ctx.createGain();
+ var gain2 = ctx.createGain();
+
+ // Their is a cycle, a delay, but the delay is not in the cycle.
+ source.connect(delay);
+ delay.connect(gain);
+ gain.connect(gain2);
+ // cycle
+ gain2.connect(gain);
+ gain2.connect(ctx.destination);
+
+ source.start(0);
+ }
+
+ var remainingTests = 0;
+ function finish() {
+ if (--remainingTests == 0) {
+ SimpleTest.finish();
+ }
+ }
+
+ function getOfflineContext(oncomplete) {
+ var ctx = new OfflineAudioContext(1, sampleRate, sampleRate);
+ ctx.oncomplete = oncomplete;
+ return ctx;
+ }
+
+ function checkSilentBuffer(e) {
+ var buffer = e.renderedBuffer.getChannelData(0);
+ for (var i = 0; i < buffer.length; i++) {
+ if (buffer[i] != 0.0) {
+ ok(false, "buffer should be silent.");
+ finish();
+ return;
+ }
+ }
+ ok(true, "buffer should be silent.");
+ finish();
+ }
+
+ function checkNoisyBuffer(e, aDelayFrames) {
+ delayFrames = Math.max(128, aDelayFrames);
+
+ var expected = new Float32Array(e.renderedBuffer.length);
+ for (var i = delayFrames; i < expected.length; i += delayFrames) {
+ addSine(expected.subarray(i, i + inputLength));
+ }
+
+ compareChannels(e.renderedBuffer.getChannelData(0), expected);
+ finish();
+ }
+
+ function expectSilentOutput(f) {
+ remainingTests++;
+ var ctx = getOfflineContext(checkSilentBuffer);
+ f(ctx);
+ ctx.startRendering();
+ }
+
+ function expectNoisyOutput(delayFrames) {
+ remainingTests++;
+ var ctx = getOfflineContext();
+ ctx.oncomplete = function(e) { checkNoisyBuffer(e, delayFrames); };
+ createAndPlayWithCycleAndDelayNode(ctx, delayFrames);
+ ctx.startRendering();
+ }
+
+ // This is trying to make a graph with a cycle and no DelayNode in the graph.
+ // The cycle subgraph should be muted, in this graph the output should be silent.
+ expectSilentOutput(createAndPlayWithCycleAndNoDelayNode);
+ // This is trying to make a graph with a cycle and a DelayNode in the graph, but
+ // not part of the cycle.
+ // The cycle subgraph should be muted, in this graph the output should be silent.
+ expectSilentOutput(createAndPlayWithCycleAndNoDelayNodeInCycle);
+ // Those are making legal graphs, with at least one DelayNode in the cycle.
+ // There should be some non-silent output.
+ expectNoisyOutput(sampleRate/4);
+ // DelayNode.delayTime will be clamped to 128/ctx.sampleRate.
+ // There should be some non-silent output.
+ expectNoisyOutput(0);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodePassThrough.html b/dom/media/webaudio/test/test_delayNodePassThrough.html
new file mode 100644
index 000000000..4945ee95c
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodePassThrough.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DelayNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var delay = context.createDelay();
+
+ source.buffer = this.buffer;
+
+ source.connect(delay);
+
+ delay.delayTime.value = 0.5;
+
+ // Delay the source stream by 2048 frames
+ delay.delayTime.value = 2048 / context.sampleRate;
+
+ var delayWrapped = SpecialPowers.wrap(delay);
+ ok("passThrough" in delayWrapped, "DelayNode should support the passThrough API");
+ delayWrapped.passThrough = true;
+
+ source.start(0);
+ return delay;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ var silence = context.createBuffer(1, 2048, context.sampleRate);
+
+ return [this.buffer, silence];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeSmallMaxDelay.html b/dom/media/webaudio/test/test_delayNodeSmallMaxDelay.html
new file mode 100644
index 000000000..b9cee458d
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeSmallMaxDelay.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DelayNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var delay = context.createDelay(0.02);
+
+ source.buffer = this.buffer;
+
+ source.connect(delay);
+
+ source.start(0);
+ return delay;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ this.buffer = expectedBuffer;
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeTailIncrease.html b/dom/media/webaudio/test/test_delayNodeTailIncrease.html
new file mode 100644
index 000000000..751602824
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeTailIncrease.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test increasing delay of DelayNode after input finishes</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+const signalLength = 100;
+const bufferSize = 1024;
+// Delay should be long enough to allow CC to run
+const delayBufferCount = 50;
+const delayLength = delayBufferCount * bufferSize + 700;
+
+var count = 0;
+
+function applySignal(buffer, offset) {
+ for (var i = 0; i < signalLength; ++i) {
+ buffer.getChannelData(0)[offset + i] = Math.cos(Math.PI * i / signalLength);
+ }
+}
+
+function onAudioProcess(e) {
+ switch(count) {
+ case 5:
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+ break;
+ case delayBufferCount:
+ var offset = delayLength - count * bufferSize;
+ var ctx = e.target.context;
+ var expected = ctx.createBuffer(1, bufferSize, ctx.sampleRate);
+ applySignal(expected, offset);
+ compareBuffers(e.inputBuffer, expected);
+ SimpleTest.finish();
+ }
+ count++;
+}
+
+function startTest() {
+ var ctx = new AudioContext();
+ var processor = ctx.createScriptProcessor(bufferSize, 1, 0);
+ processor.onaudioprocess = onAudioProcess;
+
+ // Switch on delay at a time in the future.
+ var delayDuration = delayLength / ctx.sampleRate;
+ var delayStartTime = (delayLength - bufferSize) / ctx.sampleRate;
+ var delay = ctx.createDelay(delayDuration);
+ delay.delayTime.setValueAtTime(delayDuration, delayStartTime);
+ delay.connect(processor);
+
+ // Short signal that finishes before switching to long delay
+ var buffer = ctx.createBuffer(1, signalLength, ctx.sampleRate);
+ applySignal(buffer, 0);
+ var source = ctx.createBufferSource();
+ source.buffer = buffer;
+ source.start();
+ source.connect(delay);
+};
+
+startTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html b/dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html
new file mode 100644
index 000000000..fa431d61b
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test tail time lifetime of DelayNode after input is disconnected</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// Web Audio doesn't provide a means to precisely time disconnect()s but we
+// can test that the output of delay nodes matches the output from their
+// sources before they are disconnected.
+
+SimpleTest.waitForExplicitFinish();
+
+const signalLength = 128;
+const bufferSize = 4096;
+const sourceCount = bufferSize / signalLength;
+// Delay should be long enough to allow CC to run
+var delayBufferCount = 20;
+const delayLength = delayBufferCount * bufferSize;
+
+var sourceOutput = new Float32Array(bufferSize);
+var delayOutputCount = 0;
+var sources = [];
+
+function onDelayOutput(e) {
+ if (delayOutputCount < delayBufferCount) {
+ delayOutputCount++;
+ return;
+ }
+
+ compareChannels(e.inputBuffer.getChannelData(0), sourceOutput);
+ e.target.onaudioprocess = null;
+ SimpleTest.finish();
+}
+
+function onSourceOutput(e) {
+ // Record the first buffer
+ e.inputBuffer.copyFromChannel(sourceOutput, 0);
+ e.target.onaudioprocess = null;
+}
+
+function disconnectSources() {
+ for (var i = 0; i < sourceCount; ++i) {
+ sources[i].disconnect();
+ }
+
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+}
+
+function startTest() {
+ var ctx = new AudioContext();
+
+ var sourceProcessor = ctx.createScriptProcessor(bufferSize, 1, 0);
+ sourceProcessor.onaudioprocess = onSourceOutput;
+ // Keep audioprocess events going after source disconnect.
+ sourceProcessor.connect(ctx.destination);
+
+ var delayProcessor = ctx.createScriptProcessor(bufferSize, 1, 0);
+ delayProcessor.onaudioprocess = onDelayOutput;
+
+ var delayDuration = delayLength / ctx.sampleRate;
+ for (var i = 0; i < sourceCount; ++i) {
+ var delay = ctx.createDelay(delayDuration);
+ delay.delayTime.value = delayDuration;
+ delay.connect(delayProcessor);
+
+ var source = ctx.createOscillator();
+ source.frequency.value = 440 + 10 * i
+ source.start(i * signalLength / ctx.sampleRate);
+ source.stop((i + 1) * signalLength / ctx.sampleRate);
+ source.connect(delay);
+ source.connect(sourceProcessor);
+
+ sources[i] = source;
+ }
+
+ // Assuming the above Web Audio operations have already scheduled an event
+ // to run in stable state and start the graph thread, schedule a subsequent
+ // event to disconnect the sources, which will remove main thread connection
+ // references before it knows the graph thread has started using the source
+ // streams.
+ SimpleTest.executeSoon(disconnectSources);
+};
+
+startTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeTailWithGain.html b/dom/media/webaudio/test/test_delayNodeTailWithGain.html
new file mode 100644
index 000000000..6994a7f9d
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeTailWithGain.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test tail time lifetime of DelayNode indirectly connected to source</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+const signalLength = 130;
+const bufferSize = 1024;
+// Delay should be long enough to allow CC to run
+const delayBufferCount = 50;
+const delayLength = delayBufferCount * bufferSize + 700;
+
+var count = 0;
+
+function applySignal(buffer, offset) {
+ for (var i = 0; i < signalLength; ++i) {
+ buffer.getChannelData(0)[offset + i] = Math.cos(Math.PI * i / signalLength);
+ }
+}
+
+function onAudioProcess(e) {
+ switch(count) {
+ case 5:
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+ break;
+ case delayBufferCount:
+ var offset = delayLength - count * bufferSize;
+ var ctx = e.target.context;
+ var expected = ctx.createBuffer(1, bufferSize, ctx.sampleRate);
+ applySignal(expected, offset);
+ compareBuffers(e.inputBuffer, expected);
+ SimpleTest.finish();
+ }
+ count++;
+}
+
+function startTest() {
+ var ctx = new AudioContext();
+ var processor = ctx.createScriptProcessor(bufferSize, 1, 0);
+ processor.onaudioprocess = onAudioProcess;
+
+ var delayDuration = delayLength / ctx.sampleRate;
+ var delay = ctx.createDelay(delayDuration);
+ delay.delayTime.value = delayDuration;
+ delay.connect(processor);
+
+ var gain = ctx.createGain();
+ gain.connect(delay);
+
+ // Short signal that finishes before garbage collection
+ var buffer = ctx.createBuffer(1, signalLength, ctx.sampleRate);
+ applySignal(buffer, 0);
+ var source = ctx.createBufferSource();
+ source.buffer = buffer;
+ source.start();
+ source.connect(gain);
+};
+
+startTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeTailWithReconnect.html b/dom/media/webaudio/test/test_delayNodeTailWithReconnect.html
new file mode 100644
index 000000000..6c1cda580
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeTailWithReconnect.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test tail time lifetime of DelayNode after input finishes and new input added</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// The buffer source will start on a block boundary, so keeping the signal
+// within one block ensures that it will not cross AudioProcessingEvent buffer
+// boundaries.
+const signalLength = 128;
+const bufferSize = 1024;
+// Delay should be long enough to allow CC to run
+var delayBufferCount = 50;
+var delayBufferOffset;
+const delayLength = delayBufferCount * bufferSize;
+
+var phase = "initial";
+var sourceCount = 0;
+var delayCount = 0;
+var oscillator;
+var delay;
+var source;
+
+function applySignal(buffer, offset) {
+ for (var i = 0; i < signalLength; ++i) {
+ buffer.getChannelData(0)[offset + i] = Math.cos(Math.PI * i / signalLength);
+ }
+}
+
+function bufferIsSilent(buffer, out) {
+ for (var i = 0; i < buffer.length; ++i) {
+ if (buffer.getChannelData(0)[i] != 0) {
+ if (out) {
+ out.soundOffset = i;
+ }
+ return false;
+ }
+ }
+ return true;
+}
+
+function onDelayOutput(e) {
+ switch(phase) {
+
+ case "initial":
+ // Wait for oscillator sound to exit delay
+ if (bufferIsSilent(e.inputBuffer))
+ break;
+
+ phase = "played oscillator";
+ break;
+
+ case "played oscillator":
+ // First tail time has expired. Start second source and remove references
+ // to the delay and connected second source.
+ oscillator.disconnect();
+ source.connect(delay);
+ source.start();
+ source = null;
+ delay = null;
+ phase = "started second source";
+ break;
+
+ case "second tail time":
+ if (delayCount == delayBufferCount) {
+ var ctx = e.target.context;
+ var expected = ctx.createBuffer(1, bufferSize, ctx.sampleRate);
+ applySignal(expected, delayBufferOffset);
+ compareBuffers(e.inputBuffer, expected);
+ e.target.onaudioprocess = null;
+ SimpleTest.finish();
+ }
+ }
+
+ delayCount++;
+}
+
+function onSourceOutput(e) {
+ switch(phase) {
+ case "started second source":
+ var out = {};
+ if (!bufferIsSilent(e.inputBuffer, out)) {
+ delayBufferCount += sourceCount;
+ delayBufferOffset = out.soundOffset;
+ phase = "played second source";
+ }
+ break;
+ case "played second source":
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+ phase = "second tail time";
+ e.target.onaudioprocess = null;
+ }
+
+ sourceCount++;
+}
+
+function startTest() {
+ var ctx = new AudioContext();
+ var delayDuration = delayLength / ctx.sampleRate;
+ delay = ctx.createDelay(delayDuration);
+ delay.delayTime.value = delayDuration;
+ var processor1 = ctx.createScriptProcessor(bufferSize, 1, 0);
+ delay.connect(processor1);
+ processor1.onaudioprocess = onDelayOutput;
+
+ // Signal to trigger initial tail time reference
+ oscillator = ctx.createOscillator();
+ oscillator.start(0);
+ oscillator.stop(100/ctx.sampleRate);
+ oscillator.connect(delay);
+
+ // Short signal, not started yet, with a ScriptProcessor to detect when it
+ // starts. It should finish before garbage collection.
+ var buffer = ctx.createBuffer(1, signalLength, ctx.sampleRate);
+ applySignal(buffer, 0);
+ source = ctx.createBufferSource();
+ source.buffer = buffer;
+ var processor2 = ctx.createScriptProcessor(bufferSize, 1, 0);
+ source.connect(processor2);
+ processor2.onaudioprocess = onSourceOutput;
+};
+
+startTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_delayNodeWithGain.html b/dom/media/webaudio/test/test_delayNodeWithGain.html
new file mode 100644
index 000000000..768bea77c
--- /dev/null
+++ b/dom/media/webaudio/test/test_delayNodeWithGain.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DelayNode with a GainNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+
+ var delay = context.createDelay();
+
+ source.buffer = buffer;
+
+ var gain = context.createGain();
+ gain.gain.value = 0.5;
+
+ source.connect(gain);
+ gain.connect(delay);
+
+ // Delay the source stream by 2048 frames
+ delay.delayTime.value = 2048 / context.sampleRate;
+
+ source.start(0);
+ return delay;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048 * 2, context.sampleRate);
+ for (var i = 2048; i < 2048 * 2; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * (i - 2048) / context.sampleRate) / 2;
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectAll.html b/dom/media/webaudio/test/test_disconnectAll.html
new file mode 100644
index 000000000..9d3af066e
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectAll.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 256, context.sampleRate);
+ var data = sourceBuffer.getChannelData(0);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain1 = context.createGain();
+ var gain2 = context.createGain();
+ var gain3 = context.createGain();
+ var merger = context.createChannelMerger(3);
+
+ source.connect(gain1);
+ source.connect(gain2);
+ source.connect(gain3);
+ gain1.connect(merger);
+ gain2.connect(merger);
+ gain3.connect(merger);
+ source.start();
+
+ source.disconnect();
+
+ return merger;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html> \ No newline at end of file
diff --git a/dom/media/webaudio/test/test_disconnectAudioParam.html b/dom/media/webaudio/test/test_disconnectAudioParam.html
new file mode 100644
index 000000000..1f4e79c56
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectAudioParam.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioParam</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 256, context.sampleRate);
+ var data = sourceBuffer.getChannelData(0);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var half = context.createGain();
+ var gain1 = context.createGain();
+ var gain2 = context.createGain();
+
+ half.gain.value = 0.5;
+
+ source.connect(gain1);
+ gain1.connect(gain2);
+ source.connect(half);
+
+ half.connect(gain1.gain);
+ half.connect(gain2.gain);
+
+ half.disconnect(gain2.gain);
+
+ source.start();
+
+ return gain2;
+ },
+ createExpectedBuffers: function(context) {
+ expectedBuffer = context.createBuffer(1, 256, context.sampleRate);
+ for (var i = 0; i < 256; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 1.5;
+ }
+
+ return expectedBuffer;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectAudioParamFromOutput.html b/dom/media/webaudio/test/test_disconnectAudioParamFromOutput.html
new file mode 100644
index 000000000..a08ffa53b
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectAudioParamFromOutput.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioParam</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(2, 256, context.sampleRate);
+ for (var i = 1; i <= 2; i++) {
+ var data = sourceBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = i;
+ }
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var half = context.createGain();
+ var gain1 = context.createGain();
+ var gain2 = context.createGain();
+ var splitter = context.createChannelSplitter(2);
+
+ half.gain.value = 0.5;
+
+ source.connect(gain1);
+ gain1.connect(gain2);
+ source.connect(half);
+ half.connect(splitter);
+ splitter.connect(gain1.gain, 0);
+ splitter.connect(gain2.gain, 1);
+
+ splitter.disconnect(gain2.gain, 1);
+
+ source.start();
+
+ return gain2;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(2, 256, context.sampleRate);
+ for (var i = 1; i <= 2; i++) {
+ var data = expectedBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = (i == 1) ? 1.5 : 3.0;
+ }
+ }
+
+ return expectedBuffer;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectExceptions.html b/dom/media/webaudio/test/test_disconnectExceptions.html
new file mode 100644
index 000000000..ceba972c9
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectExceptions.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var ctx = new AudioContext();
+ var sourceBuffer = ctx.createBuffer(2, 256, ctx.sampleRate);
+ for (var i = 1; i <= 2; i++) {
+ var data = sourceBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = i;
+ }
+ }
+
+ var source = ctx.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain1 = ctx.createGain();
+ var splitter = ctx.createChannelSplitter(2);
+ var merger = ctx.createChannelMerger(2);
+ var gain2 = ctx.createGain();
+ var gain3 = ctx.createGain();
+
+ gain1.connect(splitter);
+ splitter.connect(gain2, 0);
+ splitter.connect(gain3, 1);
+ splitter.connect(merger, 0, 0);
+ splitter.connect(merger, 1, 1);
+ gain2.connect(gain3);
+ gain3.connect(ctx.destination);
+ merger.connect(ctx.destination);
+
+ expectException(function() {
+ splitter.disconnect(2);
+ }, DOMException.INDEX_SIZE_ERR);
+
+ expectNoException(function() {
+ splitter.disconnect(1);
+ splitter.disconnect(1);
+ });
+
+ expectException(function() {
+ gain1.disconnect(gain2);
+ }, DOMException.INVALID_ACCESS_ERR);
+
+ expectException(function() {
+ gain1.disconnect(gain3);
+ ok(false, 'Should get InvalidAccessError exception');
+ }, DOMException.INVALID_ACCESS_ERR);
+
+ expectException(function() {
+ splitter.disconnect(gain2, 2);
+ }, DOMException.INDEX_SIZE_ERR);
+
+ expectException(function() {
+ splitter.disconnect(gain1, 0);
+ }, DOMException.INVALID_ACCESS_ERR);
+
+ expectException(function() {
+ splitter.disconnect(gain3, 0, 0);
+ }, DOMException.INVALID_ACCESS_ERR);
+
+ expectException(function() {
+ splitter.disconnect(merger, 3, 0);
+ }, DOMException.INDEX_SIZE_ERR);
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectFromAudioNode.html b/dom/media/webaudio/test/test_disconnectFromAudioNode.html
new file mode 100644
index 000000000..931195146
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectFromAudioNode.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 256, context.sampleRate);
+ var data = sourceBuffer.getChannelData(0);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain1 = context.createGain();
+ var gain2 = context.createGain();
+ var gain3 = context.createGain();
+
+ source.connect(gain1);
+ source.connect(gain2);
+
+ gain1.connect(gain3);
+ gain2.connect(gain3);
+
+ source.start();
+
+ source.disconnect(gain2);
+
+ return gain3;
+ },
+ createExpectedBuffers: function(context) {
+ expectedBuffer = context.createBuffer(1, 256, context.sampleRate);
+ for (var i = 0; i < 256; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 1.0;
+ }
+
+ return expectedBuffer;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutput.html b/dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutput.html
new file mode 100644
index 000000000..5c4e3ee5d
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutput.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(2, 256, context.sampleRate);
+ for (var i = 1; i <= 2; i++) {
+ var data = sourceBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = i;
+ }
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var splitter = context.createChannelSplitter(2);
+ var gain1 = context.createGain();
+ var gain2 = context.createGain();
+ var merger = context.createChannelMerger(2);
+
+ source.connect(splitter);
+ splitter.connect(gain1, 0);
+ splitter.connect(gain2, 0);
+ splitter.connect(gain2, 1);
+ gain1.connect(merger, 0, 1);
+ gain2.connect(merger, 0, 1);
+ source.start();
+
+ splitter.disconnect(gain2, 0);
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ expectedBuffer = context.createBuffer(2, 256, context.sampleRate);
+ for (var i = 0; i < 256; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 0;
+ expectedBuffer.getChannelData(1)[i] = 3;
+ }
+
+ return expectedBuffer;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutputAndInput.html b/dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutputAndInput.html
new file mode 100644
index 000000000..6526cf65b
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectFromAudioNodeAndOutputAndInput.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 3,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(3, 256, context.sampleRate);
+ for (var i = 1; i <= 3; i++) {
+ var data = sourceBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = i;
+ }
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var splitter = context.createChannelSplitter(3);
+ var merger = context.createChannelMerger(3);
+
+ source.connect(splitter);
+ splitter.connect(merger, 0, 0);
+ splitter.connect(merger, 1, 1);
+ splitter.connect(merger, 2, 2);
+ source.start();
+
+ splitter.disconnect(merger, 2, 2);
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(3, 256, context.sampleRate);
+ for (var i = 1; i <= 3; i++) {
+ var data = expectedBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = (i == 3) ? 0 : i;
+ }
+ }
+
+ return expectedBuffer;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html> \ No newline at end of file
diff --git a/dom/media/webaudio/test/test_disconnectFromAudioNodeMultipleConnection.html b/dom/media/webaudio/test/test_disconnectFromAudioNodeMultipleConnection.html
new file mode 100644
index 000000000..746b7ba93
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectFromAudioNodeMultipleConnection.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>
+ Test whether we can disconnect all outbound connection of an AudioNode
+ </title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 256, context.sampleRate);
+ var data = sourceBuffer.getChannelData(0);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var merger = context.createChannelMerger(2);
+ var gain = context.createGain();
+
+ source.connect(merger, 0, 0);
+ source.connect(gain);
+ source.connect(merger, 0, 1);
+
+ source.disconnect(merger);
+
+ source.start();
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ expectedBuffer = context.createBuffer(2, 256, context.sampleRate);
+ for (var channel = 0; channel < 2; channel++) {
+ for (var i = 0; i < 256; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 0;
+ }
+ }
+
+ return expectedBuffer;
+ }
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html>
diff --git a/dom/media/webaudio/test/test_disconnectFromOutput.html b/dom/media/webaudio/test/test_disconnectFromOutput.html
new file mode 100644
index 000000000..8a6daf5c7
--- /dev/null
+++ b/dom/media/webaudio/test/test_disconnectFromOutput.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Test whether we can disconnect an AudioNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ var gTest = {
+ length: 256,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(3, 256, context.sampleRate);
+ for (var i = 1; i <= 3; i++) {
+ var data = sourceBuffer.getChannelData(i-1);
+ for (var j = 0; j < data.length; j++) {
+ data[j] = i;
+ }
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var splitter = context.createChannelSplitter(3);
+ var sum = context.createGain();
+
+ source.connect(splitter);
+ splitter.connect(sum, 0);
+ splitter.connect(sum, 1);
+ splitter.connect(sum, 2);
+ source.start();
+
+ splitter.disconnect(1);
+
+ return sum;
+ },
+ createExpectedBuffers: function(context) {
+ expectedBuffer = context.createBuffer(1, 256, context.sampleRate);
+ for (var i = 0; i < 256; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 4;
+ }
+
+ return expectedBuffer;
+ },
+ };
+
+ runTest();
+ </script>
+ </pre>
+ </body>
+</html> \ No newline at end of file
diff --git a/dom/media/webaudio/test/test_dynamicsCompressorNode.html b/dom/media/webaudio/test/test_dynamicsCompressorNode.html
new file mode 100644
index 000000000..052b27671
--- /dev/null
+++ b/dom/media/webaudio/test/test_dynamicsCompressorNode.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DynamicsCompressorNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function near(a, b, msg) {
+ ok(Math.abs(a - b) < 1e-4, msg);
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+
+ var osc = context.createOscillator();
+ var sp = context.createScriptProcessor();
+
+ var compressor = context.createDynamicsCompressor();
+
+ osc.connect(compressor);
+ osc.connect(sp);
+ compressor.connect(context.destination);
+
+ is(compressor.channelCount, 2, "compressor node has 2 input channels by default");
+ is(compressor.channelCountMode, "explicit", "Correct channelCountMode for the compressor node");
+ is(compressor.channelInterpretation, "speakers", "Correct channelCountInterpretation for the compressor node");
+
+ // Verify default values
+ with (compressor) {
+ ok(threshold instanceof AudioParam, "treshold is an AudioParam");
+ near(threshold.defaultValue, -24, "Correct default value for threshold");
+ ok(knee instanceof AudioParam, "knee is an AudioParam");
+ near(knee.defaultValue, 30, "Correct default value for knee");
+ ok(ratio instanceof AudioParam, "knee is an AudioParam");
+ near(ratio.defaultValue, 12, "Correct default value for ratio");
+ is(typeof reduction, "number", "reduction is a number");
+ near(reduction, 0, "Correct default value for reduction");
+ ok(attack instanceof AudioParam, "attack is an AudioParam");
+ near(attack.defaultValue, 0.003, "Correct default value for attack");
+ ok(release instanceof AudioParam, "release is an AudioParam");
+ near(release.defaultValue, 0.25, "Correct default value for release");
+ }
+
+ compressor.threshold.value = -80;
+
+ osc.start();
+ var iteration = 0;
+ sp.onaudioprocess = function(e) {
+ if (iteration > 10) {
+ ok(compressor.reduction < 0,
+ "Feeding a full-scale sine to a compressor should result in an db" +
+ "reduction.");
+ sp.onaudioprocess = null;
+ osc.stop(0);
+
+ SimpleTest.finish();
+ }
+ iteration++;
+ }
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html b/dom/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html
new file mode 100644
index 000000000..1be838a4e
--- /dev/null
+++ b/dom/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test DynamicsCompressorNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var compressor = context.createDynamicsCompressor();
+
+ source.buffer = this.buffer;
+
+ source.connect(compressor);
+
+ var compressorWrapped = SpecialPowers.wrap(compressor);
+ ok("passThrough" in compressorWrapped, "DynamicsCompressorNode should support the passThrough API");
+ compressorWrapped.passThrough = true;
+
+ source.start(0);
+ return compressor;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_dynamicsCompressorNodeWithGain.html b/dom/media/webaudio/test/test_dynamicsCompressorNodeWithGain.html
new file mode 100644
index 000000000..2e4b38ea5
--- /dev/null
+++ b/dom/media/webaudio/test/test_dynamicsCompressorNodeWithGain.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+ <title>Test DynamicsCompressor with Gain</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+addLoadEvent(function() {
+ var samplerate = 44100;
+ var context = new OfflineAudioContext(1, samplerate/100, samplerate);
+
+ var osc = context.createOscillator();
+ osc.frequency.value = 2400;
+
+ var gain = context.createGain();
+ gain.gain.value = 1.5;
+
+ // These numbers are borrowed from the example code on MDN
+ // https://developer.mozilla.org/en-US/docs/Web/API/DynamicsCompressorNode
+ var compressor = context.createDynamicsCompressor();
+ compressor.threshold.value = -50;
+ compressor.knee.value = 40;
+ compressor.ratio.value = 12;
+ compressor.reduction.value = -20;
+ compressor.attack.value = 0;
+ compressor.release.value = 0.25;
+
+ osc.connect(gain);
+ gain.connect(compressor);
+ compressor.connect(context.destination);
+ osc.start();
+
+ context.startRendering().then(buffer => {
+ var peak = Math.max(...buffer.getChannelData(0));
+ console.log(peak);
+ // These values are experimentally determined. Without dynamics compression
+ // the peak should be just under 1.5. We also check for a minimum value
+ // to make sure we are not getting all zeros.
+ ok(peak >= 0.2 && peak < 1.0, "Peak value should be greater than 0.25 and less than 1.0");
+ SimpleTest.finish();
+ });
+});
+</script>
+<pre>
+</pre>
+</body>
diff --git a/dom/media/webaudio/test/test_gainNode.html b/dom/media/webaudio/test/test_gainNode.html
new file mode 100644
index 000000000..41b19fda0
--- /dev/null
+++ b/dom/media/webaudio/test/test_gainNode.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test GainNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+
+ var gain = context.createGain();
+
+ source.buffer = buffer;
+
+ source.connect(gain);
+
+ ok(gain.gain, "The audioparam member must exist");
+ is(gain.gain.value, 1.0, "Correct initial value");
+ is(gain.gain.defaultValue, 1.0, "Correct default value");
+ gain.gain.value = 0.5;
+ is(gain.gain.value, 0.5, "Correct initial value");
+ is(gain.gain.defaultValue, 1.0, "Correct default value");
+ is(gain.channelCount, 2, "gain node has 2 input channels by default");
+ is(gain.channelCountMode, "max", "Correct channelCountMode for the gain node");
+ is(gain.channelInterpretation, "speakers", "Correct channelCountInterpretation for the gain node");
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate) / 2;
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_gainNodeInLoop.html b/dom/media/webaudio/test/test_gainNodeInLoop.html
new file mode 100644
index 000000000..6b32cbcfa
--- /dev/null
+++ b/dom/media/webaudio/test/test_gainNodeInLoop.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test GainNode in presence of loops</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+ source.loop = true;
+ source.start(0);
+ source.stop(sourceBuffer.duration * 2);
+
+ var gain = context.createGain();
+ // Adjust the gain in a way that we don't just end up modifying AudioChunk::mVolume
+ gain.gain.setValueAtTime(0.5, 0);
+ source.connect(gain);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 4096, context.sampleRate);
+ for (var i = 0; i < 4096; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 0.5;
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_gainNodePassThrough.html b/dom/media/webaudio/test/test_gainNodePassThrough.html
new file mode 100644
index 000000000..2a7cd6bf4
--- /dev/null
+++ b/dom/media/webaudio/test/test_gainNodePassThrough.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test GainNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var gain = context.createGain();
+
+ source.buffer = this.buffer;
+
+ source.connect(gain);
+
+ gain.gain.value = 0.5;
+
+ var gainWrapped = SpecialPowers.wrap(gain);
+ ok("passThrough" in gainWrapped, "GainNode should support the passThrough API");
+ gainWrapped.passThrough = true;
+
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_iirFilterNodePassThrough.html b/dom/media/webaudio/test/test_iirFilterNodePassThrough.html
new file mode 100644
index 000000000..7773a5b82
--- /dev/null
+++ b/dom/media/webaudio/test/test_iirFilterNodePassThrough.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test IIRFilterNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var filter = context.createIIRFilter([0.5, 0.5], [1.0]);
+
+ source.buffer = this.buffer;
+
+ source.connect(filter);
+
+ var filterWrapped = SpecialPowers.wrap(filter);
+ ok("passThrough" in filterWrapped, "BiquadFilterNode should support the passThrough API");
+ filterWrapped.passThrough = true;
+
+ source.start(0);
+ return filter;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_maxChannelCount.html b/dom/media/webaudio/test/test_maxChannelCount.html
new file mode 100644
index 000000000..319e2bf1e
--- /dev/null
+++ b/dom/media/webaudio/test/test_maxChannelCount.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the AudioContext.destination interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// Work around bug 911777
+SpecialPowers.forceGC();
+SpecialPowers.forceCC();
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ac = new AudioContext();
+ ok(ac.destination.maxChannelCount > 0, "We can query the maximum number of channels");
+
+ var oac = new OfflineAudioContext(2, 1024, 48000);
+ ok(oac.destination.maxChannelCount, 2, "This OfflineAudioContext should have 2 max channels.");
+
+ oac = new OfflineAudioContext(6, 1024, 48000);
+ ok(oac.destination.maxChannelCount, 6, "This OfflineAudioContext should have 6 max channels.");
+
+ expectException(function() {
+ oac.destination.channelCount = oac.destination.channelCount + 1;
+ }, DOMException.INDEX_SIZE_ERR);
+
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaDecoding.html b/dom/media/webaudio/test/test_mediaDecoding.html
new file mode 100644
index 000000000..07e18162b
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaDecoding.html
@@ -0,0 +1,367 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the decodeAudioData API and Resampling</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script type="text/javascript">
+
+// These routines have been copied verbatim from WebKit, and are used in order
+// to convert a memory buffer into a wave buffer.
+function writeString(s, a, offset) {
+ for (var i = 0; i < s.length; ++i) {
+ a[offset + i] = s.charCodeAt(i);
+ }
+}
+
+function writeInt16(n, a, offset) {
+ n = Math.floor(n);
+
+ var b1 = n & 255;
+ var b2 = (n >> 8) & 255;
+
+ a[offset + 0] = b1;
+ a[offset + 1] = b2;
+}
+
+function writeInt32(n, a, offset) {
+ n = Math.floor(n);
+ var b1 = n & 255;
+ var b2 = (n >> 8) & 255;
+ var b3 = (n >> 16) & 255;
+ var b4 = (n >> 24) & 255;
+
+ a[offset + 0] = b1;
+ a[offset + 1] = b2;
+ a[offset + 2] = b3;
+ a[offset + 3] = b4;
+}
+
+function writeAudioBuffer(audioBuffer, a, offset) {
+ var n = audioBuffer.length;
+ var channels = audioBuffer.numberOfChannels;
+
+ for (var i = 0; i < n; ++i) {
+ for (var k = 0; k < channels; ++k) {
+ var buffer = audioBuffer.getChannelData(k);
+ var sample = buffer[i] * 32768.0;
+
+ // Clip samples to the limitations of 16-bit.
+ // If we don't do this then we'll get nasty wrap-around distortion.
+ if (sample < -32768)
+ sample = -32768;
+ if (sample > 32767)
+ sample = 32767;
+
+ writeInt16(sample, a, offset);
+ offset += 2;
+ }
+ }
+}
+
+function createWaveFileData(audioBuffer) {
+ var frameLength = audioBuffer.length;
+ var numberOfChannels = audioBuffer.numberOfChannels;
+ var sampleRate = audioBuffer.sampleRate;
+ var bitsPerSample = 16;
+ var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;
+ var blockAlign = numberOfChannels * bitsPerSample/8;
+ var wavDataByteLength = frameLength * numberOfChannels * 2; // 16-bit audio
+ var headerByteLength = 44;
+ var totalLength = headerByteLength + wavDataByteLength;
+
+ var waveFileData = new Uint8Array(totalLength);
+
+ var subChunk1Size = 16; // for linear PCM
+ var subChunk2Size = wavDataByteLength;
+ var chunkSize = 4 + (8 + subChunk1Size) + (8 + subChunk2Size);
+
+ writeString("RIFF", waveFileData, 0);
+ writeInt32(chunkSize, waveFileData, 4);
+ writeString("WAVE", waveFileData, 8);
+ writeString("fmt ", waveFileData, 12);
+
+ writeInt32(subChunk1Size, waveFileData, 16); // SubChunk1Size (4)
+ writeInt16(1, waveFileData, 20); // AudioFormat (2)
+ writeInt16(numberOfChannels, waveFileData, 22); // NumChannels (2)
+ writeInt32(sampleRate, waveFileData, 24); // SampleRate (4)
+ writeInt32(byteRate, waveFileData, 28); // ByteRate (4)
+ writeInt16(blockAlign, waveFileData, 32); // BlockAlign (2)
+ writeInt32(bitsPerSample, waveFileData, 34); // BitsPerSample (4)
+
+ writeString("data", waveFileData, 36);
+ writeInt32(subChunk2Size, waveFileData, 40); // SubChunk2Size (4)
+
+ // Write actual audio data starting at offset 44.
+ writeAudioBuffer(audioBuffer, waveFileData, 44);
+
+ return waveFileData;
+}
+
+</script>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// fuzzTolerance and fuzzToleranceMobile are used to determine fuzziness
+// thresholds. They're needed to make sure that we can deal with neglibible
+// differences in the binary buffer caused as a result of resampling the
+// audio. fuzzToleranceMobile is typically larger on mobile platforms since
+// we do fixed-point resampling as opposed to floating-point resampling on
+// those platforms.
+var files = [
+ // An ogg file, 44.1khz, mono
+ {
+ url: "ting-44.1k-1ch.ogg",
+ valid: true,
+ expectedUrl: "ting-44.1k-1ch.wav",
+ numberOfChannels: 1,
+ frames: 30592,
+ sampleRate: 44100,
+ duration: 0.693,
+ fuzzTolerance: 5,
+ fuzzToleranceMobile: 1284
+ },
+ // An ogg file, 44.1khz, stereo
+ {
+ url: "ting-44.1k-2ch.ogg",
+ valid: true,
+ expectedUrl: "ting-44.1k-2ch.wav",
+ numberOfChannels: 2,
+ frames: 30592,
+ sampleRate: 44100,
+ duration: 0.693,
+ fuzzTolerance: 6,
+ fuzzToleranceMobile: 2544
+ },
+ // An ogg file, 48khz, mono
+ {
+ url: "ting-48k-1ch.ogg",
+ valid: true,
+ expectedUrl: "ting-48k-1ch.wav",
+ numberOfChannels: 1,
+ frames: 33297,
+ sampleRate: 48000,
+ duration: 0.693,
+ fuzzTolerance: 5,
+ fuzzToleranceMobile: 1388
+ },
+ // An ogg file, 48khz, stereo
+ {
+ url: "ting-48k-2ch.ogg",
+ valid: true,
+ expectedUrl: "ting-48k-2ch.wav",
+ numberOfChannels: 2,
+ frames: 33297,
+ sampleRate: 48000,
+ duration: 0.693,
+ fuzzTolerance: 14,
+ fuzzToleranceMobile: 2752
+ },
+ // Make sure decoding a wave file results in the same buffer (for both the
+ // resampling and non-resampling cases)
+ {
+ url: "ting-44.1k-1ch.wav",
+ valid: true,
+ expectedUrl: "ting-44.1k-1ch.wav",
+ numberOfChannels: 1,
+ frames: 30592,
+ sampleRate: 44100,
+ duration: 0.693,
+ fuzzTolerance: 0,
+ fuzzToleranceMobile: 0
+ },
+ {
+ url: "ting-48k-1ch.wav",
+ valid: true,
+ expectedUrl: "ting-48k-1ch.wav",
+ numberOfChannels: 1,
+ frames: 33297,
+ sampleRate: 48000,
+ duration: 0.693,
+ fuzzTolerance: 0,
+ fuzzToleranceMobile: 0
+ },
+ // // A wave file
+ // //{ url: "24bit-44khz.wav", valid: true, expectedUrl: "24bit-44khz-expected.wav" },
+ // A non-audio file
+ { url: "invalid.txt", valid: false, sampleRate: 44100 },
+ // A webm file with no audio
+ { url: "noaudio.webm", valid: false, sampleRate: 48000 },
+ // A video ogg file with audio
+ {
+ url: "audio.ogv",
+ valid: true,
+ expectedUrl: "audio-expected.wav",
+ numberOfChannels: 2,
+ sampleRate: 44100,
+ frames: 47680,
+ duration: 1.0807,
+ fuzzTolerance: 106,
+ fuzzToleranceMobile: 3482
+ }
+];
+
+// Returns true if the memory buffers are less different that |fuzz| bytes
+function fuzzyMemcmp(buf1, buf2, fuzz) {
+ var result = true;
+ var difference = 0;
+ is(buf1.length, buf2.length, "same length");
+ for (var i = 0; i < buf1.length; ++i) {
+ if (Math.abs(buf1[i] - buf2[i])) {
+ ++difference;
+ }
+ }
+ if (difference > fuzz) {
+ ok(false, "Expected at most " + fuzz + " bytes difference, found " + difference + " bytes");
+ }
+ return difference <= fuzz;
+}
+
+function getFuzzTolerance(test) {
+ var kIsMobile =
+ navigator.userAgent.indexOf("Mobile") != -1 || // b2g
+ navigator.userAgent.indexOf("Android") != -1; // android
+ return kIsMobile ? test.fuzzToleranceMobile : test.fuzzTolerance;
+}
+
+function bufferIsSilent(buffer) {
+ for (var i = 0; i < buffer.length; ++i) {
+ if (buffer.getChannelData(0)[i] != 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function checkAudioBuffer(buffer, test) {
+ if (buffer.numberOfChannels != test.numberOfChannels) {
+ is(buffer.numberOfChannels, test.numberOfChannels, "Correct number of channels");
+ return;
+ }
+ ok(Math.abs(buffer.duration - test.duration) < 1e-3, "Correct duration");
+ if (Math.abs(buffer.duration - test.duration) >= 1e-3) {
+ ok(false, "got: " + buffer.duration + ", expected: " + test.duration);
+ }
+ is(buffer.sampleRate, test.sampleRate, "Correct sample rate");
+ is(buffer.length, test.frames, "Correct length");
+
+ var wave = createWaveFileData(buffer);
+ ok(fuzzyMemcmp(wave, test.expectedWaveData, getFuzzTolerance(test)), "Received expected decoded data");
+}
+
+function checkResampledBuffer(buffer, test, callback) {
+ if (buffer.numberOfChannels != test.numberOfChannels) {
+ is(buffer.numberOfChannels, test.numberOfChannels, "Correct number of channels");
+ return;
+ }
+ ok(Math.abs(buffer.duration - test.duration) < 1e-3, "Correct duration");
+ if (Math.abs(buffer.duration - test.duration) >= 1e-3) {
+ ok(false, "got: " + buffer.duration + ", expected: " + test.duration);
+ }
+ // Take into account the resampling when checking the size
+ var expectedLength = test.frames * buffer.sampleRate / test.sampleRate;
+ ok(Math.abs(buffer.length - expectedLength) < 1.0, "Correct length", "got " + buffer.length + ", expected about " + expectedLength);
+
+ // Playback the buffer in the original context, to resample back to the
+ // original rate and compare with the decoded buffer without resampling.
+ cx = test.nativeContext;
+ var expected = cx.createBufferSource();
+ expected.buffer = test.expectedBuffer;
+ expected.start();
+ var inverse = cx.createGain();
+ inverse.gain.value = -1;
+ expected.connect(inverse);
+ inverse.connect(cx.destination);
+ var resampled = cx.createBufferSource();
+ resampled.buffer = buffer;
+ resampled.start();
+ // This stop should do nothing, but it tests for bug 937475
+ resampled.stop(test.frames / cx.sampleRate);
+ resampled.connect(cx.destination);
+ cx.oncomplete = function(e) {
+ ok(!bufferIsSilent(e.renderedBuffer), "Expect buffer not silent");
+ // Resampling will lose the highest frequency components, so we should
+ // pass the difference through a low pass filter. However, either the
+ // input files don't have significant high frequency components or the
+ // tolerance in compareBuffers() is too high to detect them.
+ compareBuffers(e.renderedBuffer,
+ cx.createBuffer(test.numberOfChannels,
+ test.frames, test.sampleRate));
+ callback();
+ }
+ cx.startRendering();
+}
+
+function runResampling(test, response, callback) {
+ var sampleRate = test.sampleRate == 44100 ? 48000 : 44100;
+ var cx = new OfflineAudioContext(1, 1, sampleRate);
+ cx.decodeAudioData(response, function onSuccess(asyncResult) {
+ is(asyncResult.sampleRate, sampleRate, "Correct sample rate");
+
+ checkResampledBuffer(asyncResult, test, callback);
+ }, function onFailure() {
+ ok(false, "Expected successful decode with resample");
+ callback();
+ });
+}
+
+function runTest(test, response, callback) {
+ // We need to copy the array here, because decodeAudioData will detach the
+ // array's buffer.
+ var compressedAudio = response.slice(0);
+ var expectCallback = false;
+ var cx = new OfflineAudioContext(test.numberOfChannels || 1,
+ test.frames || 1, test.sampleRate);
+ cx.decodeAudioData(response, function onSuccess(asyncResult) {
+ ok(expectCallback, "Success callback should fire asynchronously");
+ ok(test.valid, "Did expect success for test " + test.url);
+
+ checkAudioBuffer(asyncResult, test);
+
+ test.expectedBuffer = asyncResult;
+ test.nativeContext = cx;
+ runResampling(test, compressedAudio, callback);
+ }, function onFailure() {
+ ok(expectCallback, "Failure callback should fire asynchronously");
+ ok(!test.valid, "Did expect failure for test " + test.url);
+ callback();
+ });
+ expectCallback = true;
+}
+
+function loadTest(test, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", test.url, true);
+ xhr.responseType = "arraybuffer";
+ xhr.onload = function() {
+ var getExpected = new XMLHttpRequest();
+ getExpected.open("GET", test.expectedUrl, true);
+ getExpected.responseType = "arraybuffer";
+ getExpected.onload = function() {
+ test.expectedWaveData = new Uint8Array(getExpected.response);
+ runTest(test, xhr.response, callback);
+ };
+ getExpected.send();
+ };
+ xhr.send();
+}
+
+function loadNextTest() {
+ if (files.length) {
+ loadTest(files.shift(), loadNextTest);
+ } else {
+ SimpleTest.finish();
+ }
+}
+
+loadNextTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaElementAudioSourceNode.html b/dom/media/webaudio/test/test_mediaElementAudioSourceNode.html
new file mode 100644
index 000000000..3e196735f
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaElementAudioSourceNode.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaElementAudioSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+function test() {
+ var audio = new Audio("small-shot.ogg");
+ var context = new AudioContext();
+ var expectedMinNonzeroSampleCount;
+ var expectedMaxNonzeroSampleCount;
+ var nonzeroSampleCount = 0;
+ var complete = false;
+ var iterationCount = 0;
+
+ // This test ensures we receive at least expectedSampleCount nonzero samples
+ function processSamples(e) {
+ if (complete) {
+ return;
+ }
+
+ if (iterationCount == 0) {
+ // Don't start playing the audio until the AudioContext stuff is connected
+ // and running.
+ audio.play();
+ }
+ ++iterationCount;
+
+ var buf = e.inputBuffer.getChannelData(0);
+ var nonzeroSamplesThisBuffer = 0;
+ for (var i = 0; i < buf.length; ++i) {
+ if (buf[i] != 0) {
+ ++nonzeroSamplesThisBuffer;
+ }
+ }
+ nonzeroSampleCount += nonzeroSamplesThisBuffer;
+ is(e.inputBuffer.numberOfChannels, 1,
+ "Checking data channel count (nonzeroSamplesThisBuffer=" +
+ nonzeroSamplesThisBuffer + ")");
+ ok(nonzeroSampleCount <= expectedMaxNonzeroSampleCount,
+ "Too many nonzero samples (got " + nonzeroSampleCount + ", expected max " + expectedMaxNonzeroSampleCount + ")");
+ if (nonzeroSampleCount >= expectedMinNonzeroSampleCount &&
+ nonzeroSamplesThisBuffer == 0) {
+ ok(true,
+ "Check received enough nonzero samples (got " + nonzeroSampleCount + ", expected min " + expectedMinNonzeroSampleCount + ")");
+ SimpleTest.finish();
+ complete = true;
+ }
+ }
+
+ audio.onloadedmetadata = function() {
+ var node = context.createMediaElementSource(audio);
+ var sp = context.createScriptProcessor(2048, 1);
+ node.connect(sp);
+ // Use a fuzz factor of 100 to account for samples that just happen to be zero
+ expectedMinNonzeroSampleCount = Math.floor(audio.duration*context.sampleRate) - 100;
+ expectedMaxNonzeroSampleCount = Math.floor(audio.duration*context.sampleRate) + 500;
+ sp.onaudioprocess = processSamples;
+ };
+}
+
+SpecialPowers.pushPrefEnv({"set": [["media.preload.default", 2], ["media.preload.auto", 3]]}, test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaElementAudioSourceNodeCrossOrigin.html b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeCrossOrigin.html
new file mode 100644
index 000000000..7e03b7079
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeCrossOrigin.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaStreamAudioSourceNode doesn't get data from cross-origin media resources</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+// Turn off the authentication dialog blocking for this test.
+SpecialPowers.setIntPref("network.auth.subresource-http-auth-allow", 2)
+
+var tests = [
+ // Not the same origin no CORS asked for, should have silence
+ { url: "http://example.org:80/tests/dom/media/webaudio/test/small-shot.ogg",
+ cors: null,
+ expectSilence: true },
+ // Same origin, should have sound
+ { url: "small-shot.ogg",
+ cors: null,
+ expectSilence: false },
+ // Cross-origin but we asked for CORS and the server answered with the right
+ // header, should have
+ { url: "http://example.org:80/tests/dom/media/webaudio/test/corsServer.sjs",
+ cors: "anonymous",
+ expectSilence: false }
+];
+
+var testsRemaining = tests.length;
+
+tests.forEach(function(e) {
+ e.ac = new AudioContext();
+ var a = new Audio();
+ if (e.cors) {
+ a.crossOrigin = e.cors;
+ }
+ a.src = e.url;
+ document.body.appendChild(a);
+
+ a.onloadedmetadata = () => {
+ // Wait for "loadedmetadata" before capturing since tracks are then known
+ // directly. If we set up the capture before "loadedmetadata" we
+ // (internally) have to wait an extra async jump for tracks to become known
+ // to main thread, before setting up audio data forwarding to the node.
+ // As that happens, the audio resource may have already ended on slow test
+ // machines, causing failures.
+ a.onloadedmetadata = null;
+ var measn = e.ac.createMediaElementSource(a);
+ var sp = e.ac.createScriptProcessor(2048, 1);
+ sp.seenSound = false;
+ sp.onaudioprocess = checkBufferSilent;
+
+ measn.connect(sp);
+ a.play();
+ };
+
+ function checkFinished(sp) {
+ if (a.ended) {
+ sp.onaudioprocess = null;
+ var not = e.expectSilence ? "" : "not";
+ is(e.expectSilence, !sp.seenSound,
+ "Buffer is " + not + " silent as expected, for " +
+ e.url + " (cors: " + e.cors + ")");
+ if (--testsRemaining == 0) {
+ SimpleTest.finish();
+ }
+ }
+ }
+
+ function checkBufferSilent(e) {
+ var inputArrayBuffer = e.inputBuffer.getChannelData(0);
+ var silent = true;
+ for (var i = 0; i < inputArrayBuffer.length; i++) {
+ if (inputArrayBuffer[i] != 0.0) {
+ silent = false;
+ break;
+ }
+ }
+ // It is acceptable to find a full buffer of silence here, even if we expect
+ // sound, because Gecko's looping on media elements is not seamless and we
+ // can underrun. We are looking for at least one buffer of non-silent data.
+ e.target.seenSound = !silent || e.target.seenSound;
+ checkFinished(e.target);
+ return silent;
+ }
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html
new file mode 100644
index 000000000..8d3b0ed46
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaStreamAudioSourceNode doesn't get data from cross-origin media resources</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+function binIndexForFrequency(frequency, analyser) {
+ return 1 + Math.round(frequency *
+ analyser.fftSize /
+ analyser.context.sampleRate);
+}
+
+function debugCanvas(analyser) {
+ var cvs = document.createElement("canvas");
+ document.body.appendChild(cvs);
+
+ // Easy: 1px per bin
+ cvs.width = analyser.frequencyBinCount;
+ cvs.height = 256;
+ cvs.style.border = "1px solid red";
+
+ var c = cvs.getContext('2d');
+ var buf = new Uint8Array(analyser.frequencyBinCount);
+
+ function render() {
+ c.clearRect(0, 0, cvs.width, cvs.height);
+ analyser.getByteFrequencyData(buf);
+ for (var i = 0; i < buf.length; i++) {
+ c.fillRect(i, (256 - (buf[i])), 1, 256);
+ }
+ requestAnimationFrame(render);
+ }
+ requestAnimationFrame(render);
+}
+
+
+function checkFrequency(an) {
+ an.getFloatFrequencyData(frequencyArray);
+ // We should have no energy when checking the data largely outside the index
+ // for 440Hz (the frequency of the sine wave), start checking an octave above,
+ // the Opus compression can add some harmonics to the pure since wave.
+ var index = binIndexForFrequency(880, an);
+ var underTreshold = true;
+ for (var i = index; i < frequencyArray.length; i++) {
+ // Let some slack, there might be some noise here because of int -> float
+ // conversion or the Opus encoding.
+ if (frequencyArray[i] > an.minDecibels + 40) {
+ return false;
+ }
+ }
+
+ // On the other hand, we should find a peak at 440Hz. Our sine wave is not
+ // attenuated, we're expecting the peak to reach 0dBFs.
+ index = binIndexForFrequency(440, an);
+ info("energy at 440: " + frequencyArray[index] + ", threshold " + (an.maxDecibels - 10));
+ if (frequencyArray[index] < (an.maxDecibels - 10)) {
+ return false;
+ }
+
+ return true;
+}
+
+var audioElement = new Audio();
+audioElement.src = 'sine-440-10s.opus'
+audioElement.loop = true;
+var ac = new AudioContext();
+var mediaElementSource = ac.createMediaElementSource(audioElement);
+var an = ac.createAnalyser();
+frequencyArray = new Float32Array(an.frequencyBinCount);
+
+// Uncomment this to check what the analyser is doing.
+// debugCanvas(an);
+
+mediaElementSource.connect(an)
+
+audioElement.play();
+// We want to check the we have the expected audio for at least two loop of
+// the HTMLMediaElement, piped into an AudioContext. The file is ten seconds,
+// and we use the default FFT size.
+var lastCurrentTime = 0;
+var loopCount = 0;
+audioElement.onplaying = function() {
+ audioElement.ontimeupdate = function() {
+ // We don't run the analysis when close to loop point or at the
+ // beginning, since looping is not seamless, there could be an
+ // unpredictable amount of silence
+ var rv = checkFrequency(an);
+ info("currentTime: " + audioElement.currentTime);
+ if (audioElement.currentTime < 4 ||
+ audioElement.currentTIme > 8){
+ return;
+ }
+ if (!rv) {
+ ok(false, "Found unexpected noise during analysis.");
+ audioElement.ontimeupdate = null;
+ audioElement.onplaying = null;
+ ac.close();
+ audioElement.src = '';
+ SimpleTest.finish()
+ return;
+ }
+ ok(true, "Found correct audio signal during analysis");
+ info(lastCurrentTime + " " + audioElement.currentTime);
+ if (lastCurrentTime > audioElement.currentTime) {
+ info("loopCount: " + loopCount);
+ if (loopCount > 1) {
+ audioElement.ontimeupdate = null;
+ audioElement.onplaying = null;
+ ac.close();
+ audioElement.src = '';
+ SimpleTest.finish();
+ }
+ lastCurrentTime = audioElement.currentTime;
+ loopCount++;
+ } else {
+ lastCurrentTime = audioElement.currentTime;
+ }
+ }
+}
+
+</script>
diff --git a/dom/media/webaudio/test/test_mediaElementAudioSourceNodePassThrough.html b/dom/media/webaudio/test/test_mediaElementAudioSourceNodePassThrough.html
new file mode 100644
index 000000000..1bb0ad9ec
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaElementAudioSourceNodePassThrough.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaElementAudioSourceNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+function test() {
+ var audio = new Audio("small-shot.ogg");
+ var context = new AudioContext();
+ var node = context.createMediaElementSource(audio);
+ var sp = context.createScriptProcessor(2048, 1);
+ node.connect(sp);
+ var nonzeroSampleCount = 0;
+ var complete = false;
+ var iterationCount = 0;
+
+ var srcWrapped = SpecialPowers.wrap(node);
+ ok("passThrough" in srcWrapped, "MediaElementAudioSourceNode should support the passThrough API");
+ srcWrapped.passThrough = true;
+
+ // This test ensures we receive at least expectedSampleCount nonzero samples
+ function processSamples(e) {
+ if (complete) {
+ return;
+ }
+
+ if (iterationCount == 0) {
+ // Don't start playing the audio until the AudioContext stuff is connected
+ // and running.
+ audio.play();
+ }
+ ++iterationCount;
+
+ var buf = e.inputBuffer.getChannelData(0);
+ var nonzeroSamplesThisBuffer = 0;
+ for (var i = 0; i < buf.length; ++i) {
+ if (buf[i] != 0) {
+ ++nonzeroSamplesThisBuffer;
+ }
+ }
+ nonzeroSampleCount += nonzeroSamplesThisBuffer;
+ if (iterationCount == 10) {
+ is(nonzeroSampleCount, 0, "The input must be silence");
+ SimpleTest.finish();
+ complete = true;
+ }
+ }
+
+ audio.oncanplaythrough = function() {
+ sp.onaudioprocess = processSamples;
+ };
+}
+
+SpecialPowers.pushPrefEnv({"set": [["media.preload.default", 2], ["media.preload.auto", 3]]}, test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaElementAudioSourceNodeVideo.html b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeVideo.html
new file mode 100644
index 000000000..ad0b355b1
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeVideo.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaElementAudioSourceNode before "loadedmetadata"</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var video = document.createElement("video");
+function test() {
+ video.src = "audiovideo.mp4";
+
+ var context = new AudioContext();
+ var complete = false;
+
+ video.onended = () => {
+ if (complete) {
+ return;
+ }
+
+ complete = true;
+ ok(false, "Video ended without any samples seen");
+ SimpleTest.finish();
+ };
+
+ video.ontimeupdate = () => {
+ info("Timeupdate: " + video.currentTime);
+ };
+
+ var node = context.createMediaElementSource(video);
+ var sp = context.createScriptProcessor(2048, 1);
+ node.connect(sp);
+
+ // This test ensures we receive some nonzero samples when we capture to
+ // WebAudio before "loadedmetadata".
+ sp.onaudioprocess = e => {
+ if (complete) {
+ return;
+ }
+
+ var buf = e.inputBuffer.getChannelData(0);
+ for (var i = 0; i < buf.length; ++i) {
+ if (buf[i] != 0) {
+ complete = true;
+ ok(true, "Got non-zero samples");
+ SimpleTest.finish();
+ return;
+ }
+ }
+ };
+
+ video.play();
+}
+
+if (video.canPlayType("video/mp4")) {
+ test();
+} else {
+ ok(true, "MP4 not supported. Skipping.");
+ SimpleTest.finish();
+}
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html b/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html
new file mode 100644
index 000000000..5aa1a7910
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test MediaStreamAudioDestinationNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<audio id="audioelem"></audio>
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("This test uses a live media element so it needs to wait for the media stack to do some work.");
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+
+ var dest = context.createMediaStreamDestination();
+ source.connect(dest);
+
+ var elem = document.getElementById('audioelem');
+ elem.srcObject = dest.stream;
+ elem.onloadedmetadata = function() {
+ ok(true, "got metadata event");
+ setTimeout(function() {
+ is(elem.played.length, 1, "should have a played interval");
+ is(elem.played.start(0), 0, "should have played immediately");
+ isnot(elem.played.end(0), 0, "should have played for a non-zero interval");
+
+ // This will end the media element.
+ dest.stream.getTracks()[0].stop();
+ }, 2000);
+ };
+ elem.onended = function() {
+ ok(true, "media element ended after destination track.stop()");
+ SimpleTest.finish();
+ };
+
+ source.start(0);
+ elem.play();
+});
+</script>
diff --git a/dom/media/webaudio/test/test_mediaStreamAudioSourceNode.html b/dom/media/webaudio/test/test_mediaStreamAudioSourceNode.html
new file mode 100644
index 000000000..85d96d3e8
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaStreamAudioSourceNode.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaStreamAudioSourceNode processing is correct</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function createBuffer(context) {
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ buffer.getChannelData(1)[i] = -buffer.getChannelData(0)[i];
+ }
+ return buffer;
+}
+
+var gTest = {
+ length: 2048,
+ skipOfflineContextTests: true,
+ createGraph: function(context) {
+ var sourceGraph = new AudioContext();
+ var source = sourceGraph.createBufferSource();
+ source.buffer = createBuffer(context);
+ var dest = sourceGraph.createMediaStreamDestination();
+ source.connect(dest);
+ source.start(0);
+
+ var mediaStreamSource = context.createMediaStreamSource(dest.stream);
+ // channelCount and channelCountMode should have no effect
+ mediaStreamSource.channelCount = 1;
+ mediaStreamSource.channelCountMode = "explicit";
+ return mediaStreamSource;
+ },
+ createExpectedBuffers: function(context) {
+ return createBuffer(context);
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html
new file mode 100644
index 000000000..f3cc0334a
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaStreamAudioSourceNode doesn't get data from cross-origin media resources</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+var audio = new Audio("http://example.org:80/tests/dom/media/webaudio/test/small-shot.ogg");
+var context = new AudioContext();
+var node = context.createMediaStreamSource(audio.mozCaptureStreamUntilEnded());
+var sp = context.createScriptProcessor(2048, 1);
+node.connect(sp);
+var nonzeroSampleCount = 0;
+var complete = false;
+var iterationCount = 0;
+
+// This test ensures we receive at least expectedSampleCount nonzero samples
+function processSamples(e) {
+ if (complete) {
+ return;
+ }
+
+ if (iterationCount == 0) {
+ // Don't start playing the audio until the AudioContext stuff is connected
+ // and running.
+ audio.play();
+ }
+ ++iterationCount;
+
+ var buf = e.inputBuffer.getChannelData(0);
+ var nonzeroSamplesThisBuffer = 0;
+ for (var i = 0; i < buf.length; ++i) {
+ if (buf[i] != 0) {
+ ++nonzeroSamplesThisBuffer;
+ }
+ }
+ is(nonzeroSamplesThisBuffer, 0,
+ "Checking all samples are zero");
+ if (iterationCount >= 20) {
+ SimpleTest.finish();
+ complete = true;
+ }
+}
+
+audio.oncanplaythrough = function() {
+ sp.onaudioprocess = processSamples;
+};
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html
new file mode 100644
index 000000000..7a9b6c4a6
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test that MediaStreamAudioSourceNode and its input MediaStream stays alive while there are active tracks</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("gUM and WebAudio data is async to main thread. " +
+ "We need a timeout to see that something does " +
+ "NOT happen to data.");
+
+var context = new AudioContext();
+var analyser = context.createAnalyser();
+
+function wait(millis, resolveWithThis) {
+ return new Promise(resolve => setTimeout(() => resolve(resolveWithThis), millis));
+}
+
+function binIndexForFrequency(frequency) {
+ return 1 + Math.round(frequency * analyser.fftSize / context.sampleRate);
+}
+
+function waitForAudio(analysisFunction, cancelPromise) {
+ var data = new Uint8Array(analyser.frequencyBinCount);
+ var cancelled = false;
+ var cancelledMsg = "";
+ cancelPromise.then(msg => {
+ cancelled = true;
+ cancelledMsg = msg;
+ });
+ return new Promise((resolve, reject) => {
+ var loop = () => {
+ analyser.getByteFrequencyData(data);
+ if (cancelled) {
+ reject(new Error("waitForAudio cancelled: " + cancelledMsg));
+ return;
+ }
+ if (analysisFunction(data)) {
+ resolve();
+ return;
+ }
+ requestAnimationFrame(loop);
+ };
+ loop();
+ });
+}
+
+navigator.mediaDevices.getUserMedia({audio: true, fake: true})
+ .then(stream => {
+ stream.onended = () => ended = true;
+ let source = context.createMediaStreamSource(stream);
+ source.connect(analyser);
+ analyser.connect(context.destination);
+ })
+ .then(() => {
+ ok(true, "Waiting for audio to pass through the analyser")
+ return waitForAudio(arr => arr[binIndexForFrequency(1000)] > 200,
+ wait(60000, "Timeout waiting for audio"));
+ })
+ .then(() => {
+ ok(true, "Audio was detected by the analyser. Forcing CC.");
+ SpecialPowers.forceCC();
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+ SpecialPowers.forceGC();
+
+ info("Checking that GC didn't destroy the stream or source node");
+ return waitForAudio(arr => arr[binIndexForFrequency(1000)] < 50,
+ wait(5000, "Timeout waiting for GC (timeout OK)"))
+ .then(() => Promise.reject("Audio stopped unexpectedly"),
+ () => Promise.resolve());
+ })
+ .then(() => {
+ ok(true, "Audio is still flowing");
+ SimpleTest.finish();
+ })
+ .catch(e => {
+ ok(false, "Error executing test: " + e + (e.stack ? "\n" + e.stack : ""));
+ SimpleTest.finish();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaStreamAudioSourceNodePassThrough.html b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodePassThrough.html
new file mode 100644
index 000000000..d2c22600a
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodePassThrough.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaStreamAudioSourceNode passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function createBuffer(context, delay) {
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048 - delay; ++i) {
+ buffer.getChannelData(0)[i + delay] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ buffer.getChannelData(1)[i + delay] = -buffer.getChannelData(0)[i + delay];
+ }
+ return buffer;
+}
+
+var gTest = {
+ length: 2048,
+ skipOfflineContextTests: true,
+ createGraph: function(context) {
+ var sourceGraph = new AudioContext();
+ var source = sourceGraph.createBufferSource();
+ source.buffer = createBuffer(context, 0);
+ var dest = sourceGraph.createMediaStreamDestination();
+ source.connect(dest);
+ source.start(0);
+
+ var mediaStreamSource = context.createMediaStreamSource(dest.stream);
+ // channelCount and channelCountMode should have no effect
+ mediaStreamSource.channelCount = 1;
+ mediaStreamSource.channelCountMode = "explicit";
+
+ var srcWrapped = SpecialPowers.wrap(mediaStreamSource);
+ ok("passThrough" in srcWrapped, "MediaStreamAudioSourceNode should support the passThrough API");
+ srcWrapped.passThrough = true;
+
+ return mediaStreamSource;
+ },
+ createExpectedBuffers: function(context) {
+ return context.createBuffer(2, 2048, context.sampleRate);
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html
new file mode 100644
index 000000000..4a4f03c53
--- /dev/null
+++ b/dom/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset="utf-8">
+<head>
+ <title>Test MediaStreamAudioSourceNode processing is correct</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+
+function test() {
+ var audio = new Audio("small-shot.ogg");
+ var context = new AudioContext();
+ var expectedMinNonzeroSampleCount;
+ var expectedMaxNonzeroSampleCount;
+ var nonzeroSampleCount = 0;
+ var complete = false;
+ var iterationCount = 0;
+
+ // This test ensures we receive at least expectedSampleCount nonzero samples
+ function processSamples(e) {
+ if (complete) {
+ return;
+ }
+
+ if (iterationCount == 0) {
+ // Don't start playing the audio until the AudioContext stuff is connected
+ // and running.
+ audio.play();
+ }
+ ++iterationCount;
+
+ var buf = e.inputBuffer.getChannelData(0);
+ var nonzeroSamplesThisBuffer = 0;
+ for (var i = 0; i < buf.length; ++i) {
+ if (buf[i] != 0) {
+ ++nonzeroSamplesThisBuffer;
+ }
+ }
+ nonzeroSampleCount += nonzeroSamplesThisBuffer;
+ is(e.inputBuffer.numberOfChannels, 1,
+ "Checking data channel count (nonzeroSamplesThisBuffer=" +
+ nonzeroSamplesThisBuffer + ")");
+ ok(nonzeroSampleCount <= expectedMaxNonzeroSampleCount,
+ "Too many nonzero samples (got " + nonzeroSampleCount + ", expected max " + expectedMaxNonzeroSampleCount + ")");
+ if (nonzeroSampleCount >= expectedMinNonzeroSampleCount &&
+ nonzeroSamplesThisBuffer == 0) {
+ ok(true,
+ "Check received enough nonzero samples (got " + nonzeroSampleCount + ", expected min " + expectedMinNonzeroSampleCount + ")");
+ SimpleTest.finish();
+ complete = true;
+ }
+ }
+
+ audio.onloadedmetadata = function() {
+ var node = context.createMediaStreamSource(audio.mozCaptureStreamUntilEnded());
+ var sp = context.createScriptProcessor(2048, 1, 0);
+ node.connect(sp);
+ // Use a fuzz factor of 100 to account for samples that just happen to be zero
+ expectedMinNonzeroSampleCount = Math.floor(audio.duration*context.sampleRate) - 100;
+ expectedMaxNonzeroSampleCount = Math.floor(audio.duration*context.sampleRate) + 500;
+ sp.onaudioprocess = processSamples;
+ };
+}
+
+SpecialPowers.pushPrefEnv({"set": [["media.preload.default", 2], ["media.preload.auto", 3]]}, test);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mixingRules.html b/dom/media/webaudio/test/test_mixingRules.html
new file mode 100644
index 000000000..0bdcff87e
--- /dev/null
+++ b/dom/media/webaudio/test/test_mixingRules.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Testcase for AudioNode channel up-mix/down-mix rules</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+
+<body>
+
+<script>
+
+// This test is based on http://src.chromium.org/viewvc/blink/trunk/LayoutTests/webaudio/audionode-channel-rules.html
+
+var context = null;
+var sp = null;
+var renderNumberOfChannels = 8;
+var singleTestFrameLength = 8;
+var testBuffers;
+
+// A list of connections to an AudioNode input, each of which is to be used in one or more specific test cases.
+// Each element in the list is a string, with the number of connections corresponding to the length of the string,
+// and each character in the string is from '1' to '8' representing a 1 to 8 channel connection (from an AudioNode output).
+// For example, the string "128" means 3 connections, having 1, 2, and 8 channels respectively.
+var connectionsList = [];
+for (var i = 1; i <= 8; ++i) {
+ connectionsList.push(i.toString());
+ for (var j = 1; j <= 8; ++j) {
+ connectionsList.push(i.toString() + j.toString());
+ }
+}
+
+// A list of mixing rules, each of which will be tested against all of the connections in connectionsList.
+var mixingRulesList = [
+ {channelCount: 1, channelCountMode: "max", channelInterpretation: "speakers"},
+ {channelCount: 2, channelCountMode: "clamped-max", channelInterpretation: "speakers"},
+ {channelCount: 3, channelCountMode: "clamped-max", channelInterpretation: "speakers"},
+ {channelCount: 4, channelCountMode: "clamped-max", channelInterpretation: "speakers"},
+ {channelCount: 5, channelCountMode: "clamped-max", channelInterpretation: "speakers"},
+ {channelCount: 6, channelCountMode: "clamped-max", channelInterpretation: "speakers"},
+ {channelCount: 7, channelCountMode: "clamped-max", channelInterpretation: "speakers"},
+ {channelCount: 2, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 3, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 4, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 5, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 6, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 7, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 8, channelCountMode: "explicit", channelInterpretation: "speakers"},
+ {channelCount: 1, channelCountMode: "max", channelInterpretation: "discrete"},
+ {channelCount: 2, channelCountMode: "clamped-max", channelInterpretation: "discrete"},
+ {channelCount: 3, channelCountMode: "clamped-max", channelInterpretation: "discrete"},
+ {channelCount: 4, channelCountMode: "clamped-max", channelInterpretation: "discrete"},
+ {channelCount: 5, channelCountMode: "clamped-max", channelInterpretation: "discrete"},
+ {channelCount: 6, channelCountMode: "clamped-max", channelInterpretation: "discrete"},
+ {channelCount: 3, channelCountMode: "explicit", channelInterpretation: "discrete"},
+ {channelCount: 4, channelCountMode: "explicit", channelInterpretation: "discrete"},
+ {channelCount: 5, channelCountMode: "explicit", channelInterpretation: "discrete"},
+ {channelCount: 6, channelCountMode: "explicit", channelInterpretation: "discrete"},
+ {channelCount: 7, channelCountMode: "explicit", channelInterpretation: "discrete"},
+ {channelCount: 8, channelCountMode: "explicit", channelInterpretation: "discrete"},
+];
+
+var numberOfTests = mixingRulesList.length * connectionsList.length;
+
+// Create an n-channel buffer, with all sample data zero except for a shifted impulse.
+// The impulse position depends on the channel index.
+// For example, for a 4-channel buffer:
+// channel0: 1 0 0 0 0 0 0 0
+// channel1: 0 1 0 0 0 0 0 0
+// channel2: 0 0 1 0 0 0 0 0
+// channel3: 0 0 0 1 0 0 0 0
+function createTestBuffer(numberOfChannels) {
+ var buffer = context.createBuffer(numberOfChannels, singleTestFrameLength, context.sampleRate);
+ for (var i = 0; i < numberOfChannels; ++i) {
+ var data = buffer.getChannelData(i);
+ data[i] = 1;
+ }
+ return buffer;
+}
+
+// Discrete channel interpretation mixing:
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#UpMix
+// up-mix by filling channels until they run out then ignore remaining dest channels.
+// down-mix by filling as many channels as possible, then dropping remaining source channels.
+function discreteSum(sourceBuffer, destBuffer) {
+ if (sourceBuffer.length != destBuffer.length) {
+ is(sourceBuffer.length, destBuffer.length, "source and destination buffers should have the same length");
+ }
+
+ var numberOfChannels = Math.min(sourceBuffer.numberOfChannels, destBuffer.numberOfChannels);
+ var length = sourceBuffer.length;
+
+ for (var c = 0; c < numberOfChannels; ++c) {
+ var source = sourceBuffer.getChannelData(c);
+ var dest = destBuffer.getChannelData(c);
+ for (var i = 0; i < length; ++i) {
+ dest[i] += source[i];
+ }
+ }
+}
+
+// Speaker channel interpretation mixing:
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#UpMix
+function speakersSum(sourceBuffer, destBuffer)
+{
+ var numberOfSourceChannels = sourceBuffer.numberOfChannels;
+ var numberOfDestinationChannels = destBuffer.numberOfChannels;
+ var length = destBuffer.length;
+
+ if ((numberOfDestinationChannels == 2 && numberOfSourceChannels == 1) ||
+ (numberOfDestinationChannels == 4 && numberOfSourceChannels == 1)) {
+ // Handle mono -> stereo/Quad case (summing mono channel into both left and right).
+ var source = sourceBuffer.getChannelData(0);
+ var destL = destBuffer.getChannelData(0);
+ var destR = destBuffer.getChannelData(1);
+
+ for (var i = 0; i < length; ++i) {
+ destL[i] += source[i];
+ destR[i] += source[i];
+ }
+ } else if ((numberOfDestinationChannels == 4 && numberOfSourceChannels == 2) ||
+ (numberOfDestinationChannels == 6 && numberOfSourceChannels == 2)) {
+ // Handle stereo -> Quad/5.1 case (summing left and right channels into the output's left and right).
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var destL = destBuffer.getChannelData(0);
+ var destR = destBuffer.getChannelData(1);
+
+ for (var i = 0; i < length; ++i) {
+ destL[i] += sourceL[i];
+ destR[i] += sourceR[i];
+ }
+ } else if (numberOfDestinationChannels == 1 && numberOfSourceChannels == 2) {
+ // Handle stereo -> mono case. output += 0.5 * (input.L + input.R).
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var dest = destBuffer.getChannelData(0);
+
+ for (var i = 0; i < length; ++i) {
+ dest[i] += 0.5 * (sourceL[i] + sourceR[i]);
+ }
+ } else if (numberOfDestinationChannels == 1 && numberOfSourceChannels == 4) {
+ // Handle Quad -> mono case. output += 0.25 * (input.L + input.R + input.SL + input.SR).
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var sourceSL = sourceBuffer.getChannelData(2);
+ var sourceSR = sourceBuffer.getChannelData(3);
+ var dest = destBuffer.getChannelData(0);
+
+ for (var i = 0; i < length; ++i) {
+ dest[i] += 0.25 * (sourceL[i] + sourceR[i] + sourceSL[i] + sourceSR[i]);
+ }
+ } else if (numberOfDestinationChannels == 2 && numberOfSourceChannels == 4) {
+ // Handle Quad -> stereo case. outputLeft += 0.5 * (input.L + input.SL),
+ // outputRight += 0.5 * (input.R + input.SR).
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var sourceSL = sourceBuffer.getChannelData(2);
+ var sourceSR = sourceBuffer.getChannelData(3);
+ var destL = destBuffer.getChannelData(0);
+ var destR = destBuffer.getChannelData(1);
+
+ for (var i = 0; i < length; ++i) {
+ destL[i] += 0.5 * (sourceL[i] + sourceSL[i]);
+ destR[i] += 0.5 * (sourceR[i] + sourceSR[i]);
+ }
+ } else if (numberOfDestinationChannels == 6 && numberOfSourceChannels == 4) {
+ // Handle Quad -> 5.1 case. outputLeft += (inputL, inputR, 0, 0, inputSL, inputSR)
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var sourceSL = sourceBuffer.getChannelData(2);
+ var sourceSR = sourceBuffer.getChannelData(3);
+ var destL = destBuffer.getChannelData(0);
+ var destR = destBuffer.getChannelData(1);
+ var destSL = destBuffer.getChannelData(4);
+ var destSR = destBuffer.getChannelData(5);
+
+ for (var i = 0; i < length; ++i) {
+ destL[i] += sourceL[i];
+ destR[i] += sourceR[i];
+ destSL[i] += sourceSL[i];
+ destSR[i] += sourceSR[i];
+ }
+ } else if (numberOfDestinationChannels == 6 && numberOfSourceChannels == 1) {
+ // Handle mono -> 5.1 case, sum mono channel into center.
+ var source = sourceBuffer.getChannelData(0);
+ var dest = destBuffer.getChannelData(2);
+
+ for (var i = 0; i < length; ++i) {
+ dest[i] += source[i];
+ }
+ } else if (numberOfDestinationChannels == 1 && numberOfSourceChannels == 6) {
+ // Handle 5.1 -> mono.
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var sourceC = sourceBuffer.getChannelData(2);
+ // skip LFE for now, according to current spec.
+ var sourceSL = sourceBuffer.getChannelData(4);
+ var sourceSR = sourceBuffer.getChannelData(5);
+ var dest = destBuffer.getChannelData(0);
+
+ for (var i = 0; i < length; ++i) {
+ dest[i] += 0.7071 * (sourceL[i] + sourceR[i]) + sourceC[i] + 0.5 * (sourceSL[i] + sourceSR[i]);
+ }
+ } else if (numberOfDestinationChannels == 2 && numberOfSourceChannels == 6) {
+ // Handle 5.1 -> stereo.
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var sourceC = sourceBuffer.getChannelData(2);
+ // skip LFE for now, according to current spec.
+ var sourceSL = sourceBuffer.getChannelData(4);
+ var sourceSR = sourceBuffer.getChannelData(5);
+ var destL = destBuffer.getChannelData(0);
+ var destR = destBuffer.getChannelData(1);
+
+ for (var i = 0; i < length; ++i) {
+ destL[i] += sourceL[i] + 0.7071 * (sourceC[i] + sourceSL[i]);
+ destR[i] += sourceR[i] + 0.7071 * (sourceC[i] + sourceSR[i]);
+ }
+ } else if (numberOfDestinationChannels == 4 && numberOfSourceChannels == 6) {
+ // Handle 5.1 -> Quad.
+ var sourceL = sourceBuffer.getChannelData(0);
+ var sourceR = sourceBuffer.getChannelData(1);
+ var sourceC = sourceBuffer.getChannelData(2);
+ // skip LFE for now, according to current spec.
+ var sourceSL = sourceBuffer.getChannelData(4);
+ var sourceSR = sourceBuffer.getChannelData(5);
+ var destL = destBuffer.getChannelData(0);
+ var destR = destBuffer.getChannelData(1);
+ var destSL = destBuffer.getChannelData(2);
+ var destSR = destBuffer.getChannelData(3);
+
+ for (var i = 0; i < length; ++i) {
+ destL[i] += sourceL[i] + 0.7071 * sourceC[i];
+ destR[i] += sourceR[i] + 0.7071 * sourceC[i];
+ destSL[i] += sourceSL[i];
+ destSR[i] += sourceSR[i];
+ }
+ } else {
+ // Fallback for unknown combinations.
+ discreteSum(sourceBuffer, destBuffer);
+ }
+}
+
+function scheduleTest(testNumber, connections, channelCount, channelCountMode, channelInterpretation) {
+ var mixNode = context.createGain();
+ mixNode.channelCount = channelCount;
+ mixNode.channelCountMode = channelCountMode;
+ mixNode.channelInterpretation = channelInterpretation;
+ mixNode.connect(sp);
+
+ for (var i = 0; i < connections.length; ++i) {
+ var connectionNumberOfChannels = connections.charCodeAt(i) - "0".charCodeAt(0);
+
+ var source = context.createBufferSource();
+ // Get a buffer with the right number of channels, converting from 1-based to 0-based index.
+ var buffer = testBuffers[connectionNumberOfChannels - 1];
+ source.buffer = buffer;
+ source.connect(mixNode);
+
+ // Start at the right offset.
+ var sampleFrameOffset = testNumber * singleTestFrameLength;
+ var time = sampleFrameOffset / context.sampleRate;
+ source.start(time);
+ }
+}
+
+function computeNumberOfChannels(connections, channelCount, channelCountMode) {
+ if (channelCountMode == "explicit")
+ return channelCount;
+
+ var computedNumberOfChannels = 1; // Must have at least one channel.
+
+ // Compute "computedNumberOfChannels" based on all the connections.
+ for (var i = 0; i < connections.length; ++i) {
+ var connectionNumberOfChannels = connections.charCodeAt(i) - "0".charCodeAt(0);
+ computedNumberOfChannels = Math.max(computedNumberOfChannels, connectionNumberOfChannels);
+ }
+
+ if (channelCountMode == "clamped-max")
+ computedNumberOfChannels = Math.min(computedNumberOfChannels, channelCount);
+
+ return computedNumberOfChannels;
+}
+
+function checkTestResult(renderedBuffer, testNumber, connections, channelCount, channelCountMode, channelInterpretation) {
+ var computedNumberOfChannels = computeNumberOfChannels(connections, channelCount, channelCountMode);
+
+ // Create a zero-initialized silent AudioBuffer with computedNumberOfChannels.
+ var destBuffer = context.createBuffer(computedNumberOfChannels, singleTestFrameLength, context.sampleRate);
+
+ // Mix all of the connections into the destination buffer.
+ for (var i = 0; i < connections.length; ++i) {
+ var connectionNumberOfChannels = connections.charCodeAt(i) - "0".charCodeAt(0);
+ var sourceBuffer = testBuffers[connectionNumberOfChannels - 1]; // convert from 1-based to 0-based index
+
+ if (channelInterpretation == "speakers") {
+ speakersSum(sourceBuffer, destBuffer);
+ } else if (channelInterpretation == "discrete") {
+ discreteSum(sourceBuffer, destBuffer);
+ } else {
+ ok(false, "Invalid channel interpretation!");
+ }
+ }
+
+ // Validate that destBuffer matches the rendered output.
+ // We need to check the rendered output at a specific sample-frame-offset corresponding
+ // to the specific test case we're checking for based on testNumber.
+
+ var sampleFrameOffset = testNumber * singleTestFrameLength;
+ for (var c = 0; c < renderNumberOfChannels; ++c) {
+ var renderedData = renderedBuffer.getChannelData(c);
+ for (var frame = 0; frame < singleTestFrameLength; ++frame) {
+ var renderedValue = renderedData[frame + sampleFrameOffset];
+
+ var expectedValue = 0;
+ if (c < destBuffer.numberOfChannels) {
+ var expectedData = destBuffer.getChannelData(c);
+ expectedValue = expectedData[frame];
+ }
+
+ if (Math.abs(renderedValue - expectedValue) > 1e-4) {
+ var s = "connections: " + connections + ", " + channelCountMode;
+
+ // channelCount is ignored in "max" mode.
+ if (channelCountMode == "clamped-max" || channelCountMode == "explicit") {
+ s += "(" + channelCount + ")";
+ }
+
+ s += ", " + channelInterpretation + ". ";
+
+ var message = s + "rendered: " + renderedValue + " expected: " + expectedValue + " channel: " + c + " frame: " + frame;
+ is(renderedValue, expectedValue, message);
+ }
+ }
+ }
+}
+
+function checkResult(event) {
+ var buffer = event.inputBuffer;
+
+ // Sanity check result.
+ ok(buffer.length != numberOfTests * singleTestFrameLength ||
+ buffer.numberOfChannels != renderNumberOfChannels, "Sanity check");
+
+ // Check all the tests.
+ var testNumber = 0;
+ for (var m = 0; m < mixingRulesList.length; ++m) {
+ var mixingRules = mixingRulesList[m];
+ for (var i = 0; i < connectionsList.length; ++i, ++testNumber) {
+ checkTestResult(buffer, testNumber, connectionsList[i], mixingRules.channelCount, mixingRules.channelCountMode, mixingRules.channelInterpretation);
+ }
+ }
+
+ sp.onaudioprocess = null;
+ SimpleTest.finish();
+}
+
+SimpleTest.waitForExplicitFinish();
+function runTest() {
+ // Create 8-channel offline audio context.
+ // Each test will render 8 sample-frames starting at sample-frame position testNumber * 8.
+ var totalFrameLength = numberOfTests * singleTestFrameLength;
+ context = new AudioContext();
+ var nextPowerOfTwo = 256;
+ while (nextPowerOfTwo < totalFrameLength) {
+ nextPowerOfTwo *= 2;
+ }
+ sp = context.createScriptProcessor(nextPowerOfTwo, renderNumberOfChannels);
+
+ // Set destination to discrete mixing.
+ sp.channelCount = renderNumberOfChannels;
+ sp.channelCountMode = "explicit";
+ sp.channelInterpretation = "discrete";
+
+ // Create test buffers from 1 to 8 channels.
+ testBuffers = new Array();
+ for (var i = 0; i < renderNumberOfChannels; ++i) {
+ testBuffers[i] = createTestBuffer(i + 1);
+ }
+
+ // Schedule all the tests.
+ var testNumber = 0;
+ for (var m = 0; m < mixingRulesList.length; ++m) {
+ var mixingRules = mixingRulesList[m];
+ for (var i = 0; i < connectionsList.length; ++i, ++testNumber) {
+ scheduleTest(testNumber, connectionsList[i], mixingRules.channelCount, mixingRules.channelCountMode, mixingRules.channelInterpretation);
+ }
+ }
+
+ // Render then check results.
+ sp.onaudioprocess = checkResult;
+}
+
+runTest();
+
+</script>
+
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_mozaudiochannel.html b/dom/media/webaudio/test/test_mozaudiochannel.html
new file mode 100644
index 000000000..6ba14347b
--- /dev/null
+++ b/dom/media/webaudio/test/test_mozaudiochannel.html
@@ -0,0 +1,151 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for mozaudiochannel</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<pre id="test">
+<script type="application/javascript">
+
+function test_basic() {
+ var ac = new AudioContext();
+ ok(ac, "AudioContext created");
+
+ // Default
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ // Unpermitted channels
+ ac = new AudioContext("content");
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ ac = new AudioContext("notification");
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ ac = new AudioContext("alarm");
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ ac = new AudioContext("telephony");
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ ac = new AudioContext("ringer");
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ ac = new AudioContext("publicnotification");
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ runTest();
+}
+
+function test_permission(aChannel) {
+ var ac = new AudioContext();
+ ok(ac, "AudioContext created");
+
+ is(ac.mozAudioChannelType, "normal", "Default ac channel == 'normal'");
+
+ var channel = SpecialPowers.wrap(ac).testAudioChannelInAudioNodeStream();
+ is(channel, "normal", "AudioNodeStream is using the correct default audio channel.");
+
+ SpecialPowers.pushPermissions(
+ [{ "type": "audio-channel-" + aChannel, "allow": true, "context": document }],
+ function() {
+ var ac = new AudioContext(aChannel);
+ is(ac.mozAudioChannelType, aChannel, "Default ac channel == '" + aChannel + "'");
+
+ var channel = SpecialPowers.wrap(ac).testAudioChannelInAudioNodeStream();
+ is(channel, aChannel, "AudioNodeStream is using the correct new audio channel.");
+
+ runTest();
+ }
+ );
+}
+
+function test_preferences(aChannel) {
+ SpecialPowers.pushPrefEnv({"set": [["media.defaultAudioChannel", aChannel ]]},
+ function() {
+ SpecialPowers.pushPermissions(
+ [{ "type": "audio-channel-" + aChannel, "allow": false, "context": document }],
+ function() {
+ var ac = new AudioContext(aChannel);
+ ok(ac, "AudioContext created");
+ is(ac.mozAudioChannelType, aChannel, "Default ac channel == '" + aChannel + "'");
+
+ var channel = SpecialPowers.wrap(ac).testAudioChannelInAudioNodeStream();
+ is(channel, aChannel, "AudioNodeStream is using the correct audio channel.");
+
+ runTest();
+ }
+ );
+ }
+ );
+}
+
+function test_wrong_preferences() {
+ SpecialPowers.pushPrefEnv({"set": [["media.defaultAudioChannel", 'foobar' ]]},
+ function() {
+ var ac = new AudioContext();
+ ok(ac, "AudioContext created");
+ is(ac.mozAudioChannelType, 'normal', "Default ac channel == 'normal'");
+ runTest();
+ }
+ );
+}
+
+function test_testAudioChannelInAudioNodeStream() {
+ var ac = new AudioContext();
+ ok(ac, "AudioContext created");
+
+ var status = false;
+ try {
+ ac.testAudioChannelInAudioNodeStream();
+ } catch(e) {
+ status = true;
+ }
+
+ ok(status, "testAudioChannelInAudioNodeStream() should not exist in content.");
+ runTest();
+}
+
+var tests = [
+ test_basic,
+
+ function() { test_permission("content"); },
+ function() { test_permission("notification"); },
+ function() { test_permission("alarm"); },
+ function() { test_permission("telephony"); },
+ function() { test_permission("ringer"); },
+ function() { test_permission("publicnotification"); },
+
+ function() { test_preferences("content"); },
+ function() { test_preferences("notification"); },
+ function() { test_preferences("alarm"); },
+ function() { test_preferences("telephony"); },
+ function() { test_preferences("ringer"); },
+ function() { test_preferences("publicnotification"); },
+
+ test_wrong_preferences,
+
+ test_testAudioChannelInAudioNodeStream,
+];
+
+function runTest() {
+ if (!tests.length) {
+ SimpleTest.finish();
+ return;
+ }
+
+ var test = tests.shift();
+ test();
+}
+
+SpecialPowers.pushPrefEnv({"set": [["media.useAudioChannelAPI", true ]]}, runTest);
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestLongerTimeout(5);
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_nodeToParamConnection.html b/dom/media/webaudio/test/test_nodeToParamConnection.html
new file mode 100644
index 000000000..4525923db
--- /dev/null
+++ b/dom/media/webaudio/test/test_nodeToParamConnection.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test connecting an AudioNode to an AudioParam</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ createGraph: function(context) {
+ var sourceBuffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ sourceBuffer.getChannelData(0)[i] = 1;
+ sourceBuffer.getChannelData(1)[i] = -1;
+ }
+
+ var destination = context.destination;
+
+ var paramSource = context.createBufferSource();
+ paramSource.buffer = this.buffer;
+
+ var source = context.createBufferSource();
+ source.buffer = sourceBuffer;
+
+ var gain = context.createGain();
+
+ paramSource.connect(gain.gain);
+ source.connect(gain);
+
+ paramSource.start(0);
+ source.start(0);
+ return gain;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ for (var j = 0; j < 2; ++j) {
+ this.buffer.getChannelData(j)[i] = Math.sin(440 * 2 * (j + 1) * Math.PI * i / context.sampleRate);
+ }
+ }
+ var expectedBuffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = 1 + (this.buffer.getChannelData(0)[i] + this.buffer.getChannelData(1)[i]) / 2;
+ expectedBuffer.getChannelData(1)[i] = -(1 + (this.buffer.getChannelData(0)[i] + this.buffer.getChannelData(1)[i]) / 2);
+ }
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_offlineDestinationChannelCountLess.html b/dom/media/webaudio/test/test_offlineDestinationChannelCountLess.html
new file mode 100644
index 000000000..675106697
--- /dev/null
+++ b/dom/media/webaudio/test/test_offlineDestinationChannelCountLess.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test OfflineAudioContext with a channel count less than the specified number</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new OfflineAudioContext(2, 100, 22050);
+
+ var buf = ctx.createBuffer(6, 100, ctx.sampleRate);
+ for (var i = 0; i < 6; ++i) {
+ for (var j = 0; j < 100; ++j) {
+ buf.getChannelData(i)[j] = Math.sin(2 * Math.PI * 200 * j / ctx.sampleRate);
+ }
+ }
+
+ var src = ctx.createBufferSource();
+ src.buffer = buf;
+ src.start(0);
+ src.connect(ctx.destination);
+ ctx.destination.channelCountMode = "max";
+ ctx.startRendering();
+ ctx.oncomplete = function(e) {
+ is(e.renderedBuffer.numberOfChannels, 2, "Correct expected number of buffers");
+ compareChannels(e.renderedBuffer.getChannelData(0), buf.getChannelData(0));
+ compareChannels(e.renderedBuffer.getChannelData(1), buf.getChannelData(1));
+
+ SimpleTest.finish();
+ };
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_offlineDestinationChannelCountMore.html b/dom/media/webaudio/test/test_offlineDestinationChannelCountMore.html
new file mode 100644
index 000000000..7c7d5c8e5
--- /dev/null
+++ b/dom/media/webaudio/test/test_offlineDestinationChannelCountMore.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test OfflineAudioContext with a channel count less than the specified number</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var ctx = new OfflineAudioContext(6, 100, 22050);
+
+ var buf = ctx.createBuffer(2, 100, ctx.sampleRate);
+ for (var i = 0; i < 2; ++i) {
+ for (var j = 0; j < 100; ++j) {
+ buf.getChannelData(i)[j] = Math.sin(2 * Math.PI * 200 * j / ctx.sampleRate);
+ }
+ }
+ var emptyBuffer = ctx.createBuffer(1, 100, ctx.sampleRate);
+
+ var src = ctx.createBufferSource();
+ src.buffer = buf;
+ src.start(0);
+ src.connect(ctx.destination);
+ ctx.destination.channelCountMode = "max";
+ ctx.startRendering();
+ ctx.oncomplete = function(e) {
+ is(e.renderedBuffer.numberOfChannels, 6, "Correct expected number of buffers");
+ compareChannels(e.renderedBuffer.getChannelData(0), buf.getChannelData(0));
+ compareChannels(e.renderedBuffer.getChannelData(1), buf.getChannelData(1));
+ for (var i = 2; i < 6; ++i) {
+ compareChannels(e.renderedBuffer.getChannelData(i), emptyBuffer.getChannelData(0));
+ }
+
+ SimpleTest.finish();
+ };
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_oscillatorNode.html b/dom/media/webaudio/test/test_oscillatorNode.html
new file mode 100644
index 000000000..5eb488574
--- /dev/null
+++ b/dom/media/webaudio/test/test_oscillatorNode.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the OscillatorNode interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+
+ var context = new AudioContext();
+ var osc = context.createOscillator();
+
+ is(osc.channelCount, 2, "Oscillator node has 2 input channels by default");
+ is(osc.channelCountMode, "max", "Correct channelCountMode for the Oscillator node");
+ is(osc.channelInterpretation, "speakers", "Correct channelCountInterpretation for the Oscillator node");
+ is(osc.type, "sine", "Correct default type");
+ expectException(function() {
+ osc.type = "custom";
+ }, DOMException.INVALID_STATE_ERR);
+ is(osc.type, "sine", "Cannot set the type to custom");
+ is(osc.frequency.value, 440, "Correct default frequency value");
+ is(osc.detune.value, 0, "Correct default detine value");
+
+ // Make sure that we can set all of the valid type values
+ var types = [
+ "sine",
+ "square",
+ "sawtooth",
+ "triangle",
+ ];
+ for (var i = 0; i < types.length; ++i) {
+ osc.type = types[i];
+ }
+
+ // Verify setPeriodicWave()
+ var real = new Float32Array([1.0, 0.5, 0.25, 0.125]);
+ var imag = new Float32Array([1.0, 0.7, -1.0, 0.5]);
+ osc.setPeriodicWave(context.createPeriodicWave(real, imag));
+ is(osc.type, "custom", "Failed to set custom waveform");
+
+ expectNoException(function() {
+ osc.start();
+ });
+ expectNoException(function() {
+ osc.stop();
+ });
+
+ SimpleTest.finish();
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_oscillatorNode2.html b/dom/media/webaudio/test/test_oscillatorNode2.html
new file mode 100644
index 000000000..1ddae937c
--- /dev/null
+++ b/dom/media/webaudio/test/test_oscillatorNode2.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test OscillatorNode lifetime and sine phase</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+const signalLength = 2048;
+
+function createOscillator(context) {
+ var osc = context.createOscillator();
+ osc.start(0);
+ osc.stop(signalLength/context.sampleRate);
+ return osc;
+}
+
+function connectUnreferencedOscillator(context, destination) {
+ var osc = createOscillator(context);
+ osc.connect(destination);
+}
+
+var gTest = {
+ length: signalLength,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var blend = context.createGain();
+
+ connectUnreferencedOscillator(context, blend);
+ // Test that the unreferenced oscillator remains alive until it has finished.
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+
+ // Create another sine wave oscillator in negative time, which should
+ // cancel when mixed with the unreferenced oscillator.
+ var oscillator = createOscillator(context);
+ oscillator.frequency.value = -440;
+ oscillator.connect(blend);
+
+ return blend;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_oscillatorNodeNegativeFrequency.html b/dom/media/webaudio/test/test_oscillatorNodeNegativeFrequency.html
new file mode 100644
index 000000000..8acc025da
--- /dev/null
+++ b/dom/media/webaudio/test/test_oscillatorNodeNegativeFrequency.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the OscillatorNode when the frequency is negative</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+
+ var types = ["sine",
+ "square",
+ "sawtooth",
+ "triangle"];
+
+ var finished = 0;
+ function finish() {
+ if (++finished == types.length) {
+ SimpleTest.finish();
+ }
+ }
+
+ types.forEach(function(t) {
+ var context = new OfflineAudioContext(1, 256, 44100);
+ var osc = context.createOscillator();
+
+ osc.frequency.value = -440;
+ osc.type = t;
+
+ osc.connect(context.destination);
+ osc.start();
+ context.startRendering().then(function(buffer) {
+ var samples = buffer.getChannelData(0);
+ // This samples the wave form in the middle of the first period, the value
+ // should be negative.
+ ok(samples[Math.floor(44100 / 440 / 4)] < 0., "Phase should be inverted when using a " + t + " waveform");
+ finish();
+ });
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_oscillatorNodePassThrough.html b/dom/media/webaudio/test/test_oscillatorNodePassThrough.html
new file mode 100644
index 000000000..c732bb273
--- /dev/null
+++ b/dom/media/webaudio/test/test_oscillatorNodePassThrough.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test Oscillator with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var source = context.createOscillator();
+
+ var srcWrapped = SpecialPowers.wrap(source);
+ ok("passThrough" in srcWrapped, "OscillatorNode should support the passThrough API");
+ srcWrapped.passThrough = true;
+
+ source.start(0);
+ return source;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+
+ return [expectedBuffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_oscillatorNodeStart.html b/dom/media/webaudio/test/test_oscillatorNodeStart.html
new file mode 100644
index 000000000..c43219c99
--- /dev/null
+++ b/dom/media/webaudio/test/test_oscillatorNodeStart.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the OscillatorNode interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+
+ var context = new AudioContext();
+ var osc = context.createOscillator();
+ var sp = context.createScriptProcessor(0, 1, 0);
+
+ osc.connect(sp);
+
+ sp.onaudioprocess = function (e) {
+ var input = e.inputBuffer.getChannelData(0);
+ var isSilent = true;
+ for (var i = 0; i < input.length; i++) {
+ if (input[i] != 0.0) {
+ isSilent = false;
+ }
+ }
+ sp.onaudioprocess = null;
+ ok(isSilent, "OscillatorNode should be silent before calling start.");
+ SimpleTest.finish();
+ }
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_oscillatorTypeChange.html b/dom/media/webaudio/test/test_oscillatorTypeChange.html
new file mode 100644
index 000000000..aaf311a0c
--- /dev/null
+++ b/dom/media/webaudio/test/test_oscillatorTypeChange.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test OscillatorNode type change after it has started and triangle phase</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+const bufferSize = 1024;
+
+function startTest() {
+ var ctx = new AudioContext();
+
+ var oscillator1 = ctx.createOscillator();
+ oscillator1.connect(ctx.destination);
+ oscillator1.start(0);
+
+ // Assuming the above Web Audio operations have already scheduled an event
+ // to run in stable state and start the graph thread, schedule a subsequent
+ // event to change the type of oscillator1.
+ SimpleTest.executeSoon(function() {
+ oscillator1.type = "triangle";
+
+ // Another triangle wave with -1 gain should cancel the first. This is
+ // starting at the same time as the type change, assuming that the phase
+ // is reset on type change. A negative frequency should achieve the same
+ // as the -1 gain but for bug 916285.
+ var oscillator2 = ctx.createOscillator();
+ oscillator2.type = "triangle";
+ oscillator2.start(0);
+
+ var processor = ctx.createScriptProcessor(bufferSize, 1, 0);
+ oscillator1.connect(processor);
+ var gain = ctx.createGain();
+ gain.gain.value = -1;
+ gain.connect(processor);
+ oscillator2.connect(gain);
+
+ processor.onaudioprocess = function(e) {
+ compareChannels(e.inputBuffer.getChannelData(0),
+ new Float32Array(bufferSize));
+ e.target.onaudioprocess = null;
+ SimpleTest.finish();
+ }
+ });
+};
+
+startTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNode.html b/dom/media/webaudio/test/test_pannerNode.html
new file mode 100644
index 000000000..374ad3421
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNode.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+function near(a, b, msg) {
+ ok(Math.abs(a - b) < 1e-4, msg);
+}
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var destination = context.destination;
+
+ var source = context.createBufferSource();
+
+ var panner = context.createPanner();
+
+ source.buffer = buffer;
+
+ source.connect(panner);
+ panner.connect(destination);
+
+ // Verify default values
+ is(panner.panningModel, "equalpower", "Correct default value for panning model");
+ is(panner.distanceModel, "inverse", "Correct default value for distance model");
+ near(panner.refDistance, 1, "Correct default value for ref distance");
+ near(panner.maxDistance, 10000, "Correct default value for max distance");
+ near(panner.rolloffFactor, 1, "Correct default value for rolloff factor");
+ near(panner.coneInnerAngle, 360, "Correct default value for cone inner angle");
+ near(panner.coneOuterAngle, 360, "Correct default value for cone outer angle");
+ near(panner.coneOuterGain, 0, "Correct default value for cone outer gain");
+ is(panner.channelCount, 2, "panner node has 2 input channels by default");
+ is(panner.channelCountMode, "clamped-max", "Correct channelCountMode for the panner node");
+ is(panner.channelInterpretation, "speakers", "Correct channelCountInterpretation for the panner node");
+
+ panner.setPosition(1, 1, 1);
+ near(panner.positionX.value, 1, "setPosition sets AudioParam properly");
+ near(panner.positionY.value, 1, "setPosition sets AudioParam properly");
+ near(panner.positionZ.value, 1, "setPosition sets AudioParam properly");
+
+ panner.setOrientation(0, 1, 0);
+ near(panner.orientationX.value, 0, "setOrientation sets AudioParam properly");
+ near(panner.orientationY.value, 1, "setOrientation sets AudioParam properly");
+ near(panner.orientationZ.value, 0, "setOrientation sets AudioParam properly");
+
+ panner.setVelocity(1, 1, 1);
+
+ source.start(0);
+ SimpleTest.executeSoon(function() {
+ source.stop(0);
+ source.disconnect();
+ panner.disconnect();
+
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNodeAbove.html b/dom/media/webaudio/test/test_pannerNodeAbove.html
new file mode 100644
index 000000000..6bab394e6
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodeAbove.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode directly above</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ // An up vector will be made perpendicular to the front vector, in the
+ // front-up plane.
+ context.listener.setOrientation(0, 6.311749985202524e+307, 0, 0.1, 1000, 0);
+ // Linearly dependent vectors are ignored.
+ context.listener.setOrientation(0, 0, -6.311749985202524e+307, 0, 0, 6.311749985202524e+307);
+ var panner = context.createPanner();
+ panner.positionX.value = 2; // directly above
+ panner.rolloffFactor = 0; // no distance gain
+ panner.panningModel = "equalpower"; // no effect when directly above
+
+ var source = context.createBufferSource();
+ source.buffer = this.buffer;
+ source.connect(panner);
+ source.start(0);
+
+ return panner;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ // Different signals in left and right buffers
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ expectedBuffer.getChannelData(1)[i] = Math.sin(220 * 2 * Math.PI * i / context.sampleRate);
+ }
+ this.buffer = expectedBuffer;
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html b/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
new file mode 100644
index 000000000..21abd2b60
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodeAtZeroDistance.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode produces output even when the even when the distance is from the listener is zero</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var BUF_SIZE = 128;
+
+var types = [
+ "equalpower",
+ "HRTF"
+]
+
+var finished = types.length;
+
+function finish() {
+ if (!--finished) {
+ SimpleTest.finish();
+ }
+}
+
+function test(type) {
+ var ac = new OfflineAudioContext(1, BUF_SIZE, 44100);
+
+ // A sine to be used to fill the buffers
+ function sine(t) {
+ return Math.sin(440 * 2 * Math.PI * t / ac.sampleRate);
+ }
+
+ var monoBuffer = ac.createBuffer(1, BUF_SIZE, ac.sampleRate);
+ for (var i = 0; i < BUF_SIZE; ++i) {
+ monoBuffer.getChannelData(0)[i] = sine(i);
+ }
+
+ var monoSource = ac.createBufferSource();
+ monoSource.buffer = monoBuffer;
+ monoSource.start(0);
+
+ var panner = ac.createPanner();
+ panner.distanceModel = "linear";
+ panner.refDistance = 1;
+ panner.positionX.value = 0;
+ panner.positionY.value = 0;
+ panner.positionZ.value = 0;
+ monoSource.connect(panner);
+
+ var panner2 = ac.createPanner();
+ panner2.distanceModel = "inverse";
+ panner2.refDistance = 1;
+ panner2.positionX.value = 0;
+ panner2.positionY.value = 0;
+ panner2.positionZ.value = 0;
+ panner.connect(panner2);
+
+ var panner3 = ac.createPanner();
+ panner3.distanceModel = "exponential";
+ panner3.refDistance = 1;
+ panner3.positionX.value = 0;
+ panner3.positionY.value = 0;
+ panner3.positionZ.value = 0;
+ panner2.connect(panner3);
+
+ panner3.connect(ac.destination);
+
+ ac.startRendering().then(function(buffer) {
+ compareBuffers(buffer, monoBuffer);
+ finish();
+ });
+}
+
+addLoadEvent(function() {
+ types.forEach(test);
+});
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNodeChannelCount.html b/dom/media/webaudio/test/test_pannerNodeChannelCount.html
new file mode 100644
index 000000000..63a52ea0c
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodeChannelCount.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode directly above</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ var buffer = context.createBuffer(2, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ var sample = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ // When mixed into a single channel, this produces silence
+ buffer.getChannelData(0)[i] = sample;
+ buffer.getChannelData(1)[i] = -sample;
+ }
+
+ var panner = context.createPanner();
+ panner.positionX.value = 1;
+ panner.positionY.value = 2;
+ panner.positionZ.value = 3;
+ panner.channelCount = 1;
+ expectException(function() { panner.channelCount = 3; },
+ DOMException.NOT_SUPPORTED_ERR);
+ panner.channelCountMode = "explicit";
+ expectException(function() { panner.channelCountMode = "max"; },
+ DOMException.NOT_SUPPORTED_ERR);
+ panner.channelInterpretation = "discrete";
+ panner.channelInterpretation = "speakers";
+
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.connect(panner);
+ source.start(0);
+
+ return panner;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html b/dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html
new file mode 100644
index 000000000..c5312d042
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test left/right symmetry and block-offset invariance of HRTF panner</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+const blockSize = 128;
+const bufferSize = 4096; // > HRTF panner latency
+
+var ctx = new AudioContext();
+
+function isChannelSilent(channel) {
+ for (var i = 0; i < channel.length; ++i) {
+ if (channel[i] != 0.0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function startTest() {
+ var leftPanner = ctx.createPanner();
+ var rightPanner = ctx.createPanner();
+ leftPanner.type = "HRTF";
+ rightPanner.type = "HRTF";
+ leftPanner.positionX.value = -1;
+ rightPanner.positionX.value = 1;
+
+ // Test that PannerNode processes the signal consistently irrespective of
+ // the offset in the processing block. This is done by inserting a delay of
+ // less than a block size before one panner.
+ const delayTime = 0.7 * blockSize / ctx.sampleRate;
+ var leftDelay = ctx.createDelay(delayTime);
+ leftDelay.delayTime.value = delayTime;
+ leftDelay.connect(leftPanner);
+ // and compensating for the delay after the other.
+ var rightDelay = ctx.createDelay(delayTime);
+ rightDelay.delayTime.value = delayTime;
+ rightPanner.connect(rightDelay);
+
+ // Feed the panners with a signal having some harmonics to fill the spectrum.
+ var oscillator = ctx.createOscillator();
+ oscillator.frequency.value = 110;
+ oscillator.type = "sawtooth";
+ oscillator.connect(leftDelay);
+ oscillator.connect(rightPanner);
+ oscillator.start(0);
+
+ // Switch the channels on one panner output, and it should match the other.
+ var splitter = ctx.createChannelSplitter();
+ leftPanner.connect(splitter);
+ var merger = ctx.createChannelMerger();
+ splitter.connect(merger, 0, 1);
+ splitter.connect(merger, 1, 0);
+
+ // Invert one signal so that mixing with the other will find the difference.
+ var gain = ctx.createGain();
+ gain.gain.value = -1.0;
+ merger.connect(gain);
+
+ var processor = ctx.createScriptProcessor(bufferSize, 2, 0);
+ gain.connect(processor);
+ rightDelay.connect(processor);
+ processor.onaudioprocess =
+ function(e) {
+ compareBuffers(e.inputBuffer,
+ ctx.createBuffer(2, bufferSize, ctx.sampleRate));
+ e.target.onaudioprocess = null;
+ SimpleTest.finish();
+ }
+}
+
+function prepareTest() {
+ // A PannerNode will produce no output until it has loaded its HRIR
+ // database. Wait for this to load before starting the test.
+ var processor = ctx.createScriptProcessor(bufferSize, 2, 0);
+ var panner = ctx.createPanner();
+ panner.connect(processor);
+ var oscillator = ctx.createOscillator();
+ oscillator.connect(panner);
+ oscillator.start(0);
+
+ processor.onaudioprocess =
+ function(e) {
+ if (isChannelSilent(e.inputBuffer.getChannelData(0)))
+ return;
+
+ oscillator.stop(0);
+ panner.disconnect();
+ e.target.onaudioprocess = null;
+ startTest();
+ };
+}
+prepareTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNodePassThrough.html b/dom/media/webaudio/test/test_pannerNodePassThrough.html
new file mode 100644
index 000000000..ab1f4b46f
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodePassThrough.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var panner = context.createPanner();
+
+ source.buffer = this.buffer;
+
+ source.connect(panner);
+
+ context.listener.setOrientation(0, 6.311749985202524e+307, 0, 0.1, 1000, 0);
+ context.listener.setOrientation(0, 0, -6.311749985202524e+307, 0, 0, 6.311749985202524e+307);
+ panner.positionX = 2;
+ panner.rolloffFactor = 0;
+ panner.panningModel = "equalpower";
+
+ var pannerWrapped = SpecialPowers.wrap(panner);
+ ok("passThrough" in pannerWrapped, "PannerNode should support the passThrough API");
+ pannerWrapped.passThrough = true;
+
+ source.start(0);
+ return panner;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNodeTail.html b/dom/media/webaudio/test/test_pannerNodeTail.html
new file mode 100644
index 000000000..5fff52797
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNodeTail.html
@@ -0,0 +1,232 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test tail time lifetime of PannerNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// This tests that a PannerNode does not release its reference before
+// it finishes emitting sound.
+//
+// The PannerNode tail time is short, so, when a PannerNode is destroyed on
+// the main thread, it is unlikely to notify the graph thread before the tail
+// time expires. However, by adding DelayNodes downstream from the
+// PannerNodes, the graph thread can have enough time to notice that a
+// DelayNode has been destroyed.
+//
+// In the current implementation, DelayNodes will take a tail-time reference
+// immediately when they receive the first block of sound from an upstream
+// node, so this test connects the downstream DelayNodes while the upstream
+// nodes are finishing, and then runs GC (on the main thread) before the
+// DelayNodes receive any input (on the graph thread).
+//
+// Web Audio doesn't provide a means to precisely time connect()s but we can
+// test that the output of delay nodes matches the output from a reference
+// PannerNode that we know will not be GCed.
+//
+// Another set of delay nodes is added upstream to ensure that the source node
+// has removed its self-reference after dispatching its "ended" event.
+
+SimpleTest.waitForExplicitFinish();
+
+const blockSize = 128;
+// bufferSize should be long enough that to allow an audioprocess event to be
+// sent to the main thread and a connect message to return to the graph
+// thread.
+const bufferSize = 4096;
+const pannerCount = bufferSize / blockSize;
+// sourceDelayBufferCount should be long enough to allow the source node
+// onended to finish and remove the source self-reference.
+const sourceDelayBufferCount = 3;
+var gotEnded = false;
+// ccDelayLength should be long enough to allow CC to run
+var ccDelayBufferCount = 20;
+const ccDelayLength = ccDelayBufferCount * bufferSize;
+
+var ctx;
+var testPanners = [];
+var referencePanner;
+var referenceProcessCount = 0;
+var referenceOutput = [new Float32Array(bufferSize),
+ new Float32Array(bufferSize)];
+var testProcessor;
+var testProcessCount = 0;
+
+function isChannelSilent(channel) {
+ for (var i = 0; i < channel.length; ++i) {
+ if (channel[i] != 0.0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function onReferenceOutput(e) {
+ switch(referenceProcessCount) {
+
+ case sourceDelayBufferCount - 1:
+ // The panners are about to finish.
+ if (!gotEnded) {
+ todo(false, "Source hasn't ended. Increase sourceDelayBufferCount?");
+ }
+
+ // Connect each PannerNode output to a downstream DelayNode,
+ // and connect ScriptProcessors to compare test and reference panners.
+ var delayDuration = ccDelayLength / ctx.sampleRate;
+ for (var i = 0; i < pannerCount; ++i) {
+ var delay = ctx.createDelay(delayDuration);
+ delay.delayTime.value = delayDuration;
+ delay.connect(testProcessor);
+ testPanners[i].connect(delay);
+ }
+ testProcessor = null;
+ testPanners = null;
+
+ // The panning effect is linear so only one reference panner is required.
+ // This also checks that the individual panners don't chop their output
+ // too soon.
+ referencePanner.connect(e.target);
+
+ // Assuming the above operations have already scheduled an event to run in
+ // stable state and ask the graph thread to make connections, schedule a
+ // subsequent event to run cycle collection, which should not collect
+ // panners that are still producing sound.
+ SimpleTest.executeSoon(function() {
+ SpecialPowers.forceGC();
+ SpecialPowers.forceCC();
+ });
+
+ break;
+
+ case sourceDelayBufferCount:
+ // Record this buffer during which PannerNode outputs were connected.
+ for (var i = 0; i < 2; ++i) {
+ e.inputBuffer.copyFromChannel(referenceOutput[i], i);
+ }
+ e.target.onaudioprocess = null;
+ e.target.disconnect();
+
+ // If the buffer is silent, there is probably not much point just
+ // increasing the buffer size, because, with the buffer size already
+ // significantly larger than panner tail time, it demonstrates that the
+ // lag between threads is much greater than the tail time.
+ if (isChannelSilent(referenceOutput[0])) {
+ todo(false, "Connections not detected.");
+ }
+ }
+
+ referenceProcessCount++;
+}
+
+function onTestOutput(e) {
+ if (testProcessCount < sourceDelayBufferCount + ccDelayBufferCount) {
+ testProcessCount++;
+ return;
+ }
+
+ for (var i = 0; i < 2; ++i) {
+ compareChannels(e.inputBuffer.getChannelData(i), referenceOutput[i]);
+ }
+ e.target.onaudioprocess = null;
+ e.target.disconnect();
+ SimpleTest.finish();
+}
+
+function startTest() {
+ // 0.002 is MaxDelayTimeSeconds in HRTFpanner.cpp
+ // and 512 is fftSize() at 48 kHz.
+ const expectedPannerTailTime = 0.002 * ctx.sampleRate + 512;
+
+ // Create some PannerNodes downstream from DelayNodes with delays long
+ // enough for their source to finish, dispatch its "ended" event
+ // and release its playing reference. The DelayNodes should expire their
+ // tail-time references before the PannerNodes and so only the PannerNode
+ // lifetimes depends on their tail-time references. Many DelayNodes are
+ // created and timed to finish at different times so that one PannerNode
+ // will be finishing the block processed immediately after the connect is
+ // received.
+ var source = ctx.createBufferSource();
+ // Just short of blockSize here to avoid rounding into the next block
+ var buffer = ctx.createBuffer(1, blockSize - 1, ctx.sampleRate);
+ for (var i = 0; i < buffer.length; ++i) {
+ buffer.getChannelData(0)[i] = Math.cos(Math.PI * i / buffer.length);
+ }
+ source.buffer = buffer;
+ source.start(0);
+ source.onended = function(e) {
+ gotEnded = true;
+ };
+
+ // Time the first test panner to finish just before downstream DelayNodes
+ // are about the be connected. Note that DelayNode lifetime depends on
+ // maxDelayTime so set that equal to the delay.
+ var delayDuration =
+ (sourceDelayBufferCount * bufferSize
+ - expectedPannerTailTime - 2 * blockSize) / ctx.sampleRate;
+
+ for (var i = 0; i < pannerCount; ++i) {
+ var delay = ctx.createDelay(delayDuration);
+ delay.delayTime.value = delayDuration;
+ source.connect(delay);
+ delay.connect(referencePanner)
+
+ var panner = ctx.createPanner();
+ panner.type = "HRTF";
+ delay.connect(panner);
+ testPanners[i] = panner;
+
+ delayDuration += blockSize / ctx.sampleRate;
+ }
+
+ // Create a ScriptProcessor now to use as a timer to trigger connection of
+ // downstream nodes. It will also be used to record reference output.
+ var referenceProcessor = ctx.createScriptProcessor(bufferSize, 2, 0);
+ referenceProcessor.onaudioprocess = onReferenceOutput;
+ // Start audioprocess events before source delays are connected.
+ referenceProcessor.connect(ctx.destination);
+
+ // The test ScriptProcessor will record output of testPanners.
+ // Create it now so that it is synchronized with the referenceProcessor.
+ testProcessor = ctx.createScriptProcessor(bufferSize, 2, 0);
+ testProcessor.onaudioprocess = onTestOutput;
+ // Start audioprocess events before source delays are connected.
+ testProcessor.connect(ctx.destination);
+}
+
+function prepareTest() {
+ ctx = new AudioContext();
+ // Place the listener to the side of the origin, where the panners are
+ // positioned, to maximize delay in one ear.
+ ctx.listener.setPosition(1,0,0);
+
+ // A PannerNode will produce no output until it has loaded its HRIR
+ // database. Wait for this to load before starting the test.
+ var processor = ctx.createScriptProcessor(bufferSize, 2, 0);
+ referencePanner = ctx.createPanner();
+ referencePanner.type = "HRTF";
+ referencePanner.connect(processor);
+ var oscillator = ctx.createOscillator();
+ oscillator.connect(referencePanner);
+ oscillator.start(0);
+
+ processor.onaudioprocess = function(e) {
+ if (isChannelSilent(e.inputBuffer.getChannelData(0)))
+ return;
+
+ oscillator.stop(0);
+ oscillator.disconnect();
+ referencePanner.disconnect();
+ e.target.onaudioprocess = null;
+ SimpleTest.executeSoon(startTest);
+ };
+}
+prepareTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNode_equalPower.html b/dom/media/webaudio/test/test_pannerNode_equalPower.html
new file mode 100644
index 000000000..14e9f2153
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNode_equalPower.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>Test PannerNode</title>
+<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+<script type="text/javascript" src="webaudio.js"></script>
+<script type="text/javascript" src="layouttest-glue.js"></script>
+<script type="text/javascript" src="blink/audio-testing.js"></script>
+<script type="text/javascript" src="blink/panner-model-testing.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ function checkFinished() {
+ SimpleTest.finish();
+ }
+ var ctx = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+ createTestAndRun(ctx, nodesToCreate, 2, checkFinished);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_pannerNode_maxDistance.html b/dom/media/webaudio/test/test_pannerNode_maxDistance.html
new file mode 100644
index 000000000..faca136b3
--- /dev/null
+++ b/dom/media/webaudio/test/test_pannerNode_maxDistance.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PannerNode outputs silence when the distance is greater than maxDist</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var types = [
+ "equalpower",
+ "HRTF"
+]
+
+var finished = types.length;
+
+function finish() {
+ if (!--finished) {
+ SimpleTest.finish();
+ }
+}
+
+function test(type) {
+ var ac = new OfflineAudioContext(1, 128, 44100);
+ var osc = ac.createOscillator();
+ var panner = ac.createPanner();
+
+ panner.distanceModel = "linear";
+ panner.maxDistance = 100;
+ panner.positionY.value = 200;
+ ac.listener.setPosition(0, 0, 0);
+
+ osc.connect(panner);
+ panner.connect(ac.destination);
+
+ osc.start();
+
+ ac.startRendering().then(function(buffer) {
+ var silence = true;
+ var array = buffer.getChannelData(0);
+ for (var i = 0; i < buffer.length; i++) {
+ if (array[i] != 0) {
+ ok(false, "Found noise in the buffer.");
+ silence = false;
+ }
+ }
+ ok(silence, "The buffer is silent.");
+ finish();
+ });
+}
+
+
+addLoadEvent(function() {
+ types.forEach(test);
+});
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_periodicWave.html b/dom/media/webaudio/test/test_periodicWave.html
new file mode 100644
index 000000000..3ed440748
--- /dev/null
+++ b/dom/media/webaudio/test/test_periodicWave.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test the PeriodicWave interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// real and imag are used in separate PeriodicWaves to make their peak values
+// easy to determine.
+const realMax = 99;
+var real = new Float32Array(realMax + 1);
+real[1] = 2.0; // fundamental
+real[realMax] = 3.0;
+const realPeak = real[1] + real[realMax];
+const realFundamental = 19.0;
+var imag = new Float32Array(4);
+imag[0] = 6.0; // should be ignored.
+imag[3] = 0.5;
+const imagPeak = imag[3];
+const imagFundamental = 551.0;
+
+const testLength = 4096;
+
+addLoadEvent(function() {
+ var ac = new AudioContext();
+ ac.createPeriodicWave(new Float32Array(4096), new Float32Array(4096));
+ expectException(function() {
+ ac.createPeriodicWave(new Float32Array(512), imag);
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() {
+ ac.createPeriodicWave(new Float32Array(0), new Float32Array(0));
+ }, DOMException.NOT_SUPPORTED_ERR);
+ expectNoException(function() {
+ ac.createPeriodicWave(new Float32Array(4097), new Float32Array(4097));
+ });
+
+ runTest();
+});
+
+var gTest = {
+ createGraph: function(context) {
+ var merger = context.createChannelMerger();
+
+ var osc0 = context.createOscillator();
+ var osc1 = context.createOscillator();
+
+ osc0.setPeriodicWave(context.
+ createPeriodicWave(real,
+ new Float32Array(real.length)));
+ osc1.setPeriodicWave(context.
+ createPeriodicWave(new Float32Array(imag.length),
+ imag));
+
+ osc0.frequency.value = realFundamental;
+ osc1.frequency.value = imagFundamental;
+
+ osc0.start();
+ osc1.start();
+
+ osc0.connect(merger, 0, 0);
+ osc1.connect(merger, 0, 1);
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ var buffer = context.createBuffer(2, testLength, context.sampleRate);
+
+ for (var i = 0; i < buffer.length; ++i) {
+
+ buffer.getChannelData(0)[i] = 1.0 / realPeak *
+ (real[1] * Math.cos(2 * Math.PI * realFundamental * i /
+ context.sampleRate) +
+ real[realMax] * Math.cos(2 * Math.PI * realMax * realFundamental * i /
+ context.sampleRate));
+
+ buffer.getChannelData(1)[i] = 1.0 / imagPeak *
+ imag[3] * Math.sin(2 * Math.PI * 3 * imagFundamental * i /
+ context.sampleRate);
+ }
+ return buffer;
+ },
+};
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_periodicWaveBandLimiting.html b/dom/media/webaudio/test/test_periodicWaveBandLimiting.html
new file mode 100644
index 000000000..70fbb09e2
--- /dev/null
+++ b/dom/media/webaudio/test/test_periodicWaveBandLimiting.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<title>Test effect of band limiting on PeriodicWave signals</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const sampleRate = 48000;
+const bufferSize = 12800;
+const epsilon = 0.01;
+
+// "All implementations must support arrays up to at least 8192", but the
+// linear interpolation of the current implementation distorts the higher
+// frequency components too much to pass this test.
+const frequencyIndexMax = 200;
+
+// A set of oscillators are created near the Nyquist frequency.
+// These are factors giving each oscillator frequency relative to the Nyquist.
+// The first is an octave below Nyquist and the last is just above.
+const OCTAVE_BELOW = 0;
+const HALF_BELOW = 1;
+const NEAR_BELOW = 2;
+const ABOVE = 3;
+const oscillatorFactors = [0.5, Math.sqrt(0.5), 0.99, 1.01];
+const oscillatorCount = oscillatorFactors.length;
+
+// Return magnitude relative to unit sine wave
+function magnitude(array) {
+ var mag = 0
+ for (var i = 0; i < array.length; ++i) {
+ sample = array[i];
+ mag += sample * sample;
+ }
+ return Math.sqrt(2 * mag / array.length);
+}
+
+function test_frequency_index(frequencyIndex) {
+
+ var context =
+ new OfflineAudioContext(oscillatorCount, bufferSize, sampleRate);
+
+ var merger = context.createChannelMerger(oscillatorCount);
+ merger.connect(context.destination);
+
+ var real = new Float32Array(frequencyIndex + 1);
+ real[frequencyIndex] = 1;
+ var image = new Float32Array(real.length);
+ var wave = context.createPeriodicWave(real, image);
+
+ for (var i = 0; i < oscillatorCount; ++i) {
+ var oscillator = context.createOscillator();
+ oscillator.frequency.value =
+ oscillatorFactors[i] * sampleRate / (2 * frequencyIndex);
+ oscillator.connect(merger, 0, i);
+ oscillator.setPeriodicWave(wave);
+ oscillator.start(0);
+ }
+
+ return context.startRendering().
+ then((buffer) => {
+ assert_equals(buffer.numberOfChannels, oscillatorCount);
+ var magnitudes = [];
+ for (var i = 0; i < oscillatorCount; ++i) {
+ magnitudes[i] = magnitude(buffer.getChannelData(i));
+ }
+ // Unaffected by band-limiting one octave below Nyquist.
+ assert_approx_equals(magnitudes[OCTAVE_BELOW], 1, epsilon,
+ "magnitude with frequency octave below Nyquist");
+ // Still at least half the amplitude at half octave below Nyquist.
+ assert_greater_than(magnitudes[HALF_BELOW], 0.5 * (1 - epsilon),
+ "magnitude with frequency half octave below Nyquist");
+ // Approaching zero or zero near Nyquist.
+ assert_less_than(magnitudes[NEAR_BELOW], 0.1,
+ "magnitude with frequency near Nyquist");
+ assert_equals(magnitudes[ABOVE], 0,
+ "magnitude with frequency above Nyquist");
+ });
+}
+
+// The 5/4 ratio with rounding up provides sampling across a range of
+// octaves and offsets within octaves.
+for (var frequencyIndex = 1;
+ frequencyIndex < frequencyIndexMax;
+ frequencyIndex = Math.floor((5 * frequencyIndex + 3) / 4)) {
+ promise_test(test_frequency_index.bind(null, frequencyIndex),
+ "Frequency " + frequencyIndex);
+}
+</script>
diff --git a/dom/media/webaudio/test/test_periodicWaveDisableNormalization.html b/dom/media/webaudio/test/test_periodicWaveDisableNormalization.html
new file mode 100644
index 000000000..fb924c475
--- /dev/null
+++ b/dom/media/webaudio/test/test_periodicWaveDisableNormalization.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test PeriodicWave disableNormalization Parameter</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+// We create PerodicWave instances containing two tones and compare it to
+// buffers created directly in JavaScript by adding the two waves together.
+// Two of the PeriodicWaves are normalized, the other is not. This test is
+// a modification of test_periodicWave.html.
+//
+// These constants are borrowed from test_periodicWave.html and modified
+// so that the realPeak (which is the normalization factor) will be small
+// enough that the errors are within the bounds for the test.
+const realMax = 99;
+var real = new Float32Array(realMax + 1);
+real[1] = 2.0; // fundamental
+real[realMax] = 0.25;
+
+const realPeak = real[1] + real[realMax];
+const realFundamental = 19.0;
+
+const testLength = 4096;
+
+addLoadEvent(function() {
+ runTest();
+});
+
+var gTest = {
+ createGraph: function(context) {
+ var merger = context.createChannelMerger();
+
+ var osc0 = context.createOscillator();
+ var osc1 = context.createOscillator();
+ var osc2 = context.createOscillator();
+
+ osc0.setPeriodicWave(context.
+ createPeriodicWave(real,
+ new Float32Array(real.length),
+ {disableNormalization: false}));
+ osc1.setPeriodicWave(context.
+ createPeriodicWave(real,
+ new Float32Array(real.length)));
+ osc2.setPeriodicWave(context.
+ createPeriodicWave(real,
+ new Float32Array(real.length),
+ {disableNormalization: true}));
+
+ osc0.frequency.value = realFundamental;
+ osc1.frequency.value = realFundamental;
+ osc2.frequency.value = realFundamental;
+
+ osc0.start();
+ osc1.start();
+ osc2.start();
+
+ osc0.connect(merger, 0, 0);
+ osc1.connect(merger, 0, 1);
+ osc2.connect(merger, 0, 2);
+
+ return merger;
+ },
+ createExpectedBuffers: function(context) {
+ var buffer = context.createBuffer(3, testLength, context.sampleRate);
+
+ for (var i = 0; i < buffer.length; ++i) {
+
+ buffer.getChannelData(0)[i] = 1.0 / realPeak *
+ (real[1] * Math.cos(2 * Math.PI * realFundamental * i /
+ context.sampleRate) +
+ real[realMax] * Math.cos(2 * Math.PI * realMax * realFundamental * i /
+ context.sampleRate));
+
+ buffer.getChannelData(1)[i] = buffer.getChannelData(0)[i];
+
+ // TODO: We need to scale by a factor of two to make the results work
+ // out here. This seems suspicious, see Bug 1266737.
+ buffer.getChannelData(2)[i] = 2.0 *
+ (real[1] * Math.cos(2 * Math.PI * realFundamental * i /
+ context.sampleRate) +
+ real[realMax] * Math.cos(2 * Math.PI * realMax * realFundamental * i /
+ context.sampleRate));
+ }
+ return buffer;
+ },
+ 'numberOfChannels': 3,
+};
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_scriptProcessorNode.html b/dom/media/webaudio/test/test_scriptProcessorNode.html
new file mode 100644
index 000000000..7cfb3d96e
--- /dev/null
+++ b/dom/media/webaudio/test/test_scriptProcessorNode.html
@@ -0,0 +1,132 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ScriptProcessorNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// We do not use our generic graph test framework here because
+// the testing logic here is sort of complicated, and would
+// not be easy to map to OfflineAudioContext, as ScriptProcessorNodes
+// can experience delays.
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = null;
+
+ var sourceSP = context.createScriptProcessor(2048);
+ sourceSP.addEventListener("audioprocess", function(e) {
+ // generate the audio
+ for (var i = 0; i < 2048; ++i) {
+ // Make sure our first sample won't be zero
+ e.outputBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * (i + 1) / context.sampleRate);
+ e.outputBuffer.getChannelData(1)[i] = Math.sin(880 * 2 * Math.PI * (i + 1) / context.sampleRate);
+ }
+ // Remember our generated audio
+ buffer = e.outputBuffer;
+
+ sourceSP.removeEventListener("audioprocess", arguments.callee);
+ }, false);
+
+ expectException(function() {
+ context.createScriptProcessor(1);
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ context.createScriptProcessor(2);
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ context.createScriptProcessor(128);
+ }, DOMException.INDEX_SIZE_ERR);
+ expectException(function() {
+ context.createScriptProcessor(255);
+ }, DOMException.INDEX_SIZE_ERR);
+
+ is(sourceSP.channelCount, 2, "script processor node has 2 input channels by default");
+ is(sourceSP.channelCountMode, "explicit", "Correct channelCountMode for the script processor node");
+ is(sourceSP.channelInterpretation, "speakers", "Correct channelCountInterpretation for the script processor node");
+
+ function findFirstNonZeroSample(buffer) {
+ for (var i = 0; i < buffer.length; ++i) {
+ if (buffer.getChannelData(0)[i] != 0) {
+ return i;
+ }
+ }
+ return buffer.length;
+ }
+
+ var sp = context.createScriptProcessor(2048);
+ sourceSP.connect(sp);
+ sp.connect(context.destination);
+ var lastPlaybackTime = 0;
+
+ var emptyBuffer = context.createBuffer(1, 2048, context.sampleRate);
+
+ function checkAudioProcessingEvent(e) {
+ is(e.target, sp, "Correct event target");
+ ok(e.playbackTime > lastPlaybackTime, "playbackTime correctly set");
+ lastPlaybackTime = e.playbackTime;
+ is(e.inputBuffer.numberOfChannels, 2, "Correct number of channels for the input buffer");
+ is(e.inputBuffer.length, 2048, "Correct length for the input buffer");
+ is(e.inputBuffer.sampleRate, context.sampleRate, "Correct sample rate for the input buffer");
+ is(e.outputBuffer.numberOfChannels, 2, "Correct number of channels for the output buffer");
+ is(e.outputBuffer.length, 2048, "Correct length for the output buffer");
+ is(e.outputBuffer.sampleRate, context.sampleRate, "Correct sample rate for the output buffer");
+
+ compareChannels(e.outputBuffer.getChannelData(0), emptyBuffer.getChannelData(0));
+ compareChannels(e.outputBuffer.getChannelData(1), emptyBuffer.getChannelData(0));
+ }
+
+ sp.onaudioprocess = function(e) {
+ isnot(buffer, null, "The audioprocess handler for sourceSP must be run at this point");
+ checkAudioProcessingEvent(e);
+
+ // Because of the initial latency added by the second script processor node,
+ // we will never see any generated audio frames in the first callback.
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0));
+ compareChannels(e.inputBuffer.getChannelData(1), emptyBuffer.getChannelData(0));
+
+ sp.onaudioprocess = function(e) {
+ checkAudioProcessingEvent(e);
+
+ var firstNonZero = findFirstNonZeroSample(e.inputBuffer);
+ ok(firstNonZero <= 2048, "First non-zero sample within range");
+
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0), firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(1), emptyBuffer.getChannelData(0), firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(0), buffer.getChannelData(0), 2048 - firstNonZero, firstNonZero, 0);
+ compareChannels(e.inputBuffer.getChannelData(1), buffer.getChannelData(1), 2048 - firstNonZero, firstNonZero, 0);
+
+ if (firstNonZero == 0) {
+ // If we did not experience any delays, the test is done!
+ sp.onaudioprocess = null;
+
+ SimpleTest.finish();
+ } else if (firstNonZero != 2048) {
+ // In case we just saw a zero buffer this time, wait one more round
+ sp.onaudioprocess = function(e) {
+ checkAudioProcessingEvent(e);
+
+ compareChannels(e.inputBuffer.getChannelData(0), buffer.getChannelData(0), firstNonZero, 0, 2048 - firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(1), buffer.getChannelData(1), firstNonZero, 0, 2048 - firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0), undefined, firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(1), emptyBuffer.getChannelData(0), undefined, firstNonZero);
+
+ sp.onaudioprocess = null;
+
+ SimpleTest.finish();
+ };
+ }
+ };
+ };
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_scriptProcessorNodeChannelCount.html b/dom/media/webaudio/test/test_scriptProcessorNodeChannelCount.html
new file mode 100644
index 000000000..6361a1747
--- /dev/null
+++ b/dom/media/webaudio/test/test_scriptProcessorNodeChannelCount.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// We do not use our generic graph test framework here because
+// the testing logic here is sort of complicated, and would
+// not be easy to map to OfflineAudioContext, as ScriptProcessorNodes
+// can experience delays.
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(6, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ for (var j = 0; j < 6; ++j) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * j * Math.PI * i / context.sampleRate);
+ }
+ }
+
+ var monoBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ monoBuffer.getChannelData(0)[i] = 1;
+ }
+
+ var source = context.createBufferSource();
+
+ var sp = context.createScriptProcessor(2048, 3);
+ expectException(function() { sp.channelCount = 2; },
+ DOMException.NOT_SUPPORTED_ERR);
+ sp.channelCountMode = "explicit";
+ expectException(function() { sp.channelCountMode = "max"; },
+ DOMException.NOT_SUPPORTED_ERR);
+ expectException(function() { sp.channelCountMode = "clamped-max"; },
+ DOMException.NOT_SUPPORTED_ERR);
+ sp.channelInterpretation = "discrete";
+ source.start(0);
+ source.buffer = buffer;
+ source.connect(sp);
+ sp.connect(context.destination);
+
+ var monoSource = context.createBufferSource();
+ monoSource.buffer = monoBuffer;
+ monoSource.connect(sp);
+ monoSource.start(2048 / context.sampleRate);
+
+ sp.onaudioprocess = function(e) {
+ is(e.inputBuffer.numberOfChannels, 3, "Should be correctly down-mixed to three channels");
+ for (var i = 0; i < 3; ++i) {
+ compareChannels(e.inputBuffer.getChannelData(i), buffer.getChannelData(i));
+ }
+
+ // On the next iteration, we'll get a silence buffer
+ sp.onaudioprocess = function(e) {
+ var emptyBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ is(e.inputBuffer.numberOfChannels, 3, "Should be correctly up-mixed to three channels");
+ compareChannels(e.inputBuffer.getChannelData(0), monoBuffer.getChannelData(0));
+ for (var i = 1; i < 3; ++i) {
+ compareChannels(e.inputBuffer.getChannelData(i), emptyBuffer.getChannelData(0));
+ }
+
+ sp.onaudioprocess = null;
+ sp.disconnect(context.destination);
+
+ SimpleTest.finish();
+ };
+ };
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html b/dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html
new file mode 100644
index 000000000..a3c073e38
--- /dev/null
+++ b/dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode: should not fire audioprocess if not connected.</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+SimpleTest.requestFlakyTimeout("This test needs to wait a while to ensure that a given event does not happen.");
+addLoadEvent(function() {
+ var context = new AudioContext();
+
+ var sp = context.createScriptProcessor(2048, 2, 2);
+ sp.onaudioprocess = function(e) {
+ ok(false, "Should not call onaudioprocess if the node is not connected.");
+ sp.onaudioprocess = null;
+ SimpleTest.finish();
+ };
+ setTimeout(function() {
+ console.log(sp.onaudioprocess);
+ if (sp.onaudioprocess) {
+ ok(true, "onaudioprocess not fired.");
+ SimpleTest.finish();
+ }
+ }, 4000);
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html b/dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html
new file mode 100644
index 000000000..8352a331d
--- /dev/null
+++ b/dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ScriptProcessorNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+// We do not use our generic graph test framework here because
+// the testing logic here is sort of complicated, and would
+// not be easy to map to OfflineAudioContext, as ScriptProcessorNodes
+// can experience delays.
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = null;
+
+ var sourceSP = context.createScriptProcessor(2048);
+ sourceSP.addEventListener("audioprocess", function(e) {
+ // generate the audio
+ for (var i = 0; i < 2048; ++i) {
+ // Make sure our first sample won't be zero
+ e.outputBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * (i + 1) / context.sampleRate);
+ e.outputBuffer.getChannelData(1)[i] = Math.sin(880 * 2 * Math.PI * (i + 1) / context.sampleRate);
+ }
+ // Remember our generated audio
+ buffer = e.outputBuffer;
+
+ sourceSP.removeEventListener("audioprocess", arguments.callee);
+ }, false);
+
+ function findFirstNonZeroSample(buffer) {
+ for (var i = 0; i < buffer.length; ++i) {
+ if (buffer.getChannelData(0)[i] != 0) {
+ return i;
+ }
+ }
+ return buffer.length;
+ }
+
+ var sp = context.createScriptProcessor(2048);
+ sourceSP.connect(sp);
+
+ var spWrapped = SpecialPowers.wrap(sp);
+ ok("passThrough" in spWrapped, "ScriptProcessorNode should support the passThrough API");
+ spWrapped.passThrough = true;
+
+ sp.onaudioprocess = function() {
+ ok(false, "The audioprocess event must never be dispatched on the passthrough ScriptProcessorNode");
+ };
+
+ var sp2 = context.createScriptProcessor(2048);
+ sp.connect(sp2);
+ sp2.connect(context.destination);
+
+ var emptyBuffer = context.createBuffer(1, 2048, context.sampleRate);
+
+ sp2.onaudioprocess = function(e) {
+ // Because of the initial latency added by the second script processor node,
+ // we will never see any generated audio frames in the first callback.
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0));
+ compareChannels(e.inputBuffer.getChannelData(1), emptyBuffer.getChannelData(0));
+
+ sp2.onaudioprocess = function(e) {
+ var firstNonZero = findFirstNonZeroSample(e.inputBuffer);
+ ok(firstNonZero <= 2048, "First non-zero sample within range");
+
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0), firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(1), emptyBuffer.getChannelData(0), firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(0), buffer.getChannelData(0), 2048 - firstNonZero, firstNonZero, 0);
+ compareChannels(e.inputBuffer.getChannelData(1), buffer.getChannelData(1), 2048 - firstNonZero, firstNonZero, 0);
+
+ if (firstNonZero == 0) {
+ // If we did not experience any delays, the test is done!
+ sp2.onaudioprocess = null;
+
+ SimpleTest.finish();
+ } else if (firstNonZero != 2048) {
+ // In case we just saw a zero buffer this time, wait one more round
+ sp2.onaudioprocess = function(e) {
+ compareChannels(e.inputBuffer.getChannelData(0), buffer.getChannelData(0), firstNonZero, 0, 2048 - firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(1), buffer.getChannelData(1), firstNonZero, 0, 2048 - firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(0), emptyBuffer.getChannelData(0), undefined, firstNonZero);
+ compareChannels(e.inputBuffer.getChannelData(1), emptyBuffer.getChannelData(0), undefined, firstNonZero);
+
+ sp2.onaudioprocess = null;
+
+ SimpleTest.finish();
+ };
+ }
+ };
+ };
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_scriptProcessorNodeZeroInputOutput.html b/dom/media/webaudio/test/test_scriptProcessorNodeZeroInputOutput.html
new file mode 100644
index 000000000..6ac8beda0
--- /dev/null
+++ b/dom/media/webaudio/test/test_scriptProcessorNodeZeroInputOutput.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test AudioBufferSourceNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+
+ var sp = context.createScriptProcessor(2048, 0, 2);
+ sp.onaudioprocess = function(e) {
+ is(e.inputBuffer.numberOfChannels, 0, "Should have 0 input channels");
+ is(e.outputBuffer.numberOfChannels, 2, "Should have 2 output channels");
+ sp.onaudioprocess = null;
+
+ sp = context.createScriptProcessor(2048, 2, 0);
+ sp.onaudioprocess = function(e) {
+ is(e.inputBuffer.numberOfChannels, 2, "Should have 2 input channels");
+ is(e.outputBuffer.numberOfChannels, 0, "Should have 0 output channels");
+ sp.onaudioprocess = null;
+
+ SimpleTest.finish();
+ };
+ sp.connect(context.destination);
+ };
+ sp.connect(context.destination);
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html b/dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html
new file mode 100644
index 000000000..43cd13912
--- /dev/null
+++ b/dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test ScriptProcessorNode playbackTime for bug 970773</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+
+var context = new AudioContext();
+const delay = 0.1;
+
+function doTest() {
+ const processorBufferLength = 256;
+ // |currentTime| may include double precision floating point
+ // rounding errors, so round to nearest integer sample to ignore these.
+ var minimumPlaybackSample =
+ Math.round(context.currentTime * context.sampleRate) +
+ processorBufferLength;
+ var sp = context.createScriptProcessor(processorBufferLength);
+ sp.connect(context.destination);
+ sp.onaudioprocess =
+ function(e) {
+ is(e.inputBuffer.length, processorBufferLength,
+ "expected buffer length");
+ var playbackSample = Math.round(e.playbackTime * context.sampleRate)
+ ok(playbackSample >= minimumPlaybackSample,
+ "playbackSample " + playbackSample +
+ " beyond expected minimum " + minimumPlaybackSample);
+ sp.onaudioprocess = null;
+ SimpleTest.finish();
+ };
+}
+
+// Wait until AudioDestinationNode has accumulated enough 'extra' time so that
+// a failure would be easily detected.
+(function waitForExtraTime() {
+ if (context.currentTime < delay) {
+ SimpleTest.executeSoon(waitForExtraTime);
+ } else {
+ doTest();
+ }
+})();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_sequentialBufferSourceWithResampling.html b/dom/media/webaudio/test/test_sequentialBufferSourceWithResampling.html
new file mode 100644
index 000000000..5c03a8a91
--- /dev/null
+++ b/dom/media/webaudio/test/test_sequentialBufferSourceWithResampling.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<title>Test seamless playback of a series of resampled buffers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+// Permitting some accumulation of rounding to int16_t.
+// 64/2^15 would be only just small enough to detect off-by-one-subsample
+// scheduling errors with the frequencies here.
+const EPSILON = 4.0 / Math.pow(2, 15);
+// Offsets test for rounding to nearest rather than up or down.
+const OFFSETS = [EPSILON, 1.0 - EPSILON];
+// The ratio of resampling is 147:160, so 256 start points is enough to cover
+// every fractional offset.
+const LENGTH = 256;
+
+function do_test(context_rate, buffer_rate, start_offset) {
+
+ var context =
+ new OfflineAudioContext(2, LENGTH, context_rate);
+
+ var merger = context.createChannelMerger(context.destination.channelCount);
+ merger.connect(context.destination);
+
+ // Create an audio signal that will be repeated
+ var repeating_signal = context.createBuffer(1, 1, buffer_rate);
+ repeating_signal.getChannelData(0)[0] = 0.5;
+
+ // Schedule a series of nodes to repeat the signal.
+ for (var i = 0; i < LENGTH; ++i) {
+ var source = context.createBufferSource();
+ source.buffer = repeating_signal;
+ source.connect(merger, 0, 0);
+ source.start((i + start_offset) / buffer_rate);
+ }
+
+ // A single long signal should produce the same result.
+ var long_signal = context.createBuffer(1, LENGTH, buffer_rate);
+ var c = long_signal.getChannelData(0);
+ for (var i = 0; i < c.length; ++i) {
+ c[i] = 0.5;
+ }
+
+ var source = context.createBufferSource();
+ source.buffer = long_signal;
+ source.connect(merger, 0, 1);
+ source.start(start_offset / buffer_rate);
+
+ return context.startRendering().
+ then((buffer) => {
+ series_output = buffer.getChannelData(0);
+ expected = buffer.getChannelData(1);
+
+ for (var i = 0; i < buffer.length; ++i) {
+ assert_approx_equals(series_output[i], expected[i], EPSILON,
+ "series output at " + i);
+ }
+ });
+}
+
+function start_tests(context_rate, buffer_rate) {
+ OFFSETS.forEach((start_offset) => {
+ promise_test(() => do_test(context_rate, buffer_rate, start_offset),
+ "" + context_rate + " context, "
+ + buffer_rate + " buffer, "
+ + start_offset + " start");
+ });
+}
+
+start_tests(48000, 44100);
+start_tests(44100, 48000);
+
+</script>
diff --git a/dom/media/webaudio/test/test_singleSourceDest.html b/dom/media/webaudio/test/test_singleSourceDest.html
new file mode 100644
index 000000000..8613a2dd9
--- /dev/null
+++ b/dom/media/webaudio/test/test_singleSourceDest.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test whether we can create an AudioContext interface</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+SimpleTest.waitForExplicitFinish();
+addLoadEvent(function() {
+ var context = new AudioContext();
+ var buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ var destination = context.destination;
+ is(destination.context, context, "Destination node has proper context");
+ is(destination.context, context, "Destination node has proper context");
+ is(destination.numberOfInputs, 1, "Destination node has 1 inputs");
+ is(destination.numberOfOutputs, 0, "Destination node has 0 outputs");
+ is(destination.channelCount, 2, "Destination node has 2 input channels by default");
+ is(destination.channelCountMode, "explicit", "Correct channelCountMode for the destination node");
+ is(destination.channelInterpretation, "speakers", "Correct channelCountInterpretation for the destination node");
+ ok(destination instanceof EventTarget, "AudioNodes must be EventTargets");
+
+ var source = context.createBufferSource();
+ is(source.context, context, "Source node has proper context");
+ is(source.numberOfInputs, 0, "Source node has 0 inputs");
+ is(source.numberOfOutputs, 1, "Source node has 1 outputs");
+ is(source.loop, false, "Source node is not looping");
+ is(source.loopStart, 0, "Correct default value for loopStart");
+ is(source.loopEnd, 0, "Correct default value for loopEnd");
+ ok(!source.buffer, "Source node should not have a buffer when it's created");
+ is(source.channelCount, 2, "source node has 2 input channels by default");
+ is(source.channelCountMode, "max", "Correct channelCountMode for the source node");
+ is(source.channelInterpretation, "speakers", "Correct channelCountInterpretation for the source node");
+
+ expectException(function() {
+ source.channelCount = 0;
+ }, DOMException.NOT_SUPPORTED_ERR);
+
+ source.buffer = buffer;
+ ok(source.buffer, "Source node should have a buffer now");
+
+ source.connect(destination);
+
+ is(source.numberOfInputs, 0, "Source node has 0 inputs");
+ is(source.numberOfOutputs, 1, "Source node has 0 outputs");
+ is(destination.numberOfInputs, 1, "Destination node has 0 inputs");
+ is(destination.numberOfOutputs, 0, "Destination node has 0 outputs");
+
+ source.start(0);
+ SimpleTest.executeSoon(function() {
+ source.stop(0);
+ source.disconnect();
+
+ SpecialPowers.clearUserPref("media.webaudio.enabled");
+ SimpleTest.finish();
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_stereoPannerNode.html b/dom/media/webaudio/test/test_stereoPannerNode.html
new file mode 100644
index 000000000..ffc735364
--- /dev/null
+++ b/dom/media/webaudio/test/test_stereoPannerNode.html
@@ -0,0 +1,263 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test StereoPannerNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var SR = 44100;
+var BUF_SIZE = 128;
+var PANNING = 0.1;
+var GAIN = 0.5;
+
+// Cheap reimplementation of some bits of the spec
+function gainForPanningMonoToStereo(panning) {
+ panning += 1;
+ panning /= 2;
+ return [ Math.cos(0.5 * Math.PI * panning),
+ Math.sin(0.5 * Math.PI * panning) ];
+}
+
+function gainForPanningStereoToStereo(panning) {
+ if (panning <= 0) {
+ panning += 1.;
+ }
+ return [ Math.cos(0.5 * Math.PI * panning),
+ Math.sin(0.5 * Math.PI * panning) ];
+}
+
+function applyStereoToStereoPanning(l, r, panningValues, panning) {
+ var outL, outR;
+ if (panning <= 0) {
+ outL = l + r * panningValues[0];
+ outR = r * panningValues[1];
+ } else {
+ outL = l * panningValues[0];
+ outR = r + l * panningValues[1];
+ }
+ return [outL,outR];
+}
+
+function applyMonoToStereoPanning(c, panning) {
+ return [c * panning[0], c * panning[1]];
+}
+
+// Test the DOM interface
+var context = new OfflineAudioContext(1, 1, SR);
+var stereoPanner = context.createStereoPanner();
+ok(stereoPanner.pan, "The AudioParam member must exist");
+is(stereoPanner.pan.value, 0.0, "Correct initial value");
+is(stereoPanner.pan.defaultValue, 0.0, "Correct default value");
+is(stereoPanner.channelCount, 2, "StereoPannerNode node has 2 input channels by default");
+is(stereoPanner.channelCountMode, "clamped-max", "Correct channelCountMode for the StereoPannerNode");
+is(stereoPanner.channelInterpretation, "speakers", "Correct channelCountInterpretation for the StereoPannerNode");
+expectException(function() {
+ stereoPanner.channelCount = 3;
+}, DOMException.NOT_SUPPORTED_ERR);
+expectException(function() {
+ stereoPanner.channelCountMode = "max";
+}, DOMException.NOT_SUPPORTED_ERR);
+
+// A sine to be used to fill the buffers
+function sine(t) {
+ return Math.sin(440 * 2 * Math.PI * t / context.sampleRate);
+}
+
+// A couple mono and stereo buffers: the StereoPannerNode equation is different
+// if the input is mono or stereo
+var stereoBuffer = context.createBuffer(2, BUF_SIZE, context.sampleRate);
+var monoBuffer = context.createBuffer(1, BUF_SIZE, context.sampleRate);
+for (var i = 0; i < BUF_SIZE; ++i) {
+ monoBuffer.getChannelData(0)[i] =
+ stereoBuffer.getChannelData(0)[i] =
+ stereoBuffer.getChannelData(1)[i] = sine(i);
+}
+
+// Expected test vectors
+function expectedBufferNoop(gain) {
+ gain = gain || 1.0;
+ var expectedBuffer = context.createBuffer(2, BUF_SIZE, SR);
+ for (var i = 0; i < BUF_SIZE; i++) {
+ expectedBuffer.getChannelData(0)[i] = gain * sine(i);
+ expectedBuffer.getChannelData(1)[i] = gain * sine(i);
+ }
+ return expectedBuffer;
+}
+
+function expectedBufferForStereo(gain) {
+ gain = gain || 1.0;
+ var expectedBuffer = context.createBuffer(2, BUF_SIZE, SR);
+ var gainPanning = gainForPanningStereoToStereo(PANNING);
+ gainPanning[0] *= gain;
+ gainPanning[1] *= gain;
+ for (var i = 0; i < BUF_SIZE; i++) {
+ var values = [ sine(i), sine(i) ];
+ var processed = applyStereoToStereoPanning(values[0], values[1], gainPanning, PANNING);
+ expectedBuffer.getChannelData(0)[i] = processed[0];
+ expectedBuffer.getChannelData(1)[i] = processed[1];
+ }
+ return expectedBuffer;
+}
+
+function expectedBufferForMono(gain) {
+ gain = gain || 1.0;
+ var expectedBuffer = context.createBuffer(2, BUF_SIZE, SR);
+ var gainPanning = gainForPanningMonoToStereo(PANNING);
+ gainPanning[0] *= gain;
+ gainPanning[1] *= gain;
+ for (var i = 0; i < BUF_SIZE; i++) {
+ var value = sine(i);
+ var processed = applyMonoToStereoPanning(value, gainPanning);
+ expectedBuffer.getChannelData(0)[i] = processed[0];
+ expectedBuffer.getChannelData(1)[i] = processed[1];
+ }
+ return expectedBuffer;
+}
+
+// Actual test cases
+var tests = [
+ function monoPanningNoop(ctx, panner) {
+ var monoSource = ctx.createBufferSource();
+ monoSource.connect(panner);
+ monoSource.buffer = monoBuffer;
+ monoSource.start(0);
+ return expectedBufferNoop();
+ },
+ function stereoPanningNoop(ctx, panner) {
+ var stereoSource = ctx.createBufferSource();
+ stereoSource.connect(panner);
+ stereoSource.buffer = stereoBuffer;
+ stereoSource.start(0);
+ return expectedBufferNoop();
+ },
+ function monoPanningNoopWithGain(ctx, panner) {
+ var monoSource = ctx.createBufferSource();
+ var gain = ctx.createGain();
+ gain.gain.value = GAIN;
+ monoSource.connect(gain);
+ gain.connect(panner);
+ monoSource.buffer = monoBuffer;
+ monoSource.start(0);
+ return expectedBufferNoop(GAIN);
+ },
+ function stereoPanningNoopWithGain(ctx, panner) {
+ var stereoSource = ctx.createBufferSource();
+ var gain = ctx.createGain();
+ gain.gain.value = GAIN;
+ stereoSource.connect(gain);
+ gain.connect(panner);
+ stereoSource.buffer = stereoBuffer;
+ stereoSource.start(0);
+ return expectedBufferNoop(GAIN);
+ },
+ function stereoPanningAutomation(ctx, panner) {
+ var stereoSource = ctx.createBufferSource();
+ stereoSource.connect(panner);
+ stereoSource.buffer = stereoBuffer;
+ panner.pan.setValueAtTime(0.1, 0.0);
+ stereoSource.start(0);
+ return expectedBufferForStereo();
+ },
+ function stereoPanning(ctx, panner) {
+ var stereoSource = ctx.createBufferSource();
+ stereoSource.buffer = stereoBuffer;
+ stereoSource.connect(panner);
+ panner.pan.value = 0.1;
+ stereoSource.start(0);
+ return expectedBufferForStereo();
+ },
+ function monoPanningAutomation(ctx, panner) {
+ var monoSource = ctx.createBufferSource();
+ monoSource.connect(panner);
+ monoSource.buffer = monoBuffer;
+ panner.pan.setValueAtTime(PANNING, 0.0);
+ monoSource.start(0);
+ return expectedBufferForMono();
+ },
+ function monoPanning(ctx, panner) {
+ var monoSource = ctx.createBufferSource();
+ monoSource.connect(panner);
+ monoSource.buffer = monoBuffer;
+ panner.pan.value = 0.1;
+ monoSource.start(0);
+ return expectedBufferForMono();
+ },
+ function monoPanningWithGain(ctx, panner) {
+ var monoSource = ctx.createBufferSource();
+ var gain = ctx.createGain();
+ gain.gain.value = GAIN;
+ monoSource.connect(gain);
+ gain.connect(panner);
+ monoSource.buffer = monoBuffer;
+ panner.pan.value = 0.1;
+ monoSource.start(0);
+ return expectedBufferForMono(GAIN);
+ },
+ function stereoPanningWithGain(ctx, panner) {
+ var stereoSource = ctx.createBufferSource();
+ var gain = ctx.createGain();
+ gain.gain.value = GAIN;
+ stereoSource.connect(gain);
+ gain.connect(panner);
+ stereoSource.buffer = stereoBuffer;
+ panner.pan.value = 0.1;
+ stereoSource.start(0);
+ return expectedBufferForStereo(GAIN);
+ },
+ function monoPanningWithGainAndAutomation(ctx, panner) {
+ var monoSource = ctx.createBufferSource();
+ var gain = ctx.createGain();
+ gain.gain.value = GAIN;
+ monoSource.connect(gain);
+ gain.connect(panner);
+ monoSource.buffer = monoBuffer;
+ panner.pan.setValueAtTime(PANNING, 0);
+ monoSource.start(0);
+ return expectedBufferForMono(GAIN);
+ },
+ function stereoPanningWithGainAndAutomation(ctx, panner) {
+ var stereoSource = ctx.createBufferSource();
+ var gain = ctx.createGain();
+ gain.gain.value = GAIN;
+ stereoSource.connect(gain);
+ gain.connect(panner);
+ stereoSource.buffer = stereoBuffer;
+ panner.pan.setValueAtTime(PANNING, 0);
+ stereoSource.start(0);
+ return expectedBufferForStereo(GAIN);
+ }
+];
+
+var finished = 0;
+function finish() {
+ if (++finished == tests.length) {
+ SimpleTest.finish();
+ }
+}
+
+tests.forEach(function(f) {
+ var ac = new OfflineAudioContext(2, BUF_SIZE, SR);
+ var panner = ac.createStereoPanner();
+ panner.connect(ac.destination);
+ var expected = f(ac, panner);
+ ac.oncomplete = function(e) {
+ info(f.name);
+ compareBuffers(e.renderedBuffer, expected);
+ finish();
+ };
+ ac.startRendering()
+});
+
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+<pre id=dump>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_stereoPannerNodePassThrough.html b/dom/media/webaudio/test/test_stereoPannerNodePassThrough.html
new file mode 100644
index 000000000..250a1a9de
--- /dev/null
+++ b/dom/media/webaudio/test/test_stereoPannerNodePassThrough.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test StereoPanerNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+
+ var stereoPanner = context.createStereoPanner();
+
+ source.buffer = this.buffer;
+
+ source.connect(stereoPanner);
+
+ var stereoPannerWrapped = SpecialPowers.wrap(stereoPanner);
+ ok("passThrough" in stereoPannerWrapped, "StereoPannerNode should support the passThrough API");
+ stereoPannerWrapped.passThrough = true;
+
+ source.start(0);
+ return stereoPanner;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ this.buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_stereoPanningWithGain.html b/dom/media/webaudio/test/test_stereoPanningWithGain.html
new file mode 100644
index 000000000..1ef0c037d
--- /dev/null
+++ b/dom/media/webaudio/test/test_stereoPanningWithGain.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test stereo equalpower panning with a GainNode</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script src="webaudio.js" type="text/javascript"></script>
+<script class="testbody" type="text/javascript">
+
+const size = 256;
+
+var gTest = {
+ numberOfChannels: 2,
+ createGraph: function(context) {
+ var panner = context.createPanner();
+ panner.setPosition(1.0, 0.0, 0.0); // reference distance the right
+ panner.panningModel = "equalpower";
+
+ var gain = context.createGain();
+ gain.gain.value = -0.5;
+ gain.connect(panner);
+
+ var buffer = context.createBuffer(2, 2, context.sampleRate);
+ buffer.getChannelData(0)[0] = 1.0;
+ buffer.getChannelData(1)[1] = 1.0;
+ var source = context.createBufferSource();
+ source.buffer = buffer;
+ source.connect(gain);
+ source.start(0);
+
+ return panner;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(2, size, context.sampleRate);
+ expectedBuffer.getChannelData(1)[0] = -0.5;
+ expectedBuffer.getChannelData(1)[1] = -0.5;
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_waveDecoder.html b/dom/media/webaudio/test/test_waveDecoder.html
new file mode 100644
index 000000000..bd5faf6ad
--- /dev/null
+++ b/dom/media/webaudio/test/test_waveDecoder.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<meta charset=utf-8>
+<head>
+ <title>Test that we decode uint8 and sint16 wave files with correct conversion to float64</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var testsDone = 0;
+var tests = ["UklGRjUrAABXQVZFZm10IBAAAAABAAEAESsAABErAAABAAgAZGF0YQMAAAD/AIA=",
+ "UklGRkZWAABXQVZFZm10IBAAAAABAAEAESsAACJWAAACABAAZGF0YQYAAAD/fwCAAAA="];
+
+SimpleTest.waitForExplicitFinish();
+
+function base64ToUint8Buffer(b64) {
+ var str = atob(b64)
+ var u8 = new Uint8Array(str.length);
+ for (var i = 0; i < str.length; ++i) {
+ u8[i] = str.charCodeAt(i);
+ }
+ return u8;
+}
+
+function fixupBufferSampleRate(u8, rate) {
+ u8[24] = (rate & 0x000000ff) >> 0;
+ u8[25] = (rate & 0x0000ff00) >> 8;
+ u8[26] = (rate & 0x00ff0000) >> 16;
+ u8[27] = (rate & 0xff000000) >> 24;
+}
+
+function finishTest() {
+ testsDone += 1;
+ if (testsDone == tests.length) {
+ SimpleTest.finish();
+ }
+}
+
+function decodeComplete(b) {
+ ok(true, "Decoding succeeded.");
+ is(b.numberOfChannels, 1, "Should have 1 channel.");
+ is(b.length, 3, "Should have three samples.");
+ var samples = b.getChannelData(0);
+ ok(samples[0] > 0.99 && samples[0] < 1.01, "Check near 1.0. Got " + samples[0]);
+ ok(samples[1] > -1.01 && samples[1] < -0.99, "Check near -1.0. Got " + samples[1]);
+ ok(samples[2] > -0.01 && samples[2] < 0.01, "Check near 0.0. Got " + samples[2]);
+ finishTest();
+}
+
+function decodeFailed() {
+ ok(false, "Decoding failed.");
+ finishTest();
+}
+
+addLoadEvent(function() {
+ var context = new AudioContext();
+
+ for (var i = 0; i < tests.length; ++i) {
+ var u8 = base64ToUint8Buffer(tests[i]);
+ fixupBufferSampleRate(u8, context.sampleRate);
+ context.decodeAudioData(u8.buffer, decodeComplete, decodeFailed);
+ }
+});
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_waveShaper.html b/dom/media/webaudio/test/test_waveShaper.html
new file mode 100644
index 000000000..c95cf5e05
--- /dev/null
+++ b/dom/media/webaudio/test/test_waveShaper.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test WaveShaperNode with no curve</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+ source.buffer = this.buffer;
+
+ var shaper = context.createWaveShaper();
+ shaper.curve = this.curve;
+
+ source.connect(shaper);
+
+ source.start(0);
+ return shaper;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 4096, context.sampleRate);
+ for (var i = 1; i < 4095; ++i) {
+ this.buffer.getChannelData(0)[i] = 2 * (i / 4096) - 1;
+ }
+ // Two out of range values
+ this.buffer.getChannelData(0)[0] = -2;
+ this.buffer.getChannelData(0)[4095] = 2;
+
+ this.curve = new Float32Array(2048);
+ for (var i = 0; i < 2048; ++i) {
+ this.curve[i] = Math.sin(100 * Math.PI * (i + 1) / context.sampleRate);
+ }
+
+ var expectedBuffer = context.createBuffer(1, 4096, context.sampleRate);
+ for (var i = 1; i < 4095; ++i) {
+ var input = this.buffer.getChannelData(0)[i];
+ var index = Math.floor(this.curve.length * (input + 1) / 2);
+ index = Math.max(0, Math.min(this.curve.length - 1, index));
+ expectedBuffer.getChannelData(0)[i] = this.curve[index];
+ }
+ expectedBuffer.getChannelData(0)[0] = this.curve[0];
+ expectedBuffer.getChannelData(0)[4095] = this.curve[2047];
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_waveShaperGain.html b/dom/media/webaudio/test/test_waveShaperGain.html
new file mode 100644
index 000000000..b0c82d2d8
--- /dev/null
+++ b/dom/media/webaudio/test/test_waveShaperGain.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+ <title>Test that WaveShaperNode doesn't corrupt its inputs when the gain is !=
+ 1.0 (bug 1203616)</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<script class="testbody" type="text/javascript">
+SimpleTest.waitForExplicitFinish();
+var samplerate = 44100;
+var context = new OfflineAudioContext(1, 44100, samplerate);
+
+var dc = context.createBufferSource();
+
+var buffer = context.createBuffer(1, 1, samplerate);
+buffer.getChannelData(0)[0] = 1.0;
+dc.buffer = buffer;
+
+var gain = context.createGain();
+var ws2 = context.createWaveShaper();
+var ws = [];
+
+// No-op waveshaper curves.
+for (var i = 0; i < 2; i++) {
+ ws[i] = context.createWaveShaper();
+ var curve = new Float32Array(2);
+ curve[0] = -1.0;
+ curve[1] = 1.0;
+ ws[i].curve = curve;
+ ws[i].connect(context.destination);
+ gain.connect(ws[i]);
+}
+
+dc.connect(gain);
+dc.start();
+
+gain.gain.value = 0.5;
+
+context.startRendering().then(buffer => {
+ document.querySelector("pre").innerHTML = buffer.getChannelData(0)[0];
+ ok(buffer.getChannelData(0)[0] == 1.0, "Volume was handled properly");
+
+ context = new OfflineAudioContext(1, 100, samplerate);
+ var oscillator = context.createOscillator();
+ var gain = context.createGain();
+ var waveShaper = context.createWaveShaper();
+
+ oscillator.start(0);
+ oscillator.connect(gain);
+
+ // to silence
+ gain.gain.value = 0;
+ gain.connect(waveShaper);
+
+ // convert all signal into 1.0. The non unity values are to detect the use
+ // of uninitialized buffers (see Bug 1283910).
+ waveShaper.curve = new Float32Array([ 0.5, 0.5, 0.5, 0.5, 0.5, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5 ]);
+ waveShaper.connect(context.destination);
+
+ context.startRendering().then((buffer) => {
+ var result = buffer.getChannelData(0);
+ ok(result.every(x => x === 1), "WaveShaper handles zero gain properly");
+ SimpleTest.finish();
+ });
+});
+</script>
+<pre>
+</pre>
+</body>
+
diff --git a/dom/media/webaudio/test/test_waveShaperInvalidLengthCurve.html b/dom/media/webaudio/test/test_waveShaperInvalidLengthCurve.html
new file mode 100644
index 000000000..f117f0376
--- /dev/null
+++ b/dom/media/webaudio/test/test_waveShaperInvalidLengthCurve.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test WaveShaperNode with an invalid curve</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+ source.buffer = this.buffer;
+
+ var shaper = context.createWaveShaper();
+
+ expectException(() => {
+ shaper.curve = new Float32Array(0);
+ }, DOMException.INVALID_STATE_ERR);
+
+ is(shaper.curve, null, "The curve mustn't have been set");
+
+ expectException(() => {
+ shaper.curve = new Float32Array(1);
+ }, DOMException.INVALID_STATE_ERR);
+
+ is(shaper.curve, null, "The curve mustn't have been set");
+
+ expectNoException(() => {
+ shaper.curve = new Float32Array(2);
+ });
+
+ isnot(shaper.curve, null, "The curve must have been set");
+
+ expectNoException(() => {
+ shaper.curve = null;
+ });
+
+ is(shaper.curve, null, "The curve must be null by default");
+
+ source.connect(shaper);
+
+ source.start(0);
+ return shaper;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ this.buffer = expectedBuffer;
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_waveShaperNoCurve.html b/dom/media/webaudio/test/test_waveShaperNoCurve.html
new file mode 100644
index 000000000..c0d3187b2
--- /dev/null
+++ b/dom/media/webaudio/test/test_waveShaperNoCurve.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test WaveShaperNode with no curve</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 2048,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+ source.buffer = this.buffer;
+
+ var shaper = context.createWaveShaper();
+ is(shaper.curve, null, "The shaper curve must be null by default");
+
+ source.connect(shaper);
+
+ source.start(0);
+ return shaper;
+ },
+ createExpectedBuffers: function(context) {
+ var expectedBuffer = context.createBuffer(1, 2048, context.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ expectedBuffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
+ }
+ this.buffer = expectedBuffer;
+ return expectedBuffer;
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/test_waveShaperPassThrough.html b/dom/media/webaudio/test/test_waveShaperPassThrough.html
new file mode 100644
index 000000000..52c70d3c2
--- /dev/null
+++ b/dom/media/webaudio/test/test_waveShaperPassThrough.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test WaveShaperNode with passthrough</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="webaudio.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var gTest = {
+ length: 4096,
+ numberOfChannels: 1,
+ createGraph: function(context) {
+ var source = context.createBufferSource();
+ source.buffer = this.buffer;
+
+ var shaper = context.createWaveShaper();
+ shaper.curve = this.curve;
+
+ var shaperWrapped = SpecialPowers.wrap(shaper);
+ ok("passThrough" in shaperWrapped, "WaveShaperNode should support the passThrough API");
+ shaperWrapped.passThrough = true;
+
+ source.connect(shaper);
+
+ source.start(0);
+ return shaper;
+ },
+ createExpectedBuffers: function(context) {
+ this.buffer = context.createBuffer(1, 4096, context.sampleRate);
+ for (var i = 1; i < 4095; ++i) {
+ this.buffer.getChannelData(0)[i] = 2 * (i / 4096) - 1;
+ }
+ // Two out of range values
+ this.buffer.getChannelData(0)[0] = -2;
+ this.buffer.getChannelData(0)[4095] = 2;
+
+ this.curve = new Float32Array(2048);
+ for (var i = 0; i < 2048; ++i) {
+ this.curve[i] = Math.sin(100 * Math.PI * (i + 1) / context.sampleRate);
+ }
+
+ return [this.buffer];
+ },
+};
+
+runTest();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webaudio/test/ting-44.1k-1ch.ogg b/dom/media/webaudio/test/ting-44.1k-1ch.ogg
new file mode 100644
index 000000000..a11aaf1cb
--- /dev/null
+++ b/dom/media/webaudio/test/ting-44.1k-1ch.ogg
Binary files differ
diff --git a/dom/media/webaudio/test/ting-44.1k-1ch.wav b/dom/media/webaudio/test/ting-44.1k-1ch.wav
new file mode 100644
index 000000000..6854c9d89
--- /dev/null
+++ b/dom/media/webaudio/test/ting-44.1k-1ch.wav
Binary files differ
diff --git a/dom/media/webaudio/test/ting-44.1k-2ch.ogg b/dom/media/webaudio/test/ting-44.1k-2ch.ogg
new file mode 100644
index 000000000..94e001485
--- /dev/null
+++ b/dom/media/webaudio/test/ting-44.1k-2ch.ogg
Binary files differ
diff --git a/dom/media/webaudio/test/ting-44.1k-2ch.wav b/dom/media/webaudio/test/ting-44.1k-2ch.wav
new file mode 100644
index 000000000..703d88589
--- /dev/null
+++ b/dom/media/webaudio/test/ting-44.1k-2ch.wav
Binary files differ
diff --git a/dom/media/webaudio/test/ting-48k-1ch.ogg b/dom/media/webaudio/test/ting-48k-1ch.ogg
new file mode 100644
index 000000000..f45ce33a5
--- /dev/null
+++ b/dom/media/webaudio/test/ting-48k-1ch.ogg
Binary files differ
diff --git a/dom/media/webaudio/test/ting-48k-1ch.wav b/dom/media/webaudio/test/ting-48k-1ch.wav
new file mode 100644
index 000000000..8fe471666
--- /dev/null
+++ b/dom/media/webaudio/test/ting-48k-1ch.wav
Binary files differ
diff --git a/dom/media/webaudio/test/ting-48k-2ch.ogg b/dom/media/webaudio/test/ting-48k-2ch.ogg
new file mode 100644
index 000000000..e4c564abb
--- /dev/null
+++ b/dom/media/webaudio/test/ting-48k-2ch.ogg
Binary files differ
diff --git a/dom/media/webaudio/test/ting-48k-2ch.wav b/dom/media/webaudio/test/ting-48k-2ch.wav
new file mode 100644
index 000000000..ad4d0466d
--- /dev/null
+++ b/dom/media/webaudio/test/ting-48k-2ch.wav
Binary files differ
diff --git a/dom/media/webaudio/test/ting-dualchannel44.1.wav b/dom/media/webaudio/test/ting-dualchannel44.1.wav
new file mode 100644
index 000000000..62954394d
--- /dev/null
+++ b/dom/media/webaudio/test/ting-dualchannel44.1.wav
Binary files differ
diff --git a/dom/media/webaudio/test/ting-dualchannel48.wav b/dom/media/webaudio/test/ting-dualchannel48.wav
new file mode 100644
index 000000000..a0b824788
--- /dev/null
+++ b/dom/media/webaudio/test/ting-dualchannel48.wav
Binary files differ
diff --git a/dom/media/webaudio/test/webaudio.js b/dom/media/webaudio/test/webaudio.js
new file mode 100644
index 000000000..1a1a8efb7
--- /dev/null
+++ b/dom/media/webaudio/test/webaudio.js
@@ -0,0 +1,269 @@
+// Helpers for Web Audio tests
+
+function expectException(func, exceptionCode) {
+ var threw = false;
+ try {
+ func();
+ } catch (ex) {
+ threw = true;
+ ok(ex instanceof DOMException, "Expect a DOM exception");
+ is(ex.code, exceptionCode, "Expect the correct exception code");
+ }
+ ok(threw, "The exception was thrown");
+}
+
+function expectNoException(func) {
+ var threw = false;
+ try {
+ func();
+ } catch (ex) {
+ threw = true;
+ }
+ ok(!threw, "An exception was not thrown");
+}
+
+function expectTypeError(func) {
+ var threw = false;
+ try {
+ func();
+ } catch (ex) {
+ threw = true;
+ ok(ex instanceof TypeError, "Expect a TypeError");
+ }
+ ok(threw, "The exception was thrown");
+}
+
+function expectRejectedPromise(that, func, exceptionName) {
+ var promise = that[func]();
+
+ ok(promise instanceof Promise, "Expect a Promise");
+
+ promise.then(function(res) {
+ ok(false, "Promise resolved when it should have been rejected.");
+ }).catch(function(err) {
+ is(err.name, exceptionName, "Promise correctly reject with " + exceptionName);
+ });
+}
+
+function fuzzyCompare(a, b) {
+ return Math.abs(a - b) < 9e-3;
+}
+
+function compareChannels(buf1, buf2,
+ /*optional*/ length,
+ /*optional*/ sourceOffset,
+ /*optional*/ destOffset,
+ /*optional*/ skipLengthCheck) {
+ if (!skipLengthCheck) {
+ is(buf1.length, buf2.length, "Channels must have the same length");
+ }
+ sourceOffset = sourceOffset || 0;
+ destOffset = destOffset || 0;
+ if (length == undefined) {
+ length = buf1.length - sourceOffset;
+ }
+ var difference = 0;
+ var maxDifference = 0;
+ var firstBadIndex = -1;
+ for (var i = 0; i < length; ++i) {
+ if (!fuzzyCompare(buf1[i + sourceOffset], buf2[i + destOffset])) {
+ difference++;
+ maxDifference = Math.max(maxDifference, Math.abs(buf1[i + sourceOffset] - buf2[i + destOffset]));
+ if (firstBadIndex == -1) {
+ firstBadIndex = i;
+ }
+ }
+ };
+
+ is(difference, 0, "maxDifference: " + maxDifference +
+ ", first bad index: " + firstBadIndex +
+ " with test-data offset " + sourceOffset + " and expected-data offset " +
+ destOffset + "; corresponding values " + buf1[firstBadIndex + sourceOffset] +
+ " and " + buf2[firstBadIndex + destOffset] + " --- differences");
+}
+
+function compareBuffers(got, expected) {
+ if (got.numberOfChannels != expected.numberOfChannels) {
+ is(got.numberOfChannels, expected.numberOfChannels,
+ "Correct number of buffer channels");
+ return;
+ }
+ if (got.length != expected.length) {
+ is(got.length, expected.length,
+ "Correct buffer length");
+ return;
+ }
+ if (got.sampleRate != expected.sampleRate) {
+ is(got.sampleRate, expected.sampleRate,
+ "Correct sample rate");
+ return;
+ }
+
+ for (var i = 0; i < got.numberOfChannels; ++i) {
+ compareChannels(got.getChannelData(i), expected.getChannelData(i),
+ got.length, 0, 0, true);
+ }
+}
+
+/**
+ * Compute the root mean square (RMS,
+ * <http://en.wikipedia.org/wiki/Root_mean_square>) of a channel of a slice
+ * (defined by `start` and `end`) of an AudioBuffer.
+ *
+ * This is useful to detect that a buffer is noisy or silent.
+ */
+function rms(audiobuffer, channel = 0, start = 0, end = audiobuffer.length) {
+ var buffer= audiobuffer.getChannelData(channel);
+ var rms = 0;
+ for (var i = start; i < end; i++) {
+ rms += buffer[i] * buffer[i];
+ }
+
+ rms /= buffer.length;
+ rms = Math.sqrt(rms);
+ return rms;
+}
+
+function getEmptyBuffer(context, length) {
+ return context.createBuffer(gTest.numberOfChannels, length, context.sampleRate);
+}
+
+/**
+ * This function assumes that the test file defines a single gTest variable with
+ * the following properties and methods:
+ *
+ * + numberOfChannels: optional property which specifies the number of channels
+ * in the output. The default value is 2.
+ * + createGraph: mandatory method which takes a context object and does
+ * everything needed in order to set up the Web Audio graph.
+ * This function returns the node to be inspected.
+ * + createGraphAsync: async version of createGraph. This function takes
+ * a callback which should be called with an argument
+ * set to the node to be inspected when the callee is
+ * ready to proceed with the test. Either this function
+ * or createGraph must be provided.
+ * + createExpectedBuffers: optional method which takes a context object and
+ * returns either one expected buffer or an array of
+ * them, designating what is expected to be observed
+ * in the output. If omitted, the output is expected
+ * to be silence. All buffers must have the same
+ * length, which must be a bufferSize supported by
+ * ScriptProcessorNode. This function is guaranteed
+ * to be called before createGraph.
+ * + length: property equal to the total number of frames which we are waiting
+ * to see in the output, mandatory if createExpectedBuffers is not
+ * provided, in which case it must be a bufferSize supported by
+ * ScriptProcessorNode (256, 512, 1024, 2048, 4096, 8192, or 16384).
+ * If createExpectedBuffers is provided then this must be equal to
+ * the number of expected buffers * the expected buffer length.
+ *
+ * + skipOfflineContextTests: optional. when true, skips running tests on an offline
+ * context by circumventing testOnOfflineContext.
+ */
+function runTest()
+{
+ function done() {
+ SimpleTest.finish();
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ function runTestFunction () {
+ if (!gTest.numberOfChannels) {
+ gTest.numberOfChannels = 2; // default
+ }
+
+ var testLength;
+
+ function runTestOnContext(context, callback, testOutput) {
+ if (!gTest.createExpectedBuffers) {
+ // Assume that the output is silence
+ var expectedBuffers = getEmptyBuffer(context, gTest.length);
+ } else {
+ var expectedBuffers = gTest.createExpectedBuffers(context);
+ }
+ if (!(expectedBuffers instanceof Array)) {
+ expectedBuffers = [expectedBuffers];
+ }
+ var expectedFrames = 0;
+ for (var i = 0; i < expectedBuffers.length; ++i) {
+ is(expectedBuffers[i].numberOfChannels, gTest.numberOfChannels,
+ "Correct number of channels for expected buffer " + i);
+ expectedFrames += expectedBuffers[i].length;
+ }
+ if (gTest.length && gTest.createExpectedBuffers) {
+ is(expectedFrames, gTest.length, "Correct number of expected frames");
+ }
+
+ if (gTest.createGraphAsync) {
+ gTest.createGraphAsync(context, function(nodeToInspect) {
+ testOutput(nodeToInspect, expectedBuffers, callback);
+ });
+ } else {
+ testOutput(gTest.createGraph(context), expectedBuffers, callback);
+ }
+ }
+
+ function testOnNormalContext(callback) {
+ function testOutput(nodeToInspect, expectedBuffers, callback) {
+ testLength = 0;
+ var sp = context.createScriptProcessor(expectedBuffers[0].length, gTest.numberOfChannels, 0);
+ nodeToInspect.connect(sp);
+ sp.onaudioprocess = function(e) {
+ var expectedBuffer = expectedBuffers.shift();
+ testLength += expectedBuffer.length;
+ compareBuffers(e.inputBuffer, expectedBuffer);
+ if (expectedBuffers.length == 0) {
+ sp.onaudioprocess = null;
+ callback();
+ }
+ };
+ }
+ var context = new AudioContext();
+ runTestOnContext(context, callback, testOutput);
+ }
+
+ function testOnOfflineContext(callback, sampleRate) {
+ function testOutput(nodeToInspect, expectedBuffers, callback) {
+ nodeToInspect.connect(context.destination);
+ context.oncomplete = function(e) {
+ var samplesSeen = 0;
+ while (expectedBuffers.length) {
+ var expectedBuffer = expectedBuffers.shift();
+ is(e.renderedBuffer.numberOfChannels, expectedBuffer.numberOfChannels,
+ "Correct number of input buffer channels");
+ for (var i = 0; i < e.renderedBuffer.numberOfChannels; ++i) {
+ compareChannels(e.renderedBuffer.getChannelData(i),
+ expectedBuffer.getChannelData(i),
+ expectedBuffer.length,
+ samplesSeen,
+ undefined,
+ true);
+ }
+ samplesSeen += expectedBuffer.length;
+ }
+ callback();
+ };
+ context.startRendering();
+ }
+
+ var context = new OfflineAudioContext(gTest.numberOfChannels, testLength, sampleRate);
+ runTestOnContext(context, callback, testOutput);
+ }
+
+ testOnNormalContext(function() {
+ if (!gTest.skipOfflineContextTests) {
+ testOnOfflineContext(function() {
+ testOnOfflineContext(done, 44100);
+ }, 48000);
+ } else {
+ done();
+ }
+ });
+ };
+
+ if (document.readyState !== 'complete') {
+ addLoadEvent(runTestFunction);
+ } else {
+ runTestFunction();
+ }
+}
diff --git a/dom/media/webm/EbmlComposer.cpp b/dom/media/webm/EbmlComposer.cpp
new file mode 100644
index 000000000..1b8008a1b
--- /dev/null
+++ b/dom/media/webm/EbmlComposer.cpp
@@ -0,0 +1,236 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "EbmlComposer.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/EndianUtils.h"
+#include "libmkv/EbmlIDs.h"
+#include "libmkv/EbmlWriter.h"
+#include "libmkv/WebMElement.h"
+#include "prtime.h"
+#include "limits.h"
+
+namespace mozilla {
+
+// Timecode scale in nanoseconds
+static const unsigned long TIME_CODE_SCALE = 1000000;
+// The WebM header size without audio CodecPrivateData
+static const int32_t DEFAULT_HEADER_SIZE = 1024;
+
+void EbmlComposer::GenerateHeader()
+{
+ // Write the EBML header.
+ EbmlGlobal ebml;
+ // The WEbM header default size usually smaller than 1k.
+ auto buffer = MakeUnique<uint8_t[]>(DEFAULT_HEADER_SIZE +
+ mCodecPrivateData.Length());
+ ebml.buf = buffer.get();
+ ebml.offset = 0;
+ writeHeader(&ebml);
+ {
+ EbmlLoc segEbmlLoc, ebmlLocseg, ebmlLoc;
+ Ebml_StartSubElement(&ebml, &segEbmlLoc, Segment);
+ {
+ Ebml_StartSubElement(&ebml, &ebmlLocseg, SeekHead);
+ // Todo: We don't know the exact sizes of encoded data and
+ // ignore this section.
+ Ebml_EndSubElement(&ebml, &ebmlLocseg);
+ writeSegmentInformation(&ebml, &ebmlLoc, TIME_CODE_SCALE, 0);
+ {
+ EbmlLoc trackLoc;
+ Ebml_StartSubElement(&ebml, &trackLoc, Tracks);
+ {
+ // Video
+ if (mWidth > 0 && mHeight > 0) {
+ writeVideoTrack(&ebml, 0x1, 0, "V_VP8",
+ mWidth, mHeight,
+ mDisplayWidth, mDisplayHeight, mFrameRate);
+ }
+ // Audio
+ if (mCodecPrivateData.Length() > 0) {
+ // Extract the pre-skip from mCodecPrivateData
+ // then convert it to nanoseconds.
+ // Details in OpusTrackEncoder.cpp.
+ mCodecDelay =
+ (uint64_t)LittleEndian::readUint16(mCodecPrivateData.Elements() + 10)
+ * PR_NSEC_PER_SEC / 48000;
+ // Fixed 80ms, convert into nanoseconds.
+ uint64_t seekPreRoll = 80 * PR_NSEC_PER_MSEC;
+ writeAudioTrack(&ebml, 0x2, 0x0, "A_OPUS", mSampleFreq,
+ mChannels, mCodecDelay, seekPreRoll,
+ mCodecPrivateData.Elements(),
+ mCodecPrivateData.Length());
+ }
+ }
+ Ebml_EndSubElement(&ebml, &trackLoc);
+ }
+ }
+ // The Recording length is unknown and
+ // ignore write the whole Segment element size
+ }
+ MOZ_ASSERT(ebml.offset <= DEFAULT_HEADER_SIZE + mCodecPrivateData.Length(),
+ "write more data > EBML_BUFFER_SIZE");
+ auto block = mClusterBuffs.AppendElement();
+ block->SetLength(ebml.offset);
+ memcpy(block->Elements(), ebml.buf, ebml.offset);
+ mFlushState |= FLUSH_METADATA;
+}
+
+void EbmlComposer::FinishMetadata()
+{
+ if (mFlushState & FLUSH_METADATA) {
+ // We don't remove the first element of mClusterBuffs because the
+ // |mClusterHeaderIndex| may have value.
+ mClusterCanFlushBuffs.AppendElement()->SwapElements(mClusterBuffs[0]);
+ mFlushState &= ~FLUSH_METADATA;
+ }
+}
+
+void EbmlComposer::FinishCluster()
+{
+ FinishMetadata();
+ if (!(mFlushState & FLUSH_CLUSTER)) {
+ // No completed cluster available.
+ return;
+ }
+
+ MOZ_ASSERT(mClusterLengthLoc > 0);
+ EbmlGlobal ebml;
+ EbmlLoc ebmlLoc;
+ ebmlLoc.offset = mClusterLengthLoc;
+ ebml.offset = 0;
+ for (uint32_t i = mClusterHeaderIndex; i < mClusterBuffs.Length(); i++) {
+ ebml.offset += mClusterBuffs[i].Length();
+ }
+ ebml.buf = mClusterBuffs[mClusterHeaderIndex].Elements();
+ Ebml_EndSubElement(&ebml, &ebmlLoc);
+ // Move the mClusterBuffs data from mClusterHeaderIndex that we can skip
+ // the metadata and the rest P-frames after ContainerWriter::FLUSH_NEEDED.
+ for (uint32_t i = mClusterHeaderIndex; i < mClusterBuffs.Length(); i++) {
+ mClusterCanFlushBuffs.AppendElement()->SwapElements(mClusterBuffs[i]);
+ }
+
+ mClusterHeaderIndex = 0;
+ mClusterLengthLoc = 0;
+ mClusterBuffs.Clear();
+ mFlushState &= ~FLUSH_CLUSTER;
+}
+
+void
+EbmlComposer::WriteSimpleBlock(EncodedFrame* aFrame)
+{
+ EbmlGlobal ebml;
+ ebml.offset = 0;
+
+ auto frameType = aFrame->GetFrameType();
+ bool flush = false;
+ bool isVP8IFrame = (frameType == EncodedFrame::FrameType::VP8_I_FRAME);
+ if (isVP8IFrame) {
+ FinishCluster();
+ flush = true;
+ } else {
+ // Force it to calculate timecode using signed math via cast
+ int64_t timeCode = (aFrame->GetTimeStamp() / ((int) PR_USEC_PER_MSEC) - mClusterTimecode) +
+ (mCodecDelay / PR_NSEC_PER_MSEC);
+ if (timeCode < SHRT_MIN || timeCode > SHRT_MAX ) {
+ // We're probably going to overflow (or underflow) the timeCode value later!
+ FinishCluster();
+ flush = true;
+ }
+ }
+
+ auto block = mClusterBuffs.AppendElement();
+ block->SetLength(aFrame->GetFrameData().Length() + DEFAULT_HEADER_SIZE);
+ ebml.buf = block->Elements();
+
+ if (flush) {
+ EbmlLoc ebmlLoc;
+ Ebml_StartSubElement(&ebml, &ebmlLoc, Cluster);
+ MOZ_ASSERT(mClusterBuffs.Length() > 0);
+ // current cluster header array index
+ mClusterHeaderIndex = mClusterBuffs.Length() - 1;
+ mClusterLengthLoc = ebmlLoc.offset;
+ // if timeCode didn't under/overflow before, it shouldn't after this
+ mClusterTimecode = aFrame->GetTimeStamp() / PR_USEC_PER_MSEC;
+ Ebml_SerializeUnsigned(&ebml, Timecode, mClusterTimecode);
+ mFlushState |= FLUSH_CLUSTER;
+ }
+
+ bool isOpus = (frameType == EncodedFrame::FrameType::OPUS_AUDIO_FRAME);
+ // Can't underflow/overflow now
+ int64_t timeCode = aFrame->GetTimeStamp() / ((int) PR_USEC_PER_MSEC) - mClusterTimecode;
+ if (isOpus) {
+ timeCode += mCodecDelay / PR_NSEC_PER_MSEC;
+ }
+ MOZ_ASSERT(timeCode >= SHRT_MIN && timeCode <= SHRT_MAX);
+ writeSimpleBlock(&ebml, isOpus ? 0x2 : 0x1, static_cast<short>(timeCode), isVP8IFrame,
+ 0, 0, (unsigned char*)aFrame->GetFrameData().Elements(),
+ aFrame->GetFrameData().Length());
+ MOZ_ASSERT(ebml.offset <= DEFAULT_HEADER_SIZE +
+ aFrame->GetFrameData().Length(),
+ "write more data > EBML_BUFFER_SIZE");
+ block->SetLength(ebml.offset);
+}
+
+void
+EbmlComposer::SetVideoConfig(uint32_t aWidth, uint32_t aHeight,
+ uint32_t aDisplayWidth, uint32_t aDisplayHeight,
+ float aFrameRate)
+{
+ MOZ_ASSERT(aWidth > 0, "Width should > 0");
+ MOZ_ASSERT(aHeight > 0, "Height should > 0");
+ MOZ_ASSERT(aDisplayWidth > 0, "DisplayWidth should > 0");
+ MOZ_ASSERT(aDisplayHeight > 0, "DisplayHeight should > 0");
+ MOZ_ASSERT(aFrameRate > 0, "FrameRate should > 0");
+ mWidth = aWidth;
+ mHeight = aHeight;
+ mDisplayWidth = aDisplayWidth;
+ mDisplayHeight = aDisplayHeight;
+ mFrameRate = aFrameRate;
+}
+
+void
+EbmlComposer::SetAudioConfig(uint32_t aSampleFreq, uint32_t aChannels)
+{
+ MOZ_ASSERT(aSampleFreq > 0, "SampleFreq should > 0");
+ MOZ_ASSERT(aChannels > 0, "Channels should > 0");
+ mSampleFreq = aSampleFreq;
+ mChannels = aChannels;
+}
+
+void
+EbmlComposer::ExtractBuffer(nsTArray<nsTArray<uint8_t> >* aDestBufs,
+ uint32_t aFlag)
+{
+ if ((aFlag & ContainerWriter::FLUSH_NEEDED) ||
+ (aFlag & ContainerWriter::GET_HEADER))
+ {
+ FinishMetadata();
+ }
+ if (aFlag & ContainerWriter::FLUSH_NEEDED)
+ {
+ FinishCluster();
+ }
+ // aDestBufs may have some element
+ for (uint32_t i = 0; i < mClusterCanFlushBuffs.Length(); i++) {
+ aDestBufs->AppendElement()->SwapElements(mClusterCanFlushBuffs[i]);
+ }
+ mClusterCanFlushBuffs.Clear();
+}
+
+EbmlComposer::EbmlComposer()
+ : mFlushState(FLUSH_NONE)
+ , mClusterHeaderIndex(0)
+ , mClusterLengthLoc(0)
+ , mCodecDelay(0)
+ , mClusterTimecode(0)
+ , mWidth(0)
+ , mHeight(0)
+ , mFrameRate(0)
+ , mSampleFreq(0)
+ , mChannels(0)
+{}
+
+} // namespace mozilla
diff --git a/dom/media/webm/EbmlComposer.h b/dom/media/webm/EbmlComposer.h
new file mode 100644
index 000000000..389d33528
--- /dev/null
+++ b/dom/media/webm/EbmlComposer.h
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef EbmlComposer_h_
+#define EbmlComposer_h_
+#include "nsTArray.h"
+#include "ContainerWriter.h"
+
+namespace mozilla {
+
+/*
+ * A WebM muxer helper for package the valid WebM format.
+ */
+class EbmlComposer {
+public:
+ EbmlComposer();
+ /*
+ * Assign the parameter which header required.
+ */
+ void SetVideoConfig(uint32_t aWidth, uint32_t aHeight, uint32_t aDisplayWidth,
+ uint32_t aDisplayHeight, float aFrameRate);
+
+ void SetAudioConfig(uint32_t aSampleFreq, uint32_t aChannels);
+ /*
+ * Set the CodecPrivateData for writing in header.
+ */
+ void SetAudioCodecPrivateData(nsTArray<uint8_t>& aBufs)
+ {
+ mCodecPrivateData.AppendElements(aBufs);
+ }
+ /*
+ * Generate the whole WebM header and output to mBuff.
+ */
+ void GenerateHeader();
+ /*
+ * Insert media encoded buffer into muxer and it would be package
+ * into SimpleBlock. If no cluster is opened, new cluster will start for writing.
+ */
+ void WriteSimpleBlock(EncodedFrame* aFrame);
+ /*
+ * Get valid cluster data.
+ */
+ void ExtractBuffer(nsTArray<nsTArray<uint8_t> >* aDestBufs,
+ uint32_t aFlag = 0);
+private:
+ // Move the metadata data to mClusterCanFlushBuffs.
+ void FinishMetadata();
+ // Close current cluster and move data to mClusterCanFlushBuffs.
+ void FinishCluster();
+ // The temporary storage for cluster data.
+ nsTArray<nsTArray<uint8_t> > mClusterBuffs;
+ // The storage which contain valid cluster data.
+ nsTArray<nsTArray<uint8_t> > mClusterCanFlushBuffs;
+
+ // Indicate the data types in mClusterBuffs.
+ enum {
+ FLUSH_NONE = 0,
+ FLUSH_METADATA = 1 << 0,
+ FLUSH_CLUSTER = 1 << 1
+ };
+ uint32_t mFlushState;
+ // Indicate the cluster header index in mClusterBuffs.
+ uint32_t mClusterHeaderIndex;
+ // The cluster length position.
+ uint64_t mClusterLengthLoc;
+ // Audio codec specific header data.
+ nsTArray<uint8_t> mCodecPrivateData;
+ // Codec delay in nanoseconds.
+ uint64_t mCodecDelay;
+
+ // The timecode of the cluster.
+ uint64_t mClusterTimecode;
+
+ // Video configuration
+ int mWidth;
+ int mHeight;
+ int mDisplayWidth;
+ int mDisplayHeight;
+ float mFrameRate;
+ // Audio configuration
+ float mSampleFreq;
+ int mChannels;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webm/NesteggPacketHolder.h b/dom/media/webm/NesteggPacketHolder.h
new file mode 100644
index 000000000..c1d0b646f
--- /dev/null
+++ b/dom/media/webm/NesteggPacketHolder.h
@@ -0,0 +1,124 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(NesteggPacketHolder_h_)
+#define NesteggPacketHolder_h_
+
+#include <stdint.h>
+#include "nsAutoRef.h"
+#include "nestegg/nestegg.h"
+
+namespace mozilla {
+
+// Holds a nestegg_packet, and its file offset. This is needed so we
+// know the offset in the file we've played up to, in order to calculate
+// whether it's likely we can play through to the end without needing
+// to stop to buffer, given the current download rate.
+class NesteggPacketHolder {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NesteggPacketHolder)
+ NesteggPacketHolder()
+ : mPacket(nullptr)
+ , mOffset(-1)
+ , mTimestamp(-1)
+ , mDuration(-1)
+ , mIsKeyframe(false) {}
+
+ bool Init(nestegg_packet* aPacket, int64_t aOffset, unsigned aTrack, bool aIsKeyframe)
+ {
+ uint64_t timestamp_ns;
+ if (nestegg_packet_tstamp(aPacket, &timestamp_ns) == -1) {
+ return false;
+ }
+
+ // We store the timestamp as signed microseconds so that it's easily
+ // comparable to other timestamps we have in the system.
+ mTimestamp = timestamp_ns / 1000;
+ mPacket = aPacket;
+ mOffset = aOffset;
+ mTrack = aTrack;
+ mIsKeyframe = aIsKeyframe;
+
+ uint64_t duration_ns;
+ if (!nestegg_packet_duration(aPacket, &duration_ns)) {
+ mDuration = duration_ns / 1000;
+ }
+ return true;
+ }
+
+ nestegg_packet* Packet() { MOZ_ASSERT(IsInitialized()); return mPacket; }
+ int64_t Offset() { MOZ_ASSERT(IsInitialized()); return mOffset; }
+ int64_t Timestamp() { MOZ_ASSERT(IsInitialized()); return mTimestamp; }
+ int64_t Duration() { MOZ_ASSERT(IsInitialized()); return mDuration; }
+ unsigned Track() { MOZ_ASSERT(IsInitialized()); return mTrack; }
+ bool IsKeyframe() { MOZ_ASSERT(IsInitialized()); return mIsKeyframe; }
+
+private:
+ ~NesteggPacketHolder()
+ {
+ nestegg_free_packet(mPacket);
+ }
+
+ bool IsInitialized() { return mOffset >= 0; }
+
+ nestegg_packet* mPacket;
+
+ // Offset in bytes. This is the offset of the end of the Block
+ // which contains the packet.
+ int64_t mOffset;
+
+ // Packet presentation timestamp in microseconds.
+ int64_t mTimestamp;
+
+ // Packet duration in microseconds; -1 if unknown or retrieval failed.
+ int64_t mDuration;
+
+ // Track ID.
+ unsigned mTrack;
+
+ // Does this packet contain a keyframe?
+ bool mIsKeyframe;
+
+ // Copy constructor and assignment operator not implemented. Don't use them!
+ NesteggPacketHolder(const NesteggPacketHolder &aOther);
+ NesteggPacketHolder& operator= (NesteggPacketHolder const& aOther);
+};
+
+// Queue for holding nestegg packets.
+class WebMPacketQueue {
+ public:
+ int32_t GetSize() {
+ return mQueue.size();
+ }
+
+ void Push(NesteggPacketHolder* aItem) {
+ mQueue.push_back(aItem);
+ }
+
+ void PushFront(NesteggPacketHolder* aItem) {
+ mQueue.push_front(Move(aItem));
+ }
+
+ already_AddRefed<NesteggPacketHolder> PopFront() {
+ RefPtr<NesteggPacketHolder> result = mQueue.front().forget();
+ mQueue.pop_front();
+ return result.forget();
+ }
+
+ void Reset() {
+ while (!mQueue.empty()) {
+ mQueue.pop_front();
+ }
+ }
+
+private:
+ std::deque<RefPtr<NesteggPacketHolder>> mQueue;
+};
+
+
+} // namespace mozilla
+
+#endif
+
diff --git a/dom/media/webm/WebMBufferedParser.cpp b/dom/media/webm/WebMBufferedParser.cpp
new file mode 100644
index 000000000..21154ab4b
--- /dev/null
+++ b/dom/media/webm/WebMBufferedParser.cpp
@@ -0,0 +1,514 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsAlgorithm.h"
+#include "WebMBufferedParser.h"
+#include "nsThreadUtils.h"
+#include <algorithm>
+
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+#define WEBM_DEBUG(arg, ...) MOZ_LOG(gMediaDemuxerLog, mozilla::LogLevel::Debug, ("WebMBufferedParser(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+
+namespace mozilla {
+
+static uint32_t
+VIntLength(unsigned char aFirstByte, uint32_t* aMask)
+{
+ uint32_t count = 1;
+ uint32_t mask = 1 << 7;
+ while (count < 8) {
+ if ((aFirstByte & mask) != 0) {
+ break;
+ }
+ mask >>= 1;
+ count += 1;
+ }
+ if (aMask) {
+ *aMask = mask;
+ }
+ NS_ASSERTION(count >= 1 && count <= 8, "Insane VInt length.");
+ return count;
+}
+
+bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength,
+ nsTArray<WebMTimeDataOffset>& aMapping,
+ ReentrantMonitor& aReentrantMonitor)
+{
+ static const uint32_t EBML_ID = 0x1a45dfa3;
+ static const uint32_t SEGMENT_ID = 0x18538067;
+ static const uint32_t SEGINFO_ID = 0x1549a966;
+ static const uint32_t TRACKS_ID = 0x1654AE6B;
+ static const uint32_t CLUSTER_ID = 0x1f43b675;
+ static const uint32_t TIMECODESCALE_ID = 0x2ad7b1;
+ static const unsigned char TIMECODE_ID = 0xe7;
+ static const unsigned char BLOCKGROUP_ID = 0xa0;
+ static const unsigned char BLOCK_ID = 0xa1;
+ static const unsigned char SIMPLEBLOCK_ID = 0xa3;
+ static const uint32_t BLOCK_TIMECODE_LENGTH = 2;
+
+ static const unsigned char CLUSTER_SYNC_ID[] = { 0x1f, 0x43, 0xb6, 0x75 };
+
+ const unsigned char* p = aBuffer;
+
+ // Parse each byte in aBuffer one-by-one, producing timecodes and updating
+ // aMapping as we go. Parser pauses at end of stream (which may be at any
+ // point within the parse) and resumes parsing the next time Append is
+ // called with new data.
+ while (p < aBuffer + aLength) {
+ switch (mState) {
+ case READ_ELEMENT_ID:
+ mVIntRaw = true;
+ mState = READ_VINT;
+ mNextState = READ_ELEMENT_SIZE;
+ break;
+ case READ_ELEMENT_SIZE:
+ mVIntRaw = false;
+ mElement.mID = mVInt;
+ mState = READ_VINT;
+ mNextState = PARSE_ELEMENT;
+ break;
+ case FIND_CLUSTER_SYNC:
+ if (*p++ == CLUSTER_SYNC_ID[mClusterSyncPos]) {
+ mClusterSyncPos += 1;
+ } else {
+ mClusterSyncPos = 0;
+ }
+ if (mClusterSyncPos == sizeof(CLUSTER_SYNC_ID)) {
+ mVInt.mValue = CLUSTER_ID;
+ mVInt.mLength = sizeof(CLUSTER_SYNC_ID);
+ mState = READ_ELEMENT_SIZE;
+ }
+ break;
+ case PARSE_ELEMENT:
+ mElement.mSize = mVInt;
+ switch (mElement.mID.mValue) {
+ case SEGMENT_ID:
+ mState = READ_ELEMENT_ID;
+ break;
+ case SEGINFO_ID:
+ mGotTimecodeScale = true;
+ mState = READ_ELEMENT_ID;
+ break;
+ case TIMECODE_ID:
+ mVInt = VInt();
+ mVIntLeft = mElement.mSize.mValue;
+ mState = READ_VINT_REST;
+ mNextState = READ_CLUSTER_TIMECODE;
+ break;
+ case TIMECODESCALE_ID:
+ mVInt = VInt();
+ mVIntLeft = mElement.mSize.mValue;
+ mState = READ_VINT_REST;
+ mNextState = READ_TIMECODESCALE;
+ break;
+ case CLUSTER_ID:
+ mClusterOffset = mCurrentOffset + (p - aBuffer) -
+ (mElement.mID.mLength + mElement.mSize.mLength);
+ // Handle "unknown" length;
+ if (mElement.mSize.mValue + 1 != uint64_t(1) << (mElement.mSize.mLength * 7)) {
+ mClusterEndOffset = mClusterOffset + mElement.mID.mLength + mElement.mSize.mLength + mElement.mSize.mValue;
+ } else {
+ mClusterEndOffset = -1;
+ }
+ mState = READ_ELEMENT_ID;
+ break;
+ case BLOCKGROUP_ID:
+ mState = READ_ELEMENT_ID;
+ break;
+ case SIMPLEBLOCK_ID:
+ /* FALLTHROUGH */
+ case BLOCK_ID:
+ mBlockSize = mElement.mSize.mValue;
+ mBlockTimecode = 0;
+ mBlockTimecodeLength = BLOCK_TIMECODE_LENGTH;
+ mBlockOffset = mCurrentOffset + (p - aBuffer) -
+ (mElement.mID.mLength + mElement.mSize.mLength);
+ mState = READ_VINT;
+ mNextState = READ_BLOCK_TIMECODE;
+ break;
+ case TRACKS_ID:
+ mSkipBytes = mElement.mSize.mValue;
+ mState = CHECK_INIT_FOUND;
+ break;
+ case EBML_ID:
+ mLastInitStartOffset = mCurrentOffset + (p - aBuffer) -
+ (mElement.mID.mLength + mElement.mSize.mLength);
+ MOZ_FALLTHROUGH;
+ default:
+ mSkipBytes = mElement.mSize.mValue;
+ mState = SKIP_DATA;
+ mNextState = READ_ELEMENT_ID;
+ break;
+ }
+ break;
+ case READ_VINT: {
+ unsigned char c = *p++;
+ uint32_t mask;
+ mVInt.mLength = VIntLength(c, &mask);
+ mVIntLeft = mVInt.mLength - 1;
+ mVInt.mValue = mVIntRaw ? c : c & ~mask;
+ mState = READ_VINT_REST;
+ break;
+ }
+ case READ_VINT_REST:
+ if (mVIntLeft) {
+ mVInt.mValue <<= 8;
+ mVInt.mValue |= *p++;
+ mVIntLeft -= 1;
+ } else {
+ mState = mNextState;
+ }
+ break;
+ case READ_TIMECODESCALE:
+ if (!mGotTimecodeScale) {
+ return false;
+ }
+ mTimecodeScale = mVInt.mValue;
+ mState = READ_ELEMENT_ID;
+ break;
+ case READ_CLUSTER_TIMECODE:
+ mClusterTimecode = mVInt.mValue;
+ mState = READ_ELEMENT_ID;
+ break;
+ case READ_BLOCK_TIMECODE:
+ if (mBlockTimecodeLength) {
+ mBlockTimecode <<= 8;
+ mBlockTimecode |= *p++;
+ mBlockTimecodeLength -= 1;
+ } else {
+ // It's possible we've parsed this data before, so avoid inserting
+ // duplicate WebMTimeDataOffset entries.
+ {
+ ReentrantMonitorAutoEnter mon(aReentrantMonitor);
+ int64_t endOffset = mBlockOffset + mBlockSize +
+ mElement.mID.mLength + mElement.mSize.mLength;
+ uint32_t idx = aMapping.IndexOfFirstElementGt(endOffset);
+ if (idx == 0 || aMapping[idx - 1] != endOffset) {
+ // Don't insert invalid negative timecodes.
+ if (mBlockTimecode >= 0 || mClusterTimecode >= uint16_t(abs(mBlockTimecode))) {
+ if (!mGotTimecodeScale) {
+ return false;
+ }
+ uint64_t absTimecode = mClusterTimecode + mBlockTimecode;
+ absTimecode *= mTimecodeScale;
+ // Avoid creating an entry if the timecode is out of order
+ // (invalid according to the WebM specification) so that
+ // ordering invariants of aMapping are not violated.
+ if (idx == 0 ||
+ aMapping[idx - 1].mTimecode <= absTimecode ||
+ (idx + 1 < aMapping.Length() &&
+ aMapping[idx + 1].mTimecode >= absTimecode)) {
+ WebMTimeDataOffset entry(endOffset, absTimecode, mLastInitStartOffset,
+ mClusterOffset, mClusterEndOffset);
+ aMapping.InsertElementAt(idx, entry);
+ } else {
+ WEBM_DEBUG("Out of order timecode %llu in Cluster at %lld ignored",
+ absTimecode, mClusterOffset);
+ }
+ }
+ }
+ }
+
+ // Skip rest of block header and the block's payload.
+ mBlockSize -= mVInt.mLength;
+ mBlockSize -= BLOCK_TIMECODE_LENGTH;
+ mSkipBytes = uint32_t(mBlockSize);
+ mState = SKIP_DATA;
+ mNextState = READ_ELEMENT_ID;
+ }
+ break;
+ case SKIP_DATA:
+ if (mSkipBytes) {
+ uint32_t left = aLength - (p - aBuffer);
+ left = std::min(left, mSkipBytes);
+ p += left;
+ mSkipBytes -= left;
+ }
+ if (!mSkipBytes) {
+ mBlockEndOffset = mCurrentOffset + (p - aBuffer);
+ mState = mNextState;
+ }
+ break;
+ case CHECK_INIT_FOUND:
+ if (mSkipBytes) {
+ uint32_t left = aLength - (p - aBuffer);
+ left = std::min(left, mSkipBytes);
+ p += left;
+ mSkipBytes -= left;
+ }
+ if (!mSkipBytes) {
+ if (mInitEndOffset < 0) {
+ mInitEndOffset = mCurrentOffset + (p - aBuffer);
+ mBlockEndOffset = mCurrentOffset + (p - aBuffer);
+ }
+ mState = READ_ELEMENT_ID;
+ }
+ break;
+ }
+ }
+
+ NS_ASSERTION(p == aBuffer + aLength, "Must have parsed to end of data.");
+ mCurrentOffset += aLength;
+
+ return true;
+}
+
+int64_t
+WebMBufferedParser::EndSegmentOffset(int64_t aOffset)
+{
+ if (mLastInitStartOffset > aOffset || mClusterOffset > aOffset) {
+ return std::min(mLastInitStartOffset >= 0 ? mLastInitStartOffset : INT64_MAX,
+ mClusterOffset >= 0 ? mClusterOffset : INT64_MAX);
+ }
+ return mBlockEndOffset;
+}
+
+// SyncOffsetComparator and TimeComparator are slightly confusing, in that
+// the nsTArray they're used with (mTimeMapping) is sorted by mEndOffset and
+// these comparators are used on the other fields of WebMTimeDataOffset.
+// This is only valid because timecodes are required to be monotonically
+// increasing within a file (thus establishing an ordering relationship with
+// mTimecode), and mEndOffset is derived from mSyncOffset.
+struct SyncOffsetComparator {
+ bool Equals(const WebMTimeDataOffset& a, const int64_t& b) const {
+ return a.mSyncOffset == b;
+ }
+
+ bool LessThan(const WebMTimeDataOffset& a, const int64_t& b) const {
+ return a.mSyncOffset < b;
+ }
+};
+
+struct TimeComparator {
+ bool Equals(const WebMTimeDataOffset& a, const uint64_t& b) const {
+ return a.mTimecode == b;
+ }
+
+ bool LessThan(const WebMTimeDataOffset& a, const uint64_t& b) const {
+ return a.mTimecode < b;
+ }
+};
+
+bool WebMBufferedState::CalculateBufferedForRange(int64_t aStartOffset, int64_t aEndOffset,
+ uint64_t* aStartTime, uint64_t* aEndTime)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ // Find the first WebMTimeDataOffset at or after aStartOffset.
+ uint32_t start = mTimeMapping.IndexOfFirstElementGt(aStartOffset - 1, SyncOffsetComparator());
+ if (start == mTimeMapping.Length()) {
+ return false;
+ }
+
+ // Find the first WebMTimeDataOffset at or before aEndOffset.
+ uint32_t end = mTimeMapping.IndexOfFirstElementGt(aEndOffset);
+ if (end > 0) {
+ end -= 1;
+ }
+
+ // Range is empty.
+ if (end <= start) {
+ return false;
+ }
+
+ NS_ASSERTION(mTimeMapping[start].mSyncOffset >= aStartOffset &&
+ mTimeMapping[end].mEndOffset <= aEndOffset,
+ "Computed time range must lie within data range.");
+ if (start > 0) {
+ NS_ASSERTION(mTimeMapping[start - 1].mSyncOffset < aStartOffset,
+ "Must have found least WebMTimeDataOffset for start");
+ }
+ if (end < mTimeMapping.Length() - 1) {
+ NS_ASSERTION(mTimeMapping[end + 1].mEndOffset > aEndOffset,
+ "Must have found greatest WebMTimeDataOffset for end");
+ }
+
+ MOZ_ASSERT(mTimeMapping[end].mTimecode >= mTimeMapping[end - 1].mTimecode);
+ uint64_t frameDuration = mTimeMapping[end].mTimecode - mTimeMapping[end - 1].mTimecode;
+ *aStartTime = mTimeMapping[start].mTimecode;
+ *aEndTime = mTimeMapping[end].mTimecode + frameDuration;
+ return true;
+}
+
+bool WebMBufferedState::GetOffsetForTime(uint64_t aTime, int64_t* aOffset)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ if(mTimeMapping.IsEmpty()) {
+ return false;
+ }
+
+ uint64_t time = aTime;
+ if (time > 0) {
+ time = time - 1;
+ }
+ uint32_t idx = mTimeMapping.IndexOfFirstElementGt(time, TimeComparator());
+ if (idx == mTimeMapping.Length()) {
+ // Clamp to end
+ *aOffset = mTimeMapping[mTimeMapping.Length() - 1].mSyncOffset;
+ } else {
+ // Idx is within array or has been clamped to start
+ *aOffset = mTimeMapping[idx].mSyncOffset;
+ }
+ return true;
+}
+
+void WebMBufferedState::NotifyDataArrived(const unsigned char* aBuffer, uint32_t aLength, int64_t aOffset)
+{
+ uint32_t idx = mRangeParsers.IndexOfFirstElementGt(aOffset - 1);
+ if (idx == 0 || !(mRangeParsers[idx-1] == aOffset)) {
+ // If the incoming data overlaps an already parsed range, adjust the
+ // buffer so that we only reparse the new data. It's also possible to
+ // have an overlap where the end of the incoming data is within an
+ // already parsed range, but we don't bother handling that other than by
+ // avoiding storing duplicate timecodes when the parser runs.
+ if (idx != mRangeParsers.Length() && mRangeParsers[idx].mStartOffset <= aOffset) {
+ // Complete overlap, skip parsing.
+ if (aOffset + aLength <= mRangeParsers[idx].mCurrentOffset) {
+ return;
+ }
+
+ // Partial overlap, adjust the buffer to parse only the new data.
+ int64_t adjust = mRangeParsers[idx].mCurrentOffset - aOffset;
+ NS_ASSERTION(adjust >= 0, "Overlap detection bug.");
+ aBuffer += adjust;
+ aLength -= uint32_t(adjust);
+ } else {
+ mRangeParsers.InsertElementAt(idx, WebMBufferedParser(aOffset));
+ if (idx != 0) {
+ mRangeParsers[idx].SetTimecodeScale(mRangeParsers[0].GetTimecodeScale());
+ }
+ }
+ }
+
+ mRangeParsers[idx].Append(aBuffer,
+ aLength,
+ mTimeMapping,
+ mReentrantMonitor);
+
+ // Merge parsers with overlapping regions and clean up the remnants.
+ uint32_t i = 0;
+ while (i + 1 < mRangeParsers.Length()) {
+ if (mRangeParsers[i].mCurrentOffset >= mRangeParsers[i + 1].mStartOffset) {
+ mRangeParsers[i + 1].mStartOffset = mRangeParsers[i].mStartOffset;
+ mRangeParsers[i + 1].mInitEndOffset = mRangeParsers[i].mInitEndOffset;
+ mRangeParsers.RemoveElementAt(i);
+ } else {
+ i += 1;
+ }
+ }
+
+ if (mRangeParsers.IsEmpty()) {
+ return;
+ }
+
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ mLastBlockOffset = mRangeParsers.LastElement().mBlockEndOffset;
+}
+
+void WebMBufferedState::Reset() {
+ mRangeParsers.Clear();
+ mTimeMapping.Clear();
+}
+
+void WebMBufferedState::UpdateIndex(const MediaByteRangeSet& aRanges, MediaResource* aResource)
+{
+ for (uint32_t index = 0; index < aRanges.Length(); index++) {
+ const MediaByteRange& range = aRanges[index];
+ int64_t offset = range.mStart;
+ uint32_t length = range.mEnd - range.mStart;
+
+ uint32_t idx = mRangeParsers.IndexOfFirstElementGt(offset - 1);
+ if (!idx || !(mRangeParsers[idx-1] == offset)) {
+ // If the incoming data overlaps an already parsed range, adjust the
+ // buffer so that we only reparse the new data. It's also possible to
+ // have an overlap where the end of the incoming data is within an
+ // already parsed range, but we don't bother handling that other than by
+ // avoiding storing duplicate timecodes when the parser runs.
+ if (idx != mRangeParsers.Length() && mRangeParsers[idx].mStartOffset <= offset) {
+ // Complete overlap, skip parsing.
+ if (offset + length <= mRangeParsers[idx].mCurrentOffset) {
+ continue;
+ }
+
+ // Partial overlap, adjust the buffer to parse only the new data.
+ int64_t adjust = mRangeParsers[idx].mCurrentOffset - offset;
+ NS_ASSERTION(adjust >= 0, "Overlap detection bug.");
+ offset += adjust;
+ length -= uint32_t(adjust);
+ } else {
+ mRangeParsers.InsertElementAt(idx, WebMBufferedParser(offset));
+ if (idx) {
+ mRangeParsers[idx].SetTimecodeScale(mRangeParsers[0].GetTimecodeScale());
+ }
+ }
+ }
+ while (length > 0) {
+ static const uint32_t BLOCK_SIZE = 1048576;
+ uint32_t block = std::min(length, BLOCK_SIZE);
+ RefPtr<MediaByteBuffer> bytes = aResource->MediaReadAt(offset, block);
+ if (!bytes) {
+ break;
+ }
+ NotifyDataArrived(bytes->Elements(), bytes->Length(), offset);
+ length -= bytes->Length();
+ offset += bytes->Length();
+ }
+ }
+}
+
+int64_t WebMBufferedState::GetInitEndOffset()
+{
+ if (mRangeParsers.IsEmpty()) {
+ return -1;
+ }
+ return mRangeParsers[0].mInitEndOffset;
+}
+
+int64_t WebMBufferedState::GetLastBlockOffset()
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ return mLastBlockOffset;
+}
+
+bool WebMBufferedState::GetStartTime(uint64_t *aTime)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+
+ if (mTimeMapping.IsEmpty()) {
+ return false;
+ }
+
+ uint32_t idx = mTimeMapping.IndexOfFirstElementGt(0, SyncOffsetComparator());
+ if (idx == mTimeMapping.Length()) {
+ return false;
+ }
+
+ *aTime = mTimeMapping[idx].mTimecode;
+ return true;
+}
+
+bool
+WebMBufferedState::GetNextKeyframeTime(uint64_t aTime, uint64_t* aKeyframeTime)
+{
+ ReentrantMonitorAutoEnter mon(mReentrantMonitor);
+ int64_t offset = 0;
+ bool rv = GetOffsetForTime(aTime, &offset);
+ if (!rv) {
+ return false;
+ }
+ uint32_t idx = mTimeMapping.IndexOfFirstElementGt(offset, SyncOffsetComparator());
+ if (idx == mTimeMapping.Length()) {
+ return false;
+ }
+ *aKeyframeTime = mTimeMapping[idx].mTimecode;
+ return true;
+}
+} // namespace mozilla
+
+#undef WEBM_DEBUG
+
diff --git a/dom/media/webm/WebMBufferedParser.h b/dom/media/webm/WebMBufferedParser.h
new file mode 100644
index 000000000..bc3de4ba0
--- /dev/null
+++ b/dom/media/webm/WebMBufferedParser.h
@@ -0,0 +1,322 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(WebMBufferedParser_h_)
+#define WebMBufferedParser_h_
+
+#include "nsISupportsImpl.h"
+#include "nsTArray.h"
+#include "mozilla/ReentrantMonitor.h"
+#include "MediaResource.h"
+
+namespace mozilla {
+
+// Stores a stream byte offset and the scaled timecode of the block at
+// that offset.
+struct WebMTimeDataOffset
+{
+ WebMTimeDataOffset(int64_t aEndOffset, uint64_t aTimecode,
+ int64_t aInitOffset, int64_t aSyncOffset,
+ int64_t aClusterEndOffset)
+ : mEndOffset(aEndOffset)
+ , mInitOffset(aInitOffset)
+ , mSyncOffset(aSyncOffset)
+ , mClusterEndOffset(aClusterEndOffset)
+ , mTimecode(aTimecode)
+ {}
+
+ bool operator==(int64_t aEndOffset) const {
+ return mEndOffset == aEndOffset;
+ }
+
+ bool operator!=(int64_t aEndOffset) const {
+ return mEndOffset != aEndOffset;
+ }
+
+ bool operator<(int64_t aEndOffset) const {
+ return mEndOffset < aEndOffset;
+ }
+
+ int64_t mEndOffset;
+ int64_t mInitOffset;
+ int64_t mSyncOffset;
+ int64_t mClusterEndOffset;
+ uint64_t mTimecode;
+};
+
+// A simple WebM parser that produces data offset to timecode pairs as it
+// consumes blocks. A new parser is created for each distinct range of data
+// received and begins parsing from the first WebM cluster within that
+// range. Old parsers are destroyed when their range merges with a later
+// parser or an already parsed range. The parser may start at any position
+// within the stream.
+struct WebMBufferedParser
+{
+ explicit WebMBufferedParser(int64_t aOffset)
+ : mStartOffset(aOffset)
+ , mCurrentOffset(aOffset)
+ , mInitEndOffset(-1)
+ , mBlockEndOffset(-1)
+ , mState(READ_ELEMENT_ID)
+ , mNextState(READ_ELEMENT_ID)
+ , mVIntRaw(false)
+ , mLastInitStartOffset(-1)
+ , mClusterSyncPos(0)
+ , mVIntLeft(0)
+ , mBlockSize(0)
+ , mClusterTimecode(0)
+ , mClusterOffset(0)
+ , mClusterEndOffset(-1)
+ , mBlockOffset(0)
+ , mBlockTimecode(0)
+ , mBlockTimecodeLength(0)
+ , mSkipBytes(0)
+ , mTimecodeScale(1000000)
+ , mGotTimecodeScale(false)
+ {
+ if (mStartOffset != 0) {
+ mState = FIND_CLUSTER_SYNC;
+ }
+ }
+
+ uint32_t GetTimecodeScale() {
+ MOZ_ASSERT(mGotTimecodeScale);
+ return mTimecodeScale;
+ }
+
+ // If this parser is not expected to parse a segment info, it must be told
+ // the appropriate timecode scale to use from elsewhere.
+ void SetTimecodeScale(uint32_t aTimecodeScale) {
+ mTimecodeScale = aTimecodeScale;
+ mGotTimecodeScale = true;
+ }
+
+ // Steps the parser through aLength bytes of data. Always consumes
+ // aLength bytes. Updates mCurrentOffset before returning. Acquires
+ // aReentrantMonitor before using aMapping.
+ // Returns false if an error was encountered.
+ bool Append(const unsigned char* aBuffer, uint32_t aLength,
+ nsTArray<WebMTimeDataOffset>& aMapping,
+ ReentrantMonitor& aReentrantMonitor);
+
+ bool operator==(int64_t aOffset) const {
+ return mCurrentOffset == aOffset;
+ }
+
+ bool operator<(int64_t aOffset) const {
+ return mCurrentOffset < aOffset;
+ }
+
+ // Returns the start offset of the init (EBML) or media segment (Cluster)
+ // following the aOffset position. If none were found, returns mBlockEndOffset.
+ // This allows to determine the end of the interval containg aOffset.
+ int64_t EndSegmentOffset(int64_t aOffset);
+
+ // The offset at which this parser started parsing. Used to merge
+ // adjacent parsers, in which case the later parser adopts the earlier
+ // parser's mStartOffset.
+ int64_t mStartOffset;
+
+ // Current offset within the stream. Updated in chunks as Append() consumes
+ // data.
+ int64_t mCurrentOffset;
+
+ // Tracks element's end offset. This indicates the end of the first init
+ // segment. Will only be set if a Segment Information has been found.
+ int64_t mInitEndOffset;
+
+ // End offset of the last block parsed.
+ // Will only be set if a complete block has been parsed.
+ int64_t mBlockEndOffset;
+
+private:
+ enum State {
+ // Parser start state. Expects to begin at a valid EBML element. Move
+ // to READ_VINT with mVIntRaw true, then return to READ_ELEMENT_SIZE.
+ READ_ELEMENT_ID,
+
+ // Store element ID read into mVInt into mElement.mID. Move to
+ // READ_VINT with mVIntRaw false, then return to PARSE_ELEMENT.
+ READ_ELEMENT_SIZE,
+
+ // Parser start state for parsers started at an arbitrary offset. Scans
+ // forward for the first cluster, then move to READ_ELEMENT_ID.
+ FIND_CLUSTER_SYNC,
+
+ // Simplistic core of the parser. Does not pay attention to nesting of
+ // elements. Checks mElement for an element ID of interest, then moves
+ // to the next state as determined by the element ID.
+ PARSE_ELEMENT,
+
+ // Read the first byte of a variable length integer. The first byte
+ // encodes both the variable integer's length and part of the value.
+ // The value read so far is stored in mVInt.mValue and the length is
+ // stored in mVInt.mLength. The number of bytes left to read is stored
+ // in mVIntLeft.
+ READ_VINT,
+
+ // Reads the remaining mVIntLeft bytes into mVInt.mValue.
+ READ_VINT_REST,
+
+ // mVInt holds the parsed timecode scale, store it in mTimecodeScale,
+ // then return READ_ELEMENT_ID.
+ READ_TIMECODESCALE,
+
+ // mVInt holds the parsed cluster timecode, store it in
+ // mClusterTimecode, then return to READ_ELEMENT_ID.
+ READ_CLUSTER_TIMECODE,
+
+ // mBlockTimecodeLength holds the remaining length of the block timecode
+ // left to read. Read each byte of the timecode into mBlockTimecode.
+ // Once complete, calculate the scaled timecode from the cluster
+ // timecode, block timecode, and timecode scale, and insert a
+ // WebMTimeDataOffset entry into aMapping if one is not already present
+ // for this offset.
+ READ_BLOCK_TIMECODE,
+
+ // Will skip the current tracks element and set mInitEndOffset if an init
+ // segment has been found.
+ // Currently, only assumes it's the end of the tracks element.
+ CHECK_INIT_FOUND,
+
+ // Skip mSkipBytes of data before resuming parse at mNextState.
+ SKIP_DATA,
+ };
+
+ // Current state machine action.
+ State mState;
+
+ // Next state machine action. SKIP_DATA and READ_VINT_REST advance to
+ // mNextState when the current action completes.
+ State mNextState;
+
+ struct VInt {
+ VInt() : mValue(0), mLength(0) {}
+ uint64_t mValue;
+ uint64_t mLength;
+ };
+
+ struct EBMLElement {
+ uint64_t Length() { return mID.mLength + mSize.mLength; }
+ VInt mID;
+ VInt mSize;
+ };
+
+ EBMLElement mElement;
+
+ VInt mVInt;
+
+ bool mVIntRaw;
+
+ // EBML start offset. This indicates the start of the last init segment
+ // parsed. Will only be set if an EBML element has been found.
+ int64_t mLastInitStartOffset;
+
+ // Current match position within CLUSTER_SYNC_ID. Used to find sync
+ // within arbitrary data.
+ uint32_t mClusterSyncPos;
+
+ // Number of bytes of mVInt left to read. mVInt is complete once this
+ // reaches 0.
+ uint32_t mVIntLeft;
+
+ // Size of the block currently being parsed. Any unused data within the
+ // block is skipped once the block timecode has been parsed.
+ uint64_t mBlockSize;
+
+ // Cluster-level timecode.
+ uint64_t mClusterTimecode;
+
+ // Start offset of the cluster currently being parsed. Used as the sync
+ // point offset for the offset-to-time mapping as each block timecode is
+ // been parsed.
+ int64_t mClusterOffset;
+
+ // End offset of the cluster currently being parsed. -1 if unknown.
+ int64_t mClusterEndOffset;
+
+ // Start offset of the block currently being parsed. Used as the byte
+ // offset for the offset-to-time mapping once the block timecode has been
+ // parsed.
+ int64_t mBlockOffset;
+
+ // Block-level timecode. This is summed with mClusterTimecode to produce
+ // an absolute timecode for the offset-to-time mapping.
+ int16_t mBlockTimecode;
+
+ // Number of bytes of mBlockTimecode left to read.
+ uint32_t mBlockTimecodeLength;
+
+ // Count of bytes left to skip before resuming parse at mNextState.
+ // Mostly used to skip block payload data after reading a block timecode.
+ uint32_t mSkipBytes;
+
+ // Timecode scale read from the segment info and used to scale absolute
+ // timecodes.
+ uint32_t mTimecodeScale;
+
+ // True if we read the timecode scale from the segment info or have
+ // confirmed that the default value is to be used.
+ bool mGotTimecodeScale;
+};
+
+class WebMBufferedState final
+{
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebMBufferedState)
+
+public:
+ WebMBufferedState()
+ : mReentrantMonitor("WebMBufferedState")
+ , mLastBlockOffset(-1)
+ {
+ MOZ_COUNT_CTOR(WebMBufferedState);
+ }
+
+ void NotifyDataArrived(const unsigned char* aBuffer, uint32_t aLength, int64_t aOffset);
+ void Reset();
+ void UpdateIndex(const MediaByteRangeSet& aRanges, MediaResource* aResource);
+ bool CalculateBufferedForRange(int64_t aStartOffset, int64_t aEndOffset,
+ uint64_t* aStartTime, uint64_t* aEndTime);
+
+ // Returns true if mTimeMapping is not empty and sets aOffset to
+ // the latest offset for which decoding can resume without data
+ // dependencies to arrive at aTime. aTime will be clamped to the start
+ // of mTimeMapping if it is earlier than the first element, and to the end
+ // if later than the last
+ bool GetOffsetForTime(uint64_t aTime, int64_t* aOffset);
+
+ // Returns end offset of init segment or -1 if none found.
+ int64_t GetInitEndOffset();
+ // Returns the end offset of the last complete block or -1 if none found.
+ int64_t GetLastBlockOffset();
+
+ // Returns start time
+ bool GetStartTime(uint64_t *aTime);
+
+ // Returns keyframe for time
+ bool GetNextKeyframeTime(uint64_t aTime, uint64_t* aKeyframeTime);
+
+private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~WebMBufferedState() {
+ MOZ_COUNT_DTOR(WebMBufferedState);
+ }
+
+ // Synchronizes access to the mTimeMapping array and mLastBlockOffset.
+ ReentrantMonitor mReentrantMonitor;
+
+ // Sorted (by offset) map of data offsets to timecodes. Populated
+ // on the main thread as data is received and parsed by WebMBufferedParsers.
+ nsTArray<WebMTimeDataOffset> mTimeMapping;
+ // The last complete block parsed. -1 if not set.
+ int64_t mLastBlockOffset;
+
+ // Sorted (by offset) live parser instances. Main thread only.
+ nsTArray<WebMBufferedParser> mRangeParsers;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webm/WebMDecoder.cpp b/dom/media/webm/WebMDecoder.cpp
new file mode 100644
index 000000000..b41de6d40
--- /dev/null
+++ b/dom/media/webm/WebMDecoder.cpp
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/Preferences.h"
+#include "MediaDecoderStateMachine.h"
+#include "WebMDemuxer.h"
+#include "WebMDecoder.h"
+#include "VideoUtils.h"
+#include "nsContentTypeParser.h"
+
+namespace mozilla {
+
+MediaDecoderStateMachine* WebMDecoder::CreateStateMachine()
+{
+ mReader =
+ new MediaFormatReader(this, new WebMDemuxer(GetResource()), GetVideoFrameContainer());
+ return new MediaDecoderStateMachine(this, mReader);
+}
+
+/* static */
+bool
+WebMDecoder::IsEnabled()
+{
+ return Preferences::GetBool("media.webm.enabled");
+}
+
+/* static */
+bool
+WebMDecoder::CanHandleMediaType(const nsACString& aMIMETypeExcludingCodecs,
+ const nsAString& aCodecs)
+{
+ if (!IsEnabled()) {
+ return false;
+ }
+
+ const bool isWebMAudio = aMIMETypeExcludingCodecs.EqualsASCII("audio/webm");
+ const bool isWebMVideo = aMIMETypeExcludingCodecs.EqualsASCII("video/webm");
+ if (!isWebMAudio && !isWebMVideo) {
+ return false;
+ }
+
+ nsTArray<nsCString> codecMimes;
+ if (aCodecs.IsEmpty()) {
+ // WebM guarantees that the only codecs it contained are vp8, vp9, opus or vorbis.
+ return true;
+ }
+ // Verify that all the codecs specified are ones that we expect that
+ // we can play.
+ nsTArray<nsString> codecs;
+ if (!ParseCodecsString(aCodecs, codecs)) {
+ return false;
+ }
+ for (const nsString& codec : codecs) {
+ if (codec.EqualsLiteral("opus") || codec.EqualsLiteral("vorbis")) {
+ continue;
+ }
+ // Note: Only accept VP8/VP9 in a video content type, not in an audio
+ // content type.
+ if (isWebMVideo &&
+ (codec.EqualsLiteral("vp8") || codec.EqualsLiteral("vp8.0") ||
+ codec.EqualsLiteral("vp9") || codec.EqualsLiteral("vp9.0"))) {
+
+ continue;
+ }
+ // Some unsupported codec.
+ return false;
+ }
+ return true;
+}
+
+/* static */ bool
+WebMDecoder::CanHandleMediaType(const nsAString& aContentType)
+{
+ nsContentTypeParser parser(aContentType);
+ nsAutoString mimeType;
+ nsresult rv = parser.GetType(mimeType);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+ nsString codecs;
+ parser.GetParameter("codecs", codecs);
+
+ return CanHandleMediaType(NS_ConvertUTF16toUTF8(mimeType),
+ codecs);
+}
+
+void
+WebMDecoder::GetMozDebugReaderData(nsAString& aString)
+{
+ if (mReader) {
+ mReader->GetMozDebugReaderData(aString);
+ }
+}
+
+} // namespace mozilla
+
diff --git a/dom/media/webm/WebMDecoder.h b/dom/media/webm/WebMDecoder.h
new file mode 100644
index 000000000..0d6d747f6
--- /dev/null
+++ b/dom/media/webm/WebMDecoder.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(WebMDecoder_h_)
+#define WebMDecoder_h_
+
+#include "MediaDecoder.h"
+#include "MediaFormatReader.h"
+
+namespace mozilla {
+
+class WebMDecoder : public MediaDecoder
+{
+public:
+ explicit WebMDecoder(MediaDecoderOwner* aOwner) : MediaDecoder(aOwner) {}
+ MediaDecoder* Clone(MediaDecoderOwner* aOwner) override {
+ if (!IsWebMEnabled()) {
+ return nullptr;
+ }
+ return new WebMDecoder(aOwner);
+ }
+ MediaDecoderStateMachine* CreateStateMachine() override;
+
+ // Returns true if the WebM backend is preffed on.
+ static bool IsEnabled();
+
+ // Returns true if aMIMEType is a type that we think we can render with the
+ // a WebM platform decoder backend. If aCodecs is non emtpy, it is filled
+ // with a comma-delimited list of codecs to check support for. Notes in
+ // out params whether the codecs string contains Opus/Vorbis or VP8/VP9.
+ static bool CanHandleMediaType(const nsACString& aMIMETypeExcludingCodecs,
+ const nsAString& aCodecs);
+
+ static bool CanHandleMediaType(const nsAString& aContentType);
+
+ void GetMozDebugReaderData(nsAString& aString) override;
+
+private:
+ RefPtr<MediaFormatReader> mReader;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webm/WebMDemuxer.cpp b/dom/media/webm/WebMDemuxer.cpp
new file mode 100644
index 000000000..20ed71581
--- /dev/null
+++ b/dom/media/webm/WebMDemuxer.cpp
@@ -0,0 +1,1155 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsError.h"
+#include "MediaDecoderStateMachine.h"
+#include "AbstractMediaDecoder.h"
+#include "MediaResource.h"
+#include "OpusDecoder.h"
+#include "WebMDemuxer.h"
+#include "WebMBufferedParser.h"
+#include "gfx2DGlue.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/EndianUtils.h"
+#include "mozilla/SharedThreadPool.h"
+#include "MediaDataDemuxer.h"
+#include "nsAutoPtr.h"
+#include "nsAutoRef.h"
+#include "NesteggPacketHolder.h"
+#include "XiphExtradata.h"
+#include "prprf.h" // leaving it for PR_vsnprintf()
+#include "mozilla/Sprintf.h"
+
+#include <algorithm>
+#include <stdint.h>
+
+#define VPX_DONT_DEFINE_STDINT_TYPES
+#include "vpx/vp8dx.h"
+#include "vpx/vpx_decoder.h"
+
+#define WEBM_DEBUG(arg, ...) MOZ_LOG(gMediaDemuxerLog, mozilla::LogLevel::Debug, ("WebMDemuxer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
+extern mozilla::LazyLogModule gMediaDemuxerLog;
+
+namespace mozilla {
+
+using namespace gfx;
+
+LazyLogModule gNesteggLog("Nestegg");
+
+// How far ahead will we look when searching future keyframe. In microseconds.
+// This value is based on what appears to be a reasonable value as most webm
+// files encountered appear to have keyframes located < 4s.
+#define MAX_LOOK_AHEAD 10000000
+
+static Atomic<uint32_t> sStreamSourceID(0u);
+
+// Functions for reading and seeking using WebMDemuxer required for
+// nestegg_io. The 'user data' passed to these functions is the
+// demuxer.
+static int webmdemux_read(void* aBuffer, size_t aLength, void* aUserData)
+{
+ MOZ_ASSERT(aUserData);
+ MOZ_ASSERT(aLength < UINT32_MAX);
+ WebMDemuxer::NestEggContext* context =
+ reinterpret_cast<WebMDemuxer::NestEggContext*>(aUserData);
+ uint32_t count = aLength;
+ if (context->IsMediaSource()) {
+ int64_t length = context->GetEndDataOffset();
+ int64_t position = context->GetResource()->Tell();
+ MOZ_ASSERT(position <= context->GetResource()->GetLength());
+ MOZ_ASSERT(position <= length);
+ if (length >= 0 && count + position > length) {
+ count = length - position;
+ }
+ MOZ_ASSERT(count <= aLength);
+ }
+ uint32_t bytes = 0;
+ nsresult rv =
+ context->GetResource()->Read(static_cast<char*>(aBuffer), count, &bytes);
+ bool eof = bytes < aLength;
+ return NS_FAILED(rv) ? -1 : eof ? 0 : 1;
+}
+
+static int webmdemux_seek(int64_t aOffset, int aWhence, void* aUserData)
+{
+ MOZ_ASSERT(aUserData);
+ WebMDemuxer::NestEggContext* context = reinterpret_cast<WebMDemuxer::NestEggContext*>(aUserData);
+ nsresult rv = context->GetResource()->Seek(aWhence, aOffset);
+ return NS_SUCCEEDED(rv) ? 0 : -1;
+}
+
+static int64_t webmdemux_tell(void* aUserData)
+{
+ MOZ_ASSERT(aUserData);
+ WebMDemuxer::NestEggContext* context = reinterpret_cast<WebMDemuxer::NestEggContext*>(aUserData);
+ return context->GetResource()->Tell();
+}
+
+static void webmdemux_log(nestegg* aContext,
+ unsigned int aSeverity,
+ char const* aFormat, ...)
+{
+ if (!MOZ_LOG_TEST(gNesteggLog, LogLevel::Debug)) {
+ return;
+ }
+
+ va_list args;
+ char msg[256];
+ const char* sevStr;
+
+ switch(aSeverity) {
+ case NESTEGG_LOG_DEBUG:
+ sevStr = "DBG";
+ break;
+ case NESTEGG_LOG_INFO:
+ sevStr = "INF";
+ break;
+ case NESTEGG_LOG_WARNING:
+ sevStr = "WRN";
+ break;
+ case NESTEGG_LOG_ERROR:
+ sevStr = "ERR";
+ break;
+ case NESTEGG_LOG_CRITICAL:
+ sevStr = "CRT";
+ break;
+ default:
+ sevStr = "UNK";
+ break;
+ }
+
+ va_start(args, aFormat);
+
+ SprintfLiteral(msg, "%p [Nestegg-%s] ", aContext, sevStr);
+ PR_vsnprintf(msg+strlen(msg), sizeof(msg)-strlen(msg), aFormat, args);
+ MOZ_LOG(gNesteggLog, LogLevel::Debug, (msg));
+
+ va_end(args);
+}
+
+WebMDemuxer::NestEggContext::~NestEggContext()
+{
+ if (mContext) {
+ nestegg_destroy(mContext);
+ }
+}
+
+int
+WebMDemuxer::NestEggContext::Init()
+{
+ nestegg_io io;
+ io.read = webmdemux_read;
+ io.seek = webmdemux_seek;
+ io.tell = webmdemux_tell;
+ io.userdata = this;
+
+ // While reading the metadata, we do not really care about which nestegg
+ // context is being used so long that they are both initialised.
+ // For reading the metadata however, we will use mVideoContext.
+ return nestegg_init(&mContext, io, &webmdemux_log,
+ mParent->IsMediaSource() ? mResource.GetLength() : -1);
+}
+
+WebMDemuxer::WebMDemuxer(MediaResource* aResource)
+ : WebMDemuxer(aResource, false)
+{
+}
+
+WebMDemuxer::WebMDemuxer(MediaResource* aResource, bool aIsMediaSource)
+ : mVideoContext(this, aResource)
+ , mAudioContext(this, aResource)
+ , mBufferedState(nullptr)
+ , mInitData(nullptr)
+ , mVideoTrack(0)
+ , mAudioTrack(0)
+ , mSeekPreroll(0)
+ , mAudioCodec(-1)
+ , mVideoCodec(-1)
+ , mHasVideo(false)
+ , mHasAudio(false)
+ , mNeedReIndex(true)
+ , mLastWebMBlockOffset(-1)
+ , mIsMediaSource(aIsMediaSource)
+{
+}
+
+WebMDemuxer::~WebMDemuxer()
+{
+ Reset(TrackInfo::kVideoTrack);
+ Reset(TrackInfo::kAudioTrack);
+}
+
+RefPtr<WebMDemuxer::InitPromise>
+WebMDemuxer::Init()
+{
+ InitBufferedState();
+
+ if (NS_FAILED(ReadMetadata())) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ if (!GetNumberTracks(TrackInfo::kAudioTrack) &&
+ !GetNumberTracks(TrackInfo::kVideoTrack)) {
+ return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
+ }
+
+ return InitPromise::CreateAndResolve(NS_OK, __func__);
+}
+
+void
+WebMDemuxer::InitBufferedState()
+{
+ MOZ_ASSERT(!mBufferedState);
+ mBufferedState = new WebMBufferedState;
+}
+
+bool
+WebMDemuxer::HasTrackType(TrackInfo::TrackType aType) const
+{
+ return !!GetNumberTracks(aType);
+}
+
+uint32_t
+WebMDemuxer::GetNumberTracks(TrackInfo::TrackType aType) const
+{
+ switch(aType) {
+ case TrackInfo::kAudioTrack:
+ return mHasAudio ? 1 : 0;
+ case TrackInfo::kVideoTrack:
+ return mHasVideo ? 1 : 0;
+ default:
+ return 0;
+ }
+}
+
+UniquePtr<TrackInfo>
+WebMDemuxer::GetTrackInfo(TrackInfo::TrackType aType,
+ size_t aTrackNumber) const
+{
+ switch(aType) {
+ case TrackInfo::kAudioTrack:
+ return mInfo.mAudio.Clone();
+ case TrackInfo::kVideoTrack:
+ return mInfo.mVideo.Clone();
+ default:
+ return nullptr;
+ }
+}
+
+already_AddRefed<MediaTrackDemuxer>
+WebMDemuxer::GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber)
+{
+ if (GetNumberTracks(aType) <= aTrackNumber) {
+ return nullptr;
+ }
+ RefPtr<WebMTrackDemuxer> e =
+ new WebMTrackDemuxer(this, aType, aTrackNumber);
+ mDemuxers.AppendElement(e);
+
+ return e.forget();
+}
+
+nsresult
+WebMDemuxer::Reset(TrackInfo::TrackType aType)
+{
+ if (aType == TrackInfo::kVideoTrack) {
+ mVideoPackets.Reset();
+ } else {
+ mAudioPackets.Reset();
+ }
+ return NS_OK;
+}
+
+nsresult
+WebMDemuxer::ReadMetadata()
+{
+ int r = mVideoContext.Init();
+ if (r == -1) {
+ return NS_ERROR_FAILURE;
+ }
+ if (mAudioContext.Init() == -1) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // For reading the metadata we can only use the video resource/context.
+ MediaResourceIndex& resource = Resource(TrackInfo::kVideoTrack);
+ nestegg* context = Context(TrackInfo::kVideoTrack);
+
+ {
+ // Check how much data nestegg read and force feed it to BufferedState.
+ RefPtr<MediaByteBuffer> buffer = resource.MediaReadAt(0, resource.Tell());
+ if (!buffer) {
+ return NS_ERROR_FAILURE;
+ }
+ mBufferedState->NotifyDataArrived(buffer->Elements(), buffer->Length(), 0);
+ if (mBufferedState->GetInitEndOffset() < 0) {
+ return NS_ERROR_FAILURE;
+ }
+ MOZ_ASSERT(mBufferedState->GetInitEndOffset() <= resource.Tell());
+ }
+ mInitData = resource.MediaReadAt(0, mBufferedState->GetInitEndOffset());
+ if (!mInitData ||
+ mInitData->Length() != size_t(mBufferedState->GetInitEndOffset())) {
+ return NS_ERROR_FAILURE;
+ }
+
+ unsigned int ntracks = 0;
+ r = nestegg_track_count(context, &ntracks);
+ if (r == -1) {
+ return NS_ERROR_FAILURE;
+ }
+
+ for (unsigned int track = 0; track < ntracks; ++track) {
+ int id = nestegg_track_codec_id(context, track);
+ if (id == -1) {
+ return NS_ERROR_FAILURE;
+ }
+ int type = nestegg_track_type(context, track);
+ if (type == NESTEGG_TRACK_VIDEO && !mHasVideo) {
+ nestegg_video_params params;
+ r = nestegg_track_video_params(context, track, &params);
+ if (r == -1) {
+ return NS_ERROR_FAILURE;
+ }
+ mVideoCodec = nestegg_track_codec_id(context, track);
+ switch(mVideoCodec) {
+ case NESTEGG_CODEC_VP8:
+ mInfo.mVideo.mMimeType = "video/webm; codecs=vp8";
+ break;
+ case NESTEGG_CODEC_VP9:
+ mInfo.mVideo.mMimeType = "video/webm; codecs=vp9";
+ break;
+ default:
+ NS_WARNING("Unknown WebM video codec");
+ return NS_ERROR_FAILURE;
+ }
+ // Picture region, taking into account cropping, before scaling
+ // to the display size.
+ unsigned int cropH = params.crop_right + params.crop_left;
+ unsigned int cropV = params.crop_bottom + params.crop_top;
+ nsIntRect pictureRect(params.crop_left,
+ params.crop_top,
+ params.width - cropH,
+ params.height - cropV);
+
+ // If the cropping data appears invalid then use the frame data
+ if (pictureRect.width <= 0 ||
+ pictureRect.height <= 0 ||
+ pictureRect.x < 0 ||
+ pictureRect.y < 0) {
+ pictureRect.x = 0;
+ pictureRect.y = 0;
+ pictureRect.width = params.width;
+ pictureRect.height = params.height;
+ }
+
+ // Validate the container-reported frame and pictureRect sizes. This
+ // ensures that our video frame creation code doesn't overflow.
+ nsIntSize displaySize(params.display_width, params.display_height);
+ nsIntSize frameSize(params.width, params.height);
+ if (!IsValidVideoRegion(frameSize, pictureRect, displaySize)) {
+ // Video track's frame sizes will overflow. Ignore the video track.
+ continue;
+ }
+
+ mVideoTrack = track;
+ mHasVideo = true;
+
+ mInfo.mVideo.mDisplay = displaySize;
+ mInfo.mVideo.mImage = frameSize;
+ mInfo.mVideo.SetImageRect(pictureRect);
+
+ switch (params.stereo_mode) {
+ case NESTEGG_VIDEO_MONO:
+ mInfo.mVideo.mStereoMode = StereoMode::MONO;
+ break;
+ case NESTEGG_VIDEO_STEREO_LEFT_RIGHT:
+ mInfo.mVideo.mStereoMode = StereoMode::LEFT_RIGHT;
+ break;
+ case NESTEGG_VIDEO_STEREO_BOTTOM_TOP:
+ mInfo.mVideo.mStereoMode = StereoMode::BOTTOM_TOP;
+ break;
+ case NESTEGG_VIDEO_STEREO_TOP_BOTTOM:
+ mInfo.mVideo.mStereoMode = StereoMode::TOP_BOTTOM;
+ break;
+ case NESTEGG_VIDEO_STEREO_RIGHT_LEFT:
+ mInfo.mVideo.mStereoMode = StereoMode::RIGHT_LEFT;
+ break;
+ }
+ uint64_t duration = 0;
+ r = nestegg_duration(context, &duration);
+ if (!r) {
+ mInfo.mVideo.mDuration = media::TimeUnit::FromNanoseconds(duration).ToMicroseconds();
+ }
+ mInfo.mVideo.mCrypto = GetTrackCrypto(TrackInfo::kVideoTrack, track);
+ if (mInfo.mVideo.mCrypto.mValid) {
+ mCrypto.AddInitData(NS_LITERAL_STRING("webm"), mInfo.mVideo.mCrypto.mKeyId);
+ }
+ } else if (type == NESTEGG_TRACK_AUDIO && !mHasAudio) {
+ nestegg_audio_params params;
+ r = nestegg_track_audio_params(context, track, &params);
+ if (r == -1) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mAudioTrack = track;
+ mHasAudio = true;
+ mAudioCodec = nestegg_track_codec_id(context, track);
+ if (mAudioCodec == NESTEGG_CODEC_VORBIS) {
+ mInfo.mAudio.mMimeType = "audio/vorbis";
+ } else if (mAudioCodec == NESTEGG_CODEC_OPUS) {
+ mInfo.mAudio.mMimeType = "audio/opus";
+ OpusDataDecoder::AppendCodecDelay(mInfo.mAudio.mCodecSpecificConfig,
+ media::TimeUnit::FromNanoseconds(params.codec_delay).ToMicroseconds());
+ }
+ mSeekPreroll = params.seek_preroll;
+ mInfo.mAudio.mRate = params.rate;
+ mInfo.mAudio.mChannels = params.channels;
+
+ unsigned int nheaders = 0;
+ r = nestegg_track_codec_data_count(context, track, &nheaders);
+ if (r == -1) {
+ return NS_ERROR_FAILURE;
+ }
+
+ AutoTArray<const unsigned char*,4> headers;
+ AutoTArray<size_t,4> headerLens;
+ for (uint32_t header = 0; header < nheaders; ++header) {
+ unsigned char* data = 0;
+ size_t length = 0;
+ r = nestegg_track_codec_data(context, track, header, &data, &length);
+ if (r == -1) {
+ return NS_ERROR_FAILURE;
+ }
+ headers.AppendElement(data);
+ headerLens.AppendElement(length);
+ }
+
+ // Vorbis has 3 headers, convert to Xiph extradata format to send them to
+ // the demuxer.
+ // TODO: This is already the format WebM stores them in. Would be nice
+ // to avoid having libnestegg split them only for us to pack them again,
+ // but libnestegg does not give us an API to access this data directly.
+ if (nheaders > 1) {
+ if (!XiphHeadersToExtradata(mInfo.mAudio.mCodecSpecificConfig,
+ headers, headerLens)) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+ else {
+ mInfo.mAudio.mCodecSpecificConfig->AppendElements(headers[0],
+ headerLens[0]);
+ }
+ uint64_t duration = 0;
+ r = nestegg_duration(context, &duration);
+ if (!r) {
+ mInfo.mAudio.mDuration = media::TimeUnit::FromNanoseconds(duration).ToMicroseconds();
+ }
+ mInfo.mAudio.mCrypto = GetTrackCrypto(TrackInfo::kAudioTrack, track);
+ if (mInfo.mAudio.mCrypto.mValid) {
+ mCrypto.AddInitData(NS_LITERAL_STRING("webm"), mInfo.mAudio.mCrypto.mKeyId);
+ }
+ }
+ }
+ return NS_OK;
+}
+
+bool
+WebMDemuxer::IsSeekable() const
+{
+ return Context(TrackInfo::kVideoTrack) &&
+ nestegg_has_cues(Context(TrackInfo::kVideoTrack));
+}
+
+bool
+WebMDemuxer::IsSeekableOnlyInBufferedRanges() const
+{
+ return Context(TrackInfo::kVideoTrack) &&
+ !nestegg_has_cues(Context(TrackInfo::kVideoTrack));
+}
+
+void
+WebMDemuxer::EnsureUpToDateIndex()
+{
+ if (!mNeedReIndex || !mInitData) {
+ return;
+ }
+ AutoPinned<MediaResource> resource(
+ Resource(TrackInfo::kVideoTrack).GetResource());
+ MediaByteRangeSet byteRanges;
+ nsresult rv = resource->GetCachedRanges(byteRanges);
+ if (NS_FAILED(rv) || !byteRanges.Length()) {
+ return;
+ }
+ mBufferedState->UpdateIndex(byteRanges, resource);
+
+ mNeedReIndex = false;
+
+ if (!mIsMediaSource) {
+ return;
+ }
+ mLastWebMBlockOffset = mBufferedState->GetLastBlockOffset();
+ MOZ_ASSERT(mLastWebMBlockOffset <= resource->GetLength());
+}
+
+void
+WebMDemuxer::NotifyDataArrived()
+{
+ WEBM_DEBUG("");
+ mNeedReIndex = true;
+}
+
+void
+WebMDemuxer::NotifyDataRemoved()
+{
+ mBufferedState->Reset();
+ if (mInitData) {
+ mBufferedState->NotifyDataArrived(mInitData->Elements(), mInitData->Length(), 0);
+ }
+ mNeedReIndex = true;
+}
+
+UniquePtr<EncryptionInfo>
+WebMDemuxer::GetCrypto()
+{
+ return mCrypto.IsEncrypted() ? MakeUnique<EncryptionInfo>(mCrypto) : nullptr;
+}
+
+CryptoTrack
+WebMDemuxer::GetTrackCrypto(TrackInfo::TrackType aType, size_t aTrackNumber) {
+ const int WEBM_IV_SIZE = 16;
+ const unsigned char * contentEncKeyId;
+ size_t contentEncKeyIdLength;
+ CryptoTrack crypto;
+ nestegg* context = Context(aType);
+
+ int r = nestegg_track_content_enc_key_id(context, aTrackNumber, &contentEncKeyId, &contentEncKeyIdLength);
+
+ if (r == -1) {
+ WEBM_DEBUG("nestegg_track_content_enc_key_id failed r=%d", r);
+ return crypto;
+ }
+
+ uint32_t i;
+ nsTArray<uint8_t> initData;
+ for (i = 0; i < contentEncKeyIdLength; i++) {
+ initData.AppendElement(contentEncKeyId[i]);
+ }
+
+ if (!initData.IsEmpty()) {
+ crypto.mValid = true;
+ // crypto.mMode is not used for WebMs
+ crypto.mIVSize = WEBM_IV_SIZE;
+ crypto.mKeyId = Move(initData);
+ }
+
+ return crypto;
+}
+
+bool
+WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, MediaRawDataQueue *aSamples)
+{
+ if (mIsMediaSource) {
+ // To ensure mLastWebMBlockOffset is properly up to date.
+ EnsureUpToDateIndex();
+ }
+
+ RefPtr<NesteggPacketHolder> holder(NextPacket(aType));
+
+ if (!holder) {
+ return false;
+ }
+
+ int r = 0;
+ unsigned int count = 0;
+ r = nestegg_packet_count(holder->Packet(), &count);
+ if (r == -1) {
+ return false;
+ }
+ int64_t tstamp = holder->Timestamp();
+ int64_t duration = holder->Duration();
+
+ // The end time of this frame is the start time of the next frame. Fetch
+ // the timestamp of the next packet for this track. If we've reached the
+ // end of the resource, use the file's duration as the end time of this
+ // video frame.
+ int64_t next_tstamp = INT64_MIN;
+ if (aType == TrackInfo::kAudioTrack) {
+ RefPtr<NesteggPacketHolder> next_holder(NextPacket(aType));
+ if (next_holder) {
+ next_tstamp = next_holder->Timestamp();
+ PushAudioPacket(next_holder);
+ } else if (duration >= 0) {
+ next_tstamp = tstamp + duration;
+ } else if (!mIsMediaSource ||
+ (mIsMediaSource && mLastAudioFrameTime.isSome())) {
+ next_tstamp = tstamp;
+ next_tstamp += tstamp - mLastAudioFrameTime.refOr(0);
+ } else {
+ PushAudioPacket(holder);
+ }
+ mLastAudioFrameTime = Some(tstamp);
+ } else if (aType == TrackInfo::kVideoTrack) {
+ RefPtr<NesteggPacketHolder> next_holder(NextPacket(aType));
+ if (next_holder) {
+ next_tstamp = next_holder->Timestamp();
+ PushVideoPacket(next_holder);
+ } else if (duration >= 0) {
+ next_tstamp = tstamp + duration;
+ } else if (!mIsMediaSource ||
+ (mIsMediaSource && mLastVideoFrameTime.isSome())) {
+ next_tstamp = tstamp;
+ next_tstamp += tstamp - mLastVideoFrameTime.refOr(0);
+ } else {
+ PushVideoPacket(holder);
+ }
+ mLastVideoFrameTime = Some(tstamp);
+ }
+
+ if (mIsMediaSource && next_tstamp == INT64_MIN) {
+ return false;
+ }
+
+ int64_t discardPadding = 0;
+ if (aType == TrackInfo::kAudioTrack) {
+ (void) nestegg_packet_discard_padding(holder->Packet(), &discardPadding);
+ }
+
+ int packetEncryption = nestegg_packet_encryption(holder->Packet());
+
+ for (uint32_t i = 0; i < count; ++i) {
+ unsigned char* data;
+ size_t length;
+ r = nestegg_packet_data(holder->Packet(), i, &data, &length);
+ if (r == -1) {
+ WEBM_DEBUG("nestegg_packet_data failed r=%d", r);
+ return false;
+ }
+ bool isKeyframe = false;
+ if (aType == TrackInfo::kAudioTrack) {
+ isKeyframe = true;
+ } else if (aType == TrackInfo::kVideoTrack) {
+ if (packetEncryption == NESTEGG_PACKET_HAS_SIGNAL_BYTE_ENCRYPTED) {
+ // Packet is encrypted, can't peek, use packet info
+ isKeyframe = nestegg_packet_has_keyframe(holder->Packet()) == NESTEGG_PACKET_HAS_KEYFRAME_TRUE;
+ } else {
+ vpx_codec_stream_info_t si;
+ PodZero(&si);
+ si.sz = sizeof(si);
+ switch (mVideoCodec) {
+ case NESTEGG_CODEC_VP8:
+ vpx_codec_peek_stream_info(vpx_codec_vp8_dx(), data, length, &si);
+ break;
+ case NESTEGG_CODEC_VP9:
+ vpx_codec_peek_stream_info(vpx_codec_vp9_dx(), data, length, &si);
+ break;
+ }
+ isKeyframe = si.is_kf;
+ if (isKeyframe) {
+ // We only look for resolution changes on keyframes for both VP8 and
+ // VP9. Other resolution changes are invalid.
+ if (mLastSeenFrameWidth.isSome() && mLastSeenFrameHeight.isSome() &&
+ (si.w != mLastSeenFrameWidth.value() ||
+ si.h != mLastSeenFrameHeight.value())) {
+ mInfo.mVideo.mDisplay = nsIntSize(si.w, si.h);
+ mSharedVideoTrackInfo = new SharedTrackInfo(mInfo.mVideo, ++sStreamSourceID);
+ }
+ mLastSeenFrameWidth = Some(si.w);
+ mLastSeenFrameHeight = Some(si.h);
+ }
+ }
+ }
+
+ WEBM_DEBUG("push sample tstamp: %ld next_tstamp: %ld length: %ld kf: %d",
+ tstamp, next_tstamp, length, isKeyframe);
+ RefPtr<MediaRawData> sample = new MediaRawData(data, length);
+ if (length && !sample->Data()) {
+ // OOM.
+ return false;
+ }
+ sample->mTimecode = tstamp;
+ sample->mTime = tstamp;
+ sample->mDuration = next_tstamp - tstamp;
+ sample->mOffset = holder->Offset();
+ sample->mKeyframe = isKeyframe;
+ if (discardPadding && i == count - 1) {
+ CheckedInt64 discardFrames;
+ if (discardPadding < 0) {
+ // This is an invalid value as discard padding should never be negative.
+ // Set to maximum value so that the decoder will reject it as it's
+ // greater than the number of frames available.
+ discardFrames = INT32_MAX;
+ WEBM_DEBUG("Invalid negative discard padding");
+ } else {
+ discardFrames = TimeUnitToFrames(
+ media::TimeUnit::FromNanoseconds(discardPadding), mInfo.mAudio.mRate);
+ }
+ if (discardFrames.isValid()) {
+ sample->mDiscardPadding = discardFrames.value();
+ }
+ }
+
+ if (packetEncryption == NESTEGG_PACKET_HAS_SIGNAL_BYTE_UNENCRYPTED ||
+ packetEncryption == NESTEGG_PACKET_HAS_SIGNAL_BYTE_ENCRYPTED) {
+ nsAutoPtr<MediaRawDataWriter> writer(sample->CreateWriter());
+ unsigned char const* iv;
+ size_t ivLength;
+ nestegg_packet_iv(holder->Packet(), &iv, &ivLength);
+ writer->mCrypto.mValid = true;
+ writer->mCrypto.mIVSize = ivLength;
+ if (ivLength == 0) {
+ // Frame is not encrypted
+ writer->mCrypto.mPlainSizes.AppendElement(length);
+ writer->mCrypto.mEncryptedSizes.AppendElement(0);
+ } else {
+ // Frame is encrypted
+ writer->mCrypto.mIV.AppendElements(iv, 8);
+ // Iv from a sample is 64 bits, must be padded with 64 bits more 0s
+ // in compliance with spec
+ for (uint32_t i = 0; i < 8; i++) {
+ writer->mCrypto.mIV.AppendElement(0);
+ }
+ writer->mCrypto.mPlainSizes.AppendElement(0);
+ writer->mCrypto.mEncryptedSizes.AppendElement(length);
+ }
+ }
+ if (aType == TrackInfo::kVideoTrack) {
+ sample->mTrackInfo = mSharedVideoTrackInfo;
+ }
+ aSamples->Push(sample);
+ }
+ return true;
+}
+
+RefPtr<NesteggPacketHolder>
+WebMDemuxer::NextPacket(TrackInfo::TrackType aType)
+{
+ bool isVideo = aType == TrackInfo::kVideoTrack;
+
+ // Flag to indicate that we do need to playback these types of
+ // packets.
+ bool hasType = isVideo ? mHasVideo : mHasAudio;
+
+ if (!hasType) {
+ return nullptr;
+ }
+
+ // The packet queue for the type that we are interested in.
+ WebMPacketQueue &packets = isVideo ? mVideoPackets : mAudioPackets;
+
+ if (packets.GetSize() > 0) {
+ return packets.PopFront();
+ }
+
+ // Track we are interested in
+ uint32_t ourTrack = isVideo ? mVideoTrack : mAudioTrack;
+
+ do {
+ RefPtr<NesteggPacketHolder> holder = DemuxPacket(aType);
+ if (!holder) {
+ return nullptr;
+ }
+
+ if (ourTrack == holder->Track()) {
+ return holder;
+ }
+ } while (true);
+}
+
+RefPtr<NesteggPacketHolder>
+WebMDemuxer::DemuxPacket(TrackInfo::TrackType aType)
+{
+ nestegg_packet* packet;
+ int r = nestegg_read_packet(Context(aType), &packet);
+ if (r == 0) {
+ nestegg_read_reset(Context(aType));
+ return nullptr;
+ } else if (r < 0) {
+ return nullptr;
+ }
+
+ unsigned int track = 0;
+ r = nestegg_packet_track(packet, &track);
+ if (r == -1) {
+ return nullptr;
+ }
+
+ int64_t offset = Resource(aType).Tell();
+ RefPtr<NesteggPacketHolder> holder = new NesteggPacketHolder();
+ if (!holder->Init(packet, offset, track, false)) {
+ return nullptr;
+ }
+
+ return holder;
+}
+
+void
+WebMDemuxer::PushAudioPacket(NesteggPacketHolder* aItem)
+{
+ mAudioPackets.PushFront(aItem);
+}
+
+void
+WebMDemuxer::PushVideoPacket(NesteggPacketHolder* aItem)
+{
+ mVideoPackets.PushFront(aItem);
+}
+
+nsresult
+WebMDemuxer::SeekInternal(TrackInfo::TrackType aType,
+ const media::TimeUnit& aTarget)
+{
+ EnsureUpToDateIndex();
+ uint32_t trackToSeek = mHasVideo ? mVideoTrack : mAudioTrack;
+ uint64_t target = aTarget.ToNanoseconds();
+
+ if (NS_FAILED(Reset(aType))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (mSeekPreroll) {
+ uint64_t startTime = 0;
+ if (!mBufferedState->GetStartTime(&startTime)) {
+ startTime = 0;
+ }
+ WEBM_DEBUG("Seek Target: %f",
+ media::TimeUnit::FromNanoseconds(target).ToSeconds());
+ if (target < mSeekPreroll || target - mSeekPreroll < startTime) {
+ target = startTime;
+ } else {
+ target -= mSeekPreroll;
+ }
+ WEBM_DEBUG("SeekPreroll: %f StartTime: %f Adjusted Target: %f",
+ media::TimeUnit::FromNanoseconds(mSeekPreroll).ToSeconds(),
+ media::TimeUnit::FromNanoseconds(startTime).ToSeconds(),
+ media::TimeUnit::FromNanoseconds(target).ToSeconds());
+ }
+ int r = nestegg_track_seek(Context(aType), trackToSeek, target);
+ if (r == -1) {
+ WEBM_DEBUG("track_seek for track %u to %f failed, r=%d", trackToSeek,
+ media::TimeUnit::FromNanoseconds(target).ToSeconds(), r);
+ // Try seeking directly based on cluster information in memory.
+ int64_t offset = 0;
+ bool rv = mBufferedState->GetOffsetForTime(target, &offset);
+ if (!rv) {
+ WEBM_DEBUG("mBufferedState->GetOffsetForTime failed too");
+ return NS_ERROR_FAILURE;
+ }
+
+ r = nestegg_offset_seek(Context(aType), offset);
+ if (r == -1) {
+ WEBM_DEBUG("and nestegg_offset_seek to %" PRIu64 " failed", offset);
+ return NS_ERROR_FAILURE;
+ }
+ WEBM_DEBUG("got offset from buffered state: %" PRIu64 "", offset);
+ }
+
+ if (aType == TrackInfo::kAudioTrack) {
+ mLastAudioFrameTime.reset();
+ } else {
+ mLastVideoFrameTime.reset();
+ }
+
+ return NS_OK;
+}
+
+media::TimeIntervals
+WebMDemuxer::GetBuffered()
+{
+ EnsureUpToDateIndex();
+ AutoPinned<MediaResource> resource(
+ Resource(TrackInfo::kVideoTrack).GetResource());
+
+ media::TimeIntervals buffered;
+
+ MediaByteRangeSet ranges;
+ nsresult rv = resource->GetCachedRanges(ranges);
+ if (NS_FAILED(rv)) {
+ return media::TimeIntervals();
+ }
+ uint64_t duration = 0;
+ uint64_t startOffset = 0;
+ if (!nestegg_duration(Context(TrackInfo::kVideoTrack), &duration)) {
+ if(mBufferedState->GetStartTime(&startOffset)) {
+ duration += startOffset;
+ }
+ WEBM_DEBUG("Duration: %f StartTime: %f",
+ media::TimeUnit::FromNanoseconds(duration).ToSeconds(),
+ media::TimeUnit::FromNanoseconds(startOffset).ToSeconds());
+ }
+ for (uint32_t index = 0; index < ranges.Length(); index++) {
+ uint64_t start, end;
+ bool rv = mBufferedState->CalculateBufferedForRange(ranges[index].mStart,
+ ranges[index].mEnd,
+ &start, &end);
+ if (rv) {
+ NS_ASSERTION(startOffset <= start,
+ "startOffset negative or larger than start time");
+
+ if (duration && end > duration) {
+ WEBM_DEBUG("limit range to duration, end: %f duration: %f",
+ media::TimeUnit::FromNanoseconds(end).ToSeconds(),
+ media::TimeUnit::FromNanoseconds(duration).ToSeconds());
+ end = duration;
+ }
+ media::TimeUnit startTime = media::TimeUnit::FromNanoseconds(start);
+ media::TimeUnit endTime = media::TimeUnit::FromNanoseconds(end);
+ WEBM_DEBUG("add range %f-%f", startTime.ToSeconds(), endTime.ToSeconds());
+ buffered += media::TimeInterval(startTime, endTime);
+ }
+ }
+ return buffered;
+}
+
+bool WebMDemuxer::GetOffsetForTime(uint64_t aTime, int64_t* aOffset)
+{
+ EnsureUpToDateIndex();
+ return mBufferedState && mBufferedState->GetOffsetForTime(aTime, aOffset);
+}
+
+
+//WebMTrackDemuxer
+WebMTrackDemuxer::WebMTrackDemuxer(WebMDemuxer* aParent,
+ TrackInfo::TrackType aType,
+ uint32_t aTrackNumber)
+ : mParent(aParent)
+ , mType(aType)
+ , mNeedKeyframe(true)
+{
+ mInfo = mParent->GetTrackInfo(aType, aTrackNumber);
+ MOZ_ASSERT(mInfo);
+}
+
+WebMTrackDemuxer::~WebMTrackDemuxer()
+{
+ mSamples.Reset();
+}
+
+UniquePtr<TrackInfo>
+WebMTrackDemuxer::GetInfo() const
+{
+ return mInfo->Clone();
+}
+
+RefPtr<WebMTrackDemuxer::SeekPromise>
+WebMTrackDemuxer::Seek(media::TimeUnit aTime)
+{
+ // Seeks to aTime. Upon success, SeekPromise will be resolved with the
+ // actual time seeked to. Typically the random access point time
+
+ media::TimeUnit seekTime = aTime;
+ mSamples.Reset();
+ mParent->SeekInternal(mType, aTime);
+ mParent->GetNextPacket(mType, &mSamples);
+ mNeedKeyframe = true;
+
+ // Check what time we actually seeked to.
+ if (mSamples.GetSize() > 0) {
+ const RefPtr<MediaRawData>& sample = mSamples.First();
+ seekTime = media::TimeUnit::FromMicroseconds(sample->mTime);
+ }
+ SetNextKeyFrameTime();
+
+ return SeekPromise::CreateAndResolve(seekTime, __func__);
+}
+
+RefPtr<MediaRawData>
+WebMTrackDemuxer::NextSample()
+{
+ while (mSamples.GetSize() < 1 && mParent->GetNextPacket(mType, &mSamples)) {
+ }
+ if (mSamples.GetSize()) {
+ return mSamples.PopFront();
+ }
+ return nullptr;
+}
+
+RefPtr<WebMTrackDemuxer::SamplesPromise>
+WebMTrackDemuxer::GetSamples(int32_t aNumSamples)
+{
+ RefPtr<SamplesHolder> samples = new SamplesHolder;
+ MOZ_ASSERT(aNumSamples);
+
+ while (aNumSamples) {
+ RefPtr<MediaRawData> sample(NextSample());
+ if (!sample) {
+ break;
+ }
+ if (mNeedKeyframe && !sample->mKeyframe) {
+ continue;
+ }
+ mNeedKeyframe = false;
+ samples->mSamples.AppendElement(sample);
+ aNumSamples--;
+ }
+
+ if (samples->mSamples.IsEmpty()) {
+ return SamplesPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
+ } else {
+ UpdateSamples(samples->mSamples);
+ return SamplesPromise::CreateAndResolve(samples, __func__);
+ }
+}
+
+void
+WebMTrackDemuxer::SetNextKeyFrameTime()
+{
+ if (mType != TrackInfo::kVideoTrack || mParent->IsMediaSource()) {
+ return;
+ }
+
+ int64_t frameTime = -1;
+
+ mNextKeyframeTime.reset();
+
+ MediaRawDataQueue skipSamplesQueue;
+ bool foundKeyframe = false;
+ while (!foundKeyframe && mSamples.GetSize()) {
+ RefPtr<MediaRawData> sample = mSamples.PopFront();
+ if (sample->mKeyframe) {
+ frameTime = sample->mTime;
+ foundKeyframe = true;
+ }
+ skipSamplesQueue.Push(sample.forget());
+ }
+ Maybe<int64_t> startTime;
+ if (skipSamplesQueue.GetSize()) {
+ const RefPtr<MediaRawData>& sample = skipSamplesQueue.First();
+ startTime.emplace(sample->mTimecode);
+ }
+ // Demux and buffer frames until we find a keyframe.
+ RefPtr<MediaRawData> sample;
+ while (!foundKeyframe && (sample = NextSample())) {
+ if (sample->mKeyframe) {
+ frameTime = sample->mTime;
+ foundKeyframe = true;
+ }
+ int64_t sampleTimecode = sample->mTimecode;
+ skipSamplesQueue.Push(sample.forget());
+ if (!startTime) {
+ startTime.emplace(sampleTimecode);
+ } else if (!foundKeyframe &&
+ sampleTimecode > startTime.ref() + MAX_LOOK_AHEAD) {
+ WEBM_DEBUG("Couldn't find keyframe in a reasonable time, aborting");
+ break;
+ }
+ }
+ // We may have demuxed more than intended, so ensure that all frames are kept
+ // in the right order.
+ mSamples.PushFront(Move(skipSamplesQueue));
+
+ if (frameTime != -1) {
+ mNextKeyframeTime.emplace(media::TimeUnit::FromMicroseconds(frameTime));
+ WEBM_DEBUG("Next Keyframe %f (%u queued %.02fs)",
+ mNextKeyframeTime.value().ToSeconds(),
+ uint32_t(mSamples.GetSize()),
+ media::TimeUnit::FromMicroseconds(mSamples.Last()->mTimecode - mSamples.First()->mTimecode).ToSeconds());
+ } else {
+ WEBM_DEBUG("Couldn't determine next keyframe time (%u queued)",
+ uint32_t(mSamples.GetSize()));
+ }
+}
+
+void
+WebMTrackDemuxer::Reset()
+{
+ mSamples.Reset();
+ media::TimeIntervals buffered = GetBuffered();
+ mNeedKeyframe = true;
+ if (buffered.Length()) {
+ WEBM_DEBUG("Seek to start point: %f", buffered.Start(0).ToSeconds());
+ mParent->SeekInternal(mType, buffered.Start(0));
+ SetNextKeyFrameTime();
+ } else {
+ mNextKeyframeTime.reset();
+ }
+}
+
+void
+WebMTrackDemuxer::UpdateSamples(nsTArray<RefPtr<MediaRawData>>& aSamples)
+{
+ for (const auto& sample : aSamples) {
+ if (sample->mCrypto.mValid) {
+ nsAutoPtr<MediaRawDataWriter> writer(sample->CreateWriter());
+ writer->mCrypto.mMode = mInfo->mCrypto.mMode;
+ writer->mCrypto.mIVSize = mInfo->mCrypto.mIVSize;
+ writer->mCrypto.mKeyId.AppendElements(mInfo->mCrypto.mKeyId);
+ }
+ }
+ if (mNextKeyframeTime.isNothing() ||
+ aSamples.LastElement()->mTime >= mNextKeyframeTime.value().ToMicroseconds()) {
+ SetNextKeyFrameTime();
+ }
+}
+
+nsresult
+WebMTrackDemuxer::GetNextRandomAccessPoint(media::TimeUnit* aTime)
+{
+ if (mNextKeyframeTime.isNothing()) {
+ // There's no next key frame.
+ *aTime =
+ media::TimeUnit::FromMicroseconds(std::numeric_limits<int64_t>::max());
+ } else {
+ *aTime = mNextKeyframeTime.ref();
+ }
+ return NS_OK;
+}
+
+RefPtr<WebMTrackDemuxer::SkipAccessPointPromise>
+WebMTrackDemuxer::SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold)
+{
+ uint32_t parsed = 0;
+ bool found = false;
+ RefPtr<MediaRawData> sample;
+ int64_t sampleTime;
+
+ WEBM_DEBUG("TimeThreshold: %f", aTimeThreshold.ToSeconds());
+ while (!found && (sample = NextSample())) {
+ parsed++;
+ sampleTime = sample->mTime;
+ if (sample->mKeyframe && sampleTime >= aTimeThreshold.ToMicroseconds()) {
+ found = true;
+ mSamples.Reset();
+ mSamples.PushFront(sample.forget());
+ }
+ }
+ SetNextKeyFrameTime();
+ if (found) {
+ WEBM_DEBUG("next sample: %f (parsed: %d)",
+ media::TimeUnit::FromMicroseconds(sampleTime).ToSeconds(),
+ parsed);
+ return SkipAccessPointPromise::CreateAndResolve(parsed, __func__);
+ } else {
+ SkipFailureHolder failure(NS_ERROR_DOM_MEDIA_END_OF_STREAM, parsed);
+ return SkipAccessPointPromise::CreateAndReject(Move(failure), __func__);
+ }
+}
+
+media::TimeIntervals
+WebMTrackDemuxer::GetBuffered()
+{
+ return mParent->GetBuffered();
+}
+
+void
+WebMTrackDemuxer::BreakCycles()
+{
+ mParent = nullptr;
+}
+
+int64_t
+WebMTrackDemuxer::GetEvictionOffset(const media::TimeUnit& aTime)
+{
+ int64_t offset;
+ if (!mParent->GetOffsetForTime(aTime.ToNanoseconds(), &offset)) {
+ return 0;
+ }
+
+ return offset;
+}
+
+#undef WEBM_DEBUG
+} // namespace mozilla
diff --git a/dom/media/webm/WebMDemuxer.h b/dom/media/webm/WebMDemuxer.h
new file mode 100644
index 000000000..6fff38e7d
--- /dev/null
+++ b/dom/media/webm/WebMDemuxer.h
@@ -0,0 +1,292 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#if !defined(WebMDemuxer_h_)
+#define WebMDemuxer_h_
+
+#include "nsTArray.h"
+#include "MediaDataDemuxer.h"
+#include "NesteggPacketHolder.h"
+#include "mozilla/Move.h"
+
+typedef struct nestegg nestegg;
+
+namespace mozilla {
+
+class WebMBufferedState;
+
+// Queue for holding MediaRawData samples
+class MediaRawDataQueue {
+ public:
+ uint32_t GetSize() {
+ return mQueue.size();
+ }
+
+ void Push(MediaRawData* aItem) {
+ mQueue.push_back(aItem);
+ }
+
+ void Push(already_AddRefed<MediaRawData>&& aItem) {
+ mQueue.push_back(Move(aItem));
+ }
+
+ void PushFront(MediaRawData* aItem) {
+ mQueue.push_front(aItem);
+ }
+
+ void PushFront(already_AddRefed<MediaRawData>&& aItem) {
+ mQueue.push_front(Move(aItem));
+ }
+
+ void PushFront(MediaRawDataQueue&& aOther) {
+ while (!aOther.mQueue.empty()) {
+ PushFront(aOther.Pop());
+ }
+ }
+
+ already_AddRefed<MediaRawData> PopFront() {
+ RefPtr<MediaRawData> result = mQueue.front().forget();
+ mQueue.pop_front();
+ return result.forget();
+ }
+
+ already_AddRefed<MediaRawData> Pop() {
+ RefPtr<MediaRawData> result = mQueue.back().forget();
+ mQueue.pop_back();
+ return result.forget();
+ }
+
+ void Reset() {
+ while (!mQueue.empty()) {
+ mQueue.pop_front();
+ }
+ }
+
+ MediaRawDataQueue& operator=(const MediaRawDataQueue& aOther) {
+ mQueue = aOther.mQueue;
+ return *this;
+ }
+
+ const RefPtr<MediaRawData>& First() const {
+ return mQueue.front();
+ }
+
+ const RefPtr<MediaRawData>& Last() const {
+ return mQueue.back();
+ }
+
+private:
+ std::deque<RefPtr<MediaRawData>> mQueue;
+};
+
+class WebMTrackDemuxer;
+
+class WebMDemuxer : public MediaDataDemuxer
+{
+public:
+ explicit WebMDemuxer(MediaResource* aResource);
+ // Indicate if the WebMDemuxer is to be used with MediaSource. In which
+ // case the demuxer will stop reads to the last known complete block.
+ WebMDemuxer(MediaResource* aResource, bool aIsMediaSource);
+
+ RefPtr<InitPromise> Init() override;
+
+ bool HasTrackType(TrackInfo::TrackType aType) const override;
+
+ uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
+
+ UniquePtr<TrackInfo> GetTrackInfo(TrackInfo::TrackType aType, size_t aTrackNumber) const;
+
+ already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer(TrackInfo::TrackType aType,
+ uint32_t aTrackNumber) override;
+
+ bool IsSeekable() const override;
+
+ bool IsSeekableOnlyInBufferedRanges() const override;
+
+ UniquePtr<EncryptionInfo> GetCrypto() override;
+
+ bool GetOffsetForTime(uint64_t aTime, int64_t* aOffset);
+
+ // Demux next WebM packet and append samples to MediaRawDataQueue
+ bool GetNextPacket(TrackInfo::TrackType aType, MediaRawDataQueue *aSamples);
+
+ nsresult Reset(TrackInfo::TrackType aType);
+
+ // Pushes a packet to the front of the audio packet queue.
+ void PushAudioPacket(NesteggPacketHolder* aItem);
+
+ // Pushes a packet to the front of the video packet queue.
+ void PushVideoPacket(NesteggPacketHolder* aItem);
+
+ // Public accessor for nestegg callbacks
+ bool IsMediaSource() const
+ {
+ return mIsMediaSource;
+ }
+
+ int64_t LastWebMBlockOffset() const
+ {
+ return mLastWebMBlockOffset;
+ }
+
+ struct NestEggContext {
+ NestEggContext(WebMDemuxer* aParent, MediaResource* aResource)
+ : mParent(aParent)
+ , mResource(aResource)
+ , mContext(nullptr) {}
+
+ ~NestEggContext();
+
+ int Init();
+
+ // Public accessor for nestegg callbacks
+
+ bool IsMediaSource() const { return mParent->IsMediaSource(); }
+ MediaResourceIndex* GetResource() { return &mResource; }
+
+ int64_t GetEndDataOffset() const
+ {
+ return (!mParent->IsMediaSource() || mParent->LastWebMBlockOffset() < 0)
+ ? mResource.GetLength() : mParent->LastWebMBlockOffset();
+ }
+
+ WebMDemuxer* mParent;
+ MediaResourceIndex mResource;
+ nestegg* mContext;
+ };
+
+private:
+ friend class WebMTrackDemuxer;
+
+ ~WebMDemuxer();
+ void InitBufferedState();
+ nsresult ReadMetadata();
+ void NotifyDataArrived() override;
+ void NotifyDataRemoved() override;
+ void EnsureUpToDateIndex();
+ media::TimeIntervals GetBuffered();
+ nsresult SeekInternal(TrackInfo::TrackType aType,
+ const media::TimeUnit& aTarget);
+ CryptoTrack GetTrackCrypto(TrackInfo::TrackType aType, size_t aTrackNumber);
+
+ // Read a packet from the nestegg file. Returns nullptr if all packets for
+ // the particular track have been read. Pass TrackInfo::kVideoTrack or
+ // TrackInfo::kVideoTrack to indicate the type of the packet we want to read.
+ RefPtr<NesteggPacketHolder> NextPacket(TrackInfo::TrackType aType);
+
+ // Internal method that demuxes the next packet from the stream. The caller
+ // is responsible for making sure it doesn't get lost.
+ RefPtr<NesteggPacketHolder> DemuxPacket(TrackInfo::TrackType aType);
+
+ // libnestegg audio and video context for webm container.
+ // Access on reader's thread only.
+ NestEggContext mVideoContext;
+ NestEggContext mAudioContext;
+ MediaResourceIndex& Resource(TrackInfo::TrackType aType)
+ {
+ return aType == TrackInfo::kVideoTrack
+ ? mVideoContext.mResource : mAudioContext.mResource;
+ }
+ nestegg* Context(TrackInfo::TrackType aType) const
+ {
+ return aType == TrackInfo::kVideoTrack
+ ? mVideoContext.mContext : mAudioContext.mContext;
+ }
+
+ MediaInfo mInfo;
+ nsTArray<RefPtr<WebMTrackDemuxer>> mDemuxers;
+
+ // Parser state and computed offset-time mappings. Shared by multiple
+ // readers when decoder has been cloned. Main thread only.
+ RefPtr<WebMBufferedState> mBufferedState;
+ RefPtr<MediaByteBuffer> mInitData;
+
+
+ // Queue of video and audio packets that have been read but not decoded.
+ WebMPacketQueue mVideoPackets;
+ WebMPacketQueue mAudioPackets;
+
+ // Index of video and audio track to play
+ uint32_t mVideoTrack;
+ uint32_t mAudioTrack;
+
+ // Nanoseconds to discard after seeking.
+ uint64_t mSeekPreroll;
+
+ // Calculate the frame duration from the last decodeable frame using the
+ // previous frame's timestamp. In NS.
+ Maybe<int64_t> mLastAudioFrameTime;
+ Maybe<int64_t> mLastVideoFrameTime;
+
+ // Codec ID of audio track
+ int mAudioCodec;
+ // Codec ID of video track
+ int mVideoCodec;
+
+ // Booleans to indicate if we have audio and/or video data
+ bool mHasVideo;
+ bool mHasAudio;
+ bool mNeedReIndex;
+
+ // The last complete block parsed by the WebMBufferedState. -1 if not set.
+ // We cache those values rather than retrieving them for performance reasons
+ // as nestegg only performs 1-byte read at a time.
+ int64_t mLastWebMBlockOffset;
+ const bool mIsMediaSource;
+
+ Maybe<uint32_t> mLastSeenFrameWidth;
+ Maybe<uint32_t> mLastSeenFrameHeight;
+ // This will be populated only if a resolution change occurs, otherwise it
+ // will be left as null so the original metadata is used
+ RefPtr<SharedTrackInfo> mSharedVideoTrackInfo;
+
+ EncryptionInfo mCrypto;
+};
+
+class WebMTrackDemuxer : public MediaTrackDemuxer
+{
+public:
+ WebMTrackDemuxer(WebMDemuxer* aParent,
+ TrackInfo::TrackType aType,
+ uint32_t aTrackNumber);
+
+ UniquePtr<TrackInfo> GetInfo() const override;
+
+ RefPtr<SeekPromise> Seek(media::TimeUnit aTime) override;
+
+ RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override;
+
+ void Reset() override;
+
+ nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override;
+
+ RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint(media::TimeUnit aTimeThreshold) override;
+
+ media::TimeIntervals GetBuffered() override;
+
+ int64_t GetEvictionOffset(const media::TimeUnit& aTime) override;
+
+ void BreakCycles() override;
+
+private:
+ friend class WebMDemuxer;
+ ~WebMTrackDemuxer();
+ void UpdateSamples(nsTArray<RefPtr<MediaRawData>>& aSamples);
+ void SetNextKeyFrameTime();
+ RefPtr<MediaRawData> NextSample ();
+ RefPtr<WebMDemuxer> mParent;
+ TrackInfo::TrackType mType;
+ UniquePtr<TrackInfo> mInfo;
+ Maybe<media::TimeUnit> mNextKeyframeTime;
+ bool mNeedKeyframe;
+
+ // Queued samples extracted by the demuxer, but not yet returned.
+ MediaRawDataQueue mSamples;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webm/WebMWriter.cpp b/dom/media/webm/WebMWriter.cpp
new file mode 100644
index 000000000..a98a14f4e
--- /dev/null
+++ b/dom/media/webm/WebMWriter.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WebMWriter.h"
+#include "EbmlComposer.h"
+#include "GeckoProfiler.h"
+#include "OpusTrackEncoder.h"
+
+namespace mozilla {
+
+WebMWriter::WebMWriter(uint32_t aTrackTypes) : ContainerWriter()
+{
+ mMetadataRequiredFlag = aTrackTypes;
+ mEbmlComposer = new EbmlComposer();
+}
+
+WebMWriter::~WebMWriter()
+{
+ // Out-of-line dtor so mEbmlComposer nsAutoPtr can delete a complete type.
+}
+
+nsresult
+WebMWriter::WriteEncodedTrack(const EncodedFrameContainer& aData,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("WebMWriter", "SetMetadata",
+ js::ProfileEntry::Category::OTHER);
+ for (uint32_t i = 0 ; i < aData.GetEncodedFrames().Length(); i++) {
+ mEbmlComposer->WriteSimpleBlock(aData.GetEncodedFrames().ElementAt(i).get());
+ }
+ return NS_OK;
+}
+
+nsresult
+WebMWriter::GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("WebMWriter", "GetContainerData",
+ js::ProfileEntry::Category::OTHER);
+ mEbmlComposer->ExtractBuffer(aOutputBufs, aFlags);
+ if (aFlags & ContainerWriter::FLUSH_NEEDED) {
+ mIsWritingComplete = true;
+ }
+ return NS_OK;
+}
+
+nsresult
+WebMWriter::SetMetadata(TrackMetadataBase* aMetadata)
+{
+ MOZ_ASSERT(aMetadata);
+ PROFILER_LABEL("WebMWriter", "SetMetadata",
+ js::ProfileEntry::Category::OTHER);
+
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VP8) {
+ VP8Metadata* meta = static_cast<VP8Metadata*>(aMetadata);
+ MOZ_ASSERT(meta, "Cannot find vp8 encoder metadata");
+ mEbmlComposer->SetVideoConfig(meta->mWidth, meta->mHeight,
+ meta->mDisplayWidth, meta->mDisplayHeight,
+ meta->mEncodedFrameRate);
+ mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_VIDEO_TRACK;
+ }
+
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VORBIS) {
+ VorbisMetadata* meta = static_cast<VorbisMetadata*>(aMetadata);
+ MOZ_ASSERT(meta, "Cannot find vorbis encoder metadata");
+ mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
+ mEbmlComposer->SetAudioCodecPrivateData(meta->mData);
+ mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_AUDIO_TRACK;
+ }
+
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_OPUS) {
+ OpusMetadata* meta = static_cast<OpusMetadata*>(aMetadata);
+ MOZ_ASSERT(meta, "Cannot find Opus encoder metadata");
+ mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
+ mEbmlComposer->SetAudioCodecPrivateData(meta->mIdHeader);
+ mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_AUDIO_TRACK;
+ }
+
+ if (!mMetadataRequiredFlag) {
+ mEbmlComposer->GenerateHeader();
+ }
+ return NS_OK;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webm/WebMWriter.h b/dom/media/webm/WebMWriter.h
new file mode 100644
index 000000000..c4dfec8e5
--- /dev/null
+++ b/dom/media/webm/WebMWriter.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WebMWriter_h_
+#define WebMWriter_h_
+
+#include "ContainerWriter.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+
+class EbmlComposer;
+
+// Vorbis meta data structure
+class VorbisMetadata : public TrackMetadataBase
+{
+public:
+ nsTArray<uint8_t> mData;
+ int32_t mChannels;
+ float mSamplingFrequency;
+ MetadataKind GetKind() const override { return METADATA_VORBIS; }
+};
+
+// VP8 meta data structure
+class VP8Metadata : public TrackMetadataBase
+{
+public:
+ int32_t mWidth;
+ int32_t mHeight;
+ int32_t mDisplayWidth;
+ int32_t mDisplayHeight;
+ int32_t mEncodedFrameRate;
+ MetadataKind GetKind() const override { return METADATA_VP8; }
+};
+
+/**
+ * WebM writer helper
+ * This class accepts encoder to set audio or video meta data or
+ * encoded data to ebml Composer, and get muxing data through GetContainerData.
+ * The ctor/dtor run in the MediaRecorder thread, others run in MediaEncoder thread.
+ */
+class WebMWriter : public ContainerWriter
+{
+public:
+ // aTrackTypes indicate this muxer should multiplex into Video only or A/V foramt.
+ // Run in MediaRecorder thread
+ explicit WebMWriter(uint32_t aTrackTypes);
+ virtual ~WebMWriter();
+
+ // WriteEncodedTrack inserts raw packets into WebM stream.
+ nsresult WriteEncodedTrack(const EncodedFrameContainer &aData,
+ uint32_t aFlags = 0) override;
+
+ // GetContainerData outputs multiplexing data.
+ // aFlags indicates the muxer should enter into finished stage and flush out
+ // queue data.
+ nsresult GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ uint32_t aFlags = 0) override;
+
+ // Assign metadata into muxer
+ nsresult SetMetadata(TrackMetadataBase* aMetadata) override;
+
+private:
+ nsAutoPtr<EbmlComposer> mEbmlComposer;
+
+ // Indicate what kind of meta data needed in the writer.
+ // If this value become 0, it means writer can start to generate header.
+ uint8_t mMetadataRequiredFlag;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webm/moz.build b/dom/media/webm/moz.build
new file mode 100644
index 000000000..f2898fafd
--- /dev/null
+++ b/dom/media/webm/moz.build
@@ -0,0 +1,31 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS += [
+ 'NesteggPacketHolder.h',
+ 'WebMBufferedParser.h',
+ 'WebMDecoder.h',
+ 'WebMDemuxer.h',
+]
+
+UNIFIED_SOURCES += [
+ 'WebMBufferedParser.cpp',
+ 'WebMDecoder.cpp',
+ 'WebMDemuxer.cpp',
+]
+
+if CONFIG['MOZ_WEBM_ENCODER']:
+ EXPORTS += ['WebMWriter.h']
+ UNIFIED_SOURCES += ['EbmlComposer.cpp',
+ 'WebMWriter.cpp',
+ ]
+
+CXXFLAGS += CONFIG['MOZ_LIBVPX_CFLAGS']
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/webrtc/AudioOutputObserver.h b/dom/media/webrtc/AudioOutputObserver.h
new file mode 100644
index 000000000..517eaa891
--- /dev/null
+++ b/dom/media/webrtc/AudioOutputObserver.h
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef AUDIOOUTPUTOBSERVER_H_
+#define AUDIOOUTPUTOBSERVER_H_
+
+#include "mozilla/StaticPtr.h"
+#include "nsAutoPtr.h"
+#include "AudioMixer.h"
+
+namespace webrtc {
+class SingleRwFifo;
+}
+
+namespace mozilla {
+
+typedef struct FarEndAudioChunk_ {
+ uint16_t mSamples;
+ bool mOverrun;
+ int16_t mData[1]; // variable-length
+} FarEndAudioChunk;
+
+// XXX Really a singleton currently
+class AudioOutputObserver : public MixerCallbackReceiver
+{
+public:
+ AudioOutputObserver();
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioOutputObserver);
+
+ void MixerCallback(AudioDataValue* aMixedBuffer,
+ AudioSampleFormat aFormat,
+ uint32_t aChannels,
+ uint32_t aFrames,
+ uint32_t aSampleRate) override;
+
+ void Clear();
+ void InsertFarEnd(const AudioDataValue *aBuffer, uint32_t aFrames, bool aOverran,
+ int aFreq, int aChannels, AudioSampleFormat aFormat);
+ uint32_t PlayoutFrequency() { return mPlayoutFreq; }
+ uint32_t PlayoutChannels() { return mPlayoutChannels; }
+
+ FarEndAudioChunk *Pop();
+ uint32_t Size();
+
+private:
+ virtual ~AudioOutputObserver();
+ uint32_t mPlayoutFreq;
+ uint32_t mPlayoutChannels;
+
+ nsAutoPtr<webrtc::SingleRwFifo> mPlayoutFifo;
+ uint32_t mChunkSize;
+
+ // chunking to 10ms support
+ FarEndAudioChunk *mSaved; // can't be nsAutoPtr since we need to use free(), not delete
+ uint32_t mSamplesSaved;
+};
+
+extern StaticRefPtr<AudioOutputObserver> gFarendObserver;
+
+}
+
+#endif
diff --git a/dom/media/webrtc/MediaEngine.h b/dom/media/webrtc/MediaEngine.h
new file mode 100644
index 000000000..ff2a6e25a
--- /dev/null
+++ b/dom/media/webrtc/MediaEngine.h
@@ -0,0 +1,485 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIAENGINE_H_
+#define MEDIAENGINE_H_
+
+#include "mozilla/RefPtr.h"
+#include "DOMMediaStream.h"
+#include "MediaStreamGraph.h"
+#include "MediaTrackConstraints.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/VideoStreamTrack.h"
+#include "mozilla/media/DeviceChangeCallback.h"
+
+namespace mozilla {
+
+namespace dom {
+class Blob;
+} // namespace dom
+
+enum {
+ kVideoTrack = 1,
+ kAudioTrack = 2,
+ kTrackCount
+};
+
+/**
+ * Abstract interface for managing audio and video devices. Each platform
+ * must implement a concrete class that will map these classes and methods
+ * to the appropriate backend. For example, on Desktop platforms, these will
+ * correspond to equivalent webrtc (GIPS) calls, and on B2G they will map to
+ * a Gonk interface.
+ */
+class MediaEngineVideoSource;
+class MediaEngineAudioSource;
+
+enum MediaEngineState {
+ kAllocated,
+ kStarted,
+ kStopped,
+ kReleased
+};
+
+class MediaEngine : public DeviceChangeCallback
+{
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaEngine)
+
+ static const int DEFAULT_VIDEO_FPS = 30;
+ static const int DEFAULT_VIDEO_MIN_FPS = 10;
+ static const int DEFAULT_43_VIDEO_WIDTH = 640;
+ static const int DEFAULT_43_VIDEO_HEIGHT = 480;
+ static const int DEFAULT_169_VIDEO_WIDTH = 1280;
+ static const int DEFAULT_169_VIDEO_HEIGHT = 720;
+
+#ifndef MOZ_B2G
+ static const int DEFAULT_SAMPLE_RATE = 32000;
+#else
+ static const int DEFAULT_SAMPLE_RATE = 16000;
+#endif
+ // This allows using whatever rate the graph is using for the
+ // MediaStreamTrack. This is useful for microphone data, we know it's already
+ // at the correct rate for insertion in the MSG.
+ static const int USE_GRAPH_RATE = -1;
+
+ /* Populate an array of video sources in the nsTArray. Also include devices
+ * that are currently unavailable. */
+ virtual void EnumerateVideoDevices(dom::MediaSourceEnum,
+ nsTArray<RefPtr<MediaEngineVideoSource> >*) = 0;
+
+ /* Populate an array of audio sources in the nsTArray. Also include devices
+ * that are currently unavailable. */
+ virtual void EnumerateAudioDevices(dom::MediaSourceEnum,
+ nsTArray<RefPtr<MediaEngineAudioSource> >*) = 0;
+
+ virtual void Shutdown() = 0;
+
+ virtual void SetFakeDeviceChangeEvents() {}
+
+protected:
+ virtual ~MediaEngine() {}
+};
+
+/**
+ * Video source and friends.
+ */
+class MediaEnginePrefs {
+public:
+ MediaEnginePrefs()
+ : mWidth(0)
+ , mHeight(0)
+ , mFPS(0)
+ , mMinFPS(0)
+ , mFreq(0)
+ , mAecOn(false)
+ , mAgcOn(false)
+ , mNoiseOn(false)
+ , mAec(0)
+ , mAgc(0)
+ , mNoise(0)
+ , mPlayoutDelay(0)
+ , mFullDuplex(false)
+ , mExtendedFilter(false)
+ , mDelayAgnostic(false)
+ , mFakeDeviceChangeEventOn(false)
+ {}
+
+ int32_t mWidth;
+ int32_t mHeight;
+ int32_t mFPS;
+ int32_t mMinFPS;
+ int32_t mFreq; // for test tones (fake:true)
+ bool mAecOn;
+ bool mAgcOn;
+ bool mNoiseOn;
+ int32_t mAec;
+ int32_t mAgc;
+ int32_t mNoise;
+ int32_t mPlayoutDelay;
+ bool mFullDuplex;
+ bool mExtendedFilter;
+ bool mDelayAgnostic;
+ bool mFakeDeviceChangeEventOn;
+
+ // mWidth and/or mHeight may be zero (=adaptive default), so use functions.
+
+ int32_t GetWidth(bool aHD = false) const {
+ return mWidth? mWidth : (mHeight?
+ (mHeight * GetDefWidth(aHD)) / GetDefHeight(aHD) :
+ GetDefWidth(aHD));
+ }
+
+ int32_t GetHeight(bool aHD = false) const {
+ return mHeight? mHeight : (mWidth?
+ (mWidth * GetDefHeight(aHD)) / GetDefWidth(aHD) :
+ GetDefHeight(aHD));
+ }
+private:
+ static int32_t GetDefWidth(bool aHD = false) {
+ // It'd be nice if we could use the ternary operator here, but we can't
+ // because of bug 1002729.
+ if (aHD) {
+ return MediaEngine::DEFAULT_169_VIDEO_WIDTH;
+ }
+
+ return MediaEngine::DEFAULT_43_VIDEO_WIDTH;
+ }
+
+ static int32_t GetDefHeight(bool aHD = false) {
+ // It'd be nice if we could use the ternary operator here, but we can't
+ // because of bug 1002729.
+ if (aHD) {
+ return MediaEngine::DEFAULT_169_VIDEO_HEIGHT;
+ }
+
+ return MediaEngine::DEFAULT_43_VIDEO_HEIGHT;
+ }
+};
+
+/**
+ * Callback interface for TakePhoto(). Either PhotoComplete() or PhotoError()
+ * should be called.
+ */
+class MediaEnginePhotoCallback {
+public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaEnginePhotoCallback)
+
+ // aBlob is the image captured by MediaEngineSource. It is
+ // called on main thread.
+ virtual nsresult PhotoComplete(already_AddRefed<dom::Blob> aBlob) = 0;
+
+ // It is called on main thread. aRv is the error code.
+ virtual nsresult PhotoError(nsresult aRv) = 0;
+
+protected:
+ virtual ~MediaEnginePhotoCallback() {}
+};
+
+/**
+ * Common abstract base class for audio and video sources.
+ *
+ * By default, the base class implements Allocate and Deallocate using its
+ * UpdateSingleSource pattern, which manages allocation handles and calculates
+ * net constraints from competing allocations and updates a single shared device.
+ *
+ * Classes that don't operate as a single shared device can override Allocate
+ * and Deallocate and simply not pass the methods up.
+ */
+class MediaEngineSource : public nsISupports,
+ protected MediaConstraintsHelper
+{
+public:
+ // code inside webrtc.org assumes these sizes; don't use anything smaller
+ // without verifying it's ok
+ static const unsigned int kMaxDeviceNameLength = 128;
+ static const unsigned int kMaxUniqueIdLength = 256;
+
+ virtual ~MediaEngineSource()
+ {
+ if (!mInShutdown) {
+ Shutdown();
+ }
+ }
+
+ virtual void Shutdown()
+ {
+ mInShutdown = true;
+ };
+
+ /* Populate the human readable name of this device in the nsAString */
+ virtual void GetName(nsAString&) const = 0;
+
+ /* Populate the UUID of this device in the nsACString */
+ virtual void GetUUID(nsACString&) const = 0;
+
+ /* Override w/true if source does end-run around cross origin restrictions. */
+ virtual bool GetScary() const { return false; };
+
+ class AllocationHandle
+ {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AllocationHandle);
+ protected:
+ ~AllocationHandle() {}
+ public:
+ AllocationHandle(const dom::MediaTrackConstraints& aConstraints,
+ const nsACString& aOrigin,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId)
+ : mConstraints(aConstraints),
+ mOrigin(aOrigin),
+ mPrefs(aPrefs),
+ mDeviceId(aDeviceId) {}
+ public:
+ NormalizedConstraints mConstraints;
+ nsCString mOrigin;
+ MediaEnginePrefs mPrefs;
+ nsString mDeviceId;
+ };
+
+ /* Release the device back to the system. */
+ virtual nsresult Deallocate(AllocationHandle* aHandle)
+ {
+ MOZ_ASSERT(aHandle);
+ RefPtr<AllocationHandle> handle = aHandle;
+
+ class Comparator {
+ public:
+ static bool Equals(const RefPtr<AllocationHandle>& a,
+ const RefPtr<AllocationHandle>& b) {
+ return a.get() == b.get();
+ }
+ };
+
+ auto ix = mRegisteredHandles.IndexOf(handle, 0, Comparator());
+ if (ix == mRegisteredHandles.NoIndex) {
+ MOZ_ASSERT(false);
+ return NS_ERROR_FAILURE;
+ }
+
+ mRegisteredHandles.RemoveElementAt(ix);
+ if (mRegisteredHandles.Length() && !mInShutdown) {
+ // Whenever constraints are removed, other parties may get closer to ideal.
+ auto& first = mRegisteredHandles[0];
+ const char* badConstraint = nullptr;
+ return ReevaluateAllocation(nullptr, nullptr, first->mPrefs,
+ first->mDeviceId, &badConstraint);
+ }
+ return NS_OK;
+ }
+
+ /* Start the device and add the track to the provided SourceMediaStream, with
+ * the provided TrackID. You may start appending data to the track
+ * immediately after. */
+ virtual nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) = 0;
+
+ /* tell the source if there are any direct listeners attached */
+ virtual void SetDirectListeners(bool) = 0;
+
+ /* Called when the stream wants more data */
+ virtual void NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream *aSource,
+ TrackID aId,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle) = 0;
+
+ /* Stop the device and release the corresponding MediaStream */
+ virtual nsresult Stop(SourceMediaStream *aSource, TrackID aID) = 0;
+
+ /* Restart with new capability */
+ virtual nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) = 0;
+
+ /* Returns true if a source represents a fake capture device and
+ * false otherwise
+ */
+ virtual bool IsFake() = 0;
+
+ /* Returns the type of media source (camera, microphone, screen, window, etc) */
+ virtual dom::MediaSourceEnum GetMediaSource() const = 0;
+
+ /* If implementation of MediaEngineSource supports TakePhoto(), the picture
+ * should be return via aCallback object. Otherwise, it returns NS_ERROR_NOT_IMPLEMENTED.
+ * Currently, only Gonk MediaEngineSource implementation supports it.
+ */
+ virtual nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) = 0;
+
+ /* Return false if device is currently allocated or started */
+ bool IsAvailable() {
+ if (mState == kAllocated || mState == kStarted) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ /* It is an error to call Start() before an Allocate(), and Stop() before
+ * a Start(). Only Allocate() may be called after a Deallocate(). */
+
+ /* This call reserves but does not start the device. */
+ virtual nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint)
+ {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(aOutHandle);
+ RefPtr<AllocationHandle> handle = new AllocationHandle(aConstraints, aOrigin,
+ aPrefs, aDeviceId);
+ nsresult rv = ReevaluateAllocation(handle, nullptr, aPrefs, aDeviceId,
+ aOutBadConstraint);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ mRegisteredHandles.AppendElement(handle);
+ handle.forget(aOutHandle);
+ return NS_OK;
+ }
+
+ virtual uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const = 0;
+
+ void GetSettings(dom::MediaTrackSettings& aOutSettings)
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+ aOutSettings = mSettings;
+ }
+
+protected:
+ // Only class' own members can be initialized in constructor initializer list.
+ explicit MediaEngineSource(MediaEngineState aState)
+ : mState(aState)
+#ifdef DEBUG
+ , mOwningThread(PR_GetCurrentThread())
+#endif
+ , mInShutdown(false)
+ {}
+
+ /* UpdateSingleSource - Centralized abstract function to implement in those
+ * cases where a single device is being shared between users. Should apply net
+ * constraints and restart the device as needed.
+ *
+ * aHandle - New or existing handle, or null to update after removal.
+ * aNetConstraints - Net constraints to be applied to the single device.
+ * aPrefs - As passed in (in case of changes in about:config).
+ * aDeviceId - As passed in (origin dependent).
+ * aOutBadConstraint - Result: nonzero if failed to apply. Name of culprit.
+ */
+
+ virtual nsresult
+ UpdateSingleSource(const AllocationHandle* aHandle,
+ const NormalizedConstraints& aNetConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ };
+
+ /* ReevaluateAllocation - Call to change constraints for an allocation of
+ * a single device. Manages allocation handles, calculates net constraints
+ * from all competing allocations, and calls UpdateSingleSource with the net
+ * result, to restart the single device as needed.
+ *
+ * aHandle - New or existing handle, or null to update after removal.
+ * aConstraintsUpdate - Constraints to be applied to existing handle, or null.
+ * aPrefs - As passed in (in case of changes from about:config).
+ * aDeviceId - As passed in (origin-dependent id).
+ * aOutBadConstraint - Result: nonzero if failed to apply. Name of culprit.
+ */
+
+ nsresult
+ ReevaluateAllocation(AllocationHandle* aHandle,
+ NormalizedConstraints* aConstraintsUpdate,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+ {
+ // aHandle and/or aConstraintsUpdate may be nullptr (see below)
+
+ AutoTArray<const NormalizedConstraints*, 10> allConstraints;
+ for (auto& registered : mRegisteredHandles) {
+ if (aConstraintsUpdate && registered.get() == aHandle) {
+ continue; // Don't count old constraints
+ }
+ allConstraints.AppendElement(&registered->mConstraints);
+ }
+ if (aConstraintsUpdate) {
+ allConstraints.AppendElement(aConstraintsUpdate);
+ } else if (aHandle) {
+ // In the case of AddShareOfSingleSource, the handle isn't registered yet.
+ allConstraints.AppendElement(&aHandle->mConstraints);
+ }
+
+ NormalizedConstraints netConstraints(allConstraints);
+ if (netConstraints.mBadConstraint) {
+ *aOutBadConstraint = netConstraints.mBadConstraint;
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult rv = UpdateSingleSource(aHandle, netConstraints, aPrefs, aDeviceId,
+ aOutBadConstraint);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ if (aHandle && aConstraintsUpdate) {
+ aHandle->mConstraints = *aConstraintsUpdate;
+ }
+ return NS_OK;
+ }
+
+ void AssertIsOnOwningThread()
+ {
+ MOZ_ASSERT(PR_GetCurrentThread() == mOwningThread);
+ }
+
+ MediaEngineState mState;
+#ifdef DEBUG
+ PRThread* mOwningThread;
+#endif
+ nsTArray<RefPtr<AllocationHandle>> mRegisteredHandles;
+ bool mInShutdown;
+
+ // Main-thread only:
+ dom::MediaTrackSettings mSettings;
+};
+
+class MediaEngineVideoSource : public MediaEngineSource
+{
+public:
+ virtual ~MediaEngineVideoSource() {}
+
+protected:
+ explicit MediaEngineVideoSource(MediaEngineState aState)
+ : MediaEngineSource(aState) {}
+ MediaEngineVideoSource()
+ : MediaEngineSource(kReleased) {}
+};
+
+/**
+ * Audio source and friends.
+ */
+class MediaEngineAudioSource : public MediaEngineSource,
+ public AudioDataListenerInterface
+{
+public:
+ virtual ~MediaEngineAudioSource() {}
+
+protected:
+ explicit MediaEngineAudioSource(MediaEngineState aState)
+ : MediaEngineSource(aState) {}
+ MediaEngineAudioSource()
+ : MediaEngineSource(kReleased) {}
+
+};
+
+} // namespace mozilla
+
+#endif /* MEDIAENGINE_H_ */
diff --git a/dom/media/webrtc/MediaEngineCameraVideoSource.cpp b/dom/media/webrtc/MediaEngineCameraVideoSource.cpp
new file mode 100644
index 000000000..a0f31d937
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineCameraVideoSource.cpp
@@ -0,0 +1,418 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaEngineCameraVideoSource.h"
+
+#include <limits>
+
+namespace mozilla {
+
+using namespace mozilla::gfx;
+using namespace mozilla::dom;
+
+extern LogModule* GetMediaManagerLog();
+#define LOG(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Debug, msg)
+#define LOGFRAME(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Verbose, msg)
+
+// guts for appending data to the MSG track
+bool MediaEngineCameraVideoSource::AppendToTrack(SourceMediaStream* aSource,
+ layers::Image* aImage,
+ TrackID aID,
+ StreamTime delta,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ MOZ_ASSERT(aSource);
+
+ VideoSegment segment;
+ RefPtr<layers::Image> image = aImage;
+ IntSize size(image ? mWidth : 0, image ? mHeight : 0);
+ segment.AppendFrame(image.forget(), delta, size, aPrincipalHandle);
+
+ // This is safe from any thread, and is safe if the track is Finished
+ // or Destroyed.
+ // This can fail if either a) we haven't added the track yet, or b)
+ // we've removed or finished the track.
+ return aSource->AppendToTrack(aID, &(segment));
+}
+
+// Sub-classes (B2G or desktop) should overload one of both of these two methods
+// to provide capabilities
+size_t
+MediaEngineCameraVideoSource::NumCapabilities() const
+{
+ return mHardcodedCapabilities.Length();
+}
+
+void
+MediaEngineCameraVideoSource::GetCapability(size_t aIndex,
+ webrtc::CaptureCapability& aOut) const
+{
+ MOZ_ASSERT(aIndex < mHardcodedCapabilities.Length());
+ aOut = mHardcodedCapabilities.SafeElementAt(aIndex, webrtc::CaptureCapability());
+}
+
+uint32_t
+MediaEngineCameraVideoSource::GetFitnessDistance(
+ const webrtc::CaptureCapability& aCandidate,
+ const NormalizedConstraintSet &aConstraints,
+ const nsString& aDeviceId) const
+{
+ // Treat width|height|frameRate == 0 on capability as "can do any".
+ // This allows for orthogonal capabilities that are not in discrete steps.
+
+ uint64_t distance =
+ uint64_t(FitnessDistance(aDeviceId, aConstraints.mDeviceId)) +
+ uint64_t(FitnessDistance(mFacingMode, aConstraints.mFacingMode)) +
+ uint64_t(aCandidate.width? FitnessDistance(int32_t(aCandidate.width),
+ aConstraints.mWidth) : 0) +
+ uint64_t(aCandidate.height? FitnessDistance(int32_t(aCandidate.height),
+ aConstraints.mHeight) : 0) +
+ uint64_t(aCandidate.maxFPS? FitnessDistance(double(aCandidate.maxFPS),
+ aConstraints.mFrameRate) : 0);
+ return uint32_t(std::min(distance, uint64_t(UINT32_MAX)));
+}
+
+// Find best capability by removing inferiors. May leave >1 of equal distance
+
+/* static */ void
+MediaEngineCameraVideoSource::TrimLessFitCandidates(CapabilitySet& set) {
+ uint32_t best = UINT32_MAX;
+ for (auto& candidate : set) {
+ if (best > candidate.mDistance) {
+ best = candidate.mDistance;
+ }
+ }
+ for (size_t i = 0; i < set.Length();) {
+ if (set[i].mDistance > best) {
+ set.RemoveElementAt(i);
+ } else {
+ ++i;
+ }
+ }
+ MOZ_ASSERT(set.Length());
+}
+
+// GetBestFitnessDistance returns the best distance the capture device can offer
+// as a whole, given an accumulated number of ConstraintSets.
+// Ideal values are considered in the first ConstraintSet only.
+// Plain values are treated as Ideal in the first ConstraintSet.
+// Plain values are treated as Exact in subsequent ConstraintSets.
+// Infinity = UINT32_MAX e.g. device cannot satisfy accumulated ConstraintSets.
+// A finite result may be used to calculate this device's ranking as a choice.
+
+uint32_t
+MediaEngineCameraVideoSource::GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const
+{
+ size_t num = NumCapabilities();
+
+ CapabilitySet candidateSet;
+ for (size_t i = 0; i < num; i++) {
+ candidateSet.AppendElement(i);
+ }
+
+ bool first = true;
+ for (const NormalizedConstraintSet* ns : aConstraintSets) {
+ for (size_t i = 0; i < candidateSet.Length(); ) {
+ auto& candidate = candidateSet[i];
+ webrtc::CaptureCapability cap;
+ GetCapability(candidate.mIndex, cap);
+ uint32_t distance = GetFitnessDistance(cap, *ns, aDeviceId);
+ if (distance == UINT32_MAX) {
+ candidateSet.RemoveElementAt(i);
+ } else {
+ ++i;
+ if (first) {
+ candidate.mDistance = distance;
+ }
+ }
+ }
+ first = false;
+ }
+ if (!candidateSet.Length()) {
+ return UINT32_MAX;
+ }
+ TrimLessFitCandidates(candidateSet);
+ return candidateSet[0].mDistance;
+}
+
+void
+MediaEngineCameraVideoSource::LogConstraints(
+ const NormalizedConstraintSet& aConstraints)
+{
+ auto& c = aConstraints;
+ LOG(((c.mWidth.mIdeal.isSome()?
+ "Constraints: width: { min: %d, max: %d, ideal: %d }" :
+ "Constraints: width: { min: %d, max: %d }"),
+ c.mWidth.mMin, c.mWidth.mMax,
+ c.mWidth.mIdeal.valueOr(0)));
+ LOG(((c.mHeight.mIdeal.isSome()?
+ " height: { min: %d, max: %d, ideal: %d }" :
+ " height: { min: %d, max: %d }"),
+ c.mHeight.mMin, c.mHeight.mMax,
+ c.mHeight.mIdeal.valueOr(0)));
+ LOG(((c.mFrameRate.mIdeal.isSome()?
+ " frameRate: { min: %f, max: %f, ideal: %f }" :
+ " frameRate: { min: %f, max: %f }"),
+ c.mFrameRate.mMin, c.mFrameRate.mMax,
+ c.mFrameRate.mIdeal.valueOr(0)));
+}
+
+void
+MediaEngineCameraVideoSource::LogCapability(const char* aHeader,
+ const webrtc::CaptureCapability &aCapability, uint32_t aDistance)
+{
+ // RawVideoType and VideoCodecType media/webrtc/trunk/webrtc/common_types.h
+ static const char* const types[] = {
+ "I420",
+ "YV12",
+ "YUY2",
+ "UYVY",
+ "IYUV",
+ "ARGB",
+ "RGB24",
+ "RGB565",
+ "ARGB4444",
+ "ARGB1555",
+ "MJPEG",
+ "NV12",
+ "NV21",
+ "BGRA",
+ "Unknown type"
+ };
+
+ static const char* const codec[] = {
+ "VP8",
+ "VP9",
+ "H264",
+ "I420",
+ "RED",
+ "ULPFEC",
+ "Generic codec",
+ "Unknown codec"
+ };
+
+ LOG(("%s: %4u x %4u x %2u maxFps, %s, %s. Distance = %lu",
+ aHeader, aCapability.width, aCapability.height, aCapability.maxFPS,
+ types[std::min(std::max(uint32_t(0), uint32_t(aCapability.rawType)),
+ uint32_t(sizeof(types) / sizeof(*types) - 1))],
+ codec[std::min(std::max(uint32_t(0), uint32_t(aCapability.codecType)),
+ uint32_t(sizeof(codec) / sizeof(*codec) - 1))],
+ aDistance));
+}
+
+bool
+MediaEngineCameraVideoSource::ChooseCapability(
+ const NormalizedConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId)
+{
+ if (MOZ_LOG_TEST(GetMediaManagerLog(), LogLevel::Debug)) {
+ LOG(("ChooseCapability: prefs: %dx%d @%d-%dfps",
+ aPrefs.GetWidth(), aPrefs.GetHeight(),
+ aPrefs.mFPS, aPrefs.mMinFPS));
+ LogConstraints(aConstraints);
+ if (aConstraints.mAdvanced.size()) {
+ LOG(("Advanced array[%u]:", aConstraints.mAdvanced.size()));
+ for (auto& advanced : aConstraints.mAdvanced) {
+ LogConstraints(advanced);
+ }
+ }
+ }
+
+ size_t num = NumCapabilities();
+
+ CapabilitySet candidateSet;
+ for (size_t i = 0; i < num; i++) {
+ candidateSet.AppendElement(i);
+ }
+
+ // First, filter capabilities by required constraints (min, max, exact).
+
+ for (size_t i = 0; i < candidateSet.Length();) {
+ auto& candidate = candidateSet[i];
+ webrtc::CaptureCapability cap;
+ GetCapability(candidate.mIndex, cap);
+ candidate.mDistance = GetFitnessDistance(cap, aConstraints, aDeviceId);
+ LogCapability("Capability", cap, candidate.mDistance);
+ if (candidate.mDistance == UINT32_MAX) {
+ candidateSet.RemoveElementAt(i);
+ } else {
+ ++i;
+ }
+ }
+
+ if (!candidateSet.Length()) {
+ LOG(("failed to find capability match from %d choices",num));
+ return false;
+ }
+
+ // Filter further with all advanced constraints (that don't overconstrain).
+
+ for (const auto &cs : aConstraints.mAdvanced) {
+ CapabilitySet rejects;
+ for (size_t i = 0; i < candidateSet.Length();) {
+ auto& candidate = candidateSet[i];
+ webrtc::CaptureCapability cap;
+ GetCapability(candidate.mIndex, cap);
+ if (GetFitnessDistance(cap, cs, aDeviceId) == UINT32_MAX) {
+ rejects.AppendElement(candidate);
+ candidateSet.RemoveElementAt(i);
+ } else {
+ ++i;
+ }
+ }
+ if (!candidateSet.Length()) {
+ candidateSet.AppendElements(Move(rejects));
+ }
+ }
+ MOZ_ASSERT(candidateSet.Length(),
+ "advanced constraints filtering step can't reduce candidates to zero");
+
+ // Remaining algorithm is up to the UA.
+
+ TrimLessFitCandidates(candidateSet);
+
+ // Any remaining multiples all have the same distance. A common case of this
+ // occurs when no ideal is specified. Lean toward defaults.
+ uint32_t sameDistance = candidateSet[0].mDistance;
+ {
+ MediaTrackConstraintSet prefs;
+ prefs.mWidth.SetAsLong() = aPrefs.GetWidth();
+ prefs.mHeight.SetAsLong() = aPrefs.GetHeight();
+ prefs.mFrameRate.SetAsDouble() = aPrefs.mFPS;
+ NormalizedConstraintSet normPrefs(prefs, false);
+
+ for (auto& candidate : candidateSet) {
+ webrtc::CaptureCapability cap;
+ GetCapability(candidate.mIndex, cap);
+ candidate.mDistance = GetFitnessDistance(cap, normPrefs, aDeviceId);
+ }
+ TrimLessFitCandidates(candidateSet);
+ }
+
+ // Any remaining multiples all have the same distance, but may vary on
+ // format. Some formats are more desirable for certain use like WebRTC.
+ // E.g. I420 over RGB24 can remove a needless format conversion.
+
+ bool found = false;
+ for (auto& candidate : candidateSet) {
+ webrtc::CaptureCapability cap;
+ GetCapability(candidate.mIndex, cap);
+ if (cap.rawType == webrtc::RawVideoType::kVideoI420 ||
+ cap.rawType == webrtc::RawVideoType::kVideoYUY2 ||
+ cap.rawType == webrtc::RawVideoType::kVideoYV12) {
+ mCapability = cap;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ GetCapability(candidateSet[0].mIndex, mCapability);
+ }
+
+ LogCapability("Chosen capability", mCapability, sameDistance);
+ return true;
+}
+
+void
+MediaEngineCameraVideoSource::SetName(nsString aName)
+{
+ mDeviceName = aName;
+ bool hasFacingMode = false;
+ VideoFacingModeEnum facingMode = VideoFacingModeEnum::User;
+
+ // Set facing mode based on device name.
+#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
+ // Names are generated. Example: "Camera 0, Facing back, Orientation 90"
+ //
+ // See media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/
+ // webrtc/videoengine/VideoCaptureDeviceInfoAndroid.java
+
+ if (aName.Find(NS_LITERAL_STRING("Facing back")) != kNotFound) {
+ hasFacingMode = true;
+ facingMode = VideoFacingModeEnum::Environment;
+ } else if (aName.Find(NS_LITERAL_STRING("Facing front")) != kNotFound) {
+ hasFacingMode = true;
+ facingMode = VideoFacingModeEnum::User;
+ }
+#endif // ANDROID
+#ifdef XP_MACOSX
+ // Kludge to test user-facing cameras on OSX.
+ if (aName.Find(NS_LITERAL_STRING("Face")) != -1) {
+ hasFacingMode = true;
+ facingMode = VideoFacingModeEnum::User;
+ }
+#endif
+#ifdef XP_WIN
+ // The cameras' name of Surface book are "Microsoft Camera Front" and
+ // "Microsoft Camera Rear" respectively.
+
+ if (aName.Find(NS_LITERAL_STRING("Front")) != kNotFound) {
+ hasFacingMode = true;
+ facingMode = VideoFacingModeEnum::User;
+ } else if (aName.Find(NS_LITERAL_STRING("Rear")) != kNotFound) {
+ hasFacingMode = true;
+ facingMode = VideoFacingModeEnum::Environment;
+ }
+#endif // WINDOWS
+ if (hasFacingMode) {
+ mFacingMode.Assign(NS_ConvertUTF8toUTF16(
+ VideoFacingModeEnumValues::strings[uint32_t(facingMode)].value));
+ } else {
+ mFacingMode.Truncate();
+ }
+}
+
+void
+MediaEngineCameraVideoSource::GetName(nsAString& aName) const
+{
+ aName = mDeviceName;
+}
+
+void
+MediaEngineCameraVideoSource::SetUUID(const char* aUUID)
+{
+ mUniqueId.Assign(aUUID);
+}
+
+void
+MediaEngineCameraVideoSource::GetUUID(nsACString& aUUID) const
+{
+ aUUID = mUniqueId;
+}
+
+const nsCString&
+MediaEngineCameraVideoSource::GetUUID() const
+{
+ return mUniqueId;
+}
+
+void
+MediaEngineCameraVideoSource::SetDirectListeners(bool aHasDirectListeners)
+{
+ LOG((__FUNCTION__));
+ mHasDirectListeners = aHasDirectListeners;
+}
+
+bool operator == (const webrtc::CaptureCapability& a,
+ const webrtc::CaptureCapability& b)
+{
+ return a.width == b.width &&
+ a.height == b.height &&
+ a.maxFPS == b.maxFPS &&
+ a.rawType == b.rawType &&
+ a.codecType == b.codecType &&
+ a.expectedCaptureDelay == b.expectedCaptureDelay &&
+ a.interlaced == b.interlaced;
+};
+
+bool operator != (const webrtc::CaptureCapability& a,
+ const webrtc::CaptureCapability& b)
+{
+ return !(a == b);
+}
+
+} // namespace mozilla
diff --git a/dom/media/webrtc/MediaEngineCameraVideoSource.h b/dom/media/webrtc/MediaEngineCameraVideoSource.h
new file mode 100644
index 000000000..fb9113cd6
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineCameraVideoSource.h
@@ -0,0 +1,132 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MediaEngineCameraVideoSource_h
+#define MediaEngineCameraVideoSource_h
+
+#include "MediaEngine.h"
+
+#include "nsDirectoryServiceDefs.h"
+
+// conflicts with #include of scoped_ptr.h
+#undef FF
+#include "webrtc/video_engine/include/vie_capture.h"
+
+namespace mozilla {
+
+bool operator == (const webrtc::CaptureCapability& a,
+ const webrtc::CaptureCapability& b);
+bool operator != (const webrtc::CaptureCapability& a,
+ const webrtc::CaptureCapability& b);
+
+class MediaEngineCameraVideoSource : public MediaEngineVideoSource
+{
+public:
+ // Some subclasses use an index to track multiple instances.
+ explicit MediaEngineCameraVideoSource(int aIndex,
+ const char* aMonitorName = "Camera.Monitor")
+ : MediaEngineVideoSource(kReleased)
+ , mMonitor(aMonitorName)
+ , mWidth(0)
+ , mHeight(0)
+ , mInitDone(false)
+ , mHasDirectListeners(false)
+ , mCaptureIndex(aIndex)
+ , mTrackID(0)
+ {}
+
+ explicit MediaEngineCameraVideoSource(const char* aMonitorName = "Camera.Monitor")
+ : MediaEngineCameraVideoSource(0, aMonitorName) {}
+
+ void GetName(nsAString& aName) const override;
+ void GetUUID(nsACString& aUUID) const override;
+ void SetDirectListeners(bool aHasListeners) override;
+
+ bool IsFake() override
+ {
+ return false;
+ }
+
+ nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const override;
+
+ void Shutdown() override {};
+
+protected:
+ struct CapabilityCandidate {
+ explicit CapabilityCandidate(uint8_t index, uint32_t distance = 0)
+ : mIndex(index), mDistance(distance) {}
+
+ size_t mIndex;
+ uint32_t mDistance;
+ };
+ typedef nsTArray<CapabilityCandidate> CapabilitySet;
+
+ ~MediaEngineCameraVideoSource() {}
+
+ // guts for appending data to the MSG track
+ virtual bool AppendToTrack(SourceMediaStream* aSource,
+ layers::Image* aImage,
+ TrackID aID,
+ StreamTime delta,
+ const PrincipalHandle& aPrincipalHandle);
+ uint32_t GetFitnessDistance(const webrtc::CaptureCapability& aCandidate,
+ const NormalizedConstraintSet &aConstraints,
+ const nsString& aDeviceId) const;
+ static void TrimLessFitCandidates(CapabilitySet& set);
+ static void LogConstraints(const NormalizedConstraintSet& aConstraints);
+ static void LogCapability(const char* aHeader,
+ const webrtc::CaptureCapability &aCapability,
+ uint32_t aDistance);
+ virtual size_t NumCapabilities() const;
+ virtual void GetCapability(size_t aIndex, webrtc::CaptureCapability& aOut) const;
+ virtual bool ChooseCapability(const NormalizedConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId);
+ void SetName(nsString aName);
+ void SetUUID(const char* aUUID);
+ const nsCString& GetUUID() const; // protected access
+
+ // Engine variables.
+
+ // mMonitor protects mImage access/changes, and transitions of mState
+ // from kStarted to kStopped (which are combined with EndTrack() and
+ // image changes).
+ // mMonitor also protects mSources[] and mPrincipalHandles[] access/changes.
+ // mSources[] and mPrincipalHandles[] are accessed from webrtc threads.
+
+ // All the mMonitor accesses are from the child classes.
+ Monitor mMonitor; // Monitor for processing Camera frames.
+ nsTArray<RefPtr<SourceMediaStream>> mSources; // When this goes empty, we shut down HW
+ nsTArray<PrincipalHandle> mPrincipalHandles; // Directly mapped to mSources.
+ RefPtr<layers::Image> mImage;
+ RefPtr<layers::ImageContainer> mImageContainer;
+ int mWidth, mHeight; // protected with mMonitor on Gonk due to different threading
+ // end of data protected by mMonitor
+
+
+ bool mInitDone;
+ bool mHasDirectListeners;
+ int mCaptureIndex;
+ TrackID mTrackID;
+
+ webrtc::CaptureCapability mCapability;
+
+ mutable nsTArray<webrtc::CaptureCapability> mHardcodedCapabilities;
+private:
+ nsString mDeviceName;
+ nsCString mUniqueId;
+ nsString mFacingMode;
+};
+
+
+} // namespace mozilla
+
+#endif // MediaEngineCameraVideoSource_h
diff --git a/dom/media/webrtc/MediaEngineDefault.cpp b/dom/media/webrtc/MediaEngineDefault.cpp
new file mode 100644
index 000000000..9c97d197f
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineDefault.cpp
@@ -0,0 +1,568 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaEngineDefault.h"
+
+#include "nsCOMPtr.h"
+#include "mozilla/dom/File.h"
+#include "mozilla/UniquePtr.h"
+#include "nsILocalFile.h"
+#include "Layers.h"
+#include "ImageContainer.h"
+#include "ImageTypes.h"
+#include "prmem.h"
+#include "nsContentUtils.h"
+#include "MediaStreamGraph.h"
+
+#include "nsIFilePicker.h"
+#include "nsIPrefService.h"
+#include "nsIPrefBranch.h"
+
+#ifdef MOZ_WIDGET_ANDROID
+#include "nsISupportsUtils.h"
+#endif
+
+#ifdef MOZ_WEBRTC
+#include "YuvStamper.h"
+#endif
+
+#define AUDIO_RATE mozilla::MediaEngine::DEFAULT_SAMPLE_RATE
+#define DEFAULT_AUDIO_TIMER_MS 10
+namespace mozilla {
+
+using namespace mozilla::gfx;
+
+NS_IMPL_ISUPPORTS(MediaEngineDefaultVideoSource, nsITimerCallback)
+/**
+ * Default video source.
+ */
+
+MediaEngineDefaultVideoSource::MediaEngineDefaultVideoSource()
+#ifdef MOZ_WEBRTC
+ : MediaEngineCameraVideoSource("FakeVideo.Monitor")
+#else
+ : MediaEngineVideoSource()
+#endif
+ , mTimer(nullptr)
+ , mMonitor("Fake video")
+ , mCb(16), mCr(16)
+{
+ mImageContainer =
+ layers::LayerManager::CreateImageContainer(layers::ImageContainer::ASYNCHRONOUS);
+}
+
+MediaEngineDefaultVideoSource::~MediaEngineDefaultVideoSource()
+{}
+
+void
+MediaEngineDefaultVideoSource::GetName(nsAString& aName) const
+{
+ aName.AssignLiteral(u"Default Video Device");
+ return;
+}
+
+void
+MediaEngineDefaultVideoSource::GetUUID(nsACString& aUUID) const
+{
+ aUUID.AssignLiteral("1041FCBD-3F12-4F7B-9E9B-1EC556DD5676");
+ return;
+}
+
+uint32_t
+MediaEngineDefaultVideoSource::GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const
+{
+ uint32_t distance = 0;
+#ifdef MOZ_WEBRTC
+ for (const auto* cs : aConstraintSets) {
+ distance = GetMinimumFitnessDistance(*cs, aDeviceId);
+ break; // distance is read from first entry only
+ }
+#endif
+ return distance;
+}
+
+nsresult
+MediaEngineDefaultVideoSource::Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint)
+{
+ if (mState != kReleased) {
+ return NS_ERROR_FAILURE;
+ }
+
+ FlattenedConstraints c(aConstraints);
+
+ // Mock failure for automated tests.
+ if (c.mDeviceId.mIdeal.find(NS_LITERAL_STRING("bad device")) !=
+ c.mDeviceId.mIdeal.end()) {
+ return NS_ERROR_FAILURE;
+ }
+
+
+ // emulator debug is very, very slow; reduce load on it with smaller/slower fake video
+ mOpts = aPrefs;
+ mOpts.mWidth = c.mWidth.Get(aPrefs.mWidth ? aPrefs.mWidth :
+#ifdef DEBUG
+ MediaEngine::DEFAULT_43_VIDEO_WIDTH/2
+#else
+ MediaEngine::DEFAULT_43_VIDEO_WIDTH
+#endif
+ );
+ mOpts.mHeight = c.mHeight.Get(aPrefs.mHeight ? aPrefs.mHeight :
+#ifdef DEBUG
+ MediaEngine::DEFAULT_43_VIDEO_HEIGHT/2
+#else
+ MediaEngine::DEFAULT_43_VIDEO_HEIGHT
+#endif
+ );
+ mOpts.mWidth = std::max(160, std::min(mOpts.mWidth, 4096));
+ mOpts.mHeight = std::max(90, std::min(mOpts.mHeight, 2160));
+ mState = kAllocated;
+ *aOutHandle = nullptr;
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultVideoSource::Deallocate(AllocationHandle* aHandle)
+{
+ MOZ_ASSERT(!aHandle);
+ if (mState != kStopped && mState != kAllocated) {
+ return NS_ERROR_FAILURE;
+ }
+ mState = kReleased;
+ mImage = nullptr;
+ return NS_OK;
+}
+
+static void AllocateSolidColorFrame(layers::PlanarYCbCrData& aData,
+ int aWidth, int aHeight,
+ int aY, int aCb, int aCr)
+{
+ MOZ_ASSERT(!(aWidth&1));
+ MOZ_ASSERT(!(aHeight&1));
+ // Allocate a single frame with a solid color
+ int yLen = aWidth*aHeight;
+ int cbLen = yLen>>2;
+ int crLen = cbLen;
+ uint8_t* frame = (uint8_t*) PR_Malloc(yLen+cbLen+crLen);
+ memset(frame, aY, yLen);
+ memset(frame+yLen, aCb, cbLen);
+ memset(frame+yLen+cbLen, aCr, crLen);
+
+ aData.mYChannel = frame;
+ aData.mYSize = IntSize(aWidth, aHeight);
+ aData.mYStride = aWidth;
+ aData.mCbCrStride = aWidth>>1;
+ aData.mCbChannel = frame + yLen;
+ aData.mCrChannel = aData.mCbChannel + cbLen;
+ aData.mCbCrSize = IntSize(aWidth>>1, aHeight>>1);
+ aData.mPicX = 0;
+ aData.mPicY = 0;
+ aData.mPicSize = IntSize(aWidth, aHeight);
+ aData.mStereoMode = StereoMode::MONO;
+}
+
+static void ReleaseFrame(layers::PlanarYCbCrData& aData)
+{
+ PR_Free(aData.mYChannel);
+}
+
+nsresult
+MediaEngineDefaultVideoSource::Start(SourceMediaStream* aStream, TrackID aID,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ if (mState != kAllocated) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+ if (!mTimer) {
+ return NS_ERROR_FAILURE;
+ }
+
+ aStream->AddTrack(aID, 0, new VideoSegment(), SourceMediaStream::ADDTRACK_QUEUED);
+
+ // Remember TrackID so we can end it later
+ mTrackID = aID;
+
+ // Start timer for subsequent frames
+#if (defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID)) && defined(DEBUG)
+// emulator debug is very, very slow and has problems dealing with realtime audio inputs
+ mTimer->InitWithCallback(this, (1000 / mOpts.mFPS)*10, nsITimer::TYPE_REPEATING_SLACK);
+#else
+ mTimer->InitWithCallback(this, 1000 / mOpts.mFPS, nsITimer::TYPE_REPEATING_SLACK);
+#endif
+ mState = kStarted;
+
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultVideoSource::Stop(SourceMediaStream *aSource, TrackID aID)
+{
+ if (mState != kStarted) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!mTimer) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mTimer->Cancel();
+ mTimer = nullptr;
+
+ aSource->EndTrack(aID);
+
+ mState = kStopped;
+ mImage = nullptr;
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultVideoSource::Restart(
+ AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaEngineDefaultVideoSource::Notify(nsITimer* aTimer)
+{
+ // Update the target color
+ if (mCr <= 16) {
+ if (mCb < 240) {
+ mCb++;
+ } else {
+ mCr++;
+ }
+ } else if (mCb >= 240) {
+ if (mCr < 240) {
+ mCr++;
+ } else {
+ mCb--;
+ }
+ } else if (mCr >= 240) {
+ if (mCb > 16) {
+ mCb--;
+ } else {
+ mCr--;
+ }
+ } else {
+ mCr--;
+ }
+
+ // Allocate a single solid color image
+ RefPtr<layers::PlanarYCbCrImage> ycbcr_image = mImageContainer->CreatePlanarYCbCrImage();
+ layers::PlanarYCbCrData data;
+ AllocateSolidColorFrame(data, mOpts.mWidth, mOpts.mHeight, 0x80, mCb, mCr);
+
+#ifdef MOZ_WEBRTC
+ uint64_t timestamp = PR_Now();
+ YuvStamper::Encode(mOpts.mWidth, mOpts.mHeight, mOpts.mWidth,
+ data.mYChannel,
+ reinterpret_cast<unsigned char*>(&timestamp), sizeof(timestamp),
+ 0, 0);
+#endif
+
+ bool setData = ycbcr_image->CopyData(data);
+ MOZ_ASSERT(setData);
+
+ // SetData copies data, so we can free the frame
+ ReleaseFrame(data);
+
+ if (!setData) {
+ return NS_ERROR_FAILURE;
+ }
+
+ MonitorAutoLock lock(mMonitor);
+
+ // implicitly releases last image
+ mImage = ycbcr_image.forget();
+
+ return NS_OK;
+}
+
+void
+MediaEngineDefaultVideoSource::NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream *aSource,
+ TrackID aID,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ // AddTrack takes ownership of segment
+ VideoSegment segment;
+ MonitorAutoLock lock(mMonitor);
+ if (mState != kStarted) {
+ return;
+ }
+
+ // Note: we're not giving up mImage here
+ RefPtr<layers::Image> image = mImage;
+ StreamTime delta = aDesiredTime - aSource->GetEndOfAppendedData(aID);
+
+ if (delta > 0) {
+ // nullptr images are allowed
+ IntSize size(image ? mOpts.mWidth : 0, image ? mOpts.mHeight : 0);
+ segment.AppendFrame(image.forget(), delta, size, aPrincipalHandle);
+ // This can fail if either a) we haven't added the track yet, or b)
+ // we've removed or finished the track.
+ aSource->AppendToTrack(aID, &segment);
+ }
+}
+
+// generate 1k sine wave per second
+class SineWaveGenerator
+{
+public:
+ static const int bytesPerSample = 2;
+ static const int millisecondsPerSecond = PR_MSEC_PER_SEC;
+
+ explicit SineWaveGenerator(uint32_t aSampleRate, uint32_t aFrequency) :
+ mTotalLength(aSampleRate / aFrequency),
+ mReadLength(0) {
+ // If we allow arbitrary frequencies, there's no guarantee we won't get rounded here
+ // We could include an error term and adjust for it in generation; not worth the trouble
+ //MOZ_ASSERT(mTotalLength * aFrequency == aSampleRate);
+ mAudioBuffer = MakeUnique<int16_t[]>(mTotalLength);
+ for (int i = 0; i < mTotalLength; i++) {
+ // Set volume to -20db. It's from 32768.0 * 10^(-20/20) = 3276.8
+ mAudioBuffer[i] = (3276.8f * sin(2 * M_PI * i / mTotalLength));
+ }
+ }
+
+ // NOTE: only safely called from a single thread (MSG callback)
+ void generate(int16_t* aBuffer, int16_t aLengthInSamples) {
+ int16_t remaining = aLengthInSamples;
+
+ while (remaining) {
+ int16_t processSamples = 0;
+
+ if (mTotalLength - mReadLength >= remaining) {
+ processSamples = remaining;
+ } else {
+ processSamples = mTotalLength - mReadLength;
+ }
+ memcpy(aBuffer, &mAudioBuffer[mReadLength], processSamples * bytesPerSample);
+ aBuffer += processSamples;
+ mReadLength += processSamples;
+ remaining -= processSamples;
+ if (mReadLength == mTotalLength) {
+ mReadLength = 0;
+ }
+ }
+ }
+
+private:
+ UniquePtr<int16_t[]> mAudioBuffer;
+ int16_t mTotalLength;
+ int16_t mReadLength;
+};
+
+/**
+ * Default audio source.
+ */
+
+NS_IMPL_ISUPPORTS0(MediaEngineDefaultAudioSource)
+
+MediaEngineDefaultAudioSource::MediaEngineDefaultAudioSource()
+ : MediaEngineAudioSource(kReleased)
+ , mLastNotify(0)
+{}
+
+MediaEngineDefaultAudioSource::~MediaEngineDefaultAudioSource()
+{}
+
+void
+MediaEngineDefaultAudioSource::GetName(nsAString& aName) const
+{
+ aName.AssignLiteral(u"Default Audio Device");
+ return;
+}
+
+void
+MediaEngineDefaultAudioSource::GetUUID(nsACString& aUUID) const
+{
+ aUUID.AssignLiteral("B7CBD7C1-53EF-42F9-8353-73F61C70C092");
+ return;
+}
+
+uint32_t
+MediaEngineDefaultAudioSource::GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const
+{
+ uint32_t distance = 0;
+#ifdef MOZ_WEBRTC
+ for (const auto* cs : aConstraintSets) {
+ distance = GetMinimumFitnessDistance(*cs, aDeviceId);
+ break; // distance is read from first entry only
+ }
+#endif
+ return distance;
+}
+
+nsresult
+MediaEngineDefaultAudioSource::Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint)
+{
+ if (mState != kReleased) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Mock failure for automated tests.
+ if (aConstraints.mDeviceId.IsString() &&
+ aConstraints.mDeviceId.GetAsString().EqualsASCII("bad device")) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mState = kAllocated;
+ // generate sine wave (default 1KHz)
+ mSineGenerator = new SineWaveGenerator(AUDIO_RATE,
+ static_cast<uint32_t>(aPrefs.mFreq ? aPrefs.mFreq : 1000));
+ *aOutHandle = nullptr;
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultAudioSource::Deallocate(AllocationHandle* aHandle)
+{
+ MOZ_ASSERT(!aHandle);
+ if (mState != kStopped && mState != kAllocated) {
+ return NS_ERROR_FAILURE;
+ }
+ mState = kReleased;
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultAudioSource::Start(SourceMediaStream* aStream, TrackID aID,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ if (mState != kAllocated) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // AddTrack will take ownership of segment
+ AudioSegment* segment = new AudioSegment();
+ aStream->AddAudioTrack(aID, AUDIO_RATE, 0, segment, SourceMediaStream::ADDTRACK_QUEUED);
+
+ // Remember TrackID so we can finish later
+ mTrackID = aID;
+
+ mLastNotify = 0;
+ mState = kStarted;
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultAudioSource::Stop(SourceMediaStream *aSource, TrackID aID)
+{
+ if (mState != kStarted) {
+ return NS_ERROR_FAILURE;
+ }
+ aSource->EndTrack(aID);
+
+ mState = kStopped;
+ return NS_OK;
+}
+
+nsresult
+MediaEngineDefaultAudioSource::Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ return NS_OK;
+}
+
+void
+MediaEngineDefaultAudioSource::AppendToSegment(AudioSegment& aSegment,
+ TrackTicks aSamples,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ RefPtr<SharedBuffer> buffer = SharedBuffer::Create(aSamples * sizeof(int16_t));
+ int16_t* dest = static_cast<int16_t*>(buffer->Data());
+
+ mSineGenerator->generate(dest, aSamples);
+ AutoTArray<const int16_t*,1> channels;
+ channels.AppendElement(dest);
+ aSegment.AppendFrames(buffer.forget(), channels, aSamples, aPrincipalHandle);
+}
+
+void
+MediaEngineDefaultAudioSource::NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream *aSource,
+ TrackID aID,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ MOZ_ASSERT(aID == mTrackID);
+ AudioSegment segment;
+ // avoid accumulating rounding errors
+ TrackTicks desired = aSource->TimeToTicksRoundUp(AUDIO_RATE, aDesiredTime);
+ TrackTicks delta = desired - mLastNotify;
+ mLastNotify += delta;
+ AppendToSegment(segment, delta, aPrincipalHandle);
+ aSource->AppendToTrack(mTrackID, &segment);
+}
+
+void
+MediaEngineDefault::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
+ nsTArray<RefPtr<MediaEngineVideoSource> >* aVSources) {
+ MutexAutoLock lock(mMutex);
+
+ // only supports camera sources (for now). See Bug 1038241
+ if (aMediaSource != dom::MediaSourceEnum::Camera) {
+ return;
+ }
+
+ // We once had code here to find a VideoSource with the same settings and re-use that.
+ // This no longer is possible since the resolution is being set in Allocate().
+
+ RefPtr<MediaEngineVideoSource> newSource = new MediaEngineDefaultVideoSource();
+ mVSources.AppendElement(newSource);
+ aVSources->AppendElement(newSource);
+
+ return;
+}
+
+void
+MediaEngineDefault::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
+ nsTArray<RefPtr<MediaEngineAudioSource> >* aASources) {
+ MutexAutoLock lock(mMutex);
+ int32_t len = mASources.Length();
+
+ // aMediaSource is ignored for audio devices (for now).
+
+ for (int32_t i = 0; i < len; i++) {
+ RefPtr<MediaEngineAudioSource> source = mASources.ElementAt(i);
+ if (source->IsAvailable()) {
+ aASources->AppendElement(source);
+ }
+ }
+
+ // All streams are currently busy, just make a new one.
+ if (aASources->Length() == 0) {
+ RefPtr<MediaEngineAudioSource> newSource =
+ new MediaEngineDefaultAudioSource();
+ mASources.AppendElement(newSource);
+ aASources->AppendElement(newSource);
+ }
+ return;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webrtc/MediaEngineDefault.h b/dom/media/webrtc/MediaEngineDefault.h
new file mode 100644
index 000000000..c305e00bb
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineDefault.h
@@ -0,0 +1,215 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIAENGINEDEFAULT_H_
+#define MEDIAENGINEDEFAULT_H_
+
+#include "nsITimer.h"
+
+#include "nsAutoPtr.h"
+#include "nsCOMPtr.h"
+#include "DOMMediaStream.h"
+#include "nsComponentManagerUtils.h"
+#include "mozilla/Monitor.h"
+
+#include "VideoUtils.h"
+#include "MediaEngine.h"
+#include "VideoSegment.h"
+#include "AudioSegment.h"
+#include "StreamTracks.h"
+#ifdef MOZ_WEBRTC
+#include "MediaEngineCameraVideoSource.h"
+#endif
+#include "MediaStreamGraph.h"
+#include "MediaTrackConstraints.h"
+
+namespace mozilla {
+
+namespace layers {
+class ImageContainer;
+} // namespace layers
+
+class MediaEngineDefault;
+
+/**
+ * The default implementation of the MediaEngine interface.
+ */
+class MediaEngineDefaultVideoSource : public nsITimerCallback,
+#ifdef MOZ_WEBRTC
+ public MediaEngineCameraVideoSource
+#else
+ public MediaEngineVideoSource
+#endif
+{
+public:
+ MediaEngineDefaultVideoSource();
+
+ void GetName(nsAString&) const override;
+ void GetUUID(nsACString&) const override;
+
+ nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint) override;
+ nsresult Deallocate(AllocationHandle* aHandle) override;
+ nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override;
+ nsresult Stop(SourceMediaStream*, TrackID) override;
+ nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+ void SetDirectListeners(bool aHasDirectListeners) override {};
+ void NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream *aSource,
+ TrackID aId,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle) override;
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const override;
+
+ bool IsFake() override {
+ return true;
+ }
+
+ dom::MediaSourceEnum GetMediaSource() const override {
+ return dom::MediaSourceEnum::Camera;
+ }
+
+ nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSITIMERCALLBACK
+
+protected:
+ ~MediaEngineDefaultVideoSource();
+
+ friend class MediaEngineDefault;
+
+ TrackID mTrackID;
+ nsCOMPtr<nsITimer> mTimer;
+ // mMonitor protects mImage access/changes, and transitions of mState
+ // from kStarted to kStopped (which are combined with EndTrack() and
+ // image changes).
+ Monitor mMonitor;
+ RefPtr<layers::Image> mImage;
+
+ RefPtr<layers::ImageContainer> mImageContainer;
+
+ MediaEnginePrefs mOpts;
+ int mCb;
+ int mCr;
+};
+
+class SineWaveGenerator;
+
+class MediaEngineDefaultAudioSource : public MediaEngineAudioSource
+{
+public:
+ MediaEngineDefaultAudioSource();
+
+ void GetName(nsAString&) const override;
+ void GetUUID(nsACString&) const override;
+
+ nsresult Allocate(const dom::MediaTrackConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint) override;
+ nsresult Deallocate(AllocationHandle* aHandle) override;
+ nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override;
+ nsresult Stop(SourceMediaStream*, TrackID) override;
+ nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+ void SetDirectListeners(bool aHasDirectListeners) override {};
+ void inline AppendToSegment(AudioSegment& aSegment,
+ TrackTicks aSamples,
+ const PrincipalHandle& aPrincipalHandle);
+ void NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream *aSource,
+ TrackID aId,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle) override;
+
+ void NotifyOutputData(MediaStreamGraph* aGraph,
+ AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override
+ {}
+ void NotifyInputData(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override
+ {}
+ void DeviceChanged() override
+ {}
+ bool IsFake() override {
+ return true;
+ }
+
+ dom::MediaSourceEnum GetMediaSource() const override {
+ return dom::MediaSourceEnum::Microphone;
+ }
+
+ nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const override;
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+protected:
+ ~MediaEngineDefaultAudioSource();
+
+ TrackID mTrackID;
+
+ TrackTicks mLastNotify; // Accessed in ::Start(), then on NotifyPull (from MSG thread)
+
+ // Created on Allocate, then accessed from NotifyPull (MSG thread)
+ nsAutoPtr<SineWaveGenerator> mSineGenerator;
+};
+
+
+class MediaEngineDefault : public MediaEngine
+{
+ typedef MediaEngine Super;
+public:
+ explicit MediaEngineDefault() : mMutex("mozilla::MediaEngineDefault") {}
+
+ void EnumerateVideoDevices(dom::MediaSourceEnum,
+ nsTArray<RefPtr<MediaEngineVideoSource> >*) override;
+ void EnumerateAudioDevices(dom::MediaSourceEnum,
+ nsTArray<RefPtr<MediaEngineAudioSource> >*) override;
+ void Shutdown() override {
+ MutexAutoLock lock(mMutex);
+
+ mVSources.Clear();
+ mASources.Clear();
+ };
+
+private:
+ ~MediaEngineDefault() {}
+
+ Mutex mMutex;
+ // protected with mMutex:
+
+ nsTArray<RefPtr<MediaEngineVideoSource> > mVSources;
+ nsTArray<RefPtr<MediaEngineAudioSource> > mASources;
+};
+
+} // namespace mozilla
+
+#endif /* NSMEDIAENGINEDEFAULT_H_ */
diff --git a/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp b/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp
new file mode 100644
index 000000000..881d85b4a
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp
@@ -0,0 +1,509 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaEngineRemoteVideoSource.h"
+
+#include "mozilla/RefPtr.h"
+#include "VideoUtils.h"
+#include "nsIPrefService.h"
+#include "MediaTrackConstraints.h"
+#include "CamerasChild.h"
+
+extern mozilla::LogModule* GetMediaManagerLog();
+#define LOG(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Debug, msg)
+#define LOGFRAME(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Verbose, msg)
+
+namespace mozilla {
+
+// These need a definition somewhere because template
+// code is allowed to take their address, and they aren't
+// guaranteed to have one without this.
+const unsigned int MediaEngineSource::kMaxDeviceNameLength;
+const unsigned int MediaEngineSource::kMaxUniqueIdLength;;
+
+using dom::ConstrainLongRange;
+
+NS_IMPL_ISUPPORTS0(MediaEngineRemoteVideoSource)
+
+MediaEngineRemoteVideoSource::MediaEngineRemoteVideoSource(
+ int aIndex, mozilla::camera::CaptureEngine aCapEngine,
+ dom::MediaSourceEnum aMediaSource, bool aScary, const char* aMonitorName)
+ : MediaEngineCameraVideoSource(aIndex, aMonitorName),
+ mMediaSource(aMediaSource),
+ mCapEngine(aCapEngine),
+ mScary(aScary)
+{
+ MOZ_ASSERT(aMediaSource != dom::MediaSourceEnum::Other);
+ mSettings.mWidth.Construct(0);
+ mSettings.mHeight.Construct(0);
+ mSettings.mFrameRate.Construct(0);
+ Init();
+}
+
+void
+MediaEngineRemoteVideoSource::Init()
+{
+ LOG((__PRETTY_FUNCTION__));
+ char deviceName[kMaxDeviceNameLength];
+ char uniqueId[kMaxUniqueIdLength];
+ if (mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::GetCaptureDevice,
+ mCapEngine, mCaptureIndex,
+ deviceName, kMaxDeviceNameLength,
+ uniqueId, kMaxUniqueIdLength, nullptr)) {
+ LOG(("Error initializing RemoteVideoSource (GetCaptureDevice)"));
+ return;
+ }
+
+ SetName(NS_ConvertUTF8toUTF16(deviceName));
+ SetUUID(uniqueId);
+
+ mInitDone = true;
+
+ return;
+}
+
+void
+MediaEngineRemoteVideoSource::Shutdown()
+{
+ LOG((__PRETTY_FUNCTION__));
+ if (!mInitDone) {
+ return;
+ }
+ Super::Shutdown();
+ if (mState == kStarted) {
+ SourceMediaStream *source;
+ bool empty;
+
+ while (1) {
+ {
+ MonitorAutoLock lock(mMonitor);
+ empty = mSources.IsEmpty();
+ if (empty) {
+ MOZ_ASSERT(mPrincipalHandles.IsEmpty());
+ break;
+ }
+ source = mSources[0];
+ }
+ Stop(source, kVideoTrack); // XXX change to support multiple tracks
+ }
+ MOZ_ASSERT(mState == kStopped);
+ }
+
+ for (auto& registered : mRegisteredHandles) {
+ MOZ_ASSERT(mState == kAllocated || mState == kStopped);
+ Deallocate(registered.get());
+ }
+
+ MOZ_ASSERT(mState == kReleased);
+ mInitDone = false;
+ return;
+}
+
+nsresult
+MediaEngineRemoteVideoSource::Allocate(
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint)
+{
+ LOG((__PRETTY_FUNCTION__));
+ AssertIsOnOwningThread();
+
+ if (!mInitDone) {
+ LOG(("Init not done"));
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult rv = Super::Allocate(aConstraints, aPrefs, aDeviceId, aOrigin,
+ aOutHandle, aOutBadConstraint);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+ if (mState == kStarted &&
+ MOZ_LOG_TEST(GetMediaManagerLog(), mozilla::LogLevel::Debug)) {
+ MonitorAutoLock lock(mMonitor);
+ if (mSources.IsEmpty()) {
+ MOZ_ASSERT(mPrincipalHandles.IsEmpty());
+ LOG(("Video device %d reallocated", mCaptureIndex));
+ } else {
+ LOG(("Video device %d allocated shared", mCaptureIndex));
+ }
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaEngineRemoteVideoSource::Deallocate(AllocationHandle* aHandle)
+{
+ LOG((__PRETTY_FUNCTION__));
+ AssertIsOnOwningThread();
+
+ Super::Deallocate(aHandle);
+
+ if (!mRegisteredHandles.Length()) {
+ if (mState != kStopped && mState != kAllocated) {
+ return NS_ERROR_FAILURE;
+ }
+ mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::ReleaseCaptureDevice,
+ mCapEngine, mCaptureIndex);
+ mState = kReleased;
+ LOG(("Video device %d deallocated", mCaptureIndex));
+ } else {
+ LOG(("Video device %d deallocated but still in use", mCaptureIndex));
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaEngineRemoteVideoSource::Start(SourceMediaStream* aStream, TrackID aID,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ LOG((__PRETTY_FUNCTION__));
+ AssertIsOnOwningThread();
+ if (!mInitDone || !aStream) {
+ LOG(("No stream or init not done"));
+ return NS_ERROR_FAILURE;
+ }
+
+ {
+ MonitorAutoLock lock(mMonitor);
+ mSources.AppendElement(aStream);
+ mPrincipalHandles.AppendElement(aPrincipalHandle);
+ MOZ_ASSERT(mSources.Length() == mPrincipalHandles.Length());
+ }
+
+ aStream->AddTrack(aID, 0, new VideoSegment(), SourceMediaStream::ADDTRACK_QUEUED);
+
+ if (mState == kStarted) {
+ return NS_OK;
+ }
+ mImageContainer =
+ layers::LayerManager::CreateImageContainer(layers::ImageContainer::ASYNCHRONOUS);
+
+ mState = kStarted;
+ mTrackID = aID;
+
+ if (mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::StartCapture,
+ mCapEngine, mCaptureIndex, mCapability, this)) {
+ LOG(("StartCapture failed"));
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+MediaEngineRemoteVideoSource::Stop(mozilla::SourceMediaStream* aSource,
+ mozilla::TrackID aID)
+{
+ LOG((__PRETTY_FUNCTION__));
+ AssertIsOnOwningThread();
+ {
+ MonitorAutoLock lock(mMonitor);
+
+ // Drop any cached image so we don't start with a stale image on next
+ // usage
+ mImage = nullptr;
+
+ size_t i = mSources.IndexOf(aSource);
+ if (i == mSources.NoIndex) {
+ // Already stopped - this is allowed
+ return NS_OK;
+ }
+
+ MOZ_ASSERT(mSources.Length() == mPrincipalHandles.Length());
+ mSources.RemoveElementAt(i);
+ mPrincipalHandles.RemoveElementAt(i);
+
+ aSource->EndTrack(aID);
+
+ if (!mSources.IsEmpty()) {
+ return NS_OK;
+ }
+ if (mState != kStarted) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mState = kStopped;
+ }
+
+ mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::StopCapture,
+ mCapEngine, mCaptureIndex);
+
+ return NS_OK;
+}
+
+nsresult
+MediaEngineRemoteVideoSource::Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ AssertIsOnOwningThread();
+ if (!mInitDone) {
+ LOG(("Init not done"));
+ return NS_ERROR_FAILURE;
+ }
+ MOZ_ASSERT(aHandle);
+ NormalizedConstraints constraints(aConstraints);
+ return ReevaluateAllocation(aHandle, &constraints, aPrefs, aDeviceId,
+ aOutBadConstraint);
+}
+
+nsresult
+MediaEngineRemoteVideoSource::UpdateSingleSource(
+ const AllocationHandle* aHandle,
+ const NormalizedConstraints& aNetConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ if (!ChooseCapability(aNetConstraints, aPrefs, aDeviceId)) {
+ *aOutBadConstraint = FindBadConstraint(aNetConstraints, *this, aDeviceId);
+ return NS_ERROR_FAILURE;
+ }
+
+ switch (mState) {
+ case kReleased:
+ MOZ_ASSERT(aHandle);
+ if (camera::GetChildAndCall(&camera::CamerasChild::AllocateCaptureDevice,
+ mCapEngine, GetUUID().get(),
+ kMaxUniqueIdLength, mCaptureIndex,
+ aHandle->mOrigin)) {
+ return NS_ERROR_FAILURE;
+ }
+ mState = kAllocated;
+ SetLastCapability(mCapability);
+ LOG(("Video device %d allocated for %s", mCaptureIndex,
+ aHandle->mOrigin.get()));
+ break;
+
+ case kStarted:
+ if (mCapability != mLastCapability) {
+ camera::GetChildAndCall(&camera::CamerasChild::StopCapture,
+ mCapEngine, mCaptureIndex);
+ if (camera::GetChildAndCall(&camera::CamerasChild::StartCapture,
+ mCapEngine, mCaptureIndex, mCapability,
+ this)) {
+ LOG(("StartCapture failed"));
+ return NS_ERROR_FAILURE;
+ }
+ SetLastCapability(mCapability);
+ }
+ break;
+
+ default:
+ LOG(("Video device %d %s in ignored state %d", mCaptureIndex,
+ (aHandle? aHandle->mOrigin.get() : ""), mState));
+ break;
+ }
+ return NS_OK;
+}
+
+void
+MediaEngineRemoteVideoSource::SetLastCapability(
+ const webrtc::CaptureCapability& aCapability)
+{
+ mLastCapability = mCapability;
+
+ webrtc::CaptureCapability cap = aCapability;
+ RefPtr<MediaEngineRemoteVideoSource> that = this;
+
+ NS_DispatchToMainThread(media::NewRunnableFrom([that, cap]() mutable {
+ that->mSettings.mWidth.Value() = cap.width;
+ that->mSettings.mHeight.Value() = cap.height;
+ that->mSettings.mFrameRate.Value() = cap.maxFPS;
+ return NS_OK;
+ }));
+}
+
+void
+MediaEngineRemoteVideoSource::NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream* aSource,
+ TrackID aID, StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ VideoSegment segment;
+
+ MonitorAutoLock lock(mMonitor);
+ if (mState != kStarted) {
+ return;
+ }
+
+ StreamTime delta = aDesiredTime - aSource->GetEndOfAppendedData(aID);
+
+ if (delta > 0) {
+ // nullptr images are allowed
+ AppendToTrack(aSource, mImage, aID, delta, aPrincipalHandle);
+ }
+}
+
+int
+MediaEngineRemoteVideoSource::FrameSizeChange(unsigned int w, unsigned int h,
+ unsigned int streams)
+{
+ mWidth = w;
+ mHeight = h;
+ LOG(("MediaEngineRemoteVideoSource Video FrameSizeChange: %ux%u", w, h));
+ return 0;
+}
+
+int
+MediaEngineRemoteVideoSource::DeliverFrame(unsigned char* buffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time,
+ void *handle)
+{
+ // Check for proper state.
+ if (mState != kStarted) {
+ LOG(("DeliverFrame: video not started"));
+ return 0;
+ }
+
+ if ((size_t) (mWidth*mHeight + 2*(((mWidth+1)/2)*((mHeight+1)/2))) != size) {
+ MOZ_ASSERT(false, "Wrong size frame in DeliverFrame!");
+ return 0;
+ }
+
+ // Create a video frame and append it to the track.
+ RefPtr<layers::PlanarYCbCrImage> image = mImageContainer->CreatePlanarYCbCrImage();
+
+ uint8_t* frame = static_cast<uint8_t*> (buffer);
+ const uint8_t lumaBpp = 8;
+ const uint8_t chromaBpp = 4;
+
+ // Take lots of care to round up!
+ layers::PlanarYCbCrData data;
+ data.mYChannel = frame;
+ data.mYSize = IntSize(mWidth, mHeight);
+ data.mYStride = (mWidth * lumaBpp + 7)/ 8;
+ data.mCbCrStride = (mWidth * chromaBpp + 7) / 8;
+ data.mCbChannel = frame + mHeight * data.mYStride;
+ data.mCrChannel = data.mCbChannel + ((mHeight+1)/2) * data.mCbCrStride;
+ data.mCbCrSize = IntSize((mWidth+1)/ 2, (mHeight+1)/ 2);
+ data.mPicX = 0;
+ data.mPicY = 0;
+ data.mPicSize = IntSize(mWidth, mHeight);
+ data.mStereoMode = StereoMode::MONO;
+
+ if (!image->CopyData(data)) {
+ MOZ_ASSERT(false);
+ return 0;
+ }
+
+#ifdef DEBUG
+ static uint32_t frame_num = 0;
+ LOGFRAME(("frame %d (%dx%d); timestamp %u, ntp_time %" PRIu64 ", render_time %" PRIu64,
+ frame_num++, mWidth, mHeight, time_stamp, ntp_time, render_time));
+#endif
+
+ // we don't touch anything in 'this' until here (except for snapshot,
+ // which has it's own lock)
+ MonitorAutoLock lock(mMonitor);
+
+ // implicitly releases last image
+ mImage = image.forget();
+
+ // We'll push the frame into the MSG on the next NotifyPull. This will avoid
+ // swamping the MSG with frames should it be taking longer than normal to run
+ // an iteration.
+
+ return 0;
+}
+
+size_t
+MediaEngineRemoteVideoSource::NumCapabilities() const
+{
+ mHardcodedCapabilities.Clear();
+ int num = mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::NumberOfCapabilities,
+ mCapEngine,
+ GetUUID().get());
+ if (num < 1) {
+ // The default for devices that don't return discrete capabilities: treat
+ // them as supporting all capabilities orthogonally. E.g. screensharing.
+ // CaptureCapability defaults key values to 0, which means accept any value.
+ mHardcodedCapabilities.AppendElement(webrtc::CaptureCapability());
+ num = mHardcodedCapabilities.Length(); // 1
+ }
+ return num;
+}
+
+bool
+MediaEngineRemoteVideoSource::ChooseCapability(
+ const NormalizedConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId)
+{
+ AssertIsOnOwningThread();
+
+ switch(mMediaSource) {
+ case dom::MediaSourceEnum::Screen:
+ case dom::MediaSourceEnum::Window:
+ case dom::MediaSourceEnum::Application: {
+ FlattenedConstraints c(aConstraints);
+ // The actual resolution to constrain around is not easy to find ahead of
+ // time (and may in fact change over time), so as a hack, we push ideal
+ // and max constraints down to desktop_capture_impl.cc and finish the
+ // algorithm there.
+ mCapability.width = (c.mWidth.mIdeal.valueOr(0) & 0xffff) << 16 |
+ (c.mWidth.mMax & 0xffff);
+ mCapability.height = (c.mHeight.mIdeal.valueOr(0) & 0xffff) << 16 |
+ (c.mHeight.mMax & 0xffff);
+ mCapability.maxFPS = c.mFrameRate.Clamp(c.mFrameRate.mIdeal.valueOr(aPrefs.mFPS));
+ return true;
+ }
+ default:
+ return MediaEngineCameraVideoSource::ChooseCapability(aConstraints, aPrefs, aDeviceId);
+ }
+
+}
+
+void
+MediaEngineRemoteVideoSource::GetCapability(size_t aIndex,
+ webrtc::CaptureCapability& aOut) const
+{
+ if (!mHardcodedCapabilities.IsEmpty()) {
+ MediaEngineCameraVideoSource::GetCapability(aIndex, aOut);
+ }
+ mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::GetCaptureCapability,
+ mCapEngine,
+ GetUUID().get(),
+ aIndex,
+ aOut);
+}
+
+void MediaEngineRemoteVideoSource::Refresh(int aIndex) {
+ // NOTE: mCaptureIndex might have changed when allocated!
+ // Use aIndex to update information, but don't change mCaptureIndex!!
+ // Caller looked up this source by uniqueId, so it shouldn't change
+ char deviceName[kMaxDeviceNameLength];
+ char uniqueId[kMaxUniqueIdLength];
+
+ if (mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::GetCaptureDevice,
+ mCapEngine, aIndex,
+ deviceName, sizeof(deviceName),
+ uniqueId, sizeof(uniqueId), nullptr)) {
+ return;
+ }
+
+ SetName(NS_ConvertUTF8toUTF16(deviceName));
+#ifdef DEBUG
+ MOZ_ASSERT(GetUUID().Equals(uniqueId));
+#endif
+}
+
+}
diff --git a/dom/media/webrtc/MediaEngineRemoteVideoSource.h b/dom/media/webrtc/MediaEngineRemoteVideoSource.h
new file mode 100644
index 000000000..923e65654
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineRemoteVideoSource.h
@@ -0,0 +1,136 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIAENGINE_REMOTE_VIDEO_SOURCE_H_
+#define MEDIAENGINE_REMOTE_VIDEO_SOURCE_H_
+
+#include "prcvar.h"
+#include "prthread.h"
+#include "nsIThread.h"
+#include "nsIRunnable.h"
+
+#include "mozilla/Mutex.h"
+#include "mozilla/Monitor.h"
+#include "nsCOMPtr.h"
+#include "nsThreadUtils.h"
+#include "DOMMediaStream.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsComponentManagerUtils.h"
+
+#include "VideoUtils.h"
+#include "MediaEngineCameraVideoSource.h"
+#include "VideoSegment.h"
+#include "AudioSegment.h"
+#include "StreamTracks.h"
+#include "MediaStreamGraph.h"
+
+#include "MediaEngineWrapper.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+
+// WebRTC library includes follow
+#include "webrtc/common.h"
+#include "webrtc/video_engine/include/vie_capture.h"
+#include "webrtc/video_engine/include/vie_render.h"
+#include "CamerasChild.h"
+
+#include "NullTransport.h"
+
+namespace webrtc {
+class I420VideoFrame;
+}
+
+namespace mozilla {
+
+/**
+ * The WebRTC implementation of the MediaEngine interface.
+ */
+class MediaEngineRemoteVideoSource : public MediaEngineCameraVideoSource,
+ public webrtc::ExternalRenderer
+{
+ typedef MediaEngineCameraVideoSource Super;
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ // ExternalRenderer
+ int FrameSizeChange(unsigned int w, unsigned int h,
+ unsigned int streams) override;
+ int DeliverFrame(unsigned char* buffer,
+ size_t size,
+ uint32_t time_stamp,
+ int64_t ntp_time,
+ int64_t render_time,
+ void *handle) override;
+ // XXX!!!! FIX THIS
+ int DeliverI420Frame(const webrtc::I420VideoFrame& webrtc_frame) override { return 0; };
+ bool IsTextureSupported() override { return false; };
+
+ // MediaEngineCameraVideoSource
+ MediaEngineRemoteVideoSource(int aIndex, mozilla::camera::CaptureEngine aCapEngine,
+ dom::MediaSourceEnum aMediaSource,
+ bool aScary = false,
+ const char* aMonitorName = "RemoteVideo.Monitor");
+
+ nsresult Allocate(const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint) override;
+ nsresult Deallocate(AllocationHandle* aHandle) override;
+ nsresult Start(SourceMediaStream*, TrackID, const PrincipalHandle&) override;
+ nsresult Stop(SourceMediaStream*, TrackID) override;
+ nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+ void NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream* aSource,
+ TrackID aId,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle) override;
+ dom::MediaSourceEnum GetMediaSource() const override {
+ return mMediaSource;
+ }
+
+ bool ChooseCapability(const NormalizedConstraints &aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId) override;
+
+ void Refresh(int aIndex);
+
+ void Shutdown() override;
+
+ bool GetScary() const override { return mScary; }
+
+protected:
+ ~MediaEngineRemoteVideoSource() { }
+
+private:
+ // Initialize the needed Video engine interfaces.
+ void Init();
+ size_t NumCapabilities() const override;
+ void GetCapability(size_t aIndex, webrtc::CaptureCapability& aOut) const override;
+ void SetLastCapability(const webrtc::CaptureCapability& aCapability);
+
+ nsresult
+ UpdateSingleSource(const AllocationHandle* aHandle,
+ const NormalizedConstraints& aNetConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+
+ dom::MediaSourceEnum mMediaSource; // source of media (camera | application | screen)
+ mozilla::camera::CaptureEngine mCapEngine;
+
+ // To only restart camera when needed, we keep track previous settings.
+ webrtc::CaptureCapability mLastCapability;
+ bool mScary;
+};
+
+}
+
+#endif /* MEDIAENGINE_REMOTE_VIDEO_SOURCE_H_ */
diff --git a/dom/media/webrtc/MediaEngineTabVideoSource.cpp b/dom/media/webrtc/MediaEngineTabVideoSource.cpp
new file mode 100644
index 000000000..d101bab1e
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.cpp
@@ -0,0 +1,395 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaEngineTabVideoSource.h"
+
+#include "mozilla/gfx/2D.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/UniquePtrExtensions.h"
+#include "mozilla/dom/BindingDeclarations.h"
+#include "nsGlobalWindow.h"
+#include "nsIDOMClientRect.h"
+#include "nsIDocShell.h"
+#include "nsIPresShell.h"
+#include "nsPresContext.h"
+#include "gfxContext.h"
+#include "gfx2DGlue.h"
+#include "ImageContainer.h"
+#include "Layers.h"
+#include "nsIInterfaceRequestorUtils.h"
+#include "nsIDOMDocument.h"
+#include "nsITabSource.h"
+#include "VideoUtils.h"
+#include "nsServiceManagerUtils.h"
+#include "nsIPrefService.h"
+#include "MediaTrackConstraints.h"
+
+namespace mozilla {
+
+using namespace mozilla::gfx;
+
+NS_IMPL_ISUPPORTS(MediaEngineTabVideoSource, nsIDOMEventListener, nsITimerCallback)
+
+MediaEngineTabVideoSource::MediaEngineTabVideoSource()
+ : mBufWidthMax(0)
+ , mBufHeightMax(0)
+ , mWindowId(0)
+ , mScrollWithPage(false)
+ , mViewportOffsetX(0)
+ , mViewportOffsetY(0)
+ , mViewportWidth(0)
+ , mViewportHeight(0)
+ , mTimePerFrame(0)
+ , mDataSize(0)
+ , mBlackedoutWindow(false)
+ , mMonitor("MediaEngineTabVideoSource") {}
+
+nsresult
+MediaEngineTabVideoSource::StartRunnable::Run()
+{
+ mVideoSource->Draw();
+ mVideoSource->mTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+ mVideoSource->mTimer->InitWithCallback(mVideoSource, mVideoSource->mTimePerFrame, nsITimer:: TYPE_REPEATING_SLACK);
+ if (mVideoSource->mTabSource) {
+ mVideoSource->mTabSource->NotifyStreamStart(mVideoSource->mWindow);
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaEngineTabVideoSource::StopRunnable::Run()
+{
+ if (mVideoSource->mTimer) {
+ mVideoSource->mTimer->Cancel();
+ mVideoSource->mTimer = nullptr;
+ }
+ if (mVideoSource->mTabSource) {
+ mVideoSource->mTabSource->NotifyStreamStop(mVideoSource->mWindow);
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaEngineTabVideoSource::HandleEvent(nsIDOMEvent *event) {
+ Draw();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+MediaEngineTabVideoSource::Notify(nsITimer*) {
+ Draw();
+ return NS_OK;
+}
+
+nsresult
+MediaEngineTabVideoSource::InitRunnable::Run()
+{
+ if (mVideoSource->mWindowId != -1) {
+ nsGlobalWindow* globalWindow =
+ nsGlobalWindow::GetOuterWindowWithId(mVideoSource->mWindowId);
+ if (!globalWindow) {
+ // We can't access the window, just send a blacked out screen.
+ mVideoSource->mWindow = nullptr;
+ mVideoSource->mBlackedoutWindow = true;
+ } else {
+ nsCOMPtr<nsPIDOMWindowOuter> window = globalWindow->AsOuter();
+ if (window) {
+ mVideoSource->mWindow = window;
+ mVideoSource->mBlackedoutWindow = false;
+ }
+ }
+ }
+ if (!mVideoSource->mWindow && !mVideoSource->mBlackedoutWindow) {
+ nsresult rv;
+ mVideoSource->mTabSource = do_GetService(NS_TABSOURCESERVICE_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<mozIDOMWindowProxy> win;
+ rv = mVideoSource->mTabSource->GetTabToStream(getter_AddRefs(win));
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!win)
+ return NS_OK;
+
+ mVideoSource->mWindow = nsPIDOMWindowOuter::From(win);
+ MOZ_ASSERT(mVideoSource->mWindow);
+ }
+ nsCOMPtr<nsIRunnable> start(new StartRunnable(mVideoSource));
+ start->Run();
+ return NS_OK;
+}
+
+nsresult
+MediaEngineTabVideoSource::DestroyRunnable::Run()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ mVideoSource->mWindow = nullptr;
+ mVideoSource->mTabSource = nullptr;
+
+ return NS_OK;
+}
+
+void
+MediaEngineTabVideoSource::GetName(nsAString_internal& aName) const
+{
+ aName.AssignLiteral(u"&getUserMedia.videoSource.tabShare;");
+}
+
+void
+MediaEngineTabVideoSource::GetUUID(nsACString_internal& aUuid) const
+{
+ aUuid.AssignLiteral("tab");
+}
+
+#define DEFAULT_TABSHARE_VIDEO_MAX_WIDTH 4096
+#define DEFAULT_TABSHARE_VIDEO_MAX_HEIGHT 4096
+#define DEFAULT_TABSHARE_VIDEO_FRAMERATE 30
+
+nsresult
+MediaEngineTabVideoSource::Allocate(const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint)
+{
+ // windowId is not a proper constraint, so just read it.
+ // It has no well-defined behavior in advanced, so ignore it there.
+
+ mWindowId = aConstraints.mBrowserWindow.WasPassed() ?
+ aConstraints.mBrowserWindow.Value() : -1;
+ *aOutHandle = nullptr;
+
+ {
+ MonitorAutoLock mon(mMonitor);
+ mState = kAllocated;
+ }
+
+ return Restart(nullptr, aConstraints, aPrefs, aDeviceId, aOutBadConstraint);
+}
+
+nsresult
+MediaEngineTabVideoSource::Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const mozilla::MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ MOZ_ASSERT(!aHandle);
+
+ // scrollWithPage is not proper a constraint, so just read it.
+ // It has no well-defined behavior in advanced, so ignore it there.
+
+ mScrollWithPage = aConstraints.mScrollWithPage.WasPassed() ?
+ aConstraints.mScrollWithPage.Value() : false;
+
+ FlattenedConstraints c(aConstraints);
+
+ mBufWidthMax = c.mWidth.Get(DEFAULT_TABSHARE_VIDEO_MAX_WIDTH);
+ mBufHeightMax = c.mHeight.Get(DEFAULT_TABSHARE_VIDEO_MAX_HEIGHT);
+ double frameRate = c.mFrameRate.Get(DEFAULT_TABSHARE_VIDEO_FRAMERATE);
+ mTimePerFrame = std::max(10, int(1000.0 / (frameRate > 0? frameRate : 1)));
+
+ if (!mScrollWithPage) {
+ mViewportOffsetX = c.mViewportOffsetX.Get(0);
+ mViewportOffsetY = c.mViewportOffsetY.Get(0);
+ mViewportWidth = c.mViewportWidth.Get(INT32_MAX);
+ mViewportHeight = c.mViewportHeight.Get(INT32_MAX);
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaEngineTabVideoSource::Deallocate(AllocationHandle* aHandle)
+{
+ MOZ_ASSERT(!aHandle);
+ NS_DispatchToMainThread(do_AddRef(new DestroyRunnable(this)));
+
+ {
+ MonitorAutoLock mon(mMonitor);
+ mState = kReleased;
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaEngineTabVideoSource::Start(SourceMediaStream* aStream, TrackID aID,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ nsCOMPtr<nsIRunnable> runnable;
+ if (!mWindow)
+ runnable = new InitRunnable(this);
+ else
+ runnable = new StartRunnable(this);
+ NS_DispatchToMainThread(runnable);
+ aStream->AddTrack(aID, 0, new VideoSegment());
+
+ {
+ MonitorAutoLock mon(mMonitor);
+ mState = kStarted;
+ }
+
+ return NS_OK;
+}
+
+void
+MediaEngineTabVideoSource::NotifyPull(MediaStreamGraph*,
+ SourceMediaStream* aSource,
+ TrackID aID, StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ VideoSegment segment;
+ MonitorAutoLock mon(mMonitor);
+ if (mState != kStarted) {
+ return;
+ }
+
+ // Note: we're not giving up mImage here
+ RefPtr<layers::SourceSurfaceImage> image = mImage;
+ StreamTime delta = aDesiredTime - aSource->GetEndOfAppendedData(aID);
+ if (delta > 0) {
+ // nullptr images are allowed
+ gfx::IntSize size = image ? image->GetSize() : IntSize(0, 0);
+ segment.AppendFrame(image.forget().downcast<layers::Image>(), delta, size,
+ aPrincipalHandle);
+ // This can fail if either a) we haven't added the track yet, or b)
+ // we've removed or finished the track.
+ aSource->AppendToTrack(aID, &(segment));
+ }
+}
+
+void
+MediaEngineTabVideoSource::Draw() {
+ if (!mWindow && !mBlackedoutWindow) {
+ return;
+ }
+
+ if (mWindow) {
+ if (mScrollWithPage || mViewportWidth == INT32_MAX) {
+ mWindow->GetInnerWidth(&mViewportWidth);
+ }
+ if (mScrollWithPage || mViewportHeight == INT32_MAX) {
+ mWindow->GetInnerHeight(&mViewportHeight);
+ }
+ if (!mViewportWidth || !mViewportHeight) {
+ return;
+ }
+ } else {
+ mViewportWidth = 640;
+ mViewportHeight = 480;
+ }
+
+ IntSize size;
+ {
+ float pixelRatio;
+ if (mWindow) {
+ pixelRatio = mWindow->GetDevicePixelRatio(CallerType::System);
+ } else {
+ pixelRatio = 1.0f;
+ }
+ const int32_t deviceWidth = (int32_t)(pixelRatio * mViewportWidth);
+ const int32_t deviceHeight = (int32_t)(pixelRatio * mViewportHeight);
+
+ if ((deviceWidth <= mBufWidthMax) && (deviceHeight <= mBufHeightMax)) {
+ size = IntSize(deviceWidth, deviceHeight);
+ } else {
+ const float scaleWidth = (float)mBufWidthMax / (float)deviceWidth;
+ const float scaleHeight = (float)mBufHeightMax / (float)deviceHeight;
+ const float scale = scaleWidth < scaleHeight ? scaleWidth : scaleHeight;
+
+ size = IntSize((int)(scale * deviceWidth), (int)(scale * deviceHeight));
+ }
+ }
+
+ gfxImageFormat format = SurfaceFormat::X8R8G8B8_UINT32;
+ uint32_t stride = gfxASurface::FormatStrideForWidth(format, size.width);
+
+ if (mDataSize < static_cast<size_t>(stride * size.height)) {
+ mDataSize = stride * size.height;
+ mData = MakeUniqueFallible<unsigned char[]>(mDataSize);
+ }
+ if (!mData) {
+ return;
+ }
+
+ nsCOMPtr<nsIPresShell> presShell;
+ if (mWindow) {
+ RefPtr<nsPresContext> presContext;
+ nsIDocShell* docshell = mWindow->GetDocShell();
+ if (docshell) {
+ docshell->GetPresContext(getter_AddRefs(presContext));
+ }
+ if (!presContext) {
+ return;
+ }
+ presShell = presContext->PresShell();
+ }
+
+ RefPtr<layers::ImageContainer> container =
+ layers::LayerManager::CreateImageContainer(layers::ImageContainer::ASYNCHRONOUS);
+ RefPtr<DrawTarget> dt =
+ Factory::CreateDrawTargetForData(BackendType::CAIRO,
+ mData.get(),
+ size,
+ stride,
+ SurfaceFormat::B8G8R8X8);
+ if (!dt || !dt->IsValid()) {
+ return;
+ }
+ RefPtr<gfxContext> context = gfxContext::CreateOrNull(dt);
+ MOZ_ASSERT(context); // already checked the draw target above
+ context->SetMatrix(context->CurrentMatrix().Scale((((float) size.width)/mViewportWidth),
+ (((float) size.height)/mViewportHeight)));
+
+ if (mWindow) {
+ nscolor bgColor = NS_RGB(255, 255, 255);
+ uint32_t renderDocFlags = mScrollWithPage? 0 :
+ (nsIPresShell::RENDER_IGNORE_VIEWPORT_SCROLLING |
+ nsIPresShell::RENDER_DOCUMENT_RELATIVE);
+ nsRect r(nsPresContext::CSSPixelsToAppUnits((float)mViewportOffsetX),
+ nsPresContext::CSSPixelsToAppUnits((float)mViewportOffsetY),
+ nsPresContext::CSSPixelsToAppUnits((float)mViewportWidth),
+ nsPresContext::CSSPixelsToAppUnits((float)mViewportHeight));
+ NS_ENSURE_SUCCESS_VOID(presShell->RenderDocument(r, renderDocFlags, bgColor, context));
+ }
+
+ RefPtr<SourceSurface> surface = dt->Snapshot();
+ if (!surface) {
+ return;
+ }
+
+ RefPtr<layers::SourceSurfaceImage> image = new layers::SourceSurfaceImage(size, surface);
+
+ MonitorAutoLock mon(mMonitor);
+ mImage = image;
+}
+
+nsresult
+MediaEngineTabVideoSource::Stop(mozilla::SourceMediaStream* aSource,
+ mozilla::TrackID aID)
+{
+ // If mBlackedoutWindow is true, we may be running
+ // despite mWindow == nullptr.
+ if (!mWindow && !mBlackedoutWindow) {
+ return NS_OK;
+ }
+
+ NS_DispatchToMainThread(new StopRunnable(this));
+
+ {
+ MonitorAutoLock mon(mMonitor);
+ mState = kStopped;
+ aSource->EndTrack(aID);
+ }
+ return NS_OK;
+}
+
+bool
+MediaEngineTabVideoSource::IsFake()
+{
+ return false;
+}
+
+}
diff --git a/dom/media/webrtc/MediaEngineTabVideoSource.h b/dom/media/webrtc/MediaEngineTabVideoSource.h
new file mode 100644
index 000000000..d11bd7765
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.h
@@ -0,0 +1,114 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsIDOMEventListener.h"
+#include "MediaEngine.h"
+#include "ImageContainer.h"
+#include "nsITimer.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/UniquePtr.h"
+#include "nsITabSource.h"
+
+namespace mozilla {
+
+class MediaEngineTabVideoSource : public MediaEngineVideoSource, nsIDOMEventListener, nsITimerCallback {
+ public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIDOMEVENTLISTENER
+ NS_DECL_NSITIMERCALLBACK
+ MediaEngineTabVideoSource();
+
+ void GetName(nsAString_internal&) const override;
+ void GetUUID(nsACString_internal&) const override;
+
+ bool GetScary() const override {
+ return true;
+ }
+
+ nsresult Allocate(const dom::MediaTrackConstraints &,
+ const mozilla::MediaEnginePrefs&,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint) override;
+ nsresult Deallocate(AllocationHandle* aHandle) override;
+ nsresult Start(mozilla::SourceMediaStream*, mozilla::TrackID, const mozilla::PrincipalHandle&) override;
+ void SetDirectListeners(bool aHasDirectListeners) override {};
+ void NotifyPull(mozilla::MediaStreamGraph*, mozilla::SourceMediaStream*, mozilla::TrackID, mozilla::StreamTime, const mozilla::PrincipalHandle& aPrincipalHandle) override;
+ nsresult Stop(mozilla::SourceMediaStream*, mozilla::TrackID) override;
+ nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const mozilla::MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+ bool IsFake() override;
+ dom::MediaSourceEnum GetMediaSource() const override {
+ return dom::MediaSourceEnum::Browser;
+ }
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const override
+ {
+ return 0;
+ }
+
+ nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ void Draw();
+
+ class StartRunnable : public Runnable {
+ public:
+ explicit StartRunnable(MediaEngineTabVideoSource *videoSource) : mVideoSource(videoSource) {}
+ NS_IMETHOD Run();
+ RefPtr<MediaEngineTabVideoSource> mVideoSource;
+ };
+
+ class StopRunnable : public Runnable {
+ public:
+ explicit StopRunnable(MediaEngineTabVideoSource *videoSource) : mVideoSource(videoSource) {}
+ NS_IMETHOD Run();
+ RefPtr<MediaEngineTabVideoSource> mVideoSource;
+ };
+
+ class InitRunnable : public Runnable {
+ public:
+ explicit InitRunnable(MediaEngineTabVideoSource *videoSource) : mVideoSource(videoSource) {}
+ NS_IMETHOD Run();
+ RefPtr<MediaEngineTabVideoSource> mVideoSource;
+ };
+
+ class DestroyRunnable : public Runnable {
+ public:
+ explicit DestroyRunnable(MediaEngineTabVideoSource* videoSource) : mVideoSource(videoSource) {}
+ NS_IMETHOD Run();
+ RefPtr<MediaEngineTabVideoSource> mVideoSource;
+ };
+
+protected:
+ ~MediaEngineTabVideoSource() {}
+
+private:
+ int32_t mBufWidthMax;
+ int32_t mBufHeightMax;
+ int64_t mWindowId;
+ bool mScrollWithPage;
+ int32_t mViewportOffsetX;
+ int32_t mViewportOffsetY;
+ int32_t mViewportWidth;
+ int32_t mViewportHeight;
+ int32_t mTimePerFrame;
+ UniquePtr<unsigned char[]> mData;
+ size_t mDataSize;
+ nsCOMPtr<nsPIDOMWindowOuter> mWindow;
+ // If this is set, we will run despite mWindow == nullptr.
+ bool mBlackedoutWindow;
+ RefPtr<layers::SourceSurfaceImage> mImage;
+ nsCOMPtr<nsITimer> mTimer;
+ Monitor mMonitor;
+ nsCOMPtr<nsITabSource> mTabSource;
+ };
+}
diff --git a/dom/media/webrtc/MediaEngineWebRTC.cpp b/dom/media/webrtc/MediaEngineWebRTC.cpp
new file mode 100644
index 000000000..522f23f61
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineWebRTC.cpp
@@ -0,0 +1,431 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=8 et ft=cpp : */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsIPrefService.h"
+#include "nsIPrefBranch.h"
+
+#include "CSFLog.h"
+#include "prenv.h"
+
+#include "mozilla/Logging.h"
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
+
+static mozilla::LazyLogModule sGetUserMediaLog("GetUserMedia");
+
+#include "MediaEngineWebRTC.h"
+#include "ImageContainer.h"
+#include "nsIComponentRegistrar.h"
+#include "MediaEngineTabVideoSource.h"
+#include "MediaEngineRemoteVideoSource.h"
+#include "CamerasChild.h"
+#include "nsITabSource.h"
+#include "MediaTrackConstraints.h"
+
+#ifdef MOZ_WIDGET_ANDROID
+#include "AndroidJNIWrapper.h"
+#include "AndroidBridge.h"
+#endif
+
+#undef LOG
+#define LOG(args) MOZ_LOG(sGetUserMediaLog, mozilla::LogLevel::Debug, args)
+
+namespace mozilla {
+
+// statics from AudioInputCubeb
+nsTArray<int>* AudioInputCubeb::mDeviceIndexes;
+int AudioInputCubeb::mDefaultDevice = -1;
+nsTArray<nsCString>* AudioInputCubeb::mDeviceNames;
+cubeb_device_collection* AudioInputCubeb::mDevices = nullptr;
+bool AudioInputCubeb::mAnyInUse = false;
+StaticMutex AudioInputCubeb::sMutex;
+
+// AudioDeviceID is an annoying opaque value that's really a string
+// pointer, and is freed when the cubeb_device_collection is destroyed
+
+void AudioInputCubeb::UpdateDeviceList()
+{
+ cubeb* cubebContext = CubebUtils::GetCubebContext();
+ if (!cubebContext) {
+ return;
+ }
+
+ cubeb_device_collection *devices = nullptr;
+
+ if (CUBEB_OK != cubeb_enumerate_devices(cubebContext,
+ CUBEB_DEVICE_TYPE_INPUT,
+ &devices)) {
+ return;
+ }
+
+ for (auto& device_index : (*mDeviceIndexes)) {
+ device_index = -1; // unmapped
+ }
+ // We keep all the device names, but wipe the mappings and rebuild them
+
+ // Calculate translation from existing mDevices to new devices. Note we
+ // never end up with less devices than before, since people have
+ // stashed indexes.
+ // For some reason the "fake" device for automation is marked as DISABLED,
+ // so white-list it.
+ mDefaultDevice = -1;
+ for (uint32_t i = 0; i < devices->count; i++) {
+ LOG(("Cubeb device %u: type 0x%x, state 0x%x, name %s, id %p",
+ i, devices->device[i]->type, devices->device[i]->state,
+ devices->device[i]->friendly_name, devices->device[i]->device_id));
+ if (devices->device[i]->type == CUBEB_DEVICE_TYPE_INPUT && // paranoia
+ (devices->device[i]->state == CUBEB_DEVICE_STATE_ENABLED ||
+ (devices->device[i]->state == CUBEB_DEVICE_STATE_DISABLED &&
+ devices->device[i]->friendly_name &&
+ strcmp(devices->device[i]->friendly_name, "Sine source at 440 Hz") == 0)))
+ {
+ auto j = mDeviceNames->IndexOf(devices->device[i]->device_id);
+ if (j != nsTArray<nsCString>::NoIndex) {
+ // match! update the mapping
+ (*mDeviceIndexes)[j] = i;
+ } else {
+ // new device, add to the array
+ mDeviceIndexes->AppendElement(i);
+ mDeviceNames->AppendElement(devices->device[i]->device_id);
+ j = mDeviceIndexes->Length()-1;
+ }
+ if (devices->device[i]->preferred & CUBEB_DEVICE_PREF_VOICE) {
+ // There can be only one... we hope
+ NS_ASSERTION(mDefaultDevice == -1, "multiple default cubeb input devices!");
+ mDefaultDevice = j;
+ }
+ }
+ }
+ LOG(("Cubeb default input device %d", mDefaultDevice));
+ StaticMutexAutoLock lock(sMutex);
+ // swap state
+ if (mDevices) {
+ cubeb_device_collection_destroy(mDevices);
+ }
+ mDevices = devices;
+}
+
+MediaEngineWebRTC::MediaEngineWebRTC(MediaEnginePrefs &aPrefs)
+ : mMutex("mozilla::MediaEngineWebRTC"),
+ mVoiceEngine(nullptr),
+ mAudioInput(nullptr),
+ mFullDuplex(aPrefs.mFullDuplex),
+ mExtendedFilter(aPrefs.mExtendedFilter),
+ mDelayAgnostic(aPrefs.mDelayAgnostic),
+ mHasTabVideoSource(false)
+{
+ nsCOMPtr<nsIComponentRegistrar> compMgr;
+ NS_GetComponentRegistrar(getter_AddRefs(compMgr));
+ if (compMgr) {
+ compMgr->IsContractIDRegistered(NS_TABSOURCESERVICE_CONTRACTID, &mHasTabVideoSource);
+ }
+ // XXX
+ gFarendObserver = new AudioOutputObserver();
+
+ camera::GetChildAndCall(
+ &camera::CamerasChild::AddDeviceChangeCallback,
+ this);
+}
+
+void
+MediaEngineWebRTC::SetFakeDeviceChangeEvents()
+{
+ camera::GetChildAndCall(
+ &camera::CamerasChild::SetFakeDeviceChangeEvents);
+}
+
+void
+MediaEngineWebRTC::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
+ nsTArray<RefPtr<MediaEngineVideoSource> >* aVSources)
+{
+ // We spawn threads to handle gUM runnables, so we must protect the member vars
+ MutexAutoLock lock(mMutex);
+
+ mozilla::camera::CaptureEngine capEngine = mozilla::camera::InvalidEngine;
+
+#ifdef MOZ_WIDGET_ANDROID
+ // get the JVM
+ JavaVM* jvm;
+ JNIEnv* const env = jni::GetEnvForThread();
+ MOZ_ALWAYS_TRUE(!env->GetJavaVM(&jvm));
+
+ if (webrtc::VideoEngine::SetAndroidObjects(jvm) != 0) {
+ LOG(("VieCapture:SetAndroidObjects Failed"));
+ return;
+ }
+#endif
+ bool scaryKind = false; // flag sources with cross-origin exploit potential
+
+ switch (aMediaSource) {
+ case dom::MediaSourceEnum::Window:
+ capEngine = mozilla::camera::WinEngine;
+ break;
+ case dom::MediaSourceEnum::Application:
+ capEngine = mozilla::camera::AppEngine;
+ break;
+ case dom::MediaSourceEnum::Screen:
+ capEngine = mozilla::camera::ScreenEngine;
+ scaryKind = true;
+ break;
+ case dom::MediaSourceEnum::Browser:
+ capEngine = mozilla::camera::BrowserEngine;
+ scaryKind = true;
+ break;
+ case dom::MediaSourceEnum::Camera:
+ capEngine = mozilla::camera::CameraEngine;
+ break;
+ default:
+ // BOOM
+ MOZ_CRASH("No valid video engine");
+ break;
+ }
+
+ /**
+ * We still enumerate every time, in case a new device was plugged in since
+ * the last call. TODO: Verify that WebRTC actually does deal with hotplugging
+ * new devices (with or without new engine creation) and accordingly adjust.
+ * Enumeration is not neccessary if GIPS reports the same set of devices
+ * for a given instance of the engine. Likewise, if a device was plugged out,
+ * mVideoSources must be updated.
+ */
+ int num;
+ num = mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::NumberOfCaptureDevices,
+ capEngine);
+
+ for (int i = 0; i < num; i++) {
+ char deviceName[MediaEngineSource::kMaxDeviceNameLength];
+ char uniqueId[MediaEngineSource::kMaxUniqueIdLength];
+ bool scarySource = false;
+
+ // paranoia
+ deviceName[0] = '\0';
+ uniqueId[0] = '\0';
+ int error;
+
+ error = mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::GetCaptureDevice,
+ capEngine,
+ i, deviceName,
+ sizeof(deviceName), uniqueId,
+ sizeof(uniqueId),
+ &scarySource);
+ if (error) {
+ LOG(("camera:GetCaptureDevice: Failed %d", error ));
+ continue;
+ }
+#ifdef DEBUG
+ LOG((" Capture Device Index %d, Name %s", i, deviceName));
+
+ webrtc::CaptureCapability cap;
+ int numCaps = mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::NumberOfCapabilities,
+ capEngine,
+ uniqueId);
+ LOG(("Number of Capabilities %d", numCaps));
+ for (int j = 0; j < numCaps; j++) {
+ if (mozilla::camera::GetChildAndCall(
+ &mozilla::camera::CamerasChild::GetCaptureCapability,
+ capEngine,
+ uniqueId,
+ j, cap) != 0) {
+ break;
+ }
+ LOG(("type=%d width=%d height=%d maxFPS=%d",
+ cap.rawType, cap.width, cap.height, cap.maxFPS ));
+ }
+#endif
+
+ if (uniqueId[0] == '\0') {
+ // In case a device doesn't set uniqueId!
+ strncpy(uniqueId, deviceName, sizeof(uniqueId));
+ uniqueId[sizeof(uniqueId)-1] = '\0'; // strncpy isn't safe
+ }
+
+ RefPtr<MediaEngineVideoSource> vSource;
+ NS_ConvertUTF8toUTF16 uuid(uniqueId);
+ if (mVideoSources.Get(uuid, getter_AddRefs(vSource))) {
+ // We've already seen this device, just refresh and append.
+ static_cast<MediaEngineRemoteVideoSource*>(vSource.get())->Refresh(i);
+ aVSources->AppendElement(vSource.get());
+ } else {
+ vSource = new MediaEngineRemoteVideoSource(i, capEngine, aMediaSource,
+ scaryKind || scarySource);
+ mVideoSources.Put(uuid, vSource); // Hashtable takes ownership.
+ aVSources->AppendElement(vSource);
+ }
+ }
+
+ if (mHasTabVideoSource || dom::MediaSourceEnum::Browser == aMediaSource) {
+ aVSources->AppendElement(new MediaEngineTabVideoSource());
+ }
+}
+
+bool
+MediaEngineWebRTC::SupportsDuplex()
+{
+#ifndef XP_WIN
+ return mFullDuplex;
+#else
+ return IsVistaOrLater() && mFullDuplex;
+#endif
+}
+
+void
+MediaEngineWebRTC::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
+ nsTArray<RefPtr<MediaEngineAudioSource> >* aASources)
+{
+ ScopedCustomReleasePtr<webrtc::VoEBase> ptrVoEBase;
+ // We spawn threads to handle gUM runnables, so we must protect the member vars
+ MutexAutoLock lock(mMutex);
+
+ if (aMediaSource == dom::MediaSourceEnum::AudioCapture) {
+ RefPtr<MediaEngineWebRTCAudioCaptureSource> audioCaptureSource =
+ new MediaEngineWebRTCAudioCaptureSource(nullptr);
+ aASources->AppendElement(audioCaptureSource);
+ return;
+ }
+
+#ifdef MOZ_WIDGET_ANDROID
+ jobject context = mozilla::AndroidBridge::Bridge()->GetGlobalContextRef();
+
+ // get the JVM
+ JavaVM* jvm;
+ JNIEnv* const env = jni::GetEnvForThread();
+ MOZ_ALWAYS_TRUE(!env->GetJavaVM(&jvm));
+
+ if (webrtc::VoiceEngine::SetAndroidObjects(jvm, (void*)context) != 0) {
+ LOG(("VoiceEngine:SetAndroidObjects Failed"));
+ return;
+ }
+#endif
+
+ if (!mVoiceEngine) {
+ mConfig.Set<webrtc::ExtendedFilter>(new webrtc::ExtendedFilter(mExtendedFilter));
+ mConfig.Set<webrtc::DelayAgnostic>(new webrtc::DelayAgnostic(mDelayAgnostic));
+
+ mVoiceEngine = webrtc::VoiceEngine::Create(mConfig);
+ if (!mVoiceEngine) {
+ return;
+ }
+ }
+
+ ptrVoEBase = webrtc::VoEBase::GetInterface(mVoiceEngine);
+ if (!ptrVoEBase) {
+ return;
+ }
+
+ // Always re-init the voice engine, since if we close the last use we
+ // DeInitEngine() and Terminate(), which shuts down Process() - but means
+ // we have to Init() again before using it. Init() when already inited is
+ // just a no-op, so call always.
+ if (ptrVoEBase->Init() < 0) {
+ return;
+ }
+
+ if (!mAudioInput) {
+ if (SupportsDuplex()) {
+ // The platform_supports_full_duplex.
+ mAudioInput = new mozilla::AudioInputCubeb(mVoiceEngine);
+ } else {
+ mAudioInput = new mozilla::AudioInputWebRTC(mVoiceEngine);
+ }
+ }
+
+ int nDevices = 0;
+ mAudioInput->GetNumOfRecordingDevices(nDevices);
+ int i;
+#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
+ i = 0; // Bug 1037025 - let the OS handle defaulting for now on android/b2g
+#else
+ // -1 is "default communications device" depending on OS in webrtc.org code
+ i = -1;
+#endif
+ for (; i < nDevices; i++) {
+ // We use constants here because GetRecordingDeviceName takes char[128].
+ char deviceName[128];
+ char uniqueId[128];
+ // paranoia; jingle doesn't bother with this
+ deviceName[0] = '\0';
+ uniqueId[0] = '\0';
+
+ int error = mAudioInput->GetRecordingDeviceName(i, deviceName, uniqueId);
+ if (error) {
+ LOG((" VoEHardware:GetRecordingDeviceName: Failed %d", error));
+ continue;
+ }
+
+ if (uniqueId[0] == '\0') {
+ // Mac and Linux don't set uniqueId!
+ MOZ_ASSERT(sizeof(deviceName) == sizeof(uniqueId)); // total paranoia
+ strcpy(uniqueId, deviceName); // safe given assert and initialization/error-check
+ }
+
+ RefPtr<MediaEngineAudioSource> aSource;
+ NS_ConvertUTF8toUTF16 uuid(uniqueId);
+ if (mAudioSources.Get(uuid, getter_AddRefs(aSource))) {
+ // We've already seen this device, just append.
+ aASources->AppendElement(aSource.get());
+ } else {
+ AudioInput* audioinput = mAudioInput;
+ if (SupportsDuplex()) {
+ // The platform_supports_full_duplex.
+
+ // For cubeb, it has state (the selected ID)
+ // XXX just use the uniqueID for cubeb and support it everywhere, and get rid of this
+ // XXX Small window where the device list/index could change!
+ audioinput = new mozilla::AudioInputCubeb(mVoiceEngine, i);
+ }
+ aSource = new MediaEngineWebRTCMicrophoneSource(mVoiceEngine, audioinput,
+ i, deviceName, uniqueId);
+ mAudioSources.Put(uuid, aSource); // Hashtable takes ownership.
+ aASources->AppendElement(aSource);
+ }
+ }
+}
+
+void
+MediaEngineWebRTC::Shutdown()
+{
+ // This is likely paranoia
+ MutexAutoLock lock(mMutex);
+
+ if (camera::GetCamerasChildIfExists()) {
+ camera::GetChildAndCall(
+ &camera::CamerasChild::RemoveDeviceChangeCallback, this);
+ }
+
+ LOG(("%s", __FUNCTION__));
+ // Shutdown all the sources, since we may have dangling references to the
+ // sources in nsDOMUserMediaStreams waiting for GC/CC
+ for (auto iter = mVideoSources.Iter(); !iter.Done(); iter.Next()) {
+ MediaEngineVideoSource* source = iter.UserData();
+ if (source) {
+ source->Shutdown();
+ }
+ }
+ for (auto iter = mAudioSources.Iter(); !iter.Done(); iter.Next()) {
+ MediaEngineAudioSource* source = iter.UserData();
+ if (source) {
+ source->Shutdown();
+ }
+ }
+ mVideoSources.Clear();
+ mAudioSources.Clear();
+
+ if (mVoiceEngine) {
+ mVoiceEngine->SetTraceCallback(nullptr);
+ webrtc::VoiceEngine::Delete(mVoiceEngine);
+ }
+
+ mVoiceEngine = nullptr;
+
+ mozilla::camera::Shutdown();
+ AudioInputCubeb::CleanupGlobalData();
+}
+
+}
diff --git a/dom/media/webrtc/MediaEngineWebRTC.h b/dom/media/webrtc/MediaEngineWebRTC.h
new file mode 100644
index 000000000..1834f3bd3
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineWebRTC.h
@@ -0,0 +1,613 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MEDIAENGINEWEBRTC_H_
+#define MEDIAENGINEWEBRTC_H_
+
+#include "prcvar.h"
+#include "prthread.h"
+#include "prprf.h"
+#include "nsIThread.h"
+#include "nsIRunnable.h"
+
+#include "mozilla/dom/File.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/StaticMutex.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/UniquePtr.h"
+#include "nsAutoPtr.h"
+#include "nsCOMPtr.h"
+#include "nsThreadUtils.h"
+#include "DOMMediaStream.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsComponentManagerUtils.h"
+#include "nsRefPtrHashtable.h"
+
+#include "VideoUtils.h"
+#include "MediaEngineCameraVideoSource.h"
+#include "VideoSegment.h"
+#include "AudioSegment.h"
+#include "StreamTracks.h"
+#include "MediaStreamGraph.h"
+#include "cubeb/cubeb.h"
+#include "CubebUtils.h"
+#include "AudioPacketizer.h"
+
+#include "MediaEngineWrapper.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+// WebRTC library includes follow
+#include "webrtc/common.h"
+// Audio Engine
+#include "webrtc/voice_engine/include/voe_base.h"
+#include "webrtc/voice_engine/include/voe_codec.h"
+#include "webrtc/voice_engine/include/voe_hardware.h"
+#include "webrtc/voice_engine/include/voe_network.h"
+#include "webrtc/voice_engine/include/voe_audio_processing.h"
+#include "webrtc/voice_engine/include/voe_volume_control.h"
+#include "webrtc/voice_engine/include/voe_external_media.h"
+#include "webrtc/voice_engine/include/voe_audio_processing.h"
+#include "webrtc/modules/audio_processing/include/audio_processing.h"
+
+// Video Engine
+// conflicts with #include of scoped_ptr.h
+#undef FF
+#include "webrtc/video_engine/include/vie_base.h"
+#include "webrtc/video_engine/include/vie_codec.h"
+#include "webrtc/video_engine/include/vie_render.h"
+#include "webrtc/video_engine/include/vie_capture.h"
+#include "CamerasChild.h"
+
+#include "NullTransport.h"
+#include "AudioOutputObserver.h"
+
+namespace mozilla {
+
+class MediaEngineWebRTCAudioCaptureSource : public MediaEngineAudioSource
+{
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+ explicit MediaEngineWebRTCAudioCaptureSource(const char* aUuid)
+ : MediaEngineAudioSource(kReleased)
+ {
+ }
+ void GetName(nsAString& aName) const override;
+ void GetUUID(nsACString& aUUID) const override;
+ nsresult Allocate(const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const nsACString& aOrigin,
+ AllocationHandle** aOutHandle,
+ const char** aOutBadConstraint) override
+ {
+ // Nothing to do here, everything is managed in MediaManager.cpp
+ *aOutHandle = nullptr;
+ return NS_OK;
+ }
+ nsresult Deallocate(AllocationHandle* aHandle) override
+ {
+ // Nothing to do here, everything is managed in MediaManager.cpp
+ MOZ_ASSERT(!aHandle);
+ return NS_OK;
+ }
+ nsresult Start(SourceMediaStream* aMediaStream,
+ TrackID aId,
+ const PrincipalHandle& aPrincipalHandle) override;
+ nsresult Stop(SourceMediaStream* aMediaStream, TrackID aId) override;
+ nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+ void SetDirectListeners(bool aDirect) override
+ {}
+ void NotifyOutputData(MediaStreamGraph* aGraph,
+ AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override
+ {}
+ void DeviceChanged() override
+ {}
+ void NotifyInputData(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override
+ {}
+ void NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream* aSource,
+ TrackID aID,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle) override
+ {}
+ dom::MediaSourceEnum GetMediaSource() const override
+ {
+ return dom::MediaSourceEnum::AudioCapture;
+ }
+ bool IsFake() override
+ {
+ return false;
+ }
+ nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const override;
+
+protected:
+ virtual ~MediaEngineWebRTCAudioCaptureSource() {}
+ nsCString mUUID;
+};
+
+// Small subset of VoEHardware
+class AudioInput
+{
+public:
+ explicit AudioInput(webrtc::VoiceEngine* aVoiceEngine) : mVoiceEngine(aVoiceEngine) {};
+ // Threadsafe because it's referenced from an MicrophoneSource, which can
+ // had references to it on other threads.
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioInput)
+
+ virtual int GetNumOfRecordingDevices(int& aDevices) = 0;
+ virtual int GetRecordingDeviceName(int aIndex, char aStrNameUTF8[128],
+ char aStrGuidUTF8[128]) = 0;
+ virtual int GetRecordingDeviceStatus(bool& aIsAvailable) = 0;
+ virtual void StartRecording(SourceMediaStream *aStream, AudioDataListener *aListener) = 0;
+ virtual void StopRecording(SourceMediaStream *aStream) = 0;
+ virtual int SetRecordingDevice(int aIndex) = 0;
+
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~AudioInput() {}
+
+ webrtc::VoiceEngine* mVoiceEngine;
+};
+
+class AudioInputCubeb final : public AudioInput
+{
+public:
+ explicit AudioInputCubeb(webrtc::VoiceEngine* aVoiceEngine, int aIndex = 0) :
+ AudioInput(aVoiceEngine), mSelectedDevice(aIndex), mInUseCount(0)
+ {
+ if (!mDeviceIndexes) {
+ mDeviceIndexes = new nsTArray<int>;
+ mDeviceNames = new nsTArray<nsCString>;
+ mDefaultDevice = -1;
+ }
+ }
+
+ static void CleanupGlobalData()
+ {
+ if (mDevices) {
+ // This doesn't require anything more than support for free()
+ cubeb_device_collection_destroy(mDevices);
+ mDevices = nullptr;
+ }
+ delete mDeviceIndexes;
+ mDeviceIndexes = nullptr;
+ delete mDeviceNames;
+ mDeviceNames = nullptr;
+ }
+
+ int GetNumOfRecordingDevices(int& aDevices)
+ {
+ UpdateDeviceList();
+ aDevices = mDeviceIndexes->Length();
+ return 0;
+ }
+
+ static int32_t DeviceIndex(int aIndex)
+ {
+ // -1 = system default if any
+ if (aIndex == -1) {
+ if (mDefaultDevice == -1) {
+ aIndex = 0;
+ } else {
+ aIndex = mDefaultDevice;
+ }
+ }
+ if (aIndex < 0 || aIndex >= (int) mDeviceIndexes->Length()) {
+ return -1;
+ }
+ // Note: if the device is gone, this will be -1
+ return (*mDeviceIndexes)[aIndex]; // translate to mDevices index
+ }
+
+ static StaticMutex& Mutex()
+ {
+ return sMutex;
+ }
+
+ static bool GetDeviceID(int aDeviceIndex, CubebUtils::AudioDeviceID &aID)
+ {
+ // Assert sMutex is held
+ sMutex.AssertCurrentThreadOwns();
+ int dev_index = DeviceIndex(aDeviceIndex);
+ if (dev_index != -1) {
+ aID = mDevices->device[dev_index]->devid;
+ return true;
+ }
+ return false;
+ }
+
+ int GetRecordingDeviceName(int aIndex, char aStrNameUTF8[128],
+ char aStrGuidUTF8[128])
+ {
+ int32_t devindex = DeviceIndex(aIndex);
+ if (!mDevices || devindex < 0) {
+ return 1;
+ }
+ PR_snprintf(aStrNameUTF8, 128, "%s%s", aIndex == -1 ? "default: " : "",
+ mDevices->device[devindex]->friendly_name);
+ aStrGuidUTF8[0] = '\0';
+ return 0;
+ }
+
+ int GetRecordingDeviceStatus(bool& aIsAvailable)
+ {
+ // With cubeb, we only expose devices of type CUBEB_DEVICE_TYPE_INPUT,
+ // so unless it was removed, say it's available
+ aIsAvailable = true;
+ return 0;
+ }
+
+ void StartRecording(SourceMediaStream *aStream, AudioDataListener *aListener)
+ {
+ MOZ_ASSERT(mDevices);
+
+ if (mInUseCount == 0) {
+ ScopedCustomReleasePtr<webrtc::VoEExternalMedia> ptrVoERender;
+ ptrVoERender = webrtc::VoEExternalMedia::GetInterface(mVoiceEngine);
+ if (ptrVoERender) {
+ ptrVoERender->SetExternalRecordingStatus(true);
+ }
+ mAnyInUse = true;
+ }
+ mInUseCount++;
+ // Always tell the stream we're using it for input
+ aStream->OpenAudioInput(mSelectedDevice, aListener);
+ }
+
+ void StopRecording(SourceMediaStream *aStream)
+ {
+ aStream->CloseAudioInput();
+ if (--mInUseCount == 0) {
+ mAnyInUse = false;
+ }
+ }
+
+ int SetRecordingDevice(int aIndex)
+ {
+ mSelectedDevice = aIndex;
+ return 0;
+ }
+
+protected:
+ ~AudioInputCubeb() {
+ MOZ_RELEASE_ASSERT(mInUseCount == 0);
+ }
+
+private:
+ // It would be better to watch for device-change notifications
+ void UpdateDeviceList();
+
+ // We have an array, which consists of indexes to the current mDevices
+ // list. This is updated on mDevices updates. Many devices in mDevices
+ // won't be included in the array (wrong type, etc), or if a device is
+ // removed it will map to -1 (and opens of this device will need to check
+ // for this - and be careful of threading access. The mappings need to
+ // updated on each re-enumeration.
+ int mSelectedDevice;
+ uint32_t mInUseCount;
+
+ // pointers to avoid static constructors
+ static nsTArray<int>* mDeviceIndexes;
+ static int mDefaultDevice; // -1 == not set
+ static nsTArray<nsCString>* mDeviceNames;
+ static cubeb_device_collection *mDevices;
+ static bool mAnyInUse;
+ static StaticMutex sMutex;
+};
+
+class AudioInputWebRTC final : public AudioInput
+{
+public:
+ explicit AudioInputWebRTC(webrtc::VoiceEngine* aVoiceEngine) : AudioInput(aVoiceEngine) {}
+
+ int GetNumOfRecordingDevices(int& aDevices)
+ {
+ ScopedCustomReleasePtr<webrtc::VoEHardware> ptrVoEHw;
+ ptrVoEHw = webrtc::VoEHardware::GetInterface(mVoiceEngine);
+ if (!ptrVoEHw) {
+ return 1;
+ }
+ return ptrVoEHw->GetNumOfRecordingDevices(aDevices);
+ }
+
+ int GetRecordingDeviceName(int aIndex, char aStrNameUTF8[128],
+ char aStrGuidUTF8[128])
+ {
+ ScopedCustomReleasePtr<webrtc::VoEHardware> ptrVoEHw;
+ ptrVoEHw = webrtc::VoEHardware::GetInterface(mVoiceEngine);
+ if (!ptrVoEHw) {
+ return 1;
+ }
+ return ptrVoEHw->GetRecordingDeviceName(aIndex, aStrNameUTF8,
+ aStrGuidUTF8);
+ }
+
+ int GetRecordingDeviceStatus(bool& aIsAvailable)
+ {
+ ScopedCustomReleasePtr<webrtc::VoEHardware> ptrVoEHw;
+ ptrVoEHw = webrtc::VoEHardware::GetInterface(mVoiceEngine);
+ if (!ptrVoEHw) {
+ return 1;
+ }
+ ptrVoEHw->GetRecordingDeviceStatus(aIsAvailable);
+ return 0;
+ }
+
+ void StartRecording(SourceMediaStream *aStream, AudioDataListener *aListener) {}
+ void StopRecording(SourceMediaStream *aStream) {}
+
+ int SetRecordingDevice(int aIndex)
+ {
+ ScopedCustomReleasePtr<webrtc::VoEHardware> ptrVoEHw;
+ ptrVoEHw = webrtc::VoEHardware::GetInterface(mVoiceEngine);
+ if (!ptrVoEHw) {
+ return 1;
+ }
+ return ptrVoEHw->SetRecordingDevice(aIndex);
+ }
+
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ ~AudioInputWebRTC() {}
+};
+
+class WebRTCAudioDataListener : public AudioDataListener
+{
+protected:
+ // Protected destructor, to discourage deletion outside of Release():
+ virtual ~WebRTCAudioDataListener() {}
+
+public:
+ explicit WebRTCAudioDataListener(MediaEngineAudioSource* aAudioSource)
+ : mMutex("WebRTCAudioDataListener")
+ , mAudioSource(aAudioSource)
+ {}
+
+ // AudioDataListenerInterface methods
+ virtual void NotifyOutputData(MediaStreamGraph* aGraph,
+ AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override
+ {
+ MutexAutoLock lock(mMutex);
+ if (mAudioSource) {
+ mAudioSource->NotifyOutputData(aGraph, aBuffer, aFrames, aRate, aChannels);
+ }
+ }
+ virtual void NotifyInputData(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override
+ {
+ MutexAutoLock lock(mMutex);
+ if (mAudioSource) {
+ mAudioSource->NotifyInputData(aGraph, aBuffer, aFrames, aRate, aChannels);
+ }
+ }
+ virtual void DeviceChanged() override
+ {
+ MutexAutoLock lock(mMutex);
+ if (mAudioSource) {
+ mAudioSource->DeviceChanged();
+ }
+ }
+
+ void Shutdown()
+ {
+ MutexAutoLock lock(mMutex);
+ mAudioSource = nullptr;
+ }
+
+private:
+ Mutex mMutex;
+ RefPtr<MediaEngineAudioSource> mAudioSource;
+};
+
+class MediaEngineWebRTCMicrophoneSource : public MediaEngineAudioSource,
+ public webrtc::VoEMediaProcess
+{
+ typedef MediaEngineAudioSource Super;
+public:
+ MediaEngineWebRTCMicrophoneSource(webrtc::VoiceEngine* aVoiceEnginePtr,
+ mozilla::AudioInput* aAudioInput,
+ int aIndex,
+ const char* name,
+ const char* uuid);
+
+ void GetName(nsAString& aName) const override;
+ void GetUUID(nsACString& aUUID) const override;
+
+ nsresult Deallocate(AllocationHandle* aHandle) override;
+ nsresult Start(SourceMediaStream* aStream,
+ TrackID aID,
+ const PrincipalHandle& aPrincipalHandle) override;
+ nsresult Stop(SourceMediaStream* aSource, TrackID aID) override;
+ nsresult Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+ void SetDirectListeners(bool aHasDirectListeners) override {};
+
+ void NotifyPull(MediaStreamGraph* aGraph,
+ SourceMediaStream* aSource,
+ TrackID aId,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle) override;
+
+ // AudioDataListenerInterface methods
+ void NotifyOutputData(MediaStreamGraph* aGraph,
+ AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override;
+ void NotifyInputData(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer, size_t aFrames,
+ TrackRate aRate, uint32_t aChannels) override;
+
+ void DeviceChanged() override;
+
+ bool IsFake() override {
+ return false;
+ }
+
+ dom::MediaSourceEnum GetMediaSource() const override {
+ return dom::MediaSourceEnum::Microphone;
+ }
+
+ nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) override
+ {
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const override;
+
+ // VoEMediaProcess.
+ void Process(int channel, webrtc::ProcessingTypes type,
+ int16_t audio10ms[], int length,
+ int samplingFreq, bool isStereo) override;
+
+ void Shutdown() override;
+
+ NS_DECL_THREADSAFE_ISUPPORTS
+
+protected:
+ ~MediaEngineWebRTCMicrophoneSource() {}
+
+private:
+ nsresult
+ UpdateSingleSource(const AllocationHandle* aHandle,
+ const NormalizedConstraints& aNetConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint) override;
+
+ void SetLastPrefs(const MediaEnginePrefs& aPrefs);
+
+ // These allocate/configure and release the channel
+ bool AllocChannel();
+ void FreeChannel();
+ // These start/stop VoEBase and associated interfaces
+ bool InitEngine();
+ void DeInitEngine();
+
+ // This is true when all processing is disabled, we can skip
+ // packetization, resampling and other processing passes.
+ bool PassThrough() {
+ return mSkipProcessing;
+ }
+ template<typename T>
+ void InsertInGraph(const T* aBuffer,
+ size_t aFrames,
+ uint32_t aChannels);
+
+ void PacketizeAndProcess(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer,
+ size_t aFrames,
+ TrackRate aRate,
+ uint32_t aChannels);
+
+ webrtc::VoiceEngine* mVoiceEngine;
+ RefPtr<mozilla::AudioInput> mAudioInput;
+ RefPtr<WebRTCAudioDataListener> mListener;
+
+ // Note: shared across all microphone sources - we don't want to Terminate()
+ // the VoEBase until there are no active captures
+ static int sChannelsOpen;
+ static ScopedCustomReleasePtr<webrtc::VoEBase> mVoEBase;
+ static ScopedCustomReleasePtr<webrtc::VoEExternalMedia> mVoERender;
+ static ScopedCustomReleasePtr<webrtc::VoENetwork> mVoENetwork;
+ static ScopedCustomReleasePtr<webrtc::VoEAudioProcessing> mVoEProcessing;
+
+ // accessed from the GraphDriver thread except for deletion
+ nsAutoPtr<AudioPacketizer<AudioDataValue, int16_t>> mPacketizer;
+ ScopedCustomReleasePtr<webrtc::VoEExternalMedia> mVoERenderListener;
+
+ // mMonitor protects mSources[] and mPrinicpalIds[] access/changes, and
+ // transitions of mState from kStarted to kStopped (which are combined with
+ // EndTrack()). mSources[] and mPrincipalHandles[] are accessed from webrtc
+ // threads.
+ Monitor mMonitor;
+ nsTArray<RefPtr<SourceMediaStream>> mSources;
+ nsTArray<PrincipalHandle> mPrincipalHandles; // Maps to mSources.
+
+ int mCapIndex;
+ int mChannel;
+ MOZ_INIT_OUTSIDE_CTOR TrackID mTrackID;
+ bool mStarted;
+
+ nsString mDeviceName;
+ nsCString mDeviceUUID;
+
+ int32_t mSampleFrequency;
+ int32_t mPlayoutDelay;
+
+ NullTransport *mNullTransport;
+
+ nsTArray<int16_t> mInputBuffer;
+ // mSkipProcessing is true if none of the processing passes are enabled,
+ // because of prefs or constraints. This allows simply copying the audio into
+ // the MSG, skipping resampling and the whole webrtc.org code.
+ bool mSkipProcessing;
+
+ // To only update microphone when needed, we keep track of previous settings.
+ MediaEnginePrefs mLastPrefs;
+};
+
+class MediaEngineWebRTC : public MediaEngine
+{
+ typedef MediaEngine Super;
+public:
+ explicit MediaEngineWebRTC(MediaEnginePrefs& aPrefs);
+
+ virtual void SetFakeDeviceChangeEvents() override;
+
+ // Clients should ensure to clean-up sources video/audio sources
+ // before invoking Shutdown on this class.
+ void Shutdown() override;
+
+ // Returns whether the host supports duplex audio stream.
+ bool SupportsDuplex();
+
+ void EnumerateVideoDevices(dom::MediaSourceEnum,
+ nsTArray<RefPtr<MediaEngineVideoSource>>*) override;
+ void EnumerateAudioDevices(dom::MediaSourceEnum,
+ nsTArray<RefPtr<MediaEngineAudioSource>>*) override;
+private:
+ ~MediaEngineWebRTC() {
+ gFarendObserver = nullptr;
+ }
+
+ nsCOMPtr<nsIThread> mThread;
+
+ // gUM runnables can e.g. Enumerate from multiple threads
+ Mutex mMutex;
+ webrtc::VoiceEngine* mVoiceEngine;
+ webrtc::Config mConfig;
+ RefPtr<mozilla::AudioInput> mAudioInput;
+ bool mFullDuplex;
+ bool mExtendedFilter;
+ bool mDelayAgnostic;
+ bool mHasTabVideoSource;
+
+ // Store devices we've already seen in a hashtable for quick return.
+ // Maps UUID to MediaEngineSource (one set for audio, one for video).
+ nsRefPtrHashtable<nsStringHashKey, MediaEngineVideoSource> mVideoSources;
+ nsRefPtrHashtable<nsStringHashKey, MediaEngineAudioSource> mAudioSources;
+};
+
+}
+
+#endif /* NSMEDIAENGINEWEBRTC_H_ */
diff --git a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
new file mode 100644
index 000000000..0b8796aa8
--- /dev/null
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
@@ -0,0 +1,937 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaEngineWebRTC.h"
+#include <stdio.h>
+#include <algorithm>
+#include "mozilla/Assertions.h"
+#include "MediaTrackConstraints.h"
+#include "mtransport/runnable_utils.h"
+#include "nsAutoPtr.h"
+
+// scoped_ptr.h uses FF
+#ifdef FF
+#undef FF
+#endif
+#include "webrtc/modules/audio_device/opensl/single_rw_fifo.h"
+
+#define CHANNELS 1
+#define ENCODING "L16"
+#define DEFAULT_PORT 5555
+
+#define SAMPLE_RATE(freq) ((freq)*2*8) // bps, 16-bit samples
+#define SAMPLE_LENGTH(freq) (((freq)*10)/1000)
+
+// These are restrictions from the webrtc.org code
+#define MAX_CHANNELS 2
+#define MAX_SAMPLING_FREQ 48000 // Hz - multiple of 100
+
+#define MAX_AEC_FIFO_DEPTH 200 // ms - multiple of 10
+static_assert(!(MAX_AEC_FIFO_DEPTH % 10), "Invalid MAX_AEC_FIFO_DEPTH");
+
+namespace mozilla {
+
+#ifdef LOG
+#undef LOG
+#endif
+
+extern LogModule* GetMediaManagerLog();
+#define LOG(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Debug, msg)
+#define LOG_FRAMES(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Verbose, msg)
+
+/**
+ * Webrtc microphone source source.
+ */
+NS_IMPL_ISUPPORTS0(MediaEngineWebRTCMicrophoneSource)
+NS_IMPL_ISUPPORTS0(MediaEngineWebRTCAudioCaptureSource)
+
+// XXX temp until MSG supports registration
+StaticRefPtr<AudioOutputObserver> gFarendObserver;
+
+int MediaEngineWebRTCMicrophoneSource::sChannelsOpen = 0;
+ScopedCustomReleasePtr<webrtc::VoEBase> MediaEngineWebRTCMicrophoneSource::mVoEBase;
+ScopedCustomReleasePtr<webrtc::VoEExternalMedia> MediaEngineWebRTCMicrophoneSource::mVoERender;
+ScopedCustomReleasePtr<webrtc::VoENetwork> MediaEngineWebRTCMicrophoneSource::mVoENetwork;
+ScopedCustomReleasePtr<webrtc::VoEAudioProcessing> MediaEngineWebRTCMicrophoneSource::mVoEProcessing;
+
+AudioOutputObserver::AudioOutputObserver()
+ : mPlayoutFreq(0)
+ , mPlayoutChannels(0)
+ , mChunkSize(0)
+ , mSaved(nullptr)
+ , mSamplesSaved(0)
+{
+ // Buffers of 10ms chunks
+ mPlayoutFifo = new webrtc::SingleRwFifo(MAX_AEC_FIFO_DEPTH/10);
+}
+
+AudioOutputObserver::~AudioOutputObserver()
+{
+ Clear();
+ free(mSaved);
+ mSaved = nullptr;
+}
+
+void
+AudioOutputObserver::Clear()
+{
+ while (mPlayoutFifo->size() > 0) {
+ free(mPlayoutFifo->Pop());
+ }
+ // we'd like to touch mSaved here, but we can't if we might still be getting callbacks
+}
+
+FarEndAudioChunk *
+AudioOutputObserver::Pop()
+{
+ return (FarEndAudioChunk *) mPlayoutFifo->Pop();
+}
+
+uint32_t
+AudioOutputObserver::Size()
+{
+ return mPlayoutFifo->size();
+}
+
+void
+AudioOutputObserver::MixerCallback(AudioDataValue* aMixedBuffer,
+ AudioSampleFormat aFormat,
+ uint32_t aChannels,
+ uint32_t aFrames,
+ uint32_t aSampleRate)
+{
+ if (gFarendObserver) {
+ gFarendObserver->InsertFarEnd(aMixedBuffer, aFrames, false,
+ aSampleRate, aChannels, aFormat);
+ }
+}
+
+// static
+void
+AudioOutputObserver::InsertFarEnd(const AudioDataValue *aBuffer, uint32_t aFrames, bool aOverran,
+ int aFreq, int aChannels, AudioSampleFormat aFormat)
+{
+ if (mPlayoutChannels != 0) {
+ if (mPlayoutChannels != static_cast<uint32_t>(aChannels)) {
+ MOZ_CRASH();
+ }
+ } else {
+ MOZ_ASSERT(aChannels <= MAX_CHANNELS);
+ mPlayoutChannels = static_cast<uint32_t>(aChannels);
+ }
+ if (mPlayoutFreq != 0) {
+ if (mPlayoutFreq != static_cast<uint32_t>(aFreq)) {
+ MOZ_CRASH();
+ }
+ } else {
+ MOZ_ASSERT(aFreq <= MAX_SAMPLING_FREQ);
+ MOZ_ASSERT(!(aFreq % 100), "Sampling rate for far end data should be multiple of 100.");
+ mPlayoutFreq = aFreq;
+ mChunkSize = aFreq/100; // 10ms
+ }
+
+#ifdef LOG_FAREND_INSERTION
+ static FILE *fp = fopen("insertfarend.pcm","wb");
+#endif
+
+ if (mSaved) {
+ // flag overrun as soon as possible, and only once
+ mSaved->mOverrun = aOverran;
+ aOverran = false;
+ }
+ // Rechunk to 10ms.
+ // The AnalyzeReverseStream() and WebRtcAec_BufferFarend() functions insist on 10ms
+ // samples per call. Annoying...
+ while (aFrames) {
+ if (!mSaved) {
+ mSaved = (FarEndAudioChunk *) moz_xmalloc(sizeof(FarEndAudioChunk) +
+ (mChunkSize * aChannels - 1)*sizeof(int16_t));
+ mSaved->mSamples = mChunkSize;
+ mSaved->mOverrun = aOverran;
+ aOverran = false;
+ }
+ uint32_t to_copy = mChunkSize - mSamplesSaved;
+ if (to_copy > aFrames) {
+ to_copy = aFrames;
+ }
+
+ int16_t *dest = &(mSaved->mData[mSamplesSaved * aChannels]);
+ ConvertAudioSamples(aBuffer, dest, to_copy * aChannels);
+
+#ifdef LOG_FAREND_INSERTION
+ if (fp) {
+ fwrite(&(mSaved->mData[mSamplesSaved * aChannels]), to_copy * aChannels, sizeof(int16_t), fp);
+ }
+#endif
+ aFrames -= to_copy;
+ mSamplesSaved += to_copy;
+ aBuffer += to_copy * aChannels;
+
+ if (mSamplesSaved >= mChunkSize) {
+ int free_slots = mPlayoutFifo->capacity() - mPlayoutFifo->size();
+ if (free_slots <= 0) {
+ // XXX We should flag an overrun for the reader. We can't drop data from it due to
+ // thread safety issues.
+ break;
+ } else {
+ mPlayoutFifo->Push((int8_t *) mSaved); // takes ownership
+ mSaved = nullptr;
+ mSamplesSaved = 0;
+ }
+ }
+ }
+}
+
+MediaEngineWebRTCMicrophoneSource::MediaEngineWebRTCMicrophoneSource(
+ webrtc::VoiceEngine* aVoiceEnginePtr,
+ mozilla::AudioInput* aAudioInput,
+ int aIndex,
+ const char* name,
+ const char* uuid)
+ : MediaEngineAudioSource(kReleased)
+ , mVoiceEngine(aVoiceEnginePtr)
+ , mAudioInput(aAudioInput)
+ , mMonitor("WebRTCMic.Monitor")
+ , mCapIndex(aIndex)
+ , mChannel(-1)
+ , mTrackID(TRACK_NONE)
+ , mStarted(false)
+ , mSampleFrequency(MediaEngine::DEFAULT_SAMPLE_RATE)
+ , mPlayoutDelay(0)
+ , mNullTransport(nullptr)
+ , mSkipProcessing(false)
+{
+ MOZ_ASSERT(aVoiceEnginePtr);
+ MOZ_ASSERT(aAudioInput);
+ mDeviceName.Assign(NS_ConvertUTF8toUTF16(name));
+ mDeviceUUID.Assign(uuid);
+ mListener = new mozilla::WebRTCAudioDataListener(this);
+ mSettings.mEchoCancellation.Construct(0);
+ mSettings.mMozAutoGainControl.Construct(0);
+ mSettings.mMozNoiseSuppression.Construct(0);
+ // We'll init lazily as needed
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::GetName(nsAString& aName) const
+{
+ aName.Assign(mDeviceName);
+ return;
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::GetUUID(nsACString& aUUID) const
+{
+ aUUID.Assign(mDeviceUUID);
+ return;
+}
+
+// GetBestFitnessDistance returns the best distance the capture device can offer
+// as a whole, given an accumulated number of ConstraintSets.
+// Ideal values are considered in the first ConstraintSet only.
+// Plain values are treated as Ideal in the first ConstraintSet.
+// Plain values are treated as Exact in subsequent ConstraintSets.
+// Infinity = UINT32_MAX e.g. device cannot satisfy accumulated ConstraintSets.
+// A finite result may be used to calculate this device's ranking as a choice.
+
+uint32_t MediaEngineWebRTCMicrophoneSource::GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const
+{
+ uint32_t distance = 0;
+
+ for (const auto* cs : aConstraintSets) {
+ distance = GetMinimumFitnessDistance(*cs, aDeviceId);
+ break; // distance is read from first entry only
+ }
+ return distance;
+}
+
+nsresult
+MediaEngineWebRTCMicrophoneSource::Restart(AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(aHandle);
+ NormalizedConstraints constraints(aConstraints);
+ return ReevaluateAllocation(aHandle, &constraints, aPrefs, aDeviceId,
+ aOutBadConstraint);
+}
+
+bool operator == (const MediaEnginePrefs& a, const MediaEnginePrefs& b)
+{
+ return !memcmp(&a, &b, sizeof(MediaEnginePrefs));
+};
+
+nsresult
+MediaEngineWebRTCMicrophoneSource::UpdateSingleSource(
+ const AllocationHandle* aHandle,
+ const NormalizedConstraints& aNetConstraints,
+ const MediaEnginePrefs& aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ FlattenedConstraints c(aNetConstraints);
+
+ MediaEnginePrefs prefs = aPrefs;
+ prefs.mAecOn = c.mEchoCancellation.Get(prefs.mAecOn);
+ prefs.mAgcOn = c.mMozAutoGainControl.Get(prefs.mAgcOn);
+ prefs.mNoiseOn = c.mMozNoiseSuppression.Get(prefs.mNoiseOn);
+
+ LOG(("Audio config: aec: %d, agc: %d, noise: %d, delay: %d",
+ prefs.mAecOn ? prefs.mAec : -1,
+ prefs.mAgcOn ? prefs.mAgc : -1,
+ prefs.mNoiseOn ? prefs.mNoise : -1,
+ prefs.mPlayoutDelay));
+
+ mPlayoutDelay = prefs.mPlayoutDelay;
+
+ switch (mState) {
+ case kReleased:
+ MOZ_ASSERT(aHandle);
+ if (sChannelsOpen == 0) {
+ if (!InitEngine()) {
+ LOG(("Audio engine is not initalized"));
+ return NS_ERROR_FAILURE;
+ }
+ } else {
+ // Until we fix (or wallpaper) support for multiple mic input
+ // (Bug 1238038) fail allocation for a second device
+ return NS_ERROR_FAILURE;
+ }
+ if (!AllocChannel()) {
+ LOG(("Audio device is not initalized"));
+ return NS_ERROR_FAILURE;
+ }
+ if (mAudioInput->SetRecordingDevice(mCapIndex)) {
+ FreeChannel();
+ return NS_ERROR_FAILURE;
+ }
+ LOG(("Audio device %d allocated", mCapIndex));
+ break;
+
+ case kStarted:
+ if (prefs == mLastPrefs) {
+ return NS_OK;
+ }
+ if (MOZ_LOG_TEST(GetMediaManagerLog(), LogLevel::Debug)) {
+ MonitorAutoLock lock(mMonitor);
+ if (mSources.IsEmpty()) {
+ LOG(("Audio device %d reallocated", mCapIndex));
+ } else {
+ LOG(("Audio device %d allocated shared", mCapIndex));
+ }
+ }
+ break;
+
+ default:
+ LOG(("Audio device %d %s in ignored state %d", mCapIndex,
+ (aHandle? aHandle->mOrigin.get() : ""), mState));
+ break;
+ }
+
+ if (sChannelsOpen > 0) {
+ int error;
+
+ error = mVoEProcessing->SetEcStatus(prefs.mAecOn, (webrtc::EcModes)prefs.mAec);
+ if (error) {
+ LOG(("%s Error setting Echo Status: %d ",__FUNCTION__, error));
+ // Overhead of capturing all the time is very low (<0.1% of an audio only call)
+ if (prefs.mAecOn) {
+ error = mVoEProcessing->SetEcMetricsStatus(true);
+ if (error) {
+ LOG(("%s Error setting Echo Metrics: %d ",__FUNCTION__, error));
+ }
+ }
+ }
+ error = mVoEProcessing->SetAgcStatus(prefs.mAgcOn, (webrtc::AgcModes)prefs.mAgc);
+ if (error) {
+ LOG(("%s Error setting AGC Status: %d ",__FUNCTION__, error));
+ }
+ error = mVoEProcessing->SetNsStatus(prefs.mNoiseOn, (webrtc::NsModes)prefs.mNoise);
+ if (error) {
+ LOG(("%s Error setting NoiseSuppression Status: %d ",__FUNCTION__, error));
+ }
+ }
+
+ mSkipProcessing = !(prefs.mAecOn || prefs.mAgcOn || prefs.mNoiseOn);
+ if (mSkipProcessing) {
+ mSampleFrequency = MediaEngine::USE_GRAPH_RATE;
+ }
+ SetLastPrefs(prefs);
+ return NS_OK;
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::SetLastPrefs(
+ const MediaEnginePrefs& aPrefs)
+{
+ mLastPrefs = aPrefs;
+
+ RefPtr<MediaEngineWebRTCMicrophoneSource> that = this;
+
+ NS_DispatchToMainThread(media::NewRunnableFrom([that, aPrefs]() mutable {
+ that->mSettings.mEchoCancellation.Value() = aPrefs.mAecOn;
+ that->mSettings.mMozAutoGainControl.Value() = aPrefs.mAgcOn;
+ that->mSettings.mMozNoiseSuppression.Value() = aPrefs.mNoiseOn;
+ return NS_OK;
+ }));
+}
+
+
+nsresult
+MediaEngineWebRTCMicrophoneSource::Deallocate(AllocationHandle* aHandle)
+{
+ AssertIsOnOwningThread();
+
+ Super::Deallocate(aHandle);
+
+ if (!mRegisteredHandles.Length()) {
+ // If empty, no callbacks to deliver data should be occuring
+ if (mState != kStopped && mState != kAllocated) {
+ return NS_ERROR_FAILURE;
+ }
+
+ FreeChannel();
+ LOG(("Audio device %d deallocated", mCapIndex));
+ } else {
+ LOG(("Audio device %d deallocated but still in use", mCapIndex));
+ }
+ return NS_OK;
+}
+
+nsresult
+MediaEngineWebRTCMicrophoneSource::Start(SourceMediaStream *aStream,
+ TrackID aID,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ AssertIsOnOwningThread();
+ if (sChannelsOpen == 0 || !aStream) {
+ return NS_ERROR_FAILURE;
+ }
+
+ {
+ MonitorAutoLock lock(mMonitor);
+ mSources.AppendElement(aStream);
+ mPrincipalHandles.AppendElement(aPrincipalHandle);
+ MOZ_ASSERT(mSources.Length() == mPrincipalHandles.Length());
+ }
+
+ AudioSegment* segment = new AudioSegment();
+ if (mSampleFrequency == MediaEngine::USE_GRAPH_RATE) {
+ mSampleFrequency = aStream->GraphRate();
+ }
+ aStream->AddAudioTrack(aID, mSampleFrequency, 0, segment, SourceMediaStream::ADDTRACK_QUEUED);
+
+ // XXX Make this based on the pref.
+ aStream->RegisterForAudioMixing();
+ LOG(("Start audio for stream %p", aStream));
+
+ if (!mListener) {
+ mListener = new mozilla::WebRTCAudioDataListener(this);
+ }
+ if (mState == kStarted) {
+ MOZ_ASSERT(aID == mTrackID);
+ // Make sure we're associated with this stream
+ mAudioInput->StartRecording(aStream, mListener);
+ return NS_OK;
+ }
+ mState = kStarted;
+ mTrackID = aID;
+
+ // Make sure logger starts before capture
+ AsyncLatencyLogger::Get(true);
+
+ // Register output observer
+ // XXX
+ MOZ_ASSERT(gFarendObserver);
+ gFarendObserver->Clear();
+
+ if (mVoEBase->StartReceive(mChannel)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Must be *before* StartSend() so it will notice we selected external input (full_duplex)
+ mAudioInput->StartRecording(aStream, mListener);
+
+ if (mVoEBase->StartSend(mChannel)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Attach external media processor, so this::Process will be called.
+ mVoERender->RegisterExternalMediaProcessing(mChannel, webrtc::kRecordingPerChannel, *this);
+
+ return NS_OK;
+}
+
+nsresult
+MediaEngineWebRTCMicrophoneSource::Stop(SourceMediaStream *aSource, TrackID aID)
+{
+ AssertIsOnOwningThread();
+ {
+ MonitorAutoLock lock(mMonitor);
+
+ size_t sourceIndex = mSources.IndexOf(aSource);
+ if (sourceIndex == mSources.NoIndex) {
+ // Already stopped - this is allowed
+ return NS_OK;
+ }
+ mSources.RemoveElementAt(sourceIndex);
+ mPrincipalHandles.RemoveElementAt(sourceIndex);
+ MOZ_ASSERT(mSources.Length() == mPrincipalHandles.Length());
+
+ aSource->EndTrack(aID);
+
+ if (!mSources.IsEmpty()) {
+ mAudioInput->StopRecording(aSource);
+ return NS_OK;
+ }
+ if (mState != kStarted) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!mVoEBase) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mState = kStopped;
+ }
+ if (mListener) {
+ // breaks a cycle, since the WebRTCAudioDataListener has a RefPtr to us
+ mListener->Shutdown();
+ mListener = nullptr;
+ }
+
+ mAudioInput->StopRecording(aSource);
+
+ mVoERender->DeRegisterExternalMediaProcessing(mChannel, webrtc::kRecordingPerChannel);
+
+ if (mVoEBase->StopSend(mChannel)) {
+ return NS_ERROR_FAILURE;
+ }
+ if (mVoEBase->StopReceive(mChannel)) {
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::NotifyPull(MediaStreamGraph *aGraph,
+ SourceMediaStream *aSource,
+ TrackID aID,
+ StreamTime aDesiredTime,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ // Ignore - we push audio data
+ LOG_FRAMES(("NotifyPull, desired = %ld", (int64_t) aDesiredTime));
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::NotifyOutputData(MediaStreamGraph* aGraph,
+ AudioDataValue* aBuffer,
+ size_t aFrames,
+ TrackRate aRate,
+ uint32_t aChannels)
+{
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::PacketizeAndProcess(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer,
+ size_t aFrames,
+ TrackRate aRate,
+ uint32_t aChannels)
+{
+ // This will call Process() with data coming out of the AEC/NS/AGC/etc chain
+ if (!mPacketizer ||
+ mPacketizer->PacketSize() != aRate/100u ||
+ mPacketizer->Channels() != aChannels) {
+ // It's ok to drop the audio still in the packetizer here.
+ mPacketizer =
+ new AudioPacketizer<AudioDataValue, int16_t>(aRate/100, aChannels);
+ }
+
+ mPacketizer->Input(aBuffer, static_cast<uint32_t>(aFrames));
+
+ while (mPacketizer->PacketsAvailable()) {
+ uint32_t samplesPerPacket = mPacketizer->PacketSize() *
+ mPacketizer->Channels();
+ if (mInputBuffer.Length() < samplesPerPacket) {
+ mInputBuffer.SetLength(samplesPerPacket);
+ }
+ int16_t* packet = mInputBuffer.Elements();
+ mPacketizer->Output(packet);
+
+ mVoERender->ExternalRecordingInsertData(packet, samplesPerPacket, aRate, 0);
+ }
+}
+
+template<typename T>
+void
+MediaEngineWebRTCMicrophoneSource::InsertInGraph(const T* aBuffer,
+ size_t aFrames,
+ uint32_t aChannels)
+{
+ if (mState != kStarted) {
+ return;
+ }
+
+ size_t len = mSources.Length();
+ for (size_t i = 0; i < len; i++) {
+ if (!mSources[i]) {
+ continue;
+ }
+ RefPtr<SharedBuffer> buffer =
+ SharedBuffer::Create(aFrames * aChannels * sizeof(T));
+ PodCopy(static_cast<T*>(buffer->Data()),
+ aBuffer, aFrames * aChannels);
+
+ TimeStamp insertTime;
+ // Make sure we include the stream and the track.
+ // The 0:1 is a flag to note when we've done the final insert for a given input block.
+ LogTime(AsyncLatencyLogger::AudioTrackInsertion,
+ LATENCY_STREAM_ID(mSources[i].get(), mTrackID),
+ (i+1 < len) ? 0 : 1, insertTime);
+
+ nsAutoPtr<AudioSegment> segment(new AudioSegment());
+ AutoTArray<const T*, 1> channels;
+ // XXX Bug 971528 - Support stereo capture in gUM
+ MOZ_ASSERT(aChannels == 1,
+ "GraphDriver only supports us stereo audio for now");
+ channels.AppendElement(static_cast<T*>(buffer->Data()));
+ segment->AppendFrames(buffer.forget(), channels, aFrames,
+ mPrincipalHandles[i]);
+ segment->GetStartTime(insertTime);
+
+ mSources[i]->AppendToTrack(mTrackID, segment);
+ }
+}
+
+// Called back on GraphDriver thread!
+// Note this can be called back after ::Shutdown()
+void
+MediaEngineWebRTCMicrophoneSource::NotifyInputData(MediaStreamGraph* aGraph,
+ const AudioDataValue* aBuffer,
+ size_t aFrames,
+ TrackRate aRate,
+ uint32_t aChannels)
+{
+ // If some processing is necessary, packetize and insert in the WebRTC.org
+ // code. Otherwise, directly insert the mic data in the MSG, bypassing all processing.
+ if (PassThrough()) {
+ InsertInGraph<AudioDataValue>(aBuffer, aFrames, aChannels);
+ } else {
+ PacketizeAndProcess(aGraph, aBuffer, aFrames, aRate, aChannels);
+ }
+}
+
+#define ResetProcessingIfNeeded(_processing) \
+do { \
+ webrtc::_processing##Modes mode; \
+ int rv = mVoEProcessing->Get##_processing##Status(enabled, mode); \
+ if (rv) { \
+ NS_WARNING("Could not get the status of the " \
+ #_processing " on device change."); \
+ return; \
+ } \
+ \
+ if (enabled) { \
+ rv = mVoEProcessing->Set##_processing##Status(!enabled); \
+ if (rv) { \
+ NS_WARNING("Could not reset the status of the " \
+ #_processing " on device change."); \
+ return; \
+ } \
+ \
+ rv = mVoEProcessing->Set##_processing##Status(enabled); \
+ if (rv) { \
+ NS_WARNING("Could not reset the status of the " \
+ #_processing " on device change."); \
+ return; \
+ } \
+ } \
+} while(0)
+
+void
+MediaEngineWebRTCMicrophoneSource::DeviceChanged() {
+ // Reset some processing
+ bool enabled;
+ ResetProcessingIfNeeded(Agc);
+ ResetProcessingIfNeeded(Ec);
+ ResetProcessingIfNeeded(Ns);
+}
+
+bool
+MediaEngineWebRTCMicrophoneSource::InitEngine()
+{
+ MOZ_ASSERT(!mVoEBase);
+ mVoEBase = webrtc::VoEBase::GetInterface(mVoiceEngine);
+
+ mVoEBase->Init();
+
+ mVoERender = webrtc::VoEExternalMedia::GetInterface(mVoiceEngine);
+ if (mVoERender) {
+ mVoENetwork = webrtc::VoENetwork::GetInterface(mVoiceEngine);
+ if (mVoENetwork) {
+ mVoEProcessing = webrtc::VoEAudioProcessing::GetInterface(mVoiceEngine);
+ if (mVoEProcessing) {
+ mNullTransport = new NullTransport();
+ return true;
+ }
+ }
+ }
+ DeInitEngine();
+ return false;
+}
+
+// This shuts down the engine when no channel is open
+void
+MediaEngineWebRTCMicrophoneSource::DeInitEngine()
+{
+ if (mVoEBase) {
+ mVoEBase->Terminate();
+ delete mNullTransport;
+ mNullTransport = nullptr;
+
+ mVoEProcessing = nullptr;
+ mVoENetwork = nullptr;
+ mVoERender = nullptr;
+ mVoEBase = nullptr;
+ }
+}
+
+// This shuts down the engine when no channel is open.
+// mState records if a channel is allocated (slightly redundantly to mChannel)
+void
+MediaEngineWebRTCMicrophoneSource::FreeChannel()
+{
+ if (mState != kReleased) {
+ if (mChannel != -1) {
+ MOZ_ASSERT(mVoENetwork && mVoEBase);
+ if (mVoENetwork) {
+ mVoENetwork->DeRegisterExternalTransport(mChannel);
+ }
+ if (mVoEBase) {
+ mVoEBase->DeleteChannel(mChannel);
+ }
+ mChannel = -1;
+ }
+ mState = kReleased;
+
+ MOZ_ASSERT(sChannelsOpen > 0);
+ if (--sChannelsOpen == 0) {
+ DeInitEngine();
+ }
+ }
+}
+
+bool
+MediaEngineWebRTCMicrophoneSource::AllocChannel()
+{
+ MOZ_ASSERT(mVoEBase);
+
+ mChannel = mVoEBase->CreateChannel();
+ if (mChannel >= 0) {
+ if (!mVoENetwork->RegisterExternalTransport(mChannel, *mNullTransport)) {
+ mSampleFrequency = MediaEngine::DEFAULT_SAMPLE_RATE;
+ LOG(("%s: sampling rate %u", __FUNCTION__, mSampleFrequency));
+
+ // Check for availability.
+ if (!mAudioInput->SetRecordingDevice(mCapIndex)) {
+#ifndef MOZ_B2G
+ // Because of the permission mechanism of B2G, we need to skip the status
+ // check here.
+ bool avail = false;
+ mAudioInput->GetRecordingDeviceStatus(avail);
+ if (!avail) {
+ if (sChannelsOpen == 0) {
+ DeInitEngine();
+ }
+ return false;
+ }
+#endif // MOZ_B2G
+
+ // Set "codec" to PCM, 32kHz on 1 channel
+ ScopedCustomReleasePtr<webrtc::VoECodec> ptrVoECodec(webrtc::VoECodec::GetInterface(mVoiceEngine));
+ if (ptrVoECodec) {
+ webrtc::CodecInst codec;
+ strcpy(codec.plname, ENCODING);
+ codec.channels = CHANNELS;
+ MOZ_ASSERT(mSampleFrequency == 16000 || mSampleFrequency == 32000);
+ codec.rate = SAMPLE_RATE(mSampleFrequency);
+ codec.plfreq = mSampleFrequency;
+ codec.pacsize = SAMPLE_LENGTH(mSampleFrequency);
+ codec.pltype = 0; // Default payload type
+
+ if (!ptrVoECodec->SetSendCodec(mChannel, codec)) {
+ mState = kAllocated;
+ sChannelsOpen++;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ mVoEBase->DeleteChannel(mChannel);
+ mChannel = -1;
+ if (sChannelsOpen == 0) {
+ DeInitEngine();
+ }
+ return false;
+}
+
+void
+MediaEngineWebRTCMicrophoneSource::Shutdown()
+{
+ Super::Shutdown();
+ if (mListener) {
+ // breaks a cycle, since the WebRTCAudioDataListener has a RefPtr to us
+ mListener->Shutdown();
+ // Don't release the webrtc.org pointers yet until the Listener is (async) shutdown
+ mListener = nullptr;
+ }
+
+ if (mState == kStarted) {
+ SourceMediaStream *source;
+ bool empty;
+
+ while (1) {
+ {
+ MonitorAutoLock lock(mMonitor);
+ empty = mSources.IsEmpty();
+ if (empty) {
+ break;
+ }
+ source = mSources[0];
+ }
+ Stop(source, kAudioTrack); // XXX change to support multiple tracks
+ }
+ MOZ_ASSERT(mState == kStopped);
+ }
+
+ while (mRegisteredHandles.Length()) {
+ MOZ_ASSERT(mState == kAllocated || mState == kStopped);
+ // on last Deallocate(), FreeChannel()s and DeInit()s if all channels are released
+ Deallocate(mRegisteredHandles[0].get());
+ }
+ MOZ_ASSERT(mState == kReleased);
+
+ mAudioInput = nullptr;
+}
+
+typedef int16_t sample;
+
+void
+MediaEngineWebRTCMicrophoneSource::Process(int channel,
+ webrtc::ProcessingTypes type,
+ sample *audio10ms, int length,
+ int samplingFreq, bool isStereo)
+{
+ MOZ_ASSERT(!PassThrough(), "This should be bypassed when in PassThrough mode.");
+ // On initial capture, throw away all far-end data except the most recent sample
+ // since it's already irrelevant and we want to keep avoid confusing the AEC far-end
+ // input code with "old" audio.
+ if (!mStarted) {
+ mStarted = true;
+ while (gFarendObserver->Size() > 1) {
+ free(gFarendObserver->Pop()); // only call if size() > 0
+ }
+ }
+
+ while (gFarendObserver->Size() > 0) {
+ FarEndAudioChunk *buffer = gFarendObserver->Pop(); // only call if size() > 0
+ if (buffer) {
+ int length = buffer->mSamples;
+ int res = mVoERender->ExternalPlayoutData(buffer->mData,
+ gFarendObserver->PlayoutFrequency(),
+ gFarendObserver->PlayoutChannels(),
+ mPlayoutDelay,
+ length);
+ free(buffer);
+ if (res == -1) {
+ return;
+ }
+ }
+ }
+
+ MonitorAutoLock lock(mMonitor);
+ if (mState != kStarted)
+ return;
+
+ MOZ_ASSERT(!isStereo);
+ InsertInGraph<int16_t>(audio10ms, length, 1);
+ return;
+}
+
+void
+MediaEngineWebRTCAudioCaptureSource::GetName(nsAString &aName) const
+{
+ aName.AssignLiteral("AudioCapture");
+}
+
+void
+MediaEngineWebRTCAudioCaptureSource::GetUUID(nsACString &aUUID) const
+{
+ nsID uuid;
+ char uuidBuffer[NSID_LENGTH];
+ nsCString asciiString;
+ ErrorResult rv;
+
+ rv = nsContentUtils::GenerateUUIDInPlace(uuid);
+ if (rv.Failed()) {
+ aUUID.AssignLiteral("");
+ return;
+ }
+
+
+ uuid.ToProvidedString(uuidBuffer);
+ asciiString.AssignASCII(uuidBuffer);
+
+ // Remove {} and the null terminator
+ aUUID.Assign(Substring(asciiString, 1, NSID_LENGTH - 3));
+}
+
+nsresult
+MediaEngineWebRTCAudioCaptureSource::Start(SourceMediaStream *aMediaStream,
+ TrackID aId,
+ const PrincipalHandle& aPrincipalHandle)
+{
+ AssertIsOnOwningThread();
+ aMediaStream->AddTrack(aId, 0, new AudioSegment());
+ return NS_OK;
+}
+
+nsresult
+MediaEngineWebRTCAudioCaptureSource::Stop(SourceMediaStream *aMediaStream,
+ TrackID aId)
+{
+ AssertIsOnOwningThread();
+ aMediaStream->EndAllTrackAndFinish();
+ return NS_OK;
+}
+
+nsresult
+MediaEngineWebRTCAudioCaptureSource::Restart(
+ AllocationHandle* aHandle,
+ const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId,
+ const char** aOutBadConstraint)
+{
+ MOZ_ASSERT(!aHandle);
+ return NS_OK;
+}
+
+uint32_t
+MediaEngineWebRTCAudioCaptureSource::GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ const nsString& aDeviceId) const
+{
+ // There is only one way of capturing audio for now, and it's always adequate.
+ return 0;
+}
+
+}
diff --git a/dom/media/webrtc/MediaTrackConstraints.cpp b/dom/media/webrtc/MediaTrackConstraints.cpp
new file mode 100644
index 000000000..6225b6d49
--- /dev/null
+++ b/dom/media/webrtc/MediaTrackConstraints.cpp
@@ -0,0 +1,469 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaTrackConstraints.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+
+#include <limits>
+#include <algorithm>
+#include <iterator>
+
+namespace mozilla {
+
+template<class ValueType>
+template<class ConstrainRange>
+void
+NormalizedConstraintSet::Range<ValueType>::SetFrom(const ConstrainRange& aOther)
+{
+ if (aOther.mIdeal.WasPassed()) {
+ mIdeal.emplace(aOther.mIdeal.Value());
+ }
+ if (aOther.mExact.WasPassed()) {
+ mMin = aOther.mExact.Value();
+ mMax = aOther.mExact.Value();
+ } else {
+ if (aOther.mMin.WasPassed()) {
+ mMin = aOther.mMin.Value();
+ }
+ if (aOther.mMax.WasPassed()) {
+ mMax = aOther.mMax.Value();
+ }
+ }
+}
+
+// The Range code works surprisingly well for bool, except when averaging ideals.
+template<>
+bool
+NormalizedConstraintSet::Range<bool>::Merge(const Range& aOther) {
+ if (!Intersects(aOther)) {
+ return false;
+ }
+ Intersect(aOther);
+
+ // To avoid "unsafe use of type 'bool'", we keep counter in mMergeDenominator
+ uint32_t counter = mMergeDenominator >> 16;
+ uint32_t denominator = mMergeDenominator & 0xffff;
+
+ if (aOther.mIdeal.isSome()) {
+ if (mIdeal.isNothing()) {
+ mIdeal.emplace(aOther.Get(false));
+ counter = aOther.Get(false);
+ denominator = 1;
+ } else {
+ if (!denominator) {
+ counter = Get(false);
+ denominator = 1;
+ }
+ counter += aOther.Get(false);
+ denominator++;
+ }
+ }
+ mMergeDenominator = ((counter & 0xffff) << 16) + (denominator & 0xffff);
+ return true;
+}
+
+template<>
+void
+NormalizedConstraintSet::Range<bool>::FinalizeMerge()
+{
+ if (mMergeDenominator) {
+ uint32_t counter = mMergeDenominator >> 16;
+ uint32_t denominator = mMergeDenominator & 0xffff;
+
+ *mIdeal = !!(counter / denominator);
+ mMergeDenominator = 0;
+ }
+}
+
+NormalizedConstraintSet::LongRange::LongRange(
+ LongPtrType aMemberPtr,
+ const char* aName,
+ const dom::OwningLongOrConstrainLongRange& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList)
+: Range<int32_t>((MemberPtrType)aMemberPtr, aName,
+ 1 + INT32_MIN, INT32_MAX, // +1 avoids Windows compiler bug
+ aList)
+{
+ if (aOther.IsLong()) {
+ if (advanced) {
+ mMin = mMax = aOther.GetAsLong();
+ } else {
+ mIdeal.emplace(aOther.GetAsLong());
+ }
+ } else {
+ SetFrom(aOther.GetAsConstrainLongRange());
+ }
+}
+
+NormalizedConstraintSet::LongLongRange::LongLongRange(
+ LongLongPtrType aMemberPtr,
+ const char* aName,
+ const long long& aOther,
+ nsTArray<MemberPtrType>* aList)
+: Range<int64_t>((MemberPtrType)aMemberPtr, aName,
+ 1 + INT64_MIN, INT64_MAX, // +1 avoids Windows compiler bug
+ aList)
+{
+ mIdeal.emplace(aOther);
+}
+
+NormalizedConstraintSet::DoubleRange::DoubleRange(
+ DoublePtrType aMemberPtr,
+ const char* aName,
+ const dom::OwningDoubleOrConstrainDoubleRange& aOther, bool advanced,
+ nsTArray<MemberPtrType>* aList)
+: Range<double>((MemberPtrType)aMemberPtr, aName,
+ -std::numeric_limits<double>::infinity(),
+ std::numeric_limits<double>::infinity(), aList)
+{
+ if (aOther.IsDouble()) {
+ if (advanced) {
+ mMin = mMax = aOther.GetAsDouble();
+ } else {
+ mIdeal.emplace(aOther.GetAsDouble());
+ }
+ } else {
+ SetFrom(aOther.GetAsConstrainDoubleRange());
+ }
+}
+
+NormalizedConstraintSet::BooleanRange::BooleanRange(
+ BooleanPtrType aMemberPtr,
+ const char* aName,
+ const dom::OwningBooleanOrConstrainBooleanParameters& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList)
+: Range<bool>((MemberPtrType)aMemberPtr, aName, false, true, aList)
+{
+ if (aOther.IsBoolean()) {
+ if (advanced) {
+ mMin = mMax = aOther.GetAsBoolean();
+ } else {
+ mIdeal.emplace(aOther.GetAsBoolean());
+ }
+ } else {
+ const dom::ConstrainBooleanParameters& r = aOther.GetAsConstrainBooleanParameters();
+ if (r.mIdeal.WasPassed()) {
+ mIdeal.emplace(r.mIdeal.Value());
+ }
+ if (r.mExact.WasPassed()) {
+ mMin = r.mExact.Value();
+ mMax = r.mExact.Value();
+ }
+ }
+}
+
+NormalizedConstraintSet::StringRange::StringRange(
+ StringPtrType aMemberPtr,
+ const char* aName,
+ const dom::OwningStringOrStringSequenceOrConstrainDOMStringParameters& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList)
+ : BaseRange((MemberPtrType)aMemberPtr, aName, aList)
+{
+ if (aOther.IsString()) {
+ if (advanced) {
+ mExact.insert(aOther.GetAsString());
+ } else {
+ mIdeal.insert(aOther.GetAsString());
+ }
+ } else if (aOther.IsStringSequence()) {
+ if (advanced) {
+ mExact.clear();
+ for (auto& str : aOther.GetAsStringSequence()) {
+ mExact.insert(str);
+ }
+ } else {
+ mIdeal.clear();
+ for (auto& str : aOther.GetAsStringSequence()) {
+ mIdeal.insert(str);
+ }
+ }
+ } else {
+ SetFrom(aOther.GetAsConstrainDOMStringParameters());
+ }
+}
+
+void
+NormalizedConstraintSet::StringRange::SetFrom(
+ const dom::ConstrainDOMStringParameters& aOther)
+{
+ if (aOther.mIdeal.WasPassed()) {
+ mIdeal.clear();
+ if (aOther.mIdeal.Value().IsString()) {
+ mIdeal.insert(aOther.mIdeal.Value().GetAsString());
+ } else {
+ for (auto& str : aOther.mIdeal.Value().GetAsStringSequence()) {
+ mIdeal.insert(str);
+ }
+ }
+ }
+ if (aOther.mExact.WasPassed()) {
+ mExact.clear();
+ if (aOther.mExact.Value().IsString()) {
+ mExact.insert(aOther.mExact.Value().GetAsString());
+ } else {
+ for (auto& str : aOther.mExact.Value().GetAsStringSequence()) {
+ mIdeal.insert(str);
+ }
+ }
+ }
+}
+
+auto
+NormalizedConstraintSet::StringRange::Clamp(const ValueType& n) const -> ValueType
+{
+ if (!mExact.size()) {
+ return n;
+ }
+ ValueType result;
+ for (auto& entry : n) {
+ if (mExact.find(entry) != mExact.end()) {
+ result.insert(entry);
+ }
+ }
+ return result;
+}
+
+bool
+NormalizedConstraintSet::StringRange::Intersects(const StringRange& aOther) const
+{
+ if (!mExact.size() || !aOther.mExact.size()) {
+ return true;
+ }
+
+ ValueType intersection;
+ set_intersection(mExact.begin(), mExact.end(),
+ aOther.mExact.begin(), aOther.mExact.end(),
+ std::inserter(intersection, intersection.begin()));
+ return !!intersection.size();
+}
+
+void
+NormalizedConstraintSet::StringRange::Intersect(const StringRange& aOther)
+{
+ if (!aOther.mExact.size()) {
+ return;
+ }
+
+ ValueType intersection;
+ set_intersection(mExact.begin(), mExact.end(),
+ aOther.mExact.begin(), aOther.mExact.end(),
+ std::inserter(intersection, intersection.begin()));
+ mExact = intersection;
+}
+
+bool
+NormalizedConstraintSet::StringRange::Merge(const StringRange& aOther)
+{
+ if (!Intersects(aOther)) {
+ return false;
+ }
+ Intersect(aOther);
+
+ ValueType unioned;
+ set_union(mIdeal.begin(), mIdeal.end(),
+ aOther.mIdeal.begin(), aOther.mIdeal.end(),
+ std::inserter(unioned, unioned.begin()));
+ mIdeal = unioned;
+ return true;
+}
+
+NormalizedConstraints::NormalizedConstraints(
+ const dom::MediaTrackConstraints& aOther,
+ nsTArray<MemberPtrType>* aList)
+ : NormalizedConstraintSet(aOther, false, aList)
+ , mBadConstraint(nullptr)
+{
+ if (aOther.mAdvanced.WasPassed()) {
+ for (auto& entry : aOther.mAdvanced.Value()) {
+ mAdvanced.push_back(NormalizedConstraintSet(entry, true));
+ }
+ }
+}
+
+// Merge constructor. Create net constraints out of merging a set of others.
+// This is only used to resolve competing constraints from concurrent requests,
+// something the spec doesn't cover.
+
+NormalizedConstraints::NormalizedConstraints(
+ const nsTArray<const NormalizedConstraints*>& aOthers)
+ : NormalizedConstraintSet(*aOthers[0])
+ , mBadConstraint(nullptr)
+{
+ for (auto& entry : aOthers[0]->mAdvanced) {
+ mAdvanced.push_back(entry);
+ }
+
+ // Create a list of member pointers.
+ nsTArray<MemberPtrType> list;
+ NormalizedConstraints dummy(dom::MediaTrackConstraints(), &list);
+
+ // Do intersection of all required constraints, and average of ideals,
+
+ for (uint32_t i = 1; i < aOthers.Length(); i++) {
+ auto& other = *aOthers[i];
+
+ for (auto& memberPtr : list) {
+ auto& member = this->*memberPtr;
+ auto& otherMember = other.*memberPtr;
+
+ if (!member.Merge(otherMember)) {
+ mBadConstraint = member.mName;
+ return;
+ }
+ }
+
+ for (auto& entry : other.mAdvanced) {
+ mAdvanced.push_back(entry);
+ }
+ }
+ for (auto& memberPtr : list) {
+ (this->*memberPtr).FinalizeMerge();
+ }
+
+ // ...except for resolution and frame rate where we take the highest ideal.
+ // This is a bit of a hack based on the perception that people would be more
+ // surprised if they were to get lower resolution than they ideally requested.
+ //
+ // The spec gives browsers leeway here, saying they "SHOULD use the one with
+ // the smallest fitness distance", and also does not directly address the
+ // problem of competing constraints at all. There is no real web interop issue
+ // here since this is more about interop with other tabs on the same browser.
+ //
+ // We should revisit this logic once we support downscaling of resolutions and
+ // decimating of frame rates, per track.
+
+ for (auto& other : aOthers) {
+ mWidth.TakeHighestIdeal(other->mWidth);
+ mHeight.TakeHighestIdeal(other->mHeight);
+
+ // Consider implicit 30 fps default in comparison of competing constraints.
+ // Avoids 160x90x10 and 640x480 becoming 1024x768x10 (fitness distance flaw)
+ // This pretty much locks in 30 fps or higher, except for single-tab use.
+ auto frameRate = other->mFrameRate;
+ if (frameRate.mIdeal.isNothing()) {
+ frameRate.mIdeal.emplace(30);
+ }
+ mFrameRate.TakeHighestIdeal(frameRate);
+ }
+}
+
+FlattenedConstraints::FlattenedConstraints(const NormalizedConstraints& aOther)
+: NormalizedConstraintSet(aOther)
+{
+ for (auto& set : aOther.mAdvanced) {
+ // Must only apply compatible i.e. inherently non-overconstraining sets
+ // This rule is pretty much why this code is centralized here.
+ if (mWidth.Intersects(set.mWidth) &&
+ mHeight.Intersects(set.mHeight) &&
+ mFrameRate.Intersects(set.mFrameRate)) {
+ mWidth.Intersect(set.mWidth);
+ mHeight.Intersect(set.mHeight);
+ mFrameRate.Intersect(set.mFrameRate);
+ }
+ if (mEchoCancellation.Intersects(set.mEchoCancellation)) {
+ mEchoCancellation.Intersect(set.mEchoCancellation);
+ }
+ if (mMozNoiseSuppression.Intersects(set.mMozNoiseSuppression)) {
+ mMozNoiseSuppression.Intersect(set.mMozNoiseSuppression);
+ }
+ if (mMozAutoGainControl.Intersects(set.mMozAutoGainControl)) {
+ mMozAutoGainControl.Intersect(set.mMozAutoGainControl);
+ }
+ }
+}
+
+// MediaEngine helper
+//
+// The full algorithm for all devices. Sources that don't list capabilities
+// need to fake it and hardcode some by populating mHardcodedCapabilities above.
+//
+// Fitness distance returned as integer math * 1000. Infinity = UINT32_MAX
+
+// First, all devices have a minimum distance based on their deviceId.
+// If you have no other constraints, use this one. Reused by all device types.
+
+uint32_t
+MediaConstraintsHelper::GetMinimumFitnessDistance(
+ const NormalizedConstraintSet &aConstraints,
+ const nsString& aDeviceId)
+{
+ return FitnessDistance(aDeviceId, aConstraints.mDeviceId);
+}
+
+template<class ValueType, class NormalizedRange>
+/* static */ uint32_t
+MediaConstraintsHelper::FitnessDistance(ValueType aN,
+ const NormalizedRange& aRange)
+{
+ if (aRange.mMin > aN || aRange.mMax < aN) {
+ return UINT32_MAX;
+ }
+ if (aN == aRange.mIdeal.valueOr(aN)) {
+ return 0;
+ }
+ return uint32_t(ValueType((std::abs(aN - aRange.mIdeal.value()) * 1000) /
+ std::max(std::abs(aN), std::abs(aRange.mIdeal.value()))));
+}
+
+// Fitness distance returned as integer math * 1000. Infinity = UINT32_MAX
+
+/* static */ uint32_t
+MediaConstraintsHelper::FitnessDistance(
+ nsString aN,
+ const NormalizedConstraintSet::StringRange& aParams)
+{
+ if (aParams.mExact.size() && aParams.mExact.find(aN) == aParams.mExact.end()) {
+ return UINT32_MAX;
+ }
+ if (aParams.mIdeal.size() && aParams.mIdeal.find(aN) == aParams.mIdeal.end()) {
+ return 1000;
+ }
+ return 0;
+}
+
+template<class MediaEngineSourceType>
+const char*
+MediaConstraintsHelper::FindBadConstraint(
+ const NormalizedConstraints& aConstraints,
+ const MediaEngineSourceType& aMediaEngineSource,
+ const nsString& aDeviceId)
+{
+ class MockDevice
+ {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MockDevice);
+
+ explicit MockDevice(const MediaEngineSourceType* aMediaEngineSource,
+ const nsString& aDeviceId)
+ : mMediaEngineSource(aMediaEngineSource),
+ // The following dud code exists to avoid 'unused typedef' error on linux.
+ mDeviceId(MockDevice::HasThreadSafeRefCnt::value ? aDeviceId : nsString()) {}
+
+ uint32_t GetBestFitnessDistance(
+ const nsTArray<const NormalizedConstraintSet*>& aConstraintSets,
+ bool aIsChrome)
+ {
+ return mMediaEngineSource->GetBestFitnessDistance(aConstraintSets,
+ mDeviceId);
+ }
+
+ private:
+ ~MockDevice() {}
+
+ const MediaEngineSourceType* mMediaEngineSource;
+ nsString mDeviceId;
+ };
+
+ Unused << typename MockDevice::HasThreadSafeRefCnt();
+
+ nsTArray<RefPtr<MockDevice>> devices;
+ devices.AppendElement(new MockDevice(&aMediaEngineSource, aDeviceId));
+ return FindBadConstraint(aConstraints, devices);
+}
+
+}
diff --git a/dom/media/webrtc/MediaTrackConstraints.h b/dom/media/webrtc/MediaTrackConstraints.h
new file mode 100644
index 000000000..842fea0d2
--- /dev/null
+++ b/dom/media/webrtc/MediaTrackConstraints.h
@@ -0,0 +1,449 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// This file should not be included by other includes, as it contains code
+
+#ifndef MEDIATRACKCONSTRAINTS_H_
+#define MEDIATRACKCONSTRAINTS_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/MediaTrackConstraintSetBinding.h"
+#include "mozilla/dom/MediaTrackSupportedConstraintsBinding.h"
+
+#include <map>
+#include <set>
+#include <vector>
+
+namespace mozilla {
+
+template<class EnumValuesStrings, class Enum>
+static const char* EnumToASCII(const EnumValuesStrings& aStrings, Enum aValue) {
+ return aStrings[uint32_t(aValue)].value;
+}
+
+template<class EnumValuesStrings, class Enum>
+static Enum StringToEnum(const EnumValuesStrings& aStrings,
+ const nsAString& aValue, Enum aDefaultValue) {
+ for (size_t i = 0; aStrings[i].value; i++) {
+ if (aValue.EqualsASCII(aStrings[i].value)) {
+ return Enum(i);
+ }
+ }
+ return aDefaultValue;
+}
+
+// Helper classes for orthogonal constraints without interdependencies.
+// Instead of constraining values, constrain the constraints themselves.
+
+class NormalizedConstraintSet
+{
+protected:
+ class BaseRange
+ {
+ protected:
+ typedef BaseRange NormalizedConstraintSet::* MemberPtrType;
+
+ BaseRange(MemberPtrType aMemberPtr, const char* aName,
+ nsTArray<MemberPtrType>* aList) : mName(aName) {
+ if (aList) {
+ aList->AppendElement(aMemberPtr);
+ }
+ }
+ virtual ~BaseRange() {}
+ public:
+ virtual bool Merge(const BaseRange& aOther) = 0;
+ virtual void FinalizeMerge() = 0;
+
+ const char* mName;
+ };
+
+ typedef BaseRange NormalizedConstraintSet::* MemberPtrType;
+
+public:
+ template<class ValueType>
+ class Range : public BaseRange
+ {
+ public:
+ ValueType mMin, mMax;
+ Maybe<ValueType> mIdeal;
+
+ Range(MemberPtrType aMemberPtr, const char* aName, ValueType aMin,
+ ValueType aMax, nsTArray<MemberPtrType>* aList)
+ : BaseRange(aMemberPtr, aName, aList)
+ , mMin(aMin), mMax(aMax), mMergeDenominator(0) {}
+ virtual ~Range() {};
+
+ template<class ConstrainRange>
+ void SetFrom(const ConstrainRange& aOther);
+ ValueType Clamp(ValueType n) const { return std::max(mMin, std::min(n, mMax)); }
+ ValueType Get(ValueType defaultValue) const {
+ return Clamp(mIdeal.valueOr(defaultValue));
+ }
+ bool Intersects(const Range& aOther) const {
+ return mMax >= aOther.mMin && mMin <= aOther.mMax;
+ }
+ void Intersect(const Range& aOther) {
+ MOZ_ASSERT(Intersects(aOther));
+ mMin = std::max(mMin, aOther.mMin);
+ mMax = std::min(mMax, aOther.mMax);
+ }
+ bool Merge(const Range& aOther) {
+ if (!Intersects(aOther)) {
+ return false;
+ }
+ Intersect(aOther);
+
+ if (aOther.mIdeal.isSome()) {
+ // Ideal values, as stored, may be outside their min max range, so use
+ // clamped values in averaging, to avoid extreme outliers skewing results.
+ if (mIdeal.isNothing()) {
+ mIdeal.emplace(aOther.Get(0));
+ mMergeDenominator = 1;
+ } else {
+ if (!mMergeDenominator) {
+ *mIdeal = Get(0);
+ mMergeDenominator = 1;
+ }
+ *mIdeal += aOther.Get(0);
+ mMergeDenominator++;
+ }
+ }
+ return true;
+ }
+ void FinalizeMerge() override
+ {
+ if (mMergeDenominator) {
+ *mIdeal /= mMergeDenominator;
+ mMergeDenominator = 0;
+ }
+ }
+ void TakeHighestIdeal(const Range& aOther) {
+ if (aOther.mIdeal.isSome()) {
+ if (mIdeal.isNothing()) {
+ mIdeal.emplace(aOther.Get(0));
+ } else {
+ *mIdeal = std::max(Get(0), aOther.Get(0));
+ }
+ }
+ }
+ private:
+ bool Merge(const BaseRange& aOther) override {
+ return Merge(static_cast<const Range&>(aOther));
+ }
+
+ uint32_t mMergeDenominator;
+ };
+
+ struct LongRange : public Range<int32_t>
+ {
+ typedef LongRange NormalizedConstraintSet::* LongPtrType;
+
+ LongRange(LongPtrType aMemberPtr, const char* aName,
+ const dom::OwningLongOrConstrainLongRange& aOther, bool advanced,
+ nsTArray<MemberPtrType>* aList);
+ };
+
+ struct LongLongRange : public Range<int64_t>
+ {
+ typedef LongLongRange NormalizedConstraintSet::* LongLongPtrType;
+
+ LongLongRange(LongLongPtrType aMemberPtr, const char* aName,
+ const long long& aOther,
+ nsTArray<MemberPtrType>* aList);
+ };
+
+ struct DoubleRange : public Range<double>
+ {
+ typedef DoubleRange NormalizedConstraintSet::* DoublePtrType;
+
+ DoubleRange(DoublePtrType aMemberPtr,
+ const char* aName,
+ const dom::OwningDoubleOrConstrainDoubleRange& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList);
+ };
+
+ struct BooleanRange : public Range<bool>
+ {
+ typedef BooleanRange NormalizedConstraintSet::* BooleanPtrType;
+
+ BooleanRange(BooleanPtrType aMemberPtr, const char* aName,
+ const dom::OwningBooleanOrConstrainBooleanParameters& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList);
+
+ BooleanRange(BooleanPtrType aMemberPtr, const char* aName, const bool& aOther,
+ nsTArray<MemberPtrType>* aList)
+ : Range<bool>((MemberPtrType)aMemberPtr, aName, false, true, aList) {
+ mIdeal.emplace(aOther);
+ }
+ };
+
+ struct StringRange : public BaseRange
+ {
+ typedef std::set<nsString> ValueType;
+ ValueType mExact, mIdeal;
+
+ typedef StringRange NormalizedConstraintSet::* StringPtrType;
+
+ StringRange(StringPtrType aMemberPtr, const char* aName,
+ const dom::OwningStringOrStringSequenceOrConstrainDOMStringParameters& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList);
+
+ StringRange(StringPtrType aMemberPtr, const char* aName,
+ const nsString& aOther, nsTArray<MemberPtrType>* aList)
+ : BaseRange((MemberPtrType)aMemberPtr, aName, aList) {
+ mIdeal.insert(aOther);
+ }
+
+ ~StringRange() {}
+
+ void SetFrom(const dom::ConstrainDOMStringParameters& aOther);
+ ValueType Clamp(const ValueType& n) const;
+ ValueType Get(const ValueType& defaultValue) const {
+ return Clamp(mIdeal.size() ? mIdeal : defaultValue);
+ }
+ bool Intersects(const StringRange& aOther) const;
+ void Intersect(const StringRange& aOther);
+ bool Merge(const StringRange& aOther);
+ void FinalizeMerge() override {}
+ private:
+ bool Merge(const BaseRange& aOther) override {
+ return Merge(static_cast<const StringRange&>(aOther));
+ }
+ };
+
+ // All new constraints should be added here whether they use flattening or not
+ LongRange mWidth, mHeight;
+ DoubleRange mFrameRate;
+ StringRange mFacingMode;
+ StringRange mMediaSource;
+ LongLongRange mBrowserWindow;
+ BooleanRange mScrollWithPage;
+ StringRange mDeviceId;
+ LongRange mViewportOffsetX, mViewportOffsetY, mViewportWidth, mViewportHeight;
+ BooleanRange mEchoCancellation, mMozNoiseSuppression, mMozAutoGainControl;
+private:
+ typedef NormalizedConstraintSet T;
+public:
+ NormalizedConstraintSet(const dom::MediaTrackConstraintSet& aOther,
+ bool advanced,
+ nsTArray<MemberPtrType>* aList = nullptr)
+ : mWidth(&T::mWidth, "width", aOther.mWidth, advanced, aList)
+ , mHeight(&T::mHeight, "height", aOther.mHeight, advanced, aList)
+ , mFrameRate(&T::mFrameRate, "frameRate", aOther.mFrameRate, advanced, aList)
+ , mFacingMode(&T::mFacingMode, "facingMode", aOther.mFacingMode, advanced, aList)
+ , mMediaSource(&T::mMediaSource, "mediaSource", aOther.mMediaSource, aList)
+ , mBrowserWindow(&T::mBrowserWindow, "browserWindow",
+ aOther.mBrowserWindow.WasPassed() ?
+ aOther.mBrowserWindow.Value() : 0, aList)
+ , mScrollWithPage(&T::mScrollWithPage, "scrollWithPage",
+ aOther.mScrollWithPage.WasPassed() ?
+ aOther.mScrollWithPage.Value() : false, aList)
+ , mDeviceId(&T::mDeviceId, "deviceId", aOther.mDeviceId, advanced, aList)
+ , mViewportOffsetX(&T::mViewportOffsetX, "viewportOffsetX",
+ aOther.mViewportOffsetX, advanced, aList)
+ , mViewportOffsetY(&T::mViewportOffsetY, "viewportOffsetY",
+ aOther.mViewportOffsetY, advanced, aList)
+ , mViewportWidth(&T::mViewportWidth, "viewportWidth",
+ aOther.mViewportWidth, advanced, aList)
+ , mViewportHeight(&T::mViewportHeight, "viewportHeight",
+ aOther.mViewportHeight, advanced, aList)
+ , mEchoCancellation(&T::mEchoCancellation, "echoCancellation",
+ aOther.mEchoCancellation, advanced, aList)
+ , mMozNoiseSuppression(&T::mMozNoiseSuppression, "mozNoiseSuppression",
+ aOther.mMozNoiseSuppression,
+ advanced, aList)
+ , mMozAutoGainControl(&T::mMozAutoGainControl, "mozAutoGainControl",
+ aOther.mMozAutoGainControl, advanced, aList) {}
+};
+
+template<> bool NormalizedConstraintSet::Range<bool>::Merge(const Range& aOther);
+template<> void NormalizedConstraintSet::Range<bool>::FinalizeMerge();
+
+// Used instead of MediaTrackConstraints in lower-level code.
+struct NormalizedConstraints : public NormalizedConstraintSet
+{
+ explicit NormalizedConstraints(const dom::MediaTrackConstraints& aOther,
+ nsTArray<MemberPtrType>* aList = nullptr);
+
+ // Merge constructor
+ explicit NormalizedConstraints(
+ const nsTArray<const NormalizedConstraints*>& aOthers);
+
+ std::vector<NormalizedConstraintSet> mAdvanced;
+ const char* mBadConstraint;
+};
+
+// Flattened version is used in low-level code with orthogonal constraints only.
+struct FlattenedConstraints : public NormalizedConstraintSet
+{
+ explicit FlattenedConstraints(const NormalizedConstraints& aOther);
+
+ explicit FlattenedConstraints(const dom::MediaTrackConstraints& aOther)
+ : FlattenedConstraints(NormalizedConstraints(aOther)) {}
+};
+
+// A helper class for MediaEngines
+
+class MediaConstraintsHelper
+{
+protected:
+ template<class ValueType, class NormalizedRange>
+ static uint32_t FitnessDistance(ValueType aN, const NormalizedRange& aRange);
+ static uint32_t FitnessDistance(nsString aN,
+ const NormalizedConstraintSet::StringRange& aConstraint);
+
+ static uint32_t
+ GetMinimumFitnessDistance(const NormalizedConstraintSet &aConstraints,
+ const nsString& aDeviceId);
+
+ template<class DeviceType>
+ static bool
+ SomeSettingsFit(const NormalizedConstraints &aConstraints,
+ nsTArray<RefPtr<DeviceType>>& aDevices)
+ {
+ nsTArray<const NormalizedConstraintSet*> sets;
+ sets.AppendElement(&aConstraints);
+
+ MOZ_ASSERT(aDevices.Length());
+ for (auto& device : aDevices) {
+ if (device->GetBestFitnessDistance(sets, false) != UINT32_MAX) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+public:
+ // Apply constrains to a supplied list of devices (removes items from the list)
+
+ template<class DeviceType>
+ static const char*
+ SelectSettings(const NormalizedConstraints &aConstraints,
+ nsTArray<RefPtr<DeviceType>>& aDevices,
+ bool aIsChrome)
+ {
+ auto& c = aConstraints;
+
+ // First apply top-level constraints.
+
+ // Stack constraintSets that pass, starting with the required one, because the
+ // whole stack must be re-satisfied each time a capability-set is ruled out
+ // (this avoids storing state or pushing algorithm into the lower-level code).
+ nsTArray<RefPtr<DeviceType>> unsatisfactory;
+ nsTArray<const NormalizedConstraintSet*> aggregateConstraints;
+ aggregateConstraints.AppendElement(&c);
+
+ std::multimap<uint32_t, RefPtr<DeviceType>> ordered;
+
+ for (uint32_t i = 0; i < aDevices.Length();) {
+ uint32_t distance = aDevices[i]->GetBestFitnessDistance(aggregateConstraints,
+ aIsChrome);
+ if (distance == UINT32_MAX) {
+ unsatisfactory.AppendElement(aDevices[i]);
+ aDevices.RemoveElementAt(i);
+ } else {
+ ordered.insert(std::pair<uint32_t, RefPtr<DeviceType>>(distance,
+ aDevices[i]));
+ ++i;
+ }
+ }
+ if (!aDevices.Length()) {
+ return FindBadConstraint(c, unsatisfactory);
+ }
+
+ // Order devices by shortest distance
+ for (auto& ordinal : ordered) {
+ aDevices.RemoveElement(ordinal.second);
+ aDevices.AppendElement(ordinal.second);
+ }
+
+ // Then apply advanced constraints.
+
+ for (int i = 0; i < int(c.mAdvanced.size()); i++) {
+ aggregateConstraints.AppendElement(&c.mAdvanced[i]);
+ nsTArray<RefPtr<DeviceType>> rejects;
+ for (uint32_t j = 0; j < aDevices.Length();) {
+ if (aDevices[j]->GetBestFitnessDistance(aggregateConstraints,
+ aIsChrome) == UINT32_MAX) {
+ rejects.AppendElement(aDevices[j]);
+ aDevices.RemoveElementAt(j);
+ } else {
+ ++j;
+ }
+ }
+ if (!aDevices.Length()) {
+ aDevices.AppendElements(Move(rejects));
+ aggregateConstraints.RemoveElementAt(aggregateConstraints.Length() - 1);
+ }
+ }
+ return nullptr;
+ }
+
+ template<class DeviceType>
+ static const char*
+ FindBadConstraint(const NormalizedConstraints& aConstraints,
+ nsTArray<RefPtr<DeviceType>>& aDevices)
+ {
+ // The spec says to report a constraint that satisfies NONE
+ // of the sources. Unfortunately, this is a bit laborious to find out, and
+ // requires updating as new constraints are added!
+ auto& c = aConstraints;
+ dom::MediaTrackConstraints empty;
+
+ if (!aDevices.Length() ||
+ !SomeSettingsFit(NormalizedConstraints(empty), aDevices)) {
+ return "";
+ }
+ {
+ NormalizedConstraints fresh(empty);
+ fresh.mDeviceId = c.mDeviceId;
+ if (!SomeSettingsFit(fresh, aDevices)) {
+ return "deviceId";
+ }
+ }
+ {
+ NormalizedConstraints fresh(empty);
+ fresh.mWidth = c.mWidth;
+ if (!SomeSettingsFit(fresh, aDevices)) {
+ return "width";
+ }
+ }
+ {
+ NormalizedConstraints fresh(empty);
+ fresh.mHeight = c.mHeight;
+ if (!SomeSettingsFit(fresh, aDevices)) {
+ return "height";
+ }
+ }
+ {
+ NormalizedConstraints fresh(empty);
+ fresh.mFrameRate = c.mFrameRate;
+ if (!SomeSettingsFit(fresh, aDevices)) {
+ return "frameRate";
+ }
+ }
+ {
+ NormalizedConstraints fresh(empty);
+ fresh.mFacingMode = c.mFacingMode;
+ if (!SomeSettingsFit(fresh, aDevices)) {
+ return "facingMode";
+ }
+ }
+ return "";
+ }
+
+ template<class MediaEngineSourceType>
+ static const char*
+ FindBadConstraint(const NormalizedConstraints& aConstraints,
+ const MediaEngineSourceType& aMediaEngineSource,
+ const nsString& aDeviceId);
+};
+
+} // namespace mozilla
+
+#endif /* MEDIATRACKCONSTRAINTS_H_ */
diff --git a/dom/media/webrtc/PWebrtcGlobal.ipdl b/dom/media/webrtc/PWebrtcGlobal.ipdl
new file mode 100644
index 000000000..451634754
--- /dev/null
+++ b/dom/media/webrtc/PWebrtcGlobal.ipdl
@@ -0,0 +1,33 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PContent;
+
+include "mozilla/media/webrtc/WebrtcGlobal.h";
+
+using struct mozilla::dom::RTCStatsReportInternal from "mozilla/dom/RTCStatsReportBinding.h";
+using WebrtcGlobalLog from "mozilla/media/webrtc/WebrtcGlobal.h";
+
+namespace mozilla {
+namespace dom {
+
+async protocol PWebrtcGlobal {
+ manager PContent;
+
+child: // parent -> child messages
+ async GetStatsRequest(int aRequestId, nsString aPcIdFilter);
+ async ClearStatsRequest();
+ async GetLogRequest(int aRequestId, nsCString aPattern);
+ async ClearLogRequest();
+ async SetAecLogging(bool aEnable);
+ async SetDebugMode(int aLevel);
+
+parent: // child -> parent messages
+ async GetStatsResult(int aRequestId, RTCStatsReportInternal[] aStats);
+ async GetLogResult(int aRequestId, WebrtcGlobalLog aLog);
+ async __delete__();
+};
+
+} // end namespace net
+} // end namespace mozilla
diff --git a/dom/media/webrtc/PeerIdentity.cpp b/dom/media/webrtc/PeerIdentity.cpp
new file mode 100644
index 000000000..4b4abea3b
--- /dev/null
+++ b/dom/media/webrtc/PeerIdentity.cpp
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: sw=2 ts=2 sts=2 expandtab
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "PeerIdentity.h"
+
+#include "mozilla/DebugOnly.h"
+#include "nsCOMPtr.h"
+#include "nsIIDNService.h"
+#include "nsNetCID.h"
+#include "nsServiceManagerUtils.h"
+
+namespace mozilla {
+
+bool
+PeerIdentity::Equals(const PeerIdentity& aOther) const
+{
+ return Equals(aOther.mPeerIdentity);
+}
+
+bool
+PeerIdentity::Equals(const nsAString& aOtherString) const
+{
+ nsString user;
+ GetUser(mPeerIdentity, user);
+ nsString otherUser;
+ GetUser(aOtherString, otherUser);
+ if (user != otherUser) {
+ return false;
+ }
+
+ nsString host;
+ GetHost(mPeerIdentity, host);
+ nsString otherHost;
+ GetHost(aOtherString, otherHost);
+
+ nsresult rv;
+ nsCOMPtr<nsIIDNService> idnService
+ = do_GetService("@mozilla.org/network/idn-service;1", &rv);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return host == otherHost;
+ }
+
+ nsCString normHost;
+ GetNormalizedHost(idnService, host, normHost);
+ nsCString normOtherHost;
+ GetNormalizedHost(idnService, otherHost, normOtherHost);
+ return normHost == normOtherHost;
+}
+
+/* static */ void
+PeerIdentity::GetUser(const nsAString& aPeerIdentity, nsAString& aUser)
+{
+ int32_t at = aPeerIdentity.FindChar('@');
+ if (at >= 0) {
+ aUser = Substring(aPeerIdentity, 0, at);
+ } else {
+ aUser.Truncate();
+ }
+}
+
+/* static */ void
+PeerIdentity::GetHost(const nsAString& aPeerIdentity, nsAString& aHost)
+{
+ int32_t at = aPeerIdentity.FindChar('@');
+ if (at >= 0) {
+ aHost = Substring(aPeerIdentity, at + 1);
+ } else {
+ aHost = aPeerIdentity;
+ }
+}
+
+/* static */ void
+PeerIdentity::GetNormalizedHost(const nsCOMPtr<nsIIDNService>& aIdnService,
+ const nsAString& aHost,
+ nsACString& aNormalizedHost)
+{
+ const nsCString chost = NS_ConvertUTF16toUTF8(aHost);
+ DebugOnly<nsresult> rv = aIdnService->ConvertUTF8toACE(chost, aNormalizedHost);
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
+ "Failed to convert UTF-8 host to ASCII");
+}
+
+} /* namespace mozilla */
diff --git a/dom/media/webrtc/PeerIdentity.h b/dom/media/webrtc/PeerIdentity.h
new file mode 100644
index 000000000..bdfa1d2b3
--- /dev/null
+++ b/dom/media/webrtc/PeerIdentity.h
@@ -0,0 +1,81 @@
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: sw=2 ts=2 sts=2 expandtab
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef PeerIdentity_h
+#define PeerIdentity_h
+
+#ifdef MOZILLA_INTERNAL_API
+#include "nsString.h"
+#else
+#include "nsStringAPI.h"
+#endif
+
+template <class T> class nsCOMPtr;
+class nsIIDNService;
+
+namespace mozilla {
+
+/**
+ * This class implements the identifier used in WebRTC identity. Peers are
+ * identified using a string in the form [<user>@]<domain>, for instance,
+ * "user@example.com'. The (optional) user portion is a site-controlled string
+ * containing any character other than '@'. The domain portion is a valid IDN
+ * domain name and is compared accordingly.
+ *
+ * See: http://tools.ietf.org/html/draft-ietf-rtcweb-security-arch-09#section-5.6.5.3.3.1
+ */
+class PeerIdentity final : public RefCounted<PeerIdentity>
+{
+public:
+ MOZ_DECLARE_REFCOUNTED_TYPENAME(PeerIdentity)
+
+ explicit PeerIdentity(const nsAString& aPeerIdentity)
+ : mPeerIdentity(aPeerIdentity) {}
+ ~PeerIdentity() {}
+
+ bool Equals(const PeerIdentity& aOther) const;
+ bool Equals(const nsAString& aOtherString) const;
+ const nsString& ToString() const { return mPeerIdentity; }
+
+private:
+ static void GetUser(const nsAString& aPeerIdentity, nsAString& aUser);
+ static void GetHost(const nsAString& aPeerIdentity, nsAString& aHost);
+
+ static void GetNormalizedHost(const nsCOMPtr<nsIIDNService>& aIdnService,
+ const nsAString& aHost,
+ nsACString& aNormalizedHost);
+
+ nsString mPeerIdentity;
+};
+
+inline bool
+operator==(const PeerIdentity& aOne, const PeerIdentity& aTwo)
+{
+ return aOne.Equals(aTwo);
+}
+
+inline bool
+operator==(const PeerIdentity& aOne, const nsAString& aString)
+{
+ return aOne.Equals(aString);
+}
+
+inline bool
+operator!=(const PeerIdentity& aOne, const PeerIdentity& aTwo)
+{
+ return !aOne.Equals(aTwo);
+}
+
+inline bool
+operator!=(const PeerIdentity& aOne, const nsAString& aString)
+{
+ return !aOne.Equals(aString);
+}
+
+
+} /* namespace mozilla */
+
+#endif /* PeerIdentity_h */
diff --git a/dom/media/webrtc/RTCCertificate.cpp b/dom/media/webrtc/RTCCertificate.cpp
new file mode 100644
index 000000000..3f778bcbb
--- /dev/null
+++ b/dom/media/webrtc/RTCCertificate.cpp
@@ -0,0 +1,462 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/RTCCertificate.h"
+
+#include <cmath>
+#include "cert.h"
+#include "jsapi.h"
+#include "mozilla/dom/CryptoKey.h"
+#include "mozilla/dom/RTCCertificateBinding.h"
+#include "mozilla/dom/WebCryptoCommon.h"
+#include "mozilla/dom/WebCryptoTask.h"
+#include "mozilla/Sprintf.h"
+
+#include <cstdio>
+
+namespace mozilla {
+namespace dom {
+
+#define RTCCERTIFICATE_SC_VERSION 0x00000001
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(RTCCertificate, mGlobal)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCCertificate)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCCertificate)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCCertificate)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+// Note: explicit casts necessary to avoid
+// warning C4307: '*' : integral constant overflow
+#define ONE_DAY PRTime(PR_USEC_PER_SEC) * PRTime(60) /*sec*/ \
+ * PRTime(60) /*min*/ * PRTime(24) /*hours*/
+#define EXPIRATION_DEFAULT ONE_DAY * PRTime(30)
+#define EXPIRATION_SLACK ONE_DAY
+#define EXPIRATION_MAX ONE_DAY * PRTime(365) /*year*/
+
+const size_t RTCCertificateCommonNameLength = 16;
+const size_t RTCCertificateMinRsaSize = 1024;
+
+class GenerateRTCCertificateTask : public GenerateAsymmetricKeyTask
+{
+public:
+ GenerateRTCCertificateTask(nsIGlobalObject* aGlobal, JSContext* aCx,
+ const ObjectOrString& aAlgorithm,
+ const Sequence<nsString>& aKeyUsages,
+ PRTime aExpires)
+ : GenerateAsymmetricKeyTask(aGlobal, aCx, aAlgorithm, true, aKeyUsages),
+ mExpires(aExpires),
+ mAuthType(ssl_kea_null),
+ mCertificate(nullptr),
+ mSignatureAlg(SEC_OID_UNKNOWN)
+ {
+ }
+
+private:
+ PRTime mExpires;
+ SSLKEAType mAuthType;
+ UniqueCERTCertificate mCertificate;
+ SECOidTag mSignatureAlg;
+
+ static CERTName* GenerateRandomName(PK11SlotInfo* aSlot)
+ {
+ uint8_t randomName[RTCCertificateCommonNameLength];
+ SECStatus rv = PK11_GenerateRandomOnSlot(aSlot, randomName,
+ sizeof(randomName));
+ if (rv != SECSuccess) {
+ return nullptr;
+ }
+
+ char buf[sizeof(randomName) * 2 + 4];
+ PL_strncpy(buf, "CN=", 3);
+ for (size_t i = 0; i < sizeof(randomName); ++i) {
+ snprintf(&buf[i * 2 + 3], 2, "%.2x", randomName[i]);
+ }
+ buf[sizeof(buf) - 1] = '\0';
+
+ return CERT_AsciiToName(buf);
+ }
+
+ nsresult GenerateCertificate()
+ {
+ ScopedPK11SlotInfo slot(PK11_GetInternalSlot());
+ MOZ_ASSERT(slot.get());
+
+ ScopedCERTName subjectName(GenerateRandomName(slot.get()));
+ if (!subjectName) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ ScopedSECKEYPublicKey publicKey(mKeyPair->mPublicKey.get()->GetPublicKey());
+ ScopedCERTSubjectPublicKeyInfo spki(
+ SECKEY_CreateSubjectPublicKeyInfo(publicKey));
+ if (!spki) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ ScopedCERTCertificateRequest certreq(
+ CERT_CreateCertificateRequest(subjectName, spki, nullptr));
+ if (!certreq) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ PRTime now = PR_Now();
+ PRTime notBefore = now - EXPIRATION_SLACK;
+ mExpires += now;
+
+ ScopedCERTValidity validity(CERT_CreateValidity(notBefore, mExpires));
+ if (!validity) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ unsigned long serial;
+ // Note: This serial in principle could collide, but it's unlikely, and we
+ // don't expect anyone to be validating certificates anyway.
+ SECStatus rv =
+ PK11_GenerateRandomOnSlot(slot,
+ reinterpret_cast<unsigned char *>(&serial),
+ sizeof(serial));
+ if (rv != SECSuccess) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ CERTCertificate* cert = CERT_CreateCertificate(serial, subjectName,
+ validity, certreq);
+ if (!cert) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+ mCertificate.reset(cert);
+ return NS_OK;
+ }
+
+ nsresult SignCertificate()
+ {
+ MOZ_ASSERT(mSignatureAlg != SEC_OID_UNKNOWN);
+ PLArenaPool *arena = mCertificate->arena;
+
+ SECStatus rv = SECOID_SetAlgorithmID(arena, &mCertificate->signature,
+ mSignatureAlg, nullptr);
+ if (rv != SECSuccess) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ // Set version to X509v3.
+ *(mCertificate->version.data) = SEC_CERTIFICATE_VERSION_3;
+ mCertificate->version.len = 1;
+
+ SECItem innerDER = { siBuffer, nullptr, 0 };
+ if (!SEC_ASN1EncodeItem(arena, &innerDER, mCertificate.get(),
+ SEC_ASN1_GET(CERT_CertificateTemplate))) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ SECItem *signedCert = PORT_ArenaZNew(arena, SECItem);
+ if (!signedCert) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+
+ ScopedSECKEYPrivateKey privateKey(mKeyPair->mPrivateKey.get()->GetPrivateKey());
+ rv = SEC_DerSignData(arena, signedCert, innerDER.data, innerDER.len,
+ privateKey, mSignatureAlg);
+ if (rv != SECSuccess) {
+ return NS_ERROR_DOM_UNKNOWN_ERR;
+ }
+ mCertificate->derCert = *signedCert;
+ return NS_OK;
+ }
+
+ nsresult BeforeCrypto() override
+ {
+ if (mAlgName.EqualsLiteral(WEBCRYPTO_ALG_RSASSA_PKCS1)) {
+ // Double check that size is OK.
+ auto sz = static_cast<size_t>(mRsaParams.keySizeInBits);
+ if (sz < RTCCertificateMinRsaSize) {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+
+ KeyAlgorithmProxy& alg = mKeyPair->mPublicKey.get()->Algorithm();
+ if (alg.mType != KeyAlgorithmProxy::RSA ||
+ !alg.mRsa.mHash.mName.EqualsLiteral(WEBCRYPTO_ALG_SHA256)) {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+
+ mSignatureAlg = SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION;
+ mAuthType = ssl_kea_rsa;
+
+ } else if (mAlgName.EqualsLiteral(WEBCRYPTO_ALG_ECDSA)) {
+ // We only support good curves in WebCrypto.
+ // If that ever changes, check that a good one was chosen.
+
+ mSignatureAlg = SEC_OID_ANSIX962_ECDSA_SHA256_SIGNATURE;
+ mAuthType = ssl_kea_ecdh;
+ } else {
+ return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
+ }
+ return NS_OK;
+ }
+
+ nsresult DoCrypto() override
+ {
+ nsresult rv = GenerateAsymmetricKeyTask::DoCrypto();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = GenerateCertificate();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = SignCertificate();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return NS_OK;
+ }
+
+ virtual void Resolve() override
+ {
+ // Make copies of the private key and certificate, otherwise, when this
+ // object is deleted, the structures they reference will be deleted too.
+ SECKEYPrivateKey* key = mKeyPair->mPrivateKey.get()->GetPrivateKey();
+ CERTCertificate* cert = CERT_DupCertificate(mCertificate.get());
+ RefPtr<RTCCertificate> result =
+ new RTCCertificate(mResultPromise->GetParentObject(),
+ key, cert, mAuthType, mExpires);
+ mResultPromise->MaybeResolve(result);
+ }
+};
+
+static PRTime
+ReadExpires(JSContext* aCx, const ObjectOrString& aOptions,
+ ErrorResult& aRv)
+{
+ // This conversion might fail, but we don't really care; use the default.
+ // If this isn't an object, or it doesn't coerce into the right type,
+ // then we won't get the |expires| value. Either will be caught later.
+ RTCCertificateExpiration expiration;
+ if (!aOptions.IsObject()) {
+ return EXPIRATION_DEFAULT;
+ }
+ JS::RootedValue value(aCx, JS::ObjectValue(*aOptions.GetAsObject()));
+ if (!expiration.Init(aCx, value)) {
+ aRv.NoteJSContextException(aCx);
+ return 0;
+ }
+
+ if (!expiration.mExpires.WasPassed()) {
+ return EXPIRATION_DEFAULT;
+ }
+ static const uint64_t max =
+ static_cast<uint64_t>(EXPIRATION_MAX / PR_USEC_PER_MSEC);
+ if (expiration.mExpires.Value() > max) {
+ return EXPIRATION_MAX;
+ }
+ return static_cast<PRTime>(expiration.mExpires.Value() * PR_USEC_PER_MSEC);
+}
+
+already_AddRefed<Promise>
+RTCCertificate::GenerateCertificate(
+ const GlobalObject& aGlobal, const ObjectOrString& aOptions,
+ ErrorResult& aRv, JSCompartment* aCompartment)
+{
+ nsIGlobalObject* global = xpc::NativeGlobal(aGlobal.Get());
+ RefPtr<Promise> p = Promise::Create(global, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ Sequence<nsString> usages;
+ if (!usages.AppendElement(NS_LITERAL_STRING("sign"), fallible)) {
+ aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+ return nullptr;
+ }
+
+ PRTime expires = ReadExpires(aGlobal.Context(), aOptions, aRv);
+ if (aRv.Failed()) {
+ return nullptr;
+ }
+ RefPtr<WebCryptoTask> task =
+ new GenerateRTCCertificateTask(global, aGlobal.Context(),
+ aOptions, usages, expires);
+ task->DispatchWithPromise(p);
+ return p.forget();
+}
+
+RTCCertificate::RTCCertificate(nsIGlobalObject* aGlobal)
+ : mGlobal(aGlobal),
+ mPrivateKey(nullptr),
+ mCertificate(nullptr),
+ mAuthType(ssl_kea_null),
+ mExpires(0)
+{
+}
+
+RTCCertificate::RTCCertificate(nsIGlobalObject* aGlobal,
+ SECKEYPrivateKey* aPrivateKey,
+ CERTCertificate* aCertificate,
+ SSLKEAType aAuthType,
+ PRTime aExpires)
+ : mGlobal(aGlobal),
+ mPrivateKey(aPrivateKey),
+ mCertificate(aCertificate),
+ mAuthType(aAuthType),
+ mExpires(aExpires)
+{
+}
+
+RTCCertificate::~RTCCertificate()
+{
+ nsNSSShutDownPreventionLock locker;
+ if (isAlreadyShutDown()) {
+ return;
+ }
+ destructorSafeDestroyNSSReference();
+ shutdown(ShutdownCalledFrom::Object);
+}
+
+// This creates some interesting lifecycle consequences, since the DtlsIdentity
+// holds NSS objects, but does not implement nsNSSShutDownObject.
+
+// Unfortunately, the code that uses DtlsIdentity cannot always use that lock
+// due to external linkage requirements. Therefore, the lock is held on this
+// object instead. Consequently, the DtlsIdentity that this method returns must
+// have a lifetime that is strictly shorter than the RTCCertificate.
+//
+// RTCPeerConnection provides this guarantee by holding a strong reference to
+// the RTCCertificate. It will cleanup any DtlsIdentity instances that it
+// creates before the RTCCertificate reference is released.
+RefPtr<DtlsIdentity>
+RTCCertificate::CreateDtlsIdentity() const
+{
+ nsNSSShutDownPreventionLock locker;
+ if (isAlreadyShutDown() || !mPrivateKey || !mCertificate) {
+ return nullptr;
+ }
+ SECKEYPrivateKey* key = SECKEY_CopyPrivateKey(mPrivateKey.get());
+ CERTCertificate* cert = CERT_DupCertificate(mCertificate.get());
+ RefPtr<DtlsIdentity> id = new DtlsIdentity(key, cert, mAuthType);
+ return id;
+}
+
+JSObject*
+RTCCertificate::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return RTCCertificateBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+RTCCertificate::virtualDestroyNSSReference()
+{
+ destructorSafeDestroyNSSReference();
+}
+
+void
+RTCCertificate::destructorSafeDestroyNSSReference()
+{
+ mPrivateKey.reset();
+ mCertificate.reset();
+}
+
+bool
+RTCCertificate::WritePrivateKey(JSStructuredCloneWriter* aWriter,
+ const nsNSSShutDownPreventionLock& aLockProof) const
+{
+ JsonWebKey jwk;
+ nsresult rv = CryptoKey::PrivateKeyToJwk(mPrivateKey.get(), jwk, aLockProof);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+ nsString json;
+ if (!jwk.ToJSON(json)) {
+ return false;
+ }
+ return WriteString(aWriter, json);
+}
+
+bool
+RTCCertificate::WriteCertificate(JSStructuredCloneWriter* aWriter,
+ const nsNSSShutDownPreventionLock& /*proof*/) const
+{
+ ScopedCERTCertificateList certs(CERT_CertListFromCert(mCertificate.get()));
+ if (!certs || certs->len <= 0) {
+ return false;
+ }
+ if (!JS_WriteUint32Pair(aWriter, certs->certs[0].len, 0)) {
+ return false;
+ }
+ return JS_WriteBytes(aWriter, certs->certs[0].data, certs->certs[0].len);
+}
+
+bool
+RTCCertificate::WriteStructuredClone(JSStructuredCloneWriter* aWriter) const
+{
+ nsNSSShutDownPreventionLock locker;
+ if (isAlreadyShutDown() || !mPrivateKey || !mCertificate) {
+ return false;
+ }
+
+ return JS_WriteUint32Pair(aWriter, RTCCERTIFICATE_SC_VERSION, mAuthType) &&
+ JS_WriteUint32Pair(aWriter, (mExpires >> 32) & 0xffffffff,
+ mExpires & 0xffffffff) &&
+ WritePrivateKey(aWriter, locker) &&
+ WriteCertificate(aWriter, locker);
+}
+
+bool
+RTCCertificate::ReadPrivateKey(JSStructuredCloneReader* aReader,
+ const nsNSSShutDownPreventionLock& aLockProof)
+{
+ nsString json;
+ if (!ReadString(aReader, json)) {
+ return false;
+ }
+ JsonWebKey jwk;
+ if (!jwk.Init(json)) {
+ return false;
+ }
+ mPrivateKey.reset(CryptoKey::PrivateKeyFromJwk(jwk, aLockProof));
+ return !!mPrivateKey;
+}
+
+bool
+RTCCertificate::ReadCertificate(JSStructuredCloneReader* aReader,
+ const nsNSSShutDownPreventionLock& /*proof*/)
+{
+ CryptoBuffer cert;
+ if (!ReadBuffer(aReader, cert) || cert.Length() == 0) {
+ return false;
+ }
+
+ SECItem der = { siBuffer, cert.Elements(),
+ static_cast<unsigned int>(cert.Length()) };
+ mCertificate.reset(CERT_NewTempCertificate(CERT_GetDefaultCertDB(),
+ &der, nullptr, true, true));
+ return !!mCertificate;
+}
+
+bool
+RTCCertificate::ReadStructuredClone(JSStructuredCloneReader* aReader)
+{
+ nsNSSShutDownPreventionLock locker;
+ if (isAlreadyShutDown()) {
+ return false;
+ }
+
+ uint32_t version, authType;
+ if (!JS_ReadUint32Pair(aReader, &version, &authType) ||
+ version != RTCCERTIFICATE_SC_VERSION) {
+ return false;
+ }
+ mAuthType = static_cast<SSLKEAType>(authType);
+
+ uint32_t high, low;
+ if (!JS_ReadUint32Pair(aReader, &high, &low)) {
+ return false;
+ }
+ mExpires = static_cast<PRTime>(high) << 32 | low;
+
+ return ReadPrivateKey(aReader, locker) &&
+ ReadCertificate(aReader, locker);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webrtc/RTCCertificate.h b/dom/media/webrtc/RTCCertificate.h
new file mode 100644
index 000000000..63869849c
--- /dev/null
+++ b/dom/media/webrtc/RTCCertificate.h
@@ -0,0 +1,98 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_RTCCertificate_h
+#define mozilla_dom_RTCCertificate_h
+
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "nsIGlobalObject.h"
+#include "nsNSSShutDown.h"
+#include "prtime.h"
+#include "sslt.h"
+#include "ScopedNSSTypes.h"
+
+#include "mozilla/ErrorResult.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/RefPtr.h"
+#include "mozilla/dom/CryptoKey.h"
+#include "mozilla/dom/RTCCertificateBinding.h"
+#include "mtransport/dtlsidentity.h"
+#include "js/StructuredClone.h"
+#include "js/TypeDecls.h"
+
+namespace mozilla {
+namespace dom {
+
+class ObjectOrString;
+
+class RTCCertificate final
+ : public nsISupports,
+ public nsWrapperCache,
+ public nsNSSShutDownObject
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(RTCCertificate)
+
+ // WebIDL method that implements RTCPeerConnection.generateCertificate.
+ static already_AddRefed<Promise> GenerateCertificate(
+ const GlobalObject& aGlobal, const ObjectOrString& aOptions,
+ ErrorResult& aRv, JSCompartment* aCompartment = nullptr);
+
+ explicit RTCCertificate(nsIGlobalObject* aGlobal);
+ RTCCertificate(nsIGlobalObject* aGlobal, SECKEYPrivateKey* aPrivateKey,
+ CERTCertificate* aCertificate, SSLKEAType aAuthType,
+ PRTime aExpires);
+
+ nsIGlobalObject* GetParentObject() const { return mGlobal; }
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ // WebIDL expires attribute. Note: JS dates are milliseconds since epoch;
+ // NSPR PRTime is in microseconds since the same epoch.
+ uint64_t Expires() const
+ {
+ return mExpires / PR_USEC_PER_MSEC;
+ }
+
+ // Accessors for use by PeerConnectionImpl.
+ RefPtr<DtlsIdentity> CreateDtlsIdentity() const;
+ const UniqueCERTCertificate& Certificate() const { return mCertificate; }
+
+ // For nsNSSShutDownObject
+ virtual void virtualDestroyNSSReference() override;
+ void destructorSafeDestroyNSSReference();
+
+ // Structured clone methods
+ bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
+ bool ReadStructuredClone(JSStructuredCloneReader* aReader);
+
+private:
+ ~RTCCertificate();
+ void operator=(const RTCCertificate&) = delete;
+ RTCCertificate(const RTCCertificate&) = delete;
+
+ bool ReadCertificate(JSStructuredCloneReader* aReader,
+ const nsNSSShutDownPreventionLock& /*lockproof*/);
+ bool ReadPrivateKey(JSStructuredCloneReader* aReader,
+ const nsNSSShutDownPreventionLock& aLockProof);
+ bool WriteCertificate(JSStructuredCloneWriter* aWriter,
+ const nsNSSShutDownPreventionLock& /*lockproof*/) const;
+ bool WritePrivateKey(JSStructuredCloneWriter* aWriter,
+ const nsNSSShutDownPreventionLock& aLockProof) const;
+
+ RefPtr<nsIGlobalObject> mGlobal;
+ UniqueSECKEYPrivateKey mPrivateKey;
+ UniqueCERTCertificate mCertificate;
+ SSLKEAType mAuthType;
+ PRTime mExpires;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_RTCCertificate_h
diff --git a/dom/media/webrtc/RTCIdentityProviderRegistrar.cpp b/dom/media/webrtc/RTCIdentityProviderRegistrar.cpp
new file mode 100644
index 000000000..1d33923d2
--- /dev/null
+++ b/dom/media/webrtc/RTCIdentityProviderRegistrar.cpp
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "RTCIdentityProviderRegistrar.h"
+#include "mozilla/Attributes.h"
+#include "nsCycleCollectionParticipant.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCIdentityProviderRegistrar)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCIdentityProviderRegistrar)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCIdentityProviderRegistrar)
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(RTCIdentityProviderRegistrar,
+ mGlobal,
+ mGenerateAssertionCallback,
+ mValidateAssertionCallback)
+
+RTCIdentityProviderRegistrar::RTCIdentityProviderRegistrar(
+ nsIGlobalObject* aGlobal)
+ : mGlobal(aGlobal)
+ , mGenerateAssertionCallback(nullptr)
+ , mValidateAssertionCallback(nullptr)
+{
+ MOZ_COUNT_CTOR(RTCIdentityProviderRegistrar);
+}
+
+RTCIdentityProviderRegistrar::~RTCIdentityProviderRegistrar()
+{
+ MOZ_COUNT_DTOR(RTCIdentityProviderRegistrar);
+}
+
+nsIGlobalObject*
+RTCIdentityProviderRegistrar::GetParentObject() const
+{
+ return mGlobal;
+}
+
+JSObject*
+RTCIdentityProviderRegistrar::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return RTCIdentityProviderRegistrarBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+RTCIdentityProviderRegistrar::Register(const RTCIdentityProvider& aIdp)
+{
+ mGenerateAssertionCallback = aIdp.mGenerateAssertion;
+ mValidateAssertionCallback = aIdp.mValidateAssertion;
+}
+
+bool
+RTCIdentityProviderRegistrar::HasIdp() const
+{
+ return mGenerateAssertionCallback && mValidateAssertionCallback;
+}
+
+already_AddRefed<Promise>
+RTCIdentityProviderRegistrar::GenerateAssertion(
+ const nsAString& aContents, const nsAString& aOrigin,
+ const Optional<nsAString>& aUsernameHint, ErrorResult& aRv)
+{
+ if (!mGenerateAssertionCallback) {
+ aRv.Throw(NS_ERROR_NOT_INITIALIZED);
+ return nullptr;
+ }
+ return mGenerateAssertionCallback->Call(aContents, aOrigin, aUsernameHint, aRv);
+}
+already_AddRefed<Promise>
+RTCIdentityProviderRegistrar::ValidateAssertion(
+ const nsAString& aAssertion, const nsAString& aOrigin, ErrorResult& aRv)
+{
+ if (!mValidateAssertionCallback) {
+ aRv.Throw(NS_ERROR_NOT_INITIALIZED);
+ return nullptr;
+ }
+ return mValidateAssertionCallback->Call(aAssertion, aOrigin, aRv);
+}
+
+
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webrtc/RTCIdentityProviderRegistrar.h b/dom/media/webrtc/RTCIdentityProviderRegistrar.h
new file mode 100644
index 000000000..49537503b
--- /dev/null
+++ b/dom/media/webrtc/RTCIdentityProviderRegistrar.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef RTCIDENTITYPROVIDER_H_
+#define RTCIDENTITYPROVIDER_H_
+
+#include "mozilla/RefPtr.h"
+#include "nsCOMPtr.h"
+#include "nsISupportsImpl.h"
+#include "nsIGlobalObject.h"
+#include "nsWrapperCache.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/Promise.h"
+#include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/RTCIdentityProviderBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+struct RTCIdentityProvider;
+
+class RTCIdentityProviderRegistrar final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(RTCIdentityProviderRegistrar)
+
+ explicit RTCIdentityProviderRegistrar(nsIGlobalObject* aGlobal);
+
+ // As required
+ nsIGlobalObject* GetParentObject() const;
+ virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ // setter and checker
+ void Register(const RTCIdentityProvider& aIdp);
+ bool HasIdp() const;
+
+ already_AddRefed<Promise>
+ GenerateAssertion(const nsAString& aContents, const nsAString& aOrigin,
+ const Optional<nsAString>& aUsernameHint, ErrorResult& aRv);
+ already_AddRefed<Promise>
+ ValidateAssertion(const nsAString& assertion, const nsAString& origin,
+ ErrorResult& aRv);
+
+private:
+ ~RTCIdentityProviderRegistrar();
+
+ nsCOMPtr<nsIGlobalObject> mGlobal;
+ RefPtr<GenerateAssertionCallback> mGenerateAssertionCallback;
+ RefPtr<ValidateAssertionCallback> mValidateAssertionCallback;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* RTCIDENTITYPROVIDER_H_ */
diff --git a/dom/media/webrtc/WebrtcGlobal.h b/dom/media/webrtc/WebrtcGlobal.h
new file mode 100644
index 000000000..8ab10cb0d
--- /dev/null
+++ b/dom/media/webrtc/WebrtcGlobal.h
@@ -0,0 +1,497 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _WEBRTC_GLOBAL_H_
+#define _WEBRTC_GLOBAL_H_
+
+#include "ipc/IPCMessageUtils.h"
+#include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/RTCStatsReportBinding.h"
+#include "nsAutoPtr.h"
+
+typedef mozilla::dom::RTCStatsReportInternal StatsReport;
+typedef nsTArray< nsAutoPtr<StatsReport>> RTCReports;
+typedef mozilla::dom::Sequence<nsString> WebrtcGlobalLog;
+
+namespace IPC {
+
+template<typename T>
+struct ParamTraits<mozilla::dom::Optional<T>>
+{
+ typedef mozilla::dom::Optional<T> paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ if (aParam.WasPassed()) {
+ WriteParam(aMsg, true);
+ WriteParam(aMsg, aParam.Value());
+ return;
+ }
+
+ WriteParam(aMsg, false);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ bool was_passed = false;
+
+ if (!ReadParam(aMsg, aIter, &was_passed)) {
+ return false;
+ }
+
+ aResult->Reset(); //XXX Optional_base seems to reach this point with isSome true.
+
+ if (was_passed) {
+ if (!ReadParam(aMsg, aIter, &(aResult->Construct()))) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+};
+
+template<typename T>
+struct ParamTraits<mozilla::dom::Sequence<T>>
+{
+ typedef mozilla::dom::Sequence<T> paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, static_cast<const FallibleTArray<T>&>(aParam));
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ return ReadParam(aMsg, aIter, dynamic_cast<FallibleTArray<T>*>(aResult));
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCStatsType> :
+ public ContiguousEnumSerializer<
+ mozilla::dom::RTCStatsType,
+ mozilla::dom::RTCStatsType::Inboundrtp,
+ mozilla::dom::RTCStatsType::EndGuard_>
+{};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCStatsIceCandidatePairState> :
+ public ContiguousEnumSerializer<
+ mozilla::dom::RTCStatsIceCandidatePairState,
+ mozilla::dom::RTCStatsIceCandidatePairState::Frozen,
+ mozilla::dom::RTCStatsIceCandidatePairState::EndGuard_>
+{};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCStatsIceCandidateType> :
+ public ContiguousEnumSerializer<
+ mozilla::dom::RTCStatsIceCandidateType,
+ mozilla::dom::RTCStatsIceCandidateType::Host,
+ mozilla::dom::RTCStatsIceCandidateType::EndGuard_>
+{};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCStatsReportInternal>
+{
+ typedef mozilla::dom::RTCStatsReportInternal paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mClosed);
+ WriteParam(aMsg, aParam.mCodecStats);
+ WriteParam(aMsg, aParam.mIceCandidatePairStats);
+ WriteParam(aMsg, aParam.mIceCandidateStats);
+ WriteParam(aMsg, aParam.mIceComponentStats);
+ WriteParam(aMsg, aParam.mInboundRTPStreamStats);
+ WriteParam(aMsg, aParam.mLocalSdp);
+ WriteParam(aMsg, aParam.mMediaStreamStats);
+ WriteParam(aMsg, aParam.mMediaStreamTrackStats);
+ WriteParam(aMsg, aParam.mOutboundRTPStreamStats);
+ WriteParam(aMsg, aParam.mPcid);
+ WriteParam(aMsg, aParam.mRemoteSdp);
+ WriteParam(aMsg, aParam.mTimestamp);
+ WriteParam(aMsg, aParam.mTransportStats);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mClosed)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mCodecStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mIceCandidatePairStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mIceCandidateStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mIceComponentStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mInboundRTPStreamStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mLocalSdp)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMediaStreamStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMediaStreamTrackStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mOutboundRTPStreamStats)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPcid)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mRemoteSdp)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTimestamp)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTransportStats))) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+typedef mozilla::dom::RTCStats RTCStats;
+
+static void WriteRTCStats(Message* aMsg, const RTCStats& aParam)
+{
+ // RTCStats base class
+ WriteParam(aMsg, aParam.mId);
+ WriteParam(aMsg, aParam.mTimestamp);
+ WriteParam(aMsg, aParam.mType);
+}
+
+static bool ReadRTCStats(const Message* aMsg, PickleIterator* aIter, RTCStats* aResult)
+{
+ // RTCStats base class
+ if (!ReadParam(aMsg, aIter, &(aResult->mId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTimestamp)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mType))) {
+ return false;
+ }
+
+ return true;
+}
+
+template<>
+struct ParamTraits<mozilla::dom::RTCCodecStats>
+{
+ typedef mozilla::dom::RTCCodecStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mChannels);
+ WriteParam(aMsg, aParam.mClockRate);
+ WriteParam(aMsg, aParam.mCodec);
+ WriteParam(aMsg, aParam.mParameters);
+ WriteParam(aMsg, aParam.mPayloadType);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mChannels)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mClockRate)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mCodec)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mParameters)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPayloadType)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCIceCandidatePairStats>
+{
+ typedef mozilla::dom::RTCIceCandidatePairStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mComponentId);
+ WriteParam(aMsg, aParam.mLocalCandidateId);
+ WriteParam(aMsg, aParam.mPriority);
+ WriteParam(aMsg, aParam.mNominated);
+ WriteParam(aMsg, aParam.mReadable);
+ WriteParam(aMsg, aParam.mRemoteCandidateId);
+ WriteParam(aMsg, aParam.mSelected);
+ WriteParam(aMsg, aParam.mState);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mComponentId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mLocalCandidateId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPriority)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mNominated)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mReadable)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mRemoteCandidateId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mSelected)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mState)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCIceCandidateStats>
+{
+ typedef mozilla::dom::RTCIceCandidateStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mCandidateId);
+ WriteParam(aMsg, aParam.mCandidateType);
+ WriteParam(aMsg, aParam.mComponentId);
+ WriteParam(aMsg, aParam.mIpAddress);
+ WriteParam(aMsg, aParam.mMozLocalTransport);
+ WriteParam(aMsg, aParam.mPortNumber);
+ WriteParam(aMsg, aParam.mTransport);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mCandidateId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mCandidateType)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mComponentId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mIpAddress)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMozLocalTransport)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPortNumber)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTransport)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCIceComponentStats>
+{
+ typedef mozilla::dom::RTCIceComponentStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mActiveConnection);
+ WriteParam(aMsg, aParam.mBytesReceived);
+ WriteParam(aMsg, aParam.mBytesSent);
+ WriteParam(aMsg, aParam.mComponent);
+ WriteParam(aMsg, aParam.mTransportId);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mActiveConnection)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mBytesReceived)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mBytesSent)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mComponent)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTransportId)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+static void WriteRTCRTPStreamStats(
+ Message* aMsg,
+ const mozilla::dom::RTCRTPStreamStats& aParam)
+{
+ WriteParam(aMsg, aParam.mBitrateMean);
+ WriteParam(aMsg, aParam.mBitrateStdDev);
+ WriteParam(aMsg, aParam.mCodecId);
+ WriteParam(aMsg, aParam.mFramerateMean);
+ WriteParam(aMsg, aParam.mFramerateStdDev);
+ WriteParam(aMsg, aParam.mIsRemote);
+ WriteParam(aMsg, aParam.mMediaTrackId);
+ WriteParam(aMsg, aParam.mMediaType);
+ WriteParam(aMsg, aParam.mRemoteId);
+ WriteParam(aMsg, aParam.mSsrc);
+ WriteParam(aMsg, aParam.mTransportId);
+}
+
+static bool ReadRTCRTPStreamStats(
+ const Message* aMsg, PickleIterator* aIter,
+ mozilla::dom::RTCRTPStreamStats* aResult)
+{
+ if (!ReadParam(aMsg, aIter, &(aResult->mBitrateMean)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mBitrateStdDev)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mCodecId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramerateMean)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramerateStdDev)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mIsRemote)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMediaTrackId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMediaType)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mRemoteId)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mSsrc)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTransportId))) {
+ return false;
+ }
+
+ return true;
+}
+
+template<>
+struct ParamTraits<mozilla::dom::RTCInboundRTPStreamStats>
+{
+ typedef mozilla::dom::RTCInboundRTPStreamStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mBytesReceived);
+ WriteParam(aMsg, aParam.mDiscardedPackets);
+ WriteParam(aMsg, aParam.mJitter);
+ WriteParam(aMsg, aParam.mMozAvSyncDelay);
+ WriteParam(aMsg, aParam.mMozJitterBufferDelay);
+ WriteParam(aMsg, aParam.mMozRtt);
+ WriteParam(aMsg, aParam.mPacketsLost);
+ WriteParam(aMsg, aParam.mPacketsReceived);
+ WriteRTCRTPStreamStats(aMsg, aParam);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mBytesReceived)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mDiscardedPackets)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mJitter)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMozAvSyncDelay)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMozJitterBufferDelay)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mMozRtt)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPacketsLost)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPacketsReceived)) ||
+ !ReadRTCRTPStreamStats(aMsg, aIter, aResult) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCOutboundRTPStreamStats>
+{
+ typedef mozilla::dom::RTCOutboundRTPStreamStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mBytesSent);
+ WriteParam(aMsg, aParam.mDroppedFrames);
+ WriteParam(aMsg, aParam.mPacketsSent);
+ WriteParam(aMsg, aParam.mTargetBitrate);
+ WriteRTCRTPStreamStats(aMsg, aParam);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mBytesSent)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mDroppedFrames)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mPacketsSent)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTargetBitrate)) ||
+ !ReadRTCRTPStreamStats(aMsg, aIter, aResult) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCMediaStreamStats>
+{
+ typedef mozilla::dom::RTCMediaStreamStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mStreamIdentifier);
+ WriteParam(aMsg, aParam.mTrackIds);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mStreamIdentifier)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTrackIds)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCTransportStats>
+{
+ typedef mozilla::dom::RTCTransportStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mBytesReceived);
+ WriteParam(aMsg, aParam.mBytesSent);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mBytesReceived)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mBytesSent)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+template<>
+struct ParamTraits<mozilla::dom::RTCMediaStreamTrackStats>
+{
+ typedef mozilla::dom::RTCMediaStreamTrackStats paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mAudioLevel);
+ WriteParam(aMsg, aParam.mEchoReturnLoss);
+ WriteParam(aMsg, aParam.mEchoReturnLossEnhancement);
+ WriteParam(aMsg, aParam.mFrameHeight);
+ WriteParam(aMsg, aParam.mFrameWidth);
+ WriteParam(aMsg, aParam.mFramesCorrupted);
+ WriteParam(aMsg, aParam.mFramesDecoded);
+ WriteParam(aMsg, aParam.mFramesDropped);
+ WriteParam(aMsg, aParam.mFramesPerSecond);
+ WriteParam(aMsg, aParam.mFramesReceived);
+ WriteParam(aMsg, aParam.mFramesSent);
+ WriteParam(aMsg, aParam.mRemoteSource);
+ WriteParam(aMsg, aParam.mSsrcIds);
+ WriteParam(aMsg, aParam.mTrackIdentifier);
+ WriteRTCStats(aMsg, aParam);
+ }
+
+ static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+ {
+ if (!ReadParam(aMsg, aIter, &(aResult->mAudioLevel)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mEchoReturnLoss)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mEchoReturnLossEnhancement)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFrameHeight)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFrameWidth)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramesCorrupted)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramesDecoded)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramesDropped)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramesPerSecond)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramesReceived)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mFramesSent)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mRemoteSource)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mSsrcIds)) ||
+ !ReadParam(aMsg, aIter, &(aResult->mTrackIdentifier)) ||
+ !ReadRTCStats(aMsg, aIter, aResult)) {
+ return false;
+ }
+
+ return true;
+ }
+};
+
+} // namespace ipc
+
+#endif // _WEBRTC_GLOBAL_H_
diff --git a/dom/media/webrtc/moz.build b/dom/media/webrtc/moz.build
new file mode 100644
index 000000000..66def8719
--- /dev/null
+++ b/dom/media/webrtc/moz.build
@@ -0,0 +1,88 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+with Files('*'):
+ BUG_COMPONENT = ('Core', 'WebRTC: Audio/Video')
+
+with Files('PeerIdentity.*'):
+ BUG_COMPONENT = ('Core', 'WebRTC: Signaling')
+
+XPIDL_MODULE = 'content_webrtc'
+
+EXPORTS += [
+ 'MediaEngine.h',
+ 'MediaEngineCameraVideoSource.h',
+ 'MediaEngineDefault.h',
+ 'MediaTrackConstraints.h',
+]
+
+if CONFIG['MOZ_WEBRTC']:
+ if CONFIG['OS_TARGET'] == 'WINNT':
+ DEFINES['WEBRTC_WIN'] = True
+ else:
+ DEFINES['WEBRTC_POSIX'] = True
+ EXPORTS += ['AudioOutputObserver.h',
+ 'MediaEngineRemoteVideoSource.h',
+ 'MediaEngineWebRTC.h']
+ EXPORTS.mozilla.dom += [ 'RTCIdentityProviderRegistrar.h' ]
+ UNIFIED_SOURCES += [
+ 'MediaEngineCameraVideoSource.cpp',
+ 'MediaEngineRemoteVideoSource.cpp',
+ 'MediaEngineTabVideoSource.cpp',
+ 'MediaEngineWebRTCAudio.cpp',
+ 'RTCCertificate.cpp',
+ 'RTCIdentityProviderRegistrar.cpp',
+ ]
+ # MediaEngineWebRTC.cpp needs to be built separately.
+ SOURCES += [
+ 'MediaEngineWebRTC.cpp',
+ ]
+ LOCAL_INCLUDES += [
+ '/dom/base',
+ '/media/libyuv/include',
+ '/media/webrtc/signaling/src/common',
+ '/media/webrtc/signaling/src/common/browser_logging',
+ '/media/webrtc/trunk',
+ ]
+
+XPIDL_SOURCES += [
+ 'nsITabSource.idl'
+]
+
+UNIFIED_SOURCES += [
+ 'MediaEngineDefault.cpp',
+ 'MediaTrackConstraints.cpp',
+ 'PeerIdentity.cpp',
+]
+
+EXPORTS.mozilla += [
+ 'PeerIdentity.h',
+]
+EXPORTS.mozilla.dom += [
+ 'RTCCertificate.h',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+# Suppress some GCC/clang warnings being treated as errors:
+# - about attributes on forward declarations for types that are already
+# defined, which complains about important MOZ_EXPORT attributes for
+# android API types
+if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
+ CXXFLAGS += [
+ '-Wno-error=attributes',
+ '-Wno-error=shadow',
+ ]
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['_MSC_VER']:
+ CXXFLAGS += [
+ '-wd4275', # non dll-interface class used as base for dll-interface class
+ '-wd4312', # This is intended as a temporary hack to support building with VS2015
+ # 'reinterpret_cast': conversion from 'DWORD' to 'HANDLE' of greater size
+ ]
+ DEFINES['__PRETTY_FUNCTION__'] = '__FUNCSIG__'
diff --git a/dom/media/webrtc/nsITabSource.idl b/dom/media/webrtc/nsITabSource.idl
new file mode 100644
index 000000000..c44d51208
--- /dev/null
+++ b/dom/media/webrtc/nsITabSource.idl
@@ -0,0 +1,20 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+interface mozIDOMWindowProxy;
+
+[scriptable,uuid(0feba7f2-800d-4fe5-b28d-e3f17a7a7322)]
+interface nsITabSource : nsISupports
+{
+ mozIDOMWindowProxy getTabToStream();
+ void notifyStreamStart(in mozIDOMWindowProxy window);
+ void notifyStreamStop(in mozIDOMWindowProxy window);
+};
+
+%{C++
+#define NS_TABSOURCESERVICE_CONTRACTID "@mozilla.org/tab-source-service;1"
+%}
diff --git a/dom/media/webspeech/moz.build b/dom/media/webspeech/moz.build
new file mode 100644
index 000000000..85e2277b3
--- /dev/null
+++ b/dom/media/webspeech/moz.build
@@ -0,0 +1,9 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS = ['synth']
+
+if CONFIG['MOZ_WEBSPEECH']:
+ DIRS += ['recognition']
diff --git a/dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.cpp b/dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.cpp
new file mode 100644
index 000000000..b7aa5f2d7
--- /dev/null
+++ b/dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.cpp
@@ -0,0 +1,357 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsThreadUtils.h"
+#include "nsXPCOMCIDInternal.h"
+#include "PocketSphinxSpeechRecognitionService.h"
+#include "nsIFile.h"
+#include "SpeechGrammar.h"
+#include "SpeechRecognition.h"
+#include "SpeechRecognitionAlternative.h"
+#include "SpeechRecognitionResult.h"
+#include "SpeechRecognitionResultList.h"
+#include "nsIObserverService.h"
+#include "MediaPrefs.h"
+#include "mozilla/Services.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsDirectoryServiceUtils.h"
+#include "nsMemory.h"
+
+extern "C" {
+#include "pocketsphinx/pocketsphinx.h"
+#include "sphinxbase/logmath.h"
+#include "sphinxbase/sphinx_config.h"
+#include "sphinxbase/jsgf.h"
+}
+
+namespace mozilla {
+
+using namespace dom;
+
+class DecodeResultTask : public Runnable
+{
+public:
+ DecodeResultTask(const nsString& hypstring,
+ float64 confidence,
+ WeakPtr<dom::SpeechRecognition> recognition)
+ : mResult(hypstring),
+ mConfidence(confidence),
+ mRecognition(recognition),
+ mWorkerThread(do_GetCurrentThread())
+ {
+ MOZ_ASSERT(
+ !NS_IsMainThread()); // This should be running on the worker thread
+ }
+
+ NS_IMETHOD
+ Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread()); // This method is supposed to run on the main
+ // thread!
+
+ // Declare javascript result events
+ RefPtr<SpeechEvent> event = new SpeechEvent(
+ mRecognition, SpeechRecognition::EVENT_RECOGNITIONSERVICE_FINAL_RESULT);
+ SpeechRecognitionResultList* resultList =
+ new SpeechRecognitionResultList(mRecognition);
+ SpeechRecognitionResult* result = new SpeechRecognitionResult(mRecognition);
+ if (0 < mRecognition->MaxAlternatives()) {
+ SpeechRecognitionAlternative* alternative =
+ new SpeechRecognitionAlternative(mRecognition);
+
+ alternative->mTranscript = mResult;
+ alternative->mConfidence = mConfidence;
+
+ result->mItems.AppendElement(alternative);
+ }
+ resultList->mItems.AppendElement(result);
+
+ event->mRecognitionResultList = resultList;
+ NS_DispatchToMainThread(event);
+
+ // If we don't destroy the thread when we're done with it, it will hang
+ // around forever... bad!
+ // But thread->Shutdown must be called from the main thread, not from the
+ // thread itself.
+ return mWorkerThread->Shutdown();
+ }
+
+private:
+ nsString mResult;
+ float64 mConfidence;
+ WeakPtr<dom::SpeechRecognition> mRecognition;
+ nsCOMPtr<nsIThread> mWorkerThread;
+};
+
+class DecodeTask : public Runnable
+{
+public:
+ DecodeTask(WeakPtr<dom::SpeechRecognition> recogntion,
+ const nsTArray<int16_t>& audiovector, ps_decoder_t* ps)
+ : mRecognition(recogntion), mAudiovector(audiovector), mPs(ps)
+ {
+ }
+
+ NS_IMETHOD
+ Run() override
+ {
+ char const* hyp;
+ int rv;
+ int32 final;
+ int32 logprob;
+ float64 confidence;
+ nsAutoCString hypoValue;
+
+ rv = ps_start_utt(mPs);
+ rv = ps_process_raw(mPs, &mAudiovector[0], mAudiovector.Length(), FALSE,
+ FALSE);
+
+ rv = ps_end_utt(mPs);
+ confidence = 0;
+ if (rv >= 0) {
+ hyp = ps_get_hyp_final(mPs, &final);
+ if (hyp && final) {
+ logprob = ps_get_prob(mPs);
+ confidence = logmath_exp(ps_get_logmath(mPs), logprob);
+ hypoValue.Assign(hyp);
+ }
+ }
+
+ nsCOMPtr<nsIRunnable> resultrunnable =
+ new DecodeResultTask(NS_ConvertUTF8toUTF16(hypoValue), confidence, mRecognition);
+ return NS_DispatchToMainThread(resultrunnable);
+ }
+
+private:
+ WeakPtr<dom::SpeechRecognition> mRecognition;
+ nsTArray<int16_t> mAudiovector;
+ ps_decoder_t* mPs;
+};
+
+NS_IMPL_ISUPPORTS(PocketSphinxSpeechRecognitionService,
+ nsISpeechRecognitionService, nsIObserver)
+
+PocketSphinxSpeechRecognitionService::PocketSphinxSpeechRecognitionService()
+{
+ mSpeexState = nullptr;
+
+ // get root folder
+ nsCOMPtr<nsIFile> tmpFile;
+ nsAutoString aStringAMPath; // am folder
+ nsAutoString aStringDictPath; // dict folder
+
+ NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(tmpFile));
+#if defined(XP_WIN) // for some reason, on windows NS_GRE_DIR is not bin root,
+ // but bin/browser
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING(".."));
+#endif
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING("models"));
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING("en-US"));
+ tmpFile->GetPath(aStringAMPath);
+
+ NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(tmpFile));
+#if defined(XP_WIN) // for some reason, on windows NS_GRE_DIR is not bin root,
+ // but bin/browser
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING(".."));
+#endif
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING("models")); //
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING("dict")); //
+ tmpFile->AppendRelativePath(NS_LITERAL_STRING("en-US.dic")); //
+ tmpFile->GetPath(aStringDictPath);
+
+ // FOR B2G PATHS HARDCODED (APPEND /DATA ON THE BEGINING, FOR DESKTOP, ONLY
+ // MODELS/ RELATIVE TO ROOT
+ mPSConfig = cmd_ln_init(nullptr, ps_args(), TRUE, "-bestpath", "yes", "-hmm",
+ ToNewUTF8String(aStringAMPath), // acoustic model
+ "-dict", ToNewUTF8String(aStringDictPath), nullptr);
+ if (mPSConfig == nullptr) {
+ ISDecoderCreated = false;
+ } else {
+ mPSHandle = ps_init(mPSConfig);
+ if (mPSHandle == nullptr) {
+ ISDecoderCreated = false;
+ } else {
+ ISDecoderCreated = true;
+ }
+ }
+
+ ISGrammarCompiled = false;
+}
+
+PocketSphinxSpeechRecognitionService::~PocketSphinxSpeechRecognitionService()
+{
+ if (mPSConfig) {
+ free(mPSConfig);
+ }
+ if (mPSHandle) {
+ free(mPSHandle);
+ }
+
+ mSpeexState = nullptr;
+}
+
+// CALL START IN JS FALLS HERE
+NS_IMETHODIMP
+PocketSphinxSpeechRecognitionService::Initialize(
+ WeakPtr<SpeechRecognition> aSpeechRecognition)
+{
+ if (!ISDecoderCreated || !ISGrammarCompiled) {
+ return NS_ERROR_NOT_INITIALIZED;
+ } else {
+ mAudioVector.Clear();
+
+ if (mSpeexState) {
+ mSpeexState = nullptr;
+ }
+
+ mRecognition = aSpeechRecognition;
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->AddObserver(this, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC, false);
+ obs->AddObserver(this, SPEECH_RECOGNITION_TEST_END_TOPIC, false);
+ return NS_OK;
+ }
+}
+
+NS_IMETHODIMP
+PocketSphinxSpeechRecognitionService::ProcessAudioSegment(
+ AudioSegment* aAudioSegment, int32_t aSampleRate)
+{
+ if (!mSpeexState) {
+ mSpeexState = speex_resampler_init(1, aSampleRate, 16000,
+ SPEEX_RESAMPLER_QUALITY_MAX, nullptr);
+ }
+ aAudioSegment->ResampleChunks(mSpeexState, aSampleRate, 16000);
+
+ AudioSegment::ChunkIterator iterator(*aAudioSegment);
+
+ while (!iterator.IsEnded()) {
+ mozilla::AudioChunk& chunk = *(iterator);
+ MOZ_ASSERT(chunk.mBuffer);
+ const int16_t* buf = static_cast<const int16_t*>(chunk.mChannelData[0]);
+
+ for (int i = 0; i < iterator->mDuration; i++) {
+ mAudioVector.AppendElement((int16_t)buf[i]);
+ }
+ iterator.Next();
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+PocketSphinxSpeechRecognitionService::SoundEnd()
+{
+ speex_resampler_destroy(mSpeexState);
+ mSpeexState = nullptr;
+
+ // To create a new thread, get the thread manager
+ nsCOMPtr<nsIThreadManager> tm = do_GetService(NS_THREADMANAGER_CONTRACTID);
+ nsCOMPtr<nsIThread> decodethread;
+ nsresult rv = tm->NewThread(0, 0, getter_AddRefs(decodethread));
+ if (NS_FAILED(rv)) {
+ // In case of failure, call back immediately with an empty string which
+ // indicates failure
+ return NS_OK;
+ }
+
+ nsCOMPtr<nsIRunnable> r =
+ new DecodeTask(mRecognition, mAudioVector, mPSHandle);
+ decodethread->Dispatch(r, nsIEventTarget::DISPATCH_NORMAL);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+PocketSphinxSpeechRecognitionService::ValidateAndSetGrammarList(
+ SpeechGrammar* aSpeechGrammar,
+ nsISpeechGrammarCompilationCallback* aCallback)
+{
+ if (!ISDecoderCreated) {
+ ISGrammarCompiled = false;
+ } else if (aSpeechGrammar) {
+ nsAutoString grammar;
+ ErrorResult rv;
+ aSpeechGrammar->GetSrc(grammar, rv);
+
+ int result = ps_set_jsgf_string(mPSHandle, "name",
+ NS_ConvertUTF16toUTF8(grammar).get());
+
+ if (result != 0) {
+ ISGrammarCompiled = false;
+ } else {
+ ps_set_search(mPSHandle, "name");
+
+ ISGrammarCompiled = true;
+ }
+ } else {
+ ISGrammarCompiled = false;
+ }
+
+ return ISGrammarCompiled ? NS_OK : NS_ERROR_NOT_INITIALIZED;
+}
+
+NS_IMETHODIMP
+PocketSphinxSpeechRecognitionService::Abort()
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+PocketSphinxSpeechRecognitionService::Observe(nsISupports* aSubject,
+ const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(MediaPrefs::WebSpeechFakeRecognitionService(),
+ "Got request to fake recognition service event, "
+ "but " TEST_PREFERENCE_FAKE_RECOGNITION_SERVICE " is not set");
+
+ if (!strcmp(aTopic, SPEECH_RECOGNITION_TEST_END_TOPIC)) {
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->RemoveObserver(this, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC);
+ obs->RemoveObserver(this, SPEECH_RECOGNITION_TEST_END_TOPIC);
+
+ return NS_OK;
+ }
+
+ const nsDependentString eventName = nsDependentString(aData);
+
+ if (eventName.EqualsLiteral("EVENT_RECOGNITIONSERVICE_ERROR")) {
+ mRecognition->DispatchError(
+ SpeechRecognition::EVENT_RECOGNITIONSERVICE_ERROR,
+ SpeechRecognitionErrorCode::Network, // TODO different codes?
+ NS_LITERAL_STRING("RECOGNITIONSERVICE_ERROR test event"));
+
+ } else if (eventName.EqualsLiteral("EVENT_RECOGNITIONSERVICE_FINAL_RESULT")) {
+ RefPtr<SpeechEvent> event = new SpeechEvent(
+ mRecognition, SpeechRecognition::EVENT_RECOGNITIONSERVICE_FINAL_RESULT);
+
+ event->mRecognitionResultList = BuildMockResultList();
+ NS_DispatchToMainThread(event);
+ }
+
+ return NS_OK;
+}
+
+SpeechRecognitionResultList*
+PocketSphinxSpeechRecognitionService::BuildMockResultList()
+{
+ SpeechRecognitionResultList* resultList =
+ new SpeechRecognitionResultList(mRecognition);
+ SpeechRecognitionResult* result = new SpeechRecognitionResult(mRecognition);
+ if (0 < mRecognition->MaxAlternatives()) {
+ SpeechRecognitionAlternative* alternative =
+ new SpeechRecognitionAlternative(mRecognition);
+
+ alternative->mTranscript = NS_LITERAL_STRING("Mock final result");
+ alternative->mConfidence = 0.0f;
+
+ result->mItems.AppendElement(alternative);
+ }
+ resultList->mItems.AppendElement(result);
+
+ return resultList;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.h b/dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.h
new file mode 100644
index 000000000..5b814b9a5
--- /dev/null
+++ b/dom/media/webspeech/recognition/PocketSphinxSpeechRecognitionService.h
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_PocketSphinxRecognitionService_h
+#define mozilla_dom_PocketSphinxRecognitionService_h
+
+#include "nsCOMPtr.h"
+#include "nsTArray.h"
+#include "nsIObserver.h"
+#include "nsISpeechRecognitionService.h"
+#include "speex/speex_resampler.h"
+
+extern "C" {
+#include <pocketsphinx/pocketsphinx.h>
+#include <sphinxbase/sphinx_config.h>
+}
+
+#define NS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID \
+ { \
+ 0x0ff5ce56, 0x5b09, 0x4db8, { \
+ 0xad, 0xc6, 0x82, 0x66, 0xaf, 0x95, 0xf8, 0x64 \
+ } \
+ };
+
+namespace mozilla {
+
+/**
+ * Pocketsphix implementation of the nsISpeechRecognitionService interface
+ */
+class PocketSphinxSpeechRecognitionService : public nsISpeechRecognitionService,
+ public nsIObserver
+{
+public:
+ // Add XPCOM glue code
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISPEECHRECOGNITIONSERVICE
+
+ // Add nsIObserver code
+ NS_DECL_NSIOBSERVER
+
+ /**
+ * Default constructs a PocketSphinxSpeechRecognitionService loading default
+ * files
+ */
+ PocketSphinxSpeechRecognitionService();
+
+private:
+ /**
+ * Private destructor to prevent bypassing of reference counting
+ */
+ virtual ~PocketSphinxSpeechRecognitionService();
+
+ /** The associated SpeechRecognition */
+ WeakPtr<dom::SpeechRecognition> mRecognition;
+
+ /**
+ * Builds a mock SpeechRecognitionResultList
+ */
+ dom::SpeechRecognitionResultList* BuildMockResultList();
+
+ /** Speex state */
+ SpeexResamplerState* mSpeexState;
+
+ /** Pocksphix decoder */
+ ps_decoder_t* mPSHandle;
+
+ /** Sphinxbase parsed command line arguments */
+ cmd_ln_t* mPSConfig;
+
+ /** Flag to verify if decoder was created */
+ bool ISDecoderCreated;
+
+ /** Flag to verify if grammar was compiled */
+ bool ISGrammarCompiled;
+
+ /** Audio data */
+ nsTArray<int16_t> mAudioVector;
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechGrammar.cpp b/dom/media/webspeech/recognition/SpeechGrammar.cpp
new file mode 100644
index 000000000..c7e30fdf9
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechGrammar.cpp
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechGrammar.h"
+
+#include "mozilla/dom/SpeechGrammarBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SpeechGrammar, mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechGrammar)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechGrammar)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechGrammar)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+SpeechGrammar::SpeechGrammar(nsISupports* aParent)
+ : mParent(aParent)
+{
+}
+
+SpeechGrammar::~SpeechGrammar()
+{
+}
+
+already_AddRefed<SpeechGrammar>
+SpeechGrammar::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ RefPtr<SpeechGrammar> speechGrammar =
+ new SpeechGrammar(aGlobal.GetAsSupports());
+ return speechGrammar.forget();
+}
+
+nsISupports*
+SpeechGrammar::GetParentObject() const
+{
+ return mParent;
+}
+
+JSObject*
+SpeechGrammar::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechGrammarBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+SpeechGrammar::GetSrc(nsString& aRetVal, ErrorResult& aRv) const
+{
+ aRetVal = mSrc;
+ return;
+}
+
+void
+SpeechGrammar::SetSrc(const nsAString& aArg, ErrorResult& aRv)
+{
+ mSrc = aArg;
+ return;
+}
+
+float
+SpeechGrammar::GetWeight(ErrorResult& aRv) const
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return 0;
+}
+
+void
+SpeechGrammar::SetWeight(float aArg, ErrorResult& aRv)
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechGrammar.h b/dom/media/webspeech/recognition/SpeechGrammar.h
new file mode 100644
index 000000000..8a6a14eac
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechGrammar.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechGrammar_h
+#define mozilla_dom_SpeechGrammar_h
+
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsString.h"
+#include "nsWrapperCache.h"
+#include "js/TypeDecls.h"
+
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+
+namespace mozilla {
+namespace dom {
+
+class GlobalObject;
+
+class SpeechGrammar final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ explicit SpeechGrammar(nsISupports* aParent);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(SpeechGrammar)
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static already_AddRefed<SpeechGrammar>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
+
+ void GetSrc(nsString& aRetVal, ErrorResult& aRv) const;
+
+ void SetSrc(const nsAString& aArg, ErrorResult& aRv);
+
+ float GetWeight(ErrorResult& aRv) const;
+
+ void SetWeight(float aArg, ErrorResult& aRv);
+
+private:
+ ~SpeechGrammar();
+
+ nsCOMPtr<nsISupports> mParent;
+
+ nsString mSrc;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechGrammarList.cpp b/dom/media/webspeech/recognition/SpeechGrammarList.cpp
new file mode 100644
index 000000000..d4883378f
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechGrammarList.cpp
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechGrammarList.h"
+
+#include "mozilla/dom/SpeechGrammarListBinding.h"
+#include "mozilla/ErrorResult.h"
+#include "nsCOMPtr.h"
+#include "nsXPCOMStrings.h"
+#include "SpeechRecognition.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SpeechGrammarList, mParent, mItems)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechGrammarList)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechGrammarList)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechGrammarList)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+SpeechGrammarList::SpeechGrammarList(nsISupports* aParent)
+ : mParent(aParent)
+{
+}
+
+SpeechGrammarList::~SpeechGrammarList()
+{
+}
+
+already_AddRefed<SpeechGrammarList>
+SpeechGrammarList::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ RefPtr<SpeechGrammarList> speechGrammarList =
+ new SpeechGrammarList(aGlobal.GetAsSupports());
+ return speechGrammarList.forget();
+}
+
+JSObject*
+SpeechGrammarList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechGrammarListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports*
+SpeechGrammarList::GetParentObject() const
+{
+ return mParent;
+}
+
+uint32_t
+SpeechGrammarList::Length() const
+{
+ return mItems.Length();
+}
+
+already_AddRefed<SpeechGrammar>
+SpeechGrammarList::Item(uint32_t aIndex, ErrorResult& aRv)
+{
+ RefPtr<SpeechGrammar> result = mItems.ElementAt(aIndex);
+ return result.forget();
+}
+
+void
+SpeechGrammarList::AddFromURI(const nsAString& aSrc,
+ const Optional<float>& aWeight,
+ ErrorResult& aRv)
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return;
+}
+
+void
+SpeechGrammarList::AddFromString(const nsAString& aString,
+ const Optional<float>& aWeight,
+ ErrorResult& aRv)
+{
+ SpeechGrammar* speechGrammar = new SpeechGrammar(mParent);
+ speechGrammar->SetSrc(aString, aRv);
+ mItems.AppendElement(speechGrammar);
+ return;
+}
+
+already_AddRefed<SpeechGrammar>
+SpeechGrammarList::IndexedGetter(uint32_t aIndex, bool& aPresent,
+ ErrorResult& aRv)
+{
+ if (aIndex >= Length()) {
+ aPresent = false;
+ return nullptr;
+ }
+ ErrorResult rv;
+ aPresent = true;
+ return Item(aIndex, rv);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechGrammarList.h b/dom/media/webspeech/recognition/SpeechGrammarList.h
new file mode 100644
index 000000000..dbe7117fe
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechGrammarList.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechGrammarList_h
+#define mozilla_dom_SpeechGrammarList_h
+
+#include "mozilla/Attributes.h"
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+
+struct JSContext;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class GlobalObject;
+class SpeechGrammar;
+template<typename> class Optional;
+
+class SpeechGrammarList final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ explicit SpeechGrammarList(nsISupports* aParent);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(SpeechGrammarList)
+
+ static already_AddRefed<SpeechGrammarList> Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint32_t Length() const;
+
+ already_AddRefed<SpeechGrammar> Item(uint32_t aIndex, ErrorResult& aRv);
+
+ void AddFromURI(const nsAString& aSrc, const Optional<float>& aWeight, ErrorResult& aRv);
+
+ void AddFromString(const nsAString& aString, const Optional<float>& aWeight, ErrorResult& aRv);
+
+ already_AddRefed<SpeechGrammar> IndexedGetter(uint32_t aIndex, bool& aPresent, ErrorResult& aRv);
+
+private:
+ ~SpeechGrammarList();
+
+ nsCOMPtr<nsISupports> mParent;
+
+ nsTArray<RefPtr<SpeechGrammar>> mItems;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechRecognition.cpp b/dom/media/webspeech/recognition/SpeechRecognition.cpp
new file mode 100644
index 000000000..48b1177b2
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognition.cpp
@@ -0,0 +1,1087 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechRecognition.h"
+
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+
+#include "mozilla/dom/BindingUtils.h"
+#include "mozilla/dom/Element.h"
+#include "mozilla/dom/SpeechRecognitionBinding.h"
+#include "mozilla/dom/MediaStreamTrackBinding.h"
+#include "mozilla/dom/MediaStreamError.h"
+#include "mozilla/MediaManager.h"
+#include "mozilla/Preferences.h"
+#include "MediaPrefs.h"
+#include "mozilla/Services.h"
+
+#include "AudioSegment.h"
+#include "endpointer.h"
+
+#include "mozilla/dom/SpeechRecognitionEvent.h"
+#include "nsContentUtils.h"
+#include "nsIDocument.h"
+#include "nsIObserverService.h"
+#include "nsIPermissionManager.h"
+#include "nsIPrincipal.h"
+#include "nsPIDOMWindow.h"
+#include "nsServiceManagerUtils.h"
+#include "nsQueryObject.h"
+
+#include <algorithm>
+
+// Undo the windows.h damage
+#if defined(XP_WIN) && defined(GetMessage)
+#undef GetMessage
+#endif
+
+namespace mozilla {
+namespace dom {
+
+#define PREFERENCE_DEFAULT_RECOGNITION_SERVICE "media.webspeech.service.default"
+#define DEFAULT_RECOGNITION_SERVICE_PREFIX "pocketsphinx-"
+#define DEFAULT_RECOGNITION_SERVICE "pocketsphinx-en-US"
+
+#define PREFERENCE_ENDPOINTER_SILENCE_LENGTH "media.webspeech.silence_length"
+#define PREFERENCE_ENDPOINTER_LONG_SILENCE_LENGTH "media.webspeech.long_silence_length"
+#define PREFERENCE_ENDPOINTER_LONG_SPEECH_LENGTH "media.webspeech.long_speech_length"
+
+static const uint32_t kSAMPLE_RATE = 16000;
+static const uint32_t kSPEECH_DETECTION_TIMEOUT_MS = 10000;
+
+// number of frames corresponding to 300ms of audio to send to endpointer while
+// it's in environment estimation mode
+// kSAMPLE_RATE frames = 1s, kESTIMATION_FRAMES frames = 300ms
+static const uint32_t kESTIMATION_SAMPLES = 300 * kSAMPLE_RATE / 1000;
+
+LogModule*
+GetSpeechRecognitionLog()
+{
+ static LazyLogModule sLog("SpeechRecognition");
+ return sLog;
+}
+#define SR_LOG(...) MOZ_LOG(GetSpeechRecognitionLog(), mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+already_AddRefed<nsISpeechRecognitionService>
+GetSpeechRecognitionService(const nsAString& aLang)
+{
+ nsAutoCString speechRecognitionServiceCID;
+
+ nsAdoptingCString prefValue =
+ Preferences::GetCString(PREFERENCE_DEFAULT_RECOGNITION_SERVICE);
+ nsAutoCString speechRecognitionService;
+
+ if (!aLang.IsEmpty()) {
+ speechRecognitionService =
+ NS_LITERAL_CSTRING(DEFAULT_RECOGNITION_SERVICE_PREFIX) +
+ NS_ConvertUTF16toUTF8(aLang);
+ } else if (!prefValue.IsEmpty()) {
+ speechRecognitionService = prefValue;
+ } else {
+ speechRecognitionService = DEFAULT_RECOGNITION_SERVICE;
+ }
+
+ if (MediaPrefs::WebSpeechFakeRecognitionService()) {
+ speechRecognitionServiceCID =
+ NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "fake";
+ } else {
+ speechRecognitionServiceCID =
+ NS_LITERAL_CSTRING(NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX) +
+ speechRecognitionService;
+ }
+
+ nsresult rv;
+ nsCOMPtr<nsISpeechRecognitionService> recognitionService;
+ recognitionService = do_GetService(speechRecognitionServiceCID.get(), &rv);
+ return recognitionService.forget();
+}
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(SpeechRecognition, DOMEventTargetHelper, mDOMStream, mSpeechGrammarList)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SpeechRecognition)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(SpeechRecognition, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SpeechRecognition, DOMEventTargetHelper)
+
+SpeechRecognition::SpeechRecognition(nsPIDOMWindowInner* aOwnerWindow)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mEndpointer(kSAMPLE_RATE)
+ , mAudioSamplesPerChunk(mEndpointer.FrameSize())
+ , mSpeechDetectionTimer(do_CreateInstance(NS_TIMER_CONTRACTID))
+ , mSpeechGrammarList(new SpeechGrammarList(GetParentObject()))
+ , mInterimResults(false)
+ , mMaxAlternatives(1)
+{
+ SR_LOG("created SpeechRecognition");
+
+ if (MediaPrefs::WebSpeechTestEnabled()) {
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->AddObserver(this, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC, false);
+ obs->AddObserver(this, SPEECH_RECOGNITION_TEST_END_TOPIC, false);
+ }
+
+ mEndpointer.set_speech_input_complete_silence_length(
+ Preferences::GetInt(PREFERENCE_ENDPOINTER_SILENCE_LENGTH, 1250000));
+ mEndpointer.set_long_speech_input_complete_silence_length(
+ Preferences::GetInt(PREFERENCE_ENDPOINTER_LONG_SILENCE_LENGTH, 2500000));
+ mEndpointer.set_long_speech_length(
+ Preferences::GetInt(PREFERENCE_ENDPOINTER_SILENCE_LENGTH, 3 * 1000000));
+ Reset();
+}
+
+bool
+SpeechRecognition::StateBetween(FSMState begin, FSMState end)
+{
+ return mCurrentState >= begin && mCurrentState <= end;
+}
+
+void
+SpeechRecognition::SetState(FSMState state)
+{
+ mCurrentState = state;
+ SR_LOG("Transitioned to state %s", GetName(mCurrentState));
+ return;
+}
+
+JSObject*
+SpeechRecognition::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechRecognitionBinding::Wrap(aCx, this, aGivenProto);
+}
+
+bool
+SpeechRecognition::IsAuthorized(JSContext* aCx, JSObject* aGlobal)
+{
+ nsCOMPtr<nsIPrincipal> principal = nsContentUtils::ObjectPrincipal(aGlobal);
+
+ nsresult rv;
+ nsCOMPtr<nsIPermissionManager> mgr = do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+
+ uint32_t speechRecognition = nsIPermissionManager::UNKNOWN_ACTION;
+ rv = mgr->TestExactPermissionFromPrincipal(principal, "speech-recognition", &speechRecognition);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+
+ bool hasPermission = (speechRecognition == nsIPermissionManager::ALLOW_ACTION);
+
+ return (hasPermission || MediaPrefs::WebSpeechRecognitionForceEnabled()
+ || MediaPrefs::WebSpeechTestEnabled())
+ && MediaPrefs::WebSpeechRecognitionEnabled();
+}
+
+already_AddRefed<SpeechRecognition>
+SpeechRecognition::Constructor(const GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports());
+ if (!win) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ }
+
+ MOZ_ASSERT(win->IsInnerWindow());
+ RefPtr<SpeechRecognition> object = new SpeechRecognition(win);
+ return object.forget();
+}
+
+nsISupports*
+SpeechRecognition::GetParentObject() const
+{
+ return GetOwner();
+}
+
+void
+SpeechRecognition::ProcessEvent(SpeechEvent* aEvent)
+{
+ SR_LOG("Processing %s, current state is %s",
+ GetName(aEvent),
+ GetName(mCurrentState));
+
+ if (mAborted && aEvent->mType != EVENT_ABORT) {
+ // ignore all events while aborting
+ return;
+ }
+
+ Transition(aEvent);
+}
+
+void
+SpeechRecognition::Transition(SpeechEvent* aEvent)
+{
+ switch (mCurrentState) {
+ case STATE_IDLE:
+ switch (aEvent->mType) {
+ case EVENT_START:
+ // TODO: may want to time out if we wait too long
+ // for user to approve
+ WaitForAudioData(aEvent);
+ break;
+ case EVENT_STOP:
+ case EVENT_ABORT:
+ case EVENT_AUDIO_DATA:
+ case EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT:
+ case EVENT_RECOGNITIONSERVICE_FINAL_RESULT:
+ DoNothing(aEvent);
+ break;
+ case EVENT_AUDIO_ERROR:
+ case EVENT_RECOGNITIONSERVICE_ERROR:
+ AbortError(aEvent);
+ break;
+ case EVENT_COUNT:
+ MOZ_CRASH("Invalid event EVENT_COUNT");
+ }
+ break;
+ case STATE_STARTING:
+ switch (aEvent->mType) {
+ case EVENT_AUDIO_DATA:
+ StartedAudioCapture(aEvent);
+ break;
+ case EVENT_AUDIO_ERROR:
+ case EVENT_RECOGNITIONSERVICE_ERROR:
+ AbortError(aEvent);
+ break;
+ case EVENT_ABORT:
+ AbortSilently(aEvent);
+ break;
+ case EVENT_STOP:
+ Reset();
+ break;
+ case EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT:
+ case EVENT_RECOGNITIONSERVICE_FINAL_RESULT:
+ DoNothing(aEvent);
+ break;
+ case EVENT_START:
+ SR_LOG("STATE_STARTING: Unhandled event %s", GetName(aEvent));
+ MOZ_CRASH();
+ case EVENT_COUNT:
+ MOZ_CRASH("Invalid event EVENT_COUNT");
+ }
+ break;
+ case STATE_ESTIMATING:
+ switch (aEvent->mType) {
+ case EVENT_AUDIO_DATA:
+ WaitForEstimation(aEvent);
+ break;
+ case EVENT_STOP:
+ StopRecordingAndRecognize(aEvent);
+ break;
+ case EVENT_ABORT:
+ AbortSilently(aEvent);
+ break;
+ case EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT:
+ case EVENT_RECOGNITIONSERVICE_FINAL_RESULT:
+ case EVENT_RECOGNITIONSERVICE_ERROR:
+ DoNothing(aEvent);
+ break;
+ case EVENT_AUDIO_ERROR:
+ AbortError(aEvent);
+ break;
+ case EVENT_START:
+ SR_LOG("STATE_ESTIMATING: Unhandled event %d", aEvent->mType);
+ MOZ_CRASH();
+ case EVENT_COUNT:
+ MOZ_CRASH("Invalid event EVENT_COUNT");
+ }
+ break;
+ case STATE_WAITING_FOR_SPEECH:
+ switch (aEvent->mType) {
+ case EVENT_AUDIO_DATA:
+ DetectSpeech(aEvent);
+ break;
+ case EVENT_STOP:
+ StopRecordingAndRecognize(aEvent);
+ break;
+ case EVENT_ABORT:
+ AbortSilently(aEvent);
+ break;
+ case EVENT_AUDIO_ERROR:
+ AbortError(aEvent);
+ break;
+ case EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT:
+ case EVENT_RECOGNITIONSERVICE_FINAL_RESULT:
+ case EVENT_RECOGNITIONSERVICE_ERROR:
+ DoNothing(aEvent);
+ break;
+ case EVENT_START:
+ SR_LOG("STATE_STARTING: Unhandled event %s", GetName(aEvent));
+ MOZ_CRASH();
+ case EVENT_COUNT:
+ MOZ_CRASH("Invalid event EVENT_COUNT");
+ }
+ break;
+ case STATE_RECOGNIZING:
+ switch (aEvent->mType) {
+ case EVENT_AUDIO_DATA:
+ WaitForSpeechEnd(aEvent);
+ break;
+ case EVENT_STOP:
+ StopRecordingAndRecognize(aEvent);
+ break;
+ case EVENT_AUDIO_ERROR:
+ case EVENT_RECOGNITIONSERVICE_ERROR:
+ AbortError(aEvent);
+ break;
+ case EVENT_ABORT:
+ AbortSilently(aEvent);
+ break;
+ case EVENT_RECOGNITIONSERVICE_FINAL_RESULT:
+ case EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT:
+ DoNothing(aEvent);
+ break;
+ case EVENT_START:
+ SR_LOG("STATE_RECOGNIZING: Unhandled aEvent %s", GetName(aEvent));
+ MOZ_CRASH();
+ case EVENT_COUNT:
+ MOZ_CRASH("Invalid event EVENT_COUNT");
+ }
+ break;
+ case STATE_WAITING_FOR_RESULT:
+ switch (aEvent->mType) {
+ case EVENT_STOP:
+ DoNothing(aEvent);
+ break;
+ case EVENT_AUDIO_ERROR:
+ case EVENT_RECOGNITIONSERVICE_ERROR:
+ AbortError(aEvent);
+ break;
+ case EVENT_RECOGNITIONSERVICE_FINAL_RESULT:
+ NotifyFinalResult(aEvent);
+ break;
+ case EVENT_AUDIO_DATA:
+ DoNothing(aEvent);
+ break;
+ case EVENT_ABORT:
+ AbortSilently(aEvent);
+ break;
+ case EVENT_START:
+ case EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT:
+ SR_LOG("STATE_WAITING_FOR_RESULT: Unhandled aEvent %s", GetName(aEvent));
+ MOZ_CRASH();
+ case EVENT_COUNT:
+ MOZ_CRASH("Invalid event EVENT_COUNT");
+ }
+ break;
+ case STATE_COUNT:
+ MOZ_CRASH("Invalid state STATE_COUNT");
+ }
+
+ return;
+}
+
+/*
+ * Handle a segment of recorded audio data.
+ * Returns the number of samples that were processed.
+ */
+uint32_t
+SpeechRecognition::ProcessAudioSegment(AudioSegment* aSegment, TrackRate aTrackRate)
+{
+ AudioSegment::ChunkIterator iterator(*aSegment);
+ uint32_t samples = 0;
+ while (!iterator.IsEnded()) {
+ float out;
+ mEndpointer.ProcessAudio(*iterator, &out);
+ samples += iterator->GetDuration();
+ iterator.Next();
+ }
+
+ mRecognitionService->ProcessAudioSegment(aSegment, aTrackRate);
+ return samples;
+}
+
+/****************************************************************************
+ * FSM Transition functions
+ *
+ * If a transition function may cause a DOM event to be fired,
+ * it may also be re-entered, since the event handler may cause the
+ * event loop to spin and new SpeechEvents to be processed.
+ *
+ * Rules:
+ * 1) These methods should call SetState as soon as possible.
+ * 2) If these methods dispatch DOM events, or call methods that dispatch
+ * DOM events, that should be done as late as possible.
+ * 3) If anything must happen after dispatching a DOM event, make sure
+ * the state is still what the method expected it to be.
+ ****************************************************************************/
+
+void
+SpeechRecognition::Reset()
+{
+ SetState(STATE_IDLE);
+ mRecognitionService = nullptr;
+ mEstimationSamples = 0;
+ mBufferedSamples = 0;
+ mSpeechDetectionTimer->Cancel();
+ mAborted = false;
+}
+
+void
+SpeechRecognition::ResetAndEnd()
+{
+ Reset();
+ DispatchTrustedEvent(NS_LITERAL_STRING("end"));
+}
+
+void
+SpeechRecognition::WaitForAudioData(SpeechEvent* aEvent)
+{
+ SetState(STATE_STARTING);
+}
+
+void
+SpeechRecognition::StartedAudioCapture(SpeechEvent* aEvent)
+{
+ SetState(STATE_ESTIMATING);
+
+ mEndpointer.SetEnvironmentEstimationMode();
+ mEstimationSamples += ProcessAudioSegment(aEvent->mAudioSegment, aEvent->mTrackRate);
+
+ DispatchTrustedEvent(NS_LITERAL_STRING("audiostart"));
+ if (mCurrentState == STATE_ESTIMATING) {
+ DispatchTrustedEvent(NS_LITERAL_STRING("start"));
+ }
+}
+
+void
+SpeechRecognition::StopRecordingAndRecognize(SpeechEvent* aEvent)
+{
+ SetState(STATE_WAITING_FOR_RESULT);
+
+ MOZ_ASSERT(mRecognitionService, "Service deleted before recording done");
+ mRecognitionService->SoundEnd();
+
+ StopRecording();
+}
+
+void
+SpeechRecognition::WaitForEstimation(SpeechEvent* aEvent)
+{
+ SetState(STATE_ESTIMATING);
+
+ mEstimationSamples += ProcessAudioSegment(aEvent->mAudioSegment, aEvent->mTrackRate);
+ if (mEstimationSamples > kESTIMATION_SAMPLES) {
+ mEndpointer.SetUserInputMode();
+ SetState(STATE_WAITING_FOR_SPEECH);
+ }
+}
+
+void
+SpeechRecognition::DetectSpeech(SpeechEvent* aEvent)
+{
+ SetState(STATE_WAITING_FOR_SPEECH);
+
+ ProcessAudioSegment(aEvent->mAudioSegment, aEvent->mTrackRate);
+ if (mEndpointer.DidStartReceivingSpeech()) {
+ mSpeechDetectionTimer->Cancel();
+ SetState(STATE_RECOGNIZING);
+ DispatchTrustedEvent(NS_LITERAL_STRING("speechstart"));
+ }
+}
+
+void
+SpeechRecognition::WaitForSpeechEnd(SpeechEvent* aEvent)
+{
+ SetState(STATE_RECOGNIZING);
+
+ ProcessAudioSegment(aEvent->mAudioSegment, aEvent->mTrackRate);
+ if (mEndpointer.speech_input_complete()) {
+ DispatchTrustedEvent(NS_LITERAL_STRING("speechend"));
+
+ if (mCurrentState == STATE_RECOGNIZING) {
+ // FIXME: StopRecordingAndRecognize should only be called for single
+ // shot services for continuous we should just inform the service
+ StopRecordingAndRecognize(aEvent);
+ }
+ }
+}
+
+void
+SpeechRecognition::NotifyFinalResult(SpeechEvent* aEvent)
+{
+ ResetAndEnd();
+
+ RootedDictionary<SpeechRecognitionEventInit> init(RootingCx());
+ init.mBubbles = true;
+ init.mCancelable = false;
+ // init.mResultIndex = 0;
+ init.mResults = aEvent->mRecognitionResultList;
+ init.mInterpretation = JS::NullValue();
+ // init.mEmma = nullptr;
+
+ RefPtr<SpeechRecognitionEvent> event =
+ SpeechRecognitionEvent::Constructor(this, NS_LITERAL_STRING("result"), init);
+ event->SetTrusted(true);
+
+ bool defaultActionEnabled;
+ this->DispatchEvent(event, &defaultActionEnabled);
+}
+
+void
+SpeechRecognition::DoNothing(SpeechEvent* aEvent)
+{
+}
+
+void
+SpeechRecognition::AbortSilently(SpeechEvent* aEvent)
+{
+ if (mRecognitionService) {
+ mRecognitionService->Abort();
+ }
+
+ if (mDOMStream) {
+ StopRecording();
+ }
+
+ ResetAndEnd();
+}
+
+void
+SpeechRecognition::AbortError(SpeechEvent* aEvent)
+{
+ AbortSilently(aEvent);
+ NotifyError(aEvent);
+}
+
+void
+SpeechRecognition::NotifyError(SpeechEvent* aEvent)
+{
+ aEvent->mError->SetTrusted(true);
+
+ bool defaultActionEnabled;
+ this->DispatchEvent(aEvent->mError, &defaultActionEnabled);
+
+ return;
+}
+
+/**************************************
+ * Event triggers and other functions *
+ **************************************/
+NS_IMETHODIMP
+SpeechRecognition::StartRecording(DOMMediaStream* aDOMStream)
+{
+ // hold a reference so that the underlying stream
+ // doesn't get Destroy()'ed
+ mDOMStream = aDOMStream;
+
+ if (NS_WARN_IF(!mDOMStream->GetPlaybackStream())) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ mSpeechListener = new SpeechStreamListener(this);
+ mDOMStream->GetPlaybackStream()->AddListener(mSpeechListener);
+
+ mEndpointer.StartSession();
+
+ return mSpeechDetectionTimer->Init(this, kSPEECH_DETECTION_TIMEOUT_MS,
+ nsITimer::TYPE_ONE_SHOT);
+}
+
+NS_IMETHODIMP
+SpeechRecognition::StopRecording()
+{
+ // we only really need to remove the listener explicitly when testing,
+ // as our JS code still holds a reference to mDOMStream and only assigning
+ // it to nullptr isn't guaranteed to free the stream and the listener.
+ mDOMStream->GetPlaybackStream()->RemoveListener(mSpeechListener);
+ mSpeechListener = nullptr;
+ mDOMStream = nullptr;
+
+ mEndpointer.EndSession();
+ DispatchTrustedEvent(NS_LITERAL_STRING("audioend"));
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SpeechRecognition::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(NS_IsMainThread(), "Observer invoked off the main thread");
+
+ if (!strcmp(aTopic, NS_TIMER_CALLBACK_TOPIC) &&
+ StateBetween(STATE_IDLE, STATE_WAITING_FOR_SPEECH)) {
+
+ DispatchError(SpeechRecognition::EVENT_AUDIO_ERROR,
+ SpeechRecognitionErrorCode::No_speech,
+ NS_LITERAL_STRING("No speech detected (timeout)"));
+ } else if (!strcmp(aTopic, SPEECH_RECOGNITION_TEST_END_TOPIC)) {
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->RemoveObserver(this, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC);
+ obs->RemoveObserver(this, SPEECH_RECOGNITION_TEST_END_TOPIC);
+ } else if (MediaPrefs::WebSpeechFakeFSMEvents() &&
+ !strcmp(aTopic, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC)) {
+ ProcessTestEventRequest(aSubject, nsDependentString(aData));
+ }
+
+ return NS_OK;
+}
+
+void
+SpeechRecognition::ProcessTestEventRequest(nsISupports* aSubject, const nsAString& aEventName)
+{
+ if (aEventName.EqualsLiteral("EVENT_ABORT")) {
+ Abort();
+ } else if (aEventName.EqualsLiteral("EVENT_AUDIO_ERROR")) {
+ DispatchError(SpeechRecognition::EVENT_AUDIO_ERROR,
+ SpeechRecognitionErrorCode::Audio_capture, // TODO different codes?
+ NS_LITERAL_STRING("AUDIO_ERROR test event"));
+ } else {
+ NS_ASSERTION(MediaPrefs::WebSpeechFakeRecognitionService(),
+ "Got request for fake recognition service event, but "
+ TEST_PREFERENCE_FAKE_RECOGNITION_SERVICE " is unset");
+
+ // let the fake recognition service handle the request
+ }
+
+ return;
+}
+
+already_AddRefed<SpeechGrammarList>
+SpeechRecognition::Grammars() const
+{
+ RefPtr<SpeechGrammarList> speechGrammarList = mSpeechGrammarList;
+ return speechGrammarList.forget();
+}
+
+void
+SpeechRecognition::SetGrammars(SpeechGrammarList& aArg)
+{
+ mSpeechGrammarList = &aArg;
+}
+
+void
+SpeechRecognition::GetLang(nsString& aRetVal) const
+{
+ aRetVal = mLang;
+}
+
+void
+SpeechRecognition::SetLang(const nsAString& aArg)
+{
+ mLang = aArg;
+}
+
+bool
+SpeechRecognition::GetContinuous(ErrorResult& aRv) const
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return false;
+}
+
+void
+SpeechRecognition::SetContinuous(bool aArg, ErrorResult& aRv)
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return;
+}
+
+bool
+SpeechRecognition::InterimResults() const
+{
+ return mInterimResults;
+}
+
+void
+SpeechRecognition::SetInterimResults(bool aArg)
+{
+ mInterimResults = aArg;
+ return;
+}
+
+uint32_t
+SpeechRecognition::MaxAlternatives() const
+{
+ return mMaxAlternatives;
+}
+
+void
+SpeechRecognition::SetMaxAlternatives(uint32_t aArg)
+{
+ mMaxAlternatives = aArg;
+ return;
+}
+
+void
+SpeechRecognition::GetServiceURI(nsString& aRetVal, ErrorResult& aRv) const
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return;
+}
+
+void
+SpeechRecognition::SetServiceURI(const nsAString& aArg, ErrorResult& aRv)
+{
+ aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
+ return;
+}
+
+void
+SpeechRecognition::Start(const Optional<NonNull<DOMMediaStream>>& aStream, ErrorResult& aRv)
+{
+ if (mCurrentState != STATE_IDLE) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return;
+ }
+
+ if (!SetRecognitionService(aRv)) {
+ return;
+ }
+
+ if (!ValidateAndSetGrammarList(aRv)) {
+ return;
+ }
+
+ nsresult rv;
+ rv = mRecognitionService->Initialize(this);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ MediaStreamConstraints constraints;
+ constraints.mAudio.SetAsBoolean() = true;
+
+ if (aStream.WasPassed()) {
+ StartRecording(&aStream.Value());
+ } else {
+ AutoNoJSAPI();
+ MediaManager* manager = MediaManager::Get();
+ manager->GetUserMedia(GetOwner(),
+ constraints,
+ new GetUserMediaSuccessCallback(this),
+ new GetUserMediaErrorCallback(this));
+ }
+
+ RefPtr<SpeechEvent> event = new SpeechEvent(this, EVENT_START);
+ NS_DispatchToMainThread(event);
+}
+
+bool
+SpeechRecognition::SetRecognitionService(ErrorResult& aRv)
+{
+ // See: https://dvcs.w3.org/hg/speech-api/raw-file/tip/webspeechapi.html#dfn-lang
+ if (!mLang.IsEmpty()) {
+ mRecognitionService = GetSpeechRecognitionService(mLang);
+
+ if (!mRecognitionService) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+
+ return true;
+ }
+
+ nsCOMPtr<nsPIDOMWindowInner> window = GetOwner();
+ if(!window) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+ nsCOMPtr<nsIDocument> document = window->GetExtantDoc();
+ if(!document) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+ nsCOMPtr<Element> element = document->GetRootElement();
+ if(!element) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+
+ nsAutoString lang;
+ element->GetLang(lang);
+ mRecognitionService = GetSpeechRecognitionService(lang);
+
+ if (!mRecognitionService) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+
+ return true;
+}
+
+bool
+SpeechRecognition::ValidateAndSetGrammarList(ErrorResult& aRv)
+{
+ if (!mSpeechGrammarList) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+
+ uint32_t grammarListLength = mSpeechGrammarList->Length();
+ if (0 == grammarListLength) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+
+ for (uint32_t count = 0; count < grammarListLength; ++count) {
+ RefPtr<SpeechGrammar> speechGrammar = mSpeechGrammarList->Item(count, aRv);
+ if (aRv.Failed()) {
+ return false;
+ }
+ if (NS_FAILED(mRecognitionService->ValidateAndSetGrammarList(speechGrammar.get(), nullptr))) {
+ aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void
+SpeechRecognition::Stop()
+{
+ RefPtr<SpeechEvent> event = new SpeechEvent(this, EVENT_STOP);
+ NS_DispatchToMainThread(event);
+}
+
+void
+SpeechRecognition::Abort()
+{
+ if (mAborted) {
+ return;
+ }
+
+ mAborted = true;
+ RefPtr<SpeechEvent> event = new SpeechEvent(this, EVENT_ABORT);
+ NS_DispatchToMainThread(event);
+}
+
+void
+SpeechRecognition::DispatchError(EventType aErrorType,
+ SpeechRecognitionErrorCode aErrorCode,
+ const nsAString& aMessage)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aErrorType == EVENT_RECOGNITIONSERVICE_ERROR ||
+ aErrorType == EVENT_AUDIO_ERROR, "Invalid error type!");
+
+ RefPtr<SpeechRecognitionError> srError =
+ new SpeechRecognitionError(nullptr, nullptr, nullptr);
+
+ srError->InitSpeechRecognitionError(NS_LITERAL_STRING("error"), true, false,
+ aErrorCode, aMessage);
+
+ RefPtr<SpeechEvent> event = new SpeechEvent(this, aErrorType);
+ event->mError = srError;
+ NS_DispatchToMainThread(event);
+}
+
+/*
+ * Buffer audio samples into mAudioSamplesBuffer until aBufferSize.
+ * Updates mBufferedSamples and returns the number of samples that were buffered.
+ */
+uint32_t
+SpeechRecognition::FillSamplesBuffer(const int16_t* aSamples,
+ uint32_t aSampleCount)
+{
+ MOZ_ASSERT(mBufferedSamples < mAudioSamplesPerChunk);
+ MOZ_ASSERT(mAudioSamplesBuffer.get());
+
+ int16_t* samplesBuffer = static_cast<int16_t*>(mAudioSamplesBuffer->Data());
+ size_t samplesToCopy = std::min(aSampleCount,
+ mAudioSamplesPerChunk - mBufferedSamples);
+
+ memcpy(samplesBuffer + mBufferedSamples, aSamples,
+ samplesToCopy * sizeof(int16_t));
+
+ mBufferedSamples += samplesToCopy;
+ return samplesToCopy;
+}
+
+/*
+ * Split a samples buffer starting of a given size into
+ * chunks of equal size. The chunks are stored in the array
+ * received as argument.
+ * Returns the offset of the end of the last chunk that was
+ * created.
+ */
+uint32_t
+SpeechRecognition::SplitSamplesBuffer(const int16_t* aSamplesBuffer,
+ uint32_t aSampleCount,
+ nsTArray<RefPtr<SharedBuffer>>& aResult)
+{
+ uint32_t chunkStart = 0;
+
+ while (chunkStart + mAudioSamplesPerChunk <= aSampleCount) {
+ RefPtr<SharedBuffer> chunk =
+ SharedBuffer::Create(mAudioSamplesPerChunk * sizeof(int16_t));
+
+ memcpy(chunk->Data(), aSamplesBuffer + chunkStart,
+ mAudioSamplesPerChunk * sizeof(int16_t));
+
+ aResult.AppendElement(chunk.forget());
+ chunkStart += mAudioSamplesPerChunk;
+ }
+
+ return chunkStart;
+}
+
+AudioSegment*
+SpeechRecognition::CreateAudioSegment(nsTArray<RefPtr<SharedBuffer>>& aChunks)
+{
+ AudioSegment* segment = new AudioSegment();
+ for (uint32_t i = 0; i < aChunks.Length(); ++i) {
+ RefPtr<SharedBuffer> buffer = aChunks[i];
+ const int16_t* chunkData = static_cast<const int16_t*>(buffer->Data());
+
+ AutoTArray<const int16_t*, 1> channels;
+ channels.AppendElement(chunkData);
+ segment->AppendFrames(buffer.forget(), channels, mAudioSamplesPerChunk,
+ PRINCIPAL_HANDLE_NONE);
+ }
+
+ return segment;
+}
+
+void
+SpeechRecognition::FeedAudioData(already_AddRefed<SharedBuffer> aSamples,
+ uint32_t aDuration,
+ MediaStreamListener* aProvider, TrackRate aTrackRate)
+{
+ NS_ASSERTION(!NS_IsMainThread(),
+ "FeedAudioData should not be called in the main thread");
+
+ // Endpointer expects to receive samples in chunks whose size is a
+ // multiple of its frame size.
+ // Since we can't assume we will receive the frames in appropriate-sized
+ // chunks, we must buffer and split them in chunks of mAudioSamplesPerChunk
+ // (a multiple of Endpointer's frame size) before feeding to Endpointer.
+
+ // ensure aSamples is deleted
+ RefPtr<SharedBuffer> refSamples = aSamples;
+
+ uint32_t samplesIndex = 0;
+ const int16_t* samples = static_cast<int16_t*>(refSamples->Data());
+ AutoTArray<RefPtr<SharedBuffer>, 5> chunksToSend;
+
+ // fill up our buffer and make a chunk out of it, if possible
+ if (mBufferedSamples > 0) {
+ samplesIndex += FillSamplesBuffer(samples, aDuration);
+
+ if (mBufferedSamples == mAudioSamplesPerChunk) {
+ chunksToSend.AppendElement(mAudioSamplesBuffer.forget());
+ mBufferedSamples = 0;
+ }
+ }
+
+ // create sample chunks of correct size
+ if (samplesIndex < aDuration) {
+ samplesIndex += SplitSamplesBuffer(samples + samplesIndex,
+ aDuration - samplesIndex,
+ chunksToSend);
+ }
+
+ // buffer remaining samples
+ if (samplesIndex < aDuration) {
+ mBufferedSamples = 0;
+ mAudioSamplesBuffer =
+ SharedBuffer::Create(mAudioSamplesPerChunk * sizeof(int16_t));
+
+ FillSamplesBuffer(samples + samplesIndex, aDuration - samplesIndex);
+ }
+
+ AudioSegment* segment = CreateAudioSegment(chunksToSend);
+ RefPtr<SpeechEvent> event = new SpeechEvent(this, EVENT_AUDIO_DATA);
+ event->mAudioSegment = segment;
+ event->mProvider = aProvider;
+ event->mTrackRate = aTrackRate;
+ NS_DispatchToMainThread(event);
+
+ return;
+}
+
+const char*
+SpeechRecognition::GetName(FSMState aId)
+{
+ static const char* names[] = {
+ "STATE_IDLE",
+ "STATE_STARTING",
+ "STATE_ESTIMATING",
+ "STATE_WAITING_FOR_SPEECH",
+ "STATE_RECOGNIZING",
+ "STATE_WAITING_FOR_RESULT",
+ };
+
+ MOZ_ASSERT(aId < STATE_COUNT);
+ MOZ_ASSERT(ArrayLength(names) == STATE_COUNT);
+ return names[aId];
+}
+
+const char*
+SpeechRecognition::GetName(SpeechEvent* aEvent)
+{
+ static const char* names[] = {
+ "EVENT_START",
+ "EVENT_STOP",
+ "EVENT_ABORT",
+ "EVENT_AUDIO_DATA",
+ "EVENT_AUDIO_ERROR",
+ "EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT",
+ "EVENT_RECOGNITIONSERVICE_FINAL_RESULT",
+ "EVENT_RECOGNITIONSERVICE_ERROR"
+ };
+
+ MOZ_ASSERT(aEvent->mType < EVENT_COUNT);
+ MOZ_ASSERT(ArrayLength(names) == EVENT_COUNT);
+ return names[aEvent->mType];
+}
+
+SpeechEvent::~SpeechEvent()
+{
+ delete mAudioSegment;
+}
+
+NS_IMETHODIMP
+SpeechEvent::Run()
+{
+ mRecognition->ProcessEvent(this);
+ return NS_OK;
+}
+
+NS_IMPL_ISUPPORTS(SpeechRecognition::GetUserMediaSuccessCallback, nsIDOMGetUserMediaSuccessCallback)
+
+NS_IMETHODIMP
+SpeechRecognition::GetUserMediaSuccessCallback::OnSuccess(nsISupports* aStream)
+{
+ RefPtr<DOMMediaStream> stream = do_QueryObject(aStream);
+ if (!stream) {
+ return NS_ERROR_NO_INTERFACE;
+ }
+ mRecognition->StartRecording(stream);
+ return NS_OK;
+}
+
+NS_IMPL_ISUPPORTS(SpeechRecognition::GetUserMediaErrorCallback, nsIDOMGetUserMediaErrorCallback)
+
+NS_IMETHODIMP
+SpeechRecognition::GetUserMediaErrorCallback::OnError(nsISupports* aError)
+{
+ RefPtr<MediaStreamError> error = do_QueryObject(aError);
+ if (!error) {
+ return NS_OK;
+ }
+ SpeechRecognitionErrorCode errorCode;
+
+ nsAutoString name;
+ error->GetName(name);
+ if (name.EqualsLiteral("PERMISSION_DENIED")) {
+ errorCode = SpeechRecognitionErrorCode::Not_allowed;
+ } else {
+ errorCode = SpeechRecognitionErrorCode::Audio_capture;
+ }
+
+ nsAutoString message;
+ error->GetMessage(message);
+ mRecognition->DispatchError(SpeechRecognition::EVENT_AUDIO_ERROR, errorCode,
+ message);
+ return NS_OK;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechRecognition.h b/dom/media/webspeech/recognition/SpeechRecognition.h
new file mode 100644
index 000000000..3f1ab7977
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognition.h
@@ -0,0 +1,296 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechRecognition_h
+#define mozilla_dom_SpeechRecognition_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "nsCOMPtr.h"
+#include "nsString.h"
+#include "nsWrapperCache.h"
+#include "nsTArray.h"
+#include "js/TypeDecls.h"
+
+#include "nsIDOMNavigatorUserMedia.h"
+#include "nsITimer.h"
+#include "MediaEngine.h"
+#include "MediaStreamGraph.h"
+#include "AudioSegment.h"
+#include "mozilla/WeakPtr.h"
+
+#include "SpeechGrammarList.h"
+#include "SpeechRecognitionResultList.h"
+#include "SpeechStreamListener.h"
+#include "nsISpeechRecognitionService.h"
+#include "endpointer.h"
+
+#include "mozilla/dom/SpeechRecognitionError.h"
+
+namespace mozilla {
+
+namespace dom {
+
+#define SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC "SpeechRecognitionTest:RequestEvent"
+#define SPEECH_RECOGNITION_TEST_END_TOPIC "SpeechRecognitionTest:End"
+
+class GlobalObject;
+class SpeechEvent;
+
+LogModule* GetSpeechRecognitionLog();
+#define SR_LOG(...) MOZ_LOG(GetSpeechRecognitionLog(), mozilla::LogLevel::Debug, (__VA_ARGS__))
+
+class SpeechRecognition final : public DOMEventTargetHelper,
+ public nsIObserver,
+ public SupportsWeakPtr<SpeechRecognition>
+{
+public:
+ MOZ_DECLARE_WEAKREFERENCE_TYPENAME(SpeechRecognition)
+ explicit SpeechRecognition(nsPIDOMWindowInner* aOwnerWindow);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SpeechRecognition, DOMEventTargetHelper)
+
+ NS_DECL_NSIOBSERVER
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static bool IsAuthorized(JSContext* aCx, JSObject* aGlobal);
+
+ static already_AddRefed<SpeechRecognition>
+ Constructor(const GlobalObject& aGlobal, ErrorResult& aRv);
+
+ already_AddRefed<SpeechGrammarList> Grammars() const;
+
+ void SetGrammars(mozilla::dom::SpeechGrammarList& aArg);
+
+ void GetLang(nsString& aRetVal) const;
+
+ void SetLang(const nsAString& aArg);
+
+ bool GetContinuous(ErrorResult& aRv) const;
+
+ void SetContinuous(bool aArg, ErrorResult& aRv);
+
+ bool InterimResults() const;
+
+ void SetInterimResults(bool aArg);
+
+ uint32_t MaxAlternatives() const;
+
+ void SetMaxAlternatives(uint32_t aArg);
+
+ void GetServiceURI(nsString& aRetVal, ErrorResult& aRv) const;
+
+ void SetServiceURI(const nsAString& aArg, ErrorResult& aRv);
+
+ void Start(const Optional<NonNull<DOMMediaStream>>& aStream, ErrorResult& aRv);
+
+ void Stop();
+
+ void Abort();
+
+ IMPL_EVENT_HANDLER(audiostart)
+ IMPL_EVENT_HANDLER(soundstart)
+ IMPL_EVENT_HANDLER(speechstart)
+ IMPL_EVENT_HANDLER(speechend)
+ IMPL_EVENT_HANDLER(soundend)
+ IMPL_EVENT_HANDLER(audioend)
+ IMPL_EVENT_HANDLER(result)
+ IMPL_EVENT_HANDLER(nomatch)
+ IMPL_EVENT_HANDLER(error)
+ IMPL_EVENT_HANDLER(start)
+ IMPL_EVENT_HANDLER(end)
+
+ enum EventType {
+ EVENT_START,
+ EVENT_STOP,
+ EVENT_ABORT,
+ EVENT_AUDIO_DATA,
+ EVENT_AUDIO_ERROR,
+ EVENT_RECOGNITIONSERVICE_INTERMEDIATE_RESULT,
+ EVENT_RECOGNITIONSERVICE_FINAL_RESULT,
+ EVENT_RECOGNITIONSERVICE_ERROR,
+ EVENT_COUNT
+ };
+
+ void DispatchError(EventType aErrorType, SpeechRecognitionErrorCode aErrorCode, const nsAString& aMessage);
+ uint32_t FillSamplesBuffer(const int16_t* aSamples, uint32_t aSampleCount);
+ uint32_t SplitSamplesBuffer(const int16_t* aSamplesBuffer, uint32_t aSampleCount, nsTArray<RefPtr<SharedBuffer>>& aResult);
+ AudioSegment* CreateAudioSegment(nsTArray<RefPtr<SharedBuffer>>& aChunks);
+ void FeedAudioData(already_AddRefed<SharedBuffer> aSamples, uint32_t aDuration, MediaStreamListener* aProvider, TrackRate aTrackRate);
+
+ friend class SpeechEvent;
+private:
+ virtual ~SpeechRecognition() {};
+
+ enum FSMState {
+ STATE_IDLE,
+ STATE_STARTING,
+ STATE_ESTIMATING,
+ STATE_WAITING_FOR_SPEECH,
+ STATE_RECOGNIZING,
+ STATE_WAITING_FOR_RESULT,
+ STATE_COUNT
+ };
+
+ void SetState(FSMState state);
+ bool StateBetween(FSMState begin, FSMState end);
+
+ bool SetRecognitionService(ErrorResult& aRv);
+ bool ValidateAndSetGrammarList(ErrorResult& aRv);
+
+ class GetUserMediaSuccessCallback : public nsIDOMGetUserMediaSuccessCallback
+ {
+ public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIDOMGETUSERMEDIASUCCESSCALLBACK
+
+ explicit GetUserMediaSuccessCallback(SpeechRecognition* aRecognition)
+ : mRecognition(aRecognition)
+ {}
+
+ private:
+ virtual ~GetUserMediaSuccessCallback() {}
+
+ RefPtr<SpeechRecognition> mRecognition;
+ };
+
+ class GetUserMediaErrorCallback : public nsIDOMGetUserMediaErrorCallback
+ {
+ public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIDOMGETUSERMEDIAERRORCALLBACK
+
+ explicit GetUserMediaErrorCallback(SpeechRecognition* aRecognition)
+ : mRecognition(aRecognition)
+ {}
+
+ private:
+ virtual ~GetUserMediaErrorCallback() {}
+
+ RefPtr<SpeechRecognition> mRecognition;
+ };
+
+ NS_IMETHOD StartRecording(DOMMediaStream* aDOMStream);
+ NS_IMETHOD StopRecording();
+
+ uint32_t ProcessAudioSegment(AudioSegment* aSegment, TrackRate aTrackRate);
+ void NotifyError(SpeechEvent* aEvent);
+
+ void ProcessEvent(SpeechEvent* aEvent);
+ void Transition(SpeechEvent* aEvent);
+
+ void Reset();
+ void ResetAndEnd();
+ void WaitForAudioData(SpeechEvent* aEvent);
+ void StartedAudioCapture(SpeechEvent* aEvent);
+ void StopRecordingAndRecognize(SpeechEvent* aEvent);
+ void WaitForEstimation(SpeechEvent* aEvent);
+ void DetectSpeech(SpeechEvent* aEvent);
+ void WaitForSpeechEnd(SpeechEvent* aEvent);
+ void NotifyFinalResult(SpeechEvent* aEvent);
+ void DoNothing(SpeechEvent* aEvent);
+ void AbortSilently(SpeechEvent* aEvent);
+ void AbortError(SpeechEvent* aEvent);
+
+ RefPtr<DOMMediaStream> mDOMStream;
+ RefPtr<SpeechStreamListener> mSpeechListener;
+ nsCOMPtr<nsISpeechRecognitionService> mRecognitionService;
+
+ FSMState mCurrentState;
+
+ Endpointer mEndpointer;
+ uint32_t mEstimationSamples;
+
+ uint32_t mAudioSamplesPerChunk;
+
+ // buffer holds one chunk of mAudioSamplesPerChunk
+ // samples before feeding it to mEndpointer
+ RefPtr<SharedBuffer> mAudioSamplesBuffer;
+ uint32_t mBufferedSamples;
+
+ nsCOMPtr<nsITimer> mSpeechDetectionTimer;
+ bool mAborted;
+
+ nsString mLang;
+
+ RefPtr<SpeechGrammarList> mSpeechGrammarList;
+
+ // WebSpeechAPI (http://bit.ly/1gIl7DC) states:
+ //
+ // 1. Default value MUST be false
+ // 2. If true, interim results SHOULD be returned
+ // 3. If false, interim results MUST NOT be returned
+ //
+ // Pocketsphinx does not return interm results; so, defaulting
+ // mInterimResults to false, then ignoring its subsequent value
+ // is a conforming implementation.
+ bool mInterimResults;
+
+ // WebSpeechAPI (http://bit.ly/1JAiqeo) states:
+ //
+ // 1. Default value is 1
+ // 2. Subsequent value is the "maximum number of SpeechRecognitionAlternatives per result"
+ //
+ // Pocketsphinx can only return at maximum a single SpeechRecognitionAlternative
+ // per SpeechRecognitionResult. So defaulting mMaxAlternatives to 1, for all non
+ // zero values ignoring mMaxAlternatives while for a 0 value returning no
+ // SpeechRecognitionAlternative per result is a conforming implementation.
+ uint32_t mMaxAlternatives;
+
+ void ProcessTestEventRequest(nsISupports* aSubject, const nsAString& aEventName);
+
+ const char* GetName(FSMState aId);
+ const char* GetName(SpeechEvent* aId);
+};
+
+class SpeechEvent : public Runnable
+{
+public:
+ SpeechEvent(SpeechRecognition* aRecognition, SpeechRecognition::EventType aType)
+ : mAudioSegment(0)
+ , mRecognitionResultList(nullptr)
+ , mError(nullptr)
+ , mRecognition(aRecognition)
+ , mType(aType)
+ , mTrackRate(0)
+ {
+ }
+
+ ~SpeechEvent();
+
+ NS_IMETHOD Run() override;
+ AudioSegment* mAudioSegment;
+ RefPtr<SpeechRecognitionResultList> mRecognitionResultList; // TODO: make this a session being passed which also has index and stuff
+ RefPtr<SpeechRecognitionError> mError;
+
+ friend class SpeechRecognition;
+private:
+ SpeechRecognition* mRecognition;
+
+ // for AUDIO_DATA events, keep a reference to the provider
+ // of the data (i.e., the SpeechStreamListener) to ensure it
+ // is kept alive (and keeps SpeechRecognition alive) until this
+ // event gets processed.
+ RefPtr<MediaStreamListener> mProvider;
+ SpeechRecognition::EventType mType;
+ TrackRate mTrackRate;
+};
+
+} // namespace dom
+
+inline nsISupports*
+ToSupports(dom::SpeechRecognition* aRec)
+{
+ return ToSupports(static_cast<DOMEventTargetHelper*>(aRec));
+}
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechRecognitionAlternative.cpp b/dom/media/webspeech/recognition/SpeechRecognitionAlternative.cpp
new file mode 100644
index 000000000..8526e0f00
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognitionAlternative.cpp
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechRecognitionAlternative.h"
+
+#include "mozilla/dom/SpeechRecognitionAlternativeBinding.h"
+
+#include "SpeechRecognition.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SpeechRecognitionAlternative, mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechRecognitionAlternative)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechRecognitionAlternative)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechRecognitionAlternative)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+SpeechRecognitionAlternative::SpeechRecognitionAlternative(SpeechRecognition* aParent)
+ : mConfidence(0)
+ , mParent(aParent)
+{
+}
+
+SpeechRecognitionAlternative::~SpeechRecognitionAlternative()
+{
+}
+
+JSObject*
+SpeechRecognitionAlternative::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechRecognitionAlternativeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports*
+SpeechRecognitionAlternative::GetParentObject() const
+{
+ return static_cast<DOMEventTargetHelper*>(mParent.get());
+}
+
+void
+SpeechRecognitionAlternative::GetTranscript(nsString& aRetVal) const
+{
+ aRetVal = mTranscript;
+}
+
+float
+SpeechRecognitionAlternative::Confidence() const
+{
+ return mConfidence;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechRecognitionAlternative.h b/dom/media/webspeech/recognition/SpeechRecognitionAlternative.h
new file mode 100644
index 000000000..f83eebca7
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognitionAlternative.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechRecognitionAlternative_h
+#define mozilla_dom_SpeechRecognitionAlternative_h
+
+#include "nsCycleCollectionParticipant.h"
+#include "nsString.h"
+#include "nsWrapperCache.h"
+#include "js/TypeDecls.h"
+
+#include "mozilla/Attributes.h"
+
+namespace mozilla {
+namespace dom {
+
+class SpeechRecognition;
+
+class SpeechRecognitionAlternative final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ explicit SpeechRecognitionAlternative(SpeechRecognition* aParent);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(SpeechRecognitionAlternative)
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void GetTranscript(nsString& aRetVal) const;
+
+ float Confidence() const;
+
+ nsString mTranscript;
+ float mConfidence;
+private:
+ ~SpeechRecognitionAlternative();
+
+ RefPtr<SpeechRecognition> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechRecognitionResult.cpp b/dom/media/webspeech/recognition/SpeechRecognitionResult.cpp
new file mode 100644
index 000000000..33ac1b806
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognitionResult.cpp
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechRecognitionResult.h"
+#include "mozilla/dom/SpeechRecognitionResultBinding.h"
+
+#include "SpeechRecognition.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SpeechRecognitionResult, mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechRecognitionResult)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechRecognitionResult)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechRecognitionResult)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+SpeechRecognitionResult::SpeechRecognitionResult(SpeechRecognition* aParent)
+ : mParent(aParent)
+{
+}
+
+SpeechRecognitionResult::~SpeechRecognitionResult()
+{
+}
+
+JSObject*
+SpeechRecognitionResult::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechRecognitionResultBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports*
+SpeechRecognitionResult::GetParentObject() const
+{
+ return static_cast<DOMEventTargetHelper*>(mParent.get());
+}
+
+already_AddRefed<SpeechRecognitionAlternative>
+SpeechRecognitionResult::IndexedGetter(uint32_t aIndex, bool& aPresent)
+{
+ if (aIndex >= Length()) {
+ aPresent = false;
+ return nullptr;
+ }
+
+ aPresent = true;
+ return Item(aIndex);
+}
+
+uint32_t
+SpeechRecognitionResult::Length() const
+{
+ return mItems.Length();
+}
+
+already_AddRefed<SpeechRecognitionAlternative>
+SpeechRecognitionResult::Item(uint32_t aIndex)
+{
+ RefPtr<SpeechRecognitionAlternative> alternative = mItems.ElementAt(aIndex);
+ return alternative.forget();
+}
+
+bool
+SpeechRecognitionResult::IsFinal() const
+{
+ return true; // TODO
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechRecognitionResult.h b/dom/media/webspeech/recognition/SpeechRecognitionResult.h
new file mode 100644
index 000000000..4000a934c
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognitionResult.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechRecognitionResult_h
+#define mozilla_dom_SpeechRecognitionResult_h
+
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "nsTArray.h"
+#include "js/TypeDecls.h"
+
+#include "mozilla/Attributes.h"
+
+#include "SpeechRecognitionAlternative.h"
+
+namespace mozilla {
+namespace dom {
+
+class SpeechRecognitionResult final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ explicit SpeechRecognitionResult(SpeechRecognition* aParent);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(SpeechRecognitionResult)
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint32_t Length() const;
+
+ already_AddRefed<SpeechRecognitionAlternative> Item(uint32_t aIndex);
+
+ bool IsFinal() const;
+
+ already_AddRefed<SpeechRecognitionAlternative> IndexedGetter(uint32_t aIndex, bool& aPresent);
+
+ nsTArray<RefPtr<SpeechRecognitionAlternative>> mItems;
+
+private:
+ ~SpeechRecognitionResult();
+
+ RefPtr<SpeechRecognition> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechRecognitionResultList.cpp b/dom/media/webspeech/recognition/SpeechRecognitionResultList.cpp
new file mode 100644
index 000000000..ba60553fc
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognitionResultList.cpp
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechRecognitionResultList.h"
+
+#include "mozilla/dom/SpeechRecognitionResultListBinding.h"
+
+#include "SpeechRecognition.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SpeechRecognitionResultList, mParent, mItems)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechRecognitionResultList)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechRecognitionResultList)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechRecognitionResultList)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+SpeechRecognitionResultList::SpeechRecognitionResultList(SpeechRecognition* aParent)
+ : mParent(aParent)
+{
+}
+
+SpeechRecognitionResultList::~SpeechRecognitionResultList()
+{
+}
+
+nsISupports*
+SpeechRecognitionResultList::GetParentObject() const
+{
+ return static_cast<DOMEventTargetHelper*>(mParent.get());
+}
+
+JSObject*
+SpeechRecognitionResultList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechRecognitionResultListBinding::Wrap(aCx, this, aGivenProto);
+}
+
+already_AddRefed<SpeechRecognitionResult>
+SpeechRecognitionResultList::IndexedGetter(uint32_t aIndex, bool& aPresent)
+{
+ if (aIndex >= Length()) {
+ aPresent = false;
+ return nullptr;
+ }
+
+ aPresent = true;
+ return Item(aIndex);
+}
+
+uint32_t
+SpeechRecognitionResultList::Length() const
+{
+ return mItems.Length();
+}
+
+already_AddRefed<SpeechRecognitionResult>
+SpeechRecognitionResultList::Item(uint32_t aIndex)
+{
+ RefPtr<SpeechRecognitionResult> result = mItems.ElementAt(aIndex);
+ return result.forget();
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechRecognitionResultList.h b/dom/media/webspeech/recognition/SpeechRecognitionResultList.h
new file mode 100644
index 000000000..6b2e4d266
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechRecognitionResultList.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechRecognitionResultList_h
+#define mozilla_dom_SpeechRecognitionResultList_h
+
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "nsTArray.h"
+#include "js/TypeDecls.h"
+
+#include "mozilla/Attributes.h"
+
+#include "SpeechRecognitionResult.h"
+
+namespace mozilla {
+namespace dom {
+
+class SpeechRecognition;
+
+class SpeechRecognitionResultList final : public nsISupports,
+ public nsWrapperCache
+{
+public:
+ explicit SpeechRecognitionResultList(SpeechRecognition* aParent);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(SpeechRecognitionResultList)
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ uint32_t Length() const;
+
+ already_AddRefed<SpeechRecognitionResult> Item(uint32_t aIndex);
+
+ already_AddRefed<SpeechRecognitionResult> IndexedGetter(uint32_t aIndex, bool& aPresent);
+
+ nsTArray<RefPtr<SpeechRecognitionResult>> mItems;
+private:
+ ~SpeechRecognitionResultList();
+
+ RefPtr<SpeechRecognition> mParent;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/SpeechStreamListener.cpp b/dom/media/webspeech/recognition/SpeechStreamListener.cpp
new file mode 100644
index 000000000..588c3c886
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechStreamListener.cpp
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechStreamListener.h"
+
+#include "SpeechRecognition.h"
+#include "nsProxyRelease.h"
+
+namespace mozilla {
+namespace dom {
+
+SpeechStreamListener::SpeechStreamListener(SpeechRecognition* aRecognition)
+ : mRecognition(aRecognition)
+{
+}
+
+SpeechStreamListener::~SpeechStreamListener()
+{
+ nsCOMPtr<nsIThread> mainThread;
+ NS_GetMainThread(getter_AddRefs(mainThread));
+
+ NS_ProxyRelease(mainThread, mRecognition.forget());
+}
+
+void
+SpeechStreamListener::NotifyQueuedAudioData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ const AudioSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID)
+{
+ AudioSegment* audio = const_cast<AudioSegment*>(
+ static_cast<const AudioSegment*>(&aQueuedMedia));
+
+ AudioSegment::ChunkIterator iterator(*audio);
+ while (!iterator.IsEnded()) {
+ // Skip over-large chunks so we don't crash!
+ if (iterator->GetDuration() > INT_MAX) {
+ continue;
+ }
+ int duration = int(iterator->GetDuration());
+
+ if (iterator->IsNull()) {
+ nsTArray<int16_t> nullData;
+ PodZero(nullData.AppendElements(duration), duration);
+ ConvertAndDispatchAudioChunk(duration, iterator->mVolume,
+ nullData.Elements(), aGraph->GraphRate());
+ } else {
+ AudioSampleFormat format = iterator->mBufferFormat;
+
+ MOZ_ASSERT(format == AUDIO_FORMAT_S16 || format == AUDIO_FORMAT_FLOAT32);
+
+ if (format == AUDIO_FORMAT_S16) {
+ ConvertAndDispatchAudioChunk(duration,iterator->mVolume,
+ static_cast<const int16_t*>(iterator->mChannelData[0]),
+ aGraph->GraphRate());
+ } else if (format == AUDIO_FORMAT_FLOAT32) {
+ ConvertAndDispatchAudioChunk(duration,iterator->mVolume,
+ static_cast<const float*>(iterator->mChannelData[0]),
+ aGraph->GraphRate());
+ }
+ }
+
+ iterator.Next();
+ }
+}
+
+template<typename SampleFormatType> void
+SpeechStreamListener::ConvertAndDispatchAudioChunk(int aDuration, float aVolume,
+ SampleFormatType* aData,
+ TrackRate aTrackRate)
+{
+ RefPtr<SharedBuffer> samples(SharedBuffer::Create(aDuration *
+ 1 * // channel
+ sizeof(int16_t)));
+
+ int16_t* to = static_cast<int16_t*>(samples->Data());
+ ConvertAudioSamplesWithScale(aData, to, aDuration, aVolume);
+
+ mRecognition->FeedAudioData(samples.forget(), aDuration, this, aTrackRate);
+}
+
+void
+SpeechStreamListener::NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event)
+{
+ // TODO dispatch SpeechEnd event so services can be informed
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/SpeechStreamListener.h b/dom/media/webspeech/recognition/SpeechStreamListener.h
new file mode 100644
index 000000000..92699a2d0
--- /dev/null
+++ b/dom/media/webspeech/recognition/SpeechStreamListener.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechStreamListener_h
+#define mozilla_dom_SpeechStreamListener_h
+
+#include "MediaStreamGraph.h"
+#include "MediaStreamListener.h"
+#include "AudioSegment.h"
+
+namespace mozilla {
+
+class AudioSegment;
+
+namespace dom {
+
+class SpeechRecognition;
+
+class SpeechStreamListener : public MediaStreamListener
+{
+public:
+ explicit SpeechStreamListener(SpeechRecognition* aRecognition);
+ ~SpeechStreamListener();
+
+ void NotifyQueuedAudioData(MediaStreamGraph* aGraph, TrackID aID,
+ StreamTime aTrackOffset,
+ const AudioSegment& aQueuedMedia,
+ MediaStream* aInputStream,
+ TrackID aInputTrackID) override;
+
+ void NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event) override;
+
+private:
+ template<typename SampleFormatType>
+ void ConvertAndDispatchAudioChunk(int aDuration, float aVolume, SampleFormatType* aData, TrackRate aTrackRate);
+ RefPtr<SpeechRecognition> mRecognition;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/endpointer.cc b/dom/media/webspeech/recognition/endpointer.cc
new file mode 100644
index 000000000..2347043d4
--- /dev/null
+++ b/dom/media/webspeech/recognition/endpointer.cc
@@ -0,0 +1,193 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "endpointer.h"
+
+#include "AudioSegment.h"
+
+namespace {
+const int kFrameRate = 200; // 1 frame = 5ms of audio.
+}
+
+namespace mozilla {
+
+Endpointer::Endpointer(int sample_rate)
+ : speech_input_possibly_complete_silence_length_us_(-1),
+ speech_input_complete_silence_length_us_(-1),
+ audio_frame_time_us_(0),
+ sample_rate_(sample_rate),
+ frame_size_(0) {
+ Reset();
+
+ frame_size_ = static_cast<int>(sample_rate / static_cast<float>(kFrameRate));
+
+ speech_input_minimum_length_us_ =
+ static_cast<int64_t>(1.7 * 1000000);
+ speech_input_complete_silence_length_us_ =
+ static_cast<int64_t>(0.5 * 1000000);
+ long_speech_input_complete_silence_length_us_ = -1;
+ long_speech_length_us_ = -1;
+ speech_input_possibly_complete_silence_length_us_ =
+ 1 * 1000000;
+
+ // Set the default configuration for Push To Talk mode.
+ EnergyEndpointerParams ep_config;
+ ep_config.set_frame_period(1.0f / static_cast<float>(kFrameRate));
+ ep_config.set_frame_duration(1.0f / static_cast<float>(kFrameRate));
+ ep_config.set_endpoint_margin(0.2f);
+ ep_config.set_onset_window(0.15f);
+ ep_config.set_speech_on_window(0.4f);
+ ep_config.set_offset_window(0.15f);
+ ep_config.set_onset_detect_dur(0.09f);
+ ep_config.set_onset_confirm_dur(0.075f);
+ ep_config.set_on_maintain_dur(0.10f);
+ ep_config.set_offset_confirm_dur(0.12f);
+ ep_config.set_decision_threshold(1000.0f);
+ ep_config.set_min_decision_threshold(50.0f);
+ ep_config.set_fast_update_dur(0.2f);
+ ep_config.set_sample_rate(static_cast<float>(sample_rate));
+ ep_config.set_min_fundamental_frequency(57.143f);
+ ep_config.set_max_fundamental_frequency(400.0f);
+ ep_config.set_contamination_rejection_period(0.25f);
+ energy_endpointer_.Init(ep_config);
+}
+
+void Endpointer::Reset() {
+ old_ep_status_ = EP_PRE_SPEECH;
+ waiting_for_speech_possibly_complete_timeout_ = false;
+ waiting_for_speech_complete_timeout_ = false;
+ speech_previously_detected_ = false;
+ speech_input_complete_ = false;
+ audio_frame_time_us_ = 0; // Reset time for packets sent to endpointer.
+ speech_end_time_us_ = -1;
+ speech_start_time_us_ = -1;
+}
+
+void Endpointer::StartSession() {
+ Reset();
+ energy_endpointer_.StartSession();
+}
+
+void Endpointer::EndSession() {
+ energy_endpointer_.EndSession();
+}
+
+void Endpointer::SetEnvironmentEstimationMode() {
+ Reset();
+ energy_endpointer_.SetEnvironmentEstimationMode();
+}
+
+void Endpointer::SetUserInputMode() {
+ energy_endpointer_.SetUserInputMode();
+}
+
+EpStatus Endpointer::Status(int64_t *time) {
+ return energy_endpointer_.Status(time);
+}
+
+EpStatus Endpointer::ProcessAudio(const AudioChunk& raw_audio, float* rms_out) {
+ MOZ_ASSERT(raw_audio.mBufferFormat == AUDIO_FORMAT_S16, "Audio is not in 16 bit format");
+ const int16_t* audio_data = static_cast<const int16_t*>(raw_audio.mChannelData[0]);
+ const int num_samples = raw_audio.mDuration;
+ EpStatus ep_status = EP_PRE_SPEECH;
+
+ // Process the input data in blocks of frame_size_, dropping any incomplete
+ // frames at the end (which is ok since typically the caller will be recording
+ // audio in multiples of our frame size).
+ int sample_index = 0;
+ while (sample_index + frame_size_ <= num_samples) {
+ // Have the endpointer process the frame.
+ energy_endpointer_.ProcessAudioFrame(audio_frame_time_us_,
+ audio_data + sample_index,
+ frame_size_,
+ rms_out);
+ sample_index += frame_size_;
+ audio_frame_time_us_ += (frame_size_ * 1000000) /
+ sample_rate_;
+
+ // Get the status of the endpointer.
+ int64_t ep_time;
+ ep_status = energy_endpointer_.Status(&ep_time);
+ if (old_ep_status_ != ep_status)
+ fprintf(stderr, "Status changed old= %d, new= %d\n", old_ep_status_, ep_status);
+
+ // Handle state changes.
+ if ((EP_SPEECH_PRESENT == ep_status) &&
+ (EP_POSSIBLE_ONSET == old_ep_status_)) {
+ speech_end_time_us_ = -1;
+ waiting_for_speech_possibly_complete_timeout_ = false;
+ waiting_for_speech_complete_timeout_ = false;
+ // Trigger SpeechInputDidStart event on first detection.
+ if (false == speech_previously_detected_) {
+ speech_previously_detected_ = true;
+ speech_start_time_us_ = ep_time;
+ }
+ }
+ if ((EP_PRE_SPEECH == ep_status) &&
+ (EP_POSSIBLE_OFFSET == old_ep_status_)) {
+ speech_end_time_us_ = ep_time;
+ waiting_for_speech_possibly_complete_timeout_ = true;
+ waiting_for_speech_complete_timeout_ = true;
+ }
+ if (ep_time > speech_input_minimum_length_us_) {
+ // Speech possibly complete timeout.
+ if ((waiting_for_speech_possibly_complete_timeout_) &&
+ (ep_time - speech_end_time_us_ >
+ speech_input_possibly_complete_silence_length_us_)) {
+ waiting_for_speech_possibly_complete_timeout_ = false;
+ }
+ if (waiting_for_speech_complete_timeout_) {
+ // The length of the silence timeout period can be held constant, or it
+ // can be changed after a fixed amount of time from the beginning of
+ // speech.
+ bool has_stepped_silence =
+ (long_speech_length_us_ > 0) &&
+ (long_speech_input_complete_silence_length_us_ > 0);
+ int64_t requested_silence_length;
+ if (has_stepped_silence &&
+ (ep_time - speech_start_time_us_) > long_speech_length_us_) {
+ requested_silence_length =
+ long_speech_input_complete_silence_length_us_;
+ } else {
+ requested_silence_length =
+ speech_input_complete_silence_length_us_;
+ }
+
+ // Speech complete timeout.
+ if ((ep_time - speech_end_time_us_) > requested_silence_length) {
+ waiting_for_speech_complete_timeout_ = false;
+ speech_input_complete_ = true;
+ }
+ }
+ }
+ old_ep_status_ = ep_status;
+ }
+ return ep_status;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/endpointer.h b/dom/media/webspeech/recognition/endpointer.h
new file mode 100644
index 000000000..7879d6b9f
--- /dev/null
+++ b/dom/media/webspeech/recognition/endpointer.h
@@ -0,0 +1,180 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CONTENT_BROWSER_SPEECH_ENDPOINTER_ENDPOINTER_H_
+#define CONTENT_BROWSER_SPEECH_ENDPOINTER_ENDPOINTER_H_
+
+#include "energy_endpointer.h"
+
+namespace mozilla {
+
+struct AudioChunk;
+
+// A simple interface to the underlying energy-endpointer implementation, this
+// class lets callers provide audio as being recorded and let them poll to find
+// when the user has stopped speaking.
+//
+// There are two events that may trigger the end of speech:
+//
+// speechInputPossiblyComplete event:
+//
+// Signals that silence/noise has been detected for a *short* amount of
+// time after some speech has been detected. It can be used for low latency
+// UI feedback. To disable it, set it to a large amount.
+//
+// speechInputComplete event:
+//
+// This event is intended to signal end of input and to stop recording.
+// The amount of time to wait after speech is set by
+// speech_input_complete_silence_length_ and optionally two other
+// parameters (see below).
+// This time can be held constant, or can change as more speech is detected.
+// In the latter case, the time changes after a set amount of time from the
+// *beginning* of speech. This is motivated by the expectation that there
+// will be two distinct types of inputs: short search queries and longer
+// dictation style input.
+//
+// Three parameters are used to define the piecewise constant timeout function.
+// The timeout length is speech_input_complete_silence_length until
+// long_speech_length, when it changes to
+// long_speech_input_complete_silence_length.
+class Endpointer {
+ public:
+ explicit Endpointer(int sample_rate);
+
+ // Start the endpointer. This should be called at the beginning of a session.
+ void StartSession();
+
+ // Stop the endpointer.
+ void EndSession();
+
+ // Start environment estimation. Audio will be used for environment estimation
+ // i.e. noise level estimation.
+ void SetEnvironmentEstimationMode();
+
+ // Start user input. This should be called when the user indicates start of
+ // input, e.g. by pressing a button.
+ void SetUserInputMode();
+
+ // Process a segment of audio, which may be more than one frame.
+ // The status of the last frame will be returned.
+ EpStatus ProcessAudio(const AudioChunk& raw_audio, float* rms_out);
+
+ // Get the status of the endpointer.
+ EpStatus Status(int64_t *time_us);
+
+ // Get the expected frame size for audio chunks. Audio chunks are expected
+ // to contain a number of samples that is a multiple of this number, and extra
+ // samples will be dropped.
+ int32_t FrameSize() const {
+ return frame_size_;
+ }
+
+ // Returns true if the endpointer detected reasonable audio levels above
+ // background noise which could be user speech, false if not.
+ bool DidStartReceivingSpeech() const {
+ return speech_previously_detected_;
+ }
+
+ bool IsEstimatingEnvironment() const {
+ return energy_endpointer_.estimating_environment();
+ }
+
+ void set_speech_input_complete_silence_length(int64_t time_us) {
+ speech_input_complete_silence_length_us_ = time_us;
+ }
+
+ void set_long_speech_input_complete_silence_length(int64_t time_us) {
+ long_speech_input_complete_silence_length_us_ = time_us;
+ }
+
+ void set_speech_input_possibly_complete_silence_length(int64_t time_us) {
+ speech_input_possibly_complete_silence_length_us_ = time_us;
+ }
+
+ void set_long_speech_length(int64_t time_us) {
+ long_speech_length_us_ = time_us;
+ }
+
+ bool speech_input_complete() const {
+ return speech_input_complete_;
+ }
+
+ // RMS background noise level in dB.
+ float NoiseLevelDb() const { return energy_endpointer_.GetNoiseLevelDb(); }
+
+ private:
+ // Reset internal states. Helper method common to initial input utterance
+ // and following input utternaces.
+ void Reset();
+
+ // Minimum allowable length of speech input.
+ int64_t speech_input_minimum_length_us_;
+
+ // The speechInputPossiblyComplete event signals that silence/noise has been
+ // detected for a *short* amount of time after some speech has been detected.
+ // This proporty specifies the time period.
+ int64_t speech_input_possibly_complete_silence_length_us_;
+
+ // The speechInputComplete event signals that silence/noise has been
+ // detected for a *long* amount of time after some speech has been detected.
+ // This property specifies the time period.
+ int64_t speech_input_complete_silence_length_us_;
+
+ // Same as above, this specifies the required silence period after speech
+ // detection. This period is used instead of
+ // speech_input_complete_silence_length_ when the utterance is longer than
+ // long_speech_length_. This parameter is optional.
+ int64_t long_speech_input_complete_silence_length_us_;
+
+ // The period of time after which the endpointer should consider
+ // long_speech_input_complete_silence_length_ as a valid silence period
+ // instead of speech_input_complete_silence_length_. This parameter is
+ // optional.
+ int64_t long_speech_length_us_;
+
+ // First speech onset time, used in determination of speech complete timeout.
+ int64_t speech_start_time_us_;
+
+ // Most recent end time, used in determination of speech complete timeout.
+ int64_t speech_end_time_us_;
+
+ int64_t audio_frame_time_us_;
+ EpStatus old_ep_status_;
+ bool waiting_for_speech_possibly_complete_timeout_;
+ bool waiting_for_speech_complete_timeout_;
+ bool speech_previously_detected_;
+ bool speech_input_complete_;
+ EnergyEndpointer energy_endpointer_;
+ int sample_rate_;
+ int32_t frame_size_;
+};
+
+} // namespace mozilla
+
+#endif // CONTENT_BROWSER_SPEECH_ENDPOINTER_ENDPOINTER_H_
diff --git a/dom/media/webspeech/recognition/energy_endpointer.cc b/dom/media/webspeech/recognition/energy_endpointer.cc
new file mode 100644
index 000000000..9b1a81589
--- /dev/null
+++ b/dom/media/webspeech/recognition/energy_endpointer.cc
@@ -0,0 +1,393 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "energy_endpointer.h"
+
+#include <math.h>
+
+namespace {
+
+// Returns the RMS (quadratic mean) of the input signal.
+float RMS(const int16_t* samples, int num_samples) {
+ int64_t ssq_int64_t = 0;
+ int64_t sum_int64_t = 0;
+ for (int i = 0; i < num_samples; ++i) {
+ sum_int64_t += samples[i];
+ ssq_int64_t += samples[i] * samples[i];
+ }
+ // now convert to floats.
+ double sum = static_cast<double>(sum_int64_t);
+ sum /= num_samples;
+ double ssq = static_cast<double>(ssq_int64_t);
+ return static_cast<float>(sqrt((ssq / num_samples) - (sum * sum)));
+}
+
+int64_t Secs2Usecs(float seconds) {
+ return static_cast<int64_t>(0.5 + (1.0e6 * seconds));
+}
+
+float GetDecibel(float value) {
+ if (value > 1.0e-100)
+ return 20 * log10(value);
+ return -2000.0;
+}
+
+} // namespace
+
+namespace mozilla {
+
+// Stores threshold-crossing histories for making decisions about the speech
+// state.
+class EnergyEndpointer::HistoryRing {
+ public:
+ HistoryRing() : insertion_index_(0) {}
+
+ // Resets the ring to |size| elements each with state |initial_state|
+ void SetRing(int size, bool initial_state);
+
+ // Inserts a new entry into the ring and drops the oldest entry.
+ void Insert(int64_t time_us, bool decision);
+
+ // Returns the time in microseconds of the most recently added entry.
+ int64_t EndTime() const;
+
+ // Returns the sum of all intervals during which 'decision' is true within
+ // the time in seconds specified by 'duration'. The returned interval is
+ // in seconds.
+ float RingSum(float duration_sec);
+
+ private:
+ struct DecisionPoint {
+ int64_t time_us;
+ bool decision;
+ };
+
+ std::vector<DecisionPoint> decision_points_;
+ int insertion_index_; // Index at which the next item gets added/inserted.
+
+ HistoryRing(const HistoryRing&);
+ void operator=(const HistoryRing&);
+};
+
+void EnergyEndpointer::HistoryRing::SetRing(int size, bool initial_state) {
+ insertion_index_ = 0;
+ decision_points_.clear();
+ DecisionPoint init = { -1, initial_state };
+ decision_points_.resize(size, init);
+}
+
+void EnergyEndpointer::HistoryRing::Insert(int64_t time_us, bool decision) {
+ decision_points_[insertion_index_].time_us = time_us;
+ decision_points_[insertion_index_].decision = decision;
+ insertion_index_ = (insertion_index_ + 1) % decision_points_.size();
+}
+
+int64_t EnergyEndpointer::HistoryRing::EndTime() const {
+ int ind = insertion_index_ - 1;
+ if (ind < 0)
+ ind = decision_points_.size() - 1;
+ return decision_points_[ind].time_us;
+}
+
+float EnergyEndpointer::HistoryRing::RingSum(float duration_sec) {
+ if (!decision_points_.size())
+ return 0.0;
+
+ int64_t sum_us = 0;
+ int ind = insertion_index_ - 1;
+ if (ind < 0)
+ ind = decision_points_.size() - 1;
+ int64_t end_us = decision_points_[ind].time_us;
+ bool is_on = decision_points_[ind].decision;
+ int64_t start_us = end_us - static_cast<int64_t>(0.5 + (1.0e6 * duration_sec));
+ if (start_us < 0)
+ start_us = 0;
+ size_t n_summed = 1; // n points ==> (n-1) intervals
+ while ((decision_points_[ind].time_us > start_us) &&
+ (n_summed < decision_points_.size())) {
+ --ind;
+ if (ind < 0)
+ ind = decision_points_.size() - 1;
+ if (is_on)
+ sum_us += end_us - decision_points_[ind].time_us;
+ is_on = decision_points_[ind].decision;
+ end_us = decision_points_[ind].time_us;
+ n_summed++;
+ }
+
+ return 1.0e-6f * sum_us; // Returns total time that was super threshold.
+}
+
+EnergyEndpointer::EnergyEndpointer()
+ : status_(EP_PRE_SPEECH),
+ offset_confirm_dur_sec_(0),
+ endpointer_time_us_(0),
+ fast_update_frames_(0),
+ frame_counter_(0),
+ max_window_dur_(4.0),
+ sample_rate_(0),
+ history_(new HistoryRing()),
+ decision_threshold_(0),
+ estimating_environment_(false),
+ noise_level_(0),
+ rms_adapt_(0),
+ start_lag_(0),
+ end_lag_(0),
+ user_input_start_time_us_(0) {
+}
+
+EnergyEndpointer::~EnergyEndpointer() {
+}
+
+int EnergyEndpointer::TimeToFrame(float time) const {
+ return static_cast<int32_t>(0.5 + (time / params_.frame_period()));
+}
+
+void EnergyEndpointer::Restart(bool reset_threshold) {
+ status_ = EP_PRE_SPEECH;
+ user_input_start_time_us_ = 0;
+
+ if (reset_threshold) {
+ decision_threshold_ = params_.decision_threshold();
+ rms_adapt_ = decision_threshold_;
+ noise_level_ = params_.decision_threshold() / 2.0f;
+ frame_counter_ = 0; // Used for rapid initial update of levels.
+ }
+
+ // Set up the memories to hold the history windows.
+ history_->SetRing(TimeToFrame(max_window_dur_), false);
+
+ // Flag that indicates that current input should be used for
+ // estimating the environment. The user has not yet started input
+ // by e.g. pressed the push-to-talk button. By default, this is
+ // false for backward compatibility.
+ estimating_environment_ = false;
+}
+
+void EnergyEndpointer::Init(const EnergyEndpointerParams& params) {
+ params_ = params;
+
+ // Find the longest history interval to be used, and make the ring
+ // large enough to accommodate that number of frames. NOTE: This
+ // depends upon ep_frame_period being set correctly in the factory
+ // that did this instantiation.
+ max_window_dur_ = params_.onset_window();
+ if (params_.speech_on_window() > max_window_dur_)
+ max_window_dur_ = params_.speech_on_window();
+ if (params_.offset_window() > max_window_dur_)
+ max_window_dur_ = params_.offset_window();
+ Restart(true);
+
+ offset_confirm_dur_sec_ = params_.offset_window() -
+ params_.offset_confirm_dur();
+ if (offset_confirm_dur_sec_ < 0.0)
+ offset_confirm_dur_sec_ = 0.0;
+
+ user_input_start_time_us_ = 0;
+
+ // Flag that indicates that current input should be used for
+ // estimating the environment. The user has not yet started input
+ // by e.g. pressed the push-to-talk button. By default, this is
+ // false for backward compatibility.
+ estimating_environment_ = false;
+ // The initial value of the noise and speech levels is inconsequential.
+ // The level of the first frame will overwrite these values.
+ noise_level_ = params_.decision_threshold() / 2.0f;
+ fast_update_frames_ =
+ static_cast<int64_t>(params_.fast_update_dur() / params_.frame_period());
+
+ frame_counter_ = 0; // Used for rapid initial update of levels.
+
+ sample_rate_ = params_.sample_rate();
+ start_lag_ = static_cast<int>(sample_rate_ /
+ params_.max_fundamental_frequency());
+ end_lag_ = static_cast<int>(sample_rate_ /
+ params_.min_fundamental_frequency());
+}
+
+void EnergyEndpointer::StartSession() {
+ Restart(true);
+}
+
+void EnergyEndpointer::EndSession() {
+ status_ = EP_POST_SPEECH;
+}
+
+void EnergyEndpointer::SetEnvironmentEstimationMode() {
+ Restart(true);
+ estimating_environment_ = true;
+}
+
+void EnergyEndpointer::SetUserInputMode() {
+ estimating_environment_ = false;
+ user_input_start_time_us_ = endpointer_time_us_;
+}
+
+void EnergyEndpointer::ProcessAudioFrame(int64_t time_us,
+ const int16_t* samples,
+ int num_samples,
+ float* rms_out) {
+ endpointer_time_us_ = time_us;
+ float rms = RMS(samples, num_samples);
+
+ // Check that this is user input audio vs. pre-input adaptation audio.
+ // Input audio starts when the user indicates start of input, by e.g.
+ // pressing push-to-talk. Audio recieved prior to that is used to update
+ // noise and speech level estimates.
+ if (!estimating_environment_) {
+ bool decision = false;
+ if ((endpointer_time_us_ - user_input_start_time_us_) <
+ Secs2Usecs(params_.contamination_rejection_period())) {
+ decision = false;
+ //PR_LOG(GetSpeechRecognitionLog(), PR_LOG_DEBUG, ("decision: forced to false, time: %d", endpointer_time_us_));
+ } else {
+ decision = (rms > decision_threshold_);
+ }
+
+ history_->Insert(endpointer_time_us_, decision);
+
+ switch (status_) {
+ case EP_PRE_SPEECH:
+ if (history_->RingSum(params_.onset_window()) >
+ params_.onset_detect_dur()) {
+ status_ = EP_POSSIBLE_ONSET;
+ }
+ break;
+
+ case EP_POSSIBLE_ONSET: {
+ float tsum = history_->RingSum(params_.onset_window());
+ if (tsum > params_.onset_confirm_dur()) {
+ status_ = EP_SPEECH_PRESENT;
+ } else { // If signal is not maintained, drop back to pre-speech.
+ if (tsum <= params_.onset_detect_dur())
+ status_ = EP_PRE_SPEECH;
+ }
+ break;
+ }
+
+ case EP_SPEECH_PRESENT: {
+ // To induce hysteresis in the state residency, we allow a
+ // smaller residency time in the on_ring, than was required to
+ // enter the SPEECH_PERSENT state.
+ float on_time = history_->RingSum(params_.speech_on_window());
+ if (on_time < params_.on_maintain_dur())
+ status_ = EP_POSSIBLE_OFFSET;
+ break;
+ }
+
+ case EP_POSSIBLE_OFFSET:
+ if (history_->RingSum(params_.offset_window()) <=
+ offset_confirm_dur_sec_) {
+ // Note that this offset time may be beyond the end
+ // of the input buffer in a real-time system. It will be up
+ // to the RecognizerSession to decide what to do.
+ status_ = EP_PRE_SPEECH; // Automatically reset for next utterance.
+ } else { // If speech picks up again we allow return to SPEECH_PRESENT.
+ if (history_->RingSum(params_.speech_on_window()) >=
+ params_.on_maintain_dur())
+ status_ = EP_SPEECH_PRESENT;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // If this is a quiet, non-speech region, slowly adapt the detection
+ // threshold to be about 6dB above the average RMS.
+ if ((!decision) && (status_ == EP_PRE_SPEECH)) {
+ decision_threshold_ = (0.98f * decision_threshold_) + (0.02f * 2 * rms);
+ rms_adapt_ = decision_threshold_;
+ } else {
+ // If this is in a speech region, adapt the decision threshold to
+ // be about 10dB below the average RMS. If the noise level is high,
+ // the threshold is pushed up.
+ // Adaptation up to a higher level is 5 times faster than decay to
+ // a lower level.
+ if ((status_ == EP_SPEECH_PRESENT) && decision) {
+ if (rms_adapt_ > rms) {
+ rms_adapt_ = (0.99f * rms_adapt_) + (0.01f * rms);
+ } else {
+ rms_adapt_ = (0.95f * rms_adapt_) + (0.05f * rms);
+ }
+ float target_threshold = 0.3f * rms_adapt_ + noise_level_;
+ decision_threshold_ = (.90f * decision_threshold_) +
+ (0.10f * target_threshold);
+ }
+ }
+
+ // Set a floor
+ if (decision_threshold_ < params_.min_decision_threshold())
+ decision_threshold_ = params_.min_decision_threshold();
+ }
+
+ // Update speech and noise levels.
+ UpdateLevels(rms);
+ ++frame_counter_;
+
+ if (rms_out)
+ *rms_out = GetDecibel(rms);
+}
+
+float EnergyEndpointer::GetNoiseLevelDb() const {
+ return GetDecibel(noise_level_);
+}
+
+void EnergyEndpointer::UpdateLevels(float rms) {
+ // Update quickly initially. We assume this is noise and that
+ // speech is 6dB above the noise.
+ if (frame_counter_ < fast_update_frames_) {
+ // Alpha increases from 0 to (k-1)/k where k is the number of time
+ // steps in the initial adaptation period.
+ float alpha = static_cast<float>(frame_counter_) /
+ static_cast<float>(fast_update_frames_);
+ noise_level_ = (alpha * noise_level_) + ((1 - alpha) * rms);
+ //PR_LOG(GetSpeechRecognitionLog(), PR_LOG_DEBUG, ("FAST UPDATE, frame_counter_ %d, fast_update_frames_ %d", frame_counter_, fast_update_frames_));
+ } else {
+ // Update Noise level. The noise level adapts quickly downward, but
+ // slowly upward. The noise_level_ parameter is not currently used
+ // for threshold adaptation. It is used for UI feedback.
+ if (noise_level_ < rms)
+ noise_level_ = (0.999f * noise_level_) + (0.001f * rms);
+ else
+ noise_level_ = (0.95f * noise_level_) + (0.05f * rms);
+ }
+ if (estimating_environment_ || (frame_counter_ < fast_update_frames_)) {
+ decision_threshold_ = noise_level_ * 2; // 6dB above noise level.
+ // Set a floor
+ if (decision_threshold_ < params_.min_decision_threshold())
+ decision_threshold_ = params_.min_decision_threshold();
+ }
+}
+
+EpStatus EnergyEndpointer::Status(int64_t* status_time) const {
+ *status_time = history_->EndTime();
+ return status_;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/energy_endpointer.h b/dom/media/webspeech/recognition/energy_endpointer.h
new file mode 100644
index 000000000..2380ecf4b
--- /dev/null
+++ b/dom/media/webspeech/recognition/energy_endpointer.h
@@ -0,0 +1,180 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The EnergyEndpointer class finds likely speech onset and offset points.
+//
+// The implementation described here is about the simplest possible.
+// It is based on timings of threshold crossings for overall signal
+// RMS. It is suitable for light weight applications.
+//
+// As written, the basic idea is that one specifies intervals that
+// must be occupied by super- and sub-threshold energy levels, and
+// defers decisions re onset and offset times until these
+// specifications have been met. Three basic intervals are tested: an
+// onset window, a speech-on window, and an offset window. We require
+// super-threshold to exceed some mimimum total durations in the onset
+// and speech-on windows before declaring the speech onset time, and
+// we specify a required sub-threshold residency in the offset window
+// before declaring speech offset. As the various residency requirements are
+// met, the EnergyEndpointer instance assumes various states, and can return the
+// ID of these states to the client (see EpStatus below).
+//
+// The levels of the speech and background noise are continuously updated. It is
+// important that the background noise level be estimated initially for
+// robustness in noisy conditions. The first frames are assumed to be background
+// noise and a fast update rate is used for the noise level. The duration for
+// fast update is controlled by the fast_update_dur_ paramter.
+//
+// If used in noisy conditions, the endpointer should be started and run in the
+// EnvironmentEstimation mode, for at least 200ms, before switching to
+// UserInputMode.
+// Audio feedback contamination can appear in the input audio, if not cut
+// out or handled by echo cancellation. Audio feedback can trigger a false
+// accept. The false accepts can be ignored by setting
+// ep_contamination_rejection_period.
+
+#ifndef CONTENT_BROWSER_SPEECH_ENDPOINTER_ENERGY_ENDPOINTER_H_
+#define CONTENT_BROWSER_SPEECH_ENDPOINTER_ENERGY_ENDPOINTER_H_
+
+#include <vector>
+
+#include "nsAutoPtr.h"
+
+#include "energy_endpointer_params.h"
+
+namespace mozilla {
+
+// Endpointer status codes
+enum EpStatus {
+ EP_PRE_SPEECH = 10,
+ EP_POSSIBLE_ONSET,
+ EP_SPEECH_PRESENT,
+ EP_POSSIBLE_OFFSET,
+ EP_POST_SPEECH,
+};
+
+class EnergyEndpointer {
+ public:
+ // The default construction MUST be followed by Init(), before any
+ // other use can be made of the instance.
+ EnergyEndpointer();
+ virtual ~EnergyEndpointer();
+
+ void Init(const EnergyEndpointerParams& params);
+
+ // Start the endpointer. This should be called at the beginning of a session.
+ void StartSession();
+
+ // Stop the endpointer.
+ void EndSession();
+
+ // Start environment estimation. Audio will be used for environment estimation
+ // i.e. noise level estimation.
+ void SetEnvironmentEstimationMode();
+
+ // Start user input. This should be called when the user indicates start of
+ // input, e.g. by pressing a button.
+ void SetUserInputMode();
+
+ // Computes the next input frame and modifies EnergyEndpointer status as
+ // appropriate based on the computation.
+ void ProcessAudioFrame(int64_t time_us,
+ const int16_t* samples, int num_samples,
+ float* rms_out);
+
+ // Returns the current state of the EnergyEndpointer and the time
+ // corresponding to the most recently computed frame.
+ EpStatus Status(int64_t* status_time_us) const;
+
+ bool estimating_environment() const {
+ return estimating_environment_;
+ }
+
+ // Returns estimated noise level in dB.
+ float GetNoiseLevelDb() const;
+
+ private:
+ class HistoryRing;
+
+ // Resets the endpointer internal state. If reset_threshold is true, the
+ // state will be reset completely, including adaptive thresholds and the
+ // removal of all history information.
+ void Restart(bool reset_threshold);
+
+ // Update internal speech and noise levels.
+ void UpdateLevels(float rms);
+
+ // Returns the number of frames (or frame number) corresponding to
+ // the 'time' (in seconds).
+ int TimeToFrame(float time) const;
+
+ EpStatus status_; // The current state of this instance.
+ float offset_confirm_dur_sec_; // max on time allowed to confirm POST_SPEECH
+ int64_t endpointer_time_us_; // Time of the most recently received audio frame.
+ int64_t fast_update_frames_; // Number of frames for initial level adaptation.
+ int64_t frame_counter_; // Number of frames seen. Used for initial adaptation.
+ float max_window_dur_; // Largest search window size (seconds)
+ float sample_rate_; // Sampling rate.
+
+ // Ring buffers to hold the speech activity history.
+ nsAutoPtr<HistoryRing> history_;
+
+ // Configuration parameters.
+ EnergyEndpointerParams params_;
+
+ // RMS which must be exceeded to conclude frame is speech.
+ float decision_threshold_;
+
+ // Flag to indicate that audio should be used to estimate environment, prior
+ // to receiving user input.
+ bool estimating_environment_;
+
+ // Estimate of the background noise level. Used externally for UI feedback.
+ float noise_level_;
+
+ // An adaptive threshold used to update decision_threshold_ when appropriate.
+ float rms_adapt_;
+
+ // Start lag corresponds to the highest fundamental frequency.
+ int start_lag_;
+
+ // End lag corresponds to the lowest fundamental frequency.
+ int end_lag_;
+
+ // Time when mode switched from environment estimation to user input. This
+ // is used to time forced rejection of audio feedback contamination.
+ int64_t user_input_start_time_us_;
+
+ // prevent copy constructor and assignment
+ EnergyEndpointer(const EnergyEndpointer&);
+ void operator=(const EnergyEndpointer&);
+};
+
+} // namespace mozilla
+
+#endif // CONTENT_BROWSER_SPEECH_ENDPOINTER_ENERGY_ENDPOINTER_H_
diff --git a/dom/media/webspeech/recognition/energy_endpointer_params.cc b/dom/media/webspeech/recognition/energy_endpointer_params.cc
new file mode 100644
index 000000000..cac4f1b23
--- /dev/null
+++ b/dom/media/webspeech/recognition/energy_endpointer_params.cc
@@ -0,0 +1,77 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "energy_endpointer_params.h"
+
+namespace mozilla {
+
+EnergyEndpointerParams::EnergyEndpointerParams() {
+ SetDefaults();
+}
+
+void EnergyEndpointerParams::SetDefaults() {
+ frame_period_ = 0.01f;
+ frame_duration_ = 0.01f;
+ endpoint_margin_ = 0.2f;
+ onset_window_ = 0.15f;
+ speech_on_window_ = 0.4f;
+ offset_window_ = 0.15f;
+ onset_detect_dur_ = 0.09f;
+ onset_confirm_dur_ = 0.075f;
+ on_maintain_dur_ = 0.10f;
+ offset_confirm_dur_ = 0.12f;
+ decision_threshold_ = 150.0f;
+ min_decision_threshold_ = 50.0f;
+ fast_update_dur_ = 0.2f;
+ sample_rate_ = 8000.0f;
+ min_fundamental_frequency_ = 57.143f;
+ max_fundamental_frequency_ = 400.0f;
+ contamination_rejection_period_ = 0.25f;
+}
+
+void EnergyEndpointerParams::operator=(const EnergyEndpointerParams& source) {
+ frame_period_ = source.frame_period();
+ frame_duration_ = source.frame_duration();
+ endpoint_margin_ = source.endpoint_margin();
+ onset_window_ = source.onset_window();
+ speech_on_window_ = source.speech_on_window();
+ offset_window_ = source.offset_window();
+ onset_detect_dur_ = source.onset_detect_dur();
+ onset_confirm_dur_ = source.onset_confirm_dur();
+ on_maintain_dur_ = source.on_maintain_dur();
+ offset_confirm_dur_ = source.offset_confirm_dur();
+ decision_threshold_ = source.decision_threshold();
+ min_decision_threshold_ = source.min_decision_threshold();
+ fast_update_dur_ = source.fast_update_dur();
+ sample_rate_ = source.sample_rate();
+ min_fundamental_frequency_ = source.min_fundamental_frequency();
+ max_fundamental_frequency_ = source.max_fundamental_frequency();
+ contamination_rejection_period_ = source.contamination_rejection_period();
+}
+
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/energy_endpointer_params.h b/dom/media/webspeech/recognition/energy_endpointer_params.h
new file mode 100644
index 000000000..6437c6dc0
--- /dev/null
+++ b/dom/media/webspeech/recognition/energy_endpointer_params.h
@@ -0,0 +1,159 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CONTENT_BROWSER_SPEECH_ENDPOINTER_ENERGY_ENDPOINTER_PARAMS_H_
+#define CONTENT_BROWSER_SPEECH_ENDPOINTER_ENERGY_ENDPOINTER_PARAMS_H_
+
+namespace mozilla {
+
+// Input parameters for the EnergyEndpointer class.
+class EnergyEndpointerParams {
+ public:
+ EnergyEndpointerParams();
+
+ void SetDefaults();
+
+ void operator=(const EnergyEndpointerParams& source);
+
+ // Accessors and mutators
+ float frame_period() const { return frame_period_; }
+ void set_frame_period(float frame_period) {
+ frame_period_ = frame_period;
+ }
+
+ float frame_duration() const { return frame_duration_; }
+ void set_frame_duration(float frame_duration) {
+ frame_duration_ = frame_duration;
+ }
+
+ float endpoint_margin() const { return endpoint_margin_; }
+ void set_endpoint_margin(float endpoint_margin) {
+ endpoint_margin_ = endpoint_margin;
+ }
+
+ float onset_window() const { return onset_window_; }
+ void set_onset_window(float onset_window) { onset_window_ = onset_window; }
+
+ float speech_on_window() const { return speech_on_window_; }
+ void set_speech_on_window(float speech_on_window) {
+ speech_on_window_ = speech_on_window;
+ }
+
+ float offset_window() const { return offset_window_; }
+ void set_offset_window(float offset_window) {
+ offset_window_ = offset_window;
+ }
+
+ float onset_detect_dur() const { return onset_detect_dur_; }
+ void set_onset_detect_dur(float onset_detect_dur) {
+ onset_detect_dur_ = onset_detect_dur;
+ }
+
+ float onset_confirm_dur() const { return onset_confirm_dur_; }
+ void set_onset_confirm_dur(float onset_confirm_dur) {
+ onset_confirm_dur_ = onset_confirm_dur;
+ }
+
+ float on_maintain_dur() const { return on_maintain_dur_; }
+ void set_on_maintain_dur(float on_maintain_dur) {
+ on_maintain_dur_ = on_maintain_dur;
+ }
+
+ float offset_confirm_dur() const { return offset_confirm_dur_; }
+ void set_offset_confirm_dur(float offset_confirm_dur) {
+ offset_confirm_dur_ = offset_confirm_dur;
+ }
+
+ float decision_threshold() const { return decision_threshold_; }
+ void set_decision_threshold(float decision_threshold) {
+ decision_threshold_ = decision_threshold;
+ }
+
+ float min_decision_threshold() const { return min_decision_threshold_; }
+ void set_min_decision_threshold(float min_decision_threshold) {
+ min_decision_threshold_ = min_decision_threshold;
+ }
+
+ float fast_update_dur() const { return fast_update_dur_; }
+ void set_fast_update_dur(float fast_update_dur) {
+ fast_update_dur_ = fast_update_dur;
+ }
+
+ float sample_rate() const { return sample_rate_; }
+ void set_sample_rate(float sample_rate) { sample_rate_ = sample_rate; }
+
+ float min_fundamental_frequency() const { return min_fundamental_frequency_; }
+ void set_min_fundamental_frequency(float min_fundamental_frequency) {
+ min_fundamental_frequency_ = min_fundamental_frequency;
+ }
+
+ float max_fundamental_frequency() const { return max_fundamental_frequency_; }
+ void set_max_fundamental_frequency(float max_fundamental_frequency) {
+ max_fundamental_frequency_ = max_fundamental_frequency;
+ }
+
+ float contamination_rejection_period() const {
+ return contamination_rejection_period_;
+ }
+ void set_contamination_rejection_period(
+ float contamination_rejection_period) {
+ contamination_rejection_period_ = contamination_rejection_period;
+ }
+
+ private:
+ float frame_period_; // Frame period
+ float frame_duration_; // Window size
+ float onset_window_; // Interval scanned for onset activity
+ float speech_on_window_; // Inverval scanned for ongoing speech
+ float offset_window_; // Interval scanned for offset evidence
+ float offset_confirm_dur_; // Silence duration required to confirm offset
+ float decision_threshold_; // Initial rms detection threshold
+ float min_decision_threshold_; // Minimum rms detection threshold
+ float fast_update_dur_; // Period for initial estimation of levels.
+ float sample_rate_; // Expected sample rate.
+
+ // Time to add on either side of endpoint threshold crossings
+ float endpoint_margin_;
+ // Total dur within onset_window required to enter ONSET state
+ float onset_detect_dur_;
+ // Total on time within onset_window required to enter SPEECH_ON state
+ float onset_confirm_dur_;
+ // Minimum dur in SPEECH_ON state required to maintain ON state
+ float on_maintain_dur_;
+ // Minimum fundamental frequency for autocorrelation.
+ float min_fundamental_frequency_;
+ // Maximum fundamental frequency for autocorrelation.
+ float max_fundamental_frequency_;
+ // Period after start of user input that above threshold values are ignored.
+ // This is to reject audio feedback contamination.
+ float contamination_rejection_period_;
+};
+
+} // namespace mozilla
+
+#endif // CONTENT_BROWSER_SPEECH_ENDPOINTER_ENERGY_ENDPOINTER_PARAMS_H_
diff --git a/dom/media/webspeech/recognition/models/dict/en-US.dic b/dom/media/webspeech/recognition/models/dict/en-US.dic
new file mode 100644
index 000000000..57d618a20
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/dict/en-US.dic
@@ -0,0 +1,133449 @@
+firefox F AY ER F AA K S
+!exclamation-point EH K S K L AH M EY SH AH N P OY N T
+"close-quote K L OW Z K W OW T
+"double-quote D AH B AH L K W OW T
+"end-of-quote EH N D AH V K W OW T
+"end-quote EH N D K W OW T
+"in-quotes IH N K W OW T S
+"quote K W OW T
+"unquote AH N K W OW T
+#sharp-sign SH AA R P S AY N
+%percent P ER S EH N T
+&ampersand AE M P ER S AE N D
+'bout B AW T
+'cause K AH Z
+'course K AO R S
+'cuse K Y UW Z
+'em AH M
+'end-inner-quote EH N D IH N ER K W OW T
+'end-quote EH N D K W OW T
+'frisco F R IH S K OW
+'gain G EH N
+'inner-quote IH N ER K W OW T
+'kay K EY
+'m AH M
+'n AH N
+'quote K W OW T
+'round R AW N D
+'s EH S
+'single-quote S IH NG G AH L K W OW T
+'til T IH L
+'tis T IH Z
+'twas T W AH Z
+(begin-parens B IH G IH N P ER EH N Z
+(in-parentheses IH N P ER EH N TH AH S IY Z
+(left-paren L EH F T P ER EH N
+(open-parentheses OW P AH N P ER EH N TH AH S IY Z
+(paren P ER EH N
+(parens P ER EH N Z
+(parentheses P ER EH N TH AH S IY Z
+)close-paren K L OW Z P ER EH N
+)close-parentheses K L OW Z P ER EH N TH AH S IY Z
+)end-paren EH N D P ER EH N
+)end-parens EH N D P ER EH N Z
+)end-parentheses EH N D P ER EH N TH AH S IY Z
+)end-the-paren EH N D DH AH P ER EH N
+)paren P ER EH N
+)parens P ER EH N Z
+)right-paren R AY T P ER EH N
+)right-paren(2) R AY T P EH R AH N
+)un-parentheses AH N P ER EH N TH AH S IY Z
+,comma K AA M AH
+-dash D AE SH
+-hyphen HH AY F AH N
+...ellipsis IH L IH P S IH S
+.decimal D EH S AH M AH L
+.dot D AA T
+.full-stop F UH L S T AA P
+.period P IH R IY AH D
+.point P OY N T
+/slash S L AE SH
+:colon K OW L AH N
+;semi-colon S EH M IY K OW L AH N
+;semi-colon(2) S EH M IH K OW L AH N
+?question-mark K W EH S CH AH N M AA R K
+a AH
+a's EY Z
+a(2) EY
+a. EY
+a.'s EY Z
+a.s EY Z
+a42128 EY F AO R T UW W AH N T UW EY T
+aaa T R IH P AH L EY
+aaberg AA B ER G
+aachen AA K AH N
+aachener AA K AH N ER
+aaker AA K ER
+aalseth AA L S EH TH
+aamodt AA M AH T
+aancor AA N K AO R
+aardema AA R D EH M AH
+aardvark AA R D V AA R K
+aaron EH R AH N
+aaron's EH R AH N Z
+aarons EH R AH N Z
+aaronson EH R AH N S AH N
+aaronson's EH R AH N S AH N Z
+aaronson's(2) AA R AH N S AH N Z
+aaronson(2) AA R AH N S AH N
+aarti AA R T IY
+aase AA S
+aasen AA S AH N
+ab AE B
+ab(2) EY B IY
+ababa AH B AA B AH
+ababa(2) AA B AH B AH
+abacha AE B AH K AH
+aback AH B AE K
+abaco AE B AH K OW
+abacus AE B AH K AH S
+abad AH B AA D
+abadaka AH B AE D AH K AH
+abadi AH B AE D IY
+abadie AH B AE D IY
+abair AH B EH R
+abalkin AH B AA L K IH N
+abalone AE B AH L OW N IY
+abalos AA B AA L OW Z
+abandon AH B AE N D AH N
+abandoned AH B AE N D AH N D
+abandoning AH B AE N D AH N IH NG
+abandonment AH B AE N D AH N M AH N T
+abandonments AH B AE N D AH N M AH N T S
+abandons AH B AE N D AH N Z
+abanto AH B AE N T OW
+abarca AH B AA R K AH
+abare AA B AA R IY
+abascal AE B AH S K AH L
+abash AH B AE SH
+abashed AH B AE SH T
+abate AH B EY T
+abated AH B EY T IH D
+abatement AH B EY T M AH N T
+abatements AH B EY T M AH N T S
+abates AH B EY T S
+abating AH B EY T IH NG
+abba AE B AH
+abbado AH B AA D OW
+abbas AH B AA S
+abbasi AA B AA S IY
+abbate AA B EY T
+abbatiello AA B AA T IY EH L OW
+abbe AE B IY
+abbe(2) AE B EY
+abbenhaus AE B AH N HH AW S
+abbett AH B EH T
+abbeville AE B V IH L
+abbey AE B IY
+abbey's AE B IY Z
+abbie AE B IY
+abbitt AE B IH T
+abbot AE B AH T
+abbotstown AE B AH T S T AW N
+abbott AE B AH T
+abbott's AE B AH T S
+abbottstown AE B AH T S T AW N
+abboud AH B UW D
+abboud(2) AH B AW D
+abbreviate AH B R IY V IY EY T
+abbreviated AH B R IY V IY EY T AH D
+abbreviated(2) AH B R IY V IY EY T IH D
+abbreviates AH B R IY V IY EY T S
+abbreviating AH B R IY V IY EY T IH NG
+abbreviation AH B R IY V IY EY SH AH N
+abbreviations AH B R IY V IY EY SH AH N Z
+abbruzzese AA B R UW T S EY Z IY
+abbs AE B Z
+abby AE B IY
+abco AE B K OW
+abcotek AE B K OW T EH K
+abdalla AE B D AE L AH
+abdallah AE B D AE L AH
+abdel AE B D EH L
+abdella AE B D EH L AH
+abdicate AE B D AH K EY T
+abdicated AE B D AH K EY T AH D
+abdicates AE B D AH K EY T S
+abdicating AE B D IH K EY T IH NG
+abdication AE B D IH K EY SH AH N
+abdnor AE B D N ER
+abdo AE B D OW
+abdollah AE B D AA L AH
+abdomen AE B D OW M AH N
+abdomen(2) AE B D AH M AH N
+abdominal AE B D AA M AH N AH L
+abdominal(2) AH B D AA M AH N AH L
+abduct AE B D AH K T
+abducted AE B D AH K T IH D
+abducted(2) AH B D AH K T IH D
+abductee AE B D AH K T IY
+abductees AE B D AH K T IY Z
+abducting AE B D AH K T IH NG
+abducting(2) AH B D AH K T IH NG
+abduction AE B D AH K SH AH N
+abduction(2) AH B D AH K SH AH N
+abductions AE B D AH K SH AH N Z
+abductions(2) AH B D AH K SH AH N Z
+abductor AE B D AH K T ER
+abductor(2) AH B D AH K T ER
+abductors AE B D AH K T ER Z
+abductors(2) AH B D AH K T ER Z
+abducts AE B D AH K T S
+abdul AE B D UW L
+abdulaziz AE B D UW L AH Z IY Z
+abdulla AA B D UW L AH
+abdullah AE B D AH L AH
+abe EY B
+abed AH B EH D
+abedi AH B EH D IY
+abee AH B IY
+abel EY B AH L
+abela AA B EH L AH
+abelard AE B IH L ER D
+abele AH B IY L
+abeles AH B IY L Z
+abeles(2) EY B AH L IY Z
+abell EY B AH L
+abella AH B EH L AH
+abeln AE B IH L N
+abelow AE B AH L OW
+abels EY B AH L Z
+abelson AE B IH L S AH N
+abend AE B EH N D
+abend(2) AH B EH N D
+abendroth AE B IH N D R AO TH
+aber EY B ER
+abercrombie AE B ER K R AA M B IY
+aberdeen AE B ER D IY N
+aberford EY B ER F ER D
+aberg AE B ER G
+aberle AE B ER AH L
+aberle(2) AE B ER L
+abermin AE B ER M IH N
+abernathy AE B ER N AE TH IY
+abernethy AE B ER N EH TH IY
+aberrant AE B EH R AH N T
+aberration AE B ER EY SH AH N
+aberrational AE B ER EY SH AH N AH L
+aberrations AE B ER EY SH AH N Z
+abert AE B ER T
+abet AH B EH T
+abetted AH B EH T IH D
+abetting AH B EH T IH NG
+abex EY B EH K S
+abeyance AH B EY AH N S
+abeyta AA B EY T AH
+abhor AE B HH AO R
+abhorred AH B HH AO R D
+abhorrence AH B HH AO R AH N S
+abhorrent AE B HH AO R AH N T
+abhors AH B HH AO R Z
+abiam EY B IY AH M
+abiam's EY B IY AH M Z
+abid EY B IH D
+abide AH B AY D
+abided AH B AY D IH D
+abides AH B AY D Z
+abiding AH B AY D IH NG
+abidjan AE B IH JH AA N
+abie AE B IY
+abigail AE B AH G EY L
+abila AA B IY L AH
+abilene AE B IH L IY N
+abilities AH B IH L AH T IY Z
+ability AH B IH L AH T IY
+abimael AE B IH M EY L
+abimaels AE B IH M EY L Z
+abingdon AE B IH NG D AH N
+abington AE B IH NG T AH N
+abio AA B IY OW
+abiola AA B IY OW L AH
+abiola's AA B IY OW L AH Z
+abiomed EY B IY AH M EH D
+abiquiu AH B IH K Y UW
+abitibi AE B IH T IY B IY
+abitz AE B IH T S
+abject AE B JH EH K T
+abkhazia AE B K HH AA Z Y AH
+abkhazia(2) AE B K HH AE Z Y AH
+abkhazian AE B K HH AA Z IY AH N
+abkhazian(2) AE B K HH AE Z IY AH N
+abkhazian(3) AE B K HH AA Z Y AH N
+abkhazian(4) AE B K HH AE Z Y AH N
+abkhazians AE B K HH AA Z IY AH N Z
+abkhazians(2) AE B K HH AE Z IY AH N Z
+ablaze AH B L EY Z
+able EY B AH L
+able-bodied EY B AH L B AA D IY D
+abled EY B AH L D
+abler EY B AH L ER
+abler(2) EY B L ER
+ables EY B AH L Z
+ablest EY B AH L S T
+ablest(2) EY B L AH S T
+abloom AH B L UW M
+ably EY B L IY
+abner AE B N ER
+abney AE B N IY
+abnormal AE B N AO R M AH L
+abnormalities AE B N AO R M AE L AH T IY Z
+abnormality AE B N AO R M AE L AH T IY
+abnormally AE B N AO R M AH L IY
+abo AA B OW
+abo's AA B OW Z
+aboard AH B AO R D
+abode AH B OW D
+abohalima AE B AH HH AH L IY M AH
+abolish AH B AA L IH SH
+abolished AH B AA L IH SH T
+abolishes AH B AA L IH SH IH Z
+abolishing AH B AA L IH SH IH NG
+abolition AE B AH L IH SH AH N
+abolitionism AE B AH L IH SH AH N IH Z AH M
+abolitionist AE B AH L IH SH AH N AH S T
+abolitionists AE B AH L IH SH AH N AH S T S
+abolitionists(2) AE B AH L IH SH AH N AH S
+abominable AH B AA M AH N AH B AH L
+abomination AH B AA M AH N EY SH AH N
+abood AH B UW D
+aboodi AH B UW D IY
+abor AH B AO R
+aboriginal AE B ER IH JH AH N AH L
+aborigine AE B ER IH JH AH N IY
+aborigines AE B ER IH JH AH N IY Z
+aborn AH B AO R N
+abort AH B AO R T
+aborted AH B AO R T IH D
+abortifacient AH B AO R T AH F EY SH AH N T
+abortifacients AH B AO R T AH F EY SH AH N T S
+aborting AH B AO R T IH NG
+abortion AH B AO R SH AH N
+abortionist AH B AO R SH AH N IH S T
+abortionists AH B AO R SH AH N IH S T S
+abortionists(2) AH B AO R SH AH N IH S
+abortions AH B AO R SH AH N Z
+abortive AH B AO R T IH V
+aborts AH B AO R T S
+abott AH B AA T
+abou AH B UW
+aboud AA B UW D
+abouhalima AA B UW HH AA L IY M AH
+abouhalima's AA B UW HH AA L IY M AH Z
+abound AH B AW N D
+abounded AH B AW N D IH D
+abounding AH B AW N D IH NG
+abounds AH B AW N D Z
+about AH B AW T
+about's AH B AW T S
+above AH B AH V
+above's AH B AH V Z
+aboveboard AH B AH V B AO R D
+abplanalp AE B P L AH N AE L P
+abra AA B R AH
+abracadabra AE B R AH K AH D AE B R AH
+abraham EY B R AH HH AE M
+abrahamian AE B R AH HH EY M IY AH N
+abrahams EY B R AH HH AE M Z
+abrahamsen AE B R AH HH AE M S AH N
+abrahamson AH B R AE HH AH M S AH N
+abram AH B R AE M
+abram's EY B R AH M Z
+abramczyk AA B R AH M CH IH K
+abramo AA B R AA M OW
+abramovitz AH B R AA M AH V IH T S
+abramowicz AH B R AA M AH V IH CH
+abramowitz AH B R AA M AH W IH T S
+abrams EY B R AH M Z
+abrams's EY B R AH M Z IH Z
+abramson EY B R AH M S AH N
+abrasion AH B R EY ZH AH N
+abrasions AH B R EY ZH AH N Z
+abrasive AH B R EY S IH V
+abrasives AH B R EY S IH V Z
+abraxa AH B R AE K S AH
+abraxa's AH B R AE K S AH Z
+abraxas AH B R AE K S AH Z
+abreast AH B R EH S T
+abrego AA B R EH G OW
+abreu AH B R UW
+abridge AH B R IH JH
+abridged AH B R IH JH D
+abridgement AH B R IH JH M AH N T
+abridges AH B R IH JH AH Z
+abridging AH B R IH JH IH NG
+abril AH B R IH L
+abroad AH B R AO D
+abrogate AE B R AH G EY T
+abrogated AE B R AH G EY T IH D
+abrogating AE B R AH G EY T IH NG
+abrogation AE B R AH G EY SH AH N
+abrol AH B R OW L
+abron AH B R AA N
+abrupt AH B R AH P T
+abruptly AH B R AH P T L IY
+abruptness AH B R AH P T N AH S
+abrutyn EY B R UW T IH N
+abruzzese AA B R UW T S EY Z IY
+abruzzo AA B R UW Z OW
+abs EY B IY EH S
+abs(2) AE B Z
+absalom AE B S AH L AH M
+absaraka AE B S AA R AH K AH
+abscam AE B S K AE M
+abscess AE B S EH S
+abscond AE B S K AA N D
+absconded AE B S K AA N D AH D
+absconding AE B S K AA N D IH NG
+absconds AE B S K AA N D Z
+absecon AE B S AH K AO N
+absence AE B S AH N S
+absences AE B S AH N S IH Z
+absent AE B S AH N T
+absentee AE B S AH N T IY
+absenteeism AE B S AH N T IY IH Z AH M
+absentees AE B S AH N T IY Z
+absentia AE B S EH N SH AH
+absher AE B SH ER
+abshier AE B SH IY ER
+abshire AE B SH AY R
+absinthe AE B S IH N TH
+abso AE B S OW
+absolom AE B S AH L AH M
+absolut AE B S AH L UW T
+absolut's AE B S AH L UW T S
+absolute AE B S AH L UW T
+absolutely AE B S AH L UW T L IY
+absoluteness AE B S AH L UW T N AH S
+absolutes AE B S AH L UW T S
+absolution AE B S AH L UW SH AH N
+absolutism AE B S AH L UW T IH Z AH M
+absolutist AE B S IH L UW T IH S T
+absolve AH B Z AA L V
+absolve(2) AE B Z AA L V
+absolved AH B Z AA L V D
+absolved(2) AE B Z AA L V D
+absolves AH B Z AA L V Z
+absolves(2) AE B Z AA L V Z
+absolving AH B Z AA L V IH NG
+absolving(2) AE B Z AA L V IH NG
+absorb AH B Z AO R B
+absorbed AH B Z AO R B D
+absorbency AH B Z AO R B AH N S IY
+absorbent AH B Z AO R B AH N T
+absorber AH B Z AO R B ER
+absorbers AH B Z AO R B ER Z
+absorbing AH B Z AO R B IH NG
+absorbs AH B Z AO R B Z
+absorption AH B Z AO R P SH AH N
+absorption(2) AH B S AO R P SH AH N
+abstain AH B S T EY N
+abstain(2) AE B S T EY N
+abstained AH B S T EY N D
+abstained(2) AE B S T EY N D
+abstaining AH B S T EY N IH NG
+abstaining(2) AE B S T EY N IH NG
+abstention AH B S T EH N CH AH N
+abstention(2) AE B S T EH N CH AH N
+abstentions AH B S T EH N CH AH N Z
+abstentions(2) AE B S T EH N CH AH N Z
+abstinence AE B S T AH N AH N S
+abstinent AE B S T AH N AH N T
+abston AE B S T AH N
+abstract AE B S T R AE K T
+abstracted AE B S T R AE K T IH D
+abstraction AE B S T R AE K SH AH N
+abstractions AE B S T R AE K SH AH N Z
+abstracts AE B S T R AE K T S
+abstruse AH B S T R UW S
+absurd AH B S ER D
+absurdist AH B S ER D IH S T
+absurdities AH B S ER D AH T IY Z
+absurdity AH B S ER D AH T IY
+absurdly AH B S ER D L IY
+abt AE B T
+abt(2) EY B IY T IY
+abts AE B T S
+abts(2) EY B IY T IY Z
+abts(3) EY B IY T IY EH S
+abu AE B UW
+abudrahm AH B AH D R AH M
+abuellah AH B W EH L AH
+abuellah's AH B W EH L AH Z
+abuladze AE B Y UW L AE D Z IY
+abundance AH B AH N D AH N S
+abundant AH B AH N D AH N T
+abundantly AH B AH N D AH N T L IY
+aburto AH B UH R T OW
+aburto's AH B UH R T OW Z
+abuse AH B Y UW S
+abuse(2) AH B Y UW Z
+abused AH B Y UW Z D
+abuser AH B Y UW Z ER
+abusers AH B Y UW Z ER Z
+abuses AH B Y UW S IH Z
+abuses(2) AH B Y UW Z IH Z
+abusing AH B Y UW Z IH NG
+abusive AH B Y UW S IH V
+abut AH B AH T
+abuts AH B AH T S
+abutted AH B AH T AH D
+abutting AH B AH T IH NG
+abuzz AH B AH Z
+abysmal AH B IH Z M AH L
+abysmally AH B IH Z M AH L IY
+abyss AH B IH S
+abyssinia AE B S IH N IY AH
+abyssinian AE B S IH N IY AH N
+abzug AE B Z AH G
+abzug(2) AE B Z UH G
+ac EY S IY
+aca AE K AH
+acacia AH K EY SH AH
+academe AE K AH D IY M
+academia AE K AH D IY M IY AH
+academic AE K AH D EH M IH K
+academically AE K AH D EH M IH K L IY
+academician AE K AH D AH M IH SH AH N
+academicians AE K AH D AH M IH SH AH N Z
+academicians(2) AH K AE D AH M IH SH AH N Z
+academics AE K AH D EH M IH K S
+academies AH K AE D AH M IY Z
+academy AH K AE D AH M IY
+academy's AH K AE D AH M IY Z
+acadia AH K EY D IY AH
+acampo AH K AA M P OW
+acampora AH K AE M P ER AH
+acantha AA K AA N DH AH
+acapulco AE K AH P UH L K OW
+acary AE K ER IY
+accardi AA K AA R D IY
+accardo AA K AA R D OW
+accede AE K S IY D
+acceded AE K S IY D IH D
+accedes AE K S IY D Z
+acceding AE K S IY D IH NG
+accel AH K S EH L
+accelerant AE K S EH L ER AH N T
+accelerants AE K S EH L ER AH N T S
+accelerate AE K S EH L ER EY T
+accelerated AE K S EH L ER EY T IH D
+accelerates AE K S EH L ER EY T S
+accelerating AE K S EH L ER EY T IH NG
+acceleration AE K S EH L ER EY SH AH N
+accelerator AE K S EH L ER EY T ER
+accelerators AE K S EH L ER EY T ER Z
+accelerometer AE K S EH L ER AA M AH T ER
+accelerometers AE K S EH L ER AA M AH T ER Z
+accent AH K S EH N T
+accent(2) AE K S EH N T
+accented AE K S EH N T IH D
+accenting AE K S EH N T IH NG
+accents AE K S EH N T S
+accentuate AE K S EH N CH UW EY T
+accentuated AE K S EH N CH AH W EY T IH D
+accentuates AE K S EH N CH UW EY T S
+accentuating AE K S EH N CH AH W EY T IH NG
+accept AE K S EH P T
+accept(2) AH K S EH P T
+acceptability AH K S EH P T AH B IH L AH T IY
+acceptable AE K S EH P T AH B AH L
+acceptable(2) AH K S EH P T AH B AH L
+acceptably AE K S EH P T AH B L IY
+acceptably(2) AH K S EH P T AH B L IY
+acceptance AE K S EH P T AH N S
+acceptance(2) AH K S EH P T AH N S
+acceptances AE K S EH P T AH N S IH Z
+accepted AE K S EH P T IH D
+accepted(2) AH K S EH P T AH D
+accepting AE K S EH P T IH NG
+accepting(2) AH K S EH P T IH NG
+accepts AE K S EH P T S
+access AE K S EH S
+accessed AE K S EH S T
+accessibility AE K S EH S AH B IH L IH T IY
+accessible AE K S EH S AH B AH L
+accessing AE K S EH S IH NG
+accession AH K S EH SH AH N
+accessories AE K S EH S ER IY Z
+accessorize AE K S EH S ER AY Z
+accessorized AE K S EH S ER AY Z D
+accessory AE K S EH S ER IY
+accetta AA CH EH T AH
+accident AE K S AH D AH N T
+accident's AE K S AH D AH N T S
+accidental AE K S AH D EH N T AH L
+accidental(2) AE K S AH D EH N AH L
+accidentally AE K S AH D EH N T AH L IY
+accidentally(2) AE K S AH D EH N AH L IY
+accidently AE K S AH D AH N T L IY
+accidents AE K S AH D AH N T S
+accion AE CH IY AH N
+accival AE S IH V AA L
+acclaim AH K L EY M
+acclaim's AH K L EY M Z
+acclaimed AH K L EY M D
+acclaiming AH K L EY M IH NG
+acclaims AH K L EY M Z
+acclamation AE K L AH M EY SH AH N
+acclimate AE K L AH M EY T
+acclimated AE K L AH M EY T IH D
+acclimation AE K L AH M EY SH AH N
+acco AE K OW
+accokeek AE K OW K IY K
+accola AA K OW L AH
+accolade AE K AH L EY D
+accolades AE K AH L EY D Z
+accomando AA K OW M AA N D OW
+accommodate AH K AA M AH D EY T
+accommodated AH K AA M AH D EY T AH D
+accommodates AH K AA M AH D EY T S
+accommodating AH K AA M AH D EY T IH NG
+accommodation AH K AA M AH D EY SH AH N
+accommodations AH K AA M AH D EY SH AH N Z
+accommodative AH K AA M AH D EY T IH V
+accompanied AH K AH M P AH N IY D
+accompanies AH K AH M P AH N IY Z
+accompaniment AH K AH M P N IH M AH N T
+accompaniment(2) AH K AH M P N IY M AH N T
+accompaniments AH K AH M P N IH M AH N T S
+accompaniments(2) AH K AH M P N IY M AH N T S
+accompanist AH K AH M P AH N AH S T
+accompany AH K AH M P AH N IY
+accompanying AH K AH M P AH N IY IH NG
+accompli AA K AA M P L IY
+accompli(2) AH K AA M P L IY
+accomplice AH K AA M P L AH S
+accomplices AH K AA M P L AH S AH Z
+accomplish AH K AA M P L IH SH
+accomplished AH K AA M P L IH SH T
+accomplishes AH K AA M P L IH SH IH Z
+accomplishing AH K AA M P L IH SH IH NG
+accomplishment AH K AA M P L IH SH M AH N T
+accomplishments AH K AA M P L IH SH M AH N T S
+accor AE K AO R
+accor's AE K ER Z
+accord AH K AO R D
+accord's AH K AO R D Z
+accordance AH K AO R D AH N S
+accorded AH K AO R D IH D
+according AH K AO R D IH NG
+accordingly AH K AO R D IH NG L IY
+accordion AH K AO R D IY AH N
+accordions AH K AO R D IY AH N Z
+accords AH K AO R D Z
+accost AH K AO S T
+accosted AH K AA S T AH D
+accosting AH K AA S T IH NG
+account AH K AW N T
+account's AH K AW N T S
+accountability AH K AW N T AH B IH L IH T IY
+accountability(2) AH K AW N AH B IH L IH T IY
+accountable AH K AW N T AH B AH L
+accountable(2) AH K AW N AH B AH L
+accountancy AH K AW N T AH N S IY
+accountant AH K AW N T AH N T
+accountant's AH K AW N T AH N T S
+accountants AH K AW N T AH N T S
+accountants' AH K AW N T AH N T S
+accounted AH K AW N T AH D
+accounted(2) AH K AW N AH D
+accountemp AH K AW N T EH M P
+accountemps AH K AW N T EH M P S
+accounting AH K AW N T IH NG
+accounting(2) AH K AW N IH NG
+accounts AH K AW N T S
+accouterment AH K UW T ER M AH N T
+accouterments AH K UW T ER M AH N T S
+accoutrement AH K UW T ER M AH N T
+accoutrements AH K UW T ER M AH N T S
+accredit AH K R EH D AH T
+accreditation AH K R EH D AH T EY SH AH N
+accreditations AH K R EH D AH D EY SH AH N Z
+accredited AH K R EH D IH T IH D
+accrediting AH K R EH D AH T IH NG
+accreted AH K R IY T IH D
+accretion AH K R IY SH AH N
+accrual AH K R UW AH L
+accruals AH K R UW AH L Z
+accrue AH K R UW
+accrued AH K R UW D
+accrues AH K R UW Z
+accruing AH K R UW IH NG
+accu AE K Y UW
+accuhealth AE K Y UW HH EH L TH
+accumulate AH K Y UW M Y AH L EY T
+accumulated AH K Y UW M Y AH L EY T IH D
+accumulates AH K Y UW M Y AH L EY T S
+accumulating AH K Y UW M Y AH L EY T IH NG
+accumulation AH K Y UW M Y AH L EY SH AH N
+accumulations AH K Y UW M Y AH L EY SH AH N Z
+accumulative AH K Y UW M Y AH L EY T IH V
+accumulatively AH K Y UW M Y AH L EY T IH V L IY
+accumulatively(2) AH K Y UW M Y AH L AH T IH V L IY
+accumulator AH K Y UW M Y AH L EY T ER
+accumulators AH K Y UW M Y AH L EY T ER Z
+accuracies AE K Y ER AH S IY Z
+accuracy AE K Y ER AH S IY
+accurate AE K Y ER AH T
+accurately AE K Y ER AH T L IY
+accuray AE K Y ER EY
+accuray's AE K Y ER EY Z
+accuride AE K Y ER AY D
+accurso AA K UH R S OW
+accusation AE K Y AH Z EY SH AH N
+accusation(2) AE K Y UW Z EY SH AH N
+accusations AE K Y AH Z EY SH AH N Z
+accusations(2) AE K Y UW Z EY SH AH N Z
+accusative AH K Y UW Z AH T IH V
+accusatory AH K Y UW Z AH T AO R IY
+accuse AH K Y UW Z
+accused AH K Y UW Z D
+accuser AH K Y UW Z ER
+accusers AH K Y UW Z ER Z
+accuses AH K Y UW Z IH Z
+accusing AH K Y UW Z IH NG
+accusingly AH K Y UW Z IH NG L IY
+accustom AH K AH S T AH M
+accustomed AH K AH S T AH M D
+accutane AE K Y UW T EY N
+ace EY S
+acecomm EY S K AA M
+aced EY S T
+acer EY S ER
+acerbic AH S EH R B IH K
+acero AH S EH R OW
+acero(2) AH S Y EH R OW
+acero(3) AH TH EH R OW
+acerra AH S EH R AH
+aces EY S IH Z
+acetaminophen AH S IY T AH M IH N AH F AH N
+acetate AE S AH T EY T
+acetic AH S EH T IH K
+acetic(2) AH S IY T IH K
+aceto AA S EH T OW
+acetochlor AA S EH T OW K L AO R
+acetone AE S AH T OW N
+acetosyringone AH S EH T OW S IH R IH NG G AO N
+acetylcholine AH S EH T AH L K OW L IY N
+acetylcholine(2) AH S IY T AH L K OW L IY N
+acetylene AH S EH T AH L IY N
+acevedo AE S AH V EY D OW
+aceves AA S EY V EH S
+acey EY S IY
+achaean AH CH IY AH N
+achatz AE K AH T S
+ache EY K
+achebe AA CH EY B IY
+ached EY K T
+achee AH CH IY
+achenbach AE K IH N B AA K
+achenbaum AE K AH N B AW M
+aches EY K S
+acheson AE CH AH S AH N
+acheson's AE CH AH S AH N Z
+achesons AE CH AH S AH N Z
+achey AE CH IY
+achieva AH CH IY V AH
+achievable AH CH IY V AH B AH L
+achieve AH CH IY V
+achieved AH CH IY V D
+achievement AH CH IY V M AH N T
+achievements AH CH IY V M AH N T S
+achiever AH CH IY V ER
+achievers AH CH IY V ER Z
+achieves AH CH IY V Z
+achieving AH CH IY V IH NG
+achille AH K IH L IY
+achilles AH K IH L IY Z
+achilles' AH K IH L IY Z
+aching EY K IH NG
+achingly EY K IH NG L IY
+achmed AA HH M EH D
+achoa AH CH OW AH
+achoa's AH CH OW AH Z
+achor EY K ER
+achord AE K AO R D
+achorn AE K ER N
+achtenberg AE K T EH N B ER G
+achterberg AE K T ER B ER G
+achy EY K IY
+acid AE S AH D
+acidic AH S IH D IH K
+acidification AH S IH D AH F AH K EY SH AH N
+acidified AH S IH D AH F AY D
+acidifies AH S IH D AH F AY Z
+acidify AH S IH D AH F AY
+acidity AH S IH D AH T IY
+acidly AE S AH D L IY
+acidosis AE S AH D OW S AH S
+acids AE S AH D Z
+aciduria AE S AH D UH R IY AH
+acierno AA S IH R N OW
+ack AE K
+acker AE K ER
+acker's AE K ER Z
+ackerley AE K ER L IY
+ackerly AE K ER L IY
+ackerman AE K ER M AH N
+ackermann AE K ER M AH N
+ackermanville AE K ER M AH N V IH L
+ackerson AE K ER S AH N
+ackert AE K ER T
+ackhouse AE K HH AW S
+ackland AE K L AH N D
+ackles AE K AH L Z
+ackley AE K L IY
+acklin AE K L IH N
+ackman AE K M AH N
+acknowledge AE K N AA L IH JH
+acknowledge(2) IH K N AA L IH JH
+acknowledgeable AE K N AA L IH JH AH B AH L
+acknowledgeable(2) IH K N AA L IH JH AH B AH L
+acknowledged AE K N AA L IH JH D
+acknowledged(2) IH K N AA L IH JH D
+acknowledgement AE K N AA L IH JH M AH N T
+acknowledgement(2) IH K N AA L IH JH M AH N T
+acknowledgements AE K N AA L IH JH M AH N T S
+acknowledgements(2) IH K N AA L IH JH M AH N T S
+acknowledges AE K N AA L IH JH IH Z
+acknowledges(2) IH K N AA L IH JH IH Z
+acknowledging AE K N AA L IH JH IH NG
+acknowledging(2) IH K N AA L IH JH IH NG
+acknowledgment AE K N AA L IH JH M AH N T
+acknowledgment(2) IH K N AA L IH JH M AH N T
+ackroyd AE K R OY D
+ackroyd's AE K R OY D Z
+acmat AE K M AE T
+acmat's AE K M AE T S
+acme AE K M IY
+acme's AE K M IY Z
+acne AE K N IY
+acocella AA K OW CH EH L AH
+acoff AE K AO F
+acog AH K AO G
+acolyte AE K AH L AY T
+acolytes AE K AH L AY T S
+acord AH K AO R D
+acordia AH K AO R D IY AH
+acorn EY K AO R N
+acorn's EY K AO R N Z
+acorns EY K AO R N Z
+acosta AH K AO S T AH
+acott EY K AO T
+acoustic AH K UW S T IH K
+acoustical AH K UW S T IH K AH L
+acoustically AH K UW S T IH K L IY
+acoustics AH K UW S T IH K S
+acquaint AH K W EY N T
+acquaintance AH K W EY N T AH N S
+acquaintances AH K W EY N T AH N S IH Z
+acquaintanceship AH K W EY N T AH N S SH IH P
+acquainted AH K W EY N T IH D
+acquainted(2) AH K W EY N IH D
+acquaviva AA K W AA V IY V AH
+acquiesce AE K W IY EH S
+acquiesced AE K W IY EH S T
+acquiescence AE K W IY EH S AH N S
+acquiescing AE K W IY EH S IH NG
+acquire AH K W AY ER
+acquired AH K W AY ER D
+acquirer AH K W AY ER ER
+acquirer's AH K W AY ER ER Z
+acquirers AH K W AY ER ER Z
+acquires AH K W AY ER Z
+acquiring AH K W AY R IH NG
+acquiring(2) AH K W AY ER IH NG
+acquisition AE K W AH Z IH SH AH N
+acquisition's AE K W AH Z IH SH AH N Z
+acquisitions AE K W AH Z IH SH AH N Z
+acquisitive AH K W IH Z AH T IH V
+acquit AH K W IH T
+acquitaine AE K W IH T EY N
+acquits AH K W IH T S
+acquittal AH K W IH T AH L
+acquittals AH K W IH T AH L Z
+acquitted AH K W IH T AH D
+acquitted(2) AH K W IH T IH D
+acquitting AH K W IH T IH NG
+acre EY K ER
+acreage EY K ER IH JH
+acreage(2) EY K R AH JH
+acree AH K R IY
+acres EY K ER Z
+acrey AE K R IY
+acri AA K R IY
+acrid AE K R IH D
+acrimonious AE K R AH M OW N IY AH S
+acrimony AE K R IH M OW N IY
+acro AE K R OW
+acrobat AE K R AH B AE T
+acrobatic AE K R AH B AE T IH K
+acrobatics AE K R AH B AE T IH K S
+acrobats AE K R AH B AE T S
+acrolein AE K R OW L IY N
+acronym AE K R AH N IH M
+acronyms AE K R AH N IH M Z
+acropolis AH K R AA P AH L AH S
+across AH K R AO S
+acrylic AH K R IH L IH K
+acrylics AH K R IH L IH K S
+act AE K T
+act's AE K T S
+actava AE K T AA V AH
+actava's AE K T AA V AH Z
+actavas AE K T AA V AH Z
+acted AE K T AH D
+acted(2) AE K T IH D
+actel AE K T EH L
+actigall AE K T IH G AO L
+actin AE K T AH N
+acting AE K T IH NG
+actinide AE K T IH N AY D
+actinidia AE K T IH N IH D IY AH
+actinomycosis AE K T IH N OW M AY K OW S IH S
+action AE K SH AH N
+action's AE K SH AH N Z
+actionable AE K SH AH N AH B AH L
+actions AE K SH AH N Z
+activase AE K T IH V EY Z
+activate AE K T AH V EY T
+activated AE K T AH V EY T AH D
+activated(2) AE K T IH V EY T IH D
+activates AE K T AH V EY T S
+activating AE K T AH V EY T IH NG
+activation AE K T AH V EY SH AH N
+activator AE K T AH V EY T ER
+active AE K T IH V
+active's AE K T IH V Z
+actively AE K T IH V L IY
+actives AE K T IH V Z
+activision AE K T IH V IH ZH AH N
+activism AE K T IH V IH Z AH M
+activist AE K T AH V AH S T
+activist(2) AE K T IH V IH S T
+activists AE K T AH V AH S T S
+activists' AE K T IH V IH S T S
+activists'(2) AE K T IH V IH S
+activists(2) AE K T IH V IH S T S
+activists(3) AE K T AH V AH S
+activists(4) AE K T IH V IH S
+activities AE K T IH V AH T IY Z
+activities(2) AE K T IH V IH T IY Z
+activity AE K T IH V AH T IY
+activity(2) AE K T IH V IH T IY
+actmedia AE K T M IY D IY AH
+actodine AE K T OW D AY N
+acton AE K T AH N
+actor AE K T ER
+actor's AE K T ER Z
+actors AE K T ER Z
+actors' AE K T ER Z
+actress AE K T R AH S
+actress's AE K T R AH S IH Z
+actresses AE K T R AH S IH Z
+acts AE K T S
+acts(2) AE K S
+actual AE K CH AH W AH L
+actual(2) AE K SH AH L
+actuality AE K CH AH W AE L AH T IY
+actualize AE K CH AH W AH L AY Z
+actually AE K CH AH W AH L IY
+actually(2) AE K SH L IY
+actually(3) AE K CH L IY
+actually(4) AE K SH AH L IY
+actuarial AE K CH AH W EH R IY AH L
+actuaries AE K CH AH W EH R IY Z
+actuary AE K CH AH W EH R IY
+actuate AE K CH UW W EY T
+actuator AE K T Y UW EY T ER
+actuator(2) AE K CH UW EY T ER
+actuators AE K T Y UW EY T ER Z
+actuators(2) AE K CH UW EY T ER Z
+actus AE K T AH S
+acuff AH K AH F
+acuity AH K Y UW AH T IY
+acumen AH K Y UW M AH N
+acuna AA K UW N AH
+acupuncture AE K Y UW P AH NG K CH ER
+acura AE K Y ER AH
+acura's AE K Y ER AH Z
+acuras AE K Y ER AH Z
+acuson AE K Y UW S AH N
+acustar AE K Y UW S T AA R
+acusyst AE K Y UW S IH S T
+acute AH K Y UW T
+acutely AH K Y UW T L IY
+acuteness AH K Y UW T N AH S
+acyclovir AH S IH K L OW V IH R
+ad AE D
+ad's AE D Z
+ad-hoc AE D HH AA K
+ad-lib AE D L IH B
+ad-nauseum AE D N AO Z IY AH M
+ada EY D AH
+ada's EY D AH Z
+adabel AE D AH B EH L
+adabelle AE D AH B AH L
+adachi AA D AA K IY
+adage AE D AH JH
+adage(2) AE D IH JH
+adagio AH D AA ZH IY OW
+adah AE D AA
+adair AH D EH R
+adaire AA D EH R
+adak AH D AE K
+adalah AA D AA L AH
+adalia AA D AA L IY AH
+adam AE D AH M
+adam's AE D AH M Z
+adamant AE D AH M AH N T
+adamantly AE D AH M AH N T L IY
+adamcik AA D AH M CH IH K
+adamczak AA D AH M CH AE K
+adamczyk AA D AH M CH IH K
+adame AA D AA M IY
+adamec AH D AA M IH K
+adamek AH D AA M EH K
+adames AH D EY M Z
+adami AA D AA M IY
+adamik AH D AA M IH K
+adamina AA D AA M IY N AH
+adamkus AE D AH M K AH S
+adamo AA D AA M OW
+adamowicz AH D AA M AH V IH CH
+adams AE D AH M Z
+adams' AE D AH M Z
+adams's AE D AH M Z IH Z
+adamski AH D AE M S K IY
+adamson AE D AH M S AH N
+adamstown AE D AH M S T AW N
+adan EY D AH N
+adapso AH D AE P S OW
+adapt AH D AE P T
+adaptability AH D AE P T AH B IH L AH T IY
+adaptable AH D AE P T AH B AH L
+adaptaplex AH D AE P T AH P L EH K S
+adaptation AE D AH P T EY SH AH N
+adaptations AE D AE P T EY SH AH N Z
+adaptations(2) AE D AH P T EY SH AH N Z
+adaptec AH D AE P T EH K
+adaptec's AH D AE P T EH K S
+adapted AH D AE P T AH D
+adapted(2) AH D AE P T IH D
+adapter AH D AE P T ER
+adapters AH D AE P T ER Z
+adapting AH D AE P T IH NG
+adaptive AH D AE P T IH V
+adaptor AH D AE P T ER
+adaptors AH D AE P T ER Z
+adapts AH D AE P T S
+adar AH D AA R
+adarand AE D AH R AE N D
+adas EY D AH Z
+aday AH D EY
+adaza AH D AA Z AH
+adcock AH D K AA K
+adcox AH D K AA K S
+add AE D
+addair AH D EH R
+addams AE D AH M Z
+added AE D AH D
+added(2) AE D IH D
+addendum AH D EH D AH M
+addendums AH D EH D AH M Z
+addeo AA D IY OW
+adder AE D ER
+adderley AH D ER L IY
+addicks AE D IH K S
+addict AH D IH K T
+addict(2) AE D IH K T
+addicted AH D IH K T AH D
+addicted(2) AH D IH K T IH D
+addicting AH D IH K T IH NG
+addiction AH D IH K SH AH N
+addictions AH D IH K SH AH N Z
+addictive AH D IH K T IH V
+addicts AH D IH K T S
+addicts(2) AE D IH K T S
+addidas AH D IY D AH S
+addidas' AH D IY D AH S
+addidas's AH D IY D AH S IH Z
+addidases AH D IY D AH S IH Z
+addie AE D IY
+adding AE D IH NG
+addington AE D IH NG T AH N
+addis AA D IH S
+addis-ababa AA D IH S AH B AA B AH
+addis-ababa(2) AA D IY S AH B AA B AH
+addison AE D AH S AH N
+addison's AE D IH S AH N Z
+addison(2) AE D IH S AH N
+addition AH D IH SH AH N
+additional AH D IH SH AH N AH L
+additional(2) AH D IH SH N AH L
+additionally AH D IH SH AH N AH L IY
+additionally(2) AH D IH SH N AH L IY
+additions AH D IH SH AH N Z
+additive AE D AH T IH V
+additive(2) AE D IH T IH V
+additives AE D AH T IH V Z
+additives(2) AE D IH T IH V Z
+addle AE D AH L
+addled AE D AH L D
+addleman AE D AH L M AH N
+address AE D R EH S
+address(2) AH D R EH S
+addressable AH D R EH S AH B AH L
+addressed AH D R EH S T
+addressee AE D R EH S IY
+addresses AE D R EH S IH Z
+addresses(2) AH D R EH S IH Z
+addressing AH D R EH S IH NG
+adds AE D Z
+adduci AA D UW CH IY
+adduct AE D AH K T
+addwest AE D W EH S T
+addy AE D IY
+addyston AE D IY S T AH N
+ade EY D
+adee AH D IY
+adel AH D EH L
+adela AH D EH L AH
+adelaar AE D AH L AA R
+adelaide AE D AH L EY D
+adelanto AE D AH L AA N T OW
+adelbert AH D EH L B ER T
+adele AH D EH L
+adele's AH D EH L Z
+adeline AE D AH L AY N
+adelizzi AE D AH L IY Z IY
+adell AH D EH L
+adell's AH D EH L Z
+adelle AH D EH L
+adelman AE D AH L M AH N
+adelman(2) EH D AH L M AH N
+adelmann AE D AH L M AH N
+adelpha AH D EH L F AH
+adelphi AH D EH L F IY
+adelphia AH D EH L F IY AH
+adelphia's AH D EH L F IY AH Z
+adelsberger AE D IH L Z B ER G ER
+adelson AE D AH L S AH N
+adelstein AE D AH L S T AY N
+adelstein(2) AE D AH L S T IY N
+aden EY D AH N
+adena AE D IH N AH
+adenauer EY D AH N AW R
+adenauer(2) AE D AH N AW R
+adenine AE D AH N IY N
+adenoid AE D AH N OY D
+adenoids AE D AH N OY D Z
+adenoscan AH D EH N AH S K AE N
+adenosine AH D EH N AH S IY N
+adenovirus AH D EH N AH V AY R AH S
+adept AH D EH P T
+adequacy AE D AH K W AH S IY
+adequate AE D AH K W AH T
+adequate(2) AE D AH K W EY T
+adequately AE D AH K W AH T L IY
+adequately(2) AE D AH K W IH T L IY
+ader EY D ER
+aderhold AE D ER HH OW L D
+aderholt AE D ER HH OW L T
+aderman AE D ER M AH N
+ades EY D Z
+adey EY D IY
+adger AE JH ER
+adham AE D HH AE M
+adhere AH D HH IH R
+adhered AE D HH IH R D
+adherence AH D HH IH R AH N S
+adherent AH D HH IH R AH N T
+adherents AE D HH IH R AH N T S
+adheres AH D HH IH R Z
+adhering AH D HH IH R IH NG
+adhesion AE D HH IY ZH AH N
+adhesive AE D HH IY S IH V
+adhesive(2) AH D HH IY S IH V
+adhesives AE D HH IY S IH V Z
+adhesives(2) AH D HH IY S IH V Z
+adia AA D IY AH
+adid AH D IH D
+adidas AH D IY D AH S
+adidas's AH D IY D AH S IH Z
+adieu AH D UW
+adin AH D IH N
+adina AA D IY N AH
+adine AA D IY N IY
+adinolfi AA D IY N OW L F IY
+adios AA D IY OW S
+adipose AE D AH P OW S
+adirondack AE D ER AA N D AE K
+adisq AH D IH S K
+adisq(2) EY D IH S K
+adjacent AH JH EY S AH N T
+adjani AE D JH AA N IY
+adjective AE JH IH K T IH V
+adjectives AE JH IH K T IH V Z
+adjoin AH JH OY N
+adjoining AH JH OY N IH NG
+adjoins AH JH OY N Z
+adjourn AH JH ER N
+adjourned AH JH ER N D
+adjourning AH JH ER N IH NG
+adjournment AH JH ER N M AH N T
+adjourns AH JH ER N Z
+adjudge AH JH AH JH
+adjudged AH JH AH JH D
+adjudicate AH JH UW D IH K EY T
+adjudicated AH JH UW D AH K EY T IH D
+adjudicating AH JH UW D IH K EY T IH NG
+adjudication AH JH UW D AH K EY SH AH N
+adjunct AE JH AH NG K T
+adjuncts AE JH AH NG K T S
+adjust AH JH AH S T
+adjustable AH JH AH S T AH B AH L
+adjustables AH JH AH S T AH B AH L Z
+adjusted AH JH AH S T AH D
+adjusted(2) AH JH AH S T IH D
+adjuster AH JH AH S T ER
+adjusters AH JH AH S T ER Z
+adjusting AH JH AH S T IH NG
+adjustment AH JH AH S T M AH N T
+adjustments AH JH AH S T M AH N T S
+adjusts AH JH AH S T S
+adjusts(2) AH JH AH S
+adjutant AE JH AH T AH N T
+adkins AE D K IH N Z
+adkinson AE D K IH N S AH N
+adkison AE D K IH S AH N
+adkisson AE D K IH S AH N
+adl-tabataba AA D AH L T AA B AH T AA B AH
+adl-tabatabai AA D AH L T AA B AH T AH B AY
+adlai AA D L AA IY
+adler AE D L ER
+adler's AE D L ER Z
+adlers AE D L ER Z
+adley AE D L IY
+adlon AE D L AA N
+adlong AE D L AO NG
+adman AE D M AH N
+admen AE D M AH N
+administer AH D M IH N AH S T ER
+administered AH D M IH N AH S T ER D
+administering AE D M IH N IH S T ER IH NG
+administers AE D M IH N IH S T ER Z
+administrate AE D M IH N IH S T R EY T
+administrating AH D M IH N AH S T R EY T IH NG
+administration AE D M IH N IH S T R EY SH AH N
+administration's AE D M IH N IH S T R EY SH AH N Z
+administrations AE D M IH N IH S T R EY SH AH N Z
+administrations' AE D M IH N IH S T R EY SH AH N Z
+administrative AH D M IH N AH S T R EY T IH V
+administratively AE D M IH N AH S T R EY T IH V L IY
+administrator AH D M IH N AH S T R EY T ER
+administrator's AE D M IH N IH S T R EY T ER Z
+administrators AE D M IH N IH S T R EY T ER Z
+administrators' AE D M IH N AH S T R EY T ER Z
+admira AE D M AY R AH
+admira's AE D M AY R AH Z
+admirable AE D M ER AH B AH L
+admirable(2) AE D M R AH B AH L
+admirably AE D M ER AH B L IY
+admiral AE D M ER AH L
+admiral's AE D M ER AH L Z
+admirals AE D M ER AH L Z
+admiralty AE D M ER AH L T IY
+admiration AE D M ER EY SH AH N
+admirations AE D M ER EY SH AH N Z
+admire AE D M AY R
+admired AH D M AY ER D
+admirer AE D M AY R ER
+admirers AH D M AY R ER Z
+admires AE D M AY R Z
+admiring AE D M AY R IH NG
+admiringly AE D M AY R IH NG L IY
+admissibility AH D M IH S AH B IH L AH T IY
+admissible AH D M IH S AH B AH L
+admission AE D M IH SH AH N
+admission(2) AH D M IH SH AH N
+admissions AE D M IH SH AH N Z
+admissions(2) AH D M IH SH AH N Z
+admit AH D M IH T
+admits AH D M IH T S
+admittance AH D M IH T AH N S
+admitted AH D M IH T AH D
+admittedly AE D M IH T IH D L IY
+admitting AE D M IH T IH NG
+admitting(2) AH D M IH T IH NG
+admonish AE D M AA N IH SH
+admonished AH D M AA N IH SH T
+admonishes AE D M AA N IH SH IH Z
+admonishing AE D M AA N IH SH IH NG
+admonishment AE D M AA N IH SH M EH N T
+admonition AE D M AH N IH SH AH N
+admonitions AE D M AH N IH SH AH N Z
+adnan AE D N AH N
+adney AE D N IY
+ado AH D UW
+adobe AH D OW B IY
+adobe's AH D OW B IY Z
+adolescence AE D AH L EH S AH N S
+adolescence(2) AE D OW L EH S AH N S
+adolescent AE D AH L EH S AH N T
+adolescent(2) AE D OW L EH S AH N T
+adolescents AE D AH L EH S AH N T S
+adolescents(2) AE D OW L EH S AH N T S
+adolf EY D AA L F
+adolf's EY D AA L F S
+adolfo AH D AA L F OW
+adolph EY D AO L F
+adolpha AA D OW L F AH
+adolphson AE D OW L F S AH N
+adolphus AH D AO L F AH S
+adon AA D AO N
+adonia AA D OW N IY AH
+adonis AH D AA N AH S
+adopt AH D AA P T
+adoptable AH D AA P T AH B AH L
+adopted AH D AA P T AH D
+adoptee AH D AA P T IY
+adoptees AH D AA P T IY Z
+adopter AH D AA P T ER
+adopters AH D AA P T ER Z
+adopting AH D AA P T IH NG
+adoption AH D AA P SH AH N
+adoptions AH D AA P SH AH N Z
+adoptive AH D AA P T IH V
+adopts AH D AA P T S
+ador AA D AO R
+adora AA D AO R AH
+adorabelle AE D ER AH B AH L
+adorable AH D AO R AH B AH L
+adoration AE D ER EY SH AH N
+adore AH D AO R
+adored AH D AO R D
+adoree AE D ER IY
+adorees AE D ER IY Z
+adores AH D AO R Z
+adoring AH D AO R IH NG
+adorn AH D AO R N
+adorna AA D AO R N AH
+adorned AH D AO R N D
+adorning AH D AO R N IH NG
+adornment AH D AO R N M AH N T
+adorno AA D AO R N OW
+adorns AH D AO R N Z
+adra EY D R AH
+adragna AA D R AA G N AH
+adrda EY D ER D AH
+adrea AA D R IY AH
+adrenal AH D R IY N AH L
+adrenalin AH D R EH N AH L IH N
+adrenaline AH D R EH N AH L AH N
+adria AA D R IY AH
+adrian EY D R IY AH N
+adriana EY D R IY AE N AH
+adriance AA D R IY AH N S
+adriano AA D R IY AA N OW
+adriatic EY D R IY AE T IH K
+adriel AH D R IY L
+adrienne AA D R IY EH N
+adrift AH D R IH F T
+adroit AH D R OY T
+adroitly AH D R OY T L IY
+ads AE D Z
+ads' AE D Z
+adsit AE D S IH T
+adss AE D S
+adss(2) EY D IY EH S EH S
+adstar AE D S T AA R
+adsteam AE D S T IY M
+adtec AE D T EH K
+adulate AE JH AH L EY T
+adulation AE JH AH L EY SH AH N
+aduliadae AH D UW L IY AA D EY
+adult AH D AH L T
+adult(2) AE D AH L T
+adulterate AH D AH L T ER EY T
+adulterated AH D AH L T ER EY T IH D
+adulterates AH D AH L T ER EY T S
+adulteration AH D AH L T ER EY SH AH N
+adulterer AH D AH L T ER ER
+adulterers AH D AH L T ER ER Z
+adulterous AH D AH L T ER AH S
+adultery AH D AH L T ER IY
+adulthood AH D AH L T HH UH D
+adults AH D AH L T S
+adults' AH D AH L T S
+adults'(2) AE D AH L T S
+adults(2) AE D AH L T S
+adusdur AE D AH S D ER
+advacare AE D V AH K EH R
+advalue AE D V AH L UW
+advance AH D V AE N S
+advance's AH D V AE N S AH Z
+advance's(2) AH D V AE N S IH Z
+advanced AH D V AE N S T
+advancement AH D V AE N S M AH N T
+advancements AH D V AE N S M AH N T S
+advancer AH D V AE N S ER
+advancers AH D V AE N S ER Z
+advances AH D V AE N S AH Z
+advances(2) AH D V AE N S IH Z
+advancing AH D V AE N S IH NG
+advani AE D V AA N IY
+advanta AE D V AE N T AH
+advanta's AE D V AE N T AH Z
+advanta's(2) AH D V AE N T AH Z
+advanta(2) AH D V AE N T AH
+advantage AE D V AE N T IH JH
+advantage(2) AH D V AE N T IH JH
+advantage(3) AE D V AE N IH JH
+advantage(4) AH D V AE N AH JH
+advantaged AE D V AE N T IH JH D
+advantaged(2) AH D V AE N T IH JH D
+advantaged(3) AE D V AE N IH JH D
+advantaged(4) AH D V AE N IH JH D
+advantageous AE D V AH N T EY JH AH S
+advantages AE D V AE N T IH JH IH Z
+advantages(2) AH D V AE N T IH JH IH Z
+advantages(3) AE D V AE N IH JH IH Z
+advantages(4) AH D V AE N IH JH IH Z
+advantest AE D V AE N T AH S T
+advantest(2) AH D V AE N T AH S T
+advection AE D V EH K SH AH N
+advent AE D V EH N T
+adventist AE D V EH N T IH S T
+adventists AE D V EH N T IH S T S
+adventists(2) AE D V EH N T IH S
+adventure AE D V EH N CH ER
+adventure(2) AH D V EH N CH ER
+adventurer AE D V EH N CH ER ER
+adventurer(2) AH D V EH N CH ER ER
+adventurers AE D V EH N CH ER ER Z
+adventurers(2) AH D V EH N CH ER ER Z
+adventures AE D V EH N CH ER Z
+adventures(2) AH D V EH N CH ER Z
+adventuresome AE D V EH N CH ER S AH M
+adventuresome(2) AH D V EH N CH ER S AH M
+adventurism AE D V EH N CH ER IH Z AH M
+adventurism(2) AH D V EH N CH ER IH Z AH M
+adventurous AE D V EH N CH ER AH S
+adventurous(2) AH D V EH N CH ER AH S
+adverb AE D V ER B
+adverbial AE D V ER B IY AH L
+adverbs AE D V ER B Z
+adversarial AE D V ER S EH R IY AH L
+adversaries AE D V ER S EH R IY Z
+adversary AE D V ER S EH R IY
+adverse AE D V ER S
+adverse(2) AH D V ER S
+adversely AE D V ER S L IY
+adversity AE D V ER S IH T IY
+adversity(2) AH D V ER S IH T IY
+advertise AE D V ER T AY Z
+advertised AE D V ER T AY Z D
+advertisement AH D V ER T AH Z M AH N T
+advertisement(2) AE D V ER T AY Z M AH N T
+advertisements AE D V ER T AY Z M AH N T S
+advertiser AE D V ER T AY Z ER
+advertiser's AE D V ER T AY Z ER Z
+advertisers AE D V ER T AY Z ER Z
+advertisers' AE D V ER T AY Z ER Z
+advertises AE D V ER T AY Z IH Z
+advertising AE D V ER T AY Z IH NG
+advertising's AE D V ER T AY Z IH NG Z
+advertorial AE D V ER T AO R IY AH L
+advertorials AE D V ER T AO R IY AH L Z
+advest AE D V EH S T
+advice AE D V AY S
+advice(2) AH D V AY S
+advil AE D V IH L
+advil's AE D V IH L Z
+advisability AE D V AY Z AH B IH L IH T IY
+advisable AH D V AY Z AH B AH L
+advise AE D V AY Z
+advise(2) AH D V AY Z
+advised AE D V AY Z D
+advised(2) AH D V AY Z D
+advisedly AE D V AY Z AH D L IY
+advisedly(2) AH D V AY Z AH D L IY
+advisement AH D V AY Z M AH N T
+adviser AE D V AY Z ER
+adviser's AH D V AY Z ER Z
+advisers AE D V AY Z ER Z
+advisers' AE D V AY Z ER Z
+advises AE D V AY Z IH Z
+advising AE D V AY Z IH NG
+advisor AE D V AY Z ER
+advisor(2) AH D V AY Z ER
+advisories AH D V AY Z ER IY Z
+advisors AE D V AY Z ER Z
+advisors(2) AH D V AY Z ER Z
+advisory AE D V AY Z ER IY
+advisory(2) AH D V AY Z ER IY
+advo AE D V OW
+advocacy AE D V AH K AH S IY
+advocate AE D V AH K AH T
+advocate's AE D V AH K AH T S
+advocate(2) AE D V AH K EY T
+advocated AE D V AH K EY T AH D
+advocated(2) AE D V AH K EY T IH D
+advocates AE D V AH K AH T S
+advocates(2) AE D V AH K EY T S
+advocating AE D V AH K EY T IH NG
+advocation AE D V AH K EY SH AH N
+adweek AE D W IY K
+adwell AH D W EH L
+ady EY D IY
+adz AE D Z
+ae EY
+aegean IH JH IY AH N
+aegerter EH G ER T ER
+aegis IY JH AH S
+aegon EY G AA N
+aeltus AE L T AH S
+aeneas AE N IY AH S
+aeneid AH N IY IH D
+aequitron EY K W IH T R AA N
+aer EH R
+aer(2) EY IY AA R
+aerial EH R IY AH L
+aerials EH R IY AH L Z
+aerie EH R IY
+aerien EH R IY AH N
+aeriens EH R IY AH N Z
+aeritalia EH R IH T AE L Y AH
+aero EH R OW
+aerobatic EH R AH B AE T IH K
+aerobatics EH R AH B AE T IH K S
+aerobic EH R OW B IH K
+aerobically EH R OW B IH K L IY
+aerobics ER OW B IH K S
+aerodrome EH R AH D R OW M
+aerodromes EH R AH D R OW M Z
+aerodynamic EH R OW D AY N AE M IH K
+aerodynamically EH R OW D AY N AE M IH K L IY
+aerodynamicist EH R OW D AY N AE M IH S IH S T
+aerodynamicists EH R OW D AY N AE M IH S IH S T S
+aerodynamicists(2) EH R OW D AY N AE M IH S IH S
+aerodynamics EH R OW D AY N AE M IH K S
+aerodyne EH R AH D AY N
+aerodyne's EH R AH D AY N Z
+aeroflot EH R OW F L AA T
+aeroflot's EH R OW F L AA T S
+aerogenosa EH R AH JH AH N OW S AH
+aerojet EH R OW JH EH T
+aerojets EH R OW JH EH T S
+aerolift EH R OW L IH F T
+aerolifts EH R OW L IH F T S
+aerolineas EH R OW L IH N IY AH S
+aeromar EH R AH M AA R
+aeromar(2) EH R OW M AA R
+aeromexico EH R OW M EH K S IH K OW
+aeromexico's EH R OW M EH K S IH K OW Z
+aeronautic EH R OW N AA T AH K
+aeronautical EH R OW N AA T AH K AH L
+aeronautical(2) EH R AH N AA T AH K AH L
+aeronauticas EH R OW N AO T IH K AH S
+aeronautics EH R AH N AO T IH K S
+aeroperu EH R OW P EY R UW
+aeroperu's EH R OW P EY R UW Z
+aeroquip EH R AH K W IH P
+aerosmith EH R OW S M IH TH
+aerosmith's EH R OW S M IH TH S
+aerosol EH R AH S AA L
+aerosols EH R AH S AA L Z
+aerospace EH R OW S P EY S
+aerospace's EH R OW S P EY S IH Z
+aerospatiale EH R OW S P AA S IY AA L
+aerospatiale's EH R OW S P AA S IY AA L Z
+aerostar EH R OW S T AA R
+aerostar's EH R OW S T AA R Z
+aerostars EH R OW S T AA R Z
+aerostat EH R OW S T AE T
+aerostat's EH R OW S T AE T S
+aerostats EH R OW S T AE T S
+aerotech EH R OW T EH K
+aerovias EH R OW V IY AH Z
+aerts EH R T S
+aeschelus EH S K AH L AH S
+aeschliman EH SH L IY M AH N
+aesop IY S AA P
+aesop's IY S AA P S
+aesthenopia AE S TH AH N AO P Y AH
+aesthete EH S TH IY T
+aesthete's EH S TH IY T S
+aesthetes EH S TH IY T S
+aesthetic EH S TH EH T IH K
+aesthetically EH S TH EH T IH K L IY
+aesthetics EH S TH EH T IH K S
+aetna EH T N AH
+aetna's EH T N AH Z
+afanasyev AE F AH N EY S IY EH V
+afar AH F AA R
+affable AE F AH B AH L
+affably AE F AH B L IY
+affair AH F EH R
+affair's AH F EH R Z
+affairs AH F EH R Z
+affect AH F EH K T
+affectation AE F EH K T EY SH AH N
+affected AH F EH K T AH D
+affected(2) AH F EH K T IH D
+affecting AH F EH K T IH NG
+affection AH F EH K SH AH N
+affectionate AH F EH K SH AH N AH T
+affectionate(2) AH F EH K SH AH N IH T
+affectionately AH F EH K SH AH N AH T L IY
+affections AH F EH K SH AH N Z
+affective AH F EH K T IH V
+affectively AH F EH K T IH V L IY
+affects AH F EH K T S
+affeldt AE F IH L T
+afferent AE F ER AH N T
+affiant AE F IY AH N T
+affidavit AE F AH D EY V AH T
+affidavits AE F IH D EY V IH T S
+affiliate AH F IH L IY EY T
+affiliate's AH F IH L IY EY T S
+affiliate(2) AH F IH L IY AH T
+affiliated AH F IH L IY EY T AH D
+affiliated's AH F IH L IY EY T IH D Z
+affiliated(2) AH F IH L IY EY T IH D
+affiliates AH F IH L IY AH T S
+affiliates' AH F IH L IY IH T S
+affiliates(2) AH F IH L IY EY T S
+affiliating AH F IH L IY EY T IH NG
+affiliation AH F IH L IY EY SH AH N
+affiliations AH F IH L IY EY SH AH N Z
+affine AH F AY N
+affined AH F AY N D
+affines AH F AY N Z
+affining AH F AY N IH NG
+affinities AH F IH N AH T IY Z
+affinity AH F IH N AH T IY
+affinity(2) AH F IH N IH T IY
+affirm AH F ER M
+affirmation AE F ER M EY SH AH N
+affirmations AE F ER M EY SH AH N Z
+affirmative AH F ER M AH T IH V
+affirmatively AH F ER M AH T IH V L IY
+affirmed AH F ER M D
+affirming AH F ER M IH NG
+affirms AH F ER M Z
+affix AE F IH K S
+affix(2) AH F IH K S
+affixed AH F IH K S T
+affixes AE F IH K S IH Z
+affixes(2) AH F IH K S IH Z
+affixing AH F IH K S IH NG
+affleck AE F L IH K
+afflerbach AE F L ER B AA K
+afflict AH F L IH K T
+afflicted AH F L IH K T AH D
+afflicted(2) AH F L IH K T IH D
+afflicting AH F L IH K T IH NG
+affliction AH F L IH K SH AH N
+afflictions AH F L IH K SH AH N Z
+afflicts AH F L IH K T S
+afflik AE F L IH K
+affluence AE F L UW AH N S
+affluent AE F L UW AH N T
+affolter AE F OW L T ER
+afford AH F AO R D
+affordability AH F AO R D AH B IH L AH T IY
+affordable AH F AO R D AH B AH L
+affordably AH F AO R D AH B L IY
+afforded AH F AO R D AH D
+affording AH F AO R D IH NG
+affords AH F AO R D Z
+affricate AE F R AH K AH T
+affricates AE F R AH K AH T S
+affrication AE F R AH K EY SH AH N
+affront AH F R AH N T
+affronted AH F R AH N T IH D
+affronting AH F R AH N T IH NG
+affronts AH F R AH N T S
+affymax AE F IY M AE K S
+afghan AE F G AE N
+afghani AE F G AA N IY
+afghani's AE F G AE N IY Z
+afghanis AE F G AE N IY Z
+afghanistan AE F G AE N AH S T AE N
+afghanistan's AE F G AE N AH S T AE N Z
+afghanistans AE F G AE N AH S T AE N Z
+afghans AE F G AE N Z
+afheldt AE F EH L T
+aficionado AH F IY SH Y AH N AA D OW
+aficionados AH F IH SH AH N AA D OW Z
+afield AH F IY L D
+afire AH F AY R
+aflame AH F L EY M
+aflatoxin AE F L AH T AA K S IH N
+afloat AH F L OW T
+aflutter AH F L AH T ER
+afmed AE F M EH D
+afonso AH F AA N S OW
+afoot AH F UH T
+aforementioned AH F AO R M EH N SH AH N D
+aforesaid AH F AO R S EH D
+aforethought AH F AO R TH AA T
+afoul AH F AW L
+afraid AH F R EY D
+afresh AH F R EH SH
+africa AE F R AH K AH
+africa's AE F R AH K AH Z
+africa's(2) AE F R IH K AH Z
+africa(2) AE F R IH K AH
+africa(3) AE F ER K AH
+african AE F R AH K AH N
+african(2) AE F R IH K AH N
+africanist AE F R IH K AH N IH S T
+africanize AE F R AH K AH N AY Z
+africanized AE F R AH K AH N AY Z D
+africans AE F R AH K AH N Z
+africans(2) AE F R IH K AH N Z
+afridi AH F R IY D IY
+afrikaans AE F R AH K AA N Z
+afrikaner AE F R AH K AA N ER
+afrikanerdom AE F R AH K AA N ER D AH M
+afrikaners AE F R IH K AA N ER Z
+afro AE F R OW
+afroamerican AE F R OW AH M EH R AH K AH N
+afroamericans AE F R OW AH M EH R AH K AH N Z
+afrocentric AE F R OW S EH N T R IH K
+afsane AA F S AA N EY
+afsane's AA F S AA N EY Z
+afshar AE F SH ER
+afshar's AE F SH ER Z
+aft AE F T
+after AE F T ER
+afterall AE F T ER AA L
+afterburner AE F T ER B ER N ER
+afterburners AE F T ER B ER N ER Z
+aftereffect AE F T ER AH F EH K T
+aftereffects AE F T ER AH F EH K T S
+afterglow AE F T ER G L OW
+afterglows AE F T ER G L OW Z
+afterhours AE F T ER HH AW ER Z
+afterimage AE F T ER IH M IH JH
+afterimages AE F T ER IH M IH JH AH Z
+afterlife AE F T ER L AY F
+afterlives AE F T ER L AY V Z
+aftermarket AE F T ER M AA R K IH T
+aftermarkets AE F T ER M AA R K IH T S
+aftermath AE F T ER M AE TH
+aftermaths AE F T ER M AE TH S
+afternoon AE F T ER N UW N
+afternoon's AE F T ER N UW N Z
+afternoons AE F T ER N UW N Z
+aftershave AE F T ER SH EY V
+aftershaves AE F T ER SH EY V Z
+aftershock AE F T ER SH AA K
+aftershocks AE F T ER SH AA K S
+aftertaste AE F T ER T EY S T
+aftertastes AE F T ER T EY S T S
+aftertastes(2) AE F T ER T EY S
+aftertax AE F T ER T AE K S
+afterthought AE F T ER TH AA T
+afterthought(2) AE F T ER TH AO T
+afterthoughts AE F T ER TH AA T S
+afterthoughts(2) AE F T ER TH AO T S
+afterward AE F T ER W ER D
+afterwards AE F T ER W ER D Z
+afula AH F UW L AH
+afula's AH F UW L AH Z
+ag AE G
+ag's AE G Z
+ag(2) EY G IY
+aga AA G AH
+agache AE G AE CH
+agache's AE G AE CH AH Z
+agaches AE G AE CH AH Z
+again AH G EH N
+again(2) AH G EY N
+against AH G EH N S T
+against(2) AH G EY N S T
+agamemnon AE G AH M EH M N AA N
+agamemnon's AE G AH M EH M N AA N Z
+agan EY G AH N
+agana AH G AA N AH
+aganbegyan AE G AH N B EH G Y AH N
+agans AA G AA N Z
+agape AH G EY P
+agar EY G ER
+agard AE G ER D
+agarwal AA G AA R W AA L
+agasp AH G AE S P
+agassi AE G AH S IY
+agassiz AH G AE S IH Z
+agate AE G AH T
+agates AE G AH T S
+agatha AE G AH TH AH
+agawam AE G AH W AA M
+agco AE G K OW
+age EY JH
+age's EY JH IH Z
+aged EY JH D
+aged(2) EY JH IH D
+agee EY JH IY
+agee's EY JH IY Z
+ageless EY JH L AH S
+agematsu AE G AH M AE T S UW
+agence AE JH AH N S
+agencies EY JH AH N S IY Z
+agencies' EY JH AH N S IY Z
+agency EY JH AH N S IY
+agency's EY JH AH N S IY Z
+agenda AH JH EH N D AH
+agendas AH JH EH N D AH Z
+agent EY JH AH N T
+agent's EY JH AH N T S
+agents EY JH AH N T S
+agents' EY JH AH N T S
+ager EY JH ER
+ageratum AH JH EH R AH T AH M
+ageratums AH JH EH R AH T AH M Z
+agers EY JH ER Z
+agers' EY JH ER Z
+agerton EY G ER T AH N
+ages EY JH AH Z
+ages(2) EY JH IH Z
+agfa AE G F AH
+aggarwal AH G AA R W AH L
+aggie AE G IY
+aggies AE G IY Z
+agglomerate AH G L AA M ER EY T
+agglomeration AH G L AA M ER EY SH AH N
+agglutinate AH G L UW T IH N EY T
+aggrandize AH G R AE N D AY Z
+aggrandizement AE G R AH N D AY Z M AH N T
+aggrandizement(2) AH G R AE N D AY Z M AH N T
+aggrandizing AE G R AH N D AY Z IH NG
+aggrandizing(2) AH G R AE N D AY Z IH NG
+aggravate AE G R AH V EY T
+aggravated AE G R AH V EY T AH D
+aggravated(2) AE G R AH V EY T IH D
+aggravates AE G R AH V EY T S
+aggravating AE G R AH V EY T IH NG
+aggravation AE G R AH V EY SH AH N
+aggregate AE G R AH G AH T
+aggregate(2) AE G R AH G IH T
+aggregate(3) AE G R AH G EY T
+aggregated AE G R AH G EY T AH D
+aggregates AE G R AH G IH T S
+aggregates(2) AE G R AH G EY T S
+aggress AH G R EH S
+aggression AH G R EH SH AH N
+aggressions AH G R EH SH AH N Z
+aggressive AH G R EH S IH V
+aggressively AH G R EH S IH V L IY
+aggressiveness AH G R EH S IH V N AH S
+aggressivity AH G R EH S IH V IH T IY
+aggressor AH G R EH S ER
+aggressors AH G R EH S ER Z
+aggrey AE G R EY
+aggrieve AH G R IY V
+aggrieved AH G R IY V D
+aggy AE G IY
+aghast AH G AE S T
+aghazadeh AE G AH Z AA D EH
+agie AE G IY
+agildo AH G IH L D OW
+agile AE JH AH L
+agilis AH JH IH L AH S
+agility AH JH IH L AH T IY
+agin AA JH IY N
+agincourt AE JH AH N K AO R T
+aging EY JH IH NG
+agins EY G IH N Z
+agip EY G IH P
+agitate AE JH AH T EY T
+agitated AE JH AH T EY T AH D
+agitating AE JH AH T EY T IH NG
+agitation AE JH AH T EY SH AH N
+agitator AE JH AH T EY T ER
+agitators AE JH IH T EY T ER Z
+agitprop AE JH AH T P R AO P
+agius EY JH IY IH S
+agleam AH G L IY M
+agler AE G L ER
+aglitter AH G L IH T ER
+aglo AH G L OW
+aglow AH G L OW
+agna AE G N AA
+agne AE G N IH
+agnella AE G N EH L AH
+agnelli AE G N EH L IY
+agnelli's AE G N EH L IY Z
+agnellis AE G N EH L IY Z
+agnello AE G N EH L OW
+agner AE G N ER
+agnes AE G N IH S
+agneta AA G N EH T AH
+agnew AE G N UW
+agnew(2) AE G N Y UW
+agnico AE G N IH K OW
+agnor AE G N ER
+agnos AE G N OW S
+agnosio AE G N OW S IY OW
+agnostic AE G N AA S T IH K
+agnostics AE G N AA S T IH K S
+ago AH G OW
+agog AH G AA G
+agoglia AH G AA G L IY AH
+agonies AE G AH N IY Z
+agonist AE G AH N IH S T
+agonists AE G AH N IH S T S
+agonists(2) AE G AH N IH S
+agonize AE G AH N AY Z
+agonized AE G AH N AY Z D
+agonizes AE G AH N AY Z IH Z
+agonizing AE G AH N AY Z IH NG
+agonizingly AE G AH N AY Z IH NG L IY
+agony AE G AH N IY
+agora AE G ER AH
+agoraphobia AH G AO R AH F OW B IY AH
+agosta AA G OW S T AH
+agostinelli AA G OW S T IY N EH L IY
+agostini AA G OW S T IY N IY
+agostino AA G AO S T IY N OW
+agosto AA G OW S T OW
+agoura AH G UW R AH
+agouron AH G UW R AA N
+agra AE G R AH
+agrarian AH G R EH R IY AH N
+agrarianism AH G R EH R IY AH N IH Z AH M
+agrawal AH G R AE W AH L
+agree AH G R IY
+agreeable AH G R IY AH B AH L
+agreed AH G R IY D
+agreeing AH G R IY IH NG
+agreement AH G R IY M AH N T
+agreement's AH G R IY M AH N T S
+agreements AH G R IY M AH N T S
+agrees AH G R IY Z
+agregable AH G R EH JH AH B AH L
+agregious AH G R IY JH IY AH S
+agresource AA G R EH S AO R S
+agresource(2) AE G R AH S AO R S
+agresta AA G R EH S T AH
+agresti AA G R EH S T IY
+agrexco AA G R EH K S K OW
+agri AE G R IY
+agribank AE G R IH B AE NG K
+agribusiness AE G R AH B IH Z N AH S
+agrico AH G R IY K OW
+agricola AE G R IH K OW L AH
+agricole AE G R IH K OW L
+agricultural AE G R AH K AH L CH ER AH L
+agricultural(2) AE G R IH K AH L CH ER AH L
+agriculturalist AE G R AH K AH L CH ER AH L AH S T
+agriculturally AE G R IH K AH L CH ER AH L IY
+agriculturally(2) AE G R IH K AH L CH R AH L IY
+agriculture AE G R IH K AH L CH ER
+agriculture's AE G R IH K AH L CH ER Z
+agrifuel AE G R AH F Y UW L
+agrifuels AE G R AH F Y UW L Z
+agrigenetics AE G R AH JH AH N EH T IH K S
+agrippa AH G R IH P AH
+agrivisor AE G R AH V AY Z ER
+agro AE G R OW
+agrochemical AE G R OW K EH M AH K AH L
+agrochemicals AE G R OW K EH M IH K AH L Z
+agroindustrial AE G R OW IH D AH S T R IY AH L
+agrokomerc AE G R AH K OW M ER K
+agronomist AH G R AA N AH M IH S T
+agronomists AH G R AA N AH M IH S T S
+agronomists(2) AH G R AA N AH M IH S
+agrosiand AH G R OW S IY AH N D
+aground AH G R AW N D
+agrusa AA G R UW S AH
+agua AA G W AH
+aguacate AE G W AH K EY T
+aguadilla AA G W AH D IH L AH
+aguado AA G W AA D OW
+aguanga AH G W AA N G AH
+aguascalientes AA G W AH S K AE L Y EH N T EH S
+aguayo AA G W EY OW
+agudelo AA G UW D EY L OW
+aguero AA G EH R OW
+aguiar AA G W IY ER
+aguila AA G W IY L AH
+aguilar AE G AH L AA R
+aguilera AA G W IY L EH R AH
+aguillar AE G AH L AA R
+aguillard AE G IH L ER D
+aguillon AA G W IY L AO N
+aguilo AH G W IY L OW
+aguinaga AA G UW IY N AA G AH
+aguirra AH G W IH R AH
+aguirra's AH G W IH R AH Z
+aguirre AA G W IH R EY
+aguirre's AA G W IH R EY Z
+aguirre's(2) AH G W IH R EY Z
+aguirre(2) AH G W IH R EY
+agustin AH G AO S T IH N
+ah AA
+aha AA HH AA
+ahab EY HH AE B
+ahah AA HH AA
+aharon AE HH ER AA N
+ahart AH HH AA R T
+ahasuerus AH HH AE SH AH W EH R AH S
+ahaulsie AH HH AA L S IY
+ahead AH HH EH D
+ahearn AH HH ER N
+aherin AA ER IH N
+ahern AH HH ER N
+aherne AH HH ER N
+ahh AA
+ahl AA L
+ahlberg AA L B ER G
+ahlborn AA L B ER N
+ahlen AH L EY N
+ahlen(2) AA L AH N
+ahlers AA L ER Z
+ahles EY AH L Z
+ahlf AA L F
+ahlgren AA L G R EH N
+ahlgrim AA L G R IH M
+ahlin AA L IH N
+ahlman AA L M AH N
+ahlquist AA L K W IH S T
+ahlquist's AA L K W IH S T S
+ahlquists AA L K W IH S T S
+ahlstrand AA L S T R AH N D
+ahlstrom AA L S T R AH M
+ahluwalia AH L UW AA L Y AH
+ahmad AA M AA D
+ahmadi AA M AA D IY
+ahmann AA M AH N
+ahmanson AA M AH N S AH N
+ahmanson's AA M AH N S AH N Z
+ahmansons AA M AH N S AH N Z
+ahmed AA M AH D
+ahmed(2) AA M EH D
+ahmeek AH M IY K
+ahmoudi AA M UW D IY
+ahn AE N
+ahnell AA N EH L
+ahner AA N ER
+aho AA HH OW
+ahola AE HH AH L AH
+ahold AH HH OW L D
+ahold's AH HH OW L D Z
+aholds AH HH OW L D Z
+ahonen AH HH OW N AH N
+ahoskie AH HH AO S K IY
+ahoy AH HH OY
+ahr AA R
+ahranat AH R AA N AH T
+ahren AA R AH N
+ahrendt AA R IH N T
+ahrens AA R IH N Z
+ahs AA Z
+ahsahka AA S AA K AH
+ahuja AA HH UW Y AH
+ahumada AA Y UW M AA D AH
+ahwahnee AH W AA N IY
+ai AY
+ai(2) EY AY
+aichele AY K AH L
+aicher AY K ER
+aichi AA IY CH IY
+aickin EY K IH N
+aid EY D
+aid's EY D Z
+aida AY IY D AH
+aidan EY D AA N
+aide EY D
+aide's EY D Z
+aided EY D AH D
+aided(2) EY D IH D
+aides EY D Z
+aides' EY D Z
+aidid AY D IY D
+aidid's AY D IY D Z
+aiding EY D IH NG
+aids EY D Z
+aiello AY EH L OW
+aiesha AY SH AH
+aigner EY N ER
+aigner(2) EH N Y EY
+aigner(3) EY K N ER
+aiguebelle AY G AH B EH L
+aiken EY K IH N
+aikens EY K IH N Z
+aikey EY K IY
+aikin EY K IH N
+aikins AY K IH N Z
+aikman EY K M AH N
+aikoff AY K AO F
+ail EY L
+ailee EY L IY
+aileen AY L IY N
+aileron EY L ER AA N
+ailerons EY L ER AA N Z
+ailes AY L Z
+ailes(2) EY L Z
+ailey EY L IY
+ailing EY L IH NG
+ailment EY L M AH N T
+ailments EY L M AH N T S
+ailor EY L ER
+ails EY L Z
+ailsa EY L S AH
+ailurophile EY L UH R AH F AY L
+ailurophile(2) EY L UH R AH F AY AH L
+aim EY M
+aim's EY M Z
+aimal AY M AH L
+aiman AY M AH N
+aime EY M
+aimed EY M D
+aimee EY M IY
+aimetti EY M EH T IY
+aiming EY M IH NG
+aimless EY M L AH S
+aimlessly EY M L AH S L IY
+aimone EY M OW N
+aims EY M Z
+ain't EY N T
+aine EY N
+ainge EY NG
+ainge(2) EY N JH
+ainley EY N L IY
+ainsberg EY N Z B ER G
+ainsley EY N S L IY
+ainslie EY N Z L IY
+ainsworth EY N S W ER TH
+ainsworth's EY N Z W ER TH S
+aipac AY P AE K
+aipac's AY P AE K S
+air EH R
+air's EH R Z
+airbag EH R B AE G
+airbags EH R B AE G Z
+airbase EH R B EY S
+airbases EH R B EY S IH S
+airboat EH R B OW T
+airboats EH R B OW T S
+airborne EH R B AO R N
+airborne's EH R B AO R N Z
+airbus EH R B AH S
+airbus's EH R B AH S IH Z
+aircal EH R K AA L
+aircal's EH R K AE L Z
+airco EH R K OW
+aircoa EH R K OW AH
+aircondition EH R K AH N D IH SH AH N
+airconditioned EH R K AH N D IH SH AH N D
+airconditioner EH R K AH N D IH SH AH N ER
+airconditioning EH R K AH N D IH SH AH N IH NG
+airconditions EH R K AH N D IH SH AH N Z
+aircraft EH R K R AE F T
+aircraft's EH R K R AE F T S
+aircraft's(2) EH R K R AE F S
+aircrafts EH R K R AE F T S
+aircrafts(2) EH R K R AE F S
+aircrew EH R K R UW
+aird EH R D
+airdrop EH R D R AA P
+airdrops EH R D R AA P S
+aired EH R D
+airedale EH R D EY L
+airedales EH R D EY L Z
+aires EH R IY Z
+airey EH R IY
+airfare EH R F EH R
+airfares EH R F EH R Z
+airfield EH R F IY L D
+airfields EH R F IY L D Z
+airflow EH R F L OW
+airflows EH R F L OW Z
+airfoil EH R F OY L
+airfoils EH R F OY L Z
+airfone EH R F OW N
+airfones EH R F OW N Z
+airforce EH R F AO R S
+airforces EH R F AO R S IH Z
+airframe EH R F R EY M
+airframes EH R F R EY M Z
+airfreight EH R F R EY T
+airgas EH R G AE S
+airglow EH R G L OW
+airhart EH R HH AA R T
+airhead EH R HH EH D
+airheadz EH R HH EH D Z
+airing EH R IH NG
+airington EH R IH NG T AH N
+airless EH R L AH S
+airlia EH R L IY AH
+airlie EH R L IY
+airlift EH R L IH F T
+airlifted EH R L IH F T IH D
+airlifter EH R L IH F T ER
+airlifters EH R L IH F T ER Z
+airlifting EH R L IH F T IH NG
+airlifts EH R L IH F T S
+airline EH R L AY N
+airline's EH R L AY N Z
+airliner EH R L AY N ER
+airliner's EH R L AY N ER Z
+airliners EH R L AY N ER Z
+airlines EH R L AY N Z
+airlines' EH R L AY N Z
+airlink EH R L IH NG K
+airlinks EH R L IH NG K S
+airlock EH R L AO K
+airlocks EH R L AO K S
+airmail EH R M EY L
+airman EH R M AH N
+airman's EH R M AH N Z
+airmen EH R M EH N
+airmotive EH R M OW T IH V
+airplane EH R P L EY N
+airplane's EH R P L EY N Z
+airplanes EH R P L EY N Z
+airport EH R P AO R T
+airport's EH R P AO R T S
+airporter EH R P AO R T ER
+airporters EH R P AO R T ER Z
+airports EH R P AO R T S
+airpower EH R P AW ER
+airs EH R Z
+airshare EH R SH EH R
+airship EH R SH IH P
+airships EH R SH IH P S
+airspace EH R S P EY S
+airspaces EH R S P EY S IH Z
+airspeed EH R S P IY D
+airstrike EH R S T R AY K
+airstrikes EH R S T R AY K S
+airstrip EH R S T R IH P
+airstrips EH R S T R IH P S
+airtight EH R T AY T
+airtime EH R T AY M
+airtouch EH R T AH CH
+airtran EH R T R AE N
+airwave EH R W EY V
+airwaves EH R W EY V Z
+airway EH R W EY
+airway's EH R W EY Z
+airways EH R W EY Z
+airways' EH R W EY Z
+airways's EH R W EY Z IH Z
+airwing EH R W IH NG
+airwings EH R W IH NG Z
+airworthiness EH R W ER DH IY N AH S
+airworthy EH R W ER DH IY
+airy EH R IY
+air_force EH R F AO R S
+ais AY Z
+aisa AY IY S AH
+aisle AY L
+aisle(2) AY AH L
+aisles AY L Z
+aisles(2) AY AH L Z
+aisling EY S L IH NG
+aislinn EY S L IH N
+aist EY S T
+aitchison EY CH IH S AH N
+aithne EY TH N
+aitken AY T K AH N
+aiton AA IY T OW N
+aiwa AY W AH
+aix EH K S
+aix(2) EY K S
+aix-en-provence EY K S AA N P R AH V AO N S
+aix-en-provence(2) EH K S AA N P R AH V AO N S
+aix-la-chapelle EY K S L AA SH AH P EH L
+aix-la-chapelle(2) EH K S L AA SH AH P EH L
+aja AY AH
+ajaj AH JH AA JH
+ajaj's AH JH AA JH IH Z
+ajami EY JH AA M IY
+ajar AH JH AA R
+ajax EY JH AE K S
+ajax's EY JH AE K S AH Z
+ajax's(2) EY JH AE K S IH Z
+ajay EH JH EY
+ajinomoto AH JH IH N AH M OW T OW
+ajito AH JH IY T OW
+ajito(2) AH HH IY T OW
+aka AA K AH
+aka(2) EY K EY EY
+akai AH K AY
+akaka AH K AA K AH
+akali AH K AA L IY
+akamine AE K AH M AY N
+akana AA K AA N AH
+akao AH K EY OW
+akao(2) AH K AA W
+akard AE K ER D
+akashi AH K AA SH IY
+akashi's AH K AA SH IY Z
+akbar AE K B ER
+akbar(2) AA K B AA R
+akbash AE K B AE SH
+akc AE K
+ake EY K
+akebono AE K IY B OW N OW
+akel AH K EH L
+akella AH K EH L AH
+aken EY K AH N
+akens EY K AH N Z
+aker AE K ER
+aker(2) EY K ER
+akerley AH K ER L IY
+akerman AE K ER M AH N
+akers EY K ER Z
+akers's EY K ER Z IH Z
+akerson AE K ER S AH N
+akey AH K IY
+akhtar AE K T ER
+aki AA K IY
+akiba AH K IY B AH
+akihito AA K IY HH IY T OW
+akiko AH K IY K OW
+akimbo AH K IH M B OW
+akin AH K IH N
+akin(2) EY K IH N
+akins AH K IH N Z
+akins(2) EY K IH N Z
+akio AA K IY OW
+akira AH K IY R AH
+akita AH K IY T AH
+akita's AH K IY T AH Z
+akiva AH K IY V AH
+akiyama AA K IY Y AA M AH
+akkadian AH K EY D IY AH N
+akkerman AE K ER M AH N
+akre AE K ER
+akridge AH K R IH JH
+akron AE K R AH N
+aksamit AE K S AH M IH T
+aksler AE K S L ER
+akst AE K S T
+akyanama AE K AH Y AA N AH M AH
+akzo AE K Z OW
+akzo's AE K Z OW Z
+akzos AE K Z OW Z
+al AE L
+al's AE L Z
+al. AE L
+al.(2) AE L AH B AE M AH
+ala EY L AH
+alabama AE L AH B AE M AH
+alabama's AE L AH B AE M AH Z
+alabaman AE L AH B AE M AH N
+alabamans AE L AH B AE M AH N Z
+alabaster AE L AH B AE S T ER
+alachlor AH L AE K L ER
+alachua AH L AE CH UW AH
+alacrity AH L AE K R AH T IY
+aladdin AH L AE D IH N
+alafi AH L AA F IY
+alagappan AA L AH G AA P AH N
+alagem AE L AH JH EH M
+alagna AA L AA G N AH
+alagoas AE L AH G OW Z
+alai AH L AY
+alaimo AH L EY M OW
+alain AH L EY N
+alaine AH L EY N
+alair AH L EH R
+alam AH L AE M
+alamance AE L AH M AE N S
+alamco AH L AE M K OW
+alameda AE L AH M IY D AH
+alamein AE L AH M AY N
+alamillo AE L AH M IH L OW
+alamito AE L AH M IY T OW
+alamitos AE L AH M IY T OW S
+alamo AE L AH M OW
+alamodome AE L AH M OW D OW M
+alamos AE L AH M OW Z
+alamosa AE L AH M OW S AH
+alamoud AE L AH M UW D
+alamoudi AA L AA M UW D IY
+alamoudi(2) AE L AA M UW D IY
+alan AE L AH N
+alan's AE L AH N Z
+alana AA L AE N AH
+alanco AH L AE N K OW
+aland AE L AH N D
+alane AH L EY N
+alanis AA L AA N IH S
+alaniz AE L AH N IH Z
+alann AE L AE N
+alanna AA L AA N AH
+alar EY L AA R
+alarcon AH L AA R K AA N
+alard AH L AA R D
+alaric AE L ER IH K
+alarica AA L AA R IY K AH
+alarice AA L AA R IH S
+alarid AH L EH R IH D
+alarie AH L EH R IY
+alarm AH L AA R M
+alarm's AH L AA R M Z
+alarmed AH L AA R M D
+alarming AH L AA R M IH NG
+alarmingly AH L AA R M IH NG L IY
+alarmist AH L AA R M AH S T
+alarmist(2) AH L AA R M IH S T
+alarmists AH L AA R M IH S T S
+alarmists(2) AH L AA R M IH S
+alarms AH L AA R M Z
+alaron AH L EH R AH N
+alas AH L AE S
+alaska AH L AE S K AH
+alaska's AH L AE S K AH Z
+alaskamen AH L AE S K AH M AH N
+alaskan AH L AE S K AH N
+alaskans AH L AE S K AH N Z
+alastair AE L AH S T EH R
+alaster AE L AH S T ER
+alatas AH L AA T AH S
+alatorre AA L AA T AO R IY
+alayne AH L EY N
+alba AE L B AH
+albach AE L B AA K
+albacore AE L B AH K AO R
+alban AA L B AH N
+albanese AA L B AA N EY Z IY
+albani AE L B AA N IY
+albani's AE L B AA N IY Z
+albania AE L B EY N IY AH
+albania's AE L B EY N IY AH Z
+albanian AE L B EY N IY AH N
+albanians AE L B EY N IY AH N Z
+albank AA L B AE NG K
+albano AA L B AA N OW
+albans AE L B AE N Z
+albany AO L B AH N IY
+albany's AO L B AH N IY Z
+albarado AA L B AA R AA D OW
+albarran AE L B AE R AH N
+albashaun AE L B AH SH AA N
+albatross AE L B AH T R AA S
+albatrosses AE L B AH T R AA S IH Z
+albaugh AH L B AO
+albea AE L B IY AH
+albee AH L B IY
+albeit AO L B IY IH T
+albemarle AE L B AH M AA R L
+alben AO L B AH N
+albendazole AA L B AH N D AH Z OW L IY
+alber AE L B ER
+alberding AE L B ER D IH NG
+alberg AE L B ER G
+albergo AA L B EH R G OW
+alberico AA L B ER IY K OW
+albern AE L B ER N
+albers AO L B ER Z
+alberson AE L B ER S AH N
+albert AE L B ER T
+albert's AE L B ER T S
+alberta AE L B ER T AH
+alberthal AE L B ER TH AO L
+alberti AA L B EH R T IY
+albertina AA L B ER T IY N AH
+albertine AE L B ER T IY N
+albertini AA L B ER T IY N IY
+alberto AE L B ER T OW
+alberts AE L B ER T S
+albertsen AE L B ER T S AH N
+albertson AE L B ER T S AH N
+albertson's AE L B ER T S AH N Z
+albertus AE L B ER T AH S
+albertville AE L B ER T V IH L
+alberty AH L B ER T IY
+albie AO L B IY
+albin AE L B IH N
+albina AA L B IY N AH
+albini AA L B IY N IY
+albinia AA L B IY N IY AH
+albino AE L B AY N OW
+albion AE L B IY AH N
+albiric AA L B AY R IH K
+albo AE L B OW
+albrecht AO L B R EH K T
+albright AO L B R AY T
+albright's AO L B R AY T S
+albrightsville AO L B R AY T S V IH L
+albritton AE L B R IH T AA N
+albro AE L B R OW
+albukhari AA L B Y UW K AA R IY
+album AE L B AH M
+album's AE L B AH M Z
+albumin AE L B Y UW M AH N
+albums AE L B AH M Z
+albunex AE L B Y UW N EH K S
+albuquerque AE L B AH K ER K IY
+albury AE L B EH R IY
+albus AE L B AH S
+albuterol AE L B Y UW T ER AO L
+alcala AA L K AA L AH
+alcan AE L K AE N
+alcan's AE L K AE N Z
+alcantar AE L K AE N T ER
+alcantara AA L K AA N T AA R AH
+alcaraz AA L K AA R AA Z
+alcasa AE L K AA S AH
+alcatel AE L K AH T EH L
+alcatel's AE L K AH T EH L Z
+alcatraz AE L K AH T R AE Z
+alcazar AA L K AH Z AA R
+alcee AE L S IY
+alcester AA L CH EH S T ER
+alchemically AE L K EH M AH K L IY
+alchemist AE L CH AH M IH S T
+alchemist(2) AA L K AH M IH S T
+alchemy AE L K AH M IY
+alcide AE L S AY D
+alcids AE L S IH D Z
+alcina AA L CH IY N AH
+alco AE L K OW
+alco's AE L K OW Z
+alcoa AE L K OW AH
+alcoa's AE L K OW AH Z
+alcocer AH L K OW S ER
+alcock AH L K AA K
+alcohol AE L K AH HH AA L
+alcoholic AE L K AH HH AA L IH K
+alcoholics AE L K AH HH AA L IH K S
+alcoholism AE L K AH HH AO L IH Z AH M
+alcon AH L K AA N
+alcorn AA L K AO R N
+alcorta AA L K AO R T AH
+alcott AE L K AA T
+alcove AE L K OW V
+alcoves AE L K OW V Z
+alda AA L D AH
+aldaco AA L D AA K OW
+aldama AA L D AA M AH
+aldana AA L D AE N AH
+aldape AA L D AA P EY
+alday AE L D EY
+aldebaran AE L D EH B ER AH N
+alden AA L D AH N
+aldenville AA L D AH N V IH L
+alder AO L D ER
+aldercy AH L D ER K IY
+alderete AE L D ER IY T
+alderfer AE L D ER F ER
+alderidge AA L D ER IH JH
+alderidge(2) AA L D R IH JH
+alderman AO L D ER M AH N
+alderman(2) AE L D ER M AH N
+aldermen AO L D ER M IH N
+alderson AO L D ER S AH N
+alderson(2) AE L D ER S AH N
+alderton AO L D ER T AH N
+aldi AA L D IY
+aldicarb AO L D IH K AA R B
+aldila AE L D IH L AH
+aldin AA L D IY N
+aldinger AO L D IH NG ER
+aldis AA L D IH S
+aldo AA L D OW
+aldora AA L D AO R AH
+aldous AA L D AH S
+aldred AE L D ER D
+aldred(2) AO L D R EH D
+aldredge AO L D R EH JH
+aldrete AO L D R IY T
+aldric AE L D R IH K
+aldric(2) AO L D R IH K
+aldrich AO L D R IH CH
+aldrich's AO L D R IH CH AH Z
+aldridge AO L D R IH JH
+aldrin AO L D R IH N
+aldrin's AO L D R IH N Z
+aldus AA L D IH S
+aldus's AA L D IH S IH Z
+aldwin AO L D W IH N
+aldwyn AO L D W IH N
+aldys AA L D IY Z
+ale EY L
+aleatory EY L IY AH T AO R IY
+alec AE L IH K
+aleda AA L EY D AH
+aledo AH L IY D OW
+aleen AH L IY N
+alegre AA L EH G R IY
+alegrett AE L AH G R AH T
+alegria AH L EH G R IY AH
+alehouse EY L HH AW S
+aleichem AH L EH HH EH M
+aleichem(2) AH L EY HH EH M
+alejandre AA L EY Y AA N D R EY
+alejandro AA L EY Y AA N D R OW
+alejandro(2) AA L EY HH AA N D R OW
+alejo AA L EY Y OW
+alejos AA L EY Y OW Z
+aleksander AE L AH G Z AE N D ER
+aleksander(2) AE L AH K S AE N D ER
+aleksandr AE L AH G Z AE N D ER
+aleksandr(2) AE L AH K S AE N D ER
+alem AH L EH M
+aleman EY L M AH N
+alena AA L EY N AH
+alendrin AH L EH N D R IH N
+alene AH L IY N
+alenia AH L IY N IY AH
+aleo AA L IY OW
+aleph AA L AH F
+aleria AH L IY R IY AH
+aleron AA L EH R AO N
+alert AH L ER T
+alerted AH L ER T IH D
+alerting AH L ER T IH NG
+alertly AH L ER T L IY
+alertness AH L ER T N AH S
+alerts AH L ER T S
+ales EY L Z
+aleshire AA L EY SH IH R EY
+alesi AA L EH S IY
+alessandra AE L EH S AE N D R AH
+alessandra's AE L EH S AE N D R AH Z
+alessandrini AA L EH S AA N D R IY N IY
+alessandro AA L EY Z AA N D R OW
+alessandro(2) AA L AH S AE N D R OW
+alessi AH L EH S IY
+alessi(2) AH L EY S IY
+alessio AH L EH S IY OW
+aleta AA L EH T AH
+aletha AH L IY TH AH
+alethea AE L AH TH IY AH
+aletti AH L EH T IY
+aleutian AH L UW SH AH N
+aleutians AH L UW SH AH N Z
+aleve AH L IY V
+alewife EY L W AY F
+alewine EY L W AY N
+alewives EY L W AY V Z
+alex AE L AH K S
+alex's AE L AH K S IH Z
+alexa AH L EH K S AH
+alexander AE L AH G Z AE N D ER
+alexander's AE L AH G Z AE N D ER Z
+alexander's(2) AE L IH G Z AE N D ER Z
+alexander(2) AE L IH G Z AE N D ER
+alexanders AE L IH G Z AE N D ER Z
+alexandra AE L EH G Z AE N D R AH
+alexandra(2) AE L IH G Z AE N D R AH
+alexandre AE L IH K S AA N D ER
+alexandria AE L AH G Z AE N D R IY AH
+alexandrine AE L AH G Z AE N D R IY N
+alexandrines AE L AH G Z AE N D R IY N Z
+alexandrov AE L AH K S AE N D R AH V
+alexandrov(2) AE L AH G Z AE N D R AH V
+alexei AH L EH K S EY
+alexi AH L EH K S IY
+alexi's AH L EH K S IY Z
+alexia AH L EH K S IY AH
+alexine AH L EH K S AY N
+alexis AH L EH K S IH S
+alexopoulos AE L IH G Z AA P AH L IH S
+alexs AE L AH K S IH Z
+alexy AH L EH K S IY
+aley EY L IY
+alf AE L F
+alfa AE L F AH
+alfa's AE L F AH Z
+alfalfa AE L F AE L F AH
+alfano AA L F AA N OW
+alfareda AE L F AH R EH D AH
+alfaro AA L F AA R OW
+alfavilli AE L F AH V IH L IY
+alfie AE L F IY
+alfieri AA L F IH R IY
+alfiero AE L F IY EH R OW
+alfin AE L F IH N
+alfin's AE L F IH N Z
+alfono AE L F OW N OW
+alfons AA L F OW N Z
+alfonse AE L F AA N S
+alfonse(2) AE L F AO N S
+alfonsin AE L F AA N S IH N
+alfonsin's AE L F AA N S IH N Z
+alfonsine AA L F OW N S IY N IY
+alfonso AE L F AA N S OW
+alfonzo AE L F AA N Z OW
+alford AE L F ER D
+alfre AE L F ER
+alfre(2) AE L F R IY
+alfred AE L F R AH D
+alfred(2) AE L F R IH D
+alfredo AE L F R EY D OW
+alfredson AE L F R IH D S AH N
+alfredsson AE L F R IH D S AH N
+alfrey AE L F R IY
+algae AE L JH IY
+algal AE L G AH L
+algamaa AE L G AA M AH
+algar AA L G AA R
+algarin AE L G ER IH N
+algata AE L G AA T AH
+algebra AE L JH AH B R AH
+algebraic AE L JH AH B R EY IH K
+algebraically AE L JH AH B R EY IH K L IY
+algemene AE L G AH M IY N
+algeo AE L JH IY OW
+alger AE L JH ER
+algeria AE L JH IH R IY AH
+algeria's AE L JH IY R IY AH Z
+algerian AE L JH IH R IY AH N
+algerians AE L JH IY R IY AH N Z
+algernon AE L JH ER N AA N
+algie AO L G IY
+algiers AE L JH IH R Z
+algodones AA G AH D OW N AH Z
+algol AE L G AA L
+algom AE L G AH M
+algoma AE L G OW M AH
+algonquian AE L G AA NG K IY AH N
+algonquin AE L G AA NG K W IH N
+algorithm AE L G ER IH DH AH M
+algorithms AE L G ER IH DH AH M Z
+alguire AA L G W IH R EY
+algy AE L JH IY
+alhadeff AE L AH D EH F
+alhambra AE L HH AE M B R AH
+alhausie AE L HH AW S IY
+ali AA L IY
+ali's AA L IY Z
+ali-reza AA L IY R EH Z AH
+aliano AA L IY AA N OW
+alianza AE L IY AE N Z AH
+alias EY L IY AH S
+aliases EY L IY AH S IH Z
+aliberti AA L IY B EH R T IY
+alibi AE L AH B AY
+alibis AE L AH B AY Z
+alibrandi AE L IH B R AE N D IY
+alice AE L AH S
+alice's AE L AH S AH Z
+alice(2) AE L IH S
+alicea AH L IH S IY AH
+alices AE L AH S AH Z
+alicia AH L IH SH AH
+alicia's AH L IH SH AH Z
+alida AA L IY D AH
+alie AE L IY
+alien EY L IY AH N
+alienate EY L Y AH N EY T
+alienated EY L IY AH N EY T AH D
+alienated(2) EY L IY AH N EY T IH D
+alienates EY L IY AH N EY T S
+alienating EY L IY AH N EY T IH NG
+alienation EY L IY AH N EY SH AH N
+aliens EY L IY AH N Z
+aliff AE L IH F
+alig AE L IH G
+alight AH L AY T
+align AH L AY N
+aligned AH L AY N D
+aligning AH L AY N IH NG
+alignment AH L AY N M AH N T
+alignments AH L AY N M AH N T S
+aligns AH L AY N Z
+alihan AE L IH HH AE N
+alija AH L AY JH AH
+alija's AH L AY JH AH Z
+alike AH L AY K
+alikes AH L AY K S
+alima AA L IY M AH
+alimenies AE L IH M EH N IY Z
+alimentary AE L AH M EH N T ER IY
+alimony AE L AH M OW N IY
+alina AH L IY N AH
+aline AH L AY N
+alines AH L AY N Z
+alioto AA L IY OW T OW
+aliquippa AE L AH K W IH P AH
+aliquippa's AE L AH K W IH P AH Z
+aliquippas AE L AH K W IH P AH Z
+alire AA L IH R EY
+alirio AH L IH R IY OW
+alisa AH L IY S AH
+alisha AA L IY SH AH
+alisky AH L IH S K IY
+alislamiyya AE L AH S L AH M IY AH
+alison AE L IH S AH N
+alissa AH L IH S AH
+alistair AE L IH S T EH R
+alister AE L IH S T ER
+alita AA L IY T AH
+alitalia AE L IH T EY L IY AH
+alitalia's AE L IH T EY L IY AH Z
+alitalia's(2) AE L IH T AE L IY AH Z
+alitalia(2) AE L IH T AE L IY AH
+alithia AH L IH TH IY AH
+alito AH L IY T OW
+alive AH L AY V
+alix AE L IH K S
+aliyah AH L IY AH
+alizac AE L IH Z AE K
+alka AE L K AH
+alkahest AE L K AH HH EH S T
+alkali AE L K AH L AY
+alkalies AE L K AH L AY Z
+alkaline AE L K AH L AY N
+alkalinity AE L K AH L IH N AH T IY
+alkaloid AE L K AH L OY D
+alkaloidal AE L K AH L OY D AH L
+alkaloids AE L K AH L OY D Z
+alkanes AE L K EY N Z
+alkema AE L K IH M AH
+alkene AE L K IY N
+alkenes AE L K IY N Z
+alkermes AA L K ER M IY Z
+alkire AH L K AY R
+all AO L
+all's AO L Z
+all-out AO L AW T
+all-purpose AO L P ER P AH S
+alla AA L AH
+allah AA L AH
+allain AH L EY N
+allaire AA L EH R
+allais AH L EY
+allais(2) EY L IY AH S
+allamuchy AA L AH M UW CH IY
+allan AE L AH N
+allante AE L AA N T EY
+allar AH L AA R
+allard AE L ER D
+allardt AE L ER T
+allay AH L EY
+allayed AH L EY D
+allaying AH L EY IH NG
+allays AH L EY Z
+allbaugh AH L B AO
+allbee AO L B IY
+allbright AO L B R AY T
+allbritten AE L B R IH T AH N
+allbritton AE L B R IH T AA N
+allcock AO L K AA K
+allcorn AH L K AO R N
+allday AO L D EY
+allderdice AA L D ER D AY S
+allderdice(2) AE L D ER D AY S
+alldredge AH L D R EH JH
+allebach AE L IH B AA K
+allebach(2) AE L B AA K
+alleco AE L EH K OW
+allee AH L IY
+allegation AE L AH G EY SH AH N
+allegations AE L AH G EY SH AH N Z
+allege AH L EH JH
+alleged AH L EH JH D
+allegedly AH L EH JH AH D L IY
+alleges AH L EH JH AH Z
+alleges(2) AH L EH JH IH Z
+alleghany AE L AH G EY N IY
+alleghenies AE L AH G EY N IY Z
+alleghenies(2) AE L AH G EH N IY Z
+allegheny AE L AH G EY N IY
+allegheny's AE L AH G EY N IY Z
+allegheny's(2) AE L AH G EH N IY Z
+allegheny(2) AE L AH G EH N IY
+allegiance AH L IY JH AH N S
+allegiances AE L IY JH IY AE N S IH Z
+allegiances(2) AH L IY JH AH N S IH Z
+alleging AH L EH JH IH NG
+allegis AE L EY JH IH S
+allegis' AE L EY JH IH S
+allegis's AE L EY JH IH S IH Z
+allegorical AE L AH G AO R AH K AH L
+allegories AE L AH G AO R IY Z
+allegory AE L AH G AO R IY
+allegra AA L EH G R AH
+allegretti AA L EH G R EH T IY
+allegro AH L EH G R OW
+allele AH L EH L IY
+alleles AH L EH L IY Z
+allelic AH L EH L IH K
+alleman EY L M AH N
+allemand AE L IH M AH N D
+allen AE L AH N
+allen's AE L AH N Z
+allenbaugh AH L EH N B AO
+allendale AE L AH N D EY L
+allende AA Y EH N D EY
+allender AA L Y EH N D EY ER
+allender(2) AA L EH N D ER
+allendorf AE L IH N D AO R F
+allene AE L IY N
+allenhurst AE L AH N HH ER S T
+allens AE L AH N Z
+allensbach AE L AH N Z B AA K
+allensworth AE L AH N Z W ER TH
+allenton AE L AH N T AH N
+allentown AE L AH N T AW N
+allenwood AE L AH N W UH D
+aller AO L ER
+allergan AE L ER JH AH N
+allergen AE L ER JH AH N
+allergens AE L ER JH AH N Z
+allergic AH L ER JH IH K
+allergies AE L ER JH IY Z
+allergist AE L ER JH AH S T
+allergist's AE L ER JH AH S T S
+allergist's(2) AE L ER JH AH S
+allergists AE L ER JH AH S T S
+allergists(2) AE L ER JH AH S
+allergy AE L ER JH IY
+allers AO L ER Z
+allert AE L ER T
+allerton AE L ER T AH N
+alles EY L Z
+alleva AA L EY V AH
+alleviate AH L IY V IY EY T
+alleviated AH L IY V IY EY T AH D
+alleviated(2) AH L IY V IY EY T IH D
+alleviates AH L IY V IY EY T S
+alleviating AH L IY V IY EY T IH NG
+alleviation AH L IY V IY EY SH AH N
+alley AE L IY
+alley's AE L IY Z
+alleyne AE L EY N
+alleyoop AE L IY UW P
+alleys AE L IY Z
+alleyway AE L IY W EY
+alleyways AE L IY W EY Z
+allgaier AE L G AY ER
+allgeier AE L G AY ER
+allgemeine AO L G AH M AY N
+allgemeines AO L G AH M AY N Z
+allgeyer AE L G IY ER
+allgood AO L G UH D
+alli AE L IY
+alliance AH L AY AH N S
+alliance's AH L AY AH N S IH Z
+alliances AH L AY AH N S AH Z
+alliances(2) AH L AY AH N S IH Z
+alliant AH L AY AH N T
+alliant's AH L AY AH N T S
+allianz AE L IY AH N Z
+allianz's AE L IY AH N Z IH Z
+allick AE L IH K
+allie AE L IY
+allied AH L AY D
+allied's AE L AY D Z
+allied(2) AE L AY D
+alliedsignal AE L AY D S IH G N AH L
+alliedsignal's AE L AY D S IH G N AH L Z
+allies AE L AY Z
+allies' AE L AY Z
+allies(2) AH L AY Z
+alligator AE L AH G EY T ER
+alligators AE L AH G EY T ER Z
+alligood AE L IH G UH D
+allin AH L IH N
+allinder AE L IH N D ER
+alling AO L IH NG
+allinger AO L IH NG ER
+allingham AO L IH NG HH AE M
+allington AO L IH NG T AH N
+allinson AE L IH N S AH N
+allis AE L IH S
+allison AE L AH S AH N
+allison's AE L IH S AH N Z
+allison(2) AE L IH S AH N
+allister AO L IH S T ER
+allister(2) AE L IH S T ER
+alliston AE L IH S T AA N
+alliteration AH L IH T ER EY SH AH N
+alliterative AH L IH T ER AH T IH V
+alliterative(2) AH L IH T ER EY T IH V
+allman AO L M AH N
+allmendinger AE L M EH N D IH NG ER
+allmon AO L M AH N
+allmond AH L M AA N D
+allnet AO L N EH T
+allnutt AH L N AH T
+allocate AE L AH K EY T
+allocated AE L AH K EY T IH D
+allocates AE L AH K EY T S
+allocating AE L AH K EY T IH NG
+allocation AE L AH K EY SH AH N
+allocations AE L AH K EY SH AH N Z
+allocator AE L AH K EY T ER
+allocators AE L AH K EY T ER Z
+allocca AE L AA K AH
+allocco AE L AA K OW
+allograph AE L AH G R AE F
+allographs AE L AH G R AE F S
+allomorph AE L AH M AO R F
+allomorphs AE L AH M AO R F S
+allophone AE L AH F OW N
+allophones AE L AH F OW N Z
+allophonic AE L AH F AA N IH K
+allor AO L ER
+allot AH L AA T
+alloted AH L AA T IH D
+allotment AH L AA T M AH N T
+allotments AH L AA T M AH N T S
+allotrope AE L AH T R OW P
+allotropes AE L AH T R OW P S
+allots AH L AA T S
+allotted AH L AA T IH D
+allotting AH L AA T IH NG
+allow AH L AW
+allowable AH L AW AH B AH L
+allowance AH L AW AH N S
+allowances AH L AW AH N S IH Z
+alloway AE L OW W EY
+allowed AH L AW D
+allowing AH L AW IH NG
+allows AH L AW Z
+alloy AE L OY
+alloys AE L OY Z
+allphin AH L F IH N
+allport AO L P AO R T
+allred AE L R IH D
+allright AA L R AY T
+alls AO L Z
+allsbrook AO L Z B R UH K
+allsbrook(2) AO L T S B R UH K
+allset AO L S EH T
+allshouse AO L Z HH AW S
+allshouse(2) AO L T S HH AW S
+allsop AO L S AA P
+allsopp AO L S AA P
+allspice AO L S P AY S
+allstate AO L S T EY T
+allstate's AO L S T EY T S
+allston AO L S T AH N
+allsup AE L S AH P
+alltel AO L T EH L
+alltime AO L T AY M
+allton AO L T AH N
+alltop AO L T AA P
+allude AH L UW D
+alluded AH L UW D AH D
+alludes AH L UW D Z
+alluding AH L UW D IH NG
+allum AE L AH M
+allums AE L AH M Z
+allure AH L UH R
+allured AH L UH R D
+alluring AH L UH R IH NG
+allusion AH L UW ZH AH N
+allusions AH L UW ZH AH N Z
+allusive AH L UW S IH V
+alluvial AE L UW V IY AH L
+alluvium AH L UW V IY AH M
+allwaste AO L W EY S T
+allweiss AA L W IY S
+allweiss's AA L W IY S IH Z
+ally AE L AY
+ally's AH L AY Z
+ally(2) AH L AY
+allying AE L AY IH NG
+allying(2) AH L AY IH NG
+allyn AE L IH N
+allys AE L AY Z
+allyson AE L IH S AH N
+alm AA M
+alma AE L M AH
+alma(2) AO L M AH
+almada AA L M AA D AH
+almadani AO L M AH D AA N IY
+almaden AE L M AH D AH N
+almaden(2) AA L M AH D EH N
+almaguer AA L M AA G W EH R
+almal AA L M AH L
+alman AE L M AH N
+almanac AO L M AH N AE K
+almand AE L M AH N D
+almanza AA L M AA N Z AH
+almanzar AA L M AA N Z AA R
+almaraz AA L M AA R AA Z
+almas AE L M AH Z
+almasy AE L M AH S IY
+almay AA L M EY
+almazan AA L M AA Z AA N
+almeda AA L M EY D AH
+almeida AA L M IY D AH
+almelund AA L M AH L AH N D
+almendarez AA L M EY N D AA R EH Z
+almer AO L M ER
+almeria AA L M ER IY AH
+almgren AE L M G R EH N
+almighty AO L M AY T IY
+almira AA L M IH R AH
+almo AA L M OW
+almodovar AA L M OW D OW V AA R
+almon AA L M AH N
+almond AA M AH N D
+almonds AA L M AH N D Z
+almoner AA L M AH N ER
+almonte AA L M OW N T EY
+almos AA L M OW S
+almost AO L M OW S T
+almquist AE L M K W IH S T
+alms AA L M Z
+alms(2) AA M Z
+almy AO M IY
+almys AE L M IY Z
+alodie AH L AA D IY
+aloe AE L OW
+aloft AH L AO F T
+aloha AH L OW HH AA
+aloi AA L OY
+aloia AA L OW Y AH
+alois AA L OY S
+aloisa AA L OY S AH
+aloisi AA L OY S IY
+aloisia AA L OY S IY AH
+aloisio AA L OY S IY OW
+aloka AH L OW K AH
+alomar AE L AH M AA R
+alon AH L AA N
+alone AH L OW N
+along AH L AO NG
+alonge AE L AH N JH
+alongi AA L OW NG G IY
+alongs AH L AO NG Z
+alongside AH L AO NG S AY D
+aloni AH L OW N IY
+alonso AH L AA N S OW
+alonza AH L AA N Z AH
+alonzo AH L AA N Z OW
+aloof AH L UW F
+aloofness AH L UW F N AH S
+alot AH L AA T
+aloud AH L AW D
+aloys AH L OY Z
+aloyse AH L OY S
+aloysia AA L OY S IY AH
+aloysius AE L OW IH SH IH S
+alpa AE L P AH
+alpaca AE L P AE K AH
+alpaugh AH L P AO
+alper AE L P ER
+alperin AE L P ER IH N
+alpern AH L P ER N
+alpers AE L P ER Z
+alpert AE L P ER T
+alpex AE L P EH K S
+alpha AE L F AH
+alpha's AE L F AH Z
+alphabet AE L F AH B EH T
+alphabetic AE L F AH B EH T IH K
+alphabetical AE L F AH B EH T IH K AH L
+alphabetically AE L F AH B EH T IH K L IY
+alphabetization AE L F AH B EH T AH Z EY SH AH N
+alphabetize AE L F AH B AH T AY Z
+alphabetized AE L F AH B AH T AY Z D
+alphabetizes AE L F AH B AH T AY Z IH Z
+alphabetizing AE L F AH B AH T AY Z IH NG
+alphagraphics AE L F AH G R AE F IH K S
+alphametric AE L F AH M EH T R IH K
+alphametrics AE L F AH M EH T R IH K S
+alphandery AE L F AE D ER IY
+alphanumeric AE L F AH N UW M EH R IH K
+alphaphotographic AE L F AH F OW T AH G R AE F IH K
+alpharel AE L F ER EH L
+alpharetta AE L F ER EH T AH
+alphin AE L F IH N
+alphonse AE L F AA N Z
+alphonsine AH L F AA N S IY N
+alphonso AE L F AA N S OW
+alpin AH L P IH N
+alpine AE L P AY N
+alpirez AE L P IH R EH Z
+alpo AE L P OW
+alps AE L P S
+alquist AE L K W IH S T
+alread AA L R IY D
+already AO L R EH D IY
+already(2) AO R EH D IY
+alred AO L R IH D
+alright AO L R AY T
+alrosa AA L R OW S AH
+alrosa(2) AA L R OW Z AH
+alroy AH L R OY
+als AE L Z
+alsace AE L S AA S
+alsace(2) AE L S AE S
+alsatian AE L S EY SH AH N
+alsbrook AE L Z B R UH K
+alsbrook's AE L Z B R UH K S
+alsbrooks AE L Z B R UH K S
+alsbrooks' AE L Z B R UH K S
+alsbury AO L Z B EH R IY
+alsbury(2) AE L Z B EH R IY
+alsdorf AO L Z D AO R F
+alsdorf(2) AE L Z D AO R F
+alsgaard AA L Z G AA R D
+alshelhah AA L SH EH L HH AH
+alsip AE L S IH P
+also AO L S OW
+alsobrook AE L S AH B R UH K
+alsobrooks AE L S AH B R UH K S
+alsop AE L S AA P
+alspach AE L S P AH K
+alspaugh AH L S P AO
+alsthom AE L S TH AH M
+alston AO L S T AH N
+alsup AE L S AH P
+alt AA L T
+alta AA L T AH
+altadena AA L T AH D IY N AH
+altai AE L T AY
+altaic AE L T EY IH K
+altair AA L T EH R
+altamira AA L T AA M IH R AH
+altamirano AA L T AA M IH R AA N OW
+altamont AA L T AH M AO N T
+altamuro AO L T AH M UH R OW
+altar AO L T ER
+altarpiece AO L T ER P IY S
+altars AO L T ER Z
+altavista AO L T AH V IH S T AH
+altay AO L T AY
+altemose AE L T IH M OW S
+altemus AE L T IH M IH S
+altenburg AO L T AH N B ER G
+altenhofen AE L T IH N HH AH F AH N
+alteon AA L T IY AO N
+alter AO L T ER
+altera AO L T EH R AH
+alteration AO L T ER EY SH AH N
+alterations AO L T ER EY SH AH N Z
+altercation AA L T ER K EY SH AH N
+altercations AA L T ER K EY SH AH N Z
+altered AO L T ER D
+altergott AE L T ER G AH T
+altering AO L T ER IH NG
+alterman AO L T ER M AH N
+alternacare AO L T ER N AH K EH R
+alternate AO L T ER N AH T
+alternate(2) AO L T ER N EY T
+alternated AO L T ER N EY T AH D
+alternately AO L T ER N AH T L IY
+alternates AO L T ER N EY T S
+alternating AO L T ER N EY T IH NG
+alternation AO L T ER N EY SH AH N
+alternative AO L T ER N AH T IH V
+alternatively AO L T ER N AH T IH V L IY
+alternatives AO L T ER N AH T IH V Z
+alternator AO L T ER N EY T ER
+alters AO L T ER Z
+altfest AA L T F EH S T
+althaus AE L T HH AW S
+althaver AE L TH EY V ER
+althea AE L TH IY AH
+altherr AA L TH ER
+althoff AE L T HH AO F
+althorp AE L TH AO R P
+althorp(2) AA L TH AO R P
+although AO L DH OW
+althouse AO L T HH AW S
+altice AA L T IH S
+altier AO L T IY ER
+altieri AA L T IH R IY
+altima AA L T IH M AH
+altima's AA L T IH M AH Z
+altimeter AE L T IH M AH T ER
+altimetry AE L T IH M AH T R IY
+altimorano AA L T IY M AO R AA N OW
+altiplano AE L T AH P L AA N OW
+altitude AE L T AH T UW D
+altitudes AE L T IH T UW D Z
+altizer AE L T AY Z ER
+altland AE L T L AH N D
+altman AO L T M AH N
+altman's AO L T M AH N Z
+altmann AO L T M AH N
+altmeyer AE L T M AY ER
+altmeyer(2) AA L T M AY ER
+alto AE L T OW
+altobelli AA L T OW B EH L IY
+altogether AO L T AH G EH DH ER
+altoid AA L T OY D
+altom AH L T AA M
+altomare AA L T OW M AA R IY
+alton AO L T AH N
+altoona AE L T UW N AH
+altos AE L T OW Z
+altos(2) AO L T OW S
+altra AA L T R AH
+altron AO L T R AA N
+altruism AE L T R UW IH Z AH M
+altruistic AO L T R UW IH S T IH K
+altschiller AO L CH IH L ER
+altschul AE L CH AH L
+altschuler AE L CH Y UW L ER
+altschuler(2) AE L CH UW L ER
+altshuler AE L CH Y UW L ER
+altshuler(2) AE L CH UW L ER
+altucher AE L T AH K ER
+alturas AA L T UH R AH S
+altus AE L T AH S
+altvater AE L T V AH T ER
+altzheimer AA L T S HH AY M ER
+altzheimer's AA L T S HH AY M ER Z
+alu AA L UW
+alum AE L AH M
+alum(2) AH L AH M
+alumax AE L UW M AE K S
+alumbaugh AH L AH M B AO
+alumina AH L UW M AH N AH
+aluminio AE L UW M IY N IY OW
+aluminium AH L UW M IH N AH M
+aluminium(2) AE L Y UW M IH N AH M
+aluminize AH L UW M AH N AY Z
+aluminized AH L UW M AH N AY Z D
+aluminosilicate AH L UW M AH N OW S IH L AH K EY T
+aluminum AH L UW M AH N AH M
+aluminum's AH L UW M AH N AH M Z
+alumna AH L AH M N AH
+alumni AH L AH M N AY
+alumnus AH L AH M N AH S
+alums AE L AH M Z
+alun EY L AH N
+alura AA L UH R AH
+alusuisse AE L Y UW S W IH S
+alva AE L V AH
+alvah AE L V AA
+alvan AE L V AH N
+alvarado AE L V ER AA D OW
+alvardo AA L V AA R D OW
+alvare AE L V EY R
+alvare(2) AE L V AA R
+alvarenga AA L V AA R EH NG G AH
+alvares AA L V AA R EH S
+alvarez AE L V ER EH Z
+alvarez's AE L V ER EH Z IH Z
+alvaro AH L V AA R OW
+alvear AA L V IH R
+alveolar AE L V IY AH L ER
+alveoli AE L V IY AH L AY
+alverez AA L V EH R EH Z
+alvero AE L V EH R OW
+alverson AA L V ER S AH N
+alverton AA L V ER T AH N
+alves AA L V EH S
+alvey AE L V IY
+alvidrez AA L V IY D R EH Z
+alvin AE L V IH N
+alvina AE L V AY N AH
+alvino AA L V IY N OW
+alvis AA L V IH S
+alvita AA L V IY T AH
+alvite AE L V AY T
+alvord AE L V AO R D
+alwaleed AE L W AH L IY D
+alwaleed(2) AA L W AA L IY D
+alward AE L W ER D
+always AO L W EY Z
+always(2) AO L W IY Z
+alwin AE L W IH N
+alwine AE L W AY N
+alwood AE L W UH D
+alwyn AE L W IH N
+aly EY L IY
+alyce AE L IH S
+alyea AE L IY AH
+alyeska AE L IY EH S K AH
+alyeska's AE L Y EH S K AH Z
+alys AE L IY Z
+alysheba AE L IH SH IY B AH
+alysia AH L IH S IY AH
+alyssa AH L IH S AH
+alza AE L Z AH
+alza's AE L Z AH Z
+alzado AA L Z AE D OW
+alzado(2) AA L Z AA D OW
+alzena AA L Z EH N AH
+alzene AA L Z IY N
+alzheimer AE L Z HH AY M ER
+alzheimer's AE L Z HH AY M ER Z
+alzheimer's(2) AA T S Z HH AY M ER Z
+alzheimer(2) AA L T S HH AY M ER
+alzona AE L Z OW N AH
+am AE M
+am's AE M Z
+am's(2) EY EH M Z
+am(2) EY EH M
+amabel AE M AH B EH L
+amabelle AE M AH B AH L
+amabile AA M AA B AH L
+amacher AE M AH K ER
+amacker AE M AH K ER
+amadea AA M AA D IY AH
+amadeo AA M AA D IY OW
+amadeus AE M AH D EY AH S
+amado AA M AA D OW
+amadon AA M AA D AO N
+amador AE M AH D AO R
+amadou AE M AH D UW
+amagansett AH M AE N G AH S EH T
+amaker AE M EY K ER
+amakudari AE M AH K Y UW D AA R IY
+amal AH M AA L
+amal's AH M AA L Z
+amalea AE M AH L IY AH
+amalfitano AA M AA L F IY T AA N OW
+amalgam AH M AE L G AH M
+amalgamate AH M AE L G AH M EY T
+amalgamated AH M AE L G AH M EY T IH D
+amalgamated's AH M AE L G AH M EY T IH D Z
+amalgamates AH M AE L G AH M EY T S
+amalgamating AH M AE L G AH M EY T IH NG
+amalgamation AH M AE L G AH M EY SH AH N
+amalgams AH M AE L G AH M Z
+amalia AH M AA L Y AH
+amalie AE M AH L IY
+amalya AH M AA L Y AH
+aman AA M AH N
+amana AH M AE N AH
+amanda AH M AE N D AH
+amanda's AH M AE N D AH Z
+amandas AH M AE N D AH Z
+amandime AE M AH N D AY M
+amann AE M AH N
+amano AH M AA N OW
+amanpour AA M AA N P UH R
+amanpour's AA M AA N P UH R Z
+amante AA M AA N T IY
+amar AH M AA R
+amar's AH M AA R Z
+amara AA M AA R AH
+amaral AA M AA R AE L
+amarante AA M AA R AA N T IY
+amaranth AE M ER AE N TH
+amaretto AE M AH R EH T OW
+amargosa AH M AA R G OW S AH
+amari AA M AA R IY
+amarilla AE M ER IH L AH
+amarillo AE M ER IH L OW
+amarillo's AE M ER IH L OW Z
+amarillos AE M ER IH L OW Z
+amarin AE M ER IH N
+amaris AE M ER IH S
+amaro AA M AA R OW
+amaryllis AE M ER IH L AH S
+amaryllis(2) AE M ER IH L IH S
+amaryllises AE M ER IH L AH S AH Z
+amasa AE M AH S AH
+amason AE M AH S AH N
+amass AH M AE S
+amassed AH M AE S T
+amasses AH M AE S IH Z
+amassing AH M AE S IH NG
+amateur AE M AH T ER
+amateur(2) AE M AH CH ER
+amateurish AE M AH CH ER IH SH
+amateurism AE M AH CH ER IH Z AH M
+amateurs AE M AH T ER Z
+amateurs(2) AE M AH CH ER Z
+amati AH M AA T IY
+amatil AE M AH T IH L
+amato AA M AA T OW
+amato's AA M AA T OW Z
+amauligak AH M AW L IH G AE K
+amax EY M AE K S
+amax's EY M AE K S IH Z
+amaya AA M AA Y AH
+amaze AH M EY Z
+amazed AH M EY Z D
+amazement AH M EY Z M AH N T
+amazes AH M EY Z IH Z
+amazing AH M EY Z IH NG
+amazingly AH M EY Z IH NG L IY
+amazon AE M AH Z AA N
+amazon's AE M AH Z AA N Z
+amazonia AE M AH Z OW N IY AH
+amazonian AE M AH Z OW N IY AH N
+amazonians AE M AH Z OW N IY AH N Z
+amazons AE M AH Z AA N Z
+ambac AE M B AE K
+ambase AE M B EY S
+ambassador AE M B AE S AH D ER
+ambassador's AE M B AE S AH D ER Z
+ambassadorial AE M B AE S AH D AO R IY AH L
+ambassadors AE M B AE S AH D ER Z
+ambassadorship AE M B AE S AH D ER SH IH P
+ambassadorships AE M B AE S AH D ER SH IH P S
+ambassadress AE M B AE S AH D R AH S
+amber AE M B ER
+amber's AE M B ER
+amberg AE M B ER G
+amberger AE M B ER G ER
+ambergris AE M B ER G R IH S
+ambers AE M B ER Z
+amberson AE M B ER S AH N
+ambery AE M B ER IY
+ambiance AE M B IY AH N S
+ambidextrous AE M B AH D EH K S T R AH S
+ambidextrous(2) AE M B IH D EH K S T R AH S
+ambience AE M B IY AH N S
+ambient AE M B IY AH N T
+ambiguities AE M B AH G Y UW AH T IY Z
+ambiguity AE M B IH G Y UW AH T IY
+ambiguous AE M B IH G Y UW AH S
+ambisone AE M B AH S AH M
+ambition AE M B IH SH AH N
+ambitions AE M B IH SH AH N Z
+ambitious AE M B IH SH AH S
+ambitiously AE M B IH SH AH S L IY
+ambivalence AE M B IH V AH L AH N S
+ambivalent AE M B IH V AH L AH N T
+amble AE M B AH L
+ambled AE M B AH L D
+ambler AE M B L ER
+ambles AE M B AH L Z
+amblin AE M B L IH N
+ambling AE M B AH L IH NG
+ambling(2) AE M B L IH NG
+amborn AH M B AO R N
+amboy AE M B OY
+ambra AE M B R AH
+ambriano AE M B R IY AA N OW
+ambrit AE M B R IH T
+ambriz AE M B R IH Z
+ambrogio AE M B R OW JH IY OW
+ambrose AE M B R OW Z
+ambrosia AE M B R OW ZH AH
+ambrosial AE M B R OW ZH AH L
+ambrosian AE M B R OW Z AH N
+ambrosiano AE M B R OW S IY AA N OW
+ambrosine AA M B R OW S IY N IY
+ambrosini AA M B R OW S IY N IY
+ambrosino AA M B R OW S IY N OW
+ambrosio AE M B R OW S IY OW
+ambrosius AE M B R AH S IY IH S
+ambs AE M Z
+ambuehl AE M B UH L
+ambulance AE M B Y AH L AH N S
+ambulances AE M B Y AH L AH N S AH Z
+ambulances(2) AE M B Y AH L AH N S IH Z
+ambulatory AE M B Y AH L AH T AO R IY
+amburgey AE M B ER G IY
+amburn AH M B ER N
+ambush AE M B UH SH
+ambushed AE M B UH SH T
+ambushes AE M B UH SH IH Z
+ambushing AE M B UH SH IH NG
+amc EY EH M S IY
+amca AE M K AH
+amcast AE M K AE S T
+amcole AE M K OW L
+amcor AE M K AO R
+amcore AE M K AO R
+amdahl AE M D AA L
+amdahl's AE M D AA L Z
+amdec AE M D EH K
+amdek AE M D EH K
+amdur AE M D ER
+amdura AE M D UH R AH
+ame EY M
+ameche AH M IY CH IY
+amedco AH M EH D K OW
+amedee AE M IH D IY
+ameen AH M IY N
+amelia AH M IY L Y AH
+amelinda AA M EH L IY N D AH
+ameline AA M EH L IY N IY
+amelio AH M IY L IY OW
+ameliorate AH M IY L Y ER EY T
+ameliorated AH M IY L IY ER EY T IH D
+ameliorated(2) AH M IY L Y ER EY T IH D
+amelioration AH M IY L Y ER EY SH AH N
+amelita AA M EH L IY T AH
+amell AA M EY L
+amen EY M EH N
+amen(2) AA M EH N
+amenable AH M EH N AH B AH L
+amenable(2) AH M IY N AH B AH L
+amenaces AH M EH N AH S AH Z
+amend AH M EH N D
+amendable AH M EH N D AH B AH L
+amended AH M EH N D AH D
+amended(2) AH M EH N D IH D
+amending AH M EH N D IH NG
+amendment AH M EH N D M AH N T
+amendment's AH M EH N D M AH N T S
+amendments AH M EH N D M AH N T S
+amendola AA M EH N D OW L AH
+amends AH M EH N D Z
+amenities AH M EH N AH T IY Z
+amenities(2) AH M EH N IH T IY Z
+amenity AH M EH N AH T IY
+ament AE M IH N T
+amenta AH M EH N T AH
+amer EY M ER
+amerada AE M EH R AA D AH
+amerada(2) AE M ER AA D AH
+amerco AH M EH R K OW
+amerford EY M ER F ER D
+ameri AH M EH R IY
+ameribanc AH M EH R IH B AE NG K
+america AH M EH R AH K AH
+america's AH M EH R AH K AH Z
+america's(2) AH M EH R IH K AH Z
+america(2) AH M EH R IH K AH
+american AH M EH R AH K AH N
+american's AH M EH R IH K AH N Z
+american(2) AH M EH R IH K AH N
+americana AH M EH R AH K AE N AH
+americana's AH M EH R AH K AE N AH Z
+americanas AH M EH R AH K AE N AH Z
+americanism AH M EH R IH K AH N IH Z AH M
+americanization AH M EH R AH K AH N AH Z EY SH AH N
+americanize AH M EH R AH K AH N AY Z
+americanized AH M EH R IH K AH N AY Z D
+americano AH M EH R IH K AA N OW
+americanos AH M EH R IH K AA N OW Z
+americans AH M EH R AH K AH N Z
+americans' AH M EH R IH K AH N Z
+americans(2) AH M EH R IH K AH N Z
+americar AH M EH R IH K AA R
+americare AH M EH R IH K EH R
+americares AH M EH R IH K EH R Z
+americas AH M EH R AH K AH Z
+americas' AH M EH R IH K AH Z
+americas(2) AH M EH R IH K AH Z
+americo AH M ER AH K OW
+americold AH M EH R IH K OW L D
+americorp AH M EH R IH K AO R
+americorp(2) AH M EH R IH K AO R P
+americorps AH M EH R IH K AO R
+americus AH M EH R IH K AH S
+ameridata AH M EH R AH D AE T AH
+amerifirst AH M EH R IH F ER S T
+amerifirst's AH M EH R IH F ER S T S
+amerigas AH M EH R IH G AE S
+amerigo AA M ER IY G OW
+amerihost AH M EH R AH HH OW S T
+amerika AH M EH R IH K AH
+amerindian AE M ER IH N D IY AH N
+amerine AA M ER IY N IY
+ameritech AH M EH R IH T EH K
+ameritech's AH M EH R IH T EH K S
+ameritrust AH M EH R IH T R AH S T
+amerman AE M ER M AH N
+amero AA M EH R OW
+ameron AE M ER AA N
+ameron's AE M ER AA N Z
+amerongen AE M ER AO N JH AH N
+amersham AE M ER SH AE M
+amerson AE M ER S AH N
+amery AE M ER IY
+ames EY M Z
+ames' EY M Z
+ames's EY M Z IH Z
+amesville EY M Z V IH L
+ametek AE M AH T EH K
+ametek's AE M AH T EH K S
+amethyst AE M IH TH IH S T
+amev AE M EH V
+amex AE M EH K S
+amex's AE M EH K S IH Z
+amexco AH M EH K S K OW
+amexco's AH M EH K S K OW Z
+amey EY M IY
+amezcua AH M EH Z K Y UW AH
+amezquita AA M EH Z K W IY T AH
+amfac AE M F AE K
+amfesco AE M F EH S K OW
+amgen AE M JH EH N
+amgen's AE M JH EH N Z
+amherst AE M ER S T
+amherstdale AE M ER S T D EY L
+amhoist AE M HH OY S T
+ami AA M IY
+amiability EY M IY AH B IH L AH T IY
+amiable EY M IY AH B AH L
+amiably EY M IY AH B L IY
+amicable AE M IH K AH B AH L
+amicably AE M IH K AH B L IY
+amick AE M IH K
+amico AA M IY K OW
+amicone AE M IH K OW N
+amicus AH M IY K AH S
+amid AH M IH D
+amidi AA M IY D IY
+amidon AE M IH D AA N
+amidships AH M IH D SH IH P S
+amidst AH M IH D S T
+amie AE M IY
+amiga AH M IY G AH
+amigo AH M IY G OW
+amigos AH M IY G OW Z
+amilia AA M IY L IY AH
+amin AA M IY N
+amino AH M IY N OW
+aminta AH M IH N T AH
+amiot EY M IY AH T
+amiprilose AH M IH P R AH L OW S
+amir AH M IH R
+amir's AH M IH R Z
+amir's(2) AA M IH R Z
+amir(2) AA M IH R
+amiram AE M ER AE M
+amiran AE M IH R AH N
+amirault AE M AY R AW L T
+amirav AE M IH R AE V
+amiri AA M IH R IY
+amis AE M IH S
+amish AA M IH SH
+amish(2) EY M IH SH
+amison AE M IH S AH N
+amiss AH M IH S
+amistad AE M AH S T AE D
+amit AA M IY T
+amitai AE M IH T AY
+amity AE M IH T IY
+amityville AE M IH T IY V IH L
+amman AE M AH N
+amman(2) AH M AA N
+ammann AE M AH N
+ammeen AH M IY N
+ammerman AE M ER M AH N
+ammeter AE M IY T ER
+ammeters AE M IY T ER Z
+ammirati AA M IH R AA T IY
+ammo AE M OW
+ammon AE M AH N
+ammonia AH M OW N Y AH
+ammonite AE M AH N AY T
+ammonites AE M AH N AY T S
+ammonium AH M OW N IY AH M
+ammons AE M AH N Z
+ammunition AE M Y AH N IH SH AH N
+ammunitions AE M Y AH N IH SH AH N Z
+amnesia AE M N IY ZH AH
+amnesiac AE M N IY Z IY AE K
+amnesties AE M N AH S T IY Z
+amnesty AE M N AH S T IY
+amnio AE M N IY OW
+amniocentesis AE M N IY OW S EH N T IY S IH S
+amniotic AE M N IY AO T IH K
+amo AA M OW
+amoco AE M AH K OW
+amoco's AE M AH K OW Z
+amoeba AH M IY B AH
+amoebas AH M IY B AH Z
+amoebic AH M IY B IH K
+amok AH M AH K
+amon AA M AO N
+among AH M AH NG
+amongst AH M AH NG S T
+amoolya AH M UW L Y AH
+amor AE M ER
+amoral EY M AO R AH L
+amore AA M AO R
+amorette AE M ER EH T
+amorist AE M ER AH S T
+amorita AA M AO R IY T AH
+amorosi AA M AO R OW S IY
+amoroso AA M AO R OW S OW
+amorous AE M ER AH S
+amorphous AH M AO R F AH S
+amortization AE M ER T IH Z EY SH AH N
+amortize AE M ER T AY Z
+amortized AE M ER T AY Z D
+amortizing AE M ER T AY Z IH NG
+amoruso AE M ER UW S OW
+amory EY M ER IY
+amos EY M AH S
+amos's EY M AH S IH Z
+amoskeag AE M AH S K EY G
+amoskeag's AE M AH S K EY G Z
+amoss AH M AO S
+amount AH M AW N T
+amounted AH M AW N T IH D
+amounted(2) AH M AW N IH D
+amounting AH M AW N T IH NG
+amounting(2) AH M AW N IH NG
+amounts AH M AW N T S
+amoxicillin AH M AO K S AH S IH L IH N
+amp AE M P
+ampad AE M P AE D
+ampal AE M P AH L
+amparan AE M P ER AH N
+ampato AA M P AA T OW
+ampco AE M P K OW
+amperage AE M P ER IH JH
+ampersand AE M P ER S AE N D
+ampex AE M P EH K S
+amphenol AE M F AH N AO L
+amphetamine AE M F EH T AH M IY N
+amphetamines AE M F EH T AH M IY N Z
+amphibian AE M F IH B IY AH N
+amphibians AE M F IH B IY AH N Z
+amphibious AE M F IH B IY AH S
+amphibole AE M F AH B OW L
+amphibole(2) AE M F IH B OW L
+amphitheater AE M F AH TH IY AH T ER
+amphitheaters AE M F AH TH IY AH T ER Z
+amphitheatre AE M P AH TH IY AH T ER
+amphora AE M F ER AH
+amphorae AE M F ER IY
+ample AE M P AH L
+amplicons AE M P L IH K AO N Z
+amplification AE M P L AH F AH K EY SH AH N
+amplifications AE M P L AH F AH K EY SH AH N Z
+amplified AE M P L AH F AY D
+amplifier AE M P L AH F AY ER
+amplifiers AE M P L AH F AY ER Z
+amplifies AE M P L AH F AY Z
+amplify AE M P L AH F AY
+amplifying AE M P L AH F AY IH NG
+ampligen AE M P L IH JH EH N
+amplitude AE M P L AH T UW D
+amplocore AE M P L AH K AO R
+amply AE M P L IY
+ampol AE M P AO L
+amputate AE M P Y AH T EY T
+amputated AE M P Y AH T EY T IH D
+amputation AE M P Y AH T EY SH AH N
+amputations AE M P Y UW T EY SH AH N Z
+amputee AE M P Y AH T IY
+amputees AE M P Y AH T IY Z
+amr AA M ER
+amraam AE M R AA M
+amre AE M R AH
+amrein AE M R AY N
+amrep AE M R EH P
+amrhein AE M ER HH AY N
+amrine AE M R IY N
+amritsar AE M R IH T S ER
+amritsar(2) AE M R IH T S AA R
+amro AE M R OW
+ams AE M Z
+amsbaugh AE M Z B AO
+amsco AE M S K OW
+amsden AE M Z D AH N
+amsler AE M Z L ER
+amsouth AE M S AW TH
+amspacher AE M S P AH K ER
+amstar AE M S T AA R
+amster AE M S T ER
+amsterdam AE M S T ER D AE M
+amsterdam's AE M S T ER D AE M Z
+amstrad AE M S T R AE D
+amstutz AE M S T AH T S
+amtech AE M T EH K
+amtrack AE M T R AE K
+amtrak AE M T R AE K
+amtrak's AE M T R AE K S
+amuck AH M AH K
+amulet AE M Y AH L AH T
+amulets AE M Y AH L AH T S
+amundsen EY M AH N D S AH N
+amundsen(2) AA M AH N D S AH N
+amundson AE M AH N D S AH N
+amuse AH M Y UW Z
+amused AH M Y UW Z D
+amusement AH M Y UW Z M AH N T
+amusements AH M Y UW Z M AH N T S
+amusements' AH M Y UW Z M AH N T S
+amuses AH M Y UW Z IH Z
+amusing AH M Y UW Z IH NG
+amusingly AH M Y UW Z IH NG L IY
+amvest AE M V EH S T
+amvestor AE M V EH S T ER
+amvestors AE M V EH S T ER Z
+amway AE M W EY
+amy EY M IY
+amy's EY M IY Z
+amygdala AE M IH G D AA L AH
+amylin AE M IH L IH N
+amyloid AE M IH L OY D
+amyotrophic AE M AY AH T R OW F IH K
+amyotrophic(2) AE M IY AH T R OW F IH K
+amyx AE M IH K S
+an AE N
+an(2) AH N
+ana AA N AH
+ana(2) AE N AH
+anabaptist AE N AH B AE P T AH S T
+anable EY N AH B AH L
+anabolic AE N AH B AA L IH K
+anac AE N AE K
+anachronism AH N AE K R AH N IH Z AH M
+anachronisms AH N AE K R AH N IH Z AH M Z
+anachronistic AH N AE K R AH N IH S T IH K
+anacin AE N AH S IH N
+anacker AE N AH K ER
+anacomp AE N AH K AA M P
+anaconda AE N AH K AA N D AH
+anacortes AE N AH K AO R T AH S
+anacostia AE N AH K AA S T IY AH
+anacostia's AE N AH K AA S T IY AH Z
+anadarko AE N AH D AA R K OW
+anadarko's AE N AH D AA R K OW Z
+anaerobe AE N ER OW B
+anaerobes AE N ER OW B Z
+anaerobic AE N ER OW B IH K
+anaesthesia AE N AH S TH IY ZH AH
+anafranil AH N AE F R AH N IH L
+anagnos AA N AA G N OW Z
+anagram AE N AH G R AE M
+anaheim AE N AH HH AY M
+anal EY N AH L
+analgesic AE N AH L JH IY S IH K
+analgesics AE N AH L JH IY Z IH K S
+analog AE N AH L AO G
+analogic AE N AH L AA JH IH K
+analogies AH N AE L AH JH IY Z
+analogous AH N AE L AH G AH S
+analogue AE N AH L AO G
+analogy AH N AE L AH JH IY
+analyses AH N AE L AH S IY Z
+analysis AH N AE L AH S AH S
+analysis(2) AH N AE L IH S IH S
+analyst AE N AH L AH S T
+analyst's AE N AH L IH S T S
+analyst's(2) AE N AH L IH S
+analyst(2) AE N AH L IH S T
+analysts AE N AH L AH S T S
+analysts' AE N AH L IH S T S
+analysts'(2) AE N AH L IH S
+analysts(2) AE N AH L IH S T S
+analysts(3) AE N AH L AH S
+analysts(4) AE N AH L IH S
+analytic AE N AH L IH T IH K
+analytical AE N AH L IH T IH K AH L
+analytically AE N AH L IH T IH K L IY
+analyticity AE N AH L AH T IH S AH T IY
+analytics AE N AH L IH T IH K S
+analyzable AE N AH L AY Z AH B AH L
+analyze AE N AH L AY Z
+analyzed AE N AH L AY Z D
+analyzer AE N AH L AY Z ER
+analyzers AE N AH L AY Z ER Z
+analyzes AE N AH L AY Z IH Z
+analyzing AE N AH L AY Z IH NG
+anamaria AE N AH M AH R IY AH
+anand AE N AH N D
+anandale AE N AH N D EY L
+anandeep AA N AA N D IY P
+anania AA N AA N IY AH
+anantha AH N AE N TH AH
+anaphora AH N AE F ER AH
+anaphylaxis AE N AH F AH L AE K S IH S
+anarchic AE N AA R K IH K
+anarchical AE N AA R K AH K AH L
+anarchist AE N ER K AH S T
+anarchists AE N ER K AH S T S
+anarchy AE N ER K IY
+anaren AE N ER AH N
+anas AE N AH S
+anasazi AE N AH S AE Z IY
+anasazi(2) AE N AH S AA Z IY
+anasquan AE N AH S K W AA N
+anast AA N AA S T
+anastas AE N AH S T AH Z
+anastasi AA N AA S T AA S IY
+anastasia AE N AH S T EY ZH AH
+anastasio AA N AA S T AA S IY OW
+anastasio(2) AE N AH S T AA S IY OW
+anastos AE N AH S T OW Z
+anathema AH N AE TH AH M AH
+anatola AA N AA T OW L AH
+anatole AE N AH T OW L
+anatoli AE N AH T OW L IY
+anatolia AE N AH T OW L IY AH
+anatolian AE N AH T OW L IY AH N
+anatoly AE N AH T OW L IY
+anatomical AE N AH T AA M AH K AH L
+anatomical(2) AE N AH T AA M IH K AH L
+anatomically AE N AH T AA M AH K L IY
+anatomist AH N AE T AH M AH S T
+anatomist(2) AH N AE T AH M IH S T
+anatomy AH N AE T AH M IY
+anawalt AE N AH W AA L T
+anaya AA N AA Y AH
+anbari AE N B AA R IY
+ancel AH N S EH L
+ancell AA N S EY L
+ancestor AE N S EH S T ER
+ancestor's AE N S EH S T ER Z
+ancestors AE N S EH S T ER Z
+ancestors' AE N S EH S T ER Z
+ancestral AE N S EH S T R AH L
+ancestry AE N S EH S T R IY
+ancheta AA N K EH T AH
+ancho AE N CH OW
+anchondo AA N K OW N D OW
+anchor AE NG K ER
+anchor's AE NG K ER Z
+anchorage AE NG K ER AH JH
+anchorage(2) AE NG K R IH JH
+anchored AE NG K ER D
+anchoring AE NG K ER IH NG
+anchorman AE NG K ER M AE N
+anchorman(2) AE NG K ER M AH N
+anchormen AE NG K ER M EH N
+anchors AE NG K ER Z
+anchovies AE N CH OW V IY Z
+anchovy AE N CH OW V IY
+ancient EY N CH AH N T
+ancient(2) EY N SH AH N T
+ancients EY N CH AH N T S
+ancients(2) EY N SH AH N T S
+ancillary AE N S AH L EH R IY
+ancira AA N CH IH R AH
+ancona AA N K OW N AH
+ancrum AH N K R AH M
+anctil AE NG K T IH L
+and AH N D
+and(2) AE N D
+andal AE N D AH L
+andalusia AE N D AH L UW ZH AH
+andalusian AE N D AH L UW SH AH N
+andante AA N D AA N T EY
+andantino AA N D AA N T IY N OW
+andean AE N D IY AH N
+andel AE N D AH L
+ander AE N D ER
+andera AE N D ER AH
+anderberg AE N D ER B ER G
+anderegg AE N D ER IH G
+anderle AE N D ER AH L
+anderlini AE N D ER L IY N IY
+anderman AE N D ER M AH N
+anders AE N D ER Z
+andersen AE N D ER S AH N
+andersen's AE N D ER S AH N Z
+anderson AE N D ER S AH N
+anderson's AE N D ER S AH N Z
+andersons AE N D ER S AH N Z
+andersonville AE N D ER S AH N V IH L
+andersson AE N D ER S AH N
+andert AE N D ER T
+anderton AE N D ER T AH N
+andes AE N D IY Z
+andesite AE N D IH S AY T
+andie AE N D IY
+anding AE N D IH NG
+andino AA N D IY N OW
+andiron AE N D AY ER N
+andis AE N D IH S
+andler AE N D L ER
+ando AE N D OW
+andolina AA N D OW L IY N AH
+andonian AE N D OW N IY AH N
+andoras AE N D AO R AH Z
+andorra AE N D AO R AH
+andover AE N D OW V ER
+andrada AA N D R AA D AH
+andrade AE N D R EY D
+andrae AA N D R AY
+andraki AE N D AE K IY
+andras AA N D R AH S
+andre AA N D R EY
+andrea AE N D R IY AH
+andrea's AE N D R IY AH Z
+andrea's(2) AA N D R EY AH Z
+andrea(2) AA N D R EY AH
+andreae AA N D R EY AA
+andreana AE N D R IY N AH
+andreana(2) AE N D R IY AA N AH
+andreani AE N D R IY N IY
+andreani(2) AE N D R IY AA N IY
+andreano AE N D R IY N OW
+andreano(2) AE N D R IY AA N OW
+andreas AA N D R EY AH S
+andreasen AE N D R IY S AH N
+andreason AE N D R IY S AH N
+andreassen AE N D R AH S AH N
+andree AH N D R IY
+andreen AH N D R IY N
+andrei AE N D R EY
+andreini AA N D R EY IY N IY
+andrej AA N D R EY
+andren AE N D ER AH N
+andreoli AA N D R EY OW L IY
+andreoni AA N D R EY OW N IY
+andreotti AA N D R IY AA T IY
+andreotti(2) AE N D R IY AA D IY
+andreozzi AA N D R IY AA T S IY
+andrepont AA N D R EY P OW N T
+andres AA N D R EY Z
+andres(2) AE N D R EY Z
+andresen AE N D R IY S AH N
+andreski AE N D R EH S K IY
+andress AA N D R EH S
+andretti AE N D R EH T IY
+andretti's AE N D R EH T IY Z
+andreu AE N D R UW
+andrew AE N D R UW
+andrew's AE N D R UW Z
+andrews AE N D R UW Z
+andrews' AE N D R UW Z
+andrey AE N D R IY
+andrezak AE N D R AH Z AE K
+andria AE N D R IY AH
+andriana AA N D R IY AE N AH
+andriano AA N D R IY AA N OW
+andric AE N D R IH K
+andrich AE N D R IH K
+andrick AE N D R IH K
+andries AH N D R IY Z
+andriessen AE N D R IY S AH N
+andringa AA N D R IY NG G AH
+andriola AA N D R IY OW L AH
+andrist AE N D R IH S T
+androgynous AE N D R AO JH AH N AH S
+androgyny AE N D R AO JH AH N IY
+android AE N D R OY D
+androids AE N D R OY D Z
+andromeda AE N D R AA M AH D AH
+andropov AE N D R AA P AA V
+andros AE N D R AA S
+andrus AE N D R AH S
+andruskevich AE N D R AH S EH V IH CH
+andry AE N D R IY
+andrzej AA N D R EY
+andrzejewski AH N JH EY EH F S K IY
+ands AE N D Z
+andujar AA N D UW Y AA R
+andy AE N D IY
+andy's AE N D IY Z
+ane EY N
+ane(2) AE N
+anecdotal AE N AH K D OW T AH L
+anecdotal(2) AE N IH K D OW T AH L
+anecdotally AE N AH K D OW T AH L IY
+anecdotally(2) AE N IH K D OW T AH L IY
+anecdote AE N AH K D OW T
+anecdotes AE N AH K D OW T S
+anecdotes(2) AE N IH K D OW T S
+anello AH N EH L OW
+anemia AH N IY M IY AH
+anemias AH N IY M IY AH Z
+anemic AH N IY M IH K
+anemometer AE N AH M AA M AH T ER
+anemone AE N IH M OW N
+anemone(2) AH N EH M AH N IY
+anencephalic AE N EH N S AH F AE L IH K
+anencephalic(2) AE N IH N S EH F AH L IH K
+anencephaly AE N IH N S EH F AH L IY
+anestachio AE N IH S T AE CH IY OW
+anesthesia AE N IH S TH IY ZH AH
+anesthesiologist AE N AH S TH IY Z IY AA L AH JH AH S T
+anesthesiologists AE N AH S TH IY Z IY AA L AH JH AH S T S
+anesthesiologists(2) AE N AH S TH IY Z IY AA L AH JH AH S
+anesthesiology AE N AH S TH IY Z IY AA L AH JH IY
+anesthetic AE N AH S TH EH T IH K
+anesthetics AE N AH S TH EH T IH K S
+anesthetist AH N EH S TH AH T AH S T
+anette AH N EH T
+aneurism AE N Y UH R IH Z AH M
+aneurism(2) AE N Y UH R IH Z M
+anew AH N UW
+anew(2) AH N Y UW
+anfal EY EH N EH F EY EH L
+anfal(2) AE N F AA L
+anfinson AE N F IH N S AH N
+ang AE NG
+ange EY N JH
+angel EY N JH AH L
+angela AE N JH AH L AH
+angela's AE N JH AH L AH Z
+angeleno AE N JH AH L EH N OW
+angeleno(2) AE N JH AH L IY N OW
+angelenos AE N JH AH L EH N OW Z
+angelenos(2) AE N JH AH L IY N OW Z
+angeles AE N JH AH L IH S
+angeles' AE N JH AH L IY Z
+angeles's AE N JH AH L IH S IH Z
+angeletti AA NG G EH L EH T IY
+angelfish EY N JH AH L F IH SH
+angeli AA NG G EH L IY
+angelic AE N JH EH L IH K
+angelica AE N JH EH L IH K AH
+angelica(2) AE N JH AH L IY K AH
+angelically AE N JH EH L IH K L IY
+angelicas AE N JH EH L IH K AH Z
+angelico AA NG G EH L IY K OW
+angelika AE N JH EH L IH K AH
+angelillo AA NG G EH L IH L OW
+angelina AE N JH EH L IY N AH
+angeline EY NG G IH L AY N
+angeline(2) AE N JH AH L IY N
+angelini AA NG G EH L IY N IY
+angelino AE N JH AH L IY N OW
+angelino's AE N JH AH L IY N OW Z
+angelino's(2) AA NG G EH L IY N OW Z
+angelino(2) AA NG G EH L IY N OW
+angelinos AE N JH AH L IY N OW Z
+angelinos(2) AE NG G AH L IY N OW Z
+angelita AA NG G EH L IY T AH
+angell EY N JH AH L
+angelle EY NG G EH L
+angello AE N JH EH L OW
+angelo AE N JH AH L OW
+angelo's AE N JH AH L OW Z
+angeloff EY NG G IH L AO F
+angeloff(2) AE N JH IH L AO F
+angelone AA NG G EH L OW N IY
+angeloni AA NG G EH L OW N IY
+angelos AE N JH AH L OW Z
+angelou AE N JH AH L UW
+angeloz AE N JH AH L OW Z
+angels EY N JH AH L Z
+angels' EY N JH AH L Z
+angelucci AA NG G EH L UW CH IY
+anger AE NG G ER
+angered AE NG G ER D
+angerer AE NG G ER ER
+angering AE NG G ER IH NG
+angerman AE NG ER M AH N
+angermeier EY NG G ER M AY ER
+angers AE NG G ER Z
+angert EY NG G ER T
+angevine EY NG G IH V AY N
+angi AE N JH IY
+angie AE N JH IY
+angier AE N JH IY ER
+angina AE N JH AY N AH
+angio AE N JH IY OW
+angiogram AE N JH IY OW G R AE M
+angiomedic AE N JH IY OW M EH D IH K
+angiomedics AE N JH IY OW M EH D IH K S
+angioplasty AE N JH IY AH P L AE S T IY
+angiotensin AE N JH IY OW T EH N S IH N
+angle AE NG G AH L
+angled AE NG G AH L D
+anglemyer AE NG G AH L M AY ER
+anglen AE NG G AH L AH N
+angler AE NG G L ER
+anglers AE NG G L ER Z
+angles AE NG G AH L Z
+angleton AE NG G AH L T AH N
+angley AE NG G L IY
+anglia AE NG G L IY AH
+anglican AE NG G L AH K AH N
+anglicize AE NG L IH S AY Z
+anglicized AE NG L IH S AY Z D
+anglim AE NG G L IH M
+anglin AE NG G L IH N
+angling AE NG G L IH NG
+anglo AE NG G L OW
+anglo-catholicism AE NG G L OW K AH TH AO L AH S IH Z AH M
+anglophile AE N G L AH F AY L
+anglos AE NG G L OW Z
+anglos(2) AE NG G L OW S
+angola AE NG G OW L AH
+angola's AE NG G OW L AH Z
+angolan AE NG G OW L AH N
+angolans AE NG G OW L AH N Z
+angora AE NG G AO R AH
+angoras AE NG G AO R AH Z
+angotti AA NG G OW T IY
+angove AA NG G OW V IY
+angrier AE NG G R IY ER
+angriest AE NG G R IY AH S T
+angrily AE NG G R AH L IY
+angry AE NG G R IY
+angst AA NG K S T
+angstadt AE NG SH T AE T
+angstadt(2) AE NG S T AE T
+angstrom AE NG S T R AH M
+angstroms AE NG S T R AH M Z
+anguiano AA NG G IY AA N OW
+anguilla AE NG W IH L AH
+anguish AE NG G W IH SH
+anguished AE NG G W IH SH T
+anguishing AE NG G W IH SH IH NG
+angular AE NG G Y AH L ER
+angulate AE NG G Y UW L EY T
+angulated AE NG G Y UW L EY T IH D
+angulo AA NG G UW L OW
+angus AE NG G AH S
+angy AE N JH IY
+anhalt AE N HH AH L T
+anheuser AE N HH AY Z ER
+anheuser's AE N HH Y UW Z ER Z
+anhydride AE N HH AY D R IH D
+aniak AE N IY AE K
+anibal AE N IH B AH L
+anikst AE N IH K S T
+aniline AE N AH L IY N
+animal AE N AH M AH L
+animal's AE N AH M AH L Z
+animals AE N AH M AH L Z
+animals' AE N AH M AH L Z
+animate AE N AH M AH T
+animate(2) AE N AH M EY T
+animated AE N AH M EY T AH D
+animated(2) AE N AH M EY T IH D
+animates AE N AH M AH T S
+animates(2) AE N AH M EY T S
+animation AE N AH M EY SH AH N
+animations AE N AH M EY SH AH N Z
+animator AE N AH M EY T ER
+animators AE N AH M EY T ER Z
+animism AE N AH M IH Z AH M
+animist AE N AH M AH S T
+animists AE N AH M AH S T S
+animists(2) AE N AH M AH S
+animosities AE N AH M AA S AH T IY Z
+animosity AE N AH M AA S AH T IY
+animous AE N IH M AH S
+animus AE N IH M AH S
+aninat AE N IH N AE T
+anise AE N AH S
+aniseed AE N AH S IY D
+anisette AE N AH S EH T
+anita AH N IY T AH
+anitec AE N IH T EH K
+anitole AE N IH T OW L
+anixter AE N IH K S T ER
+anja AA N JH AH
+anjelica AE N JH EH L AH K AH
+ankara AE NG K ER AH
+ankara's AE NG K ER AH Z
+ankeney AH NG K EH N IY
+ankeny AH NG K IY N IY
+anker AE NG K ER
+ankerium AE NG K ER IY AH M
+ankh AE N K
+anklam AE NG K L AH M
+ankle AE NG K AH L
+anklebone AE NG K AH L B OW N
+ankles AE NG K AH L Z
+anklet AE NG K L IH T
+anklets AE NG K L AH T S
+ankney AE NG K N IY
+ankrom AE NG K R AH M
+ankrum AE NG K R AH M
+ann AE N
+ann's AE N Z
+anna AE N AH
+anna's AE N AH Z
+annabel AE N AH B EH L
+annabella AE N AH B EH L AH
+annabelle AE N AH B AH L
+annable AE N AH B AH L
+annal AE N AH L
+annals AE N AH L Z
+annamese AE N AH M IY Z
+annan AE N AH N
+annandale AE N AH N D EY L
+annapolis AH N AE P AH L IH S
+annapolis's AH N AE P AH L IH S IH Z
+annas AE N AH Z
+annaud AH N OW D
+anne AE N
+anne's AE N Z
+anneal AH N IY L
+annealing AH N IY L IH NG
+annelid AE N AH L IH D
+annelids AE N AH L IH D Z
+annen AE N AH N
+annenberg AE N AH N B ER G
+annese AA N EY Z IY
+annett AH N EH T
+annette AH N EH T
+annex AE N EH K S
+annex(2) AH N EH K S
+annexation AE N EH K S EY SH AH N
+annexed AE N EH K S T
+annexed(2) AH N EH K S T
+annexes AE N EH K S IH Z
+annexing AH N EH K S IH NG
+annick AE N IH K
+annie AE N IY
+annie's AE N IY Z
+annihilate AH N AY AH L EY T
+annihilated AH N AY AH L EY T IH D
+annihilating AH N AY AH L EY T IH NG
+annihilation AH N AY AH L EY SH AH N
+annis AE N IY Z
+anniston AE N IH S T IH N
+anniston(2) AE N IH S IH N
+anniversaries AE N AH V ER S ER IY Z
+anniversary AE N AH V ER S ER IY
+anno AE N OW
+annotate AE N AH T EY T
+annotated AE N AH T EY T IH D
+annotated(2) AE N AH T EY T AH D
+annotates AE N AH T EY T S
+annotating AE N AH T EY T IH NG
+annotation AE N AH T EY SH AH N
+annotations AE N AH T EY SH AH N Z
+announce AH N AW N S
+announced AH N AW N S T
+announcement AH N AW N S M AH N T
+announcement(2) AH N AW N S M EH N T
+announcements AH N AW N S M AH N T S
+announcer AH N AW N S ER
+announcers AH N AW N S ER Z
+announces AH N AW N S IH Z
+announcing AH N AW N S IH NG
+announcment AH N AW N S M AH N T
+annoy AH N OY
+annoyance AH N OY AH N S
+annoyances AH N OY AH N S IH Z
+annoyed AH N OY D
+annoying AH N OY IH NG
+annoys AH N OY Z
+annual AE N Y UW AH L
+annualize AE N Y UW W AH L AY Z
+annualized AE N Y UW W AH L AY Z D
+annually AE N Y UW AH L IY
+annuals AE N UW AH L Z
+annuit AH N UW IH T
+annuities AH N UW IH T IY Z
+annuity AH N UW AH T IY
+annuity(2) AH N UW IH T IY
+annuity(3) AH N Y UW IH T IY
+annul AE N AH L
+annular AE N Y AH L ER
+annulled AE N AH L D
+annulment AE N AH L M AH N T
+annum AE N AH M
+annunciata AA N UW N CH AA T AH
+annunziata AA N UW N Z IY AA T AH
+annunziato AA N UW N Z IY AA T OW
+annunzio AH N AH N Z IY OW
+annunzio(2) AH N UW N Z IY OW
+anny AE N IY
+ano AE N OW
+ano(2) AE N Y OW
+anode AE N OW D
+anodes AE N OW D Z
+anoint AH N OY N T
+anointed AH N OY N T AH D
+anointed(2) AH N OY N T IH D
+anointed(3) AH N OY N AH D
+anointed(4) AH N OY N IH D
+anomalies AH N AA M AH L IY Z
+anomalous AH N AA M AH L AH S
+anomaly AH N AA M AH L IY
+anomie AE N AH M IY
+anona AA N OW N AH
+anonymity AE N AH N IH M IH T IY
+anonymous AH N AA N AH M AH S
+anonymously AH N AA N AH M AH S L IY
+anora AA N AO R AH
+anorak AE N ER AE K
+anorexia AE N ER EH K S IY AH
+anorexic AE N ER EH K S IH K
+anorexics AE N ER EH K S IH K S
+anorthite AE N AO R TH AY T
+another AH N AH DH ER
+another's AH N AH DH ER Z
+anreder AE N R EH D ER
+anrig AE N R IH G
+ansa AE N S AH
+ansa's AE N S AH Z
+ansaid AE N S EY D
+ansaldo AE N S AA L D OW
+ansang AE N S AE NG
+ansari AA N S AA R IY
+ansbacher AE N Z B AA K ER
+anschel AE N SH AH L
+anschluss AE N SH L AH S
+anschluss(2) AA N SH L UW S
+anschutz AE N SH AH T S
+anscom AH N S K AA M
+anscomb AH N S K AA M
+anse AE N S
+ansel AH N S EH L
+ansell AE N S EH L
+anselm AE N S EH L M
+anselma AA N S EH L M AH
+anselmi AA N S EH L M IY
+anselmo AA N S EH L M OW
+ansett AE N S EH T
+ansgar AE N S G AA R
+ansgar's AE N S G AA R Z
+anshan AE N SH AH N
+ansin AE N S IH N
+ansley AE N S L IY
+ansohn AE N S AH N
+anson AE N S AH N
+ansonia AE N S OW N IY AH
+anspach AE N S P AA K
+anspaugh AH N S P AO
+anstead AE N S T EH D
+anstett AH N S T EH T
+anstey AE N S T IY
+anstice AA N S T IH S
+anstine AA N S T IY N IY
+anstiss AE N S T IH S
+answer AE N S ER
+answer's AE N S ER Z
+answerable AE N S ER AH B AH L
+answered AE N S ER D
+answering AE N S ER IH NG
+answers AE N S ER Z
+ant AE N T
+antacid AE N T AE S AH D
+antacids AE N T AE S AH D Z
+antagonism AE N T AE G AH N IH Z AH M
+antagonisms AE N T AE G AH N IH Z AH M Z
+antagonist AE N T AE G AH N AH S T
+antagonistic AE N T AE G AH N IH S T IH K
+antagonists AE N T AE G AH N AH S T S
+antagonists(2) AE N T AE G AH N AH S
+antagonize AE N T AE G AH N AY Z
+antagonized AE N T AE G AH N AY Z D
+antagonizing AE N T AE G AH N AY Z IH NG
+antal AE N T AH L
+antar AE N T ER
+antar's AE N T ER Z
+antarctic AE N T AA R K T IH K
+antarctic(2) AE N AA R T IH K
+antarctica AE N T AA R K T IH K AH
+antarctica's AE N T AA R K T IH K AH Z
+antarctica(2) AE N AA R T IH K AH
+antares AE N T EH R IY Z
+antaya AA N T EY AH
+antczak AE N T CH AE K
+ante AE N T IY
+anteater AE N T IY T ER
+anteaters AE N T IY T ER Z
+antebellum AE N T IH B EH L AH M
+antec AE N T EH K
+antecedent AE N T EH S AH D AH N T
+antecedent(2) AE N T IH S IY D AH N T
+antecedents AE N T IH S IY D AH N T S
+antecedents(2) AE N T EH S AH D AH N T S
+anted AE N T IH D
+anted(2) AE N T IY D
+antell AE N T EH L
+antelope AE N T AH L OW P
+antemeridian AE N T AH M EH R IH D IY AH N
+antemortem AE N T AH M AO R T AH M
+antenna AE N T EH N AH
+antenna's AE N T EH N AH Z
+antennae AE N T EH N IY
+antennas AE N T EH N AH Z
+antenne AE N T EH N
+antenucci AE N T IH N UW CH IY
+anterior AE N T IH R IY ER
+anteriormost AE N T IH R IY ER M OW S T
+antes AE N T IY Z
+anthea AE N TH IY AH
+anthem AE N TH AH M
+anthems AE N TH AH M Z
+anthes AE N DH AH Z
+anthiel AE N TH IY AH L
+anthill AE N T HH IH L
+anthills AE N T HH IH L Z
+anthis AE N TH IH S
+anthologies AE N TH AA L AH JH IY Z
+anthology AE N TH AA L AH JH IY
+anthon AE N TH AH N
+anthony AE N TH AH N IY
+anthony's AE N TH AH N IY Z
+anthracite AE N TH R AH S AY T
+anthrax AE N TH R AE K S
+anthrobot AE N TH R OW B AH T
+anthropocentric AE N TH R AH P AH S EH N T R IH K
+anthropogenic AE N TH R AH P AH JH EH N IH K
+anthropological AE N TH R AH P AH L AA JH AH K AH L
+anthropologist AE N TH R AH P AA L AH JH AH S T
+anthropologist(2) AE N TH R AH P AA L AH JH IH S T
+anthropologists AE N TH R AH P AA L AH JH AH S T S
+anthropologists(2) AE N TH R AH P AA L AH JH IH S T S
+anthropologists(3) AE N TH R AH P AA L AH JH IH S S
+anthropologists(4) AE N TH R AH P AA L AH JH IH S
+anthropology AE N TH R AH P AA L AH JH IY
+anthropomorphic AE N TH R AH P AH M AO R F IH K
+anthropomorphism AE N TH R AH P AH M AO R F IH Z AH M
+anti AE N T IY
+anti(2) AE N T AY
+anti-catholicism AE N T IY K AH TH AO L AH S IH Z AH M
+anti-catholicism(2) AE N T AY K AH TH AO L AH S IH Z AH M
+anti-federalist AE N T IY F EH D R AH L IH S T
+anti-federalists AE N T IY F EH D R AH L AH S T S
+anti-federalists(2) AE N T IY F EH D R AH L AH S S
+anti-federalists(3) AE N T IY F EH D R AH L AH S
+anti-infective AE N T IY IH N F EH K T IH V
+antiabortion AE N T IY AH B AO R SH AH N
+antiabortion(2) AE N T AY AH B AO R SH AH N
+antiaircraft AE N T AY EH R K R AE F T
+antibacterial AE N T IY B AE K T IH R IY AH L
+antiballistic AE N T IY B AH L IH S T IH K
+antibiotic AE N T IY B IY AA T IH K
+antibiotic(2) AE N T AY B AY AA T IH K
+antibioticos AE N T IY B IY AA T IH K OW S
+antibiotics AE N T IY B IY AA T IH K S
+antibiotics(2) AE N T AY B AY AA T IH K S
+antibodies AE N T IH B AA D IY Z
+antibodies(2) AE N T IY B AA D IY Z
+antibodies(3) AE N IH B AA D IY Z
+antibody AE N T IH B AA D IY
+antibody(2) AE N T IY B AA D IY
+antic AE N T IH K
+anticancer AE N T AY K AE N S ER
+anticancer(2) AE N T IY K AE N S ER
+anticipate AE N T IH S AH P EY T
+anticipated AE N T IH S AH P EY T AH D
+anticipated(2) AE N T IH S AH P EY T IH D
+anticipates AE N T IH S AH P EY T S
+anticipating AE N T IH S AH P EY T IH NG
+anticipation AE N T IH S AH P EY SH AH N
+anticipations AE N T IH S AH P EY SH AH N Z
+anticipatory AE N T IH S AH P AH T AO R IY
+anticlimactic AE N T IY K L AY M AE K T IH K
+anticline AE N T IH K L AY N
+antico AA N T IY K OW
+anticommunist AE N T IY K AA M Y AH N IH S T
+anticompetitive AE N T IH K AH M P EH T IH T IH V
+anticorruption AE N T AY K ER AH P SH AH N
+anticorruption(2) AE N T IY K ER AH P SH AH N
+anticrime AE N T IY K R AY M
+anticrime(2) AE N T AY K R AY M
+antics AE N T IH K S
+antidepressant AE N T IY D IH P R EH S AH N T
+antidepressants AE N T AY D IH P R EH S AH N T S
+antidepressants(2) AE N T IY D IH P R EH S AH N T S
+antidiscrimination AE N T IY D IH S K R IH M AH N EY SH AH N
+antidiscrimination(2) AE N T AY D IH S K R IH M AH N EY SH AH N
+antidisestablishmentarianism AE N T AY D IH S AH S T AE B L IH SH M AH N T EH R IY AH N IH Z AH M
+antidote AE N T IH D OW T
+antidote(2) AE N IH D OW T
+antidrug AE N T IH D R AH G
+antidumping AE N T IY D AH M P IH NG
+antidumping(2) AE N T AY D AH M P IH NG
+antifraud AE N T IY F R AA D
+antifraud(2) AE N T AY F R AA D
+antifreeze AE N T IY F R IY Z
+antifungal AE N T AY F AH NG G AH L
+antifungal(2) AE N T IY F AH NG G AH L
+antigay AE N T AY G EY
+antigay(2) AE N T IY G EY
+antigen AE N T AH JH AH N
+antigens AE N T IH JH AH N Z
+antigone AE T IH G AH N IY
+antigone's AE N T IH G AH N IY Z
+antigones AE N T IH G AH N IY Z
+antigovernment AE N T IY G AH V ER M AH N T
+antigovernment(2) AE N T AY G AH V ER M AH N T
+antigua AE N T IY G W AH
+antihistamine AE N T IY HH IH S T AH M AH N
+antihistamines AE N T IY HH IH S T AH M AH N Z
+antiknock AE N T IY N AA K
+antill AE N T IH L
+antilla AA N T IH L AH
+antilles AE N T IH L IY Z
+antilock AE N T IY L AA K
+antilock(2) AE N T AY L AA K
+antimatter AE T AY M AE T ER
+antimissile AE N T AY M IH S AH L
+antioch AE N T IY AA K
+antiochus AE N T AY AH K AH S
+antioxidant AE N T IY AA K S AH D AH N T
+antioxidants AE N T IY AA K S AH D AH N T S
+antipathies AE N T IH P AH TH IY Z
+antipathy AE N T IH P AH TH IY
+antipersonell AE N T AY P ER S AH N EH L
+antiphon AE N T AH F AA N
+antiphon(2) AE N T IH F AA N
+antiphons AE N T AH F AA N Z
+antiphons(2) AE N T IH F AA N Z
+antipodal AE N T IH P AH D AH L
+antipoverty AE N T AY P AA V ER T IY
+antipoverty(2) AE N T IY P AA V ER T IY
+antiquate AE N T AH K W EY T
+antiquated AE N T AH K W EY T AH D
+antiquated(2) AE N T AH K W EY T IH D
+antique AE N T IY K
+antiques AE N T IY K S
+antiquities AE N T IH K W AH T IY Z
+antiquity AE N T IH K W AH T IY
+antireformer AE N T IY R IH F AO R M ER
+antireformer(2) AE N T AY R IH F AO R M ER
+antireformers AE N T IY R IH F AO R M ER Z
+antireformers(2) AE N T AY R IH F AO R M ER Z
+antis AE N T AY Z
+antisense AE N T IY S EH N S
+antisense(2) AE N T AY S EH N S
+antiseptic AE N T AH S EH P T IH K
+antismoking AE N T IY S M OW K IH NG
+antismoking(2) AE N T AY S M OW K IH NG
+antisocial AE N T IH S OW SH AH L
+antisocial(2) AE N T AY S OW SH AH L
+antisubmarine AE N T IH S AH B M ER IY N
+antisubmarine(2) AE N T AY S AH B M ER IY N
+antitakeover AE N T IY T EY K OW V ER
+antitank AE N T IY T AE NG K
+antitax AE N T AY T AE K S
+antitax(2) AE N T IY T AE K S
+antitheft AE N T AY TH EH F T
+antitheft(2) AE N T IY TH EH F T
+antithesis AE N T IH TH AH S AH S
+antithetical AE N T AH TH EH T IH K AH L
+antitoxin AE N T IY T AA K S AH N
+antitoxins AE N T IY T AA K S AH N Z
+antitrust AE N T AY T R AH S T
+antiviral AE N T IY V AY R AH L
+antiwar AE N T AY W AO R
+antiwar(2) AE N T IY W AO R
+antkowiak AH N T K AW IY AE K
+antle AE N T AH L
+antler AE N T L ER
+antlered AE N T L ER D
+antlers AE N T L ER Z
+antley AE N T L IY
+antoine AA N T W AA N
+antoinette AE N T W AH N EH T
+antol AA N T AO L
+antolik AE N T AH L IH K
+antolini AE N T OW L IY N IY
+anton AE N T AO N
+antonacci AA N T OW N AA CH IY
+antone AA N T OW N IY
+antonelli AA N T OW N EH L IY
+antonellis AE N T AH N EH L IH S
+antonetti AA N T OW N EH T IY
+antoni AA N T OW N IY
+antonia AE N T OW N IY AH
+antonin AE N T AH N IH N
+antonini AA N T OW N IY N IY
+antonini's AA N T OW N IY N IY Z
+antonio AE N T OW N IY OW
+antonio's AE N T OW N IY OW Z
+antonios AE N T OW N IY OW Z
+antoniou AA N T OW N IY UW
+antoniu AE N T OW N IY UW
+antoniu's AE N T OW N IY UW Z
+antonius AE N T OW N IY AH S
+antonopoulos AE N T AH N AA P AH L IH S
+antonovich AE N T AA N AH V IH CH
+antonsen AH N T AA N S AH N
+antonson AE N T AH N S AH N
+antonucci AA N T OW N UW CH IY
+antony AE N T AH N IY
+antoon AE N T UW N
+antos AA N T OW Z
+antosh AH N T AA SH
+antril AE N T R IH L
+antrim AE N T R IH M
+antrobus AE N T R AH B IH S
+ants AE N T S
+antsy AE N T S IY
+anttila AA N T IY L AH
+antuna AA N T UW N AH
+antunes AA N T UW N EH S
+antunez AA N T UW N EH Z
+antwerp AE N T W ER P
+antwine AE N T W AY N
+anus EY N AH S
+anvil AE N V AH L
+anwar AE N W AA R
+anwar(2) AA N W AA R
+anway AH N W EY
+anwell AH N W EH L
+anwyl AE N W IH L
+anwyll AE N W IH L
+anxieties AE NG Z AY AH T IY Z
+anxiety AE NG Z AY AH T IY
+anxious AE NG K SH AH S
+anxious(2) AE NG SH AH S
+anxiously AE NG K SH AH S L IY
+any EH N IY
+anybody EH N IY B AH D IY
+anybody's EH N IY B AH D IY Z
+anyhow EH N IY HH AW
+anymore EH N IY M AO R
+anyon EH N IY AA N
+anyone EH N IY W AH N
+anyone'll EH N IY W AH N AH L
+anyone's EH N IY W AH N Z
+anyplace EH N IY P L EY S
+anything EH N IY TH IH NG
+anything's EH N IY TH IH NG Z
+anytime EH N IY T AY M
+anytime'll EH N IY T AY M AH L
+anytime's EH N IY T AY M Z
+anyway EH N IY W EY
+anyways EH N IY W EY Z
+anywhere EH N IY W EH R
+anywhere(2) EH N IY HH W EH R
+anza AE N Z AH
+anzaldua AA N Z AA L D UW AH
+anzalone AE N Z AH L OW N
+anzelmo AA N Z EH L M OW
+anzio AE N Z IY OW
+anzus AE N Z AH S
+aoi AW IY
+aoki EY OW K IY
+aol EY OW EH L
+aol(2) AH M ER IH K AH AA N L AY N
+aon EY OW N
+aorta EY AO R T AH
+aortic EY AO R T IH K
+aoshima AW SH IY M AH
+aoshima(2) EY OW SH IY M AH
+aoun AW AH N
+aoun's AW AH N Z
+aoun's(2) AW UW N Z
+aoun(2) AW UW N
+aouzou AW Y UW Z UW
+aoyama AW Y AA M AH
+aoyama(2) EY OW Y AA M AH
+apace AH P EY S
+apache AH P AE CH IY
+apache's AH P AE CH IY Z
+apaches AH P AE CH IY Z
+apacs EY P AE K S
+apalachicola AE P AH L AE CH AH K OW L AH
+apalachicola's AE P AH L AE CH AH K OW L AH Z
+aparicio AE P ER IH S IY OW
+apart AH P AA R T
+apartheid AH P AA R T AY T
+apartheid's AH P AA R T AY T S
+apartheid's(2) AH P AA R T AY D Z
+apartheid(2) AH P AA R T AY D
+apartment AH P AA R T M AH N T
+apartments AH P AA R T M AH N T S
+apathetic AE P AH TH EH T IH K
+apathy AE P AH TH IY
+apatite AE P AH T AY T
+apatites AE P AH T AY T S
+apc EY P IY S IY
+apc's EY P IY S IY Z
+apcar AE P K AA R
+apcar(2) AE P G AA R
+ape EY P
+apec EY P EH K
+apec's EY P EH K S
+apel AA P EH L
+apelike EY P L AY K
+apennine AE P AH N IY N
+aperture AE P ER CH ER
+apes EY P S
+apex EY P EH K S
+apex's EY P EH K S IH Z
+apfel AE P F AH L
+apfelbaum AE P F AH L B AW M
+apgar AE P G ER
+aphasia AH F EY ZH AH
+aphid AE F AH D
+aphid(2) EY F AH D
+aphids AE F IH D Z
+aphids(2) EY F AH D Z
+aphorism AE F ER IH Z AH M
+aphorisms AE F ER IH Z AH M Z
+aphrodisiac AE F R OW D IY Z IY AE K
+aphrodite AE F R AH D AY T IY
+aphrodite's AE F R AH D AY T IY Z
+aphrodites AE F R AH D AY T IY Z
+apicella AE P IH S EH L AH
+apiece AH P IY S
+aping EY P IH NG
+aplenty AH P L EH N T IY
+aplin AE P L IH N
+aplomb AH P L AA M
+apnea AE P N IY AH
+apocalypse AH P AA K AH L IH P S
+apocalyptic AH P AA K AH L IH P T IH K
+apocryphal AH P AA K R AH F AH L
+apodaca AA P OW D AA K AH
+apogee AE P AH JH IY
+apolitical EY P AH L IH T IH K AH L
+apolline AE P AH L AY N
+apollinian AE P AH L IH N IY AH N
+apollo AH P AA L OW
+apollo's AH P AA L OW Z
+apollonian AE P AH L OW N IY AH N
+apologetic AH P AA L AH JH EH T IH K
+apologetically AH P AA L AH JH EH T IH K L IY
+apologies AH P AA L AH JH IY Z
+apologist AH P AA L AH JH AH S T
+apologists AH P AA L AH JH AH S T S
+apologists(2) AH P AA L AH JH AH S S
+apologists(3) AH P AA L AH JH AH S
+apologize AH P AA L AH JH AY Z
+apologized AH P AA L AH JH AY Z D
+apologizes AH P AA L AH JH AY Z IH Z
+apologizing AH P AA L AH JH AY Z IH NG
+apology AH P AA L AH JH IY
+aponte AH P AA N T IY
+apopa AH P OW P AH
+apopka AH P AO P K AH
+apoplectic AE P AH P L EH K T IH K
+apoplexy AE P AH P L EH K S IY
+apostate AH P AO S T EY T
+apostle AH P AA S AH L
+apostles AH P AA S AH L Z
+apostol AE P AH S T AH L
+apostolopoul AH P AA S T OW L OW P UW L
+apostrophe AH P AA S T R AH F IY
+apothecary AH P AA TH AH K EH R IY
+apotheosis AH P AA TH IY OW S AH S
+app AE P
+appalachia AE P AH L AE CH IY AH
+appalachian AE P AH L EY CH AH N
+appalachian(2) AE P AH L EY SH AH N
+appalachian(3) AE P AH L AE CH AH N
+appalachians AE P AH L EY CH AH N Z
+appalachians(2) AE P AH L EY SH AH N Z
+appalachians(3) AE P AH L AE CH AH N Z
+appall AH P AO L
+appalled AH P AO L D
+appalling AH P AO L IH NG
+appallingly AH P AO L IH NG L IY
+appalls AH P AO L Z
+apparatchik AE P ER AE CH IH K
+apparatchiks AE P ER AE CH IH K S
+apparatus AE P ER AE T AH S
+apparatuses AE P ER AE T AH S AH Z
+apparel AH P AE R AH L
+apparel(2) AH P EH R AH L
+apparent AH P EH R AH N T
+apparently AH P EH R AH N T L IY
+apparition AE P ER IH SH AH N
+apparitions AE P ER IH SH AH N Z
+appeal AH P IY L
+appealable AH P IY L AH B AH L
+appealed AH P IY L D
+appealing AH P IY L IH NG
+appealingly AH P IY L IH NG L IY
+appeals AH P IY L Z
+appear AH P IH R
+appearance AH P IH R AH N S
+appearances AH P IH R AH N S AH Z
+appeared AH P IH R D
+appearing AH P IH R IH NG
+appears AH P IH R Z
+appease AH P IY Z
+appeased AH P IY Z D
+appeasement AH P IY Z M AH N T
+appeasing AH P IY Z IH NG
+appel AE P AH L
+appelbaum AE P AH L B AW M
+appelhans AE P IH L HH AH N Z
+appell AE P AH L
+appellate AH P EH L IH T
+appellate(2) AH P EH L EY T
+appellation AE P AH L EY SH AH N
+appellations AE P AH L EY SH AH N Z
+appelman AE P AH L M AH N
+appelt AE P IH L T
+append AH P EH N D
+appendage AH P EH N D IH JH
+appendages AH P EH N D IH JH IH Z
+appendectomies AE P AH N D EH K T AH M IY Z
+appendectomy AE P IH N D EH K T AH M IY
+appended AH P EH N D IH D
+appendix AH P EH N D IH K S
+appendixes AH P EH N D IH K S IH Z
+appenzeller AE P IH N Z AH L ER
+apperson AE P ER S AH N
+appert AE P ER T
+appetite AE P AH T AY T
+appetites AE P AH T AY T S
+appetito AE P AH T IY T OW
+appetizer AE P AH T AY Z ER
+appetizers AE P AH T AY Z ER Z
+appetizing AE P IH T AY Z IH NG
+appia AE P IY AH
+appian AE P IY AH N
+applaud AH P L AO D
+applauded AH P L AO D AH D
+applauded(2) AH P L AO D IH D
+applauding AH P L AO D IH NG
+applauds AH P L AO D Z
+applause AH P L AO Z
+apple AE P AH L
+apple's AE P AH L Z
+appleans AH P L IY N Z
+applebaum AE P AH L B AW M
+applebee AE P AH L B IY
+applebee's AE P AH L B IY Z
+appleberry AE P AH L B EH R IY
+appleby AE P IH L B IY
+applegarth AE P L IH G AA R TH
+applegate AE P AH L G EY T
+appleman AE P AH L M AH N
+applequist AE P AH L K W IH S T
+apples AE P AH L Z
+applesauce AE P AH L S AO S
+appleseed AE P AH L S IY D
+appleshare AE P AH L SH EH R
+applet AE P L AH T
+appleton AE P AH L T AH N
+applewhite AE P AH L W AY T
+appleyard AE P AH L Y AA R D
+appliance AH P L AY AH N S
+appliances AH P L AY AH N S AH Z
+appliances(2) AH P L AY AH N S IH Z
+applicability AE P L AH K AH B IH L AH T IY
+applicable AE P L AH K AH B AH L
+applicant AE P L IH K AH N T
+applicant's AE P L IH K AH N T S
+applicants AE P L IH K AH N T S
+applicants' AE P L AH K AH N T S
+application AE P L AH K EY SH AH N
+applications AE P L AH K EY SH AH N Z
+applicator AE P L AH K EY T ER
+applicators AE P L AH K EY T ER Z
+applied AH P L AY D
+applies AH P L AY Z
+applin AE P L IH N
+appling AE P AH L IH NG
+appling(2) AE P L IH NG
+apply AH P L AY
+applying AH P L AY IH NG
+appoint AH P OY N T
+appointed AH P OY N T AH D
+appointed(2) AH P OY N T IH D
+appointee AH P OY N T IY
+appointees AH P OY N T IY Z
+appointing AH P OY N T IH NG
+appointive AH P OY N T IH V
+appointment AH P OY N T M AH N T
+appointments AH P OY N T M AH N T S
+appoints AH P OY N T S
+apportion AH P AO R SH AH N
+apportioned AH P AO R SH AH N D
+apportioning AH P AO R SH AH N IH NG
+apportionment AH P AO R SH AH N M AH N T
+appraisal AH P R EY Z AH L
+appraisals AH P R EY Z AH L Z
+appraise AH P R EY Z
+appraised AH P R EY Z D
+appraiser AH P R EY Z ER
+appraisers AH P R EY Z ER Z
+appraises AH P R EY Z IH Z
+appraising AH P R EY Z IH NG
+appreciable AH P R IY SH AH B AH L
+appreciably AH P R IY SH AH B L IY
+appreciate AH P R IY SH IY EY T
+appreciated AH P R IY SH IY EY T IH D
+appreciates AH P R IY SH IY EY T S
+appreciating AH P R IY SH IY EY T IH NG
+appreciation AH P R IY SH IY EY SH AH N
+appreciative AH P R IY SH IY EY T IH V
+appreciative(2) AH P R IY SH Y AH T IH V
+appreciatively AH P R IY SH IY EY T IH V L IY
+appreciatively(2) AH P R IY SH Y AH T IH V L IY
+apprehend AE P R IH HH EH N D
+apprehended AE P R IH HH EH N D AH D
+apprehending AE P R IH HH EH N D IH NG
+apprehension AE P R IH HH EH N SH AH N
+apprehensions AE P R IH HH EH N SH AH N Z
+apprehensive AE P R IH HH EH N S IH V
+apprehensive(2) AE P R IY HH EH N S IH V
+apprentice AH P R EH N T AH S
+apprentice(2) AH P R EH N T IH S
+apprenticed AH P R EH N T AH S T
+apprentices AH P R EH N T AH S IH Z
+apprenticeship AH P R EH N T AH S SH IH P
+apprenticeships AH P R EH N T AH S SH IH P S
+apprise AH P R AY Z
+apprised AH P R AY Z D
+appro AE P R OW
+approach AH P R OW CH
+approachable AH P R OW CH AH B AH L
+approached AH P R OW CH T
+approaches AH P R OW CH AH Z
+approaches(2) AH P R OW CH IH Z
+approaching AH P R OW CH IH NG
+approbation AE P R AH B EY SH AH N
+appropriate AH P R OW P R IY AH T
+appropriate(2) AH P R OW P R IY EY T
+appropriated AH P R OW P R IY EY T IH D
+appropriately AH P R OW P R IY IH T L IY
+appropriateness AH P R OW P R IY AH T N AH S
+appropriates AH P R OW P R IY EY T S
+appropriating AH P R OW P R IY EY T IH NG
+appropriation AH P R OW P R IY EY SH AH N
+appropriations AH P R OW P R IY EY SH AH N Z
+appropriator AH P R OW P R IY EY T ER
+appropriators AH P R OW P R IY EY T ER Z
+approvable AH P R UW V AH B AH L
+approval AH P R UW V AH L
+approvals AH P R UW V AH L Z
+approve AH P R UW V
+approved AH P R UW V D
+approves AH P R UW V Z
+approving AH P R UW V IH NG
+approvingly AH P R UW V IH NG L IY
+approximate AH P R AA K S AH M AH T
+approximate(2) AH P R AA K S AH M EY T
+approximated AH P R AA K S AH M EY T AH D
+approximately AH P R AA K S AH M AH T L IY
+approximates AH P R AA K S AH M AH T S
+approximates(2) AH P R AA K S AH M EY T S
+approximating AH P R AA K S IH M EY T IH NG
+approximation AH P R AA K S AH M EY SH AH N
+approximations AH P R AA K S AH M EY SH AH N Z
+apps AE P S
+apra EY P R AH
+aprea AA P R IY AH
+apricot EY P R AH K AA T
+apricots AE P R AH K AA T S
+april EY P R AH L
+april's EY P R AH L Z
+aprile AA P R AH L
+apriori AH P R IY AO R IY
+aprodiva AE P R AO D IY V AH
+apron EY P R AH N
+aprons EY P R AH N Z
+apropos AE P R AH P OW
+apsell AE P S AH L
+apsey AE P S IY
+apso AE P S OW
+apstar AE P S T AA R
+apt AE P T
+apter AE P T ER
+aptitude AE P T AH T UW D
+aptitudes AE P T AH T UW D Z
+aptiva AE P T IY V AH
+aptly AE P T L IY
+apuzzo AA P UW Z OW
+aqaba AH K AA B AH
+aqazadeh AE K AH Z AA D EH
+aqua AE K W AH
+aqua(2) AA K W AH
+aquaculture AE K W AH K AH L CH ER
+aqualung AE K W AH L AH NG
+aquamarine AA K W AH M ER IY N
+aquanaut AA K W AH N AA T
+aquanauts AA K W AH N AA T S
+aquarist AH K W EH R AH S T
+aquarists AH K W EH R AH S T S
+aquarists(2) AH K W EH R AH S S
+aquarists(3) AH K W EH R AH S
+aquarium AH K W EH R IY AH M
+aquariums AH K W EH R IY AH M Z
+aquarius AH K W EH R IY AH S
+aquatic AH K W AA T IH K
+aquatic(2) AH K W AE T IH K
+aqueduct AE K W AH D AH K T
+aqueducts AE K W AH D AH K T S
+aqueous EY K W IY AH S
+aquifer AE K W AH F ER
+aquifers AE K W AH F ER Z
+aquila AE K W AH L AH
+aquilar AA K W IY L AA R
+aquilina AA K W IY L IY N AH
+aquilino AA K W IY L IY N OW
+aquinas AH K W AY N AH S
+aquino AH K IY N OW
+aquino's AH K IY N OW Z
+aquirre AE K W ER
+aquitaine AE K W IH T EY N
+ar AA R
+ara AE R AH
+arab AE R AH B
+arab(2) EH R AH B
+arabe AA R AA B EY
+arabella AE R AH B EH L AH
+arabia ER EY B IY AH
+arabia's ER EY B IY AH Z
+arabian ER EY B IY AH N
+arabians ER EY B IY AH N Z
+arabic AE R AH B IH K
+arabic(2) EH R AH B IH K
+arabica ER AE B IH K AH
+arabichon AH R AE B IH SH AO N
+arabichon's AH R AE B IH SH AO N Z
+arabicon AH R AE B AH K AO N
+arabie ER AE B IY
+arable EH R AH B AH L
+arabs AE R AH B Z
+arabs' EH R AH B Z
+arabs(2) EH R AH B Z
+arachnid ER AE K N AH D
+arachnid(2) ER AE K N IH D
+arachnids ER AE K N AH D Z
+arachnids(2) ER AE K N IH D Z
+arafat EH R AH F AE T
+arafat's AA R AH F AA T S
+arafat's(2) EH R AH F AE T S
+aragon EH R AH G AA N
+aragona AA R AA G OW N AH
+arai AA R AA IY
+araiza ER EY Z AH
+arakaki AA R AA K AA K IY
+arakawa AA R AA K AA W AH
+arakelian AE R AH K EH L Y AH N
+araki AA R AA K IY
+aral AA R AH L
+arambula AA R AA M B UW L AH
+aramco ER AE M K OW
+aramid EH R AH M IH D
+araminta AE R AH M IH N T AH
+aramis EH R AH M IH S
+aramony AA R AH M OW N IY
+aramony(2) EH R AH M OW N IY
+aran EH R AH N
+arana AA R AE N AH
+aranda ER AE N D AH
+arango AA R AA NG G OW
+aransas ER AE N S AH S
+arant AA R AH N T
+arantza AH R AA N T Z AH
+aranyos ER AA N Y OW S
+arapaho ER AE P AH HH OW
+arapahoe ER AE P AH HH OW
+ararat AE R AH R AA T
+araskog ER AE S AA G
+araskog(2) ER AE S K AA G
+arata AA R AA T AH
+arau AH R AW
+araujo AA R AW Y OW
+aravind AA R V AH N D
+araya ER AY AH
+arb AA R B
+arba AA R B AH
+arbat AA R B AE T
+arbaugh AA R B AO
+arbed AA R B IH D
+arbeiter AA R B AY T ER
+arbel AA R B AH L
+arbella AA R B EH L AH
+arbenz AA R B EH N Z
+arbiter AA R B IH T ER
+arbiters AA R B AH T ER Z
+arbitrage AA R B IH T R AA ZH
+arbitrager AA R B IH T R AA ZH ER
+arbitragers AA R B IH T R AA ZH ER Z
+arbitragers' AA R B IH T R AA ZH ER Z
+arbitrageur AA R B IH T R AA ZH ER
+arbitrageurs AA R B AH T R AA ZH ER Z
+arbitraging AA R B AH T R AA JH IH NG
+arbitrarily AA R B IH T R EH R AH L IY
+arbitrariness AA R B AH T R EH R IY N AH S
+arbitrary AA R B AH T R EH R IY
+arbitrary(2) AA R B IH T R EH R IY
+arbitrate AA R B AH T R EY T
+arbitrated AA R B AH T R EY T IH D
+arbitrates AA R B IH T R EY T S
+arbitrating AA R B AH T R EY T IH NG
+arbitration AA R B IH T R EY SH AH N
+arbitrations AA R B IH T R EY SH AH N Z
+arbitrator AA R B IH T R EY T ER
+arbitrator's AA R B AH T R EY T ER Z
+arbitrators AA R B IH T R EY T ER Z
+arbitrators' AA R B AH T R EY T ER Z
+arbitron AA R B AH T R AA N
+arbitron(2) AA R B AH T R AH N
+arbo AA R B OW
+arbogast AA R B OW G AA S T
+arboleda AA R B OW L EH D AH
+arbor AA R B ER
+arboreal AA R B AO R IY AH L
+arboretum AA R B ER IY T AH M
+arborville AA R B ER V IH L
+arbothnott AA R B AO TH N AO T
+arbour AA R B ER
+arbs AA R B Z
+arbuckle AA R B AH K AH L
+arbuckles AA R B AH K AH L Z
+arbuthnot AA R B AH TH N AH T
+arby AA R B IY
+arby's AA R B IY Z
+arc AA R K
+arcade AA R K EY D
+arcades AA R K EY D Z
+arcadia AA R K EY D IY AH
+arcadian AA R K EY D IY AH N
+arcadians AA R K EY D IY AH N Z
+arcana AA R K AE N AH
+arcand AA R K AH N D
+arcane AA R K EY N
+arcanum AA R K AH N AH M
+arcanum's AA R K AH N AH M Z
+arcaro AA R K AA R OW
+arcata AA R K AA T AH
+arce AA R S
+arcement AA R S EY M AH N T
+arceneaux AA R S IH N OW
+arceo AA R S IY OW
+arch AA R CH
+archaeological AA R K IY AH L AA JH IH K AH L
+archaeologist AA R K IY AA L AH JH IH S T
+archaeologists AA R K IY AA L AH JH IH S T S
+archaeologists(2) AA R K IY AA L AH JH IH S S
+archaeologists(3) AA R K IY AA L AH JH IH S
+archaeology AA R K IY AA L AH JH IY
+archaic AA R K EY IH K
+archambault AA R SH AH M B OW
+archambeau AA R SH AH M B OW
+archambeault AA R SH AH M B OW
+archangel AA R K EY N JH AH L
+archangels AA R K EY N JH AH L Z
+archard AA R SH AA R D
+archbishop AA R CH B IH SH AH P
+archbold AA R CH B OW L D
+archdiocese AA R CH D AY AH S AH S
+archdiocese(2) AA R CH D AY AH S IY Z
+archduke AA R CH D UW K
+arched AA R CH T
+archenemy AA R CH EH N AH M IY
+archeological AA R K IY AH L AA JH IH K AH L
+archeology AA R K IY AA L AH JH IY
+archer AA R CH ER
+archer's AA R CH ER Z
+archerd AA R K ER D
+archery AA R CH ER IY
+arches AA R CH AH Z
+arches(2) AA R CH IH Z
+archetypal AA R K T AY P AH L
+archetype AA R K IH T AY P
+archetypes AA R K IH T AY P S
+archey AA R K IY
+archibald AA R CH AH B AO L D
+archibeque AA R SH IH B IY K
+archie AA R CH IY
+archimedes AA R K AH M IY D IY Z
+arching AA R CH IH NG
+archipelago AA R K AH P EH L AH G OW
+archipelago(2) AA R CH AH P AH L EY G OW
+architect AA R K AH T EH K T
+architect's AA R K AH T EH K T S
+architects AA R K AH T EH K T S
+architectural AA R K AH T EH K CH ER AH L
+architecturally AA R K IH T EH K CH ER AH L IY
+architecturally(2) AA R K IH T EH K CH R AH L IY
+architecture AA R K AH T EH K CH ER
+architecture's AA R K AH T EH K CH ER Z
+architectures AA R K AH T EH K CH ER Z
+architrave AA R K AH T R EY V
+architraves AA R K AH T R EY V Z
+archival AA R K AY V AH L
+archive AA R K AY V
+archives AA R K AY V Z
+archivist AA R K AH V IH S T
+archivist(2) AA R K AY V IH S T
+archivists AA R K AH V IH S T S
+archivists(2) AA R K AY V IH S T S
+archivists(3) AA R K AH V IH S S
+archivists(4) AA R K AH V IH S
+archly AA R CH L IY
+archrival AA R CH R AY V AH L
+archrivals AA R CH R AY V AH L Z
+archuleta AA R K UW L EH T AH
+archuletta AA R K UW L EH T AH
+archway AA R CH W EY
+arcidiacono AA R CH IY D IY AA K OW N OW
+arcieri AA R CH IH R IY
+arciniega AA R CH IY N IY G AH
+arco AA R K OW
+arco's AA R K OW Z
+arcola AA R K OW L AH
+arcos AA R K OW Z
+arcosanti AA R K AH S AE N T IY
+arcs AA R K S
+arctic AA R K T IH K
+arctic(2) AA R T IH K
+arcturus AA R K T UH R AH S
+arcturus(2) AA R K T ER AH S
+arcuri AA R K UH R IY
+ard AA R D
+arda AA R D AH
+ardath AA R D AH TH
+ardeen AA R D IY N
+ardelia AA R D EH L IY AH
+ardella AA R D EH L AH
+ardelle AA R D EH L
+arden AA R D AH N
+arden's AA R D AH N Z
+ardene AA R D IY N
+ardent AA R D AH N T
+ardently AA R D AH N T L IY
+ardin AA R D IH N
+ardine AA R D IY N IY
+ardis AA R D IH S
+ardith AA R D IH TH
+ardito AA R D IY T OW
+ardley AA R D L IY
+ardmore AA R D M AO R
+ardoin AA R D OY N
+ardolino AA R D OW L IY N OW
+ardolph AA R D OW L F
+ardor AA R D ER
+ardoyne AA R D OY N
+ardra AA R D R AH
+ardrey AA R D R IY
+ardshiel AA R D SH IY L
+ardsley AA R D Z L IY
+arduini AA R D UW IY N IY
+arduous AA R JH UW AH S
+are AA R
+are(2) ER
+area EH R IY AH
+area's EH R IY AH Z
+areas EH R IY AH Z
+arebalo AA R EH B AA L OW
+arechiga AA R EH K IY G AH
+arehart AE R IH HH AA R T
+arel AA R EH L
+arellanes AE R IH L EY N Z
+arellano AA R EH L AA N OW
+aren AA R AH N
+aren't AA R AH N T
+aren't(2) AA R N T
+arena ER IY N AH
+arena's ER IY N AH Z
+arenaball ER IY N AH B AO L
+arenas ER IY N AH Z
+arencibia AA R EH N CH IY B IY AH
+arend ER EH N D
+arends ER EH N D Z
+arendsee ER EH N D S IY
+arendt EH R IH N T
+arenella AA R AH N EH L AH
+arenella's AA R AH N EH L AH Z
+arens EH R AH N Z
+arens(2) AA R AH N Z
+arenson AE R IH N S AH N
+arent AA R AH N T
+arentz AE R IH N T S
+arenz AA R EY N Z
+ares AA R Z
+areta AA R EH T AH
+aretha ER IY TH AH
+aretina AA R EH T IY N AH
+aretsky EH R EH T S K IY
+aretta AA R EH T AH
+arevalo AA R EY V AA L OW
+arey AE R IY
+argabright AA R G AH B R AY T
+argall AA R G AH L
+arganbright AA R G AE N B R AY T
+argenbright AA R G IH N B R AY T
+argent AA R JH IH N T
+argenta AA R JH EH N T AH
+argentieri AA R JH EH N T IH R IY
+argentina AA R JH AH N T IY N AH
+argentina's AA R JH AH N T IY N AH Z
+argentinas AA R JH AH N T IY N AH Z
+argentine AA R JH AH N T IY N
+argentines AA R JH AH N T IY N Z
+argentinian AA R JH AH N T IH N IY AH N
+argentinians AA R JH AH N T IH N IY AH N Z
+argento AA R JH EH N T OW
+argiro AA R JH IH R OW
+argo AA R G OW
+argo's AA R G OW Z
+argon AA R G AA N
+argonaut AA R G AH N AO T
+argonaut's AA R G AH N AO T S
+argonauts AA R G AH N AO T S
+argonne AA R G AA N
+argonne(2) AA R G OW N
+argosy AA R G AH S IY
+argosystem AA R G OW S IH S T AH M
+argosystems AA R G OW S IH S T AH M Z
+argot AA R G AH T
+arguable AA R G Y UW AH B AH L
+arguably AA R G Y UW AH B L IY
+argue AA R G Y UW
+argued AA R G Y UW D
+arguelles AA R G EY L EH S
+arguello AA R G EH L OW
+argues AA R G Y UW Z
+argueta AA R G EY T AH
+arguijo AA R G W IY Y OW
+arguing AA R G Y UW IH NG
+argument AA R G Y AH M AH N T
+argument's AA R G Y AH M AH N T S
+argumentation AA R G Y AH M EH N T EY SH AH N
+argumentative AA R G Y AH M EH N T AH T IH V
+arguments AA R G Y AH M AH N T S
+argus AA R G AH S
+argyle AA R G AY L
+argyll AA R G AY L
+argyropoulos AA R JH IH R AA P OW L AH S
+ari AA R IY
+aria AA R IY AH
+ariadne EH R IY AE D N IY
+arian AE R IY AH N
+ariana AA R IY AE N AH
+ariane EH R IY AE N
+arianespace EH R IY AE N S P EY S
+arianism AE R IY AH N IH Z AH M
+arianna AA R IY AE N AH
+arianna's AA R IY AE N AH Z
+arias AA R IY AH Z
+arias's AA R IY AH S IH Z
+aric AE R IH K
+arico AA R IY K OW
+arid AE R AH D
+arid(2) EH R AH D
+arida AH R IY D AH
+arie EH R IY
+ariel EH R IY AH L
+ariella AA R IY EH L AH
+aries EH R IY Z
+arington AA R IH NG T AH N
+ariola AA R IY OW L AH
+aris ER IY S
+arise ER AY Z
+arisen ER IH Z AH N
+arises ER AY Z AH Z
+arises(2) ER AY Z IH Z
+arising ER AY Z IH NG
+arison EH R IH S AH N
+arispe AA R IY S P IY
+arista ER IH S T AH
+aristech EH R IH S T EH K
+aristede AA R IH S T IY D
+aristede's AA R IH S T IY D Z
+aristide AA R IH S T IY D
+aristide's AA R IH S T IY D Z
+aristocracy EH R AH S T AA K R AH S IY
+aristocrat ER IH S T AH K R AE T
+aristocratic ER IH S T AH K R AE T IH K
+aristocrats ER IH S T AH K R AE T S
+aristophanes AE R AH S T AO F AH N IY Z
+aristotelian ER IH S T AH T IY L IY AH N
+aristotle EH R AH S T AA T AH L
+aristotle's EH R AH S T AA T AH L Z
+arithmetic EH R IH TH M EH T IH K
+arithmetic(2) ER IH TH M AH T IH K
+ariza AA R IY Z AH
+arizmendi AA R IY Z M EH N D IY
+arizona EH R IH Z OW N AH
+arizona's EH R IH Z OW N AH Z
+arizonan ER IH Z OW N AH N
+arizonans ER IH Z OW N AH N Z
+arjo AA R JH OW
+arjo(2) AA R Y OW
+ark AA R K
+arkadelphia AA R K AH D EH L F IY AH
+arkadi AA R K AH D IY
+arkady AA R K EY D IY
+arkansan AA R K AE N Z AH N
+arkansans AA R K AE N Z AH N Z
+arkansas AA R K AH N S AA
+arkansas' AA R K AH N S AA Z
+arkansas's AA R K AH N S AA Z
+arkarow AA R K AH R OW
+arkin AA R K IH N
+arkin's AA R K IH N Z
+arkla AA R K L AH
+arkla's AA R K L AH Z
+arko AA R K OW
+arkose AA R K OW S
+arkwright AA R K R AY T
+arlana AA R L AE N AH
+arlauskas AA R L AO S K AH S
+arledge AA R L IH JH
+arleen AA R L IY N
+arlen AA R L AH N
+arlena AA R L IH N AH
+arlene AA R L IY N
+arlene's AA R L IY N Z
+arleta AA R L IH T AH
+arlette AA R L EH T
+arley AA R L IY
+arlie AA R L IY
+arlin AA R L IH N
+arlinda AA R L IH N D AH
+arline AA R L AY N
+arlington AA R L IH NG T AH N
+arlington's AA R L IH NG T AH N Z
+arlt AA R L T
+arlyne AA R L AY N
+arm AA R M
+arm's AA R M Z
+armacost AA R M AH K AO S T
+armacost's AA R M AH K AO S T S
+armada AA R M AA D AH
+armadillo AA R M AH D IH L OW
+armadillos AA R M AH D IH L OW Z
+armageddon AA R M AH G EH D AH N
+armagost AA R M AA G OW S T
+armament AA R M AH M AH N T
+armaments AA R M AH M AH N T S
+arman AA R M AH N
+armand AA R M AH N D
+armand(2) AA R M AA N D
+armando AA R M AA N D OW
+armandt AA R M AE N T
+armani AA R M AA N IY
+armantrout AA R M AH N T R AW T
+armaro AA R M AA R OW
+armas AA R M AH Z
+armato AA R M AA T OW
+armband AA R M B AE N D
+armbands AA R M B AE N D Z
+armbrister AA R M B ER IH S T ER
+armbrister(2) AA R M B R IH S T ER
+armbrust AA R M B R AH S T
+armbruster AA R M B R AH S T ER
+armbruster(2) AA R M B R UW S T ER
+armchair AA R M CH EH R
+armchairs AA R M CH EH R Z
+armco AA R M K OW
+armco's AA R M K OW Z
+armed AA R M D
+armel AA R M EH L
+armellino AA R M EH L IY N OW
+armen AA R M AH N
+armendarez AA R M EY N D AA R EH Z
+armendariz AA R M EY N D AA R IY Z
+armenia AA R M IY N IY AH
+armenia's AA R M IY N IY AH Z
+armenian AA R M IY N IY AH N
+armenians AA R M IY N IY AH N Z
+arment AA R M AH N T
+armenta AA R M EH N T AH
+armentor AA R M AH N T AO R
+armentrout AA R M AH N T R AW T
+armer AA R M ER
+armes AA R M Z
+armested AA R M IH S T EH D
+armetta AA R M EH T AH
+armey AA R M IY
+armey's AA R M IY Z
+armfield AA R M F IY L D
+armida AA R M IY D AH
+armies AA R M IY Z
+armiger AA R M IH G ER
+armijo AA R M IY Y OW
+armilla AA R M IH L AH
+armin AA R M AH N
+armina AA R M IY N AH
+armine AA R M IY N IY
+arming AA R M IH NG
+armington AA R M IH NG T AH N
+arminie AA R M IH N IY
+armistead AA R M IH S T EH D
+armistice AA R M AH S T AH S
+armitage AA R M IH T IH JH
+armoire AA M W AA R
+armoires AA M W AA R Z
+armold AA R M OW L D
+armon AA R M AH N
+armond AA R M AH N D
+armonk AA R M AH NG K
+armor AA R M ER
+armored AA R M ER D
+armories AA R M ER IY Z
+armory AA R M ER IY
+armour AA R M ER
+armpit AA R M P IH T
+armpits AA R M P IH T S
+armrest AA R M R EH S T
+armrests AA R M R EH S T S
+armrests(2) AA R M R EH S S
+armrests(3) AA R M R EH S
+arms AA R M Z
+armstead AA R M S T EH D
+armstrad AA R M S T R AE D
+armstrong AA R M S T R AA NG
+armstrong's AA R M S T R AO NG Z
+armstrong(2) AA R M S T R AO NG
+armtec AA R M T EH K
+armtek AA R M T EH K
+armtek's AA R M T EH K S
+armwood AA R M W UH D
+army AA R M IY
+army's AA R M IY Z
+arn AA R N
+arnal AA R N AH L
+arnalda AA R N AA L D AH
+arnaldo AA R N AA L D OW
+arnall AA R N AH L
+arnatt AA R N AE T
+arnaud AA R N OW
+arnault AA R N OW
+arnaz AA R N EH Z
+arndt AA R N T
+arne AA R N
+arnell AA R N AH L
+arnelle AA R N EH L
+arnelle's AA R N EH L Z
+arner AA R N ER
+arnesen AA R N IY Z AH N
+arneson AA R N IH S AH N
+arnett AA R N EH T
+arnette AA R N EH T
+arney AA R N IY
+arnhold AA R N HH OW L D
+arnholt AA R N HH OW L T
+arnie AA R N IY
+arnn AA R N
+arno AA R N OW
+arnold AA R N AH L D
+arnold's AA R N AH L D Z
+arnoldi AA R N OW L D IY
+arnolds AA R N AH L D Z
+arnoldy AA R N OW L D IY
+arnolphe AA R N AA L F IY
+arnone AA R N OW N IY
+arnot AA R N AH T
+arnott AA R N AA T
+arnotts AA R N AA T S
+arnow AA R N OW
+arnox AA R N AA K S
+arns AA R N Z
+arnst AA R N S T
+arnstein AA R N S T AY N
+arnstein(2) AA R N S T IY N
+arntson AA R N T S AH N
+arntz AA R N T S
+arntzen AA R N T Z AH N
+arnulfo AA R N AH L F OW
+arnwine AA R N W AY N
+arnzen AA R N Z AH N
+aro AA R OW
+arocha AA R OW K AH
+arocho AA R OW K OW
+aroma ER OW M AH
+aromas ER OW M AH Z
+aromatherapy AH R OW M AH TH ER AH P IY
+aromatic EH R AH M AE T IH K
+aron EH R AH N
+arone ER OW N
+aronhalt AE R AH N HH AH L T
+aronoff EH R AH N AO F
+aronow ER OW N OW
+aronowitz ER AA N AH W IH T S
+arons AA R OW N Z
+aronson EH R AH N S AH N
+aronstein EH R AH N S T IY N
+aronstein(2) EH R AH N S T AY N
+arora AA R AO R AH
+aros AA R OW Z
+arose ER OW Z
+around ER AW N D
+around(2) ER AW N
+arousal ER AW Z AH L
+arouse ER AW Z
+aroused ER AW Z D
+arouses ER AW Z IH Z
+arousing ER AW Z IH NG
+arp AA R P
+arpa AA R P AH
+arpanet AA R P AH N EH T
+arpin AA R P IH N
+arpino AA R P IY N OW
+arps AA R P S
+arquette AA R K EH T
+arquilla AA R K W IH L AH
+arraign ER EY N
+arraigned ER EY N D
+arraignment ER EY N M AH N T
+arraignments ER EY N M AH N T S
+arrange ER EY N JH
+arranged ER EY N JH D
+arrangement ER EY N JH M AH N T
+arrangements ER EY N JH M AH N T S
+arranger ER EY N JH ER
+arranges ER EY N JH IH Z
+arranging ER EY N JH IH NG
+arrant AE R AH N T
+arrants AE R AH N T S
+arrasmith EH R AH S M IH TH
+array ER EY
+arrayed ER EY D
+arraying ER EY IH NG
+arrays ER EY Z
+arrearage ER IY R IH JH
+arrearages ER IH R IH JH IH Z
+arrears ER IH R Z
+arredondo AA R EH D OW N D OW
+arreguin AA R EY G W IY N
+arrendondo AA R EH N D OW N D OW
+arreola AA R IY AA L AH
+arrest ER EH S T
+arrested ER EH S T AH D
+arrested(2) ER EH S T IH D
+arresting ER EH S T IH NG
+arrests ER EH S T S
+arrhythmia ER IH DH M IY AH
+arrhythmias ER IH DH M IY AH Z
+arriaga AA R IY AA G AH
+arrick AE R IH K
+arrieta AA R IY T AH
+arrigo AA R IY G OW
+arrigoni AA R IY G OW N IY
+arrington EH R IH NG T AH N
+arriola AA R IY OW L AH
+arriortua AA R IY AO R T UW AH
+arris AE R AH S
+arrival ER AY V AH L
+arrivals ER AY V AH L Z
+arrive ER AY V
+arrived ER AY V D
+arrives ER AY V Z
+arriving ER AY V IH NG
+arrogance EH R AH G AH N S
+arrogant EH R AH G AH N T
+arrogantly EH R AH G AH N T L IY
+arrogate AE R OW G EY T
+arrow AE R OW
+arrow's AE R OW Z
+arrow's(2) EH R OW Z
+arrow(2) EH R OW
+arrowhead AE R OW HH EH D
+arrowhead(2) EH R OW HH EH D
+arrowheads AE R OW HH EH D Z
+arrowheads(2) EH R OW HH EH D Z
+arrowood AE R OW W UH D
+arrowroot EH R OW R UW T
+arrows AE R OW Z
+arrows(2) EH R OW Z
+arrowsmith AE R OW S M IH TH
+arrowsmith's AE R OW S M IH TH S
+arrowsmith's(2) EH R OW S M IH TH S
+arrowsmith(2) EH R OW S M IH TH
+arroyo ER OY OW
+arroyo's ER OY OW Z
+arruda AA R UW D AH
+arrupe AE R UW P
+arsdale AA R Z D EY L
+arsenal AA R S AH N AH L
+arsenals AA R S AH N AH L Z
+arsenault AA R S IH N OW
+arseneau AA R S IH N OW
+arseneault AA R S IH N OW
+arsenic AA R S AH N IH K
+arsenide AA R S AH N AY D
+arsenio AA R S IY N IY OW
+arslanian AA R S L EY N IY AH N
+arson AA R S AH N
+arsonist AA R S AH N AH S T
+arsonist(2) AA R S AH N IH S T
+arsonists AA R S AH N AH S T S
+arsonists(2) AA R S AH N IH S T S
+arsonists(3) AA R S AH N IH S S
+arsonists(4) AA R S AH N IH S
+arsons AA R S AH N Z
+arsov AA R S AH V
+art AA R T
+art's AA R T S
+artale AA R T AA L IY
+artcarve AA R T K AA R V
+artcarved AA R T K AA R V D
+arteaga AA R T IY G AH
+artemas AA R T IH M AH Z
+artemus AA R T AH M AH S
+arter AA R T ER
+arterberry AA R T ER B EH R IY
+arterburn AA R T ER B ER N
+arterial AA R T IH R IY AH L
+arteries AA R T ER IY Z
+arteriosclerosis AA R T IH R IY OW S K L ER OW S AH S
+artery AA R T ER IY
+artes AA R T IY Z
+artesian AA R T IY ZH AH N
+artful AA R T F AH L
+artfully AA R T F AH L IY
+arth AA R TH
+arthotec AA R TH AH T EH K
+arthritic AA R TH R IH T IH K
+arthritis AA R TH R AY T AH S
+arthritis(2) AA R TH R AY T IH S
+arthropod AA R TH R AH P AA D
+arthropods AA R TH R AH P AA D Z
+arthur AA R TH ER
+arthur's AA R TH ER Z
+arthurian AA R TH UH R IY AH N
+arthurs AA R TH ER Z
+artichoke AA R T AH CH OW K
+artichoke(2) AA R T IH CH OW K
+artichokes AA R T IH CH OW K S
+article AA R T AH K AH L
+article's AA R T IH K AH L Z
+article(2) AA R T IH K AH L
+articles AA R T AH K AH L Z
+articles(2) AA R T IH K AH L Z
+articulate AA R T IH K Y AH L EY T
+articulate(2) AA R T IH K Y AH L AH T
+articulated AA R T IH K Y AH L EY T AH D
+articulates AA R T IH K Y AH L AH T S
+articulating AA R T IH K Y AH L EY T IH NG
+articulation AA R T IH K Y AH L EY SH AH N
+articulatory AA R T IH K Y AH L AH T AO R IY
+artie AA R T IY
+artifact AA R T AH F AE K T
+artifacts AA R T AH F AE K T S
+artifice AA R T AH F IH S
+artificial AA R T AH F IH SH AH L
+artificially AA R T AH F IH SH AH L IY
+artillery AA R T IH L ER IY
+artino AA R T IY N OW
+artiodactyl AA R T IY OW D AE K T AH L
+artiodactyls AA R T IY OW D AE K T AH L Z
+artis AA R T IH S
+artisan AA R T AH Z AH N
+artisans AA R T AH Z AH N Z
+artist AA R T AH S T
+artist's AA R T AH S T S
+artist's(2) AA R T IH S T S
+artist(2) AA R T IH S T
+artistic AA R T IH S T IH K
+artistically AA R T IH S T IH K L IY
+artistry AA R T IH S T R IY
+artists AA R T AH S T S
+artists' AA R T AH S T S
+artists'(2) AA R T IH S T S
+artists'(3) AA R T IH S S
+artists'(4) AA R T IH S
+artists(2) AA R T IH S T S
+artists(3) AA R T IH S S
+artists(4) AA R T IH S
+artley AA R T L IY
+artman AA R T M AH N
+artois AA R T W AA
+arton AA R T AA N
+artra AA R T R AH
+artra's AA R T R AH Z
+artrip AA R T R IH P
+arts AA R T S
+artsy AA R T S IY
+artur AA R T UH R
+arturo AA R T UH R OW
+artus AA R T AH S
+artwork AA R T W ER K
+artworks AA R T W ER K S
+arty AA R T IY
+arty's AA R T IY Z
+artz AA R T S
+artzt AA R T S T
+aruba ER UW B AH
+arum EH R AH M
+arunachalam AA R UW N AH CH AA L AH M
+arundel EH R AH N D AH L
+arup ER UW P
+arva AA R V AH
+arvad AA R V AE D
+arval AA R V AH L
+arvanitis AA R V AH N AY T IH S
+arvay AA R V EY
+arve AA R V
+arvel AA R V EH L
+arvey AA R V IY
+arvid AA R V IH D
+arvida AA R V IY D AH
+arvida's AA R V IY D AH Z
+arvidson AA R V IH D S AH N
+arvin AA R V IH N
+arvin's AA R V IH N Z
+arvind AA R V IH N D
+arvizu AA R V IY Z UW
+arwen AA R W AH N
+arwood AA R W UH D
+arx AA R K S
+ary EH R IY
+aryan AA R IY AH N
+arzama AA R Z AA M AH
+arzamas AA R Z AA M AH Z
+arzate AA R Z EY T
+arzola AA R Z OW L AH
+arzt AA R Z T
+as AE Z
+as(2) EH Z
+asa AA S AH
+asaf AA S AA F
+asahan AE S AH HH AE N
+asahara AE S AH HH AE R AH
+asahi AH S AA HH IY
+asamera AE S AH M EH R AH
+asap EY EH S EY P IY
+asap(2) AH Z S UW N AH Z P AO S AH B AH L
+asarco AH S AA R K OW
+asarco's AH S AA R K OW Z
+asaro AA S AA R OW
+asat AE Z AE T
+asato AA S AA T OW
+asay AH S EY
+asbell AE S B EH L
+asberry AE S B EH R IY
+asbestec AE S B EH S T EH K
+asbestos AE S B EH S T AH S
+asbestosis AE S B EH S T OW S AH S
+asbestosis(2) AE S B EH S T OW S IH S
+asbill AH S B IH L
+asbridge AH S B R IH JH
+asbury AE Z B EH R IY
+asby AE S B IY
+ascap AE S K AE P
+ascencio AA S CH EH N CH IY OW
+ascend AH S EH N D
+ascendance AH S EH N D AH N S
+ascendancy AH S EH N D AH N S IY
+ascendant AH S EH N D AH N T
+ascended AH S EH N D AH D
+ascendency AH S EH N D AH N S IY
+ascending AH S EH N D IH NG
+ascends AH S EH N D Z
+ascension AH S EH N SH AH N
+ascent AH S EH N T
+ascertain AE S ER T EY N
+ascertained AE S ER T EY N D
+ascertaining AE S ER T EY N IH NG
+ascetic AH S EH T IH K
+asch AE SH
+asche AE SH
+aschenbach AE SH IH N B AA K
+aschenbrenner AE SH IH N B R IH N ER
+ascher AE SH ER
+aschoff AE S K HH AO F
+ascii AE S K IY
+asclad AE S K L AE D
+ascorbic AH S K AO R B IH K
+ascot AE S K AA T
+ascott AH S K AA T
+ascribe AH S K R AY B
+ascribed AH S K R AY B D
+ascribes AH S K R AY B Z
+asda AE S D AH
+asea AH Z IY AH
+asea(2) EY EH S IY EY
+asean AH Z IY AH N
+asean(2) EY EH S IY EY EH N
+asean(3) AE Z EY AH N
+aselma AH S EH L M AH
+aseltine AA S EH L T IY N IY
+asencio AH S EH N S IY OW
+aseritis AH S EH R IH T IH S
+asexual EY S EH K S Y UW AH L
+ash AE SH
+asha AA SH AH
+ashaji AH SH AA JH IY
+ashaji's AH SH AA JH IY Z
+ashame AH SH EY M
+ashamed AH SH EY M D
+ashare AE SH EH R
+ashbaugh AH SH B AO
+ashbaugh(2) AE SH B AO
+ashbrook AE SH B R UH K
+ashburn AE SH B ER N
+ashbury AE SH B EH R IY
+ashby AE SH B IY
+ashcraft AE SH K R AE F T
+ashcreek AE SH K R IY K
+ashcroft AE SH K R AO F T
+ashdown AE SH D AW N
+ashe AE SH
+asheboro AE SH B AO R OW
+ashen AE SH AH N
+ashenberg AE SH AH N B ER G
+ashenfelter AE SH AH N F EH L T ER
+asher AE SH ER
+ashes AE SH AH Z
+ashes(2) AE SH IH Z
+asheville AE SH V IH L
+ashey AE SH IY
+ashford AE SH F ER D
+ashis AH SH IY Z
+ashish AH SH IY SH
+ashkenazi AE SH K AH N AA Z IY
+ashkenazis AE SH K AH N AA Z IY Z
+ashland AE SH L AH N D
+ashland's AE SH L AH N D Z
+ashley AE SH L IY
+ashley's AE SH L IY Z
+ashlin AE SH L IH N
+ashline AE SH L AY N
+ashlock AE SH L AA K
+ashman AE SH M AH N
+ashmead AE SH M IY D
+ashmore AE SH M AO R
+ashok AE SH AA K
+ashore AH SH AO R
+ashrawi AE SH R AA W IY
+ashtec AE SH T EH K
+ashtec's AE SH T EH K S
+ashton AE SH T AH N
+ashton's AE SH T AH N Z
+ashtray AE SH T R EY
+ashtrays AE SH T R EY Z
+ashur AE SH ER
+ashurst AE SH ER S T
+ashville AE SH V IH L
+ashwell AE SH W EH L
+ashwood AE SH W UH D
+ashworth AE SH W ER TH
+ashy AE SH IY
+asia EY ZH AH
+asia's EY ZH AH Z
+asiain EY Z IY EY N
+asiamerica EY S IY AH M EH R IH K AH
+asian EY ZH AH N
+asians EY ZH AH N Z
+asiatic EY ZH IY AE T IH K
+asiaweek EY ZH AH W IY K
+asic AE Z IH K
+asics AE Z IH K S
+aside AH S AY D
+asides AH S AY D Z
+asiel AE Z IY AH L
+asimov AE S IH M AA V
+asimov's AE S IH M AA V Z
+asimov's(2) AE Z IH M AA V Z
+asimov(2) AE Z IH M AA V
+asimow AE S IH M OW
+asinine AE S AH N AY N
+ask AE S K
+aska AE S K AH
+askance AH S K AE N S
+asked AE S K T
+asked(2) AE S T
+asker AE S K ER
+asker's AE S K ER Z
+askers AE S K ER Z
+askers' AE S K ER Z
+askers's AE S K ER Z IH Z
+askew AH S K Y UW
+askey AH S K IY
+askin AH S K IH N
+askin's AE S K IH N Z
+asking AE S K IH NG
+askington AE S K IH NG T AH N
+askins AH S K IH N Z
+asko AE S K OW
+askoldov AH S K OW L D AA V
+askoldov's AH S K OW L D AA V Z
+askren AE S K ER AH N
+asks AE S K S
+aslanian AH S L EY N IY AH N
+asleep AH S L IY P
+asleson AE S L IH S AH N
+asleson(2) AE S IH L S AH N
+aslin AH S L IH N
+asman AE S M AH N
+asmara AE Z M AA R AH
+asmaras AE Z M AA R AH Z
+asmodeus AE Z M AH D EY AH S
+asmus AH Z M UW S
+asmussen AH Z M AH S AH N
+asner AE S N ER
+asp AE S P
+asparagus AH S P EH R AH G AH S
+aspartame AE S P ER T EY M
+aspect AE S P EH K T
+aspects AE S P EH K T S
+aspen AE S P AH N
+aspen's AE S P AH N Z
+aspens AE S P AH N Z
+asper AE S P ER
+asperity AH S P EH R IH T IY
+aspersion AH S P ER ZH AH N
+aspersions AH S P ER ZH AH N Z
+asphalt AE S F AO L T
+asphyxiate AE S F IH K S IY EY T
+asphyxiated AE S F IH K S IY EY T IH D
+asphyxiates AE S F IH K S IY EY T S
+asphyxiating AE S F IH K S IY EY T IH NG
+aspin AE S P IH N
+aspin's AE S P IH N Z
+aspinall AE S P IH N AO L
+aspinwall AE S P IH N W AO L
+aspirant AE S P ER AH N T
+aspirant(2) AH S P AY R AH N T
+aspirants AE S P ER AH N T S
+aspirants(2) AH S P AY R AH N T S
+aspirants(3) AE S P ER AH N S
+aspirants(4) AH S P AY R AH N S
+aspirate AE S P ER EY T
+aspirated AE S P ER EY T IH D
+aspirates AE S P ER EY T S
+aspiration AE S P ER EY SH AH N
+aspirations AE S P ER EY SH AH N Z
+aspire AH S P AY R
+aspired AH S P AY R D
+aspires AH S P AY ER Z
+aspirin AE S P R IH N
+aspirin's AE S P R AH N Z
+aspiring AH S P AY R IH NG
+asplund AE S P L AH N D
+aspnes AE S P N EH Z
+asquith AE S K W IH TH
+ass AE S
+assad AH S AA D
+assad's AH S AA D Z
+assaf AH S AE F
+assail AH S EY L
+assailant AH S EY L AH N T
+assailant's AH S EY L AH N T S
+assailants AH S EY L AH N T S
+assailed AH S EY L D
+assailing AH S EY L IH NG
+assails AH S EY L Z
+assante AA S AA N T IY
+assassin AH S AE S AH N
+assassin's AH S AE S AH N Z
+assassinate AH S AE S AH N EY T
+assassinated AH S AE S AH N EY T AH D
+assassinating AH S AE S AH N EY T IH NG
+assassination AH S AE S AH N EY SH AH N
+assassinations AH S AE S AH N EY SH AH N Z
+assassins AH S AE S AH N Z
+assault AH S AO L T
+assaulted AH S AO L T IH D
+assaulting AH S AO L T IH NG
+assaultive AH S AO L T IH V
+assaults AH S AO L T S
+assay AE S IY
+assayer AE S EY ER
+assed AE S T
+asselin AE S IH L IH N
+asselstine AE S AH L S T AY N
+assemblage AH S EH M B L AH JH
+assemblage(2) AH S EH M B L IH JH
+assemble AH S EH M B AH L
+assembled AH S EH M B AH L D
+assembler AH S EH M B L ER
+assemblers AH S EH M B L ER Z
+assembles AH S EH M B AH L Z
+assemblies AH S EH M B L IY Z
+assembling AH S EH M B AH L IH NG
+assembling(2) AH S EH M B L IH NG
+assembly AH S EH M B L IY
+assembly's AH S EH M B L IY Z
+assemblyman AH S EH M B L IY M AE N
+assemblyman(2) AH S EH M B L IY M AH N
+assemblymen AH S EH M B L IY M IH N
+assemblywoman AH S EH M B L IY W UH M AH N
+assent AH S EH N T
+assert AH S ER T
+asserted AH S ER T AH D
+assertedly AH S ER T IH D L IY
+asserting AH S ER T IH NG
+assertion AH S ER SH AH N
+assertions AH S ER SH AH N Z
+assertive AH S ER T IH V
+assertively AH S ER T IH V L IY
+assertiveness AH S ER T IH V N AH S
+asserts AH S ER T S
+asses AE S AH Z
+assess AH S EH S
+assessed AH S EH S T
+assesses AH S EH S IH Z
+assessing AH S EH S IH NG
+assessment AH S EH S M AH N T
+assessments AH S EH S M AH N T S
+assessor AH S EH S ER
+assessors AH S EH S ER Z
+asset AE S EH T
+assets AE S EH T S
+assets' AE S EH T S
+asshole AE S HH OW L
+assicurazioni AH S IY K ER AE Z IY OW N IY
+assiduous AH S IH D W AH S
+assiduously AH S IH D W AH S L IY
+assign AH S AY N
+assigned AH S AY N D
+assigning AH S AY N IH NG
+assignment AH S AY N M AH N T
+assignment's AH S AY N M AH N T S
+assignments AH S AY N M AH N T S
+assigns AH S AY N Z
+assimilate AH S IH M AH L EY T
+assimilated AH S IH M AH L EY T IH D
+assimilating AH S IH M AH L EY T IH NG
+assimilation AH S IH M AH L EY SH AH N
+assira AH S IY R AH
+assisi AH S IY S IY
+assisi's AH S IY S IY Z
+assist AH S IH S T
+assistance AH S IH S T AH N S
+assistant AH S IH S T AH N T
+assistants AH S IH S T AH N T S
+assisted AH S IH S T AH D
+assisted(2) AH S IH S T IH D
+assisting AH S IH S T IH NG
+assists AH S IH S T S
+assists(2) AH S IH S S
+assists(3) AH S IH S
+assocation AE S AH K EY SH AH N
+associate AH S OW S IY AH T
+associate's AH S OW S IY AH T S
+associate's(2) AH S OW SH IY AH T S
+associate(2) AH S OW S IY EY T
+associate(3) AH S OW SH IY AH T
+associate(4) AH S OW SH IY EY T
+associated AH S OW S IY EY T AH D
+associated(2) AH S OW SH IY EY T AH D
+associates AH S OW S IY AH T S
+associates' AH S OW SH IY AH T S
+associates'(2) AH S OW S IY AH T S
+associates(2) AH S OW S IY EY T S
+associates(3) AH S OW SH IY AH T S
+associates(4) AH S OW SH IY EY T S
+associating AH S OW S IY EY T IH NG
+association AH S OW S IY EY SH AH N
+association's AH S OW SH IY EY SH AH N Z
+association(2) AH S OW SH IY EY SH AH N
+associations AH S OW S IY EY SH AH N Z
+associations(2) AH S OW SH IY EY SH AH N Z
+associes AE S AH S IY Z
+assort AH S AO R T
+assorted AH S AO R T IH D
+assortment AH S AO R T M AH N T
+assuage AH S W EY JH
+assuaged AH S W EY JH D
+assubel AE S AH B EH L
+assume AH S UW M
+assumed AH S UW M D
+assumes AH S UW M Z
+assuming AH S UW M IH NG
+assumption AH S AH M P SH AH N
+assumptions AH S AH M P SH AH N Z
+assurance AH SH UH R AH N S
+assurances AH SH UH R AH N S IH Z
+assurances(2) AH SH UH R AH N T S IH Z
+assuras AH SH UH R AH S
+assure AH SH UH R
+assured AH SH UH R D
+assuredly AH SH UH R AH D L IY
+assures AH SH UH R Z
+assuring AH SH UH R IH NG
+assyria AH S IH R IY AH
+assyrian AH S IH R IY AH N
+assyrians AH S IH R IY AH N Z
+ast AE S T
+asta AA S T AH
+astaire AH S T EH R
+aster AE S T ER
+asterisk AE S T ER IH S K
+asteroid AE S T ER OY D
+asteroid's AE S T ER OY D Z
+asteroids AE S T ER OY D Z
+asters AE S T ER Z
+asthma AE Z M AH
+asthmatic AE Z M AE T IH K
+asthmatics EH S TH M EH T IH K S
+astigmatism AH S T IH G M AH T IH Z AH M
+astin AH S T IH N
+astle AE S AH L
+astley AE S T L IY
+aston AE S T AH N
+astonish AH S T AA N IH SH
+astonished AH S T AA N IH SH T
+astonishing AH S T AA N IH SH IH NG
+astonishingly AH S T AA N IH SH IH NG L IY
+astonishment AH S T AA N IH SH M AH N T
+astor AE S T ER
+astor's AE S T ER Z
+astore AE S T AO R
+astore(2) AE S T AO R IY
+astorga AA S T AO R G AH
+astoria AE S T AO R IY AH
+astorino AA S T AO R IY N OW
+astound AH S T AW N D
+astounded AH S T AW N D IH D
+astounding AH S T AW N D IH NG
+astoundingly AH S T AW N D IH NG L IY
+astounds AH S T AW N D Z
+astra AE S T R AH
+astra's AE S T R AH Z
+astraddle AH S T R AE D AH L
+astrakhan AE S T R AH K AA N
+astral AE S T R AH L
+astray AH S T R EY
+astred AE S T ER D
+astrid AE S T R IH D
+astride AH S T R AY D
+astringent AH S T R IH N JH AH N T
+astringents AH S T R IH N JH AH N T S
+astro AE S T R OW
+astrodome AE S T R AH D OW M
+astrogeology AE S T R AH JH IY AA L AH JH IY
+astrologer AH S T R AA L AH JH ER
+astrologers AH S T R AA L AH JH ER Z
+astrological AE S T R AH L AA JH IH K AH L
+astrology AH S T R AA L AH JH IY
+astronaut AE S T R AH N AA T
+astronaut's AE S T R AH N AA T S
+astronautic AE S T R AH N AA T IH K
+astronautical AE S T R AH N AA T IH K AH L
+astronautics AE S T R AH N AA T IH K S
+astronauts AE S T R AH N AO T S
+astronauts' AE S T R AH N AO T S
+astronomer AH S T R AA N AH M ER
+astronomers AH S T R AA N AH M ER Z
+astronomical AE S T R AH N AA M IH K AH L
+astronomically AE S T R AH N AA M IH K L IY
+astronomy AH S T R AA N AH M IY
+astrophotography AE S T R OW F AH T AA G R AH F IY
+astrophysicist AE S T R OW F IH S IH S IH S T
+astrophysics AE S T R OW F IH Z IH K S
+astros AE S T R OW S
+astrotech AE S T R OW T EH K
+astroturf AE S T R OW T ER F
+astute AH S T UW T
+astutely AH S T UW T L IY
+astuteness AH S T UW T N AH S
+asuncion AH S AH N SH AH N
+asunder AH S AH N D ER
+aswin AH S W IH N
+asylum AH S AY L AH M
+asymmetrical EY S AH M EH T R IH K AH L
+asymmetries EY S IH M AH T R IY Z
+asymmetry EY S IH M AH T R IY
+asymptomatic EY S IH M P T AH M AE T IH K
+asymptote AE S AH M T OW T
+asymptote(2) AE S IH M P T OW T
+asymptotes AE S AH M T OW T S
+asymptotes(2) AE S IH M P T OW T S
+asynchronous EY S IH NG K R AH N AH S
+at AE T
+at-bat AE T B AE T
+at-bats AE T B AE T S
+ata AA T AH
+atalanta AE T AH L AE N T AH
+atalaya AA T AA L EY AH
+atalia AA T AA L IY AH
+atalie AE T AH L IY
+atamian AH T EY M IY AH N
+atari AH T AA R IY
+atari's AH T AA R IY Z
+ataturk AE T AH T ER K
+ataturk's AE T AH T ER K S
+atavism AE T AH V IH Z AH M
+atavistic AE T AH V IH S T IH K
+ataxia EY T AE K S IY AH
+ataxia's EY T AE K S IY AH Z
+atcheson AE CH IH S AH N
+atchinson AE CH IH N S AH N
+atchison AE CH IH S AH N
+atchley AE CH L IY
+atco AE T K OW
+atcor AE T K AO R
+ate EY T
+atek EY T EH K
+aten EY T AH N
+atencio AH T EH N S IY OW
+ater EY T ER
+ates EY T S
+atha AE TH AH
+athalia EY TH AE L IY AH
+athanas EY TH AE N AH Z
+athanassiou AA TH AH N AH S IY UW
+athans AE TH AH N Z
+athas EY DH AH Z
+athearn EY TH ER N
+atheism AH TH AY S AH M
+atheism(2) EY TH IY IH Z AH M
+atheist EY TH IY AH S T
+atheistic EY TH IY IH S T IH K
+atheists EY TH IY AH S T S
+atheists(2) EY TH IY AH S S
+atheists(3) EY TH IY AH S
+athena AH TH IY N AH
+athenaeum AE TH AH N IY AH M
+athenaios AE TH AH N AY OW S
+atheneum AE TH AH N UW M
+athenian AH TH IY N IY AH N
+athenians AH TH IY N IY AH N Z
+athens AE TH AH N Z
+atherosclerosis AE TH ER OW S K L ER OW S IH S
+atherton AE TH ER T AH N
+athey AE TH IY
+athie EY TH IY
+athlete AE TH L IY T
+athlete's AE TH L IY T S
+athletes AE TH L IY T S
+athletes' AE TH L IY T S
+athletic AE TH L EH T IH K
+athletically AE TH L EH T IH K L IY
+athleticism AE TH L EH T IH S IH Z M
+athletics AE TH L EH T IH K S
+athlone AE TH L OW N
+athwart AH TH W AO R T
+atico AE T IH K OW
+atienza AA T IY N Z AH
+atilano AA T IY L AA N OW
+atither AH T IH DH ER
+atkerson AE T K ER S AH N
+atkin AH T K IH N
+atkins AE T K IH N Z
+atkins's AE T K IH N Z IH Z
+atkinson AE T K AH N S AH N
+atkinson's AE T K AH N S AH N Z
+atkinson's(2) AE T K IH N S AH N Z
+atkinson(2) AE T K IH N S AH N
+atkison AE T K IH S AH N
+atkisson AE T K IH S AH N
+atla AE T L AH
+atlan AE T L AH N
+atlanta AE T L AE N T AH
+atlanta's AE T L AE N T AH Z
+atlanta's(2) AE T L AE N AH Z
+atlanta(2) AH T L AE N T AH
+atlanta(3) AE T L AE N AH
+atlanta(4) AH T L AE N AH
+atlantan AE T L AE N T AH N
+atlantan(2) AE T L AE N AH N
+atlantans AE T L AE N T AH N Z
+atlantans(2) AE T L AE N AH N Z
+atlantic AH T L AE N T IH K
+atlantic's AH T L AE N T IH K S
+atlantic's(2) AH T L AE N IH K S
+atlantic(2) AH T L AE N IH K
+atlantica AE T L AE N T IH K AH
+atlantico AE T L AE N T IH K OW
+atlantis AE T L AE N T IH S
+atlantis' AE T L AE N T IH S
+atlantis'(2) AE T L AE N T IH S IH Z
+atlantis's AE T L AE N T IH S IH Z
+atlantis(2) AE T L AE N IH S
+atlas AE T L AH S
+atlas's AE T L AH S IH Z
+atlases AE T L EY S IH Z
+atlases(2) AE T L AH S IH Z
+atler AE T L ER
+atley AE T L IY
+atmel AE T M AH L
+atmosphere AE T M AH S F IH R
+atmospheric AE T M AH S F EH R IH K
+atmospherics AE T M AH S F EH R IH K S
+atnip AE T N IH P
+atocha AH T AA CH AH
+atoll AE T AA L
+atoll(2) AE T AO L
+atoll(3) AH T OW L
+atom AE T AH M
+atomic AH T AA M IH K
+atomizer AE T AH M AY Z ER
+atoms AE T AH M Z
+aton AH T AA N
+atonal EY T OW N AH L
+atone AH T OW N
+atonement AH T OW N M AH N T
+atop AH T AA P
+ator AA T AO R
+atorino AE T ER IY N OW
+atp EY T IY P IY
+atra EY T R AH
+atria EY T R IY AH
+atrium EY T R IY AH M
+atriums EY T R IY AH M Z
+atrocious AH T R OW SH AH S
+atrocities AH T R AA S AH T IY Z
+atrocity AH T R AA S AH T IY
+atrophied AE T R AH F IY D
+atrophies AE T R AH F IY Z
+atrophy AE T R AH F IY
+atsushi AA T S UW SH IY
+atsushi(2) AA S UW SH IY
+atta AE T AH
+attaboy AE T AH B OY
+attaboys AE T AH B OY Z
+attach AH T AE CH
+attache AE T AH SH EY
+attached AH T AE CH T
+attaches AH T AE CH IH Z
+attaching AH T AE CH IH NG
+attachment AH T AE CH M AH N T
+attachments AH T AE CH M AH N T S
+attack AH T AE K
+attacked AH T AE K T
+attacker AH T AE K ER
+attackers AH T AE K ER Z
+attacking AH T AE K IH NG
+attacks AH T AE K S
+attain AH T EY N
+attainable AH T EY N AH B AH L
+attainder AH T EY N D ER
+attained AH T EY N D
+attaining AH T EY N IH NG
+attainment AH T EY N M AH N T
+attains AH T EY N Z
+attali AH T AA L IY
+attalla AH T AE L AH
+attanasio AA T AA N AA S IY OW
+attar AE T ER
+attard AE T ER D
+attardo AA T AA R D OW
+attaway AE T AH W EY
+atteberry AE T B EH R IY
+attebery AH T EH B ER IY
+attebury AE T B EH R IY
+attempt AH T EH M P T
+attempted AH T EH M P T AH D
+attempting AH T EH M P T IH NG
+attempts AH T EH M P T S
+attempts(2) AH T EH M P S
+attenborough AE T AH N B ER OW
+attend AH T EH N D
+attendance AH T EH N D AH N S
+attendant AH T EH N D AH N T
+attendant's AH T EH N D AH N T S
+attendants AH T EH N D AH N T S
+attendants' AH T EH N D AH N T S
+attended AH T EH N D AH D
+attendee AH T EH N D IY
+attendees AH T EH N D IY Z
+attending AH T EH N D IH NG
+attends AH T EH N D Z
+attention AH T EH N SH AH N
+attentions AH T EH N SH AH N Z
+attentive AH T EH N T IH V
+attentively AH T EH N T IH V L IY
+attentiveness AH T EH N T IH V N AH S
+attenuate AH T EH N Y UW EY T
+attenuated AH T EH N Y UW EY T IH D
+attenuates AH T EH N Y UW EY T S
+atterberry AE T ER B EH R IY
+atterbury AE T ER B EH R IY
+attermann AE T ER M AH N
+attest AH T EH S T
+attested AH T EH S T IH D
+attesting AH T EH S T IH NG
+attests AH T EH S T S
+attests(2) AH T EH S
+attic AE T IH K
+attica AE T IH K AH
+attics AE T IH K S
+atticus AE T IH K AH S
+attie AE T IY
+attila AH T IH L AH
+attila's AH T IH L AH Z
+attire AH T AY ER
+attired AH T AY R D
+attitude AE T AH T UW D
+attitudes AE T AH T UW D Z
+attitudinal AE T AH T UW D AH N AH L
+attkisson AE T K IH S AH N
+attleboro AE T AH L B ER OW
+attlee AE T L IY
+attorney AH T ER N IY
+attorney's AH T ER N IY Z
+attorneys AH T ER N IY Z
+attorneys' AH T ER N IY Z
+attract AH T R AE K T
+attracted AH T R AE K T AH D
+attracting AH T R AE K T IH NG
+attraction AH T R AE K SH AH N
+attractions AH T R AE K SH AH N Z
+attractive AH T R AE K T IH V
+attractively AH T R AE K T IH V L IY
+attractiveness AH T R AE K T IH V N AH S
+attracts AH T R AE K T S
+attributable AH T R IH B Y AH T AH B AH L
+attribute AE T R AH B Y UW T
+attribute(2) AH T R IH B Y UW T
+attributed AH T R IH B Y AH T AH D
+attributes AE T R AH B Y UW T S
+attributes(2) AH T R IH B Y UW T S
+attributing AH T R IH B Y AH T IH NG
+attribution AE T R IH B Y UW SH AH N
+attridge AH T R IH JH
+attrition AH T R IH SH AH N
+attune AH T UW N
+attuned AH T UW N D
+attwood AE T W UH D
+attwoods AE T W UH D Z
+atwater AE T W AO T ER
+atwell AH T W EH L
+atwood AE T W UH D
+atworth AE T W ER TH
+atx EY T IY EH K S
+atypical EY T IH P IH K AH L
+atz AE T S
+au OW
+aube AO B
+aubel AW B AH L
+auber AO B ER
+auberry AO B EH R IY
+aubert AO B ER T
+aubin AO B IH N
+auble AO B AH L
+aubrey AO B R IY
+aubry AO B R IY
+aubuchon OW B AH SH AA N
+auburn AA B ER N
+auch AO CH
+auchter AW K T ER
+auckland AA K L AH N D
+auclair OW K L EH R
+aucoin OW K OY N
+aucott AO K AA T
+auction AA K SH AH N
+auction's AO K SH AH N Z
+auction(2) AO K SH AH N
+auctioned AO K SH AH N D
+auctioneer AA K SH AH N IH R
+auctioneering AO K SH AH N IH R IH NG
+auctioneers AO K SH AH N IH R Z
+auctioning AO K SH AH N IH NG
+auctions AA K SH AH N Z
+auctions(2) AO K SH AH N Z
+aud AO D
+audacious AA D EY SH AH S
+audacity AA D AE S AH T IY
+audas OW D AA Z
+auden AO D AH N
+auderburn AO D ER B ER N
+audet OW D EH T
+audette OW D EH T
+audi AO D IY
+audi's AO D IY Z
+audi's(2) AW D IY Z
+audi(2) AW D IY
+audia AO D IY AH
+audible AA D AH B AH L
+audibles AA D AH B AH L Z
+audibly AA D AH B L IY
+audience AA D IY AH N S
+audience's AA D IY AH N S AH Z
+audience's(2) AO D IY AH N S AH Z
+audience(2) AO D IY AH N S
+audiences AA D IY AH N S AH Z
+audiences(2) AO D IY AH N S AH Z
+audino AO D IY N OW
+audio AA D IY OW
+audiophile AO D IY OW F IY L
+audiophiles AO D IY OW F IY L Z
+audiotape AO D IY OW T EY P
+audiotapes AO D IY OW T EY P S
+audiotex AO D IY OW T EH K S
+audiotronic AO D IY OW T R AA N IH K
+audiotronics AO D IY OW T R AA N IH K S
+audiovisual AO D IY OW V IH ZH UW AH L
+audiovox AO D IY OW V AA K S
+audis AO D IH S
+audis(2) AW D IY Z
+audit AO D IH T
+audited AO D IH T IH D
+auditing AA D AH T IH NG
+audition AA D IH SH AH N
+auditioned AO D IH SH AH N D
+auditioning AA D IH SH AH N IH NG
+auditions AO D IH SH AH N Z
+auditor AO D IH T ER
+auditor's AO D IH T ER Z
+auditorium AO D AH T AO R IY AH M
+auditoriums AO D IH T AO R IY AH M Z
+auditors AA D AH T ER Z
+auditors' AO D IH T ER Z
+auditory AO D IH T AO R IY
+audits AA D AH T S
+audran AO D R AH N
+audrey AO D R IY
+audric AO D R IH K
+audrie AO D ER IY
+audris OW D R IY S
+audry AO D R IY
+audubon AO D AH B AA N
+audwin AO D W IH N
+aue AW
+auel AW AH L
+auen AW AH N
+auer AW ER
+auerbach AW ER B AA K
+auerback AW R B AE K
+aufderheide AW F D ER HH AY D
+aufhauser AO F HH AW Z ER
+aufiero OW F IH R OW
+aug AO G AH S T
+augat AO G AE T
+auge AO JH
+augello AO JH EH L OW
+augenstein AW G AH N S T AY N
+augenstein(2) AW G AH N S T IY N
+auger AO G ER
+augers AO G ER Z
+aughenbaugh AO EH N B AO
+augment AO G M EH N T
+augmentable AA G M EH N T AH B AH L
+augmentation AA G M EH N T EY SH AH N
+augmented AA G M EH N T AH D
+augmenting AO G M EH N T IH NG
+augsburg AO G Z B ER G
+augsburger AW G Z B ER G ER
+augsburger(2) AO G Z B ER G ER
+augspurger AW G S P ER G ER
+augspurger(2) AO G S P ER G ER
+augur AO G ER
+auguring AO G ER IH NG
+augurs AO G ER Z
+august AA G AH S T
+august's AO G AH S T S
+august(2) AO G AH S T
+augusta AH G AH S T AH
+augusta's AH G AH S T AH Z
+auguste AO G AH S T
+augustin AW G UW S T IY N
+augustine AA G AH S T IY N
+augustine(2) AO G AH S T IY N
+augustinian AA G AH S T IH N IY AH N
+augustinians AA G AH S T IH N IY AH N Z
+augusto AO G AH S T OW
+augustson AO G AH S T S AH N
+augustson(2) AO G AH S AH N
+augustus AA G AH S T AH S
+augustus(2) AH G AH S T AH S
+augustyn AW G AH S T IH N
+augustyniak AW G AH S T IH N IY AE K
+aujourd'hui OW ZH AO R D W IY
+aujourd'hui's OW ZH AO R D W IY Z
+auker AO K ER
+aukerman AW K ER M AH N
+aul AO L
+aulana AW L AA N AH
+aulander OW L AE N D ER
+auld AO L D
+aulds AO L D Z
+auletta AO L EH T AH
+aull AO L
+ault AO L T
+aultman AO L T M AH N
+auman AO M AH N
+aumann AO M AH N
+aument AW M AH N T
+aumiller AW M AH L ER
+aune AO N
+aung AO NG
+aungst AW NG G S T
+aunt AE N T
+aunt's AE N T S
+aunt's(2) AO N T S
+aunt(2) AO N T
+auntie AE N T IY
+auntie(2) AO N T IY
+aunts AE N T S
+aunts' AE N T S
+aunts'(2) AO N T S
+aunts(2) AO N T S
+aupperle AW P ER L IY
+aura AO R AH
+aural AO R AH L
+aurand AO R AH N D
+aurea AW R EY AA
+aurelio AW R EY L IY OW
+aureole AA R IY OW L
+auria AO R IY AH
+aurich AW R IH K
+auriemma AO R IY M AH
+aurora ER AO R AH
+auroral ER AO R AH L
+aurum AO R AH M
+aus AW Z
+ausbrooks AW S B R UH K S
+ausburn AW S B ER N
+auschwitz AO SH W IH T S
+auschwitz(2) AW SH W IH T S
+ausherman AW SH ER M AH N
+ausimont AW S IH M AA N T
+auslander AW S L AH N D ER
+ausley AO S L IY
+ausman AW S M AH N
+ausmus AW S M IH S
+auspey AW S P IY
+auspice AO S P IH S
+auspices AO S P IH S IH Z
+auspicious AA S P IH SH AH S
+aussie AO S IY
+aust AO S T
+austad AW S T AH D
+austat OW S T AE T
+austell AW S T AH L
+austen AO S T IH N
+austen's AO S T IH N Z
+auster AO S T ER
+austere AO S T IH R
+austerely AO S T IH R L IY
+austerity AO S T EH R IH T IY
+austill AW S T AH L
+austin AO S T AH N
+austin's AO S T AH N Z
+austine AO S T IY N
+auston AO S T AH N
+austral AO S T R AH L
+australasia AO S T R AH L EY ZH AH
+australia AO S T R EY L Y AH
+australia's AO S T R EY L Y AH Z
+australian AO S T R EY L Y AH N
+australians AO S T R EY L Y AH N Z
+australopithecine AO S T R EY L OW P IH TH AH S AY N
+australopithecus AO S T R EY L OW P IH TH AH K AH S
+australs AO S T R AH L Z
+austrasia AO S T R EY ZH AH
+austria AO S T R IY AH
+austria's AO S T R IY AH Z
+austrian AO S T R IY AH N
+austrians AO S T R IY AH N Z
+austro AO S T R OW
+austroasiatic AO S T R OW EY ZH IY AE T IH K
+austron AO S T R AH N
+auten AW T AH N
+autenrieth AW T IH N R IY IH TH
+autenrieth(2) AW T IH N R IY TH
+autery OW T ER IY
+auth AO TH
+authement AW TH M AH N T
+authentic AH TH EH N T IH K
+authentic(2) AO TH EH N T IH K
+authentic(3) AO TH EH N IH K
+authentic(4) AH TH EH N IH K
+authentically AO TH EH N T IH K L IY
+authentically(2) AO TH EH N IH K L IY
+authenticate AO TH EH N T AH K EY T
+authenticated AO TH EH N T AH K EY T AH D
+authenticating AO TH EH N T AH K EY T IH NG
+authentication AO TH EH N T AH K EY SH AH N
+authentications AO TH EH N T AH K EY SH AH N Z
+authenticity AO TH AH N T IH S IH T IY
+auther AO TH ER
+authier AW TH IY ER
+author AO TH ER
+author's AO TH ER Z
+authored AO TH ER D
+authoring AA TH ER IH NG
+authoritarian AH TH AO R AH T EH R IY AH N
+authoritarianism AH TH AO R AH T EH R IY AH N IH Z AH M
+authoritative AH TH AO R AH T EY T IH V
+authoritatively AH TH AO R AH T EY T IH V L IY
+authorities AH TH AO R AH T IY Z
+authorities' AH TH AO R IH T IY Z
+authority AH TH AO R AH T IY
+authority's AH TH AO R IH T IY Z
+authorization AO TH ER AH Z EY SH AH N
+authorizations AO TH ER AH Z EY SH AH N Z
+authorize AO TH ER AY Z
+authorized AO TH ER AY Z D
+authorizes AO TH ER AY Z IH Z
+authorizing AO TH ER AY Z IH NG
+authors AO TH ER Z
+authors' AO TH ER Z
+authorship AO TH ER SH IH P
+autism AO T IH Z AH M
+autistic AO T IH S T IH K
+auto AO T OW
+auto's AO T OW Z
+autobahn AO T OW B AA N
+autobiographer AO T AH B AY AA G R AH F ER
+autobiographical AO T AH B AY AH G R AE F IH K AH L
+autobiographies AO T AH B AY AA G R AH F IY Z
+autobiography AO T AH B AY AA G R AH F IY
+autobon AA T AH B AA N
+autoclave AO T OW K L EY V
+autocracy AO T AA K R AH S IY
+autocrat AO T AH K R AE T
+autocratic AO T AH K R AE T IH K
+autodesk AO T OW D EH S K
+autodie AO T OW D AY
+autoeurope AO T OW Y UH R AH P
+autofact AO T OW F AE K T
+autofacts AO T OW F AE K T S
+autograph AO T AH G R AE F
+autographed AO T AH G R AE F T
+autographs AO T AH G R AE F S
+autoimmune AO T OY M Y UW N
+autolatina AO T OW L AH T IY N AH
+automaker AO T OW M EY K ER
+automaker's AO T OW M EY K ER Z
+automakers AO T OW M EY K ER Z
+automakers' AO T OW M EY K ER Z
+automap AO T OW M AE P
+automata AO T AA M AH T AH
+automate AO T AH M EY T
+automated AO T AH M EY T IH D
+automates AO T AH M EY T S
+automatic AO T AH M AE T IH K
+automatic(2) AO T OW M AE T IH K
+automatically AO T AH M AE T IH K L IY
+automatically(2) AO T OW M AE T IH K L IY
+automatics AO T AH M AE T IH K S
+automating AO T AH M EY T IH NG
+automation AO T AH M EY SH AH N
+automatix AO T OW M EY T IH K S
+automaton AO T AA M AH T AA N
+automobile AO T AH M OW B IY L
+automobiles AO T AH M OW B IY L Z
+automobili AO T OW M OW B IY L IY
+automotive AO T AH M OW T IH V
+automotive's AO T AH M OW T IH V Z
+automoviles AO T OW M OW V IY L EH Z
+auton AO T AH N
+autonomic AO T AH N AA M IH K
+autonomous AO T AA N AH M AH S
+autonomously AO T AA N OW M AH S L IY
+autonomy AO T AA N AH M IY
+autonomy(2) AH T AA N AH M IY
+autopacific AO T OW P AH S IH F IH K
+autopart AO T OW P AA R T
+autoparts AO T OW P AA R T S
+autopilot AO T OW P AY L AH T
+autopsied AO T AA P S IY D
+autopsies AO T AA P S IY Z
+autopsy AO T AA P S IY
+autorad AO T OW R AE D
+autoradiograph AA T OW R EY D IY OW G R AE F
+autorads AO T OW R AE D Z
+autos AO T OW Z
+autospa AO T OW S P AH
+autotote AO T OW T OW T
+autotrophic AO T AH T R OW F IH K
+autoworker AO T OW W ER K ER
+autoworkers AO T OW W ER K ER Z
+autrey AO T R IY
+autry AO T R IY
+autumn AO T AH M
+autumn's AO T AH M Z
+autumnal AO T AH M N AH L
+auvil OW V IH L
+aux OW
+auxier AO K S IY ER
+auxiliary AA G Z IH L Y ER IY
+auxiliary(2) AA G Z IH L IY EH R IY
+auxton AO K S T AH N
+auyeung AW Y UW NG
+auzenne AO Z IH N
+ava EY V AH
+avail AH V EY L
+availabilities AH V EY L AH B IH L IH T IY Z
+availability AH V EY L AH B IH L AH T IY
+availability(2) AH V EY L AH B IH L IH T IY
+available AH V EY L AH B AH L
+availed AH V EY L D
+avakian AH V EY K IY AH N
+avalanche AE V AH L AE N CH
+avalanches AE V AH L AE N CH IH Z
+avallone AE V AH L OW N
+avalon AE V AH L AA N
+avalon's AE V AH L AA N Z
+avalos AA V AA L OW Z
+avana AH V AE N AH
+avana's AH V AE N AH Z
+avanex AA V AH N EH K S
+avant AH V AA N T
+avant-garde AH V AA N T G AA R D
+avant-garde(2) AH V AA N G AA R D
+avantek AH V AA N T EH K
+avanti AH V AA N T IY
+avants AA V AO N T S
+avarice AE V ER AH S
+avasso AH V AA S OW
+avatar AE V AH T AA R
+avatars AE V AH T AA R Z
+avco AE V K OW
+avdel AE V D EH L
+ave AE V AH N UW
+ave(2) AA V EY
+avedisian AE V IH D IH ZH IH N
+avedon AE V EH D AA N
+avelar AA V EY L AA R
+aveline AA V EH L IY N IY
+avella AH V EH L AH
+avellino AE V AH L IY N OW
+avellino's AE V AH L IY N OW Z
+avemco AH V EH M K OW
+avemco's AH V EH M K OW Z
+aven AA V EY AH N
+avena AA V EY N AH
+avenall AA V EY N AA L
+avendano AA V EH N D AA N OW
+avenel AA V EY N EH L
+avenell AA V EY N EY L
+avenge AH V EH N JH
+avenged AH V EH N JH D
+avenger AH V EH N JH ER
+avenging AH V EH N JH IH NG
+aveni AA V EH N IY
+avent AA V AH N T
+aventura AH V EH N CH ER AH
+aventura(2) AE V AH N CH UH R AH
+avenue AE V AH N UW
+avenue's AE V AH N UW Z
+avenues AE V AH N UW Z
+aver EY V ER
+avera AA V EH R AH
+average AE V ER IH JH
+average's AE V R IH JH IH Z
+average(2) AE V R AH JH
+average(3) AE V R IH JH
+averaged AE V R AH JH D
+averaged(2) AE V R IH JH D
+averages AE V R IH JH IH Z
+averaging AE V R IH JH IH NG
+averbeck EY V ER B EH K
+averell AA V EH R EY L
+averett AE V ER EH T
+averette AE V ER EH T
+averil EY V ER IH L
+averil(2) EY V R IH L
+averill AA V EH R IY L
+averitt AE V ER IH T
+averof AE V ER AA F
+avers EY V ER Z
+aversa AA V EH R S AH
+aversano AA V ER S AA N OW
+averse AH V ER S
+aversion AH V ER ZH AH N
+aversions AH V ER ZH AH N Z
+aversive AH V ER S AH V
+avert AH V ER T
+averted AH V ER T AH D
+averting AH V ER T IH NG
+averts AH V ER T S
+avery EY V ER IY
+avery's EY V ER IY Z
+averyl AE V ER IH L
+avey EY V IY
+avi AA V IY
+avi(2) EY V IY
+avia AA V IY AH
+aviacion EY V IY EY SH AH N
+aviall EY V IY AH L
+avian EY V IY AH N
+aviano AA V IY AA N OW
+aviano's AA V IY AA N OW Z
+aviaries EY V IY EH R IY Z
+aviary EY V IY EH R IY
+aviation EY V IY EY SH AH N
+aviation's EY V IY EY SH AH N Z
+aviator EY V IY EY T ER
+aviators EY V IY EY T ER Z
+aviazione AE V IY AE Z IY OW N IY
+avice AA V AY S
+avid AE V AH D
+avid(2) AE V IH D
+avidly AE V AH D L IY
+avignon AE V IH N Y AO N
+avila AH V IH L AH
+aviles AA V IY L EH S
+avilez AA V IY L EH Z
+avilla AH V IH L AH
+avina AA V IY N AH
+avinger EY V IH NG ER
+avionic EY V IY AA N IH K
+avionics EY V IY AA N IH K S
+avions EY V IY AH N Z
+avis EY V IH S
+avitabile AA V IY T AA B AH L
+avital AH V IY T AH L
+avitia AA V IY SH AH
+aviv AA V IY V
+aviv's AA V IY V Z
+avmark AE V M AA R K
+avner AE V N ER
+avnet AE V N EH T
+avocado AE V AH K AA D OW
+avocados AE V AH K AA D OW Z
+avocation AE V AH K EY SH AH N
+avocet AE V AH S EH T
+avodon AE V AH D AA N
+avoid AH V OY D
+avoidable AH V OY D AH B AH L
+avoidance AH V OY D AH N S
+avoided AH V OY D AH D
+avoided(2) AH V OY D IH D
+avoiding AH V OY D IH NG
+avoids AH V OY D Z
+avolio AH V OW L IY OW
+avon EY V AA N
+avon's AE V AH N Z
+avondale AE V AH N D EY L
+avow AH V AW
+avowed AH V AW D
+avowedly AH V AW AH D L IY
+avraham EY V R AH HH AE M
+avraham(2) AA V R AH HH AA M
+avram EY V R AH M
+avrett AE V R EH T
+avril AE V R IH L
+avril(2) EY V R AH L
+avrim AA V R IY M
+avtex AE V T EH K S
+avtex's AE V T EH K S IH Z
+avtovaz AE V T OW V AE Z
+avuncular AH V AH NG K Y AH L ER
+aw AO
+awacs EY W AE K S
+awad AH W AA D
+await AH W EY T
+awaited AH W EY T AH D
+awaited(2) AH W EY T IH D
+awaiting AH W EY T IH NG
+awaits AH W EY T S
+awake AH W EY K
+awaken AH W EY K AH N
+awakened AH W EY K AH N D
+awakening AH W EY K AH N IH NG
+awakens AH W EY K AH N Z
+awalt AA V AH L T
+awan EY W AH N
+award AH W AO R D
+awarded AH W AO R D AH D
+awarded(2) AH W AO R D IH D
+awarding AH W AO R D IH NG
+awards AH W AO R D Z
+aware AH W EH R
+awareness AH W EH R N AH S
+awash AH W AA SH
+away AH W EY
+aways EY W EY Z
+awb AA W B
+awb(2) EY D AH B AH L Y UW B IY
+awb(3) EY D AH B AH Y UW B IY
+awbrey AO B R IY
+awe AA
+awe(2) AO
+awed AO D
+aweida AH W EY D AH
+aweida(2) AH W AY D AH
+awesome AA S AH M
+awesome(2) AO S AH M
+awesomely AA S AH M L IY
+awesomely(2) AO S AH M L IY
+awestruck AA S T R AH K
+awful AA F AH L
+awful(2) AO F AH L
+awfully AA F L IY
+awfully(2) AO F AH L IY
+awfulness AO F AH L N AH S
+awhile AH W AY L
+awkward AA K W ER D
+awkward(2) AO K W ER D
+awkwardly AO K W ER D L IY
+awkwardness AO K W ER D N AH S
+awning AA N IH NG
+awoke AH W OW K
+awry ER AY
+awtrey AO T R IY
+ax AE K S
+axa AE K S AH
+axa's AE K S AH Z
+axe AE K S
+axed AE K S T
+axel AE K S AH L
+axelrad AE K S EH L R AH D
+axelrod AE K S AH L R AA D
+axelsen AE K S EH L S AH N
+axelson AE K S IH L S AH N
+axes AE K S IH Z
+axes(2) AE K S IY Z
+axford AE K S F AO R D
+axial AE K S IY AH L
+axid AE K S IH D
+axilrod AE K S IH L R AA D
+axiom AE K S IY AH M
+axiomatic AE K S IY AH M AE T IH K
+axioms AE K S IY AH M Z
+axis AE K S AH S
+axle AE K S AH L
+axles AE K S AH L Z
+axley AE K S L IY
+axline AE K S L AY N
+axlon AE K S L AA N
+axon AE K S AA N
+axons AE K S AA N Z
+axsom AE K S AH M
+axt AE K S T
+axtell AE K S T EH L
+axtman AE K S T M AH N
+axton AE K S T AH N
+ay EY
+ay(2) AY
+ayacucho AY AH K AH CH OW
+ayako AH Y AA K OW
+ayala AH Y AA L AH
+ayars EY ER Z
+ayatollah AY AH T OW L AH
+ayatollah's AY AH T OW L AH
+ayatollahs AY AH T AA L AA Z
+aybar EY B ER
+aycock EY K AH K
+aydar AY D AA R
+aydar(2) EY D AA R
+aydelott EY D IH L AA T
+aydelotte EY D AH L AA T
+aydin EY D IH N
+aydt EY T
+aye AY
+ayende AH Y EH N D IY
+ayende(2) AH Y EH N D EY
+ayer AY ER
+ayer's EH R Z
+ayer's(2) EY R Z
+ayer(2) EY ER
+ayers AY ER Z
+ayers(2) EY ER Z
+ayerst EY ER S T
+ayerst(2) EH R AH S T
+ayes AY Z
+aygen AY G AH N
+aygen(2) EY G AH N
+aykroyd EY K R OY D
+aykroyd(2) AY K R OY D
+ayler EY L ER
+ayles EY L Z
+aylesworth EY L Z W ER TH
+aylesworth(2) EY AH L Z W ER TH
+ayling EY L IH NG
+aylmer EY L M ER
+aylor EY L ER
+aylsworth EY L S W ER TH
+aylward EY L W ER D
+aylwin EY L W IH N
+aylwin(2) AY L W IH N
+aylworth EY L W ER TH
+aymond EY M AH N D
+ayn EY N
+aynes EY N Z
+ayo EY OW
+ayodhya AY AA D Y AH
+ayon EY AO N
+ayotte EY AO T
+ayoub EY AW B
+ayr EY R
+ayre EH R
+ayres EH R Z
+ayscue EY S K Y UW
+aytes EY T S
+ayuso AY UW S OW
+ayyad AY AA D
+ayyad's AY AA D Z
+ayyad's(2) AY AE D Z
+ayyad(2) AY AE D
+ayyash AY Y AE SH
+azactam AH Z AE K T AE M
+azalea AH Z EY L Y AH
+azaleas AH Z EY L Y AH Z
+azalia AA Z AA L IY AH
+azar AA Z AA R
+azarow AE Z ER OW
+azbell AE Z B EH L
+azbill AA Z B IY L
+azcarraga AE Z K AA R AA G AH
+azcona AE Z K OW N AH
+azcuenaga AE Z K W EY N AA G AH
+azelia AA Z EH L IY AH
+azerbaijan AA Z ER B AY JH AA N
+azerbaijan's AA Z ER B AY JH AA N Z
+azerbaijan's(2) AE Z ER B AY JH AA N Z
+azerbaijan(2) AE Z ER B AY JH AA N
+azerbaijani AA Z ER B AY JH AA N IY
+azerbaijani(2) AE Z ER B AY JH AA N IY
+azerbaijanis AA Z ER B AY JH AA N IY Z
+azerbaijanis(2) AE Z ER B AY JH AA N IY Z
+azeri AH Z EH R IY
+azevedo AA Z EY V EY D OW
+azhar AH Z AA R
+azhar's AH Z AA R Z
+azides AE Z AY D Z
+azidothymidine AH Z IH D AH TH AY M AH D IY N
+azidothymidine(2) AH Z IH D AH TH AY M AH D AY N
+azidothymidine(3) EY Z AY D AH TH AY M AH D IY N
+azidothymidine(4) EY Z AY D AH TH AY M AH D AY N
+azinger EY Z IH NG ER
+aziz AH Z IY Z
+azmeer AE Z M IH R
+azoff AE Z AO F
+azores AH Z AO R Z
+azpurua AE Z P Y UH R UW AH
+aztar AE Z T ER
+aztec AE Z T EH K
+azteca AE Z T EH K AH
+aztecs AE Z T EH K S
+azuka AH Z UW K AH
+azura AH Z UH R AH
+azure AE ZH ER
+azzara AA T S AA R AH
+azzarello AA T S AA R EH L OW
+azzaro AA T S AA R OW
+azzato AH Z AA T OW
+azzopardi AA T S OW P AA R D IY
+b B IY
+b'gosh B AH G AO SH
+b'nai B AH N EY
+b'rith B R IH TH
+b's B IY Z
+b-j B IY JH EY
+b-j's B IY JH EY Z
+b. B IY
+b.'s B IY Z
+b.s B IY Z
+ba'ath B AA TH
+ba'ath(2) B AH AA TH
+baab B AA B
+baack B AA K
+baade B AA D
+baalbek B AA L B EH K
+baalbeq B AA L B EH K
+baar B AA R
+baars B AA R Z
+baas B AA Z
+baasch B AA SH
+baatz B AA T S
+bab B AE B
+baba B AH B AH
+baba's B AH B AH Z
+baba's(2) B AA B AH Z
+baba(2) B AA B AH
+babangida B AH B AA NG G IH D AH
+babangida(2) B AH B AE NG G IH D AH
+babar B AA B AA R
+babar's B AA B AA R Z
+babb B AE B
+babbage B AE B IH JH
+babbage's B AE B IH JH IH Z
+babbington B AE B IH N G T AH N
+babbio B AE B IY OW
+babbit B AE B IH T
+babbit's B AE B IH T S
+babbitt B AE B IH T
+babbitt's B AE B AH T S
+babbitts B AE B AH T S
+babble B AE B AH L
+babbled B AE B AH L D
+babbler B AE B L ER
+babblers B AE B L ER Z
+babbling B AE B AH L IH NG
+babbling(2) B AE B L IH NG
+babbs B AE B Z
+babcock B AE B K AO K
+babe B EY B
+babel B AE B AH L
+baber B EY B ER
+babers B EY B ER Z
+babes B EY B Z
+babette B AH B EH T
+babiak B AA B IY AE K
+babiarz B AH B IY ER Z
+babic B AA B IH K
+babich B AE B IH CH
+babies B EY B IY Z
+babies' B EY B IY Z
+babik B AA B IH K
+babin B AE B IH N
+babineau B AE B IH N OW
+babineaux B AE B IH N OW
+babington B AE B IH NG T AH N
+babino B AA B IY N OW
+babinski B AH B IH N S K IY
+babish B AE B IH SH
+babita B AA B IY T AH
+babka B AE B K AH
+babler B EY B AH L ER
+baboon B AH B UW N
+baboon's B AE B UW N Z
+baboon's(2) B AH B UW N Z
+baboons B AE B UW N Z
+baboons(2) B AH B UW N Z
+babs B AE B Z
+babson B AE B S AH N
+babu B AA B UW
+babula B AA B UW L AH
+babushka B AH B UH SH K AH
+babushkas B AH B UH SH K AH Z
+baby B EY B IY
+baby's B EY B IY Z
+babyak B AE B IY AE K
+babyhood B EY B IY HH UH D
+babyish B EY B IY IH SH
+babylon B AE B AH L AA N
+babylonian B AE B AH L OW N IY AH N
+babylonians B AE B AH L OW N IY AH N Z
+babysat B EY B IY S AE T
+babysit B EY B IY S IH T
+babysitter B EY B IY S IH T ER
+babysitters B EY B IY S IH T ER Z
+babysitting B EY B IY S IH T IH NG
+baca B AE K AH
+bacall B AH K AO L
+bacardi B AH K AA R D IY
+baccalaureate B AE K AH L AO R IY AH T
+baccarat B AA K ER AA
+baccari B AA K AA R IY
+bacchanal B AH K EY N AH L
+bacchanal(2) B AE K IH N AH L
+bacchanalia B AE K AH N EY L Y AH
+bacchi B AE K IY
+bacchus B AE K IH S
+bacci B AA CH IY
+baccus B AE K AH S
+bach B AA K
+bacha B AE CH AH
+bachailian B AH K EY L IY AH N
+bachand B AE CH AH N D
+bachar B AA K ER
+bacharach B AE K ER AE K
+bache B AE CH
+bache's B AE CH IH Z
+bache's(2) B EY CH IH Z
+bache(2) B EY CH
+bachelder B AA K IH L D ER
+bacheller B AA K AH L ER
+bachelor B AE CH AH L ER
+bachelor's B AE CH AH L ER Z
+bachelor's(2) B AE CH L ER Z
+bachelor(2) B AE CH L ER
+bachelors B AE CH L ER Z
+bacher B AA K ER
+bachera B AA K ER AH
+bachert B AE CH ER T
+bachler B AE K L ER
+bachman B AA K M AH N
+bachmann B AA K M AH N
+bachmeier B AA K M AY ER
+bachner B AA K N ER
+bachrach B AA K R AH K
+bachtel B AE K T AH L
+bachtell B AE K T AH L
+bachus B AE CH AH S
+bacigalupi B AA CH IY G AA L UW P IY
+bacigalupo B AA CH IY G AA L UW P OW
+bacik B AA CH IH K
+bacillus B AH S IH L AH S
+bacino B AA CH IY N OW
+back B AE K
+backache B AE K EY K
+backaches B AE K EY K S
+backbite B AE K B AY T
+backbiting B AE K B AY T IH NG
+backboard B AE K B AO D
+backboards B AE K B AO D Z
+backbone B AE K B OW N
+backbones B AE K B OW N Z
+backdate B AE K D EY T
+backdated B AE K D EY T IH D
+backdates B AE K D EY T S
+backdating B AE K D EY T IH NG
+backdoor B AE K D AO R
+backdoors B AE K D AO R Z
+backdrop B AE K D R AA P
+backdrops B AE K D R AA P S
+backe B AE K
+backed B AE K T
+backend B AE K EH N D
+backends B AE K EH N D Z
+backer B AE K ER
+backer's B AE K ER Z
+backers B AE K ER Z
+backes B AE K S
+backfield B AE K F IY L D
+backfields B AE K F IY L D Z
+backfire B AE K F AY R
+backfired B AE K F AY ER D
+backfires B AE K F AY ER Z
+backfiring B AE K F AY ER IH NG
+backgammon B AE K G AE M AH N
+background B AE K G R AW N D
+backgrounds B AE K G R AW N D Z
+backhand B AE K HH AE N D
+backhanded B AE K HH AE N D AH D
+backhanded(2) B AE K HH AE N D IH D
+backhaus B AE K HH AW S
+backhoe B AE K HH OW
+backhoes B AE K HH OW Z
+backing B AE K IH NG
+backlash B AE K L AE SH
+backlashes B AE K L AE SH AH Z
+backless B AE K L AH S
+backlight B AE K L AY T
+backlights B AE K L AY T S
+backlist B AE K L IH S T
+backlisted B AE K L IH S T AH D
+backlog B AE K L AA G
+backlog(2) B AE K L AO G
+backlogged B AE K L AA G D
+backlogs B AE K L AO G Z
+backlund B AE K L AH N D
+backman B AE K M AH N
+backpack B AE K P AE K
+backpacks B AE K P AE K S
+backpedal B AE K P EH D AH L
+backpedaled B AE K P EH D AH L D
+backpedaling B AE K P EH D AH L IH NG
+backpedaling(2) B AE K P EH D L IH NG
+backpedals B AE K P EH D AH L Z
+backrest B AE K R EH S T
+backrests B AE K R EH S T S
+backroom B AE K R UW M
+backrooms B AE K R UW M Z
+backs B AE K S
+backsaw B AE K S AA
+backsaw(2) B AE K S AO
+backsaws B AE K S AA Z
+backsaws(2) B AE K S AO Z
+backseat B AE K S IY T
+backseats B AE K S IY T S
+backset B AE K S EH T
+backside B AE K S AY D
+backsides B AE K S AY D Z
+backslap B AE K S L AE P
+backslapping B AE K S L AE P IH NG
+backslash B AE K S L AE SH
+backslashes B AE K S L AE SH AH Z
+backslide B AE K S L AY D
+backsliding B AE K S L AY D IH NG
+backspin B AE K S P IH N
+backstage B AE K S T EY JH
+backstairs B AE K S T EH R Z
+backstitch B AE K S T IH CH
+backstitches B AE K S T IH CH AH Z
+backstop B AE K S T AA P
+backstroke B AE K S T R OW K
+backstrom B AE K S T R AH M
+backtrack B AE K T R AE K
+backtracked B AE K T R AE K T
+backtracking B AE K T R AE K IH NG
+backtracks B AE K T R AE K S
+backup B AE K AH P
+backups B AE K AH P S
+backus B AE K AH S
+backward B AE K W ER D
+backwardation B AE K W ER D EY SH AH N
+backwardness B AE K W ER D N AH S
+backwards B AE K W ER D Z
+backwash B AE K W AA SH
+backwater B AE K W AO T ER
+backwaters B AE K W AO T ER Z
+backwoods B AE K W UH D Z
+backwoodsman B AE K W UH D Z M AH N
+backyard B AE K Y AA R D
+backyards B AE K Y AA R D Z
+bacon B EY K AH N
+bacon's B EY K AH N Z
+bacorn B AE K ER N
+bacot B AE K AH T
+bacot(2) B EY K AE T
+bacote B AH K OW T
+bacteria B AE K T IH R IY AH
+bacteria's B AE K T IH R IY AH Z
+bacterial B AE K T IH R IY AH L
+bacteriology B AE K T IH R IY AA L AH JH IY
+bacterium B AE K T IH R IY AH M
+bacus B AE K IH S
+bad B AE D
+bada B AA D AH
+badal B EY D AH L
+badalamenti B AA D AA L AA M EH N T IY
+badami B AA D AA M IY
+badavatz B AE D AH V AE T S
+badders B AE D ER Z
+bade B EY D
+badeah B AH D IY AH
+badeau B AH D OW
+badeaux B AH D OW
+badelain B AE D AH L EY N
+baden B EY D AH N
+baden's B AA D AH N Z
+bader B AE D ER
+bader(2) B EY D ER
+badertscher B AE D ER CH ER
+badge B AE JH
+badger B AE JH ER
+badger's B AE JH ER Z
+badgered B AE JH ER D
+badgering B AE JH ER IH NG
+badgers B AE JH ER Z
+badges B AE JH IH Z
+badgett B AE JH IH T
+badgley B AE JH L IY
+badia B AA D IY AH
+badillo B AH D IH L OW
+badland B AE D L AE N D
+badlands B AE D L AE N D Z
+badley B AE D L IY
+badly B AE D L IY
+badman B AE D M AH N
+badminton B AE D M IH N T AH N
+badmintons B AE D M IH N T AH N Z
+badness B AE D N AH S
+badolato B AA D OW L AA T OW
+badour B AH D UH R
+badu B AH D UW
+badura B AA D UH R AH
+bady B EY D IY
+bae B AY
+baechle B EH K AH L
+baecker B EH K ER
+baedeker B EY D AH K ER
+baedeker's B EY D AH K ER Z
+baehr B IY R
+baehr(2) B EH R
+baek B IY K
+baek(2) B EH K
+baer B EH R
+baerwald B EH R W AO L D
+baeten B EH T AH N
+baetjer B EH T JH ER
+baetz B IY T S
+baez B AY EH Z
+baeza B IY Z AH
+baffa B AE F AH
+baffle B AE F AH L
+baffled B AE F AH L D
+baffles B AE F AH L Z
+baffling B AE F AH L IH NG
+baffling(2) B AE F L IH NG
+bafokeng B AE F OW K EH NG
+bag B AE G
+bagan B EY G AH N
+bagby B AE G B IY
+bagdad B AE G D AE D
+bagdasarian B AE G D AH S EH R IY AH N
+bagdikian B AE G D IH K IY AH N
+bagdon B AE G D AH N
+bagdonas B AE G D AH N AH Z
+bagel B EY G AH L
+bageland B EY G AH L AE N D
+bagels B EY G AH L Z
+bagent B EY JH AH N T
+bagful B AE G F UH L
+bagg B AE G
+baggage B AE G AH JH
+baggage(2) B AE G IH JH
+bagge B AE G
+bagged B AE G D
+baggerly B AE G ER L IY
+baggett B AE G IH T
+baggie B AE G IY
+bagginess B AE G IY N AH S
+bagging B AE G IH NG
+baggio B AA JH IY OW
+baggio's B AA JH IY OW Z
+baggott B AE G AH T
+baggs B AE G Z
+baggy B AE G IY
+baghdad B AE G D AE D
+baghdad's B AE G D AE D Z
+baghli B AE G L IY
+baginski B AH G IH N S K IY
+bagley B AE G L IY
+baglio B AE G L IY OW
+bagman B AE G M AH N
+bagnall B AE G N AH L
+bagnato B AA G N AA T OW
+bagnell B AE G N AH L
+bagpipe B AE G P AY P
+bagpiper B AE G P AY P ER
+bagpipes B AE G P AY P S
+bags B AE G Z
+bagsby B AE G Z B IY
+bagshaw B AE G SH AO
+bagwell B AE G W EH L
+bah B AA
+baha'is B AA HH AA IH Z
+baham B AA AH M
+bahama B AH HH AA M AH
+bahamas B AH HH AA M AH Z
+bahamian B AH HH EY M IY AH N
+bahan B AE HH AH N
+bahe B EY HH
+bahena B AE HH IH N AH
+bahia B AA HH IY AH
+bahir B AH HH IH R
+bahl B AA L
+bahler B AA L ER
+bahls B AA L Z
+bahm B AE M
+bahman B AA M AH N
+bahn B AE N
+bahner B AA N ER
+bahnsen B AA N S AH N
+bahr B EH R
+bahr(2) B AA R
+bahrain B AA R EY N
+bahrain's B AA R EY N Z
+bahrain's(2) B AY R EY N Z
+bahrain(2) B AY R EY N
+bahraini B ER EY N IY
+bahraini(2) B AY R AA N IY
+bahraini(3) B AA R EY N IY
+bahrainian B ER EY N IY AH N
+bahrainian(2) B AY R AA N IY AH N
+bahrainian(3) B AA R EY N IY AH N
+bahrainis B ER EY N IY Z
+bahre B AA R
+bahrenburg B AA R AH N B ER G
+baht B AA T
+baidoa B AY D OW AH
+baidoa's B AY D OW AH Z
+baidoan B AY D OW AH N
+baidoan's B AY D OW AH N Z
+baidoans B AY D OW AH N Z
+baidoas B AY D OW AH Z
+baie B AY IY
+baier B EY ER
+baig B EY G
+baikonur B AY K AH N AO R
+bail B EY L
+baila B AY L AH
+bailard B EY L ER D
+bailby B EY L B IY
+baile B EY L
+bailed B EY L D
+bailer B EY L ER
+bailes B EY L Z
+bailey B EY L IY
+bailey's B EY L IY Z
+baileys B EY L IY Z
+bailie B EY L IY
+bailiff B EY L AH F
+bailiff(2) B EY L IH F
+bailiffs B EY L AH F S
+bailin B EY L IH N
+bailing B EY L IH NG
+bailiwick B EY L IH W IH K
+baillargeon B AH L AA R JH IH N
+baillie B EY L IY
+bailly B EY L IY
+bailon B EY L AH N
+bailor B EY L ER
+bailout B EY L AW T
+bailouts B EY L AW T S
+bails B EY L Z
+baily B EY L IY
+bailyn B EY L IH N
+baim B EY M
+bain B EY N
+bain's B EY N Z
+bainbridge B EY N B R IH JH
+bainbridge's B EY N B R IH JH AH Z
+baine B EY N
+bainerd B EY N ER D
+baines B EY N Z
+bains B EY N Z
+bainter B EY N T ER
+bainton B EY N T AH N
+baio B AA IY OW
+bair B EH R
+baird B EH R D
+baird's B EH R D Z
+bairnco B EH R N K OW
+baisch B AY SH
+baisden B EY S D AH N
+baise B EY Z
+baisley B EY Z L IY
+bait B EY T
+baited B EY T IH D
+baiting B EY T IH NG
+baits B EY T S
+baity B EY T IY
+baiul B AY UW L
+baiul's B AY UW L Z
+baize B EY Z
+baja B AA HH AA
+bajarin B AE JH ER IH N
+bajema B AA Y EY M AH
+bajorek B AE JH ER EH K
+bak B AE K
+baka B AA K AH
+bakalar B AE K AH L ER
+bake B EY K
+bake-off B EY K AO F
+bake-offs B EY K AO F S
+baked B EY K T
+bakelman B EY K AH L M AH N
+bakeman B EY K M AH N
+baker B EY K ER
+baker's B EY K ER Z
+bakeries B EY K ER IY Z
+bakers B EY K ER Z
+bakersfield B EY K ER Z F IY L D
+bakery B EY K ER IY
+bakes B EY K S
+bakeware B EY K W EH R
+bakewell B EY K W EH L
+bakey B EY K IY
+bakey's B EY K IY Z
+baking B EY K IH NG
+bakke B AE K
+bakken B AE K AH N
+bakker B AE K ER
+bakker's B AE K ER Z
+bakker's(2) B EY K ER Z
+bakker(2) B EY K ER
+bakkers B AE K ER Z
+bakkers(2) B EY K ER Z
+bakley B AE K L IY
+bakos B AA K OW Z
+bakowski B AH K AO F S K IY
+bakrewali B AE K R AH W AA L IY
+bakrie B AE K R AY
+bakshi B AE K SH IY
+bakst B AE K S T
+baku B AA K UW
+bakula B AH K UW L AH
+bal B AE L
+bala B AA L AH
+balaban B AA L AA B AA N
+balaguer B AE L AH G ER
+balakumar B AA L AH K UW M AA R
+balan B EY L AH N
+balance B AE L AH N S
+balanced B AE L AH N S T
+balancer B AE L AH N S ER
+balances B AE L AH N S AH Z
+balances(2) B AE L AH N S IH Z
+balanchine B AE L AH N CH IY N
+balanchine's B AE L AH N CH IY N Z
+balancing B AE L AH N S IH NG
+balart B AE L AA R T
+balas B AE L AH S
+balash B AE L AH SH
+balata B AE L AH T AH
+balazs B AO L AH SH
+balbach B AE L B AA K
+balbi B AE L B IY
+balbina B AA L B IY N AH
+balbo B AE L B OW
+balboa B AA L B OW AH
+balboni B AA L B OW N IY
+balbriggan B AE L B R IH G AH N
+balbriggans B AE L B R IH G AH N Z
+balcer B EY L S ER
+balcerowicz B AE L S EH R AH W IH T S
+balcerzak B AH L CH ER Z AH K
+balch B AE L CH
+balchunas B AE L K UW N AH Z
+balcom B AE L K AH M
+balconies B AE L K AH N IY Z
+balcony B AE L K AH N IY
+balcor B AE L K AO R
+bald B AO L D
+baldassare B AA L D AA S AA R IY
+baldassari B AA L D AA S AA R IY
+baldassarre B AO L D AH S AA R IY
+baldauf B AE L D AW F
+baldelli B AA L D EH L IY
+baldemar B AA L D EY M AA R
+balder B AO L D ER
+balderas B AE L D ER AH Z
+balderdash B AO L D ER D AE SH
+balderrama B AA L D EH R AA M AH
+balderson B AE L D ER S AH N
+balderston B AE L D ER S T AH N
+baldev B AA L D EH V
+baldez B AA L D EH Z
+baldi B AA L D IY
+balding B AO L D IH NG
+baldinger B AO L D IH NG ER
+baldini B AA L D IY N IY
+baldini's B AA L D IY N IY Z
+baldino B AA L D IY N OW
+baldly B AO L D L IY
+baldner B AE L D N ER
+baldness B AO L D N AH S
+baldo B AA L D OW
+baldock B AE L D AH K
+baldonado B AA L D OW N AA D OW
+baldoni B AA L D OW N IY
+baldor B AO L D ER
+baldree B AH L D R IY
+baldric B AE L D R IH K
+baldridge B AE L D R IH JH
+baldrige B AO L D R IH JH
+baldry B AO L D R IY
+balducci B AA L D UW CH IY
+baldur B AA L D UH R
+baldus B AA L D IH S
+baldwin B AO L D W AH N
+baldwin's B AO L D W AH N Z
+baldwin(2) B AO L D W IH N
+baldyga B AA L D IY G AH
+bale B EY L
+baleen B AH L IY N
+baleful B EY L F AH L
+balentine B AA L EH N T IY N IY
+baler B EY L ER
+bales B EY L Z
+balestra B AH L EH S T R AH
+balestrieri B AA L EH S T R IH R IY
+baley B EY L IY
+balfanz B AA L F AA N Z
+balfe B EY L F
+balfour B AE L F AO R
+bali B AA L IY
+balian B EY L IY AH N
+balicki B AH L IH K IY
+balik B AA L IH K
+balilan B AH L IH L AH N
+baliles B AH L IY L EH Z
+balin B AE L IH N
+balinese B AE L IH N IY Z
+baling B EY L IH NG
+balinski B AH L IH N S K IY
+balint B AA L IY N T
+balis B AA L IY Z
+balistreri B AA L IY S T R EH R IY
+balk B AO K
+balk(2) B AA L K
+balkan B AO L K AH N
+balkanization B AO L K AH N IH Z EY SH AH N
+balkanize B AO L K AH N AY Z
+balkanized B AO L K AH N AY Z D
+balkans B AO L K AH N Z
+balkcom B AE L K AH M
+balke B EY L K
+balked B AO K T
+balkin B AE L K IH N
+balking B AO K IH NG
+balko B AE L K OW
+balks B AO K S
+balky B AO K IY
+ball B AO L
+ball's B AO L Z
+balla B AE L AH
+ballad B AE L AH D
+ballade B AH L AA D
+ballads B AE L AH D Z
+balladur B AE L AH D ER
+balladur's B AE L AH D ER Z
+ballance B AA L AH N S
+ballantine B AE L AH N T AY N
+ballantrae B AE L AH N T R EY
+ballantyne B AH L AE N T AY N
+ballard B AE L ER D
+ballard's B AE L ER D Z
+ballas B AE L AH Z
+ballast B AE L AH S T
+ballasts B AE L AH S T S
+ballasts(2) B AE L AH S
+ballclub B AO L K L AH B
+ballcock B AO L K AA K
+ballcocks B AO L K AA K S
+balle B EY L
+balled B AO L D
+ballengee B AH L EH NG G IY
+ballenger B AE L IH N JH ER
+ballentine B AA L EH N T IY N IY
+baller B AO L ER
+ballerina B AE L ER IY N AH
+ballerinas B AE L ER IY N AH Z
+balles B EY L Z
+ballester B AE L IH S T ER
+ballesteros B AE L IH S T ER OW Z
+ballesteros(2) B AH L EH S T ER OW S
+ballet B AE L EY
+ballet's B AE L EY Z
+ballets B AE L EY Z
+balletto B AE L EH T OW
+ballew B AE L UW
+ballgame B AO L G EY M
+balli B AE L IY
+balliet B AE L IY IH T
+balliett B AE L IY T
+ballin B AE L IH N
+balling B AO L IH NG
+ballinger B AO L IH N JH ER
+ballistic B AH L IH S T IH K
+ballistics B AH L IH S T IH K S
+balliwick B AE L AH W IH K
+ballman B AO L M AH N
+ballmer B AE L M ER
+ballo B AE L OW
+ballon B AE L AH N
+balloon B AH L UW N
+ballooned B AH L UW N D
+ballooning B AH L UW N IH NG
+balloonist B AH L UW N IH S T
+balloonists B AH L UW N IH S T S
+balloons B AH L UW N Z
+ballor B AO L ER
+ballot B AE L AH T
+balloting B AE L AH T IH NG
+ballots B AE L AH T S
+ballou B AH L UW
+ballow B AE L OW
+ballowe B AE L AW
+ballpark B AO L P AA R K
+ballparks B AO L P AA R K S
+ballplayer B AO L P L EY ER
+ballplayers B AO L P L EY ER Z
+ballpoint B AO L P OY N T
+ballpoints B AO L P OY N T S
+ballroom B AO L R UW M
+ballrooms B AO L R UW M Z
+balls B AO L Z
+ballweg B AE L W IH G
+ballwig B AA L W IH G
+ballwig's B AA L W IH G Z
+bally B AE L IY
+bally's B AE L IY Z
+bally's(2) B EY L IY Z
+bally(2) B EY L IY
+ballyhoo B AE L IY HH UW
+ballyhooed B AE L IY HH UW D
+balm B AA M
+balm(2) B AA L M
+balmer B AA M ER
+balmes B AA L M EH S
+balmoral B AE L M AO R AH L
+balmorals B AE L M AO R AH L Z
+balms B AA M Z
+balms(2) B AA L M Z
+balmy B AA M IY
+balodia B AH L OW D IY AH
+balog B AE L AO G
+baloga B AA L OW G AH
+balogh B AE L OW
+balon B AA L AO N
+baloney B AH L OW N IY
+balow B AE L OW
+balsa B AO L S AH
+balsam B AO L S AH M
+balsamo B AA L S AA M OW
+balsbaugh B AO L Z B AO
+balser B EY L S ER
+balsiger B AE L S IH G ER
+balsley B AE L S L IY
+balster B AE L S T ER
+balt's B AO L T S
+baltazar B AA L T AA Z AA R
+balter B AO L T ER
+baltes B EY L T S
+balthasar B AE L TH AH S ER
+balthaser B AE L TH AH S ER
+balthazar B AE L TH AH Z ER
+balthazor B AA L TH AA Z AO R
+balthrop B AE L TH R AH P
+baltic B AO L T IH K
+baltica B AE L T IH K AH
+baltics B AO L T IH K S
+baltierra B AA L T IH R AH
+baltimore B AO L T AH M AO R
+baltimore's B AO L T AH M AO R Z
+balto B AA L T OW
+baltodano B AO L T OW D AA N OW
+baltsa B AO L T S AH
+baltz B AE L T S
+baltzell B AE L T Z AH L
+baltzer B AE L T Z ER
+baluchi B AH L UW CH IY
+baluja B AH L UW JH AH
+balukas B AH L UW K AH Z
+balyeat B AE L IY AE T
+balz B AO L Z
+balzano B AA L Z AA N OW
+balzarini B AA L Z AA R IY N IY
+balzer B EY L Z ER
+bam B AE M
+bamako B AE M AH K OW
+bamba B AE M B AH
+bambach B AE M B AA K
+bambenek B AE M B EH N EH K
+bamber B AE M B ER
+bamberg B AE M B ER G
+bamberger B AE M B ER G ER
+bambi B AE M B IY
+bambino B AE M B IY N OW
+bambinos B AE M B IY N OW Z
+bamboo B AE M B UW
+bambrick B AE M B R IH K
+bamburg B AE M B ER G
+bame B EY M
+bamford B AE M F ER D
+bamut B AE M AH T
+ban B AE N
+ban's B AE N Z
+banacci B AH N AA CH IY
+banach B AE N AH K
+banal B AH N AA L
+banalities B AH N AE L IH T IY Z
+banality B AH N AE L IH T IY
+banamex B AE N AH M EH K S
+banana B AH N AE N AH
+bananas B AH N AE N AH Z
+banas B AE N AH Z
+banasiak B AH N AA S IY AE K
+banaszak B AH N AA SH AH K
+banbury B AE N B EH R IY
+banc B AE NG K
+banca B AE NG K AH
+banca(2) B AA NG K AH
+bancaire B AE N K EH R
+bancario B AE N K EH R IY OW
+banco B AE NG K OW
+bancoklahoma B AE NG K AA K L AH HH OW M AH
+bancomer B AE NG K AH M ER
+bancor B AE N K AO R
+bancorp B AE NG K AO R P
+bancorp's B AE NG K AO R P S
+bancorp's(2) B AE N K AO R P S
+bancorp(2) B AE N K AO R P
+bancorporation B AE N K AO R P ER EY SH AH N
+bancroft B AE NG K R AO F T
+bancroft's B AE N K R AO F T S
+bancserve B AE N K S ER V
+bancshares B AE NG K SH EH R Z
+bancshares' B AE NG K SH EH R Z
+banctec B AE NG K T EH K
+banctexas B AE NG K T EH K S AH S
+band B AE N D
+band's B AE N D Z
+banda B AE N D AH
+bandag B AE N D AE G
+bandage B AE N D IH JH
+bandaged B AE N D AH JH D
+bandages B AE N D AH JH AH Z
+bandages(2) B AE N D IH JH IH Z
+bandai B AE N D AY
+bandaid B AE N D EY D
+bandana B AE N D AE N AH
+bandanas B AE N D AE N AH Z
+bandar B AE N D AA R
+banded B AE N D IH D
+bandel B AE N D AH L
+bandemer B AE N D IY M ER
+bander B AE N D ER
+banderas B AE N D ER AH S
+banderas(2) B AA N D ER AH S
+bandicoot B AE N D IH K UW T
+bandicoot(2) B AE N D IY K UW T
+bandicoots B AE N D IH K UW T S
+bandicoots(2) B AE N D IY K UW T S
+bandied B AE N D IY D
+banding B AE N D IH NG
+bandit B AE N D AH T
+banditry B AE N D AH T R IY
+bandits B AE N D AH T S
+bandleader B AE N D L IY D ER
+bandleaders B AE N D L IY D ER Z
+bandolier B AE N D AH L IH R
+bandoliers B AE N D AH L IH R Z
+bandow B AE N D AW
+bandow's B AE N D AW Z
+bands B AE N D Z
+bandshell B AE N D SH EH L
+bandstand B AE N D S T AE N D
+bandt B AE N T
+banducci B AA N D UW CH IY
+bandwagon B AE N D W AE G AH N
+bandwidth B AE N D W IH D TH
+bandy B AE N D IY
+bane B EY N
+banegas B AE N IH G AH Z
+banerjee B AH N ER JH IY
+banes B EY N Z
+banesto B AH N EH S T OW
+banesto's B AH N EH S T OW Z
+banet B AE N IH T
+baney B EY N IY
+banff B AE N F
+banfield B AE N F IY L D
+banford B AE N F ER D
+bang B AE NG
+bangala B AA N G AA L AH
+bangalor B AE NG G AH L AO R
+bangalore B AE NG G AH L AO R
+bangalore's B AE NG G AH L AO R Z
+bange B AE N JH
+banged B AE NG D
+bangee B AE N JH IY
+bangemann B AE NG G AH M AH N
+banger B AE NG ER
+bangers B AE NG ER Z
+bangert B EY NG G ER T
+bangerter B EY NG G ER T ER
+banghart B AE NG HH AA R T
+banging B AE NG IH NG
+bangish B AE NG IH SH
+bangkok B AE NG K AA K
+bangkok's B AE NG K AA K S
+bangladesh B AE NG L AH D EH SH
+bangladesh's B AE NG L AH D EH SH IH Z
+bangladeshi B AE NG L AH D EH SH IY
+bangladeshi's B AE NG L AH D EH SH IY Z
+bangladeshis B AE NG L AH D EH SH IY Z
+bangle B AE NG G AH L
+bangles B AE NG G AH L Z
+bango B AA NG G OW
+bangor B AE NG G ER
+bangor(2) B AE NG G AO R
+bangs B AE NG Z
+banh B AE N
+bania B AA N IY AH
+banick B AE N IH K
+banik B AE N IH K
+banis B AE N IH S
+banish B AE N IH SH
+banished B AE N IH SH T
+banishing B AE N IH SH IH NG
+banishment B AE N IH SH M AH N T
+banister B AE N IH S T ER
+banja B AA N Y AH
+banjo B AE N JH OW
+bank B AE NG K
+bank's B AE NG K S
+bankable B AE NG K AH B AH L
+bankamerica B AE NG K AH M EH R IH K AH
+bankamerica's B AE NG K AH M EH R IH K AH Z
+bankatlantic B AE NG K AH T L AE N T IH K
+bankcard B AE NG K AA R D
+bankcards B AE NG K AA R D Z
+bankcorp B AE NG K AO R P
+banke B AE NG K
+bankeast B AE NG K IY S T
+banked B AE NG K T
+banken B AE NG K AH N
+banker B AE NG K ER
+banker's B AE NG K ER Z
+bankers B AE NG K ER Z
+bankers' B AE NG K ER Z
+bankert B AE NG K ER T
+bankes B AE NG K S
+bankey B AE N K IY
+bankhead B AE NG K HH EH D
+bankholding B AE NG K HH OW L D IH NG
+banking B AE NG K IH NG
+banking's B AE NG K IH NG Z
+banknote B AE NG K N OW T
+banknotes B AE NG K N OW T S
+banko B AE NG K OW
+bankowski B AH NG K AO F S K IY
+bankroll B AE NG K R OW L
+bankrolled B AE NG K R OW L D
+bankrolling B AE NG K R OW L IH NG
+bankrolls B AE NG K R OW L Z
+bankrupcty B AE NG K R AH P T S IY
+bankrupt B AE NG K R AH P T
+bankruptcies B AE NG K R AH P T S IY Z
+bankruptcy B AE NG K R AH P S IY
+bankruptcy's B AE NG K R AH P S IY Z
+bankruptcy(2) B AE NG K R AH P T S IY
+bankrupted B AE NG K R AH P T IH D
+bankrupting B AE NG K R AH P T IH NG
+banks B AE NG K S
+banks' B AE NG K S
+banks's B AE NG K S IH Z
+bankshare B AE NG K SH EH R
+bankshares B AE NG K SH EH R Z
+bankson B AE NG K S AH N
+bankston B AE NG K S T AH N
+bankverein B AE NG K V ER AY N
+bankvermont B AE NG K V ER M AA N T
+bankworcester B AE NG K W ER CH EH S T ER
+bankworcester(2) B AE NG K W UW S T ER
+bann B AE N
+bannan B AE N AH N
+banned B AE N D
+banner B AE N ER
+banner's B AE N ER Z
+bannerman B AE N ER M AH N
+banners B AE N ER Z
+bannick B AE N IH K
+banning B AE N IH NG
+bannings B AE N IH NG Z
+bannister B AE N AH S T ER
+bannister(2) B AE N IH S T ER
+bannon B AE N AH N
+banos B AA N OW Z
+banoun B AH N UW N
+banpais B AE N P EY
+banponce B AE N P AA N S
+banque B AE NG K
+banquet B AE NG K W AH T
+banquets B AE NG K W AH T S
+banquo's B AE NG K W OW Z
+bans B AE N Z
+bansal B AA N S AA L
+banshee B AE N SH IY
+banta B AE N T AH
+bantam B AE N T AH M
+bantam's B AE N T AH M Z
+bantams B AE N T AH M Z
+banter B AE N T ER
+bantered B AE N T ER D
+bantering B AE N T ER IH NG
+bantle B AE N T AH L
+banton B AE N T AH N
+bantu B AE N T UW
+bantz B AE N T S
+banuelos B AA N W EH L OW Z
+banville B AA N V IH L
+banwart B AE N W AO R T
+banxquote B AE NG K S K W OW T
+banya B AA N Y AH
+banya(2) B AE N Y AH
+banyaluca B AE N Y AH L UW K AH
+banyan B AE N Y AH N
+banyas B AA N Y AH Z
+banyas(2) B AE N Y AH Z
+banyu B AA N Y UW
+banzhaf B AE N Z HH AH F
+bao B AW
+baoguang B AA AO G W AE NG
+bapley B AE P L IY
+bapna B AA P N AH
+baptism B AE P T IH Z AH M
+baptismal B AE P T IH Z M AH L
+baptisms B AE P T IH Z AH M Z
+baptist B AE P T AH S T
+baptist(2) B AE P T IH S T
+baptista B AE P T IH S T AH
+baptiste B AH P T IH S T
+baptistery B AE P T AH S T R IY
+baptists B AE P T AH S T S
+baptists(2) B AE P T AH S
+baptize B AE P T AY Z
+baptized B AE P T AY Z D
+bar B AA R
+bar's B AA R Z
+bar-mitzvah B AA R M IH T S V AH
+bara B AA R AH
+barabar B EH R AH B AA R
+barach B AH R AA K
+barach(2) B ER AA K
+baraff B AA R AA F
+baragi B AH R AA G IY
+barahona B AE R AH HH OW N AH
+barajas B AA R AA Y AA Z
+barak B AA R AH K
+barakat B AA R AH K AA T
+baram B EH R AE M
+baran B AA R AA N
+baranek B AE R AH N IH K
+baranoski B ER AH N AW S K IY
+baranowski B ER AH N AO F S K IY
+baranski B ER AE N S K IY
+barany B ER AO N IY
+barasch B AE R AH SH
+barash B AE R AH SH
+barath B AE R AH TH
+baratta B AA R AA T AH
+barb B AA R B
+barb's B AA R B Z
+barba B AA R B AH
+barbados B AA R B EY D OW S
+barbagallo B AA R B AH G AE L OW
+barbakow B AA R B AH K AW
+barbanel B AA R B AH N AH L
+barbano B AA R B AA N OW
+barbara B AA R B ER AH
+barbara's B AA R B ER AH Z
+barbara(2) B AA R B R AH
+barbaree B AA R B ER IY
+barbarian B AA R B EH R IY AH N
+barbarians B AA R B EH R IY AH N Z
+barbaric B AA R B AE R IH K
+barbaric(2) B AA R B EH R IH K
+barbarino B AA R B AA R IY N OW
+barbarism B AA R B ER IH Z AH M
+barbarity B AA R B AE R AH T IY
+barbarity(2) B AA R B EH R AH T IY
+barbaro B AA R B AA R OW
+barbarous B AA R B ER AH S
+barbary B AA R B ER IY
+barbash B AA R B AE SH
+barbato B AA R B AA T OW
+barbe B AA R B
+barbeau B AA R B OW
+barbecue B AA R B IH K Y UW
+barbecue's B AA R B IH K Y UW Z
+barbecued B AA R B IH K Y UW D
+barbecueing B AA R B IH K Y UW IH NG
+barbecues B AA R B IH K Y UW Z
+barbed B AA R B D
+barbed-wire B AA R B D W AY R
+barbee B AA R B IY
+barbell B AA R B EH L
+barbella B AA R B EH L AH
+barbells B AA R B EH L Z
+barbels B AA R B AH L Z
+barbeque B AA R B IH K Y UW
+barbequed B AA R B IH K Y UW D
+barbequeing B AA R B IH K Y UW IH NG
+barbeques B AA R B IH K Y UW Z
+barber B AA R B ER
+barber's B AA R B ER Z
+barbera B AA R B EH R AH
+barberi B AA R B EH R IY
+barberio B AA R B IY R IY OW
+barberis B AA R B ER IH S
+barbero B AA R B EH R OW
+barbers B AA R B ER Z
+barbershop B AA R B ER SH AA P
+barbette B AA R B EH T
+barbian B AA R B IY AH N
+barbie B AA R B IY
+barbie's B AA R B IY Z
+barbier B AA R B IY ER
+barbieri B AA R B IH R IY
+barbieri's B AA R B IH R IY Z
+barbies B AA R B IY Z
+barbin B AA R B IH N
+barbiturate B AA R B IH CH ER AH T
+barbiturates B AA R B IH CH ER AH T S
+barbo B AA R B OW
+barbone B AA R B OW N
+barbosa B AA R B OW S AH
+barbour B AA R B ER
+barbour's B AA R B ER Z
+barboursville B AA B ER Z V IH L
+barboza B AA R B OW Z AH
+barbra B AA R B R AH
+barbre B AA R B ER
+barbs B AA R B Z
+barbuda B AA R B UW D AH
+barby B AA R B IY
+barca B AA R K AH
+barcella B AA R S EH L AH
+barcellos B AA R S EH L OW Z
+barcelo B AA R CH EH L OW
+barcelona B AA R S IH L OW N AH
+barcenas B AA R S IH N AH Z
+barch B AA R K
+barchefsky B AA CH EH F S K IY
+barcia B AA R CH AH
+barclay B AA R K L EY
+barclay's B AA R K L IY Z
+barclay's(2) B AA R K L EY Z
+barclay(2) B AA R K L IY
+barclays B AA R K L IY Z
+barclays' B AA R K L IY Z
+barclays'(2) B AA R K L EY Z
+barclays's B AA R K L IY Z IH Z
+barclays's(2) B AA R K L EY Z IH Z
+barclays(2) B AA R K L EY Z
+barclift B AA R K L IH F T
+barco B AA R K OW
+barco's B AA R K OW Z
+barcomb B AA R K AH M
+barcroft B AA R K R AO F T
+barcus B AA R K AH S
+barczak B AA R CH AE K
+bard B AA R D
+bard's B AA R D Z
+bardell B AA R D EH L
+barden B AA R D AH N
+bardera B AA R D EH R AH
+bardin B AA R D IH N
+bardo B AA R D OW
+bardolf B AA R D OW L F
+bardolph B AA R D AA L F
+bardon B AA R D AO N
+bardrick B AA R D R IH K
+bardsley B AA R D S L IY
+bardulf B AA R D AH L F
+bardulph B AA R D AH L F
+bardwell B AA R D W EH L
+bare B EH R
+bared B EH R D
+barefield B AE R IH F IY L D
+barefield(2) B AE R F IY L D
+barefoot B EH R F UH T
+bareis B AE R AY Z
+barela B AA R EH L AH
+barely B EH R L IY
+barenboim B EH R AH N B OY M
+barenboim's B EH R AH N B OY M Z
+barens B EH R AH N Z
+barentine B AA R EH N T IY N IY
+barentine(2) B EH R AH N T IY N
+barentine(3) B EH R AH N T AY N
+barents B EH R AH N T S
+bares B EH R Z
+barest B EH R AH S T
+barey B EH R IY
+barfield B AA R F IY L D
+barfknecht B AA R F K AH N EH K T
+barfknecht(2) B AA R F N EH K T
+barfoot B AA R F UH T
+barfuss B AA R F AH S
+barg B AA R G
+barga B AA R G AH
+bargain B AA R G AH N
+bargain(2) B AA R G IH N
+bargained B AA R G AH N D
+bargainer B AA R G IH N ER
+bargainers B AA R G IH N ER Z
+bargaining B AA R G IH N IH NG
+bargains B AA R G AH N Z
+bargains(2) B AA R G IH N Z
+barganier B AA R G AH N IY ER
+bargar B AA R G AA R
+bargas B AA R G AH Z
+barge B AA R JH
+barged B AA R JH D
+barger B AA R JH ER
+bargeron B AA R G ER AH N
+barges B AA R JH AH Z
+barges(2) B AA R JH IH Z
+barging B AA R JH IH NG
+bargman B AA R G M AH N
+bargmann B AA R G M AH N
+bargo B AA R G OW
+barham B AA R HH AH M
+barhorst B AA R HH AO R S T
+bari B AA R IY
+bari's B AA R IY Z
+baribeau B AE R IH B OW
+barich B AE R IH K
+baril B EH R AH L
+barile B AA R AH L
+barillari B EH R IH L EH R IY
+barillari's B EH R IH L EH R IY Z
+barillo B ER IH L OW
+barinco B ER IH NG K OW
+baring B EH R IH NG
+baring's B EH R IH NG Z
+baringer B EH R IH NG ER
+barings B EH R IH NG Z
+barings' B EH R IH NG Z
+baris B AA R IY Z
+barish B EH R IH SH
+barite B EH R AY T
+barites B EH R AY T S
+baritone B EH R AH T OW N
+baritones B EH R AH T OW N Z
+barium B EH R IY AH M
+bark B AA R K
+barkai B AA R K AY
+barkalow B AA R K AH L OW
+barkan B AA R K AH N
+barkdoll B AA R K D AH L
+barkdull B AA R K D AH L
+barke B AA R K
+barked B AA R K T
+barkeley B AA R K L IY
+barker B AA R K ER
+barkers B AA R K ER Z
+barkes B AA R K S
+barkett B AA R K IH T
+barkey B AA R K IY
+barkhurst B AA R K HH ER S T
+barkin B AA R K IH N
+barking B AA R K IH NG
+barkley B AA R K L IY
+barklow B AA R K L OW
+barkman B AA R K M AH N
+barko B AA R K OW
+barkocy B AA R K AH S IY
+barkow B AA R K OW
+barks B AA R K S
+barksdale B AA R K S D EY L
+barkshire B AA R K SH AY R
+barkus B AA R K AH S
+barlage B AA R L IH JH
+barlett B AA R L IH T
+barletta B AA R L EH T AH
+barlettesville B AA R L AH T S V IH L
+barley B AA R L IY
+barloon B AA R L UW N
+barlow B AA R L OW
+barlowe B AA R L OW
+barman B AA R M AH N
+barmore B AA R M AO R
+barn B AA R N
+barna B AA R N AH
+barnabas B AA R N AH B AH S
+barnaby B AA R N AH B IY
+barnaby's B AA R N AH B IY Z
+barnacle B AA R N AH K AH L
+barnacles B AA R N AH K AH L Z
+barnard B AA R N ER R D
+barnard's B AA R N ER D Z
+barnard(2) B ER N AA R D
+barnard(3) B AA R N AA R D
+barnards B AA R N ER D Z
+barnas B AA R N AH Z
+barndt B AA R N T
+barnell B AA R N AH L
+barner B AA R N ER
+barnes B AA R N Z
+barnet B AA R N IH T
+barnett B AA R N EH T
+barnett's B AA R N EH T S
+barnette B AA R N EH T
+barnevik B AA R N EH V IH K
+barney B AA R N IY
+barney's B AA R N IY Z
+barneys B AA R N IY Z
+barnfield B AA R N F IY L D
+barnhard B AA R N HH AA R D
+barnhardt B AA R N HH AA R T
+barnhart B AA R N HH AA R T
+barnhill B AA R N HH IH L
+barnhouse B AA R N HH AW S
+barnick B AA R N IH K
+barnicle B AA R N IH K AH L
+barnish B AA R N IH SH
+barno B AA R N OW
+barnowski B AA R N AW S K IY
+barns B AA R N Z
+barnstorm B AA R N S T AO R M
+barnstorming B AA R N S T AO R M IH NG
+barnum B AA R N AH M
+barnwell B AA R N W EH L
+barny B AA R N IY
+barnyard B AA R N Y AA R D
+baro B AA R OW
+baroid B ER OY D
+barometer B ER AA M IH T ER
+barometers B ER AA M IH T ER Z
+barometric B AE R AH M EH T R IH K
+baron B AE R AH N
+baron's B AE R AH N Z
+baron's(2) B EH R AH N Z
+baron(2) B EH R AH N
+barone B ER OW N
+barone's B ER OW N Z
+baroness B EH R AH N IH S
+baronet B EH R AH N AH T
+baronet(2) B EH R AH N EH T
+baronets B EH R AH N AH T S
+baronets(2) B EH R AH N EH T S
+baroni B AA R OW N IY
+barons B AE R AH N Z
+barons(2) B EH R AH N Z
+baroody B ER UW D IY
+baroque B ER OW K
+baros B AA R OW Z
+barovic B EH R AH V IH K
+barovsky B ER AA V S K IY
+barr B AA R
+barr's B AA R Z
+barra B AA R AH
+barrack B AE R AH K
+barrack(2) B EH R AH K
+barracks B AE R AH K S
+barracks(2) B EH R AH K S
+barraclough B AE R AH K L AW
+barraco B AA R AA K OW
+barracuda B EH R AH K UW D AH
+barradino B EH R AH D IY N OW
+barragan B EH R AH G AH N
+barrage B ER AA ZH
+barraged B ER AA ZH D
+barrages B ER AA ZH IH Z
+barranco B AA R AA N K OW
+barras B AE R AH Z
+barrasso B AA R AA S OW
+barratt B AE R AH T
+barraza B AA R AA Z AH
+barre B EH R IY
+barre(2) B AA R
+barreca B AA R EH K AH
+barred B AA R D
+barreda B AA R EY D AH
+barreiro B AA R EH R OW
+barrel B AE R AH L
+barrel(2) B EH R AH L
+barreled B AE R AH L D
+barreled(2) B EH R AH L D
+barreling B AE R AH L IH NG
+barreling(2) B EH R AH L IH NG
+barrell B AA R EY L
+barrels B AE R AH L Z
+barrels(2) B EH R AH L Z
+barren B AE R AH N
+barren(2) B EH R AH N
+barrens B AE R AH N Z
+barrentine B AE R AH N T AY N
+barrera B AA R EH R AH
+barreras B AA R EH R AA Z
+barres B AA R Z
+barresi B AA R EH S IY
+barret B AE R IH T
+barreto B AA R EH T OW
+barrett B AE R IH T
+barrett(2) B EH R IH T
+barretta B AA R EH T AH
+barrette B ER EH T
+barretto B AA R EH T OW
+barricada B AA R IH K AA D AH
+barricade B AE R AH K EY D
+barricade(2) B EH R AH K EY D
+barricaded B AE R AH K EY D IH D
+barricaded(2) B EH R AH K EY D IH D
+barricades B AE R AH K EY D Z
+barricades(2) B EH R AH K EY D Z
+barrick B AE R IH K
+barrick's B AE R IH K S
+barrick's(2) B EH R IH K S
+barrick(2) B EH R IH K
+barricklow B AE R IH K L AW
+barrickman B AE R IH K M AH N
+barrie B AE R IY
+barrie(2) B EH R IY
+barrientes B ER IY N T S
+barrientez B AA R IY N T EH Z
+barrientos B AA R IY N T OW Z
+barrier B AE R IY ER
+barrier(2) B EH R IY ER
+barriere B AA R IH R IY
+barriers B AE R IY ER Z
+barriers(2) B EH R IY ER Z
+barriga B AA R IY G AH
+barriger B AE R IH G ER
+barrilleaux B AE R IH L OW
+barrineau B AE R IH N OW
+barring B AA R IH NG
+barringer B AE R IH NG ER
+barrings B AA R IH NG Z
+barrington B AE R IH NG T AH N
+barrington(2) B EH R IH NG T AH N
+barrio B AA R IY OW
+barrios B AA R IY OW Z
+barrios(2) B EH R IY OW Z
+barris B AE R IH S
+barris(2) B EH R IH S
+barrish B AE R IH SH
+barrister B AE R IH S T ER
+barrister(2) B EH R IH S T ER
+barristers B AE R IH S T ER Z
+barristers(2) B EH R IH S T ER Z
+barritt B ER IH T
+barro B AA R OW
+barron B AE R AH N
+barron's B AE R AH N Z
+barron's(2) B EH R AH N Z
+barron(2) B EH R AH N
+barrone B ER OW N
+barroom B AA R R UW M
+barros B AA R OW Z
+barroso B AA R OW S OW
+barrow B AE R OW
+barrow(2) B EH R OW
+barrowman B AE R OW M AH N
+barrowman(2) B EH R OW M AH N
+barrows B AE R OW Z
+barrows(2) B EH R OW Z
+barrs B AA R Z
+barrus B AE R AH S
+barry B AE R IY
+barry's B AE R IY Z
+barry's(2) B EH R IY Z
+barry(2) B EH R IY
+barrymore B AE R IY M AO R
+barrymore(2) B EH R IY M AO R
+bars B AA R Z
+barsamian B AA R S EY M IY AH N
+barsanti B AA R S AA N T IY
+barsch B AA R SH
+barschel B AA R SH AH L
+barsh B AA R SH
+barshefsky B AA R SH EH F S K IY
+barsky B AA R S K IY
+barsness B AA R Z N AH S
+barson B AA R S AH N
+barsotti B AA R S OW T IY
+barstad B AA R S T AH D
+barstow B AA R S T OW
+barszcz B AA R SH CH
+bart B AA R T
+bart's B AA R T S
+barta B AA R T AH
+bartak B AA R T AH K
+bartee B AA R T IY
+bartek B AA R T EH K
+bartel B AA R T AH L
+bartell B AA R T EY L
+bartels B AA R T AH L Z
+bartelson B AA R T IH L S AH N
+bartelt B AA R T IH L T
+barten B AA R T AH N
+bartender B AA R T EH N D ER
+bartenders B AA R T EH N D ER Z
+barter B AA R T ER
+bartered B AA R T ER D
+bartering B AA R T ER IH NG
+barth B AA R TH
+bartha B AA R TH AH
+barthel B AA R TH AH L
+barthelemy B AA R TH EH L AH M IY
+barthelme B AA R TH AH L M
+barthelme's B AA R TH AH L M Z
+barthes B AA R TH S
+barthold B AA R TH OW L D
+bartholdy B AA R TH OW L D IY
+bartholomay B AA R TH AH L AA M EY
+bartholomew B AA R TH AA L AH M Y UW
+bartholow B AA R TH AH L OW
+barthram B AA R TH R AE M
+bartko B AA R T K OW
+bartkowiak B ER T K AW IY AE K
+bartkowski B ER T K AO F S K IY
+bartkus B AA R T K IH S
+bartl B AA R T AH L
+bartle B AA R T AH L
+bartlebaugh B AA R T AH L B AO
+bartles B AA R T AH L Z
+bartleson B AA R T AH L S AH N
+bartlestein B AA R T AH L S T IY N
+bartlestein(2) B AA R T AH L S T AY N
+bartlesville B AA R T AH L Z V IH L
+bartlett B AA R T L IH T
+bartlett's B AA R T L AH T S
+bartley B AA R T L IY
+bartling B AA R T L IH NG
+bartlow B AA R T L OW
+bartman B AA R T M AH N
+bartmess B AA R T M IH S
+bartnick B AA R T N IH K
+bartnicki B ER T N IH T S K IY
+bartnik B AA R T N IH K
+barto B AA R T OW
+bartok B AA R T AH K
+bartol B AA R T AH L
+bartoletti B AA R T OW L EH T IY
+bartoli B AA R T OW L IY
+bartolini B AA R T OW L IY N IY
+bartolo B AA R T OW L OW
+bartolomei B AA R T OW L OW M EY IY
+bartolomeo B AA R T AO L AH M EY OW
+bartolucci B AA R T OW L UW CH IY
+barton B AA R T AH N
+barton's B AA R T AH N Z
+bartone B AA R T OW N IY
+bartoo B AA R CH UW
+bartos B AA R T OW Z
+bartosch B AA R T AO SH
+bartosh B AA R T AH SH
+bartosiewicz B ER T AA S AH V IH CH
+bartosik B ER T OW S IH K
+bartoszek B ER T AA SH EH K
+bartow B AA R T OW
+bartram B AA R T R AE M
+barts B AA R T S
+bartsch B AA R CH
+bartunek B AA R T AH N IH K
+bartus B AA R T AH S
+bartz B AA R T S
+baruch B AA R UW K
+barwick B AA R W IH K
+baryshnikov B ER IH SH N IH K AA V
+baryshnikov's B ER IH SH N IH K AA V Z
+barz B AA R Z
+bas-relief B AA R IY L IY F
+bas-relief(2) B AA S R IY L IY F
+bas-reliefs B AA R IY L IY F S
+bas-reliefs(2) B AA S R IY L IY F S
+basa B AA S AH
+basal B EY S AH L
+basaldua B AA S AA L D UW AH
+basalt B AH S AO L T
+basalts B AH S AO L T S
+basam B AH S AA M
+basara B AH S EH R AH
+basara's B AH S EH R AH Z
+basayev B AE S AA Y EH V
+basayev(2) B AE S AA Y EH F
+bascay B AE S K EY
+basch B AE SH
+basco B AA S K OW
+bascom B AE S K AH M
+basden B AE S D AH N
+base B EY S
+base's B EY S AH Z
+baseball B EY S B AO L
+baseball's B EY S B AO L Z
+baseballs B EY S B AO L Z
+baseboard B EY S B AO R D
+baseboards B EY S B AO R D Z
+based B EY S T
+basehore B AE S IH HH AO R
+basehore(2) B EY S HH AO R
+basel B AA Z AH L
+baseless B EY S L AH S
+baseline B EY S L AY N
+baselines B EY S L AY N Z
+baseman B EY S M AH N
+basement B EY S M AH N T
+basements B EY S M AH N T S
+basenji B AH S EH N JH IY
+baser B EY S ER
+bases B EY S AH Z
+bases(2) B EY S IH Z
+bases(3) B EY S IY Z
+basey B EY S IY
+basford B AE S F ER D
+basgall B AE S G AH L
+bash B AE SH
+basha B AA SH AH
+basham B AE SH AH M
+bashar B AH SH AA R
+bashaw B AH SH AO
+bashed B AE SH T
+basher B AE SH ER
+bashers B AE SH ER Z
+bashes B AE SH IH Z
+bashford B AE SH F ER D
+bashful B AE SH F AH L
+bashing B AE SH IH NG
+bashir B AH SH IH R
+bashor B AE SH ER
+bashore B AE SH ER
+basi B AA S IY
+basi(2) B EY S IY
+basic B EY S IH K
+basic's B EY S IH K S
+basically B EY S IH K L IY
+basich B AA S IH HH
+basics B EY S IH K S
+basie B EY Z IY
+basil B AE Z AH L
+basile B AA S AH L
+basilia B AA S IY L IY AH
+basilica B AH S IH L IH K AH
+basilica(2) B AH Z IH L AH K AH
+basilio B AA S IY L IY OW
+basim B AA S IY M
+basim's B AA S IY M Z
+basin B EY S AH N
+basing B EY S IH NG
+basinger B EY S IH NG ER
+basins B EY S AH N Z
+basinski B AH S IH N S K IY
+basis B EY S AH S
+basis(2) B EY S IH S
+basista B AH S IH S T AH
+basix B EY S IH K S
+bask B AE S K
+basked B AE S K T
+baskerville B AE S K ER V IH L
+basket B AE S K AH T
+basketball B AE S K AH T B AO L
+basketball's B AE S K AH T B AO L Z
+basketballs B AE S K AH T B AO L Z
+basketmaker B AE S K AH T M EY K ER
+basketmaking B AE S K AH T M EY K IH NG
+basketry B AE S K AH T R IY
+baskets B AE S K AH T S
+baskett B AE S K IH T
+baskette B AH S K EH T
+baskin B AE S K IH N
+basking B AE S K IH NG
+baskins B AE S K IH N Z
+basks B AE S K S
+basle B AE S AH L
+basler B EY Z AH L ER
+basner B AE S N ER
+basnett B AE S N IH T
+basnight B AE Z N AY T
+bason B AE S AH N
+basore B AA S AO R IY
+basque B AE S K
+basques B AE S K S
+basquez B AA S K W EH Z
+basra B AA S R AA
+bass B AE S
+bass's B EY S IH Z
+bass's(2) B AE S IH Z
+bass(2) B EY S
+bassa B AE S AH
+bassam B AE S AH M
+basse B AE S
+basses B AE S IH Z
+basses(2) B EY S IH Z
+basset B AE S IH T
+bassett B AE S IH T
+bassette B AH S EH T
+bassetti B AA S EH T IY
+bassford B AE S F ER D
+bassham B AE SH AH M
+bassi B AE S IY
+bassin B AE S IH N
+bassinger B AE S IH N JH ER
+bassir B AH S IH R
+bassir's B AH S IH R Z
+bassist B EY S IH S T
+bassists B EY S IH S T S
+bassler B AE S L ER
+bassman B AE S M AH N
+basso B AE S OW
+bassoon B AH S UW N
+bast B AE S T
+basta B AE S T AH
+bastarache B AA S T AA R EY K
+bastard B AE S T ER D
+bastards B AE S T ER D Z
+baste B EY S T
+basted B EY S T AH D
+bastedo B AA S T EY D OW
+basten B EY S T AH N
+bastian B AE S CH IH N
+bastien B AE S T AH N
+bastille B AE S T IH L
+bastin B AE S T IH N
+basting B EY S T IH NG
+bastion B AE S CH AH N
+bastions B AE S CH AH N Z
+bastogne B AE S T OW N
+bastogne's B AE S T OW N Z
+baston B AE S T AH N
+bastone B AA S T OW N
+bastow B AE S T OW
+bastyr B EY S T IH R
+basu B AA S UW
+basulto B AH S AH L T OW
+basurto B AA S UH R T OW
+baswell B AE S W EH L
+basye B AE S AY
+bat B AE T
+bataan B AH T AA N
+batan B EY T AH N
+batat B AH T AA T
+batavia B AH T EY V IY AH
+batavia(2) B AH T AE V IY AH
+batboy B AE T B OY
+batboys B AE T B OY Z
+batch B AE CH
+batchelder B AE CH EH L D ER
+batcheller B AE CH AH L ER
+batchelor B AE CH AH L ER
+batches B AE CH AH Z
+batches(2) B AE CH IH Z
+batdorf B AE T D AO R F
+bate B EY T
+bated B EY T IH D
+bateman B EY T M AH N
+bates B EY T S
+bates' B EY T S
+bateson B AE T IH S AH N
+bateson(2) B EY T S AH N
+bateson(3) B AE T S AH N
+batesville B EY T S V IH L
+batey B EY T IY
+bath B AE TH
+bathe B EY DH
+bathed B EY DH D
+bather B EY DH ER
+bather(2) B AE DH ER
+bathers B EY DH ER Z
+bathers(2) B AE DH ER Z
+bathes B EY DH Z
+bathgate B AE TH G EY T
+bathing B EY DH IH NG
+bathke B AE TH K
+batholith B AE TH AH L IH TH
+batholiths B AE TH AH L IH TH S
+bathrick B AE TH R IH K
+bathrobe B AE TH R OW B
+bathrobes B AE TH R OW B Z
+bathroom B AE TH R UW M
+bathrooms B AE TH R UW M Z
+bathrooms(2) B AA TH R UW M Z
+baths B AE TH S
+bathsheba B AE TH SH IY B AH
+bathtub B AE TH T AH B
+bathtubs B AE TH T AH B Z
+bathurst B AE TH ER S T
+bathurst's B AE TH ER S T S
+batibot B AE T IH B AA T
+batie B EY T IY
+batignolles B AE T IH N Y OW L AH S
+batik B AH T IY K
+batiks B AE T IH K S
+batiks(2) B AH T IY K S
+batista B AH T IH S T AA
+batista's B AH T IH S T AA Z
+batiste B AH T IH S T AH
+batley B AE T L IY
+batman B AE T M AE N
+batogowski B AE T OW G AW S K IY
+baton B AH T AA N
+baton(2) B AE T AA N
+baton(3) B AE T AH N
+baton-rouge B AE T AH N R UW JH
+baton-rouge's B AE T AH N R UW JH IH Z
+batons B AE T AA N Z
+bator B AA T AO R
+batra B AE T R AH
+batres B EY T ER Z
+bats B AE T S
+batson B AE T S AH N
+batson's B AE T S AH N Z
+batt B AE T
+battaglia B AA T AA G L IY AH
+battaglini B AA T AA G L IY N IY
+battalion B AH T AE L Y AH N
+battalions B AH T AE L Y AH N Z
+batte B AE T
+batted B AE T IH D
+battelle B AH T EH L
+battelle's B AH T EH L Z
+batten B AE T AH N
+battenberg B AE T AH N B ER G
+battenfield B AE T AH N F IY L D
+battening B AE T AH N IH NG
+batter B AE T ER
+battered B AE T ER D
+batterer B AE T ER ER
+batterers B AE T ER ER Z
+batteries B AE T ER IY Z
+battering B AE T ER IH NG
+batterman B AE T ER M AH N
+batters B AE T ER Z
+battersby B AE T ER S B IY
+batterson B AE T ER S AH N
+battery B AE T ER IY
+batterymarch B AH T EH R IY M AA R CH
+battey B AE T IY
+battiato B AA T IY AA T OW
+batticaloa B AE T IH K AH L OW AH
+battin B AE T IH N
+batting B AE T IH NG
+battipaglia B AE T IH P AE G L IY AH
+battis B AE T IH S
+battison B AE T IH S AH N
+battista B AH T IY S T AH
+battiste B AA T IY S T IY
+battisti B AA T IY S T IY
+battistoni B AA T IY S T OW N IY
+battle B AE T AH L
+battle's B AE T AH L Z
+battled B AE T AH L D
+battlefield B AE T AH L F IY L D
+battlefields B AE T AH L F IY L D Z
+battlefront B AE T AH L F R AH N T
+battleground B AE T AH L G R AW N D
+battlegrounds B AE T AH L G R AW N D Z
+battlement B AE T AH L M AH N T
+battlement(2) B AE T AH L M EH N T
+battlements B AE T AH L M AH N T S
+battles B AE T AH L Z
+battleship B AE T AH L SH IH P
+battleships B AE T AH L SH IH P S
+battling B AE T AH L IH NG
+battling(2) B AE T L IH NG
+batton B AE T AH N
+batts B AE T S
+batty B AE T IY
+batuigas B AE CH UW IY G AH S
+batus B AE T AH S
+batus(2) B AO T AH S
+baty B EY T IY
+batz B AE T S
+batzel B AE T Z AH L
+batzer B EY T Z ER
+bauble B AO B AH L
+baubles B AO B AH L Z
+baublitz B AW B L IH T S
+bauch B AO CH
+baucom B OW K AA M
+baucum B OW K AH M
+baucus B AA K AH S
+baucus(2) B AE K AH S
+baud B AO D
+baudendistel B AW D IH N D IH S T AH L
+bauder B AW D ER
+baudoin B OW D W AA EY N
+baudouin B AO D UW IH N
+bauer B AW ER
+bauerle B AW ER AH L
+bauerlein B AW ER L AY N
+bauermeister B AW ER M AY S T ER
+bauernfeind B AW ER N F AY N D
+bauers B AW ER Z
+baugh B AO
+baughan B AO AH N
+baugher B AO ER
+baughman B AO M AH N
+baughn B AO N
+bauguess B AW G IH S
+baugus B AO G AH S
+bauknecht B AW K N IH K T
+bauknight B AO K N AY T
+baum B AO M
+baum(2) B AW M
+bauman B AW M AH N
+baumann B AW M AH N
+baumbach B AW M B AA K
+baumberger B AW M B ER G ER
+baumberger(2) B AA M B ER G ER
+baumeister B AW M AY S T ER
+baumel B AW M AH L
+baumer B AW M ER
+baumert B AW M ER T
+baumgard B AW M G ER D
+baumgard(2) B AA M G ER D
+baumgardner B AW M G AA R D N ER
+baumgardner(2) B AA M G AA R D N ER
+baumgardt B AW M G AA R T
+baumgardt(2) B AA M G AA R T
+baumgarner B AW M G AA R N ER
+baumgarner(2) B AA M G AA R N ER
+baumgart B AW M G AA R T
+baumgart(2) B AA M G AA R T
+baumgarten B AW M G AA R T AH N
+baumgarten(2) B AA M G AA R T AH N
+baumgartner B AW M G AA R T N ER
+baumgartner(2) B AA M G AA R T N ER
+baumhardt B AW M HH AA R T
+baumhardt(2) B AA M HH AA R T
+baumhauer B AA M HH AW ER
+baumhauer(2) B AW M HH AW ER
+baumholder B AA M HH AO L D ER
+baumholder(2) B AW M HH AO L D ER
+baumler B AW M AH L ER
+baumler(2) B AA M AH L ER
+baumler(3) B AA M L ER
+baumstark B AW M S T AA R K
+baumstark(2) B AA M S T AA R K
+baun B AO N
+baur B AO R
+baur(2) B AW ER
+baus B AO Z
+bausch B AW SH
+bauserman B AW S ER M AH N
+bausman B AW S M AH N
+bautch B AW CH
+bautista B AO T IY S T AH
+bautz B AO T S
+bautzer B AW T S ER
+bauwens B AW W AH N Z
+bauxite B AO K S AY T
+bauza B AW Z AH
+bava B AA V AH
+bavadra B AH V AE D R AH
+bavaria B AH V EH R IY AH
+bavaria's B AH V EH R IY AH Z
+bavarian B AH V EH R IY AH N
+bavaro B AA V AA R OW
+baver B EY V ER
+bavis B EY V IH S
+bawd B AO D
+bawden B AO D AH N
+bawdy B AO D IY
+bawer B AO ER
+bawl B AO L
+bawled B AO L D
+bax B AE K S
+baxa B AE K S AH
+baxendale B AE K S AH N D EY L
+baxley B AE K S L IY
+baxt B AE K S T
+baxter B AE K S T ER
+baxter's B AE K S T ER Z
+bay B EY
+bay's B EY Z
+bay-area B EY EH R IY AH
+bayanjou B AY AE N JH UW
+bayar B EY ER
+bayard B EY ER D
+baybank B EY B AE NG K
+baybank's B EY B AE NG K S
+baybanks B EY B AE NG K S
+baydhabo B EY D AA B OW
+baye B EY
+bayed B EY D
+bayer B EY ER
+bayer's B EY ER Z
+bayerische B EY ER IY SH
+bayers B EY ER Z
+bayes B EY Z
+bayh B EY
+baying B EY IH NG
+bayle B EY L
+baylee B EY L IY
+baylen B EY L AH N
+bayles B EY L Z
+bayless B EY L IH S
+bayley B EY L IY
+bayliff B EY L IH F
+bayliner B EY L AY N ER
+baylis B EY L IH S
+bayliss B EY L IH S
+baylon B EY L AA N
+baylor B EY L ER
+bayly B EY L IY
+bayman B EY M AH N
+baynard B EY N ER D
+bayne B EY N
+baynes B EY N Z
+baynham B EY N HH AH M
+bayog B EY AA G
+bayonet B EY AH N EH T
+bayonets B EY AH N EH T S
+bayonne B EY Y OW N
+bayou B AY UW
+bayous B AY UW Z
+bayouth B AY UW TH
+bayreuth B EY R OY TH
+bays B EY Z
+bayse B EY Z
+bayside B EY S AY D
+baysinger B EY S IH N JH ER
+baytown B EY T AW N
+baytree B EY T R IY
+baytree's B EY T R IY Z
+bayuk B EY AH K
+bayul B EY AH L
+bayus B EY AH S
+baywatch B EY W AA CH
+baz B AE Z
+bazaar B AH Z AA R
+bazaars B AH Z AA R Z
+bazan B EY Z AH N
+bazar B AH Z AA R
+baze B EY Z
+bazemore B AA Z M AO R
+bazhan B AE Z AH N
+bazile B AA Z AY L
+bazile(2) B AA Z IY L
+bazinet B AE Z IH N EH T
+bazooka B AH Z UW K AH
+bazookas B AH Z UW K AH Z
+bazzano B AA T S AA N OW
+bazzell B AE Z AH L
+bazzle B AE Z AH L
+bbc B IY B IY S IY
+bbc's B IY B IY S IY S
+bbq B IY B IY K Y UW
+bbq(2) B AA R B IH K Y UW
+be B IY
+bea B IY
+beaber B IY B ER
+beabout B AH B UW T
+beach B IY CH
+beach's B IY CH AH Z
+beacham B AH SH AE M
+beacham(2) B IY CH AH M
+beachball B IY CH B AA L
+beachballs B IY CH B AA L Z
+beachcomber B IY CH K OW M ER
+beachcombers B IY CH K OW M ER Z
+beached B IY CH T
+beachem B IY K IH M
+beacher B IY CH ER
+beaches B IY CH AH Z
+beaches(2) B IY CH IH Z
+beachfront B IY CH F R AA N T
+beachfronts B IY CH F R AA N T S
+beachhead B IY CH HH EH D
+beachheads B IY CH HH EH D Z
+beaching B IY CH IH NG
+beachler B IY K AH L ER
+beachler(2) B IY CH L ER
+beachum B IY CH AH M
+beachy B IY CH IY
+beacom B IY K AH M
+beacon B IY K AH N
+beacons B IY K AH N Z
+bead B IY D
+beaded B IY D IH D
+beadle B IY D AH L
+beadles B IY D AH L Z
+beadling B IY D L IH NG
+beads B IY D Z
+beadwork B IY D W ER K
+beady B IY D IY
+beagan B AH G AE N
+beagen B IY G AH N
+beagle B IY G AH L
+beagle's B IY G AH L Z
+beagles B IY G AH L Z
+beagley B IY G L IY
+beahan B IY HH AH N
+beahm B IY M
+beaird B IH R D
+beak B IY K
+beaker B IY K ER
+beakley B IY K L IY
+beaklike B IY K L AY K
+beakman B IY K M AH N
+beakman's B IY K M AH N Z
+beal B IY L
+beale B IY L
+bealer B IY L ER
+beales B IY L Z
+bealeton B IY L T AH N
+beall B IY L
+beals B IY L Z
+beam B IY M
+beam's B IY M Z
+beaman B IY M AH N
+beamed B IY M D
+beamer B IY M ER
+beaming B IY M IH NG
+beamish B IY M IH SH
+beamon B IY M AH N
+beams B IY M Z
+bean B IY N
+bean's B IY N Z
+beanblossom B IY N B L AH S AH M
+beane B IY N
+beans B IY N Z
+beantown B IY N T AW N
+bear B EH R
+bear's B EH R Z
+beara B EH R AH
+bearable B EH R AH B AH L
+bearably B EH R AH B L IY
+bearce B ER S
+beard B IH R D
+bearded B IH R D AH D
+bearden B IH R D AH N
+beardmore B IH R D M AO R
+beards B IH R D Z
+beardslee B IH R D Z L IY
+beardsley B IH R D Z L IY
+beardstown B IH R D S T AW N
+beare B IH R
+bearer B EH R ER
+bearers B EH R ER Z
+bearfield B ER F IY L D
+bearing B EH R IH NG
+bearings B EH R IH NG Z
+bearish B EH R IH SH
+bearishly B EH R IH SH L IY
+bearishness B EH R IH SH N AH S
+bearman B EH R M AH N
+bears B EH R Z
+bears' B EH R Z
+bearse B ER S
+bearss B ER S
+bearup B EH R AH P
+beary B IH R IY
+beas B IY Z
+beasley B IY Z L IY
+beason B IY Z AH N
+beast B IY S T
+beastie B IY S T IY
+beaston B IY S T AH N
+beasts B IY S T S
+beat B IY T
+beata B IY AE T AH
+beaten B IY T AH N
+beater B IY T ER
+beaters B IY T ER Z
+beatie B IY T IY
+beatified B IY AE T AH F AY D
+beatify B IY AE T AH F AY
+beating B IY T IH NG
+beatings B IY T IH NG Z
+beatle B IY T AH L
+beatles B IY T AH L Z
+beatles' B IY T AH L Z
+beatnik B IY T N IH K
+beatniks B IY T N IH K S
+beato B IY AE T OW
+beaton B IY T AH N
+beatrice B IY AH T R AH S
+beatrice's B IY AH T R IH S IH Z
+beatrice's(2) B IY T R IH S IH Z
+beatrice(2) B IY AH T R IH S
+beatrice(3) B IY T R AH S
+beatrice(4) B IY T R IH S
+beatrix B IY T R IH K S
+beatrix(2) B IY AH T R IH K S
+beats B IY T S
+beatson B IY T S AH N
+beattie B IY T IY
+beatty B IY T IY
+beatty(2) B EY T IY
+beaty B IY T IY
+beau B OW
+beaubien B OW B Y EH N
+beaucage B OW K EY JH
+beauce B OW S
+beauchaine B OW SH EY N
+beauchamp B OW SH AA M P
+beauchemin B OW SH IH M AE N
+beauchene B OW SH EY N
+beauchesne B OW SH EH N
+beaudet B OW D EH T
+beaudette B OW D EH T
+beaudin B OW D AE N
+beaudoin B OW D OY N
+beaudreau B OW D R OW
+beaudry B OW D R IY
+beauford B OW F AO R D
+beaufort B OW F ER T
+beaufrere B OW F R EH R
+beaujolais B OW JH OW L EY
+beaulac B OW L AE K
+beaulieu B OW L Y UH
+beaumier B OW M IY ER
+beaumont B OW M AO N T
+beaupre B OW P R EY
+beauregard B OW R IH G AA R D
+beauregard(2) B AO R IH G AA R D
+beausoleil B OW S AH L EY
+beautician B Y UW T IH SH AH N
+beauties B Y UW T IY Z
+beautiful B Y UW T AH F AH L
+beautifullest B Y UW T AH F AH L AH S T
+beautifullest(2) B Y UW T AH F L AH S T
+beautifully B Y UW T AH F L IY
+beautify B Y UW T IH F AY
+beauty B Y UW T IY
+beauvais B OW V EY
+beaux B OW
+beavan B EH V AH N
+beaven B IY V AH N
+beaver B IY V ER
+beavers B IY V ER Z
+beaverson B IY V ER S AH N
+beaverton B IY V ER T AH N
+beavin B IY V IH N
+beavis B IY V AH S
+beazer B IY Z ER
+beazley B IY Z L IY
+bebb B EH B
+bebber B EH B ER
+bebbits B EH B AH T S
+bebe B IY B IY
+bebe's B IY B IY Z
+bebear B AH B IH R
+bebeau B IH B OW
+bebee B EH B IY
+beber B IY B ER
+bebitch B EH B IH CH
+bebop B IY B AA P
+bebout B IH B UW T
+bec B EH K
+becalm B IH K AA M
+becalmed B IH K AA M D
+became B IH K EY M
+became(2) B IY K EY M
+because B IH K AO Z
+because(2) B IH K AH Z
+because(3) B IH K AA Z
+becca B EH K AH
+becerra B EH CH EH R AH
+becerril B EY S EH R IY L
+bechard B EH K ER D
+becher B EH K ER
+becherer B EH K ER ER
+bechler B EH K L ER
+becht B EH K T
+bechtel B EH K T EH L
+bechtelsville B EH K T EH L Z V IH L
+bechthold B EH K TH OW L D
+bechtle B EH CH T AH L
+bechtol B EH K T AH L
+bechtold B EH K T OW L D
+beck B EH K
+beck's B EH K S
+becka B EH S K AH
+beckel B EH K EH L
+becker B EH K ER
+becker's B EH K ER Z
+beckerman B EH K ER M AH N
+beckers B EH K ER Z
+beckert B EH K ER T
+becket B EH K AH T
+beckett B EH K IH T
+beckford B EH K F AO R D
+beckham B EH K HH AE M
+becki B EH K IY
+beckie B EH K IY
+beckius B EH K IY IH S
+beckler B EH K L ER
+beckles B EH K AH L Z
+beckley B EH K L IY
+becklund B EH K L AH N D
+beckman B EH K M AH N
+beckmann B EH K M AH N
+beckmeyer B EH K M AY ER
+becknell B EH K N EH L
+beckner B EH K N ER
+beckom B EH K AA M
+beckon B EH K AH N
+beckoned B EH K AH N D
+beckoning B EH K AH N IH NG
+beckons B EH K AH N Z
+becks B EH K S
+beckstead B EH K S T EH D
+beckstrand B EH K S T R AE N D
+beckstrom B EH K S T R AA M
+beckum B EH K AH M
+beckwith B EH K W IH TH
+beckwith's B EH K W IH TH S
+beckwitt B EH K W IH T
+beckworth B EH K W ER TH
+beckworth's B EH K W ER TH S
+becky B EH K IY
+becnel B EH K N AH L
+beco B IY K OW
+become B IH K AH M
+becomes B IH K AH M Z
+becoming B IH K AH M IH NG
+becor B EH K AO R
+becor's B EH K AO R Z
+becraft B IY K R AE F T
+becton B EH K T AH N
+becvar B EH K V ER
+bed B EH D
+beda B EY D AH
+bedard B IH D AA R D
+bedbug B EH D B AH G
+bedbugs B EH D B AH G Z
+bedchamber B EH D CH EY M B ER
+bedded B EH D IH D
+bedding B EH D IH NG
+beddingfield B EH D IH NG F IY L D
+beddoe B EH D OW
+beddors B EH D ER Z
+beddow B EH D OW
+bede B IY D
+bedeck B IH D EH K
+bedecked B IH D EH K T
+bedel B IH D EH L
+bedell B EH D AH L
+bedenbaugh B EH D IH N B AW
+bedevil B IH D EH V AH L
+bedeviled B IH D EH V AH L D
+bedfellow B EH D F EH L OW
+bedfellows B EH D F EH L OW Z
+bedford B EH D F ER D
+bedgood B EH D G UH D
+bedient B IY D Y IH N T
+bedinger B EH D IH NG ER
+bedingfield B EH D IH NG F IY L D
+bedke B EH D K IY
+bedlam B EH D L AH M
+bedlington B EH D L IH NG T AH N
+bedminster B EH D M IH N S T ER
+bednar B EH D N ER
+bednarczyk B EH D N ER CH IH K
+bednarek B EH D N AA R EH K
+bednarik B EH D N AA R IH K
+bednarski B EH D N AA R S K IY
+bednarz B EH D N AA R Z
+bedner B EH D N ER
+bednorz B EH D N AO R Z
+bedolla B EH D OW L AH
+bedore B EH D AO R
+bedouin B EH D OW AH N
+bedouin(2) B EH D UW IH N
+bedouin(3) B EH D AH W AH N
+bedouins B EH D OW AH N Z
+bedouins(2) B EH D UW IH N Z
+bedouins(3) B EH D AH W AH N Z
+bedoya B EY D OY AH
+bedpan B EH D P AE N
+bedpans B EH D P AE N Z
+bedraggle B IH D R AE G AH L
+bedraggled B IH D R AE G AH L D
+bedridden B EH D R IH D AH N
+bedrock B EH D R AA K
+bedroom B EH D R UW M
+bedrooms B EH D R UW M Z
+bedrosian B EH D R AA ZH IH N
+bedrosian(2) B AH D R OW Z IY AH N
+beds B EH D Z
+bedsaul B EH D S AO L
+bedside B EH D S AY D
+bedsole B EH D S OW L
+bedspread B EH D S P R EH D
+bedstraw B EH D S T R AO
+bedtime B EH D T AY M
+bedwell B EH D W EH L
+bee B IY
+bee's B IY Z
+beeba's B IY B AH Z
+beebe B IY B IY
+beebe's B IY B IY Z
+beebes B IY B IY Z
+beebower B IY B OW ER
+beebower(2) B IY B AW ER
+beeby B IY B IY
+beech B IY CH
+beecham B IY CH AH M
+beecham's B IY CH AH M Z
+beechcraft B IY CH K R AE F T
+beecher B IY CH ER
+beechler B IY CH L ER
+beechwood B IY CH W UH D
+beechy B IY CH IY
+beeck B IY K
+beecroft B IY K R AO F T
+beede B IY D
+beedie B IY D IY
+beedle B IY D AH L
+beedy B IY D IY
+beef B IY F
+beefeater B IY F IY T ER
+beefed B IY F T
+beeferman B IY F ER M AH N
+beefing B IY F IH NG
+beefs B IY F S
+beefsteak B IY F S T EY K
+beefy B IY F IY
+beeghly B IY G L IY
+beegle B IY G AH L
+beehive B IY HH AY V
+beehler B IY L ER
+beek B IY K
+beekeeper B IY K IY P ER
+beekeepers B IY K IY P ER Z
+beekeeping B IY K IY P IH NG
+beeker B IY K ER
+beekman B IY K M AH N
+beeks B IY K S
+beel B IY L
+beeler B IY L ER
+beem B IY M
+beeman B IY M AH N
+beemer B IY M ER
+been B IH N
+been(2) B AH N
+beene B IY N
+beeney B IY N IY
+beenken B IY NG K AH N
+beens B IH N Z
+beep B IY P
+beeped B IY P T
+beeper B IY P ER
+beepers B IY P ER Z
+beeping B IY P IH NG
+beeps B IY P S
+beer B IH R
+beer's B IY R Z
+beerbower B IH R B OW ER
+beerman B IH R M AH N
+beers B IH R Z
+beers' B IH R Z
+beers's B IH R Z IH Z
+beery B IH R IY
+bees B IY Z
+beese B IY Z
+beesley B IY Z L IY
+beeson B IY Z AH N
+beet B IY T
+beethoven B EY T OW V AH N
+beethoven's B EY T OW V AH N Z
+beethovenian B EY T OW V IY N IY AH N
+beetle B IY T AH L
+beetlejuice B IY T AH L JH UW S
+beetles B IY T AH L Z
+beeton B IY T AH N
+beets B IY T S
+beever B IY V ER
+beevers B IY V ER Z
+beezley B IY Z L IY
+befall B IH F AO L
+befallen B AH F AA L AH N
+befalls B IH F AO L Z
+befalto B AH F AA L T OW
+befell B IH F EH L
+beffa B IH F AA
+befit B IH F IH T
+befits B IH F IH T S
+befitting B IH F IH T IH NG
+before B IH F AO R
+before(2) B IY F AO R
+beforehand B IH F AO R HH AE N D
+befort B EH F ER T
+befriend B IH F R EH N D
+befriended B IH F R EH N D IH D
+befriending B IH F R EH N D IH NG
+befriends B IH F R EH N D Z
+befuddle B IH F AH D AH L
+befuddled B IH F AH D AH L D
+befuddles B IH F AH D AH L Z
+beg B EH G
+begajah B EH G AA JH AH
+begala B EH G AA L AH
+begala's B EH G AA L AH Z
+began B IH G AE N
+began(2) B IY G AE N
+begat B IH G AE T
+begay B EH G EY
+begel B EY G AH L
+begelman B EY G AH L M AH N
+begeman B IY G M AH N
+beger B EH G ER
+beget B IH G EH T
+begets B IH G EH T S
+begetting B IH G EH T IH NG
+begg B EH G
+beggar B EH G ER
+beggars B EH G ER Z
+begged B EH G D
+begging B EH G IH NG
+beggs B EH G Z
+beghin B EH G IH N
+begin B IH G IH N
+begin's B IH G IH N Z
+beginner B IH G IH N ER
+beginner's B IH G IH N ER Z
+beginners B IH G IH N ER Z
+beginning B IH G IH N IH NG
+beginnings B IH G IH N IH NG Z
+begins B IH G IH N Z
+begleiter B EH G L AY T ER
+begleiter's B EH G L AY T ER Z
+begley B EH G L IY
+begnaud B IH G N OW
+begnoche B EH G N OW K IY
+begonia B IH G OW N Y AH
+begonias B IH G OW N Y AH Z
+begot B IY G AO T
+begotten B IY G AO T IH N
+begrudge B IH G R AH JH
+begs B EH G Z
+begue B EY G
+beguelin B EY G AH L IH N
+beguile B IH G AY L
+beguiled B IH G AY L D
+beguiling B IH G AY L IH NG
+begun B IH G AH N
+begun(2) B EY G AH N
+behalf B IH HH AE F
+behan B EH HH AH N
+behar B EH HH ER
+behave B IH HH EY V
+behaved B IH HH EY V D
+behaves B IH HH EY V Z
+behaving B IH HH EY V IH NG
+behavior B IH HH EY V Y ER
+behavioral B IH HH EY V Y ER AH L
+behavioral(2) B IY HH EY V Y ER AH L
+behaviorally B IY HH EY V Y ER AH L IY
+behaviorist B IH HH EY V Y ER IH S T
+behaviorists B IH HH EY V Y ER IH S T S
+behaviorists(2) B IH HH EY V Y ER IH S S
+behaviorists(3) B IH HH EY V Y ER IH S
+behaviors B IH HH EY V Y ER Z
+behead B IH HH EH D
+behead(2) B IY HH EH D
+beheaded B IH HH EH D IH D
+beheading B IH HH EH D IH NG
+beheadings B IH HH EH D IH NG Z
+beheler B EH HH AH L ER
+behemoth B AH HH IY M AH TH
+behemoth(2) B IY HH AH M AH TH
+behemoths B IH HH IY M AH TH S
+behest B IH HH EH S T
+behind B IH HH AY N D
+behinds B IH HH AY N D Z
+behl B EH L
+behle B EH HH AH L
+behler B EH L ER
+behling B EH L IH NG
+behlke B EH L K
+behm B EH M
+behmer B EH M ER
+behn B EH N
+behne B EH N
+behner B EH N ER
+behney B EH N IY
+behning B EH N IH NG
+behnke B EH NG K
+behnken B EH NG K AH N
+behof B IY HH AA F
+behoff B IY HH AA F
+behold B IH HH OW L D
+beholden B IH HH OW L D AH N
+beholder B IY HH OW L D ER
+beholding B IH HH OW L D IH NG
+behoove B IH HH UW V
+behooves B IH HH UW V Z
+behr B EH R
+behrend B EH R EH N D
+behrends B EH R EH N D Z
+behrendt B EH R IH N T
+behrens B EH R AH N Z
+behring B EH R IH NG
+behringer B EH R IH NG ER
+behringwerke B EH R IH NG W ER K
+behrle B EH R AH L
+behrman B EH R M AH N
+behrmann B EH R M AH N
+behrns B EH R N Z
+behunin B EH HH AH N IH N
+behymer B EH HH AY M ER
+beidaihe B AY D EY HH IY
+beidleman B AY D AH L M AH N
+beidler B AY D AH L ER
+beidler(2) B AY D L ER
+beier B AY ER
+beierle B AY ER AH L
+beiersdorf B AY R Z D AO R F
+beige B EY ZH
+beige's B EY ZH AH Z
+beigel B AY G AH L
+beiges B EY ZH AH Z
+beighley B EY G L IY
+beightol B EY T AH L
+beijer B AY R
+beijing B EY ZH IH NG
+beijing's B EY ZH IH NG Z
+beil B IY L
+beilenson B AY L AH N S AH N
+beiler B AY L ER
+beilfuss B AY L F AH S
+beilin B EH L IH N
+beilin(2) B EY L IH N
+beilke B IY L K
+beilman B AY L M AH N
+beim B AY M
+bein B IY N
+bein' B IY IH N
+beine B IY N
+being B IY IH NG
+being's B IY IH NG Z
+beings B IY IH NG Z
+beiny B AY N IY
+beira B EY R AH
+beirne B IH R N
+beirut B EY R UW T
+beirut's B EY R UW T S
+beisel B AY S AH L
+beiser B AY S ER
+beisner B AY S N ER
+beissel B AY S AH L
+beiswenger B AY S W IH N JH ER
+beit B EY T
+beit(2) B AY T
+beitel B AY T AH L
+beiter B AY T ER
+beitler B AY T AH L ER
+beitler(2) B AY T L ER
+beitz B IY T S
+beitzel B AY T Z AH L
+bejar B EY Y AA R
+bejarano B EY Y AA R AA N OW
+bekaa B EH K AA
+bekaa(2) B AH K AA
+bekaert B AH K EH R T
+beker B EH K ER
+beker's B EH K ER Z
+bekins B IY K IH N Z
+bekker B EH K ER
+bekki B EH K IY
+bel B EH L
+bel'c B EH L K
+bela B EH L AH
+belabor B IH L EY B ER
+belabored B IH L EY B ER D
+belabores B IH L EY B ER Z
+belaboring B IH L EY B ER IH NG
+belabors B IH L EY B ER Z
+beladur B EH L AH D UH R
+beladur's B EH L AH D UH R Z
+belafonte B EH L AH F AA N T IY
+belair B IH L EH R
+belair(2) B EH L EH R
+belaire B AH L EH R
+belak B EH L AH K
+beland B EH L AH N D
+belanger B EH L AH NG ER
+belanoff B EH L AH N AO F
+belarus B EH L AA R AH S
+belasco B EH L AA S K OW
+belate B IH L EY T
+belated B IH L EY T IH D
+belatedly B IH L EY T AH D L IY
+belcastro B EH L K AE S T R OW
+belch B EH L CH
+belched B EH L CH T
+belcher B EH L CH ER
+belching B EH L CH IH NG
+belcourt B EH L K AO R T
+belden B EH L D AH N
+beldin B EH L D IH N
+belding B EH L D IH NG
+beldock B EH L D AA K
+beldon B EH L D AH N
+beleaguer B IH L IY G ER
+beleaguered B IH L IY G ER D
+beleaguering B IH L IY G ER IH NG
+belefiville B AH L EH F AH V IH L
+belen B EH L AH N
+belet B EH L AH T
+belew B EH L UW
+belfast B EH L F AE S T
+belfer B EH L F ER
+belfield B EH L F IY L D
+belfiore B EH L F IY AO R IY
+belflower B EH L F L AW ER
+belford B EH L F ER D
+belfry B EH L F R IY
+belgacom B EH L G AH K AA M
+belgacom(2) B EH L JH AH K AA M
+belgard B EH L G AA R D
+belgarde B EH L G AA R D IY
+belge B EH L JH IY
+belger B EH L G ER
+belgian B EH L JH AH N
+belgians B EH L JH AH N Z
+belgique B EH L ZH IY K
+belgique's B EH L JH IY K S
+belgium B EH L JH AH M
+belgium's B EH L JH AH M Z
+belgo B EH L G OW
+belgrade B EH L G R EY D
+belgrade's B EH L G R EY D Z
+belgrade's(2) B EH L G R AA D Z
+belgrade(2) B EH L G R AA D
+belgrave B EH L G R EY V
+beli B EH L IY
+belich B EH L IH K
+belie B IH L AY
+belied B IH L AY D
+belief B IH L IY F
+beliefs B IH L IY F S
+belier B EH L Y ER
+belies B IH L AY Z
+believability B AH L IY V AH B IH L IH T IY
+believable B AH L IY V AH B AH L
+believe B IH L IY V
+believed B IH L IY V D
+believer B AH L IY V ER
+believers B AH L IY V ER Z
+believes B IH L IY V Z
+believing B IH L IY V IH NG
+beligerence B AH L IH JH ER AH N S
+beligerent B AH L IH JH ER AH N T
+belin B EH L IH N
+belinda B AH L IH N D AH
+belinsky B IH L IH N S K IY
+belisle B EH L AY AH L
+belittle B IH L IH T AH L
+belittled B IH L IH T AH L D
+belittles B IH L IH T AH L Z
+belittling B IH L IH T AH L IH NG
+belittling(2) B IH L IH T L IH NG
+belitz B EH L IH T S
+beliveau B EH L IH V OW
+belize B EH L IY Z
+belk B EH L K
+belka B EH L K AH
+belkacem B EH L K AH S AH M
+belke B EH L K
+belkin B EH L K IH N
+belknap B EH L N AE P
+belko B EH L K OW
+bell B EH L
+bell's B EH L Z
+bella B EH L AH
+bellah B EH L AH
+bellamy B EH L AH M IY
+bellanca B EH L AA N K AH
+belland B EH L AH N D
+bellanger B EH L AE NG G ER
+bellante B EH L AA N T IY
+bellantoni B EH L AA N T OW N IY
+bellar B EH L ER
+bellard B IH L AA R D
+bellas B EH L AH Z
+bellavance B EH L AA V AH N S
+bellavia B EH L AA V IY AH
+bellavista B EH L AH V IH S T AH
+bellcore B EH L K AO R
+bellcore's B EH L K AO R Z
+belle B EH L
+belleau B IH L OW
+bellefeuille B EH L AH F IY UW L
+bellemare B EH L AH M EH R
+beller B EH L ER
+bellerose B EH L ER AH Z
+belles B EH L Z
+belleville B AH L V IH L
+bellevue B EH L V Y UW
+bellew B IH L UW
+bellflower B EH L F L AW ER
+bellflowers B EH L F L AW ER Z
+bellhop B EH L HH AA P
+bellhops B EH L HH AA P S
+belli B EH L IY
+bellicose B EH L AH K OW S
+bellied B EH L IY D
+bellies B EH L IY Z
+belligerence B AH L IH JH ER AH N S
+belligerent B AH L IH JH ER AH N T
+belligerents B AH L IH JH ER AH N T S
+bellin B EH L IH N
+bellina B EH L IY N AH
+belling B EH L IH NG
+bellinger B EH L IH NG ER
+bellingham B EH L IH NG HH AE M
+bellinghausen B EH L IH NG HH AW Z AH N
+bellini B EH L IY N IY
+bellini's B EH L IY N IY Z
+bellino B EH L IY N OW
+bellis B EH L IH S
+bellissimo B EH L IY S IY M OW
+belliveau B EH L IH V OW
+bellizzi B EH L IY T S IY
+bellm B EH L M
+bellman B EH L M AH N
+bellmon B EH L M AH N
+bellmore B EH L M AO R
+bello B EH L OW
+bellomo B EH L OW M OW
+bellomy B EH L AH M IY
+bellon B EH L AH N
+bellone B EH L OW N IY
+bellotti B EH L OW T IY
+bellow B EH L OW
+bellow's B EH L OW Z
+bellowed B EH L OW D
+bellowing B EH L OW IH NG
+bellows B EH L OW Z
+bellrose B EH L R OW Z
+bells B EH L Z
+bells' B EH L Z
+bellsouth B EH L S AW TH
+bellsouth's B EH L S AW TH S
+bellucci B EH L UW CH IY
+bellum B EH L AH M
+belluomini B EH L W OW M IY N IY
+bellville B EH L V IH L
+bellwether B EH L W EH DH ER
+bellwethers B EH L W EH DH ER Z
+bellwood B EH L W UH D
+belly B EH L IY
+bellyache B EH L IY EY K
+belman B EH L M AH N
+belmont B EH L M AA N T
+belmonte B EH L M AA N T IY
+belmore B EH L M AO R
+belnap B EH L N AE P
+belnick B EH L N IH K
+belo B EH L OW
+beloff B EH L AO F
+beloit B IH L OY T
+belong B IH L AO NG
+belonged B IH L AO NG D
+belongia B EH L OW N JH AH
+belonging B IH L AO NG IH NG
+belongings B IH L AO NG IH NG Z
+belongs B IH L AO NG Z
+belote B EH L OW T IY
+belous B EH L AH S
+belov B EH L AA V
+belove B IH L AH V
+beloved B IH L AH V D
+beloved(2) B IH L AH V AH D
+below B IH L OW
+below(2) B IY L OW
+bels B EH L Z
+belser B EH L S ER
+belshaw B EH L SH AO
+belshe B EH L SH
+belsito B EH L S IY T OW
+belsky B EH L S K IY
+belson B EH L S AH N
+belt B EH L T
+belt's B EH L T S
+belted B EH L T AH D
+belted(2) B EH L T IH D
+belter B EH L T ER
+belth B EH L TH
+belting B EH L T IH NG
+belton B EH L T AH N
+beltram B EH L T R AE M
+beltran B EH L T R AH N
+belts B EH L T S
+beltsville B EH L T S V IH L
+beltway B EH L T W EY
+beltz B EH L T S
+belue B EH L Y UW
+beluga B IH L UW G AH
+belushi B EH L UW SH IY
+belva B EY L V AH
+belveal B EH L V AH L
+belvedere B EH L V AH D IH R
+belvedere(2) B EH L V IH D IH R
+belvia B EH L V IY AH
+belvidere B EH L V IH D IH R
+belville B EH L V IH L
+belvin B EH L V IH N
+belvoir B EH L V W AA R
+bely B AH L AY
+belyea B EH L IY AH
+belyeu B EH L IY UW
+belying B IH L AY IH NG
+belz B EH L Z
+belzberg B EH L T S B ER G
+belzbergs B EH L T S B ER G Z
+belzbergs' B EH L Z B ER G Z
+belzer B EH L Z ER
+bem B EH M
+beman B IY M AH N
+bembenek B EH M B IH N AH K
+bembry B EH M B R IY
+bement B IY M AH N T
+bemidji B AH M IH D JH IY
+bemis B IY M AH S
+bemiss B EH M IH S
+bemoan B IH M OW N
+bemoaned B IH M OW N D
+bemoaning B IH M OW N IH NG
+bemoans B IH M OW N Z
+bemuse B IH M Y UW Z
+bemused B IH M Y UW Z D
+bemusement B EH M Y UW S M AH N T
+ben B EH N
+ben's B EH N Z
+bena B EH N AH
+benackova B EH N AH K OW V AH
+benak B EH N AH K
+benami B EH N AH M IY
+benanty B EH N AA N T IY
+benard B IH N AA R D
+benassi B EH N AA S IY
+benasuli B EH N AH S UW L IY
+benatar B EH N AH T ER
+benavente B EH N AA V EH N T IY
+benavides B EY N AA V IY D EH S
+benavidez B EY N AA V IY D EH Z
+benazir B EH N AH Z IH R
+benbow B EH N B OW
+benbrook B EH N B R UH K
+bence B EH N S
+bench B EH N CH
+bencher B EH N CH ER
+benchers B EH N CH ER Z
+benches B EH N CH IH Z
+benchley B EH N CH L IY
+benchmark B EH N CH M AA R K
+benchmark's B EH N CH M AA R K S
+benchmarks B EH N CH M AA R K S
+bencivenga B EH N CH IY V EH NG G AH
+bencomo B EH N K OW M OW
+bencsik B EH NG K S IH K
+bend B EH N D
+benda B EH N D AH
+bendall B EH N D AH L
+bendectin B EH N D EH K T IH N
+bended B EH N D IH D
+bendel B EH N D AH L
+bendel(2) B EH N D EH L
+bendele B EH N D AH L
+bender B EH N D ER
+bender's B EH N D ER Z
+benders B EH N D ER Z
+bendick B EH N D IH K
+bendickson B EH N D IH K S AH N
+bendig B EH N D IH G
+bending B EH N D IH NG
+bendix B EH N D IH K S
+bendixen B IH N D IH K S AH N
+bendler B EH N D L ER
+bendorf B EH N D AO R F
+bends B EH N D Z
+bendt B EH N T
+bendure B EY N D UH R EY
+bene B EH N AH
+beneath B IH N IY TH
+benecke B EH N AH K
+benedek B EH N AH D IH K
+benedetti B EH N AH D EH T IY
+benedetti's B EH N AH D EH T IY Z
+benedetto B IH N AH D EH T OW
+benedick B EH N AH D IH K
+benedict B EH N AH D IH K T
+benedicta B EH N AH D IY K T AH
+benedictine B EH N AH D IH K T IY N
+benedictine's B EH N AH D IH K T IY N Z
+benedictines B EH N AH D IH K T IY N Z
+benediction B EH N AH D IH K SH AH N
+benedikt B EH N AH D IH K T
+benedix B EH N AH D IH K S
+benefactor B EH N AH F AE K T ER
+benefactor's B EH N AH F AE K T ER Z
+benefactors B EH N AH F AE K T ER Z
+beneficence B AH N EH F AH S AH N S
+beneficent B EH N AH F IH SH AH N T
+beneficial B EH N AH F IH SH AH L
+beneficial's B EH N AH F IH SH AH L Z
+beneficially B EH N AH F IH SH AH L IY
+beneficiaries B EH N AH F IH SH IY EH R IY Z
+beneficiary B EH N AH F IH SH IY EH R IY
+beneficiary's B EH N AH F IH SH IY EH R IY Z
+benefiel B EH N AH F IY L
+benefield B EH N AH F IY L D
+benefit B EH N AH F IH T
+benefited B EH N AH F IH T IH D
+benefiting B EH N AH F IH T IH NG
+benefits B EH N AH F IH T S
+benefitted B EH N AH F IH T IH D
+benefitting B EH N AH F IH T IH NG
+beneke B EH N AH K
+benel B EH N AH L
+benelux B EH N AH L AH K S
+benenati B IH N AH N AA T IY
+benequity B EH N EH K W AH T IY
+benes B EH N IY S
+benesch B EH N AH SH
+benesh B EH N AH SH
+benet B EH N AH T
+benet's B EH N AH T S
+benet's(2) B AH N EY Z
+benet(2) B AH N EY
+benetti B EH N EH T IY
+benetton B EH N AH T AH N
+benetton's B EH N AH T AH N Z
+benetton's(2) B EH N AH T AO N Z
+benetton(2) B EH N AH T AO N
+benevento B EH N AH V EY N T OW
+benevides B EH N AH V IY D EH S
+benevolence B AH N EH V AH L AH N S
+benevolences B AH N EH V AH L AH N S IH Z
+benevolent B AH N EH V AH L AH N T
+benezra B EH N AH Z R AH
+benfer B EH N F ER
+benfield B EH N F IY L D
+benford B EH N F ER D
+bengal B EH NG G AH L
+bengali B EH NG G AA L IY
+bengalis B EH NG G AA L IY Z
+bengals B EH NG G AH L Z
+benge B EH N JH
+bengel B EH NG G AH L
+bengoechea B EH NG G OW EH CH IY AH
+bengoechea(2) B EH NG G OW CH IY AH
+bengston B EH NG G S T AH N
+bengt B EH NG K T
+bengtson B EH NG T S AH N
+benguet B EH NG G AH T
+benham B EH N HH AH M
+benhamou B EH N HH AH M UW
+beni B EH N IY
+benight B IY N AY T
+benighted B IH N AY T IH D
+benighting B IY N AY T IH NG
+benights B IY N AY T S
+benign B IH N AY N
+benigna B EH N IY G N AH
+benignly B AH N AY N L IY
+benigno B EH N IY N Y OW
+benigno(2) B EH N IH G N OW
+benihana B EH N IH HH AA N AH
+benihana(2) B EH N IY HH AA N AH
+benin B IY N IH N
+beninati B EH N IY N AA T IY
+benincasa B EH N IY N K AA S AH
+bening B EH N IH NG
+benish B EH N IH SH
+benita B AH N IY T AH
+benites B EH N AY T S
+benitez B EY N IY T EH Z
+benito B EH N IY T OW
+benito(2) B AH N IY T OW
+benito(3) B IH N IY T OW
+benja B EH N JH AH
+benjamin B EH N JH AH M AH N
+benjamin's B EH N JH AH M AH N Z
+benjimen B EH N JH AH M IH N
+benjy B EH N JH IY
+benke B EH NG K
+benker B EH NG K ER
+benkert B EH NG K ER T
+benko B EH NG K OW
+benlate B EH N L EY T
+benlox B EH N L AA K S
+benn B EH N
+bennardo B AH N AA R D OW
+benne B EH N
+bennefield B EH N IH F IY L D
+benner B EH N ER
+bennet B EH N IH T
+bennett B EH N AH T
+bennett's B EH N AH T S
+bennett(2) B EH N IH T
+bennette B IH N EH T
+bennetts B EH N IH T S
+benney B EH N IY
+bennick B EH N IH K
+bennie B EH N IY
+bennigan B EH N IH G AH N
+bennigan's B EH N IH G AH N Z
+benning B EH N IH NG
+benninger B EH N IH NG ER
+benningfield B EH N IH NG F IY L D
+benninghoff B EH N IH NG HH AO F
+bennington B EH N IH NG T AH N
+bennink B EH N IH NG K
+bennion B EH N Y AH N
+bennis B EH N IH S
+bennison B EH N IH S AH N
+bennitt B EH N IH T
+benno B EH N OW
+benny B EH N IY
+beno B EY N OW
+benoist B AH N OY S T
+benoit B AH N OY T
+benoni B EH N OW N IY
+benotti B AH N AO T IY
+benowitz B EH N AH W IH T S
+benoy B EH N OY
+bens B EH N Z
+bensalem B EH N S EY L AH M
+bensch B EH N SH
+benscoter B EH N S K AH T ER
+bensel B EH N S AH L
+bensen B EH N S AH N
+bensenyore B EH N S IY N Y AO R
+bensenyore(2) B EH N S IY N Y AO R IY
+benshoof B EH N SH UH F
+bensing B EH N S IH NG
+bensinger B EH N S IH N JH ER
+benskin B EH N S K IH N
+bensley B EH N S L IY
+bensman B EH N S M AH N
+benson B EH N S AH N
+benson's B EH N S AH N Z
+bensonhurst B EH N S AH N HH ER S T
+benstock B EH N S T AA K
+bent B EH N T
+bente B EH N T
+benten B EH T IH N
+benter B EH N T ER
+benthall B EH N TH AH L
+bentivegna B EH N T IY V EH G N AH
+bentler B EH N T L ER
+bentley B EH N T L IY
+bentley's B EH N T L IY Z
+bently B EH N T L IY
+bento B EH N T OW
+benton B EH N T AH N
+bentonite B EH N T AH N AY T
+bentonville B EH N T AH N V IH L
+bentsen B EH N T S AH N
+bentsen's B EH N T S AH N Z
+bentson B EH N T S AH N
+bentz B EH N T S
+bentzel B EH N T Z AH L
+bentzen B EH N T Z AH N
+benveniste B EH N V EH N IY S T IY
+benvenuti B EH N V EH N UW T IY
+benvenuto B EH N V EH N UW T OW
+benware B EH N W EH R
+benway B EH N W EY
+benyamin B EH N Y AH M IY N
+benyo B EY N Y OW
+benz B EH N Z
+benz's B EH N Z IH Z
+benz(2) B AE N Z
+benzel B EH N Z AH L
+benzene B EH N Z IY N
+benzes B EH N Z IH Z
+benzie B EH N Z IY
+benziger B EH N Z IH G ER
+benzine B EH N Z IY N
+benzing B EH N Z IH NG
+benzinger B EH N Z IH NG ER
+benzodiazepine B EH N Z OW D IY AE Z AH P IY N
+beougher B AW F ER
+beowulf B EY AH W UH L F
+bequeath B IH K W IY TH
+bequeathed B AH K W IY TH T
+bequest B IH K W EH S T
+bequests B IH K W EH S T S
+bequests(2) B IH K W EH S S
+bequests(3) B IH K W EH S
+bequette B IH K EH T
+bera B EH R AH
+beran B EH R AH N
+beranek B EH R AH N IH K
+berard B ER AA R D
+berardi B ER AA R D IY
+berardinelli B ER AA R D IY N EH L IY
+berardino B ER AA R D IY N OW
+berardo B ER AA R D OW
+berarducci B ER AA R D UW CH IY
+berate B IH R EY T
+berated B IH R EY T IH D
+berating B IH R EY T IH NG
+berber B ER B ER
+berberian B ER B IH R IY AH N
+berberich B ER B ER IH K
+berbick B ER B IH K
+bercaw B ER K AO
+berch B ER K
+berchenall B ER K AH N AA L
+berchtesgaden B ER K T AH S G AA D AH N
+berchtold B ER K T OW L D
+bercier B ER K IY ER
+bercor B ER K AO R
+berdahl B ER D AA L
+berdan B ER D AH N
+berdine B ER D IY N IY
+bere B IH R
+berea B ER IY AH
+bereave B ER IY V
+bereaved B ER IY V D
+bereavement B ER IY V M AH N T
+bereft B ER EH F T
+beregovoy B ER EH G AH V OY
+beregovoy(2) B EH R AH G OW V OY
+beregovoy(3) B EH R EH G AH V OY
+berend B EH R EH N D
+berends B EH R EH N D Z
+berendt B EH R IH N T
+berendzen B EH R IH N D Z AH N
+berens B IH R AH N Z
+berenson B EH R IH N S AH N
+berent B EH R AH N T
+beres B IY R Z
+beresford B IH R Z F ER D
+beret B EH R AH T
+beret(2) B EH R EY T
+berets B EH R AH T S
+berets(2) B EH R EY Z
+beretta B ER EH T AH
+berettas B ER EH T AH S
+berezine B IH R AH Z IY N
+berezine(2) B IH R AH Z AY N
+berg B ER G
+berg's B ER G Z
+bergamini B ER G AA M IY N IY
+bergamo B ER G AA M OW
+bergan B ER G AH N
+bergdahl B ER G D AA L
+bergdoll B ER G D AA L
+bergdorf B ER G D AO R F
+berge B ER JH
+bergeman B ER G M AH N
+bergemann B ER G M AH N
+bergen B ER G AH N
+bergendahl B ER G EH N D AA L
+bergenfield B ER G AH N F IY L D
+bergenthal B ER G AH N TH AA L
+berger B ER G ER
+berger's B ER G ER Z
+bergerman B ER G ER M AH N
+bergeron B ER G ER AO N
+bergerson B ER G ER S AH N
+berges B ER JH IH Z
+bergeson B ER G IH S AH N
+berget B ER G EH T
+bergevin B ER G EH V IH N
+bergey B ER JH IY
+bergfeld B ER G F EH L D
+berggren B ER G R EH N
+bergh B ER G
+berghof B ER G HH AO F
+berghoff B ER G HH AO F
+berghuis B ER G HH UW IH Z
+bergin B ER G IH N
+bergland B ER G L AE N D
+bergling B ER G L IH NG
+berglund B ER G L AH N D
+bergman B ER G M AH N
+bergmann B ER G M AH N
+bergner B ER G N ER
+bergquist B ER G K W IH S T
+bergren B ER G R EH N
+bergs B ER G Z
+bergschneider B ER G SH N AY D ER
+bergsma B EH R G Z M AH
+bergstedt B ER G S T EH T
+bergstein B ER G S T AY N
+bergstein(2) B ER G S T IY N
+bergsten B ER G S AH N
+bergstrand B ER G S T R AE N D
+bergstrausser B ER G S T R AW S ER
+bergstrausser's B ER G S T R AW S ER Z
+bergstresser B ER G S T R EH S ER
+bergstrom B ER G S T R AA M
+bergthold B ER G TH OW L D
+bergum B ER G AH M
+berhow B ER HH OW
+beria B EH R IY AH
+bering B EH R IH NG
+beringer B EH R IH NG ER
+berisford B EH R IH S F ER D
+berish B ER IH SH
+berjaya B ER JH AY AH
+berk B ER K
+berka B ER K AH
+berke B ER K
+berkebile B ER K IH B AH L
+berkel B ER K AH L
+berkeley B ER K L IY
+berkeley's B ER K L IY Z
+berkelman B ER K AH L M AH N
+berkemeier B ER K IH M AY ER
+berken B ER K AH N
+berkery B ER K ER IY
+berkes B ER K S
+berkey B ER K IY
+berkheimer B ER K HH AY M ER
+berkland B ER K L AH N D
+berklee B ER K L IY
+berkley B ER K L IY
+berkline B ER K L AY N
+berkman B ER K M AH N
+berko B ER K OW
+berkoff B ER K AO F
+berkovitz B ER K AH V IH T S
+berkowitz B ER K AH W IH T S
+berkshire B ER K SH ER
+berkshire(2) B ER K SH AY R
+berkshires B ER K SH IH R Z
+berkshires(2) B ER K SH AY R Z
+berkson B ER K S AH N
+berkstresser B ER K S T R IH S ER
+berlack B ER L AE K
+berland B ER L AH N D
+berlanga B ER L AA NG G AH
+berlascone B EH R L AH S K OW N IY
+berlascone's B EH R L AH S K OW N IY Z
+berle B ER L
+berle's B ER L Z
+berles B ER L Z
+berles' B ER L Z
+berlet B ER L EH T
+berlet's B ER L EH T S
+berlex B ER L EH K S
+berlin B ER L IH N
+berlin's B ER L IH N Z
+berliner B ER L IH N ER
+berliner's B ER L IH N ER Z
+berliner's(2) B ER L AY N ER Z
+berliner(2) B ER L AY N ER
+berliners B ER L IH N ER Z
+berliners(2) B ER L AY N ER Z
+berling B ER L IH NG
+berlinger B ER L IH NG ER
+berlioz B ER L IY OW Z
+berlitz B ER L IH T S
+berlottes B ER L AA T S
+berls B ER L Z
+berlusconi B ER L AH S K OW N IY
+berlusconi's B ER L AH S K OW N IY Z
+berm B ER M
+berman B ER M AH N
+berman's B ER M AH N Z
+bermans B ER M AH N Z
+bermea B EH R M IY AH
+bermel B ER M AH L
+berms B ER M Z
+bermuda B ER M Y UW D AH
+bermudas B ER M Y UW D AH Z
+bermudes B ER M Y UW D Z
+bermudez B ER M Y UW D EH Z
+bern B ER N
+berna B EH R N AH
+bernabe B ER N AH B
+bernabei B ER N AH B AY
+bernacki B ER N AA T S K IY
+bernadene B ER N AH D IY N
+bernadette B ER N AH D EH T
+bernadin B ER N AH D IH N
+bernadine B ER N AH D IY N
+bernadino B ER N AH D IY N OW
+bernal B ER N AH L
+bernama B ER N AA M AH
+bernard B ER N AA R D
+bernard's B ER N AA R D Z
+bernard(2) B ER N ER D
+bernardi B ER N AA R D IY
+bernardin B ER N AA R D IY N
+bernardini B ER N AA R D IY N IY
+bernardino B ER N AH D IY N OW
+bernardino(2) B ER N AA R D IY N OW
+bernardo B ER N AA R D OW
+bernardo's B ER N AA R D OW Z
+bernards B ER N AA R D Z
+bernardy B ER N AA R D IY
+bernas B ER N AH Z
+bernasconi B ER N AA S K OW N IY
+bernat B ER N AH T
+bernath B ER N AH TH
+bernauer B ER N AW ER
+bernay B ER N EY
+bernbach B ER N B AA K
+bernd B ER N T
+berndt B ER N T
+berne B ER N
+berneice B ER N AY S
+berner B ER N ER
+bernet B ER N EH T
+bernett B ER N IH T
+berney B ER N IY
+bernhagen B ER N HH AH G AH N
+bernhard B ER N HH AA R D
+bernhardt B ER N HH AA R T
+bernhart B ER N HH AA R T
+bernheim B ER N HH AY M
+bernheimer B ER N HH AY M ER
+berni B EH R N IY
+bernia B EH R N IY AH
+bernice B ER N IY S
+bernick B ER N IH K
+bernie B ER N IY
+bernie's B ER N IY Z
+bernier B ER N IY ER
+berning B ER N IH NG
+berninger B ER N IH NG ER
+bernita B ER N IY T AH
+bernoulli B ER N UW L IY
+berns B ER N Z
+bernsen B ER N S AH N
+bernson B ER N S AH N
+bernstein B ER N S T AY N
+bernstein's B ER N S T IY N Z
+bernstein's(2) B ER N S T AY N Z
+bernstein(2) B ER N S T IY N
+bernsteins B ER N S T AY N Z
+bernsteins(2) B ER N S T IY N Z
+bernt B ER N T
+berntsen B ER N T S AH N
+berntson B ER N T S AH N
+berny B ER N IY
+bero B EH R OW
+beron B EH R AH N
+berquist B ER K W IH S T
+berra B EH R AH
+berra's B EH R AH Z
+berrard B EH R AA R D
+berrard(2) B ER AA R D
+berres B EH R Z
+berreth B EH R IH TH
+berrett B EH R IH T
+berrey B EH R IY
+berri B EH R IY
+berrian B EH R IY AH N
+berridge B EH R IH JH
+berrie B EH R IY
+berrien B EH R IY AH N
+berrier B EH R IY ER
+berries B EH R IY Z
+berrigan B EH R IH G AH N
+berrill B EH R AH L
+berringer B EH R IH NG ER
+berrios B EH R IY OW Z
+berris B EH R IY Z
+berrong B EH R AO NG
+berry B EH R IY
+berry's B EH R IY Z
+berryhill B EH R IY HH IH L
+berrylike B EH R IY L AY K
+berryman B EH R IY M AH N
+bersch B ER SH
+berserk B ER S ER K
+bershad B ER SH AA D
+berson B ER S AH N
+berst B ER S T
+berstein B ER S T IY N
+berstein(2) B ER S T AY N
+bert B ER T
+berta B ER T AH
+bertch B ER CH
+berte B ER T
+bertelli B ER T EH L IY
+bertels B ER T AH L Z
+bertelsen B ER T IH L S AH N
+bertelsmann B ER T AH L Z M AH N
+bertelsmann's B ER T AH L Z M AH N Z
+bertelson B ER T IH L S AH N
+berth B ER TH
+bertha B ER TH AH
+berthelot B ER TH AH L AA T
+berthelsen B ER TH AH L S AH N
+berthiaume B ER TH IY UW M IY
+berthold B ER TH OW L D
+bertholf B ER TH OW L F
+berths B ER TH S
+berths(2) B ER DH Z
+berti B EH R T IY
+bertie B ER T IY
+bertil B ER T IH L
+bertilde B ER T IH L D
+bertin B ER T IH N
+bertini B ER T IY N IY
+bertino B ER T IY N OW
+bertinotti B ER T IH N AO T IY
+bertke B ER T K IY
+bertling B ER T AH L IH NG
+bertling(2) B ER T L IH NG
+bertold B ER T OW L D
+bertoldi B ER T OW L D IY
+bertoli B ER T OW L IY
+bertolini B ER T OW L IY N IY
+bertolino B ER T OW L IY N OW
+bertolotti B ER T OW L OW T IY
+bertolucci B ER T OW L UW CH IY
+berton B ER T AH N
+bertone B ER T OW N IY
+bertoni B ER T OW N IY
+bertrade B ER T R AH D
+bertram B ER T R AH M
+bertran B ER T R AH N
+bertrand B ER T R AH N D
+bertsch B ER CH
+bertsche B ER CH
+bertucci B ER T UW CH IY
+bertucci's B ER T UW CH IY Z
+berty B ER T IY
+bertz B ER T S
+berube B EH R UW B
+berudi B AH R UW D IY
+berumen B IH R UW M EH N
+berwald B ER W AO L D
+berwanger B ER W AO NG ER
+berwick B ER W IH K
+berwyn B ER W IH N
+beryl B EH R AH L
+beryllium B ER IH L IY AH M
+berzin B ER Z IH N
+berzins B ER Z IH N Z
+bes B IY Z
+besancon B IH S AE N K AH N
+besant B EH Z AH N T
+besaw B IY S AO
+besch B EH SH
+beschloss B EH SH L AO S
+beschloss' B EH SH L AO S
+beschloss's B EH SH L AO S IH S
+besecker B EH S IH K ER
+beseech B IY S IY CH
+beseeched B IY S IY CH T
+beseeching B IY S IY CH IH NG
+beseiged B IH S IY JH D
+besemer B EH S IY M ER
+beset B IH S EH T
+besetting B IH S EH T IH NG
+beshara B IH SH AA R AH
+besharov B EH SH ER AA V
+beshears B EH SH IY R Z
+beshloss B EH SH L AO S
+beshore B EH SH ER
+beside B IH S AY D
+beside(2) B IY S AY D
+besides B IH S AY D Z
+besides(2) B IY S AY D Z
+besiege B IH S IY JH
+besieged B IH S IY JH D
+besieging B IH S IY JH IH NG
+beske B EH S K
+besler B EH S AH L ER
+besler(2) B EH S L ER
+besner B R EH S N ER
+besner's B R EH S N ER Z
+bespeak B IH S P IY K
+bespeaks B IH S P IY K S
+bespectacle B IH S P EH K T AH K AH L
+bespectacled B IH S P EH K T AH K AH L D
+bess B EH S
+besse B EH S
+bessemer B EH S AH M ER
+bessent B EH S AH N T
+besser B EH S ER
+bessert B EH S ER T
+bessette B IH S EH T
+bessey B EH S IY
+bessie B EH S IY
+bessinger B EH S IH N JH ER
+bessire B EH S IH R IY
+bessler B EH S L ER
+besso B EH S OW
+besson B EH S AH N
+bessy B EH S IY
+best B EH S T
+best's B EH S T S
+best-western B EH S T W EH S T ER N
+beste B EH S T
+bested B EH S T IH D
+bester B EH S T ER
+bestial B EH S CH AH L
+bestiality B EH S CH AE L IH T IY
+besting B EH S T IH NG
+bestow B IH S T OW
+bestowed B IH S T OW D
+bestowing B IH S T OW IH NG
+bestows B IH S T OW Z
+bestrode B IH S T R OW D
+bestseller B EH S T S EH L ER
+bestseller(2) B EH S EH L ER
+bestsellers B EH S T S EH L ER Z
+bestsellers(2) B EH S EH L ER Z
+bestselling B EH S T S EH L IH NG
+bestselling(2) B EH S EH L IH NG
+bestul B EH S T AH L
+bestwick B EH S T W IH K
+beswick B EH S W IH K
+bet B EH T
+bet's B EH T S
+beta B EY T AH
+betabia B AH T EY B IY AH
+betabia(2) B AH T AE B IY AH
+betake B IY T EY K
+betakeren B EH T AH K EH R AH N
+betamax B EY T AH M AE K S
+betancourt B EH T AH N K AO R T
+betancur B AH T AE NG K ER
+betar B EH T AA R
+betas B EY T AH Z
+betaseron B EY T AH S EH R AA N
+betavon B EH T AH V AA N
+betcha B EH CH AH
+betcher B EH CH ER
+betel B EH T AH L
+betelgeuse B EH T AH L G UH Z
+beteta B EH T EY T AH
+beth B EH TH
+bethany B EH TH AH N IY
+bethard B EH TH ER D
+bethards B EH TH ER D Z
+bethea B EH DH IY AH
+bethel B EH TH AH L
+bethel(2) B EH TH EH L
+bethell B EH TH AH L
+bethesda B AH TH EH Z D AH
+bethke B EH TH K
+bethlehem B EH TH L IH HH EH M
+bethlehem's B EH TH L IH HH EH M Z
+bethpage B EH TH P EY JH
+bethune B AH TH Y UW N
+betide B IH T AY D
+betke B EH T K IY
+betker B EH T K ER
+betley B EH T L IY
+betray B IH T R EY
+betrayal B IH T R EY AH L
+betrayals B IH T R EY AH L Z
+betrayed B IH T R EY D
+betraying B IH T R EY IH NG
+betrays B IH T R EY Z
+bets B EH T S
+betsch B EH CH
+betschart B EH T S HH AA R T
+betschart(2) B EH CH AA R T
+betsey B EH T S IY
+betsill B EH T S AH L
+betsy B EH T S IY
+betsy's B EH T S IY Z
+bett B EH T
+betta B EH T AH
+bettcher B EH T CH ER
+bette B EH T IY
+betten B EH T AH N
+bettenberg B EH T AH N B ER G
+bettencourt B EH T IH N K AO R T
+bettendorf B EH T IH N D AO R F
+bettenhausen B EH T IH N HH AW Z AH N
+better B EH T ER
+bettered B EH T ER D
+betteridge B EH T ER IH JH
+bettering B EH T ER IH NG
+betterment B EH T ER M AH N T
+betters B EH T ER Z
+betterton B EH T ER T AH N
+bettes B EH T IY Z
+betti B EH T IY
+bettin B EH T IH N
+bettina B AH T IY N AH
+betting B EH T IH NG
+bettinger B EH T IH NG ER
+bettini B EH T IY N IY
+bettino B EH T IY N OW
+bettis B EH T IH S
+bettman B EH T M AH N
+bettman's B EH T M AH N Z
+bettner B EH T N ER
+betton B EH T AH N
+bettor B EH T ER
+bettors B EH T ER Z
+betts B EH T S
+betty B EH T IY
+betty's B EH T IY Z
+between B IH T W IY N
+between(2) B IY T W IY N
+betweens B IH T W IY N Z
+betweens(2) B IY T W IY N Z
+betwixt B IY T W IH K S T
+betz B EH T S
+betzer B EH T Z ER
+betzler B EH T S L ER
+betzold B EH T Z OW L D
+beu B UW
+beucler B OY K AH L ER
+beucler(2) B OY K L ER
+beukema B UW K IY M AH
+beula B UW L AH
+beulah B Y UW L AH
+beumer B IY AH M ER
+beury B ER IY
+beury's B ER IY Z
+beutel B Y UW T EH L
+beuthin B Y UW TH IH N
+beutler B OY T AH L ER
+beutler(2) B OY T L ER
+beuys B Y UW IY Z
+bev B EH V
+bevacqua B EH V AA K W AH
+bevalaqua B EH V AH L AA K AH
+bevan B EH V AH N
+bevans B EH V AH N Z
+bevaqua B EH V AA K AH
+bevard B IH V AA R D
+bevel B EH V AH L
+bevelled B EH V AH L D
+beven B EH V AH N
+bevens B IY V AH N Z
+bever B EH V ER
+beverage B EH V ER IH JH
+beverage(2) B EH V R IH JH
+beverages B EH V R IH JH IH Z
+beveridge B EH V ER IH JH
+beverley B EH V ER L IY
+beverlin B EH V ER L IH N
+beverly B EH V ER L IY
+beverly's B EH V ER L IY Z
+bevers B EH V ER Z
+bevier B EH V IY ER
+bevil B EH V AH L
+bevilacqua B EH V IY L AA K W AH
+bevill B EH V AH L
+beville B IY V IH L
+bevin B EH V IH N
+bevington B EH V IH NG T AH N
+bevins B EH V IH N Z
+bevis B EH V IH S
+bevmark B EH V M AA R K
+bevy B EH V IY
+beware B IH W EH R
+bewilder B IH W IH L D ER
+bewildered B IH W IH L D ER D
+bewildering B IH W IH L D ER IH NG
+bewilderment B IH W IH L D ER M AH N T
+bewilders B IH W IH L D ER Z
+bewitch B IH W IH CH
+bewitched B IH W IH CH T
+bewley B Y UW L IY
+bexley B EH K S L IY
+bey B EY
+beyer B EY ER
+beyerle B AY R AH L
+beyerlein B AY R L AY N
+beyers B EY ER Z
+beyersdorf B AY R S D AO R F
+beyl B EY L
+beymer B EY M ER
+beynon B EY N AH N
+beyond B IH AA N D
+beyond(2) B IY AO N D
+beyond(3) B IH AO N D
+beytout B EY T AW T
+bezaire B AH Z EH R
+bezanson B EH Z AH N S AH N
+bezdek B EH Z D IH K
+bezek B EH Z EH K
+bezner B EH Z N ER
+bezold B EH Z OW L D
+bhagwan B AA G W AA N
+bhakta B AA K T AH
+bhangra B AA NG G R AH
+bharata B AA R AA T AH
+bhatia B AA SH AH
+bhatia(2) B AA T Y AH
+bhatt B AE T
+bhatt(2) B AA T
+bhattacharjy B AA T AH CH AA R JH IY
+bhatti B AA T IY
+bhiksha B IH K SH AA
+bhiksha(2) B IY K SH AA
+bhirud B IH R AH D
+bhopal B OW P AA L
+bhosle B AO S AH L
+bhutan B UW T AE N
+bhutan(2) B AH T AA N
+bhutto B UW T OW
+bhutto's B UW T OW Z
+bi B AY
+bi-daily B AY D EY L IY
+bi-polar B AY P OW L ER
+biaggi B IY AE JH IY
+biaggini B IY AH G IY N IY
+biagi B IY AA JH IY
+biagini B IY AH JH IY N IY
+biagioni B IY AA JH IY OW N IY
+bialas B IY AA L AH S
+bialecki B IY AH L EH K IY
+bialek B IY AA L EH K
+bialik B IY AA L IH K
+bialkin B IY AA L K AH N
+bialkowski B IY AH L K AW S K IY
+bialy B IY AA L IY
+biamby B IY AA M B IY
+biamby's B IY AA M B IY Z
+biamonte B IY AH M AO N T IY
+biana B IY AA N AH
+bianca B IY AA NG K AH
+bianchi B IY AA N CH IY
+bianchini B IY AA N CH IY N IY
+bianco B IY AA NG K OW
+bianconi B IY AA NG K OW N IY
+bianculli B IY AA NG K UW L IY
+biannual B AY AE N UW AH L
+bias B AY AH S
+biased B AY AH S T
+biases B AY AH S IH Z
+biasi B IY AA S IY
+biaxial B AY AE K S IY AH L
+biaz B IY AE Z
+bib B IH B
+biba B IY B AH
+bibb B IH B
+bibbee B IH B IY
+bibbins B IH B IH N Z
+bibbo B IY B OW
+bibbs B IH B Z
+bibby B IH B IY
+bibeau B IH B OW
+bibeault B IH B OW
+bibee B IH B IY
+biber B AY B ER
+bibi B IH B IY
+bibi's B IH B IY Z
+bibi's(2) B IY B IY Z
+bibi(2) B IY B IY
+bible B AY B AH L
+bible's B AY B AH L Z
+bibler B AY B AH L ER
+bibler(2) B AY B L ER
+bibles B AY B AH L Z
+biblical B IH B L AH K AH L
+biblical(2) B IH B L IH K AH L
+bibliographies B IH B L IY AA G R AH F IY Z
+bibliography B IH B L IY AA G R AH F IY
+bibs B IH B Z
+biby B AY B IY
+bic B IH K
+bicarbonate B AY K AA R B AH N AH T
+bice B AY S
+bicentenary B AY S EH N T IH N EH R IY
+bicentennial B AY S EH N T EH N IY AH L
+biceps B AY S EH P S
+bichler B IH K AH L ER
+bichler(2) B IH K L ER
+bichsel B IH K S AH L
+bick B IH K
+bickel B IH K AH L
+bickell B IH K AH L
+bicker B IH K ER
+bickered B IH K ER D
+bickering B IH K ER IH NG
+bickers B IH K ER Z
+bickerstaff B IH K ER S T AE F
+bickert B IH K ER T
+bickerton B IH K ER T AH N
+bickett B IH K IH T
+bickford B IH K F ER D
+bickham B IH K HH AH M
+bickhart B IH K HH AA R T
+bicking B IH K IH NG
+bickle B IH K AH L
+bickler B IH K L ER
+bickley B IH K L IY
+bickmore B IH K M AO R
+bicknell B IH K N AH L
+bickner B IH K N ER
+bicksler B IH K S L ER
+bickwit B IH K W IH T
+bicoastal B IH K OW S T AH L
+bicuspid B AY K AH S P AH D
+bicuspids B AY K AH S P AH D Z
+bicycle B AY S IH K AH L
+bicycled B AY S IH K AH L D
+bicycles B AY S IH K AH L Z
+bicycling B AY S IH K AH L IH NG
+bicycling(2) B AY S IH K L IH NG
+bicyclist B AY S IH K L IH S T
+bicyclists B AY S IH K L IH S T S
+bicyclists(2) B AY S IH K L IH S
+bid B IH D
+bid's B IH D Z
+bidco B IH D K OW
+bidcos B IH D K OW S
+biddable B IH D AH B AH L
+bidden B IH D IH N
+bidder B IH D ER
+bidder's B IH D ER Z
+bidders B IH D ER Z
+biddie B IH D IY
+bidding B IH D IH NG
+biddinger B IH D IH NG ER
+biddison B IH D IH S AH N
+biddix B IH D IH K S
+biddle B IH D AH L
+biddle's B IH D AH L Z
+biddy B IH D IY
+bide B AY D
+biden B AY D AH N
+biderman B AY D ER M AH N
+bidgood B IH D G UH D
+biding B AY D IH NG
+bidinger B AY D IH NG ER
+bidlack B IH D L AE K
+bidlo B IH D L OW
+bidlo's B IH D L OW Z
+bids B IH D Z
+bidwell B IH D W EH L
+bidwill B IH D W IH L
+biebel B IY B AH L
+bieber B IY B ER
+bieda B IY D AH
+biederman B IY D ER M AH N
+biedermann B AY D ER M AH N
+biedermeier B IY D ER M AY R
+biedrzycki B IH JH IH T S K IY
+biegel B IY G AH L
+biegler B IY G AH L ER
+biegler(2) B IY G L ER
+biehl B IY L
+biehle B IY HH AH L
+biehler B IY L ER
+biehn B IY N
+bieker B IY K ER
+biel B IY L
+biela B IY L AH
+bielak B IY L AH K
+bielanski B IY L AE N S K IY
+bielat B IY L AH T
+bielawski B IY L AA F S K IY
+bielby B IY L B IY
+bielecki B IY L EH T S K IY
+bielecki(2) B AY L EH K IY
+bielefeld B IY L IH F EH L D
+bielefeldt B IY L IH F IH L T
+bielen B IY L AH N
+bielenberg B IY L AH N B ER G
+bieler B IY L ER
+bielicki B IH L IH T S K IY
+bielinski B IH L IH N S K IY
+bielke B IY L K
+bielski B IY L S K IY
+bien B IY N
+bieniek B IH N IY EH K
+bienkowski B IH NG K AO F S K IY
+biennale B IY EH N EY L
+biennial B AY EH N IY AH L
+bienstock B IY N S T AA K
+bienvenu B AH N V EH N UW
+bienvenue B AH N V EY N W EH
+bier B IY R
+bierbarror B IH R B AA R ER
+bierbauer B IH R B AW ER
+bierbauer's B IH R B AW ER Z
+bierbaum B IH R B AW M
+bierbusse B IH R B AH S
+bierce B IH R S
+bierer B IH R ER
+bieri B IH R IY
+bierlein B IH R L AY N
+bierley B IH R L IY
+bierly B IH R L IY
+bierma B IH R M AH
+bierman B IH R M AH N
+biermann B IH R M AH N
+biernacki B IH R N AA T S K IY
+biernat B IH R N AE T
+biers B IY R Z
+bierwirth B IH R W ER TH
+biery B IH R IY
+bies B AY Z
+biesecker B IY S IH K ER
+bieser B IY S ER
+bietz B IY T S
+biev B IY V
+biev's B IY V Z
+biever B IY V ER
+bifano B IH F AA N OW
+biff B IH F
+biffle B IH F AH L
+bifida B IH F AH D AH
+bifocal B AY F OW K AH L
+bifocals B AY F OW K AH L Z
+bifulco B IH F UW L K OW
+bifurcate B IH F ER K EY T
+bifurcate(2) B AY F ER K EY T
+bifurcated B IH F ER K EY T IH D
+bifurcated(2) B AY F ER K EY T IH D
+bifurcation B IH F ER K EY SH AH N
+bifurcation(2) B AY F ER K EY SH AH N
+big B IH G
+bigan B IH G AH N
+bigbee B IH G B IY
+bigbie B IH G B IY
+bigby B IH G B IY
+bigelow B IH G AH L OW
+bigelow's B IH G AH L OW Z
+bigeyes B IH G AY Z
+bigfoot B IH G F UH T
+bigford B IH G F ER D
+biggar B IH G ER
+bigger B IH G ER
+biggers B IH G ER Z
+biggerstaff B IH G ER S T AE F
+biggest B IH G AH S T
+biggie B IH G IY
+biggies B IH G IY Z
+biggins B IH G IH N Z
+biggio B IY JH IY OW
+biggs B IH G Z
+bigham B AY G HH AH M
+bighorn B IH G HH AO R N
+bighorns B IH G HH AO R N Z
+bight B AY T
+bigler B AY G AH L ER
+bigler(2) B AY G L ER
+bigler(3) B IH G L ER
+bigley B IH G L IY
+biglin B IH G L IH N
+biglow B IH G L OW
+bignell B IH G N EH L
+bigness B IH G N AH S
+bigos B IY G OW Z
+bigot B IH G AH T
+bigoted B IH G AH T IH D
+bigotry B IH G AH T R IY
+bigots B IH G AH T S
+bigram B AY G R AE M
+bigs B IH G Z
+bigsby B IH G Z B IY
+bigtime B IH G T AY M
+bigwig B IH G W IH G
+bigwigs B IH G W IH G Z
+bigwood B IH G W UH D
+bihac B IY HH AA CH
+bihac's B IY HH AA CH IH Z
+bihari B IH HH AA R IY
+bihari(2) B IY HH AA R IY
+bihl B IH L
+bihm B IH M
+bihn B IH N
+bijac B AY JH AE K
+bijac(2) B IY JH AE K
+bijan B IH JH AH N
+bijeljina B IH JH EH L JH IY N AH
+bijur B IY ZH UH R
+bike B AY K
+biked B AY K T
+biker B AY K ER
+bikers B AY K ER Z
+bikes B AY K S
+bikin B IH K IH N
+biking B AY K IH NG
+bikini B IH K IY N IY
+bikinis B AH K IY N IY Z
+biko B IY K OW
+biko's B IY K OW Z
+bil B IH L
+bila B IY L AH
+bilateral B AY L AE T ER AH L
+bilaterally B AY L AE T ER AH L IY
+bilbao B IH L B AW
+bilbao's B IH L B AW Z
+bilbaoan B IH L B OW AH N
+bilbaoans B IH L B OW AH N Z
+bilbo B IH L B OW
+bilbrey B IH L B R IY
+bilbro B IY L B R OW
+bilby B IH L B IY
+bild B IH L D
+bilderback B AY L D ER B AE K
+bildner B IH L D N ER
+bildt B IH L T
+bildt's B IH L T S
+bile B AY L
+bilek B IH L EH K
+bilello B IH L EH L OW
+biles B AY L Z
+bilger B IH L G ER
+bilicki B IH L IH T S K IY
+bilings B AY L IH NG Z
+bilingual B AY L IH NG G W AH L
+bilingualism B AY L IH NG G W AH L IH Z AH M
+bilinski B IH L IH N S K IY
+bilious B IH L IY AH S
+bilirakis B IH L IH R AH K IH S
+bilk B IH L K
+bilka B IH L K AH
+bilked B IH L K T
+bilking B IH L K IH NG
+bilko B IH L K OW
+bill B IH L
+bill's B IH L Z
+billable B IH L AH B AH L
+billancourt B IH L AH N K AO R T
+billard B IH L AA R D
+billboard B IH L B AO R D
+billboard's B IH L B AO R D Z
+billboards B IH L B AO R D Z
+bille B AY L
+billed B IH L D
+biller B IH L ER
+billerica B IH L ER IY K AH
+billes B IH L Z
+billet B IH L AH T
+billet(2) B IH L IH T
+billeter B IH L IY T ER
+billets B IH L AH T S
+billett B IH L IH T
+billfold B IH L F OW L D
+billiad B IH L IY AH D
+billiard B IH L Y ER D
+billiards B IH L Y ER D Z
+billick B IH L IH K
+billie B IH L IY
+billig B IH L IH G
+billing B IH L IH NG
+billinger B IH L IH NG ER
+billingham B IH L IH NG HH AE M
+billings B IH L IH NG Z
+billingslea B IH L IH NG Z L IY
+billingsley B IH L IH NG Z L IY
+billingsly B IH L IH NG Z L IY
+billington B IH L IH NG T AH N
+billion B IH L Y AH N
+billionaire B IH L Y AH N EH R
+billionaires B IH L Y AH N EH R Z
+billions B IH L Y AH N Z
+billionth B IH L Y AH N TH
+billionths B IH L Y AH N TH S
+billiot B IH L IY AA T
+billips B IH L IH P S
+billiter B IH L IY T ER
+billiton B IH L IH T AH N
+billman B IH L M AH N
+billmeyer B IH L M AY ER
+billon B IH L AH N
+billow B IH L OW
+billowed B IH L OW D
+billowing B IH L OW IH NG
+billows B IH L OW Z
+bills B IH L Z
+bills' B IH L Z
+billup B IH L AH P
+billups B IH L AH P S
+billy B IH L IY
+billy's B IH L IY Z
+bilodeau B IH L AH D OW
+bilotta B IH L OW T AH
+bilotti B IH L AA T IY
+bilow B IH L OW
+biloxi B AH L AH K S IY
+biloxi's B AH L AH K S IY Z
+bilski B IH L S K IY
+bilsky B IH L S K IY
+bilson B IH L S AH N
+biltmore B IH L T M AO R
+bilton B IH L T AH N
+biltz B IH L T S
+bily B IH L IY
+bilyeu B IH L IY UW
+bilyk B IH L IH K
+bilzerian B IH L Z EH R IY AH N
+bilzerian's B IH L Z EH R IY AH N Z
+bima B IY M AH
+bimbo B IH M B OW
+bimbos B IH M B OW S
+bimini B IH M AH N IY
+bimini(2) B IH M IY N IY
+bimiodal B AY M OW D AH L
+bimonthly B AY M AH N TH L IY
+bin B IH N
+bina B IY N AH
+binary B AY N ER IY
+binational B AY N AE SH AH N AH L
+binchy B IH N CH IY
+bind B AY N D
+bindel B IH N D AH L
+binder B AY N D ER
+binders B AY N D ER Z
+binding B AY N D IH NG
+bindle B IH N D AH L
+bindles B IH N D AH L Z
+bindley B IH N D L IY
+binds B AY N D Z
+binegar B IH N IH G ER
+bines B AY N Z
+binette B IH N EH T
+binetti B IH N EH T IY
+binfield B IH N F IY L D
+binford B IH N F ER D
+bing B IH NG
+binga B IY NG G AH
+bingaman B IH NG AH M AH N
+binge B IH N JH
+binged B IH N JH D
+bingel B IH NG G AH L
+bingenheimer B IH NG G IH N HH AY M ER
+binger B IH NG ER
+binges B IH N JH IH Z
+bingham B IH NG AH M
+binghamton B IH NG AH M T AH N
+binging B IH NG G IH NG
+bingle B IH NG G AH L
+bingley B IH NG L IY
+bingman B IH NG M AH N
+bingo B IH NG G OW
+binion B IH N Y AH N
+bink B IH NG K
+binkley B IH NG K L IY
+binkowski B IH NG K AO F S K IY
+binn B IH N
+binner B IH N ER
+binney B IH N IY
+binnie B IH N IY
+binning B IH N IH NG
+binns B IH N Z
+binocular B AH N AA K Y AH L ER
+binoculars B AH N AA K Y AH L ER Z
+binomial B AY N OW M IY AH L
+bins B IH N Z
+binstock B IH N S T AA K
+bintz B IH N T S
+binz B IH N Z
+bio B AY OW
+bio's B AY OW Z
+biochem B AY AH CH AH M
+biochemical B AY OW K EH M AH K AH L
+biochemical(2) B AY OW K EH M IH K AH L
+biochemist B AY OW K EH M AH S T
+biochemistry B AY OW K EH M AH S T R IY
+biocine B AY AH S IY N
+biocontrol B AY AH K AA N T R AA L
+biocraft B AY OW K R AE F T
+biodegradable B AY OW D AH G R EY D AH B AH L
+biodiverse B AY OW D AY V ER S
+biodiversity B AY OW D AY V ER S AH T IY
+bioengineer B AY OW EH N JH AH N IH R
+bioengineered B AY OW EH N JH AH N IH R D
+bioengineering B AY OW EH N JH AH N IH R IH NG
+bioethics B AY OW EH TH IH K S
+biofeedback B AY OW F IY D B AE K
+bioflavonoid B AY OW F L EY V AH N OY D
+bioflavonoids B AY OW F L EY V AH N OY D Z
+biogen B AY OW JH EH N
+biogen's B AY OW JH EH N Z
+biographer B AY AA G R AH F ER
+biographers B AY AA G R AH F ER Z
+biographical B AY AH G R AE F IH K AH L
+biographies B AY AA G R AH F IY Z
+biography B AY AA G R AH F IY
+biohazard B AY OW HH AE Z ER D
+biohazards B AY OW HH AE Z ER D Z
+biologic B AY AH L AA JH IH K
+biological B AY AH L AA JH IH K AH L
+biologically B AY AH L AA JH IH K L IY
+biologicals B AY AH L AA JH IH K AH L Z
+biologics B AY AH L AA JH IH K S
+biologist B AY AA L AH JH AH S T
+biologists B AY AA L AH JH AH S T S
+biologists(2) B AY AA L AH JH AH S S
+biologists(3) B AY AA L AH JH AH S
+biology B AY AA L AH JH IY
+biology's B AY AA L AH JH IY Z
+biomass B AY AH M AE S
+biomaterial B AY OW M AH T IH R IY AH L
+biomaterials B AY OW M AH T IH R IY AH L Z
+biome B AY OW M
+biomed B AY OW M EH D
+biomed's B AY OW M EH D Z
+biomedical B AY OW M EH D IH K AH L
+biomedicals B AY OW M EH D IH K AH L Z
+biomes B AY OW M Z
+biomet B AY OW M EH T
+biondi B IY AA N D IY
+biondo B IY OW N D OW
+biondolillo B IY OW N D OW L IH L OW
+bionetic B AY OW N EH T IH K
+bionetics B AY OW N EH T IH K S
+biopharm B AY AH F AA R M
+biopharmaceutical B AY OW F AA R M AH S UW T IH K AH L
+biopharmacy B AY OW F AA R M AH S IY
+biophysics B AY OW F IH S IH K S
+biopsies B AY AA P S IY Z
+biopsy B AY AA P S IY
+bios B AY OW S
+biosafety B AY OW S EY F T IY
+bioscience B AY OW S IY AH N S
+biosciences B AY AO S IY EH N S IH Z
+biosensor B AY OW S EH N S ER
+biosensors B AY OW S EH N S ER Z
+biosis B IY OW Z IH S
+biosis(2) B IY OW S IH S
+biosphere B AY OW S F IH R
+biosphere's B AY OW S F IH R Z
+biospheres B AY OW S F IH R Z
+biospherian B AY OW S F IH R IY AH N
+biospherians B AY OW S F IH R IY AH N Z
+biosys B AY OW S IH S
+biosystem B AY OW S IH S T AH M
+biosystems B AY OW S IH S T AH M Z
+biotech B AY OW T EH K
+biotechnica B AY OW T EH K N IH K AH
+biotechnica's B AY OW T EH K N IH K AH Z
+biotechnological B AY OW T EH K N AH L AA JH IH K AH L
+biotechnologies B AY OW T EH K N AA L AH JH IY Z
+biotechnology B AY OW T EH K N AA L AH JH IY
+biotechnology's B AY OW T EH K N AA L AH JH IY Z
+biotechs B AY OW T EH K S
+biotherapeutic B AY OW TH EH R AH P Y UW T IH K
+biotherapeutics B AY OW TH EH R AH P Y UW T IH K S
+biotin B AY AH T AH N
+biotite B AY AH T AY T
+biovest B AY OW V AH S T
+bip B IH P
+bipartisan B AY P AA R T IH Z AH N
+bipartisan(2) B AY P AA R T IH S AH N
+bipartisanship B AY P AA R T AH Z AH N SH IH P
+bipartisanship(2) B AY P AA R T AH S AH N SH IH P
+biphenyl B IH F AH N AH L
+biphenyls B IH F AH N AH L Z
+biplane B AY P L EY N
+bipolar B AY P OW L ER
+bippus B IH P AH S
+bir B ER
+biracial B AY R EY SH AH L
+birch B ER CH
+birch's B ER CH IH Z
+birchall B ER K AH L
+birchard B ER K ER D
+bircher B ER CH ER
+birchett B ER CH IH T
+birchfield B ER CH F IY L D
+birchler B ER K AH L ER
+birchler(2) B ER K L ER
+birchmeier B ER K M AY ER
+birckhead B ER K HH EH D
+bird B ER D
+bird's B ER D Z
+birdbrain B ER D B R EY N
+birdcage B ER D K EY JH
+birddog B ER D D AW G
+birddog(2) B ER D AW G
+birden B ER D AH N
+birder B ER D ER
+birders B ER D ER Z
+birdfeather B ER D F EH DH ER
+birdfeather's B ER D F EH DH ER Z
+birdfeathers B ER D F EH DH ER Z
+birdfeeder B ER D F IY D ER
+birdfeeder's B ER D F IY D ER Z
+birdfeeders B ER D F IY D ER Z
+birdfinder B ER D F AY N D ER
+birdhouse B ER D HH AW S
+birdhouses B ER D HH AW S IH Z
+birdie B ER D IY
+birdied B ER D IY D
+birdies B ER D IY Z
+birdlife B ER D L AY F
+birdlike B ER D L AY K
+birdman B ER D M AE N
+birds B ER D Z
+birds' B ER D Z
+birdsall B ER D Z AO L
+birdseed B ER R D S IY D
+birdsell B ER D S AH L
+birdseye B ER D Z AY
+birdsong B ER D S AO NG
+birdwatcher B ER D W AA CH ER
+birdwatchers B ER D W AA CH ER Z
+birdwatching B ER D W AA CH IH NG
+birdwell B ER D W EH L
+birdy B ER D IY
+bireme B AY R IY M
+biremes B AY R IY M Z
+birenbaum B AY R AH N B AW M
+bires B AY R Z
+birge B ER JH
+birinyi B IH R IY N Y IY
+birk B ER K
+birkedal B ER K AH D AA L
+birkel B ER K AH L
+birkeland B ER K L AH N D
+birkenau B ER K AH N AW
+birkes B ER K S
+birkett B ER K IH T
+birkey B ER K IY
+birkhead B ER K HH EH D
+birkhimer B ER K HH IH M ER
+birkholz B ER K HH OW L Z
+birkland B ER K L AH N D
+birkner B ER K N ER
+birks B ER K S
+birky B ER K IY
+birle B ER L
+birley B ER L IY
+birman B ER M AH N
+birmid B ER M IH D
+birmid's B ER M IH D Z
+birmingham B ER M IH NG HH AE M
+birnbaum B ER N B AW M
+birney B ER N IY
+birnie B ER N IY
+biro B IH R OW
+biron B AY R AH N
+biros B AY R OW Z
+birr B ER
+birren B ER AH N
+birt B ER T
+birtcher B ER CH ER
+birth B ER TH
+birthday B ER TH D EY
+birthdays B ER TH D EY Z
+birthing B ER TH IH NG
+birthmark B ER TH M AA R K
+birthmarks B ER TH M AA R K S
+birthplace B ER TH P L EY S
+birthplaces B ER TH P L EY S IH Z
+birthrate B ER TH R EY T
+birthrates B ER TH R EY T S
+birthright B ER TH R AY T
+birthrights B ER TH R AY T S
+births B ER TH S
+birtle B ER T AH L
+birtley B ER T L IY
+birtley's B ER T L IY Z
+bis B IH S
+bisaillon B AY S AH L AA N
+bisbee B IH S B IY
+bisbing B IH S B IH NG
+biscardi B IH S K AA R D IY
+biscayne B IH S K EY N
+bisceglia B IH S CH EH G L IY AH
+bisch B IH SH
+bischel B IH SH AH L
+bischof B IH SH AH F
+bischofberger B IH SH AO F B ER G ER
+bischoff B IH S K HH AO F
+biscoe B IH S K OW
+biscotti B IH S K AO T IY
+biscuit B IH S K AH T
+biscuits B IH S K AH T S
+bise B AY Z
+bisek B IH S IH K
+bisel B IH S AH L
+biser B AY Z ER
+bisesi B IH S EH S IY
+bisexual B AY S EH K SH UW AH L
+bisexuality B AY S EH K SH UW AE L AH T IY
+bisexuals B AY S EH K SH UW AH L Z
+bish B IH SH
+bisher B IH SH ER
+bishoff B IH S HH AO F
+bishop B IH SH AH P
+bishop's B IH SH AH P S
+bishoprics B IH SH AH P R IH K S
+bishops B IH SH AH P S
+bishops' B IH SH AA P S
+bishopsgate B IH SH AH P S G EY T
+bisiani B IH S IY AA N IY
+bisig B IH S IH G
+bisignano B IH S IY G N AA N OW
+biskup B IH S K AH P
+bismarck B IH Z M AA R K
+bismarck's B IH Z M AA R K S
+bismark B IH Z M AA R K
+bismuth B IH Z M AH TH
+bison B AY S AH N
+bisping B IH S P IH NG
+bisque B IH S K
+biss B IH S
+bissell B IH S AH L
+bissen B IH S AH N
+bisset B IH S IH T
+bissett B IH S IH T
+bissette B IH S EH T
+bissey B IH S IY
+bissinger B IH S IH N JH ER
+bisso B IY S OW
+bisson B IH S AH N
+bissonette B IH S AH N EH T
+bissonnette B IH S AH N EH T
+bistline B IH S T L AY N
+bistodeau B IH S T AH D OW
+bistro B IH S T R OW
+bisuteki B IY S UW T EY K IY
+bisuteki's B IY S UW T EY K IY Z
+bit B IH T
+bitar B IH T ER
+bitch B IH CH
+bitches B IH CH IH Z
+bitchiness B IH CH IY N AH S
+bitchy B IH CH IY
+bite B AY T
+biter B AY T ER
+bites B AY T S
+bitesize B IH T S AY Z
+bither B IH DH ER
+biting B AY T IH NG
+bitler B AY T AH L ER
+bitler(2) B AY T L ER
+bitner B IH T N ER
+bitney B IH T N IY
+bits B IH T S
+bitsy B IH T S IY
+bittel B IH T AH L
+bitten B IH T AH N
+bittenbender B IH T IH N B EH N D ER
+bitter B IH T ER
+bitterest B IH T ER AH S T
+bitterly B IH T ER L IY
+bitterman B IH T ER M AH N
+bitterman's B IH T ER M AH N Z
+bittermann B IH T ER M AH N
+bittermann's B IH T ER M AH N Z
+bitterness B IH T ER N AH S
+bitterroot B IH T ER R UW T
+bitters B IH T ER Z
+bittersweet B IH T ER S W IY T
+bittick B IH T IH K
+bitting B IH T IH NG
+bittinger B IH T IH NG ER
+bittle B IH T AH L
+bittman B IH T M AH N
+bittner B IH T N ER
+bitton B IH T AH N
+bitty B IH T IY
+bitumen B IH T UW M AH N
+bitumen(2) B AY T UW M AH N
+bituminous B IH T UW M AH N AH S
+bitz B IH T S
+bitzer B IH T Z ER
+bivalve B AY V AE L V
+bivalves B AY V AE L V Z
+biven B AY V AH N
+bivens B AY V AH N Z
+biviano B IY V IY AA N OW
+bivin B IH V IH N
+bivins B IH V IH N Z
+bivona B IH V OW N AH
+bivouac B IH V W AE K
+biweekly B AY W IY K L IY
+bix B IH K S
+bixby B IH K S B IY
+bixel B IH K S AH L
+bixler B IH K S L ER
+biz B IH Z
+bizango B IH Z AE NG G OW
+bizarre B AH Z AA R
+bizarre(2) B IH Z AA R
+bizet B IH Z EH T
+bizmart B IH Z M AA R T
+bizub B IH Z AH B
+bizzaro B IH Z AA R OW
+bizzell B IH Z AH L
+bizzy B IH Z IY
+bjelasnica B Y EH L AE S N IH K AH
+bjelland B Y EH L AH N D
+bjerke B Y ER K
+bjoern B Y AO R N
+bjorge B Y AO R G
+bjork B Y AO R K
+bjorklund B Y AO R K L AH N D
+bjorkman B Y AO R K M AH N
+bjorn B Y AO R N
+bjornstad B Y AO R N S T AH D
+blachly B L AA CH L IY
+blachly(2) B L AA K L IY
+black B L AE K
+black's B L AE K S
+blackard B L AE K ER D
+blackball B L AE K B AO L
+blackberries B L AE K B EH R IY Z
+blackberry B L AE K B EH R IY
+blackbird B L AE K B ER D
+blackbirds B L AE K B ER D Z
+blackboard B L AE K B AO R D
+blackboards B L AE K B AO R D Z
+blackburn B L AE K B ER N
+blacked B L AE K T
+blacken B L AE K AH N
+blackened B L AE K AH N D
+blackening B L AE K AH N IH NG
+blackening(2) B L AE K N IH NG
+blackens B L AE K AH N Z
+blacker B L AE K ER
+blackerby B L AE K ER B IY
+blackest B L AE K AH S T
+blacketer B L AE K IY T ER
+blackett B L AE K IH T
+blackfoot B L AE K F UH T
+blackford B L AE K F ER D
+blackham B L AE K HH AH M
+blackhawk B L AE K HH AO K
+blackhawk's B L AE K HH AO K S
+blackhawks B L AE K HH AO K S
+blackheath B L AE K HH IY TH
+blackhurst B L AE K HH ER S T
+blackie B L AE K IY
+blackjack B L AE K JH AE K
+blackledge B L AE K L EH JH
+blackley B L AE K L IY
+blacklist B L AE K L IH S T
+blacklisted B L AE K L IH S T IH D
+blacklisting B L AE K L IH S T IH NG
+blacklock B L AE K L AA K
+blackmail B L AE K M EY L
+blackmailed B L AE K M EY L D
+blackmailing B L AE K M EY L IH NG
+blackman B L AE K M AH N
+blackmer B L AE K M ER
+blackmon B L AE K M AH N
+blackmore B L AE K M AO R
+blackmun B L AE K M AH N
+blackmun's B L AE K M AH N Z
+blackness B L AE K N AH S
+blackout B L AE K AW T
+blackouts B L AE K AW T S
+blackpool B L AE K P UW L
+blackrock B L AE K R AA K
+blacks B L AE K S
+blacks' B L AE K S
+blacksburg B L AE K S B ER G
+blackshear B L AE K SH IH R
+blacksher B L AE K SH ER
+blackshire B L AE K SH AY R
+blacksmith B L AE K S M IH TH
+blackson B L AE K S AH N
+blackstock B L AE K S T AA K
+blackston B L AE K S T AH N
+blackstone B L AE K S T OW N
+blackstone's B L AE K S T OW N Z
+blacktop B L AE K T AA P
+blackwelder B L AE K W EH L D ER
+blackwell B L AE K W EH L
+blackwood B L AE K W UH D
+bladder B L AE D ER
+bladders B L AE D ER Z
+blade B L EY D
+bladed B L EY D IH D
+bladen B L EY D AH N
+blades B L EY D Z
+blading B L EY D IH NG
+bladow B L AE D OW
+blaese B L EY Z
+blaesing B L EH S IH NG
+blagden B L AE G D AH N
+blagg B L AE G
+blah B L AA
+blaha B L AA HH AH
+blahnik B L AA N IH K
+blahut B L AE HH AH T
+blaich B L EY CH
+blaikie B L EY K IY
+blain B L EY N
+blaine B L EY N
+blair B L EH R
+blair's B L EH R Z
+blais B L EH Z
+blaisdell B L EY S D AH L
+blaise B L EY Z
+blaiser B L EY Z ER
+blaize B L EY Z
+blake B L EY K
+blake's B L EY K S
+blakeley B L EY K L IY
+blakeley's B L EY K L IY Z
+blakely B L EY K L IY
+blakely's B L EY K L IY Z
+blakeman B L EY K M AH N
+blakemore B L EY K M AO R
+blakeney B L EY K N IY
+blakeney's B L EY K N IY Z
+blakenham B L EY K AH N HH AE M
+blakenship B L EY K AH N SH IH P
+blaker B L EY K ER
+blakes B L EY K S
+blakeslee B L EY K S L IY
+blakesley B L EY K S L IY
+blakey B L EY K IY
+blakley B L AE K L IY
+blakney B L AE K N IY
+blalack B L AE L AH K
+blalock B L AE L AA K
+blame B L EY M
+blamed B L EY M D
+blameless B L EY M L AH S
+blames B L EY M Z
+blaming B L EY M IH NG
+blampied B L AE M P IY D
+blan B L AE N
+blanc B L AE NG K
+blanca B L AA NG K AH
+blancett B L AE N S IH T
+blanch B L AE N CH
+blanchard B L AE N CH ER D
+blanchard's B L AE N CH ER D Z
+blanchards B L AE N CH ER D Z
+blanche B L AE N CH
+blanchet B L AE N K IH T
+blanchett B L AE N CH IH T
+blanchette B L AH N SH EH T
+blanchfield B L AE N CH F IY L D
+blanck B L AE NG K
+blanco B L AE NG K OW
+bland B L AE N D
+blanda B L AE N D AH
+blander B L AE N D ER
+blandford B L AE N D F AO R D
+blandin B L AE N D IH N
+blanding B L AE N D IH NG
+blandino B L AA N D IY N OW
+blandishment B L AE N D IH SH M AH N T
+blandishments B L AE N D IH SH M AH N T S
+blandly B L AE N D L IY
+blandness B L AE N D N AH S
+blando B L AE N D OW
+blandon B L AE N D IH N
+blane B L EY N
+blaney B L EY N IY
+blanford B L AE N F ER D
+blank B L AE NG K
+blanke B L AE NG K
+blanked B L AE NG K T
+blanken B L AE NG K AH N
+blankenbaker B L AE NG K AH N B EY K ER
+blankenbeckler B L AE NG K AH N B EH K L ER
+blankenburg B L AE NG K AH N B ER G
+blankenhorn B L AE NG K IH N HH ER N
+blankenship B L AE NG K AH N SH IH P
+blanket B L AE NG K AH T
+blanket(2) B L AE NG K IH T
+blanketed B L AE NG K AH T IH D
+blanketing B L AE NG K AH T IH NG
+blankets B L AE NG K AH T S
+blanking B L AE NG K IH NG
+blankinship B L AE NG K IH N SH IH P
+blankley B L AE NG K L IY
+blankly B L AE NG K L IY
+blankly's B L AE NG K L IY Z
+blanks B L AE NG K S
+blann B L AE N
+blanquita B L AA N K IY T AH
+blansett B L AE N S IH T
+blanton B L AE N T AH N
+blare B L EH R
+blared B L EH R D
+blares B L EH R Z
+blaring B L EH R IH NG
+blas B L AA S
+blaschke B L AE SH K
+blasco B L AA S K OW
+blasdel B L AE S D AH L
+blasdell B L AE S D AH L
+blase B L EY Z
+blaser B L EY Z ER
+blasi B L EY Z IY
+blasia B L AA S IY AH
+blasier B L EY Z IY ER
+blasier's B L EY Z IY ER Z
+blasier's(2) B L EY ZH ER Z
+blasier(2) B L EY ZH ER
+blasing B L EY Z IH NG
+blasingame B L AA S IH NG G AA M IY
+blasini B L AH S IY N IY
+blasius B L EY S IY IH S
+blaske B L EY S K
+blasko B L AA S K OW
+blasphemous B L AE S F AH M AH S
+blasphemy B L AE S F AH M IY
+blass B L AE S
+blassie B L AE S IY
+blassie's B L AE S IY Z
+blassingame B L AA S IH NG G AA M IY
+blast B L AE S T
+blastdown B L AE S T D AW N
+blasted B L AE S T AH D
+blasted(2) B L AE S T IH D
+blaster B L AE S T ER
+blastfurnace B L AE S T F ER N AH S
+blasting B L AE S T IH NG
+blastoderm B L AE S T AH D ER M
+blastoff B L AE S T AO F
+blasts B L AE S T S
+blaszak B L AA SH AH K
+blaszczyk B L AA SH CH IH K
+blatant B L EY T AH N T
+blatantly B L EY T AH N T L IY
+blatchford B L AE CH F ER D
+blatchley B L AE CH L IY
+blather B L AE DH ER
+blatnik B L AE T N IH K
+blatt B L AE T
+blatter B L AE T ER
+blattner B L AE T N ER
+blatz B L AE T S
+blau B L AW
+blauch B L AO CH
+blauer B L AW R
+blaum B L AO M
+blauser B L AW S ER
+blaustein B L AW S T AY N
+blaustein(2) B L AW S T IY N
+blauvelt B L AW V IH L T
+blay B L EY
+blaydes B L EY D Z
+blaydon B L EY D AH N
+blaylock B L EY L AH K
+blayne B L EY N
+blayney B L EY N IY
+blayze B L EY Z
+blaze B L EY Z
+blazed B L EY Z D
+blazejewski B L AH Z EY EH F S K IY
+blazek B L AA Z EH K
+blazer B L EY Z ER
+blazers B L EY Z ER Z
+blazes B L EY Z IH Z
+blazier B L EY Z IY ER
+blazina B L AA Z IY N AH
+blazing B L EY Z IH NG
+blea B L IY
+bleach B L IY CH
+bleached B L IY CH T
+bleacher B L IY CH ER
+bleachers B L IY CH ER Z
+bleaching B L IY CH IH NG
+bleak B L IY K
+bleaker B L IY K ER
+bleakest B L IY K AH S T
+bleakley B L IY K L IY
+bleakness B L IY K N AH S
+bleakney B L IY K N IY
+bleam B L IY M
+bleary B L IH R IY
+bleau B L OW
+blech B L EH K
+blech's B L EH K S
+blecha B L EH CH AH
+blecher B L EH K ER
+blechley B L EH K L IY
+blechman B L EH K M AH N
+bleck B L EH K
+blecker B L EH K ER
+bled B L EH D
+bledsoe B L EH D S OW
+bleecker B L IY K ER
+bleed B L IY D
+bleeding B L IY D IH NG
+bleeds B L IY D Z
+bleeker B L IY K ER
+bleep B L IY P
+bleeping B L IY P IH NG
+blegen B L EH G AH N
+blehm B L EH M
+bleich B L AY K
+bleicher B L AY K ER
+bleier B L AY ER
+bleil B L IY L
+bleiler B L AY L ER
+bleilers B L AY L ER Z
+blelloch B L EH L AA K
+blemish B L EH M IH SH
+blemished B L EH M IH SH T
+blemishes B L EH M IH SH IH Z
+blend B L EH N D
+blenda B L EH N D AH
+blendax B L EH N D AE K S
+blended B L EH N D AH D
+blended(2) B L EH N D IH D
+blender B L EH N D ER
+blenders B L EH N D ER Z
+blending B L EH N D IH NG
+blends B L EH N D Z
+blenheim B L EH N HH AY M
+blepharisma B L EH F ER IH Z M AH
+bleser B L IY Z ER
+bless B L EH S
+blessed B L EH S T
+blessedly B L EH S AH D L IY
+blessedness B L EH S AH D N AH S
+blesses B L EH S IH Z
+blessing B L EH S IH NG
+blessinger B L EH S IH NG ER
+blessings B L EH S IH NG Z
+blessington B L EH S IH NG T AH N
+blest B L EH S T
+blethen B L EH TH AH N
+bleu B L UW
+blevens B L IY V AH N Z
+blevins B L EH V IH N Z
+blew B L UW
+blewett B L UW IH T
+blewitt B L UW IH T
+bley B L EY
+blick B L IH K
+blickenstaff B L IH K IH N S T AH F
+blida B L AY D AH
+bligh B L AY
+blight B L AY T
+blighted B L AY T IH D
+bliley B L AY L IY
+blimp B L IH M P
+blimps B L IH M P S
+blincoe B L IH N K OW
+blind B L AY N D
+blinded B L AY N D IH D
+blinder B L AY N D ER
+blinder's B L AY N D ER Z
+blinders B L AY N D ER Z
+blindfold B L AY N D F OW L D
+blindfolded B L AY N D F OW L D IH D
+blinding B L AY N D IH NG
+blindly B L AY N D L IY
+blindness B L AY N D N AH S
+blindness(2) B L AY N N AH S
+blinds B L AY N D Z
+blindside B L AY N D S AY D
+blindsided B L AY N D S AY D IH D
+blink B L IH NG K
+blinked B L IH NG K T
+blinking B L IH NG K IH NG
+blinks B L IH NG K S
+blinn B L IH N
+blip B L IH P
+blips B L IH P S
+bliscoll B L IH S K AO L
+blish B L IH SH
+bliss B L IH S
+bliss' B L IH S
+blissett B L IH S IH T
+blissful B L IH S F AH L
+blissfully B L IH S F AH L IY
+blister B L IH S T ER
+blistered B L IH S T ER D
+blistering B L IH S T ER IH NG
+blisters B L IH S T ER Z
+blitch B L IH CH
+blithe B L AY DH
+blithely B L AY TH L IY
+blitstein B L IH T S T IY N
+blitstein(2) B L IH T S T AY N
+blitz B L IH T S
+blitzed B L IH T S T
+blitzen B L IH T S AH N
+blitzer B L IH T S ER
+blitzer's B L IH T S ER Z
+blitzes B L IH T S IH Z
+blitzkrieg B L IH T S K R IY G
+bliven B L AY V AH N
+blixt B L IH K S T
+blizard B L IH Z ER D
+blizzard B L IH Z ER D
+blizzards B L IH Z ER D Z
+bloat B L OW T
+bloated B L OW T IH D
+bloatedness B L OW T IH D N AH S
+bloating B L OW T IH NG
+bloats B L OW T S
+blob B L AA B
+blobby B L AA B IY
+blobs B L AA B Z
+bloc B L AA K
+bloc's B L AA K S
+bloch B L AA K
+bloch's B L AA K S
+blocher B L AA K ER
+block B L AA K
+block's B L AA K S
+blockade B L AA K EY D
+blockaded B L AA K EY D IH D
+blockader B L AA K EY D ER
+blockaders B L AA K EY D ER Z
+blockades B L AA K EY D Z
+blockading B L AA K EY D IH NG
+blockage B L AA K IH JH
+blockages B L AA K IH JH IH Z
+blockbuster B L AA K B AH S T ER
+blockbuster's B L AA K B AH S T ER Z
+blockbusters B L AA K B AH S T ER Z
+blocked B L AA K T
+blocker B L AA K ER
+blockers B L AA K ER Z
+blockhead B L AA K HH EH D
+blockheads B L AA K HH EH D Z
+blockhouse B L AA K HH AW S
+blockhouses B L AA K HH AW S AH Z
+blocking B L AA K IH NG
+blocks B L AA K S
+blocs B L AA K S
+blodgett B L AA JH IH T
+bloedel B L OW D AH L
+bloedorn B L OW D ER N
+bloem B L OW M
+bloemer B L OW M ER
+bloemker B L OW M K ER
+blohm B L OW M
+blok B L AA K
+bloke B L OW K
+blokes B L OW K S
+blom B L AA M
+blomberg B L AA M B ER G
+blome B L OW M
+blomgren B L AA M G R EH N
+blomquist B L AA M K W IH S T
+blomstrom B L AA M S T R AH M
+blond B L AA N D
+blonde B L AA N D
+blonde's B L AA N D Z
+blondell B L AA N D AH L
+blonder B L AA N D ER
+blondes B L AA N D Z
+blondest B L AA N D AH S T
+blondie B L AA N D IY
+blondin B L AA N D IH N
+blonds B L AA N D Z
+blood B L AH D
+blood's B L AH D Z
+bloodbath B L AH D B AE TH
+blooded B L AH D IH D
+bloodgood B L AH D G UH D
+bloodhound B L AH D HH AW N D
+bloodhounds B L AH D HH AW N D Z
+bloodhounds(2) B L AH D HH AW N Z
+bloodied B L AH D IY D
+bloodier B L AH D IY ER
+bloodiest B L AH D IY AH S T
+bloodless B L AH D L AH S
+bloodletting B L AH D L EH T IH NG
+bloodline B L AH D L AY N
+bloodlines B L AH D L AY N Z
+bloods B L AH D Z
+bloodshed B L AH D SH EH D
+bloodstain B L AH D S T EY N
+bloodstained B L AH D S T EY N D
+bloodstains B L AH D S T EY N Z
+bloodstone B L AH D S T OW N
+bloodstream B L AH D S T R IY M
+bloodsucker B L AH D S AH K ER
+bloodsuckers B L AH D S AH K ER Z
+bloodsucking B L AH D S AH K IH NG
+bloodsworth B L AH D Z W ER TH
+bloodthirsty B L AH D TH ER S T IY
+bloodworth B L AH D W ER TH
+bloody B L AH D IY
+bloom B L UW M
+bloom's B L UW M Z
+bloomberg B L UW M B ER G
+bloomberg's B L UW M B ER G Z
+bloomed B L UW M D
+bloomer B L UW M ER
+bloomers B L UW M ER Z
+bloomfield B L UW M F IY L D
+blooming B L UW M IH NG
+bloomingdale B L UW M IH NG D EY L
+bloomingdale's B L UW M IH NG D EY L Z
+bloomingdales B L UW M IH NG D EY L Z
+bloomington B L UW M IH NG T AH N
+bloomquist B L UW M K W IH S T
+blooms B L UW M Z
+blooper B L UW P ER
+bloopers B L UW P ER Z
+bloor B L UH R
+blose B L OW Z
+bloss B L AO S
+blosser B L AO S ER
+blossom B L AA S AH M
+blossomed B L AA S AH M D
+blossoming B L AA S AH M IH NG
+blossoms B L AA S AH M Z
+blot B L AA T
+blotch B L AA T CH
+blotched B L AA T CH T
+blotches B L AA T CH AH Z
+blotchier B L AA T CH IY ER
+blotchiest B L AA T CH IY AH S T
+blotching B L AA T CH IH NG
+blotchy B L AA T CH IY
+blotnick B L AA T N IH K
+blots B L AA T S
+blotted B L AA T AH D
+blotter B L AA T ER
+blotting B L AA T IH NG
+blouch B L AW CH
+blough B L AW
+blouin B L W IY N
+blount B L AW N T
+blouse B L AW S
+blouses B L AW S AH Z
+blouses(2) B L AW S IH Z
+blow B L OW
+blowdried B L OW D R AY D
+blowdries B L OW D R AY Z
+blowdry B L OW D R AY
+blowdryer B L OW D R AY ER
+blowdryers B L OW D R AY ER Z
+blowdrying B L OW D R AY IH NG
+blowe B L OW
+blowed B L OW D
+blower B L OW ER
+blowers B L OW ER Z
+blowfish B L OW F IH SH
+blowgun B L OW G AH N
+blowguns B L OW G AH N Z
+blowhard B L OW HH AA R D
+blowhards B L OW HH AA R D Z
+blowhole B L OW HH OW L
+blowholes B L OW HH OW L Z
+blowier B L OW IY ER
+blowiest B L OW IY AH S T
+blowing B L OW IH NG
+blown B L OW N
+blowout B L OW AW T
+blowouts B L OW AW T S
+blowpipe B L OW P AY P
+blowpipes B L OW P AY P S
+blows B L OW Z
+blowtorch B L OW T AO R CH
+blowtorches B L OW T AO R CH AH Z
+blowup B L OW AH P
+blowy B L OW IY
+bloxham B L AA K S AH M
+bloxom B L AA K S AH M
+bloxsom B L AA K S AH M
+bloyd B L OY D
+bloyer B L OY ER
+blubaugh B L AH B AO
+blubber B L AH B ER
+bludgeon B L AH JH AH N
+bludgeoned B L AH JH AH N D
+bludgeoning B L AH JH AH N IH NG
+blue B L UW
+blue's B L UW Z
+bluebeard B L UW B IY R D
+bluebell B L UW B EH L
+bluebells B L UW B EH L Z
+blueberries B L UW B EH R IY Z
+blueberry B L UW B EH R IY
+bluebird B L UW B ER D
+bluebirds B L UW B ER D Z
+blueblood B L UW B L AH D
+blueblooded B L UW B L AH D AH D
+bluebloods B L UW B L AH D Z
+bluebonnet B L UW B AA N AH T
+bluebonnets B L UW B AA N AH T S
+bluebottle B L UW B AO T AH L
+bluebottles B L UW B AO T AH L Z
+bluechip B L UW CH IH P
+bluecollar B L UW K AO L ER
+blued B L UW D
+blueeyed B L UW AY D
+bluefield B L UW F IY L D
+bluegrass B L UW G R AE S
+blueing B L UW IH NG
+blueish B L UW IH SH
+bluejay B L UW JH EY
+bluejeans B L UW JH IY N Z
+bluelaw B L UW L AA
+bluemel B L UH M AH L
+blueness B L UW N AH S
+bluepencil B L UW P EH N S AH L
+bluepencilled B L UW P EH N S AH L D
+bluepencilling B L UW P EH N S AH L IH NG
+bluepencils B L UW P EH N S AH L Z
+blueprint B L UW P R IH N T
+blueprints B L UW P R IH N T S
+bluer B L UW ER
+blues B L UW Z
+blues' B L UW Z
+bluest B L UW AH S T
+bluestein B L UH S T AY N
+bluestein(2) B L UH S T IY N
+bluestine B L UW S T AY N
+bluestone B L UW S T OW N
+bluesy B L UW Z IY
+bluesy(2) B L UW AH S IY
+bluett B L UW T
+bluey B L UW IY
+bluff B L AH F
+bluffed B L AH F T
+bluffer B L AH F ER
+bluffing B L AH F IH NG
+bluffs B L AH F S
+bluford B L UW F ER D
+bluhdorn B L AH D AO R N
+bluhm B L AH M
+bluing B L UW IH NG
+bluish B L UW IH SH
+bluitt B L UW T
+blum B L UW M
+blumberg B L AH M B ER G
+blume B L UW M
+blumenberg B L UW M EH N B ER G
+blumenfeld B L UW M IH N F EH L D
+blumenschein B L AH M IH N SH AY N
+blumenshine B L AH M IH N SH AY N
+blumenstein B L UW M EH N S T AY N
+blumenstein(2) B L UW M EH N S T IY N
+blumenstock B L UW M EH N S T AA K
+blumenthal B L UW M AH N TH AO L
+blumer B L UW M ER
+blumquist B L AH M K W IH S T
+blumstein B L AH M S T AY N
+blumstein(2) B L AH M S T IY N
+blunck B L AH NG K
+blundall B L AH N D AH L
+blundell B L AH N D AH L
+blunder B L AH N D ER
+blundered B L AH N D ER D
+blundering B L AH N D ER IH NG
+blunders B L AH N D ER Z
+blunk B L AH NG K
+blunt B L AH N T
+blunted B L AH N T AH D
+blunted(2) B L AH N T IH D
+blunter B L AH N T ER
+bluntest B L AH N T AH S T
+blunting B L AH N T IH NG
+bluntly B L AH N T L IY
+bluntness B L AH N T N AH S
+blunts B L AH N T S
+blur B L ER
+blurb B L ER B
+blurbs B L ER B Z
+blurred B L ER D
+blurring B L ER IH NG
+blurry B L ER IY
+blurs B L ER Z
+blurt B L ER T
+blurted B L ER T IH D
+blurton B L ER T AH N
+blurts B L ER T S
+blush B L AH SH
+blushed B L AH SH T
+blushes B L AH SH AH Z
+blushes(2) B L AH SH IH Z
+blushing B L AH SH IH NG
+blust B L AH S T
+bluster B L AH S T ER
+blustering B L AH S T ER IH NG
+blustery B L AH S T ER IY
+bluth B L UW TH
+blvd B UH L AH V AA R D
+bly B L AY
+blye B L AY
+blyler B L AY L ER
+blystone B L AY S T OW N
+blyth B L IH TH
+blythe B L AY DH
+bo B OW
+bo-shek B OW SH EH K
+boa B OW AH
+boak B OW K
+boake B OW K
+boal B OW L
+boals B OW L Z
+boan B OW N
+boar B AO R
+board B AO R D
+board's B AO R D Z
+boarda B AO R D AH
+boardbent B AO R D B EH N T
+boarded B AO R D AH D
+boarded(2) B AO R D IH D
+boarder B AO R D ER
+boarders B AO R D ER Z
+boardgame B AO R D G EY M
+boardgames B AO R D G EY M Z
+boarding B AO R D IH NG
+boardinghouse B AO R D IH NG HH AW S
+boardinghouses B AO R D IH NG HH AW S IH Z
+boardingpass B AO R D IH N G P AE S
+boardingpasses B AO R D IH N G P AE S IH Z
+boardings B AO R D IH NG Z
+boardman B AO R D M AH N
+boardroom B AO R D R UW M
+boardrooms B AO R D R UW M Z
+boards B AO R D Z
+boardwalk B AO R D W AO K
+boardwalks B AO R D W AO K S
+boarman B AO R M AH N
+boart B AO R T
+boas B OW AH Z
+boase B OW Z
+boast B OW S T
+boasted B OW S T AH D
+boasted(2) B OW S T IH D
+boastful B OW S T F AH L
+boasting B OW S T IH NG
+boasts B OW S T S
+boasts(2) B OW S S
+boasts(3) B OW S
+boat B OW T
+boat's B OW T S
+boated B OW T IH D
+boaters B OW T ER Z
+boathouse B OW T HH AW S
+boating B OW T IH NG
+boatlift B OW T L IH F T
+boatlift's B OW T L IH F T S
+boatlifts B OW T L IH F T S
+boatload B OW T L OW D
+boatloads B OW T L OW D Z
+boatman B OW T M AH N
+boatmen's B OW T M EH N Z
+boatner B OW T N ER
+boatright B OW T R AY T
+boats B OW T S
+boatswain B OW T S W EY N
+boatwright B OW T R AY T
+boatyard B OW T Y AA R D
+boaz B OW AE Z
+bob B AA B
+bob's B AA B Z
+boback B OW B AE K
+bobadilla B OW B AA D IH L AH
+bobak B OW B AH K
+bobb B AA B
+bobber B AA B ER
+bobbett B AA B IH T
+bobbette B AA B EH T
+bobbi B AA B IY
+bobbie B AA B IY
+bobbin B AA B AH N
+bobbing B AA B IH NG
+bobbinger B AA B IH NG ER
+bobbinger's B AA B IH NG ER Z
+bobbitt B AA B IH T
+bobbitt's B AA B IH T S
+bobbitts B AA B IH T S
+bobble B AO B AH L
+bobbled B AO B AH L D
+bobbles B AO B AH L Z
+bobbling B AO B L IH NG
+bobbo B AA B OW
+bobby B AA B IY
+bobby's B AA B IY Z
+bobcat B AA B K AE T
+bobcats B AA B K AE T Z
+bobe B OW B
+bobeck B OW B EH K
+bobek B OW B IH K
+bober B AA B ER
+boberg B OW B ER G
+bobick B AA B IH K
+bobier B OW B IY ER
+bobinski B AH B IH N S K IY
+boblitt B AH B L IH T
+bobo B OW B OW
+bobolas B OW B OW L AH S
+bobrow B AA B R OW
+bobrowski B AH B R AO F S K IY
+bobsled B AA B S L EH D
+bobst B AA B S T
+bobzien B AA B Z IY N
+boca B OW K AH
+bocanegra B OW K AH N EH G R AH
+bocce B OW CH IY
+bocce(2) B OW K AH
+bocchino B OW K IY N OW
+boccia B OW CH AH
+boccio B OW CH IY OW
+boccuzzi B OW K UW T S IY
+bocek B OW CH EH K
+boch B AA K
+bocharov B AA CH ER AA V
+bochco B AA CH K OW
+boche B AA CH
+bochenek B AA K IH N IH K
+boches B AA CH IH Z
+bochicchio B OW K IY K IY OW
+bochner B AA K N ER
+bochram B AA K R AH M
+bocian B OW SH AH N
+bock B AA K
+bockelman B AA K AH L M AH N
+bockius B AA K IY AH S
+bockman B AA K M AH N
+bockus B AA K AH S
+bocock B AA K AH K
+bocook B AA K UH K
+bocuse B OW K Y UW Z
+boda B OW D AH
+bodamer B AA D AH M ER
+bodanis B OW D AA N IH S
+bodden B AA D AH N
+boddie B AA D IY
+boddington B AA D IH NG T AH N
+boddy B AA D IY
+bode B OW D
+bodega B OW D EY G AH
+bodegas B OW D EY G AH S
+bodeguita B OW D EH G IY D AH
+bodeguita(2) B OW D AH G IY D AH
+bodell B AH D EH L
+boden B OW D AH N
+bodenhamer B AA D IH N HH AH M ER
+bodenhamer(2) B OW D IH N HH AH M ER
+bodenheimer B AA D IH N HH AY M ER
+bodenstein B OW D AH N S T AY N
+bodenstein(2) B OW D AH N S T IY N
+bodensteiner B OW D AH N S T AY N ER
+bodes B OW D Z
+bodey B OW D IY
+bodhisattvas B OW D IH S AA T V AH S
+bodi B OW D IY
+bodice B AA D IH S
+bodices B AA D IH S IH Z
+bodie B OW D IY
+bodied B AA D IY D
+bodies B AA D IY Z
+bodikova B AA D IH K OW V AH
+bodily B AA D AH L IY
+bodin B OW D IH N
+bodine B OW D IY N IY
+bodkin B AA D K IH N
+bodkins B AA D K IH N Z
+bodle B OW D AH L
+bodley B AA D L IY
+bodman B AA D M AH N
+bodmer B AA D M ER
+bodnar B AH D N AA R
+bodner B AA D N ER
+bodo B OW D OW
+bodwell B AA D W EH L
+body B AA D IY
+body's B AA D IY Z
+bodyguard B AA D IY G AA R D
+bodyguards B AA D IY G AA R D Z
+bodziak B AO D Z IY AE K
+bodziak's B AO D Z IY AE K S
+boe B OW
+boeck B OW K
+boeckel B OW K AH L
+boecker B OW K ER
+boeckman B OW K M AH N
+boeckmann B OW K M AH N
+boedecker B OW D IH K ER
+boedeker B OW D IH K ER
+boeder B OW D ER
+boeding B OW D IH NG
+boege B OW JH
+boeger B OW G ER
+boeh B OW
+boehl B OW L
+boehle B OW HH AH L
+boehler B OW L ER
+boehlert B OW L ER T
+boehlke B OW L K
+boehm B OW M
+boehm(2) B EY M
+boehme B OW M
+boehme(2) B EY M
+boehmer B OW M ER
+boehmke B OW M K IY
+boehne B OW N
+boehner B OW N ER
+boehning B OW N IH NG
+boehnke B OW NG K
+boehnlein B OW N L AY N
+boehringer B AO R IH NG ER
+boeing B OW IH NG
+boeing's B OW IH NG Z
+boeke B OW K
+boeker B OW K ER
+boelens B OW L AH N Z
+boelkow B OW L K AW
+boelman B OW L M AH N
+boelter B OW L T ER
+boen B OW N
+boenig B OW N IH G
+boening B AA AH N IH NG
+boepple B OW P AH L
+boer B AO R
+boerger B AO R G ER
+boerman B AO R M AH N
+boerner B AO R N ER
+boers B AO R Z
+boersma B AO R S M AH
+boes B OW Z
+boesak B OW Z AE K
+boesch B OW SH
+boeschenstein B OW SH AH N S T IY N
+boeschenstein(2) B OW SH AH N S T AY N
+boese B OW S
+boesel B OW S AH L
+boesen B OW S AH N
+boesky B OW S K IY
+boesky's B OW S K IY Z
+boeskys B OW S K IY Z
+boetcher B OW CH ER
+boettcher B OW CH ER
+boettger B OW T G ER
+boettner B OW T N ER
+boeve B OW V
+boff B AO F
+boffa B AA F AH
+boffo B AO F OW
+bofors B OW F ER Z
+bofors's B OW F ER Z IH Z
+bog B AA G
+bog(2) B AO G
+bogacki B AH G AA T S K IY
+bogacz B AA G AH CH
+bogan B OW G AH N
+bogar B AH G AA R
+bogard B AA G ER D
+bogardus B AA G AA R D IH S
+bogart B OW G AA R T
+bogdan B AA G D AH N
+bogdanoff B AA G D AH N AO F
+bogdanowicz B AH G D AE N AH W IH T Z
+bogdanski B AH G D AE N S K IY
+bogden B AA G D AH N
+bogdon B AA G D AH N
+boge B OW JH
+bogelsong B AA G AH L S AO NG
+bogen B AA G AH N
+bogenschutz B AA G IH N SH AH T S
+boger B OW G ER
+bogert B AA G ER T
+bogey B OW G IY
+bogeyed B OW G IY D
+bogeyman B OW G IY M AE N
+bogeyman(2) B UH G IY M AE N
+bogeymen B OW G IY M IH N
+bogeymen(2) B UH G IY M IH N
+boggan B AA G AH N
+bogged B AA G D
+bogged(2) B AO G D
+boggess B AA G IH S
+bogging B AO G IH NG
+boggio B OW JH IY OW
+boggle B AA G AH L
+boggled B AA G AH L D
+boggles B AA G AH L Z
+boggling B AA G AH L IH NG
+boggling(2) B AA G L IH NG
+boggs B AO G Z
+boggus B AA G AH S
+boghosian B AH G HH AA ZH IH N
+bogie B UH G IY
+bogin B OW JH IH N
+bogle B OW G AH L
+bognar B AH G N AA R
+bogner B AA G N ER
+bogor B OW G AO R
+bogosian B AH G AA ZH IH N
+bogota B OW G AH T AA
+bogs B AA G Z
+bogs(2) B AO G Z
+bogucki B AH G AH T S K IY
+bogue B OW G
+bogus B OW G AH S
+boguslavskaya B OW G AH S L AH V S K AY AH
+bogusz B AA G AH SH
+bohac B OW HH AH K
+bohall B AA HH AH L
+bohan B OW HH AH N
+bohanan B AA HH AH N AE N
+bohannan B AH HH AE N AH N
+bohannon B AA HH AH N AA N
+bohanon B AA HH AH N AA N
+bohart B AA HH AA R T
+boheme B OW HH EY M EY
+bohemia B OW HH IY M IY AH
+bohemian B OW HH IY M IY AH N
+bohen B OW AH N
+bohl B OW L
+bohland B OW L AH N D
+bohlander B OW L AH N D ER
+bohle B OW HH AH L
+bohlen B OW L AH N
+bohler B OW L ER
+bohlin B OW L IH N
+bohling B OW L IH NG
+bohlinger B OW L IH NG ER
+bohlke B AA K
+bohlke(2) B OW L K
+bohlken B OW L K AH N
+bohlman B OW L M AH N
+bohlmann B OW L M AH N
+bohm B AA M
+bohman B OW M AH N
+bohmer B OW M ER
+bohn B OW N
+bohne B OW N
+bohnen B OW N AH N
+bohnenkamp B OW N IH N K AE M P
+bohner B OW N ER
+bohnert B OW N ER T
+bohnet B AA N IH T
+bohnhoff B OW N HH AO F
+bohning B AA N IH NG
+bohnsack B OW N S AH K
+bohon B OW HH AH N
+bohr B AO R
+bohren B AO R AH N
+bohrer B AO R ER
+boice B OY S
+boies B OY Z
+boik B OY K
+boike B OY K
+boil B OY L
+boilard B OY L AA R D
+boileau B OY L OW
+boiled B OY L D
+boiler B OY L ER
+boilermaker B OY L ER M EY K ER
+boilerplate B OY L ER P L EY T
+boilerplates B OY L ER P L EY T S
+boilers B OY L ER Z
+boiling B OY L IH NG
+boils B OY L Z
+boink B OY N K
+boipatong B OY P AH T AO NG
+bois B W AA
+boisclair B W AA K L EH R
+boise B OY Z IY
+boise's B OY Z IY Z
+boise's(2) B OY S IY Z
+boise(2) B OY S IY
+boisen B OY S AH N
+boisi B OY S IY
+boisjoly B OY S JH AH L IY
+boisseau B W AA S OW
+boissonneault B W AA S AH N OW
+boisterous B OY S T ER AH S
+boisterous(2) B OY S T R AH S
+boisvert B W AA V ER T
+boitano B OY T AA N OW
+boitnott B OY T N AA T
+boivin B OY V AE N
+bojangles' B OW JH AE NG G AH L Z
+bojanowski B AH Y AH N AO F S K IY
+bojarski B AH Y AA R S K IY
+bojenka B AH JH EH NG K AH
+bojorquez B OW Y AO R K W EH Z
+bok B AA K
+bokassa B AH K AA S AH
+boker B OW K ER
+bokor B OW K ER
+boksen B AA K S AH N
+bol B AA L
+bola B OW L AH
+bolam B OW L AH M
+bolan B OW L AH N
+bolancik B AH L AE N S AH K
+boland B OW L AH N D
+bolander B AA L AH N D ER
+bolanger B OW L AH N JH ER
+bolanos B OW L AA N OW Z
+bolar B OW L ER
+bolar's B OW L ER Z
+bolch B OW L CH
+bolcom B OW L K AH M
+bold B OW L D
+bolda B OW L D AH
+bolden B OW L D AH N
+bolder B OW L D ER
+boldest B OW L D IH S T
+boldface B OW L D F EY S
+boldin B OW L D IH N
+bolding B OW L D IH NG
+boldly B OW L D L IY
+boldman B OW L D M AH N
+boldness B OW L D N AH S
+boldon B OW L D AH N
+bolds B OW L D Z
+boldt B OW L T
+bolduc B OW L D AH K
+bolduc's B OW L D AH K S
+bole B OW L
+bolek B OW L IH K
+bolen B OW L AH N
+bolenbaugh B AH L EH N B AO
+bolender B AA L EH N D ER
+boler B OW L ER
+bolerjack B AA L ER JH AH K
+bolero B OW L EH R OW
+boles B OW L Z
+boleware B OW L W EH R
+boley B OW L IY
+boleyn B OW L IH N
+bolf B OW L F
+bolger B OW L JH ER
+bolger's B OW L JH ER Z
+bolich B AA L IH K
+bolick B AA L IH K
+boliden B OW L IH D AH N
+bolin B OW L IH N
+boline B AA L AY N
+boling B OW L IH NG
+bolinger B OW L IH NG ER
+bolio B OW L IY OW
+bolitho B OW L IH TH AH
+bolivar B AA L AH V ER
+bolivars B AA L AH V ER Z
+bolivia B AH L IH V IY AH
+bolivia's B AH L IH V IY AH Z
+bolivia(2) B OW L IH V IY AH
+bolivian B OW L IH V IY AH N
+bolivian(2) B AH L IH V IY AH N
+bolivians B OW L IH V IY AH N Z
+bolivians(2) B AH L IH V IY AH N Z
+bolker B OW L K ER
+bolkow B OW L K AW
+boll B OW L
+bolla B AA L AH
+bolland B AA L AH N D
+bollapragada B OW L AA P R AH G AA D AH
+bollard B AA L ER D
+bolle B AA L
+bollen B AA L AH N
+bollenbach B AA L IH N B AA K
+bollenbacher B AA L IH N B AA K ER
+boller B AA L ER
+bolles B OW L Z
+bollettieri B AH L EH T IY EH R IY
+bollier B AA L IY ER
+bollig B AA L IH G
+bolliger B AA L IH G ER
+bollin B AA L IH N
+bolling B OW L IH NG
+bollinger B AA L IH NG ER
+bollman B AA L M AH N
+bollmann B AA L M AH N
+bollore B AA L AO R
+bolls B OW L Z
+bologna B AH L OW N IY
+bolognese B OW L OW G N EY Z IY
+bolognesi B AA L AA G N EH S IY
+bolon B OW L AH N
+bolotin B AA L AH T IH N
+bolsa B OW L S AH
+bolsa's B OW L S AH Z
+bolser B OW L S ER
+bolshevik B OW L SH AH V IH K
+bolsheviks B OW L SH AH V IH K S
+bolshevism B OW L SH AH V IH Z AH M
+bolshevist B OW L SH IH V IH S T
+bolshoi B OW L SH OY
+bolshoi's B OW L SH OY Z
+bolson B OW L S AH N
+bolstad B OW L S T AH D
+bolster B OW L S T ER
+bolstered B OW L S T ER D
+bolstering B OW L S T ER IH NG
+bolsters B OW L S T ER Z
+bolt B OW L T
+bolte B OW L T
+bolted B OW L T AH D
+bolted(2) B OW L T IH D
+bolten B OW L T AH N
+bolter B OW L T ER
+bolthouse B OW L T HH AW S
+bolting B OW L T IH NG
+bolton B OW L T AH N
+bolts B OW L T S
+boltz B OW L T S
+boltzmann's B OW L T S M AH N Z
+boltzmanns B OW L T S M AH N Z
+bolus B OW L AH S
+bolyard B AH L Y AA R D
+bolz B OW L Z
+bom B AA M
+bomag B OW M AE G
+boman B OW M AH N
+bomar B AH M AA R
+bomb B AA M
+bomb's B AA M Z
+bomb(2) B AO M
+bomba B AA M B AH
+bombard B AA M B AA R D
+bombarded B AA M B AA R D IH D
+bombardier B AA M B ER D IH R
+bombardiers B AA M B ER D IH R Z
+bombarding B AA M B AA R D IH NG
+bombardment B AA M B AA R D M AH N T
+bombardments B AA M B AA R D M AH N T S
+bombast B AA M B AE S T
+bombastic B AA M B AE S T IH K
+bombay B AA M B EY
+bombay's B AA M B EY Z
+bombeck B AA M B EH K
+bombed B AA M D
+bomber B AA M ER
+bomber's B AA M ER Z
+bomberg B AA M B ER G
+bomberger B AA M B ER G ER
+bombers B AA M ER Z
+bombing B AA M IH NG
+bombings B AA M IH NG Z
+bombmaker B AA M M EY K ER
+bombmaking B AA M M EY K IH NG
+bombs B AA M Z
+bombshell B AA M SH EH L
+bombshells B AA M SH EH L Z
+bomer B OW M ER
+bomgardner B AA M G AA R D N ER
+bommarito B AA M ER IY T OW
+bommer B AA M ER
+bon B AA N
+bona B OW N AH
+bonacci B OW N AA CH IY
+bonadio B OW N AA D IY OW
+bonadonna B AA N AH D AA N AH
+bonaduce B AA N AH D UW CH IY
+bonaduce(2) B AA N AH D UW S
+bonafide B AA N AH F AY D
+bonafide(2) B OW N AH F AY D
+bonanni B OW N AA N IY
+bonanno B OW N AA N OW
+bonanza B AH N AE N Z AH
+bonaparte B OW N AH P AA R T
+bonaparte's B OW N AH P AA R T S
+bonar B OW N ER
+bonasera B OW N AA S EH R AH
+bonaventura B OW N AA V EH N T UH R AH
+bonaventure B AA N AH V EH N CH ER
+bonavia B AA N EY V IY AH
+bonavita B OW N AA V IY T AH
+bonawitz B AA N AH W IH T S
+bonczek B AA N CH EH K
+bond B AA N D
+bond's B AA N D Z
+bondage B AA N D IH JH
+bondar B AH N D AA R
+bonde B AA N D
+bonded B AA N D AH D
+bonded(2) B AA N D IH D
+bonderman B AA N D ER M AH N
+bondholder B AA N D HH OW L D ER
+bondholders B AA N D HH OW L D ER Z
+bondholders' B AA N D HH OW L D ER Z
+bondi B AA N D IY
+bonding B AA N D IH NG
+bondra B AA N D R AH
+bonds B AA N D Z
+bonds' B AA N D Z
+bondt B AA N T
+bondurant B OW N D UH R AH N T
+bondy B AA N D IY
+bone B OW N
+bonebrake B OW N B R EY K
+bonecrusher B OW N K R AH SH ER
+bonecutter B OW N K AH T ER
+boned B OW N D
+boneless B OW N L AH S
+bonelli B OW N EH L IY
+bonello B OW N EH L OW
+bonenberger B OW N AH N B ER G ER
+bonenfant B OW N F AH N T
+boner B OW N ER
+bones B OW N Z
+bonesteel B OW N S T IY L
+bonet B OW N T
+bonetti B OW N EH T IY
+boney B OW N IY
+bonfanti B OW N F AA N T IY
+bonfield B AA N F IY L D
+bonfiglio B AA N F IH G L IY OW
+bonfire B AA N F AY ER
+bonfires B AA N F AY ER Z
+bong B AA NG
+bongard B AH NG G AA R D
+bongarten B AA NG G AA R T AH N
+bongers B AO NG ER Z
+bongiorno B OW N JH AO R N OW
+bongiovanni B OW N JH OW V AA N IY
+bongjin B AO NG JH IH N
+bongo B AA NG G OW
+bongos B AA NG G OW Z
+bonham B AA N HH AH M
+boni B OW N IY
+bonica B AA N IH K AH
+bonier B AA N Y ER
+bonifacio B AA N IH F EY S IY OW
+bonifas B AA N IH F AH Z
+bonifay B AA N IH F EY
+bonifield B AA N IH F IY L D
+bonilla B AH N IH L AH
+bonin B OW N IH N
+bonine B OW N IY N IY
+boning B OW N IH NG
+bonini B OW N IY N IY
+bonino B OW N IY N OW
+bonior B OW N IY ER
+bonior(2) B OW N W AA R
+bonita B OW N IY T AH
+bonito B AH N IY T OW
+bonjour B AH N ZH UH R
+bonk B AA NG K
+bonker B AO NG K ER
+bonkers B AA NG K ER Z
+bonkowski B AH NG K AO F S K IY
+bonn B AA N
+bonn's B AA N Z
+bonne B AA N
+bonneau B AH N OW
+bonnell B AA N AH L
+bonnema B AA N IH M AH
+bonner B AO N ER
+bonnes B AO N Z
+bonnet B AA N AH T
+bonnett B AA N IH T
+bonnette B AH N EH T
+bonneville B AA N AH V IH L
+bonnevilles B AA N AH V IH L Z
+bonney B AA N IY
+bonnibel B AA N IH B AH L
+bonnibelle B AA N IH B AH L
+bonnie B AA N IY
+bonnie's B AA N IY Z
+bonnin B AA N IH N
+bonnor B AA N ER
+bonny B AA N IY
+bono B OW N OW
+bono's B OW N OW Z
+bonobo B AA N AA B OW
+bonobo(2) B AA N AH B AH
+bonobos B AA N AA B OW Z
+bonobos(2) B AA N AH B AH Z
+bonomo B AA N AH M OW
+bonsai B AA N S AY
+bonsall B OW N S AA L
+bonser B AA N S ER
+bonsignore B OW N S IY G N AO R IY
+bonta B AA N T AH
+bonte B AA N T
+bontempo B AA N T EH M P OW
+bontrager B AA N T R EY G ER
+bonum B AA N AH M
+bonura B OW N UH R AH
+bonus B OW N AH S
+bonuses B OW N AH S IH Z
+bonvillain B AA N V IH L EY N
+bonville B OW N V IH L
+bonwell B AA N W EH L
+bonwit B AA N W IH T
+bonwit's B AA N W IH T S
+bony B OW N IY
+bonzo B AA N Z OW
+boo B UW
+boob B UW B
+boobs B UW B Z
+booby B UW B IY
+boock B UW K
+boodle B UW D AH L
+boodles B UW D AH L Z
+boody B UW D IY
+booe B AA OW
+booed B UW D
+booee B UW IY
+boogie B UW G IY
+boogie(2) B UH G IY
+boogie-woogie B UW G IY W UW G IY
+boogie-woogie(2) B UH G IY W UH G IY
+booher B UW ER
+booing B UW IH NG
+book B UH K
+book's B UH K S
+bookbinder B UH K B AY N D ER
+bookbinders B UH K B AY N D ER Z
+bookcase B UH K K EY S
+bookcases B UH K K EY S IH Z
+bookcellar B UH K S EH L ER
+bookcellars B UH K S EH L ER Z
+booked B UH K T
+bookend B UH K EH N D
+bookends B UH K EH N D Z
+booker B UH K ER
+booker's B UH K ER Z
+bookers B UH K ER Z
+bookie B UH K IY
+bookies B UH K IY Z
+bookin B UH K IH N
+booking B UH K IH NG
+bookings B UH K IH NG Z
+bookish B UH K IH SH
+bookkeeper B UH K K IY P ER
+bookkeepers B UH K K IY P ER Z
+bookkeeping B UH K K IY P IH NG
+booklet B UH K L IH T
+booklets B UH K L AH T S
+bookmaker B UH K M EY K ER
+bookmakers B UH K M EY K ER Z
+bookmaking B UH K M EY K IH NG
+bookman B UH K M AH N
+bookmark B UH K M AA R K
+bookmarks B UH K M AA R K S
+bookmobile B UH K M OW B IY L
+bookmobiles B UH K M OW B IY L Z
+booknote B UH K N OW T
+booknotes B UH K N OW T S
+bookout B UH K AW T
+books B UH K S
+books' B UH K S
+bookseller B UH K S EH L ER
+booksellers B UH K S EH L ER Z
+bookshelf B UH K SH EH L F
+bookshelves B UH K SH EH L V Z
+bookshop B UH K SH AA P
+bookshops B UH K SH AA P S
+booksmith B UH K S M IH TH
+bookstand B UH K S T AE N D
+bookstands B UH K S T AE N D Z
+bookstop B UH K S T AA P
+bookstops B UH K S T AA P S
+bookstore B UH K S T AO R
+bookstores B UH K S T AO R Z
+bookwalter B UH K W AH L T ER
+bookworm B UH K W ER M
+boole B UW L
+boolean B UW L IY AH N
+boom B UW M
+boom's B UW M Z
+boombox B UH M B AA K S
+boomboxes B UH M B AA K S IH Z
+boomed B UW M D
+boomer B UW M ER
+boomerang B UW M ER AE NG
+boomeranged B UW M ER AE NG D
+boomers B UW M ER Z
+boomers' B UW M ER Z
+boomershine B UW M ER SH AY N
+boomhower B UW M HH OW ER
+booming B UW M IH NG
+boomlet B UW M L AH T
+booms B UW M Z
+boomsma B UW M Z M AH
+boomtown B UW M T AW N
+boon B UW N
+boondocks B UW N D AA K S
+boondoggle B UW N D AA G AH L
+boondoggles B UW N D AA G AH L Z
+boone B UW N
+boons B UW N Z
+boonstra B UW N S T R AH
+boonton B UW N T AH N
+boonville B UW N V IH L
+boop B UW P
+boor B UH R
+booras B UH R AH Z
+boord B UH R D
+boorda B UH R D AH
+boorda's B UH R D AH Z
+boorish B UH R IH SH
+boorishness B UH R IH SH N AH S
+boorman B UH R M AH N
+boors B UH R Z
+boorstin B UW R S T IH N
+boortz B AO R T S
+boos B UW Z
+boose B UW S
+boost B UW S T
+boosted B UW S T IH D
+booster B UW S T ER
+booster's B UW S T ER Z
+boosterism B UW S T ER IH Z AH M
+boosters B UW S T ER Z
+boosting B UW S T IH NG
+boosts B UW S T S
+boot B UW T
+boote B UW T
+booted B UW T IH D
+booten B UW T AH N
+booth B UW TH
+boothby B UW TH B IY
+boothe B UW DH
+boothman B UW TH M AH N
+boothroyd B UW TH R OY D
+booths B UW TH S
+bootie B UW T IY
+booties B UW T IY Z
+booting B UW T IH NG
+bootleg B UW T L EH G
+bootlegger B UW T L EH G ER
+bootleggers B UW T L EH G ER Z
+bootlegging B UW T L EH G IH NG
+bootlegs B UW T L EH G Z
+booton B UW T AH N
+boots B UW T S
+bootstrap B UW T S T R AE P
+bootstraps B UW T S T R AE P S
+booty B UW T IY
+bootz B UW T S
+booz B UW Z
+booze B UW Z
+boozer B UW Z ER
+boozier B UW Z IY ER
+boozing B UW Z IH NG
+boozy B UW Z IY
+bop B AA P
+bopeep B OW P IY P
+bopera B OW P EH R AH
+bopha B OW F AH
+bophuthatswana B OW F UW TH AA T S W AA N AH
+bopp B AA P
+bopper B AA P ER
+boppers B AA P ER Z
+boquist B AA K W IH S T
+bora B AO R AH
+borah B AO R AH
+borak B AO R AH K
+boral B AO R AH L
+borawski B ER AA F S K IY
+borax B AO R AE K S
+borba B AO R B AH
+borchard B ER SH AA R D
+borchardt B ER SH AA R D T
+borchelt B AO R K IH L T
+borcherding B AO R K ER D IH NG
+borchers B AO R K ER Z
+borchert B AO R K ER T
+borck B AO R K
+borda B AO R D AH
+borda's B AO R D AH Z
+bordallo B AO R D AE L OW
+bordas B AO R D AH Z
+bordeau B ER D OW
+bordeaux B AO R D OW
+bordello B AO R D EH L OW
+bordelon B AO R D IH L AA N
+borden B AO R D AH N
+borden's B AO R D AH N Z
+bordenave B AO R D EH N AA V
+border B AO R D ER
+border's B AO R D ER Z
+bordered B AO R D ER D
+bordering B AO R D ER IH NG
+borderline B AO R D ER L AY N
+borders B AO R D ER Z
+bordes B AO R D Z
+bordman B AO R D M AH N
+bordner B AO R D N ER
+bordonaro B AO R D OW N AA R OW
+bordwell B AO R D W EH L
+bore B AO R
+borealis B AO R IY AE L AH S
+bored B AO R D
+boredom B AO R D AH M
+borek B AO R IH K
+borel B AO R AH L
+borell B AO R AH L
+borella B AO R EH L AH
+borelli B AO R EH L IY
+borello B AO R EH L OW
+boren B AO R AH N
+boren's B AO R AH N Z
+borenstein B AO R AH N S T AY N
+borenstein(2) B AO R AH N S T IY N
+borer B AO R ER
+bores B AO R Z
+borg B AO R G
+borge B AO R JH
+borgelt B AO R G IH L T
+borgen B AO R G AH N
+borger B AO R G ER
+borgerding B AO R G ER D IH NG
+borgert B AO R G ER T
+borges B AO R G EY S
+borgeson B AO R G IH S AH N
+borgess B AO R G IH S
+borghi B AO R G IY
+borgia B AO R JH AH
+borgman B AO R G M AH N
+borgmann B AO R G M AH N
+borgmeyer B AO R G M AY ER
+borgstrom B AO R G S T R AH M
+borgwardt B AO R G W AO R T
+boric B AO R IH K
+borin B AO R IH N
+boring B AO R IH NG
+boris B AO R IH S
+boris' B AO R IH S
+boris's B AO R IH S IH Z
+borja B AO R Y AH
+borjas B AO R Y AH Z
+bork B AO R K
+bork's B AO R K S
+borkenhagen B AO R K IH N HH AA G AH N
+borkenhagen(2) B AO R K IH N HH EY G AH N
+borkowski B ER K AO F S K IY
+borland B AO R L AH N D
+borland's B AO R L AH N D Z
+borman B AO R M AH N
+borman's B AO R M AH N Z
+bormann B AO R M AH N
+born B AO R N
+born's B AO R N Z
+borne B AO R N
+borneman B AO R N M AH N
+bornemann B AO R N M AH N
+borneo B AO R N IY OW
+borner B AO R N ER
+bornholdt B AO R N HH OW L T
+bornhorst B AO R N HH AO R S T
+bornman B AO R N M AH N
+borns B AO R N Z
+bornstein B AO R N S T AY N
+bornstein(2) B AO R N S T IY N
+borntrager B AO R N T R EY G ER
+boro B ER OW
+borocce B AH R OW CH IY
+boroff B AO R AO F
+boroian B AO R OY AH N
+boron B AO R AA N
+boros B ER OW Z
+borosage B AO R AH S IH JH
+boroski B ER AW S K IY
+borough B ER OW
+borough's B ER OW Z
+boroughs B ER OW Z
+borowiak B ER AW IY AE K
+borowicz B ER OW V IH CH
+borowiec B ER AW IY K
+borowski B ER AO F S K IY
+borowsky B ER AW S K IY
+borowy B ER AW IY
+borquez B AO R K W EH Z
+borras B AO R AH Z
+borre B AO R
+borrego B AO R EH G OW
+borrell B AO R EY L
+borrelli B AO R EH L IY
+borrello B AO R EH L OW
+borrero B AO R EH R OW
+borris B AO R IH S
+borroff B AO R AO F
+borror B AO ER R
+borrow B AA R OW
+borrowed B AA R OW D
+borrower B AA R OW ER
+borrower's B AA R OW ER Z
+borrowers B AA R OW ER Z
+borrowers' B AO R AH ER Z
+borrowing B AA R OW IH NG
+borrowings B AA R OW IH NG Z
+borrowman B AA R OW M AH N
+borrows B AA R OW Z
+borruso B AO R UW S OW
+bors B AO R Z
+borsch B AO R SH
+borscht B AO R SH T
+borse B AO R S
+borseth B AO R S IH TH
+borski B AO R S K IY
+borst B AO R S T
+borsuk B AO R S AH K
+bort B AO R T
+bortel B AO R T EH L
+borten B AO R T AH N
+borth B AO R TH
+borthwick B AO R TH W IH K
+bortle B AO R T AH L
+bortner B AO R T N ER
+bortnick B AO R T N IH K
+borton B AO R T AH N
+bortz B AO R T S
+boruch B AO R AH K
+borucki B ER AH T S K IY
+boruff B AO R AH F
+borum B AO R AH M
+borunda B AO R UW N D AH
+borup B AO R AH P
+borwn B AO R W IH N
+borys B AO R IY Z
+bos B AA S
+bosak B OW S AH K
+bosarge B AA S AA R G
+boscarino B OW S K AA R IY N OW
+bosch B AO SH
+boschee B AO SH IY
+boschen B AO SH AH N
+boschert B AO SH ER T
+boschwitz B AO SH W IH T S
+boscia B OW S CH AH
+bosco B AO S K OW
+bose B OW Z
+boseman B OW S M AH N
+bosendorfer B OW Z AH N D AO R F ER
+boser B OW Z ER
+bosh B AA SH
+boshart B AA SH AA R T
+boshears B AA SH IH R Z
+boshell B AA SH AH L
+bosher B AA SH ER
+boshers B AA SH ER Z
+boskin B AO S K IH N
+bosko B OW S K OW
+boskovich B AA S K AH V IH CH
+boslego B AO S L EY G OW
+bosler B AA S AH L ER
+bosler(2) B AA Z L ER
+bosley B AA Z L IY
+bosma B OW S M AH
+bosman B AA S M AH N
+bosnia B AA Z N IY AH
+bosnia's B AA Z N IY AH Z
+bosnian B AA Z N IY AH N
+bosnian's B AA Z N IY AH N Z
+bosnians B AA Z N IY AH N Z
+bosnias B AA Z N IY AH Z
+boso B OW S OW
+bosom B UH Z AH M
+bosqi B AA S K IY
+bosquez B OW S K W EH Z
+boss B AA S
+boss' B AO S
+boss's B AO S IH Z
+boss(2) B AO S
+bossard B AH S AA R D
+bossart B AH S AA R T
+bosse B AA S
+bossed B AA S T
+bossen B AA S AH N
+bosserman B AO S ER M AH N
+bossert B AA S ER T
+bosses B AO S IH Z
+bosses' B AO S IH Z
+bosshardt B AO S HH AA R T
+bosshart B AO S HH AA R T
+bossi B OW S IY
+bossidy B AO S IH D IY
+bossie B AO S IY
+bossier B AO S IY ER
+bossler B AA S AH L ER
+bossler(2) B AA S L ER
+bossman B AO S M AH N
+bosso B OW S OW
+bossy B AO S IY
+bost B AA S T
+bostelman B AA S T AH L M AH N
+boster B AA S T ER
+bostian B AA S CH IH N
+bostic B AA S T IH K
+bostick B OW S T IH K
+bostock B OW S T AA K
+boston B AA S T AH N
+boston's B AO S T AH N Z
+boston(2) B AO S T AH N
+bostonian B AO S T OW N IY AH N
+bostonians B AA S T OW N IY AH N Z
+bostra B AA S T R AH
+bostrom B AA S T R AH M
+bostwick B AA S T W IH K
+boswell B AA Z W EH L
+bosworth B AO Z W ER TH
+botanic B AH T AE N IH K
+botanical B AH T AE N IH K AH L
+botanically B AH T AE N AH K AH L IY
+botanically(2) B AH T AE N AH K L IY
+botanist B AA T AH N AH S T
+botanist(2) B AA T AH N IH S T
+botanists B AA T AH N IH S T S
+botanists(2) B AA T AH N IH S S
+botanists(3) B AA T AH N IH S
+botany B AA T AH N IY
+botch B AA CH
+botched B AA CH T
+boteler B AA T AH L ER
+botelho B OW T EH L OW
+botello B OW T EH L OW
+botero B OW T EH R OW
+botfly B AA T F L AY
+both B OW TH
+botha B AA TH AH
+botha's B AA TH AH Z
+botha's(2) B OW T AH Z
+botha(2) B OW T AH
+botham B AA TH AH M
+botham's B AA TH AH M Z
+bothe B OW DH
+bothell B AA TH AH L
+bother B AA DH ER
+bothered B AA DH ER D
+bothering B AA DH ER IH NG
+bothers B AA DH ER Z
+bothersome B AA DH ER S AH M
+bothun B AA TH AH N
+bothwell B AA TH W EH L
+botin B AA T IH N
+botkin B AA T K IH N
+botkins B AA T K IH N Z
+botner B AA T N ER
+botolf B AA T OW L F
+boton B OW T AH N
+botos B OW T OW Z
+botrytis B AH T R IH T IH S
+botsford B AA T S F ER D
+botshabelo B AA CH AH B EH L OW
+botswana B AA T S W AA N AH
+bott B AA T
+botta B AA T AH
+bottari B OW T AA R IY
+bottcher B AA T CH ER
+bottecelli B AO T AH CH EH L IY
+bottel B AA T AH L
+botten B AA T AH N
+bottenfield B AH T EH N F IY L D
+bottger B AA T G ER
+botting B AA T IH NG
+bottini B OW T IY N IY
+bottino B OW T IY N OW
+bottle B AA T AH L
+bottled B AA T AH L D
+bottleneck B AA T AH L N EH K
+bottlenecks B AA T AH L N EH K S
+bottler B AA T L ER
+bottlers B AA T L ER Z
+bottlers' B AA T L ER Z
+bottles B AA T AH L Z
+bottling B AA T AH L IH NG
+bottling(2) B AA T L IH NG
+bottom B AA T AH M
+bottom's B AA T AH M Z
+bottomed B AA T AH M D
+bottomfish B AA T AH M F IH SH
+bottoming B AA T AH M IH NG
+bottomless B AA T AH M L AH S
+bottomley B AA T AH M L IY
+bottoms B AA T AH M Z
+bottone B OW T OW N IY
+bottorf B AA T ER F
+bottorff B AA T ER F
+bottrell B AA T R AH L
+botts B AA T S
+botulism B AA CH UW L IH Z AH M
+botz B AA T S
+bouch B AW CH
+bouchard B UW SH AA R D
+bouche B AW CH
+boucher B UW SH AH
+boucher(2) B AW CH ER
+boucher(3) B AO CH ER
+bouchey B UW SH IY
+bouchie B AW CH IY
+bouchillon B AW CH IH L AA N
+bouck B OW K
+boudin B UW D IH N
+boudoin B UW D OY N
+boudoir B UW D OY R
+boudreau B UW D R OW
+boudreaux B UW D R OW
+bouffard B UW F AA R D
+bougainville B UW G IH N V IH L
+bougainvillea B UW G EY N V IH L IY AH
+bough B AW
+boughan B AW AH N
+bougher B AW ER
+boughman B AW M AH N
+boughner B AW N ER
+boughs B AW Z
+bought B AA T
+bought(2) B AO T
+boughten B AO T AH N
+boughter B AO T ER
+boughton B AW T AH N
+bougie B UW ZH IY
+bouie B UW IY
+bouillabaise B UW L Y AH B EY S
+bouillon B UW W IH L AH N
+bouknight B AW K N AY T
+boulais B UW L EY
+boulalas B UW L AH L AH S
+boulanger B AW L AH NG ER
+boulangerie B UW L AE NG G ER IY
+boulay B UW L EY
+boulden B UH D AH N
+boulder B OW L D ER
+boulders B OW L D ER Z
+boule B UW L
+bouler B AW L ER
+boulet B UW L EH T
+boulette B UW L EH T
+boulevard B UH L AH V AA R D
+boulevards B UH L AH V AA R D Z
+bouley B UW L IY
+boulez B UW L EH Z
+boulier B UW L IY ER
+boullion B UW L Y AH N
+boulos B UW L OW Z
+boulter B OW L T ER
+boultinghouse B AW L T IH NG HH AW S
+boulton B AW L T AH N
+boulware B AW L W EH R
+bouma B OW M AH
+bouman B UW M AE N
+bounce B AW N S
+bounced B AW N S T
+bouncer B AW N S ER
+bouncers B AW N S ER Z
+bounces B AW N S IH Z
+bounciness B AW N S IY N AH S
+bouncing B AW N S IH NG
+bouncy B AW N S IY
+bound B AW N D
+boundaries B AW N D ER IY Z
+boundaries(2) B AW N D R IY Z
+boundary B AW N D ER IY
+boundary(2) B AW N D R IY
+bounded B AW N D AH D
+bounded(2) B AW N D IH D
+bounder B AW N D ER
+bounding B AW N D IH NG
+boundless B AW N D L AH S
+bounds B AW N D Z
+boundy B AW N D IY
+bounties B AW N T IY Z
+bountiful B AW N T IH F AH L
+bountiful(2) B AW N IH F AH L
+bounty B AW N T IY
+bouquet B UW K EY
+bouquets B OW K EY Z
+bouquets(2) B UW K EY Z
+bour B AW R
+bourassa B UH R AA S AH
+bourbeau B UH R B OW
+bourbon B ER B AH N
+bourbons B ER B AH N Z
+bourcier B AW R K IY ER
+bourdeau B UH R D OW
+bourg B AO R G
+bourgault B UH R G OW
+bourgeois B UH R ZH W AA
+bourgeoisie B UH R ZH W AA Z IY
+bourget B UH R ZH EH T
+bourgoin B UH R G OY N
+bourguiba B AO R G W IY B AH
+bourguignon B UH R G IY N Y OW N
+bourke B ER K
+bourland B UH R L AE N D
+bourn B AO R N
+bourne B AO R N
+bournewood B AO R N W UH D
+bournias B AO R N IY AH S
+bournonville B AO R N AH N V IH L
+bourque B UH R K
+bourquin B UH R K W AE N
+bourret B UH R EH T
+bourse B AO R S
+bourse's B AO R S IH Z
+bourses B AO R S IH Z
+boursicot B UW R S IH K AO T
+boursicot(2) B AH R S AH K AO T
+bouse B AW S
+bouska B UW S K AH
+bousman B AH S M AE N
+bousquet B UW S K EH T
+boussac B UW S AE K
+boustany B UW S T AH N IY
+bout B AW T
+boutell B UW T EH L
+boutelle B UW T EH L
+bouthillier B AW TH AH L IY ER
+boutilier B AW T AH L IY ER
+boutin B UW T AE N
+boutique B UW T IY K
+boutiques B UW T IY K S
+bouton B AW T AH N
+boutros B UW T R OW S
+bouts B AW T S
+boutte B UW T
+boutwell B AW T W EH L
+bouvier B UW V IY EY
+bouwens B AW AH N Z
+bouwkamp B AW K AE M P
+bouwman B AW M AH N
+bouwsma B UW Z M AH
+bouyer B OY ER
+bouygues B OY ZH EY
+bouygues(2) B OY G EH Z
+bouza B UW Z AH
+bova B OW V AH
+bovard B AH V AA R D
+bove B OW V
+bovee B AH V IY
+boven B AH V AH N
+bovenzi B OW V EH N Z IY
+boveri B OW V EH R IY
+bovespa B OW V S P AA
+bovey B OW V IY
+bovik B OW V IH K
+bovin B OW V IH N
+bovina B OW V IY N AH
+bovine B OW V AY N
+bovino B OW V IY N OW
+bow B AW
+bow(2) B OW
+bowar B OW ER
+boward B OW ER D
+bowater B AW AH T ER
+bowater(2) B OW AO T ER
+bowater(3) B OW W AO T ER
+bowcan B OW K AH N
+bowden B OW D AH N
+bowden(2) B AW D AH N
+bowdish B OW D IH SH
+bowditch B OW D IH CH
+bowdle B OW D AH L
+bowdoin B OW D OY N
+bowe B OW
+bowed B AW D
+bowed(2) B OW D
+bowel B AW AH L
+bowell B AA W EH L
+bowels B AW AH L Z
+bowels(2) B AW L Z
+bowen B OW AH N
+bowens B OW AH N Z
+bower B AW ER
+bowerman B OW ER M AH N
+bowermaster B OW ER M AE S T ER
+bowers B AW ER Z
+bowersock B OW ER S AH K
+bowersox B OW ER S AA K S
+bowery B AW ER IY
+bowery's B AW ER IY Z
+bowes B OW Z
+bowick B OW IH K
+bowie B OW IY
+bowing B OW IH NG
+bowing(2) B AW IH NG
+bowker B OW K ER
+bowl B OW L
+bowland B OW L AH N D
+bowlby B OW L B IY
+bowlds B OW L D Z
+bowled B OW L D
+bowlen B OW L AH N
+bowler B OW L ER
+bowlers B OW L ER Z
+bowles B OW L Z
+bowley B OW L IY
+bowlin B OW L IH N
+bowline B OW L AY N
+bowling B OW L IH NG
+bowling's B OW L IH NG Z
+bowls B OW L Z
+bowlus B OW L AH S
+bowman B OW M AH N
+bowman's B OW M AH N Z
+bowmen B OW M AH N
+bowmer B OW M ER
+bown B OW N
+bownds B OW N D Z
+bowne B OW N
+bowring B OW R IH NG
+bowron B OW R AH N
+bowron(2) B OW R AA N
+bows B AW Z
+bows(2) B OW Z
+bowse B OW S
+bowsed B AW Z D
+bowser B OW Z ER
+bowses B AW Z IH Z
+bowsher B OW SH ER
+bowsing B AW Z IH NG
+bowyer B OW Y ER
+box B AA K S
+boxberger B AA K S B ER G ER
+boxcar B AA K S K AA R
+boxcars B AA K S K AA R Z
+boxed B AA K S T
+boxell B AA K S AH L
+boxer B AA K S ER
+boxer's B AA K S ER Z
+boxers B AA K S ER Z
+boxes B AA K S AH Z
+boxes(2) B AA K S IH Z
+boxing B AA K S IH NG
+boxing's B AA K S IH NG Z
+boxley B AA K S L IY
+boxwell B AA K S W EH L
+boxwood B AA K S W UH D
+boxx B AA K S
+boxy B AA K S IY
+boy B OY
+boy's B OY Z
+boy-ar-dee B OY AA R D IY
+boy-scout B OY S K AW T
+boyack B OY AH K
+boyajian B OY AE JH IY AH N
+boyan B OY AA N
+boyar B OW Y AA R
+boyce B OY S
+boycott B OY K AA T
+boycotted B OY K AA T IH D
+boycotting B OY K AA T IH NG
+boycotts B OY K AA T S
+boyd B OY D
+boyd's B OY D Z
+boyde B OY D
+boyden B OY D AH N
+boydston B OY D S T AH N
+boydstun B OY D S T AH N
+boye B OY
+boyea B OY IY AH
+boyer B OY ER
+boyers B OY ER Z
+boyertown B OY ER T AW N
+boyes B OY Z
+boyett B OY IH T
+boyette B OY EH T
+boyfriend B OY F R EH N D
+boyfriends B OY F R EH N D Z
+boyfriends(2) B OY F R EH N Z
+boyhood B OY HH UH D
+boyington B OY IH NG T AH N
+boyish B OY IH SH
+boykin B OY K IH N
+boykins B OY K IH N Z
+boyko B OY K OW
+boylan B OY L AH N
+boyland B OY L AH N D
+boyle B OY L
+boylen B OY L AH N
+boyles B OY L Z
+boyleston B OY L S T AH N
+boyleston's B OY L S T AH N Z
+boylls B OY L Z
+boylston B OY L S T AH N
+boylston's B OY L S T AH N Z
+boyne B OY N
+boynton B OY N T AH N
+boys B OY Z
+boys' B OY Z
+boysel B OY S AH L
+boysen B OY S AH N
+boyson B OY Z AH N
+boyt B OY T
+boyte B OY T
+boyter B OY T ER
+boyum B OY AH M
+boyz B OY Z
+boza B OW Z AH
+bozard B AH Z AA R D
+bozarth B AA Z ER TH
+boze B OW Z
+bozek B OW Z EH K
+bozell B OW Z EH L
+bozell's B OW Z EH L Z
+bozeman B OW Z M AH N
+bozian B OW Z IY AH N
+bozic B AA Z IH K
+bozich B AA Z IH HH
+bozman B AA Z M AH N
+bozo B OW Z OW
+bozos B OW Z OW Z
+boztepe B AA Z T EH P
+boztepe(2) B OW Z T EH P
+boztepe(3) B AA Z T EH P IY
+boztepe(4) B OW Z T EH P IY
+bozza B AA Z AH
+bozzi B AA Z IY
+bozzo B AA Z OW
+bra B R AA
+braaksma B R AA K S M AH
+braasch B R AA SH
+braaten B R AA EY T AH N
+braatz B R AA T S
+brabant B R AA B AH N T
+brabec B R AA B IH K
+brabender B R AE B EH N D ER
+brabham B R AE B HH AH M
+brabson B R AE B S AH N
+brac B R AE K
+bracamonte B R AE K AH M AA N T IY
+bracamonte's B R AE K AH M AA N T IY Z
+bracamontes B R AE K AH M AA N T IY Z
+bracci B R AA CH IY
+bracco B R AE K OW
+brace B R EY S
+brace's B R EY S IH Z
+braced B R EY S T
+bracelet B R EY S L AH T
+bracelets B R EY S L IH T S
+bracer B R EY S ER
+bracero B R AA CH EH R OW
+braces B R EY S AH Z
+braces(2) B R EY S IH Z
+bracewell B R EY S W EH L
+bracey B R EY S IY
+brach B R AE CH
+bracher B R AE K ER
+bracher's B R AE K ER Z
+brachfeld B R AA K F EH L D
+brachiopod B R EY K IY AH P AA D
+brachiopods B R EY K IY AH P AA D Z
+bracht B R AE K T
+bracing B R EY S IH NG
+bracingly B R EY S IH NG G L IY
+brack B R AE K
+brackbill B R AE K B AH L
+brackeen B R AH K IY N
+bracken B R AE K AH N
+brackenbury B R AE K AH N B EH R IY
+brackens B R AE K AH N Z
+bracker B R AE K ER
+bracket B R AE K IH T
+brackets B R AE K AH T S
+brackets(2) B R AE K IH T S
+brackett B R AE K IH T
+brackin B R AE K IH N
+brackins B R AE K IH N Z
+brackish B R AE K IH SH
+brackman B R AE K M AH N
+bracknell B R AE K N EH L
+brackney B R AE K N IY
+bracy B R EY S IY
+brad B R AE D
+brad's B R AE D Z
+bradberry B R AE D B EH R IY
+bradburn B R AE D B ER N
+bradbury B R AE D B EH R IY
+bradco B R AE D K OW
+braddock B R AE D AH K
+braddy B R AE D IY
+bradeen B R AH D IY N
+brademas B R AH D EY M AH S
+braden B R EY D AH N
+bradenton B R AE D AH N T AH N
+brader B R AE D ER
+bradfield B R AE D F IY L D
+bradford B R AE D F ER D
+bradford's B R AE D F ER D Z
+bradfords B R AE D F ER D Z
+bradham B R AE D HH AH M
+bradish B R AE D IH SH
+bradlee B R AE D L IY
+bradlees B R AE D L IY Z
+bradley B R AE D L IY
+bradley's B R AE D L IY Z
+bradleys B R AE D L IY Z
+bradner B R AE D N ER
+bradney B R AE D N IY
+bradshaw B R AE D SH AO
+bradsher B R AE D SH ER
+bradstreet B R AE D S T R IY T
+bradstreet's B R AE D S T R IY T S
+bradt B R AE D T
+bradtke B R AE D K IY
+bradtmiller B R AE T M IH L ER
+bradway B R AE D W EY
+bradwell B R AE D W EH L
+brady B R EY D IY
+brady's B R EY D IY Z
+bradycardia B R AE D AH K AA R D IY AH
+bradycardia(2) B R AE D IH K AA R D IY AH
+bradykinin B R AH D IH K IH N IH N
+bradys B R EY D IY Z
+brae B R EY
+braendstroem B R AE N D S T R OW M
+braer B R EY R
+braff B R AE F
+brafford B R AE F ER D
+brag B R AE G
+braga B R AA G AH
+bragan B R EY G AH N
+braganza B R AH G AA N Z AH
+braganza(2) B R AH G AE N Z AH
+bragdon B R AE G D AH N
+brager B R EY G ER
+bragg B R AE G
+braggadocio B R AE G AH D OW SH IY OW
+bragged B R AE G D
+bragger B R AE G ER
+braggers B R AE G ER Z
+bragging B R AE G IH NG
+braggiotti B R AE Z IY AA T IY
+braggs B R AE G Z
+brags B R AE G Z
+braham B R AE HH AH M
+brahm B R AA M
+brahmin B R AA M IH N
+brahms B R AA M Z
+brahms's B R AA M Z IH Z
+braid B R EY D
+braided B R EY D IH D
+braiding B R EY D IH NG
+braids B R EY D Z
+braidwood B R EY D W UH D
+brailey B R EY L IY
+braille B R EY L
+brailles B R EY L Z
+brailsford B R EY L S F ER D
+brain B R EY N
+brain's B R EY N Z
+brainard B R EY N ER D
+brainchild B R EY N CH AY L D
+braindead B R EY N D EH D
+brained B R EY N D
+brainer B R EY N ER
+brainerd B R EY N ER D
+brainless B R EY N L IH S
+brainpower B R EY N P AW ER
+brains B R EY N Z
+brainstorm B R EY N S T AO R M
+brainstormed B R EY N S T AO R M D
+brainstorming B R EY N S T AO R M IH NG
+brainstorms B R EY N S T AO R M Z
+braintree B R EY N T R IY
+brainwash B R EY N W AA SH
+brainwashed B R EY N W AA SH T
+brainwashes B R EY N W AA SH AH Z
+brainwashing B R EY N W AA SH IH NG
+brainy B R EY N IY
+braise B R EY Z
+braised B R EY Z D
+braithwaite B R EY TH W EY T
+brajdas B R AY D AH S
+brajovic B R AA JH OW V IH CH
+brake B R EY K
+brakebill B R EY K B IH L
+braked B R EY K T
+brakefield B R EY K F IY L D
+brakeman B R EY K M AH N
+brakemen B R EY K M EH N
+braker B R EY K ER
+brakes B R EY K S
+braking B R EY K IH NG
+brakke B R AE K
+braley B R AE L IY
+bralley B R AE L IY
+brallier B R AE L IY ER
+bralorne B R AE L AO R N
+braly B R AA L IY
+bram B R AE M
+bramah B R AA M AH
+bramalea B R AE M AH L IY AH
+bramalea's B R AE M AH L IY Z
+braman B R EY M AH N
+brambila B R AA M B IY L AH
+bramble B R AE M B AH L
+brambles B R AE M B AH L Z
+bramblett B R AE M B L IH T
+brame B R EY M
+bramel B R AE M AH L
+bramer B R EY M ER
+bramhall B R AE M HH AH L
+bramlage B R AE M L IH JH
+bramlet B R AE M L IH T
+bramlett B R AE M L IH T
+bramlette B R AE M L EH T
+bramley B R AE M L IY
+brammeier B R AE M AY ER
+brammer B R AE M ER
+brampton B R AE M P T AH N
+brams B R AE M Z
+bramson B R AE M S AH N
+bramwell B R AE M W EH L
+bran B R AE N
+branagan B R AE N AH G AE N
+branagh B R AE N AH G
+branam B R AE N AH M
+branaman B R AE N AH M AH N
+branan B R EY N AH N
+branca B R AE NG K AH
+brancaccio B R AA N K AA CH IY OW
+brancato B R AA N K AA T OW
+branch B R AE N CH
+branch's B R AE N CH IH Z
+branche B R AE N CH
+brancheau B R AH N SH OW
+branched B R AE N CH T
+branches B R AE N CH AH Z
+branches(2) B R AE N CH IH Z
+branching B R AE N CH IH NG
+branchlet B R AE N CH L AH T
+branchlets B R AE N CH L AH T S
+branco B R AE NG K OW
+brand B R AE N D
+brand's B R AE N D Z
+branda B R AE N D AH
+brandau B R AE N D AW
+brande B R AE N D
+brandeberry B R AE N D B EH R IY
+branded B R AE N D IH D
+brandeis B R AE N D AY S
+brandel B R AE N D AH L
+branden B R AE N D AH N
+brandenberg B R AE N D AH N B ER G
+brandenberger B R AE N D AH N B ER G ER
+brandenburg B R AE N D AH N B ER G
+brandenburger B R AE N D AH N B ER G ER
+brandenstein B R AE N D EH N S T AY N
+brandenstein(2) B R AE N D EH N S T IY N
+brander B R AE N D ER
+brandes B R AE N D Z
+brandford B R AE N D F ER D
+brandhorst B R AE N D HH AO R S T
+brandi B R AE N D IY
+branding B R AE N D IH NG
+brandis B R AE N D IH S
+brandish B R AE N D IH SH
+brandished B R AE N D IH SH T
+brandishes B R AE N D IH SH IH Z
+brandishing B R AE N D IH SH IH NG
+brandl B R AE N D AH L
+brandle B R AE N D AH L
+brandname B R AE N D N EY M
+brandner B R AE N D N ER
+brando B R AE N D OW
+brando's B R AE N D OW Z
+brandon B R AE N D AH N
+brandon's B R AE N D AH N Z
+brandow B R AE N D AW
+brands B R AE N D Z
+brands' B R AE N D Z
+brands's B R AE N D Z IH Z
+brandstetter B R AE N D S T IH T ER
+brandt B R AE N T
+brandtner B R AE N T N ER
+brandvold B R AE N D V OW L D
+brandwein B R AE N D W AY N
+brandy B R AE N D IY
+brandywine B R AE N D IY W AY N
+braner B R EY N ER
+branford B R AE N F ER D
+branham B R AE N HH AH M
+brani B R AE N IY
+braniff B R AE N IH F
+braniff's B R AE N IH F S
+branigan B R AE N IH G AH N
+branillo B R AH N IH L OW
+branin B R AE N IH N
+branislov B R AE N IH S L AA V
+branitzky B R AH N IH T S K IY
+brank B R AE NG K
+brank's B R AE NG K S
+branki B R AE NG K IY
+branko B R AE NG K OW
+branks B R AE NG K S
+brann B R AE N
+branna B R AE N AH
+brannam B R AE N AH M
+brannan B R AE N AH N
+brannen B R AE N AH N
+branner B R AE N ER
+brannick B R AE N IH K
+brannigan B R AE N IH G AH N
+branning B R AE N IH NG
+brannock B R AE N AH K
+brannon B R AE N AH N
+brannum B R AE N AH M
+branon B R AE N AH N
+branscom B R AE N S K AH M
+branscomb B R AE N S K AH M
+branscome B R AE N Z K AH M
+branscum B R AE N S K AH M
+bransfield B R AE N Z F IY L D
+bransford B R AE N S F ER D
+bransom B R AE N S AH M
+branson B R AE N S AH N
+branson's B R AE N S AH N Z
+branstad B R AE N S T AE D
+branstetter B R AE N S T IH T ER
+brant B R AE N T
+brantley B R AE N T L IY
+brantly B R AE N T L IY
+brantner B R AE N T N ER
+branton B R AE N T AH N
+branum B R AE N AH M
+branyon B R AE N Y AH N
+branz B R AE N Z
+braque B R AE K
+bras B R AE S
+bras(2) B R AA S
+brascade B R AH S K EY D
+brascan B R AE S K AH N
+brasch B R AE SH
+brasco B R AE S K OW
+brase B R EY Z
+brasel B R AE S AH L
+braselton B R AH S EH L T AH N
+brasfield B R AE S F IY L D
+brash B R AE SH
+brashear B R AE SH IY R
+brashears B R AE SH IY R Z
+brasher B R AE SH ER
+brashers B R AE SH ER Z
+brashier B R AE SH IY ER
+brashness B R AE SH N AH S
+brasil B R AE S AH L
+brasil(2) B R AH S IY L
+brasilia B R AH Z IH L Y AH
+brasilia(2) B R AH S IH L Y AH
+brasington B R AE S IH NG T AH N
+brasow B R AE S OW
+brasow(2) B R AE Z OW
+brass B R AE S
+brassard B R AE S ER D
+brasseaux B R AH S OW
+brassell B R AE S AH L
+brasserie B R AE S ER IY
+brasses B R AE S IH Z
+brasseur B R AE S ER
+brassfield B R AE S F IY L D
+brasso B R AE S OW
+brasso's B R AE S OW Z
+brassy B R AE S IY
+braswell B R AE S W EH L
+brat B R AE T
+bratcher B R AE CH ER
+braton B R AE T IH N
+brats B R AE T S
+bratsch B R AE CH
+bratt B R AE T
+brattain B R AH T EY N
+brattaslava B R AA T AH S L AA V AH
+brattaslava's B R AA T AH S L AA V AH Z
+bratten B R AE T AH N
+brattin B R AE T IH N
+brattle B R AE T AH L
+bratton B R AE T AH N
+bratwurst B R AE T W ER S T
+bratz B R AE T S
+brau B R AW
+brauch B R AO CH
+braucher B R AO CH ER
+brauchli B R AO CH L IY
+braud B R AO D
+braude B R AO D
+brauer B R AW ER
+braughton B R AO T AH N
+brauhau B R AA HH AA
+brault B R AO L T
+braun B R AO N
+braun's B R AO N Z
+braund B R AO N D
+braune B R AO N
+brauner B R AO N ER
+brauns B R AO N Z
+braunschweig B R AW N SH W AY G
+braunstein B R AO N S T IY N
+braunstein(2) B R AO N S T AY N
+braunwald B R AO N W AO L D
+brause B R AO Z
+brautigam B R OW T IH G AH M
+brautigams B R AO T IH G AE M Z
+bravado B R AH V AA D OW
+brave B R EY V
+braved B R EY V D
+braveheart B R EY V HH AA R T
+bravely B R EY V L IY
+braver B R EY V ER
+braverman B R EY V ER M AH N
+bravery B R EY V ER IY
+braves B R EY V Z
+braves' B R EY V Z
+bravest B R EY V AH S T
+braving B R EY V IH NG
+bravo B R AA V OW
+bravura B R AH V Y UH R AH
+brawer B R AO ER
+brawl B R AO L
+brawley B R AO L IY
+brawling B R AO L IH NG
+brawls B R AO L Z
+brawn B R AO N
+brawner B R AO N ER
+brawny B R AO N IY
+braxton B R AE K S T AH N
+bray B R EY
+brayboy B R EY B OY
+brayer B R EY ER
+brayfield B R EY F IY L D
+brayman B R EY M AH N
+brayton B R EY T AH N
+braz B R AE Z
+brazda B R AE Z D AH
+brazeal B R AH Z IY L
+brazeau B R AH Z OW
+brazee B R AE Z IY
+brazel B R AE Z AH L
+brazell B R AE Z AH L
+brazelton B R AH Z EH L T AH N
+brazen B R EY Z AH N
+brazenly B R EY Z AH N L IY
+brazenness B R EY Z AH N AH S
+braziel B R AH Z IY L
+brazier B R EY Z IY ER
+braziers B R EY ZH ER Z
+brazil B R AH Z IH L
+brazil's B R AH Z IH L Z
+brazile B R AA Z AY L
+brazilian B R AH Z IH L Y AH N
+brazilians B R AH Z IH L Y AH N Z
+brazill B R AE Z AH L
+brazos B R AA Z OW S
+brazzaville B R AE Z AH V IH L
+brazzaville's B R AE Z AH V IH L Z
+brazzel B R AE Z AH L
+brazzell B R AE Z AH L
+brca B R IH K AH
+brcko B ER CH K OW
+brcko's B ER CH K OW Z
+brea B R IY
+breach B R IY CH
+breached B R IY CH T
+breaches B R IY CH IH Z
+breaching B R IY CH IH NG
+bread B R EH D
+breadbasket B R EH D B AE S K AH T
+breadbox B R EH D B AA K S
+breaded B R EH D IH D
+breadfruit B R EH D F R UW T
+breading B R EH D IH NG
+breads B R EH D Z
+breadth B R EH D TH
+breadwinner B R EH D W IH N ER
+breadwinners B R EH D W IH N ER Z
+bready B R EH D IY
+break B R EY K
+breakable B R EY K AH B AH L
+breakage B R EY K IH JH
+breakaway B R EY K AH W EY
+breakdown B R EY K D AW N
+breakdowns B R EY K D AW N Z
+breaker B R EY K ER
+breakers B R EY K ER Z
+breakeven B R EY K IY V AH N
+breakey B R EY K IY
+breakfast B R EH K F AH S T
+breakfasts B R EH K F AH S T S
+breakfield B R EY K F IY L D
+breaking B R EY K IH NG
+breakmate B R EY K M EY T
+breakneck B R EY K N EH K
+breakout B R EY K AW T
+breakouts B R EY K AW T S
+breaks B R EY K S
+breakthrough B R EY K TH R UW
+breakthroughs B R EY K TH R UW Z
+breakup B R EY K AH P
+breakups B R EY K AH P S
+breakwater B R EY K W AO T ER
+breaky B R EY K IY
+bream B R IY M
+brean B R IY N
+brearley B R ER L IY
+breast B R EH S T
+breasted B R EH S T AH D
+breasted(2) B R EH S T IH D
+breastfed B R EH S T F EH D
+breastfeed B R EH S T F IY D
+breastfeeding B R EH S T F IY D IH NG
+breastfeeding's B R EH S T F IY D IH NG Z
+breastfeeds B R EH S T F IY D Z
+breasting B R EH S T IH NG
+breastplate B R EH S T P L EY T
+breasts B R EH S T S
+breath B R EH TH
+breathe B R IY DH
+breathed B R IY DH D
+breather B R IY DH ER
+breathes B R IY DH Z
+breathing B R IY DH IH NG
+breathless B R EH TH L AH S
+breathlessly B R EH TH L AH S L IY
+breaths B R EH TH S
+breathtaking B R EH TH T EY K IH NG
+breathtakingly B R EH TH T EY K IH NG L IY
+breathy B R EH TH IY
+breau B R OW
+breault B R OW
+breaux B R OW
+breaux(2) B R UW
+breazeale B R IY Z IY L
+brebach B R EH B AH K
+brechbill B R EH K B AH L
+brecheen B R EH K IY N
+brecheisen B R EH K AY S AH N
+brecher B R EH K ER
+brecht B R EH K T
+brechtel B R EH K T AH L
+breck B R EH K
+breckenridge B R EH K AH N R IH JH
+brecker B R EH K ER
+breco B R EH K OW
+bred B R EH D
+breda B R EY D AH
+brede B R IY D
+breden B R IY D AH N
+bredeson B R EH D IH S AH N
+bree B R IY
+breece B R IY S
+breech B R IY CH
+breeching B R IY CH IH NG
+breed B R IY D
+breed's B R IY D Z
+breeden B R IY D AH N
+breeden's B R IY D AH N Z
+breeder B R IY D ER
+breeders B R IY D ER Z
+breeders' B R IY D ER Z
+breeding B R IY D IH NG
+breedlove B R IY D L AH V
+breeds B R IY D Z
+breeland B R IY L AH N D
+breen B R IY N
+brees B R IY Z
+breese B R IY Z
+breeze B R IY Z
+breezed B R IY Z D
+breezes B R IY Z IH Z
+breezeway B R IY Z W EY
+breezy B R IY Z IY
+brege B R IY JH
+breger B R IY G ER
+breglio B R EH G L IY OW
+bregman B R EH G M AH N
+breguet B R IY G AH T
+brehm B R EH M
+brehmer B R EH M ER
+breidenbach B R AY D IH N B AA K
+breidenstein B R AY D AH N S T AY N
+breidenstein(2) B R AY D AH N S T IY N
+breier B R AY ER
+breighner B R EY N ER
+breighton B R AY T AH N
+breiner B R AY N ER
+breining B R AY N IH NG
+breininger B R AY N IH NG ER
+breisch B R AY SH
+breit B R IY T
+breitbach B R AY T B AA K
+breitbarth B R AY T B AA R TH
+breitenbach B R AY T IH N B AA K
+breitenstein B R AY T AH N S T AY N
+breitenstein(2) B R AY T AH N S T IY N
+breithaupt B R AY TH AW P T
+breitkreutz B R AY T K R OY T S
+breitling B R AY T AH L IH NG
+breitling(2) B R AY T L IH NG
+breitman B R AY T M AH N
+breitschwerdt B R AY CH W ER T
+breitweiser B R AY T W AY S ER
+breitzman B R AY T S M AH N
+brekke B R EH K
+breland B R EH L AH N D
+brelsford B R EH L S F ER D
+brem B R EH M
+bremen B R EH M AH N
+bremer B R IY M ER
+bremmer B R EH M ER
+bremner B R EH M N ER
+brems B R EH M Z
+bren B R EH N
+brenda B R EH N D AH
+brenda's B R EH N D AH Z
+brendan B R EH N D AH N
+brendel B R EH N D AH L
+brenden B R EH N D AH N
+brender B R EH N D ER
+brendle B R EH N D AH L
+brendlinger B R EH N D AH L IH NG ER
+brendlinger(2) B R EH N D L IH NG ER
+brendon B R EH N D AH N
+brendor B R EH N D ER
+brendsel B R EH N D S AH L
+breneman B R IY N M AH N
+brener B R IY N ER
+brenes B R IY N Z
+brengle B R IH NG AH L
+brenizer B R EH N AY Z ER
+brenn B R EH N
+brenna B R EH N AH
+brennan B R EH N AH N
+brennan's B R EH N AH N Z
+brennans B R EH N AH N Z
+brennecke B R EH N IH K
+brenneke B R EH N AH K IY
+brenneman B R EH N M AH N
+brennen B R EH N AH N
+brenner B R EH N ER
+brenning B R EH N IH NG
+brensinger B R EH N S IH NG ER
+brent B R EH N T
+brentano B R EH N T AA N OW
+brentanos B R EH N T AA N OW Z
+brentlinger B R EH N T AH L IH NG ER
+brentlinger(2) B R EH N T L IH NG ER
+brenton B R EH N T AH N
+brents B R EH N T S
+brentwood B R EH N T W UH D
+breon B R IY AH N
+bresca B R EH S K AH
+brescia B R EH S CH AH
+bresee B R IH S IY
+bresette B R IH S EH T
+breshears B R EH SH IY R Z
+breslaw B R EH S L AA
+bresler B R EH S L ER
+breslin B R EH S L IH N
+breslow B R EH S L OW
+bresnahan B R EH S N AH HH AE N
+bresnan B R EH S N AH N
+bresnick B R EH S N IH K
+bress B R EH S
+bresse B R EH S
+bresseau B R EH S OW
+bresser B R EH S ER
+bresser's B R EH S ER Z
+bressette B R EH S EH T
+bressler B R EH S L ER
+bressman B R EH S M AH N
+bresson B R EH S AH N
+brest B R EH S T
+brester B R EH S T ER
+bret B R EH T
+breth B R EH TH
+brethauer B R EH TH AW ER
+brethen B R IY TH AH N
+brethren B R EH DH R AH N
+breton B R EH T AH N
+bretschneider B R EH CH N AY D ER
+brett B R EH T
+bretthauer B R EH TH AW ER
+bretton B R EH T AH N
+bretts B R EH T S
+brettschneider B R EH CH N AY D ER
+brettschneider(2) B R EH T S N AY D ER
+bretz B R EH T S
+breuer B R UW ER
+breunig B R UW N IH G
+breuninger B R UW N IH NG ER
+brevard B R EH V ER D
+brevets B R AH V EH T S
+brevig B R EH V IH G
+brevik B R EH V IH K
+brevity B R EH V AH T IY
+brew B R UW
+brewbaker B R UW B EY K ER
+brewed B R UW D
+brewer B R UW ER
+brewer's B R UW ER Z
+breweries B R UW ER IY Z
+breweries(2) B R UW R IY Z
+brewers B R UW ER Z
+brewers' B R UW ER Z
+brewery B R UW ER IY
+brewing B R UW IH NG
+brewington B R UW IH NG T AH N
+brewry B R UW R IY
+brews B R UW Z
+brewster B R UW S T ER
+brewton B R UW T AH N
+brey B R EY
+breyer B R EY ER
+breyer's B R EY ER Z
+breyfogle B R EY F OW G AH L
+breza B R EH Z AH
+brezhnev B R EH Z N AH V
+brezhnev's B R EH Z N AH V Z
+brezhnev's(2) B R EH Z N EH F S
+brezhnev(2) B R EH Z N EH F
+brezina B R EH Z IY N AH
+brezinski B R IH Z IH N S K IY
+bria B R IY AH
+brian B R AY AH N
+brian's B R AY AH N Z
+briana B R IY AE N AH
+briana's B R IY AE N AH Z
+briana's(2) B R IY AA N AH Z
+briana(2) B R IY AA N AH
+briancon B R AY AH N S AH N
+briand B R AY AH N D
+brianna B R IY AE N AH
+brianna's B R IY AE N AH Z
+briant B R AY AH N T
+briar B R AY ER
+briarcliff B R AY R K L IH F
+bribe B R AY B
+bribed B R AY B D
+bribery B R AY B ER IY
+bribes B R AY B Z
+bribing B R AY B IH NG
+bric B R IH K
+briccetti B R IH CH EH T IY
+bricco B R IH K OW
+brice B R AY S
+briceno B R IY CH EH N OW
+brick B R IH K
+brickbat B R IH K B AE T
+brickbats B R IH K B AE T S
+brickel B R IH K AH L
+brickell B R IH K AH L
+bricker B R IH K ER
+brickey B R IH K IY
+brickhouse B R IH K HH AW S
+bricklayer B R IH K L EY ER
+bricklayers B R IH K L EY ER Z
+brickle B R IH K AH L
+brickler B R IH K L ER
+brickley B R IH K L IY
+bricklin B R IH K L IH N
+bricklin's B R IH K L IH N Z
+brickman B R IH K M AH N
+brickner B R IH K N ER
+bricks B R IH K S
+brickyard B R IH K Y AA R D
+bricom B R IH K AH M
+bridal B R AY D AH L
+bride B R AY D
+bride's B R AY D Z
+brideau B R IH D OW
+bridegroom B R AY D G R UW M
+bridegroom's B R AY D G R UW M Z
+briden B R AY D AH N
+bridenbaugh B R IH D IH N B AW
+bridenstine B R IH D IH N S T IY N
+brides B R AY D Z
+bridesburg B R AY D Z B AH R G
+bridesmaid B R AY D Z M EY D
+bridesmaid's B R AY D Z M EY D Z
+bridesmaids B R AY D Z M EY D Z
+bridesmaids' B R AY D Z M EY D Z
+bridge B R IH JH
+bridge's B R IH JH IH Z
+bridged B R IH JH D
+bridgeford B R IH JH F AO R D
+bridgeforth B R IH JH F AO R TH
+bridgehead B R IH JH HH EH D
+bridgeman B R IH JH M AH N
+bridgeport B R IH JH P AO R T
+bridger B R IH JH ER
+bridgers B R IH JH ER Z
+bridges B R IH JH AH Z
+bridges(2) B R IH JH IH Z
+bridgestone B R IH JH S T OW N
+bridgestone's B R IH JH S T OW N Z
+bridget B R IH JH AH T
+bridget's B R IH JH AH T S
+bridget(2) B R IH JH IH T
+bridgeton B R IH JH T AH N
+bridgetown B R IH JH T AW N
+bridgett B R IH JH IH T
+bridgette B R IH JH IH T
+bridgette(2) B R IH JH IY T
+bridgewater B R IH JH W AO T ER
+bridgham B R IH JH HH AH M
+bridging B R IH JH IH NG
+bridgman B R IH JH M AH N
+bridie B R IH D IY
+bridle B R AY D AH L
+bridled B R AY D AH L D
+bridwell B R IH D W EH L
+brie B R IY
+brieant B R IY AH N T
+brief B R IY F
+briefcase B R IY F K EY S
+briefcases B R IY F K EY S IH Z
+briefed B R IY F T
+briefer B R IY F ER
+briefers B R IY F ER Z
+briefest B R IY F AH S T
+briefing B R IY F IH NG
+briefings B R IY F IH NG Z
+briefly B R IY F L IY
+briefs B R IY F S
+briegel B R IY G AH L
+brieger B R IY G ER
+briel B R IY L
+brien B R AY IH N
+brienza B R IY N Z AH
+brier B R AY ER
+briere B R IH R
+brierley B R AY ER L IY
+brierly B R AY ER L IY
+briese B R IY Z
+brietzke B R IY T S K IY
+brig B R IH G
+brigade B R AH G EY D
+brigade(2) B R IH G EY D
+brigadeer B R IH G AH D IH R
+brigades B R IH G EY D Z
+brigadier B R IH G AH D IH R
+brigance B R IH G AH N S
+brigandi B R IH G AE N D IY
+brigante B R IY G AA N T IY
+briganti B R IH G AE N T IY
+briggs B R IH G Z
+briggstone B R IH G S T OW N
+brigham B R IH G AH M
+brigham's B R IH G AH M Z
+brighams B R IH G AH M Z
+bright B R AY T
+bright's B R AY T S
+brightbill B R AY T B IH L
+brighten B R AY T AH N
+brightened B R AY T AH N D
+brightening B R AY T AH N IH NG
+brightening(2) B R AY T N IH NG
+brightens B R AY T AH N Z
+brighter B R AY T ER
+brightest B R AY T AH S T
+brightly B R AY T L IY
+brightman B R AY T M AH N
+brightness B R AY T N AH S
+brighton B R AY T AH N
+brightwell B R AY T W EH L
+brigitte B R IH JH IH T
+brigman B R IH G M AH N
+brignac B R IH G N AH K
+brigner B R AY G N ER
+brigode B R IH G OW D AH
+briguglio B R IH G AH G L IY OW
+briles B R AY L Z
+briley B R IH L IY
+brill B R IH L
+brill's B R IH L Z
+brillhart B R IH L HH AA R T
+brilliance B R IH L Y AH N S
+brilliant B R IH L Y AH N T
+brilliantly B R IH L Y AH N T L IY
+brillstein B R IH L S T IY N
+brillstein(2) B R IH L S T AY N
+brim B R IH M
+brimberry B R IH M B EH R IY
+brimelow B R IH M AH L OW
+brimer B R AY M ER
+brimhall B R IH M HH AO L
+brimm B R IH M
+brimmed B R IH M D
+brimmer B R IH M ER
+brimming B R IH M IH NG
+brimstone B R IH M S T OW N
+brin B R IH N
+brindel B R IH N D EH L
+brindle B R IH N D AH L
+brindley B R IH N D L IY
+brine B R AY N
+brinegar B R IH N IH G ER
+briner B R AY N ER
+brines B R AY N Z
+briney B R IH N IY
+bring B R IH NG
+bringhurst B R IH NG HH ER S T
+bringing B R IH NG IH NG
+bringle B R IH NG G AH L
+bringman B R IH NG M AH N
+brings B R IH NG Z
+brington B R IH NG T AH N
+brining B R AY N IH NG
+brink B R IH NG K
+brink's B R IH NG K S
+brinker B R IH NG K ER
+brinkerhoff B R IH NG K ER HH AO F
+brinkley B R IH NG K L IY
+brinkley's B R IH NG K L IY Z
+brinkly B R IH NG K L IY
+brinkman B R IH NG K M AH N
+brinkmann B R IH NG K M AH N
+brinkmann's B R IH NG K M AH N Z
+brinkmanship B R IH NG K M AH N SH IH P
+brinkmeier B R IH NG K M AY ER
+brinkmeyer B R IH NG K M AY ER
+brinks B R IH NG K S
+brinksmanship B R IH NG K S M AH N SH IH P
+brinlee B R IH N L IY
+brinley B R IH N L IY
+brinn B R IH N
+brinner B R IH N ER
+brinser B R IH N S ER
+brinsfield B R IH N S F IY L D
+brinson B R IH N S AH N
+brintec B R IH N T EH K
+brinton B R IH N T AH N
+brio B R AY OW
+brioche B R IY OW SH
+brioche(2) B R IY AA SH
+briody B R AY AH D IY
+brion B R AY AH N
+briones B R IY OW N EH S
+briquemont B R IH K M AO N T
+brisbane B R IH Z B EY N
+brisbin B R IH Z B IH N
+brisbois B R IH Z B W AA
+brisbon B R IH Z B AH N
+brisburg B R IH S B ER G
+brisco B R IY S K OW
+briscoe B R IH S K OW
+brisendine B R IH S IH N D AY N
+briseno B R IY S EH N OW
+briseno's B R IY S EH N OW Z
+brisk B R IH S K
+brisker B R IH S K ER
+brisket B R IH S K AH T
+briskey B R IH S K IY
+briski B R IH S K IY
+briskin B R IH S K IH N
+briskly B R IH S K L IY
+brisky B R IH S K IY
+brislin B R IH S L IH N
+brison B R IH S AH N
+brissette B R IH S EH T
+brissey B R IH S IY
+brisson B R IH S AH N
+brister B R IH S T ER
+bristle B R IH S AH L
+bristled B R IH S AH L D
+bristles B R IH S AH L Z
+bristling B R IH S AH L IH NG
+bristling(2) B R IH S L IH NG
+bristol B R IH S T AH L
+bristol's B R IH S T AH L Z
+bristow B R IH S T OW
+brit B R IH T
+brita B R IY T AH
+britain B R IH T AH N
+britain's B R IH T AH N Z
+britains B R IH T AH N Z
+britannia B R IH T AE N IY AH
+britannica B R IH T AE N IH K AH
+britcher B R IH CH ER
+britches B R IH CH AH Z
+brite B R AY T
+britian B R IH SH AH N
+british B R IH T IH SH
+britnell B R IH T N AH L
+brito B R IY T OW
+britoil B R IH T OY L
+briton B R IH T AH N
+britons B R IH T AH N Z
+britons' B R IH T AH N Z
+brits B R IH T S
+britsch B R IH CH
+britt B R IH T
+brittain B R IH T AH N
+brittan B R IH T AH N
+brittania B R IH T AE N IY AH
+brittania(2) B R IH T AE N Y AH
+brittany B R IH T AH N IY
+britten B R IH T AH N
+brittenham B R IH T IH N HH AH M
+brittian B R IH T IY AH N
+brittin B R IH T IH N
+brittingham B R IH T IH NG HH AE M
+brittle B R IH T AH L
+brittler B R IH T L ER
+brittlest B R IH T L IH S T
+britton B R IH T AH N
+britts B R IH T S
+britz B R IH T S
+brix B R IH K S
+brixey B R IH K S IY
+brixius B R AY K S IY IH S
+brizendine B R IY Z EH N D IY N IY
+brizill B R IH Z IH L
+brizola B R IH Z OW L AH
+brizzi B R IH Z IY
+brizzolara B R IY T S OW L AA R AH
+bro B R OW
+bro's B R OW Z
+broach B R OW CH
+broached B R OW CH T
+broaches B R OW CH IH Z
+broaching B R OW CH IH NG
+broad B R AO D
+broad's B R AO D Z
+broadacre B R AO D EY K ER
+broadaway B R AO D AH W EY
+broadband B R AO D B AE N D
+broadbase B R AO D B EY S
+broadbased B R AO D B EY S T
+broadbeach B R AO D B IY CH
+broadbent B R AO D B EH N T
+broadcast B R AO D K AE S T
+broadcaster B R AO D K AE S T ER
+broadcaster's B R AO D K AE S T ER Z
+broadcasters B R AO D K AE S T ER Z
+broadcasters' B R AO D K AE S T ER Z
+broadcasting B R AO D K AE S T IH NG
+broadcasting's B R AO D K AE S T IH NG Z
+broadcasts B R AO D K AE S T S
+broadcasts(2) B R AO D K AE S S
+broadcasts(3) B R AO D K AE S
+broaddus B R AO D IH S
+broaden B R AO D AH N
+broadened B R AO D AH N D
+broadening B R AO D AH N IH NG
+broadening(2) B R AO D N IH NG
+broadens B R AO D AH N Z
+broader B R AO D ER
+broadest B R AO D IH S T
+broadhead B R AO D HH EH D
+broadhurst B R AO D HH ER S T
+broadie B R AO D IY
+broadley B R AO D L IY
+broadly B R AO D L IY
+broadnax B R AO D N AE K S
+broadpfoot B R AO D F UH T
+broadrick B R AO D R IH K
+broadside B R AO D S AY D
+broadsided B R AO D S AY D IH D
+broadstreet B R AO D S T R IY T
+broadsword B R AO D S AO R D
+broadus B R OW D AH S
+broadview B R AO D V Y UW
+broadway B R AO D W EY
+broadway's B R AO D W EY Z
+broadwell B R AO D W EH L
+broady B R AO D IY
+brobdingnagian B R AO B D IH G N AE G IY AH N
+brobdingnagians B R AO B D IH G N AE G IY AH N Z
+brobeck B R OW B EH K
+broberg B R OW B ER G
+brobst B R AA B S T
+broc B R AA K
+brocade B R OW K EY D
+brocades B R OW K EY D Z
+brocato B R OW K AA T OW
+brocco B R AA K OW
+broccoli B R AA K AH L IY
+broccoli(2) B R AA K L IY
+broce B R OW S
+brochu B R OW K UW
+brochure B R OW SH UH R
+brochures B R OW SH UH R Z
+brocious B R AH SH IY S
+brock B R AA K
+brock's B R AA K S
+brockbank B R AA K B AH NG K
+brockel B R AA K AH L
+brocker B R AA K ER
+brockert B R AA K ER T
+brockett B R AA K IH T
+brockhaus B R AA K HH AW S
+brockhoff B R AA K HH AO F
+brockhouse B R AA K HH AW S
+brockie B R AA K IY
+brockington B R AA K IH NG T AH N
+brocklehurst B R AA K AH L HH ER S T
+brockley B R AA K L IY
+brocklin B R AA K L IH N
+brocklin's B R AA K L IH N Z
+brockman B R AA K M AH N
+brockmann B R AA K M AH N
+brockmeier B R AA K M AY ER
+brockmeyer B R AA K M AY ER
+brockner B R AA K N ER
+brocksmith B R AA K S M IH TH
+brockton B R AA K T AH N
+brockway B R AA K W EY
+brockway's B R AA K W EY Z
+brockwell B R AA K W EH L
+brod B R AA D
+broda B R OW D AH
+brodbeck B R AA D B EH K
+brode B R OW D
+broden B R OW D AH N
+broder B R OW D ER
+broder's B R OW D ER Z
+broderbund B R OW T ER B AH N D
+broderick B R AA D ER IH K
+broderick's B R AA D ER IH K Z
+broderick's(2) B R AA D R IH K Z
+broderick(2) B R AA D R IH K
+brodersen B R AA D ER S AH N
+brodersohn B R OW T ER S AH N
+broderson B R AA D ER S AH N
+brodeur B R AA D ER
+brodhead B R AA D HH EH D
+brodie B R OW T IY
+brodin B R OW D IH N
+brodkin B R AA D K IH N
+brodman B R AA D M AH N
+brodnax B R AA D N AE K S
+brodowski B R AH D AO F S K IY
+brodrick B R AA D R IH K
+brodry B R AA D R IY
+brodsky B R AA D S K IY
+brodt B R AA D T
+brody B R OW D IY
+brody's B R OW D IY Z
+brodzinski B R AH JH IH N S K IY
+broe B R OW
+broecker B R OW K ER
+broeker B R OW K ER
+broer B R OW ER
+broerman B R OW ER M AH N
+broers B R OW ER Z
+brogan B R OW G AH N
+brogden B R AA G D AH N
+brogdon B R AA G D AH N
+brogna B R OW G N AH
+broich B R OY CH
+broil B R OY L
+broiled B R OY L D
+broiler B R OY L ER
+broilers B R OY L ER Z
+broiling B R OY L IH NG
+broin B R OY N
+brok B R AA K
+brokaw B R OW K AO
+broke B R OW K
+broken B R OW K AH N
+broken-wind B R OW K AH N W IH N D
+broken-winded B R OW K AH N W IH N D IH D
+broker B R OW K ER
+broker's B R OW K ER Z
+brokerage B R OW K ER IH JH
+brokerage's B R OW K ER IH JH IH Z
+brokerage's(2) B R OW K R IH JH IH Z
+brokerage(2) B R OW K R IH JH
+brokerages B R OW K ER IH JH IH Z
+brokerages' B R OW K ER IH JH IH Z
+brokerages'(2) B R OW K R IH JH IH Z
+brokerages(2) B R OW K R IH JH IH Z
+brokered B R OW K ER D
+brokering B R OW K ER IH NG
+brokers B R OW K ER Z
+brokers' B R OW K ER Z
+broking B R OW K IH NG
+brokini B R AH K IY N IY
+brolin B R OW L IH N
+brolly B R AA L IY
+brom B R AA M
+broman B R OW M AH N
+bromberg B R AA M B ER G
+bromfield B R AA M F IY L D
+bromfield's B R AA M F IY L D Z
+bromide B R OW M AY D
+bromides B R OW M AY D Z
+bromine B R OW M IY N
+bromley B R AA M L IY
+bromm B R AA M
+brommer B R AA M ER
+bromont B R OW M AA N T
+brompheril B R AA M F EH R IH L
+bromwell B R AA M W EH L
+bromwich B R AA M W IH CH
+bronaugh B R AA N AO
+bronc B R AA NG K
+bronchial B R AA N CH IY AH L
+bronchitis B R AA NG K AY T AH S
+bronchoscope B R AA N K AH S K OW P
+bronco B R AA NG K OW
+broncos B R AA NG K OW Z
+bronder B R AA N D ER
+broner B R OW N ER
+bronfman B R AA N F M AH N
+bronfman's B R AA N F M AH N Z
+bronfmans B R AA N F M AH N Z
+bronk B R AA NG K
+bronkema B R AH NG K IY M AH
+bronn B R AA N
+bronner B R AA N ER
+brons B R AA N Z
+bronson B R AA N S AH N
+bronstein B R AA N S T IY N
+bronstein(2) B R AA N S T AY N
+bronston B R AA N S T AH N
+bronte B R AA N T IY
+bronte's B R AA N T IY Z
+brontosaurus B R AO N T AH S AO R AH S
+brontosaurus(2) B R AO N AH S AO R AH S
+bronwen B R AO N W IH N
+bronwyn B R AA N W IH N
+bronx B R AA NG K S
+bronze B R AA N Z
+bronzed B R AA N Z D
+bronzen B R AA N Z AH N
+bronzes B R AA N Z AH Z
+bronzes(2) B R AA N Z IH Z
+brooch B R UW CH
+brooch(2) B R OW CH
+brood B R UW D
+brooded B R UW D IH D
+brooding B R UW D IH NG
+broody B R UW D IY
+brook B R UH K
+brook's B R UH K S
+brookbank B R UH K B AE NG K
+brooke B R UH K
+brooke's B R UH K S
+brookehill B R UH K HH IH L
+brooken B R UH K AH N
+brookens B R UH K AH N Z
+brooker B R UH K ER
+brookes B R UH K S
+brookfield B R UH K F IY L D
+brookhart B R UW K HH AA R T
+brookhaven B R UH K HH EY V AH N
+brookhurst B R UH K HH ER S T
+brooking B R UH K IH NG
+brookings B R UH K IH NG Z
+brookins B R UW K IH N Z
+brookline B R UH K L AY N
+brooklyn B R UH K L AH N
+brooklyn's B R UH K L AH N Z
+brooklyn's(2) B R UH K L IH N Z
+brooklyn(2) B R UH K L IH N
+brookman B R UH K M AH N
+brookner B R UH K N ER
+brookner's B R UH K N ER Z
+brookover B R UH K OW V ER
+brooks B R UH K S
+brooks' B R UH K S
+brooks's B R UH K S IH Z
+brooks's(2) B R UH K S
+brookshier B R UW K SH IY ER
+brookshire B R UW K SH AY R
+brookside B R UH K S AY D
+brookstone B R UH K S T OW N
+brooksville B R UH K S V IH L
+brooksville's B R UH K S V IH L Z
+broom B R UW M
+broomall B R UW M AH L
+broome B R UW M
+broomfield B R UW M F IY L D
+brooms B R UW M Z
+broomstick B R UW M S T IH K
+broomsticks B R UW M S T IH K S
+brophy B R OW F IY
+brosch B R AO SH
+brose B R OW Z
+brosh B R AA SH
+broshears B R AA SH IH R Z
+brosious B R OW Z IY AH S
+brosius B R OW S IY IH S
+broski B R AW S K IY
+brosky B R AA S K IY
+brosnahan B R AA S N AH HH AE N
+brosnan B R AA S N AH N
+bross B R AO S
+brossard B R AH S AA R D
+brossart B R AA S AA R T
+brosseau B R AH S OW
+brosser B R AA S ER
+brossette B R AH S EH T
+brossman B R AO S M AH N
+brost B R AA S T
+brostrom B R AA S T R AH M
+brosz B R AA SH
+broten B R OW T AH N
+broth B R AO TH
+brothel B R AA TH AH L
+brothels B R AA TH AH L Z
+brother B R AH DH ER
+brother's B R AH DH ER Z
+brotherhood B R AH DH ER HH UH D
+brotherly B R AH DH ER L IY
+brothers B R AH DH ER Z
+brothers' B R AH DH ER Z
+brothers's B R AH DH ER Z IH Z
+brotherson B R AH DH ER S AH N
+brotherton B R AH DH ER T AH N
+broths B R AO TH S
+brotman B R AA T M AH N
+brott B R AA T
+brotzman B R AA T S M AH N
+broucek B R UW CH EH K
+broudy B R AW D IY
+brough B R AW
+brougham B R UW G AH M
+brougher B R AW ER
+broughman B R AW M AH N
+brought B R AO T
+broughton B R AO T AH N
+brouhaha B R UW HH AA HH AA
+brouhard B R AA UW ER D
+brouillard B R W IY L AA R D
+brouillet B R W IY L EH T
+brouillette B R W IY L EH T
+broun B R UW N
+brountas B R AW N T AH S
+brouse B R AW S
+broussard B R UW S AA R D
+brousseau B R UW S OW
+brousset B R UW S EH T
+brouwer B R AW W ER
+brow B R AW
+broward B R AW ER D
+browbeat B R AW B IY T
+browder B R AW D ER
+browe B R OW
+browed B R AW D
+brower B R AW ER
+brown B R AW N
+brown's B R AW N Z
+brownback B R AW N B AE K
+browne B R AW N
+browned B R AW N D
+brownell B R AW N EH L
+browner B R AW N ER
+brownest B R AW N IH S T
+brownfield B R AW N F IY L D
+brownfields B R AW N F IY L D Z
+brownie B R AW N IY
+brownies B R AW N IY Z
+browning B R AW N IH NG
+browning's B R AW N IH NG Z
+brownish B R AW N IH SH
+brownlee B R AW N L IY
+brownley B R AW N L IY
+brownlie B R AW N L IY
+brownlow B R AW N L OW
+brownmiller B R AW N M IH L ER
+brownout B R AW N AW T
+brownouts B R AW N AW T S
+brownrigg B R AW N R IH G
+browns B R AW N Z
+browns' B R AW N Z
+brownson B R AW N S AH N
+brownstein B R AW N S T AY N
+brownstein(2) B R AW N S T IY N
+brownstone B R AW N S T OW N
+brownsville B R AW N Z V IH L
+brows B R AW Z
+browse B R AW Z
+browsed B R AW Z D
+browser B R AW Z ER
+browsers B R AW Z ER Z
+browsing B R AW Z IH NG
+brox B R AA K S
+broxson B R AA K S AH N
+broxterman B R AA K S T ER M AH N
+broxton B R AA K S T AH N
+broy B R OY
+broyard B R OY ER D
+broyhill B R OY HH IH L
+broyles B R OY L Z
+broz B R AA Z
+brozek B R OW Z EH K
+brozman B R AA Z M AH N
+brozovich B R AA Z AH V IH CH
+brozowski B R AH Z AO F S K IY
+brubaker B R AH B AH K ER
+brubeck B R UW B EH K
+brucato B R UW K AA T OW
+bruce B R UW S
+bruce's B R UW S AH Z
+bruch B R AH CH
+bruchhausen B R UW K HH AW Z AH N
+brucie B R AH K IY
+brucite B R UW S AY T
+bruck B R AH K
+bruck's B R AH K S
+brucker B R AH K ER
+bruckheimer B R AH K HH AY M ER
+bruckman B R AH K M AH N
+bruckner B R AH K N ER
+brucks B R AH K S
+bruder B R UW D ER
+brue B R UW
+bruecher B R UW CH ER
+brueck B R UW K
+brueckner B R UH K N ER
+bruegge B R UW G AH
+brueggeman B R UW G M AH N
+brueggemann B R UW G M AH N
+brueggen B R UW G AH N
+bruegger B R UW G ER
+bruegger's B R UW G ER Z
+bruehl B R UW L
+bruella B R UW EH L AH
+bruemmer B R UW M ER
+bruen B R UW N
+bruening B R UW N IH NG
+bruer B R UW ER
+bruff B R AH F
+bruford B R UW F ER D
+bruges B R UW JH IH Z
+bruges(2) B R UW ZH
+bruggeman B R AH G M AH N
+brugger B R AH G ER
+brugh B R AH
+brugman B R AH G M AH N
+bruha B R UW HH AH
+bruhl B R AH L
+bruhn B R AH N
+bruin B R UW IH N
+bruin's B R UW IH N Z
+bruington B R UW IH NG T AH N
+bruins B R UW IH N Z
+bruinsma B R UW IH N S M AH
+bruise B R UW Z
+bruised B R UW Z D
+bruises B R UW Z AH Z
+bruises(2) B R UW Z IH Z
+bruising B R UW Z IH NG
+brule B R UW L
+bruley B R UW L IY
+brum B R AH M
+brumbach B R AH M B AA K
+brumback B R AH M B AE K
+brumbaugh B R AH M B AO
+brumbelow B R AH M B IH L OW
+brumer B R UW M ER
+brumett B R AH M IH T
+brumfield B R AH M F IY L D
+brumit B R UW M IH T
+brumitt B R UW M IH T
+brumley B R AH M L IY
+brumlow B R AH M L OW
+brumm B R AH M
+brummel B R AH M AH L
+brummell B R AH M AH L
+brummer B R AH M ER
+brummet B R AH M IH T
+brummett B R AH M IH T
+brummitt B R AH M IH T
+brummond B R AH M AH N D
+brun B R AH N
+bruna B R UW N AH
+brunch B R AH N CH
+brunches B R AH N CH IH Z
+bruncor B R AH N K AO R
+brundage B R AH N D IH JH
+brundidge B R AH N D IH JH
+brundige B R AH N D IH G
+brundtland B R AH N T L AH N D
+brune B R UW N
+bruneau B R AH N OW
+brunei B R UW N AY
+brunell B R AH N AH L
+brunella B R UW N EH L AH
+brunelle B R AH N EH L
+brunelli B R UW N EH L IY
+bruner B R UW N ER
+brunet B R UW N EH T
+brunett B R AH N IH T
+brunetta B R UW N EH T AH
+brunette B R UW N EH T
+brunettes B R UW N EH T S
+brunetti B R UW N EH T IY
+brunetto B R UW N EH T OW
+bruney B R UW N IY
+brungard B R AH NG G ER D
+brungardt B R AH NG G AA R T
+brunger B R AH NG ER
+brunhilda B R UW N HH IY L D AH
+bruni B R UW N IY
+brunick B R UW N IH K
+bruning B R UW N IH NG
+brunjes B R AH N ZH IY Z
+brunk B R AH NG K
+brunke B R AH NG K
+brunken B R AH NG K AH N
+brunker B R AH NG K ER
+brunkhorst B R AH NG K HH AO R S T
+brunkow B R AH NG K OW
+brunn B R AH N
+brunner B R AH N ER
+brunnhilde B R AH N HH IH L D
+bruno B R UW N OW
+bruno's B R UW N OW Z
+bruns B R AH N Z
+brunskill B R AH N S K IH L
+brunsman B R AH N S M AH N
+brunson B R AH N S AH N
+brunsvold B R AH N Z V OW L D
+brunswick B R AH N Z W IH K
+brunswick's B R AH N Z W IH K S
+brunswig B R AH N S W IH G
+brunswig's B R AH N S W IH G Z
+brunt B R AH N T
+bruntjen B R AH N T JH EH N
+brunton B R AH N T AH N
+brunty B R AH N T IY
+bruntz B R AH N T S
+brus B R AH S
+brusca B R AH S K AH
+bruschi B R UW S K IY
+brusco B R UW S K OW
+bruse B R UW Z
+brusett B R UH S EH T
+brusett(2) B R UW S EH T
+brusette B R UW S EH T
+brush B R AH SH
+brushaber B R AH SH AH B ER
+brushed B R AH SH T
+brushes B R AH SH IH Z
+brushfire B R AH SH F AY R
+brushfires B R AH SH F AY R Z
+brushing B R AH SH IH NG
+brushwork B R AH SH W ER K
+brushy B R AH SH IY
+bruske B R AH S K
+bruski B R AH S K IY
+brusky B R AH S K IY
+bruso B R UW S OW
+brusque B R AH S K
+brusquely B R AH S K L IY
+bruss B R AH S
+brusseau B R AH S OW
+brussel B R AH S AH L
+brusselmans B R AH S AH L M AH N Z
+brussels B R AH S AH L Z
+brust B R AH S T
+bruster B R AH S T ER
+brustoloni B R UW S T OW L OW N IY
+brut B R UW T
+brutal B R UW T AH L
+brutalities B R UW T AE L AH T IY Z
+brutality B R UW T AE L AH T IY
+brutality(2) B R UW T AE L IH T IY
+brutalization B R UW T AH L AH Z EY SH AH N
+brutalize B R UW T AH L AY Z
+brutalized B R UW T AH L AY Z D
+brutalizes B R UW T AH L AY Z IH Z
+brutalizing B R UW T AH L AY Z IH NG
+brutally B R UW T AH L IY
+brute B R UW T
+bruting B R UW T IH NG
+brutish B R UW T IH SH
+bruton B R UW T AH N
+brutsche B R AH CH IY
+brutus B R UW T AH S
+bruun B R UW N
+bruxelles B R AH K S EH L AH S
+bruyette B R UW EH T
+bruynes B R UW IH N Z
+bruzzese B R UW T S EY Z IY
+bryan B R AY AH N
+bryan's B R AY AH N Z
+bryans B R AY AH N Z
+bryans' B R AY AH N Z
+bryant B R AY AH N T
+bryars B R AY ER Z
+bryce B R AY S
+bryden B R AY D AH N
+brydges B R IH JH IH Z
+brydie B R IH D IY
+brydon B R IH D AH N
+brye B R AY
+bryen B R AY AH N
+bryer B R AY ER
+bryk B R IH K
+brymer B R AY M ER
+bryn B R IH N
+bryna B R IH N AH
+bryne B R AY N
+bryner B R AY N ER
+bryngelson B R IH NG G IH L S AH N
+bryon B R AY AH N
+brys B R IH S
+bryson B R AY S AH N
+brzezinski B R IH Z IH N S K IY
+brzoska B R OW S K AH
+brzozowski B R AH Z AO F S K IY
+brzycki B R IH T S K IY
+bt B IY T IY
+bta B IY T IY EY
+bua B Y UW AH
+bua(2) B IY Y UW EY
+bub B AH B
+bubar B UW B ER
+bubb B AH B
+bubba B AH B AH
+bubble B AH B AH L
+bubbled B AH B AH L D
+bubbles B AH B AH L Z
+bubbling B AH B AH L IH NG
+bubbling(2) B AH B L IH NG
+bubbly B AH B L IY
+bubbly(2) B AH B AH L IY
+bubeck B UW B EH K
+bubel B UW B AH L
+bubier B Y UW B IY ER
+bubinga B AH B IH NG G AH
+bubka B AH B K AH
+bublitz B AH B L IH T S
+buboltz B Y UW B OW L T S
+bubolz B Y UW B OW L Z
+bubonic B Y UW B AA N IH K
+buc B AH K
+bucaro B UW K AA R OW
+bucase B Y UW K EY S
+buccal B Y UW K AH L
+buccaneer B AH K AH N IY R
+buccaneers B AH K AH N IY R Z
+buccellato B UW CH EH L AA T OW
+buccheri B UW K EH R IY
+bucci B UW CH IY
+bucciarelli B UW CH ER EH L IY
+buccieri B UW CH IH R IY
+buccino B UW CH IY N OW
+bucco B UW K OW
+buccola B UW K OW L AH
+bucek B UW CH EH K
+bucey B Y UW S IY
+buch B AH CH
+buchalter B AH K AH L T ER
+buchan B AH K AH N
+buchanan B Y UW K AE N AH N
+buchanan's B Y UW K AE N AH N Z
+buchananism B Y UW K AE N AH N IH Z AH M
+buchanans B Y UW K AE N AH N Z
+buchannan B Y UW K AE N AH N
+buchanon B Y UW K AE N AH N
+bucharest B Y UW K ER EH S T
+bucharest(2) B UW K ER EH S T
+buchberger B AH K B ER G ER
+buchbinder B AH K B IH N D ER
+buchbinder(2) B UH K B AY N D ER
+buche B AH CH
+buchen B AH K AH N
+buchenwald B Y UW K EH N W AA L D
+bucher B AH K ER
+buchert B AH CH ER T
+buchheit B AH K HH AY T
+buchholtz B AH K HH OW L T S
+buchholz B AH K HH OW L Z
+buchi B AH CH IY
+buchi's B AH CH IY Z
+buchi's(2) B UW CH IY Z
+buchi(2) B UW CH IY
+buchinger B AH K IH N JH ER
+buchko B AH CH K OW
+buchler B AH K AH L ER
+buchler(2) B AH K L ER
+buchman B AH K M AH N
+buchmann B AH K M AH N
+buchmiller B AH K M AH L ER
+buchmiller(2) B UH K M AH L ER
+buchner B AH K N ER
+bucholtz B AH K OW L T S
+bucholtz(2) B UH K OW L T S
+bucholz B AH K OW L Z
+buchs B AH K S
+buchsbaum B AH K S B AW M
+buchta B AH CH T AH
+buchter B AH K T ER
+buchwald B AH K W AO L D
+buck B AH K
+buck's B AH K S
+buckalew B AH K AH L UW
+buckbee B AH K B IY
+bucked B AH K T
+buckel B AH K AH L
+buckelew B AH K IH L UW
+buckels B AH K AH L Z
+bucket B AH K AH T
+bucket(2) B AH K IH T
+buckets B AH K AH T S
+buckey B AH K IY
+buckeye B AH K AY
+buckeyes B AH K AY Z
+buckhantz B AH K HH AE N T S
+buckholtz B AH K HH OW L T S
+buckholz B AH K HH OW L Z
+buckhorn B AH K HH AO R N
+bucking B AH K IH NG
+buckingham B AH K IH NG HH AE M
+buckland B AH K L AH N D
+buckle B AH K AH L
+buckled B AH K AH L D
+buckler B AH K AH L ER
+buckler(2) B AH K L ER
+buckles B AH K AH L Z
+bucklew B AH K L UW
+buckley B AH K L IY
+bucklin B AH K L IH N
+buckling B AH K L IH NG
+buckman B AH K M AH N
+buckmaster B AH K M AE S T ER
+buckminster B AH K M IH N S T ER
+bucknam B AH K N AH M
+bucknell B AH K N EH L
+buckner B AH K N ER
+bucko B AH K OW
+bucks B AH K S
+buckshot B AH K SH AA T
+buckskin B AH K S K IH N
+buckskins B AH K S K IH N Z
+buckstein B AH K S T IY N
+buckthorn B AH K TH AO R N
+buckwalter B AH K W AH L T ER
+buckwheat B AH K W IY T
+bucky B AH K IY
+bucoba B Y UW K OW B AH
+bucolic B Y UW K AA L IH K
+bucs B AH K S
+bucs' B AH K S
+bucy B Y UW S IY
+buczek B AH CH EH K
+buczkowski B AH CH K AO F S K IY
+buczynski B AH CH IH N S K IY
+bud B AH D
+bud's B AH D Z
+bud-test B AH D T EH S T
+budai B UW D AA IY
+budapest B UW D AH P EH S T
+budapest's B UW D AH P EH S T S
+budapest's(2) B UW D AH P EH SH T S
+budapest(2) B UW D AH P EH SH T
+buday B UW D EY
+budd B AH D
+budde B AH D
+budden B AH D AH N
+buddenbrooks B AH D AH N B R UH K S
+buddenhagen B AH D IH N HH AH G AH N
+buddha B UW D AH
+buddha's B UW D AH Z
+buddhism B UW D IH Z AH M
+buddhist B UW D AH S T
+buddhists B UW D AH S T S
+buddhists(2) B UW D AH S S
+buddhists(3) B UW D AH S
+buddie B AH D IY
+buddier B AH D IY ER
+buddiers B AH D IY ER Z
+buddies B AH D IY Z
+buddin B AH D IH N
+budding B AH D IH NG
+buddy B AH D IY
+buddy's B AH D IY Z
+buder B Y UW D ER
+budge B AH JH
+budged B AH JH D
+budget B AH JH IH T
+budget's B AH JH IH T S
+budgetary B AH JH IH T EH R IY
+budgeted B AH JH IH T AH D
+budgeted(2) B AH JH IH T IH D
+budgeteer B AH JH IH T IH R
+budgeteers B AH JH IH T IH R Z
+budgeting B AH JH IH T IH NG
+budgets B AH JH IH T S
+budging B AH JH IH NG
+budick B AH D IH K
+budick's B AH D IH K S
+budiman B Y UW T IH M AH N
+budiman(2) B AH D IH M AH N
+budin B UW D IH N
+budinger B Y UW D IH NG ER
+budka B AH D K AH
+budke B AH D K IY
+budlong B AH D L AO NG
+budner B AH D N ER
+budney B AH D N IY
+budnick B AH D N IH K
+budnik B AH D N IH K
+budny B AH D N IY
+budreau B AH D R OW
+budrow B AH D R OW
+buds B AH D Z
+budson B AH D S AH N
+budvar B AH D V AA R
+budvar(2) B UH D V AA R
+budweiser B AH D W AY Z ER
+budyonnovsk B UW D Y AH N AA V S K
+budz B AH D Z
+budzinski B AH JH IH N S K IY
+budzyn B AH D Z IH N
+budzynski B AH JH IH N S K IY
+bue B W EH
+bueche B UW CH
+buechel B Y UW K AH L
+buechele B Y UW K AH L
+buechler B Y UW K AH L ER
+buechler(2) B Y UW K L ER
+buechner B Y UW K N ER
+buege B UW JH
+buegler B Y UW G L ER
+buehl B Y UW L
+buehler B Y UW L ER
+buehner B Y UW N ER
+buehrer B Y UW HH ER
+buehrer(2) B Y UW ER
+buehring B Y UW R IH NG
+buehrle B Y UW R AH L
+bueker B Y UW K ER
+buel B Y UW L
+buell B Y UW AH L
+buelow B UW L OW
+buena B UW N AH
+buendia B UW N D IY AH
+buenger B Y UW N JH ER
+buening B W EH N IH NG
+bueno B W EY N OW
+buenos B W EY N OW S
+buenos(2) B W EY N AH S
+buenos-aires B W EY N OW S EY R IY S
+buenos-aires(2) B W EY N AH S EY R IY S
+buenos-aires(3) B W EY N OW S EY R
+buenos-aires(4) B W EY N AH S EH R
+buenrostro B W EH N R OW S T R OW
+buentello B UW N T EH L OW
+buer B UW ER
+buerge B Y UW R JH
+buerger B Y UW R G ER
+buerkle B Y UW R K AH L
+buerry B EH R IY
+buescher B Y UW SH ER
+buesing B Y UW S IH NG
+bueter B Y UW T ER
+buetow B UW T OW
+buettner B Y UW T N ER
+bufano B UW F AA N OW
+bufe B Y UW F
+bufete B Y UW F IY T
+buff B AH F
+buff's B AH F S
+buffa B AH F AH
+buffalo B AH F AH L OW
+buffalo's B AH F AH L OW Z
+buffalos B AH F AH L OW Z
+buffer B AH F ER
+buffered B AH F ER D
+bufferin B AH F ER IH N
+buffering B AH F ER IH NG
+buffers B AH F ER Z
+buffet B AH F AH T
+buffet(2) B AH F EY
+buffeted B AH F EY D
+buffeted(2) B AH F IH T IH D
+buffeting B AH F EY IH NG
+buffeting(2) B AH F AH T IH NG
+buffets B AH F AH T S
+buffets(2) B AH F EY Z
+buffett B AH F IH T
+buffett's B AH F AH T S
+buffin B AH F IH N
+buffington B AH F IH NG T AH N
+buffkin B AH F K IH N
+buffo B UW F OW
+buffone B UW F OW N IY
+buffoon B AH F UW N
+bufford B AH F ER D
+buffs B AH F S
+buffton B AH F T AH N
+buffum B AH F AH M
+buffy B AH F IY
+bufkin B AH F K IH N
+buford B Y UW F ER D
+bug B AH G
+buga B Y UW G AH
+buga(2) B IY Y UW JH IY EY
+bugaboo B AH G AH B UW
+bugai B Y UW G AY
+bugai's B Y UW G AY Z
+bugaj B UW G AH JH
+bugarin B Y UW G ER IH N
+bugatti B AH G AA T IY
+bugay B Y UW G EY
+bugbee B AH G B IY
+bugeye B AH G AY
+bugeyed B AH G AY D
+bugg B AH G
+bugge B AH G
+bugged B AH G D
+bugger B AH G ER
+buggers B AH G ER Z
+buggies B AH G IY Z
+bugging B AH G IH NG
+buggs B AH G Z
+buggy B AH G IY
+bugh B Y UW G
+bugher B Y UW G ER
+bugle B Y UW G AH L
+bugles B Y UW G AH L Z
+bugling B Y UW G AH L IH NG
+bugling(2) B Y UW G L IH NG
+bugliosi B UW G L IY OW S IY
+bugliosi's B UW G L IY OW S IY Z
+bugojno B UW G OW ZH N OW
+bugs B AH G Z
+bugsy B AH G Z IY
+buhl B Y UW L
+buhler B UW L ER
+buhman B AH M AH N
+buhr B Y UH R
+buhrman B UH R M AH N
+buhrow B UH R OW
+bui B IH
+bui(2) B W IY
+buice B IH S
+buice(2) B W IY S
+buick B Y UW IH K
+buick's B Y UW IH K S
+buicks B Y UW IH K S
+buie B UW IY
+buie(2) B W IY
+buikema B IH K EY M AH
+buikema(2) B W IH K EY M AH
+buil B Y UW AH L
+build B IH L D
+buildable B IH L D AH B AH L
+builder B IH L D ER
+builder's B IH L D ER Z
+builders B IH L D ER Z
+builders' B IH L D ER Z
+building B IH L D IH NG
+building's B IH L D IH NG Z
+buildings B IH L D IH NG Z
+builds B IH L D Z
+buildup B IH L D AH P
+buildups B IH L D AH P S
+built B IH L T
+buis B IH Z
+buisson B W IY S AA N
+buist B UW IH S T
+buitoni B Y UW T OW N IY
+buitrago B IH T R AA G OW
+buitron B IH T R AH N
+bujak B UW Y AH K
+bujumbura B UW JH AH M B UH R AH
+bukar B Y UW K AA R
+bukavu B UW K AA V UW
+bukavu's B UW K AA V UW Z
+buker B Y UW K ER
+bukharin B AH K HH ER IH N
+bukovsky B UW K AA V S K IY
+bukowski B Y UW K AO F S K IY
+bula B Y UW L AH
+bulat B UW L AH T
+bulb B AH L B
+bulbous B AH L B AH S
+bulbs B AH L B Z
+bulemia B AH L IY M IY AH
+bulemic B AH L IY M IH K
+bulen B AH L AH N
+bulent B Y UW L AH N T
+buley B Y UW L IY
+bulfinch B UH L F IH N CH
+bulfinch's B UH L F IH N CH IH Z
+bulgaria B AH L G EH R IY AH
+bulgaria's B AH L G EH R IY AH Z
+bulgarian B AH L G EH R IY AH N
+bulgarians B AH L G EH R IY AH N Z
+bulge B AH L JH
+bulged B AH L JH D
+bulger B AH L G ER
+bulges B AH L JH IH Z
+bulging B AH L JH IH NG
+bulgrin B UH L G R IH N
+bulimia B Y UW L IH M IY AH
+bulimic B Y UW L IH M IH K
+bulimic(2) B UW L IH M IH K
+bulin B Y UW L IH N
+bulk B AH L K
+bulkeley B UH L K AH L IY
+bulkhead B AH L K HH EH D
+bulkheads B AH L K HH EH D Z
+bulkier B AH L K IY ER
+bulkley B AH L K L IY
+bulky B AH L K IY
+bull B UH L
+bull's B UH L Z
+bulla B UH L AH
+bullard B UH L ER D
+bulldog B UH L D AO G
+bulldogs B UH L D AO G Z
+bulldoze B UH L D OW Z
+bulldozed B UH L D OW Z D
+bulldozer B UH L D OW Z ER
+bulldozers B UH L D OW Z ER Z
+bulldozes B UH L D OW Z IH Z
+bulldozing B UH L D OW Z IH NG
+bullen B UH L AH N
+buller B UH L ER
+bullet B UH L AH T
+bulletin B UH L IH T AH N
+bulletins B UH L AH T AH N Z
+bulletproof B UH L AH T P R UW F
+bullets B UH L AH T S
+bullfight B UH L F AY T
+bullfighter B UH L F AY T ER
+bullfighting B UH L F AY T IH NG
+bullfights B UH L F AY T Z
+bullfrog B UH L F R AO G
+bullfrogs B UH L F R AO G Z
+bullhead B UH L HH EH D
+bullheads B UH L HH EH D Z
+bullhorn B UH L HH AO R N
+bullhorns B UH L HH AO R N Z
+bullied B UH L IY D
+bullies B UH L IY Z
+bullinger B UH L IH NG ER
+bullington B UH L IH NG T AH N
+bullins B UH L IH N Z
+bullion B UH L Y AH N
+bullis B UH L IH S
+bullish B UH L IH SH
+bullishly B UH L IH SH L IY
+bullishness B UH L IH SH N AH S
+bullitt B UW L IH T
+bullman B UH L M AH N
+bulloch B UH L AH K
+bullock B UH L AH K
+bullock's B UH L AH K S
+bullocks B UH L AH K S
+bullpen B UH L P EH N
+bulls B UH L Z
+bulls' B UH L Z
+bullseye B UW L Z AY
+bullshit B UH L SH IH T
+bulluck B UH L AH K
+bullwinkle B UH L W IH NG K AH L
+bully B UH L IY
+bullying B UH L IY IH NG
+bulman B AH L M AH N
+bulmer B AH L M ER
+bulova B Y UW L OW V AH
+bulow B Y UW L OW
+bulrush B UH L R AH SH
+bulson B UH L S AH N
+bult B AH L T
+bultema B UW L T EH M AH
+bulthuis B AH L DH UW IH Z
+bultman B UH L T M AH N
+bulwark B UH L W ER K
+bulwinkle B UH L W IH NG K AH L
+bum B AH M
+bumann B Y UW M AH N
+bumbalough B AH M B AH L AW
+bumbarger B AH M B AA R G ER
+bumbaugh B AH M B AO
+bumble B AH M B AH L
+bumbling B AH M B AH L IH NG
+bumbling(2) B AH M B L IH NG
+bumbly B AH M B L IY
+bumgardner B AH M G AA R D N ER
+bumgarner B AH M G AA R N ER
+bumiputra B UW M IY P Y UW T R AH
+bummed B AH M D
+bummer B AH M ER
+bump B AH M P
+bumpas B AH M P AH Z
+bumpass B AH M P AE S
+bumped B AH M P T
+bumper B AH M P ER
+bumpers B AH M P ER Z
+bumpersticker B AH M P ER S T IH K ER
+bumperstickers B AH M P ER S T IH K ER Z
+bumping B AH M P IH NG
+bumpings B AH M P IH NG Z
+bumpkin B AH M P K IH N
+bumps B AH M P S
+bumpus B AH M P AH S
+bumpy B AH M P IY
+bums B AH M Z
+bumstead B AH M S T EH D
+bun B AH N
+bunce B AH N S
+bunch B AH N CH
+bunche B AH N CH
+bunched B AH N CH T
+bunches B AH N CH AH Z
+bunches(2) B AH N CH IH Z
+bunching B AH N CH IH NG
+bunchy B AH N CH IY
+bund B AH N D
+bunda B AH N D AH
+bunde B AH N D
+bundesbank B UH N D IH S B AE NG K
+bundesbank's B UH N D IH S B AE NG K S
+bundesbank(2) B AA N D IH S B AE NG K
+bundesbank(3) B UH N D IH S B AA NG K
+bundespost B UH N D IH S P OW S T
+bundespost's B UH N D IH S P OW S T S
+bundesrat B UH N D IH S R AE T
+bundestag B AH N D AH S T AE G
+bundeswehr B AH N D AH S W EH R
+bundick B AH N D IH K
+bundle B AH N D AH L
+bundled B AH N D AH L D
+bundles B AH N D AH L Z
+bundling B AH N D AH L IH NG
+bundling(2) B AH N D L IH NG
+bundren B AH N D ER AH N
+bundrick B AH N D R IH K
+bunds B AH N D Z
+bundschuh B AH N D SH UW
+bundy B AH N D IY
+bundy's B AH N D IY Z
+bundys B AH N D IY Z
+bung B AH NG
+bungalow B AH NG G AH L OW
+bungalows B AH NG G AH L OW Z
+bungard B AH NG G ER D
+bunge B AH N JH
+bungee B AH N JH IY
+bunger B AH NG ER
+bungert B AH NG G ER T
+bungey B AH N JH IY
+bungled B AH NG G AH L D
+bungler B AH NG G L ER
+bunglers B AH NG G L ER Z
+bungling B AH NG G AH L IH NG
+bungling(2) B AH NG G L IH NG
+bunk B AH NG K
+bunke B AH NG K
+bunker B AH NG K ER
+bunkers B AH NG K ER Z
+bunkley B AH NG K L IY
+bunks B AH NG K S
+bunn B AH N
+bunnell B AH N AH L
+bunner B AH N ER
+bunney B AH N IY
+bunni B UW N IY
+bunnie B AH N IY
+bunnies B AH N IY Z
+bunning B AH N IH NG
+bunny B AH N IY
+bunol B Y UW N OW L
+bunowski B UW N AW S K IY
+buns B AH N Z
+bunt B AH N T
+bunt's B AH N T S
+buntain B AH N T EY N
+bunte B AH N T
+bunten B AH N T AH N
+buntin B AH N T IH N
+bunting B AH N T IH NG
+bunton B AH N T AH N
+buntrock B AH N T R AA K
+buntstrock B AH N T S T R AA K
+buntyn B AH N T IH N
+buntz B AH N T S
+bunyan B AH N Y AH N
+bunyard B AH N Y AA R D
+bunzl B AH N Z AH L
+buol B OW L
+buonanno B W OW N AA N OW
+buonicontis B W AA N IH K AA N T IY Z
+buono B W OW N OW
+buonocore B W OW N OW K AO R IY
+buonomo B W OW N OW M OW
+buoy B UW IY
+buoyancy B OY AH N S IY
+buoyant B OY AH N T
+buoyed B UW IY D
+buoying B OY IH NG
+buoys B UW IY Z
+bupkus B AH P K AH S
+bupp B AH P
+buprenorphine B Y UW P R AH N ER F IY N
+bur B ER
+burack B Y UW R AH K
+burak B Y UW R AH K
+buran B Y UW R AH N
+burandt B Y UW R AH N T
+buras B Y UW R AH Z
+burba B ER B AH
+burbach B ER B AA K
+burback B ER B AE K
+burbage B ER B IH JH
+burbank B ER B AE NG K
+burbank's B ER B AE NG K S
+burbidge B ER B IH JH
+burble B ER B AH L
+burbled B ER B AH L D
+burbles B ER B AH L Z
+burbling B ER B L IH NG
+burbridge B ER B R IH JH
+burby B ER B IY
+burch B ER CH
+burcham B ER SH AE M
+burchard B ER SH AA R D
+burchell B ER K AH L
+burcher B ER CH ER
+burchett B ER CH IH T
+burchette B ER SH EH T
+burchfield B ER CH F IY L D
+burchill B ER K HH IH L
+burciaga B UH R S IY AA G AH
+burck B ER K
+burckhard B ER K HH ER D
+burckhardt B ER K HH AA R T
+burd B ER D
+burda B UH R D AH
+burdell B ER D EH L
+burden B ER D AH N
+burdened B ER D AH N D
+burdening B ER D AH N IH NG
+burdens B ER D AH N Z
+burdensome B ER D AH N S AH M
+burdett B ER D IH T
+burdette B ER D EH T
+burdge B ER JH
+burdi B UH R D IY
+burdick B ER D IH K
+burdin B ER D IH N
+burdine B ER D IY N
+burdine's B ER D IY N Z
+burdine's(2) B ER D AY N Z
+burdine(2) B ER D AY N
+burdines B ER D IY N Z
+burdines(2) B ER D AY N Z
+burditt B ER D IH T
+burdo B UH R D OW
+burdon B ER D AH N
+burdsall B ER D S AH L
+bureau B Y UH R OW
+bureau's B Y UH R OW Z
+bureaucracies B Y UH R AA K R AH S IY Z
+bureaucracy B Y UH R AA K R AH S IY
+bureaucracy's B Y UH R AA K R AH S IY Z
+bureaucrat B Y UH R AH K R AE T
+bureaucrat(2) B Y UH R OW K R AE T
+bureaucratese B Y UH R AH K R AE T IY Z
+bureaucratic B Y UH R AH K R AE T IH K
+bureaucrats B Y UH R AH K R AE T S
+bureaucrats(2) B Y UH R OW K R AE T S
+bureaus B Y UH R OW Z
+burek B EH R IH K
+burel B EH R AH L
+burell B EH R AH L
+buren B Y UH R AH N
+bures B EH R Z
+bures(2) B EH R IH Z
+buresh B EH R IH SH
+burfeind B ER F AY N D
+burfield B ER F IY L D
+burford B ER F ER D
+burg B ER G
+burgamy B ER G AH M IY
+burgan B ER G AE N
+burgard B ER G ER D
+burgdorf B ER G D AO R F
+burge B ER G
+burgee B ER G IY
+burgener B ER G IY N ER
+burgeon B ER JH AH N
+burgeoned B ER JH AH N D
+burgeoning B ER JH AH N IH NG
+burger B ER G ER
+burger's B ER G ER Z
+burgers B ER G ER Z
+burgert B ER G ER T
+burges B ER G Z
+burgeson B ER G IH S AH N
+burgess B ER JH AH S
+burget B ER G EH T
+burgett B ER JH IH T
+burggraf B ER G R AH F
+burghardt B ER G AA R T
+burghart B ER G HH AA R T
+burgher B ER G ER
+burghley B ER G L IY
+burgin B ER G IH N
+burgio B ER G IY OW
+burglar B ER G L ER
+burglaries B ER G L ER IY Z
+burglarize B ER G L ER AY Z
+burglarized B ER G L ER AY Z D
+burglars B ER G L ER Z
+burglary B ER G L ER IY
+burgling B ER G L IH NG
+burgman B ER G M AH N
+burgmaster B ER G M AE S T ER
+burgner B ER G N ER
+burgo B ER G OW
+burgomaster B ER G AH M AE S T ER
+burgomaster's B ER G AH M AE S T ER Z
+burgomasters B ER G AH M AE S T ER Z
+burgoon B ER G UW N
+burgos B ER G OW Z
+burgoyne B ER G OY N
+burgoyne's B ER G OY N Z
+burgundian B ER G AH N D IY AH N
+burgundians B ER G AH N D IY AH N Z
+burgundies B ER G AH N D IY Z
+burgundy B ER G AH N D IY
+burgundy's B ER G AH N D IY Z
+burgy B ER JH IY
+burham B ER HH AH M
+burhans B ER HH AH N Z
+buri B UH R IY
+burial B EH R IY AH L
+burials B EH R IY AH L Z
+burian B Y UH R IY AH N
+burich B EH R IH K
+buried B EH R IY D
+buries B EH R IY Z
+burk B ER K
+burkard B ER K ER D
+burkart B ER K AA R T
+burke B ER K
+burke's B ER K S
+burkeen B ER K IY N
+burkel B ER K AH L
+burkemper B ER K IH M P ER
+burkert B ER K ER T
+burkes B ER K S
+burket B ER K IH T
+burkett B ER K IH T
+burkey B ER K IY
+burkhalter B ER K HH AH L T ER
+burkhammer B ER K HH AH M ER
+burkhard B ER K HH ER D
+burkhardt B ER K HH AA R T
+burkhart B ER K HH AA R T
+burkhead B ER K HH EH D
+burkholder B ER K HH OW L D ER
+burkina B ER K IY N AH
+burkina's B ER K IY N AH Z
+burkina-faso B ER K IY N AH F AA S OW
+burkina-faso's B ER K IY N AH F AA S OW Z
+burkins B ER K IH N Z
+burkitt B ER K IH T
+burkland B ER K L AH N D
+burkle B ER K AH L
+burkley B ER K L IY
+burklow B ER K L AW
+burklund B ER K L AH N D
+burkman B ER K M AH N
+burks B ER K S
+burkus B ER K AH S
+burl B ER L
+burland B ER L AH N D
+burlap B ER L AE P
+burlapped B ER L AE P T
+burlatsky B ER L AE T S K IY
+burleigh B ER L AH
+burleson B ER L IH S AH N
+burleson(2) B ER L S AH N
+burlesque B ER L EH S K
+burlew B ER L UW
+burley B ER L IY
+burling B ER L IH NG
+burlingame B ER L IH NG G EY M
+burlingham B ER L IH NG HH AE M
+burlington B ER L IH NG T AH N
+burlington's B ER L IH NG T AH N Z
+burlison B ER L IH S AH N
+burly B ER L IY
+burma B ER M AH
+burma's B ER M AH Z
+burmah B ER M AH
+burman B ER M AH N
+burmans B ER M AH N Z
+burmaster B ER M AE S T ER
+burmeister B ER M AY S T ER
+burmese B ER M IY Z
+burmester B ER M IH S T ER
+burn B ER N
+burnable B ER N AH B AH L
+burnaby B ER N AH B IY
+burnam B ER N AH M
+burnap B ER N AH P
+burnard B ER N AA R D
+burndy B ER N D IY
+burne B ER N
+burned B ER N D
+burnell B ER N AH L
+burner B ER N ER
+burners B ER N ER Z
+burnes B ER N Z
+burness B ER N AH S
+burnet B ER N IH T
+burnett B ER N EH T
+burnett's B ER N EH T S
+burnette B ER N EH T
+burney B ER N IY
+burnham B ER N AH M
+burnham's B ER N AH M Z
+burnham's(2) B ER N HH AE M Z
+burnham(2) B ER N HH AE M
+burning B ER N IH NG
+burningham B ER N IH NG HH AE M
+burnings B ER N IH NG Z
+burnish B ER N IH SH
+burnished B ER N IH SH T
+burnley B ER N L IY
+burnley's B ER N L IY Z
+burnout B ER N AW T
+burns B ER N Z
+burns' B ER N Z
+burns's B ER N Z IH Z
+burnsed B ER N Z D
+burnside B ER N S AY D
+burnside's B ER N S AY D Z
+burnstein B ER N S T AY N
+burnstein(2) B ER N S T IY N
+burnsworth B ER N Z W ER TH
+burnt B ER N T
+burnup B ER N AH P
+burnworth B ER N W ER TH
+buroker B Y UW R AH K ER
+burow B Y UH R OW
+burp B ER P
+burpee B ER P IY
+burpees B ER P IY Z
+burping B ER P IH NG
+burpo B UH R P OW
+burr B ER
+burrage B ER IH JH
+burrell B ER EH L
+burrell's B ER EH L Z
+burrer B ER ER
+burres B ER Z
+burress B ER AH S
+burri B UH R IY
+burridge B AO R IH JH
+burrier B ER IY ER
+burright B AO R AY T
+burrill B AO R AH L
+burrington B ER IH NG T AH N
+burris B ER IH S
+burriss B ER IH S IH Z
+burrito B ER IY T OW
+burritos B ER IY T OW S
+burritt B ER IH T
+burro B ER OW
+burrola B UH R OW L AH
+burros B ER OW Z
+burrough B ER OW
+burroughs B AH R OW Z
+burroughs(2) B ER OW Z
+burrous B ER AH S
+burrow B ER OW
+burrower B ER OW ER
+burrowers B ER OW ER Z
+burrowes B ER OW Z
+burrowing B ER OW IH NG
+burrows B ER OW Z
+burrus B UH R AH S
+burruss B UH R AH S
+burry B ER IY
+bursch B ER SH
+burse B ER S
+bursey B ER S IY
+bursley B ER S L IY
+burson B ER S AH N
+burst B ER S T
+burstein B ER S T AY N
+burstein(2) B ER S T IY N
+bursting B ER S T IH NG
+burston B ER S T AH N
+bursts B ER S T S
+burt B ER T
+burtch B ER CH
+burtis B ER T IH S
+burtner B ER T N ER
+burtness B ER T N IH S
+burtnett B ER T N IH T
+burton B ER T AH N
+burton's B ER T AH N Z
+burts B ER T S
+burtt B ER T
+burundi B ER AH N D IY
+burundi's B ER AH N D IY Z
+burwell B ER W EH L
+burwick B ER W IH K
+bury B EH R IY
+bury's B EH R IY Z
+burying B EH R IY IH NG
+burzynski B ER Z IH N S K IY
+bus B AH S
+busa B Y UW S AH
+busalacchi B UW S AA L AA K IY
+busam B IH S AH M
+busbee B AH S B IY
+busbey B AH S B IY
+busbin B AH S B IH N
+busboom B AH S B UW M
+busboy B AH S B OY
+busboys B AH S B OY Z
+busby B AH Z B IY
+buscaglia B UW S K AA G L IY AH
+buscemi B UW S CH EH M IY
+busch B UH SH
+busch's B UH SH IH Z
+buschbaum B UH SH B AW M
+busche B AH SH
+buscher B UW SH ER
+buschman B AH SH M AH N
+buschmann B AH SH M AH N
+buse B Y UW Z
+bused B AH S T
+buseman B IH S M AH N
+busenbark B IH S IH N B AA R K
+buser B IH S ER
+buses B AH S IH Z
+busey B Y UW Z IY
+busey(2) B AH S IY
+bush B UH SH
+bush's B UH SH IH Z
+busha B AH SH AH
+bushard B UH SH ER D
+bushart B UH SH AA R T
+bushaw B UH SH AO
+bushby B UH SH B IY
+bushee B UH SH IY
+bushel B UH SH AH L
+bushell B UH SH AH L
+bushels B UH SH AH L Z
+busher B UH SH ER
+bushes B UH SH AH Z
+bushey B UH SH IY
+bushings B UH SH IH NG Z
+bushkin B UH SH K IH N
+bushman B UH SH M AH N
+bushmen B UH SH M EH N
+bushnell B UH SH N AH L
+bushong B UH SH AO NG
+bushway B UH SH W EY
+bushwhack B UH SH W AE K
+bushwhacked B UH SH W AE K T
+bushwhacking B UH SH W AE K IH NG
+bushwhacks B UH SH W AE K S
+bushy B UH SH IY
+busic B AH S IH K
+busick B IH S IH K
+busied B IH Z IY D
+busier B IH Z IY ER
+busiest B IH Z IY AH S T
+busily B IH Z AH L IY
+business B IH Z N AH S
+business' B IH Z N IH S
+business'(2) B IH Z N AH S
+business's B IH Z N IH S IH Z
+business(2) B IH Z N IH S
+businesses B IH Z N AH S AH Z
+businesses' B IH Z N EH S IH Z
+businesses(2) B IH Z N IH S IH Z
+businessland B IH Z N IH S L AE N D
+businesslike B IH Z N IH S L AY K
+businessman B IH Z N AH S M AE N
+businessman's B IH Z N IH S M AE N Z
+businessman(2) B IH Z N IH S M AE N
+businessmen B IH Z N IH S M EH N
+businesspeople B IH Z N AH S P IY P AH L
+businessperson B IH Z N AH S P ER S AH N
+businessphone B IH Z N AH S F OW N
+businessphones B IH Z N AH S F OW N Z
+businesswoman B IH Z N IH S W UH M AH N
+businesswomen B IH Z N AH S W OW M AH N
+busing B AH S IH NG
+busk B AH S K
+buske B AH S K
+busker B AH S K ER
+busker's B AH S K ER Z
+buskey B AH S K IY
+buskirk B AH S K ER K
+buslease B AH S L IY S
+busler B AH S AH L ER
+busler(2) B AH S L ER
+busload B AH S L OW D
+busloads B AH S L OW D Z
+buspar B AH S P ER
+buss B AH S
+bussa B UW S AH
+bussard B AH S ER D
+busse B AH S
+bussed B AH S T
+bussell B AH S AH L
+bussen B AH S AH N
+busser B AH S ER
+bussert B AH S ER T
+busses B AH S AH Z
+bussey B AH S IY
+bussi B AH S IY
+bussi(2) B Y UW S IY
+bussie B AH S IY
+bussie(2) B Y UW S IY
+bussiere B AH S IY EH R
+bussing B AH S IH NG
+bussinger B AH S IH N JH ER
+bussman B AH S M AH N
+bust B AH S T
+busta B AH S T AH
+bustamante B UW S T AH M AA N T IY
+bustard B AH S T ER D
+busted B AH S T IH D
+buster B AH S T ER
+busters B AH S T ER Z
+busti B AH S T IY
+bustier B AH S T Y ER
+bustillo B UW S T IH L OW
+bustillos B AH S T AY L OW Z
+bustin B AH S T IH N
+busting B AH S T IH NG
+bustle B AH S AH L
+bustling B AH S AH L IH NG
+bustling(2) B AH S L IH NG
+busto B AH S T OW
+bustos B AH S T OW Z
+busts B AH S T S
+busty B AH S T IY
+busulaki B Y UW S AH L AE K IY
+buswell B AH S W EH L
+busy B IH Z IY
+but B AH T
+but's B AH T S
+butala B UW T AA L AH
+butane B Y UW T EY N
+butare B UW T AA R IY
+butare's B UW T AA R IY Z
+butare's(2) B Y UW T AA R IY Z
+butare(2) B Y UW T AA R IY
+butch B UH CH
+butchart B UH CH ER T
+butcher B UH CH ER
+butcher's B UH CH ER Z
+butchered B UH CH ER D
+butchering B UH CH ER IH NG
+butchers B UH CH ER Z
+butchery B UH CH ER IY
+butchko B AH CH K OW
+butchko(2) B UH CH K OW
+bute B Y UW T
+buteau B Y UW T OW
+buteco B UW T EH K OW
+butenhoff B Y UW T IH N HH AO F
+butera B UW T EH R AH
+buterbaugh B Y UW T ER B AW
+buth B UW TH
+buthelezi B UW T AH L EY Z IY
+buthelezi's B UW T AH L EY Z IY Z
+butka B AH T K AH
+butkiewicz B AH T K AH V IH CH
+butkovich B AH T K AH V IH CH
+butkus B AH T K IH S
+butler B AH T L ER
+butler's B AH T L ER Z
+butlers B AH T L ER Z
+butman B AH T M AH N
+butner B AH T N ER
+butorac B Y UW T AO R AH K
+butrick B AH T R IH K
+butros B UW T R OW S
+butros(2) B UW T R AH S
+buts B AH T S
+butsch B AH CH
+butson B AH T S AH N
+butt B AH T
+buttacavoli B UW T AA K AA V OW L IY
+buttafuoco B UW T AH F W OW K OW
+buttafuoco's B UW T AH F W OW K OW Z
+buttars B AH T ER Z
+butte B Y UW T
+butter B AH T ER
+butterball B AH T ER B AO L
+butterballs B AH T ER B AO L Z
+butterbaugh B AH T ER B AW
+buttercup B AH T ER K AH P
+buttercups B AH T ER K AH P S
+buttered B AH T ER D
+butterfat B AH T ER F AE T
+butterfield B AH T ER F IY L D
+butterfields B AH T ER F IY L D Z
+butterflies B AH T ER F L AY Z
+butterfly B AH T ER F L AY
+butterfly's B AH T ER F L AY Z
+butterick B AH T ER IH K
+butterick's B AH T ER IH K S
+buttering B AH T ER IH NG
+buttermilk B AH T ER M IH L K
+buttermore B AH T ER M AO R
+butters B AH T ER Z
+butterscotch B AH T ER S K AA CH
+butterworth B AH T ER W ER TH
+buttery B AH T ER IY
+butthead B AH T HH EH D
+butting B AH T IH NG
+buttitta B UW T IY T AH
+buttke B AH T K IY
+buttler B AH T L ER
+buttner B AH T N ER
+buttock B AH T AH K
+buttocks B AH T AH K S
+button B AH T AH N
+buttoned B AH T AH N D
+buttonhole B AH T AH N HH OW L
+buttonholed B AH T AH N HH OW L D
+buttonholes B AH T AH N HH OW L Z
+buttons B AH T AH N Z
+buttonville B AH T AH N V IH L
+buttram B AH T R AE M
+buttress B AH T R AH S
+buttressed B AH T R AH S T
+buttresses B AH T R AH S AH Z
+buttresses(2) B AH T R AH S IH Z
+buttressing B AH T R AH S IH NG
+buttrey B AH T R IY
+buttrick B AH T R IH K
+buttrum B AH T R AH M
+buttry B AH T R IY
+butts B AH T S
+butulesi B UW T AH L EY Z IY
+butulesi's B UW T AH L EY Z IY Z
+butyl B Y UW T AH L
+butz B AH T S
+butzberger B AH T S B ER G ER
+butzen B AH T S AH N
+butzer B AH T S ER
+butzin B AH T S AH N
+buus B UW Z
+buxbaum B AH K S B AW M
+buxom B AH K S AH M
+buxton B AH K S T AH N
+buy B AY
+buy's B AY Z
+buyback B AY B AE K
+buybacks B AY B AE K S
+buyer B AY ER
+buyer's B AY ER Z
+buyers B AY ER Z
+buyers' B AY ER Z
+buying B AY IH NG
+buyout B AY AW T
+buyouts B AY AW T S
+buys B AY Z
+buysse B AY S
+buza B Y UW Z AH
+buzan B Y UW Z AH N
+buzard B Y UW Z AA R D
+buzbee B AH Z B IY
+buzby B AH Z B IY
+buzek B UW Z EH K
+buzz B AH Z
+buzzard B AH Z ER D
+buzzard's B AH Z ER D Z
+buzzards B AH Z ER D Z
+buzze B AH Z
+buzze(2) B Y UW Z IY
+buzzed B AH Z D
+buzzell B AH Z EH L
+buzzelli B UW T S EH L IY
+buzzer B AH Z ER
+buzzes B AH Z IH Z
+buzzetta B Y UW Z EH T AH
+buzzing B AH Z IH NG
+buzzword B AH Z W ER D
+buzzwords B AH Z W ER D Z
+buzzy B AH Z IY
+buzzy's B AH Z IY Z
+by B AY
+byam B AY AH M
+byard B Y AA R D
+byard(2) B AY ER D
+byars B AY ER Z
+byas B AY AH S
+byassee B IY AA S IY
+bybee B AY B IY
+bye B AY
+bye-bye B AY B AY
+byelorussia B AY AH L OW R AH SH AH
+byelorussia(2) B EH L OW R AH SH AH
+byelorussia(3) B AY EH L OW R AH SH AH
+byer B AY ER
+byerlein B AY R L AY N
+byerley B AY ER L IY
+byerly B AY ER L IY
+byers B AY ER Z
+byers' B AY ER Z
+byfield B AY F IY L D
+byford B IH F ER D
+bygone B AY G AO N
+bygones B AY G AO N Z
+byham B AY AH M
+byington B AY IH NG T AH N
+byker B AY K ER
+bykowski B IH K AO F S K IY
+byland B AY L AH N D
+bylaw B AY L AO
+bylaws B AY L AO Z
+byler B AY L ER
+byles B AY L Z
+byline B AY L AY N
+bylines B AY L IY N Z
+bylsma B IH L S M AH
+bylund B IH L AH N D
+byner B AY N ER
+bynes B AY N Z
+bynoe B IH N OW
+bynum B IH N AH M
+bypass B AY P AE S
+bypassed B AY P AE S T
+bypasses B AY P AE S IH Z
+bypassing B AY P AE S IH NG
+byproduct B AY P R AA D AH K T
+byproducts B AY P R AO D AH K T S
+byram B IH R AH M
+byrd B ER D
+byrd's B ER D Z
+byrer B AY R ER
+byrge B AY R JH
+byrle B AY R AH L
+byrn B IH R N
+byrne B ER N
+byrne's B ER N Z
+byrnes B ER N Z
+byrns B IH R N Z
+byrom B AY R AH M
+byron B AY R AH N
+byron's B AY R AH N Z
+byrum B IH R AH M
+bystander B AY S T AE N D ER
+bystanders B AY S T AE N D ER Z
+bystrom B IH S T R AH M
+byte B AY T
+bytes B AY T S
+byu B IY W AY Y UW
+byun B Y AH N
+byus B AY AH S
+bywater B AY W AO T ER
+byway B AY W EY
+byways B AY W EY Z
+byword B AY W ER D
+byzantine B IH Z AH N T AY N
+byzantine(2) B IH Z AH N T IY N
+byzantium B AH Z AE N T IY AH M
+c S IY
+c'est S EH S T
+c'est(2) S EY
+c'mon K AH M AA N
+c's S IY Z
+c-code S IY K OW D
+c-codes S IY K OW D Z
+c-span S IY S P AE N
+c-span's S IY S P AE N Z
+c. S IY
+c.'s S IY Z
+c.d.s S IY D IY Z
+c.o.d. S IY OW D IY
+c.s S IY Z
+c1 S IY W AH N
+c2 S IY T UW
+c3 S IY TH R IY
+c4 S IY F AO R
+c5 S IY F AY V
+ca K AH
+ca(2) S IY EY
+ca(3) K AA
+caan K AA N
+cab K AE B
+cab's K AE B Z
+caba K AA B AH
+cabal K AH B AA L
+caballero K AE B AH Y EH R OW
+caban K EY B AH N
+cabana K AH B AE N AH
+cabanas K AH B AE N AH Z
+cabaniss K AE B AH N IH S
+cabaret K AE B ER EY
+cabarets K AE B ER EY Z
+cabbage K AE B AH JH
+cabbage(2) K AE B IH JH
+cabbages K AE B IH JH IH Z
+cabbie K AE B IY
+cabbies K AE B IY Z
+cabby K AE B IY
+cabdriver K AE B D R AY V ER
+cabdrivers K AE B D R AY V ER Z
+cabe K EY B
+cabell K AA B EH L
+cabello K AH B EH L OW
+cabernet K AE B ER N EY
+cabernets K AE B ER N EH T S
+cabernets(2) K AE B ER N EY Z
+cabey K EY B IY
+cabezas K AH B EY Z AH Z
+cabin K AE B AH N
+cabinda K AH B IH N D AH
+cabiness K EY B IY N IH S
+cabinet K AE B AH N AH T
+cabinet's K AE B N AH T S
+cabinet(2) K AE B N AH T
+cabinetry K AE B N AH T R IY
+cabinets K AE B AH N AH T S
+cabinets(2) K AE B N AH T S
+cabins K AE B AH N Z
+cable K EY B AH L
+cable's K EY B AH L Z
+cablec K AE B L AH K
+cablec(2) K EY B AH L S IY
+cablec(3) K EY B L EH K
+cablecomm K EY B AH L K AA M
+cablecomms K EY B AH L K AA M Z
+cabled K EY B AH L D
+cablegram K EY B AH L G R AE M
+cableone K EY B AH L W AH N
+cabler K EY B AH L ER
+cabler(2) K EY B L ER
+cables K EY B AH L Z
+cablesystem K EY B AH L S IH S T AH M
+cablesystems K EY B AH L S IH S T AH M Z
+cabletron K EY B AH L T R AO N
+cabletron's K EY B AH L T R AO N Z
+cablevision K EY B AH L V IH ZH AH N
+cablevision's K EY B AH L V IH ZH AH N Z
+cabo K AE B OW
+cabo(2) S IY EY B IY OW
+cabok AE B OW
+caboodle K AH B UW D AH L
+caboose K AH B UW S
+cabooses K AH B UW S IH Z
+cabot K AE B AH T
+cabot's K AE B AH T S
+cabotage K AE B AH T IH JH
+cabral K AE B R AH L
+cabrales K AA B R AA L EH S
+cabrall K AH B R AA L
+cabrall's K AH B R AA L Z
+cabranes K AH B R EY N Z
+cabrera K AA B R EH R AH
+cabrini K AH B R IY N IY
+cabrini's K AH B R IY N IY Z
+cabriolet K AE B R IY OW L EY
+cabriolet(2) K AE B R IY OW L EH T
+cabs K AE B Z
+cac K AE K
+cac's K AE K S
+cac(2) S IY EY S IY
+cacace K AE K AH S
+cacaci K AH K AA S IY
+cacao K AH K EY OW
+caccamise K AA K AA M IH S
+caccamo K AA K AA M OW
+caccavale K AA K AH V AA L IY
+caccia K AA CH AH
+cacciatore K AA CH AH T AO R IY
+cacciola K AA K CH OW L AH
+caceres K AA S EH R EH S
+cache K AE SH
+cache(2) K AE SH EY
+cached K AE SH T
+caches K AE SH IH Z
+caches(2) K AE SH EY Z
+cachet K AE SH EY
+caching K AE SH IH NG
+cacho K AE CH OW
+cacioppo K AA CH OW P OW
+cacique K AH S IY K
+cackle K AE K AH L
+cackling K AE K AH L IH NG
+cackling(2) K AE K L IH NG
+cacld K AE K AH L D
+cacld(2) S IY EY S IY EH L D IY
+cacophony K AE K AA F AH N IY
+cacti K AE K T AY
+cacti(2) K AE K T IY
+cactus K AE K T AH S
+cad K AE D
+cada K AA D AH
+cadam K AE D AH M
+cadaver K AH D AE V ER
+cadavers K AH D AE V ER Z
+cadbury K AE D B EH R IY
+cadbury's K AE D B EH R IY Z
+cadby K AE D B IY
+caddell K AE D AH L
+cadden K AE D AH N
+caddick K AE D IH K
+caddies K AE D IY Z
+caddock K AE D AH K
+caddy K AE D IY
+caddyshack K AE D IY SH AE K
+cade K EY D
+cadell K AA D EY L
+cadena K AH D IY N AH
+cadence K EY D AH N S
+cadences K EY D AH N S IH Z
+cadenhead K EY D AH N HH EH D
+cadet K AH D EH T
+cadets K AH D EH T S
+cadiddlehopper K AH D IH D AH L HH AO P ER
+cadieux K AE D IY OW
+cadillac K AE D AH L AE K
+cadillac's K AE D AH L AE K S
+cadillacs K AE D AH L AE K S
+cadiz K AH D IY Z
+cadle K EY D AH L
+cadman K AE D M AH N
+cadmium K AE D M IY AH M
+cadmus K AE D M AH S
+cadnetix K AE D N EH T IH K S
+cadogan K AA D OW G AA N
+cadorette K AE D ER EH T
+cadotte K AH D AO T
+cadre K AE D R IY
+cadres K AE D R IY Z
+cadrone K AH D R OW N
+cadrone(2) K AH D R OW N IY
+cads K AE D S
+cadwalader K AE D W AO L AH D ER
+cadwalader's K AE D W AO L AH D ER Z
+cadwallader K AE D W AO L AH D ER
+cadwell K AE D W EH L
+cady K EY D IY
+caen K AE N
+caen's K AE N Z
+caen's(2) K AA N Z
+caen(2) K AA N
+caesar S IY Z ER
+caesar's S IY Z ER Z
+caesarea K EY S ER IY AH
+caesarean K EY S ER IY N
+caesareans K EY S ER IY N Z
+caesars S IY Z ER Z
+caesars' S IY Z ER Z
+caetano K AH T AA N OW
+cafarella K AA F AA R EH L AH
+cafarelli K AA F AA R EH L IY
+cafaro K AA F AA R OW
+cafe K AH F EY
+cafe(2) K AE F EY
+cafes K AE F EY Z
+cafeteria K AE F AH T IH R IY AH
+cafeterias K AE F AH T IH R IY AH Z
+cafetizer K AE F IH T AY Z ER
+caffee K AE F IY
+caffeinate K AE F IH N EY T
+caffeinated K AE F IH N EY T AH D
+caffeine K AE F IY N
+cafferty K AE F ER T IY
+caffery K AE F ER IY
+caffey K AE F IY
+caffrey K AE F R IY
+cafiero K AE F IY EH R OW
+caftan K AE F T AE N
+caftans K AE F T AE N Z
+cagan K EY G AH N
+cage K EY JH
+cage's K EY JH IH Z
+caged K EY JH D
+cages K EY JH IH Z
+cagey K EY JH IY
+caggiano K AA JH IY AA N OW
+cagle K EY G AH L
+cagley K AE G L IY
+cagliari K AE G L IY AA R IY
+cagney K AE G N IY
+caguas K AA G W AA S
+cahalan K AE HH AH L AH N
+cahall K AE HH AH L
+cahan K AE HH AH N
+cahasa K AH HH AA S AH
+cahill K EY HH IH L
+cahn K AE N
+cahners K AA N ER Z
+cahoon K AH HH UW N
+cahoot K AH HH UW T
+cahoots K AH HH UW T S
+cahora K AH HH AO R AH
+cahouet K AH HH UW T
+cai K AY
+caiazzo K AA Y AA Z OW
+caicedo K AH CH EY D OW
+cail K EY L
+caillebotte K AY B AO T
+caillier K EY L IY ER
+caillouet K EY L UW T
+cain K EY N
+cain's K EY N Z
+caine K EY N
+caines K EY N Z
+caiola K AY OW L AH
+caire K EH R
+cairn K EH R N
+cairnes K EH R N Z
+cairns K EH R N Z
+cairo K AY R OW
+cairo's K AY R OW Z
+caison K EY Z AH N
+caisse K EY S
+caissie K EY S IY
+caisson K EY S AH N
+caisson(2) K EH S AH N
+caissons K EY S AH N Z
+caissons(2) K EH S AH N Z
+caitlin K EY T L IH N
+caito K EY T OW
+cajole K AH JH OW L
+cajoled K AH JH OW L D
+cajoling K AH JH OW L IH NG
+cajun K EY JH AH N
+cajuns K EY JH AH N Z
+cake K EY K
+cake's K EY K S
+caked K EY K T
+cakes K EY K S
+cal K AE L
+cala K AA L AH
+calabasas K AE L AH B AA S AH S
+calabrese K AA L AA B R EY Z IY
+calabria K AH L AE B R IY AH
+calabro K AH L AE B R OW
+caladiums K AH L EY D IY AH M Z
+calaf K AE L AH F
+calahan K AE L AH HH AE N
+calais K AH L EY
+calamander K AE L AH M AE N D ER
+calamari K AA L AA M AA R IY
+calame K AA L AA M IY
+calamia K AH L EY M IY AH
+calamine K AE L AH M AY N
+calamine's K AE L AH M AY N Z
+calamities K AH L AE M AH T IY Z
+calamitous K AH L AE M AH T AH S
+calamity K AH L AE M AH T IY
+calamity(2) K AH L AE M IH T IY
+calan K EY L AH N
+calandra K AH L AE N D R AH
+calandro K AH L AE N D R OW
+calantha K AH L AE N TH AH
+calarco K AH L AA R K OW
+calaveras K AE L AH V EH R AH Z
+calaway K AA L AH W EY
+calbert K AE L B ER T
+calbos K AA L B OW S
+calcagni K AA L K AA G N IY
+calcagno K AA L K AA G N OW
+calcaterra K AE L K AH T EH R AH
+calcified K AE L S AH F AY D
+calcify K AE L S AH F AY
+calcite K AE L S AY T
+calcium K AE L S IY AH M
+calcomp K AO L K AA M P
+calcote K AA L K OW T IY
+calculate K AE L K Y AH L EY T
+calculated K AE L K Y AH L EY T AH D
+calculated(2) K AE L K Y AH L EY T IH D
+calculates K AE L K Y AH L EY T S
+calculating K AE L K Y AH L EY T IH NG
+calculation K AE L K Y AH L EY SH AH N
+calculations K AE L K Y AH L EY SH AH N Z
+calculator K AE L K Y AH L EY T ER
+calculators K AE L K Y AH L EY T ER Z
+calculus K AE L K Y AH L AH S
+calcutt K AE L K AH T
+calcutta K AE L K AH T AH
+caldeira K AA L D EH R AH
+calder K AO L D ER
+caldera K AE L D EH R AH
+caldera(2) K AO L D EH R AH
+calderaro K AA L D ER AA R OW
+calderon K AO L D ER AA N
+calderon(2) K AE L D ER OW N
+calderone K AA L D ER OW N IY
+calderwood K AO L D ER W UH D
+caldor K AE L D AO R
+caldrello K AA L D R EH L OW
+caldwell K AO L D W EH L
+caldwell's K AO L D W EH L Z
+cale K EY L
+caleb K EY L AH B
+calebs K EY L AH B Z
+caleca K AA L EH K AH
+caledonia K AE L AH D OW N IY AH
+caledonian K AE L IH D OW N IY AH N
+caledonian's K AE L IH D OW N IY AH N Z
+calef K AE L IH F
+calemburg K AE L AH M B ER G
+calendar K AE L AH N D ER
+calendars K AE L AH N D ER Z
+calendula K AH L EH JH AH L AH
+caler K EY L ER
+calero K AH L EH R OW
+cales K EY L Z
+caley K EY L IY
+calf K AE F
+calf's K AE F S
+calfed K AE F T
+calfed's K AE L F EH D Z
+calfed(2) K AE L F EH D
+calfee K AE L F IY
+calgary K AE L G ER IY
+calgene K AE L JH IY N
+calgene's K AE L JH IY N Z
+calgon K AE L G AO N
+calgroup K AE L G R UW P
+calhoon K AE L HH UW N
+calhoun K AE L HH UW N
+cali K AA L IY
+cali(2) K AE L IY
+calia K AA L IY AH
+caliber K AE L AH B ER
+calibrate K AE L AH B R EY T
+calibrated K AE L AH B R EY T AH D
+calibration K AE L AH B R EY SH AH N
+calico K AE L AH K OW
+calida K AA L IY D AH
+caliendo K AA L IY EH N D OW
+calif K AE L AH F AO R N Y AH
+calif(2) K AE L IH F
+calif. K AE L IH F AO R N Y AH
+califano K AA L IY F AA N OW
+califf K AE L IH F
+california K AE L AH F AO R N Y AH
+california's K AE L IH F AO R N Y AH Z
+californian K AE L IH F AO R N Y AH N
+californian's K AE L IH F AO R N Y AH N Z
+californians K AE L IH F AO R N Y AH N Z
+caligiuri K AE L AH JH IH R IY
+calill K AH L IH L
+calills K AH L IH L Z
+caliper K AE L AH P ER
+calipers K AE L AH P ER Z
+caliph K AE L AH F
+caliri K AA L IH R IY
+calise K AA L AY Z
+calista K AH L IH S T AH
+calisthenic K AE L AH S TH EH N IH K
+calisthenics K AE L AH S TH EH N IH K S
+calite K AE L AY T
+calite(2) K EY L AY T
+calix K AE L IH K S
+calix(2) K EY L AH K S
+calk K AO K
+calkin K AE L K IH N
+calkins K AE L K IH N Z
+call K AO L
+call's K AO L Z
+call's(2) K AA L Z
+calla K AE L AH
+callable K AO L AH B AH L
+callace K AE L AH S
+callaghan K AE L AH HH AE N
+callaham K AE L AH HH AE M
+callahan K AE L AH HH AE N
+callahan's K AE L AH HH AE N Z
+callais K AH L EY
+callan K AE L AH N
+callanan K AE L AH N AH N
+calland K AE L AH N D
+callander K AE L AH N D ER
+callari K AA L AA R IY
+callas K AE L AH Z
+callaway K AE L AH W EY
+callaway's K AO L AH W EY Z
+calle K EY L
+callebs K EY L EH B Z
+called K AO L D
+callegari K AA L EH G AA R IY
+calleja K AA L EY Y AH
+callejas K AA L EY Y AA Z
+callen K AE L AH N
+callender K AH L EH N D ER
+callens K AO L AH N Z
+caller K AO L ER
+caller's K AO L ER Z
+callers K AO L ER Z
+callery K AE L ER IY
+calles K EY L Z
+calley K AE L IY
+callicoat K AE L IH K OW T
+callicott K AE L IH K AA T
+callicutt K AE L IH K AH T
+callie K AO L IY
+callier K AE L IY ER
+callies K AE L IY Z
+calligan K AE L IH G AH N
+calligrapher K AH L IH G R AH F ER
+calligraphic K AE L AH G R AE F IH K
+calligraphy K AH L IH G R AH F IY
+callihan K AE L IH HH AE N
+callinan K AE L IH N AH N
+calling K AO L IH NG
+calliope K AH L AY AH P IY
+calliopes K AH L AY AH P IY Z
+callis K AE L IH S
+callison K AE L IH S AH N
+callister K AO L IH S T ER
+callous K AE L AH S
+calloused K AE L AH S T
+callously K AE L AH S L IY
+callousness K AE L AH S N AH S
+callow K AE L OW
+calloway K AE L OW W EY
+calls K AO L Z
+callula K AE L UW L AH
+callum K AE L AH M
+callus K AE L AH S
+cally K AE L IY
+calm K AA M
+calm(2) K AA L M
+calma K AA L M AH
+calmaquip K AE L M AH K W IH P
+calmar K AE L M AA R
+calmark K AA L M AA R K
+calmart K AA L M AA R T
+calmart's K AA L M AA R T S
+calmart's(2) K AE L M AA R T S
+calmart(2) K AE L M AA R T
+calmat K AE L M AE T
+calmat's K AE L M AE T S
+calmed K AA M D
+calmed(2) K AA L M D
+calmer K AA M ER
+calmer(2) K AA L M ER
+calmes K AA L M EH S
+calmest K AA M AH S T
+calmest(2) K AA L M AH S T
+calming K AA M IH NG
+calming(2) K AA L M IH NG
+calmly K AA M L IY
+calmly(2) K AA L M L IY
+calmness K AA M N AH S
+calmness(2) K AA L M N AH S
+calms K AA M Z
+calms(2) K AA L M Z
+calnan K AE L N AH N
+calny K AE L N IY
+calo K AA L OW
+calogero K AA L OW JH EH R OW
+calor K AE L ER
+caloric K AH L AO R IH K
+calorie K AE L ER IY
+calories K AE L ER IY Z
+caloway K AE L OW W EY
+calpers K AE L P ER Z
+calpers's K AE L P ER Z IH Z
+calpis K AE L P IH S
+caltabiano K AA L T AA B IY AA N OW
+caltagirone K AA L T AA JH IH R OW N IY
+caltex K AH L T EH K S
+caltha K AE L DH AH
+calton K AE L T AH N
+caltrans K AE L T R AE N Z
+calumet K AE L Y AH M EH T
+calumny K AE L AH M N IY
+calutzi K AH L UW T Z IY
+caluzu K AH L UW Z UW
+caluzzi K AH L UW Z IY
+calvani K AO L V AA N IY
+calvano K AA L V AA N OW
+calvaries K AE L V ER IY Z
+calvary K AE L V ER IY
+calveras K AE L V EH R AH S
+calverley K AE L V ER L IY
+calvert K AE L V ER T
+calvery K AE L V ER IY
+calves K AE V Z
+calvet K AE L V AH T
+calvey K AE L V EY
+calvi K AA L V IY
+calvillo K AA L V IH L OW
+calvin K AE L V AH N
+calvin's K AE L V AH N Z
+calvin's(2) K AE L V IH N Z
+calvin(2) K AE L V IH N
+calvina K AA L V IY N AH
+calving K AE V IH NG
+calvinist K AE L V AH N AH S T
+calvinist(2) K AE L V IH N IH S T
+calvino K AO L V IY N OW
+calvo K AA L V OW
+calypso K AH L IH P S OW
+calypsos K AH L IH P S OW Z
+calyx K AE L IH K S
+calzada K AA L Z AA D AH
+cam K AE M
+cam's K AE M Z
+cama K AA M AH
+cama(2) S IY EY EH M EY
+camacho K AH M AA CH OW
+camaguey K AE M AH G EY
+camaguey(2) K AE M AH G W EY
+caman K EY M AH N
+camara K AA M AA R AH
+camaraderie K AA M ER AA D ER IY
+camarata K AA M AA R AA T AH
+camarena K AA M AA R EH N AH
+camarena(2) K AA M ER EY N AH
+camargo K AA M AA R G OW
+camarillo K AA M AA R IH L OW
+camaro K AH M EH R OW
+camaros K AH M AA R OW S
+cambell K AE M B AH L
+camber K AE M B ER
+cambex K AE M B AH K S
+cambior K AE M B IY ER
+cambodia K AE M B OW D IY AH
+cambodia's K AE M B OW D IY AH Z
+cambodian K AE M B OW D IY AH N
+cambodians K AE M B OW D IY AH N Z
+cambra K AE M B R AH
+cambre K AE M B ER
+cambria K AE M B R IY AH
+cambrian K AE M B R IY AH N
+cambrian's K AE M B R IY AH N Z
+cambridge K EY M B R IH JH
+cambridgeport K EY M B R IH JH P AO R T
+cambridgeside K EY M B R IH JH S AY D
+cambron K AE M B R AH N
+camburn K AE M B ER N
+camby K AE M B IY
+camby's K AE M B IY Z
+camco K AE M K OW
+camcorder K AE M K AO R D ER
+camcorders K AE M K AO R D ER Z
+camden K AE M D AH N
+camden's K AE M D AH N Z
+camdessus K AE M D EH S AH S
+came K EY M
+cameco K AE M IH K OW
+camejo K AA M EY Y OW
+camel K AE M AH L
+camel's K AE M AH L Z
+camelot K AE M AH L AA T
+camels K AE M AH L Z
+cameo K AE M IY OW
+cameos K AE M IY OW Z
+camera K AE M ER AH
+camera's K AE M R AH Z
+camera(2) K AE M R AH
+cameraman K AE M ER AH M AH N
+cameramen K AE M ER AH M EH N
+cameras K AE M ER AH Z
+cameras(2) K AE M R AH Z
+camerer K AE M ER ER
+camero K AH M EH R OW
+cameron K AE M ER AH N
+cameron's K AE M ER AH N Z
+camerons K AE M ER AH N Z
+cameroon K AE M ER UW N
+camfield K AE M F IY L D
+camhi K AE M HH IY
+camilla K AH M IH L AH
+camille K AH M IY L
+camilleri K AA M IY L EH R IY
+camilli K AH M IH L IY
+camillo K AH M IH L OW
+caminiti K AA M IY N IY T IY
+camino K AH M IY N OW
+camire K AA M IH R IY
+camm K AE M
+cammack K AE M AH K
+cammarano K AA M AA R AA N OW
+cammarata K AA M AA R AA T AH
+cammarota K AA M AA R OW T AH
+cammer K AE M ER
+cammermeyer K AE M ER M AY ER
+cammie K AE M IY
+cammisa K AH M IY S AH
+cammon K AE M AH N
+cammy K AE M IY
+camorra K AH M AO R AH
+camouflage K AE M AH F L AA ZH
+camouflaged K AE M AH F L AA ZH D
+camouflaging K AE M AH F L AA ZH IH NG
+camp K AE M P
+camp's K AE M P S
+campa K AE M P AH
+campaign K AE M P EY N
+campaign's K AE M P EY N Z
+campaigned K AE M P EY N D
+campaigner K AE M P EY N ER
+campaigners K AE M P EY N ER Z
+campaigning K AE M P EY N IH NG
+campaigns K AE M P EY N Z
+campana K AA M P AE N AH
+campanale K AA M P AA N AA L IY
+campanaro K AA M P AA N AA R OW
+campanella K AE M P AH N EH L AH
+campanelli K AA M P AA N EH L IY
+campanis K AE M P AA N IH S
+campau K AA M P AW
+campbell K AE M B AH L
+campbell's K AE M B AH L Z
+campbells K AE M B AH L Z
+campeau K AE M P OW
+campeau's K AE M P OW Z
+camped K AE M P T
+campen K AE M P AH N
+camper K AE M P ER
+campers K AE M P ER Z
+campesinos K AE M P EH S IY N OW S
+campfield K AE M P F IY L D
+campfire K AE M P F AY ER
+campfires K AE M P F AY ER Z
+campground K AE M P G R AW N D
+campgrounds K AE M P G R AW N D Z
+campi K AE M P IY
+camping K AE M P IH NG
+campion K AE M P IY AH N
+campione K AA M P IY OW N IY
+campise K AA M P AY Z
+campisi K AA M P IY S IY
+campo K AE M P OW
+campobasso K AA M P OW B AA S OW
+campofrio K AE M P AO F R IY OW
+campoli K AA M P OW L IY
+campopiano K AA M P OW P IY AA N OW
+campos K AE M P OW Z
+camps K AE M P S
+camps' K AE M P S
+campsite K AE M P S AY T S
+campsites K AE M P S AY T S
+campton K AE M P T AH N
+campus K AE M P AH S
+campuses K AE M P AH S AH Z
+campuses(2) K AE M P AH S IH Z
+campuzano K AA M P UW Z AA N OW
+campy K AE M P IY
+camro K AE M R OW
+camry K AE M R IY
+camrys K AE M R IY Z
+camshaft K AE M SH AE F T
+camshafts K AE M SH AE F T S
+camus K AE M IH S
+camuso K AA M UW S OW
+can K AE N
+can's K AE N Z
+can't K AE N T
+can(2) K AH N
+cana K AE N AH
+canaan K EY N AH N
+canaanite K EY N AH N AY T
+canace K AA N AA CH IY
+canada K AE N AH D AH
+canada's K AE N AH D AH Z
+canadair K AE N AH D EH R
+canaday K AE N AH D EY
+canadian K AH N EY D IY AH N
+canadian's K AH N EY D IY AH N Z
+canadians K AH N EY D IY AH N Z
+canadians' K AH N EY D IY AH N Z
+canadienne K AH N AE D IY EH N
+canady K AH N AA D IY
+canal K AH N AE L
+canal's K AH N AE L Z
+canale K AA N AA L IY
+canales K AE N AH L Z
+canals K AH N AE L Z
+canam K AE N AH M
+canan K EY N AH N
+canandaigua K AE N AH N D EY G W AH
+cananea K AE N AH N IY AH
+canard K AH N AA R D
+canariensis K AH N EH R IY EH N S AH S
+canaries K AH N EH R IY Z
+canary K AH N EH R IY
+canas K AE N AH Z
+canasta K AH N AE S T AH
+canavan K AE N AH V AE N
+canaveral K AH N AE V ER AH L
+canaveral(2) K AH N AE V R AH L
+canberra K AE N B EH R AH
+canby K AE N B IY
+cancan K AE N K AE N
+cancel K AE N S AH L
+canceled K AE N S AH L D
+canceling K AE N S AH L IH NG
+canceling(2) K AE N S L IH NG
+cancellation K AE N S AH L EY SH AH N
+cancellations K AE N S AH L EY SH AH N Z
+cancelled K AE N S AH L D
+cancelling K AE N S AH L IH NG
+cancelling(2) K AE N S L IH NG
+cancels K AE N S AH L Z
+cancer K AE N S ER
+cancer's K AE N S ER Z
+cancerous K AE N S ER AH S
+cancerphobia K AE N S ER F OW B IY AH
+cancers K AE N S ER Z
+canchola K AA N K OW L AH
+cancienne K AA N CH IY EH N
+cancilla K AA N CH IH L AH
+cancino K AA N CH IY N OW
+cancio K AE N S IY OW
+cancom K AE NG K AH M
+cancro K AA N K R OW
+cancun K AE NG K AH N
+cancun(2) K AA NG K UW N
+candace K AE N D AH S
+candee K AE N D IY
+candela K AE N D EH L AH
+candelabra K AE N D AH L AA B R AH
+candelaria K AA N D EH L AA R IY AH
+candelario K AA N D EH L AA R IY OW
+candella K AA N D EH L AH
+candellin K AE N D AH L IH N
+candia K AE N D IY AH
+candice K AE N D IH S
+candice's K AE N D IH S IH Z
+candid K AE N D AH D
+candid(2) K AE N D IH D
+candida K AE N D IH D AH
+candidacies K AE N D AH D AH S IY Z
+candidacy K AE N D IH D AH S IY
+candidate K AE N D AH D EY T
+candidate's K AE N D AH D EY T S
+candidate(2) K AE N AH D IH T
+candidates K AE N D AH D EY T S
+candidates' K AE N D AH D EY T S
+candidates(2) K AE N AH D IH T S
+candidly K AE N D IH D L IY
+candido K AE N D IY D OW
+candie K AE N D IY
+candied K AE N D IY D
+candies K AE N D IY Z
+candilin K AE N D IH L IH N
+candiotti K AE N D IY AA T IY
+candiotti's K AE N D IY AA T IY Z
+candle K AE N D AH L
+candlelight K AE N D AH L L AY T
+candlemaker K AE N D AH L M EY K ER
+candler K AE N D AH L ER
+candler(2) K AE N D L ER
+candles K AE N D AH L Z
+candlestick K AE N D AH L S T IH K
+candlesticks K AE N D AH L S T IH K S
+candlish K AE N D L IH SH
+candor K AE N D ER
+candy K AE N D IY
+candy's K AE N D IY Z
+candyman K AE N D IY M AE N
+cane K EY N
+caned K EY N D
+canedo K AA N EY D OW
+canedy K AH N IY D IY
+canelo K AH N EH L OW
+canepa K AA N EH P AH
+canes K EY N Z
+canevari K AA N EH V AA R IY
+canez K AA N EH Z
+canfield K AE N F IY L D
+canfor K AE N F ER
+canfor's K AE N F ER Z
+cangelosi K AA NG G EH L OW S IY
+cangemi K AA NG G EH M IY
+cangialosi K AA N JH AH L OW S IY
+cangiano K AA NG G IY AA N OW
+canham K AE N HH AH M
+canida K AA N IY D AH
+caniglia K AH N IH G L IY AH
+canilles K AH N IH L IY Z
+canin K EY N IH N
+canine K EY N AY N
+canines K EY N AY N Z
+caning K EY N IH NG
+canings K EY N IH NG Z
+canino K AA N IY N OW
+canion K AE N Y AH N
+canipe K AA N IY P IY
+canister K AE N AH S T ER
+canister(2) K AE N IH S T ER
+canisters K AE N AH S T ER Z
+canisters(2) K AE N IH S T ER Z
+canker K AE NG K ER
+cankers K AE NG K ER Z
+cann K AE N
+cannabis K AE N AH B AH S
+cannaday K AE N AH D EY
+cannady K AE N AH D IY
+cannan K AE N AH N
+cannata K AA N AA T AH
+cannavino K AE N AH V IY N OW
+cannavo K AA N AA V OW
+canned K AE N D
+cannedy K AE N IH D IY
+cannell K AE N AH L
+cannella K AA N EH L AH
+cannelton K AE N AH L T AH N
+canner K AE N ER
+canneries K AE N ER IY Z
+cannery K AE N ER IY
+cannes K AE N Z
+cannes(2) K AE N
+canney K AE N IY
+cannibal K AE N AH B AH L
+cannibalism K AE N AH B AH L IH Z AH M
+cannibalization K AE N AH B AH L IH Z EY SH AH N
+cannibalize K AE N AH B AH L AY Z
+cannibalizing K AE N AH B AH L AY Z IH NG
+cannibals K AE N AH B AH L Z
+canniff K AE N IH F
+canning K AE N IH NG
+cannister K AE N IH S T ER
+cannisters K AE N IH S T ER Z
+cannistraro K AE N IH S T R AA R OW
+cannizzaro K AA N IY T S AA R OW
+cannizzo K AA N IY Z OW
+cannon K AE N AH N
+cannon's K AE N AH N Z
+cannonball K AE N AH N B AO L
+cannondale K AE N AH N D EY L
+cannone K AA N OW N IY
+cannons K AE N AH N Z
+cannonsburg K AE N AH N Z B ER G
+cannot K AE N AA T
+cannot(2) K AH N AA T
+canny K AE N IY
+cano K AA N OW
+canoe K AH N UW
+canoed K AH N UW D
+canoeing K AH N UW IH NG
+canoeist K AH N UW AH S T
+canoes K AH N UW Z
+canoga K AH N OW G AH
+canola K AH N OW L AH
+canon K AE N AH N
+canon's K AE N AH N Z
+canonic K AH N AA N AH K
+canonical K AH N AA N AH K AH L
+canonico K AA N OW N IY K OW
+canonie K AE N AH N IY
+canonization K AE N AH N AH Z EY SH AH N
+canonize K AE N AH N AY Z
+canonized K AE N AH N AY Z D
+canons K AE N AH N Z
+canopy K AE N AH P IY
+canosa K AH N OW S AH
+canova K AA N OW V AH
+canoy K AE N OY
+canrad K AE N R AE D
+canron K AE N R AH N
+cans K AE N Z
+canseco K AE N S EH K OW
+cansler K AE N S AH L ER
+cansler(2) K AE N S L ER
+canso K AE N S OW
+canson K AE N S AH N
+canstar K AE N S T AA R
+cant K AE N T
+cantaloupe K AE N T AH L OW P
+cantaloupes K AE N T AH L OW P S
+cantalupo K AE N T AH L UW P OW
+cantankerous K AE N T AE NG K ER AH S
+cantara K AA N T AA R AH
+cantata K AE N T AA T AH
+canteen K AE N T IY N
+canteens K AE N T IY N Z
+cantel K AE N T EH L
+canter K AE N T ER
+canterbury K AE N T ER B EH R IY
+canterbury's K AE N T ER B EH R IY Z
+canterbury's(2) K AE N ER B EH R IY Z
+cantero K AA N T EH R OW
+canterra K AA N T EH R AH
+cantey K AE N T IY
+cantin K AA N T IY N
+cantina K AE N T IY N AH
+cantle K AE N T AH L
+cantley K AE N T L IY
+cantlin K AE N T L IH N
+cantlon K AE N T L AH N
+canto K AE N T OW
+canton K AE N T AH N
+cantonal K AE N T AH N AH L
+cantone K AA N T OW N IY
+cantonese K AE N T AH N IY Z
+cantons K AE N T AH N Z
+cantor K AE N T ER
+cantor's K AE N T ER Z
+cantore K AE N T AO R
+cantors K AE N T ER Z
+cantrall K AE N T R AH L
+cantrell K AE N T R EH L
+cantrelle K AH N T R EH L
+cantu K AE N T UW
+cantv K AE N T IY V IY
+cantwell K AE N T W EH L
+canty K AE N T IY
+canuck K EY N AH K
+canuck(2) K AH N AH K
+canucks K EY N AH K S
+canucks(2) K AH N AH K S
+canup K AE N AH P
+canupp K AE N AH P
+canvas K AE N V AH S
+canvases K AE N V AH S IH Z
+canvass K AE N V AH S
+canvassed K AE N V AH S T
+canvassers K AE N V AH S ER Z
+canvasses K AE N V AH S IH Z
+canvassing K AE N V AH S IH NG
+canwest K AE N W EH S T
+canyon K AE N Y AH N
+canyon's K AE N Y AH N Z
+canyons K AE N Y AH N Z
+canzano K AA N Z AA N OW
+canzoneri K AA N Z OW N EH R IY
+cao K AW
+caouette K EY UW T
+cap K AE P
+cap's K AE P S
+capabilities K EY P AH B IH L AH T IY Z
+capability K EY P AH B IH L AH T IY
+capable K EY P AH B AH L
+capacious K AH P EY SH AH S
+capacitance K AH P AE S AH T AH N S
+capacities K AH P AE S AH T IY Z
+capacities(2) K AH P AE S IH T IY Z
+capacitor K AH P AE S AH T ER
+capacitors K AH P AE S AH T ER Z
+capacitors(2) K AH P AE S IH T ER Z
+capacity K AH P AE S AH T IY
+capacity(2) K AH P AE S IH T IY
+capalbo K AH P AE L B OW
+capaldi K AA P AA L D IY
+capaldo K AA P AA L D OW
+capano K AA P AA N OW
+capasso K AA P AA S OW
+capcom K AE P K AH M
+cape K EY P
+cape-town K EY P T AW N
+capece K AH P IY S
+capeci K AH P EH CH IY
+capeci(2) K AH P IY CH IY
+caped K EY P T
+capehart K EY P HH AA R T
+capek K AE P IH K
+capel K EY P AH L
+capel's K AE P AH L Z
+capell K AA P EY L
+capella K AH P EH L AH
+capelle K AH P EH L
+capelli K AH P EH L IY
+capello K AH P EH L OW
+capen K EY P AH N
+caper K EY P ER
+capernaum K AH P ER N IY AH M
+capers K EY P ER Z
+caperton K EY P ER T AH N
+capes K EY P S
+capetillo K AA P EH T IH L OW
+capetown K EY P T AW N
+capillaries K AE P AH L EH R IY Z
+capillary K AE P AH L EH R IY
+capistrano K AE P IH S T R AA N OW
+capita K AE P IH T AH
+capital K AE P AH T AH L
+capital's K AE P IH T AH L Z
+capital(2) K AE P IH T AH L
+capitalism K AE P IH T AH L IH Z AH M
+capitalism's K AE P AH T AH L IH Z AH M Z
+capitalist K AE P AH T AH L AH S T
+capitalistic K AE P IH T AH L IH S T IH K
+capitalists K AE P AH T AH L AH S T S
+capitalists(2) K AE P AH T AH L AH S S
+capitalists(3) K AE P AH T AH L AH S
+capitalization K AE P IH T AH L IH Z EY SH AH N
+capitalizations K AE P IH T AH L IH Z EY SH AH N Z
+capitalize K AE P AH T AH L AY Z
+capitalized K AE P IH T AH L AY Z D
+capitalizes K AE P AH T AH L AY Z IH Z
+capitalizing K AE P IH T AH L AY Z IH NG
+capitals K AE P AH T AH L Z
+capitals(2) K AE P IH T AH L Z
+capitan K AE P IH T AH N
+capitano K AA P IY T AA N OW
+capito K AA P IY T OW
+capitol K AE P IH T AH L
+capitol's K AE P IH T AH L Z
+capitoline K AE P IH T OW L AY N
+capitols K AE P IH T AH L Z
+capitulate K AH P IH CH UW L IH T
+capitulate(2) K AH P IH CH UW L EY T
+capitulated K AH P IH CH AH L EY T IH D
+capitulation K AH P IH CH AH L EY SH AH N
+capizzi K AA P IY T S IY
+caplan K AE P L AH N
+caple K EY P AH L
+caples K EY P AH L Z
+capley K AE P L IY
+caplin K AE P L IH N
+caplinger K EY P AH L IH NG ER
+caplinger(2) K EY P L IH NG ER
+caplinger(3) K AE P L IH N JH ER
+capo K AA P OW
+capobianco K AA P OW B IY AA N K OW
+capon K EY P AA N
+capone K AH P OW N
+caponi K AA P OW N IY
+caponigro K AA P OW N IY G R OW
+caporale K AA P AO R AA L IY
+caporaso K AA P AO R AA S OW
+capote K AH P OW T
+capote's K AH P OW T S
+capoten K AH P OW T AH N
+capozzi K AH P AA Z IY
+capozzoli K AA P OW T S OW L IY
+capp K AE P
+cappa K AE P AH
+cappadona K AA P AA D OW N AH
+capparelli K AA P AA R EH L IY
+capped K AE P T
+cappel K AE P AH L
+cappella K AA P EH L AH
+cappelletti K AA P EH L EH T IY
+cappelli K AA P EH L IY
+cappello K AA P EH L OW
+capper K AE P ER
+cappetta K AA P EH T AH
+cappiello K AA P IY EH L OW
+capping K AE P IH NG
+cappo K AE P OW
+capps K AE P S
+cappuccino K AE P UW CH IY N OW
+cappuccio K AA P UW CH IY OW
+cappy K AE P IY
+cappy's K AE P IY Z
+capra K AE P R AH
+capraro K AA P R AA R OW
+capri K AE P R IY
+capri's K AE P R IY Z
+capri's(2) K AH P R IY Z
+capri(2) K AH P R IY
+capriati K AE P R IY AA T IY
+capriati's K AE P R IY AA T IY Z
+caprice K AH P R IY S
+caprices K AH P R IY S AH Z
+capricious K AH P R IH SH AH S
+capriciously K AH P R IH SH IH S L IY
+capricorn K AE P R AH K AO R N
+caprio K AE P R IY OW
+capriotti K AA P R IY OW T IY
+capron K AE P R AH N
+caps K AE P S
+capsaicin K AE P S EY S AH N
+capshaw K AE P SH AO
+capsize K AE P S AY Z
+capsized K AE P S AY Z D
+capstan K AE P S T AH N
+capstick K AE P S T IH K
+capstone K AE P S T OW N
+capsule K AE P S AH L
+capsules K AE P S AH L Z
+captain K AE P T AH N
+captain's K AE P T AH N Z
+captaining K AE P T AH N IH NG
+captains K AE P T AH N Z
+caption K AE P SH AH N
+captioned K AE P SH AH N D
+captioning K AE P SH AH N IH NG
+captions K AE P SH AH N Z
+captivate K AE P T IH V EY T
+captivated K AE P T IH V EY T IH D
+captivates K AE P T IH V EY T S
+captivating K AE P T IH V EY T IH NG
+captive K AE P T IH V
+captives K AE P T IH V Z
+captivity K AE P T IH V AH T IY
+captor K AE P T ER
+captors K AE P T ER Z
+capture K AE P CH ER
+captured K AE P CH ER D
+captures K AE P CH ER Z
+capturing K AE P CH ER IH NG
+capua K AE P Y UW AH
+capuano K AA P UW AA N OW
+caput K AH P UH T
+caputi K AA P UW T IY
+caputo K AA P UW T OW
+capwell K AE P W EH L
+caq K AE K
+caq's K AE K S
+car K AA R
+car's K AA R Z
+cara K EH R AH
+cara's K EH R AH Z
+cara'veras K AA R AH V EH R AH Z
+carabajal K ER AE B AH JH AH L
+caraballo K AE R AH B AE L OW
+carabello K AE R AH B EH L OW
+caracara K AA R AH K AA R AH
+caracas K ER AA K AH S
+caracci K AA R AA CH IY
+caracciolo K AA R AA K CH OW L OW
+caradine K AA R AA D IY N IY
+caradonna K AA R AA D OW N AH
+carafate K EH R AH F EY T
+carafe K AH R AE F
+caraher K AE R AH HH ER
+caraker K AE R AH K ER
+caramandi K AE R AH M AA N D IY
+caramel K EH R AH M AH L
+caramelize K EH R AH M AH L AY Z
+caramelized K EH R AH M AH L AY Z D
+carangelo K AA R AA NG G EH L OW
+carano K AA R AA N OW
+caras K AA R AH Z
+carat K EH R AH T
+carats K EH R AH T S
+carava K AE R AH V AH
+caravan K AE R AH V AE N
+caravan(2) K EH R AH V AE N
+caravans K AE R AH V AE N Z
+caravans(2) K EH R AH V AE N Z
+caravel K EH R AH V EH L
+caravella K AE R AH V EH L AH
+caravelle K EH R AH V EH L
+caravello K AE R AH V EH L OW
+caraveo K AA R AA V IY OW
+carawan K AE R AH W AE N
+caraway K AE R AH W EY
+caraway(2) K EH R AH W EY
+carbajal K AA R B AA Y AE L
+carballo K AA R B AA L OW
+carbary K AA R B EH R IY
+carbaugh K AA R B AO
+carberry K AA R B EH R IY
+carberry's K AA R B EH R IY Z
+carbide K AA R B AY D
+carbide's K AA R B AY D Z
+carbin K AA R B IH N
+carbine K AA R B AY N
+carbo K AA R B OW
+carbohydrate K AA R B OW HH AY D R EY T
+carbohydrate(2) K AA R B OW HH AY D R AH T
+carbohydrates K AA R B OW HH AY D R EY T S
+carbon K AA R B AH N
+carbonara K AA R B OW N AA R AH
+carbonaro K AA R B OW N AA R OW
+carbonate K AA R B AH N EY T
+carbonated K AA R B AH N EY T AH D
+carbonated(2) K AA R B AH N EY T IH D
+carbonates K AA R B AH N EY T S
+carbondale K AA R B AH N D EY L
+carbone K AA R B OW N
+carbonell K AA R B AH N EH L
+carbonetto K AA R B OW N EH T OW
+carboni K AA R B OW N IY
+carboniferous K AA R B AH N IH F ER AH S
+carbonize K AA R B AH N AY Z
+carbonized K AA R B AH N AY Z D
+carbonneau K AA R B AH N OW
+carbons K AA R B AH N Z
+carborundum K AA R B ER AH N D AH M
+carboxylic K AA R B AO K S IH L IH K
+carboy K AA R B OY
+carburete K AA R B Y ER EH T
+carbureted K AA R B Y ER EH T IH D
+carburetion K AA R B Y ER IY SH AH N
+carburetor K AA R B ER EY T ER
+carburetors K AA R B ER EY T ER Z
+carby K AA R B IY
+carcass K AA R K AH S
+carcasses K AA R K AH S IH Z
+carcinogen K AA R S IH N AH JH AH N
+carcinogenic K AA R S AH N OW JH EH N IH K
+carcinogens K AA R S IH N AH JH AH N Z
+carcinoma K AA R S AH N OW M AH
+carcione K AA R CH OW N IY
+card K AA R D
+card's K AA R D Z
+carda K AA R D AH
+cardarelli K AA R D AA R EH L IY
+cardboard K AA R D B AO R D
+cardboards K AA R D B AO R D Z
+carded K AA R D AH D
+carded(2) K AA R D IH D
+cardell K AA R D EY L
+cardella K AA R D EH L AH
+cardello K AA R D EH L OW
+carden K AA R D AH N
+cardenas K AA R D IY N AH S
+cardenas's K AA R D IY N AH S IH Z
+carder K AA R D ER
+cardholder K AA R D HH OW L D ER
+cardholders K AA R D HH OW L D ER Z
+cardia K AA R D IY AH
+cardiac K AA R D IY AE K
+cardiel K AA R D IY L
+cardiff K AA R D IH F
+cardigan K AA R D IH G AH N
+cardigans K AA R D IH G AH N Z
+cardiges K AA R D IH JH IH Z
+cardillo K AA R D IH L OW
+cardin K AA R D IH N
+cardinal K AA R D AH N AH L
+cardinal's K AA R D AH N AH L Z
+cardinal(2) K AA R D IH N AH L
+cardinale K AA R D IY N AA L IY
+cardinali K AA R D IY N AA L IY
+cardinals K AA R D AH N AH L Z
+cardinals' K AA R D IH N AH L Z
+cardio K AA R D IY OW
+cardiologist K AA R D IY AA L AH JH IH S T
+cardiologists K AA R D IY AA L AH JH IH S T S
+cardiologists(2) K AA R D IY AA L AH JH IH S S
+cardiologists(3) K AA R D IY AA L AH JH IH S
+cardiology K AA R D IY AA L AH JH IY
+cardiopulmonary K AA R D IY OW P UH L M AH N EH R IY
+cardiovascular K AA R D IY OW V AE S K Y AH L ER
+cardis K AA R D IH S
+cardiss K AA R D IH S
+cardizem K AA R D IH Z EH M
+cardoen K AA R D OW AH N
+cardon K AA R D AO N
+cardona K AA R D OW N AH
+cardone K AA R D OW N IY
+cardoni K AA R D OW N IY
+cardoon K AA R D UW N
+cardosa K AA R D OW S AH
+cardosi K AA R D OW S IY
+cardoso K AA R D OW S OW
+cardoso's K AA R D OW S OW Z
+cardoza K AA R D OW Z AH
+cardozo K AA R D OW Z OW
+cards K AA R D Z
+cards' K AA R D Z
+carducci K AA R D UW CH IY
+cardwell K AA R D W EH L
+cardy K AA R D IY
+care K EH R
+care's K EH R Z
+cared K EH R D
+careen K ER IY N
+careened K ER IY N D
+careening K ER IY N IH NG
+careens K ER IY N Z
+career K ER IH R
+careercom K ER IH R K AA M
+careering K ER IH R IH NG
+careerism K ER IY R IH Z AH M
+careerist K ER IH R IH S T
+careerists K ER IH R IH S T S
+careerists(2) K ER IH R IH S S
+careerists(3) K ER IH R IH S
+careers K ER IH R Z
+carefree K EH R F R IY
+careful K EH R F AH L
+carefully K EH R F AH L IY
+caregiver K EH R G IH V ER
+caregivers K EH R G IH V ER Z
+caregiving K EH R G IH V IH NG
+carel K AA R EH L
+careless K EH R L AH S
+carelessly K EH R L AH S L IY
+carelessness K EH R L AH S N AH S
+carella K AA R EH L AH
+carelli K AA R EH L IY
+carello K EH R EH L OW
+carelock K AE R IH L AA K
+carelock(2) K AE R L AA K
+caremark K EH R M AA R K
+caremark's K EH R M AA R K S
+carena K EH R IY N AH
+careplus K EH R P L AH S
+carer K EH R ER
+cares K EH R Z
+caress K ER EH S
+caresse K AA R EH S
+caressed K ER EH S T
+caresses K ER EH S IH Z
+caressing K ER EH S IH NG
+caretaker K EH R T EY K ER
+caretakers K EH R T EY K ER Z
+careunit K EH R Y UW N IH T
+careunits K EH R Y UW N IH T S
+carew K AE R UW
+carey K EH R IY
+carey's K EH R IY Z
+carfagno K AA R F AA G N OW
+carfora K AA R F AO R AH
+cargal K AA R G AE L
+cargile K AA R JH AH L
+cargill K AA R G IH L
+cargo K AA R G OW
+cargo's K AA R G OW Z
+cargoes K AA R G OW Z
+cargonoff K AA R G AH N AO F
+cargos K AA R G OW Z
+carhart K AA R HH AA R T
+caribbean K ER IH B IY AH N
+caribbean(2) K EH R IH B IY AH N
+caribe K EH R IY B
+caribou K EH R IH B UW
+caricature K EH R AH K AH CH ER
+caricatured K ER IH K AH CH ER D
+caricatures K ER IH K AH CH ER Z
+caricaturist K EH R AH K AH CH ER AH S T
+carico K AA R IY K OW
+caricom K EH R IH K AA M
+caricom's K EH R IH K AA M Z
+caridad K AE R AH D AE D
+caridi K AA R IY D IY
+carie K EH R IY
+cariello K AA R IY EH L OW
+carignan K AE R IH G N AH N
+cariker K AE R IH K ER
+carilla K AA R IH L AH
+carillo K AA R IH L OW
+carillon K EH R AH L AA N
+carilou K EH R AH L UW
+carin K AE R IH N
+carine K AA R IY N IY
+caring K EH R IH NG
+carini K AA R IY N IY
+carinii K EH R IY N IY
+carino K AA R IY N OW
+carioca K EH R IY OW K AH
+caris K AE R IH S
+carisbrook K EH R IH S B R UH K
+carissa K AA R IY S AH
+carita K AA R IY T AH
+carithers K AE R IH DH ER Z
+carjack K AA R JH AE K
+carjacked K AA R JH AE K T
+carjacker K AA R JH AE K ER
+carjacker's K AA R JH AE K ER Z
+carjackers K AA R JH AE K ER Z
+carjacking K AA R JH AE K IH NG
+carjackings K AA R JH AE K IH NG Z
+carjacks K AA R JH AE K S
+carkhuff K AA R K HH AH F
+carl K AA R L
+carl's K AA R L Z
+carla K AA R L AH
+carla's K AA R L AH Z
+carlan K AA R L AH N
+carland K AA R L AH N D
+carlberg K AA R L B ER G
+carle K AA R AH L
+carleen K AA R L IY N
+carlen K AA R L AH N
+carlene K AA R L IY N
+carles K AA R L Z
+carleton K AA R L T AH N
+carley K AA R L IY
+carli K AA R L IY
+carlile K AA R L AY L
+carlin K AA R L IH N
+carlin's K AA R L IH N Z
+carliner K AA R L AY N ER
+carling K AA R L IH NG
+carling's K AA R L IH NG Z
+carlini K AA R L IY N IY
+carlino K AA R L IY N OW
+carlisi K AA R L IY S IY
+carlisle K AA R L AY L
+carlita K AA R L IY T AH
+carlito K AA R L IY T OW
+carlito's K AA R L IY T OW Z
+carll K AA R L
+carlo K AA R L OW
+carload K AA R L OW D
+carloading K AA R L OW D IH NG
+carloadings K AA R L OW D IH NG Z
+carloads K AA R L OW D Z
+carlock K AA R L AA K
+carlon K AA R L AH N
+carlone K AA R L OW N IY
+carloni K AA R L OW N IY
+carlos K AA R L OW S
+carlotta K AA R L AO T AH
+carlough K AA R L OW
+carlow K AA R L OW
+carls K AA R L Z
+carlsbad K AA R L S B AE D
+carlsberg K AA R L Z B ER G
+carlsen K AA R L S AH N
+carlson K AA R L S AH N
+carlson's K AA R L S AH N Z
+carlsson K AA R L S AH N
+carlstadt K AA R L S T AE T
+carlston K AA R L S T AH N
+carlstrom K AA R L S T R AH M
+carlton K AA R L T AH N
+carlton's K AA R L T AH N Z
+carlucci K AA R L UW CH IY
+carly K AA R L IY
+carlyle K AA R L AY L
+carlyle's K AA R L AY L Z
+carlyon K AA R L IY AA N
+carlzon K AA R L Z AA N
+carma K AA R M AH
+carmack K AA R M AH K
+carmaker K AA R M EY K ER
+carmaker's K AA R M EY K ER Z
+carmakers K AA R M EY K ER Z
+carmakers' K AA R M EY K ER Z
+carman K AA R M AH N
+carmany K AA R M AH N IY
+carmean K AA R M IY AH N
+carmel K AA R M EH L
+carmel(2) K AA R M AH L
+carmela K AA R M EH L AH
+carmelita K AA R M AH L IY T AH
+carmelite K AA R M AH L AY T
+carmelo K AA R M EH L OW
+carmen K AA R M AH N
+carmer K AA R M ER
+carmical K AA R M IH K AH L
+carmichael K AA R M AY K AH L
+carmickle K AA R M IH K AH L
+carmie K AA R M IY
+carmike K AA R M AY K
+carmine K AA R M AH N
+carmita K AA R M IY T AH
+carmody K AA R M AH D IY
+carmon K AA R M AH N
+carmona K AA R M OW N AH
+carmony K AA R M OW N IY
+carmouche K AA R M UW SH
+carmoy K AA R M OY
+carmy K AA R M IY
+carn K AA R N
+carnage K AA R N IH JH
+carnahan K AA R N AH HH AE N
+carnahan's K AA R N AH HH AE N Z
+carnal K AA R N AH L
+carnathan K AA R N AH TH AE N
+carnation K AA R N EY SH AH N
+carnations K AA R N EY SH AH N Z
+carnauba K AA R N AO B AH
+carnaud K AA R N AO B
+carne K AA R N
+carneal K AA R N AH L
+carnegie K AA R N AH G IY
+carnegie's K AA R N AH G IY Z
+carnegie's(2) K AA R N EY G IY Z
+carnegie(2) K AA R N EY G IY
+carnegie-mellon K AA R N AH G IY M EH L AH N
+carnegie-mellon(2) K AA R N EY G IY M EH L AH N
+carnegies K AA R N AH G IY Z
+carnegies(2) K AA R N EY G IY Z
+carneiro K AA R N EH R OW
+carnell K AA R N AH L
+carner K AA R N ER
+carnes K AA R N Z
+carnett K AA R N AH T
+carnevale K AA R N EY V AA L EY
+carney K AA R N IY
+carnicero K AA R N IH S EH R OW
+carnine K AA R N IY N IY
+carnival K AA R N AH V AH L
+carnival's K AA R N AH V AH L Z
+carnivals K AA R N AH V AH L Z
+carnivore K AA R N IH V AO R
+carnivores K AA R N AH V AO R Z
+carnivorous K AA R N IH V ER AH S
+carnley K AA R N L IY
+carns K AA R N Z
+caro K AA R OW
+carob K EH R AH B
+caroche K ER OW CH
+carol K AE R AH L
+carol's K EH R AH L Z
+carol's(2) K AE R AH L Z
+carol(2) K EH R AH L
+carolan K EH R AH L AE N
+carolco K ER AA L K OW
+carolco's K EH R AH L K OW Z
+carolco's(2) K ER EH L K OW Z
+carole K AE R AH L
+carole(2) K EH R AH L
+carolina K EH R AH L AY N AH
+carolina's K EH R AH L AY N AH Z
+carolinas K EH R AH L AY N AH Z
+caroline K EH R AH L AY N
+caroline's K EH R AH L AY N Z
+carolingian K EH R AH L IH N JH IY AH N
+carolinian K EH R OW L IH N IY AH N
+carolinian(2) K EH R AH L IH N IY AH N
+carolinians K EH R AH L IH N IY AH N Z
+carollan K ER AA L AH N
+carollo K ER AA L OW
+carols K EH R AH L Z
+carolus K EH R AH L AH S
+carolyn K EH R AH L IH N
+carolyne K EH R AH L IH N
+carolyne(2) K EH R AH L AY N
+caron K AA R AO N
+carone K ER OW N
+caronna K ER AA N AH
+carosella K AA R OW S EH L AH
+caroselli K AA R OW S EH L IY
+carosi K ER OW S IY
+carota K ER OW T AH
+carotene K EH R AH T IY N
+carotenes K EH R AH T IY N Z
+carotenuto K AA R OW T EH N UW T OW
+carothers K AE R AH DH ER Z
+carotid K ER AA T IH D
+carouse K ER AW Z
+carousel K EH R AH S EH L
+carousing K ER AW Z IH NG
+carow K AE R OW
+carozza K ER AA Z AH
+carp K AA R P
+carpal K AA R P AH L
+carpe-diem K AA R P AH D IY AH M
+carpencic K AA R P EH N CH IH K
+carpencic's K AA R P EH N CH IH K S
+carpenito K AA R P EH N IY T OW
+carpenter K AA R P AH N T ER
+carpenter's K AA R P AH N T ER Z
+carpenters K AA R P AH N T ER Z
+carpentier K AA R P AH N T IY ER
+carpentieri K AA R P EH N T IH R IY
+carpentry K AA R P AH N T R IY
+carper K AA R P ER
+carpet K AA R P AH T
+carpetbagger K AA R P AH T B AE G ER
+carpetbaggers K AA R P AH T B AE G ER Z
+carpeted K AA R P AH T IH D
+carpeting K AA R P AH T IH NG
+carpets K AA R P AH T S
+carpinelli K AA R P IY N EH L IY
+carping K AA R P IH NG
+carpino K AA R P IY N OW
+carpio K AA R P IY OW
+carpool K AA R P UW L
+carport K AA R P AO R T
+carports K AA R P AO R T S
+carr K AA R
+carr's K AA R Z
+carra K AA R AH
+carragher K AE R AH G HH ER
+carraher K AE R AH HH ER
+carranco K AA R AA N K OW
+carrano K AA R AA N OW
+carranza K AA R AA N Z AH
+carrara K AA R AA R AH
+carras K AE R AH Z
+carrasco K AA R AA S K OW
+carrasquel K EH R AH S K EH L
+carrasquillo K EH R AH S K IH L OW
+carraway K AE R AH W EY
+carrawell K EH R AH W EH L
+carre K AA R
+carre(2) K AA R EY
+carreira K AA R EH R AH
+carreiro K AA R EH R OW
+carreker K EH R IH K ER
+carrel K AE R AH L
+carrell K AA R EY L
+carreno K AA R EH N OW
+carreon K AA R EY AO N
+carrera K AA R EH R AH
+carreras K AA R EH R AA Z
+carrere K AA R EH R EY
+carrero K AA R EH R OW
+carretta K AA R EH T AH
+carrey K EH R IY
+carrey's K AE R IY Z
+carriage K AE R IH JH
+carriage(2) K EH R AH JH
+carriages K AE R IH JH IH Z
+carriages(2) K EH R AH JH AH Z
+carrian K EH R IY AH N
+carrian's K AE R IY AH N Z
+carrick K EH R IH K
+carrico K AA R IY K OW
+carrie K EH R IY
+carried K AE R IY D
+carried(2) K EH R IY D
+carrier K AE R IY ER
+carrier's K AE R IY ER Z
+carrier's(2) K EH R IY ER Z
+carrier(2) K EH R IY ER
+carriere K AA R IH R IY
+carriero K AA R IH R OW
+carriers K AE R IY ER Z
+carriers' K EH R IY ER Z
+carriers's K AE R IY ER Z IH Z
+carriers(2) K EH R IY ER Z
+carries K AE R IY Z
+carries(2) K EH R IY Z
+carrig K AE R IH G
+carrigan K AE R IH G AH N
+carriger K AE R IH JH ER
+carrigg K AE R IH G
+carriker K AE R IH K ER
+carrillo K ER IH L OW
+carringer K AE R IH NG ER
+carrington K EH R IH NG T AH N
+carrington's K EH R IH NG T AH N Z
+carrino K AA R IY N OW
+carrion K EH R IY AH N
+carris K AE R IH S
+carrisyn K AE R IH S IH N
+carrithers K AE R IH DH ER Z
+carriveau K AE R IH V OW
+carrizales K AA R IY Z AA L EH S
+carro K AA R OW
+carrol K AE R AH L
+carroll K AE R AH L
+carroll's K AE R AH L Z
+carroll's(2) K EH R AH L Z
+carroll(2) K EH R AH L
+carrollton K EH R AH L T AH N
+carron K AE R AH N
+carrot K AE R AH T
+carrot(2) K EH R AH T
+carrothers K AE R AH DH ER Z
+carrots K AE R AH T S
+carrots(2) K EH R AH T S
+carrousel K EH R AH S EH L
+carrow K AE R OW
+carrozza K AA R OW Z AH
+carrubba K AA R UW B AH
+carruth K AE R UW TH
+carruthers K ER AH DH ER Z
+carry K AE R IY
+carry(2) K EH R IY
+carryanne K AE R IY AE N
+carryforward K EH R IY F AO R W ER D
+carryforwards K EH R IY F AO R W ER D Z
+carrying K AE R IY IH NG
+carrying(2) K EH R IY IH NG
+carryover K EH R Y OW V ER
+cars K AA R Z
+cars' K AA R Z
+cars(2) K AA Z
+carse K AA R S
+carsey K AA R S IY
+carsick K AA R S IH K
+carson K AA R S AH N
+carson's K AA R S AH N Z
+carson(2) K AA R Z AH N
+carstarphen K AA R S T AA R F AH N
+carsten K AA R S T AH N
+carstens K AA R S T AH N Z
+carstensen K AA R S T EH N S AH N
+carswell K AA R S W EH L
+cart K AA R T
+carta K AA R T AH
+cartagena K AA R T AH JH IY N AH
+cartaya K AA R T AY AH
+carte K AA R T
+carted K AA R T IH D
+cartee K AA R T IY
+cartel K AA R T EH L
+cartel's K AA R T EH L Z
+cartels K AA R T EH L Z
+carter K AA R T ER
+carter's K AA R T ER Z
+cartera K AA R T EH R AH
+carteret K AA R T ER IH T
+carteret's K AA R T ER EH T S
+carters K AA R T ER Z
+cartersville K AA R T ER Z V IH L
+cartesian K AA R T IY ZH AH N
+carthage K AA R TH AH JH
+carthage(2) K AA R TH IH JH
+carthaginian K AA R TH AH JH IH N IY AH N
+cartier K AA R T IY ER
+cartilage K AA R T AH L AH JH
+cartilage(2) K AA R T AH L IH JH
+carting K AA R T IH NG
+cartland K AA R T L AH N D
+cartledge K AA R T L EH JH
+cartlidge K AA R T L IH JH
+cartmell K AA R T M EY L
+cartmill K AA R T M IH L
+cartner K AA R T N ER
+carton K AA R T AH N
+cartoneros K AA R T OW N EH R OW S
+cartons K AA R T AH N Z
+cartoon K AA R T UW N
+cartooning K AA R T UW N IH NG
+cartoonist K AA R T UW N AH S T
+cartoonists K AA R T UW N IH S T S
+cartoonists(2) K AA R T UW N IH S S
+cartoons K AA R T UW N Z
+cartrette K AA R T R EH T
+cartridge K AA R T R AH JH
+cartridge(2) K AA R T R IH JH
+cartridges K AA R T R AH JH AH Z
+carts K AA R T S
+cartusciello K AA R T UW S IY EH L OW
+cartwheel K AA R T W IY L
+cartwheels K AA R T W IY L Z
+cartwright K AA R T R AY T
+carty K AA R T IY
+caruana K AA R UW AE N AH
+carucci K AA R UW CH IY
+caruso K ER UW S OW
+carusone K AA R UW S OW N IY
+caruth K AE R UW TH
+caruthers K ER AH DH ER Z
+carvajal K AA R V AA Y AE L
+carvalho K AA R V AA L HH OW
+carve K AA R V
+carved K AA R V D
+carvel K AA R V EH L
+carvell K AA R V EY L
+carvell(2) K AA R V EH L
+carver K AA R V ER
+carver's K AA R V ER Z
+carvers K AA R V ER Z
+carves K AA R V Z
+carvey K AA R V IY
+carville K AA R V IH L
+carville's K AA R V IH L Z
+carvin K AA R V IH N
+carving K AA R V IH NG
+carvings K AA R V IH NG Z
+carwell K AA R W EH L
+carwile K AA R W AY L
+cary K EH R IY
+caryl K EH R AH L
+caryn K AA R IH N
+cas K AE S
+casa K AA S AH
+casablanca K AE S AH B L AE NG K AH
+casad K AE S AH D
+casada K AA S AA D AH
+casado K AA S AA D OW
+casados K AA S AA D OW Z
+casady K AH S AA D IY
+casagrande K AA S AA G R AE N D IY
+casal K AA S AA L
+casale K AA S AA L IY
+casali K AA S AA L IY
+casalino K AA S AA L IY N OW
+casals K AA S AA L Z
+casals(2) K AH S AA L Z
+casamento K AE S AH M EH N T OW
+casanova K AE S AH N OW V AH
+casares K AA S AA R EH S
+casarez K AA S AA R EH Z
+casas K AA S AH Z
+casassa K AA S AA S AH
+casaus K AE S AO Z
+casavant K AE S AH V AH N T
+casazza K AA S AA T S AH
+casbah K AE S B AH
+cascade K AE S K EY D
+cascade's K AE S K EY D Z
+cascaded K AE S K EY D IH D
+cascades K AE S K EY D Z
+cascades' K AE S K EY D Z
+cascading K AE S K EY D IH NG
+casciano K AA S CH IY AA N OW
+casciato K AA S CH AA T OW
+cascio K AE S IY OW
+casco K AE S K OW
+cascone K AA S K OW N IY
+casdorph K AE S D ER F
+case K EY S
+case's K EY S IH Z
+casebeer K AE S IH B IH R
+casebeer(2) K EY S B IH R
+casebier K AE S IH B IY ER
+casebolt K EY S B OW L T
+casein K EY S IY N
+casella K AH S EH L AH
+caselli K AH S EH L IY
+caseload K EY S L OW D
+caseloads K AE S AH L OW D Z
+casera K AH S EH R AH
+caserta K AA S EH R T AH
+cases K EY S AH Z
+cases(2) K EY S IH Z
+casesa K AH S EH S AH
+casework K EY S W ER K
+caseworker K EY S W ER K ER
+caseworkers K EY S W ER K ER Z
+casey K EY S IY
+casey's K EY S IY Z
+caseze K AH S IY Z IY
+caseze's K AH S IY Z IY Z
+casgrain K AE S G R EY N
+cash K AE SH
+cashatt K AE SH AH T
+cashdollar K AE SH D AA L ER
+cashed K AE SH T
+cashen K AE SH AH N
+casher K AE SH ER
+cashes K AE SH IH Z
+cashew K AE SH UW
+cashews K AE SH UW Z
+cashflow K AE SH F L OW
+cashflows K AE SH F L OW Z
+cashier K AE SH IH R
+cashier's K AE SH IH R Z
+cashiered K AE SH IH R D
+cashiers K AE SH IH R Z
+cashin K AE SH IH N
+cashing K AE SH IH NG
+cashion K AA SH IY N
+cashless K AE SH L AH S
+cashman K AE SH M AH N
+cashmere K AE ZH M IH R
+cashmeres K AE ZH M IH R Z
+cashmore K AE SH M AO R
+cashon K AE SH AH N
+cashway K AE SH W EY
+cashways K AE SH W EY Z
+cashwell K AE SH W EH L
+casiano K AA S IY AA N OW
+casias K AA S IY AH Z
+casillas K AA S IH L AH Z
+casillo K AH S IH L OW
+casimir K AE S IH M IY R
+casimiro K AA S IY M IH R OW
+casing K EY S IH NG
+casings K EY S IH NG Z
+casino K AH S IY N OW
+casino's K AH S IY N OW Z
+casinos K AH S IY N OW Z
+casio K AE S IY OW
+cask K AE S K
+casket K AE S K AH T
+caskets K AE S K AH T S
+caskey K AE S K IY
+casks K AE S K S
+casler K AE S AH L ER
+casler(2) K AE S L ER
+caslin K AE S L IH N
+casner K AE S N ER
+caso K AA S OW
+casola K AA S OW L AH
+cason K AE S AH N
+caspar K AE S P ER
+caspar(2) K AE S P AA R
+casper K AE S P ER
+caspers K AE S P ER Z
+caspersen K AE S P ER S AH N
+casperson K AE S P ER S AH N
+caspian K AE S P IY AH N
+cass K AE S
+cassada K AA S AA D AH
+cassaday K AE S AH D EY
+cassady K AE S AH D IY
+cassandra K AH S AE N D R AH
+cassandras K AH S AE N D R AH S
+cassani K AA S AA N IY
+cassano K AA S AA N OW
+cassar K AE S ER
+cassara K AA S AA R AH
+cassarino K AA S AA R IY N OW
+cassaro K AA S AA R OW
+cassata K AA S AA T AH
+cassatt K AE S AH T
+cassavetes K AE S AH V IY T IY Z
+casseb K AE S AH B
+cassedy K AE S IH D IY
+cassel K AE S AH L
+casselberry K AE S AH L B EH R IY
+cassell K AE S AH L
+cassella K AA S EH L AH
+cassells K AE S AH L Z
+casselman K AE S AH L M AH N
+cassels K AE S AH L Z
+cassens K AE S AH N Z
+casserly K AE S ER L IY
+casserole K AE S ER OW L
+cassese K AA S EY Z IY
+cassetta K AA S EH T AH
+cassette K AH S EH T
+cassettes K AH S EH T S
+cassetty K AE S IH T IY
+cassia K AE SH IY AH
+cassiday K AE S IY D EY
+cassidy K AE S IH D IY
+cassidy's K AE S IH D IY Z
+cassie K AE S IY
+cassin K AE S IH N
+cassinelli K AA S IY N EH L IY
+cassini K AH S IY N IY
+cassini's K AH S IY N IY Z
+cassino K AH S IY N OW
+cassis K AE S IH S
+cassity K AE S IH T IY
+casso K AE S OW
+cassock K AE S AH K
+casson K AE S AH N
+cassone K AA S OW N IY
+cassoni K AH S OW N IY
+cassoni's K AH S OW N IY Z
+cassowary K AE S AH W EH R IY
+casstevens K AA S T EY V EY AH N Z
+cast K AE S T
+casta K AE S T AH
+castagna K AA S T AA G N AH
+castagno K AA S T AA G N OW
+castagnola K AA S T AA G N OW L AH
+castaldi K AA S T AA L D IY
+castaldo K AA S T AA L D OW
+castaneda K AA S T AA N EH D AH
+castano K AA S T AA N OW
+castanon K AE S T AH N AA N
+castaway K AE S T AH W EY
+castaways K AE S T AH W EY Z
+caste K AE S T
+casteel K EY S T IY L
+casteen K AH S T IY N
+castel K EY S T AH L
+castell K EY S T AH L
+castellana K AA S T EH L AE N AH
+castellani K AA S T EH L AA N IY
+castellano K AA S T EH L AA N OW
+castellanos K AA S T EY L AA N OW Z
+castellaw K EY S T IH L AO
+castelli K AA S T EH L IY
+castello K AH S T EH L OW
+castellon K EY S T IH L AA N
+castellucci K AA S T EH L UW CH IY
+castelluccio K AA S T EH L UW CH IY OW
+castellvi K AH S T EH L V IY
+castelo K AA S T EH L OW
+casten K AE S T AH N
+caster K AE S T ER
+casterline K AE S T ER L AY N
+casters K AE S T ER Z
+castes K AE S T S
+castigate K AE S T AH G EY T
+castigated K AE S T AH G EY T IH D
+castigates K AE S T AH G EY T S
+castigating K AE S T AH G EY T IH NG
+castiglia K AA S T IY G L IY AH
+castiglione K AA S T IY G L IY OW N IY
+castilla K AA S T IH L AH
+castille K AE S T IH L
+castilleja K AA S T IY L EY Y AH
+castillo K AE S T IY OW
+castillo(2) K AE S T IH L OW
+castillon K AE S T IH L AA N
+castine K AA S T IY N IY
+casting K AE S T IH NG
+castings K AE S T IH NG Z
+castio K AE S T IY OW
+castio(2) K AE S T Y OW
+castle K AE S AH L
+castle's K AE S AH L Z
+castleberry K AE S AH L B EH R IY
+castleman K AE S AH L M AH N
+castles K AE S AH L Z
+castner K AE S T N ER
+casto K AE S T OW
+castoff K AE S T AO F
+castoffs K AE S T AO F S
+caston K AE S T AH N
+castonguay K AH S T AA NG G EY
+castor K AE S T ER
+castorena K AA S T AO R N AH
+castoro K AA S T AO R OW
+castpart K AE S T P AA R T
+castparts K AE S T P AA R T S
+castrate K AE S T R EY T
+castrated K AE S T R EY T IH D
+castrates K AE S T R EY T S
+castrating K AE S T R EY T IH NG
+castration K AE S T R EY SH AH N
+castrations K AE S T R EY SH AH N Z
+castrejon K AE S T R IH JH AA N
+castrillon K AH S T R IH L Y AH N
+castro K AE S T R OW
+castro's K AE S T R OW Z
+castrol K AE S T R AA L
+castronova K AE S T R OW N OW V AH
+castronovo K AE S T R OW N OW V OW
+castrucci K AH S T R UW CH IY
+castruita K AA S T R UW T AH
+casts K AE S T S
+casual K AE ZH AH W AH L
+casual(2) K AE ZH W AH L
+casually K AE ZH AH W AH L IY
+casually(2) K AE ZH W AH L IY
+casualness K AE ZH AH W AH L N EH S
+casualness(2) K AE ZH W AH L N EH S
+casuals K AE ZH AH W AH L Z
+casualties K AE ZH AH W AH L T IY Z
+casualties(2) K AE ZH W AH L T IY Z
+casualties(3) K AE ZH AH L T IY Z
+casualty K AE ZH AH W AH L T IY
+casualty(2) K AE ZH W AH L T IY
+casualty(3) K AE ZH AH L T IY
+caswell K AE Z W EH L
+cat K AE T
+cat's K AE T S
+cat-2 K AE T T UW
+cat-3 K AE T TH R IY
+cat-4 K AE T F AO R
+cat-o-nine-tails K AE T OW N AY N T EY L Z
+cataclysm K AE T AH K L IH S AH M
+cataclysmic K AE T AH K L IH Z M IH K
+catacomb K AE T AH K OW M
+catacombs K AE T AH K OW M Z
+catacosinos K AH T AE K AH S IY N OW S
+catacosinos's K AH T AE K AH S IY N AH S IH Z
+catain K AE T IH N
+catain(2) K AH T EY N
+catalan K AE T AH L AH N
+catalano K AA T AA L AA N OW
+catalanotto K AA T AA L AA N OW T OW
+cataldi K AA T AA L D IY
+cataldo K AA T AA L D OW
+catalfamo K AA T AA L F AA M OW
+catalina K AE T AH L IY N AH
+catalog K AE T AH L AO G
+cataloged K AE T AH L AO G D
+cataloger K AE T AH L AO G ER
+catalogers K AE T AH L AO G ER Z
+cataloging K AE T AH L AA G IH NG
+catalogs K AE T AH L AA G Z
+catalogs(2) K AE T AH L AO G Z
+catalogue K AE T AH L AO G
+catalogued K AE T AH L AO G D
+catalogues K AE T AH L AO G Z
+cataloguing K AE T AH L AO G IH NG
+catalonia K AE T AH L OW N Y AH
+catalonian K AE T AH L OW N Y AH N
+catalyst K AE T AH L AH S T
+catalyst's K AE T AH L IH S T S
+catalyst(2) K AE T AH L IH S T
+catalysts K AE T AH L AH S T S
+catalysts(2) K AE T AH L IH S T S
+catalysts(3) K AE T AH L IH S S
+catalytic K AE T AH L IH T IH K
+catalyze K AE T AH L AY Z
+catalyzed K AE T AH L AY Z D
+catamaran K AE T AH M ER AE N
+catamarans K AH T AE M ER AH N Z
+catamount K AE T AH M AW N T
+catanese K AA T AA N EY Z IY
+catania K AH T EY N Y AH
+catano K AA T AA N OW
+catanzarite K AH T AE N Z ER AY T
+catanzaro K AA T AA N Z AA R OW
+catapano K AA T AA P AA N OW
+catapult K AE T AH P AH L T
+catapulted K AE T AH P AH L T IH D
+catapulting K AE T AH P AH L T IH NG
+catapults K AE T AH P AH L T S
+cataract K AE T ER AE K T S
+cataracts K AE T ER AE K T S
+catastrophe K AH T AE S T R AH F IY
+catastrophes K AH T AE S T R AH F IY Z
+catastrophic K AE T AH S T R AA F IH K
+catatonic K AE T AH T AA N IH K
+catawba K AH T AO B AH
+catbird K AE T B ER D
+catcall K AE T K AO L
+catcalls K AE T K AO L Z
+catch K AE CH
+catchacan K AE CH AH K AA N
+catchall K AE CH AO L
+catcher K AE CH ER
+catcher's K AE CH ER Z
+catchers K AE CH ER Z
+catches K AE CH AH Z
+catches(2) K AE CH IH Z
+catching K AE CH IH NG
+catchings K AE CH IH NG Z
+catchment K AE CH M AH N T
+catchup K AE CH AH P
+catchword K AE CH W ER D
+catchy K AE CH IY
+cate K EY T
+catechism K AE T AH K IH Z AH M
+categorical K AE T AH G AA R IH K AH L
+categorical(2) K AE T AH G AO R IH K AH L
+categorically K AE T AH G AA R IH K L IY
+categorically(2) K AE T AH G AO R IH K L IY
+categories K AE T AH G AO R IY Z
+categorization K AE T AH G ER IH Z EY SH AH N
+categorize K AE T AH G ER AY Z
+categorized K AE T AH G ER AY Z D
+categorizes K AE T AH G ER AY Z IH Z
+categorizing K AE T AH G ER AY Z IH NG
+category K AE T AH G AO R IY
+catelli K AH T EH L IY
+catena K AH T IY N AH
+cater K EY T ER
+catered K EY T ER D
+caterer K EY T ER ER
+caterers K EY T ER ER Z
+catering K EY T ER IH NG
+caterino K AA T ER IY N OW
+caterpillar K AE T AH P IH L ER
+caterpillar's K AE T ER P IH L ER Z
+caterpillar(2) K AE T ER P IH L ER
+caterpillars K AE T AH P IH L ER Z
+caterpiller K AE T AH P IH L ER
+caterpiller's K AE T AH P IH L ER Z
+caterpiller's(2) K AE T ER P IH L ER Z
+caterpiller(2) K AE T ER P IH L ER
+caters K EY T ER Z
+caterwaul K AE T ER W AA L
+cates K EY T S
+catfish K AE T F IH SH
+catharine K AE TH R IH N
+catharines K AE TH R IH N Z
+catharines(2) K AE TH ER IH N Z
+catharsis K AH TH AA R S AH S
+cathartic K AH TH AA R T IH K
+cathay K AE TH EY
+cathcart K AE TH K AA R T
+cathedral K AH TH IY D R AH L
+cathedrals K AH TH IY D R AH L Z
+cathell K AE TH AH L
+cather K AE DH ER
+cather's K AE DH ER Z
+catherina K AA TH ER IY N AH
+catherine K AE TH ER AH N
+catherine's K AE TH R IH N Z
+catherine(2) K AE TH ER IH N
+catherine(3) K AE TH R IH N
+catherines K AE TH R IH N Z
+catherman K AE DH ER M AH N
+cathers K AE DH ER Z
+catherwood K AE DH ER W UH D
+catheter K AE TH AH T ER
+catheters K AE TH AH T ER Z
+cathey K AE DH IY
+cathie K AE TH IY
+cathleen K AE TH L IY N
+cathmor K AE TH AH M ER
+cathode K AE TH OW D
+cathodes K AE TH OW D Z
+catholic K AE TH L IH K
+catholicism K AH TH AO L AH S IH Z AH M
+catholics K AE TH L IH K S
+cathy K AE TH IY
+cathy's K AE TH IY Z
+catija K AH T IY JH AH
+catino K AA T IY N OW
+catkins K AE T K AH N Z
+catledge K AE T L IH JH
+catlett K AE T L IH T
+catlike K AE T L AY K
+catlin K AE T L IH N
+catnap K AE T N AE P
+catnip K AE T N IH P
+cato K EY T OW
+catoe K AE T OW
+catolica K AH T OW L IH K AH
+caton K AE T AH N
+catone K AH T OW N
+catrambone K AE T R AE M B OW N
+catrett K AE T R IH T
+catron K AE T R AH N
+cats K AE T S
+catskill K AE T S K IH L
+catskills K AE T S K IH L Z
+catsup K EH CH AH P
+catt K AE T
+cattanach K AE T AH N AE CH
+cattaneo K AA T AA N IY OW
+cattani K AA T AA N IY
+cattell K AH T EH L
+catterall K AE T ER AO L
+catterson K AE T ER S AH N
+catterton K AE T ER T AH N
+cattle K AE T AH L
+cattlemen K AE T AH L M AH N
+cattlemen's K AE T AH L M AH N Z
+cattlemen(2) K AE T AH L M IH N
+catto K AE T OW
+cattolica K AH T OW L IH K AH
+catton K AE T AH N
+catty K AE T IY
+catwalk K AE T W AA K
+catwalk(2) K AE T W AO K
+catwoman K AE T W UH M AH N
+cau K AW
+cau(2) K OW
+cauble K AO B AH L
+caucasian K AO K EY ZH AH N
+caucasians K AO K EY ZH AH N Z
+caucasus K AO K AH S AH S
+caucus K AO K AH S
+caucus's K AO K AH S IH Z
+caucus(2) K AA K AH S
+caucuses K AO K AH S IH Z
+caudal K AA D AH L
+caudal(2) K AO D AH L
+caudell K OW D EH L
+caudill K AO D AH L
+caudillo K AO D IH L OW
+caudle K AO D AH L
+cauffman K AO F M AH N
+caufield K OW F IY L D
+caughey K AO IY
+caughlin K AO L IH N
+caughman K AO M AH N
+caughron K AO R AH N
+caught K AA T
+caught(2) K AO T
+caul K AA L
+caul(2) K AO L
+caulder K AO L D ER
+cauldron K AA L D R AH N
+cauldron(2) K AO L D R AH N
+cauley K AO L IY
+caulfield K AO L F IY L D
+cauliflower K AA L AH F L AW ER
+caulk K AA K
+caulk(2) K AO K
+caulking K AO K IH NG
+caulkins K AO L K IH N Z
+causal K AO Z AH L
+causalities K AO Z AE L IH T IY Z
+causality K AO Z AA L IH T IY
+causation K AO Z EY SH AH N
+causative K AA Z AH T IH V
+causative(2) K AO Z AH T IH V
+causby K AO Z B IY
+cause K AA Z
+cause(2) K AO Z
+caused K AA Z D
+caused(2) K AO Z D
+causer K AO Z ER
+causes K AA Z AH Z
+causes(2) K AO Z IH Z
+causeway K AA Z W EY
+causeway(2) K AO Z W EY
+causeways K AO Z W EY Z
+causey K AO Z IY
+causing K AA Z IH NG
+causing(2) K AO Z IH NG
+caustic K AA S T IH K
+caustic(2) K AO S T IH K
+cauterization K AO T ER IH Z EY SH AH N
+cauterize K AO T ER AY Z
+cauterized K AO T ER AY Z D
+cauterizes K AO T ER AY Z IH Z
+cauterizing K AO T ER AY Z IH NG
+cauthen K AO TH AH N
+cauthon K AO TH AH N
+cauthorn K AO TH ER N
+caution K AA SH AH N
+caution(2) K AO SH AH N
+cautionary K AO SH AH N EH R IY
+cautioned K AA SH AH N D
+cautioned(2) K AO SH AH N D
+cautioning K AO SH AH N IH NG
+cautions K AO SH AH N Z
+cautious K AO SH AH S
+cautiously K AO SH AH S L IY
+cautiousness K AO SH AH S N AH S
+cava K AA V AH
+cavaco K AE V AH K OW
+cavaco(2) K AH V AA K OW
+cavagnaro K AA V AA G N AA R OW
+cavalcade K AE V AH L K EY D
+cavalier K AE V AH L IH R
+cavalier(2) K AE V AH L IY R
+cavaliere K AA V AA L IH R IY
+cavalieri K AA V AA L IH R IY
+cavalierly K AE V AH L IH R L IY
+cavaliers K AE V AH L IH R Z
+cavallaro K AA V AA L AA R OW
+cavallero K AA V AA L EH R OW
+cavalli K AH V AE L IY
+cavalli-sfor K AH V AE L IY S F AO R
+cavallo K AH V AE L OW
+cavalry K AE V AH L R IY
+cavan K EY V AH N
+cavanagh K AE V AH N AE G
+cavanagh(2) K AE V AH N AA
+cavanah K AE V AH N AH
+cavanaugh K AE V AH N AO
+cavaness K AA V AH N IH S
+cavataio K AA V AA T AA IY OW
+cavazos K AA V AA Z OW Z
+cavazos(2) K AE V AH Z OW S
+cave K EY V
+cave's K EY V Z
+caveat K EY V IY AE T
+caveats K EY V IY AE T S
+caved K EY V D
+cavell K AH V EH L
+caveman K EY V M AE N
+caven K EY V AH N
+cavenaugh K AE V IH N AO
+cavender K AH V EH N D ER
+cavendish K AE V AH N D IH SH
+caver K EY V ER
+caverly K EY V ER L IY
+cavern K AE V ER N
+cavernous K AE V ER N AH S
+caverns K AE V ER N Z
+cavers K EY V ER Z
+caves K EY V Z
+cavett K AE V IH T
+cavey K EY V IY
+caviar K AE V IY AA R
+cavin K AE V IH N
+caviness K EY V IY N IH S
+caving K EY V IH NG
+cavins K AE V IH N Z
+cavities K AE V IH T IY Z
+cavitt K AE V IH T
+cavity K AE V AH T IY
+cavness K AE V N IH S
+cavort K AH V AO R T
+cavorting K AH V AO R T IH NG
+caw K AO
+cawley K AO L IY
+cawood K AA W UH D
+cawsl K AO S AH L
+cawthon K AO TH AH N
+cawthorn K AO TH ER N
+cawthorne K AO TH ER N
+caxton K AE K S T AH N
+cay K EY
+caya K EY AH
+cayce K EY S
+cayenne K AY EH N
+cayenne(2) K EY EH N
+cayer K EY ER
+cayes K EY Z
+caylin K EY L IH N
+caylor K EY L ER
+cayman K EY M AH N
+caymans K EY M AH N Z
+cayne K EY N
+cayson K EY S AH N
+cayton K EY T AH N
+cayuses K AY UW S AH Z
+caywood K EY W UH D
+cazares K AA Z AA R EH S
+cazenove K AE Z AH N OW V
+cazier K EY Z IY ER
+cbs S IY B IY EH S
+cc S IY S IY
+ccs S IY S IY EH S
+ccs(2) S IY S IY Z
+cd S IY D IY
+cdc S IY D IY S IY
+cdebaca S IY D IH B AA K AH
+cdrom S IY D IY R AA M
+cdroms S IY D IY R AA M Z
+cds S IY D IY Z
+cea S IY IY EY
+cea(2) S IY AH
+ceara S IY R AH
+cearley S ER L IY
+ceasar S AH S AA R
+cease S IY S
+cease-fire S IY S F AY ER
+ceased S IY S T
+ceasefire S IY S F AY ER
+ceasefires S IY S F AY ER Z
+ceaseless S IY S L IH S
+ceaselessly S IY Z L AH S L IY
+ceaser S IY S ER
+ceases S IY S IH Z
+ceasing S IY S IH NG
+ceaucescu CH AW CH EH S K Y UW
+ceausescu CH AW CH EH S K Y UW
+ceausescu's CH AW CH EH S K Y UW Z
+ceballos S EY B AA L OW Z
+cebu S IY B UW
+cebu's S IY B UW Z
+cebula CH EH B UW L AH
+cebulski CH IH B AH L S K IY
+cecala CH EH K AA L AH
+ceccarelli CH EH K ER EH L IY
+cecchi S EH K IY
+cecchini CH EH K IY N IY
+cecconi CH EH K OW N IY
+cece S IY S
+cecelia S IH S IY L Y AH
+cecere CH EH CH EH R IY
+cech S EH K
+ceci S EH S IY
+cecil S IY S AH L
+cecil's S IY S AH L Z
+cecile S IH S IY L
+cecilia S IH S IY L Y AH
+cecin S EH S IH N
+ceco S IY K OW
+cecola S EH K OW L AH
+cecos S IY K OW S
+cedar S IY D ER
+cedar-rapids S IY D ER R AE P IH D Z
+cedar-rapids(2) S IY D ER AE P IH D Z
+cedars S IY D ER Z
+cede S IY D
+ceded S IY D AH D
+ceded(2) S IY D IH D
+cedeno CH EH D EH N OW
+ceder S IY D ER
+cederberg S IY D ER B ER G
+cedergren S IY D ER G R EH N
+cederholm S IY D ER HH OW M
+cederquist S EH D ER K W IH S T
+cederquist(2) S IY D ER K W IH S T
+cedes S IY D Z
+cedillo CH EH D IH L OW
+ceding S IY D IH NG
+cedras S EY D R AA S
+cedras' S EY D R AA S
+cedras'(2) S EY D R AH S
+cedras's S EY D R AA S IH S
+cedras's(2) S EY D R AH S IH S
+cedras(2) S EY D R AH S
+cedric S EH D R IH K
+cedric(2) S IY D R IH K
+cedrone S EY D R OW N EY
+cees S IY Z
+cefalo CH EH F AA L OW
+cefalu CH EH F AA L UW
+cegielski CH IH G IY L S K IY
+ceiling S IY L IH NG
+ceilings S IY L IH NG Z
+ceja S EY Y AH
+cejka CH EY K AH
+cel S EH L
+cel(2) S IY IY EH L
+cela S EH L AH
+celadon S EH L AH D AA N
+celandine S EH L AH N D AY N
+celanese S EH L AH N IY Z
+celani CH EH L AA N IY
+celano CH EH L AA N OW
+celaya S EY L EY AH
+cele S IY L
+celeb S AH L EH B
+celebate S EH L AH B AH T
+celebrant S EH L AH B R AH N T
+celebrants S EH L AH B R AH N T S
+celebrate S EH L AH B R EY T
+celebrated S EH L AH B R EY T AH D
+celebrated(2) S EH L AH B R EY T IH D
+celebrates S EH L AH B R EY T S
+celebrating S EH L AH B R EY T IH NG
+celebration S EH L AH B R EY SH AH N
+celebrations S EH L AH B R EY SH AH N Z
+celebratory S AH L EH B R AH T AO R IY
+celebre S EH L AH B R AH
+celebrities S AH L EH B R IH T IY Z
+celebrity S AH L EH B R IH T IY
+celebrity's S AH L EH B R IH T IY Z
+celebs S AH L EH B Z
+celena CH EH L EH N AH
+celene CH EH L IY N
+celentano CH EH L EH N T AA N OW
+celerity S AH L EH R AH T IY
+celeron S EH L ER AA N
+celery S EH L ER IY
+celesta S IH L EH S T AH
+celeste S AH L EH S T
+celestial S AH L EH S CH AH L
+celestin S EH L IH S T IH N
+celestina CH EH L EH S T IY N AH
+celestine CH EH L EH S T IY N IY
+celestino CH EH L EH S T IY N OW
+celestory S AH L EH S T ER IY
+celia S IY L Y AH
+celibacy S EH L AH B AH S IY
+celibate S EH L IH B AH T
+celica S EH L IH K AH
+celie S EH L IY
+celimene S EH L IH M IY N
+celina S AH L IY N AH
+celinda CH EH L IY N D AH
+celine S AH L IY N
+celio S IY L IY OW
+celis S EH L IH S
+cell S EH L
+cell's S EH L Z
+cella S EH L AH
+cellar S EH L ER
+cellars S EH L ER Z
+celled S EH L D
+celli CH EH L IY
+cellini CH EH L IY N IY
+cellio CH EH L IY OW
+cellist CH EH L AH S T
+cellmark S EH L M AA R K
+cellmark's S EH L M AA R K S
+cellnet S EH L N EH T
+cello CH EH L OW
+cellophane S EH L AH F EY N
+cellphone S EH L F OW N
+cellpro S EH L P R OW
+cells S EH L Z
+cells' S EH L Z
+cellstar S EH L S T AA R
+cellucci CH EH L UW CH IY
+cellular S EH L Y AH L ER
+cellular's S EH L Y AH L ER Z
+celluloid S EH L AH L OY D
+cellulosa S EH L UW L OW S AH
+cellulose S EH L Y AH L OW S
+celmer S EH L M ER
+celnik S EH L N IH K
+celo S EH L OW
+celo(2) S IY L OW
+celo(3) S IY IY EH L OW
+celona CH EH L OW N AH
+celosia CH EH L OW S IY AH
+cels S EH L Z
+celsius S EH L S IY AH S
+celso S EH L S OW
+celt S EH L T
+celt(2) K EH L T
+celtic S EH L T IH K
+celtic(2) K EH L T IH K
+celtics S EH L T IH K S
+celtics' S EH L T IH K S
+celts S EH L T S
+celts(2) K EH L T S
+cement S AH M EH N T
+cement(2) S IH M EH N T
+cemented S AH M EH N T AH D
+cemented(2) S IH M EH N T IH D
+cementing S IH M EH N T IH NG
+cementos S EH M EH N T OW S
+cemeteries S EH M AH T EH R IY Z
+cemetery S EH M AH T EH R IY
+cemetery(2) S EH M IH T EH R IY
+cemex K EH M EH K S
+cemp S EH M P
+cencall S EH N S EH L
+cenci CH EH N CH IY
+cencor S EH N K AO R
+cendejas S EY N D EY Y AA Z
+cenergy S EH N ER JH IY
+ceniceros S EY N IY S EH R OW Z
+cenith S EH N IH TH
+cenith's S EH N IH TH S
+cenozoic S IY N AH Z OW IH K
+censer S EH N S ER
+censor S EH N S ER
+censored S EH N S ER D
+censoring S EH N S ER IH NG
+censors S EH N S ER Z
+censorship S EH N S ER SH IH P
+censure S EH N SH ER
+censured S EH N SH ER D
+census S EH N S AH S
+censuses S EH N S AH S IH Z
+cent S EH N T
+centanni CH EH N T AA N IY
+centanni(2) S EH N T AA N IY
+centaur S EH N T AO R
+centaur's S EH N T AO R Z
+centauri S EH N T AA R IY
+centaurs S EH N T AO R Z
+centavos S EH N T AA V OW S
+centel S EH N T EH L
+centel's S EH N T EH L Z
+centenarian S EH N T AH N EH R IY AH N
+centenarians S EH N T AH N EH R IY AH N Z
+centenary S EH N T AH N EH R IY
+centennial S EH N T EH N IY AH L
+centennial's S EH N T EH N IY AH L Z
+centeno CH EH N T EH N OW
+centeno(2) S EH N T EH N OW
+center S EH N T ER
+center's S EH N T ER Z
+center's(2) S EH N ER Z
+center(2) S EH N ER
+centerbanc S EH N T ER B AE NG K
+centerbank S EH N T ER B AE NG K
+centered S EH N T ER D
+centerfielder S EH N T ER F IY L D ER
+centerfold S EH N T ER F OW L D
+centering S EH N T ER IH NG
+centerior S EH N T IH R IY ER
+centerpiece S EH N T ER P IY S
+centerre S EH N T ER
+centerre's S EH N T ER Z
+centers S EH N T ER Z
+centers' S EH N T ER Z
+centers'(2) S EH N ER Z
+centers(2) S EH N ER Z
+centerville S EH N T ER V IH L
+centex S EH N T EH K S
+centigrade S EH N T AH G R EY D
+centigram S EH N T AH G R AE M
+centime S EH N T AY M
+centimes S EH N T AY M Z
+centimeter S EH N T AH M IY T ER
+centimeters S EH N T AH M IY T ER Z
+centipede S EH N T IH P IY D
+centner S EH N T N ER
+centocor S EH N T AH K AO R
+centocor's S EH N T AH K AO R Z
+centofanti CH EH N T OW F AA N T IY
+centola CH EH N T OW L AH
+centoxin S EH N T AA K S IH N
+central S EH N T R AH L
+central's S EH N T R AH L Z
+centrale S EH N T R AA L
+centralia S EH N T R EY L IY AH
+centralism S EH N T R AH L IH Z AH M
+centralists S EH N T R AH L IH S T S
+centralists(2) S EH N T R AH L IH S S
+centralists(3) S EH N T R AH L IH S
+centrality S EH N T AE L IH T IY
+centralization S EH N T R AH L IH Z EY SH AH N
+centralize S EH N T R AH L AY Z
+centralized S EH N T R AH L AY Z D
+centralizing S EH N T R AH L AY Z IH NG
+centrally S EH N T R AH L IY
+centram S EH N T R AE M
+centre S EH N T ER
+centrella S EH N T R EH L AH
+centres S EH N T ER Z
+centrex S EH N T R AH K S
+centrifugal S EH N T R IH F Y IH G AH L
+centrifuge S EH N T R AH F Y UW JH
+centrifuges S EH N T R AH F Y UW JH IH Z
+centrist S EH N T R IH S T
+centrists S EH N T R IH S T S
+centrists(2) S EH N T R IH S S
+centrists(3) S EH N T R IH S
+centro S EH N T R OW
+centromin S EH N T R AH M IH N
+centronics S EH N T R AA N IH K S
+centrust S EH N T R AH S T
+centrust's S EH N T R AH S T S
+cents S EH N T S
+cents(2) S EH N S
+centum K EH N T AH M
+centuri S EH N T UH R IY
+centuries S EH N CH ER IY Z
+centurion S EH N T UH R IY AH N
+century S EH N CH ER IY
+century's S EH N CH ER IY Z
+cenvill S EH N V IH L
+cep S EH P
+cepeda S EY P EY D AH
+cepero S EY P EH R OW
+cephalon S EH F AH L AA N
+cephalopod S EH F AH L AH P AA D
+cephalosporin S EH F AH L AO S P ER IH N
+cephas S EH F AH Z
+cephus S EH F AH S
+cera S EH R AH
+ceraceous S ER EY SH AH S
+ceradyne S EH R AH D AY N
+cerami CH ER AA M IY
+ceramic S ER AE M IH K
+ceramics S ER AE M IH K S
+cerankosky S EH R AH NG K AO S K IY
+cerasoli CH ER AA S OW L IY
+ceravolo CH ER AA V OW L OW
+cerbone CH ER B OW N
+cercone CH ER K OW N IY
+cerda CH EH R D AH
+cereal S IH R IY AH L
+cereals S IH R IY AH L Z
+cerebral S EH R AH B R AH L
+cerebral(2) S ER IY B R AH L
+cerebrally S ER IY B R AH L IY
+ceredase S EH R AH D EY Z
+cereghino CH ER EH G IY N OW
+cerelia CH ER EH L IY AH
+ceremonial S EH R AH M OW N IY AH L
+ceremonies S EH R AH M OW N IY Z
+ceremony S EH R AH M OW N IY
+cereno S ER EY N OW
+ceres S IH R IY Z
+cerezo S EH R EY Z OW
+cerezo(2) S ER EY Z OW
+cerf S ER F
+ceridian S ER IH D IY AH N
+cerino CH ER IY N OW
+cerio CH EH R IY OW
+cerise S ER IY S
+cermak CH ER M AH K
+cern S ER N
+cerna CH EH R N AH
+cerney S ER N IY
+cerniglia CH ER N IY G L IY AH
+cernuda S ER N UW D AH
+cernuda's S ER N UW D AH Z
+cerny S ER N IY
+cerone CH ER OW N IY
+cerra S EH R AH
+cerrato CH ER AA T OW
+cerreta CH ER EH T AH
+cerrito CH ER IY T OW
+cerritos S EH R IY T OW S
+cerro S EH R OW
+cerrone CH ER OW N IY
+cerruti CH ER UW T IY
+cerruti(2) S ER UW T IY
+cerska K ER S K AH
+cerska(2) S ER S K AH
+certain S ER T AH N
+certainly S ER T AH N L IY
+certainteed S ER T AH N T IY D
+certainties S ER T AH N T IY Z
+certainty S ER T AH N T IY
+certificate S ER T IH F IH K AH T
+certificates S ER T IH F IH K AH T S
+certification S ER T AH F AH K EY SH AH N
+certifications S ER T AH F AH K EY SH AH N Z
+certified S ER T AH F AY D
+certified's S ER T AH F AY D Z
+certifies S ER T AH F AY Z
+certify S ER T AH F AY
+certifying S ER T AH F AY IH NG
+certitude S ER T AH T UW D
+certo CH EH R T OW
+certron S ER T R AA N
+cerulli CH ER UW L IY
+cerullo CH ER UW L OW
+cerus S EH R AH S
+cerutti CH ER UW T IY
+cervantes S EH R V AA N T EH S
+cervantez S EH R V AA N T EH Z
+cerveceria S ER V AH S IH R IY AH
+cervenka S EH R V EY NG K AH
+cerveny CH ER V IY N IY
+cervera CH ER V EH R AH
+cervesato S EH R V EH S AA T OW
+cerveza S ER V EY Z AH
+cerveza(2) S EH R V EY Z AH
+cervi CH EH R V IY
+cervical S ER V AH K AH L
+cervical(2) S ER V IH K AH L
+cervini CH ER V IY N IY
+cervix S ER V IH K S
+cervone CH ER V OW N IY
+ceryl S EH R AH L
+cesar S IY Z ER
+cesare CH EY Z AA R EY
+cesario CH EH S AA R IY OW
+cesaro CH EH S AA R OW
+cesarz S EY S AA R Z
+cesena CH EH S EH N AH
+cesium S IY Z IY AH M
+cespedes S EY S P EY D EH S
+cessation S EH S EY SH AH N
+cessna S EH S N AH
+cessna's S EH S N AH Z
+cessna's(2) S EH Z N AH Z
+cessna(2) S EH Z N AH
+cesspool S EH S P UW L
+cestaro CH EH S T AA R OW
+ceta S EH T AH
+ceta(2) S IY IY T IY EY
+cetacean S IH T EY SH AH N
+cetacean(2) S IY T EY SH AH N
+cetec S IY T EH K
+cetera S EH T ER AH
+cetus S IY T AH S
+cetus's S IY T AH S IH Z
+cevallos S EY V AA L OW Z
+cevaxs S EH V AE K S IH Z
+ceylon S IH L AA N
+ceylon(2) S IY L AA N
+cezanne S EH Z AE N
+cezanne's S EH Z AE N Z
+cha CH AA
+cha-chas CH AA CH AA Z
+chablis SH AH B L IY
+chabon CH EY B AH N
+chabot SH AH B OW
+chacabuco CH AE K AH B Y UW K OW
+chace CH EY S
+chachere SH AH SH IH R
+chachi CH AA CH IY
+chacin SH EY S IH N
+chacko CH AE K OW
+chacon CH AE K AH N
+chad CH AE D
+chad's CH AE D Z
+chadbourne SH AH D B UH R N
+chadd CH AE D
+chadderdon CH AH D ER D AH N
+chaddock CH AE D AH K
+chadel CH AE D AH L
+chadian CH EY D IY AH N
+chadick CH AE D IH K
+chadli CH AE D L IY
+chadron CH AE D R AH N
+chadwell CH AE D W EH L
+chadwick CH AE D W IH K
+chadwick's CH AE D W IH K S
+chae CH AY
+chaebol CH EY B AH L
+chafe CH EY F
+chafed CH EY F T
+chafee CH AE F IY
+chafee's CH EY F IY Z
+chafee's(2) CH AE F IY Z
+chafee(2) CH EY F IY
+chafes CH EY F S
+chafete CH AH F IY T
+chaff CH AE F
+chaffee CH AE F IY
+chaffin CH AE F IH N
+chaffins CH AE F IH N Z
+chaffy CH AE F IY
+chafin CH AE F IH N
+chafing CH EY F IH NG
+chagall CH AH G AA L
+chagall(2) CH AH G AE L
+chagnon CH AE G N AH N
+chagrin SH AH G R IH N
+chagrined SH AH G R IH N D
+chai CH AY
+chaidez CH AA IY D EH Z
+chaiken CH EY K AH N
+chaikin CH EY K IH N
+chaim HH AY IH M
+chain CH EY N
+chain's CH EY N Z
+chained CH EY N D
+chaining CH EY N IH NG
+chains CH EY N Z
+chains' CH EY N Z
+chainsaw CH EY N S AO
+chainsaws CH EY N S AO Z
+chair CH EH R
+chaired CH EH R D
+chaires SH EH R Z
+chairez CH AA IH R EH Z
+chairing CH EH R IH NG
+chairman CH EH R M AH N
+chairman's CH EH R M AH N Z
+chairmanship CH EH R M AH N SH IH P
+chairmanships CH EH R M AH N SH IH P S
+chairmen CH EH R M IH N
+chairpeople CH EH R P IY P AH L
+chairperson CH EH R P ER S AH N
+chairs CH EH R Z
+chairwoman CH EH R W UH M AH N
+chairwomen CH EH R W IH M EH N
+chaise SH EY Z
+chaisson CH EY S AH N
+chait CH EY T
+chajet CH AE JH AH T
+chalabi CH AH L AA B IY
+chalasani CH AE L AH S AE N IY
+chalcedony CH AE L S AH D OW N IY
+chalet SH AE L EY
+chalet(2) SH AH L EY
+chalets SH AH L EY Z
+chalets(2) SH AE L EY Z
+chalfant CH AE F AH N T
+chalfant(2) CH AE F AA N T
+chalfin CH AE L F IH N
+chalice CH AE L IH S
+chalifoux SH AE L IH F UW
+chalk CH AA K
+chalk(2) CH AO K
+chalked CH AO K T
+chalker CH AO K ER
+chalking CH AO K IH NG
+chalkley CH AE L K L IY
+chalks CH AO K S
+challender CH AH L EH N D ER
+challenge CH AE L AH N JH
+challenged CH AE L AH JH D
+challenger CH AE L AH N JH ER
+challenger's CH AE L AH N JH ER Z
+challenger(2) CH AE L IH N JH ER
+challengers CH AE L AH N JH ER Z
+challengery CH AE L AH N JH ER IY
+challenges CH AE L AH N JH IH Z
+challenging CH AE L AH N JH IH NG
+challis SH AE L IY
+chalmers CH AA M ER Z
+chalmette SH AE L M EH T
+chaloupka CH AH L UW P K AH
+chaloux SH AH L UW
+chalsty CH AE L S T IY
+chalupa CH AH L UW P AH
+cham CH AE M
+chamber CH EY M B ER
+chamber's CH EY M B ER Z
+chambered CH EY M B ER D
+chamberlain CH EY M B ER L AH N
+chamberlain's CH EY M B ER L AH N Z
+chamberlain(2) CH EY M B ER L IH N
+chamberland CH AE M B ER L AH N D
+chamberlayne CH EY M B ER L EY N
+chamberlin CH EY M B ER L IH N
+chambers CH EY M B ER Z
+chambers' CH EY M B ER Z
+chambers's CH EY M B ER Z IH Z
+chamblee CH AE M B L IY
+chambless SH AH M B L IY S
+chamblin CH AE M B L IH N
+chambliss CH AE M B L IH S
+chambon CH AE M B AH N
+chameleon CH AH M EH L IY AH N
+chameleon(2) K AH M IY L IY AH N
+chamlee CH AE M L IY
+chamlong CH AE M L AO NG
+chamness CH AE M N IH S
+chamonix CH AE M AH N IH K S
+chamonix(2) SH AE M OW N IY
+chamorro CH AH M AO R OW
+chamorro's CH AH M AO R OW Z
+chamorro(2) CH OW M AO R OW
+champ CH AE M P
+champa K AA M P AH
+champagne SH AE M P EY N
+champagnes SH AE M P EY N Z
+champaign CH AE M P EY N
+champaign-urbana CH AE M P EY N ER B AE N AH
+champeau SH AE M P OW
+champine CH AE M P AY N
+champion CH AE M P IY AH N
+champion's CH AE M P IY AH N Z
+championed CH AE M P IY AH N D
+championing CH AE M P IY AH N IH NG
+champions CH AE M P IY AH N Z
+championship CH AE M P IY AH N SH IH P
+championships CH AE M P IY AH N SH IH P S
+champlain SH AE M P L EY N
+champlin CH AE M P L IH N
+champney CH AE M P N IY
+champoux SH AE M P UW
+champs CH AE M P S
+chan CH AE N
+chan's CH AE N Z
+chana CH AE N AH
+chance CH AE N S
+chancellor CH AE N S AH L ER
+chancellor's CH AE N S AH L ER Z
+chancellor(2) CH AE N S L ER
+chancellors CH AE N S AH L ER Z
+chancery CH AE N S ER IY
+chances CH AE N S AH Z
+chances(2) CH AE N S IH Z
+chancey CH AE N S IY
+chancy CH AE N S IY
+chand CH AE N D
+chanda CH AE N D AH
+chandelier SH AE N D AH L IH R
+chandeliers SH AE N D AH L IH Z
+chandler CH AE N D L ER
+chandler's CH AE N D L ER Z
+chandley CH AE N D L IY
+chandon CH AE N D IH N
+chandon(2) SH AE N D AA N
+chandra CH AE N D R AH
+chandrika CH AA N D R IY K AH
+chandrika(2) SH AA N D R IY K AH
+chandross CH AE N D R AO S
+chanel SH AH N EH L
+chaney CH EY N IY
+chang CH AE NG
+chang-hsin CH AA NG SH IH N
+chang-ming CH AA NG M IH NG
+chang-ming(2) CH AE NG M IH NG
+changchun CH AA NG CH UH N
+change CH EY N JH
+changeable CH EY N JH AH B AH L
+changed CH EY N JH D
+changeover CH EY N JH OW V ER
+changeovers CH EY N JH OW V ER Z
+changer CH EY N JH ER
+changers CH EY N JH ER Z
+changes CH EY N JH AH Z
+changes(2) CH EY N JH IH Z
+changing CH EY N JH IH NG
+changsho CH AE NG SH OW
+chanin CH AE N IH N
+chanishiva SH AA N IH SH IY V AH
+chanley CH AE N L IY
+channel CH AE N AH L
+channel's CH AE N AH L Z
+channeled CH AE N AH L D
+channeling CH AE N AH L IH NG
+channeling(2) CH AE N L IH NG
+channell CH AE N AH L
+channell's SH AH N EH L Z
+channels CH AE N AH L Z
+channing CH AE N IH NG
+channon CH AE N AH N
+chanos CH AA N OW S
+chant CH AE N T
+chantal CH AE N T AH L
+chanted CH AE N T IH D
+chantilly SH AE N T IH L IY
+chanting CH AE N T IH NG
+chants CH AE N T S
+chanukah HH AA N AH K AH
+chany CH EY N IY
+chao CH AW
+chaos K EY AA S
+chaotic K EY AA T IH K
+chap CH AE P
+chapa CH AA P AH
+chaparral SH AE P ER AE L
+chaparro K AA P AA R OW
+chapas CH AA P AH S
+chapdelaine SH AE P D IH L EY N
+chapek CH AE P IH K
+chapel CH AE P AH L
+chapel's CH AE P AH L Z
+chapell SH AH P EH L
+chapelle SH AH P EH L
+chaperone SH AE P ER OW N
+chaperones SH AE P ER OW N Z
+chaperoning SH AE P ER OW N IH NG
+chapin SH AH P AE N
+chaplain CH AE P L AH N
+chaplains CH AE P L AH N Z
+chaplan CH AE P L AH N
+chaplin CH AE P L AH N
+chaplin's CH AE P L IH N Z
+chaplin(2) CH AE P L IH N
+chapman CH AE P M AH N
+chapman's CH AE P M AH N Z
+chapnick CH AE P N IH K
+chapoton CH AE P OW T AA N
+chapp CH AE P
+chappaquiddick CH AE P AH K W IH D IH K
+chappel CH AE P AH L
+chappelear SH AE P IH L ER
+chappell CH AE P AH L
+chappelle SH AH P EH L
+chappie CH AE P IY
+chapple CH AE P AH L
+chappuis SH AE P UW IH Z
+chaps CH AE P S
+chapter CH AE P T ER
+chapters CH AE P T ER Z
+chaput CH AE P AH T
+char CH AA R
+chara CH AA R AH
+character K EH R IH K T ER
+character's K EH R IH K T ER Z
+characteristic K EH R AH K T ER IH S T IH K
+characteristically K EH R AH K T ER IH S T IH K L IY
+characteristics K EH R AH K T ER IH S T IH K S
+characterization K EH R AH K T ER IH Z EY SH AH N
+characterizations K EH R AH K T ER IH Z EY SH AH N Z
+characterize K EH R AH K T ER AY Z
+characterized K EH R AH K T ER AY Z D
+characterizes K EH R AH K T ER AY Z AH Z
+characterizing K EH R IH K T ER AY Z IH NG
+characters K AE R IH K T ER Z
+characters' CH EH R AH K T ER Z
+characters(2) K EH R AH K T ER Z
+charade SH ER EY D
+charades SH ER EY D Z
+charalambos CH AA R AH L AA M B OW S
+charasse CH EH R AE S
+charboneau SH AA R B AH N OW
+charbonneau SH AA R B AH N OW
+charbonnet SH AA R B AH N IH T
+charbonnet(2) SH AA R B AH N EY
+charcoal CH AA R K OW L
+charcoals CH AA R K OW L Z
+chard CH AA R D
+chardonnay CH AA R D AA N EY
+chardonnays CH AA R D AA N EY Z
+charen CH AA R AH N
+charen's CH AA R AH N Z
+charest CH AA R EY IH S T
+charette SH ER EH T
+charge CH AA R JH
+chargeable CH AA R JH AH B AH L
+charged CH AA R JH D
+charger CH AA R JH ER
+chargers CH AA R JH ER Z
+charges CH AA R JH AH Z
+charges(2) CH AA R JH IH Z
+chargeurs CH AA R G Y UW R Z
+charging CH AA R JH IH NG
+chargit CH AA R JH IH T
+chargois SH AA R G W AA
+chariot CH EH R IY AH T
+chariots CH EH R IY AH T S
+charisma K ER IH Z M AH
+charismatic K EH R IH Z M AE T IH K
+charismatics K EH R IH Z M AE T IH K S
+charissa K AA R IY S AH
+charita K AA R IY T AH
+charitable CH AE R AH T AH B AH L
+charitable(2) CH EH R AH T AH B AH L
+charitably CH EH R IH T AH B L IY
+charities CH EH R AH T IY Z
+charities' CH EH R IH T IY Z
+charities(2) CH EH R IH T IY Z
+charity CH EH R IH T IY
+charity's CH EH R AH T IY Z
+charla CH AA R L AH
+charland CH AA R L AH N D
+charlatan SH AA R L AH T AH N
+charlatans SH AA R L AH T AH N Z
+charlayne SH AA R L EY N
+charle CH AA R L
+charlebois SH AA R L IH B W AA
+charleen CH AA R L IY N
+charlemagne SH AA R L AH M EY N
+charlene SH AA R L IY N
+charles CH AA R L Z
+charles' CH AA R L Z
+charles'(2) CH AA R AH L Z
+charles's CH AA R L Z IH Z
+charles(2) CH AA R AH L Z
+charleston CH AA R L S T AH N
+charleston's CH AA R L S T AH N Z
+charleston's(2) CH AA R AH L S T AH N Z
+charleston(2) CH AA R AH L S T AH N
+charlestown CH AA R L S T AW N
+charlestown(2) CH AA R AH L S T AW N
+charlesworth CH AA R AH L S W ER TH
+charlesworth(2) CH AA R AH L Z W ER TH
+charlet CH AA R L IH T
+charlevoix SH AA R L AH V W AH
+charley CH AA R L IY
+charley's CH AA R L IY Z
+charlie CH AA R L IY
+charlie's CH AA R L IY Z
+charlier CH AA R L IY ER
+charline SH AA R L IY N
+charlot CH AA R L AH T
+charlotte SH AA R L AH T
+charlotte's SH AA R L AH T S
+charlottesville SH AA R L AH T S V IH L
+charlottetown SH AA R L AH T T AW N
+charlotteville SH AA R L AH T V IH L
+charls CH AA R L Z
+charlson CH AA R L S AH N
+charlton CH AA R L T AH N
+charm CH AA R M
+charmain SH AA R M EY N
+charmaine SH AA R M EY N
+charmed CH AA R M D
+charmer CH AA R M ER
+charmers CH AA R M ER Z
+charmian CH AA R M IY AH N
+charming CH AA R M IH NG
+charmingly CH AA R M IH NG L IY
+charmion CH AA R M IY AH N
+charms CH AA R M Z
+charney CH AA R N IY
+charnley CH AA R N L IY
+charnock CH AA R N AH K
+charon K EH R AH N
+charpentier SH AA R P AH N T IH R
+charpie CH AA R P IY
+charred CH AA R D
+charren CH EH R AH N
+charrette SH AH R EH T
+charrier CH AE R IY ER
+charring CH AA R IH NG
+charron CH EH R AH N
+charron(2) K EH R AH N
+charry CH AE R IY
+chart CH AA R T
+charted CH AA R T AH D
+charted(2) CH AA R T IH D
+charter CH AA R T ER
+charter's CH AA R T ER Z
+chartered CH AA R T ER D
+charterhouse CH AA R T ER HH AW S
+chartering CH AA R T ER IH NG
+charters CH AA R T ER Z
+chartier CH AA R T IY ER
+charting CH AA R T IH NG
+chartist CH AA R T IH S T
+chartists CH AA R T IH S T S
+chartists(2) CH AA R T IH S S
+chartists(3) CH AA R T IH S
+chartrand CH AA R T R AH N D
+chartres CH AA R T R IY Z
+chartreuse SH AA R T R UW Z
+chartreuse(2) SH AA R T R UW S
+charts CH AA R T S
+chartwell CH AA R T W EH L
+charvat CH AA R V AH T
+charwoman CH AA R W UH M AH N
+charwomen CH AA R W IH M AH N
+chary CH AA R IY
+charyl CH AE R AH L
+chas CH AA R L Z
+chas(2) CH AA Z
+chase CH EY S
+chase's CH EY S IH Z
+chased CH EY S T
+chasen CH EY S AH N
+chaser CH EY S ER
+chasers CH EY S ER Z
+chases CH EY S AH Z
+chases(2) CH EY S IH Z
+chasin CH AE S IH N
+chasing CH EY S IH NG
+chaska CH AE S K AH
+chasm K AE Z AH M
+chason CH AE S AH N
+chasse CH AE S
+chassis CH AE S IY
+chastain SH AH S T EY N
+chaste CH EY S T
+chasteen CH AH S T IY N
+chasten CH EY S AH N
+chastened CH EY S AH N D
+chastise CH AE S T AY Z
+chastised CH AE S T AY Z D
+chastises CH AE S T AY Z IH Z
+chastising CH AE S T AY Z IH NG
+chastity CH AE S T AH T IY
+chat CH AE T
+chataqua SH AH T AA K W AH
+chateau SH AE T OW
+chateaux SH AH T OW
+chatfield CH AE T F IY L D
+chatham CH AE T AH M
+chatichai CH AE T IH CH AY
+chatichai's CH AE T IH K AY Z
+chatichai's(2) CH AE T IH CH AY Z
+chatihachi CH AE T IH HH AA CH IY
+chatihachi's CH AE T IH HH AA CH IY Z
+chatman CH AE T M AH N
+chatmon CH AE T M AH N
+chato CH EY T OW
+chats CH AE T S
+chatswood CH AE T S W UH D
+chatsworth CH AE T S W ER TH
+chattahoochee CH AE T AH HH UW CH IY
+chattahoochee's CH AE T AH HH UW CH IY Z
+chattanooga CH AE T AH N UW G AH
+chattanooga's CH AE T AH N UW G AH Z
+chattanuga CH AE T AH N UW G AH
+chatted CH AE T AH D
+chatted(2) CH AE T IH D
+chattel CH AE T AH L
+chatter CH AE T ER
+chattering CH AE T ER IH NG
+chatterjee CH AH T ER JH IY
+chatterton CH AE T ER T AH N
+chatterton's CH AE T ER T AH N Z
+chattin CH AE T IH N
+chatting CH AE T IH NG
+chatty CH AE T IY
+chatwal CH AE T W AO L
+chatwin CH AE T W IH N
+chatz CH AE T S
+chatz' CH AE T S
+chatz's CH AE T S IH Z
+chau SH OW
+chaucer CH AO S ER
+chaucer's CH AO S ER Z
+chaudhry CH AO D R IY
+chaudoin SH OW D OY N
+chauffeur SH OW F ER
+chauffeur's SH OW F ER Z
+chauffeured SH OW F ER D
+chauffeurs SH OW F ER Z
+chaumet CH AO M IH T
+chaunce CH AO N S
+chauncey CH AO N S IY
+chauncy CH AO N S IY
+chaus CH AW S
+chausse CH AW S
+chaussee CH AW S IY
+chautauqua SH AH T AO K W AH
+chautauquan SH AH T AO K W AH N
+chautauquans SH AH T AO K W AH N Z
+chauvin SH OW V AE N
+chauvinism SH OW V AH N IH Z AH M
+chauvinist SH OW V AH N AH S T
+chauvinistic CH OW V AH N IH S T IH K
+chauvinists SH OW V AH N AH S T S
+chavalit CH AH V AA L IH T
+chavarria CH AH V AE R IY AH
+chavers CH EY V ER Z
+chaves CH EY V Z
+chavez SH AA V EH Z
+chavez(2) CH AE V EH Z
+chavez(3) SH AH V EH Z
+chavin CH EY V IH N
+chavira K AA V IH R AH
+chavis CH AE V IH S
+chavis' CH AE V IH S
+chavis'(2) CH EY V IH S
+chavis(2) CH EY V IH S
+chavitz CH AE V IH T S
+chavous SH AH V AO S
+chaw CH AO
+chawla CH AO L AH
+chayon CH EY AH N
+chaz CH AE Z
+chazanoff CH AE Z AH N AO F
+chazen CH EY Z AH N
+chazov CH AE Z AA V
+chazz CH AE Z
+chazz(2) CH AA Z
+che CH EY
+che's CH EY Z
+chea CH IY
+cheadle CH IY D AH L
+cheane CH IY N
+cheane's CH IY N Z
+cheaney CH IY N IY
+cheap CH IY P
+cheapen CH IY P AH N
+cheapened CH IY P AH N D
+cheapening CH IY P AH N IH NG
+cheapens CH IY P AH N Z
+cheaper CH IY P ER
+cheapest CH IY P AH S T
+cheaply CH IY P L IY
+cheapness CH IY P N AH S
+cheapo CH IY P OW
+cheapskate CH IY P S K EY T
+cheat CH IY T
+cheated CH IY T AH D
+cheated(2) CH IY T IH D
+cheater CH IY T ER
+cheaters CH IY T ER Z
+cheatham CH IY T AH M
+cheating CH IY T IH NG
+cheats CH IY T S
+cheatum CH IY T AH M
+cheatwood CH IY T W UH D
+chebrikov CH EH B R IH K AA V
+checchi CH EH K IY
+chechen CH EH CH IH N
+chechen's CH EH CH IH N Z
+chechens CH EH CH IH N Z
+chechnya CH EH CH N IY AH
+chechnya's CH EH CH N IY AH Z
+chechnyan CH EH CH N IY AH N
+chechnyan's CH EH CH N IY AH N Z
+chechnyans CH EH CH N IY AH N Z
+check CH EH K
+checkbook CH EH K B UH K
+checkbooks CH EH K B UH K S
+checked CH EH K T
+checker CH EH K ER
+checkerboard CH EH K ER B AO R D
+checkerboarding CH EH K ER B AO R D IH NG
+checkerboards CH EH K ER B AO R D Z
+checkered CH EH K ER D
+checkers CH EH K ER Z
+checkerspot CH EH K ER S P AA T
+checketts CH EH K IH T S
+checking CH EH K IH NG
+checklist CH EH K L IH S T
+checklists CH EH K L IH S T S
+checkmate CH EH K M EY T
+checkmates CH EH K M EY T S
+checkoff CH EH K AO F
+checkout CH EH K AW T
+checkouts CH EH K AW T S
+checkpoint CH EH K P OY N T
+checkpoints CH EH K P OY N T S
+checks CH EH K S
+checkup CH EH K AH P
+checkups CH EH K AH P S
+cheddar CH EH D ER
+cheddars CH EH D ER Z
+chedester CH EH D IH S T ER
+chee CH IY
+cheech CH IY CH
+cheek CH IY K
+cheekbone CH IY K B OW N
+cheekbones CH IY K B OW N Z
+cheeked CH IY K T
+cheeks CH IY K S
+cheektowaga CH IY K T AH W AA G AH
+cheeky CH IY K IY
+cheely CH IY L IY
+cheer CH IH R
+cheered CH IH R D
+cheerful CH IH R F AH L
+cheerfully CH IH R F AH L IY
+cheerfully(2) CH IH R F L IY
+cheerier CH IH R IY ER
+cheeriest CH IH R IY AH S T
+cheering CH IH R IH NG
+cheerio CH IH R IY OW
+cheerios CH IH R IY OW S
+cheerleader CH IH R L IY D ER
+cheerleaders CH IH R L IY D ER Z
+cheerleading CH IH R L IY D IH NG
+cheers CH IH R Z
+cheery CH IH R IY
+cheese CH IY Z
+cheeseburger CH IY Z B ER G ER
+cheeseburgers CH IY Z B ER G ER Z
+cheesecake CH IY Z K EY K
+cheeseman CH IY Z M AH N
+cheeser CH IY Z ER
+cheeses CH IY Z IH Z
+cheesier CH IY Z IY ER
+cheesiest CH IY Z IY IH S T
+cheesman CH IY Z M AH N
+cheesy CH IY Z IY
+cheetah CH IY T AH
+cheetahs CH IY T AH Z
+cheetal CH IY T AH L
+cheetan CH IY T AH N
+cheetham CH IY TH AH M
+cheever CH IY V ER
+chef SH EH F
+chef's SH EH F S
+chefitz CH EH F IH T S
+chefs SH EH F S
+cheil CH AY L
+cheimi CH EY M IY
+chek CH EH K
+chekhov CH EH K AA V
+chekhov's CH EH K AA V Z
+chelan CH EH L AH N
+chelette SH IH L EH T
+chelf CH EH L F
+chell CH EH L
+chellis CH EH L IH S
+chelmsford CH EH L M S F ER D
+chelsea CH EH L S IY
+chelsea's CH EH L S IY Z
+chelyabinsk CH EH L Y AH B IH N S K
+chem K EH M
+chema CH EH M AA
+chemania CH AH M EY N Y AH
+chemclear CH EH M K L IH R
+chemdesign CH EH M D AH Z AY N
+chemed K EH M EH D
+chemed(2) K EH M D
+chemel K EH M EH L
+chemerinsky CH EH M ER IH N S K IY
+chemetron CH EH M AH T R AA N
+chemfix CH EH M F IH K S
+chemical K EH M AH K AH L
+chemical's K EH M IH K AH L Z
+chemical(2) K EH M IH K AH L
+chemically K EH M AH K L IY
+chemicals K EH M IH K AH L Z
+chemicals' CH EH M AH K AH L Z
+chemie CH EH M IY
+chemins CH EH M IH N Z
+chemins(2) SH AH M IH N Z
+chemise SH AH M IY Z
+chemist K EH M IH S T
+chemistry K EH M AH S T R IY
+chemistry(2) K EH M IH S T R IY
+chemists K EH M AH S T S
+chemists(2) K EH M IH S T S
+chemists(3) K EH M IH S S
+chemists(4) K EH M IH S
+chemlawn K EH M L AO N
+chemlawn's K EH M L AO N Z
+chemo K IY M OW
+chemotherapy K IY M OW TH EH R AH P IY
+chemyr K EH M IH R
+chen CH EH N
+chen's CH EH N Z
+chenard CH EH N ER D
+chenault SH IH N OW
+chenette SH IH N EH T
+chenevert CH EH N IH V ER T
+cheney CH EY N IY
+cheney's CH EY N IY Z
+cheng CH EH NG
+cheng-chung CH EH NG CH UH NG
+cheng-hua CH EH NG HH W AA
+chengdu CH EH NG D UW
+chengxiang CH EH NG SH AA NG
+chenier CH IY N IY ER
+chennai CH EH N AY
+chennault CH EH N AO L T
+chenoweth CH EH N AH W EH TH
+chenowitz CH EH N AH W IH T S
+chenxiang CH EH N SH AA NG
+cheong CH IY AA NG
+cher SH EH R
+cheramie CH EH R AH M IY
+cherbourg SH EH R B AH R G
+cheri SH EH R IY
+cherico K ER IY K OW
+cherico(2) CH ER IY K OW
+cherie SH EH R IY
+cherish CH EH R IH SH
+cherished CH EH R IH SH T
+cherishes CH EH R IH SH IH Z
+cherishing CH EH R IH SH IH NG
+chermak CH ER M AH K
+chern CH ER N
+cherne CH ER N
+chernenko CH ER N EH NG K OW
+cherney CH ER N IY
+chernick CH ER N IH K
+chernin CH ER N IH N
+chernobyl CH ER N OW B AH L
+chernobyl's CH ER N OW B AH L Z
+chernoff K ER N AO F
+chernomyrdin CH EH R N OW M IH R D AH N
+chernomyrdin's CH EH R N OW M IH R D AH N Z
+chernow CH ER N OW
+cherny CH ER N IY
+cherokee CH EH R AH K IY
+cherokee's CH EH R AH K IY Z
+cherokees CH EH R AH K IY Z
+cherrapunji CH EH R AH P AH N JH IY
+cherrier CH EH R IY ER
+cherries CH EH R IY Z
+cherrington CH EH R IH NG T AH N
+cherry CH EH R IY
+cherry's CH EH R IY Z
+cherrystone CH EH R IY S T OW N
+cherrystones CH EH R IY S T OW N Z
+chert CH ER T
+chertkow CH ER T K AW
+chertoff CH ER T AA F
+cherts CH ER T S
+cherub CH EH R AH B
+cherubic CH ER UW B IH K
+cherubini K ER UW B IY N IY
+cherubs CH EH R AH B Z
+cherumirdan CH EH R AH M IH R D AH N
+cherumirdan's CH EH R AH M IH R D AH N Z
+chervenak CH ER V IH N AE K
+chery CH EH R IY
+cheryl SH EH R AH L
+ches CH EH S
+chesapeake CH EH S AH P IY K
+chesbro K EH S B R OW
+chesebro K EH S EH B R OW
+chesebrough CH EH S AH B R UW
+chesher CH EH SH ER
+cheshier CH EH SH IY ER
+cheshire CH EH SH ER
+chesler CH EH S AH L ER
+chesler(2) CH EH S L ER
+chesley CH EH S L IY
+cheslock CH EH S L AH K
+chesney CH EH S N IY
+chesnut CH EH S N AH T
+chesnutt SH IH S N AH T
+chesnutt(2) CH EH S N AH T
+chess CH EH S
+chessboard CH EH S B AO R D
+chessboards CH EH S B AO R D Z
+chesser CH EH S ER
+chessher CH EH SH ER
+chesshir SH IH SH ER
+chessman CH EH S M AH N
+chesson CH EH S AH N
+chest CH EH S T
+chestang CH EH S T AH NG
+chested CH EH S T AH D
+chested(2) CH EH S T IH D
+chester CH EH S T ER
+chesterfield CH EH S T ER F IY L D
+chesterman CH EH S T ER M AH N
+chesters CH EH S T ER Z
+chesterson CH EH S T ER S AH N
+chesterton CH EH S T ER T AH N
+chestman CH EH S T M AH N
+chestnut CH EH S N AH T
+chestnut(2) CH EH S T N AH T
+chestnuts CH EH S N AH T S
+chestnutt CH EH S T N AH T
+cheston CH EH S T AH N
+chests CH EH S T S
+chet CH EH T
+chetniks CH EH T N IH K S
+chetwin CH EH T W IH N
+cheung CH Y UW NG
+cheuse CH UW S
+cheuvront SH UW V R AA N T
+chevalier SH EH V AH L IH R
+cheverly CH EH V ER L IY
+cheves CH IY V Z
+chevette SH AH V EH T
+chevies CH EH V IY Z
+chevik CH EH V IH K
+cheviot SH EH V IY AH T
+cheviots CH IY V IY AH T S
+chevis CH EH V IH S
+chevrette SH IH V R EH T
+chevrier CH EH V ER IY ER
+chevrolet SH EH V R AH L EY
+chevrolet's SH EH V R AH L EY Z
+chevrolet's(2) SH EH V R OW L EY Z
+chevrolet(2) SH EH V R OW L EY
+chevrolets SH EH V R AH L EY Z
+chevrolets(2) SH EH V R OW L EY Z
+chevron SH EH V R AH N
+chevron's SH EH V R AH N Z
+chevron's(2) SH EH V R AA N Z
+chevron(2) SH EH V R AA N
+chevy CH EH V IY
+chevy's CH EH V IY Z
+chevy's(2) SH EH V IY Z
+chevy(2) SH EH V IY
+chevys CH EH V IH S
+chevys(2) SH EH V IH S
+chew CH UW
+chewed CH UW D
+chewer CH UW ER
+chewers CH UW ER Z
+chewing CH UW IH NG
+chewning CH UW N IH NG
+chews CH UW Z
+chewy CH UW IY
+cheyenne SH AY AE N
+cheyenne's SH AY AE N Z
+cheyennes SH AY AE N Z
+cheyne CH EY N
+cheyney CH EY N IY
+chez CH EH Z
+chi K AY
+chi's K AY Z
+chia CH IY AH
+chianese K IY AA N EY Z IY
+chiang CH AE NG
+chiang's CH AE NG Z
+chianti CH IY AE N T IY
+chiapas CH IY AA P AH S
+chiapas' CH IY AA P AH Z
+chiapparone CH IY AE P ER OW N
+chiappetta K IY AA P EH T AH
+chiappone K IY AA P OW N IY
+chiara K Y AA R AH
+chiaramonte K IY AA R AA M OW N T IY
+chiarella K IY AA R EH L AH
+chiarelli K IY AA R EH L IY
+chiarello K IY AA R EH L OW
+chiarenza K IY AA R EH N Z AH
+chiarnim K IY AA R N IH M
+chiaro K IY AA R OW
+chiasso CH IY AA S OW
+chiasson CH IY AA S AH N
+chiat CH IY AE T
+chiavetta K IY AA V EH T AH
+chiba CH IY B AH
+chic SH IY K
+chicago SH AH K AA G OW
+chicago's SH AH K AA G OW Z
+chicagoan CH IH K AH G OW N
+chicagoans SH AH K AA G OW AH N Z
+chicanery SH IH K EY N ER IY
+chicano CH IH K AA N OW
+chicanos CH IH K AA N OW Z
+chichauha CH IY CH AW AH
+chichauha's CH IY CH AW AH Z
+chichester CH IH CH EH S T ER
+chichi CH IY CH IY
+chick CH IH K
+chickasaw CH IH K AH S AO
+chickasaws CH IH K AH S AO Z
+chicked CH IH K T
+chicken CH IH K AH N
+chicken's CH IH K AH N Z
+chickened CH IH K AH N D
+chickening CH IH K AH N IH NG
+chickens CH IH K AH N Z
+chickens' CH IH K AH N Z
+chickering CH IH K ER IH NG
+chicks CH IH K S
+chico CH IY K OW
+chico's CH IY K OW Z
+chicoine CH IH K OY N
+chicots CH IH K AH T S
+chide CH AY D
+chided CH AY D IH D
+chides CH AY D Z
+chidester CH IH D IH S T ER
+chideya CH IH D IY Y AH
+chideya(2) CH IH D EY Y AH
+chiding CH AY D IH NG
+chidsey CH IH D Z IY
+chief CH IY F
+chief's CH IY F S
+chiefdom CH IY F D AH M
+chieffo K IY F OW
+chiefly CH IY F L IY
+chiefs CH IY F S
+chiefs' CH IY F S
+chieftain CH IY F T AH N
+chieftain's CH IY F T AH N Z
+chieftains CH IY F T AH N Z
+chien CH EH N
+chiengmai CH EH NG M AY
+chiesa K IY S AH
+chiffon SH IH F AA N
+chiggers CH IH G ER Z
+chigney CH IH G N IY
+chihuahua CH AH W AA W AA
+chihuahua(2) CH IY W AA W AH
+chikane CH IH K AA N EY
+chikatilo CH IH K AH T IH L OW
+chikos CH IY K OW S
+chilblain CH IH L B L EY N
+chilblains CH IH L B L EY N Z
+chilcoat CH IH L K OW T
+chilcote CH IH L K OW T
+chilcott CH IH L K AH T
+chilcutt CH IH L K AH T
+child CH AY L D
+child's CH AY L D Z
+childbearing CH AY L D B EH R IH NG
+childbirth CH AY L D B ER TH
+childcare CH AY L D K EH R
+childcraft CH AY L D K R AE F T
+childe CH IH L D
+childener CH IH L D N ER
+childener's CH IH L D N ER Z
+childener's(2) CH IH L D IH N ER Z
+childener(2) CH IH L D IH N ER
+childers CH IH L D ER Z
+childhood CH AY L D HH UH D
+childhoods CH AY L D HH UH D Z
+childish CH AY L D IH SH
+childless CH AY L D L AH S
+childlike CH AY L D L AY K
+childraising CH AY L D R EY Z IH NG
+childree CH AY L D R IY
+children CH IH L D R AH N
+children's CH IH L D R AH N Z
+childrens CH IH L D R AH N Z
+childrens' CH IH L D R AH N Z
+childres CH AY L D ER Z
+childress CH IH L D R IH S
+childrey CH IH L D R IY
+childs CH AY L D Z
+chile CH IH L IY
+chile's CH IH L IY Z
+chilean CH IH L IY AH N
+chileans CH IH L IY AH N Z
+chiles CH AY L Z
+chiles's CH IH L IY Z IH Z
+chiles(2) CH IH L IY Z
+chili CH IH L IY
+chili's CH IH L IY Z
+chilies CH IH L IY Z
+chilis CH IH L IY Z
+chill CH IH L
+chilled CH IH L D
+chillemi K IY L EH M IY
+chiller CH IH L ER
+chillicothe CH IH L IH K AO TH
+chillier CH IH L IY ER
+chillies CH IH L IY Z
+chilliest CH IH L IY AH S T
+chilling CH IH L IH NG
+chillingly CH IH L IH NG L IY
+chills CH IH L Z
+chilly CH IH L IY
+chilmark CH IH L M AA R K
+chilson CH IH L S AH N
+chilton CH IH L T AH N
+chimayo CH IH M AY OW
+chime CH AY M
+chimed CH AY M D
+chimenti CH IH M EH N T IY
+chimento CH IH M EH N T OW
+chimera CH IH M EH R AH
+chimerical K IH M EH R AH K AH L
+chimerine CH IH M ER IY N
+chimes CH AY M Z
+chimicles CH IH M IH K AH L Z
+chimie CH IH M IY
+chimney CH IH M N IY
+chimneys CH IH M N IY Z
+chimp CH IH M P
+chimpanzee CH IH M P AE N Z IY
+chimpanzees CH IH M P AE N Z IY Z
+chimps CH IH M P S
+chimurenga CH IH M ER EH N G AH
+chin CH IH N
+china CH AY N AH
+china's CH AY N AH Z
+chinatown CH AY N AH T AW N
+chinchilla CH IH N CH IH L AH
+chinen CH IH N AH N
+chinese CH AY N IY Z
+ching CH IH NG
+chinh CH IH N
+chink CH IH NG K
+chinks CH IH NG K S
+chinn CH IH N
+chinn's CH IH N Z
+chinnici K IY N IY CH IY
+chinnock CH IH N AH K
+chino CH IY N OW
+chinook SH IH N UH K
+chinook(2) CH IH N UH K
+chinooks CH IH N UH K S
+chinooks(2) SH IH N UH K S
+chinoy CH IH N OY
+chintung CH IH N T AH NG
+chintzy CH IH N T S IY
+chiodo K IY OW D OW
+chip CH IH P
+chip's CH IH P S
+chipboard CH IH P B AO R D
+chipcom CH IH P K AA M
+chipcom's CH IH P K AA M Z
+chipello CH IH P EH L OW
+chipetas CH IH P IY T AH Z
+chipita CH AH P IY T AH
+chipley CH IH P L IY
+chipmaker CH IH P M EY K ER
+chipmakers CH IH P M EY K ER Z
+chipman CH IH P M AH N
+chipote CH IH P OW T
+chipped CH IH P T
+chipper CH IH P ER
+chippewa CH IH P AH W AA
+chipping CH IH P IH NG
+chipps CH IH P S
+chippy CH IH P IY
+chips CH IH P S
+chipsoft CH IH P S AO F T
+chiquita K IH K W IY T AH
+chiquita(2) CH IH K W IY T AH
+chiquita(3) CH IH K IY T AH
+chirac SH IH R AE K
+chirac's SH IH R AE K S
+chirco K IH R K OW
+chirico K IH R IY K OW
+chiron CH AY R AH N
+chiron's CH AY R AH N Z
+chiropractic K AY R OW P R AE K T IH K
+chiropractor K AY R AH P R AE K T ER
+chiropractor's K AY R OW P R AE K T ER Z
+chiropractors K AY R AH P R AE K T ER Z
+chirp CH ER P
+chirping CH ER P IH NG
+chirps CH ER P S
+chirpy CH ER P IY
+chisam CH IH S AH M
+chisel CH IH Z AH L
+chiseled CH IH Z AH L D
+chiseling CH IH Z AH L IH NG
+chiseling(2) CH IH Z L IH NG
+chisels CH IH Z AH L Z
+chisenhall CH IH S EH N HH AH L
+chisholm CH IH Z AH M
+chisler CH IH S AH L ER
+chisler(2) CH IH S L ER
+chisler(3) CH IH Z L ER
+chism CH IH Z AH M
+chisman CH IH S M AH N
+chismar CH IH Z M ER
+chisolm CH IH S OW M
+chisom CH IH S AH M
+chissano CH IH S AA N OW
+chisum CH IH Z AH M
+chiswick CH IH Z W IH K
+chit CH IH T
+chita CH IY T AH
+chitchat CH IH T CH AE T
+chitinous K AY T AH N AH S
+chitlin CH IH T L IH N
+chitlins CH IH T L IH N Z
+chitra CH IH T R AH
+chitra's CH IH T R AH Z
+chitrao CH IH T R AW
+chits CH IH T S
+chittenden CH IH T AH N D AH N
+chitter CH IH T ER
+chitterchatter CH IH T ER CH AE T ER
+chitterlings CH IH T ER L IH NG Z
+chittick CH IH T IH K
+chittum CH IH T AH M
+chitty CH IH T IY
+chitwood CH IH T W UH D
+chiu CH UW
+chiusano K IY UW S AA N OW
+chivalry SH IH V AH L R IY
+chivas CH IY V AH S
+chivas(2) SH IY V AH S
+chivers CH AY V ER Z
+chives CH AY V Z
+chiyoda CH IH Y OW D AH
+chizek CH IH Z EH K
+chizmar CH IH Z M ER
+chlamydia K L AE M AY D IY AH
+chlamydia(2) K L AE M IH D IY AH
+chlebowski CH L IH B AO F S K IY
+chlebowski(2) K L IH B AO F S K IY
+chloe K L OW IY
+chlorate K L AO R EY T
+chlordane K L AO R D EY N
+chloride K L AO R AY D
+chlorinate K L AO R AH N EY T
+chlorinated K L AO R AH N EY T AH D
+chlorinating K L AO R AH N EY T IH NG
+chlorine K L AO R IY N
+chloris K L AO R IH S
+chlorofluorocarbon K L AO R OW F L AO R OW K AA R B AA N
+chlorofluorocarbons K L AO R OW F L AO R OW K AA R B AA N Z
+chloroform K L AO R AH F AO R M
+chlorophyll K L AO R AH F IH L
+chloroplast K L AO R AH P L AE S T
+chloroplasts K L AO R AH P L AE S T S
+chloroplasts(2) K L AO R AH P L AE S S
+chloroplasts(3) K L AO R AH P L AE S
+chloroprene K L AO R AH P R IY N
+chmiel CH AH M IY L
+chmielewski CH AH M AH L EH F S K IY
+chmielewski(2) CH AH M AH L UW S K IY
+chmura CH AH M UH R AH
+cho CH OW
+choat CH OW T
+choate CH OW T
+chock CH AA K
+chocolat CH AA K L AH T
+chocolate CH AO K L AH T
+chocolates CH AO K L AH T S
+chocolatology CH AA K L AH T AA L AH JH IY
+chodorow CH OW D ER OW
+choe CH OW
+choi CH OY
+choice CH OY S
+choicer CH OY S ER
+choicers CH OY S ER Z
+choices CH OY S AH Z
+choices(2) CH OY S IH Z
+choicest CH OY S AH S T
+choiniere SH OY N IY EH R
+choinski CH OY N S K IY
+choir K W AY ER
+choirs K W AY R Z
+chojnacki CH AH Y N AA T S K IY
+chojnowski CH AH Y N AO F S K IY
+chok CH AA K
+choke CH OW K
+choked CH OW K T
+chokehold CH OW K HH OW L D
+chokes CH OW K S
+choking CH OW K IH NG
+cholera K AA L ER AH
+choleric K AA L ER IH K
+cholesterol K AH L EH S T ER AO L
+cholesterol(2) K AH L EH S T ER AH L
+cholestyramine CH OW L EH S T IH R AH M AY N
+cholet CH OW L AH T
+cholewa CH AH L UW AH
+cholla CH AA L AH
+choma CH OW M AH
+chombiono CH AA M B IY OW N OW
+chomp CH AA M P
+chomping CH AA M P IH NG
+chon CH AA N
+chong CH AO NG
+chongqing CH AO NG K IH NG
+chonko CH AA NG K OW
+chontales SH AA N T EY L Z
+choo CH UW
+chook CH UH K
+chook(2) CH UW K
+choon CH UW N
+choong CH UW NG
+choose CH UW Z
+chooses CH UW Z AH Z
+chooses(2) CH UW Z IH Z
+choosing CH UW Z IH NG
+choosy CH UW Z IY
+chop CH AA P
+chop-suey CH AA P S UW IY
+choper CH OW P ER
+chopin SH OW P AE N
+choplin CH AA P L IH N
+chopp CH AA P
+chopped CH AA P T
+chopper CH AA P ER
+chopper's CH AA P ER Z
+choppers CH AA P ER Z
+chopping CH AA P IH NG
+choppy CH AA P IY
+chopra CH AA P R AH
+chops CH AA P S
+chopstick CH AA P S T IH K
+chopsticks CH AA P S T IH K S
+chopsuey CH AA P S UW IY
+choquette SH AH K EH T
+choral K AO R AH L
+chorale K ER AE L
+chorals K AO R AH L Z
+chorba K AO R B AH
+chord K AO R D
+chordates K AO R D EY T S
+chords K AO R D Z
+chore CH AO R
+choreograph K AO R IY AH G R AE F
+choreographed K AO R IY AH G R AE F T
+choreographer K AO R IY AA G R AH F ER
+choreographer's K AO R IY AA G R AH F ER Z
+choreographers K AO R IY AA G R AH F ER Z
+choreographic K AO R IY AH G R AE F IH K
+choreographing K AO R IY AA G R AH F IH NG
+choreographing(2) K AO R IY AH G R AE F IH NG
+choreography K AO R IY AA G R AH F IY
+chores CH AO R Z
+choric K AO R IH K
+chorney K AO R N IY
+chortle CH AO R T AH L
+chortled CH AO R T AH L D
+chortles CH AO R T AH L Z
+chortling CH AO R T AH L IH NG
+chortling(2) CH AO R T L IH NG
+chorus K AO R AH S
+choruses K AO R AH S IH Z
+chose CH OW Z
+chosen CH OW Z AH N
+chosun CH OW Z AH N
+chotilla CH AH T IH L AH
+chou CH UW
+chouinard SH W IY N AA R D
+chovan CH OW V AH N
+chovanec CH AH V AE N IH K
+chow CH AW
+chowder CH AW D ER
+chowdhury CH AW D HH Y UW R IY
+chowning CH AW N IH NG
+chows CH AW Z
+choy CH OY
+choyce CH OY S
+chrest K R EH S T
+chrestman K R EH S T M AH N
+chretien SH R IH T IY N
+chriboniko CH R IY B OW N IY K OW
+chriboniko's CH R IY B OW N IY K OW Z
+chriboniko's(2) CH R IH B AH N IY K OW Z
+chriboniko(2) CH R IH B AH N IY K OW
+chriptosporidium K R IH P T OW S P AO R IH D IY AH M
+chris K R IH S
+chris' K R IH S
+chrisco K R IY S K OW
+chriscoe K R IH S K OW
+chrisman K R IH S M AH N
+chrismer K ER IH Z AH M ER
+chrismer(2) K R IH S M ER
+chrismon K R IH Z M AH N
+chrisp K R IH S P
+chriss K R IH S
+chrissie K R IH S IY
+chrissy K R IH S IY
+christ K R AY S T
+christ's K R AY S T S
+christa K R IH S T AH
+christabelle SH R IH S T AH B AH L
+christakos K R IH S T AH K OW Z
+christal K R IH S T AH L
+christchurch K R AY S T CH ER CH
+christel K R IH S T AH L
+christen K R IH S AH N
+christenberry K R IH S AH N B EH R IY
+christenbury K R IH S AH N B EH R IY
+christendom K R IH S AH N D AH M
+christened K R IH S AH N D
+christening K R IH S AH N IH NG
+christening(2) K R IH S N IH NG
+christensen K R IH S T AH N S AH N
+christenson K R IH S T IH N S AH N
+christeson K R IH S T IH S AH N
+christi K R IH S T IY
+christiaan K R IH S T IY AA N
+christian K R IH S CH AH N
+christian(2) K R IH S CH IH N
+christiana K R IH S T IY AE N AH
+christiane K R IH S T IY AA N
+christianity K R IH S CH IY AE N IH T IY
+christianity's K R IH S CH IY AE N IH T IY Z
+christianization K R IH S CH AH N AH Z EY SH AH N
+christianize K R IH S CH AH N AY Z
+christianized K R IH S CH AH N AY Z D
+christianna K R IH S T IY AE N AH
+christianne K R IH S T IY AA N
+christiano K R IY S T IY AA N OW
+christians K R IH S CH AH N Z
+christians(2) K R IH S CH IH N Z
+christiansen K R IH S CH AH N S AH N
+christianson K R IH S CH AH N S AH N
+christiansted K R IH S CH AH N S T EH D
+christic K R IH S T IH K
+christie K R IH S T IY
+christie's K R IH S T IY Z
+christies K R IH S T IY Z
+christina K R IH S T IY N AH
+christine K R IH S T IY N
+christine's K R IH S T IY N Z
+christison K R IH S T IH S AH N
+christlieb K R IH S T L IY B
+christman K R IH S T M AH N
+christman's K R IH S T M AH N Z
+christmann K R IH S T M AH N
+christmas K R IH S M AH S
+christmas' K R IH S M AH S
+christmases K R IH S M AH S IH Z
+christmastime K R IH S T M AH S T AY M
+christner K R IH S T N ER
+christo K R IH S T OW
+christoff K R IH S T AO F
+christoffel K R IH S T AH F EH L
+christoffersen K R IH S T AH F ER S AH N
+christoffersen(2) K R IH S T AA F ER S AH N
+christofferson K R IH S T AA F ER S AH N
+christon K R IH S T AH N
+christoph K R IH S T AO F
+christophe K R IH S T R AO F
+christophel K R IH S T AH F EH L
+christopher K R IH S T AH F ER
+christopher's K R IH S T AH F ER Z
+christophersen K R IH S T AH F ER S AH N
+christopherson K R IH S T AA F ER S AH N
+christopoulos K R IH S T AA P AH L IH S
+christy K R IH S T IY
+christy's K R IH S T IY Z
+chriswell K R IH S W EH L
+chrobak K R OW B AH K
+chromakalim CH R OW M AH K AA L IY M
+chromalloy K R OW M AE L OY
+chromatogram K R OW M AE T AH G R AE M
+chromatograms K R OW M AE T AH G R AE M Z
+chromatography K R OW M AH T AA G R AH F IY
+chrome K R OW M
+chrominance K R OW M AH N AH N S
+chromium K R OW M IY AH M
+chromosome K R OW M AH S OW M
+chromosome(2) K R OW M AH Z OW M
+chromosomes K R OW M AH Z OW M Z
+chromosomes(2) K R OW M AH S OW M Z
+chronar K R AA N ER
+chronic K R AA N IH K
+chronically K R AA N IH K AH L IY
+chronically(2) K R AA N IH K L IY
+chronicle K R AA N IH K AH L
+chronicle's K R AA N IH K AH L Z
+chronicled K R AA N IH K AH L D
+chronicler K R AA N IH K L ER
+chroniclers K R AA N IH K L ER Z
+chronicles K R AA N IH K AH L Z
+chronicling K R AA N IH K L IH NG
+chronis K R OW N IH S
+chronister K R AA N IH S T ER
+chronological K R AA N AH L AA JH IH K AH L
+chronologically K R AA N AH L AA JH IH K L IY
+chronologies K R AH N AA L AH JH IY Z
+chronology K R AH N AA L AH JH IY
+chronowitz K R AA N AH W IH T S
+chrostowski K R AH S T AO F S K IY
+chrusciel K R AH S IY L
+chrysalis K R IH S AH L IH S
+chrysanthemum K R IH S AE N TH AH M AH M
+chrysanthemums K R IH S AE N TH AH M AH M Z
+chryseis K R IH S AH Z
+chrysler K R AY S L ER
+chrysler's K R AY S L ER Z
+chryslers K R AY S L ER Z
+chryst CH R IH S T
+chrystal K R IH S T AH L
+chrzan K ER Z AE N
+chrzanowski K ER Z AH N AO F S K IY
+chseing CH EY NG
+chu CH UW
+chua K UW AH
+chua(2) K W AA
+chuah CH UW AA
+chuan CH UW AA N
+chuang CH AE NG
+chuang(2) CH W AA NG
+chuba CH UW B AH
+chubais CH UW B AY
+chubb CH AH B
+chubb's CH AH B Z
+chubbuck CH AH B AH K
+chubby CH AH B IY
+chubu CH UW B UW
+chuck CH AH K
+chuck's CH AH K S
+chuck-a-luck CH AH K AH L AH K
+chucked CH AH K T
+chuckie CH AH K IY
+chucking CH AH K IH NG
+chuckle CH AH K AH L
+chuckled CH AH K AH L D
+chuckles CH AH K AH L Z
+chuckling CH AH K L IH NG
+chudler CH AH D L ER
+chudy CH UW D IY
+chudzik CH AH D Z IH K
+chudzinski CH AH JH IH N S K IY
+chug CH AH G
+chugai CH UW G AY
+chugged CH AH G D
+chugging CH AH G IH NG
+chugoku CH UW G OW K UW
+chui K UW IH
+chujitsuya CH UW JH IY T S UW Y AH
+chukchi CH UW K CH IY
+chul CH AH L
+chula CH UW L AH
+chum CH AH M
+chumbley CH AH M B L IY
+chumley CH AH M L IY
+chummy CH AH M IY
+chumney CH AH M N IY
+chump CH AH M P
+chums CH AH M Z
+chun CH AH N
+chun's CH AH N Z
+chung CH AH NG
+chung's CH AH NG Z
+chunk CH AH NG K
+chunks CH AH NG K S
+chunky CH AH NG K IY
+chunn CH AH N
+chunnel CH AH N AH L
+chupp CH AH P
+chura CH UH R AH
+church CH ER CH
+church's CH ER CH AH Z
+churches CH ER CH AH Z
+churches' CH ER CH IH Z
+churches(2) CH ER CH IH Z
+churchgoer CH ER CH G OW ER
+churchgoers CH ER CH G OW ER Z
+churchgoing CH ER CH G OW IH NG
+churchhouse CH ER CH HH AW S
+churchill CH ER CH IH L
+churchill's CH ER CH IH L Z
+churchill's(2) CH ER CH HH IH L Z
+churchill(2) CH ER CH HH IH L
+churchman CH ER CH M AH N
+churchmen CH ER CH M AH N
+churchwell CH ER CH W EH L
+churchyard CH ER CH Y AA R D
+churilla CH ER IH L AH
+churkin CH ER K AH N
+churkin's CH ER K AH N Z
+churlish CH ER L IH SH
+churn CH ER N
+churned CH ER N D
+churning CH ER N IH NG
+churns CH ER N Z
+churry CH ER IY
+chuse CH Y UW Z
+chuse(2) CH UW Z
+chusmir CH UH S M IH R
+chustz CH AH S T S
+chute SH UW T
+chutes SH UW T S
+chutney CH AH T N IY
+chutzpah CH AH T S P AA
+chutzpah(2) HH UH T S P AA
+chykatka CH IY K AA T K AH
+chynoweth CH IH N AW EH TH
+chyron CH AY R AH N
+chyron's CH AY R AH N Z
+cia S IY AY EY
+ciaccia CH IY AH CH IY AH
+ciaccia(2) S IY AH S IY AH
+ciaccio CH AO CH IY OW
+ciampa CH AO M P AH
+ciampi CH AO M P IY
+cian SH IY N
+cianci CH AO N CH IY
+ciancio CH AO N CH IY OW
+cianciola CH AO N CH OW L AH
+cianciolo CH AO N CH OW L OW
+cianciulli CH AO N CH UW L IY
+ciani CH AO N IY
+ciano CH IY AA N OW
+ciao CH AW
+ciaobella CH AW B EH L AH
+ciaramella CH ER AA M EH L AH
+ciaramitaro CH ER AA M IY T AA R OW
+ciaravino CH ER AA V IY N OW
+ciardi CH ER D IY
+ciarlo CH ER L OW
+ciavarella CH AH V AA R EH L AH
+ciba S IY B AH
+ciba's S IY B AH Z
+ciba's(2) S AY B AH Z
+ciba(2) S AY B AH
+ciborowski CH IH B ER AO F S K IY
+cibro S IH B R OW
+cibula CH IY B UW L AH
+cicada S AH K EY D AH
+cicadas S IH K EY D AH Z
+cicala S IH K AA L AH
+cicalese CH IY K AA L EY Z IY
+ciccarelli CH IY K ER EH L IY
+ciccarello CH IY K ER EH L OW
+ciccarone S IH K ER OW N
+cicco S IH K OW
+ciccone CH IY K OW N IY
+cicely S IH S AH L IY
+cicero S IH S ER OW
+cicerone S IH S ER OW N
+cichocki S IH CH AA K IY
+cichon S IH CH AH N
+cichowski CH IH HH AO F S K IY
+cichy S IH CH IY
+cicily CH IH CH AH L IY
+cicio S IH S IY OW
+cicippio S IH S IH P IY OW
+cid S IH D
+cider S AY D ER
+cie S IY
+cie(2) S IY AY IY
+ciel S IY L
+ciera S IY R AH
+cieri S IY R IY
+ciesielski CH EH S IY L S K IY
+ciesla CH EH S L AH
+cieslak CH EH S L AH K
+cieslewicz CH EH S L IH V IH CH
+cieslik CH EH S L IH K
+cieslinski CH EH S L IH N S K IY
+cifelli S IH F EH L IY
+cifra S IH F R AH
+cifuentes S IY F W EH N T EH S
+ciga S IY G AH
+cigar S IH G AA R
+cigarette S IH G ER EH T
+cigarette's S IH G ER EH T S
+cigarettes S IH G ER EH T S
+cigars S IH G AA R Z
+cigna S IH G N AH
+cigna's S IH G N AH Z
+cihak S IH HH AH K
+cihlar S IH L ER
+cilag S IH L AE G
+cilantro S IH L AE N T R OW
+cilcorp S IH L K AO R P
+cilento S IH L EH N T OW
+ciliates S IH L IY AH T S
+ciliberto CH IY L IY B EH R T OW
+cilicia S IH L IH SH AH
+ciller S IH L ER
+cilley S IH L IY
+cillo S IH L OW
+cilluffo S IH L UW F OW
+cilva S IH L V AH
+cima CH IY M AH
+cimaglia S IH M AE G L IY AH
+cimarron S IH M ER AA N
+ciments S IH M EH N T S
+ciminero S IY M IH N EH R OW
+cimini CH IY M IY N IY
+cimino CH IY M IY N OW
+cimmino CH IY M IY N OW
+cimo CH IY M OW
+cimorelli CH IY M AO R EH L IY
+cina CH IY N AH
+cinch S IH N CH
+cinched S IH N CH T
+cincinnati S IH N S AH N AE T IY
+cincinnati's S IH N S IH N AE T IY Z
+cinco S IH NG K OW
+cincotta CH IY N K OW T AH
+cinder S IH N D ER
+cinderella S IH N D ER EH L AH
+cinders S IH N D ER Z
+cindie S AY N D IY
+cindric S IH N D R IH K
+cindy S IH N D IY
+cindy's S IH N D IY Z
+cinelli S IH N EH L IY
+cinema S IH N AH M AH
+cinema's S IH N AH M AH Z
+cinemark S IH N AH M AA K
+cinemas S IH N AH M AH Z
+cinematic S IH N AH M AE T IH K
+cinematographer S IH N IH M AH T AA G R AH F ER
+cinematography S IH N IH M AH T AA G R AH F IY
+cinemax S IH N AH M AE K S
+cineplex S IH N AH P L EH K S
+cineplex's S IH N AH P L EH K S IH Z
+cinergy S IH N ER JH IY
+cini CH IY N IY
+cinnabar S IH N AH B AA R
+cinnabon S IH N AH B AO N
+cinnaminson S IH N AH M IH N S AH N
+cinnamon S IH N AH M AH N
+cinnamonson S IH N AH M AH N S AH N
+cino CH IY N OW
+cinq S IH NG K
+cinque S IH NG K
+cinquemani CH IY N K W EH M AA N IY
+cinram S IH N R AE M
+cinthie S IH N TH IY
+cintron S IH N T R AH N
+ciocca CH OW K AH
+cioffi CH IY OW F IY
+ciolek CH IY OW L EH K
+ciolino CH OW L IY N OW
+ciotti CH OW T IY
+cipher S AY F ER
+cipolla S IH P AA L AH
+cipollone S IH P AH L OW N
+cipollone(2) S IH P AH L OW N IY
+cipri S IH P R IY
+cipriani CH IY P R IY AA N IY
+cipriano CH IY P R IY AA N OW
+cira S ER AH
+ciraulo S ER AO L OW
+circa S ER K AH
+circadian S ER K EY D IY AH N
+circle S ER K AH L
+circle's S ER K AH L Z
+circled S ER K AH L D
+circles S ER K AH L Z
+circling S ER K AH L IH NG
+circling(2) S ER K L IH NG
+circon S ER K AA N
+circuit S ER K AH T
+circuit's S ER K AH T S
+circuited S ER K AH T IH D
+circuitous S ER K Y UW IH T AH S
+circuitry S ER K AH T R IY
+circuits S ER K AH T S
+circular S ER K Y AH L ER
+circularize S ER K Y AH L ER AY Z
+circularizing S ER K Y AH L ER AY Z IH NG
+circularly S ER K Y AH L ER L IY
+circulars S ER K Y AH L ER Z
+circulate S ER K Y AH L EY T
+circulated S ER K Y AH L EY T AH D
+circulated(2) S ER K Y AH L EY T IH D
+circulates S ER K Y AH L EY T S
+circulating S ER K Y AH L EY T IH NG
+circulation S ER K Y AH L EY SH AH N
+circulations S ER K Y AH L EY SH AH N Z
+circulatory S ER K Y AH L AH T AO R IY
+circumcise S ER K AH M S AY Z
+circumcised S ER K AH M S AY Z D
+circumcision S ER K AH M S IH ZH AH N
+circumference S ER K AH M F R AH N S
+circumnavigate S ER K AH M N AE V AH G EY T
+circumscribe S ER K AH M S K R AY B
+circumscribed S ER K AH M S K R AY B D
+circumspect S ER K AH M S P EH K T
+circumspection S ER K AH M S P EH K SH AH N
+circumstance S ER K AH M S T AE N S
+circumstances S ER K AH M S T AE N S AH Z
+circumstances(2) S ER K AH M S T AE N S IH Z
+circumstantial S ER K AH M S T AE N CH AH L
+circumstantial(2) S ER K AH M S T AE N SH AH L
+circumstantially S ER K AH M S T AE N CH AH L IY
+circumstantially(2) S ER K AH M S T AE N SH AH L IY
+circumvene S ER K AH M V IY N
+circumvent S ER K AH M V EH N T
+circumvented S ER K AH M V EH N T IH D
+circumventing S ER K AH M V EH N T IH NG
+circumvention S ER K AH M V EH N CH AH N
+circumvents S ER K AH M V EH N T S
+circus S ER K AH S
+circus's S ER K AH S IH Z
+circuses S ER K AH S AH Z
+cirelli S IH R EH L IY
+ciresi S ER EH S IY
+ciriaco S IH R IY AA K OW
+ciriello S ER IY EH L OW
+cirigliano S ER IY G L IY AA N OW
+cirillo S IH R IH L OW
+cirincione S ER IY N CH OW N IY
+cirino S ER IY N OW
+cirkin S ER K IH N
+cirone S IH R OW N
+ciros S IH R OW Z
+cirque S ER K
+cirrhosis S ER OW S AH S
+cirrincione S ER R IY N CH OW N IY
+cirrus S IH R AH S
+cisar S IH S AA R
+cisco S IH S K OW
+cisco's S IH S K OW Z
+cisek CH IH S EH K
+cisewski CH IH S EH F S K IY
+ciskei S IH S K EY
+cisler S IH S AH L ER
+cisler(2) S IH S L ER
+cislo CH IY S L OW
+cisneros S IH S N EH R OW S
+cisney S IH Z N IY
+cissell S IH S AH L
+cissie S IH S IY
+cissna S IH S N AH
+cist S IH S T
+cistercian S IH S T ER SH AH N
+cistern S IH S T ER N
+cisterns S IH S T ER N Z
+ciszek CH IH SH EH K
+ciszewski CH IH SH EH F S K IY
+citadel S IH T AH D EH L
+citadel's S IH T AH D EH L Z
+citation S AY T EY SH AH N
+citations S AY T EY SH AH N Z
+cite S AY T
+cited S AY T AH D
+cited(2) S AY T IH D
+cites S AY T S
+citgo S IH T G OW
+citi S IH T IY
+citibank S IH T IY B AE NG K
+citibank's S IH T IY B AE NG K S
+citic S IH T IH K
+citicorp S IH T IY K AO R P
+citicorp's S IH T IY K AO R P S
+citicorps S IH T IY K AO R P S
+citicorps' S IH T IY K AO R P S
+cities S IH T IY Z
+cities' S IH T IY Z
+citing S AY T IH NG
+citisteel S IH T IY S T IY L
+citizen S IH T AH Z AH N
+citizen's S IH T AH Z AH N Z
+citizen(2) S IH T IH Z AH N
+citizenry S IH T IH Z AH N R IY
+citizenry's S IH T IH Z AH N R IY Z
+citizens S IH T AH Z AH N Z
+citizens' S IH T IH Z AH N Z
+citizens(2) S IH T IH Z AH N Z
+citizenship S IH T IH Z AH N SH IH P
+citrano CH IY T R AA N OW
+citric S IH T R IH K
+citrin S IH T R IH N
+citrine S IH T R IY N
+citro S IH T R OW
+citroen S IH T R OW N
+citron S IH T R AH N
+citron's S IH T R AH N Z
+citron's(2) S IH T R AA N Z
+citron(2) S IH T R AH N Z
+citronella S IH T R AA N EH L AH
+citrosuco S IH T R AH S UW K OW
+citrucel S IH T R AH S EH L
+citrucel's S IH T R AH S EH L Z
+citrus S IH T R AH S
+citrus's S IH T R AH S AH Z
+citrus's(2) S IH T R AH S IH Z
+cittadino CH IY T AA D IY N OW
+city S IH T IY
+city's S IH T IY Z
+cityfed S IH T IY F EH D
+cityplace S IH T IY P L EY S
+cityside S IH T IY S AY D
+citytrust S IH T IY T R AH S T
+citywide S IH T IY W AY D
+ciucci CH UW CH IY
+ciudad S IY UW D AE D
+ciulla CH UW L AH
+ciullo CH UW L OW
+civet S IH V AH T
+civic S IH V IH K
+civics S IH V IH K S
+civil S IH V AH L
+civiletti S IY V IH L EH T IY
+civilian S AH V IH L Y AH N
+civilians S AH V IH L Y AH N Z
+civility S AH V IH L AH T IY
+civilization S IH V AH L IH Z EY SH AH N
+civilizations S IH V AH L IH Z EY SH AH N Z
+civilize S IH V AH L AY Z
+civilized S IH V AH L AY Z D
+civilly S IH V IH L IY
+civitello CH IY V IY T EH L OW
+cizek CH IH Z EH K
+cizik S IY Z IH K
+cizneros S IH Z N EH R OW S
+claar K L AA R
+claassen K L AA S AH N
+clabaugh K L AE B AO
+clabir K L AE B IH R
+clabo K L AA B OW
+claborn K L AE B ER N
+clabough K L AE B AW
+clack K L AE K
+clackamas K L AE K AH M AH S
+clad K L AE D
+claddagh K L AE D AH
+cladification K L AE D AH F AH K EY SH AH N
+claes K L EY Z
+claeys K L EY Z
+claffey K L AE F IY
+claflin K L AE F L IH N
+clagett K L AE JH IH T
+clagg K L AE G
+claggett K L AE G IH T
+clague K L AA G
+claiborn K L EY B ER N
+claiborne K L EY B ER N
+claiborne's K L EY B AO R N Z
+claiborne's(2) K L EY B ER N Z
+claim K L EY M
+claimant K L EY M AH N T
+claimants K L EY M AH N T S
+claimants' K L EY M AH N T S
+claimed K L EY M D
+claiming K L EY M IH NG
+claims K L EY M Z
+clair K L EH R
+claire K L EH R
+claire's K L EH R Z
+clairmont K L EH R M AH N T
+clairol K L EH R AA L
+clairson K L EH R S AH N
+clairvoyance K L EH R V OY AH N S
+clairvoyant K L EH R V OY AH N T
+clam K L AE M
+clamber K L AE M B ER
+clambered K L AE M B ER D
+clamen K L EY M AH N
+clammed K L AE M D
+clammy K L AE M IY
+clamor K L AE M ER
+clamored K L AE M ER D
+clamoring K L AE M ER IH NG
+clamp K L AE M P
+clampdown K L AE M P D AW N
+clamped K L AE M P T
+clampett K L AE M P AH T
+clamping K L AE M P IH NG
+clampitt K L AH M P IH T
+clamps K L AE M P S
+clams K L AE M Z
+clamshell K L AE M SH EH L
+clan K L AE N
+clancey K L AE N S IY
+clancy K L AE N S IY
+clancy's K L AE N S IY Z
+clandestine K L AE N D EH S T IH N
+clandestinely K L AE N D EH S T AH N L IY
+clang K L AE NG
+clanging K L AE NG IH NG
+clanin K L AE N IH N
+clank K L AE NG K
+clanking K L AE NG K IH NG
+clannish K L AE N IH SH
+clans K L AE N Z
+clanton K L AE N T AH N
+clap K L AE P
+clapboard K L AE P B AO R D
+clapboards K L AE P B AO R D Z
+clapham K L AE F AH M
+clapman K L AE P M AH N
+clapp K L AE P
+clapped K L AE P T
+clapper K L AE P ER
+clapping K L AE P IH NG
+claps K L AE P S
+clapsaddle K L AE P S AE D AH L
+clapton K L AE P T AH N
+clapton's K L AE P T AH N Z
+clar K L AA R
+clara K L AE R AH
+clara's K L AE R AH Z
+clara's(2) K L EH R AH Z
+clara(2) K L EH R AH
+clarabelle K L AE R AH B AH L
+clarabelle(2) K L AE R AH B EH L
+claramae K L AA R AA M AY
+claran K L EH R AH N
+clarcor K L AA R K AO R
+clardy K L AA R D IY
+clare K L EH R
+claremont K L EH R M AA N T
+claren K L AE R AH N
+clarence K L EH R AH N S
+clarendon K L EH R AH N D AH N
+claresta K L AA R EH S T AH
+clarette K L ER EH T
+clarey K L AE R IY
+claribel K L EH R AH B EH L
+clarice K L ER IY S
+clarida K L AA R IY D AH
+claridge K L EH R IH JH
+claridges K L EH R IH JH IH Z
+claridon K L EH R AH D AA N
+clarification K L EH R AH F AH K EY SH AH N
+clarifications K L EH R IH F IH K EY SH AH N Z
+clarified K L EH R AH F AY D
+clarifies K L EH R AH F AY Z
+clarify K L EH R AH F AY
+clarifying K L EH R AH F AY IH NG
+clarimond K L AE R IH M AH N D
+clarinda K L ER IH N D AH
+clarine K L EH R IY N
+clarinet K L EH R AH N EH T
+clarinetist K L EH R AH N EH T IH S T
+clarinetists K L EH R AH N EH T IH S T S
+clarinetists(2) K L EH R AH N EH T IH S S
+clarinetists(3) K L EH R AH N EH T IH S
+clarins K L EH R IH N Z
+clarion K L EH R IY AH N
+claris K L EH R IH S
+clarissa K L ER IH S AH
+clarisse K L AE R IH S
+clarisse(2) K L AH R IY S
+clarita K L AA R IY T AH
+claritin K L EH R IH T IH N
+clarity K L EH R AH T IY
+clarity(2) K L EH R IH T IY
+clark K L AA R K
+clark's K L AA R K S
+clarke K L AA R K
+clarke's K L AA R K S
+clarken K L AA R K EH N
+clarkin K L AA R K IH N
+clarks K L AA R K S
+clarksburg K L AA R K S B ER G
+clarkson K L AA R K S AH N
+clarkston K L AA R K S T AH N
+clarksville K L AA R K S V IH L
+claro K L AA R OW
+clarostat K L EH R AH S T AE T
+clarridge K L AE R IH JH
+clarrisse K L AE R IH S
+clary K L EH R IY
+clasby K L AE S B IY
+clasen K L EY S AH N
+clash K L AE SH
+clashed K L AE SH T
+clashes K L AE SH IH Z
+clashing K L AE SH IH NG
+clason K L AE S AH N
+clasp K L AE S P
+clasped K L AE S P T
+class K L AE S
+class's K L AE S IH Z
+classaction K L AE S AE K SH AH N
+classactions K L AE S AE K SH AH N Z
+classed K L AE S T
+classen K L AE S AH N
+classes K L AE S AH Z
+classes(2) K L AE S IH Z
+classic K L AE S IH K
+classical K L AE S IH K AH L
+classically K L AE S IH K L IY
+classicism K L AE S IH S IH Z AH M
+classicist K L AE S AH S AH S T
+classics K L AE S IH K S
+classier K L AE S IY ER
+classifiable K L AE S AH F AY AH B AH L
+classification K L AE S AH F AH K EY SH AH N
+classifications K L AE S AH F AH K EY SH AH N Z
+classified K L AE S AH F AY D
+classifies K L AE S AH F AY Z
+classify K L AE S AH F AY
+classifying K L AE S AH F AY IH NG
+classing K L AE S IH NG
+classless K L AE S L AH S
+classman K L AE S M AH N
+classmate K L AE S M EY T
+classmates K L AE S M EY T S
+classmen K L AE S M EH N
+classon K L AE S AH N
+classroom K L AE S R UW M
+classrooms K L AE S R UW M Z
+classy K L AE S IY
+clatter K L AE T ER
+clattering K L AE T ER IH NG
+claud K L AO D
+claude K L AO D
+claudet K L AO D EH T
+claudette K L OW D EH T
+claudia K L AO D IY AH
+claudian K L AO D IY AH N
+claudie K L AO D IY
+claudina K L AO D IH N AH
+claudina(2) K L AO D IY N AH
+claudine K L AO D IY N
+claudio K L AO D IY OW
+claudius K L AO D IY AH S
+claudson K L AO D S AH N
+claunch K L AO N CH
+claus K L AO Z
+claus' K L AO Z
+clause K L AO Z
+clausell K L AO Z AH L
+clausen K L AW S AH N
+clauser K L AO Z ER
+clauses K L AO Z AH Z
+clauses(2) K L AO Z IH Z
+clausing K L AO Z IH NG
+clauson K L AO Z AH N
+clauss K L AO S
+claussen K L AO Z S AH N
+claustrophobia K L AO S T R AH F OW B IY AH
+claustrophobic K L AO S T R AH F OW B IH K
+clavette K L AH V EH T
+clavichord K L AE V AH K AO R D
+clavicle K L AE V AH K AH L
+clavicle(2) K L AE V IH K AH L
+clavin K L AE V IH N
+claw K L AO
+clawed K L AO D
+clawing K L AO IH NG
+claws K L AO Z
+clawson K L AO S AH N
+claxon K L AE K S AH N
+claxton K L AE K S T AH N
+clay K L EY
+claybaugh K L EY B AO
+clayborn K L EY B ER N
+clayborne K L EY B ER N
+claybourne K L EY B ER N
+claybrook K L EY B R UH K
+claybrooks K L EY B R UH K S
+clayburn K L EY B ER N
+claycomb K L EY K AH M
+clayey K L EY IY
+clayman K L EY M AH N
+claymation K L EY M EY SH AH N
+claymont K L EY M AA N T
+claymore K L EY M AO R
+claypool K L EY P UW L
+claypoole K L EY P UW L
+clays K L EY Z
+clayson K L EY Z AH N
+clayton K L EY T AH N
+clayton's K L EY T AH N Z
+claytor K L EY T ER
+claywell K L EY W EH L
+cleah K IY AH
+clean K L IY N
+cleaned K L IY N D
+cleaner K L IY N ER
+cleaners K L IY N ER Z
+cleanest K L IY N AH S T
+cleaning K L IY N IH NG
+cleanliness K L EH N L IY N IH S
+cleanly K L IY N L IY
+cleanness K L IY N N IH S
+cleanness(2) K L IY N IH S
+cleans K L IY N Z
+cleanse K L EH N Z
+cleansed K L EH N Z D
+cleanser K L EH N Z ER
+cleansers K L EH N Z ER Z
+cleansing K L EH N Z IH NG
+cleantha K L IY N TH AH
+cleanup K L IY N AH P
+cleanups K L IY N AH P S
+clear K L IH R
+clearance K L IH R AH N S
+clearances K L IH R AH N S IH Z
+clearcut K L IH R K AH T
+clearcuts K L IH R K AH T S
+clearcutting K L IH R K AH T IH NG
+cleared K L IH R D
+clearer K L IH R ER
+clearest K L IH R IH S T
+clearing K L IH R IH NG
+clearinghouse K L IH R IH NG HH AW S
+clearinghouses K L IY R IH NG HH AW S IH Z
+clearly K L IH R L IY
+clearman K L IH R M AH N
+clears K L IH R Z
+clearwater K L IH R W AO T ER
+cleary K L IH R IY
+cleat K L IY T
+cleats K L IY T S
+cleavage K L IY V AH JH
+cleavage(2) K L IY V IH JH
+cleave K L IY V
+cleaveland K L IY V L AH N D
+cleavenger K L IY V IH N JH ER
+cleaver K L IY V ER
+cleaves K L IY V Z
+cleckler K L EH K L ER
+cleckley K L EH K L IY
+cleckner K L EH K N ER
+cleek K L IY K
+cleere K L IH R
+cleese K L IY S
+cleeton K L IY T AH N
+clef K L EH F
+cleft K L EH F T
+clegg K L EH G
+cleghorn K L EH G HH ER N
+cleland K L EH L AH N D
+clell K L EH L
+clelland K L EH L AH N D
+clem K L EH M
+clemans K L EH M AH N Z
+clematis K L EH M AH T IH S
+clematis(2) K L AH M AE T IH S
+clemen K L EH M AH N
+clemence K L EH M AH N S
+clemency K L EH M AH N S IY
+clemens K L EH M AH N Z
+clemensen K L EH M AH N S AH N
+clemenson K L EH M IH N S AH N
+clement K L EH M AH N T
+clemente K L AH M EH N T EY
+clemente's K L AH M EH N T EY Z
+clemente's(2) K L AH M EH N T IY Z
+clemente(2) K L AH M EH N T IY
+clementes K L AH M EH N T EY Z
+clementes(2) K L AH M EH N T IY Z
+clementi K L EY M EY N T IY
+clementia K L EY M EY N SH AH
+clementine K L EH M AH N T AY N
+clementine(2) K L EH M AH N T IY N
+clements K L EH M AH N T S
+clementson K L EH M IH N T S AH N
+clementz K L EH M IH N T S
+clemmer K L EH M ER
+clemmie K L EH M IY
+clemmons K L EH M AH N Z
+clemmy K L EH M IY
+clemo K L EY M OW
+clemons K L EH M AH N Z
+clemson K L EH M S AH N
+clench K L EH N CH
+clenched K L EH N CH T
+clencher K L EH N CH ER
+clenches K L EH N CH AH Z
+clendaniel K L EH N D AH N IY L
+clendenen K L EH N D AH N AH N
+clendenin K L EH N D IH N IH N
+clendening K L EH N D AH N IH NG
+clendenning K L EH N D EH N IH NG
+clenney K L EH N IY
+clenwar K L EH N W ER
+cleo K L IY OW
+cleopatra K L IY AH P AE T R AH
+cleopatra's K L IY AH P AE T R AH Z
+clephane K L EH F EY N
+clepper K L EH P ER
+clerc K L ER K
+clercq K L ER K
+clergy K L ER JH IY
+clergyman K L ER JH IY M AH N
+clergyman(2) K L ER JH IY M AE N
+clergymen K L ER JH IY M IH N
+clergymen(2) K L ER JH IY M EH N
+cleric K L EH R IH K
+clerical K L EH R AH K AH L
+clerical(2) K L EH R IH K AH L
+clerics K L EH R IH K S
+clerissa K L ER IY S AH
+clerk K L ER K
+clerk's K L ER K S
+clerkin K L ER K IH N
+clerks K L ER K S
+clerks' K L ER K S
+clermont K L EH R M AA N T
+cleva K L IY V AH
+cleve K L IY V
+cleveland K L IY V L AH N D
+cleveland's K L IY V L AH N D Z
+clevelander K L IY V L AH N D ER
+clevelanders K L IY V L AH N D ER Z
+cleven K L IY V AH N
+clevenger K L EH V IH N JH ER
+clever K L EH V ER
+cleverly K L EH V ER L IY
+cleverness K L EH V ER N AH S
+clevetrust K L IY V T R AH S T
+clevie K L IY V IY
+clevinger K L EH V IH NG ER
+clevite K L AH V AY T
+clevite's K L AH V AY T S
+clewell K L EH W EH L
+clewis K L UW IH S
+clewiston K L UW AH S T AH N
+clews K L UW Z
+cliantha K L IY AE N TH AH
+cliburn K L AY B ER N
+cliche K L IY SH EY
+cliched K L IY SH EY D
+cliches K L IY SH EY Z
+click K L IH K
+clicked K L IH K T
+clicker K L IH K ER
+clicking K L IH K IH NG
+clickner K L IH K N ER
+clicks K L IH K S
+client K L AY AH N T
+client's K L AY AH N T S
+clientele K L AY AH N T EH L
+clients K L AY AH N T S
+clients' K L AY AH N T S
+cliett K L IY T
+clif K L IH F
+cliff K L IH F
+cliff's K L IH F S
+cliffe K L IH F
+cliffhanger K L IH F HH AE NG ER
+cliffhangers K L IH F HH AE NG ER Z
+clifford K L IH F ER D
+clifford's K L IH F ER D Z
+cliffs K L IH F S
+cliffs' K L IH F S
+clift K L IH F T
+clifton K L IH F T AH N
+cliggott K L IH G AH T
+clim K L IH M
+climaco K L IH M AH K OW
+climactic K L AY M AE K T IH K
+climate K L AY M AH T
+climate(2) K L AY M IH T
+climates K L AY M AH T S
+climates(2) K L AY M IH T S
+climatic K L AY M AE T IH K
+climatologist K L IH M AH T AA L AH JH IH S T
+climatologist(2) K L AY M AH T AA L AH JH IH S T
+climatologists K L IH M AH T AA L AH JH IH S T S
+climatologists(2) K L AY M AH T AA L AH JH IH S T S
+climatologists(3) K L IH M AH T AA L AH JH IH S
+climatologists(4) K L AY M AH T AA L AH JH IH S
+climax K L AY M AE K S
+climaxed K L AY M AE K S T
+climaxes K L IH M AE K S IH Z
+climaxes(2) K L AY M AE K S IH Z
+climb K L AY M
+climbed K L AY M D
+climber K L AY M ER
+climbers K L AY M ER Z
+climbers' K L AY M ER Z
+climbing K L AY M IH NG
+climbs K L AY M Z
+climer K L AY M ER
+climes K L AY M Z
+clinard K L IH N ER D
+clinch K L IH N CH
+clinched K L IH N CH T
+clincher K L IH N CH ER
+clinches K L IH N CH AH Z
+clinches(2) K L IH N CH IH Z
+clinching K L IH N CH IH NG
+cline K L AY N
+clines K L AY N Z
+clines's K L AY N Z IH Z
+cling K L IH NG
+clingan K L IH NG G AH N
+clingenpeel K L IH NG G EH N P IY L
+clinger K L IH NG ER
+clingerman K L IH NG ER M AH N
+clinging K L IH NG IH NG
+clingman K L IH NG M AH N
+clings K L IH NG Z
+clini K L IY N IY
+clinic K L IH N IH K
+clinic's K L IH N IH K S
+clinical K L IH N AH K AH L
+clinical's K L IH N IH K AH L Z
+clinical(2) K L IH N IH K AH L
+clinically K L IH N IH K AH L IY
+clinically(2) K L IH N IH K L IY
+clinician K L IH N IH SH AH N
+clinicians K L IH N IH SH AH N Z
+clinics K L IH N IH K S
+clink K L IH NG K
+clinkenbeard K L IH NG K EH N B ER D
+clinkscale K L IH NG K S K EY L
+clinkscales K L IH NG K S K EY L Z
+clint K L IH N T
+clinton K L IH N T AH N
+clinton's K L IH N T AH N Z
+clintonite K L IH N T AH N AY T
+clintonites K L IH N T AH N AY T S
+clintonomics K L IH N T AH N AA M IH K S
+clintons K L IH N T AH N Z
+clintons' K L IH N T AH N Z
+clio K L IY OW
+clip K L IH P
+clipboard K L IH P B AO R D
+clippard K L IH P ER D
+clipped K L IH P T
+clipper K L IH P ER
+clippers K L IH P ER Z
+clipping K L IH P IH NG
+clippinger K L IH P IH NG ER
+clippings K L IH P IH NG Z
+clips K L IH P S
+clique K L IY K
+cliques K L IH K S
+clites K L AY T S
+clitoris K L AY T AO R IH S
+clive K L AY V
+cliver K L AY V ER
+cloak K L OW K
+cloaked K L OW K T
+cloaking K L OW K IH NG
+cloakroom K L OW K R UW M
+clobber K L AA B ER
+clobbered K L AA B ER D
+clobbering K L AA B ER IH NG
+clock K L AA K
+clock's K L AA K S
+clocked K L AA K T
+clocker K L AA K ER
+clockers K L AA K ER Z
+clocking K L AA K IH NG
+clocks K L AA K S
+clockwise K L AA K W AY Z
+clockwork K L AA K W ER K
+clodfelter K L AA D F EH L T ER
+clodoveo K L OW D OW V IY OW
+cloe K L OW
+cloer K L OW ER
+cloey K L OW IY
+clog K L AA G
+clogged K L AO G D
+clogging K L AA G IH NG
+clogging(2) K L AO G IH NG
+clogs K L AA G Z
+clogston K L AA G S T AH N
+cloherty K L AA HH ER T IY
+clohessy K L AA HH IH S IY
+cloister K L OY S T ER
+cloistered K L OY S T ER D
+cloisters K L OY S T ER Z
+cloke K L OW K
+clomipramine K L OW M IH P R AH M AY N
+clonch K L AA N CH
+clone K L OW N
+cloned K L OW N D
+clones K L OW N Z
+clones' K L OW N Z
+clonidine K L AA N IH D IY N
+cloning K L OW N IH NG
+cloninger K L OW N IH NG ER
+clonts K L AA N T S
+clontz K L AA N T S
+cloonan K L UW N AH N
+clooney K L UW N IY
+clootie K L UW T IY
+clopper K L AA P ER
+clopton K L AA P T AH N
+clore K L AO R
+clore's K L AO R Z
+clorinda K L AO R IY N D AH
+clorox K L AO R AA K S
+clos K L AA S
+close K L OW S
+close(2) K L OW Z
+close-up K L OW S AH P
+closed K L OW Z D
+closedown K L OW Z D AW N
+closedowns K L OW Z D AW N Z
+closely K L OW S L IY
+closeness K L OW S N IH S
+closer K L OW S ER
+closer(2) K L OW Z ER
+closes K L OW Z IH Z
+closest K L OW S AH S T
+closet K L AA Z AH T
+closeted K L AA Z AH T IH D
+closets K L AA Z AH T S
+closeup K L OW S AH P
+closeups K L OW S AH P S
+closing K L OW Z IH NG
+closings K L OW Z IH NG Z
+closs K L AO S
+closser K L AO S ER
+closson K L AA S AH N
+closure K L OW ZH ER
+closures K L OW ZH ER Z
+clot K L AA T
+clotfelter K L AA T F EH L T ER
+cloth K L AO TH
+clothe K L OW DH
+clothed K L OW DH D
+clothes K L OW DH Z
+clothes(2) K L OW Z
+clotheshorse K L OW Z HH AO R S
+clothestime K L OW DH Z T AY M
+clothier K L OW DH Y ER
+clothiers K L OW DH Y ER Z
+clothilda K L AH TH IH L D AH
+clothilde K L AA TH IH L D
+clothing K L OW DH IH NG
+cloths K L AO TH S
+clotilda K L AH T IH L D AH
+clots K L AA T S
+clott K L AA T
+clotted K L AA T AH D
+clotted(2) K L AA T IH D
+clotting K L AA T IH NG
+cloture K L OW CH ER
+clouatre K L AW AH T R
+cloud K L AW D
+cloudburst K L AW D B ER S T
+clouded K L AW D IH D
+cloudiness K L AW D IY N IH S
+clouding K L AW D IH NG
+cloudless K L AW D L AH S
+clouds K L AW D Z
+cloudy K L AW D IY
+clough K L AW
+clougherty K L AW ER T IY
+clouse K L AW S
+clouser K L AW S ER
+clout K L AW T
+clouthier K L AW TH IY ER
+clouthier(2) K L OW TH IY ER
+clouthier(3) K L OW DH IY ER
+cloutier K L AW T IY ER
+clover K L OW V ER
+cloverleaf K L OW V ER L IY F
+cloves K L OW V Z
+clovis K L OW V IH S
+clow K L OW
+cloward K L OW W ER D
+clowdus K L AW D IH S
+clower K L AW ER
+clowers K L AW ER Z
+clowes K L AW Z
+clown K L AW N
+clowney K L AW N IY
+clowning K L AW N IH NG
+clowns K L AW N Z
+cloy K L OY
+cloyd K L OY D
+cloying K L OY IH NG
+clozapine K L OW Z AH P AY N
+club K L AH B
+club's K L AH B Z
+clubb K L AH B
+clubbed K L AH B D
+clubbing K L AH B IH NG
+clubby K L AH B IY
+clubhouse K L AH B HH AW S
+clubhouses K L AH B HH AW S IH Z
+clubs K L AH B Z
+clucas K L UW K AH Z
+cluck K L AH K
+cluckey K L AH K IY
+clucking K L AH K IH NG
+clucks K L AH K S
+clue K L UW
+clued K L UW D
+clueless K L UW L AH S
+clues K L UW Z
+cluett K L UW IH T
+cluff K L AH F
+clugston K L AH G S T AH N
+cluj K L UW JH
+cluj(2) S IY EH L Y UW JH EY
+clukey K L UW K IY
+clum K L AH M
+clump K L AH M P
+clumping K L AH M P IH NG
+clumps K L AH M P S
+clumpy K L AH M P IY
+clumsily K L AH M S AH L IY
+clumsiness K L AH M Z IY N AH S
+clumsy K L AH M Z IY
+clune K L UW N
+clung K L AH NG
+clunk K L AH NG K
+clunker K L AH NG K ER
+clunkers K L AH NG K ER Z
+clunks K L AH NG K S
+clunky K L AH NG K IY
+cluny K L UW N IY
+cluster K L AH S T ER
+clustered K L AH S T ER D
+clustering K L AH S T ER IH NG
+clusters K L AH S T ER Z
+clutch K L AH CH
+clutched K L AH CH T
+clutches K L AH CH AH Z
+clutches(2) K L AH CH IH Z
+clutching K L AH CH IH NG
+clute K L UW T
+clutter K L AH T ER
+cluttered K L AH T ER D
+cluttering K L AH T ER IH NG
+clutts K L AH T S
+clyatt K L AY AH T
+clyburn K L IH B ER N
+clyde K L AY D
+clydesdale K L AY D Z D EY L
+clymene K L IH M IY N
+clymer K L AY M ER
+clyne K L AY N
+clyte K L AY T
+clytie K L IH T IY
+clyve K L AY V
+cmos S IY M OW S
+cmos(2) S IY EH M OW EH S
+cmu S IY EH M Y UW
+cmx K AH M EH K S
+cnn S IY EH N EH N
+cnn's S IY EH N EH N Z
+cnn.com S IY EH N EH N D AA T K AA M
+cnnfn S IY EH N EH N EH F EH N
+co K OW
+co-op K OW AA P
+co-operative K OW AA P ER AH T IH V
+co-operative(2) K OW AA P R AH T IH V
+co-opt K OW AA P T
+co-opted K OW AA P T AH D
+co-wife K OW W AY F
+co. K OW
+co.(2) K AH P AH N IY
+coach K OW CH
+coach's K OW CH IH Z
+coached K OW CH T
+coaches K OW CH IH Z
+coaching K OW CH IH NG
+coachman K OW CH M AH N
+coad K OW D
+coady K OW D IY
+coagulate K OW AE G Y AH L EY T
+coagulating K OW AE G Y AH L EY T IH NG
+coagulation K OW AE G Y AH L EY SH AH N
+coakley K OW K L IY
+coal K OW L
+coal's K OW L Z
+coale K OW L
+coalesce K OW AH L EH S
+coalesced K OW AH L EH S T
+coalescence K OW AH L EH S AH N S
+coalesces K OW AH L EH S IH Z
+coalescing K OW AH L EH S IH NG
+coalition K OW AH L IH SH AH N
+coalition's K OW AH L IH SH AH N Z
+coalitions K OW AH L IH SH AH N Z
+coals K OW L Z
+coalson K OW L S AH N
+coan K OW N
+coar K AO R
+coarse K AO R S
+coarsening K AO R S IH N IH NG
+coarser K AO R S ER
+coarticulate K OW AA R T IH K Y UW L EY T
+coarticulated K OW AA R T IH K Y UW L EY T AH D
+coarticulates K OW AA R T IH K Y UW L EY T S
+coarticulating K OW AA R T IH K Y UW L EY T IH NG
+coarticulation K OW AA R T IH K Y UW L EY SH AH N
+coast K OW S T
+coast's K OW S T S
+coastal K OW S T AH L
+coastal's K OW S T AH L Z
+coastamerica K OW S T AH M EH R IH K AH
+coastamerica's K OW S T AH M EH R IH K AH Z
+coasted K OW S T IH D
+coaster K OW S T ER
+coasters K OW S T ER Z
+coasting K OW S T IH NG
+coastline K OW S T L AY N
+coastlines K OW S T L AY N Z
+coasts K OW S T S
+coasts(2) K OW S S
+coasts(3) K OW S
+coat K OW T
+coat's K OW T S
+coate K OW EY T
+coated K OW T AH D
+coated(2) K OW T IH D
+coates K OW EY T S
+coatesville K OW T S V IH L
+coating K OW T IH NG
+coatings K OW T IH NG Z
+coatney K OW T N IY
+coats K OW T S
+coattail K OW T T EY L
+coattails K OW T T EY L Z
+coauthor K OW AA TH ER
+coauthored K OW AA TH ER D
+coauthoring K OW AA TH ER IH NG
+coauthors K OW AA TH ER Z
+coax K OW K S
+coaxed K OW K S T
+coaxes K OW K S IH Z
+coaxial K OW AE K S IY AH L
+coaxing K OW K S IH NG
+coaxum K OW K S AH M
+cob K AA B
+cobain K OW B EY N
+cobain's K OW B EY N Z
+cobaine K OW B EY N
+cobalt K OW B AO L T
+cobaugh K AA B AO
+cobb K AA B
+cobbett K AA B IH T
+cobbins K AA B IH N Z
+cobble K AA B AH L
+cobbled K AA B AH L D
+cobbler K AA B L ER
+cobbler's K AA B L ER Z
+cobblers K AA B L ER Z
+cobblestone K AA B AH L S T OW N
+cobblestones K AA B AH L S T OW N Z
+cobbs K AA B Z
+cobe K OW B
+coben K OW B AH N
+cobepa K OW B EY P AH
+coberly K OW B ER L IY
+cobern K AA B ER N
+cobert K AA B ER T
+cobey K OW B IY
+cobia K OW B IY AH
+cobian K OW B IY AH N
+cobin K OW B IH N
+coble K OW B AH L
+cobleigh K AA B L AH
+coblentz K AA B L IH N T S
+cobler K OW B AH L ER
+cobler(2) K OW B L ER
+cobliner K AA B L AY N ER
+cobo K OW B OW
+cobol K OW B AO L
+cobos K OW B OW Z
+cobra K OW B R AH
+cobras K OW B R AH Z
+cobre K AA B R AH
+cobrin K AA B R IH N
+cobs K AA B Z
+coburn K OW B ER N
+cobweb K AA B W EH B
+cobwebs K AA B W EH B Z
+coby K OW B IY
+coca K OW K AH
+cocaine K OW K EY N
+cocanino K OW K AH N IY N OW
+cocanougher K AA K AH N AH F ER
+cocca K OW K AH
+coccaro K OW K AA R OW
+cocchi K OW K IY
+coccia K OW CH AH
+cocco K OW K OW
+coccus K AA K AH S
+cochairman K OW CH EH R M AH N
+cochenour K AA SH IH N UH R
+cochin K OW CH IH N
+cochlea K AA K L IY AH
+cochlear K AA K L IY ER
+cochles K AA K AH L Z
+cochran K AA K R AH N
+cochran's K AA K R AH N Z
+cochrane K AA K R AH N
+cochranton K AA K R AH N T AH N
+cock K AA K
+cockamamie K AO K AH M EY M IY
+cockatoo K AA K AH T UW
+cockatoos K AA K AH T UW Z
+cockburn K AA K B ER N
+cockburn's K OW B ER N Z
+cockburn's(2) K AA K B ER N Z
+cocke K OW K
+cocked K AA K T
+cocked(2) K AO K T
+cocker K AA K ER
+cockerell K AA K ER EH L
+cockerham K AA K ER HH AE M
+cockerill K AA K ER IH L
+cockey K AA K IY
+cockeyed K AA K AY D
+cockfield K AA K F IY L D
+cockiness K AA K IY N AH S
+cocking K AA K IH NG
+cockle K AA K AH L
+cockles K AA K AH L Z
+cocklin K AA K L IH N
+cockman K AA K M AH N
+cockney K AA K N IY
+cockpit K AA K P IH T
+cockpits K AA K P IH T S
+cockran K AA K R AH N
+cockrell K AA K R AH L
+cockrill K AA K R AH L
+cockroach K AA K R OW CH
+cockroaches K AA K R OW CH IH Z
+cockroft K AA K R AH F T
+cockrum K AA K R AH M
+cocks K AA K S
+cocktail K AA K T EY L
+cocktails K AA K T EY L Z
+cockwell K AA K W EH L
+cockwell's K AA K W EH L Z
+cocky K AA K IY
+coco K OW K OW
+cocoa K OW K OW
+cocoanuts K OW K OW N AH T S
+cocom K OW K AA M
+coconino K OW K AH N IY N OW
+coconut K OW K AH N AH T
+coconuts K OW K AH N AH T S
+cocoon K AH K UW N
+cocooning K AH K UW N IH NG
+cocoons K AH K UW N Z
+cocos K OW K OW Z
+cocozza K OW K OW T S AH
+cocuzza K OW K UW T S AH
+cod K AA D
+cod(2) S IY OW D IY
+coda K OW D AH
+codag K OW D AE G
+coday K OW D EY
+codd K AA D
+codding K AA D IH NG
+coddington K AA D IH NG T AH N
+coddle K AA D AH L
+coddled K AA D AH L D
+coddling K AA D AH L IH NG
+coddling(2) K AA D L IH NG
+code K OW D
+code's K OW D Z
+codebreaker K OW D B R EY K ER
+codebreakers K OW D B R EY K ER Z
+coded K OW D IH D
+codelco K OW D EH L K OW
+coder K OW D ER
+coderre K AH D EH R
+codes K OW D Z
+codesa K OW D EH S AH
+codification K AA D AH F AH K EY SH AH N
+codified K AA D AH F AY D
+codifies K OW D AH F AY Z
+codify K OW D AH F AY
+codifying K OW D AH F AY IH NG
+coding K OW D IH NG
+codispoti K OW D IY S P OW T IY
+codlin K AA D L IH N
+codner K AA D N ER
+codrescu K AH D R EH S K Y UW
+codrescu's K AH D R EH S K Y UW Z
+cody K OW D IY
+coe K OW
+coeburn K OW B ER N
+coed K OW EH D
+coed(2) K OW D
+coeds K OW EH D Z
+coeducational K OW EH JH AH K EY SH AH N AH L
+coefficient K OW AH F IH SH AH N T
+coefficients K OW AH F IH SH AH N T S
+coehlo K OW L OW
+coelacanth S IY L AH K AE N TH
+coelho K OW EH L OW
+coello K OW EH L OW
+coen K OW IH N
+coenen K OW IY N AH N
+coenzyme K OW EH N Z AY M
+coequal K OW IY K W AH L
+coerce K OW ER S
+coerced K OW ER S T
+coercing K OW ER S IH NG
+coercion K OW ER SH AH N
+coercive K OW ER S IH V
+coeur K UW R
+coexist K OW AH G Z IH S T
+coexisted K OW AH G Z IH S T AH D
+coexistence K OW IH G Z IH S T AH N S
+coexisting K OW IH G Z IH S T IH NG
+coey K OW IY
+cofer K OW F ER
+coffaro K OW F AA R OW
+coffee K AA F IY
+coffee's K AA F IY Z
+coffee's(2) K AO F IY Z
+coffee(2) K AO F IY
+coffeehouse K AO F IY HH AW S
+coffeehouses K AO F IY HH AW S IH Z
+coffeen K AH F IY N
+coffees K AO F IY Z
+coffel K AA F AH L
+coffelt K AA F IH L T
+coffer K AO F ER
+coffers K AA F ER Z
+coffers(2) K AO F ER Z
+coffey K AA F IY
+coffield K AA F IY L D
+coffin K AO F IH N
+coffing K AO F IH NG
+coffins K AO F IH N Z
+cofflin K AO F L IH N
+coffman K AO F M AH N
+cofide K OW F AY D
+cofield K OW F IY L D
+cofounder K OW F AW N D ER
+cog K AO G
+cogan K OW G AH N
+cogar K OW G ER
+cogbill K AA G B IH L
+cogburn K AA G B ER N
+cogdell K AA G D AH L
+cogdill K AA G D AH L
+cogeco K OW JH EH K OW
+cogema K OW G M AA
+cogency K OW JH AH N S IY
+cogenerate K OW JH EH N ER EY T
+cogenerated K OW JH EH N ER EY T IH D
+cogeneration K OW JH EH N ER EY SH AH N
+cogenerator K OW JH EH N ER EY T ER
+cogenerators K OW JH EH N ER EY T ER Z
+cogent K OW JH AH N T
+coger K OW JH ER
+coggeshall K AA G IH SH AO L
+coggin K AA G IH N
+coggins K AA G IH N Z
+coghill K AA G HH IH L
+coghlan K AA G L AH N
+cogitate K AA JH IH T EY T
+cogitation K AA JH IH T EY SH AH N
+cogley K AA G L IY
+coglianese K OW G L IY AH N EY Z IY
+cogliano K OW G L IY AA N OW
+cognac K OW N Y AE K
+cognac(2) K AA N Y AE K
+cognetics K AA G N EH T IH K S
+cognex K AA G N EH K S
+cognition K AA G N IH SH AH N
+cognitive K AA G N IH T IH V
+cognizance K AA G N AH Z AH N S
+cognizant K AA G N AH Z AH N T
+cognoscenti K AA G N AO SH EH N T IY
+cogswell K AA G S W EH L
+cohabit K OW HH AE B IH T
+cohabitation K OW HH AE B AH T EY SH AH N
+cohabiting K OW HH AE B IH T IH NG
+cohan K OW HH AH N
+cohasset K OW HH AE S AH T
+cohea K AA HH IY AH
+cohee K AA HH IY
+cohen K OW AH N
+cohen's K OW AH N Z
+cohenour K AH HH EH N ER
+cohentannoudji K OW AH N T AH N UW JH IY
+cohere K OW HH IH R
+cohered K OW HH IH R D
+coherence K OW HH IH R AH N S
+coherent K OW HH IH R AH N T
+coherently K OW HH IY R AH N T L IY
+coheres K OW HH IH R Z
+cohesion K OW HH IY ZH AH N
+cohesive K OW HH IY S IH V
+cohesively K OW HH IY S IH V L IY
+cohesiveness K OW HH IY S IH V N AH S
+cohiba K OW HH IY B AH
+cohick K AA HH IH K
+cohill K OW HH IH L
+cohn K OW N
+coho K OW HH OW
+cohoon K AH HH UW N
+cohort K OW HH AO R T
+cohorts K OW HH AO R T S
+cohost K OW HH OW S T
+cohosts K OW HH OW S T S
+cohosts(2) K OW HH OW S S
+cohosts(3) K OW HH OW S
+cohr K AO R
+cohron K AA R AH N
+cohrs K AO R Z
+coia K OW Y AH
+coiffe K OY F
+coiffed K OY F T
+coil K OY L
+coile K OY L
+coiled K OY L D
+coils K OY L Z
+coin K OY N
+coin's K OY N Z
+coinage K OY N IH JH
+coincide K OW IH N S AY D
+coincided K OW AH N S AY D AH D
+coincidence K OW IH N S IH D AH N S
+coincidences K OW IH N S AH D AH N S IH Z
+coincident K OW IH N S AH D AH N T
+coincidental K OW IH N S AH D EH N T AH L
+coincidentally K OW IH N S IH D EH N T AH L IY
+coincidentally(2) K OW IH N S IH D EH N AH L IY
+coincides K OW IH N S AY D Z
+coinciding K OW AH N S AY D IH NG
+coined K OY N D
+coiner K OY N ER
+coining K OY N IH NG
+coins K OY N Z
+coinsurance K OW IH N SH ER AH N S
+cointreau K AO N T R OW
+coipa K OY P AH
+coiro K OY R OW
+coit K OY T
+coitsville K OY T S V IH L
+coitus K OY T AH S
+cojimar K OW JH IH M AA R
+cojimar's K OW JH IH M AA R Z
+cojuangco K OW W AA NG K OW
+cojuangco(2) K OW JH W AE NG K OW
+coke K OW K
+coke's K OW K S
+coker K OW K ER
+cokes K OW K S
+cokie K OW K IY
+cokie's K OW K IY Z
+coking K OW K IH NG
+cokley K AA K L IY
+cola K OW L AH
+cola's K OW L AH Z
+colab K OW L AE B
+colabella K OW L AH B EH L AH
+colaianni K OW L AA Y AA N IY
+colaizzi K OW L EY Z IY
+colaluca K OW L AH L UW K AH
+colan K OW L AH N
+colander K AA L AH N D ER
+colanders K AA L AH N D ER Z
+colangelo K OW L AA NG G EH L OW
+colantonio K OW L AA N T OW N IY OW
+colantuono K OW L AA N T W OW N OW
+colao K OW L AW
+colarusso K OW L AA R UW S OW
+colas K OW L AH S
+colasanti K OW L AH S AE N T IY
+colasurdo K OW L AA S UH R D OW
+colavito K OW L AA V IY T OW
+colaw K OW L AO
+colbath K OW L B AH TH
+colbaugh K OW L B AO
+colbeck K AA L B EH K
+colberg K AA L B ER G
+colbern K OW L B ER N
+colbert K OW L B ER T
+colborn K OW L B AO R N
+colborne K OW L B AO R N
+colburn K OW L B ER N
+colby K OW L B IY
+colby's K OW L B IY Z
+colbys K OW L B IY Z
+colchicine K AO L CH AH S IY N
+colclasure K OW L K L AA ZH ER
+colclough K OW L K L AW
+colcord K OW L K ER D
+cold K OW L D
+cold-bay K OW L D B EY
+cold-blood K OW L D B L AH D
+cold-blooded K OW L D B L AH D AH D
+colden K OW L D AH N
+colder K OW L D ER
+coldest K OW L D AH S T
+coldiron K OW L D ER AA N
+coldly K OW L D L IY
+coldness K OW L D N AH S
+coldren K OW L D ER AH N
+colds K OW L D Z
+coldwater K OW L D W AO T ER
+coldwell K OW L D W EH L
+cole K OW L
+cole's K OW L Z
+colebank K OW L B AE NG K
+colebreath K OW L B R EH TH
+colebrook K OW L B R UH K
+coleco K OW L EH K OW
+coleco's K OW L EH K OW Z
+colee K OW L IY
+coleen K AO L IY N
+colegrove K OW L G R OW V
+colella K OW L EH L AH
+colello K OW L EH L OW
+coleman K OW L M AH N
+coleman's K OW L M AH N Z
+colen K OW L AH N
+coler K OW L ER
+coleridge K OW L R IH JH
+coles K OW L Z
+coleslaw K OW L S L AA
+coleson K AA L IH S AH N
+coleson(2) K OW L S AH N
+colestipol K OW L S T IH P AA L
+colestock K OW L S T AA K
+coletta K OW L EH T AH
+colette K OW L EH T
+coletti K OW L EH T IY
+coleus K OW L IY AH S
+coleville K OW L V IH L
+coley K OW L IY
+colfer K OW L F ER
+colford K OW L F ER D
+colgan K OW L G AH N
+colgate K OW L G EY T
+colgate's K OW L G EY T S
+colgin K OW L JH IH N
+colglazier K OW L G L AH Z IY ER
+colgrove K OW L G R AH V
+coli K OW L IY
+colicchio K OW L IH K IY OW
+colier K OW L IY ER
+coliform K OW L AH F AO R M
+coliform(2) K AO L AH F AO R M
+coliforms K OW L AH F AO R M Z
+coliforms(2) K AO L AH F AO R M Z
+colin K OW L IH N
+colina K OW L IY N AH
+colinas K OW L IY N AH S
+coline K OW L IY N IY
+colino K OW L IY N OW
+colis K OW L IH S
+coliseum K AA L AH S IY AH M
+coll K AA L
+colla K OW L AH
+collaborate K AH L AE B ER EY T
+collaborated K AH L AE B ER EY T AH D
+collaborated(2) K AH L AE B ER EY T IH D
+collaborating K AH L AE B ER EY T IH NG
+collaboration K AH L AE B ER EY SH AH N
+collaborationist K AH L AE B ER EY SH AH N IH S T
+collaborations K AA L AH B ER EY SH AH N Z
+collaborative K AH L AE B ER EY T IH V
+collaborative(2) K AH L AE B R AH T IH V
+collaborator K AH L AE B ER EY T ER
+collaborators K AH L AE B ER EY T ER Z
+collado K OW L AA D OW
+collage K AH L AA ZH
+collagen K AA L AH G AH N
+collages K AH L AA ZH IH Z
+collamore K OW L AA M AO R
+collapse K AH L AE P S
+collapsed K AH L AE P S T
+collapses K AH L AE P S IH Z
+collapsible K AH L AE P S AH B AH L
+collapsing K AH L AE P S IH NG
+collar K AA L ER
+collarbone K AA L ER B OW N
+collard K AA L ER D
+collards K AA L ER D Z
+collared K AA L ER D
+collars K AA L ER Z
+collate K AH L EY T
+collateral K AH L AE T ER AH L
+collateralize K AH L AE T ER AH L AY Z
+collateralized K AH L AE T ER AH L AY Z D
+collazo K OW L AA Z OW
+colle K OW L
+colleague K AA L IY G
+colleague's K AA L IY G Z
+colleagues K AA L IY G Z
+colleagues' K AA L IY G Z
+collect K AH L EH K T
+collected K AH L EH K T AH D
+collectibility K AH L EH K T IH B IH L IH T IY
+collectible K AH L EH K T AH B AH L
+collectibles K AH L EH K T AH B AH L Z
+collecting K AH L EH K T IH NG
+collection K AH L EH K SH AH N
+collections K AH L EH K SH AH N Z
+collective K AH L EH K T IH V
+collectively K AH L EH K T IH V L IY
+collectives K AH L EH K T IH V Z
+collectivism K AH L EH K T IH V IH Z AH M
+collectivist K AH L EH K T IH V IH S T
+collectivization K AH L EH K T IH V IH Z EY SH AH N
+collectivize K AH L EH K T IH V AY Z
+collectivized K AH L EH K T IH V AY Z D
+collector K AH L EH K T ER
+collector's K AH L EH K T ER Z
+collector's(2) K L EH K T ER Z
+collector(2) K L EH K T ER
+collectors K AH L EH K T ER Z
+collectors' K AH L EH K T ER Z
+collectors'(2) K L EH K T ER Z
+collectors(2) K L EH K T ER Z
+collects K AH L EH K T S
+colledge K AA L IH JH
+colleen K AA L IY N
+college K AA L IH JH
+college's K AA L IH JH IH Z
+colleges K AA L IH JH IH Z
+colleges' K AA L IH JH IH Z
+collegeville K AA L AH JH V IH L
+collegial K AH L IY JH IY AH L
+collegiality K AH L IY JH IY AE L IH T IY
+collegian K AH L IY JH AH N
+collegians K AH L IY JH AH N Z
+collegiate K AH L IY JH IH T
+collen K AA L AH N
+collender K AA L AH N D ER
+coller K AA L ER
+colleran K AA L ER AE N
+collet K AA L IH T
+collett K AA L IH T
+colletta K OW L EH T AH
+collette K AH L EH T
+colletti K OW L EH T IY
+colleville K OW L V IH L
+colleville's K OW L V IH L Z
+colley K AA L IY
+colli K OW L IY
+collick K AA L IH K
+collide K AH L AY D
+collided K AH L AY D IH D
+collider K AH L AY D ER
+collides K AH L AY D Z
+colliding K AH L AY D IH NG
+collie K AA L IY
+collier K AA L Y ER
+collier's K AA L Y ER Z
+colliers K AA L Y ER Z
+collies K AA L IY Z
+colligan K AA L IH G AE N
+collignon K AH L IH G N AH N
+collin K AA L IH N
+colling K AA L IH NG
+collinge K AA L IH N JH
+collings K AA L IH NG Z
+collingsworth K AH L IH NG Z W ER TH
+collingwood K AA L IH NG W UH D
+collins K AA L IH N Z
+collins' K AA L IH N Z
+collins's K AA L IH N Z IH Z
+collins's(2) K AA L IH N Z
+collinson K AA L IH N S AH N
+collinsworth K AH L IH N S W ER TH
+collis K AA L IH S
+collision K AH L IH ZH AH N
+collisional K AH L IH ZH AH N AH L
+collisions K AH L IH ZH AH N Z
+collison K AA L IH S AH N
+collister K AA L IH S T ER
+colliver K AA L IH V ER
+collman K AA L M AH N
+collocation K AA L AH K EY SH AH N
+collodion K AH L OW D IY AH N
+colloid K AA L OY D
+colloidal K AH L OY D AH L
+collom K AA L AH M
+collomb K AA L AA M
+collopy K AH L OW P IY
+colloquial K AH L OW K W IY AH L
+colloquium K AH L OW K W IY AH M
+colloquy K AA L AH K W IY
+collor K AA L ER
+collor's K AA L ER Z
+collor(2) K AO L ER
+collosio K AH L OW S IY OW
+collosio's K AH L OW S IY OW Z
+collude K AH L UW D
+colluded K AH L UW D IH D
+colluding K AH L UW D IH NG
+collum K AA L AH M
+collums K AA L AH M Z
+collura K AA L UH R AH
+collusion K AH L UW ZH AH N
+collusive K AH L UW S IH V
+collver K AA L V ER
+colly K AA L IY
+collyer K AA L IY ER
+colm K OW L M
+colman K OW L M AH N
+colmenero K OW L M EY N EH R OW
+colmer K OW M ER
+colo K OW L OW
+colodny K AH L AA D N IY
+cologne K AH L OW N
+coloma K OW L OW M AH
+colomb K AA L AH M
+colombari K AA L AA M B AA R IY
+colombe K OW L OW M B IY
+colombia K AH L AH M B IY AH
+colombia's K AH L AH M B IY AH Z
+colombian K AH L AH M B IY AH N
+colombians K AH L AH M B IY AH N Z
+colombo K AH L AH M B OW
+colombo's K AH L AH M B OW Z
+colon K OW L AH N
+colonel K ER N AH L
+colonel's K ER N AH L Z
+colonels K ER N AH L Z
+colonia K AH L OW N IY AH
+colonial K AH L OW N IY AH L
+colonial's K AH L OW N IY AH L Z
+colonialism K AH L OW N IY AH L IH Z AH M
+colonialist K AH L OW N IY AH L IH S T
+colonialists K AH L OW N IY AH L IH S T S
+colonialists(2) K AH L OW N IY AH L IH S S
+colonialists(3) K AH L OW N IY AH L IH S
+colonials K AH L OW N IY AH L Z
+colonies K AA L AH N IY Z
+colonist K AA L AH N IH S T
+colonists K AA L AH N IH S T S
+colonists(2) K AA L AH N IH S S
+colonists(3) K AA L AH N IH S
+colonization K AA L AH N IH Z EY SH AH N
+colonize K AA L AH N AY Z
+colonized K AA L AH N AY Z D
+colonizer K AA L AH N AY Z ER
+colonizers K AA L AH N AY Z ER Z
+colonna K OW L OW N AH
+colonnade K AA L AH N EY D
+colonus K AH L OW N AH S
+colony K AA L AH N IY
+colony's K AA L AH N IY Z
+colopy K AH L OW P IY
+color K AH L ER
+color(2) K AO L ER
+coloradan K AA L ER AA D AH N
+coloradans K AA L ER AA D AH N Z
+colorado K AA L ER AA D OW
+colorado's K AA L ER AA D OW Z
+colorado's(2) K AA L ER AE D OW Z
+colorado(2) K AA L ER AE D OW
+coloration K AH L ER EY SH AH N
+coloratura K AH L ER AH T UH R AH
+colorblind K AH L ER B L AY N D
+colorcraft K AH L ER K R AE F T
+colorectal K OW L OW R EH K T AH L
+colored K AH L ER D
+coloreds K AA L ER AH D Z
+colorfast K AH L ER F AE S T
+colorful K AH L ER F AH L
+colorfully K AH L ER F L IY
+coloring K AH L ER IH NG
+coloristic K AH L ER IH S T IH K
+colorization K AH L ER AH Z EY SH AH N
+colorize K AH L ER AY Z
+colorized K AH L ER AY Z D
+colorizing K AH L ER AY Z IH NG
+colorless K AH L ER L AH S
+colorocs K AH L ER AA K S
+coloroll K AH L ER OW L
+colors K AH L ER Z
+colorwatch K AH L ER W AA CH
+colosi K AH L OW S IY
+colosimo K OW L OW S IY M OW
+colosio K AH L OW S IY OW
+colosio's K AH L OW S IY OW Z
+colossal K AH L AA S AH L
+colossally K AH L AA S AH L IY
+colosseum K AA L AH S IY AH M
+colossus K AH L AA S AH S
+coloured K AH L ER D
+colpepper K AH L P EH P ER
+colpitts K OW L P IH T S
+colquitt K OW L K W IH T
+colson K OW L S AH N
+colston K OW L S T AH N
+colstrip K OW L S T R IH P
+colt K OW L T
+colt's K OW L T S
+coltec K OW L T EH K
+colter K OW L T ER
+coltharp K OW L TH AA R P
+coltie K OW L T IY
+colton K OW L T AH N
+coltrain K OW L T R EY N
+coltrane K OW L T R AH N
+coltrane's K OW L T R AH N Z
+coltrane's(2) K OW L T R EY N Z
+coltrane(2) K OW L T R EY N
+coltrin K OW L T R IH N
+colts K OW L T S
+coltsfoot K OW L T S F UH T
+colucci K OW L UW CH IY
+coluccio K OW L UW CH IY OW
+columba K OW L AH M B AH
+columbia K AH L AH M B IY AH
+columbia's K AH L AH M B IY AH Z
+columbian K OW L AH M B IY AH N
+columbians K OW L AH M B IY AH N Z
+columbine K AA L AH M B AY N
+columbines K AA L AH M B AY N Z
+columbo K OW L AH M B OW
+columbus K AH L AH M B AH S
+columbus' K AH L AH M B AH S
+columbus's K AH L AH M B AH S IH Z
+column K AA L AH M
+columned K AA L AH M D
+columnist K AA L AH M N AH S T
+columnists K AA L AH M N AH S T S
+columnists(2) K AA L AH M N AH S S
+columnists(3) K AA L AH M N AH S
+columns K AA L AH M Z
+colunga K OW L UW NG G AH
+colussy K AH L UW S IY
+colvard K AA L V ER D
+colver K OW L V ER
+colvert K AA L V ER T
+colville K AA L V IH L
+colvin K OW L V IH N
+colwell K OW L W EH L
+colyer K OW L IY ER
+com K AA M
+com's K AA M Z
+coma K OW M AH
+comair K AA M EH R
+coman K OW M AH N
+comanche K AH M AE N CH IY
+comanches K AH M AE N CH IY Z
+comandante K OW M AH N D AA N T EY
+comandantes K OW M AH N D AA N T EH Z
+comandeer K AA M AH N D IY R
+comandeered K AA M AH N D IY R D
+comandeers K AA M AH N D IY R Z
+comarco K OW M AA R K OW
+comas K OW M AH Z
+comatose K OW M AH T OW S
+comb K OW M
+combat K AA M B AE T
+combat(2) K AH M B AE T
+combatant K AH M B AE T AH N T
+combatants K AH M B AE T AH N T S
+combating K AH M B AE T IH NG
+combative K AH M B AE T IH V
+combative(2) K AA M B AE T IH V
+combativeness K AH M B AE T IH V N AH S
+combats K AH M B AE T S
+combatting K AH M B AE T IH NG
+combe K OW M
+combed K OW M D
+combee K AA M B IY
+comber K OW M ER
+combes K OW M Z
+combest K OW M IH S T
+combinability K AH M B AY N AH B IH L AH T IY
+combinability(2) K AH M B IH N AH B IH L AH T IY
+combinable K AH M B AY N AH B AH L
+combination K AA M B AH N EY SH AH N
+combinations K AA M B AH N EY SH AH N Z
+combine K AA M B AY N
+combine(2) K AH M B AY N
+combined K AH M B AY N D
+combines K AH M B AY N Z
+combing K OW M IH NG
+combining K AH M B AY N IH NG
+combo K AA M B OW
+combs K OW M Z
+combust K AH M B AH S T
+combustable K AH M B AH S T AH B AH L
+combustion K AH M B AH S CH AH N
+comby K AA M B IY
+comcast K AA M K AE S T
+comcast's K AA M K AE S T S
+comdata K AA M D AE D AH
+comdata(2) K AA M D EY D AH
+comden K AA M D IH N
+comdex K AA M D AH K S
+comdisco K AA M D IH S K OW
+come K AH M
+come-on K AH M AA N
+come-ons K AH M AA N Z
+comeau K AH M OW
+comeaux K AH M OW
+comeback K AH M B AE K
+comebacks K AH M B AE K S
+comecon K AA M AH K AA N
+comedian K AH M IY D IY AH N
+comedian's K AH M IY D IY AH N Z
+comedians K AH M IY D IY AH N Z
+comedic K AH M IY D IH K
+comedienne K AH M IY D IY EH N
+comedies K AA M AH D IY Z
+comedown K AH M D AW N
+comedy K AA M AH D IY
+comedy's K AA M AH D IY Z
+comegys K AA M IH JH IY Z
+comella K OW M EH L AH
+comely K AH M L IY
+comer K AH M ER
+comerford K AH M ER F ER D
+comerica K AH M EH R IH K AH
+comers K AH M ER Z
+comes K AH M Z
+comet K AA M AH T
+comet's K AA M AH T S
+cometary K AA M AH T EH R IY
+cometh K AH M IH TH
+cometra K OW M EH T R AH
+comets K AA M AH T S
+comeuppance K AH M AH P AH N S
+comex K AA M EH K S
+comex's K AA M EH K S IH Z
+comfed K AA M F EH D
+comfinance K AA M F IH N AH N S
+comfort K AH M F ER T
+comfortable K AH M F ER T AH B AH L
+comfortably K AH M F ER T AH B L IY
+comforted K AH M F ER T IH D
+comforter K AH M F ER T ER
+comforters K AH M F ER T ER Z
+comforting K AH M F ER T IH NG
+comforts K AH M F ER T S
+comfrey K AH M F R IY
+comfy K AH M F IY
+comic K AA M IH K
+comical K AA M IH K AH L
+comically K AA M IH K AH L IY
+comically(2) K AA M IH K L IY
+comicopia K AA M IH K OW P IY AH
+comics K AA M IH K S
+comin' K AH M IH N
+cominco K OW M IH NG K OW
+coming K AH M IH NG
+comings K AH M IH NG Z
+comino K AH M IY N OW
+comins K OW M IH N Z
+cominsky K AH M IH N S K IY
+comiskey K OW M IH S K IY
+comitatus K AO M AH T EY T AH S
+comito K OW M IY T OW
+comity K OW M IH T IY
+comley K AA M L IY
+comly K AA M L IY
+comma K AA M AH
+commack K AA M AH K
+command K AH M AE N D
+command's K AH M AE N D Z
+commandant K AA M AH N D AA N T
+commanded K AH M AE N D AH D
+commanded(2) K AH M AE N D IH D
+commandeer K AA M AH N D IH R
+commandeered K AA M AH N D IH R D
+commander K AH M AE N D ER
+commander's K AH M AE N D ER Z
+commanders K AH M AE N D ER Z
+commanding K AH M AE N D IH NG
+commandment K AH M AE N D M AH N T
+commandments K AH M AE N D M AH N T S
+commando K AH M AE N D OW
+commandos K AH M AE N D OW Z
+commands K AH M AE N D Z
+commas K AA M AH Z
+commemorate K AH M EH M ER EY T
+commemorated K AH M EH M ER EY T IH D
+commemorates K AH M EH M ER EY T S
+commemorating K AH M EH M ER EY T IH NG
+commemoration K AH M EH M ER EY SH AH N
+commemorations K AH M EH M ER EY SH AH N Z
+commemorative K AH M EH M R AH T IH V
+commemorative(2) K AH M EH M ER EY T IH V
+commence K AH M EH N S
+commenced K AH M EH N S T
+commencement K AH M EH N S M AH N T
+commences K AH M EH N S AH Z
+commencing K AH M EH N S IH NG
+commend K AH M EH N D
+commendable K AH M EH N D AH B AH L
+commendation K AA M AH N D EY SH AH N
+commended K AH M EH N D IH D
+commending K AH M EH N D IH NG
+commends K AH M EH N D Z
+commensurate K AH M EH N S ER AH T
+commensurate(2) K AH M EH N S ER IH T
+commensurately K AH M EH N S ER AH T L IY
+commensurately(2) K AH M EH N SH ER AH T L IY
+comment K AA M EH N T
+commentaries K AA M AH N T EH R IY Z
+commentary K AA M AH N T EH R IY
+commentator K AA M AH N T EY T ER
+commentator's K AA M AH N T EY T ER Z
+commentators K AA M AH N T EY T ER Z
+commented K AA M EH N T AH D
+commenter K AA M EH N T ER
+commenters K AA M EH N T ER Z
+commenting K AA M EH N T IH NG
+comments K AA M EH N T S
+commerce K AA M ER S
+commerce's K AA M ER S IH Z
+commercebancorp K AA M ER S B AE N K AO R P
+commercial K AH M ER SH AH L
+commercial's K AH M ER SH AH L Z
+commerciale K AH M ER S IY AE L
+commerciale's K AH M ER S IY AE L Z
+commerciale's(2) K OW M EH R S IY AE L EY Z
+commercialism K AH M ER SH AH L IH Z AH M
+commercialization K AH M ER SH AH L IH Z EY SH AH N
+commercialize K AH M ER SH AH L AY Z
+commercialized K AH M ER SH AH L AY Z D
+commercializing K AH M ER SH AH L AY Z IH NG
+commercially K AH M ER SH AH L IY
+commercials K AH M ER SH AH L Z
+commerford K AA M ER F ER D
+commerical K AH M ER SH AH L
+commerzbank K AA M ER Z B AE NG K
+commerzbank's K AA M ER Z B AE NG K S
+commie K AA M IY
+commies K AA M IY Z
+commingle K AH M IH NG G AH L
+commingle(2) K OW M IH NG G AH L
+commingled K AA M IH NG G AH L D
+commingled(2) K OW M IH NG G AH L D
+commingling K AA M IH NG G AH L IH NG
+commingling(2) K OW M IH NG G L IH NG
+commins K AA M IH N Z
+commiserate K AH M IH S ER EY T
+commish K AH M IH SH
+commision K AH M IH Z AH N
+commision(2) K AH M IH SH AH N
+commissar K AA M AH S AA R
+commissaries K AA M AH S EH R IY Z
+commissars K AA M IH S AA Z
+commissary K AA M AH S EH R IY
+commission K AH M IH SH AH N
+commission's K AH M IH SH AH N Z
+commissioned K AH M IH SH AH N D
+commissioner K AH M IH SH AH N ER
+commissioner's K AH M IH SH AH N ER Z
+commissioners K AH M IH SH AH N ER Z
+commissioning K AH M IH SH AH N IH NG
+commissions K AH M IH SH AH N Z
+commisso K OW M IY S OW
+commit K AH M IH T
+commitee K AA M IH T IY
+commitee(2) K AH M IH T IY
+commitment K AH M IH T M AH N T
+commitments K AH M IH T M AH N T S
+commits K AH M IH T S
+committal K AH M IH T AH L
+committed K AH M IH T AH D
+committee K AH M IH T IY
+committee's K AH M IH T IY Z
+committeeman K AH M IH T IY M AH N
+committees K AH M IH T IY Z
+committees' K AH M IH T IY Z
+committing K AH M IH T IH NG
+commode K AH M OW D
+commodious K AH M OW D IY AH S
+commodities K AH M AA D AH T IY Z
+commodity K AH M AA D AH T IY
+commodity's K AH M AA D AH T IY Z
+commodore K AA M AH D AO R
+commodore's K AA M AH D AO R Z
+common K AA M AH N
+commonalities K AA M AH N AE L AH T IY Z
+commonality K AA M AH N AE L AH T IY
+commoner K AA M AH N ER
+commoners K AA M AH N ER Z
+commonly K AA M AH N L IY
+commonplace K AA M AH N P L EY S
+commons K AA M AH N Z
+commonsense K AA M AH N S EH N S
+commonsensical K AA M AH N S EH N S IH K AH L
+commonwealth K AA M AH N W EH L TH
+commonwealth's K AA M AH N W EH L TH S
+commotion K AH M OW SH AH N
+communal K AH M Y UW N AH L
+commune K AA M Y UW N
+commune(2) K AH M Y UW N
+communes K AA M Y UW N Z
+communes(2) K AH M Y UW N Z
+communicable K AH M Y UW N AH K AH B AH L
+communicate K AH M Y UW N AH K EY T
+communicated K AH M Y UW N AH K EY T IH D
+communicates K AH M Y UW N IH K EY T S
+communicating K AH M Y UW N AH K EY T IH NG
+communication K AH M Y UW N AH K EY SH AH N
+communication's K AH M Y UW N IH K EY SH AH N Z
+communications K AH M Y UW N AH K EY SH AH N Z
+communications' K AH M Y UW N AH K EY SH AH N Z
+communicative K AH M Y UW N AH K AH T IH V
+communicator K AH M Y UW N AH K EY T ER
+communicators K AH M Y UW N AH K EY T ER Z
+communing K AH M Y UW N IH NG
+communion K AH M Y UW N Y AH N
+communique K AH M Y UW N AH K EY
+communiques K AH M Y UW N IH K EY Z
+communism K AA M Y AH N IH Z AH M
+communism's K AA M Y AH N IH Z AH M Z
+communist K AA M Y AH N AH S T
+communist's K AA M Y AH N AH S T S
+communists K AA M Y AH N AH S T S
+communists' K AA M Y UW N IH S T S
+communists(2) K AA M Y AH N AH S S
+communists(3) K AA M Y AH N AH S
+communities K AH M Y UW N AH T IY Z
+communities(2) K AH M Y UW N IH T IY Z
+community K AH M Y UW N AH T IY
+community's K AH M Y UW N IH T IY Z
+community(2) K AH M Y UW N IH T IY
+communitywide K AH M Y UW N IH T IY W AY D
+communization K AA M Y AH N AH Z EY SH AH N
+communize K AA M Y AH N AY Z
+commutate K AA M Y AH T EY T
+commutation K AA M Y AH T EY SH AH N
+commute K AH M Y UW T
+commuted K AH M Y UW T IH D
+commuter K AH M Y UW T ER
+commuters K AH M Y UW T ER Z
+commutes K AH M Y UW T S
+commuting K AH M Y UW T IH NG
+como K OW M OW
+comp K AA M P
+compact K AA M P AE K T
+compact(2) K AH M P AE K T
+compacted K AH M P AE K T IH D
+compactness K AH M P AE K T N AH S
+compactor K AH M P AE K T ER
+compacts K AH M P AE K T S
+compacts(2) K AA M P AE K T S
+compagnie K AH M P AH N IY
+companero K AA M P AH N Y EH R OW
+companhia K AH M P AE N HH IY AH
+compania K AH M P EY N IY AH
+companies K AH M P AH N IY Z
+companies' K AH M P AH N IY Z
+companies's K AH M P AH N IY Z IH Z
+companion K AH M P AE N Y AH N
+companions K AH M P AE N Y AH N Z
+companionship K AH M P AE N Y AH N SH IH P
+companionway K AH M P AE N Y AH N W EY
+company K AH M P AH N IY
+company'll K AH M P AH N IY AH L
+company's K AH M P AH N IY Z
+companywide K AH M P AH N IY W AY D
+compaore K AA M P AH AO R IY
+compaq K AA M P AE K
+compaq's K AA M P AE K S
+comparability K AA M P ER AH B IH L IH T IY
+comparable K AA M P ER AH B AH L
+comparable(2) K AH M P EH R AH B AH L
+comparable(3) K AH M P R AH B AH L
+comparably K AA M P ER AH B L IY
+comparably(2) K AA M P R AH B L IY
+comparative K AH M P EH R AH T IH V
+comparatively K AH M P EH R AH T IH V L IY
+comparator K AH M P ER AH T ER
+compare K AH M P EH R
+compared K AH M P EH R D
+compares K AH M P EH R Z
+comparing K AH M P EH R IH NG
+comparison K AH M P EH R AH S AH N
+comparisons K AH M P EH R AH S AH N Z
+compartment K AH M P AA R T M AH N T
+compartmental K AH M P AA R T M EH N T AH L
+compartmentalize K AH M P AA R T M EH N T AH L AY Z
+compartmentalized K AA M P AA R T M EH N T AH L AY Z D
+compartments K AH M P AA R T M AH N T S
+compas K AA M P AH S
+compass K AH M P AH S
+compassion K AH M P AE SH AH N
+compassionate K AH M P AE SH AH N AH T
+compassionately K AH M P AE SH AH N AH T L IY
+compatibility K AH M P AE T AH B IH L AH T IY
+compatible K AH M P AE T AH B AH L
+compatibles K AH M P AE T IH B AH L Z
+compatriot K AH M P EY T R IY AH T
+compatriots K AH M P EY T R IY AH T S
+compean K AA M P AH N
+compeau K AH M P OW
+compel K AH M P EH L
+compelled K AH M P EH L D
+compelling K AH M P EH L IH NG
+compellingly K AH M P EH L IH NG L IY
+compels K AH M P EH L Z
+compendium K AH M P EH N D IY AH M
+compensable K AH M P EH N S AH B AH L
+compensate K AA M P AH N S EY T
+compensated K AA M P AH N S EY T AH D
+compensates K AA M P AH N S EY T S
+compensating K AA M P AH N S EY T IH NG
+compensation K AA M P AH N S EY SH AH N
+compensations K AA M P AH N S EY SH AH N Z
+compensatory K AH M P EH N S AH T AO R IY
+compete K AH M P IY T
+competed K AH M P IY T IH D
+competence K AA M P AH T IH N S
+competencies K AA M P AH T IH N S IY Z
+competency K AA M P AH T IH N S IY
+competent K AA M P AH T IH N T
+competently K AA M P AH T IH N T L IY
+competes K AH M P IY T S
+competing K AH M P IY T IH NG
+competition K AA M P AH T IH SH AH N
+competition's K AA M P AH T IH SH AH N Z
+competitions K AA M P AH T IH SH AH N Z
+competitive K AH M P EH T AH T IH V
+competitive(2) K AH M P EH T IH T IH V
+competitively K AH M P EH T IH T IH V L IY
+competitiveness K AH M P EH T IH T IH V N IH S
+competitor K AH M P EH T AH T ER
+competitor's K AH M P EH T AH T ER Z
+competitor(2) K AH M P EH T IH T ER
+competitors K AH M P EH T AH T ER Z
+competitors' K AH M P EH T IH T ER Z
+competitors(2) K AH M P EH T IH T ER Z
+compher K AA M F ER
+compilation K AA M P AH L EY SH AH N
+compilations K AA M P AH L EY SH AH N Z
+compile K AH M P AY L
+compiled K AH M P AY L D
+compiler K AH M P AY L ER
+compilers K AH M P AY L ER Z
+compiles K AH M P AY L Z
+compiling K AH M P AY L IH NG
+complacency K AH M P L EY S AH N S IY
+complacent K AH M P L EY S AH N T
+complacently K AH M P L EY S AH N T L IY
+complain K AH M P L EY N
+complainant K AH M P L EY N AH N T
+complainant's K AH M P L EY N AH N T
+complainants K AH M P L EY N AH N T S
+complained K AH M P L EY N D
+complainer K AH M P L EY N ER
+complainers K AA M P L EY N ER Z
+complaining K AH M P L EY N IH NG
+complains K AH M P L EY N Z
+complaint K AH M P L EY N T
+complaints K AH M P L EY N T S
+complaisant K AH M P L EY S AH N T
+complement K AA M P L AH M AH N T
+complementary K AA M P L AH M EH N T R IY
+complementary(2) K AA M P L AH M EH N CH IY
+complemented K AA M P L AH M EH N T IH D
+complementing K AA M P L AH M EH N T IH NG
+complements K AA M P L AH M AH N T S
+complete K AH M P L IY T
+completed K AH M P L IY T AH D
+completed(2) K AH M P L IY T IH D
+completely K AH M P L IY T L IY
+completeness K AH M P L IY T N AH S
+completes K AH M P L IY T S
+completing K AH M P L IY T IH NG
+completion K AH M P L IY SH AH N
+completions K AH M P L IY SH AH N Z
+complex K AA M P L EH K S
+complex(2) K AH M P L EH K S
+complexes K AA M P L EH K S AH Z
+complexion K AH M P EH K SH AH N
+complexions K AH M P EH K SH AH N Z
+complexities K AH M P L EH K S IH T IY Z
+complexity K AH M P L EH K S AH T IY
+complexity(2) K AH M P L EH K S IH T IY
+compliance K AH M P L AY AH N S
+compliant K AH M P L AY AH N T
+complicate K AA M P L AH K EY T
+complicated K AA M P L AH K EY T AH D
+complicates K AA M P L IH K EY T S
+complicating K AA M P L AH K EY T IH NG
+complication K AA M P L AH K EY SH AH N
+complications K AA M P L AH K EY SH AH N Z
+complicit K AH M P L IH S AH T
+complicities K AH M P L IH S IH T IY Z
+complicity K AH M P L IH S AH T IY
+complicity(2) K AH M P L IH S IH T IY
+complied K AH M P L AY D
+complies K AH M P L AY Z
+compliment K AA M P L AH M EH N T
+complimentary K AA M P L AH M EH N T ER IY
+complimented K AA M P L AH M EH N T IH D
+complimenting K AA M P L AH M EH N T IH NG
+compliments K AA M P L AH M EH N T S
+comply K AH M P L AY
+complying K AH M P L AY IH NG
+compo K AA M P OW
+component K AH M P OW N AH N T
+components K AH M P OW N AH N T S
+comport K AH M P AO R T
+comported K AH M P AO R T AH D
+comportment K AH M P AO R T M AH N T
+compose K AH M P OW Z
+composed K AH M P OW Z D
+composer K AH M P OW Z ER
+composer's K AH M P OW Z ER Z
+composers K AH M P OW Z ER Z
+composes K AH M P OW Z IH Z
+composing K AH M P OW Z IH NG
+composite K AH M P AA Z AH T
+composite's K AH M P AA Z AH T S
+composite's(2) K AA M P AA Z AH T S
+composite(2) K AA M P AA Z AH T
+composites K AH M P AA Z AH T S
+composites(2) K AA M P AA Z AH T S
+composition K AA M P AH Z IH SH AH N
+compositional K AA M P AH Z IH SH AH N AH L
+compositions K AA M P AH Z IH SH AH N Z
+compost K AA M P OW S T
+composting K AA M P OW S T IH NG
+composure K AH M P OW ZH ER
+compote K AA M P OW T
+compound K AA M P AW N D
+compound(2) K AH M P AW N D
+compounded K AH M P AW N D AH D
+compounded(2) K AH M P AW N D IH D
+compounding K AH M P AW N D IH NG
+compounds K AA M P AW N D Z
+compounds(2) K AH M P AW N D Z
+comprehend K AA M P R IY HH EH N D
+comprehended K AA M P R IH HH EH N D IH D
+comprehending K AA M P R IH HH EH N D IH NG
+comprehends K AA M P R IY HH EH N D Z
+comprehensibility K AA M P R IY HH EH N S AH B IH L AH T IY
+comprehensible K AA M P R IY HH EH N S AH B AH L
+comprehension K AA M P R IY HH EH N SH AH N
+comprehensive K AA M P R IY HH EH N S IH V
+comprehensively K AA M P R IH HH EH N S IH V L IY
+compress K AA M P R EH S
+compress(2) K AH M P R EH S
+compressed K AH M P R EH S T
+compresses K AA M P R EH S AH Z
+compresses(2) K AH M P R EH S AH Z
+compresses(3) K AH M P R EH S IH Z
+compressing K AH M P R EH S IH NG
+compression K AH M P R EH SH AH N
+compressor K AH M P R EH S ER
+compressors K AH M P R EH S ER Z
+comprint K AA M P R IH N T
+comprise K AH M P R AY Z
+comprised K AH M P R AY Z D
+comprises K AH M P R AY Z AH Z
+comprises(2) K AH M P R AY Z IH Z
+comprising K AH M P R AY Z IH NG
+compromise K AA M P R AH M AY Z
+compromised K AA M P R AH M AY Z D
+compromiser K AA M P R AH M AY Z ER
+compromises K AA M P R AH M AY Z IH Z
+compromising K AA M P R AH M AY Z IH NG
+compston K AA M P S T AH N
+comptek K AA M P T EH K
+compton K AA M P T AH N
+compton's K AA M P T AH N Z
+comptroller K AH N T R OW L ER
+comptroller's K AH N T R OW L ER Z
+comptroller's(2) K AA M T R OW L ER Z
+comptroller(2) K AA N T R OW L ER
+comptronix K AA M P T R AA N IH K S
+compu K AA M P Y UW
+compuadd K AA M P Y UW AE D
+compuchem K AA M P Y UW K EH M
+compudyne K AA M P Y UW D AY N
+compufund K AA M P Y UW F AH N D
+compugraphic K AA M P Y UW G R AE F IH K
+compulsion K AH M P AH L SH AH N
+compulsions K AH M P UH L SH AH N Z
+compulsive K AH M P AH L S IH V
+compulsively K AH M P AH L S IH V L IY
+compulsory K AH M P AH L S ER IY
+compumat K AA M P Y UW M AE T
+compunction K AH M P AH NG K SH AH N
+compus K AA M P Y UW Z
+compusa K AA M P Y UW EH S EY
+compusa's K AA M P Y UW EH S EY Z
+compuserve K AA M P Y UW S ER V
+compuserve's K AA M P Y UW S ER V Z
+computalog K AA M P Y UW T AE L AO G
+computation K AA M P Y AH T EY SH AH N
+computational K AA M P Y UW T EY SH AH N AH L
+computations K AA M P Y UW T EY SH AH N Z
+compute K AH M P Y UW T
+computed K AH M P Y UW T AH D
+computed(2) K AH M P Y UW T IH D
+computer K AH M P Y UW T ER
+computer's K AH M P Y UW T ER Z
+computercraft K AH M P Y UW T ER K R AE F T
+computerization K AH M P Y UW T ER IH Z EY SH AH N
+computerize K AH M P Y UW T ER AY Z
+computerized K AH M P Y UW T ER AY Z D
+computerizing K AH M P Y UW T ER AY Z IH NG
+computerland K AH M P Y UW T ER L AE N D
+computerland's K AH M P Y UW T ER L AE N D Z
+computerlike K AH M P Y UW T ER L AY K
+computers K AH M P Y UW T ER Z
+computers' K AH M P Y UW T ER Z
+computervision K AH M P Y UW T ER V IH ZH AH N
+computerworld K AH M P Y UW T ER W ER L D
+computes K AH M P Y UW T S
+computing K AH M P Y UW T IH NG
+computrac K AA M P Y UW T R AE K
+compuware K AA M P Y UW W EH R
+comrade K AA M R AE D
+comrades K AA M R AE D Z
+comrie K AA M ER IY
+coms K AA M Z
+comsat K AA M S AE T
+comsat's K AA M S AE T S
+comstock K AA M S T AA K
+comtois K AH M T W AA
+comtrex K AA M T R EH K S
+comunale K OW M UW N AA L IY
+con K AA N
+cona K OW N AH
+conable K OW N AH B AH L
+conable's K OW N AH B AH L Z
+conagra K AA N AE G R AH
+conagra's K AA N AE G R AH Z
+conahan K AA N AH HH AE N
+conair K AA N EH R
+conal K OW N AH L
+conan K OW N AH N
+conant K OW N AH N T
+conant-pablos K OW N AH N T P AA B L OW S
+conard K AA N ER D
+conasupo K AA N AH S UW P OW
+conatser K AA N AH T S ER
+conaty K AA N AH T IY
+conaway K AA N AH W EY
+conboy K AA N B OY
+conca K AA NG K AH
+concannon K AH N K AE N AH N
+concatenate K AH N K AE T AH N EY T
+concatenated K AH N K AE T AH N EY T AH D
+concatenates K AH N K AE T AH N EY T S
+concatenating K AH N K AE T AH N EY T IH NG
+concatenation K AH N K AE T AH N EY SH AH N
+concave K AA N K EY V
+conceal K AH N S IY L
+concealed K AH N S IY L D
+concealing K AH N S IY L IH NG
+concealment K AH N S IY L M AH N T
+conceals K AH N S IY L Z
+concede K AH N S IY D
+conceded K AH N S IY D IH D
+concedes K AH N S IY D Z
+conceding K AH N S IY D IH NG
+conceit K AH N S IY T
+conceited K AH N S IY T AH D
+conceivable K AH N S IY V AH B AH L
+conceivably K AH N S IY V AH B L IY
+conceive K AH N S IY V
+conceived K AH N S IY V D
+conceiving K AH N S IY V IH NG
+concentrate K AA N S AH N T R EY T
+concentrated K AA N S AH N T R EY T AH D
+concentrated(2) K AO N S AH N T R EY T IH D
+concentrates K AA N S AH N T R EY T S
+concentrating K AA N S AH N T R EY T IH NG
+concentration K AA N S AH N T R EY SH AH N
+concentrations K AA N S AH N T R EY SH AH N Z
+concentric K AH N S EH N T R IH K
+concepcion K AH N S EH P S IY OW N
+concept K AA N S EH P T
+conception K AH N S EH P SH AH N
+conceptions K AH N S EH P SH AH N Z
+concepts K AA N S EH P T S
+concepts(2) K AA N S EH P S
+conceptual K AH N S EH P CH UW AH L
+conceptualization K AH N S EH P CH W AH L IH Z EY SH AH N
+conceptually K AH N S EH P CH UW AH L IY
+concern K AH N S ER N
+concern's K AH N S ER N Z
+concerned K AH N S ER N D
+concerning K AH N S ER N IH NG
+concerns K AH N S ER N Z
+concerns' K AH N S ER N Z
+concert K AA N S ER T
+concert(2) K AH N S ER T
+concerted K AH N S ER T AH D
+concerted(2) K AH N S ER T IH D
+concerti K AH N CH EH R T IY
+concertina K AA N S ER T IY N AH
+concertmaster K AA N S ER T M AE S T ER
+concerto K AH N CH EH R T OW
+concertos K AH N CH EH R T OW Z
+concerts K AA N S ER T S
+concerts(2) K AH N S ER T S
+concession K AH N S EH SH AH N
+concessionaire K AH N S EH SH AH N EH R
+concessional K AH N S EH SH AH N AH L
+concessionary K AH N S EH SH AH N EH R IY
+concessions K AH N S EH SH AH N Z
+conch K AA N CH
+conch(2) K AA NG K
+concha K AA N CH AH
+conchemco K AA N CH EH M K OW
+conchita K AH N CH IY T AH
+conchoid K AA N CH OY D
+concierge K AA N S IY EH R ZH
+conciliation K AH N S IH L IY EY SH AH N
+conciliator K AH N S IH L IY EY T ER
+conciliator's K AH N S IH L IY EY T ER Z
+conciliatory K AH N S IH L IY AH T AO R IY
+conciliatory(2) K AH N S IH L Y AH T AO R IY
+concise K AH N S AY S
+concisely K AH N S AY S L IY
+conclave K AA N K L EY V
+conclude K AH N K L UW D
+concluded K AH N K L UW D AH D
+concluded(2) K AH N K L UW D IH D
+concludes K AH N K L UW D Z
+concluding K AH N K L UW D IH NG
+conclusion K AH N K L UW ZH AH N
+conclusions K AH N K L UW ZH AH N Z
+conclusive K AH N K L UW S IH V
+conclusively K AH N K L UW S IH V L IY
+concoct K AH N K AA K T
+concocted K AH N K AA K T AH D
+concocting K AH N K AA K T IH NG
+concoction K AH N K AA K SH AH N
+concoctions K AH N K AA K SH AH N Z
+concomitant K AA N K AA M AH T AH N T
+concomitant(2) K AA N K AH M IH T AH N T
+concomitantly K AA N K AA M AH T AH N T L IY
+concomitantly(2) K AA N K AH M IH T AH N T L IY
+concord K AA N K AO R D
+concord's K AA N K AO R D Z
+concord's(2) K AA N K ER D Z
+concord(2) K AA N K ER D
+concorde K AA N K AO R D
+concourse K AA N K AO R S
+concourses K AA N K AO R S IH Z
+concrete K AH N K R IY T
+concrete(2) K AA N K R IY T
+concretely K AA N K R IY T L IY
+concubinage K AA N K Y UW B AH N AH JH
+concubine K AA N K Y AH B AY N
+concubines K AA N K Y AH B AY N Z
+concur K AH N K ER
+concurred K AH N K ER D
+concurrence K AH N K ER AH N S
+concurrent K AH N K ER AH N T
+concurrently K AH N K ER AH N T L IY
+concurring K AH N K ER IH NG
+concurs K AH N K ER Z
+concussion K AH N K AH SH AH N
+concussions K AH N K AH SH AH N Z
+conde K AA N D
+condello K AH N D EH L OW
+condemn K AH N D EH M
+condemnation K AA N D AH M N EY SH AH N
+condemnations K AA N D AH M N EY SH AH N Z
+condemned K AH N D EH M D
+condemning K AH N D EH M IH NG
+condemns K AH N D EH M Z
+condensate K AA N D AH N S EY T
+condensates K AA N D AH N S EY T S
+condensation K AA N D AH N S EY SH AH N
+condense K AH N D EH N S
+condensed K AH N D EH N S T
+condenser K AH N D EH N S ER
+condensing K AH N D EH N S IH NG
+conder K AA N D ER
+condescend K AA N D IH S EH N D
+condescending K AA N D IH S EH N D IH NG
+condescension K AA N D AH S EH N SH AH N
+condie K AA N D IY
+condiment K AA N D AH M AH N T
+condiments K AA N D AH M AH N T S
+condit K AA N D IH T
+condition K AH N D IH SH AH N
+conditional K AH N D IH SH AH N AH L
+conditionality K AH N D IH SH AH N AE L IH T IY
+conditionally K AH N D IH SH AH N AH L IY
+conditionally(2) K AH N D IH SH N AH L IY
+conditioned K AH N D IH SH AH N D
+conditioner K AH N D IH SH AH N ER
+conditioners K AH N D IH SH AH N ER Z
+conditioning K AH N D IH SH AH N IH NG
+conditions K AH N D IH SH AH N Z
+conditt K AA N D IH T
+condo K AA N D OW
+condolence K AH N D OW L AH N S
+condolences K AH N D OW L AH N S AH Z
+condom K AA N D AH M
+condominium K AA N D AH M IH N IY AH M
+condominiums K AA N D AH M IH N IY AH M Z
+condoms K AA N D AH M Z
+condon K AA N D AH N
+condone K AH N D OW N
+condoned K AH N D OW N D
+condones K AH N D OW N Z
+condoning K AH N D OW N IH NG
+condor K AA N D ER
+condors K AA N D ER Z
+condos K AA N D OW Z
+condra K AA N D R AH
+condracky K AA N D R AE K IY
+condracky's K AA N D R AE K IY Z
+condray K AA N D R EY
+condren K AA N D ER AH N
+condrey K AA N D R IY
+condron K AA N D R AH N
+condry K AA N D ER IY
+conducive K AH N D UW S IH V
+conduct K AH N D AH K T
+conduct(2) K AA N D AH K T
+conducted K AH N D AH K T AH D
+conducting K AH N D AH K T IH NG
+conduction K AH N D AH K SH AH N
+conductive K AH N D AH K T IH V
+conductivity K AA N D AH K T IH V AH T IY
+conductor K AH N D AH K T ER
+conductors K AH N D AH K T ER Z
+conducts K AH N D AH K T S
+conduit K AA N D UW IH T
+conduit(2) K AA N JH UW IH T
+conduit(3) K AA N D W IH T
+conduits K AA N D UW AH T S
+conduits(2) K AA N D W AH T S
+cone K OW N
+cone's K OW N Z
+coneflower K OW N F L AW ER
+conehead K OW N HH EH D
+coneheads K OW N HH EH D Z
+conely K OW N L IY
+conerly K OW N ER L IY
+conery K OW N ER IY
+cones K OW N Z
+conestoga K AA N AH S T OW G AH
+coney K OW N IY
+confabulation K AH N F AE B Y AH L EY SH AH N
+confair K AA N F EH R
+confect K AH N F EH K T
+confection K AH N F EH K SH AH N
+confectionaries K AH N F EH K SH AH N EH R IY Z
+confectionary K AH N F EH K SH AH N EH R IY
+confectioner K AH N F EH K SH AH N ER
+confectioners K AH N F EH K SH AH N ER Z
+confectionery K AH N F EH K SH AH N EH R IY
+confections K AH N F EH K SH AH N Z
+confederacy K AH N F EH D ER AH S IY
+confederacy's K AH N F EH D ER AH S IY Z
+confederacy's(2) K AH N F EH D R AH S IY Z
+confederacy(2) K AH N F EH D R AH S IY
+confederate K AH N F EH D ER AH T
+confederate(2) K AH N F EH D ER EY T
+confederation K AH N F EH D ER EY SH AH N
+confer K AH N F ER
+conferee K AA N F ER IY
+conferees K AA N F ER IY Z
+conference K AA N F ER AH N S
+conference's K AA N F ER AH N S IH Z
+conference's(2) K AA N F R AH N S IH Z
+conference(2) K AA N F R AH N S
+conferences K AA N F ER AH N S AH Z
+conferences(2) K AA N F R AH N S AH Z
+conferencing K AA N F R AH N S IH NG
+conferred K AH N F ER D
+conferring K AH N F ER IH NG
+confers K AH N F ER Z
+confess K AH N F EH S
+confessed K AH N F EH S T
+confesses K AH N F EH S IH Z
+confessing K AH N F EH S IH NG
+confession K AH N F EH SH AH N
+confessional K AH N F EH SH AH N AH L
+confessionals K AH N F EH SH AH N AH L Z
+confessions K AH N F EH SH AH N Z
+confetti K AH N F EH T IY
+confidant K AA N F AH D AA N T
+confidante K AA N F AH D AE N T
+confidants K AA N F AH D AE N T S
+confide K AH N F AY D
+confided K AH N F AY D AH D
+confided(2) K AH N F AY D IH D
+confidence K AA N F AH D AH N S
+confidence's K AA N F AH D AH N S AH Z
+confidences K AA N F AH D AH N S IH Z
+confident K AA N F AH D AH N T
+confidential K AA N F AH D EH N SH AH L
+confidential(2) K AA N F AH D EH N CH AH L
+confidentiality K AA N F AH D EH N SH IY AE L AH T IY
+confidentiality(2) K AA N F AH D EH N CH IY AE L AH T IY
+confidentially K AA N F AH D EH N SH AH L IY
+confidentially(2) K AA N F AH D EH N CH AH L IY
+confidently K AA N F AH D AH N T L IY
+confides K AH N F AY D Z
+confiding K AH N F AY D IH NG
+configuration K AH N F IH G Y ER EY SH AH N
+configurations K AH N F IH G Y ER EY SH AH N Z
+configure K AH N F IH G Y ER
+configured K AH N F IH G Y ER D
+configuring K AH N F IH G Y ER IH NG
+confindustria K AA N F IH N D AH S T R IY AH
+confine K AH N F AY N
+confined K AH N F AY N D
+confinement K AH N F AY N M AH N T
+confines K AA N F AY N Z
+confines(2) K AH N F AY N Z
+confining K AH N F AY N IH NG
+confirm K AH N F ER M
+confirmable K AH N F ER M AH B AH L
+confirmation K AA N F ER M EY SH AH N
+confirmations K AA N F ER M EY SH AH N Z
+confirmatory K AH N F ER M AH T AO R IY
+confirmed K AH N F ER M D
+confirming K AH N F ER M IH NG
+confirms K AH N F ER M Z
+confiscate K AA N F AH S K EY T
+confiscated K AA N F AH S K EY T AH D
+confiscating K AA N F AH S K EY T IH NG
+confiscation K AA N F AH S K EY SH AH N
+confiscatory K AH N F IH S K AH T AO R IY
+confiterias K AA N F IH T IH R IY AH Z
+conflagration K AA N F L AH G R EY SH AH N
+conflate K AH N F L EY T
+conflates K AH N F L EY T S
+conflation K AH N F L EY SH AH N
+conflict K AA N F L IH K T
+conflict(2) K AH N F L IH K T
+conflicted K AH N F L IH K T IH D
+conflicting K AH N F L IH K T IH NG
+conflicts K AH N F L IH K T S
+conflicts(2) K AA N F L IH K T S
+conflicts(3) K AH N F L IH K S
+conflicts(4) K AA N F L IH K S
+confluence K AA N F L UW AH N S
+confluent K AA N F L UW AH N T
+conform K AH N F AO R M
+conformance K AH N F AO R M AH N S
+conformational K AA N F ER M EY SH AH N AH L
+conformed K AH N F AO R M D
+conforming K AH N F AO R M IH NG
+conformist K AH N F AO R M IH S T
+conformists K AH N F AO R M AH S T S
+conformists(2) K AH N F AO R M AH S S
+conformists(3) K AH N F AO R M AH S
+conformity K AH N F AO R M AH T IY
+conforms K AH N F AO R M Z
+conforti K AA N F AO R T IY
+confound K AA N F AW N D
+confound(2) K AH N F AW N D
+confounded K AH N F AW N D IH D
+confounding K AH N F AW N D IH NG
+confounds K AH N F AW N D Z
+confrere K AA N F R EH R
+confreres K AA N F R EH R Z
+confront K AH N F R AH N T
+confrontation K AA N F R AH N T EY SH AH N
+confrontational K AA N F R AH N T EY SH AH N AH L
+confrontations K AA N F R AH N T EY SH AH N Z
+confronted K AH N F R AH N T AH D
+confronted(2) K AH N F R AH N T IH D
+confronting K AH N F R AH N T IH NG
+confronts K AH N F R AH N T S
+confucian K AH N F Y UW SH AH N
+confucianism K AH N F Y UW SH AH N IH Z AH M
+confucius K AH N F Y UW SH AH S
+confuse K AH N F Y UW Z
+confused K AH N F Y UW Z D
+confuses K AH N F Y UW Z IH Z
+confusing K AH N F Y UW Z IH NG
+confusingly K AH N F Y UW Z IH NG L IY
+confusion K AH N F Y UW ZH AH N
+confusions K AH N F Y UW ZH AH N Z
+cong K AO NG
+conga K AO NG G AH
+congdon K AA NG D AH N
+congeal K AH N JH IY L
+congealed K AH N JH IY L D
+congenial K AH N JH IY N Y AH L
+congeniality K AH N JH IY N IY AE L AH T IY
+congenital K AH N JH EH N AH T AH L
+conger K AO NG ER
+congest K AH N JH EH S T
+congested K AH N JH EH S T AH D
+congested(2) K AH N JH EH S T IH D
+congestion K AH N JH EH S CH AH N
+congestive K AH N JH EH S T IH V
+congleton K AA NG G AH L T AA N
+conglomerate K AH N G L AA M ER AH T
+conglomerate's K AH N G L AA M ER AH T S
+conglomerates K AH N G L AA M ER AH T S
+conglomeration K AH N G L AA M ER EY SH AH N
+congo K AA NG G OW
+congo's K AA NG G OW Z
+congolese K AA N G AH L IY Z
+congratulate K AH N G R AE CH AH L EY T
+congratulated K AH N G R AE CH AH L EY T IH D
+congratulating K AH N G R AE CH AH L EY T IH NG
+congratulation K AH N G R AE CH AH L EY SH AH N
+congratulations K AH N G R AE CH AH L EY SH AH N Z
+congratulatory K AH N G R AE CH AH L AH T AO R IY
+congregant K AA NG G R AH G AH N T
+congregants K AA NG G R AH G AH N T S
+congregate K AA NG G R AH G EY T
+congregated K AA NG G R IH G EY T IH D
+congregation K AA NG G R AH G EY SH AH N
+congregation's K AA NG G R AH G EY SH AH N Z
+congregational K AA NG G R AH G EY SH AH N AH L
+congregations K AA NG G R AH G EY SH AH N Z
+congress K AA NG G R AH S
+congress' K AA N G R AH S IH Z
+congress'(2) K AA NG G R AH S
+congress's K AA NG G R AH S IH Z
+congresses K AA NG G R AH S IH Z
+congressional K AH N G R EH SH AH N AH L
+congressionally K AH N G R EH SH AH N AH L IY
+congressionally(2) K AH N G R EH SH N AH L IY
+congressman K AA NG G R AH S M AH N
+congressman's K AA NG G R AH S M AH N Z
+congressmen K AA NG G R AH S M IH N
+congresspeople K AA NG G R AH S P IY P AH L
+congressperson K AA NG G R AH S P ER S AH N
+congresspersons K AA NG G R AH S P ER S AH N Z
+congresswoman K AA NG G R AH S W UH M AH N
+congresswoman's K AA NG G R AH S W UH M AH N Z
+congresswomen K AA NG G R AH S W IH M IH N
+congrove K AA NG G R AH V
+congruence K AO N G R UW AH N S
+congruity K AH N G R UW AH T IY
+conic K AA N IH K
+conic(2) K OW N IH K
+conical K AA N IH K AH L
+conical(2) K OW N IH K AH L
+conics K AA N IH K S
+conics(2) K OW N IH K S
+conifer K AA N AH F ER
+conifer's K AA N AH F ER Z
+coniferous K AH N IH F ER AH S
+conifers K AA N AH F ER Z
+conigliaro K AH N IH G L IY AA R OW
+coniglio K AH N IH G L IY OW
+coniston K AA N AH S T AH N
+conjecture K AH N JH EH K CH ER
+conjecture(2) K AH N JH EH K SH ER
+conjectures K AH N JH EH K CH ER Z
+conjectures(2) K AH N JH EH K SH ER Z
+conjoin K AA N JH OY N
+conjoined K AA N JH OY N D
+conjugal K AA N JH AH G AH L
+conjugate K AA N JH AH G EY T
+conjugated K AA N JH AH G EY T IH D
+conjugates K AA N JH AH G EY T S
+conjugation K AA N JH AH G EY SH AH N
+conjugations K AA N JH AH G EY SH AH N Z
+conjul K AA N JH AH L
+conjunction K AH N JH AH NG K SH AH N
+conjunctions K AH N JH AH NG K SH AH N Z
+conjunctiva K AA N JH AH NG K T AY V AH
+conjure K AA N JH ER
+conjured K AA N JH ER D
+conjures K AA N JH ER Z
+conjuring K AA N JH ER IH NG
+conjuror K AA N JH ER ER
+conk K AA NG K
+conkel K AA NG K AH L
+conkey K AA N K IY
+conkin K AA NG K IH N
+conkle K AA NG K AH L
+conklin K AA NG K L IH N
+conkling K AA NG K L IH NG
+conkright K AA NG K R AY T
+conlan K AA N L AH N
+conlee K AA N L IY
+conley K AA N L IY
+conlin K AA N L IH N
+conlon K AA N L AH N
+conlow K AA N L OW
+conly K AA N L IY
+conn K AA N
+conn. K AA N
+conn.(2) K AH N EH T AH K AH T
+connally K AA N AH L IY
+connally's K AA N AH L IY Z
+connan K AA N AH N
+connaught K AA N AO T
+connaught's K AA N AO T S
+connaughton K AA N AO T AA N
+connaway K AA N AH W EY
+connect K AH N EH K T
+connected K AH N EH K T AH D
+connected(2) K AH N EH K T IH D
+connecter K AH N EH K T ER
+connecticut K AH N EH T AH K AH T
+connecticut's K AH N EH T AH K AH T S
+connecting K AH N EH K T IH NG
+connection K AH N EH K SH AH N
+connections K AH N EH K SH AH N Z
+connective K AH N EH K T IH V
+connectivity K AH N EH K T IH V IH T IY
+connector K AH N EH K T ER
+connectors K AH N EH K T ER Z
+connects K AH N EH K T S
+conned K AA N D
+conneely K AH N IY L IY
+connell K AA N AH L
+connelley K AA N IH L IY
+connelly K AA N AH L IY
+connelly's K AA N AH L IY Z
+connely K AA N L IY
+conner K AA N ER
+conner's K AA N ER Z
+connerly K AA N ER L IY
+conners K AA N ER Z
+connery K AA N ER IY
+connery's K AA N ER IY Z
+connett K AA N IH T
+connick K AA N IH K
+connie K AO N IY
+connie's K AO N IY Z
+conniff K AA N IH F
+conning K AA N IH NG
+conniption K AH N IH P SH AH N
+connivance K AH N AY V AH N S
+connive K AH N AY V
+conniving K AH N AY V IH NG
+connoisseur K AA N AH S ER
+connoisseurs K AA N AH S ER Z
+connole K AA N AH L
+connolly K AO N AH L IY
+connon K AA N AH N
+connor K AA N ER
+connors K AA N ER Z
+connotation K AA N AH T EY SH AH N
+connotational K AA N AH T EY SH AH N AH L
+connotations K AA N AH T EY SH AH N Z
+connote K AH N OW T
+connotes K AH N OW T S
+conny K AA N IY
+conoco K AA N AH K OW
+conoco's K AA N AH K OW Z
+conoco(2) K AH N AA K OW
+conolly K AA N OW L IY
+conoly K AA N OW L IY
+conover K AA N AH V ER
+conquer K AA NG K ER
+conquered K AA NG K ER D
+conquering K AA NG K ER IH NG
+conqueror K AA NG K ER ER
+conqueror's K AA NG K ER ER Z
+conquerors K AA NG K ER ER Z
+conquers K AA NG K ER Z
+conquest K AA NG K W EH S T
+conquest's K AA NG K W EH S T S
+conquests K AA N K W EH S T S
+conquests(2) K AA N K W EH S S
+conquests(3) K AA N K W EH S
+conrac K AA N R AE K
+conrad K AA N R AE D
+conrad's K AA N R AE D Z
+conrades K AH N R EY D Z
+conradi K AA N R AA D IY
+conradine K AA N R AH D AY N
+conrads K AA N R AE D Z
+conradt K AA N R AE T
+conrady K AH N R AA D IY
+conrail K AA N R EY L
+conrail's K AA N R EY L Z
+conran K AA N R AH N
+conrath K AA N R AH TH
+conrey K AA N R IY
+conroe K AA N R OW
+conrow K AA N R OW
+conroy K AO N R OY
+conry K AA N R IY
+cons K AA N Z
+consalvo K AA N S AA L V OW
+conscience K AA N SH AH N S
+consciences K AA N CH IH N S IH Z
+conscientious K AA N SH IY EH N SH AH S
+conscientiously K AA N CH IY EH N CH AH S L IY
+conscious K AA N SH AH S
+consciously K AA N SH AH S L IY
+consciousness K AA N SH AH S N AH S
+conscript K AA N S K R IH P T
+conscript(2) K AH N S K R IH P T
+conscripted K AH N S K R IH P T IH D
+conscription K AH N S K R IH P SH AH N
+conscripts K AA N S K R IH P T S
+conseco K AA N S EY K OW
+conseco's K AA N S EY K OW Z
+conseco's(2) K AH N S EY K OW Z
+conseco(2) K AH N S EY K OW
+consecrate K AA N S AH K R EY T
+consecrated K AA N S AH K R EY T AH D
+consecrated(2) K AA N S AH K R EY T IH D
+consecration K AA N S AH K R EY SH AH N
+consecrations K AA N S AH K R EY SH AH N Z
+consecutive K AH N S EH K Y AH T IH V
+consecutively K AH N S EH K Y AH T IH V L IY
+consensual K AH N S EH N S UW AH L
+consensual(2) K AH N S EH N SH UW AH L
+consensus K AH N S EH N S AH S
+consent K AH N S EH N T
+consented K AH N S EH N T IH D
+consented(2) K AH N S EH N IH D
+consenting K AH N S EH N T IH NG
+consenting(2) K AH N S EH N IH NG
+consentino K AA N S EH N T IY N OW
+consents K AH N S EH N T S
+consequence K AA N S AH K W AH N S
+consequences K AA N S AH K W EH N S AH Z
+consequent K AA N S AH K W AH N T
+consequential K AA N S AH K W EH N CH AH L
+consequently K AA N S AH K W AH N T L IY
+consequently(2) K AA N S AH K W EH N T L IY
+conser K AA N S ER
+conservancy K AH N S ER V AH N S IY
+conservancy's K AH N S ER V AH N S IY Z
+conservation K AA N S ER V EY SH AH N
+conservationist K AA N S ER V EY SH AH N AH S T
+conservationists K AA N S ER V EY SH AH N AH S T S
+conservationists(2) K AA N S ER V EY SH AH N AH S S
+conservationists(3) K AA N S ER V EY SH AH N AH S
+conservatism K AH N S ER V AH T IH Z AH M
+conservative K AH N S ER V AH T IH V
+conservatively K AH N S ER V AH T IH V L IY
+conservatives K AH N S ER V AH T IH V Z
+conservatives' K AH N S ER V AH T IH V Z
+conservativism K AH N S ER V AH T IH V IH Z AH M
+conservator K AH N S ER V AH T ER
+conservatories K AH N S ER V AH T AO R IY Z
+conservators K AH N S ER V AH T ER Z
+conservatorship K AH N S ER V AH T ER SH IH P
+conservatory K AH N S ER V AH T AO R IY
+conserve K AH N S ER V
+conserved K AH N S ER V D
+conserving K AH N S ER V IH NG
+conshohocken K AA N SH AH HH AA K AH N
+consider K AH N S IH D ER
+considerable K AH N S IH D ER AH B AH L
+considerably K AH N S IH D ER AH B L IY
+considerate K AH N S IH D ER AH T
+consideration K AH N S IH D ER EY SH AH N
+considerations K AH N S IH D ER EY SH AH N Z
+considered K AH N S IH D ER D
+considering K AH N S IH D ER IH NG
+considers K AH N S IH D ER Z
+considine K AA N S IH D AY N
+consiglio K AA N S IY G L IY OW
+consign K AH N S AY N
+consigned K AH N S AY N D
+consignment K AH N S AY N M AH N T
+consis K AA N S IH S
+consist K AH N S IH S T
+consisted K AH N S IH S T AH D
+consisted(2) K AH N S IH S T IH D
+consistence K AH N S IH S T AH N S
+consistency K AH N S IH S T AH N S IY
+consistent K AH N S IH S T AH N T
+consistently K AH N S IH S T AH N T L IY
+consisting K AH N S IH S T IH NG
+consists K AH N S IH S T S
+consists(2) K AH N S IH S S
+consists(3) K AH N S IH S
+consob K AA N S AA B
+consol K AA N S AA L
+consol's K AA N S AA L Z
+consolable K AH N S OW L AH B AH L
+consolably K AH N S OW L AH B L IY
+consolata K AA N S OW L AA T AH
+consolation K AA N S AH L EY SH AH N
+consolations K AA N S AH L EY SH AH N Z
+console K AA N S OW L
+console(2) K AH N S OW L
+consoled K AH N S OW L D
+consoles K AH N S OW L Z
+consoli K AA N S OW L IY
+consolidate K AH N S AA L IH D EY T
+consolidated K AH N S AA L AH D EY T AH D
+consolidated's K AH N S AA L IH D EY T IH D Z
+consolidates K AH N S AA L IH D EY T S
+consolidating K AH N S AA L AH D EY T IH NG
+consolidation K AH N S AA L AH D EY SH AH N
+consolidations K AH N S AA L IH D EY SH AH N Z
+consolidator K AH N S AA L IH D EY T ER
+consolidators K AH N S AA L IH D EY T ER Z
+consoling K AH N S OW L IH NG
+consolo K AA N S OW L OW
+consonant K AA N S AH N AH N T
+consonantal K AA N S AH N AA N T AH L
+consonantal(2) K AA N S AH N AA N AH L
+consonants K AA N S AH N AH N T S
+consort K AH N S AO R T
+consortia K AH N S AO R SH AH
+consorting K AH N S AO R T IH NG
+consortium K AH N S AO R SH IY AH M
+consortium's K AH N S AO R SH IY AH M Z
+consortium's(2) K AH N S AO R SH Y AH M Z
+consortium(2) K AH N S AO R SH Y AH M
+consortiums K AH N S AO R SH AH M Z
+consortiums(2) K AH N S AO R SH Y AH M Z
+conspicuous K AH N S P IH K Y UW AH S
+conspicuously K AH N S P IH K Y UW AH S L IY
+conspiracies K AH N S P IH R AH S IY Z
+conspiracy K AH N S P IH R AH S IY
+conspirator K AH N S P IH R AH T ER
+conspiratorial K AH N S P IH R AH T AO R IY AH L
+conspiratorially K AH N S P IH R AH T AO R IY AH L IY
+conspiratorially(2) K AH N S P IH R AH T AO R Y AH L IY
+conspirators K AH N S P IH R AH T ER Z
+conspire K AH N S P AY ER
+conspired K AH N S P AY ER D
+conspiring K AH N S P AY R IH NG
+constable K AA N S T AH B AH L
+constables K AA N S T AH B AH L Z
+constabulary K AH N S T AE B Y AH L EH R IY
+constance K AA N S T AH N S
+constancy K AA N S T AH N S IY
+constant K AA N S T AH N T
+constant's K AA N S T AH N T S
+constanta K AA N S T AA N T AH
+constantin K AH N S T AE N T IH N
+constantina K AA N S T AA N T IY N AH
+constantine K AA N S T AH N T IY N
+constantine(2) K AA N S T AH N T AY N
+constantinides K AA N S T AH N T AH N IY D AH S
+constantinides(2) K AA N S T AE N T AH N IY D IY Z
+constantino K AA N S T AH N T IY N OW
+constantinople K AA N S T AE N T AH N OW P AH L
+constantinos K AA N S T AH N T IY N OW S
+constantly K AA N S T AH N T L IY
+constants K AA N S T AH N T S
+constar K AA N S T AA R
+constellation K AA N S T AH L EY SH AH N
+constellation's K AA N S T AH L EY SH AH N Z
+constellations K AA N S T AH L EY SH AH N Z
+consternation K AA N S T ER N EY SH AH N
+constipate K AA N S T AH P EY T
+constipated K AA N S T AH P EY T AH D
+constipates K AA N S T AH P EY T S
+constipation K AA N S T AH P EY SH AH N
+constituencies K AH N S T IH CH UW AH N S IY Z
+constituency K AH N S T IH CH UW AH N S IY
+constituent K AH N S T IH CH UW AH N T
+constituents K AH N S T IH CH UW AH N T S
+constituents' K AH N S T IH CH UW AH N T S
+constitute K AA N S T AH T UW T
+constituted K AA N S T AH T UW T AH D
+constitutes K AA N S T AH T UW T S
+constituting K AA N S T AH T UW T IH NG
+constitution K AA N S T AH T UW SH AH N
+constitution's K AA N S T IH T UW SH AH N Z
+constitutional K AA N S T AH T UW SH AH N AH L
+constitutionality K AA N S T IH T UW SH AH N AE L IH T IY
+constitutionally K AA N S T AH T UW SH AH N AH L IY
+constitutionist K AA N S T AH T UW SH AH N IH S T
+constitutionists K AA N S T AH T UW SH AH N IH S T S
+constitutionists(2) K AA N S T AH T UW SH AH N IH S S
+constitutionists(3) K AA N S T AH T UW SH AH N IH S
+constitutions K AA N S T IH T UW SH AH N Z
+constrain K AH N S T R EY N
+constrained K AH N S T R EY N D
+constraining K AH N S T R EY N IH NG
+constrains K AH N S T R EY N Z
+constraint K AH N S T R EY N T
+constraints K AH N S T R EY N T S
+constrict K AH N S T R IH K T
+constricted K AH N S T R IH K T AH D
+constricting K AH N S T R IH K T IH NG
+constriction K AH N S T R IH K SH AH N
+constrictions K AH N S T R IH K SH AH N Z
+constrictor K AH N S T R IH K T ER
+constrictors K AH N S T R IH K T ER Z
+construcciones K AH N S T R UW CH IY OW N EY Z
+construct K AH N S T R AH K T
+construct(2) K AA N S T R AH K T
+constructed K AH N S T R AH K T AH D
+constructed(2) K AH N S T R AH K T IH D
+constructing K AH N S T R AH K T IH NG
+construction K AH N S T R AH K SH AH N
+constructionist K AH N S T R AH K SH AH N IH S T
+constructions K AH N S T R AH K SH AH N Z
+constructive K AH N S T R AH K T IH V
+constructively K AH N S T R AH K T IH V L IY
+constructor K AH N S T R AH K T ER
+constructors K AH N S T R AH K T ER Z
+constructs K AH N S T R AH K T S
+constructs(2) K AA N S T R AH K T S
+construe K AH N S T R UW
+construed K AH N S T R UW D
+consuela K AH N S W EY L AH
+consul K AA N S AH L
+consular K AA N S AH L ER
+consulate K AA N S AH L AH T
+consulates K AA N S AH L AH T S
+consulship K AA N S AH L SH IH P
+consult K AH N S AH L T
+consultancy K AH N S AH L T AH N S IY
+consultant K AH N S AH L T AH N T
+consultant's K AH N S AH L T AH N T S
+consultants K AH N S AH L T AH N T S
+consultants' K AH N S AH L T AH N T S
+consultation K AA N S AH L T EY SH AH N
+consultations K AA N S AH L T EY SH AH N Z
+consultative K AH N S AH L T AH T IH V
+consulted K AH N S AH L T AH D
+consulted(2) K AH N S AH L T IH D
+consulting K AH N S AH L T IH NG
+consults K AH N S AH L T S
+consumable K AH N S UW M AH B AH L
+consume K AH N S UW M
+consumed K AH N S UW M D
+consumer K AH N S UW M ER
+consumer's K AH N S UW M ER Z
+consumerism K AH N S UW M ER IH Z AH M
+consumerist K AH N S UW M ER IH S T
+consumerists K AH N S UW M ER IH S T S
+consumerists(2) K AH N S UW M ER IH S S
+consumerists(3) K AH N S UW M ER IH S
+consumers K AH N S UW M ER Z
+consumers' K AH N S UW M ER Z
+consumes K AH N S UW M Z
+consuming K AH N S UW M IH NG
+consummate K AA N S AH M AH T
+consummate(2) K AA N S AH M EY T
+consummated K AA N S AH M EY T AH D
+consummates K AA N S AH M EY T S
+consummating K AA N S AH M EY T IH NG
+consummation K AA N S AH M EY SH AH N
+consumption K AH N S AH M P SH AH N
+consumption(2) K AH N S AH M SH AH N
+contac K AA N T AE K
+contact K AA N T AE K T
+contacted K AA N T AE K T IH D
+contacting K AA N T AE K T IH NG
+contacts K AA N T AE K T S
+contacts(2) K AA N T AE K S
+contadora K AA N T AH D AO R AH
+contagion K AH N T EY JH AH N
+contagious K AH N T EY JH AH S
+contagiousness K AH N T EY JH AH S N AH S
+contain K AH N T EY N
+contained K AH N T EY N D
+container K AH N T EY N ER
+container's K AH N T EY N ER Z
+containerboard K AH N T EY N ER B AO R D
+containerize K AH N T EY N ER AY Z
+containerized K AH N T EY N ER AY Z D
+containers K AH N T EY N ER Z
+containers' K AH N T EY N ER Z
+containing K AH N T EY N IH NG
+containment K AH N T EY N M AH N T
+contains K AH N T EY N Z
+contaminant K AH N T AE M AH N AH N T
+contaminants K AH N T AE M AH N AH N T S
+contaminate K AH N T AE M AH N EY T
+contaminated K AH N T AE M AH N EY T AH D
+contaminated(2) K AH N T AE M AH N EY T IH D
+contaminates K AH N T AE M AH N EY T S
+contaminating K AH N T AE M AH N EY T IH NG
+contamination K AH N T AE M AH N EY SH AH N
+contant K AA N T AH N T
+conte K AO N T
+conte(2) K AO N T EY
+contel K AA N T EH L
+contemplate K AA N T AH M P L EY T
+contemplated K AA N T AH M P L EY T IH D
+contemplates K AA N T AH M P L EY T S
+contemplating K AA N T AH M P L EY T IH NG
+contemplation K AA N T AH M P L EY SH AH N
+contemplative K AH N T EH M P L AH T IH V
+contempo K AA N T EH M P OW
+contemporaneous K AH N T EH M P ER EY N IY AH S
+contemporaneously K AH N T EH M P ER EY N IY AH S L IY
+contemporaries K AH N T EH M P ER EH R IY Z
+contemporary K AH N T EH M P ER EH R IY
+contempt K AH N T EH M P T
+contemptible K AH N T EH M P T AH B AH L
+contemptuous K AH N T EH M P CH UW AH S
+contemptuously K AH N T EH M P CH W AH S L IY
+contend K AH N T EH N D
+contended K AH N T EH N D IH D
+contender K AH N T EH N D ER
+contenders K AH N T EH N D ER Z
+contending K AH N T EH N D IH NG
+contends K AH N T EH N D Z
+contends(2) K AH N T EH N Z
+content K AA N T EH N T
+content(2) K AH N T EH N T
+contented K AH N T EH N T AH D
+contented(2) K AH N T EH N T IH D
+contentedly K AH N T EH N T AH D L IY
+contention K AH N T EH N SH AH N
+contentioned K AH N T EH N SH AH N D
+contentions K AH N T EH N SH AH N Z
+contentious K AH N T EH N SH AH S
+contentiousness K AH N T EH N SH AH S N AH S
+contentment K AH N T EH N T M AH N T
+contento K AH N T EH N T OW
+contents K AA N T EH N T S
+contents(2) K AH N T EH N T S
+contest K AA N T EH S T
+contest's K AA N T EH S T S
+contest(2) K AH N T EH S T
+contestable K AH N T EH S T AH B AH L
+contestant K AH N T EH S T AH N T
+contestants K AH N T EH S T AH N T S
+contested K AH N T EH S T AH D
+contesting K AH N T EH S T IH NG
+contests K AA N T EH S T S
+contests(2) K AH N T EH S T S
+contests(3) K AA N T EH S
+contests(4) K AH N T EH S
+context K AA N T EH K S T
+contexts K AA N T EH K S T S
+conti K AA N T IY
+contibel K AA N T IH B AH L
+conticommodity K AA N T IH K AH M AA D IH T IY
+contiguous K AH N T IH G Y UW AH S
+continent K AA N T AH N AH N T
+continent's K AA N T AH N AH N T S
+continental K AA N T AH N EH N T AH L
+continental's K AA N T AH N EH N T AH L Z
+continental(2) K AA N T AH N EH N AH L
+continentally K AA N T AH N EH N T AH L IY
+continentally(2) K AA N T AH N EH N AH L IY
+continentals K AA N T AH N EH N T AH L Z
+continentals(2) K AA N T AH N EH N AH L Z
+continents K AA N T AH N AH N T S
+contingencies K AH N T IH N JH AH N S IY Z
+contingency K AH N T IH N JH AH N S IY
+contingent K AH N T IH N JH AH N T
+contingents K AH N T IH N JH AH N T S
+contini K AH N T IY N IY
+contino K AA N T IY N OW
+continual K AH N T IH N Y UW AH L
+continually K AH N T IH N Y UW AH L IY
+continually(2) K AH N T IH N Y UW L IY
+continuance K AH N T IH N Y UW AH N S
+continuances K AH N T IH N Y UW AH N S IH Z
+continuation K AH N T IH N Y UW EY SH AH N
+continue K AH N T IH N Y UW
+continued K AH N T IH N Y UW D
+continues K AH N T IH N Y UW Z
+continuing K AH N T IH N Y UW IH NG
+continuity K AA N T AH N UW AH T IY
+continuous K AH N T IH N Y UW AH S
+continuously K AH N T IH N Y UW AH S L IY
+continuum K AH N T IH N Y UW AH M
+contois K AH N T W AA
+contort K AH N T AO R T
+contorted K AH N T AO R T AH D
+contortion K AH N T AO R SH AH N
+contortionist K AH N T AO R SH AH N AH S T
+contortions K AH N T AO R SH AH N Z
+contorts K AH N T AO R T S
+contos K AA N T OW Z
+contour K AA N T UH R
+contoured K AA N T UH R D
+contours K AA N T UH R Z
+contra K AA N T R AH
+contraband K AA N T R AH B AE N D
+contrabassoon K AA N T R AH B AE S UW N
+contraception K AA N T R AH S EH P SH AH N
+contraceptive K AA N T R AH S EH P T IH V
+contraceptives K AA N T R AH S EH P T IH V Z
+contract K AA N T R AE K T
+contract's K AA N T R AE K T S
+contract(2) K AH N T R AE K T
+contracted K AA N T R AE K T AH D
+contracting K AA N T R AE K T IH NG
+contraction K AH N T R AE K SH AH N
+contractionary K AH N T R AE K SH AH N EH R IY
+contractions K AH N T R AE K SH AH N Z
+contractor K AA N T R AE K T ER
+contractor's K AA N T R AE K T ER Z
+contractors K AA N T R AE K T ER Z
+contractors' K AH N T R AE K T ER Z
+contracts K AA N T R AE K T S
+contracts(2) K AH N T R AE K T S
+contractual K AH N T R AE K CH UW AH L
+contractually K AH N T R AE K CH UW AH L IY
+contradict K AA N T R AH D IH K T
+contradicted K AA N T R AH D IH K T AH D
+contradicting K AA N T R AH D IH K T IH NG
+contradiction K AA N T R AH D IH K SH AH N
+contradictions K AA N T R AH D IH K SH AH N Z
+contradictorily K AA N T R AH D IH K T ER AH L IY
+contradictory K AA N T R AH D IH K T ER IY
+contradicts K AA N T R AH D IH K T S
+contran K AA N T R AE N
+contraption K AH N T R AE P SH AH N
+contraptions K AH N T R AE P SH AH N Z
+contrarian K AA N T R EH R IY AH N
+contrarians K AH N T R EH R IY AH N Z
+contrariness K AA N T R EH R IY N AH S
+contrary K AA N T R EH R IY
+contrary(2) K AH N T R EH R IY
+contras K AA N T R AH Z
+contras' K AA N T R AH Z
+contras(2) K AO N T R AH Z
+contrast K AA N T R AE S T
+contrast(2) K AH N T R AE S T
+contrasted K AH N T R AE S T AH D
+contrasting K AH N T R AE S T IH NG
+contrasts K AA N T R AE S T S
+contrasts(2) K AH N T R AE S T S
+contrasts(3) K AA N T R AE S
+contrasts(4) K AH N T R AE S
+contravene K AA N T R AH V IY N
+contravention K AA N T R AH V EH N CH AH N
+contreras K AA N T R EH R AA Z
+contretemps K AA N T R AH T EH M P S
+contribute K AH N T R IH B Y UW T
+contributed K AH N T R IH B Y UW T IH D
+contributes K AH N T R IH B Y UW T S
+contributing K AH N T R IH B Y UW T IH NG
+contribution K AA N T R AH B Y UW SH AH N
+contributions K AA N T R AH B Y UW SH AH N Z
+contributor K AH N T R IH B Y AH T ER
+contributors K AH N T R IH B Y AH T ER Z
+contributory K AH N T R IH B Y AH T AO R IY
+contrite K AH N T R AY T
+contrition K AH N T R IH SH AH N
+contrivance K AH N T R AY V AH N S
+contrivances K AH N T R AY V AH N S IH Z
+contrive K AH N T R AY V
+contrived K AH N T R AY V D
+control K AH N T R OW L
+control's K AH N T R OW L Z
+controladora K AH N T R OW L AH D AO R AH
+controllable K AH N T R OW L AH B AH L
+controlled K AH N T R OW L D
+controller K AH N T R OW L ER
+controller's K AH N T R OW L ER Z
+controllers K AH N T R OW L ER Z
+controllers' K AH N T R AA L ER Z
+controlling K AH N T R OW L IH NG
+controls K AH N T R OW L Z
+controls' K AA N T R AA L Z
+controversial K AA N T R AH V ER SH AH L
+controversies K AA N T R AH V ER S IY Z
+controversy K AA N T R AH V ER S IY
+contura K AA N T UH R AH
+contusion K AH N T UW ZH AH N
+contusions K AH N T UW ZH AH N Z
+conundrum K AH N AH N D R AH M
+conus K OW N AH S
+convair K AA N V EH R
+convalesce K AA N V AH L EH S
+convalescence K AA N V AH L EH S AH N S
+convalescent K AA N V AH L EH S AH N T
+convection K AH N V EH K SH AH N
+convective K AH N V EH K T IH V
+convene K AH N V IY N
+convened K AH N V IY N D
+convenes K AH N V IY N Z
+convenience K AH N V IY N Y AH N S
+conveniences K AH N V IY N Y AH N S IH Z
+convenient K AH N V IY N Y AH N T
+conveniently K AH N V IY N Y AH N T L IY
+convening K AH N V IY N IH NG
+convent K AA N V AH N T
+convent(2) K AA N V EH N T
+convention K AH N V EH N SH AH N
+convention's K AH N V EH N SH AH N Z
+conventional K AH N V EH N SH AH N AH L
+conventionally K AH N V EH N SH AH N AH L IY
+conventioneer K AH N V EH N SH AH N IH R
+conventioneers K AH N V EH N SH AH N IH R Z
+conventions K AH N V EH N SH AH N Z
+convents K AA N V AH N T S
+convents(2) K AA N V EH N T S
+converge K AH N V ER JH
+converged K AH N V ER JH D
+convergence K AH N V ER JH AH N S
+convergent K AH N V ER JH AH N T
+converging K AH N V ER JH IH NG
+conversant K AH N V ER S AH N T
+conversation K AA N V ER S EY SH AH N
+conversational K AA N V ER S EY SH AH N AH L
+conversationalist K AA N V ER S EY SH AH N AH L AH S T
+conversations K AA N V ER S EY SH AH N Z
+converse K AA N V ER S
+converse(2) K AH N V ER S
+conversed K AH N V ER S T
+conversely K AA N V ER S L IY
+converses K AA N V ER S AH Z
+converses(2) K AH N V ER S AH Z
+conversing K AH N V ER S IH NG
+conversion K AH N V ER ZH AH N
+conversion's K AH N V ER ZH AH N Z
+conversions K AH N V ER ZH AH N Z
+convert K AA N V ER T
+convert(2) K AH N V ER T
+converted K AH N V ER T IH D
+converter K AH N V ER T ER
+converters K AH N V ER T ER Z
+convertibility K AA N V ER T IH B IH L IH T IY
+convertible K AH N V ER T AH B AH L
+convertibles K AH N V ER T AH B AH L Z
+converting K AH N V ER T IH NG
+converts K AA N V ER T S
+converts(2) K AH N V ER T S
+convery K AA N V ER IY
+convex K AH N V EH K S
+convex(2) K AA N V EH K S
+convey K AH N V EY
+conveyance K AH N V EY AH N S
+conveyed K AH N V EY D
+conveyer K AH N V EY ER
+conveying K AH N V EY IH NG
+conveyor K AH N V EY ER
+conveys K AH N V EY Z
+convict K AA N V IH K T
+convict(2) K AH N V IH K T
+convicted K AH N V IH K T AH D
+convicting K AH N V IH K T IH NG
+conviction K AH N V IH K SH AH N
+convictions K AH N V IH K SH AH N Z
+convicts K AA N V IH K T S
+convicts(2) K AH N V IH K T S
+conville K AA N V IH L
+convince K AH N V IH N S
+convinced K AH N V IH N S T
+convinces K AH N V IH N S IH Z
+convincing K AH N V IH N S IH NG
+convincingly K AH N V IH N S IH NG L IY
+convivial K AH N V IH V IY AH L
+convocation K AA N V AH K EY SH AH N
+convolute K AA N V AH L UW T
+convoluted K AA N V AH L UW T AH D
+convolution K AA N V AH L UW SH AH N
+convoy K AA N V OY
+convoys K AA N V OY Z
+convulsant K AH V AH L S AH N T
+convulsants K AH N V AH L S AH N T S
+convulsion K AH N V AH L SH AH N
+convulsions K AH N V AH L SH AH N Z
+convulsive K AH N V AH L S IH V
+conway K AA N W EY
+conwell K AA N W EH L
+conyer K AA N Y ER
+conyers K AA N Y ER Z
+coo K UW
+coochie K UW CH IY
+coody K UW D IY
+coogan K UW G AH N
+coogle K UW G AH L
+coogler K UW G AH L ER
+coogler(2) K UW G L ER
+cooing K UW IH NG
+cook K UH K
+cook's K UH K S
+cookbook K UH K B UH K
+cookbook's K UH K B UH K S
+cookbooks K UH K B UH K S
+cooke K UH K
+cooked K UH K T
+cooker K UH K ER
+cookers K UH K ER Z
+cookie K UH K IY
+cookies K UH K IY Z
+cookin' K UH K IH N
+cooking K UH K IH NG
+cookingham K UH K IH NG HH AE M
+cookman K UH K M AH N
+cookout K UH K AW T
+cookouts K UH K AW T S
+cooks K UH K S
+cooksey K UH K S IY
+cookson K UH K S AH N
+cookston K UH K S T AH N
+cookware K UH K W EH R
+cool K UW L
+coolant K UW L AH N T
+coolants K UW L AH N T S
+coolbaugh K UW L B AO
+coole K UW L
+cooled K UW L D
+cooler K UW L ER
+coolers K UW L ER Z
+coolest K UW L AH S T
+cooley K UW L IY
+cooley's K UW L IY Z
+coolidge K UW L IH JH
+coolidge's K UW L IH JH AH Z
+cooling K UW L IH NG
+coolio K UW L IY OW
+coolio(2) K UW L Y OW
+coolly K UW L IY
+coolman K UW L M AH N
+coolness K UW L N AH S
+cools K UW L Z
+coombe K UW M B
+coombe(2) K UW M
+coombes K UW M B Z
+coombes(2) K UW M Z
+coombs K UW M Z
+coomer K UW M ER
+coomes K UW M Z
+coon K UW N
+coonan K UW N AH N
+coonce K UW N S
+coone K UW N
+cooner K UW N ER
+coones K UW N Z
+cooney K UW N IY
+coonradt K UW N R AE T
+coonrod K UW N R AA D
+coons K UW N Z
+coontz K UW N T S
+coop K UW P
+cooped K UW P T
+cooper K UW P ER
+cooper's K UW P ER Z
+cooperage K UW P ER AH JH
+cooperate K OW AA P ER EY T
+cooperate(2) K W AA P ER EY T
+cooperated K OW AA P ER EY T AH D
+cooperated(2) K W AA P ER EY T AH D
+cooperates K OW AA P ER EY T S
+cooperating K OW AA P ER EY T IH NG
+cooperation K OW AA P ER EY SH AH N
+cooperation(2) K W AA P ER EY SH AH N
+cooperation(3) K W AO P ER EY SH AH N
+cooperations K OW AA P ER EY SH AH N Z
+cooperations(2) K W AA P ER EY SH AH N Z
+cooperative K OW AA P ER EY T IH V
+cooperatively K OW AA P R AH T IH V L IY
+cooperatives K OW AA P R AH T IH V Z
+cooperider K UW P ER AY D ER
+cooperman K UW P ER M AE N
+cooperrider K UW P ER AY D ER
+coopers K UW P ER Z
+coopersmith K UW P ER S M IH TH
+cooperstein K UW P ER S T AY N
+cooperstein(2) K UW P ER S T IY N
+cooperstown K UW P ER Z T AW N
+coopervision K UW P ER V IH ZH AH N
+coopman K UW P M AH N
+cooprider K UW P R AY D ER
+coordinate K OW AO R D AH N AH T
+coordinate(2) K OW AO R D AH N EY T
+coordinated K OW AO R D AH N EY T IH D
+coordinates K OW AO R D AH N AH T S
+coordinates(2) K OW AO R D AH N EY T S
+coordinating K OW AO R D AH N EY T IH NG
+coordination K OW AO R D AH N EY SH AH N
+coordinator K OW AO R D AH N EY T ER
+coordinators K OW AO R D AH N EY T ER Z
+coors K UW R Z
+coors's K UW R Z IH Z
+coos K UW S
+coosa K UW S AH
+coot K UW T
+coote K UW T
+cooter K UW T ER
+coots K UW T S
+coover K UW V ER
+coovick K UW V IH K
+cop K AA P
+copa K OW P AH
+copacabana K OW P AH K AH B AE N AH
+copartner K OW P AA R T N ER
+copartners K OW P AA R T N ER Z
+copas K OW P AH Z
+copayment K OW P EY M AH N T
+copayments K OW P EY M AH N T S
+copco K AA P K OW
+cope K OW P
+coped K OW P T
+copelan K AA P IH L AE N
+copeland K OW P L AH N D
+copeland's K OW P L AH N D Z
+copelco K OW P EH L K OW
+copelin K AA P IH L IH N
+copeman K OW P M AH N
+copen K OW P AH N
+copenhagen K OW P AH N HH EY G AH N
+copenhagen's K OW P AH N HH EY G AH N Z
+copenhagen's(2) K OW P AH N HH AA G AH N Z
+copenhagen(2) K OW P AH N HH AA G AH N
+copenhaver K AH P EH N HH AH V ER
+copernican K AH P ER N AH K AH N
+copernicus K AH P ER N AH K AH S
+copes K OW P S
+copetas K AH P EY T AH S
+copetas(2) K AH P IY T AH S
+copher K AA F ER
+copiague K OW P IY AE G
+copied K AA P IY D
+copier K AA P IY ER
+copiers K AA P IY ER Z
+copies K AA P IY Z
+copilot K OW P AY L AH T
+copilots K OW P AY L AH T S
+coping K OW P IH NG
+copious K OW P IY AH S
+copiously K OW P Y AH S L IY
+coplan K AA P L AH N
+copland K AA P L AH N D
+coplen K AA P AH L AH N
+copley K AA P L IY
+copley's K AA P L IY Z
+copleys K AA P L IY Z
+coplin K AA P L IH N
+copolla K OW P OW L AH
+copolla's K OW P OW L AH Z
+copp K AA P
+coppa K OW P AH
+coppage K AA P IH JH
+copped K AA P T
+coppedge K AA P IH JH
+coppee K AA P IY
+coppel K AA P AH L
+coppens K AA P AH N Z
+copper K AA P ER
+copper's K AA P ER Z
+copperfield K AA P ER F IY L D
+copperfield's K AA P ER F IY L D Z
+copperfields K AA P ER F IY L D Z
+copperfields' K AA P ER F IY L D Z
+copperhead K AA P ER HH EH D
+copperheads K AA P ER HH EH D Z
+copperman K AA P ER M AH N
+coppernoll K AH P ER N OW L
+coppers K AA P ER Z
+coppersmith K AA P ER S M IH TH
+copperweld K AA P ER W EH L D
+coppery K AA P ER IY
+coppess K AA P AH S
+coppin K AA P IH N
+copping K AA P IH NG
+coppinger K AA P IH NG ER
+coppins K AA P IH N Z
+copple K AA P AH L
+coppock K AA P AH K
+coppola K OW P OW L AH
+coppola's K OW P OW L AH Z
+coppolino K OW P OW L IY N OW
+copps K AA P S
+copra K OW P R AH
+coprocessor K OW P R AA S EH S ER
+coprocessors K OW P R AA S EH S ER Z
+cops K AA P S
+copsey K AA P S IY
+coptic K AA P T IH K
+copulate K AA P Y AH L EY T
+copus K OW P AH S
+copy K AA P IY
+copycat K AA P IY K AE T
+copycats K AA P IY K AE T S
+copycatting K AA P IY K AE T IH NG
+copycode K AA P IY K OW D
+copycodes K AA P IY K OW D Z
+copying K AA P IY IH NG
+copyreader K AA P IY R IY D ER
+copyreaders K AA P IY R IY D ER Z
+copyright K AA P IY R AY T
+copyrightable K AA P IY R AY T AH B AH L
+copyrighted K AA P IY R AY T IH D
+copyrights K AA P IY R AY T S
+copytele K AA P IY T EH L AH
+copywrite K AA P IY R AY T
+copywrited K AA P IY R AY T IH D
+copywriter K AA P IY R AY T ER
+copywriters K AA P IY R AY T ER Z
+cor K AO R
+cora K AO R AH
+cora's K AO R AH Z
+corabelle K AO R AH B AH L
+corabelle(2) K AO R AH B EH L
+coracle K AO R AH K AH L
+coral K AO R AH L
+coralie K AO R AH L IY
+coraline K AO R AH L AY N
+corallo K AO R AE L OW
+corals K AO R AH L Z
+coram K AO R AE M
+corath K AO R AE TH
+corazon K AO R AH Z OW N
+corban K AO R B AH N
+corbeil K AO R B AY L
+corbel K AO R B AH L
+corbell K AO R B EH L
+corbelled K AO R B AH L D
+corbello K ER B EH L OW
+corbet K AO R B IH T
+corbett K AO R B IH T
+corbin K AO R B IH N
+corbit K AO R B IH T
+corbitt K AO R B IH T
+corbo K AO R B OW
+corbridge K AO R B R IH JH
+corbu K AO R B UW
+corbusier K AO R B Y UW S Y ER
+corby K AO R B IY
+corcap K AO R K AE P
+corcoran K AO R K ER AH N
+cord K AO R D
+corda K AO R D AH
+cordage K AO R D AH JH
+cordaro K ER D AA R OW
+cordasco K ER D AA S K OW
+corday K AO R D EY
+corded K AO R D AH D
+cordeiro K ER D EH R OW
+cordell K AO R D EH L
+corder K AO R D ER
+cordero K ER D EH R OW
+cordes K AO R D Z
+cordesman K AO R D AH S M AH N
+cordial K AO R JH AH L
+cordially K AO R JH AH L IY
+cordials K AO R JH AH L Z
+cordiant K AO R D IY AH N T
+cordiant's K AO R D IY AH N T S
+cordie K AO R D IY
+cordier K AO R D IY ER
+cordill K AO R D AH L
+cording K AO R D IH NG
+cordis K AO R D IH S
+cordle K AO R D AH L
+cordless K AO R D L AH S
+cordner K AO R D N ER
+cordoba K AO R D OW B AH
+cordoba's K AO R D OW B AH Z
+cordobas K AO R D OW B AH Z
+cordon K AO R D AH N
+cordone K AO R D AH N
+cordoned K AO R D AH N D
+cordova K AO R D OW V AH
+cordover K AO R D OW V ER
+cordovez K AO R D OW V EH Z
+cordray K AO R D R EY
+cordrey K AO R D R IY
+cordry K AO R D ER IY
+cords K AO R D Z
+cordts K AO R D T S
+corduroy K AO R D ER OY
+cordy K AO R D IY
+core K AO R
+corea K AO R IY AH
+corel K AO R EH L
+corell K AO R EH L
+corella K ER EH L AH
+coren K AO R AH N
+cores K AO R Z
+corespondent K AO R AH S P AA N D AH N T
+corestate K AO R S T EY T
+corestates K AO R S T EY T S
+corestates' K AO R AH S T EY T S
+coretech K AO R T EH K
+coretta K AO R EH T AH
+corette K AO R EH T
+corexit K AO R EH K S IH T S
+corey K AO R IY
+corgi K AO R G IY
+coria K AO R IY AH
+coriander K AO R IY AE N D ER
+coriell K AO R IY L
+corier K AO R IY ER
+corigliano K ER IY G L IY AA N OW
+corina K AO R IY N AH
+corinn K AO R IH N
+corinn's K AO R IH N Z
+corinna K AO R IH N AH
+corinne K ER IY N
+corinth K AO R AH N TH
+corinthian K ER IH N TH IY AH N
+corinto K AO R IH N T OW
+corio K AO R IY OW
+corisa K ER IY S AH
+corissa K AO R IH S AH
+cork K AO R K
+corken K AO R K AH N
+corker K AO R K ER
+corkern K AO R K ER N
+corkery K AO R K ER IY
+corkill K AO R K IH L
+corking K AO R K IH NG
+corkins K AO R K IH N Z
+corkran K AO R K R AH N
+corks K AO R K S
+corkscrew K AO R K S K R UW
+corkum K AO R K AH M
+corkwood K AO R K W UH D
+corky K AO R K IY
+corl K AO R L
+corle K AO R AH L
+corleone K AO R L IY OW N
+corleone(2) K AO R L IY OW N IY
+corless K AO R L IH S
+corlett K AO R L IH T
+corlew K AO R L UW
+corley K AO R L IY
+corliss K AO R L IH S
+cormac K AO R M AH K
+cormack K AO R M AH K
+corman K AO R M AH N
+cormany K AO R M AH N IY
+cormen K AO R M AH N
+cormen(2) K AO R M IH N
+cormican K AO R M IH K AH N
+cormick K AO R M IH K
+cormier K AO R M IY ER
+cormorant K AO R M ER AH N T
+cormorants K AO R M ER AH N T S
+corn K AO R N
+corna K AO R N AH
+cornacchia K ER N AA K IY AH
+cornall K AO R N AH L
+cornblume K AO R N B L UW M
+cornbread K AO R N B R EH D
+corncob K AO R N K AA B
+corncrib K AO R N K R IH B
+corne K AO R N
+cornea K AO R N IY AH
+corneal K AO R N IY L
+corneas K AO R N IY AH Z
+cornejo K ER N EY Y OW
+cornel K AO R N AH L
+cornela K ER N EH L AH
+cornelia K AO R N IY L Y AH
+cornelio K ER N EH L IY OW
+cornelious K AO R N IH L IY IH S
+cornelious(2) K AO R N IY L Y IH S
+cornelison K ER N EH L IH S AH N
+cornelius K AO R N IY L Y AH S
+corneliuson K AO R N IH L IY UW S AH N
+cornell K AO R N EH L
+cornell's K AO R N EH L Z
+cornelle K ER N EH L
+corner K AO R N ER
+cornerback K AO R N ER B AE K
+cornered K AO R N ER D
+cornering K AO R N ER IH NG
+corners K AO R N ER Z
+cornerstone K AO R N ER S T OW N
+cornerstones K AO R N ER S T OW N Z
+cornet K AO R N EH T
+cornett K AO R N IH T
+cornette K ER N EH T
+cornettist K AO R N EH T AH S T
+corney K AO R N IY
+cornfeld K AO R N F EH L D
+cornfield K AO R N F IY L D
+cornfields K AO R N F IY L D Z
+cornflower K AO R N F L AW ER
+cornflowers K AO R N F L AW ER Z
+cornforth K AO R N F ER TH
+cornhusk K AO R N HH AH S K
+cornhusking K AO R N HH AH S K IH NG
+cornhusks K AO R N HH AH S K S
+cornia K AO R N IY AH
+corniche K AO R N IH SH
+cornick K AO R N IH K
+cornie K AO R N IY
+corniel K AO R N IY L
+corniel's K AO R N IY L Z
+corning K AO R N IH NG
+corning's K AO R N IH NG Z
+cornish K AO R N IH SH
+cornman K AO R N M AH N
+cornmeal K AO R N M IY L
+corns K AO R N Z
+cornstalk K AO R N S T AO K
+cornstalks K AO R N S T AO K S
+cornstarch K AO R N S T AA R CH
+cornucopia K AO R N AH K OW P IY AH
+cornwall K AO R N W AO L
+cornwall's K AO R N W AO L Z
+cornwallis K AO R N W AO L AH S
+cornwell K AO R N W EH L
+corny K AO R N IY
+corolla K ER AA L AH
+corollaries K AO R AH L EH R IY Z
+corollary K AO R AH L EH R IY
+corologis K ER R AA L AH JH IH S
+corona K ER OW N AH
+corona's K ER OW N AH Z
+coronado K ER OW N AA D OW
+coronary K AO R AH N EH R IY
+coronation K AO R AH N EY SH AH N
+coroner K AO R AH N ER
+coroner's K AO R AH N ER Z
+coroners K AO R AH N ER Z
+coronet K AO R AH N EH T
+coronets K AO R AH N EH T S
+corp K AO R P
+corp's K AO R P S
+corp's(2) K AO R P ER EY SH AH N Z
+corp(2) K AO R P ER EY SH AH N
+corp. K AO R P
+corp.'s K AO R P S
+corp.'s(2) K AO R P ER EY SH AH N Z
+corp.(2) K AO R P ER EY SH AH N
+corpening K AO R P AH N IH NG
+corpora K AO R P ER AH
+corporacion K AO R P ER AA S IY OW N
+corporal K AO R P ER AH L
+corporal(2) K AO R P R AH L
+corporate K AO R P ER AH T
+corporate(2) K AO R P R AH T
+corporates K AO R P ER AH T S
+corporatewatch K AO R P R AH T W AA CH
+corporatewide K AO R P ER IH T W AY D
+corporation K AO R P ER EY SH AH N
+corporation's K AO R P ER EY SH AH N Z
+corporations K AO R P ER EY SH AH N Z
+corporations' K AO R P ER EY SH AH N Z
+corporatism K AO R P ER AH T IH Z AH M
+corporatist K AO R P ER AH T IH S T
+corps K AO R
+corps' K AO R Z
+corps(2) K AO R Z
+corpse K AO R P S
+corpses K AO R P S AH Z
+corpses(2) K AO R P S IH Z
+corpsman K AO R M AH N
+corpulant K AO R P Y AH L AH N T
+corpus K AO R P AH S
+corpus-christi K AO R P AH S K R IH S T IY
+corpuz K AO R P UW Z
+corr K AO R
+corradi K ER AA D IY
+corradino K ER AA D IY N OW
+corrado K ER AA D OW
+corral K ER AE L
+corrales K ER AA L EH S
+corralled K ER AE L D
+corralling K ER AE L IH NG
+corrao K AO R AW
+correa K AO R IY AH
+correale K AO R IY AH L
+correct K ER EH K T
+corrected K ER EH K T AH D
+corrected(2) K ER EH K T IH D
+correcting K ER EH K T IH NG
+correction K ER EH K SH AH N
+correctional K ER EH K SH AH N AH L
+corrections K ER EH K SH AH N Z
+corrective K ER EH K T IH V
+correctly K ER EH K T L IY
+correctness K ER EH K T N AH S
+corrects K ER EH K T S
+corregidor K ER EH G AH D AO R
+correia K ER EY IY AH
+correira K ER EH R AH
+correlate K AO R AH L EY T
+correlate(2) K AO R AH L AH T
+correlated K AO R AH L EY T AH D
+correlates K AO R AH L AH T S
+correlates(2) K AO R AH L EY T S
+correlating K AO R AH L EY T IH NG
+correlation K AO R AH L EY SH AH N
+correlations K AO R AH L EY SH AH N Z
+correll K ER EY L
+correne K AO R IY N
+corrente K ER EH N T IY
+correnti K ER EH N T IY
+correspond K AO R AH S P AA N D
+corresponded K AO R AH S P AA N D IH D
+correspondence K AO R AH S P AA N D AH N S
+correspondent K AO R AH S P AA N D AH N T
+correspondents K AO R AH S P AA N D AH N T S
+correspondents' K AO R AH S P AA N D AH N T S
+corresponding K AO R AH S P AA N D IH NG
+correspondingly K AO R AH S P AA N D IH NG L IY
+corresponds K AO R AH S P AA N D Z
+corrib K AO R IH B
+corrick K AO R IH K
+corridor K AO R AH D ER
+corridor(2) K AO R IH D ER
+corridors K AO R IH D ER Z
+corridors(2) K AO R AH D ER Z
+corrie K AO R IY
+corriere K AO R Y EH R
+corrigan K AO R IH G AH N
+corrigan's K AO R IH G AH N Z
+corrigible K AO R AH JH AH B AH L
+corriher K AO R IH HH ER
+corrin K AO R IH N
+corrina K ER IY N AH
+corrington K AO R IH NG T AH N
+corriveau K AO R IH V OW
+corroborate K ER AA B ER EY T
+corroborated K ER AA B ER EY T IH D
+corroborates K ER AO B ER EY T S
+corroborating K ER AA B ER EY T IH NG
+corroboration K ER AO B ER EY SH AH N
+corroborative K ER AA B ER AH T IH V
+corroborative(2) K ER AA B R AH T IH V
+corrode K ER OW D
+corroded K ER OW D IH D
+corrodes K ER OW D Z
+corron K ER AO N
+corroon K AO R UW N
+corrosion K ER OW ZH AH N
+corrosive K ER OW S IH V
+corrow K AO R OW
+corrugate K AO R AH G EY T
+corrugated K AO R AH G EY T AH D
+corrugated(2) K AO R AH G EY T IH D
+corrupt K ER AH P T
+corrupted K ER AH P T IH D
+corruptible K ER AH P T IH B AH L
+corrupting K ER AH P T IH NG
+corruption K ER AH P SH AH N
+corruptions K ER AH P SH AH N Z
+corruptive K ER AH P T IH V
+corruptly K ER AH P T L IY
+corrupts K ER AH P T S
+corry K AO R IY
+corsa K AO S AH
+corsage K AO R S AA ZH
+corsair K AO R S EH R
+corsaro K ER S AA R OW
+corse K AO R S
+corsello K ER S EH L OW
+corsentino K ER S EH N T IY N OW
+corser K AO R S ER
+corset K AO R S AH T
+corsetti K ER S EH T IY
+corsi K AO R S IY
+corsica K AO R S IH K AH
+corsican K AO R S AH K AH N
+corsicas K AO R S IH K AH Z
+corsiglia K ER S IY G L IY AH
+corsini K ER S IY N IY
+corso K AO R S OW
+corson K AO R S AH N
+cort K AO R T
+corte K AO R T
+cortege K AO R T EH ZH
+corteland K AO R T L AH N D
+cortelyou K AO R T EH L Y UW
+corten K AO R T EH N
+cortens K AO R T EH N Z
+cortens' K AO R T EH N Z
+corter K AO R T ER
+cortes K AO R T S
+cortese K ER T EY Z IY
+cortesi K ER T EH S IY
+cortex K AO R T EH K S
+cortez K AO R T EH Z
+corteze K AO R T EH Z
+corti K AO R T IY
+cortical K AO R T AH K AH L
+corticosteroid K AO R T IH K OW S T EH R OY D
+corticosteroids K AO R T IH K OW S T EH R OY D Z
+cortin K AO R T IH N
+cortina K ER T IY N AH
+cortinas K AO R T IY N AH Z
+cortine K AO R T IY N
+cortines K AO R T IY N Z
+cortisol K AO R T IH S AO L
+cortisone K AO R T AH Z OW N
+cortland K AO R T L AH N D
+cortner K AO R T N ER
+cortopassi K ER T OW P AA S IY
+cortright K AO R T R AY T
+corum K AO R AH M
+corundum K ER AH N D AH M
+corva K AO R V AH
+corvallis K AO R V AE L IH S
+corvette K AO R V EH T
+corvettes K AO R V EH T S
+corvin K AO R V IH N
+corvino K ER V IY N OW
+corvo K AO R V OW
+corvus K AO R V AH S
+corwin K AO R W IH N
+cory K AO R IY
+corzine K ER Z IY N IY
+corzo K AO R Z OW
+cos K AO S
+cosa K OW S AH
+cosatu K AH S AA T UW
+cosatu's K AH S AA T UW Z
+cosby K AO Z B IY
+cosby's K AO Z B IY Z
+coscia K OW S CH AH
+cose K OW Z
+cosell K OW S EH L
+cosens K OW S AH N Z
+cosentino K OW S EH N T IY N OW
+cosenza K OW S EH N Z AH
+coseratz K OW Z ER AE T S
+cosette K AH S EH T
+cosey K OW Z IY
+cosgriff K AA S G R IH F
+cosgrove K AA S G R AH V
+cosi K OW S IY
+cosic K OW S IH K
+cosic(2) K OW Z IH K
+cosic(3) K AA S IH K
+cosima K OW S IY M AH
+cosio K OW S IY OW
+coslett K AA S L IH T
+cosma K OW Z M AH
+cosmair K AO Z M EH R
+cosman K AA S M AH N
+cosme K OW Z M
+cosmetic K AA Z M EH T IH K
+cosmetically K AO Z M EH T IH K L IY
+cosmetics K AA Z M EH T IH K S
+cosmetology K AA Z M AH T AA L AH JH IY
+cosmic K AA Z M IH K
+cosmo K AO Z M OW
+cosmo's K AA Z M OW Z
+cosmodrome K AO Z M AH D R OW M
+cosmology K AO Z M AO L AH JH IY
+cosmonaut K AO Z M AH N AO T
+cosmonauts K AO Z M AH N AO T S
+cosmonauts' K AO Z M AH N AO T S
+cosmopolitan K AA Z M AH P AA L AH T AH N
+cosmopulos K AO Z M AH P Y UW L OW S
+cosmos K AA Z M OW S
+cosner K AA S N ER
+cosper K AA S P ER
+cosponsor K OW S P AO N S ER
+cosponsors K OW S P AO N S ER Z
+coss K AO S
+cossa K AO S AH
+cossack K AO S AH K
+cossacks K AA S AE K S
+cossairt K AA S ER T
+cossat K AA S AE T
+cosset K AA S AH T
+cossette K AH S EH T
+cossey K AA S IY
+cossiga K AO S IY G AH
+cossin K AA S IH N
+cossman K AO S M AH N
+cost K AA S T
+cost(2) K AO S T
+costa K AO S T AH
+costabile K AO S T AH B AY L
+costain K OW S T EY N
+costales K AA S T AH L Z
+costano K OW S T AA N OW
+costantini K OW S T AA N T IY N IY
+costantino K OW S T AA N T IY N OW
+costanza K OW S T AA N Z AH
+costanzo K OW S T AA N Z OW
+costar K OW S T AA R
+costars K OW S T AA R Z
+costas K AO S T AH Z
+costa_rica K AO S T AH R IY K AH
+costco K AO S T K OW
+costcutting K AO S T K AH T IH NG
+coste K OW S T
+costed K AA S T IH D
+costeira K OW S T IY EH R AH
+costella K AO S T EH L AH
+costello K AO S T EH L OW
+costello's K AO S T EH L OW Z
+costen K AO S T AH N
+coster K AO S T ER
+costigan K AA S T IH G AE N
+costilla K OW S T IH L AH
+costilow K AA S T IH L OW
+costin K AA S T IH N
+costing K AO S T IH NG
+costley K AA S T L IY
+costlier K AO S T L IY ER
+costliest K AO S T L IY IH S T
+costlow K AO S T L OW
+costly K AA S T L IY
+costly(2) K AO S T L IY
+costner K AA S T N ER
+costner's K AA S T N ER Z
+coston K AA S T AH N
+costra K AA S T R AH
+costs K AA S T S
+costs(2) K AO S T S
+costs(3) K AO S S
+costs(4) K AO S
+costume K AA S T UW M
+costumed K AO S T UW M D
+costumer K AA S T UW M ER
+costumers K AA S T UW M ER Z
+costumes K AA S T UW M Z
+cosurtuh K AH S ER T AH
+cosy K OW Z IY
+cot K AA T
+cota K OW T AH
+cote K OW T
+cotelle K OW T EH L
+coterie K OW T ER IY
+cotes K OW T S
+cotham K AA TH AH M
+cothern K AH DH ER N
+cothran K AA TH R AH N
+cothren K AA TH ER AH N
+cothron K AA TH R AH N
+cotija K OW T IY JH AH
+cotilla K AH T IH L AH
+cotler K OW T AH L ER
+cotler(2) K AA T L ER
+cotman K AA T M AH N
+cotner K AA T N ER
+cotney K AA T N IY
+cotnoir K AH T N W AA R
+coto K OW T OW
+cotret K AA T R AH T
+cotrone K OW T R OW N IY
+cotroneo K OW T R OW N IY OW
+cots K AA T S
+cott K AA T
+cotta K AA T AH
+cottage K AA T AH JH
+cottage(2) K AA T IH JH
+cottages K AA T IH JH IH Z
+cottam K AA T AH M
+cottee K OW T IY
+cotten K AA T AH N
+cotter K AA T ER
+cotterill K AA T ER IH L
+cotterman K AA T ER M AH N
+cottier K AA T IY ER
+cottingham K AA T IH NG HH AE M
+cottle K AA T AH L
+cottman K AA T M AH N
+cotto K OW T OW
+cottom K AA T AH M
+cotton K AA T AH N
+cotton's K AA T AH N Z
+cotton(2) K AO T AH N
+cottone K OW T OW N IY
+cottoned K AA T AH N D
+cottongin K AH T AA NG JH IH N
+cottonmouth K AA T AH N M AW TH
+cottons K AA T AH N Z
+cottonseed K AA T AH N S IY D
+cottonwood K AA T AH N W UH D
+cottonwoods K AA T AH N W UH D Z
+cottrell K AA T R EH L
+cottrill K AA T R AH L
+cotty K AA T IY
+cotugno K OW T UW G N OW
+coty K OW T IY
+cou K UW
+couch K AW CH
+couched K AW CH T
+couches K AW CH IH Z
+couching K AW CH IH NG
+couchman K UW SH M AE N
+coudersport K AW D ER Z P AO R T
+coudert K UW D ER T
+couey K UW IY
+coufal K UW F AE L
+cougar K UW G ER
+cougars K UW G ER Z
+cough K AA F
+cough(2) K AO F
+coughed K AO F T
+coughenour K AO F EH N ER
+coughing K AA F IH NG
+coughing(2) K AO F IH NG
+coughlan K AO G L AH N
+coughlin K AO G L IH N
+coughran K AO G R AH N
+coughs K AO F S
+couillard K W IY L AA R D
+could K UH D
+could've K UH D AH V
+couldn't K UH D AH N T
+couldn't(2) K UH D AH N
+coulee K UW L IY
+coull K AW L
+coulombe K AW L OW M B IY
+coulon K AW L AH N
+coulson K AW L S AH N
+coulston K AW L S T AH N
+coultas K UW L T AA Z
+coulter K OW L T ER
+coulthard K UW L TH AA R D
+counce K AW N S
+council K AW N S AH L
+council's K AW N S AH L Z
+councilman K AW N S AH L M AH N
+councilmen K AW N S AH L M EH N
+councilor K AW N S AH L ER
+councilor(2) K AW N S L ER
+councilors K AW N S AH L ER Z
+councilors(2) K AW N S L ER Z
+councils K AW N S AH L Z
+councilwoman K AW N S AH L W UH M AH N
+councilwomen K AW N S AH L W IH M AH N
+counihan K AW N IH HH AE N
+counsel K AW N S AH L
+counsel's K AW N S AH L Z
+counseled K AW N S AH L D
+counseling K AW N S AH L IH NG
+counseling(2) K AW N S L IH NG
+counsell K AW N S AH L
+counsellor K AW N S AH L ER
+counsellor(2) K AW N S L ER
+counsellors K AW N S AH L ER Z
+counsellors(2) K AW N S L ER Z
+counselman K AW N S AH L M AH N
+counselor K AW N S AH L ER
+counselors K AW N S AH L ER Z
+counsels K AW N S AH L Z
+count K AW N T
+countable K AW N T AH B AH L
+countdown K AW N T D AW N
+countdowns K AW N T D AW N Z
+counted K AW N T AH D
+counted(2) K AW N T IH D
+counted(3) K AW N IH D
+counted(4) K AW N AH D
+countenance K AW N T AH N AH N S
+countenanced K AW N T AH N AH N S T
+countenances K AW N T AH N AH N S IH Z
+counter K AW N T ER
+counteract K AW N T ER AE K T
+counteracted K AW N T ER AE K T IH D
+counteracting K AW N T ER AE K T IH NG
+counterattack K AW N T ER AH T AE K
+counterattack(2) K AW N ER AH T AE K
+counterattacked K AW N T ER AH T AE K T
+counterattacked(2) K AW N ER AH T AE K T
+counterattacking K AW N T ER AH T AE K IH NG
+counterattacking(2) K AW N ER AH T AE K IH NG
+counterattacks K AW N T ER AH T AE K S
+counterattacks(2) K AW N ER AH T AE K S
+counterbalance K AW N T ER B AE L AH N S
+counterbalance(2) K AW N ER B AE L AH N S
+counterbalanced K AW N T ER B AE L AH N S T
+counterbalanced(2) K AW N ER B AE L AH N S T
+counterbalances K AW N T ER B AE L AH N S IH Z
+counterbalances(2) K AW N ER B AE L AH N S IH Z
+counterbalancing K AW N T ER B AE L AH N S IH NG
+counterbalancing(2) K AW N ER B AE L AH N S IH NG
+counterbid K AW N T ER B IH D
+counterbids K AW N T ER B IH D Z
+counterchallenge K AW N T ER CH AE L AH N JH
+counterchallenge(2) K AW N ER CH AE L AH N JH
+counterchallenges K AW N T ER CH AE L AH N JH AH Z
+counterchallenges(2) K AW N ER CH AE L AH N JH AH Z
+countercharge K AW N T ER CH AA R JH
+countercharge(2) K AW N ER CH AA R JH
+countercharges K AW N T ER CH AA R JH IH Z
+countercharges(2) K AW N ER CH AA R JH IH Z
+counterclaim K AW N T ER K L EY M
+counterclaims K AW N T ER K L EY M Z
+counterclockwise K AW N T ER K L AO K W AY Z
+counterclockwise(2) K AW N ER K L AO K W AY Z
+countercultural K AW N T ER K AH L CH ER AH L
+countercultural(2) K AW N ER K AH L CH ER AH L
+counterculture K AW N T ER K AH L CH ER
+counterculture(2) K AW N ER K AH L CH ER
+countered K AW N T ER D
+countered(2) K AW N ER D
+counterespionage K AW N T ER EH S P IY AH N AA JH
+counterespionage(2) K AW N ER EH S P IY AH N AA JH
+counterfeit K AW N T ER F IH T
+counterfeit(2) K AW N ER F IH T
+counterfeited K AW N T ER F IH T IH D
+counterfeited(2) K AW N ER F IH T IH D
+counterfeiter K AW N T ER F IH T ER
+counterfeiter(2) K AW N ER F IH T ER
+counterfeiters K AW N T ER F IH T ER Z
+counterfeiters(2) K AW N ER F IH T ER Z
+counterfeiting K AW N T ER F IH T IH NG
+counterfeiting(2) K AW N ER F IH T IH NG
+counterfeits K AW N T ER F IH T S
+counterfeits(2) K AW N ER F IH T S
+counterforce K AW N T ER F AO R S
+counterforces K AW N T ER F AO R S IH Z
+countering K AW N T ER IH NG
+countering(2) K AW N ER IH NG
+counterinsurgencies K AW N T ER IH N S ER JH AH N S IY Z
+counterinsurgencies(2) K AW N ER IH N S ER JH AH N S IY Z
+counterinsurgency K AW N T ER IH N S ER JH AH N S IY
+counterinsurgency(2) K AW N ER IH N S ER JH AH N S IY
+counterintelligence K AW N T ER IH N T EH L IH JH AH N S
+counterintelligence(2) K AW N ER IH N T EH L IH JH AH N S
+counterlife K AW N T ER L AY F
+counterman K AW N T ER M AE N
+countermeasure K AW N T ER M EH ZH ER
+countermeasure(2) K AW N ER M EH ZH ER
+countermeasures K AW N T ER M EH ZH ER Z
+countermeasures(2) K AW N ER M EH ZH ER Z
+countermove K AW N T ER M UW V
+countermoves K AW N T ER M UW V Z
+counteroffensive K AW N T ER AO F EH N S IH V
+counteroffensive(2) K AW N ER AO F EH N S IH V
+counteroffensives K AW N T ER AO F EH N S IH V Z
+counteroffensives(2) K AW N ER AO F EH N S IH V Z
+counteroffer K AW N T ER AO F ER
+counteroffer(2) K AW N ER AO F ER
+counteroffers K AW N T ER AO F ER Z
+counteroffers(2) K AW N ER AO F ER Z
+counterpart K AW N T ER P AA R T
+counterpart(2) K AW N ER P AA R T
+counterparts K AW N T ER P AA R T S
+counterparts(2) K AW N ER P AA R T S
+counterparty K AW N T ER P AA R T IY
+counterpoint K AW N T ER P OY N T
+counterpoint(2) K AW N ER P OY N T
+counterpoints K AW N T ER P OY N T S
+counterpoints(2) K AW N ER P OY N T S
+counterproductive K AW N T ER P R AH D AH K T IH V
+counterproductive(2) K AW N ER P R AH D AH K T IH V
+counterproposal K AW N T ER P R AH P OW Z AH L
+counterproposal(2) K AW N ER P R AH P OW Z AH L
+counterproposals K AW N T ER P R AH P OW Z AH L Z
+counterproposals(2) K AW N ER P R AH P OW Z AH L Z
+counterpunch K AW N T ER P AH N CH
+counterrevolt K AW N T ER R IY V OW L T
+counterrevolt(2) K AW N ER R IY V OW L T
+counterrevolution K AW N T ER R EH V AH L UW SH AH N
+counterrevolution(2) K AW N ER R EH V AH L UW SH AH N
+counterrevolutionary K AW N T ER R EH V AH L UW SH AH N EH R IY
+counterrevolutionary(2) K AW N ER R EH V AH L UW SH AH N EH R IY
+counters K AW N T ER Z
+countersue K AW N T ER S UW
+countersue(2) K AW N ER S UW
+countersued K AW N T ER S UW D
+countersued(2) K AW N ER S UW D
+countersuing K AW N T ER S UW IH NG
+countersuing(2) K AW N ER S UW IH NG
+countersuit K AW N T ER S UW T
+countersuit(2) K AW N ER S UW T
+countertenor K AW N T ER T EH N ER
+counterterrorism K AW N T ER T EH R ER IH Z AH M
+counterterrorism(2) K AW N ER T EH R ER IH Z AH M
+counterterrorist K AW N T ER T EH R ER IH S T
+counterterrorist(2) K AW N ER T EH R ER IH S T
+counterterrorists K AW N T ER T EH R ER IH S T S
+counterterrorists(2) K AW N ER T EH R ER IH S
+countertop K AW N T ER T AA P
+countertop(2) K AW N ER T AA P
+countertops K AW N T ER T AA P S
+countertops(2) K AW N ER T AA P S
+countertrade K AW N T ER T R EY D
+countervail K AW N T ER V EY L
+countervailing K AW N T ER V EY L IH NG
+counterweight K AW N T ER W EY T
+counterweights K AW N T ER W EY T S
+countess K AW N T AH S
+countesses K AW N T AH S IH Z
+counties K AW N T IY Z
+counties(2) K AW N IY Z
+counting K AW N T IH NG
+counting(2) K AW N IH NG
+countless K AW N T L AH S
+countries K AH N T R IY Z
+countries' K AH N T R IY Z
+country K AH N T R IY
+country's K AH N T R IY Z
+countryfolk K AH N T R IY F OW K
+countryman K AH N T R IY M AH N
+countrymen K AH N T R IY M IH N
+countryside K AH N T R IY S AY D
+countrywide K AH N T R IY W AY D
+counts K AW N T S
+county K AW N T IY
+county's K AW N T IY Z
+county's(2) K AW N IY Z
+county(2) K AW N IY
+coup K UW
+coupe K UW P
+couper K UW ER
+coupes K UW P S
+coupland K UW P L AH N D
+couple K AH P AH L
+couple's K AH P AH L Z
+coupled K AH P AH L D
+coupler K AH P L ER
+couplers K AH P L ER Z
+couples K AH P AH L Z
+coupley K AH P L IY
+coupling K AH P L IH NG
+couplings K AH P L IH NG Z
+coupon K UW P AO N
+coupon(2) K Y UW P AO N
+couponing K UW P AA N IH NG
+couponing(2) K Y UW P AA N IH NG
+couponite K UW P AA N AY T
+couponite(2) K Y UW P AA N AY T
+couponites K UW P AA N AY T S
+couponites(2) K Y UW P AA N AY T S
+coupons K UW P AO N Z
+coupons(2) K Y UW P AO N Z
+coups K UW Z
+coups(2) K UW
+cour K UH R
+courage K ER AH JH
+courage(2) K ER IH JH
+courageous K ER EY JH AH S
+courageously K ER EY JH AH S L IY
+courant K UH R AH N T
+courchaine K UH R SH EY N
+courchesne K UH R SH EH N
+couric K AO R IH K
+courier K ER IY ER
+courier's K ER IY ER Z
+couriers K ER IY ER Z
+courington K AO R IH NG T AH N
+cournoyer K AO R N OY ER
+course K AO R S
+course's K AO R S IH Z
+coursen K AO R S AH N
+courser K AO R S ER
+courses K AO R S AH Z
+courses(2) K AO R S IH Z
+coursey K AO R S IY
+coursing K AO R S IH NG
+courson K AO R S AH N
+court K AO R T
+court's K AO R T S
+courtade K AO R T EY D
+courtaulds K AO R T AO L D Z
+courteau K ER T OW
+courted K AO R T IH D
+courtemanche K AO R T M AE N SH
+courtemanche(2) K AO R T M AA N SH
+courtenay K ER T AH N EY
+courtenay(2) K AO R T N EY
+courteous K ER T IY AH S
+courter K AO R T ER
+courter's K AO R T ER Z
+courtesies K ER T AH S IY Z
+courtesy K ER T AH S IY
+courthouse K AO R T HH AW S
+courthouses K AO R T HH AW S IH Z
+courtier K AO R T IY ER
+courtiers K AO R T IY ER Z
+courting K AO R T IH NG
+courtis K AO R T IH S
+courtland K AO R T L AE N D
+courtly K AO R T L IY
+courtney K AO R T N IY
+courtois K AO R T W AA
+courtright K AO R T R AY T
+courtroom K AO R T R UW M
+courtrooms K AO R T R UW M Z
+courts K AO R T S
+courts' K AO R T S
+courtship K AO R CH IH P
+courtwright K AO R T R AY T
+courtyard K AO R T Y AA R D
+courtyards K AO R T Y AA R D Z
+courville K UH R V IH L
+coury K AO R IY
+cousar K UW S AA R
+couse K AW S
+cousens K UW S AH N Z
+cousens(2) K AW S AH N Z
+couser K AW S ER
+cousin K AH Z AH N
+cousin's K AH Z AH N Z
+cousineau K UW S IH N OW
+cousino K AW S IY N OW
+cousins K AH Z AH N Z
+cousteau K UW S T OW
+cousteau's K UW S T OW Z
+cousy K UW Z IY
+coutant K UW T AO N T
+coutee K UW T IY
+couto K AW T OW
+couts K AW T S
+coutts K AW T S
+coutu K UW CH UW
+couture K UW T UH R
+couturier K UW T UH R IY ER
+couvillion K UW V IY L Y AO N
+couvillon K UW V IY L AO N
+couzens K UW Z AH N Z
+coval K OW V EY AE L
+covalt K OW V AA L T
+covarrubias K OW V AA R UW B IY AH Z
+covas K OW V AH S
+covatta K OW V AA T AH
+covault K OW V AO L T
+cove K OW V
+covel K OW V AH L
+covell K AA V AH L
+covelli K OW V EH L IY
+covello K OW V EH L OW
+coven K AH V AH N
+coven(2) K OW V AH N
+covenant K AH V AH N AH N T
+covenanter K AH V AH N AH N T ER
+covenanters K AH V AH N AH N T ER Z
+covenants K AH V AH N AH N T S
+coveney K AA V IH N IY
+covent K AH V AH N T
+coventry K AH V AH N T R IY
+cover K AH V ER
+coverage K AH V ER AH JH
+coverage(2) K AH V ER IH JH
+coverage(3) K AH V R IH JH
+coverages K AH V ER AH JH IH Z
+coverages(2) K AH V ER IH JH IH Z
+coverages(3) K AH V R IH JH IH Z
+coverall K AH V ER AO L
+coveralls K AH V ER AO L Z
+coverdale K AH V ER D EY L
+coverdell K AH V ER D EH L
+covered K AH V ER D
+covering K AH V ER IH NG
+covering(2) K AH V R IH NG
+coverings K AH V ER IH NG Z
+covers K AH V ER Z
+coverstone K AH V ER S T OW N
+covert K OW V ER T
+covertly K OW V ER T L IY
+coverup K AH V ER AH P
+coverups K AH V ER AH P S
+coves K OW V Z
+covet K AH V AH T
+coveted K AH V AH T IH D
+covets K AH V AH T S
+covey K AH V IY
+covia K OW V IY AH
+coviello K OW V IY EH L OW
+covill K AA V AH L
+coville K OW V IH L
+covin K OW V IH N
+covina K OW V IY N AH
+covington K AH V IH NG T AH N
+covino K OW V IY N OW
+covitz K OW V IH T S
+covy K AH V IY
+cow K AW
+cow's K AW Z
+cowabunga K AW AH B AH N G AH
+cowan K AW AH N
+cowans K AW AH N Z
+coward K AW ER D
+coward's K AW ER D Z
+cowardice K AW ER D AH S
+cowardly K AW ER D L IY
+cowards K AW ER D Z
+cowart K AW AA R T
+cowbell K AW B EH L
+cowbells K AW B EH L Z
+cowboy K AW B OY
+cowboy's K AW B OY Z
+cowboys K AW B OY Z
+cowboys' K AW B OY Z
+cowden K AW D AH N
+cowdery K AW D ER IY
+cowdrey K AW D R IY
+cowed K AW D
+coweda K AH W IY D AH
+cowell K AA W EH L
+cowen K AW AH N
+cowen(2) K OW AH N
+cowens K AW AH N Z
+cowens(2) K OW AH N Z
+cower K AW ER
+cowering K AW ER IH NG
+cowger K AW JH ER
+cowgill K AW G IH L
+cowgirl K AW G ER L
+cowgirls K AW G ER L Z
+cowher K AA W ER
+cowherd K AW HH ER D
+cowie K AW IY
+cowin K AW IH N
+cowing K AW IH NG
+cowl K AW L
+cowles K AW AH L Z
+cowley K AW L IY
+cowlick K AW L IH K
+cowlicks K AW L IH K S
+cowling K AW L IH NG
+cowling's K AW L IH NG Z
+cowlings K AW L IH NG Z
+cowlings' K AW L IH NG Z
+cowlings's K AW L IH NG Z IH Z
+cowman K AW M AH N
+coworker K OW W ER K ER
+coworkers K OW W ER K ER Z
+cowper K AW P ER
+cowper(2) K UW P ER
+cowperthwaite K AW P ER TH W EY T
+cowries K AW R IY Z
+cows K AW Z
+cowser K AW Z ER
+cowsert K AW S ER T
+cowslip K AW S L IH P
+cox K AA K S
+cox's K AA K S IH Z
+coxe K AA K S
+coxen K AA K S AH N
+coxon K AA K S AH N
+coxwell K AA K S W EH L
+coy K OY
+coye K OY
+coyer K OY ER
+coykendall K OY K EH N D AH L
+coyle K OY L
+coyly K OY L IY
+coym K OY M
+coyne K OY N
+coyner K OY N ER
+coyote K AY OW T IY
+coyote(2) K AY OW T
+coyotes K AY OW T IY S
+coyotes(2) K AY OW T S
+coz K AA Z
+cozad K OW Z AH D
+cozart K AA Z AA R T
+cozby K AA Z B IY
+cozier K OW Z IY ER
+cozine K OW Z IY N IY
+coziness K OW Z IY N AH S
+cozman K OW Z M AH N
+cozy K OW Z IY
+cozying K OW Z IY IH NG
+cozza K OW T S AH
+cozzens K AA Z AH N Z
+cozzi K OW T S IY
+cozzolino K OW T S OW L IY N OW
+crab K R AE B
+crabb K R AE B
+crabbe K R AE B
+crabbed K R AE B D
+crabbs K R AE B Z
+crabby K R AE B IY
+crabeater K R AE B IY T ER
+crabill K R AE B AH L
+crable K R EY B AH L
+crabmeat K R AE B M IY T
+crabs K R AE B Z
+crabtree K R AE B T R IY
+cracchiolo K R AA K IY OW L OW
+crace K R EY S
+crack K R AE K
+crackdown K R AE K D AW N
+crackdowns K R AE K D AW N Z
+cracked K R AE K T
+crackel K R AE K AH L
+cracker K R AE K ER
+crackerjack K R AE K ER JH AE K
+crackers K R AE K ER Z
+cracking K R AE K IH NG
+crackle K R AE K AH L
+crackled K R AE K AH L D
+crackles K R AE K AH L Z
+crackling K R AE K L IH NG
+crackpot K R AE K P AA T
+crackpots K R AE K P AA T S
+cracks K R AE K S
+cracraft K R AA K R AE F T
+craddock K R AE D AH K
+crader K R EY D ER
+cradic K R AE D IH K
+cradle K R EY D AH L
+cradles K R EY D AH L Z
+cradling K R EY D AH L IH NG
+cradling(2) K R EY D L IH NG
+cradock K R AE D AH K
+crady K R EY D IY
+craft K R AE F T
+craft's K R AE F T S
+crafted K R AE F T IH D
+crafting K R AE F T IH NG
+crafton K R AE F T AH N
+crafts K R AE F T S
+crafts(2) K R AE F S
+craftsman K R AE F T S M AH N
+craftsman(2) K R AE F S M AH N
+craftsmanship K R AE F T S M AH N SH IH P
+craftsmanship(2) K R AE F S M AH N SH IH P
+craftsmen K R AE F T S M EH N
+craftsmen(2) K R AE F S M EH N
+craftspeople K R AE F T S P IY P AH L
+craftspeople(2) K R AE F S P IY P AH L
+crafty K R AE F T IY
+crager K R EY JH ER
+cragg K R AE G
+craggs K R AE G Z
+craggy K R AE G IY
+craghead K R AE G HH EH D
+cragin K R AE JH IH N
+cragle K R EY G AH L
+crago K R AA G OW
+cragun K R AE G AH N
+craib K R EY B
+craig K R EY G
+craig's K R EY G Z
+craighead K R EY G HH EH D
+craigie K R EY G IY
+craigo K R EY G OW
+crail K R EY L
+crain K R EY N
+crain's K R EY N Z
+craine K R EY N
+craker K R EY K ER
+crall K R AO L
+cram K R AE M
+cramblit K R AE M B L IH T
+cramer K R EY M ER
+cramer's K R EY M ER Z
+crames K R EY M Z
+crammed K R AE M D
+crammer K R AE M ER
+cramming K R AE M IH NG
+cramp K R AE M P
+cramped K R AE M P T
+cramping K R AE M P IH NG
+crampon K R AE M P AO N
+crampons K R AE M P AO N Z
+cramps K R AE M P S
+crampton K R AE M P T AH N
+crams K R AE M Z
+cramton K R AE M T AH N
+cranberries K R AE N B EH R IY Z
+cranberry K R AE N B EH R IY
+crance K R AE N S
+crandall K R AE N D AH L
+crandall's K R AE N D AH L Z
+crandell K R AE N D AH L
+crane K R EY N
+crane's K R EY N Z
+craned K R EY N D
+craner K R EY N ER
+cranes K R EY N Z
+cranesbill K R EY N Z B IH L
+cranesbills K R EY N Z B IH L Z
+craney K R EY N IY
+cranfield K R AE N F IY L D
+cranfill K R AE N F AH L
+cranford K R AE N F ER D
+cranial K R EY N Y AH L
+cranium K R EY N IY AH M
+crank K R AE NG K
+cranked K R AE NG K T
+cranking K R AE NG K IH NG
+cranks K R AE NG K S
+crankshaft K R AE NG K SH AE F T
+crankshafts K R AE NG K SH AE F T S
+cranky K R AE NG K IY
+cranley K R AE N L IY
+cranmer K R AE N M ER
+cranmore K R AA N M AO R
+crannell K R AE N AH L
+cranney K R AE N IY
+crannies K R AE N IY Z
+cranny K R AE N IY
+cranor K R EY N ER
+crans K R AE N Z
+cranshaw K R AE N SH AO
+cranston K R AE N S T AH N
+cranston's K R AE N S T AH N Z
+crap K R AE P
+crapo K R AA P OW
+crappie K R AE P IY
+crapps K R AE P S
+crappy K R AE P IY
+craps K R AE P S
+crapser K R AE P S ER
+crapshoot K R AE P SH UW T
+crary K ER EH R IY
+crase K R EY Z
+crash K R AE SH
+crash's K R AE SH IH Z
+crashed K R AE SH T
+crashes K R AE SH IH Z
+crashing K R AE SH IH NG
+crasner K R AE Z N ER
+crasnianski K R AE S N IY AE N S K IY
+crass K R AE S
+crassweller K R AE S W EH L ER
+crassweller's K R AE S W EH L ER Z
+crate K R EY T
+crater K R EY T ER
+cratered K R EY T ER D
+craters K R EY T ER Z
+crates K R EY T S
+cratia K R EY SH AH
+crating K R EY T IH NG
+craton K R AE T AH N
+cratty K R AE T IY
+craugh K R AO
+craun K R AO N
+cravath K R AE V AH TH
+crave K R EY V
+craved K R EY V D
+craven K R EY V AH N
+craven's K R EY V AH N Z
+cravens K R EY V AH N Z
+craver K R EY V ER
+craves K R EY V Z
+cravey K R EY V IY
+cravin K R EY V IH N
+craving K R EY V IH NG
+cravings K R EY V IH NG Z
+craw K R AO
+crawfish K R AO F IH SH
+crawford K R AO F ER D
+crawford's K R AO F ER D Z
+crawfordsville K R AO F ER D Z V IH L
+crawl K R AO L
+crawled K R AO L D
+crawley K R AO L IY
+crawling K R AO L IH NG
+crawls K R AO L Z
+crawly K R AO L IY
+crawmer K R AO M ER
+crawshaw K R AO SH AO
+craxi K R AE K S IY
+cray K R EY
+cray's K R EY Z
+craycraft K R EY K R AE F T
+crayfish K R EY F IH SH
+crayne K R EY N
+crayon K R EY AA N
+crayons K R EY AA N Z
+crays K R EY Z
+crayton K R EY T AH N
+craze K R EY Z
+crazed K R EY Z D
+crazier K R EY Z IY ER
+crazies K R EY Z IY Z
+craziest K R EY Z IY AH S T
+crazily K R EY Z AH L IY
+craziness K R EY Z IY N AH S
+crazy K R EY Z IY
+crea K R IY
+creach K R IY CH
+creager K R IY IH JH ER
+creagh K R IY G
+creak K R IY K
+creaked K R IY K T
+creaking K R IY K IH NG
+creaky K R IY K IY
+creal K R IY L
+cream K R IY M
+creamed K R IY M D
+creamer K R IY M ER
+creamery K R IY M ER IY
+creamier K R IY M IY ER
+creamiest K R IY M IY IH S T
+creams K R IY M Z
+creamy K R IY M IY
+crean K R IY N
+crear K R IH R
+crease K R IY S
+creases K R IY S IH Z
+creasey K R IY S IY
+creasman K R IY Z M AH N
+creason K R IY S AH N
+creasy K R IY S IY
+create K R IY EY T
+create-a-book K R IY EY T AH B UH K
+created K R IY EY T AH D
+created(2) K R IY EY T IH D
+creates K R IY EY T S
+creath K R EH TH
+creating K R IY EY T IH NG
+creation K R IY EY SH AH N
+creationism K R IY EY SH AH N IH Z AH M
+creations K R IY EY SH AH N Z
+creative K R IY EY T IH V
+creatively K R IY EY T IH V L IY
+creativeness K R IY EY T IH V N AH S
+creativity K R IY EY T IH V AH T IY
+creatologist K R IY EY T AO L AH JH IH S T
+creatologists K R IY EY T AO L AH JH IH S T S
+creatologists(2) K R IY EY T AO L AH JH IH S S
+creatologists(3) K R IY EY T AO L AH JH IH S
+creator K R IY EY T ER
+creators K R IY EY T ER Z
+creature K R IY CH ER
+creatures K R IY CH ER Z
+crecelius K R IH S IY L IY IH S
+creche K R EH SH
+creches K R EH SH AH Z
+credence K R IY D AH N S
+credential K R IH D EH N CH AH L
+credential(2) K R AH D EH N SH AH L
+credentialed K R AH D EH N CH AH L D
+credentialed(2) K R AH D EH N SH AH L D
+credentials K R AH D EH N SH AH L Z
+credentials(2) K R AH D EH N CH AH L Z
+credenza K R AH D EH N Z AH
+credeur K R IH D ER
+credibility K R EH D AH B IH L IH T IY
+credible K R EH D AH B AH L
+credibly K R EH D AH B L IY
+credit K R EH D AH T
+credit's K R EH D IH T S
+credit(2) K R EH D IH T
+creditable K R EH D AH T AH B AH L
+creditably K R EH D AH T AH B L IY
+creditanstalt K R EH D IH T AH N SH T AO L T
+creditbank K R EH D IH T B AE NG K
+credited K R EH D AH T AH D
+credited(2) K R EH D IH T IH D
+credithrift K R EH D IH TH R IH F T
+crediting K R EH D AH T IH NG
+credito K R EH D IY T OW
+creditor K R EH D AH T ER
+creditor(2) K R EH D IH T ER
+creditors K R EH D IH T ER Z
+creditors' K R EH D IH T ER Z
+credits K R EH D IH T S
+creditwatch K R EH D IH T W AA CH
+creditworthiness K R EH D IH T W ER DH IY N AH S
+creditworthy K R EH D IH T W ER DH IY
+credle K R EH D AH L
+credo K R EY D OW
+credo(2) K R IY D OW
+credulity K R IH D UW L AH T IY
+credulous K R EH JH AH L AH S
+cree K R IY
+creech K R IY CH
+creecy K R IY S IY
+creed K R IY D
+creeden K R IY D AH N
+creedon K R IY D AH N
+creeds K R IY D Z
+creegan K R IY G AH N
+creek K R IY K
+creek's K R IY K S
+creekmore K R IY K M AO R
+creekmur K R IY K M ER
+creeks K R IY K S
+creel K R IY L
+creelman K R IY L M AH N
+creely K R IY L IY
+creep K R IY P
+creepiness K R IY P IY N IH S
+creeping K R IY P IH NG
+creeps K R IY P S
+creepy K R IY P IY
+creer K R IH R
+crees K R IY Z
+cref K R EH F
+cref's K R EH F S
+cregan K R IY G AH N
+cregar K R IY G ER
+creger K R IY JH ER
+cregg K R EH G
+cregger K R EH G ER
+crego K R EH G OW
+crehan K R EH HH AH N
+creighton K R EY T AH N
+creko K R EH K OW
+crellin K R EH L IH N
+cremate K R IY M EY T
+cremated K R IY M EY T IH D
+cremation K R IY M EY SH AH N
+crematoria K R IY M AH T AO R IY AH
+crematorium K R IY M AH T AO R IY AH M
+creme K R IY M
+cremeans K R EH M AH N Z
+cremeens K R IH M IY N Z
+cremer K R IY M ER
+cremin K R EH M IH N
+crenelate K R EH N AH L EY T
+crenelated K R EH N AH L EY T AH D
+crenshaw K R EH N SH AO
+crenwelge K R EH N W IH L JH
+creole K R IY OW L
+creoles K R IY OW L Z
+creolize K R IY OW L AY Z
+creolized K R IY OW L AY Z D
+creosote K R IY AH S OW T
+crepe K R EY P
+crepeau K R IH P OW
+crepes K R EY P S
+creps K R EH P S
+crept K R EH P T
+creque K R EH K
+cresap K R EH S AH P
+cresap(2) K R IY S AH P
+crescendo K R IH SH EH N D OW
+crescent K R EH S AH N T
+crescents K R EH S AH N T S
+crescenzi K R EH S CH EH N Z IY
+crescenzo K R EH S CH EH N Z OW
+cresci K R EH S IY
+crescott K R EH S K AA T
+creson K R EH S AH N
+crespi K R EH S P IY
+crespin K R EH S P IH N
+crespo K R EH S P OW
+cress K R EH S
+cresses K R EH S AH Z
+cresses(2) K R EH S IH Z
+cressey K R EH S IY
+cressler K R EH S L ER
+cressman K R EH S M AH N
+cresson K R EH S AH N
+cresswell K R EH S W EH L
+cressy K R EH S IY
+crest K R EH S T
+crestar K R EH S T AA R
+crested K R EH S T AH D
+crestfallen K R EH S T F AO L AH N
+cresting K R EH S T IH NG
+crestmont K R EH S T M AA N T
+crests K R EH S T S
+crests(2) K R EH S S
+crests(3) K R EH S
+creswell K R EH S W EH L
+cretaceous K R IH T EY SH IH S
+cretchen K R EH CH AH N
+crete K R IY T
+cretella K R EH T EH L AH
+cretien K R IY SH Y AH N
+cretin K R IY T AH N
+cretsinger K R EH T S IH N JH ER
+creutzfeldt K R UH T S F EH L D
+creutzfeldt(2) K R UH T S F EH L T
+creveling K R EH V AH L IH NG
+creveling(2) K R EH V L IH NG
+crevice K R EH V AH S
+crevices K R EH V AH S IH Z
+crevier K R IY V IY ER
+creviston K R EH V IH S T AA N
+crew K R UW
+crew's K R UW Z
+crewe K R UW
+crewel K R UW AH L
+crewes K R UW Z
+crewman K R UW M AH N
+crewmen K R UW M IH N
+crews K R UW Z
+crib K R IH B
+cribari K R IY B AA R IY
+cribb K R IH B
+cribbage K R IH B IH JH
+cribbing K R IH B IH NG
+cribbs K R IH B Z
+cribs K R IH B Z
+crichlow K R IH K L OW
+crichton K R IH CH T AH N
+crick K R IH K
+cricket K R IH K AH T
+cricket's K R IH K AH T S
+cricket(2) K R IH K IH T
+crickets K R IH K AH T S
+criddle K R IH D AH L
+crider K R AY D ER
+cried K R AY D
+crier K R AY ER
+cries K R AY Z
+criger K R AY JH ER
+crigger K R IH G ER
+crigler K R IH G L ER
+crihfield K R IH F IY L D
+crill K R IH L
+crilley K R IH L IY
+crilly K R IH L IY
+crim K R IH M
+crime K R AY M
+crime's K R AY M Z
+crimea K R AY M IY AH
+crimean K R IH M IY N
+crimean(2) K R AY M IY AH N
+crimes K R AY M Z
+crimi K R IY M IY
+criminal K R IH M AH N AH L
+criminal's K R IH M AH N AH L Z
+criminalist K R IH M AH N AH L IH S T
+criminalist's K R IH M AH N AH L IH S T S
+criminalistics K R IH M AH N AH L IH S T IH K S
+criminalists K R IH M AH N AH L IH S T S
+criminalists(2) K R IH M AH N AH L IH S S
+criminalists(3) K R IH M AH N AH L IH S
+criminality K R IH M AH N AE L IH T IY
+criminalization K R IH M AH N AH L AH Z EY SH AH N
+criminalize K R IH M AH N AH L AY Z
+criminalized K R IH M AH N AH L AY Z D
+criminalizing K R IH M AH N AH L AY Z IH NG
+criminally K R IH M AH N AH L IY
+criminals K R IH M AH N AH L Z
+criminals' K R IH M AH N AH L Z
+criminologist K R IH M IH N AA L AH JH IH S T
+criminologists K R IH M IH N AA L AH JH IH S T S
+criminologists(2) K R IH M IH N AA L AH JH IH S S
+criminologists(3) K R IH M IH N AA L AH JH IH S
+criminology K R IH M IH N AA L AH JH IY
+crimm K R IH M
+crimmins K R IH M IH N Z
+crimp K R IH M P
+crimped K R IH M P T
+crimping K R IH M P IH NG
+crimps K R IH M P S
+crimson K R IH M Z AH N
+criner K R AY N ER
+cringe K R IH N JH
+cringed K R IH N JH D
+cringes K R IH N JH IH Z
+cringing K R IH N JH IH NG
+crip K R IH P
+cripe K R AY P
+crippen K R IH P AH N
+cripple K R IH P AH L
+crippled K R IH P AH L D
+cripples K R IH P AH L Z
+crippling K R IH P AH L IH NG
+crippling(2) K R IH P L IH NG
+cripps K R IH P S
+crips K R IH P S
+cris K R IH S
+crisafi K R IY S AA F IY
+crisafulli K R IY S AA F UW L IY
+crisanti K R IH S AE N T IY
+crisci K R IH S IY
+criscione K R IY S CH OW N IY
+crisco K R IY S K OW
+criscuolo K R IY S K W OW L OW
+crise K R AY Z
+crises K R AY S IY Z
+crishman K R IH SH M AH N
+crishman's K R IH SH M AH N Z
+crisis K R AY S AH S
+crisler K R IH S AH L ER
+crisler(2) K R IH S L ER
+crislip K R IH S L IH P
+crisman K R IH S M AH N
+crismon K R IH Z M AH N
+crisostomo K R IY S OW S T OW M OW
+crisp K R IH S P
+crispell K R IH S P AH L
+crispen K R IH S P AH N
+crisper K R IH S P ER
+crispin K R IH S P IH N
+crispina K R IY S P IY N AH
+crispino K R IY S P IY N OW
+crisply K R IH S P L IY
+crispness K R IH S P N AH S
+crispo K R IY S P OW
+crispy K R IH S P IY
+criss K R IH S
+criss-cross K R IH S K R AO S
+criss-crossed K R IH S K R AO S T
+crisscross K R IH S K R AO S
+crisscrossed K R IH S K R AO S T
+crisscrossing K R IH S K R AO S IH NG
+crissey K R IH S IY
+crissinger K R IH S IH N JH ER
+crisslow K R IH S L OW
+crissman K R IH S M AH N
+crist K R IH S T
+crista K R IH S T AH
+cristabel K R IH S T AH B EH L
+cristal K R IH S T AH L
+cristiani K R IH S T IY AA N IY
+cristiani's K R IH S T IY AA N IY Z
+cristiani's(2) K R IH S CH IY AA N IY Z
+cristiani(2) K R IH S CH IY AA N IY
+cristiano K R IY S T IY AA N OW
+cristina K R IH S T IY N AH
+cristo K R IH S T OW
+cristo's K R IH S T OW Z
+cristobal K R IH S T AH B AH L
+cristobel K R IH S T AH B EH L
+cristobel's K R IH S T AH B EH L Z
+criswell K R IH S W EH L
+critcher K R IH CH ER
+critchfield K R IH CH F IY L D
+critchley K R IH CH L IY
+critchlow K R IH CH L OW
+critelli K R IH T EH L IY
+criteria K R AY T IH R IY AH
+criterion K R AY T IH R IY AH N
+crites K R AY T S
+critic K R IH T IH K
+critic's K R IH T IH K S
+critical K R IH T IH K AH L
+criticality K R IH T AH K AE L AH T IY
+critically K R IH T IH K AH L IY
+critically(2) K R IH T IH K L IY
+criticism K R IH T IH S IH Z AH M
+criticisms K R IH T IH S IH Z AH M Z
+criticize K R IH T IH S AY Z
+criticized K R IH T AH S AY Z D
+criticizes K R IH T IH S AY Z IH Z
+criticizing K R IH T IH S AY Z IH NG
+critics K R IH T IH K S
+critics' K R IH T IH K S
+critique K R AH T IY K
+critique(2) K R IH T IY K
+critiqued K R IH T IY K T
+critiques K R IH T IY K S
+critiquing K R IH T IY K IH NG
+criton K R AY T AH N
+critser K R IH T S ER
+crittenden K R IH T EH N D AH N
+crittendon K R IH T AH N D IH N
+critter K R IH T ER
+critters K R IH T ER Z
+critz K R IH T S
+critzer K R IH T Z ER
+crivaro K R IH V AE R OW
+crivelli K R IH V EH L IY
+crivello K R IH V EH L OW
+criven K R IH V AH N
+crnkovich S ER N AH V IH CH
+cro K R OW
+croak K R OW K
+croaker K R OW K ER
+croaking K R OW K IH NG
+croat K R OW AA T
+croat's K R OW AA T S
+croatia K R OW EY SH AH
+croatia's K R OW EY SH AH Z
+croatian K R OW EY SH AH N
+croatian's K R OW EY SH AH N Z
+croatians K R OW EY SH AH N Z
+croatians' K R OW EY SH AH N Z
+croats K R OW AA T S
+croc K R AA K
+crocco K R AA K OW
+croce K R OW CH IY
+crochet K R OW SH EY
+crocheted K R OW SH EY D
+crochetiere K R OW SH AH T IH R
+crocheting K R OW SH EY IH NG
+crock K R AA K
+crocker K R AA K ER
+crocker's K R AA K ER Z
+crockery K R AA K ER IY
+crockett K R AA K IH T
+crockford K R AA K F ER D
+crocodile K R AA K AH D AY L
+crocodiles K R AA K AH D AY L Z
+crocodilian K R AA K AH D IH L Y AH N
+crocus K R OW K AH S
+crocuses K R OW K Y UW S IH Z
+croff K R AO F
+crofford K R AA F ER D
+crofoot K R OW F UH T
+croft K R AO F T
+crofton K R AA F T AH N
+crofts K R AO F T S
+crogan K R OW G AH N
+croghan K R AA G HH AH N
+croissant K W AA S AA N T
+croissant(2) K R AH S AA N T
+croissants K W AA S AA N T S
+croissants(2) K R AH S AA N T S
+croitzer K R OY T S ER
+croix K R OY
+croix's K R OY Z
+croke K R OW K
+croker K R OW K ER
+croley K R OW L IY
+croll K R OW L
+crom K R AA M
+cromartie K R AA M AA R T IY
+crombie K R AA M B IY
+cromer K R OW M ER
+cromer's K R OW M ER Z
+cromie K R AA M IY
+cromley K R AA M L IY
+crompton K R AA M P T AH N
+cromwell K R AA M W AH L
+cromwell's K R AA M W IH L Z
+cron K R AA N
+cronan K R OW N AH N
+cronauer K R AA N AW R
+cronce K R AA N S
+crone K R OW N
+cronen K R OW N AH N
+croner K R OW N ER
+croney K R OW N IY
+cronies K R OW N IY Z
+cronin K R OW N IH N
+cronk K R AA NG K
+cronkhite K R AA NG K HH AY T
+cronkite K R AA NG K AY T
+cronkright K R AA NG K R AY T
+cronquist K R AA N K W IH S T
+cronus K R OW N AH S
+crony K R OW N IY
+cronyism K R OW N IY IH Z AH M
+crook K R UH K
+crooke K R UH K
+crooked K R UH K AH D
+crookedness K R UH K AH D N AH S
+crooker K R UH K ER
+crooklyn K R UH K L IH N
+crooklyn's K R UH K L IH N Z
+crooks K R UH K S
+crookshank K R UH K SH AE NG K
+crookshanks K R UH K SH AE NG K S
+crookston K R UH K S T AH N
+croom K R UW M
+crooms K R UW M Z
+croon K R UW N
+crooner K R UW N ER
+crooning K R UW N IH NG
+croons K R UW N Z
+crop K R AA P
+crop's K R AA P S
+cropland K R AA P L AE N D
+cropley K R AA P L IY
+cropp K R AA P
+cropped K R AA P T
+cropper K R AA P ER
+cropping K R AA P IH NG
+crops K R AA P S
+cropsey K R AA P S IY
+croquet K R OW K EY
+cros K R AO S
+crosbey K R AA S B IY
+crosbie K R AO Z B IY
+crosby K R AO Z B IY
+crosby's K R AO Z B IY Z
+crose K R OW Z
+croshaw K R AA SH AO
+croskey K R AA S K IY
+crosland K R AA S L AH N D
+crosley K R AA S L IY
+croslin K R AA S L IH N
+croson K R OW S AH N
+cross K R AO S
+cross's K R AO S IH Z
+cross-pollinate K R AO S P AA L AH N EY T
+crossan K R AA S AH N
+crossbill K R AO S B IH L
+crossbills K R AO S B IH L Z
+crossbones K R AO S B OW N Z
+crossborder K R AO S B AO R D ER
+crossbow K R AO S B OW
+crossbows K R AO S B OW Z
+crosscurrent K R AO S K ER AH N T
+crosscurrents K R AO S K ER AH N T S
+crosse K R AA S
+crossed K R AO S T
+crossen K R AO S AH N
+crosser K R AO S ER
+crosses K R AO S IH Z
+crossett K R AA S IH T
+crossfield K R AO S F IY L D
+crossfire K R AO S F AY R
+crossfire's K R AO S F AY R Z
+crossin K R AA S IH N
+crossing K R AO S IH NG
+crossings K R AO S IH NG Z
+crossland K R AO S L AE N D
+crossley K R AA S L IY
+crosslin K R AA S L IH N
+crossman K R AO S M AH N
+crossnine K R AO S N AY N
+crossno K R OW S N OW
+crosson K R AA S AH N
+crossover K R AO S OW V ER
+crosspiece K R AO S P IY S
+crosspieces K R AO S P IY S AH Z
+crosspieces(2) K R AO S P IY S IH Z
+crossroad K R AO S R OW D
+crossroads K R AO S R OW D Z
+crosstalk K R AO S T AO K
+crosstown K R AO S T AW N
+crossville K R AA S V IH L
+crosswalk K R AA S W AA K
+crosswalks K R AA S W AA K S
+crosswhite K R AA S W AY T
+crosswise K R AO S W AY Z
+crossword K R AO S W ER D
+crosswords K R AO S W ER D Z
+crosthwait K R AA S TH W AH T
+crosthwaite K R AA S TH W AH T
+croston K R AA S T AH N
+croswell K R AA S W EH L
+crotch K R AA CH
+crotchety K R AA CH AH T IY
+croteau K R AH T OW
+crothers K R AH DH ER Z
+crotonville K R OW T AH N V IH L
+crotteau K R AH T OW
+crotts K R AA T S
+crotty K R AA T IY
+crotwell K R AA T W EH L
+crotzer K R OW T Z ER
+crouch K R AW CH
+crouched K R AW CH T
+croucher K R AW CH ER
+crouching K R AW CH IH NG
+crough K R AW
+crounse K R AW N S
+croup K R UW P
+crouse K R AW S
+crouser K R AW S ER
+crout K R AW T
+crouthamel K R AW TH AH M EH L
+crovitz K R OW V IH T S
+crovitz's K R OW V IH T S IH Z
+crovl K R OW V AH L
+crovls K R OW V AH L Z
+crow K R OW
+crow's K R OW Z
+crowbar K R OW B AA R
+crowborough K R OW B ER OW
+crowd K R AW D
+crowd's K R AW D Z
+crowded K R AW D AH D
+crowded(2) K R AW D IH D
+crowden K R AW D AH N
+crowder K R AW D ER
+crowding K R AW D IH NG
+crowds K R AW D Z
+crowe K R OW
+crowed K R OW D
+crowell K R OW AH L
+crowing K R OW IH NG
+crowkeeper K R OW K IY P ER
+crowkeepers K R OW K IY P ER Z
+crowl K R AW L
+crowle K R AW L
+crowley K R AW L IY
+crowley's K R AW L IY Z
+crown K R AW N
+crown's K R AW N Z
+crowne K R AW N
+crowned K R AW N D
+crowner K R AW N ER
+crowning K R AW N IH NG
+crownlike K R AW N L AY K
+crownover K R AW N OW V ER
+crowns K R AW N Z
+crownx K R AW N EH K S
+crows K R OW Z
+crowson K R AW S AH N
+crowther K R AW DH ER
+crowther's K R OW TH ER Z
+crowthers K R OW TH ER Z
+croxton K R AA K S T AH N
+croy K R OY
+croyle K R OY L
+crozier K R OW ZH ER
+cruce K R UW S
+cruces K R UW S IY Z
+crucial K R UW SH AH L
+crucially K R UW SH AH L L IY
+crucially(2) K R UW SH AH L IY
+crucible K R UW S AH B AH L
+crucified K R UW S AH F AY D
+crucifix K R UW S AH F IH K S
+crucifixes K R UW S AH F IH K S IH Z
+crucifixion K R UW S IH F IH K SH AH N
+crucify K R UW S AH F AY
+crud K R AH D
+cruddy K R AH D IY
+crude K R UW D
+crude's K R UW D Z
+crudele K R UW D AH L
+crudely K R UW D L IY
+crudes K R UW D Z
+crudup K R AH D AH P
+cruea K R UW IY AH
+cruel K R UW AH L
+cruel(2) K R UW L
+cruelest K R UW L AH S T
+cruelly K R UW L IY
+cruelties K R UW L T IY Z
+cruelties(2) K R UW AH L T IY Z
+cruelty K R UW L T IY
+cruelty(2) K R UW AH L T IY
+cruey K R AH IY
+cruger K R UW JH ER
+cruickshank K R UH K SH AE NG K
+cruikshank K R UW IH K SH AE NG K
+cruise K R UW Z
+cruised K R UW Z D
+cruiser K R UW Z ER
+cruiser's K R UW Z ER Z
+cruisers K R UW Z ER Z
+cruises K R UW Z IH Z
+cruising K R UW Z IH NG
+crull K R AH L
+crum K R AH M
+crumb K R AH M
+crumbaugh K R AH M B AO
+crumble K R AH M B AH L
+crumbled K R AH M B AH L D
+crumbles K R AH M B AH L Z
+crumbley K R AH M B L IY
+crumbling K R AH M B AH L IH NG
+crumbling(2) K R AH M B L IH NG
+crumbs K R AH M Z
+crumby K R AH M B IY
+crume K R UW M
+crumitie K R UW M IH T IY
+crumley K R AH M L IY
+crumly K R AH M L IY
+crumm K R AH M
+crummett K R AH M IH T
+crummey K R AH M IY
+crummy K R AH M IY
+crump K R AH M P
+crumpacker K R AH M P AH K ER
+crumple K R AH M P AH L
+crumpled K R AH M P AH L D
+crumpler K R AH M P AH L ER
+crumpler(2) K R AH M P L ER
+crumpton K R AH M P T AH N
+crumrine K R AH M R IY N
+crunch K R AH N CH
+crunched K R AH N CH T
+cruncher K R AH N CH ER
+crunchers K R AH N CH ER Z
+crunches K R AH N CH IH Z
+crunching K R AH N CH IH NG
+crunchy K R AH N CH IY
+crunk K R AH NG K
+crunkleton K R AH NG K AH L T AA N
+crupi K R UW P IY
+crusade K R UW S EY D
+crusader K R UW S EY D ER
+crusaders K R UW S EY D ER Z
+crusades K R UW S EY D Z
+crusading K R UW S EY D IH NG
+crusan K R UW Z AH N
+cruse K R UW Z
+cruser K R UW Z ER
+crush K R AH SH
+crushed K R AH SH T
+crusher K R AH SH ER
+crushers K R AH SH ER Z
+crushes K R AH SH IH Z
+crushing K R AH SH IH NG
+crusoe K R UW S OW
+crust K R AH S T
+crustacean K R AH S T EY SH AH N
+crustaceans K R AH S T EY SH AH N Z
+crustaceous K R AH S T EY SH AH S
+crustal K R AH S T AH L
+crusted K R AH S T IH D
+crusts K R AH S T S
+crusty K R AH S T IY
+crutch K R AH CH
+crutcher K R AH CH ER
+crutches K R AH CH IH Z
+crutchfield K R AH CH F IY L D
+crutchfield's K R AH CH F IY L D Z
+crutchley K R AH CH L IY
+crute K R UW T
+cruthirds K R AH TH ER D Z
+crux K R AH K S
+cruz K R UW Z
+cruz's K R UW Z IH Z
+cruzado K R UW Z AA D OW
+cruzados K R UW Z AA D OW S
+cruzan K R UW Z AH N
+cruzan(2) K R UW Z AE N
+cruze K R UW Z
+cruzen K R UW Z AH N
+cry K R AY
+cryan K R AY AH N
+crybaby K R AY B EY B IY
+cryder K R AY D ER
+cryderman K R AY D ER M AH N
+crye K R AY
+cryer K R AY ER
+crying K R AY IH NG
+crymes K R AY M Z
+cryogenic K R AY AH JH EH N IH K
+cryogenics K R AY AH JH EH N IH K S
+cryolite K R AY AH L AY T
+crypt K R IH P T
+cryptic K R IH P T IH K
+crypto K R IH P T OW
+cryptoclearance K R IH P T OW L IH R AH N S
+cryptosporidium K R IH P T OW S P AO R IH D IY AH M
+crypts K R IH P T S
+crysler K R IH S AH L ER
+crysler(2) K R IH S L ER
+crystal K R IH S T AH L
+crystal's K R IH S T AH L Z
+crystalline K R IH S T AH L AY N
+crystallize K R IH S T AH L AY Z
+crystallized K R IH S T AH L AY Z D
+crystallizes K R IH S T AH L AY Z IH Z
+crystallizing K R IH S T AH L AY Z IH NG
+crystallographer K R IH S T AH L AA G R AH F ER
+crystallography K R IH S T AH L AA G R AH F IY
+crystals K R IH S T AH L Z
+cryster K R AY S T ER
+crytzer K R AY T Z ER
+csar Z AA R
+csaszar K AH S AA SH ER
+csaszar(2) S AA SH ER
+cspan S IY S P AE N
+cspi S IY EH S P IY AY
+ct K AO R T
+cuadra K UW AA D R AH
+cuadrado K UW AA D R AA D OW
+cuajone K Y UW AH JH OW N
+cuauhtemoc K Y UW AW T AH M AA K
+cub K AH B
+cuba K Y UW B AH
+cuba's K Y UW B AH Z
+cuban K Y UW B AH N
+cubans K Y UW B AH N Z
+cubbage K AH B IH JH
+cubbies K AH B IY Z
+cubbison K AH B IH S AH N
+cubbyhole K AH B IY HH OW L
+cube K Y UW B
+cubed K Y UW B D
+cubes K Y UW B Z
+cubic K Y UW B IH K
+cubic's K Y UW B IH K S
+cubicle K Y UW B IH K AH L
+cubicles K Y UW B IH K AH L Z
+cubism K Y UW B IH Z AH M
+cubist K Y UW B IH S T
+cubit K Y UW B IH T
+cubs K AH B Z
+cubs' K AH B Z
+cuccaro K UW K AA R OW
+cucchi K UW K IY
+cucchiara K UW K IY AA R AH
+cucci K UW CH IY
+cuccia K UW CH AH
+cuccio K UW CH IY OW
+cuckoo K AH K UW
+cuckoo's K UW K UW Z
+cuckoo(2) K UW K UW
+cuckoos K UW K UW Z
+cuco K UW K OW
+cucumber K Y UW K AH M B ER
+cucumbers K Y UW K AH M ER Z
+cudahy K AH D AH HH IY
+cudd K AH D
+cuddeback K AH D B AE K
+cuddihy K AH D IH HH IY
+cuddle K AH D AH L
+cuddled K AH D AH L D
+cuddling K AH D L IH NG
+cuddly K AH D L IY
+cuddy K AH D IY
+cude K Y UW D
+cudgel K AH JH AH L
+cudgels K AH JH AH L Z
+cudmore K AH D M AO R
+cudney K AH D N IY
+cudworth K AH D W ER TH
+cue K Y UW
+cued K Y UW D
+cuellar K Y UW L ER
+cuello K UW EH L OW
+cuenca K W EH N K AH
+cuero K W EH R OW
+cuervo K UH R V OW
+cues K Y UW Z
+cuesta K W EH S T AH
+cueto K W EH T OW
+cueva K W EH V AH
+cuevas K W EH V AA Z
+cuff K AH F
+cuffe K AH F
+cuffed K AH F T
+cuffee K AH F IY
+cuffs K AH F S
+cugini K UW JH IY N IY
+cuhney K UW N IY
+cuidado K W IY D AE D OW
+cuing K Y UW IH NG
+cuisinart K W IY S IH N ER T
+cuisinart(2) K W IY Z AH N AA T
+cuisinarts K W IY Z AH N AA R T S
+cuisine K W IH Z IY N
+cuisines K W IH Z IY N Z
+cul K AH L
+culberson K AH L B ER S AH N
+culbert K AH L B ER T
+culbertson K AH L B ER T S AH N
+culbreath K AH L B R EH TH
+culbreth K AH L B R IH TH
+culbro K AH L B R OW
+culex K Y UW L EH K S
+culhane K AH L HH EY N
+culinary K Y UW L IH N EH R IY
+culinova K Y UW L IH N OW V AH
+culkin K AH L K IH N
+cull K AH L
+cullan K AH L AH N
+culled K AH L D
+cullen K AH L AH N
+cullens K AH L AH N Z
+culler K AH L ER
+culler's K AH L ER Z
+cullers K AH L ER Z
+cullerton K AH L ER T AH N
+cullerton's K AH L ER T AH N Z
+cullet K AH L AH T
+culleton K UW L IH T AA N
+culley K AH L IY
+cullifer K AH L IH F ER
+culligan K AH L IH G AH N
+cullimore K AH L IY M AO R
+cullin K AH L IH N
+cullinan K AH L IH N AH N
+cullinane K AH L IH N EY N
+cullinet K AH L IH N EH T
+culling K AH L IH NG
+cullins K AH L IH N Z
+cullipher K AH L IH F ER
+cullison K AH L IH S AH N
+cullman K AH L M AH N
+cullom K AH L AH M
+cullop K AH L AH P
+cullud K AH L AH D
+cullum K AH L AH M
+cullum's K AH L AH M Z
+cully K AH L IY
+culmer K AH L M ER
+culminate K AH L M IH N EY T
+culminated K AH L M AH N EY T AH D
+culminated(2) K AH L M AH N EY T IH D
+culminates K AH L M IH N EY T S
+culminating K AH L M AH N EY T IH NG
+culmination K AH L M AH N EY SH AH N
+culp K AH L P
+culpa K AH L P AH
+culpability K AH L P AH B IH L IH T IY
+culpable K AH L P AH B AH L
+culpepper K AH L P IH P ER
+culprit K AH L P R IH T
+culprits K AH L P R IH T S
+cult K AH L T
+cult's K AH L T S
+cultic K AH L T IH K
+cultist K AH L T AH S T
+cultist(2) K AH L T IH S T
+cultists K AH L T IH S T S
+cultists(2) K AH L T IH S S
+cultivate K AH L T AH V EY T
+cultivated K AH L T AH V EY T AH D
+cultivated(2) K AH L T IH V EY T IH D
+cultivates K AH L T IH V EY T S
+cultivating K AH L T IH V EY T IH NG
+cultivation K AH L T IH V EY SH AH N
+culton K AH L T AH N
+cults K AH L T S
+cultural K AH L CH ER AH L
+culturalism K AH L CH ER AH L IH Z AH M
+culturally K AH L CH ER AH L IY
+culture K AH L CH ER
+culture's K AH L CH ER Z
+cultured K AH L CH ER D
+cultures K AH L CH ER Z
+culturing K AH L CH ER IH NG
+culvahouse K AH L V AH HH AW S
+culver K AH L V ER
+culver's K AH L V ER Z
+culverhouse K AH L V ER HH AW S
+culverhouse's K AH L V ER HH AW S IH Z
+culvert K AH L V ER T
+culwell K AH L W EH L
+cul_de_sac K AH L D IH S AE K
+cum K AH M
+cumbee K AH M B IY
+cumber K AH M B ER
+cumberbatch K AH M B ER B AE CH
+cumberland K AH M B ER L AH N D
+cumberledge K AH M B ER L EH JH
+cumbersome K AH M B ER S AH M
+cumbia K AH M B IY AH Z
+cumbias K AH M B IY AH Z
+cumbie K AH M B IY
+cumbo K AH M B OW
+cumby K AH M B IY
+cumin K Y UW M AH N
+cumings K UW M IH NG Z
+cumming K AH M IH NG
+cummings K AH M IH NG Z
+cummington K AH M IH NG T AH N
+cummins K AH M IH N Z
+cummins's K AH M IH N Z IH Z
+cummiskey K AH M IH S K IY
+cumpston K AH M P S T AH N
+cumpton K AH M P T AH N
+cumulative K Y UW M Y AH L AH T IH V
+cumulatively K Y UW M Y AH L AH T IH V L IY
+cunanan K Y UW N AE N AH N
+cunanan's K Y UW N AE N AH N Z
+cunard K Y UW N ER D
+cundall K AH N D AH L
+cundari K UW N D AA R IY
+cundiff K AH N D IH F
+cundill K AH N D IH L
+cundy K AH N D IY
+cuneiform K Y UW N IY AH F AO R M
+cuneo K Y UW N IY OW
+cunha K AH N HH AH
+cunliffe K AH N L IH F
+cunnane K AH N AH N
+cunneen K AH N IY N
+cunniff K AH N IH F
+cunnilingus K AH N AH L IH NG G AH S
+cunning K AH N IH NG
+cunningham K AH N IH NG HH AE M
+cunningham's K AH N IH NG HH AE M Z
+cunnington K AH N IH NG T AH N
+cunt K AH N T
+cuny K Y UW N IY
+cuoco K W OW K OW
+cuomo K W OW M OW
+cuomo's K W OW M OW Z
+cuong K W AO NG
+cuozzo K W OW Z OW
+cup K AH P
+cupboard K AH B ER D
+cupboards K AH B ER D Z
+cupcake K AH P K EY K
+cupcakes K AH P K EY K S
+cuperose K UW P ER OW Z
+cupertino K UW P ER T IY N OW
+cupid K Y UW P IH D
+cupidity K Y UW P IH D IH T IY
+cupids K Y UW P IH D Z
+cupit K Y UW P IH T
+cupo K Y UW P OW
+cupola K AH P OW L AH
+cupp K AH P
+cuppett K AH P IH T
+cupples K AH P AH L Z
+cupps K AH P S
+cuppy K AH P IY
+cups K AH P S
+cur K ER
+curable K Y UH R AH B AH L
+curacao K Y UH R AH S AW
+curate K Y UH R AH T
+curative K Y UH R AH T IH V
+curatolo K UH R AA T OW L OW
+curator K Y UH R EY T ER
+curator's K Y UH R EY T ER Z
+curator's(2) K Y UH R AH T ER Z
+curator(2) K Y UH R AH T ER
+curatorial K Y UH R AH T AO R IY AH L
+curators K Y UH R AH T ER Z
+curators(2) K Y UH R EY T ER Z
+curb K ER B
+curbed K ER B D
+curbelo K UH R B EH L OW
+curbing K ER B IH NG
+curbow K ER B OW
+curbs K ER B Z
+curbside K ER B S AY D
+curbstone K ER B S T OW N
+curby K ER B IY
+curci K UH R CH IY
+curcio K UH R CH IY OW
+curcuru K UH R K UH R UW
+curd K ER D
+cure K Y UH R
+cured K Y UH R D
+cures K Y UH R Z
+cureton K Y UH R T AH N
+curfew K ER F Y UW
+curfews K ER F Y UW Z
+curfman K ER F M AH N
+curiale K UH R IY AA L IY
+curie K Y UH R IY
+curiel K Y UW R IY L
+curing K Y UH R IH NG
+curington K Y UH R IH NG T AH N
+curio K Y UH R IY OW
+curios K Y UH R IY OW Z
+curiosities K Y UH R IY AA S AH T IY Z
+curiosity K Y UH R IY AA S AH T IY
+curious K Y UH R IY AH S
+curiouser K Y UH R IY AH S ER
+curiously K Y UH R IY AH S L IY
+curitiba K Y UH IH T IY B AH
+curl K ER L
+curle K AO R AH L
+curled K ER L D
+curlee K ER L IY
+curler K ER L ER
+curlers K ER L ER Z
+curless K ER L AH S
+curlett K ER L IH T
+curley K ER L IY
+curlin K ER L IH N
+curling K ER L IH NG
+curls K ER L Z
+curly K ER L IY
+curmudgeon K ER M AH JH IH N
+curmudgeons K ER M AH JH IH N Z
+curnow K ER N OW
+curnutt K ER N AH T
+curnutte K ER N AH T
+curragh K AH R AH
+curragh(2) K ER AH
+curran K ER AH N
+curren K ER AH N
+currence K ER AH N S
+currencies K ER AH N S IY Z
+currencies' K ER EH N S IY Z
+currency K ER AH N S IY
+currency's K ER AH N S IY Z
+currencywatch K ER AH N S IY W AA CH
+currens K ER AH N Z
+current K ER AH N T
+current's K ER AH N T S
+current(2) K ER N T
+current(3) K AA R AH N T
+currently K ER AH N T L IY
+currents K ER AH N T S
+curreri K UH R EH R IY
+currey K ER IY
+curricula K ER IH K Y AH L AH
+curricular K ER IH K Y AH L ER
+curriculum K ER IH K Y AH L AH M
+curriculums K ER IH K Y AH L AH M Z
+currie K ER IY
+curried K ER IY D
+currier K ER IY ER
+curries K ER IY Z
+currin K AO R IH N
+currington K ER IH NG T AH N
+curro K UH R OW
+curry K AH R IY
+curry's K AH R IY Z
+curry's(2) K ER IY Z
+curry(2) K ER IY
+currying K ER IY IH NG
+currys K AH R IY Z
+currys(2) K ER IY Z
+curse K ER S
+cursed K ER S T
+curses K ER S IH Z
+cursing K ER S IH NG
+cursor K ER S ER
+cursory K ER S ER IY
+curt K ER T
+curt's K ER T S
+curtail K ER T EY L
+curtailed K ER T EY L D
+curtailing K ER T EY L IH NG
+curtailment K ER T EY L M AH N T
+curtailments K ER T EY L M AH N T S
+curtails K ER T EY L Z
+curtain K ER T AH N
+curtains K ER T AH N Z
+curti K UH R T IY
+curtice K UH R T IH S
+curtin K ER T IH N
+curtis K ER T AH S
+curtis' K ER T IH S
+curtis(2) K ER T IH S
+curtiss K ER T IH S
+curtly K ER T L IY
+curtner K ER T N ER
+curto K UH R T OW
+curtright K ER T R AY T
+curts K ER T S
+curtsinger K ER T S IH N JH ER
+curtsy K ER T S IY
+curvature K ER V AH CH ER
+curve K ER V
+curved K ER V D
+curves K ER V Z
+curvin K ER V IH N
+curving K ER V IH NG
+curvy K ER V IY
+curzio K ER Z IY OW
+cus K AH S
+cus(2) S IY Y UW EH S
+cusack K Y UW Z AH K
+cusano K UW S AA N OW
+cush K AH SH
+cush(2) K UH SH
+cushey K UH SH IY
+cushing K UH SH IH NG
+cushion K UH SH AH N
+cushioned K UH SH AH N D
+cushioning K UH SH AH N IH NG
+cushioning(2) K UH SH N IH NG
+cushions K UH SH AH N Z
+cushitic K AH SH IH T IH K
+cushman K UH SH M AH N
+cushy K UH SH IY
+cusiana K Y UW Z IY AE N AH
+cusic K Y UW Z IH K
+cusick K Y UW Z IH K
+cusimano K UW S IY M AA N OW
+cusip K AH S IH P
+cusip(2) K Y UW S IH P
+cusk K AH S K
+cusmano K UW S M AA N OW
+cuso K Y UW S OW
+cuso's K Y UW S OW Z
+cuso's(2) K UW S OW Z
+cuso(2) K UW S OW
+cusp K AH S P
+cuss K AH S
+cussed K AH S T
+cussing K AH S IH NG
+cusson K AH S AH N
+custard K AH S T ER D
+custer K AH S T ER
+custer's K AH S T ER Z
+custis K AH S T IH S
+custodial K AH S T OW D IY AH L
+custodian K AH S T OW D IY AH N
+custodians K AH S T OW D IY AH N Z
+custodio K UW S T OW D IY OW
+custody K AH S T AH D IY
+custom K AH S T AH M
+customarily K AH S T AH M EH R AH L IY
+customary K AH S T AH M EH R IY
+customer K AH S T AH M ER
+customer's K AH S T AH M ER Z
+customers K AH S T AH M ER Z
+customers' K AH S T AH M ER Z
+customize K AH S T AH M AY Z
+customized K AH S T AH M AY Z D
+customizes K AH S T AH M AY Z IH Z
+customizing K AH S T AH M AY Z IH NG
+customs K AH S T AH M Z
+cusumano K UW S UW M AA N OW
+cut K AH T
+cutaia K UW T AA Y AH
+cutaway K AH T AH W EY
+cutback K AH T B AE K
+cutbacks K AH T B AE K S
+cutbirth K AH T B ER TH
+cutchall K AH CH AH L
+cutcher K AH CH ER
+cutchin K AH CH IH N
+cutchins K AH CH IH N Z
+cute K Y UW T
+cuteness K Y UW T N AH S
+cuter K Y UW T ER
+cutesiness K Y UW T S IY N IH S
+cutest K Y UW T IH S T
+cutesy K Y UW T S IY
+cuthbert K AH TH B ER T
+cuthbertson K AH TH B ER T S AH N
+cuthrell K AH TH R AH L
+cuticle K Y UW T AH K AH L
+cuticle(2) K Y UW T IH K AH L
+cutillo K Y UW T IH L OW
+cutlass K AH T L AH S
+cutler K AH T L ER
+cutler's K AH T L ER Z
+cutlery K AH T L ER IY
+cutlip K AH T L IH P
+cutoff K AH T AO F
+cutoffs K AH T AO F S
+cutout K AH T AW T
+cutouts K AH T AW T S
+cutrale K AH T R EY L
+cutrell K AH T R AH L
+cutrer K AH T R ER
+cutright K AH T R AY T
+cutrona K UW T R OW N AH
+cutrone K UW T R OW N IY
+cuts K AH T S
+cutsforth K AH T S F AO R TH
+cutshall K AH CH AH L
+cutshaw K AH CH AO
+cutsinger K AH T S IH N JH ER
+cutter K AH T ER
+cutters K AH T ER Z
+cutthroat K AH T TH R OW T
+cutting K AH T IH NG
+cuttings K AH T IH NG Z
+cuttino K UW T IY N OW
+cuttlefish K AH T AH L F IH SH
+cutts K AH T S
+cutty K AH T IY
+cutugno K Y UW T AH N Y OW
+cutworm K AH T W ER M
+cutworms K AH T W ER M Z
+cuvelier K Y UW V L IY ER
+cuyahoga K AY AH HH OW G AH
+cuyler K AY L ER
+cuzzort K AH Z ER T
+cwiertnia K W IY R T N IY AH
+cwik K W IH K
+cwikla K W IH K L AH
+cwiklinski K W IH K L IH N S K IY
+cwynar K W IH N ER
+cxc S IY EH K S S IY
+cxc(2) S IY EH K S IY
+cy S AY
+cyacq S AY AE K
+cyan S AY AE N
+cyanamid S AY AE N AH M IH D
+cyanamid's S AY AE N AH M IH D Z
+cyanazine S AY AH N AH Z IY N
+cyanide S AY AH N AY D
+cyanide(2) S AY N AY D
+cyanuric S AY AE N ER IH K
+cyb S AY B
+cyb(2) S IY W AY B IY
+cyber S AY B ER
+cybercash S AY B ER K AE SH
+cyberporn S AY B ER P AO R N
+cybersex S AY B ER S EH K S
+cyberspace S AY B ER S P EY S
+cyberspace's S AY B ER S P EY S IH Z
+cybertrend S AY B ER T R EH N D
+cybertrends S AY B ER T R EH N D Z
+cybill S AY B IH L
+cyborg S AY B AO R G
+cybulski K IH B AH L S K IY
+cycads S AY K AE D Z
+cycare S AY K EH R
+cyclades S AY K L EY D IY Z
+cyclades(2) S AY K L AE D Z
+cycle S AY K AH L
+cycled S AY K AH L D
+cycles S AY K AH L Z
+cyclic S AY K L IH K
+cyclical S AY K L IH K AH L
+cyclical(2) S IH K L IH K AH L
+cyclicality S IH K L IH K AE L IH T IY
+cyclicals S IH K L IH K AH L Z
+cycling S AY K AH L IH NG
+cycling(2) S AY K L IH NG
+cyclist S AY K AH L IH S T
+cyclist(2) S AY K L IH S T
+cyclists S AY K AH L IH S T S
+cyclists(2) S AY K L IH S T S
+cyclists(3) S AY K AH L IH S
+cyclists(4) S AY K L IH S
+cyclohexane S AY K L AH HH EH K S EY N
+cyclone S IH K L OW N
+cyclones S IH K L OW N Z
+cyclopean S AY K L AH P IY AH N
+cyclops S AY K L AO P S
+cyclops's S AY K L AO P S IH Z
+cyclosporine S IH K L AO S P ER IY N
+cyclostome S AY K L AH S T OW M
+cyclostomes S AY K L AH S T OW M Z
+cyclotron S AY K L AH T R AA N
+cycolor S IH K AH L ER
+cyd S IH D
+cydonia S IH D OW N IY AH
+cydrome S IH D R OW M
+cyert S AY ER T
+cygan S AY G AH N
+cygne S IH G N AH
+cygnus S IH G N AH S
+cyhexatin S AY HH EH K S AH T IH N
+cylinder S IH L AH N D ER
+cylinder(2) S IH L IH N D ER
+cylinders S IH L AH N D ER Z
+cylindrical S AH L IH N D R IH K AH L
+cylindrical(2) S IH L IH N D R IH K AH L
+cymbal S IH M B AH L
+cymbals S IH M B AH L Z
+cymrot S IH M R AH T
+cynara K IH N AA R AH
+cyndi S IH N D IY
+cynic S IH N IH K
+cynical S IH N IH K AH L
+cynically S IH N IH K AH L IY
+cynically(2) S IH N IH K L IY
+cynicism S IH N IH S IH Z AH M
+cynics S IH N IH K S
+cynric S IH N R IH K
+cynth S IH N TH
+cynthia S IH N TH IY AH
+cynthia's S IH N TH IY AH Z
+cynthie S IH N TH IY
+cynwyd S IH N W IH D
+cypert S AY P ER T
+cypher S AY F ER
+cyphers S AY F ER Z
+cyphert S AY F ER T
+cypress S AY P R AH S
+cypress's S AY P R AH S IH Z
+cypress(2) S AY P R IH S
+cyprian S IH P R IY AH N
+cypriot S IH P R IY AH T
+cypriot(2) S IH P R IY AA T
+cypriots S IH P R IY AH T S
+cypriots(2) S IH P R IY AA T S
+cypris S AY P R IH S
+cyprus S AY P R AH S
+cyr S IH R
+cyran K IH R AH N
+cyrano K IY R AA N OW
+cyrano(2) S IH R AH N OW
+cyrena K IH R IY N AH
+cyrenius S AH R IY N IY AH S
+cyril S IH R AH L
+cyrilla S IH R IH L AH
+cyrillic S ER IH L IH K
+cyrix S AY R IH K S
+cyrix's S AY R IH K S IH Z
+cyrix's(2) S IH R IH K S IH Z
+cyrix(2) S IH R IH K S
+cyrofin S AY R AH F IH N
+cyrus S AY R AH S
+cyst S IH S T
+cystic S IH S T IH K
+cysts S IH S T S
+cysts(2) S IH S S
+cysts(3) S IH S
+cytherea S IH TH ER IY AH
+cytogen S AY T OW JH EH N
+cytology S AY T AA L AH JH IY
+cytomegalovirus S AY T AH M EH G AH L OW V AY R AH S
+cytoplasm S AY T AH P L AE Z AH M
+cytoplasmic S AY T AH P L AE Z M IH K
+cytotech S AY T OW T EH K
+cytotechs S AY T OW T EH K S
+cywinski K IH V IH N S K IY
+czaja CH AY AH
+czajka CH AY K AH
+czajkowski CH AY K AO F S K IY
+czapla CH AA P L AH
+czaplewski CH AH P L EH F S K IY
+czaplicki CH AH P L IH T S K IY
+czar Z AA R
+czar's Z AA R Z
+czarist Z AA R IH S T
+czarnecki CH ER N EH T S K IY
+czarnik CH AA R N IH K
+czarny CH AA R N IY
+czars Z AA R Z
+czartoryski S AA R T AO R IY S K IY
+czech CH EH K
+czechoslovak CH EH K AH S L OW V AA K
+czechoslovakia CH EH K AH S L OW V AA K IY AH
+czechoslovakia's CH EH K AH S L OW V AA K IY AH Z
+czechoslovakian CH EH CH AH S L OW V AA K IY AH N
+czechoslovaks CH EH K AH S L OW V AA K S
+czechowski CH IH HH AO F S K IY
+czechs CH EH K S
+czekajewski CH EH K AH JH UW S K IY
+czepiel CH EH P IY L
+czerniak CH ER N IY AE K
+czerny CH ER N IY
+czerwinski CH ER V IH N S K IY
+czerwonka CH ER V AA NG K AH
+czeslaw CH EH S L AO
+czyz CH IH Z
+czyzewski CH IH Z EH F S K IY
+d D IY
+d'affaires D AH F EH R Z
+d'agostino D AA G AH S T IY N OW
+d'agostino's D AA G AH S T IY N OW Z
+d'alene D AH L IY N
+d'alene's D AH L IY N Z
+d'alessandra D AE L EH S AE N D R AH
+d'alessandrini D AA L EH S AA N D R IY N IY
+d'alessandro D AA L EY Z AA N D R OW
+d'alessandro's D AA L EH S AE N D R OW Z
+d'alessandro(2) D AA L EH S AE N D R OW
+d'alessi D AH L EH S IY
+d'alessi(2) D AH L EY S IY
+d'allest D AE L EH S T
+d'amato D AH M AA T OW
+d'amato's D AH M AA T OW Z
+d'america D AH M EH R IH K AH
+d'amico D AE M IY K OW
+d'amore D IY AH M AO R EY
+d'amore's D IY AH M AO R EY Z
+d'andrea D AE N D R IY AH
+d'angelo D IY AE N JH IH L OW
+d'angelo's D IY AE N JH IH L OW Z
+d'arcy D AA R S IY
+d'aubuisson D AO B W IY S AA N
+d'aviation D EY V IY EY SH AH N
+d'electricite D AH L EH K T R IH S AH T EY
+d'electricite(2) D AH L EH K T R IH S IH T EY
+d'escoto D EH S K OW T OW
+d'estaing D AH S T EY NG
+d'etat D EH T AE T
+d'etat(2) D EY T AA
+d'etats D EY T AA Z
+d'etre D EH T R IY
+d'etude D EH T UW D
+d'genetta D IY JH AH N EH T AH
+d'ivoire D IY V W AA R
+d'oeuvre D ER V
+d'oeuvres D ER V Z
+d'or D AO R
+d'orsay D AO R S EY
+d's D IY Z
+d'souza D IH S UW Z AH
+d'souza(2) D IY S UW Z AH
+d. D IY
+d.'s D IY Z
+d.s D IY Z
+da D AA
+da's D IY EY Z
+da(2) D IY EY
+daane D AA N
+daarmstadt D AA R M S T AA D
+daas D AA S
+dab D AE B
+dabah D AE B AH
+dabah(2) D AH B AA
+dabbing D AE B IH NG
+dabble D AE B AH L
+dabbled D AE B AH L D
+dabbles D AE B AH L Z
+dabbling D AE B AH L IH NG
+dabbling(2) D AE B L IH NG
+dabbs D AE B Z
+dabchick D AE B CH IH K
+dabhol D AE B OW L
+dabkowski D AH B K AO F S K IY
+dabney D AE B N IY
+dabrowski D AH B R AO F S K IY
+dac D AE K
+dace D EY S
+dacey D EY S IY
+dacha D AA CH AH
+dachau D AE K AW
+dachshund D AA K S HH UH N D
+dachshunds D AA K S HH UH N T S
+dacia D EY SH IY AH
+dack D AE K
+dacosta D AA K OW S T AH
+dacquisto D AE K W IH S T OW
+dacron D AE K R AA N
+dacruz D AA K R UW Z
+dacs D AE K S
+dactyl D AE K T IH L
+dacunha D AH K AH N HH AH
+dacus D AE K IH S
+dacy D EY S IY
+dad D AE D
+dad's D AE D Z
+dada D AA D AA
+dadamo D AA D AA M OW
+daddario D AA D AA R IY OW
+daddies D AE D IY Z
+daddona D AA D OW N AH
+daddy D AE D IY
+daddy's D AE D IY Z
+daddy-o D AE D IY OW
+daddy-o's D AE D IY OW Z
+dade D EY D
+dadeland D EY D L AH N D
+dadfar D AE D F AA R
+dadisman D AE D IH S M AH N
+dado D EY D OW
+dads D AE D Z
+dady D EY D IY
+dae D EY
+daedalus D EH D AH L AH S
+daedalus(2) D EY D AE L AH S
+daelim D EY L IY M
+daemon D IY M AH N
+daemon(2) D EY M AH N
+daenzer D EH N Z ER
+daewoo D EY W UW
+daffern D AE F ER N
+daffin D AE F IH N
+daffodil D AE F AH D IH L
+daffodils D AE F AH D IH L Z
+daffron D AE F R AH N
+daffy D AE F IY
+daffynition D AE F IY N IH SH AH N
+dafna D AE F N AH
+dafoe D AE F OW
+dafsa D AE F S AH
+daft D AE F T
+dag D AE G
+dagan D EY G AH N
+dagata D AA G AA T AH
+dagen D AE G AH N
+dagenais D AE ZH IH N EY
+dagenham D AE G AH N HH AE M
+dagenhart D AE G AH N HH AA R T
+dager D EY G ER
+dagestan D AE G EH S T AE N
+dagg D AE G
+dagger D AE G ER
+daggers D AE G ER Z
+daggett D AE G IH T
+daggs D AE G Z
+daggy D AE G IY
+dagle D EY G AH L
+dagley D AE G L IY
+dagmar D AE G M AA R
+dagon D EY G AH N
+dagostino D AA G OW S T IY N OW
+dague D AA G
+dagwood D AE G W UH D
+dah D AH
+daher D AA ER
+dahill D AA HH IH L
+dahl D AA L
+dahl's D AA L Z
+dahlberg D AA L B ER G
+dahle D AA AH L
+dahlem D AA L IH M
+dahlen D AA L AH N
+dahler D AA L ER
+dahlgren D AE L G R IH N
+dahlheimer D AA L HH AY M ER
+dahlia D AE L Y AH
+dahlin D AA L IH N
+dahlke D AA L K
+dahlman D AA L M AH N
+dahlquist D AA L K W IH S T
+dahlstrom D AA L S T R AH M
+dahm D AE M
+dahman D AA M AH N
+dahmen D AA M EH N
+dahmer D AA M ER
+dahmer's D AA M ER Z
+dahms D AA M Z
+dahn D AE N
+dahn(2) D AA N
+dahnke D AE NG K
+dahrain D AH R EY N
+dai D AY
+daido D EY D OW
+daidone D EY D OW N
+daiei D AY EY
+daigle D EY G AH L
+daigler D EY G L ER
+daignault D EH G N OW
+daigneault D EH G N OW
+daigre D EY G ER
+daigrepont D EY G R IH P AA N T
+daihatsu D AY HH AE T S UW
+daiichi D AY IY CH IY
+daikin D EY K IH N
+dail D EY L
+daile D EY L
+dailey D EY L IY
+dailies D EY L IY Z
+daily D EY L IY
+daimler D EY M L ER
+daimler's D EY M L ER Z
+daimler(2) D EH M L ER
+daimones D EY M OW N Z
+dain D EY N
+daines D EY N Z
+daini D EY N IY
+dainippon D EY N IH P AA N
+dains D EY N Z
+dainty D EY N T IY
+daiquiri D AE K ER IY
+dairies D EH R IY Z
+dairy D EH R IY
+dairying D EH R IY IH NG
+dairymen D EY R IY M AH N
+dais D EY Z
+daise D EY Z
+daisey D EY S IY
+daishowa D EY SH AW AH
+daisies D EY Z IY Z
+daisy D EY Z IY
+daisy's D EY Z IY Z
+daiwa D EY W AH
+daiwa's D EY W AH Z
+dajun D EY JH AH N
+dak D AE K
+dak(2) D IY EY K EY
+dakar D AA K AA R
+dake D EY K
+dakin D EY K IH N
+dakota D AH K OW T AH
+dakota's D AH K OW T AH Z
+dakotan D AH K OW T AH N
+dakotans D AH K OW T AH N Z
+dakotas D AH K OW T AH Z
+dal D AE L
+dalafield D AE L AH F IY L D
+dalai D AE L EY
+dalai(2) D AO L AY
+dalai(3) D AA L IY
+dalal D EY L AH L
+dalbar D AE L B AA R
+dalbec D AE L B IH K
+dalbert D AE L B ER T
+dalbey D AE L B IY
+dalby D AO L B IY
+dale D EY L
+dale's D EY L Z
+daleiden D AE L AY D AH N
+dalen D AE L AH N
+daleo D AA L IY OW
+dales D EY L Z
+dalesandro D AA L EH S AA N D R OW
+dalesio D AH L IY S IY OW
+dalessandro D AA L EH S AA N D R OW
+dalessio D AH L EH S IY OW
+daleth D AA L EH TH
+daley D EY L IY
+daley's D EY L IY Z
+dalfen D AE L F AH N
+dalfonso D AE L F AA N S OW
+dalfort D AO L F ER T
+dalgety D AE L G EH T IY
+dalgleish D AE L G AH L IH SH
+dalgleish(2) D AE L G L IH SH
+dalhouse D AO L HH AW S
+dali D AA L IY
+dalia D AA L Y AH
+dalian D EY L IY AH N
+daliberti D AE L AH B EH R T IY
+dalila D AH L AY L AH
+dalis D AE L IH S
+dalke D EY L K
+dalkon D AE L K AH N
+dall D AO L
+dalla D AE L AH
+dallaire D AA L EH R
+dallara D AE L AA R AH
+dallas D AE L AH S
+dallas' D AE L AH S
+dallas's D AE L AH S IH Z
+dalley D AE L IY
+dallhold D AO L HH OW L D
+dalliance D AE L IY AH N S
+dallied D AE L IY D
+dallman D AO L M AH N
+dallmann D AO L M AH N
+dally D AE L IY
+dalma D AA L M AH
+dalman D AE L M AH N
+dalmatian D AE L M EY SH AH N
+dalmatians D AE L M EY SH AH N Z
+dalmo D AO L M OW
+dalo D AA L OW
+daloia D AA L OW Y AH
+daloisio D AA L OY S IY OW
+dalonzo D AH L AA N Z OW
+dalpe D EY L P
+dalpiaz D AA L P IY AA Z
+dalporto D AA L P AO R T OW
+dalrymple D AE L R IH M P AH L
+dalto D AA L T OW
+dalton D AO L T AH N
+dalton's D AO L T AH N Z
+daltons D AO L T AH N Z
+daly D EY L IY
+dalzell D AE L Z AH L
+dalziel D AE L Z IY L
+dam D AE M
+dam's D AE M Z
+dama D AA M AH
+damaclean D AE M AH K L IY N
+damage D AE M AH JH
+damage(2) D AE M IH JH
+damaged D AE M AH JH D
+damaged(2) D AE M IH JH D
+damages D AE M AH JH AH Z
+damages(2) D AE M IH JH IH Z
+damaging D AE M IH JH IH NG
+daman D EY M AH N
+damaris D AH M AA R AH S
+damas D AA M AH Z
+damascus D AH M AE S K AH S
+damascus's D AH M AE S K AH S IH Z
+damask D AE M AH S K
+damasks D AE M AH S K S
+damato D AA M AA T OW
+dambach D AE M B AA K
+dambacher D AE M B AA K ER
+dambra D AE M B R AH
+dambrosia D AA M B R OW S IY AH
+dambrosio D AE M B R OW S IY OW
+dame D EY M
+dame's D EY M Z
+damelio D AH M IY L IY OW
+damer D EY M ER
+damerlin D EY M ER L IH N
+damerlin(2) D AE M ER L IH N
+dameron D AA M EH R AO N
+dames D EY M Z
+damewood D EY M W UH D
+damgard D AE M G AA R D
+damian D EY M IY AH N
+damiani D AA M IY AA N IY
+damiano D AA M IY AA N OW
+damianos D AA M IY AA N OW S
+damico D AA M IY K OW
+damien D EY M IY AH N
+damien's D EY M IY AH N Z
+damietta D AE M IY EH T AH
+daminozide D AE M IH N AH Z AY D
+damita D AA M IY T AH
+damitz D AE M IH T S
+damm D AE M
+dammam D AE M AH M
+damman D AE M AH N
+dammann D AE M AH N
+damme D AE M
+damme(2) D EY M
+dammed D AE M D
+dammen D AE M AH N
+dammer D AE M ER
+dammerman D AE M ER M AH N
+damming D AE M IH NG
+dammit D AE M IH T
+damn D AE M
+damnation D AE M N EY SH AH N
+damned D AE M D
+damning D AE M IH NG
+damns D AE M Z
+damocles D AE M AH K L IY Z
+damon D EY M AH N
+damon's D EY M AH N Z
+damone D AH M OW N
+damons D EY M AH N Z
+damoose D AH M UW S
+damore D EY M AO R
+damour D AH M UH R
+damp D AE M P
+damped D AE M P T
+dampen D AE M P AH N
+dampened D AE M P AH N D
+dampening D AE M P AH N IH NG
+dampening(2) D AE M P N IH NG
+damper D AE M P ER
+dampers D AE M P ER Z
+dampier D AE M P IY ER
+damping D AE M P IH NG
+dampness D AE M P N IH S
+damps D AE M P S
+damron D AE M R AH N
+damrow D AE M R OW
+dams D AE M Z
+damsel D AE M Z AH L
+damson D AE M S AH N
+damuth D AE M UW TH
+dan D AE N
+dan's D AE N Z
+dana D EY N AH
+dana's D EY N AH Z
+danaher D AE N AH HH ER
+danahy D AE N AH HH IY
+danbury D AE N B ER IY
+danby D AE N B IY
+danca D AA NG K AH
+dancanet D AE NG K AH N EH T
+dance D AE N S
+danced D AE N S T
+dancer D AE N S ER
+dancer's D AE N S ER Z
+dancers D AE N S ER Z
+dancers' D AE N S ER Z
+dances D AE N S AH Z
+dances(2) D AE N S IH Z
+dancey D AE N S IY
+dancin' D AE N S IH N
+dancing D AE N S IH NG
+dancsak D AE N K S AE K
+dancy D AE N S IY
+dandelion D AE N D AH L AY AH N
+dandelions D AE N D AH L AY AH N Z
+dandeneau D AE N D IH N OW
+dando D AE N D OW
+dandrea D AE N D R IY AH
+dandridge D AE N D R IH JH
+dandruff D AE N D R AH F
+dandurand D AE N D ER AH N D
+dandy D AE N D IY
+dandyism D AE N D IY IH Z AH M
+dane D EY N
+dane's D EY N Z
+daneel D AH N IY L
+danek D AE N IH K
+danell D AH N EH L
+danella D AH N EH L AH
+danelle D AH N EH L
+daner D EY N ER
+danes D EY N Z
+danese D AA N EY Z IY
+daney D EY N IY
+danford D AE N F ER D
+danforth D AE N F ER TH
+dang D AE NG
+dangel D EY NG G AH L
+dangelo D AE N JH AH L OW
+danger D EY N JH ER
+dangerfield D EY N JH ER F IY L D
+dangerous D EY N JH ER AH S
+dangerously D EY N JH ER AH S L IY
+dangerousness D EY N JH ER AH S N AH S
+dangers D EY N JH ER Z
+dangews D EY N JH UW Z
+dangle D AE NG G AH L
+dangled D AE NG G AH L D
+dangler D AE NG G AH L ER
+dangler(2) D AE NG G L ER
+dangles D AE NG G AH L Z
+dangling D AE NG G AH L IH NG
+dangling(2) D AE NG G L IH NG
+dango D AE NG G OW
+dani D AA N IY
+dania D EY N Y AH
+danica D AE N IH K AH
+daniel D AE N Y AH L
+daniel's D AE N Y AH L Z
+daniela D AE N Y EH L AH
+daniele D AE N Y EH L
+daniell D AE N IY L
+daniella D AE N Y EH L AH
+danielle D AE N IY EH L
+danielle(2) D AE N Y EH L
+daniello D AA N IY EH L OW
+daniels D AE N Y AH L Z
+daniels's D AE N Y AH L Z IH Z
+daniels's(2) D AE N Y EH L Z IH Z
+danielsen D AE N Y AH L S AH N
+danielski D AH N IY L S K IY
+danielson D AE N Y AH L S AH N
+daniloff D AE N AH L AO F
+danis D AA N IY Z
+danish D EY N IH SH
+danju D AE N JH UW
+danju's D AE N JH UW Z
+danjub D AE N JH UW B
+danjub's D AE N JH UW B Z
+danjube D AE N JH UW B
+danjube's D AE N JH UW B Z
+danjus D AE N JH AH S
+danjus(2) D AE N JH UW Z
+dank D AE NG K
+danker D AE NG K ER
+dankert D AE NG K ER T
+dankner D AE NG K N ER
+danko D AE NG K OW
+danks D AE NG K S
+danley D AE N L IY
+danly D AE N L IY
+dann D AE N
+danna D AE N AH
+dannelly D AE N AH L IY
+dannels D AE N AH L Z
+dannemeyer D AE N AH M AY R
+dannemeyer(2) D AE N M AY R
+dannemiller D AE N AH M IH L ER
+dannemiller(2) D AE N M IH L ER
+dannen D AE N AH N
+dannenberg D AE N AH N B ER G
+danner D AE N ER
+danners D AE N ER Z
+dannie D AE N IY
+dannunzio D AA N UW N Z IY OW
+danny D AE N IY
+danny's D AE N IY Z
+dano D AA N OW
+danos D EY N OW Z
+danowski D AH N AO F S K IY
+dansby D AE N S B IY
+danser D AE N S ER
+dansereau D AE N S ER OW
+dansforth D AE N S F AO R TH
+dansforth's D AE N S F AO R TH S
+dansie D AE N S IY
+danske D AE N S K
+danskin D AE N S K IH N
+dansky D AE N S K IY
+danso D AE N S OW
+danson D AE N S AH N
+danstett D AE N S T EH T
+dansville D AE N Z V IH L
+dansville's D AE N Z V IH L Z
+dant D AE N T
+dante D AA N T EY
+dante's D AE N T IY Z
+dantin D AE N T IH N
+danton D AE N T AH N
+dantoni D AA N T OW N IY
+dantonio D AE N T OW N IY OW
+dantrell D AE N T R EH L
+dantuono D AA N T W OW N OW
+dantzler D AE N T S L ER
+danube D AE N Y UW B
+danvers D AE N V ER Z
+danville D AE N V IH L
+danvy D AE N V IY
+danylyszyn D AE N IH L IY Z IH N
+danz D AE N Z
+danza D AE N Z AH
+danzer D AE N Z ER
+danzig D AE N Z IH G
+danziger D AE N Z IH G ER
+danzy D AE N Z IY
+dao D AW
+daoud D AW D
+daoust D AW S T
+daphne D AE F N IY
+daphne's D AE F N IY Z
+daphnis D AE F N AH S
+dapice D AA P IH S
+dapolito D AA P OW L IY T OW
+daponte D AA P OW N T EY
+dapozzo D AH P AA Z OW
+dapp D AE P
+dapper D AE P ER
+dapuzzo D AH P AH Z OW
+daquila D AA K W IY L AH
+dar D AA R
+dara D AE R AH
+darak D EH R AE K
+darblay D AA R B L EY
+darbonne D AA R B AH N
+darby D AA R B IY
+darby's D AA R B IY Z
+darbyshire D AA R B IH SH AY R
+darcangelo D AA R K AA NG G EH L OW
+darcey D AA R S IY
+darcie D AA R K IY
+darco D AA R K OW
+darcy D AA R S IY
+dardar D AA R D AA R
+darden D AA R D AH N
+darden's D AA R D AH N Z
+dardis D AA R D IH S
+dare D EH R
+dared D EH R D
+daredevil D EH R D EH V AH L
+daredevils D EH R D EH V AH L Z
+daremblum D EH R AH M B L UW M
+daren D AE R IH N
+darensbourg D AE R IH N S B ER G
+darensbourg(2) D AE R AH N Z B ER G
+dares D EH R Z
+daresay D EH R S EY
+darga D AA R G AH
+dargan D AA R G AH N
+dargis D AA R G IH S
+daria D AA R IY AH
+darice D AA R IH S
+darien D EH R IY AH N
+darienzo D AA R IY N Z OW
+darin D AE R IH N
+daring D EH R IH NG
+dario D EH R IY OW
+darity D AE R IH T IY
+darius D ER AY AH S
+darjeeling D AA R JH IY L IH NG
+darjeeling(2) D AA R ZH IY L IH NG
+dark D AA R K
+darke D AA R K
+darken D AA R K AH N
+darkened D AA R K AH N D
+darkening D AA R K AH N IH NG
+darkening(2) D AA R K N IH NG
+darker D AA R K ER
+darkest D AA R K AH S T
+darkie D AA R K IY
+darkly D AA R K L IY
+darkness D AA R K N AH S
+darkroom D AA R K R UW M
+darla D AA R L AH
+darland D AA R L AH N D
+darleen D AA R L IY N
+darlene D AA R L IY N
+darley D AA R L IY
+darlin D AA R L IH N
+darline D AA R L AY N
+darling D AA R L IH NG
+darlings D AA R L IH NG Z
+darlington D AA R L IH NG T AH N
+darman D AA R M AH N
+darman's D AA R M AH N Z
+darmon D AA R M AH N
+darmstadt D AA R M S T AE T
+darn D AA R N
+darnall D AA R N AH L
+darned D AA R N D
+darnedest D AA R N D EH S T
+darnedest(2) D AA R N EH S T
+darnel D AA R N AH L
+darnell D AA R N EH L
+darner D AA R N ER
+darnold D AA R N OW L D
+darns D AA R N Z
+darocha D AA R OW K AH
+darosa D AA R OW S AH
+darpa D AA R P AH
+darpino D AA R P IY N OW
+darr D EH R
+darr(2) D AA R
+darragh D EH R AH
+darrah D AE R AH
+darrel D EH R AH L
+darrell D EH R AH L
+darrelle D ER EH L
+darren D AA R AH N
+darrick D AE R IH K
+darrigo D AA R IY G OW
+darrin D AE R IH N
+darrington D AE R IH NG T AH N
+darroch D AE R AH K
+darrough D AE R AW
+darrow D EH R OW
+darrow's D EH R OW Z
+darryl D EH R AH L
+darsey D AA R S IY
+darst D AA R S T
+darsy D AA R S IY
+dart D AA R T
+dart's D AA R T S
+dartboard D AA R T B AO R D
+darted D AA R T IH D
+darter D AA R T ER
+dartez D AA R T EH Z
+darth D AA R TH
+darting D AA R T IH NG
+dartmouth D AA R T M AH TH
+dartmouth's D AA R T M AH TH S
+darton D AA R T AH N
+darts D AA R T S
+dartt D AA R T
+darty D AA R T IY
+darty's D AA R T IY Z
+darville D AA R V IH L
+darwin D AA R W IH N
+darwinian D AA R W IH N IY AH N
+darwinism D AA R W IH N IH Z AH M
+darwish D AA R W IH SH
+daryl D EH R AH L
+das D AE S
+das(2) D AA S
+dasa D AA S AH
+dasa(2) D AE S AH
+dasaro D AA S AA R OW
+dasburg D AE S B ER G
+dascenzo D AA S CH EH N Z OW
+dasch D AE SH
+daschle D AE SH L IY
+dascoli D AA S K OW L IY
+dase D EY Z
+daseke D EY S AH K IY
+dash D AE SH
+dashboard D AE SH B AO R D
+dashboards D AE SH B AO R D Z
+dashed D AE SH T
+dashel D AE SH AH L
+dashell D AE SH AH L
+dasher D AE SH ER
+dashes D AE SH IH Z
+dashiell D AE SH IY L
+dashiki D AH SH IY K IY
+dashing D AE SH IH NG
+dashnaw D AE SH N AO
+dashner D AE SH N ER
+dashville D AE SH V IH L
+dashwood D AE SH W UH D
+dasilva D AH S IH L V AH
+daspin D AE S P IH N
+daspit D AE S P IH T
+dass D AE S
+dassault D AE S AO L T
+dassault's D AE S AO L T S
+dassler D AE S L ER
+dassow D AE S OW
+dastardly D AE S T ER D L IY
+dat D AE T
+data D EY T AH
+data's D EY T AH Z
+data's(2) D AE T AH Z
+data(2) D AE T AH
+database D EY T AH B EY S
+database(2) D AE T AH B EY S
+databases D EY T AH B EY S IH Z
+databases(2) D AE T AH B EY S IH Z
+datacard D EY T AH K AA R D
+datacard(2) D AE T AH K AA R D
+datacards D EY T AH K AA R D Z
+datacards(2) D AE T AH K AA R D Z
+datacomm D EY T AH K AA M
+datacomm(2) D AE T AH K AA M
+datacomp D EY T AH K AA M P
+datacomp(2) D AE T AH K AA M P
+datacopy D EY T AH K AA P IY
+datacopy(2) D AE T AH K AA P IY
+datagraphix D EY T AH G R AE F IH K S
+datametrics D EY T AH M EH T R IH K S
+datametrics(2) D AE T AH M EH T R IH K S
+datapoint D EY T AH P OY N T
+datapoint's D EY T AH P OY N T S
+datapoint's(2) D AE T AH P OY N T S
+datapoint(2) D AE T AH P OY N T
+datapoints D EY T AH P OY N T S
+datapoints(2) D AE T AH P OY N T S
+datapower D EY T AH P AW R
+datapower(2) D AE T AH P AW R
+dataproducts D EY T AH P R AA D AH K T S
+dataproducts' D EY T AH P R AO D AH K T S
+dataproducts'(2) D AE T AH P R AO D AH K T S
+dataquest D EY T AH K W EH S T
+dataquest's D EY T AH K W EH S T S
+dataquest's(2) D AE T AH K W EH S T S
+dataquest(2) D AE T AH K W EH S T
+dataram D EY T ER AE M
+dataram(2) D AE T ER AE M
+datarex D EY T ER EH K S
+datarex(2) D AE T ER EH K S
+datas D EY T AH Z
+datas(2) D AE T AH Z
+date D EY T
+date's D EY T S
+dated D EY T IH D
+datek D AE T EH K
+dateline D EY T L AY N
+dateline's D EY T L AY N Z
+datelines D EY T L AY N Z
+dates D EY T S
+datext D AE T EH K S T
+dating D EY T IH NG
+dato D AA T OW
+datron D AE T R AH N
+dats D AE T S
+datsun D AE T S AH N
+datsun's D AE T S AH N Z
+datsun's(2) D AA T S AH N Z
+datsun(2) D AA T S AH N
+dattilio D AA T IY L IY OW
+dattilo D AA T IY L OW
+datuk D AA T UW K
+datum D AE T AH M
+datum(2) D EY T AH M
+datura D AH T UH R AH
+datz D AE T S
+dau D OW
+daub D AO B
+daube D AO B
+daubed D AO B D
+daubenspeck D AW B IH N S P IH K
+dauber D AW B ER
+daubert D AW B ER T
+dauch D AW CH
+daudelin D OW D IH L AE N
+dauenhauer D AW AH N HH AW ER
+dauer D AW ER
+daufuskie D OW F AH S K IY
+daughdrill D AO D R IH L
+daughenbaugh D AO EH N B AO
+daugherty D AA K ER T IY
+daughety D AO IH T IY
+daughney D AO N IY
+daughter D AO T ER
+daughter's D AO T ER Z
+daughters D AO T ER Z
+daughters' D AO T ER Z
+daughtery D AO T ER IY
+daughton D AO T AH N
+daughtrey D AO T R IY
+daughtridge D AO T R IH JH
+daughtry D AO T R IY
+daul D AO L
+dault D AO L T
+daulton D AO L T AH N
+daum D AO M
+daun D AO N
+daunt D AO N T
+daunted D AO N T IH D
+daunting D AO N T IH NG
+dauphin D AW F IH N
+dauphinais D OW F IH N EY
+dauphinee D AO F IH N IY
+dauria D AO R IY AH
+daus D AO Z
+dauster D AW S T ER
+dauterive D OW T ER IH V
+dauzat D AW Z AH T
+davalos D AA V AA L OW Z
+davanzo D AH V AE N Z OW
+davao D AH V OW
+davao(2) D EY V OW
+davault D AH V OW
+davco D AE V K OW
+dave D EY V
+dave's D EY V Z
+davee D AE V IY
+davenport D AE V AH N P AO R T
+davenport's D AE V AH N P AO R T S
+davern D AE V ER N
+daversa D AA V EH R S AH
+daves D EY V Z
+davey D EY V IY
+davi D AA V IY
+davia D AA V IY AH
+david D EY V IH D
+david's D EY V IH D Z
+davida D AA V IY D AH
+davide D AH V IY D EY
+davidge D AE V IH JH
+davidian D AH V IH D IY AH N
+davidian's D AH V IH D IY AH N Z
+davidians D AH V IH D IY AH N Z
+davidoff D EY V IH D AO F
+davidow D AE V IH D OW
+davids D EY V IH D Z
+davidson D EY V IH D S AH N
+davidson's D EY V IH D S AH N Z
+davie D EY V IY
+davies D EY V IY Z
+davignon D AA V IY G N AO N
+davila D AH V IH L AH
+davilla D AH V IH L AH
+davin D AE V IH N
+davina D AA V IY N AH
+davino D AA V IY N OW
+davio's D AE V IY OW Z
+davir D AH V IH R
+davis D EY V AH S
+davis' D EY V AH S
+davis'(2) D EY V AH S AH Z
+davis's D EY V AH S AH Z
+davis's(2) D EY V IH S IH Z
+davis(2) D EY V IH S
+davison D EY V IH S AH N
+davisson D AE V IH S AH N
+davitt D AH V IH T
+davlin D AE V L IH N
+davoli D AA V OW L IY
+davos D AA V OW S
+davox D AE V AA K S
+davy D EY V IY
+davydov D EY V IH D AO V
+daw D AO
+dawdle D AO D AH L
+dawdling D AO D L IH NG
+dawdy D AO D IY
+dawe D AO
+dawes D AO Z
+dawit D AE W IH T
+dawkins D AO K IH N Z
+dawley D AO L IY
+dawn D AO N
+dawn's D AO N Z
+dawned D AO N D
+dawning D AO N IH NG
+dawns D AO N Z
+daws D AO Z
+dawsey D AO S IY
+dawson D AO S AH N
+dawson's D AO S AH N Z
+dax D AE K S
+dax' D AE K S
+dax's D AE K S IH Z
+daxor D AE K S ER
+day D EY
+day's D EY Z
+daya D AY AH
+daya's D AY AH Z
+dayan D EY AH N
+daybreak D EY B R EY K
+daycare D EY K EH R
+daycares D EY K EH R Z
+dayco D EY K OW
+daydream D EY D R IY M
+daydreamed D EY D R IY M D
+daydreaming D EY D R IY M IH NG
+daydreams D EY D R IY M Z
+daye D EY
+dayhoff D EY HH AO F
+dayhuff D EY HH AH F
+dayle D EY L
+dayley D EY L IY
+daylight D EY L AY T
+daylights D EY L AY T S
+daylong D EY L AO NG
+daynard D EY N ER D
+dayne D EY N
+days D EY Z
+days' D EY Z
+daytime D EY T AY M
+daytimes D EY T AY M Z
+dayton D EY T AH N
+dayton's D EY T AH N Z
+daytona D EY T OW N AH
+daytop D EY T AA P
+daywalt D EY W AH L T
+daze D EY Z
+dazed D EY Z D
+dazey D EY Z IY
+dazs D AA S
+dazzle D AE Z AH L
+dazzled D AE Z AH L D
+dazzling D AE Z AH L IH NG
+dazzling(2) D AE Z L IH NG
+dazzo D AE Z OW
+dbase D IY B EY S
+ddt D IY D IY T IY
+de D IY
+de(2) D EY
+de(3) D AH
+de-excite D IY IH K S AY T
+de-excites D IY IH K S AY T S
+dea D IY
+deacon D IY K AH N
+deaconess D IY K AH N AH S
+deacons D IY K AH N Z
+deactivate D IY AE K T IH V EY T
+deactivated D IY AE K T IH V EY T IH D
+dead D EH D
+deadbeat D EH D B IY T
+deadbeats D EH D B IY T S
+deadbolt D EH D B OW L T
+deaden D EH D AH N
+deadening D EH D AH N IH NG
+deadening(2) D EH D N IH NG
+deader D EH D ER
+deadhead D EH D HH EH D
+deadheads D EH D HH EH D Z
+deadhorse D EH D HH AO R S
+deadlier D EH D L IY ER
+deadliest D EH D L IY AH S T
+deadline D EH D L AY N
+deadlines D EH D L AY N Z
+deadliness D EH D L IY N AH S
+deadlock D EH D L AA K
+deadlocked D EH D L AA K T
+deadlocks D EH D L AA K S
+deadly D EH D L IY
+deadpan D EH D P AE N
+deadweight D EH D W EY T
+deadwood D EH D W UH D
+deadwyler D EH D W AY L ER
+deady D EH D IY
+deaf D EH F
+deafen D EH F AH N
+deafening D EH F AH N IH NG
+deafening(2) D EH F N IH NG
+deafness D EH F N AH S
+deahl D IY L
+deak D IY K
+deak's D IY K S
+deakin D IY K IH N
+deakins D IY K IH N Z
+deal D IY L
+deal's D IY L Z
+dealba D IY AE L B AH
+deale D IY L
+dealer D IY L ER
+dealer's D IY L ER Z
+dealerline D IY L ER L AY N
+dealers D IY L ER Z
+dealers' D IY L ER Z
+dealership D IY L ER SH IH P
+dealership's D IY L ER SH IH P S
+dealerships D IY L ER SH IH P S
+dealey D IY L IY
+dealfish D IY L F IH SH
+dealing D IY L IH NG
+dealings D IY L IH NG Z
+dealmaker D IY L M EY K ER
+dealmakers D IY L M EY K ER Z
+dealmaking D IY L M EY K IH NG
+dealmeida D AH L M IY D AH
+deals D IY L Z
+dealt D EH L T
+dealy D IY L IY
+deam D IY M
+deamer D IY M ER
+dean D IY N
+dean's D IY N Z
+deana D IY AE N AH
+deanda D IY AE N D AH
+deandrade D AH N D R AA D IY
+deandrea D AE D R IY AH
+deandrea's D AE D R IY AH Z
+deandrea's(2) D IY AE D R EY AH Z
+deandrea(2) D IY AE D R EY AH
+deane D IY N
+deaner D IY N ER
+deangelis D IY AE N JH AH L AH S
+deangelo D AH NG G EH L OW
+deanna D IY AE N AH
+deans D IY N Z
+dear D IH R
+dearborn D IH R B AO R N
+dearden D IH R D AH N
+deardorff D IH R D AO R F
+deardourff D IH R D AO R F
+dearer D IH R ER
+dearest D IH R AH S T
+dearing D IH R IH NG
+dearinger D IH R IH NG ER
+dearly D IH R L IY
+dearman D IH R M AH N
+dearmas D ER M AH Z
+dearment D IH R M AH N T
+dearmon D ER M AH N
+dearmond D ER M AH N D
+dearth D ER TH
+deary D IH R IY
+deas D IY Z
+dease D IY S
+deason D IY Z AH N
+deasy D IY S IY
+deater D IY T ER
+death D EH TH
+death's D EH TH S
+deathbed D EH TH B EH D
+deatherage D EH TH ER IH JH
+deatherage(2) D EH TH R IH JH
+deathly D EH TH L IY
+deaths D EH TH S
+deathshot D EH TH SH AO T
+deathwatch D EH TH W AA CH
+deatley D IY T L IY
+deaton D IY T AH N
+deatrick D IY T R IH K
+deats D IY T S
+deaver D IY V ER
+deaver's D IY V ER Z
+deavers D IY V ER Z
+deavila D AH V IY L AH
+deb D EH B
+debacker D IY B AE K ER
+debacle D AH B AA K AH L
+debacles D EY B AA K AH L Z
+debakey D IH B EY K IY
+debarment D IH B AA R M AH N T
+debarr D IH B AE R
+debarros D EY B AA R OW Z
+debartolo D IH B AA R T OW L OW
+debartolo(2) D AH B AA R T AH L OW
+debartolos D AH B AA R T AH L OW Z
+debartolos(2) D IH B AA R T OW L OW Z
+debase D AH B EY S
+debased D AH B EY S T
+debasement D AH B EY S M AH N T
+debasing D IH B EY S IH NG
+debatable D AH B EY T AH B AH L
+debate D AH B EY T
+debate's D AH B EY T S
+debated D AH B EY T IH D
+debater D AH B EY T ER
+debaters D AH B EY T ER Z
+debates D AH B EY T S
+debating D AH B EY T IH NG
+debator D IY B EY T ER
+debator's D IY B EY T ER Z
+debauche D EH B AW K
+debauchery D AH B AO CH ER IY
+debaun D EH B AW N
+debbie D EH B IY
+debbie's D EH B IY Z
+debby D EH B IY
+debeer D EH B IH R
+debeers D IH B IH R Z
+debelak D EH B IH L AH K
+debell D IY B EH L
+debella D IH B EH L AH
+debellis D EH B IH L IH S
+debello D IH B EH L OW
+debenedetto D IH B EH N AH D EH T OW
+debenedictis D EH B IH N AH D IH K T IH S
+debenture D AH B EH N CH ER
+debentures D AH B EH N CH ER Z
+debentures' D IH B EH N CH ER Z
+debernardi D IH B ER N AA R D IY
+deberry D IY B EH R IY
+debes D IY B Z
+debevoise D EH B EH V W AA Z
+debi D EH B IY
+debiase D IH B IY AA S IY
+debilitate D AH B IH L AH T EY T
+debilitated D AH B IH L AH T EY T IH D
+debilitating D AH B IH L AH T EY T IH NG
+debility D AH B IH L AH T IY
+debit D EH B IH T
+deblanc D IH B L AE NG K
+deblasio D IH B L AA S IY OW
+deblock D EH B L AH K
+deblois D EH B L UW
+deblum D AH B L UW M
+deblum(2) D AH B L AH M
+debnam D EH B N AH M
+debo D IY B OW
+deboard D IY B AO R D
+deboe D IH B OW
+deboer D IY B OW ER
+deboers D IY B OW ER Z
+debold D EH B OW L D
+debolt D EH B OW L T
+debona D IH B OW N AH
+debonair D EH B AH N EH R
+debonis D EH B AH N IH S
+debono D IH B OW N OW
+debor D EH B AO R
+debora D EH B R AH
+deborah D EH B ER AH
+deborah's D EH B ER AH Z
+deborah's(2) D EH B R AH Z
+deborah(2) D EH B R AH
+debord D IH B AO R D
+deborde D IH B AO R D
+debose D EH B AH S
+debow D EH B OW
+deboy D IH B OY
+debra D EH B R AH
+debraudwick D IH B R AA D W IH K
+debrecen D EH B R EH T S IH N
+debrief D IH B R IY F
+debriefed D IH B R IY F T
+debriefing D IH B R IY F IH NG
+debriefs D IH B R IY F S
+debris D AH B R IY
+debrosse D EH B R AH S
+debruhl D EH B R AH L
+debruin D EH B R UW IH N
+debruler D EH B R UW L ER
+debruyn D EH B R AY N
+debruyne D EH B R AY N
+debs D EH B Z
+debt D EH T
+debt's D EH T S
+debtholder D EH T HH OW L D ER
+debtholders D EH T HH OW L D ER Z
+debtor D EH T ER
+debtor's D EH T ER Z
+debtors D EH T ER Z
+debtors' D EH T ER Z
+debts D EH T S
+debug D IY B AH G
+debugging D IY B AH G IH NG
+debuhr D EH B UH R
+debunk D IH B AH NG K
+debunked D IH B AH NG K T
+debunking D IH B AH NG K IH NG
+debunks D IH B AH NG K S
+debus D EH B IH S
+debusk D EH B AH S K
+debussy D IH B AH S IY
+debussy's D IH B AH S IY Z
+debussy's(2) D IH B Y UW S IY Z
+debussy(2) D IH B Y UW S IY
+debut D EY B Y UW
+debutante D EH B Y AH T AA N T
+debutantes D EH B Y AH T AA N T S
+debuted D EY B Y UW D
+debuting D EY B Y UW IH NG
+debuts D EY B Y UW Z
+dec D EH K
+dec's D EH K S
+decade D EH K EY D
+decade's D EH K EY D Z
+decadence D EH K AH D AH N S
+decadent D EH K AH D AH N T
+decadents D EH K AH D AH N T S
+decades D EH K EY D Z
+decaf D IY K AE F
+decaffeinate D IY K AE F AH N EY T
+decaffeinated D IY K AE F AH N EY T IH D
+decaffeinating D IY K AE F AH N EY T IH NG
+decaffeination D IY K AE F AH N EY SH AH N
+decaire D IY K EH R
+decals D IY K AE L Z
+decamillo D EH K AH M IH L OW
+decamillo's D EH K AH M IH L OW Z
+decamp D AH K AE M P
+decamped D IY K AE M P T
+decandia D IH K AA N D IY AH
+decant D AH K AE N T
+decanting D AH K AE N T IH NG
+decapitate D IY K AE P AH T EY T
+decapitated D IY K AE P AH T EY T IH D
+decapitation D IH K AE P IH T EY SH AH N
+decapitations D IH K AE P IH T EY SH AH N Z
+decaprio D IH K AA P R IY OW
+decapua D IH K AA P UW AH
+decarava D IH K AE AH V AH
+decarava's D IH K AE AH V AH Z
+decarli D IH K AA R L IY
+decarlo D IH K AA R L OW
+decaro D IH K AA R OW
+decarolis D EH K ER AH L IH S
+decarolis(2) D IH K ER AH L IH S
+decastro D IH K AE S T R OW
+decathlete D IY K AE TH L IY T
+decathlon D IY K AE TH L AO N
+decato D IH K AA T OW
+decatur D IH K EY T ER
+decay D AH K EY
+decay(2) D IH K EY
+decayed D AH K EY D
+decaying D AH K EY IH NG
+decaying(2) D IH K EY IH NG
+decays D AH K EY Z
+decca D EH K AH
+decease D IH S IY S
+deceased D IH S IY S T
+dececco D IH CH EH K OW
+decedent D EH S IY D AH N T
+decedent's D EH S IY D AH N T S
+decedents D EH S IY D AH N T S
+deceit D AH S IY T
+deceit(2) D IH S IY T
+deceitful D AH S IY T F AH L
+deceitful(2) D IH S IY T F AH L
+deceits D AH S IY T S
+deceive D IH S IY V
+deceived D IH S IY V D
+deceiving D IH S IY V IH NG
+decelerate D IH S EH L ER EY T
+decelerated D IH S EH L ER EY T IH D
+decelerating D IH S EH L ER EY T IH NG
+deceleration D IH S EH L ER EY SH AH N
+decelle D IH S EH L
+decelles D EH S AH L Z
+december D IH S EH M B ER
+december's D IH S EH M B ER Z
+decency D IY S AH N S IY
+decennial D AH S EH N IY AH L
+decent D IY S AH N T
+decently D IY S AH N T L IY
+decentralization D IH S EH N T R AH L IH Z EY SH AH N
+decentralize D IH S EH N T R AH L AY Z
+decentralized D IH S EH N T R AH L AY Z D
+decentralizing D IH S EH N T R AH L AY Z IH NG
+deception D IH S EH P SH AH N
+deceptions D IH S EH P SH AH N Z
+deceptive D IH S EH P T IH V
+deceptively D IH S EH P T IH V L IY
+decertification D IY S ER T AH F AH K EY SH AH N
+decertified D IY S ER T AH F AY D
+decertify D IY S ER T AH F AY
+decesare D IH CH EH S AA R IY
+decesaris D IH S EH S ER IH S
+dech D EH K
+dechant D EY CH AH N T
+dechellis D EH K IH L IH S
+dechene D EH K IY N
+decherd D EH CH ER D
+dechert D EH K ER T
+dechine D EH CH IH N
+dechine(2) D AH CH IH N
+dechristopher D EH K R IH S T AA F ER
+decibel D EH S AH B EH L
+decibels D EH S AH B AH L Z
+decicco D IH CH IY K OW
+decide D IH S AY D
+decided D IH S AY D IH D
+decidedly D IH S AY D AH D L IY
+decides D IH S AY D Z
+deciding D AH S AY D IH NG
+deciduous D IH S IH JH UW AH S
+deciliter D EH S AH L IY T ER
+decima D IH CH IY M AH
+decimal D EH S AH M AH L
+decimals D EH S AH M AH L Z
+decimate D EH S AH M EY T
+decimated D EH S AH M EY T IH D
+decimating D EH S AH M EY T IH NG
+decimation D EH S AH M EY SH AH N
+decipher D IH S AY F ER
+deciphered D IH S AY F ER D
+deciphering D AH S AY F ER IH NG
+decision D IH S IH ZH AH N
+decision's D IH S IH ZH AH N Z
+decisionmaker D IH S IH ZH AH N M EY K ER
+decisionmaking D IH S IH ZH AH N M EY K IH NG
+decisions D IH S IH ZH AH N Z
+decisive D IH S AY S IH V
+decisively D IH S AY S IH V L IY
+decisiveness D IH S AY S IH V N AH S
+deck D EH K
+deckard D IH K AA R D
+decked D EH K T
+decker D EH K ER
+decker's D EH K ER Z
+deckert D EH K ER T
+decking D EH K IH NG
+deckman D EH K M AH N
+decks D EH K S
+declaim D IH K L EY M
+declaimed D IH K L EY M D
+declarant D IH K L EH R AH N T
+declaration D EH K L ER EY SH AH N
+declarations D EH K L ER EY SH AH N Z
+declaratory D IH K L EH R AH T AO R IY
+declare D IH K L EH R
+declared D IH K L EH R D
+declares D IH K L EH R Z
+declaring D IH K L EH R IH NG
+declassified D IH K L AE S AH F AY D
+declassify D IH K L AE S AH F AY
+declerck D AH K L ER K
+declerck's D AH K L ER K S
+declercq D AH K L ER K
+declercq's D AH K L ER K S
+declerk D AH K L ER K
+declerk's D AH K L ER K S
+declerque D AH K L ER K
+declerque's D AH K L ER K S
+decline D IH K L AY N
+declined D IH K L AY N D
+decliner D IH K L AY N ER
+decliners D IH K L AY N ER Z
+declines D IH K L AY N Z
+declining D IH K L AY N IH NG
+declue D EH K L UW
+deco D EH K OW
+decode D IH K OW D
+decoded D IH K OW D AH D
+decoder D IH K OW D ER
+decoders D IH K OW D ER Z
+decodes D IH K OW D Z
+decoding D IH K OW D IH NG
+decola D IH K OW L AH
+decom D EH K AA M
+decommission D IY K AH M IH SH AH N
+decommissioned D IY K AH M IH SH AH N D
+decommissioning D IY K AH M IH SH AH N IH NG
+decompose D IY K AH M P OW Z
+decomposed D IY K AH M P OW Z D
+decomposes D IY K AH M P OW Z IH Z
+decomposing D IY K AH M P OW Z IH NG
+decomposition D IY K AH M P OW Z IH SH AH N
+decomposition(2) D IY K AH M P AH Z IH SH AH N
+decompression D IY K AH M P R EH SH AH N
+deconcini D IY K AH N S IY N IY
+decongestant D IH K AH N JH EH S T AH N T
+decongestant(2) D IY K AH N JH EH S T AH N T
+decongestants D IH K AH N JH EH S T AH N T S
+decongestants(2) D IY K AH N JH EH S T AH N T S
+deconstruct D IY K AH N S T R AH K T
+deconstruction D IY K AH N S T R AH K SH AH N
+decontaminate D IY K AH N T AE M AH N EY T
+decontaminated D IY K AH N T AE M AH N EY T IH D
+decontamination D IY K AH N T AE M AH N EY SH AH N
+decontrol D IY K AH N T R OW L
+decontrolled D IY K AH N T R OW L D
+decook D EH K UH K
+decor D IH K AO R
+decor(2) D EY K AO R
+decorate D EH K ER EY T
+decorated D EH K ER EY T AH D
+decorated(2) D EH K ER EY T IH D
+decorating D EH K ER EY T IH NG
+decoration D EH K ER EY SH AH N
+decorations D EH K ER EY SH AH N Z
+decorative D EH K R AH T IH V
+decorator D EH K ER EY T ER
+decorators D EH K ER EY T ER Z
+decordova D IY K AO R D OW V AH
+decorous D EH K ER AH S
+decorte D IH K AO R T IY
+decorum D IH K AO R AH M
+decosta D IH K OW S T AH
+decoste D IH K OW S T IY
+decoster D EH K AH S T ER
+decoteau D EH K AH T OW
+decou D IH K UW
+decouple D IY K AH P AH L
+decoupling D IY K AH P L IH NG
+decourcy D EH K UH R K IY
+decoursey D EH K AO R S IY
+decoy D AH K OY
+decoys D IY K OY Z
+decrane D AH K R EY N
+decrease D IH K R IY S
+decrease(2) D IY K R IY S
+decreased D IH K R IY S T
+decreased(2) D IY K R IY S T
+decreases D IH K R IY S AH Z
+decreases(2) D IH K R IY S IH Z
+decreases(3) D IY K R IY S IH Z
+decreasing D IH K R IY S IH NG
+decreasing(2) D IY K R IY S IH NG
+decree D IH K R IY
+decreed D IH K R IY D
+decrees D IH K R IY Z
+decrepit D AH K R EH P IH T
+decrepitly D AH K R EH P IH T L IY
+decrescenzo D IH K R EH S CH EH N Z OW
+decried D IH K R AY D
+decries D IH K R AY Z
+decriminalization D IY K R IH M AH N AH L AH Z EY SH AH N
+decriminalize D IY K R IH M AH N AH L AY Z
+decriminalizing D IY K R IH M AH N AH L AY Z IH NG
+decristofaro D IH K R IY S T OW F AA R OW
+decry D IH K R AY
+decrying D IH K R AY IH NG
+decter D EH K T ER
+decuir D EH K IH R
+decurtis D IY K ER T AH S
+decworld D EH K W ER L D
+dede D IY D
+dedeaux D IH D OW
+dedecker D EH D IH K ER
+dederichs D EH D R IH K S
+dederick D EH D ER IH K
+dedeurwaerder D AH D ER W AA R D ER
+dedham D EH D AH M
+dedic D EH D IH K
+dedicate D EH D AH K EY T
+dedicated D EH D AH K EY T AH D
+dedicates D EH D IH K EY T S
+dedicating D EH D IH K EY T IH NG
+dedication D EH D AH K EY SH AH N
+dedios D EY D IY OW Z
+dedman D EH D M AH N
+dedmon D EH D M AH N
+dedo D EY D OW
+dedominicis D EY D OW M IY N IY S IH S
+dedrick D EH D R IH K
+deduce D IH D UW S
+deduced D IH D UW S T
+deduct D IH D AH K T
+deducted D IH D AH K T IH D
+deductibility D IH D AH K T AH B IH L AH T IY
+deductible D IH D AH K T AH B AH L
+deductibles D IH D AH K T AH B AH L Z
+deducting D IH D AH K T IH NG
+deduction D IH D AH K SH AH N
+deductions D IH D AH K SH AH N Z
+deductive D IH D AH K T AH V
+deductively D IH D AH K T AH V L IY
+deducts D IH D AH K T S
+dee D IY
+dee's D IY Z
+deeb D IY B
+deed D IY D
+deeded D IY D AH D
+deeded(2) D IY D IH D
+deedee D IY D IY
+deedrick D IY D R IH K
+deedrick's D IY D R IH K S
+deeds D IY D Z
+deedy D IY D IY
+deeg D IY G
+deegan D IY G AH N
+deehan D IY HH AE N
+deehan(2) D IY AH N
+deel D IY L
+deeley D IY L IY
+deely D IY L IY
+deem D IY M
+deemed D IY M D
+deemer D IY M ER
+deemphasize D IY EH M F AH S AY Z
+deemphasizing D IY EH M F AH S AY Z IH NG
+deems D IY M Z
+deen D IY N
+deener D IY N ER
+deeney D IY N IY
+deep D IY P
+deepak D IY P AE K
+deepen D IY P AH N
+deepened D IY P AH N D
+deepening D IY P AH N IH NG
+deepening(2) D IY P N IH NG
+deepens D IY P AH N Z
+deeper D IY P ER
+deepest D IY P AH S T
+deeply D IY P L IY
+deepwater D IY P W AO T ER
+deer D IH R
+deerborne D IH R B AO R N
+deere D IH R
+deere's D IH R Z
+deerfield D IH R F IY L D
+deering D IH R IH NG
+deerman D IH R M AH N
+deerskin D IH R S K IH N
+deery D IH R IY
+dees D IY Z
+deese D IY Z
+deet D IY T
+deeter D IY T ER
+deets D IY T S
+deetz D IY T S
+defabio D IH F AA B IY OW
+deface D IH F EY S
+defaced D IH F EY S T
+defacing D IH F EY S IH NG
+defalco D IH F AA L K OW
+defamation D EH F AH M EY SH AH N
+defamatory D IH F AE M AH T AO R IY
+defame D IH F EY M
+defamed D IH F EY M D
+defarges D IH F AA R JH IH Z
+default D IH F AO L T
+defaulted D IH F AO L T IH D
+defaulter D IH F AO L T ER
+defaulters D IH F AO L T ER Z
+defaulting D IH F AO L T IH NG
+defaults D IH F AO L T S
+defazio D IH F AA Z IY OW
+defazio(2) D IH F EY Z IY OW
+defeasance D IH F IY Z AH N S
+defeat D IH F IY T
+defeated D IH F IY T AH D
+defeated(2) D IH F IY T IH D
+defeating D IH F IY T IH NG
+defeatism D IH F IY T IH Z AH M
+defeatist D IH F IY T IH S T
+defeats D IH F IY T S
+defect D IY F EH K T
+defect(2) D IH F EH K T
+defected D IH F EH K T IH D
+defecting D IH F EH K T IH NG
+defection D IH F EH K SH AH N
+defections D IH F EH K SH AH N Z
+defective D IH F EH K T IH V
+defector D IH F EH K T ER
+defectors D IH F EH K T ER Z
+defects D IY F EH K T S
+defects(2) D IH F EH K T S
+defee D EH F IY
+defelice D IH F EH L IH S
+defenbaugh D EH F IH N B AW
+defence D IH F EH N S
+defend D IH F EH N D
+defendant D IH F EH N D AH N T
+defendant's D IH F EH N D AH N T S
+defendants D IH F EH N D AH N T S
+defendants' D IH F EH N D AH N T S
+defended D IH F EH N D AH D
+defended(2) D IH F EH N D IH D
+defender D IH F EH N D ER
+defender's D IH F EH N D ER Z
+defenders D IH F EH N D ER Z
+defending D IH F EH N D IH NG
+defends D IH F EH N D Z
+defense D IH F EH N S
+defense's D IH F EH N S IH Z
+defenseless D IH F EH N S L AH S
+defenses D IH F EH N S AH Z
+defenses(2) D IH F EH N S IH Z
+defensible D IH F EH N S AH B AH L
+defensive D IH F EH N S IH V
+defensively D IH F EH N S IH V L IY
+defensiveness D IH F EH N S IH V N AH S
+defeo D IY F IY OW
+defer D IH F ER
+deference D EH F ER AH N S
+deference(2) D EH F R AH N S
+deferential D EH F ER EH N CH AH L
+deferential(2) D EH F ER EH N SH AH L
+deferment D IH F ER M AH N T
+deferments D IH F ER M AH N T S
+deferral D IH F ER AH L
+deferrals D IH F ER AH L Z
+deferred D IH F ER D
+deferring D IH F ER IH NG
+defers D IH F ER Z
+defex D EH F EH K S
+deffenbaugh D EH F IH N B AW
+deffeyes D EH F AY Z
+defiance D IH F AY AH N S
+defiant D IH F AY AH N T
+defiantly D IH F AY AH N T L IY
+defibaugh D EH F IH B AO
+defibrillator D IY F IH B R IH L EY T ER
+defibrillators D IY F IH B R IH L EY T ER Z
+deficiencies D IH F IH SH AH N S IY Z
+deficiency D IH F IH SH AH N S IY
+deficient D IH F IH SH AH N T
+deficit D EH F AH S AH T
+deficit's D EH F AH S AH T S
+deficits D EH F IH S IH T S
+defied D IH F AY D
+defies D IH F AY Z
+defilippis D EH F IH L IH P IH S
+defilippis(2) D AH F AH L IH P AH S
+defilippo D IH F IY L IY P OW
+defina D IH F IY N AH
+definable D IH F AY N AH B AH L
+define D IH F AY N
+defined D IH F AY N D
+defines D IH F AY N Z
+defining D IH F AY N IH NG
+definite D EH F AH N AH T
+definitely D EH F AH N AH T L IY
+definition D EH F AH N IH SH AH N
+definitions D EH F AH N IH SH AH N Z
+definitive D IH F IH N IH T IH V
+definitively D IH F IH N IH T IH V L IY
+defino D IH F IY N OW
+defiore D IH F IY AO R IY
+deflate D IH F L EY T
+deflated D IH F L EY T IH D
+deflating D IH F L EY T IH NG
+deflation D IH F L EY SH AH N
+deflationary D IH F L EY SH AH N EH R IY
+deflator D IH F L EY T ER
+deflect D IH F L EH K T
+deflected D IH F L EH K T IH D
+deflecting D IH F L EH K T IH NG
+deflects D IH F L EH K T S
+defleur D IH F L ER
+defoe D IH F OW
+defoe's D IH F OW Z
+defoliant D IH F OW L IY AH N T
+defoliants D IH F OW L IY AH N T S
+defollet D AH F AO L AH T
+defollets D AH F AO L AH T S
+defoor D EH F UH R
+deford D EH F ER D
+deford's D EH F ER D Z
+defore D IY F AO R
+deforest D IH F AO R AH S T
+deforestation D IH F AO R IH S T EY SH AH N
+deforge D EH F ER G
+deform D IY F AO R M
+deformation D IY F AO R M EY SH AH N
+deformed D IH F AO R M D
+deformities D IH F AO R M AH T IY Z
+deformity D IH F AO R M AH T IY
+deforrest D EY F AO R IH S T
+deforrest(2) D IH F AO R IH S T
+defrain D IH F R EY N
+defrance D IY F R AH N S
+defrancesco D IH F R AA N CH EH S K OW
+defrancisco D IH F R AA N CH IY S K OW
+defranco D IH F R AA N K OW
+defrank D EH F R AH NG K
+defrates D EH F ER EY T S
+defraud D IH F R AO D
+defrauded D IH F R AO D IH D
+defrauding D IH F R AO D IH NG
+defray D IH F R EY
+defrays D IH F R EY Z
+defrees D IH F R IY Z
+defreese D EH F R IY S
+defreitas D EH F R AY T AH Z
+defries D IH F R IY Z
+defrost D IH F R AO S T
+defrosting D IH F R AO S T IH NG
+deft D EH F T
+defterios D EH F T EH R IY OW Z
+deftly D EH F T L IY
+defunct D IH F AH NG K T
+defund D IY F AH N D
+defunding D IY F AH N D IH NG
+defusco D IH F UW S K OW
+defuse D IH F Y UW Z
+defused D IH F Y UW Z D
+defused(2) D IY F Y UW Z D
+defusing D IH F Y UW Z IH NG
+defy D IH F AY
+defying D IH F AY IH NG
+degaetano D IH G AA EH T AA N OW
+degan D IY G AH N
+degarmo D IH G AA R M OW
+degas D EY G AH S
+degas(2) D EY G AH
+degaulle D AH G AA L
+degaulle's D AH G AA L Z
+degen D EH G AH N
+degener D EH G IY N ER
+degeneracy D IH JH EH N ER AH S IY
+degenerate D IH JH EH N ER AH T
+degenerate(2) D IH JH EH N ER EY T
+degenerated D IH JH EH N ER EY T IH D
+degenerates D IH JH EH N ER AH T S
+degenerating D IH JH EH N ER EY T IH NG
+degeneration D IH JH EH N ER EY SH AH N
+degenerative D IH JH EH N ER AH T IH V
+degeneres D IH JH IH N EH R EH S
+degeneres(2) D IY JH IH N EH R EH S
+degenhardt D EH G IH N HH AA R T
+degenhart D EH G AH N HH AA R T
+degennaro D IH JH EH N AA R OW
+degeorge D EH G IY ER G
+deger D IY G ER
+degiacomo D IY JH AH K OW M OW
+degidio D IH JH IY D IY OW
+degirolamo D IH JH IH R OW L AA M OW
+degler D EH G L ER
+degnan D EH G N AH N
+degner D EH G N ER
+degood D EH G UH D
+degraaf D EH G R AA F
+degrace D IH G R AA CH IY
+degrace(2) D IH G R EY S
+degradable D IH G R EY D AH B AH L
+degradation D EH G R AH D EY SH AH N
+degradations D EH G R AH D EY SH AH N Z
+degrade D IH G R EY D
+degraded D IH G R EY D AH D
+degraded(2) D IH G R EY D IH D
+degrades D IH G R EY D Z
+degrading D IH G R EY D IH NG
+degraff D EH G R AH F
+degraffenreid D EH G R AH F IH N R AY D
+degrand D EH G R AE N D
+degrange D EH G R EY N JH
+degrasse D IH G R AA S IY
+degrave D IH G R AA V IY
+degraw D EH G R AO
+degray D EH G R EY
+degrazia D IH G R AA Z IY AH
+degree D IH G R IY
+degreed D IH G R IY D
+degrees D IH G R IY Z
+degregorio D IH G R EH G AO R IY OW
+degregory D EH G R IH G ER IY
+degroat D EH G R OW T
+degroff D EH G R AO F
+degroot D EH G R UW T
+degroote D AH G R UW T
+deguerin D IH G ER IH N
+deguire D EY G W IH R EY
+degussa D IH G Y UW S AH
+degutare D EH G UW T AA R IY
+degutare's D EH G UW T AA R IY Z
+deguzman D EY G UW Z M AE N
+dehaan D EH HH AA N
+dehaas D EH HH AA Z
+deharbe D AH HH AA R B IY
+dehart D EH HH AA R T
+dehaven D EH HH AH V AH N
+dehecq D IH HH EH K
+dehere D AH HH IH R IY
+deherrera D EY HH EH R EH R AH
+dehler D EH L ER
+dehm D EH M
+dehmer D EH M ER
+dehn D EH N
+dehne D EH N
+dehner D EH N ER
+dehnert D EH N ER T
+dehoff D EH HH AO F
+dehoyos D EH HH OY OW Z
+dehumanization D IY HH Y UW M AH N AH Z EY SH AH N
+dehumanize D IH HH Y UW M AH N AY Z
+dehumanized D IH HH Y UW M AH N AY Z D
+dehumanizing D IY HH Y UW M AH N AY Z IH NG
+dehumidified D IY HH Y UW M IH D AH F AY D
+dehumidifier D IY HH Y UW M IH D AH F AY ER
+dehumidifies D IY HH Y UW M IH D AH F AY Z
+dehumidify D IY HH Y UW M IH D AH F AY
+dehydrate D IH HH AY D R EY T
+dehydrated D IH HH AY D R EY T AH D
+dehydration D IY HH AY D R EY SH AH N
+deibel D AY B AH L
+deibert D AY B ER T
+deibler D AY B AH L ER
+deibler(2) D AY B L ER
+deichert D AY K ER T
+deidre D IY D R AH
+deidre's D IY D R AH Z
+deification D IY AH F AH K EY SH AH N
+deified D IY AH F AY D
+deify D IY AH F AY
+deighan D EY G HH AH N
+deighton D EY T AH N
+deign D EY N
+deignan D AH G N AE N
+deigned D EY N D
+deigning D EY N IH NG
+deigns D EY N Z
+deihl D AY L
+deike D IY K
+deikel D AY K AH L
+deily D IY L IY
+deines D IY N Z
+deininger D AY N IH NG ER
+deinstitutionalization D IY IH N S T IH T UW SH AH N AH L AH Z EY SH AH N
+deinstitutionalize D IY IH N S T IH T UW SH AH N AH L AY Z
+deion D IY Y AA N
+deion(2) D IY AA N
+deirdre D IY R D R AH
+deis D IY Z
+deis(2) D EY IH Z
+deisher D IY IH SH ER
+deism D IY IH Z AH M
+deiss D AY S
+deist D IY IH S T
+deitch D AY CH
+deiter D AY T ER
+deiters D AY T ER Z
+deities D IY AH T IY Z
+deitrich D AY T R IH K
+deitrick D AY T R IH K
+deitsch D AY CH
+deity D IY AH T IY
+deitz D IY T S
+deja D IY JH AH
+deja(2) D EY ZH AA
+dejager D EH JH EY G ER
+dejarnett D IH JH AA R N IH T
+dejarnette D EH ZH AA R N EH T
+dejean D IH ZH IY N
+deject D IH JH EH K T
+dejected D IH JH EH K T IH D
+dejesus D IH JH IY Z AH S
+dejohn D AH JH AA N
+dejong D AH JH AO NG
+dejonge D AH JH AO NG
+dejongh D AH JH AO NG
+dejoseph D AH JH OW S AH F
+dejoy D AH JH OY
+dejulio D AH JH UW L IY OW
+dekalb D IH K AE L B
+dekay D AH K EY
+dekeyser D AH K AY Z ER
+dekker D EH K ER
+dekle D EH K AH L
+deklerk D AH K L ER K
+deklerk's D AH K L ER K S
+dekom D EH K AH M
+dekoning D EH K AH N IH NG
+dekroon D EH K R UW N
+dekuyper D IH K AY P ER
+del D EH L
+del-campos D EH L K AE M P OW Z
+dela D EH L AH
+delacerda D EH L AA CH EH R D AH
+delacroix D AH L AH K R W AH
+delacroix(2) D AH L AH K R OY
+delacruz D EY L AA K R UW Z
+delacy D AH L AO S IY
+delafield D EH L AH F IY L D
+delafuente D EY L AA F W EH N T EY
+delagarza D EH L AA G AA R Z AH
+delage D EH L IH JH
+delagrange D EH L AA G R AA N JH
+delahanty D EH L AH HH AH N T IY
+delahoussaye D EH L AH HH AW S EY
+delahunt D EH L AH HH AH N T
+delahunty D EH L AH HH AH N T IY
+delaine D IH L EY N
+delair D IH L EH R
+delamar D EY L AA M AA R
+delamater D EH L AH M EY T ER
+delancey D EH L AH N S IY
+delancy D EH L AH N S IY
+deland D IH L AE N D
+delane D EH L AH N
+delaney D AH L EY N IY
+delange D EH L EY N JH
+delano D IH L AA N OW
+delano(2) D EH L AH N OW
+delanoy D EH L AH N OY
+delany D EH L AH N IY
+delao D EH L AW
+delap D EH L AH P
+delapaz D EY L AA P AA Z
+delapena D EH L AA P EH N AH
+delapp D EH L AH P
+delara D EH L AA R AH
+delariva D EH L AA R IY V AH
+delarosa D EH L AA R OW S AH
+delashmit D EH L AH SH M IH T
+delashmutt D EH L AH SH M AH T
+delaski D AH L AE S K IY
+delatorre D EH L AA T AO R IY
+delatte D IH L AE T
+delauder D EH L AW D ER
+delaughter D EH L AO T ER
+delaune D EH L AO N
+delaura D EH L AO R AH
+delaurel D AH L AA R AH L
+delaurentiis D IY L AO R EH N T IY Z
+delaurentis D EY L AW R EY N T IH S
+delauter D EH L AW T ER
+delaval D EH L AH V AE L
+delavan D EH L AH V AH N
+delavega D EY L AA V EY G AH
+delaware D EH L AH W EH R
+delaware's D EH L AH W EH R Z
+delawarian D EH L AH W EH R IY IH N
+delawarians D EH L AH W EH R IY IH N Z
+delawder D EH L AO D ER
+delay D IH L EY
+delayed D IH L EY D
+delaying D IH L EY IH NG
+delays D IH L EY Z
+delbarco D EH L B AA R K OW
+delbarco's D EH L B AA R K OW Z
+delbene D EH L B IH N AH
+delbert D EH L B ER T
+delbianco D EH L B IY AA N K OW
+delbosque D IH L B OW S K
+delbridge D EH L B R IH JH
+delbuono D EH L B W OW N OW
+delcambre D EH L K AA M B R IY
+delcamp D EH L K AE M P
+delcampo D EH L K AA M P OW
+delcarlo D EH L K AA R L OW
+delcastillo D EH L K AA S T IH L OW
+delchamps D EH L CH AE M P S
+delcine D EH L CH IY N IY
+delco D EH L K OW
+delconte D EH L K OW N T IY
+delcor D EH L K AO R
+delduca D EH L D UW K AH
+delebarre D EH L AH B AA R
+delectable D IH L EH K T AH B AH L
+delee D EH L IY
+deleeuw D EH L IY UW
+delegate D EH L AH G EY T
+delegate's D EH L IH G AH T S
+delegate(2) D EH L AH G AH T
+delegated D EH L AH G EY T AH D
+delegates D EH L AH G EY T S
+delegates' D EH L AH G EY T S
+delegates(2) D EH L AH G AH T S
+delegating D EH L AH G EY T IH NG
+delegation D EH L AH G EY SH AH N
+delegation's D EH L AH G EY SH AH N Z
+delegations D EH L AH G EY SH AH N Z
+delehanty D EH L IH HH AH N T IY
+delellis D EH L IH L IH S
+delellis(2) D IH L EH L IH S
+deleo D EH L IY OW
+deleon D EH L IY AH N
+deleonardis D EH L IY AH N AA R D IH S
+delete D IH L IY T
+deleted D IH L IY T AH D
+deleterious D EH L AH T IH R IY AH S
+deletes D IH L IY T S
+deleting D IH L IY T IH NG
+deletion D IH L IY SH AH N
+deletions D IH L IY SH AH N Z
+delfavero D EH L F AA V EH R OW
+delfin D EH L F IH N
+delfina D EH L F IY N AH
+delfine D EH L F IY N IY
+delfino D EH L F IY N OW
+delfosse D EH L F AH S
+delfs D EH L F S
+delft D EH L F T
+delftware D EH L F T W EH R
+delgadillo D EH L G AA D IH L OW
+delgadio D EH L G AE D Y OW
+delgadio(2) D EH L G AA D Y OW
+delgado D EH L G AA D OW
+delgaudio D EH L G AO D IY OW
+delgiorno D EH L JH AO R N OW
+delgiudice D EH L JH UW D AH S
+delgrande D EH L G R AE N D IY
+delgreco D EH L G R EH K OW
+delgrosso D EH L G R OW S OW
+delguercio D EH L G EH R CH IY OW
+delguidice D EH L G AY D IH S
+delhaize D EH L HH EY Z
+delhi D EH L IY
+delhi's D EH L IY Z
+deli D EH L IY
+delia D IY L Y AH
+delial D IH L AY EH L
+delial(2) D IY L AY EH L
+deliberate D IH L IH B ER AH T
+deliberate(2) D IH L IH B ER EY T
+deliberate(3) D IH L IH B R AH T
+deliberated D IH L IH B ER EY T IH D
+deliberately D IH L IH B ER AH T L IY
+deliberately(2) D IH L IH B R AH T L IY
+deliberates D IH L IH B ER EY T S
+deliberates(2) D IH L IH B R EY T S
+deliberating D IH L IH B ER EY T IH NG
+deliberation D IH L IH B ER EY SH AH N
+deliberations D IH L IH B ER EY SH AH N Z
+deliberative D IH L IH B ER EY T IH V
+deliberative(2) D IH L IH B R AH T IH V
+delicacies D EH L IH K AH S IY Z
+delicacy D EH L AH K AH S IY
+delicacy(2) D EH L IH K AH S IY
+delicate D EH L AH K AH T
+delicately D EH L AH K AH T L IY
+delicatessen D EH L IH K AH T EH S AH N
+delicatessens D EH L IH K AH T EH S AH N Z
+delich D EH L IH K
+delicia D EH L IY CH AH
+delicious D IH L IH SH AH S
+deliciously D IH L IH SH AH SH L IY
+delight D IH L AY T
+delighted D IH L AY T AH D
+delighted(2) D IH L AY T IH D
+delightful D IH L AY T F AH L
+delightfully D IH L AY T F AH L IY
+delighting D IH L AY T IH NG
+delights D IH L AY T S
+delila D EH L IY L AH
+delilah D AH L AY L AH
+delilah(2) D IH L AY L AH
+delillo D AH L IH L OW
+delima D EH L IY M AH
+deline D EH L IY N IY
+delineate D IH L IH N IY EY T
+delineated D IH L IH N IY EY T IH D
+delineates D IH L IH N IY EY T S
+delineating D IH L IH N IY EY T IH NG
+delineation D IH L IH N IY EY SH AH N
+delinquencies D IH L IH NG K W AH N S IY Z
+delinquency D IH L IH NG K W AH N S IY
+delinquent D IH L IH NG K W AH N T
+delinquents D IH L IH NG K W AH N T S
+delio D EY L IY OW
+delirious D IH L IH R IY AH S
+delirium D IH L IH R IY AH M
+delisa D EH L IY S AH
+delise D EH L AY Z
+delisi D EH L IY S IY
+delisio D EH L IY S IY OW
+delisle D IH L AY L
+delist D IY L IH S T
+delisted D IY L IH S T IH D
+delisting D IY L IH S T IH NG
+deliver D IH L IH V ER
+deliverable D IH L IH V ER AH B AH L
+deliverable(2) D IH L IH V R AH B AH L
+deliverance D IH L IH V ER AH N S
+deliverance(2) D IH L IH V R AH N S
+delivered D IH L IH V ER D
+deliverer D IH L IH V ER ER
+deliverers D IH L IH V ER ER Z
+deliveries D IH L IH V ER IY Z
+deliveries(2) D IH L IH V R IY Z
+delivering D IH L IH V ER IH NG
+delivers D IH L IH V ER Z
+delivery D IH L IH V ER IY
+delk D EH L K
+delker D EH L K ER
+dell D EH L
+dell'aquila D EH L AH K W IY L AH
+dell's D EH L Z
+della D EH L AH
+dellaert D EH L AA R T
+dellaert(2) D EH L ER T
+dellapenna D EH L AH P EH N AH
+dellaquila D EY L AA K W IY L AH
+dellarocco D EH L ER OW K OW
+dellavalle D EH L AH V AA L IY
+dellavecchia D EH L AH V EH K IY AH
+delle D EH L
+deller D EH L ER
+delleri D AH L EH R IY
+delligatti D EH L IY G AA T IY
+delling D EH L IH NG
+dellinger D EH L IH NG ER
+dellis D EH L IH S
+dellolio D EH L OW L IY OW
+dellums D EH L AH M Z
+delma D EH L M AH
+delman D EH L M AH N
+delmar D EH L M ER
+delmarva D EH L M AA R V AH
+delmas D EH L M AH Z
+delmastro D EH L M AE S T R OW
+delmed D EH L M EH D
+delmed's D EH L M EH D Z
+delmer D EH L M ER
+delmonaco D EH L M OW N AA K OW
+delmonico D EH L M AA N IY K OW
+delmont D EY L M OW N T
+delmonte D EH L M AA N T IY
+delmore D EH L M AO R
+delnegro D EH L N EH G R OW
+delnero D EH L N EH R OW
+delo D EH L OW
+deloach D EH L OW CH
+deloatch D EH L OW CH
+deloitte D AH L OY T
+deloney D EH L AH N IY
+delong D AH L AO NG
+delora D EH L AO R AH
+delore D AH L AO R
+delore's D AH L AO R Z
+delore's(2) D AH L AO R IY Z
+delore(2) D AH L AO R IY
+delorean D AH L AO R IY AH N
+delorenzo D EH L AO R EH N Z OW
+delorenzo(2) D EY L AO R EH N Z OW
+delores D AH L AO R IH S
+delorey D EH L ER IY
+deloria D EH L AO R IY AH
+deloris D EH L ER IH S
+delorme D EH L AO R M IY
+delors D AH L AO R Z
+delosh D EH L AH SH
+delosreyes D IH L AA S ER AY Z
+delosreyes(2) D EH L OW S R EY Z
+delosreyes(3) D EH L OW S R EY AH Z
+delossantos D EY L OW S AA N T OW Z
+delouis D EH L UW IY Z
+delozier D EH L AH Z IY ER
+delp D EH L P
+delph D EH L F
+delphax D EH L F AE K S
+delphi D EH L F AY
+delphia D EH L F IY AH
+delphian D EH L F Y AH N
+delphic D EH L F IH K
+delphina D EH L F IY N AH
+delphine D EH L F IY N IY
+delpino D EH L P IY N OW
+delpizzo D EH L P IY Z OW
+delponte D EH L P OW N T IY
+delpozo D EH L P OW Z OW
+delprete D EH L P R IY T
+delpriore D EH L P R IY AO R IY
+delray D EH L R EY
+delre D EH L R
+delreal D EH L R AH L
+delrina D EH L R IY N AH
+delrina's D EH L R IY N AH Z
+delrio D EH L R IY OW
+delrosario D EH L R OW S AA R IY OW
+delrossi D EH L R AA S IY
+delrosso D EH L R OW S OW
+delsanto D EH L S AA N T OW
+delsignore D EH L S IY G N AO R IY
+delta D EH L T AH
+delta's D EH L T AH Z
+deltacorp D EH L T AH K AO R P
+deltadromeus D EH L T AH D R OW M AH S
+deltaic D EH L T EY IH K
+deltak D EH L T AE K
+deltas D EH L T AH Z
+deltec D EH L T EH K
+deltona D EH L T OW N AH
+deltona's D EH L T OW N AH Z
+deltoro D EH L T AO R OW
+deluca D IH L UW K AH
+delucas D IH L UW K AH Z
+delucca D EH L UW K AH
+delucchi D EH L UW K IY
+deluccia D EH L UW CH AH
+delucia D EH L UW CH AH
+delude D IH L UW D
+deluded D IH L UW D IH D
+deludes D IH L UW D Z
+deluding D IH L UW D IH NG
+deluge D EH L Y UW JH
+deluged D EH L Y UW JH D
+deluise D EH L UW S IY
+deluna D EH L UW N AH
+delusion D IH L UW ZH AH N
+delusional D IH L UW ZH AH N AH L
+delusions D IH L UW ZH AH N Z
+deluxe D AH L AH K S
+delvalle D EH L V AE L IY
+delvalle's D EH L V AE L IY Z
+delve D EH L V
+delvecchio D EH L V EH K IY OW
+delved D EH L V D
+delves D EH L V Z
+delvin D EH L V IH N
+delving D EH L V IH NG
+delwin D EH L W IH N
+delwip D EH L W IH P
+delwyn D EH L W IH N
+delzell D EH L Z AH L
+delzer D EH L Z ER
+demaggio D IH M AA JH IY OW
+demagogic D EH M AH G AA JH IH K
+demagogue D EH M AH G AA G
+demagoguery D EH M AH G AA G ER IY
+demagogues D EH M AH G AA G Z
+demagoguing D EH M AH G AA G IH NG
+demagogy D EH M AH G AA JH IY
+demain D IH M EY N
+demaio D IH M AA IY OW
+demaio(2) D IH M AA OW
+deman D IY M AH N
+demand D IH M AE N D
+demanded D IH M AE N D AH D
+demanded(2) D IH M AE N D IH D
+demanding D IH M AE N D IH NG
+demandingly D IH M AE N D IH NG L IY
+demands D IH M AE N D Z
+demar D IH M AA R
+demarais D EH M ER EY
+demaray D EH M ER EY
+demarcation D IY M AA R K EY SH AH N
+demarcations D IY M AA R K EY SH AH N Z
+demarche D IH M AA R CH
+demarche(2) D IY M AA R CH
+demarchi D IH M AA R K IY
+demarco D IH M AA R K OW
+demarcus D EH M AA R K IH S
+demaree D EH M ER IY
+demarest D EY M AA R EY IH S T
+demarest(2) D EH M ER IH S T
+demaria D IH M AA R IY AH
+demarinis D EH M ER IH N IH S
+demarino D IH M AA R IY N OW
+demario D IH M AA R IY OW
+demaris D EH M ER IH S
+demark D AH M AA R K
+demars D EH M ER Z
+demarsh D EH M AA R SH
+demartin D IH M AA R T IH N
+demartini D IH M AA R T IY N IY
+demartino D IH M AA R T IY N OW
+demary D EH M EH R IY
+demarzo D IH M AA R Z OW
+demas D IY M AH S
+demasi D IH M AA S IY
+demasters D IY M AE S T ER Z
+dematteis D EH M AH T AY Z
+dematteo D IH M AA T IY OW
+demattia D IH M AA SH AH
+demauro D IH M AO R OW
+demay D EH M EY
+demayo D EY M EY OW
+dembeck D EH M B EH K
+dembinski D IH M B IH N S K IY
+dembowski D IH M B AO F S K IY
+dembski D EH M S K IY
+demby D EH M B IY
+demchak D EH M CH AH K
+demean D IH M IY N
+demeaned D IH M IY N D
+demeaning D IH M IY N IH NG
+demeanor D IH M IY N ER
+demeanors D IH M IY N ER Z
+demeans D IH M IY N Z
+demel D EH M AH L
+demello D IH M EH L OW
+demelo D IH M EH L OW
+dement D AH M EH N T
+demented D IH M EH N T IH D
+dementia D IH M EH N SH IY AH
+demeo D IY M IY OW
+demeree D EH M ER IY
+demerger D IY M ER JH ER
+demerist D IH M ER IH S T
+demerist's D IH M ER IH S T S
+demerist's(2) D IH M ER IH S S
+demerist's(3) D IH M ER IH S
+demerist(2) D EH M ER IH S T
+demerit D IY M EH R AH T
+demerits D IY M EH R AH T S
+demeritt D EH M ER IH T
+demers D IY M ER Z
+demerse D EH M ER S
+demery D IH M ER IY
+demeter D IH M IY T ER
+demetre D EH M IY T ER
+demetria D IH M EH T R IY AH
+demetrio D IH M EH T R IY OW
+demetriou D IH M EH T R IY UW
+demetrius D IH M IY T R IY AH S
+demeyer D EH M AY ER
+demi D EH M IY
+demi's D EH M IY Z
+demicco D IH M IY K OW
+demichael D EH M IH K EH L
+demichele D EH M IH K AH L
+demick D EH M IH K
+demilio D IH M IY L IY OW
+demilitarization D IY M IH L AH T ER AH Z EY SH AH N
+demilitarize D IY M IH L AH T ER AY Z
+demilitarized D IY M IH L AH T ER AY Z D
+demilitarizes D IY M IH L AH T ER AY Z IH Z
+demilitarizing D IY M IH L AH T ER AY Z IH NG
+demille D IH M IY L IY
+demille(2) D IH M IH L
+demilo D IH M IH L OW
+demilo(2) D IH M AY L OW
+deming D EH M IH NG
+demint D EY M IY N T
+demirag D EY M IH R AA JH
+demirel D AH M IH R AH L
+demirjian D IH M ER JH IY AH N
+demisch D AH M IH SH
+demise D IH M AY Z
+demish D EH M IH SH
+demjanjuk D EH M Y AA N Y UW K
+demjanjuk's D EH M Y AA N Y UW K S
+demjanjuk's(2) D EH M Y AE N Y UW K S
+demjanjuk(2) D EH M Y AE N Y UW K
+demko D EH M K OW
+demler D EH M L ER
+demma D IY M AH
+demme D EH M
+demmer D EH M ER
+demming D EH M IH NG
+demmon D EH M AH N
+demmons D EH M AH N Z
+demo D EH M OW
+demobilization D IY M OW B AH L AY Z EY SH AH N
+demobilization(2) D IY M OW B AH L AH Z EY SH AH N
+demobilize D IH M OW B AH L AY Z
+demobilized D IH M OW B AH L AY Z D
+demobilizes D IH M OW B AH L AY Z IH Z
+demobilizing D IH M OW B AH L AY Z IH NG
+democracies D IH M AA K R AH S IY Z
+democracy D IH M AA K R AH S IY
+democracy's D IH M AA K R AH S IY Z
+democrat D EH M AH K R AE T
+democrat's D EH M AH K R AE T S
+democratic D EH M AH K R AE T IH K
+democratic's D EH M AH K R AE T IH K S
+democratica D EH M AH K R AE T IH K AH
+democratically D EH M AH K R AE T IH K L IY
+democratics D EH M AH K R AE T IH K S
+democratization D IH M AA K R AH T AH Z EY SH AH N
+democratize D IH M AA K R AH T AY Z
+democratized D IH M AA K R AH T AY Z D
+democratizes D IH M AA K R AH T AY Z IH Z
+democratizing D IH M AA K R AH T AY Z IH NG
+democrats D EH M AH K R AE T S
+democrats' D EH M AH K R AE T S
+demodulate D IY M AA JH AH L EY T
+demodulated D IY M AA JH AH L EY T AH D
+demodulates D IY M AA JH AH L EY T S
+demodulation D IY M AA JH AH L EY SH AH N
+demographer D IH M AA G R AH F ER
+demographers D IH M AA G R AH F ER Z
+demographic D EH M AH G R AE F IH K
+demographically D EH M AH G R AE F IH K L IY
+demographics D EH M AH G R AE F IH K S
+demography D IH M AA G R AH F IY
+demolish D IH M AA L IH SH
+demolished D IH M AA L IH SH T
+demolishes D IH M AA L IH SH AH Z
+demolishing D IH M AA L IH SH IH NG
+demolition D EH M AH L IH SH AH N
+demon D IY M AH N
+demond D AH M AA N D
+demonic D IH M AA N IH K
+demonization D IY M AH N AH Z EY SH AH N
+demonize D IY M AH N AY Z
+demonized D IY M AH N AY Z D
+demonizer D IY M AH N AY Z ER
+demonizez D IY M AH N AY Z IH Z
+demonizing D IY M AH N AY Z IH NG
+demons D IY M AH N Z
+demonstrable D EH M AH N S T R AH B AH L
+demonstrably D IH M AA N S T R AH B L IY
+demonstrate D EH M AH N S T R EY T
+demonstrated D EH M AH N S T R EY T AH D
+demonstrated(2) D EH M AH N S T R EY T IH D
+demonstrates D EH M AH N S T R EY T S
+demonstrating D EH M AH N S T R EY T IH NG
+demonstration D EH M AH N S T R EY SH AH N
+demonstrations D EH M AH N S T R EY SH AH N Z
+demonstrative D IH M AA N S T R AH T IH V
+demonstrator D EH M AH N S T R EY T ER
+demonstrators D EH M AH N S T R EY T ER Z
+demont D EH M AH N T
+demonte D AH M AA N T IY
+demopoulos D AH M AA P AH L IH S
+demoralization D IH M AO R AH L IH Z EY SH AH N
+demoralize D IH M AO R AH L AY Z
+demoralized D IH M AO R AH L AY Z D
+demoralizing D IH M AO R AH L AY Z IH NG
+demore D EH M AO R
+demorest D EY M AO R IH S T
+demory D IH M ER IY
+demory's D IH M ER IY Z
+demos D EH M OW Z
+demoss D AH M AA S
+demote D IH M OW T
+demoted D IH M OW T IH D
+demotion D IH M OW SH AH N
+demotions D IH M OW SH AH N Z
+demott D AH M AA T
+demoulin D EH M UW L AE N
+demov D EH M AA V
+dempewolf D EH M P Y UW UH L F
+demps D EH M P S
+dempsey D EH M P S IY
+dempster D EH M P S T ER
+demski D EH M S K IY
+demsky D EH M S K IY
+demur D IH M ER
+demure D IH M Y UH R
+demurely D IH M Y UH R L IY
+demuro D IH M UH R OW
+demurred D IH M ER D
+demurring D IH M ER IH NG
+demurs D IH M ER Z
+demus D IY M AH S
+demuth D IY M AH TH
+demyan D EH M Y AH N
+demystify D IY M IH S T AH F AY
+den D EH N
+dena D IY N AH
+denapoli D IH N AA P AH L IY
+denard D IH N AA R D
+denardo D IH N AA R D OW
+denarii D IH N AE R IY
+denarius D IH N AE R IY AH S
+denaro D IH N AA R OW
+denatale D IH N AA T AA L IY
+denationalization D IY N AE SH AH N AH L IH Z EY SH AH N
+denationalizations D IY N AE SH AH N AH L IH Z EY SH AH N Z
+denationalize D IH N AE SH AH N AH L AY Z
+denationalized D IH N AE SH AH N AH L AY Z D
+denationalizing D IH N AE SH AH N AH L AY Z IH NG
+denature D IH N EY CH ER
+denatured D IH N EY CH ER D
+denault D IH N OW
+denbo D IY N B OW
+denboer D EH N B OW ER
+denbow D EH N B OW
+denby D EH N B IY
+denden D EH N D AH N
+dendinger D IY N D IH NG ER
+dendritic D EH N D R IH T IH K
+dendrochronology D EH N D R OW K R AH N AA L AH JH IY
+dendy D EH N D IY
+deneau D IH N OW
+deneault D IH N OW
+deneen D IH N IY N
+deneke D EH N IH K
+deneke(2) D EH N IH K AH
+denenberg D EH N AH N B ER G
+denes D IY N Z
+deneuve D IH N AH V
+deneuve(2) D IY N AH V
+deneve D EH N IH V
+deng D EH NG
+deng's D EH NG Z
+dengel D EH NG G AH L
+dengler D IH NG AH L ER
+dengler(2) D IH NG L ER
+dengue D EH N G
+denham D EH N AH M
+denhart D EH N HH AA R T
+denhartog D EH N HH AA R T AH G
+denherder D EH N HH ER D ER
+denholm D EH N HH OW L M
+deniability D IH N AY AH B IH L IH T IY
+denial D IH N AY AH L
+denials D IH N AY AH L Z
+denice D IH N IY S
+denicola D IH N IY K OW L AH
+denied D IH N AY D
+denies D IH N AY Z
+denigrate D EH N AH G R EY T
+denigrated D EH N IH G R EY T IH D
+denigrating D EH N IH G R EY T IH NG
+denigris D EH N IH G R IH S
+denike D EH N IH K
+denim D EH N AH M
+denio D IY N IY OW
+deniro D IH N IH R OW
+deniro's D IH N IH R OW Z
+denis D EH N IH S
+denise D IH N IY S
+denison D EH N IH S AH N
+denison's D EH N IH S AH N Z
+deniston D EH N IH S T AA N
+deniz D EY N IY Z
+denizen D EH N AH Z AH N
+denizens D EH N AH Z AH N Z
+denk D EH NG K
+denker D EH NG K ER
+denki D EH NG K IY
+denkins D EH NG K IH N Z
+denko D EH NG K OW
+denktas D EH NG K T AH S
+denlea D EH N L IY
+denley D EH N L IY
+denlinger D EH N AH L IH NG ER
+denlinger(2) D EH N L IH NG ER
+denlinger(3) D EH N L IH N JH ER
+denman D EH N M AH N
+denmark D EH N M AA R K
+denmark's D EH N M AA R K S
+denmon D EH N M AH N
+denn D EH N
+dennard D IH N AA R D
+denne D EH N
+dennehy D EH N IH HH IY
+dennen D EH N AH N
+denner D EH N ER
+dennett D EH N IH T
+denney D EH N IY
+dennie D EH N IY
+dennin D EH N IH N
+denning D EH N IH NG
+denninger D EH N IH NG ER
+dennington D EH N IH NG T AH N
+dennis D EH N IH S
+dennison D EH N IH S AH N
+denniston D EH N IH S T AA N
+denno D EH N OW
+denny D EH N IY
+denny's D EH N IY Z
+deno D IY N OW
+denoble D EH N OW B AH L
+denominate D IH N AA M AH N EY T
+denominated D IH N AA M AH N EY T IH D
+denomination D IH N AO M AH N EY SH AH N
+denomination's D IH N AO M AH N EY SH AH N Z
+denominational D IH N AO M AH N EY SH AH N AH L
+denominations D IH N AO M AH N EY SH AH N Z
+denominator D IH N AA M AH N EY T ER
+denomme D EH N AH M
+denosse D IH N OW S
+denosse(2) D IH N AO S IY
+denote D IH N OW T
+denoted D IH N OW T AH D
+denotes D IH N OW T S
+denoting D IH N OW T IH NG
+denouement D EY N UW M AA N
+denounce D IH N AW N S
+denounced D IH N AW N S T
+denounces D IH N AW N S IH Z
+denouncing D IH N AW N S IH NG
+denoyer D EH N OY ER
+dens D EH N Z
+densch D EH N SH
+dense D EH N S
+densely D EH N S L IY
+denser D EH N S ER
+densest D EH N S AH S T
+denshin D EH N SH IH N
+densities D EH N S AH T IY Z
+densitometer D EH N S AH T AA M AH T ER
+density D EH N S AH T IY
+density(2) D EH N S IH T IY
+densley D EH N S L IY
+denslow D EH N S L OW
+densmore D IY N S M AO R
+densmore(2) D EH N S M AO R
+denson D EH N S AH N
+dent D EH N T
+dental D EH N T AH L
+dental(2) D EH N AH L
+dentals D EH N T AH L Z
+dentals(2) D EH N AH L Z
+dente D EH N T
+dented D EH N T IH D
+dentin D EH N T AH N
+dentine D EH N T IY N
+denting D EH N T IH NG
+dentino D IH N T IY N OW
+dentist D EH N T AH S T
+dentist's D EH N T IH S T S
+dentist's(2) D EH N IH S S
+dentist's(3) D EH N IH S
+dentist(2) D EH N T IH S T
+dentist(3) D EH N IH S T
+dentistry D EH N T AH S T R IY
+dentistry(2) D EH N T IH S T R IY
+dentistry(3) D EH N IH S T R IY
+dentists D EH N T AH S T S
+dentists' D EH N T IH S T S
+dentists'(2) D EH N IH S T S
+dentists(2) D EH N T IH S T S
+dentists(3) D EH N IH S S
+dentists(4) D EH N IH S
+dentition D EH N T IH SH AH N
+dentler D EH N T L ER
+denton D EH N T AH N
+dentremont D EY N T R EY M AA N T
+dents D EH N T S
+dentsu D EH N T S UW
+dentton D EH N T AH N
+denture D EH N CH ER
+dentures D EH N CH ER Z
+dentzer D EH N T Z ER
+denucci D IH N UW CH IY
+denuclearization D IY N UW K L IY ER AH Z EY SH AH N
+denuclearized D IH N UW K L IY ER AY Z D
+denuclearized(2) D IY N UW K L IY ER AY Z D
+denude D IH N UW D
+denuded D IH N UW D IH D
+denuding D IH N UW D IH NG
+denunciation D IH N AH N S IY EY SH AH N
+denunciations D IH N AH N S IY EY SH AH N Z
+denunzio D AH N AH N Z IY OW
+denver D EH N V ER
+denver's D EH N V ER Z
+denwa D EH N W AA
+deny D IH N AY
+denying D IH N AY IH NG
+denys D EH N IH S
+denyse D EH N AY S
+denz D EH N Z
+denzel D EH N Z AH L
+denzer D EH N Z ER
+denzil D EH N Z AH L
+denzler D EH N Z L ER
+deo D IY OW
+deodorant D IY OW D ER AH N T
+deodorants D IY OW D ER AH N T S
+deoliveira D IY AA L IH V EY R AH
+deon D IY AA N
+deontological D IY AA N T AH L AA JH AH K AH L
+deontology D IY AA N T AA L AH JH IY
+deorbit D IY AO R B IH T
+deoxyribonucleic D IY AA K S IY R AY B OW N UW K L EY IH K
+dep D EH P
+depace D IH P AA CH IY
+depalma D IH P AA L M AH
+depalma's D IH P AA L M AH Z
+depalo D IH P AA L OW
+depaola D IH P AW L AH
+depaoli D IH P AW L IY
+depaolis D EH P AW L IH S
+depaolo D IH P AW L OW
+depardieu D IY P AA R D Y AH
+depardieu(2) D IY P AA R D UW
+depart D IH P AA R T
+departed D IH P AA R T AH D
+departed(2) D IH P AA R T IH D
+departing D IH P AA R T IH NG
+department D IH P AA R T M AH N T
+department's D IH P AA R T M AH N T S
+departmental D IH P AA R T M EH N AH L
+departmental(2) D IH P AA R T M EH N T AH L
+departmentalize D IH P AA R T M EH N T AH L AY Z
+departmentalize(2) D IH P AA R T M EH N AH L AY Z
+departmentalized D IH P AA R T M EH N T AH L AY Z D
+departmentalized(2) D IH P AA R T M EH N AH L AY Z D
+departmentalizes D IH P AA R T M EH N T AH L AY Z IH Z
+departmentalizing D IH P AA R T M EH N T AH L AY Z IH NG
+departments D IH P AA R T M AH N T S
+departs D IH P AA R T S
+departure D IH P AA R CH ER
+departures D IH P AA R CH ER Z
+depascale D IH P AA S K AA L IY
+depasquale D IH P AA S K W AA L IY
+depass D IH P AE S
+depaul D IH P AO L
+depaula D IH P AO L AH
+depaulo D IH P AO L OW
+depauw D AH P AW
+depaz D AH P AE Z
+depend D IH P EH N D
+dependability D IH P EH N D AH B IH L IH T IY
+dependable D IH P EH N D AH B AH L
+depended D IH P EH N D AH D
+depended(2) D IH P EH N D IH D
+dependence D IH P EH N D AH N S
+dependencies D IH P EH N D AH N S IY Z
+dependency D IH P EH N D AH N S IY
+dependent D IH P EH N D AH N T
+dependents D IH P EH N D AH N T S
+depending D IH P EH N D IH NG
+depends D IH P EH N D Z
+depersonalize D IY P ER S AH N AH L AY Z
+depersonalize(2) D IY P ER S N AH L AY Z
+depetro D IH P EH T R OW
+depew D AH P Y UW
+dephillips D EH F IH L IH P S
+dephillips(2) D IH F IH L IH P S
+depict D IH P IH K T
+depicted D IH P IH K T AH D
+depicted(2) D IH P IH K T IH D
+depicting D IH P IH K T IH NG
+depiction D IH P IH K SH AH N
+depictions D IH P IH K SH AH N Z
+depicts D IH P IH K T S
+depicts(2) D IH P IH K S
+depietro D IH P IY T R OW
+depilatory D IH P IH L AH T AO R IY
+depina D IH P IY N AH
+depinto D IH P IY N T OW
+deplete D IH P L IY T
+depleted D IH P L IY T IH D
+depleter D IH P L IY T ER
+depleters D IH P L IY T ER Z
+depletes D IH P L IY T S
+depleting D IH P L IY T IH NG
+depletion D IH P L IY SH AH N
+deplorable D IH P L AO R AH B AH L
+deplore D IH P L AO R
+deplored D IH P L AO R D
+deplores D IH P L AO R Z
+deploring D IH P L AO R IH NG
+deploy D IH P L OY
+deployable D IH P L OY AH B AH L
+deployed D IH P L OY D
+deploying D IH P L OY IH NG
+deployment D IH P L OY M AH N T
+deployments D IH P L OY M AH N T S
+deploys D IH P L OY Z
+depner D EH P N ER
+depo D IY P OW
+depo(2) D EH P OW
+depolo D IH P OW L OW
+deponte D IH P OW N T IY
+depopulate D IY P AA P Y AH L EY T
+depopulation D IH P AA P Y AH L EY SH AH
+depopulation(2) D IY P AA P Y AH L EY SH AH
+deport D IH P AO R T
+deportation D IY P AO R T EY SH AH N
+deportations D IY P AO R T EY SH AH N Z
+deported D IH P AO R T AH D
+deportee D IY P AO R T IY
+deportees D IY P AO R T IY Z
+deporting D IH P AO R T IH NG
+deportment D AH P AO R T M AH N T
+depose D IH P OW Z
+deposed D IH P OW Z D
+deposi D AH P OW Z IY
+deposit D AH P AA Z IH T
+deposit(2) D IH P AA Z AH T
+depositary D AH P AA Z IH T EH R IY
+depositary(2) D IH P AA Z IH T EH R IY
+deposited D AH P AA Z IH T IH D
+deposited(2) D IH P AA Z AH T AH D
+depositing D AH P AA Z IH T IH NG
+deposition D EH P AH Z IH SH AH N
+depositional D EH P AH Z IH SH AH N AH L
+depositions D EH P AH Z IH SH AH N Z
+depositor D AH P AA Z IH T ER
+depositor's D AH P AA Z IH T ER Z
+depositors D AH P AA Z IH T ER Z
+depositors' D IH P AA Z IH T ER Z
+depository D IH P AA Z AH T AO R IY
+deposits D AH P AA Z IH T S
+deposits(2) D IH P AA Z AH T S
+depot D IY P OW
+depot's D IY P OW Z
+depots D IY P OW Z
+depoy D EH P OY
+depp D EH P
+deppe D EH P
+deppen D EH P AH N
+depravation D EH P R AH V EY SH AH N
+deprave D IY P R EY V
+depraved D IY P R EY V D
+depravity D IH P R AE V AH T IY
+deprecate D EH P R AH K EY T
+deprecated D EH P R AH K EY T AH D
+deprecates D EH P R AH K EY T S
+deprecating D EH P R AH K EY T IH NG
+depreciable D IH P R IH SH AH B AH L
+depreciate D IH P R IY SH IY EY T
+depreciated D IH P R IY SH IY EY T IH D
+depreciates D IH P R IY SH IY EY T S
+depreciating D IH P R IY SH IY EY T IH NG
+depreciation D IH P R IY SH IY EY SH AH N
+depreciations D IH P R IY SH IY EY SH AH N Z
+depredation D EH P R AH D EY SH AH N
+depredations D EH P R AH D EY SH AH N Z
+depree D IH P R IY
+deprenyl D EH P R AH N IH L
+depress D IH P R EH S
+depressant D IH P R EH S AH N T
+depressants D IH P R EH S AH N T S
+depressed D IH P R EH S T
+depresses D IH P R EH S AH Z
+depresses(2) D IH P R EH S IH Z
+depressing D IH P R EH S IH NG
+depressingly D IH P R EH S IH NG L IY
+depression D IH P R EH SH AH N
+depressions D IH P R EH SH AH N Z
+depressive D IH P R EH S IH V
+depressurize D IH P R EH SH ER AY Z
+depressurized D IH P R EH SH ER AY Z D
+depressurizes D IH P R EH SH ER AY Z IH Z
+depressurizing D IH P R EH SH ER AY Z IH NG
+deprey D EH P R IY
+deprez D EY P R EH Z
+depriest D EH P ER IY IH S T
+depriest(2) D IH P R IY S T
+deprivation D EH P R AH V EY SH AH N
+deprivations D EH P R AH V EY SH AH N Z
+deprive D IH P R AY V
+deprived D IH P R AY V D
+deprives D IH P R AY V Z
+depriving D IH P R AY V IH NG
+deprogram D IY P R OW G R AE M
+deprogramming D IY P R OW G R AE M IH NG
+depth D EH P TH
+depths D EH P TH S
+deptula D IH P T UW L AH
+depue D AH P Y UW
+deputies D EH P Y AH T IY Z
+deputies(2) D EH P Y UW T IY Z
+deputize D EH P Y AH T AY Z
+deputized D EH P Y AH T AY Z D
+deputy D EH P Y AH T IY
+deputy(2) D EH P Y UW T IY
+depuy D IH P W IY
+dequeker D IH K W EH K ER
+der D ER
+derail D IH R EY L
+derailed D IH R EY L D
+derailing D IH R EY L IH NG
+derailment D IH R EY L M AH N T
+derailments D IH R EY L M AH N T S
+derails D IH R EY L Z
+deramo D IH R AA M OW
+deramus D EH R AH M IH S
+derange D IH R EY N JH
+deranged D IH R EY N JH D
+derasmo D IH R AA S M OW
+derby D ER B IY
+derbyshire D ER B IY SH ER
+derchin D ER CH IH N
+dercole D IH R K OW L IY
+derden D ER D AH N
+derderian D ER D IH R IY AH N
+derecktor D ER EH K T ER
+deregt D ER EH K T
+deregulate D IY R EH G Y AH L EY T
+deregulated D IY R EH G Y AH L EY T IH D
+deregulating D IY R EH G Y AH L EY T IH NG
+deregulation D IY R EH G Y AH L EY SH AH N
+deregulator D IY R EH G Y AH L EY T ER
+deregulators D IY R EH G Y AH L EY T ER Z
+deregulatory D IY R EH G Y AH L AH T AO R IY
+derek D EH R IH K
+derelict D EH R AH L IH K T
+dereliction D EH R AH L IH K SH AH N
+derelicts D EH R AH L IH K T S
+derelicts(2) D EH R AH L IH K S
+deremer D EH R IY M ER
+deren D IH R AH N
+derenzo D IH R EH N Z OW
+derflinger D ER F AH L IH NG ER
+derflinger(2) D ER F L IH NG ER
+derham D ER HH AH M
+derhammer D ER HH AH M ER
+derick D EH R IH K
+derickson D EH R IH K S AH N
+derida D AH R IY D AH
+deridder D EH R IH D ER
+deride D IH R AY D
+derided D IH R AY D IH D
+derides D IH R AY D Z
+deriding D IH R AY D IH NG
+derienzo D IH R IY N Z OW
+derik D EH R IH K
+dering D IH R IH NG
+deringer D EH R IH N JH ER
+derington D ER IH NG T AH N
+derise D EH R AY Z
+derision D ER IH ZH AH N
+derisive D ER IH S IH V
+derisive(2) D ER AY S IH V
+derisively D ER IH S IH V L IY
+derisively(2) D ER AY S IH V L IY
+deriso D IH R IY S OW
+derivation D EH R AH V EY SH AH N
+derivative D ER IH V AH T IH V
+derivative(2) D ER IH V IH T IH V
+derivatives D ER IH V AH T IH V Z
+derive D ER AY V
+derived D ER AY V D
+derives D ER AY V Z
+derives(2) D IH R AY V Z
+deriving D ER AY V IH NG
+derk D ER K
+derks D ER K S
+derksen D ER K S AH N
+derleth D ER L IH TH
+derma D ER M AH
+dermagraph D ER M AH G R AE F
+dermal D ER M AH L
+derman D ER M AH N
+dermatological D ER M AH T AH L AA JH IH K AH L
+dermatologist D ER M AH T AA L AH JH IH S T
+dermatologists D ER M AH T AA L AH JH IH S T S
+dermatologists(2) D ER M AH T AA L AH JH IH S S
+dermatologists(3) D ER M AH T AA L AH JH IH S
+dermatology D ER M AH T AA L AH JH IY
+dermer D ER M ER
+dermis D ER M AH S
+dermody D ER M AH D IY
+dermot D ER M AH T
+dermott D ER M AH T
+dern D ER N
+derner D ER N ER
+derobertis D EH R AH B ER T IH S
+derocco D IH R OW K OW
+deroche D EH R AH K
+derocher D EH R AH K ER
+derogatory D ER AA G AH T AO R IY
+deroo D EH R UW
+deroos D IH R UW Z
+derosa D IH R OW S AH
+derose D EH R AH S
+derosia D IH R OW S IY AH
+derosier D EH R AH S IY ER
+derossett D EH R AH S EH T
+derouen D ER W EH N
+derouin D ER W IY N
+derousse D ER UW S
+deroy D IH R OY
+derr D EH R
+derrick D EH R IH K
+derrickson D EH R IH K S AH N
+derrico D IH R IY K OW
+derrig D EH R IH G
+derring D EH R IH NG
+derringer D EH R AH N JH ER
+derrington D EH R IH NG T AH N
+derrow D EH R OW
+derry D EH R IY
+derryberry D EH R IY B EH R IY
+dersch D ER SH
+dershem D ER SH IH M
+dershowitz D ER SH AH W IH T S
+dershowitz's D ER SH AH W IH T S IH Z
+derstine D ER S T IY N
+derthick D ER TH IH K
+derubeis D EH R AH B AY Z
+deruiter D IH R IH T ER
+deruko D IH R UW K OW
+derus D EH R IH S
+derusha D EH R AH SH AH
+deruyter D IH R AY T ER
+dervin D ER V IH N
+dervish D ER V IH SH
+dervishich D ER V IH SH IH K
+derward D ER W ER D
+derwin D ER W IH N
+derwinski D ER W IH N S K IY
+dery D EH R IY
+deryck D EH R IH K
+deryle D EH R AH L
+des D EH
+des(2) D IH
+desai D EY S AA IY
+desalination D IY S EY L IH N EY SH AH N
+desalinization D IY S EY L IH N AH Z EY SH AH N
+desalvo D IH S AA L V OW
+desanctis D EH S AE NG K T IH S
+desanti D IH S AA N T IY
+desantiago D IH S AA N T IY AA G OW
+desantis D EY S AA N T IH S
+desanto D IH S AA N T OW
+desantos D EY S AA N T OW Z
+desaulniers D EH S OW L N IY ER Z
+desautel D EH S OW T AH L
+desautels D EH S OW T AH L Z
+descarpentries D EY K AA R P AH N T R IY Z
+descartes D EY K AA R T
+descartes's D EY K AA R T S
+descend D IH S EH N D
+descendant D IH S EH N D AH N T
+descendants D IH S EH N D AH N T S
+descendants(2) D IH S EH N IH N T S
+descended D IH S EH N D AH D
+descended(2) D IH S EH N D IH D
+descendent D IH S EH N D AH N T
+descendents D IH S EH N D AH N T S
+descending D IH S EH N D IH NG
+descends D IH S EH N D Z
+descent D IH S EH N T
+descents D IH S EH N T S
+descenza D EH SH EH N Z AH
+desch D EH SH
+deschaine D IH S K EY N
+deschamps D EH SH AH M P S
+deschene D EH SH IY N
+deschenes D EH SH IY N Z
+deschepper D EH SH IH P ER
+deschler D EH SH AH L ER
+deschler(2) D EH SH L ER
+deschner D EH SH N ER
+descoteaux D EH S K AH T OW
+describable D IH S K R AY B AH B AH L
+describe D IH S K R AY B
+described D IH S K R AY B D
+describes D IH S K R AY B Z
+describing D IH S K R AY B IH NG
+description D IH S K R IH P SH AH N
+descriptions D IH S K R IH P SH AH N Z
+descriptive D IH S K R IH P T IH V
+desecrate D EH Z AH K R EY T
+desecrate(2) D EH S AH K R EY T
+desecrated D EH Z AH K R EY T IH D
+desecrated(2) D EH S AH K R EY T IH D
+desecrates D EH Z AH K R EY T S
+desecrates(2) D EH S AH K R EY T S
+desecration D EH S AH K R EY SH AH N
+desecration(2) D EH Z AH K R EY SH AH N
+desecrations D EH S AH K R EY SH AH N Z
+desecrations(2) D EH Z AH K R EY SH AH N Z
+desegregate D IH S EH G R AH G EY T
+desegregated D IH S EH G R IH G EY T IH D
+desegregation D IH S EH G R AH G EY SH AH N
+desegregation(2) D IY S EH G R AH G EY SH AH N
+desena D IH S EH N AH
+desensitize D IH S EH N S AH T AY Z
+desensitized D IH S EH N S AH T AY Z D
+desensitizing D IH S EH N S AH T AY Z IH NG
+deseret D EH S ER EH T
+deseret(2) D EH Z ER EY
+desert D EH Z ER T
+desert(2) D IH Z ER T
+deserted D IH Z ER T IH D
+deserter D EH Z ER T ER
+deserters D EH Z ER T ER Z
+deserting D EH Z ER T IH NG
+desertion D IH Z ER SH AH N
+desertions D IH Z ER SH AH N Z
+deserts D EH Z ER T S
+deserts(2) D IH Z ER T S
+deserve D IH Z ER V
+deserved D IH Z ER V D
+deservedly D IH Z ER V AH D L IY
+deserves D IH Z ER V Z
+deserving D IH Z ER V IH NG
+desha D EH SH AH
+deshaies D IH SH EY Z
+deshane D EH SH AH N
+deshaw D EH SH AO
+deshazer D EH SH AH Z ER
+deshazo D EY SH AA Z OW
+deshields D EH SH IY L D Z
+deshler D EH SH L ER
+deshon D EH SH AH N
+deshong D EH SH AO NG
+deshotel D EH SH AH T AH L
+deshotels D EH SH AH T AH L Z
+desi D EH Z IY
+desiccate D EH S AH K EY T
+desiccated D EH S AH K EY T AH D
+desiccates D EH S AH K EY T S
+desiccation D EH S AH K EY SH AH N
+desiderata D EY Z IH D ER AA T AH
+desiderio D IH S IY D EH R IY OW
+design D IH Z AY N
+designate D EH Z AH G N EY T
+designate(2) D EH Z IH G N EY T
+designated D EH Z IH G N EY T IH D
+designates D EH Z IH G N EY T S
+designating D EH Z IH G N EY T IH NG
+designation D EH Z AH G N EY SH AH N
+designation(2) D EH Z IH G N EY SH AH N
+designations D EH Z AH G N EY SH AH N Z
+designcraft D IH Z AY N K R AE F T
+designed D IH Z AY N D
+designee D EH Z IH G N IY
+designees D EH Z IH G N IY Z
+designer D IH Z AY N ER
+designer's D IH Z AY N ER Z
+designers D IH Z AY N ER Z
+designers' D IH Z AY N ER Z
+designing D IH Z AY N IH NG
+designor D IH S IH G N ER
+designs D IH Z AY N Z
+desilets D EH S IH L IH T S
+desillers D IH S IH L ER Z
+desilva D IH S IY L V AH
+desimone D IH S IY M OW N IY
+desio D IY S IY OW
+desir D IH S IH R
+desirability D IH Z AY R AH B IH L IH T IY
+desirable D IH Z AY R AH B AH L
+desirable(2) D IH Z AY ER AH B AH L
+desire D IH Z AY ER
+desired D IH Z AY ER D
+desiree D EH S AY R IY
+desires D IH Z AY ER Z
+desiring D IH Z AY ER IH NG
+desirous D IH Z AY R AH S
+desist D IH S IH S T
+desist(2) D IH Z IH S T
+desisto D IH S IY S T OW
+desjardin D EH S ZH AA R D AE N
+desjardins D EH S ZH AA R D IH N Z
+desjarlais D EH S ZH AA R L EY
+desk D EH S K
+deskin D EH S K IH N
+deskins D EH S K IH N Z
+deskjet D EH S K JH EH T
+deskpro D EH S K P R OW
+desks D EH S K S
+desktop D EH S K T AA P
+desktops D EH S K T AA P S
+deslatte D IH S L AE T
+deslauriers D EH S L AO R IY ER Z
+desma D IY S M AH
+desma(2) D EH Z M AH
+desman D EH Z M AH N
+desmarais D EH Z M ER EY
+desmet D EH S M IH T
+desmids D EH S M AH D Z
+desmith D EH S M IH TH
+desmona D IH S M OW N AH
+desmond D EH Z M AH N D
+desnoyers D EH S N OY ER Z
+desolate D EH S AH L AH T
+desolate(2) D EH Z AH L AH T
+desolate(3) D EH S AH L EY T
+desolation D EH S AH L EY SH AH N
+desormeaux D EH S ER M OW
+desoto D IH S OW T OW
+desousa D IH S AW S AH
+desousa(2) D IH S UW S AH
+desouza D EY S UW Z AH
+despain D IH S P EY N
+despair D IH S P EH R
+despaired D IH S P EH R D
+despairing D IH S P EH R IH NG
+despairs D IH S P EH R Z
+desper D EH S P ER
+desperado D EH S P ER AA D OW
+desperadoes D EH S P ER AA D OW Z
+desperate D EH S P R IH T
+desperate(2) D EH S P ER IH T
+desperately D EH S P ER AH T L IY
+desperately(2) D EH S P R AH T L IY
+desperation D EH S P ER EY SH AH N
+desperation(2) D EH S P ER EY SH IH N
+despicable D IH S P IH K AH B AH L
+despina's D EH S P IY N AH Z
+despise D IH S P AY Z
+despised D IH S P AY Z D
+despises D IH S P AY Z IH Z
+despising D IH S P AY Z IH NG
+despite D IH S P AY T
+despondency D IH S P AA N D AH N S IY
+despondent D IH S P AA N D AH N T
+desposito D IH S P OW S IY T OW
+despot D EH S P AH T
+despotic D IH S P AA T IH K
+despotism D EH S P AH T IH Z AH M
+despres D EH S P ER Z
+desrochers D EY R OW SH ER Z
+desroches D EY R OW SH IH Z
+desrosier D EY R OW SH IY ER
+desrosiers D EY R OW SH IY ER Z
+desrosiers(2) D EY R OW ZH IH R Z
+dessauer D IH S AW R
+dessauer(2) D EH S AW R
+desselle D IH S EH L
+dessent D IH S EH N T
+dessert D IH Z ER T
+desserts D IH Z ER T S
+dest D EH S T
+destabilization D IY S T EY B AH L AH Z EY SH AH N
+destabilize D IH S T EY B AH L AY Z
+destabilized D IH S T EY B AH L AY Z D
+destabilizing D IH S T EY B AH L AY Z IH NG
+destec D EH S T EH K
+destefanis D IH S T IH F AA N IH S
+destefano D IH S T EH F AA N OW
+destin D EH S T IH N
+destination D EH S T AH N EY SH AH N
+destination(2) D EH S T IH N EY SH AH N
+destinations D EH S T AH N EY SH AH N Z
+destined D EH S T IH N D
+destinies D EH S T AH N IY Z
+destiny D EH S T AH N IY
+destitute D EH S T AH T UW T
+destitution D EH S T AH T UW SH AH N
+destroy D IH S T R OY
+destroyed D IH S T R OY D
+destroyer D IH S T R OY ER
+destroyers D IH S T R OY ER Z
+destroying D IH S T R OY IH NG
+destroys D IH S T R OY Z
+destruct D IH S T R AH K T
+destructable D IH S T R AH K T AH B AH L
+destructed D IH S T R AH K T IH D
+destructing D IH S T R AH K T IH NG
+destruction D IH S T R AH K SH AH N
+destructive D IH S T R AH K T IH V
+destructiveness D IH S T R AH K T IH V N IH S
+destructs D IH S T R AH K T S
+desultory D EH S AH L T AO R IY
+des_moines D EH M OY N
+des_moines(2) D IH M OY N
+detach D IH T AE CH
+detach(2) D IY T AE CH
+detachable D IH T AE CH AH B AH L
+detachable(2) D IY T AE CH AH B AH L
+detached D IH T AE CH T
+detached(2) D IY T AE CH T
+detaches D IH T AE CH IH Z
+detaches(2) D IY T AE CH AH Z
+detachment D IH T AE CH M AH N T
+detachment(2) D IY T AE CH M AH N T
+detail D IH T EY L
+detail(2) D IY T EY L
+detailed D IH T EY L D
+detailee D IH T EY L IY
+detailer D IY T EY L ER
+detailing D IH T EY L IH NG
+details D IH T EY L Z
+details(2) D IY T EY L Z
+detain D IH T EY N
+detained D IH T EY N D
+detainee D IY T EY N IY
+detainees D IH T EY N IY Z
+detaining D IH T EY N IH NG
+detamore D IH T AA M AO R
+detar D IH T AA R
+detar(2) D IY T AA R
+detect D IH T EH K T
+detectable D IH T EH K T AH B AH L
+detected D IH T EH K T AH D
+detected(2) D IH T EH K T IH D
+detecting D IH T EH K T IH NG
+detection D IH T EH K SH AH N
+detective D IH T EH K T IH V
+detective's D IH T EH K T IH V Z
+detectives D IH T EH K T IH V Z
+detector D IH T EH K T ER
+detectors D IH T EH K T ER Z
+detects D IH T EH K T S
+detemple D EH T IH M P AH L
+detente D EY T AA N T
+detention D IH T EH N SH AH N
+detentions D IH T EH N SH AH N Z
+deter D IH T ER
+deterding D EH T ER D IH NG
+detergent D IH T ER JH AH N T
+detergents D IH T ER JH AH N T S
+deteriorate D IH T IH R IY ER EY T
+deteriorated D IH T IH R IY ER EY T IH D
+deteriorates D IH T IH R IY ER EY T S
+deteriorating D IH T IH R IY ER EY T IH NG
+deterioration D IH T IH R IY ER EY SH AH N
+determan D IY T ER M AH N
+determent D IH T ER M AH N T
+determinable D IH T ER M AH N AH B AH L
+determinant D IH T ER M AH N AH N T
+determinants D IH T ER M AH N AH N T S
+determinate D IH T ER M AH N EY T
+determination D IH T ER M AH N EY SH AH N
+determination's D IH T ER M IH N EY SH AH N Z
+determinations D IH T ER M IH N EY SH AH N Z
+determinative D IH T ER M IH N AH T IH V
+determine D AH T ER M AH N
+determine(2) D IH T ER M AH N
+determined D IH T ER M AH N D
+determinedly D AH T ER M AH N AH D L IY
+determinedly(2) D AH T ER M AH N D L IY
+determines D AH T ER M AH N Z
+determines(2) D IH T ER M AH N Z
+determining D IH T ER M AH N IH NG
+determinism D IH T ER M AH N IH Z AH M
+determinist D IH T ER M AH N AH S T
+deterministic D IH T ER M AH N IH S T IH K
+deterred D IH T ER D
+deterrence D IH T ER AH N S
+deterrent D IH T ER R AH N T
+deterrents D IH T ER AH N T S
+deterring D IH T ER IH NG
+deters D IH T ER Z
+detert D EH T ER T
+detest D IH T EH S T
+detest(2) D IY T EH S T
+detested D IH T EH S T IH D
+detested(2) D IY T EH S T IH D
+detherage D EH DH ER IH JH
+dethlefs D EH TH L IH F S
+dethlefsen D EH TH L IH F S AH N
+dethloff D EH TH L AO F
+dethomas D IH TH OW M AH Z
+dethomas(2) D IH T AA M AH S
+dethrone D IH TH R OW N
+dethrone(2) D IY TH R OW N
+dethroned D IH TH R OW N D
+dethroned(2) D IY TH R OW N D
+detienne D EH T IY EH N
+detjen D EH T JH AH N
+detlefsen D EH T L IH F S AH N
+detloff D EH T L AO F
+detmer D EH T M ER
+detonate D EH T AH N EY T
+detonated D EH T AH N EY T AH D
+detonating D EH T AH N EY T IH NG
+detonation D EH T AH N EY SH AH N
+detonations D EH T AH N EY SH AH N Z
+detonator D EH T AH N EY T ER
+detonators D EH T AH N EY T ER Z
+detore D IH T AO R IY
+detour D IH T UH R
+detour(2) D IY T UH R
+detoured D IY T UH R D
+detours D IH T UH R Z
+detours(2) D IY T UH R Z
+detox D IY T AA K S
+detoxication D IH T AA K S AH K EY SH AH N
+detoxification D IH T AA K S IH F IH K EY SH AH N
+detoxify D IH T AA K S AH F AY
+detract D IH T R AE K T
+detracted D IH T R AE K T IH D
+detracting D IH T R AE K T IH NG
+detractor D IY T R AE K T ER
+detractors D IH T R AE K T ER Z
+detractors(2) D IY T R AE K T ER Z
+detracts D IH T R AE K T S
+detrich D EH T R IH K
+detrick D EH T R IH K
+detriment D EH T R AH M AH N T
+detrimental D EH T R AH M EH N T AH L
+detrimental(2) D EH T R AH M EH N AH L
+detritus D IH T R AY T AH S
+detritus(2) D EH T R AH T AH S
+detro D IY T R OW
+detroit D IH T R OY T
+detroit's D AH T R OY T S
+detroit's(2) D IH T R OY T S
+detroit(2) D IY T R OY T
+detroiters D AH T R OY T ER Z
+detroiters(2) D IY T R OY T ER Z
+detter D EH T ER
+dettinger D EH T IH N JH ER
+dettling D EH T L IH NG
+dettloff D EH T L AO F
+dettman D EH T M AH N
+dettmann D EH T M AH N
+dettmer D EH T M ER
+dettore D IH T AO R IY
+detty D EH T IY
+deturk D EH T ER K
+detweiler D EH T W AY L ER
+detwiler D EH T W AY L ER
+detzel D EH T Z AH L
+deubel D OY B AH L
+deubler D OY B AH L ER
+deubler(2) D OY B L ER
+deuce D UW S
+deuel D UW EH L
+deukmejian D UW K M EY JH IY AH N
+deukmejian's D UW K M EY JH IY AH N Z
+deupree D UW P R IY
+deuschle D OY SH AH L
+deuser D OY S ER
+deuss D UW S
+deutch D OY CH
+deuterium D UW T IY R IY AH M
+deuterons D UW T ER AA N Z
+deutsch D OY CH
+deutsche D OY CH
+deutschemark D OY CH M AA R K
+deutschemark's D OY CH M AA R K S
+deutschemarks D OY CH M AA R K S
+deutscher D OY CH ER
+deutschland D OY CH L AE N D
+deutschman D OY CH M AH N
+deutz D OY T S
+deux D UW
+dev D EH V
+deva D EY V AH
+deval D IH V AA L
+deval's D IH V AA L Z
+devall D EY V AA L
+devalle D IH V AE L
+devalle(2) D IH V AE L IY
+devaluate D IH V AE L Y UW EY T
+devaluated D IH V AE L Y UW EY T IH D
+devaluation D IH V AE L Y UW EY SH AH N
+devaluation(2) D IY V AE L Y UW EY SH AH N
+devaluations D IY V AE L Y UW EY SH AH N Z
+devalue D IH V AE L Y UW
+devalued D IH V AE L Y UW D
+devalued(2) D IY V AE L Y UW D
+devaluing D IH V AE L Y UW IH NG
+devan D EH V AH N
+devane D IH V EY N
+devaney D EH V AH N IY
+devany D EH V AH N IY
+devastate D EH V AH S T EY T
+devastated D EH V AH S T EY T AH D
+devastated(2) D EH V AH S T EY T IH D
+devastating D EH V AH S T EY T IH NG
+devastatingly D EH V AH S T EY T IH NG L IY
+devastation D EH V AH S T EY SH AH N
+devaughn D EH V AO N
+devaul D IH V OW L
+devault D IH V OW
+devaux D IH V OW
+deveau D IH V OW
+deveaux D IH V OW
+develcon D AH V EH L K AH N
+develle D AH V EH L
+develop D IH V EH L AH P
+developable D IH V EH L AH P AH B AH L
+developed D IH V EH L AH P T
+developer D IH V EH L AH P ER
+developer's D IH V EH L AH P ER Z
+developers D IH V EH L AH P ER Z
+developers' D IH V EH L AH P ER Z
+developing D IH V EH L AH P IH NG
+development D IH V EH L AH P M AH N T
+development's D IH V EH L AH P M AH N T S
+developmental D IH V EH L AH P M EH N T AH L
+developmental(2) D IH V EH L AH P M EH N AH L
+developmentally D IH V EH L AH P M EH N AH L IY
+developmentally(2) D IH V EH L AH P M EH N T AH L IY
+developments D IH V EH L AH P M AH N T S
+develops D IH V EH L AH P S
+devendorf D EH V IH N D AO R F
+deveney D EH V IH N IY
+devenney D EH V IH N IY
+devenny D EH V IH N IY
+devenport D IH V EH N P AO R T
+devens D IY V AH N Z
+deveny D IH V IY N IY
+dever D IY V ER
+devera D EY V EH R AH
+deveraux D EH V ER OW
+devere D EY V EH R EY
+devereaux D EH V ER OW
+deverell D EY V EH R EY L
+devereux D EH V ER UW
+deveroy D EH V ER OY
+devers D EH V ER Z
+devey D IH V EY
+deviance D IY V IY AH N S
+deviancy D IY V IY EH N S IY
+deviancy(2) D IY V Y EH N S IY
+deviant D IY V IY AH N T
+deviants D IY V IY AH N T S
+deviate D IY V IY EY T
+deviated D IY V IY EY T IH D
+deviates D IY V IY EY T S
+deviating D IY V IY EY T IH NG
+deviation D IY V IY EY SH AH N
+deviations D IY V IY EY SH AH N Z
+device D IH V AY S
+device's D IH V AY S IH Z
+devices D IH V AY S AH Z
+devices(2) D IH V AY S IH Z
+devil D EH V AH L
+devil's D EH V AH L Z
+devilbiss D EH V IH L B IH S
+devilbiss(2) D IH V IH L B IH S
+devilish D EH V L IH SH
+devilishly D EH V AH L IH SH L IY
+devilishly(2) D EH V L IH SH L IY
+deville D AH V IH L
+deville's D AH V IH L Z
+devillier D AH V IH L Y ER
+devillier's D AH V IH L Y ER S
+devils D EH V AH L Z
+devils' D EH V AH L Z
+devilwood D EH V AH L W UH D
+devin D EH V IH N
+devincent D EY V IY N S AH N T
+devincentis D EH V IH N S EH N T IH S
+devincenzi D IH V IY N CH EH N Z IY
+devincenzo D IH V IY N CH EH N Z OW
+devinci's D IH V IH N CH IY Z
+devine D AH V AY N
+deviney D EH V IH N IY
+devinney D EH V IH N IY
+devino D IH V IY N OW
+devins D EH V IH N Z
+devious D IY V IY AH S
+devise D IH V AY Z
+devise(2) D IH V AY S
+devised D IH V AY Z D
+devises D IH V AY Z IH Z
+devising D IH V AY Z IH NG
+devita D IH V IY T AH
+devito D IH V IY T OW
+devitt D IH V IH T
+devivo D IH V IY V OW
+devlin D EH V L IH N
+devoe D IH V OW
+devoid D IH V OY D
+devol D EH V AO L
+devolder D EH V OW L D ER
+devoll D EH V AH L
+devolution D EH V AH L UW SH AH N
+devolve D IH V AA L V
+devolved D IH V AA L V D
+devon D EH V AH N
+devona D EH V AH N AH
+devonian D IH V OW N IY AH N
+devonshire D IH V AA N SH AY R
+devor D IH V AO R
+devore D EH V ER
+devos D IY V OW Z
+devoss D IH V AA S
+devote D IH V OW T
+devoted D IH V OW T AH D
+devoted(2) D IH V OW T IH D
+devotee D EH V AH T IY
+devotees D EH V AH T IY Z
+devotes D IH V OW T S
+devoting D IH V OW T IH NG
+devotion D IH V OW SH AH N
+devotional D IH V OW SH AH N AH L
+devoto D IH V OW T OW
+devour D IH V AW ER
+devoured D IH V AW ER D
+devouring D IH V AW ER IH NG
+devours D IH V AW ER Z
+devout D IH V AW T
+devoutly D IH V AW T L IY
+devoy D EH V OY
+devries D IH V R IY S
+devry D EH V R IY
+dew D UW
+dewaard D UW AA R D
+dewaele D UW EH L
+dewald D UW AH L D
+dewall D UW AH L
+dewalt D UW AH L T
+dewan D UW AH N
+dewar D UW ER
+dewar's D UW ER Z
+deware D UW EH R
+dewarr D UW ER
+dewart D UW AA R T
+dewayne D IH W EY N
+dewayne(2) D IY W EY N
+dewberry D UW B EH R IY
+dewbre D UW B ER
+dewclaw D UW K L AO
+deweerd D UW IH R D
+dewees D UW IY Z
+deweese D UW IY Z
+deweiss D IH W AY S
+dewell D EH W EH L
+dewey D UW IY
+dewey's D UW IY Z
+dewhirst D EH W ER S T
+dewhurst D EH W ER S T
+dewilde D IY W AY L D
+dewine D AH W AY N
+dewing D UW IH NG
+dewinter D UW IH N T ER
+dewinter(2) D IH W IH N T ER
+dewire D UW AY R
+dewit D UW IH T
+dewitt D AH W IH T
+dewitte D UW IH T
+dewitz D EH W IH T S
+dewolf D UW UH L F
+dewolfe D UW UH L F
+dewoody D IY W UH D IY
+dews D UW Z
+dewulf D UW AH L F
+dewy D UW IY
+dex D EH K S
+dexfenfluramine D EH K S AH N F L AO R AH M IY N
+dexheimer D EH K S HH AY M ER
+dexter D EH K S T ER
+dexter's D EH K S T ER Z
+dexterity D EH K S T EH R AH T IY
+dexterity(2) D EH K S T EH R IH T IY
+dextra D EH K S T R AH
+dextran D EH K S T R AE N
+dextrathoraphan D EH K S T R AH TH AO R AH F AH N
+dextro D EH K S T R OW
+dextrose D EH K S T R OW S
+dextrous D EH K S T R AH S
+dey D EY
+deyo D EY OW
+deyoe D EY OW
+deyoung D EH Y AH NG
+deyton D IH T AO N
+deyton(2) D EY T AH N
+dezarn D EY Z AA R N
+dezeeuw D IH Z IY UW
+dezern D EY Z EH R N
+deziel D EH Z IY L
+dfw D IY EH F D AH B AH L Y UW
+dfw(2) D IY EH F D AH B AH Y UW
+dhabi D AA B IY
+dhaharan D AH R AA N
+dhahran D AH R AA N
+dhaka D AA K AH
+dhaka(2) D AE K AH
+dhaka(3) D AE K AE
+dhali D AA L IY
+dhananjay D AA N AH N JH EY
+dharma D AA R M AH
+dhein D AY N
+dhia D IY AH
+dhillon D IH L AH N
+dhiraj D IH R AA ZH
+dhlakama D AH L AH K AA M AH
+dhole D OW L
+dhondt D HH AA N T
+dhows D AW Z
+di D IY
+di's D AY Z
+di(2) D AY
+dia D IY AH
+diab D AY AH B
+diabase D AY AH B EY S
+diabasic D AY AH B EY S IH K
+diabetes D AY AH B IY T IY Z
+diabetic D AY AH B EH T IH K
+diabetics D AY AH B EH T IH K S
+diablo D AY AE B L OW
+diablo(2) D IY AE B L OW
+diabolical D AY AH B AA L IH K AH L
+diaconate D AY AE K AH N AH T
+diacritic D AY AH K R IH T AH K
+diacritical D AY AH K R IH T AH K AH L
+diadem D AY AH D EH M
+diagnose D AY AH G N OW S
+diagnosed D AY AH G N OW S T
+diagnoses D AY AH G N OW S IY Z
+diagnosing D AY AH G N OW S IH NG
+diagnosis D AY AH G N OW S AH S
+diagnostek D AY AH G N AA S T EH K
+diagnostic D AY AH G N AA S T IH K
+diagnostics D AY AH G N AA S T IH K S
+diagonal D AY AE G AH N AH L
+diagonally D AY AE G AH N AH L IY
+diagonals D AY AE G AH N AH L Z
+diagram D AY AH G R AE M
+diagraming D AY AH G R AE M IH NG
+diagrammatic D AY AH G R AH M AE T IH K
+diagrammed D AY AH G R AE M D
+diagrams D AY AH G R AE M Z
+diahann D AY AE N
+dial D AY AH L
+dial's D AY AH L Z
+dial's(2) D AY L Z
+dial(2) D AY L
+dialect D AY AH L EH K T
+dialectic D AY AH L EH K T IH K
+dialectical D AY AH L EH K T IH K AH L
+dialects D AY AH L EH K T S
+dialed D AY AH L D
+dialing D AY AH L IH NG
+dialing(2) D AY L IH NG
+dialog D AY AH L AO G
+dialogue D AY AH L AO G
+dialogues D AY AH L AO G Z
+dials D AY AH L Z
+dials(2) D AY L Z
+dialtone D AY AH L T OW N
+dialtone(2) D AY L T OW N
+dialysis D AY AE L AH S AH S
+dialysis(2) D AY AE L IH S IH S
+diamagnetic D AY AH M AE G N EH T IH K
+diamagnetism D AY AH M AE G N IH T IH Z AH M
+diamandis D AY AH M AE N D IH S
+diamandis(2) D IY AH M AE N D IH S
+diamant D AY AH M AH N T
+diamanta D AY AH M AE N T AH
+diamante D AY AH M AA N T IY
+diameter D AY AE M AH T ER
+diametrically D AY AH M EH T R IH K AH L IY
+diametrically(2) D AY AH M EH T R IH K L IY
+diamond D AY M AH N D
+diamond's D AY M AH N D Z
+diamonds D AY M AH N D Z
+diamono D AY AH M AA N OW
+dian D AY AH N
+diana D AY AE N AH
+diana's D AY AE N AH Z
+diane D AY AE N
+diane's D AY AE N Z
+dianetics D AY AH N EH T IH K S
+diangelo D AY AH NG G EH L OW
+dianna D AY AE N AH
+dianne D AY AE N
+diantha D AY AE N TH AH
+dianthe D AY AE N DH IY
+dianthia D AY AE N TH IY AH
+diantonio D AY AH N T OW N IY OW
+diaper D AY P ER
+diapering D AY P ER IH NG
+diapers D AY AH P ER Z
+diapers(2) D AY P ER Z
+diaphanous D AY AE F AH N IH S
+diaphonia D AY AH F OW N IY AH
+diaphragm D AY AH F R AE M
+diapsid D AY AE P S IH D
+diaries D AY ER IY Z
+diaries(2) D AY R IY Z
+diario D AY EH R IY OW
+diarrhea D AY ER IY AH
+diarrheas D AY ER IY AH Z
+diarrhoea D AY ER IY AH
+diary D AY ER IY
+diary(2) D AY R IY
+dias D AY AH Z
+diasa D IY AA S AH
+diasa's D IY AA S AH Z
+diasonic D AY AH S AA N IH K
+diasonics D AY AH S AA N IH K S
+diaspora D AY AE S P ER AH
+diastase D AY AH S T EY S
+diastole D AY AE S T AH L IY
+diastolic D AY AH S T AA L IH K
+diastrophism D AY AE S T R AH F IH Z AH M
+diathermy D AY AH TH ER M IY
+diatomic D AY AH T AA M IH K
+diatoms D AY AH T AA M Z
+diatonic D AY AH T AA N IH K
+diatribe D AY AH T R AY B
+diatribes D AY AH T R AY B Z
+diaz D IY AE Z
+diaz(2) D IY AA Z
+diaz-calderon D IY AE Z K AE L D ER OW N
+diazo D AY AE Z OW
+dibacco D IH B AA K OW
+dibari D IH B AA R IY
+dibartolo D IY B AA R T OW L OW
+dibartolomeo D IH B AA R T OW L OW M IY OW
+dibattista D IH B AA T IY S T AH
+dibb D IH B
+dibbern D IH B ER N
+dibble D IH B AH L
+dibbled D IH B AH L D
+dibella D IH B EH L AH
+dibello D IH B EH L OW
+dibenedetto D IH B IH N AH D EH T OW
+dibernardo D IH B ER N AA R D OW
+dibert D IH B ER T
+dibiase D IY B IY AA S IY
+dibiasio D IH B IY AA S IY OW
+diblasi D IH B L AA S IY
+diblasio D IH B L AA S IY OW
+dible D AY B AH L
+diboll D IH B AH L
+dibona D IH B OW N AH
+dibrell D IH B R AH L
+dibs D IH B Z
+dibuono D IH B W OW N OW
+dic D IH K
+dicamba D IH K AE M B AH
+dicamillo D IH K AA M IH L OW
+dicaprio D IH K AE P R IY OW
+dicarlo D IH K AA R L OW
+dice D AY S
+dicecco D IH S EH K OW
+diced D AY S T
+dicello D IH S EH L OW
+dicenso D IH S EH N S OW
+dicenzo D IH S EH N Z OW
+diceon D IH S IY AH N
+dicesare D IH CH EH S AA R IY
+dicey D AY S IY
+dichiara D IH K IY AA R AH
+dichotomy D AY K AA T AH M IY
+dichroic D AY K R OW IH K
+dichromate D AY K R OW M EY T
+dichter D IH K T ER
+dicicco D IH S IH K OW
+dicier D AY S IY ER
+dicing D AY S IH NG
+dicioccio D IH CH OW CH IY OW
+dick D IH K
+dick's D IH K S
+dickard D IH K ER D
+dickason D IH K AH S AH N
+dicke D IH K
+dickel D IH K AH L
+dicken D IH K AH N
+dickens D IH K AH N Z
+dickens' D IH K AH N Z
+dickens's D IH K AH N Z IH Z
+dickensheets D IH K AH N SH IY T S
+dickensian D IH K EH N Z IY AH N
+dickenson D IH K IH N S AH N
+dicker D IH K ER
+dickered D IH K ER D
+dickering D IH K ER IH NG
+dickerman D IH K ER M AH N
+dickerson D IH K ER S AH N
+dickert D IH K ER T
+dickes D IH K S
+dickeson D IH K IH S AH N
+dickey D IH K IY
+dickey's D IH K IY Z
+dickhaut D IH K HH AW T
+dickie D IH K IY
+dickinson D IH K IH N S AH N
+dickison D IH K IH S AH N
+dickler D IH K L ER
+dickman D IH K M AH N
+dickmann D IH K M AH N
+dickmeyer D IH K M AY ER
+dicks D IH K S
+dickson D IH K S AH N
+dickstein D IH K S T AY N
+dickstein's D IH K S T AY N Z
+dickstein's(2) D IH K S T IY N Z
+dickstein(2) D IH K S T IY N
+dicky D IH K IY
+diclemente D IH K L AH M EH N T EY
+dicocco D IH K OW K OW
+dicola D IH K OW L AH
+dicomed D IH K AH M EH D
+dicomed(2) D IY K OW M D
+dicostanzo D IH K OW S T AA N Z OW
+dicots D AY K AA T S
+dicta D IH K T AH
+dictaphone D IH K T AH F OW N
+dictate D IH K T EY T
+dictated D IH K T EY T AH D
+dictated(2) D IH K T EY T IH D
+dictates D IH K T EY T S
+dictating D IH K T EY T IH NG
+dictation D IH K T EY SH AH N
+dictator D IH K T EY T ER
+dictatorial D IH K T AH T AO R IY AH L
+dictators D IH K T EY T ER Z
+dictatorship D IH K T EY T ER SH IH P
+dictatorships D IH K T EY T ER SH IH P S
+diction D IH K SH AH N
+dictionaries D IH K SH AH N EH R IY Z
+dictionary D IH K SH AH N EH R IY
+dictum D IH K T AH M
+dicus D AY K AH S
+did D IH D
+didactic D AY D AE K T IH K
+diddley D IH D L IY
+diddy D IH D IY
+didemeyer D IY D AH M AY ER
+didemeyer's D IY D AH M AY ER Z
+dideoxycytidine D IH D IY AA K S IY S AY T IH D AY N
+didi D IY D IY
+didier D IH D IY ER
+didinium D IH D IH N IY AH M
+didion D IH D IY AH N
+didion's D IH D IY AH N Z
+didn't D IH D AH N T
+didn't(2) D IH D N T
+didn't(3) D IH D AH N
+didn't(4) D IH N T
+dido D AY D OW
+didomenico D IH D OW M EH N IH K OW
+didonato D IH D OW N AA T OW
+didonna D IH D AA N AH
+die D AY
+diebel D IY B AH L
+diebold D AY B OW L D
+dieck D IY K
+dieckman D IY K M AH N
+dieckmann D IY K M AH N
+died D AY D
+diede D IY D
+diederich D IY D ER IH K
+diedre D IY D R AH
+diedrich D IY D R IH K
+diedrick D IY D R IH K
+diefenbach D IY F IH N B AA K
+diefenderfer D IY F IH N D ER F ER
+diefendorf D IY F IH N D AO R F
+dieffenbach D IY F IH N B AA K
+diegans D IY G AH N Z
+diegel D IY G AH L
+diego D IY EY G OW
+diego's D IY EY G OW Z
+diego-garcia D IY EY G OW G AA R S IY AH
+dieguez D IH G EH Z
+diehard D AY HH AA R D
+diehards D AY HH AA R D Z
+diehl D IY L
+diehm D IY M
+diekman D IY K M AH N
+diekmann D IY K M AH N
+diel D IY L
+diem D IY M
+diemer D IY M ER
+diemert D IY M ER T
+diener D IY N ER
+dienes D IY N EH Z
+dienst D IY N S T
+diep D IY P
+dier D IY ER
+diercks D IY R K S
+dieringer D IH R IH N JH ER
+dierker D IY R K ER
+dierkes D IY R K S
+dierking D AY ER K IH NG
+dierks D IY R K S
+dierolf D IH R OW L F
+diers D IY ER Z
+diery D IH R IY
+dies D AY Z
+diesel D IY S AH L
+diesel(2) D IY Z AH L
+diesels D IY Z AH L Z
+dieses D AY Z IH Z
+diesing D IY S IH NG
+diet D AY AH T
+diet's D AY AH T S
+dietary D AY AH T EH R IY
+dietel D IY T AH L
+dieter D IY T ER
+dieterich D IY T ER IH K
+dieterle D IY T ER AH L
+dieters D AY AH T ER Z
+dietetic D AY AH T EH T IH K
+dietician D AY AH T IH SH AH N
+dieting D AY AH T IH NG
+dietitian D AY AH T IH SH AH N
+dietitian's D AY AH T IH SH AH N Z
+dietitians D AY AH T IH SH AH N Z
+dietl D AY AH T L
+dietrich D IY T R IH K
+dietrick D IY T R IH K
+diets D AY IH T S
+dietsch D IY CH
+dietsche D IY CH
+dietz D IY T S
+dietze D AY AH T Z
+dietzel D IY T Z AH L
+dietzen D IY T Z AH N
+dietzler D IY T S L ER
+dietzman D IY T S M AH N
+dievler D IY V L ER
+diez D AY AH Z
+dif D IH F
+difabio D IH F EY B IY OW
+difabio(2) D IH F AE B IY OW
+difalco D IH F AE L K OW
+difazio D IH F EY Z IY OW
+difelice D IH F EH L IH S
+difelice(2) D IH F EH L IY S
+difelice(3) D IH F IH L IY CH EY
+diff D IH F
+diffee D IH F IY
+diffenderfer D IH F IH N D ER F ER
+differ D IH F ER
+differed D IH F ER D
+difference D IH F ER AH N S
+difference(2) D IH F R AH N S
+differences D IH F ER AH N S IH Z
+differences(2) D IH F R AH N S AH Z
+different D IH F ER AH N T
+different(2) D IH F R AH N T
+differential D IH F ER EH N SH AH L
+differential(2) D IH F ER EH N CH AH L
+differentials D IH F ER EH N SH AH L Z
+differentials(2) D IH F ER EH N CH AH L Z
+differentiate D IH F ER EH N SH IY EY T
+differentiate(2) D IH F ER EH N CH IY EY T
+differentiated D IH F ER EH N SH IY EY T IH D
+differentiated(2) D IH F ER EH N CH IY EY T AH D
+differentiates D IH F ER EH N SH IY EY T S
+differentiates(2) D IH F ER EH N CH IY EY T S
+differentiating D IH F ER EH N SH IY EY T IH NG
+differentiating(2) D IH F ER EH N CH IY EY T IH NG
+differentiation D IH F ER EH N SH IY EY SH AH N
+differentiation(2) D IH F ER EH N CH IY EY SH AH N
+differently D IH F R AH N T L IY
+differently(2) D IH F ER EH N T L IY
+differing D IH F ER IH NG
+differing(2) D IH F R IH NG
+differs D IH F ER Z
+difficult D IH F AH K AH L T
+difficulties D IH F AH K AH L T IY Z
+difficulties(2) D IH F IH K AH L T IY Z
+difficultly D IH F AH K AH L T L IY
+difficulty D IH F AH K AH L T IY
+difficulty(2) D IH F IH K AH L T IY
+diffid D IH F AH D
+diffin D IH F IH N
+diffley D IH F L IY
+diffract D IH F R AE K T
+diffraction D IH F R AE K SH AH N
+diffuse D IH F Y UW S
+diffuse(2) D IH F Y UW Z
+diffused D IH F Y UW Z D
+diffuses D IH F Y UW Z AH Z
+diffusing D IH F Y UW Z IH NG
+diffusion D IH F Y UW ZH AH N
+difilippo D IH F IY L IY P OW
+difiore D IH F IY AO R IY
+difiore(2) D AH F Y AO R IY
+difm D IH F M
+difm(2) D IY AY EH F EH M
+difonzo D IH F AA N Z OW
+difrancesco D IH F R AA N CH EH S K OW
+difranco D IH F R AA N K OW
+dig D IH G
+digaetano D IH JH AH T AA N OW
+digalakis D IH JH AH L AA K AH S
+digangi D IH G AE N JH IY
+digate D AY G EY T
+digby D IH G B IY
+digennaro D IH JH EH N AA R OW
+digenova D IY JH EH N OW V AH
+digeronimo D IH JH ER OW N IY M OW
+digest D AY JH EH S T
+digest's D AY JH EH S T S
+digested D AY JH EH S T IH D
+digester D AY JH EH S T ER
+digestible D AY JH EH S T AH B AH L
+digesting D AY JH EH S T IH NG
+digestion D AY JH EH S CH AH N
+digestive D AY JH EH S T IH V
+digests D AH JH EH S T S
+digests(2) D AY JH EH S T S
+digests(3) D AH JH EH S
+digests(4) D AY JH EH S
+digga D IH G AH
+digger D IH G ER
+diggers D IH G ER Z
+digges D IH G Z
+digging D IH G IH NG
+diggins D IH G IH N Z
+diggle D IH G AH L
+diggs D IH G Z
+digiacomo D IY JH AH K OW M OW
+digicon D IH JH IH K AA N
+digidyne D IH JH IH D AY N
+digilio D IH JH IY L IY OW
+digioia D IH JH OW Y AH
+digiorgio D IH JH AO R JH IY OW
+digiovanna D IH JH OW V AA N AH
+digiovanni D IH JH OW V AA N IY
+digirolamo D IH JH IH R OW L AA M OW
+digit D IH JH AH T
+digit(2) D IH JH IH T
+digital D IH JH AH T AH L
+digital's D IH JH AH T AH L Z
+digital's(2) D IH JH IH T AH L Z
+digital(2) D IH JH IH T AH L
+digitalis D IH JH AH T AE L AH S
+digitally D IH JH AH T AH L IY
+digitech D IH JH AH T EH K
+digitize D IH JH AH T AY Z
+digitized D IH JH AH T AY Z D
+digitizing D IH JH AH T AY Z IH NG
+digits D IH JH AH T S
+digits(2) D IH JH IH T S
+digiulio D IH JH UW L IY OW
+digiuseppe D IY JH UW S EH P IY
+digman D IH G M AH N
+dignan D IH G N AH N
+dignified D IH G N AH F AY D
+dignify D IH G N AH F AY
+dignitaries D IH G N AH T EH R IY Z
+dignitary D IH G N AH T EH R IY
+dignity D IH G N AH T IY
+digrazia D IH G R AA Z IY AH
+digregorio D IH G R EH G AO R IY OW
+digress D AY G R EH S
+digressed D AY G R EH S T
+digresses D AY G R EH S IH Z
+digressing D AY G R EH S IH NG
+digression D AY G R EH SH AH N
+digressions D AY G R EH SH AH N Z
+digs D IH G Z
+diguglielmo D IH G UW G L IY EH L M OW
+diianni D IY AE N IY
+diiorio D IH Y AO R IY OW
+dijker D IY K ER
+dijon D IY ZH AA N
+dijon(2) D IY ZH OW N
+dike D AY K
+dikeman D AY K M AH N
+dikes D AY K S
+dilapidate D AH L AE P AH D EY T
+dilapidated D AH L AE P AH D EY T IH D
+dilatation D IH L AH T EY SH AH N
+dilate D AY L EY T
+dilated D AY L EY T AH D
+dilation D AY L EY SH AH N
+dilatory D IH L AH T AO R IY
+dilaura D IH L AO R AH
+dilauro D IH L AO R OW
+dilbeck D IH L B EH K
+dilbert D IH L B ER T
+dilday D IH L D EY
+dildine D IH L D IY N IY
+dildy D IH L D IY
+dilella D IH L EH L AH
+dilello D IH L EH L OW
+dilemma D IH L EH M AH
+dilemmas D AH L EH M AH Z
+dilenschneider D AY L AH N SH N AY D ER
+dileo D IH L IY OW
+dileonardo D IH L IY AH N AA R D OW
+diles D AY L Z
+dilford D IH L F ER D
+dilford's D IH L F ER D Z
+dilg D IH L G
+dilger D IH L G ER
+diliberto D IH L IY B EH R T OW
+diligence D IH L AH JH AH N S
+diligence(2) D IH L IH JH AH N S
+diligent D IH L IH JH AH N T
+diligently D IH L AH JH AH N T L IY
+dilip D IH L IH P
+dilithium D AY L IH TH IY AH M
+dilks D IH L K S
+dill D IH L
+dillahunt D IH L AH HH AH N T
+dillahunty D IH L AH HH AH N T IY
+dillan D IH L AH N
+dillard D IH L ER D
+dillard's D IH L ER D Z
+dillard's(2) D IH L AA R D Z
+dillard's(3) D IH L AH D Z
+dillard(2) D IH L AA R D
+dillard(3) D IH L AH D
+dille D IH L
+dillehay D IH L IH HH EY
+dillen D IH L AH N
+dillenbeck D IH L AH N B EH K
+dillenburg D IH L AH N B ER G
+diller D IH L ER
+diller's D IH L ER Z
+dilletante D IH L AH T AA N T
+dilletantes D IH L AH T AA N T S
+dilley D IH L IY
+dillie D IH L IY
+dillin D IH L IH N
+dilling D IH L IH NG
+dillinger D IH L IH NG ER
+dillingham D IH L IH NG HH AE M
+dillion D IH L Y AH N
+dillman D IH L M AH N
+dillmore D IH L M AO R
+dillon D IH L AH N
+dillon's D IH L AH N Z
+dillow D IH L OW
+dills D IH L Z
+dillworth D IH L W ER TH
+dilly D IH L IY
+dillydally D IH L IY D AE L IY
+dilmore D IY L M AO R
+dilophosaurus D IH L AA F AH S AO R AH S
+dilorenzo D IH L AO R EH N Z OW
+diloreto D IH L AO R EH T OW
+dilorio D IH L AO R IY OW
+dils D IH L Z
+dilsaver D IH L S AH V ER
+dilson D IH L S AH N
+diltiazem D IH L T IY AH Z EH M
+dilts D IH L T S
+diltz D IH L T S
+dilullo D IH L UW L OW
+dilute D AY L UW T
+dilute(2) D IH L UW T
+diluted D AY L UW T AH D
+diluted(2) D IH L UW T AH D
+dilutes D AY L UW T S
+dilutes(2) D IH L UW T S
+diluting D AY L UW T IH NG
+diluting(2) D IH L UW T IH NG
+dilution D AY L UW SH AH N
+dilution(2) D IH L UW SH AH N
+dilutive D AH L UW T IH V
+dilutive(2) D IY L UW T IH V
+diluzio D IH L UW Z IY OW
+dilworth D IH L W ER TH
+dim D IH M
+dimaggio D IH M AE JH IY OW
+dimaio D IH M AA IY OW
+dimambro D IH M AE M B R OW
+dimarco D IH M AA R K OW
+dimare D IH M AA R IY
+dimaria D IH M AA R IY AH
+dimarino D IH M AA R IY N OW
+dimario D IH M AA R IY OW
+dimartino D IY M AA R T IY N OW
+dimarzio D IH M AA R Z IY OW
+dimarzo D IH M AA R Z OW
+dimas D AY M AH Z
+dimascio D IH M AE S IY OW
+dimasi D IH M AA S IY
+dimatteo D IH M AA T IY OW
+dimauro D IH M AO R OW
+dime D AY M
+dime's D AY M Z
+dimeglio D IH M EH G L IY OW
+dimenaci D IH M EH AH CH IY
+dimension D IH M EH N SH AH N
+dimensional D IH M EH N SH AH N AH L
+dimensionality D IH M EH N SH AH N AE L AH T IY
+dimensioned D AH M EH N CH AH N D
+dimensions D IH M EH N SH AH N Z
+dimeo D IY M IY OW
+dimer D AY M ER
+dimercurio D IH M ER K UH R IY OW
+dimes D AY M Z
+dimetapp D AY M AH T AE P
+dimiceli D IH M IY CH EH L IY
+dimichele D IH M IY K EH L IY
+dimick D IH M IH K
+dimick's D IH M IH K S
+diming D AY M IH NG
+diminish D IH M IH N IH SH
+diminished D IH M IH N IH SH T
+diminishes D IH M IH N IH SH IH Z
+diminishing D IH M IH N IH SH IH NG
+diminishment D IH M IH N IH SH M AH N T
+dimino D IH M IY N OW
+diminution D IH M AH N UW SH AH N
+diminutive D IH M IH N Y AH T IH V
+dimitri D IH M IY T R IY
+dimitrios D IH M IY T R IY OW S
+dimitrius D IH M IY T R IY AH S
+dimitrius' D IH M IY T R IY AH S
+dimitrius's D IH M IY T R IY AH S IH S
+dimitroff D IH M IH T R AO F
+dimitruk D IH M IY T R UH K
+dimly D IH M L IY
+dimmed D IH M D
+dimmer D IH M ER
+dimmers D IH M ER Z
+dimmick D IH M IH K
+dimming D IH M IH NG
+dimmitt D IH M IH T
+dimock D IH M AH K
+dimon D IH M AH N
+dimona D IH M OW N AH
+dimond D AY M AH N D
+dimorphic D AY M AO R F IH K
+dimorphism D AY M AO R F IH Z AH M
+dimperio D IH M P EH R IY OW
+dimple D IH M P AH L
+dimpled D IH M P AH L D
+dimples D IH M P AH L Z
+dimry D IH M R IY
+dims D IH M Z
+dimsdale D IH M Z D EY L
+dimunition D IH M Y UW N IH SH AH N
+dimuro D IH M UH R OW
+dimuzio D IH M UW Z IY OW
+din D IH N
+dina D IY N AH
+dinah D AY N AH
+dinan D IH N AH N
+dinapoli D IH N AE P AH L IY
+dinar D IH N AA R
+dinardo D IH N AA R D OW
+dinars D AY N ER Z
+dinars(2) D IH N AA R Z
+dinatale D IH N AA T AA L IY
+dinatale(2) D IY N AA T AA L IY
+dinda D IH N D AH
+dine D AY N
+dined D AY N D
+dineen D IH N IY N
+dinehart D AY N HH AA R T
+diner D AY N ER
+diners D AY N ER Z
+dines D AY N Z
+dinesh D IH N EH SH
+ding D IH NG
+dingee D IH NG G IY
+dingel D IH NG G AH L
+dingell D IH NG G AH L
+dingell's D IH NG G AH L Z
+dinger D IH NG ER
+dinges D IH N JH IH Z
+dingess D IH NG G IH S
+dingham D IH NG AH M
+dinghy D IH NG IY
+dingle D IH NG G AH L
+dingledine D IH NG G AH L D AY N
+dingler D IH NG G AH L ER
+dingler(2) D IH NG G L ER
+dingley D IH NG G L IY
+dingman D IH NG M AH N
+dingo D IH NG G OW
+dings D IH NG Z
+dingus D IH NG G IH S
+dingwall D IH NG G W AH L
+dingy D IH N JH IY
+dinh D IH N
+dini D IY N IY
+dinicola D IH N IY K OW L AH
+dining D AY N IH NG
+dinino D IH N IY N OW
+dinius D AY N IY IH S
+dink D IH NG K
+dinkel D IH NG K AH L
+dinkins D IH NG K IH N Z
+dinkins' D IH NG K IH N Z
+dinky D IH NG K IY
+dinmukhamed D IH N M UW K AA M EH D
+dinneen D IH N IY N
+dinner D IH N ER
+dinners D IH N ER Z
+dinnertime D IH N ER T AY M
+dinnerware D IH N ER W EH R
+dinning D IH N IH NG
+dino D IY N OW
+dinosaur D AY N AH S AO R
+dinosaurs D AY N AH S AO R Z
+dinoseb D AY N OW S EH B
+dinoto D IH N OW T OW
+dinotopia D AY N AH T OW P IY AH
+dinovo D IH N OW V OW
+dinsa D IH N S AH
+dinsdale D IH N Z D EY L
+dinse D IH N S
+dinsmore D IY N S M AO R
+dint D IH N T
+dinunzio D IH N AH N Z IY OW
+dinwiddie D IH N W IH D IY
+diocesan D AY AA S AH S AH N
+diocese D AY AH S IY Z
+diocese(2) D AY AH S AH S
+dioceses D AY AH S IY Z
+dioceses(2) D AY AH S IY Z AH Z
+diodati D IY OW D AA T IY
+diodato D IY OW D AA T OW
+diode D AY OW D
+diodes D AY OW D Z
+dioguardi D IY OW G AA R D IY
+dion D AY AH N
+dion(2) D IY AO N
+diona D IY OW N AH
+dione D IY AA N
+dionisio D AY AH N IH S IY OW
+dionne D IY AA N
+dionysian D AY AH N IH S IY AH N
+dionysius D AY AH N IH S IY AH S
+dior D IY AO R
+diorio D IY AO R IY OW
+diorite D AY ER AY T
+dios D IY OW S
+dios' D IY OW S
+dios's D IY OW S IH Z
+dioxide D AY AA K S AY D
+dioxides D AY AA K S AY D Z
+dioxin D AY AA K S IH N
+dioxins D AY AA K S IH N Z
+dip D IH P
+dipalma D IH P AA L M AH
+dipanjan D AH P AA N JH AH N
+dipaola D IH P AA OW L AH
+dipaolo D IH P AA OW L OW
+dipasquale D IH P AA S K W AA L IY
+dipasquale(2) D IY P AA S K W AA L IY
+diperna D IH P EH R N AH
+diphtheria D IH F TH IH R IY AH
+diphthong D IH P TH AO NG
+dipiazza D IH P IY AA T S AH
+dipiazza(2) D IY P IY AA T S AH
+dipiero D IH P IH R OW
+dipierro D IH P IH R OW
+dipietro D IH P IY T R OW
+dipinto D IH P IH N T OW
+dipirro D IH P IH R OW
+diploma D IH P L OW M AH
+diplomacy D IH P L OW M AH S IY
+diplomas D IH P L OW M AH Z
+diplomat D IH P L AH M AE T
+diplomat's D IH P L AH M AE T S
+diplomatic D IH P L AH M AE T IH K
+diplomatically D IH P L AH M AE T IH K L IY
+diplomats D IH P L AH M AE T S
+diplomats' D IH P L AH M AE T S
+dipole D AY P OW L
+dipped D IH P T
+dippel D IH P AH L
+dipper D IH P ER
+dippers D IH P ER Z
+dipping D IH P IH NG
+dipple D IH P AH L
+dippold D IH P OW L D
+dippolito D IH P OW L IY T OW
+dippy D IH P IY
+diprima D IH P R IY M AH
+dips D IH P S
+dipstick D IH P S T IH K
+dircks D ER K S
+dire D AY R
+dire(2) D AY ER
+direct D ER EH K T
+direct(2) D AY R EH K T
+direct(3) D IH R EH K T
+directed D ER EH K T AH D
+directed(2) D ER EH K T IH D
+directed(3) D AY R EH K T IH D
+directed(4) D IH R EH K T IH D
+directing D ER EH K T IH NG
+directing(2) D IY R EH K T IH NG
+directing(3) D AY R EH K T IH NG
+directing(4) D IH R EH K T IH NG
+direction D ER EH K SH AH N
+direction(2) D IY R EH K SH IH N
+direction(3) D AY R EH K SH IH N
+direction(4) D IH R EH K SH IH N
+directional D ER EH K SH AH N AH L
+directional(2) D IY R EH K SH IH N AH L
+directional(3) D AY R EH K SH IH N AH L
+directional(4) D IH R EH K SH IH N AH L
+directionless D ER EH K SH AH N L AH S
+directionless(2) D IY R EH K SH IH N L AH S
+directionless(3) D AY R EH K SH IH N L AH S
+directionless(4) D IH R EH K SH IH N L AH S
+directions D ER EH K SH AH N Z
+directions(2) D IY R EH K SH IH N Z
+directions(3) D AY R EH K SH IH N Z
+directions(4) D IH R EH K SH IH N Z
+directive D ER EH K T IH V
+directive(2) D IY R EH K T IH V
+directive(3) D AY R EH K T IH V
+directive(4) D IH R EH K T IH V
+directives D AY R EH K T IH V Z
+directives(2) D IY R EH K T IH V Z
+directives(3) D ER EH K T IH V Z
+directives(4) D IH R EH K T IH V Z
+directly D ER EH K T L IY
+directly(2) D IY R EH K L IY
+directly(3) D AY R EH K L IY
+directly(4) D IH R EH K L IY
+directness D ER EH K T N AH S
+directness(2) D IY R EH K N AH S
+directness(3) D AY R EH K N AH S
+directness(4) D IH R EH K N AH S
+director D ER EH K T ER
+director's D AY R EH K T ER Z
+director's(2) D ER EH K T ER Z
+director's(3) D IY R EH K T ER Z
+director's(4) D IH R EH K T ER Z
+director(2) D AY R EH K T ER
+director(3) D IY R EH K T ER
+director(4) D IH R EH K T ER
+directoral D ER EH K T ER AH L
+directorate D ER EH K T ER AH T
+directorate(2) D AY R EH K T ER AH T
+directorate(3) D IY R EH K T ER AH T
+directorate(4) D IH R EH K T ER AH T
+directorial D ER EH K T AO R IY AH L
+directorial(2) D AY R EH K T AO R IY AH L
+directorial(3) D IY R EH K T AO R IY AH L
+directorial(4) D IH R EH K T AO R IY AH L
+directories D AY R EH K T ER IY Z
+directories(2) D ER EH K T ER IY Z
+directories(3) D IY R EH K T ER IY Z
+directories(4) D IH R EH K T ER IY Z
+directors D ER EH K T ER Z
+directors' D IH R EH K T ER Z
+directors'(2) D ER EH K T ER Z
+directors'(3) D IY R EH K T ER Z
+directors(2) D AY R EH K T ER Z
+directors(3) D IY R EH K T ER Z
+directors(4) D IH R EH K T ER Z
+directorship D ER EH K T ER SH IH P
+directorship(2) D AY R EH K T ER SH IH P
+directorship(3) D IY R EH K T ER SH IH P
+directorship(4) D IH R EH K T ER SH IH P
+directorships D ER EH K T ER SH IH P S
+directorships(2) D AY R EH K T ER SH IH P S
+directorships(3) D IY R EH K T ER SH IH P S
+directorships(4) D IH R EH K T ER SH IH P S
+directory D ER EH K T ER IY
+directory(2) D AY R EH K T ER IY
+directory(3) D IY R EH K T ER IY
+directory(4) D IH R EH K T ER IY
+directs D ER EH K T S
+directs(2) D AY R EH K T S
+directs(3) D IY R EH K T S
+directs(4) D IH R EH K T S
+directv D ER EH K T IY V IY
+directv(2) D AY R EH K T IY V IY
+directv(3) D IY R EH K T IY V IY
+directv(4) D IH R EH K T IY V IY
+direnzo D IH R EH N Z OW
+direst D AY R AH S T
+dirge D ER JH
+dirhams D ER AH M Z
+dirickson D AO R IH K S AH N
+dirienzo D IH R IY N Z OW
+dirk D ER K
+dirkes D ER K S
+dirks D ER K S
+dirkse D ER K S
+dirksen D ER K S AH N
+dirlam D ER L AE M
+dirocco D IH R AA K OW
+dirosa D IH R OW S AH
+dirr D ER
+dirt D ER T
+dirt's D ER T S
+dirtier D ER T IY ER
+dirtiest D ER T IY AH S T
+dirty D ER T IY
+dirusso D IH R UW S OW
+dis D IH S
+disa D IH S AH
+disabatino D IH S AA B AA T IY N OW
+disabato D IH S AA B AA T OW
+disabilities D IH S AH B IH L AH T IY Z
+disabilities(2) D IH S AH B IH L IH T IY Z
+disability D IH S AH B IH L IH T IY
+disability(2) D IH S AH B IH L IH T IY Z
+disable D IH S EY B AH L
+disabled D IH S EY B AH L D
+disables D IH S EY B AH L Z
+disabling D IH S EY B AH L IH NG
+disabling(2) D IH S EY B L IH NG
+disabuse D IH S AH B Y UW S
+disabuse(2) D IH S AH B Y UW Z
+disabused D IH S AH B Y UW Z D
+disabuses D IH S AH B Y UW S IH Z
+disadvantage D IH S AH D V AE N T IH JH
+disadvantage(2) D IH S AH D V AE N IH JH
+disadvantaged D IH S AH D V AE N T IH JH D
+disadvantaged(2) D IH S AH D V AE N IH JH D
+disadvantageous D IH S AE D V AE N T EY JH AH S
+disadvantages D IH S AH D V AE N T IH JH IH Z
+disadvantages(2) D IH S AH D V AE N IH JH Z
+disaffect D IH S AH F EH K T
+disaffected D IH S AH F EH K T IH D
+disaffection D IH S AH F EH K SH AH N
+disagree D IH S AH G R IY
+disagreeable D IH S AH G R IY AH B AH L
+disagreed D IH S AH G R IY D
+disagreeing D IH S AH G R IY IH NG
+disagreement D IH S AH G R IY M AH N T
+disagreements D IH S AH G R IY M AH N T S
+disagrees D IH S AH G R IY Z
+disallow D IH S AH L AW
+disallowance D IH S AH L AW AH N S
+disallowances D IH S AH L AW AH N S IH Z
+disallowed D IH S AH L AW D
+disallowing D IH S AH L AW IH NG
+disalvo D IH S AA L V OW
+disano D IH S AA N OW
+disanti D IH S AE N T IY
+disantis D IH S AA N T IH S
+disanto D IH S AE N T OW
+disappear D IH S AH P IH R
+disappear(2) D IH S AH P IY R
+disappearance D IH S AH P IH R AH N S
+disappearance(2) D IH S AH P IY R AH N S
+disappearances D IH S AH P IH R AH N S IH Z
+disappearances(2) D IH S AH P IY R AH N S IH Z
+disappeared D IH S AH P IH R D
+disappeared(2) D IH S AH P IY R D
+disappearing D IH S AH P IH R IH NG
+disappearing(2) D IH S AH P IY R IH NG
+disappears D IH S AH P IH R Z
+disappears(2) D IH S AH P IY R Z
+disappoint D IH S AH P OY N T
+disappointed D IH S AH P OY N T IH D
+disappointed(2) D IH S AH P OY N IH D
+disappointing D IH S AH P OY N T IH NG
+disappointing(2) D IH S AH P OY N IH NG
+disappointingly D IH S AH P OY N T IH NG L IY
+disappointingly(2) D IH S AH P OY N IH NG L IY
+disappointment D IH S AH P OY N T M AH N T
+disappointments D IH S AH P OY N T M AH N T S
+disappoints D IH S AH P OY N T S
+disapproval D IH S AH P R UW V AH L
+disapprove D IH S AH P R UW V
+disapproved D IH S AH P R UW V D
+disapproves D IH S AH P R UW V Z
+disapproving D IH S AH P R UW V IH NG
+disarm D IH S AA R M
+disarmament D IH S AA R M AH M AH N T
+disarmed D IH S AA R M D
+disarming D IH S AA R M IH NG
+disarmingly D IH S AA R M IH NG L IY
+disarray D IH S ER EY
+disarray(2) D IH S AH R EY
+disassemble D IH S AH S EH M B AH L
+disassembled D IH S AH S EH M B AH L D
+disassociate D IH S AH S OW SH IY EY T
+disassociate(2) D IH S AH S OW S IY EY T
+disassociated D IH S AH S OW SH IY EY T AH D
+disassociated(2) D IH S AH S OW S IY EY T AH D
+disaster D IH Z AE S T ER
+disasters D IH Z AE S T ER Z
+disastrous D IH Z AE S T R AH S
+disastrously D IH Z AE S T R AH S L IY
+disavow D IH S AH V AW
+disavowed D IH S AH V AW D
+disavowing D IH S AH V AW IH NG
+disband D IH S B AE N D
+disbanded D IH S B AE N D IH D
+disbanding D IH S B AE N D IH NG
+disbar D IH S B AA R
+disbarment D IH S B AA R M AH N T
+disbarred D IH S B AA R D
+disbelief D IH S B IH L IY F
+disbelieve D IH S B AH L IY V
+disbelieving D IH S B AH L IY V IH NG
+disbro D IH S B R OW
+disbrow D IH S B R AW
+disburse D IH S B ER S
+disbursed D IH S B ER S T
+disbursement D IH S B ER S M AH N T
+disbursements D IH S B ER S M AH N T S
+disbursing D IH S B ER S IH NG
+disc D IH S K
+discard D IH S K AA R D
+discarded D IH S K AA R D IH D
+discarding D IH S K AA R D IH NG
+discards D IH S K AA R D Z
+discenza D IH S CH EH N Z AH
+discern D IH S ER N
+discernably D IH S ER N AH B L IY
+discerned D IH S ER N D
+discernible D IH S ER N AH B AH L
+discerning D IH S ER N IH NG
+discernment D IH S ER N M AH N T
+discerns D IH S ER N Z
+disch D IH SH
+discharge D IH S CH AA R JH
+discharged D IH S CH AA R JH D
+discharges D IH S CH AA R JH AH Z
+discharging D IH S CH AA R JH IH NG
+discher D IH SH ER
+dischinger D IH SH IH N JH ER
+disciple D IH S AY P AH L
+disciples D IH S AY P AH L Z
+disciplinarian D IH S IH P L IH N EH R IY AH N
+disciplinarians D IH S IH P L IH N EH R IY AH N Z
+disciplinary D IH S AH P L AH N EH R IY
+discipline D IH S AH P L AH N
+disciplined D IH S AH P L AH N D
+disciplines D IH S AH P L AH N Z
+disciplining D IH S AH P L AH N IH NG
+disclaim D IH S K L EY M
+disclaimed D IH S K L EY M D
+disclaimer D IH S K L EY M ER
+disclaimers D IH S K L EY M ER Z
+disclaiming D IH S K L EY M IH NG
+disclaims D IH S K L EY M Z
+discland D IH S K L AE N D
+disclose D IH S K L OW Z
+disclosed D IH S K L OW Z D
+discloses D IH S K L OW Z IH Z
+disclosing D IH S K L OW Z IH NG
+disclosure D IH S K L OW ZH ER
+disclosures D IH S K L OW ZH ER Z
+disco D IH S K OW
+discography D IH S K AO G R AH F IY
+discolor D IH S K AH L ER
+discoloration D IH S K AH L ER EY SH AH N
+discolorations D IH S K AH L ER EY SH AH N Z
+discolored D IH S K AH L ER D
+discolors D IH S K AH L ER Z
+discombobulate D IH S K AH M B AO B Y UW L EY T
+discombobulated D IH S K AH M B AO B Y UW L EY T AH D
+discombobulates D IH S K AH M B AO B Y UW L EY T S
+discombobulating D IH S K AH M B AO B Y UW L EY T IH NG
+discomfort D IH S K AH M F ER T
+disconcert D IH S K AH N S ER T
+disconcerting D IH S K AH N S ER T IH NG
+disconnect D IH S K AH N EH K T
+disconnected D IH S K AH N EH K T IH D
+disconnecting D IH S K AH N EH K T IH NG
+disconnection D IH S K AH N EH K SH AH N
+disconnects D IH S K AH N EH K T S
+discontent D IH S K AH N T EH N T
+discontented D IH S K AH N T EH N T IH D
+discontentedly D IH S K AH N T EH N T IH D L IY
+discontentedness D IH S K AH N T EH N T IH D N AH S
+discontents D IH S K AH N T EH N T S
+discontinuance D IH S K AH N T IH N Y UW AH N S
+discontinuation D IH S K AH N T IH N Y UW EY SH AH N
+discontinue D IH S K AH N T IH N Y UW
+discontinued D IH S K AH N T IH N Y UW D
+discontinuing D IH S K AH N T IH N Y UW IH NG
+discontinuity D IH S K AA N T IH N UW IH T IY
+discord D IH S K AO R D
+discordant D IH S K AO R D AH N T
+discos D IH S K OW Z
+discotheque D IH S K OW T EH K
+discount D IH S K AW N T
+discountable D IH S K AW N T AH B AH L
+discounted D IH S K AW N T IH D
+discounted(2) D IH S K AW N IH D
+discounter D IH S K AW N T ER
+discounters D IH S K AW N T ER Z
+discounters(2) D IH S K AW N ER R Z
+discounting D IH S K AW N T IH NG
+discounting(2) D IH S K AW N IH NG
+discounts D IH S K AW N T S
+discourage D IH S K ER IH JH
+discouraged D IH S K ER AH JH D
+discouraged(2) D IH S K ER IH JH D
+discouragement D IH S K ER IH JH M AH N T
+discourages D IH S K ER IH JH IH Z
+discouraging D IH S K ER AH JH IH NG
+discouraging(2) D IH S K ER IH JH IH NG
+discourse D IH S K AO R S
+discourses D IH S K AO R S IH Z
+discover D IH S K AH V ER
+discoverable D IH S K AH V ER AH B AH L
+discoverable(2) D IH S K AH V R AH B AH L
+discovered D IH S K AH V ER D
+discoveries D IH S K AH V ER IY Z
+discovering D IH S K AH V ER IH NG
+discovers D IH S K AH V ER Z
+discovery D IH S K AH V ER IY
+discovery's D IH S K AH V ER IY Z
+discovery's(2) D IH S K AH V R IY Z
+discovery(2) D IH S K AH V R IY
+discredit D IH S K R EH D AH T
+discredited D IH S K R EH D IH T IH D
+discrediting D IH S K R EH D AH T IH NG
+discredits D IH S K R EH D AH T S
+discreet D IH S K R IY T
+discreetly D IH S K R IY T L IY
+discrepancies D IH S K R EH P AH N S IY Z
+discrepancy D IH S K R EH P AH N S IY
+discrete D IH S K R IY T
+discretion D IH S K R EH SH AH N
+discretionary D IH S K R EH SH AH N EH R IY
+discretions D IH S K R EH SH AH N Z
+discriminate D IH S K R IH M AH N EY T
+discriminated D IH S K R IH M AH N EY T AH D
+discriminated(2) D IH S K R IH M AH N EY T IH D
+discriminates D IH S K R IH M AH N EY T S
+discriminating D IH S K R IH M AH N EY T IH NG
+discrimination D IH S K R IH M AH N EY SH AH N
+discriminative D IH S K R IH M AH N AH T IH V
+discriminatory D IH S K R IH M AH N AH T AO R IY
+discs D IH S K S
+discursive D IH S K ER S IH V
+discus D IH S K AH S
+discuss D IH S K AH S
+discussed D IH S K AH S T
+discusses D IH S K AH S AH Z
+discusses(2) D IH S K AH S IH Z
+discussing D IH S K AH S IH NG
+discussion D IH S K AH SH AH N
+discussions D IH S K AH SH AH N Z
+disdain D IH S D EY N
+disdained D IH S D EY N D
+disdainful D IH S D EY N F AH L
+disdaining D IH S D EY N IH NG
+disdains D IH S D EY N Z
+dise D AY S
+dise(2) D AY Z
+disease D IH Z IY Z
+disease's D IH Z IY Z IH Z
+diseased D IH Z IY Z D
+diseases D IH Z IY Z AH Z
+diseases(2) D IH Z IY Z IH Z
+disembark D IH S EH M B AA R K
+disembarkation D IH S EH M B AA R K EY SH AH N
+disembodied D IH S IH B AA D IY D
+disembody D IH S IH B AA D IY
+disenchanted D IH S IH N CH AE N T IH D
+disenchanted(2) D IH S IH N CH AE N IH D
+disenchantment D IH S IH N CH AE N T M AH N T
+disenfranchise D IH S IH N F R AE N CH AY Z
+disenfranchised D IH S IH N F R AE N CH AY Z D
+disenfranchisement D IH S IH N F R AE N CH AY Z M AH N T
+disengage D IH S IH N G EY JH
+disengaged D IH S IH N G EY JH D
+disengagement D IH S IH N G EY JH M AH N T
+disengaging D IH S IH N G EY JH IH NG
+disentangle D IH S AH N T AE NG G AH L
+disequilibrium D IH S IY K W AH L IH B R IY AH M
+disestablishment D IH S IH S T AE B L IH SH M AH N T
+disfavor D IH S F EY V ER
+disfavoring D IH S F EY V ER IH NG
+disfigure D IH S F IH G Y ER
+disfigured D IH S F IH G Y ER D
+disfigurement D IH S F IH G Y ER M EH N T
+disfiguring D IH S F IH G Y ER IH NG
+disgorge D IH S G AO R JH
+disgorged D IH S G AO R JH D
+disgorgement D IH S G AO R JH M AH N T
+disgrace D IH S G R EY S
+disgraced D IH S G R EY S T
+disgraceful D IH S G R EY S F AH L
+disgruntled D IH S G R AH N T AH L D
+disgruntled(2) D IH S G R AH N AH L D
+disgruntlement D IH S G R AH N T AH L M AH N T
+disgruntling D IH S G R AH N T AH L IH NG
+disgruntling(2) D IH S G R AH N T L IH NG
+disguise D IH S G AY Z
+disguised D IH S G AY Z D
+disguises D IH S G AY Z IH Z
+disguising D IH S G AY Z IH NG
+disgust D IH S G AH S T
+disgusted D IH S G AH S T AH D
+disgusted(2) D IH S G AH S T IH D
+disgusting D IH S G AH S T IH NG
+disgusts D IH S G AH S T S
+disgusts(2) D IH S G AH S S
+disgusts(3) D IH S G AH S
+dish D IH SH
+disharmony D IH S HH AA R M AH N IY
+disharoon D IH SH ER UW N
+dishaw D IH SH AO
+disheartened D IH S HH AA R T AH N D
+disheartening D IH S HH AA R T AH N IH NG
+disheartening(2) D IH S HH AA R T N IH NG
+dished D IH SH T
+disher D IH SH ER
+dishes D IH SH AH Z
+dishes(2) D IH SH IH Z
+dishevel D IH SH EH V AH L
+disheveled D IH SH EH V AH L D
+dishing D IH SH IH NG
+dishman D IH SH M AH N
+dishner D IH SH N ER
+dishon D IH S AH N
+dishonest D IH S AA N AH S T
+dishonestly D IH S AO N AH S T L IY
+dishonesty D IH S AA N AH S T IY
+dishong D IH S AO NG
+dishonor D IH S AA N ER
+dishonorable D IH S AA N ER AH B AH L
+dishonored D IH S AA N ER D
+dishwasher D IH SH W AA SH ER
+dishwashers D IH SH W AA SH ER Z
+dishwashing D IH SH W AA SH IH NG
+disillusion D IH S IH L UW ZH AH N
+disillusioned D IH S IH L UW ZH AH N D
+disillusioning D IH S IH L UW ZH AH N IH NG
+disillusionment D IH S IH L UW ZH AH N M AH N T
+disilvestro D IH S IY L V EH S T R OW
+disimone D IH S IY M OW N IY
+disincentive D IH S IH N S EH N T IH V
+disincentives D IH S IH N S EH N T IH V Z
+disinclination D IH S IH N K L AH N EY SH AH N
+disincline D IH S IH N K L AY N
+disinclined D IH S IH N K L AY N D
+disinfect D IH S IH N F EH K T
+disinfectant D IH S IH N F EH K T AH N T
+disinfectants D IH S IH N F EH K T AH N T S
+disinfection D IH S IH N F EH K SH AH N
+disinflate D IH S IH N F L EY T
+disinflation D IH S IH N F L EY SH AH N
+disinflationary D IH S IH N F L EY SH AH N EH R IY
+disinform D IH S IH N F AO R M
+disinformation D IH Z IH N F ER M EY SH AH N
+disingenuous D IH S IH N JH EH N Y UW AH S
+disingenuousness D IH S IH N JH EH N Y UW AH S N AH S
+disintegrate D IH S IH N T AH G R EY T
+disintegrated D IH S IH N T AH G R EY T IH D
+disintegrates D IH S IH N T AH G R EY T S
+disintegrating D IH S IH N T AH G R EY T IH NG
+disintegration D IH S IH N T AH G R EY SH AH N
+disintegration(2) D IH S IH N AH G R EY SH AH N
+disinterest D IH S IH N T ER AH S T
+disinterested D IH S IH N T R IH S T IH D
+disinterested(2) D IH S IH N R IH S T IH D
+disinvestment D IH S IH N V EH S T M AH N T
+disinvestment(2) D IH S IH N V EH S M AH N T
+disinvite D IH S IH N V AY T
+disinvited D IH S IH N V AY T IH D
+disjoint D IH S JH OY N T
+disjointed D IH S JH OY N T IH D
+disk D IH S K
+diskette D IH S K EH T
+diskettes D IH S K EH T S
+diskin D IH S K IH N
+diskless D IH S K L AH S
+disks D IH S K S
+dislike D IH S L AY K
+disliked D IH S L AY K T
+dislikes D IH S L AY K S
+disliking D IH S L AY K IH NG
+dislocate D IH S L OW K EY T
+dislocated D IH S L OW K EY T IH D
+dislocation D IH S L OW K EY SH AH N
+dislocations D IH S L OW K EY SH AH N Z
+dislodge D IH S L AA JH
+dislodged D IH S L AA JH D
+dislodging D IH S L AA JH IH NG
+disloyal D IH S L OY AH L
+disloyalty D IH S L OY AH L T IY
+dismal D IH Z M AH L
+dismally D IH Z M AH L IY
+dismantle D IH S M AE N T AH L
+dismantle(2) D IH S M AE N AH L
+dismantled D IH S M AE N T AH L D
+dismantled(2) D IH S M AE N AH L D
+dismantlement D IH S M AE N T AH L M AH N T
+dismantles D IH S M AE N T AH L Z
+dismantling D IH S M AE N T AH L IH NG
+dismantling(2) D IH S M AE N AH L IH NG
+dismantling(3) D IH S M AE N T L IH NG
+dismay D IH S M EY
+dismayed D IH S M EY D
+dismaying D IH S M EY IH NG
+dismays D IH S M EY Z
+dismember D IH S M EH M B ER
+dismembered D IH S M EH M B ER D
+dismembering D IH S M EH M B ER IH NG
+dismemberment D IH S M EH M B ER M AH N T
+dismiss D IH S M IH S
+dismissal D IH S M IH S AH L
+dismissals D IH S M IH S AH L Z
+dismissed D IH S M IH S T
+dismisses D IH S M IH S IH Z
+dismissing D IH S M IH S IH NG
+dismissive D IH S M IH S IH V
+dismore D IH S M AO R
+dismuke D IH S M Y UW K
+dismukes D IH S M Y UW K S
+dismutase D IH S M Y UW T EY Z
+disney D IH Z N IY
+disney's D IH Z N IY Z
+disneyland D IH Z N IY L AE N D
+disneyworld D IH Z N IY W ER L D
+disobedience D IH S AH B IY D IY AH N S
+disobedience(2) D IH S OW B IY D IY AH N S
+disobedient D IH S AH B IY D IY AH N T
+disobedient(2) D IH S OW B IY D IY AH N T
+disobey D IH S AH B EY
+disobeyed D IH S OW B EY D
+disobeying D IH S OW B EY IH NG
+dison D IH S AH N
+disorder D IH S AO R D ER
+disordered D IH S AO R D ER D
+disorderly D IH S AO R D ER L IY
+disorders D IH S AO R D ER Z
+disorganization D IH S AO R G AH N AH Z EY SH AH N
+disorganize D IH S AO R G AH N AY Z
+disorganized D IH S AO R G AH N AY Z D
+disorient D IH S AO R IY EH N T
+disorientation D IH S AO R IY AH N T EY SH AH N
+disoriented D IH S AO R IY EH N T IH D
+disorienting D IH S AO R IY EH N T IH NG
+disown D IH S OW N
+disowned D IH S OW N D
+dispair D IH S P EH R
+disparage D IH S P EH R IH JH
+disparaged D IH S P EH R IH JH D
+disparages D IH S P EH R IH JH IH Z
+disparaging D IH S P EH R IH JH IH NG
+disparagingly D IH S P EH R IH JH IH NG L IY
+disparate D IH S P ER IH T
+disparate(2) D IH S P EH R IH T
+disparities D IH S P EH R AH T IY Z
+disparity D IH S P EH R AH T IY
+dispassionate D IH S P AE SH AH N AH T
+dispassionately D IH S P AE SH AH N AH T L IY
+dispatch D IH S P AE CH
+dispatched D IH S P AE CH T
+dispatcher D IH S P AE CH ER
+dispatcher's D IH S P AE CH ER Z
+dispatchers D IH S P AE CH ER Z
+dispatches D IH S P AE CH IH Z
+dispatching D IH S P AE CH IH NG
+dispel D IH S P EH L
+dispell D IH S P EH L
+dispelled D IH S P EH L D
+dispelling D IH S P EH L IH NG
+dispels D IH S P EH L Z
+dispensable D IH S P EH N S AH B AH L
+dispensary D IH S P EH N S ER IY
+dispensary(2) D IH S P EH N S EH R IY
+dispensation D IH S P AH N S EY SH AH N
+dispense D IH S P EH N S
+dispensed D IH S P EH N S T
+dispenser D IH S P EH N S ER
+dispensers D IH S P EH N S ER Z
+dispenses D IH S P EH N S IH Z
+dispensing D IH S P EH N S IH NG
+dispenza D IH S P EH N Z AH
+dispersal D IH S P ER S AH L
+dispersant D IH S P ER S AH N T
+dispersants D IH S P ER S AH N T S
+disperse D IH S P ER S
+dispersed D IH S P ER S T
+dispersing D IH S P ER S IH NG
+dispersion D IH S P ER ZH AH N
+dispersive D IH S P ER S IH V
+dispirited D IH S P IH R AH T IH D
+dispiriting D IH S P IH R IH T IH NG
+displace D IH S P L EY S
+displaced D IH S P L EY S T
+displacement D IH S P L EY S M AH N T
+displacements D IH S P L EY S M AH N T S
+displaces D IH S P L EY S IH Z
+displacing D IH S P L EY S IH NG
+display D IH S P L EY
+displayed D IH S P L EY D
+displaying D IH S P L EY IH NG
+displays D IH S P L EY Z
+displaywrite D IH S P L EY R AY T
+displease D IH S P L IY Z
+displeased D IH S P L IY Z D
+displeasure D IH S P L EH ZH ER
+disposable D IH S P OW Z AH B AH L
+disposables D IH S P OW Z AH B AH L Z
+disposal D IH S P OW Z AH L
+disposals D IH S P OW Z AH L Z
+dispose D IH S P OW Z
+disposed D IH S P OW Z D
+disposer D IH S P OW Z ER
+disposes D IH S P OW Z IH Z
+disposing D IH S P OW Z IH NG
+disposition D IH S P AH Z IH SH AH N
+dispositions D IH S P AH Z IH SH AH N Z
+dispositive D IH S P AA Z AH T IH V
+dispossess D IH S P AH Z EH S
+dispossessed D IH S P AH Z EH S T
+disproportionate D IH S P R AH P AO R SH AH N IH T
+disproportionately D IH S P R AH P AO R SH AH N AH T L IY
+disprove D IH S P R UW V
+disproved D IH S P R UW V D
+disproven D IH S P R UW V IH N
+disproves D IH S P R UW V Z
+disputable D IH S P Y UW T AH B AH L
+disputation D IH S P Y UW T EY SH AH N
+dispute D IH S P Y UW T
+disputed D IH S P Y UW T AH D
+disputed(2) D IH S P Y UW T IH D
+disputes D IH S P Y UW T S
+disputing D IH S P Y UW T IH NG
+disqualification D IH S K W AA L AH F AH K EY SH AH N
+disqualified D IH S K W AA L AH F AY D
+disqualifies D IH S K W AA L AH F AY Z
+disqualify D IH S K W AA L AH F AY
+disqualifying D IH S K W AA L AH F AY IH NG
+disque D IH S K
+disquiet D IH S K W AY AH T
+disquieting D IH S K W AY AH T IH NG
+disraeli D IH Z R EY L IY
+disregard D IH S R IH G AA R D
+disregarded D IH S R IH G AA R D IH D
+disregarding D IH S R IH G AA R D IH NG
+disregards D IH S R IH G AA R D Z
+disrepair D IH S R IH P EH R
+disreputable D IH S R EH P Y AH T AH B AH L
+disrepute D IH S R IH P Y UW T
+disrespect D IH S R IH S P EH K T
+disrespected D IH S R IH S P EH K T IH D
+disrespectful D IH S R IH S P EH K T F AH L
+disrespecting D IH S R IH S P EH K T IH NG
+disrespects D IH S R IH S P EH K T S
+disrupt D IH S R AH P T
+disrupted D IH S R AH P T IH D
+disrupting D IH S R AH P T IH NG
+disruption D IH S R AH P SH AH N
+disruptions D IH S R AH P SH AH N Z
+disruptive D IH S R AH P T IH V
+disrupts D IH S R AH P T S
+diss D IH S
+dissatisfaction D IH S AE T IH S F AE K SH AH N
+dissatisfied D IH S AE T AH S F AY D
+dissatisfy D IH S AE T AH S F AY
+dissect D AY S EH K T
+dissected D AY S EH K T AH D
+dissecting D AY S EH K T IH NG
+dissection D AY S EH K SH AH N
+dissections D AY S EH K SH AH N Z
+dissects D AY S EH K T S
+dissects(2) D AY S EH K S
+dissemble D IH S EH M B AH L
+dissembling D IH S EH M B L IH NG
+disseminate D IH S EH M AH N EY T
+disseminated D IH S EH M AH N EY T AH D
+disseminates D IH S EH M AH N EY T S
+disseminating D IH S EH M AH N EY T IH NG
+dissemination D IH S EH M AH N EY SH AH N
+dissension D IH S EH N SH AH N
+dissent D IH S EH N T
+dissented D IH S EH N T IH D
+dissented(2) D IH S EH N IH D
+dissenter D IH S EH N T ER
+dissenters D IH S EH N T ER Z
+dissenters(2) D IH S EH N ER Z
+dissenting D IH S EH N T IH NG
+dissenting(2) D IH S EH N IH NG
+dissents D IH S EH N T S
+dissertation D IH S ER T EY SH AH N
+disservice D IH S ER V AH S
+dissidence D IH S AH D IH N S
+dissident D IH S AH D IH N T
+dissidents D IH S AH D AH N T S
+dissidents' D IH S AH D AH N T S
+dissimilar D IH S IH M AH L ER
+dissimilarity D IH S IH M AH L AE R AH T IY
+dissing D IH S IH NG
+dissinger D IH S IH N JH ER
+dissipate D IH S AH P EY T
+dissipated D IH S AH P EY T IH D
+dissipates D IH S AH P EY T S
+dissipating D IH S AH P EY T IH NG
+dissipation D IH S IH P EY SH AH N
+dissipative D IH S AH P EY T IH V
+dissociate D IH S OW S IY EY T
+dissociation D IH S OW S IY EY SH AH N
+dissolution D IH S AH L UW SH AH N
+dissolve D IH Z AA L V
+dissolved D IH Z AA L V D
+dissolver D IH Z AA L V ER
+dissolvers D IH Z AA L V ER Z
+dissolves D IH Z AA L V Z
+dissolving D IH Z AO L V IH NG
+dissonance D IH S AH N AH N S
+dissonant D IH S AH N AH N T
+dissuade D IH S W EY D
+dissuaded D IH S W EY D IH D
+dissymmetric D IH S IH M EH T R IH K
+dissymmetry D IH S IH M AH T R IY
+distad D IH S T AH D
+distal D IH S T AH L
+distance D IH S T AH N S
+distanced D IH S T AH N S T
+distances D IH S T AH N S AH Z
+distances(2) D IH S T AH N S IH Z
+distancing D IH S T AH N S IH NG
+distant D IH S T AH N T
+distasi D IH S T AA S IY
+distasio D IH S T AA S IY OW
+distaste D IH S T EY S T
+distasteful D IH S T EY S T F AH L
+distefano D IH S T EH F AA N OW
+distel D IH S T AH L
+distemper D IH S T EH M P ER
+distend D IH S T EH N D
+distended D IH S T EH N D IH D
+distil D IH S T IH L
+distill D IH S T IH L
+distillate D IH S T AH L EY T
+distillate(2) D IH S T AH L AH T
+distillates D IH S T AH L EY T S
+distillation D IH S T AH L EY SH AH N
+distilled D IH S T IH L D
+distiller D IH S T IH L ER
+distiller's D IH S T IH L ER Z
+distilleries D IH S T IH L ER IY Z
+distillers D IH S T IH L ER Z
+distillers' D IH S T IH L ER Z
+distillers's D IH S T IH L ER Z IH Z
+distillery D IH S T IH L ER IY
+distilling D IH S T IH L IH NG
+distills D IH S T IH L Z
+distinct D IH S T IH NG K T
+distinction D IH S T IH NG K SH AH N
+distinctions D IH S T IH NG K SH AH N Z
+distinctive D IH S T IH NG K T IH V
+distinctively D IH S T IH NG K T IH V L IY
+distinctiveness D IH S T IH NG K T IH V N AH S
+distinctly D IH S T IH NG K T L IY
+distinguish D IH S T IH NG G W IH SH
+distinguishable D IH S T IH NG G W IH SH AH B AH L
+distinguished D IH S T IH NG G W IH SH T
+distinguishes D IH S T IH NG G W IH SH IH Z
+distinguishing D IH S T IH NG G W IH SH IH NG
+distler D IH S T L ER
+distort D IH S T AO R T
+distorted D IH S T AO R T AH D
+distorted(2) D IH S T AO R T IH D
+distorting D IH S T AO R T IH NG
+distortion D IH S T AO R SH AH N
+distortions D IH S T AO R SH AH N Z
+distorts D IH S T AO R T S
+distract D IH S T R AE K T
+distracted D IH S T R AE K T AH D
+distracted(2) D IH S T R AE K T IH D
+distracting D IH S T R AE K T IH NG
+distraction D IH S T R AE K SH AH N
+distractions D IH S T R AE K SH AH N Z
+distracts D IH S T R AE K T S
+distraught D IH S T R AO T
+distress D IH S T R EH S
+distressed D IH S T R EH S T
+distresses D IH S T R EH S IH Z
+distressing D IH S T R EH S IH NG
+distressingly D IH S T R EH S IH NG L IY
+distribute D IH S T R IH B Y UW T
+distributed D IH S T R IH B Y AH T AH D
+distributes D IH S T R IH B Y UW T S
+distributing D IH S T R IH B Y UW T IH NG
+distribution D IH S T R AH B Y UW SH AH N
+distributions D IH S T R AH B Y UW SH AH N Z
+distributive D IH S T R IH B Y UW T IH V
+distributor D IH S T R IH B Y AH T ER
+distributor's D IH S T R IH B Y UW T ER Z
+distributors D IH S T R IH B Y AH T ER Z
+distributors' D IH S T R IH B Y AH T ER Z
+distributorship D IH S T R IH B Y UW T ER SH IH P
+distributorships D IH S T R IH B Y UW T ER SH IH P S
+district D IH S T R IH K T
+district's D IH S T R IH K T S
+districting D IH S T R IH K T IH N G
+districts D IH S T R IH K T S
+distrigas D IH S T R IY G AH S
+distron D IH S T R AA N
+distrust D IH S T R AH S T
+distrusted D IH S T R AH S T AH D
+distrusted(2) D IH S T R AH S T IH D
+distrustful D IH S T R AH S T F AH L
+distrusts D IH S T R AH S T S
+distrusts(2) D IH S T R AH S S
+distrusts(3) D IH S T R AH S
+disturb D IH S T ER B
+disturbance D IH S T ER B AH N S
+disturbances D IH S T ER B AH N S AH Z
+disturbances(2) D IH S T ER B AH N S IH Z
+disturbed D IH S T ER B D
+disturbing D IH S T ER B IH NG
+disturbingly D IH S T ER B IH NG L IY
+disturbs D IH S T ER B Z
+disunion D IH S Y UW N Y AH N
+disunity D IH S Y UW N AH T IY
+disuse D IH S Y UW S
+ditch D IH CH
+ditched D IH CH T
+ditches D IH CH AH Z
+ditches(2) D IH CH IH Z
+ditching D IH CH IH NG
+dith D IH TH
+dither D IH DH ER
+dithering D IH DH ER IH NG
+dithers D IH DH ER Z
+dithyramb D IH TH ER AE M
+ditka D IH T K AH
+ditka's D IH T K AH Z
+ditlow D IH T L OW
+ditmars D IH T M ER Z
+ditmer D IH T M ER
+ditmore D IH T M AO R
+ditomasso D IH T OW M AA S OW
+ditommaso D IH T OW M AA S OW
+ditsy D IH T S IY
+dittberner D IH T B ER N ER
+dittemore D IH T EH M AO R
+ditter D IH T ER
+ditties D IH T IY Z
+dittman D IH T M AH N
+dittmann D IH T M AH N
+dittmar D IH T M ER
+dittmer D IH T M ER
+ditto D IH T OW
+ditton D IH T AH N
+dittrich D IH T R IH K
+dittus D IH T AH S
+ditty D IH T IY
+ditullio D IH T AH L IY OW
+ditzel D IH T Z AH L
+ditzler D IH T S L ER
+diuretic D AY UW R EH T IH K
+diuretics D AY UW R EH T IH K S
+diurnal D AY ER N AH L
+diurnally D AY ER N AH L IY
+diva D IY V AH
+divad D IH V AE D
+divalent D AY V EY L AH N T
+divall D IH V AH L
+divan D IH V AE N
+divas D IY V AH Z
+dive D AY V
+dived D AY V D
+divelbiss D IH V EH L B IH S
+diveley D IH V IH L IY
+dively D AY V L IY
+diven D AY V AH N
+divens D AY V AH N Z
+diver D AY V ER
+diver's D AY V ER Z
+diverge D IH V ER JH
+diverged D AY V ER JH D
+divergence D AY V ER JH AH N S
+divergence(2) D IH V ER JH AH N S
+divergences D AY V ER JH AH N S IH Z
+divergent D AY V ER JH AH N T
+divergent(2) D IH V ER JH AH N T
+diverges D AY V ER JH IH Z
+diverging D AY V ER JH IH NG
+divers D AY V ER Z
+diverse D AY V ER S
+diverse(2) D IH V ER S
+diversicare D IH V ER S IH K EH R
+diversification D AY V ER S AH F AH K EY SH AH N
+diversification(2) D IH V ER S AH F AH K EY SH AH N
+diversifications D AY V ER S AH F AH K EY SH AH N Z
+diversifications(2) D IH V ER S AH F AH K EY SH AH N Z
+diversified D AY V ER S AH F AY D
+diversified(2) D IH V ER S AH F AY D
+diversify D AY V ER S AH F AY
+diversify(2) D IH V ER S AH F AY
+diversifying D AY V ER S AH F AY IH NG
+diversifying(2) D IH V ER S AH F AY IH NG
+diversion D AY V ER ZH AH N
+diversion(2) D IH V ER ZH AH N
+diversionary D AY V ER ZH AH N EH R IY
+diversionary(2) D IH V ER ZH AH N EH R IY
+diversions D IH V ER ZH AH N Z
+diversions(2) D AY V ER ZH AH N Z
+diversity D IH V ER S AH T IY
+diversity(2) D IH V ER S IH T IY
+diversity(3) D AY V ER S AH T IY
+diversity(4) D AY V ER S IH T IY
+divert D AY V ER T
+divert(2) D IH V ER T
+diverted D AY V ER T IH D
+diverted(2) D IH V ER T IH D
+diverticula D AY V ER T IH K Y AH L AH
+diverticulum D AY V ER T IH K Y AH L AH M
+divertimento D IH V ER T AH M EH N T OW
+diverting D AY V ER T IH NG
+diverting(2) D IH V ER T IH NG
+diverts D AY V ER T S
+diverts(2) D IH V ER T S
+dives D AY V Z
+divest D AY V EH S T
+divest(2) D IH V EH S T
+divested D AY V EH S T IH D
+divesting D AY V EH S T IH NG
+divestiture D IH V EH S T IH CH ER
+divestiture(2) D AY V EH S T IH CH ER
+divestitures D IH V EH S T IH CH ER Z
+divestitures(2) D AY V EH S T IH CH ER Z
+divestment D AY V EH S T M AH N T
+divestment(2) D AY V EH S M AH N T
+divestment(3) D IH V EH S M AH N T
+divestments D AY V EH S T M AH N T S
+divestments(2) D AY V EH S M AH N T S
+divestments(3) D IH V EH S M AH N T S
+divests D AY V EH S T S
+divests(2) D AY V EH S S
+divests(3) D AY V EH S
+divi D IY V IY
+divide D IH V AY D
+divided D IH V AY D AH D
+dividend D IH V IH D EH N D
+dividend's D IH V AH D EH N D Z
+dividends D IH V AH D EH N D Z
+divider D IH V AY D ER
+divides D IH V AY D Z
+dividing D IH V AY D IH NG
+divination D IH V AH N EY SH AH N
+divincenzo D IH V IY N CH EH N Z OW
+divine D IH V AY N
+divinely D IH V AY N L IY
+diviney D IH V IH N IY
+diving D AY V IH NG
+divining D AH V AY N IH NG
+divinitas D IH V IH N IY T AH S
+divinities D IH V IH N AH T IY Z
+divinity D IH V IH N AH T IY
+divirgilio D IH V IH R JH IY L IY OW
+divis D IY V IH S
+divisible D IH V IH Z AH B AH L
+division D IH V IH ZH AH N
+division's D IH V IH ZH AH N Z
+divisional D IH V IH ZH AH N AH L
+divisions D IH V IH ZH AH N Z
+divisions' D IH V IH ZH AH N Z
+divisive D IH V AY S IH V
+divisiveness D IH V AY S IH V N AH S
+divison D IH V IH ZH AH N
+divison(2) D IH V IH S AH N
+divisor D IH V AY Z ER
+divita D IH V IY T AH
+divito D IH V IY T OW
+divorce D IH V AO R S
+divorced D IH V AO R S T
+divorcee D AH V AO R S IY
+divorcee(2) D AH V AO R S EY
+divorces D IH V AO R S IH Z
+divorcing D IH V AO R S IH NG
+divulge D IH V AH L JH
+divulge(2) D AY V AH L JH
+divulged D IH V AH L JH D
+divulged(2) D AY V AH L JH D
+divulging D IH V AH L JH IH NG
+divulging(2) D AY V AH L JH IH NG
+divvied D IH V IY D
+divvy D IH V IY
+diwa D IY W AH
+diwali D IH W AA L IY
+dix D IH K S
+dixie D IH K S IY
+dixieland D IH K S IY L AE N D
+dixon D IH K S AH N
+dixon's D IH K S AH N Z
+dixons D IH K S AH N Z
+dixson D IH K S AH N
+dixville D IH K S V IH L
+dixy D IH K S IY
+dizon D IH Z AH N
+dizziness D IH Z IY N AH S
+dizzy D IH Z IY
+dizzying D IH Z IY IH NG
+djakarta JH AH K AA R T AH
+djakarta's JH AH K AA R T AH Z
+djibouti JH IH B UW T IY
+djukanovic JH UW K AE N AH V IH K
+djukanovic(2) JH AH K AE N AH V IH CH
+djurdjevic JH ER JH AH V IH K
+dk D IY K EY
+dlouhy D AH L AW IY
+dlugos D AH L UW G OW S
+dlugosz D AH L UW G OW S
+dlugosz(2) D AH L UW G OW SH
+dmitri D AH M IY T R IY
+dmitri(2) D M IY T R IY
+dmz D IY EH M Z IY
+dna D IY EH N EY
+dnase D IY EH N EY S
+dnase(2) D IY EH N EY Z
+dnc D IY EH N S IY
+dniester D AH N IY S T ER
+do D UW
+do's D UW Z
+doable D UW AH B AH L
+doak D OW K
+doan D OW N
+doan's D OW N Z
+doane D OW N
+doanh D OW N
+doanna D OW N AH
+doar D AO R
+dob D AA B
+dobb D AA B
+dobberstein D AA B ER S T IY N
+dobberstein(2) D AA B ER S T AY N
+dobbie D AA B IY
+dobbin D AA B IH N
+dobbins D AA B IH N Z
+dobbs D AA B Z
+dobek D OW B IH K
+dober D OW B ER
+doberman D OW B ER M AH N
+doberstein D OW B ER S T AY N
+doberstein(2) D OW B ER S T IY N
+dobesh D AA B IH SH
+dobey D AA B IY
+dobias D OW B IY AH Z
+dobie D AA B IY
+dobies D OW B IY Z
+dobis D OW B IH S
+dobkin D AA B K IH N
+dobkins D AA B K IH N Z
+doble D OW B AH L
+dobler D OW B AH L ER
+dobler(2) D OW B L ER
+dobmeier D AA B M AY ER
+doboj D OW B AO JH
+dobos D OW B OW Z
+dobosz D AA B AH SH
+dobransky D AH B R AE N S K IY
+dobratz D AA B R AH T S
+dobrimir D AH B R IY M IH R
+dobrin D AA B R IH N
+dobrinja D AH B R IY N JH AH
+dobrinja(2) D AH B R IY N Y AH
+dobrins D AA B R IH N Z
+dobrinski D AH B R IH N S K IY
+dobrowolski D AH B R AW OW L S K IY
+dobrowski D AH B R AO F S K IY
+dobry D AA B R IY
+dobrynin D AA B R IH N IH N
+dobrynin(2) D AH B R IY N IH N
+dobrzynski D OW B R AH ZH IH N S K IY
+dobson D AA B S AH N
+dobson's D AA B S AH N Z
+dobsons D AA B S AH N Z
+doby D OW B IY
+dobyns D OW B IH N Z
+doc D AA K
+docent D OW S AH N T
+docents D OW S AH N T S
+docherty D AA CH ER T IY
+dochow D OW CH AW
+dochterman D AA K T ER M AH N
+docie D AA K IY
+docila D AA S IH L AH
+docile D AA S AH L
+docility D AA S IH L AH T IY
+dock D AA K
+dock's D AA K S
+docked D AA K T
+docken D AA K AH N
+dockendorf D AA K IH N D AO R F
+docker D AA K ER
+dockers D AA K ER Z
+dockery D AA K ER IY
+docket D AA K AH T
+dockets D AA K AH T S
+dockham D AA K HH AH M
+dockiers D AA K Y ER Z
+docking D AA K IH NG
+dockings D AA K IH NG Z
+dockins D AA K IH N Z
+dockland D AA K L AH N D
+docklands D AA K L AH N D Z
+docks D AA K S
+dockside D AA K S AY D
+dockson D AA K S AH N
+dockstader D AA K S T AH D ER
+dockter D AA K T ER
+dockworker D AA K W ER K ER
+dockworkers D AA K W ER K ER Z
+dockyard D AA K Y AA R D
+doctor D AA K T ER
+doctor's D AA K T ER Z
+doctor(2) D AO K T ER
+doctoral D AA K T ER AH L
+doctorate D AA K T ER AH T
+doctorates D AA K T ER AH T S
+doctored D AA K T ER D
+doctoring D AA K T ER IH NG
+doctors D AA K T ER Z
+doctors' D AA K T ER Z
+doctrinaire D AA K T R AH N EH R
+doctrinal D AA K T R AH N AH L
+doctrine D AA K T R AH N
+doctrine's D AA K T R AH N Z
+doctrine(2) D AO K T ER IH N
+doctrines D AA K T R AH N Z
+docudrama D OW K AH D R AE M AH
+document D AA K Y AH M EH N T
+document(2) D AA K Y UW M EH N T
+documenta D AA K Y UW M EH N T AH
+documentaries D AA K Y AH M EH N T ER IY Z
+documentaries(2) D AA K Y AH M EH N ER IY Z
+documentaries(3) D AA K Y UW M EH N T ER IY Z
+documentaries(4) D AA K Y UW M EH N ER IY Z
+documentary D AA K Y AH M EH N T ER IY
+documentary(2) D AA K Y AH M EH N ER IY
+documentary(3) D AA K Y UW M EH N T ER IY
+documentary(4) D AA K Y UW M EH N ER IY
+documentation D AA K Y AH M EH N T EY SH AH N
+documentation(2) D AA K Y UW M EH N T EY SH AH N
+documented D AA K Y AH M EH N T AH D
+documented(2) D AA K Y AH M EH N AH D
+documented(3) D AA K Y UW M EH N T AH D
+documented(4) D AA K Y UW M EH N AH D
+documenting D AA K Y AH M AH N T IH NG
+documenting(2) D AA K Y AH M AH N IH NG
+documenting(3) D AA K Y UW M AH N T IH NG
+documenting(4) D AA K Y UW M AH N IH NG
+documents D AA K Y AH M AH N T S
+documents(2) D AA K Y UW M AH N T S
+dodaro D OW D AA R OW
+dodd D AA D
+dodd's D AA D Z
+doddering D AA D ER IH NG
+doddington D AA D IH N T AH N
+doddington(2) D AA D IH NG T AH N
+doddridge D AA D R IH JH
+dodds D AA D Z
+dodge D AA JH
+dodge's D AA JH IH Z
+dodged D AA JH D
+dodgen D AA JH AH N
+dodger D AA JH ER
+dodger's D AA JH ER Z
+dodgers D AA JH ER Z
+dodgers' D AA JH ER Z
+dodges D AA JH IH Z
+dodging D AA JH IH NG
+dodi D OW D IY
+dodi's D OW D IY Z
+dodo D OW D OW
+dodo's D OW D OW Z
+dodos D OW D OW Z
+dodrill D AA D R AH L
+dodson D AA D S AH N
+dodsworth D AA D S W ER TH
+doe D OW
+doe's D OW Z
+doebler D OW B AH L ER
+doebler(2) D OW B L ER
+doeden D OW D AH N
+doege D OW JH
+doehring D AO R IH NG
+doell D OW L
+doenges D OW N JH IH Z
+doepke D OW P K
+doepker D OW P K ER
+doer D UW R
+doerfler D AO R F AH L ER
+doerfler(2) D AO R F L ER
+doerflinger D AO R F AH L IH NG ER
+doerflinger(2) D AO R F L IH NG ER
+doering D UW ER IH NG
+doernberg D AO R N B ER G
+doerner D AO R N ER
+doerr D AO R
+doers D UW ER Z
+doersam D AO R S AH M
+does D AH Z
+does(2) D IH Z
+doescher D OW SH ER
+doesn't D AH Z AH N T
+doesn't(2) D AH Z AH N
+doetsch D OW CH
+dofasco D AH F AE S K OW
+doff D AO F
+doffing D AO F IH NG
+doffs D AO F S
+dog D AO G
+dog's D AO G Z
+dogan D OW G AH N
+dogbane D AO G B EY N
+dogberry D AO G B EH R IY
+doge D OW JH
+dogear D AA G IY R
+dogeared D AA G IY R D
+dogearing D AA G IY R IH NG
+dogears D AA G IY R Z
+dogfight D AA G F AY T
+dogfights D AO G F AY T S
+dogfish D AO G F IH SH
+dogged D AO G D
+doggedly D AO G AH D L IY
+doggerel D AA G ER AH L
+doggett D AA G IH T
+doggie D AO G IY
+doggies D AO G IY Z
+dogging D AO G IH NG
+doggone D AO G AO N
+doggy D AO G IY
+doggy's D AO G IY Z
+doghouse D AO G HH AW S
+doghouses D AO G HH AW S IH Z
+dogle D OW G AH L
+dogle(2) D AA G AH L
+doglike D AO G L AY K
+dogma D AA G M AH
+dogmatic D AA G M AE T IH K
+dogmatic(2) D AO G M AE T IH K
+dogmatically D AA G M AE T IH K L IY
+dogmatism D AA G M AH T IH Z AH M
+dogs D AA G Z
+dogs' D AO G Z
+dogs(2) D AO G Z
+dogwood D AO G W UH D
+dogwoods D AO G W UH D Z
+doh D OW
+doheny D AA HH IH N IY
+doherty D OW ER T IY
+doherty(2) D AO R T IY
+doherty(3) D AA HH ER T IY
+dohm D AA M
+dohman D OW M AH N
+dohme D OW M
+dohmen D OW M EH N
+dohn D AA N
+dohnanyi D OW N AA N Y IY
+dohner D OW N ER
+dohr D AO R
+dohrman D AO R M AH N
+dohrmann D AO R M AH N
+dohse D OW S
+doi D OY
+doidge D OY JH
+doig D OY G
+doilies D OY L IY Z
+doily D OY L IY
+doin' D UW IH N
+doing D UW IH NG
+doings D UW IH NG Z
+doiron D OY R AO N
+doiron(2) D OY R AH N
+doke D OW K
+dokely D OW K L IY
+dokey D OW K IY
+dokken D AA K AH N
+doktor D AA K T ER
+dol D AA L
+dolak D OW L AH K
+dolan D OW L AH N
+doland D UW L AH N D
+dolata D OW L AA T AH
+dolbow D OW L B OW
+dolby D OW L B IY
+dolce D OW L CH EY
+dolch D OW L CH
+dold D OW L D
+dolder D OW L D ER
+doldrum D OW L D R AH M
+doldrums D OW L D R AH M Z
+dole D OW L
+dole's D OW L Z
+dolecki D AH L EH T S K IY
+doled D OW L D
+doleful D OW L F AH L
+dolen D OW L AH N
+dolence D OW L AH N S
+doles D OW L Z
+doles's D OW L Z IH Z
+doley D OW L IY
+dolezal D OW L EY Z AE L
+dolf D OW L F
+dolfi D OW L F IY
+dolgen D OW L JH EH N
+dolgin D OW L JH IH N
+dolin D OW L IH N
+dolinar D AA L IH N ER
+doling D OW L IH NG
+dolinger D OW L IH NG ER
+dolinski D AH L IH N S K IY
+dolinsky D AH L IH N S K IY
+doll D AA L
+doll's D AA L Z
+dollan D OW L AH N
+dollar D AA L ER
+dollar's D AA L ER Z
+dollar's(2) D AA L AH Z
+dollar's(3) D AO L ER Z
+dollar(2) D AO L ER
+dollard D AA L ER D
+dollarhide D AA L ER HH AY D
+dollars D AA L ER Z
+dollars' D AA L ER Z
+dollars(2) D AO L ER Z
+dolle D AA L
+dolled D AA L D
+dollens D AA L AH N Z
+dolley D AA L IY
+dollhouse D AA L HH AW S
+dollhouses D AA L HH AW S IH Z
+dollie D AA L IY
+dollinger D AA L IH NG ER
+dollins D AA L IH N Z
+dollison D AA L IH S AH N
+dolliver D AA L IH V ER
+dolloff D AA L AO F
+dollop D AA L AH P
+dolls D AA L Z
+dolly D AA L IY
+dolly's D AA L IY Z
+dolman D AA L M AH N
+dolney D OW L N IY
+dolomite D OW L AH M AY T
+dolomite's D OW L AH M AY T S
+dolomites D OW L AH M AY T S
+dolores D AH L AO R IH S
+dolorita D OW L AO R IY T AH
+dolorosa D OW L ER OW S AH
+dolph D OW L F
+dolphin D AA L F AH N
+dolphins D AA L F AH N Z
+dolphins' D AA L F AH N Z
+dols D AA L Z
+dolson D OW L S AH N
+dolton D OW L T AH N
+dom D AA M
+domagala D OW M AA G AA L AH
+domagalski D AH M AH G AA L S K IY
+domain D OW M EY N
+domaine D OW M EY N
+domains D OW M EY N Z
+doman D UW M AH N
+domangue D OW M AA NG
+domanico D OW M AA N IY K OW
+domanski D AH M AE N S K IY
+domas D OW M AH S
+dombeck D AA M B EH K
+dombek D AA M B IH K
+dombkowski D AH M K AO F S K IY
+dombroski D AH M B R AW S K IY
+dombrosky D AH M B R OW S K IY
+dombrowski D AH M B R AO F S K IY
+dome D OW M
+dome's D OW M Z
+domecq D OW M EH K
+domed D OW M D
+domeier D AA M AY ER
+domek D OW M EH K
+domenech D AA M IH N IH K
+domenici D AH M EH N AH CH IY
+domenici's D AH M EH N AH CH IY Z
+domenici's(2) D OW M IH N IY CH IY Z
+domenici's(3) D OW M EH N IY CH IY Z
+domenici(2) D OW M IH N IY CH IY
+domenici(3) D OW M EH N IY CH IY
+domenick D AA M IH N IH K
+domenico D OW M EY N IY K OW
+domeniconi D OW M EH N IH K OW N IY
+domer D OW M ER
+domes D OW M Z
+domestic D AH M EH S T IH K
+domestically D AH M EH S T IH K L IY
+domesticate D AH M EH S T AH K EY T
+domesticated D AH M EH S T AH K EY T AH D
+domesticates D AH M EH S T AH K EY T S
+domesticating D AH M EH S T AH K EY T IH NG
+domestication D AH M EH S T AH K EY SH AH N
+domesticity D OW M EH S T IH S AH T IY
+domestics D AH M EH S T IH K S
+domical D AA M AH K AH L
+domico D OW M AH K OW
+domin D OW M IH N
+domina D OW M IY N AH
+dominance D AA M AH N AH N S
+dominant D AA M AH N AH N T
+dominate D AA M AH N EY T
+dominated D AA M AH N EY T AH D
+dominates D AA M AH N EY T S
+dominating D AA M AH N EY T IH NG
+domination D AA M AH N EY SH AH N
+domine D OW M IY N IY
+dominee D OW M IH N EY
+domineer D AA M AH N IH R
+domineering D AA M AH N IH R IH NG
+dominelli D OW M IH N EH L IY
+dominelli's D OW M IH N EH L IY Z
+dominelli's(2) D AA M IH N EH L IY Z
+dominelli(2) D AA M IH N EH L IY
+dominey D AA M IH N IY
+domingo D OW M IH NG G OW
+domingo(2) D AH M IH NG G OW
+domingos D AH M IH NG G OW Z
+domingue D OW M IH NG
+domingues D OW M IY N G EH S
+dominguez D AH M IH NG IH Z
+domini D AA M IH N IY
+dominiak D AH M IH N IY AE K
+dominic D AA M AH N IH K
+dominic's D AA M AH N IH K S
+dominica D AH M IH N IH K AH
+dominican D AH M IH N AH K AH N
+dominicana D OW M IH N IH K AA N AH
+dominicana(2) D OW M IH N IH K AE N AH
+dominicans D OW M IH N IH K AH N Z
+dominici D OW M IY N IY CH IY
+dominick D AA M AH N IH K
+dominik D AH M IH N IH K
+dominion D AH M IH N Y AH N
+dominion's D AH M IH N Y AH N Z
+dominique D AO M IH N IY K
+domino D AA M AH N OW
+domino's D AA M IH N OW Z
+domino(2) D AA M IH N OW
+dominoes D AA M AH N OW Z
+dominos D AA M IH N OW Z
+dominquez D OW M IY N K W EH Z
+dominski D AH M IH N S K IY
+dominus D OW M IY N AH S
+dominy D AH M AY N IY
+domke D AA M K
+dommer D AA M ER
+dommie D AA M IY
+domoling D AA M AO L IH NG
+domtar D AA M T ER
+domtar's D AA M T ER Z
+domzalski D AH M Z AA L S K IY
+don D AA N
+don's D AA N Z
+don't D OW N T
+don't(2) D OW N
+don'ts D OW N T S
+don'ts(2) D OW N S
+dona D OW N AH
+donadio D OW N AA D IY OW
+donaghey D AA N AH G HH IY
+donaghue D AA N AH HH UW
+donaghy D AA N AH G HH IY
+donahey D AA N AH HH IY
+donaho D OW N AA HH OW
+donahoe D AA N AH HH OW
+donahoo D AA N AH HH UW
+donahue D AA N AH HH Y UW
+donahue(2) D AA N AH Y UW
+donais D AH N EY
+donald D AA N AH L D
+donald's D AA N AH L D Z
+donalda D OW N AA L D AH
+donaldo D OW N AA L D OW
+donaldo's D OW N AA L D OW Z
+donaldson D AA N AH L D S AH N
+donaldson's D AA N AH L D S AH N Z
+donaldsons D AA N AH L D S AH N Z
+donalson D AA N AH L S AH N
+donapria D AH N AE P R IY AH
+donar D AA N ER
+donat D OW N AH T
+donata D AH N AA T AH
+donate D OW N EY T
+donated D OW N EY T AH D
+donated(2) D OW N EY T IH D
+donatelli D OW N AA T EH L IY
+donates D OW N EY T S
+donath D AA N AH TH
+donathan D AA N AH TH AH N
+donati D OW N AA T IY
+donating D OW N EY T IH NG
+donation D OW N EY SH AH N
+donations D OW N EY SH AH N Z
+donatists D AA N AH T AH S T S
+donatists(2) D AA N AH T AH S S
+donatists(3) D AA N AH T AH S
+donato D AH N AA T OW
+donavan D AA N AH V AE N
+donaway D AA N AH W EY
+donde D AA N D
+donder D AA N D ER
+dondero D OW N D EH R OW
+dondlinger D AA N D AH L IH NG ER
+dondlinger(2) D AA N D L IH NG ER
+done D AH N
+donegan D AA N IH G AE N
+donehoo D OW N EY HH UW
+donelan D AA N IH L AE N
+donella D OW N EH L AH
+donelson D AA N IH L S AH N
+doner D AO N ER
+dones D AH N Z
+doney D AA N IY
+dong D AO NG
+dong(2) D AO NG G
+dongen D AO NG G AH N
+dongmei D OW NG M AY
+donham D AA N HH AH M
+donia D OW N IY AH
+donica D AA N IH K AH
+donigan D AA N IH G AH N
+doniger D AA N IH G ER
+donilon D AA N AH L AA N
+donis D OW N IH S
+donizetti D AA N AH Z EH T IY
+donizetti's D AA N IH Z EH T IY Z
+donkey D AA NG K IY
+donkey(2) D AO NG K IY
+donkeys D AA NG K IY Z
+donlan D AA N L AH N
+donley D AA N L IY
+donlin D AA N L IH N
+donlon D AA N L AH N
+donmoyer D AA N M OY ER
+donn D AA N
+donna D AA N AH
+donna's D AA N AH Z
+donnan D AA N AH N
+donnas D AA N AH Z
+donnay D AA N EY
+donne D AH N
+donned D AA N D
+donnell D AA N IH L
+donnellan D AA N IH L AE N
+donnelley D AA N AH L IY
+donnelley's D AA N AH L IY Z
+donnelley's(2) D AA N EH L IY Z
+donnelley(2) D AA N EH L IY
+donnelly D AA N AH L IY
+donnelly's D AA N AH L IY Z
+donnelly's(2) D AA N EH L IY Z
+donnelly(2) D AA N EH L IY
+donner D AA N ER
+donnie D AA N IY
+donning D AA N IH NG
+donny D AA N IY
+donnybrook D AA N IY B R UH K
+donofrio D OW N OW F R IY OW
+donoghue D AA N AH HH Y UW
+donoghue's D AA N AH HH Y UW Z
+donoghue's(2) D AA N AH Y UW Z
+donoghue(2) D AA N AH Y UW
+donoho D AA N AH HH OW
+donohoe D AA N AH HH OW
+donohoo D AA N AH HH UW
+donohue D AA N AH HH Y UW
+donohue's D AA N AH HH Y UW Z
+donohue's(2) D AA N AH Y UW Z
+donohue(2) D AA N AH Y UW
+donor D OW N ER
+donor's D OW N ER Z
+donors D OW N ER Z
+donors' D OW N ER Z
+donovan D AA N AH V AH N
+donovan's D AA N AH V AH N Z
+dons D AA N Z
+donsbach D AA N Z B AA K
+donut D OW N AH T
+donuts D OW N AH T S
+donuts' D OW N AH T S
+donvan D AA N V AH N
+donvan's D AA N V AH N Z
+donze D AA N Z
+doo D UW
+doodad D UW D AE D
+doodads D UW D AE D Z
+doodle D UW D AH L
+doodles D UW D AH L Z
+doody D UW D IY
+doogie D UW G IY
+doolan D UW L AH N
+doolen JH UW L AH N
+dooley D UW L IY
+doolin D UW L IH N
+dooling D UW L IH NG
+doolittle D UW L IH T AH L
+doom D UW M
+doomed D UW M D
+dooming D UW M IH NG
+dooms D UW M Z
+doomsayer D UW M S EY ER
+doomsayers D UW M S EY ER Z
+doomsaying D UW M S EY IH NG
+doomsday D UW M Z D EY
+doonan D UW N AH N
+dooner D UW N ER
+doonesbury D UW N Z B EH R IY
+door D AO R
+door's D AO R Z
+doorbell D AO R B EH L
+doordarshan D UW R D AA R SH AH N
+doorenbos D UH R EH N B OW S
+doorkeeper D AO R K IY P ER
+doorknob D UW R N AA B
+doorknobs D UW R N AA B Z
+doorman D AO R M AE N
+doormat D AO R M AE T
+doormats D AO R M AE T S
+doorn D AO R N
+doornail D AO R N EY L
+doornbos D AO R N B OW Z
+doors D AO R Z
+doorsill D AO R S IH L
+doorstep D AO R S T EH P
+doorsteps D AO R S T EH P S
+doorway D AO R W EY
+doorways D AO R W EY Z
+doose D UW S
+doozy D UW Z IY
+dopa D OW P AH
+dopamine D AA P AH M AY N
+dope D OW P
+doped D OW P T
+dopey D OW P IY
+dopp D AA P
+doppler D AA P L ER
+dopson D AA P S AH N
+dora D AO R AH
+dorado D AO R AA D OW
+dorais D ER EY
+doral D AO R AE L
+doralin D AO R AA L IY N
+doralynne D AO R AH L AY N
+doran D AO R AE N
+doraville D AO R AH V IH L
+dorazio D AO R AA Z IY OW
+dorazio(2) D AO R EY Z IY OW
+dorcas D AO R K AH S
+dorch D AO R K
+dorchester D AO R CH EH S T ER
+dordies D AO R D IY Z
+dore D AO R
+dorea D AO R IY AH
+doreen D AO R IY N
+dorelia D AO R EH L IY AH
+doremus D AO R IH M IH S
+doren D AO R AH N
+dorena D AO R IH N AH
+dorene D AO R IY N
+dorer D AO R ER
+dorette D ER EH T
+doretti D AO R EH T IY
+dorey D AO R IY
+dorf D AO R F
+dorff D AO R F
+dorfman D AO R F M AH N
+dorgan D AO R G AH N
+dorgan's D AO R G AH N Z
+dori D AO R IY
+doria D AO R IY AH
+dorian D AO R IY AH N
+dorians D AO R IY AH N Z
+doric D AO R IH K
+dorice D AO R IH S
+dorie D AO R IY
+dorin D AO R IH N
+dorinda D AO R IY N D AH
+dorine D AO R IY N IY
+doring D AO R IH NG
+dorio D AO R IY OW
+dorion D AO R IY AO N
+doris D AO R AH S
+doris(2) D AO R IH S
+doris(3) D AA R AH S
+doris(4) D AA R IH S
+dorise D AO R AY Z
+doritos D AO R IY T OW Z
+dority D AO R IH T IY
+dorko D AO R K OW
+dorland D AO R L AH N D
+dorm D AO R M
+dorman D AO R M AH N
+dormancy D AO R M AH N S IY
+dormant D AO R M AH N T
+dormer D AO R M ER
+dorminey D AO R M IH N IY
+dormitories D AO R M AH T AO R IY Z
+dormitory D AO R M AH T AO R IY
+dormouse D AO R M AW S
+dorms D AO R M Z
+dorn D AO R N
+dornak D AO R N AH K
+dornam D AO R N AH M
+dornan D AO R N IH N
+dornan's D AO R N IH N Z
+dornbusch D AO R N B UH SH
+dornbush D AO R N B UH SH
+dorner D AO R N ER
+dorney D AO R N IY
+dornfeld D AO R N F EH L D
+dornhens D AO R N HH EH N Z
+dornier D AO R N IH R
+dornin D AO N IH N
+doro D AO R OW
+doron D AO R AH N
+dorotea D AO R AH SH AH
+dorotea(2) D AO R AH T EY AH
+dorothea D AO R AH TH IY AH
+dorothy D AO R AH TH IY
+dorothy's D AO R AH TH IY Z
+dorothy's(2) D AO R TH IY Z
+dorothy(2) D AO R TH IY
+dorough D AO R AW
+dorow D AO R OW
+dorr D AO R
+dorrance D AO R AH N S
+dorrell D AO R EY L
+dorrie D AO R IY
+dorries D AO R IY Z
+dorris D AO R IH S
+dorroh D AO R OW
+dorrough D AO R AW
+dorsa D AO R S AH
+dorsal D AO R S AH L
+dorsally D AO R S AH L IY
+dorsch D AO R SH
+dorset D AO R S IH T
+dorsett D AO R S IH T
+dorsey D AO R S IY
+dorsi D AO R S IY
+dorst D AO R S T
+dort D AO R T
+dorta D AO R T AH
+dortch D AO R CH
+dorthea D AO R DH IY AH
+dorthy D AO R TH IY
+dortmund D AO R T M AH N D
+dorton D AO R T AH N
+dorval D AO R V AH L
+dorward D AO R W ER D
+dorwart D AO R W AO R T
+dory D AO R IY
+dos D AO S
+dos(2) D OW S
+dosage D OW S AH JH
+dosage(2) D OW S IH JH
+dosages D OW S IH JH IH Z
+dosch D AO SH
+doscher D AO SH ER
+dose D OW S
+doser D OW S ER
+doses D OW S AH Z
+doses(2) D OW S IH Z
+dosh D AA SH
+dosher D AA SH ER
+doshi D OW SH IY
+doshier D AA SH IY ER
+dosia D OW S IY AH
+dosie D AA S IY
+dosier D OW S IY ER
+dosimeters D OW S IH M AH T ER Z
+dosing D OW S IH NG
+doskocil D AO S K AH S IH L
+dospasos D OW S P AE S OW S
+dospasos' D OW S P AE S OW S
+doss D AO S
+dossantos D OW S AA N T OW Z
+dossett D AA S IH T
+dossey D AA S IY
+dossier D AO S Y EY
+dossier(2) D AO S IY EY
+dossiers D AO S Y EY Z
+dossiers(2) D AO S IY EY Z
+dost D AA S T
+dostal D AA S T AH L
+doster D AA S T ER
+dostie D AA S T IY
+dostoevski D AO S T OW V S K IY
+dostoevsky D AO S T OW V S K IY
+dostoevsky(2) D AO S T OY EH V S K IY
+dostoevsky(3) D AO S T OY EH F S K IY
+doswell D AA S W EH L
+dot D AA T
+dotan D OW T AH N
+dote D OW T
+doten D OW T AH N
+doth D AO TH
+dothan D AA TH AH N
+doting D OW T IH NG
+doto D OW T OW
+dots D AA T S
+dotson D AA T S AH N
+dott D AA T
+dottavio D OW T AA V IY OW
+dotted D AA T AH D
+dotted(2) D AA T IH D
+dotter D AA T ER
+dotterer D AA T ER ER
+dottie D AA T IY
+dotting D AA T IH NG
+dotts D AA T S
+dotty D AA T IY
+doty D OW T IY
+dotzler D AA T S L ER
+doub D AW B
+doubek D AW B IH K
+doubet D AW B IH T
+double D AH B AH L
+double-entendre D AH B AH L AA N T AA N D R AH
+doubled D AH B AH L D
+doubleday D AH B AH L D EY
+doubledecker D AH B AH L D EH K ER
+doubles D AH B AH L Z
+doublespeak D AH B AH L S P IY K
+doublethink D AH B AH L TH IH NG K
+doubletree D AH B AH L T R IY
+doubling D AH B AH L IH NG
+doubling(2) D AH B L IH NG
+doubly D AH B L IY
+doubrava D AW B R AH V AH
+doubt D AW T
+doubted D AW T IH D
+doubter D AW T ER
+doubters D AW T ER Z
+doubtfire D AW T F AY ER
+doubtfire's D AW T F AY ER Z
+doubtfires D AW T F AY ER Z
+doubtful D AW T F AH L
+doubting D AW T IH NG
+doubtless D AW T L AH S
+doubts D AW T S
+doucet D UW S EH T
+doucette D UW S EH T
+douche D UW SH
+doud D AW D
+doudna D AW D N AH
+douds D AW D Z
+doug D AH G
+doug's D AH G Z
+dougal D UW G AH L
+dougall D AW G AH L
+dougall(2) D UW G AH L
+dougan D AW G AH N
+dougan(2) D UW G AH N
+dougans D AW G AH N
+dougans(2) D UW G AH N
+dougens D AW G AH N Z
+dougens(2) D UW G AH N Z
+douggins D UW G AH N Z
+dough D OW
+doughboy D OW B OY
+dougher D OW ER
+dougherty D OW ER T IY
+dougherty(2) D AA G ER T IY
+doughman D OW M AH N
+doughnut D OW N AH T
+doughnuts D OW N AH T S
+doughten D AO T AH N
+doughtie D AO T IY
+doughty D AO T IY
+doughy D OW IY
+dougie D UW G IY
+dougie's D UW G IY Z
+dougl D UW G AH L
+douglas D AH G L AH S
+douglas' D AH G L AH S
+douglas's D AH G L AH S IH Z
+douglass D AH G L AH S IH Z
+doukas D AW K AH Z
+doulton D OW L T AH N
+douma D OW M AH
+doupe D UW P
+dour D AW ER
+dour(2) D AW R
+douse D AW S
+doused D AW S T
+dousing D AW S IH NG
+douthat D AW TH AH T
+douthett D AW TH IH T
+douthit D UW TH IH T
+douthitt D UW TH IH T
+doutt D AW T
+douty D AW T IY
+douville D UW V IH L
+douwe D UW
+dov D AA V
+dove D AH V
+dove(2) D OW V
+dovel D OW V EH L
+dover D OW V ER
+dover's D OW V ER Z
+doverspike D AH V ER S P IH K
+doves D AH V Z
+dovetail D AH V T EY L
+dovetailed D AH V T EY L D
+dovetails D AH V T EY L Z
+dovey D AH V EY
+dovidio D OW V IY D IY OW
+dovish D OW V IH SH
+dovish(2) D AH V IH SH
+dow D AW
+dow's D AW Z
+dowager D AW AH JH ER
+dowd D AW D
+dowda D AW D AH
+dowdall D AW D AH L
+dowdell D AW D AH L
+dowden D AW D AH N
+dowding D AW D IH NG
+dowdle D AW D AH L
+dowds D AW D Z
+dowdy D AW D IY
+dowe D AW
+dowel D AW AH L
+dowell D AA W EH L
+dowels D AW AH L Z
+dowen D AW AH N
+dower D AW R
+dowers D AW R Z
+dowie D AW IY
+dowis D AW IH S
+dowland D AW L AH N D
+dowlen D AW L AH N
+dowler D AW L ER
+dowless D AW L AH S
+dowling D AW L IH NG
+down D AW N
+down's D AW N Z
+downard D AW N ER D
+downbeat D AW N B IY T
+downcast D AW N K AE S T
+downdraft D AW N D R AE F T
+downe D AW N
+downed D AW N D
+downen D AW N AH N
+downer D AW N ER
+downers D AW N ER Z
+downes D AW N Z
+downes's D AW N Z IH Z
+downey D AW N IY
+downey's D AW N IY Z
+downfall D AW N F AO L
+downgrade D AW N G R EY D
+downgraded D AW N G R EY D AH D
+downgrades D AW N G R EY D Z
+downgrading D AW N G R EY D IH NG
+downgradings D AW N G R EY D IH NG Z
+downham D AW N HH AH M
+downhill D AW N HH IH L
+downie D AW N IY
+downing D AW N IH NG
+downingtown D AW N IH NG T AW N
+download D AW N L OW D
+downloaded D AW N L OW D IH D
+downloading D AW N L OW D IH NG
+downloads D AW N L OW D Z
+downpayment D AW N P EY M AH N T
+downpayments D AW N P EY M AH N T S
+downplay D AW N P L EY
+downplayed D AW N P L EY D
+downplaying D AW N P L EY IH NG
+downplays D AW N P L EY Z
+downpour D AW N P AO R
+downpours D AW N P AO R Z
+downrange D AW N R EY N JH
+downright D AW N R AY T
+downriver D AW N R IH V ER
+downs D AW N Z
+downscale D AW N S K EY L
+downside D AW N S AY D
+downsides D AW N S AY D Z
+downsize D AW N S AY Z
+downsized D AW N S AY Z D
+downsizes D AW N S AY Z IH Z
+downsizing D AW N S AY Z IH NG
+downsizings D AW N S AY Z IH NG Z
+downstage D AW N S T EY JH
+downstairs D AW N S T EH R Z
+downstate D AW N S T EY T
+downstream D AW N S T R IY M
+downswing D AW N S W IH NG
+downtime D AW N T AY M
+downtown D AW N T AW N
+downtown's D AW N T AW N Z
+downtowns D AW N T AW N Z
+downtrend D AW N T R EH N D
+downtrodden D AW N T R AA D AH N
+downturn D AW N T ER N
+downturns D AW N T ER N Z
+downum D AW N AH M
+downward D AW N W ER D
+downwardly D AW N W ER D L IY
+downwards D AW N W ER D Z
+downwind D AW N W IH N D
+downy D AW N IY
+dowry D AW R IY
+dowse D AW S
+dowsing D AW S IH NG
+dowsman D AW Z M AH N
+dowty D AW T IY
+doxey D AA K S IY
+doxie D AA K S IY
+doxologies D AA K S AA L AH JH IY Z
+doxology D AA K S AA L AH JH IY
+doxtater D AA K S T EY T ER
+doxy D AA K S IY
+doyal D OY AA L
+doyel D OY AH L
+doyen D OY IH N
+doyle D OY L
+doyle's D OY L Z
+doyon D OY AH N
+doze D OW Z
+dozed D OW Z D
+dozen D AH Z AH N
+dozens D AH Z AH N Z
+dozes D OW Z IH Z
+dozier D OW Z IY ER
+dozing D OW Z IH NG
+dqalpha D IY K Y UW AE L F AH
+dr D R AY V
+dr(2) D AA K T ER
+dr. D R AY V
+dr.(2) D AA K T ER
+drab D R AE B
+drabbed D R AE B D
+drabble D R AE B AH L
+drabek D R AE B IH K
+drabenstott D R AH B EH N S T AH T
+drabik D R AA B IH K
+drabinsky D R AH B IH N S K IY
+drabkin D R AE B K IH N
+drabs D R AE B Z
+drace D R EY S
+drach D R AE CH
+drachenberg D R AE K AH N B ER G
+drachma D R AE K M AH
+drachmas D R AA K M AH Z
+drackett D R AE K IH T
+draco D R EY K OW
+draco(2) D R AE K OW
+draconian D R EY K OW N IY AH N
+draconian(2) D R AH K OW N IY AH N
+dracula D R AE K Y UW L AH
+draeger D R EH G ER
+draffen D R AE F AH N
+draft D R AE F T
+draft's D R AE F T S
+drafted D R AE F T IH D
+draftee D R AE F T IY
+draftees D R AE F T IY Z
+drafter D R AE F T ER
+drafters D R AE F T ER Z
+drafting D R AE F T IH NG
+drafts D R AE F T S
+draftsman D R AE F T S M AH N
+draftsmanship D R AE F T S M AH N SH IH P
+draftsmen D R AE F T S M AH N
+drafty D R AE F T IY
+drag D R AE G
+dragan D R AA G AH N
+drage D R EY JH
+drager D R EY G ER
+dragged D R AE G D
+dragging D R AE G IH NG
+draggy D R AE G IY
+dragline D R AE G L AY N
+dragnet D R AE G N EH T
+dragnets D R AE G N EH T S
+drago D R AA G OW
+dragon D R AE G AH N
+dragon's D R AE G AH N Z
+dragonair D R AE G AH N EH R
+dragone D R AH G OW N
+dragonhead D R AE G AH N HH EH D
+dragonheart D R AE G AH N HH AA R T
+dragons D R AE G AH N Z
+dragoo D R AA G UW
+dragovich D R AE G AH V IH CH
+drags D R AE G Z
+draheim D R AE HH AY M
+drahos D R EY HH OW Z
+drahuschak D R AE HH AH SH AE K
+drahuschak(2) D R AH HH UW SH AH K
+drain D R EY N
+drainage D R EY N AH JH
+drainage(2) D R EY N IH JH
+draine D R EY N
+drained D R EY N D
+drainer D R EY N ER
+drainers D R EY N ER Z
+draining D R EY N IH NG
+drains D R EY N Z
+drake D R EY K
+drakeford D R AE K F AO R D
+drakes D R EY K S
+drakos D R EY K OW Z
+dralle D R EY L
+dram D R AE M
+dram(2) D IY R AE M
+drama D R AA M AH
+dramamine D R AE M AH M IY N
+dramas D R AA M AH Z
+dramatic D R AH M AE T IH K
+dramatically D R AH M AE T IH K L IY
+dramatically(2) D R AH M AE T IH K AH L IY
+dramatics D R AH M AE T IH K S
+dramatist D R AA M AH T IH S T
+dramatization D R AE M AH T AH Z EY SH AH N
+dramatizations D R AE M AH T AH Z EY SH AH N Z
+dramatize D R AA M AH T AY Z
+dramatize(2) D R AE M AH T AY Z
+dramatized D R AE M AH T AY Z D
+dramatizes D R AE M AH T AY Z IH Z
+dramatizing D R AE M AH T AY Z IH NG
+dramaturgy D R AA M AH T ER JH IY
+drams D R AE M Z
+drams(2) D IY R AE M Z
+drane D R EY N
+draney D R EY N IY
+drang D R AE NG
+drank D R AE NG K
+dransfield D R AE N S F IY L D
+drape D R EY P
+drapeau D R AH P OW
+draped D R EY P T
+draper D R EY P ER
+draperies D R EY P ER IY Z
+drapery D R EY P ER IY
+drapes D R EY P S
+draping D R EY P IH NG
+drapkin D R AE P K IH N
+drasner D R AE S N ER
+drastic D R AE S T IH K
+drastically D R AE S T IH K L IY
+draughn D R AO N
+draughon D R AO AH N
+draught D R AE F T
+draughts D R AE F T S
+draus D R AO Z
+dravecky D R AH V EH K IY
+draves D R EY V Z
+dravis D R AE V IH S
+dravo D R AE V OW
+dravo's D R AE V OW Z
+draw D R AO
+drawback D R AO B AE K
+drawbacks D R AO B AE K S
+drawbaugh D R AO B AO
+drawbridge D R AO B R IH JH
+drawdown D R AO D AW N
+drawdowns D R AO D AW N Z
+drawdy D R AO D IY
+drawer D R AO R
+drawers D R AO R Z
+drawing D R AO IH NG
+drawings D R AO IH NG Z
+drawl D R AO L
+drawled D R AO L D
+drawls D R AO L Z
+drawn D R AO N
+draws D R AO Z
+dray D R EY
+drayer D R EY ER
+drayton D R EY T AH N
+drayton's D R EY T AH N Z
+dread D R EH D
+dreaded D R EH D IH D
+dreadful D R EH D F AH L
+dreadfully D R EH D F AH L IY
+dreading D R EH D IH NG
+dreadnought D R EH D N AO T
+dreads D R EH D Z
+dream D R IY M
+dreamed D R IY M D
+dreamer D R IY M ER
+dreamers D R IY M ER Z
+dreaming D R IY M IH NG
+dreamland D R IY M L AE N D
+dreamlike D R IY M L AY K
+dreams D R IY M Z
+dreamt D R EH M T
+dreamworks D R IY M W ER K S
+dreamworks' D R IY M W ER K S
+dreamworld D R IY M W ER L D
+dreamy D R IY M IY
+dreariness D R IY R IY N AH S
+dreary D R IH R IY
+drebsky D R EH B S K IY
+drechsel D R EH K S AH L
+drechsler D R EH K S AH L ER
+drechsler(2) D R EH K S L ER
+dred D R EH D
+dredd D R EH D
+dredge D R EH JH
+dredged D R EH JH D
+dredges D R EH JH AH Z
+dredges(2) D R EH JH IH Z
+dredging D R EH JH IH NG
+drees D R IY Z
+dreese D R IY Z
+dreessen D R IY S AH N
+dreger D R EH G ER
+dregs D R EH G Z
+dreher D R EH R
+dreibelbis D R AY B IH L B IH S
+dreier D R AY ER
+dreighton D R AY T IH N
+dreiling D R AY L IH NG
+dreis D R IY Z
+dreisbach D R AY S B AA K
+dreman D R IY M AH N
+drench D R EH N CH
+drenched D R EH N CH T
+drenches D R EH N CH AH Z
+drenching D R EH N CH IH NG
+drennan D R EH N AH N
+drennen D R EH N AH N
+drenning D R EH N IH NG
+drennon D R EH N AH N
+drenth D R EH N TH
+drepung D R EY P AH NG
+drepung(2) D R EY P AO NG
+dresbach D R EH S B AA K
+dresch D R EH SH
+drescher D R EH SH ER
+dresden D R EH Z D IH N
+dresdner D R EH Z D N ER
+dresdner's D R EH Z D N ER Z
+dresen D R IY Z AH N
+dresher D R EH SH ER
+dresner D R EH Z N ER
+dress D R EH S
+dressage D R EH S AA ZH
+dressed D R EH S T
+dressel D R EH S AH L
+dressen D R EH S AH N
+dresser D R EH S ER
+dresser's D R EH S ER Z
+dressers D R EH S ER Z
+dresses D R EH S AH Z
+dresses(2) D R EH S IH Z
+dressier D R EH S IY ER
+dressing D R EH S IH NG
+dressings D R EH S IH NG Z
+dressler D R EH S L ER
+dressmaker D R EH S M EY K ER
+dressmakers D R EH S M EY K ER Z
+dressmaking D R EH S M EY K IH NG
+dressy D R EH S IY
+drew D R UW
+drewery D R UW ER IY
+drewes D R UW Z
+drewett D R UW IH T
+drewry D R UW R IY
+drews D R UW Z
+drexel D R EH K S AH L
+drexel's D R EH K S AH L Z
+drexler D R EH K S L ER
+drey D R EY
+dreyer D R EY ER
+dreyfus D R AY F AH S
+dreyfus's D R EY F AH S IH Z
+dreyfus(2) D R EY F AH S
+dreyfuss D R EY F AH S
+dribbed D R IH B D
+dribble D R IH B AH L
+dribbled D R IH B AH L D
+dribbles D R IH B AH L Z
+dribbling D R IH B AH L IH NG
+dribbling(2) D R IH B L IH NG
+dribs D R IH B Z
+dried D R AY D
+driehaus D R IY HH AW S
+drier D R AY ER
+dries D R AY Z
+driessen D R IY S AH N
+driest D R AY AH S T
+driever D R IY V ER
+drift D R IH F T
+drifta D R IH F T AH
+drifted D R IH F T AH D
+drifted(2) D R IH F T IH D
+drifter D R IH F T ER
+drifters D R IH F T ER Z
+drifting D R IH F T IH NG
+driftnet D R IH F T N EH T
+drifts D R IH F T S
+driftwood D R IH F T W UH D
+driggers D R IH G ER Z
+driggs D R IH G Z
+drill D R IH L
+drillbit D R IH L B IH T
+drilled D R IH L D
+driller D R IH L ER
+drillers D R IH L ER Z
+drilling D R IH L IH NG
+drilling's D R IH L IH NG Z
+drills D R IH L Z
+drina D IY N AH
+drina's D IY N AH Z
+drinas D IY N AH Z
+dring D R IH NG
+drink D R IH NG K
+drinkable D R IH N K AH B AH L
+drinkard D R IH NG K ER D
+drinker D R IH NG K ER
+drinker's D R IH NG K ER Z
+drinkers D R IH NG K ER Z
+drinking D R IH NG K IH NG
+drinks D R IH NG K S
+drinkwater D R IH NG K W AO T ER
+drinkwine D R IH NG K W AY N
+drinnon D R IH N AH N
+drip D R IH P
+drip-dry D R IH P D R AY
+dripped D R IH P T
+dripping D R IH P IH NG
+dripps D R IH P S
+drips D R IH P S
+driscoll D R IH S K AH L
+driskell D R IH S K AH L
+driskill D R IH S K IH L
+drivable D R AY V AH B AH L
+drive D R AY V
+drive's D R AY V Z
+drive-by D R AY V B AY
+drive-thru D R AY V TH R UW
+drive-thrus D R AY V TH R UW Z
+drivel D R IH V AH L
+driven D R IH V AH N
+driver D R AY V ER
+driver's D R AY V ER Z
+driverless D R AY V ER L IH S
+drivers D R AY V ER Z
+drivers' D R AY V ER Z
+drives D R AY V Z
+driveway D R AY V W EY
+driveways D R AY V W EY Z
+driving D R AY V IH NG
+drizzle D R IH Z AH L
+drizzling D R IH Z AH L IH NG
+drizzling(2) D R IH Z L IH NG
+drizzly D R IH Z L IY
+drobkov D R AO B K AO V
+drobkov(2) D R AO B K AO F
+drobny D R AA B N IY
+droddy D R AA D IY
+droege D R OW JH
+droessler D R OW S AH L ER
+droessler(2) D R OW S L ER
+droge D R OW JH
+drogoul D R OW G UW L
+drogoul's D R OW G UW L Z
+drogue D R OW G
+drohan D R OW AH N
+droke D R OW K
+drolet D R OW L IH T
+droll D R OW L
+drollinger D R OW L IH NG ER
+dromedary D R AA M AH D EH R IY
+dromer D R OW M ER
+dromey D R OW M IY
+dromgoole D R AA M G UW L
+dromgooles D R AA M G UW L Z
+dromi D R AA M IY
+dromomania D R OW M OW M EY N IY AH
+dromomania(2) D R OW M OW M EY N Y AH
+dromon D R OW M AH N
+drone D R OW N
+droned D R OW N D
+drones D R OW N Z
+dronet D R OW N IH T
+droney D R OW N IY
+droning D R OW N IH NG
+drool D R UW L
+drooling D R UW L IH NG
+droop D R UW P
+drooped D R UW P T
+drooping D R UW P IH NG
+droopy D R UW P IY
+drop D R AA P
+drop(2) D R AO P
+drop-off D R AA P AO F
+drop-offs D R AA P AO F S
+dropkin D R AA P K IH N
+droplet D R AA P L AH T
+droplets D R AA P L AH T S
+dropoff D R AA P AO F
+dropoffs D R AA P AO F S
+dropout D R AA P AW T
+dropouts D R AA P AW T S
+dropped D R AA P T
+dropper D R AA P ER
+droppers D R AA P ER Z
+dropping D R AA P IH NG
+droppings D R AA P IH NG Z
+drops D R AA P S
+dropsy D R AA P S IY
+droser D R OW Z ER
+dross D R AO S
+drost D R AA S T
+droste D R OW S T
+droste(2) D R AA S T
+droste(3) D R AA S T AH
+drotar D R OW T ER
+drought D R AW T
+drought's D R AW T S
+droughts D R AW T S
+drouillard D R W IY L AA R D
+drouin D R W IY N
+drove D R OW V
+drover D R OW V ER
+droves D R OW V Z
+drown D R AW N
+drowned D R AW N D
+drowning D R AW N IH NG
+drownings D R AW N IH NG Z
+drowns D R AW N Z
+drowsiness D R AW Z IY N AH S
+drowsy D R AW Z IY
+droz D R AA Z
+drozd D R AA Z D
+drozda D R AA Z D AH
+drozdowski D R AH Z D AO F S K IY
+dru D R UW
+drub D R AH B
+drubbed D R AH B D
+drubbing D R AH B IH NG
+druce D R UW S
+drucie D R AH K IY
+druck D R AH K
+druckenmiller D R AH K IH N M IH L ER
+drucker D R AH K ER
+druckman D R AH K M AH N
+drudge D R AH JH
+drudgery D R AH JH ER IY
+druella D R UW EH L AH
+drug D R AH G
+drug's D R AH G Z
+drugan D R UW G AH N
+drugged D R AH G D
+drugging D R AH G IH NG
+druggist D R AH G IH S T
+druggist's D R AH G AH S T S
+druggist's(2) D R AH G IH S T S
+druggists D R AH G AH S T S
+druggists(2) D R AH G IH S T S
+druggists(3) D R AH G IH S S
+druggists(4) D R AH G IH S
+drugmaker D R AH G M EY K ER
+drugmakers D R AH G M EY K ER Z
+drugs D R AH G Z
+drugs' D R AH G Z
+drugstore D R AH G S T AO R
+drugstores D R AH G S T AO R Z
+druid D R UW IH D
+druidism D R UW AH D IH Z AH M
+druids D R UW IH D Z
+druisilla D R IH S IH L AH
+drum D R AH M
+drumbeat D R AH M B IY T
+drumhead D R AH M HH EH D
+drumheller D R AH M HH EH L ER
+drumlin's D R AH M L IH N Z
+drumm D R AH M
+drummed D R AH M D
+drummer D R AH M ER
+drummers D R AH M ER Z
+drummey D R AH M IY
+drumming D R AH M IH NG
+drummond D R AH M AH N D
+drummonds D R AH M AH N D Z
+drumright D R AH M R AY T
+drums D R AH M Z
+drumstick D R AH M S T IH K
+drumwright D R AH M R AY T
+drunk D R AH NG K
+drunkard D R AH NG K ER D
+drunkards D R AH NG K ER D Z
+drunken D R AH NG K AH N
+drunkenness D R AH NG K AH N N AH S
+drunks D R AH NG K S
+drupe D R UW P
+drupes D R UW P S
+drury D R UW R IY
+drusa D R UW S AH
+druse D R UW Z
+drusie D R AH S IY
+drusilla D R UW S IH L AH
+druthers D R AH DH ER Z
+druze D R UW Z
+dry D R AY
+dryclean D R AY K L IY N
+drycleaner D R AY K L IY N ER
+drycleaning D R AY K L IY N IH NG
+dryden D R AY D AH N
+drye D R AY
+dryer D R AY ER
+dryers D R AY ER Z
+drying D R AY IH NG
+dryly D R AY L IY
+dryness D R AY N AH S
+drypers D R AY P ER Z
+drypoint D R AY P OY N T
+drysdale D R AY Z D EY L
+dryser D R AY S ER
+drywall D R AY W AA L
+drzewiecki JH UW IY T S K IY
+dsouza D AH S UW Z AH
+dss D IY EH S EH S
+dsv D IY EH S V IY
+du D UW
+du(2) D AH
+du-bois D UW B OY S
+dual D UW AH L
+dual(2) D UW L
+dualism D UW AH L IH Z AH M
+dualisms D UW AH L IH Z AH M Z
+dualist D UW AH L IH S T
+dualistic D UW AH L IH S T IH K
+duality D UW AE L AH T IY
+duals D UW AH L Z
+duan D W AE N
+duan(2) D W EY N
+duana D UW AE N AH
+duane D W EY N
+duarte D W AA R T EY
+duarte's D W AA R T EY Z
+dub D AH B
+duba D UW B AH
+dubach D AH B AA K
+dubai D UW B AY
+dubarry D UW B EH R IY
+dubas D UW B AH Z
+dubay D AH B EY
+dubbed D AH B D
+dubberly D AH B ER L IY
+dubbing D AH B IH NG
+dubbs D AH B Z
+dubcek D AH B CH EH K
+dubcek(2) D UW B CH EH K
+dube D UW B
+dubeau D AH B OW
+duberstein D UW B ER S T AY N
+duberstein's D UW B ER S T AY N Z
+duberstein's(2) D UW B ER S T IY N Z
+duberstein(2) D UW B ER S T IY N
+dubey D AH B IY
+dubhi D UW B IY
+dubicki D AH B IH T S K IY
+dubie D AH B IY
+dubiel D AH B IY L
+dubilier D UW B AH L IH R
+dubilier(2) D UW B AH L AY ER
+dubin D UW B IH N
+dubinin D UW B IH N IH N
+dubinsky D AH B IH N S K IY
+dubious D UW B IY AH S
+dubis D UW B IH S
+dublin D AH B L IH N
+dublin's D AH B L IH N Z
+duboff D AH B AO F
+dubois D UW B OY S
+dubois(2) D UW B W AA
+duboise D UW B OY S
+duboise(2) D UW B W AA
+dubord D AH B AO R D
+dubose D UW B OW Z
+dubow D UW B OW
+dubrawski D UW B R AW S K IY
+dubray D AH B R EY
+dubree D AH B R IY
+dubreuil D AH B R UW L
+dubroc D AH B R AH K
+dubroff D UW B R AO F
+dubrovnik D UW B R AA V N IH K
+dubrovnik's D UW B R AA V N IH K Z
+dubrovniks D UW B R AA V N IH K Z
+dubrovsky D UW B R AO F S K IY
+dubrovsky(2) D UW B R AO V S K IY
+dubrow D AH B R OW
+dubs D AH B Z
+dubuc D UW B AH K
+dubuisson D AH B IH S AH N
+dubuque D AH B Y UW K
+dubuque's D AH B Y UW K S
+duby D UW B IY
+duc D AH K
+duca D UW K AH
+ducal D UW K AH L
+duce D UW S
+ducey D AH S IY
+duch D AH CH
+duchaine D AH SH EY N
+duchamp D UW SH AA M P
+duchamp's D UW SH AA M P S
+ducharme D AH SH AA R M
+duchemin D AH SH IH M AE N
+duchene D AH K IY N
+duchenne D UW SH EH N
+duchesneau D AH SH IH S N OW
+duchess D AH CH AH S
+duchin D UW CH IH N
+duchon D AH CH AH N
+duchossois D UW CH AO S W AA
+duchow D AH CH OW
+duchy D AH CH IY
+duck D AH K
+duck's D AH K S
+ducked D AH K T
+ducker D AH K ER
+duckett D AH K IH T
+ducking D AH K IH NG
+duckling D AH K L IH NG
+ducklings D AH K L IH NG Z
+ducks D AH K S
+ducks' D AH K S
+ducksworth D AH K S W ER TH
+duckwall D AH K W AO L
+duckweed D AH K W IY D
+duckworth D AH K W ER TH
+duclos D AH K L OW Z
+ducommun D UW K AA M AH N
+ducommun(2) D UW K AA M UW N
+ducote D AH K OW T
+duct D AH K T
+ductile D AH K T AH L
+ductility D AH K T IH L AH T IY
+ductless D AH K T L AH S
+ducts D AH K T S
+dud D AH D
+duda D UW D AH
+dudack D UW D AE K
+dudar D UW D ER
+dudas D UW D AH Z
+dudash D AH D AH SH
+dudayev D UW D AY EH V
+dudayev's D UW D AY EH V Z
+dudd D AH D
+dudding D AH D IH NG
+duddy D AH D IY
+dude D UW D
+dudeck D UW D EH K
+dudeck's D UW D EH K S
+dudek D UW D IH K
+duden D UW D AH N
+dudenhoeffer D AH D IH N HH OW F ER
+dudes D Y UW D Z
+dudgeon D AH JH AH N
+dudik D UW D IH K
+dudley D AH D L IY
+dudman D AH D M AH N
+dudney D AH D N IY
+duds D AH D Z
+dudziak D AH JH IY AE K
+dudzik D AH D Z IH K
+dudzinski D AH JH IH N S K IY
+due D UW
+due(2) D Y UW
+duecker D UW K ER
+dueitt D UW AH T
+dueker D UW K ER
+duel D UW AH L
+dueled D UW AH L D
+dueling D UW L IH NG
+duelist D UW AH L IH S T
+duell JH UW L
+duell(2) D UW L
+duels D UW AH L Z
+duena D UW EH N AH
+duena(2) D W EY N Y AH
+duenas D UW EH N AH S
+duenas(2) D W EY N Y AH S
+duenez D W EH N EH Z
+duenow D UW N OW
+duensing D UH N S IH NG
+duer D UW ER
+duerksen D UH R K S AH N
+duerr D UH R
+duerson D UH R S AH N
+duerst D UH R S T
+dues D UW Z
+duesberg D UW Z B ER G
+duesing D UW S IH NG
+duesler D UW S AH L ER
+duesler(2) D UW S L ER
+duesseldorf D UW S AH L D AO R F
+duet D UW EH T
+duet(2) D Y UW EH T
+duets D UW EH T S
+duets(2) D Y UW EH T S
+duey D UW IY
+duey(2) D Y UW IY
+dufault D AH F OW
+dufek D UW F IH K
+duff D AH F
+duffala D AH F AE L AH
+duffee D AH F IY
+duffek D AH F IH K
+duffel D AH F AH L
+duffell D AH F AH L
+duffer D AH F ER
+duffett D AH F IH T
+duffey D AH F IY
+duffie D AH F IY
+duffield D AH F IY L D
+duffin D AH F IH N
+duffner D AH F N ER
+dufford D AH F ER D
+duffour D AH F AO R
+duffus D AH F AH S
+duffy D AH F IY
+duffy's D AH F IY Z
+dufner D AH F N ER
+duford D AH F ER D
+dufort D AH F ER T
+dufour D AH F UH R
+dufrane D AH F R EY N
+dufrene D AH F R IY N
+dufresne D AH F R EH N
+dufur D AH F ER
+dug D AH G
+dugal D UW JH AH L
+dugald D AH G AH L D
+dugan D AH G AH N
+dugar D UW G ER
+dugas D UW G AH Z
+dugdale D AH G D EY L
+duggan D AH G AH N
+duggar D AH G ER
+dugger D AH G ER
+duggin D AH G IH N
+duggins D AH G IH N Z
+dugo D UW G OW
+dugout D AH G AW T
+dugouts D AH G AW T S
+duguay D AH G EY
+duguid D AH G W IH D
+duh D AH
+duhaime D UW AY M
+duhamel D UW HH AE M AH L
+duhart D AH HH AA R T
+duhe D UW HH
+duhon D UW HH AH N
+duhr D ER
+dui D IY Y UW AY
+duignan D IH G N AE N
+duis D UW IH Z
+duis(2) D IY Y UW AY Z
+duisburg D UW S B ER G
+duitsman D UW T S M AH N
+duk D AH K
+dukakis D UW K AA K IH S
+dukakis' D UW K AA K IH S
+dukakis'(2) D UW K AA K IH S IH Z
+dukakis's D UW K AA K IH S IH Z
+dukakises D UW K AA K IH S IH Z
+dukart D AH K AA R T
+duke D UW K
+duke's D UW K S
+duked D UW K T
+dukedom D UW K D AH M
+dukeman D UW K M AH N
+duker D UW K ER
+dukes D UW K S
+duking D UW K IH NG
+dula D UW L AH
+dulac D AH L AE K
+dulak D UW L AH K
+dulaney D Y UW L AH N IY
+dulany D Y UW L AO N IY
+dulay D Y UW L EY
+dulce D AH L S
+dulcea D AH L S IY AH
+dulcet D AH L S AH T
+dulciana D UW L CH AE N AH
+dulcibelle D AH L S IH B AH L
+dulcie D AH L K IY
+dulcimer D AH L S IH M ER
+dulcine D AH L S IH N
+dulcinea D AH L S IH N IY AH
+dule D UW L
+duley D Y UW L IY
+dulin D UW L IH N
+duling D Y UW L IH NG
+dull D AH L
+dulle D AH L
+dullea D AH L IY AH
+dulled D AH L D
+duller D AH L ER
+dulles D AH L AH S
+dullest D AH L AH S T
+dulling D AH L IH NG
+dullness D AH L N AH S
+dulmage D AH L M AH JH
+dulong D Y UW L AO NG
+dulski D AH L S K IY
+dulude D Y UW L UW D
+duluth D AH L UW TH
+dulwich D AH L W IH CH
+dulworth D AH L W ER TH
+duly D UW L IY
+dum D AH M
+duma D UW M AH
+duma's D UW M AH Z
+dumaine D AH M EY N
+dumais D AH M EY
+duman D UW M AH N
+dumas D UW M AH Z
+dumas(2) D UW M AA
+dumb D AH M
+dumbbell D AH M B EH L
+dumbbells D AH M B EH L Z
+dumber D AH M ER
+dumbest D AH M AH S T
+dumbfound D AH M F AW N D
+dumbfounded D AH M F AW N D IH D
+dumbfounding D AH M F AW N D IH NG
+dumbfounds D AH M F AW N D Z
+dumbing D AH M IH NG
+dumbo D AH M B OW
+dumbstruck D AH M S T R AH K
+dumenil D UW M AH N IH L
+dumez D UW M EH Z
+dumford D AH M F ER D
+dumire D UW M IH R EY
+dumke D AH M K IY
+dumlao D UW M L AW
+dumler D AH M L ER
+dumm D AH M
+dummer D AH M ER
+dummies D AH M IY Z
+dummitt D AH M IH T
+dummy D AH M IY
+dumond D AH M AA N D
+dumont D UW M AA N T
+dumoulin D AH M UW L AE N
+dump D AH M P
+dumped D AH M P T
+dumper D AH M P ER
+dumping D AH M P IH NG
+dumpling D AH M P L IH NG
+dumplings D AH M P L IH NG Z
+dumps D AH M P S
+dumpster D AH M P S T ER
+dumpsters D AH M P S T ER Z
+dumptruck D AH M P T R AH K
+dumptrucks D AH M P T R AH K S
+dumpty D AH M P T IY
+dumpy D AH M P IY
+dun D AH N
+dun's D AH N Z
+duna D UW N AH
+dunagan D UW N AA G AA N
+dunahoo D UW N AA HH UW
+dunaj D UW N AH JH
+dunavan D AH N AH V AE N
+dunavant D UW N AA V AH N T
+dunaway D AH N AH W EY
+dunay D AH N EY
+dunbar D AH N B AA R
+dunblane D AH N B L EY N
+dunc D AH NG K
+duncan D AH NG K AH N
+duncanson D AH NG K AH N S AH N
+dunckel D AH NG K AH L
+duncombe D AH NG K AH M
+dundas D AH N D AH Z
+dundee D AH N D IY
+dundon D AH N D AH N
+dundore D AH N D ER
+dune D UW N
+dunedin D UW N AH D IH N
+dunegan D AH N IH G AE N
+dunes D UW N Z
+dunfee D AH N F IY
+dunford D AH N F ER D
+dung D AH NG
+dungan D AH NG G AH N
+dungeon D AH N JH AH N
+dungeons D AH N JH AH N Z
+dungey D AH N JH IY
+dunham D AH N AH M
+dunhill D AH N HH IH L
+dunigan D AH N IH G AE N
+dunite D UW N AY T
+dunivan D AH N IH V AE N
+dunja D UW N Y AH
+dunja(2) D AH N JH AH
+dunk D AH NG K
+dunked D AH NG K T
+dunkel D AH NG K AH L
+dunkelberg D AH NG K AH L B ER G
+dunkelberger D AH NG K AH L B ER G ER
+dunker D AH NG K ER
+dunkerley D AH NG K ER L IY
+dunkin D AH NG K IH N
+dunkin' D AH NG K IH N
+dunkirk D AH N K ER K
+dunkle D AH NG K AH L
+dunkleberger D AH NG K AH L B ER G ER
+dunklee D AH NG K L IY
+dunkley D AH NG K L IY
+dunklin D AH NG K L IH N
+dunks D AH NG K S
+dunlaevy D AH N L EY V IY
+dunlap D AH N L AE P
+dunlavey D AH N L AH V EY
+dunlavy D AH N L AH V IY
+dunlay D AH N L EY
+dunleavy D UW N L AH V IY
+dunlevy D UW N L IH V IY
+dunley D AH N L IY
+dunlop D AH N L AA P
+dunman D AH N M AH N
+dunmire D UW N M IH R EY
+dunn D AH N
+dunnagan D AH N AH G AE N
+dunnam D AH N AH M
+dunnavant D AH N AH V AH N T
+dunnaway D AH N AH W EY
+dunne D AH N
+dunned D AH N D
+dunnell D AH N AH L
+dunnett D AH N IH T
+dunnigan D AH N IH G AH N
+dunning D AH N IH NG
+dunnington D AH N IH NG T AH N
+dunno D AH N OW
+dunphy D AH N F IY
+duns D AH N Z
+dunshee D AH N SH IY
+dunsmoor D AH N Z M UH R
+dunsmore D AH N S M AO R
+dunson D AH N S AH N
+dunst D AH N S T
+dunstan D AH N S T AH N
+dunster D AH N S T ER
+dunston D AH N S T AH N
+dunsworth D AH N Z W ER TH
+dunton D AH N T AH N
+dunwoody D AH N W UH D IY
+dunworth D AH N W ER TH
+duo D UW OW
+duodenal D UW AH D IY N AH L
+duodenal(2) D UW AA D AH N AH L
+duodenum D UW AA D AH N AH M
+duong D UW OW NG
+duopoly D UW OW P AA L IY
+duopoly(2) D Y UW AA P AH L IY
+dupay D UW P EY
+dupe D UW P
+duped D UW P T
+dupee D UW P IY
+duper D UW P ER
+dupes D UW P S
+dupin D AH P AE N
+duplantis D AH P L AE N T IH S
+duplechain D UW P L IH SH EY N
+duplechin D UW P L IH K IH N
+dupler D UW P AH L ER
+dupler(2) D UW P L ER
+duplessis D UW P L IH S IH S
+duplex D UW P L EH K S
+duplicate D UW P L AH K AH T
+duplicate(2) D UW P L AH K EY T
+duplicated D UW P L IH K EY T IH D
+duplicated(2) D Y UW P L AH K EY T IH D
+duplicates D Y UW P L AH K EY T S
+duplicating D UW P L IH K EY T IH NG
+duplication D Y UW P L AH K EY SH AH N
+duplications D UW P L IH K EY SH AH N Z
+duplicative D UW P L IH K AH T IH V
+duplicitous D UW P L IH S IH T AH S
+duplicity D UW P L IH S IH T IY
+dupont D UW P AA N T
+dupont's D UW P AA N T S
+dupras D AH P R AA Z
+dupre D AH P R EY
+dupree D AH P R IY
+duprey D AH P R EY
+dupriest D AH P ER IY IH S T
+dupriest(2) D UW P R IY S T
+dupuis D AH P W IY
+dupuy D AH P W IY
+duque D UW K
+duquesne D UW K EY N
+duquesne's D UW K EY N Z
+duquette D AH K EH T
+dura D UH R AH
+durability D ER AH B IH L IH T IY
+durable D UH R AH B AH L
+durables D UH R AH B AH L Z
+duracell D UH R AH S EH L
+durakon D UH R AH K IH N
+durall D Y UW R AH L
+duramed D UH R AH M EH D
+duran D ER AE N
+duran's D ER AE N S
+durand D UH R AA N D
+durando D UH R AA N D OW
+durang D ER AE NG
+durango D ER AE NG G OW
+durant D UH R AH N T
+durant's D ER AE N T S
+durante D UH R AA N T IY
+duration D UH R EY SH AH N
+durations D UH R EY SH AH N Z
+duray D UH R EY
+durazo D UH R AA Z OW
+durban D ER B AH N
+durben D ER B AH N
+durbin D ER B IH N
+durch D ER CH
+durchholz D ER CH OW L T S
+durden D ER D AH N
+durdin D ER D IH N
+duree D UH R IY
+durell D Y UW R AH L
+duren D UH R AH N
+durenberger D UH R AH N B ER G ER
+durene D Y UW R IY N
+durer D UH R ER
+duress D UH R EH S
+durette D ER EH T
+durfee D ER F IY
+durfey D ER F IY
+durflinger D ER F AH L IH NG ER
+durflinger(2) D ER F L IH NG ER
+durgan D ER G AH N
+durgin D ER JH IH N
+durham D ER AH M
+durham(2) D UH R HH AE M
+durham(3) D UH R AH M
+duri D UH R IY
+durick D Y UW R IH K
+durie D UH R IY
+during D UH R IH NG
+during(2) D Y UH R IH NG
+during(3) D ER IH NG
+durio D UH R IY OW
+duriron D UW R IH R AH N
+duris D Y UW R IH S
+durkee D ER K IY
+durkheim D ER K HH AY M
+durkheim's D ER K HH AY M Z
+durkin D ER K IH N
+durland D ER L AH N D
+durley D ER L IY
+durling D ER L IH NG
+durn D ER N
+durnell D ER N AH L
+durney D ER N IY
+durnil D ER N AH L
+durnin D ER N IH N
+durning D ER N IH NG
+duro D UH R OW
+durocher D Y UW R AH K ER
+duron D Y UW R AH N
+duross D Y UW R AH S
+durr D ER
+durrah D AO R AH
+durrance D UH R AH N S
+durrant D AO R AH N T
+durrell D AO R AH L
+durrence D AO R AH N S
+durrett D AO R IH T
+durso D UH R S OW
+durst D ER S T
+durum D UH R AH M
+durward D ER W ER D
+durwin D ER W IH N
+dury D UH R IY
+duryea D UH R IY AH
+duryee D UH R IY
+dusch D AH SH
+dusch(2) D AH CH
+dusek D UW S EH K
+dusenberry D UW S AH N B EH R IY
+dusenbery D AH S EH N B ER IY
+dusenbury D UW S AH N B EH R IY
+dusett D UW S AH T
+dush D AH SH
+dush(2) D UW SH
+dushane D UW SH EY N
+dushyanth D UW SH IY AA N TH
+dusing D UW S IH NG
+dusk D AH S K
+duskin D AH S K IH N
+dussault D AH S OW
+dusseau D AH S OW
+dusseault D AH S OW
+dusseldorf D UW S AH L D AO R F
+dust D AH S T
+dustbin D AH S T B IH N
+dusted D AH S T IH D
+duster D AH S T ER
+dusters D AH S T ER Z
+dustin D AH S T IH N
+dusting D AH S T IH NG
+dustman D AH S T M AH N
+duston D AH S T AH N
+dusts D AH S T S
+dusts(2) D AH S S
+dusts(3) D AH S
+dusty D AH S T IY
+dusza D AH SH AH
+duszynski D AH SH IH N S K IY
+dutch D AH CH
+dutcher D AH CH ER
+dutchman D AH CH M AH N
+duthie D AH TH IY
+duties D UW T IY Z
+dutiful D UW T IY F AH L
+dutifully D UW T IY F AH L IY
+dutil D AH T IH L
+dutka D AH T K AH
+dutkiewicz D AH T K AH V IH CH
+dutko D AH T K OW
+dutoit D UW T OY T
+dutra D UW T R AH
+dutro D AH T R OW
+dutrow D AH T R OW
+dutson D AH T S AH N
+dutt D AH T
+dutter D AH T ER
+dutton D AH T AH N
+duty D UW T IY
+duty(2) D Y UW T IY
+duva D UW V AH
+duval D UW V AE L
+duvalier D UW V AE L Y ER
+duvaliers D UW V EY L Y ER Z
+duvall D UW V AA L
+duve D UW V
+duvernay D AH V ER N EY
+duvrees D UW V R IY Z
+duwayne D UW W EY N
+duwe D UW W
+dux D AH K S
+duzan D UW Z AH N
+dvd D IY V IY D IY
+dvoracek D V AO R AH CH EH K
+dvorak D V AO R AH K
+dvorsky D V AO R S K IY
+dwan D W AA N
+dwana D W AA N AH
+dwarf D W AO R F
+dwarfed D W AO R F T
+dwarfing D W AO R F IH NG
+dwarfism D W AO R F IH Z AH M
+dwarfs D W AO R F S
+dwarves D W AO R V Z
+dwayne D W EY N
+dweck D W EH K
+dweeb D W IY B
+dwell D W EH L
+dwelle D W EH L
+dwelled D W EH L D
+dweller D W EH L ER
+dwellers D W EH L ER Z
+dwelley D W EH L IY
+dwelling D W EH L IH NG
+dwellings D W EH L IH NG Z
+dwells D W EH L Z
+dwelt D W EH L T
+dwi D IY D AH B AH L Y UW AY
+dwi(2) D IY D AH B AH Y UW AY
+dwiggins D W IH G IH N Z
+dwight D W AY T
+dwindle D W IH N D AH L
+dwindled D W IH N D AH L D
+dwindles D W IH N D AH L Z
+dwindling D W IH N D AH L IH NG
+dwindling(2) D W IH N D L IH NG
+dwinell D W IH N AH L
+dwire D W AY R
+dwivedi D W IH V EH D IY
+dworak D W ER AH K
+dworin D W AO R IH N
+dworkin D W AO R K IH N
+dworsky D W ER S K IY
+dwyer D W AY ER
+dyad D AY AE D
+dyal D AY AH L
+dyan D AY AE N
+dyana D AY AE N AH
+dyane D AY AE N
+dyansen D AY AH N S AH N
+dyar D AY ER
+dyas D AY AH S
+dyatron D AY AH T R AH N
+dyazide D AY AH Z AY D
+dybas D AY B AH Z
+dyce D AY S
+dyche D AY CH
+dyches D AY CH IH Z
+dyck D AY K
+dyckman D IH K M AH N
+dyco D AY K OW
+dycus D AY K AH S
+dye D AY
+dyed D AY D
+dyeing D AY IH NG
+dyer D AY ER
+dyes D AY Z
+dyess D AY AH S
+dyestuff D AY S T AH F
+dyestuffs D AY S T AH F S
+dygert D IH G ER T
+dying D AY IH NG
+dyk D IH K
+dykas D AY K AH Z
+dyke D AY K
+dykeman D AY K M AH N
+dykes D AY K S
+dykhouse D IH K HH AW S
+dykman D IH K M AH N
+dykstra D AY K S T R AH
+dylan D IH L AH N
+dylan's D IH L AH N Z
+dylans D IH L AH N Z
+dylewski D IH L EH F S K IY
+dylex D AY L AH K S
+dyloptisaurus D IH L AA P T AH S AA R AH S
+dymally D IH M AH L IY
+dymek D IH M EH K
+dyment D IH M AH N T
+dymond D AY M AH N D
+dynafac D AY N AH F AE K
+dynalectric D AY N AH L EH K T R IH K
+dynalectron D AY N AH L EH K T R AH N
+dynamic D AY N AE M IH K
+dynamics D AY N AE M IH K S
+dynamics' D IH N AE M IH K S
+dynamics'(2) D AY N AE M IH K S
+dynamics's D AY N AE M IH K S IH Z
+dynamism D AY N AH M IH Z AH M
+dynamite D AY N AH M AY T
+dynamo D AY N AH M OW
+dynamometer D AY N AH M AA M AH T ER
+dynapac D AY N AH P AE K
+dynascan D AY N AH S K AE N
+dynastic D AY N AE S T IH K
+dynasties D AY N AH S T IY Z
+dynasty D AY N AH S T IY
+dynatech D IH N AH T EH K
+dyncorp D IH N K AO R P
+dyncorp(2) D AY N K AO R P
+dyneer D IH N IH R
+dyneer(2) D AY N IH R
+dynes D AY N Z
+dysan D AY S AH N
+dysart D IH S ER T
+dysentery D IH S AH N T EH R IY
+dysert D IH S ER T
+dysfunction D IH S F AH NG K SH AH N
+dysfunctional D IH S F AH NG K SH AH N AH L
+dysfunctions D IH S F AH NG K SH AH N Z
+dysinger D IH S IH N JH ER
+dyslexia D IH S L EH K S IY AH
+dyslexic D IH S L EH K S IH K
+dyson D AY S AH N
+dysphoric D IH S F AO R IH K
+dysplasia D IH S P L EY ZH AH
+dystrophin D IH S T R AH F IH N
+dystrophy D IH S T R AH F IY
+dzerzhinsk JH ER Z IH N S K
+dzhambul JH AE M B UW L
+dzhirkvelov D AH Z ER K V AH L AA V
+dzhokhar JH OW K AA R
+dzhokhar's JH OW K AA R Z
+dziak D Z IY AE K
+dzialo JH IY AA L OW
+dziedzic JH IY JH IH K
+dziekan JH IY K AH N
+dzik D Z IH K
+dzikowski JH IH K AO F S K IY
+dziuba JH IY UW B AH
+dziuk JH IY UW K
+dzokhar JH OW K AA R
+e IY
+e's IY Z
+e. IY
+e.'s IY Z
+e.s IY Z
+each IY CH
+eachan IY CH AH N
+eachus IY CH AH S
+eaddy IY D IY
+eade IY D
+eader IY D ER
+eades IY D Z
+eadie EH D IY
+eads IY D Z
+eads' IY D Z
+eady IY D IY
+eagan IY G AH N
+eagar IY G ER
+eagen IY G AH N
+eager IY G ER
+eagerly IY G ER L IY
+eagerness IY G ER N AH S
+eagle IY G AH L
+eagle's IY G AH L Z
+eagleburger IY G AH L B ER G ER
+eagles IY G AH L Z
+eagleson IY G AH L S AH N
+eagleton IY G AH L T AH N
+eagleye IY G AH L AY
+eaglin IY G L IH N
+eagon IY G AH N
+eaken IY K AH N
+eaker IY K ER
+eakes IY K S
+eakin IY K IH N
+eakins IY K IH N Z
+eakle IY K AH L
+eales IY L Z
+ealey IY L IY
+ealing IY L IH NG
+ealy IY L IY
+eamer IY M ER
+eames IY M Z
+eamon IY M AH N
+eanes IY N Z
+eap IY EY P IY
+eap(2) IY P
+eappen IY P AH N
+ear IY R
+ear(2) IH R
+eardley IH R D L IY
+eardley(2) ER D L IY
+eared IH R D
+earfull IH R F AH L
+eargle IH R G AH L
+earhart IH R HH AA R T
+earhart(2) EH R HH AA R T
+earl ER L
+earl's ER L Z
+earldom ER L D AH M
+earle ER L
+earlene ER L IY N
+earles ER L Z
+earless IH R L AH S
+earless(2) IY R L AH S
+earley ER L IY
+earlie ER L IY
+earlier ER L IY ER
+earlier's ER L IY ER Z
+earliest ER L IY AH S T
+earline ER L AY N
+earll ER L
+earls ER L Z
+early ER L IY
+earlywine ER L IY W AY N
+earmark IH R M AA R K
+earmark(2) IY R M AA R K
+earmarked IH R M AA R K T
+earmarked(2) IY R M AA R K T
+earmarking IH R M AA R K IH NG
+earmarking(2) IY R M AA R K IH NG
+earmarks IH R M AA R K S
+earmarks(2) IY R M AA R K S
+earmuff IH R M AH F
+earmuff(2) IY R M AH F
+earmuffs IH R M AH F S
+earmuffs(2) IY R M AH F S
+earn ER N
+earned ER N D
+earner ER N ER
+earners ER N ER Z
+earnest ER N IH S T
+earnestly ER N AH S T L IY
+earnestness ER N AH S T N AH S
+earney ER N IY
+earnhardt ER N HH AA R T
+earnhart ER N HH AA R T
+earnheart ER N HH AA R T
+earning ER N IH NG
+earnings ER N IH NG Z
+earnings' ER N IH NG Z
+earns ER N Z
+earnshaw ER N SH AO
+earp ER P
+earphone IH R F OW N
+earphone(2) IY R F OW N
+earphones IH R F OW N Z
+earphones(2) IY R F OW N Z
+earpiece IH R P IY S
+earpiece(2) IY R P IY S
+earpieces IH R P IY S IH Z
+earpieces(2) IY R P IY S IH Z
+earplug IH R P L AH G
+earplug(2) IY R P L AH G
+earplugs IH R P L AH G Z
+earplugs(2) IY R P L AH G Z
+earring IH R IH NG
+earring(2) IY R IH NG
+earrings IH R IH NG Z
+earrings(2) IY R IH NG Z
+ears IH R Z
+ears(2) IY R Z
+earshot IH R SH AA T
+earshot(2) IY R SH AA T
+earth ER TH
+earth's ER TH S
+eartha ER TH AH
+earthbound ER TH B AW N D
+earthen ER TH AH N
+earthenware ER TH AH N W EH R
+earthling ER TH L IH NG
+earthlings ER TH L IH NG Z
+earthly ER TH L IY
+earthmoving ER TH M UW V IH NG
+earthquake ER TH K W EY K
+earthquake's ER TH K W EY K S
+earthquakes ER TH K W EY K S
+earths ER TH S
+earthshaking ER TH SH EY K IH NG
+earthshine ER TH SH AY N
+earthstar ER TH S T AA R
+earthwork ER TH W ER K
+earthworm ER TH W ER M
+earthworms ER TH W ER M Z
+earthy ER TH IY
+earvin ER V IH N
+earwax IH R W AE K S
+earwax(2) IY R W AE K S
+earwood IH R W UH D
+earwood(2) IY R W UH D
+eary IH R IY
+easco IY S K OW
+ease IY Z
+eased IY Z D
+easel IY Z AH L
+easement IY Z M AH N T
+eases IY Z IH Z
+eash IY SH
+easib IY S IH B
+easier IY Z IY ER
+easiest IY Z IY AH S T
+easily IY Z AH L IY
+easing IY Z IH NG
+easler IY Z L ER
+easley IY Z L IY
+easom IY Z AH M
+eason IY Z AH N
+east IY S T
+east's IY S T S
+eastbound IY S T B AW N D
+eastburn IY S T B ER N
+eastdil IY S T D IH L
+eastend IY S T EH N D
+eastender IY S T EH N D ER
+eastenders IY S T EH N D ER Z
+eastep IY Z T IH P
+easter IY S T ER
+easterbrook IY S T ER B R UH K
+easterday IY S T ER D EY
+easterlin AH Z T ER L IH N
+easterlin(2) IY S T ER L IH N
+easterling IY S T ER L IH NG
+easterly IY S T ER L IY
+eastern IY S T ER N
+eastern's IY S T ER N Z
+eastern-west IY S T ER N W EH S T
+easterner IY S T ER N ER
+easterners IY S T ER N ER Z
+easterwood IY S T ER W UH D
+eastes IY S T S
+eastgroup IY S T G R UW P
+eastham IY S T AH M
+eastin IY Z T IH N
+eastland IY S T L AH N D
+eastland's IY S T L AH N D Z
+eastland's(2) IY S T L AE N D Z
+eastland's(3) IY S L AH N D Z
+eastland's(4) IY S L AE N D Z
+eastland(2) IY S T L AE N D
+eastland(3) IY S L AH N D
+eastland(4) IY S L AE N D
+eastlick IY S T L IH K
+eastman IY S T M AH N
+eastmet IY S T M EH T
+eastmet's IY S T M EH T S
+easton IY S T AH N
+eastover IY S T OW V ER
+eastpac IY S T P AE K
+eastpac's IY S T P AE K S
+eastridge IY S T R IH JH
+eastward IY S T W ER D
+eastwick IY S T W IH K
+eastwind IY S T W IH N D
+eastwood IY S T W UH D
+eastwood's IY S T W UH D Z
+easudes EY S UW D EY S
+easy IY Z IY
+easy's IY Z IY Z
+easygoing IY Z IY G OW IH NG
+eat IY T
+eatable IY T AH B AH L
+eaten IY T AH N
+eater IY T ER
+eateries IY T ER IY Z
+eaters IY T ER Z
+eatery IY T ER IY
+eatherly EH DH ER L IY
+eatherton EH TH ER T AH N
+eatherton(2) IY TH ER T AH N
+eating IY T IH NG
+eatman IY T M AH N
+eatmon IY T M AH N
+eaton IY T AH N
+eaton's IY T AH N Z
+eats IY T S
+eau OW
+eau-claire OW K L EH R
+eaux OW
+eaux(2) OW Z
+eave IY V
+eavenson IY V IH N S AH N
+eaves IY V Z
+eavesdrop IY V Z D R AA P
+eavesdropping IY V Z D R AA P IH NG
+eb EH B
+eba IY B AH
+eban EH B AH N
+eban(2) IY B AH N
+ebanks EH B AH NG K S
+ebano EH B AA N OW
+ebano(2) IY B AH N OW
+ebarb EH B AA R B
+ebasco EH B AE S K OW
+ebaugh EH B AO
+ebb EH B
+ebba EH B AH
+ebbed EH B AH D
+ebben EH B AH N
+ebbers EH B ER Z
+ebbert EH B ER T
+ebbing EH B IH NG
+ebbs EH B Z
+ebby EH B IY
+ebel EH B AH L
+ebeling EH B AH L IH NG
+eben EH B AH N
+ebeneezer EH B AH N IY Z ER
+ebenezer EH B IH N IY Z ER
+eber EH B ER
+eberhard EH B ER HH AA R T
+eberhardt EH B ER HH AA R T
+eberhart EH B ER HH AA R T
+eberl EH B ER L
+eberle EH B ER AH L
+eberlein EH B ER L AY N
+eberlin EH B ER L IH N
+eberling EH B ER L IH NG
+eberly EH B ER L IY
+ebers EH B ER Z
+ebersol EH B ER S AA L
+ebersold EH B ER S OW L D
+ebersole EH B ER S OW L
+eberstadt EH B ER S T AE T
+ebert EH B ER T
+eberts EH B ER T S
+eberwein EH B ER W AY N
+ebey EH B IY
+ebinger EH B IH NG ER
+eble EH B AH L
+eblen EH B AH L AH N
+eblin EH B L IH N
+ebling EH B AH L IH NG
+ebling(2) EH B L IH NG
+ebner EH B N ER
+ebola IY B OW L AH
+ebonics IY B AO N IH K S
+ebony EH B AH N IY
+ebright IH B R AY T
+ebro IY B R OW
+ebron EH B R AH N
+ebullience IH B UH L Y AH N S
+ebullient IH B AH L Y AH N T
+eby IY B IY
+ecad IY K AE D
+eccentric IH K S EH N T R IH K
+eccentric(2) EH K S EH N T R IH K
+eccentricities EH K S EH N T R IH S IH T IY Z
+eccentricity EH K S AH N T R IH S AH T IY
+eccentrics IH K S EH N T R IH K S
+eccentrics(2) EH K S EH N T R IH K S
+eccles EH K AH L Z
+ecclesiastic IH K L IY Z IY AE S T IH K
+ecclesiastical IH K L IY Z IY AE S T IH K AH L
+eccleston EH K AH L S T AA N
+ecevit EH S AH V IH T
+echard EH CH ER D
+echavarria EH CH AH V AE R IY AH
+echelon EH SH AH L AA N
+echelons EH SH AH L AA N Z
+echemende EH K AH M EH N D
+echenberg EH K AH N B ER G
+echevarria EY CH EY V AA R IY AH
+echeverria EY CH EY V EH R IY AH
+echidna IH K IH D N AH
+echinacea EH CH AH N EY S IY AH
+echlin EH K L IH N
+echlin's EH K L IH N Z
+echo EH K OW
+echo's EH K OW Z
+echoed EH K OW D
+echoes EH K OW Z
+echograph EH K OW G R AE F
+echography EH K AA G R AH F IY
+echohawk EH K OW HH AO K
+echohawk's EH K OW HH AO K S
+echoing EH K OW IH NG
+echolocation EH K OW L OW K EY SH AH N
+echols EH K AH L Z
+echos EH K OW Z
+eck EH K
+eckard EH K ER D
+eckard(2) EH K HH AA R D
+eckardt EH K ER T
+eckardt's EH K ER T S
+eckardt's(2) EH K HH AA R T S
+eckardt(2) EH K HH AA R T
+eckart EH K AA R T
+eckberg EH K B ER G
+eckel EH K AH L
+eckelberry EH K AH L B EH R IY
+eckels EH K AH L Z
+eckenfelder EH K AH N F EH L D ER
+eckenrod EH K IH N R AH D
+eckenrode EH K IH N R OW D
+eckenroth EH K IH N R AO TH
+ecker EH K ER
+eckerd EH K ER D
+eckerle EH K ER AH L
+eckerman EH K ER M AH N
+eckersley EH K ER S L IY
+eckerson EH K ER S AH N
+eckert EH K ER T
+eckert's EH K ER T S
+eckes EH K S
+eckford EH K F ER D
+eckhard EH K HH AA R D
+eckhardt EH K HH AA R T
+eckhart EH K HH AA R T
+eckhoff EH K HH AO F
+eckl EH K AH L
+eckland EH K L AH N D
+eckler EH K L ER
+eckles EH K AH L Z
+eckley EH K L IY
+ecklund EH K L AH N D
+eckman EH K M AH N
+eckmann EH K M AH N
+eckrich EH K R IH K
+eckrote EH K R AH T
+eckroth EH K R AO TH
+eckstein EH K S T IY N
+eckstein(2) EH K S T AY N
+eckstrom EH K S T R AH M
+eclectic IH K L EH K T IH K
+eclipse IH K L IH P S
+eclipse(2) AH K L IH P S
+eclipse(3) IY K L IH P S
+eclipsed IH K L IH P S T
+eclipsed(2) AH K L IH P S T
+eclipsed(3) IY K L IH P S T
+eclipses IH K L IH P S IH Z
+eclipses(2) IY K L IH P S IH Z
+eclipsing IH K L IH P S IH NG
+eclipsing(2) IY K L IH P S IH NG
+eclipsing(3) AH K L IH P S IH NG
+ecliptic IH K L IH P T IH K
+eco IY K OW
+eco(2) EH K OW
+ecogen IY K OW G AH N
+ecolab IY K OW L AE B
+ecolab(2) EH K OW L AE B
+ecolaire IY K OW L EH R
+ecole IH K OW L
+ecological IY K AH L AA JH IH K AH L
+ecological(2) EH K AH L AA JH IH K AH L
+ecologically IY K AH L AA JH IH K L IY
+ecologically(2) EH K AH L AA JH IH K L IY
+ecologist IH K AA L AH JH IH S T
+ecologist(2) IY K AA L AH JH IH S T
+ecologists IH K AA L AH JH IH S T S
+ecologists(2) IY K AA L AH JH IH S T S
+ecologists(3) IH K AA L AH JH IH S
+ecologists(4) IY K AA L AH JH IH S
+ecology IH K AA L AH JH IY
+ecology(2) IY K AA L AH JH IY
+econ IY K AA N
+econocom IY K AA N OW K AA M
+econoline IY K AA N OW L AY N
+econometric IH K AA N AH M EH T R IH K
+econometrics IH K AA N AH M EH T R IH K S
+economic EH K AH N AA M IH K
+economic(2) IY K AH N AA M IH K
+economical EH K AH N AA M IH K AH L
+economical(2) IY K AH N AA M IH K AH L
+economically EH K AH N AA M IH K L IY
+economically(2) IY K AH N AA M IH K L IY
+economico IY K AA N AH M IY K OW
+economics EH K AH N AA M IH K S
+economics(2) IY K AH N AA M IH K S
+economies IH K AA N AH M IY Z
+economies(2) IY K AA N AH M IY Z
+economist IH K AA N AH M IH S T
+economist's IH K AA N AH M IH S T S
+economist's(2) IY K AA N AH M IH S T S
+economist's(3) IH K AA N AH M IH S
+economist's(4) IY K AA N AH M IH S
+economist(2) IY K AA N AH M IH S T
+economists IH K AA N AH M IH S T S
+economists' IH K AA N AH M IH S T S
+economists'(2) IY K AA N AH M IH S T S
+economists(2) IH K AA N AH M IH S
+economists(3) IY K AA N AH M IH S
+economize IH K AA N AH M AY Z
+economize(2) IY K AA N AH M AY Z
+economizes IH K AA N AH M AY Z AH Z
+economizes(2) IY K AA N AH M AY Z AH Z
+economizing IH K AA N AH M AY Z IH NG
+economizing(2) IY K AA N AH M AY Z IH NG
+economos EH K AH N OW M OW Z
+economou EH K OW N OW M UW
+economy IH K AA N AH M IY
+economy's IH K AA N AH M IY Z
+economy's(2) IY K AA N AH M IY Z
+economy(2) IY K AA N AH M IY
+econships IY K AA N SH IH P S
+ecosystem IY K OW S IH S T AH M
+ecosystems IY K OW S IH S T AH M Z
+ecru EH K R UW
+ecstasy EH K S T AH S IY
+ecstatic EH K S T AE T IH K
+ecstatically EH K S T AE T IH K L IY
+ecton EH K T AH N
+ector EH K T ER
+ecuador EH K W AH D AO R
+ecuador's EH K W AH D AO R Z
+ecuadoran EH K W AH D AO R AH N
+ecuadorean EH K W AH D AO R IY AH N
+ecuadorian EH K W AH D AO R IY AH N
+ecumena EH K Y UW M IY N AH
+ecumenical EH K Y UW M EH N IH K AH L
+eczema EH K S AH M AH
+ed EH D
+ed's EH D Z
+eda IY D AH
+edam IY D AH M
+edan IY D AH N
+edana EH D AE N AH
+edberg EH D B ER G
+edbert EH D B ER T
+eddie EH D IY
+eddie's EH D IY Z
+eddies EH D IY Z
+eddinger EH D IH NG ER
+eddings EH D IH NG Z
+eddington EH D IH NG T AH N
+eddins EH D IH N Z
+eddleman EH D AH L M AH N
+eddlemon EH D AH L M AA N
+edds EH D Z
+eddy EH D IY
+ede IY D
+edel EH D AH L
+edelen EH D AH L AH N
+edeline EH D IH L AY N
+edell IH D EH L
+edelman EH D AH L M AH N
+edelman's EH D AH L M AH N Z
+edelman's(2) EY D AH L M AH N Z
+edelman(2) EY D AH L M AH N
+edelmann EH D AH L M AH N
+edelmar EH D IH L M ER
+edelson EH D IH L S AH N
+edelstein EH D AH L S T AY N
+edelstein(2) EH D AH L S T IY N
+edelweiss EY D AH L V AY S
+edema IH D IY M AH
+eden IY D AH N
+edenfield EH D AH N F IY L D
+edens IY D AH N Z
+edenton EH D AH N T AH N
+eder EH D ER
+ederer EH D ER ER
+edes IY D Z
+edgar EH D G ER
+edgar's EH D G ER Z
+edgcomb EH JH K AH M
+edge EH JH
+edgecomb EH JH K AO M
+edgecombe EH JH K OW M
+edged EH JH D
+edgell EH JH AH L
+edgemon EH JH M AH N
+edger EH JH ER
+edgerly EH JH ER L IY
+edgerton EH JH ER T AH N
+edges EH JH AH Z
+edges(2) EH JH IH Z
+edgett EH JH IH T
+edgeway EH JH W EY
+edgeways EH JH W EY Z
+edgewise EH JH W AY Z
+edgewood EH JH W UH D
+edgeworth EH JH W ER TH
+edgin EH JH IH N
+edginess EH JH IY N AH S
+edging EH JH IH NG
+edgington EH JH IH NG T AH N
+edgington's EH JH IH NG T AH N Z
+edgley EH JH L IY
+edgmon EH JH M AH N
+edgren EH D G R EH N
+edgy EH JH IY
+edi IY D IY
+edible EH D AH B AH L
+edibles EH D AH B AH L Z
+edick EH D IH K
+edict IY D IH K T
+edicts IY D IH K T S
+edie EH D IY
+edification EH D AH F AH K EY SH AH N
+edifice EH D AH F AH S
+edify EH D AH F AY
+edifying EH D AH F AY IH NG
+ediger EH D IH G ER
+edin EH D IH N
+edina AH D IY N AH
+edinboro EH D AH N B ER OW
+edinburgh EH D AH N B ER OW
+edinger EH D IH NG ER
+edington EH D IH NG T AH N
+edison EH D IH S AH N
+edison's EH D IH S AH N Z
+edisons EH D IH S AH N Z
+edisto EH D IH S T OW
+edit EH D AH T
+edited EH D AH T AH D
+edited(2) EH D IH T IH D
+edith IY D IH TH
+editha EH D IH DH AH
+edithe EH D IH DH
+editing EH D AH T IH NG
+editing(2) EH D IH T IH NG
+edition AH D IH SH AH N
+edition's IH D IH SH AH N Z
+edition(2) IH D IH SH AH N
+editions IH D IH SH AH N Z
+editor EH D AH T ER
+editor's EH D IH T ER Z
+editor(2) EH D IH T ER
+editorial EH D AH T AO R IY AH L
+editorial's EH D AH T AO R IY AH L Z
+editorialist EH D AH T AO R IY AH L IH S T
+editorialists EH D AH T AO R IY AH L IH S T S
+editorialists(2) EH D AH T AO R IY AH L IH S S
+editorialists(3) EH D AH T AO R IY AH L IH S
+editorialize EH D AH T AO R IY AH L AY Z
+editorialized EH D AH T AO R IY AH L AY Z D
+editorializing EH D AH T AO R IY AH L AY Z IH NG
+editorially EH D AH T AO R IY AH L IY
+editorials EH D AH T AO R IY AH L Z
+editors EH D IH T ER Z
+editors' EH D IH T ER Z
+editorship EH D AH T ER SH IH P
+edits EH D IH T S
+ediva EH D IY V AH
+edival EH D IY V AH L
+edival(2) EH D IY V AE L
+edizione EH D IY Z IY OW N IY
+edleman EH D AH L M AH N
+edler EH D L ER
+edley EH D L IY
+edlin EH D L IH N
+edling EH D L IH NG
+edlund EH D L AH N D
+edlyn EH D L IH N
+edman EH D M AH N
+edmands EH D M AH N D Z
+edmar EH D M AA R
+edmark EH D M AA R K
+edminster IH D M IH N S T ER
+edmison EH D M IH S AH N
+edmisten EH D M IH S AH N
+edmister EH D M IH S T ER
+edmiston EH D M IH S T AA N
+edmond EH D M AH N D
+edmonda EH D M AA N D AH
+edmonds EH D M AH N D Z
+edmondson EH D M AH N D S AH N
+edmonson EH D M AH N S AH N
+edmonston IH D M AA N S T AH N
+edmonton EH D M AH N T AH N
+edmund EH D M AH N D
+edmunda EH D M AH N D AH
+edmundo EH D M AH N D OW
+edmunds EH D M AH N D Z
+edmundson EH D M AH N D S AH N
+edna EH D N AH
+edney EH D N IY
+edo IY D OW
+edoardo EH D W AA R D OW
+edolf EH D OW L F
+edouard EH D UW AA R D
+edper EH D P ER
+edquist EH D K W IH S T
+edra EH D R AH
+edrea EH D R IY AH
+edric EH D R IH K
+edrington EH D ER IH NG T AH N
+edris IH D R IY S
+edsall IH D S AO L
+edsel EH D S AH L
+edson EH D S AH N
+edstrom EH D S T R AH M
+edu EH D Y UW
+edu(2) IY D IY Y UW
+eduard EH D W ER D
+eduardo EH D W AA R D OW
+educate EH JH AH K EY T
+educate(2) EH JH Y UW K EY T
+educated EH JH AH K EY T AH D
+educated(2) EH JH Y UW K EY T AH D
+educates EH JH AH K EY T S
+educates(2) EH JH Y AH K EY T S
+educates(3) EH JH UW K EY T S
+educates(4) EH JH Y UW K EY T S
+educating EH JH AH K EY T IH NG
+educating(2) EH JH Y UW K EY T IH NG
+education EH JH AH K EY SH AH N
+education's EH JH AH K EY SH AH N Z
+education's(2) EH JH Y UW K EY SH AH N Z
+education(2) EH JH Y UW K EY SH AH N
+educational EH JH AH K EY SH AH N AH L
+educational(2) EH JH Y UW K EY SH AH N AH L
+educationally EH JH AH K EY SH AH N AH L IY
+educationally(2) EH JH AH K EY SH N AH L IY
+educationally(3) EH JH Y UW K EY SH AH N AH L IY
+educationally(4) EH JH Y UW K EY SH N AH L IY
+educations EH JH AH K EY SH AH N Z
+educations(2) EH JH Y UW K EY SH AH N Z
+educator EH JH AH K EY T ER
+educator(2) EH JH Y UW K EY T ER
+educators EH JH AH K EY T ER Z
+educators(2) EH JH Y UW K EY T ER Z
+edwald IH D W AO L D
+edward EH D W ER D
+edward's EH D W ER D Z
+edwardian EH D W AO R D IY AH N
+edwardine IH D W AO R D AY N
+edwards EH D W ER D Z
+edwards' EH D W ER D Z
+edwards's EH D W ER D Z IH Z
+edwardson EH D W AO R D S AH N
+edwin EH D W AH N
+edwin(2) EH D W IH N
+edwina EH D W IY N AH
+edye EH D IY
+edye(2) IY D IY
+edyth EH D IH TH
+edythe EH D AY DH
+edzard EH D Z ER D
+ee IY
+eeg IY G
+eel IY L
+eelam IY L AE M
+eelgrass IY L G R AE S
+eellike IY L L AY K
+eelpout IY L P AW T
+eelpouts IY L P AW T S
+eels IY L Z
+eeo IY IY OW
+eerie IH R IY
+eerily IH R AH L IY
+efaw EH F AO
+efecto IH F EH K T OW
+efface IH F EY S
+effacing IH F EY S IH NG
+effect IH F EH K T
+effect(2) IY F EH K T
+effect(3) AH F EH K T
+effected IH F EH K T AH D
+effected(2) IH F EH K T IH D
+effected(3) IY F EH K T AH D
+effected(4) IY F EH K T IH D
+effecting IH F EH K T IH NG
+effecting(2) IY F EH K T IH NG
+effective IH F EH K T IH V
+effective(2) IY F EH K T IH V
+effectively IH F EH K T IH V L IY
+effectively(2) IY F EH K T IH V L IY
+effectiveness IH F EH K T IH V N AH S
+effectiveness(2) IY F EH K T IH V N AH S
+effects IH F EH K T S
+effects(2) IH F EH K S
+effects(3) IY F EH K T S
+effects(4) IY F EH K S
+effectuate IH F EH K CH UW EY T
+effeminate IY F EH M IH N AH T
+efferent EH F ER AH N T
+efferson EH F ER S AH N
+effertz EH F ER T S
+effervescent EH F ER V EH S AH N T
+effete EH F IY T
+efficacious EH F AH K EY SH AH S
+efficacy EH F IH K AE S IY
+efficiencies IH F IH SH AH N S IY Z
+efficiency IH F IH SH AH N S IY
+efficient IH F IH SH AH N T
+efficiently IH F IH SH AH N T L IY
+effie EH F IY
+effigy EH F IH JH IY
+effinger EH F IH NG ER
+effingham EH F IH NG AH M
+effingham(2) EH F IH NG HH AH M
+effler EH F L ER
+effluence EH F L UW AH N S
+effluent EH F L UW AH N T
+efflux EH F L AH K S
+effort EH F ER T
+effortless EH F ER T L AH S
+effortlessly EH F ER T L AH S L IY
+efforts EH F ER T S
+effron EH F R AH N
+effrontery IH F R AH N T ER IY
+effusive EH F Y UW S IH V
+effusively IH F Y UW S IH V L IY
+effy EH F IY
+efird EH F ER D
+efron EH F R AH N
+efta EH F T AH
+egaldey IY G AH L D EY
+egalitarian IH G AE L AH T EH R IY AH N
+egalitarianism IY G AE L AH T EH R IY AH N IH Z AH M
+egan IY G AH N
+egbert EH G B ER T
+egberta EY G B EH R T AH
+egbertina EH G B ER T IY N AH
+egbertine EH G B ER T IY N
+egberts EH G B ER T S
+ege IY JH
+egeland EH G IH L AH N D
+egeler EH G AH L ER
+egelhoff EH G IH L HH AO F
+egelston EH G IH L S T AH N
+egelton EH G AH L T AH N
+eger IY G ER
+egerer EH G ER ER
+egert EH G ER T
+egerton EH G ER T AH N
+egg EH G
+eggcup EH G K AH P
+eggcups EH G K AH P S
+egge EH G
+eggebrecht EH G IH B R IH K T
+egged EH G D
+eggemeyer EH G IH M AY ER
+eggen EH G AH N
+eggenberger EH G AH N B ER G ER
+egger EH G ER
+eggers EH G ER Z
+eggert EH G ER T
+egghead EH G HH EH D
+egghead's EH G HH EH D Z
+eggheads EH G HH EH D Z
+egging EH G IH NG
+eggleston EH G AH L S T AH N
+eggleton EH G AH L T AA N
+eggnog EH G N AO G
+eggnogs EH G N AO G Z
+eggplant EH G P L AE N T
+eggplants EH G P L AE N T S
+eggs EH G Z
+eggshape EH G SH EY P
+eggshaped EH G SH EY P T
+eggshell EH G SH EH L
+eggshells EH G SH EH L Z
+eggum EH G AH M
+egland EH G L AH N D
+eglantine EH G L AH N T AY N
+egle EH G AH L
+egler EH G L ER
+egleston EH G AH L S T AA N
+egley EH G L IY
+egli EH G L IY
+eglin EH G L IH N
+eglise EH G L IY S
+egloff EH G L AO F
+egly EH G L IY
+egner EH G N ER
+egnew IH G N UW
+egnor EH G N ER
+ego IY G OW
+egocentric IY G OW S EH N T R IH K
+egoism IY G OW IH Z AH M
+egolf EH G OW L F
+egomaniac IY G OW M EY N IY AE K
+egon IY G AH N
+egon(2) IY G AA N
+egos IY G OW Z
+egotism IY G AH T IH Z AH M
+egotist IY G AH T IH S T
+egotistical IY G AH T IH S T IH K AH L
+egregious IH G R IY JH AH S
+egregiously IH G R IY JH AH S L IY
+egress IH G R EH S
+egret EH G R AH T
+egypt IY JH AH P T
+egypt's IY JH AH P T S
+egypt's(2) IY JH IH P T S
+egypt(2) IY JH IH P T
+egyptair IY JH IH P T EH R
+egyptian IH JH IH P SH AH N
+egyptians IH JH IH P SH AH N Z
+egyptology IY JH AH P T AA L AH JH IY
+eh EH
+ehinger EH HH IH N JH ER
+ehle EH L
+ehlen EH L AH N
+ehler EH L ER
+ehlers EH L ER Z
+ehlert EH L ER T
+ehlinger EH L IH NG ER
+ehlke EH L K
+ehlmann EH L M AH N
+ehly EH L IY
+ehman EH M AH N
+ehmann EH M AH N
+ehmen EH M EH N
+ehmke EH M K IY
+ehren EH R AH N
+ehrenberg EH R AH N B ER G
+ehrenfeld EH R IH N F EH L D
+ehrenhalt EH R AH N HH AO L T
+ehrenkrantz EH R AH N K R AE N T S
+ehrenreich EH R IH N R AY K
+ehrenreich(2) EH R AH N R IH CH
+ehresman EH R IH S M AH N
+ehret EH R IH T
+ehrhard EH R HH ER D
+ehrhardt EH R HH AA R T
+ehrhart EH R HH AA R T
+ehrich EH R IH K
+ehrig EH R IH G
+ehrke EH R K
+ehrler EH R L ER
+ehrlich ER L IH K
+ehrlich's ER L IH K S
+ehrlichman ER L IH K M AH N
+ehrman EH R M AH N
+ehrmann EH R M AH N
+ehrsam EH R S AH M
+ehud EH HH AH D
+eiben AY B AH N
+eich AY K
+eichberg AY K B ER G
+eichel AY K AH L
+eichelberger AY K AH L B ER G ER
+eichen AY K AH N
+eichenbaum AY K AH N B AW M
+eichenberg AY K AH N B ER G
+eichenberger AY K AH N B ER G ER
+eichenlaub AY K IH N L AW B
+eicher AY K ER
+eichholz AY K HH OW L Z
+eichhorn AY K HH ER N
+eichhorst AY K HH AO R S T
+eichinger AY K IH N JH ER
+eichler AY K AH L ER
+eichler(2) AY K L ER
+eichman AY K M AH N
+eichmann AY K M AH N
+eichner AY K N ER
+eicholtz AY K OW L T S
+eichorn AY K AO R N
+eichorst AY K HH AO R S T
+eichstadt AY K S T AE T
+eichstaedt AY K S T AE T
+eick AY K
+eickhoff AY K HH AO F
+eickholt AY K HH OW L T
+eickmeyer AY K M AY ER
+eid AY D
+eide AY D
+eidem AY D IH M
+eiden AY D AH N
+eidson IY D S AH N
+eiermann AY R M AH N
+eifert AY F ER T
+eiffel AY F AH L
+eifler AY F AH L ER
+eifler(2) AY F L ER
+eigen AY G AH N
+eigenvalue AY G AH N V AE L Y UW
+eigenvalues AY G AH N V AE L Y UW Z
+eighmey EY M IY
+eighmy EY G M IY
+eight EY T
+8 EY T
+eight's EY T S
+eighteen EY T IY N
+eighteen's EY T IY N Z
+eighteens EY T IY N Z
+eighteenth EY T IY N TH
+eightfold EY T F OW L D
+eighth EY T TH
+eighth(2) EY TH
+eighths EY T TH S
+eighties EY T IY Z
+eightieth EY T IY IH TH
+eights EY T S
+eighty EY T IY
+eighty's EY T IY Z
+eigner AY G N ER
+eiichi EY IY CH IY
+eiji EY JH IY
+eike AY K
+eikenberry IY K AH N B EH R IY
+eilan AY L AH N
+eiland AY L AH N D
+eileen AY L IY N
+eiler AY L ER
+eilerman AY L ER M AH N
+eilers AY L ER Z
+eilert AY L ER T
+eiley AY L IY
+eilts AY L T S
+eimer AY M ER
+eimers AY M ER Z
+ein AY N
+einar AY N ER
+einbender AY N B EH N D ER
+eindhoven AY N D HH OW V AH N
+einhorn AY N HH AO R N
+einon AY N AO N
+einon's AY N AO N Z
+einspahr AY N S P AA R
+einstein AY N S T AY N
+einstein's AY N S T AY N Z
+eir AY R
+eirena ER EY N AH
+eirich AY R IH K
+eis AY Z
+eisa EY S AH
+eisai AY S AY
+eisaman AY S AH M AH N
+eischeid AY SH AY D
+eischen AY SH AH N
+eischens AY SH AH N Z
+eisel AY S AH L
+eisele AY S AH L
+eiseman AY S M AH N
+eisemann AY S M AH N
+eisen AY S AH N
+eisenach AY Z AH N AA K
+eisenbach AY Z AH N B AA K
+eisenbarth AY Z AH N B AA R TH
+eisenbeis AY Z AH N B AY S
+eisenberg AY Z AH N B ER G
+eisenberger AY Z AH N B ER G ER
+eisenbraun AY Z AH N B R AW N
+eisenhardt AY Z AH N HH AA R T
+eisenhart AY Z AH N HH AA R T
+eisenhauer AY Z AH N HH AW ER
+eisenhour AY Z AH N AW R
+eisenhower AY Z AH N HH AW ER
+eisenhower's AY Z AH N HH AW ER Z
+eisenhowers AY Z AH N HH AW ER Z
+eisenhut AY Z AH N HH AH T
+eisenhuth AY Z AH N HH UW TH
+eisenman AY Z AH N M AH N
+eisenmann AY Z AH N M AH N
+eisenmenger AY Z AH N M EH NG ER
+eisenstadt AY Z AH N S T AE T
+eisenstein AY Z AH N S T AY N
+eisenstein(2) AY Z AH N S T IY N
+eiserman AY Z ER M AH N
+eisert AY S ER T
+eishi EY SH IY
+eisin AY S AH N
+eisinger AY S IH N JH ER
+eisler AY S L ER
+eisman AY S M AH N
+eisner AY S N ER
+eisner's AY S N ER Z
+eison AY Z AH N
+eissler AY S AH L ER
+eissler(2) AY S L ER
+eiszner AY Z N ER
+eitel AY T AH L
+either IY DH ER
+either(2) AY DH ER
+eitzen AY T Z AH N
+eizenstat AY Z AH N S T AE T
+ejaculate IH JH AE K Y UW L EY T
+ejaculation IY JH AE K Y UW L EY SH AH N
+eject IH JH EH K T
+ejected IH JH EH K T IH D
+ejecting IH JH EH K T IH NG
+ejection IH JH EH K SH AH N
+ejects IH JH EH K T S
+ejects(2) IH JH EH K S
+ejup IY JH AH P
+ejup's IY JH AH P S
+ejup's(2) IY JH UW P S
+ejup(2) IY JH UW P
+ek EH K
+ek(2) IY K EY
+eka EH K AH
+ekaterina EY K AA T EH R IY N AH
+ekberg EH K B ER G
+ekblad EH K B L AE D
+ekco EH K OW
+ekdahl EH K D AA L
+eke IY K
+eked IY K T
+ekern EH K ER N
+ekeus IY K UW S
+ekholm EH K HH OW L M
+eking IY K IH NG
+ekins EH K IH N Z
+ekk IY K EY K EY
+ekkehard EH K HH AA R D
+eklund EH K L AH N D
+ekman EH K M AH N
+eko EH K OW
+ekofisk EH K AH F IH S K
+eksportfinans EH K S P AO R T F IH N AH N Z
+ekstrand EH K S T R AH N D
+ekstrom EH K S T R AH M
+el EH L
+el-al EH L AE L
+el-greco EH L G R EH K OW
+el-nino EH L N IY N Y OW
+el-paso EH L P AE S OW
+el-salvador EH L S AE L V AH D AO R
+ela EH L AH
+elaborate IH L AE B R AH T
+elaborate(2) IH L AE B ER EY T
+elaborated IH L AE B ER EY T AH D
+elaborately IH L AE B R AH T L IY
+elaborates IH L AE B ER EY T S
+elaborating IH L AE B ER EY T IH NG
+elaboration IH L AE B ER EY SH AH N
+elaina IH L EY N AH
+elaine IH L EY N
+elaine's AH L EY N Z
+elaine's(2) IY L EY N Z
+elaine's(3) IH L EY N Z
+elaine(2) AH L EY N
+elaine(3) IY L EY N
+elaire IH L EY R
+elam EH L AH M
+elamin EH L AH M IH N
+elan IY L AH N
+eland IY L AH N D
+elane IH L EY N
+elapse IH L AE P S
+elapsed IH L AE P S T
+elardo EH L AA R D OW
+elastic IH L AE S T IH K
+elasticity IY L AE S T IH S AH T IY
+elastomer IH L AE S T AH M ER
+elastomers IH L AE S T AH M ER Z
+elat EH L AE T
+elata EH L AA T AH
+elate IH L EY T
+elated IH L EY T AH D
+elated(2) IH L EY T IH D
+elater EH L AH T ER
+elater(2) IH L EY T ER
+elaters EH L AH T ER Z
+elaters(2) IH L EY T ER Z
+elates IH L EY T S
+elating IH L EY T IH NG
+elation IH L EY SH AH N
+elayne IH L EY N
+elbaum EH L B AW M
+elbe EH L B
+elber EH L B ER
+elberson EH L B ER S AH N
+elbert EH L B ER T
+elberta EH L B EH R T AH
+elbertine EH L B ER T IY N
+elbow EH L B OW
+elbowed EH L B OW D
+elbowing EH L B OW IH NG
+elbowroom EH L B OW R UW M
+elbows EH L B OW Z
+elbrick EH L B R IH K
+elbrick's EH L B R IH K S
+elbrus EH L B R AH S
+elchibey EH L CH AH B EY
+elco EH L K OW
+elcock IH L K AA K
+elcor EH L K AO R
+elcotel EH L K OW T EH L
+eldar EH L D AA R
+elden EH L D AH N
+elder EH L D ER
+elderkin EH L D ER K IH N
+elderly EH L D ER L IY
+elderly's EH L D ER L IY Z
+elders EH L D ER Z
+elders' EH L D ER Z
+elders's EH L D ER Z IH Z
+eldest EH L D AH S T
+eldin EH L D IH N
+eldon IH L D AA N
+eldora EH L D AO R AH
+eldorado EH L D ER AA D OW
+eldorado's EH L D ER AA D OW Z
+eldred EH L D ER D
+eldredge IH L D R EH JH
+eldreth IH L D R EH TH
+eldric EH L D R IH K
+eldrida EH L D R IY D AH
+eldridge EH L D R IH JH
+eldritch EH L D R IH CH
+eldwin IH L D W IH N
+eleanor EH L AH N AO R
+eleanor's EH L AH N AO R Z
+eleanor's(2) EH L AH N ER Z
+eleanor(2) EH L AH N ER
+eleanora EH L AH N AO R AH
+eleanore EH L AH N AO R
+eleazer EH L AH Z ER
+elect IH L EH K T
+elect's IH L EH K T S
+electability IH L EH K T AH B IH L AH T IY
+electable IH L EH K T AH B AH L
+elected IH L EH K T AH D
+elected(2) IH L EH K T IH D
+electing IH L EH K T IH NG
+election IH L EH K SH AH N
+election's IH L EH K SH AH N Z
+electioneer IH L EH K SH AH N IH R
+electioneering IH L EH K SH AH N IH R IH NG
+electioneers IH L EH K SH AH N IH R Z
+elections IH L EH K SH AH N Z
+elective IH L EH K T IH V
+electives IH L EH K T IH V Z
+electoral IH L EH K T ER AH L
+electorate IH L EH K T ER AH T
+electorate's IH L EH K T ER AH T S
+electorate(2) IH L EH K T R IH T
+electorates IH L EH K T ER AH T S
+electors IH L EH K T ER Z
+electra IH L EH K T R AH
+electric IH L EH K T R IH K
+electric's IH L EH K T R IH K S
+electrical IH L EH K T R IH K AH L
+electrically IH L EH K T R IH K AH L IY
+electrically(2) IH L EH K T R IH K L IY
+electricals IH L EH K T R IH K AH L Z
+electricar IH L EH K T R IH K AA R
+electrician IH L EH K T R IH SH AH N
+electricians IH L EH K T R IH SH AH N Z
+electricians' IH L EH K T R IH SH AH N Z
+electricite AH L EH K T R IH S IH T EY
+electricity IH L EH K T R IH S AH T IY
+electrics IH L EH K T R IH K S
+electrification IH L EH K T R AH F IH K EY SH AH N
+electrified IH L EH K T R AH F AY D
+electrifies IH L EH K T R AH F AY Z
+electrify IH L EH K T R AH F AY
+electrifying IH L EH K T R AH F AY IH NG
+electrique EH L EH K T R IY K
+electro IH L EH K T R OW
+electrobiology IH L EH K T R OW B AY AA L AH JH IY
+electrobiology's IH L EH K T R OW B AY AA L AH JH IY Z
+electrocardiogram IH L EH K T R OW K AA R D IY AH G R AE M
+electrocardiograms IH L EH K T R OW K AA R D IY AH G R AE M Z
+electrochemical AH L EH K T R OW K EH M IH K AH L
+electrocom IH L EH K T R OW K AA M
+electrocute IH L EH K T R AH K Y UW T
+electrocuted IH L EH K T R AH K Y UW T IH D
+electrocution IH L EH K T R AH K Y UW SH AH N
+electrocutions AH L EH K T R AH K Y UW SH AH N Z
+electrode IH L EH K T R OW D
+electrodes IH L EH K T R OW D Z
+electrodynamic IH L EH K T R OW D AY N AE M IH K
+electrodynamics IH L EH K T R OW D AY N AE M IH K S
+electrolux IH L EH K T R AH L AH K S
+electrolysis IH L EH K T R AA L AH S AH S
+electrolytic IH L EH K T R AH L IH T IH K
+electromagnet IH L EH K T R OW M AE G N AH T
+electromagnetic IH L EH K T R OW M AE G N EH T IH K
+electromagnetism IH L EH K T R OW M AE G N AH T IH Z AH M
+electromagnets IH L EH K T R OW M AE G N AH T S
+electromechanical IH L EH K T R OW M AH K AE N IH K AH L
+electromedics IH L EH K T R OW M EH D IH K S
+electron IH L EH K T R AA N
+electronic IH L EH K T R AA N IH K
+electronically IH L EH K T R AA N IH K AH L IY
+electronically(2) IH L EH K T R AA N IH K L IY
+electronics IH L EH K T R AA N IH K S
+electronics' IH L EH K T R AA N IH K S
+electrons IH L EH K T R AA N Z
+electrophoresis IH L EH K T R OW F AO R IH S IH S
+electrophoresis(2) IH L EH K T R OW F ER IY S IH S
+electrophoretogram IH L EH K T R AA F AH R EH T AH G R AE M
+electroplate IH L EH K T R AH P L EY T
+electroplating IH L EH K T R AH P L EY T IH NG
+electroshock IH L EH K T R OW SH AA K
+electrosound IH L EH K T R OW S AW N D
+electrospace IH L EH K T R OW S P EY S
+electrospray IH L EH K T R OW S P R EY
+electrostatic IH L EH K T R OW S T AE T IH K
+elects IH L EH K T S
+eledge EH L IH JH
+eleen EH L IY N
+elefante EH L EH F AA N T IY
+elegance EH L AH G AH N S
+elegant EH L AH G AH N T
+elegantly EH L IH G AH N T L IY
+elegy EH L AH JH IY
+elek EH L IH K
+elektra EH L EH K T R AH
+elektrisk IH L EH K T R IH S K
+elektrizitaetswerk EH L IH K T R IH Z IH T AE T S W ER K
+elektron IH L EH K T R AA N
+element EH L AH M AH N T
+elemental EH L AH M EH N T AH L
+elemental(2) EH L AH M EH N AH L
+elementary EH L AH M EH N T R IY
+elementary(2) EH L AH M EH N T ER R IY
+elementary(3) EH L AH M EH N CH R IY
+elements EH L AH M AH N T S
+elena EH L AH N AH
+elena(2) EH L EY N AH
+elenbaas EH L IH N B AA Z
+elene EH L IY N
+elenore EH L IH N ER
+eleonore EH L IY AH N AO R IY
+elephant EH L AH F AH N T
+elephant's EH L AH F AH N T S
+elephantiasis EH L IH F AH N T AY AH S IH S
+elephantine EH L AH F AE N T IY N
+elephants EH L AH F AH N T S
+elephants' EH L AH F AH N T S
+eletr EH L AH T ER
+eleuthera IH L UW TH ER AH
+elevate EH L AH V EY T
+elevated EH L AH V EY T IH D
+elevates EH L AH V EY T S
+elevating EH L AH V EY T IH NG
+elevation EH L AH V EY SH AH N
+elevations EH L AH V EY SH AH N Z
+elevator EH L AH V EY T ER
+elevators EH L AH V EY T ER Z
+eleven IH L EH V AH N
+eleven's IH L EH V AH N Z
+eleven's(2) IY L EH V AH N Z
+eleven(2) IY L EH V AH N
+elevens IH L EH V AH N Z
+elevens(2) IY L EH V AH N Z
+eleventh IH L EH V AH N TH
+eleventh(2) IY L EH V AH N TH
+elexis EH L EH K S IH S
+eley IY L IY
+elf EH L F
+elf's EH L F S
+elfers EH L F ER Z
+elfie EH L F IY
+elfin EH L F IH N
+elfish EH L F IH SH
+elfman EH L F M AH N
+elford EH L F ER D
+elfreda EH L F R EH D AH
+elfrida EH L F R IY D AH
+elfrieda EH L F R IY D AH
+elfrink EH L F R IH NG K
+elfstrom EH L F S T R AH M
+elg EH L G
+elga IH L G AA
+elgabrowny EH L G AH B R AW N IY
+elgar EH L G ER
+elgar's EH L G ER Z
+elgart EY L G AA R T
+elger EH L G ER
+elgersma EH L JH EH R S M AH
+elgie EH L JH IY
+elgin EH L JH IH N
+eli IY L AY
+elia AH L AY AH
+eliades IY L IY EY D Z
+elias AH L AY AH S
+eliason AH L AY AH S AH N
+eliassen AH L AY AH S AH N
+elich EH L IH K
+elicit IH L IH S IH T
+elicited IH L IH S IH T IH D
+eliciting IH L IH S AH T IH NG
+elicits IH L IH S AH T S
+elick EH L IH K
+elicker EH L IH K ER
+elie EH L IY
+eligaya EH L AH G AY AH
+eligibility EH L IH JH AH B IH L IH T IY
+eligible EH L AH JH AH B AH L
+eligible(2) EH L IH JH AH B AH L
+elihu EH L IH HH UW
+elijah EH L AY JH AH
+elijah(2) IY L AY JH AH
+eliminate IH L IH M AH N EY T
+eliminated IH L IH M AH N EY T AH D
+eliminated(2) IH L IH M AH N EY T IH D
+eliminates IH L IH M AH N EY T S
+eliminating IH L IH M AH N EY T IH NG
+elimination IH L IH M AH N EY SH AH N
+eliminations IH L IH M IH N EY SH AH N Z
+eline EH L AY N
+elinor EH L IH N ER
+elinore EH L IY N AO R IY
+elio EH L IY OW
+eliopoulos EH L IY AA P AH L IH S
+eliot EH L IY AH T
+eliot's EH L IY AH T S
+eliott EH L IY AA T
+elisa AH L IY S AH
+elisa's AH L IY S AH Z
+elisa's(2) AH L IY Z AH Z
+elisa(2) AH L IY Z AH
+elisabeth IH L IH Z AH B IH TH
+elise AH L IY S
+elish EH L IH SH
+elisha EH L IH SH AH
+elison EH L IH S AH N
+elissa EH L IY S AH
+elite IH L IY T
+elite(2) EY L IY T
+elites IH L IY T S
+elites(2) EY L IY T S
+elitism EH L IH T IH Z AH M
+elitism(2) EY L IY T IH Z AH M
+elitist EY L IY T IH S T
+elitist(2) IH L IY T IH S T
+elitists EY L IY T IH S T S
+elitists(2) IH L IY T IH S T S
+elitists(3) IH L IY T IH S S
+elitists(4) IH L IY T IH S
+elixir IH L IH K S ER
+eliza IH L AY Z AH
+elizabeth IH L IH Z AH B AH TH
+elizabeth's IH L IH Z AH B AH TH S
+elizabeth(2) IH L IH Z AH B IH TH
+elizabethan EH L IH Z AH B IY TH AH N
+elizabethtown AH L IH Z AH B EH TH T AW N
+elizalde EH L IY Z AA L D IY
+elizondo EH L IH Z AA N D OW
+eljer EH L JH ER
+elk EH L K
+elkes EH L K S
+elkhart EH L K HH AA R T
+elkhorn EH L K HH AO R N
+elkin IH L K IH N
+elkind IH L K AY N D
+elkind(2) EH L K IH N D
+elkington EH L K IH NG T AH N
+elkins EH L K IH N Z
+elko EH L K OW
+elks EH L K S
+elkton EH L K T AH N
+ell EH L
+ella EH L AH
+ella's EH L AH Z
+ellamay EH L AH M EY
+ellan EH L AH N
+ellan's EH L AH N Z
+ellard EH L ER D
+elle EH L
+elledge EH L IH JH
+ellefson EH L IH F S AH N
+ellegood EH L IH G UH D
+ellemann EH L AH M AH N
+ellen EH L AH N
+ellen's EH L AH N Z
+ellena EH L EH N AH
+ellenbecker EH L IH N B EH K ER
+ellenberg EH L AH N B ER G
+ellenberger EH L AH N B ER G ER
+ellenbogen EH L IH N B AH G AH N
+ellenburg EH L AH N B ER G
+ellender EH L EH N D ER
+ellene EH L IY N
+ellenpore EH L IH N P AO R
+ellenson EH L IH N S AH N
+ellenwood EH L AH N W UH D
+eller EH L ER
+ellerbe EH L ER B
+ellerbee IH L ER B IY
+ellerbrock IH L ER B R AH K
+ellerby EH L ER B IY
+ellerey EH L ER IY
+ellerman EH L ER M AH N
+ellers EH L ER Z
+ellert EH L ER T
+ellertson EH L ER T S AH N
+ellery EH L ER IY
+ellesmere EH L Z M IH R
+ellesse EH L EH S
+ellestad EH L IH S T AH D
+ellett EH L IH T
+ellette IH L EH T
+elley EH L IY
+ellice EH L IH S
+ellicott EH L IH K AA T
+ellie EH L IY
+elliff EH L IH F
+ellijay IY L AY JH EY
+elliman EH L IH M AH N
+elling EH L IH NG
+ellinger EH L IH NG ER
+ellingsen EH L IH NG S AH N
+ellingson EH L IH NG S AH N
+ellingsworth EH L IH NG Z W ER TH
+ellington EH L IH NG T AH N
+ellington's EH L IH NG T AH N Z
+ellingwood EH L IH NG W UH D
+ellinwood EH L IH N W UH D
+ellios EH L Y OW S
+elliot EH L IY AH T
+elliott EH L IY AH T
+elliott's EH L IY AH T S
+ellipse IH L IH P S
+ellipsoid IH L IH P S OY D
+ellipsoids IH L IH P S OY D Z
+elliptical IH L IH P T IH K AH L
+ellis EH L IH S
+ellis's EH L IH S IH Z
+ellison EH L IH S AH N
+ellisor EH L IH S ER
+elliston EH L IH S T AA N
+ellithorpe EH L IH TH ER P
+ellman EH L M AH N
+ellmann EH L M AH N
+ellner EH L N ER
+ellroy EH L R OY
+ells EH L Z
+ellsberg EH L Z B ER G
+ellsberg's EH L Z B ER G Z
+ellsburg EH L Z B ER G
+ellsworth EH L Z W ER TH
+ellwanger EH L W AO NG ER
+ellwood EH L W UH D
+ellwood's EH L W UH D Z
+elly EH L IY
+ellyn EH L IH N
+ellyson EH L IH S AH N
+ellzey EH L Z IY
+elm EH L M
+elma EH L M AH
+elman EH L M AH N
+elmendorf EH L M IH N D AO R F
+elmer EH L M ER
+elmes EH L M Z
+elmhurst EH L M HH ER S T
+elmira EH L M AY R AH
+elmo EH L M OW
+elmootazbell EH L M UW T AH Z B EH L
+elmootazbellah EH L M UW T AH Z B EH L AH
+elmore EH L M AO R
+elmquist EH L M K W IH S T
+elms EH L M Z
+elmsford EH L M Z F ER D
+elmwood EH L M W UH D
+elna IH L N AA
+elnora EH L N AO R AH
+elnore IH L N AO R
+elnozahy EH L N OW Z AA HH IY
+elocution EH L AH K Y UW SH AH N
+elocutions EH L AH K Y UW SH AH N Z
+eloisa EH L OY S AH
+eloise IH L OY Z
+eloise(2) EH L OW IY Z
+elommal IH L OW M AH L
+elongate IH L AO NG G EY T
+elongated IH L AO NG G EY T AH D
+elongation IY L AO NG G EY SH AH N
+elope IH L OW P
+elopes IH L OW P S
+eloquence EH L AH K W AH N S
+eloquent EH L AH K W AH N T
+eloquently EH L AH K W AH N T L IY
+elouise EH L AH W IY Z
+eloy IY L OY
+elpers EH L P ER Z
+elrica EH L R IH K AH
+elrich EH L R IH CH
+elrick EH L R IH K
+elrod IH L R AA D
+elron EH L R AH N
+elroy IH L R OY
+els EH L Z
+elsa EH L S AH
+elsas EH L S AH Z
+elsasser EH L S AH S ER
+elsberry EH L Z B EH R IY
+elsbury EH L Z B EH R IY
+elsdon EH L S D AH N
+else EH L S
+else's EH L S IH Z
+elsea EH L S IY AH
+elsen EH L S AH N
+elser EH L S ER
+elses EH L S IH Z
+elsesser EH L S IH S ER
+elsevier EH L S EH V Y ER
+elsevier's EH L S EH V Y ER Z
+elsevier's(2) EH L S AH V IH R Z
+elsevier(2) EH L S AH V IH R
+elsewhere EH L S W EH R
+elsey EH L S IY
+elsie EH L S IY
+elsie's EH L S IY Z
+elsinore EH L S AH N AO R
+elsner EH L S N ER
+elson EH L S AH N
+elstad EH L S T AH D
+elster EH L S T ER
+elston IH L S T AA N
+elswick EH L Z W IH K
+elsworth EH L Z W ER TH
+elting EH L T IH NG
+elton EH L T AH N
+eltringham EH L T R IH NG AE M
+eltzroth EH L T S R AO TH
+elucidate IH L UW S AH D EY T
+elucidated IH L UW S AH D EY T AH D
+elucidative IH L UW S AH D EY T IH V
+elude IH L UW D
+eluded IH L UW D IH D
+eludes IH L UW D Z
+eluding IH L UW D IH NG
+elusive IH L UW S IH V
+elusiveness IH L UW S IH V N AH S
+elva EH L V AH
+elvera EY L V EH R AH
+elvers EH L V ER Z
+elves EH L V Z
+elvgren EH L V G R EH N
+elvia EH L V IY AH
+elvie EH L V IY
+elvin EH L V IH N
+elvina EH L V IY N AH
+elving EH L V IH NG
+elvington EH L V IH NG T AH N
+elvira EH L V AY R AH
+elvire EH L V AY R
+elvis EH L V IH S
+elvis' EH L V IH S
+elvis's EH L V IH S IH Z
+elvy EH L V IY
+elway EH L W EY
+elway's EH L W EY Z
+elwell IH L W EH L
+elwin EH L W IH N
+elwood EH L W UH D
+elxsi EH L K S IY
+ely IY L AY
+elyn EH L IH N
+elyria IH L IH R IY AH
+elyse EH L AY S
+elysee EH L IH S IY
+elysee(2) EH L IY S IY
+elysees EH L IH S IY Z
+elysees(2) EH L IY S IY Z
+elysia IH L IH ZH IY AH
+elysia(2) IH L IY ZH AH
+elysium IH L IH Z IY AH M
+elza EH L Z AH
+elzey EH L Z IY
+elzinga EH L Z IY NG G AH
+elzy EH L Z IY
+em EH M
+ema IY M AH
+emaciate IH M EY SH IY EY T
+emaciated IH M EY SH IY EY T IH D
+emaciates IH M EY SH IY EY T S
+emaciating IH M EY SH IY EY T IH NG
+emad IY M AE D
+email IY M EY L
+emailed IY M EY L D
+emailing IY M EY L IH NG
+emails IY M EY L Z
+emanate EH M AH N EY T
+emanated EH M AH N EY T IH D
+emanates EH M AH N EY T S
+emanating EH M AH N EY T IH NG
+emanation EH M AH N EY SH AH N
+emanations EH M AH N EY SH AH N Z
+emancipate IH M AE N S AH P EY T
+emancipated IH M AE N S AH P EY T IH D
+emancipates IH M AE N S AH P EY T S
+emancipating IH M AE N S AH P EY T IH NG
+emancipation IH M AE N S AH P EY SH AH N
+emancipations IH M AE N S AH P EY SH AH N Z
+emanuel IH M AE N Y UW AH L
+emanuele EY M AA N UW EH L EY
+emanuelson IH M AE N UW L S AH N
+emard EH M ER D
+emasculate AH M AE S K Y UW L IH T
+emasculate(2) AH M AE S K Y UW L EY T
+emasculated AH M AE S K Y UW L EY T IH D
+embalm EH M B AA M
+embalmed EH M B AA M D
+embalming EH M B AA M IH NG
+embankment EH M B AE NG K M AH N T
+embankments EH M B AE NG K M AH N T S
+embarcadero EH M B AA R K AH D EH R OW
+embargo EH M B AA R G OW
+embargoed IH M B AA R G OW D
+embargoes EH M B AA R G OW Z
+embark EH M B AA R K
+embark(2) IH M B AA R K
+embarkation EH M B AA R K EY SH AH N
+embarked EH M B AA R K T
+embarking EH M B AA R K IH NG
+embarks IH M B AA R K S
+embarrass IH M B EH R AH S
+embarrassed IH M B EH R AH S T
+embarrasses IH M B AE R AH S IH Z
+embarrassing IH M B EH R AH S IH NG
+embarrassingly IH M B EH R AH S IH NG L IY
+embarrassment IH M B EH R AH S M AH N T
+embarrassments IH M B EH R AH S M AH N T S
+embassies EH M B AH S IY Z
+embassy EH M B AH S IY
+embassy's EH M B AH S IY Z
+embattle EH M B AE T AH L
+embattled EH M B AE T AH L D
+embayment EH M B EY M AH N T
+embed IH M B EH D
+embedded EH M B EH D IH D
+embellish IH M B EH L IH SH
+embellished EH M B EH L IH SH T
+embellishes EH M B EH L IH SH AH Z
+embellishing EH M B EH L IH SH IH NG
+embellishment EH M B EH L IH SH M AH N T
+ember EH M B ER
+embers EH M B ER Z
+emberson EH M B ER S AH N
+emberton IH M B ER T AH N
+emberton(2) EH M B ER T AH N
+embezzle IH M B EH Z AH L
+embezzled IH M B EH Z AH L D
+embezzlement EH M B EH Z AH L M AH N T
+embezzler IH M B EH Z AH L ER
+embezzler(2) EH M B EH Z L ER
+embezzlers IH M B EH Z AH L ER Z
+embezzlers(2) EH M B EH Z L ER Z
+embezzles IH M B EH Z AH L Z
+embezzling IH M B EH Z AH L IH NG
+embezzling(2) EH M B EH Z L IH NG
+embezzling(3) IH M B EH Z L IH NG
+embezzling(4) EH M B EH Z AH L IH NG
+embitter EH M B IH T ER
+embittered EH M B IH T ER D
+emblazon EH M B L EY Z AH N
+emblazoned EH M B L EY Z AH N D
+emblem EH M B L AH M
+emblematic EH M B L AH M AE T IH K
+emblems EH M B L AH M Z
+embler EH M B L ER
+embleton EH M B L IH T AA N
+embleton(2) EH M B AH L T AA N
+embodied IH M B AA D IY D
+embodies EH M B AA D IY Z
+embodiment EH M B AA D IY M AH N T
+embody IH M B AA D IY
+embodying IH M B AA D IY IH NG
+embolden EH M B OW L D AH N
+emboldened EH M B OW L D AH N D
+embolism EH M B OW L IH Z AH M
+embolisms EH M B OW L IH Z AH M Z
+emboss IH M B AO S
+embossed IH M B AO S T
+embrace EH M B R EY S
+embrace(2) IH M B R EY S
+embraceable IH M B R EY S AH B AH L
+embraced EH M B R EY S T
+embraces EH M B R EY S IH Z
+embracing EH M B R EY S IH NG
+embree IH M B R IY
+embrey EH M B R IY
+embroider IH M B R OY D ER
+embroidered EH M B R OY D ER D
+embroiderer EH M B R OY D ER ER
+embroiderers EH M B R OY D ER ER Z
+embroideries IH M B R OY D ER IY Z
+embroidering EH M B R OY D ER IH NG
+embroidery EH M B R OY D ER IY
+embroil EH M B R OY L
+embroiled EH M B R OY L D
+embrose EH M B R OW Z
+embry EH M B R IY
+embryo EH M B R IY OW
+embryology EH M B R IY AA L AH JH IY
+embryonic EH M B R IY AA N IH K
+embryos EH M B R IY OW Z
+embury EH M B EH R IY
+emcee EH M S IY
+emch EH M CH
+emco EH M K OW
+emde EH M D
+emdr IY EH M D IY AA R
+emel EH M AH L
+emelda EH M EH L D AH
+emelie EH M AH L IY
+emelina EH M EH L IY N AH
+emeline EH M IH L AY N
+emelita EH M EH L IY T AH
+emelyne EH M IH L AY N
+emens EH M EH N Z
+emera EH M EH R AH
+emerald EH M R AH L D
+emerald(2) EH M ER R AH L D
+emeralds EH M R AH L D Z
+emeralds(2) EH M ER R AH L D Z
+emerant EY M EH R AH N T
+emeraude EH M ER AW D
+emerge IH M ER JH
+emerge(2) IY M ER JH
+emerged IH M ER JH D
+emerged(2) IY M ER JH D
+emergence IH M ER JH AH N S
+emergence(2) IY M ER JH AH N S
+emergencies IH M ER JH AH N S IY Z
+emergencies(2) IY M ER JH AH N S IY Z
+emergency IH M ER JH AH N S IY
+emergency(2) IY M ER JH AH N S IY
+emergent IH M ER JH AH N T
+emergent(2) IY M ER JH AH N T
+emerges IH M ER JH IH Z
+emerges(2) IY M ER JH IH Z
+emerging IH M ER JH IH NG
+emerging(2) IY M ER JH IH NG
+emerich EH M ER IH K
+emerick EH M ER IH K
+emerine EH M ER IY N
+emeritus IH M EH R AH T AH S
+emerse IH M ER S
+emersed IH M ER S T
+emerson EH M ER S AH N
+emerson's EH M ER S AH N Z
+emert EH M ER T
+emerton IH M ER T AH N
+emerton(2) EH M ER T AH N
+emery EH M ER IY
+emery's EH M ER IY Z
+emeryville EH M ER IY V IH L
+emetic IH M EH T IH K
+emfinger EH M F IH NG ER
+emge EH M JH
+emhart EH M HH AA R T
+emick EH M IH K
+emig EH M IH G
+emigh EH M AY
+emigrant EH M AH G R AH N T
+emigrants EH M AH G R AH N T S
+emigrate EH M AH G R EY T
+emigrated EH M AH G R EY T IH D
+emigrates EH M AH G R EY T S
+emigrating EH M AH G R EY T IH NG
+emigration EH M AH G R EY SH AH N
+emigrations EH M AH G R EY SH AH N Z
+emigre EH M AH G R EY
+emigres EH M AH G R EY Z
+emil EH M IY L
+emile EY M IY L
+emilia AH M IY L IY AH
+emilie EH M AH L IY
+emilio AH M IY L IY OW
+emilo EH M IY L OW
+emilo's EH M IY L OW Z
+emily EH M IH L IY
+emily's EH M IH L IY Z
+emina EH M IY N AH
+eminase EH M IH N AA S IY
+eminence EH M AH N AH N S
+eminences EH M AH N AH N S IH Z
+eminent EH M AH N AH N T
+eminently EH M AH N AH N T L IY
+emir IH M IH R
+emir(2) EY M IH R
+emirate EH M ER AH T
+emirate(2) EH M ER EY T
+emirates EH M ER AH T S
+emirates' EH M ER AH T S
+emirates'(2) EH M ER EY T S
+emirates(2) EH M ER EY T S
+emison EH M IH S AH N
+emissaries EH M AH S EH R IY Z
+emissary EH M AH S EH R IY
+emission IH M IH SH AH N
+emissions IH M IH SH AH N Z
+emit IH M IH T
+emits IH M IH T S
+emitted IH M IH T AH D
+emitted(2) IH M IH T IH D
+emitter IH M IH T ER
+emitting IH M IH T IH NG
+emler EH M L ER
+emley EH M L IY
+emling EH M L IH NG
+emlyn IH M L IH N
+emlynne IH M L AY N
+emma EH M AH
+emmaline EH M AA L IY N IY
+emmanuel IH M AE N Y UW AH L
+emmaus EH M AW S
+emme EH M
+emmel EH M AH L
+emmeline EH M AH L AY N
+emmendorfer EH M IH N D AO R F ER
+emmer EH M ER
+emmerich EH M ER IH K
+emmerling EH M ER L IH NG
+emmerson EH M ER S AH N
+emmert EH M ER T
+emmery EH M ER IY
+emmet EH M IH T
+emmett EH M IH T
+emmi EH M IY
+emmick EH M IH K
+emmie EH M IY
+emminger EH M IH NG ER
+emmis EH M IH S
+emmit EH M IH T
+emmitt EH M IH T
+emmons EH M AH N Z
+emmott EH M AH T
+emmy EH M IY
+emmy's EH M IY Z
+emmys EH M IY Z
+emogene EH M AH G IY N
+emond EH M AH N D
+emory EH M ER IY
+emory's EH M ER IY Z
+emoticon AH M OW T AH K AA N
+emotion IH M OW SH AH N
+emotion(2) IY M OW SH AH N
+emotional IH M OW SH AH N AH L
+emotional(2) IY M OW SH AH N AH L
+emotionalism IH M OW SH AH N AH L IH Z AH M
+emotionalism(2) IY M OW SH AH N AH L IH Z AH M
+emotionally IH M OW SH N AH L IY
+emotionally(2) IY M OW SH N AH L IY
+emotions IH M OW SH AH N Z
+emotions(2) IY M OW SH AH N Z
+emotive IH M OW T IH V
+emotive(2) IY M OW T IH V
+empanel IH M P AE N AH L
+empaneled IH M P AE N AH L D
+empaneling EH M P AE N AH L IH NG
+empaneling(2) EH M P AE N L IH NG
+empath EH M P AE TH
+empathetic EH M P AH TH EH T IH K
+empathize EH M P AH TH AY Z
+empathy EH M P AH TH IY
+emperor EH M P ER ER
+emperor's EH M P ER ER Z
+emperors EH M P ER ER Z
+empey EH M P IY
+emphases EH M F AH S IY Z
+emphasis EH M F AH S AH S
+emphasis(2) EH M F AH S IH S
+emphasize EH M F AH S AY Z
+emphasized EH M F AH S AY Z D
+emphasizes EH M F AH S AY Z AH Z
+emphasizes(2) EH M F AH S AY Z IH Z
+emphasizing EH M F AH S AY Z IH NG
+emphatic EH M F AE T IH K
+emphatically EH M F AE T IH K L IY
+emphatically(2) EH M F AE T IH K AH L IY
+emphysema EH M F AH Z IY M AH
+empie EH M P IY
+empire EH M P AY ER
+empire's EH M P AY ER Z
+empires EH M P AY ER Z
+empirical EH M P IH R IH K AH L
+empirically EH M P IH R IH K AH L IY
+empirically(2) EH M P IH R IH K L IY
+empiricism EH M P IH R AH S IH Z AH M
+empiricist IH M P IH R AH S AH S T
+emplacement IH M P L EY S M AH N T
+emplacements IH M P L EY S M AH N T S
+employ EH M P L OY
+employ(2) IH M P L OY
+employable EH M P L OY AH B AH L
+employed EH M P L OY D
+employed(2) IH M P L OY D
+employee EH M P L OY IY
+employee's EH M P L OY IY Z
+employee's(2) IH M P L OY IY Z
+employee(2) IH M P L OY IY
+employees EH M P L OY IY Z
+employees' EH M P L OY IY Z
+employees(2) IH M P L OY IY Z
+employer EH M P L OY ER
+employer's EH M P L OY ER Z
+employer's(2) IH M P L OY ER Z
+employer(2) IH M P L OY ER
+employers EH M P L OY ER Z
+employers' EH M P L OY ER Z
+employers'(2) IH M P L OY ER Z
+employers(2) IH M P L OY ER Z
+employing EH M P L OY IH NG
+employing(2) IH M P L OY IH NG
+employment EH M P L OY M AH N T
+employment(2) IH M P L OY M AH N T
+employments EH M P L OY M AH N T S
+employments(2) IH M P L OY M AH N T S
+employs EH M P L OY Z
+employs(2) IH M P L OY Z
+emporia EH M P AO R IY AH
+emporium EH M P AO R IY AH M
+empower IH M P AW ER
+empowered IH M P AW ER D
+empowering IH M P AW ER IH NG
+empowerment IH M P AW ER M AH N T
+empowers IH M P AW ER Z
+empresa EH M P R EH S AH
+empresas EH M P R EH S AH Z
+empress EH M P R EH S
+emprise EH M P R AY Z
+empson EH M P S AH N
+empt EH M P T
+empt(2) EH M T
+empted EH M P T IH D
+empted(2) EH M T IH D
+emptied EH M P T IY D
+emptied(2) EH M T IY D
+emptier EH M P T IY ER
+emptier(2) EH M T IY ER
+empties EH M P T IY Z
+empties(2) EH M T IY Z
+emptiness EH M P T IY N AH S
+emptiness(2) EH M T IY N AH S
+empting EH M P T IH NG
+empting(2) EH M T IH NG
+emption EH M P SH AH N
+emptive EH M P T IH V
+emptor EH M P T ER
+empts EH M P T S
+empty EH M P T IY
+empty(2) EH M T IY
+emptying EH M P T IY IH NG
+emptying(2) EH M T IY IH NG
+emrich EH M R IH K
+emrick EH M R IH K
+emry EH M R IY
+emslie EH M S AH L IY
+emswiler EH M Z W AY L ER
+emu IY M Y UW
+emuil EH M Y UW IH L
+emuil's EH M Y UW IH L Z
+emulate EH M Y AH L EY T
+emulated EH M Y AH L EY T IH D
+emulates EH M Y AH L EY T S
+emulating EH M Y AH L EY T IH NG
+emulation EH M Y AH L EY SH AH N
+emulex EH M Y UW L AH K S
+emulsifier IH M AH L S AH F AY ER
+emulsion IH M AH L SH AH N
+en EH N
+ena EH N AH
+enable EH N EY B AH L
+enable(2) IH N EY B AH L
+enabled EH N EY B AH L D
+enabled(2) IH N EY B AH L D
+enabler EH N EY B AH L ER
+enabler(2) EH N EY B L ER
+enabler(3) IH N EY B L ER
+enabler(4) IH N EY B AH L ER
+enables EH N EY B AH L Z
+enables(2) IH N EY B AH L Z
+enabling EH N EY B AH L IH NG
+enabling(2) IH N EY B AH L IH NG
+enabling(3) IH N EY B L IH NG
+enact IH N AE K T
+enacted EH N AE K T AH D
+enacting EH N AE K T IH NG
+enactment EH N AE K T M AH N T
+enactment(2) EH N AE K M AH N T
+enactments EH N AE K T M AH N T S
+enactments(2) EH N AE K M AH N T S
+enactments(3) EH N AE K M AH N S
+enacts IH N AE K T S
+enamel IH N AE M AH L
+enameled IH N AE M AH L D
+enamels IH N AE M AH L Z
+enamor EH N AE M ER
+enamored EH N AE M ER D
+enamoring EH N AE M ER IH NG
+enamors EH N AE M ER Z
+enasa EY N AA S AH
+enberg EH N B ER G
+encamp IH N K AE M P
+encamped IH N K AE M P T
+encampment IH N K AE M P M IH N T
+encampments IH N K AE M P M IH N T S
+encapsulate EH N K AE P S AH L EY T
+encapsulated EH N K AE P S AH L EY T IH D
+encapsulating EH N K AE P S AH L EY T IH NG
+encarnacion IH N K AA R N AA S IY AO N
+encarta EH N K AA R T AH
+encase EH N K EY S
+encased EH N K EY S T
+encata EH N K AA T AH
+encata's EH N K AA T AH Z
+encephalitis EH N S EH F AH L AY T AH S
+encephalopathy EH N S EH F AH L AO P AH TH IY
+enchant EH N CH AE N T
+enchanted EH N CH AE N T IH D
+enchanted(2) EH N CH AE N IH D
+enchanter EH N CH AE N T ER
+enchanter's EH N CH AE N T ER Z
+enchanter's(2) IH N CH AE N T ER Z
+enchanter's(3) EH N CH AE N ER Z
+enchanter's(4) IH N CH AE N ER Z
+enchanters EH N CH AE N T ER Z
+enchanters(2) IH N CH AE N T ER Z
+enchanters(3) EH N CH AE N ER Z
+enchanters(4) IH N CH AE N ER Z
+enchanting EH N CH AE N T IH NG
+enchanting(2) EH N CH AE N IH NG
+enchantment EH N CH AE N T M AH N T
+enchilada EH N CH IH L AA D AH
+encinas EH N S IH N AH Z
+encinias IH N S IY N IY AH Z
+encino EH N S IY N OW
+encircle EH N S ER K AH L
+encircled IH N S ER K AH L D
+encirclement EH N S ER K AH L M AH N T
+encircling EH N S ER K AH L IH NG
+encircling(2) EH N S ER K L IH NG
+enciso IH N S IY S OW
+enck EH NG K
+enclave AA N K L EY V
+enclave(2) EH N K L EY V
+enclaves AA N K L EY V Z
+enclaves(2) EH N K L EY V Z
+enclose IH N K L OW Z
+enclosed EH N K L OW Z D
+enclosed(2) IH N K L OW Z D
+enclosing EH N K L OW Z IH NG
+enclosure EH N K L OW ZH ER
+enclosure(2) IH N K L OW ZH ER
+enclosures IH N K L OW ZH ER Z
+encode EH N K OW D
+encoded EH N K OW D IH D
+encoding EH N K OW D IH NG
+encompass EH N K AH M P AH S
+encompassed EH N K AH M P AH S T
+encompasses EH N K AH M P AH S AH Z
+encompassing EH N K AH M P AH S IH NG
+encor EH N K AO R
+encor's EH N K AO R Z
+encore AA N K AO R
+encores AA N K AO R Z
+encounter IH N K AW N T ER
+encounter(2) IH N K AW N ER
+encountered IH N K AW N T ER D
+encountered(2) IH N K AW N ER D
+encountering EH N K AW N T ER IH NG
+encountering(2) EH N K AW N ER IH NG
+encounters IH N K AW N T ER Z
+encounters(2) IH N K AW N ER Z
+encourage EH N K ER IH JH
+encourage(2) IH N K ER AH JH
+encouraged EH N K ER IH JH D
+encouraged(2) IH N K ER AH JH D
+encouragement EH N K ER IH JH M AH N T
+encourages EH N K ER IH JH IH Z
+encourages(2) IH N K ER AH JH AH Z
+encouraging EH N K ER IH JH IH NG
+encouraging(2) IH N K ER AH JH IH NG
+encroach IH N K R OW CH
+encroached IH N K R OW CH T
+encroaches IH N K R OW CH IH Z
+encroaching IH N K R OW CH IH NG
+encroachment EH N K R OW CH M AH N T
+encroachments IH N K R OW CH M AH N T S
+encrust EH N K R AH S T
+encrusted EH N K R AH S T IH D
+encrusting EH N K R AH S T IH NG
+encrypt EH N K R IH P T
+encrypt(2) IH N K R IH P T
+encrypted EH N K R IH P T IH D
+encrypted(2) IH N K R IH P T IH D
+encryption EH N K R IH P SH AH N
+encumber EH N K AH M B ER
+encumbered EH N K AH M B ER D
+encyclical EH N S IH K L IH K AH L
+encyclicals EH N S IH K L IH K AH L Z
+encyclopaedia IH N S AY K L AH P IY D IY AH
+encyclopaedia(2) IH N S AY K L OW P IY D IY AH
+encyclopedia IH N S AY K L AH P IY D IY AH
+encyclopedia(2) IH N S AY K L OW P IY D IY AH
+encyclopedias IH N S AY K L AH P IY D IY AH Z
+encyclopedias(2) IH N S AY K L OW P IY D IY AH Z
+encyclopedic IH N S AY K L AH P IY D IH K
+encyclopedic(2) IH N S AY K L OW P IY D IH K
+encyclopedist IH N S AY K L AH P IY D AH S T
+encyclopedist(2) IH N S AY K L OW P IY D AH S T
+end EH N D
+endaka EH N D AA K AH
+endanger EH N D EY N JH ER
+endangered EH N D EY N JH ER D
+endangered(2) IH N D EY N JH ER D
+endangering EH N D EY N JH ER IH NG
+endangerment EH N D EY N JH ER M AH N T
+endangers EH N D EY N JH ER Z
+endara EH N D AA R AH
+ende EH N D
+endear EH N D IY R
+endeared EH N D IY R D
+endearing EH N D IY R IH NG
+endearment IH N D IH R M AH N T
+endeavor IH N D EH V ER
+endeavor's IH N D EH V ER Z
+endeavored IH N D EH V ER D
+endeavoring IH N D EH V ER IH NG
+endeavoring(2) IH N D EH V R IH NG
+endeavors IH N D EH V ER Z
+endeavour IH N D EH V ER
+endeavour's IH N D EH V ER Z
+ended EH N D AH D
+ended(2) EH N D IH D
+endelman EH N D AH L M AH N
+endemic EH N D EH M IH K
+ender EH N D ER
+enderby EH N D ER B IY
+enderle EH N D ER AH L
+enderlin EH N D ER L IH N
+enders EH N D ER Z
+enderson EH N D ER S AH N
+endevco EH N D EH V K OW
+endgame EH N D G EY M
+endgames EH N D G EY M Z
+endicott EH N D IH K AA T
+ending EH N D IH NG
+endings EH N D IH NG Z
+endive EH N D IH V
+endler EH N D L ER
+endless EH N D L AH S
+endlessly EH N D L AH S L IY
+endlich EH N D L IH K
+endo EH N D OW
+endocrine EH N D OW K R AY N
+endocrinologist EH N D OW K R AH N AA L AH JH AH S T
+endocrinologist's EH N D OW K R AH N AA L AH JH AH S T S
+endocrinologists EH N D OW K R AH N AA L AH JH AH S T S
+endocrinologists(2) EH N D OW K R AH N AA L AH JH AH S S
+endocrinologists(3) EH N D OW K R AH N AA L AH JH AH S
+endocrinology EH N D OW K R AH N AA L AH JH IY
+endodermal EH N D OW D ER M AH L
+endometrial EH N D OW M EH T R IY AH L
+endometriosis EH N D OW M EH T R IY OW S IH S
+endorphin EH N D AO R F IH N
+endorphins EH N D AO R F IH N Z
+endorse EH N D AO R S
+endorsed EH N D AO R S T
+endorsement EH N D AO R S M AH N T
+endorsements EH N D AO R S M AH N T S
+endorser IH N D AO R S ER
+endorsers IH N D AO R S ER Z
+endorses EH N D AO R S IH Z
+endorsing EH N D AO R S IH NG
+endoscopic EH N D OW S K AA P IH K
+endosperm EH N D AH S P ER M
+endothermic EH N D OW TH ER M IH K
+endotronics EH N D OW T R AA N IH K S
+endotronics' EH N D AH T R AA N IH K S
+endotronics's EH N D OW T R AA N IH K S IH Z
+endow EH N D AW
+endowed EH N D AW D
+endowing EH N D AW IH NG
+endowment EH N D AW M AH N T
+endowment's EH N D AW M AH N T S
+endowments EH N D AW M AH N T S
+endows EH N D AW Z
+endpoint EH N D P OY N T
+endpoints EH N D P OY N T S
+endproduct EH N D P R AO D AH K T
+endproducts EH N D P R AO D AH K T S
+endres EH N D ER Z
+endress EH N D R IH S
+endrizzi IH N D R IY T S IY
+ends EH N D Z
+endsley EH N D S L IY
+endtimer EH N D T AY M ER
+endtimers EH N D T AY M ER Z
+endued EH N D UW D
+endurance EH N D ER AH N S
+endure EH N D Y UH R
+endure(2) IH N D UH R
+endured EH N D Y UH R D
+endured(2) IH N D UH R D
+endures EH N D Y UH R Z
+endures(2) IH N D UH R Z
+enduring EH N D Y UH R IH NG
+enduring(2) IH N D UH R IH NG
+enduser EH N D Y UW Z ER
+endusers EH N D Y UW Z ER Z
+endy EH N D IY
+enea EH N IY AH
+enema EH N AH M AH
+enemas EH N AH M AH Z
+enemies EH N AH M IY Z
+enemies' EH N AH M IY Z
+enemy EH N AH M IY
+enemy's EH N AH M IY Z
+energas EH N ER G AE S
+energen EH N ER JH EH N
+energetic EH N ER JH EH T IH K
+energetically EH N ER JH EH T IH K L IY
+energies EH N ER JH IY Z
+energize EH N ER JH AY Z
+energized EH N ER JH AY Z D
+energizer EH N ER JH AY Z ER
+energizes EH N ER JH AY Z IH Z
+energizing EH N ER JH AY Z IH NG
+energy EH N ER JH IY
+energy's EH N ER JH IY Z
+enerson EH N ER S AH N
+enex IY N AH K S
+enfant EH N F AA N T
+enfant(2) AA N F AA N T
+enfeeble EH N F IY B AH L
+enfeebled EH N F IY B AH L D
+enfield EH N F IY L D
+enfield's EH N F IY L D Z
+enfinger EH N F IH NG ER
+enfold IH N F OW L D
+enfor EH N F ER
+enforce EH N F AO R S
+enforceability EH N F AO R S AH B IH L IH T IY
+enforceable EH N F AO R S AH B AH L
+enforced EH N F AO R S T
+enforcement EH N F AO R S M AH N T
+enforcement's EH N F AO R S M AH N T S
+enforcements EH N F AO R S M AH N T S
+enforcer EH N F AO R S ER
+enforcers EH N F AO R S ER Z
+enforces EH N F AO R S IH Z
+enforcing EH N F AO R S IH NG
+enfranchise IH N F R AE N CH AY Z
+enfranchised EH N F R AE N CH AY Z D
+enfranchises EH N F R AE N CH AY Z IH Z
+eng EH NG
+engage EH N G EY JH
+engaged EH N G EY JH D
+engagement EH N G EY JH M AH N T
+engagements EH N G EY JH M AH N T S
+engages EH N G EY JH IH Z
+engaging EH N G EY JH IH NG
+engberg EH NG B ER G
+engdahl EH NG D AA L
+enge EH N JH
+engebretsen EH NG G IH B R IH T S AH N
+engebretson EH NG G IH B R IH T S AH N
+engel EH N G AH L
+engelberg EH NG G AH L B ER G
+engelbert EH NG G IH L B ER T
+engelberta EH NG G EH L B EH R T AH
+engelbrecht EH NG G IH L B R IH K T
+engeleiter EH NG G AH L AY T ER
+engelhard EH NG G AH L HH AA R D
+engelhardt EH NG G IH L HH AA R T
+engelhart EH NG G AH L HH AA R T
+engelke EH NG G IH L K
+engelken EH NG G IH L K AH N
+engelking EH NG G IH L K IH NG
+engelman EH NG G AH L M AH N
+engelmann EH NG G AH L M AH N
+engels EH NG G AH L Z
+engelson EH NG G IH L S AH N
+engelstad EH NG G IH L S T AH D
+engeman EH N JH M AH N
+engen EH NG AH N
+engender EH N JH EH N D ER
+engender(2) IH N JH EH N D ER
+engendered EH N JH EH N D ER D
+engenders EH NG G AH N D ER Z
+enger EH NG G ER
+engert EH NG G ER T
+engesser EH NG G IH S ER
+engh EH NG
+engholm EH NG HH OW L M
+engine EH N JH AH N
+engine's EH N JH AH N Z
+engine(2) IH N JH AH N
+engined EH N JH AH N D
+engineer EH N JH AH N IH R
+engineer's EH N JH AH N IY R Z
+engineered EH N JH AH N IY R D
+engineering EH N JH AH N IH R IH NG
+engineers EH N JH AH N IH R Z
+engineers' EH N JH AH N IH R Z
+engines EH N JH AH N Z
+engines' EH NG G IY N Z
+england IH NG G L AH N D
+england's IH NG G L AH N D Z
+englander IH NG G L AH N D ER
+englanders IH NG G L AH N D ER Z
+englands IH NG G L AH N D Z
+englbred EH G AH L B R EH D
+engle EH NG G AH L
+englebert IH NG AH L B ER T
+englehardt IH NG AH L HH AA R T
+englehart IH NG AH L HH AA R T
+engleman IH NG AH L M AH N
+engler EH NG G AH L ER
+engler's EH NG G AH L ER Z
+engler's(2) EH NG G L ER Z
+engler(2) EH NG G L ER
+englert IH NG L ER T
+englerth IH NG L ER TH
+engles IH NG AH L Z
+englewood EH NG G AH L W UH D
+english IH NG G L IH SH
+english(2) IH NG L IH SH
+englishman IH NG G L IH SH M AH N
+englishmen EH NG L IH SH M AH N
+englishwoman IH NG G L IH SH W UH M AH N
+englund IH NG L AH N D
+engman EH NG M AH N
+engquist EH NG K W IH S T
+engram EH N G R AE M
+engrave IH N G R EY V
+engraved IH N G R EY V D
+engraver IH N G R EY V ER
+engraving IH N G R EY V IH NG
+engravings IH N G R EY V IH NG Z
+engross IH N G R OW S
+engrossed IH N G R OW S T
+engrossing IH N G R OW S IH NG
+engrossment IH N G R OW S M AH N T
+engstrand EH NG S T R AH N D
+engstrom EH NG S T R AH M
+engulf IH N G AH L F
+engulfed IH N G AH L F T
+engulfing IH N G AH L F IH NG
+engwall IH NG W AO L
+enhance EH N HH AE N S
+enhanced EH N HH AE N S T
+enhanced(2) IH N HH AE N S T
+enhancement EH N HH AE N S M AH N T
+enhancements EH N HH AE N S M AH N T S
+enhancer EH N HH AE N S ER
+enhances EH N HH AE N S IH Z
+enhancing EH N HH AE N S IH NG
+enholm EH N HH OW L M
+enholme EH N HH OW L M
+eniac IY N IY AE K
+enichem EH N IH CH AH M
+enid IY N IH D
+enigma IH N IH G M AH
+enigmatic EH N IH G M AE T IH K
+enimont IY N IH M AA N T
+enis EH N IH S
+enitt EH N IH T
+enix EH N IH K S
+enjoin EH N JH OY N
+enjoin(2) IH N JH OY N
+enjoined EH N JH OY N D
+enjoining EH N JH OY N IH NG
+enjoy EH N JH OY
+enjoy(2) IH N JH OY
+enjoyable EH N JH OY AH B AH L
+enjoyably EH N JH OY AH B L IY
+enjoyed EH N JH OY D
+enjoyed(2) IH N JH OY D
+enjoying EH N JH OY IH NG
+enjoying(2) IH N JH OY IH NG
+enjoyment EH N JH OY M AH N T
+enjoyment(2) IH N JH OY M AH N T
+enjoyments EH N JH OY M AH N T S
+enjoys EH N JH OY Z
+enjoys(2) IH N JH OY Z
+enke EH NG K
+enlarge EH N L AA R JH
+enlarge(2) IH N L AA R JH
+enlarged EH N L AA R JH D
+enlarged(2) IH N L AA R JH D
+enlargement IH N L AA R JH M AH N T
+enlargements IH N L AA R JH M AH N T S
+enlarger IH N L AA R G ER
+enlarges IH N L AA R JH IH Z
+enlarging IH N L AA R JH IH NG
+enlighten EH N L AY T AH N
+enlightened EH N L AY T AH N D
+enlightening EH N L AY T AH N IH NG
+enlightening(2) EH N L AY T N IH NG
+enlightenment EH N L AY T AH N M AH N T
+enlightens EH N L AY T AH N Z
+enlist EH N L IH S T
+enlisted EH N L IH S T IH D
+enlisted(2) IH N L IH S T AH D
+enlistee IH N L IH S T IY
+enlistees IH N L IH S T IY Z
+enlisting EH N L IH S T IH NG
+enlisting(2) IH N L IH S T IH NG
+enlistment EH N L IH S T M AH N T
+enlists EH N L IH S T S
+enlists(2) EH N L IH S S
+enlists(3) EH N L IH S
+enliven EH N L AY V AH N
+enlivened EH N L AY V AH N D
+enlivening EH N L AY V AH N IH NG
+enlivens EH N L AY V AH N Z
+enlo EH N L OW
+enloe IH N L OW
+enlow IH N L OW
+enman EH N M AH N
+enmesh EH N M EH SH
+enmeshed EH N M EH SH T
+enmeshes EH N M EH SH AH Z
+enmeshing EH N M EH SH IH NG
+enmities EH N M AH T IY Z
+enmities(2) EH N M IH T IY Z
+enmity EH N M AH T IY
+enmity(2) EH N M IH T IY
+ennea EH N IY AH
+enneking EH N IH K IH NG
+ennen EH N AH N
+ennes EH N Z
+ennes(2) EH N EH Z
+ennis EH N IH S
+ennoble IH N OW B AH L
+ennobled IH N OW B AH L D
+ennobles IH N OW B AH L Z
+ennobling IH N OW B L IH NG
+ennosuke EH N AH S UW K
+enns EH N Z
+ennui EH N UW IY
+eno EH N OW
+enoch IY N AH K
+enochs EH N AH K S
+enojada EH N OW JH AA D AH
+enola IH N OW L AH
+enomoto IH N OW M OW T OW
+enormity IH N AO R M AH T IY
+enormity(2) IY N AO R M AH T IY
+enormous IH N AO R M AH S
+enormous(2) IH N AO R M IH S
+enormous(3) IY N AO R M AH S
+enormous(4) IY N AO R M IH S
+enormously IH N AO R M AH S L IY
+enormously(2) IY N AO R M AH S L IY
+enos IY N AH S
+enough IH N AH F
+enough's IH N AH F S
+enough's(2) IY N AH F S
+enough(2) IY N AH F
+enqueso EH N K W EH S OW
+enquire IH N K W AY ER
+enquirer IH N K W AY R ER
+enquist EH N K W IH S T
+enrage EH N R EY JH
+enraged EH N R EY JH D
+enraged(2) IH N R EY JH D
+enrages EH N R EY JH AH Z
+enraging EH N R EY JH IH NG
+enrapture EH N R AE P CH ER
+enraptured EH N R AE P CH ER D
+enrica IH N R IY K AH
+enrich EH N R IH CH
+enrich(2) IH N R IH CH
+enriched EH N R IH CH T
+enriches EH N R IH CH IH Z
+enriching EH N R IH CH IH NG
+enriching(2) IH N R IH CH IH NG
+enrichment EH N R IH CH M AH N T
+enrichment(2) IH N R IH CH M AH N T
+enrico EH N R IY K OW
+enright IH N R AY T
+enrile EH N R IY L
+enrile(2) EH N R IY L EY
+enrique EH N R IY K EY
+enriquez IH N R IY K W EH Z
+enro EH N R OW
+enroll EH N R OW L
+enroll(2) IH N R OW L
+enrolled EH N R OW L D
+enrollee EH N R OW L IY
+enrollees EH N R OW L IY Z
+enrolling EH N R OW L IH NG
+enrollment EH N R OW L M AH N T
+enrollments EH N R OW L M AH N T S
+enrolls EH N R OW L Z
+enron EH N R AA N
+enron's EH N R AA N Z
+enroute EH N R UW T
+ensco EH N S K OW
+ensco's EH N S K OW Z
+ensconce IH N S K AA N S
+ensconced IH N S K AA N S T
+enseco EH N S EH K OW
+ensemble AA N S AA M B AH L
+ensembles AA N S AA M B AH L Z
+enserch EH N S ER CH
+ensey EH N Z IY
+enshrine EH N SH R AY N
+enshrined EH N SH R AY N D
+enshroud IH N SH R AW D
+enshrouded IH N SH R AW D AH D
+ensign EH N S AH N
+ensing EH N S IH NG
+ensinger EH N S IH N JH ER
+enskilda EH N S K IH L D AH
+enslave EH N S L EY V
+enslaved EH N S L EY V D
+enslavement EH N S L EY V M AH N T
+enslen EH N S AH L AH N
+ensley EH N S L IY
+enslin EH N S L IH N
+enslow IH N S L OW
+ensminger EH N S AH M IH NG ER
+ensnare IH N S N EH R
+ensnared IH N S N EH R D
+ensnares IH N S N EH R Z
+ensnarl IH N S N AA R L
+ensnarled IH N S N AA R L D
+ensor EH N S ER
+ensource EH N S AO R S
+ensrud EH N Z R UW D
+enstrom EH N S T R AH M
+ensue IH N S UW
+ensued IH N S UW D
+ensues IH N S UW Z
+ensuing EH N S UW IH NG
+ensure EH N SH UH R
+ensure(2) IH N SH UH R
+ensured EH N SH UH R D
+ensured(2) IH N SH UH R D
+ensures EH N SH UH R Z
+ensures(2) IH N SH UH R Z
+ensuring EH N SH UH R IH NG
+ensuring(2) IH N SH UH R IH NG
+ensz EH N SH
+ent EH N T
+entail EH N T EY L
+entailed IH N T EY L D
+entailing IH N T EY L IH NG
+entails IH N T EY L Z
+entangle EH N T AE NG G AH L
+entangled EH N T AE NG G AH L D
+entanglement EH N T AE NG G AH L M AH N T
+entanglement(2) IH N T AE NG G AH L M AH N T
+entanglements EH N T AE NG G AH L M AH N T S
+entanglements(2) IH N T AE NG G AH L M AH N T S
+entangling IH N T AE NG L IH NG
+entangling(2) EH N T AE NG L IH NG
+ente EH N T EY
+entebbe EH N T EH B IY
+entebbe's EH N T EH B IY Z
+entendre AA N T AA N D R AH
+entenmann EH N T AH N M AH N
+entenmann's EH N T AH N M AH N Z
+enter EH N T ER
+enter(2) EH N ER
+entered EH N T ER D
+entered(2) EH N ER D
+entergy EH N T ER JH IY
+entering EH N T ER IH NG
+entering(2) EH N ER IH NG
+enteritidis EH N T ER IH T IH D IH S
+enterividous EH N T ER IH V IH D AH S
+enterline EH N T ER L AY N
+enterline's EH N T ER L AY N Z
+enterococcus EH N T ER AH K AO K AH S
+enterology EH N T ER AA L AH JH IY
+enterprise EH N T ER P R AY Z
+enterprise's EH N T ER P R AY Z AH Z
+enterprise's(2) EH N T ER P R AY Z IH Z
+enterprise's(3) EH N ER P R AY Z AH Z
+enterprise's(4) EH N ER P R AY Z IH Z
+enterprise(2) EH N ER P R AY Z
+enterprises EH N T ER P R AY Z IH Z
+enterprises' EH N T ER P R AY Z IH Z
+enterprises'(2) EH N ER P R AY Z IH Z
+enterprises(2) EH N ER P R AY Z IH Z
+enterprising EH N T ER P R AY Z IH NG
+enterprising(2) EH N ER P R AY Z IH NG
+enterra EH N T EH R AH
+enters EH N T ER Z
+enters(2) EH N ER Z
+entertain EH N T ER T EY N
+entertain(2) EH N ER T EY N
+entertained EH N T ER T EY N D
+entertained(2) EH N ER T EY N D
+entertainer EH N T ER T EY N ER
+entertainer's EH N T ER T EY N ER Z
+entertainer's(2) EH N ER T EY N ER Z
+entertainer(2) EH N ER T EY N ER
+entertainers EH N T ER T EY N ER Z
+entertainers(2) EH N ER T EY N ER Z
+entertaining EH N T ER T EY N IH NG
+entertaining(2) EH N ER T EY N IH NG
+entertainment EH N T ER T EY N M AH N T
+entertainment's EH N T ER T EY N M AH N T S
+entertainment's(2) EH N ER T EY N M AH N T S
+entertainment(2) EH N ER T EY N M AH N T
+entertainments EH N T ER T EY N M AH N T S
+entertainments(2) EH N ER T EY N M AH N T S
+entertains EH N T ER T EY N Z
+entertains(2) EH N ER T EY N Z
+entex EH N T EH K S
+enthral EH N TH R AO L
+enthralled EH N TH R AO L D
+enthuse IH N TH UW Z
+enthused IH N TH UW Z D
+enthusiasm IH N TH UW Z IY AE Z AH M
+enthusiasms IH N TH UW Z IY AE Z AH M Z
+enthusiast EH N TH UW Z IY AE S T
+enthusiastic IH N TH UW Z IY AE S T IH K
+enthusiastically IH N TH UW Z IY AE S T IH K L IY
+enthusiasts EH N TH UW Z IY AE S T S
+enthusiasts(2) EH N TH UW Z IY AE S S
+enthusiasts(3) EH N TH UW Z IY AE S
+entice IH N T AY S
+enticed IH N T AY S T
+enticement IH N T AY S M AH N T
+enticements IH N T AY S M AH N T S
+enticing EH N T AY S IH NG
+entin EH N T IH N
+entire IH N T AY ER
+entirely IH N T AY ER L IY
+entirety IH N T AY ER T IY
+entities EH N T IH T IY Z
+entities' EH N T IH T IY Z
+entitle EH N T AY T AH L
+entitle(2) IH N T AY T AH L
+entitled EH N T AY T AH L D
+entitlement EH N T AY T AH L M AH N T
+entitlements EH N T AY T AH L M AH N T S
+entitles EH N T AY T AH L Z
+entitling EH N T AY T AH L IH NG
+entitling(2) EH N T AY T L IH NG
+entity EH N T AH T IY
+entity's EH N T AH T IY Z
+entity(2) EH N T IH T IY
+entler EH N T L ER
+entoffen EH N T AH F AH N
+entoffen's EH N T AH F AH N Z
+entomb EH N T UW M
+entombed EH N T UW M D
+entombment IH N T UW M M AH N T
+entomologist EH N T AH M AA L AH JH AH S T
+entomologists EH N T AH M AA L AH JH AH S T S
+entomologists(2) EH N T AH M AA L AH JH AH S S
+entomologists(3) EH N T AH M AA L AH JH AH S
+entomology EH N T AH M AA L AH JH IY
+entourage AA N T UH R AA ZH
+entourage(2) AA N T ER AA ZH
+entourages AA N T UH R AA ZH AH Z
+entourages(2) AA N T ER AA ZH AH Z
+entrail EH N T R AH L
+entrails EH N T R AH L Z
+entrance EH N T R AH N S
+entranced IH N T R AE N S T
+entrances EH N T R AH N S AH Z
+entrant EH N T R AH N T
+entrants EH N T R AH N T S
+entrap IH N T R AE P
+entrapment IH N T R AE P M AH N T
+entrapped IH N T R AE P T
+entre AA N T R EY
+entre(2) AA N T R AH
+entreaties EH N T R IY T IY Z
+entreaty EH N T R IY T IY
+entree AA N T R EY
+entrees AA N T R EY Z
+entregrowth EH N T R AH G R OW TH
+entrekin EH N T R IH K IH N
+entrench EH N T R EH N CH
+entrenched EH N T R EH N CH T
+entrenched(2) IH N T R EH N CH T
+entrenches EH N T R EH N CH IH Z
+entrenching EH N T R EH N CH IH NG
+entrenchment EH N T R EH N CH M AH N T
+entrepreneur AA N T R AH P R AH N ER
+entrepreneur's AA N T R AH P R AH N ER Z
+entrepreneur(2) AA N T R AH P R AH N UH R
+entrepreneurial AA N T R AH P R AH N ER IY AH L
+entrepreneurialism EH N T R AH P R AH N UW R IY AH L IH Z AH M
+entrepreneurs AA N T R AH P R AH N ER Z
+entrepreneurship AA N T R AH P R AH N ER SH IH P
+entries EH N T R IY Z
+entrikin EH N T R IH K IH N
+entringer EH N T ER IH NG ER
+entropy EH N T R AH P IY
+entrust EH N T R AH S T
+entrusted EH N T R AH S T IH D
+entrusting EH N T R AH S T IH NG
+entry EH N T R IY
+entryway EH N T R IY W EY
+entsminger EH N T S AH M IH NG ER
+entwine EH N T W AY N
+entwined EH N T W AY N D
+entwisle EH N T W AY AH L
+entwistle IH N T W IH S AH L
+entz EH N T S
+entzminger EH N T S M IH NG ER
+enumerate IH N UW M ER EY T
+enumerated IH N UW M ER EY T IH D
+enumerates IH N UW M ER EY T S
+enumeration IH N UW M ER EY SH AH N
+enunciate IH N AH N S IY EY T
+enunciate(2) IY N AH N S IY EY T
+enunciated IH N AH N S IY EY T IH D
+enunciating IH N AH N S IY EY T IH NG
+envelop IH N V EH L AH P
+envelope EH N V AH L OW P
+enveloped EH N V EH L AH P T
+envelopes EH N V AH L OW P S
+enveloping IH N V EH L AH P IH NG
+envelops IH N V EH L AH P S
+enviable EH N V IY AH B AH L
+envied EH N V IY D
+envious EH N V IY AH S
+enviously EH N V IY AH S L IY
+enviro EH N V AY R OW
+envirodyne EH N V AY R OW D AY N
+environic EH N V AY R AO N IH K
+environics EH N V AY R AO N IH K S
+environment IH N V AY R AH N M AH N T
+environment's IH N V AY R AH N M AH N T S
+environmental IH N V AY R AH N M EH N T AH L
+environmental(2) IH N V AY R AH N M EH N AH L
+environmentalism EH N V AY R AH N M EH N T AH L IH Z AH M
+environmentalism(2) EH N V AY R AH N M EH N AH L IH Z AH M
+environmentalist IH N V AY R AH N M EH N T AH L IH S T
+environmentalist(2) IH N V AY R AH N M EH N AH L IH S T
+environmentalists EH N V AY R AH N M EH N T AH L IH S T S
+environmentalists' IH N V AY R AH N M EH N T AH L IH S T S
+environmentalists'(2) EH N V AY R AH N M EH N AH L IH S T S
+environmentalists(2) EH N V AY R AH N M EH N AH L IH S T S
+environmentalists(3) EH N V AY R AH N M EH N T AH L IH S
+environmentalists(4) EH N V AY R AH N M EH N AH L IH S
+environmentally IH N V AY R AH N M EH N T AH L IY
+environmentally(2) IH N V AY R AH N M EH N AH L IY
+environments IH N V AY R AH N M AH N T S
+environs IH N V AY R AH N Z
+enviropact IH N V AY R OW P AE K T
+envirosafe IH N V AY R OW S EY F
+envirotest IH N V AY R OW T EH S T
+envisage EH N V IH Z IH JH
+envisaged EH N V IH Z IH JH D
+envisages EH N V IH Z IH JH IH Z
+envision EH N V IH ZH AH N
+envisioned EH N V IH ZH AH N D
+envisioning EH N V IH ZH AH N IH NG
+envisions EH N V IH ZH AH N Z
+envos EH N V OW S
+envoy EH N V OY
+envoy(2) AA N V OY
+envoys EH N V OY Z
+envoys(2) AA N V OY Z
+envy EH N V IY
+enwright IH N W R AY T
+enyart EH N Y AA R T
+enyeart EH N Y ER T
+enz EH N Z
+enzo EH N Z OW
+enzon EH N Z AA N
+enzor EH N Z ER
+enzymatic EH N Z AY M AE T IH K
+enzyme EH N Z AY M
+enzymes EH N Z AY M Z
+eocene IY AH S IY N
+eoff EY AO F
+eohippus IY OW HH IH P AH S
+eolande EY OW L AA N D IY
+eon IY AH N
+eon(2) IY AA N
+eons IY AH N Z
+eos IY AA S
+eos's IY AA S AH Z
+epcot EH P K AA T
+epeda EH P EY D AH
+epeda's EH P EY D AH Z
+epes IY P S
+ephedrine IH F EH D R IH N
+ephemeral IH F EH M ER AH L
+ephlin EH F L IH N
+ephraim IY F R AH M
+ephron EH F R AH N
+epic EH P IH K
+epic's EH P IH K S
+epicenter EH P AH S EH N T ER
+epics EH P IH K S
+epicure EH P IH K Y UH R
+epicurean EH P AH K Y UH R IY AH N
+epidemic EH P AH D EH M IH K
+epidemic(2) EH P IH D EH M IH K
+epidemics EH P AH D EH M IH K S
+epidemiological EH P AH D IY M IY AH L AA JH IH K AH L
+epidemiologically EH P AH D IY M IY AH L AA JH IH K L IY
+epidemiologist EH P AH D IY M IY AA L AH JH IH S T
+epidemiologists EH P AH D IY M IY AA L AH JH IH S T S
+epidemiologists(2) EH P AH D IY M IY AA L AH JH IH S S
+epidemiologists(3) EH P AH D IY M IY AA L AH JH IH S
+epidemiology EH P AH D EH M IY AA L AH JH IY
+epidermal EH P AH D ER M AH L
+epidermis EH P AH D ER M AH S
+epidural EH P AH D ER AH L
+epigenetic EH P AH JH AH N EH T IH K
+epigram EH P AH G R AE M
+epigrammatic EH P AH G R AH M AE T IH K
+epigraphic EH P AH G R AE F IH K
+epilepsies EH P AH L EH P S IY Z
+epilepsy EH P AH L EH P S IY
+epileptic EH P AH L EH P T IH K
+epileptics EH P AH L EH P T IH K S
+epilogue EH P AH L AO G
+epiphany IH P IH F AH N IY
+episcopal IH P IH S K AH P AH L
+episcopalian IH P IH S K AH P EY L IY AH N
+episcopalian(2) IH P IH S K AH P EY L Y AH N
+episcopalians IH P IH S K AH P EY L IY AH N Z
+episcopalians(2) IH P IH S K AH P EY L Y AH N Z
+episcopo IH P IH S K OW P OW
+episode EH P AH S OW D
+episode(2) EH P IH S OW D
+episodes EH P AH S OW D Z
+episodes(2) EH P IH S OW D Z
+episodic EH P AH S AA D IH K
+episteme EH P IH S T IY M
+epistemology IH P IH S T AH M AA L AH JH IY
+epistle IH P IH S AH L
+epistolary IH P IH S T AH L EH R IY
+epitaph EH P AH T AE F
+epitaphs EH P AH T AE F S
+epithelial EH P IH TH EH L Y AH L
+epithet EH P AH TH EH T
+epithets EH P AH TH EH T S
+epitome IH P IH T AH M IY
+epitomize IH P IH T AH M AY Z
+epitomized IH P IH T AH M AY Z D
+epitomizes IH P IH T AH M AY Z IH Z
+epitope EH P IH T OW P
+epler EH P L ER
+epley EH P L IY
+eplin EH P L IH N
+epling EH P L IH NG
+epoch EH P AH K
+epoch(2) IY P AH K
+epochal EH P AH K AH L
+epochs EH P AH K S
+epochs(2) IY P AH K S
+epogen EH P AH JH EH N
+epoxy IH P AA K S IY
+epp EH P
+eppard EH P ER D
+eppel EH P AH L
+epperly EH P ER L IY
+eppers EH P ER Z
+epperson EH P ER S AH N
+eppes EH P S
+eppich EH P IH CH
+epping EH P IH NG
+eppinger EH P IH NG ER
+epple EH P AH L
+eppler EH P L ER
+eppley EH P L IY
+eppner EH P N ER
+eppolito EH P OW L IY T OW
+epps EH P S
+eprom EH P R AH M
+eproms EH P R AH M Z
+epsco EH P S K OW
+epsilon EH P S AH L AA N
+epsom EH P S AH M
+epsomite EH P S AH M AY T
+epson EH P S AH N
+epstein EH P S T IY N
+epstein(2) EH P S T AY N
+epting EH P T IH NG
+equable EH K W AH B AH L
+equal IY K W AH L
+equaled IY K W AH L D
+equaling IY K W AH L IH NG
+equality IH K W AA L AH T IY
+equalization IY K W AH L IH Z EY SH AH N
+equalize IY K W AH L AY Z
+equalized IY K W AH L AY Z D
+equalizer IY K W AH L AY Z ER
+equalizes IY K W AH L AY Z IH Z
+equalizing IY K W AH L AY Z IH NG
+equally IY K W AH L IY
+equals IY K W AH L Z
+equanimity IY K W AH N IH M IH T IY
+equate IH K W EY T
+equated IH K W EY T IH D
+equates IH K W EY T S
+equating IH K W EY T IH NG
+equation IH K W EY ZH AH N
+equations IH K W EY ZH AH N Z
+equator IH K W EY T ER
+equatorial IY K W AH T AO R IY AH L
+equators IH K W EY T ER Z
+equestrian IH K W EH S T R IY AH N
+equiangular IY K W AH AE NG G Y AH L ER
+equibank EH K W AH B AE NG K
+equicor EH K W IH K AO R
+equifax EH K W IH F AE K S
+equilibria IY K W AH L IH B R IY AH
+equilibrium IY K W AH L IH B R IY AH M
+equilink EH K W AH L IH NG K
+equimark EH K W IH M AA R K
+equine IY K W AY N
+equinox IY K W AH N AA K S
+equion EH K W IY AA N
+equip IH K W IH P
+equipment IH K W IH P M AH N T
+equipment's IH K W IH P M AH N T S
+equipments IH K W IH P M AH N T S
+equipped IH K W IH P T
+equipping IH K W IH P IH NG
+equips IH K W IH P S
+equitable EH K W AH T AH B AH L
+equitable's EH K W AH T AH B AH L Z
+equitable(2) EH K W IH T AH B AH L
+equitably EH K W IH T AH B L IY
+equitas EH K W AH T AH S
+equitation EH K W AH T EY SH AH N
+equitec EH K W AH T EH K
+equitex EH K W AH T EH K S
+equiticorp EH K W IH T IY K AO R P
+equities EH K W AH T IY Z
+equities' EH K W AH T IY Z
+equity EH K W AH T IY
+equity's EH K W AH T IY Z
+equivalence IH K W IH V AH L AH N S
+equivalency IH K W IH V AH L AH N S IY
+equivalent IH K W IH V AH L AH N T
+equivalents IH K W IH V AH L AH N T S
+equivocal IH K W IH V AH K AH L
+equivocate IH K W IH V AH K EY T
+equivocating IH K W IH V AH K EY T IH NG
+equivocation IH K W IH V AH K EY SH AH N
+er ER
+era EH R AH
+era's EH R AH Z
+era's(2) IH R AH Z
+era(2) IH R AH
+eradicable IH R AE D AH K AH B AH L
+eradicate IH R AE D AH K EY T
+eradicated IH R AE D AH K EY T IH D
+eradicating IH R AE D AH K EY T IH NG
+eradication IH R AE D AH K EY SH AH N
+erakat EH R AA K AH T
+eralp EH R AO L P
+eramo EH R AA M OW
+eranthe EH R AH N TH
+erany AH R EY N IY
+eras IH R AH Z
+erasable IH R EY S AH B AH L
+erasable(2) IY R EY S AH B AH L
+erase IH R EY S
+erase(2) IY R EY S
+erased IH R EY S T
+erased(2) IY R EY S T
+eraser IH R EY S ER
+eraser(2) IY R EY S ER
+erasers IH R EY S ER Z
+erasers(2) IY R EY S ER Z
+erases IH R EY S IH Z
+erases(2) IY R EY S IH Z
+erasing IH R EY S IH NG
+erasing(2) IY R EY S IH NG
+erasmus IH R AE Z M AH S
+erastus IH R AE S T AH S
+erawan EH R AH W AA N
+erazo EH R AA Z OW
+erb ER B
+erbacher ER B AA K ER
+erbamont ER B AH M AA N T
+erbamont's ER B AH M AA N T S
+erbe ER B
+erber ER B ER
+erbes ER B Z
+erburu ER B UH R UW
+erby ER B IY
+erceg ER S IH G
+erck ER K
+ercole ER K OW L IY
+ercros ER K R OW Z
+erda EH R D AH
+erdahl ER D AA L
+erdman ER D M AH N
+erdmann ER D M AH N
+erdos ER D OW Z
+erdrich ER D R IH K
+ere EH R
+erect IH R EH K T
+erected IH R EH K T AH D
+erected(2) IH R EH K T IH D
+erecting IH R EH K T IH NG
+erection IH R EH K SH AH N
+erections IH R EH K SH AH N Z
+erector IH R EH K T ER
+erects IH R EH K T S
+erena ER EH N AH
+erensel EH R AH N S EH L
+ergle ER G AH L
+ergo ER G OW
+ergonomic ER G AH N AA M IH K
+ergonomically ER G AH N AA M IH K L IY
+ergonomics ER G AH N AA M IH K S
+ergot ER G AH T
+ergot's ER G AH T S
+ergotism ER G AH T IH Z AH M
+ergots ER G AH T S
+erhard EH R HH AA R D
+erhardt ER HH AA R T
+erhart ER HH AA R T
+eric EH R IH K
+eric's EH R IH K S
+erica EH R IH K AH
+erich EH R IH K
+erichsen EH R IH K S AH N
+erick EH R IH K
+ericka EH R IH K AH
+ericksen EH R IH K S AH N
+erickson EH R IH K S AH N
+ericson EH R IH K S AH N
+ericsson EH R IH K S AH N
+ericsson's EH R IH K S AH N Z
+eridania EH R IH D AE N IY AH
+erie IH R IY
+erik EH R IH K
+erik's EH R IH K S
+erika EH R IH K AH
+eriksen EH R IH K S AH N
+erikson EH R IH K S AH N
+erikson's EH R IH K S AH N Z
+eriksson EH R IH K S AH N
+erin EH R IH N
+erina ER IY N AH
+erion EH R IY AO N
+erisa EH R IY S AH
+erisman EH R IH S M AH N
+eritrea EH R IH T R IY AH
+eritrea(2) EH R IH T R EY AH
+eritrean EH R IH T R IY AH N
+eritrean(2) EH R IH T R EY AH N
+eritreans EH R IH T R IY N Z
+eritreans(2) EH R IH T R EY AH N Z
+erk ER K
+erker ER K ER
+erkkila ER K IH L AH
+erl ER L
+erlach ER L AA K
+erland ER L AH N D
+erlandson ER L AH N D S AH N
+erlangen ER L AE NG G AH N
+erlanger EH R L AE NG ER
+erlanger(2) EH R L AE NG G ER
+erle AO R AH L
+erlene ER L IY N
+erler ER L ER
+erlich ER L IH K
+erlichman ER L IH K M AH N
+erlichman(2) EH R L IH K M AH N
+erlick ER L IH K
+erlick(2) EH R L IH K
+erline ER L AY N
+erling ER L IH NG
+erly ER L IY
+erma ER M AH
+erma's ER M AH Z
+erman ER M AH N
+ermer ER M ER
+ermin ER M IH N
+ermina ER M IY N AH
+ermine ER M AH N
+erminia ER M IY N IY AH
+erminie ER M IH N IY
+ermis ER M IH S
+erna ER N AH
+ernaline ER N AH L AY N
+erne ER N
+ernest ER N AH S T
+ernest's ER N AH S T S
+ernest(2) ER N IH S T
+ernestine ER N IH S T IY N
+ernesto ER N EH S T OW
+ernests ER N AH S T S
+ernests(2) ER N AH S S
+ernests(3) ER N AH S
+erney ER N IY
+ernie ER N IY
+erno EH R N OW
+ernsberger ER N Z B ER G ER
+ernst ER N S T
+ernster ER N S T ER
+erny ER N IY
+ero IH R OW
+erode IH R OW D
+erode(2) IY R OW D
+eroded IH R OW D AH D
+eroded(2) IH R OW D IH D
+erodes IH R OW D Z
+erodible IH R OW D AH B AH L
+eroding IH R OW D IH NG
+eroding(2) IY R OW D IH NG
+eroh EH R OW
+eroica ER OY K AH
+erol EH R AH L
+erol's EH R AH L Z
+eron IH R AA N
+eros IH R AA S
+erosion IH R OW ZH AH N
+erosional IH R OW ZH AH N AH L
+erosive IH R OW S IH V
+erotic IH R AA T IH K
+erotica IH R AA T IH K AH
+eroticism ER AA T IH S IH Z AH M
+erpelding ER P IH L D IH NG
+erps ER P S
+err EH R
+err(2) ER
+erra EH R AH
+errand EH R AH N D
+errands EH R AH N D Z
+errant EH R AH N T
+erratic IH R AE T IH K
+erratically EH R AE T IH K L IY
+erred EH R D
+errett EH R IH T
+erria EH R IY AH
+errickson EH R IH K S AH N
+errico ER IY K OW
+erring EH R IH NG
+errington EH R IH NG T AH N
+errol EH R AH L
+errol's EH R AH L Z
+erroneous EH R OW N IY AH S
+erroneous(2) ER OW N IY AH S
+erroneously EH R OW N IY AH S L IY
+error EH R ER
+errorful EH R ER F AH L
+errors EH R ER Z
+errs EH R Z
+ers ER Z
+ers(2) IY AA R EH S
+ersatz EH R S AA T S
+ersatz(2) EH R Z AA T S
+ershad ER SH AE D
+ershad(2) ER SH AA D
+erskin ER S K IH N
+erskine ER S K AY N
+erstwhile ER S T W AY L
+erte ER T
+erte(2) ER T EY
+ertel ER T AH L
+ertha ER DH AH
+ertl ER T AH L
+ertle ER T AH L
+ertman ER T M AH N
+ertz ER T S
+erudite EH R AH D AY T
+erudition EH R AH D IH SH AH N
+erupt IH R AH P T
+erupt(2) IY R AH P T
+erupted IH R AH P T AH D
+erupted(2) IY R AH P T IH D
+erupted(3) IH R AH P T IH D
+erupted(4) IY R AH P T AH D
+erupting IH R AH P T IH NG
+erupting(2) IY R AH P T IH NG
+eruption IH R AH P SH AH N
+eruption(2) IY R AH P SH AH N
+eruptions IH R AH P SH AH N Z
+eruptions(2) IY R AH P SH AH N Z
+eruptive IH R AH P T IH V
+eruptive(2) IY R AH P T IH V
+erupts IH R AH P T S
+erupts(2) IY R AH P T S
+erupts(3) IH R AH P S
+erupts(4) IY R AH P S
+erven ER V AH N
+ervin ER V IH N
+erving ER V IH NG
+erway ER W EY
+erwin ER W IH N
+erwina ER V AY N AH
+erxleben ER K S L EH B AH N
+erykah EH R IY K AH
+erythropoietin EH R IH TH R AH P OY T IH N
+erzurum ER Z UH R AH M
+es EH S
+esarey EH S ER IY
+esau IY S AO
+esbenshade EH S B IH N SH AH D
+esbenshade(2) EH S B AH N SH EY D
+esber EH S B ER
+escada EH S K AA D AH
+escalante EH S K AA L AA N T IY
+escalate EH S K AH L EY T
+escalated EH S K AH L EY T IH D
+escalates EH S K AH L EY T S
+escalating EH S K AH L EY T IH NG
+escalation EH S K AH L EY SH AH N
+escalator EH S K AH L EY T ER
+escalators EH S K AH L EY T ER Z
+escalera EH S K AA L EH R AH
+escalona EH S K AA L OW N AH
+escambia EH S K AE M B IY AH
+escamez EH S K AA M EH Z
+escamilla EH S K AA M IH L AH
+escanaba EH S K AH N AA B AH
+escandon IH S K AE N D AH N
+escapade EH S K AH P EY D
+escapades EH S K AH P EY D Z
+escape IH S K EY P
+escaped IH S K EY P T
+escapee IH S K EY P IY
+escapees IH S K EY P IY Z
+escapement IH S K EY P M AH N T
+escapes IH S K EY P S
+escaping IH S K EY P IH NG
+escapism IH S K EY P IH Z AH M
+escarcega EH S K AA R CH EH G AH
+escareno EH S K AA R EH N OW
+escarpment EH S K AA R P M AH N T
+escarpments EH S K AA R P M AH N T S
+esch EH SH
+eschatological EH S K AH T AH L AA JH IH K AH L
+eschbach EH SH B AA K
+esche EH SH
+eschen EH SH AH N
+eschenbach EH SH IH N B AA K
+eschenburg EH SH AH N B ER G
+escher EH SH ER
+eschete EH SH IY T
+eschew EH S CH UW
+eschewed EH SH UW D
+eschewed(2) EH S K Y UW D
+eschewing EH SH UW IH NG
+eschewing(2) EH S K Y UW IH NG
+eschews EH S CH UW Z
+eschmann EH SH M AH N
+esco EH S K OW
+escobar EH S K OW B AA R
+escobar's EH S K OW B AA R Z
+escobar's(2) EH S K AH B AA R Z
+escobar(2) EH S K AH B AA R
+escobedo EH S K OW B EY D OW
+escoe IH S K OW
+escondido EH S K AA N D IY D OW
+escora EH S K AO R AH
+escort EH S K AO R T
+escorted EH S K AO R T IH D
+escorting EH S K AO R T IH NG
+escorts EH S K AO R T S
+escoto EH S K OW T OW
+escott EH S K AH T
+escrow EH S K R OW
+escrowed EH S K R OW D
+escuchando EH S K UW CH AA N D OW
+escudero EH S K UW D EH R OW
+escudo EH S K UW D OW
+escudos EH S K UW D OW Z
+escue EY S K Y UW
+esculent EH S K UW L AH N T
+esh EH SH
+esham EH SH AH M
+eshbach EH SH B AA K
+eshbaugh IH SH B AO
+eshelman EH SH AH L M AH N
+eshleman EH SH AH L M AH N
+eskandarian EH S K AH N D EH R IY AH N
+eskelson EH S K IH L S AH N
+eskenazi EY S K EY N AA Z IY
+eskenazi(2) EH S K AH N AA Z IY
+esker EH S K ER
+eskew EH S K Y UW
+eskey EH S K IY
+eskimo EH S K AH M OW
+eskimos EH S K AH M OW Z
+eskin IH S K IH N
+eskridge EH S K R IH JH
+esler EH S AH L ER
+esler(2) EH S L ER
+eslick EH S L IH K
+eslinger EH S AH L IH NG ER
+eslinger(2) EH S L IH NG ER
+esmark EH S M AA R K
+esme EH Z M
+esmerelda EH S M ER EH L D AH
+esmine EH Z M AH N
+esmond EH Z M AH N D
+esophagus IH S AA F AH G AH S
+esoteric EH S AH T EH R IH K
+esoteric(2) EH S OW T EH R IH K
+espada EY S P AA D AH
+espalier EH S P AE L Y ER
+espana EH S P AE N Y AH
+espanol EH S P AA N Y OW L
+espanola EH S P AH N OW L AH
+esparza EH S P AA R Z AH
+espe EH S P
+especial AH S P EH SH AH L
+especially AH S P EH SH L IY
+especially(2) AH S P EH SH AH L IY
+espectador EH S P EH K T AH D AO R
+espejo EY S P EY Y OW
+espeland EH S P IH L AH N D
+espenschied EH S P IH N SH IY D
+espenshade EH S P IH N SH AH D
+espenshade(2) EH S P IH N SH EY D
+esper EH S P ER
+esperanto EH S P ER AE N T OW
+esperanto's EH S P ER AE N T OW Z
+espeseth EH S P IH S IH TH
+espey EH S P IY
+espinal EY S P IY N AH L
+espino EY S P IY N OW
+espinola EH S P IY N OW L AH
+espinosa EH S P IH N OW Z AH
+espinoza EY S P IY N OW Z AH
+espionage EH S P IY AH N AA JH
+espirito EH S P IH R IY T OW
+espirito(2) EH S P IH R IH T OW
+espiritu EH S P IH R IY CH UW
+espitia EH S P IY SH AH
+esplanade EH S P L AH N AA D
+esplin EH S P L IH N
+esposito EH S P AH Z IY T OW
+espouse IH S P AW Z
+espouse(2) IH S P AW S
+espoused IH S P AW Z D
+espoused(2) IH S P AW S T
+espouses IH S P AW Z IH Z
+espouses(2) IH S P AW S IH Z
+espousing IH S P AW Z IH NG
+espousing(2) IH S P AW S IH NG
+espresso EH S P R EH S OW
+esprit EH S P R IY
+esprit's EH S P R IY Z
+espy EH S P IY
+espy's EH S P IY Z
+esque EH S K
+esqueda EH S K W EY D AH
+esquer IH S K ER
+esquibel EY S K W IY B EH L
+esquire EH S K W AY R
+esquire's EH S K W AY R Z
+esquivel EY S K W IY V EH L
+esrey EH S R IY
+ess EH S
+essa EH S AH
+essary EH S EH R IY
+essay EH S EY
+essayist EH S EY IH S T
+essays EH S EY Z
+esse EH S
+esselman EH S AH L M AH N
+esselte EH S EH L T IY
+essen EH S AH N
+essenburg EH S AH N B ER G
+essence EH S AH N S
+essential IH S EH N SH AH L
+essential(2) IY S EH N SH AH L
+essential(3) AH S EH N CH AH L
+essential(4) IY S EH N CH AH L
+essentially IH S EH N SH AH L IY
+essentially(2) IY S EH N SH AH L IY
+essentials EH S EH N CH AH L Z
+essentials(2) IY S EH N CH AH L Z
+essentials(3) EH S EH N SH AH L Z
+essentials(4) IY S EH N SH AH L Z
+esser EH S ER
+esses EH S IH Z
+esses(2) EH S IY Z
+essex EH S IH K S
+essex's EH S IH K S IH Z
+essick EH S IH K
+essie EH S IY
+essig EH S IH G
+esslinger EH S AH L IH NG ER
+esslinger(2) EH S L IH NG ER
+essman EH S M AH N
+essner EH S N ER
+esso EH S OW
+esson EH S AH N
+est AH S T EY T
+esta EH S T AH
+establish IH S T AE B L IH SH
+establish(2) IY S T AE B L IH SH
+established IH S T AE B L IH SH T
+established(2) IY S T AE B L IH SH T
+establishes IH S T AE B L IH SH IH Z
+establishes(2) IY S T AE B L IH SH IH Z
+establishing IH S T AE B L IH SH IH NG
+establishing(2) IY S T AE B L IH SH IH NG
+establishment IH S T AE B L IH SH M AH N T
+establishment's EH S T AE B L IH SH M AH N T S
+establishment's(2) IY S T AE B L IH SH M AH N T S
+establishment(2) IY S T AE B L IH SH M AH N T
+establishments EH S T AE B L IH SH M AH N T S
+establishments(2) IY S T AE B L IH SH M AH N T S
+estabrook EH S T AH B R UH K
+estabrooks EH S T AH B R UH K S
+estai EH S T EY
+estan EH S T AH N
+estate IH S T EY T
+estate's IH S T EY T S
+estatehood IH S T EY T HH UH D
+estates IH S T EY T S
+este EH S T
+esteban EH S T AH B AA N
+estedat EH S T EH D AE T
+estee EH S T IY
+esteem AH S T IY M
+esteem's IH S T IY M Z
+esteemed IH S T IY M D
+estefan EH S T IH F AA N
+estefan(2) EH S T EH V AH N
+estel EH S T AH L
+estell EH S T AH L
+estella EH S T EH L AH
+estelle EH S T EH L
+estenson EH S T IH N S AH N
+estep EH S T IH P
+estepp EH S T IH P
+ester EH S T ER
+esterline EH S T ER L AY N
+esterline's EH S T ER L AY N Z
+esterly EH S T ER L IY
+esters EH S T ER Z
+estes EH S T IY Z
+esteve EH S T IH V
+esteves EY S T EY V EH S
+estevez EY S T EY V EH Z
+estey EH S T IY
+esther EH S T ER
+esthetic EH S TH EH T IH K
+esthetically EH S TH EH T IH K L IY
+esthetics EH S TH EH T IH K S
+estill EY S T IY L
+estimable EH S T AH M AH B AH L
+estimate EH S T AH M AH T
+estimate(2) EH S T AH M EY T
+estimated EH S T AH M EY T AH D
+estimated(2) EH S T AH M EY T IH D
+estimates EH S T AH M AH T S
+estimates(2) EH S T AH M EY T S
+estimating EH S T AH M EY T IH NG
+estimation EH S T AH M EY SH AH N
+estimations EH S T AH M EY SH AH N Z
+estimator EH S T IH M AH T ER
+estimator(2) EH S T IH M EY T ER
+estimators EH S T IH M AH T ER Z
+estimators(2) EH S T IH M EY T ER Z
+estis EH S T IH S
+estle EH S AH L
+estock EH S T AA K
+estok IH S T AA K
+estonia EH S T OW N IY AH
+estonian EH S T OW N IY AH N
+estonians EH S T OW N IY AH N Z
+estrada EH S T R AA D AH
+estrange EH S T R EY N JH
+estranged EH S T R EY N JH D
+estrangement IH S T R EY N JH M AH N T
+estrella EH S T R EH L AH
+estrich EH S T R IH K
+estridge IH S T R IH JH
+estrin EH S T R IH N
+estrogen EH S T R AH JH AH N
+estrogens EH S T R AH JH IH N Z
+estrous EH S T R AH S
+estrus EH S T R AH S
+estruth EH S T R UW TH
+estuaries EH S CH UW EH R IY Z
+estuary EH S CH UW EH R IY
+esty EH S T IY
+esworthy EH S W ER DH IY
+eszterhas EH S T ER HH AA S
+et EH T
+etablissements EH T AE B L IH S AH M AA N T S
+etc EH T S EH T ER AH
+etcetera EH T S EH T ER AH
+etch EH CH
+etched EH CH T
+etches EH CH IH Z
+etcheverry EH CH IH V EH R IY
+etching EH CH IH NG
+etchings EH CH IH NG Z
+etchison EH CH IH S AH N
+eternal IH T ER N AH L
+eternal(2) IY T ER N AH L
+eternally IH T ER N AH L IY
+eternally(2) IY T ER N AH L IY
+eternit EH T ER N IH T
+eternity IH T ER N AH T IY
+eternity(2) IY T ER N AH T IY
+etess EH T EH S
+ethan IY TH AH N
+ethane EH TH EY N
+ethanol EH TH AH N AO L
+ethel EH TH AH L
+ethelbert EH TH IH L B ER T
+ethelda IH TH EH L D AH
+ethelinda EH TH EH L IY N D AH
+etheline EH TH IH L AY N
+etheljean EH TH IH L Y AH N
+etheljean(2) EH TH AH L JH IY N
+ethelson EH TH IH L S IH N
+ethelyn EH TH IH L IH N
+ethene EH TH IY N
+ether IY TH ER
+ethereal IH TH IH R IY AH L
+etheredge EH TH ER EH JH
+etheridge EH TH ER IH JH
+etherington EH DH ER IH NG T AH N
+ethernet EH TH ER N EH T
+ethers IY TH ER Z
+etherton IH TH ER T AH N
+etherton(2) EH TH ER T AH N
+ethic EH TH IH K
+ethical EH TH AH K AH L
+ethical(2) EH TH IH K AH L
+ethically EH TH IH K AH L IY
+ethically(2) EH TH IH K L IY
+ethicist EH TH IH S IH S T
+ethicists EH TH IH S IH S T S
+ethicists(2) EH TH IH S IH S S
+ethicists(3) EH TH IH S IH S
+ethicon EH TH IH K AA N
+ethics EH TH IH K S
+ethier EH TH IY ER
+ethington EH TH IH NG T AH N
+ethiopia IY TH IY OW P IY AH
+ethiopia's IY TH IY OW P IY AH Z
+ethiopian IY TH IY OW P IY AH N
+ethiopians IY TH IY OW P IY AH N Z
+ethnic EH TH N IH K
+ethnical EH TH N IH K AH L
+ethnically EH TH N IH K L IY
+ethnicity EH TH N IH S IH T IY
+ethnics EH TH N IH K S
+ethnocentric EH TH N OW S EH N T R IH K
+ethnocentrism EH TH N OW S EH N T R IH Z AH M
+ethnographic EH TH N AH G R AE F IH K
+ethnology EH TH N AA L AH JH IY
+ethnomusicologist EH TH N AH M Y UW Z AH K AA L AH JH IH S T
+ethnos EH TH N OW S
+ethnos's EH TH N AH S IH Z
+ethology IH TH AA L AH JH IY
+ethos IY TH AA S
+ethridge IH TH R IH JH
+ethyl EH TH AH L
+ethylene EH TH AH L IY N
+ethyol EH TH AY AA L
+etienne EH T IY EH N
+etiologies IY T IY AA L AH JH IY Z
+etiology IY T IY AA L AH JH IY
+etiquette EH T AH K AH T
+etling EH T L IH NG
+etna EH T N AH
+eton IY T AH N
+etops IY T AA P S
+etruscan IH T R AH S K AH N
+etruscans IH T R AH S K AH N Z
+etsty EH T S T IY
+etsu EH T S UW
+etta EH T AH
+etter EH T ER
+etters EH T ER Z
+ettie EH T IY
+ettinger EH T IH NG ER
+ettinger's EH T IH NG ER Z
+ettlinger EH T L IH NG ER
+etty EH T IY
+etudes EY T UW D Z
+etymological EH T AH M AH L AA JH AH K AH L
+etymology EH T AH M AA L AH JH IY
+etymology(2) EH T IH M AA L AH JH IY
+etzel EH T Z AH L
+etzel's EH T Z AH L Z
+etzioni EH T S IY OW N IY
+etzkorn EH T S K ER N
+etzler EH T S L ER
+euan Y UW AH N
+eubank Y UW B AE NG K
+eubanks Y UW B AE NG K S
+eucalypti Y UW K AH L IH P T AY
+eucalypti(2) Y UW K AH L IH P T IY
+eucalyptus Y UW K AH L IH P T AH S
+eucharist Y UW K ER AH S T
+euchre Y UW K ER
+euchred Y UW K ER D
+euclea Y UW K L IY AH
+euclid Y UW K L IH D
+eudocia Y UW D OW CH AH
+eudora Y UW D AO R AH
+eudosia Y UW D OW S IY AH
+eudoxia Y UW D AA K S IY AH
+eudy Y UW D IY
+eugene Y UW JH IY N
+eugenia Y UW JH IY N IY AH
+eugenia's Y UW JH IY N IY AH Z
+eugenic Y UW JH EH N IH K
+eugenics Y UW JH EH N IH K S
+eugenie Y UW JH IY N IY
+eugenio Y UW JH IY N IY OW
+eugenio's Y UW JH IY N IY OW Z
+eula Y UW L AH
+euler OY L ER
+eulich Y UW L IH K
+eulogies Y UW L AH JH IY Z
+eulogize Y UW L AH JH AY Z
+eulogized Y UW L AH JH AY Z D
+eulogy Y UW L AH JH IY
+eulogy's Y UW L AH JH IY Z
+eunice Y UW N AH S
+eunice(2) Y UW N IH S
+eunuch Y UW N AH K
+euphemia Y UW F IY M IY AH
+euphemism Y UW F AH M IH Z AH M
+euphemisms Y UW F AH M IH Z AH M Z
+euphemistic Y UW F AH M IH S T IH K
+euphemistically Y UW F AH M IH S T IH K L IY
+euphony Y UW F AH N IY
+euphoria Y UW F AO R IY AH
+euphoric Y UW F AO R IH K
+euphory Y UW F AO R IY
+euphrates Y UW F R EY T IY Z
+eurasia Y UH R EY ZH AH
+eurasian Y UH R EY ZH IH N
+eure ER
+eureca Y UW R EH K AH
+eureka Y UH R IY K AH
+eurest Y UH R EH S T
+eurich OY R IH K
+euro Y UW R OW
+euro(2) Y UH R OW
+euro(3) Y UH R AH
+eurobond Y UW R OW B AA N D
+eurobonds Y UW R OW B AA N D Z
+eurocheck Y UW R AH CH EH K
+eurochecks Y UW R AH CH EH K S
+eurocom Y UW R AH K AH M
+eurocom(2) Y UW R OW K AA M
+eurocommercial Y UW R OW K AH M ER SH AH L
+eurocopter Y UH R OW K AA P T ER
+eurocopters Y UH R OW K AA P T ER Z
+eurocrat Y UW R AH K R AE T
+eurocrats Y UW R AH K R AE T S
+eurodebenture Y UW R OW D AH B EH N CH ER
+eurodebentures Y UW R OW D AH B EH N CH ER Z
+eurodebt Y UW R OW D EH T
+eurodeposit Y UW R OW D AH P AA Z AH T
+eurodeposits Y UW R OW D IH P AA Z IH T S
+eurodisney Y UW R OW D IH Z N IY
+eurodisney(2) Y UH R OW D IH Z N IY
+eurodollar Y UW R OW D AA L ER
+eurodollar(2) Y UH R OW D AO L ER
+eurodollars Y UW R OW D AA L ER Z
+eurofighter Y UW R OW F AY T ER
+eurofighters Y UW R OW F AY T ER Z
+eurofima Y UW R AH F IY M AH
+euromark Y UW R AH M AA R K
+euromarket Y UW R OW M AA R K IH T
+euromarkets Y UW R OW M AA R K IH T S
+euromissile Y UW R OW M IH S AH L
+euromissiles Y UW R OW M IH S AH L Z
+euromobiliare Y UW R OW M OW B IH L EH R
+euromobiliare's Y UW R OW M OW B IH L EH R Z
+euromoney Y UW R OW M AH N IY
+euronote Y UW R AH N OW T
+euronotes Y UW R AH N OW T S
+europa Y UH R OW P AH
+europe Y UH R AH P
+europe's Y UH R AH P S
+european Y UH R AH P IY AH N
+europeans Y UH R AH P IY AH N Z
+europeans' Y UH R AH P IY AH N Z
+europeenne Y UW R OW P IY N
+europewide Y UH R AH P W AY D
+europhile Y UH R OW F AY L
+europhiles Y UH R OW F AY L Z
+europium Y UH R OW P IY AH M
+eurosid Y UW R AH S IH D
+eurostar Y UH R OW S T AA R
+eurostat Y UW R AO S T AE T
+eurosterling Y UW R OW S T ER L IH NG
+eurotunnel Y UW R OW T AH N AH L
+eurotunnel's Y UH R OW T AH N AH L Z
+euroyen Y UW R OW Y EH N
+eury Y UW R IY
+eusebio Y UW S IY B IY OW
+eustace Y UW S T AH S
+eustachian Y UW S T EY K IY AH N
+eustacia Y UW S T AA CH AH
+eustice Y UW S T IH S
+eustis Y UW S T AH S
+euthanasia Y UW TH AH N EY ZH AH
+euthanasia's Y UW TH AH N EY ZH AH Z
+euthanasia(2) Y UW TH AH N EY ZH Y AH
+euthanize Y UW TH AH N AY Z
+eutsey Y UW T S IY
+eutsler Y UW T S L ER
+ev EH V
+eva EY V AH
+eva's EY V AH Z
+eva's(2) IY V AH Z
+eva(2) IY V AH
+evacuate IH V AE K Y AH EY T
+evacuate(2) IY V AE K Y AH EY T
+evacuated IH V AE K Y AH W EY T IH D
+evacuated(2) IY V AE K Y AH W EY T IH D
+evacuating IH V AE K Y AH W EY T IH NG
+evacuating(2) IY V AE K Y AH W EY T IH NG
+evacuation IH V AE K Y AH W EY SH AH N
+evacuation(2) IY V AE K Y AH W EY SH AH N
+evacuations IH V AE K Y AH W EY SH AH N Z
+evacuations(2) IY V AE K Y AH W EY SH AH N Z
+evacuee IH V AE K Y UW IY
+evacuee(2) IY V AE K Y UW IY
+evacuees IH V AE K Y UW IY Z
+evacuees(2) IY V AE K Y UW IY Z
+evade IH V EY D
+evade(2) IY V EY D
+evaded IH V EY D IH D
+evaded(2) IY V EY D IH D
+evader IH V EY D ER
+evader(2) IY V EY D ER
+evaders IH V EY D ER Z
+evaders(2) IY V EY D ER Z
+evades IH V EY D Z
+evades(2) IY V EY D Z
+evading IH V EY D IH NG
+evading(2) IY V EY D IH NG
+evadne IH V EH D N IY
+evald EH V AH L D
+evald(2) IY V AA L D
+evaleen EH V AH L IY N
+evaluate IH V AE L Y UW EY T
+evaluate(2) IY V AE L Y UW EY T
+evaluated IH V AE L Y UW EY T AH D
+evaluated(2) IY V AE L Y UW EY T AH D
+evaluates IH V AE L Y UW EY T S
+evaluates(2) IY V AE L Y UW EY T S
+evaluating IH V AE L Y UW EY T IH NG
+evaluating(2) IY V AE L Y UW EY T IH NG
+evaluation IH V AE L Y UW EY SH AH N
+evaluation(2) IY V AE L Y UW EY SH AH N
+evaluations IH V AE L Y UW EY SH AH N Z
+evaluations(2) IY V AE L Y UW EY SH AH N Z
+evan EH V AH N
+evancho EH V AA N K OW
+evander IY V AE N D ER
+evandro EY V AA D R OW
+evandro(2) IY V AE D R OW
+evanescence EH V AH N EH S AH N S
+evanescent EH V AH N EH S AH N T
+evangelical IY V AE N JH EH L IH K AH L
+evangelicals IY V AE N JH EH L IH K AH L Z
+evangeline IH V AE N JH IH L AY N
+evangelism IH V AE N JH AH L IH Z AH M
+evangelism(2) IY V AE N JH AH L IH Z AH M
+evangelist IH V AE N JH AH L AH S T
+evangelist(2) IH V AE N JH AH L IH S T
+evangelist(3) IY V AE N JH AH L AH S T
+evangelist(4) IY V AE N JH AH L IH S T
+evangelista EH V AA NG G EH L IY S T AH
+evangelistic IY V AE N JH AH L IH S T IH K
+evangelists IH V AE N JH AH L IH S T S
+evangelists(2) IY V AE N JH AH L IH S T S
+evangelists(3) IH V AE N JH AH L IH S
+evangelists(4) IY V AE N JH AH L IH S
+evangelize IH V AE N JH AH L AY Z
+evangelize(2) IY V AE N JH AH L AY Z
+evangi IH V AE N JH IY
+evanko IH V AE NG K OW
+evanoff EH V AH N AO F
+evans EH V AH N Z
+evans' EH V AH N Z
+evans's EH V AH N Z IH Z
+evanson EH V AH N S AH N
+evanston EH V AH N S T AH N
+evansville EH V AH N Z V IH L
+evaporate IH V AE P ER EY T
+evaporated IH V AE P ER EY T AH D
+evaporated(2) IH V AE P ER EY T IH D
+evaporated(3) IY V AE P ER EY T AH D
+evaporated(4) IY V AE P ER EY T IH D
+evaporates IH V AE P ER EY T S
+evaporates(2) IY V AE P ER EY T S
+evaporating IH V AE P ER EY T IH NG
+evaporating(2) IY V AE P ER EY T IH NG
+evaporation IH V AE P ER EY SH AH N
+evaporation(2) IY V AE P ER EY SH AH N
+evaporator IH V AE P ER EY T ER
+evaporator(2) IY V AE P ER EY T ER
+evarts EH V ER T S
+evasion IH V EY ZH AH N
+evasion(2) IY V EY ZH AH N
+evasions IH V EY ZH AH N Z
+evasions(2) IY V EY ZH AH N Z
+evasive IH V EY S IH V
+evasive(2) IH V EY Z IH V
+evasive(3) IY V EY S IH V
+evasive(4) IY V EY Z IH V
+evatt EH V AH T
+eve IY V
+evel EH V AH L
+eveland IY V L AH N D
+eveleth EH V IH L IH TH
+evelina EH V EH L IY N AH
+eveline EH V AH L IH N
+evelyn EH V AH L AH N
+evelyn(2) EH V AH L IH N
+even IY V IH N
+evendale EH V AH N D EY L
+evened IY V AH N D
+evenhanded IY V AH N HH AE N D IH D
+evenhandedly EH V AH N HH AE N D IH D L IY
+evening IY V N IH NG
+evening's IY V N IH NG Z
+evenings IY V N IH NG Z
+evenly IY V AH N L IY
+evenness IY V AH N N AH S
+evens IY V AH N Z
+evensen EH V IH N S AH N
+evensky IY V EH N S K IY
+evenson EH V IH N S AH N
+event IH V EH N T
+event's IH V EH N T S
+event's(2) IY V EH N T S
+event(2) IY V EH N T
+eventful IH V EH N T F AH L
+eventful(2) IY V EH N T F AH L
+events IH V EH N T S
+events(2) IY V EH N T S
+eventual AH V EH N CH UW AH L
+eventual(2) IY V EH N CH UW AH L
+eventuality AH V EH N CH UW AE L IH T IY
+eventuality(2) IY V EH N CH UW AE L IH T IY
+eventually IH V EH N CH AH W AH L IY
+eventually(2) IH V EH N SH AH L IY
+eventually(3) IY V EH N CH AH W AH L IY
+eventually(4) IY V EH N SH AH L IY
+ever EH V ER
+everage EH V ER IH JH
+everard EH V ER ER D
+everbach EH V ER B AA K
+everding EH V ER D IH NG
+eveready EH V ER R EH D IY
+evered EH V ER D
+everest EH V ER AH S T
+everest's EH V ER AH S T S
+everest's(2) EH V R AH S T S
+everest(2) EH V R AH S T
+everett EH V ER AH T
+everett(2) EH V R AH T
+everette EH V ER EH T
+everetts EH V ER AH T S
+everetts(2) EH V R AH T S
+everex EH V ER AH K S
+everglades EH V ER G L EY D Z
+everglades' EH V ER G L EY D Z
+evergood EH V ER G UH D
+evergreen EH V ER G R IY N
+evergreens EH V ER G R IY N Z
+everhardt EH V ER HH AA R T
+everhart EH V ER HH AA R T
+everidge EH V ER IH JH
+everingham EH V ER IH NG HH AE M
+everington EH V ER IH NG T AH N
+everitt EH V ER IH T
+everlasting EH V ER L AE S T IH NG
+everlastings EH V ER L AE S T IH NG Z
+everley EH V ER L IY
+everling EH V ER L IH NG
+everly EH V ER L IY
+everman EH V ER M AH N
+evermore EH V ER M AO R
+evers EH V ER Z
+evers' EH V ER Z
+eversman EH V ER S M AH N
+eversole EH V ER S OW L
+everson EH V ER S AH N
+evert IH V ER T
+everton EH V ER T AH N
+everts EH V ER T S
+every EH V ER IY
+every(2) EH V R IY
+everybody EH V R IY B AA D IY
+everybody'd EH V R IY B AA D IY D
+everybody's EH V R IY B AA D IY Z
+everyday EH V R IY D EY
+everyman EH V R IY M AH N
+everyman's EH V R IY M AH N Z
+everyone EH V R IY W AH N
+everyone's EH V R IY W AH N Z
+everyplace EH V R IY P L EY S
+everything EH V R IY TH IH NG
+everything's EH V R IY TH IH NG Z
+everythings EH V R IY TH IH NG Z
+everytime EH V R IY T AY M
+everywhere EH V R IY W EH R
+everywhere(2) EH V R IY HH W EH R
+eves IY V Z
+evett EH V IH T
+evetts EH V IH T S
+evian EH V IY AH N
+evict IH V IH K T
+evicted IH V IH K T IH D
+evicting IH V IH K T IH NG
+eviction IH V IH K SH AH N
+evictions IH V IH K SH AH N Z
+evidence EH V AH D AH N S
+evidenced EH V IH D AH N S T
+evidences EH V AH D AH N S AH Z
+evident EH V AH D AH N T
+evidentiary EH V IH D EH N SH IY EH R IY
+evidentiary(2) EH V IH D EH N CH IY EH R IY
+evidently EH V AH D AH N T L IY
+evil IY V AH L
+evildoer IY V AH L D UW ER
+evildoers IY V AH L D UW ER Z
+evils IY V AH L Z
+evilsizer IY V AH L S AY Z ER
+evilsizor IY V AH L S AY Z ER
+evin EH V IH N
+evince IH V IH N S
+evinced IH V IH N S T
+evinger IY V IH NG ER
+evins EH V IH N Z
+eviscerate AH V IH S ER EY T
+eviscerated AH V IH S ER EY T IH D
+evita EH V IY T AH
+evitt EH V IH T
+evitts EH V IH T S
+evjen EH V JH AH N
+evlyn EH V L AH N
+evocation IY V OW K EY SH AH N
+evocative IH V AA K AH T IH V
+evoke IH V OW K
+evoke(2) IY V OW K
+evoked IH V OW K T
+evoked(2) IY V OW K T
+evokes IH V OW K S
+evokes(2) IY V OW K S
+evoking IH V OW K IH NG
+evoking(2) IY V OW K IH NG
+evola EH V OW L AH
+evolution EH V AH L UW SH AH N
+evolution(2) IY V AH L UW SH AH N
+evolution(3) EH V OW L UW SH AH N
+evolution(4) IY V OW L UW SH AH N
+evolutionary EH V AH L UW SH AH N EH R IY
+evolutionary(2) IY V AH L UW SH AH N EH R IY
+evolutionary(3) EH V OW L UW SH AH N EH R IY
+evolutionary(4) IY V OW L UW SH AH N EH R IY
+evolve IH V AA L V
+evolve(2) IY V AA L V
+evolved IH V AA L V D
+evolved(2) IY V AA L V D
+evolves IH V AA L V Z
+evolves(2) IY V AA L V Z
+evolving IH V AA L V IH NG
+evolving(2) IY V AA L V IH NG
+evon EH V AH N
+evonne EH V AA N
+evrard EH V R ER D
+evren EH V R AH N
+ewald Y UW AH L D
+ewalt Y UW AH L T
+ewan Y UW AH N
+ewart Y UW ER T
+ewbal Y UW B AA L
+ewbank Y UW B AH NG K
+ewe Y UW
+ewell Y UW AH L
+ewen Y UW AH N
+ewer Y UW ER
+ewers Y UW ER Z
+ewert Y UW ER T
+ewes Y UW Z
+ewig Y UW IH G
+ewing Y UW IH NG
+ewing's Y UW IH NG Z
+ewings Y UW IH NG Z
+ewoldt Y UW OW L T
+ewong Y UW AO NG
+eworld IY W ER L D
+ewton Y UW T AH N
+ewy Y UW IY
+ex EH K S
+ex-fighter EH K S F AY T ER
+ex-voto EH K S V OW T OW
+exabyte EH K S AH B AY T
+exacerbate IH G Z AE S ER B EY T
+exacerbated IH G Z AE S ER B EY T AH D
+exacerbated(2) IH G Z AE S ER B EY T IH D
+exacerbates IH G Z AE S ER B EY T S
+exacerbating IH G Z AE S ER B EY T IH NG
+exacerbation IH G Z AE S ER B EY SH AH N
+exacerbations IH G Z AE S ER B EY SH AH N Z
+exact IH G Z AE K T
+exacted IH G Z AE K T IH D
+exacting IH G Z AE K T IH NG
+exaction IH G Z AE K SH AH N
+exactions IH G Z AE K SH AH N Z
+exactitude IH G Z AE K T AH T UW D
+exactly IH G Z AE K T L IY
+exactly's IH G Z AE K T L IY Z
+exacts IH G Z AE K T S
+exaggerate IH G Z AE JH ER EY T
+exaggerated IH G Z AE JH ER EY T AH D
+exaggerated(2) IH G Z AE JH ER EY T IH D
+exaggerates IH G Z AE JH ER EY T S
+exaggerating IH G Z AE JH ER EY T IH NG
+exaggeration IH G Z AE JH ER EY SH AH N
+exaggerations IH G Z AE JH ER EY SH AH N Z
+exalt IH G Z AO L T
+exalted IH G Z AO L T IH D
+exalting IH G Z AO L T IH NG
+exalts IH G Z AO L T S
+exam IH G Z AE M
+examination IH G Z AE M AH N EY SH AH N
+examinations IH G Z AE M AH N EY SH AH N Z
+examine IH G Z AE M IH N
+examined IH G Z AE M AH N D
+examiner IH G Z AE M AH N ER
+examiner's EH G Z AE M AH N ER Z
+examiners IH G Z AE M IH N ER Z
+examiners' IH G Z AE M IH N ER Z
+examines IH G Z AE M AH N Z
+examining IH G Z AE M IH N IH NG
+example IH G Z AE M P AH L
+examples IH G Z AE M P AH L Z
+exams IH G Z AE M Z
+exar EH K S ER
+exasperate IH G Z AE S P ER EY T
+exasperated IH G Z AE S P ER EY T IH D
+exasperating IH G Z AE S P ER EY T IH NG
+exasperation EH K S AE S P ER EY SH AH N
+exboyfriend EH K S B OY F R EH N D
+exbroker EH K S B R OW K ER
+exbroker's EH K S B R OW K ER Z
+exbrokers EH K S B R OW K ER Z
+excalibur EH K S K AE L AH B ER
+excavate EH K S K AH V EY T
+excavated EH K S K AH V EY T IH D
+excavating EH K S K AH V EY T IH NG
+excavation EH K S K AH V EY SH AH N
+excavations EH K S K AH V EY SH AH N Z
+excavator EH K S K AH V EY T ER
+excavators EH K S K AH V EY T ER Z
+excedrin EH K S EH D R AH N
+exceed IH K S IY D
+exceeded IH K S IY D AH D
+exceeded(2) IH K S IY D IH D
+exceeding IH K S IY D IH NG
+exceedingly IH K S IY D IH NG L IY
+exceeds IH K S IY D Z
+excel IH K S EH L
+excel's IH K S EH L Z
+excelan EH K S EH L AH N
+excelled IH K S EH L D
+excellence EH K S AH L AH N S
+excellencies EH K S L EH N S IY Z
+excellency EH K S L EH N S IY
+excellent EH K S AH L AH N T
+excellently EH K S AH L AH N T L IY
+excelling EH K S EH L IH NG
+excels IH K S EH L Z
+excelsior IH K S EH L S IY ER
+except IH K S EH P T
+excepted IH K S EH P T IH D
+excepting EH K S EH P T IH NG
+exception IH K S EH P SH AH N
+exceptional IH K S EH P SH AH N AH L
+exceptionally IH K S EH P SH AH N AH L IY
+exceptionally(2) IH K S EH P SH N AH L IY
+exceptions IH K S EH P SH AH N Z
+excerpt EH K S ER P T
+excerpted EH K S ER P T IH D
+excerpts EH K S ER P T S
+excess EH K S EH S
+excess(2) IH K S EH S
+excesses EH K S EH S IH Z
+excesses(2) IH K S EH S IH Z
+excessive IH K S EH S IH V
+excessively IH K S EH S IH V L IY
+exchange IH K S CH EY N JH
+exchange's IH K S CH EY N JH IH Z
+exchangeable IH K S CH EY N JH AH B AH L
+exchanged IH K S CH EY N JH D
+exchanger IH K S CH EY N JH ER
+exchangers IH K S CH EY N JH ER Z
+exchanges IH K S CH EY N JH AH Z
+exchanges' EH K S CH EY N JH IH Z
+exchanges(2) IH K S CH EY N JH IH Z
+exchanging IH K S CH EY N JH IH NG
+exchequer EH K S CH EH K ER
+excimer EH K S IH M ER
+excise EH K S AY S
+excise(2) EH K S AY Z
+excised EH K S AY Z D
+excises EH K S AY Z IH Z
+excision IH K S IH ZH AH N
+excitable IH K S AY T AH B AH L
+excitation EH K S AY T EY SH AH N
+excite IH K S AY T
+excited IH K S AY T AH D
+excited(2) IH K S AY T IH D
+excitedly IH K S AY T AH D L IY
+excitement IH K S AY T M AH N T
+excites IH K S AY T S
+exciting IH K S AY T IH NG
+exclaim IH K S K L EY M
+exclaimed IH K S K L EY M D
+exclaiming IH K S K L EY M IH NG
+exclaims IH K S K L EY M Z
+exclamation EH K S K L AH M EY SH AH N
+exclamation-point EH K S K L AH M EY SH AH N P OY N T
+exclamations EH K S K L AH M EY SH AH N Z
+excludable IH K S K L UW D AH B AH L
+exclude IH K S K L UW D
+excluded IH K S K L UW D AH D
+excluded(2) IH K S K L UW D IH D
+excludes IH K S K L UW D Z
+excluding IH K S K L UW D IH NG
+exclusion IH K S K L UW ZH AH N
+exclusionary IH K S K L UW ZH AH N EH R IY
+exclusions IH K S K L UW ZH AH N Z
+exclusive IH K S K L UW S IH V
+exclusively IH K S K L UW S IH V L IY
+exclusives IH K S K L UW S IH V Z
+exclusivity EH K S K L UW S IH V AH T IY
+exco EH K S K OW
+excoa EH K S K OW AH
+excommunicate EH K S K AH M Y UW N AH K EY T
+excommunicated EH K S K AH M Y UW N AH K EY T AH D
+excommunication EH K S K AH M Y UW N AH K EY SH AH N
+excoriate EH K S K AO R IY EY T
+excoriated EH K S K AO R IY EY T IH D
+excoriating EH K S K AO R IY EY T IH NG
+excoriation EH K S K AO R IY EY SH AH N
+excrement EH K S K R AH M AH N T
+excrete IH K S K R IY T
+excretion IH K S K R IY SH AH N
+excretory EH K S K R AH T AO R IY
+excruciating IH K S K R UW SH IY EY T IH NG
+excruciatingly EH K S K R UW S IY EY T IH NG L IY
+exculpate EH K S K AH L P EY T
+exculpatory EH K S K AH L P AH T AO R IY
+excursion IH K S K ER ZH AH N
+excursions IH K S K ER ZH AH N Z
+excusable IH K S K Y UW Z AH B AH L
+excuse IH K S K Y UW S
+excuse(2) IH K S K Y UW Z
+excused IH K S K Y UW Z D
+excuses IH K S K Y UW S IH Z
+excuses(2) IH K S K Y UW Z IH Z
+excusing IH K S K Y UW Z IH NG
+exec EH G Z EH K
+execrable EH G Z EH K R AH B AH L
+execs EH G Z EH K S
+execute EH K S AH K Y UW T
+executed EH K S AH K Y UW T AH D
+executed(2) EH K S AH K Y UW T IH D
+executes EH K S AH K Y UW T S
+executing EH K S AH K Y UW T IH NG
+execution EH K S AH K Y UW SH AH N
+executioner EH K S AH K Y UW SH AH N ER
+executioner's EH K S AH K Y UW SH AH N ER Z
+executioners EH K S AH K Y UW SH AH N ER Z
+executions EH K S AH K Y UW SH AH N Z
+executive IH G Z EH K Y AH T IH V
+executive's EH G Z EH K Y AH T IH V Z
+executives IH G Z EH K Y AH T IH V Z
+executives' EH G Z EH K Y AH T IH V Z
+executone EH G Z EH K Y UW T OW N
+executor IH G Z EH K Y AH T ER
+executors IH G Z EH K Y AH T ER Z
+exel EH K S AH L
+exemplar IH G Z EH M P L AA R
+exemplars IH G Z EH M P L AA R Z
+exemplary IH G Z EH M P L ER IY
+exemplified IH G Z EH M P L AH F AY D
+exemplifies IH G Z EH M P L AH F AY Z
+exemplify IH G Z EH M P L AH F AY
+exemplifying IH G Z EH M P L AH F AY IH NG
+exemplum IH G Z EH M P L AH M
+exempt IH G Z EH M P T
+exempted IH G Z EH M P T IH D
+exempting IH G Z EH M P T IH NG
+exemption IH G Z EH M P SH AH N
+exemption(2) IH G Z EH M SH AH N
+exemptions IH G Z EH M P SH AH N Z
+exemptions(2) IH G Z EH M SH AH N Z
+exempts IH G Z EH M P T S
+exercisable EH K S ER S AY Z AH B AH L
+exercise EH K S ER S AY Z
+exercised EH K S ER S AY Z D
+exerciser EH K S ER S AY Z ER
+exercisers EH K S ER S AY Z ER Z
+exercises EH K S ER S AY Z AH Z
+exercises(2) EH K S ER S AY Z IH Z
+exercising EH K S ER S AY Z IH NG
+exert IH G Z ER T
+exerted IH G Z ER T IH D
+exerting IH G Z ER T IH NG
+exertion IH G Z ER SH AH N
+exertions IH G Z ER SH AH N Z
+exerts IH G Z ER T S
+exes EH K S IH Z
+exeter EH K S IH T ER
+exfoliate EH K S F OW L IY EY T
+exfoliation EH K S F OW L IY EY SH AH N
+exhalation EH K S HH AH L EY SH AH N
+exhale EH K S HH EY L
+exhaled EH K S HH EY L D
+exhaust IH G Z AO S T
+exhausted IH G Z AO S T AH D
+exhausted(2) IH G Z AO S T IH D
+exhausting IH G Z AO S T IH NG
+exhaustion IH G Z AO S CH AH N
+exhaustive IH G Z AO S T IH V
+exhaustively IH G Z AA S T IH V L IY
+exhausts IH G Z AO S T S
+exhausts(2) IH G Z AO S S
+exhausts(3) IH G Z AO S
+exhibit IH G Z IH B IH T
+exhibit's IH G Z IH B AH T S
+exhibited IH G Z IH B AH T AH D
+exhibiting IH G Z IH B IH T IH NG
+exhibition EH K S AH B IH SH AH N
+exhibitionist EH K S AH B IH SH AH N AH S T
+exhibitionists EH K S AH B IH SH AH N AH S T S
+exhibitionists(2) EH K S AH B IH SH AH N AH S S
+exhibitionists(3) EH K S AH B IH SH AH N AH S
+exhibitions EH K S AH B IH SH AH N Z
+exhibitor IH G Z IH B AH T ER
+exhibitors IH G Z IH B AH T ER Z
+exhibits IH G Z IH B AH T S
+exhilarate IH G Z IH L ER EY T
+exhilarated IH G Z IH L ER EY T IH D
+exhilarating IH G Z IH L ER EY T IH NG
+exhilaration IH G Z IH L ER EY SH AH N
+exhort IH G Z AO R T
+exhortation EH G Z AO R T EY SH AH N
+exhortations EH G Z AO R T EY SH AH N Z
+exhorted IH G Z AO R T IH D
+exhorting IH G Z AO R T IH NG
+exhorts IH G Z AO R T S
+exhumation EH K S HH Y UW M EY SH AH N
+exhume EH K S HH Y UW M
+exhumed EH K S HH Y UW M D
+exhumes EH K S HH Y UW M Z
+exide EH K S AY D
+exigencies EH K S IH JH AH N S IY Z
+exigency EH K S IH JH AH N S IY
+exigent EH K S IH JH AH N T
+exigents EH K S IH JH AH N T S
+exile EH G Z AY L
+exile(2) EH K S AY L
+exiled EH G Z AY L D
+exiled(2) EH K S AY L D
+exiles EH G Z AY L Z
+exiles(2) EH K S AY L Z
+exim EH K S IH M
+exim's EH K S IH M Z
+exist IH G Z IH S T
+existed IH G Z IH S T AH D
+existence EH G Z IH S T AH N S
+existence(2) IH G Z IH S T AH N S
+existent EH G Z IH S T AH N T
+existential EH K S IH S T EH N CH AH L
+existential(2) EH K S IH S T EH N SH AH L
+existential(3) EH G Z IH S T EH N CH AH L
+existential(4) EH G Z IH S T EH N SH AH L
+existing IH G Z IH S T IH NG
+exists IH G Z IH S T S
+exists(2) IH G Z IH S S
+exists(3) IH G Z IH S
+exit EH G Z IH T
+exit(2) EH K S AH T
+exited EH G Z AH T IH D
+exiting EH G Z IH T IH NG
+exits EH G Z IH T S
+exits(2) EH K S AH T S
+exler EH K S L ER
+exley EH K S L IY
+exline EH K S L AY N
+exner EH K S N ER
+exocet EH K S OW S EH T
+exodus EH K S AH D AH S
+exogenous EH K S OW JH AH N AH S
+exon EH K S AO N
+exonerate IH G Z AA N ER EY T
+exonerated IH G Z AA N ER EY T IH D
+exonerates IH G Z AA N ER EY T S
+exonerating IH G Z AA N ER EY T IH NG
+exoneration IH G Z AA N ER EY SH AH N
+exorbitant IH G Z AO R B IH T AH N T
+exorcist EH K S ER S AH S T
+exoskeleton EH K S OW S K EH L AH T AH N
+exothermic EH K S OW TH ER M IH K
+exotic IH G Z AA T IH K
+exotics EH G Z AA T IH K S
+exovir EH K S OW V IH R
+expand IH K S P AE N D
+expandable IH K S P AE N D AH B AH L
+expanded IH K S P AE N D AH D
+expanded(2) IH K S P AE N D IH D
+expanding IH K S P AE N D IH NG
+expands IH K S P AE N D Z
+expanse IH K S P AE N S
+expanses IH K S P AE N S IH Z
+expansion IH K S P AE N SH AH N
+expansion's IH K S P AE N SH AH N Z
+expansion's(2) IH K S P AE N CH AH N Z
+expansion(2) IH K S P AE N CH AH N
+expansionary IH K S P AE N SH AH N EH R IY
+expansionary(2) IH K S P AE N CH AH N EH R IY
+expansionism IH K S P AE N SH AH N IH Z AH M
+expansionism(2) IH K S P AE N CH AH N IH Z AH M
+expansionist IH K S P AE N SH AH N IH S T
+expansionist(2) IH K S P AE N CH AH N IH S T
+expansions IH K S P AE N SH AH N Z
+expansions(2) IH K S P AE N CH AH N Z
+expansive IH K S P AE N S IH V
+expatriate EH K S P EY T R IY EY T
+expatriate(2) EH K S P EY T R IY AH T
+expatriates EH K S P EY T R IY EY T S
+expatriates(2) EH K S P EY T R IY AH T S
+expatriation EH K S P EY T R IY EY SH AH N
+expect IH K S P EH K T
+expectancies IH K S P EH K T AH N S IY Z
+expectancy IH K S P EH K T AH N S IY
+expectant IH K S P EH K T AH N T
+expectation EH K S P EH K T EY SH AH N
+expectations EH K S P EH K T EY SH AH N Z
+expected IH K S P EH K T AH D
+expected(2) IH K S P EH K T IH D
+expecting IH K S P EH K T IH NG
+expectorant IH K S P EH K T ER AH N T
+expects IH K S P EH K T S
+expects(2) IH K S P EH K S
+expedia EH K S P IY D IY AH
+expedience IH K S P IY D IY AH N S
+expediency IH K S P IY D IY AH N S IY
+expedient IH K S P IY D IY AH N T
+expedite EH K S P IH D AY T
+expedited EH K S P IH D AY T IH D
+expediting EH K S P AH D AY T IH NG
+expedition EH K S P AH D IH SH AH N
+expeditionary EH K S P AH D IH SH AH N EH R IY
+expeditions EH K S P AH D IH SH AH N Z
+expeditious EH K S P AH D IH SH AH S
+expeditiously EH K S P AH D IH SH AH S L IY
+expel IH K S P EH L
+expelled IH K S P EH L D
+expelling IH K S P EH L IH NG
+expend IH K S P EH N D
+expendable IH K S P EH N D AH B AH L
+expended IH K S P EH N D IH D
+expending EH K S P EH N D IH NG
+expenditure IH K S P EH N D AH CH ER
+expenditure(2) IH K S P EH N D IH CH ER
+expenditures IH K S P EH N D AH CH ER Z
+expenditures(2) IH K S P EH N D IH CH ER Z
+expense IH K S P EH N S
+expenses IH K S P EH N S AH Z
+expenses(2) IH K S P EH N S IH Z
+expensing IH K S P EH N S IH NG
+expensive IH K S P EH N S IH V
+expensively EH K S P EH N S IH V L IY
+experience IH K S P IH R IY AH N S
+experienced IH K S P IH R IY AH N S T
+experiences IH K S P IH R IY AH N S IH Z
+experiencing IH K S P IH R IY AH N S IH NG
+experiential EH K S P EH R IY EH N SH AH L
+experiment IH K S P EH R AH M AH N T
+experiment's IH K S P EH R AH M AH N T S
+experimental IH K S P EH R IH M EH N T AH L
+experimental(2) IH K S P ER M EH N T AH L
+experimental(3) IH K S P EH R IH M EH N AH L
+experimental(4) IH K S P ER M EH N AH L
+experimentalist IH K S P EH R AH M EH N T AH L IH S T
+experimentalist(2) IH K S P EH R AH M EH N AH L IH S T
+experimentally IH K S P EH R AH M EH N T AH L IY
+experimentally(2) IH K S P EH R AH M EH N AH L IY
+experimentation IH K S P EH R AH M AH N T EY SH AH N
+experimented IH K S P EH R AH M AH N T AH D
+experimenter IH K S P EH R AH M EH N T ER
+experimenters IH K S P EH R AH M EH N T ER Z
+experimenting EH K S P EH R AH M EH N T IH NG
+experimenting(2) EH K S P EH R AH M EH N IH NG
+experiments IH K S P EH R AH M AH N T S
+expert EH K S P ER T
+expert's EH K S P ER T S
+expertise EH K S P ER T IY Z
+expertly EH K S P ER T L IY
+experts EH K S P ER T S
+experts' EH K S P ER T S
+expiate EH K S P IY EY T
+expiration EH K S P ER EY SH AH N
+expirations EH K S P ER EY SH AH N Z
+expiratory IH K S P AY R AH T AO R IY
+expire IH K S P AY R
+expired IH K S P AY R D
+expires IH K S P AY ER Z
+expiring IH K S P AY R IH NG
+expiry EH K S P AY R IY
+explain IH K S P L EY N
+explainable IH K S P L EY N AH B AH L
+explained IH K S P L EY N D
+explaining IH K S P L EY N IH NG
+explains IH K S P L EY N Z
+explanation EH K S P L AH N EY SH AH N
+explanations EH K S P L AH N EY SH AH N Z
+explanatory IH K S P L AE N AH T AO R IY
+expletive EH K S P L AH T IH V
+expletives EH K S P L AH T IH V Z
+explicable EH K S P L IH K AH B AH L
+explicate EH K S P L AH K EY T
+explication EH K S P L AH K EY SH AH N
+explicit IH K S P L IH S AH T
+explicite IH K S P L IH S AH T
+explicitly IH K S P L IH S AH T L IY
+explode IH K S P L OW D
+exploded IH K S P L OW D AH D
+exploded(2) IH K S P L OW D IH D
+explodes IH K S P L OW D Z
+exploding IH K S P L OW D IH NG
+exploit EH K S P L OY T
+exploitation EH K S P L OY T EY SH AH N
+exploitative EH K S P L OY T AH T IH V
+exploited EH K S P L OY T AH D
+exploited(2) IH K S P L OY T AH D
+exploiting EH K S P L OY T IH NG
+exploiting(2) IH K S P L OY T IH NG
+exploitive IH K S P L OY T IH V
+exploitive(2) EH K S P L OY T IH V
+exploits EH K S P L OY T S
+exploration EH K S P L ER EY SH AH N
+exploration's EH K S P L ER EY SH AH N Z
+exploration's(2) EH K S P L AO R EY SH AH N Z
+exploration(2) EH K S P L AO R EY SH AH N
+explorations EH K S P L ER EY SH AH N Z
+explorations(2) EH K S P L AO R EY SH AH N Z
+exploratory IH K S P L AO R AH T AO R IY
+exploravision IH K S P L AO R AH V IH ZH AH N
+explore IH K S P L AO R
+explored IH K S P L AO R D
+explorer IH K S P L AO R ER
+explorers IH K S P L AO R ER Z
+explores IH K S P L AO R Z
+exploring IH K S P L AO R IH NG
+explosion IH K S P L OW ZH AH N
+explosions IH K S P L OW ZH AH N Z
+explosive IH K S P L OW S IH V
+explosively EH K S P L OW S IH V L IY
+explosives IH K S P L OW S IH V Z
+explosivos EH K S P L AH S IY V OW S
+expo EH K S P OW
+exponent EH K S P OW N AH N T
+exponential EH K S P OW N EH N CH AH L
+exponential(2) EH K S P OW N EH N SH AH L
+exponentially EH K S P OW N EH N SH AH L IY
+exponentially(2) EH K S P OW N EH N CH AH L IY
+exponents IH K S P OW N AH N T S
+export EH K S P AO R T
+exportable EH K S P AO R T AH B AH L
+exported IH K S P AO R T AH D
+exporter IH K S P AO R T ER
+exporters IH K S P AO R T ER Z
+exporters' EH K S P AO R T ER Z
+exporting IH K S P AO R T IH NG
+exports EH K S P AO R T S
+expos EH K S P OW Z
+expose IH K S P OW Z
+exposed IH K S P OW Z D
+exposes IH K S P OW Z IH Z
+exposing IH K S P OW Z IH NG
+exposition EH K S P AH Z IH SH AH N
+expositions EH K S P AH Z IH SH AH N Z
+exposito EH K S P AH S AY T OW
+exposito(2) EH K S P AH Z IY T OW
+exposure IH K S P OW ZH ER
+exposures IH K S P OW ZH ER Z
+expound IH K S P AW N D
+expounded IH K S P AW N D AH D
+expounding IH K S P AW N D IH NG
+expounds IH K S P AW N D Z
+express IH K S P R EH S
+express' IH K S P R EH S
+express's IH K S P R EH S IH Z
+expressed IH K S P R EH S T
+expresses IH K S P R EH S AH Z
+expresses(2) IH K S P R EH S IH Z
+expressing IH K S P R EH S IH NG
+expression IH K S P R EH SH AH N
+expressionism IH K S P R EH SH AH N IH Z AH M
+expressionist IH K S P R EH SH AH N AH S T
+expressionistic IH K S P R EH SH AH N IH S T IH K
+expressionless IH K S P R EH SH AH N L IH S
+expressions IH K S P R EH SH AH N Z
+expressive IH K S P R EH S IH V
+expressivity EH K S P R AH S IH V IH T IY
+expressly EH K S P R EH S L IY
+expresso IH K S P EH S OW
+expresso(2) EH K S P EH S OW
+expressway IH K S P R EH S W EY
+expropriate EH K S P R OW P R IY EY T
+expropriated EH K S P R OW P R IY EY T IH D
+expropriation EH K S P R OW P R IY EY SH AH N
+expropriations EH K S P R OW P R IY EY SH AH N Z
+expulsion IH K S P AH L SH AH N
+expulsions IH K S P AH L SH AH N Z
+expunge IH K S P AH N JH
+expunged IH K S P AH N JH D
+exquisite EH K S K W AH Z AH T
+exquisitely EH K S K W IH Z IH T L IY
+extant EH K S T AH N T
+extel EH K S T EH L
+extend IH K S T EH N D
+extendable EH K S T EH N D AH B AH L
+extended IH K S T EH N D AH D
+extended(2) IH K S T EH N D IH D
+extender EH K S T EH N D ER
+extenders EH K S T EH N D ER Z
+extendible EH K S T EH N D IH B AH L
+extending IH K S T EH N D IH NG
+extends IH K S T EH N D Z
+extension IH K S T EH N SH AH N
+extensions IH K S T EH N SH AH N Z
+extensive IH K S T EH N S IH V
+extensively IH K S T EH N S IH V L IY
+extent IH K S T EH N T
+extenuate IH K S T EH N Y UW EY T
+extenuating IH K S T EH N Y UW EY T IH NG
+exterior IH K S T IH R IY ER
+exteriors EH K S T IH R IY ER Z
+exterminate IH K S T ER M AH N EY T
+exterminated IH K S T ER M AH N EY T IH D
+exterminates IH K S T ER M AH N EY T S
+exterminating IH K S T ER M AH N EY T IH NG
+extermination IH K S T ER M AH N EY SH AH N
+exterminator IH K S T ER M AH N EY T ER
+exterminators IH K S T ER M AH N EY T ER Z
+external IH K S T ER N AH L
+externally IH K S T ER N AH L IY
+extinct IH K S T IH NG K T
+extinction IH K S T IH NG K SH AH N
+extinction(2) IH K S T IH NG SH AH N
+extinctions IH K S T IH NG K SH AH N Z
+extinctions(2) IH K S T IH NG SH AH N Z
+extinguish IH K S T IH NG G W IH SH
+extinguished IH K S T IH NG G W IH SH T
+extinguisher IH K S T IH NG G W IH SH ER
+extinguishers IH K S T IH NG G W IH SH ER Z
+extinguishing IH K S T IH NG G W IH SH IH NG
+extinguishment IH K S T IH NG G W IH SH M AH N T
+extirpate EH K S T ER P EY T
+extirpated EH K S T ER P EY T AH D
+extirpates EH K S T ER P EY T S
+extirpating EH K S T ER P EY T IH NG
+extol IH K S T OW L
+extolled IH K S T OW L D
+extolling IH K S T OW L IH NG
+extols IH K S T OW L Z
+exton EH K S T AH N
+extort IH K S T AO R T
+extorted IH K S T AO R T IH D
+extorting IH K S T AO R T IH NG
+extortion IH K S T AO R SH AH N
+extortionate IH K S T AO R SH AH N AH T
+extortionate(2) IH K S T AO R SH AH N EY T
+extortionist IH K S T AO R SH AH N IH S T
+extortionists IH K S T AO R SH AH N IH S T S
+extorts IH K S T AO R T S
+extra EH K S T R AH
+extracellularly EH K S T R AH S EH L Y AH L ER L IY
+extract IH K S T R AE K T
+extract(2) EH K S T R AE K T
+extracted IH K S T R AE K T AH D
+extracted(2) IH K S T R AE K T IH D
+extracting IH K S T R AE K T IH NG
+extraction IH K S T R AE K SH AH N
+extractions IH K S T R AE K SH AH N Z
+extracts IH K S T R AE K T S
+extracts(2) EH K S T R AE K T S
+extracurricular EH K S T R AH K ER IH K Y AH L ER
+extradite EH K S T R AH D AY T
+extradited EH K S T R AH D AY T IH D
+extradites EH K S T R AH D AY T S
+extraditing EH K S T R AH D AY T IH NG
+extradition EH K S T R AH D IH SH AH N
+extragalactic EH K S T R AH G AH L AE K T IH K
+extralegal EH K S T R AH L IY G AH L
+extramarital EH K S T R AH M EH R AH T AH L
+extraneous EH K S T R EY N IY AH S
+extraneously EH K S T R EY N IY AH S L IY
+extraordinaire EH K S T R AH AO R D IH N EH R
+extraordinarily IH K S T R AO R D AH N EH R AH L IY
+extraordinary IH K S T R AO R D AH N EH R IY
+extraordinary(2) EH K S T R AH AO R D AH N EH R IY
+extrapolate IH K S T R AE P AH L EY T
+extrapolated IH K S T R AE P AH L EY T IH D
+extrapolates IH K S T R AE P AH L EY T S
+extrapolating IH K S T R AE P AH L EY T IH NG
+extrapolation IH K S T R AE P AH L EY SH AH N
+extras EH K S T R AH Z
+extrasensory EH K S T R AH S EH N S ER IY
+extraterrestrial EH K S T R AH T ER EH S T R IY AH L
+extraterrestrials EH K S T R AH T ER EH S T R IY AH L Z
+extraterritorial EH K S T R AH T EH R IH T AO R IY AH L
+extraterritoriality EH K S T R AH T EH R AH T AO R IY AE L AH T IY
+extravagance IH K S T R AE V AH G AH N S
+extravagant IH K S T R AE V AH G AH N T
+extravagantly EH K S T R AE V AH G AH N T L IY
+extravaganza IH K S T R AE V AH G AE N Z AH
+extravaganzas IH K S T R AE V AH G AE N Z AH Z
+extreme IH K S T R IY M
+extremely IH K S T R IY M L IY
+extremes IH K S T R IY M Z
+extremism EH K S T R EH M IH Z AH M
+extremism(2) EH K S T R IY M IH Z AH M
+extremist IH K S T R IY M IH S T
+extremists IH K S T R IY M AH S T S
+extremists(2) IH K S T R IY M IH S T S
+extremists(3) IH K S T R IY M IH S S
+extremists(4) IH K S T R IY M IH S
+extremities IH K S T R EH M AH T IY Z
+extremity IH K S T R EH M AH T IY
+extricable EH K S T R IH K AH B AH L
+extricate EH K S T R AH K EY T
+extricated EH K S T R AH K EY T IH D
+extricates EH K S T R AH K EY T S
+extricating EH K S T R AH K EY T IH NG
+extrication EH K S T R AH K EY SH AH N
+extrinsic EH K S T R IH N S IH K
+extrovert EH K S T R AH V ER T
+extroverted EH K S T R AH V ER T IH D
+extrude IH K S T R UW D
+extruded IH K S T R UW D AH D
+extrudes IH K S T R UW D Z
+extruding IH K S T R UW D IH NG
+extrusion IH K S T R UW ZH AH N
+exuberance IH G Z UW B ER AH N S
+exuberant IH G Z UW B ER AH N T
+exude IH G Z UW D
+exuded IH G Z UW D IH D
+exudes IH G Z UW D Z
+exuding IH G Z UW D IH NG
+exult IH G Z AH L T
+exultant IH G Z AH L T AH N T
+exultantly IH G Z AH L T AH N T L IY
+exulted IH G Z AH L T IH D
+exulting IH G Z AH L T IH NG
+exults IH G Z AH L T S
+exum IH G Z AH M
+exxon EH K S AA N
+exxon's EH K S AA N Z
+eyde EY D
+eydie EY D IY
+eye AY
+eye's AY Z
+eyeball AY B AO L
+eyeballs AY B AO L Z
+eyebrow AY B R AW
+eyebrows AY B R AW Z
+eyecare AY K EH R
+eyed AY D
+eyedrop AY D R AA P
+eyedropper AY D R AA P ER
+eyedrops AY D R AA P S
+eyeglass AY G L AE S
+eyeglasses AY G L AE S AH Z
+eyeglasses(2) AY G L AE S IH Z
+eyeing AY IH NG
+eyelab AY L AE B
+eyelash AY L AE SH
+eyelashes AY L AE SH IH Z
+eyeless AY L AH S
+eyelet AY L AH T
+eyelets AY L AH T S
+eyelid AY L IH D
+eyelids AY L IH D Z
+eyelike AY L AY K
+eyeliner AY L AY N ER
+eyepiece AY P IY S
+eyer AY ER
+eyerly IY ER L IY
+eyerman IY ER M AH N
+eyes AY Z
+eyes' AY Z
+eyeshade AY SH EY D
+eyesight AY S AY T
+eyesore AY S AO R
+eyespot AY S P AA T
+eyestone AY S T OW N
+eyestrain AY S T R EY N
+eyetech AY T EH K
+eyetech's AY T EH K S
+eyewear AY W EH R
+eyewitness AY W IH T N AH S
+eyewitnesses AY W IH T N AH S IH Z
+eyler EY L ER
+eyman EY M AH N
+eynon EY N AH N
+eyre EH R
+eyrich EH R IH CH
+eyrie EH R IY
+eyring EY R IH NG
+eyster EY S T ER
+eyton EY T AH N
+ezekiel EH Z IH K IY L
+ezell AH Z EH L
+ezell's AH Z EH L Z
+ezelle IH Z EH L
+ezer IY Z ER
+ezer(2) EH Z ER
+ezoe EH Z OW
+ezola EY Z OW L AH
+ezra EH Z R AH
+ezzell EH Z AH L
+ezzo EH Z OW
+f EH F
+f'd EH F D
+f's EH F S
+f. EH F
+f.'s EH F S
+faal F AA L
+faal's F AA L Z
+faas F AA Z
+fab F AE B
+fabbri F AE B R IY
+fabel F AE B AH L
+fabela F AA B EH L AH
+faber F EY B ER
+faberge F AE B ER JH
+faberge(2) F AE B ER JH EY
+faberman F EY B ER M AH N
+fabia F AA B IY AH
+fabian F EY B IY AH N
+fabiani F AA B IY AA N IY
+fabiano F AA B IY AA N OW
+fabien F AE B IY N
+fabio F AA B IY OW
+fable F EY B AH L
+fabled F EY B AH L D
+fables F EY B AH L Z
+fabre F EY B ER
+fabri F AE B R IY
+fabric F AE B R IH K
+fabricant F AE B R IH K AH N T
+fabricate F AE B R AH K EY T
+fabricated F AE B R IH K EY T AH D
+fabricated(2) F AE B R IH K EY T IH D
+fabricates F AE B R IH K EY T S
+fabricating F AE B R IH K EY T IH NG
+fabrication F AE B R IH K EY SH AH N
+fabrications F AE B R IH K EY SH AH N Z
+fabricator F AE B R IH K EY T ER
+fabricators F AE B R IH K EY T ER Z
+fabrics F AE B R IH K S
+fabris F AE B R IH S
+fabrizi F AA B R IY Z IY
+fabrizio F AA B R IY T S IY OW
+fabrizius F AE B R IY Z IY AH S
+fabron F AE B R AH N
+fabry F AE B R IY
+fabulous F AE B Y AH L AH S
+fabulously F AE B Y UW L AH S L IY
+fac F AE K
+facade F AH S AA D
+facades F AH S AA D Z
+facchini F AA K IY N IY
+facciola F AE CH IY OW L AH
+face F EY S
+faced F EY S T
+facedown F EY S D AW N
+faceless F EY S L AH S
+facelift F EY S L IH F T
+facemire F AA CH EH M IH R IY
+facer F EY S ER
+faces F EY S AH Z
+faces(2) F EY S IH Z
+facet F AE S AH T
+facet's F AE S AH T S
+faceted F AE S AH T IH D
+facetious F AH S IY SH AH S
+facetiously F AH S IY SH AH S L IY
+facets F AE S AH T S
+facey F EY S IY
+fachet F AE CH AH T
+facial F EY SH AH L
+facials F EY SH AH L Z
+faciane F AA S IY AA N EY
+facie F EY S IY
+facile F AE S AH L
+facilitate F AH S IH L AH T EY T
+facilitated F AH S IH L AH T EY T IH D
+facilitates F AH S IH L AH T EY T S
+facilitating F AH S IH L AH T EY T IH NG
+facilitation F AH S IH L AH T EY SH AH N
+facilitator F AH S IH L AH T EY T ER
+facilitator's F AH S IH L AH T EY T ER Z
+facilitators F AH S IH L AH T EY T ER Z
+facilities F AH S IH L AH T IY Z
+facilities(2) F AH S IH L IH T IY Z
+facility F AH S IH L IH T IY
+facility's F AH S IH L IH T IY Z
+facing F EY S IH NG
+facings F EY S IH NG Z
+fackler F AE K L ER
+fackrell F AE K R AH L
+facsimile F AE K S IH M AH L IY
+facsimiles F AE K S IH M AH L IY Z
+fact F AE K T
+facteau F AH K T OW
+faction F AE K SH AH N
+factional F AE K SH AH N AH L
+factionalism F AE K SH AH N AH L IH Z AH M
+factions F AE K SH AH N Z
+factitious F AE K T IH SH AH S
+factly F AE K T L IY
+facto F AE K T OW
+factor F AE K T ER
+factored F AE K T ER D
+factories F AE K T ER IY Z
+factoring F AE K T ER IH NG
+factors F AE K T ER Z
+factors' F AE K T ER Z
+factory F AE K T ER IY
+factory's F AE K T ER IY Z
+facts F AE K T S
+facts(2) F AE K S
+factual F AE K CH UW AH L
+factually F AE K CH UW AH L IY
+facultative F AE K AH L T EY T IH V
+faculties F AE K AH L T IY Z
+faculty F AE K AH L T IY
+fad F AE D
+fadden F AE D AH N
+faddis F AE D IH S
+faddish F AE D IH SH
+fade F EY D
+faded F EY D AH D
+faded(2) F EY D IH D
+fadel F AE D AH L
+fadeley F AE D IH L IY
+fadely F EY D L IY
+faden F EY D AH N
+fader F EY D ER
+fades F EY D Z
+fadiman F AE D AH M AH N
+fading F EY D IH NG
+fadlallah F AE D L AE L AH
+fadness F AE D N AH S
+fads F AE D Z
+fae F AY
+faerber F EH R B ER
+faeth F IY TH
+fag F AE G
+fagan F EY G AH N
+fagen F AE G AH N
+fager F EY G ER
+fagerberg F EY G ER B ER G
+fagerstrom F EY G ER S T R AH M
+fagg F AE G
+faggart F AE G AA R T
+faggot F AE G AH T
+fagin F EY G IH N
+fagley F AE G L IY
+fagnant F AE G N AH N T
+fagoth F AE G AH TH
+fags F AE G Z
+fagundes F AE G AH N D Z
+fahd F AA D
+faherty F AE HH ER T IY
+fahey F AE HH IY
+fahl F AA L
+fahlman F AA L M AH N
+fahmy F AA M IY
+fahnestock F AA N S T AA K
+fahr F AA R
+fahrenheit F EH R AH N HH AY T
+fahrenheit's F EH R AH N HH AY T S
+fahrenkopf F AA R AH N K AA P F
+fahrer F AA R ER
+fahringer F AA R IH NG ER
+fahrner F AA R N ER
+fahrney F AA R N IY
+fahs F AE S
+fahy F EY HH IY
+faidley F EY D L IY
+faiella F AY EH L AH
+fail F EY L
+faile F EY L
+failed F EY L D
+failing F EY L IH NG
+failings F EY L IH NG Z
+failla F EY L AH
+failor F EY L ER
+fails F EY L Z
+failsafe F EY L S EY F
+failure F EY L Y ER
+failures F EY L Y ER Z
+fain F EY N
+faint F EY N T
+fainted F EY N T IH D
+fainter F EY N T ER
+faintest F EY N T AH S T
+fainthearted F EY N T HH AA R T IH D
+fainting F EY N T IH NG
+faintly F EY N T L IY
+faintness F EY N T N AH S
+faiola F AY OW L AH
+fair F EH R
+fair's F EH R Z
+fair-lawn F EH R L AO N
+fairall F EH R AO L
+fairbairn F EH R B ER N
+fairbank F EH R B AH NG K
+fairbanks F EH R B AH NG K S
+fairbrother F EH R B R AH DH ER
+fairburn F EH R B ER N
+fairchild F EH R CH AY L D
+fairchild's F EH R CH AY L D Z
+faircloth F EH R K L AH TH
+fairclough F EH R K L AW
+faire F EH R
+fairer F EH R ER
+faires F EH R Z
+fairest F EH R IH S T
+fairey F EH R IY
+fairfax F EH R F AE K S
+fairfield F EH R F IY L D
+fairground F EH R G R AW N D
+fairgrounds F EH R G R AW N D Z
+fairhaven F EH R HH EY V AH N
+fairhurst F AY R HH ER S T
+fairies F EH R IY Z
+fairlawn F EH R L AO N
+fairleigh F EH R L AH
+fairless F EH R L IH S
+fairley F EH R L IY
+fairlie F EH R L IY
+fairlow F EH R L OW
+fairly F EH R L IY
+fairman F AY R M AH N
+fairmont F EH R M AA N T
+fairness F EH R N AH S
+fairs F EH R Z
+fairview F EH R V Y UW
+fairway F EH R W EY
+fairways F EH R W EY Z
+fairweather F EH R W EH DH ER
+fairy F EH R IY
+fairyland F EH R IY L AE N D
+fairytale F EH R IY T EY L
+fairytales F EH R IY T EY L Z
+faisal F EY Z AH L
+faison F EY Z AH N
+faist F AA IH S T
+fait F EY T
+faith F EY TH
+faithful F EY TH F AH L
+faithfully F EY TH F AH L IY
+faithfuls F EY TH F AH L Z
+faiths F EY TH S
+faivre F EY V ER
+fajardo F AA Y AA R D OW
+fajita F AH JH IY T AH
+fajita(2) F AH HH IY T AH
+fajitas F AH JH IY T AH Z
+fajitas(2) F AH HH IY T AH Z
+fake F EY K
+faked F EY K T
+faker F EY K ER
+fakers F EY K ER Z
+fakes F EY K S
+faking F EY K IH NG
+falafel F AH L AA F AH L
+falanga F AA L AA NG G AH
+falani F AH L AA N IY
+falani(2) F AH L AE N IY
+falardeau F AE L AA R D OW
+falasco F AA L AA S K OW
+falb F AO L B
+falbo F AE L B OW
+falcigno F AE L S IH G N OW
+falcigno(2) F EH L S IY N Y OW
+falck F AE L K
+falco F AE L K OW
+falcoff F AE L K AO F
+falcon F AE L K AH N
+falconbridge F AE L K AH N B R IH JH
+falconbridge's F AE L K AH N B R IH JH IH Z
+falcone F AA L K OW N IY
+falconer F AE L K AH N ER
+falconers F AE L K AH N ER Z
+falconet F AE L K AH N EH T
+falconets F AE L K AH N EH T S
+falconi F AA L K OW N IY
+falconry F AE L K AH N R IY
+falcons F AE L K AH N Z
+faldo F AA L D OW
+faler F EY L ER
+fales F EY L Z
+faley F EY L IY
+falgoust F AA L G UW S T
+falgout F AE L G AW T
+falik F AA L IH K
+falin F AE L IH N
+falise F AH L IY S
+falk F AO K
+falke F AO K
+falkenberg F AO K AH N B ER G
+falkenstein F AO K AH N S T AY N
+falkenstein(2) F AO K AH N S T IY N
+falkland F AO K L AH N D
+falklands F AO K L AH N D Z
+falkner F AO K N ER
+falkowski F AH L K AO F S K IY
+fall F AO L
+fall's F AO L Z
+fall(2) F AA L
+falla F AE L AH
+fallacies F AE L AH S IY Z
+fallacious F AH L EY SH AH S
+fallaciously F AH L EY SH AH S L IY
+fallacy F AE L AH S IY
+fallaw F AE L AO
+fallback F AO L B AE K
+fallen F AA L AH N
+faller F AO L ER
+fallert F AE L ER T
+fallibility F AE L IH B IH L IH T IY
+fallible F AE L AH B AH L
+fallin F AE L IH N
+falling F AA L IH NG
+fallis F AE L IH S
+fallish F AA L IH SH
+falloff F AO L AO F
+fallon F AE L AH N
+fallopian F AH L OW P IY AH N
+fallout F AO L AW T
+fallouts F AO L AW T S
+fallow F AE L OW
+fallows F AE L OW Z
+falls F AO L Z
+falmouth F AE L M AH TH
+falor F AE L ER
+falotico F AA L OW T IY K OW
+false F AO L S
+falsehood F AE L S HH UH D
+falsehoods F AE L S HH UH D Z
+falsely F AO L S L IY
+falsetto F AO L S EH T OW
+falsettos F AO L S EH T OW Z
+falsification F AE L S AH F AH K EY SH AH N
+falsified F AO L S AH F AY D
+falsify F AO L S AH F AY
+falsifying F AO L S AH F AY IH NG
+falsity F AO L S AH T IY
+falsone F AO L S AH N
+falstaff F AO L S T AE F
+falstaff's F AO L S T AE F S
+falter F AO L T ER
+faltered F AA L T ER D
+faltering F AO L T ER IH NG
+falters F AO L T ER Z
+falvey F AE L V IY
+falvo F AA L V OW
+falwell F AO L W EH L
+falwell's F AO L W EH L Z
+falynn F AE L IH N
+falzarano F AA L Z AA R AA N OW
+falzon F AA L Z AH N
+falzone F AA L Z OW N IY
+fama F AA M AH
+fambro F AE M B R OW
+fambrough F AE M B R AW
+fame F EY M
+famed F EY M D
+famer F EY M ER
+famers F EY M ER Z
+famiglietti F AH M IH G L IY EH T IY
+familial F AH M IH L Y AH L
+familiar F AH M IH L Y ER
+familiarity F AH M IH L Y EH R AH T IY
+familiarize F AH M IH L Y ER AY Z
+familiarized F AH M IH L Y ER AY Z D
+families F AE M AH L IY Z
+families' F AE M AH L IY Z
+families(2) F AE M L IY Z
+family F AE M AH L IY
+family's F AE M AH L IY Z
+family's(2) F AE M L IY Z
+family(2) F AE M L IY
+famine F AE M AH N
+famines F AE M AH N Z
+famous F EY M AH S
+famously F EY M AH S L IY
+famularo F AA M UW L AA R OW
+fan F AE N
+fan's F AE N Z
+fanara F AA N AA R AH
+fanatic F AH N AE T IH K
+fanatical F AH N AE T IH K AH L
+fanatically F AH N AE T IH K AH L IY
+fanatically(2) F AH N AE T IH K L IY
+fanaticism F AH N AE T AH S IH Z AH M
+fanatics F AH N AE T IH K S
+fancher F AE N CH ER
+fanchon F AE N CH AH N
+fancied F AE N S IY D
+fancier F AE N S IY ER
+fanciers F AE N S IY ER Z
+fancies F AE N S IY Z
+fanciest F AE N S IY AH S T
+fanciful F AE N S IH F AH L
+fancy F AE N S IY
+fandango F AE N D AE NG G OW
+fandel F AE N D AH L
+fandrich F AE N D R IH K
+fane F EY N
+fanech F AE N EH K
+fanech's F AE N EH K S
+fanelli F AH N EH L IY
+faneuil F AE N Y UW IH L
+fanfare F AE N F EH R
+fang F AE NG
+fanger F AE NG ER
+fangle F AE NG G AH L
+fangled F AE NG G AH L D
+fangman F AE NG M AH N
+fangs F AE NG Z
+fanguy F AH NG G W IY
+fankhauser F AE NG K HH AW Z ER
+fanlike F AE N L AY K
+fann F AE N
+fanned F AE N D
+fannie F AE N IY
+fannin F AE N IH N
+fanning F AE N IH NG
+fanning's F AE N IH NG Z
+fannon F AE N AH N
+fanny F AE N IY
+fans F AE N Z
+fans' F AE N Z
+fansler F AE N S AH L ER
+fansler(2) F AE N Z L ER
+fant F AE N T
+fanta F AA N T AH
+fantail F AE N T EY L
+fantasia F AE N T EY ZH AH
+fantasies F AE N T AH S IY Z
+fantasies(2) F AE N AH S IY Z
+fantasize F AE N T AH S AY Z
+fantasize(2) F AE N AH S AY Z
+fantasized F AE N T IH S AY Z D
+fantasized(2) F AE N IH S AY Z D
+fantasizes F AE N T AH S AY Z IH Z
+fantasizes(2) F AE N AH S AY Z IH Z
+fantasizing F AE N T AH S AY Z IH NG
+fantasizing(2) F AE N AH S AY Z IH NG
+fantastic F AE N T AE S T IH K
+fantastically F AE N T AE S T IH K L IY
+fantastik F AE N T AE S T IH K
+fantasy F AE N T AH S IY
+fantasy(2) F AE N AH S IY
+fantasyland F AE N T AH S IY L AE N D
+fantasyland(2) F AE N AH S IY L AE N D
+fantini F AA N T IY N IY
+fantle F AE N T AH L
+fanton F AE N T AH N
+fantozzi F AA N T OW T S IY
+fantroy F AE N T R OY
+fanuc F AE N AH K
+fanucchi F AA N UW K IY
+fanueil F AE N Y AH L
+fao F AW
+far F AA R
+far's F AA R Z
+farabaugh F AE R AH B AO
+farabee F AE R AH B IY
+farabundo F EH R AH B UW N D OW
+farace F AA R AA CH IY
+faraci F AA R AA CH IY
+faraday F AE R AH D EY
+faraday's F AE R AH D EY Z
+faragher F AE R AH G HH ER
+farago F AA R AA G OW
+farah F EH R AH
+faraha F AA R AH HH AA
+farahkan F AE R AH K AE N
+farai F EH R EY
+farai(2) F AA R EY
+farai(3) F AA R AY
+faranda F ER AE N D AH
+faraone F AA R AA OW N IY
+faraway F AA R AH W EY
+farb F AA R B
+farben F AA R B AH N
+farber F AA R B ER
+farberware F AA R B ER W EH R
+farbman F AA R B M AH N
+farce F AA R S
+farcical F AA R S AH K AH L
+farcical(2) F AA R S IH K AH L
+fare F EH R
+fared F EH R D
+fares F EH R Z
+farese F AA R EY Z IY
+faretlow F AH R EH T L OW
+farewell F EH R W EH L
+farewells F EH R W EH L Z
+farfen F AA R F AH N
+farfetched F AA R F EH CH T
+farge F AA R JH
+fargnoli F AA R G N OW L IY
+fargo F AA R G OW
+fargo's F AA R G OW Z
+farha F AA R HH AH
+farhat F AA R HH AE T
+faria F AA R IY AH
+farias F EH R IY AH Z
+faribault F AE R AH B AA L T
+farica F AA R IY K AH
+faridoun F AA R IH D UW N
+fariello F AA R IY EH L OW
+faries F EH R IY Z
+farina F ER IY N AH
+farinacci F AA R IY N AA CH IY
+farinas F ER IY N AH Z
+farinella F AA R IY N EH L AH
+faring F EH R IY NG
+farino F AA R IY N OW
+faris F EH R IH S
+farish F EH R IH SH
+fariss F ER IH S
+farkas F AA R K AH S
+farland F AA R L AH N D
+farlee F AA R L IY
+farler F AA R L ER
+farless F AA R L AH S
+farley F AA R L IY
+farling F AA R L IH NG
+farlow F AA R L OW
+farly F AA R L IY
+farm F AA R M
+farm's F AA R M Z
+farman F AA R M AH N
+farmboy F AA R M B OY
+farmed F AA R M D
+farmer F AA R M ER
+farmer's F AA R M ER Z
+farmers F AA R M ER Z
+farmers' F AA R M ER Z
+farmers's F AA R M ER Z IH Z
+farmhand F AA R M HH AE N D
+farmhands F AA R M HH AE N D Z
+farmhouse F AA R M HH AW S
+farmhouses F AA R M HH AW S AH Z
+farmhouses(2) F AA R M HH AW S IH Z
+farming F AA R M IH NG
+farming's F AA R M IH NG Z
+farmingdale F AA R M IH NG D EY L
+farmington F AA R M IH NG T AH N
+farmland F AA R M L AE N D
+farmlands F AA R M L AE N D Z
+farms F AA R M Z
+farms' F AA R M Z
+farmstead F AA R M S T EH D
+farmworker F AA R M W ER K ER
+farmworkers F AA R M W ER K ER Z
+farmyard F AA R M Y AA R D
+farnall F AA R N AH L
+farnam F AA R N AH M
+farnan F AA R N AH N
+farnborough F AA R N B ER OW
+farnell F AA R N AH L
+farner F AA R N ER
+farnes F AA R N Z
+farney F AA R N IY
+farnham F AA R N AH M
+farnley F AA R N L IY
+farnsworth F AA R N S W ER TH
+farnum F AA R N AH M
+farnworth F AA R N W ER TH
+faro F EH R OW
+farold F AE R OW L D
+faron F EH R AH N
+farone F ER OW N
+farouk F AH R UW K
+farquar F AA R K W AA R
+farquhar F AA R K W ER
+farquharson F AA R K AH HH AA R S AH N
+farr F AA R
+farra F AA R AH
+farragut F EH R AH G AH T
+farrah F EH R AH
+farrakhan F AA R AH K AA N
+farrakhan's F AA R AH K AA N Z
+farran F AE R AH N
+farrand F AE R AH N D
+farrant F AA R AH N T
+farrar F ER AA R
+farrel F EH R AH L
+farrell F EH R IH L
+farrell's F EH R IH L Z
+farrelly F EH R AH L IY
+farren F EH R AH N
+farrens F AE R AH N Z
+farrer F AA R ER
+farrey F AE R IY
+farrier F EH R IY ER
+farrington F EH R IH NG T AH N
+farrior F AA R IY ER
+farris F EH R IH S
+farrish F AE R IH SH
+farro F AA R OW
+farron F EH R AH N
+farrow F EH R OW
+farrow's F EH R OW Z
+farrowing F AE R OW IH NG
+farruggia F AA R UW G JH AH
+farrugia F AA R UW JH AH
+farry F AE R IY
+farsi F AA R S IY
+farsighted F AA R S AY T AH D
+farsighted(2) F AA R S AY T IH D
+farsightedness F AA R S AY T IH D N AH S
+farson F AA R S AH N
+fart F AA R T
+farther F AA R DH ER
+farthest F AA R DH AH S T
+farthing F AA R DH IH NG
+farthingale F AA R DH IH NG G EY L
+farve F AA R V
+farver F AA R V ER
+farwell F AA R W EH L
+farwest F AA R W EH S T
+fasano F AA S AA N OW
+fasbender F AE S B EH N D ER
+fascell F AH S EH L
+fasching F AE SH IH NG
+fasciano F AA S CH IY AA N OW
+fascinate F AE S AH N EY T
+fascinated F AE S AH N EY T AH D
+fascinated(2) F AE S AH N EY T IH D
+fascinates F AE S AH N EY T S
+fascinating F AE S AH N EY T IH NG
+fascination F AE S AH N EY SH AH N
+fascism F AE SH IH Z AH M
+fascist F AE SH AH S T
+fascists F AE SH AH S T S
+fascists(2) F AE SH AH S S
+fascists(3) F AE SH AH S
+fashion F AE SH AH N
+fashion's F AE SH AH N Z
+fashionable F AE SH AH N AH B AH L
+fashionable(2) F AE SH N AH B AH L
+fashionably F AE SH AH N AH B L IY
+fashioned F AE SH AH N D
+fashioning F AE SH AH N IH NG
+fashions F AE SH AH N Z
+fasick F AE S IH K
+fasig F AE S IH G
+fasnacht F AE S N AH K T
+faso F AA S OW
+faso's F AA S OW Z
+fason F AE S AH N
+fasone F AA S OW N IY
+fass F AE S
+fassbender F AE S B EH N D ER
+fassett F AE S IH T
+fassler F AE S L ER
+fassnacht F AE S N AH K T
+fassulo F AH S UW L OW
+fast F AE S T
+fastball F AE S T B AO L
+fastballs F AE S T B AO L Z
+fasted F AE S T IH D
+fasten F AE S AH N
+fastened F AE S AH N D
+fastener F AE S AH N ER
+fastener(2) F AE S N ER
+fasteners F AE S AH N ER Z
+fasteners(2) F AE S N ER Z
+fastening F AE S AH N IH NG
+fastening(2) F AE S N IH NG
+fastenings F AE S AH N IH NG Z
+fastenings(2) F AE S N IH NG Z
+faster F AE S T ER
+fastest F AE S T AH S T
+fastfood F AE S T F UW D
+fastidious F AE S T IH D IY AH S
+fasting F AE S T IH NG
+fastness F AE S T N AH S
+fasts F AE S T S
+fasulo F AH S UW L OW
+fat F AE T
+fata F AA T AH
+fatah F AA T AH
+fatah(2) F AH T AA
+fatal F EY T AH L
+fatalism F EY T AH L IH Z AH M
+fatalist F EY T AH L IH S T
+fatalistic F EY T AH L IH S T IH K
+fatalists F EY T AH L IH S T S
+fatalists(2) F EY T AH L IH S S
+fatalists(3) F EY T AH L IH S
+fatalities F AH T AE L AH T IY Z
+fatalities(2) F AH T AE L IH T IY Z
+fatality F AH T AE L AH T IY
+fatality(2) F AH T AE L IH T IY
+fatally F EY T AH L IY
+fate F EY T
+fated F EY T IH D
+fateful F EY T F AH L
+fateh F AA T EH
+fates F EY T S
+fath F AE TH
+father F AA DH ER
+father's F AA DH ER Z
+fathered F AA DH ER D
+fatheree F AE TH ER IY
+fatherhood F AA DH ER HH UH D
+fathering F AA DH ER IH NG
+fatherland F AA DH ER L AE N D
+fatherless F AA DH ER L AH S
+fatherly F AA DH ER L IY
+fathers F AA DH ER Z
+fathers' F AE TH ER Z
+fathi F AE TH IY
+fathom F AE DH AH M
+fathomable F AE DH AH M AH B AH L
+fathoms F AE DH AH M Z
+fatigue F AH T IY G
+fatigued F AH T IY G D
+fatigues F AH T IY G Z
+fatiguing F AH T IY G IH NG
+fatima F AE TH IH M AH
+fatima(2) F AE T IH M AH
+fatimah F AE TH IH M AH
+fats F AE T S
+fatten F AE T AH N
+fattened F AE T AH N D
+fattening F AE T AH N IH NG
+fattening(2) F AE T N IH NG
+fatter F AE T ER
+fattest F AE T AH S T
+fatties F AE T IY Z
+fatty F AE T IY
+fatula F AA T UW L AH
+fatuous F AE CH AH W AH S
+fatwa F AA T W AA
+fatzinger F EY T Z IH NG ER
+faubel F AW B AH L
+fauber F AW B ER
+faubert F AW B ER T
+faubion F AW B IY AH N
+fauble F AO B AH L
+faubus F AO B AH S
+faucet F AO S AH T
+faucets F AO S AH T S
+faucett F AO S IH T
+faucette F OW S EH T
+faucher F AW K ER
+faucheux F OW SH OW
+fauci F AO S IY
+faughn F AO N
+faughnan F AO N AH N
+faught F AO T
+faught's F AO T S
+faul F AO L
+faulcon F AO L K AH N
+faulconer F AO L K AH N ER
+faulding F AO L D IH NG
+faulds F AO L D Z
+faulhaber F AW L HH AH B ER
+faulk F AO K
+faulkenberry F AO L K AH N B EH R IY
+faulkner F AO K N ER
+faulkner's F AO K N ER Z
+faulks F AO K S
+faull F AO L
+faulstich F AO L S T IH CH
+fault F AO L T
+faulted F AO L T IH D
+faulting F AO L T IH NG
+faults F AO L T S
+faulty F AO L T IY
+fauna F AO N AH
+faunal F AA N AH L
+faunal(2) F AO N AH L
+faunce F AO N S
+fauntleroy F AO N T L ER OY
+fauntroy F AO N T R OY
+faupel F OW P EH L
+faure F AO R
+faurot F AO R OW
+fauroux F AO R UW
+faus F AO Z
+fauser F AW S ER
+fausett F AO S IH T
+fausey F AO S IY
+fausnaugh F AO S N AO
+fauss F AO S
+faust F AW S T
+fausta F AO S T AH
+faustian F AO S CH AH N
+faustina F AO S T IY N AH
+faustine F AW S T IY N
+faustino F AO S T IY N OW
+fausto F AO S T OW
+faustus F AO S T AH S
+fauteux F OW T OW
+fauth F AO TH
+fauver F AW V ER
+faux F AO K S
+fava F AA V AH
+favale F AA V AA L IY
+favaloro F AA V AA L AO R OW
+favaro F AA V AA R OW
+favata F AA V AA T AH
+favazza F AA V AA T S AH
+fave F EY V
+favela F AA V EH L AH
+faver F EY V ER
+favero F AA V EH R OW
+favia F AA V IY AH
+favinger F EY V IH NG ER
+favor F EY V ER
+favorability F AE V ER AH B IH L IH T IY
+favorable F EY V ER AH B AH L
+favorable(2) F EY V R AH B AH L
+favorably F EY V ER AH B L IY
+favorably(2) F EY V R AH B L IY
+favored F EY V ER D
+favoring F EY V ER IH NG
+favorite F EY V ER IH T
+favorite(2) F EY V R AH T
+favorites F EY V ER IH T S
+favorites(2) F EY V R AH T S
+favoritism F EY V ER IH T IH Z AH M
+favors F EY V ER Z
+favre F EY V ER
+favreau F AH V R OW
+favro F AE V R OW
+faw F AO
+fawbush F AO B UH SH
+fawcett F AO S IH T
+fawkes F AO K S
+fawley F AO L IY
+fawn F AO N
+fawning F AO N IH NG
+fawver F AO V ER
+fax F AE K S
+faxed F AE K S T
+faxer F AE K S ER
+faxes F AE K S IH Z
+faxing F AE K S IH NG
+faxon F AE K S AH N
+fay F EY
+fay's F EY Z
+fayanjuu F AY AH N JH UW
+fayanne F EY IH N
+fayanne(2) F EY AE N
+fayard F AH Y AA R D
+faye F EY
+faye's F EY Z
+fayed F EY D
+fayed's F EY D Z
+fayette F EY EH T
+fayetteville F EY EH T V IH L
+fayez F EY EH Z
+fayme F EY M
+faymonville F EY M AH N V IH L
+fayne F EY N
+fayrouz F EY R UW Z
+faz F AE Z
+faze F EY Z
+fazed F EY Z D
+fazekas F AE Z IH K AH Z
+fazenbaker F EY Z AH N B EY K ER
+fazio F EY Z IY OW
+fazio(2) F AA Z IY OW
+fazzino F AA T S IY N OW
+fazzio F AE Z IY OW
+fe F EY
+fe's F EY Z
+feagan F EY G AH N
+feagans F IY G AH N Z
+feagin F IY JH IH N
+feagins F IY JH IH N Z
+feagle F IY G AH L
+fealty F IY AH L T IY
+fealty(2) F IY L T IY
+fear F IH R
+feared F IH R D
+fearful F IH R F AH L
+fearing F IH R IH NG
+fearless F IH R L AH S
+fearn F ER N
+fearnow F ER N OW
+fearon F IH R AH N
+fears F IH R Z
+fearsome F IH R S AH M
+feasel F IY Z AH L
+feasibility F IY Z AH B IH L AH T IY
+feasible F IY Z AH B AH L
+feasibly F IY Z AH B L IY
+feast F IY S T
+feasted F IY S T IH D
+feaster F IY S T ER
+feasting F IY S T IH NG
+feasts F IY S T S
+feasts(2) F IY S S
+feasts(3) F IY S
+feat F IY T
+feather F EH DH ER
+featherbed F EH DH ER B EH D
+featherbedding F EH DH ER B EH D IH NG
+feathered F EH DH ER D
+feathering F EH DH ER IH NG
+feathering(2) F EH DH R IH NG
+featherless F EH DH ER L AH S
+featherly F EH DH ER L IY
+feathers F EH DH ER Z
+featherston F EH DH ER S T AH N
+featherstone F EH DH ER S T OW N
+featherweight F EH DH ER W EY T
+feathery F EH DH ER IY
+feathery(2) F EH DH R IY
+feats F IY T S
+feature F IY CH ER
+featured F IY CH ER D
+featureless F IY CH ER L AH S
+features F IY CH ER Z
+featuring F IY CH ER IH NG
+feazel F IY Z AH L
+feazell F IY Z AH L
+feb F EH B Y AH W EH R IY
+febles F EH B AH L Z
+febres F EH B R AH S
+february F EH B Y AH W EH R IY
+february's F EH B Y AH W EH R IY Z
+february's(2) F EH B AH W EH R IY Z
+february's(3) F EH B R UW W EH R IY Z
+february's(4) F EH B UW W EH R IY Z
+february's(5) F EH B Y UW W EH R IY Z
+february(2) F EH B AH W EH R IY
+february(3) F EH B R UW W EH R IY
+february(4) F EH B UW W EH R IY
+february(5) F EH B Y UW W EH R IY
+fecal F IY K AH L
+feces F IY S IY Z
+fecher F EH K ER
+fechner F EH K N ER
+fecht F EH K T
+fechter F EH K T ER
+feck F EH K
+feckless F EH K L IH S
+fecteau F IH K T OW
+fecundity F AH K AH N D IH T IY
+fed F EH D
+fed's F EH D Z
+fedak F EH D AH K
+fedder F EH D ER
+fedders F EH D ER Z
+fedders's F EH D ER Z IH Z
+feddersen F EH D ER S AH N
+fede F IY D
+fedeccredito F EH D EH K R EH D IY T OW
+fedele F EH D AH L
+fedeli F EH D EH L IY
+feder F EH D ER
+federal F EH D ER AH L
+federal's F EH D ER AH L Z
+federal's(2) F EH D R AH L Z
+federal(2) F EH D R AH L
+federalism F EH D ER AH L IH Z AH M
+federalism(2) F EH D R AH L IH Z AH M
+federalist F EH D ER AH L IH S T
+federalist(2) F EH D R AH L AH S T
+federalists F EH D ER AH L IH S T S
+federalists(2) F EH D ER AH L IH S
+federalists(3) F EH D R AH L IH S T S
+federalists(4) F EH D R AH L IH S
+federalize F EH D ER AH L AY Z
+federalize(2) F EH D R AH L AY Z
+federalized F EH D ER AH L AY Z D
+federalized(2) F EH D R AH L AY Z D
+federalizing F EH D ER AH L AY Z IH NG
+federalizing(2) F EH D R AH L AY Z IH NG
+federally F EH D ER AH L IY
+federally(2) F EH D R AH L IY
+federals F EH D ER AH L Z
+federals(2) F EH D R AH L Z
+federate F EH D ER EY T
+federated F EH D ER EY T IH D
+federated's F EH D ER EY T IH D Z
+federation F EH D ER EY SH AH N
+federation's F EH D ER EY SH AH N Z
+federations F EH D ER EY SH AH N Z
+federative F EH D ER AH T IH V
+federative(2) F EH D R AH T IH V
+federbush F EH D ER B UH SH
+federer F EH D ER ER
+federica F EH D ER IY K AH
+federici F EH D ER IY CH IY
+federico F EH D ER IY K OW
+federle F EH D ER AH L
+federman F IY D ER M AH N
+federoff F EH D ER AO F
+federov F EH D ER AO V
+federspiel F EH D ER S P IY L
+fedewa F IH D UW AH
+fedex F EH D EH K S
+fediay F IY D IY EY
+fedler F EH D L ER
+fedor F EH D ER
+fedora F IH D AO R AH
+fedorchak F EH D ER K AH K
+fedorko F IH D AO R K OW
+fedrick F EH D R IH K
+feds F EH D Z
+fee F IY
+feeback F IY B AE K
+feebis F IY B IH S
+feeble F IY B AH L
+feebly F IY B L IY
+feed F IY D
+feedback F IY D B AE K
+feeder F IY D ER
+feeders F IY D ER Z
+feeding F IY D IH NG
+feedings F IY D IH NG Z
+feedlot F IY D L AA T
+feedlots F IY D L AA T S
+feeds F IY D Z
+feedstock F IY D S T AA K
+feedstocks F IY D S T AA K S
+feehan F IY AH N
+feel F IY L
+feeler F IY L ER
+feelers F IY L ER Z
+feeley F IY L IY
+feelin' F IY L IH N
+feeling F IY L IH NG
+feelings F IY L IH NG Z
+feels F IY L Z
+feely F IY L IY
+feemster F IY M S T ER
+feeney F IY N IY
+feenstra F IY N S T R AH
+feeny F IY N IY
+fees F IY Z
+feese F IY Z
+feeser F IY Z ER
+feet F IY T
+feezor F IY Z ER
+feffer F EH F ER
+fegan F EH G AH N
+feger F IY G ER
+fegley F EH G L IY
+feher F EH HH ER
+fehl F EH L
+fehling F EH L IH NG
+fehlman F EH L M AH N
+fehn F EH N
+fehnel F EH N AH L
+fehr F EH R
+fehrenbach F EH R IH N B AA K
+fehrenbacher F EH R IH N B AA K ER
+fehring F EH R IH NG
+fehringer F EH R IH NG ER
+fehrman F EH R M AH N
+feick F IY K
+feickert F AY K ER T
+feig F IY G
+feige F IY JH
+feigel F AY G AH L
+feigen F AY G AH N
+feigenbaum F AY G AH N B AW M
+feiger F AY G ER
+feighan F EY G AH N
+feighner F EY N ER
+feight F EY T
+feigin F AY G IH N
+feign F EY N
+feigned F EY N D
+feigning F EY N IH NG
+feil F IY L
+feild F IY L D
+feiler F AY L ER
+feimster F AY M S T ER
+fein F AY N
+fein's F AY N Z
+fein's(2) F EY N Z
+fein(2) F EY N
+feinauer F AY N AW ER
+feinberg F AY N B ER G
+feiner F AY N ER
+feinerman F AY N ER M AH N
+feingold F AY NG G OW L D
+feinman F AY N M AH N
+feinstein F AY N S T AY N
+feinstein's F AY N S T AY N Z
+feinstein's(2) F AY N S T IY N Z
+feinstein(2) F AY N S T IY N
+feint F EY N T
+feis F AY S
+feist F AY S T
+feister F AY S T ER
+feisty F AY S T IY
+feit F AY T
+feith F AY TH
+feith's F AY TH S
+feitz F AY T S
+fejes F IH ZH IY Z
+fekete F EH K IY T
+fel F EH L
+fela F EH L AH
+felan F EH L AH N
+felbatol F EH L B AH T AA L
+felber F EH L B ER
+felch F EH L CH
+feld F EH L D
+felda F EH L D AH
+feldberg F EH L D B ER G
+feldblum F EH L D B L UW M
+feldblum(2) F EH L D B L AH M
+felde F EH L D
+feldene F EH L D IY N
+felder F EH L D ER
+felderman F EH L D ER M AH N
+feldhaus F EH L D HH AW S
+feldkamp F EH L D K AE M P
+feldman F EH L D M AH N
+feldman's F EH L D M AH N Z
+feldmann F EH L D M AH N
+feldmeier F EH L D M AY ER
+feldmuehle F EH L D M Y UW L AH
+feldner F EH L D N ER
+feldpausch F EH L D P AW SH
+feldspar F EH L D S P AA R
+feldspars F EH L D S P AA R Z
+feldstein F EH L D S T AY N
+feldstein's F EH L D S T IY N Z
+feldstein's(2) F EH L D S T AY N Z
+feldstein(2) F EH L D S T IY N
+feldt F EH L T
+felgenhauer F EH L G IH N HH AW ER
+felger F EH L G ER
+felice F AH L IY S
+felicetti F EH L IY CH EH T IY
+felicia F AH L IY SH AH
+felicia's F AH L IY SH AH Z
+feliciano F AH L IY S IY AA N OW
+feliciano's F AH L IY S IY AA N OW Z
+feliciano's(2) F AH L IY SH IY AA N OW Z
+feliciano(2) F AH L IY SH IY AA N OW
+felicitate F AH L IH S IH T EY T
+felicite F EH L IH S AY T
+felicite(2) F EH L IH S AH T IY
+felicitous F IH L IH S AH T AH S
+felicity F IH L IH S AH T IY
+felim F EH L AH M
+feline F IY L AY N
+felines F IY L AY N Z
+felipe F AH L IY P
+felis F EH L IH S
+felix F IY L IH K S
+felix's F IY L IH K S IH Z
+feliz F EH L IH Z
+felkel F EH L K AH L
+felker F EH L K ER
+felker's F EH L K ER Z
+felkins F EH L K IH N Z
+felkner F EH L K N ER
+fell F EH L
+fella F EH L AH
+felland F EH L AH N D
+fellas F EH L AH S
+fellatio F AH L EY SH IY OW
+felled F EH L D
+felleisen F EH L AY S AH N
+fellenz F EH L IH N S
+feller F EH L ER
+fellers F EH L ER Z
+fellheimer F EH L HH AY M ER
+fellin F EH L IH N
+felling F EH L IH NG
+fellinger F EH L IH NG ER
+fellini F AH L IY N IY
+fellman F EH L M AH N
+fellmeth F EH L M AH TH
+fellner F EH L N ER
+fellow F EH L OW
+fellow's F EH L OW Z
+fellowes F EH L OW Z
+fellows F EH L OW Z
+fellowship F EH L OW SH IH P
+fellowships F EH L OW SH IH P S
+fells F EH L Z
+fellsway F EH L Z W EY
+felman F EH L M AH N
+felmlee F EH L M L IY
+felon F EH L AH N
+felonies F EH L AH N IY Z
+felonious F EH L OW N IY AH S
+felons F EH L AH N Z
+felony F EH L AH N IY
+felps F EH L P S
+felrice F EH L R AY S
+fels F EH L Z
+felsenthal F EH L Z AH N TH AA L
+felske F EH L S K
+felt F EH L T
+felten F EH L T AH N
+felter F EH L T ER
+feltes F EH L T S
+feltler F EH L T L ER
+feltman F EH L T M AH N
+feltner F EH L T N ER
+felton F EH L T AH N
+feltrax F EH L T R AE K S
+felts F EH L T S
+feltsman F EH L T S M AH N
+feltus F EH L T AH S
+felty F EH L T IY
+feltz F EH L T S
+felucca F IH L AH K AH
+felver F EH L V ER
+fema F IY M AH
+female F IY M EY L
+female's F IY M EY L Z
+females F IY M EY L Z
+femia F IY M IY AH
+femina F EH M IH N AH
+feminine F EH M AH N AH N
+femininity F EH M AH N IH N AH T IY
+feminism F EH M IH N IH Z AH M
+feminist F EH M AH N AH S T
+feminists F EH M AH N AH S T S
+feminists(2) F EH M AH N AH S S
+feminists(3) F EH M AH N AH S
+femme F EH M
+femoral F EH M ER AH L
+femrite F EH M R AY T
+femsa F EH M S AH
+femur F IY M ER
+fen F EH N
+fenagle F AH N EY G AH L
+fence F EH N S
+fenced F EH N S T
+fenceless F EH N S L AH S
+fences F EH N S AH Z
+fences(2) F EH N S IH Z
+fencing F EH N S IH NG
+fencl F EH NG K AH L
+fend F EH N D
+fended F EH N D IH D
+fender F EH N D ER
+fenders F EH N D ER Z
+fenderson F EH N D ER S AH N
+fendi F EH N D IY
+fending F EH N D IH NG
+fendler F EH N D L ER
+fendley F EH N D L IY
+fendrick F EH N D R IH K
+fends F EH N D Z
+fendt F EH N T
+fenech F EH N IH K
+fenella F EH N EH L AH
+fenelon F EH N IH L AA N
+fenfluramine F EH N F L UH R AH M IY N
+feng F EH NG
+fenger F EH NG ER
+fenian F IY N IY AH N
+fenichell F EH N IH CH AH L
+fenimore F EH N IH M AO R
+fenjves F EH N HH EH V EH Z
+fenjves(2) F EH N V EH Z
+fenley F EH N L IY
+fenlon F EH N L AH N
+fenn F EH N
+fennel F EH N AH L
+fennell F EH N AH L
+fennelly F EH N AH L IY
+fennema F EH N IH M AH
+fenner F EH N ER
+fennessey F EH N IH S IY
+fennessy F EH N IH S IY
+fennewald F EH N IH W AO L D
+fenney F EH N IY
+fennimore F EH N IH M AO R
+fenno F EH N OW
+fenoglio F EH N OW G L IY OW
+fenphen F EH N F EH N
+fenske F EH N S K
+fenster F EH N S T ER
+fenstermacher F EH N S T ER M AH K ER
+fenstermaker F EH N S T ER M EY K ER
+fensterstock F EH N S T ER S T AA K
+fent F EH N T
+fenter F EH N T ER
+fenton F EH N T AH N
+fentress F EH N T R IH S
+fenugreek F EH N UW G R IY K
+fenway F EH N W EY
+fenwick F EH N W IH K
+fenwood F EH N W UH D
+fenyvessy F EH N IH V EH S IY
+fenzel F EH N Z AH L
+feodor F IY AH D ER
+feodora F IY AH D AO R AH
+feodorovich F IY AH D AO R AH V IH CH
+feola F IY AA L AH
+fer F ER
+fer(2) F EH R
+fera F EH R AH
+feral F EH R AH L
+feraluzi F EH R AH L UW Z IY
+ferarro F EH R AA R OW
+ferber F ER B ER
+ferch F ER K
+ferd F ER D
+ferderer F ER D ER ER
+ferdie F ER D IY
+ferdig F ER D IH G
+ferdinand F ER D IH N AE N D
+ferdinand(2) F ER D IH N AE N
+ferdinanda F ER D IY N AA N D AH
+ferdlow F EH R D L OW
+ferdon F EH R D AO N
+ferebee F EH R IH B IY
+ferenc F ER EH N S
+ference F IH R AH N S
+ferencz F EH R IH N CH
+feretlow F EH R AH T L OW
+feretlow(2) F EH R T L OW
+ferg F ER G
+fergason F ER G AH S AH N
+ferger F ER G ER
+fergerson F ER G ER S AH N
+fergeson F ER G AH S AH N
+fergie F ER G IY
+fergus F ER G AH S
+ferguson F ER G AH S AH N
+ferguson's F ER G AH S AH N Z
+fergusson F ER G AH S AH N
+feria F EH R IY AH
+ferko F ER K OW
+ferland F ER L AH N D
+ferm F ER M
+ferman F ER M AH N
+ferment F ER M EH N T
+fermenta F ER M EH N T AH
+fermenta's F ER M EH N T AH Z
+fermenta's(2) F ER M EH N AH Z
+fermenta(2) F ER M EH N AH
+fermentation F ER M AH N T EY SH AH N
+fermented F ER M EH N T AH D
+fermenting F ER M EH N T IH NG
+ferments F ER M EH N T S
+fermi F ER M IY
+fermilab F ER M IH L AE B
+fermin F ER M IH N
+fermium F EH R M IY AH M
+fermoyle F ER M OY L
+fern F ER N
+fernald F ER N AA L D
+fernald(2) F EH R N AA L D
+fernand F ER N AE N D
+fernand(2) F ER N AA N
+fernand(3) F ER N AA N D
+fernanda F ER N AE N D AH
+fernanda(2) F ER N AA N D AH
+fernandes F ER N AA N D EH S
+fernandes(2) F ER N AE N D EH S
+fernandez F ER N AE N D EH Z
+fernandez(2) F EH R N AE N D EH Z
+fernandez(3) F ER N AA N D EH Z
+fernandez(4) F EH R N AA N D EH Z
+fernandina F ER N AH N D IY N AH
+fernando F ER N AE N D OW
+fernando's F ER N AE N D OW Z
+fernando's(2) F ER N AA N D OW Z
+fernando(2) F ER N AA N D OW
+fernao F ER N AW
+fernau F ER N AW
+fernbank F ER N B AE NG K
+fernberg F ER N B ER G
+ferndale F ER N D EY L
+ferner F ER N ER
+fernery F ER N ER IY
+fernholz F ER N HH OW L Z
+fernicola F ER N IY K OW L AH
+fernlike F ER N L AY K
+ferns F ER N Z
+fernstrom F ER N S T R AH M
+fero F EH R OW
+ferocious F ER OW SH AH S
+ferociously F ER OW SH IH S L IY
+ferocity F ER AA S AH T IY
+ferol F EH R AH L
+ferra F EH R AH
+ferraioli F EH R AY OW L IY
+ferrall F EH R AH L
+ferran F EH R AH N
+ferrand F EH R AH N D
+ferrandino F ER AA N D IY N OW
+ferrando F EH R AE N D OW
+ferrant F EH R AH N T
+ferrante F ER AA N T IY
+ferranti F EH R AE N T IY
+ferranti(2) F EH R AE N IY
+ferrar F ER AA R
+ferrara F ER AA R AH
+ferrari F ER AA R IY
+ferrario F ER AA R IY OW
+ferraris F ER AA R IH S
+ferraro F ER AA R OW
+ferraro's F ER AA R OW Z
+ferre F EH R
+ferrebee F EH R IH B IY
+ferree F ER IY
+ferreira F EH R EY R AH
+ferreiro F EH R EH R OW
+ferrel F EH R EH L
+ferrell F EH R IH L
+ferrelli F ER EH L IY
+ferren F EH R AH N
+ferrency F EH R EH N S IY
+ferrentino F ER EH N T IY N OW
+ferrer F EH R ER
+ferrera F EH R EH R AH
+ferreri F ER EH R IY
+ferrero F EH R EH R OW
+ferret F EH R AH T
+ferreted F EH R AH T AH D
+ferreted(2) F EH R AH T IH D
+ferreting F EH R AH T IH NG
+ferrets F EH R AH T S
+ferretti F ER EH T IY
+ferri F EH R IY
+ferrick F EH R IH K
+ferrie F EH R IY
+ferried F EH R IY D
+ferrier F EH R IY ER
+ferriera F ER IH R AH
+ferriers F EH R IY ER Z
+ferries F EH R IY Z
+ferrigno F ER IY G N OW
+ferrill F EH R IY L
+ferrin F EH R IH N
+ferrington F EH R IH NG T AH N
+ferrini F ER IY N IY
+ferris F EH R IH S
+ferriss F EH R IH S IH Z
+ferrite F EH R AY T
+ferriter F EH R AY T ER
+ferriz F EH R IH Z
+ferro F EH R OW
+ferrochrome F EH R AH K R OW M
+ferrofluidic F EH R OW F L UW IH D IH K
+ferrofluidics F EH R OW F L UW IH D IH K S
+ferromagnet F EH R OW M AE G N AH T
+ferromagnetic F EH R OW M AE G N EH T IH K
+ferromagnetism F EH R OW M AE G N AH T IH Z AH M
+ferron F EH R AH N
+ferrone F ER OW N IY
+ferronickel F EH R AH N IH K AH L
+ferrotype F EH R AH T AY P
+ferrous F EH R AH S
+ferrucci F ER UW CH IY
+ferruzzi F EH R UW Z IY
+ferruzzi's F ER UW Z IY Z
+ferry F EH R IY
+ferry's F EH R IY Z
+ferryboat F EH R IY B OW T
+ferryboats F EH R IY B OW T S
+ferrying F EH R IY IH NG
+ferryman F EH R IY M AH N
+fertig F ER T IH G
+fertile F ER T AH L
+fertile(2) F ER T AY L
+fertility F ER T IH L AH T IY
+fertility(2) F ER T IH L IH T IY
+fertilization F ER T AH L IH Z EY SH AH N
+fertilize F ER T AH L AY Z
+fertilized F ER T AH L AY Z D
+fertilizer F ER T AH L AY Z ER
+fertilizers F ER T AH L AY Z ER Z
+fertilizes F ER T AH L AY Z IH Z
+fertilizing F ER T AH L AY Z IH NG
+fertitta F ER T IY T AH
+fertlow F ER T L OW
+ferullo F ER UW L OW
+fervent F ER V AH N T
+fervently F ER V AH N T L IY
+fervid F ER V AH D
+fervor F ER V ER
+fery F EH R IY
+feschbach F EH SH B AA K
+fescue F EH S K Y UW
+feser F IY Z ER
+feshbach F EH SH B AA K
+fesler F EH S AH L ER
+fesler(2) F EH S L ER
+fesmire F EH S M AY R
+fesperman F EH S P ER M AH N
+fess F EH S
+fessed F EH S T
+fessel F EH S AH L
+fessenden F EH S AH N D AH N
+fessler F EH S L ER
+fest F EH S T
+festa F EH S T AH
+fester F EH S T ER
+festered F EH S T ER D
+festering F EH S T ER IH NG
+festiva F EH S T IY V AH
+festival F EH S T AH V AH L
+festival's F EH S T IH V AH L Z
+festival(2) F EH S T IH V AH L
+festivals F EH S T AH V AH L Z
+festivals(2) F EH S T IH V AH L Z
+festive F EH S T IH V
+festivities F EH S T IH V AH T IY Z
+festivity F EH S T IH V AH T IY
+festoon F EH S T UW N
+festooned F EH S T UW N D
+fests F EH S T S
+fests(2) F EH S S
+fests(3) F EH S
+festspielhaus F EH S T S P IY L HH AW S
+festus F EH S T AH S
+fetal F IY T AH L
+fetch F EH CH
+fetched F EH CH T
+fetches F EH CH IH Z
+fetching F EH CH IH NG
+fete F EY T
+feted F EY T IH D
+fetherolf F EH TH ER OW L F
+fetherston F EH TH ER S T AH N
+fetid F EH T AH D
+fetish F EH T IH SH
+fetishism F EH T IH SH IH Z AH M
+fetishist F EH T IH SH IH S T
+fetishist(2) F EH T IH SH AH S T
+fetishists F EH T IH SH AH S T S
+fetishists(2) F EH T IH SH IH S T S
+fetishists(3) F EH T IH SH IH S S
+fetishists(4) F EH T IH SH IH S
+fetner F EH T N ER
+fetrow F EH T R OW
+fetsch F EH CH
+fetsko F EH T S K OW
+fett F EH T
+fette F EH T
+fetter F EH T ER
+fettered F EH T ER D
+fetterhoff F EH T ER HH AO F
+fetterly F EH T ER L IY
+fetterman F EH T ER M AH N
+fetterolf F EH T ER OW L F
+fetters F EH T ER Z
+fettes F EH T S
+fettig F EH T IH G
+fetting F EH T IH NG
+fettuccine F EH T AH CH IY N IY
+fetty F EH T IY
+fetus F IY T AH S
+fetuses F IY T AH S IH Z
+fetz F EH T S
+fetzer F EH T S ER
+feucht F OY K T
+feud F Y UW D
+feudal F Y UW D AH L
+feudalism F Y UW D AH L IH Z AH M
+feudalistic F Y UW D AH L IH S T IH K
+feuded F Y UW D IH D
+feuding F Y UW D IH NG
+feuds F Y UW D Z
+feuer F Y UW ER
+feuerborn F OY ER B ER N
+feuerman F Y UW ER M AH N
+feuerstein F Y UW ER S T IY N
+feuerstein(2) F Y UW ER S T AY N
+feulner F OY L N ER
+feur F ER
+feustel F OY S T AH L
+feutz F Y UW T S
+fever F IY V ER
+fevered F IY V ER D
+feverfew F IY V ER F Y UW
+feverfews F IY V ER F Y UW Z
+feverish F IY V ER IH SH
+feverishly F EH V ER IH SH L IY
+fevers F IY V ER Z
+few F Y UW
+fewell F EH W EH L
+fewer F Y UW ER
+fewest F Y UW AH S T
+fey F EY
+feyen F AY N
+feynman F EY N M AH N
+fez F EH Z
+fi F AY
+fi(2) F IY
+fiacco F IY AA K OW
+fiala F IY AA L AH
+fialkowski F IY AH L K AO F S K IY
+fiance F IY AA N S EY
+fiancee F IY AE N S IY
+fianna F IY AE N AH
+fiasco F IY AE S K OW
+fiascos F IY AE S K OW Z
+fiat F AY AE T
+fiat's F IY AE T S
+fiato F IY AE T OW
+fiato(2) F Y AE T OW
+fiber F AY B ER
+fiber's F AY B ER Z
+fiberboard F AY B ER B AO R D
+fiberglas F AY B ER G L AE S
+fiberglass F AY B ER G L AE S
+fiberoptic F AY B ER AA P T IH K
+fibers F AY B ER Z
+fiberweb F AY B ER W EH B
+fibonacci F IH B AH N AA CH IY
+fibre F AY B ER
+fibreboard F AY B ER B AO R D
+fibrile F AY B R IH L
+fibriles F AY B R IH L Z
+fibrillation F IH B R IH L EY SH AH N
+fibrin F AY B R AH N
+fibroid F AY B R OY D
+fibroids F AY B R OY D Z
+fibronic F IH B R AA N IH K
+fibronics F IH B R AA N IH K S
+fibrosis F AY B R OW S AH S
+fibrous F AY B R AH S
+fibula F IH B Y AH L AH
+fica F AY K AH
+ficarra F IY K AA R AH
+ficarra(2) F IH K AA R AH
+ficco F IH K OW
+ficek F IH S IH K
+fichera F IY K EH R AH
+fichtel F IH CH T EH L
+fichter F IH K T ER
+fichtner F IH K T N ER
+fichus F IH CH AH S
+ficials F IH SH AH L Z
+fick F IH K
+ficke F IH K
+fickel F IH K AH L
+ficken F IH K AH N
+ficker F IH K ER
+fickes F IH K S
+fickett F IH K IH T
+fickle F IH K AH L
+fickleness F IH K AH L N AH S
+ficklin F IH K L IH N
+fickling F IH K L IH NG
+fico F IY K OW
+ficom F IH K AA M
+ficorca F IH K AO R K AH
+fiction F IH K SH AH N
+fictional F IH K SH AH N AH L
+fictionalize F IH K SH AH N AH L AY Z
+fictionalized F IH K SH AH N AH L AY Z D
+fictions F IH K SH AH N Z
+fictitious F IH K T IH SH AH S
+fidalgo F IY D AA L G OW
+fidata F IH D AA T AH
+fidder F IH D ER
+fiddle F IH D AH L
+fiddled F IH D AH L D
+fiddler F IH D AH L ER
+fiddler's F IH D AH L ER Z
+fiddler's(2) F IH D L ER Z
+fiddler(2) F IH D L ER
+fiddlers F IH D AH L ER Z
+fiddlers(2) F IH D L ER Z
+fiddles F IH D AH L Z
+fiddling F IH D L IH NG
+fide F AY D
+fidel F IH D EH L
+fidel's F IH D EH L Z
+fidelco F IH D EH L K OW
+fidelcor F IH D AH L K AO R
+fidelia F IH D IY L Y AH
+fidelities F AH D EH L AH T IY Z
+fidelity F AH D EH L AH T IY
+fidelity's F AH D EH L AH T IY Z
+fidelity(2) F AY D EH L AH T IY
+fidenas F IH D IH N AH S
+fides F AY D Z
+fidget F IH JH IH T
+fidgeting F IH JH AH T IH NG
+fidler F AY D AH L ER
+fidler(2) F AY D L ER
+fido F AY D OW
+fidora F AH D AO R AH
+fidora's F AH D AO R AH Z
+fiduciares F IH D UW S IY EH R Z
+fiduciares(2) F IH D UW S IY EH R IY Z
+fiduciaries F IH D UW SH IY EH R IY Z
+fiduciary F AH D UW SH IY EH R IY
+fiebelkorn F IY B IH L K ER N
+fieber F IY B ER
+fiebig F IY B IH G
+fiebiger F IY B IH G ER
+fiechter F IH K T ER
+fiedler F IY D L ER
+fiedler's F IY D L ER Z
+fief F IY F
+fiefdom F IY F D AH M
+fiefdoms F IY F D AH M Z
+fiefs F IY F S
+fiegel F IY G AH L
+fieger F IY G ER
+fieger's F IY G ER Z
+fiel F IY L
+field F IY L D
+field's F IY L D Z
+fieldcrest F IY L D K R EH S T
+fielded F IY L D IH D
+fielden F IY L D AH N
+fielder F IY L D ER
+fielder's F IY L D ER Z
+fielders F IY L D ER Z
+fieldhouse F IY L D HH AW S
+fielding F IY L D IH NG
+fields F IY L D Z
+fields' F IY L D Z
+fieldwork F IY L D W ER K
+fiend F IY N D
+fiendish F IY N D IH SH
+fiends F IY N D Z
+fiene F IY N
+fiennes F IY EH N EH S
+fiennes(2) F Y EH N EH S
+fier F IH R
+fierce F IH R S
+fiercely F IH R S L IY
+fiercer F IH R S ER
+fiercest F IH R S AH S T
+fierman F IH R M AH N
+fiero F IY R OW
+fieros F IY EH R OW S
+fierro F IH R OW
+fierros F IH R OW Z
+fiers F IY R Z
+fierst F IY R S T
+fierstein F IY R S T IY N
+fierstein(2) F IY R S T AY N
+fiery F AY ER IY
+fieser F IY S ER
+fiest F IY IH S T
+fiesta F IY EH S T AH
+fife F AY F
+fifer F AY F ER
+fifi F IY F IY
+fifield F IH F IY L D
+fiftee F IH F T IY
+fifteen F IH F T IY N
+fifteens F IH F T IY N Z
+fifteenth F IH F T IY N TH
+fifth F IH F TH
+fifth(2) F IH TH
+fifths F IH F TH S
+fifths(2) F IH F S
+fifties F IH F T IY Z
+fiftieth F IH F T IY IH TH
+fifty F IH F T IY
+fifty's F IH F T IY Z
+fig F IH G
+figallo F IH G AA L OW
+figaro F IH G ER OW
+figaroa F IH G ER OW AH
+figaroa's F IH G ER OW AH Z
+figel F IH G AH L
+figg F IH G
+figge F IH G
+figgie F IH G IY
+figgie's F IH G IY Z
+figgins F IH G IH N Z
+figgs F IH G Z
+fight F AY T
+fight's F AY T Z
+fighter F AY T ER
+fighter's F AY T ER Z
+fighters F AY T ER Z
+fighters' F AY T ER Z
+fightin' F AY T IH N
+fighting F AY T IH NG
+fighting's F AY T IH NG Z
+fightings F AY T IH NG Z
+fightmaster F AY T M AE S T ER
+fights F AY T S
+figler F AY G AH L ER
+figler(2) F IH G L ER
+figley F IH G L IY
+figment F IH G M IH N T
+figments F IH G M IH N T S
+figone F IH G AH N
+figs F IH G Z
+figueira F IY G EH R AH
+figueiredo F IY G ER EY D OW
+figueras F IY G EH R AA Z
+figueredo F IY G EH R EY D OW
+figueroa F IY G EH R OW AH
+figura F IY G UH R AH
+figuration F IH G Y ER EY SH AH N
+figurative F IH G Y ER AH T IH V
+figuratively F IH G Y UH R AH T IH V L IY
+figure F IH G Y ER
+figure's F IH G Y ER Z
+figured F IH G Y ER D
+figurehead F IH G Y ER HH EH D
+figures F IH G Y ER Z
+figurine F IH G Y ER IY N
+figurines F IH G Y ER IY N Z
+figuring F IH G Y ER IH NG
+figurski F IH G ER S K IY
+fiji F IY JH IY
+fiji's F IY JH IY Z
+fijian F IY JH IY AH N
+fijians F IH JH IY AH N Z
+fike F AY K
+fikes F AY K S
+fil F IH L
+fila F AY L AH
+filament F IH L AH M AH N T
+filaments F IH L AH M AH N T S
+filbert F IH L B ER T
+filbert's F IH L B ER T S
+filberts F IH L B ER T S
+filbrick F IH L B R IH K
+filby F IH L B IY
+filch F IH L CH
+filched F IH L CH T
+fildes F IH L D Z
+file F AY L
+filed F AY L D
+filegate F AY L G EY T
+filene F IH L IY N
+filene's F IH L IY N Z
+filenet F AY L N EH T
+filer F AY L ER
+filers F AY L ER Z
+files F AY L Z
+filet F IH L EY
+filets F IH L EY Z
+filial F IH L IY AH L
+filibuster F IH L AH B AH S T ER
+filibustered F IH L AH B AH S T ER D
+filibustering F IH L AH B AH S T ER IH NG
+filibusters F IH L AH B AH S T ER Z
+filice F IY L IH S
+filigree F IH L AH G R IY
+filigrees F IH L AH G R IY Z
+filing F AY L IH NG
+filings F AY L IH NG Z
+filinski F IH L IH N S K IY
+filion F IH L Y AH N
+filip F IH L IH P
+filipa F IY L IY P AH
+filipek F IH L IH P IH K
+filipiak F IH L IH P IY AE K
+filipino F IH L AH P IY N OW
+filipinos F IH L AH P IY N OW Z
+filipkowski F IH L IH P K AO F S K IY
+filipovic F IH L IH P OW V IH K
+filipowicz F IH L IH P AH V IH CH
+filippelli F IY L IY P EH L IY
+filippello F IY L IH P EH L OW
+filippi F IH L IH P IY
+filippini F IY L IY P IY N IY
+filippo F IH L IY P OW
+filippone F IH L IH P OW N
+filipski F IH L IH P S K IY
+filkins F IH L K IH N Z
+fill F IH L
+fill-a-buster F IH L AH B AH S T ER
+filla F IH L AH
+fillauer F IH L AW ER
+filled F IH L D
+filler F IH L ER
+fillers F IH L ER Z
+fillet F AH L EY
+filleted F IH L AH T IH D
+filleted(2) F AH L EY D
+fillets F IH L IH T S
+filley F IH L IY
+fillibuster F IH L AH B AH S T ER
+fillibusters F IH L AH B AH S T ER Z
+fillies F IH L IY Z
+filling F IH L IH NG
+fillingame F IY L IH NG G AA M IY
+fillinger F IH L IH NG ER
+fillingham F IH L IH NG HH AE M
+fillingim F IH L IH NG G IH M
+fillings F IH L IH NG Z
+fillion F IH L Y AH N
+fillip F IH L AH P
+fillman F IH L M AH N
+fillmore F IH L M AO R
+fills F IH L Z
+filly F IH L IY
+film F IH L M
+film's F IH L M Z
+filma F IH L M AH
+filmed F IH L M D
+filmer F IH L M ER
+filming F IH L M IH NG
+filmless F IH L M L AH S
+filmmaker F IH L M EY K ER
+filmmaker's F IH L M EY K ER Z
+filmmakers F IH L M EY K ER Z
+filmmaking F IH L M EY K IH NG
+filmore F IH L M AO R
+films F IH L M Z
+filo F IY L OW
+filofax F IH L OW F AE K S
+filofax(2) F AY L OW F AE K S
+filomena F IH L AH M IY N AH
+filosa F IY L OW S AH
+filsinger F IH L S IH NG ER
+filson F IH L S AH N
+filter F IH L T ER
+filtered F IH L T ER D
+filtering F IH L T ER IH NG
+filters F IH L T ER Z
+filtertek F IH L T ER T EH K
+filth F IH L TH
+filthy F IH L TH IY
+filtration F IH L T R EY SH AH N
+filtrenelli F IH L T R AH N EH L IY
+filtrol F IH L T R AA L
+filyaw F IH L IY AA V
+filyaw(2) F IH L Y AW
+fima F IY M AH
+fimbres F IH M B ER Z
+fin F IH N
+fina F AY N AH
+finagle F IH N AH G AH L
+finagle(2) F IH N EY G AH L
+finagler F AH N EY G L ER
+final F AY N AH L
+finalco F IH N AE L K OW
+finale F AH N AE L IY
+finalist F AY N AH L IH S T
+finalists F AY N AH L AH S T S
+finalists(2) F AY N AH L AH S S
+finalists(3) F AY N AH L AH S
+finality F AY N AE L AH T IY
+finalize F AY N AH L AY Z
+finalized F AY N AH L AY Z D
+finalizes F AY N AH L AY Z IH Z
+finalizing F AY N AH L AY Z IH NG
+finally F AY N AH L IY
+finals F AY N AH L Z
+finamore F IH N AH M AO R
+finan F IH N AH N
+finance F AH N AE N S
+finance(2) F IH N AE N S
+finance(3) F AY N AE N S
+financed F IH N AE N S T
+financed(2) F AY N AE N S T
+financement F IH N AE N S M AH N T
+financement(2) F AY N AE N S M AH N T
+financer F AY N AE N S ER
+financer(2) F IH N AE N S ER
+finances F IH N AE N S IH Z
+finances(2) F AY N AE N S IH Z
+financial F AH N AE N SH AH L
+financial's F AY N AE N SH AH L Z
+financial's(2) F IH N AE N SH AH L Z
+financial(2) F IH N AE N SH AH L
+financial(3) F AY N AE N SH AH L
+financially F AH N AE N SH AH L IY
+financially(2) F IH N AE N SH AH L IY
+financially(3) F AY N AE N SH AH L IY
+financials F AY N AE N SH AH L Z
+financials(2) F IH N AE N SH AH L Z
+financials(3) F AH N AE N SH AH L Z
+financier F IH N AH N S IH R
+financier(2) F AY N AE N S IH R
+financiera F IH N AE N S IY EH R AH
+financiere F IH N AE N S IH R
+financiero F IH N AE N S IY EH R OW
+financiers F IH N AH N S IH R Z
+financing F AH N AE N S IH NG
+financing(2) F IH N AE N S IH NG
+financing(3) F AY N AE N S IH NG
+financings F AH N AE N S IH NG Z
+financings(2) F IH N AE N S IH NG Z
+financings(3) F AY N AE N S IH NG Z
+financo F IH N AE NG K OW
+finanz F IH N AE N Z
+finanza F IH N AE N Z AH
+finanziaria F IH N AE N Z IY EH R IY AH
+finanziario F IH N AE N Z IY EH R IY OW
+finarte F IH N AA R T
+finazzo F IY N AA Z OW
+finbar F IH N B AA R
+finbar's F IH N B AA R Z
+finberg F IH N B ER G
+fincannon F IH N K AH N AA N
+fincannon(2) F IH N K AE N AH N
+finch F IH N CH
+fincham F IH N CH AH M
+fincher F IH N CH ER
+finches F IH N CH IH Z
+finchum F IH N K AH M
+finck F IH NG K
+fincke F IH NG K
+finckle F IH NG K AH L
+find F AY N D
+finder F AY N D ER
+finder's F AY N D ER Z
+finders F AY N D ER Z
+finding F AY N D IH NG
+findings F AY N D IH NG Z
+findlay F IH N D L IY
+findler F IH N D L ER
+findley F IH N D L IY
+findling F IH N D AH L IH NG
+findling(2) F IH N D L IH NG
+finds F AY N D Z
+fine F AY N
+fineberg F AY N B ER G
+fined F AY N D
+finefrock F AY N F R AA K
+finegan F IH N IH G AE N
+finegold F AY N G OW L D
+finella F IH N EH L AH
+finelli F IH N EH L IY
+finely F AY N L IY
+fineman F AY N M AH N
+finer F AY N ER
+fineran F IH N ER AE N
+finerty F IH N ER T IY
+finery F AY N ER IY
+fines F AY N Z
+finesse F IH N EH S
+finessed F IH N EH S T
+finest F AY N AH S T
+finestone F AY N S T OW N
+finevest F AY N V EH S T
+finex F IH N EH K S
+finfrock F IH N F R AA K
+finger F IH NG G ER
+fingerboard F IH NG G ER B AO R D
+fingered F IH NG G ER D
+fingerhut F IH NG G ER HH AH T
+fingering F IH NG G ER IH NG
+fingernail F IH NG G ER N EY L
+fingernails F IH NG G ER N EY L Z
+fingerpaint F IH NG G ER P EY N T
+fingerpainted F IH NG G ER P EY N T IH D
+fingerpainted(2) F IH NG G ER P EY N IH D
+fingerpointing F IH NG G ER P OY N T IH NG
+fingerprint F IH NG G ER P R IH N T
+fingerprinted F IH NG G ER P R IH N T IH D
+fingerprinting F IH NG G ER P R IH N T IH NG
+fingerprints F IH NG G ER P R IH N T S
+fingers F IH NG G ER Z
+fingertip F IH NG G ER T IH P
+fingertips F IH NG G ER T IH P S
+fini F IY N IY
+finian F IH N IY AH N
+finian's F IH N IY AH N Z
+finicky F IH N AH K IY
+finigan F IH N IH G AH N
+fining F AY N IH NG
+fininvest F IH N IH N V EH S T
+fininvest's F IH N IH N V EH S T S
+finish F IH N IH SH
+finished F IH N IH SH T
+finisher F IH N IH SH ER
+finishers F IH N IH SH ER Z
+finishes F IH N IH SH IH Z
+finishing F IH N IH SH IH NG
+finite F AY N AY T
+fink F IH NG K
+fink's F IH NG K S
+finkbeiner F IH NG K B AY N ER
+finkbiner F IH NG K B AY N ER
+finke F IH NG K
+finkel F IH NG K AH L
+finkelman F IH NG K AH L M AH N
+finkelson F IH NG K AH L S AH N
+finkelstein F IH NG K AH L S T IY N
+finkelstein's F IH NG K AH L S T IY N Z
+finkelstein's(2) F IH NG K AH L S T AY N Z
+finkelstein(2) F IH NG K AH L S T AY N
+finken F IH NG K AH N
+finkenbinder F IH NG K IH N B IH N D ER
+finkielstain F IH NG K IY L S T IH N
+finkielstain(2) F IH NG K IY L S T EY N
+finkle F IH NG K AH L
+finklea F IH NG K L IY AH
+finkler F IH NG K L ER
+finkley F IH NG K L IY
+finks F IH NG K S
+finland F IH N L AE N D
+finland's F IH N L AH N D Z
+finland(2) F IH N L AH N D
+finlandization F IH N L AE N D IH Z EY SH AH N
+finlay F IH N L IY
+finlayson F IH N L IY S AH N
+finlets F IH N L AH T S
+finley F IH N L IY
+finley's F IH N L IY Z
+finmeccanica F IH N M AH K AE N IH K AH
+finn F IH N
+finn's F IH N Z
+finnair F IH N EH R
+finnan F IH N AH N
+finne F IH N
+finnegan F IH N AH G AH N
+finnell F IH N AH L
+finneran F IH N ER AE N
+finnerty F IH N ER T IY
+finney F IH N IY
+finnick F IH N IH K
+finnicum F IH N IH K AH M
+finnie F IH N IY
+finnigan F IH N IH G AH N
+finning F IH N IH NG
+finnish F IH N IH SH
+finns F IH N Z
+fino F IY N OW
+finocchiaro F IY N OW K IY AA R OW
+finocchio F IY N OW K IY OW
+fins F IH N Z
+finscher F IH N SH ER
+finsider F IH N S AY D ER
+finsider's F IH N S AY D ER Z
+finstad F IH N S T AH D
+finster F IH N S T ER
+finstrom F IH N S T R AH M
+finton F IH N T AH N
+finucane F IH N AH K EY N
+finunc F IH N AH NG K
+finzel F IH N Z AH L
+fiola F IY OW L AH
+fiona F IY OW N AH
+fioravanti F IY AO R AA V AA N T IY
+fiore F IY AO R IY
+fiorella F IY AO R EH L AH
+fiorelli F IY AO R EH L IY
+fiorello F IY AO R EH L OW
+fiorentino F IY AO R EH N T IY N OW
+fiorenza F IY AO R EH N Z AH
+fioretti F IY AO R EH T IY
+fiori F IY AO R IY
+fiorillo F IY AO R IH L OW
+fiorina F IY AO R IY N AH
+fiorini F IY AO R IY N IY
+fiorino F IY AO R IY N OW
+fiorito F IY AO R IY T OW
+fiorucci F IY AO R UW CH IY
+fipple F IH P AH L
+fipps F IH P S
+fir F ER
+fire F AY ER
+fire's F AY ER Z
+fire(2) F AY R
+firearm F AY ER AA R M
+firearm(2) F AY R AA R M
+firearms F AY ER AA R M Z
+firearms(2) F AY R AA R M Z
+fireball F AY ER B AO L
+fireball(2) F AY R B AO L
+fireballs F AY ER B AO L Z
+fireballs(2) F AY R B AO L Z
+firebaugh F AY R B AO
+firebird F AY ER B ER D
+firebirds F AY ER B ER D Z
+firebomb F AY ER B AA M
+firebomb(2) F AY R B AA M
+firebombed F AY R B AA M D
+firebombing F AY ER B AA M IH NG
+firebombs F AY R B AA M Z
+firebrand F AY ER B R AE N D
+firebrands F AY ER B R AE N D Z
+firebrick F AY ER B R IH K
+firebug F AY ER B AH G
+firebush F AY ER B UH SH
+firebush's F AY R B UH SH IH Z
+firecracker F AY ER K R AE K ER
+firecrackers F AY ER K R AE K ER Z
+fired F AY ER D
+firedamp F AY ER D AE M P
+firefight F AY R F AY T
+firefighter F AY R F AY T ER
+firefighters F AY ER F AY T ER Z
+firefighting F AY R F AY T IH NG
+firefights F AY R F AY T S
+fireflies F AY ER F L AY Z
+firefly F AY ER F L AY
+firehouse F AY ER HH AW S
+firehouses F AY ER HH AW S IH Z
+fireman F AY R M AH N
+fireman's F AY R M AH N Z
+firemen F AY R M AH N
+firenza F IH R EH N Z AH
+firenzas F ER EH N Z AH Z
+fireplace F AY ER P L EY S
+fireplaces F AY ER P L EY S AH Z
+fireplaces(2) F AY R P L EY S IH Z
+firepower F AY R P AW ER
+fireproof F AY ER P R UW F
+fireproofing F AY ER P R UW F IH NG
+fires F AY ER Z
+fires(2) F AY R Z
+fireside F AY ER S AY D
+firesign F AY ER S AY N
+firesign's F AY ER S AY N Z
+firestine F AY R S T IY N IY
+firestone F AY R S T OW N
+firestone's F AY R S T OW N Z
+firestorm F AY R S T AO R M
+firewall F AY R W AA L
+fireweed F AY ER W IY D
+firewood F AY ER W UH D
+firewood(2) F AY R W UH D
+firework F AY R W ER K
+fireworks F AY R W ER K S
+firfer F ER F ER
+firing F AY R IH NG
+firing(2) F AY ER R IH NG
+firings F AY R IH NG Z
+firings(2) F AY ER R IH NG Z
+firino F IH R IY N OW
+firkins F ER K IH N Z
+firkus F ER K IH S
+firm F ER M
+firm's F ER M Z
+firma F ER M AH
+firman F ER M AH N
+firmans F ER M AH N Z
+firmed F ER M D
+firmer F ER M ER
+firmest F ER M AH S T
+firmin F ER M IH N
+firming F ER M IH NG
+firmly F ER M L IY
+firmness F ER M N AH S
+firms F ER M Z
+firms' F ER M Z
+firpo F IH R P OW
+firs F ER Z
+first F ER S T
+first's F ER S T S
+firstar F ER S T AA R
+firstborn F ER S T B AO R N
+firstfed F ER S T F EH D
+firsthand F ER S T HH AE N D
+firsthand(2) F ER S HH AE N D
+firstier F ER S T Y ER
+firstier(2) F ER S T IY ER
+firstly F ER S T L IY
+firsts F ER S T S
+firsts(2) F ER S S
+firsts(3) F ER S
+firstsouth F ER S T S AW TH
+firth F ER TH
+firzite F ER Z AY T
+fis F IH S
+fisc F IH S K
+fiscal F IH S K AH L
+fiscally F IH S K AH L IY
+fisch F IH SH
+fischbach F IH SH B AA K
+fischbach's F IH SH B AA K S
+fischbein F IH SH B AY N
+fischel F IH SH AH L
+fischer F IH SH ER
+fischer's F IH SH ER Z
+fischetti F IY S K EH T IY
+fischl F IH S K AH L
+fischler F IH SH AH L ER
+fischler(2) F IH SH L ER
+fischman F IH SH M AH N
+fiscus F IH S K AH S
+fiser F AY Z ER
+fiserv F IH S ER V
+fisette F IH S EH T
+fish F IH SH
+fish's F IH SH IH Z
+fishbach F IH SH B AH K
+fishback F IH SH B AE K
+fishbaine F IH SH B EY N
+fishbaugh F IH SH B AO
+fishbeck F IH SH B EH K
+fishbein F IH SH B AY N
+fishbowl F IH SH B OW L
+fishburn F IH SH B ER N
+fishburne F IH SH B ER N
+fisheater F IH SH IY T ER
+fisheaters F IH SH IY T ER Z
+fished F IH SH T
+fishel F IH SH AH L
+fishell F IH SH AH L
+fisher F IH SH ER
+fisher's F IH SH ER Z
+fisheries F IH SH ER IY Z
+fisherman F IH SH ER M AE N
+fisherman's F IH SH ER M AH N Z
+fisherman(2) F IH SH ER M AH N
+fishermen F IH SH ER M IH N
+fishers F IH SH ER Z
+fishery F IH SH ER IY
+fishes F IH SH AH Z
+fishes(2) F IH SH IH Z
+fishing F IH SH IH NG
+fishkill F IH SH K IH L
+fishkin F IH SH K IH N
+fishlow F IH SH L OW
+fishman F IH SH M AE N
+fishman(2) F IH SH M AH N
+fishmonger F IH SH M AA NG G ER
+fishy F IH SH IY
+fisk F IH S K
+fisk's F IH S K S
+fiske F IH S K
+fiske's F IH S K S
+fisler F IH S AH L ER
+fisler(2) F IH S L ER
+fisons F AY Z AH N Z
+fiss F IH S
+fissel F IH S AH L
+fissell F IH S AH L
+fissile F IH S AH L
+fission F IH SH AH N
+fissionable F IH SH AH N AH B AH L
+fissure F IH SH ER
+fissured F IH SH ER D
+fissures F IH SH ER Z
+fist F IH S T
+fisted F IH S T IH D
+fister F IH S T ER
+fistful F IH S T F AH L
+fisticuff F IH S T IH K AH F
+fisticuffs F IH S T IH K AH F S
+fists F IH S T S
+fit F IH T
+fitak F IH T AE K
+fitch F IH CH
+fitchburg F IH CH B ER G
+fitchett F IH CH IH T
+fite F AY T
+fites F AY T S
+fitful F IH T F AH L
+fitfully F IH T F AH L IY
+fithe F IH TH
+fithian F IH TH IY AH N
+fitness F IH T N AH S
+fits F IH T S
+fitswater F IH T S W AO T ER
+fitt F IH T
+fitted F IH T AH D
+fitted(2) F IH T IH D
+fitter F IH T ER
+fitterer F IH T ER ER
+fittest F IH T AH S T
+fitting F IH T IH NG
+fittingly F IH T IH NG L IY
+fittings F IH T IH NG Z
+fittipaldi F IH T IH P AA L D IY
+fitton F IH T AH N
+fittro F IH T R OW
+fitts F IH T S
+fitz F IH T S
+fitzco F IH T S K OW
+fitzer F IH T S ER
+fitzgerald F IH T S JH EH R AH L D
+fitzgerald's F IH T S JH EH R AH L D Z
+fitzgibbon F IH T S JH IH B AH N
+fitzgibbons F IH T S JH IH B AH N Z
+fitzharris F IH T S HH AE R IH S
+fitzhenry F IH T S HH EH N ER IY
+fitzhenry(2) F IH T S HH EH N R IY
+fitzhugh F IH T S HH Y UW
+fitzmaurice F IH T S M AO R IH S
+fitzmorris F IH T S M AO R IH S
+fitzner F IH T S N ER
+fitzpatrick F IH T S P AE T R IH K
+fitzroy F IH T S R OY
+fitzsimmons F IH T S IH M AH N Z
+fitzsimons F IH T S IH M AH N Z
+fitzwater F IH T S W AO T ER
+fitzwater's F IH T S W AO T ER Z
+fitzwilliam F IH T S W IH L Y AH M
+fiumara F IY UW M AA R AH
+five F AY V
+5 F AY V
+five's F AY V Z
+fiveash F AY V AE SH
+fivecoat F AY V K OW T
+fivefold F AY V F OW L D
+fives F AY V Z
+fix F IH K S
+fixable F IH K S AH B AH L
+fixate F IH K S EY T
+fixated F IH K S EY T IH D
+fixates F IH K S EY T S
+fixation F IH K S EY SH AH N
+fixative F IH K S AH T IH V
+fixatives F IH K S AH T IH V Z
+fixed F IH K S T
+fixer F IH K S ER
+fixes F IH K S IH Z
+fixing F IH K S IH NG
+fixings F IH K S IH NG Z
+fixler F IH K S L ER
+fixmer F IH K S M ER
+fixture F IH K S CH ER
+fixtures F IH K S CH ER Z
+fizer F AY Z ER
+fizz F IH Z
+fizzle F IH Z AH L
+fizzled F IH Z AH L D
+fizzles F IH Z AH L Z
+fizzling F IH Z AH L IH NG
+fizzling(2) F IH Z L IH NG
+fjeld F Y EH L D
+fjelstad F Y EH L S T AH D
+fjord F Y AO R D
+fjords F Y AO R D Z
+flab F L AE B
+flabbergast F L AE B ER G AE S T
+flabbergasted F L AE B ER G AE S T IH D
+flabby F L AE B IY
+flaccid F L AE K S IH D
+flaccid(2) F L AE K IH D
+flach F L AE CH
+flack F L AE K
+flad F L AE D
+flag F L AE G
+flagday F L AE G D EY
+flagella F L AH JH EH L AH
+flagellate F L AE JH AH L EY T
+flagellated F L AE JH AH L EY T AH D
+flagellum F L AH JH EH L AH M
+flageolet F L AE JH AH L EH T
+flagg F L AE G
+flagged F L AE G D
+flagging F L AE G IH NG
+flagler F L AE G L ER
+flagman F L AE G M AE N
+flagmen F L AE G M EH N
+flagofficer F L AE G AO F AH S ER
+flagofficers F L AE G AO F AH S ER Z
+flagpole F L AE G P OW L
+flagpoles F L AE G P OW L Z
+flagrant F L EY G R AH N T
+flagrantly F L EY G R AH N T L IY
+flags F L AE G Z
+flagship F L AE G SH IH P
+flagships F L AE G SH IH P S
+flagstaff F L AE G S T AE F
+flagstaffs F L AE G S T AE F S
+flagstar F L AE G S T AA R
+flagstone F L AE G S T OW N
+flagstones F L AE G S T OW N Z
+flaharty F L EH R T IY
+flaherty F L EH R T IY
+flahive F L AE HH IH V
+flaig F L EY G
+flail F L EY L
+flailing F L EY L IH NG
+flaim F L EY M
+flair F L EH R
+flak F L AE K
+flake F L EY K
+flakes F L EY K S
+flaking F L EY K IH NG
+flaky F L EY K IY
+flam F L AE M
+flamboyance F L AE M B OY AH N S
+flamboyant F L AE M B OY AH N T
+flamboyantly F L AE M B OY AH N T L IY
+flame F L EY M
+flamed F L EY M D
+flamemaster F L EY M AE S T ER
+flamenco F L AH M EH NG K OW
+flamer F L EY M ER
+flames F L EY M Z
+flaming F L EY M IH NG
+flamingo F L AH M IH NG G OW
+flamingos F L AH M IH NG G OW Z
+flaminian F L AH M IH N IY AH N
+flamm F L AE M
+flammability F L AE M AH B IH L IH T IY
+flammable F L AE M AH B AH L
+flammang F L AE M AH NG
+flammer F L AE M ER
+flammia F L AE M IY AH
+flamson F L AE M S AH N
+flan F L AE N
+flanagan F L AE N AH G AH N
+flanagin F L AE N AH G IH N
+flanary F L AE N ER IY
+flanders F L AE N D ER Z
+flanery F L EY N ER IY
+flange F L AE N JH
+flanges F L AE N JH AH Z
+flanigan F L AE N IH G AH N
+flanigan's F L AE N IH G AH N Z
+flank F L AE NG K
+flanked F L AE NG K T
+flanking F L AE NG K IH NG
+flanks F L AE NG K S
+flann F L AE N
+flanna F L AE N AH
+flannagan F L AE N AH G AH N
+flannel F L AE N AH L
+flanneled F L AE N AH L D
+flannels F L AE N AH L Z
+flannery F L AE N ER IY
+flannigan F L AE N IH G AH N
+flansburg F L AE N S B ER G
+flap F L AE P
+flapdoodle F L AE P D UW D AH L
+flapjack F L AE P JH AE K
+flapjacks F L AE P JH AE K S
+flaplike F L AE P L AY K
+flapped F L AE P T
+flapper F L AE P ER
+flappers F L AE P ER Z
+flapping F L AE P IH NG
+flaps F L AE P S
+flare F L EH R
+flared F L EH R D
+flares F L EH R Z
+flaring F L EH R IH NG
+flaringly F L EH R IH NG L IY
+flasch F L AE SH
+flash F L AE SH
+flash's F L AE SH IH Z
+flashback F L AE SH B AE K
+flashbacks F L AE SH B AE K S
+flashbulb F L AE SH B AH L B
+flashbulbs F L AE SH B AH L B Z
+flashcard F L AE SH K AA R D
+flashcards F L AE SH K AA R D Z
+flashdance F L AE SH D AE N S
+flashdances F L AE SH D AE N S IH Z
+flashed F L AE SH T
+flasher F L AE SH ER
+flasher's F L AE SH ER Z
+flashers F L AE SH ER Z
+flashes F L AE SH IH Z
+flashgun F L AE SH G AH N
+flashguns F L AE SH G AH N Z
+flashier F L AE SH IY ER
+flashiest F L AE SH IY AH S T
+flashing F L AE SH IH NG
+flashlight F L AE SH L AY T
+flashlights F L AE SH L AY T S
+flashpoint F L AE SH P OY N T
+flashpoints F L AE SH P OY N T S
+flashy F L AE SH IY
+flask F L AE S K
+flasks F L AE S K S
+flat F L AE T
+flatau F L AE T AW
+flatbed F L AE T B EH D
+flatboat F L AE T B OW T
+flatbush F L AE T B UH SH
+flaten F L AE T AH N
+flater F L EY T ER
+flatfish F L AE T F IH SH
+flatfishes F L AE T F IH SH IH Z
+flath F L AE TH
+flathead F L AE T HH EH D
+flatheads F L AE T HH EH D Z
+flathers F L AE DH ER Z
+flatland F L AE T L AE N D
+flatlands F L AE T L AE N D Z
+flatley F L AE T L IY
+flatly F L AE T L IY
+flatness F L AE T N AH S
+flato F L AE T OW
+flats F L AE T S
+flatt F L AE T
+flatten F L AE T AH N
+flattened F L AE T AH N D
+flattening F L AE T AH N IH NG
+flattening(2) F L AE T N IH NG
+flatter F L AE T ER
+flattered F L AE T ER D
+flattering F L AE T ER IH NG
+flattery F L AE T ER IY
+flattish F L AE T IH SH
+flatulent F L AE CH AH L AH N T
+flatware F L AE T W EH R
+flatworm F L AE T W ER M
+flaubert F L AW B ER T
+flaugh F L AO
+flaugher F L AO ER
+flaum F L AO M
+flaunt F L AO N T
+flaunted F L AO N T IH D
+flaunting F L AO N T IH NG
+flaunts F L AO N T S
+flavell F L AE V AH L
+flavia F L AE V IY AH
+flavier F L EY V Y ER
+flavier(2) F L AE V Y ER
+flavin F L EY V IH N
+flavio F L AA V IY OW
+flavius F L EY V IY IH S
+flavor F L EY V ER
+flavored F L EY V ER D
+flavorful F L EY V ER F AH L
+flavoring F L EY V ER IH NG
+flavorings F L EY V ER IH NG Z
+flavorist F L EY V ER IH S T
+flavorists F L EY V ER IH S T S
+flavorists(2) F L EY V ER IH S S
+flavorists(3) F L EY V ER IH S
+flavors F L EY V ER Z
+flaw F L AO
+flawed F L AO D
+flawless F L AO L AH S
+flawlessly F L AO L AH S L IY
+flawn F L AO N
+flaws F L AO Z
+flax F L AE K S
+flaxman F L AE K S M AH N
+flaxseed F L AE K S IY D
+flay F L EY
+flayed F L EY D
+flea F L IY
+fleagle F L IY G AH L
+fleas F L IY Z
+fleck F L EH K
+fleckenstein F L EH K AH N S T AY N
+fleckenstein(2) F L EH K AH N S T IY N
+flecks F L EH K S
+fled F L EH D
+fledermaus F L EH D ER M AW S
+fledge F L EH JH
+fledged F L EH JH D
+fledging F L EH JH IH NG
+fledgling F L EH JH L IH NG
+flee F L IY
+fleece F L IY S
+fleeced F L IY S T
+fleeces F L IY S IH Z
+fleecing F L IY S IH NG
+fleecy F L IY S IY
+fleeger F L IY G ER
+fleeing F L IY IH NG
+fleek F L IY K
+fleeman F L IY M AH N
+fleener F L IY N ER
+fleenor F L IY N ER
+fleer F L IH R
+flees F L IY Z
+fleet F L IY T
+fleet's F L IY T S
+fleeting F L IY T IH NG
+fleetingly F L IY T IH NG L IY
+fleets F L IY T S
+fleetwood F L IY T W UH D
+flegal F L IY G AH L
+flegel F L EH G AH L
+fleharty F L EH HH AA R T IY
+fleig F L IY G
+fleisch F L AY SH
+fleischauer F L AY SH AW ER
+fleischer F L AY SH ER
+fleischhacker F L AY SH HH AH K ER
+fleischman F L AY SH M AH N
+fleischmann F L AY SH M AH N
+fleisher F L AY SH ER
+fleishman F L AY SH M AH N
+fleiss F L AY SH
+fleiss' F L AY SH
+fleiss'(2) F L AY S
+fleiss's F L AY SH IH Z
+fleiss's(2) F L AY S IH Z
+fleiss(2) F L AY S
+fleissner F L AY S N ER
+fleitas F L AY T AH S
+fleming F L EH M IH NG
+fleming's F L EH M IH NG Z
+flemings F L EH M IH NG Z
+flemington F L EH M IH NG T AH N
+flemish F L EH M IH SH
+flemister F L EH M IH S T ER
+flemmer F L EH M ER
+flemming F L EH M IH NG
+flemons F L EH M AH N Z
+flener F L IY N ER
+flenner F L EH N ER
+flenniken F L EH N IH K AH N
+flerfu F L ER F UW
+flesch F L EH SH
+flesh F L EH SH
+fleshed F L EH SH T
+flesher F L EH SH ER
+fleshman F L EH SH M AH N
+fleshy F L EH SH IY
+flesner F L EH S N ER
+flessner F L EH S N ER
+fleta F L IY T AH
+fletchall F L EH CH AH L
+fletcher F L EH CH ER
+flett F L EH T
+fleur F L ER
+fleurette F L ER EH T
+fleuri F L ER R IY
+fleuri(2) F L UH R IY
+fleury F L UH R IY
+flew F L UW
+flewellen F L UW EH L AH N
+flewelling F L UW EH L IH NG
+flex F L EH K S
+flexed F L EH K S T
+flexer F L EH K S ER
+flexes F L EH K S IH Z
+flexi F L EH K S IY
+flexibility F L EH K S AH B IH L AH T IY
+flexible F L EH K S AH B AH L
+flexibly F L EH K S AH B L IY
+flexing F L EH K S IH NG
+flexion F L EH K SH AH N
+flexnor F L EH K S N AO R
+flextime F L EH K S T AY M
+flextronic F L EH K S T R AA N IH K
+flextronics F L EH K S T R AA N IH K S
+flicek F L IH CH EH K
+flick F L IH K
+flicker F L IH K ER
+flickered F L IH K ER D
+flickering F L IH K ER IH NG
+flickers F L IH K ER Z
+flicking F L IH K IH NG
+flickinger F L IH K IH NG ER
+flicks F L IH K S
+flied F L AY D
+fliegel F L IY G AH L
+flier F L AY ER
+fliers F L AY ER Z
+flies F L AY Z
+flight F L AY T
+flight's F L AY T S
+flightier F L AY T IY ER
+flightiest F L AY T IY AH S T
+flightless F L AY T L AH S
+flights F L AY T S
+flightsafety F L AY T S EY F T IY
+flighty F L AY T IY
+flim F L IH M
+flimflam F L IH M F L AE M
+flimsiest F L IH M Z IY AH S T
+flimsy F L IH M Z IY
+flinch F L IH N CH
+flinchbaugh F L IH N CH B AO
+flinched F L IH N CH T
+flinching F L IH N CH IH NG
+flinchum F L IH N K AH M
+flinders F L IH N D ER Z
+fling F L IH NG
+flinging F L IH NG IH NG
+flings F L IH NG Z
+flink F L IH NG K
+flinn F L IH N
+flinner F L IH N ER
+flint F L IH N T
+flint's F L IH N T S
+flintlock F L IH N T L AA K
+flintlocks F L IH N T L AA K S
+flintoff F L IH N T AO F
+flints F L IH N T S
+flintstone F L IH N T S T OW N
+flintstones F L IH N T S T OW N Z
+flinty F L IH N T IY
+flip F L IH P
+flippant F L IH P AH N T
+flipped F L IH P T
+flippen F L IH P AH N
+flipper F L IH P ER
+flippers F L IH P ER Z
+flippin F L IH P IH N
+flipping F L IH P IH NG
+flippo F L IH P OW
+flips F L IH P S
+flirt F L ER T
+flirtation F L ER T EY SH AH N
+flirtations F L ER T EY SH AH N Z
+flirtatious F L ER T EY SH AH S
+flirted F L ER T IH D
+flirting F L ER T IH NG
+flirts F L ER T S
+flis F L IH S
+fliss F L IH S
+flit F L IH T
+flitting F L IH T IH NG
+flo F L OW
+float F L OW T
+floated F L OW T AH D
+floated(2) F L OW T IH D
+floater F L OW T ER
+floaters F L OW T ER Z
+floating F L OW T IH NG
+floats F L OW T S
+floc F L AA K
+flock F L AA K
+flocked F L AA K T
+flockhart F L AA K HH AA R T
+flocking F L AA K IH NG
+flocks F L AA K S
+flodin F L OW D IH N
+floe F L OW
+floersheim F L AO R SH AY M
+flog F L AA G
+flogging F L AA G IH NG
+flohr F L AA R
+floirenda F L OY R EH N D AH
+flom F L AA M
+flonorial F L AA N AO R IY AH L
+flood F L AH D
+flooded F L AH D AH D
+flooded(2) F L AH D IH D
+floodgate F L AH D G EY T
+floodgates F L AH D G EY T S
+flooding F L AH D IH NG
+floodlight F L AH D L AY T
+floodlights F L AH D L AY T S
+floodplain F L AH D P L EY N
+floods F L AH D Z
+floodwater F L AH D W AO T ER
+floodwaters F L AH D W AO T ER Z
+flook F L UH K
+floor F L AO R
+floorboard F L AO R B AO R D
+floorboards F L AO R B AO R D Z
+floored F L AO R D
+flooring F L AO R IH NG
+floors F L AO R Z
+flop F L AA P
+flopped F L AA P T
+flopping F L AA P IH NG
+floppy F L AA P IY
+flops F L AA P S
+floptical F L AA P T IH K AH L
+flor F L AO R
+flora F L AO R AH
+florafax F L AO R AH F AE K S
+floral F L AO R AH L
+florally F L AO R AH L IY
+florals F L AO R AH L Z
+florance F L AO R AH N S
+flore F L AO R
+florea F L AO R IY AH
+florek F L AO R IH K
+floren F L AO R AH N
+florence F L AO R AH N S
+florence's F L AO R AH N S IH Z
+florentina F L AO R EH N T IY N AH
+florentine F L AO R AH N T IY N
+florentino F L AO R EH N T IY N OW
+florer F L AO R ER
+flores F L AO R EH Z
+florescue F L AO R AH S K Y UW
+floresheim F L AO R SH AY M
+florey F L AO R IY
+florez F L AO R EH Z
+flori F L AO R IY
+floria F L AO R IY AH
+florian F L AO R IY AH N
+florid F L AO R AH D
+florida F L AO R AH D AH
+florida's F L AO R IH D AH Z
+florida's(2) F L AA R IH D AH Z
+florida's(3) F L AO R AH D AH Z
+florida(2) F L AO R IH D AH
+florida(3) F L AA R AH D AH
+florida(4) F L AA R IH D AH
+floridabanc F L AO R AH D AH B AE NG K
+floridian F L AO R IH D IY AH N
+floridians F L AO R IH D IY AH N Z
+florin F L AO R IH N
+florinda F L AO R IY N D AH
+florine F L AO R IY N IY
+florio F L AO R IY OW
+florio's F L AO R IY OW Z
+floris F L AO R IH S
+florist F L AA R AH S T
+florist(2) F L AO R AH S T
+florists F L AO R IH S T S
+florists(2) F L AO R IH S S
+florists(3) F L AO R IH S
+floro F L AO R OW
+florrie F L AO R IY
+florry F L AO R IY
+florsheim F L AO R SH AY M
+flory F L AO R IY
+floss F L AA S
+flossie F L AO S IY
+flotation F L OW T EY SH AH N
+flotilla F L OW T IH L AH
+flotow F L AA T AW
+flotsam F L AA T S AH M
+flott F L AA T
+flotta F L AA T AH
+flounce F L AW N S
+flounces F L AW N S IH Z
+flounder F L AW N D ER
+floundered F L AW N D ER D
+floundering F L AW N D ER IH NG
+flounders F L AW N D ER Z
+flour F L AW ER
+flour(2) F L AW R
+flourish F L ER IH SH
+flourished F L ER IH SH T
+flourishes F L ER IH SH AH Z
+flourishes(2) F L ER IH SH IH Z
+flourishing F L ER IH SH IH NG
+flournoy F L UH R N OY
+flours F L AW ER Z
+flout F L AW T
+flouted F L AW T IH D
+flouting F L AW T IH NG
+flouts F L AW T S
+flow F L OW
+flowchart F L OW CH AA R T
+flowcharts F L OW CH AA R T S
+flowe F L OW
+flowed F L OW D
+flower F L AW ER
+flowered F L AW ER D
+flowering F L AW ER IH NG
+flowerpot F L AW ER P AA T
+flowers F L AW ER Z
+flowers' F L AW ER Z
+flowery F L AW ER IY
+flowing F L OW IH NG
+flown F L OW N
+flows F L OW Z
+flowton F L OW T AH N
+floy F L OY
+floyd F L OY D
+flu F L UW
+flubs F L AH B Z
+fluck F L AH K
+fluctuate F L AH K CH AH W EY T
+fluctuated F L AH K CH AH W EY T IH D
+fluctuates F L AH K CH UW EY T S
+fluctuating F L AH K CH AH W EY T IH NG
+fluctuation F L AH K CH UW EY SH AH N
+fluctuations F L AH K CH UW EY SH AH N Z
+flud F L AH D
+fludd F L AH D
+flue F L UW
+fluegel F L UH G AH L
+fluegge F L UW G
+fluency F L UW AH N S IY
+fluent F L UW AH N T
+fluently F L UW AH N T L IY
+fluet F L UW T
+fluff F L AH F
+fluffed F L AH F T
+fluffier F L AH F IY ER
+fluffiest F L AH F IY AH S T
+fluffs F L AH F S
+fluffy F L AH F IY
+fluharty F L AH ER T IY
+fluhr F L ER
+fluhr(2) F L UH R
+fluid F L UW AH D
+fluid(2) F L UW IH D
+fluidity F L UW IH D AH T IY
+fluids F L UW AH D Z
+fluids(2) F L UW IH D Z
+fluitt F L UW AH T
+fluke F L UW K
+fluker F L UW K ER
+flukes F L UW K S
+flulike F L UW L AY K
+flume F L UW M
+flumenbaum F L UW M AH N B AW M
+flumes F L UW M Z
+flummox F L AH M AO K S
+flummoxed F L AH M AO K S T
+flung F L AH NG
+flunk F L AH NG K
+flunked F L AH NG K T
+flunking F L AH NG K IH NG
+flunks F L AH NG K S
+fluor F L UW ER
+fluor's F L UW ER Z
+fluoresce F L UH R EH S
+fluoresce(2) F L AO R EH S
+fluorescent F L UH R EH S AH N T
+fluorescent(2) F L AO R EH S AH N T
+fluorescently F L UH R EH S AH N T L IY
+fluorescently(2) F L AO R EH S AH N T L IY
+fluorescents F L UH R EH S AH N T S
+fluorescents(2) F L AO R EH S AH N T S
+fluoridation F L UH R AH D EY SH AH N
+fluoridation(2) F L AO R AH D EY SH AH N
+fluoride F L UH R AY D
+fluoride(2) F L AO R AY D
+fluorides F L UH R AY D Z
+fluorides(2) F L AO R AY D Z
+fluorine F L UH R IY N
+fluorine(2) F L AO R IY N
+fluorite F L UH R AY T
+fluorite(2) F L AO R AY T
+fluorocarbon F L UH R OW K AA R B AH N
+fluorocarbon(2) F L AO R OW K AA R B AH N
+fluorocarbons F L UH R OW K AA R B AH N Z
+fluorocarbons(2) F L AO R OW K AA R B AH N Z
+fluorometer F L UH R AA M AH T ER
+fluorometer(2) F L AO R AA M AH T ER
+fluoroscopy F L UH R AA S K AH P IY
+fluoroscopy(2) F L AO R AA S K AH P IY
+fluorspar F L UH R S P AA R
+fluorspar(2) F L AO R S P AA R
+flurried F L ER IY D
+flurries F L ER IY Z
+flurry F L ER IY
+flury F L UW R IY
+flury(2) F L ER IY
+flus F L UW Z
+flush F L AH SH
+flushed F L AH SH T
+flushes F L AH SH IH Z
+flushing F L AH SH IH NG
+fluster F L AH S T ER
+flustered F L AH S T ER D
+flustering F L AH S T ER IH NG
+flusters F L AH S T ER Z
+flute F L UW T
+flutes F L UW T S
+flutist F L UW T IH S T
+flutist(2) F L AW T IH S T
+flutter F L AH T ER
+fluttered F L AH T ER D
+fluttering F L AH T ER IH NG
+flutters F L AH T ER Z
+fluty F L UW T IY
+fluvial F L UW V IY AH L
+flux F L AH K S
+fluxional F L AH K SH AH N AH L
+fly F L AY
+flyby F L AY B AY
+flycatcher F L AY K AE CH ER
+flye F L AY
+flyer F L AY ER
+flyers F L AY ER Z
+flying F L AY IH NG
+flynn F L IH N
+flynt F L IH N T
+flypaper F L AY P EY P ER
+flythe F L AY DH
+flytrap F L AY T R AE P
+flyway F L AY W EY
+flywheel F L AY W IY L
+fm EH F EH M
+foal F OW L
+foale F OW L
+foale's F OW L Z
+foaling F OW L IH NG
+foam F OW M
+foaming F OW M IH NG
+foams F OW M Z
+foamy F OW M IY
+foard F AO R D
+fob F AO B
+fobbs F AA B Z
+fobel F OW B AH L
+fobel's F OW B AH L Z
+fobes F OW B Z
+focaccia F OW K AA CH IY AH
+focal F OW K AH L
+focht F AA K T
+fochtman F AA K T M AH N
+fockler F AA K L ER
+focus F OW K AH S
+focus(2) F OW K IH S
+focused F OW K AH S T
+focused(2) F OW K IH S T
+focuses F OW K AH S IH Z
+focuses(2) F OW K IH S IH Z
+focusing F OW K AH S IH NG
+focusing(2) F OW K IH S IH NG
+focussed F OW K AH S T
+focussed(2) F OW K IH S T
+fodder F AA D ER
+fodera F OW D EH R AH
+fodor F OW D ER
+foe F OW
+foehlich F OW L IH CH
+foell F IY L
+foeller F OW L ER
+foerster F AO R S T ER
+foertsch F AO R CH
+foes F OW Z
+fog F AA G
+fog(2) F AO G
+fogal F OW JH AH L
+fogarty F AA G AA R T IY
+fogarty(2) F OW G AA R T IY
+fogel F OW G AH L
+fogelberg F OW G AH L B ER G
+fogelberg's F OW G AH L B ER G Z
+fogelman F OW G AH L M AH N
+fogelman's F OW G AH L M AH N Z
+fogelson F OW G AH L S AH N
+fogelson's F OW G AH L S AH N Z
+fogerty F AA JH ER T IY
+fogerty's F AA JH ER T IY Z
+fogg F AA G
+fogg's F AA G Z
+foggiest F AA G IY AH S T
+foggy F AA G IY
+fogle F OW G AH L
+fogleman F OW G AH L M AH N
+fogler F OW G AH L ER
+fogler(2) F OW G L ER
+foglesong F AA G AH L S AO NG
+foglia F AA G L IY AH
+foglio F AA G L IY OW
+fogs F AO G Z
+fogt F AA G T
+fogy F OW G IY
+fohl F OW L
+foia F OW Y AH
+foia(2) EH F OW AY EY
+foible F OY B AH L
+foibles F OY B AH L Z
+foie F OY
+foil F OY L
+foiled F OY L D
+foiles F AA AY L Z
+foiling F OY L IH NG
+foils F OY L Z
+foist F OY S T
+foisted F OY S T IH D
+foister F OY S T ER
+foisy F OY Z IY
+fojtik F AA Y T IH K
+fokker F AA K ER
+fokkers F AA K ER Z
+folan F OW L AH N
+foland F OW L AH N D
+folck F OW L K
+fold F OW L D
+folded F OW L D AH D
+folded(2) F OW L D IH D
+folden F OW L D AH N
+folder F OW L D ER
+folders F OW L D ER Z
+folding F OW L D IH NG
+folds F OW L D Z
+foley F OW L IY
+foley's F OW L IY Z
+folger F OW L JH ER
+folger's F OW L JH ER Z
+folgers F OW L JH ER Z
+folha F OW L HH AH
+foliage F OW L IH JH
+foliage(2) F OW L IY IH JH
+foliate F OW L IY EY T
+foliation F OW L IY EY SH AH N
+folic F AA L IH K
+folino F OW L IY N OW
+folk F OW K
+folker F OW K ER
+folkers F OW K ER Z
+folkert F OW K ER T
+folkerts F OW K ER T S
+folkes F OW K S
+folkish F OW K IH SH
+folklore F OW K L AO R
+folkman F OW K M AH N
+folkrock F OW K R AA K
+folks F OW K S
+folks' F OW K S
+folkstone F OW K S T OW N
+folkstone's F OW K S T OW N Z
+folksy F OW K S IY
+folktale F OW K T EY L
+folkway F OW K W EY
+folkways F OW K W EY Z
+folland F AA L AH N D
+follett F AA L IH T
+follette F AA L EH T
+folley F AA L IY
+folliard F AA L Y ER D
+follicle F AA L AH K AH L
+follicle(2) F AA L IH K AH L
+follicles F AA L IH K AH L Z
+follies F AA L IY Z
+follin F AA L IH N
+follis F AA L IH S
+follman F AA L M AH N
+follmer F AA L M ER
+follow F AA L OW
+followed F AA L OW D
+followell F AA L AH W EH L
+follower F AA L OW ER
+followers F AA L OW ER Z
+following F AA L OW IH NG
+followings F AA L OW IH NG Z
+follows F AA L OW Z
+followup F AA L OW AH P
+folly F AA L IY
+folmar F OW L M ER
+folmer F OW L M ER
+folse F OW L S
+folsom F OW L S AH M
+folson F OW L S AH N
+folta F OW L T AH
+foltene F OW L T IY N
+folts F OW L T S
+foltz F OW L T S
+folwell F OW L W EH L
+folz F OW L Z
+fomby F AA M B IY
+foment F OW M EH N T
+fomented F OW M EH N T IH D
+fomenting F OW M EH N T IH NG
+fomento F OW M EH N T OW
+fomon F OW M AH N
+fomon's F OW M AH N Z
+fonar F AA N ER
+foncier F AA N S Y ER
+fond F AA N D
+fonda F AA N D AH
+fonda's F AA N D AH Z
+fonder F AA N D ER
+fondest F AA N D AH S T
+fondiaria F AA N D IY EH R IY AH
+fondkommission F AA N D K AH M IH SH AH N
+fondle F AO N D AH L
+fondled F AO N D AH L D
+fondling F AA N D AH L IH NG
+fondling(2) F AA N D L IH NG
+fondly F AA N D L IY
+fondness F AA N D N AH S
+fondren F AA N D ER AH N
+fondue F AA N D Y UW
+fondue(2) F AA N D UW
+fondues F AA N D UW Z
+fone F OW N
+foner F OW N ER
+fones F OW N Z
+fong F AO NG
+fonger F AO NG ER
+fonner F AA N ER
+fons F AA N Z
+fonseca F OW N S EH K AH
+font F AA N T
+fontaine F AO N T EY N
+fontainebleau F AA N T AH N B L OW
+fontainebleau(2) F AA N T AH N B L UW
+fontana F AO N T AE N AH
+fontanella F AA N T AH N EH L AH
+fontanez F OW N T AA N EH Z
+fontanilla F AA N T AH N IH L AH
+fonte F AA N T
+fontenette F AA N T IH N EH T
+fontenot F AA N T IH N AH T
+fontes F OW N T EH S
+fonts F AA N T S
+fonville F OW N V IH L
+fonz F AA N Z
+fonzie F AA N Z IY
+foo F UW
+foobar F UW B AA R
+food F UW D
+food's F UW D Z
+foodarama F UW D ER AE M AH
+foodie F UW D IY
+foodmaker F UW D M EY K ER
+foodmaker's F UW D M EY K ER Z
+foodmakers F UW D M EY K ER Z
+foods F UW D Z
+foods' F UW D Z
+foodservice F UW D S ER V IH S
+foodstuff F UW D S T AH F
+foodstuffs F UW D S T AH F S
+foodtown F UW D T AW N
+foodway F UW D W EY
+foodways F UW D W EY Z
+fooks F UH K S
+fool F UW L
+fool's F UW L Z
+fooled F UW L D
+foolery F UW L ER IY
+foolhardy F UW L HH AA R D IY
+fooling F UW L IH NG
+foolish F UW L IH SH
+foolishly F UW L IH SH L IY
+foolishness F UW L IH SH N AH S
+foolproof F UW L P R UW F
+fools F UW L Z
+foong F UW NG
+foor F UH R
+foos F UW Z
+foose F UW S
+fooshee F UW SH IY
+foot F UH T
+footage F UH T IH JH
+football F UH T B AO L
+football's F UH T B AO L Z
+footballs F UH T B AO L Z
+foote F UH T
+foote's F UH T S
+footed F UH T IH D
+footer F UH T ER
+footfall F UH T F AO L
+foothill F UH T HH IH L
+foothills F UH T HH IH L Z
+foothold F UH T HH OW L D
+footholds F UH T HH OW L D Z
+footing F UH T IH NG
+footings F UH T IH NG Z
+footlight F UH T L AY T
+footlights F UH T L AY T S
+footloose F UH T L UW S
+footman F UH T M AH N
+footnote F UH T N OW T
+footnoted F UH T N OW T IH D
+footnotes F UH T N OW T S
+footnoting F UH T N OW T IH NG
+footpath F UH T P AE TH
+footprint F UH T P R IH N T
+footprints F UH T P R IH N T S
+footrace F UH T R EY S
+footstep F UH T S T EH P
+footsteps F UH T S T EH P S
+footwall F UH T W AO L
+footware F UH T W EH R
+footwear F UH T W EH R
+footwork F UH T W ER K
+fop F AO P
+fop(2) EH F OW P IY
+foppiano F OW P IY AA N OW
+for F AO R
+for(2) F ER
+for(3) F R ER
+fora F AO R AH
+forage F AO R IH JH
+forages F AO R AH JH AH Z
+foraging F AO R IH JH IH NG
+foraker F AO R AH K ER
+foramen F ER EY M AH N
+foran F AO R AH N
+forand F AO R AH N D
+foray F AO R EY
+forayed F AO R EY D
+foraying F AO R EY IH NG
+forays F AO R EY Z
+forbad F ER B AE D
+forbade F ER B EY D
+forbearance F AO R B EH R AH N S
+forbes F AO R B Z
+forbes' F AO R B Z
+forbes's F AO R B Z IH Z
+forbeses F AO R B Z IH Z
+forbess F AO R B EH S
+forbid F ER B IH D
+forbid(2) F AO B IH D
+forbidden F AO R B IH D AH N
+forbidden(2) F ER R B IH D AH N
+forbidding F ER B IH D IH NG
+forbidding(2) F AO B IH D IH NG
+forbids F ER B IH D Z
+forbids(2) F AO B IH D Z
+forbis F AO R B IH S
+forbus F AO R B IH S
+forbush F AO R B UH SH
+force F AO R S
+force's F AO R S IH Z
+forced F AO R S T
+forceful F AO R S F AH L
+forcefully F AO R S F AH L IY
+forcefulness F AO R S F AH L N AH S
+forceps F AO R S EH P S
+forces F AO R S IH Z
+forces' F AO R S IH Z
+forcible F AO R S AH B AH L
+forcibly F AO R S AH B L IY
+forcier F AO R K IY ER
+forcing F AO R S IH NG
+forcum F AO R K AH M
+ford F AO R D
+ford's F AO R D Z
+forde F AO R D
+fordham F AO R D AH M
+fordice F AO R D IH S
+fordice(2) F AO R D AY S
+fords F AO R D Z
+fordyce F AO R D AY S
+fore F AO R
+forearm F AO R AA R M
+forearms F AO R AA R M Z
+forebear F AO R B EH R
+forebearance F AO R B EH R AH N S
+forebears F AO R B EH R Z
+forebode F AO R B OW D
+foreboding F AO R B OW D IH NG
+forebrain F AO R B R EY N
+forecast F AO R K AE S T
+forecasted F AO R K AE S T IH D
+forecaster F AO R K AE S T ER
+forecasters F AO R K AE S T ER Z
+forecasting F AO R K AE S T IH NG
+forecasts F AO R K AE S T S
+forecasts(2) F AO R K AE S
+foreclose F AO R K L OW Z
+foreclosed F AO R K L OW Z D
+forecloses F AO R K L OW Z IH Z
+foreclosing F AO R K L OW Z IH NG
+foreclosure F AO R K L OW ZH ER
+foreclosures F AO R K L OW ZH ER Z
+foree F AO R IY
+forefather F AO R F AA DH ER
+forefathers F AO R F AA DH ER Z
+forefinger F AO R F IH NG G ER
+forefingers F AO R F IH NG G ER Z
+forefoot F AO R F UH T
+forefront F AO R F R AH N T
+forego F AO R G OW
+foregoing F AO R G OW IH NG
+foregone F AO R G AO N
+foreground F AO R G R AW N D
+forehand F AO R HH AE N D
+forehands F AO R HH AE N D Z
+forehead F AO R HH EH D
+foreheads F AO R HH EH D Z
+foreign F AO R AH N
+foreign(2) F AA R AH N
+foreigner F AO R AH N ER
+foreigner(2) F AA R AH N ER
+foreigner(3) F AO R N ER
+foreigner(4) F AA R N ER
+foreigners F AO R AH N ER Z
+foreigners' F AO R AH N ER Z
+foreigners'(2) F AA R AH N ER Z
+foreigners'(3) F AO R N ER Z
+foreigners'(4) F AA R N ER Z
+foreigners(2) F AA R AH N ER Z
+foreigners(3) F AO R N ER Z
+foreigners(4) F AA R N ER Z
+forelimb F AO R L IH M
+forelimbs F AO R L IH M Z
+foreman F AO R M AH N
+foremen F AO R M AH N
+foremost F AO R M OW S T
+forensic F ER EH N S IH K
+forensic(2) F AO R EH N S IH K
+forensically F ER EH N S IH K L IY
+forensically(2) F ER EH N S IH K AH L IY
+forensics F ER EH N S IH K S
+forensics(2) F AO R EH N S IH K S
+foreperson F AO R P ER S AH N
+foreplay F AO R P L EY
+forero F AO R OW
+forerunner F AO R AH N ER
+forerunners F AO R AH N ER Z
+foresaw F AO R S AO
+foresee F AO R S IY
+foreseeable F AO R S IY AH B AH L
+foreseeing F AO R S IY IH NG
+foreseen F AO R S IY N
+foresees F AO R S IY Z
+foreshadow F AO R SH AE D OW
+foreshadowed F AO R SH AE D OW D
+foreshadowing F AO R SH AE D OW IH NG
+foreshadows F AO R SH AE D OW Z
+foresight F AO R S AY T
+foreskin F OW R S K IH N
+foresman F AO R S M AH N
+forest F AO R AH S T
+forest's F AO R AH S T S
+forest(2) F AO R IH S T
+foresta F AO R S T AH
+forestall F AO R S T AO L
+forestalled F AO R S T AA L D
+forestalling F AO R S T AA L IH NG
+forestalls F AO R S T AO L Z
+forested F AO R AH S T AH D
+forester F AO R AH S T ER
+foresters F AO R AH S T ER Z
+forestry F AO R AH S T R IY
+forests F AO R AH S T S
+forests(2) F AO R AH S S
+forests(3) F AO R AH S
+forestville F AO R EH S T V IH L
+foret F AO R T
+foret(2) F AO R EH T
+foretaste F AO R T EY S T
+foretastes F AO R T EY S T S
+foretell F AO R T EH L
+foretelling F AO R T EH L IH NG
+forethought F AO R TH AO T
+foretold F AO R T OW L D
+forever F ER EH V ER
+forewarn F AO R W AO R N
+forewarned F AO R W AO R N D
+forewarning F AO R W AO R N IH NG
+forewarns F AO R W AO R N Z
+forewing F AO R W IH NG
+forewings F AO R W IH NG Z
+forewoman F AO R W UW M AH N
+forewomen F AO R W IH M EH N
+foreword F AO R W ER D
+forex F AO R EH K S
+forfeit F AO R F IH T
+forfeitable F AO R F AH T AH B AH L
+forfeited F AO R F IH T IH D
+forfeiting F AO R F AH T IH NG
+forfeits F AO R F IH T S
+forfeiture F AO R F AH CH ER
+forfeitures F AO R F AH CH ER Z
+forgave F ER G EY V
+forge F AO R JH
+forged F AO R JH D
+forger F AO R JH ER
+forgeries F AO R JH ER IY Z
+forgers F AO R JH ER Z
+forgery F AO R JH ER IY
+forges F AO R JH IH Z
+forget F ER G EH T
+forget(2) F AO R G EH T
+forgetful F AO R G EH T F AH L
+forgetful(2) F ER G EH T F AH L
+forgets F ER G EH T S
+forgets(2) F AO R G EH T S
+forgettable F AO R G EH T AH B AH L
+forgettable(2) F ER G EH T AH B AH L
+forgette F ER ZH EH T
+forgetting F ER G EH T IH NG
+forgetting(2) F AO R G EH T IH NG
+forgey F AO R JH IY
+forgie F AO R JH IY
+forging F AO R JH IH NG
+forgings F AO JH IH NG Z
+forgione F AO R JH OW N IY
+forgivable F AO R G IH V AH B AH L
+forgivable(2) F ER G IH V AH B AH L
+forgive F ER G IH V
+forgive(2) F AO R G IH V
+forgiven F ER G IH V AH N
+forgiven(2) F AO R G IH V AH N
+forgiveness F ER G IH V N AH S
+forgiveness(2) F AO R G IH V N AH S
+forgives F ER G IH V Z
+forgives(2) F AO R G IH V Z
+forgiving F ER G IH V IH NG
+forgiving(2) F AO R G IH V IH NG
+forgo F AO R G OW
+forgoes F AO R G OW Z
+forgoing F AO R G OW IH NG
+forgone F AO R G AA N
+forgot F ER G AA T
+forgot(2) F AO R G AA T
+forgotten F ER G AA T AH N
+forgotten(2) F AO R G AA T AH N
+forgue F AO R G
+forgy F AO R JH IY
+forhan F AO R HH AH N
+forie F AO R IY
+forin F AO R IH N
+forinash F AO R IH N AE SH
+forint F AO R IH N T
+forints F AO R IH N T S
+forister F AO R IH S T ER
+fork F AO R K
+fork-lift F AO R K L IH F T
+forked F AO R K T
+forker F AO R K ER
+forkey F AO R K IY
+forking F AO R K IH NG
+forklift F AO R K L IH F T
+forklifts F AO R K L IH F T S
+forkner F AO R K N ER
+forks F AO R K S
+forlenza F AO R L EH N Z AH
+forlorn F ER L AO R N
+form F AO R M
+form's F AO R M Z
+forma F AO R M AH
+formal F AO R M AH L
+formaldehyde F AO R M AE L D AH HH AY D
+formaldehyde(2) F ER M AE L D AH HH AY D
+formalism F AO R M AH L IH Z AH M
+formalist F AO R M AH L AH S T
+formalities F AO R M AE L AH T IY Z
+formality F AO R M AE L AH T IY
+formalization F AO R M AH L AH Z EY SH AH N
+formalize F AO R M AH L AY Z
+formalized F AO R M AH L AY Z D
+formalizes F AO R M AH L AY Z IH Z
+formalizing F AO R M AH L AY Z IH NG
+formally F AO R M AH L IY
+forman F AO R M AE N
+formanek F AO R M AH N IH K
+formant F AO R M AH N T
+formants F AO R M AH N T S
+format F AO R M AE T
+formation F AO R M EY SH AH N
+formations F AO R M EY SH AH N Z
+formative F AO R M AH T IH V
+formato F AO R M AA T OW
+formats F AO R M AE T S
+formbey F AO R M B IY
+formby F AO R M B IY
+formed F AO R M D
+former F AO R M ER
+formerly F AO R M ER L IY
+formic F AO R M IH K
+formica F AO R M AY K AH
+formica's F AO R M AY K AH Z
+formica's(2) F ER M AY K AH Z
+formica(2) F ER M AY K AH
+formidable F AO R M AH D AH B AH L
+formidable(2) F AO R M IH D AH B AH L
+formidably F AO R M AH D AH B L IY
+forming F AO R M IH NG
+formosa F AO R M OW S AH
+formoso F AO R M OW S OW
+forms F AO R M Z
+formula F AO R M Y AH L AH
+formulaic F AO R M Y AH L EY IH K
+formulary F AO R M Y AH L EH R IY
+formulas F AO R M Y AH L AH Z
+formulate F AO R M Y AH L EY T
+formulated F AO R M Y AH L EY T AH D
+formulated(2) F AO R M Y AH L EY T IH D
+formulates F AO R M Y AH L EY T S
+formulating F AO R M Y AH L EY T IH NG
+formulation F AO R M Y AH L EY SH AH N
+formulation(2) F AO R M Y UW L EY SH AH N
+formulations F AO R M Y UW L EY SH AH N Z
+formylin F AO R M IH L IH N
+fornal F AO R N AH L
+forner F AO R N ER
+fornes F AO R N Z
+forness F ER N IH S
+forney F AO R N IY
+forni F AO R N IY
+fornoff F AO R N AO F
+fornwalt F AO R N W AH L T
+forquer F AO R K ER
+forr F AO R
+forrer F AO ER R
+forrest F AO R AH S T
+forrestal F AO R AH S T AH L
+forrester F AO R AH S T ER
+forrey F AO R IY
+forry F AO R IY
+fors F ER Z
+forsake F AO R S EY K
+forsaken F AO R S EY K AH N
+forsaking F AO R S EY K IH NG
+forsberg F AO R S B ER G
+forsburg F AO R S B ER G
+forsburg's F AO R S B ER G Z
+forschner F AO R SH N ER
+forse F AO R S
+forsee F ER S IY
+forseeable F AO R S IY AH B AH L
+forseeable(2) F ER S IY AH B AH L
+forsell F AO R S AH L
+forseth F AO R S IH TH
+forsgren F AO R S G R EH N
+forshan F AO R SH AH N
+forshee F AO R SH IY
+forshey F AO R SH IY
+forslund F AO R S L AH N D
+forsman F AO R S M AH N
+forson F AO R S AH N
+forsook F AO R S UH K
+forst F AO R S T
+forster F AO R S T ER
+forstmann F AO R S T M AH N
+forstner F AO R S T N ER
+forstrom F AO R S T R AH M
+forswear F AO R S W EH R
+forsworn F AO R S W AO R N
+forsyth F AO R S AY TH
+forsythe F AO R S AY DH
+forsythia F AO R S IH TH IY AH
+forsythia(2) F AO R S IH DH IY AH
+forsythias F AO R S IH TH IY AH Z
+forsythias(2) F AO R S IH DH IY AH Z
+fort F AO R T
+fortas F AO R T AH S
+fortas's F AO R T AH S IH Z
+forte F AO R T EY
+forte(2) F AO R T
+fortenberry F AO R T AH N B EH R IY
+fortes F AO R T EY Z
+fortes(2) F AO R T S
+forth F AO R TH
+forthcoming F AO R TH K AH M IH NG
+forthright F AO R TH R AY T
+forthrightly F AO R TH R AY T L IY
+forthrightness F AO R TH R AY T N AH S
+forthwith F AO R TH W IH TH
+forti F AO R T IY
+fortier F AO R T IY ER
+fortier's F AO R T IY ER Z
+fortier's(2) F AO R T Y ER Z
+fortier(2) F AO R T Y ER
+forties F AO R T IY Z
+fortieth F AO R T IY IH TH
+fortification F AO R T AH F AH K EY SH AH N
+fortifications F AO R T AH F AH K EY SH AH N Z
+fortified F AO R T AH F AY D
+fortifier F AO R T AH F AY ER
+fortifiers F AO R T AH F AY ER Z
+fortify F AO R T IH F AY
+fortifying F AO R T IH F AY IH NG
+fortin F AO R T IH N
+fortini F AO R T IY N IY
+fortino F AO R T IY N OW
+fortis F AO R T IH S
+fortitude F AO R T IH T UW D
+fortman F AO R T M AH N
+fortna F AO R T N AH
+fortner F AO R T N ER
+fortney F AO R T N IY
+fortnight F AO R T N AY T
+fortnightly F AO R T N AY T L IY
+fortnights F AO R T N AY T S
+forton F AO R T AH N
+fortress F AO R T R AH S
+fortresses F AO R T R AH S IH Z
+forts F AO R T S
+fortson F AO R T S AH N
+fortuitous F AO R T UW IH T AH S
+fortuna F AO R T UW N AH
+fortunate F AO R CH AH N AH T
+fortunate(2) F AO R CH UW N AH T
+fortunately F AO R CH AH N AH T L IY
+fortunately(2) F AO R CH UW N AH T L IY
+fortunato F AO R T UW N AA T OW
+fortunato(2) F AO R CH UW N AA T OW
+fortune F AO R CH AH N
+fortune's F AO R CH AH N Z
+fortune's(2) F AO R CH UW N Z
+fortune(2) F AO R CH UW N
+fortunes F AO R CH AH N Z
+fortunes(2) F AO R CH UW N Z
+fortuny F AO R CH UW N IY
+forty F AO R T IY
+forty's F AO R T IY Z
+forum F AO R AH M
+forum's F AO R AH M Z
+forums F AO R AH M Z
+forward F AO R W ER D
+forwarded F AO R W ER D IH D
+forwarder F AO R W ER D ER
+forwarders F AO R W ER D ER Z
+forwarding F AO R W ER D IH NG
+forwards F AO R W ER D Z
+forwood F AO R W UH D
+forys F AO R IY Z
+forza F AO R Z AH
+fosamax F AA S AH M AE K S
+fosback F AA S B AE K
+fosberg F AA S B ER G
+fosco F AA S K OW
+fosdick F AA S D IH K
+foshee F AA SH IY
+fosia F OW ZH AH
+foskett F AA S K IH T
+foskey F AA S K IY
+fosler F AA S AH L ER
+fosler(2) F AA S L ER
+fosnaugh F AA S N AO
+foss F AA S
+fosse F AA S
+fossel F AA S AH L
+fossen F AA S AH N
+fossett F AA S IH T
+fossett's F AA S IH T S
+fossey F AA S IY
+fossey's F AA S IY Z
+fossil F AA S AH L
+fossiliferous F AA S AH L IH F ER AH S
+fossilize F AA S AH L AY Z
+fossilized F AA S AH L AY Z D
+fossils F AA S AH L Z
+fossum F AA S AH M
+foster F AA S T ER
+foster's F AA S T ER Z
+fostered F AA S T ER D
+fostering F AA S T ER IH NG
+fosters F AA S T ER Z
+foth F AA TH
+fothergill F AH DH ER G IH L
+fotheringham F AH DH ER IH NG HH AE M
+foti F OW T IY
+fotis F OW T IH S
+fotopoulos F AH T AA P AH L IH S
+fouad F UW AE D
+fouch F AW CH
+fouche F AW CH
+foucher F AW K ER
+fougere F AW G ER
+fought F AO T
+fouhy F UW IY
+fouhy(2) F UW HH IY
+foul F AW L
+foulds F OW L D Z
+fouled F AW L D
+fouling F AW L IH NG
+foulk F AW L K
+foulke F AW L K
+foulkes F AW L K S
+foulks F UW L K S
+foulness F AW L N AH S
+fouls F AW L Z
+found F AW N D
+foundation F AW N D EY SH AH N
+foundation's F AW N D EY SH AH N Z
+foundational F AW N D EY SH AH N AH L
+foundations F AW N D EY SH AH N Z
+founded F AW N D AH D
+founded(2) F AW N D IH D
+founder F AW N D ER
+founder's F AW N D ER Z
+foundered F AW N D ER D
+foundering F AW N D ER IH NG
+founders F AW N D ER Z
+founders' F AW N D ER Z
+founding F AW N D IH NG
+foundling F AW N D L IH NG
+foundries F AW N D R IY Z
+foundry F AW N D R IY
+fountain F AW N T AH N
+fountaine F UW N T EY N
+fountains F AW N T AH N Z
+four F AO R
+4 F AO R
+four's F AO R Z
+fourfold F AO R F OW L D
+fourier F UH R IY EY
+fourman F AO R M AH N
+fournet F UH R N EH T
+fournier F AO R N IY ER
+fours F AO R Z
+foursome F AO R S AH M
+foursquare F AO R S K W EH R
+fourteen F AO R T IY N
+fourteens F AO R T IY N Z
+fourteenth F AO R T IY N TH
+fourth F AO R TH
+fourth's F AO R TH S
+fourthly F AO R TH L IY
+fourthquarter F AO R TH K W AO R T ER
+fourthquarter(2) F AO R TH K AO R T ER
+fourths F AO R TH S
+fourths(2) F AO R S
+fourtou F AO R T UW
+fouse F AW S
+fousek F AW S IH K
+foushee F AW SH IY
+foust F AW S T
+fout F AW T
+foutch F AW CH
+fouts F AW T S
+fouty F AW T IY
+foutz F AW T S
+fowble F AW B AH L
+fowers F AW ER Z
+fowkes F AW K S
+fowl F AW L
+fowle F AW AH L
+fowler F AW L ER
+fowler's F AW L ER Z
+fowles F AW AH L Z
+fowlkes F AW L K S
+fox F AA K S
+fox's F AA K S AH Z
+foxboro F AA K S B ER OW
+foxborough F AA K S B ER OW
+foxes F AA K S AH Z
+foxfire F AA K S F AY R
+foxfire(2) F AA K S F AY ER
+foxglove F AA K S G L AH V
+foxhole F AA K S HH OW L
+foxholes F AA K S HH OW L Z
+foxhound F AA K S HH AW N D
+foxman F AA K S M AH N
+foxman's F AA K S M AH N Z
+foxmeyer F AA K S M AY R
+foxtail F AA K S T EY L
+foxtrot F AA K S T R AA T
+foxwell F AA K S W EH L
+foxwood F AA K S W UH D
+foxwoods F AA K S W UH D Z
+foxworth F AA K S W ER TH
+foxworthy F AA K S W ER DH IY
+foxworthy's F AA K S W ER DH IY Z
+foxx F AA K S
+foxy F AA K S IY
+foy F OY
+foye F OY
+foyer F OY ER
+foyle F OY L
+foyt F OY T
+fraas F R AA Z
+frable F R EY B AH L
+fracas F R EY K AH S
+frace F R EY S
+fractal F R AE K T AH L
+fraction F R AE K SH AH N
+fractional F R AE K SH AH N AH L
+fractionally F R AE K SH AH N AH L IY
+fractionally(2) F R AE K SH N AH L IY
+fractions F R AE K SH AH N Z
+fractious F R AE K SH AH S
+fractiousness F R AE K SH AH S N AH S
+fracture F R AE K CH ER
+fracture(2) F R AE K SH ER
+fractured F R AE K CH ER D
+fractures F R AE K CH ER Z
+fractures(2) F R AE K SH ER Z
+fracturing F R AE K CH ER IH NG
+fradette F R AH D EH T
+fradkin F R AE D K IH N
+frady F R EY D IY
+fraga F R AA G AH
+fragale F R AA G AA L IY
+frager F R EY G ER
+fragile F R AE JH AH L
+fragility F R AH JH IH L AH T IY
+fragment F R AE G M AH N T
+fragmentary F R AE G M AH N T EH R IY
+fragmentation F R AE G M AH N T EY SH AH N
+fragmented F R AE G M AH N T IH D
+fragmented(2) F R AE G M AH N IH D
+fragmenting F R AE G M AH N T IH NG
+fragmenting(2) F R AE G M AH N IH NG
+fragments F R AE G M AH N T S
+frago F R EY G OW
+fragonard F R AE G AH N ER D
+fragonard(2) F R AE G AH N AA R D
+fragoso F R AA G OW S OW
+fragrance F R EY G R AH N S
+fragrances F R EY G R AH N S AH Z
+fragrances(2) F R EY G R AH N S IH Z
+fragrant F R EY G R AH N T
+fraher F R AA ER
+frahm F R AE M
+frail F R EY L
+frailey F R EY L IY
+frailties F R EY L T IY Z
+frailty F R EY L T IY
+fraim F R EY M
+frain F R EY N
+fraine F R EY N
+fraioli F R AY OW L IY
+fraire F R EH R
+fraiser F R EY ZH ER
+fraizer F R EY ZH ER
+fraker F R EY K ER
+frakes F R EY K S
+fraleigh F R EY L IY
+fraley F R EY L IY
+fralick F R AE L IH K
+fralin F R AE L IH N
+fralix F R AE L IH K S
+fram F R AE M
+framatome F R AE M AH T OW M
+frame F R EY M
+framed F R EY M D
+framer F R EY M ER
+framers F R EY M ER Z
+framers' F R AE M ER Z
+frames F R EY M Z
+framework F R EY M W ER K
+framing F R EY M IH NG
+framingham F R EY M IH NG HH AE M
+frampton F R AE M P T AH N
+fran F R AE N
+frana F R AE N AH
+franc F R AE NG K
+franc's F R AE NG K S
+franca F R AE NG K AH
+francais F R AA N S EY
+francaise F R AA N S EH Z
+francaises F R AA N S EH Z
+francavilla F R AA N K AA V IH L AH
+france F R AE N S
+france's F R AE N S IH Z
+francek F R AE N CH EH K
+frances F R AE N S IH S
+francesca F R AE N CH EH S K AH
+franceschi F R AA N CH EH S K IY
+franceschini F R AA N CH EH S K IY N IY
+francesco F R AE N CH EH S K OW
+francesco's F R AE N CH EH S K OW Z
+francesconi F R AA N CH EH S K OW N IY
+francese F R AA N CH EY Z IY
+francesmary F R AE N S AH S M EH R IY
+franchi F R AA N K IY
+franchik F R AE N CH IH K
+franchini F R AA N K IY N IY
+franchino F R AA N K IY N OW
+franchise F R AE N CH AY Z
+franchise's F R AE N CH AY Z IH Z
+franchised F R AE N CH AY Z D
+franchisee F R AE N CH AY Z IY
+franchisees F R AE N CH AY Z IY Z
+franchisees' F R AE N CH AY Z IY Z
+franchiser F R AE N CH AY Z ER
+franchisers F R AE N CH AY Z ER Z
+franchises F R AE N CH AY Z IH Z
+franchising F R AE N CH AY Z IH NG
+franchot F R AE N K AH T
+francia F R AA N CH AH
+francie F R AE NG K IY
+francies F R AH N S IY Z
+francine F R AE N S IY N
+francine's F R AE N S IY N Z
+francines F R AE N S IY N Z
+francis F R AE N S AH S
+francis' F R AE N S AH S
+francis'(2) F R AE N S IH S
+francis(2) F R AE N S IH S
+franciscan F R AE N S IH S K AH N
+franciscans F R AE N S IH S K AH N Z
+francisco F R AE N S IH S K OW
+francisco's F R AE N S IH S K OW Z
+franciso F R AE N S IY S OW
+francisville F R AE N S IH S V IH L
+franck F R AE NG K
+francke F R AE NG K
+francklin F R AE NG K L IH N
+francklyn F R AE NG K L IH N
+franckowiak F R AH N S K AW IY AE K
+franco F R AE NG K OW
+franco's F R AE NG K OW Z
+francoeur F R AH N K ER
+francois F R AA N S W AA
+francoise F R AE N S W AA Z
+francoise(2) F R AE N S W AA
+francom F R AE NG K AA M
+francophile F R AE NG K AH F AY L
+francophone F R AE NG K AH F OW N
+francorp F R AE N K AO R P
+francs F R AE NG K S
+francy F R AE N S IY
+francyne F R AE N S AY N
+franczak F R AE N CH AE K
+frandsen F R AE N D S AH N
+frane F R EY N
+franek F R AE N IH K
+franey F R EY N IY
+frangos F R AE NG G OW Z
+franjo F R AE N JH OW
+frank F R AE NG K
+frank's F R AE NG K S
+franke F R AE NG K
+franke(2) F R AE NG K IY
+franked F R AE NG K T
+frankel F R AE NG K AH L
+franken F R AE NG K AH N
+frankenberg F R AE NG K AH N B ER G
+frankenberger F R AE NG K AH N B ER G ER
+frankenberry F R AE NG K AH N B EH R IY
+frankenfield F R AE NG K AH N F IY L D
+frankenheimer F R AE NG K AH N HH AY M ER
+frankenstein F R AE NG K AH N S T AY N
+frankenstein's F R AE NG K AH N S T AY N Z
+frankenstein's(2) F R AE NG K AH N S T IY N Z
+frankenstein(2) F R AE NG K AH N S T IY N
+frankfort F R AE NG K F ER T
+frankfort's F R AE NG K F ER T S
+frankfurt F R AE NG K F ER T
+frankfurt's F R AE NG K F ER T S
+frankfurter F R AE NG K F ER T ER
+frankfurters F R AE NG K F ER T ER Z
+frankhouser F R AE NG K HH AW S ER
+frankie F R AE NG K IY
+frankiewicz F R AE N K AH V IH CH
+frankincense F R AE NG K AH N S EH N S
+franking F R AE NG K IH NG
+frankino F R AE NG K IY N OW
+frankish F R AE NG K IH SH
+frankl F R AE NG K AH L
+frankland F R AE NG K L AH N D
+franklin F R AE NG K L IH N
+franklin's F R AE NG K L AH N Z
+franklinite F R AE NG K L IH N AY T
+franklinville F R AE NG K L IH N V IH L
+frankly F R AE NG K L IY
+franklyn F R AE NG K L IH N
+frankness F R AE NG K N AH S
+franko F R AE NG K OW
+frankovich F R AE NG K AH V IH CH
+frankowski F R AH NG K AO F S K IY
+franks F R AE NG K S
+frankson F R AE NG K S AH N
+frankum F R AE NG K AH M
+frannie F R AE N IY
+franny F R AE N IY
+frano F R AA N OW
+frans F R AE N Z
+fransen F R AE N S AH N
+franson F R AE N S AH N
+franssen F R AE N S AH N
+franta F R AE N T AH
+frantic F R AE N T IH K
+frantically F R AE N T AH K AH L IY
+frantically(2) F R AE N T AH K L IY
+frantically(3) F R AE N AH K AH L IY
+frantically(4) F R AE N AH K L IY
+frantom F R AE N T AH M
+frantz F R AE N T S
+frantzen F R AE N T Z AH N
+franyo F R AA N Y OW
+franz F R AE N Z
+franze F R AE N Z
+franzel F R AE N Z AH L
+franzen F R AE N Z AH N
+franzese F R AA N Z EY Z IY
+franzone F R AA N Z OW N IY
+franzoni F R AA N Z OW N IY
+frap F R AE P
+fraph F R AE F
+fraph's F R AE F S
+frappier F R AE P IY ER
+frary F R EH R IY
+frasca F R AA S K AH
+frascella F R AA S CH EH L AH
+frasch F R AE SH
+frasco F R AA S K OW
+frase F R EY Z
+fraser F R EY Z ER
+fraser's F R EY Z ER Z
+frasher F R AE SH ER
+frashier F R EY ZH Y ER
+frasier F R EY ZH ER
+frasier's F R EY ZH ER Z
+frasure F R AA ZH ER
+fratangelo F R AA T AA NG G EH L OW
+frate F R EY T
+frater F R EY T ER
+fraternal F R AH T ER N AH L
+fraternities F R AH T ER N AH T IY Z
+fraternity F R AH T ER N AH T IY
+fraternity(2) F R AH T ER N IH T IY
+fraternize F R AE T ER N AY Z
+fraternizing F R AE T ER N AY Z IH NG
+frates F R EY T S
+fratricide F R AE T R AH S AY D
+fratricides F R AE T R AH S AY D Z
+fratus F R AE T IH S
+fratzke F R AE T S K
+fratzke(2) F R AE T S K IY
+frau F R AW
+fraud F R AO D
+frauds F R AO D Z
+fraudster F R AO D S T ER
+fraudster's F R AO D S T ER Z
+fraudsters F R AO D S T ER Z
+fraudulent F R AO JH AH L AH N T
+fraudulently F R AO D UW L AH N T L IY
+fraught F R AO T
+fraum F R AW M
+fraum(2) F R AA M
+frausto F R AO S T OW
+fravel F R AE V AH L
+frawley F R AO L IY
+fray F R EY
+frayed F R EY D
+frayer F R EY ER
+fraying F R EY IH NG
+frayn F R EY N
+frayne F R EY N
+fraze F R EY Z
+frazee F R AH Z IY
+frazer F R EY Z ER
+frazier F R EY ZH ER
+frazzano F R AH Z AA N OW
+frazzini F R AA T S IY N IY
+frazzle F R AE Z AH L
+frazzled F R AE Z AH L D
+fread F R EH D
+freak F R IY K
+freaked F R IY K T
+freaking F R IY K IH NG
+freaks F R IY K S
+freakshow F R IY K S HH OW
+freaky F R IY K IY
+frean F R IY N
+frear F R IH R
+frears F R IY R Z
+freas F R IY Z
+frease F R IY Z
+freberg F R IY B ER G
+frech F R EH K
+frechette F R IH SH EH T
+freck F R EH K
+freckle F R EH K AH L
+freckled F R EH K AH L D
+freckles F R EH K AH L Z
+fred F R EH D
+fred's F R EH D Z
+freda F R EH D
+freddie F R EH D IY
+freddy F R EH D IY
+freddy's F R EH D IY Z
+freddye F R EH D IY
+frede F R IY D
+fredell F R EH D AH L
+fredella F R EH D EH L AH
+fredenburg F R IY D AH N B ER G
+frederic F R EH D R IH K
+frederica F R EH D ER IY K AH
+frederick F R EH D R IH K
+frederick's F R EH D R IH K S
+frederick's(2) F R EH D ER IH K S
+frederick(2) F R EH D ER IH K
+fredericka F R EY D EH R IY K AH
+fredericks F R EH D R IH K S
+fredericksburg F R EH D R IH K S B ER G
+fredericksburg(2) F R EH D ER IH K S B ER G
+fredericksen F R EH D ER IH K S AH N
+fredericksen(2) F R EH D R IH K S AH N
+frederickson F R EH D ER IH K S AH N
+frederickson(2) F R EH D R IH K S AH N
+frederico F R EH D ER IY K OW
+frederika F R EY D EH R IY K AH
+frederiksen F R EH D ER IH K S AH N
+frederking F R EH D ER K IH NG
+frederking(2) F R IY D ER K IH NG
+fredette F R IH D EH T
+frediani F R EH D IY AA N IY
+fredin F R EH D IH N
+fredkin F R EH D K IH N
+fredlund F R EH D L AH N D
+fredman F R EH D M AH N
+fredo F R IY D OW
+fredric F R EH D R IH K
+fredrich F R EH D R IH K
+fredrick F R EH D R IH K
+fredricks F R EH D R IH K S
+fredricksen F R EH D R IH K S AH N
+fredrickson F R EH D R IH K S AH N
+fredriksen F R IH D R IH K S AH N
+fredrikson F R EH D R IH K S AH N
+free F R IY
+freeberg F R IY B ER G
+freeberg's F R IY B ER G Z
+freebie F R IY B IY
+freebies F R IY B IY Z
+freeborn F R IY B ER N
+freeburg F R IY B ER G
+freeburn F R IY B ER N
+freed F R IY D
+freed's F R IY D Z
+freedenberg F R IY D EH N B ER G
+freedenberg's F R IY D EH N B ER G Z
+freedland F R IY D L AH N D
+freedle F R IY D AH L
+freedman F R IY D M AH N
+freedman's F R IY D M AH N Z
+freedom F R IY D AH M
+freedom's F R IY D AH M Z
+freedoms F R IY D AH M Z
+freefall F R IY F AO L
+freeform F R IY F AO R M
+freeh F R IY
+freeh's F R IY Z
+freehand F R IY HH AE N D
+freehling F R IY L IH NG
+freehoff F R IY HH AO F
+freehoff's F R IY HH AO F S
+freehold F R IY HH OW L D
+freeholder F R IY HH OW L D ER
+freeholders F R IY HH OW L D ER Z
+freeing F R IY IH NG
+freel F R IY L
+freelance F R IY L AE N S
+freelancer F R IY L AE N S ER
+freelancers F R IY L AE N S ER Z
+freelancing F R IY L AE N S IH NG
+freeland F R IY L AH N D
+freeloader F R IY L OW D ER
+freeloaders F R IY L OW D ER Z
+freelove F R IY L AH V
+freels F R IY L Z
+freely F R IY L IY
+freeman F R IY M AH N
+freeman's F R IY M AH N Z
+freemans F R IY M AH N Z
+freemason F R IY M EY S AH N
+freemasonry F R IY M EY S AH N R IY
+freemen F R IY M EH N
+freemen's F R IY M EH N Z
+freemon F R IY M AH N
+freemont F R IY M AA N T
+freemyer F R IY M IY ER
+freen F R IY N
+freeney F R IY N IY
+freeny F R IY N IY
+freeport F R IY P AO R T
+freeport's F R IY P AO R T S
+freer F R IY ER
+frees F R IY Z
+freese F R IY Z
+freest F R IY IH S T
+freestanding F R IY S T AE N D IH NG
+freestone F R IY S T OW N
+freestyle F R IY S T AY L
+freet F R IY T
+freethinker F R IY TH IH NG K ER
+freethinkers F R IY TH IH NG K ER Z
+freetown F R IY T AW N
+freeware F R IY W EY R
+freeway F R IY W EY
+freeways F R IY W EY Z
+freewheeling F R IY W IY L IH NG
+freewheeling(2) F R IY HH W IY L IH NG
+freewing F R IY W IH NG
+freeze F R IY Z
+freezer F R IY Z ER
+freezers F R IY Z ER Z
+freezes F R IY Z IH Z
+freezing F R IY Z IH NG
+fregeau F R IH ZH OW
+fregia F R IY JH IY AH
+fregoso F R EH G OW S OW
+frei F R AY
+freia F R IY AH
+freiberg F R AY B ER G
+freiberger F R AY B ER G ER
+freiburger F R AY B ER G ER
+freid F R IY D
+freidan F R IY D AH N
+freidel F R AY D AH L
+freidman F R AY D M AH N
+freidman(2) F R IY D M AH N
+freidy F R IY D IY
+freidy's F R IY D IY Z
+freidy's(2) F R AY D IY Z
+freidy(2) F R AY D IY
+freier F R EY ER
+freiermuth F R AY ER M UW TH
+freight F R EY T
+freighter F R EY T ER
+freighters F R EY T ER Z
+freightliner F R EY T L AY N ER
+freightway F R EY T W EY
+freightways F R EY T W EY Z
+freiheit F R AY HH AY T
+freije F R IY JH
+freilich F R AY L IH K
+freiman F R AY M AH N
+freiman(2) F R IY M AH N
+freimark F R AY M AA R K
+freimuth F R AY M UW TH
+frein F R EY N
+freind F R AY N D
+freire F R IH R
+freis F R IY Z
+freise F R IY S
+freitag F R AY T AH G
+freitas F R AY T AH Z
+freiwald F R AY W AO L D
+frel F R EH L
+frelimo F R EH L IH M OW
+frels F R EH L Z
+fremd F R EH M D
+fremd's F R EH M D Z
+fremiet F R EH M Y EY
+fremin F R EH M IH N
+fremitus F R EH M AH T AH S
+fremont F R IY M AA N T
+french F R EH N CH
+french's F R EH N CH IH Z
+french-polynesia F R EH N CH P AA L IH N IY ZH AH
+frenchman F R EH N CH M AE N
+frenchmen F R EH N CH M EH N
+frenetic F R AH N EH T IH K
+frenette F R IH N EH T
+freni F R EH N IY
+frenkel F R EH NG K AH L
+frentz F R EH N T S
+frenulum F R EH N Y AH L AH M
+frenz F R EH N Z
+frenzel F R EH N Z AH L
+frenzel(2) F R EH N Z EH L
+frenzied F R EH N Z IY D
+frenzies F R EH N Z IY Z
+frenzy F R EH N Z IY
+freon F R IY AA N
+freons F R IY AA N Z
+frequencies F R IY K W AH N S IY Z
+frequency F R IY K W AH N S IY
+frequent F R IY K W AH N T
+frequent(2) F R IY K W EH N T
+frequented F R IY K W AH N T IH D
+frequenting F R IY K W AH N T IH NG
+frequenting(2) F R IY K W EH N T IH NG
+frequently F R IY K W AH N T L IY
+frequently(2) F R IY K W EH N T L IY
+frequents F R IY K W AH N T S
+frequents(2) F R IY K W EH N T S
+frere F R EH R
+frere(2) F R IH R
+freres F R EH R Z
+freres(2) F R IY R Z
+frerichs F R EH R IH K S
+frericks F R EH R IH K S
+frerika F R EH R IH K AH
+frerking F R ER K IH NG
+fresco F R EH S K OW
+fresco's F R EH S K OW Z
+frescoed F R EH S K OW D
+frescoes F R EH S K OW Z
+frese F R IY Z
+fresenius F R AH S IY N IY AH S
+fresh F R EH SH
+freshbake F R EH SH B EY K
+freshbake's F R EH SH B EY K S
+freshen F R EH SH AH N
+freshened F R EH SH AH N D
+freshener F R EH SH AH N ER
+freshener(2) F R EH SH N ER
+fresheners F R EH SH AH N ER Z
+fresheners(2) F R EH SH N ER Z
+freshening F R EH SH AH N IH NG
+freshening(2) F R EH SH N IH NG
+freshens F R EH SH AH N Z
+fresher F R EH SH ER
+freshest F R EH SH AH S T
+freshkill F R EH SH K IH L
+freshkills F R EH SH K IH L Z
+freshley F R EH SH L IY
+freshly F R EH SH L IY
+freshman F R EH SH M AH N
+freshmen F R EH SH M IH N
+freshness F R EH SH N AH S
+freshour F R EH S AW R
+freshwater F R EH SH W AO T ER
+fresno F R EH Z N OW
+fresno's F R EH Z N OW Z
+fresquez F R EY S K W EH Z
+freston F R EH S T AH N
+fret F R EH T
+fretful F R EH T F AH L
+frets F R EH T S
+frett F R EH T
+fretted F R EH T IH D
+fretter F R EH T ER
+fretting F R EH T IH NG
+fretwell F R EH T W EH L
+fretz F R EH T S
+freud F R OY D
+freud's F R OY D Z
+freudenberg F R OY D AH N B ER G
+freudenthal F R OY D IH N TH AH L
+freudian F R UW D IY AH N
+freund F R UW N D
+freundlich F R OY N D L IH K
+frevert F R EH V ER T
+frew F R UW
+frewen F R UW AH N
+frewin F R UW IH N
+frey F R EY
+frey's F R EY Z
+freya F R EY AH
+freyer F R EY ER
+freyermuth F ER AY R M UW TH
+freyman F R EY M AH N
+freymiller F R EY M IH L ER
+freyne F R EY N
+freyre F R EH R
+freytag F R EY T AH G
+frezza F R EH Z AH
+friar F R AY ER
+friars F R AY ER Z
+friary F R AY ER IY
+frias F R IY AH Z
+friberg F R AY B ER G
+fribourg F R AY B AO R G
+fricano F R IY K AA N OW
+frick F R IH K
+fricke F R IH K
+fricker F R IH K ER
+frickey F R IH K IY
+fricks F R IH K S
+friction F R IH K SH AH N
+frictionless F R IH K SH AH N L AH S
+frictions F R IH K SH AH N Z
+frida F R IY D AH
+friday F R AY D IY
+friday's F R AY D IY Z
+friday's(2) F R AY D EY Z
+friday(2) F R AY D EY
+fridays F R AY D IY Z
+fridays(2) F R AY D EY Z
+friddle F R IH D AH L
+fridge F R IH JH
+fridges F R IH JH AH Z
+fridley F R IH D L IY
+fridman F R IH D M AH N
+fridolf F R IH D OW L F
+fridovich F R IH D AH V IH CH
+fridrich F R IH D R IH K
+fridson F R IH D S AH N
+frie F ER IY
+friebel F R IY B AH L
+fried F R AY D
+fried(2) F R IY D
+frieda F R IY D AH
+friedan F R IY D AH N
+friedberg F R AY D B ER G
+friede F R IY D
+friedel F R IY D AH L
+frieden F R IY D AH N
+friedenberg F R IY D AH N B ER G
+frieder F R AY D ER
+friederich F R IY D ER IH K
+friederike F R IY D ER IH K
+friedhelm F R IY D HH EH L M
+friedhoff F R IY D HH AO F
+friedl F R IY D AH L
+friedland F R IY D L AH N D
+friedlander F R IY D L AH N D ER
+friedley F R IY D L IY
+friedli F R IY D L IY
+friedline F R IY D L AY N
+friedly F R IY D L IY
+friedman F R IY D M AH N
+friedman's F R IY D M AH N Z
+friedmann F R IY D M AH N
+friedrich F R IY D R IH K
+friedrichs F R IY D R IH K S
+friedrichsen F R IY D R IH K S AH N
+friedrick F R IY D R IH K
+friedsam F R IY D S AE M
+friedson F R IY D S AH N
+friedt F R IY D T
+friel F R IY L
+frieling F R IY L IH NG
+frieman F R IY M AH N
+friend F R EH N D
+friend's F R EH N D Z
+friend's(2) F R EH N Z
+friendlier F R EH N D L IY ER
+friendlier(2) F R EH N L IY ER
+friendliest F R EH N D L IY AH S T
+friendliest(2) F R EH N L IY AH S T
+friendliness F R EH N D L IY N IH S
+friendliness(2) F R EH N L IY N IH S
+friendly F R EH N D L IY
+friendly's F R EH N D L IY Z
+friendly's(2) F R EH N L IY Z
+friendly(2) F R EH N L IY
+friends F R EH N D Z
+friends' F R EH N D Z
+friends'(2) F R EH N Z
+friends(2) F R EH N Z
+friendship F R EH N D SH IH P
+friendship(2) F R EH N SH IH P
+friendships F R EH N D SH IH P S
+friendships(2) F R EH N SH IH P S
+frier F R AY ER
+frierson F R IH R S AH N
+fries F R AY Z
+friese F R IY Z
+friesen F R IY S AH N
+friesenhahn F R IY S IH N HH AH N
+friesner F R IY S N ER
+frieson F R IY Z AH N
+friess F R IY S
+friesz F R IY SH
+frieze F R IY Z
+friezes F R IY Z IH Z
+frigate F R IH G AH T
+frigate's F R IH G AH T S
+frigates F R IH G AH T S
+fright F R AY T
+frighten F R AY T AH N
+frightened F R AY T AH N D
+frightening F R AY T AH N IH NG
+frightening(2) F R AY T N IH NG
+frighteningly F R AY T AH N IH NG L IY
+frightens F R AY T AH N Z
+frightful F R AY T F AH L
+frightfully F R AY T F AH L IY
+frigid F R IH JH AH D
+frigo F R IY G OW
+frigon F R IH G AH N
+friis F R IY Z
+frikkie F R IH K IY
+fril F R IH L
+friley F R IH L IY
+frill F R IH L
+frills F R IH L Z
+frilly F R IH L IY
+fringe F R IH N JH
+fringer F R IH N JH ER
+fringes F R IH N JH IH Z
+frink F R IH NG K
+friona F R IY OW N AH
+frisa F R IY Z AH
+frisbee F R IH S B IY
+frisbie F R IH S B IY
+frisby F R IH S B IY
+frisch F R IH SH
+friscia F R IY S CH AH
+frisco F R IY S K OW
+frisella F R IH S EH L AH
+frishman F R IH SH M AH N
+frisina F R IY S IY N AH
+frisinger F R IH S IH N JH ER
+frisk F R IH S K
+friske F R IH S K
+frisked F R IH S K T
+friskin F R IH S K IH N
+frisky F R IH S K IY
+frison F R IH S AH N
+frist F R IH S T
+fristoe F R IH S T OW
+fritch F R IH CH
+fritcher F R IH CH ER
+fritchman F R IH CH M AH N
+frith F R IH TH
+frito F R IY T OW
+fritos F R IY T OW Z
+frits F R IH T S
+fritsch F R IH CH
+fritsche F R IH CH
+fritter F R IH T ER
+frittered F R IH T ER D
+frittering F R IH T ER IH NG
+fritts F R IH T S
+fritz F R IH T S
+fritze F R IH T Z
+fritzen F R IH T Z AH N
+fritzi F R IY T Z IY
+fritzie F R IH T Z IY
+fritzinger F R IH T Z IH NG ER
+fritzler F R IH T S L ER
+fritzsche F R IH T Z SH
+fritzsche(2) F R IH T SH
+fritzsche(3) F R IH CH
+frivolity F R AH V AA L AH T IY
+frivolous F R IH V AH L AH S
+frivolously F R IH V AH L AH S L IY
+frix F R IH K S
+frizell F R IH Z AH L
+frizzell F R IH Z AH L
+fro F R OW
+froberg F R OW B ER G
+frock F R AA K
+frocks F R AA K S
+froder F R OW D ER
+froedge F R OW JH
+froehlich F R OW L IH K
+froelich F R OW L IH K
+froemming F R OW M IH NG
+froese F R OW S
+frog F R AA G
+frog's F R AA G Z
+frogg F R AA G
+frogge F R AA G
+frogman F R AA G M AE N
+frogmen F R AA G M IH N
+frogmouth F R AA G M AW TH
+frogmouths F R AA G M AW TH S
+frogmouths(2) F R AA G M AW DH Z
+frogs F R AA G Z
+froh F R OW
+frohlich F R OW L IH K
+frohman F R OW M AH N
+frohn F R AA N
+frohnmayer F R AO N M AY ER
+froio F R OW IY OW
+frolic F R AA L IH K
+frolicking F R AA L IH K IH NG
+frolo F R OW L OW
+from F R AH M
+from(2) F ER M
+froman F R OW M AH N
+frombuger F R OW M B Y UW G ER
+frombuger's F R OW M B Y UW G ER Z
+frome F R OW M
+fromer F R OW M ER
+fromm F R AA M
+fromme F R AA M
+frommelt F R AA M IH L T
+frommer F R AA M ER
+fromstein F R AA M S T IY N
+fromstein(2) F R AA M S T AY N
+fronczak F R AA N CH AE K
+frond F R AA N D
+fronde F R AA N D
+fronds F R AA N D Z
+fronek F R OW N IH K
+froning F R OW N IH NG
+fronk F R AA NG K
+front F R AH N T
+front's F R AH N T S
+frontage F R AH N T IH JH
+frontal F R AH N T AH L
+fronted F R AH N T IH D
+frontera F R OW N T EH R AH
+fronterhouse F R AH N T ER HH AW S
+frontier F R AH N T IH R
+frontier's F R AH N T IH R Z
+frontiere F R AA N T Y EH R
+frontieres F R AA N T Y EH R Z
+frontiers F R AH N T IH R Z
+fronting F R AH N T IH NG
+frontline F R AH N T L AY N
+frontline's F R AH N T L AY N Z
+frontrunner F R AH N T R AH N ER
+frontrunners F R AH N T R AH N ER Z
+fronts F R AH N T S
+frontz F R AA N T S
+frosch F R AO SH
+fross F R AO S
+frost F R AO S T
+frostban F R AO S T B AE N
+frostbite F R AO S T B AY T
+frostbitten F R AO S T B IH T AH N
+frosted F R AO S T AH D
+frosted(2) F R AO S T IH D
+frosting F R AO S T IH NG
+frostings F R AO S T IH NG Z
+frosts F R AO S T S
+frosty F R AO S T IY
+froth F R AO TH
+frothiness F R AO TH IY N IH S
+frothingham F R AO TH IH NG HH AE M
+froths F R AO TH S
+frothy F R AO TH IY
+frown F R AW N
+frowned F R AW N D
+frownfelter F R AW N F EH L T ER
+frowning F R AW N IH NG
+frowningly F R AW N IH NG L IY
+frowns F R AW N Z
+froylan F R OY L AH N
+froze F R OW Z
+frozen F R OW Z AH N
+frucher F R UW K ER
+fruchey F R AH CH IY
+fruchter F R AH K T ER
+fruchtman F R AH K T M AH N
+fructose F R AH K T OW S
+frueh F R UW
+fruehauf F R UW HH AO F
+fruehling F R UW L IH NG
+frugal F R UW G AH L
+frugality F R UW G AE L AH T IY
+frugally F R UW G AH L IY
+fruge F R UW JH
+fruin F R UW IH N
+fruit F R UW T
+fruitcake F R UW T K EY K
+fruitcakes F R UW T K EY K S
+fruitful F R UW T F AH L
+fruiting F R UW T IH NG
+fruition F R UW IH SH AH N
+fruitless F R UW T L AH S
+fruitlessly F R UW T L AH S L IY
+fruitopia F R UW T OW P IY AH
+fruits F R UW T S
+fruity F R UW T IY
+frum F R AH M
+frumkin F R AH M K IH N
+frump F R AH M P
+frumpy F R AH M P IY
+frunze F R AH N Z
+frusen F R UW Z AH N
+frush F R AH SH
+frustrate F R AH S T R EY T
+frustrated F R AH S T R EY T AH D
+frustrates F R AH S T R EY T S
+frustrating F R AH S T R EY T IH NG
+frustratingly F R AH S T R EY T IH NG L IY
+frustration F R AH S T R EY SH AH N
+frustrations F R AH S T R EY SH AH N Z
+frutchey F R AH CH IY
+fruth F R UW TH
+frutiger F R AH T IH G ER
+fry F R AY
+fry's F R AY Z
+fryar F R AY ER
+fryberger F R AY B ER G ER
+frye F R AY
+fryer F R AY ER
+fryers F R AY ER Z
+frying F R AY IH NG
+fryling F R AY L IH NG
+fryman F R AY M AH N
+frymire F R IH M AY R
+frymire(2) F R IY M AY R
+fryrear F R AY R IH R
+frysinger F R IH S IH N JH ER
+fs F S
+fs(2) EH F EH S
+fsi F S IY
+fthenakis F TH EH N AA K IH S
+fu F UW
+fua F UW AH
+fucci F UW CH IY
+fuchs F Y UW K S
+fuchsias F Y UW SH AH Z
+fuck F AH K
+fucked F AH K T
+fucker F AH K ER
+fuckers F AH K ER Z
+fucking F AH K IH NG
+fucks F AH K S
+fudala F UW D AA L AH
+fuddrucker F AH D R AH K ER
+fuddruckers F AH D R AH K ER Z
+fuddy F AH D IY
+fudge F AH JH
+fudged F AH JH D
+fudging F AH JH IH NG
+fudgy F AH JH IY
+fudo F Y UW D OW
+fudosan F Y UW D AH S AA N
+fuel F Y UW AH L
+fuel's F Y UW AH L Z
+fuel(2) F Y UW L
+fueled F Y UW AH L D
+fueling F Y UW L IH NG
+fuelled F Y UW AH L D
+fuelling F Y UW L IH NG
+fuels F Y UW AH L Z
+fuente F W EH N T EY
+fuentes F W EH N T EY Z
+fuentez F W EH N T EY Z
+fuer F Y UW R
+fuerst F W EH R S T
+fuerstenberg F UH R S T AH N B ER G
+fuerth F W ER TH
+fugard F Y UW G AA R D
+fugate F AH G EY T
+fugazy F Y UW G AH Z IY
+fuge F Y UW JH
+fugere F Y UW G ER
+fugett F Y UW JH IH T
+fugitive F Y UW JH AH T IH V
+fugitive(2) F Y UW JH IH T IH V
+fugitives F Y UW JH IH T IH V Z
+fugitt F Y UW JH IH T
+fugotsten F Y UW G AO T S T EH N
+fugue F Y UW G
+fugues F Y UW G Z
+fuhr F UH R
+fuhrer F UH R ER
+fuhrman F UH R M AH N
+fuhrman's F UH R M AH N Z
+fuhrmann F UH R M AH N
+fuhrmann's F UH R M AH N Z
+fuhrmans F UH R M AH N Z
+fuhs F AH S
+fuji F UW JH IY
+fuji's F UW JH IY Z
+fujian F UW JH IY AH N
+fujii F UW JH IY IY
+fujikawa F UW JH IY K AA W AH
+fujikura F UW JH IH K UW R AH
+fujimori F UW JH IY M AO R IY
+fujimori's F UW JH IY M AO R IY Z
+fujimoto F UW JH IY M OW T OW
+fujio F UW JH IY OW
+fujioka F UW JH IY OW K AH
+fujis F Y UW JH IH S
+fujisankei F UW JH IH S AA NG K EY
+fujisawa F UW JH IH S AA W AH
+fujita F UW JH IY T AH
+fujitsu F UW JH IH T S UW
+fujitsu's F UW JH IH T S UW Z
+fujiwara F UW JH IY W AA R AH
+fujiya F UW JH IY Y AH
+fujiyama F UW JH IY Y AA M AH
+fuke F UW K
+fuklah F UW K L AH
+fuklah's F UW K L AH Z
+fukowoka F UW K OW W AO K AH
+fukuda F UW K UW D AH
+fukui F UW K UW IY
+fukumoto F UW K UW M OW T OW
+fukunaga F UW K UW N AA G AH
+fukuoka F UW K UW OW K AH
+fukushima F UW K UW SH IY M AH
+fukuyama F UW K UW Y AA M AH
+fulani F UW L AA N IY
+fulbright F UH L B R AY T
+fulcher F UH L CH ER
+fulco F UH L K OW
+fulcrum F UH L K R AH M
+fuld F UH L D
+fulenwider F Y UW L IH N W AY D ER
+fulfer F UH L F ER
+fulfill F UH L F IH L
+fulfilled F UH L F IH L D
+fulfilling F UH L F IH L IH NG
+fulfillment F UH L F IH L M AH N T
+fulfills F UH L F IH L Z
+fulford F UH L F ER D
+fulgencio F AH L JH EH N S IY OW
+fulgham F AH L G AH M
+fulghum F AH L G AH M
+fulginiti F UH L JH IH N IH T IY
+fulk F AH L K
+fulkerson F AH L K ER S AH N
+fulks F AH L K S
+full F UH L
+full's F UH L Z
+full-size F UH L S AY Z
+full-sized F UH L S AY Z D
+fullam F UH L AH M
+fullard F UH L ER D
+fullback F UH L B AE K
+fullbacks F UH L B AE K S
+fullbright F UH L B R AY T
+fullen F UH L AH N
+fullenkamp F UH L AH N K AE M P
+fullenwider F UH L AH N W AY D ER
+fuller F UH L ER
+fuller's F UH L ER Z
+fullerton F UH L ER T AH N
+fullest F UH L AH S T
+fullfare F UH L F EH R
+fullilove F UW L IY L OW V IY
+fullington F UH L IH NG T AH N
+fullman F UH L M AH N
+fullmer F UH L M ER
+fullness F UH L N AH S
+fulltime F UH L T AY M
+fullwood F UH L W UH D
+fully F UH L IY
+fulmer F AH L M ER
+fulminate F UH L M AH N EY T
+fulmore F UH L M AO R
+fulop F UW L AH P
+fulp F UH L P
+fulsome F UH L S AH M
+fulton F UH L T AH N
+fulton's F UH L T AH N Z
+fults F UH L T S
+fultz F UH L T S
+fulvia F UH L V IY AH
+fulwider F AH L W AY D ER
+fulwiler F AH L W AY L ER
+fulwood F AH L W UH D
+fumaroles F Y UW M ER OW L Z
+fumble F AH M B AH L
+fumbled F AH M B AH L D
+fumbles F AH M B AH L Z
+fumbling F AH M B AH L IH NG
+fumbling(2) F AH M B L IH NG
+fume F Y UW M
+fumed F Y UW M D
+fumes F Y UW M Z
+fumi F UW M IY
+fumi(2) F Y UW M IY
+fumidor F Y UW M AH D AO R
+fumidors F Y UW M AH D AO R Z
+fumigate F Y UW M AH G EY T
+fumigation F Y UW M AH G EY SH AH N
+fumigation(2) F Y UW M IH G EY SH AH N
+fuming F Y UW M IH NG
+fumio F Y UW M IY OW
+fun F AH N
+funari F UW N AA R IY
+funaro F UW N AA R OW
+funaro's F UW N AA R OW Z
+funches F AH N CH IH Z
+funchess F AH N K IH S
+funck F AH NG K
+function F AH NG K SH AH N
+functional F AH NG K SH AH N AH L
+functionality F AH NG K SH AH N AE L IH T IY
+functionally F AH NG K SH AH N AH L IY
+functionally(2) F AH NG K SH N AH L IY
+functionaries F AH NG K SH AH N EH R IY Z
+functionary F AH NG K SH AH N EH R IY
+functioned F AH NG K SH AH N D
+functioning F AH NG K SH AH N IH NG
+functions F AH NG K SH AH N Z
+fund F AH N D
+fund's F AH N D Z
+fundacion F AH N D EY SH AH N
+fundacion(2) F AO N D AA SH Y OW N
+fundamental F AH N D AH M EH N T AH L
+fundamental(2) F AH N D AH M EH N AH L
+fundamentalism F AH N D AH M EH N T AH L IH Z AH M
+fundamentalism(2) F AH N D AH M EH N AH L IH Z AH M
+fundamentalist F AH N D AH M EH N T AH L IH S T
+fundamentalist(2) F AH N D AH M EH N AH L IH S T
+fundamentalists F AH N D AH M EH N T AH L IH S T S
+fundamentalists(2) F AH N D AH M EH N AH L IH S T S
+fundamentalists(3) F AH N D AH M EH N T AH L IH S
+fundamentalists(4) F AH N D AH M EH N AH L IH S
+fundamentally F AH N D AH M EH N T AH L IY
+fundamentally(2) F AH N D AH M EH N AH L IY
+fundamentals F AH N D AH M EH N T AH L Z
+fundamentals(2) F AH N D AH M EH N AH L Z
+funded F AH N D AH D
+funded(2) F AH N D IH D
+funder F AH N D ER
+funderburg F AH N D ER B ER G
+funderburk F AH N D ER B ER K
+funderburke F AH N D ER B ER K
+funders F AH N D ER Z
+funding F AH N D IH NG
+fundora F UW N D AO R AH
+fundraiser F AH N D R EY Z ER
+fundraiser's F AH N D R EY Z ER Z
+fundraisers F AH N D R EY Z ER Z
+fundraising F AH N D R EY S IH NG
+funds F AH N D Z
+funds' F AH N D Z
+funeral F Y UW N ER AH L
+funerals F Y UW N ER AH L Z
+funerary F Y UW N ER EH R IY
+funes F Y UW N Z
+fung F AH NG
+fung's F AH NG Z
+fungal F AH NG G AH L
+fungi F AH N JH AY
+fungible F AH N JH IH B AH L
+fungicide F AH N JH AH S AY D
+fungicides F AH N JH AH S AY D Z
+fungus F AH NG G AH S
+funicello F AH N AH CH EH L OW
+funk F AH NG K
+funke F AH NG K
+funkhouser F AH NG K HH AW S ER
+funks F AH NG K S
+funky F AH NG K IY
+funnel F AH N AH L
+funneled F AH N AH L D
+funneling F AH N AH L IH NG
+funneling(2) F AH N L IH NG
+funnell F AH N AH L
+funnels F AH N AH L Z
+funnest F AH N IH S T
+funnier F AH N IY ER
+funniest F AH N IY AH S T
+funniness F AH N IY N AH S
+funny F AH N IY
+funs F AH N Z
+funston F AH N S T AH N
+funtime F AH N T AY M
+fuoco F UW OW K OW
+fuoss F UW S
+fuqua F UW K W AH
+fuquay F UW K EY
+fur F ER
+furash F Y ER AE SH
+furbee F ER B IY
+furber F ER B ER
+furbish F ER B IH SH
+furbished F ER B IH SH T
+furbishes F ER B IH SH AH Z
+furbishing F ER B IH SH IH NG
+furbush F ER B UH SH
+furby F ER B IY
+furches F ER SH IY Z
+furer F Y UH R ER
+furey F Y UH R IY
+furfaro F UH R F AA R OW
+furgason F ER G AH S AH N
+furgerson F ER G ER S AH N
+furgeson F ER G IH S AH N
+furia F Y UH R IY AH
+furini F UH R IY N IY
+furini's F UH R IY N IY Z
+furino F UH R IY N OW
+furious F Y UH R IY AH S
+furiouser F Y UH R IY AH S ER
+furiously F Y UH R IY AH S L IY
+furlan F ER L AH N
+furlaud F ER L OW
+furlett F ER L EH T
+furlett(2) F ER L AH T
+furlong F ER L AO NG
+furlough F ER L OW
+furloughed F ER L OW D
+furloughs F ER L OW Z
+furlow F ER L OW
+furman F ER M AE N
+furmark F ER M AA R K
+furnace F ER N AH S
+furnaces F ER N AH S AH Z
+furnaces(2) F ER N AH S IH Z
+furnari F UH R N AA R IY
+furnas F ER N AH S
+furner F ER N ER
+furness F ER N IH S
+furney F ER N IY
+furnish F ER N IH SH
+furnished F ER N IH SH T
+furnishes F ER N IH SH AH Z
+furnishes(2) F ER N IH SH IH Z
+furnishing F ER N IH SH IH NG
+furnishings F ER N IH SH IH NG Z
+furniss F ER N IH S
+furniture F ER N IH CH ER
+furniture's F ER N IH CH ER Z
+furno F UH R N OW
+furor F Y UH R AO R
+furr F ER
+furr's F ER Z
+furrer F ER ER
+furrh F ER
+furrier F ER IY ER
+furriers F ER IY ER Z
+furrow F ER OW
+furrowed F ER OW D
+furry F ER IY
+furs F ER Z
+furse F ER S
+furst F ER S T
+furstenberg F ER S T AH N B ER G
+furtado F UH R T AA D OW
+furtak F ER T AH K
+furtaw F ER T AO
+furth F ER TH
+further F ER DH ER
+furtherance F ER TH ER AH N S
+furthered F ER DH ER D
+furthering F ER DH ER IH NG
+furthermore F ER DH ER M AO R
+furthers F ER DH ER Z
+furthest F ER TH AH S T
+furtick F ER T IH K
+furtive F ER T IH V
+furtively F ER T IH V L IY
+furukawa F UH R UW K AA W AH
+furuta F ER UW T AH
+furuya F UH R UW Y AH
+fury F Y UH R IY
+fusaro F UW S AA R OW
+fusco F UW S K OW
+fuse F Y UW Z
+fused F Y UW Z D
+fuselage F Y UW S AH L AA JH
+fuselage(2) F Y UW S AH L IH JH
+fuselages F Y UW S AH L AA JH IH Z
+fuselages(2) F Y UW S AH L IH JH IH Z
+fuselier F Y UW S L IY ER
+fuses F Y UW Z AH Z
+fuses(2) F Y UW Z IH Z
+fusible F Y UW Z AH B AH L
+fusillade F Y UW S IH L EY D
+fusilli F Y UW S IH L IY
+fusing F Y UW Z IH NG
+fusion F Y UW ZH AH N
+fusner F UW Z N ER
+fuson F UW S AH N
+fuss F AH S
+fussed F AH S T
+fussell F AH S AH L
+fusselman F AH S AH L M AH N
+fusses F AH S IH Z
+fussing F AH S IH NG
+fussner F AH S N ER
+fussy F AH S IY
+fust F AH S T
+fustat F AH S T AE T
+fustok F AH S T AA K
+fuston F AH S T AH N
+futch F AH CH
+futher F AH DH ER
+futile F Y UW T AH L
+futility F Y UW T IH L AH T IY
+futon F UW T AA N
+futons F UW T AA N Z
+futral F AH T R AH L
+futrell F Y UW T R EH L
+futterman F AH T ER M AH N
+future F Y UW CH ER
+future's F Y UW CH ER Z
+futures F Y UW CH ER Z
+futures' F Y UW CH ER Z
+futurism F Y UW CH ER IH Z AH M
+futurist F Y UW CH ER IH S T
+futuristic F Y UW CH ER IH S T IH K
+futurists F Y UW CH ER IH S T S
+futurists(2) F Y UW CH ER IH S S
+futurists(3) F Y UW CH ER IH S
+fuzes F Y UW Z IH Z
+fuzz F AH Z
+fuzzier F AH Z IY ER
+fuzzy F AH Z IY
+fye F AY
+fyfe F AY F
+fyffe F AY F
+fyffes F IH F S
+fyffes(2) F AY F S
+fyke F AY K
+fyock F Y AA K
+fyodor F Y OW D ER
+fyodor's F Y OW D ER Z
+fyodorov F Y OW D ER AO V
+fyodorov's F Y OW D ER AO V Z
+g JH IY
+g's JH IY Z
+g'vanni's JH IY OW V AA N IY Z
+g. JH IY
+g.'s JH IY Z
+g.s JH IY Z
+ga G AA
+ga(2) JH IY EY
+ga(3) JH AO R JH AH
+gaal G AA L
+gaar G AA R
+gaarder G AA R D ER
+gab G AE B
+gaba G AA B AH
+gabaldon G AA B AA L D AO N
+gabardine G AE B ER D IY N
+gabardines G AE B ER D IY N Z
+gabay G AE B EY
+gabbard G AH B AA R D
+gabbert G AE B ER T
+gabbing G AE B IH NG
+gabbro G AE B R OW
+gabbroic G AE B R OW IH K
+gabby G AE B IY
+gabe G EY B
+gabehart G EY B HH AA R T
+gabeira G AH B EY R AH
+gabel G AH B EH L
+gabele G AH B EH L EY
+gabelli G AH B EH L IY
+gaber G EY B ER
+gabert G AE B ER T
+gabhart G AE B HH AA R T
+gabie G AE B IY
+gable G EY B AH L
+gabled G EY B AH L D
+gabler G EY B AH L ER
+gabler(2) G EY B L ER
+gables G EY B AH L Z
+gabon G AH B AA N
+gabor G AH B AO R
+gaboriault G AE B ER IY OW
+gaboury G AE B UH R IY
+gabrall G EY B R AH L
+gabrall's G EY B R AH L Z
+gabriel G EY B R IY AH L
+gabriel's G EY B R IY AH L Z
+gabriela G AA B R IY EH L AH
+gabriele G AA B R IY EH L
+gabriella G AA B R IY EH L AH
+gabrielle G AE B R IY EH L
+gabrielli G AA B R IY EH L IY
+gabrielsen G AE B R IY L S AH N
+gabrielsen(2) G EY B R IY EH L S AH N
+gabrielson G AE B R IY L S AH N
+gabrielson(2) G EY B R IY EH L S AH N
+gabrowny G AH B R AW N IY
+gabrys G AE B ER IY Z
+gaby G AE B IY
+gaccione G AA K CH OW N IY
+gacek G AA CH EH K
+gach G AE CH
+gacy G EY S IY
+gacy's G EY S IY Z
+gad G AE D
+gadberry G AE D B EH R IY
+gadbois G AE D B W AA
+gadd G AE D
+gaddie G AE D IY
+gadding G AE D IH NG
+gaddis G AE D IH S
+gaddum G AE D AH M
+gaddy G AE D IY
+gade G EY D
+gadflies G AE D F L AY Z
+gadfly G AE D F L AY
+gadget G AE JH AH T
+gadget's G AE JH AH T S
+gadgetry G AE JH AH T R IY
+gadgets G AE JH AH T S
+gadhafi G AH D AA F IY
+gadhafi's G AH D AA F IY Z
+gadhafi's(2) G AH D HH AA F IY Z
+gadhafi(2) G AH D HH AA F IY
+gadomski G AH D AA M S K IY
+gadoury G AE D UH R IY
+gads G AE D Z
+gadsby G AE D Z B IY
+gadsden G AE D Z D AH N
+gadson G AE D S AH N
+gadway G AE D W EY
+gadzinski G AH JH IH N S K IY
+gae G AY
+gaea G IY AH
+gaebel G EH B AH L
+gaede G IY D
+gael G EY L
+gaelic G EY L IH K
+gaertner G EH R T N ER
+gaeta G IY T AH
+gaetano G AY T AA N OW
+gaeth G IY TH
+gaetz G IY T S
+gaf G AE F
+gaff G AE F
+gaffe G AE F
+gaffes G AE F S
+gaffey G AE F IY
+gaffin G AE F IH N
+gaffney G AE F N IY
+gafford G AE F ER D
+gag G AE G
+gagan G EY G AH N
+gagarin G AH G AE R AH N
+gage G EY JH
+gagel G AE G AH L
+gagen G AE G AH N
+gager G EY G ER
+gagged G AE G D
+gaggle G AE G AH L
+gagliano G AA G L IY AA N OW
+gagliano(2) G AE G L IY AA N OW
+gagliardi G AA G L IY AA R D IY
+gagliardi(2) G AE G L IY AA R D IY
+gagliardo G AA G L IY AA R D OW
+gagliardo(2) G AE G L IY AA R D OW
+gaglio G AE G L IY OW
+gaglione G AA G L IY OW N IY
+gaglione(2) G AE G L IY OW N IY
+gagne G EY N IY
+gagne(2) G AE G N IY
+gagner G AE G N ER
+gagnier G AE G N IY ER
+gagnon G AE N Y AH N
+gags G AE G Z
+gahagan G AA HH AA G AA N
+gahan G AE HH AH N
+gahli G AA L IY
+gahm G AE M
+gahn G AE N
+gahr G AA R
+gai G EY
+gaia G AY AH
+gaidar G AY D AA R
+gaidar's G AY D AA R Z
+gaier G EY ER
+gaige G EY JH
+gail G EY L
+gail's G EY L Z
+gaile G EY L
+gailey G EY L IY
+gaillard G EY L ER D
+gaily G EY L IY
+gain G EY N
+gained G EY N D
+gainer G EY N ER
+gainers G EY N ER Z
+gaines G EY N Z
+gainesville G EY N Z V IH L
+gainey G EY N IY
+gainful G EY N F AH L
+gainfully G EY N F AH L IY
+gaining G EY N IH NG
+gainor G EY N ER
+gainous G EY N AH S
+gains G EY N Z
+gainsay G EY N S EY
+gainsboro G EY N Z B ER OW
+gainsco G EY N S K OW
+gair G EH R
+gaiser G EY Z ER
+gait G EY T
+gaitan G AY T AA N
+gaiter G EY T ER
+gaither G EY TH ER
+gaithersburg G EY TH ER Z B ER G
+gaitskill G EY T S K IH L
+gajda G AY D AH
+gajewski G AY EH F S K IY
+gal G AE L
+gala G AE L AH
+gala(2) G EY L AH
+galactic G AH L AE K T IH K
+galactose G AH L AE K T OW S
+galahad G AE L AH HH AE D
+galambos G AA L AA M B OW Z
+galan G EY L AH N
+galane G AH L EY N
+galang G AE L AH NG
+galanis G AH L AA N IH S
+galanos G AH L AA N OW S
+galant G AA L AH N T
+galante G AA L AA N T IY
+galanter G AH L AE N T ER
+galanti G AH L AE N T IY
+galapagos G AH L AA P AH G OW Z
+galarneau G AE L AA R N OW
+galarza G AH L AA R Z AH
+galas G EY L AH Z
+galasie G AE L AH S IY
+galassi G AA L AA S IY
+galasso G AA L AA S OW
+galatas G AA L AA T AA Z
+galatea G AE L AH T IY AH
+galati G AA L AA T IY
+galaviz G AE L AH V IH Z
+galax G AE L AE K S
+galaxies G AE L AH K S IY Z
+galaxy G AE L AH K S IY
+galaxy's G AE L AH K S IY Z
+galban G AE L B AH N
+galbo G AE L B OW
+galbraith G AE L B R EY TH
+galbreath G AE L B R EH TH
+gale G EY L
+gale's G EY L Z
+galea G EY L IY AH
+galeano G AA L IY N OW
+galeb G AE L AH B
+galeb(2) G EY L AH B
+galebs G AE L AH B Z
+galebs(2) G EY L AH B Z
+galef G AE L AH F
+galen G EY L AH N
+galen's G EY L AH N Z
+galena G AH L IY N AH
+galenical G AH L EH N IH K AH L
+galentine G AA L EH N T IY N IY
+galer G EY L ER
+galeria G AE L ER IY AH
+galerias G AE L ER IY AH Z
+galeries G AE L ER IY Z
+galernter G AH L ER N T ER
+gales G EY L Z
+galesburg G EY L Z B ER G
+galesi G AH L EH S IY
+galey G EY L IY
+galford G AE L F ER D
+galgano G AA L G AA N OW
+gali G AA L IY
+gali's G AA L IY Z
+galiano G AA L IY AA N OW
+galicia G AH L IH SH IY AH
+galie G EY L IY
+galiena G AA L IY N AH
+galik G AE L IH K
+galilean G AE L AH L IY AH N
+galilee G AE L AH L IY
+galileo G AE L AH L IY OW
+galileo's G AE L AH L IY OW Z
+galileo's(2) G AE L AH L EY OW Z
+galileo(2) G AE L AH L EY OW
+galin G AE L IH N
+galina G AH L IY N AH
+galindo G AA L IY N D OW
+galinski G AH L IH N S K IY
+galinsky G AH L IH N S K IY
+galioto G AA L IY OW T OW
+galipault G AE L IH P AO L T
+galipault(2) G AE L IH P OW
+galipeau G AE L IH P OW
+galitsin G AH L IH T S IH N
+galka G AE L K AH
+gall G AO L
+galla G AE L AH
+gallacher G AE L AH K ER
+gallager G AO L IH JH ER
+gallagher G AE L AH G ER
+gallahan G AE L AH HH AE N
+gallaher G AE L AH HH ER
+gallamore G AA L AA M AO R
+galland G AE L AH N D
+gallant G AE L AH N T
+gallantly G AE L AH N T L IY
+gallantry G AE L AH N T R IY
+gallard G AH L AA R D
+gallardo G AA L AA R D OW
+gallas G AE L AH Z
+gallatin G AE L AH T IH N
+gallaudet G AE L AH D EH T
+gallaway G AO L AH W EY
+gallbladder G AO L B L AE D ER
+galle G EY L
+galle(2) G AE L EY
+gallego G AA L EH G OW
+gallegos G AE L IH G OW Z
+gallemore G AA L EH M AO R
+gallen G AO L AH N
+gallentine G AA L EH N T IY N IY
+galleon G AE L IY AH N
+galleons G AE L IY AH N Z
+galler G AO L ER
+gallerani G AA L ER AA N IY
+galleria G AE L ER IY AH
+galleries G AE L ER IY Z
+gallery G AE L ER IY
+gallery's G AE L ER IY Z
+galles G EY L Z
+gallet G AE L IH T
+galletti G AA L EH T IY
+galley G AE L IY
+galleys G AE L IY Z
+galli G AE L IY
+gallia G AE L Y AH
+galliano G AA L IY AA N OW
+gallic G AE L IH K
+gallick G AE L IH K
+gallien G AH L IY N
+gallier G AE L IY ER
+galligan G AE L IH G AH N
+galliher G AE L IH HH ER
+gallik G AE L IH K
+gallimard G AE L IH M ER D
+gallimore G AA L IY M AO R
+gallina G AA L IY N AH
+galling G AO L IH NG
+gallinger G AO L IH NG ER
+gallinsky G AH L IH N S K IY
+gallion G AE L Y AH N
+gallium G AE L IY AH M
+gallivan G AE L IH V AH N
+gallman G AO L M AH N
+gallo G AE L OW
+gallo's G AE L OW Z
+gallogly G AE L AH G L IY
+gallon G AE L AH N
+gallons G AE L AH N Z
+galloon G AH L UW N
+gallop G AE L AH P
+galloped G AE L AH P T
+galloping G AE L AH P IH NG
+gallos G AE L OW Z
+gallow G AE L OW
+galloway G AE L OW W EY
+galloways G AE L OW W EY Z
+gallows G AE L OW Z
+galls G AO L Z
+gallstone G AO L S T OW N
+gallstones G AA L S T OW N Z
+gallstones(2) G AO L S T OW N Z
+gallucci G AA L UW CH IY
+galluccio G AA L UW CH IY OW
+gallup G AE L AH P
+gallus G AE L AH S
+galluzzo G AA L UW Z OW
+gallway G AO L W EY
+galoob G AH L UW B
+galoob's G AH L UW B Z
+galore G AH L AO R
+galosh G AH L AA SH
+galoshes G AH L AA SH AH Z
+galoshes(2) G AH L AA SH IH Z
+galotti G AH L AA T IY
+galpin G AE L P IH N
+gals G AE L Z
+galster G AE L S T ER
+galsworthy G AE L Z W ER DH IY
+galt G AO L T
+galton G AE L T AH N
+galudet G AE L Y UW D EH T
+galus G AE L IH S
+galusha G AE L AH SH AH
+galuska G AH L AH S K AH
+galvan G AA L V AA N
+galvanic G AE L V AE N IH K
+galvanize G AE L V AH N AY Z
+galvanized G AE L V AH N AY Z D
+galvanizes G AE L V AH N AY Z AH Z
+galvanizing G AE L V AH N AY Z IH NG
+galven G AA L V AH N
+galveston G AE L V AH S T AH N
+galvez G AA L V EH Z
+galvin G AE L V IH N
+galvin's G AE L V IH N Z
+galway G AA L W EY
+galyean G AE L IY AH N
+galyen G AE L IY EH N
+galyon G AE L IY AA N
+gama G AA M AH
+gamache G AA M EY K
+gamage G AE M IH JH
+gamal G AH M AA L
+gamba G AE M B AH
+gambale G AA M B AA L IY
+gambardella G AA M B AA R D EH L AH
+gamber G AE M B ER
+gambia G AE M B IY AH
+gambill G AH M B IH L
+gambino G AE M B IY N OW
+gambit G AE M B IH T
+gambits G AE M B AH T S
+gamble G AE M B AH L
+gamble's G AE M B AH L Z
+gambled G AE M B AH L D
+gambler G AE M B L ER
+gambler's G AE M B L ER Z
+gamblers G AE M B L ER Z
+gambles G AE M B AH L Z
+gamblin G AE M B L IH N
+gambling G AE M B AH L IH NG
+gambling's G AE M B L IH NG Z
+gambling(2) G AE M B L IH NG
+gamboa G AA M B OW AH
+gambone G AA M B OW N
+gambrel G AE M B R AH L
+gambrell G AE M B R AH L
+gambrill G AE M B R IH L
+gambro G AE M B R OW
+gamco G AE M K OW
+game G EY M
+game's G EY M Z
+gamecock G EY M K AO K
+gamecocks G EY M K AO K S
+gamekeeper G EY M K IY P ER
+gamekeepers G EY M K IY P ER S
+gamel G AA M AH L
+gamelin G AE M IH L IH N
+gamelin(2) G AE M L IH N
+gamello G AH M EH L OW
+gamely G EY M L IY
+gamer G EY M ER
+gamers G EY M ER Z
+games G EY M Z
+games' G EY M Z
+gameshow G EY M SH OW
+gameshows G EY M SH OW Z
+gamesman G EY M Z M AE N
+gamesmanship G EY M Z M AH N SH IH P
+gamest G EY M AH S T
+gamet G AE M IH T
+gametangia G AE M AH T AE N JH IY AH
+gamete G AE M IY T
+gamete(2) G AH M IY T
+gametophyte G AH M IY T AH F AY T
+gamez G AA M EH Z
+gaming G EY M IH NG
+gaming's G EY M IH NG Z
+gamino G AA M IY N OW
+gamm G AE M
+gamma G AE M AH
+gammage G AE M IH JH
+gammal G AH M AA L
+gammel G AE M AH L
+gammell G AE M AH L
+gammill G AE M IH L
+gammon G AE M AH N
+gammons G AE M AH N Z
+gamons G AE M AH N Z
+gamp G AE M P
+gamper G AE M P ER
+gamsakhurdia G AE M S AH K ER D IY AH
+gamsakhurdia(2) G AE M S AH K ER D Y AH
+gamunde G AH M UW N D
+gamunde's G AH M UW N D Z
+gamut G AE M AH T
+gan G AE N
+gananoque G AH N AE N AH K
+ganas G AE N AH Z
+ganatieuganauf G AH N EY SH AH G AE N AH L F
+ganaway G AE N AH W EY
+gancarz G AA N K AA R Z
+ganci G AE N S IY
+ganda G AE N D AH
+gandalf G AE N D AO L F
+gandalf's G AE N D AO L F S
+gandara G AA N D AA R AH
+gandee G AE N D IY
+gander G AE N D ER
+ganders G AE N D ER Z
+gandhi G AA N D IY
+gandhi's G AA N D IY Z
+gandolfi G AA N D OW L F IY
+gandolfo G AA N D OW L F OW
+gandy G AE N D IY
+ganem G AE N IH M
+ganes G EY N Z
+ganey G EY N IY
+gang G AE NG
+gang's G AE NG Z
+gangbanger G AE NG B AE NG G ER
+gangbangers G AE NG B AE NG G ER Z
+gangbuster G AE NG B AH S T ER
+gangbusters G AE NG B AH S T ER Z
+gange G AE N JH
+gangemi G AA NG G EH M IY
+ganger G AE NG ER
+ganges G AE N JH IY Z
+gangi G AE N JH IY
+ganging G AE NG IH NG
+gangl G AE NG G AH L
+ganglia G AE NG G L IY AH
+ganglionic G AE NG G L IY AA N IH K
+gangloff G AE NG G L AO F
+gangly G AE NG L IY
+gangplank G AE NG P L AE NG K
+gangrene G AE N G R IY N
+gangs G AE NG Z
+gangsta G AE NG S T AH
+gangster G AE NG S T ER
+gangsters G AE NG S T ER Z
+gangwer G AE NG W ER
+ganic G AE N IH K
+ganim G AE N IH M
+ganis G AE N IH S
+ganley G AE N L IY
+gann G AE N
+gannaway G AE N AH W EY
+gannett G AE N IH T
+gannett's G AE N AH T S
+gannon G AE N AH N
+gano G AA N OW
+ganoe G AE N OW
+ganong G AE N AO NG
+gans G AE N Z
+gansen G AE N S AH N
+ganser G AE N S ER
+ganske G AE N S K
+ganson G AE N S AH N
+ganster G AE N S T ER
+gant G AE N T
+gantenbein G AE N T IH N B AY N
+ganter G AE N T ER
+gantlet G AO N T L AH T
+gantner G AE N T N ER
+gantos G AE N T OW S
+gantry G AE N T R IY
+gantt G AE N T
+gantz G AE N T S
+ganus G EY N IH S
+ganymede G AE N AH M IY D
+ganz G AE N Z
+ganzel G AE N Z AH L
+ganzer G AE N Z ER
+gaona G AA OW N AH
+gap G AE P
+gap's G AE P S
+gape G EY P
+gaping G EY P IH NG
+gapinski G AH P IH N S K IY
+gapp G AE P
+gappa G AE P AH
+gaps G AE P S
+gar G AA R
+gara G AE R AH
+garabedian G AE R AH B IY D IY AH N
+garafalo G AA R AA F AA L OW
+garafola G AA R AA F OW L AH
+garage G ER AA ZH
+garages G ER AA ZH IH Z
+garagiola G ER AE JH IY OW L AH
+garagiola(2) G EH R AH JH IY OW L AH
+garajda G ER AA ZH D AH
+garajda's G ER AA ZH D AH Z
+garajda's(2) G AO R AA ZH D AH Z
+garajda(2) G AO R AA ZH D AH
+garamendi G EH R AH M EH N D IY
+garamendi's G EH R AH M EH N D IY Z
+garand G AE R AH N D
+garant G AA R AH N T
+garard G ER AA R D
+garavaglia G AA R AA V AA G L IY AH
+garay G AE R EY
+garb G AA R B
+garbacz G AA R B AH CH
+garbage G AA R B IH JH
+garbarini G AA R B AA R IY N IY
+garbarino G AA R B AA R IY N OW
+garbe G AA R B
+garbed G AA R B D
+garber G AA R B ER
+garbers G AA R B ER Z
+garbett G AA R B IH T
+garble G AA R B AH L
+garbled G AA R B AH L D
+garbles G AA R B AH L Z
+garbling G AA R B L IH NG
+garbo G AA R B OW
+garbutt G AA R B AH T
+garceau G AA R S OW
+garces G AA R S EH S
+garcetti G AA R CH EH T IY
+garcetti's G AA R CH EH T IY Z
+garcia G AA R S IY AH
+garcia's G AA R S IY AH Z
+garcias G AA R S IY AH Z
+garczynski G ER CH IH N S K IY
+gard G AA R D
+garda G AA R D AH
+garde G AA R D
+gardea G AA R D IY AH
+gardella G AA R D EH L AH
+garden G AA R D AH N
+garden's G AA R D AH N Z
+gardena G AA R D IY N AH
+gardenamerica G AA R D AH N AH M EH R IH K AH
+gardened G AA R D AH N D
+gardener G AA R D AH N ER
+gardener's G AA R D AH N ER Z
+gardeners G AA R D AH N ER Z
+gardeners(2) G AA R D N ER Z
+gardenhire G AA R D AH N HH AY R
+gardenia G AA R D IY N Y AH
+gardenias G AA R D IY N Y AH Z
+gardening G AA R D AH N IH NG
+gardening(2) G AA R D N IH NG
+gardens G AA R D AH N Z
+gardin G AA R D IH N
+gardiner G AA R D N ER
+gardini G AA R D IY N IY
+gardini's G AA R D IY N IY Z
+gardinier G AA R D IH N IY ER
+gardinier(2) G AA R D IH N Y ER
+gardner G AA R D N ER
+gardner's G AA R D N ER Z
+gardolin G AA R D OW L IH N
+gardolin's G AA R D OW L IH N Z
+garduno G AA R D UW N OW
+gardyne G AA R D AY N
+gare G EH R
+gareau G ER OW
+gared G AE R AH D
+garelick G AE R IH L IH K
+gareth G EH R IH TH
+garett G AE R IH T
+garey G AE R IY
+garfield G AA R F IY L D
+garfinkel G AA R F IH NG K AH L
+garfinkle G AA R F IH NG K AH L
+garfunkel G AA R F AH NG K AH L
+garg G AA R G
+gargan G AA R G AH N
+gargano G AA R G AA N OW
+gargantuan G AA R G AE N CH UW AH N
+garger G AA R G ER
+garges G AA R JH IH Z
+gargill G AA R JH IH L
+gargis G AA R G IH S
+gargiulo G AA R JH UW L OW
+gargoyle G AA R G OY L
+gargoyles G AA R G OY L Z
+garguilo G AA R G W IY L OW
+gargus G AA R G AH S
+gari G AA R IY
+garibaldi G AE R AH B AO L D IY
+garibay G AE R IH B EY
+gariepy G ER IY P IY
+garin G EH R IH N
+garing G EH R IH NG
+garinger G EH R IH NG ER
+garis G AE R IH S
+garish G EH R IH SH
+garissa G AH R IH S AH
+garity G AE R IH T IY
+garl G AA R L
+garlan G AA R L AH N
+garland G AA R L AH N D
+garlic G AA R L IH K
+garlick G AA R L IH K
+garlicky G AA R L IH K IY
+garling G AA R L IH NG
+garlinger G AA R L IH NG ER
+garlinghouse G AA R L IH NG HH AW S
+garlington G AA R L IH NG T AH N
+garlitz G AA R L IH T S
+garlock G AA R L AH K
+garlow G AA R L OW
+garman G AA R M AH N
+garmany G ER M AO N IY
+garment G AA R M AH N T
+garments G AA R M AH N T S
+garmon G AA R M AH N
+garmond G AA R M AH N D
+garms G AA R M Z
+garmund G AA R M AH N D
+garn G AA R N
+garneau G AA R N OW
+garnell G AA R N EH L
+garner G AA R N ER
+garnered G AA R N ER D
+garnering G AA R N ER IH NG
+garners G AA R N ER Z
+garnes G AA R N Z
+garnet G AA R N AH T
+garnett G AA R N IH T
+garnette G AA R N EH T
+garney G AA R N IY
+garnica G AA R N IY K AH
+garnier G AA R N IY ER
+garnish G AA R N IH SH
+garnished G AA R N IH SH T
+garnishes G AA R N IH SH AH Z
+garnishment G AA R N IH SH M AH N T
+garno G AA R N OW
+garnock G AA R N AH K
+garnsey G AA R N S IY
+garo G EH R OW
+garofalo G AA R OW F AA L OW
+garofano G AA R OW F AA N OW
+garofolo G EH R AH F OW L AH
+garols G AE R AO L Z
+garon G AA R AO N
+garone G ER OW N
+garonzik G ER AA N Z IH K
+garoutte G ER UW T
+garp G AA R P
+garp's G AA R P S
+garps G AA R P S
+garr G AE R
+garrabrant G AA R AA B R AH N T
+garrahan G AE R AH HH AE N
+garramone G AE R AH M OW N
+garrard G AE R ER D
+garratt G EH R AH T
+garraway G AE R AH W EY
+garrell G AA R EY L
+garrels G AE R AH L Z
+garrelts G AE R IH L T S
+garren G AA R AH N
+garret G EH R IH T
+garret's G EH R AH T S
+garrets G EH R AH T S
+garretson G AE R IH T S AH N
+garrett G AE R IH T
+garrett's G AE R IH T Z
+garrett's(2) G EH R IH T Z
+garrett(2) G EH R IH T
+garrette G ER EH T
+garrey G AE R IY
+garrick G EH R IH K
+garrido G AA R IY D OW
+garrido-luna G AA R IY D OW L UW N AH
+garriga G AE R IH G AH
+garrigan G AE R IH G AH N
+garrigues G AA R IY G EH S
+garrigus G AA R IY G IH S
+garringer G AE R IH NG ER
+garriott G AE R IY AH T
+garris G AE R IH S
+garrison G AE R IH S AH N
+garrisoned G AE R AH S AH N D
+garritano G AA R IY T AA N OW
+garritt G AE R IH T
+garrity G EH R IH T IY
+garro G AA R OW
+garrod G AE R AH D
+garrol G AE R AH L
+garrols G AE R AH L Z
+garron G AE R AH N
+garron's G EH R AH N Z
+garros G EH R OW S
+garrott G AE R AH T
+garrow G EH R OW
+garroway G AE R OW W EY
+garroz G AE R AH Z
+garrulous G EH R AH L AH S
+garry G AE R IY
+garry(2) G EH R IY
+gars G AA R Z
+garside G AA R S AY D
+garske G AA R S K
+garson G AA R S AH N
+garst G AA R S T
+garsten G AA R S T EH N
+garsten's G AA R S T EH N Z
+garstin G AA R S T AH N
+garstka G AA R S T K AH
+garston G AA R S T AH N
+garten G AA R T AH N
+gartenberg G AA R T AH N B ER G
+garter G AA R T ER
+garters G AA R T ER Z
+garth G AA R TH
+garthwaite G AA R TH W EY T
+gartin G AA R T IH N
+gartland G AA R T L AH N D
+gartley G AA R T L IY
+gartman G AA R T M AH N
+gartmore G AA R T M AO R
+gartner G AA R T N ER
+garton G AA R T AH N
+gartrell G AA R T R AH L
+gartside G AA R T S AY D
+gartzke G AA R T S K
+gartzke(2) G AA R T S K IY
+garuda G AH R UW D AH
+garuda's G AH R UW D AH Z
+garver G AA R V ER
+garver's G AA R V ER Z
+garverick G AA R V ER IH K
+garvey G AA R V IY
+garvie G AA R V IY
+garvin G AA R V IH N
+garwin G AA R W IH N
+garwood G AA R W UH D
+gary G EH R IY
+gary's G EH R IY Z
+gary's(2) G AE R IY Z
+gary(2) G AE R IY
+garza G AA R Z AH
+garzarelli G AA R Z ER EH L IY
+garzon G AA R Z AH N
+gas G AE S
+gas's G AE S IH Z
+gasaway G AE S AH W EY
+gasbarro G AA S B AA R OW
+gasca G AA S K AH
+gascon G AE S K AH N
+gascons G AE S K AH N Z
+gase G EY Z
+gaseous G AE S IY AH S
+gases G AE S AH Z
+gases(2) G AE S IH Z
+gash G AE SH
+gashed G AE SH T
+gashes G AE SH AH Z
+gasich G EY Z IH K
+gasification G AE S AH F AH K EY SH AH N
+gasify G AE S AH F AY
+gasior G AE S IY ER
+gasiorowski G AH S IY AO R AO F S K IY
+gaska G AA S K AH
+gaskamp G AE S K AE M P
+gaskell G AE S K AH L
+gasket G AE S K AH T
+gaskets G AE S K AH T S
+gaskey G AE S K IY
+gaskill G AE S K IH L
+gaskin G AE S K IH N
+gaskins G AE S K IH N Z
+gaslight G AE S L AY T
+gasner G AE S N ER
+gasohol G AE S AH HH AO L
+gasoline G AE S AH L IY N
+gasolines G AE S AH L IY N Z
+gasp G AE S P
+gaspar G AE S P ER
+gaspara G AH S P AA R AH
+gaspard G AH S P AA R D
+gaspari G AA S P AA R IY
+gasparini G AA S P AA R IY N IY
+gasparro G AA S P AA R OW
+gaspe G AE S P IY
+gasped G AE S P T
+gasper G AE S P ER
+gasperini G AA S P ER IY N IY
+gasping G AE S P IH NG
+gasps G AE S P S
+gasque G EY S K
+gass G AE S
+gassaway G AE S AH W EY
+gassed G AE S T
+gassee G AE S IY
+gassen G AE S AH N
+gasser G AE S ER
+gassert G AE S ER T
+gasses G AE S IH Z
+gassett G AE S IH T
+gassing G AE S IH NG
+gassman G AE S M AH N
+gassmann G AE S M AH N
+gassner G AE S N ER
+gast G AE S T
+gastelli G AH S T EH L IY
+gaster G AE S T ER
+gastilum G EY S T IH L AH M
+gastineau G AE S T IH N OW
+gaston G AE S T AH N
+gaston's G AE S T AH N Z
+gastonia G AH S T OW N IY AH
+gastric G AE S T R IH K
+gastritis G AE S T R AY T AH S
+gastro G AE S T R OW
+gastrointestinal G AE S T R OW IH N T EH S T AH N AH L
+gastronomic G AH S T R AA N AA M IH K
+gastronomy G AE S T R AA N AH M IY
+gastroscope G AE S T R AH S K OW P
+gastrovascular G AE S T R OW V AE S K Y AH L ER
+gastrulate G AE S T R AH L EY T
+gastrulation G AE S T R AH L EY SH AH N
+gat G AE T
+gatch G AE CH
+gatchel G AE CH AH L
+gatchell G AE CH AH L
+gate G EY T
+gated G EY T IH D
+gatekeeper G EY T K IY P ER
+gatekeepers G EY T K IY P ER Z
+gateley G AE T IH L IY
+gateley(2) G EY T L IY
+gately G EY T L IY
+gates G EY T S
+gates' G EY T S
+gates's G EY T S IH Z
+gates's(2) G EY T S
+gateway G EY T W EY
+gateway's G EY T W EY Z
+gateways G EY T W EY Z
+gatewood G EY T W UH D
+gath G AE TH
+gather G AE DH ER
+gathered G AE DH ER D
+gatherer G AE DH ER ER
+gatherers G AE DH ER ER Z
+gathering G AE DH ER IH NG
+gatherings G AE DH ER IH NG Z
+gathers G AE DH ER Z
+gathings G AE TH IH NG Z
+gathman G AE TH M AH N
+gathright G AE TH R AY T
+gatien G EY T Y EH N
+gating G EY T IH NG
+gatley G AE T L IY
+gatliff G AE T L IH F
+gatlin G AE T L IH N
+gatling G AE T L IH NG
+gatling's G AE T L IH NG Z
+gatoil G AH T OY L
+gator G EY T ER
+gatorade G AE T ER EY D
+gators G EY T ER Z
+gatos G AA T OW S
+gatos(2) G AE T OW S
+gatos(3) G EY T OW S
+gatrell G AE T R AH L
+gatsby G AE T S B IY
+gatson G AE T S AH N
+gatt G AE T
+gatten G AE T AH N
+gatti G AE T IY
+gatting G AE T IH NG
+gattis G AE T IH S
+gattis(2) G AE T IY Z
+gatton G AE T AH N
+gattuso G AA T UW S OW
+gatty G AE T IY
+gatward G AE T W ER D
+gatwick G AE T W IH K
+gatwick(2) G EY T W IH K
+gatx G AE T EH K S
+gatz G AE T S
+gatza G AA T Z AH
+gatzke G AE T S K
+gatzke(2) G AE T S K IY
+gau G OW
+gaub G AO B
+gaubatz G AW B AH T S
+gaubert G AW B ER T
+gaubert's G AW B ER T S
+gaubert's(2) G AW B EH R T S
+gaubert(2) G AW B EH R T
+gauch G AO CH
+gauche G OW SH
+gaucher G OW SH ER
+gaucho G AW CH OW
+gauchos G AW CH OW Z
+gaudet G OW D EH T
+gaudette G OW D EH T
+gaudin G OW D AE N
+gaudino G AO D IY N OW
+gaudio G AO D IY OW
+gaudioso G AO D IY OW S OW
+gaudreau G OW D R OW
+gaudy G AO D IY
+gauer G AW ER
+gauerke G AW ER K
+gaufman G AO F M AH N
+gaufman's G AO F M AH N Z
+gauge G EY JH
+gauged G EY JH D
+gauger G EY JH ER
+gauges G EY JH AH Z
+gauges(2) G EY JH IH Z
+gaugh G AO
+gaughan G AO AH N
+gaughman G AO M AH N
+gaughran G AO R AH N
+gauging G EY JH IH NG
+gaugler G AO G L ER
+gauguin G AO G W IH N
+gauguin(2) G OW G AE N
+gaul G AO L
+gaulan G AO L AH N
+gaulden G AW D AH N
+gaulding G AO L D IH NG
+gaulin G OW L AE N
+gaulke G AO L K
+gaulle G AO L
+gaullist G AO L IH S T
+gauls G AO L Z
+gault G AO L T
+gaultier G OW L T Y EY
+gaultier(2) G AA L T Y ER
+gaultney G AO L T N IY
+gaumer G AW M ER
+gaumond G OW M AA N D
+gauna G AO N AH
+gaunce G AO N S
+gaunt G AO N T
+gauntlet G AO N T L AH T
+gauntness G AO N T N AH S
+gauntt G AO N T
+gaus G AO Z
+gause G AO Z
+gausman G AW S M AH N
+gauss G AW S
+gaussian G AW S IY AH N
+gaustad G AW S T AH D
+gaut G AO T
+gauthier G AW TH IY ER
+gauthreaux G OW TH R OW
+gautier G AW T IY ER
+gautney G AO T N IY
+gautreau G OW T R OW
+gautreaux G OW T R OW
+gauvain G OW V AE N
+gauvin G OW V AE N
+gauvreau G OW V R OW
+gauze G AO Z
+gavalda G AH V AA L D AH
+gavan G EY V AH N
+gave G EY V
+gavel G AE V AH L
+gaven G EY V AH N
+gaver G EY V ER
+gavigan G AE V IH G AH N
+gavin G AE V IH N
+gaviotas G AE V IY AO T AH Z
+gaviotas(2) G AE V Y AO T AH Z
+gaviria G AH V IH R IY AH
+gavitt G AE V IH T
+gavlak G AE V L AH K
+gavras G AE V R AH S
+gavras's G AE V R AH S IH Z
+gaw G AO
+gawain G AA W AH N
+gawel G AO AH L
+gawen G AO AH N
+gawk G AO K
+gawker G AA K ER
+gawkers G AA K ER Z
+gawking G AO K IH NG
+gawky G AO K IY
+gawlik G AO L IH K
+gawne G AO N
+gawron G AO R AH N
+gawronski G AA V R AA N S K IY
+gawthrop G AO TH R AH P
+gaxiola G AE K S IY OW L AH
+gay G EY
+gayda G EY D AH
+gayden G EY D AH N
+gaydos G EY D OW Z
+gaydosh G EY D AH SH
+gaye G EY
+gayer G EY ER
+gayhart G EY HH AA R T
+gayheart G EY HH AA R T
+gayle G EY L
+gayler G EY L ER
+gayles G EY L Z
+gaylor G EY L ER
+gaylord G EY L AO R D
+gayman G EY M AE N
+gaymon G EY M AH N
+gaynatie G EY N AH T IY
+gayner G EY N ER
+gayness G EY N AH S
+gaynor G EY N ER
+gays G EY Z
+gayshill G EY Z HH IH L
+gayshill(2) G EY SH IH L
+gaytan G EY T AH N
+gayton G EY T AH N
+gaz G AA Z
+gaz(2) G AE Z
+gaza G AA Z AH
+gaza's G AA Z AH Z
+gazans G AA Z AH N Z
+gazaway G AA Z AH W EY
+gazda G AE Z D AH
+gazdik G AE Z D IH K
+gaze G EY Z
+gazed G EY Z D
+gazella G AH Z EH L AH
+gazelle G AH Z EH L
+gazelles G AH Z EH L Z
+gazes G EY Z AH Z
+gazes(2) G EY Z IH Z
+gazeta G AH Z EY T AH
+gazeta(2) G AH Z EH T AH
+gazette G AH Z EH T
+gazing G EY Z IH NG
+gazonsky G AH Z AA N S K IY
+gazonsky's G AH Z AA N S K IY Z
+gazprom G AE Z P R AA M
+gazzola G AA T S OW L AH
+gdansk G AH D AE N S K
+geac G IY K
+geac(2) JH IY IY EY S IY
+geagea JH IY AH JH IY AH
+gean JH IY N
+gear G IH R
+gear's G IH R Z
+gearan G IH R AH N
+gearan's G IH R AH N Z
+gearbox G IH R B AA K S
+gearboxes G IH R B AA K S IH Z
+geared G IH R D
+gearey G IH R IY
+gearhart G IH R HH AA R T
+gearhart(2) G IY R HH AA R T
+gearheart G IH R HH AA R T
+gearheart(2) G IY R HH AA R T
+gearin G IH R IH N
+gearing G IH R IH NG
+gears G IH R Z
+geary G IH R IY
+gebauer G EH B AW ER
+gebbia JH EH B IY AH
+gebbie JH EH B IY
+gebbie's JH EH B IY Z
+gebel G EH B AH L
+gebert G EH B ER T
+gebhard G EH B HH ER D
+gebhardt G EH B HH AA R T
+gebhart G EH B HH AA R T
+gebler G EH B AH L ER
+gebler(2) G EH B L ER
+gebo JH EY B OW
+gechem G EH CH AH M
+geck JH EH K
+gecko G EH K OW
+geckos G EH K OW Z
+ged G EH D
+ged(2) JH IY IY D IY
+geddes G EH D AH S
+geddes(2) G EH D AH Z
+geddie JH EH D IY
+geddings JH EH D IH NG Z
+geddis G EH D IH S
+gedeon G EH D IY AH N
+gedney JH EH D N IY
+geduld G EH D AH L D
+gee JH IY
+gee's JH IY Z
+geeing JH IY IH NG
+geek G IY K
+geeks G IY K S
+geeky G IY K IY
+geena G IY N AH
+geenen G IY N AH N
+geer G IH R
+geerdes G IH R D Z
+geers G IY ER Z
+geerts G IH R T S
+gees JH IY S
+geesaman G IY S AH M AH N
+geese G IY S
+geesey G IY S IY
+geeslin G IY S L IH N
+geeting G IY T IH NG
+geez JH IY Z
+geeze JH IY Z
+geffen G EH F AH N
+geffert G EH F ER T
+geffner G EH F N ER
+geffre JH EH F ER
+gefinor G EH F IH N ER
+gegenheimer G EH G IH N HH AY M ER
+gegg JH EH G
+gehl G EH L
+gehle JH EH HH AH L
+gehlhausen G EH L HH AW Z AH N
+gehling G EH L IH NG
+gehm JH EH M
+gehman G EH M AH N
+gehr JH EH R
+gehres JH EH R Z
+gehret G EH R IH T
+gehrig G EH R IH G
+gehrig's G EH R IH G Z
+gehring G EH R IH NG
+gehringer G EH R IH NG ER
+gehris G EH R IH S
+gehrke JH EH R K
+gehrman G EH R M AH N
+gehrmann G EH R M AH N
+gehrt G EH R T
+gehry G EH R IY
+geib G AY B
+geibel G AY B AH L
+geico G AY K OW
+geico's G AY K OW Z
+geidar G AY D AA R
+geidel G AY D AH L
+geier G AY ER
+geiger G AY G ER
+geigle G AY G AH L
+geigy G AY G IY
+geigy's G AY G IY Z
+geiken G AY K AH N
+geil G AY L
+geiler G AY L ER
+geiman G AY M AH N
+geimer G AY M ER
+geis G AY Z
+geise G AY S
+geisel G AY S AH L
+geiselman G AY S AH L M AH N
+geisen G AY S AH N
+geiser G AY S ER
+geisert G AY S ER T
+geisha G EY SH AH
+geisinger G AY S IH N JH ER
+geisler G AY S L ER
+geiss G AY S
+geissinger G AY S IH N JH ER
+geissler G AY S L ER
+geist G AY S T
+geister G AY S T ER
+geiszler G AY S L ER
+geitner G AY T N ER
+geitz G AY T S
+gejdenson G EY D AH N S AH N
+gekas G IY K AH S
+gekko G EH K OW
+gel JH EH L
+gelardi JH EH L AA R D IY
+gelardin G AH L AA R D IH N
+gelasia JH EH L AA S IY AH
+gelatin JH EH L AH T AH N
+gelatine JH EH L AH T IY N
+gelatinous JH AH L AE T AH N AH S
+gelb JH EH L B
+gelbard G EH L B AA R D
+gelbart G EH L B AA R T
+gelber G EH L B ER
+gelco JH EH L K OW
+gelder G EH L D ER
+geldermann G EH L D ER M AH N
+gelernter G AH L ER N T ER
+gelertner G AH L ER T N ER
+gelett JH EH L IH T
+gelette ZH IH L EH T
+gelfand G EH L F AH N D
+gelinas G EH L IH N AH Z
+gelineau ZH EH L IH N OW
+gell JH EH L
+gellatly JH EH L AH T L IY
+geller G EH L ER
+gellerman G EH L ER M AH N
+gellert G EH L ER T
+gelles JH EH L Z
+gelli G EH L IY
+gellis G EH L IH S
+gellman G EH L M AH N
+gellner G EH L N ER
+gelman G EH L M AH N
+gelpi JH EH L P IY
+gels JH EH L Z
+gelsinger G EH L S IH N JH ER
+geltz G EH L T S
+gelvin G EH L V IH N
+gem JH EH M
+gem's JH EH M Z
+gemayel G AH M EY AH L
+gemayel's G AH M EY AH L Z
+gemayel's(2) JH AH M AY AH L Z
+gemayel's(3) G AH M AY AH L Z
+gemayel(2) JH AH M AY AH L
+gemayel(3) G AH M AY AH L
+gemberling G EH M B ER L IH NG
+gemco JH EH M K OW
+gemcraft JH EH M K R AE F T
+gemcraft's JH EH M K R AE F T S
+gemex JH EH M EH K S
+gemfibrozil G EH M F IH B R OW Z AH L
+gemfibrozil(2) JH IH M F EY B R OW Z IH L
+gemignani JH EH M IY G N AA N IY
+gemina G EH M IY N AH
+geminate JH EH M AH N AH T
+geminate(2) JH EH M AH N EY T
+gemini JH EH M AH N AY
+gemini(2) JH EH M AH N IY
+gemma JH EH M AH
+gemme JH EH M
+gemmell G EH M AH L
+gemmer G EH M ER
+gemmill G EH M AH L
+gems JH EH M Z
+gemsbok G EH M Z B AA K
+gemstone JH EH M S T OW N
+gemstones JH EH M S T OW N Z
+gen JH EH N ER AH L
+gen. JH EH N ER AH L
+gen.(2) JH EH N
+gena JH EH N AH
+genady JH AH N EY D IY
+gencarelli JH EH N K AA R EH L IY
+genco JH EH NG K OW
+gencor JH EH N K AO R
+gencorp JH EH N K AO R P
+gencorp's JH EH N K AO R P S
+gencorp's(2) JH EH N K AO R S
+gencorp(2) JH EH N K AO R
+gendarme ZH AA N D AA R M
+gender JH EH N D ER
+genders JH EH N D ER Z
+gendler JH EH N D L ER
+gendreau ZH IH N D R OW
+gendrisek JH EH D R IH S EH K
+gendrisek's JH EH D R IH S EH K S
+gendron JH EH N D R AH N
+gene JH IY N
+gene's JH IY N Z
+genealogy JH IY N IY AA L AH JH IY
+geneen JH AH N IY N
+genego G EH N AH G OW
+genego(2) JH EH N AH G OW
+genego(3) JH IY IY EH N IY JH IY OW
+genelab JH EH N AH L AE B
+genelabs JH EH N AH L AE B Z
+genemedicine JH EH N AH M EH D AH S AH N
+genencor JH EH N AH N K AO R
+genentech JH EH N AH N T EH K
+genentech's JH EH N AH N T EH K S
+genera JH EH N ER AH
+general JH EH N ER AH L
+general's JH EH N ER AH L Z
+general's(2) JH EH N R AH L Z
+general(2) JH EH N R AH L
+generale JH EH N ER AE L
+generales JH EH N EH R AA L EH S
+generali JH EH N ER AA L IY
+generalissimo JH EH N EH R AH L IH S IH M OW
+generalist JH EH N ER AH L IH S T
+generalists JH EH N ER AH L IH S T S
+generalists(2) JH EH N ER AH L IH S S
+generalists(3) JH EH N ER AH L IH S
+generalities JH EH N ER AE L AH T IY Z
+generality JH EH N ER AE L AH T IY
+generalization JH EH N ER AH L IH Z EY SH AH N
+generalization(2) JH EH N R AH L IH Z EY SH AH N
+generalizations JH EH N ER AH L AH Z EY SH AH N Z
+generalizations(2) JH EH N R AH L AH Z EY SH AH N Z
+generalize JH EH N ER AH L AY Z
+generalized JH EH N ER AH L AY Z D
+generalized(2) JH EH N R AH L AY Z D
+generalizing JH EH N ER AH L AY Z IH NG
+generalizing(2) JH EH N R AH L AY Z IH NG
+generally JH EH N ER AH L IY
+generally(2) JH EH N R AH L IY
+generals JH EH N ER AH L Z
+generals(2) JH EH N R AH L Z
+generalship JH EH N ER AH L SH IH P
+generate JH EH N ER EY T
+generated JH EH N ER EY T AH D
+generated(2) JH EH N ER EY T IH D
+generates JH EH N ER EY T S
+generating JH EH N ER EY T IH NG
+generation JH EH N ER EY SH AH N
+generation's JH EH N ER EY SH AH N Z
+generational JH EH N ER EY SH AH N AH L
+generationally JH EH N ER EY SH AH N AH L IY
+generations JH EH N ER EY SH AH N Z
+generative JH EH N ER AH T IH V
+generator JH EH N ER EY T ER
+generator's JH EH N ER EY T ER Z
+generators JH EH N ER EY T ER Z
+genereux ZH EH N ER OW
+generic JH AH N EH R IH K
+generically JH AH N EH R IH K L IY
+generics JH AH N EH R IH K S
+genero JH AH N ER OW
+generosity JH EH N ER AA S AH T IY
+generous JH EH N ER AH S
+generously JH EH N ER AH S L IY
+genes JH IY N Z
+genesco JH EH N EH S K OW
+genesee JH EH N AH S IY
+genesis JH EH N AH S AH S
+genet JH EH N IH T
+genetic JH AH N EH T IH K
+genetically JH AH N EH T IH K L IY
+geneticist JH AH N EH T AH S AH S T
+geneticists JH AH N EH T AH S AH S T S
+geneticists(2) JH AH N EH T AH S AH S S
+geneticists(3) JH AH N EH T AH S AH S
+genetics JH AH N EH T IH K S
+genetization JH EH N AH T IH Z EY SH AH N
+geneva JH AH N IY V AH
+geneve JH AH N IY V
+genevieve JH EH N AH V IY V
+genex JH EH N EH K S
+genex's JH EH N EH K S IH Z
+geng JH EH NG
+gengenbach G EH NG AH N B AA K
+gengenbach(2) JH EH NG AH N B AA K
+genger JH EH NG G ER
+genghis JH EH NG HH IH S
+gengler G EH NG L ER
+gengler(2) JH EH NG L ER
+genial JH IY N Y AH L
+geniality JH IY N IY AE L AH T IY
+genicom JH EH N IH K AA M
+genie JH IY N IY
+geniere JH EH N Y EH R
+genis G EH N IH S
+genisco JH EH N IH S K OW
+genital JH EH N AH T AH L
+genitalia JH EH N AH T AA L Y AH
+genitals JH EH N AH T AH L Z
+genius JH IY N Y AH S
+geniuses JH IY N Y AH S IH Z
+genk JH EH NG K
+genlyte JH EH N L AY T
+genmar JH EH N M AA R
+genna JH EH N AH
+gennadi JH EH N AA D IY
+gennady G AH N AA D IY
+gennaro JH AH N AA R OW
+gennett JH EH N IH T
+gennifer JH EH N IH F ER
+geno JH IY N OW
+genoa JH EH N OW AH
+genocidal JH EH N AH S AY D AH L
+genocide JH EH N AH S AY D
+genocides JH EH N AH S AY D Z
+genoese JH EH N OW S
+genome JH IY N OW M
+genossenschaftsbank G EH N OW S EH N SH AE F T S B AE NG K
+genotype JH EH N AH T AY P
+genotypes JH EH N AH T AY P S
+genova JH EH N OW V AH
+genovese JH EH N AH V IY Z
+genovesi JH EH N OW V EH S IY
+genovise JH EH N AH V IY Z
+genpharm JH EH N F AA R M
+genrad JH EH N R AE D
+genre ZH AA N R AH
+genres ZH AA N R AH Z
+genrich G EH N R IH K
+gens JH EH N Z
+genscher G EH N SH ER
+gensel G EH N S AH L
+gensia JH EH N S IY AH
+genske JH EH N S K
+gensler G EH N S AH L ER
+gensler(2) G EH N S L ER
+genson JH EH N S AH N
+genstar JH EH N S T AA R
+gent JH EH N T
+gent's JH EH N T S
+genteel JH EH N T IY L
+genter JH EH N T ER
+genther G EH N DH ER
+genthner JH EH N TH N ER
+gentian JH EH N SH AH N
+gentile JH EH N T AY L
+gentile's JH EH N T AY L Z
+gentiles JH EH N T AY L Z
+gentility JH EH N T IH L IH T IY
+gentle JH EH N T AH L
+gentle(2) JH EH N AH L
+gentleladies JH EH N T AH L EY D IY Z
+gentlelady JH EH N T AH L EY D IY
+gentleman JH EH N T AH L M AH N
+gentleman's JH EH N T AH L M AH N Z
+gentleman's(2) JH EH N AH L M AH N Z
+gentleman(2) JH EH N AH L M AH N
+gentlemanly JH EH N T AH L M AH N L IY
+gentlemanly(2) JH EH N AH L M AH N L IY
+gentlemen JH EH N T AH L M IH N
+gentlemen's JH EH N T AH L M EH N Z
+gentlemen's(2) JH EH N AH L M EH N Z
+gentlemen(2) JH EH N AH L M IH N
+gentleness JH EH N T AH L N AH S
+gentleness(2) JH EH N AH L N AH S
+gentler JH EH N T L ER
+gentles JH EH N T AH L Z
+gentles(2) JH EH N AH L Z
+gentlest JH EH N T AH L AH S T
+gentlewoman JH EH N T AH L W UH M AH N
+gentlewoman's JH EH N T AH L W UH M AH N Z
+gentlewoman's(2) JH EH N AH L W UH M AH N Z
+gentlewoman(2) JH EH N AH L W UH M AH N
+gentlewomen JH EH N T AH L W IH M AH N
+gentlewomen's JH EH N T AH L W IH M AH N Z
+gentlewomen's(2) JH EH N AH L W IH M AH N Z
+gentlewomen(2) JH EH N AH L W IH M AH N
+gently JH EH N T L IY
+gentner JH EH N T N ER
+gentrification JH EH N T R IH F IH K EY SH AH N
+gentrified JH EH N T R IH F AY D
+gentrify JH EH N T R IH F AY
+gentrifying JH EH N T R IH F AY IH NG
+gentry JH EH N T R IY
+gentz JH EH N T S
+gentzler JH EH N T S L ER
+genuine JH EH N Y AH W AH N
+genuine(2) JH EH N Y UW W AY N
+genuinely JH EH N Y AH W AH N L IY
+genuinely(2) JH EH N Y UW W AY N L IY
+genuineness JH EH N Y AH W AH N IH S
+genung JH EH N AH NG
+genus JH IY N AH S
+genz JH EH N Z
+genzyme JH EH N Z AY M
+geo JH IY OW
+geocentric JH IY OW S EH N T R IH K
+geochemistry JH IY OW K EH M AH S T R IY
+geodesic JH IY AH D EH S IH K
+geodesy JH IY AA D AH S IY
+geodyne JH IY OW D AY N
+geoff JH EH F
+geoffrey JH EH F R IY
+geoffrey's JH EH F R IY Z
+geoffrion JH IY AA F R IY AH N
+geoffroy JH IY AH F R OY
+geoghegan G AH HH EY G AH N
+geographer JH IY AA G R AH F ER
+geographic JH IY AH G R AE F IH K
+geographic's JH IY AH G R AE F IH K S
+geographical JH IY AH G R AE F IH K AH L
+geographically JH IY AH G R AE F IH K AH L IY
+geographically(2) JH IY AH G R AE F IH K L IY
+geography JH IY AA G R AH F IY
+geoid JH IY OY D
+geologic JH IY AH L AA JH IH K
+geological JH IY AH L AA JH IH K AH L
+geologist JH IY AA L AH JH AH S T
+geologists JH IY AA L AH JH IH S T S
+geologists(2) JH IY AA L AH JH IH S S
+geologists(3) JH IY AA L AH JH IH S
+geology JH IY AA L AH JH IY
+geomagnetic JH IY OW M AE G N EH T IH K
+geometric JH IY AH M EH T R IH K
+geometrical JH IY AH M EH T R IH K AH L
+geometrically JH IY AH M EH T R IH K L IY
+geometrics JH IY AH M EH T R IH K S
+geometries JH IY AA M AH T R IY Z
+geometry JH IY AA M AH T R IY
+geomorphology JH IY AH M AO R F AA L AH JH IY
+geon JH IY AA N
+geophysical JH IY OW F IH Z AH K AH L
+geopolitic JH IY OW P AA L IH T IH K
+geopolitical JH IY OW P AH L IH T IH K AH L
+geopolitically JH IY OW P AH L IH T IH K L IY
+geopolitics JH IY OW P AA L AH T IH K S
+geordie JH IY ER D IY
+georg G EY AO R G
+georgakis JH AO R JH AA K AH S
+georgann JH AO R JH AE N
+george JH AO R JH
+george's JH AO R JH AH Z
+george's(2) JH AO R JH IH Z
+georgene JH AO R JH IY N
+georges JH AO R JH AH Z
+georges(2) JH AO R JH IH Z
+georgeson JH AO R JH IH S AH N
+georgeson(2) JH AO R JH S AH N
+georgetown JH AO R JH T AW N
+georgette JH AO R JH EH T
+georgi JH IY AA R JH IY
+georgia JH AO R JH AH
+georgia's JH AO R JH AH Z
+georgiades JH AO R JH IY AA D AH S
+georgiadis JH AO R JH IY AA D IH S
+georgian JH AO R JH AH N
+georgiana JH AO R JH IY AE N AH
+georgians JH AO R JH AH N Z
+georgie JH AO R JH IY
+georgienne JH AO R JH IY EH N
+georgina JH AO R JH IY N AH
+georgine JH AO R JH IY N
+georgio JH AO R JH IY OW
+georgiou JH AO R JH OW
+georgopoulos JH AO R JH AA P AH L IH S
+georgy JH AO R JH IY
+geostrophic JH IY OW S T R AA F IH K
+geosyncline JH IY OW S IH N K L AY N
+geotaxis JH IY OW T AE K S AH S
+geotek G IY OW T EH K
+geothermal JH IY OW TH ER M AH L
+geotropic JH IY AH T R AA P IH K
+geotropism JH IY AA T R AH P IH Z AH M
+geoworks JH IY OW W ER K S
+gephardt G EH P HH AA R T
+gephardt's G EH P HH AA R T S
+gephart G EH P HH AA R T
+geppert G EH P ER T
+gera JH EH R AH
+gerace JH ER AA CH IY
+geraci JH ER AA CH IY
+geraghty JH EH R AH T IY
+gerais JH ER EY
+gerald JH EH R AH L D
+geraldi JH EH R AE L D IY
+geraldi(2) HH EH R AE L D IY
+geraldina JH ER AA L D IY N AH
+geraldine JH EH R AH L D IY N
+geraldo JH ER AA L D OW
+geraldo(2) HH ER AA L D OW
+geralds JH EH R AH L D Z
+geran JH EH R AH N
+geranium JH ER EY N IY AH M
+geraniums JH ER EY N IY AH M Z
+gerard JH ER AA R D
+gerardi JH ER AA R D IY
+gerardo JH ER AA R D OW
+gerashchenko G EH AH SH EY NG K OW
+gerasimov JH ER AE S IH M AA V
+gerasimov(2) G ER AE S IH M AA V
+gerbasi JH ER B AA S IY
+gerber G ER B ER
+gerber's G ER B ER Z
+gerberding G ER B ER D IH NG
+gerbert G ER B ER T
+gerbig G ER B IH G
+gerbino JH ER B IY N OW
+gerbrandt G ER B R AE N T
+gerchas G ER CH AH Z
+gerchas(2) G ER SH AH Z
+gerd G ER D
+gerda G ER D AH
+gerdeman G ER D M AH N
+gerdes ZH ER D Z
+gerdes' ZH ER D Z
+gerding G EH R T IH NG
+gerdts JH ER D T S
+gerdts(2) JH ER T S
+gere JH IH R
+gere(2) G IH R
+geremia JH ER IY M IY AH
+geren G IH R AH N
+gerena JH ER EH N AH
+gerety ZH EH R IH T IY
+gergel G ER G AH L
+gergely JH ER JH L IY
+gergen G ER G AH N
+gergen's G ER G AH N Z
+gerger G ER G ER
+gergrude G ER G R UW D
+gerhard G ER HH AA R D
+gerhardt G ER HH AA R T
+gerhart G ER HH AA R T
+gerhold G ER HH OW L D
+geri JH EH R IY
+geriatric JH EH R IY AE T R IH K
+geriatrician JH EH R IY AH T R IH SH AH N
+geriatricians JH EH R IY AH T R IH SH AH N Z
+geriatrics JH EH R IY AE T R IH K S
+gerich G EH R IH K
+gericke JH EH R IH K
+gerig JH EH R IH G
+gering G IH R IH NG
+geringer G EH R IH N JH ER
+gerk JH ER K
+gerke JH ER K
+gerken G ER K AH N
+gerkin JH ER K IH N
+gerlach G ER L AH K
+gerleman G AO R AH L M AH N
+gerlich G ER L IH K
+gerling G ER L IH NG
+gerlock G ER L AH K
+gerloff G ER L AO F
+germ JH ER M
+germain JH ER M EY N
+germain's JH ER M EY N Z
+germaine ZH ER M EY N
+german JH ER M AH N
+german's JH ER M AH N Z
+germane JH ER M EY N
+germani JH ER M AA N IY
+germania JH ER M EY N IY AH
+germanic JH ER M AE N IH K
+germann G ER M AH N
+germano JH ER M AA N OW
+germans JH ER M AH N Z
+germans' JH ER M AH N Z
+germantown JH ER M AH N T AW N
+germany JH ER M AH N IY
+germany's JH ER M AH N IY Z
+germanys JH ER M AH N IY Z
+germe JH ER M
+germer JH ER M ER
+germicide JH ER M AH S AY D
+germinate JH ER M AH N EY T
+germinated JH ER M AH N EY T IH D
+germination JH ER M AH N EY SH AH N
+germiston JH ER M AH S T AA N
+germiston's JH ER M AH S T AA N Z
+germond G ER M AH N D
+germs JH ER M Z
+gerner G ER N ER
+gernert G ER N ER T
+gero JH EH R OW
+gerold G EH R OW L D
+gerome G EH R AH M
+geron JH EH R AH N
+geronimo JH AH R AO N IH M OW
+gerontologist JH EH R AH N T AA L AH JH IH S T
+gerontology JH EH R AH N T AA L AH JH IY
+geroux ZH ER UW
+gerow JH EH R OW
+gerrald JH EH R AH L D
+gerri JH EH R IY
+gerrick JH EH R IH K
+gerrie JH EH R IY
+gerringer JH EH R IH NG ER
+gerrish JH EH R IH SH
+gerrit JH EH R IH T
+gerrits JH EH R IH T S
+gerritsen G EH R IH T S AH N
+gerrity JH EH R IH T IY
+gerry JH EH R IY
+gerry's JH EH R IY Z
+gerrymander JH EH R IY M AE N D ER
+gerrymandered JH EH R IY M AE N D ER D
+gerrymandering JH EH R IY M AE N D ER IH NG
+gerrymanders JH EH R IY M AE N D ER Z
+gersch G ER SH
+gersh G ER SH
+gershman G ER SH M AH N
+gershon G ER SH AH N
+gershowitz G ER SH AH W IH T S
+gershwin G ER SH W IH N
+gershwin's G ER SH W IH N Z
+gerski G ER S K IY
+gerson JH ER S AH N
+gerson(2) G ER S AH N
+gerst G ER S T
+gerstein G ER S T AY N
+gerstein(2) G ER S T IY N
+gerstel G ER S T AH L
+gersten G ER S T AH N
+gerstenberger G ER S T AH N B ER G ER
+gerstenhaber G ER S T AH N HH EY B ER
+gerster G ER S T ER
+gerstman G ER S T M AH N
+gerstner G ER S T N ER
+gerstner's G ER S T N ER Z
+gerszewski G ER SH EH F S K IY
+gert G ER T
+gerth G ER TH
+gertie JH ER T IY
+gertler G ER T AH L ER
+gertler(2) G ER T L ER
+gertner G ER T N ER
+gertrud G ER T R UW D
+gertrude G ER T R UW D
+gertsch G ER CH
+gerty JH ER T IY
+gertz G ER T S
+gervais ZH ER V EY
+gervase G ER V AH S
+gervasi JH ER V AA S IY
+gervasio JH ER V AA S IY OW
+gerwig G ER W IH G
+gerwin G ER W IH N
+gery JH EH R IY
+gesamtmetall G EH S AE M T M EH T AH L
+geschke G EH SH K
+gesco G EH S K OW
+gesell G EH S AH L
+gesell's G EH S AH L Z
+gesellschaft G AH S EH L SH AE F T
+geserum G AH S EH R AH M
+geske JH EH S K
+gesner G EH S N ER
+gess JH EH S
+gessel G EH S AH L
+gessert G EH S ER T
+gessler G EH S AH L ER
+gessler(2) G EH S L ER
+gessner G EH S N ER
+gest JH EH S T
+gestal JH EH S T AH L
+gestapo G AH S T AA P OW
+gestate JH EH S T EY T
+gestation JH EH S T EY SH AH N
+gestetner G AH S T EH T N ER
+gesture JH EH S CH ER
+gestured JH EH S CH ER D
+gestures JH EH S CH ER Z
+gesturing JH EH S CH ER IH NG
+gesualdi JH EH S UW AA L D IY
+gesundheit G AH Z UH N D HH AY T
+get G EH T
+get(2) G IH T
+get-together G EH T T AH G EH DH ER
+get-together(2) G EH T AH G EH DH ER
+get-togethers G EH T T AH G EH DH ER Z
+get-togethers(2) G EH T AH G EH DH ER Z
+get-well G EH T W EH L
+get-well(2) G EH T HH W EH L
+getaway G EH T AH W EY
+getaways G EH T AH W EY Z
+getchell G EH CH AH L
+geter G EH T ER
+gethers G EH DH ER Z
+getman G EH T M AH N
+gets G EH T S
+gets(2) G IH T S
+getsinger G EH T S IH N JH ER
+gettel G EH T AH L
+getter G EH T ER
+getters G EH T ER Z
+gettin' G IH T AH N
+getting G EH T IH NG
+getting(2) G IH T IH NG
+gettinger G EH T IH NG ER
+gettinger(2) G EH T IH N JH ER
+gettings G EH T IH NG Z
+gettis G EH T IH S
+gettle G EH T AH L
+gettler G EH T AH L ER
+gettler(2) G EH T L ER
+gettman G EH T M AH N
+getts G EH T S
+getty G EH T IY
+getty's G EH T IY Z
+gettys G EH T IY Z
+gettysburg G EH T IY Z B ER G
+gettysburg's G EH T IY Z B ER G Z
+getulio G AH CH UW L IY OW
+getz G EH T S
+geurin ZH ER AE N
+geurts ZH ER T S
+geva G EY V AH
+gevaert G AH V EH R T
+geving JH IY V IH NG
+gewgaw G Y UW G AA
+gewirtz G UW ER T S
+geyelin JH EY IH L IH N
+geyer G EY ER
+geyser G AY Z ER
+geysers G AY Z ER Z
+gfeller G AH F EH L ER
+ghada G AA D AH
+ghadafi G AH D AE F IY
+ghadafi(2) K AH D AA F IY
+ghadafi(3) G AH D AA F IY
+ghadafithe G AH D AA F IY TH
+ghadafito G AA D AH F IY T OW
+ghafar G AH F AA R
+ghafar(2) G AO F ER
+ghali G AA L IY
+ghali's G AA L IY Z
+ghana G AE N AH
+ghana's G AE N AH Z
+ghanaian G AH N AY AH N
+ghanaians G AH N AY AH N Z
+ghandi G AA N D IY
+gharbonifar G AA R B AA N IH F AA R
+ghastliness G AE S T L IY N AH S
+ghastly G AE S T L IY
+ghattas G AA T AH S
+ghaznavi G AH Z N AA V IY
+ghee G IY
+gheen G IY N
+ghent G EH N T
+gherardi G ER AA R D IY
+gherig G EH R IH G
+gherig's G EH R IH G Z
+gherman G ER M AH N
+ghetto G EH T OW
+ghettoize G EH T OW AY Z
+ghettos G EH T OW Z
+ghez G EH Z
+ghezzi G EH Z IY
+ghidella G IH D EH L AH
+ghio G AY OW
+ghitis G IY T IH Z
+ghitis(2) G IH T IH Z
+gholamreza G OW L AH M R EY Z AH
+gholson G OW L S AH N
+gholston G OW L S T AH N
+ghorbanifar G AO R B AE N IH F AA R
+ghorbanifar(2) G AO R B AA N IH F AA R
+ghorbanifar(3) G AO R B AE N IH F ER
+ghorbanifar(4) G AO R B AA N IH F ER
+ghormley G AO R M L IY
+ghose G OW Z
+ghosh G AA SH
+ghost G OW S T
+ghostbuster G OW S T B AH S T ER
+ghostbusters G OW S T B AH S T ER Z
+ghostlike G OW S T L AY K
+ghostly G OW S T L IY
+ghosts G OW S T S
+ghosts(2) G OW S S
+ghosts(3) G OW S
+ghoul G UW L
+ghoulish G UW L IH SH
+ghoulishly G UW L IH SH L IY
+ghouls G UW L Z
+ghrist G R IH S T
+ghulam G Y UW L AE M
+ghuloum G UW L OW M
+gia's JH IY AH Z
+giacalone JH AA K AA L OW N IY
+giacco JH AA K OW
+giacinta JH AA CH IY N T AH
+giacobbe JH AA K OW B IY
+giacomelli JH AH K OW M EH L IY
+giacometti JH AH K AH M EH T IY
+giacomini JH AH K OW M IY N IY
+giacomo JH AA K AH M OW
+giaconda JH IY AH K AA N D AH
+giaconda's JH IY AH K AA N D AH Z
+giacone JH IY AH K OW N IY
+giaimo JH EY M OW
+gialanella JH AH L AA N EH L AH
+giamatti JH IY AH M AA T IY
+giambalvo JH AA M B AA L V OW
+giambra JH AA M B R AH
+giambrone JH AA M B R OW N IY
+giammalva JH IY AH M AO L V AH
+giammarco JH AA M AA R K OW
+giammarino JH AH M AA R IY N OW
+giampa JH AA M P AH
+giampaolo JH AA M P AW L OW
+giampapa JH AA M P AA P AH
+giampietro JH AA M P IY T R OW
+gian JH IY AA N
+giancana JH IY AH K AA N AH
+giancarlo JH IY AE NG K AA R L OW
+giancola JH AA NG K OW L AH
+gianelli JH AH N EH L IY
+gianfrancesco JH AA N F R AE N CH EH S K OW
+gianfranco JH AH N F R AA N K OW
+gianfranco(2) JH IY AH N F R AE N K OW
+giang JH IY AA NG
+giang(2) JH AA NG
+giangrande JH AA N G R AE N D IY
+gianini JH AH N IY N IY
+gianino JH AH N IY N OW
+giannattasio JH AA N AA T AA S IY OW
+giannelli JH AH N EH L IY
+giannetti JH AH N EH T IY
+giannetto JH AH N EH T OW
+gianni JH AA N IY
+gianni(2) JH IY AA N IY
+gianni(3) JH Y AA N IY
+giannini JH AH N IY N IY
+giannino JH IY AH N IY N OW
+giannola JH AA N OW L AH
+giannone JH AA N OW N IY
+giannotti JH AA N OW T IY
+gianotti JH AA N OW T IY
+giant JH AY AH N T
+giant's JH AY AH N T S
+giants JH AY AH N T S
+giants' JH AY AH N T S
+giap JH IY AE P
+giap(2) JH Y AE P
+giaquinto JH AA K W IY N T OW
+giard JH IY AA R D
+giard(2) JH AA R D
+giardi JH IY AA R D IY
+giardina JH AA R D IY N AH
+giardini JH ER D IY N IY
+giardino JH ER D IY N OW
+giarratano JH AA R AH T AA N OW
+giarrusso JH AA R UW S OW
+gib G IH B
+gibas JH AY B AH Z
+gibb JH IH B
+gibb's G IH B Z
+gibbard ZH IH B AA R D
+gibbens G IH B AH N Z
+gibberish G IH B ER IH SH
+gibbins JH IH B IH N Z
+gibble JH IH B AH L
+gibbon G IH B AH N
+gibboney JH IH B AH N IY
+gibbons G IH B IH N Z
+gibbs G IH B Z
+gibbs's G IH B Z IH Z
+gibby JH IH B IY
+gibe JH AY B
+gibeau ZH IH B OW
+gibeault ZH IH B OW
+giberson JH IH B ER S AH N
+gibert G IH B ER T
+gibes JH AY B Z
+gibian G IH B IY AH N
+gibian's G IH B IY AH N Z
+giblen G IH B L AH N
+gibler JH IH B AH L ER
+gibler(2) JH IH B L ER
+giblet JH IH B L AH T
+giblin JH IH B L IH N
+gibney JH IH B N IY
+giboney JH IH B AH N IY
+gibraltar JH IH B R AO L T ER
+gibran JH IH B R AA N
+gibson G IH B S AH N
+gibson's G IH B S AH N Z
+gibsons G IH B S AH N Z
+gick JH IH K
+gidcumb G IH D K AH M
+giddens G IH D AH N Z
+giddings G IH D IH NG Z
+giddy G IH D IY
+gidel G AY D EH L
+gideon G IH D IY AH N
+gidget G IH JH AH T
+gidley G IH D L IY
+gidney G IH D N IY
+gidwitz G IH D W IH T S
+giebel G IY B AH L
+giebler G IY B AH L ER
+giebler(2) G IY B L ER
+gieck JH IY K
+giefer G IY F ER
+gieger G IY G ER
+giegerich G IY G ER IH K
+giel JH IY L
+gielgud G IY L G AH D
+gielow JH IY L OW
+gienger G IY N JH ER
+gienow G IY N AW
+gier JH IH R
+giere JH IH R
+gierhart G IH R HH AA R T
+gierke JH IH R K
+gierman G IH R M AH N
+giersch G IH R SH
+gies G IY Z
+giesbrecht G IY S B R IH K T
+giese JH IY S
+giesecke G IY S IH K
+gieseke G IY S IH K
+gieseler G IY S AH L ER
+gieselman G IY S AH L M AH N
+giesen G IY S AH N
+gieser G IY S ER
+giesey JH IY S IY
+gieske JH IY S K
+giesler G IY S AH L ER
+giesler(2) G IY S L ER
+giessen G IY Z S AH N
+gietzen G IY T Z AH N
+giff G IH F
+giffard G IH F ER D
+giffen G IH F AH N
+gifferd G IH F ER D
+giffin G IH F IH N
+gifford G IH F ER D
+gifford's G IH F ER D Z
+giffords G IH F ER D Z
+giffy G IH F IY
+gift G IH F T
+gift-horse G IH F T HH AO R S
+gifted G IH F T AH D
+gifted(2) G IH F T IH D
+gifting G IH F T IH NG
+giftrust G IH F T R AH S T
+gifts G IH F T S
+gifts(2) G IH F S
+giftware G IH F T W EH R
+gig G IH G
+gigabyte G IH G AH B AY T
+gigabytes G IH G AH B AY T S
+gigaflop G IH G AH F L AA P
+gigaflops G IH G AH F L AA P S
+gigante JH IY G AA N T IY
+gigantic JH AY G AE N T IH K
+gigantic(2) JH AY G AE N IH K
+giger G AY G ER
+gigging G IH G IH NG
+giggle G IH G AH L
+giggled G IH G AH L D
+giggles G IH G AH L Z
+giggling G IH G AH L IH NG
+giggling(2) G IH G L IH NG
+giggly G IH G AH L IY
+gigi JH IY JH IY
+giglia JH IY G L IY AH
+giglio JH IH G L IY OW
+gigliotti JH IY G L IY OW T IY
+gignac G IH G N AH K
+gignoux G IH N UW
+gigolo JH IH G AH L OW
+gigot JH IH G AH T
+gigot's JH IH G AH T S
+gigs G IH G Z
+giguere JH IY G EH R EY
+gikas G AY K AH Z
+gil G IH L
+gila G IY L AH
+gilardi JH IY L AA R D IY
+gilb G IH L B
+gilberg G IH L B ER G
+gilbert G IH L B ER T
+gilbert's G IH L B ER T S
+gilberta JH IY L B EH R T AH
+gilberte G IH L B ER T
+gilberti JH IY L B EH R T IY
+gilbertina JH IY L B ER T IY N AH
+gilbertine JH IY L B ER T IY N IY
+gilberto G IH L B EH R T OW
+gilberto(2) G IH L B ER T OW
+gilbertson G IH L B ER T S AH N
+gilbey G IH L B IY
+gilbo JH IY L B OW
+gilboy G IH L B OY
+gilbreath G IH L B R EH TH
+gilbreth G IH L B R IH TH
+gilbride G IH L B R AY D
+gilby G IH L B IY
+gilchrest G IH L K ER IH S T
+gilchrist G IH L K R IH S T
+gilcrease G IH L K R IY S
+gilcrest G IH L K ER IH S T
+gilcrest(2) G IH L K R EH S T
+gild G IH L D
+gilda G IH L D AH
+gilday G IH L D EY
+gildea JH IY L D IY AH
+gilded G IH L D IH D
+gilden G IH L D AH N
+gilder G IH L D ER
+gilder's G IH L D ER Z
+gildersleeve G IH L D ER S L IY V
+gilding G IH L D IH NG
+gildner G IH L D N ER
+gildon G IH L D AH N
+gile G AY L
+gilead G IH L IY D
+giles JH AY L Z
+gilfillan G IH L F IH L AH N
+gilford G IH L F ER D
+gilger G IH L G ER
+gilgit G IH L JH IH T
+gilgore G IH L G AO R
+gilham G IH L HH AH M
+gilhooly G IH L HH UW L IY
+gilkerson G IH L K ER S AH N
+gilkes G IH L K S
+gilkeson G IH L K IH S AH N
+gilkey G IH L K IY
+gilkison G IH L K IH S AH N
+gilkisons G IH L K IH S AH N Z
+gill G IH L
+gill's G IH L Z
+gillam G IH L AH M
+gillan G IH L AH N
+gilland G IH L AH N D
+gillard ZH IH L AA R D
+gillaspie G IH L AH S P IY
+gillaspy G IH L AH S P IY
+gille G AY L
+gillean G IH L AH N
+gilleland G IH L IH L AE N D
+gillem G IH L IH M
+gillen G IH L AH N
+gillen's G IH L AH N Z
+gillentine G IH L AH N T AY N
+giller G IH L ER
+gilleran G IH L ER AE N
+gillers G IH L ER Z
+gilles ZH IY L
+gillespie G AH L EH S P IY
+gillet G IH L IH T
+gillett JH IH L IH T
+gillette JH IH L EH T
+gillette's JH IH L EH T S
+gilley G IH L IY
+gillham G IH L HH AH M
+gilliam G IH L IY AH M
+gillian JH IH L IY AH N
+gilliand G IH L IY AH N D
+gilliard G IH L IY ER D
+gilliardi G IH L Y AA R D IY
+gilliatt G IH L IY AE T
+gillick G IH L IH K
+gillie G IH L IY
+gillies G IH L IY Z
+gillig G IH L IH G
+gilligan G IH L AH G AH N
+gilligan's G IH L AH G AH N Z
+gillihan G IH L AH HH AE N
+gillikin G IH L AH K AH N
+gillilan G IH L AH L AH N
+gilliland G IH L AH L AH N D
+gillin G IH L IH N
+gillingham G IH L IH NG HH AE M
+gillings G IH L IH NG Z
+gillinov G IH L IH N AA V
+gillins G IH L IH N Z
+gillis G IH L IH S
+gillison G IH L IH S AH N
+gillispie G AH L EH S P IY
+gillman G IH L M AH N
+gillmore JH IY L M AO R
+gillock G IH L AH K
+gillogly G IH L AH G L IY
+gillon G IH L AH N
+gillooly G IH L UW L IY
+gillooly's G IH L UW L IY Z
+gillott G IH L AH T
+gillotti JH IY L OW T IY
+gills G IH L Z
+gillson G IH L S AH N
+gillum G IH L AH M
+gilly G IH L IY
+gilman G IH L M AH N
+gilmartin G IH L M AA R T IH N
+gilmer G IH L M ER
+gilmore G IH L M AO R
+gilmour ZH IH L M UH R
+gilpatrick G IH L P AH T R IH K
+gilpatrick(2) G IH L P AE T R IH K
+gilpin G IH L P IH N
+gilreath G IH L R EH TH
+gilroy G IH L R OY
+gilsdorf G IH L S D AO R F
+gilson G IH L S AH N
+gilstrap G IH L S T R AH P
+gilt G IH L T
+giltner G IH L T N ER
+gilts G IH L T S
+gilvin G IH L V IH N
+gilyard ZH AH L Y AA R D
+gimbel G IH M B AH L
+gimenez JH IY M EY N EH Z
+gimli G IH M L IY
+gimlin G IH M L IH N
+gimme G IH M IY
+gimmick G IH M IH K
+gimmickry G IH M IH K R IY
+gimmicks G IH M IH K S
+gimmicky G IH M IH K IY
+gimpel G IH M P AH L
+gin JH IH N
+gina JH IY N AH
+gina's JH IY N AH Z
+ginandjar JH IH N AE N JH ER
+ginas JH IY N AH Z
+ginder G AY N D ER
+gindin G IH N D IH N
+gindlesperger G IH N D AH L S P ER G ER
+gines JH AY N Z
+ginevra JH IH N EH V R AH
+ging JH IH NG
+gingell G IH NG G AH L
+ginger JH IH N JH ER
+gingerbread JH IH N JH ER B R EH D
+gingerich G IH NG G ER IH K
+gingerly JH IH N JH ER L IY
+gingery JH IH N JH ER IY
+gingham G IH NG AH M
+ginghams G IH NG AH M Z
+gingles JH IH NG G AH L Z
+gingold JH IH N G OW L D
+gingold(2) G IH N G OW L D
+gingras G IH NG G R AH Z
+gingrich G IH NG G R IH CH
+gingrich's G IH NG G R IH CH IH Z
+gingriches G IH NG G R IH CH IH Z
+ginley JH IH N L IY
+ginn JH IH N
+ginned JH IH N D
+ginnell JH IH N EH L
+ginnie JH IH N IY
+ginning JH IH N IH NG
+ginny JH IH N IY
+gino JH IY N OW
+ginocchio JH IY N OW K IY OW
+ginsberg G IH N S B ER G
+ginsburg G IH N Z B ER G
+ginsburg's G IH N Z B ER G Z
+ginseng JH IH N S EH NG
+ginsu G IH N S UW
+ginsu's G IH N S UW Z
+gintel JH IH N T EH L
+ginter G IH N T ER
+ginther G IH N DH ER
+ginting JH IH N T IH NG
+ginty JH IH N T IY
+gintz G IH N T S
+ginyard JH IH N Y AA R D
+ginza G IH N Z AH
+ginzberg G IH N Z B ER G
+gioia JH OW Y AH
+gionet JH IY OW N EY T
+gionfriddo JH OW N F R IY D OW
+giordani JH AO R D AA N IY
+giordano JH AO R D AA N OW
+giorgi JH AO R JH IY
+giorgia JH AO R JH AH
+giorgio JH AO R JH IY OW
+giovanelli JH OW V AA N EH L IY
+giovanetti JH OW V AA N EH T IY
+giovannetti JH OW V AA N EH T IY
+giovanni JH IY OW V AA N IY
+giovanni's JH IY OW V AA N IY Z
+giovanni's(2) JH AH V AA N IY Z
+giovanni(2) JH AH V AA N IY
+giovanniello JH OW V AA N IY EH L OW
+giovannini JH OW V AA N IY N IY
+giovannoni JH OW V AA N OW N IY
+giovenco JH OW V EH N K OW
+giovinazzo JH OW V IY N AA Z OW
+gipe JH AY P
+gipp JH IH P
+gipper G IH P ER
+gipple JH IH P AH L
+gipson G IY P S AH N
+giraffe JH ER AE F
+giraffes JH ER AE F S
+giraldo JH IH R AA L D OW
+girard JH ER AA R D
+girardi JH IH R AA R D IY
+girardin ZH AO R AA R D AE N
+girardot ZH AO R AA R D OW
+giraud ZH AY R OW
+gird G ER D
+girder G ER D ER
+girders G ER D ER Z
+girding G ER D IH NG
+girdle G ER D AH L
+girdler G ER D AH L ER
+girdler(2) G ER D L ER
+girdley G ER D L IY
+girdner G ER D N ER
+girds G ER D Z
+gire G AY R
+giren G IH R AH N
+giren(2) JH IH R AH N
+girgenti JH IH R JH EH N T IY
+girgis G ER G IH S
+girija G IH R IY JH AH
+girl G ER L
+girl's G ER L Z
+girlfriend G ER L F R EH N D
+girlfriend's G ER L F R EH N D Z
+girlfriends G ER L F R EH N D Z
+girlhood G ER L HH UH D
+girlie G ER L IY
+girlish G ER L IH SH
+girlishly G ER L IH SH L IY
+girls G ER L Z
+girls' G ER L Z
+girobank G IH R OW B AE NG K
+girod ZH ER AA D
+giroir ZH AY R W AA R
+girolamo JH IH R OW L AA M OW
+giroldi G IH R OW L D IY
+giroldi's G IH R OW L D IY Z
+giron G AO R AH N
+gironde JH ER AO N D
+girouard ZH AY R UW ER D
+giroux G IH R UW
+girozentrale G IH R OW Z AH N T R AA L
+girsky G ER S K IY
+girt G ER T
+girten G ER T AH N
+girth G ER TH
+girtman G ER T M AH N
+girton G ER T AH N
+girvan G ER V AH N
+girven G ER V AH N
+girvin G ER V IH N
+gisbert JH IH S B ER T
+gisbert(2) G IH S B ER T
+giscard G IH S K AA R D
+giscard(2) ZH IH S K AA R
+gisclair ZH IH S K L EH R
+gisela G IY Z AH L AH
+gisella JH IH S EH L AH
+giselle ZH IH S EH L
+gisenyi JH IH S EH N IY
+gisenyi(2) JH IH S EH N Y IY
+gish JH IH SH
+gish(2) G IH SH
+gisi JH IY S IY
+gisler G IH S AH L ER
+gisler(2) G IH S L ER
+gismondi JH IY S M OW N D IY
+gissendanner G IH S IH N D AH N ER
+gissi G IH S IY
+gist JH IH S T
+gisu JH IH S UW
+gitana JH IY T AE N AH
+gitano G IH T AA N OW
+gitano's G IH T AA N OW Z
+gitchell JH IH CH AH L
+githa JH IH DH AH
+githens G IH TH AH N Z
+gitlin JH IH T L IH N
+gittelman G IH T AH L M AH N
+gittens G IH T AH N Z
+gitter G IH T ER
+gittings JH IH T IH NG Z
+gittins JH IH T IH N Z
+gittis JH IH T AH S
+gittis(2) G IH T IH S
+gittleman G IH T AH L M AH N
+gittleman's G IH T AH L M AH N Z
+gittler G IH T L ER
+gitto JH IY T OW
+giudice JH UW D IH S IY
+giudici JH UW D IH CH IY
+giuffre JH UW F R IY
+giuffre's JH UW F R IY Z
+giuffrida JH UW F R IY D AH
+giuliani JH UW L IY AA N IY
+giuliani's JH UW L IY AA N IY Z
+giuliano JH UW L IY AA N OW
+giulio JH UW L IY OW
+giunta JH UW N T AH
+giurescu JH UW R EH S K UW
+giuseppe JH IH S EH P IY
+giusti JH UW S T IY
+giusto JH UW S T OW
+givan G IH V AH N
+give G IH V
+giveaway G IH V AH W EY
+giveaways G IH V AH W EY Z
+giveback G IH V B AE K
+givebacks G IH V B AE K S
+given G IH V AH N
+given(2) G IH V IH N
+givenchy G IH V EH N CH IY
+givenness G IH V AH N AH S
+givens G IH V AH N Z
+givens's G IH V AH N Z IH Z
+giver G IH V ER
+givers G IH V ER Z
+gives G IH V Z
+giveth G IH V EH TH
+givhan G IH V HH AH N
+givin' G IH V IH N
+giving G IH V IH NG
+givins G IH V IH N Z
+givler G IH V L ER
+giza G IH Z AH
+giza(2) G IY Z AH
+gizbert G IH Z B ER T
+gizbert's G IH Z B ER T S
+gizmo G IH Z M OW
+gizmos G IH Z M OW Z
+gizzard G IH Z ER D
+gizzi JH IY T S IY
+gjelten JH EH L T AH N
+gjelten's JH EH L T AH N Z
+gjerde JH ER D
+glaab G L AA B
+glab G L AE B
+glace G L EY S
+glacial G L EY SH AH L
+glaciate G L EY SH IY EY T
+glaciate(2) G L EY S IY EY T
+glaciated G L EY SH IY EY T AH D
+glaciated(2) G L EY S IY EY T AH D
+glaciation G L EY SH IY EY SH AH N
+glacier G L EY SH ER
+glacier's G L EY SH ER Z
+glaciers G L EY SH ER Z
+glacis G L EY S AH S
+glacken G L AE K AH N
+glackin G L AE K IH N
+glad G L AE D
+gladd G L AE D
+gladden G L AE D AH N
+gladding G L AE D IH NG
+gladdock G L AE D AH K
+glade G L EY D
+glades G L EY D Z
+gladfelter G L AE D F EH L T ER
+gladhill G L AE D HH IH L
+gladiator G L AE D IY EY T ER
+gladiators G L AE D IY EY T ER Z
+gladieux G L AE D IY OW
+gladiolus G L AE D IY OW L AH S
+gladis G L AE D IH S
+gladish G L AE D IH SH
+gladje G L AE D JH IY
+gladly G L AE D L IY
+gladman G L AE D M AH N
+gladney G L AE D N IY
+gladson G L AE D S AH N
+gladstein G L AE D S T AY N
+gladstein(2) G L AE D S T IY N
+gladstone G L AE D S T OW N
+gladstones G L AE D S T OW N Z
+gladu G L EY D UW
+gladwell G L AE D W EH L
+gladwin G L AE D W IH N
+gladys G L AE D IH S
+gladys' G L AE D IH S
+glaeser G L EY Z ER
+glahn G L AE N
+glamor G L AE M ER
+glamorize G L AE M ER AY Z
+glamorized G L AE M ER AY Z D
+glamorizing G L AE M ER AY Z IH NG
+glamorous G L AE M ER AH S
+glamour G L AE M ER
+glance G L AE N S
+glanced G L AE N S T
+glances G L AE N S IH Z
+glancing G L AE N S IH NG
+glancy G L AE N S IY
+gland G L AE N D
+glander G L AE N D ER
+glandon G L AE N D AH N
+glands G L AE N D Z
+glandular G L AE N JH AH L ER
+glanton G L AE N T AH N
+glantz G L AE N T S
+glanville G L AE N V IH L
+glanz G L AE N Z
+glanzer G L AE N Z ER
+glanzman G L AE N Z M AH N
+glare G L EH R
+glared G L EH R D
+glares G L EH R Z
+glaring G L EH R IH NG
+glaris G L EH R IH S
+glas G L AE S
+glasby G L AE S B IY
+glasco G L AA S K OW
+glascock G L AE S K AH K
+glascoe G L AE S K OW
+glaser G L EY Z ER
+glasgow G L AE S K OW
+glasgow(2) G L AE S G OW
+glasheen G L AH SH IY N
+glashow G L AE SH AW
+glasner G L AE S N ER
+glasnost G L AE S N AA S T
+glasnost(2) G L AO S T N OW S T
+glasnost(3) G L AO S N OW S T
+glasow G L EY Z OW
+glasper G L AE S P ER
+glaspie G L AE S P IY
+glaspy G L AE S P IY
+glass G L AE S
+glass's G L AE S IH Z
+glassberg G L AE S B ER G
+glassblower G L AE S B L OW ER
+glassblowers G L AE S B L OW ER Z
+glassblowing G L AE S B L OW IH NG
+glassburn G L AE S B ER N
+glassco G L AE S K OW
+glasscock G L AE S K AA K
+glassed G L AE S T
+glasser G L AE S ER
+glasses G L AE S AH Z
+glasses(2) G L AE S IH Z
+glassey G L AE S IY
+glassford G L AE S F AO R D
+glasslike G L AE S L AY K
+glassmaker G L AE S M EY K ER
+glassmaking G L AE S M EY K IH NG
+glassman G L AE S M AE N
+glassman(2) G L AE S M AH N
+glassmeyer G L AE S M AY ER
+glassner G L AE S N ER
+glasson G L AE S AH N
+glassware G L AE S W EH R
+glassy G L AE S IY
+glastetter G L AE S T IH T ER
+glatfelter G L AE T F IH L T ER
+glatt G L AE T
+glatz G L AE T S
+glatzer G L EY T Z ER
+glaub G L AO B
+glauber G L AW B ER
+glaucoma G L AO K OW M AH
+glaude G L AO D
+glaus G L AO Z
+glauser G L AW S ER
+glavan G L EY V AH N
+glavin G L AE V IH N
+glavine G L AE V IH N
+glavine(2) G L AE V IY N
+glawe G L AO
+glaxo G L AE K S OW
+glaxo's G L AE K S OW Z
+glaza G L AA Z AH
+glaze G L EY Z
+glazebrook G L EY Z B R UH K
+glazed G L EY Z D
+glazener G L AE Z IY N ER
+glazer G L EY Z ER
+glazes G L EY Z AH Z
+glazes(2) G L EY Z IH Z
+glazier G L EY Z IY ER
+glazing G L EY Z IH NG
+glazner G L AE Z N ER
+glazunov G L AE Z UW N AA V
+gleacher G L IY CH ER
+gleam G L IY M
+gleamed G L IY M D
+gleaming G L IY M IH NG
+gleams G L IY M Z
+glean G L IY N
+gleaned G L IY N D
+gleason G L IY S AH N
+gleason's G L IY S AH N Z
+gleaton G L IY T AH N
+gleave G L IY V
+gleaves G L IY V Z
+gleba G L IY B AH
+gleckler G L EH K L ER
+gleda G L EY D AH
+gledhill G L EH D HH IH L
+glee G L IY
+gleeful G L IY F AH L
+gleefully G L IY F AH L IY
+gleeson G L IY Z AH N
+gleghorn G L EH G HH ER N
+gleich G L AY K
+gleichauf G L AY K AO F
+gleim G L IY M
+gleisner G L AY S N ER
+glemp G L EH M P
+glen G L EH N
+glenayre G L EH N EH R
+glenayre(2) G L EH N AY R
+glenbrook G L EH N B R UH K
+glenda G L EH N D AH
+glendale G L EH N D EY L
+glendening G L EH N D AH N IH NG
+glendenning G L EH N D IH N IH NG
+glendinning G L EH N D IH N IH NG
+glendon G L EH N D OW N
+glenfed G L EH N F EH D
+glenfed's G L EH N F EH D Z
+glengarry G L EH N G EH R IY
+glenham G L EH N HH AH M
+glenham(2) G L EH N AH M
+glenmore G L EH N M AO R
+glenn G L EH N
+glenn's G L EH N Z
+glenna G L EH N AH
+glennie G L EH N IY
+glennon G L EH N AH N
+glenny G L EH N IY
+glenora G L AH N AO R AH
+glens G L EH N Z
+glenview G L EH N V Y UW
+glenville G L EH N V IH L
+glenwood G L EH N W UH D
+glenwood's G L EH N W UH D Z
+gless G L EH S
+glessner G L EH S N ER
+glew G L UW
+glib G L IH B
+glibly G L IH B L IY
+glick G L IH K
+glickenhaus G L IH K AH N HH AW S
+glickman G L IH K M AH N
+glickman's G L IH K S M AH N Z
+glicksman G L IH K S M AH N
+glickstein G L IH K S T IY N
+glickstein(2) G L IH K S T AY N
+glidden G L IH D AH N
+glide G L AY D
+glided G L AY D IH D
+glider G L AY D ER
+gliders G L AY D ER Z
+glides G L AY D Z
+glidewell G L AY D W EH L
+gliding G L AY D IH NG
+glimcher G L IH M CH ER
+glimmer G L IH M ER
+glimmering G L IH M ER IH NG
+glimmers G L IH M ER Z
+glimpse G L IH M P S
+glimpsed G L IH M P S T
+glimpses G L IH M P S IH Z
+glines G L AY N Z
+glinka G L IH NG K AH
+glinski G L IH N S K IY
+glint G L IH N T
+glinting G L IH N T IH NG
+glissandi G L AH S AA N D IY
+glisson G L IH S AH N
+glisten G L IH S AH N
+glistened G L IH S AH N D
+glistening G L IH S AH N IH NG
+glistening(2) G L IH S N IH NG
+glitch G L IH CH
+glitches G L IH CH IH Z
+glitter G L IH T ER
+glittered G L IH T ER D
+glittering G L IH T ER IH NG
+glitters G L IH T ER Z
+glittery G L IH T ER IY
+glitz G L IH T S
+glitzy G L IH T S IY
+glo G L OW
+gloam G L OW M
+gloaming G L OW M IH NG
+gloat G L OW T
+gloated G L OW T IH D
+gloating G L OW T IH NG
+gloats G L OW T S
+glob G L AA B
+global G L OW B AH L
+global's G L OW B AH L Z
+globalization G L OW B AH L IH Z EY SH AH N
+globalize G L OW B AH L AY Z
+globalized G L OW B AH L AY Z D
+globally G L OW B AH L IY
+globalstar G L OW B AH L S T AA R
+globcom G L AA B K AA M
+globe G L OW B
+globe's G L OW B Z
+globes G L OW B Z
+globetrotter G L OW B T R AO T ER
+globetrotters G L OW B T R AO T ER Z
+globex G L OW B AH K S
+globo G L OW B OW
+globs G L AA B Z
+globular G L AA B Y AH L ER
+globulin G L AA B Y AH L IH N
+globulins G L AA B Y AH L IH N Z
+globus G L OW B AH S
+glocester G L AW S T ER
+glock G L AA K
+glockenspiel G L AA K AH N S P IY L
+glockner G L AA K N ER
+glod G L AA D
+glodowski G L AH D AO F S K IY
+gloe G L OW
+gloeckner G L OW K N ER
+gloede G L OW D
+glogowski G L AH G AO F S K IY
+glomar G L OW M AA R
+glomb G L AA M
+glomski G L AA M S K IY
+glonass G L AA N AH S
+gloom G L UW M
+gloomier G L UW M IY ER
+gloomily G L UW M AH L IY
+gloomy G L UW M IY
+gloor G L UH R
+glop G L AA P
+gloppy G L AA P IY
+glor G L AO R
+glore G L AO R
+glori G L AO R IY
+gloria G L AO R IY AH
+gloriana G L AO R IY AE N AH
+gloriane G L AO R IY AE N
+glories G L AO R IY Z
+glorification G L AO R AH F IH K EY SH AH N
+glorification(2) G L AO R IH F IH K EY SH AH N
+glorified G L AO R AH F AY D
+glorifies G L AO R AH F AY Z
+glorify G L AO R AH F AY
+glorifying G L AO R AH F AY IH NG
+glorioso G L AO R IY OW S OW
+glorious G L AO R IY AH S
+gloriously G L AO R IY AH S L IY
+glory G L AO R IY
+gloss G L AO S
+glossary G L AO S ER IY
+glossed G L AO S T
+glosser G L AO S ER
+glosses G L AO S IH Z
+glossier G L AO S IY ER
+glossman G L AO S M AH N
+glosson G L AA S AH N
+glossy G L AO S IY
+gloster G L AA S T ER
+glotfelty G L AA T F IH L T IY
+glottal G L AA T AH L
+glottis G L AA T AH S
+glotzbach G L AA T S B AA K
+gloucester G L AO S T ER
+glove G L AH V
+gloved G L AH V D
+glover G L AH V ER
+gloves G L AH V Z
+glow G L OW
+glowacki G L AW AA T S K IY
+glowed G L OW D
+glower G L AW ER
+glowered G L AW ER D
+glowering G L AW ER IH NG
+glowing G L OW IH NG
+glowingly G L OW IH NG L IY
+glows G L OW Z
+gloyd G L OY D
+gluck G L AH K
+gluck's G L AH K S
+gluckman G L AH K M AH N
+glucksman G L AH K S M AH N
+glucosamate G L UW K AA S AH M EY T
+glucosamine G L UW K AA S AH M IY N
+glucose G L UW K OW S
+glucoside G L UW K AH S AY D
+glucosides G L UW K AH S AY D Z
+glue G L UW
+glueck G L UW K
+glued G L UW D
+glues G L UW Z
+glum G L AH M
+glumly G L AH M L IY
+glummer G L AH M ER
+glunt G L AH N T
+gluntz G L AH N T S
+glunz G L AH N Z
+gluskin G L AH S K IH N
+glut G L AH T
+glutamate G L UW T AH M EY T
+glutamic G L UW T AE M IH K
+glutaric G L UW T AE R IH K
+gluten G L UW T AH N
+gluth G L UW TH
+gluts G L AH T S
+glutted G L AH T IH D
+gluttonous G L AH T AH N AH S
+gluttons G L AH T AH N Z
+gluttony G L AH T AH N IY
+glycel G L IH S AH L
+glycemic G L AY S EH M IH K
+glycerol G L IH S ER OW L
+glycine G L AY S IY N
+glycine(2) G L AY S AH N
+glycogen G L AY K AH JH IH N
+glycol G L AY K AO L
+glycol(2) G L AY K OW L
+glycolic G L AY K AO L AH K
+glycomed G L AY K OW M D
+glycomed(2) G L AY K OW M EH D
+glycoside G L AY K AH S AY D
+glymph G L IH M F
+glyn G L IH N
+glyndebourne G L IH N D B AO R N
+glynis G L IH N IH S
+glynn G L IH N
+glynnie G L IH N IY
+glynnis G L IH N IH S
+gmbh G AH M
+gmbh(2) JH IY EH M B IY EY CH
+gnagey N AE JH IY
+gnaizda N EY Z D AH
+gnann N AE N
+gnarl N AA R L
+gnarle N AA R L
+gnarled N AA R L D
+gnarling N AA R L IH NG
+gnarls N AA R L Z
+gnarly N AA R L IY
+gnash N AE SH
+gnashing N AE SH IH NG
+gnat N AE T
+gnatcatcher N AE T K AE CH ER
+gnatcatchers N AE T K AE CH ER Z
+gnats N AE T S
+gnau N AW
+gnaw N AO
+gnawed N AO D
+gnawing N AO IH NG
+gnaws N AO Z
+gnc JH IY EH N S IY
+gneiss N AY S
+gnocchi N OW K IY
+gnome N OW M
+gnomes N OW M Z
+gnomic N OW M IH K
+gnomonic N OW M AA N IH K
+gnosticism N AA S T IH S IH Z AH M
+gnu N UW
+go G OW
+go-cart G OW K AA R T
+goa G OW AH
+goad G OW D
+goaded G OW D IH D
+goading G OW D IH NG
+goal G OW L
+goalie G OW L IY
+goalkeeper G OW L K IY P ER
+goalpost G OW L P OW S T
+goals G OW L Z
+goan G OW N
+goans G OW N Z
+goar G AO R
+goard G AO R D
+goat G OW T
+goat's G OW T S
+goatee G OW T IY
+goates G OW EY T S
+goatley G OW T L IY
+goats G OW T S
+gob G AA B
+gobain G OW B IH N
+gobble G AA B AH L
+gobbled G AA B AH L D
+gobbledygook G AA B AH L D IY G UH K
+gobbler G AA B AH L ER
+gobbler(2) G AA B L ER
+gobblers G AA B AH L ER Z
+gobblers(2) G AA B L ER Z
+gobbles G AA B AH L Z
+gobbling G AA B AH L IH NG
+gobbling(2) G AA B L IH NG
+gobel G OW B AH L
+goben G AA B AH N
+gober G OW B ER
+goberstein G OW B ER S T IY N
+goberstein(2) G OW B ER S T AY N
+gobert G AA B ER T
+gobi G OW B IY
+gobie G OW B IY
+gobin G OW B IH N
+gobinot G OW B IH N AA T
+gobioff G OW B IY AO F
+goble G OW B AH L
+goblet G AA B L AH T
+goblin G AA B L IH N
+goblins G AA B L IH N Z
+goblirsch G AA B L ER SH
+gobs G AA B Z
+gochenour G AA SH IH N UH R
+gochnauer G AA K N AW ER
+gochnour G AH SH N UH R
+gocke G AA K
+gockel G AA K AH L
+gockley G AA K L IY
+god G AA D
+god's G AA D Z
+goda G OW D AH
+godar G AH D AA R
+godard G AH D AA R D
+godart G AA D AA R T
+godbee G AA D B IY
+godbey G AA D B IY
+godbold G AA D B OW L D
+godbolt G AA D B OW L T
+godbout G AA D B AW T
+godby G AA D B IY
+goddam G AA D D AE M
+goddamn G AA D D AE M
+goddard G AA D ER D
+goddart G AA D AA R T
+goddeau G AA D OW
+godden G AA D AH N
+goddess G AA D AH S
+goddesses G AA D AH S IH Z
+godding G AA D IH NG
+godek G OW D IH K
+godette G AH D EH T
+godfather G AA D F AA DH ER
+godfather's G AA D F AA DH ER Z
+godfathers G AA D F AA DH ER Z
+godfrey G AA D F R IY
+godfrey's G AA D F R IY Z
+godhead G AA D HH EH D
+godin G OW D IH N
+godina G OW D IY N AH
+godine G OW D IY N
+godines G AA D AY N Z
+godinez G OW D IY N EH Z
+goding G OW D IH NG
+godino G OW D IY N OW
+godiva G AH D AY V AH
+godkin G AA D K IH N
+godleski G AH D L EH S K IY
+godless G AA D L AH S
+godlewski G AH D L EH F S K IY
+godley G AA D L IY
+godlove G AA D L AH V
+godly G AA D L IY
+godman G AA D M AH N
+godmother G AA D M AH DH ER
+godmothers G AA D M AH DH ER Z
+godot G AH D OW
+godot's G AH D OW Z
+godown G OW D AW N
+godoy G AA D OY
+godrej G AA D R EY
+gods G AA D Z
+godsell G AA D S AH L
+godsend G AA D S EH N D
+godsends G AA D S EH N D Z
+godsey G AA D Z IY
+godshalk G AA D SH AH K
+godshall G AA D SH AH L
+godspeed G AA D S P IY D
+godspell G AA D S P EH L
+godunov G OW D UW N AA V
+godwin G AA D W IH N
+godzilla G AA D Z IH L AH
+goe G OW
+goeas G OW IY AH Z
+goeas(2) G OW Y AH Z
+goebbels G OW B AH L Z
+goebel G OW B AH L
+goecke G OW K
+goedde G OW D
+goede G OW D
+goedecke G OW D IH K
+goeden G OW D AH N
+goedert G OW D ER T
+goedken G OW D K AH N
+goeglein G OW G L AY N
+goehner G OW N ER
+goehring G AO R IH NG
+goeke G OW K
+goeken G OW K AH N
+goeller G OW L ER
+goellner G OW L N ER
+goelz G OW L Z
+goelzer G OW L Z ER
+goeman G OW M AH N
+goemon G OW EY M AH N
+goen G OW N
+goens G OW N Z
+goepfert G OW P F ER T
+goer G OW ER
+goergen G AO R G AH N
+goering G OW ER IH NG
+goerke G AO R K
+goerlitz G AO R L IH T S
+goerner G AO R N ER
+goers G OW ER Z
+goertz G AO R T S
+goertzen G AO R T Z AH N
+goes G OW Z
+goeser G OW Z ER
+goetabanken G OW T AH B AE NG K AH N
+goethals G OW TH AH L Z
+goethe G OW TH
+goetsch G OW CH
+goette G EH T
+goettel G OW T AH L
+goetting G OW T IH NG
+goettl G OW T AH L
+goettsch G OW T CH
+goetz G EH T S
+goetze G OW T Z
+goetzinger G OW T Z IH NG ER
+goetzke G OW T S K IY
+goetzman G OW T S M AH N
+goewey G AA UW IY
+goff G AO F
+goffin G AA F IH N
+goffinet G AA F IH N IH T
+goffman G AA F M AH N
+goffman's G AA F M AH N Z
+goffney G AA F N IY
+goffredo G OW F R EY D OW
+goforth G OW F AO R TH
+goga G OW G AH
+gogan G OW G AH N
+gogel G OW G AH L
+goggans G AA G AH N Z
+goggin G AA G IH N
+goggins G AA G IH N Z
+goggle G AA G AH L
+goggles G AA G AH L Z
+gogh G OW
+goghs G OW Z
+goglia G AA G L IY AH
+gogo G OW G OW
+goguen G OW G W AH N
+goh G OW
+goheen G AH HH IY N
+gohl G OW L
+gohlke G AA K
+gohlke(2) G OW K
+gohman G OW M AH N
+gohn G AA N
+gohr G AA R
+goin G OY N
+goin' G OW AH N
+goines G OY N Z
+going G OW IH NG
+going(2) G OW IH N
+goings G OW IH NG Z
+goings-on G OW IH NG Z AA N
+goings-ons G OW IH NG Z AA N Z
+goins G OY N Z
+goiter G OY T ER
+goizueta G OY Z W EY T AH
+gokey G OW K IY
+goksel G AO K S AH L
+gola G OW L AH
+golab G OW L AE B
+golan G OW L AH N
+golan(2) G AH L AA N
+goland G OW L AH N D
+golas G OW L AH Z
+golaszewski G AH L AH SH EH F S K IY
+golay G AA L EY
+golba G OW L B AH
+golberg G OW L B ER G
+golconda G AA L K AA N D AH
+gold G OW L D
+gold's G OW L D Z
+golda G OW L D AH
+goldade G OW L D EY D
+goldammer G OW L D AH M ER
+goldbach G OW L D B AA K
+goldbaum G OW L D B AW M
+goldbeck G OW L D B EH K
+goldberg G OW L D B ER G
+goldberg's G OW L D B ER G Z
+goldberger G OW L D B ER G ER
+goldblatt G OW L D B L AH T
+goldblum G OW L D B L AH M
+goldcor G OW L D K AO R
+goldcreek G OW L D K R IY K
+goldcrest G OW L D K R EH S T
+golde G OW L D
+golden G OW L D AH N
+golden's G OW L D AH N Z
+goldenberg G OW L D AH N B ER G
+goldeneye G OW L D AH N AY
+goldenrod G OW L D AH N R AA D
+goldenson G OW L D AH N S AH N
+goldenson's G OW L D AH N S AH N Z
+goldenstein G OW L D AH N S T AY N
+goldenstein(2) G OW L D AH N S T IY N
+goldenthal G OW L D AH N TH AA L
+goldenthal's G OW L D AH N TH AA L Z
+golder G OW L D ER
+goldest G OW L D IH S T
+goldey G OW L D IY
+goldfarb G OW L D F AA R B
+goldfeder G OW L D F EH D ER
+goldfield G OW L D F IY L D
+goldfields G OW L D F IY L D Z
+goldfinch G OW L D F IH N CH
+goldfinches G OW L D F IH N CH IH Z
+goldfine G OW L D F AY N
+goldfinger G OW L D F IH NG G ER
+goldfish G OW L D F IH SH
+goldfus G OW L D F AH S
+goldhammer G OW L D HH AE M ER
+goldie G OW L D IY
+goldilocks G OW L D IY L AO K S
+goldin G OW L D IH N
+golding G OW L D IH NG
+goldinger G OW L D IH NG ER
+goldman G OW L D M AH N
+goldman's G OW L D M AH N Z
+goldmann G OW L D M AH N
+goldmans G OW L D M AH N Z
+goldmark G OW L D M AA R K
+goldmine G OW L D M AY N
+goldner G OW L D N ER
+goldome G OW L D OW M
+goldome(2) G OW L D D OW M
+goldress G OW L D R EH S
+goldrick G OW L D R IH K
+goldring G OW L D R IH NG
+golds G OW L D Z
+goldsberry G OW L D Z B EH R IY
+goldsborough G OW L D Z B ER OW
+goldsby G OW L D Z B IY
+goldschmid G OW L D SH M IH D
+goldschmidt G OW L D SH M IH T
+goldsmith G OW L D S M IH TH
+goldsmith's G OW L D S M IH TH S
+goldson G OW L D S AH N
+goldstar G OW L D S T AA R
+goldstein G OW L D S T AY N
+goldstein's G OW L D S T AY N Z
+goldstein's(2) G OW L D S T IY N Z
+goldstein(2) G OW L D S T IY N
+goldstock G OW L D S T AA K
+goldston G OW L D S T AH N
+goldstone G OW L D S T OW N
+goldstrike G OW L D S T R AY K
+goldsworthy G OW L D Z W ER DH IY
+goldthwaite G OW L D TH W EY T
+goldwasser G OW L D W AO S ER
+goldwater G OW L D W AO T ER
+goldwater's G OW L D W AO T ER Z
+goldwin G OW L D W IH N
+goldwire G OW L D W AY R
+goldwyn G OW L D W IH N
+goldy G OW L D IY
+golec G OW L IH K
+golem G OW L AH M
+goleman G OW L M AH N
+golembeski G AH L IH M B EH S K IY
+golembiewski G AH L IH M B IY EH F S K IY
+golen G AA L AH N
+goley G OW L IY
+golf G AA L F
+golf's G AA L F S
+golf(2) G AO L F
+golfarb G AO L F AA R B
+golfed G AA L F T
+golfer G AA L F ER
+golfer's G AA L F ER Z
+golfers G AA L F ER Z
+golfie G AA L F IY
+golfing G AA L F IH NG
+golfing(2) G AO L F IH NG
+golfman G AA L F M AH N
+golfs G AA L F S
+golgi G OW L JH IY
+golgo G OW L G OW
+goliath G AH L AY AH TH
+goliaths G OW L IY AE TH S
+golightly G OW L AY T L IY
+golinski G AH L IH N S K IY
+golisano G OW L IH S AA N OW
+golkar G OW L K AA R
+goll G AA L
+golla G AA L AH
+golladay G AA L AH D EY
+golle G AA L
+goller G AA L ER
+golliday G AA L IY D EY
+golliher G AA L IH HH ER
+gollnick G AA L N IH K
+gollum G AA L AH M
+gollust G OW L AH S T
+golly G AA L IY
+golob G OW L AH B
+golomb G AA L AH M
+golombek G AO L AH M B EH K
+golonka G OW L OW NG K AH
+goloven G OW L AH V AH N
+golphin G OW L F IH N
+golson G OW L S AH N
+golston G OW L S T AH N
+goltz G OW L T S
+golub G OW L AH B
+golubski G AH L AH B S K IY
+golz G OW L Z
+goma G OW M AH
+gombar G AH M B AA R
+gomberg G AA M B ER G
+gombert G AA M B ER T
+gombos G OW M B OW Z
+gomer G OW M ER
+gomery G OW M ER IY
+gomes G OW M EH Z
+gomez G OW M EH Z
+gomillion G AA M IH L Y AH N
+gomoll G AA M AH L
+gomorrah G AH M AO R AH
+gomory G OW M ER IY
+gonad G OW N AE D
+gonads G OW N AE D Z
+gonaives G OW N AY V Z
+goncalves G OW N K AA L V EH S
+gonce G AA N S
+goncharov G AA N CH ER AA V
+gond G AA N D
+gonda G AA N D AH
+gondek G AA N D IH K
+gonder G AA N D ER
+gondola G AA N D AH L AH
+gondola(2) G AA N D OW L AH
+gondolas G AA N D AH L AH Z
+gondolas(2) G AA N D OW L AH Z
+gondolier G AA N D AH L IH R
+gondoliers G AA N D AH L IH R Z
+gondwana G AA N D W AA N AA
+gondwanaland G AA N D W AA N AA L AE N D
+gone G AO N
+goner G AA N ER
+gonet G OW N IH T
+gong G AO NG
+gongaware G AA NG G AH W EH R
+gongora G OW NG G AO R AH
+gongs G AO NG Z
+gonia G OW N IY AH
+goniometer G OW N IY AA M AH T ER
+gonium G OW N IY AH M
+gonna G AA N AH
+gonnella G OW N EH L AH
+gonnerman G AA N ER M AH N
+gonococcal G AA N AH K AA K AH L
+gonorrhea G AA N ER IY AH
+gonsales G OW N S EY L Z
+gonsalez G OW N S AA L EH Z
+gonsalves G OW N S AA L V EH S
+gonser G AA N S ER
+gonsoulin G AA N S AW L IH N
+gonterman G AA N T ER M AH N
+gonya G OW N Y AH
+gonyea G OW N Y EH
+gonyer G OW N Y ER
+gonyo G OW N Y OW
+gonzales G AA N Z AA L AH S
+gonzalez G AA N Z AA L AH Z
+gonzalez's G AA N Z AA L AH Z AH Z
+gonzalo G AA N Z AA L OW
+gonzo G AA N Z OW
+gonzo's G AA N Z OW Z
+goo G UW
+gooch G UW CH
+good G UH D
+good's G UH D Z
+good(2) G IH D
+good-bye G IH D B AY
+good-bye(2) G UH D B AY
+good-heartedly G UH D HH AA R T IH D L IY
+good-naturedly G UH D N EY CH ER D L IY
+gooda G UH D AH
+gooda(2) G UW D AH
+goodale G UH D EY L
+goodall G UH D AO L
+goodbar G UH D B AA R
+goodbread G UH D B R EH D
+goodby G UH D B AY
+goodbye G UH D B AY
+goodbyes G UH D B AY Z
+goodbyes(2) G IH D B AY Z
+goodchild G UH D CH AY L D
+goode G UH D
+goodell G UH D EH L
+gooden G UH D AH N
+gooden's G UH D AH N Z
+goodenough G UH D AH N AW
+goodenow G UH D EH N OW
+gooder G UH D ER
+gooderham G UH D ER HH AE M
+gooders G UH D ER Z
+goodfella G UH D F EH L AH
+goodfellas G UH D F EH L AH Z
+goodfellow G UH D F EH L OW
+goodfellows G UH D F EH L OW Z
+goodfriend G UH D F R EH N D
+goodfriends G UH D F R EH N D Z
+goodgame G UH D G EY M
+goodhart G UH D HH AA R T
+goodheart G UH D HH AA R T
+goodhue G UH D HH Y UW
+goodie G UH D IY
+goodies G UH D IY Z
+goodin G UH D AH N
+goodine G UH D AY N
+gooding G UH D IH NG
+gooding's G UH D IH NG Z
+goodison G UH D IH S AH N
+goodkin G UH D K IH N
+goodland G UH D L AH N D
+goodland(2) G UH D L AE N D
+goodlet G UH D L EH T
+goodlett G UH D L EH T
+goodley G UH D L IY
+goodlin G UH D L IH N
+goodling G UH D L IH NG
+goodloe G UH D L OW
+goodlow G UH D L OW
+goodly G UH D L IY
+goodman G UH D M AH N
+goodman's G UH D M AE N Z
+goodmorning G UH D M AO R N IH NG
+goodner G UH D N ER
+goodness G UH D N AH S
+goodness(2) G UH D N IH S
+goodnight G UH D N AY T
+goodnights G UH D N AY T S
+goodnough G UH D N AH F
+goodnow G UH D N OW
+goodpaster G UH D P AE S T ER
+goodpasture G UH D P AE S CH ER
+goodreau G UH D R OW
+goodrich G UH D R IH CH
+goodrich's G UH D R IH CH IH Z
+goodrick G UH D R IH K
+goodridge G UH D R IH JH
+goodroe G UH D R OW
+goodrow G UH D R OW
+goodrum G UH D R AH M
+goods G UH D Z
+goodsell G UH D S EH L
+goodson G UH D S AH N
+goodson's G UH D S AH N Z
+goodspeed G UH D S P IY D
+goodspeed's G UH D S P IY D Z
+goodstein G UH D S T AY N
+goodstein(2) G UH D S T IY N
+goodtab G UH D T AE B
+goodwill G UH D W IH L
+goodwin G UH D W IH N
+goodwine G UH D W AY N
+goodwyn G UH D W IH N
+goody G UH D IY
+goody's G UH D IY Z
+goodyear G UH D Y IH R
+goodyear's G UH D Y IH R Z
+goodyear(2) G UH D Y IY R
+gooey G UW IY
+goof G UW F
+goofed G UW F T
+goofing G UW F IH NG
+goofs G UW F S
+goofy G UW F IY
+googe G UW JH
+googin G UW G IH N
+googins G UW G IH N Z
+gook G UH K
+gookin G UH K IH N
+goold G UW L D
+gooley G UW L IY
+goolsby G UW L S B IY
+goon G UW N
+goonan G UW N AH N
+goons G UW N Z
+goop G UW P
+goos G UW Z
+goosby G UW S B IY
+goose G UW S
+gooseberries G UW S B EH R IY Z
+gooseberry G UW S B EH R IY
+goosefish G UW S F IH SH
+goosefoot G UW S F UH T
+goosen G UW S AH N
+goosey G UW S IY
+goossen G UW S AH N
+goossens G UW S AH N Z
+goostree G UW S T R IY
+gootee G UW T IY
+gopac G OW P AE K
+gopac's G OW P AE K S
+gopal G OW P AA L
+gopher G OW F ER
+gophers G OW F ER Z
+gopi G OW P IY
+gopinath G OW P IH N AH TH
+gora G AO R AH
+goracke G AO R AH K
+goradze G AO R AA D Z AH
+goral G AO R AH L
+goralski G ER AA L S K IY
+goran G AO R AH N
+goranson G AO R AH N S AH N
+gorazde G AO R AA ZH D AH
+gorazde's G AO R AA ZH D AH Z
+gorazde's(2) G ER AA ZH D AH Z
+gorazde(2) G ER AA ZH D AH
+gorbachev G AO R B AH CH EH V
+gorbachev's G AO R B AH CH EH V Z
+gorbachev's(2) G AO R B AH CH AO F S
+gorbachev(2) G AO R B AH CH AO F
+gorbachevs G AO R B AH CH EH V Z
+gorbachevs(2) G AO R B AH CH AO F S
+gorby G AO R B IY
+gorczyca G ER CH IH K AH
+gorczynski G ER CH IH N S K IY
+gorda G AO R D AH
+gordan G AO R D AH N
+gordana G AO R D AE N AH
+gorden G AO R D AH N
+gorder G AO R D ER
+gordeyev G AO R D AY AH V
+gordian G AO R D IY AH N
+gordie G AO R D IY
+gordillo G AO R D IH L OW
+gordin G AO R D IH N
+gordinier G AO R D IH N IY ER
+gordji G AO R JH IY
+gordner G AO R D N ER
+gordon G AO R D AH N
+gordon's G AO R D AH N Z
+gordy G AO R D IY
+gordy's G AO R D IY Z
+gore G AO R
+gore's G AO R Z
+gorecki G ER EH T S K IY
+gored G AO R D
+goree G AO R IY
+gorelick G AO R IH L IH K
+goren G AO R AH N
+gorenflo G AO R EH N F L OW
+gores G AO R Z
+gorey G AO R IY
+gorgas G AO R G AH Z
+gorge G AO R JH
+gorgeous G AO R JH AH S
+gorges G AO R JH AH Z
+gorges(2) G AO R JH IH Z
+gorgets G AO R G AH T S
+gorgon G AO R G AH N
+gorgone G AO R G AH N
+gorgonian G AO R G OW N IY AH N
+gorgons G AO R G AH N Z
+gorguze G AO R G Y UW Z
+gorham G AO R AH M
+gori G AO R IY
+goria G AO R IY AH
+gorilla G ER IH L AH
+gorillas G ER IH L AH Z
+gorin G AO R AH N
+goring G AO R IH NG
+goris G AO R AH S
+gorka G AO R K AH
+gorki G AO R K IY
+gorky G AO R K IY
+gorky's G AO R K IY Z
+gorley G AO R L IY
+gorman G AO R M AH N
+gormley G AO R M L IY
+gormly G AO R M L IY
+gorney G AO R N IY
+gorniak G AO R N IY AE K
+gornick G AO R N IH K
+gornik G AO R N IH K
+gornto G AO R N T OW
+gorny G AO R N IY
+gorospe G AO R OW S P EY
+gorr G AO R
+gorrell G AO R EY L
+gorriak G AO R IY AE K
+gorrid G AO R AH D
+gorrids G AO R AH D Z
+gorski G AO R S K IY
+gorsky G AO R S K IY
+gorsline G AO R S L AY N
+gorsuch G AO R S AH CH
+gort G AO R T
+gortari G AO R T AA R IY
+gorter G AO R T ER
+gortney G AO R T N IY
+gorton G AO R T AH N
+gorum G AO R AH M
+gory G AO R IY
+gosa G OW S AH
+gosbank G AO S B AE NG K
+gosch G AO SH
+gosdin G AA S D IH N
+gose G OW Z
+gosh G AA SH
+gosha G OW SH AH
+goshawk G AA S HH AO K
+goshen G OW SH IH N
+goshorn G AA SH ER N
+goslee G AA S L IY
+goslin G AA S L IH N
+gosline G AA S L AY N
+gosman G AA S M AH N
+gosnell G AA S N AH L
+gosney G AA S N IY
+gosornstem G AH S AO R N S T EH M
+gospel G AA S P AH L
+gospel(2) G AO S P AH L
+gospels G AA S P AH L Z
+gosplan G AO S P L AE N
+goss G AO S
+gossage G AO S IH JH
+gossamer G AA S AH M ER
+gossard G AH S AA R D
+gosse G AA S
+gosselin G AA S IH L IH N
+gossen G AO S AH N
+gosser G AO S ER
+gossett G AA S IH T
+gossip G AA S AH P
+gossiper G AA S AH P ER
+gossipers G AA S AH P ER Z
+gossiping G AA S AH P IH NG
+gossips G AA S AH P S
+gossipy G AA S AH P IY
+gossman G AO S M AH N
+gostev G AO S T AH V
+gostomski G AH S T AA M S K IY
+goswick G AA S W IH K
+got G AA T
+gotaas G AA T AA S
+gotbaum G AA T B AO M
+gotbaum(2) G AA T B AW M
+gotch G AA CH
+gotcha G AA CH AH
+gotcher G AA CH ER
+goth G AA TH
+gotham G AA TH AH M
+gothard G AA TH ER D
+gothenburg G OW T AH N B ER G
+gothenburg(2) G AA T AH N B ER G
+gothic G AA TH IH K
+gotlieb G AA T L IY B
+goto G OW T UW
+goto(2) G OW T OW
+gotsch G AA CH
+gotschal G AA CH AH L
+gotschall G AA CH AH L
+gotshal G AA CH AH L
+gotshal's G AA CH AH L Z
+gotshall G AA CH AH L
+gott G AA T
+gotta G AA T AH
+gotten G AA T AH N
+gotten(2) G AO T AH N
+gotterdammerung G AA T ER D AE M ER AH NG
+gottesman G AA T S M AH N
+gottfried G AO T F R IY D
+gotthardt G AA TH AA R T
+gotthelf G AA T HH EH L F
+gotti G AA T IY
+gottis G AA T IH S
+gottis(2) G AA T IY Z
+gottlieb G AA T L IY B
+gottlieb's G AA T L IY B Z
+gottman G AA T M AH N
+gotts G AA T S
+gottsch G AA CH
+gottschalk G AA CH AH K
+gottschalks G AA CH AH K S
+gottschall G AA CH AH L
+gottshall G AA CH AH L
+gottwald G AA T W AH L D
+gotwalt G AA T W AH L T
+gotz G AA T S
+goucher G AW K ER
+goude G AW D
+goudeau G UW D OW
+goudie G AW D IY
+goudreau G UW D R OW
+goudy G AW D IY
+gouge G AW JH
+gouged G AW JH D
+gougeon G AW JH IH N
+gouger G AW JH ER
+gough G AO F
+goughnour G AW N ER
+gouging G AW JH IH NG
+gouin G W IY N
+gouker G AW K ER
+goulart G UW L AA R T
+goulash G UW L AA SH
+gould G UW L D
+gould's G UW L D Z
+goulden G UH D AH N
+goulding G UW L D IH NG
+goulet G UW L EH T
+goulette G UW L EH T
+goulston G UW L S T AH N
+gounod G UW N AH D
+goupil G UW P AH L
+gourd G AO R D
+gourdine G UH R D AY N
+gourds G AO R D Z
+gourlay G AO R L EY
+gourley G AO R L IY
+gourment G AO R M EH N T
+gourmet G UH R M EY
+gourmets G UH R M EY Z
+gousha G UW SH AH
+gout G AW T
+goutal G UW T AH L
+gouty G AW T IY
+gouvea G UW V EY AH
+gouveia G UW V EY IY AH
+gov G AH V
+gov(2) G AH V ER N ER
+govan G OW V AH N
+gove G OW V
+govea G AH V IY AH
+gover G AH V ER
+govern G AH V ER N
+governale G AH V ER N EY L
+governance G AH V ER N AH N S
+governed G AH V ER N D
+governess G AH V ER N AH S
+governing G AH V ER N IH NG
+government G AH V ER M AH N T
+government's G AH V ER M AH N T S
+government's(2) G AH V ER N M AH N T S
+government(2) G AH V ER N M AH N T
+governmental G AH V ER M EH N T AH L
+governmental(2) G AH V ER N M EH N T AH L
+governmentally G AH V ER M EH N T AH L IY
+governmentally(2) G AH V ER M EH N AH L IY
+governments G AH V ER M AH N T S
+governments' G AH V ER N M AH N T S
+governments'(2) G AH V ER M AH N T S
+governments(2) G AH V ER N M AH N T S
+governor G AH V ER N ER
+governor's G AH V ER N ER Z
+governors G AH V ER N ER Z
+governors' G AH V ER N ER Z
+governorship G AH V ER N ER SH IH P
+governorships G AH V ER N ER SH IH P S
+governs G AH V ER N Z
+govett G AH V AH T
+govier G OW V IY ER
+govoni G OW V OW N IY
+govpx G AH V P IY EH K S
+govs G AA V Z
+govs(2) G AA V ER N ER Z
+gow G AW
+gowan G AW AH N
+gowans G AW AH N Z
+goward G OW W ER D
+gowdy G AW D IY
+gowell G AA W EH L
+gowen G AW AH N
+gowens G AW AH N Z
+gower G AW ER
+gowin G AW IH N
+gowing G AW IH NG
+gowins G AW IH N Z
+gown G AW N
+gowns G AW N Z
+goy G OY
+goya G OY AH
+goya's G OY AH Z
+goyer G OY ER
+goyette G OY EH T
+goyim G OY IH M
+goyko G OY K OW
+goyne G OY N
+goynes G OY N Z
+goza G OW Z AH
+gozo G OW Z OW
+gozo's G OW Z OW Z
+gozofsky G AH Z AO F S K IY
+grab G R AE B
+grabau G R AE B AW
+grabbe G R AE B
+grabbed G R AE B D
+grabber G R AE B ER
+grabbers G R AE B ER Z
+grabbing G R AE B IH NG
+grabe G R EY B
+grabel G R AE B AH L
+graben G R AE B AH N
+grabens G R AA B AH N Z
+grabenstein G R AE B AH N S T AY N
+grabenstein(2) G R AE B AH N S T IY N
+graber G R EY B ER
+grabert G R AE B ER T
+grabill G R AH B IH L
+grabinski G R AH B IH N S K IY
+grable G R EY B AH L
+grabner G R AE B N ER
+graboski G R AH B AW S K IY
+grabow G R AE B OW
+grabowski G R AH B AO F S K IY
+graboy G R EY B OY
+grabs G R AE B Z
+grabski G R AE B S K IY
+grace G R EY S
+grace's G R EY S IH Z
+graced G R EY S T
+graceffa G R AH S EH F AH
+graceful G R EY S F AH L
+gracefully G R EY S F AH L IY
+graceland G R EY S L AE N D
+graceless G R EY S L AH S
+graces G R EY S IH Z
+gracey G R EY S IY
+grachev G R AA CH EH V
+grachev's G R AA CH EH V Z
+grachov G R AA CH AO V
+graci G R AA CH IY
+gracia G R AA CH AH
+graciano G R AA CH IY AA N OW
+gracie G R EY S IY
+gracile G R AE S AH L
+gracing G R EY S IH NG
+gracious G R EY SH AH S
+graciously G R EY SH AH S L IY
+graciousness G R EY SH AH S N AH S
+grackle G R AE K AH L
+grackles G R AE K AH L Z
+graco G R AE K OW
+gracy G R EY S IY
+graczyk G R AA CH IH K
+grad G R AE D
+gradate G R EY D EY T
+gradation G R EY D EY SH AH N
+gradations G R EY D EY SH AH N Z
+gradchev G R AE D CH EH F
+gradchev(2) G R AE D CH AO V
+gradco G R AE D K OW
+graddy G R AE D IY
+grade G R EY D
+graded G R EY D AH D
+graded(2) G R EY D IH D
+gradel G R AE D AH L
+graden G R EY D AH N
+grader G R EY D ER
+graders G R EY D ER Z
+grades G R EY D Z
+gradient G R EY D IY AH N T
+gradients G R EY D IY AH N T S
+grading G R EY D IH NG
+gradison G R AE D IH S AH N
+gradney G R AE D N IY
+grado G R AA D OW
+gradov G R EY D AO F
+gradovs G R EY D AO F S
+grads G R AE D Z
+gradstein G R AE D S T IY N
+gradstein's G R AE D S T IY N Z
+gradstein's(2) G R AE D S T AY N Z
+gradstein(2) G R AE D S T AY N
+gradual G R AE JH UW AH L
+gradualism G R AE JH AH W AH L IH Z AH M
+gradualist G R AE JH AH W AH L IH S T
+gradually G R AE JH UW AH L IY
+gradually(2) G R AE JH UW L IY
+graduate G R AE JH AH W AH T
+graduate(2) G R AE JH AH W EY T
+graduate(3) G R AE JH UW W AH T
+graduate(4) G R AE JH UW EY T
+graduated G R AE JH UW EY T IH D
+graduated(2) G R AE JH AH W EY T IH D
+graduates G R AE JH AH W AH T S
+graduates(2) G R AE JH AH W EY T S
+graduates(3) G R AE JH UW W AH T S
+graduates(4) G R AE JH UW EY T S
+graduating G R AE JH AH W EY T IH NG
+graduating(2) G R AE JH UW EY T IH NG
+graduation G R AE JH UW EY SH AH N
+graduation(2) G R AE JH AH W EY SH AH N
+graduations G R AE JH UW EY SH AH N Z
+graduations(2) G R AE JH AH W EY SH AH N Z
+gradus G R EY D AH S
+grady G R EY D IY
+graeber G R EH B ER
+graebner G R EH B N ER
+graef G R IY F
+graef(2) G R AE F
+graefe G R IY F
+graefe(2) G R AE F
+graeff G R IY F
+graeff(2) G R AE F
+graeme G R EY M
+graeme(2) G R AE M
+graeser G R EY Z ER
+graessle G R EH S AH L
+graetz G R IY T S
+graf G R AE F
+grafe G R EY F
+graff G R AE F
+graffam G R AE F AH M
+graffeo G R AA F IY OW
+graffiti G R AH F IY T IY
+graffius G R AE F IY IH S
+graft G R AE F T
+grafted G R AE F T IH D
+grafting G R AE F T IH NG
+grafton G R AE F T AH N
+grafts G R AE F T S
+grage G R EY JH
+gragert G R EY G ER T
+gragg G R AE G
+graham G R EY AH M
+graham's G R EY AH M Z
+graham's(2) G R AE M Z
+graham(2) G R AE M
+grahams G R AE M Z
+grahams(2) G R EY AH M Z
+grahek G R AE HH IH K
+grahl G R AA L
+grahn G R AE N
+graichen G R AY K AH N
+grail G R EY L
+grain G R EY N
+grained G R EY N D
+grainery G R EY N ER IY
+grainger G R AA IH NG ER
+grains G R EY N Z
+grainy G R EY N IY
+grajeda G R AY IY D AH
+graley G R AE L IY
+grall G R AO L
+gram G R AE M
+grama G R AE M AH
+gramaphone G R AE M AH F OW N
+grambling G R AE M B L IH NG
+grambling(2) G R AE M B AH L IH NG
+gramer G R EY M ER
+gramercy G R AH M ER S IY
+gramersey G R AH M ER S IY
+grames G R EY M Z
+gramley G R AE M L IY
+gramlich G R AE M L IH K
+gramling G R AE M L IH NG
+gramm G R AE M
+gramm's G R AE M Z
+grammar G R AE M ER
+grammatical G R AH M AE T AH K AH L
+grammatical(2) G R AH M AE T IH K AH L
+grammatico G R AA M AA T IY K OW
+grammer G R AE M ER
+grammies G R AE M IY Z
+grammophon G R AE M AH F AA N
+gramms G R AE M Z
+grammy G R AE M IY
+grammy's G R AE M IY Z
+grammys G R AE M IY Z
+grams G R AE M Z
+gramza G R AE M Z AH
+gran G R AE N
+grana G R AE N AH
+granada G R AH N AA D AH
+granada's G R AH N AA D AH Z
+granade G R AH N EY D
+granado G R AA N AA D OW
+granados G R AA N AA D OW Z
+granahan G R AE N AH HH AE N
+granat G R AE N AH T
+granata G R AA N AA T AH
+granato G R AA N AA T OW
+granberg G R AE N B ER G
+granberry G R AE N B EH R IY
+grancare G R AE N K EH R
+grand G R AE N D
+grand's G R AE N D Z
+granda G R AE N D AH
+grandad G R AE N D AE D
+grandbabies G R AE N D B EY B IY Z
+grandbabies(2) G R AE N B EY B IY Z
+grandbaby G R AE N D B EY B IY
+grandbaby(2) G R AE N B EY B IY
+grandberry G R AE N D B EH R IY
+grandchamp G R AE N D CH AE M P
+grandchild G R AE N D CH AY L D
+grandchild(2) G R AE N CH AY L D
+grandchildren G R AE N CH IH L D R AH N
+grandchildren's G R AE N CH IH L D R AH N Z
+grandchildren's(2) G R AE N D CH IH L D R AH N Z
+grandchildren(2) G R AE N D CH IH L D R AH N
+granddaddy G R AE N D AE D IY
+granddaughter G R AE N D AO T ER
+granddaughter's G R AE N D AO T ER Z
+granddaughters G R AE N D AO T ER Z
+grande G R AE N D
+grander G R AE N D ER
+granderson G R AE N D ER S AH N
+grandest G R AE N D AH S T
+grandeur G R AE N D UW R
+grandfather G R AE N D F AA DH ER
+grandfather's G R AE N D F AA DH ER Z
+grandfather's(2) G R AE N F AA DH ER Z
+grandfather(2) G R AE N F AA DH ER
+grandfathered G R AE N D F AA DH ER D
+grandfathered(2) G R AE N F AA DH ER D
+grandfathering G R AE N D F AA DH ER IH NG
+grandfathering(2) G R AE N F AA DH ER IH NG
+grandfatherly G R AE N D F AA DH ER L IY
+grandfatherly(2) G R AE N F AA DH ER L IY
+grandfathers G R AE N D F AA DH ER Z
+grandfathers(2) G R AE N F AA DH ER Z
+grandfield G R AE N D F IY L D
+grandi G R AE N D IY
+grandillo G R AE N D IH L OW
+grandiloquent G R AE N D IH L AH K W AH N T
+grandin G R AE N D IH N
+grandinetti G R AE N D IY N EH T IY
+grandiose G R AE N D IY OW S
+grandis G R AE N D IH S
+grandison G R AE N D IH S AH N
+grandkid G R AE N D K IH D
+grandkid(2) G R AE N K IH D
+grandkids G R AE N D K IH D Z
+grandkids(2) G R AE N K IH D Z
+grandly G R AE N D L IY
+grandma G R AE M AA
+grandma's G R AE N D M AA Z
+grandma's(2) G R AE M AA Z
+grandma(2) G R AE N D M AA
+grandmaison G R AE N D M AY Z AA N
+grandmaison(2) G R AE N D M EY S AH N
+grandmas G R AE N D M AA Z
+grandmas(2) G R AE N M AA Z
+grandmas(3) G R AE M AA Z
+grandmaster G R AE N D M AE S T ER
+grandmaster(2) G R AE N M AE S T ER
+grandmet G R AE N D M EH T
+grandmother G R AE N D M AH DH ER
+grandmother's G R AE N D M AH DH ER Z
+grandmother's(2) G R AE M AH DH ER Z
+grandmother's(3) G R AE N M AH DH ER Z
+grandmother(2) G R AE N M AH DH ER
+grandmother(3) G R AE M AH DH ER
+grandmotherly G R AE N D M AH DH ER L IY
+grandmotherly(2) G R AE N M AH DH ER L IY
+grandmotherly(3) G R AE M AH DH ER L IY
+grandmothers G R AE N D M AH DH ER Z
+grandmothers(2) G R AE N M AH DH ER Z
+grandmothers(3) G R AE M AH DH ER Z
+grandnephew G R AE N D N EH F Y UW
+grandnephew(2) G R AE N N EH F Y UW
+grandnephews G R AE N D N EH F Y UW Z
+grandnephews(2) G R AE N N EH F Y UW Z
+grandon G R AE N D AA N
+grandpa G R AE N D P AA
+grandpa(2) G R AE N P AA
+grandpa(3) G R AE M P AA
+grandparent G R AE N D P EH R AH N T
+grandparent(2) G R AE N P EH R AH N T
+grandparent(3) G R AE M P EH R AH N T
+grandparents G R AE N D P EH R AH N T S
+grandparents' G R AE N D P EH R AH N T S
+grandparents'(2) G R AE N P EH R AH N T S
+grandparents'(3) G R AE M P EH R AH N T S
+grandparents(2) G R AE N P EH R AH N T S
+grandparents(3) G R AE M P EH R AH N T S
+grandpre G R AE N D P R EY
+grands G R AE N D Z
+grandson G R AE N D S AH N
+grandson's G R AE N D S AH N Z
+grandson's(2) G R AE N S AH N Z
+grandson(2) G R AE N S AH N
+grandsons G R AE N D S AH N Z
+grandsons(2) G R AE N S AH N Z
+grandstaff G R AE N D S T AE F
+grandstaff(2) G R AE N S T AE F
+grandstand G R AE N D S T AE N D
+grandstand(2) G R AE N S T AE N D
+grandstanding G R AE N D S T AE N D IH NG
+grandstanding(2) G R AE N S T AE N D IH NG
+grandt G R AE N T
+granduncle G R AE N D AH NG K AH L
+granduncles G R AE N D AH NG K AH L Z
+grandview G R AE N D V Y UW
+grandy G R AE N D IY
+graner G R EY N ER
+granese G R AE N IY Z
+graney G R EY N IY
+granfield G R AE N F IY L D
+grange G R EY N JH
+granger G R EY N JH ER
+grangers G R EY N JH ER Z
+granges G R EY N JH IH Z
+granholm G R AE N HH OW L M
+granier G R EY N IY ER
+granieri G R AA N IH R IY
+granillo G R AH N IH L OW
+graningeverken G R AE N IH NG G EH V ER K AH N
+graningeverken's G R AE N IH NG G EH V ER K AH N Z
+granite G R AE N AH T
+granite(2) G R AE N IH T
+granitic G R AH N IH T IH K
+granito G R AA N IY T OW
+granlund G R AE N L AH N D
+grannan G R AE N AH N
+grannies G R AE N IY Z
+grannis G R AE N IH S
+granny G R AE N IY
+grano G R AA N OW
+granoff G R AE N AO F
+granola G R AH N OW L AH
+granquist G R AE N K W IH S T
+granstrom G R AE N S T R AH M
+grant G R AE N T
+grant's G R AE N T S
+granted G R AE N T AH D
+granted(2) G R AE N T IH D
+granted(3) G R AE N AH D
+granted(4) G R AE N IH D
+grantham G R AE N TH AH M
+granting G R AE N T IH NG
+granting(2) G R AE N IH NG
+grantland G R AE N T L AH N D
+grantor G R AE N T ER
+grantors G R AE N T ER Z
+grantree G R AE N T R IY
+grantree's G R AE N T R IY Z
+grants G R AE N T S
+grantz G R AE N T S
+granular G R AE N Y AH L ER
+granulation G R AE N Y AH L EY SH AH N
+granule G R AE N Y AH L
+granules G R AE N Y AH L Z
+granulocyte G R AH N UW L OW S AY T
+granum G R AE N AH M
+granville G R AE N V IH L
+granville's G R AE N V IH L Z
+granz G R AE N T S
+granzow G R AE N Z OW
+grapage G R EY P AH JH
+grape G R EY P
+grapefruit G R EY P F R UW T
+grapefruits G R EY P F R UW T S
+graper G R EY P ER
+grapes G R EY P S
+grapeshot G R EY P SH AA T
+grapevine G R EY P V AY N
+grapevines G R EY P V AY N Z
+graph G R AE F
+graphic G R AE F IH K
+graphical G R AE F IH K AH L
+graphically G R AE F IH K L IY
+graphics G R AE F IH K S
+graphics' G R AE F IH K S
+graphite G R AE F AY T
+graphology G R AH F AA L AH JH IY
+graphs G R AE F S
+grapple G R AE P AH L
+grappled G R AE P AH L D
+grapples G R AE P AH L Z
+grappling G R AE P L IH NG
+grappling(2) G R AE P AH L IH NG
+gras G R AE S
+gras(2) G R AA
+graser G R EY Z ER
+grasmick G R AE Z M IH K
+grasp G R AE S P
+grasped G R AE S P T
+grasping G R AE S P IH NG
+grasps G R AE S P S
+grass G R AE S
+grasse G R AE S
+grassed G R AE S T
+grassel G R AE S AH L
+grasser G R AE S ER
+grassers G R AE S ER Z
+grasses G R AE S AH Z
+grasses(2) G R AE S IH Z
+grassfield G R AE S F IY L D
+grassfield's G R AE S F IY L D Z
+grassgreen G R AE S G R IY N
+grasshopper G R AE S HH AA P ER
+grasshoppers G R AE S HH AA P ER Z
+grassi G R AE S IY
+grassia G R AA S IY AH
+grassings G R AE S IH NG Z
+grassl G R AE S AH L
+grassland G R AE S L AE N D
+grasslands G R AE S L AE N D Z
+grassley G R AE S L IY
+grasslike G R AE S L AY K
+grassman G R AE S M AH N
+grasso G R AE S OW
+grassroot G R AE S R UW T
+grassroots G R AE S R UW T S
+grassy G R AE S IY
+grasty G R AE S T IY
+grata G R AA T AH
+grate G R EY T
+grated G R EY T IH D
+grateful G R EY T F AH L
+gratefully G R EY T F AH L IY
+grater G R EY T ER
+grates G R EY T S
+grathwohl G R AE TH W OW L
+gratification G R AE T AH F AH K EY SH AH N
+gratified G R AE T AH F AY D
+gratifies G R AE T AH F AY Z
+gratify G R AE T AH F AY
+gratifying G R AE T AH F AY IH NG
+grating G R EY T IH NG
+gratis G R AE T AH S
+gratitude G R AE T AH T UW D
+grattan G R AE T AH N
+gratton G R AE T AH N
+gratuities G R AH T UW IH T IY Z
+gratuitous G R AH T UW AH T AH S
+gratuitously G R AH T UW AH T AH S L IY
+gratuity G R AH T UW IH T IY
+gratz G R AE T S
+gratzer G R EY T Z ER
+grau G R AW
+grauberger G R AW B ER G ER
+graue G R AW
+graue(2) G R UW
+grauel G R AW AH L
+grauel(2) G R UW AH L
+grauer G R AW ER
+grauer(2) G R UW ER
+graul G R AO L
+grauman G R AO M AH N
+graumann G R AO M AH N
+graunke G R AO NG K
+gravano G R AH V AA N OW
+gravano(2) G R AH V AE N OW
+gravatt G R AE V AH T
+grave G R EY V
+gravel G R AE V AH L
+graveline G R EY V L AY N
+gravell G R AE V AH L
+gravelle G R AH V EH L
+gravelly G R AE V AH L IY
+gravely G R EY V L IY
+graven G R EY V AH N
+graver G R EY V ER
+graves G R EY V Z
+graves's G R EY V Z IH Z
+graveside G R EY V S AY D
+gravesite G R EY V S AY T
+gravest G R AE V AH S T
+gravestone G R EY V S T OW N
+gravestones G R EY V S T OW N Z
+gravett G R AE V IH T
+gravette G R AH V EH T
+graveyard G R EY V Y AA R D
+graveyards G R EY V Y AA R D Z
+gravies G R EY V IY Z
+gravimeter G R AE V AH M IY T ER
+gravimetric G R AE V AH M EH T R IH K
+gravina G R AA V IY N AH
+gravino G R AA V IY N OW
+gravitas G R AE V AH T AH S
+gravitate G R AE V IH T EY T
+gravitated G R AE V AH T EY T IH D
+gravitates G R AE V IH T EY T S
+gravitating G R AE V IH T EY T IH NG
+gravitation G R AE V IH T EY SH AH N
+gravitational G R AE V IH T EY SH AH N AH L
+gravitationally G R AE V AH T EY SH N AH L IY
+gravitt G R AE V IH T
+gravitt's G R AE V IH T S
+gravity G R AE V AH T IY
+gravity(2) G R AE V IH T IY
+gravley G R AE V L IY
+gravlin G R AE V L IH N
+gravois G R AH V W AA
+gravy G R EY V IY
+graw G R AO
+grawe G R AO
+gray G R EY
+gray's G R EY Z
+graybeal G R EY B AH L
+graybeard G R EY B IY R D
+graybeards G R EY B IY R D Z
+graybill G R EY B IH L
+graydon G R EY D AH N
+graye G R EY
+grayer G R EY ER
+grayest G R EY IH S T
+graying G R EY IH NG
+grayish G R EY IH SH
+grayling G R EY L IH NG
+grays G R EY Z
+grayson G R EY S AH N
+graze G R EY Z
+grazed G R EY Z D
+grazer G R EY Z ER
+graziani G R AA Z IY AA N IY
+graziano G R AA T S IY AA N OW
+grazier G R EY Z IY ER
+grazing G R EY Z IH NG
+grbavica G ER B AA V IH K AH
+grbavica(2) G ER B AH V AY K AH
+greaney G R IY N IY
+grear G R IH R
+grease G R IY S
+greased G R IY S T
+greaser G R IY S ER
+greasewood G R IY S W UH D
+greasing G R IY S IH NG
+greason G R IY S AH N
+greasy G R IY S IY
+great G R EY T
+great's G R EY T S
+great-circle G R EY T S ER K AH L
+greater G R EY T ER
+greatest G R EY T AH S T
+greathouse G R EY T HH AW S
+greatly G R EY T L IY
+greatness G R EY T N AH S
+greats G R EY T S
+greave G R IY V
+greaves G R IY V Z
+greb G R EH B
+grebe G R IY B
+greber G R IY B ER
+grebner G R EH B N ER
+grecco G R EH K OW
+grech G R EH K
+grecian G R IY SH AH N
+grecko G R EH K OW
+greco G R EH K OW
+greco-roman G R EH K OW R OW M AH N
+grede G R IY D
+gredel G R EH D AH L
+greditor G R EH D IH T ER
+greear G R IY ER
+greece G R IY S
+greece's G R IY S IH Z
+greed G R IY D
+greedier G R IY D IY ER
+greediest G R IY D IY IH S T
+greedily G R IY D AH L IY
+greedy G R IY D IY
+greek G R IY K
+greeks G R IY K S
+greeley G R IY L IY
+greeleyville G R IY L IY V IH L
+greelieville G R IY L IY V IH L
+greely G R IY L IY
+green G R IY N
+green's G R IY N Z
+greenan G R IY N AH N
+greenawalt G R IY N AH W AO L T
+greenaway G R IY N AH W EY
+greenback G R IY N B AE K
+greenback's G R IY N B AE K S
+greenbacks G R IY N B AE K S
+greenbaum G R IY N B AW M
+greenbelt G R IY N B EH L T
+greenberg G R IY N B ER G
+greenberg's G R IY N B ER G Z
+greenberger G R IY N B ER G ER
+greenblatt G R IY N B L AH T
+greenburg G R IY N B ER G
+greenbury G R IY N B ER IY
+greenbush G R IY N B UH SH
+greencastle G R IY N K AE S AH L
+greene G R IY N
+greene's G R IY N Z
+greened G R IY N D
+greener G R IY N ER
+greenery G R IY N ER IY
+greenest G R IY N IH S T
+greenfeld G R IY N F EH L D
+greenfeld's G R IY N F EH L D Z
+greenfell G R IY N F EH L
+greenfell's G R IY N F EH L Z
+greenfield G R IY N F IY L D
+greenfield's G R IY N F IY L D Z
+greenhalgh G R IY N HH AH L G
+greenham G R IY N AH M
+greenhaw G R IY N HH AO
+greenhill G R IY N HH IH L
+greenhoe G R IY N HH OW
+greenhouse G R IY N HH AW S
+greenhouses G R IY N HH AW S IH Z
+greenhouses(2) G R IY N HH AW Z AH Z
+greenhut G R IY N HH AH T
+greeniaus G R IY N IY AW S
+greenidge G R IY N IH JH
+greening G R IY N IH NG
+greenish G R IY N IH SH
+greenland G R IY N L AH N D
+greenland(2) G R IY N L AE N D
+greenlaw G R IY N L AO
+greenleaf G R IY N L IY F
+greenlee G R IY N L IY
+greenlees G R IY N L IY Z
+greenley G R IY N L IY
+greenly G R IY N L IY
+greenmail G R IY N M EY L
+greenmailer G R IY N M EY L ER
+greenman G R IY N M AH N
+greenness G R IY N N AH S
+greeno G R IY N OW
+greenough G R IY N AH F
+greenpeace G R IY N P IY S
+greenpeace's G R IY N P IY S IH Z
+greens G R IY N Z
+greens' G R IY N Z
+greensboro G R IY N Z B ER R OW
+greensburg G R IY N Z B ER G
+greenshield G R IY N SH IY L D
+greenshields G R IY N SH IY L D Z
+greenslade G R IY N S L AH D
+greenslet G R IY N S L EH T
+greenspan G R IY N S P AE N
+greenspan's G R IY N S P AE N Z
+greenspon G R IY N S P AA N
+greenspun G R IY N S P AH N
+greenstein G R IY N S T AY N
+greenstein(2) G R IY N S T IY N
+greenstone G R IY N S T OW N
+greenstreet G R IY N S T R IY T
+greenup G R IY N AH P
+greenvale G R IY N V EY L
+greenville G R IY N V IH L
+greenwald G R IY N W AO L D
+greenwald's G R IY N W AO L D Z
+greenwalds G R IY N W AO L D Z
+greenwalt G R IY N W AH L T
+greenway G R IY N W EY
+greenwell G R IY N W EH L
+greenwich G R EH N IH CH
+greenwich's G R EH N IH CH IH Z
+greenwich(2) G R IY N W IH CH
+greenwood G R IY N W UH D
+greer G R IH R
+greeson G R IY S AH N
+greet G R IY T
+greeted G R IY T AH D
+greeted(2) G R IY T IH D
+greetham G R IY TH AH M
+greeting G R IY T IH NG
+greetings G R IY T IH NG Z
+greets G R IY T S
+greever G R IY V ER
+grefe G R IY F
+greff G R EH F
+greg G R EH G
+greg's G R EH G Z
+grega G R IY G AH
+gregarious G R AH G EH R IY AH S
+greger G R EH G ER
+gregersen G R EH G ER S AH N
+gregerson G R EH G ER S AH N
+gregg G R EH G
+greggs G R EH G Z
+grego G R EH G OW
+gregoire G R IH G W AA R
+gregor G R EH G ER
+gregori G R EH G AO R IY
+gregoria G R EH G AO R IY AH
+gregorian G R AH G AO R IY AH N
+gregorich G R EH G ER IH K
+gregorie G R EH G ER IY
+gregorio G R IH G AO R IY OW
+gregory G R EH G ER IY
+gregory's G R EH G ER IY Z
+gregson G R EH G S AH N
+gregston G R EH G S T AH N
+gregus G R IY G AH S
+greider G R AY D ER
+greif G R IY F
+greiff G R IY F
+greiff(2) G R AY F
+greig G R IY G
+greim G R IY M
+greiman G R AY M AH N
+grein G R EY N
+greiner G R AY N ER
+greinke G R EY NG K
+greis G R IY Z
+greitz G R EH T S
+greitz(2) G R AY T S
+greiwe G R IY W
+grell G R EH L
+grella G R EH L AH
+grelle G R EH L
+gremban G R EH M B AE N
+gremillion G R EH M IH L Y AH N
+gremlin G R EH M L AH N
+gremlins G R EH M L AH N Z
+gren G R EH N
+grenada G R IH N EY D AH
+grenada(2) G R IH N AA D AH
+grenade G R AH N EY D
+grenades G R AH N EY D Z
+grenda G R EH N D AH
+grendel G R EH N D AH L
+grendel's G R EH N D AH L Z
+grenell G R EH N AH L
+grenfell G R EH N F AH L
+grenier G R IY N IY ER
+greninger G R EH N IH NG ER
+grennan G R EH N AH N
+grenoble G R AH N OW B AH L
+grenon G R EH N AH N
+grenouille G R AH N UW IY
+grenz G R EH N Z
+gresh G R EH SH
+gresham G R EH SH AH M
+gresham's G R EH SH AH M Z
+gresko G R EH S K OW
+gress G R EH S
+gresser G R EH S ER
+gressett G R EH S IH T
+gressley G R EH S L IY
+gressman G R EH S M AH N
+greta G R IY T AH
+greta's G R IY T AH Z
+gretal G R EH T AH L
+gretchen G R EH CH AH N
+grete G R IY T
+gretel G R EH T AH L
+greth G R EH TH
+grethel G R EH TH AH L
+grether G R EH DH ER
+gretna G R EH T N AH
+gretna's G R EH T N AH Z
+grettenberger G R EH T AH N B ER G ER
+gretz G R EH T S
+gretzinger G R EH T Z IH NG ER
+gretzky G R EH T S K IY
+greubel G R OY B AH L
+greuel G R UW AH L
+greulich G R OY L IH K
+greunke G R UW NG K
+greve G R IY V
+grever G R EH V ER
+grew G R UW
+grewal G R UW AH L
+grewe G R UW
+grewell G R EH W EH L
+grey G R EY
+grey's G R EY Z
+greyhound G R EY HH AW N D
+greyhound's G R EY HH AW N D Z
+greying G R EY IH NG
+greylag G R EY L AE G
+greystone G R EY S T OW N
+gribben G R IH B AH N
+gribbin G R IH B IH N
+gribbins G R IH B IH N Z
+gribble G R IH B AH L
+gribbles G R IH B AH L Z
+gribbon G R IH B AH N
+grice G R AY S
+grid G R IH D
+grid's G R IH D Z
+grider G R AY D ER
+gridiron G R IH D AY ER N
+gridley G R IH D L IY
+gridley's G R IH D L IY Z
+gridlock G R IH D L AA K
+gridlock's G R IH D L AA K S
+gridlocked G R IH D L AA K T
+gridlocks G R IH D L AA K S
+grids G R IH D Z
+grieb G R IY B
+griebel G R IY B AH L
+grieco G R IY K OW
+grieder G R IY D ER
+grief G R IY F
+grieger G R IY G ER
+griego G R IY G OW
+grieme G R IY M
+griep G R IY P
+griepentrog G R IY P IH N T R AH G
+grier G R AY ER
+grier's G R AY ER Z
+grier's(2) G R IY R Z
+grier(2) G R IY R
+grierson G R IH R S AH N
+gries G R AY Z
+griesa G R IY EH S AH
+griesbach G R IY S B AA K
+griese G R IY Z
+griesemer G R IY S IY M ER
+grieser G R IY S ER
+grieshaber G R IY SH AH B ER
+griesinger G R IY S IH NG ER
+griess G R IY S
+griesser G R IY S ER
+griest G R AY IH S T
+grievance G R IY V AH N S
+grievances G R IY V AH N S AH Z
+grievances(2) G R IY V AH N S IH Z
+grieve G R IY V
+grieved G R IY V D
+griever G R IY V ER
+grievers G R IY V ER Z
+grieves G R IY V Z
+grieveson G R IY V AH S AH N
+grieveson(2) G R IY V S AH N
+grieving G R IY V IH NG
+grievous G R IY V AH S
+grievously G R IY V AH S L IY
+griff G R IH F
+griffee G R IH F IY
+griffen G R IH F AH N
+griffeth G R IH F IH TH
+griffey G R IH F IY
+griffey's G R IH F IY Z
+griffie G R IH F IY
+griffin G R IH F IH N
+griffin's G R IH F IH N Z
+griffing G R IH F IH NG
+griffis G R IH F IH S
+griffith G R IH F AH TH
+griffith's G R IH F IH TH S
+griffith(2) G R IH F IH TH
+griffiths G R IH F IH TH S
+griffitts G R IH F IH T S
+griffo G R IH F OW
+griffon G R IH F AH N
+griffy G R IH F IY
+grigas G R AY G AH Z
+grigg G R IH G
+griggs G R IH G Z
+griggy G R IH G IY
+grignon G R IH G N AH N
+grigoli G R IH G OW L IY
+grigorovich G R IH G AO R AH V IH CH
+grigory G R EH G ER IY
+grigory(2) G R IY G ER IY
+grigoryant G R IH G AO R Y AE N T
+grigoryants G R IH G AO R Y AE N T S
+grigsby G R IH G Z B IY
+grijalva G R IY Y AA L V AH
+grill G R IH L
+grille G R IH L
+grilled G R IH L D
+grilli G R IH L IY
+grilling G R IH L IH NG
+grilliot G R IH L IY AH T
+grillo G R IH L OW
+grillot G R IH L AH T
+grills G R IH L Z
+grim G R IH M
+grima G R IY M AH
+grimace G R IH M AH S
+grimaced G R IH M AH S T
+grimaces G R IH M AH S IH Z
+grimacing G R IH M AH S IH NG
+grimaldi G R IY M AA L D IY
+grimaldo G R IY M AA L D OW
+grime G R AY M
+grimes G R AY M Z
+grimley G R IH M L IY
+grimly G R IH M L IY
+grimm G R IH M
+grimm's G R IH M Z
+grimme G R IH M
+grimmer G R IH M ER
+grimmest G R IH M AH S T
+grimmett G R IH M IH T
+grimness G R IH M N AH S
+grimshaw G R IH M SH AO
+grimsley G R IH M Z L IY
+grimstad G R IH M S T AH D
+grimwood G R IH M W UH D
+grimy G R AY M IY
+grin G R IH N
+grinage G R IH N IH JH
+grinald G R IH N AA L D
+grinalds G R IH N AA L D Z
+grinberg G R IH N B ER G
+grinch G R IH N CH
+grind G R AY N D
+grinde G R IH N D
+grinder G R AY N D ER
+grinders G R AY N D ER Z
+grinding G R AY N D IH NG
+grindlay G R AY N D L EY
+grindlay(2) G R IH N D L IY
+grindlays G R AY N D L EY Z
+grindlays(2) G R IH N D L IY Z
+grindle G R IH N D AH L
+grindley G R IH N D L IY
+grindrod G R AY N D R AA D
+grinds G R AY N D Z
+grindstaff G R AY N D S T AE F
+grindstone G R AY N D S T OW N
+grine G R AY N
+griner G R AY N ER
+gring G R IH NG
+gringo G R IH NG G OW
+gringos G R IH NG G OW Z
+grinned G R IH N D
+grinnell G R IH N EH L
+grinning G R IH N IH NG
+grins G R IH N Z
+grinstead G R IH N S T EH D
+grinstein G R IH N S T IY N
+grinstein(2) G R IH N S T AY N
+grip G R IH P
+gripe G R AY P
+griped G R AY P T
+gripes G R AY P S
+griping G R AY P IH NG
+gripp G R IH P
+gripped G R IH P T
+grippi G R IH P IY
+gripping G R IH P IH NG
+grippo G R IH P OW
+grips G R IH P S
+grisanti G R IH S AE N T IY
+grisby G R IH S B IY
+griscom G R IH S K AH M
+grise G R AY Z
+grisham G R IH SH AH M
+grisham's G R IH SH AH M Z
+grishilda G R IH SH IH L D AH
+grishman G R IH SH M AH N
+grisly G R IH Z L IY
+grismer G ER IH Z AH M ER
+grismer(2) G R IH S M ER
+grismore G R IY S M AO R
+grissett G R IH S IH T
+grissinger G R IH S IH NG ER
+grisso G R IH S OW
+grissom G R IH S AH M
+grisson G R IH S AH N
+grist G R IH S T
+gristle G R IH S AH L
+griswell G R IH S W EH L
+griswold G R IH S W OW L D
+grit G R IH T
+grites G R AY T S
+grits G R IH T S
+gritter G R IH T ER
+gritting G R IH T IH NG
+gritton G R IH T AH N
+gritty G R IH T IY
+gritz G R IH T S
+gritzmacher G R IH T S M AA K ER
+grivas G R IY V AA Z
+griz G R IH Z
+grizelda G R IY Z EH L D AH
+grizzard G R IH Z ER D
+grizzell G R IH Z AH L
+grizzle G R IH Z AH L
+grizzled G R IH Z AH L D
+grizzlies G R IH Z L IY Z
+grizzly G R IH Z L IY
+gro G R OW
+groan G R OW N
+groaned G R OW N D
+groaning G R OW N IH NG
+groans G R OW N Z
+groat G R OW T
+grob G R AA B
+grobe G R OW B
+groben G R AA B AH N
+grober G R OW B ER
+grobian G R OW B IY AH N
+grobler G R AA B L ER
+groce G R OW S
+grocer G R OW S ER
+grocer's G R OW S ER Z
+groceries G R OW S ER IY Z
+groceries(2) G R OW S R IY Z
+grocers G R OW S ER Z
+grocery G R OW S ER IY
+grocery(2) G R OW S R IY
+groch G R AA K
+grochowski G R AH HH AO F S K IY
+grode G R OW D
+groden G R OW D AH N
+grodin G R OW D IH N
+grodsky G R AA D S K IY
+groebner G R OW B N ER
+groeger G R OW G ER
+groen G R OW N
+groene G R AA IY N
+groeneveld G R OW N IH V IH L D
+groenewold G R OW N UW OW L D
+groening G R AA AH N IH NG
+groep G R OW P
+groer G R OW ER
+groesbeck G R OW S B EH K
+groff G R AO F
+groft G R AA F T
+grog G R AA G
+grogan G R OW G AH N
+grogg G R AA G
+groggy G R AA G IY
+groh G R OW
+grohman G R OW M AH N
+grohs G R OW S
+groin G R OY N
+groined G R OY N D
+groins G R OY N Z
+groleau G R AH L OW
+grolier G R OW L Y ER
+groll G R OW L
+grom G R AA M
+groma G R AA M AH
+groman G R OW M AH N
+gromek G R OW M IH K
+gromer G R OW M ER
+gromes G R OW M Z
+gromyko G R OW M IY K OW
+gronau G R OW N AW
+gronberg G R AA N B ER G
+grondahl G R AA N D AA L
+grondin G R AA N D IH N
+grone G R OW N
+gronemeyer G R AA N IH M AY ER
+groner G R OW N ER
+gronewold G R AA N UW OW L D
+groninger G R OW N IH NG ER
+gronlund G R AA N L AH N D
+gronowski G R AH N AO F S K IY
+gronseth G R AA N S IH TH
+gronski G R AA N S K IY
+groom G R UW M
+groome G R UW M
+groomed G R UW M D
+groomer G R UW M ER
+groomers G R UW M ER Z
+groomes G R UW M Z
+grooming G R UW M IH NG
+grooms G R UW M Z
+groopman G R UW P M AH N
+groos G R UW Z
+groot G R UW T
+grooters G R UW T ER Z
+groove G R UW V
+groover G R UW V ER
+grooves G R UW V Z
+grooviest G R UW V IY AH S T
+groovy G R UW V IY
+grope G R OW P
+groped G R OW P T
+groping G R OW P IH NG
+gropp G R AA P
+gropper G R AA P ER
+groppy G R AA P IY
+groppy's G R AA P IY Z
+gros G R OW S
+grosbeak G R OW S B IY K
+grosbeaks G R OW S B IY K S
+grosch G R AO SH
+grose G R OW Z
+groseclose G R AA S IH K L OW Z
+grosh G R AA SH
+groshek G R AA SH IH K
+groshong G R AA SH AO NG
+grosjean G R AH S ZH IY N
+groskopf G R AA S K AO P F
+groskopf(2) G R OW S K AO F
+gross G R OW S
+gross's G R OW S IH Z
+grossbard G R OW S B AA R D
+grossberg G R OW S B ER G
+grosse G R AA S
+grossed G R OW S T
+grossenbacher G R AA S IH N B AA K ER
+grosser G R OW S ER
+grosses G R OW S IH Z
+grossfeld G R OW S F EH L D
+grosshans G R AA SH AH N Z
+grossi G R OW S IY
+grossing G R OW S IH NG
+grosskopf G R OW S K AO P F
+grosskopf(2) G R OW S K AO F
+grossly G R OW S L IY
+grossman G R OW S M AH N
+grossman's G R OW S M AH N Z
+grossmann G R AO S M AH N
+grossnickle G R AA S N IH K AH L
+grosso G R OW S OW
+grosvenor G R OW V N ER
+grosz G R OW S
+grote G R OW T
+grotesque G R OW T EH S K
+grotesquely G R OW T EH S K L IY
+groth G R AA TH
+grothaus G R AA T HH AW S
+grothe G R OW DH
+grotheer G R AO TH IH R
+groton G R AA T AH N
+grotto G R AA T OW
+grotz G R AA T S
+grouch G R AW CH
+groucho G R UW CH OW
+groucho(2) G R AW CH OW
+grouchy G R AW CH IY
+groulx G R AW L K S
+ground G R AW N D
+groundbreaking G R AW N D B R EY K IH NG
+groundbreaking(2) G R AW N B R EY K IH NG
+grounded G R AW N D IH D
+grounder G R AW N D ER
+groundhog G R AW N D HH AA G
+grounding G R AW N D IH NG
+groundless G R AW N D L AH S
+groundling G R AW N D L IH NG
+groundnut G R AW N D N AH T
+groundnuts G R AW N D N AH T S
+grounds G R AW N D Z
+grounds(2) G R AW N Z
+groundskeeper G R AW N D S K IY P ER
+groundskeepers G R AW N D S K IY P ER Z
+groundswell G R AW N D S W EH L
+groundwater G R AW N D W AA T ER
+groundwater(2) G R AW N D W AO T ER
+groundwork G R AW N D W ER K
+group G R UW P
+group's G R UW P S
+groupe G R UW P
+grouped G R UW P T
+groupement G R UW P M AH N T
+grouper G R UW P ER
+groupers G R UW P ER Z
+groupie G R UW P IY
+groupies G R UW P IY Z
+grouping G R UW P IH NG
+groupings G R UW P IH NG Z
+groups G R UW P S
+groups' G R UW P S
+groupware G R UW P W EH R
+grouse G R AW S
+groused G R AW S T
+grouses G R AW S IH Z
+grousing G R AW S IH NG
+groussman G R AW S M AH N
+grout G R AW T
+grouting G R AW T IH NG
+grove G R OW V
+grove's G R OW V Z
+grovel G R AA V AH L
+groveling G R AO V AH L IH NG
+groveling(2) G R AO V L IH NG
+groveman G R OW V M AH N
+grover G R OW V ER
+grover's G R OW V ER Z
+grovers G R OW V ER Z
+groves G R OW V Z
+grow G R OW
+growe G R OW
+grower G R OW ER
+growers G R OW ER Z
+growers' G R OW ER Z
+growing G R OW IH NG
+growl G R AW L
+growled G R AW L D
+growling G R OW L IH NG
+growls G R AW L Z
+grown G R OW N
+grownup G R OW N AH P
+grownups G R OW N AH P S
+grows G R OW Z
+growth G R OW TH
+growth's G R OW TH S
+growths G R OW TH S
+grozny G R OW Z N IY
+grozny's G R OW Z N IY Z
+grua G R UW AH
+grub G R AH B
+gruba G R UW B AH
+grubaugh G R AH B AO
+grubb G R AH B
+grubbs G R AH B Z
+grubby G R AH B IY
+grube G R UW B
+gruben G R AH B AH N
+gruber G R UW B ER
+gruberova G R UW B EH R OW V AH
+grubman G R AH B M AH N
+grubs G R AH B Z
+grubstein G R AH B S T IY N
+grubstein(2) G R AH B S T AY N
+grucci G R UW CH IY
+grudenstein G R UW D IH N S T IY N
+grudenstein(2) G R UW D IH N S T AY N
+grudge G R AH JH
+grudges G R AH JH IH Z
+grudging G R AH JH IH NG
+grudgingly G R AH JH IH NG L IY
+grudgingly(2) G R AH JH IH NG G L IY
+grudzien G R AH D Z IY N
+grudzinski G R AH JH IH N S K IY
+gruel G R UW IH L
+grueling G R UW IH L IH NG
+grueling(2) G R UW L IH NG
+gruen G R UW N
+gruenberg G R UH N B ER G
+gruener G R UH N ER
+gruenewald G R UH N IH W AO L D
+gruenhagen G R UH N HH AH G AH N
+gruenwald G R UH N W AO L D
+gruesome G R UW S AH M
+gruet G R UW IH T
+gruetzmacher G R UH T S M AA K ER
+gruff G R AH F
+gruffly G R AH F L IY
+gruhlke G R UW L K
+gruhn G R AH N
+gruis G R UW IH Z
+grulke G R AH L K
+grullon G R AH L AH N
+grum G R AH M
+grumbine G R AH M B AY N
+grumble G R AH M B AH L
+grumbled G R AH M B AH L D
+grumbles G R AH M B AH L Z
+grumbling G R AH M B AH L IH NG
+grumbling(2) G R AH M B L IH NG
+grumblings G R AH M B AH L IH NG Z
+grumblings(2) G R AH M B L IH NG Z
+grumman G R AH M AH N
+grumman's G R AH M AH N Z
+grummond G R AH M AH N D
+grummond's G R AH M AH N D Z
+grump G R AH M P
+grumpier G R AH M P IY ER
+grumpier(2) G R AH M P Y ER
+grumpy G R AH M P IY
+grun G R AH N
+grunberg G R AH N B ER G
+grund G R AH N D
+grunden G R AH N D AH N
+grunder G R AH N D ER
+grundfest G R AH N D F EH S T
+grundfest(2) G R UH N D F EH S T
+grundhofer G R AH N D HH AA F ER
+grundig G R AH N D IH G
+grundman G R AH N D M AH N
+grundstrom G R AH N D S T R AH M
+grundy G R AH N D IY
+grunebaum G R UW N B AW M
+gruneich G R UW N AY K
+gruner G R UW N ER
+grunert G R UW N ER T
+grunewald G R AH N IH W AO L D
+grunewald(2) G R UW N W AO L D
+grunge G R AH N JH
+grungy G R AH N JH IY
+grunion G R AH N Y AH N
+grunow G R UW N OW
+grunt G R AH N T
+gruntal G R AH N T AH L
+gruntal's G R AH N T AH L Z
+grunted G R AH N T IH D
+grunting G R AH N T IH NG
+grunts G R AH N T S
+grunwald G R AH N W AO L D
+grupe G R UW P
+grupo G R UW P OW
+grupp G R AH P
+gruppo G R UW P OW
+grush G R AH SH
+grushow G R AH SH OW
+gruss G R AH S
+grussing G R AH S IH NG
+gruszka G R AH SH K AH
+grutman G R AH T M AH N
+gruver G R UW V ER
+gruwell G R AH W EH L
+gruza G R UW Z AH
+gryder G R AY D ER
+grygiel G R IH JH IY L
+gryphons G R IH F AH N Z
+grzelak G ER Z AH L AE K
+grzesiak G ER Z EH S IY AE K
+grzeskowiak G ER Z IH S K AW IY AE K
+grzyb G ER Z IH B
+grzybowski G ER Z IH B AW S K IY
+grzywacz G ER Z IH V AE CH
+grzywinski G ER Z IH W IH N S K IY
+gschwind G AH SH W AY N D
+gsell G AH S EH L
+gtech JH IY T EH K
+gtech's JH IY T EH K S
+gu G UW
+guacamole G W AA K AH M OW L IY
+guadagno G AA D AA G N OW
+guadalajara G W AA D AH L AH HH AA R AH
+guadalajara(2) G W AA D L AH HH AA R AH
+guadalcanal G W AA D AH L K AH N AE L
+guadalupe G W AA D AH L UW P
+guadalupe(2) G W AA D AH L UW P EY
+guadarrama G UW AA D AA R AA M AH
+guadeloupe G W AA D AH L UW P
+guagliardo G W AA G L IY AA R D OW
+guajardo G W AA Y AA R D OW
+gualdoni G AA L D OW N IY
+gualtieri G AA L T IH R IY
+guam G W AA M
+guam's G W AA M Z
+guanaco G W AH N AA K OW
+guandjo G W AA N JH OW
+guandjo's G W AA N JH OW Z
+guandjong G W AA N JH OW NG
+guandjong's G W AA N JH OW NG Z
+guandong G W AA N D OW NG
+guandong's G W AA N D OW NG Z
+guangdong G W AE NG D AO NG
+guangdong(2) G W AA NG D AO NG
+guangjo G W AA NG JH OW
+guangjo's G W AA NG JH OW Z
+guangzhou G W AE NG Z UW
+guanine G W AA N IY N
+guano G W AA N OW
+guantanamo G W AA N T AA N AH M OW
+guantanamo's G W AA N T AA N AH M OW Z
+guarani G W AA R AH N IY
+guarani(2) G W AA R AA N IY
+guarantee G EH R AH N T IY
+guarantee's G EH R AH N T IY Z
+guaranteed G EH R AH N T IY D
+guaranteeing G EH R AH N T IY IH NG
+guarantees G EH R AH N T IY Z
+guaranties G EH R AH N T IY Z
+guarantor G EH R AH N T AO R
+guarantors G EH R AH N T AO R Z
+guaranty G EH R AH N T IY
+guaranty's G EH R AH N T IY Z
+guaranty-first G EH R AH N T IY F ER S T
+guard G AA R D
+guard's G AA R D Z
+guardado G AA R D AA D OW
+guarded G AA R D AH D
+guarded(2) G AA R D IH D
+guardedly G AA R D IH D L IY
+guardfish G AA R D F IH SH
+guardfish's G AA R D F IH SH IH Z
+guardia G W AA R D IY AH
+guardian G AA R D IY AH N
+guardian's G AA R D IY AH N Z
+guardians G AA R D IY AH N Z
+guardianship G AA R D IY AH N SH IH P
+guardin G AA R D IH N
+guarding G AA R D IH NG
+guardino G AA R D IY N OW
+guardiola G AA R D IY OW L AH
+guardrail G AA R D R EY L
+guardrails G AA R D R EY L Z
+guards G AA R D Z
+guardsman G AA R D Z M AE N
+guardsman(2) G AA R D Z M AH N
+guardsmen G AA R D Z M IH N
+guariglia G AA R IY G L IY AH
+guarin G W AA R IH N
+guarin(2) G AA R IH N
+guarini G AA R IY N IY
+guarino G AA R IY N OW
+guarisco G AA R IY S K OW
+guarnaccia G AA R N AE CH IY AH
+guarneri G AA R N EH R IY
+guarnieri G AA R N IH R IY
+guasch G W AE SH
+guastella G AA S T EH L AH
+guatemala G W AA T AH M AA L AH
+guatemala's G W AA T AH M AA L AH Z
+guatemalan G W AA T AH M AA L AH N
+guatemalans G W AA T AH M AA L AH N Z
+guattery G W AA T ER IY
+guava G W AA V AH
+guavas G W AA V AH Z
+guay G EY
+guayabera G W AY AH B EH R AH
+guba G UW B AH
+guba's G Y UW B AH Z
+gubbels G AH B AH L Z
+gubbins G AH B IH N Z
+guber G Y UW B ER
+guber(2) G UW B ER
+guberman G UW B ER M AH N
+gubernatorial G UW B ER N AH T AO R IY AH L
+gubler G Y UW B AH L ER
+gubler(2) G Y UW B L ER
+gubser G AH B S ER
+gucci G UW CH IY
+gucciardo G UW CH AA R D OW
+guccio G UW CH IY OW
+guccione G UW K CH OW N IY
+guck G AH K
+guckert G AH K ER T
+gucwa G AH K W AH
+gude G Y UW D
+gudelay G UW D AH L EY
+guderian G Y UW D IY R IY AH N
+gudgel G AH JH AH L
+gudgeon G AH JH AH N
+gudger G AH JH ER
+gudino G UW D IY N OW
+gudmundson G AH D M AH N D S AH N
+gue G Y UW
+guedry G EH D R IY
+guei-yuan G W EY Y UW AA N
+guel G EH L
+guenette G IH N EH T
+guenna G EY N AH
+guenter G EH N T ER
+guenther G UH N TH ER
+guenthner G EH N TH N ER
+guerard G ER AA R D
+guercio G EH R S IY OW
+guerette G ER EH T
+guerilla G ER IH L AH
+guerillas G ER IH L AH Z
+guerin G EH R IH N
+guerino G EH R IY N OW
+guerneville G ER N AH V IH L
+guernsey G ER N Z IY
+guernseys G ER N Z IY Z
+guerra G W EH R AH
+guerrant G EH R AH N T
+guerre G EH R
+guerrera G W ER EH R AH
+guerrero G ER EH R OW
+guerrette G ER EH T
+guerrier G EH R IY ER
+guerrieri G ER IH R IY
+guerriero G ER IH R OW
+guerrilla G ER IH L AH
+guerrillas G ER IH L AH Z
+guerrillas' G ER IH L AH Z
+guerrini G ER IY N IY
+guerry G ER IY
+guertin G EH R T IY N
+guess G EH S
+guessed G EH S T
+guesser G EH S ER
+guessers G EH S ER Z
+guesses G EH S AH Z
+guesses(2) G EH S IH Z
+guessing G EH S IH NG
+guesstimate G EH S T IH M IH T
+guesstimate(2) G EH S T IH M EY T
+guesstimates G EH S T IH M IH T S
+guesstimates(2) G EH S T IH M EY T S
+guesswork G EH S W ER K
+guest G EH S T
+guest's G EH S T S
+guested G EH S T IH D
+guesthouse G EH S T HH AW S
+guesthouses G EH S T HH AW S IH Z
+guests G EH S T S
+guests' G EH S T S
+guests'(2) G EH S S
+guests'(3) G EH S
+guests(2) G EH S S
+guests(3) G EH S
+guettler G EH T AH L ER
+guettler(2) G EH T L ER
+guevara G EY V AA R AH
+guevara's G EY V AA R AH Z
+guevara's(2) G AH V AA R AH Z
+guevara(2) G AH V AA R AH
+guez G EH Z
+guez's G EH Z IH Z
+guff G AH F
+guffaw G AH F AO
+guffaws G AH F AO Z
+guffey G AH F IY
+guffin G AH F IH N
+guffy G AH F IY
+gugel G UW G AH L
+guggenheim G UW G AH N HH AY M
+guggenheim's G UW G AH N HH AY M
+guggisberg G AH G IH S B ER G
+gugino G UW JH IY N OW
+guglielmetti G UW G L IY EH L M EH T IY
+guglielmi G UW G L IY EH L M IY
+guglielmo G UW G L IY EH L M OW
+gugliotta G UW G L IY OW T AH
+gugliotti G UW G L IY OW T IY
+gugliuzza G UW G L IY UW T S AH
+guhl G AH L
+guiana G IY AA N AH
+guice G AY S
+guichard G IH SH AA R D
+guida G IY D AH
+guidance G AY D AH N S
+guide G AY D
+guide's G AY D Z
+guidebook G AY D B UH K
+guidebooks G AY D B UH K S
+guided G AY D AH D
+guided(2) G AY D IH D
+guideline G AY D L AY N
+guidelines G AY D L AY N Z
+guidepost G AY D P OW S T
+guideposts G AY D P OW S T S
+guideposts(2) G AY D P OW S S
+guideposts(3) G AY D P OW S
+guider G AY D ER
+guidera G IY D EH R AH
+guides G AY D Z
+guidi G IY D IY
+guidice G AY D IH S
+guiding G AY D IH NG
+guido G W IY D OW
+guidone G IY D OW N IY
+guidotti G IY D OW T IY
+guidroz G W IY D R OW Z
+guidry G IH D ER IY
+guier G AY ER
+guiffre G IH F ER
+guilbault G IH L B OW
+guilbeau G IH L B OW
+guilbeault G IH L B OW
+guilbeaux G IH L B OW
+guilbert G IH L B ER T
+guild G IH L D
+guild's G IH L D Z
+guilder G IH L D ER
+guilder's G IH L D ER Z
+guilders G IH L D ER Z
+guildhall G IH L D HH AO L
+guilds G IH L D Z
+guile G AY L
+guileless G AY L L AH S
+guiles G AY L Z
+guilfoil G IH L F OY L
+guilford G IH L F ER D
+guilford's G IH L F ER D Z
+guilfoyle G IH L F OY L
+guiliani G IY L IY AA N IY
+guiliano G IY L IY AA N OW
+guilin G IH L IH N
+guill G IH L
+guilla G W IH L AH
+guillaume G IH L AW M
+guillaume(2) G W IY L OW M
+guillemette G IH L AH M EH T
+guillen G IH L AH N
+guillermo G W IH L Y EH R M OW
+guillermo(2) G IY EH R M OW
+guillermo(3) G W IY EH R M OW
+guillet G IH L EH T
+guillette G IH L EH T
+guilliams G W IY L IY AA M Z
+guillory G IH L ER IY
+guillot G IH L OW
+guillotine G IH L AH T IY N
+guillotine(2) G IY Y AH T IY N
+guillotte G IH L AO T
+guilmartin G IH L M AA R T IH N
+guilmette G IH L M EH T
+guilt G IH L T
+guiltless G IH L T L IH S
+guilty G IH L T IY
+guimaraes G IH M ER EY Z
+guimond G IH M AA N D
+guimont G IH M AA N T
+guin G IH N
+guinan G W IY N AA N
+guinarou G W IH N AA R OW
+guinarou's G W IH N AA R OW Z
+guindon G IH N D AH N
+guinea G IH N IY
+guineas G IH N IY Z
+guiness G IH N AH S
+guiney G IH N IY
+guinier G W IH N IH R
+guinier's G W IH N IH R Z
+guinn G IH N
+guinness G IH N AH S
+guinness's G IH N AH S IH Z
+guinta G W IY N T AH
+guinther G IH N DH ER
+guinto G W IY N T OW
+guinyard G IH N Y AA R D
+guion G W IY AO N
+guire G AY R
+guise G AY Z
+guises G AY Z AH Z
+guises(2) G AY Z IH Z
+guisewite G AY S W AY T
+guisinger G IH S IH N JH ER
+guitar G IH T AA R
+guitarist G IH T AA R AH S T
+guitarist's G IH T AA R AH S T S
+guitarists G IH T AA R AH S T S
+guitarists(2) G IH T AA R AH S S
+guitarists(3) G IH T AA R AH S
+guitarro G IH T AA R OW
+guitarro's G IH T AA R OW Z
+guitars G IH T AA R Z
+guiterrez G W IY T EH R EH Z
+guitierrez G W IY T IH R EH Z
+guizar G W IY Z AA R
+gujarat G Y UW JH ER AE T
+gul G AH L
+gula G Y UW L AH
+gulag G Y UW L AE G
+gulag(2) G UW L AA G
+gulas G Y UW L AH Z
+gulbrandsen G AH L B R AH N D S AH N
+gulbrandson G AH L B R AH N D S AH N
+gulbransen G AH L B R AH N S AH N
+gulbranson G AH L B R AH N S AH N
+gulbuddin G AH B UW D IH N
+gulbuddin's G AH B UW D IH N Z
+gulch G AH L CH
+guldin G AH L D IH N
+gulf G AH L F
+gulf's G AH L F S
+gulfport G AH L F P AO R T
+gulfs G AH L F S
+gulfstream G AH L F S T R IY M
+gulick G Y UW L IH K
+gulino G UW L IY N OW
+gull G AH L
+gull's G AH L Z
+gulla G AH L AH
+gullah G AH L AH
+gullatt G AH L AH T
+gulledge G UW L IH JH
+gullet G AH L AH T
+gullett G UW L IH T
+gullette G UW L EH T
+gulley G AH L IY
+gulli G UW L IY
+gullibility G AH L AH B IH L IH T IY
+gullible G AH L AH B AH L
+gullick G AH L IH K
+gullickson G AH L IH K S AH N
+gullies G AH L IY Z
+gulliford G AH L IH F ER D
+gullikson G AH L IH K S AH N
+gullion G AH L Y AH N
+gulliver G AH L IH V ER
+gullo G UW L OW
+gulls G AH L Z
+gully G AH L IY
+gulp G AH L P
+gulped G AH L P T
+gulping G AH L P IH NG
+gulps G AH L P S
+gulyas G UW L Y AH S
+gum G AH M
+gumaer G AH M AW ER
+gumaer(2) G AH M AA R
+gumbel G AH M B AH L
+gumbert G AH M B ER T
+gumbi G AH M B IY
+gumbi's G AH M B IY Z
+gumbiner G AH M B AY N ER
+gumbinger G AH M B IH NG ER
+gumbo G AH M B OW
+gumbo-limbo G AH M B OW L IH M B OW
+gumbs G AH M Z
+gumi G UW M IY
+gumina G UW M IY N AH
+gumm G AH M
+gummed G AH M D
+gummi G AH M IY
+gummy G AH M IY
+gump G AH M P
+gump's G AH M P S
+gumpert G AH M P ER T
+gumport G AH M P AO R T
+gumpp G AH M P
+gumption G AH M P SH AH N
+gums G AH M Z
+gumshoe G AH M SH UW
+gumucio G Y UW M Y UW S IY OW
+gumz G AH M Z
+gun G AH N
+gun's G AH N Z
+gunadi G AH N AA D IY
+gunatilake G UW N AA T IH L AA K EY
+gunboat G AH N B OW T
+gunboats G AH N B OW T S
+gunby G AH N B IY
+guncotton G AH N K AA T AH N
+gundel G AH N D AH L
+gunder G AH N D ER
+gunderman G AH N D ER M AH N
+gundersen G AH N D ER S AH N
+gunderson G AH N D ER S AH N
+gundlach G AH N D L AH K
+gundle G AH N D AH L
+gundog G AH N D AO G
+gundrum G AH N D R AH M
+gundry G AH N D ER IY
+gundy G AH N D IY
+gunfight G AH N F AY T
+gunfighter G AH N F AY T ER
+gunfighter's G AH N F AY T ER Z
+gunfighters G AH N F AY T ER Z
+gunfighting G AH N F AY T IH NG
+gunfights G AH N F AY T S
+gunfire G AH N F AY ER
+gunfire(2) G AH N F AY R
+gunflint G AH N F L IH N T
+gung G AH NG
+gunhilda G UW N HH IY L D AH
+gunia G UW N IY AH
+gunkel G AH NG K AH L
+gunlick G AH N L IH K
+gunlicks G AH N L IH K S
+gunman G AH N M AH N
+gunman's G AH N M AH N Z
+gunmen G AH N M EH N
+gunn G AH N
+gunn's G AH N Z
+gunnar G AH N ER
+gunnarson G AH N AA R S AH N
+gunned G AH N D
+gunnell G AH N AH L
+gunnells G AH N AH L Z
+gunnels G AH N AH L Z
+gunner G AH N ER
+gunners G AH N ER Z
+gunnerson G AH N ER S AH N
+gunnery G AH N ER IY
+gunning G AH N IH NG
+gunnison G AH N IH S AH N
+gunnoe G AH N OW
+gunny G AH N IY
+gunnysack G AH N IY S AE K
+gunnysacks G AH N IY S AE K S
+gunpoint G AH N P OY N T
+gunpowder G AH N P AW D ER
+gunrunner G AH N R AH N ER
+guns G AH N Z
+gunsalus G AH N S AA L AH S
+gunship G AH N SH IH P
+gunships G AH N SH IH P S
+gunshot G AH N SH AA T
+gunshots G AH N SH AA T S
+gunslinger G AH N S L IH NG ER
+gunslingers G AH N S L IH NG ER Z
+gunsmoke G AH N S M OW K
+gunst G AH N S T
+gunter G AH N T ER
+gunther G AH N TH ER
+guntur G AH N T ER
+gunty G AH N T IY
+guppies G AH P IY Z
+guppy G AH P IY
+gupta G UH P T AH
+guptill G AH P T IH L
+gupton G AH P T AH N
+gura G UH R AH
+gural G Y UH R AH L
+gurevich G Y UW R IH V IH CH
+gurganious G ER G AH N IY IH S
+gurganus G ER G AH N IH S
+gurgle G ER G AH L
+gurgling G ER G AH L IH NG
+gurgling(2) G ER G L IH NG
+gurian G Y UH R IY AH N
+gurion G Y UH R IY AH N
+gurit G Y UH R IH T
+gurit(2) G UH R IH T
+gurka G ER K AH
+gurkin G ER K IH N
+gurley G ER L IY
+gurnards G ER N ER D Z
+gurnee G ER N IY
+gurney G ER N IY
+gurney's G ER N IY Z
+gurnsey G ER N S IY
+gurr G ER
+gurria G ER IY AH
+gurrola G UH R OW L AH
+gurry G ER IY
+gurski G ER S K IY
+gursky G ER S K IY
+gurtler G ER T AH L ER
+gurtler(2) G ER T L ER
+gurtner G ER T N ER
+gurtz G ER T S
+guru G UW R UW
+guru's G UW R UW Z
+gurule G ER UW L
+gurus G UW R UW Z
+gus G AH S
+gusciora G UW S IY AO R AH
+guse G Y UW Z
+gusella G Y UW S EH L AH
+guseman G UW S M AH N
+guses G Y UW Z IH Z
+guses(2) G AH S AH Z
+gush G AH SH
+gushed G AH SH T
+gusher G AH SH ER
+gushers G AH SH ER Z
+gushes G AH SH IH Z
+gushing G AH SH IH NG
+gusinsky G AH S IH N S K IY
+gusky G AH S K IY
+guslan G UW Z L AA N
+gusler G AH S AH L ER
+gusler(2) G AH S L ER
+gusman G AH S M AH N
+guss G AH S
+gussie G AH S IY
+gussied G AH S IY D
+gussman G AH S M AH N
+gussy G AH S IY
+gust G AH S T
+gustaf G UW S T AA F
+gustafson G AH S T AH F S AH N
+gustafsson G UW S T AA F S AH N
+gustav G UH S T AA F
+gustava G UW S T AA V AH
+gustave G UW S T AA V IY
+gustaveson G UW S T AA V EY S AH N
+gustavo G AH S T AA V OW
+gustavson G AH S T AH V S AH N
+gustavus G AH S T AH V AH S
+guste G AH S T
+gusted G AH S T IH D
+guster G AH S T ER
+gustin G AH S T IH N
+gusting G AH S T IH NG
+gusto G AH S T OW
+guston G AH S T AH N
+gusts G AH S T S
+gustus G AH S T AH S
+gusty G AH S T IY
+gut G AH T
+gutekunst G AH T IH K AH N S T
+gutenberg G UW T AH N B ER G
+guterman G Y UW T ER M AH N
+gutermuth G AH T ER M UW TH
+gutfeld G AH T F EH L D
+gutfreund G UH T F R EH N D
+guth G UW TH
+gutherie G AH TH ER IY
+guthery G AH TH ER IY
+guthmiller G AH TH M IH L ER
+guthridge G AH TH R IH JH
+guthrie G AH TH R IY
+guthrie's G AH TH R IY Z
+gutierez G UW T IH R EH Z
+gutierres G UW T Y EH R EH Z
+gutierrez G UW T Y EH R EH Z
+gutknecht G UW T N EH K T
+gutkowski G AH T K AO F S K IY
+gutless G AH T L EH S
+gutman G AH T M AH N
+gutmann G AH T M AH N
+gutowski G AH T AO F S K IY
+gutridge G AH T R IH JH
+guts G AH T S
+gutshall G AH CH AH L
+gutsy G AH T S IY
+gutt G AH T
+gutted G AH T IH D
+guttenberg G AH T AH N B ER G
+gutter G AH T ER
+guttered G AH T ER D
+guttering G AH T ER IH NG
+gutterman G AH T ER M AH N
+gutters G AH T ER Z
+gutting G AH T IH NG
+guttmacher G AH T M AA K ER
+guttman G AH T M AH N
+guttmann G AH T M AH N
+guttural G AH T ER AH L
+gutwaks G AH T W AA K S
+gutwein G AH T W AY N
+gutzman G AH T S M AH N
+gutzmer G AH T S M ER
+gutzwiller G AH T S W IH L ER
+guy G AY
+guy's G AY Z
+guyana G AY AA N AH
+guyer G AY ER
+guyett G AY EH T
+guyette G AY EH T
+guymon G AY M AH N
+guynes G AY N Z
+guynn G AY N
+guyon G AY AH N
+guyot G AY AH T
+guys G AY Z
+guys' G AY Z
+guyton G AY T AH N
+guza G Y UW Z AH
+guzek G UW Z EH K
+guzik G Y UW Z IH K
+guzman G AH Z M AH N
+guzman(2) G UW Z M AA N
+guzowski G AH Z AO F S K IY
+guzy G Y UW Z IY
+guzzardo G UW T S AA R D OW
+guzzetta G UW T S EH T AH
+guzzetti G Y UW Z EH T IY
+guzzi G UW T S IY
+guzzle G AH Z AH L
+guzzler G AH Z L ER
+guzzler's G AH Z AH L ER Z
+guzzler's(2) G AH Z L ER Z
+guzzlers G AH Z AH L ER Z
+guzzlers(2) G AH Z L ER Z
+guzzles G AH Z AH L Z
+guzzling G AH Z AH L IH NG
+guzzling(2) G AH Z L IH NG
+guzzo G UW Z OW
+gvaryahu G AH V EH R Y AA HH UW
+gwaltney G W AO L T N IY
+gwartney G W AO R T N IY
+gway G W EY
+gway(2) JH IY W EY
+gwen G W EH N
+gwenda G W EH N D AH
+gwendolyn G W EH N D AH L IH N
+gwennie G W EH N IY
+gwenore G W EH N ER
+gwin G W IH N
+gwinn G W IH N
+gwinn's G W IH N Z
+gwinner G W IH N ER
+gwinnett G W IH N EH T
+gwizdala G W IH Z D AA L AH
+gwozdz G W AA Z D Z
+gwyn G W IH N
+gwyneth G W IH N AH TH
+gwyneth's G W IH N AH TH S
+gwyneths G W IH N AH TH S
+gwynn G W IH N
+gwynne G W IH N
+gyger G AY G ER
+gyi G IY
+gyi(2) JH IY W AY AY
+gyles JH AY L Z
+gyllenhammar JH IH L EH N HH AE M ER
+gym JH IH M
+gym's JH IH M Z
+gymboree JH IH M B AO R IY
+gymnasia JH IH M N EY Z IY AH
+gymnasium JH IH M N EY Z IY AH M
+gymnasiums JH IH M N EY Z IY AH M Z
+gymnast JH IH M N AH S T
+gymnastic JH IH M N AE S T IH K
+gymnastics JH IH M N AE S T IH K S
+gymnasts JH IH M N AE S T S
+gymnasts(2) JH IH M N AE S S
+gymnasts(3) JH IH M N AE S
+gyms JH IH M Z
+gyn G IH N
+gyn(2) G AY N
+gynecologic G AY N AH K AH L AA JH IH K
+gynecological G AY N AH K AH L AA JH IH K AH L
+gynecologist G AY N AH K AA L AH JH AH S T
+gynecologists G AY N AH K AA L AH JH AH S T S
+gynecologists(2) G AY N AH K AA L AH JH AH S S
+gynecologists(3) G AY N AH K AA L AH JH AH S
+gynecology G AY N AH K AA L AH JH IY
+gynex JH IH N AH K S
+gyohten G Y OW T AH N
+gyosai G Y OW S EY
+gyp JH IH P
+gypped JH IH P T
+gypsies JH IH P S IY Z
+gypsum JH IH P S AH M
+gypsum's JH IH P S AH M Z
+gypsy JH IH P S IY
+gyr JH AY R
+gyrate JH AY R EY T
+gyrated JH AY R EY T IH D
+gyrates JH AY R EY T S
+gyrating JH AY R EY T IH NG
+gyration JH AY R EY SH AH N
+gyrations JH AY R EY SH AH N Z
+gyro JH AY R OW
+gyrocompass JH AY R OW K AH M P AH S
+gyrodyne JH IH R AH D AY N
+gyrodynes JH IH R AH D AY N Z
+gyropilot JH AY R OW P AY L AH T
+gyros JH AY R OW Z
+gyroscope JH AY R AH S K OW P
+gyroscopes JH AY R AH S K OW P S
+gyroscopic JH AY R AH S K AA P IH K
+gytha JH AY DH AH
+gyuhama G Y UW HH AA M AH
+h EY CH
+h's EY CH IH Z
+h. EY CH
+h.'s EY CH IH Z
+ha HH AA
+ha'aretz HH AA R EH T S
+ha'aretz(2) HH AH AA R EH T S
+ha'etzni HH AH EH T S N IY
+ha(2) EY CH EY
+haab HH AA B
+haack HH AA K
+haacke HH AA K
+haaf HH AA F
+haag HH AA G
+haagen HH AA G AH N
+haagenson HH AA G IH N S AH N
+haak HH AA K
+haake HH AA K
+haakenson HH AA K IH N S AH N
+haaland HH AA L AH N D
+haan HH AA N
+haapala HH AA P AA L AH
+haar HH AA R
+haas HH AA S
+haase HH AA S
+haass HH AA S
+haavelmo HH AA V EH L M OW
+habben HH AE B AH N
+habeas HH AE B IY AH S
+habeck HH AA B EH K
+habecker HH AE B EH K ER
+habeeb HH AE B IY B
+habegger HH AE B IH G ER
+habel HH AE B AH L
+habenicht HH AE B IH N IH K T
+haber HH EY B ER
+haberdashery HH AE B ER D AE SH ER IY
+haberer HH AE B ER ER
+haberkorn HH AE B ER K ER N
+haberl HH AE B ER L
+haberland HH AE B ER L AH N D
+haberle HH AE B ER AH L
+haberman HH EY B ER M AH N
+habermann HH EY B ER M AH N
+habermehl HH AE B ER M AH L
+haberson HH EY B ER S IH N
+haberson(2) HH AE B ER S IH N
+haberstroh HH AA B EH R S T R OW
+habib HH AH B IY B
+habibi HH AH B IY B IY
+habibie HH AH B IY B IY
+habich HH AE B IH K
+habicht HH AE B IH K T
+habig HH AE B IH G
+habiger HH AE B IH G ER
+habit HH AE B AH T
+habitable HH AE B AH T AH B AH L
+habitat HH AE B AH T AE T
+habitat's HH AE B AH T AE T S
+habitation HH AE B AH T EY SH AH N
+habitats HH AE B AH T AE T S
+habits HH AE B AH T S
+habitual HH AH B IH CH UW AH L
+habitually HH AH B IH CH UW AH L IY
+habitually(2) HH AH B IH CH UW L IY
+habitues HH AE B IH CH UW Z
+hable HH EY B AH L
+habs HH AE B Z
+habsburg HH AE P S B ER G
+haby HH EY B IY
+habyarimana HH AE B IY ER IY M AA N AH
+habyarimana(2) HH AE B IY AA R IY M AA N AH
+hach HH AE CH
+hachette HH AH SH EH T
+hachey HH AE CH IY
+hachtel HH AE K T AH L
+hacienda HH AE S IY EH N D AH
+hack HH AE K
+hackathorn HH AE K AH TH ER N
+hackbart HH AE K B AA R T
+hackbarth HH AE K B AA R TH
+hackberry HH AE K B EH R IY
+hacke HH AE K
+hacked HH AE K T
+hackel HH AE K AH L
+hackenberg HH AE K AH N B ER G
+hackensack HH AE K AH N S AE K
+hacker HH AE K ER
+hacker's HH AE K ER Z
+hackers HH AE K ER Z
+hackert HH AE K ER T
+hackett HH AE K IH T
+hackford HH AE K F ER D
+hacking HH AE K IH NG
+hackl HH AE K AH L
+hackle HH AE K AH L
+hackleman HH AE K AH L M AH N
+hackler HH AE K AH L ER
+hackler(2) HH AE K L ER
+hackles HH AE K AH L Z
+hackley HH AE K L IY
+hackman HH AE K M AE N
+hackman(2) HH AE K M AH N
+hackmann HH AE K M AH N
+hackmatack HH AE K M AH T AE K
+hackney HH AE K N IY
+hackneyed HH AE K N IY D
+hacks HH AE K S
+hacksaw HH AE K S AO
+hackstaff HH AE K S T AE F
+hackworth HH AE K W ER TH
+had HH AE D
+hada HH AA D AH
+hadad HH AE D AH D
+hadaway HH AA D AH W EY
+hadd HH AE D
+haddad HH AE D AH D
+haddan HH AE D AH N
+haddaway HH AE D AH W EY
+hadden HH AE D AH N
+haddock HH AE D AH K
+haddon HH AE D AH N
+haddonfield HH AE D AH N F IY L D
+haddow HH AE D OW
+hade HH EY D
+haden HH EY D AH N
+hader HH EY D ER
+hades HH EY D IY Z
+hades(2) HH EY D Z
+hadfield HH AE D F IY L D
+hadid HH AA D IY D
+hadleigh HH AE D L AH
+hadler HH EY D AH L ER
+hadler(2) HH EY D L ER
+hadley HH AE D L IY
+hadline HH AE D L AY N
+hadlock HH AE D L AH K
+hadn't HH AE D AH N T
+hadn't(2) HH AE D AH N
+hadnot HH AE D N AH T
+hadoya HH AH D OY AH
+hadria HH AE D R IY AH
+hadrian HH AE D R IY AH N
+hadrian's HH EY D R IY AH N Z
+hadrian(2) HH EY D R IY AH N
+hadsall HH AE D S AH L
+hadsell HH AE D S AH L
+hadson HH AE D S AH N
+hadwin HH AE D W IH N
+haeberle HH EH B ER AH L
+haecker HH EH K ER
+haefele HH EH F AH L
+haeffner HH EH F N ER
+haefner HH EH F N ER
+haegele HH EH G AH L
+haeger HH EH G ER
+haen HH IY N
+haenel HH EH N AH L
+haering HH AA ER IH NG
+haertel HH EH R T AH L
+haese HH IY S
+haessly HH AE S L IY
+haeussler HH AW S L ER
+hafele HH AE F AH L
+hafeman HH EY F M AH N
+hafen HH AE F AH N
+hafer HH EY F ER
+hafey HH EY F IY
+hafez HH AA F EH Z
+haff HH AE F
+haffey HH AE F IY
+haffez HH AA F EH Z
+haffner HH AE F N ER
+hafford HH AE F ER D
+hafif HH AA F IY F
+hafif's HH AA F IY F S
+hafley HH AE F L IY
+hafner HH AE F N ER
+hafnia HH AE F N IY AH
+hafnium HH AE F N IY AH M
+haft HH AE F T
+haft's HH AE F T S
+haft's(2) HH AE F S
+hafta HH AE F T AH
+hafts HH AE F T S
+hafts' HH AE F T S
+hafts'(2) HH AE F S
+hafts(2) HH AE F S
+hag HH AE G
+haga HH AA G AH
+hagadorn HH AE G AH D AO R N
+hagaman HH AE G AH M AH N
+hagan HH EY G AH N
+hagans HH EY G AH N Z
+hagar HH EY G AA R
+hagar(2) HH EY G ER
+hagarty HH AE G AA R T IY
+hagberg HH AE G B ER G
+hage HH EY JH
+hagedorn HH AE G IH D ER N
+hagee HH AE JH IY
+hagel HH AE G AH L
+hagelin HH AE G IH L IH N
+hageman HH EY JH M AH N
+hagemann HH EY JH M AH N
+hagemeier HH AE G IH M AY ER
+hagemeister HH AE G IH M AY S T ER
+hagemeyer HH AE G IH M AY ER
+hagen HH EY G AH N
+hagenbuch HH AE G IH N B AH K
+hagenlocker HH EY G AH N L AA K ER
+hagenow HH AE JH IH N OW
+hagens HH EY G AH N Z
+hager HH EY G ER
+hagerman HH EY G ER M AH N
+hagerstown HH EY G ER Z T AW N
+hagerty HH AE JH ER T IY
+hagewood HH EY JH W UH D
+hagey HH AE JH IY
+hagfish HH AE G F IH SH
+hagg HH AE G
+haggadah HH AH G AH D AH
+haggan HH AE G AH N
+haggar HH AE G ER
+haggard HH AE G ER D
+haggart HH AE G ER T
+haggarty HH AE G AA R T IY
+hagge HH AE G
+haggerty HH AE G ER T IY
+haggett HH AE G IH T
+haggins HH AE G IH N Z
+haggle HH AE G AH L
+haggled HH AE G AH L D
+haggling HH AE G AH L IH NG
+haggling(2) HH AE G L IH NG
+hagglund HH AE G L AH N D
+haggstrom HH AE G S T R AH M
+hagin HH AE JH IH N
+hagin(2) HH AE G IH N
+hagins HH AE G IH N Z
+hagins(2) HH AE JH IH N Z
+hagiography HH AE G IY AA G R AH F IY
+hagiwara HH AA G IH W AA R AH
+hagle HH EY G AH L
+hagler HH AE G L ER
+hagley HH AE G L IY
+haglund HH AE G L AH N D
+hagman HH AE G M AH N
+hagmann HH AE G M AH N
+hagner HH AE G N ER
+hagood HH AE G UH D
+hagopian HH AH G OW P IY AH N
+hagstrom HH AE G S T R AH M
+hague HH EY G
+hagwood HH AE G W UH D
+hagy HH EY G IY
+hah HH AA
+hahl HH AA L
+hahm HH AE M
+hahn HH AA N
+hahne HH EY N
+hahner HH AA N ER
+hahs HH AA S
+haid HH EY D
+haida HH AY D AH
+haidee HH EY D IY
+haider HH EY D ER
+haidet HH EY D IH T
+haifa HH AY F AH
+haifong HH AY F AO NG
+haig HH EY G
+haig's HH EY G Z
+haigh HH EY
+haight HH EY T
+haigler HH EY G L ER
+haik HH EY K
+haiku HH AY K UW
+haikus HH AY K UW Z
+hail HH EY L
+hailand HH EY L AH N D
+haile HH EY L
+haile(2) HH AY L IY
+hailed HH EY L D
+hailes HH EY L Z
+hailes(2) HH AY L IY Z
+hailey HH EY L IY
+hailing HH EY L IH NG
+hails HH EY L Z
+hailstone HH EY L S T OW N
+hailstones HH EY L S T OW N Z
+hailstorm HH EY L S T AO R M
+haim HH AY M
+haim(2) HH EY M
+haimes HH EY M Z
+haimovitch HH EY M AH V IH CH
+haimovitz HH EY M AH V IH T S
+haimowitz HH AY M AH W IH T S
+hain HH EY N
+hainan HH EY N AH N
+hainer HH EY N ER
+haines HH EY N Z
+hainey HH EY N IY
+hainley HH EY N L IY
+hainline HH EY N L AY N
+hains HH EY N Z
+hainsworth HH EY N S W ER TH
+hair HH EH R
+hair's HH EH R Z
+haircut HH EH R K AH T
+haircuts HH EH R K AH T S
+hairdo HH EH R D UW
+hairdos HH EH R D UW Z
+hairdresser HH EH R D R EH S ER
+hairdressers HH EH R D R EH S ER Z
+hairdressing HH EH R D R EH S IH NG
+haire HH EH R
+haired HH EH R D
+hairfield HH EH R F IY L D
+hairgrove HH AY R G R AH V
+hairiness HH EH R IY N AH S
+hairless HH EH R L AH S
+hairline HH EH R L AY N
+hairr HH EH R
+hairs HH EH R Z
+hairspray HH EH R S P R EY
+hairston HH AY R S T AH N
+hairstyle HH EH R S T AY L
+hairy HH EH R IY
+haisley HH EY Z L IY
+haislip HH AY S L IH P
+haist HH AA IH S T
+hait HH EY T
+haith HH EY TH
+haithcock HH EY TH K AA K
+haiti HH EY T IY
+haiti's HH EY T IY Z
+haitian HH EY SH AH N
+haitians HH EY SH AH N Z
+haitien HH EY SH AH N
+haitiens HH EY SH AH N Z
+haitis HH EY T IY Z
+haizlip HH EY Z L IH P
+hajdu HH AA Y D UW
+hajduk HH AY D AH K
+hajek HH AY EH K
+hajime HH AA JH IY M IY
+hajj HH AE JH
+hajjar HH AA Y AA R
+hakala HH AH K AA L AH
+hakan HH EY K AH N
+hakan(2) HH AA K AH N
+hakanson HH AE K AH N S AH N
+hake HH EY K
+hakeem HH AA K IY M
+hakeem's HH AA K IY M Z
+hakes HH EY K S
+hakim HH AA K IY M
+hakim's HH AA K IY M Z
+hakim's(2) AA K IY M Z
+hakim(2) AA K IY M
+hakki HH AE K IY
+hakko HH AE K OW
+hakon HH AE K AH N
+hakuhodo HH AA K UW HH OW D OW
+hal HH AE L
+hal's HH AE L Z
+halama HH AA L AA M AH
+halamandaris HH AE L AH M AE N D ER IH S
+halas HH AA L AH Z
+halasz HH AA L AH SH
+halbach HH AE L B AA K
+halberg HH AE L B ER G
+halberstadt HH AE L B ER SH T AE T
+halberstam HH AE L B ER S T AE M
+halbert HH AE L B ER T
+halbig HH AE L B IH G
+halbrook HH AE L B R UH K
+halbrooks HH AE L B R UH K S
+halbur HH AE L B ER
+halbutogullari HH AE L B UW T OW G UW L AA R IY
+halcion HH AE L S IY AH N
+halcion's HH AE L S IY AH N Z
+halcomb HH AE L K AH M
+halcyon HH AE L S IY AH N
+halcyone HH AE L S IY OW N
+hald HH AO L D
+haldan HH AE L D AH N
+haldana HH AH L D AE N AH
+haldeman HH AA L D M AH N
+haldeman's HH AA L D M AH N Z
+haldeman's(2) HH AA L D AH M AH N Z
+haldeman(2) HH AA L D AH M AH N
+halden HH AO L D AH N
+halder HH AO L D ER
+halderman HH AO L D ER M AH N
+hale HH EY L
+hale's HH EY L Z
+halebopp HH AY L B AO P
+halen HH EY L EH N
+hales HH EY L Z
+halevi HH AH L EY V IY
+halevi(2) HH AH L IY V IY
+haley HH EY L IY
+haley's HH EY L IY Z
+half HH AE F
+half's HH AE F S
+halfacre HH AE F EY K ER
+halfback HH AE F B AE K
+halfbacks HH AE F B AE K S
+halfdan HH AE L F D AH N
+halferty HH AE F ER T IY
+halfhearted HH AE F HH AA R T IH D
+halfhill HH AE F HH IH L
+halfman HH AE F M AH N
+halfmann HH AE F M AH N
+halford HH AE F ER D
+halfrida HH AE F R IH D AH
+halftime HH AE F T AY M
+halftimes HH AE F T AY M Z
+halftone HH AE F T OW N
+halftones HH AE F T OW N Z
+halfway HH AE F W EY
+halfwit HH AE F W IH T
+halfwits HH AE F W IH T S
+halgren HH AE L G R EH N
+haliburton HH AE L IH B ER T AH N
+halibut HH AE L AH B AH T
+halide HH AE L AY D
+halifa HH AH L IY F AH
+halifax HH AE L IH F AE K S
+halik HH AE L IH K
+halima HH AH L IY M AH
+halimeda HH AA L IY M EY D AH
+halite HH AE L AY T
+halko HH AE L K OW
+hall HH AO L
+hall's HH AO L Z
+halla HH AE L AH
+halladay HH AE L AH D EY
+hallahan HH AE L AH HH AE N
+hallam HH AE L AH M
+hallanan HH AE L AH N AH N
+hallandale HH AE L AH N D EY L
+hallas HH AE L AH Z
+hallauer HH AE L AW ER
+hallbauer HH AO L B AW R
+hallberg HH AO L B ER G
+halle HH AE L
+halle(2) HH AE L IY
+halleck HH AE L IH K
+hallelujah HH AE L AH L UW Y AH
+hallen HH AO L AH N
+hallenbeck HH AO L AH N B EH K
+haller HH AO L ER
+halleran HH AE L ER AE N
+hallet HH AE L IH T
+hallett HH AE L IH T
+halley HH AE L IY
+halley(2) HH EY L IY
+hallford HH AE L F ER D
+hallgarten HH AO L G AA R T AH N
+hallgren HH AE L G R EH N
+halliburton HH AE L IH B ER T AH N
+halliburton's HH AE L IH B ER T AH N Z
+halliciforn HH AH L IH S IH F AO R N
+halliday HH AE L IH D EY
+hallie HH AO L IY
+halligan HH AE L IH G AH N
+hallin HH AE L IH N
+hallinan HH AE L IH N AH N
+halling HH AO L IH NG
+hallingby HH AO L IH NG B IY
+hallisey HH AE L IH S IY
+hallman HH AO L M AH N
+hallmark HH AA L M AA R K
+hallmark's HH AO L M AA R K S
+hallmarks HH AO L M AA R K S
+hallock HH AE L AH K
+halloran HH AE L ER AH N
+hallow HH AE L OW
+halloway HH AE L OW W EY
+hallowe'en HH AE L AH W IY N
+hallowed HH AE L OW D
+halloween HH AE L AH W IY N
+hallowell HH AE L AH W EH L
+hallows HH AE L OW Z
+hallquist HH AE L K W IH S T
+halls HH AO L Z
+hallstrom HH AE L S T R AH M
+hallucinate HH AH L UW S AH N EY T
+hallucinated HH AH L UW S AH N EY T IH D
+hallucinates HH AH L UW S AH N EY T S
+hallucinating HH AH L UW S AH N EY T IH NG
+hallucinating(2) HH AH L UW S IH N EY T IH NG
+hallucination HH AH L UW S AH N EY SH AH N
+hallucinations HH AH L UW S AH N EY SH AH N Z
+hallucinatory HH AH L UW S AH N AH T AO R IY
+hallucinogenic HH AH L UW S AH N AH JH EH N IH K
+hallum HH AE L AH M
+hallums HH AE L AH M Z
+hallward HH AO L W ER D
+hallway HH AO L W EY
+hallways HH AO L W EY Z
+hallwood HH AO L W UH D
+hally HH AE L IY
+halm HH AA M
+halmi HH AO L M IY
+halmos HH AO L M OW S
+halmstad HH AA L M S T AE D
+halo HH EY L OW
+halogen HH AE L AH JH AH N
+halogenate HH AE L AH JH AH N EY T
+halogenated HH AE L AH JH AH N EY T IH D
+halon HH EY L AA N
+halophytic HH AE L AH F IH T IH K
+halos HH EY L OW Z
+halper HH AE L P ER
+halperin HH AE L P ER IH N
+halperin(2) HH AE L P R IH N
+halpern HH AE L P ER N
+halperstant HH AE L P ER S T AH N T
+halpert HH AE L P ER T
+halpin HH AE L P IH N
+halprin HH AE L P R IH N
+halsell HH AE L S AH L
+halseth HH AE L S IH TH
+halsey HH AE L S IY
+halstead HH AE L S T EH D
+halsted HH AE L S T IH D
+halston HH AO L S T AH N
+halston's HH AO L S T AH N
+halt HH AO L T
+halted HH AO L T AH D
+halted(2) HH AO L T IH D
+halteman HH EY L T M AH N
+halter HH AO L T ER
+halter's HH AO L T ER Z
+halterman HH AO L T ER M AH N
+halters HH AO L T ER Z
+halting HH AO L T IH NG
+haltingly HH AO L T IH NG L IY
+haltiwanger HH AE L T IH W AH NG ER
+haltom HH AE L T AH M
+halton HH AE L T AH N
+halts HH AO L T S
+haluska HH AH L AH S K AH
+halve HH AE V
+halved HH AE V D
+halverson HH AE L V ER S AH N
+halves HH AE V Z
+halving HH AE V IH NG
+halvorsen HH AE L V AO R S AH N
+halvorson HH AE L V ER S AH N
+ham HH AE M
+hama HH AA M AH
+hamacher HH AE M AH K ER
+hamad HH AE M AH D
+hamada HH AA M AA D AH
+hamadei HH AE M AH D EY
+hamadi HH AH M AA D IY
+hamaker HH AA M EY K ER
+hamal HH EY M AH L
+hamamoto HH AA M AA M OW T OW
+haman HH EY M AH N
+hamanaka HH AH M AH N AA K AH
+hamann HH AA M AH N
+hamar HH AH M AA R
+hamas HH AA M AA S
+hamas' HH AA M AA S
+hamasaki HH AA M AA S AA K IY
+hambelton HH AH M B EH L T AH N
+hamberg HH AE M B ER G
+hamberger HH AE M B ER G ER
+hamblen HH AE M B AH L AH N
+hamblet HH AE M B L IH T
+hambleton HH AE M B AH L T AA N
+hambley HH AE M B L IY
+hamblin HH AE M B L IH N
+hambly HH AE M B L IY
+hambrecht HH AE M B R EH K T
+hambrick HH AE M B R IH K
+hambright HH AE M B R AY T
+hambro HH AE M B R OW
+hambros HH AE M B R OW S
+hamburg HH AE M B ER G
+hamburger HH AE M B ER G ER
+hamburgers HH AE M B ER G ER Z
+hamby HH AE M B IY
+hamdan HH AE M D AH N
+hamdoon HH AE M D UW N
+hamdun HH AE M D AH N
+hamed HH AE M D
+hameister HH AE M AY S T ER
+hamel HH AE M AH L
+hamelin HH AE M AH L IH N
+hamelin(2) HH AE M L IH N
+hamer HH AE M ER
+hames HH EY M Z
+hamid HH AH M IY D
+hamiel HH AE M IY L
+hamil HH AE M AH L
+hamill HH AE M AH L
+hamilton HH AE M AH L T AH N
+hamilton's HH AE M AH L T AH N Z
+hamiltons HH AE M AH L T AH N Z
+hamish HH AE M IH SH
+hamiter HH AE M AY T ER
+hamitic HH AE M IH T IH K
+hamler HH AE M AH L ER
+hamler(2) HH AE M L ER
+hamlet HH AE M L AH T
+hamlet(2) HH AE M L IH T
+hamlets HH AE M L AH T S
+hamlett HH AE M L IH T
+hamley HH AE M L IY
+hamley's HH AE M L IY Z
+hamlin HH AE M L IH N
+hamling HH AE M L IH NG
+hamlisch HH AE M L IH SH
+hamlisch's HH AE M L IH SH AH Z
+hamm HH AE M
+hammac HH AE M AH K
+hammacher HH AE M AA K ER
+hammack HH AE M AH K
+hammaker HH AE M EY K ER
+hamman HH AE M AH N
+hammann HH AE M AH N
+hammar HH AE M ER
+hammas HH AH M AA S
+hammas' HH AH M AA S
+hammas's HH AH M AA S IH S
+hamme HH AE M
+hammel HH AE M AH L
+hammell HH AE M AH L
+hammen HH AE M AH N
+hammer HH AE M ER
+hammer's HH AE M ER Z
+hammered HH AE M ER D
+hammering HH AE M ER IH NG
+hammerle HH AE M ER AH L
+hammerlock HH AE M ER L AA K
+hammerman HH AE M ER M AH N
+hammermeister HH AE M ER M AY S T ER
+hammermill HH AE M ER M IH L
+hammers HH AE M ER Z
+hammerschmidt HH AE M ER SH M IH T
+hammersley HH AE M ER S L IY
+hammersmith HH AE M ER S M IH TH
+hammerson HH AE M ER S AH N
+hammerstein HH AE M ER S T IY N
+hammerstein's HH AE M ER S T IY N Z
+hammerstein's(2) HH AE M ER S T AY N Z
+hammerstein(2) HH AE M ER S T AY N
+hammerstrom HH AE M ER S T R AH M
+hammes HH AE M Z
+hammett HH AE M IH T
+hammill HH AE M AH L
+hammitt HH AE M IH T
+hammock HH AE M AH K
+hammocks HH AE M AH K S
+hammon HH AE M AH N
+hammond HH AE M AH N D
+hammonds HH AE M AH N D Z
+hammons HH AE M AH N Z
+hammontree HH AE M AH N T R IY
+hamner HH AE M N ER
+hamon HH AE M AH N
+hamor HH AE M ER
+hamp HH AE M P
+hampe HH AE M P
+hampel HH AE M P AH L
+hamper HH AE M P ER
+hampered HH AE M P ER D
+hampering HH AE M P ER IH NG
+hampers HH AE M P ER Z
+hample HH AE M P AH L
+hampshire HH AE M P SH ER
+hampshire's HH AE M P SH ER Z
+hampshire's(2) HH AE M SH ER Z
+hampshire's(3) HH AE M P SH AY ER Z
+hampshire's(4) HH AE M SH AY ER Z
+hampshire(2) HH AE M SH ER
+hampshire(3) HH AE M P SH AY ER
+hampshire(4) HH AE M SH AY ER
+hampshirites HH AE M P SH ER AY T S
+hampson HH AE M P S AH N
+hampstead HH AE M P S T EH D
+hampton HH AE M P T AH N
+hampton's HH AE M P T AH N Z
+hamptons HH AE M P T AH N Z
+hamptonshire HH AE M P T AH N SH ER
+hamptonshire's HH AE M P T AH N SH ER Z
+hamre HH AE M ER
+hamric HH AE M R IH K
+hamrick HH AE M R IH K
+hamrock HH AE M R AA K
+hams HH AE M Z
+hamsher HH AE M SH ER
+hamson HH AE M S AH N
+hamsphire HH AE M S F AY R
+hamster HH AE M S T ER
+hamsters HH AE M S T ER Z
+hamstra HH AE M S T R AH
+hamstring HH AE M S T R IH NG
+hamstrings HH AE M S T R IH NG Z
+hamstrung HH AE M S T R AH NG
+hamtramck HH AE M T R AE M IH K
+han HH AA N
+han's HH AA N Z
+han's(2) HH AE N Z
+han(2) HH AE N
+hana HH AE N AH
+hanafin HH AE N AH F IH N
+hanagan HH AA N AA G AA N
+hanahan HH AE N AH HH AE N
+hanak HH AA N AH K
+hanan HH EY N AH N
+hanas HH AE N AH Z
+hanauer HH AE N AW ER
+hanawalt HH AE N AH W AO L T
+hanaway HH AE N AH W EY
+hanback HH AE N B AE K
+hanberry HH AE N B EH R IY
+hanbo HH AE N B OW
+hanbury HH AE N B EH R IY
+hanby HH AE N B IY
+hance HH AE N S
+hancher HH AE N CH ER
+hanchett HH AE N CH IH T
+hanchey HH AE N CH IY
+hancock HH AE N K AA K
+hancock's HH AE N K AA K S
+hancox HH AE N K AA K S
+hand HH AE N D
+handa HH AE N D AH
+handbag HH AE N D B AE G
+handbags HH AE N D B AE G Z
+handball HH AE N D B AO L
+handballs HH AE N D B AO L Z
+handbill HH AE N D B IH L
+handbills HH AE N D B IH L Z
+handbook HH AE N D B UH K
+handbooks HH AE N D B UH K S
+handclasp HH AE N D K L AE S P
+handcraft HH AE N D K R AE F T
+handcrafted HH AE N D K R AE F T IH D
+handcrafts HH AE N D K R AE F T S
+handcuff HH AE N D K AH F
+handcuffed HH AE N D K AH F T
+handcuffing HH AE N D K AH F IH NG
+handcuffs HH AE N D K AH F S
+handed HH AE N D AH D
+handed(2) HH AE N D IH D
+handedly HH AE N D IH D L IY
+handedness HH AE N D AH D N AH S
+handel HH AE N D AH L
+handel's HH AE N D AH L Z
+handeland HH AE N D IH L AH N D
+handelman HH AE N D AH L M AH N
+handels HH AE N D AH L Z
+handelsbank HH AE N D AH L Z B AE NG K
+handelsbanken HH AE N D AH L S B AE NG K AH N
+handelsman HH AE N D IH L S M AH N
+hander HH AE N D ER
+handers HH AE N D ER Z
+handford HH AE N D F ER D
+handful HH AE N D F UH L
+handfuls HH AE N D F UH L Z
+handgun HH AE N D G AH N
+handguns HH AE N D G AH N Z
+handheld HH AE N D HH EH L D
+handhold HH AE N D HH OW L D
+handholding HH AE N D HH OW L D IH NG
+handicap HH AE N D IY K AE P
+handicapped HH AE N D IY K AE P T
+handicapper HH AE N D IY K AE P ER
+handicappers HH AE N D IY K AE P ER Z
+handicapping HH AE N D IY K AE P IH NG
+handicaps HH AE N D IY K AE P S
+handicraft HH AE N D IY K R AE F T
+handicrafts HH AE N D IY K R AE F T S
+handier HH AE N D IY ER
+handiest HH AE N D IY AH S T
+handily HH AE N D AH L IY
+handing HH AE N D IH NG
+handiwork HH AE N D IY W ER K
+handke HH AE N D K IY
+handkerchief HH AE NG K ER CH IH F
+handkerchief(2) HH AE NG K ER CH IY F
+handkerchiefs HH AE NG K ER CH AH F S
+handkerchiefs(2) HH AE NG K ER CH IY F S
+handle HH AE N D AH L
+handlebar HH AE N D AH L B AA R
+handlebars HH AE N D AH L B AA R Z
+handled HH AE N D AH L D
+handler HH AE N D L ER
+handler(2) HH AE N D AH L ER
+handlers HH AE N D L ER Z
+handlers(2) HH AE N D AH L ER Z
+handles HH AE N D AH L Z
+handley HH AE N D L IY
+handlin HH AE N D L IH N
+handling HH AE N D L IH NG
+handling(2) HH AE N D AH L IH NG
+handlon HH AE N D L AH N
+handloom HH AE N D L UW M
+handlooms HH AE N D L UW M Z
+handly HH AE N D L IY
+handmade HH AE N D M EY D
+handmade(2) HH AE N M EY D
+handout HH AE N D AW T
+handouts HH AE N D AW T S
+handover HH AE N D OW V ER
+handpick HH AE N D P IH K
+handpicked HH AE N D P IH K T
+handrail HH AE N D R EY L
+handrails HH AE N D R EY L Z
+handrich HH AE N D R IH K
+handros HH AE N D R OW S
+hands HH AE N D Z
+hands(2) HH AE N Z
+handsaw HH AE N D S AO
+handsaws HH AE N D S AO Z
+handset HH AE N D S EH T
+handsets HH AE N D S EH T S
+handshake HH AE N D SH EY K
+handshakes HH AE N D SH EY K S
+handshaking HH AE N D SH EY K IH NG
+handsome HH AE N S AH M
+handsomely HH AE N S AH M L IY
+handstand HH AE N D S T AE N D
+handstands HH AE N D S T AE N D Z
+handwerk HH AE N D W ER K
+handwerker HH AE N D W ER K ER
+handwoven HH AE N D W OW V AH N
+handwoven(2) HH AE N W OW V AH N
+handwriting HH AE N D R AY T IH NG
+handwritten HH AE N D R IH T AH N
+handy HH AE N D IY
+handyman HH AE N D IY M AE N
+handymen HH AE N D IY M EH N
+hane HH EY N
+haneda HH AH N EY D AH
+hanel HH AE N AH L
+haneline HH AE N IH L AY N
+hanemann HH EY N M AH N
+haner HH EY N ER
+hanes HH EY N Z
+haney HH EY N IY
+hanf HH AE N F
+hanford HH AE N F ER D
+hanft HH AE N F T
+hang HH AE NG
+hangar HH AE NG ER
+hangars HH AE NG ER Z
+hangartner HH AE NG G AA R T N ER
+hanged HH AE NG D
+hangen HH AE NG AH N
+hanger HH AE NG ER
+hangers HH AE NG ER Z
+hangin' HH AE NG G IH N
+hanging HH AE NG IH NG
+hanging(2) HH AE NG G IH NG
+hangings HH AE NG G IH NG Z
+hangman HH AE NG M AH N
+hangout HH AE NG AW T
+hangouts HH AE NG AW T S
+hangover HH AE NG OW V ER
+hangovers HH AE NG OW V ER Z
+hangs HH AE NG Z
+hangsang HH AE NG S AE NG
+hangsang's HH AE NG S AE NG Z
+hangup HH AE NG G AH P
+hangups HH AE NG G AH P S
+hani HH AE N IY
+hani's HH AE N IY Z
+hanifen HH AE N IH F AH N
+hanifin HH AE N IH F IH N
+hanigan HH AE N IH G AH N
+haning HH EY N IH NG
+hanisch HH AE N IH SH
+hanisee HH AE N IH S IY
+hanish HH AE N IH SH
+hanjin HH AE N JH IH N
+hank HH AE NG K
+hank's HH AE N K S
+hanke HH AE NG K
+hankel HH AE NG K AH L
+hanken HH AE NG K AH N
+hanker HH AE NG K ER
+hankering HH AE NG K ER IH NG
+hankerson HH AE NG K ER S AH N
+hankes HH AE NG K S
+hankey HH AE NG K IY
+hankin HH AE NG K IH N
+hankins HH AE NG K IH N Z
+hankinson HH AE NG K IH N S AH N
+hankla HH AE NG K L AH
+hanko HH AE NG K OW
+hanks HH AE NG K S
+hanky HH AE NG K IY
+hanley HH AE N L IY
+hanley's HH AE N L IY Z
+hanlin HH AE N L IH N
+hanlon HH AE N L AH N
+hanly HH AE N L IY
+hanmer HH AE N M ER
+hann HH AE N
+hanna HH AE N AH
+hanna's HH AE N AH Z
+hannaford HH AE N AH F ER D
+hannagan HH AE N AH G AE N
+hannah HH AE N AH
+hannahs HH AE N AH Z
+hannam HH AE N AH M
+hannaman HH AE N AH M AH N
+hannan HH AE N AH N
+hannay HH AE N EY
+hanneken HH AE N IH K AH N
+hanneman HH AE N M AH N
+hannemann HH AE N M AH N
+hannen HH AE N AH N
+hanner HH AE N ER
+hanners HH AE N ER Z
+hannes HH AE N Z
+hannesson HH AE N AH S AH N
+hanney HH AE N IY
+hanni HH AE N IY
+hannibal HH AE N IH B AH L
+hannie HH AE N IY
+hannifin HH AE N IH F IH N
+hannig HH AE N IH G
+hannigan HH AE N IH G AH N
+hanning HH AE N IH NG
+hannis HH AE N IH S
+hannity HH AE N IH T IY
+hannoch HH AE N AH K
+hannold HH AE N OW L D
+hannon HH AE N AH N
+hannula HH AE N UW L AH
+hannum HH AE N AH M
+hanny HH AE N IY
+hano HH AA N OW
+hanoi HH AE N OY
+hanoi's HH AH N OY Z
+hanold HH AE N OW L D
+hanover HH AE N OW V ER
+hanover's HH AE N OW V ER Z
+hanoverian HH AE N OW V IH R IY AH N
+hanrahan HH AE N R AH HH AE N
+hanratty HH AE N R AH T IY
+hans HH AA N S
+hans(2) HH AE N Z
+hansa HH AE N S AH
+hansard HH AE N S ER D
+hansberger HH AE N S B ER G ER
+hansberry HH AE N S B EH R IY
+hansbrough HH AE N S B R AW
+hansbury HH AE N S B EH R IY
+hansche HH AE N SH IY
+hanscom HH AE N S K AH M
+hanseatic HH AE N S IY AE T IH K
+hansel HH AE N S AH L
+hansell HH AE N S AH L
+hanselman HH AE N S AH L M AH N
+hansen HH AE N S AH N
+hansen's HH AE N S AH N Z
+hanser HH AA N S ER
+hansford HH AE N S F ER D
+hanshaw HH AE N SH AO
+hanshew HH AE N SH UW
+hanshin HH AE N SH IH N
+hansley HH AE N S L IY
+hansma HH AE N S M AH
+hansman HH AE N S M AH N
+hansmann HH AE N S M AH N
+hansom HH AE N S AH M
+hanson HH AE N S AH N
+hanson's HH AE N S AH N Z
+hanssen HH AE N S AH N
+hansson HH AE N S AH N
+hanta HH AE N T AH
+hanta(2) HH AA N T AH
+hantavirus HH AE N T AH V AY R AH S
+hanten HH AE N T AH N
+hanthorn HH AE N TH ER N
+hantman HH AE N T M AH N
+hantz HH AE N T S
+hanukkah HH AA N AH K AH
+hanukkah's HH AA N AH K AH Z
+hanukkahs HH AA N AH K AH Z
+hanus HH EY N IH S
+hanvey HH AE N V IY
+hanwa HH AE N W AH
+hanwa's HH AE N W AH Z
+hanway HH AE N W EY
+hany HH EY N IY
+hany's HH EY N IY Z
+hanzel HH AE N Z AH L
+hanzlik HH AE N Z L IH K
+hao HH AW
+hao-chi HH AW CH IY
+hap HH AE P
+hapag HH EY P AE G
+hapeman HH EY P M AH N
+hapgood HH AE P G UH D
+haphazard HH AE P HH AE Z ER D
+haphazardly HH AE F AH Z ER D L IY
+haphazardly(2) HH AE P HH AE Z ER D L IY
+hapke HH EY P K IY
+hapless HH AE P L AH S
+haploid HH AE P L OY D
+hapner HH AE P N ER
+hapoalim HH AH P OW L IH M
+hapoalim(2) HH AH P OW AH L IY M
+happ HH AE P
+happe HH AE P
+happel HH AE P AH L
+happen HH AE P AH N
+happened HH AE P AH N D
+happening HH AE P AH N IH NG
+happening(2) HH AE P N IH NG
+happenings HH AE P AH N IH NG Z
+happenings(2) HH AE P N IH NG Z
+happens HH AE P AH N Z
+happenstance HH AE P AH N S T AE N S
+happier HH AE P IY ER
+happiest HH AE P IY AH S T
+happily HH AE P AH L IY
+happiness HH AE P IY N AH S
+happy HH AE P IY
+hapsburg HH AE P S B ER G
+haq HH AE K
+haq's HH AE K S
+haque HH AE K
+har HH AA R
+hara HH EH R AH
+hara-kiri HH AA R IH K IH R IY
+harada HH AA R AA D AH
+haradim HH AH R AE D IH M
+haradim(2) HH AH R AE D IY M
+harahan HH AE R AH HH AE N
+harald HH AA R AH L D
+haralda HH AA R AA L D AH
+haralson HH AE R AH L S AH N
+haran HH AE R AH N
+harangue HH ER AE NG
+harangued HH ER AE NG D
+harangues HH ER AE NG Z
+haranguing HH ER AE NG IH NG
+harare HH ER AA R IY
+harass HH ER AE S
+harassed HH ER AE S T
+harasser HH ER AE S ER
+harassers HH ER AE S ER Z
+harasses HH ER AE S IH Z
+harassing HH ER AE S IH NG
+harassment HH ER AE S M AH N T
+haraszti HH ER AE S T IY
+haraway HH AA R AH W EY
+harb HH AA R B
+harbach HH AA R B AA K
+harbaugh HH AA R B AO
+harbeck HH AA R B EH K
+harber HH AA R B ER
+harbert HH AA R B ER T
+harberts HH AA R B ER T S
+harbeson HH AA R B IH S AH N
+harbin HH AA R B IH N
+harbinger HH AA R B IH N JH ER
+harbingers HH AA R B IH NG ER Z
+harbinson HH AA R B IH N S AH N
+harbison HH AA R B IH S AH N
+harbold HH AA R B OW L D
+harbor HH AA R B ER
+harbor's HH AA R B ER Z
+harbored HH AA R B ER D
+harboring HH AA R B ER IH NG
+harbors HH AA R B ER Z
+harborside HH AA R B ER S AY D
+harbory HH AA R B AH R IY
+harbour HH AA R B ER
+harbuck HH AA R B AH K
+harbury HH AA R B ER IY
+harc HH AA R K
+harclerode HH AA R K AH L ER OW D
+harclerode(2) HH AA R K L ER OW D
+harcourt HH AA R K AO R T
+harcourt's HH AA R K ER T S
+harcrow HH AA R K R OW
+harcum HH AA R K AH M
+hard HH AA R D
+hardacre HH AA R D EY K ER
+hardage HH AA R D IH JH
+hardart HH AA R D AA R T
+hardaway HH AA R D AH W EY
+hardback HH AA R D B AE K
+hardball HH AA R D B AO L
+hardboard HH AA R D B AO R D
+hardcastle HH AA R D K AE S AH L
+hardcastle's HH AA R D K AE S AH L Z
+hardcore HH AA R D K AO R
+hardcover HH AA R D K AH V ER
+hardcovers HH AA R D K AH V ER Z
+hardebeck HH AA R D B EH K
+hardee HH AA R D IY
+hardee's HH AA R D IY Z
+hardegree HH AA R D IH G R IY
+hardeman HH AA R D M AH N
+harden HH AA R D AH N
+harden's HH AA R D AH N Z
+hardenbrook HH AA R D AH N B R UH K
+hardened HH AA R D AH N D
+hardener HH AA R D AH N ER
+hardeners HH AA R D AH N ER Z
+hardening HH AA R D AH N IH NG
+hardening(2) HH AA R D N IH NG
+hardens HH AA R D AH N Z
+harder HH AA R D ER
+harders HH AA R D ER Z
+hardest HH AA R D AH S T
+hardesty HH AA R D AH S T IY
+hardey HH AA R D IY
+hardgood HH AA R D G UH D
+hardgoods HH AA R D G UH D Z
+hardgrave HH AA R D G R EY V
+hardgrove HH AA R D G R OW V
+hardhead HH AA R D HH EH D
+hardheaded HH AA R D HH EH D IH D
+hardick HH AA R D IH K
+hardie HH AA R D IY
+hardier HH AA R D IY ER
+hardiest HH AA R D IY AH S T
+hardigree HH AA R D IH G R IY
+hardiman HH AA R D IH M AH N
+hardimon HH AA R D IH M AA N
+hardin HH AA R D IH N
+harding HH AA R D IH NG
+harding's HH AA R D IH NG S
+hardinger HH AA R D IH NG ER
+hardison HH AA R D IH S AH N
+hardister HH AA R D IH S T ER
+hardisty HH AA R D IH S T IY
+hardline HH AA R D L AY N
+hardliner HH AA R D L AY N ER
+hardliners HH AA R D L AY N ER Z
+hardly HH AA R D L IY
+hardman HH AA R D M AH N
+hardness HH AA R D N AH S
+hardnett HH AA R D N IH T
+hardpressed HH AA R D P R EH S T
+hardrick HH AA R D R IH K
+hards HH AA R D Z
+hardscrabble HH AA R D S K R AE B AH L
+hardship HH AA R D SH IH P
+hardships HH AA R D SH IH P S
+hardt HH AA R T
+hardtke HH AA R D K IY
+hardware HH AA R D W EH R
+hardway HH AA R D W EY
+hardwick HH AA R D W IH K
+hardwicke HH AA R D W IH K
+hardwin HH AA R D W IH N
+hardwood HH AA R D W UH D
+hardwoods HH AA R D W UH D Z
+hardwork HH AA R D W ER K
+hardworking HH AA R D W ER K IH NG
+hardy HH AA R D IY
+hardy's HH AA R D IY Z
+hardymon HH AA R D IY M AA N
+hare HH EH R
+hare's HH EH R Z
+harebrained HH EH R B R EY N D
+harelson HH AE R IH L S AH N
+harem HH EH R AH M
+haren HH EH R AH N
+harer HH EH R ER
+hares HH EH R Z
+harewood HH EH R W UH D
+harff HH AA R F
+harford HH AA R F ER D
+hargadon HH AA R G AA D AO N
+hargan HH AA R G AH N
+hargarten HH AA R G AA R T AH N
+hargens HH AA R G AH N Z
+harger HH AA R G ER
+hargett HH AA R JH IH T
+hargis HH AA R G IH S
+hargrave HH AA R G R EY V
+hargraves HH AA R G R EY V Z
+hargreaves HH AA R G R IY V Z
+hargrove HH AA R G R OW V
+hargus HH AA R G AH S
+hari HH AA R IY
+harig HH AE R IH G
+harima HH EH R IY M AH
+haring HH EH R IH NG
+hariri HH ER IH R IY
+haris HH AA R IY S
+haris(2) HH EH R IH S
+haritos HH EH R IY T OW S
+hariz HH EH R IH Z
+harjo HH AA R JH OW
+harju HH AA R Y UW
+hark HH AA R K
+harkavy HH AA R K AH V IY
+harke HH AA R K
+harken HH AA R K AH N
+harker HH AA R K ER
+harkey HH AA R K IY
+harkin HH AA R K IH N
+harkin's HH AA R K IH N Z
+harking HH AA R K IH NG
+harkins HH AA R K IH N Z
+harkleroad HH AA R K L ER OW D
+harkless HH AA R K L AH S
+harkness HH AA R K N AH S
+harkrader HH AA R K R AH D ER
+harkrider HH AA R K R AY D ER
+harks HH AA R K S
+harl HH AA R L
+harlacher HH AA R L AH K ER
+harlan HH AA R L AH N
+harland HH AA R L AH N D
+harle HH AA R AH L
+harlem HH AA R L AH M
+harlem's HH AA R L AH M Z
+harleman HH AA R AH L M AH N
+harlequin HH AA R L AH K W AH N
+harless HH AA R L IH S
+harley HH AA R L IY
+harley's HH AA R L IY Z
+harleysville HH AA R L IY Z V IH L
+harlin HH AA R L IH N
+harlin's HH AA R L IH N Z
+harling HH AA R L IH NG
+harlingen HH AA R L IH NG AH N
+harlison HH AA R L IH S AH N
+harloff HH AA R L AO F
+harlot HH AA R L AH T
+harlow HH AA R L OW
+harm HH AA R M
+harm's HH AA R M Z
+harman HH AA R M AH N
+harmata HH AA R M AA T AH
+harmattan HH AA R M AH T AE N
+harmed HH AA R M D
+harmel HH AA R M AH L
+harmen HH AA R M AH N
+harmening HH AA R M AH N IH NG
+harmer HH AA R M ER
+harmes HH AA R M Z
+harmetz HH AA R M EH T S
+harmeyer HH AA R M AY ER
+harmful HH AA R M F AH L
+harmfully HH AA R M F AH L IY
+harmfulness HH AA R M F AH L N AH S
+harming HH AA R M IH NG
+harmison HH AA R M IH S AH N
+harmless HH AA R M L AH S
+harmlessly HH AA R M L AH S L IY
+harmon HH AA R M AH N
+harmon's HH AA R M AH N Z
+harmonia HH AA R M OW N IY AH
+harmonic HH AA R M AA N IH K
+harmonica HH AA R M AA N IH K AH
+harmonics HH AA R M AA N IH K S
+harmonie HH AA R M AH N IY
+harmonies HH AA R M AH N IY Z
+harmonious HH AA R M OW N IY AH S
+harmoniously HH AA R M OW N IY AH S L IY
+harmonium HH AA R M OW N IY AH M
+harmonization HH AA R M AH N IH Z EY SH AH N
+harmonize HH AA R M AH N AY Z
+harmonized HH AA R M AH N AY Z D
+harmonizes HH AA R M AH N AY Z IH Z
+harmonizing HH AA R M AH N AY Z IH NG
+harmony HH AA R M AH N IY
+harms HH AA R M Z
+harmsen HH AA R M S AH N
+harn HH AA R N
+harnack HH AA R N AH K
+harnage HH AA R N IH JH
+harnden HH AA R N D AH N
+harne HH AA R N
+harned HH AA R N D
+harner HH AA R N ER
+harness HH AA R N AH S
+harness(2) HH AA R N IH S
+harnessed HH AA R N AH S T
+harnesses HH AA R N AH S AH Z
+harnesses(2) HH AA R N AH S IH Z
+harnessing HH AA R N AH S IH NG
+harnett HH AA R N IH T
+harney HH AA R N IY
+harnisch HH AA R N IH SH
+harnischfeger HH AA R N IH SH F EH G ER
+harnischfeger's HH AA R N IH SH F EH G ER Z
+harnish HH AA R N IH SH
+harnois HH AA R N W AA
+haro HH AA R OW
+harold HH EH R AH L D
+harold's HH EH R AH L D Z
+haroldson HH AE R OW L D S AH N
+harp HH AA R P
+harpe HH AA R P
+harped HH AA R P T
+harpel HH AA R P EH L
+harpenau HH AA R P IH N OW
+harper HH AA R P ER
+harper's HH AA R P ER Z
+harpercollins HH AA R P ER K AO L IH N Z
+harpers HH AA R P ER Z
+harpham HH AA R F AH M
+harpin HH AA R P AE N
+harping HH AA R P IH NG
+harpist HH AA R P IH S T
+harpists HH AA R P IH S T S
+harpists(2) HH AA R P IH S S
+harpists(3) HH AA R P IH S
+harpley HH AA R P L IY
+harpo HH AA R P OW
+harpold HH AA R P OW L D
+harpole HH AA R P OW L
+harpoon HH AA R P UW N
+harpoons HH AA R P UW N Z
+harpootlian HH AA R P UW T L IY AH N
+harps HH AA R P S
+harpsichord HH AA R P S AH K AO R D
+harpst HH AA R P S T
+harpster HH AA R P S T ER
+harquebus HH AA R K W AH B AH S
+harr HH AE R
+harra HH AA R AH
+harrah HH AE R AH
+harrah's HH EH R AH Z
+harral HH AE R AH L
+harralson HH AE R AH L S AH N
+harre HH AE R
+harrel HH AE R AH L
+harreld HH AE R IH L D
+harrell HH EH R AH L
+harrell's HH AE R AH L Z
+harrelson HH EH R IH L S AH N
+harren HH AE R AH N
+harrer HH AA R ER
+harried HH EH R IY D
+harrier HH EH R IY ER
+harries HH EH R IY Z
+harriet HH EH R IY AH T
+harriette HH AE R IY EH T
+harrigan HH EH R IH G AH N
+harriger HH AE R IH G ER
+harrill HH AE R AH L
+harriman HH EH R IH M AH N
+harring HH AE R IH NG
+harrington HH EH R IH NG T AH N
+harriott HH AE R IY AH T
+harris HH EH R IH S
+harris' HH EH R IH S
+harris's HH EH R IH S IH Z
+harrisburg HH AE R IH S B ER G
+harrisburg's HH AE R IH S B ER G Z
+harrisburg's(2) HH EH R IH S B ER G Z
+harrisburg(2) HH EH R IH S B ER G
+harrisburgh HH AE R IH S B ER G
+harrisburgh's HH AE R IH S B ER G Z
+harrisburgh's(2) HH EH R IH S B ER G Z
+harrisburgh(2) HH EH R IH S B ER G
+harrises HH AE R IH S IH Z
+harrison HH EH R IH S AH N
+harrison's HH EH R IH S AH N Z
+harriss HH AE R IH S
+harrity HH AE R IH T IY
+harrod HH EH R AH D
+harrod's HH EH R AH D Z
+harrods HH EH R AH D Z
+harrold HH EH R AH L D
+harron HH AE R AH N
+harrop HH EH R AH P
+harroun HH ER UW N
+harrow HH AE R OW
+harrower HH AE R OW W ER
+harrowing HH EH R OW IH NG
+harry HH EH R IY
+harry's HH EH R IY Z
+harryman HH AE R IY M AH N
+harsch HH AA R SH
+harsco HH AA R S K OW
+harsh HH AA R SH
+harsha HH AA R SH AH
+harsham HH AA R SH AH M
+harshaw HH AA R SH AO
+harshbarger HH AA R SH B AA R G ER
+harshberger HH AA R SH B ER G ER
+harsher HH AA R SH ER
+harshest HH AA R SH AH S T
+harshfield HH AA R SH F IY L D
+harshly HH AA R SH L IY
+harshman HH AA R SH M AH N
+harshness HH AA R SH N AH S
+harstad HH AA R S T AH D
+harston HH AA R S T AH N
+hart HH AA R T
+hart's HH AA R T S
+harte HH AA R T
+hartel HH AA R T AH L
+hartell HH AA R T AH L
+harten HH AA R T AH N
+hartenstein HH AA R T AH N S T AY N
+hartenstein(2) HH AA R T AH N S T IY N
+harter HH AA R T ER
+hartfiel HH AA R T F IY L
+hartfield HH AA R T F IY L D
+hartford HH AA R T F ER D
+hartford's HH AA R T F ER D Z
+hartgraves HH AA R T G R EY V Z
+hartgrove HH AA R T G R OW V
+harth HH AA R TH
+hartig HH AA R T IH G
+hartigan HH AA R T IH G AH N
+hartin HH AA R T IH N
+harting HH AA R T IH NG
+hartinger HH AA R T IH NG ER
+hartis HH AA R T IH S
+hartje HH AA R T JH EY
+hartke HH AA R T K IY
+hartkopf HH AA R T K AO F
+hartl HH AA R T AH L
+hartlage HH AA R T L IH JH
+hartland HH AA R T L AH N D
+hartlaub HH AA R T L AW B
+hartle HH AA R T AH L
+hartless HH AA R T L AH S
+hartley HH AA R T L IY
+hartlieb HH AA R T L IY B
+hartline HH AA R T L AY N
+hartling HH AA R T L IH NG
+hartman HH AA R T M AH N
+hartmann HH AA R T M AH N
+hartmarx HH AA R T M AA R K S
+hartnell HH AA R T N AH L
+hartner HH AA R T N ER
+hartness HH AA R T N AH S
+hartnett HH AA R T N IH T
+hartney HH AA R T N IY
+hartog HH AA R T AH G
+harton HH AA R T AH N
+hartong HH AA R T AO NG
+hartranft HH AA R T R AH N F T
+harts HH AA R T S
+hartsell HH AA R T S AH L
+hartsfield HH AA R T S F IY L D
+hartshorn HH AA R T S HH AO R N
+hartshorne HH AA R CH ER N
+hartsock HH AA R T S AH K
+hartsoe HH AA R T S OW
+hartson HH AA R T S AH N
+hartsook HH AA R T S UH K
+hartsough HH AA R T S AW
+hartstein HH AA R T S T AY N
+hartstein(2) HH AA R T S T IY N
+hartsville HH AA R T S V IH L
+hartt HH AA R T
+hartter HH AA R T ER
+hartung HH AA R T AH NG
+hartwell HH AA R T W EH L
+hartwick HH AA R T W IH K
+hartwig HH AA R T W IH K
+hartwood HH AA R T W UH D
+harty HH AA R T IY
+hartz HH AA R T S
+hartzel HH AA R T Z AH L
+hartzell HH AA R T Z AH L
+hartzler HH AA R T S L ER
+hartzog HH AA R T Z AH G
+haruo HH AA R UW OW
+harv HH AA R V
+harvard HH AA R V ER D
+harvard's HH AA R V ER D Z
+harvath HH AA R V AH TH
+harve HH AA R V
+harvel HH AA R V AH L
+harvell HH AA R V AH L
+harvest HH AA R V AH S T
+harvestable HH AA R V AH S T AH B AH L
+harvested HH AA R V AH S T AH D
+harvested(2) HH AA R V AH S T IH D
+harvester HH AA R V AH S T ER
+harvesters HH AA R V AH S T ER Z
+harvesting HH AA R V AH S T IH NG
+harvests HH AA R V AH S T S
+harvests(2) HH AA R V AH S S
+harvests(3) HH AA R V AH S
+harvey HH AA R V IY
+harvey's HH AA R V IY Z
+harvie HH AA R V IY
+harvill HH AA R V IH L
+harville HH AA R V IH L
+harvin HH AA R V IH N
+harvison HH AA R V IH S AH N
+harward HH AA R W ER D
+harwell HH AA R W EH L
+harwick HH AA R W IH K
+harwood HH AA R W UH D
+haryana HH EH R Y AA N AH
+has HH AE Z
+has(2) HH AH Z
+has-been HH AE Z B IH N
+has-beens HH AE Z B IH N Z
+hasan HH EY Z AH N
+hasbro HH AE Z B R OW
+hasbro's HH AE Z B R OW Z
+hasbrook HH AE S B R UH K
+hasbrouck HH AE Z B R UH K
+hascall HH AE S K AH L
+hasch HH AE SH
+haschke HH AE SH K
+hase HH EY Z
+hasegawa HH AA S EY G AA W AH
+hasek HH AA S EH K
+haselden HH AE S IH L D AH N
+haseley HH AE S IH L IY
+haselhorst HH AE S IH L HH AO R S T
+haseltine HH AE S IH L T IY N
+haselton HH AH S EH L T AH N
+haseman HH EY S M AH N
+hasenauer HH AE S IH N AW ER
+hasenfus HH EY Z AH N F AH S
+haser HH EH Z ER
+hash HH AE SH
+hashagen HH AE SH AH G AH N
+hashed HH AE SH T
+hashem HH AE SH IH M
+hashemi HH AH SH EY M IY
+hashemite HH AE SH AH M AY T
+hasher HH AE SH ER
+hasher's HH AE SH ER Z
+hashers HH AE SH ER Z
+hashes HH AE SH AH Z
+hashi HH AE SH IY
+hashim HH AE SH IH M
+hashimoto HH AA SH IY M OW T OW
+hashing HH AE SH IH NG
+hashish HH AE SH IH SH
+hashish(2) HH AH SH IY SH
+hashman HH AE SH M AH N
+hashmark HH AE SH M AA R K
+hashmi HH AE SH M IY
+hashmi(2) HH AA SH M IY
+hasidic HH AH S IH D IH K
+hasidic(2) HH AH S IY D IH K
+hasidim HH AH S IH D IH M
+hasidim(2) HH AH S IY D IH M
+haske HH EY S K
+haskell HH AE S K AH L
+haskett HH AE S K IH T
+haskew HH AE S K Y UW
+haskin HH AE S K IH N
+haskins HH AE S K IH N Z
+haslam HH AE S L AH M
+hasler HH AE S AH L ER
+hasler(2) HH AE S L ER
+haslett HH AE S L IH T
+hasley HH AE Z L IY
+hasman HH AE S M AH N
+hasn't HH AE Z AH N T
+haso HH AA S OW
+haso's HH AA S OW Z
+haspel HH AE S P AH L
+hass HH AE S
+hassan HH AH S AA N
+hasse HH AA S
+hassebrock HH AE S IH B R AA K
+hassel HH AE S AH L
+hasselbach HH AE S IH L B AA K
+hasselbring HH AE S IH L B R IH NG
+hassell HH AE S AH L
+hasselman HH AE S AH L M AH N
+hassen HH AE S AH N
+hassenberg HH AE S AH N B ER G
+hassenfeld HH AE S AH N F EH L D
+hassett HH AE S IH T
+hassey HH AE S IY
+hassig HH AE S IH G
+hassing HH AE S IH NG
+hassinger HH AE S IH N JH ER
+hassle HH AE S AH L
+hassled HH AE S AH L D
+hassler HH AE S L ER
+hassles HH AE S AH L Z
+hassling HH AE S AH L IH NG
+hassling(2) HH AE S L IH NG
+hassman HH AE S M AH N
+hasson HH AE S AH N
+hast HH AE S T
+hasta HH AE S T AH
+hasta(2) AA S T AH
+haste HH EY S T
+hasten HH EY S AH N
+hastened HH EY S AH N D
+hastening HH EY S AH N IH NG
+hastening(2) HH EY S N IH NG
+hastens HH EY S AH N Z
+hastert HH AE S T ER T
+hastey HH EY S T IY
+hastie HH EY S T IY
+hastily HH EY S T AH L IY
+hasting HH EY S T IH NG
+hastings HH EY S T IH NG Z
+haston HH AE S T AH N
+hasty HH EY S T IY
+haswell HH AE S W EH L
+hasz HH AA SH
+hat HH AE T
+hat's HH AE T S
+hata HH AA T AH
+hatala HH AE T AH L AH
+hataway HH AE T AH W EY
+hatch HH AE CH
+hatch's HH AE CH IH Z
+hatchback HH AE CH B AE K
+hatched HH AE CH T
+hatchel HH AE CH AH L
+hatchell HH AE CH AH L
+hatcher HH AE CH ER
+hatcheries HH AE CH ER IY Z
+hatchery HH AE CH ER IY
+hatches HH AE CH IH Z
+hatchet HH AE CH AH T
+hatchets HH AE CH AH T S
+hatchett HH AE CH IH T
+hatching HH AE CH IH NG
+hate HH EY T
+hated HH EY T AH D
+hated(2) HH EY T IH D
+hateful HH EY T F AH L
+hatem HH AE T IH M
+hater HH EY T ER
+haters HH EY T ER Z
+hates HH EY T S
+hatfield HH AE T F IY L D
+hatfield's HH AE T F IY L D Z
+hath HH AE TH
+hathaway HH AE TH AH W EY
+hathaway's HH AE TH AH W EY Z
+hathcoat HH AE TH K OW T
+hathcock HH AE TH K AH K
+hatheway HH EY DH W EY
+hathorn HH AA TH AO R N
+hathorne HH AE TH ER N
+hating HH EY T IH NG
+hatler HH EY T AH L ER
+hatler(2) HH EY T L ER
+hatlestad HH AE T AH L S T AH D
+hatley HH AE T L IY
+hatmaker HH AE T M EY K ER
+haton HH AE T AO N
+haton(2) AE T AO N
+hatred HH EY T R AH D
+hatreds HH EY T R AH D Z
+hatrick HH AE T R IH K
+hats HH AE T S
+hatt HH AE T
+hattabaugh HH AE T AH B AO
+hattan HH AE T AH N
+hattaway HH AE T AH W EY
+hatten HH AE T AH N
+hattendorf HH AE T IH N D AO R F
+hatter HH AE T ER
+hatteras HH AE T ER AH S
+hattersley HH AE T ER Z L IY
+hattery HH AE T ER IY
+hattie HH AE T IY
+hatton HH AE T AH N
+hattori HH AA T AO R IY
+hattusas HH AH T UW S AH S
+hatty HH AE T IY
+hatz HH AE T S
+hau HH AW
+haub HH AO B
+hauber HH AW B ER
+haubert HH AW B ER T
+haubner HH AW B N ER
+haubrich HH AW B R IH K
+hauch HH AO CH
+hauck HH AO K
+hauenstein HH AW AH N S T AY N
+hauenstein(2) HH AW AH N S T IY N
+hauer HH AW ER
+haueter HH AW T ER
+hauf HH AO F
+haufer HH AO F ER
+hauff HH AO F
+haug HH AO G
+haugan HH AO G AH N
+hauge HH AO JH
+haugen HH AW G AH N
+hauger HH AW G ER
+haugh HH AO
+haughey HH AO K IY
+haughn HH AO N
+haught HH AO T
+haughtily HH AO T IH L IY
+haughton HH AO T AH N
+haughty HH AO T IY
+haugland HH AO G L AH N D
+hauk HH AO K
+hauke HH AO K
+haul HH AO L
+hauled HH AO L D
+hauler HH AO L ER
+haulers HH AO L ER Z
+hauling HH AO L IH NG
+hauls HH AO L Z
+haulsey HH AO L S IY
+haun HH AO N
+haunt HH AO N T
+haunted HH AO N T AH D
+haunted(2) HH AO N T IH D
+haunting HH AO N T IH NG
+hauntingly HH AO N T IH NG L IY
+haunts HH AO N T S
+haupert HH AW P ER T
+hauppauge HH AW P AO JH
+haupt HH AO P T
+hauptfuhrer HH AW P T F Y UH R ER
+hauptman HH AW P T M AH N
+hauptmann HH AW P T M AH N
+haury HH AO R IY
+haus HH AW S
+hausa HH AW S AH
+hausauer HH AW S AW ER
+hausch HH AW SH
+hauschild HH AW S CH AY L D
+hauschildt HH AW SH IH L T
+hause HH AW S
+hausen HH AW Z AH N
+hauser HH AW Z ER
+hauserman HH AW Z ER M AH N
+hausfeld HH AW S F EH L D
+hausky HH AO S K IY
+hausler HH AW S AH L ER
+hausler(2) HH AW S L ER
+hausman HH AW S M AH N
+hausmann HH AW S M AH N
+hausner HH AW S N ER
+hauss HH AW S
+hausser HH AW S ER
+haussler HH AW S AH L ER
+haussler(2) HH AW S L ER
+haussmann HH AW S M AH N
+hausummi HH AW S UW M IY
+hauswirth HH AW S W ER TH
+haut HH AO T
+hautala HH AO T AH L AH
+haute HH OW T
+haute(2) HH AH T
+hauter HH AW T ER
+hauth HH AO TH
+hauver HH AW V ER
+havana HH AH V AE N AH
+havana's HH AH V AE N AH Z
+havard HH AE V ER D
+havas HH AA V AA Z
+have HH AE V
+havel HH AE V AH L
+havelka HH AH V EH L K AH
+havelock HH AE V L AA K
+haveman HH EY V M AH N
+havemann HH AE V AH M AH N
+haven HH EY V AH N
+haven't HH AE V AH N T
+haven't(2) HH AE V AH N
+havener HH AE V IY N ER
+havens HH EY V AH N Z
+haver HH EH V ER
+haverfield HH AE V ER F IY L D
+haverford HH AE V ER F ER D
+haverkamp HH AE V ER K AE M P
+haverland HH AE V ER L AH N D
+haverly HH EY V ER L IY
+haverstick HH EY V ER S T IH K
+haverstock HH EY V ER S T AA K
+haverty HH AE V ER T IY
+haves HH AE V Z
+havey HH EY V IY
+havier HH AE V Y ER
+haviland HH EY V IY L AH N D
+havill HH AA V IY L
+havilland HH AE V AH L AH N D
+havin' HH AE V IH N
+having HH AE V IH NG
+havington HH AE V IH NG T AH N
+havington's HH AE V IH NG T AH N Z
+havins HH AE V IH N Z
+havis HH AE V IH S
+havlicek HH AA V L IH CH EH K
+havlik HH AE V L IH K
+havlin HH AE V L IH N
+havner HH AE V N ER
+havoc HH AE V AH K
+havran HH AE V R AH N
+havranek HH AH V R AE N EH K
+havrilla HH AE V R IH L AH
+havron HH AE V R AH N
+haw HH AO
+hawaii HH AH W AY IY
+hawaii's HH AH W AY IY Z
+hawaiian HH AH W AY AH N
+hawaiians HH AH W AY AH N Z
+hawass HH AE W AA S
+hawbaker HH AO B EY K ER
+hawe HH AO
+hawes HH AO Z
+hawing HH AO IH NG
+hawk HH AO K
+hawkbill HH AO K B IH L
+hawkbill's HH AO K B IH L Z
+hawke HH AO K
+hawke's HH AO K S
+hawked HH AO K T
+hawken HH AO K AH N
+hawker HH AO K ER
+hawkers HH AO K ER Z
+hawkes HH AO K S
+hawkey HH AO K IY
+hawkeye HH AO K AY
+hawkeye's HH AO K AY Z
+hawkiness HH AO K N AH S
+hawking HH AO K IH NG
+hawkins HH AO K IH N Z
+hawkins' HH AO K IH N Z
+hawkinson HH AO K IH N S AH N
+hawkish HH AO K IH SH
+hawks HH AO K S
+hawksley HH AO K S L IY
+hawley HH AO L IY
+hawley's HH AO L IY Z
+hawn HH AO N
+haworth HH AE W ER TH
+haws HH AO Z
+hawthorn HH AO TH AO R N
+hawthorne HH AO TH AO R N
+hawthorne's HH AO TH AO R N Z
+hawthorns HH AO TH AO R N Z
+hawver HH AO V ER
+haxton HH AE K S T AH N
+hay HH EY
+hayashi HH AA Y AA SH IY
+hayashida HH AA Y AA SH IY D AH
+haycock HH EY K AA K
+haycraft HH EY K R AE F T
+haydel HH EY D AH L
+hayden HH EY D AH N
+haydn HH AY D AH N
+haydn's HH AY D AH N Z
+haydock HH EY D AA K
+haydon HH EY D AH N
+haydu HH EY D UW
+hayduk HH EY D AH K
+haye HH EY
+hayek HH EY IH K
+hayen HH EY AH N
+hayenga HH EY EY NG G AH
+hayer HH EY ER
+hayes HH EY Z
+hayfield HH EY F IY L D
+hayfields HH EY F IY L D Z
+hayford HH EY F ER D
+haygood HH EY G UH D
+hayhurst HH EY HH ER S T
+haying HH EY IH NG
+hayles HH EY L Z
+hayley HH EY L IY
+hayloft HH EY L AO F T
+haylofts HH EY L AO F T S
+haymaker HH EY M EY K ER
+haymakers HH EY M EY K ER Z
+hayman HH EY M AH N
+haymarket HH EY M AA R K IH T
+haymarkets HH EY M AA R K IH T S
+haymes HH EY M Z
+haymon HH EY M AH N
+haymond HH EY M AH N D
+haymore HH EY M AO R
+hayn HH EY N
+hayne HH EY N
+hayner HH EY N ER
+haynes HH EY N Z
+haynesworth HH EY N Z W ER TH
+haynie HH EY N IY
+haynsworth HH EY N Z W ER TH
+hays HH EY Z
+hayse HH EY Z
+hayslett HH EY S L IH T
+hayslip HH EY S L IH P
+haystack HH EY S T AE K
+haystacks HH EY S T AE K S
+hayter HH EY T ER
+hayton HH EY T AH N
+hayward HH EY W ER D
+hayward's HH EY W ER D Z
+haywire HH EY W AY R
+haywood HH EY W UH D
+hayworth HH EY W ER TH
+hazan HH EY Z AH N
+hazard HH AE Z ER D
+hazardous HH AE Z ER D AH S
+hazards HH AE Z ER D Z
+haze HH EY Z
+hazel HH EY Z AH L
+hazelbaker HH EY Z AH L B EY K ER
+hazelett HH AE Z IH L EH T
+hazelett(2) HH AE Z L EH T
+hazelip HH AE Z IH L IH P
+hazell HH AE Z AH L
+hazelnut HH EY Z AH L N AH T
+hazelnuts HH EY Z AH L N AH T S
+hazelrigg HH AH Z EH L R IH G
+hazelrigg(2) HH EY Z EH L R IH G
+hazeltine HH EY Z AH L T AY N
+hazelton HH EY Z AH L T AH N
+hazelwood HH EY Z AH L W UH D
+hazelwood's HH EY Z AH L W UH D Z
+hazen HH EY Z AH N
+hazier HH EY Z IY ER
+hazing HH EY Z IH NG
+hazle HH EY Z AH L
+hazleton HH EY Z AH L T AH N
+hazlett HH AE Z L IH T
+hazlewood HH EY Z AH L W UH D
+hazy HH EY Z IY
+hazzard HH AE Z ER D
+hbox EY CH B AO K S
+hces EY CH S IY IY EH S
+he HH IY
+he'd HH IY D
+he'll HH IY L
+he's HH IY Z
+heaberlin HH IY B ER L IH N
+heacock HH IY K AH K
+heacox HH IY K AA K S
+head HH EH D
+head's HH EH D Z
+headache HH EH D EY K
+headaches HH EH D EY K S
+headband HH EH D B AE N D
+headbands HH EH D B AE N D Z
+headboard HH EH D B AO R D
+headboards HH EH D B AO R D Z
+headcheese HH EH D CH IY Z
+headcount HH EH D K AW N T
+headcounts HH EH D K AW N T S
+headdress HH EH D R EH S
+headdresses HH EH D D R EH S AH Z
+headed HH EH D AH D
+headed(2) HH EH D IH D
+headen HH EH D AH N
+header HH EH D ER
+headers HH EH D ER Z
+headfirst HH EH D F ER S T
+headgear HH EH D G IH R
+headhunter HH EH D HH AH N T ER
+headhunters HH EH D HH AH N T ER Z
+heading HH EH D IH NG
+headings HH EH D IH NG Z
+headington HH EH D IH NG T AH N
+headlee HH EH D L IY
+headless HH EH D L AH S
+headley HH EH D L IY
+headlight HH EH D L AY T
+headlights HH EH D L AY T S
+headline HH EH D L AY N
+headlined HH EH D L AY N D
+headliner HH EH D L AY N ER
+headliners HH EH D L AY N ER Z
+headlines HH EH D L AY N Z
+headlining HH EH D L AY N IH NG
+headlong HH EH D L AO NG
+headlund HH EH D L AH N D
+headman HH EH D M AH N
+headmaster HH EH D M AE S T ER
+headmasters HH EH D M AE S T ER Z
+headmistress HH EH D M IH S T R AH S
+headmistresses HH EH D M IH S T R AH S AH Z
+headphone HH EH D F OW N
+headphones HH EH D F OW N Z
+headquarter HH EH D K W AO R T ER
+headquarter(2) HH EH D K AO R T ER
+headquartered HH EH D K AO R T ER D
+headquartered(2) HH EH D K W AO R T ER D
+headquarters HH EH D K W AO R T ER Z
+headquarters(2) HH EH D K AO R T ER Z
+headrest HH EH D R EH S T
+headrests HH EH D R EH S T S
+headrests(2) HH EH D R EH S S
+headrests(3) HH EH D R EH S
+headrick HH EH D R IH K
+headroom HH EH D R UW M
+heads HH EH D Z
+headset HH EH D S EH T
+headsets HH EH D S EH T S
+headship HH EH D SH IH P
+headsman HH EH D Z M AH N
+headstart HH EH D S T AA R T
+headstarts HH EH D S T AA R T S
+headstone HH EH D S T OW N
+headstones HH EH D S T OW N Z
+headstrong HH EH D S T R AO NG
+headwater HH EH D W AO T ER
+headwaters HH EH D W AO T ER Z
+headway HH EH D W EY
+headwind HH EH D W IH N D
+headwinds HH EH D W IH N D Z
+heady HH EH D IY
+heafner HH IY F N ER
+heagle HH IY G AH L
+heagney HH IY G N IY
+heagy HH IY JH IY
+heal HH IY L
+heald HH IY L D
+healed HH IY L D
+healer HH IY L ER
+healers HH IY L ER Z
+healey HH IY L IY
+healing HH IY L IH NG
+heals HH IY L Z
+health HH EH L TH
+health's HH EH L TH S
+healthamerica HH IY L TH AH M EH R IH K AH
+healthcare HH EH L TH K EH R
+healthcare's HH EH L TH K EH R Z
+healthcorp HH EH L TH K AO R P
+healthcorp(2) HH EH L TH K AO R
+healthdyne HH EH L TH D AY N
+healthful HH EH L TH F AH L
+healthier HH EH L TH IY ER
+healthiest HH EH L TH IY IH S T
+healthiness HH EH L TH IY N AH S
+healthsource HH EH L TH S AO R S
+healthsouth HH EH L TH S AW TH
+healthtrust HH EH L TH T R AH S T
+healthtrust's HH EH L TH T R AH S T S
+healthvest HH EH L TH V EH S T
+healthweek HH EH L TH W IY K
+healthwork HH EH L TH W ER K
+healthworks HH EH L TH W ER K S
+healthy HH EH L TH IY
+healy HH IY L IY
+healy's HH IY L IY Z
+heaney HH IY N IY
+heap HH IY P
+heape HH IY P
+heaped HH IY P T
+heaphy HH IY F IY
+heaping HH IY P IH NG
+heaps HH IY P S
+hear HH IY R
+heard HH ER D
+hearer HH IY R ER
+hearers HH IY R ER Z
+hearin HH IH R IH N
+hearing HH IY R IH NG
+hearing's HH IY R IH NG Z
+hearings HH IY R IH NG Z
+hearkens HH AA R K AH N Z
+hearl HH ER L
+hearn HH ER N
+hearne HH ER N
+hearns HH ER N Z
+hearon HH IH R AH N
+hearron HH AO R AH N
+hears HH IY R Z
+hearsay HH IY R S EY
+hearse HH ER S
+hearst HH ER S T
+hearst's HH ER S T S
+heart HH AA R T
+heart's HH AA R T S
+heartache HH AA R T EY K
+heartbeat HH AA R T B IY T
+heartbeats HH AA R T B IY T S
+heartbreak HH AA R T B R EY K
+heartbreaking HH AA R T B R EY K IH NG
+heartbreaks HH AA R T B R EY K S
+heartbroken HH AA R T B R OW K AH N
+heartburn HH AA R T B ER N
+hearted HH AA R T AH D
+hearted(2) HH AA R T IH D
+heartedly HH AA R T IH D L IY
+hearten HH AA R T AH N
+heartened HH AA R T AH N D
+heartening HH AA R T AH N IH NG
+heartening(2) HH AA R T N IH NG
+heartfelt HH AA R T F EH L T
+hearth HH AA R TH
+hearths HH AA R TH S
+heartier HH AA R T IY ER
+heartiest HH AA R T IY AH S T
+heartily HH AA R T AH L IY
+heartland HH AA R T L AE N D
+heartless HH AA R T L AH S
+hearts HH AA R T S
+heartscan HH AA R T S K AE N
+heartthrob HH AA R T TH R AA B
+heartthrobs HH AA R T TH R AA B Z
+heartwarming HH AA R T W AO R M IH NG
+heartwise HH AA R T W AY Z
+heartwood HH AA R T W UH D
+hearty HH AA R T IY
+heasley HH IY Z L IY
+heaslip HH IY S L IH P
+heaston HH IY S T AH N
+heat HH IY T
+heat's HH IY T S
+heated HH IY T AH D
+heated(2) HH IY T IH D
+heatedly HH IY T IH D L IY
+heater HH IY T ER
+heaters HH IY T ER Z
+heath HH IY TH
+heath's HH IY TH S
+heathcliff HH EH TH K L IH F
+heathcock HH EH TH K AH K
+heathcote HH EH TH K AH T
+heathen HH IY DH AH N
+heather HH EH DH ER
+heather's HH EH DH ER Z
+heatherington HH EH DH ER IH NG T AH N
+heatherly HH EH DH ER L IY
+heathers HH EH DH ER Z
+heathman HH IY TH M AH N
+heathrow HH IY TH R OW
+heathrow's HH IY TH R OW Z
+heathwood HH IY TH W UH D
+heating HH IY T IH NG
+heatley HH IY T L IY
+heaton HH IY T AH N
+heats HH IY T S
+heatwole HH IY T W OW L
+heave HH IY V
+heaved HH IY V D
+heaven HH EH V AH N
+heaven's HH EH V AH N Z
+heavener HH EH V AH N ER
+heavenly HH EH V AH N L IY
+heavens HH EH V AH N Z
+heaves HH IY V Z
+heavey HH IY V IY
+heavier HH EH V IY ER
+heavies HH EH V IY Z
+heaviest HH EH V IY AH S T
+heavily HH EH V AH L IY
+heavin HH EH V IH N
+heaving HH IY V IH NG
+heavner HH IY V N ER
+heavrin HH IY V R IH N
+heavy HH EH V IY
+heavyhanded HH EH V IY HH AE N D IH D
+heavyset HH EH V IY S EH T
+heavyweight HH EH V IY W EY T
+heavyweights HH EH V IY W EY T S
+hebard HH EH B ER D
+hebb HH EH B
+hebda HH EH B D AH
+hebding HH EH B D IH NG
+hebe HH IY B
+hebei HH IY B IY
+hebel HH EH B AH L
+hebeler HH EH B AH L ER
+hebenstreit HH EH B IH N S T R AY T
+heber HH IY B ER
+heberer HH EH B ER ER
+heberle HH EH B ER AH L
+heberlein HH EH B ER L AY N
+heberling HH EH B ER L IH NG
+hebert HH EH B ER T
+hebner HH EH B N ER
+hebrew HH IY B R UW
+hebrides HH EH B R IH D IY Z
+hebron HH EH B R AH N
+hebron(2) HH EH B R AO N
+hecco HH EH K OW
+hechinger HH EH K IH N JH ER
+hechler HH EH K L ER
+hecht HH EH K T
+hecht's HH EH K T S
+hechtman HH EH K T M AH N
+heck HH EH K
+heck's HH EH K S
+heckaman HH EH K AH M AH N
+heckard HH EH K ER D
+heckart HH EH K ER T
+heckathorn HH EH K AH TH ER N
+heckbert HH EH K B ER T
+heckel HH EH K AH L
+heckendorn HH EH K EH N D AO R N
+hecker HH EH K ER
+heckert HH EH K ER T
+heckle HH EH K AH L
+heckled HH EH K AH L D
+heckler HH EH K L ER
+hecklers HH EH K L ER Z
+heckling HH EH K L IH NG
+heckman HH EH K M AH N
+heckmann HH EH K M AH N
+heckuva HH EH K Y UW V AH
+heckuva(2) HH EH K AH V AH
+hecla HH EH K L AH
+hecla's HH EH K L AH Z
+hecox HH EH K AA K S
+hectare HH EH K T AA R
+hectares HH EH K T AA R Z
+hectic HH EH K T IH K
+hectograph HH EH K T AH G R AE F
+hector HH EH K T ER
+hector's HH EH K T ER Z
+hectoring HH EH K T ER IH NG
+hecuba HH EH K Y AH B AH
+hecuba(2) HH EH K Y UW B AH
+heda HH EY D AH
+hedberg HH EH D B ER G
+hedda HH EH D AH
+hedden HH EH D AH N
+hedding HH EH D IH NG
+heddy HH EH D IY
+hedeen HH EH D IY N
+hedge HH EH JH
+hedgecock HH EH JH K AA K
+hedged HH EH JH D
+hedgehog HH EH JH HH AA G
+hedgehogs HH EH JH HH AA G Z
+hedgepath HH EH JH P AE TH
+hedgepeth HH EH JH IH P EH TH
+hedger HH EH JH ER
+hedgers HH EH JH ER Z
+hedges HH EH JH IH Z
+hedging HH EH JH IH NG
+hedglin HH EH JH L IH N
+hedgpeth HH EH JH P IH TH
+hedi HH EH D IY
+hediger HH EH D IH G ER
+hedin HH EH D IH N
+hedinger HH EH D IH N G ER
+hedinger(2) HH EH D IH N JH ER
+hedley HH EH D L IY
+hedlund HH EH D L AH N D
+hedman HH EH D M AH N
+hedonic HH AH D AA N IH K
+hedonism HH IY D AH N IH Z AH M
+hedonistic HH IY D AH N IH S T IH K
+hedquist HH EH D K W IH S T
+hedrich HH EH D R IH K
+hedrick HH EH D R IH K
+hedstrom HH EH D S T R AH M
+hedtke HH EH D K IY
+hedwig HH EH D W IH G
+hedwiga HH EH D W IH G AH
+hedy HH IY D IY
+hee HH IY
+heeb HH IY B
+heebner HH IY B N ER
+heed HH IY D
+heeded HH IY D AH D
+heeded(2) HH IY D IH D
+heeding HH IY D IH NG
+heeds HH IY D Z
+heefner HH IY F N ER
+heeg HH IY G
+heeke HH IY K
+heekin HH IY K IH N
+heel HH IY L
+heelan HH IY L AH N
+heeled HH IY L D
+heeling HH IY L IH NG
+heels HH IY L Z
+heemstra HH IY M S T R AH
+heenan HH IY N AH N
+heeney HH IY N IY
+heer HH IY ER
+heeren HH IH R AH N
+heermann HH IH R M AH N
+hees HH IY Z
+heesch HH IY SH
+heese HH IY Z
+heeter HH IY T ER
+hefei HH AH F EY
+heffel HH EH F AH L
+heffelfinger HH EH F IH L F IH NG ER
+hefferan HH EH F ER AH N
+hefferman HH EH F ER M AH N
+heffern HH EH F ER N
+heffernan HH EH F ER N AH N
+hefferon HH EH F ER AH N
+heffington HH EH F IH NG T AH N
+heffler HH EH F L ER
+heffley HH EH F L IY
+heffner HH EH F N ER
+heffron HH EH F R AH N
+hefler HH EH F L ER
+hefley HH EH F L IY
+heflin HH EH F L IH N
+hefner HH EH F N ER
+hefner's HH EH F N ER Z
+heft HH EH F T
+hefter HH EH F T ER
+hefti HH EH F T IY
+heftier HH EH F T IY ER
+heftiest HH EH F T IY AH S T
+hefty HH EH F T IY
+hegadorn HH EH G AH D AO R N
+hegarty HH EH G AA R T IY
+hege HH IY JH
+hegedus HH EH G IH D IH S
+hegel HH EH G AH L
+hegelian HH IY JH IY L IY AH N
+hegeman HH IY G M AH N
+hegemonic HH EH G AH M AA N IH K
+hegemony HH IY JH EH M AH N IY
+hegenna HH EH G EH N AH
+heger HH IY G ER
+hegg HH EH G
+hegge HH EH G
+heggen HH EH G AH N
+heggie HH EH G IY
+hegland HH EH G L AH N D
+hegler HH EH G L ER
+heglund HH EH G L AH N D
+hegna HH EH G N AH
+hegner HH EH G N ER
+hegstrom HH EH G S T R AH M
+hegwood HH EH G W UH D
+hegyi HH EY G Y IY
+heh HH EH
+hehir HH EH HH IH R
+hehl HH EH L
+hehman HH EH M AH N
+hehmeyer HH EH M AY R
+hehn HH EH N
+hehr HH EH R
+heibel HH AY B AH L
+heiberg HH AY B ER G
+heiberger HH AY B ER G ER
+heichel HH AY K AH L
+heichelbech HH AY K IH L B IH K
+heick HH AY K
+heico HH AY K OW
+heico's HH AY K OW Z
+heid HH AY D
+heidbreder HH AY D B R IH D ER
+heidbrink HH AY D B R IH NG K
+heide HH AY D
+heidecker HH AY D IH K ER
+heidel HH AY D AH L
+heidelberg HH AY D AH L B ER G
+heidelberg's HH AY D AH L B ER G Z
+heidelberger HH AY D AH L B ER G ER
+heideman HH AY D M AH N
+heidemann HH AY D M AH N
+heiden HH AY D AH N
+heidenreich HH AY D IH N R AY K
+heider HH AY D ER
+heidi HH AY D IY
+heidi's HH AY D IY S
+heidinger HH AY D IH NG ER
+heidiwear HH AY D IY W EH R
+heidler HH AY D AH L ER
+heidler(2) HH AY D L ER
+heidorn HH AY D ER N
+heidrich HH AY D R IH K
+heidrick HH AY D R IH K
+heidstra HH AY D S T R AH
+heidt HH AY D T
+heier HH AY ER
+heifer HH AY F ER
+heifer(2) HH EH F ER
+heifers HH EH F ER Z
+heifers(2) HH AY F ER Z
+heifetz HH AY F IH T S
+heifner HH IY F N ER
+heiges HH AY JH IH Z
+height HH AY T
+heighten HH AY T AH N
+heightened HH AY T AH N D
+heightening HH AY T AH N IH NG
+heightening(2) HH AY T N IH NG
+heightens HH AY T AH N Z
+heighth HH AY TH
+heights HH AY T S
+heigl HH AY G AH L
+heiken HH AY K AH N
+heikes HH AY K AH Z
+heikkila HH AY K IH L AH
+heikkinen HH AY K IH N AH N
+heiko HH AY K OW
+heiko(2) HH EY K OW
+heil HH AY L
+heiland HH AY L AH N D
+heilbrun HH AY L B R AH N
+heileman HH AY L M AH N
+heileman's HH AY L M AH N Z
+heiler HH AY L ER
+heilig HH AY L IH G
+heilman HH AY L M AH N
+heilmann HH AY L M AH N
+heim HH AY M
+heiman HH AY M AH N
+heimann HH AY M AH N
+heimbach HH AY M B AA K
+heimberger HH AY M B ER G ER
+heimbigner HH AY M B AY G N ER
+heimbuch HH AY M B AH K
+heimburger HH AY M B ER G ER
+heimer HH AY M ER
+heimerl HH AY M ER L
+heimlich HH AY M L IH K
+heims HH AY M Z
+heimsoth HH AY M S AH TH
+hein HH AY N
+heinbach HH AY N B AA K
+heinbaugh HH AY N B AW
+heinburger HH AY N B ER G ER
+heindel HH AY N D AH L
+heindl HH AY N D AH L
+heine HH AY N
+heinecke HH AY N IH K
+heineken HH AY N AH K AH N
+heineman HH AY N M AH N
+heinemann HH AY N M AH N
+heinen HH AY N AH N
+heiner HH AY N ER
+heines HH AY N Z
+heiney HH AY N IY
+heini HH AY N IY
+heinicke HH AY N IH K
+heinig HH AY N IH G
+heininger HH AY N IH NG ER
+heinisch HH AY N IH SH
+heinke HH AY NG K
+heinkel HH AY NG K AH L
+heinl HH AY N AH L
+heinle HH AY N AH L
+heinlein HH AY N L AY N
+heinlen HH AY N AH L AH N
+heinly HH AY N L IY
+heino HH AY N OW
+heinold HH AY N OW L D
+heinonen HH AY N AH N AH N
+heinous HH EY N AH S
+heinrich HH AY N R IH K
+heinrichs HH AY N R IH K S
+heins HH AY N Z
+heinsohn HH AY N S AH N
+heintz HH AY N T S
+heintze HH AY N T S
+heintzelman HH AY N T Z AH L M AH N
+heintzman HH AY N T S M AH N
+heiny HH AY N IY
+heinz HH AY N Z
+heinz's HH AY N Z IH Z
+heinze HH AY N Z
+heinzel HH AY N Z AH L
+heinzelman HH AY N Z AH L M AH N
+heinzen HH AY N Z AH N
+heinzman HH AY N Z M AH N
+heinzmann HH AY N Z M AH N
+heiple HH AY P AH L
+heir EH R
+heiress EH R AH S
+heiresses EH R AH S IH Z
+heirloom EH R L UW M
+heirlooms EH R L UW M Z
+heironimus EH R AA N IH M UW S
+heironimus(2) HH AY R AA N IH M AH S
+heirs EH R Z
+heisbourg HH AY S B AO R G
+heise HH AY S
+heisel HH AY S AH L
+heiser HH AY S ER
+heiserman HH AY S ER M AH N
+heisey HH AY S IY
+heishman HH IY IH SH M AH N
+heisinger HH AY S IH N JH ER
+heiskell HH AY S K AH L
+heisler HH AY S AH L ER
+heisler(2) HH AY S L ER
+heisman HH AY S M AH N
+heisman's HH AY S M AH N Z
+heisner HH AY S N ER
+heiss HH AY S
+heist HH AY S T
+heistand HH AY S T AH N D
+heister HH AY S T ER
+heit HH AY T
+heitkamp HH AY T K AE M P
+heitman HH AY T M AH N
+heitmann HH AY T M AH N
+heitmeyer HH AY T M AY ER
+heitner HH AY T N ER
+heitz HH AY T S
+heitzenrater HH AY T Z IH N R EY T ER
+heitzman HH AY T S M AH N
+heiwa HH AY W AH
+heizer HH AY Z ER
+hejl HH EH JH L
+hejna HH EH JH N AH
+hekker HH EH K ER
+hekmatyar HH EH K M AH T Y AA R
+hekmatyar's HH EH K M AH T Y AA R Z
+helaba HH EH L AA B AH
+helander HH EH L AH N D ER
+helane HH AH L EY N
+helber HH EH L B ER
+helberg HH EH L B ER G
+helbert HH EH L B ER T
+helbig HH EH L B IH G
+helbing HH EH L B IH NG
+helbling HH EH L B AH L IH NG
+helbling(2) HH EH L B L IH NG
+held HH EH L D
+heldenbrand HH EH L D IH N B R AH N D
+heldenbrand(2) HH EH L D IH N B R AE N D
+heldentenor HH EH L D EH N T EH N ER
+helder HH EH L D ER
+helderman HH EH L D ER M AH N
+heldman HH EH L D M AH N
+heldor HH EH L D ER
+heldreth HH EH L D R IH TH
+heldring HH EH L D R IH NG
+helds HH EH L D Z
+heldt HH EH L T
+helen HH EH L AH N
+helen's HH EH L IH N Z
+helena HH EH L AH N AH
+helena's HH EH L IH N AH Z
+helene HH AH L IY N
+helens HH EH L AH N Z
+helf HH EH L F
+helfand HH EH L F AH N D
+helfer HH EH L F ER
+helfgott HH EH L F G AA T
+helfman HH EH L F M AH N
+helfrich HH EH L F R IH K
+helga HH EH L G AH
+helgerson HH EH L G ER S AH N
+helgesen HH EH L G IY Z AH N
+helgeson HH EH L G IH S AH N
+helget HH EH L G IH T
+helgren HH EH L G R EH N
+helical HH EH L IH K AH L
+helice HH EH L IH S
+helicon HH EH L IH K AA N
+helicons HH EH L IH K AA N Z
+helicopter HH EH L IH K AA P T ER
+helicopter's HH EH L AH K AA P T ER Z
+helicopters HH EH L IH K AA P T ER Z
+helie HH EH L IY
+helin HH EH L IH N
+heling HH IY L IH NG
+helinski HH IH L IH N S K IY
+helionetic HH IY L IY OW N EH T IH K
+helionetics HH IY L IY OW N EH T IH K S
+heliopolis HH IY L IY AA P AH L AH S
+helios HH IY L IY AA S
+heliotrope HH IY L IY AH T R OW P
+helium HH IY L IY AH M
+helix HH IY L IH K S
+helke HH EH L K
+hell HH EH L
+hell's HH EH L Z
+hellacious HH EH L EY SH AH S
+hellaciously HH EH L EY SH AH S L IY
+hellaciousness HH EH L EY SH AH S N AH S
+hellams HH EH L AH M Z
+helland HH EH L AH N D
+hellard HH EH L ER D
+hellberg HH EH L B ER G
+hellbusch HH EH L B AH SH
+hellbusch(2) HH EH L B UH SH
+helle HH EH L
+hellen HH EH L AH N
+hellenbrand HH EH L AH N B R AE N D
+hellenic HH AH L EH N IH K
+hellenism HH EH L AH N IH Z AH M
+hellenistic HH EH L AH N IH S T IH K
+hellenize HH EH L AH N AY Z
+hellenized HH EH L AH N AY Z D
+hellenizes HH EH L AH N AY Z IH Z
+hellenizing HH EH L AH N AY Z IH NG
+heller HH EH L ER
+heller's HH EH L ER Z
+hellerman HH EH L ER M AH N
+hellfire HH EH L F AY R
+hellickson HH EH L IH K S AH N
+hellier HH EH L Y ER
+helling HH EH L IH NG
+hellinger HH EH L IH NG ER
+hellish HH EH L IH SH
+hellman HH EH L M AH N
+hellmann HH EH L M AH N
+hellmer HH EH L M ER
+hellmuth HH EH L M UW TH
+hellner HH EH L N ER
+hello HH AH L OW
+hello(2) HH EH L OW
+hellraiser HH EH L R EY Z ER
+hellstrom HH EH L S T R AH M
+hellums HH EH L AH M Z
+helluva HH EH L UW V AH
+hellwig HH EH L W IH G
+hellyer HH EH L IY ER
+helm HH EH L M
+helma HH EH L M AH
+helman HH EH L M AH N
+helmbrecht HH EH L M B R IH K T
+helme HH EH L M
+helmer HH EH L M ER
+helmerich HH EH L M ER IH K
+helmers HH EH L M ER Z
+helmes HH EH L M Z
+helmet HH EH L M AH T
+helmeted HH EH L M AH T IH D
+helmets HH EH L M AH T S
+helmich HH EH L M IH K
+helmick HH EH L M IH K
+helmig HH EH L M IH G
+helming HH EH L M IH NG
+helminiak HH EH L M IH N IY AE K
+helminski HH IH L M IH N S K IY
+helminth HH EH L M IH N TH
+helmkamp HH EH L M K AE M P
+helmke HH EH L M K
+helmont HH EH L M AA N T
+helms HH EH L M Z
+helms' HH EH L M Z
+helms's HH EH L M Z IH Z
+helmsburton HH EH L M Z B ER T AH N
+helmsley HH EH L M Z L IY
+helmsley's HH EH L M Z L IY Z
+helmsleys HH EH L M Z L IY Z
+helmsman HH EH L M Z M AE N
+helmstetter HH EH L M S T IH T ER
+helmut HH EH L M AH T
+helmuth HH EH L M UW TH
+helot HH EH L AH T
+helotism HH EH L AH T IH Z AH M
+helotry HH EH L AH T R IY
+helots HH EH L AH T S
+help HH EH L P
+helped HH EH L P T
+helper HH EH L P ER
+helpers HH EH L P ER Z
+helpful HH EH L P F AH L
+helpfully HH EH L P F AH L IY
+helping HH EH L P IH NG
+helpings HH EH L P IH NG Z
+helpless HH EH L P L AH S
+helplessly HH EH L P L AH S L IY
+helplessness HH EH L P L AH S N AH S
+helprin HH EH L P R IH N
+helps HH EH L P S
+helsel HH EH L S AH L
+helser HH EH L S ER
+helseth HH EH L S IH TH
+helsinki HH EH L S IH NG K IY
+helsley HH EH L S L IY
+helstrom HH EH L S T R AH M
+helt HH EH L T
+helter HH EH L T ER
+helton HH EH L T AH N
+heltsley HH EH L T S L IY
+heltzel HH EH L T Z AH L
+helvey HH EH L V IY
+helvie HH EH L V IY
+helwig HH EH L W IH G
+helzer HH EH L Z ER
+hem HH EH M
+heman HH IY M AH N
+hemani HH AH M AA N IY
+hemann HH EH M AH N
+hemant HH EH M AH N T
+hematite HH EH M AH T AY T
+hematology HH EH M AH T AA L AH JH IY
+hematology(2) HH IY M AH T AA L AH JH IY
+hemberger HH EH M B ER G ER
+hembree HH IH M B R IY
+hembrick HH EH M B R IH K
+hemby HH EH M B IY
+hemdale HH EH M D EY L
+hemdale's HH EH M D EY L Z
+hemel HH EH M AH L
+hemenway HH EH M AH N W EY
+hemimorphite HH EH M AH M AO R F AY T
+heming HH EH M IH NG
+heminger HH EH M IH NG ER
+hemingway HH EH M IH NG W EY
+hemingway's HH EH M IH NG W EY Z
+hemiplegia HH EH M AH P L IY JH IY AH
+hemiplegia(2) HH EH M AH P L IY JH Y AH
+hemisphere HH EH M IH S F IH R
+hemispheric HH EH M AH S F IH R IH K
+hemker HH EH M K ER
+hemler HH EH M L ER
+hemline HH EH M L AY N
+hemlines HH EH M L AY N Z
+hemlo HH EH M L OW
+hemlock HH EH M L AA K
+hemm HH EH M
+hemme HH EH M
+hemmed HH EH M D
+hemmelgarn HH EH M IH L G AA R N
+hemmen HH EH M AH N
+hemmer HH EH M ER
+hemmerich HH EH M ER IH K
+hemmerle HH EH M ER L IY
+hemmerling HH EH M ER L IH NG
+hemmert HH EH M ER T
+hemmeter HH EH M IH T ER
+hemming HH EH M IH NG
+hemminger HH EH M IH NG ER
+hemminghaus HH EH M IH NG HH AW S
+hemmings HH EH M IH NG Z
+hemmingsen HH EH M IH NG S AH N
+hemmingson HH EH M IH NG S AH N
+hemo HH IY M OW
+hemocyanin HH IY M AH S AY AH N AH N
+hemodynamic HH EH M OW D AY N AE M IH K
+hemodynamics HH EH M OW D AY N AE M IH K S
+hemoglobin HH IY M AH G L OW B AH N
+hemolytic HH IY M AH L IH T IH K
+hemond HH EH M AH N D
+hemophilia HH IY M AH F IY L IY AH
+hemophiliac HH IY M AH F IH L IY AE K
+hemophiliac(2) HH IY M OW F IH L IY AE K
+hemophiliac(3) HH IY M AH F IH L Y AE K
+hemophiliac(4) HH IY M OW F IH L Y AE K
+hemophiliacs HH IY M AH F IH L IY AE K S
+hemorrhage HH EH M ER IH JH
+hemorrhage(2) HH EH M R AH JH
+hemorrhaged HH EH M ER IH JH D
+hemorrhagic HH EH M ER AE G IH K
+hemorrhaging HH EH M ER IH JH IH NG
+hemorrhoid HH EH M ER OY D
+hemorrhoids HH EH M ER OY D Z
+hemotec HH EH M OW T EH K
+hemp HH EH M P
+hempel HH EH M P AH L
+hempen HH EH M P AH N
+hempfling HH EH M P F AH L IH NG
+hempfling(2) HH EH M P F L IH NG
+hemphill HH EH M P HH IH L
+hempstead HH EH M P S T EH D
+hemric HH EH M R IH K
+hemrick HH EH M R IH K
+hemry HH EH M R IY
+hems HH EH M Z
+hemsley HH EH M Z L IY
+hemstreet HH EH M S T R IY T
+hemy HH EH M IY
+hen HH EH N
+hen's HH EH N Z
+henao HH EY N AW
+henard HH EH N ER D
+henault HH EH N AW L T
+henbane HH EH N B EY N
+hence HH EH N S
+henceforth HH EH N S F AO R TH
+hench HH EH N CH
+henchman HH EH N CH M AH N
+henchmen HH EH N CH M AH N
+henckel HH EH N K AH L
+hendee HH EH N D IY
+hendel HH EH N D AH L
+hendershot HH EH N D ER SH AH T
+hendershott HH EH N D ER SH AH T
+henderson HH EH N D ER S AH N
+hendler HH EH N D L ER
+hendley HH EH N D L IY
+hendon HH EH N D OW N
+hendra HH EH N D R AH
+hendren HH EH N D ER AH N
+hendrich HH EH N D R IH K
+hendrick HH EH N D R IH K
+hendricks HH EH N D R IH K S
+hendricksen HH EH N D R IH K S AH N
+hendrickson HH EH N D R IH K S AH N
+hendrie HH EH N D ER IY
+hendrik HH EH N D R IH K
+hendriks HH EH N D R IH K S
+hendriksen HH EH N D R IH K S AH N
+hendrix HH EH N D R IH K S
+hendrixson HH EH N D R IH K S AH N
+hendron HH EH N D R AH N
+hendry HH EH N D R IY
+hendry's HH EH N D R IY Z
+hendryx HH EH N D R IH K S
+hendy HH EH N D IY
+henegar HH EH N IH G ER
+heneghan HH IH N EH G HH AH N
+henehan HH EH N IH HH AE N
+henery HH EH N ER IY
+henes HH IY N Z
+heney HH EH N IY
+heng HH EH NG
+hengel HH EH NG G AH L
+hengst HH EH NG G S T
+henhouse HH EH N HH AW S
+henie HH EH N IY
+henigan HH EH N IH G AH N
+henin HH EH N IH N
+heninger HH EH N IH NG ER
+henion HH EH N Y AH N
+henk HH EH NG K
+henke HH EH NG K
+henkel HH EH NG K AH L
+henkelman HH EH NG K AH L M AH N
+henkels HH EH NG K AH L Z
+henken HH EH NG K AH N
+henkes HH EH NG K S
+henkin HH EH NG K IH N
+henkle HH EH NG K AH L
+henle HH EH N AH L
+henley HH EH N L IY
+henley's HH EH N L IY Z
+henleys HH EH N L IY Z
+henline HH EH N L AY N
+henly HH EH N L IY
+henman HH EH N M AH N
+henn HH EH N
+henna HH EH N AH
+hennan HH EH N AH N
+henne HH EH N
+henne(2) HH EH N IY
+henneberger HH EH N B ER G ER
+henneberry HH EH N B EH R IY
+henneke HH EH N IH K
+hennelly HH EH N AH L IY
+henneman HH EH N M AH N
+hennen HH EH N AH N
+hennepin HH EH N IH P IH N
+henner HH EH N ER
+hennes HH EH N Z
+henness HH EH N IH S
+hennessee HH EH N IH S IY
+hennessey HH EH N AH S IY
+hennessey's HH EH N AH S IY Z
+hennessy HH EH N AH S IY
+henney HH EH N IY
+hennick HH EH N IH K
+hennig HH EH N IH G
+hennigan HH EH N IH G AH N
+hennigar HH EH N IH G ER
+henning HH EH N IH NG
+henninger HH EH N IH NG ER
+hennings HH EH N IH NG Z
+henningsen HH EH N IH NG S AH N
+hennington HH EH N IH NG T AH N
+hennis HH EH N IH S
+hennon HH EH N AH N
+henpeck HH EH N P EH K
+henpecked HH EH N P EH K T
+henri HH EH N R IY
+henri(2) AO R IY
+henri(3) AA N R IY
+henrich HH EH N R IH K
+henrichs HH EH N R IH K S
+henrichsen HH EH N R IH K S AH N
+henrick HH EH N R IH K
+henricks HH EH N R IH K S
+henricksen HH EH N R IH K S AH N
+henrickson HH EH N R IH K S AH N
+henrie HH EH N ER IY
+henrietta HH EH N R IY EH T AH
+henriette HH EH N R IY EH T
+henrik HH EH N R IH K
+henrika HH EH N R IH K AH
+henriksen HH EH N R IH K S AH N
+henrikson HH EH N R IH K S AH N
+henrique AA N R IY K
+henriques HH EH N R IY K EH Z
+henriques(2) AA N R IY K
+henriquez HH EH N R IY K EH Z
+henriquez(2) AA N R IY K
+henry HH EH N R IY
+henry's HH EH N R IY Z
+hens HH EH N Z
+hensarling HH EH N S AA R L IH NG
+hensch HH EH N SH
+henschel HH EH N SH AH L
+henschen HH EH N SH AH N
+hense HH EH N S
+hensel HH EH N S AH L
+hensen HH EH N S AH N
+henshaw HH EH N SH AO
+hensil HH EH N S AH L
+henske HH EH N S K IY
+henslee HH EH N Z L IY
+hensler HH EH N S AH L ER
+hensler(2) HH EH N S L ER
+hensley HH EH N Z L IY
+henson HH EH N S AH N
+hentges HH EH N T JH IH Z
+henthorn HH EH N TH ER N
+henthorne HH EH N TH ER N
+hentic HH EH N T IH K
+hentoff HH EH N T AO F
+henton HH EH N T AH N
+hentschel HH EH N CH AH L
+hentz HH EH N T S
+henwood HH EH N W UH D
+henze HH EH N Z
+henzel HH EH N Z AH L
+henzler HH EH N Z L ER
+heon HH IY AH N
+heoroico HH IY AH R OW AH K OW
+hep HH EH P
+heparin HH EH P ER IH N
+hepatic HH AH P AE T IH K
+hepatitis HH EH P AH T AY T AH S
+hepburn HH EH P B ER N
+hepburn's HH EH P B ER N Z
+hepfer HH EH P F ER
+hepker HH EH P K ER
+hepler HH EH P L ER
+hepner HH EH P N ER
+hepp HH EH P
+heppe HH EH P
+hepper HH EH P ER
+heppler HH EH P L ER
+heppner HH EH P N ER
+heptathlon HH EH P T AE TH L AA N
+hepworth HH EH P W ER TH
+her HH ER
+her's HH ER Z
+hera HH IH R AH
+heradia HH ER AA D IY AH
+herald HH EH R AH L D
+herald's HH EH R AH L D Z
+heralded HH EH R AH L D IH D
+heraldic HH EH R AE L D IH K
+heralding HH EH R AH L D IH NG
+heraldry HH EH R AH L D R IY
+heralds HH EH R AH L D Z
+herb ER B
+herb's ER B Z
+herb's(2) HH ER B Z
+herb(2) HH ER B
+herbaceous ER B EY SH AH S
+herbal ER B AH L
+herbal(2) HH ER B AH L
+herbalife HH ER B AH L AY F
+herbalife(2) ER B AH L AY F
+herbalist ER B AH L AH S T
+herbalist's ER B AH L AH S T S
+herbalist's(2) HH ER B AH L AH S T S
+herbalist(2) HH ER B AH L AH S T
+herbalists ER B AH L AH S T S
+herbalists' ER B AH L AH S T S
+herbalists'(2) HH ER B AH L AH S T S
+herbalists(2) HH ER B AH L AH S T S
+herbalists(3) ER B AH L AH S
+herbalists(4) HH ER B AH L AH S
+herbarium HH ER B EH R IY AH M
+herbarium(2) ER B EH R IY AH M
+herbariums HH ER B EH R IY AH M Z
+herbariums(2) ER B EH R IY AH M Z
+herbeck HH ER B EH K
+herbel HH ER B AH L
+herber HH ER B ER
+herberg HH ER B ER G
+herberger HH ER B ER G ER
+herbers HH ER B ER Z
+herbert HH ER B ER T
+herbert's HH ER B ER T S
+herbicide HH ER B IH S AY D
+herbicide(2) ER B IH S AY D
+herbicides ER B AH S AY D Z
+herbicides(2) HH ER B AH S AY D Z
+herbie HH ER B IY
+herbig HH ER B IH G
+herbin HH ER B IH N
+herbison HH ER B IH S AH N
+herbivore HH ER B IH V AO R
+herbivore(2) ER B IH V AO R
+herbivorous HH ER B IH V ER AH S
+herbivorous(2) ER B IH V ER AH S
+herbold HH ER B OW L D
+herbs ER B Z
+herbst HH ER B S T
+herbster HH ER B S T ER
+herceg HH ER S IH G
+hercegovina HH EH R T S AH G OW V IY N AH
+hercegovina's HH EH R T S AH G OW V IY N AH Z
+hercegovina's(2) HH ER R T S AH G OW V IY N AH Z
+hercegovina(2) HH ER R T S AH G OW V IY N AH
+herculean HH ER K Y UW L IY AH N
+hercules HH ER K Y AH L IY Z
+herczeg HH ER CH IH G
+herd HH ER D
+herda HH EH R D AH
+herdal HH EH R D AH L
+herded HH ER D IH D
+herder HH EH R D ER
+herder(2) HH ER D ER
+herders HH ER D ER Z
+herding HH ER D IH NG
+herdman HH ER D M AH N
+herds HH ER D Z
+herdsmen HH ER D Z M IH N
+herdt HH ER T
+here HH IY R
+here's HH IH R Z
+hereabout HH IH R AH B AW T
+hereabouts HH IH R AH B AW T S
+hereafter HH IH R AE F T ER
+hereby HH IH R B AY
+heredia HH ER EH D IY AH
+hereditary HH ER EH D AH T EH R IY
+heredity HH ER EH D AH T IY
+hereford HH EH R AH F ER D
+herein HH IH R IH N
+herendeen HH IH R N D IY N
+heresy HH EH R AH S IY
+heretic HH EH R AH T IH K
+heretical HH ER EH T IH K AH L
+heretofore HH IH R T AH F AO R
+herewith HH IH R W IH TH
+herford HH ER F ER D
+herfurth HH ER F ER TH
+hergert HH ER G ER T
+herget HH ER G IH T
+hergott HH ER G AH T
+herin HH EH R IH N
+hering HH ER IH NG
+heringer HH EH R IH N JH ER
+herington HH EH R IH NG T AH N
+heritable HH EH R AH T AH B AH L
+heritage HH EH R AH T AH JH
+heritage's HH EH R AH T IH JH IH Z
+heritage(2) HH EH R IH T IH JH
+heritages HH EH R IH T IH JH AH Z
+herk HH ER K
+herkert HH ER K ER T
+herl HH ER L
+herlihy HH ER L IH HH IY
+herling HH ER L IH NG
+herlong HH ER L AO NG
+herm HH ER M
+herman HH ER M AH N
+herman's HH ER M AH N Z
+hermance HH ER M AH N S
+hermann HH ER M AH N
+hermanns HH ER M AA N Z
+hermans HH ER M AH N Z
+hermansen HH ER M AH N S AH N
+hermanson HH ER M AH N S AH N
+hermaphrodite HH ER M AE F R AH D AY T
+hermaphroditic HH ER M AE F R AH D IH T IH K
+hermenio HH ER M EH N IY OW
+hermes HH ER M IY Z
+hermetically HH ER M EH T IH K AH L IY
+hermetically(2) HH ER M EH T IH K L IY
+hermia HH ER M IY AH
+hermias HH ER M IY AH Z
+hermida HH EH R M IY D AH
+hermie HH ER M IY
+hermina HH ER M IH N AH
+hermina(2) HH ER M IY N AH
+hermine HH ER M IH N
+herminia HH EH R M IY N IY AH
+herminie HH ER M IH N IY
+hermit HH ER M AH T
+hermitage HH ER M AH T AH JH
+hermits HH ER M AH T S
+hermon HH ER M AH N
+hermosa HH EH R M OW S AH
+hermosillo HH ER M AH S IH L OW
+herms HH ER M Z
+hermsen HH ER M S AH N
+hern HH ER N
+hernan HH ER N AH N
+hernandes HH ER N IH N D Z
+hernandes(2) HH ER N AE N D EH Z
+hernandez HH ER N AE N D EH Z
+hernandez's HH ER N AE N D EH Z AH Z
+hernando HH ER N AA N D OW
+herndon HH ER N D AH N
+herne HH ER N
+herner HH ER N ER
+hernia HH ER N IY AH
+herniate HH ER N IY EY T
+herniates HH ER N IY EY T S
+hernon HH ER N AH N
+hero HH IH R OW
+hero's HH IH R OW Z
+hero's(2) HH IY R OW Z
+hero(2) HH IY R OW
+herod HH EH R AH D
+heroes HH IH R OW Z
+heroes(2) HH IY R OW Z
+heroic HH IH R OW IH K
+heroically HH IH R OW IH K L IY
+heroics HH IH R OW IH K S
+heroin HH EH R OW AH N
+heroin's HH EH R OW AH N Z
+heroine HH EH R OW AH N
+heroines HH EH R OW AH N Z
+heroism HH EH R OW IH Z AH M
+heroize HH IY R OW AY Z
+heroized HH IY R OW AY Z D
+herold HH EH R AH L D
+heron HH EH R AH N
+heron's HH EH R AH N Z
+herons HH EH R AH N Z
+heros HH IH R OW Z
+heroux HH ER UW
+herpes HH ER P IY Z
+herr HH EH R
+herre HH EH R
+herre(2) HH AH R IY
+herreid HH EH R AY D
+herrell HH EH R AH L
+herren HH EH R AH N
+herrera HH ER EH R AH
+herrero HH EH R EH R OW
+herrhausen HH EH R HH AW Z AH N
+herriage HH EH R IY IH JH
+herrick HH EH R IH K
+herridge HH EH R IH JH
+herrig HH EH R IH G
+herriman HH EH R IH M AH N
+herrin HH EH R IH N
+herring HH EH R IH NG
+herrings HH EH R IH NG Z
+herringshaw HH EH R IH NG SH AO
+herrington HH EH R IH NG T AH N
+herrington's HH EH R IH NG T AH N Z
+herriott HH EH R IY AA T
+herriott(2) HH EH R IY AH T
+herrle HH EH R AH L
+herrlinger HH EH R L IH NG ER
+herrlinger(2) HH EH R L IH NG G ER
+herrman HH EH R M AH N
+herrmann HH EH R M AH N
+herro HH EH R OW
+herrod HH EH R AH D
+herrold HH EH R OW L D
+herron HH EH R AH N
+herronimo HH ER AA N AH M OW
+herronimo's HH ER AA N AH M OW Z
+hers HH ER Z
+hersant HH ER S AH N T
+hersch HH ER SH
+herschel HH ER SH AH L
+herschel's HH ER SH AH L Z
+herschell HH ER SH AH L
+herschensohn HH ER SH AH N S AH N
+herscu HH ER S K UW
+herself HH ER S EH L F
+hersey HH ER S IY
+hersh HH ER SH
+hershberger HH ER SH B ER G ER
+hershey HH ER SH IY
+hershey's HH ER SH IY Z
+hershiser HH ER SH AY Z ER
+hershkowitz HH ER SH K AH W IH T S
+hershman HH ER SH M AH N
+hershner HH ER SH N ER
+herskovitz HH ER S K AH V IH T S
+herskowitz HH ER S K AH W IH T S
+hersman HH ER S M AH N
+hersom HH ER S AH M
+herson HH ER S AH N
+herst HH ER S T
+hert HH ER T
+herta HH ER T AH
+hertel HH ER T AH L
+hertenstein HH ER T AH N S T AY N
+hertenstein(2) HH ER T AH N S T IY N
+herter HH ER T ER
+hertha HH ER TH AH
+hertig HH ER T IH G
+herting HH ER T IH NG
+hertlein HH ER T L AY N
+hertog HH ER T AA G
+hertz HH EH R T S
+hertz(2) HH ER T S
+hertzberg HH ER T S B ER G
+hertzenleben HH ER T AH N L EY B AH N
+hertzenleben's HH ER T AH N L EY B AH N Z
+hertzler HH ER T Z AH L ER
+hertzler(2) HH ER T Z L ER
+hertzog HH ER T Z AH G
+hertzog(2) HH ER T Z AA G
+herve HH ER V
+herve(2) HH ER V EY
+hervey HH ER V EY
+herwick HH ER W IH K
+herwig HH ER W IH G
+herwitz HH ER W IH T S
+heryana HH ER Y AE N AH
+herz HH ER Z
+herzberg HH ER Z B ER G
+herzberger HH ER Z B ER G ER
+herzegovina HH EH R T S AH G OW V IY N AH
+herzegovina's HH EH R T S AH G OW V IY N AH Z
+herzegovina's(2) HH ER T S AH G OW V IY N AH Z
+herzegovina(2) HH ER T S AH G OW V IY N AH
+herzer HH ER Z ER
+herzfeld HH ER Z F EH L D
+herzig HH ER Z IH G
+herzing HH ER Z IH NG
+herzlinger HH ER Z L IH NG ER
+herzog HH ER Z AA G
+hesch HH EH SH
+heseltine HH EH S AH L T IY N
+heseltine(2) HH EH S AH L T AY N
+heselton HH IH S EH L T AH N
+hesheng HH EH SH EH NG
+hesik HH EH S IH K
+hesik(2) HH EY S IH K
+hesiod HH IY S IY AH D
+hesitancy HH EH Z IH T AH N S IY
+hesitant HH EH Z IH T AH N T
+hesitantly HH EH Z IH T AH N T L IY
+hesitate HH EH Z AH T EY T
+hesitated HH EH Z IH T EY T IH D
+hesitates HH EH Z AH T EY T S
+hesitating HH EH Z AH T EY T IH NG
+hesitation HH EH Z AH T EY SH AH N
+hesitations HH EH Z AH T EY SH AH N Z
+hesketh HH EH S K IH TH
+heskett HH EH S K IH T
+heslep HH EH S L IH P
+hesler HH EH S AH L ER
+hesler(2) HH EH S L ER
+heslin HH EH Z L IH N
+heslin's HH EH Z L IH N Z
+heslop HH EH S L AH P
+hesper HH EH S P ER
+hespera HH EY S P EH R AH
+hess HH EH S
+hesse HH EH S
+hesse's HH EH S IH Z
+hessel HH EH S AH L
+hesseltine HH EH S IH L T IY N
+hesser HH EH S ER
+hessian HH EH SH AH N
+hessing HH EH S IH NG
+hessinger HH EH S IH N JH ER
+hession HH EH SH IH N
+hessite HH EH S AY T
+hessler HH EH S L ER
+hessling HH EH S AH L IH NG
+hessling(2) HH EH S L IH NG
+hesson HH EH S AH N
+hesston HH EH S T AH N
+hesston's HH EH S T AH N Z
+hestand HH EH S T AH N D
+hester HH EH S T ER
+hesther HH EH S DH ER
+hestia HH EH S T IY AH
+heston HH EH S T AH N
+heterocercal HH EH T ER OW S ER K AH L
+heterodox HH EH T ER AH D AA K S
+heterodoxy HH EH T ER AH D AA K S IY
+heterodyne HH EH T ER AH D AY N
+heterogeneity HH EH T ER AH JH IH N IY AH T IY
+heterogeneity(2) HH EH T ER AH JH IH N EY AH T IY
+heterogeneous HH EH T ER AH JH IY N Y AH S
+heterosexual HH EH T ER OW S EH K SH AH W AH L
+heterosexuality HH EH T ER OW S EH K SH AH W AE L IH T IY
+heterosexuals HH EH T ER OW S EH K SH AH W AH L Z
+heterosis HH EH T ER OW S AH S
+heterosporous HH EH T ER AA S P ER AH S
+heterotrophic HH EH T ER AH T R AA F IH K
+heterozygous HH EH T ER AH Z AY G AH S
+heth HH EH TH
+hetherington HH EH DH ER IH NG T AH N
+hetland HH EH T L AH N D
+hetman HH EH T M AH N
+hetrick HH EH T R IH K
+hett HH EH T
+hettel HH EH T AH L
+hetti HH EH T IY
+hettick HH EH T IH K
+hettie HH EH T IY
+hettler HH EH T L ER
+hettrick HH EH T R IH K
+hetty HH EH T IY
+hetu HH IY CH UW
+hetz HH EH T S
+hetzel HH EH T Z AH L
+hetzer HH EH T Z ER
+hetzler HH EH T S L ER
+heuberger HH OY B ER G ER
+heublein HH Y UW B L AY N
+heuer HH Y UW ER
+heuer's HH Y UW ER Z
+heuerman HH OY ER M AH N
+heuermann HH OY ER M AH N
+heuman HH Y UW M AH N
+heumann HH Y UW M AH N
+heun HH Y UW N
+heung-yeung HH UW NG Y UW NG
+heupel HH OY P AH L
+heuring HH ER IH NG
+heuristic HH Y UH R IH S T IH K
+heuristics HH Y UH R IH S T IH K S
+heusen HH Y UW S AH N
+heuser HH OY S ER
+heusser HH Y UW S ER
+hevener HH EH V IY N ER
+heverly HH EH V ER L IY
+hevey HH IH V EY
+hevia HH EY V IY AH
+hevner HH EH V N ER
+hew HH Y UW
+heward HH Y UW ER D
+hewe HH Y UW
+hewell HH EH W EH L
+hewell(2) HH Y UW W EH L
+hewer HH Y UW ER
+hewes HH Y UW Z
+hewett HH Y UW IH T
+hewey HH Y UW IY
+hewing HH Y UW IH NG
+hewins HH Y UW IH N Z
+hewitt HH Y UW IH T
+hewitt's HH Y UW IH T S
+hewler HH Y UW L ER
+hewler's HH Y UW L ER Z
+hewlett HH Y UW L IH T
+hewn HH Y UW N
+hews HH Y UW Z
+hewson HH Y UW S AH N
+hex HH EH K S
+hexachlorophene HH EH K S AH K L AO R AH F IY N
+hexagon HH EH K S AH G AA N
+hexagonal HH EH K S AE G AH N AH L
+hexane HH EH K S EY N
+hexcel HH EH K S AH L
+hext HH EH K S T
+hey HH EY
+heyboer HH EY B OW ER
+heyd HH EY D
+heyday HH EY D EY
+heyde HH EY D
+heyden HH EY D AH N
+heydon HH EY D AH N
+heydt HH EY D T
+heye HH AY
+heyen HH AY N
+heyer HH EY ER
+heying HH EY IH NG
+heyl HH EY L
+heyman HH EY M AH N
+heyman's HH EY M AH N Z
+heymann HH EY M AH N
+heymann's HH EY M AH N Z
+heyn HH EY N
+heyne HH EY N
+heys HH EY Z
+heyse HH EY S
+heyser HH EY Z ER
+heyward HH EY W ER D
+heywood HH EY W UH D
+hezbollah HH EH Z B AA L AH
+hezbollah's HH EH Z B AA L AH Z
+hezbollah's(2) HH EH Z B AH L AH Z
+hezbollah(2) HH EH Z B AH L AH
+hezbullah HH EH Z B AA L AH
+hezbullah(2) HH EH Z B AH L AH
+hfdf EY CH EH F D IY EH F
+hgh EY CH JH IY EY CH
+hi HH AY
+hi-fi HH AY F AY
+hiaa EY CH AY EY EY
+hiaasen HH AY AA S IH N
+hialeah HH AY AH L IY AH
+hiam HH AY AH M
+hiatt HH AY AH T
+hiatt's HH AY AH T S
+hiatus HH AY EY T AH S
+hiawatha HH AY AH W AA TH AH
+hibaaq HH AY B AE K
+hibachi HH AH B AA CH IY
+hibachi(2) HH IY B AA CH IY
+hibbard HH IH B ER D
+hibben HH IH B AH N
+hibberd HH IH B ER D
+hibbert HH IH B ER T
+hibbett HH IH B IH T
+hibbing HH IH B IH NG
+hibbitts HH IH B IH T S
+hibbler HH IH B L ER
+hibbs HH IH B Z
+hibdon HH IH B D AH N
+hibernate HH AY B ER N EY T
+hibernation HH AY B ER N EY SH AH N
+hibernia HH AY B ER N IY AH
+hibernia's HH AY B ER N IY AH Z
+hibler HH IH B L ER
+hibma HH IH B M AH
+hibner HH IH B N ER
+hibor HH AY B ER
+hibshman HH IH B SH M AH N
+hiccough HH IH K AH P
+hiccoughs HH IH K AH P S
+hiccup HH IH K AH P
+hiccups HH IH K AH P S
+hice HH AY S
+hicfa HH IH K F AH
+hichens HH IH K AH N Z
+hick HH IH K
+hickam HH IH K AH M
+hickcox HH IH K AA K S
+hickel HH IH K AH L
+hicken HH IH K AH N
+hickerson HH IH K ER S AH N
+hickey HH IH K IY
+hickle HH IH K AH L
+hicklin HH IH K L IH N
+hickling HH IH K L IH NG
+hickman HH IH K M AH N
+hickmon HH IH K M AH N
+hickok HH IH K AH K
+hickories HH IH K ER IY Z
+hickory HH IH K ER IY
+hickory(2) HH IH K R IY
+hickox HH IH K AA K S
+hicks HH IH K S
+hickson HH IH K S AH N
+hicksville HH IH K S V IH L
+hid HH IH D
+hidalgo HH AH D AE L G OW
+hidden HH IH D AH N
+hide HH AY D
+hideaki HH IY D EY AA K IY
+hideaway HH AY D AH W EY
+hidebound HH AY D B AW N D
+hideo HH IH D EY OW
+hideous HH IH D IY AH S
+hideously HH IH D IY AH S L IY
+hideout HH AY D AW T
+hideouts HH AY D AW T S
+hider HH AY D ER
+hides HH AY D Z
+hiding HH AY D IH NG
+hidy HH AY D IY
+hieb HH IY B
+hieber HH IY B ER
+hiebert HH IY B ER T
+hiegel HH IY G AH L
+hiems HH IY M Z
+hiemstra HH IY M S T R AH
+hier HH AY ER
+hierarchical HH AY R AA R K AH K AH L
+hierarchies HH AY R AA R K IY Z
+hierarchy HH AY ER AA R K IY
+hierarchy(2) HH AY R AA R K IY
+hierholzer HH AY R HH OW L Z ER
+hieroglyph HH AY R OW G L IH F
+hieroglyphic HH AY R OW G L IH F IH K
+hieroglyphics HH AY R OW G L IH F IH K S
+hieroglyphs HH AY R OW G L IH F S
+hiers HH IY R Z
+hiestand HH IY S T AH N D
+hiester HH AY IH S T ER
+hietala HH AY T AH L AH
+hietpas HH AY T P AH Z
+hiett HH AY T
+higa HH IY G AH
+higashi HH IY G AA SH IY
+higbee HH IH G B IY
+higbie HH IH G B IY
+higby HH IH G B IY
+higdon HH IH G D AH N
+higgason HH IH G AH S AH N
+higgenbotham HH IH G IH N B AH TH AH M
+higgens HH IH G AH N Z
+higgerson HH IH G ER S AH N
+higginbotham HH IH G IH N B AA TH AH M
+higginbottom HH IH G IH N B AA T AH M
+higgins HH IH G IH N Z
+higginson HH IH G IH N S AH N
+higgs HH IH G Z
+high HH AY
+high-profile HH AY P R OW F AY L
+high-spirited HH AY S P IH R IH D IH D
+high-spiritedness HH AY S P IH R IH D IH D N AH S
+higham HH AY AH M
+highberger HH AY B ER G ER
+highboy HH AY B OY
+highbrow HH AY B R AW
+highbrows HH AY B R AW Z
+higher HH AY ER
+highest HH AY AH S T
+highfalutin HH AY F AH L UW T IH N
+highfield HH AY F IY L D
+highfill HH AY F IH L
+highflier HH AY F L AY ER
+highfliers HH AY F L AY ER Z
+highflying HH AY F L AY IH NG
+highland HH AY L AH N D
+highlander HH AY L AE N D ER
+highlanders HH AY L AE N D ER Z
+highlands HH AY L AH N D Z
+highley HH AY L IY
+highlight HH AY L AY T
+highlighted HH AY L AY T IH D
+highlighting HH AY L AY T IH NG
+highlights HH AY L AY T S
+highly HH AY L IY
+highman HH AY M AH N
+highness HH AY N AH S
+highosin HH AY OW S IH N
+highrise HH AY R AY Z
+highrises HH AY R AY Z IH Z
+highs HH AY Z
+highschool HH AY S K UW L
+highschools HH AY S K UW L Z
+highsmith HH AY S M IH TH
+highspeed HH AY S P IY D
+hight HH AY T
+hightech HH AY T EH K
+hightower HH AY T AW ER
+hightower's HH AY T AW ER Z
+highway HH AY W EY
+highway's HH AY W EY Z
+highways HH AY W EY Z
+highyield HH AY Y IY L D
+higinbotham HH IH G IH N B AH TH AH M
+higley HH IH G L IY
+higman HH IH G M AH N
+hignight HH IH G N AY T
+hignite HH IH G N AY T
+higuchi HH IY G UW CH IY
+higuera HH IY G EH R AH
+hijack HH AY JH AE K
+hijacked HH AY JH AE K T
+hijacker HH AY JH AE K ER
+hijackers HH AY JH AE K ER Z
+hijacking HH AY JH AE K IH NG
+hijackings HH AY JH AE K IH NG Z
+hijinks HH IH JH IH NG K S
+hike HH AY K
+hiked HH AY K T
+hiker HH AY K ER
+hikers HH AY K ER Z
+hikes HH AY K S
+hiking HH AY K IH NG
+hiland HH IH L AH N D
+hilaria HH IY L AA R IY AH
+hilario HH IY L AA R IY OW
+hilarious HH IH L EH R IY AH S
+hilariously HH IH L EH R IY AH S L IY
+hilarity HH IH L EH R AH T IY
+hilary HH IH L ER IY
+hilb HH IH L B
+hilberg HH IH L B ER G
+hilbert HH IH L B ER T
+hilborn HH IH L B ER N
+hilbun HH IH L B AH N
+hilburn HH IH L B ER N
+hild HH IH L D
+hilda HH IH L D AH
+hilde HH IH L D
+hildebran HH IH L D IH B R AH N
+hildebrand HH IH L D IH B R AE N D
+hildebrandt HH IH L D IH B R AH N T
+hildebrant HH IH L D IH B R AH N T
+hildegard HH IH L D AH G AA R D
+hildegarde HH IH L D IH G AA R D
+hildegardes HH IH L D AH G AA R D Z
+hildemar HH IH L D IH M ER
+hilden HH AY L D AH N
+hildenbrand HH IH L D IH N B R AH N D
+hildenbrand(2) HH IH L D AH N B R AE N D
+hilder HH IH L D ER
+hilderbrand HH IH L D ER B R AH N D
+hilderbrandt HH IH L D ER B R AH N T
+hildie HH AY L D IY
+hilditch HH IH L D IH CH
+hildreth HH IH L D R IH TH
+hildum HH IH L D AH M
+hildy HH IH L D IY
+hile HH AY L
+hileman HH AY L M AH N
+hilemon HH AY L M AH N
+hilemon's HH AY L M AH N Z
+hiler HH AY L ER
+hiles HH AY L Z
+hiley HH IH L IY
+hilfiger HH IH L F AY G ER
+hilfiger(2) HH IH L F IH G ER
+hilfiker HH IH L F IH K ER
+hilgart HH IH L G AA R T
+hilgeman HH IH L G M AH N
+hilgenberg HH IH L G AH N B ER G
+hilgendorf HH IH L G IH N D AO R F
+hilger HH IH L G ER
+hilgers HH IH L G ER Z
+hilgert HH IH L G ER T
+hilinski HH IH L IH N S K IY
+hilke HH IH L K AH
+hilker HH IH L K ER
+hill HH IH L
+hill's HH IH L Z
+hilla HH IH L AH
+hillard HH IH L ER D
+hillard's HH IH L ER D Z
+hillary HH IH L ER IY
+hillary's HH IH L ER IY Z
+hillas HH IH L AH S
+hillbillies HH IH L B IH L IY Z
+hillbilly HH IH L B IH L IY
+hillcrest HH IH L K R EH S T
+hille HH IH L
+hilleary HH IH L ER IY
+hillebrand HH IH L IH B R AH N D
+hillegas HH IH L IH G AH Z
+hillegass HH IH L IH G AH S
+hillel HH IH L EH L
+hillen HH IH L AH N
+hillenbrand HH IH L AH N B R AE N D
+hillenbrand's HH IH L AH N B R AE N D Z
+hillenburg HH IH L AH N B ER G
+hiller HH IH L ER
+hillerman HH IH L ER M AH N
+hillery HH IH L ER IY
+hillesheim HH IH L IH S HH AY M
+hillestad HH IH L IH S T AH D
+hilley HH IH L IY
+hillhaven HH IH L HH EY V AH N
+hillhaven's HH IH L HH EY V AH N Z
+hillhouse HH IH L HH AW S
+hillian HH IH L Y AH N
+hillians HH IH L Y AH N Z
+hilliard HH IH L Y AA R D
+hillier HH IH L IY ER
+hilligoss HH IH L IH G AA S
+hilliker HH IH L AY K ER
+hilliker(2) HH IH L IH K ER
+hillin HH IH L IH N
+hilling HH IH L IH NG
+hillis HH IH L IH S
+hillman HH IH L M AE N
+hillmann HH IH L M AH N
+hillmer HH IH L M ER
+hillock HH IH L AH K
+hills HH IH L Z
+hills' HH IH L Z
+hillsboro HH IH L Z B ER OW
+hillsborough HH IH L Z B ER OW
+hillsdale HH IH L Z D EY L
+hillsdown HH IH L Z D AW N
+hillside HH IH L S AY D
+hillsides HH IH L S AY D Z
+hillsman HH IH L S M AH N
+hillson HH IH L S AH N
+hillstrom HH IH L S T R AH M
+hilltop HH IH L T AA P
+hilltops HH IH L T AA P S
+hilly HH IH L IY
+hillyard HH IH L Y AA R D
+hillyer HH IH L IY ER
+hilma HH IH L M AH
+hilmer HH IH L M ER
+hilmes HH IH L M Z
+hilo HH IY L OW
+hilpert HH IH L P ER T
+hilsabeck HH IH L S AH B EH K
+hilscher HH IH L SH ER
+hilsinger HH IH L S IH NG ER
+hilsman HH IH L Z M AH N
+hilson HH IH L S AH N
+hilt HH IH L T
+hiltner HH IH L T N ER
+hilton HH IH L T AH N
+hilton's HH IH L T AH N Z
+hilton-head HH IH L T AH N HH EH D
+hiltons HH IH L T AH N Z
+hilts HH IH L T S
+hiltunen HH IH L T AH N AH N
+hilty HH IH L T IY
+hiltz HH IH L T S
+hilyard HH AH L Y AA R D
+hilyer HH IH L IY ER
+him HH IH M
+him(2) IH M
+himalaya HH IH M AH L AY AH
+himalaya(2) HH IH M AH L EY AH
+himalayan HH IH M AH L EY AH N
+himalayan(2) HH IH M AH L AY AH N
+himalayas HH IH M AH L AY AH S
+himalayas(2) HH IH M AH L EY AH S
+hime HH AY M
+himebaugh HH IH M IH B AO
+himel HH IH M AH L
+himes HH AY M Z
+himmel HH IH M AH L
+himmelberger HH IH M AH L B ER G ER
+himmelfarb HH IH M AH L F AA R B
+himmelsbach HH IH M IH L S B AA K
+himmelstein HH IH M AH L S T AY N
+himmelstein(2) HH IH M AH L S T IY N
+himmler HH IH M L ER
+himont HH IH M AH N T
+himont(2) HH AY M AH N T
+himself HH IH M S EH L F
+hinch HH IH N CH
+hinchcliff HH IH N CH K L IH F
+hinchcliffe HH IH N CH K L IH F
+hinchey HH IH N CH IY
+hinchliffe HH IH N K L IH F
+hinchman HH IH NG K M AH N
+hinck HH IH NG K
+hinckley HH IH NG K L IY
+hind HH AY N D
+hinde HH IH N D
+hindelong HH IH N D AH L AO NG
+hinder HH IH N D ER
+hindered HH IH N D ER D
+hinderer HH IH N D ER ER
+hindering HH IH N D ER IH NG
+hinderliter HH IH N D ER L IY T ER
+hinderman HH AY N D ER M AH N
+hinders HH IH N D ER Z
+hindes HH IH N D Z
+hindi HH IH N D IY
+hindle HH IH N D AH L
+hindley HH IH N D L IY
+hindman HH AY N D M AH N
+hindquarter HH AY N D K W AO R T ER
+hindquarter(2) HH AY N D K AO R T ER
+hindquarters HH AY N D K W AO R T ER Z
+hindquarters(2) HH AY N D K AO R T ER Z
+hindrance HH IH N D R AH N S
+hindrances HH IH N D R AH N S IH Z
+hinds HH AY N D Z
+hindsight HH AY N D S AY T
+hindsight's HH AY N D S AY T S
+hindsight's(2) HH AY N S AY T S
+hindsight(2) HH AY N S AY T
+hindu HH IH N D UW
+hinduism HH IH N JH UW IH Z AH M
+hindus HH IH N D UW Z
+hindustan HH IH N D UW S T AE N
+hine HH AY N
+hinebaugh HH IH N IH B AO
+hineline HH IH N IH L AY N
+hinely HH AY N L IY
+hineman HH AY N M AH N
+hiner HH AY N ER
+hinerman HH AY N ER M AH N
+hines HH AY N Z
+hinesley HH IH N IH S L IY
+hinesley(2) HH AY N Z L IY
+hiney HH IH N IY
+hing HH IH NG
+hinge HH IH N JH
+hinged HH IH N JH D
+hinger HH IH N JH ER
+hinges HH IH N JH IH Z
+hingham HH IH NG AH M
+hingis HH IH NG AH S
+hingle HH IH NG G AH L
+hingst HH IH NG S T
+hingston HH IH NG S T AH N
+hink HH IH NG K
+hinkel HH IH NG K AH L
+hinkelman HH IH NG K AH L M AH N
+hinkle HH IH NG K AH L
+hinkley HH IH NG K L IY
+hinkson HH IH NG K S AH N
+hinman HH IH N M AH N
+hinmen HH IH N M EH N
+hinn HH IH N
+hinnant HH IH N AH N T
+hinnenkamp HH IH N IH N K AE M P
+hinners HH IH N ER Z
+hinny HH IH N IY
+hino HH IY N OW
+hinojos HH IY N OW Y OW Z
+hinojosa HH IY N OW JH OW S AH
+hinote HH IH N OW T
+hinrichs HH IH N R IH K S
+hinrichsen HH IH N R IH K S AH N
+hinsch HH IH N SH
+hinsdale HH IH N S D EY L
+hinshaw HH IH N SH AO
+hinsley HH IH N S L IY
+hinson HH IH N S AH N
+hint HH IH N T
+hinted HH IH N T AH D
+hinted(2) HH IH N T IH D
+hinted(3) HH IH N IH D
+hinterland HH IH N T ER L AE N D
+hinterlands HH IH N T ER L AE N D Z
+hinting HH IH N T IH NG
+hinton HH IH N T AH N
+hints HH IH N T S
+hintz HH IH N T S
+hintze HH IH N T Z
+hinz HH IH N Z
+hinzack HH IH N Z AE K
+hinze HH IH N Z
+hinzman HH IH N Z M AH N
+hiott HH AY AH T
+hip HH IH P
+hip-pocket HH IH P P AA K AH T
+hipbone HH IH P B OW N
+hipbones HH IH P B OW N Z
+hipkins HH IH P K IH N Z
+hipolito IY P OW L IY T OW
+hipp HH IH P
+hippe HH IH P
+hippen HH IH P AH N
+hippensteel HH IH P IH N S T IY L
+hipper HH IH P ER
+hippert HH IH P ER T
+hippest HH IH P AH S T
+hippie HH IH P IY
+hippies HH IH P IY Z
+hipple HH IH P AH L
+hippler HH IH P L ER
+hippo HH IH P OW
+hippocampus HH IH P OW K AE M P AH S
+hippocrates HH IH P AH K R EY T S
+hippocrates(2) HH IH P AO K R AH T IY Z
+hippocratic HH IH P AH K R AE T IH K
+hippodrome HH IH P AH D R OW M
+hippolytus HH AH P AA L AH T AH S
+hippopotamus HH IH P AH P AA T AH M AH S
+hippopotamuses HH IH P AH P AA T AH M AH S IH Z
+hippos HH IH P OW Z
+hipps HH IH P S
+hips HH IH P S
+hipsher HH IH P SH ER
+hipskind HH IH P S K IH N D
+hipwell HH IH P W EH L
+hirabayashi HH IH R AH B AY AA SH IY
+hiradin HH IH R AA D IH N
+hirai HH IH R AA IY
+hiram HH AY R AH M
+hirano HH IH R AA N OW
+hirata HH IH R AA T AH
+hirayama HH IH R AA Y AA M AH
+hird HH ER D
+hire HH AY ER
+hire(2) HH AY R
+hired HH AY ER D
+hires HH AY ER Z
+hires(2) HH AY R Z
+hiriart HH IH R IY AA R T
+hiring HH AY R IH NG
+hirings HH AY R IH NG Z
+hirn HH ER N
+hiro HH IH R OW
+hiroaki HH IH R OW AA K IY
+hirohito HH IH R OW HH IY T OW
+hirohito's HH IH R OW HH IY T OW Z
+hirohito's(2) HH IH R AH HH IY T OW Z
+hirohito(2) HH IH R AH HH IY T OW
+hiromasa HH IH R OW M AA S AH
+hirons HH AO R AH N Z
+hirosakamoki HH IH R AH S AE K AH M OW K IY
+hirosakima HH IH R AH S AH K IY M AH
+hirose HH IH R OW S EY
+hiroshi HH IH R OW SH IY
+hiroshima HH IH R OW SH IY M AH
+hiroshima(2) HH IH R OW SH IH M AH
+hirota HH IH R OW T AH
+hiroyuki HH IH R OW Y UW K IY
+hirsch HH ER SH
+hirsch's HH ER SH IH Z
+hirschberg HH ER SH B ER G
+hirschfeld HH ER SH F EH L D
+hirschfield HH ER S K F IY L D
+hirschhorn HH ER SH HH ER N
+hirschi HH IH R S K IY
+hirschman HH ER SH M AH N
+hirschmann HH ER SH M AH N
+hirschy HH ER SH IY
+hirsh HH ER SH
+hirshberg HH ER SH B ER G
+hirshfield HH ER SH F IY L D
+hirshhorn HH ER SH HH AO R N
+hirshhorn(2) HH ER SH AO R N
+hirshman HH ER SH M AH N
+hirst HH ER S T
+hirst's HH ER S T S
+hirsute HH ER S UW T
+hirt HH ER T
+hirth HH ER TH
+hirtle HH ER T AH L
+hirtz HH ER T S
+hirulog HH IH R UW L AA G
+hirzel HH ER Z AH L
+his HH IH Z
+hisada HH IH S AA D AH
+hisao HH IH S AA OW
+hisaw HH AY S AO
+hiscock HH IH S K AH K
+hiscox HH IH S K AA K S
+hise HH AY Z
+hisel HH IH S AH L
+hiser HH AY Z ER
+hisey HH IH S IY
+hisham HH IH SH AH M
+hisle HH AY AH L
+hislop HH IH S L AH P
+hispanic HH IH S P AE N IH K
+hispanics HH IH S P AE N IH K S
+hispano HH IH S P AA N OW
+hispanoil HH IH S P AH N OY L
+hiss HH IH S
+hiss's HH IH S IH Z
+hissed HH IH S T
+hisself HH IH S EH L F
+hisses HH IH S IH Z
+hissing HH IH S IH NG
+hissong HH IH S AO NG
+histadrut HH IH S T AH D R AH T
+histamine HH IH S T AH M IY N
+histidine HH IH S T AH D IY N
+histogram HH IH S T AH G R AE M
+histograms HH IH S T AH G R AE M Z
+histology HH IH S T AA L AH JH IY
+historian HH IH S T AO R IY AH N
+historians HH IH S T AO R IY AH N Z
+historic HH IH S T AO R IH K
+historical HH IH S T AO R IH K AH L
+historically HH IH S T AO R IH K AH L IY
+historically(2) HH IH S T AO R IH K L IY
+histories HH IH S T ER IY Z
+histories(2) HH IH S T R IY Z
+historiography HH IH S T AO R IY AA G R AH F IY
+history HH IH S T ER IY
+history's HH IH S T ER IY Z
+history's(2) HH IH S T R IY Z
+history(2) HH IH S T R IY
+histrionic HH IH S T R IY AA N IH K
+histrionics HH IH S T R IY AA N IH K S
+hit HH IH T
+hitachi HH IH T AA CH IY
+hitch HH IH CH
+hitchcock HH IH CH K AA K
+hitchcock's HH IH CH K AA K S
+hitched HH IH CH T
+hitchens HH IH CH AH N Z
+hitches HH IH CH IH Z
+hitchhike HH IH CH HH AY K
+hitchhiked HH IH CH HH AY K T
+hitchhiker HH IH CH HH AY K ER
+hitchhikers HH IH CH HH AY K ER Z
+hitchhikes HH IH CH HH AY K S
+hitchhiking HH IH CH HH AY K IH NG
+hitching HH IH CH IH NG
+hitchings HH IH CH IH NG Z
+hitchins HH IH CH IH N Z
+hitchman HH IH CH M AH N
+hitchner HH IH CH N ER
+hite HH AY T
+hites HH AY T S
+hither HH IH DH ER
+hitherto HH IH DH ER T UW
+hitler HH IH T L ER
+hitler's HH IH T L ER Z
+hitman HH IH T M AE N
+hitoshi HH IH T OW SH IY
+hits HH IH T S
+hitschler HH IH T S L ER
+hitschler(2) HH IH CH L ER
+hitsman HH IH T S M AH N
+hitson HH IH T S AH N
+hitt HH IH T
+hitter HH IH T ER
+hitters HH IH T ER Z
+hitting HH IH T IH NG
+hittite HH IH T AY T
+hittle HH IH T AH L
+hittner HH IH T N ER
+hitty HH IH T IY
+hitz HH IH T S
+hitzeman HH IH T S M AH N
+hive HH AY V
+hively HH AY V L IY
+hives HH AY V Z
+hiway HH AY W EY
+hix HH IH K S
+hixenbaugh HH IH G Z EH N B AO
+hixon HH IH K S AH N
+hixson HH IH K S AH N
+hizbollah HH IH Z B OW L AH
+hizer HH AY Z ER
+hjelm HH AH Y EH L M
+hjelm(2) JH EH L M
+hjerpe HH AH Y ER P
+hjerpe(2) JH ER P
+hjort HH AH Y AO R T
+hjort(2) JH AO R T
+hlad HH L AE D
+hlad(2) HH AH L AE D
+hladik HH L AE D IH K
+hladik(2) HH AH L AE D IH K
+hladky HH L AE D K IY
+hladky(2) HH AH L AE D K IY
+hlavac HH L AA V AH K
+hlavac(2) HH AH L AA V AH K
+hlavacek HH L AA V AH CH EH K
+hlavacek(2) HH AH L AA V AH CH EH K
+hlavaty HH L AH V AA T IY
+hlavaty(2) HH AH L AH V AA T IY
+hmmm HH AH M
+hmong M AO NG
+hmong(2) HH M AO NG
+hmong(3) HH AH M AO NG
+hnat HH N AE T
+hnat(2) HH AH N AE T
+hnat(3) EY CH N AE T
+hnat(4) EY CH EH N EY T IY
+ho HH OW
+ho's HH OW Z
+hoadley HH OW D L IY
+hoag HH OW G
+hoagie HH OW G IY
+hoagland HH OW G L AH N D
+hoaglin HH OW G L IH N
+hoaglund HH OW G L AH N D
+hoagy HH OW G IY
+hoak HH OW K
+hoang HH OW NG
+hoar HH AO R
+hoard HH AO R D
+hoarded HH AO R D IH D
+hoarding HH AO R D IH NG
+hoards HH AO R D Z
+hoare HH AO R
+hoarse HH AO R S
+hoarseness HH AO R S N AH S
+hoary HH AO R IY
+hoax HH OW K S
+hoaxes HH OW K S IH Z
+hob HH AA B
+hoback HH OW B AE K
+hoban HH OW B AH N
+hobart HH OW B AA R T
+hobaugh HH AA B AO
+hobbes HH AA B IY Z
+hobbes(2) HH AA B Z
+hobbie HH AA B IY
+hobbies HH AA B IY Z
+hobbing HH AA B IH NG
+hobbins HH AA B IH N Z
+hobble HH AA B AH L
+hobbled HH AA B AH L D
+hobbles HH AA B AH L Z
+hobbling HH AA B AH L IH NG
+hobbling(2) HH AA B L IH NG
+hobbs HH AA B Z
+hobby HH AA B IY
+hobbyist HH AA B IY IH S T
+hobbyists HH AA B IY IH S T S
+hobbyists(2) HH AA B IY IH S S
+hobbyists(3) HH AA B IY IH S
+hobday HH AA B D EY
+hobdy HH AA B D IY
+hoben HH AA B AH N
+hoberg HH OW B ER G
+hoberman HH OW B ER M AH N
+hobert HH AA B ER T
+hobgood HH AA B G UH D
+hobin HH OW B IH N
+hoblit HH AA B L IH T
+hobnail HH AA B N EY L
+hobnob HH AA B N AA B
+hobnobbing HH AA B N AA B IH NG
+hobo HH OW B OW
+hoboes HH OW B OW Z
+hoboken HH OW B OW K AH N
+hobs HH AA B Z
+hobsbawm HH AA B S B AO M
+hobson HH AA B S AH N
+hobson's HH AA B S AH N Z
+hoc HH AA K
+hocevar HH OW S EY V AA R
+hoch HH AA K
+hochberg HH AA K B ER G
+hochbrueckner HH AA K B R AH K N ER
+hochenheim HH AO K AH N HH AY M
+hochhalter HH AA K HH AH L T ER
+hochhauser HH AA K HH AW Z ER
+hochman HH AA K M AH N
+hochmuth HH AA K M UW TH
+hochstatter HH AA K S T AH T ER
+hochstedler HH AA K S T IH D AH L ER
+hochstedler(2) HH AA K S T EH D L ER
+hochstein HH AA K S T AY N
+hochstein(2) HH AA K S T IY N
+hochstetler HH AA K S T IH T AH L ER
+hochstetler(2) HH AA K S T EH T L ER
+hochtief HH AA K T IY F
+hock HH AA K
+hockaday HH AA K AH D EY
+hockberg HH AA K B ER G
+hockenberry HH AA K AH N B EH R IY
+hockenbury HH AA K AH N B EH R IY
+hockensmith HH AA K AH N S M IH TH
+hocker HH AA K ER
+hockersmith HH AA K ER S M IH TH
+hockett HH AA K IH T
+hockey HH AA K IY
+hockey's HH AA K IY Z
+hockin HH AA K IH N
+hocking HH AA K IH NG
+hockley HH AA K L IY
+hockman HH AA K M AH N
+hockney HH AA K N IY
+hockney's HH AA K N IY Z
+hoctor HH AA K T ER
+hocus HH OW K AH S
+hocutt HH AA K AH T
+hodak HH OW D AH K
+hodapp HH AA D AH P
+hodde HH AA D
+hodder HH AA D ER
+hodding HH AA D IH NG
+hoddur HH AA D ER
+hodel HH OW D AH L
+hodes HH OW D Z
+hodgdon HH AA JH D AH N
+hodge HH AA JH
+hodge's HH AA JH IH Z
+hodgen HH AA JH AH N
+hodgens HH AA JH AH N Z
+hodgepodge HH AA JH P AA JH
+hodges HH AA JH IH Z
+hodgin HH AA JH IH N
+hodgins HH AA JH IH N Z
+hodgkin HH AA JH K IH N
+hodgkin's HH AA JH K IH N Z
+hodgkins HH AA JH K IH N Z
+hodgkinson HH AA JH K IH N S AH N
+hodgkiss HH AA JH K IH S
+hodgman HH AA JH M AH N
+hodgman's HH AA JH M AH N Z
+hodgson HH AA JH S AH N
+hodkinson HH AA D K IH N S AH N
+hodnett HH AA D N IH T
+hodo HH OW D OW
+hodsdon HH AA D Z D AH N
+hodson HH AA D S AH N
+hoe HH OW
+hoechst HH OW K S T
+hoechst's HH OW K S T S
+hoechst's(2) HH OW SH T S
+hoechst(2) HH OW SH T
+hoeck HH OW K
+hoecker HH OW K ER
+hoedown HH OW D AW N
+hoefer HH OW F ER
+hoeffner HH OW F N ER
+hoefle HH OW F AH L
+hoefler HH OW F AH L ER
+hoefler(2) HH OW F L ER
+hoeflich HH OW F L IH K
+hoefling HH OW F AH L IH NG
+hoefling(2) HH OW F L IH NG
+hoefs HH OW F S
+hoeft HH OW F T
+hoeg HH OW G
+hoeger HH OW G ER
+hoehn HH OW N
+hoehne HH OW N
+hoeing HH OW IH NG
+hoek HH OW K
+hoeksema HH OW K S IH M AH
+hoekstra HH OW K S T R AH
+hoel HH OW L
+hoell HH OW L
+hoelle HH OW L
+hoelscher HH OW L SH ER
+hoelterhoff HH OW L T ER HH AO F
+hoelterhoff's HH OW L T ER HH AO F S
+hoelting HH OW L T IH NG
+hoelzel HH OW L Z AH L
+hoelzer HH OW L Z ER
+hoen HH OW N
+hoene HH AA IY N
+hoener HH OW N ER
+hoenig HH OW N IH G
+hoeper HH OW P ER
+hoepfner HH OW P F N ER
+hoepfner(2) HH OW P N ER
+hoepner HH OW P N ER
+hoeppner HH OW P N ER
+hoerig HH AO R IH G
+hoerner HH AO R N ER
+hoerr HH AO R
+hoes HH OW Z
+hoesch HH OW SH
+hoeschen HH OW SH AH N
+hoesly HH OW S L IY
+hoeveler HH OW V L ER
+hoevet HH OW V EH T
+hoevet's HH OW V EH T S
+hoey HH OW IY
+hof HH AA F
+hofacker HH AA F AH K ER
+hofbauer HH AA F B AW ER
+hofer HH OW F ER
+hoff HH AO F
+hoffa HH AO F AH
+hoffa's HH AO F AH Z
+hoffacker HH AO F AH K ER
+hoffart HH AO F AA R T
+hoffarth HH AO F AA R TH
+hoffecker HH AO F IH K ER
+hoffenberg HH AO F AH N B ER G
+hoffenberg's HH AA F AH N B ER G Z
+hoffer HH AA F ER
+hofferber HH AO F ER B ER
+hoffert HH AO F ER T
+hoffitz HH AA F IH T S
+hoffler HH AO F AH L ER
+hoffler(2) HH AO F L ER
+hoffman HH AO F M AH N
+hoffman's HH AO F M AH N Z
+hoffmann HH AO F M AH N
+hoffmaster HH AO F M AE S T ER
+hoffmeier HH AO F M AY ER
+hoffmeister HH AO F M AY S T ER
+hoffmeyer HH AO F M AY ER
+hoffner HH AO F N ER
+hoffpauir HH AO F P AW ER
+hofi HH OW F IY
+hofland HH AA F L AH N D
+hofler HH AA F L ER
+hofman HH AA F M AH N
+hofmann HH AA F M AH N
+hofmeister HH AA F M AY S T ER
+hofrichter HH AA F R IH K T ER
+hofstad HH AA F S T AE D
+hofstetter HH AA F S T EH T ER
+hofstra HH AA F S T R AH
+hog HH AA G
+hogan HH OW G AA N
+hogan's HH OW G AA N Z
+hogan(2) HH OW G AH N
+hogans HH OW G AA N Z
+hogans(2) HH OW G AH N Z
+hoganson HH AA G AH N S AH N
+hogarth HH OW G AA R TH
+hogarty HH AA G AA R T IY
+hogberg HH AA G B ER G
+hoge HH OW JH
+hogeland HH AA G IH L AH N D
+hogeland(2) HH OW G L AH N D
+hogen HH AA G AH N
+hogenson HH AA JH IH N S AH N
+hoger HH OW G ER
+hogg HH AA G
+hoggan HH AA G AH N
+hoggard HH AA G ER D
+hoggart HH AA G ER T
+hoggatt HH AA G AH T
+hogge HH AA G
+hogging HH AO G IH NG
+hogland HH AA G L AH N D
+hogle HH OW G AH L
+hoglund HH AO G L AH N D
+hoglund's HH AO G L AH N D Z
+hoglunds HH AO G L AH N D Z
+hognose HH AA G N OW Z
+hogrefe HH AA G R IH F
+hogs HH AA G Z
+hogsed HH OW G S T
+hogsett HH AA G S IH T
+hogston HH AA G S T AH N
+hogue HH OW G
+hogwash HH AA G W AA SH
+hogwood HH AO G W UH D
+hoh HH OW
+hoheisel HH OW AY S AH L
+hohenberger HH OW AH N B ER G ER
+hohensee HH AA HH IH N S IY
+hohenstein HH OW AH N S T AY N
+hohenstein(2) HH OW AH N S T IY N
+hohl HH OW L
+hohler HH OW L ER
+hohlt HH OW L T
+hohman HH OW M AH N
+hohmann HH OW M AH N
+hohn HH AA N
+hohner HH OW N ER
+hohnstein HH OW N S T AY N
+hohnstein(2) HH OW N S T IY N
+hoho HH OW HH OW
+hohorst HH OW HH AO R S T
+hohos HH OW HH OW Z
+hohum HH OW HH AH M
+hoi HH OY
+hoiland HH OY L AE N D
+hoilman HH OY L M AH N
+hoisington HH OY Z IH NG T AH N
+hoist HH OY S T
+hoisted HH OY S T AH D
+hoisted(2) HH OY S T IH D
+hoisting HH OY S T IH NG
+hoists HH OY S T S
+hoists(2) HH OY S S
+hoists(3) HH OY S
+hoit HH OY T
+hoity HH OY T IY
+hoium HH AA IY AH M
+hojnacki HH AH Y N AA T S K IY
+hok HH AO K
+hokanson HH AA K AH N S AH N
+hoke HH OW K
+hokenson HH AA K IH N S AH N
+hokey HH OW K IY
+hokkaido HH OW K AY D OW
+hokum HH OW K AH M
+hokuriku HH AA K ER IY K UW
+hola HH OW L AH
+holaday HH OW L AH D EY
+holahan HH AA L AH HH AE N
+holan HH OW L AH N
+holaway HH OW L AH W EY
+holbein HH OW L B AY N
+holben HH OW L B AH N
+holberg HH OW L B ER G
+holbert HH OW L B ER T
+holbrook HH OW L B R UH K
+holbrooke HH OW L B R UH K
+holbrooke's HH OW L B R UH K S
+holbrooks HH OW L B R UH K S
+holck HH OW L K
+holcomb HH OW L K AH M
+holcombe HH OW L K AH M
+hold HH OW L D
+holda HH OW L D AH
+holdaway HH OW L D AH W EY
+holde HH OW L D
+holdeman HH OW L D M AH N
+holden HH OW L D AH N
+holden's HH OW L D AH N Z
+holder HH OW L D ER
+holder's HH OW L D ER Z
+holderbank HH OW L D ER B AE NG K
+holderbaum HH OW L D ER B AW M
+holderby HH OW L D ER B IY
+holderfield HH OW L D ER F IY L D
+holderman HH OW L D ER M AH N
+holderness HH OW L D ER N AH S
+holders HH OW L D ER Z
+holders' HH OW L D ER Z
+holdfast HH OW L F AE S T
+holding HH OW L D IH NG
+holding's HH OW L D IH NG Z
+holdings HH OW L D IH NG Z
+holdings' HH OW L D IH NG Z
+holdman HH OW L D M AH N
+holdorf HH OW L D AO R F
+holdout HH OW L D AW T
+holdouts HH OW L D AW T S
+holdover HH OW L D OW V ER
+holdovers HH OW L D OW V ER Z
+holdren HH OW L D ER AH N
+holdridge HH OW L D R IH JH
+holds HH OW L D Z
+holdsworth HH OW L D Z W ER TH
+holdup HH OW L D AH P
+holdups HH OW L D AH P S
+hole HH OW L
+holecek HH AA L IH CH EH K
+holed HH OW L D
+holeman HH OW L M AH N
+holen HH OW L AH N
+holes HH OW L Z
+holewinski HH AH L UW IH N S K IY
+holford HH OW L F ER D
+holgate HH OW L G EY T
+holgerson HH OW L G ER S AH N
+holguin HH OW L G IH N
+holian HH OW L IY AH N
+holick HH AA L IH K
+holiday HH AA L AH D EY
+holiday's HH AA L AH D EY Z
+holiday(2) HH AA L IH D EY
+holidays HH AA L AH D EY Z
+holidaysburg HH AA L AH D EY Z B ER G
+holien HH OW L IY AH N
+holier HH OW L IY ER
+holiest HH OW L IY IH S T
+holifield HH AA L IH F IY L D
+holihan HH AA L IH HH AE N
+holik HH OW L IH K
+holiman HH AA L IH M AH N
+holiness HH OW L IY N AH S
+holing HH OW L IH NG
+holistic HH OW L IH S T IH K
+holl HH AA L
+hollabaugh HH AA L AH B AO
+holladay HH AA L AH D EY
+hollan HH AA L AH N
+holland HH AA L AH N D
+holland's HH AA L AH N D Z
+hollander HH AA L AH N D ER
+hollanders HH AA L AH N D ER Z
+hollands HH AA L AH N D Z
+hollandsworth HH AA L AH N D Z W ER TH
+hollar HH AA L ER
+hollars HH AA L ER Z
+hollatz HH AA L AH T S
+hollaway HH AA L AH W EY
+holle HH AA L
+holleman HH OW L M AH N
+hollen HH AA L AH N
+hollenbach HH AA L IH N B AA K
+hollenback HH AA L AH N B AE K
+hollenbaugh HH AH L EH N B AO
+hollenbeck HH AA L AH N B EH K
+hollenberg HH AA L AH N B ER G
+hollender HH AA L EH N D ER
+hollenkamp HH AA L IH N K AE M P
+holler HH AA L ER
+holleran HH AA L ER AH N
+hollerbach HH AA L ER B AA K
+hollered HH AA L ER D
+hollering HH AA L ER IH NG
+hollern HH AA L ER N
+hollers HH AA L ER Z
+hollett HH AA L IH T
+holley HH AA L IY
+hollibaugh HH AA L IH B AO
+hollick HH AA L IH K
+holliday HH AA L IH D EY
+holliday's HH AA L IH D EY Z
+hollie HH AA L IY
+hollier HH AO L IY ER
+hollies HH AA L IY Z
+hollifield HH AA L IH F IY L D
+holliman HH AA L IH M AH N
+holliman's HH AA L IH M AH N Z
+hollimon HH AA L IH M AH N
+hollin HH AA L IH N
+holling HH AA L IH NG
+hollinger HH AA L IH NG ER
+hollings HH AA L IH NG Z
+hollings(2) HH AA L IH NG G Z
+hollingshead HH AA L IH NG Z HH EH D
+hollingsworth HH AA L IH NG Z W ER TH
+hollingworth HH AA L IH NG G W ER TH
+hollins HH AA L IH N Z
+hollinshead HH AA L IH N S HH EH D
+hollinshead(2) HH AA L IH N Z HH EH D
+hollinsworth HH AA L IH N S W ER TH
+hollinsworth(2) HH AA L IH N Z W ER TH
+hollis HH AA L IH S
+hollister HH AA L IH S T ER
+holliston HH AA L IH S T AH N
+hollman HH AA L M AH N
+hollmann HH AA L M AH N
+hollo HH AA L OW
+hollobaugh HH AA L AH B AO
+hollom HH AO L AH M
+holloman HH AA L OW M AH N
+hollomon HH AA L AH M AA N
+hollon HH AA L AH N
+hollopeter HH AA L AH P IY T ER
+holloran HH AA L ER AH N
+hollow HH AA L OW
+hollow's HH AA L OW Z
+holloway HH AA L OW W EY
+hollowed HH AA L OW D
+hollowell HH AA L AH W EH L
+hollowing HH AA L OW IH NG
+hollows HH AA L OW Z
+hollstein HH AA L S T AY N
+hollstein(2) HH AA L S T IY N
+holly HH AA L IY
+holly's HH AA L IY Z
+hollyfield HH AA L IH F IY L D
+hollyfield(2) HH AA L IY F IY L D
+hollyhead HH AO L IY HH EH D
+hollyhock HH AA L IY HH AA K
+hollyhocks HH AA L IY HH AA K S
+hollywood HH AA L IY W UH D
+hollywood's HH AA L IY W UH D Z
+holm HH OW M
+holman HH AA L M AH N
+holmberg HH OW L M B ER G
+holmdale HH OW L M D EY L
+holme HH OW L M
+holmen HH AA L M EH N
+holmer HH OW L M ER
+holmes HH OW M Z
+holmes's HH OW M Z IH Z
+holmes's(2) HH OW L M Z IH Z
+holmes(2) HH OW L M Z
+holmgren HH OW L M G R EH N
+holmium HH OW L M IY AH M
+holmlund HH OW L M L AH N D
+holmquest HH OW L M K W EH S T
+holmquist HH OW L M K W IH S T
+holmstrom HH OW L M S T R AH M
+holness HH AA L N IH S
+holocaust HH AA L AH K AO S T
+hologram HH AA L AH G R AE M
+holograms HH AA L AH G R AE M Z
+holographic HH AA L AH G R AE F IH K
+holohan HH AA L AH HH AE N
+holquin HH OW L K W IH N
+holroyd HH OW L R OY D
+holsapple HH OW L S AH P AH L
+holscher HH OW L SH ER
+holsclaw HH OW L S K L AO
+holsey HH OW L S IY
+holshouser HH OW L S HH AW S ER
+holsinger HH OW L S IH NG ER
+holsomback HH OW L S AH M B AE K
+holsonback HH OW L S AH N B AE K
+holsopple HH OW L S AH P AH L
+holst HH OW L S T
+holstad HH OW L S T AH D
+holste HH OW L S T
+holstead HH OW L S T EH D
+holstein HH OW L S T IY N
+holsten HH OW L S AH N
+holster HH OW L S T ER
+holstine HH OW L S T AY N
+holston HH OW L S T AH N
+holstrom HH OW L S T R AH M
+holsworth HH OW L S W ER TH
+holt HH OW L T
+holt's HH OW L T S
+holtan HH OW L T AH N
+holte HH OW L T
+holten HH OW L T AH N
+holter HH OW L T ER
+holterman HH OW L T ER M AH N
+holthaus HH OW L T HH AW S
+holthus HH OW L TH AH S
+holtkamp HH OW L T K AE M P
+holtman HH OW L T M AH N
+holtmann HH OW L T M AH N
+holton HH OW L T AH N
+holtorf HH OW L T ER F
+holtrop HH OW L T R AH P
+holtry HH OW L T R IY
+holts HH OW L T S
+holtsclaw HH OW L T S K L AO
+holtz HH OW L T S
+holtz's HH OW L T S IH Z
+holtzapple HH OW L T Z AH P AH L
+holtzclaw HH OW L T S K L AO
+holtzer HH OW L T Z ER
+holtzinger HH OW L T Z IH NG ER
+holtzman HH OW L T S M AH N
+holub HH OW L AH B
+holum HH OW L AH M
+holven HH AO L V EH N
+holverson HH AA L V ER S AH N
+holvis HH OW L V AH S
+holvis' HH OW L V AH S
+holvis's HH OW L V AH S IH Z
+holway HH AA L W EY
+holweger HH OW L W IH G ER
+holwerda HH OW L W ER D AH
+holy HH OW L IY
+holycross HH OW L IY K R AO S
+holyfield HH OW L IY F IY L D
+holyoak HH OW L IY OW K
+holyoke HH OW L IY OW K
+holz HH OW L Z
+holzapfel HH OW L Z AH P F AH L
+holzer HH OW L Z ER
+holzhauer HH OW L Z HH AW ER
+holzhauser HH OW L Z HH AW Z ER
+holzheimer HH OW L Z HH AY M ER
+holzinger HH OW L Z IH NG ER
+holzman HH OW L Z M AH N
+holzmann HH OW L Z M AH N
+holzschuh HH OW L SH UW
+holzstoff HH OW L S T AO F
+holzwarth HH OW L Z W ER TH
+holzworth HH OW L Z W ER TH
+hom HH AA M
+homa HH OW M AH
+homac HH OW M AE K
+homage AA M AH JH
+homage(2) HH AA M AH JH
+homages AA M AH JH AH Z
+homages(2) HH AA M AH JH AH Z
+homan HH OW M AH N
+homann HH OW M AH N
+homans HH OW M AH N Z
+homart HH OW M AA R T
+hombre HH AA M B R AH
+homburg HH AA M B ER G
+home HH OW M
+home's HH OW M Z
+home-made HH OW M M EY D
+home-school HH OW M S K UW L
+homebound HH OW M B AW N D
+homeboys HH OW M B OY Z
+homebuilder HH OW M B IH L D ER
+homebuilder's HH OW M B IH L D ER Z
+homebuilders HH OW M B IH L D ER Z
+homebuilding HH OW M B IH L D IH NG
+homebuyer HH OW M B AY ER
+homebuyers HH OW M B AY ER Z
+homecare HH OW M K EH R
+homeclub HH OW M K L AH B
+homecoming HH OW M K AH M IH NG
+homed HH OW M D
+homedco HH OW M EH D K OW
+homefed HH OW M F EH D
+homefed's HH OW M F EH D Z
+homefront HH OW M F R AH N T
+homegrown HH OW M G R OW N
+homeland HH OW M L AE N D
+homeland's HH OW M L AE N D Z
+homelands HH OW M L AE N D Z
+homeless HH OW M L AH S
+homelessness HH OW M L AH S N AH S
+homelike HH OW M L AY K
+homely HH OW M L IY
+homemade HH OW M M EY D
+homemade(2) HH OW M EY D
+homemaker HH OW M M EY K ER
+homemakers HH OW M M EY K ER Z
+homemaking HH OW M M EY K IH NG
+homen HH OW M AH N
+homeopathic HH OW M IY OW P AE TH AH K
+homeopathy HH OW M IY OW P AE TH IY
+homeostasis HH OW M IY OW S T EY S AH S
+homeostatic HH OW M IY OW S T AE T IH K
+homeowner HH OW M OW N ER
+homeowner's HH OW M OW N ER Z
+homeowners HH OW M OW N ER Z
+homeowners' HH OW M OW N ER Z
+homeownership HH OW M OW N ER SH IH P
+homeporting HH OW M P AO R T IH NG
+homer HH OW M ER
+homer's HH OW M ER Z
+homeric HH OW M EH R IH K
+homers HH OW M ER Z
+homerun HH OW M R AH N
+homeruns HH OW M R AH N Z
+homes HH OW M Z
+homes' HH OW M Z
+homesick HH OW M S IH K
+homesickness HH OW M S IH K N AH S
+homesley HH OW M Z L IY
+homespun HH OW M S P AH N
+homestake HH OW M S T EY K
+homestake's HH OW M S T EY K S
+homestate HH OW M S T EY T
+homestead HH OW M S T EH D
+homestead's HH OW M S T EH D Z
+homesteaded HH OW M S T EH D IH D
+homesteader HH OW M S T EH D ER
+homesteaders HH OW M S T EH D ER Z
+homesteads HH OW M S T EH D Z
+homestretch HH OW M S T R EH CH
+hometown HH OW M T AW N
+hometowns HH OW M T AW N Z
+homeward HH OW M W ER D
+homewood HH OW M W UH D
+homework HH OW M W ER K
+homeworker HH OW M W ER K ER
+homeworkers HH OW M W ER K ER Z
+homey HH OW M IY
+homeyer HH OW M IY ER
+homicidal HH AA M AH S AY D AH L
+homicide HH AA M AH S AY D
+homicides HH AA M AH S AY D Z
+homiletic HH AA M AH L EH T IH K
+homilies HH OW M AH L IY Z
+homily HH AA M AH L IY
+hominem HH AA M IH N EH M
+homing HH OW M IH NG
+hominid HH AA M AH N IH D
+hominy HH AA M IH N IY
+homme HH AA M
+hommel HH AA M AH L
+hommes HH AA M Z
+homo HH OW M OW
+homo-erectus HH OW M OW IH R EH K T AH S
+homogeneity HH AA M AH JH AH N IY AH T IY
+homogeneous HH OW M AH JH IY N IY AH S
+homogenization HH OW M AA JH AH N IH Z EY SH AH N
+homogenize HH OW M AA JH AH N AY Z
+homogenized HH OW M AA JH AH N AY Z D
+homogenous HH AH M AA JH AH N AH S
+homogeny HH OW M AA JH AH N IY
+homola HH AH M AA L AH
+homolka HH AH M AA L K AH
+homologous HH AH M AA L AH G AH S
+homonym HH AO M AH N IH M
+homonyms HH AO M AH N IH M Z
+homophobia HH OW M AH F OW B IY AH
+homophobic HH OW M AH F OW B IH K
+homophone HH AO M AH F OW N
+homophones HH AO M AH F OW N Z
+homosapien HH OW M OW S EY P IY AH N
+homosapiens HH OW M OW S EY P IY AH N Z
+homosexual HH OW M OW S EH K SH AH W AH L
+homosexuality HH OW M OW S EH K SH AH W AE L AH T IY
+homosexuals HH OW M OW S EH K SH AH W AH L Z
+homosporous HH AH M AA S P ER AH S
+homozygote HH OW M OW Z AY G OW T
+homozygous HH OW M OW Z AY G AH S
+homrich HH AA M R IH K
+homs HH AA M Z
+homsey HH AA M Z IY
+homuth HH AA M UW TH
+hon HH AA N
+hon(2) HH AH N
+hon(3) AH N ER AH B AH L
+honaker HH AA N AH K ER
+honan HH OW N AH N
+honasan HH AA N AH Z AH N
+honcho HH AO N CH OW
+honda HH AO N D AH
+honda's HH AA N D AH Z
+hondas HH AA N D AH S
+honderich HH AA N D ER IH K
+hondo HH AA N D OW
+honduran HH AA N D UH R AH N
+hondurans HH AA N D UH R AH N Z
+honduras HH AA N D UH R AH S
+hone HH OW N
+honea HH AA N IY AH
+honeck HH OW N EH K
+honecker HH OW N EH K ER
+honecker's HH OW N EH K ER Z
+honed HH OW N D
+honer HH OW N ER
+hones HH OW N Z
+honest AA N AH S T
+honestly AA N AH S T L IY
+honestly(2) AA N AH S L IY
+honestok HH OW N AH S T AO K
+honesty AA N AH S T IY
+honey HH AH N IY
+honeybee HH AH N IY B IY
+honeybees HH AH N IY B IY Z
+honeycomb HH AH N IY K OW M
+honeycutt HH AH N IY K AH T
+honeydew HH AH N IY D UW
+honeyman HH AA N IY M AH N
+honeymoon HH AH N IY M UW N
+honeymooned HH AH N IY M UW N D
+honeymooner HH AH N IY M UW N ER
+honeymooners HH AH N IY M UW N ER Z
+honeymoons HH AH N IY M UW N Z
+honeys HH AH N IY Z
+honeysuckle HH AH N IY S AH K AH L
+honeysuckles HH AH N IY S AH K AH L Z
+honeywell HH AH N IY W EH L
+honeywell's HH AH N IY W EH L Z
+hong HH AO NG
+hong-kong HH AO NG K AO NG
+hongkong HH AO NG K AO NG
+hongwei HH AO NG W EY
+honig HH AA N IH G
+honing HH OW N IH NG
+honk HH AA NG K
+honk(2) HH AO NG K
+honking HH AO NG K IH NG
+honky HH AO NG K IY
+honn HH AA N
+honnold HH AA N OW L D
+honold HH AA N OW L D
+honolulu HH AA N AH L UW L UW
+honolulu's HH AA N AH L UW L UW Z
+honor AA N ER
+honor's AA N ER Z
+honora AO N AO R AH
+honorable AA N ER AH B AH L
+honorably AA N ER AH B L IY
+honoraria AA N ER EH R IY AH
+honorarium AA N ER EH R IY AH M
+honorariums AA N ER EH R IY AH M Z
+honorary AA N ER EH R IY
+honore AA N ER
+honored AA N ER D
+honoree AA N ER IY
+honorees AA N ER IY Z
+honoria AA N ER IY AH
+honorific AA N ER IH F IH K
+honoring AA N ER IH NG
+honors AA N ER Z
+hons HH AA N Z
+honsberger HH AA N S B ER G ER
+honse HH AA N S
+honshu HH AA N SH UW
+honsinger HH AA N S IH NG ER
+hontz HH AA N T S
+hoo HH UW
+hoobler HH UW B L ER
+hooch HH UW CH
+hoochie HH UW CH IY
+hoock HH UW K
+hood HH UH D
+hooded HH UH D IH D
+hoodlum HH UH D L AH M
+hoodlums HH UW D L AH M Z
+hoods HH UH D Z
+hoodwink HH UH D W IH NG K
+hoodwinked HH UH D W IH NG K T
+hooey HH UW IY
+hoof HH UW F
+hoofed HH UH F T
+hoofed(2) HH UW F T
+hoofs HH UH F S
+hoofs(2) HH UW F S
+hoog HH UW G
+hooge HH UW JH
+hoogland HH UW G L AH N D
+hoogovens HH UW G AH V IH N Z
+hook HH UH K
+hook's HH UH K S
+hooke HH UH K
+hooked HH UH K T
+hooker HH UH K ER
+hooker's HH UH K ER Z
+hookers HH UH K ER Z
+hooking HH UH K IH NG
+hooks HH UH K S
+hookup HH UH K AH P
+hookups HH UH K AH P S
+hookworm HH UH K W ER M
+hookworms HH UH K W ER M Z
+hooky HH UH K IY
+hoole HH UW L
+hooley HH UW L IY
+hooligan HH UW L IH G AH N
+hooliganism HH UW L IH G AH N IH Z AH M
+hooligans HH UW L IH G AH N Z
+hoolihan HH UW L IH HH AE N
+hoolihan's HH UW L IH HH AE N Z
+hoon HH UW N
+hoonah HH UW N AH
+hoop HH UW P
+hooper HH UW P ER
+hooperman HH UW P ER M AH N
+hoopes HH UW P S
+hoopingarner HH UW P IH NG G AA R N ER
+hoopla HH UW P L AA
+hoopoe HH UW P UW
+hoops HH UW P S
+hooray HH UH R EY
+hoos HH UW Z
+hoose HH UW S
+hooser HH UW Z ER
+hoosier HH UW ZH ER
+hoosiers HH UW Z Y ER Z
+hoot HH UW T
+hooted HH UW T IH D
+hooten HH UW T AH N
+hooter HH UW T ER
+hooters HH UW T ER Z
+hootie HH UW T IY
+hootman HH UW T M AH N
+hooton HH UW T AH N
+hoots HH UW T S
+hooven HH UW V AH N
+hoover HH UW V ER
+hoover's HH UW V ER Z
+hooves HH UH V Z
+hooves(2) HH UW V Z
+hoovler HH UW V L ER
+hop HH AA P
+hopalong HH AA P AH L AO NG
+hopburg HH AA P B ER G
+hopburg's HH AA P B ER G Z
+hope HH OW P
+hope's HH OW P S
+hoped HH OW P T
+hopeful HH OW P F AH L
+hopefully HH OW P F AH L IY
+hopefulness HH OW P F AH L N IH S
+hopefuls HH OW P F AH L Z
+hopeless HH OW P L AH S
+hopelessly HH OW P L AH S L IY
+hopelessness HH OW P L AH S N AH S
+hopes HH OW P S
+hopewell HH OW P W EH L
+hopf HH AA P F
+hopfensperger HH AA P F IH N S P ER G ER
+hopfensperger(2) HH AA F IH N S P ER G ER
+hopfer HH AA P F ER
+hopfinger HH AA P F IH NG ER
+hopgood HH AA P G UH D
+hopi HH OW P IY
+hoping HH OW P IH NG
+hopke HH OW P K
+hopkin HH AA P K IH N
+hopkin's HH AA P K IH N Z
+hopkins HH AA P K IH N Z
+hopkins' HH AA P K IH N Z
+hopkinson HH AA P K IH N S AH N
+hopkinton HH AA P K IH N T AH N
+hopkyns HH AA P K IH N Z
+hopman HH AA P M AH N
+hopp HH AA P
+hoppa HH AA P AH
+hoppe HH AA P
+hopped HH AA P T
+hoppel HH AA P AH L
+hopper HH AA P ER
+hopper's HH AA P ER Z
+hoppers HH AA P ER Z
+hoppert HH AA P ER T
+hoppes HH AA P S
+hopping HH AA P IH NG
+hopple HH AA P AH L
+hopps HH AA P S
+hoppy HH AO P IY
+hops HH AA P S
+hopscotch HH AA P S K AA CH
+hopscotched HH AA P S K AA CH T
+hopson HH AA P S AH N
+hopton HH AA P T AH N
+hopwood HH AA P W UH D
+hora HH AO R AH
+horace HH AO R AH S
+horace's HH AO R AH S AH Z
+horace(2) HH AO R IH S
+horacek HH AO R AH CH EH K
+horacia HH AO R AA S IY AH
+horacio HH AO R EY S IY OW
+horak HH AO R AH K
+horan HH AO R AH N
+horatia HH AO R AA SH AH
+horatian HH ER EY SH AH N
+horatio HH ER EY SH OW
+horatio's HH AO R EY SH IY OW Z
+horatius HH AO R EY SH AH S
+horch HH AO R K
+horchow HH AO R CH OW
+hord HH AO R D
+horde HH AO R D
+hordes HH AO R D Z
+horehound HH AA R HH AW N D
+horejsi HH AO R EY Y S IY
+horelick HH AO R AH L IH K
+horen HH AO R AH N
+horenstein HH AO R AH N S T AY N
+horenstein(2) HH AO R AH N S T IY N
+horgan HH AO R G AH N
+horgavitt HH AO R G AH V IH T
+horger HH AO R G ER
+hori HH AO R IY
+horiguchi HH AO R IH G UW CH IY
+horine HH AO R IY N
+horiuchi HH AO R IY UW CH IY
+horizon HH ER AY Z AH N
+horizon's HH ER AY Z AH N Z
+horizons HH ER AY Z AH N Z
+horizontal HH AO R AH Z AA N T AH L
+horizontally HH AO R IH Z AA N T AH L IY
+horizontally(2) HH AO R IH Z AO N AH L IY
+horkey HH AO R K IY
+horky HH AO R K IY
+horlacher HH AO R L AH K ER
+horlick HH AO R L IH K
+horman HH AO R M AH N
+hormann HH AO R M AH N
+hormats HH AO R M AE T S
+hormel HH AO R M EH L
+hormonal HH AO R M OW N AH L
+hormone HH AO R M OW N
+hormones HH AO R M OW N Z
+hormuz HH AO R M UW Z
+horn HH AO R N
+horn's HH AO R N Z
+hornack HH AO R N AH K
+hornaday HH AO R N AH D EY
+hornak HH AO R N AH K
+hornback HH AO R N B AE K
+hornbaker HH AO R N B AH K ER
+hornbeak HH AO R N B AH K
+hornbeck HH AO R N B EH K
+hornberger HH AO R N B ER G ER
+hornbill HH AO R N B IH L
+hornbills HH AO R N B IH L Z
+hornblende HH AO R N B L EH N D
+hornblower HH AO R N B L OW ER
+hornbook HH AO R N B UH K
+hornbostel HH AO R N B AH S T AH L
+hornbostel(2) HH AO R N B AH S AH L
+hornbrook HH AO R N B R UH K
+hornbuckle HH AO R N B AH K AH L
+hornburg HH AO R N B ER G
+hornby HH AO R N B IY
+horne HH AO R N
+horned HH AO R N D
+hornell HH AO R N EH L
+horner HH AO R N ER
+hornere HH AO R N ER
+hornet HH AO R N IH T
+hornet's HH AO R N AH T S
+hornets HH AO R N AH T S
+horney HH AO R N IY
+hornick HH AO R N IH K
+hornig HH AO R N IH G
+hornik HH AO R N IH K
+horning HH AO R N IH NG
+hornless HH AO R N L AH S
+hornlike HH AO R N L AY K
+hornor HH AO R N ER
+hornpipe HH AO R N P AY P
+horns HH AO R N Z
+hornsby HH AO R N Z B IY
+hornstein HH AO R N S T AY N
+hornstein(2) HH AO R N S T IY N
+hornung HH AO R N AH NG
+horny HH AO R N IY
+hornyak HH AO R N Y AE K
+horoscope HH AO R AH S K OW P
+horoscopes HH AO R AH S K OW P S
+horovitz HH AA R AH V IH T S
+horowitz HH AO R OW IH T S
+horr HH AO R
+horrell HH AO R AH L
+horrendous HH AO R EH N D AH S
+horrendously HH AO R EH N D AH S L IY
+horrible HH AO R AH B AH L
+horribly HH AO R AH B L IY
+horrid HH AO R AH D
+horrific HH AO R IH F IH K
+horrified HH AO R AH F AY D
+horrify HH AO R AH F AY
+horrifying HH AO R AH F AY IH NG
+horrigan HH AO R AH G AH N
+horrocks HH AO R AH K S
+horror HH AO R ER
+horrors HH AO R ER Z
+hors HH AO R Z
+hors(2) AO R
+hors-d-oeuvre AO R D ER V
+horsch HH AO R SH
+horse HH AO R S
+horse's HH AO R S AH Z
+horseback HH AO R S B AE K
+horsed HH AO R S T
+horseflesh HH AO R S F L EH SH
+horsehead HH AO R S HH EH D
+horsely HH AO R S L IY
+horseman HH AO R S M AH N
+horsemanship HH AO R S M AH N SH IH P
+horsemen HH AO R S M AH N
+horseplay HH AO R S P L EY
+horsepower HH AO R S P AW ER
+horseradish HH AO R S R AE D IH SH
+horses HH AO R S AH Z
+horses' HH AO R S IH Z
+horses(2) HH AO R S IH Z
+horseshoe HH AO R S SH UW
+horseshoes HH AO R S SH UW Z
+horsetail HH AO R S T EY L
+horsetails HH AO R S T EY L Z
+horsey HH AO R S IY
+horsfall HH AO R S F AH L
+horsham HH AO R SH AH M
+horsham's HH AO R SH AH M Z
+horsing HH AO R S IH NG
+horsley HH AO R S L IY
+horsman HH AO R S M AH N
+horst HH AO R S T
+horstman HH AO R S T M AH N
+horstmann HH AO R S T M AH N
+horta HH AO R T AH
+horten HH AO R T AH N
+horter HH AO R T ER
+horticultural HH AO R T AH K AH L CH ER AH L
+horticulture HH AO R T IH K AH L CH ER
+horticulturist HH AO R T IH K AH L CH ER IH S T
+hortman HH AO R T M AH N
+horton HH AO R T AH N
+horus HH AO R AH S
+horvac HH AO R V AE K
+horvac's HH AO R V AE K S
+horvat HH AO R V AH T
+horvath HH AO R V AE TH
+horvath's HH AO R V AE TH S
+horvitz HH AO R V IH T S
+horwath HH AO R W AO TH
+horwich HH AO R W IH K
+horwitz HH AO R W IH T S
+hosack HH AA S AH K
+hosakawa HH OW S AH K AA W AH
+hosch HH AO SH
+hose HH OW Z
+hosea HH OW S IY AH
+hosea's HH OW Z IY AH Z
+hosea's(2) HH OW Z EY AH Z
+hosea(2) HH OW Z EY AH
+hosed HH OW Z D
+hosek HH OW S EH K
+hoselton HH AH S EH L T AH N
+hoses HH OW Z IH Z
+hosey HH OW Z IY
+hosford HH AA S F ER D
+hoshaw HH AA SH AO
+hoshimoto HH OW SH IY M OW T OW
+hosick HH AA S IH K
+hosie HH OW Z IY
+hosiery HH OW ZH ER IY
+hosing HH OW Z IH NG
+hoskin HH AA S K IH N
+hosking HH AA S K IH NG
+hoskins HH AA S K IH N Z
+hoskinson HH AA S K IH N S AH N
+hoskyns HH AO S K IH N Z
+hosler HH AA S AH L ER
+hosler(2) HH AA S L ER
+hosley HH AA S L IY
+hosman HH AA S M AH N
+hosner HH AA S N ER
+hosni HH OW Z N IY
+hosni(2) HH AO S N IY
+hosoka HH OW S AA K AH
+hosoka's HH OW S AA K AH Z
+hosokawa HH OW S AH K AA W AH
+hosokawa's HH OW S AH K AA W AH Z
+hospice HH AA S P AH S
+hospice's HH AA S P AH S IH Z
+hospices HH AA S P AH S IH Z
+hospitable HH AA S P IH T AH B AH L
+hospital HH AA S P IH T AH L
+hospital's HH AA S P IH T AH L Z
+hospitality HH AA S P AH T AE L AH T IY
+hospitalization HH AA S P IH T AH L AH Z EY SH AH N
+hospitalizations HH AA S P IH T AH L AH Z EY SH AH N Z
+hospitalize HH AO S P IH T AH L AY Z
+hospitalized HH AA S P IH T AH L AY Z D
+hospitals HH AA S P IH T AH L Z
+hospitals' HH AO S P IH T AH L Z
+hoss HH AA S
+hossack HH AA S AH K
+hossain HH AH S EY N
+hossein HH AO S EY N
+hosseini HH OW S EY IY N IY
+hossler HH AA S AH L ER
+hossler(2) HH AA S L ER
+host HH OW S T
+host's HH OW S T S
+hostage HH AA S T IH JH
+hostages HH AA S T AH JH AH Z
+hostages' HH AO S T IH JH IH Z
+hosted HH OW S T IH D
+hostel HH AA S T AH L
+hostels HH AA S T AH L Z
+hostench HH AO S T AH N CH
+hoster HH OW S T ER
+hosterman HH OW S T ER M AH N
+hostess HH OW S T AH S
+hostesses HH OW S T AH S AH Z
+hostesses(2) HH OW S T AH S IH Z
+hostetler HH AA S T IH T AH L ER
+hostetter HH AA S T IH T ER
+hostettler HH AA S T IH T AH L ER
+hostettler(2) HH AA S T EH T L ER
+hostile HH AA S T AH L
+hostile(2) HH AA S T AY L
+hostilities HH AA S T IH L AH T IY Z
+hostility HH AA S T IH L AH T IY
+hosting HH OW S T IH NG
+hostler HH AA S L ER
+hosts HH OW S T S
+hosts(2) HH OW S S
+hosts(3) HH OW S
+hostutler HH AA S T UW T AH L ER
+hostutler(2) HH AA S T UW T L ER
+hot HH AA T
+hot-cross HH AA T K R AO S
+hot-line HH AA T L AY N
+hot-shot HH AA SH AA T
+hot-shots HH AA SH AA T S
+hotaling HH AA T AH L IH NG
+hotaling's HH AA T AH L IH NG Z
+hotard HH AA T ER D
+hotbed HH AA T B EH D
+hotbeds HH AA T B EH D Z
+hotcake HH AA T K EY K
+hotcakes HH AA T K EY K S
+hotchkin HH AA CH K IH N
+hotchkiss HH AA CH K IH S
+hotdog HH AA T D AO G
+hotdogs HH AA T D AO G Z
+hote HH OW T
+hotel HH OW T EH L
+hotel's HH OW T EH L Z
+hotelier HH OW T EH L Y ER
+hoteliers HH OW T EH L Y ER Z
+hotels HH OW T EH L Z
+hotels' HH OW T EH L Z
+hoten HH OW T AH N
+hoth HH AA TH
+hothouse HH AA T HH AW S
+hothouses HH AA T HH AW S IH Z
+hotlanta HH AO T L AE N T AH
+hotline HH AA T L AY N
+hotlines HH AA T L AY N Z
+hotly HH AA T L IY
+hots HH AA T S
+hotshot HH AA SH AA T
+hotshots HH AA SH AA T S
+hott HH AA T
+hottel HH AA T AH L
+hottelet HH AA T L EH T
+hottelet's HH AA T L EH T S
+hottenstein HH AA T AH N S T AY N
+hottenstein(2) HH AA T AH N S T IY N
+hotter HH AA T ER
+hottest HH AA T AH S T
+hottinger HH AA T IH NG ER
+hottle HH AA T AH L
+hottman HH AA T M AH N
+hotwire HH AA T W AY ER
+hotwired HH AA T W AY ER D
+hotz HH AA T S
+hotze HH OW T Z
+hou HH UW
+houchen HH AW K AH N
+houchens HH AW K AH N Z
+houchin HH AW K IH N
+houchins HH AW K IH N Z
+houck HH AW K
+houdaille HH UW D EY L
+houde HH AW D
+houdek HH AW D IH K
+houdeshell HH UW D IH SH AH L
+houdini HH UW D IY N IY
+houdini's HH UW D IY N IY Z
+houff HH OW F
+houg HH AW G
+houge HH AW JH
+hougen HH AW G AH N
+hough HH AH F
+hougham HH AW AH M
+houghland HH AW L AH N D
+houghs HH AW Z
+houghtaling HH AO T AH L IH NG
+houghton HH AO T AH N
+houghton's HH AO T AH N Z
+houghton's(2) HH AW T AH N Z
+houghton(2) HH AW T AH N
+hougland HH AW G L AH N D
+houk HH AW K
+houle HH AW L
+houlihan HH UW L IH HH AE N
+houlihan's HH UW L IH HH AE N Z
+houlton HH OW L T AH N
+hound HH AW N D
+hounded HH AW N D IH D
+hounding HH AW N D IH NG
+hounds HH AW N D Z
+hounshell HH AW N SH AH L
+houp HH UW P
+houpt HH UW P T
+hour AW ER
+hour's AW ER Z
+hour(2) AW R
+hourglass AW ER G L AE S
+hourglasses AW ER G L AE S IH Z
+hourigan AW R IH G AE N
+hourihan AW R IY HH AA N
+hourlong AW R L AO NG
+hourly AW R L IY
+hours AW ER Z
+hours' AW R Z
+hours(2) AW R Z
+housand HH AW S AH N D
+housden HH AW S D AH N
+house HH AW S
+house's HH AW S IH Z
+houseal HH AW S AH L
+houseboat HH AW S B OW T
+houseboats HH AW S B OW T S
+housebroken HH AW S B R OW K AH N
+housecleaning HH AW S K L IY N IH NG
+housed HH AW Z D
+houseful HH AW S F AH L
+houseguest HH AW S G EH S T
+houseguests HH AW S G EH S T S
+household HH AW S HH OW L D
+household's HH AW S HH OW L D Z
+householder HH AW S HH OW L D ER
+householders HH AW S HH OW L D ER Z
+households HH AW S HH OW L D Z
+housekeeper HH AW S K IY P ER
+housekeepers HH AW S K IY P ER Z
+housekeeping HH AW S K IY P IH NG
+houseknecht HH AW S K N IH K T
+housel HH AW S AH L
+houseman HH AW S M AH N
+houseman's HH AW S M AH N Z
+housen HH AW S AH N
+houser HH AW Z ER
+houseraising HH AW S R EY Z IH NG
+houses HH AW S AH Z
+houses' HH AW S IH Z
+houses(2) HH AW S IH Z
+houseware HH AW S W EH R
+housewares HH AW S W EH R Z
+housewarming HH AW S W AA M IH NG
+housewife HH AW S W AY F
+housewives HH AW S W AY V Z
+housework HH AW S W ER K
+houseworth HH AW S W ER TH
+housewright HH AW S R AY T
+housh HH AW SH
+housholder HH AW SH OW L D ER
+housing HH AW Z IH NG
+housings HH AW Z IH NG Z
+houska HH AW S K AH
+housley HH AW S L IY
+housman HH AW S M AH N
+houston HH Y UW S T AH N
+houston's HH Y UW S T AH N Z
+houstonian HH UW S T OW N IY AH N
+houstonian(2) HH Y UW S T OW N IY AH N
+hout HH AW T
+houtchens HH AW CH AH N Z
+houten HH AW T EH N
+houten's HH AW T EH N Z
+houtman HH AW T M AH N
+houts HH AW T S
+houtz HH AW T S
+houx HH UW
+houy HH AA AY
+houze HH AW Z
+hovan HH OW V AH N
+hovanec HH AH V AE N IH K
+hovater HH OW V AH T ER
+hovatter HH AA V AH T ER
+hovda HH AA V D AH
+hovde HH OW V D
+hovden HH AA V D AH N
+hove HH OW V
+hovel HH AH V AH L
+hovels HH AH V AH L Z
+hoven HH OW V AH N
+hover HH AH V ER
+hovercraft HH AH V ER K R AE F T
+hovered HH AH V ER D
+hoverflies HH AH V ER F L AY Z
+hoverfly HH AH V ER F L AY
+hovering HH AH V ER IH NG
+hovering(2) HH AH V R IH NG
+hovermale HH AH V ER M AH L
+hovers HH AH V ER Z
+hoverson HH AH V ER S AH N
+hovey HH OW V IY
+hovhaness HH AO V HH AE N IH S
+hoving HH OW V IH NG
+hovious HH OW V IY AH S
+hovis HH OW V IH S
+hovland HH AA V L AH N D
+hovnanian HH AA V N EY N IY AH N
+hovorka HH AH V AO R K AH
+hovsepian HH AH V S IY P IY AH N
+hovy HH OW V IY
+how HH AW
+how'd HH AW D
+how're HH AW ER
+how's HH AW Z
+how-about HH AW AH B AW T
+how-many HH AW M EH N IY
+how-much HH AW M AH CH
+howald HH AW AH L D
+howard HH AW ER D
+howard's HH AW ER D Z
+howarth HH AW AA R TH
+howat HH AW AH T
+howatt HH AW AH T
+howcroft HH AW K R AH F T
+howden HH AW D AH N
+howdeshell HH AW D IH SH EH L
+howdy HH AW D IY
+howdydoody HH AW D IY D UW D IY
+howdyshell HH AW D IH SH EH L
+howe HH AW
+howe's HH AW Z
+howell HH AW AH L
+howell's HH AW AH L Z
+howells HH AW AH L Z
+howenstine HH AW IH N S T IY N
+hower HH AW ER
+howerter HH AW ER T ER
+howerton HH AW ER T AH N
+howery HH AW ER IY
+howes HH AW Z
+howeth HH AW IH TH
+however HH AW EH V ER
+howey HH AW IY
+howie HH AW IY
+howie's HH AW IY Z
+howington HH AW IH NG T AH N
+howison HH AW IH S AH N
+howitt HH AW IH T
+howitzer HH AW AH T S ER
+howitzers HH AW AH T S ER Z
+howk HH AW K
+howl HH AW L
+howland HH AW L AH N D
+howle HH AW AH L
+howled HH AW L D
+howler HH AW L ER
+howlett HH AW L IH T
+howley HH AW L IY
+howling HH AW L IH NG
+howls HH AW L Z
+howmet HH AW M AH T
+howorth HH AA W ER TH
+howry HH AW R IY
+howsare HH AW S ER
+howse HH AW Z
+howsell HH AW Z AH L
+howser HH AW Z ER
+howson HH AW S AH N
+howtek HH AW T EH K
+howton HH AW T AH N
+howze HH AW Z
+hoxie HH AA K S IY
+hoxsey HH AA K S IY
+hoxsie HH AA K S IY
+hoxworth HH AA K S W ER TH
+hoy HH OY
+hoye HH OY
+hoyer HH OY ER
+hoying HH OY IH NG
+hoylake HH OY L EY K
+hoyland HH OY L AH N D
+hoyle HH OY L
+hoyne HH OY N
+hoyos HH OY OW Z
+hoyt HH OY T
+hoyvald HH OY V AH L D
+hrabak HH R AA B AH K
+hrabak(2) R AA B AH K
+hrawi HH ER W AA W IY
+hrawi(2) HH R AA W IY
+hrdlicka HH ER D L IH S K AH
+hreha HH R IY HH AH
+hreha(2) R IY HH AH
+hren HH R EH N
+hren(2) R EH N
+hribar HH R IH B AA R
+hribar(2) R IH B AA R
+hritz HH R IH T S
+hritz(2) R IH T S
+hrivnak HH R IH V N AH K
+hrivnak(2) R IH V N AH K
+hrncir HH ER N CH ER
+hrncir(2) HH ER N S IH R
+hron HH R AA N
+hron(2) R AA N
+hronek HH R OW N IH K
+hronek(2) R OW N IH K
+hrovat HH R OW V AH T
+hrovat(2) R OW V AH T
+hrubik HH IH R UW B IH K
+hrubik(2) HH R UW B IH K
+hrubik(3) R UW B IH K
+hruby HH R UW B IY
+hruby(2) R UW B IY
+hruska HH R AH S K AH
+hruska(2) R AH S K AH
+hruska(3) R UW S K AH
+hsia SH AA
+hsiao SH AW
+hsieh SH IY EH
+hsiung SH IY AH NG
+hsiung's SH Y AH NG Z
+hsu SH UW
+hu HH UW
+hua HH UW AH
+hua(2) HH W AA
+huachuca HH W AA CH UW K AH
+huachuca(2) W AA CH UW K AH
+huadong HH W AA D OW NG
+huairou HH W AY R UW
+huallaga HH W AA L AA G AH
+huallaga(2) W AA L AA G AH
+huan HH W AA N
+huaneng HH W AA N EH NG
+huang HH W AE NG
+huang(2) HH W AA NG
+huard HH W AA R D
+hub HH AH B
+hubbard HH AH B ER D
+hubbard's HH AH B ER D Z
+hubbart HH AH B ER T
+hubbell HH AH B AH L
+hubbell's HH AH B AH L Z
+hubbert HH AH B ER T
+hubble HH AH B AH L
+hubble's HH AH B AH L Z
+hubbs HH AH B Z
+hubbub HH AH B AH B
+hubby HH AH B IY
+hubcap HH AH B K AE P
+hubcaps HH AH B K AE P S
+hubco HH AH B K OW
+hube HH Y UW B
+huber HH Y UW B ER
+huberman HH UW B ER M AH N
+hubers HH UW B ER Z
+hubert HH Y UW B ER T
+hubert's HH Y UW B ER T S
+huberta HH UW B EH R T AH
+huberto HH UW B EH R T OW
+huberty HH AH B ER T IY
+hubka HH AH B K AH
+hubler HH Y UW B AH L ER
+hubler(2) HH Y UW B L ER
+hubley HH AH B L IY
+hubner HH AH B N ER
+hubor HH Y UW B ER
+hubris HH Y UW B R AH S
+hubs HH AH B Z
+huch HH AH CH
+huchison HH AH CH AH S IH N
+huck HH AH K
+huckaba HH AH K AH B AH
+huckabay HH AH K AH B EY
+huckabee HH AH K AH B IY
+huckaby HH AH K AH B IY
+hucke HH AH K
+huckeba HH AH K IH B AH
+huckelby HH AH K AH L B IY
+huckelby'll HH AH K AH L B IY AH L
+huckelby's HH AH K AH L B IY Z
+hucker HH AH K ER
+huckins HH AH K IH N Z
+huckle HH AH K AH L
+huckleberry HH AH K AH L B EH R IY
+hucks HH AH K S
+huckstep HH AH K S T IH P
+huckster HH AH K S T ER
+hucksters HH AH K S T ER Z
+hud HH AH D
+hud's HH AH D Z
+huda HH UW D AH
+hudak HH UW D AH K
+huddie HH AH D IY
+huddle HH AH D AH L
+huddled HH AH D AH L D
+huddles HH AH D AH L Z
+huddleson HH AH D AH L S AH N
+huddleston HH AH D AH L S T AH N
+huddling HH AH D AH L IH NG
+huddling(2) HH AH D L IH NG
+huddy HH AH D IY
+hudec HH UW D IH K
+hudecek HH AH D IH CH EH K
+hudek HH UW D IH K
+hudelson HH AH D IH L S AH N
+hudgens HH AH JH AH N Z
+hudgins HH AH JH IH N Z
+hudkins HH AH D K IH N Z
+hudler HH UW D AH L ER
+hudler(2) HH UW D L ER
+hudlow HH AH D L OW
+hudman HH AH D M AH N
+hudnall HH AH D N AH L
+hudnell HH AH D N AH L
+hudnut HH AH D N AH T
+hudock HH AH D AH K
+hudon HH UW D AH N
+hudson HH AH D S AH N
+hudson's HH AH D S AH N Z
+hudspeth HH AH D S P IH TH
+hudsucker HH AH D S AH K ER
+hudwon HH AH D W AH N
+hudy HH Y UW D IY
+hudzik HH AH D Z IH K
+hue HH Y UW
+huebel HH UH B AH L
+hueber HH UH B ER
+huebert HH UH B ER T
+huebner HH Y UW B N ER
+huebsch HH UH B SH
+hued HH Y UW D
+huegel HH UH G AH L
+hueglin HH Y UW G L IH N
+huelskamp HH UH L S K AE M P
+huelsman HH UH L S M AH N
+huelsmann HH UH L S M AH N
+huenink HH UH N IH NG K
+huerst HH ER S T
+huerta HH W EH R T AH
+huerta(2) W EH R T AH
+huerter HH ER T ER
+hues HH Y UW Z
+huesman HH UH S M AH N
+huestis HH UH S T IH S
+hueston HH UH S T AH N
+huether HH UH DH ER
+huett HH UW T
+huetta HH UW EH T AH
+huette HH UW T
+huettl HH UH T AH L
+huettner HH UH T N ER
+huey HH Y UW IY
+hufbauer HH AH F B AW ER
+huff HH AH F
+huff's HH AH F S
+huffaker HH AH F AH K ER
+huffed HH AH F T
+huffer HH AH F ER
+huffine HH AH F AY N
+huffines HH AH F AY N Z
+huffing HH AH F IH NG
+huffington HH AH F IH NG T AH N
+huffington's HH AH F IH NG T AH N Z
+huffman HH AH F M AH N
+huffmaster HH AH F M AE S T ER
+hufford HH AH F ER D
+huffs HH AH F S
+huffstetler HH AH F S T IH T AH L ER
+huffstetler(2) HH AH F S T EH T L ER
+huffstutler HH AH F S T UW T AH L ER
+huffstutler(2) HH AH F S T UW T L ER
+huffy HH AH F IY
+huffy's HH AH F IY Z
+hufnagel HH AH F N EY G AH L
+hufnagle HH AH F N EY G AH L
+hufstedler HH AH F S T IH D AH L ER
+hufstedler(2) HH AH F S T IH D L ER
+hufstetler HH AH F S T IH T AH L ER
+hufstetler(2) HH AH F S T EH T L ER
+hug HH AH G
+huge HH Y UW JH
+huge(2) Y UW JH
+hugel HH UW G AH L
+hugely HH Y UW JH L IY
+hugest HH Y UW JH AH S T
+hugette HH AH ZH EH T
+hugg HH AH G
+huggard HH AH G ER D
+hugged HH AH G D
+hugger HH AH G ER
+huggett HH AH G IH T
+huggies HH AH G IY Z
+hugging HH AH G IH NG
+huggins HH AH G IH N Z
+huggler HH AH G L ER
+huggy HH AH G IY
+hugh HH Y UW
+hugh(2) Y UW
+hughart HH AH G HH AA R T
+hughart(2) HH Y UW AA R T
+hughart(3) Y UW AA R T
+hughbanks HH AH B AH NG K S
+hughbanks(2) HH Y UW B AH NG K S
+hughbanks(3) Y UW B AH NG K S
+hughen HH Y UW AH N
+hughen(2) Y UW AH N
+hughes HH Y UW Z
+hughes' HH Y UW Z
+hughes'(2) Y UW Z
+hughes's HH Y UW Z IH Z
+hughes's(2) Y UW Z IH Z
+hughes(2) Y UW Z
+hughett HH Y UW IH T
+hughett(2) Y UW IH T
+hughette HH Y UW EH T
+hughette(2) Y UW EH T
+hughey HH AH G IY
+hughey(2) HH Y UW IY
+hughey(3) Y UW IY
+hughie HH Y UW IY
+hughie(2) Y UW IY
+hughlett HH Y UW L IH T
+hughlett(2) Y UW L IH T
+hughley HH AH G L IY
+hughley(2) HH Y UW L IY
+hughley(3) Y UW L IY
+hughs Y UW Z
+hughs(2) HH Y UW Z
+hughson HH AH G S AH N
+hughson(2) HH Y UW S AH N
+hughson(3) Y UW S AH N
+hughston HH AH G S T AH N
+hughston(2) HH Y UW S T AH N
+hughston(3) Y UW S T AH N
+hughy HH Y UW IY
+hughy(2) Y UW IY
+hugill HH AH JH AH L
+hugley HH AH G L IY
+hugo HH Y UW G OW
+hugo's HH Y UW G OW Z
+hugo's(2) Y UW G OW Z
+hugo(2) Y UW G OW
+hugoton HH Y UW G OW T AH N
+hugoton(2) Y UW G OW T AH N
+hugs HH AH G Z
+huguenin HH UW G EY N IY N
+huguenot HH Y UW G AH N AA T
+huguenot(2) Y UW G AH N AA T
+huguenots HH Y UW G AH N AA T S
+huguenots(2) Y UW G AH N AA T S
+huguet HH UW G EY T
+huguley HH AH G Y UW L IY
+hugus HH Y UW G AH S
+hugus(2) Y UW G AH S
+huh HH AH
+huhn HH AH N
+huhta HH UW T AH
+hui HH UW IH
+huibregtse HH UW B R EH K T S
+huie HH Y UW IY
+huie(2) Y UW IY
+huish HH Y UW IH SH
+huish(2) Y UW IH SH
+huishman HH UW S M AH N
+huitt HH UW T
+huizar HH IH Z AA R
+huizenga HH IH Z EY NG G AH
+huizenga's HH IH Z EY NG G AH Z
+huizinga HH IH Z IY NG G AH
+hukill HH Y UW K IH L
+hukill(2) Y UW K IH L
+hukstra HH AH K S T R AH
+hula HH UW L AH
+hulbard HH AH L B ER D
+hulbert HH AH L B ER T
+hulbert's HH AH L B ER T S
+hulburd HH AH L B ER D
+hulburt HH AH L B ER T
+hulce HH AH L S
+hulce's HH AH L S AH Z
+huldie HH AH D IY
+huldy HH AH L D IY
+hulen HH AH L AH N
+hulet HH UW L IH T
+hulett HH Y UW L IH T
+hulett(2) Y UW L IH T
+hulette HH Y UW L EH T
+hulette(2) Y UW L EH T
+hulgan HH AH L G AH N
+hulick HH Y UW L IH K
+hulick(2) Y UW L IH K
+hulin HH Y UW L IH N
+hulin(2) Y UW L IH N
+huling HH Y UW L IH NG
+huling(2) Y UW L IH NG
+hulings HH Y UW L IH NG Z
+hulings(2) Y UW L IH NG Z
+hulk HH AH L K
+hulking HH AH L K IH NG
+hulks HH AH L K S
+hull HH AH L
+hull's HH AH L Z
+hullabaloo HH AH L AH B AH L UW
+hulled HH AH L D
+hullender HH UW L EH N D ER
+hullett HH UW L IH T
+hulliber HH AH L IH B ER
+hullinger HH AH L IH NG ER
+hullinger(2) HH AH L IH N JH ER
+hulls HH AH L Z
+hullum HH AH L AH M
+hulme HH AH L M
+hulon HH Y UW L AH N
+hulon's HH Y UW L AH N Z
+hulond HH Y UW L AH N D
+hulond's HH Y UW L AH N D Z
+huls HH AH L Z
+hulse HH AH L S
+hulsebus HH AH L S IH B IH S
+hulsey HH AH L S IY
+hulsizer HH AH L S AY Z ER
+hulslander HH AH L S L AH N D ER
+hulsman HH AH L S M AH N
+hulst HH AH L S T
+hult HH AH L T
+hult's HH AH L T S
+hultberg HH AH L T B ER G
+hultgren HH AH L T G R EH N
+hultman HH AH L T M AH N
+hulton HH AH L T AH N
+hultquist HH AH L T K W IH S T
+hults HH AH L T S
+hultz HH AH L T S
+hulvey HH AH L V IY
+hum HH AH M
+human HH Y UW M AH N
+human's HH Y UW M AH N Z
+human(2) Y UW M AH N
+humana HH Y UW M AE N AH
+humana's HH Y UW M AE N AH Z
+humane HH Y UW M EY N
+humanely HH Y UW M EY N L IY
+humanism HH Y UW M AH N IH Z AH M
+humanist HH Y UW M AH N IH S T
+humanistic HH Y UW M AH N IH S T IH K
+humanists HH Y UW M AH N AH S T S
+humanists(2) HH Y UW M AH N AH S S
+humanists(3) HH Y UW M AH N AH S
+humanitarian HH Y UW M AE N AH T EH R IY AH N
+humanitarian(2) Y UW M AE N AH T EH R IY AH N
+humanitarians HH Y UW M AE N AH T EH R IY AH N Z
+humanitarians(2) Y UW M AE N AH T EH R IY AH N Z
+humanities HH Y UW M AE N IH T IY Z
+humanities(2) Y UW M AE N IH T IY Z
+humanity HH Y UW M AE N IH T IY
+humanity's HH Y UW M AE N IH T IY Z
+humanity's(2) Y UW M AE N IH T IY Z
+humanity(2) Y UW M AE N IH T IY
+humanize HH Y UW M AH N AY Z
+humanized HH Y UW M AH N AY Z D
+humanizes HH Y UW M AH N AY Z IH Z
+humanizing HH Y UW M AH N AY Z IH NG
+humankind HH Y UW M AH N K AY N D
+humankind's HH Y UW M AH N K AY N D Z
+humanly HH Y UW M AH N L IY
+humann HH Y UW M AH N
+humanness HH Y UW M AH N N AH S
+humans HH Y UW M AH N Z
+humans(2) Y UW M AH N Z
+humbarger HH AH M B AA R G ER
+humber HH AH M B ER
+humbert HH AH M B ER T
+humberto HH AH M B ER T OW
+humberto(2) UW M B EH R T OW
+humble HH AH M B AH L
+humbled HH AH M B AH L D
+humbler HH AH M B AH L ER
+humbler(2) HH AH M B L ER
+humbles HH AH M B AH L Z
+humblest HH AH M B AH L AH S T
+humbling HH AH M B AH L IH NG
+humbling(2) HH AH M B L IH NG
+humbly HH AH M B L IY
+humboldt HH AH M B OW L T
+humbug HH AH M B AH G
+humburg HH AH M B ER G
+humdinger HH AH M D IH NG ER
+humdrum HH AH M D R AH M
+hume HH Y UW M
+humenik HH Y UW M IH N IH K
+humerous HH Y UW M ER AH S
+humerous(2) Y UW M ER AH S
+humerus HH Y UW M ER AH S
+humes HH Y UW M Z
+humfrey HH AH M F R IY
+humfry HH AH M F ER IY
+humi HH Y UW M IY
+humid HH Y UW M AH D
+humid(2) HH Y UW M IH D
+humid(3) Y UW M AH D
+humid(4) Y UW M IH D
+humidifier HH Y UW M IH D AH F AY ER
+humidifiers HH Y UW M IH D AH F AY ER Z
+humidity HH Y UW M IH D AH T IY
+humidity's HH Y UW M IH D AH T IY Z
+humidor HH Y UW M IH D AO R
+humiliate HH Y UW M IH L IY EY T
+humiliated HH Y UW M IH L IY EY T IH D
+humiliates HH Y UW M IH L IY EY T S
+humiliating HH Y UW M IH L IY EY T IH NG
+humiliation HH Y UW M IH L IY EY SH AH N
+humiliations HH Y UW M IH L IY EY SH AH N Z
+humility HH Y UW M IH L IH T IY
+humiston HH Y UW M IH S T AA N
+humke HH AH M K IY
+huml HH AH M AH L
+humm HH AH M
+hummel HH AH M AH L
+hummell HH AH M AH L
+hummer HH AH M ER
+humming HH AH M IH NG
+hummingbird HH AH M IH NG B ER D
+hummingbirds HH AH M IH NG B ER D Z
+humongous HH Y UW M AO NG G AH S
+humor HH Y UW M ER
+humoral HH Y UW M ER AH L
+humored HH Y UW M ER D
+humorist HH Y UW M ER AH S T
+humorist(2) HH Y UW M ER IH S T
+humorists HH Y UW M ER IH S T S
+humorists(2) HH Y UW M ER IH S S
+humorists(3) HH Y UW M ER IH S
+humorless HH Y UW M ER L AH S
+humorous HH Y UW M ER AH S
+humorously HH Y UW M ER AH S L IY
+hump HH AH M P
+humpal HH AH M P AH L
+humpback HH AH M P B AE K
+humped HH AH M P T
+humpert HH AH M P ER T
+humph HH AH M F
+humphery HH AH M F ER IY
+humphery(2) HH AH M F R IY
+humphery(3) HH AH M P F ER IY
+humphery(4) HH AH M P F R IY
+humpherys HH AH M F ER IY Z
+humpherys(2) HH AH M F R IY Z
+humpherys(3) HH AH M P F ER IY Z
+humphrey HH AH M F R IY
+humphrey's HH AH M F R IY Z
+humphrey's(2) HH AH M P F R IY Z
+humphrey(2) HH AH M P F R IY
+humphreys HH AH M P F R IY Z
+humphries HH AH M F ER IY Z
+humphries(2) HH AH M P F ER IY Z
+humphry HH AH M F R IY
+humphry(2) HH AH M P F R IY
+humpty HH AH M P T IY
+hums HH AH M Z
+humulin HH Y UW M Y UW L IH N
+humus HH Y UW M AH S
+humvee HH AH M V IY
+humvee's HH AH M V IY Z
+humvees HH AH M V IY Z
+hun HH AH N
+hunan HH UW N AA N
+hunch HH AH N CH
+hunchback HH AH N CH B AE K
+hunched HH AH N CH T
+hunches HH AH N CH IH Z
+hunchine HH AH CH IY N
+hund HH AH N D
+hundai HH AH N D EY
+hundertmark HH AH N D ER T M AA R K
+hundley HH AH N D L IY
+hundred HH AH N D R AH D
+hundred's HH AH N D R IH D Z
+hundred(2) HH AH N D R IH D
+hundred(3) HH AH N ER D
+hundred(4) HH AH N D ER D
+hundreds HH AH N D R AH D Z
+hundreds(2) HH AH N D ER D Z
+hundreds(3) HH AH N ER D Z
+hundredth HH AH N D R AH D TH
+hundredths HH AH N D R AH D TH S
+hundredweight HH AH N D R AH D W EY T
+hundt HH AH N T
+huneke HH AH N IH K
+huneycutt HH AH N IY K AH T
+hung HH AH NG
+hungarian HH AH NG G EH R IY AH N
+hungarians HH AH NG G EH R IY AH N Z
+hungary HH AH NG G ER IY
+hungary's HH AH NG G ER IY Z
+hungate HH AH NG EY T
+hunger HH AH NG G ER
+hungerford HH AH NG G ER F ER D
+hungerfords HH AH NG G ER F ER D Z
+hungering HH AH NG G ER IH NG
+hungrier HH AH NG G R IY ER
+hungrily HH AH NG G R AH L IY
+hungry HH AH NG G R IY
+hunk HH AH NG K
+hunke HH AH NG K
+hunkele HH AH NG K AH L
+hunker HH AH NG K ER
+hunkered HH AH NG K ER D
+hunkering HH AH NG K ER IH NG
+hunkins HH AH NG K IH N Z
+hunks HH AH NG K S
+hunky HH AH NG K IY
+hunley HH AH N L IY
+hunn HH AH N
+hunnell HH AH N AH L
+hunnewell HH AH N IH W EH L
+hunnicutt HH AH N IH K AH T
+hunsaker HH AH N S AH K ER
+hunsberger HH AH N S B ER G ER
+hunsicker HH AH N S IH K ER
+hunsinger HH AH N S IH NG ER
+hunsley HH AH N S L IY
+hunsucker HH AH N S AH K ER
+hunt HH AH N T
+hunt's HH AH N T S
+huntco HH AH N T K OW
+hunte HH AH N T
+hunted HH AH N T AH D
+hunted(2) HH AH N T IH D
+hunted(3) HH AH N AH D
+hunted(4) HH AH N IH D
+hunter HH AH N T ER
+hunter's HH AH N T ER Z
+hunters HH AH N T ER Z
+hunting HH AH N T IH NG
+huntingdon HH AH N T IH NG D IH N
+huntington HH AH N T IH NG T AH N
+huntington's HH AH N T IH NG T AH N Z
+huntley HH AH N T L IY
+huntly HH AH N T L IY
+hunton HH AH N T AH N
+huntoon HH AH N T UW N
+huntress HH AH N T R IH S
+hunts HH AH N T S
+hunts' HH AH N T S
+huntsinger HH AH N T S IH N JH ER
+huntsman HH AH N T S M AH N
+huntsville HH AH N T S V IH L
+huntway HH AH N T W EY
+huntzinger HH AH N T Z IH NG ER
+hunza HH AH N Z AH
+hunzeker HH AH N Z IH K ER
+hunziker HH AH N Z IH K ER
+huot HH Y UW AH T
+hupe HH Y UW P
+hupfer HH AH P F ER
+hupp HH AH P
+huppert HH AH P ER T
+hur HH ER
+hurco HH ER K OW
+hurd HH ER D
+hurdle HH ER D AH L
+hurdler HH ER D AH L ER
+hurdler(2) HH ER D L ER
+hurdles HH ER D AH L Z
+hurdling HH ER D AH L IH NG
+hurdling(2) HH ER D L IH NG
+hurdman HH ER D M AH N
+hurford HH ER F ER D
+hurl HH ER L
+hurlbert HH ER L B ER T
+hurlburt HH ER L B ER T
+hurlbut HH ER L B AH T
+hurlbutt HH ER L B AH T
+hurled HH ER L D
+hurless HH ER L AH S
+hurley HH ER L IY
+hurling HH ER L IH NG
+hurlock HH ER L AH K
+hurly HH ER L IY
+hurm HH ER M
+hurn HH ER N
+hurney HH ER N IY
+huron HH Y UW R AA N
+huron(2) HH Y UH R AA N
+hurrah HH UH R AA
+hurray HH AH R EY
+hurrell HH AO R AH L
+hurri HH ER IY
+hurricane HH ER AH K EY N
+hurricane's HH ER AH K EY N Z
+hurricane(2) HH AH R AH K EY N Z
+hurricanes HH ER AH K EY N Z
+hurried HH ER IY D
+hurriedly HH ER IY D L IY
+hurries HH ER IY Z
+hurry HH ER IY
+hurrying HH ER IY IH NG
+hursey HH ER S IY
+hursh HH ER SH
+hurst HH ER S T
+hurston HH ER S T AH N
+hurt HH ER T
+hurta HH ER T AH
+hurtado HH ER T AA D OW
+hurteau HH ER T OW
+hurtful HH ER T F AH L
+hurtig HH ER T IH G
+hurting HH ER T IH NG
+hurtle HH ER T AH L
+hurtling HH ER T L IH NG
+hurts HH ER T S
+hurtt HH ER T
+hurtubise HH ER T AH B AY Z
+hurvey HH ER V IY
+hurvitz HH ER V IH T S
+hurwitz HH ER W IH T S
+husain HH AH S AY N
+husak HH UW S AH K
+husar HH UW S ER
+husband HH AH Z B AH N D
+husband's HH AH Z B AH N D Z
+husbandry HH AH Z B AH N D R IY
+husbands HH AH Z B AH N D Z
+husbands' HH AH S B AH N D Z
+husby HH AH S B IY
+huschka HH AH SH K AH
+huse HH Y UW Z
+huseby HH AH S IH B IY
+huseman HH UW S M AH N
+husen HH UW S AH N
+huser HH Y UW Z ER
+hush HH AH SH
+hushed HH AH SH T
+husic HH Y UW Z IH K
+husk HH AH S K
+huska HH AH S K AH
+huskey HH AH S K IY
+huskins HH AH S K IH N Z
+husks HH AH S K S
+husky HH AH S K IY
+husky's HH AH S K IY Z
+husman HH AH S M AH N
+husmann HH AH S M AH N
+huson HH UW S AH N
+huss HH AH S
+hussain HH UW S EY N
+hussar HH AH S ER
+hussein HH UW S EY N
+hussein's HH UW S EY N Z
+husseini HH Y UW S EY N IY
+husseini(2) HH UW S EY N IY
+husser HH AH S ER
+hussey HH AH S IY
+hussite HH AH S AY T
+hussman HH AH S M AH N
+husson HH AH S AH N
+hussong HH AH S AO NG
+hussy HH AH S IY
+hust HH AH S T
+hustad HH AH S T AH D
+hustead HH AH S T EH D
+husted HH AH S T IH D
+huster HH AH S T ER
+hustings HH AH S T IH NG Z
+hustle HH AH S AH L
+hustled HH AH S AH L D
+hustler HH AH S AH L ER
+hustler(2) HH AH S L ER
+hustlers HH AH S AH L ER Z
+hustlers(2) HH AH S L ER Z
+hustles HH AH S AH L Z
+hustling HH AH S AH L IH NG
+hustling(2) HH AH S L IH NG
+huston HH AH S T AH N
+hut HH AH T
+hut's HH AH T S
+huta HH UW T AH
+hutch HH AH CH
+hutchcraft HH AH CH K R AE F T
+hutchens HH AH CH AH N Z
+hutcheon HH AH CH IY AH N
+hutcherson HH AH CH ER S AH N
+hutcheson HH AH CH IH S AH N
+hutchings HH AH CH IH NG Z
+hutchins HH AH T CH IH N Z
+hutchinson HH AH CH IH N S AH N
+hutchison HH AH CH IH S AH N
+hutchison's HH AH CH IH S AH N Z
+huth HH UW TH
+hutmacher HH AH T M AH K ER
+hutnick HH AH T N IH K
+huto HH UW T OW
+huts HH AH T S
+hutsell HH AH T S AH L
+hutson HH AH T S AH N
+hutt HH AH T
+hutter HH AH T ER
+huttner HH AH T N ER
+hutto HH UW T OW
+hutton HH AH T AH N
+hutton's HH AH T AH N Z
+hutu HH UW T UW
+hutu's HH UW T UW Z
+hutus HH UW T UW Z
+hutzel HH AH T Z AH L
+hutzell HH AH T Z AH L
+hutzelman HH AH T S AH L M AH N
+hutzler HH AH T S L ER
+huval HH UW V AE L
+huwe HH UW W
+hux HH AH K S
+huxford HH AH K S F ER D
+huxley HH AH K S L IY
+huxtable HH AH K S T AH B AH L
+huxtables HH AH K S T AH B AH L Z
+huyck HH AY K
+huyett HH AY IH T
+huyler HH AY L ER
+huynh HH AY N
+huyser HH AY S ER
+hwa HH W AA
+hwan HH W AA N
+hwan's HH W AA N Z
+hwang HH W AE NG
+hwang(2) HH W AA NG
+hwang-ho HH W AE NG HH OW
+hwang-ho(2) HH W AA NG HH OW
+hwe HH W EY
+hy HH AY
+hyacinth HH AY AH S IH N TH
+hyacintha HH AY AH S IH N TH AH
+hyacinthe HH AY AH S IH N TH
+hyacinthia HH AY AH S IH N TH IY AH
+hyacinthie HH AY AH S IH N TH IY
+hyacinths HH AY AH S IH N TH S
+hyades HH AY AH D IY Z
+hyakutake HH AY AH K UW T AA K IY
+hyakutake(2) HH AY AH K Y UW T AA K IY
+hyaluronic HH AY AH L ER AA N IH K
+hyams HH AY AH M Z
+hyannis HH AY AE N IH S
+hyannisport HH AY AE N IH S P AO R T
+hyatt HH AY AH T
+hyatt's HH AY AH T S
+hybl HH IH B AH L
+hybl's HH IH B AH L Z
+hybrid HH AY B R AH D
+hybrid(2) HH AY B R IH D
+hybridization HH AY B R AH D AH Z EY SH AH N
+hybridize HH AY B R AH D AY Z
+hybrids HH AY B R AH D Z
+hybrienko HH AY B R IY EH N K OW
+hybritech HH AY B R IH T EH K
+hyche HH AY CH
+hycor HH AY K AO R
+hycroft HH AY K R AO F T
+hyde HH AY D
+hyde's HH AY D Z
+hydea HH AY D IY AH
+hydea(2) HH AY D EY AH
+hydeia HH AY D EY AH
+hyden HH AY D AH N
+hyder HH AY D ER
+hyderabad HH AY D EH R AH B AE D
+hyderabad(2) HH AY D ER AH B AE D
+hydock HH AY D AH K
+hydra HH AY D R AH
+hydrant HH AY D R AH N T
+hydrants HH AY D R AH N T S
+hydras HH AY D R AH Z
+hydrate HH AY D R EY T
+hydrated HH AY D R EY T AH D
+hydrates HH AY D R EY T S
+hydration HH AY D R EY SH AH N
+hydraulic HH AY D R AO L IH K
+hydraulics HH AY D R AO L IH K S
+hydrazine HH AY D R AH Z IY N
+hydrick HH IH D R IH K
+hydride HH AY D R AY D
+hydro HH AY D R OW
+hydro's HH AY D R OW Z
+hydrocarbon HH AY D R OW K AA R B AH N
+hydrocarbons HH AY D R OW K AA R B AH N Z
+hydroelectric HH AY D R OW IH L EH K T R IH K
+hydroencephalus HH AY D R OW AH N S EH F AH L AH S
+hydrofoil HH AY D R AH F OY L
+hydrogen HH AY D R AH JH AH N
+hydrogenate HH AY D R AH JH AH N EY T
+hydrogenated HH AY D R AH JH AH N EY T IH D
+hydrogenated(2) HH AY D R AA JH AH N EY T IH D
+hydrogenates HH AY D R AH JH AH N EY T S
+hydrogenating HH AY D R AH JH AH N EY T IH NG
+hydrogenation HH AY D R AA JH AH N EY SH AH N
+hydrogens HH AY D R AH JH AH N Z
+hydrographic HH AY D R AH G R AE F IH K
+hydrolysis HH AY D R AA L AH S AH S
+hydrolyze HH AY D R AH L AY Z
+hydrolyzed HH AY D R AH L AY Z D
+hydrolyzing HH AY D R AH L AY Z IH NG
+hydrometer HH AY D R AA M AH T ER
+hydron HH AY D R AH N
+hydrophilic HH AY D R AH F IH L IH K
+hydroponic HH AY D R AH P AA N IH K
+hydropower HH AY D R OW P AW R
+hydrosol HH AY D R AH S AA L
+hydrosulfide HH AY D R OW S AH L F AY D
+hydrotherapy HH AY D R OW TH EH R AH P IY
+hydrothermal HH AY D R OW TH ER M AH L
+hydrous HH AY D R AH S
+hydrox HH AY D R AO K S
+hydroxide HH AY D R AA K S AY D
+hydroxides HH AY D R AA K S AY D Z
+hydroxy HH AY D R AO K S IY
+hydstra HH AY D S T R AH
+hye HH AY
+hyena HH AY IY N AH
+hyenas HH AY IY N AH Z
+hyer HH AY ER
+hyers HH AY ER Z
+hygeia HH AY JH EY AH
+hygiene HH AY JH IY N
+hygienist HH AY G IY N IH S T
+hygienist(2) HH AY G EH N IH S T
+hygienists HH AY G IY N IH S T S
+hygienists(2) HH AY G IY N IH S
+hygienists(3) HH AY G EH N IH S T S
+hygienists(4) HH AY G EH N IH S
+hygrometer HH AY G R AA M AH T ER
+hykes HH AY K S
+hyland HH AY L AH N D
+hyle HH AY L
+hyler HH AY L ER
+hylsa HH AY L S AH
+hylton HH IH L T AH N
+hyman HH AY M AH N
+hymans HH AY M AH N Z
+hymas HH AY M AH Z
+hymel HH AY M AH L
+hymen HH AY M AH N
+hymer HH AY M ER
+hymes HH AY M Z
+hymie HH AY M IY
+hymies HH AY M IY Z
+hymn HH IH M
+hymnal HH IH M N AH L
+hymnals HH IH M N AH L Z
+hymnology HH IH M N AA L AH JH IY
+hymns HH IH M Z
+hymowitz HH IH M AH W IH T S
+hymowitz(2) HH AY M AH W IH T S
+hynd HH IH N D
+hyndman HH IH N D M AH N
+hynds HH IH N D Z
+hynek HH AY N IH K
+hynes HH AY N Z
+hynes's HH AY N Z IH Z
+hynson HH IH N S AH N
+hyogo HH Y OW G OW
+hyotan HH Y OW T AE N
+hype HH AY P
+hyped HH AY P T
+hyper HH AY P ER
+hyperactive HH AY P ER AE K T IH V
+hyperactivity HH AY P ER AE K T IH V IH T IY
+hyperbaric HH AY P ER B AA R IH K
+hyperbaric(2) HH AY P ER B AE R IH K
+hyperbola HH AY P ER B AH L AH
+hyperbole HH AY P ER B AH L IY
+hyperbolic HH AY P ER B AA L IH K
+hyperborean HH AY P ER B AO R IY AH N
+hypercard HH AY P ER K AA R D
+hypercritical HH AY P ER K R IH T IH K AH L
+hyperinflation HH AY P ER IH N F L EY SH AH N
+hyperion HH AY P IH R IY AH N
+hyperkinetic HH AY P ER K IH N EH T IH K
+hyperlink HH AY P ER L IH NG K
+hyperlinks HH AY P ER L IH NG K S
+hypermarket HH AY P ER M AA R K IH T
+hypermarkets HH AY P ER M AA R K IH T S
+hyperopia HH AY P ER OW P IY AH
+hyperplasia HH AY P ER P L EY ZH AH
+hypersensitive HH AY P ER S EH N S IH T IH V
+hypersensitivity HH AY P ER S EH N S IH T IH V IH T IY
+hypersonic HH AY P ER S AA N IH K
+hypertension HH AY P ER T EH N SH AH N
+hypertensive HH AY P ER T EH N S IH V
+hypertext HH AY P ER T EH K S T
+hypertonic HH AY P ER T AA N IH K
+hypertrophic HH AY P ER T R OW F IH K
+hypertrophy HH AY P ER T R OW F IY
+hypes HH AY P S
+hyphae HH AY F IY
+hyphen HH AY F AH N
+hyphenate HH AY F AH N EY T
+hyphenated HH AY F AH N EY T IH D
+hyphenates HH AY F AH N EY T S
+hyphenating HH AY F AH N EY T IH NG
+hyphenation HH AY F AH N EY SH AH N
+hyping HH AY P IH NG
+hypnosis HH IH P N OW S AH S
+hypnotic HH IH P N AA T IH K
+hypnotics HH IH P N AA T IH K S
+hypnotism HH IH P N AH T IH Z AH M
+hypnotism's HH IH P N AH T IH Z AH M Z
+hypnotist HH IH P N AH T IH S T
+hypnotists HH IH P N AH T IH S T S
+hypnotize HH IH P N AH T AY Z
+hypnotized HH IH P N AH T AY Z D
+hypnotizes HH IH P N AH T AY Z AH Z
+hypo HH AY P OW
+hypochondria HH AY P AH K AA N D R IY AH
+hypochondriac HH AY P AH K AA N D R IY AE K
+hypocrisy HH IH P AA K R AH S IY
+hypocrite HH IH P AH K R IH T
+hypocrites HH IH P AH K R IH T S
+hypocritical HH IH P AH K R IH T IH K AH L
+hypodermic HH AY P AH D ER M IH K
+hypoglycemia HH AY P OW G L AY S IY M IY AH
+hypoglycemic HH AY P OW G L AY S IY M IH K
+hypolite HH AY P AH L AY T
+hyponex HH AY P OW N EH K S
+hypotension HH AY P OW T EH N SH AH N
+hypothalamic HH AY P OW TH AH L AE M IH K
+hypotheken HH AY P AA TH AH K AH N
+hypothermia HH AY P AH TH ER M IY AH
+hypotheses HH AY P AA TH AH S IY Z
+hypothesis HH AY P AA TH AH S AH S
+hypothesize HH AY P AA TH AH S AY Z
+hypothesized HH AY P AA TH AH S AY Z D
+hypothetical HH AY P AH TH EH T AH K AH L
+hypothetical(2) HH AY P AH TH EH T IH K AH L
+hypothetically HH AY P AH TH EH T IH K L IY
+hypotheticals HH AY P AH TH EH T AH K AH L Z
+hypoxia HH AY P AA K S IY AH
+hyraxes HH AY R AE K S AH Z
+hyre HH AY R
+hysell HH AY S AH L
+hyser HH AY Z ER
+hyslop HH AY S L AH P
+hyson HH AY S AH N
+hysong HH AY S AO NG
+hyssop HH IH S AH P
+hyster HH IH S T ER
+hysterectomies HH IH S T ER EH K T AH M IY
+hysterectomy HH IH S T ER EH K T AH M IY
+hysteria HH IH S T EH R IY AH
+hysteric HH IH S T EH R IH K
+hysterical HH IH S T EH R IH K AH L
+hysterically HH IH S T EH R IH K L IY
+hysterics HH IH S T EH R IH K S
+hyun HH AY AH N
+hyun(2) HH Y AH N
+hyundai HH Y AH N D EY
+hyundai's HH AH N D EY Z
+hyundai(2) HH AH N D EY
+hyundais HH Y AH N D EY Z
+hywell HH AY W EH L
+i AY
+i'd AY D
+i'ers AY ER Z
+i'll AY L
+i'm AY M
+i'm(2) AH M
+i's AY Z
+i've AY V
+i. AY
+i.'s AY Z
+i.s AY Z
+ia IY AH
+iacobelli IY AA K OW B EH L IY
+iacobellis IY AA K OW B EH L IH S
+iacobucci IY AA K OW B UW CH IY
+iacocca AY AH K OW K AH
+iacocca's AY AH K OW K AH Z
+iacona AY AH K OW N AH
+iacono AY AH K OW N OW
+iacovelli IY AA K OW V EH L IY
+iafrate AY AH F R EY T IY
+iago IY AA G OW
+iain IY EY N
+iakovos IY AA K OW V OW S
+ialla AY AA L AH
+ialla(2) IY AA L AH
+iams IY AA M Z
+iams(2) AY AA M Z
+ian IY AH N
+iannaccone IY AA N AH K OW N IY
+iannacone IY AA N AH K OW N IY
+iannamico IY AA N AH M IY K OW
+iannelli IY AH N EH L IY
+iannello IY AH N EH L OW
+ianni IY AA N IY
+ianniello IY AA N IY EH L OW
+iannone IY AH N OW N IY
+iannotti IY AH N OW T IY
+iannucci IY AH N UW CH IY
+iannuzzi IY AH N UW T S IY
+iannuzzi(2) IY AH N UW Z IY
+ianovski Y AH N AA V S K IY
+ianovski(2) Y AH N AA F S K IY
+iantha IY AA N TH AH
+ianthe IY AA N TH EY
+ianthina IY AH N TH IY N AH
+iason IY AH S AH N
+iavarone IY AA V ER OW N IY
+ib IH B
+ib(2) AY B IY
+iba IY B AH
+ibach IH B AA K
+ibanez IH B AA N EH Z
+ibaraki AY B ER AA K IY
+ibarra IH B AA R AH
+ibbotson IH B AH T S AH N
+iberia AY B IH R IY AH
+iberia's AY B IH R IY AH Z
+iberian AY B IH R IY AH N
+ibero IH B EH R OW
+ibex AY B EH K S
+ibis AY B AH S
+ibmer IH B M ER
+ibmers IH B M ER Z
+ibn IH B AH N
+ibogaine AY B OW G EY N
+ibogaine(2) AY B AH G EY N
+ibrahim IH B R AA HH IY M
+ibsen IH B S AH N
+ibuprofen AY B Y UW P R OW F AH N
+icahn AY K AA N
+icahn's AY K AA N Z
+icard IH K AA R D
+icarus IH K ER AH S
+ice AY S
+ice-cream AY S K R IY M
+ice-nine AY S N AY N
+iceberg AY S B ER G
+icebergs AY S B ER G Z
+icebox AY S B AA K S
+icebreaker AY S B R EY K ER
+icebreakers AY S B R EY K ER Z
+iced AY S T
+icefish AY S F IH SH
+iceland AY S L AH N D
+icelandair AY S L AE N D EH R
+icelandic AY S L AE N D IH K
+iceman AY S M AE N
+icenhour IH S AH N AW R
+icenhour(2) AY S AH N AW R
+icenhower IH S AH N HH AW ER
+icenhower(2) AY S AH N HH AW ER
+icenogle IH S AH N OW G AH L
+icenogle(2) AY S AH N OW G AH L
+ices AY S AH Z
+ices(2) AY S IH Z
+iceskate AY S S K EY T
+iceskate(2) AY S K EY T
+iceskating AY S S K EY T IH NG
+iceskating(2) AY S K EY T IH NG
+ich IH CH
+ichi IY CH IY
+ichikawa IH CH IY K AA W AH
+ichiro IY CH IH R OW
+icicle AY S IH K AH L
+icicles AY S IH K AH L Z
+icily AY S IH L IY
+icing AY S IH NG
+ickes IH K IY Z
+ickes' IH K AH S
+ickes'(2) IH K IY Z
+ickes(2) AY K IY Z
+ickes(3) AY K S
+icon AY K AA N
+iconoclasm AY K AA N AH K L AE Z AH M
+iconoclast AY K AA N AH K L AE S T
+iconoclastic AY K AH N AH K L AE S T IH K
+iconography AY K AH N AA G R AH F IY
+icons AY K AA N Z
+icy AY S IY
+id IH D
+id(2) AY D IY
+ida AY D AH
+idaho AY D AH HH OW
+idaho's AY D AH HH OW Z
+idaho-falls AY D AH HH OW F AA L Z
+idalia IH D AA L Y AH
+idalina IH D AA L IY N AH
+idaline IH D AH L AY N
+iddings IH D IH NG Z
+ide AY D
+idea AY D IY AH
+idea's AY D IY AH Z
+ideal AY D IY L
+ideal's AY D IY L Z
+idealism AY D IY L IH Z AH M
+idealist AY D IY L IH S T
+idealistic AY D IY AH L IH S T IH K
+idealists AY D IY L IH S T S
+idealists(2) AY D IY L IH S S
+idealists(3) AY D IY L IH S
+idealize AY D IY L AY Z
+idealized AY D IY AH L AY Z D
+idealizes AY D IY L AY Z IH Z
+idealizing AY D IY L AY Z IH NG
+ideally AY D IY L IY
+ideals AY D IY L Z
+ideas AY D IY AH Z
+idec AY D AH K
+iden AY D AH N
+ident AY D EH N T
+identa AY D EH N T AH
+identical AY D EH N T IH K AH L
+identical(2) AY D EH N IH K AH L
+identics AY D EH N T IH K S
+identics(2) AY D EH N IH K S
+identifiable AY D EH N T AH F AY AH B AH L
+identifiable(2) AY D EH N AH F AY AH B AH L
+identification AY D EH N T AH F AH K EY SH AH N
+identification(2) AY D EH N AH F AH K EY SH AH N
+identifications AY D EH N T AH F AH K EY SH AH N Z
+identifications(2) AY D EH N AH F AH K EY SH AH N Z
+identified AY D EH N T AH F AY D
+identified(2) AY D EH N AH F AY D
+identifier AY D EH N T AH F AY ER
+identifier(2) AY D EH N AH F AY ER
+identifies AY D EH N T AH F AY Z
+identifies(2) AY D EH N AH F AY Z
+identify AY D EH N T AH F AY
+identify(2) AY D EH N AH F AY
+identifying AY D EH N T AH F AY IH NG
+identifying(2) AY D EH N AH F AY IH NG
+identikit AY D EH N T IH K IH T
+identities AY D EH N T IH T IY Z
+identities(2) AY D EH N IH T IY Z
+identity AY D EH N T AH T IY
+identity(2) AY D EH N T IH T IY
+identity(3) AY D EH N IH T IY
+identity(4) AY D EH N AH T IY
+ideological AY D IY AH L AA JH IH K AH L
+ideologically AY D IY AH L AA JH IH K L IY
+ideologies AY D IY AA L AH JH IY Z
+ideologist AY D IY AA L AH JH AH S T
+ideologists AY D IY AA L AH JH IH S T S
+ideologists(2) AY D IY AA L AH JH IH S S
+ideologists(3) AY D IY AA L AH JH IH S
+ideologue AY D IY AH L OW G
+ideologues AY D IY AH L AO G Z
+ideology AY D IY AA L AH JH IY
+ideonomy AY D IY AA N AH M IY
+idette AY D EH T
+ididerod AY D IH D ER AA D
+idiocy IH D IY AH S IY
+idiom IH D IY AH M
+idiomatic IH D IY AH M AE T IH K
+idioms IH D IY AH M Z
+idiopath IH D IY OW P AE TH
+idiopathic IH D IY OW P AE TH AH K
+idiosyncrasies IH D IY OW S IH N K R AH S IY Z
+idiosyncrasy IH D IY OW S IH N K R AH S IY
+idiosyncratic IH D IY OW S IH N K R AE T IH K
+idiot IH D IY AH T
+idiotic IH D IY AA T IH K
+idiotically IH D IY AA T IH K L IY
+idiots IH D IY AH T S
+iditarod IH D IH T AH R AO D
+idle AY D AH L
+idled AY D AH L D
+idleman AY D AH L M AH N
+idleness AY D AH L N AH S
+idler AY D AH L ER
+idler(2) AY D L ER
+idles AY D AH L Z
+idlewild AY D AH L W AY L D
+idlewild(2) AY D AH L W AY L
+idling AY D AH L IH NG
+idling(2) AY D L IH NG
+idly AY D L IY
+ido IY D OW
+idol AY D AH L
+idola IH D OW L AH
+idolatrous AY D AA L AH T R AH S
+idolatry AY D AA L AH T R IY
+idolize AY D AH L AY Z
+idolized AY D AH L AY Z D
+idolizes AY D AH L AY Z IH Z
+idolizing AY D AH L AY Z IH NG
+idols AY D AH L Z
+idona IH D OW N AH
+idoney IH D OW N IY
+idonia IH D OW N IY AH
+idrocarburi IH D R AA K AA R B UH R IY
+iduna IH D UW N AH
+idyll AY D AH L
+idyllic AY D IH L IH K
+ierardi IY ER AA R D IY
+ierne IH R N
+iezzi IY EH T S IY
+if IH F
+ifas AY F AH S
+iffy IH F IY
+ifil AY F IY L
+ifill IH F IY L
+ifint AY F IH N T
+ifor AY F AO R
+ifs IH F S
+if_you're IH F Y UH R
+igarashi IY G AA R AA SH IY
+ige AY JH
+igel IH G AH L
+igene AY JH IY N
+iger AY G ER
+iglehart AY G AH L HH AA R T
+iglesia IY G L EY S IY AH
+iglesias IH G L EY S IY IH S
+igloo IH G L UW
+igman IH G M AH N
+ignace IH G N AH S
+ignacio IH G N AA S IY OW
+ignacio's IH G N AA S IY OW Z
+ignasiak IH G N AA S IY AE K
+ignatia IH G N AA SH AH
+ignatius IH G N EY SH AH S
+ignatowski IH G N AH T AO F S K IY
+ignatz IH G N AH T S
+igneous IH G N IY AH S
+ignite IH G N AY T
+ignited IH G N AY T IH D
+ignites IH G N AY T S
+igniting IH G N AY T IH NG
+ignition IH G N IH SH AH N
+ignoble IH G N OW B AH L
+ignominious IH G N AH M IH N IY AH S
+ignominy IH G N OW M IH N IY
+ignoramus IH G N ER EY M AH S
+ignorance IH G N ER AH N S
+ignorant IH G N ER AH N T
+ignore IH G N AO R
+ignored IH G N AO R D
+ignores IH G N AO R Z
+ignoring IH G N AO R IH NG
+igo IY G OW
+igoe IY G OW
+igon AY G AH N
+igor IH G AO R
+igor(2) IY G AO R
+igou IH G UW
+iguana AY G W AA N AH
+iguanas IH G W AA N AH Z
+igushi IH G UW SH IY
+ihasz AY HH AE S
+ihde IH D
+ihle AY HH AH L
+ihlenfeldt IH L IH N F IH L T
+ihnen IH N AH N
+ihrig IH R IH G
+ihrke IH R K
+iiams IY AH M Z
+iida IY D AH
+iie IY IY
+ijames IH Y AA M EH S
+ijames(2) AY JH EY M Z
+ijaz IH JH AH Z
+ijaz(2) IY JH AA Z
+ikaes AY K AE S
+ikard IH K ER D
+ike AY K
+ike's AY K S
+ikea AY K IY AH
+ikeda IH K EY D AH
+ikenberry AY K AH N B EH R IY
+ikerd IH K ER D
+ikeuchi IY K UW CH IY
+ikey IH K IY
+ikie IH K IY
+ikle IH K AH L
+ikner IH K N ER
+ikon AY K AA N
+il IH L
+ila IY L AH
+ilalis IH L AE L AH S
+ilalis' IH L AE L AH S
+ilalis's IH L AE L AH S IH S
+ilan IY L AA N
+ilana IH L AA N AH
+ilana's IH L AA N AH Z
+ilardi IH L AA R D IY
+ilbo IH L B OW
+ileana IH L IY AE N AH
+ilene IH L IY N
+iler AY L ER
+iles AY L Z
+ileto AY L EY D OW
+ilg IH L G
+ilgenfritz IH L G IH N F R IH T S
+ilhae IH L HH EY
+iliad IH L IY AH D
+iliano IH L IY AA N OW
+ilidza IH L IH D Z AH
+iliescu IH L IY EH S K Y UW
+iliff IH L IH F
+iljin IH L JH IH N
+ilk IH L K
+ilka IH L K AH
+ill IH L
+illegal IH L IY G AH L
+illegalities IH L IY G AE L IH T IY Z
+illegality IH L IY G AE L IH T IY
+illegally IH L IY G AH L IY
+illegals IH L IY G AH L Z
+illegible IH L EH JH AH B AH L
+illegitimacy IH L IH JH IH T AH M AH S IY
+illegitimate IH L IH JH IH T AH M IH T
+illes AY L Z
+illg IH L G
+illicit IH L IH S AH T
+illicitly IH L IH S IH T L IY
+illig IH L IH G
+illina IH L EY N AH
+illingworth IH L IH NG W ER TH
+illinois IH L AH N OY
+illinois' IH L IH N OY Z
+illinois's IH L IH N OY Z
+illinois(2) IH L AH N OY Z
+illiquid IH L IH K W IH D
+illiquidity IH L IH K W IH D IH T IY
+illiteracy IH L IH T ER AH S IY
+illiterate IH L IH T ER AH T
+illiterates IH L IH T ER AH T S
+illness IH L N AH S
+illnesses IH L N AH S IH Z
+illogic IH L AA JH IH K
+illogical IH L AA JH IH K AH L
+ills IH L Z
+illuminate IH L UW M IH N IH T
+illuminated IH L UW M AH N EY T AH D
+illuminates IH L UW M AH N EY T S
+illuminating IH L UW M AH N EY T IH NG
+illumination IH L UW M AH N EY SH AH N
+illuminator IH L UW M AH N EY T ER
+illumined IH L UW M AH N D
+illusion IH L UW ZH AH N
+illusionary IH L UW ZH AH N EH R IY
+illusionism IH L UW ZH AH N IH Z AH M
+illusionist IH L UW ZH AH N AH S T
+illusionist's IH L UW ZH AH N AH S T S
+illusionists IH L UW ZH AH N AH S T S
+illusionists(2) IH L UW ZH AH N AH S S
+illusionists(3) IH L UW ZH AH N AH S
+illusions IH L UW ZH AH N Z
+illusive IH L UW S IH V
+illusory IH L UW S ER IY
+illustrate IH L AH S T R EY T
+illustrated IH L AH S T R EY T AH D
+illustrated(2) IH L AH S T R EY T IH D
+illustrates IH L AH S T R EY T S
+illustrating IH L AH S T R EY T IH NG
+illustration IH L AH S T R EY SH AH N
+illustrations IH L AH S T R EY SH AH N Z
+illustrative IH L AH S T R AH T IH V
+illustrator IH L AH S T R EY T ER
+illustrators IH L AH S T R EY T ER Z
+illustrious IH L AH S T R IY AH S
+illyrian IH L IH R IY AH N
+ilo AY L OW
+ilona IH L OW N AH
+ilopango IY L OW P AE NG G OW
+ilsa IH L S AH
+ilse IH L S
+ilsley IH L Z L IY
+ilva IH L V AH
+ilya IH L Y AH
+ilyaronoff IH L Y AA R AO N AO F
+im IH M
+image IH M AH JH
+image(2) IH M IH JH
+imageries IH M IH JH R IY Z
+imagery IH M AH JH R IY
+imagery(2) IH M IH JH R IY
+images IH M AH JH AH Z
+images(2) IH M IH JH IH Z
+imaginable IH M AE JH AH N AH B AH L
+imaginary IH M AE JH AH N EH R IY
+imagination IH M AE JH AH N EY SH AH N
+imaginations IH M AE JH AH N EY SH AH N Z
+imaginative IH M AE JH AH N AH T IH V
+imaginatively IH M AE JH AH N AH T IH V L IY
+imagine IH M AE JH AH N
+imagined IH M AE JH AH N D
+imagineer IH M AE JH AH N IH R
+imagineering IH M AE JH AH N IH R IH NG
+imagines IH M AE JH AH N Z
+imaging IH M IH JH IH NG
+imagining IH M AE JH AH N IH NG
+imai IH M AY
+imam AY M AE M
+imamura IH M AA M UH R AH
+iman AY M AH N
+imari IY M AA R IY
+imasco IH M AE S OW
+imax AY M AE K S
+imax' AY M AE K S
+imax's AY M AE K S IH Z
+imbalance IH M B AE L AH N S
+imbalances IH M B AE L AH N S IH Z
+imbecile IH M B AH S AH L
+imbecile(2) IH M B AH S AY L
+imbeciles IH M B AH S AH L Z
+imbeciles(2) IH M B AH S AY L Z
+imbed IH M B EH D
+imbedded IH M B EH D IH D
+imbeds IH M B EH D Z
+imber IH M B ER
+imbera IH M B ER AH
+imbibe IH M B AY B
+imbibed IH M B AY B D
+imboden IH M B OW D AH N
+imbroglio IH M B R OW L Y OW
+imbrogno IH M B R OW G N OW
+imbue IH M B Y UW
+imbued IH M B Y UW D
+imburgia IH M B ER G IY AH
+imcera IH M S EH R AH
+imel IH M AH L
+imelda IH M EH L D AH
+imes AY M Z
+imhof IH M HH AH F
+imhoff IH M HH AO F
+imig IH M IH G
+imitable IH M AH T AH B AH L
+imitate IH M AH T EY T
+imitated IH M AH T EY T IH D
+imitates IH M AH T EY T S
+imitating IH M AH T EY T IH NG
+imitation IH M AH T EY SH AH N
+imitations IH M IH T EY SH AH N Z
+imitative IH M AH T EY T IH V
+imitator IH M AH T EY T ER
+imitators IH M IH T EY T ER Z
+imlay IH M L EY
+imler IH M L ER
+imm AY EH M EH M
+imm(2) IH M
+immaculate IH M AE K Y UW L IH T S
+immaculately IH M AE K Y AH L AH T L IY
+immanence IH M AH N AH N S
+immanent IH M AH N AH N T
+immanuel IH M AH N UH L
+immaterial IH M AH T IH R IY AH L
+immature IH M AH T Y UH R
+immaturity IH M AH CH UH R IH T IY
+immeasurable IH M EH ZH ER AE B AH L
+immeasurably IH M EH ZH ER AE B L IY
+immediacy IH M IY D IY AH S IY
+immediate IH M IY D IY AH T
+immediately IH M IY D IY AH T L IY
+immel IH M AH L
+immemorial IH M AH M AO R IY AH L
+immense IH M EH N S
+immensely IH M EH N S L IY
+immerman IH M ER M AH N
+immerse IH M ER S
+immersed IH M ER S T
+immersion IH M ER ZH AH N
+immigrant IH M AH G R AH N T
+immigrant's IH M AH G R AH N T S
+immigrants IH M AH G R AH N T S
+immigrants' IH M IH G R AH N T S
+immigrate IH M AH G R EY T
+immigrated IH M AH G R EY T IH D
+immigration IH M AH G R EY SH AH N
+imminence IH M AH N AH N S
+imminent IH M AH N AH N T
+imminently IH M AH N AH N T L IY
+immiscible IH M IH S AH B AH L
+immobile IH M OW B AH L
+immobile(2) IH M OW B AY L
+immobile(3) IH M OW B IY L
+immobility IH M OW B IH L IH T IY
+immobilize IH M OW B AH L AY Z
+immobilized IH M OW B AH L AY Z D
+immobilizing IH M OW B AH L AY Z IH NG
+immolate IH M AH L EY T
+immolated IH M AH L EY T AH D
+immolates IH M AH L EY T S
+immolating IH M AH L EY T IH NG
+immolation IH M AH L EY SH AH N
+immoral IH M AO R AH L
+immorality IH M ER AE L IH T IY
+immortal IH M AO R T AH L
+immortality IH M AO R T AE L IH T IY
+immortalize IH M AO R T AH L AY Z
+immortalized IH M AO R T AH L AY Z D
+immortalizes IH M AO R T AH L AY Z IH Z
+immortalizing IH M AO R T AH L AY Z IH NG
+immortals IH M AO R T AH L Z
+immotile IH M OW T AH L
+immovable IH M UW V AH B AH L
+immu IH M Y UW
+immulogic IH M Y UW L AA JH IH K
+immune IH M Y UW N
+immunetech IH M Y UW N T EH K
+immunex IH M Y UW N EH K S
+immunities IH M Y UW N IH T IY Z
+immunity IH M Y UW N AH T IY
+immunity(2) IH M Y UW N IH T IY
+immunization IH M Y UW N AH Z EY SH AH N
+immunizations IH M Y UW N AH Z EY SH AH N Z
+immunize IH M Y UW N AY Z
+immunized IH M Y AH N AY Z D
+immunizes IH M Y AH N AY Z IH Z
+immunizing IH M Y AH N AY Z IH NG
+immuno IH M Y UW N OW
+immunodeficiency IH M Y UW N OW D IH F IH SH AH N S IY
+immunological IH M Y UW N AH L AA JH IH K AH L
+immunologist IH M Y UW N AA L AH JH IH S T
+immunology IH M Y UW N AA L AH JH IY
+immunomedic IH M Y UW N OW M EH D IH K
+immunomedics IH M Y UW N OW M EH D IH K S
+immunotherapy IH M Y UW N OW TH EH R AH P IY
+immutable IH M Y UW T AH B AH L
+imnet IH M N EH T
+imo AY M OW
+imo(2) AY EH M OW
+imogen IH M AH G AH N
+imogene IH M AH JH IY N
+imondi IH M OW N D IY
+imondi(2) IH M AA N D IY
+imp IH M P
+impact IH M P AE K T
+impacted IH M P AE K T IH D
+impacting IH M P AE K T IH NG
+impacts IH M P AE K T S
+impacts(2) IH M P AE K S
+impair IH M P EH R
+impaired IH M P EH R D
+impairing IH M P EH R IH NG
+impairment IH M P EH R M AH N T
+impairments IH M P EH R M AH N T S
+impairs IH M P EH R Z
+impala IH M P AA L AH
+impale IH M P EY L
+impaled IH M P EY L D
+impales IH M P EY L Z
+impaling IH M P EY L IH NG
+impanel IH M P AE N AH L
+impaneled IH M P AE N AH L D
+impart IH M P AA R T
+imparted IH M P AA R T IH D
+impartial IH M P AA R SH AH L
+impartiality IH M P AA R SH IY AE L IH T IY
+impartially IH M P AA R SH AH L IY
+imparting IH M P AA R T IH NG
+imparts IH M P AA R T S
+impassable IH M P AE S AH B AH L
+impasse IH M P AE S
+impassion IH M P AE SH AH N
+impassioned IH M P AE SH AH N D
+impassive IH M P AE S IH V
+impassively IH M P AE S IH V L IY
+impastato IH M P AA S T AA T OW
+impatience IH M P EY SH AH N S
+impatiens IH M P EY SH AH N Z
+impatient IH M P EY SH AH N T
+impatiently IH M P EY SH AH N T L IY
+impeach IH M P IY CH
+impeachable IH M P IY CH AH B AH L
+impeached IH M P IY CH T
+impeaches IH M P IY CH AH Z
+impeaching IH M P IY CH IH NG
+impeachment IH M P IY CH M AH N T
+impeachments IH M P IY CH M AH N T S
+impeccable IH M P EH K AH B AH L
+impeccably IH M P EH K AH B L IY
+impedance IH M P IY D AH N S
+impede IH M P IY D
+impeded IH M P IY D IH D
+impedes IH M P IY D Z
+impediment IH M P EH D AH M AH N T
+impediments IH M P EH D AH M AH N T S
+impeding IH M P IY D IH NG
+impel IH M P EH L
+impelled IH M P EH L D
+impend IH M P EH N D
+impending IH M P EH N D IH NG
+impenetrable IH M P EH N AH T R AH B AH L
+imperative IH M P EH R AH T IH V
+imperatives IH M P EH R AH T IH V Z
+imperato IH M P ER AA T OW
+imperceptible IH M P ER S EH P T IH B AH L
+imperceptibly IH M P ER S EH P T IH B L IY
+imperfect IH M P ER F IH K T
+imperfection IH M P ER F EH K SH AH N
+imperfections IH M P ER F EH K SH AH N Z
+imperfectly IH M P ER F IH K T L IY
+imperia IH M P IY R IY AH
+imperial IH M P IH R IY AH L
+imperial's IH M P IH R IY AH L Z
+imperiale IH M P ER IY AA L IY
+imperialism IH M P IH R IY AH L IH Z AH M
+imperialist IH M P IH R IY AH L IH S T
+imperialistic IH M P IY R IY AH L IH S T IH K
+imperialists IH M P IH R IY AH L IH S T S
+imperialists(2) IH M P IH R IY AH L IH S S
+imperialists(3) IH M P IH R IY AH L IH S
+imperil IH M P EH R AH L
+imperiled IH M P EH R AH L D
+imperiling IH M P EH R AH L IH NG
+imperils IH M P EH R AH L Z
+imperious IH M P IH R IY AH S
+impermissible IH M P ER M IH S IH B AH L
+impersonal IH M P ER S AH N AH L
+impersonality IH M P ER S AH N AE L AH T IY
+impersonate IH M P ER S AH N EY T
+impersonated IH M P ER S AH N EY T IH D
+impersonates IH M P ER S AH N EY T S
+impersonating IH M P ER S AH N EY T IH NG
+impersonation IH M P ER S AH N EY SH AH N
+impersonator IH M P ER S AH N EY T ER
+impersonators IH M P ER S AH N EY T ER Z
+impertinent IH M P ER T AH N AH N T
+impervious IH M P ER V IY AH S
+impetuous IH M P EH CH W AH S
+impetus IH M P AH T AH S
+impinge IH M P IH N JH
+impinged IH M P IH N JH D
+impinges IH M P IH N JH IH Z
+impinging IH M P IH N JH IH NG
+impious IH M P AY AH S
+impish IH M P IH SH
+implacable IH M P L AE K AH B AH L
+implant IH M P L AE N T
+implantable IH M P L AE N T AH B AH L
+implantation IH M P L AE N T EY SH AH N
+implanted IH M P L AE N T IH D
+implanting IH M P L AE N T IH NG
+implants IH M P L AE N T S
+implausible IH M P L AO Z AH B AH L
+implausibly IH M P L AO Z AH B L IY
+implement IH M P L AH M AH N T
+implementation IH M P L AH M EH N T EY SH AH N
+implemented IH M P L AH M EH N T AH D
+implemented(2) IH M P L AH M EH N AH D
+implementing IH M P L AH M EH N T IH NG
+implementing(2) IH M P L AH M EH N IH NG
+implements IH M P L AH M AH N T S
+implicate IH M P L IH K EY T
+implicated IH M P L IH K EY T IH D
+implicates IH M P L IH K EY T S
+implicating IH M P L IH K EY T IH NG
+implication IH M P L AH K EY SH AH N
+implications IH M P L AH K EY SH AH N Z
+implicit IH M P L IH S AH T
+implicitly IH M P L IH S AH T L IY
+implied IH M P L AY D
+implies IH M P L AY Z
+implode IH M P L OW D
+imploded IH M P L OW D IH D
+implodes IH M P L OW D Z
+imploding IH M P L OW D IH NG
+implore IH M P L AO R
+implored IH M P L AO R D
+implores IH M P L AO R Z
+imploring IH M P L AO R IH NG
+implosion IH M P L OW ZH AH N
+imply IH M P L AY
+implying IH M P L AY IH NG
+impolite IH M P AH L AY T
+impolitic IH M P AO L IH T IH K
+imponderable IH M P AA N D ER AH B AH L
+imponderables IH M P AA N D ER AH B AH L Z
+import IH M P AO R T
+importance IH M P AO R T AH N S
+important IH M P AO R T AH N T
+importantly IH M P AO R T AH N T L IY
+importation IH M P AO R T EY SH AH N
+imported IH M P AO R T IH D
+importer IH M P AO R T ER
+importers IH M P AO R T ER Z
+importers' IH M P AO R T ER Z
+importing IH M P AO R T IH NG
+imports IH M P AO R T S
+imports' IH M P AO R T S
+impose IH M P OW Z
+imposed IH M P OW Z D
+imposes IH M P OW Z AH Z
+imposes(2) IH M P OW Z IH Z
+imposing IH M P OW Z IH NG
+imposition IH M P AH Z IH SH AH N
+impossibility IH M P AO S IH B IH L IH T IY
+impossible IH M P AA S AH B AH L
+impossible's IH M P AA S AH B AH L Z
+impossibly IH M P AA S AH B L IY
+impostor IH M P AO S T ER
+impostors IH M P AO S T ER Z
+impotence IH M P AH T AH N S
+impotent IH M P AH T AH N T
+impound IH M P AW N D
+impounded IH M P AW N D IH D
+impounding IH M P AW N D IH NG
+impoundment IH M P AW N D M AH N T
+impoundments IH M P AW N D M AH N T S
+impounds IH M P AW N D Z
+impoverish IH M P AA V R IH SH
+impoverished IH M P AA V R IH SH T
+impoverishes IH M P AA V R IH SH AH Z
+impoverishing IH M P AA V R IH SH IH NG
+impoverishment IH M P AA V R IH SH M AH N T
+impracticable IH M P R AE K T IH K AH B AH L
+impractical IH M P R AE K T AH K AH L
+impractical(2) IH M P R AE K T IH K AH L
+imprecise IH M P R AH S AY S
+impregnable IH M P R EH G N AH B AH L
+impregnate IH M P R EH G N EY T
+impregnated IH M P R EH G N EY T AH D
+impregnates IH M P R EH G N EY T S
+impregnating IH M P R EH G N EY T IH NG
+impregnation IH M P R EH G N EY SH AH N
+impresario IH M P R IH S AA R IY OW
+impress IH M P R EH S
+impressed IH M P R EH S T
+impresses IH M P R EH S IH Z
+impressing IH M P R EH S IH NG
+impression IH M P R EH SH AH N
+impressionable IH M P R EH SH AH N AH B AH L
+impressionism IH M P R EH SH AH N IH Z AH M
+impressionist IH M P R EH SH AH N AH S T
+impressionist(2) IH M P R EH SH AH N IH S T
+impressionistic IH M P R EH SH AH N IH S T IH K
+impressionists IH M P R EH SH AH N IH S T S
+impressionists(2) IH M P R EH SH AH N IH S S
+impressionists(3) IH M P R EH SH AH N IH S
+impressions IH M P R EH SH AH N Z
+impressive IH M P R EH S IH V
+impressively IH M P R EH S IH V L IY
+impressment IH M P R EH S M AH N T
+imprimatur IH M P R IH M AA T ER
+imprimis IH M P R IY M IH S
+imprint IH M P R IH N T
+imprinted IH M P R IH N T IH D
+imprinted(2) IH M P R IH N IH D
+imprinting IH M P R IH N T IH NG
+imprinting(2) IH M P R IH N IH NG
+imprints IH M P R IH N T S
+imprison IH M P R IH Z AH N
+imprisoned IH M P R IH Z AH N D
+imprisoning IH M P R IH Z AH N IH NG
+imprisonment IH M P R IH Z AH N M AH N T
+imprisons IH M P R IH Z AH N Z
+improbable IH M P R AA B AH B AH L
+improbably IH M P R AA B AH B L IY
+impromptu IH M P R AA M P T UW
+improper IH M P R AA P ER
+improperly IH M P R AA P ER L IY
+improprieties IH M P R AH P R AY AH T IY Z
+impropriety IH M P R AH P R AY AH T IY
+improv IH M P R AA V
+improve IH M P R UW V
+improved IH M P R UW V D
+improvement IH M P R UW V M AH N T
+improvements IH M P R UW V M AH N T S
+improves IH M P R UW V Z
+improving IH M P R UW V IH NG
+improvisation IH M P R AA V IH Z EY SH AH N
+improvisational IH M P R AA V IH Z EY SH AH N AH L
+improvisations IH M P R AA V IH Z EY SH AH N Z
+improvise IH M P R AH V AY Z
+improvised IH M P R AH V AY Z D
+improvises IH M P R AH V AY Z AH Z
+improvising IH M P R AH V AY Z IH NG
+imprudence IH M P R UW D AH N S
+imprudent IH M P R UW D AH N T
+imprudently IH M P R UW D AH N T L IY
+impson IH M P S AH N
+impugn IH M P Y UW N
+impugned IH M P Y UW N D
+impugning IH M P Y UW N IH NG
+impugns IH M P Y UW N Z
+impulse IH M P AH L S
+impulses IH M P AH L S IH Z
+impulsive IH M P AH L S IH V
+impulsively IH M P AH L S IH V L IY
+impunity IH M P Y UW N IH T IY
+impure IH M P Y UH R
+impurities IH M P Y UH R AH T IY Z
+impurity IH M P Y UH R AH T IY
+imputation IH M P Y AH T EY SH AH N
+impute IH M P Y UW T
+imputed IH M P Y UW T IH D
+imre IH M R AH
+imreg IH M R EH G
+imreg's IH M R EH G Z
+imrie IH M ER IY
+imus AY M AH S
+in IH N
+in's IH N Z
+in. IH N
+in.(2) IH N CH
+ina IY N AH
+inability IH N AH B IH L IH T IY
+inabinet IH N AH B IH N IH T
+inaccessibility IH N AH K S EH S AH B IH L AH T IY
+inaccessible IH N AH K S EH S AH B AH L
+inaccuracies IH N AE K Y ER AE S IY Z
+inaccuracy IH N AE K Y ER AH S IY
+inaccurate IH N AE K Y ER AH T
+inaccurately IH N AE K Y ER AH T L IY
+inacom IH N AH K AA M
+inacom(2) AY N AH K AA M
+inacomp AY N AH K AA M P
+inacomp(2) IH N AH K AA M P
+inaction IH N AE K SH AH N
+inactivate IH N AE K T IH V EY T
+inactivated IH N AE K T IH V EY T IH D
+inactivates IH N AE K T IH V EY T S
+inactivation IH N AE K T IH V EY SH AH N
+inactive IH N AE K T IH V
+inactivity IH N AE K T IH V IH T IY
+inadequacies IH N AE D AH K W AH S IY Z
+inadequacy IH N AE D IH K W AH S IY
+inadequate IH N AE D AH K W AH T
+inadequate(2) IH N AE D AH K W EY T
+inadequately IH N AE D AH K W AH T L IY
+inadmissible IH N AH D M IH S AH B AH L
+inadmissible(2) IH N AE D M IH S AH B AH L
+inadmissibly IH N AH D M IH S AH B L IY
+inadmissibly(2) IH N AE D M IH S AH B L IY
+inadvertence IH N AH D V ER T AH N S
+inadvertence(2) IH N AE D V ER T AH N S
+inadvertent IH N AH D V ER T AH N T
+inadvertent(2) IH N AE D V ER T AH N T
+inadvertently IH N AH D V ER T AH N T L IY
+inadvertently(2) IH N AE D V ER T AH N T L IY
+inadvisable IH N AH D V AY Z AH B AH L
+inadvisable(2) IH N AE D V AY Z AH B AH L
+inaez IH N AE Z
+inaez(2) IH N EY Z
+inaki IH N AA K IY
+inalienable IH N EY L Y AH N AH B AH L
+inamura IH N AH M UH R AH
+inane IH N EY N
+inanimate IH N AE N AH M AH T
+inapplicable IH N AE P L IH K AH B AH L
+inappropriate IH N AH P R OW P R IY IH T
+inappropriately IH N AH P R AA P R IY AH T L IY
+inarticulate IH N AA R T IH K Y AH L AH T
+inasmuch IH N AE S M AH K
+inattention IH N AH T EH N CH AH N
+inattentive IH N AH T EH N T IH V
+inaudible IH N AO D AH B AH L
+inaudibly IH N AO D AH B L IY
+inaugural IH N AO G ER AH L
+inaugural(2) IH N AO G Y ER AH L
+inaugurate IH N AO G Y ER IH T
+inaugurate(2) IH N AO G Y ER EY T
+inaugurated IH N AO G ER EY T IH D
+inaugurated(2) IH N AO G Y ER EY T IH D
+inaugurates IH N AO G Y ER IH T S
+inaugurating IH N AO G Y ER EY T IH NG
+inauguration IH N AO G Y ER EY SH AH N
+inaugurations IH N AO G Y ER EY SH AH N Z
+inauspicious IH N AW S P IH SH IH S
+inbio IH N B AY OW
+inboard IH N B AO R D
+inboden IH N B OW D AH N
+inbody IH N B AA D IY
+inborn IH N B AO R N
+inbound IH N B AW N D
+inbred IH N B R EH D
+inbreed IH N B R IY D
+inbreeding IH N B R IY D IH NG
+inc IH NG K
+inc. IH NG K
+inc.'s IH NG K S
+inc.(2) IH NG K AO R P AO R EY T AH D
+inca IH NG K AH
+incalculable IH N K AE L K Y AH L AH B AH L
+incandescent IH N K AH N D EH S AH N T
+incant IH N K AE N T
+incantation IH N K AE N T EY SH AH N
+incantatory IH N K AE N T AH T AO R IY
+incapable IH N K EY P AH B AH L
+incapacitate IH N K AH P AE S IH T EY T
+incapacitated IH N K AH P AE S IH T EY T IH D
+incapacitating IH N K AH P AE S IH T EY T IH NG
+incapacitation IH N K AH P AE S IH T EY SH AH N
+incapacity IH N K AH P AE S AH T IY
+incarcerate IH N K AA R S ER EY T
+incarcerated IH N K AA R S ER EY T IH D
+incarcerates IH N K AA R S ER EY T S
+incarcerating IH N K AA R S ER EY T IH NG
+incarceration IH N K AA R S ER EY SH AH N
+incarnate IH N K AA R N AH T
+incarnate(2) IH N K AA R N EY T
+incarnation IH N K AA R N EY SH AH N
+incarnations IH N K AA R N EY SH AH N Z
+incas IH NG K AH Z
+incase IH N K EY S
+incata IH NG K AA T AH
+incata's IH NG K AA T AH Z
+ince IH N S
+incendiary IH N S EH N D IY EH R IY
+incense IH N S EH N S
+incensed IH N S EH N S T
+incentive IH N S EH N T IH V
+incentive(2) IH N S EH N IH V
+incentives IH N S EH N T IH V Z
+incentives(2) IH N S IH N IH V Z
+inception IH N S EH P SH AH N
+incessant IH N S EH S AH N T
+incessantly IH N S EH S AH N T L IY
+incest IH N S EH S T
+incestuous IH N S EH S CH W AH S
+inch IH N CH
+inchcape IH N CH K EY P
+inched IH N CH T
+inches IH N CH AH Z
+inches' IH N CH AH Z
+inches'(2) IH N CH IH Z
+inches(2) IH N CH IH Z
+inching IH N CH IH NG
+inchon IH N CH AH N
+inchon(2) IH N CH AA N
+incidence IH N S AH D AH N S
+incidence(2) IH N S IH D AH N S
+incidences IH N S AH D AH N S IH Z
+incident IH N S AH D AH N T
+incidental IH N S IH D EH N T AH L
+incidentally IH N S IH D EH N T AH L IY
+incidentally(2) IH N S IH D EH N T L IY
+incidentals IH N S IH D EH N T AH L Z
+incidents IH N S AH D AH N T S
+incinerate IH N S IH N ER EY T
+incinerated IH N S IH N ER EY T IH D
+incinerating IH N S IH N ER EY T IH NG
+incineration IH N S IH N ER EY SH AH N
+incinerator IH N S IH N ER EY T ER
+incinerators IH N S IH N ER EY T ER Z
+incipient IH N S IH P IY AH N T
+incirlik IH N S ER L IH K
+incise IH N S AY Z
+incised IH N S AY Z D
+incision IH N S IH ZH AH N
+incisions IH N S IH ZH AH N Z
+incisive IH N S AY S IH V
+incisor IH N S AY Z ER
+incisors IH N S AY Z ER Z
+incite IH N S AY T
+incited IH N S AY T IH D
+incitement IH N S AY T M AH N T
+incitements IH N S AY T M AH N T S
+incites IH N S AY T S
+inciting IH N S AY T IH NG
+incivility IH N S IH V IH L IH T IY
+inclement IH N K L EH M AH N T
+inclement(2) IH N K L IH M AH N T
+inclination IH N K L AH N EY SH AH N
+inclinations IH N K L AH N EY SH AH N Z
+incline IH N K L AY N
+inclined IH N K L AY N D
+inclines IH N K L AY N Z
+inclosure IH N K L OW ZH ER
+include IH N K L UW D
+included IH N K L UW D AH D
+included(2) IH N K L UW D IH D
+includes IH N K L UW D Z
+including IH N K L UW D IH NG
+inclusion IH N K L UW ZH AH N
+inclusions IH N K L UW ZH AH N Z
+inclusive IH N K L UW S IH V
+inclusiveness IH N K L UW S IH V N IH S
+inclusiveness(2) IH N K L UW S IH V N EH S
+inco IH N K OW
+inco's IH NG K OW Z
+incognito IH N K AO G N IY T OW
+incoherence IH N K OW HH IH R AH N S
+incoherent IH N K OW HH IH R AH N T
+incoherently IH N K OW HH IH R AH N T L IY
+incom IH NG K AA M
+income IH N K AH M
+incomes IH N K AH M Z
+incoming IH N K AH M IH NG
+incommunicado IH N K AH M Y UW N AH K AA D OW
+incomparable IH N K AA M P ER AH B AH L
+incomparably IH N K AA M P ER AH B L IY
+incompatibility IH N K AA M P AH T IH B IH L IH T IY
+incompatible IH N K AH M P AE T AH B AH L
+incompetence IH N K AA M P AH T AH N S
+incompetency IH N K AA M P AH T AH N S IY
+incompetent IH N K AA M P AH T AH N T
+incompetently IH N K AA M P AH T AH N T L IY
+incompetents IH NG K AA M P AH T AH N T S
+incomplete IH N K AH M P L IY T
+incomprehensible IH NG K AA M P R AH HH EH N S IH B AH L
+incomprehensibly IH NG K AA M P R AH HH EH N S IH B L IY
+incompressible IH N K AH M P R EH S AH B AH L
+inconceivable IH N K AH N S IY V AH B AH L
+inconclusive IH N K AH N K L UW S IH V
+inconclusively IH NG K AA N K L UW S IH V L IY
+incongruity IH NG K AO NG R UW IH T IY
+incongruous IH NG K AO NG R UW AH S
+incongruously IH NG K AO NG R UW AH S L IY
+inconsequential IH NG K AA N S AH K W EH N CH AH L
+inconsistencies IH NG K AA N S IH S T EH N S IY Z
+inconsistency IH N K AH N S IH S T AH N S IY
+inconsistent IH N K AH N S IH S T AH N T
+inconspicuous IH NG K AA N S P IH K W AH S
+inconstancy IH N K AA N S T AH N S IY
+incontinence IH N K AA N T AH N AH N S
+incontinent IH N K AA N T AH N AH N T
+incontrovertible IH NG K AA N T R OW V ER T IH B AH L
+inconvenience IH N K AH N V IY N Y AH N S
+inconvenienced IH N K AH N V IY N Y AH N S T
+inconveniences IH N K AH N V IY N Y AH N S IH Z
+inconvenient IH N K AH N V IY N Y AH N T
+incoordination IH N K OW AO R D AH N EY SH AH N
+incorporate IH N K AO R P ER EY T
+incorporated IH N K AO R P ER EY T AH D
+incorporated's IH N K AO R P ER EY T IH D Z
+incorporated(2) IH N K AO R P ER EY T IH D
+incorporates IH N K AO R P ER EY T S
+incorporating IH N K AO R P ER EY T IH NG
+incorporation IH N K AO R P ER EY SH AH N
+incorporation's IH N K AO R P ER EY SH AH N Z
+incorporations IH N K AO R P ER EY SH AH N Z
+incorrect IH N K ER EH K T
+incorrectly IH N K ER EH K T L IY
+incorrigible IH N K AA R AH JH AH B AH L
+incorvaia IH N K AO R V AA Y AH
+increase IH N K R IY S
+increased IH N K R IY S T
+increases IH N K R IY S AH Z
+increases(2) IH N K R IY S IH Z
+increasing IH N K R IY S IH NG
+increasingly IH N K R IY S IH NG L IY
+increasingly(2) IH N K R IY S IH NG G L IY
+incredible IH N K R EH D AH B AH L
+incredibly IH N K R EH D AH B L IY
+incredulity IH N K R AH D UW L IH T IY
+incredulous IH N K R EH JH AH L AH S
+increment IH N K R AH M AH N T
+incremental IH N K R AH M EH N T AH L
+incremental(2) IH N K R AH M EH N AH L
+incrementalism IH N K R AH M EH N T AH L IH Z M
+incrementalism(2) IH N K R AH M EH N AH L IH Z M
+incrementally IH N K R AH M EH N T AH L IY
+incrementally(2) IH N K R AH M EH N AH L IY
+increments IH NG K R AH M AH N T S
+incriminate IH N K R IH M AH N EY T
+incriminating IH N K R IH M AH N EY T IH NG
+incrimination IH N K R IH M AH N EY SH AH N
+incrust IH N K R AH S T
+incrustation IH N K R AH S T EY SH AH N
+incstar IH NG K S T AA R
+incubate IH N K Y AH B EY T
+incubating IH N K Y AH B EY T IH NG
+incubation IH NG K Y UW B EY SH AH N
+incubator IH NG K Y AH B EY T ER
+incubators IH NG K Y UW B EY T ER Z
+inculcate IH NG K AH L K EY T
+inculcated IH NG K AH L K EY T AH D
+inculcates IH NG K AH L K EY T S
+incumbency IH N K AH M B AH N S IY
+incumbent IH N K AH M B AH N T
+incumbent's IH N K AH M B AH N T S
+incumbents IH N K AH M B AH N T S
+incur IH N K ER
+incurable IH N K Y UH R AH B AH L
+incurred IH N K ER D
+incurring IH N K ER IH NG
+incurs IH N K ER Z
+incursion IH N K ER ZH AH N
+incursions IH N K ER ZH AH N Z
+inda IY N D AH
+indaba IH N D AA B AH
+indal IH N D AH L
+indata IH N D AA T AH
+indebted IH N D EH T AH D
+indebted(2) IH N D EH T IH D
+indebtedness IH N D EH T IH D N IH S
+indecency IH N D IY S AH N S IY
+indecent IH N D IY S AH N T
+indecision IH N D IH S IH ZH AH N
+indecisive IH N D IH S AY S IH V
+indecisiveness IH N D EH S IH S IH V N AH S
+indeed IH N D IY D
+indefatigable IH N D IH F AE T IH G AH B AH L
+indefensible IH N D IH F EH N S AH B AH L
+indefinable IH N D IH F AY N AH B AH L
+indefinite IH N D EH F AH N AH T
+indefinitely IH N D EH F AH N AH T L IY
+indelible IH N D EH L IH B AH L
+indelibly IH N D EH L AH B L IY
+indelicate IH N D EH L IH K AH T
+indelicato IH N D EH L IY K AA T OW
+indemnification IH N D EH M N AH F IH K EY SH AH N
+indemnified IH N D EH M N AH F AY D
+indemnify IH N D EH M N AH F AY
+indemnifying IH N D EH M N IH F AY IH NG
+indemnities IH N D EH M N IH T IY Z
+indemnity IH N D EH M N AH T IY
+indemnity(2) IH N D EH M N IH T IY
+indent IH N D EH N T
+indentation IH N D EH N T EY SH AH N
+indenture IH N D EH N CH ER
+indentured IH N D EH N CH ER D
+indentures IH N D EH N CH ER Z
+independence IH N D IH P EH N D AH N S
+independence's IH N D IH P EH N D AH N S IH Z
+independent IH N D IH P EH N D AH N T
+independently IH N D IH P EH N D AH N T L IY
+independents IH N D IH P EH N D AH N T S
+inderal IH N D ER AH L
+indescribable IH N D IH S K R AY B AH B AH L
+indestructibility IH N D AH S T R AH K T IH B IH L IH T IY
+indestructible IH N D AH S T R AH K T IH B AH L
+indeterminate IH N D IH T ER M IH N IH T
+index IH N D EH K S
+index's IH N D EH K S IH Z
+indexation IH N D EH K S EY SH AH N
+indexed IH N D EH K S T
+indexer IH N D EH K S ER
+indexers IH N D EH K S ER Z
+indexes IH N D EH K S IH Z
+indexing IH N D EH K S IH NG
+india IH N D IY AH
+india's IH N D IY AH Z
+indiaia IH N D IY AY AH
+indian IH N D IY AH N
+indian's IH N D IY AH N Z
+indiana IH N D IY AE N AH
+indiana's IH N D IY AE N AH Z
+indianapolis IH N D IY AH N AE P AH L IH S
+indianapolis's IH N D IY AH N AE P AH L IH S IH Z
+indianian IH N D IY AE N IY AH N
+indianians IH N D IY AE N IY AH N Z
+indianola IH N D IY AH N OW L AH
+indians IH N D IY AH N Z
+indians' IH N D IY AH N Z
+indic IH N D IH K
+indica IH D AH K AH
+indicate IH N D AH K EY T
+indicated IH N D AH K EY T AH D
+indicated(2) IH N D AH K EY T IH D
+indicates IH N D IH K EY T S
+indicating IH N D AH K EY T IH NG
+indication IH N D AH K EY SH AH N
+indications IH N D AH K EY SH AH N Z
+indicative IH N D IH K AH T IH V
+indicator IH N D AH K EY T ER
+indicators IH N D AH K EY T ER Z
+indices IH N D IH S IY Z
+indices(2) IH N D AH S IH Z
+indicia IH N D IH S Y AH
+indict IH N D AY T
+indicted IH N D AY T AH D
+indicted(2) IH N D AY T IH D
+indicting IH N D AY T IH NG
+indictment IH N D AY T M AH N T
+indictments IH N D AY T M AH N T S
+indie IH N D IY
+indies IH N D IY Z
+indifference IH N D IH F ER AH N S
+indifference(2) IH N D IH F R AH N S
+indifferent IH N D IH F R AH N T
+indifferent(2) IH N D IH F ER AH N T
+indigenous IH N D IH JH AH N AH S
+indigenously IH N D IH JH AH N AH S L IY
+indigent IH N D IH JH AH N T
+indigents IH N D IH JH AH N T S
+indigest IH N D AY JH EH S T
+indigest(2) IH N D AH JH EH S T
+indigestion IH N D AY JH EH S CH AH N
+indignant IH N D IH G N AH N T
+indignantly IH N D IH G N AH N T L IY
+indignation IH N D IH G N EY SH AH N
+indignities IH N D IH G N AH T IY Z
+indignity IH N D IH G N AH T IY
+indigo IH N D AH G OW
+indigo(2) IH N D IH G OW
+indira IH N D IH R AH
+indirect IH N D ER EH K T
+indirectly IH N D ER EH K T L IY
+indirectly(2) IH N D ER EH K L IY
+indiscreet IH N D IH S K R IY T
+indiscretion IH N D IH S K R EH SH AH N
+indiscretions IH N D IH S K R EH SH AH N Z
+indiscriminate IH N D IH S K R IH M AH N AH T
+indiscriminately IH N D IH S K R IH M AH N AH T L IY
+indispensable IH N D IH S P EH N S AH B AH L
+indispensible IH N D IH S P EH N S IH B AH L
+indisputable IH N D IH S P Y UW T AH B AH L
+indisputably IH N D IH S P Y UW T AE B L IY
+indistinct IH N D IH S T IH NG K T
+indistinguishable IH N D IH S T IH NG G W IH SH AH B AH L
+indite IH N D AY T
+indited IH N D AY T IH D
+indium IH N D IY AH M
+individual IH N D AH V IH JH AH W AH L
+individual's IH N D AH V IH JH AH W AH L Z
+individualism IH N D IH V IH D UW AH L IH Z AH M
+individualist IH N D IH V IH D UW AH L IH S T
+individualistic IH N D IH V IH JH UW AH L IH S T IH K
+individualists IH N D AH V IH JH UW AH L IH S T S
+individualists(2) IH N D AH V IH JH UW AH L IH S S
+individualists(3) IH N D AH V IH JH UW AH L IH S
+individuality IH N D IH V IH JH UW AE L IH T IY
+individualize IH N D IH V IH JH UW AH L AY Z
+individualize(2) IH N D IH V IH JH AH L AY Z
+individualized IH N D IH V IH JH UW AH L AY Z D
+individualized(2) IH N D IH V IH JH AH L AY Z D
+individually IH N D IH V IH JH UW AH L IY
+individually(2) IH N D IH V IH JH AH L IY
+individuals IH N D AH V IH JH AH W AH L Z
+individuals' IH N D IH V IH JH AH W AH L Z
+indivisible IH N D IH V IH S IH B AH L
+indo IH N D OW
+indo-european IH N D OW Y UH R AH P IY AH N
+indochina IH N D OW CH AY N AH
+indochinese IH N D OW CH AY N IY Z
+indoctrinated IH N D AA K T R AH N EY T IH D
+indoctrination IH N D AA K T R AH N EY SH AH N
+indolent IH N D AH L AH N T
+indomitable IH N D AA M AH T AH B AH L
+indonesia IH N D OW N IY ZH AH
+indonesia's IH N D OW N IY ZH AH Z
+indonesian IH N D OW N IY ZH AH N
+indonesians IH N D OW N IY S IY AH N Z
+indonesians(2) IH N D OW N IY ZH AH N Z
+indoor IH N D AO R
+indoors IH N D AO R Z
+indosuez IH N D OW S UW EY Z
+indosuez(2) IH N D OW S UW EH Z
+indovina IH N D OW V IY N AH
+indri IH N D R IY
+indubious IH D UW B IY AH S
+indubiously IH D UW B IY AH S L IY
+induce IH N D UW S
+induced IH N D UW S T
+inducement IH N D UW S M AH N T
+inducements IH N D UW S M AH N T S
+induces IH N D UW S IH Z
+inducing IH N D UW S IH NG
+induct IH N D AH K T
+inductance IH N D AH K T AH N S
+inducted IH N D AH K T AH D
+inducted(2) IH N D AH K T IH D
+inductee IH N D AH K T IY
+inductees IH N D AH K T IY Z
+induction IH N D AH K SH AH N
+inductor IH N D AH K T ER
+indulge IH N D AH L JH
+indulged IH N D AH L JH D
+indulgence IH N D AH L JH AH N S
+indulgences IH N D AH L JH AH N S AH Z
+indulgences(2) IH N D AH L JH AH N S IH Z
+indulgent IH N D AH L JH AH N T
+indulges IH N D AH L JH IH Z
+indulging IH N D AH L JH IH NG
+indus IH N D AH S
+industri IH N D AH S T R IY
+industria IH N D AH S T R IY AH
+industrial IH N D AH S T R IY AH L
+industrial's IH N D AH S T R IY AH L Z
+industriale IH N D AH S T R IY AA L IY
+industriali IH N D AH S T R IY AA L IY
+industrialist IH N D AH S T R IY AH L IH S T
+industrialists IH N D AH S T R IY AH L IH S T S
+industrialists(2) IH N D AH S T R IY AH L IH S S
+industrialists(3) IH N D AH S T R IY AH L IH S
+industrialization IH N D AH S T R IY AH L IH Z EY SH AH N
+industrialize IH N D AH S T R IY AH L AY Z
+industrialized IH N D AH S T R IY AH L AY Z D
+industrializing IH N D AH S T R IY AH L AY Z IH NG
+industrially IH N D AH S T R IY AH L IY
+industrials IH N D AH S T R IY AH L Z
+industrials' IH N D AH S T R IY AH L Z
+industrie IH N D AH S T R IY
+industrielle IH N D AH S T R IY EH L
+industrielle(2) IH N D AH S T R IY AH L EH
+industrier IH N D AH S T R IY ER
+industries IH N D AH S T R IY Z
+industries' IH N D AH S T R IY Z
+industrious IH N D AH S T R IY AH S
+industrivaerden IH N D AH S T R IY V EH R D AH N
+industry IH N D AH S T R IY
+industry's IH N D AH S T R IY Z
+industrywide IH N D AH S T R IY W AY D
+indy IH N D IY
+indyk IH N D IH K
+inebriate IH N EH B R IY EY T
+inebriated IH N EH B R IY EY T AH D
+inebriates IH N EH B R IY EY T S
+inebriating IH N EH B R IY EY T IH NG
+inedible IH N EH D AH B AH L
+ineffable IH N EH F AH B AH L
+ineffective IH N IH F EH K T IH V
+ineffectiveness IH N AH F EH K T IH V N AH S
+ineffectual IH N AH F EH K CH UW AH L
+inefficiencies IH N IH F IH SH AH N S IY Z
+inefficiency IH N IH F IH SH AH N S IY
+inefficient IH N IH F IH SH AH N T
+inefficiently IH N IH F IH SH AH N T L IY
+inelastic IH N AH L AE S T IH K
+ineligible IH N EH L IH JH AH B AH L
+ineluctible IH N AH L AH K T AH B AH L
+inept IH N EH P T
+ineptitude IH N EH P T IH T UW D
+ineptly IH N EH P T L IY
+ineptness IH N EH P T N IH S
+inequalities IH N AH K W AA L IH T IY Z
+inequalities(2) IH N IH K W AA L IH T IY Z
+inequalities(3) IH N IY K W AA L IH T IY Z
+inequality IH N IH K W AA L AH T IY
+inequality(2) IH N AH K W AA L AH T IY
+inequality(3) IH N IY K W AA L AH T IY
+inequitable IH N EH K W AH T AH B AH L
+inequities IH N EH K W AH T IY Z
+inequity IH N EH K W AH T IY
+ineradicable IH N ER AE D AH K AH B AH L
+inerco IH N ER K OW
+inert IH N ER T
+inertia IH N ER SH AH
+inertial IH N ER SH AH L
+inertness IH N ER T N AH S
+ines IH N IH S
+ines(2) IH N EH S
+inescapable IH N IH S K EY P AH B AH L
+inescapably IH N IH S K EY P AH B L IY
+inevitability IH N EH V IH T AH B IH L IH T IY
+inevitable IH N EH V AH T AH B AH L
+inevitably IH N EH V AH T AH B L IY
+inexact IH N IH G Z AE K T
+inexcusable IH N IH K S K Y UW Z AH B AH L
+inexcusably IH N IH K S K Y UW Z AH B L IY
+inexhaustible IH N IH G Z AO S T AH B AH L
+inexorable IH N EH K S ER AH B AH L
+inexorably IH N EH K S ER AH B L IY
+inexpensive IH N IH K S P EH N S IH V
+inexpensively IH N AH K S P EH N S IH V L IY
+inexperience IH N IH K S P IH R IY AH N S
+inexperienced IH N IH K S P IH R IY AH N S T
+inexplicable IH N AH K S P L IH S AH B AH L
+inexplicably IH N IH K S P L IH K AH B L IY
+inextricable IH N EH K S T R IH K AH B AH L
+inextricably IH N EH K S T R IH K AH B L IY
+inez IH N EH Z
+infallibility IH N F AE L IH B IH L IH T IY
+infallible IH N F AE L AH B AH L
+infamous IH N F AH M AH S
+infamy IH N F AH M IY
+infancy IH N F AH N S IY
+infant IH N F AH N T
+infant's IH N F AH N T S
+infante IH N F AA N T EY
+infanticide IH N F AE N T AH S AY D
+infanticides IH N F AE N T AH S AY D Z
+infantile IH N F AH N T IH L
+infantino IH N F AA N T IY N OW
+infantry IH N F AH N T R IY
+infantryman IH N F AE N T R IY M AH N
+infantrymen IH N F AE N T R IY M AH N
+infants IH N F AH N T S
+infants' IH N F AH N T S
+infarction IH N F AA R K SH AH N
+infatuate IH N F AE CH UW EY T
+infatuated IH N F AE CH UW EY T IH D
+infatuates IH N F AE CH UW EY T S
+infatuating IH N F AE CH UW EY T IH NG
+infatuation IH N F AE CH UW EY SH AH N
+infeasible IH N F IY Z AH B AH L
+infect IH N F EH K T
+infected IH N F EH K T AH D
+infected(2) IH N F EH K T IH D
+infecting IH N F EH K T IH NG
+infection IH N F EH K SH AH N
+infections IH N F EH K SH AH N Z
+infectious IH N F EH K SH AH S
+infective IH N F EH K T IH V
+infects IH N F EH K T S
+infer IH N F ER
+inference IH N F ER AH N S
+inferences IH N F ER EH N S IH Z
+inferential IH N F ER EH N SH AH L
+inferior IH N F IH R IY ER
+inferiority IH N F IH R IY AO R IH T IY
+infernal IH N F ER N AH L
+inferno IH N F ER N OW
+inferred IH N F ER D
+inferring IH N F ER IH NG
+infers IH N F ER Z
+infertile IH N F ER T AH L
+infertility IH N F ER T IH L IH T IY
+infest IH N F EH S T
+infestation IH N F EH S T EY SH AH N
+infestations IH N F EH S T EY SH AH N Z
+infested IH N F EH S T AH D
+infested(2) IH N F EH S T IH D
+infests IH N F EH S T S
+infests(2) IH N F EH S S
+infests(3) IH N F EH S
+infidel IH N F IH D EH L
+infidelities IH N F IH D EH L IH T IY Z
+infidelity IH N F IH D EH L IH T IY
+infidels IH N F IH D EH L Z
+infield IH N F IY L D
+infielder IH N F IY L D ER
+infielders IH N F IY L D ER Z
+infighting IH N F AY T IH NG
+infiltrate IH N F IH L T R EY T
+infiltrated IH N F IH L T R EY T IH D
+infiltrating IH N F IH L T R EY T IH NG
+infiltration IH N F IH L T R EY SH AH N
+infiltrator IH N F IH L T R EY T ER
+infiltrators IH N F IH L T R EY T ER Z
+infinger IH N F IH NG ER
+infinite IH N F AH N AH T
+infinitely IH N F AH N AH T L IY
+infinitesimal IH N F IH N IH T EH S IH M AH L
+infiniti IH N F IH N IH T IY
+infinitive IH N F IH N IH T IH V
+infinitum IH N F IH N IH T AH M
+infinity IH N F IH N AH T IY
+infinity(2) IH N F IH N IH T IY
+infirm IH N F ER M
+infirmary IH N F ER M ER IY
+infirmed IH N F ER M D
+infirmities IH N F ER M IH T IY Z
+infirmity IH N F ER M IH T IY
+inflame IH N F L EY M
+inflamed IH N F L EY M D
+inflames IH N F L EY M Z
+inflaming IH N F L EY M IH NG
+inflammable IH N F L AE M AH B AH L
+inflammation IH N F L AH M EY SH AH N
+inflammatory IH N F L AE M AH T AO R IY
+inflatable IH N F L EY T AH B AH L
+inflate IH N F L EY T
+inflated IH N F L EY T AH D
+inflated(2) IH N F L EY T IH D
+inflates IH N F L EY T S
+inflating IH N F L EY T IH NG
+inflation IH N F L EY SH AH N
+inflation's IH N F L EY SH AH N Z
+inflationary IH N F L EY SH AH N EH R IY
+inflator IH N F L EY T ER
+inflected IH N F L EH K T AH D
+inflection IH N F L EH K SH AH N
+inflections IH N F L EH K SH AH N Z
+inflexibility IH N F L EH K S IH B IH L IH T IY
+inflexible IH N F L EH K S AH B AH L
+inflexibly IH N F L EH K S AH B L IY
+inflict IH N F L IH K T
+inflicted IH N F L IH K T IH D
+inflicting IH N F L IH K T IH NG
+infliction IH N F L IH K SH AH N
+inflicts IH N F L IH K T S
+inflicts(2) IH N F L IH K S
+inflight IH N F L AY T
+inflow IH N F L OW
+inflows IH N F L OW Z
+influence IH N F L UW AH N S
+influenced IH N F L UW AH N S T
+influences IH N F L UW AH N S IH Z
+influencing IH N F L UW AH N S IH NG
+influential IH N F L UW EH N CH AH L
+influenza IH N F L UW EH N Z AH
+influx IH N F L AH K S
+info IH N F OW
+infocorp IH N F OW K AO R P
+infomercial IH N F OW M ER SH AH L
+infomercial's IH N F OW M ER SH AH L Z
+infomercials IH N F OW M ER SH AH L Z
+inform IH N F AO R M
+informal IH N F AO R M AH L
+informality IH N F ER M AE L IH T IY
+informally IH N F AO R M AH L IY
+informals IH N F AO R M AH L Z
+informant IH N F AO R M AH N T
+informants IH N F AO R M AH N T S
+informatic IH N F ER M AE T IH K
+informatic(2) IH N F AO R M AE T IH K
+informatics IH N F ER M AE T IH K S
+informatics(2) IH N F AO R M AE T IH K S
+information IH N F ER M EY SH AH N
+information's IH N F ER M EY SH AH N Z
+information's(2) IH N F AO R M EY SH AH N Z
+information(2) IH N F AO R M EY SH AH N
+informational IH N F ER M EY SH AH N AH L
+informational(2) IH N F AO R M EY SH AH N AH L
+informations IH N F ER M EY SH AH N Z
+informations(2) IH N F AO R M EY SH AH N Z
+informative IH N F AO R M AH T IH V
+informed IH N F AO R M D
+informer IH N F AO R M ER
+informers IH N F AO R M ER Z
+informing IH N F AO R M IH NG
+informix IH N F AO R M IH K S
+informs IH N F AO R M Z
+infoscan IH N F OW S K AE N
+infotainment IH N F OW T EY N M AH N T
+infotech IH N F OW T EH K
+infotechnology IH N F OW T EH K N AA L AH JH IY
+infotron IH N F OW T R AA N
+infotron's IH N F OW T R AA N Z
+infoworld IH N F OW W ER L D
+infra IH N F R AH
+infraction IH N F R AE K SH AH N
+infractions IH N F R AE K SH AH N Z
+infrared IH N F R ER EH D
+infrastructural IH N F R AH S T R AH K CH ER AH L
+infrastructure IH N F R AH S T R AH K CH ER
+infrastructures IH N F R AH S T R AH K CH ER Z
+infrequency IH N F R IY K W AH N S IY
+infrequent IH N F R IY K W AH N T
+infrequently IH N F R IY K W AH N T L IY
+infringe IH N F R IH N JH
+infringed IH N F R IH N JH D
+infringement IH N F R IH N JH M AH N T
+infringements IH N F R IH N JH M AH N T S
+infringes IH N F R IH N JH IH Z
+infringing IH N F R IH N JH IH NG
+infuriate IH N F Y UH R IY EY T
+infuriated IH N F Y UH R IY EY T AH D
+infuriated(2) IH N F Y UH R IY EY T IH D
+infuriates IH N F Y UH R IY EY T S
+infuriating IH N F Y UH R IY EY T IH NG
+infuse IH N F Y UW Z
+infused IH N F Y UW Z D
+infuses IH N F Y UW Z IH Z
+infusing IH N F Y UW Z IH NG
+infusion IH N F Y UW ZH AH N
+infusions IH N F Y UW ZH AH N Z
+ing IH NG
+inga IY NG G AH
+ingalls IH NG G AO L Z
+ingalsbe IH NG G AH L S B IY
+ingar IH NG G ER
+ingber IH NG B ER
+inge IH N JH
+ingelheim IH NG G AH L HH AY M
+ingels IH NG G AH L Z
+ingemar IH NG G IH M ER
+ingemar(2) IH NG G IH M AA R
+ingenious IH N JH IY N Y AH S
+ingeniously IH N JH IY N Y AH S L IY
+ingenito IH NG G EH N IY T OW
+ingenito(2) IH NG JH EH N IY T OW
+ingenue IH N JH EH N Y UW
+ingenue(2) AA N JH AH N UW
+ingenue(3) IH N JH EH N UW
+ingenue(4) IH N JH AH N UW
+ingenuity IH N JH AH N UW AH T IY
+ingenuous IH N JH EH N Y UW AH S
+inger IH NG ER
+ingersoll IH NG G ER S AO L
+ingerson IH NG G ER S AH N
+ingest IH N JH EH S T
+ingested IH N JH EH S T AH D
+ingesting IH N JH EH S T IH NG
+ingestion IH N JH EH S CH AH N
+ingham IH NG AH M
+inghram IH NG G R AE M
+ingimarson IH NG AH M AA R S AH N
+ingle IH NG G AH L
+inglebert IH NG G AH L B ER T
+inglenook IH NG G AH L N UH K
+ingles IH NG G AH L Z
+inglese IH NG G L IY Z
+inglett IH NG G L EH T
+inglewood IH NG G AH L W UH D
+inglis IH NG G L IH S
+inglish IH NG G AH L IH SH
+inglorious IH N G L AO R IY AH S
+ingman IH NG M AH N
+ingmar IH NG M AA R
+ingmire IH NG M AY R
+ingo IH NG G OW
+ingoglia IH NG G OW G L IY AH
+ingold IH NG G OW L D
+ingot IH NG G AH T
+ingots IH NG G AH T S
+ingraham IH NG G R AH HH AE M
+ingrained IH N G R EY N D
+ingram IH NG G R AH M
+ingrao IY NG G R AW
+ingrassia IH NG G R AA SH AH
+ingratiate IH NG G R EY SH IY EY T
+ingratiating IH NG G R EY SH IY EY T IH NG
+ingredient IH N G R IY D IY AH N T
+ingredients IH N G R IY D IY AH N T S
+ingria IH NG G R IY AH
+ingrid IH NG G R IH D
+ingrum IH NG G R AH M
+ingvar IH NG V AA R
+ingwersen IH NG G W ER S AH N
+inhabit IH N HH AE B AH T
+inhabitant IH N HH AE B AH T AH N T
+inhabitant(2) IH N HH AE B IH T AH N T
+inhabitants IH N HH AE B AH T AH N T S
+inhabitants(2) IH N HH AE B IH T AH N T S
+inhabitation IH N HH AE B AH T EY SH AH N
+inhabited IH N HH AE B AH T AH D
+inhabiting IH N HH AE B AH T IH NG
+inhabits IH N HH AE B AH T S
+inhalable IH N HH EY L AH B AH L
+inhalant IH N HH EY L AH N T
+inhalants IH N HH EY L AH N T S
+inhalation IH N AH L EY SH AH N
+inhalation(2) IH N HH AH L EY SH AH N
+inhale IH N HH EY L
+inhaled IH N HH EY L D
+inhaler IH N HH EY L ER
+inhalers IH N HH EY L ER Z
+inhaling IH N HH EY L IH NG
+inherent IH N HH IH R AH N T
+inherent(2) IH N HH EH R AH N T
+inherently IH N HH IH R AH N T L IY
+inherently(2) IH N HH EH R AH N T L IY
+inherit IH N HH EH R AH T
+inheritable IH N HH EH R AH T AH B AH L
+inheritance IH N HH EH R AH T AH N S
+inherited IH N HH EH R AH T IH D
+inheriting IH N HH EH R AH T IH NG
+inheritor IH N HH EH R AH T ER
+inherits IH N HH EH R AH T S
+inhibit IH N HH IH B AH T
+inhibited IH N HH IH B AH T IH D
+inhibiting IH N HH IH B AH T IH NG
+inhibition IH N HH AH B IH SH AH N
+inhibition(2) IH N AH B IH SH AH N
+inhibitions IH N HH AH B IH SH AH N Z
+inhibitions(2) IH N AH B IH SH AH N Z
+inhibitor IH N HH IH B AH T ER
+inhibitors IH N HH IH B AH T ER Z
+inhibitory IH N HH IH B AH T AO R IY
+inhibits IH N HH IH B AH T S
+inhofe IH N HH OW F
+inhofe's IH N HH OW F S
+inhofe's(2) IH N HH AA F S
+inhofe(2) IH N HH AA F
+inhospitable IH N HH AA S P AH T AH B AH L
+inhospitable(2) IH N HH AA S P IH T AH B AH L
+inhouse IH N HH AW S
+inhuman IH N HH Y UW M AH N
+inhumane IH N HH Y UW M EY N
+inhumanity IH N HH Y UW M AE N AH T IY
+iniga IH N IY G AH
+iniguez IH N IY G EH Z
+iniki IY N IY K IY
+inikpratt IH N IY K P R AE T
+inimical IH N IH M IH K AH L
+inimitable IH N IH M AH T AH B AH L
+iniquity IH N IH K W IH T IY
+iniss IH N IH S
+initable IH N IH T AH B AH L
+initial IH N IH SH AH L
+initialed IH N IH SH AH L D
+initialing IH N IH SH AH L IH NG
+initialize IH N IH SH AH L AY Z
+initialized IH N IH SH AH L AY Z D
+initialling IH N IH SH AH L IH NG
+initially IH N IH SH AH L IY
+initials IH N IH SH AH L Z
+initiate IH N IH SH IY EY T
+initiated IH N IH SH IY EY T AH D
+initiated(2) IH N IH SH IY EY T IH D
+initiates IH N IH SH IY AH T S
+initiating IH N IH SH IY EY T IH NG
+initiation IH N IH SH IY EY SH AH N
+initiative IH N IH SH AH T IH V
+initiative(2) IH N IH SH Y AH T IH V
+initiatives IH N IH SH AH T IH V Z
+initiatives(2) IH N IH SH Y AH T IH V Z
+initiator IH N IH SH IY EY T ER
+initiators IH N IH SH IY EY T ER Z
+initio IH N IH T IY OW
+initio(2) IH N IH SH IY OW
+iniziativa IH N IH Z IY AH T IY V AH
+inject IH N JH EH K T
+injectable IH N JH EH K T AH B AH L
+injected IH N JH EH K T AH D
+injected(2) IH N JH EH K T IH D
+injecting IH N JH EH K T IH NG
+injection IH N JH EH K SH AH N
+injections IH N JH EH K SH AH N Z
+injector IH N JH EH K T ER
+injectors IH N JH EH K T ER Z
+injects IH N JH EH K T S
+injudicious IH N JH AH D IH SH AH S
+injunction IH N JH AH NG K SH AH N
+injunction(2) IH N JH AH NG SH AH N
+injunctions IH N JH AH NG K SH AH N Z
+injunctions(2) IH N JH AH NG SH AH N Z
+injunctive IH N JH AH NG K T IH V
+injunctive(2) IH N JH AH NG T IH V
+injure IH N JH ER
+injured IH N JH ER D
+injures IH N JH ER Z
+injuries IH N JH ER IY Z
+injuring IH N JH ER IH NG
+injurious IH N JH UH R IY AH S
+injury IH N JH ER IY
+injustice IH N JH AH S T IH S
+injustices IH N JH AH S T AH S IH Z
+ink IH NG K
+inkatha IH NG K AE TH AH
+inkatha's IH NG K AE TH AH Z
+inkatha's(2) IH NG K AA T AH Z
+inkatha(2) IH NG K AA T AH
+inkblot IH NG K B L AA T
+inkjet IH NG K JH EH T
+inkling IH NG K L IH NG
+inks IH NG K S
+inky IH NG K IY
+inlaid IH N L EY D
+inland IH N L AE N D
+inland's IH N L AH N D Z
+inlaw IH N L AO
+inlaws IH N L AO Z
+inlay IH N L EY
+inlet IH N L EH T
+inlets IH N L EH T S
+inlex IH N L EH K S
+inlow IH N L OW
+inmac IH N M AE K
+inman IH N M AH N
+inman's IH N M AH N Z
+inmarsat IH N M AA R S AE T
+inmate IH N M EY T
+inmate's IH N M EY T S
+inmates IH N M EY T S
+inmex IH N M EH K S
+inmobiliaria IH N M OW B AH L IY EH R IY AH
+inmon IH N M AH N
+inmont IH N M AA N T
+inn IH N
+inn's IH N Z
+innard IH N ER D
+innards IH N ER D Z
+innate IH N EY T
+innately IH N EY T L IY
+inner IH N ER
+innermost IH N ER M OW S T
+innerspace IH N ER S P EY S
+innes IH N AH S
+inness IH N IH S
+inning IH N IH NG
+innings IH N IH NG Z
+innis IH N IH S
+inniss IH N IH S
+innkeeper IH N K IY P ER
+innkeepers IH N K IY P ER Z
+inno IH N OW
+innocence IH N AH S AH N S
+innocent IH N AH S AH N T
+innocenti IH N OW CH EH N T IY
+innocently IH N AH S AH N T L IY
+innocents IH N AH S AH N T S
+innoculate IH N AO K Y AH L EY T
+innoculated IH N AO K Y AH L EY T AH D
+innoculates IH N AO K Y AH L EY T S
+innoculating IH N AO K Y AH L EY T IH NG
+innoculation IH N AO K Y AH L EY SH AH N
+innocuous IH N AA K Y UW AH S
+innominate IH N AA M AH N AH T
+innopac IH N AH P AE K
+innovate IH N AH V EY T
+innovate(2) IH N OW V EY T
+innovated IH N AH V EY T IH D
+innovated(2) IH N OW V EY T IH D
+innovates IH N AH V EY T S
+innovates(2) IH N OW V EY T S
+innovating IH N AH V EY T IH NG
+innovating(2) IH N OW V EY T IH NG
+innovation IH N AH V EY SH AH N
+innovation(2) IH N OW V EY SH AH N
+innovations IH N AH V EY SH AH N Z
+innovations(2) IH N OW V EY SH AH N Z
+innovative IH N AH V EY T IH V
+innovative(2) IH N OW V EY T IH V
+innovator IH N AH V EY T ER
+innovator(2) IH N OW V EY T ER
+innovators IH N AH V EY T ER Z
+innovators(2) IH N OW V EY T ER Z
+inns IH N Z
+inns' IH N Z
+innuendo IH N Y UW EH N D OW
+innuendoes IH N Y UW EH N D OW Z
+innuendos IH N Y UW EH N D OW Z
+innumerable IH N UW M ER AH B AH L
+inocencio IH N OW CH EH N CH IY OW
+inoculate IH N AA K Y AH L EY T
+inoculated IH N AA K Y AH L EY T IH D
+inoculates IH N AA K Y AH L EY T S
+inoculation IH N AA K Y AH L EY SH AH N
+inoculations IH N AA K Y AH L EY SH AH N Z
+inoffensive IH N AH F EH N S IH V
+inoperable IH N AA P ER AH B AH L
+inoperative IH N AA P ER AH T IH V
+inopportune IH N AA P ER T UW N
+inordinate IH N AO R D AH N IH T
+inordinately IH N AO R D AH N AH T L IY
+inorganic IH N AO R G AE N IH K
+inoue IH N OW EY
+inouye IH N UW EY
+inpatient IH N P EY SH AH N T
+inpatients IH N P EY SH AH N T S
+input IH N P UH T
+inputs IH N P UH T S
+inquest IH N K W EH S T
+inquire IH N K W AY R
+inquired IH N K W AY ER D
+inquirer IH N K W AY R ER
+inquires IH N K W AY ER Z
+inquiries IH N K W AY ER IY Z
+inquiries(2) IH N K W ER IY Z
+inquiring IH N K W AY ER IH NG
+inquiry IH N K W AY R IY
+inquiry(2) IH N K W ER R IY
+inquisition IH N K W AH Z IH SH AH N
+inquisitive IH N K W IH Z IH T IH V
+inquisitor IH N K W IH Z AH T ER
+inquisitors IH N K W IH Z AH T ER Z
+inroad IH N R OW D
+inroads IH N R OW D Z
+ins IH N Z
+ins(2) AY EH N EH S
+insalaco IH N S AA L AA K OW
+insane IH N S EY N
+insanity IH N S AE N AH T IY
+insanity(2) IH N S AE N IH T IY
+insatiable IH N S EY SH AH B AH L
+inscho IH N SH OW
+insco IY N S K OW
+inscoe IH N S K OW
+inscore IH N S K AO R IY
+inscribe IH N S K R AY B
+inscribed IH N S K R AY B D
+inscribes IH N S K R AY B Z
+inscribing IH N S K R AY B IH NG
+inscription IH N S K R IH P SH AH N
+inscriptions IH N S K R IH P SH AH N Z
+inscrutable IH N S K R UW T AH B AH L
+insect IH N S EH K T
+insect's IH N S EH K T S
+insecticide IH N S EH K T AH S AY D
+insecticides IH N S EH K T AH S AY D Z
+insectivorous IH N S EH K T IH V ER AH S
+insects IH N S EH K T S
+insecure IH N S AH K Y ER
+insecurities IH N S AH K Y UH R IH T IY Z
+insecurity IH N S IH K Y UH R IH T IY
+insel IH N S AH L
+inseminate IH N S EH M AH N EY T
+insemination IH N S EH M AH N EY SH AH N
+insensible IH N S EH N S AH B AH L
+insensitive IH N S EH N S AH T IH V
+insensitive(2) IH N S EH N S IH T IH V
+insensitivity IH N S EH N S AH T IH V AH T IY
+inseparable IH N S EH P ER AH B AH L
+inseparably IH N S EH P ER AH B L IY
+inserra IH N S EH R AH
+insert IH N S ER T
+inserted IH N S ER T AH D
+inserted(2) IH N S ER T IH D
+inserting IH N S ER T IH NG
+insertion IH N S ER SH AH N
+inserts IH N S ER T S
+inset IH N S EH T
+inshore IH N SH AO R
+inside IH N S AY D
+insider IH N S AY D ER
+insider's IH N S AY D ER Z
+insiders IH N S AY D ER Z
+insiders' IH N S AY D ER Z
+insides IH N S AY D Z
+insidious IH N S IH D IY AH S
+insight IH N S AY T
+insightful IH N S AY T F AH L
+insights IH N S AY T S
+insignia IH N S IH G N IY AH
+insignificance IH N S IH G N Y IH F IH K AH N S
+insignificant IH N S IH G N Y IH F IH K AH N T
+insilco IH N S IH L K OW
+insincere IH N S IH N S IH R
+insinuate IH N S IH N Y UW EY T
+insinuated IH N S IH N Y UW EY T IH D
+insinuates IH N S IH N Y UW EY T S
+insinuating IH N S IH N Y UW EY T IH NG
+insinuation IH N S IH N Y UW EY SH AH N
+insinuations IH N S IH N Y UW EY SH AH N Z
+insist IH N S IH S T
+insisted IH N S IH S T AH D
+insisted(2) IH N S IH S T IH D
+insistence IH N S IH S T AH N S
+insistent IH N S IH S T AH N T
+insistently IH N S IH S T AH N T L IY
+insisting IH N S IH S T IH NG
+insists IH N S IH S T S
+insists(2) IH N S IH S S
+insists(3) IH N S IH S
+insituform IH N S IH T UW F AO R M
+inskeep IH N Z K IY P
+inskip IH N S K IH P
+insko IH N S K OW
+inslaw IH N S L AA
+insley IH N S L IY
+insofar IH N S AH F AA R
+insolence IH N S AH L AH N S
+insolent IH N S AH L AH N T
+insoluble IH N S AA L Y AH B AH L
+insolvencies IH N S AA L V AH N S IY Z
+insolvency IH N S AA L V AH N S IY
+insolvent IH N S AA L V AH N T
+insomnia IH N S AA M N IY AH
+insomniac IH N S AA M N IY AE K
+insouciance IH N S UW S IY AH N S
+insouciance(2) IH N S UW S Y AH N S
+insouciant IH N S UW S Y AH N T
+inspect IH N S P EH K T
+inspected IH N S P EH K T IH D
+inspecting IH N S P EH K T IH NG
+inspection IH N S P EH K SH AH N
+inspections IH N S P EH K SH AH N Z
+inspector IH N S P EH K T ER
+inspector's IH N S P EH K T ER Z
+inspectorate IH N S P EH K T ER AH T
+inspectors IH N S P EH K T ER Z
+inspectors' IH N S P EH K T ER Z
+inspects IH N S P EH K T S
+inspeech IH N S P IY CH
+inspiration IH N S P ER EY SH AH N
+inspirational IH N S P ER EY SH AH N AH L
+inspirations IH N S P ER EY SH AH N Z
+inspire IH N S P AY R
+inspired IH N S P AY ER D
+inspires IH N S P AY R Z
+inspiring IH N S P AY R IH NG
+inspiring(2) IH N S P AY ER IH NG
+instabilities IH N S T AH B IH L IH T IY Z
+instability IH N S T AH B IH L IH T IY
+install IH N S T AO L
+installation IH N S T AH L EY SH AH N
+installations IH N S T AH L EY SH AH N Z
+installed IH N S T AO L D
+installer IH N S T AO L ER
+installers IH N S T AO L ER Z
+installing IH N S T AO L IH NG
+installment IH N S T AO L M AH N T
+installments IH N S T AO L M AH N T S
+installs IH N S T AO L Z
+instance IH N S T AH N S
+instances IH N S T AH N S AH Z
+instances(2) IH N S T AH N S IH Z
+instant IH N S T AH N T
+instantaneous IH N S T AH N T AE N IY AH S
+instantaneously IH N S T AH N T AE N IY AH S L IY
+instantiate IH N S T AE N SH IY EY T
+instantiated IH N S T AE N SH IY EY T AH D
+instantiates IH N S T AE N SH IY EY T S
+instantiating IH N S T AE N SH IY EY T IH NG
+instantiation IH N S T AE N SH IY EY SH AH N
+instantly IH N S T AH N T L IY
+instead IH N S T EH D
+instigate IH N S T AH G EY T
+instigated IH N S T AH G EY T IH D
+instigates IH N S T AH G EY T S
+instigating IH N S T AH G EY T IH NG
+instigation IH N S T IH G EY SH AH N
+instigator IH N S T AH G EY T ER
+instigators IH N S T AH G EY T ER Z
+instill IH N S T IH L
+instilled IH N S T IH L D
+instilling IH N S T IH L IH NG
+instills IH N S T IH L Z
+instinct IH N S T IH NG K T
+instinctive IH N S T IH NG K T IH V
+instinctively IH N S T IH NG K T IH V L IY
+instincts IH N S T IH NG K T S
+instinet IH N S T IH N EH T
+institucional IH N S T IH T UW S IY AH N AE L
+institut IH N S T IH T UW T
+institute IH N S T AH T UW T
+institute's IH N S T IH T UW T S
+instituted IH N S T AH T UW T AH D
+institutes IH N S T AH T UW T S
+institutes' IH N S T IH T UW T S
+instituting IH N S T IH T UW T IH NG
+institution IH N S T IH T UW SH AH N
+institution's IH N S T IH T UW SH AH N Z
+institutional IH N S T IH T UW SH AH N AH L
+institutionalist IH N S T IH T UW SH AH N AH L AH S T
+institutionalists IH N S T IH T UW SH AH N AH L AH S T S
+institutionalists(2) IH N S T IH T UW SH AH N AH L AH S S
+institutionalists(3) IH N S T IH T UW SH AH N AH L AH S
+institutionalization IH N S T IH T UW SH AH N AH L IH Z EY SH AH N
+institutionalize IH N S T IH T UW SH AH N AH L AY Z
+institutionalized IH N S T IH T UW SH AH N AH L AY Z D
+institutionalizes IH N S T IH T UW SH AH N AH L AY Z IH Z
+institutionalizing IH N S T IH T UW SH AH N AH L AY Z IH NG
+institutionally IH N S T IH T UW SH AH N AH L IY
+institutionally(2) IH N S T IH T UW SH N AH L IY
+institutions IH N S T IH T UW SH AH N Z
+institutions' IH N S T IH T UW SH AH N Z
+instituto IH N S T IH T UW T OW
+instone IH N S T OW N
+instruct IH N S T R AH K T
+instructed IH N S T R AH K T AH D
+instructed(2) IH N S T R AH K T IH D
+instructing IH N S T R AH K T IH NG
+instruction IH N S T R AH K SH AH N
+instructional IH N S T R AH K SH AH N AH L
+instructions IH N S T R AH K SH AH N Z
+instructive IH N S T R AH K T IH V
+instructor IH N S T R AH K T ER
+instructors IH N S T R AH K T ER Z
+instructs IH N S T R AH K T S
+instrument IH N S T R AH M AH N T
+instrument's IH N S T R AH M AH N T S
+instrumental IH N S T R AH M EH N T AH L
+instrumental(2) IH N S T R AH M EH N AH L
+instrumentalist IH N S T R AH M EH N T AH L IH S T
+instrumentalist(2) IH N S T R AH M EH N AH L IH S T
+instrumentalists IH N S T R AH M EH N T AH L IH S T S
+instrumentalists(2) IH N S T R AH M EH N AH L IH S T S
+instrumentalists(3) IH N S T R AH M EH N T AH L IH S
+instrumentalists(4) IH N S T R AH M EH N AH L IH S
+instrumentality IH N S T R AH M EH N T AE L IH T IY
+instrumentals IH N S T R AH M EH N T AH L Z
+instrumentals(2) IH N S T R AH M EH N AH L Z
+instrumentation IH N S T R AH M EH N T EY SH AH N
+instruments IH N S T R AH M AH N T S
+instruments' IH N S T R AH M AH N T S
+insubordinate IH N S AH B AO R D AH N EY T
+insubordinate(2) IH N S AH B AO R D AH N AH T
+insubordination IH N S AH B AO R D AH N EY SH AH N
+insubstantial IH N S AH B S T AE N CH AH L
+insubstantial(2) IH N S AH B S T AE N SH AH L
+insubstantiate IH N S AH B S T AE N CH IY EY T
+insubstantiate(2) IH N S AH B S T AE N SH IY EY T
+insubstantiated IH N S AH B S T AE N CH IY EY T AH D
+insubstantiated(2) IH N S AH B S T AE N SH IY EY T AH D
+insufferable IH N S AH F ER AH B AH L
+insufficient IH N S AH F IH SH AH N T
+insufficiently IH N S AH F IH SH AH N T L IY
+insular IH N S AH L ER
+insularity IH N S AH L EH R IH T IY
+insulate IH N S AH L EY T
+insulated IH N S AH L EY T AH D
+insulated(2) IH N S AH L EY T IH D
+insulating IH N S AH L EY T IH NG
+insulation IH N S AH L EY SH AH N
+insulator IH N S AH L EY T ER
+insulators IH N S AH L EY T ER Z
+insulin IH N S AH L AH N
+insult IH N S AH L T
+insulted IH N S AH L T IH D
+insulting IH N S AH L T IH NG
+insults IH N S AH L T S
+insupportable IH N S AH P AO R T AH B AH L
+insurance IH N SH UH R AH N S
+insurance's IH N SH UH R AH N S IH Z
+insurances IH N SH UH R AH N S IH Z
+insure IH N SH UH R
+insured IH N SH UH R D
+insurer IH N SH UH R ER
+insurer's IH N SH UH R ER Z
+insurers IH N SH UH R ER Z
+insurers' IH N SH UH R ER Z
+insures IH N SH UH R Z
+insurgencies IH N S ER JH AH N S IY Z
+insurgency IH N S ER JH AH N S IY
+insurgent IH N S ER JH AH N T
+insurgents IH N S ER JH AH N T S
+insurgents' IH N S ER JH AH N T S
+insuring IH N SH UH R IH NG
+insurmountable IH N S ER M AW N T AH B AH L
+insurrection IH N S ER EH K SH AH N
+intact IH N T AE K T
+intaglio IH N T AE L Y OW
+intaglio(2) IH N T AE G L Y OW
+intake IH N T EY K
+intan IH N T AH N
+intangible IH N T AE N JH AH B AH L
+intangibles IH N T AE N JH AH B AH L Z
+intangibly IH N T AE N JH AH B L IY
+intefadeh IH N T AH F AA D AH
+intefadeh(2) IH N T IH F AA D AH
+integer IH N T AH JH ER
+integers IH N T AH JH ER Z
+integon IH N T AH G AA N
+integra IH N T EH G R AH
+integral IH N T AH G R AH L
+integral(2) IH N AH G R AH L
+integrate IH N T AH G R EY T
+integrate(2) IH N AH G R EY T
+integrated IH N T AH G R EY T AH D
+integrated's IH N T AH G R EY T IH D Z
+integrated's(2) IH N AH G R EY T IH D Z
+integrated(2) IH N T AH G R EY T IH D
+integrated(3) IH N AH G R EY T AH D
+integrated(4) IH N AH G R EY T IH D
+integrates IH N T AH G R EY T S
+integrates(2) IH N AH G R EY T S
+integrating IH N T AH G R EY T IH NG
+integrating(2) IH N AH G R EY T IH NG
+integration IH N T AH G R EY SH AH N
+integration(2) IH N AH G R EY SH AH N
+integrations IH N T AH G R EY SH AH N Z
+integrations(2) IH N AH G R EY SH AH N Z
+integrator IH N T AH G R EY T ER
+integrator(2) IH N AH G R EY T ER
+integrators IH N T AH G R EY T ER Z
+integrators(2) IH N AH G R EY T ER Z
+integrelin IH N T AH G R EH L AH N
+integrelin(2) IH N T EH G R AH L IH N
+integrity IH N T EH G R AH T IY
+integrity(2) IH N T EH G R IH T IY
+integument IH N T EH G Y AH M AH N T
+intel IH N T EH L
+intel's IH N T EH L Z
+intelco IH N T EH L K OW
+intelcom IH N T EH L K AA M
+intellect IH N T AH L EH K T
+intellect(2) IH N AH L EH K T
+intellects IH N T AH L EH K T S
+intellects(2) IH N AH L EH K T S
+intellects(3) IH N T AH L EH K S
+intellects(4) IH N AH L EH K S
+intellectual IH N T AH L EH K CH UW AH L
+intellectual(2) IH N AH L EH K CH UW AH L
+intellectualism IH N T EH L AH K CH UW AH L IH Z AH M
+intellectualism(2) IH N EH L AH K CH UW AH L IH Z AH M
+intellectually IH N T AH L EH K CH UW AH L IY
+intellectually(2) IH N T AH L EH K CH UW L IY
+intellectually(3) IH N AH L EH K CH UW AH L IY
+intellectually(4) IH N AH L EH K CH UW L IY
+intellectuals IH N T AH L EH K CH UW AH L Z
+intellicall IH N T EH L IH K AO L
+intellicorp IH N T EH L IH K AO R P
+intelligence IH N T EH L AH JH AH N S
+intelligent IH N T EH L AH JH AH N T
+intelligently IH N T EH L IH JH AH N T L IY
+intelligentsia IH N T EH L AH JH EH N T S IY AH
+intelligible IH N T EH L AH JH AH B AH L
+intelligibly IH N T EH L AH JH AH B L IY
+intelogic IH N T AH L AA JH IH K
+intelsat IH N T EH L S AE T
+intemperate IH N T EH M P ER AH T
+intend IH N T EH N D
+intended IH N T EH N D AH D
+intended(2) IH N T EH N D IH D
+intending IH N T EH N D IH NG
+intends IH N T EH N D Z
+intense IH N T EH N S
+intensely IH N T EH N S L IY
+intensification IH N T EH N S AH F AH K EY SH AH N
+intensified IH N T EH N S AH F AY D
+intensifies IH N T EH N S AH F AY Z
+intensify IH N T EH N S AH F AY
+intensifying IH N T EH N S AH F AY IH NG
+intensity IH N T EH N S AH T IY
+intensity(2) IH N T EH N S IH T IY
+intensive IH N T EH N S IH V
+intensively IH N T EH N S IH V L IY
+intent IH N T EH N T
+intention IH N T EH N CH AH N
+intentional IH N T EH N SH AH N AH L
+intentionally IH N T EH N SH AH N AH L IY
+intentioned IH N T EH N CH AH N D
+intentions IH N T EH N CH AH N Z
+intently IH N T EH N T L IY
+intents IH N T EH N T S
+inter IH N T ER
+interacciones IH N T ER AE K S IY OW N Z
+interact IH N T ER AE K T
+interact(2) IH N ER AE K T
+interacted IH N T ER AE K T AH D
+interacted(2) IH N ER AE K T AH D
+interacting IH N T ER AE K T IH NG
+interacting(2) IH N ER AE K T IH NG
+interaction IH N T ER AE K SH AH N
+interaction(2) IH N ER AE K SH AH N
+interactions IH N T ER AE K SH AH N Z
+interactions(2) IH N ER AE K SH AH N Z
+interactive IH N T ER AE K T IH V
+interactive(2) IH N ER AE K T IH V
+interactivity IH N T ER AE K T IH V IH T IY
+interactivity(2) IH N ER AE K T IH V IH T IY
+interacts IH N T ER AE K T S
+interacts(2) IH N ER AE K T S
+interagency IH N T ER EY JH AH N S IY
+interamerican IH N T ER AH M EH R AH K AH N
+interand IH N T ER AH N D
+interbank IH N T ER B AE NG K
+interbred IH N T ER B R EH D
+interbrew IH N T ER B R UW
+interbrew's IH N T ER B R UW Z
+intercable IH N T ER K EY B AH L
+intercapital IH N T ER K AE P AH T AH L
+intercare IH N T ER K EH R
+intercede IH N T ER S IY D
+interceded IH N T ER S IY D IH D
+interceding IH N T ER S IY D IH NG
+intercellular IH N T ER S EH L Y AH L ER
+intercept IH N T ER S EH P T
+intercept(2) IH N ER S EH P T
+intercepted IH N T ER S EH P T AH D
+intercepted(2) IH N T ER S EH P T IH D
+intercepted(3) IH N ER S EH P T AH D
+intercepted(4) IH N ER S EH P T IH D
+intercepting IH N T ER S EH P T IH NG
+intercepting(2) IH N ER S EH P T IH NG
+interception IH N T ER S EH P SH AH N
+interception(2) IH N ER S EH P SH AH N
+interceptions IH N T ER S EH P SH AH N Z
+interceptions(2) IH N ER S EH P SH AH N Z
+interceptor IH N T ER S EH P T ER
+interceptor(2) IH N ER S EH P T ER
+interceptors IH N T ER S EH P T ER Z
+interceptors(2) IH N ER S EH P T ER Z
+intercepts IH N T ER S EH P T S
+intercepts(2) IH N ER S EH P T S
+intercession IH N T ER S EH SH AH N
+intercession(2) IH N ER S EH SH AH N
+interchange IH N T ER CH EY N JH
+interchange(2) IH N ER CH EY N JH
+interchangeable IH N T ER CH EY N JH AH B AH L
+interchangeable(2) IH N ER CH EY N JH AH B AH L
+interchangeably IH N T ER CH EY N JH AH B L IY
+interchangeably(2) IH N ER CH EY N JH AH B L IY
+interchanges IH N T ER CH EY N JH IH Z
+interchanges(2) IH N ER CH EY N JH IH Z
+intercity IH N T ER S IH T IY
+intercity(2) IH N ER S IH T IY
+interco IH N T ER K OW
+interco's IH N T ER K OW Z
+intercollegiate IH N T ER K AH L IY JH AH T
+intercom IH N T ER K AA M
+intercompany IH N T ER K AH M P AH N IY
+interconnect IH N T ER K AH N EH K T
+interconnected IH N T ER K AH N EH K T IH D
+interconnection IH N T ER K AH N EH K SH AH N
+interconnections IH N T ER K AH N EH K SH AH N Z
+intercontinental IH N T ER K AA N T AH N EH N T AH L
+intercontinentale IH N T ER K AA N T IH N AH N T AA L
+intercorp IH N T ER K AO R P
+intercorporation IH N T ER K AO R P ER EY SH AH N
+intercourse IH N T ER K AO R S
+intercourse(2) IH N ER K AO R S
+intercultural IH N T ER K AH L CH ER AH L
+intercurrent IH N T ER K ER AH N T
+interdealer IH N T ER D IY L ER
+interdependence IH N T ER D AH P EH N D AH N S
+interdependent IH N T ER D IH P EH N D AH N T
+interdict IH N T ER D IH K T
+interdicted IH N T ER D IH K T IH D
+interdictes IH N T ER D IH K T S
+interdicting IH N T ER D IH K T IH NG
+interdiction IH N T ER D IH K SH AH N
+interdigital IH N T ER D IH JH AH T AH L
+interdisciplinary IH N T ER D IH S AH P L AH N EH R IY
+interdyne IH N T ER D AY N
+interest IH N T R AH S T
+interest(2) IH N T R IH S T
+interest(3) IH N T ER AH S T
+interest(4) IH N T ER IH S T
+interested IH N T R AH S T AH D
+interested(2) IH N T R IH S T IH D
+interested(3) IH N T ER AH S T AH D
+interested(4) IH N T ER IH S T IH D
+interesting IH N T R AH S T IH NG
+interesting(2) IH N T R IH S T IH NG
+interesting(3) IH N T ER AH S T IH NG
+interesting(4) IH N T ER IH S T IH NG
+interestingly IH N T ER EH S T IH NG L IY
+interestrate IH N T ER AH S T R EY T
+interests IH N T R AH S T S
+interests(2) IH N T R IH S T S
+interests(3) IH N T ER AH S T S
+interests(4) IH N T ER IH S T S
+interface IH N T ER F EY S
+interface(2) IH N ER F EY S
+interfaces IH N T ER F EY S IH Z
+interfaces(2) IH N ER F EY S IH Z
+interfaith IH N T ER F EY TH
+interfax IH N T ER F AE K S
+interfere IH N T ER F IH R
+interfere(2) IH N ER F IH R
+interfered IH N T ER F IH R D
+interfered(2) IH N ER F IH R D
+interference IH N T ER F IH R AH N S
+interference(2) IH N ER F IH R AH N S
+interferes IH N T ER F IH R Z
+interferes(2) IH N ER F IH R Z
+interfering IH N T ER F IH R IH NG
+interfering(2) IH N ER F IH R IH NG
+interferometer IH N T ER F ER AA M AH T ER
+interferon IH N T ER F EH R AA N
+interferon(2) IH N T ER F IH R AA N
+interferons IH N T ER F IH R AA N Z
+interfirst IH N T ER F ER S T
+interflug IH N T ER F L AH G
+interfunding IH N T ER F AH N D IH NG
+intergenerational IH N T ER JH EH N ER EY SH AH N AH L
+intergovernmental IH N T ER G AH V ER N M EH N T AH L
+intergraph IH N T ER G R AE F
+intergraph's IH N T ER G R AE F S
+intergroup IH N T ER G R UW P
+intergroup's IH N T ER G R UW P S
+interim IH N T ER AH M
+interim(2) IH N T R AH M
+interim(3) IH N ER AH M
+interior IH N T IH R IY ER
+interiors IH N T IH R IY ER Z
+interject IH N T ER JH EH K T
+interjected IH N T ER JH EH K T IH D
+interjection IH N T ER JH EH K SH AH N
+interjections IH N T ER JH EH K SH AH N Z
+interjects IH N T ER JH EH K T S
+interlace IH N T ER L EY S
+interlaced IH N T ER L EY S T
+interlake IH N T ER L EY K
+interlake's IH N T ER L EY K S
+interleaf IH N T ER L IY F
+interleave IH N T ER L IY V
+interleaved IH N T ER L IY V D
+interleaves IH N T ER L IY V Z
+interleaving IH N T ER L IY V IH NG
+interleukin IH N T ER L UW K IH N
+interlink IH N T ER L IH NG K
+interlinked IH N T ER L IH NG K T
+interlock IH N T ER L AA K
+interlocked IH N T ER L AA K D
+interlocking IH N T ER L AA K IH NG
+interlocutor IH N T ER L AA K Y AH T ER
+interlocutors IH N T ER L AA K Y AH T ER Z
+interloper IH N T ER L OW P ER
+interlopers IH N T ER L OW P ER Z
+interlude IH N T ER L UW D
+interludes IH N T ER L UW D Z
+intermagnetic IH N T ER M AE G N EH T IH K
+intermagnetics IH N T ER M AE G N EH T IH K S
+intermark IH N T ER M AA R K
+intermarket IH N T ER M AA R K IH T
+intermarriage IH N T ER M EH R IH JH
+intermarried IH N T ER M AE R IY D
+intermarry IH N T ER M AE R IY
+intermec IH N T ER M AH K
+intermedia IH N T ER M IY D IY AH
+intermediaries IH N T ER M IY D IY EH R IY Z
+intermediaries(2) IH N ER M IY D IY EH R IY Z
+intermediary IH N ER M IY D IY EH R IY
+intermediary(2) IH N T ER M IY D IY EH R IY
+intermediate IH N T ER M IY D IY IH T
+intermediate(2) IH N ER M IY D IY IH T
+intermediates IH N T ER M IY D IY AH T S
+intermediates(2) IH N T ER M IY D IY EY T S
+intermediates(3) IH N ER M IY D IY AH T S
+intermediates(4) IH N ER M IY D IY EY T S
+intermedic IH N T ER M EH D IH K
+intermedics IH N T ER M EH D IH K S
+intermet IH N T ER M EH T
+interminable IH N T ER M AH N AH B AH L
+interminably IH N T ER M IH N AE B L IY
+interminably(2) IH N T ER M IH N AH B L IY
+intermingle IH N T ER M IH NG G AH L
+intermingled IH N T ER M IH NG G AH L D
+intermingling IH N T ER M IH NG G AH L IH NG
+intermingling(2) IH N T ER M IH NG G L IH NG
+intermission IH N T ER M IH SH AH N
+intermissions IH N T ER M IH SH AH N Z
+intermittent IH N T ER M IH T AH N T
+intermittently IH N T ER M IH T AH N T L IY
+intermix IH N T ER M IH K S
+intermixed IH N T ER M IH K S T
+intermixing IH N T ER M IH K S IH NG
+intermodal IH N T ER M OW D AH L
+intermolecular IH N T ER M AH L EH K Y AH L ER
+intermountain IH N T ER M AW N T IH N
+intern IH N T ER N
+internacional IH N T ER N AE SH AH N AH L
+internacional(2) IH N T ER N AA S IY OW N AE L
+internal IH N T ER N AH L
+internalize IH N T ER N AH L AY Z
+internalized IH N T ER N AH L AY Z D
+internally IH N T ER N AH L IY
+international IH N T ER N AE SH AH N AH L
+international's IH N T ER N AE SH AH N AH L Z
+international's(2) IH N ER N AE SH AH N AH L Z
+international(2) IH N ER N AE SH AH N AH L
+internationale IH N T ER N AE SH AH N AA L IY
+internationale(2) IH N ER N AE SH AH N AA L IY
+internationalism IH N T ER N AE SH AH N AH L IH Z AH M
+internationalism(2) IH N ER N AE SH AH N AH L IH Z AH M
+internationalist IH N T ER N AE SH AH N AH L IH S T
+internationalist(2) IH N ER N AE SH AH N AH L IH S T
+internationalists IH N T ER N AE SH AH N AH L IH S T S
+internationalists(2) IH N ER N AE SH AH N AH L IH S T S
+internationalists(3) IH N T ER N AE SH AH N AH L IH S
+internationalists(4) IH N ER N AE SH AH N AH L IH S
+internationalization IH N T ER N AE SH AH N AH L IH Z EY SH AH N
+internationalization(2) IH N ER N AE SH AH N AH L IH Z EY SH AH N
+internationalize IH N T ER N AE SH AH N AH L AY Z
+internationalize(2) IH N ER N AE SH AH N AH L AY Z
+internationalize(3) IH N ER N AE SH N AH L AY Z
+internationalized IH N T ER N AE SH AH N AH L AY Z D
+internationalized(2) IH N ER N AE SH AH N AH L AY Z D
+internationalized(3) IH N ER N AE SH N AH L AY Z D
+internationally IH N T ER N AE SH AH N AH L IY
+internationally(2) IH N T ER N AE SH N AH L IY
+internationally(3) IH N ER N AE SH AH N AH L IY
+internationally(4) IH N ER N AE SH N AH L IY
+internationals IH N T ER N AE SH AH N AH L Z
+internatonal IH N T ER N AE SH AH N AH L
+internatonal(2) IH N ER N AE SH AH N AH L
+internecine IH N T ER N AH S IY N
+interned IH N T ER N D
+internee IH N T ER N IY
+internees IH N T ER N IY Z
+internet IH N T ER N EH T
+internet's IH N T ER N EH T S
+internist IH N T ER N IH S T
+internists IH N T ER N IH S T S
+internists(2) IH N T ER N IH S S
+internists(3) IH N T ER N IH S
+internment IH N T ER N M AH N T
+internorth IH N T ER N AO R TH
+interns IH N T ER N Z
+internship IH N T ER N SH IH P
+internships IH N T ER N SH IH P S
+interoffice IH N T ER AO F AH S
+interoperate IH N T ER AO P ER AH T
+interoperates IH N T ER AO P ER AH T S
+interpart IH N T ER P AA R T
+interpersonal IH N T ER P ER S AH N AH L
+interplanetary IH N T ER P L AE N AH T EH R IY
+interplay IH N T ER P L EY
+interpol IH N T ER P OW L
+interpolate IH T ER P AH L EY T
+interpolated IH T ER P AH L EY T IH D
+interpose IH N T ER P OW Z
+interpret IH N T ER P R AH T
+interpretation IH N T ER P R IH T EY SH AH N
+interpretations IH N T ER P R IH T EY SH AH N Z
+interpreted IH N T ER P R AH T AH D
+interpreter IH N T ER P R AH T ER
+interpreters IH N T ER P R AH T ER Z
+interpreting IH N T ER P R EH T IH NG
+interpretive IH N T ER P R AH T IH V
+interprets IH N T ER P R AH T S
+interprovincial IH N T ER P R OW V IH N SH AH L
+interpublic IH N T ER P AH B L IH K
+interpublic's IH N T ER P AH B L IH K S
+interracial IH N T ER R EY SH AH L
+interrante IH N T ER R AA N T IY
+interred IH N T ER D
+interregnum IH N T ER R EH G N AH M
+interrelate IH N T ER R IH L EY T
+interrelated IH N T ER R IH L EY T IH D
+interrelated(2) IH N T ER R IY L EY T IH D
+interrelationship IH N T ER R IY L EY SH AH N SH IH P
+interrent IH N T ER EH N T
+interrent(2) IH N ER EH N T
+interrogate IH N T EH R AH G EY T
+interrogated IH N T EH R AH G EY T IH D
+interrogating IH N T EH R AH G EY T IH NG
+interrogation IH N T EH R AH G EY SH AH N
+interrogations IH N T EH R AH G EY SH AH N Z
+interrogator IH N T EH R AH G EY T ER
+interrogatories IH N T EH R AA G AH T AO R IY Z
+interrogators IH N T EH R AH G EY T ER Z
+interrogatory IH N T EH R AA G AH T AO R IY
+interrupt IH N T ER AH P T
+interrupt(2) IH N ER AH P T
+interrupted IH N T ER AH P T IH D
+interrupted(2) IH N ER AH P T IH D
+interruptible IH N T ER R AH P T IH B AH L
+interruptible(2) IH N ER R AH P T IH B AH L
+interrupting IH N T ER AH P T IH NG
+interrupting(2) IH N ER AH P T IH NG
+interruption IH N T ER AH P SH AH N
+interruption(2) IH N ER AH P SH AH N
+interruptions IH N T ER AH P SH AH N Z
+interruptions(2) IH N ER AH P SH AH N Z
+interrupts IH N T ER AH P T S
+interrupts(2) IH N ER AH P T S
+interscholastic IH N T ER S K AH L AE S T IH K
+interscope IH N T ER S K OW P
+intersec IH N T ER S EH K
+intersect IH N T ER S EH K T
+intersect(2) IH N ER S EH K T
+intersected IH N T ER S EH K T IH D
+intersected(2) IH N ER S EH K T IH D
+intersecting IH N T ER S EH K T IH NG
+intersecting(2) IH N ER S EH K T IH NG
+intersection IH N T ER S EH K SH AH N
+intersection(2) IH N ER S EH K SH AH N
+intersections IH N T ER S EH K SH AH N Z
+intersections(2) IH N ER S EH K SH AH N Z
+intersects IH N T ER S EH K T S
+intersects(2) IH N ER S EH K T S
+intersects(3) IH N T ER S EH K S
+intersects(4) IH N ER S EH K S
+intersegment IH N T ER S EH G M AH N T
+interspec IH N T ER S P EH K
+intersperse IH N T ER S P ER S
+interspersed IH N T ER S P ER S T
+intersperses IH N T ER S P ER S AH Z
+interstate IH N T ER S T EY T
+interstate's IH N T ER S T EY T S
+interstate's(2) IH N ER S T EY T S
+interstate(2) IH N ER S T EY T
+interstates IH N T ER S T EY T S
+interstates(2) IH N ER S T EY T S
+interstellar IH N T ER S T EH L ER
+intertan IH N T ER T AE N
+intertech IH N T ER T EH K
+intertechnology IH N T ER T AH K N AA L AH JH IY
+intertect IH N T ER T EH K T
+intertidal IH N T ER T AY D AH L
+intertrans IH N T ER T R AE N Z
+intertribal IH N T ER T R AY B AH L
+intertwine IH N T ER T W AY N
+intertwined IH N T ER T W AY N D
+intertwining IH N T ER T W AY N IH NG
+interurban IH N T ER ER B AH N
+interval IH N T ER V AH L
+interval(2) IH N ER V AH L
+intervals IH N T ER V AH L Z
+intervals(2) IH N ER V AH L Z
+intervene IH N T ER V IY N
+intervene(2) IH N ER V IY N
+intervened IH N T ER V IY N D
+intervened(2) IH N ER V IY N D
+intervenes IH N T ER V IY N Z
+intervenes(2) IH N ER V IY N Z
+intervening IH N T ER V IY N IH NG
+intervening(2) IH N ER V IY N IH NG
+intervenor IH N T ER V IY N ER
+intervenor(2) IH N ER V IY N ER
+intervenors IH N T ER V IY N ER Z
+intervenors(2) IH N ER V IY N ER Z
+intervention IH N T ER V EH N CH AH N
+intervention(2) IH N ER V EH N CH AH N
+interventionism IH N T ER V EH N CH AH N IH Z AH M
+interventionism(2) IH N ER V EH N CH AH N IH Z AH M
+interventionist IH N T ER V EH N SH AH N IH S T
+interventionist(2) IH N ER V EH N SH AH N IH S T
+interventionists IH N T ER V EH N CH AH N IH S T S
+interventionists(2) IH N ER V EH N CH AH N IH S T S
+interventionists(3) IH N T ER V EH N CH AH N IH S
+interventionists(4) IH N ER V EH N CH AH N IH S
+interventions IH N T ER V EH N CH AH N Z
+interventions(2) IH N ER V EH N CH AH N Z
+interview IH N T ER V Y UW
+interview(2) IH N ER V Y UW
+interviewed IH N T ER V Y UW D
+interviewed(2) IH N ER V Y UW D
+interviewee IH N T ER V Y UW IY
+interviewee(2) IH N ER V Y UW IY
+interviewees IH N T ER V Y UW IY Z
+interviewees(2) IH N ER V Y UW IY Z
+interviewer IH N T ER V Y UW ER
+interviewer(2) IH N ER V Y UW ER
+interviewers IH N T ER V Y UW ER Z
+interviewers(2) IH N ER V Y UW ER Z
+interviewing IH N T ER V Y UW IH NG
+interviewing(2) IH N ER V Y UW IH NG
+interviews IH N T ER V Y UW Z
+interviews(2) IH N ER V Y UW Z
+intervoice IH N T ER V OY S
+interweave IH N T ER W IY V
+interweaving IH N T ER W IY V IH NG
+interwoven IH N T ER W OW V AH N
+intestinal IH N T EH S T AH N AH L
+intestine IH N T EH S T AH N
+intestines IH N T EH S T AH N Z
+intex IH N T EH K S
+inti IH N T IY
+intifada IH N T IH F AA D AH
+intimacy IH N T AH M AH S IY
+intimate IH N T AH M AH T
+intimate(2) IH N T AH M EY T
+intimate(3) IH N AH M AH T
+intimated IH N T AH M EY T IH D
+intimately IH N T AH M AH T L IY
+intimates IH N T AH M AH T S
+intimation IH N T AH M EY SH AH N
+intimations IH N T AH M EY SH AH N Z
+intimidate IH N T IH M IH D EY T
+intimidated IH N T IH M IH D EY T IH D
+intimidates IH N T IH M IH D EY T S
+intimidating IH N T IH M IH D EY T IH NG
+intimidation IH N T IH M IH D EY SH AH N
+intis IH N T IH S
+into IH N T UW
+into(2) IH N T AH
+intolerable IH N T AA L ER AH B AH L
+intolerably IH N T AA L ER AH B L IY
+intolerance IH N T AA L ER AH N S
+intolerant IH N T AA L ER AH N T
+intonation IH N T AH N EY SH AH N
+intonations IH N T AH N EY SH AH N Z
+intone IH N T OW N
+intoned IH N T OW N D
+intones IH N T OW N Z
+intoning IH N T OW N IH NG
+intourist IH N T UH R IH S T
+intoxicate IH N T AA K S AH K EY T
+intoxicated IH N T AA K S AH K EY T AH D
+intoxicated(2) IH N T AA K S IH K EY T IH D
+intoxicates IH N T AA K S AH K EY T S
+intoxicating IH N T AA K S IH K EY T IH NG
+intoxication IH N T AA K S AH K EY SH AH N
+intra IH N T R AH
+intracompany IH N T R AH K AA M P AH N IY
+intracranial IH N T R AH K R EY N IY AH L
+intractable IH N T R AE K T AH B AH L
+intraday IH N T R AH D EY
+intramarginal IH N T R AH M AA R JH IH N AH L
+intramural IH N T R AH M Y UH R AH L
+intransigence IH N T R AE N S AH JH AH N S
+intransigence(2) IH N T R AE N S IH JH AH N S
+intransigent IH N T R AE N S AH JH AH N T
+intransigent(2) IH N T R AE N Z AH JH AH N T
+intraocular IH N T R AH OW K Y UW L ER
+intraparty IH N T R AH P AA R T IY
+intraspecific IH N T R AH S P AH S IH F AH K
+intrastate IH N T R AH S T EY T
+intrauterine IH N T R AH Y UW T ER IH N
+intravenous IH N T R AH V IY N AH S
+intravenously IH N T R AE V AH N AH S L IY
+intravenously(2) IH N T R AH V IY N AH S L IY
+intrawest IH N T R AH W AH S T
+intrawest(2) IH N T R AH W EH S T
+intrepid IH N T R EH P AH D
+intrepidly IH N T R EH P AH D L IY
+intrex IH N T R AH K S
+intricacies IH N T R AH K AH S IY Z
+intricacy IH N T R AH K AH S IY
+intricate IH N T R AH K AH T
+intricately IH N T R AH K AH T L IY
+intrie IH N T R IY
+intrieri IH N T R IH R IY
+intrigue IH N T R IY G
+intrigued IH N T R IY G D
+intrigues IH N T R IY G Z
+intriguing IH N T R IY G IH NG
+intriguingly IH N T R IY G IH NG L IY
+intrinsic IH N T R IH N S IH K
+intrinsically IH N T R IH N S IH K AH L IY
+intrinsically(2) IH N T R IH N S IH K L IY
+intro IH N T R OW
+introduce IH N T R AH D UW S
+introduce(2) IH N T R OW D UW S
+introduced IH N T R AH D UW S T
+introduced(2) IH N T R OW D UW S T
+introduces IH N T R AH D UW S IH Z
+introduces(2) IH N T R OW D UW S IH Z
+introducing IH N T R AH D UW S IH NG
+introducing(2) IH N T R OW D UW S IH NG
+introduction IH N T R AH D AH K SH AH N
+introduction(2) IH N T R OW D AH K SH AH N
+introductions IH N T R AH D AH K SH AH N Z
+introductions(2) IH N T R OW D AH K SH AH N Z
+introductory IH N T R AH D AH K T ER IY
+introductory(2) IH N T R OW D AH K T ER IY
+intron IH N T R AH N
+intros IH N T R OW Z
+introspect IH N T R AH S P EH K T
+introspection IH N T R AH S P EH K SH AH N
+introspection(2) IH N T R OW S P EH K SH AH N
+introspective IH N T R AH S P EH K T IH V
+introspective(2) IH N T R OW S P EH K T IH V
+introvert IH N T R OW V ER T
+introverted IH N T R OW V ER T IH D
+intrude IH N T R UW D
+intruded IH N T R UW D AH D
+intruder IH N T R UW D ER
+intruders IH N T R UW D ER Z
+intrudes IH N T R UW D Z
+intruding IH N T R UW D IH NG
+intrusion IH N T R UW ZH AH N
+intrusions IH N T R UW ZH AH N Z
+intrusive IH N T R UW S IH V
+intrusiveness IH N T R UW S IH V N EH S
+intuit IH N T UW AH T
+intuit's IH N T UW AH T S
+intuition IH N T UW IH SH AH N
+intuitive IH N T UW AH T IH V
+intuitively IH N T UW IH T IH V L IY
+inuit IH N UW T
+inundate IH N AH N D EY T
+inundated IH N AH N D EY T IH D
+inundating IH N AH N D EY T IH NG
+inundation IH N AH N D EY SH AH N
+inundations IH N AH N D EY SH AH N Z
+inure IH N Y UH R
+inured IH N Y UH R D
+invacare IH N V AH K EH R
+invade IH N V EY D
+invaded IH N V EY D AH D
+invaded(2) IH N V EY D IH D
+invader IH N V EY D ER
+invaders IH N V EY D ER Z
+invades IH N V EY D Z
+invading IH N V EY D IH NG
+invalid IH N V AH L AH D
+invalid(2) IH N V AH L IH D
+invalid(3) IH N V AE L AH D
+invalidate IH N V AE L IH D EY T
+invalidated IH N V AE L AH D EY T AH D
+invalidated(2) IH N V AE L IH D EY T IH D
+invalidating IH N V AE L AH D EY T IH NG
+invalidation IH N V AE L AH D EY SH AH N
+invalids IH N V AH L AH D Z
+invaluable IH N V AE L Y AH B AH L
+invariable IH N V EH R IY AH B AH L
+invariably IH N V EH R IY AH B L IY
+invariance IH N V EH R IY AH N S
+invariant IH N V EH R IY AH N T
+invasion IH N V EY ZH AH N
+invasions IH N V EY ZH AH N Z
+invasive IH N V EY S IH V
+invective IH N V EH K T IH V
+invent IH N V EH N T
+invented IH N V EH N T AH D
+invented(2) IH N V EH N T IH D
+inventing IH N V EH N T IH NG
+invention IH N V EH N SH AH N
+inventions IH N V EH N SH AH N Z
+inventive IH N V EH N T IH V
+inventiveness IH N V EH N T IH V N AH S
+inventor IH N V EH N T ER
+inventoried IH N V AH N T AO R IY D
+inventories IH N V AH N T AO R IY Z
+inventors IH N V EH N T ER Z
+inventory IH N V AH N T AO R IY
+inventory's IH N V AH N T AO R IY Z
+invents IH N V EH N T S
+inverlat IH N V ER L AE T
+inverness IH N V ER N EH S
+inverse IH N V ER S
+inversely IH N V ER S L IY
+inversion IH N V ER ZH AH N
+invert IH N V ER T
+invertebrate IH N V ER T AH B R AH T
+invertebrate(2) IH N V ER T AH B R EY T
+invertebrates IH N V ER T AH B R AH T S
+invertebrates(2) IH N V ER T AH B R EY T S
+inverted IH N V ER T IH D
+invesco IH N V EH S K OW
+invesco's IH N V EH S OW Z
+invest IH N V EH S T
+investable IH N V EH S T AH B AH L
+investcorp IH N V EH S T K AO R P
+invested IH N V EH S T AH D
+invested(2) IH N V EH S T IH D
+investigate IH N V EH S T AH G EY T
+investigated IH N V EH S T AH G EY T AH D
+investigated(2) IH N V EH S T AH G EY T IH D
+investigates IH N V EH S T AH G EY T S
+investigating IH N V EH S T AH G EY T IH NG
+investigation IH N V EH S T AH G EY SH AH N
+investigational IH N V EH S T IH G EY SH AH N AH L
+investigations IH N V EH S T AH G EY SH AH N Z
+investigative IH N V EH S T AH G EY T IH V
+investigator IH N V EH S T AH G EY T ER
+investigator's IH N V EH S T AH G EY T ER Z
+investigators IH N V EH S T AH G EY T ER Z
+investigators' IH N V EH S T AH G EY T ER Z
+investigatory IH N V EH S T AH G AH T AO R IY
+investimento IH N V EH S T IH M EH N T OW
+investing IH N V EH S T IH NG
+investissements IH N V EH S T IY Z IH M AA N T S
+investiture IH N V EH S T AH CH ER
+investment IH N V EH S T M AH N T
+investment's IH N V EH S T M AH N T S
+investment's(2) IH N V EH S M AH N T S
+investment(2) IH N V EH S M AH N T
+investments IH N V EH S T M AH N T S
+investments' IH N V EH S T M AH N T S
+investments'(2) IH N V EH S M AH N T S
+investments(2) IH N V EH S M AH N T S
+investnet IH N V EH S T N EH T
+investor IH N V EH S T ER
+investor's IH N V EH S T ER Z
+investors IH N V EH S T ER Z
+investors' IH N V EH S T ER Z
+invests IH N V EH S T S
+invests(2) IH N V EH S S
+invests(3) IH N V EH S
+inveterate IH N V EH T ER AH T
+invidious IH N V IH D IY AH S
+invigorate IH N V IH G ER IH T
+invigorated IH N V IH G ER EY T IH D
+invigorating IH N V IH G ER EY T IH NG
+invincibility IH N V IH N S AH B IH L IH T IY
+invincible IH N V IH N S AH B AH L
+inviolable IH N V AY AH L AH B AH L
+inviolate IH N V AY AH L IH T
+invirase IH N V AY R EY Z
+invisibility IH N V IH Z AH B IH L AH T IY
+invisible IH N V IH Z AH B AH L
+invisibles IH N V IH Z AH B AH L Z
+invitation IH N V IH T EY SH AH N
+invitational IH N V AH T EY SH AH N AH L
+invitations IH N V IH T EY SH AH N Z
+invite IH N V AY T
+invited IH N V AY T AH D
+invited(2) IH N V AY T IH D
+invitee IH N V AY T IY
+invitees IH N V AY T IY Z
+invites IH N V AY T S
+inviting IH N V AY T IH NG
+invitron IH N V IH T R AA N
+invitron's IH N V IH T R AA N Z
+invocation IH N V AH K EY SH AH N
+invoice IH N V OY S
+invoices IH N V OY S IH Z
+invoicing IH N V OY S IH NG
+invoke IH N V OW K
+invoked IH N V OW K T
+invokes IH N V OW K S
+invoking IH N V OW K IH NG
+involuntarily IH N V OW L AH N T ER IH L IY
+involuntarily(2) IH N V AA L AH N T ER AH L IY
+involuntary IH N V AA L AH N T EH R IY
+involve IH N V AA L V
+involved IH N V AA L V D
+involvement IH N V AA L V M AH N T
+involvements IH N V AA L V M AH N T S
+involves IH N V AA L V Z
+involving IH N V AA L V IH NG
+invulnerability IH N V AH L N ER AH B IH L IH T IY
+invulnerable IH N V AH L N ER AH B AH L
+inward IH N W ER D
+inwardly IH N W ER D L IY
+inwood IH N W UH D
+iny IH N IY
+inyokern IH N Y OW K ER N
+inzer IH N Z ER
+io AY OW
+iodice AY AH D AY S
+iodice(2) AY AH D IY S EY
+iodide AY AH D AY D
+iodide's AY AH D AY D Z
+iodides AY AH D AY D Z
+iodine AY AH D AY N
+iola AY OW L AH
+iolande IY OW L AA N D IY
+iolanthe IY AH L AA N TH EY
+iole IY OW L IY
+iomega AY OW M EY G AH
+ion AY AH N
+ion(2) AY AA N
+iona AY OW N AH
+ionarde IY AH N AA R D EY
+ione AY OW N IY
+ionic AY AA N IH K
+ionics AY AA N IH K S
+ionics's AY AA N IH K S IH Z
+ionization AY AH N AH Z EY SH AH N
+ionize AY AH N AY Z
+ionizer AY AH N AY Z ER
+ionizers AY AH N AY Z ER Z
+ionizing AY AH N AY Z IH NG
+ionosphere AY Y AA N AH S F IY R
+ionosphere(2) AY AA N AH S F IY R
+ionospheric AY AA N AH S F EH R IH K
+ions AY AH N Z
+ions(2) AY AA N Z
+iorio IY AO R IY OW
+ios IY OW S
+ios(2) AY OW S
+iosif AY AH S IH F
+iosif(2) Y EH S AH F
+iosue AY OW S UW
+iota AY OW T AH
+iott AY AH T
+iou AY OW Y UW
+iovine IY OW V IY N IY
+iovino IY OW V IY N OW
+iowa AY AH W AH
+iowa's AY AH W AH Z
+iowa's(2) AY OW AH Z
+iowa(2) AY OW AH
+iowan AY AH W AH N
+iowan(2) AY OW AH N
+iowans AY AH W AH N Z
+iowans(2) AY OW AH N Z
+ip IH P
+ip(2) AY P IY
+ipalco IY P AE L K OW
+ipalco's IY P AE L K OW Z
+ipco IH P K OW
+iphegenia IH F AH JH AH N AY AH
+ipock IH P AH K
+ippolito IH P OW L IY T OW
+ipsco IH P S K OW
+ipsen IH P S AH N
+iptay IH P T EY
+iqbal IH K B AH L
+ira AY R AH
+ira's AY R AH Z
+ira's(2) AY AA R EY Z
+ira(2) AY AA R EY
+iran IH R AA N
+iran's IH R AE N Z
+iran's(2) AY R AE N Z
+iran(2) AY R AE N
+iranamok AY R AH N AA M AA K
+irangate IH R AA N G EY T
+irani IH R AA N IY
+iranian IH R AA N IY AH N
+iranian(2) AY R EY N IY AH N
+iranians AY R EY N IY AH N Z
+iranians' AY R EY N IY AH N Z
+iranians(2) IH R AA N IY AH N Z
+iranscam AY R AE N S K AE M
+iraq IH R AA K
+iraq's IH R AA K S
+iraq's(2) IY R AA K S
+iraq's(3) AY R AA K S
+iraq(2) IY R AA K
+iraq(3) AY R AA K
+iraqgate IH R AA K G EY T
+iraqgate(2) IY R AA K G EY T
+iraqgate(3) AY R AA K G EY T
+iraqi IH R AE K IY
+iraqi's IH R AE K IY Z
+iraqi's(2) IY R AE K IY Z
+iraqi's(3) AY R AE K IY Z
+iraqi(2) IY R AE K IY
+iraqi(3) AY R AE K IY
+iraqis IH R AE K IY Z
+iraqis(2) IY R AE K IY Z
+iraqis(3) AY R AE K IY Z
+iras AY R AH Z
+iras(2) AY AA R EY Z
+irascible IH R AE S IH B AH L
+irascibly IH R AE S IH B L IY
+irate AY R EY T
+irbinna ER B IH N AH
+irby ER B IY
+ire AY R
+ireene AY R IY N
+irelan IH R EY L AA N
+ireland AY ER L AH N D
+ireland's AY R L AH N D Z
+ireland(2) AY R L AH N D
+irelands AY R L AH N D Z
+irell AY R EH L
+irena IH R EY N AH
+irene AY R IY N
+irene's AY R IY N Z
+ireson IH R IH S AH N
+ireson(2) AY ER S AH N
+ireta IH R EY T AH
+ireton IH R IH T AA N
+ireton(2) AY ER T AH N
+iretta IH R EH T AH
+irette IH R EH T
+irey AY R IY
+irian AY R IY AH N
+irianese AY R IY AH N IY S
+irick IH R IH K
+iridescent IH R AH D EH S AH N T
+iridium IH R IH D IY AH M
+irimajiri AY R IY M AH JH IH R IY
+irina IH R IY N AH
+iris AY R AH S
+iris(2) AY R IH S
+irises AY R AH S IH Z
+irish AY R IH SH
+irishman AY R IH SH M AH N
+irishness AY R IH SH N IH S
+irit IH R IH T
+irit(2) AY AA R AY T IY
+irizarry IH R IH Z AE R IY
+irk ER K
+irked ER K T
+irks ER K S
+irksome ER K S AH M
+irkutsk ER K UH T S K
+irkutsk(2) IH R K UH T S K
+irlbeck ER L B EH K
+irma ER M AH
+irma's ER M AH Z
+iron AY ER N
+ironclad AY ER N K L AE D
+ironed AY ER N D
+ironic AY R AA N IH K
+ironical AY R AA N IH K AH L
+ironically AY R AA N IH K L IY
+ironies AY R AH N IY Z
+ironing AY ER N IH NG
+ironing(2) AY R N IH NG
+ironize AY ER N AY Z
+ironized AY ER N AY Z D
+ironizer AY ER N AY Z ER
+ironizes AY ER N AY Z IH Z
+ironizing AY ER N AY Z IH NG
+irons AY ER N Z
+ironside AY ER N S AY D
+ironsides AY ER N S AY D Z
+ironton AY R N T AH N
+ironwood AY ER N W UH D
+ironwood's AY ER N W UH D Z
+irony AY R AH N IY
+iroquois IH R AH K W OY
+irradiate IH R EY D IY EY T
+irradiated IH R EY D IY EY T IH D
+irradiation IH R EY D IY EY SH AH N
+irrational IH R AE SH AH N AH L
+irrationality IH R AE SH AH N AE L AH T IY
+irrationally IH R AE SH AH N AH L IY
+irrationally(2) IH R AE SH N AH L IY
+irrawaddy IH R AH W AA D IY
+irreconcilable IH R EH K AH N S AY L AH B AH L
+irredentism IH R AH D EH N T IH Z AH M
+irrefutable IH R AH F Y UW T AH B AH L
+irregardless IH R AH G AA D L AH S
+irregular IH R EH G Y AH L ER
+irregularities IH R EH G Y AH L EH R AH T IY Z
+irregularity IH R EH G Y AH L EH R AH T IY
+irregularly IH R EH G Y AH L ER L IY
+irregulars IH R EH G Y AH L ER Z
+irrelevance IH R EH L AH V AH N S
+irrelevancy IH R EH L AH V AH N S IY
+irrelevant IH R EH L AH V AH N T
+irremediable IH R IH M IY D IY AH B AH L
+irreparable IH R EH P ER AH B AH L
+irreparably IH R EH P ER AH B L IY
+irreplaceable IH R AH P L EY S AH B AH L
+irrepressible IH R AH P R EH S AH B AH L
+irresistible IH R IH Z IH S T AH B AH L
+irresistibly IH R IH Z IH S T AH B L IY
+irrespective IH R AH S P EH K T IH V
+irresponsibility IH R AH S P AA N S AH B IH L AH T IY
+irresponsible IH R AH S P AA N S AH B AH L
+irresponsibly IH R AH S P AA N S AH B L IY
+irretrievably IH R AH T R IY V AH B L IY
+irreverence IH R EH V ER AH N S
+irreverent IH R EH V ER AH N T
+irreversible IH R IH V ER S AH B AH L
+irreversibly IH R IH V ER S AH B L IY
+irrevocable IH R EH V AH K AH B AH L
+irrevocably IH R EH V AH K AH B L IY
+irrevocably(2) IH R EH V OW K AH B L IY
+irrigate IH R AH G EY T
+irrigated IH R AH G EY T IH D
+irrigation IH R AH G EY SH AH N
+irrigator IH R AH G EY T ER
+irrigators IH R AH G EY T ER Z
+irritability IH R IH T AH B IH L AH T IY
+irritable IH R AH T AH B AH L
+irritant IH R AH T AH N T
+irritants IH R AH T AH N T S
+irritate IH R IH T EY T
+irritated IH R AH T EY T AH D
+irritates IH R IH T EY T S
+irritating IH R AH T EY T IH NG
+irritation IH R IH T EY SH AH N
+irritations IH R IH T EY SH AH N Z
+irv ER V
+irve ER V
+irve(2) AY AA R V IY IY
+irvette ER V EH T
+irvin ER V IH N
+irvine ER V AY N
+irving ER V IH NG
+irving's ER V IH NG Z
+irwin ER W AH N
+irwin(2) ER W IH N
+irwindale ER W IH N D EY L
+is IH Z
+isa IY S AH
+isaac AY Z AH K
+isaac(2) AY Z IH K
+isaacks IH S AA K S
+isaacs AY Z IH K S
+isaacson AY Z IH K S AH N
+isaak IH S AA K
+isaak(2) AY Z AE K
+isabel IH Z AH B EH L
+isabell IH S AA B EH L
+isabella IH Z AH B EH L AH
+isabelle IH Z AH B EH L
+isackson IH S AH K S AH N
+isadore IH S AA D AO R EY
+isadore(2) IH S AA D AO R
+isaiah AY Z EY AH
+isaksen IH S AH K S AH N
+isakson IH S AH K S AH N
+isaly AY Z L IY
+isaly(2) AY S L IY
+isautier AY S AO T Y ER
+isay AY S EY
+isbell IH S B EH L
+isbill IH S B IH L
+iscariot IH S K EH R IY AH T
+isch IH SH
+ischemia IH S K EH M IY AH
+ischo IY SH OW
+ise AY Z
+iselin IH S IH L IH N
+iseman AY S M AH N
+iseminger IH S IY M IH NG ER
+isenberg AY Z AH N B ER G
+isenhart AY Z AH N HH AA R T
+isenhour IH S IH N AW R
+isenhower IH S IH N HH OW ER
+isensee AY Z AH N S IY
+isentrope AY Z AH N T R OW P
+isentropic AY Z AH N T R AA P AH K
+iser AY Z ER
+isetan IH S IH T AH N
+isgrigg IH S G R IH G
+isgro IY S G R OW
+isgur IH S G ER
+ish IH SH
+isham IH SH AH M
+ishaq IH SH AE K
+ishee IH SH IY
+isherwood IH SH ER W UH D
+ishi IH SH IY
+ishi's IH SH IY Z
+ishibashi IH SH IY B AA SH IY
+ishida IH SH IY D AH
+ishihara IH SH IY HH AA R AH
+ishii IH SH IY IY
+ishikawa IH SH IY K AA W AH
+ishikawajima IY SH IH K AA W AH JH IY M AH
+ishikura IH SH IH K UH R AH
+ishimura IY SH IH M UW R AH
+ishler IH SH L ER
+ishmael IH SH M IY L
+ishmael(2) IH SH M EY L
+ishmail IH SH M EY L
+ishman IH SH M AH N
+ishtar IH SH T AA R
+isidore IH Z IH D AO R
+isikoff IH Z AH K AO F
+isis AY S AH S
+iskra IH S K R AH
+isla IY L AH
+islam IH S L AA M
+islam's IH S L AA M Z
+islam(2) IH Z L AH M
+islamabad IH S L AE M AH B AE D
+islamabad's IH S L AE M AH B AE D Z
+islami IH Z L AA M IY
+islamic IH Z L AA M IH K
+islamically IH Z L AA M IH K L IY
+islamist IH S L AH M IH S T
+islamists IH S L AH M IH S T S
+islamists(2) IH S L AH M IH S S
+islamists(3) IH S L AH M IH S
+islamiya IH S L AA M IY AH
+islamization IH Z L AA M AH Z EY SH AH N
+island AY L AH N D
+island's AY L AH N D Z
+islander AY L AH N D ER
+islanders AY L AH N D ER Z
+islandia AY L AE N D IY AH
+islands AY L AH N D Z
+islands' AY S L AH N D Z
+islas AY L AH Z
+isle AY L
+isleen AY L IY N
+isler AY L ER
+isles AY L Z
+islet AY L IH T
+islets AY L IH T S
+isley AY Z L IY
+islip AY S L IH P
+ism IH Z AH M
+ismael IH S M EY L
+ismail IH S M EY L
+isms IH Z AH M Z
+isn't IH Z AH N T
+isn't(2) IH Z AH N
+isner IH S N ER
+isocyanate AY S AH S AY AH N EY T
+isoda IY S OW D AH
+isoelectronic AY S OW IH L EH K T R AA N IH K
+isoelectronic(2) AY S OW IY L EH K T R AA N IH K
+isoetec AY S OW T EH K
+isogenic AY S OW JH EH N AH K
+isola AY S AA L AH
+isolate AY S AH L EY T
+isolated AY S AH L EY T AH D
+isolated(2) AY S AH L EY T IH D
+isolates AY S AH L EY T S
+isolating AY S AH L EY T IH NG
+isolation AY S AH L EY SH AH N
+isolationism AY S AH L EY SH AH N IH Z AH M
+isolationist AY S AH L EY SH AH N AH S T
+isolationists AY S AH L EY SH AH N IH S T S
+isolationists(2) AY S AH L EY SH AH N IH S
+isolde IH S OW L D AH
+isolde(2) IH S OW L D
+isom AY S AH M
+isomedix AY S OW M EH D IH K S
+isomedix's AY S OW M EH D IH K S IH Z
+isomedix's(2) AY S OW M EH D IH K S
+isomer AY S AH M ER
+isomers AY S AH M ER Z
+isomorphism AY S AH M AO R F IH Z AH M
+ison IH S AH N
+isoprinosine IH S AH P R IH N AH S IY N
+isosceles AY S AO S AH L IY Z
+isothermal AY S AH TH ER M AH L
+isotoner IH Z OW T AH N ER
+isotoner(2) AY S OW T OW N ER
+isotonic AY S AH T AA N IH K
+isotope AY S AH T OW P
+isotopes AY S AH T OW P S
+isotopic AY S AH T AA P IH K
+isoxicam IH S AA K S IH K AH M
+ispra IH S P R AH
+israel IH Z R IY AH L
+israel's IH Z R EY L Z
+israel's(2) IH Z R IY AH L Z
+israel(2) IH Z R EY L
+israeli IH Z R EY L IY
+israelis IH Z R EY L IY Z
+israelis' IH Z R EY L IY Z
+israelite IH Z R AH L AY T
+israelites IH Z R AH L AY T S
+israeloff IH S R EY L AO F
+israelson IH S R EH L S AH N
+israhi IH Z R AA HH IY
+isringhouser IH S R IH NG HH AW Z ER
+issa IH S AH
+issac IH S AH K
+issac(2) AY Z IH K
+issah IH S AH
+issam IH S AH M
+issar IY S AA R
+issie IH S IY
+issing IH S IH NG
+issuable IH SH UW AH B AH L
+issuance IH SH UW AH N S
+issuances IH SH UW AH N S IH Z
+issue IH SH UW
+issue's IH SH UW Z
+issued IH SH UW D
+issueless IH SH UW L AH S
+issuer IH SH UW ER
+issuer's IH SH UW ER Z
+issuers IH SH UW ER Z
+issuers' IH S UW R Z
+issues IH SH UW Z
+issues' IH S UW Z
+issuing IH SH UW IH NG
+issy IH S IY
+istanbul IH S T AA N B UW L
+istat IH S T AE T
+istel IH S T EH L
+istel's IH S T EH L Z
+isthmus IH S M AH S
+istituto IH S T IH T UW T OW
+istook IH S T UH K
+istre IH S T ER
+isty IH S T IY
+isty(2) AY EH S T IY W AY
+isu IH S UW
+isu(2) AY EH S Y UW
+isuzu IH S UW Z UW
+it IH T
+it'd IH T AH D
+it'll IH T AH L
+it'll(2) IH T L
+it's IH T S
+it-wit IH T W IH T
+ita AY T AH
+ita(2) AY T IY EY
+italia IY T AE L IY AH
+italia(2) IH T AE L Y AH
+italian IH T AE L Y AH N
+italiana IH T AE L IY AE N AH
+italianate IH T AE L Y AH N EY T
+italiano IH T AA L IY AA N OW
+italians IH T AE L Y AH N Z
+italic AY T AE L IH K
+italics AY T AE L IH K S
+italish IH T AE L IH SH
+italtel IH T AE L T EH L
+italy IH T AH L IY
+italy's IH T AH L IY Z
+itamar IY T AH M AA R
+itami IH T AA M IY
+itar IY T AA R
+itasca AY T AE S K AH
+itch IH CH
+itches IH CH AH Z
+itches(2) IH CH IH Z
+itching IH CH IH NG
+itchy IH CH IY
+itek AY T EH K
+itel AY T EH L
+item AY T AH M
+itemize AY T AH M AY Z
+itemized AY T AH M AY Z D
+itemizer AY T AH M AY Z ER
+itemizers AY T AH M AY Z ER Z
+itemizes AY T AH M AY Z IH Z
+itemizing AY T AH M AY Z IH NG
+items AY T AH M Z
+iten AY T AH N
+iterative IH T ER EY T IH V
+ithaca IH TH AH K AH
+ithaca's IH TH AH K AH Z
+itinerant AY T IH N ER AH N T
+itineraries AY T IH N ER EH R IY Z
+itinerary AY T IH N ER EH R IY
+itkin IH T K IH N
+ito IY T OW
+ito's IY T OW Z
+itochu IY T OW CH UW
+itoh IY T OW
+its IH T S
+itself IH T S EH L F
+itstee IH T S T IY
+itsy IH T S IY
+itsy-bitsy IH T S IY B IH T S IY
+ittner IH T N ER
+itty IH T IY
+itty-bitty IH T IY B IH T IY
+itzhak IH T S AA K
+itzhak(2) IH T S AE K
+itzhak(3) IH T S HH AE K
+itzkowitz IH T S K AH W IH T S
+iuliano IY UW L IY AA N OW
+iuliano(2) Y UW L IY AA N OW
+iva IY V AH
+ivaco AY V AH K OW
+ivan AY V AH N
+ivana IH V AA N AH
+ivancic IH V AE NG K IH K
+ivane IH V AH N
+ivanhoe AY V AH N HH OW
+ivanko IY V AA N K OW
+ivanna IH V AA N AH
+ivanoff IH V AH N AO F
+ivanov IH V AH N AA V
+ivanyenko AY V AH N Y EH N K OW
+ivar IH V ER
+ivatans AY V AH T AH N Z
+ivax AY V AE K S
+iven AY V AH N
+ivens AY V AH N Z
+iver AY V ER
+ivern AY V ER N
+ivers AY V ER Z
+iversen IH V ER S AH N
+iverson AY V ER S AH N
+ivery AY V ER IY
+ives AY V Z
+ivester AY V EH S T ER
+ivey AY V IY
+ivie AY V IY
+ivins IH V IH N Z
+ivo AY V IY OW
+ivo(2) AY V OW
+ivor AY V ER
+ivorian AY V AO R IY AH N
+ivorians AY V AO R IY AH N Z
+ivory AY V ER IY
+ivory(2) AY V R IY
+ivory-coast AY V ER IY K OW S T
+ivory-coast(2) AY V R IY K OW S T
+ivy AY V IY
+iwai AY W AY
+iwaki AY W AA K IY
+iwamoto IH W AA M OW T OW
+iwan IY W AA N
+iwanicki IH V AH N IH T S K IY
+iwanski IH V AE N S K IY
+iwasaki IY W AA S AA K IY
+iwata IH W AA T AH
+iwate AY W EY T
+iwen IH W AH N
+iwerks AY W ER K S
+iwinski IH V IH N S K IY
+iwo AY W OW
+iwosaki AY W AH S AA K IY
+ixion IH K S AY AH N
+iyer AY ER
+izaguirre IH Z AH G W IH R EY
+izaguirre(2) IH Z AH G W AY R
+izansky IH Z AE N S K IY
+izansky's IH Z AE N S K IY Z
+izard IH Z ER D
+izatt IY Z AA T
+izetbegovic IH Z EH T B EH G OW V IH CH
+izetbegovic's IH Z EH T B EH G OW V IH CH IH Z
+izod AY Z AA D
+izquierdo IH Z K W IH R D OW
+izumi IH Z UW M IY
+izvestia IH Z V EH S T IY AH
+izzard IH Z ER D
+izzi IH Z IY
+izzo IH Z OW
+izzy IH Z IY
+izzy's IH Z IY Z
+j JH EY
+j's JH EY Z
+j. JH EY
+j.'s JH EY Z
+ja Y AA
+jaan Y AA N
+jaan(2) JH AE N
+jab JH AE B
+jabah JH AE B AH
+jabaliya JH AA B AH L IY AH
+jabar JH AH B AA R
+jabar's JH AH B AA R Z
+jabbar JH AH B AA R
+jabbed JH AE B D
+jabbing JH AE B IH NG
+jabbour ZH AH B UH R
+jaber JH EY B ER
+jablon JH AE B L AH N
+jablonowski Y AH B L AH N AO F S K IY
+jablonski Y AH B L AA N S K IY
+jablonsky Y AH B L AA N S K IY
+jabril JH AH B R IY L
+jabril(2) JH AH B R IH L
+jabs JH AE B Z
+jac JH AE K
+jacek JH AA CH EH K
+jachim JH AE K IH M
+jacinda JH AH S IH N D AH
+jacinta JH AH S IH N T AH
+jacinth JH AE S IH N TH
+jacintha JH AH S IH N TH AH
+jacinthe JH AE S IH N TH
+jacinto JH AH S IH N T OW
+jack JH AE K
+jack's JH AE K S
+jacka JH AE K AH
+jackal JH AE K AH L
+jackass JH AE K AE S
+jacked JH AE K T
+jackel JH AE K AH L
+jackelyn JH AE K IH L IH N
+jacket JH AE K AH T
+jacket(2) JH AE K IH T
+jacketed JH AE K AH T IH D
+jackets JH AE K IH T S
+jackett JH AE K IH T
+jackhammer JH AE K HH AE M ER
+jackhammers JH AE K HH AE M ER Z
+jacki JH AE K IY
+jacki's JH AE K IY Z
+jackie JH AE K IY
+jackie's JH AE K IY Z
+jacking JH AE K IH NG
+jackley JH AE K L IY
+jacklin JH AE K L IH N
+jackman JH AE K M AH N
+jacko JH AE K OW
+jackoby JH AE K AH B IY
+jackovich JH AE K AH V IH CH
+jackowski Y AH S K AO F S K IY
+jackpot JH AE K P AA T
+jackpots JH AE K P AA T S
+jackrabbit JH AE K R AE B AH T
+jacks JH AE K S
+jacksdeit JH AE K S D IY AH T
+jackson JH AE K S AH N
+jackson's JH AE K S AH N Z
+jacksonian JH AE K S OW N IY AH N
+jacksonians JH AE K S OW N IY AH N Z
+jacksons JH AE K S AH N Z
+jacksonville JH AE K S AH N V IH L
+jacksonville's JH AE K S AH N V IH L Z
+jacky JH AE K IY
+jacky's JH AE K IY Z
+jaclyn JH AE K L IH N
+jaco Y AA K OW
+jacob JH EY K AH B
+jacob's JH EY K AH B Z
+jacoba Y AA K OW B AH
+jacobe JH AE K AH B
+jacobean JH AE K AH B IY AH N
+jacober JH EY K AH B ER
+jacobi Y AA K OW B IY
+jacobin JH AE K AH B AH N
+jacobin(2) JH AE K AH B IH N
+jacobina Y AH K AH B AY N AH
+jacobine JH AE K AH B AY N
+jacobite JH AE K AH B AY T
+jacobites JH AE K AH B AY T S
+jacobo Y AA K OW B OW
+jacoboski JH AE K OW B AO S K IY
+jacobowitz Y AH K AA B AH W IH T S
+jacobs JH EY K AH B Z
+jacobs' JH EY K AH B Z
+jacobs's JH EY K AH B Z IH Z
+jacobsen JH EY K AH B S AH N
+jacobson JH EY K AH B S AH N
+jacobson's JH EY K AH B S AH N Z
+jacobus JH AH K OW B AH S
+jacoby JH AH K OW B IY
+jacome JH AH K OW M
+jacor JH EY K AO R
+jacot JH AE K AH T
+jacox JH AE K AA K S
+jacque ZH EY K
+jacqueline JH AE K W AH L IH N
+jacqueline(2) JH AE K L IH N
+jacqueline(3) JH AE K AH L IH N
+jacquelyn JH AE K W IH L IH N
+jacques ZH AA K
+jacques' ZH AA K S
+jacques'(2) JH AE K S
+jacques(2) JH AE K
+jacquet JH AE K EH T
+jacquet(2) JH AE K EY
+jacquetta JH AA K EH T AH
+jacquez Y AA K W EH Z
+jacquie JH AE K W IY
+jacquin JH AE K W IH N
+jacquot ZH AH K W OW
+jacuzzi JH AH K UW Z IY
+jade JH EY D
+jaded JH EY D AH D
+jaded(2) JH EY D IH D
+jadeite JH EY D AY T
+jades JH EY D Z
+jadwin JH AE D W IH N
+jae JH EY
+jae's JH EY Z
+jaeckel Y EH K AH L
+jaegar JH AE G ER
+jaeger JH EH G ER
+jaeger(2) Y AE G ER
+jaegers JH EH G ER Z
+jaegers(2) Y AE G ER Z
+jaekel Y EH K AH L
+jaenicke Y EH N IH K
+jafco JH AE F K OW
+jafco's JH AE F K OW Z
+jaffa JH AE F AH
+jaffar JH AH F AA R
+jaffe JH AE F IY
+jaffee JH AE F IY
+jaffey JH AE F IY
+jaffna JH AE F N AH
+jaffray JH AE F R EY
+jaffray's JH AE F R EY Z
+jaffrey JH AE F R IY
+jagdish JH AE G D IH SH
+jager JH EY G ER
+jagged JH AE G D
+jagger JH AE G ER
+jagger's JH AE G ER Z
+jaggers JH AE G ER Z
+jagiello JH AA JH EH L OW
+jagielski Y AH G IY L S K IY
+jaglom JH AE G L AH M
+jaglom's JH AE G L AH M Z
+jago Y AA G OW
+jagoda JH AA G OW D AH
+jagodzinski Y AH G AH JH IH N S K IY
+jagow Y AA G OW
+jags JH AE G Z
+jagt JH AE T
+jaguar JH AE G W AA R
+jaguar's JH AE G W AA R Z
+jaguars JH AE G W AA R Z
+jahn JH AE N
+jahner JH AA N ER
+jahnke JH AE NG K
+jahns JH AA N Z
+jahr JH AA R
+jai JH AY
+jai(2) HH AY
+jail JH EY L
+jail's JH EY L Z
+jailed JH EY L D
+jailer JH EY L ER
+jailers JH EY L ER Z
+jailhouse JH EY L HH AW S
+jailing JH EY L IH NG
+jails JH EY L Z
+jaime HH AY M IY
+jaime's HH AY M IY Z
+jaimes HH AY M IY Z
+jaimie JH EY M IY
+jaimie(2) HH AY M IY
+jain JH AY N
+jain(2) JH EY N
+jainism JH EY N IH Z AH M
+jaisigher JH EY S AH G ER
+jakab JH AE K AH B
+jakarta JH AH K AA R T AH
+jakarta's JH AH K AA R T AH Z
+jake JH EY K
+jake's JH EY K S
+jakel JH AE K AH L
+jakes JH EY K S
+jakeway JH EY K W EY
+jakie JH AE K IY
+jakob JH AE K AH B
+jakobsen JH AE K AH B S AH N
+jakubek Y AH K UW B EH K
+jakubiak Y AH K AH B IY AE K
+jakubik Y AH K UW B IH K
+jakubowicz Y AH K AH B AH V IH CH
+jakubowski Y AH K AH B AO F S K IY
+jalalabad JH AH L AE L AH B AE D
+jalapeno HH AE L AH P IY N Y OW
+jalapeno(2) JH AE L AH P IY N OW
+jalbert JH AE L B ER T
+jalopy JH AH L AA P IY
+jam JH AE M
+jam's JH AE M Z
+jama JH AE M AH
+jamaica JH AH M EY K AH
+jamaica's JH AH M EY K AH Z
+jamaican JH AH M EY K AH N
+jamaicans JH AH M EY K AH N Z
+jamail JH AH M EY L
+jamal JH AH M AA L
+jamal's JH AH M AA L Z
+jamar Y AA M AA R
+jamb JH AE M
+jambor Y AA M B AO R
+jamerson JH AE M ER S AH N
+jamerson's JH AE M ER S AH N Z
+james JH EY M Z
+james' JH EY M Z
+james's JH EY M Z IH Z
+jameson JH EY M S AH N
+jamestown JH EY M Z T AW N
+jamesway JH EY M Z W EY
+jami JH EY M IY
+jamie JH EY M IY
+jamie's JH EY M IY Z
+jamieson JH EY M IH S AH N
+jamila JH AH M IH L AH
+jamison JH EY M IH S AH N
+jammed JH AE M D
+jammer JH AE M ER
+jammers JH AE M ER Z
+jamming JH AE M IH NG
+jammu JH AH M UW
+jammu's JH AH M UW Z
+jamrog JH AE M R AH G
+jamroz Y AA M R OW Z
+jams JH AE M Z
+jamshedpur JH AE M SH EH D P ER
+jamu JH AE M UW
+jan JH AE N
+jan's JH AE N Z
+jan. JH AE N
+jan.(2) JH AE N Y UW EH R IY
+jana JH AE N AH
+janacek Y AE N AH CH EH K
+janachowski JH AE N AH CH AW S K IY
+janak Y AE N AH K
+janardhan JH AH N AA R D AH N
+janas JH AE N AH Z
+janata JH AH N AA T AH
+janca JH AE NG K AH
+janco JH AE NG K OW
+janczak Y AE N CH AE K
+janda JH AE N D AH
+jandreau ZH AH N D R OW
+jandt JH AE N T
+jane JH EY N
+jane's JH EY N Z
+janeane JH EY N AE N
+janecek Y AE N IH CH EH K
+janeczko Y AH N EH CH K OW
+janeiro JH AH N EH R OW
+janeiro(2) ZH AH N EH R OW
+janek Y AE N EH K
+janel JH AE N AH L
+janella JH AH N EH L AH
+janelle ZH AH N EH L
+janes JH EY N Z
+janesville JH EY N Z V IH L
+janet JH AE N AH T
+janet's JH AE N AH T S
+janet's(2) JH AE N IH T S
+janet(2) JH AE N IH T
+janette JH AH N EH T
+janeway JH EY N W EY
+janey JH EY N IY
+jang JH AE NG
+jangle JH AE NG G AH L
+jangled JH AE NG G AH L D
+jani Y AA N IY
+janiak Y AE N IY AE K
+janice JH AE N AH S
+janice(2) JH AE N IH S
+janicek Y AE N IH CH EH K
+janick JH AE N IH K
+janicke JH AE N IH K
+janicki JH AH N IH K IY
+janie JH EY N IY
+janiero JH AH N EH R OW
+janiero(2) JH AH N Y EH R OW
+janiga JH AE N IH G AH
+janii JH AH N IY
+janik Y AE N IH K
+janikowski Y AH N IH K AO F S K IY
+janina JH AH N IY N AH
+janine JH AH N IY N
+janis JH AE N IH S
+janisch JH AE N IH SH
+janish Y AE N IH SH
+janiszewski Y AH N IH SH EH F S K IY
+janitor JH AE N AH T ER
+janitorial JH AE N IH T AO R IY AH L
+janitors JH AE N AH T ER Z
+jank JH AE NG K
+janka JH AE NG K AH
+janke JH AE NG K
+jankiewicz Y AE N K AH V IH CH
+janklow JH AE NG K L OW
+janko JH AE NG K OW
+jankovic JH AE NG K AH V IH K
+jankovich JH AE NG K AH V IH CH
+jankowiak Y AH NG K AW IY AE K
+jankowski Y AH NG K AO F S K IY
+jann JH AE N
+janna JH AE N AH
+janney JH AE N IY
+janning JH AE N IH NG
+jannock JH AE N AH K
+jannotta JH AH N AA T AH
+janoff JH AE N AO F
+janofsky JH AH N AO F S K IY
+janos JH AE N OW S
+janosik Y AH N OW S IH K
+janoski Y AH N AW S K IY
+janosko Y AH N OW S K OW
+janosky Y AH N OW S K IY
+janota Y AH N OW T AH
+janousek Y AH N UW S EH K
+janovsky JH AH N AA V S K IY
+janow Y AE N OW
+janowiak Y AH N AW IY AE K
+janowicz Y AE N AH V IH CH
+janowitz Y AE N AH W IH T S
+janowski Y AH N AO F S K IY
+jans JH AE N Z
+jansa JH AE N S AH
+jansen JH AE N S AH N
+jansenism JH AE N S IH N IH Z AH M
+jansenist JH AE N S AH N AH S T
+jansenists JH AE N S AH N AH S T S
+jansenists(2) JH AE N S AH N AH S S
+jansenists(3) JH AE N S AH N AH S
+jansky Y AE N S K IY
+jansma Y AE N S M AH
+janson JH AE N S AH N
+janssen JH AE N S AH N
+janssens JH AE N S AH N Z
+jansson JH AE N S AH N
+janthina Y AA N TH IY N AH
+jantz JH AE N T S
+jantzen JH AE N T Z AH N
+january JH AE N Y UW EH R IY
+january's JH AE N Y UW EH R IY Z
+janus JH EY N AH S
+janusz Y AA N UH SH
+januszewski Y AH N AH SH EH F S K IY
+janvier JH AE N V IY ER
+janvrin JH AE N V R IH N
+janz JH AE N Z
+janzen JH AE N Z AH N
+jap JH AE P
+japan JH AH P AE N
+japan's JH AH P AE N Z
+japanese JH AE P AH N IY Z
+japans JH AH P AE N Z
+japonica JH AH P AA N AH K AH
+japonica(2) JH AH P AA N IH K AH
+japs JH AE P S
+jaqua Y AE K W AH
+jaquay ZH AH K EY
+jaques JH AE K S
+jaquess Y AA K W IH S
+jaquez Y AA K W EH Z
+jaquish JH AE K W IH SH
+jaquith JH AE K W IH TH
+jar JH AA R
+jara JH AA R AH
+jaramillo JH AE R AH M IH L OW
+jarara JH AH R AA R AH
+jarash JH AA R AH SH
+jarboe JH AA R B OW
+jarchow JH AA R CH AW
+jardin JH AA R D IH N
+jardine JH AA R D AY N
+jardine's JH AA R D AY N Z
+jarecki Y ER EH T S K IY
+jared JH EH R IH D
+jarema Y ER IY M AH
+jares ZH EH R Z
+jargon JH AA R G AH N
+jarislowsky JH EH R IH S L AW S K IY
+jarman JH AA R M AH N
+jarmin JH AA R M AH N
+jarmin's JH AA R M AH N Z
+jarmon Y AA R M AO N
+jarnagin JH AA R N AH JH IH N
+jarnigan JH AA R N IH G AE N
+jaromir JH AE R AH M IH R
+jaromir(2) Y AA R AH M IH R
+jaros Y AA R OW Z
+jarosz Y AA R AH SH
+jaroszewski Y ER AH SH EH F S K IY
+jaroszynski JH EH R AH Z IH N S K IY
+jarrard ZH ER AA R D
+jarratt JH AE R AH T
+jarreau ZH ER OW
+jarred JH AA R D
+jarrell Y AA R EY L
+jarrells JH AE R AH L Z
+jarrett JH EH R AH T
+jarriel ZH ER IY L
+jarriel's ZH ER IY L Z
+jarring JH AA R IH NG
+jarrod JH AE R AH
+jarryd JH AE R IH D
+jars JH AA R Z
+jaruzelski JH EH R AH Z EH L S K IY
+jaruzelski(2) Y AE R AH Z EH L S K IY
+jarvi JH AA R V IY
+jarvia JH AA R V IY AH
+jarvie JH AA R V IY
+jarvik JH AA R V IH K
+jarvinen JH AA R V IH N AH N
+jarvis JH AA R V AH S
+jarvis's JH AA R V IH S IH Z
+jarvis(2) JH AA R V IH S
+jaryl JH AE R AH L
+jarzombek Y ER Z AA M B EH K
+jas JH EY M Z
+jasek Y AA S EH K
+jasinowski JH AE S IH N AW S K IY
+jasinski Y AH S IH N S K IY
+jaskiewicz Y AA S K AH V IH CH
+jasko Y AA S K OW
+jaskolski Y AH S K OW L S K IY
+jaskot Y AA S K AH T
+jaskowiak Y AH S K AW IY AE K
+jaskulski Y AH S K AH L S K IY
+jasmer JH AE S AH M ER
+jasmin JH AE Z M IH N
+jasmina Y AH S M AY N AH
+jasmine JH AE Z M AH N
+jasmine(2) JH AE Z M IH N
+jaso Y AA S OW
+jason JH EY S AH N
+jason's JH EY S AH N Z
+jaspal JH AE S P AA L
+jasper JH AE S P ER
+jasper's JH AE S P ER Z
+jaspers JH AE S P ER Z
+jasperson JH AE S P ER S AH N
+jass JH AE S
+jasso JH AE S OW
+jaster JH AE S T ER
+jauch JH AO CH
+jaudon Y AW D AO N
+jaundice JH AO N D AH S
+jaundiced JH AO N D IH S T
+jaunt JH AO N T
+jauntily JH AO N T AH L IY
+jaunts JH AO N T S
+jaunty JH AO N T IY
+jauregui Y AW R EY G W IY
+jaurequi Y AW R EY K W IY
+java JH AA V AH
+javan JH AH V AA N
+javanese JH AA V AH N IY Z
+javascript JH AA V AH S K R IH P T
+javelin JH AE V AH L AH N
+javelin(2) JH AE V AH L IH N
+javelin(3) JH AE V L AH N
+javelin(4) JH AE V L IH N
+javett JH AE V AH T
+javier HH AA V IY EH R
+javits JH AE V IH T S
+javorsky Y AH V AO R S K IY
+jaw JH AO
+jawad JH AH W AA D
+jawbone JH AO B OW N
+jawboning JH AO B OW N IH NG
+jawed JH AO D
+jaworowski Y AH W ER AO F S K IY
+jaworski JH AH W AO R S K IY
+jaws JH AO Z
+jay JH EY
+jay's JH EY Z
+jaya JH AY AH
+jayachandra JH AY AH CH AA N D R AH
+jayashankar JH AY AH SH AA NG K AA R
+jaycee JH EY S IY
+jaycees JH EY S IY Z
+jaycox JH EY K AA K S
+jaye JH EY
+jayewardene JH EY W AO R D IY N
+jayhawker JH EY HH AO K ER
+jayme JH EY M IY
+jaymes JH EY M IY Z
+jayne JH EY N
+jaynes JH EY N Z
+jayroe JH EY R OW
+jays JH EY Z
+jayson JH EY Z AH N
+jaywalk JH EY W AO K
+jaywalking JH EY W AO K IH NG
+jazmin JH AE Z M IH N
+jazz JH AE Z
+jazzed JH AE Z D
+jazzman JH AE Z M AE N
+jazzmen JH AE Z M AH N
+jazzy JH AE Z IY
+je JH IY
+je(2) JH EY IY
+jealous JH EH L AH S
+jealousies JH EH L AH S IY Z
+jealously JH EH L AH S L IY
+jealousness JH EH L AH S N IH S
+jealousy JH EH L AH S IY
+jean JH IY N
+jean's JH IY N Z
+jeana JH IY N AH
+jeanbaptiste ZH EH N B AH P T IH S T
+jeanbertrand JH IY N B ER T R AH N D
+jeanbertrand(2) ZH AA N B EH R T R AA N D
+jeancourt JH IY N K AO R T
+jeancourt(2) ZH AA NG K AO R T
+jeane JH IY N
+jeaner JH IY N ER
+jeanerette JH IY N R EH T
+jeanes JH IY N Z
+jeanette JH AH N EH T
+jeaney JH IY N IY
+jeanie JH IY N IY
+jeanine JH AH N IY N
+jeanlouis ZH AA N L UW IY Z
+jeanmichele ZH AA N M AH SH EH L
+jeanne JH IY N
+jeannette JH AH N EH T
+jeannie JH IY N IY
+jeanniot JH IY N IY AH T
+jeanpierre ZH AO N P IY EH R
+jeans JH IY N Z
+jeansonne JH EH N S AH N
+jeb JH EH B
+jech JH EH K
+jed JH EH D
+jedlicka Y IH D L IH S K AH
+jee JH IY
+jeep JH IY P
+jeep's JH IY P S
+jeepney JH IY P N IY
+jeeps JH IY P S
+jeer JH IH R
+jeered JH IH R D
+jeering JH IY R IH NG
+jeers JH IY R Z
+jees JH IY Z
+jeeter JH IY T ER
+jeez JH IY Z
+jeeze JH IY Z
+jefcoat JH EH F K OW T
+jeff JH EH F
+jeff's JH EH F S
+jeffcoat JH EH F K OW T
+jeffe JH EH F
+jeffe(2) JH EH F IY
+jeffer JH EH F ER
+jefferey JH EH F ER IY
+jefferies JH EH F R IY Z
+jefferies' JH EH F ER IY Z
+jefferies's JH EH F R IY Z IH Z
+jefferis JH EH F ER IH S
+jeffers JH EH F ER Z
+jefferson JH EH F ER S AH N
+jefferson's JH EH F ER S AH N Z
+jeffersonian JH EH F ER S OW N IY AH N
+jeffersonians JH EH F ER S OW N IY AH N Z
+jeffery JH EH F ER IY
+jefferys JH EH F ER IY Z
+jeffey JH EH F IY
+jeffords JH EH F ER D Z
+jeffress JH EH F R IH S
+jeffrey JH EH F R IY
+jeffrey's JH EH F R IY Z
+jeffreys JH EH F R IY Z
+jeffries JH EH F R IY Z
+jeffry JH EH F R IY
+jeffs JH EH F S
+jeffus JH EH F AH S
+jeffy JH EH F IY
+jehle JH EH HH AH L
+jehovah JH AH HH OW V AH
+jehovah's JH AH HH OW V AH Z
+jekel JH EH K AH L
+jekyll JH EH K AH L
+jelen JH EH L AH N
+jelinek JH EH L AH N IH K
+jelinek(2) JH EH L IH N EH K
+jelinski Y IH L IH N S K IY
+jelisic JH AH L IH S T IH K
+jelks JH EH L K S
+jell JH EH L
+jelled JH EH L D
+jelley JH EH L IY
+jellied JH EH L IY D
+jellies JH EH L IY Z
+jellison JH EH L IH S AH N
+jello JH EH L OW
+jello's JH EH L OW Z
+jelly JH EH L IY
+jelly's JH EH L IY Z
+jellyfish JH EH L IY F IH SH
+jelton JH EH L T AH N
+jem JH EH M
+jem's JH EH M Z
+jemie JH EH M IY
+jemima JH EH M IY M AH
+jemison JH EH M IH S AH N
+jemmie JH EH M IY
+jemmott JH EH M AH T
+jen JH EH N
+jena JH IY N AH
+jencks JH EH NG K S
+jendro JH EH N D R OW
+jenin JH EH N IH N
+jenison JH EH N IH S AH N
+jenkens JH EH NG K AH N Z
+jenkin JH EH NG K IH N
+jenkins JH EH NG K AH N Z
+jenkins(2) JH EH NG K IH N Z
+jenkinson JH EH NG K IH N S AH N
+jenks JH EH NG K S
+jenn JH EH N
+jenn's JH EH N Z
+jenna JH EH N AH
+jenne JH EH N
+jenner JH EH N ER
+jenness JH EH N IH S
+jennett JH EH N IH T
+jennette ZH IH N EH T
+jennewein JH EH N UW AY N
+jenney JH EH N IY
+jenni JH EH N IY
+jennie JH EH N IY
+jennifer JH EH N AH F ER
+jennifer's JH EH N AH F ER Z
+jenning JH EH N IH NG
+jenninger JH EH N IH NG ER
+jennings JH EH N IH NG Z
+jennison JH EH N IH S AH N
+jenny JH EH N IY
+jenny's JH EH N IY Z
+jenrette JH EH N R EH T
+jenrette's JH EH N R EH T S
+jens JH EH N Z
+jensen JH EH N S AH N
+jenson JH EH N S AH N
+jenssen JH EH N S AH N
+jent JH EH N T
+jentsch JH EH N CH
+jentz JH EH N T S
+jeong JH EH NG
+jeopardize JH EH P ER D AY Z
+jeopardized JH EH P ER D AY Z D
+jeopardizes JH EH P ER D AY Z IH Z
+jeopardizing JH EH P ER D AY Z IH NG
+jeopardy JH EH P ER D IY
+jeppesen JH EH P IY Z AH N
+jeppson JH EH P S AH N
+jepsen JH EH P S AH N
+jepson JH EH P S AH N
+jepson's JH EH P S AH N Z
+jerabek JH EH R AH B IH K
+jerald JH EH R AH L D
+jerboas JH ER B OW AH Z
+jerde JH ER D
+jerden JH ER D AH N
+jere JH EH R IY
+jereb JH EH R IH B
+jereissati JH EH R EY S AA T IY
+jerel JH EH R AH L
+jereld JH EH R IH L D
+jeremia Y EH R IY M IY AH
+jeremiad JH EH R AH M AY AH D
+jeremiah JH EH R AH M AY AH
+jeremy JH EH R AH M IY
+jerez Y EH R EH Z
+jergens JH ER G AH N Z
+jergenson JH ER G IH N S AH N
+jerger JH ER G ER
+jeri JH EH R IY
+jericho JH EH R IH K OW
+jerk JH ER K
+jerk-off JH ER K AO F
+jerked JH ER K T
+jerking JH ER K IH NG
+jerkins JH ER K IH N Z
+jerks JH ER K S
+jerky JH ER K IY
+jermaine JH ER M EY N
+jerman JH ER M AH N
+jermyn JH ER M IH N
+jernberg JH ER N B ER G
+jernigan JH ER N IH G AE N
+jeroboam JH EH R AH B OW AH M
+jerod JH EH R AH D
+jerold JH EH R OW L D
+jerome JH ER OW M
+jerr JH ER
+jerrell Y EH R EY L
+jerrell(2) JH EH R AH L
+jerri JH EH R IY
+jerrico JH EH R IH K OW
+jerrie JH EH R IY
+jerris JH ER R AH S
+jerritts JH EH R IH T S
+jerrold JH EH R AH L D
+jerrome Y EH R OW M EY
+jerrome(2) JH AH R OW M
+jerry JH EH R IY
+jerry's JH EH R IY Z
+jersey JH ER Z IY
+jersey's JH ER Z IY Z
+jerseys JH ER Z IY Z
+jersian JH ER Z IY AH N
+jersians JH ER Z IY AH N Z
+jerusalem JH ER UW S AH L AH M
+jerusalem's JH ER UW S AH L AH M Z
+jerusha JH EH R AH SH AH
+jervis JH ER V IH S
+jerzak Y ER Z AH K
+jerzy JH ER Z IY
+jeschke JH EH SH K
+jeske JH EH S K
+jesmer JH EH S AH M ER
+jesper JH EH S P ER
+jespersen JH EH S P ER S AH N
+jesperson JH EH S P ER S AH N
+jess JH EH S
+jessalynn JH EH S AH L IH N
+jessamine JH EH S AH M IH N
+jessamyn JH EH S AH M IH N
+jesse JH EH S IY
+jesse's JH EH S IY Z
+jessee JH EH S IY
+jesselson JH EH S AH L S AH N
+jessen JH EH S AH N
+jesser JH EH S ER
+jessica JH EH S IH K AH
+jessica's JH EH S IH K AH Z
+jessie JH EH S IY
+jesson JH EH S AH N
+jessop JH EH S AH P
+jessup JH EH S AH P
+jessy JH EH S IY
+jessye JH EH S IY
+jest JH EH S T
+jester JH EH S T ER
+jester's JH EH S T ER Z
+jesters JH EH S T ER Z
+jests JH EH S T S
+jesudason JH EH S UW D AH S AH N
+jesuit JH EH ZH UW IH T
+jesuits JH EH ZH UW IH T S
+jesup JH EH S AH P
+jesus JH IY Z AH S
+jesus' JH IY Z AH S
+jet JH EH T
+jet's JH EH T S
+jetborne JH EH T B AO R N
+jeter JH IY T ER
+jethro JH EH TH R OW
+jetliner JH EH T L AY N ER
+jetliner's JH EH T L AY N ER Z
+jetliners JH EH T L AY N ER Z
+jetro JH EH T R OW
+jets JH EH T S
+jets' JH EH T S
+jetson JH EH T S AH N
+jetsons JH EH T S AH N Z
+jetstream JH EH T S T R IY M
+jetstream's JH EH T S T R IY M Z
+jetstreams JH EH T S T R IY M Z
+jett JH EH T
+jett's JH EH T S
+jetta JH EH T AH
+jette JH EH T
+jetted JH EH T IH D
+jetter JH EH T ER
+jetting JH EH T IH NG
+jettison JH EH T IH S AH N
+jettisoned JH EH T IH S AH N D
+jettisoning JH EH T AH S AH N IH NG
+jetton JH EH T AH N
+jetty JH EH T IY
+jeumont JH UW M AA N T
+jew JH UW
+jewel JH UW AH L
+jewel(2) JH UW L
+jewelcor JH UW AH L K AO R
+jeweler JH UW AH L ER
+jeweler's JH UW AH L ER Z
+jeweler's(2) JH UW L ER Z
+jeweler(2) JH UW L ER
+jewelers JH UW AH L ER Z
+jewelers(2) JH UW L ER Z
+jewell JH UW IH L
+jewellers JH UW AH L ER Z
+jewellers(2) JH UW L ER Z
+jewelmaster JH UW AH L M AE S T ER
+jewelmaster(2) JH UW L M AE S T ER
+jewelmasters JH UW AH L M AE S T ER Z
+jewelry JH UW AH L R IY
+jewelry(2) JH UW L R IY
+jewelry(3) JH UW L ER IY
+jewels JH UW AH L Z
+jewels(2) JH UW L Z
+jewelsburg JH UW AH L Z B ER G
+jewelsburg(2) JH UW L Z B ER G
+jewess JH UW AH S
+jewett JH UW IH T
+jewfish JH UW F IH SH
+jewfishes JH UW F IH SH IH Z
+jewish JH UW IH SH
+jewishness JH UW IH SH N AH S
+jewitt JH UW IH T
+jewkes JH UW K S
+jewry JH UW R IY
+jews JH UW Z
+jews' JH UW Z
+jex JH EH K S
+jeyaretnam JH EY ER EH T N AH M
+jezek Y EH Z EH K
+jezewski Y IH Z EH F S K IY
+jezierski Y IH Z IH R S K IY
+jeziorski Y IH Z IY AO R S K IY
+jfet JH F EH T
+jha JH AA
+jheel JH IY L
+jheryl JH EH R AH L
+jhirmack JH ER M AE K
+ji JH IY
+jia JH IY AH
+jian JH IY AH N
+jiang JH AA NG
+jiang's JH IY AA NG Z
+jiang(2) JH IY AA NG
+jiangsu JH Y AA NG S UW
+jiar JH IY AA R
+jiawen JH IY W EH N
+jib JH IH B
+jibe JH AY B
+jibes JH AY B Z
+jicha JH IH CH AH
+jie JH IY
+jif JH IH F
+jifeng JH IY F EH NG
+jiffi-snak JH IH F IY S N AE K
+jiffy JH IH F IY
+jig JH IH G
+jiggetts JH IH G IH T S
+jiggle JH IH G AH L
+jiggling JH IH G AH L IH NG
+jiggling(2) JH IH G L IH NG
+jigs JH IH G Z
+jigsaw JH IH G S AO
+jihad JH IY HH AE D
+jihad(2) JH IY HH AA D
+jil JH IH L
+jilek JH IH L IH K
+jiles JH AY L Z
+jill JH IH L
+jillian JH IH L IY AH N
+jillian(2) JH IH L Y AH N
+jillion JH IH L Y AH N
+jillions JH IH L Y AH N Z
+jillson JH IH L S AH N
+jilt JH IH L T
+jilted JH IH L T IH D
+jim JH IH M
+jim's JH IH M Z
+jima JH IY M AH
+jimbo's JH IH M B OW Z
+jimena JH IH M AH N AH
+jimenez HH IH M EH N EH Z
+jimerson JH IH M ER S AH N
+jimi JH IH M IY
+jiminez HH IH M EH N EH Z
+jimison JH IH M IH S AH N
+jimmerson JH IH M ER S AH N
+jimmie JH IH M IY
+jimmied JH IH M IY D
+jimmy JH IH M IY
+jimmy's JH IH M IY Z
+jin JH IH N
+jindo JH IH N D OW
+jindra JH IH N D R AH
+jines JH AY N Z
+jing JH IH NG
+jingle JH IH NG G AH L
+jingles JH IH NG G AH L Z
+jingoism JH IH NG G OW IH Z AH M
+jingoistic JH IH NG G OW IH S T IH K
+jingsheng JH IH NG SH EH NG
+jinkins JH IH NG K IH N Z
+jinks JH IH NG K S
+jinright JH IH N R AY T
+jinx JH IH NG K S
+jipson JH IH P S AH N
+jirak JH AO R AH K
+jirga JH ER G AH
+jiri JH IH R IY
+jirik JH AO R IH K
+jiron Y IH R AO N
+jirsa Y IH R S AH
+jitney JH IH T N IY
+jitterbug JH IH T ER B AH G
+jitterbugging JH IH T ER B AH G IH NG
+jitters JH IH T ER Z
+jittery JH IH T ER IY
+jive JH AY V
+jividen Y IY V AY D AH N
+jiving JH AY V IH NG
+jna JH EY EH N EY
+jo JH OW
+joachim Y OW AA K IH M
+joachim's Y OW AA K IH M Z
+joachim's(2) W AA K IY M Z
+joachim(2) W AA K IY M
+joachims Y OW AA K IH M Z
+joachims(2) W AA K IY M Z
+joakima JH OW K IY M AH
+joakima(2) W AA K IY M AH
+joan JH OW N
+joann JH OW AE N
+joanna JH OW AE N AH
+joanne JH OW AE N
+joanou JH OW N UW
+joao JH OW OW
+joaquim W AA K IY M
+joaquin W AA K IY N
+job JH AA B
+job's JH AA B Z
+job's(2) JH OW B Z
+job(2) JH OW B
+jobber JH AA B ER
+jobbers JH AA B ER Z
+jobe JH OW B
+jobes JH OW B Z
+jobete JH OW B IY T
+jobin JH OW B IH N
+jobina Y OW B IY N AH
+jobless JH AA B L AH S
+joblessness JH AA B L AH S N AH S
+jobs JH AA B Z
+jobs' JH AA B Z
+jobs's JH AA B Z IH Z
+jobson JH AA B S AH N
+jobst JH AA B S T
+jobyna Y AH B IY N AH
+jocelin JH AO S L IH N
+joceline JH AO S L IH N
+jocelyn JH AO S L IH N
+jocelyne JH AO S L IH N
+jochem JH AA K IH M
+jochen JH OW K AH N
+jochim JH AA K IH M
+jochum JH AA K AH M
+jock JH AA K
+jockey JH AA K IY
+jockeying JH AA K IY IH NG
+jockeys JH AA K IY Z
+jocks JH AA K S
+jocosa Y OW K OW S AH
+jocular JH AA K Y AH L ER
+jocylan JH AO S L AH N
+jocylan's JH AO S L AH N Z
+jodi JH OW D IY
+jodie JH OW D IY
+jodohur JH AO D F ER
+jodoin ZH AH D OY N
+jody JH OW D IY
+joe JH OW
+joe's JH OW Z
+joedicke JH OW D IH K
+joel JH OW AH L
+joel's JH OW AH L Z
+joelle JH OW EH L
+joelson JH OW L S AH N
+joens JH OW N Z
+joerg JH AO R G
+joerger Y ER G ER
+joers JH OW ER Z
+joes JH OW Z
+joette ZH OW EH T
+joette(2) JH OW EH T
+joey JH OW IY
+joey's JH OW IY Z
+joffe JH AA F
+joffrey JH AO F R IY
+joffrion Y OW F R IY AO N
+jog JH AA G
+jogged JH AA G D
+jogger JH AA G ER
+joggers JH AA G ER Z
+jogging JH AA G IH NG
+jogging(2) JH AO G IH NG
+jogs JH AA G Z
+joh JH OW
+johan Y OW HH AA N
+johann Y OW HH AA N
+johanna JH AH HH AE N AH
+johannes JH OW HH AE N AH S
+johannesburg JH OW HH AE N IH S B ER G
+johannesburg's JH OW HH AE N IH S B ER G Z
+johannesen JH OW HH AE N IH S AH N
+johannessen JH OW HH AE N IH S AH N
+johanning Y OW HH AE N IH NG
+johanning(2) JH OW HH AE N IH NG
+johanns Y OW HH AA N Z
+johannsen JH OW HH AE N S AH N
+johansen JH OW HH AE N S AH N
+johanson JH OW HH AE N S AH N
+johansson Y OW HH AA N S AH N
+johansson(2) JH OW HH AA N S AH N
+john JH AA N
+john's JH AA N Z
+johnathan JH AA N AH TH AH N
+johnathan's JH AA N AH TH AH N Z
+johnathon JH AA N AH TH AH N
+johnathon's JH AA N AH TH AH N Z
+johndrow JH AA N D R OW
+johnie JH AA N IY
+johnnie JH AA N IY
+johnnie's JH AA N IY Z
+johnny JH AA N IY
+johnny's JH AA N IY Z
+johns JH AA N Z
+johns's JH AA N Z IH Z
+johnsen JH AA N S AH N
+johnsen's JH AA N S AH N Z
+johnsey JH AA N Z IY
+johnson JH AA N S AH N
+johnson's JH AA N S AH N Z
+johnsons JH AA N S AH N Z
+johnsrud JH AA N S R AH D
+johnston JH AA N S T AH N
+johnston's JH AA N S T AH N Z
+johnstone JH AA N S T OW N
+johnstown JH AA N Z T AW N
+johnstown's JH AA N Z T AW N Z
+johnta JH AA N T AH
+johny JH AA N IY
+johson JH AA S AH N
+joice JH OY S
+joie ZH W AA
+join JH OY N
+joined JH OY N D
+joiner JH OY N ER
+joinery JH OY N ER IY
+joines JH OY N Z
+joining JH OY N IH NG
+joins JH OY N Z
+joint JH OY N T
+jointed JH OY N T AH D
+jointed(2) JH OY N T IH D
+jointed(3) JH OY N IH D
+jointly JH OY N T L IY
+jointness JH OY N T N AH S
+joints JH OY N T S
+joist JH OY S T
+joists JH OY S T S
+jojoba HH OW HH OW B AH
+jojola Y OW Y OW L AH
+joke JH OW K
+jokebook JH OW K B UH K
+jokebooks JH OW K B UH K S
+joked JH OW K T
+jokela JH AA K IH L AH
+joker JH OW K ER
+jokers JH OW K ER Z
+jokerst JH AA K ER S T
+jokes JH OW K S
+jokester JH OW K S T ER
+jokhang JH AA K HH AE NG
+joki JH OW K IY
+jokinen JH AH K IH N AH N
+joking JH OW K IH NG
+jokingly JH OW K IH NG L IY
+jolene JH OW L IY N
+joles JH OW L Z
+joletta JH OW L EH T AH
+jolette JH OW L EH T
+jolicoeur ZH AA L IH K ER
+joliet JH OW L IY EH T
+jolin JH OW L IH N
+jolivette ZH AA L IH V EH T
+jolla HH OY Y AH
+jolla(2) JH OW L AH
+jolley JH AA L IY
+jollie JH AA L IY
+jollier JH AA L IY ER
+jollies JH AA L IY Z
+jolliest JH AA L IY AH S T
+jolliff JH AA L IH F
+jolliffe JH AA L IH F
+jolly JH AA L IY
+jollying JH AA L IY IH NG
+jolson JH OW L S AH N
+jolt JH OW L T
+jolted JH OW L T IH D
+jolting JH OW L T IH NG
+jolts JH OW L T S
+joly JH OW L IY
+jon JH AA N
+jon's JH AA N Z
+jonah JH OW N AH
+jonas JH OW N AH S
+jonassaint JH OW N AH S EY N T
+jonassaint's JH OW N AH S EY N T S
+jonassen JH AA N AH S AH N
+jonathan JH AA N AH TH AH N
+jonathan's JH AA N AH TH AH N Z
+jonathon JH AA N AH TH AH N
+jonbenet JH AO N B AH N EY
+jonbenet's JH AO N B AH N EY S
+joncas JH AA NG K AH Z
+jone JH OW N
+jones JH OW N Z
+jones' JH OW N Z
+jones's JH OW N Z IH Z
+jonesboro JH OW N Z B AH R OW
+joneses JH OW N Z IH Z
+jonestown JH OW N Z T AW N
+jong JH AO NG
+joni JH OW N IY
+jonker JH AA NG K ER
+jonn JH AA N
+jonothan JH AA N AH TH AH N
+jonsman JH AA N Z M AH N
+jonson JH AA N S AH N
+jonsson JH AA N S AH N
+joo JH UW
+joon JH UW N
+joong JH UH NG
+joos JH UW Z
+joost JH UW S T
+joosten Y UW S AH N
+joplin JH AA P L IH N
+jopling JH OW P AH L IH NG
+jopling(2) JH OW P L IH NG
+jopp JH AA P
+jordache JH AO R D AE SH
+jordahl JH AO R D AA L
+jordan JH AO R D AH N
+jordan's JH AO R D AH N Z
+jordana Y AO R D AE N AH
+jordanian JH AO R D EY N IY AH N
+jordanians JH AO R D EY N IY AH N Z
+jordans JH AO R D AH N Z
+jorde JH AO R D
+jorden JH AO R D AH N
+jordi JH AO R D IY
+jordon JH AO R D AH N
+jordy JH AO R D IY
+jorge HH AO R HH EY
+jorgensen JH AO R G AH N S AH N
+jorgenson JH AO R G IH N S AH N
+jorio JH AO R IY OW
+jornal JH AO R N AH L
+jorstad JH AO R S T AH D
+jory JH AO R IY
+jos JH OW Z
+josceline JH AA S IH L AY N
+joscelyn JH AA S IH L IH N
+joscelyne JH AA S IH L AY N
+jose HH OW Z EY
+jose's HH OW Z EY Z
+josef JH OW S AH F
+josefina Y OW S IH F IY N AH
+josefina(2) JH OW Z AH F IY N AH
+joseph JH OW S AH F
+joseph's JH OW Z AH F S
+joseph(2) JH OW Z AH F
+josepha JH OW S EH F AH
+josephina JH AA S IH F AY N AH
+josephina(2) JH OW Z AH F IY N AH
+josephine JH OW S AH F IY N
+josephine's JH OW S AH F IY N Z
+josephs JH OW S IH F S
+josephs(2) JH OW Z IH F S
+josephson JH OW S AH F S AH N
+josephthal JH OW S AH F TH AO L
+josephus JH OW S IY F AH S
+joser JH OW Z ER
+joser's JH OW Z ER Z
+josette ZH AH S EH T
+josey JH OW Z IY
+josh JH AA SH
+joshi JH OW SH IY
+joshua JH AA SH UW AH
+josiah JH OW S AY AH
+josie JH OW Z IY
+joske's JH AO S K IY Z
+josleyn JH AA S L IH N
+joslin JH AA S L IH N
+joslyn JH AO S L IH N
+jospin JH AA S P IH N
+joss JH AO S
+josselyn JH AA S IH L IH N
+jost JH AA S T
+josten JH AA S AH N
+jostens JH AO S T AH N Z
+jostes JH OW S T S
+jostle JH AA S AH L
+jostled JH AA S AH L D
+jostling JH AA S AH L IH NG
+jostling(2) JH AA S L IH NG
+joswick JH AA S W IH K
+jot JH AA T
+jotted JH AA T IH D
+joubert Y AW B ER T
+jouett JH AA UW T
+joule JH UW L
+joules JH UW L Z
+joulwan JH UW L W AA N
+joulwan(2) JH UW L HH W AA N
+jour JH AW R
+jourdan ZH UH R D AE N
+jouret ZH W AA R EY
+jouret's ZH W AA R EY Z
+jouret's(2) JH ER EH T S
+jouret(2) JH ER EH T
+journal JH ER N AH L
+journal's JH ER N AH L Z
+journalese JH ER N AH L IY Z
+journalism JH ER N AH L IH Z AH M
+journalism's JH ER N AH L IH Z AH M Z
+journalist JH ER N AH L AH S T
+journalist's JH ER N AH L IH S T S
+journalist(2) JH ER N AH L IH S T
+journalistic JH ER N AH L IH S T IH K
+journalistically JH ER N AH L IH S T IH K AH L IY
+journalistically(2) JH ER N AH L IH S T IH K L IY
+journalists JH ER N AH L AH S T S
+journalists' JH ER N AH L IH S T S
+journalists(2) JH ER N AH L IH S T S
+journalists(3) JH ER N AH L IH S S
+journalists(4) JH ER N AH L IH S
+journals JH ER N AH L Z
+journey JH ER N IY
+journeyed JH ER N IY D
+journeying JH ER N IY IH NG
+journeyman JH ER N IY M AE N
+journeyman's JH ER N IY M AH N Z
+journeys JH ER N IY Z
+joust JH AW S T
+jousting JH AW S T IH NG
+jovan JH OW V AH N
+jovanovic Y AH V AH N AA V IH K
+jovanovich JH OW V AE N AH V IH CH
+jovi JH OW V IY
+jovial JH OW V IY AH L
+jovian JH OW V IY AH N
+jovita Y AH V AY T AH
+jovito JH OW V IY T OW
+jowers JH AW ER Z
+jowett JH AW IH T
+jowl JH AW L
+jowley JH OW L IY
+jowls JH AW L Z
+jowly JH AW L IY
+joy JH OY
+joy's JH OY Z
+joyal JH OY AH L
+joyce JH OY S
+joyce's JH OY S IH Z
+joycelyn JH OY S L IH N
+joycelyn's JH OY S L IH N Z
+joye JH OY
+joyful JH OY F AH L
+joyfully JH OY F AH L IY
+joying JH OY IH NG
+joyner JH OY N ER
+joynes JH OY N Z
+joynt JH OY N T
+joyoni JH OY OW N IY
+joyous JH OY AH S
+joyride JH OY R AY D
+joyriding JH OY R AY D IH NG
+joys JH OY Z
+joystick JH OY S T IH K
+jozef JH OW Z AH F
+jozwiak Y AA Z V IY AE K
+jr JH UW N Y ER
+jr(2) JH EY AA R
+ju JH UW
+jua JH UW AH
+juan W AA N
+juan(2) HH W AA N
+juana W AA N AH
+juana(2) HH W AA N AH
+juang JH W AA NG
+juanita W AA N IY T AH
+juanita(2) JH UW AH N IY T AH
+juarez W AA R EH Z
+juarez(2) HH W AA R EH Z
+juarez-espin W AA R EH Z EH S P IH N
+juarez-espin(2) HH W AA R EH Z EH S P IH N
+juba JH UW B AH
+jubb JH AH B
+jubilant JH UW B AH L AH N T
+jubilation JH UW B AH L EY SH AH N
+jubilee JH UW B AH L IY
+juckett JH AH K IH T
+judah JH UW D AH
+judaism JH UW D EY IH Z AH M
+judaism's JH UW D EY IH Z AH M Z
+judaism's(2) JH UW D IY IH Z AH M Z
+judaism(2) JH UW D IY IH Z AH M
+judas JH UW D AH S
+juday JH UW D EY
+judd JH AH D
+judds JH AH D Z
+jude JH UW D
+jude's JH UW D Z
+judea JH UW D IY AH
+judeo JH UW D EY OW
+judge JH AH JH
+judge's JH AH JH IH Z
+judged JH AH JH D
+judgement JH AH JH M AH N T
+judgemental JH AH JH M EH N T AH L
+judgements JH AH JH M AH N T S
+judges JH AH JH IH Z
+judges' JH AH JH IH Z
+judgeship JH AH JH SH IH P
+judgeships JH AH JH SH IH P S
+judging JH AH JH IH NG
+judgment JH AH JH M AH N T
+judgmental JH AH JH M EH N T AH L
+judgmental(2) JH AH JH M EH N AH L
+judgments JH AH JH M AH N T S
+judi JH UW D IY
+judicate JH UW D IH K EY T
+judice JH UW D IH S
+judicial JH UW D IH SH AH L
+judicially JH UW D IH SH AH L IY
+judiciary JH UW D IH SH IY EH R IY
+judicious JH UW D IH SH AH S
+judiciously JH UW D IH SH IH S L IY
+judie JH AH D IY
+judishe JH UW D IY SH
+judith JH UW D AH TH
+judith(2) JH UW D IH TH
+juditha JH UW D IH TH AH
+judkins JH AH D K IH N Z
+judo JH UW D OW
+judsen JH AH D S AH N
+judson JH AH D S AH N
+judy JH UW D IY
+judy's JH UW D IY Z
+jue JH UW
+juedes JH W EH D EH S
+juedes(2) Y UW EH D EH S
+juel JH UW L
+juenemann Y UW N M AH N
+juenger Y UW NG G ER
+juergen Y ER G AH N
+juergen(2) JH ER G AH N
+juergens Y ER G AH N Z
+juergens(2) JH ER G AH N Z
+jueteng JH UW T EH NG
+juett JH UW T
+jug JH AH G
+juge JH UW JH
+juggernaut JH AH G ER N AO T
+juggle JH AH G AH L
+juggled JH AH G AH L D
+juggler JH AH G AH L ER
+juggler(2) JH AH G L ER
+jugglers JH AH G AH L ER Z
+jugglers(2) JH AH G L ER Z
+juggles JH AH G AH L Z
+juggling JH AH G AH L IH NG
+juggling(2) JH AH G L IH NG
+jugs JH AH G Z
+jugular JH UW G Y AH L ER
+juhas JH UW AH Z
+juhasz Y AH HH AH SH
+juhl JH AH L
+juhlin JH UW L IH N
+juhnke JH AH NG K
+juice JH UW S
+juices JH UW S AH Z
+juices(2) JH UW S IH Z
+juicier JH UW IH S Y ER
+juiciest JH UW S IY AH S T
+juicy JH UW S IY
+juilliard JH UW L IY AA R D
+jujitsu JH UW JH IH T S UW
+jujo JH UW JH OW
+juju JH UW JH UW
+juke JH UW K
+jukebox JH UW K B AA K S
+jukeboxes JH UW K B AA K S IH Z
+jukes JH UW K S
+juki JH UW K IY
+jule JH UW L
+julep JH UW L AH P
+juleps JH UW L AH P S
+jules JH UW L Z
+juli JH UW L IY
+julia JH UW L Y AH
+julia's JH UW L Y AH Z
+julian JH UW L IY AH N
+julian(2) JH UW L Y AH N
+juliana JH UW L IY AE N AH
+juliann JH UW L IY AE N
+juliann(2) JH UW L Y AH N
+julianne JH UW L IY EH N
+juliano JH UW L IY AA N OW
+julie JH UW L IY
+julie's JH UW L IY Z
+julien JH UW L IY AH N
+juliet JH UW L IY EH T
+julieta Y UW L IY T AH
+julietta JH UW L IY EH T AH
+juliette JH UW L IY EH T
+julin JH UW L IH N
+julina Y UW L IY N AH
+juline JH UW L AY N
+julio JH UW L IY OW
+julio(2) HH UW L IY OW
+julius JH UW L Y AH S
+juliusz JH UW L IY UW S
+julliard JH UW L IY AA R D
+julson JH AH L S AH N
+july JH UW L AY
+july's JH UW L AY Z
+july's(2) JH AH L AY Z
+july(2) JH AH L AY
+jumanji JH UW M AA N JH IY
+jumble JH AH M B AH L
+jumbled JH AH M B AH L D
+jumbo JH AH M B OW
+jumbos JH AH M B OW Z
+jumbotron JH AH M B OW T R AO N
+jumbotrons JH AH M B OW T R AO N Z
+jumonville ZH AH M AH N V IH L
+jumonville(2) JH UW M AH N V IH L
+jump JH AH M P
+jumped JH AH M P T
+jumper JH AH M P ER
+jumpers JH AH M P ER Z
+jumping JH AH M P IH NG
+jumps JH AH M P S
+jumpstart JH AH M P S T AA R T
+jumpstarts JH AH M P S T AA R T S
+jumpsuit JH AH M P S UW T
+jumpsuits JH AH M P S UW T S
+jumpy JH AH M P IY
+jun JH AH N
+junco JH AH NG K OW
+junction JH AH NG K SH AH N
+juncture JH AH NG K CH ER
+junctures JH AH NG K CH ER Z
+junda JH AH N D AH
+jundt JH AH N T
+june JH UW N
+june's JH UW N Z
+juneau JH UW N OW
+junejo JH UW N EY HH OW
+junek JH UW N IH K
+junella JH UW N EH L AH
+junes JH UW N Z
+junette JH UW N EH T
+jung Y UH NG
+jung's Y UH NG Z
+jungbluth JH AH NG B L UW TH
+junge JH AH NG
+jungels JH AH NG G AH L Z
+junger JH AH NG ER
+jungers JH AH NG ER Z
+junghans JH AH NG G AH N Z
+jungin JH AH N G IH N
+jungle JH AH NG G AH L
+jungles JH AH NG G AH L Z
+jungman JH AH NG M AH N
+jungwirth JH AH NG G W ER TH
+junia Y UW N IY AH
+juniata Y UW N IY AA T AH
+junine JH AH N IH N
+junior JH UW N Y ER
+junior's JH UW N Y ER Z
+juniors JH UW N Y ER Z
+juniper JH UW N AH P ER
+junipers JH UW N IH P ER Z
+junius JH UW N IY IH S
+junji JH AH N JH IY
+junk JH AH NG K
+junkbond JH AH NG K B AA N D
+junked JH AH NG K T
+junker JH AH NG K ER
+junket JH AH NG K IH T
+junkets JH AH NG K IH T S
+junkholder JH AH NG K HH OW L D ER
+junkholders JH AH NG K HH OW L D ER Z
+junkie JH AH NG K IY
+junkier JH AH NG K IY ER
+junkies JH AH NG K IY Z
+junkiest JH AH NG K IY AH S T
+junkin JH AH NG K IH N
+junking JH AH NG K IH NG
+junkins JH AH NG K IH N Z
+junky JH AH NG K IY
+junkyard JH AH NG K Y AA R D
+junkyards JH AH NG K Y AA R D Z
+juno JH UW N OW
+juno's JH UW N OW Z
+junod JH UW N AH D
+junot JH UW N AH T
+junta HH UH N T AH
+juntunen JH AH N T AH N AH N
+junwuxiyan JH AH N W UW K S IY AH N
+jupin JH UW P IH N
+jupiter JH UW P AH T ER
+jupiter's JH UW P AH T ER Z
+jupiter's(2) JH UW P IH T ER Z
+jupiter(2) JH UW P IH T ER
+juppe JH UW P IY
+jura JH UH R AH
+jura's JH UH R AH Z
+jurado Y UH R AA D OW
+juran Y UH R AA N
+juranek JH UH R AH N IH K
+juras JH UH R AH Z
+jurassic JH UH R AE S IH K
+jurczak Y ER CH AE K
+jurczyk Y ER CH IH K
+jure JH UH R
+jurek JH UH R EH K
+jurek(2) Y UH R EH K
+jurewicz JH UH R AH V IH CH
+jurewicz(2) Y UH R AH V IH CH
+jurgen JH ER G AH N
+jurgens JH ER G AH N Z
+jurgensen JH ER G IH N S AH N
+jurgensmeyer JH ER G AH N Z M AY R
+jurgenson JH ER G IH N S AH N
+jurica JH UH R IH K AH
+jurich JH UH R IH K
+juries JH UH R IY Z
+juries' JH UH R IY Z
+juris JH UH R IH S
+juris(2) Y UH R IH S
+jurisdiction JH UH R AH S D IH K SH AH N
+jurisdiction(2) JH UH R IH S D IH K SH AH N
+jurisdictional JH UH R AH S D IH K SH AH N AH L
+jurisdictions JH UH R IH S D IH K SH AH N Z
+jurisprudence JH UH R AH S P R UW D AH N S
+jurisprudential JH UH R AH S P R UW D EH N SH AH L
+jurisprudential(2) JH UH R AH S P R UW D EH N CH AH L
+jurist JH UH R AH S T
+jurist(2) JH UH R IH S T
+jurists JH UH R IH S T S
+jurists(2) JH UH R IH S S
+jurists(3) JH UH R IH S
+jurkiewicz Y ER K AH V IH CH
+jurkovich Y ER K AH V IH CH
+jurkowski Y ER K AO F S K IY
+jurney JH ER N IY
+juror JH UH R ER
+juror's JH UH R ER Z
+jurors JH UH R ER Z
+jurors' JH UH R ER Z
+jurs JH ER Z
+jury JH UH R IY
+jury's JH UH R IY Z
+jus JH UW
+jus(2) JH AH S
+jusco JH AH S K OW
+jusino Y UW S IY N OW
+just JH AH S T
+just(2) JH IH S T
+justa JH AH S T AH
+justa(2) JH IH S T AH
+justen JH AH S T AH N
+juster JH AH S T ER
+justesen JH AH S T IY Z AH N
+justice JH AH S T AH S
+justice's JH AH S T IH S IH Z
+justice(2) JH AH S T IH S
+justices JH AH S T AH S AH Z
+justices' JH AH S T IH S IH Z
+justices(2) JH AH S T IH S IH Z
+justifiable JH AH S T AH F AY AH B AH L
+justifiably JH AH S T AH F AY AH B L IY
+justification JH AH S T AH F AH K EY SH AH N
+justifications JH AH S T IH F IH K EY SH AH N Z
+justified JH AH S T AH F AY D
+justifies JH AH S T AH F AY Z
+justify JH AH S T AH F AY
+justifying JH AH S T AH F AY IH NG
+justin JH AH S T AH N
+justin's JH AH S T AH N Z
+justin's(2) JH AH S T IH N Z
+justin(2) JH AH S T IH N
+justina Y UW S T IY N AH
+justine JH AH S T IY N
+justiniano JH UW S T IY N IY AA N OW
+justino JH AH S T IY N OW
+justis Y UW S T IH S
+justiss Y UW S T IY S
+justly JH AH S T L IY
+justman JH AH S T M AH N
+justo JH AH S T OW
+justus JH AH S T AH S
+justy JH AH S T IY
+jut JH AH T
+jute JH UW T
+jutland JH AH T L AH N D
+jutras Y UW T R AA Z
+juts JH AH T S
+jutting JH AH T IH NG
+juul JH UW AH L
+juve JH UW V
+juvenile JH UW V AH N AH L
+juvenile's JH UW V AH N AH L Z
+juvenile's(2) JH UW V AH N AY L Z
+juvenile(2) JH UW V AH N AY L
+juveniles JH UW V AH N AH L Z
+juveniles(2) JH UW V AH N AY L Z
+juwan JH UW AA N
+juxtapose JH AH K S T AH P OW Z
+juxtaposed JH AH K S T AH P OW Z D
+juxtaposes JH AH K S T AH P OW Z IH Z
+juxtaposing JH AH K S T AH P OW Z IH NG
+juxtaposition JH AH K S T AH P AH Z IH SH AH N
+juxtapositions JH AH K S T AH P AH Z IH SH AH N Z
+jwan JH AH W AA N
+jyishane JH IY SH EY N
+jynx JH IH NG K S
+k K EY
+k's K EY Z
+k-mart K EY M AA R T
+k-mart's K EY M AA R T S
+k. K EY
+k.'s K EY Z
+ka K AA
+kaas K AA Z
+kaatz K AA T S
+kabart K AH B AA R T
+kabat K AE B AH T
+kabbah K AH B AH
+kabbalah K AH B AA L AH
+kabbani K AH B AA N IY
+kabel K AE B AH L
+kabi K AE B IY
+kabi(2) K AA B IY
+kabila K AH B IH L AH
+kabila's K AH B IH L AH Z
+kabivitrum K AH B IH V IH T R AH M
+kable K EY B AH L
+kabler K EY B AH L ER
+kabler(2) K EY B L ER
+kaboom K AH B UW M
+kabral K AH B R AA L
+kabuki K AH B UW K IY
+kabul K AA B UH L
+kacer K EY S ER
+kach K AE CH
+kachel K AE K AH L
+kachigian K AH SH IY G IY AH N
+kachigian(2) K AH SH IH G IY AH N
+kachmar K AE K M ER
+kachuck K AH CH AH K
+kachur K AE CH ER
+kackley K AE K L IY
+kaczmarczyk K AA CH M ER CH IH K
+kaczmarek K AH CH M AA R EH K
+kaczmarski K AH CH M AA R S K IY
+kaczor K AA CH ER
+kaczorowski K AH CH ER AO F S K IY
+kaczynski K AH CH IH N S K IY
+kaczynski's K AH CH IH N S K IY Z
+kaczynski's(2) K AH Z IH N S K IY Z
+kaczynski(2) K AH Z IH N S K IY
+kadar K AE D ER
+kadar(2) K AH D AA R
+kade K EY D
+kadel K AE D AH L
+kaden K EY D AH N
+kader K EY D ER
+kading K EY D IH NG
+kadish K EY D IH SH
+kadlec K AA D L IH K
+kadow K AA D OW
+kadrescu K AH D R EH S K Y UW
+kadrmas K AE D ER M AA Z
+kadumi K AH D UW M IY
+kady K EY D IY
+kaeding K EH D IH NG
+kaehler K EH L ER
+kael K EY L
+kaelin K EH L IH N
+kaelin's K EH L IH N Z
+kaercher K EH R K ER
+kaeser K EY Z ER
+kaestner K EH S T N ER
+kaetzel K EH T Z AH L
+kafelnikov K AH F EH L N IH K AO F
+kafelnikov(2) K AH F EH L N IH K AO V
+kafer K EY F ER
+kaffenberger K AE F AH N B ER G ER
+kafka K AA F K AH
+kafka's K AA F K AH Z
+kafkaesque K AA F K AH EH S K
+kagami K AE G AH M IY
+kagan K EY G AH N
+kagarlitsky K AE G ER L IH T S K IY
+kagawa K AH G AA W AH
+kage K EY JH
+kagel K EY G AH L
+kagey K EY JH IY
+kageyama K AA G IY AA M AH
+kagin K EY G IH N
+kagins K EY G IH N Z
+kagler K AE G L ER
+kagy K EY G IY
+kah K AA
+kahalani K AA HH AH L AA N IY
+kahan K AH HH AA N
+kahan's K AH HH AA N Z
+kahane K AH HH AA N EY
+kahane(2) K AH HH EY N
+kahl K AA L
+kahle K AA L
+kahler K AA L ER
+kahley K AA L IY
+kahn K AA N
+kahn's K AA N Z
+kahng K AA NG
+kahr K AA R
+kahr's K AA R Z
+kahre K EH R
+kahre(2) K AA R
+kahrs K AA R Z
+kahului K AH HH UW L W IY
+kahuna K AH HH UW N AH
+kai K AY
+kaifu K AY F UW
+kaigler K EY G L ER
+kail K EY L
+kailash K EY L AH SH
+kailua K AY L UW AH
+kaim K EY M
+kain K EY N
+kaine K EY N
+kainer K EY N ER
+kainz K EY N Z
+kairamo K EH R AA M OW
+kairey K EH R IY
+kaiser K AY Z ER
+kaiser's K AY Z ER Z
+kaiseraugst K AY Z ER AO G S T
+kaisertech K AY Z ER T EH K
+kaisertech's K AY Z ER T EH K S
+kaisha K EY SH AH
+kaji K AA JH IY
+kajima K AA JH IY M AH
+kajuahar K AH JH UW AH HH AA R
+kakadu K AA K AA D UW
+kakimoto K AA K IH M OW T OW
+kakos K EY K OW Z
+kaktovik K AE K T OW V IH K
+kakuei K AE K Y UW IY
+kakumaru K AA K UW M AA R UW
+kal K AE L
+kal(2) K EY EY EH L
+kalafut K AE L AH F AH T
+kalal K EY L AH L
+kalamazoo K AE L AH M AH Z UW
+kalan K EY L AH N
+kalas K AA L AH Z
+kalashnikov K AH L AE SH N IH K AA V
+kalata K AH L AA T AH
+kalb K AE L B
+kalbach K AE L B AA K
+kalberer K AE L B ER ER
+kalbfleisch K AE L B F L AY SH
+kale K EY L
+kaleel K AE L IY L
+kaleida K AH L AY D AH
+kaleidoscope K AH L AY D AH S K OW P
+kalen K EY L AH N
+kaler K EY L ER
+kaleta K AE L IH T AH
+kaley K EY L IY
+kalgoorlie K AE L G UW R L IY
+kalikow K AE L IH K OW
+kalil K AE L AH L
+kalin K AE L IH N
+kalina K AH L AY N AH
+kaliningrad K AH L IH N IH NG G R AE D
+kalinoski K AH L IH N AW S K IY
+kalinowski K AH L IH N AO F S K IY
+kalinske K AH L IH N S K IY
+kalinski K AH L IH N S K IY
+kalis K AE L IH S
+kalish K AE L IH SH
+kalispell K AE L IH S P EH L
+kalisz K AA L IH SH
+kaliszewski K AH L IH SH EH F S K IY
+kalivoda K AH L IH V OW D AH
+kalk K AO K
+kalka K AE L K AH
+kalkaska K AE L K AA S K AH
+kalkbrenner K AE L K B R IH N ER
+kall K AO L
+kalla K AE L AH
+kallal K AE L AH L
+kallam K AE L AH M
+kallas K AE L AH Z
+kallay K AE L EY
+kallen K AO L AH N
+kallenbach K AE L IH N B AA K
+kallenberger K AO L AH N B ER G ER
+kallhoff K AE L HH AO F
+kalliel K AE L IY AH L
+kallins K AE L IH N Z
+kallio K AE L IY OW
+kallis K AE L IH S
+kallman K AO L M AH N
+kallmeyer K AE L M AY ER
+kallstrom K AE L S T R AH M
+kallus K AE L AH S
+kalman K AE L M AH N
+kalmanovitz K AE L M AE N AH V IH T S
+kalmar K AE L M ER
+kalmbach K AE L M B AA K
+kalmus K AE L M IH S
+kalnins K AE L N IH N Z
+kalo K EY L OW
+kalok K AE L AA K
+kalous K AE L AH S
+kalp K AE L P
+kalt K AO L T
+kaltenbach K AE L T IH N B AA K
+kaltenbacher K AA L T AH N B AA K ER
+kalter K AO L T ER
+kalthoff K AE L TH
+kalugin K AH L UW G AH N
+kaluza K AH L UW Z AH
+kaluzny K AH L AH Z N IY
+kalvar K AE L V AA R
+kam K AE M
+kama K AA M AH
+kamakau K AA M AH K AA UW
+kamakau's K AA M AH K AA UW Z
+kamal K EY M AH L
+kamali K AH M AA L IY
+kaman K EY M AH N
+kamber K AE M B ER
+kamchatka K AE M CH AE T K AH
+kamchatka(2) K AA M CH AA T K AH
+kamehameha K AH M EY AH M EY AH
+kamehameha's K AH M EY AH M EY AH Z
+kamei K AE M IY
+kamei(2) K AA M EY
+kamel K AA M AH L
+kamen K AA M EH N
+kamen(2) K EY M EH N
+kamenar K AE M AH N ER
+kamens K AA M EH N Z
+kamens(2) K EY M EH N Z
+kamensky K AH M EH N S K IY
+kamentsev K AH M EH N T S AA V
+kamer K EY M ER
+kamerer K AE M ER ER
+kamikaze K AA M AH K AA Z IY
+kamin K AA M IY N
+kamin(2) K EY M IH N
+kamin(3) K AE M IH N
+kaminer K AE M IH N ER
+kamins K AE M IH N Z
+kamins(2) K EY M IH N Z
+kaminski K AH M IH N S K IY
+kaminsky K AH M IH N S K IY
+kamir K AH M IH R
+kamke K AE M K IY
+kamler K AE M AH L ER
+kamler(2) K AE M L ER
+kamm K AE M
+kamman K AE M AH N
+kammer K AE M ER
+kammerer K AE M ER ER
+kammerzell K AE M ER Z AH L
+kammeyer K AE M AY ER
+kamneva K AE M N EY V AH
+kamp K AE M P
+kamp's K AE M P S
+kampa K AE M P AH
+kampala K AH M P AA L AH
+kampe K AE M P
+kampelman K AE M P AH L M AH N
+kampen K AE M P AH N
+kamper K AE M P ER
+kampf K AE M P F
+kampfer K AE M P F ER
+kamphaus K AE M P HH AW S
+kampman K AE M P M AH N
+kampmann K AE M P M AH N
+kamps K AE M P S
+kampschulte K AE M P SH UH L T IY
+kamra K AE M R AH
+kamradt K AE M R AH T
+kamran K AE M R AH N
+kamrath K AE M R AH TH
+kamstra K AE M S T R AH
+kan K AE N
+kana K AE N AH
+kanade K AH N AA D EY
+kanady K AE N AH D IY
+kanagy K AE N AH JH IY
+kanai K AH N AY
+kanak K AE N AH K
+kanan K EY N AH N
+kanarek K AE N ER IH K
+kanawa K AA N AA W AH
+kanawha K AH N AO HH AH
+kanazawa K AA N AA Z AA W AH
+kanda K AE N D AH
+kandahar K AE N D AH HH AA R
+kandel K AE N D AH L
+kandler K AE N D L ER
+kandt K AE N T
+kane K EY N
+kane's K EY N Z
+kaneb K AE N AH B
+kanegsberg K AE N AH G Z B ER G
+kaneko K AA N EY K OW
+kanell K AH N EH L
+kanell(2) K AE N AH L
+kanemaru K AE N EH M AA R UW
+kanemaru's K AA N EY M AA R UW Z
+kaner K EY N ER
+kaneshiro K AA N EY SH IH R OW
+kaney K EY N IY
+kang K AE NG
+kang(2) K AA NG
+kangaroo K AE NG G ER UW
+kangaroos K AE NG G ER UW Z
+kangas K AE NG G AH Z
+kanghua K AE NG HH Y UW AH
+kangyo K AE N JH Y OW
+kania K AA N IY AH
+kaniewski K AA N IY EH F S K IY
+kaniewski(2) K AA N IY UW S K IY
+kanipe K AE N IH P
+kanis K AE N IH S
+kanitz K AE N IH T S
+kanji K AE N JH IY
+kanjorski K AH N JH AO R S K IY
+kanka K AE N K AH
+kanka(2) K AE NG K AH
+kankakee K AE NG K IH K IY
+kankaku K AA N K AA K UW
+kann K AE N
+kannan K AA N AH N
+kanne K AE N
+kannenberg K AE N AH N B ER G
+kanner K AE N ER
+kanno K AE N OW
+kano K AA N OW
+kanode K AH N OW D
+kanon K EY N AH N
+kanouse K AA N OW UW S EY
+kansai K AE N S AY
+kansallis K AE N S AE L IH S
+kansan K AE N Z AH N
+kansan's K AE N Z AH N Z
+kansans K AE N Z AH N Z
+kansans' K AE N Z AH N Z
+kansas K AE N Z AH S
+kansas' K AE N Z AH S
+kansas's K AE N Z AH S IH Z
+kansas-city K AE N Z AH S IH T IY
+kansas-city(2) K AE N Z AH S S IH T IY
+kansian K AE N Z IY AH N
+kant K AE N T
+kanter K AE N T ER
+kanter's K AE N T ER Z
+kantian K AE N T IY AH N
+kantle K AE N T AH L
+kantner K AE N T N ER
+kantola K AH N T OW L AH
+kantor K AE N T ER
+kantor's K AE N T ER Z
+kantor's(2) K AE N T AO R Z
+kantrowitz K AE N T R AH W IH T S
+kantz K AE N T S
+kanz K AE N Z
+kanzi K AA N Z IY
+kanzler K AE N Z L ER
+kao K AW
+kao(2) K EY OW
+kaohsiung K EY OW S IY AH NG
+kaolin K AW L IH N
+kaolin(2) K EY OW L IH N
+kaori K AO R IY
+kapaun K AE P AW N
+kapfer K AE P F ER
+kapinos K AE P IH N OW Z
+kapinos(2) K AE P IY N OW Z
+kapitan K AE P IH T AH N
+kaplain K AE P L AH N
+kaplain's K AE P L AH N Z
+kaplan K AE P L AH N
+kaplan's K AE P L AH N Z
+kapler K EY P AH L ER
+kapler(2) K EY P L ER
+kaplin K AE P L IH N
+kaplow K AE P L OW
+kaplowitz K AA P L AH W IH T S
+kapner K AE P N ER
+kapnick K AE P N IH K
+kapoor K AH P UW R
+kapor K EY P ER
+kaposi K AH P OW S IY
+kaposi's K AH P OW S IY Z
+kapp K AE P
+kappa K AE P AH
+kappel K AE P AH L
+kappeler K AE P AH L ER
+kappelman K AE P AH L M AH N
+kapper K AE P ER
+kappes K AE P S
+kappler K AE P L ER
+kappus K AE P AH S
+kapral K AE P R AH L
+kaprayoon K AE P R AH Y UW N
+kaps K AE P S
+kapton K AE P T AH N
+kaptur K AE P T ER
+kapur K AE P ER
+kapuscinski K AH P AH S CH IH N S K IY
+kapusta K AH P AH S T AH
+kara K EH R AH
+karabakh K EH R AH B AE K
+karabin K AA R AA B IY N
+karach K AE R AH CH
+karachi K AA R AA CH IY
+karadzic K AA R AA JH IH K
+karadzic's K AA R AA JH IH K S
+karaffa K AE R AH F AH
+karajan K EH R AH JH AH N
+karakos K AA R AH K AO S
+karam K AE R AH M
+karami K ER AA M IY
+karan K EH R AH N
+karan's K EH R AH N Z
+karanicki K EH R AH N IH K IY
+karanitski K EH R AH N IH T S K IY
+karaoke K EH R IY OW K IY
+karas K AA R AH Z
+karasawa K AA R AH S AA W AH
+karasek K ER AA S EH K
+karasik K ER AA S IH K
+karat K EH R AH T
+karate K ER AA T IY
+karatirm K ER AH T ER M
+karatsu K ER AE T S UW
+karatz K EH R AH T S
+karban K AA R B AH N
+karbassioun K AA R B AE S IY UW N
+karber K AA R B ER
+karbowski K ER B AO F S K IY
+karch K AA R K
+karcher K AA R CH ER
+karcz K AA R CH
+karczewski K ER CH EH F S K IY
+kardashian K AA D AH SH EY N
+kardashian's K AA D AH SH EY N Z
+kardell K AA R D AH L
+kardos K AA R D OW Z
+kareem K ER IY M
+kareem's K ER IY M Z
+karel K EH R AH L
+karelian K ER IY L IY AH N
+karels K EH R AH L Z
+karema K AH R EH M AH
+karema's K AH R EH M AH Z
+karen K EH R AH N
+karen's K EH R AH N Z
+karenina K EH R EH N IY N AH
+karenina(2) K AH R EH N IH N AH
+karet K EH R AH T
+karg K AA R G
+karger K AA R G ER
+karges K AA R JH IH Z
+kargonaov K AA R G AH N AO V
+kari K EH R IY
+karibu K EH R IY B UW
+karim K ER IY M
+karimi K AA R IY M IY
+karin K EH R IH N
+karino K EH R IY N OW
+kariotis K AA R IY OW T IH S
+karis K EH R IY Z
+karl K AA R L
+karl's K AA R L Z
+karla K AA R L AH
+karle K AA R AH L
+karlen K AA R L AH N
+karlheinz K AA R L HH AY N Z
+karlik K AA R L IH K
+karlin K AA R L IH N
+karline K AA R L AY N
+karlow K AA R L OW
+karls K AA R L Z
+karlsen K AA R L S AH N
+karlson K AA R L S AH N
+karlsruhe K AA R L Z R UW
+karlsson K AA R L S AH N
+karma K AA R M AH
+karman K AA R M AH N
+karn K AA R N
+karnal K AA R N AH L
+karner K AA R N ER
+karnes K AA R N Z
+karney K AA R N IY
+karnicki K AA R N IH K IY
+karnow K AA R N OW
+karnow(2) K AA R N AW
+karns K AA R N Z
+karnsund K AA R N S AH N D
+karol K EH R AO L
+karolina K EH R AH L AY N AH
+karoline K EH R AH L AY N
+karolinska K EH R OW L IH N S K AH
+karoly K ER OW L IY
+karolyi K ER OW L Y IY
+karolyn K AE R AH L IH N
+karon K EH R AH N
+karos K AA R OW S
+karoun K ER UW N
+karow K AA R OW
+karp K AA R P
+karpatkin K AA R P AE T K IH N
+karpel K AA R P AH L
+karpen K AA R P AH N
+karpf K AA R P F
+karpinski K ER P IH N S K IY
+karpov K AA R P AA V
+karpowicz K AA R P AH V IH CH
+karr K AA R
+karraker K AA R AH K ER
+karras K AE R AH Z
+karren K AE R AH N
+karrer K AA R ER
+karrick K AE R IH K
+karriker K AE R IH K ER
+karry K EH R IY
+karsh K AA R SH
+karshner K AA R SH N ER
+karson K AA R S AH N
+karst K AA R S T
+karstadt K AA R S T AE T
+karsten K AA R S T AH N
+karstens K AA R S T AH N Z
+karstetter K AA R S T IH T ER
+kartasasmita K AA R T AE S AH S M IY T AH
+kartchner K AA R CH N ER
+karter K AA R T ER
+kartes K AA R T S
+karun K ER UW N
+karvonen K AA R V AH N AH N
+karwoski K ER V AW S K IY
+karwowski K ER V AO F S K IY
+kary K EH R IY
+karydakis K EH R IY D AE K IH S
+karyn K AE R IH N
+kasabian K AH S EY B IY AH N
+kasagic K AH S AA G IH K
+kasal K EY S AH L
+kasbrol K AE Z B R AO L
+kasbrols K AE Z B R AO L Z
+kasch K AE SH
+kaschak K AE SH AH K
+kasdorf K AE S D AO R F
+kase K EY Z
+kasel K AE S AH L
+kasell K AE S AH L
+kaseman K EY S M AH N
+kaser K EY Z ER
+kasese K AH S IY Z IY
+kasey K AE S IY
+kash K AE SH
+kasha K AA SH AH
+kashiwagi K AE SH IH W AE G IY
+kashiwahara K AA SH IY W AH HH AA R AH
+kashiwahara's K AA SH IY W AH HH AA R AH Z
+kashiyama K AA SH IY Y AA M AH
+kashmir K AE SH M IH R
+kashmir(2) K AE SH M IY R
+kashmiri K AE SH M IY R IY
+kashner K AE SH N ER
+kashoggi K AH SH AA JH IY
+kashuba K AH SH UW B AH
+kasi K AA Z IY
+kasich K AA S IH CH
+kasich's K AA S IH CH IH Z
+kasick K AA S IH K
+kasik K AA S IH K
+kasinga K AH S IH NG G AH
+kasinga's K AH S IH NG G AH Z
+kasinger K AE S IH N JH ER
+kaska K AA S K AH
+kaske K AE S K IY
+kaskel K AE S K AH L
+kasler K AE S AH L ER
+kasler(2) K AE S L ER
+kasmer K AE S AH M ER
+kasmira K AH S M AY R AH
+kasner K AE S N ER
+kaspar K AE S P ER
+kasparek K AE S P ER IH K
+kasparian K AH S P EH R IY AH N
+kasparov K AE S P ER AA V
+kasparov(2) K AH S P AA R AA V
+kasper K AE S P ER
+kasperek K AE S P ER IH K
+kasperski K AH S P ER S K IY
+kasprowicz K AA S P R AH V IH CH
+kasprzak K AA S P ER Z AH K
+kasprzyk K AA S P ER Z IH K
+kasputys K AE S P Y UW T IH S
+kasriel K AE S R IY AH L
+kass K AE S
+kassa K AE S AH
+kassab K AE S AH B
+kassan K AE S AH N
+kassar K AE S ER
+kassebaum K AE S AH B AW M
+kassebaum's K AE S AH B AW M Z
+kassebaum's(2) K AE S AH B AA M Z
+kassebaum(2) K AE S AH B AA M
+kassel K AE S AH L
+kassem K AE S AH M
+kassen K AE S AH N
+kassin K AE S IH N
+kassing K AE S IH NG
+kassis K AE S IH S
+kassler K AE S L ER
+kassner K AE S N ER
+kasson K AE S AH N
+kast K AE S T
+kastel K EY S T AH L
+kastelic K AH S T EH L IH K
+kasten K AE S T AH N
+kastenmeier K AE S T AH N M AY R
+kastens K EY S AH N Z
+kaster K AE S T ER
+kastl K AE S T AH L
+kastle K AE S AH L
+kastler K AE S T L ER
+kastner K AE S T N ER
+kasun K AA S UW N
+kasza K AA SH AH
+kaszuba K AH SH UW B AH
+kat K AE T
+kataoka K AA T AA OW K AH
+katarina K AA T ER IY N AH
+katarina's K AA T ER IY N AH Z
+katashiba K AE T AH SH IY B AH
+katayama K AA T AA Y AA M AH
+katayan K AA T AH Y AA N
+katcher K AE CH ER
+kate K EY T
+kate's K EY T S
+katen K EY T AH N
+kater K EY T ER
+kates K EY T S
+katey K EY T IY
+kath K AE TH
+katha K AE TH AH
+kathalene K AE TH AH L IY N
+kathan K AE TH AH N
+katharina K AE TH EH R IY N AH
+katharine K AE TH R IH N
+katherine K AE TH ER IH N
+katherine(2) K AE TH R IH N
+kathi K AE TH IY
+kathie K AE TH IY
+kathleen K AE TH L IY N
+kathleen's K AE TH L IY N Z
+kathlene K AE TH L IY N
+kathline K AE TH L AY N
+kathman K AE TH M AH N
+kathryn K AE TH R IH N
+kathy K AE TH IY
+kathy's K AE TH IY Z
+kati K EY T IY
+katia K AA T IY AH
+katie K EY T IY
+katja K AA T Y AH
+katmandu K AE T M AE N D UW
+kato K EY T OW
+kato's K EY T OW Z
+katona K AA T OW N AH
+katragadda K AA T R AH G AA D AH
+katrina K AH T R IY N AH
+kats K AE T S
+katsanos K AE T S AA N OW S
+katsaros K AE T S ER OW Z
+katsuhiko K AA T S UW HH IY K OW
+katsumi K AA T S UW M IY
+katsushi K AE T S UW SH IY
+katt K AE T
+kattner K AE T N ER
+katuni K AH T UW N IY
+katy K EY T IY
+katya K AA T Y AH
+katydid K EY T IY D IH D
+katyn K EY T IH N
+katyn(2) K EY T AH N
+katyn(3) K AH T IY N
+katyusha K AH T Y UW SH AH
+katyushas K AH T Y UW SH AH Z
+katz K AE T S
+katzen K AE T Z AH N
+katzenbach K AE T S AH N B AA K
+katzenberg K AE T S AH N B ER G
+katzenberg's K AE T S AH N B ER G Z
+katzenberger K AE T Z AH N B ER G ER
+katzenstein K AE T S AH N S T AY N
+katzenstein(2) K AE T S AH N S T IY N
+katzer K AE T S ER
+katzin K AE T S IH N
+katzman K AE T S M AH N
+kau K AW
+kauai K AW AY
+kauble K AO B AH L
+kaucher K AW K ER
+kauer K AW ER
+kaufer K AO F ER
+kauffman K AO F M AH N
+kauffmann K AO F M AH N
+kaufhof K AO F HH AO F
+kaufhold K AW F HH OW L D
+kaufman K AO F M AH N
+kaufman's K AO F M AH N Z
+kaufmann K AO F M AH N
+kauk K AO K
+kaul K AO L
+kaumography K OW M AA G R AH F IY
+kaunakakai K AW N AH K AH K AY
+kaunda K AO N D AH
+kaup K AO P
+kaupp K AO P
+kauppi K AO P IY
+kaus K AO Z
+kausch K AW SH
+kauth K AO TH
+kautz K AO T S
+kautzman K AW T S M AH N
+kauzlarich K AW Z L ER IH K
+kavan K EY V AH N
+kavanagh K AE V AH N AO
+kavanaugh K AE V AH N AO
+kaveney K AE V IH N IY
+kavner K AE V N ER
+kavner(2) K AO V N ER
+kawa K AA W AH
+kawaguchi K AA W AA G UW CH IY
+kawahara K AA W AA HH AA R AH
+kawai K AA W AA IY
+kawakami K AA W AA K AA M IY
+kawamoto K AA W AA M OW T OW
+kawamura K AW AA M UH R AH
+kawano K AA W AA N OW
+kawasaki K AA W AA S AA K IY
+kawashima K AA W AA SH IY M AH
+kawasmi K AH W AA S M IY
+kawate K AA W AA T EY
+kawecki K AA V EH T S K IY
+kaweske K AA V EH S K IY
+kaweske(2) K AH W EH S K IY
+kay K EY
+kay's K EY Z
+kaya K AA Y AH
+kayak K AY AE K
+kayaker K AY AE K ER
+kayakers K AY AE K ER Z
+kayaking K AY AE K IH NG
+kayaks K AY AE K S
+kayapo K AY AH P OW
+kaydon K EY D AH N
+kaye K EY
+kayes K EY Z
+kayla K EY L AH
+kaylie K EY L IY
+kaylor K EY L ER
+kaylynn K EY L IH N
+kayne K EY N
+kayo K EY OW
+kaypro K EY P R OW
+kays K EY Z
+kayser K EY Z ER
+kaysersberg K AY Z ER Z B ER G
+kayvon K EY V AA N
+kazakh K AE Z AE K
+kazakhs K AE Z AE K S
+kazakhstan K AA Z AA K S T AA N
+kazakhstan's K AA Z AA K S T AA N Z
+kazakhstan's(2) K AH Z AE K S T AE N Z
+kazakhstan(2) K AH Z AE K S T AE N
+kazakhstana K AA Z AA K S T AA N AH
+kazakhstana(2) K AH Z AE K S T AE N AH
+kazan K EY Z AH N
+kazanjian K AH Z AE N JH IY AH N
+kazarian K AH Z EH R IY AH N
+kazarian's K AH Z EH R IY AH N Z
+kazda K AA Z D AH
+kazee K AA Z IY
+kazempour K AH Z EH M P AW R
+kazen K AE Z AH N
+kazikaev K AE Z IH K EY V
+kazin K EY Z IH N
+kazis K AE Z IH S
+kazlauskas K AE Z L AW S K AH Z
+kazmer K AE Z M ER
+kazmierczak K AA Z M IH R CH AE K
+kazmierski K AH Z M IH R S K IY
+kazoo K AH Z UW
+kazuhiko K AA Z UW HH IY K OW
+kazunori K AE Z AH N OW R IY
+kazuo K AA Z UW OW
+kcal K EY K AA L
+kcop K EY K AO P
+kea K IY
+keach K IY CH
+keadle K IY D AH L
+keady K IY D IY
+keagan K IY G AH N
+keagle K IY G AH L
+keagy K IY JH IY
+keahey K IY HH IY
+keal K IY L
+kealey K IY L IY
+kealy K IY L IY
+kean K IY N
+kean's K IY N Z
+keane K IY N
+keaney K IY N IY
+keanu K IY AA N UW
+keanu(2) K EY AA N UW
+kear K IH R
+kearby K ER B IY
+kearfott K IH R F AA T
+kearley K ER L IY
+kearn K ER N
+kearney K ER N IY
+kearney's K ER N IY Z
+kearns K ER N Z
+kearny K ER N IY
+kearsarge K IY R S AA R JH
+kearse K ER S
+keary K IH R IY
+keas K IY Z
+keasler K IY Z L ER
+keasling K IY Z L IH NG
+keast K IY S T
+keath K IY TH
+keathley K IY TH L IY
+keathley's K IY TH L IY Z
+keating K IY T IH NG
+keating's K IY T IH NG Z
+keatley K IY T L IY
+keaton K IY T AH N
+keator K IY T ER
+keats K IY T S
+keatts K IY T S
+keaveney K IY V IH N IY
+keaveny K IY V IH N IY
+keay K IY IY
+kebab-n-kurry K IH B AA B AH N K ER IY
+keck K EH K
+keckler K EH K L ER
+kedar K IY D ER
+keddy K EH D IY
+kedo K EH D OW
+kedrowski K IH D R AO F S K IY
+keds K EH D Z
+kedzierski K IH JH IH R S K IY
+kee K IY
+kee's K IY Z
+keeble K IY B AH L
+keebler K IY B L ER
+keech K IY CH
+keedy K IY D IY
+keef K IY F
+keefe K IY F
+keefer K IY F ER
+keeffe K IY F
+keegali K IY G AA L IY
+keegali's K IY G AA L IY Z
+keegan K IY G AH N
+keehan K IY AH N
+keehn K IY N
+keehner K IY N ER
+keel K IY L
+keelan K IY L AH N
+keele K IY L
+keeler K IY L ER
+keeley K IY L IY
+keelin K IY L IH N
+keeling K IY L IH NG
+keels K IY L Z
+keelson K EH L S AH N
+keely K IY L IY
+keen K IY N
+keena K IY N AH
+keenan K IY N AH N
+keene K IY N
+keeneland K IY N AH L AH N D
+keener K IY N ER
+keenest K IY N AH S T
+keeney K IY N IY
+keenly K IY N L IY
+keenum K IY N AH M
+keeny K IY N IY
+keep K IY P
+keeper K IY P ER
+keepers K IY P ER Z
+keeping K IY P IH NG
+keeps K IY P S
+keepsake K IY P S EY K
+keepsakes K IY P S EY K S
+keeran K IH R AH N
+kees K IY Z
+keese K IY Z
+keesee K IY S IY
+keesey K IY S IY
+keesler K IY Z L ER
+keesling K IY Z L IH NG
+keetch K IY CH
+keeter K IY T ER
+keeth K IY TH
+keeton K IY T AH N
+keever K IY V ER
+keevil K IY V AH L
+keezer K IY Z ER
+kefauver K EH F AW V ER
+keffer K EH F ER
+keg K EH G
+kegel K EH JH AH L
+kegg K EH G
+kegler K EH G L ER
+kegley K EH G L IY
+kegs K EH G Z
+kehl K EH L
+kehler K EH L ER
+kehm K EH M
+kehn K EH N
+kehne K EH N
+kehoe K EH HH OW
+kehr K EH R
+kehrer K EH R ER
+kehres K EH R Z
+keicher K AY K ER
+keidanren K AY D AE N R AH N
+keidel K AY D AH L
+keifer K IY F ER
+keiffer K IY F ER
+keigley K IY G L IY
+keiichi K EY IY CH IY
+keiji K IY JH IY
+keiko K EY K OW
+keil K IY L
+keillor K IY L ER
+keillor's K IY L ER Z
+keilman K AY L M AH N
+keim K IY M
+keimig K IY M IH G
+keinath K AY N AH TH
+keiner K IY N ER
+keio K EY OW
+keiper K IY P ER
+keir K IY R
+keiretsu K IH R EH T S UW
+keirn K IH R N
+keirns K AY R N Z
+keirsey K IH R S IY
+keisei K AY S EY
+keiser K AY S ER
+keisler K AY S AH L ER
+keisler(2) K AY S L ER
+keisling K AY S AH L IH NG
+keisling(2) K AY S L IH NG
+keister K IY IH S T ER
+keisuke K EY S UW K IY
+keitel K AY T AH L
+keiter K IY T ER
+keith K IY TH
+keith's K IY TH S
+keithley K IY TH L IY
+keithly K IY TH L IY
+keitt K IY T
+keitz K IY T S
+keizai K IY Z EY
+keizer K AY Z ER
+keizer(2) K IY Z ER
+kekst K EH K S T
+kelbaugh K EH L B AO
+kelber K EH L B ER
+kelberg K EH L B ER G
+kelberg's K EH L B ER G Z
+kelby K EH L B IY
+kelcey K EH L S IY
+kelch K EH L CH
+kelchner K EH L K N ER
+kelda K EH L D AH
+kelder K EH L D ER
+keleher K EH L IH HH ER
+keleman K IY L M AH N
+kelemen K IY L M EH N
+kelker K EH L K ER
+kell K EH L
+kellam K EH L AH M
+kellams K EH L AH M Z
+kellan K EH L AH N
+kellar K EH L ER
+kelleher K EH L IH HH ER
+kellems K EH L IH M Z
+kellen K EH L AH N
+kellenberger K EH L AH N B ER G ER
+kellenyi K EH L EH N Y IY
+keller K EH L ER
+keller's K EH L ER Z
+kellerman K EH L ER M AH N
+kellermann K EH L ER M AH N
+kellett K EH L IH T
+kelley K EH L IY
+kelley's K EH L IY Z
+kelley(2) OW K EH L IY
+kelli K EH L IY
+kelli's K EH L IY Z
+kellie K EH L IY
+kelliher K EH L IH HH ER
+kelling K EH L IH NG
+kellis K EH L IH S
+kellison K EH L IH S AH N
+kellman K EH L M AH N
+kellner K EH L N ER
+kellogg K EH L AO G
+kellogg's K EH L AO G Z
+kelloggs K EH L AO G Z
+kellough K EH L AW
+kellow K EH L OW
+kells K EH L Z
+kellum K EH L AH M
+kellwood K EH L W UH D
+kelly K EH L IY
+kelly's K EH L IY Z
+kellyanne K EH L IY AE N
+kellys K EH L IY Z
+kelm K EH L M
+kelman K EH L M AH N
+kelner K EH L N ER
+kelnhofer K EH L N HH AH F ER
+kelp K EH L P
+kelps K EH L P S
+kelsall K EH L S AH L
+kelsay K EH L S EY
+kelsch K EH L SH
+kelsey K EH L S IY
+kelso K EH L S OW
+kelso's K EH L S OW Z
+kelsoe K EH L S OW
+kelson K EH L S AH N
+kelter K EH L T ER
+kelting K EH L T IH NG
+keltner K EH L T N ER
+kelton K EH L T AH N
+kelty K EH L T IY
+keltz K EH L T S
+kelvan K EH L V AH N
+kelven K EH L V AH N
+kelvin K EH L V AH N
+kelvin's K EH L V IH N Z
+kelvin(2) K EH L V IH N
+kem K EH M
+kemal K AH M AA L
+kembel K EH M B AH L
+kemble K EH M B AH L
+kemeny K EH M IH N IY
+kemerer K EH M ER ER
+kemery K EH M ER IY
+kemler K EH M L ER
+kemmer K EH M ER
+kemmerer K EH M ER ER
+kemmerling K EH M ER L IH NG
+kemmons K EH M AH N Z
+kemner K EH M N ER
+kemnitz K EH M N IH T S
+kemp K EH M P
+kemp's K EH M P S
+kempa K EH M P AH
+kempe K EH M P
+kempel K EH M P AH L
+kempen K EH M P AH N
+kemper K EH M P ER
+kemper's K EH M P ER Z
+kempf K EH M P F
+kempfer K EH M P F ER
+kempke K EH M P K
+kempker K EH M P K ER
+kemple K EH M P AH L
+kempler K EH M P L ER
+kemplin K EH M P L IH N
+kempner K EH M P N ER
+kemppainen K EH M P AY N AH N
+kempski K EH M P S K IY
+kempson K EH M P S AH N
+kempster K EH M P S T ER
+kempthorne K EH M P TH AO R N
+kempton K EH M P T AH N
+kemron K EH M R AH N
+ken K EH N
+ken's K EH N Z
+kenaf K EH N AE F
+kenagy K EH N AH JH IY
+kenai K IY N AY
+kenan K IY N AH N
+kendal K EH N D AH L
+kendall K EH N D AH L
+kendall's K EH N D AH L Z
+kendavis K EH N D EY V IH S
+kendell K EH N D AH L
+kender K EH N D ER
+kendig K EH N D IH G
+kendle K EH N D AH L
+kendra K EH N D R AH
+kendrick K EH N D R IH K
+kendricks K EH N D R IH K S
+kendzierski K IH N JH IH R S K IY
+kendzior K IH N JH IY ER
+kenealy K EH N IY AH L IY
+keneer K AH N IY R
+kenefick K EH N IH F IH K
+kenerson K EH N ER S AH N
+kenesset K EH N EH S EH T
+kenesset(2) K N EH S EH T
+kenetech K EH N IH T EH K
+kenfield K EH N F IY L D
+kenichi K EH N IY CH IY
+kenilworth K EH N AH L W ER TH
+kenison K EH N IH S AH N
+keniston K EH N IH S T AA N
+kenji K EH N JH IY
+kenkel K EH NG K AH L
+kenley K EH N L IY
+kenmare K EH N M EH R
+kenmore K EH N M AO R
+kenn K EH N
+kenna K EH N AH
+kennamer K EH N AH M ER
+kennametal K EH N AH M EH T AH L
+kennan K EH N AH N
+kennard K EH N ER D
+kenneally K EH N AH L IY
+kennebeck K EH N B EH K
+kennebrew K EH N IH B R UW
+kennebunkport K EH N AH B AH NG K P AO R T
+kennecott K EH N AH K AA T
+kennedy K EH N AH D IY
+kennedy's K EH N AH D IY Z
+kennedys K EH N AH D IY Z
+kennedys' K EH N AH D IY Z
+kennel K EH N AH L
+kennell K EH N AH L
+kennelly K EH N AH L IY
+kennels K EH N AH L Z
+kennemer K EH N IY M ER
+kennemore K EH N M AO R
+kenner K EH N ER
+kenner's K EH N ER Z
+kennerly K EH N ER L IY
+kennerson K EH N ER S AH N
+kennesaw K EH N AH S AO
+kenneth K EH N IH TH
+kennett K EH N AH T
+kenney K EH N IY
+kenning K EH N IH NG
+kennington K EH N IH NG T AH N
+kennison K EH N IH S AH N
+kennon K EH N AH N
+kenny K EH N IY
+keno K IY N OW
+kenosha K IH N OW SH AH
+kenoyer K EH N OY ER
+kenrick K EH N R IH K
+kensinger K EH N S IH N JH ER
+kensington K EH N Z IH NG T AH N
+kensler K EH N S AH L ER
+kensler(2) K EH N S L ER
+kent K EH N T
+kent's K EH N T S
+kente K EH N T EY
+kentner K EH N T N ER
+kenton K EH N T AH N
+kentuckian K EH N T AH K IY AH N
+kentuckians K EH N T AH K IY AH N Z
+kentucky K AH N T AH K IY
+kentucky's K AH N T AH K IY Z
+kenward K EH N W ER D
+kenway K EH N W EY
+kenwood K EH N W UH D
+kenworth K EH N W ER TH
+kenworthy K EH N W ER DH IY
+kenya K EH N Y AH
+kenya's K EH N Y AH Z
+kenya's(2) K IY N Y AH Z
+kenya(2) K IY N Y AH
+kenyan K EH N Y AH N
+kenyan(2) K IY N Y AH N
+kenyans K EH N Y AH N Z
+kenyans(2) K IY N Y AH N Z
+kenyen K EH N Y AH N
+kenyon K EH N Y AH N
+kenzie K EH N Z IY
+kenzo K EH N Z OW
+keo K IY OW
+keogh K IY OW
+keogh(2) K IY AW G
+keohane K IY AH HH EY N
+keokuk K IY OW K AH K
+keokuk(2) K IY OW K UH K
+keough K IY OW
+keough(2) K IY AW G
+keown K IY OW N
+kepco K EH P K OW
+kephart K EH F AA R T
+kepler K EH P L ER
+kepley K EH P L IY
+keplinger K EH P AH L IH NG ER
+keplinger(2) K EH P L IH NG ER
+kepner K EH P N ER
+kepp K EH P
+keppel K EH P AH L
+kepple K EH P AH L
+keppler K EH P L ER
+kept K EH P T
+kept(2) K AE P T
+ker K ER
+kera K EH R AH
+kerala K EH R AA L AH
+keranen K EH R AH N AH N
+keratin K EH R AH T AH N
+keratin(2) K EH R AH T IH N
+keratoconus K EH R AH T AH K OW N AH S
+keratotomy K EH R AH T AO T AH M IY
+kerb K ER B
+kerbel K ER B AH L
+kerber K ER B ER
+kerbow K ER B OW
+kerbs K ER B Z
+kerby K ER B IY
+kerce K ER S
+kercher K ER K ER
+kercheval K ER CH IH V AH L
+kerchief K ER CH AH F
+kerchiefs K ER CH AH F S
+kerchner K ER K N ER
+kerekes K EH R IH K S
+kerestes K EH R IH S T S
+keresztes K EH R AH S T IY Z
+kerfoot K ER F UH T
+kerfuffle K ER F AH F AH L
+kerien K EH R IY AH N
+kerin K EH R IH N
+kerins K EH R IH N Z
+kerker K ER K ER
+kerkhoff K ER K HH AO F
+kerkman K ER K M AH N
+kerkorian K ER K AO R IY AH N
+kerkorian's K ER K AO R IY AH N Z
+kerl K ER L
+kerley K ER L IY
+kerlin K ER L IH N
+kerman K ER M AH N
+kermit K ER M IH T
+kern K ER N
+kern's K ER N Z
+kernaghan K ER N AE G HH AH N
+kernan K ER N AH N
+kernel K ER N AH L
+kernels K ER N AH L Z
+kernen K ER N AH N
+kerner K ER N ER
+kernes K ER N Z
+kerney K ER N IY
+kernigan K ER N AH G AH N
+kernite K ER N AY T
+kernodle K ER N OW D AH L
+kerns K ER N Z
+kerosene K EH R AH S IY N
+kerouac K EH R UW AE K
+kerpedjiev K ER P EH JH IY EH V
+kerper K ER P ER
+kerr K ER
+kerrey K EH R IY
+kerrey's K EH R IY Z
+kerri K EH R IY
+kerrick K EH R IH K
+kerridge K EH R IH JH
+kerrigan K EH R IH G AH N
+kerrigan's K EH R IH G AH N Z
+kerrville K ER V IH L
+kerry K EH R IY
+kerry's K EH R IY Z
+kersch K ER SH
+kerscher K ER SH ER
+kerschner K ER SH N ER
+kersee K ER S IY
+kersey K ER S IY
+kersh K ER SH
+kershaw K ER SH AA
+kershner K ER SH N ER
+kerst K ER S T
+kerstein K ER S T AY N
+kerstein(2) K ER S T IY N
+kersten K ER S T AH N
+kerstetter K ER S T IH T ER
+kersting K ER S T IH NG
+kertesz K ER T IH SH
+kerth K ER TH
+kertz K ER T S
+kervin K ER V IH N
+kervorkian K ER V AO R K IY AH N
+kervorkian(2) K ER V AO R K Y AH N
+kerwen K ER W AH N
+kerwin K ER W IH N
+kerwood K ER W UH D
+kerzner K ER Z N ER
+kesel K EH S AH L
+keshishian K IH SH IH SH IY AH N
+kesinger K EH S IH NG ER
+keske K EH S K
+keslar K EH S L ER
+kesler K EH S AH L ER
+kesler(2) K EH S L ER
+kesling K EH S AH L IH NG
+kesling(2) K EH S L IH NG
+kesner K EH S N ER
+kess K EH S
+kessel K EH S AH L
+kessell K EH S AH L
+kesselman K EH S AH L M AH N
+kesselring K EH S IH L R IH NG
+kessen K EH S AH N
+kessenich K EH S IH N IH K
+kessinger K EH S IH NG ER
+kessle K EH S AH L
+kessler K EH S L ER
+kessler's K EH S L ER Z
+kessner K EH S N ER
+kestel K EH S T AH L
+kesten K EH S AH N
+kestenbaum K EH S AH N B AW M
+kester K EH S T ER
+kesterson K EH S T ER S AH N
+kesting K EH S T IH NG
+kestler K EH S T L ER
+kestler's K EH S T L ER Z
+kestner K EH S T N ER
+kestrels K EH S T R AH L Z
+keswick K EH S W IH K
+keta K EH T AH
+ketch K EH CH
+ketcham K EH CH AH M
+ketchem K EH CH IH M
+ketchen K EH CH AH N
+ketcher K EH CH ER
+ketcherside K EH CH ER S AY D
+ketchie K EH CH IY
+ketchikan K EH CH IH K AH N
+ketchledge K EH CH L EH JH
+ketchum K EH CH AH M
+ketchup K EH CH AH P
+ketelhut K EH T IH L HH AH T
+ketelsen K EH T IH L S AH N
+ketema K EH T EY M AH
+keteyian K AH T EY AH N
+keteyian's K AH T EY AH N Z
+ketler K EH T L ER
+ketner K EH T N ER
+ketney K EH T N IY
+keto K EY T OW
+ketola K EH T AH L AH
+ketone K IY T OW N
+ketou K AH T UW
+ketron K EH T R AH N
+kett K EH T
+kettell K EH T AH L
+ketter K EH T ER
+ketterer K EH T ER ER
+kettering K EH T ER IH NG
+ketterling K EH T ER L IH NG
+ketterman K EH T ER M AH N
+ketti K EH T IY
+kettle K EH T AH L
+kettler K EH T AH L ER
+kettler(2) K EH T L ER
+kettles K EH T AH L Z
+kettlewell K EH T AH L W EH L
+kettner K EH T N ER
+ketura K EH T UH R AH
+ketz K EH T S
+ketzel K EH T S AH L
+ketzel's K EH T S AH L Z
+keune K Y UW N
+kevan K EH V AH N
+keven K IY V AH N
+kever K EH V ER
+kevex K EH V AH K S
+keville K IY V IH L
+kevin K EH V IH N
+kevin's K EH V IH N Z
+kevins K EH V IH N Z
+kevlar K EH V L ER
+kevlin K EH V L IH N
+kevorkian K AH V AO R K IY AH N
+kevorkian's K AH V AO R K IY AH N Z
+kew K Y UW
+kewaunee K Y UW AO N IY
+kewley K Y UW L IY
+key K IY
+key's K IY Z
+key-largo K IY L AA R G OW
+keyboard K IY B AO R D
+keyboards K IY B AO R D Z
+keycorp K IY K AO R P
+keycorp's K IY K AO R P S
+keye K AY
+keyed K IY D
+keyes K IY Z
+keyes' K IY Z
+keyhole K IY HH OW L
+keyholes K IY HH OW L Z
+keying K IY IH NG
+keyless K IY L AH S
+keylon K EY L AH N
+keynes K EY N Z
+keynesian K EY N Z IY AH N
+keynesians K EY N Z IY AH N Z
+keynote K IY N OW T
+keynotes K IY N OW T S
+keypad K IY P AE D
+keypad's K IY P AE D Z
+keypads K IY P AE D Z
+keys K IY Z
+keyser K AY Z ER
+keysor K IY S ER
+keystone K IY S T OW N
+keystone's K IY S T OW N Z
+keystones K IY S T OW N Z
+keystroke K IY S T R OW K
+keystrokes K IY S T R OW K S
+keyton K IY T AH N
+keyword K IY W ER D
+keywords K IY W ER D Z
+keyworth K IY W ER TH
+key_west K IY W EH S T
+keziah K AH Z IY AH
+kganakga K AH G AH N AE G AH
+kgori K AH G AO R IY
+khabarovsk K AE B ER AA F S K
+khad K AE D
+khadafi K AH D AA F IY
+khaki K AA K IY
+khaki(2) K AE K IY
+khakis K AE K IY Z
+khalaf K AE L AH F
+khaled HH AH L AH D
+khaled(2) K AH L AH D
+khalid K AA L IH D
+khalid's K AA L IH D Z
+khalid's(2) HH AA L IH D Z
+khalid(2) HH AA L IH D
+khalifa K AH L IY F AH
+khalil K AE L AH L
+khalsa K AA L S AH
+khamenei K AH M EY N IY
+khan K AA N
+khan's K AA N Z
+khanate K AA N EY T
+khanna K AE N AH
+kharg K AA R G
+khartoum K AA R T UW M
+khasbulatov K AA S B AH L AA T AA F
+khasbulatov's K AA S B AH L AA T AA F S
+khashoggi K AH SH AA JH IY
+khat K AA T
+khatami K AH T AA M IY
+khatami's K AH T AA M IY Z
+khazakhstan K AH Z AE K S T AA N
+khe K IY
+khe(2) K EY
+khe(3) K EY EH CH IY
+kheel K IY L
+khem K EH M
+khlebnikov K L EH B N IH K AA V
+khlebnikov's K L EH B N IH K AA V Z
+khmer K M EH R
+khomeini K OW M EY N IY
+khomeini's HH OW M EY N IY Z
+khomeini's(2) K OW M EY N IY Z
+khomeini(2) HH OW M EY N IY
+khoo K UW
+khosla K AO S L AH
+khost K OW S T
+khouri K AW R IY
+khoury K AW R IY
+khrushchev K R UW S CH EH V
+khrushchev's K R UW S CH EH V Z
+khrushchev's(2) K R UW S CH AO F S
+khrushchev(2) K R UW S CH AO F
+khufu K UW F UW
+khumalo K Y UW M AA L OW
+khuu K UW
+ki K IY
+kia K IY ER
+kiam K IY AH M
+kiawah K AY AH W AH
+kiawah(2) K IY AH W AH
+kibbe K IH B
+kibbee K IH B IY
+kibbel K IH B AH L
+kibbey K IH B IY
+kibble K IH B AH L
+kibbutz K IH B UH T S
+kibbutzim K IH B UH T S IH M
+kibbutzniks K IH B UH T S N IH K S
+kibby K IH B IY
+kibeho K IH B AH HH OW
+kibell K IH B AH L
+kibler K AO B AH L ER
+kibler(2) K IH B L ER
+kibodeaux K IH B AH D OW
+kibumba K IH B AH M B AH
+kichline K IH K L AY N
+kick K IH K
+kickback K IH K B AE K
+kickbacks K IH K B AE K S
+kicked K IH K T
+kicker K IH K ER
+kickers K IH K ER Z
+kicking K IH K IH NG
+kicklighter K IH K L AY T ER
+kickoff K IH K AO F
+kicks K IH K S
+kid K IH D
+kid's K IH D Z
+kida K IY D AH
+kidd K IH D
+kidde K IH D
+kidded K IH D IH D
+kidder K IH D ER
+kidder's K IH D ER Z
+kiddie K IH D IY
+kiddies K IH D IY Z
+kidding K IH D IH NG
+kiddingly K IH D IH NG L IY
+kiddle K IH D AH L
+kiddy K IH D IY
+kidman K IH D M AH N
+kidnap K IH D N AE P
+kidnaped K IH D N AE P T
+kidnaping K IH D N AE P IH NG
+kidnapped K IH D N AE P T
+kidnapper K IH D N AE P ER
+kidnappers K IH D N AE P ER Z
+kidnapping K IH D N AE P IH NG
+kidnappings K IH D N AE P IH NG Z
+kidnaps K IH D N AE P S
+kidney K IH D N IY
+kidneys K IH D N IY Z
+kido K IY D OW
+kids K IH D Z
+kids' K IH D Z
+kidstock K IH D S T AA K
+kidwa K IH D W AH
+kidwell K IH D W EH L
+kiechl K IY CH AH L
+kiechl(2) K AY CH AH L
+kiecker K IY K ER
+kiedrowski K IY D R AO F S K IY
+kief K IY F
+kiefer K IY F ER
+kieffer K IY F ER
+kieft K IY F T
+kiehl K IY L
+kiehn K IY N
+kiehne K IY N
+kiel K IY L
+kielar K IY L ER
+kielb K IY L B
+kielbasa K IY L B AA S AH
+kieler K IY L ER
+kielley K IY L IY
+kielman K IY L M AH N
+kielty K IY L T IY
+kiely K IY L IY
+kienan K IY N AH N
+kienast K IY N AH S T
+kiene K IY N
+kiener K IY N ER
+kieninger K IY N IH NG ER
+kienitz K IY N IH T S
+kienle K IY N AH L
+kientz K IY N T S
+kienzle K IY N Z AH L
+kieper K IY P ER
+kier K IH R
+kieran K IY R AH N
+kiernan K IH R N AH N
+kierscht K IH R SH T
+kierstead K IH R S T EH D
+kierulff K IY R AH L F
+kies K AY S
+kieschnick K IY SH N IH K
+kiesel K IY S AH L
+kieselmann K IY Z AH L M AH N
+kieser K IY S ER
+kiesewetter K IY S UW IH T ER
+kiesler K IY Z L ER
+kiesling K IY Z L IH NG
+kiesow K IY S OW
+kiess K IY S
+kiessling K IY S L IH NG
+kiester K AY IH S T ER
+kietzman K IY T S M AH N
+kiev K IY EH V
+kiev's K IY EH V Z
+kievan K IY V AH N
+kievit K IY V IH T
+kiewit K IY W IH T
+kifer K AY F ER
+kiff K IH F
+kigale K IY G AA L IY
+kigale's K IY G AA L IY Z
+kigali K IY G AA L IY
+kigali's K IY G AA L IY Z
+kiger K AY G ER
+kiggins K IH G IH N Z
+kight K AY T
+kightlinger K AY T AH L IH NG ER
+kightlinger(2) K AY T L IH NG ER
+kihn K IH N
+kiichi K IY IY CH IY
+kiichi(2) K IY CH IY
+kijowski K IH Y AO F S K IY
+kika K IH K AH
+kikatte K IH K AE T
+kiker K AY K ER
+kiki K IY K IY
+kikkoman K IY K OW M AA N
+kikta K IH K T AH
+kikuchi K IY K UW CH IY
+kikumura K IY K UW M UW R AH
+kikwit K IH K W IH T
+kila K IH L AH
+kilbane K IH L B AH N
+kilborn K IH L B ER N
+kilborne K IH L B AO R N
+kilbourn K IH L B ER N
+kilbourne K IH L B ER N
+kilbride K IH L B R AY D
+kilburg K IH L B ER G
+kilburn K IH L B ER N
+kilbury K IH L B EH R IY
+kilby K IH L B IY
+kilby's K IH L B IY Z
+kilcoin K IH L K OY N
+kilcoyne K IH L K OY N
+kilcrease K IH L K R IY S
+kilcullen K IH L K AH L AH N
+kilday K IH L D EY
+kildee K IH L D IY
+kildow K IH L D OW
+kilduff K IH L D AH F
+kile K AY L
+kilen K IH L AH N
+kiley K AY L IY
+kilgo K IH L G OW
+kilgore K IH L G AO R
+kilgour K IH L G ER
+kilgus K IH L G AH S
+kilian K IH L IY AH N
+kilimanjaro K IH L IY M AH N JH AA R OW
+kilimanjaro(2) K IH L AH M AH N JH AA R OW
+kilker K IH L K ER
+kill K IH L
+killam K IH L AH M
+kille K IH L
+killeagh K IH L IY G
+killebrew K IH L IH B R UW
+killed K IH L D
+killeen K IH L IY N
+killen K IH L AH N
+killer K IH L ER
+killer's K IH L ER Z
+killers K IH L ER Z
+killey K IH L IY
+killgore K IH L G AO R
+killian K IH L Y AH N
+killifish K IH L IH F IH SH
+killilea K IH L IH L IY AH
+killin K IH L IH N
+killing K IH L IH NG
+killingbeck K IH L IH NG B EH K
+killinger K IH L IH NG ER
+killings K IH L IH NG Z
+killingsworth K IH L IH NG Z W ER TH
+killington K IH L IH NG T AH N
+killion K IH L Y AH N
+killjoy K IH L JH OY
+killman K IH L M AH N
+killman's K IH L M AH N Z
+killmer K IH L M ER
+killmon K IH L M AH N
+killoran K IH L ER AH N
+killory K IH L ER IY
+killough K IH L AW
+killpack K IH L P AE K
+kills K IH L Z
+kilman K IH L M AH N
+kilmarnock K IH L M AA R N AA K
+kilmartin K IH L M AA R T IH N
+kilmer K IH L M ER
+kiln K IH L N
+kilns K IH L N Z
+kilo K IH L OW
+kilobit K IH L AH B IH T
+kilobyte K IH L OW B AY T
+kilobytes K IH L OW B AY T S
+kilogram K IH L AH G R AE M
+kilograms K IH L AH G R AE M Z
+kilometer K AH L AA M AH T ER
+kilometer(2) K IH L AH M IY T ER
+kilometers K AH L AA M AH T ER Z
+kilometers(2) K IH L AH M IY T ER Z
+kilos K IY L OW Z
+kilowatt K IH L AH W AA T
+kilowatts K IH L AH W AA T S
+kilpatrick K IH L P AE T R IH K
+kilroy K IH L R OY
+kilt K IH L T
+kilter K IH L T ER
+kilton K IH L T AH N
+kilts K IH L T S
+kilty K IH L T IY
+kilzer K IH L Z ER
+kim K IH M
+kim's K IH M Z
+kimba K IH M B AH
+kimball K IH M B AH L
+kimball's K IH M B AH L Z
+kimbel K IH M B AH L
+kimbell K IH M B EH L
+kimber K IH M B ER
+kimberley K IH M B ER L IY
+kimberlin K IH M B ER L IH N
+kimberling K IH M B ER L IH NG
+kimberly K IH M B ER L IY
+kimberly's K IH M B ER L IY Z
+kimble K IH M B AH L
+kimbler K IH M B L ER
+kimbley K IH M B L IY
+kimbrel K IH M B R AH L
+kimbrell K IH M B R AH L
+kimbriel K IH M B R IY AH L
+kimbro K IH M B R OW
+kimbrough K IH M B R AW
+kimche K IH M CH IY
+kimchee K IH M CH IY
+kimchi K IH M CH IY
+kimco K IH M K OW
+kime K AY M
+kimel K IH M AH L
+kimery K IH M ER IY
+kimes K AY M Z
+kimler K IH M AH L ER
+kimler(2) K IH M L ER
+kimm K IH M
+kimmel K IH M AH L
+kimmell K IH M AH L
+kimmelman K IH M AH L M AH N
+kimmer K IH M ER
+kimmerle K IH M ER AH L
+kimmet K IH M IH T
+kimmey K IH M IY
+kimmich K IH M IH CH
+kimmins K IH M IH N Z
+kimmitt K IH M IH T
+kimmons K IH M AH N Z
+kimono K AH M OW N AH
+kimonos K AH M OW N AH Z
+kimoto K IY M OW T OW
+kimpel K IH M P AH L
+kimple K IH M P AH L
+kimpo K IH M P OW
+kimpton K IH M P T AH N
+kimrey K IH M R IY
+kims K IH M Z
+kimsey K IH M Z IY
+kimura K IY M UH R AH
+kimwipe K IH M W AY P
+kimwipes K IH M W AY P S
+kimzey K IH M Z IY
+kin K IH N
+kin's K IH N Z
+kinard K IH N ER D
+kinark K IH N AA R K
+kinburn K IH N B ER N
+kincade K IH N K EY D
+kincaid K IH N K EY D
+kincaid's K IH N K EY D Z
+kincannon K IH N K AE N AH N
+kincer K IH N S ER
+kinch K IH N CH
+kincheloe K IH N CH IH L OW
+kinchen K IH NG K AH N
+kincy K IH N S IY
+kind K AY N D
+kinda K IH N D AH
+kindall K IH N D AH L
+kindel K IH N D AH L
+kindell K IH N D AH L
+kinder K AY N D ER
+kindergarten K IH N D ER G AA R T AH N
+kindergartens K IH N D ER G AA R T AH N Z
+kindergartner K IH N D ER G AA R T N ER
+kindergartners K IH N D ER G AA R T N ER Z
+kinderman K AY N D ER M AH N
+kindest K AY N D AH S T
+kindig K IH N D IH G
+kindle K IH N D AH L
+kindleberger K IH N D AH L B ER G ER
+kindled K IH N D AH L D
+kindler K IH N D AH L ER
+kindler(2) K IH N D L ER
+kindley K IH N D L IY
+kindling K IH N D L IH NG
+kindly K AY N D L IY
+kindness K AY N D N AH S
+kindran K IH N D R AH N
+kindred K IH N D R IH D
+kindrick K IH N D R IH K
+kinds K AY N D Z
+kinds(2) K AY N Z
+kindt K IH N T
+kindy K AY N D IY
+kinepolis K IH N EH P AH L IH S
+kiner K AY N ER
+kines K AY N Z
+kinesiology K IH N IH S IY AA L AH JH IY
+kinesthetic K IH N AH S TH EH T IH K
+kineta K IH N IH T AH
+kinetic K AH N EH T IH K
+kinetic(2) K IH N EH T IH K
+kinetics K AH N EH T IH K S
+king K IH NG
+king's K IH NG Z
+kingbird K IH NG B ER D
+kingbirds K IH NG B ER D Z
+kingdom K IH NG D AH M
+kingdom's K IH NG D AH M Z
+kingdoms K IH NG D AH M Z
+kingdon K IH NG D AH N
+kingen K IH NG AH N
+kingery K IH NG G ER IY
+kingfisher K IH NG F IH SH ER
+kingfishers K IH NG F IH SH ER Z
+kingham K IH NG HH AE M
+kinghorn K IH NG HH ER N
+kingly K IH NG L IY
+kingma K IH NG M AH
+kingmaker K IH NG M EY K ER
+kingmakers K IH NG M EY K ER Z
+kingman K IH NG M AH N
+kingon K IH NG AO N
+kingpin K IH NG P IH N
+kingpins K IH NG P IH N Z
+kingrey K IH NG G R IY
+kingry K IH NG G ER IY
+kings K IH NG Z
+kings' K IH NG Z
+kingsborough K IH NG Z B ER OW
+kingsbridge K IH NG Z B R IH JH
+kingsbury K IH NG Z B EH R IY
+kingsey K IH NG Z IY
+kingsford K IH NG S F ER D
+kingship K IH NG SH IH P
+kingsland K IH NG Z L AE N D
+kingsley K IH NG Z L IY
+kingsley's K IH NG Z L IY Z
+kingsolver K IH NG S AA L V ER
+kingsport K IH NG S P AO R T
+kingston K IH NG S T AH N
+kingsun K IH NG S AH N
+kingsville K IH NG Z V IH L
+kingsway K IH NG G Z W EY
+kingswell K IH NG G Z W EH L
+kington K IH NG T AH N
+kinion K IH N Y AH N
+kiniry K IH N AY R IY
+kinkade K IH NG K AH D
+kinkead K IH NG K EH D
+kinkel K IH NG K AH L
+kinker K IH NG K ER
+kinkle K IH NG K AH L
+kinko K IH NG K OW
+kinko's K IH NG K OW Z
+kinks K IH NG K S
+kinky K IH NG K IY
+kinlaw K IH N L AO
+kinley K IH N L IY
+kinloch K IH N L AH K
+kinman K IH N M AH N
+kinmen K IH N M EH N
+kinn K IH N
+kinnaird K IH N ER D
+kinnaman K IH N AH M AH N
+kinnamon K IH N AH M AH N
+kinnan K IH N AH N
+kinnard K IH N ER D
+kinne K IH N
+kinnear K IH N IH R
+kinnebrew K IH N IH B R UW
+kinnell K IH N AH L
+kinner K IH N ER
+kinnett K IH N IH T
+kinney K IH N IY
+kinnick K IH N IH K
+kinnie K IH N IY
+kinnison K IH N IH S AH N
+kinnock K IH N AH K
+kinnock's K IH N AH K S
+kinnunen K IH N AH N AH N
+kinny K IH N IY
+kinoshita K IY N OW SH IY T AH
+kinsel K IH N S AH L
+kinsell K IH N S AH L
+kinsella K IY N S EH L AH
+kinser K IH N S ER
+kinsey K IH N Z IY
+kinshasa K IH N SH AA S AH
+kinshasa(2) K IH N SH AE S AH
+kinship K IH N SH IH P
+kinsinger K IH N S IH N JH ER
+kinsler K IH N S AH L ER
+kinsler(2) K IH N S L ER
+kinsley K IH N Z L IY
+kinsley's K IH N Z L IY Z
+kinslow K IH N S L OW
+kinsman K IH N Z M AE N
+kinst K IH N S T
+kinstler K IH N S T L ER
+kinston K IH N S T AH N
+kint K IH N T
+kinter K IH N T ER
+kintigh K IH N T AY
+kintner K IH N T N ER
+kinton K IH N T AH N
+kintz K IH N T S
+kintzel K IH N T Z AH L
+kinyon K IH N Y AH N
+kinzel K IH N Z AH L
+kinzer K IH N Z ER
+kinzey K IH N Z IY
+kinzie K IH N Z IY
+kinzler K IH N Z L ER
+kinzlmaier K IH N Z AH L M AY ER
+kiosk K IY AO S K
+kiosks K IY AO S K S
+kious K AY AH S
+kip K IH P
+kiper K AY P ER
+kipfer K IH P F ER
+kipling K IH P L IH NG
+kiplinger K IH P AH L IH NG ER
+kiplinger's K IH P L IH NG ER Z
+kiplinger(2) K IH P L IH NG ER
+kipnis K IH P N IH S
+kipp K IH P
+kipper K IH P ER
+kipperman K IH P ER M AH N
+kippers K IH P ER Z
+kippes K IH P S
+kippur K IH P ER
+kir K IH R
+kiracofe K IH R AH K OW F
+kiraly K IH R AH L IY
+kirby K ER B IY
+kirby's K ER B IY Z
+kirch K ER K
+kirchberg K ER K B ER G
+kirchberg(2) K ER CH B ER G
+kirchberger K ER CH B ER G ER
+kirchen K ER K AH N
+kircher K ER K ER
+kirchgessner K ER K G IH S N ER
+kirchhofer K ER K HH AH F ER
+kirchhoff K ER K HH AO F
+kirchman K ER K M AH N
+kirchner K ER K N ER
+kirchners K ER K N ER Z
+kirchoff K ER K HH AO F
+kirgan K ER G AH N
+kirgiz K IH R G IH Z
+kiri K IH R IY
+kiribati K IH R IH B AA T IY
+kirin K IH R IH N
+kirk K ER K
+kirk's K ER K S
+kirkbride K ER K B R AY D
+kirkby K ER K B IY
+kirkeby K ER K IH B IY
+kirkendall K ER K EH N D AH L
+kirkendoll K ER K EH N D OW L
+kirker K ER K ER
+kirkey K ER K IY
+kirkham K ER K HH AH M
+kirkhart K ER K HH AA R T
+kirkland K ER K L AH N D
+kirkland's K ER K L AH N D Z
+kirkley K ER K L IY
+kirklin K ER K L IH N
+kirkman K ER K M AH N
+kirkner K ER K N ER
+kirkpatrick K ER K P AE T R IH K
+kirkpatrick(2) K ER P AE T R IH K
+kirks K ER K S
+kirksey K ER K S IY
+kirkuk K IH R K UH K
+kirkum K IH R K AH M
+kirkwood K ER K W UH D
+kirley K ER L IY
+kirlin K ER L IH N
+kirmse K ER M S IY
+kirn K ER N
+kirnan K ER N AH N
+kirner K ER N ER
+kirouac K AY R AW AE K
+kirov K IH R AA V
+kirsch K ER SH
+kirschbaum K ER SH B AW M
+kirschenbaum K ER SH AH N B AW M
+kirschenmann K ER SH AH N M AH N
+kirschman K ER SH M AH N
+kirschner K ER SH N ER
+kirsh K ER SH
+kirshbaum K ER SH B AW M
+kirshenbaum K ER SH AH N B AW M
+kirshfink K ER SH F IH NG K
+kirshner K ER SH N ER
+kirst K ER S T
+kirstein K ER S T AY N
+kirstein(2) K ER S T IY N
+kirsten K ER S T AH N
+kirstie K ER S T IY
+kirstin K ER S T IH N
+kirt K ER T
+kirtland K ER T L AH N D
+kirtley K ER T L IY
+kirton K ER T AH N
+kirts K ER T S
+kirven K ER V AH N
+kirwan K ER W AO N
+kirwin K ER W IH N
+kiryas K IH R Y AH S
+kiryas(2) K IH R Y AA S
+kiryat K IH R Y AH T
+kiryat(2) K IH R Y AA T
+kis K IH S
+kisamore K IY S AA M AO R
+kisan K IH Z AH N
+kisch K IH SH
+kischell K IH SH AH L
+kisco K IH S K OW
+kise K AY Z
+kiser K AY Z ER
+kish K IH SH
+kisha K IH SH AH
+kishbaugh K IH SH B AW
+kishi K IY SH IY
+kishore K IY SH AO R
+kisiel K IH S IY L
+kiska K IH S K AH
+kiska's K IH S K AH Z
+kisler K IH S AH L ER
+kisler(2) K IH S L ER
+kisling K IH S AH L IH NG
+kisling(2) K IH S L IH NG
+kismayu K IH S M AA Y UW
+kismayu(2) K IH Z M AA Y UW
+kismet K IH Z M IH T
+kismets K IH Z M IH T S
+kisner K IH S N ER
+kisor K AY Z ER
+kiss K IH S
+kissack K IH S AH K
+kissam K IH S AH M
+kissane K IH S AH N
+kissed K IH S T
+kissee K IH S IY
+kissel K IH S AH L
+kissell K IH S AH L
+kisser K IH S ER
+kisses K IH S AH Z
+kisses(2) K IH S IH Z
+kissick K IH S IH K
+kissimmee K IH S IH M IY
+kissing K IH S IH NG
+kissinger K IH S IH N JH ER
+kissinger's K IH S IH N JH ER Z
+kissler K IH S L ER
+kissling K IH S L IH NG
+kissner K IH S N ER
+kist K IH S T
+kister K IH S T ER
+kistler K IH S T L ER
+kistner K IH S T N ER
+kiszczak K IH Z AE K
+kiszczak(2) K IH SH AE K
+kit K IH T
+kita K IY T AH
+kitagawa K IY T AA G AA W AH
+kitajima K IY T AH JH IY M AH
+kitamura K IY T AA M UH R AH
+kitcat K IH T K AE T
+kitch K IH CH
+kitchel K IH CH AH L
+kitchell K IH CH AH L
+kitchen K IH CH AH N
+kitchen's K IH CH AH N Z
+kitchenaid K IH CH AH N EY D
+kitchener K IH CH AH N ER
+kitchener(2) K IH CH N ER
+kitchenette K IH CH AH N EH T
+kitchens K IH CH AH N Z
+kitchenware K IH CH AH N W EH R
+kitchin K IH CH IH N
+kitching K IH CH IH NG
+kitchings K IH CH IH NG Z
+kite K AY T
+kites K AY T S
+kithcart K IH TH K AA R T
+kitimat K IH T IH M AE T
+kiting K AY T IH NG
+kitner K IH T N ER
+kitowski K IH T AO F S K IY
+kits K IH T S
+kitsch K IH CH
+kitson K IH T S AH N
+kitt K IH T
+kittaneh K IH T AA N EH
+kittel K IH T AH L
+kittell K IH T AH L
+kittelson K IH T IH L S AH N
+kitten K IH T AH N
+kittens K IH T AH N Z
+kitterman K IH T ER M AH N
+kittinger K IH T IH NG ER
+kittiwake K IH T IH W EY K
+kittle K IH T AH L
+kittler K IH T AH L ER
+kittles K IH T AH L Z
+kittleson K IH T AH L S AH N
+kittman K IH T M AH N
+kittner K IH T N ER
+kittredge K IH T R IH JH
+kittrell K IH T R AH L
+kitts K IH T S
+kitty K IH T IY
+kitz K IH T S
+kitzhaber K IH T S HH EY B ER
+kitzhaber(2) K IH T S HH AA B ER
+kitzman K IH T S M AH N
+kitzmiller K IH T S M IH L ER
+kivela K IH V IH L AH
+kivett K IH V IH T
+kivi K IH V IY
+kiwani K IH W AA N IH
+kiwanis K IH W AA N IH S
+kiwi K IY W IY
+kiwi's K IY W IY Z
+kiwis K IY W IY Z
+kiyohida K IY OW HH IY D AH
+kiyoshi K IY OW SH IY
+kiyotaka K IY OW T AA K AH
+kizer K AY Z ER
+kizziah K IH Z IY AH
+kjar K AH JH AA R
+kjar(2) K EY JH EY EY AA R
+kjell K Y EH L
+kjellberg JH EH L B ER G
+kjellberg(2) K AH JH EH L B ER G
+kjenstad K Y EH N S T AE D
+kjos K AH JH AA S
+kjos(2) K EY JH EY OW EH S
+kkk K EY K EY K EY
+klaas K L AA S
+klaassen K L AA S AH N
+klabunde K L AE B AH N D
+kladstrup K L AE D S T R AH P
+kladstrup's K L AE D S T R AH P S
+klages K L EY JH IH Z
+klahn K L AE N
+klahr K L AE R
+klaiber K L EY B ER
+klamath-falls K L AE M AH TH F AO L Z
+klamer K L EY M ER
+klamm K L AE M
+klammer K L AE M ER
+klamon K L EY M AH N
+klan K L AE N
+klan's K L AE N Z
+klang K L AE NG
+klann K L AE N
+klans K L AE N Z
+klansmen K L AE N Z M AH N
+klapp K L AE P
+klapper K L AE P ER
+klapperich K L AE P ER IH K
+klar K L AA R
+klare K L EH R
+klarich K L AE R IH K
+klarman K L AA R M AH N
+klas K L AE S
+klase K L EY Z
+klasen K L EY S AH N
+klass K L AE S
+klassen K L AE S AH N
+klatsky K L AE T S K IY
+klatt K L AE T
+klauber K L AW B ER
+klauer K L AW ER
+klaus K L AW S
+klauser K L AW S ER
+klausing K L AW S IH NG
+klausner K L AW S N ER
+klaver K L EY V ER
+klawitter K L AO IH T ER
+klay K L EY
+klayman K L EY M AH N
+kleban K L EH B AH N
+klebba K L EH B AH
+klebe K L IY B
+kleber K L IY B ER
+kleck K L EH K
+klecka K L EH K AH
+klecker K L EH K ER
+kleckner K L EH K N ER
+kleczka K L EH K S K AH
+klee K L IY
+klee's K L IY Z
+kleeman K L IY M AH N
+kleen K L IY N
+kleenex K L IY N AH K S
+kleer K L IH R
+klees K L IY Z
+kleffner K L EH F N ER
+kleiber K L AY B ER
+kleier K L AY ER
+kleiman K L AY M AH N
+klein K L AY N
+klein's K L AY N Z
+kleinberg K L AY N B ER G
+kleindienst K L AY N D IY N S T
+kleine K L AY N
+kleiner K L AY N ER
+kleinert K L AY N ER T
+kleinfeld K L AY N F EH L D
+kleinfelter K L AY N F IH L T ER
+kleinhans K L AY N HH AH N Z
+kleinhenz K L AY N HH IH N S
+kleinknecht K L AY NG K N IH K T
+kleinman K L AY N M AH N
+kleinpaste K L AY N P EY S T
+kleinpeter K L AY N P IY T ER
+kleinsasser K L AY N S AH S ER
+kleinschmidt K L AY N SH M IH T
+kleinsmith K L AY N S M IH TH
+kleinwort K L AY N W ER T
+kleis K L AY Z
+kleiss K L AY S
+kleist K L AY S T
+klejna K L EY N ER
+klem K L EH M
+klema K L EH M AH
+kleman K L EH M AH N
+klemann K L EH M AH N
+klemens K L EH M AH N S
+klement K L EH M AH N T
+klemm K L EH M
+klemme K L EH M
+klemmer K L EH M ER
+klemp K L EH M P
+klempner K L EH M P N ER
+klemz K L EH M Z
+klenge K L EH N JH
+klenk K L EH NG K
+klenke K L EH NG K
+klensch K L EH N SH
+klepac K L EH P AH K
+klepfer K L EH P F ER
+kleppe K L EH P
+klepper K L EH P ER
+kleppinger K L EH P IH NG G ER
+kleptocrat K L EH P T AH K R AE T
+kleptomaniac K L EH P T AH M EY N IY AE K
+klerk K L ER K
+klerk's K L ER K S
+klesch K L EH SH
+klesken K L EH S K AH N
+kless K L EH S
+klett K L EH T
+kleubeck K L UW B EH K
+kleve K L IY V
+kleven K L IY V AH N
+klever K L EH V ER
+kley K L EY
+klezmatic K L EH Z M AE T IH K
+klezmatics K L EH Z M AE T IH K S
+klezmer K L EH Z M ER
+klich K L IH CH
+klick K L IH K
+kliebert K L IY B ER T
+klieg K L IY G
+klieman K L AY M AH N
+klier K L AY ER
+kliethermes K L IY TH ER M Z
+kliewer K L IY W ER
+kligman K L IH G M AH N
+klim K L IH M
+klima K L AY M AH
+klimas K L AY M AH Z
+klimaszewski K L IH M AH SH EH F S K IY
+klimczak K L IH M CH AE K
+klimek K L IH M IH K
+kliment K L AY M AH N T
+klimer K L IH M ER
+klimer(2) K L AY M ER
+klimowicz K L IH M AH V IH CH
+klinck K L IH NG K
+klindt K L IH N T
+klindworth K L IH N D W ER TH
+kline K L AY N
+klinedinst K L IH N IH D IH N S T
+klinedinst(2) K L AY N D IH N S T
+klinefelter K L IH N IH F IH L T ER
+klinefelter(2) K L AY N F IH L T ER
+kling K L IH NG
+klingaman K L IH NG G AH M AH N
+klingbeil K L IH NG B AY L
+klingberg K L IH NG B ER G
+klinge K L IH N JH
+klingel K L IH NG G AH L
+klingenberg K L IH NG AH N B ER G
+klingensmith K L IH NG G IH N S M IH TH
+klinger K L IH NG ER
+klinger's K L IH NG ER Z
+klingerman K L IH NG ER M AH N
+klinghoffer K L IH NG HH AO F ER
+klingler K L IH NG G AH L ER
+klingler(2) K L IH NG G L ER
+klingman K L IH NG M AH N
+klingon K L IH NG G AH N
+klink K L IH NG K
+klinke K L IH NG K
+klinker K L IH NG K ER
+klinkhammer K L IH NG K HH AE M ER
+klinkhammer's K L IH NG K HH AE M ER Z
+klinkner K L IH NG K N ER
+klint K L IH N T
+klintworth K L IH N T W ER TH
+klinzing K L IH N Z IH NG
+klipfel K L IH P F AH L
+klipp K L IH P
+klippel K L IH P AH L
+klish K L IH SH
+klitz K L IH T S
+klitzke K L IH T S K IY
+klixshavich K L IH K S AE V IH CH
+kloberdanz K L AA B ER D AH N S
+kloc K L AA K
+klocek K L OW S IH K
+klock K L AA K
+klocke K L AA K
+kloeckner K L OW K N ER
+kloehn K L OW N
+kloepfer K L OW P F ER
+kloeppel K L OW P AH L
+kloepper K L OW P ER
+kloiber K L OY B ER
+klom K L AO M
+klomp K L AA M P
+klondike K L AA N D AY K
+klonowski K L AH N AO F S K IY
+klontz K L AA N T S
+kloos K L UW Z
+klooster K L UW S T ER
+kloosterman K L UW S T ER M AH N
+klopf K L AA P F
+klopfenstein K L AA P F AH N S T AY N
+klopfenstein(2) K L AA P F AH N S T IY N
+klopfer K L AA P F ER
+klopp K L AA P
+kloppenburg K L AA P AH N B ER G
+klos K L AA S
+klose K L OW Z
+klosinski K L AH S IH N S K IY
+klosowski K L AH S AO F S K IY
+kloss K L AO S
+klossner K L AA S N ER
+kloster K L AO S T ER
+klosterman K L AA S T ER M AH N
+klostermann K L AA S T ER M AH N
+kloth K L AA TH
+klotz K L AA T S
+klotzbach K L AA T S B AA K
+klucevsek K L UW S EH V S EH K
+kluck K L AH K
+kludt K L AH D T
+kluender K L UH N D ER
+kluesner K L UH S N ER
+kluever K L UH V ER
+klug K L AH G
+kluge K L UW JH
+kluge's K L UW JH IH Z
+kluger K L UW G ER
+klugh K L AH
+klugman K L AH G M AH N
+klugt K L AH T
+klukas K L UW K AH Z
+klumb K L AH M
+klump K L AH M P
+klumpp K L AH M P
+klunder K L AH N D ER
+klundt K L AH N T
+klunk K L AH NG K
+klus K L AH S
+klusman K L AH S M AH N
+klute K L UW T
+kluth K L UW TH
+klutts K L AH T S
+kluttz K L AH T S
+klutz K L AH T S
+klutznick K L AH T S N IH K
+kluver K L UW V ER
+kluwer K L UW W ER
+klux K L AH K S
+klym K L IH M
+klynveld K L IH N V EH L D
+kmart K EY M AA R T
+kmart's K EY M AA R T S
+kmetz K AH M EH T S
+kmiec K AH M IY K
+kmiecik K AH M IY CH IH K
+knaack N AA K
+knaak N AA K
+knab N AE B
+knabb N AE B
+knabe N EY B
+knable N EY B AH L
+knack N AE K
+knacks N AE K S
+knackstedt N AE K S T IH T
+knaggs N AE G Z
+knape N EY P
+knapik N AE P IH K
+knapke N EY P K
+knapp N AE P
+knapp's N AE P S
+knappenberger N AE P AH N B ER G ER
+knapper N AE P ER
+knapsack N AE P S AE K
+knapton N AE P T AH N
+knarr N AE R
+knaub N AO B
+knauer N AW ER
+knauf N AO F
+knauff N AO F
+knaup N AO P
+knaus N AO Z
+knauss N AO S
+knave N EY V
+knaves N EY V Z
+knbc K EY EH N B IY S IY
+knead N IY D
+kneading N IY D IH NG
+kneafsey N IY F S IY
+kneale N IY L
+knebel N EH B AH L
+knecht N EH K T
+knechtel N EH K T AH L
+knee N IY
+kneebone N IY B OW N
+kneecap N IY K AE P
+kneecaps N IY K AE P S
+kneece N IY S
+kneed N IY D
+kneeing N IY IH NG
+kneel N IY L
+kneeland N IY L AH N D
+kneeling N IY L IH NG
+kneer N IH R
+knees N IY Z
+kneip N IY P
+kneisel N AY S AH L
+kneisley N IY S L IY
+knell N EH L
+kneller N EH L ER
+knelt N EH L T
+knepp N EH P
+knepper N EH P ER
+knerr N EH R
+kness N EH S
+knesset N EH S AH T
+knesset(2) K N EH S AH T
+knesset(3) K AH N EH S AH T
+knew N UW
+knew(2) N Y UW
+knezevich N EH Z IH V IH CH
+knicely N AY S L IY
+knick N IH K
+knick-knack N IH K N AE K
+knick-knacks N IH K N AE K S
+knicker N IH K ER
+knickerbocker N IH K ER B AA K ER
+knickerbockered N IH K ER B AA K ER D
+knickerbockers N IH K ER B AA K ER Z
+knickers N IH K ER Z
+knickknack N IH K N AE K
+knickknacks N IH K N AE K S
+knicks N IH K S
+knicks' N IH K S
+knief N IY F
+kniep N IY P
+knieriem N IY R IY M
+knierim N IH R IH M
+knies N AY Z
+kniess N IY S
+knievel K AH N IY V AH L
+knievel(2) N IY V AH L
+knife N AY F
+knifed N AY F T
+knifelike N AY F L AY K
+knifepoint N AY F P OY N T
+kniffen N IH F AH N
+kniffin N IH F IH N
+knifing N AY F IH NG
+knifings N AY F IH NG Z
+knigge N IH G
+knight N AY T
+knight's N AY T S
+knighted N AY T IH D
+knighten N AY T AH N
+knighthood N AY T HH UH D
+knightly N AY T L IY
+knighton N AY T AH N
+knights N AY T S
+knill N IH L
+knin K EY EH N AY EH N
+knin(2) K N IH N
+knin(3) N IH N
+knipe N AY P
+knipfer N IH P F ER
+knipl N IH P AH L
+knipp N IH P
+knippa N IH P AH
+knippel N IH P AH L
+knippenberg N IH P AH N B ER G
+knipper N IH P ER
+knipple N IH P AH L
+knisely N AY Z L IY
+kniskern N IH S K ER N
+knisley N IH S L IY
+knispel N IH S P AH L
+kniss N IH S
+knit N IH T
+knits N IH T S
+knitted N IH T AH D
+knitted(2) N IH T IH D
+knittel N IH T AH L
+knitter N IH T ER
+knitting N IH T IH NG
+knittle N IH T AH L
+knitwear N IH T W EH R
+knives N AY V Z
+kniveton N AY V T AH N
+knob N AA B
+knobbe N AA B
+knobby N AA B IY
+knobel N OW B AH L
+knoblauch N AA B L AW K
+knoble N OW B AH L
+knobloch N AA B L AH K
+knoblock N AA B L AA K
+knobs N AA B Z
+knoch N AA K
+knoche N AA CH
+knochel N AA K AH L
+knock N AA K
+knockdown N AA K D AW N
+knocked N AA K T
+knocking N AA K IH NG
+knockoff N AA K AO F
+knockoffs N AA K AO F S
+knockout N AA K AW T
+knockouts N AA K AW T S
+knocks N AA K S
+knode N OW D
+knodel N OW D AH L
+knodle N OW D AH L
+knoebel N OW B AH L
+knoedler N OW D AH L ER
+knoedler(2) N OW D L ER
+knoell N OW L
+knoff N AO F
+knogo N OW G OW
+knoke N OW K
+knoles N OW L Z
+knoll N OW L
+knoll's N OW L Z
+knoop N UW P
+knop N AA P
+knope N OW P
+knopf N AA P F
+knopf(2) N AA F
+knopp N AA P
+knorr N AO R
+knost N AA S T
+knot N AA T
+knotek N OW T IH K
+knoth N AA TH
+knots N AA T S
+knott N AA T
+knott's N AA T S
+knotted N AA T IH D
+knotts N AA T S
+knotty N AA T IY
+knouff N OW F
+knous N AO S
+knouse N AW S
+know N OW
+knowed N OW D
+knower N OW ER
+knowing N OW IH NG
+knowingly N OW IH NG L IY
+knowledge N AA L AH JH
+knowledge(2) N AA L IH JH
+knowledgeable N AA L AH JH AH B AH L
+knowledgeably N AA L IH JH AH B L IY
+knowledgeware N AA L IH JH W EH R
+knowles N OW L Z
+knowlton N OW L T AH N
+known N OW N
+knowns N OW N Z
+knows N OW Z
+knox N AA K S
+knox's N AA K S IH Z
+knoxville N AA K S V IH L
+knoy N OY
+knuckle N AH K AH L
+knuckled N AH K AH L D
+knuckles N AH K AH L Z
+knudsen N UW D S AH N
+knudsen's N UW D S AH N Z
+knudson N UW D S AH N
+knudtson N UW T S AH N
+knueppel N UW P AH L
+knupp N AH P
+knust N AH S T
+knut N AH T
+knute N UW T
+knuth N UW TH
+knuts N AH T S
+knutsen N AH T S AH N
+knutson K N UW T S AH N
+knutzen N AH T Z AH N
+ko K OW
+koala K OW AA L AH
+koalas K OW AA L AH Z
+koba K OW B AH
+kobacker K OW B AE K ER
+kobak K OW B AH K
+kobayashi K OW B AA Y AA SH IY
+kobe K OW B EY
+kobe's K OW B EY Z
+kobel K OW B AH L
+kober K OW B ER
+koberstein K OW B ER S T AY N
+koberstein(2) K OW B ER S T IY N
+kobes K OW B Z
+koble K OW B AH L
+kobler K OW B AH L ER
+kobler(2) K OW B L ER
+kobren K AA B R AH N
+kobrin K AA B R IH N
+kobrin's K AA B R IH N Z
+kobs K AA B Z
+kobus K OW B AH S
+koby K OW B IY
+kobylarz K AH B IH L ER Z
+kobylinski K AH B IH L IH N S K IY
+kobza K AA B Z AH
+kocak K OW K AH K
+koch K AO CH
+koch(2) K OW K
+kochan K AA K AH N
+kochanek K AA K AH N IH K
+kochanowski K AH HH AH N AO F S K IY
+kochanski K AH HH AE N S K IY
+kochel K AA K AH L
+kochendorfer K AA K IH N D AO R F ER
+kocher K AO CH ER
+kochevar K AH HH EH V ER
+kochis K AA K IH S
+kochman K AA K M AH N
+koci K OW S IY
+kocian K OW SH AH N
+kociemba K OW S IY EH M B AH
+kocinski K AH CH IH N S K IY
+kociolek K OW S IY OW L EH K
+kocis K OW S IH S
+kock K AA K
+kocourek K AH K UH R EH K
+kocsis K AA K S IH S
+kocur K OW K ER
+kocur's K OW K ER Z
+kocurek K AH K Y UW R EH K
+kodacolor K OW D AH K AH L ER
+kodak K OW D AE K
+kodak's K OW D AE K S
+kodama K OW D AA M AH
+kodiak K OW D IY AE K
+kodo K OW D OW
+koebel K OW B AH L
+koedinger K OW D IH NG ER
+koegel K OW G AH L
+koegler K OW G AH L ER
+koegler(2) K OW G L ER
+koehl K OW L
+koehler K OW L ER
+koehn K OW N
+koehne K OW N
+koehnen K OW N AH N
+koeki K OW K IY
+koelle K OW L
+koeller K OW L ER
+koelling K OW L IH NG
+koelsch K OW L SH
+koelzer K OW L Z ER
+koen K OW N
+koeneman K AA IY N M AH N
+koenen K OW N AH N
+koenig K ER N IH G
+koenigs K ER N IH G Z
+koenigsberg K OW N IH G Z B ER G
+koenigsfeld K OW N IH G Z F EH L D
+koep K OW P
+koepke K OW P K
+koepp K OW P
+koeppe K OW P
+koeppel K OW P AH L
+koeppen K OW P AH N
+koepsel K OW P S AH L
+koepsell K OW P S AH L
+koerber K AO R B ER
+koerner K AO R N ER
+koernke K ER N AH K IY
+koernke(2) K ER N IH K
+koester K OW S T ER
+koesters K OW S T ER Z
+koestler K OW S AH L ER
+koestler(2) K OW S L ER
+koestner K OW S T N ER
+koether K OW DH ER
+koetje K OW T JH
+koetter K OW T ER
+koetting K OW T IH NG
+koff K AO F
+koffler K AA F AH L ER
+koffler(2) K AA F L ER
+koffman K AO F M AH N
+kofi K OW F IY
+kofler K OW F AH L ER
+kofler(2) K OW F L ER
+kofoed K OW F OW D
+kofron K AA F R AH N
+kofu K OW F UW
+koga K OW G AH
+kogan K OW G AH N
+kogel K OW G AH L
+koger K OW G ER
+kogi K OW G IY
+kogler K OW G AH L ER
+kogler(2) K OW G L ER
+koglin K AA G L IH N
+kogut K OW G AH T
+kogyo K OW JH Y OW
+koh K OW
+kohan K OW HH AA N
+kohen K OW AH N
+kohl K OW L
+kohl's K OW L Z
+kohlbeck K OW L B EH K
+kohlberg K OW L B ER G
+kohlberg's K OW L B ER G Z
+kohlenberg K OW L AH N B ER G
+kohler K OW L ER
+kohles K OW HH AH L Z
+kohlhepp K OW L HH IH P
+kohlhoff K OW L HH AO F
+kohli K OW L IY
+kohlman K OW L M AH N
+kohlmann K OW L M AH N
+kohlmeier K OW L M AY ER
+kohlmeyer K OW L M AY ER
+kohlrabi K AO L R AA B IY
+kohls K OW L Z
+kohn K AA N
+kohne K OW N
+kohnen K OW N AH N
+kohner K OW N ER
+kohnke K AA NG K
+kohout K OW AW T
+kohr K AO R
+kohring K AO R IH NG
+kohrs K AO R Z
+kohtaro K OW T AA R OW
+kohtoro K OW T AO R OW
+kohut K OW AH T
+koichi K OW IY CH IY
+koido K OY D OW
+koike K OY K
+koito K OY T OW
+koito(2) K OW IY T OW
+koivisto K OY V IH S T OW
+kojak K OW JH AE K
+koji K OW JH IY
+kojima K AH Y AY M AH
+kok K AA K
+kokan K OW K AH N
+kokan's K OW K AH N Z
+kokate K OW K AA T EY
+kokate's K OW K AA T EY Z
+koke K OW K
+koken K OW K AH N
+koker K OW K ER
+kokes K OW K S
+kokesh K AA K IH SH
+koki K OW K IY
+kokinda K AH K IH N D AH
+koko K OW K OW
+koko's K OW K OW Z
+kokomo K OW K AH M OW
+kokoschka K AH K AO SH K AH
+kokoszka K AH K AA SH K AH
+kokusai K AA K Y UW S AY
+kol K OW L
+kolakowski K AH L AH K AO F S K IY
+kolander K AA L AH N D ER
+kolar K OW L ER
+kolarik K AH L AA R IH K
+kolasa K AH L AA S AH
+kolasinski K AH L AH S IH N S K IY
+kolb K OW L B
+kolbe K OW L B
+kolbeck K AA L B EH K
+kolber K OW L B ER
+kolberg K OW L B ER G
+kolbert K OW L B ER T
+kolbo K OW L B OW
+kolden K OW L D AH N
+kole K OW L
+kolek K OW L EH K
+kolenda K AH L EH N D AH
+kolesar K AH L EH S ER
+kolich K AA L IH HH
+kolin K OW L IH N
+kolinski K AH L IH N S K IY
+kolk K OW K
+kolka K OW L K AH
+kolker K OW K ER
+koll K AA L
+kollar K AA L ER
+kollasch K AA L AH SH
+kollath K AA L AH TH
+kolle K AA L
+kollek K AO L EH K
+kollek(2) K OW L EH K
+koller K AA L ER
+kolli K AA L IY
+kolling K AA L IH NG
+kollman K AA L M AH N
+kollmann K AA L M AH N
+kollmeyer K AA L M AY ER
+kollmorgen K OW L M AO R G AH N
+kollmorgen(2) K AO L M AO R G AH N
+kolm K OW M
+kolman K AA L M AH N
+kolodny K AH L AA D N IY
+kolodziej K AH L AA D Z IY JH
+kolodziejski K AH L AA JH IY EY S K IY
+kolojejchick K OW L OW JH EY CH IH K
+kolokoff K AA L AH K AO F
+koloski K AH L AW S K IY
+kolowich K AA L AH W IH CH
+kolp K OW L P
+kolski K OW L S K IY
+kolsky K OW L S K IY
+kolstad K OW L S T AH D
+kolter K OW L T ER
+kolterman K OW L T ER M AH N
+kolton K OW L T AH N
+kolts K OW L T S
+koltz K OW L T S
+komaba K OW M AA B AH
+komag K OW M AE G
+koman K OW M AH N
+komansky K OW M AE N S K IY
+komar K OW M ER
+komara K OW M AA R AH
+komarek K OW M AA R EH K
+komarik K OW M AA R IH K
+komarik's K OW M AA R IH K S
+komatani K AO M AH T AA N IY
+komatsu K OW M AA T S UW
+kombat K AA M B AE T
+komer K OW M ER
+komercni K OW M ER CH N IY
+komi K OW M IY
+komine K OW M AY N
+komineft K AA M IH N EH F T
+kominek K AO M AH N EH K
+komisar K AH M IH S ER
+komisar(2) K AA M IH S AA R
+kommer K AA M ER
+komodo K AH M OW D OW
+komodo(2) K OW M OW D OW
+komori K OW M AO R IY
+komorny K OW M AO R N IY
+komorowski K AH M ER AO F S K IY
+komoto K OW M OW T OW
+komp K AA M P
+kompanek K AA M P AA N EH K
+komsomol K AA M S OW M AH L
+komsomol's K AA M S OW M AH L Z
+komura K OW M UH R AH
+kon K AA N
+kona K OW N AH
+konaga K AH N AA G AH
+konarski K AH N AA R S K IY
+konczal K AA N CH AH L
+kondas K AA N D AH Z
+kondo K AA N D OW
+kondracki K AH N D R AA T S K IY
+kondrat K AA N D R AH T
+konecny K AH N EH K N IY
+konen K AA N AH N
+kong K AO NG
+kong's K AO NG Z
+kong's(2) K AO NG G Z
+kong(2) K AO NG G
+konger K AA NG G ER
+kongers K AA NG G ER Z
+kongsberg K AO NG Z B ER G
+kongsberg's K AO NG Z B ER G Z
+kongsberg's(2) K AO NG G Z B ER G Z
+kongsberg(2) K AO NG G Z B ER G
+konica K AA N IH K AH
+konicek K AA N IH CH EH K
+konicki K AH N IH T S K IY
+konieczka K AH N IY CH K AH
+konieczny K AH N IY CH N IY
+konig K AA N IH G
+koning K OW N IH NG
+koninklijke K AA N IH NG K L IY K IY
+konishi K OW N IY SH IY
+konishiroku K AA N IH SH IH R OW K UW
+konitzer K AA N IH T Z ER
+konkel K AA NG K AH L
+konkle K AA NG K AH L
+konkol K AA NG K AO L
+konner K AA N ER
+kono K OW N OW
+konold K AA N OW L D
+konop K OW N AH P
+konopka K AH N OW P K AH
+konrad K AA N R AH D
+konrath K AA N R AH TH
+konstantin K AA N S T IH N T IY N
+konsultat K AA N S AH L T AA T
+kontos K AA N T OW Z
+kontra K AA N T R AH
+kontras K AA N T R AH S
+kontrollbank K AA N T R AH L B AE NG K
+konwinski K AH N V IH N S K IY
+konz K AA N Z
+konzen K AA N Z AH N
+konzi K AA N Z IY
+konzi's K AA N Z IY Z
+koo K UW
+koob K UW B
+koogler K UW G L ER
+kooi K UW IY
+kooiker K UW IH K ER
+kooiman K UW IH M AH N
+kooistra K UW IH Z T R AH
+kook K UW K
+kooken K UW K AH N
+kooker K UH K ER
+kooks K UW K S
+kooky K UW K IY
+kool K UW L
+koolhaas K UW L HH AA S
+koon K UW N
+koon's K UW N Z
+koonce K UW N S
+koone K UW N
+koonig K UW N IH G
+kooning K UW N IH NG
+koons K UW N Z
+koonts K UW N T S
+koontz K UW N T S
+koop K UW P
+koop's K UW P S
+koopman K UW P M AH N
+koopmann K UW P M AH N
+koops K UW P S
+koor K UW R
+koors K UH R Z
+koos K UW Z
+kooser K UW Z ER
+kootenay K UW T AH N EY
+kooy K UW IY
+kooyman K AA OY M AH N
+kopacz K AA P AH CH
+kopas K OW P AH Z
+kopchev K AA P CH AH V
+kopczynski K AH P CH IH N S K IY
+kope K OW P
+kopec K OW P IH K
+kopecky K AH P EH T S K IY
+kopek K OW P AH K
+kopeks K OW P AH K S
+kopel K OW P AH L
+kopelman K OW P AH L M AH N
+koper K OW P ER
+kopera K AH P IH R AH
+koperski K AH P ER S K IY
+kopetski K AH P EH T S K IY
+kopf K AO P F
+kopinski K AH P IH N S K IY
+kopischke K AH P IH SH K IY
+kopit K AA P IH T
+kopka K OW P K AH
+kopke K OW P K
+kopko K OW P K OW
+koplan K AA P L AH N
+koplin K AA P L IH N
+koplovitz K AA P L AH V IH T S
+kopp K AA P
+koppe K AA P
+koppel K AA P AH L
+koppel's K AA P AH L Z
+koppell K AA P AH L
+koppelman K AA P AH L M AH N
+koppen K AA P AH N
+koppenhaver K AA P IH N HH AH V ER
+kopper K AA P ER
+koppers K AA P ER Z
+koppers' K AA P ER Z
+koppes K AA P S
+kopple K AA P AH L
+kopplin K AA P L IH N
+kopriva K AA P R IH V AH
+koprowski K AH P R AO F S K IY
+kops K AA P S
+kopusovic K AH P UW S AH V IH K
+kopy K AA P IY
+kora K AO R AH
+koral K AO R AH L
+koran K AO R AA N
+koranda K ER AE N D AH
+koranic K AO R AE N IH K
+korb K AO R B
+korba K AO R B AH
+korbel K AO R B AH L
+korber K AO R B ER
+korbren K AO R B R EH N
+korby K AO R B IY
+korczak K AO R CH AE K
+korda K AO R D AH
+kordell K AO R D EH L
+korea K AO R IY AH
+korea's K AO R IY AH Z
+korea's(2) K R IY AH Z
+korea's(3) K ER R IY AH Z
+korea(2) K R IY AH
+korea(3) K ER R IY AH
+koreagate K AO R IY AH G EY T
+koreagate(2) K ER R IY AH G EY T
+korean K AO R IY AH N
+korean's K R IY AH N Z
+korean's(2) K ER IY AH N Z
+korean(2) K R IY AH N
+korean(3) K ER R IY AH N
+koreans K AO R IY AH N Z
+koreans' K AO R IY AH N Z
+koreans'(2) K R IY AH N Z
+koreans'(3) K ER R IY AH N Z
+koreans(2) K R IY AH N Z
+koreans(3) K ER R IY AH N Z
+koreas K AO R IY AH Z
+koreas(2) K R IY AH Z
+koreas(3) K ER R IY AH Z
+koreatown K ER IY AH T AW N
+korell K AO R EH L
+koren K AO R AH N
+korenek K AO R IH N IH K
+koresh K AO R EH SH
+koresh's K AO R EH SH AH Z
+koret K AO R AH T
+korey K AO R IY
+korf K AO R F
+korff K AO R F
+korfhage K AO R F HH IH JH
+korhonen K AO R HH AH N AH N
+korinek K AO R IH N IH K
+korman K AO R M AH N
+kormos K AO R M OW Z
+korn K AO R N
+kornacki K ER N AA T S K IY
+kornberg K AO R N B ER G
+kornblum K AO R N B L AH M
+kornbluth K AO R N B L UW TH
+kornegay K AO R N IH G EY
+korner K AO R N ER
+kornfeld K AO R N F EH L D
+kornhauser K AO R N HH AW Z ER
+kornreich K AO R N R AY K
+korns K AO N Z
+korol K AO R AO L
+korologos K AO R AA L OW G OW S
+korona K ER OW N AH
+korotich K AO R AH T IH CH
+korpela K ER P IY L AH
+korpi K AO R P IY
+korry K AO R IY
+korry's K AO R IY Z
+korson K AO R S AH N
+kort K AO R T
+korte K AO R T
+korten K AO R T AH N
+korth K AO R TH
+korthals K AO R TH AH L Z
+kortman K AO R T M AH N
+kortum K AO R T AH M
+kortz K AO R T S
+koruna K AO R UW N AH
+korver K AO R V ER
+kory K AO R IY
+koryagin K AO R Y AA G IH N
+korzeniewski K ER Z IH N IY EH F S K IY
+korzeniewski(2) K AO R Z AH N UW F S K IY
+kos K AA S
+kosa K OW S AH
+kosak K OW S AH K
+kosakowski K AH S AH K AO F S K IY
+kosan K OW Z AH N
+kosanke K AA S AH NG K
+kosanovich K AH S AE N AH V IH CH
+kosar K OW S ER
+kosberg K AO Z B ER G
+kosbie K AA Z B IY
+kosch K AO SH
+koscheck K AO S CH EH K
+koscheck's K AO S CH EH K S
+koscielniak K AH S CH IY L N IY AE K
+koscinski K AH S CH IH N S K IY
+kosco K OW S K OW
+kosecoff K OW S AH K AO F
+kosek K OW S EH K
+kosel K OW S AH L
+koser K OW Z ER
+kosh K AA SH
+kosher K OW SH ER
+koshered K OW SH ER D
+koshering K OW SH ER IH NG
+koshers K OW SH ER S
+kosiba K OW S IY B AH
+kosier K OW S IY ER
+kosik K OW S IH K
+kosin K OW S IH N
+kosinski K AH S IH N S K IY
+koska K OW S K AH
+koskela K AH S K IY L AH
+koskey K AA S K IY
+koski K AW S K IY
+koskinen K AA S K IH N AH N
+kosko K OW S K OW
+koskotas K AO S K OW T AH S
+kosky K AA S K IY
+kosloski K AH S L AW S K IY
+koslosky K AH S L OW S K IY
+koslow K AA S L OW
+koslow's K AA Z L OW Z
+koslowski K AH S L AO F S K IY
+kosman K AA S M AH N
+kosmatka K AH S M AA T K AH
+kosmetsky K AA Z M EH T S K IY
+kosmetsky's K AA Z M EH T S K IY Z
+kosmicki K AH S M IH T S K IY
+kosnovsky K AA Z N AA F S K IY
+kosnovsky's K AA Z N AA F S K IY Z
+kosovo K OW S OW V OW
+kosowski K AH S AO F S K IY
+kosowsky K AH S AW S K IY
+koss K AO S
+kossman K AO S M AH N
+kossow K AA S OW
+kossuth K AA S AH TH
+kost K AA S T
+kosta K OW S T AH
+kostal K AA S T AH L
+kostas K OW S T AH Z
+kostecki K AH S T EH T S K IY
+kostek K AA S T EH K
+kostelecky K AH S T EH L EH T S K IY
+kostelnik K AH S T EH L N IH K
+koster K AA S T ER
+kostic K AA S T IH K
+kostick K OW S T IH K
+kostka K AA S T K AH
+kostmayer K AO S T M EY ER
+kostoff K AA S T AO F
+kostrzewa K AH S T R AH Z UW AH
+kostrzewski K AO S T ER Z EH F S K IY
+kosub K OW S AH B
+kosy K OW S IY
+kosyakov K OW S Y AH K AA V
+kosygin K OW S IH G IH N
+kosygin(2) K OW S IY G IH N
+kot K AA T
+kotara K OW T AA R AH
+kotarski K AH T AA R S K IY
+kotas K OW T AH Z
+kotch K AA CH
+kote K OW T
+kotecki K AH T EH T S K IY
+kotek K OW T EH K
+koteles K AA T EH L EH Z
+koth K AA TH
+kothari K AA TH ER IY
+kothe K OW DH
+kotila K AH T AY L AH
+kotlarz K AA T L ER Z
+kotler K OW T AH L ER
+kotler(2) K AA T L ER
+kotlowitz K AA T L AH W IH T S
+koto K OW T OW
+kotowski K AH T AO F S K IY
+kotsonis K AE T S OW N AH S
+kotsonis' K AE T S OW N AH S
+kotsonis'(2) K OW T S OW N AH S
+kotsonis's K AE T S OW N AH S IH Z
+kotsonis's(2) K OW T S OW N AH S IH Z
+kotsonis(2) K OW T S OW N AH S
+kott K AA T
+kotter K AA T ER
+kottke K AA T K IY
+kottler K AA T L ER
+kottwitz K AA T W IH T S
+kotula K AH T UW L AH
+kotz K AA T S
+kotzebue K AA T S AH B Y UW
+kouba K UW B AH
+koudelka K AW D EH L K AH
+kough K AW
+kouns K AW N Z
+kountz K AW N T S
+kouri K OW UH R IY
+kouril K UW R AH L
+kourou K UW R UW
+koury K AW R IY
+kouyate K AW Y AA T EY
+kovac K OW V AH K
+kovacevic K AH V AH CH EH V IH K
+kovacevich K AH V AA CH IH V IH CH
+kovach K OW V AA K
+kovach's K OW V AA K S
+kovacic K AH V AA K IH K
+kovacich K AH V AA CH IH HH
+kovacik K AA V AH CH IH K
+kovack K AA V AH K
+kovacs K OW V AE K S
+kovaks K OW V AE K S
+koval K OW V AH L
+kovalchik K AH V AA L HH IH K
+kovalcik K AA V AH L CH IH K
+kovaleski K AH V AH L EH S K IY
+kovalik K AH V AA L IH K
+kovalsky K AH V AA L S K IY
+kovalyov K OW V AA L Y AH V
+kovar K OW V ER
+kovarik K AH V AA R IH K
+kovatch K AA V AH CH
+kovats K OW V AH T S
+koven K OW V AH N
+kover K OW V ER
+koversada K AH V ER S AA T AH
+kovich K AA V IH CH
+kowabunga K AW AH B AH NG G AH
+kowal K AW AH L
+kowalchuk K AW AA L HH AH K
+kowalczyk K AW AH L CH IH K
+kowaleski K AW AH L EH S K IY
+kowalewski K AW AH L EH F S K IY
+kowalik K AW AA L IH K
+kowalke K AA W AO K
+kowalkowski K AA W AO K AO F S K IY
+kowall K AW AH L
+kowalski K AH W AA L S K IY
+kowalsky K AW AA L S K IY
+kowitz K AA W IH T S
+kownacki K AW N AA K IY
+kowtow K AW T AW
+kowtow(2) K OW T OW
+koyama K OW Y AA M AH
+koyo K OY OW
+koza K OW Z AH
+kozak K OW Z AH K
+kozakiewicz K AH Z AA K AH V IH CH
+kozar K OW Z ER
+kozberg K AA Z B ER G
+kozel K OW Z AH L
+kozemchak K OW Z EH M CH AE K
+kozicki K AH Z IH T S K IY
+koziel K AA Z IY L
+kozik K OW Z IH K
+kozikowski K AH Z IH K AO F S K IY
+kozinski K AH Z IH N S K IY
+koziol K AA Z IY AO L
+kozlik K AA Z L IH K
+kozloff K AA Z L AO F
+kozloski K AH Z L AW S K IY
+kozlow K AA Z L OW
+kozlowski K AH Z L AO F S K IY
+kozma K OW Z M AH
+kozminski K AH Z M IH N S K IY
+koznovsky K AA Z N AA F S K IY
+koznovsky's K AA Z N AA F S K IY Z
+kozo K OW Z OW
+kozol K OW Z AH L
+kozub K OW Z AH B
+kozuch K AA Z AH HH
+kozyrev K AA Z ER EH V
+kozyrev's K AA Z ER EH V Z
+kraai K R AA IY
+kraatz K R AA T S
+krabbe K R AE B
+krabbenhoft K R AE B IH N HH AH F T
+krabill K R AE B AH L
+krach K R AE CH
+kracht K R AE K T
+krack K R AE K
+kracke K R AE K
+kraeger K R EH G ER
+kraemer K R EH M ER
+kraeutler K R AW T L ER
+krafft K R AE F T
+kraft K R AE F T
+kraft's K R AE F T S
+kraftwerk K R AE F T W ER K
+krage K R EY JH
+krager K R EY G ER
+kragh K R AE G
+kragt K R AE G T
+krah K R AA
+krahenbuhl K R AA IH N B AH L
+krahl K R AA L
+krahn K R AE N
+krain K R EY N
+krajewski K R AY EH F S K IY
+krajicek K R AY IH CH EH K
+krajina K R AY N AH
+krajina's K R AY N AH Z
+krajina's(2) K R AY IY N AH Z
+krajina(2) K R AY IY N AH
+kraker K R EY K ER
+krakow K R AA K AW
+krakow(2) K R AA K AA V
+krakow(3) K R AE K AW
+krakower K R AE K OW ER
+krakowski K R AH K AO F S K IY
+kral K R AE L
+kralicek K R AA L IH CH EH K
+kralik K R AA L IH K
+krall K R AO L
+kram K R AE M
+kramar K R AE M ER
+kramer K R EY M ER
+kramer's K R EY M ER Z
+kramlich K R AE M L IH K
+kramm K R AE M
+kramme K R AE M
+krammer K R AE M ER
+krammes K R AE M Z
+kramp K R AE M P
+krampe K R AE M P
+krandall K R AE N D AH L
+krane K R EY N
+kraner K R EY N ER
+kranich K R AE N IH CH
+krans K R AE N Z
+krantz K R AE N T S
+kranz K R AE N Z
+kranzler K R AE N Z L ER
+krapels K R AE P AH L Z
+krapf K R AE P F
+krapp K R AE P
+kraprayoon K R AE P R AA Y UW N
+kras K R AE S
+krasinski K R AH S IH N S K IY
+kraska K R AA S K AH
+krasner K R AE S N ER
+krasnoff K R AE S N AO F
+krasnow K R AA S N OW
+krasnoyarsk K R AE S N OY AA R S K
+krasny K R AE Z N IY
+krasowski K R AH S AO F S K IY
+krass K R AE S
+kraszewski K R AH SH EH F S K IY
+krat K R AE T
+kratky K R AE T K IY
+kratochvil K R AE T AH K V AH L
+kratt K R AE T
+kratz K R AE T S
+kratzer K R EY T Z ER
+kratzke K R AE T S K IY
+krauer K R AW R
+kraus K R AW S
+krause K R AO S
+krauser K R AW S ER
+kraushaar K R AW SH AA R
+krauskopf K R AW S K AO F
+krauss K R AW S
+krausse K R AO S
+krausz K R AW SH
+kraut K R AW T
+krauter K R AW T ER
+krauth K R AO TH
+krauthammer K R AW T HH AE M ER
+krauze K R AW Z
+kravchuk K R AA V CH UH K
+kravchuk's K R AA V CH UH K Z
+kravetz K R AE V IH T S
+kravis K R AE V IH S
+kravitz K R AE V IH T S
+krawccykiewi K R AW CH IH K UW IY
+krawchuk K R AO CH AH K
+krawczak K R AA V CH AE K
+krawczyk K R AA V CH IH K
+krawiec K R AA V IY K
+krawitz K R AA W IH T S
+kray K R EY
+kraynak K R EY N AH K
+kreager K R IY G ER
+kreamer K R IY M ER
+krebbs K R EH B Z
+krebs K R EH B Z
+krebs's K R EH B Z IH Z
+krebsbach K R EH B Z B AA K
+krech K R EH K
+krecko K R EH K OW
+kredietbank K R EH D IY T B AE NG K
+kredit K R EH T IH T
+kreditanstalt K R EH D IH T AH N S T AO L T
+kreeger K R IY G ER
+kreft K R EH F T
+kreg K R EH G
+kregel K R EH G AH L
+kreger K R IY G ER
+kreh K R EH
+krehbiel K R EH B IY L
+kreher K R EH R
+kreicher K R AY K ER
+kreider K R AY D ER
+kreidler K R AY D AH L ER
+kreidler(2) K R AY D L ER
+kreifels K R AY F AH L Z
+kreig K R IY G
+kreiger K R AY G ER
+kreiling K R AY L IH NG
+kreimer K R AY M ER
+krein K R EY N
+kreiner K R AY N ER
+kreis K R IY Z
+kreisberg K R AY S B ER G
+kreischer K R AY SH ER
+kreisel K R AY S AH L
+kreiser K R AY S ER
+kreisher K R IY IH SH ER
+kreisler K R AY S L ER
+kreisman K R AY S M AH N
+kreiss K R AY S
+kreiter K R AY T ER
+kreitman K R AY T M AH N
+kreitner K R AY T N ER
+kreitz K R IY T S
+kreitzberg K R AY T S B ER G
+kreitzer K R AY T Z ER
+krejci K R EH JH S IY
+krell K R EH L
+kremer K R IY M ER
+kremers K R IY M ER Z
+kremlin K R EH M L AH N
+kremlin's K R EH M L IH N Z
+kremlin(2) K R EH M L IH N
+kremlinologist K R EH M L IH N AA L AH JH IH S T
+kremlinologists K R EH M L IH N AA L AH JH IH S T S
+kremlinologists(2) K R EH M L IH N AA L AH JH IH S S
+kremlinologists(3) K R EH M L IH N AA L AH JH IH S
+krempa K R EH M P AH
+krempasky K R IH M P AA S K IY
+krempler K R EH M P L ER
+kremplers K R EH M P L ER Z
+kren K R EH N
+krenek K R EH N IH K
+krengel K R EH NG G AH L
+krenik K R EH N IH K
+krenke K R EH NG K
+krenn K R EH N
+krentz K R EH N T S
+krenwinkle K R EH N W IH NG K AH L
+krenwinkle's K R EH N W IH NG K AH L Z
+krenz K R EH N Z
+krenzer K R EH N Z ER
+krepps K R EH P S
+kreps K R EH P S
+kresa K R IY S ER
+kresge K R EH S G IY
+kreslovsky K R EH S L AO V S K IY
+kress K R EH S
+kresse K R EH S
+kresser K R EH S ER
+kressin K R EH S IH N
+kressler K R EH S L ER
+kretchman K R EH CH M AH N
+kretchmer K R EH CH M ER
+kretsch K R EH CH
+kretschmar K R EH CH M ER
+kretschmer K R EH CH M ER
+kretz K R EH T S
+kretzer K R EH T Z ER
+kretzschmar K R EH CH M ER
+kreuger K R OY G ER
+kreul K R UW L
+kreuser K R OY S ER
+kreuter K R OY T ER
+kreutz K R UW T S
+kreuzer K R UW Z ER
+krewson K R UW S AH N
+krey K R EY
+kribs K R IH B Z
+krichbaum K R IH K B AW M
+krick K R IH K
+krider K R AY D ER
+kridler K R IH D L ER
+kriebel K R IY B AH L
+krieg K R IY G
+kriegel K R IY G AH L
+krieger K R IY G ER
+krieger's K R IY G ER Z
+krienke K R IY NG K
+krier K R AY ER
+kriese K R IY Z
+kriesel K R IY S AH L
+kriete K R IY T
+krigbaum K R IH G B AW M
+kriger K R AY G ER
+krigsten K R IH G S T IH N
+krikalev K R IH K AH L EH V
+krikalev's K R IH K AH L EH V Z
+krikorian K R IH K AO R IY AH N
+krill K R IH L
+krim K R IH M
+kriminyok K R IH M IH N Y AO K
+krimmel K R IH M AH L
+kriner K R AY N ER
+kring K R IH NG
+kringen K R IH NG AH N
+kringley K R IH NG G L IY
+krings K R IH NG Z
+krinke K R IH NG K
+krinsky K R IH N S K IY
+kris K R IH S
+krisch K R IH SH
+krischer K R IH SH ER
+krise K R AY Z
+krisher K R IH SH ER
+krishna K R IH SH N AH
+krishna(2) K R IY SH N AH
+krishnan K R IH SH N AH N
+krisko K R IH S K OW
+krispies K R IH S P IY Z
+kriss K R IH S
+krist K R IH S T
+krista K R IH S T AH
+kristall K R IH S T AH L
+kristallnacht K R IH S T AH L N AA K T
+kristen K R IH S T AH N
+kristensen K R IH S T AH N S AH N
+kristi K R IH S T IY
+kristi's K R IH S T IY Z
+kristiansen K R IH S CH AH N S AH N
+kristie K R IH S T IY
+kristin K R IH S T IH N
+kristina K R IH S T IY N AH
+kristine K R IH S T IY N
+kristof K R IH S T AH F
+kristoff K R IH S T AO F
+kristoffe K R IH S T AO F
+kristofferson K R IH S T AO F ER S AH N
+kristol K R IH S T AH L
+kristol's K R IH S T AH L Z
+kristopher K R IH S T AH F ER
+kristopher's K R IH S T AH F ER Z
+kristy K R IH S T IY
+kritz K R IH T S
+kritzer K R IH T Z ER
+krivanek K R IH V AH N IH K
+kriz K R IH Z
+krizan K R IH Z AH N
+krizek K R IH Z EH K
+krob K R AA B
+kroboth K R AA B AH TH
+kroc K R AA K
+kroc's K R AA K S
+krock K R AA K
+kroeber K R OW B ER
+kroeber's K R OW B ER Z
+kroeger K R OW G ER
+kroeger's K R OW G ER Z
+kroegers K R OW G ER Z
+kroeker K R OW K ER
+kroener K R OW N ER
+kroening K R AA AH N IH NG
+kroenke K R OW NG K
+kroes K R OW Z
+kroese K R OW S
+kroeze K R OW Z
+kroft K R AA F T
+krog K R AA G
+kroger K R OW G ER
+kroger's K R OW G ER Z
+krogh K R OW
+krogman K R AA G M AH N
+krogstad K R AA G S T AH D
+kroh K R OW
+krohn K R OW N
+krok K R AA K
+krol K R AO L
+krolak K R OW L AH K
+krolczyk K R OW L CH IH K
+krolick K R AA L IH K
+krolikowski K R AH L IH K AO F S K IY
+kroll K R AO L
+krom K R AA M
+krome K R OW M
+kromer K R OW M ER
+kromm K R AA M
+kron K R AA N
+krona K R OW N AH
+kronberg K R AA N B ER G
+krone K R OW N AH
+kronen K R OW N AH N
+kronenberg K R AA N AH N B ER G
+kronenberger K R AA N AH N B ER G ER
+kroner K R OW N ER
+kronick K R AA N IH K
+kronish K R AA N IH SH
+kronk K R AA NG K
+kronor K R OW N ER
+kronos K R OW N OW S
+krontz K R AA N T S
+kroon K R UW N
+kropf K R AA P F
+kropp K R AA P
+kross K R AO S
+krossel K R AO S AH L
+krotkov K R AO T K AO V
+krotz K R AA T S
+krotzer K R OW T Z ER
+krouner K R UW N ER
+kroupa K R UW P AH
+krouse K R AW S
+krout K R AW T
+krowe K R OW
+krowitz K R AW IH T S
+kroy K R OY
+kruchten K R AH K T AH N
+kruck K R AH K
+kruckeberg K R AH K B ER G
+kruckenberg K R AH K AH N B ER G
+kruczek K R AH CH EH K
+krudman K R AH D M AH N
+krudman's K R AH D M AH N Z
+krueger K R UW G ER
+kruer K R UW ER
+krug K R AH G
+kruger K R UW G ER
+krugerrand K R UW G EH R AE N D
+krugh K R AH
+krugman K R AH G M AH N
+kruk K R AH K
+krukowski K R AH K AO F S K IY
+krul K R AH L
+krull K R AH L
+krulwich K R AH L W IH CH
+krum K R AH M
+krumholz K R AH M HH OW L Z
+krumm K R AH M
+krumme K R AH M
+krummel K R AH M AH L
+krummel's K R AH M AH L Z
+krumrey K R AH M R IY
+krumwiede K R AH M W IY D
+krupa K R UW P AH
+krupicka K R UW P IH K AH
+krupinski K R AH P IH N S K IY
+krupka K R AH P K AH
+krupman K R AH P M AH N
+krupnick K R AH P N IH K
+krupp K R AH P
+krupp's K R AH P S
+kruppa K R AH P AH
+krupski K R AH P S K IY
+krus K R AH S
+kruschev K R UW S CH EH V
+kruschke K R AH SH K
+kruse K R UW Z
+krusemark K R AH S IH M AA R K
+krusinski K R AH S IH N S K IY
+kruszewski K R AH SH EH F S K IY
+kruszka K R AH SH K AH
+kruszynski K R AH SH IH N S K IY
+krutick K R UW T IH K
+krutsinger K R AH T S IH N JH ER
+kruttschnitt K R AH CH N IH T
+krutz K R AH T S
+kruzel K R UW Z AH L
+krych K R IH CH
+kryder K R AY D ER
+kryger K R AY G ER
+krygier K R AY G IY ER
+krypton K R IH P T AA N
+kryptos K R IH P T OW S
+krysiak K R IH S IY AE K
+krystal K R IH S T AH L
+krzeminski K R IH M IH N S K IY
+krzysztof K R IY S T AO F
+krzysztof(2) K R IY SH T AO F
+krzywicki K R IH V IH T S K IY
+krzyzanowski K R IH Z AH N AO F S K IY
+ksiazek K AH S IY AA Z EH K
+ku K UW
+kuala K W AA L AH
+kuan K W AA N
+kuba K Y UW B AH
+kubacki K AH B AA T S K IY
+kubala K AH B AA L AH
+kubala(2) K UW B AA L AH
+kuban K Y UW B AH N
+kubas K UW B AH Z
+kubat K UW B AH T
+kube K Y UW B
+kubena K AH B IY N AH
+kuberski K AH B ER S K IY
+kubes K Y UW B Z
+kubiak K UW B IY AE K
+kubic K Y UW B IH K
+kubica K Y UW B IH K AH
+kubicek K AH B IH CH EH K
+kubick K Y UW B IH K
+kubicki K AH B IH T S K IY
+kubik K Y UW B IH K
+kubin K Y UW B IH N
+kubinski K AH B IH N S K IY
+kubis K UW B IH S
+kubisiak K AH B IH S IY AE K
+kubitz K Y UW B IH T S
+kubler K Y UW B AH L ER
+kubler(2) K Y UW B L ER
+kubly K AH B L IY
+kubo K Y UW B OW
+kubota K UW B OW T AH
+kubrick K Y UW B R IH K
+kubrick's K Y UW B R IH K S
+kuby K Y UW B IY
+kuc K AH K
+kucan K Y UW K AH N
+kucera K AH CH IH R AH
+kucewicz K Y UW S IH W IH T S
+kuch K AH CH
+kuchar K AH K ER
+kucharski K AH CH AA R S K IY
+kuchenbecker K AH K IH N B EH K ER
+kucher K AH K ER
+kuchera K AH CH ER AH
+kuchera(2) K UW CH EH R AH
+kuchinski K AH CH IH N S K IY
+kuchinsky K AH CH IH N S K IY
+kuchler K AH K AH L ER
+kuchler(2) K AH K L ER
+kuchma K UW CH M AH
+kuchma's K UW CH M AH Z
+kuchta K AH CH T AH
+kucinski K AH CH IH N S K IY
+kuck K AH K
+kuczek K AH CH EH K
+kuczynski K AH CH IH N S K IY
+kuder K Y UW D ER
+kudla K AH D L AH
+kudlow K AH D L OW
+kudner K AH D N ER
+kudos K UW D OW S
+kudrna K AH D ER N AH
+kudzu K AH D Z UW
+kuebler K UH B AH L ER
+kuebler(2) K UH B L ER
+kuechler K UH K AH L ER
+kuechler(2) K UH K L ER
+kueck K UW K
+kuecker K UH K ER
+kuehl K UH L
+kuehler K UH L ER
+kuehn K UW N
+kuehne K UW N
+kuehnel K UH N AH L
+kuehner K UH N ER
+kuehnle K UH N AH L
+kueker K UH K ER
+kuenheim K Y UW AH N HH AY M
+kuennen K UH N AH N
+kuenstler K UH N S AH L ER
+kuenstler(2) K UH N S L ER
+kuenzel K UH N Z AH L
+kuenzi K UW EY N Z IY
+kuenzli K UH N Z L IY
+kuester K UH S T ER
+kuether K UH DH ER
+kufahl K AH F AA L
+kuffel K AH F AH L
+kuffner K AH F N ER
+kugel K UW G AH L
+kugelman K AH G AH L M AH N
+kugler K UW G AH L ER
+kugler(2) K UW G L ER
+kuhar K UW ER
+kuhl K AH L
+kuhle K UW AH L
+kuhlenschmidt K Y UW L AH N SH M IH T
+kuhlman K UW L M AH N
+kuhlmann K UW L M AH N
+kuhn K UW N
+kuhne K AH N
+kuhner K UW N ER
+kuhnert K UW N ER T
+kuhnke K AH NG K
+kuhnle K AH N AH L
+kuhns K UW N Z
+kuhr K ER
+kuhrt K ER T
+kuiken K UW K AH N
+kuiper K UW P ER
+kuipers K UW P ER Z
+kujala K AY AA L AH
+kujawa K UW JH AA W AH
+kujawski K AH Y AA F S K IY
+kuk K AH K
+kuker K Y UW K ER
+kukje K UW K Y IH
+kukje(2) K UW K JH EY
+kukje(3) K UW K JH IY
+kukla K AH K L AH
+kuklinski K AH K L IH N S K IY
+kukowski K AH K AO F S K IY
+kukuk K UW K AH K
+kula K UW L AH
+kulaga K UW L AA G AH
+kulakowski K Y UW L AH K AO F S K IY
+kulas K Y UW L AH Z
+kulesa K Y UW L IY S AH
+kulesza K Y UW L EH SH AH
+kulhanek K AH L HH AH N EH K
+kulich K Y UW L IH K
+kulick K Y UW L IH K
+kulig K Y UW L IH G
+kuligowski K Y UW L IH G AO F S K IY
+kulik K Y UW L IH K
+kulikowski K Y UW L IH K AO F S K IY
+kulinski K Y UW L IH N S K IY
+kulis K UW L IH S
+kulish K Y UW L IH SH
+kulka K AH L K AH
+kulkarni K AH L K AA R N IY
+kull K AH L
+kulla K AH L AH
+kullberg K AH L B ER G
+kullman K AH L M AH N
+kully K AH L IY
+kulon K UW L AO N
+kulow K Y UW L OW
+kulp K AH L P
+kulpa K AH L P AH
+kulwicki K AH L V IH T S K IY
+kulzer K AH L Z ER
+kumagai K UW M AA G AA IY
+kumar K UW M AA R
+kumaratunga K UW M AA R AH T AH N G AH
+kumarisami K UW M AA R AH S AA M IY
+kumbaya K UH M B AY Y AH
+kumble K AH M B AH L
+kume K Y UW M
+kumho K AH M HH OW
+kumler K AH M L ER
+kumm K AH M
+kummer K AH M ER
+kumouri K UW M AO R IY
+kumouri's K UW M AO R IY Z
+kump K AH M P
+kumpf K AH M P F
+kumquat K AH M K W AA T
+kun K AH N
+kuna K Y UW N AH
+kunaev K Y UW N EY V
+kunath K AH N AH TH
+kunayev K Y UW N EY AH V
+kunce K AH N S
+kunda K AH N D AH
+kunde K AH N D
+kundera K AH N D EH R AH
+kundert K AH N D ER T
+kundinger K AH N D IH NG ER
+kundrat K AH N D R AH T
+kundun K UH N D AH N
+kunert K Y UW N ER T
+kunes K Y UW N Z
+kunesh K AH N IH SH
+kuney K Y UW N IY
+kung K AH NG
+kunin K Y UW N IH N
+kunio K Y UW N IY OW
+kunka K AH NG K AH
+kunkel K AH NG K AH L
+kunkle K AH NG K AH L
+kunkler K AH NG K L ER
+kuns K AH N Z
+kunselman K AH N S AH L M AH N
+kunsman K AH N S M AH N
+kunst K AH N S T
+kunstler K AH N S T L ER
+kunstler(2) K AH N S L ER
+kuntsler K AH N T S L ER
+kuntz K AH N T S
+kuntze K AH N T Z
+kuntzman K AH N T S M AH N
+kunz K AH N Z
+kunze K AH N Z
+kunzelman K AH N Z AH L M AH N
+kunzler K AH N Z L ER
+kunzman K AH N Z M AH N
+kuo K UW OW
+kuomintang K W OW M IH N T AE NG
+kuomintang's K W OW M IH N T AE NG Z
+kuomintang's(2) G W OW M IH N T AE NG Z
+kuomintang(2) G W OW M IH N T AE NG
+kuow K Y UW OW
+kupek K UW P IH K
+kuper K Y UW P ER
+kuperman K UW P ER M AH N
+kupfer K AH P F ER
+kupferman K AH P F ER M AH N
+kupiec K AH P IY K
+kupka K AH P K AH
+kupor K Y UW P ER
+kupper K AH P ER
+kupres K UW P R AH S
+kuralt K Y ER AO L T
+kuralt's K Y ER AO L T S
+kuramoto K UH R AA M OW T OW
+kuranari K UH R AH N AA R IY
+kuras K UH R AH Z
+kurd K ER D
+kurdish K ER D IH SH
+kurdistan K ER D IH S T AE N
+kurds K ER D Z
+kurdziel K ER D Z IY L
+kurek K Y UW R EH K
+kurian K Y UH R IY AH N
+kuriansky K UH R IY AE N S K IY
+kurihara K UW R IH HH AA R AH
+kuril K ER AH L
+kurilla K ER IH L AH
+kurinsky K Y ER IH N S K IY
+kuriyama K UW R IH Y AA M AH
+kurk K ER K
+kurka K ER K AH
+kurkjian K ER K JH IY AH N
+kurkowski K ER K AO F S K IY
+kurlak K ER L AE K
+kurland K ER L AH N D
+kurlander K ER L AH N D ER
+kurman K ER M AH N
+kurmel K ER M AH L
+kurnit K ER N IH T
+kuroda K ER OW D AH
+kurokawa K UW R OW K AA W AH
+kurosawa K UH R OW S AA W AH
+kurowski K ER AO F S K IY
+kurshikov K ER SH N IH K AO V
+kurshikov(2) K ER SH N IH K AO F
+kurt K ER T
+kurtenbach K ER T IH N B AA K
+kurth K ER TH
+kurtis K ER T IH S
+kurtz K ER T S
+kurtzman K ER T S M AH N
+kuruman K Y UH R UW M AH N
+kurumizowa K UH R UW M IY Z OW AH
+kurumizowa's K UH R UW M IY Z OW AH Z
+kury K Y UW R IY
+kurylo K ER IH L OW
+kurz K ER Z
+kurzawa K UH R Z AA W AH
+kurzban K ER Z B AE N
+kurzweil K ER Z W AY L
+kus K AH S
+kusa K UW Z AH
+kusa(2) K UW S AH
+kusch K AH SH
+kuschel K AH SH AH L
+kuse K Y UW Z
+kusek K UW S EH K
+kusel K UW S AH L
+kush K UH SH
+kushner K AH SH N ER
+kushnir K AH SH N ER
+kusiak K AH S IY AE K
+kuske K AH S K
+kusler K AH S AH L ER
+kusler(2) K AH S L ER
+kuss K AH S
+kusserow K AH S ER OW
+kussman K AH S M AH N
+kuster K AH S T ER
+kustra K AH S T R AH
+kut K AH T
+kutch K AH CH
+kutcher K AH CH ER
+kutchna K AH CH N AH
+kuter K Y UW T ER
+kutner K AH T N ER
+kutsch K AH CH
+kutscher K AH CH ER
+kuttab K UW T AE B
+kutter K AH T ER
+kuttner K AH T N ER
+kutuzovsky K UW T AH Z AA V S K IY
+kutz K AH T S
+kutzer K AH T Z ER
+kuvin K UW V IH N
+kuwahara K UW W AA HH AA R AH
+kuwait K UW W EY T
+kuwait's K UW W EY T S
+kuwaiti K UW W EY T IY
+kuwaitis K UW W EY T IY Z
+kuwam K Y UW W AA M
+kuykendall K AY K EH N D AA L
+kuyper K AY P ER
+kuzara K Y UW Z AA R AH
+kuze K Y UW Z
+kuzel K UW Z AH L
+kuzma K AH Z M AH
+kuzminski K AH Z M IH N S K IY
+kuznets K AH Z N EH T S
+kuznia K AH Z N IY AH
+kuzniar K AH Z N Y ER
+kuznicki K AH Z N IH T S K IY
+kvale K AH V EY L
+kvam K AH V AE M
+kvamme K AH V AE M
+kvamme(2) K AH V AA M EY
+kvamme(3) K V AA M EY
+kvant K AH V AA N T
+kvasnicka K AH V AH S N IH S K AH
+kvetch K AH V EH CH
+kvetch(2) K V EH CH
+kveton K AH V EH T AH N
+kvistad K AH V IH S T AE D
+kvitsinsky K AH V IH T S IH N S K IY
+kvitsinsky(2) K V IH T S IH N S K IY
+kwai K W AY
+kwak K W AE K
+kwan K W AA N
+kwang K W AA NG
+kwangju K W AA NG JH UW
+kwangju(2) G W AA NG JH UW
+kwanza K W AA N Z AH
+kwanzaa K W AA N Z AH
+kwasniewski K W AH Z N EH F S K IY
+kwasniewski(2) K W AH Z N UW S K IY
+kwasnik K W AA Z N IH K
+kwasny K W AA Z N IY
+kwazulu K W AA Z UW L UW
+kweisi K W AY Z IY
+kwh K EY D AH B AH L Y UW EY CH
+kwiatek K W IY AA T EH K
+kwiatkowski K W IY AH T K AO F S K IY
+kwiecien K W IY S IY N
+kwiecinski K W IY CH IH N S K IY
+kwik K W IH K
+kwitny K W IH T N IY
+kwok K W AA K
+kwok-shing K W AO K SH IH NG
+kwolek K W OW L EH K
+kwon K W AA N
+kwong K W AO NG
+kyd K IH D
+kyd's K IH D Z
+kyer K AY ER
+kyes K AY Z
+kyger K AY G ER
+kyi K IY
+kyi(2) K EY W AY AY
+kyker K AY K ER
+kyl K AY L
+kyle K AY L
+kyle's K AY L Z
+kyler K AY L ER
+kyles K AY L Z
+kyllo K IH L OW
+kyllonen K IH L AA N AH N
+kym K IH M
+kyna K IH N AH
+kynard K IH N ER D
+kyne K AY N
+kynikos K IH N IY K OW S
+kyo K Y OW
+kyo(2) K IY OW
+kyocera K Y OW S EH R AH
+kyocera(2) K IY OW S EH R AH
+kyodo K Y OW D OW
+kyoko K IY OW K OW
+kyokuto K Y AA K UW T OW
+kyong K Y AO NG
+kyongsang K Y AO NG S AE NG
+kyoshi K IY OW SH IY
+kyoto K Y OW T OW
+kyoung K Y AO NG
+kyoung-min K Y AO NG M IH N
+kyowa K Y OW AH
+kyra K AY R AH
+kyrgyzstan K IH R G IH S T AE N
+kyrgyzstan(2) K IH R G IY S T AA N
+kyron K AY R AH N
+kysar K IH S ER
+kyser K AY S ER
+kysor K AY S ER
+kyte K AY T
+kytril K IH T R IH L
+kyu K Y UW
+kyung K Y AH NG
+kyushu K Y AH SH UW
+kyzar K IH Z ER
+kyzer K AY Z ER
+l EH L
+l'alma L AA L M AH
+l'amour L AE M AO R
+l'eggs L EH G Z
+l'enfant L EH N F AA N T
+l'enfant(2) L AA N F AA N T
+l'espalier L EH S P AE L IY EY
+l'expansion L EH K S P AE N SH AH N
+l'express L EH K S P R EH S
+l'heureux L HH Y UW R UH
+l'oreal L AO R IY AE L
+l's EH L Z
+l. EH L
+l.'s EH L Z
+l.s EH L Z
+la L AA
+la-carre L AA K AA R EY
+la-crosse L AH K R AO S
+la-guardia L AH G W AA R D IY AH
+la-nina L AH N IY N Y AH
+la-paz L AH P AO Z
+la-quinta L AH K W IH N T AH
+laabs L AA B Z
+laack L AA K
+laaco L AA K OW
+laake L AA K
+laakso L AA K S OW
+laas L AA Z
+laatsch L AA CH
+lab L AE B
+lab's L AE B Z
+laba L AA B AH
+labadie L AE B AH D IY
+laban L EY B AH N
+laband L AA B AE N D
+labant L AH B AE N T
+labar L AH B AA R
+labarbera L AA B AA R B EH R AH
+labarge L AE B AA R G
+labarr L AH B AE R
+labarre L AA B AA R EY
+labat L AA B AA T
+labate L AA B EY T
+labaton L AE B AH T AH N
+labatt L AH B AE T
+labatt's L AH B AE T S
+labatt's(2) L AH B AA T S
+labatt(2) L AH B AA T
+labauve L AH B OW V
+labay L AE B EY
+labbe L AE B
+labe L EY B
+labeau L AH B OW
+label L EY B AH L
+label's L EY B AH L Z
+labeled L EY B AH L D
+labeling L EY B AH L IH NG
+labeling(2) L EY B L IH NG
+labell L AH B EH L
+labella L AH B EH L AH
+labelle L AH B EH L
+labelled L EY B AH L D
+labels L EY B AH L Z
+labenski L AA B EH N S K IY
+laber L EY B ER
+laberge L AA B ER G
+labianca L AA B IY AA NG K AH
+labianca's L AA B IY AA NG K AH Z
+labine L AA B IY N IY
+lablanc L AH B L AE NG K
+labo L AA B OW
+laboda L AA B OW D AH
+labombard L AE B AH M B ER D
+labonte L AH B AA N T
+labonte(2) L AH B AA N T IY
+labor L EY B ER
+labor's L EY B ER Z
+laboratoires L AH B AO R AH T W AA Z
+laboratories L AE B R AH T AO R IY Z
+laboratories' L AE B R AH T AO R IY Z
+laboratory L AE B R AH T AO R IY
+laboratory's L AE B R AH T AO R IY Z
+laborde L AH B AO R D
+labore L AH B AO R
+labored L EY B ER D
+laborer L EY B ER ER
+laborers L EY B ER ER Z
+laboring L EY B ER IH NG
+laborious L AH B AO R IY AH S
+laboriously L AH B AO R IY AH S L IY
+labors L EY B ER Z
+labossiere L AE B AH S IY EH R
+labouisse L AA B UW S
+labounty L AH B AW N T IY
+labour L EY B AW R
+labour(2) L EY B ER
+labov L AH B AH V
+labove L AH B AH V
+labow L AE B OW
+laboy L AH B OY
+labrador L AE B R AH D AO R
+labrake L AE B R AH K
+labranche L AA B R AA N K IY
+labreck L AE B R IH K
+labrecque L AH B R EH K
+labree L AH B R IY
+labrie L AE B ER IY
+labrioche L AA B R IY OW SH
+labriola L AA B R IY OW L AH
+labrosse L AA B R OW S IY
+labs L AE B Z
+labs' L AE B Z
+labuda L AH B Y UW D AH
+labus L AE B IH S
+labyrinth L AE B ER IH N TH
+labyrinthine L AE B ER IH N TH IY N
+lac L AE K
+lac's L AE K S
+lacana L AA K AE N AH
+lacasse L AA K AA S IY
+lacava L AA K AA V AH
+lacayo L AA K EY OW
+lacaze L AA K AA Z IY
+laccoliths L AE K AH L IH TH S
+lace L EY S
+laced L EY S T
+lacefield L EY S F IY L D
+lacer L EY S ER
+lacerate L AE S ER EY T
+laceration L AE S ER EY SH AH N
+lacerations L AE S ER EY SH AH N Z
+lacerte L AA CH EH R T IY
+laces L EY S AH Z
+laces(2) L EY S IH Z
+lacewell L EY S W EH L
+lacey L EY S IY
+lach L AE CH
+lachance L AA CH AH N S
+lachapelle L AE SH AH P AH L
+lacharite L AE CH ER AY T
+lache L AE CH
+lachenbruch L AE K AH N B R UW K
+lacher L AE K ER
+lachica L AE CH IH K AH
+lachlan L AE K L AH N
+lachman L AE K M AH N
+lachmar L AE K M AA R
+lachney L AE K N IY
+lachowicz L AA HH AH V IH CH
+lacina L AA CH IY N AH
+lacivita L AA CH IY V IY T AH
+lack L AE K
+lackadaisical L AE K AH D EY Z IH K AH L
+lackawanna L AE K AH W AA N AH
+lacked L AE K T
+lackey L AE K IY
+lackeys L AE K IY Z
+lackie L AE K IY
+lacking L AE K IH NG
+lackluster L AE K L AH S T ER
+lackman L AE K M AH N
+lackner L AE K N ER
+lacko L AE K OW
+lackovic L AE K AH V IH K
+lacks L AE K S
+lacksadaiscious L AE K S AH D EY S IY AH S
+laclair L AE K L ER
+laclede L AA K L IY D
+lacock L AE K AH K
+lacomb L AE K AH M
+lacombe L AA K OW M B IY
+laconic L AA K AA N IH K
+laconte L AA K OW N T IY
+lacorte L AA K AO R T IY
+lacoss L AH K AA S
+lacosse L AA K OW S IY
+lacoste L AA K AO S T
+lacount L AH K UW N T
+lacour L AH K UH R
+lacourse L AH K UH R S
+lacoursiere L AE K UH R S IY EH R
+lacouture L AE K UW CH ER
+lacovara L AA K OW V AA R AH
+lacquer L AE K ER
+lacquered L AE K ER D
+lacroix L AH K R OY
+lacross L AH K R AO S
+lacrosse L AH K R AO S
+lactase L AE K T EY S
+lactate L AE K T EY T
+lactating L AE K T EY T IH NG
+lactation L AE K T EY SH AH N
+lacteals L AE K T IY L Z
+lacter L AE K T ER
+lactic L AE K T IH K
+lactobacillus L AE K T OW B AH S IH L AH S
+lactone L AE K T OW N
+lactose L AE K T OW S
+lacy L EY S IY
+lad L AE D
+lada L AA D AH
+ladakh L AA D AH K
+ladas L AA D AH Z
+ladbroke L AE D B R OW K
+ladbroke's L AE D B R OW K S
+ladd L AE D
+ladd's L AE D Z
+ladder L AE D ER
+ladders L AE D ER Z
+lade L EY D
+ladehoff L AE D AH HH AO F
+laden L EY D AH N
+ladenburg L EY D AH N B ER G
+lader L EY D ER
+ladewig L AE D UW IH G
+ladies L EY D IY Z
+ladies' L EY D IY Z
+lading L EY D IH NG
+ladino L AH D IY N OW
+ladish L AA D IH SH
+ladle L EY D AH L
+ladled L EY D AH L D
+ladles L EY D AH L Z
+ladley L AE D L IY
+ladling L EY D L IH NG
+ladner L AE D N ER
+ladnier L AE D N IY ER
+ladouceur L AE D UW S ER
+ladow L AE D OW
+lads L AE D Z
+ladson L AE D S AH N
+laduca L AA D UW K AH
+ladue L AA D W EH
+laduke L AA D UW K EY
+ladwig L AE D W IH G
+lady L EY D IY
+lady's L EY D IY Z
+ladybird L EY D IY B ER D
+ladybug L EY D IY B AH G
+ladybugs L EY D IY B AH G Z
+ladylike L EY D IY L AY K
+laenderbank L AE N D ER B AE NG K
+laevo L EY V OW
+lafalce L AA F AE L S IY
+lafalce(2) L AH F AA L S
+lafarge L AA F AA R JH
+lafata L AA F AA T AH
+lafauci L AA F AO CH IY
+lafave L AH F EY V
+lafavor L AE F AH V ER
+lafavre L AH F EY V ER
+lafayette L AA F IY EH T
+lafayette(2) L AA F EY EH T
+lafer L EY F ER
+laferriere L AE F ER IY EH R
+lafever L AE F EH V ER
+lafevers L AE F EH V ER Z
+lafeyette L AA F IY EH T
+laff L AE F
+laffer L AE F ER
+lafferty L AE F ER T IY
+laffey L AE F IY
+laffin L AE F IH N
+laffitte L AH F IH T
+laffoon L AH F UW N
+lafite L AA F AY T
+lafitte L AH F IH T
+laflam L AH F L AE M
+laflamme L AE F L IH M
+lafleche L AH F L EH SH
+lafler L EY F AH L ER
+lafler(2) L EY F L ER
+lafleur L AH F L ER
+laflin L AE F L IH N
+lafoe L AH F OW
+lafollette L AE F AH L EH T
+lafon L AE F AH N
+lafond L AH F AA N D
+lafont L AH F AA N T
+lafontaine L AE F AH N T EY N
+lafontant L AA F AA N T AH N T
+laforce L AH F AO R S
+laforest L AH F AO R AH S T
+laforge L AH F AO R G
+laforte L AH F AO R T
+lafortune L AE F ER T UW N
+lafosse L AH F AA S
+lafountain L AA F AA N T EY N
+lafountaine L AA F AA N T EY N
+lafoy L AH F OY
+laframboise L AH F R AE M B W AA
+lafrance L AH F R AE N S
+lafreniere L AE F R IH N IY EH R
+lafrenz L AE F R IH N S
+lafuente L AA F W EH N T EY
+lag L AE G
+lagace L AA G AA CH IY
+lagan L AE G AH N
+lagana L AA G AE N AH
+lagarde L AA G AA R D IY
+lagardere L AA G AA R D IH R
+lagasse L AA G AA S IY
+lagattuta L AA G AA T UW T AH
+lage L EY JH
+lager L AA G ER
+lagerfeld L AA G ER F EH L D
+lagerfeld(2) L EY G ER F EH L D
+lagergren L EY G ER G R EH N
+lagerquist L EY G ER K W IH S T
+lagerstrom L EY G ER S T R AH M
+lagesse L AE G EH S
+laggard L AE G ER D
+laggards L AE G ER D Z
+lagged L AE G D
+lagging L AE G IH NG
+lagle L EY G AH L
+lagnado L AA G N AA D OW
+lago L AA G OW
+lagomarsino L AA G OW M AA R S IY N OW
+lagoon L AH G UW N
+lagoons L AH G UW N Z
+lagos L EY G AO S
+lagow L AE G OW
+lagrange L AE G R EY N JH
+lagreca L AA G R EH K AH
+lagroceria L AA G R OW S ER IY AH
+lagroceria(2) L AH G R OW S ER IY AH
+lagrone L AA G R OW N IY
+lagrow L AE G R OW
+lags L AE G Z
+laguardia L AH G W AA R D IY AH
+lague L AA G
+laguna L AH G UW N AH
+lagunas L AH G UW N AH Z
+lahaie L AE HH IY
+lahaie(2) L AH HH AY
+laham L AE HH AH M
+lahaye L AE HH EY
+lahey L EY HH IY
+lahiff L AE HH IH F
+lahm L AE M
+lahman L AA M AH N
+lahmann L AA M AH N
+lahn L AE N
+lahood L AA HH UH D
+lahore L AA HH AO R
+lahr L AA R
+lahti L AA T IY
+lahue L AE HH Y UW
+lai L AY
+laib L EY B
+laible L EY B AH L
+laibowitz L EY B AH W IH T S
+laibrook L EY B R UH K
+laiche L EY CH
+laid L EY D
+laidig L EY D IH G
+laidlaw L EY D L AO
+laidlaw's L EY D L AO Z
+laidler L EY D L ER
+laidley L EY D L IY
+lail L EY L
+laimbeer L EY M B IH R
+lain L EY N
+laine L EY N
+laing L AA IH NG
+lainhart L AY N HH AA R T
+laino L EY N OW
+lair L EH R
+laird L EH R D
+lairmore L EH R M AO R
+lairson L EH R S AH N
+lais L EY Z
+laissez L EY Z EY
+laissez(2) L EH Z EY
+lait L EY
+laitinen L AY T IH N AH N
+laity L EY AH T IY
+lajeune L AH JH AH N
+lajeunesse L AH JH AH N EH S
+lajoie L AE JH W AA
+lajous L AH ZH UW S
+lak L AE K
+lakatos L AE K AH T OW Z
+lake L EY K
+lake's L EY K S
+lakeberg L EY K B ER G
+lakefield L EY K F IY L D
+lakefront L EY K F R AH N T
+lakeland L EY K L AH N D
+lakeman L EY K M AH N
+laker L EY K ER
+lakers L EY K ER Z
+lakes L EY K S
+lakes' L EY K S
+lakeshore L EY K SH AO R
+lakeside L EY K S AY D
+lakeview L EY K V Y UW
+lakewood L EY K W UH D
+lakey L EY K IY
+lakin L AE K IH N
+lakins L AE K IH N Z
+lakota L AH K OW T AH
+lakotas L AH K OW T AH Z
+lakotas' L AH K OW T AH Z
+lakshamanan L AE K SH AH M AA N AH N
+lakshamanan's L AE K SH AH M AA N AH N Z
+lal L AE L
+lala L AA L AH
+lalande L AA L AA N D IY
+lalas L AA L AH S
+laliberte L AA L IY B EH R T IY
+lalit L AH L IY T
+lalita L AH L IY T AH
+lalitesh L AA L IH T EH SH
+lall L AO L
+lalla L AE L AH
+lallera L AH L EH R AH
+lalley L AE L IY
+lalli L AE L IY
+lallie L AO L IY
+lallier L AE L IY ER
+lallo L AE L OW
+lally L AE L IY
+lalonde L AA L OW N D IY
+lalone L AA L OW N IY
+lalor L AE L AO R
+lam L AE M
+lama L AA M AH
+lama's L AA M AH Z
+lamacchia L AA M AA K IY AH
+lamagna L AA M AA G N AH
+lamagna(2) L AH M AA N Y AH
+lamaist L AA M AY IH S T
+lamamra L AH M AA M R AH
+laman L EY M AH N
+lamanna L AE M IH N AH
+lamantia L AA M AA N SH AH
+lamar L AH M AA R
+lamar's L AH M AA R Z
+lamarca L AA M AA R K AH
+lamarche L AA M AA R K IY
+lamarr L AH M AA R
+lamarr(2) L AA M AA R
+lamarre L AA M AA R IY
+lamartina L AA M AA R T IY N AH
+lamas L AA M AH Z
+lamaster L AA M AE S T ER
+lamastus L AE M AH S T IH S
+lamattina L AA M AA T IY N AH
+lamaur L AH M AO R
+lamay L AE M EY
+lamb L AE M
+lamb's L AE M Z
+lambaste L AE M B AE S T
+lambaste(2) L AE M B EY S T
+lambasted L AE M B AE S T IH D
+lambasted(2) L AE M B EY S T IH D
+lambastes L AE M B AE S T S
+lambastes(2) L AE M B EY S T S
+lambastes(3) L AE M B AE S
+lambastes(4) L AE M B EY S
+lambasting L AE M B EY S T IH NG
+lambda L AE M D AH
+lambdin L AE M D IH N
+lambe L AE M
+lambeau L AE M B OW
+lamberg L AE M B ER G
+lamberson L AE M B ER S AH N
+lambert L AE M B ER T
+lambert's L AE M B ER T S
+lamberth L AE M B ER TH
+lamberti L AA M B EH R T IY
+lamberto L AA M B EH R T OW
+lamberton L AE M B ER T AH N
+lambertson L AE M B ER T S AH N
+lamberty L AE M B ER T IY
+lambeth L AE M B IH TH
+lambiase L AA M B IY AA S IY
+lambie L AE M B IY
+lambing L AE M IH NG
+lamborghini L AE M B ER G IY N IY
+lamborghini's L AE M B ER G IY N IY Z
+lamborghinis L AE M B ER G IY N IY Z
+lamborn L AH M B AO R N
+lamboy L AE M B OY
+lambreau L AE M B R OW
+lambrecht L AE M B R IH K T
+lambright L AE M B R AY T
+lambro L AE M B R OW
+lambros L AE M B R OW Z
+lambs L AE M Z
+lambs' L AE M Z
+lambsdorff L AE M Z D AO R F
+lambson L AE M S AH N
+lamby L AE M B IY
+lame L EY M
+lamellar L AH M EH L ER
+lamely L EY M L IY
+lamendola L AA M EH N D OW L AH
+lament L AH M EH N T
+lamentable L AH M EH N T AH B AH L
+lamented L AH M EH N T IH D
+lamenting L AH M EH N T IH NG
+laments L AH M EH N T S
+lamer L EY M ER
+lamere L AA M EH R EY
+lamers L EY M ER Z
+lameta L AH M EH T AH
+lamey L EY M IY
+lamia L EY M IY AH
+lamica L AE M IH K AH
+lamie L EY M IY
+lamina L AE M AH N AH
+laminack L AE M IH N AH K
+laminar L AE M IH N ER
+laminate L AE M AH N AH T
+laminate(2) L AE M AH N EY T
+laminated L AE M AH N EY T AH D
+laminates L AE M AH N AH T S
+laminating L AE M AH N EY T IH NG
+lamine L AH M IY N
+lamine's L AH M IY N Z
+laminer L AE M AH N ER
+laminne L AH M IH N
+lamirande L AA M IH R AA N D IY
+lamison L AE M IH S AH N
+lamke L AE M K IY
+lamkin L AE M K IH N
+lamle L AE M L IY
+lamm L AE M
+lamm's L AE M Z
+lamme L AE M
+lammers L AE M ER Z
+lammert L AE M ER T
+lammey L AE M IY
+lammi L AE M IY
+lammon L AE M AH N
+lammond L AE M AH N D
+lammons L AE M AH N Z
+lamon L AA M AO N
+lamond L AH M AA N D
+lamonica L AA M OW N IY K AH
+lamons L AA M OW N Z
+lamont L AH M AA N T
+lamontagne L AA M AA N T EY N
+lamonte L AA M AA N T
+lamora L AA M AO R AH
+lamore L AA M AO R
+lamoreaux L AE M ER OW
+lamoreux L AE M ER OW
+lamorte L AA M AO R T IY
+lamos L AA M OW S
+lamothe L AE M AH DH
+lamott L AH M AA T
+lamotta L AA M OW T AH
+lamotte L AH M AO T
+lamountain L AE M UW N T EY N
+lamoureaux L AE M UH R OW
+lamoureux L AE M UH R OW
+lamp L AE M P
+lampe L AE M P
+lampert L AE M P ER T
+lampf L AE M P F
+lamphear L AE M HH ER
+lamphere L AE M F ER
+lamphier L AE M F IY ER
+lampi L AE M P IY
+lamping L AE M P IH NG
+lampkin L AE M P K IH N
+lampkins L AE M P K IH N Z
+lampl L AE M P AH L
+lampley L AE M P L IY
+lamplighter L AE M P L AY T ER
+lamplighter's L AE M P L AY T ER Z
+lamplighters L AE M P L AY T ER Z
+lampman L AE M P M AH N
+lampo L AE M P OW
+lampoon L AE M P UW N
+lampoon's L AE M P UW N Z
+lampooned L AE M P UW N D
+lamport L AE M P AO R T
+lampp L AE M P
+lamppost L AE M P P OW S T
+lamppost(2) L AE M P OW S T
+lampposts L AE M P P OW S T S
+lampposts(2) L AE M P OW S S
+lampposts(3) L AE M P OW S
+lamprey L AE M P R IY
+lampreys L AE M P R IY Z
+lampron L AE M P R AH N
+lampros L AE M P R OW Z
+lamps L AE M P S
+lampson L AE M P S AH N
+lampton L AE M P T AH N
+lamson L AE M S AH N
+lamston L AE M S T AH N
+lamy L EY M IY
+lan L AE N
+lana L AE N AH
+lanagan L AE N AH G AE N
+lanahan L AE N AH HH AE N
+lanai L AH N AY
+lanai-city L AH N AY S IH T IY
+lanasa L AA N AA S AH
+lancashire L AE NG K AH SH AY R
+lancaster L AE N K AE S T ER
+lancaster(2) L AE NG K AH S T ER
+lancastrian L AE NG K AE S T R IY AH N
+lance L AE N S
+lance's L AE N S IH Z
+lancelet L AE N S L AH T
+lancelot L AE N S AH L AA T
+lanceolate L AE N S IY AH L EY T
+lancer L AE N S ER
+lancers L AE N S ER Z
+lancet L AE N S AH T
+lancet's L AE N S AH T S
+lancets L AE N S AH T S
+lancia L AA N CH AH
+lancing L AE N S IH NG
+lancit L AE N S IH T
+lanclos L AE N K L OW Z
+lancome L AE N K AH M
+lancome(2) L AA N K OW M
+lancon L AE NG K AH N
+lancour L AH N K UH R
+lanctot L AE NG K T AH T
+lancz L AE N CH
+land L AE N D
+land's L AE N D Z
+landa L AE N D AH
+landau L AE N D AW
+landauer L AE N D AW ER
+landay L AE N D EY
+landbank L AE N D B AE NG K
+landberg L AE N D B ER G
+lande L AE N D
+landeck L AE N D IH K
+landed L AE N D AH D
+landed(2) L AE N D IH D
+landefeld L AE N D IH F EH L D
+landell L AE N D EH L
+landen L AE N D AH N
+landenberger L AE N D AH N B ER G ER
+lander L AE N D ER
+landeros L AE N D ER OW Z
+landers L AE N D ER Z
+landes L AE N D Z
+landesbank L AE N D IY Z B AE NG K
+landesman L AE N D IH S M AH N
+landess L AE N D AH S
+landfair L AE N D F EH R
+landfall L AE N D F AO L
+landfill L AE N D F IH L
+landfilling L AE N D F IH L IH NG
+landfills L AE N D F IH L Z
+landform L AE N D F AO R M
+landforms L AE N D F AO R M Z
+landfried L AE N D F ER IY D
+landgraf L AE N JH R AH F
+landgrave L AE N D G R EY V
+landgrebe L AE N JH R IH B
+landgren L AE N D G R EH N
+landholder L AE N D HH OW L D ER
+landholders L AE N D HH OW L D ER Z
+landholding L AE N D HH OW L D IH NG
+landholdings L AE N D HH OW L D IH NG Z
+landi L AE N D IY
+landin L AE N D IH N
+landing L AE N D IH NG
+landingham L AE N D IH NG HH AE M
+landings L AE N D IH NG Z
+landini L AA N D IY N IY
+landino L AA N D IY N OW
+landis L AE N D IH S
+landlady L AE N D L EY D IY
+landler L AE N D L ER
+landler's L AE N D L ER Z
+landless L AE N D L AH S
+landlock L AE N D L AA K
+landlocked L AE N D L AA K T
+landlord L AE N D L AO R D
+landlord's L AE N D L AO R D Z
+landlords L AE N D L AO R D Z
+landman L AE N D M AH N
+landmark L AE N D M AA R K
+landmark's L AE N D M AA R K S
+landmarks L AE N D M AA R K S
+landmass L AE N D M AE S
+landmasses L AE N D M AE S IH Z
+landmesser L AE N D M EH S ER
+landmine L AE N D M AY N
+landmines L AE N D M AY N Z
+lando L AE N D OW
+landolfi L AA N D OW L F IY
+landolt L AE N D OW L T
+landon L AE N D AH N
+landon's L AE N D AH N Z
+landor L AE N D ER
+landover L AE N D OW V ER
+landow L AE N D OW
+landowner L AE N D OW N ER
+landowners L AE N D OW N ER Z
+landowski L AH N D AO F S K IY
+landreneau L AE N D R IH N OW
+landress L AE N D R IH S
+landreth L AE N D R IH TH
+landrieu L AE N D R UW
+landrieu(2) L AE N D R IY UW
+landrigan L AE N D R IH G AH N
+landrith L AE N D R IH TH
+landrover L AE N D R OW V ER
+landrum L AE N D R AH M
+landrus L AE N D R AH S
+landry L AE N D R IY
+landry's L AE N D R IY Z
+lands L AE N D Z
+lands' L AE N D Z
+landsat L AE N D S AE T
+landsberg L AE N D Z B ER G
+landsberger L AE N D Z B ER G ER
+landsbergis L AE N D Z B ER G AH S
+landscape L AE N D S K EY P
+landscape(2) L AE N S K EY P
+landscaped L AE N D S K EY P T
+landscaper L AE N D S K EY P ER
+landscapers L AE N D S K EY P ER Z
+landscapes L AE N D S K EY P S
+landscapes(2) L AE N S K EY P S
+landscaping L AE N D S K EY P IH NG
+landscaping(2) L AE N S K EY P IH NG
+landsend L AE N D Z EH N D
+landslide L AE N D S L AY D
+landslide(2) L AE N S L AY D
+landslides L AE N D S L AY D Z
+landslides(2) L AE N S L AY D Z
+landsman L AE N D Z M AH N
+landsner L AE N D Z N ER
+landston L AE N D S T AH N
+landstrom L AE N D S T R AH M
+landt L AE N T
+landview L AE N D V Y UW
+landview's L AE N D V Y UW Z
+landviewite L AE N D V Y UW AY T
+landviewites L AE N D V Y UW AY T S
+landward L AE N D W ER D
+landwehr L AE N D W IH R
+landy L AE N D IY
+lane L EY N
+lane's L EY N Z
+lanehart L EY N HH AA R T
+lanes L EY N Z
+lanese L AA N EY Z IY
+lanete L AH N IY T
+laneve L AH N IY V
+laney L EY N IY
+lanfear L AE N F ER
+lanford L AE N F ER D
+lang L AE NG
+langan L AE NG G AH N
+langbehn L AE NG B IH N
+langbein L AE NG B AY N
+langbo L AE NG B OW
+langdale L AE NG D EY L
+langdon L AE NG D AH N
+lange L AE NG
+lange's L AE NG Z
+langel L EY NG G AH L
+langeland L EY NG G IH L AH N D
+langeland(2) L EY NG G L AH N D
+langelier L EY N JH L IY ER
+langella L AE N JH EH L ER
+langen L AE NG AH N
+langenbach L EY NG G IH N B AA K
+langenberg L AE NG AH N B ER G
+langenderfer L EY NG G IH N D ER F ER
+langendorf L EY NG G IH N D AO R F
+langenfeld L EY NG G IH N F EH L D
+langer L AE NG ER
+langerman L AE NG ER M AH N
+langers L AE NG ER Z
+langevin L EY NG G IH V IH N
+langfeldt L AE NG F EH L T
+langfitt L AE NG F IH T
+langford L AE NG F ER D
+langguth L AE NG UW TH
+langham L AE NG HH AE M
+langham(2) L AE NG AH M
+langhans L AE NG HH AH N Z
+langhoff L AE NG HH AO F
+langhorn L AE NG HH AO R N
+langhorne L AE NG HH AO R N
+langhorst L AE NG HH AO R S T
+langill L AE NG G AH L
+langille L AA NG G IY L IY
+langlais L AH NG G L EY
+langland L AE NG L AH N D
+langley L AE NG L IY
+langley(2) L AE NG G L IY
+langlinais L AE NG G L IH N EY
+langlois L AH NG L W AA
+langman L AE NG M AH N
+langner L AE NG N ER
+lango L AA NG G OW
+langone L AA NG G OW N IY
+langowski L AH NG G AO F S K IY
+langrehr L AE NG G R IH R
+langridge L AE NG G R IH JH
+langsam L AE NG S AH M
+langsdorf L AE NG Z D AO R F
+langseth L AE NG S EH TH
+langsford L AE NG Z F ER D
+langstaff L AE NG S T AE F
+langston L AE NG S T AH N
+langton L AE NG T AH N
+language L AE NG G W AH JH
+language(2) L AE NG G W IH JH
+languages L AE NG G W AH JH AH Z
+languages(2) L AE NG G W IH JH IH Z
+languid L AE NG G W AH D
+languish L AE NG G W IH SH
+languished L AE NG G W IH SH T
+languishes L AE NG G W IH SH IH Z
+languishing L AE NG G W IH SH IH NG
+langwell L AE NG G W EH L
+langworth L AE NG G W ER TH
+langworthy L AE NG W ER DH IY
+lanham L AE N AH M
+lani L AA N IY
+lanier L AH N IH R
+lanigan L AE N IH G AH N
+laning L EY N IH NG
+laningham L AE N IH NG HH AE M
+lanius L EY N IY IH S
+lank L AE NG K
+lanka L AE NG K AH
+lanka's L AE NG K AH Z
+lankan L AE NG K AH N
+lankans L AE NG K AH N Z
+lankford L AE NG K F ER D
+lanktree L AE NG K T R IY
+lanky L AE NG K IY
+lanman L AE N M AH N
+lann L AE N
+lanna L AE N AH
+lannan L AE N AH N
+lannen L AE N AH N
+lanners L AE N ER Z
+lanni L AE N IY
+lanning L AE N IH NG
+lanno L AE N OW
+lanno's L AE N OW Z
+lannom L AE N AH M
+lannon L AE N AH N
+lanny L AE N IY
+lano L AA N OW
+lanolin L AE N AH L AH N
+lanolin(2) L AE N AH L IH N
+lanoue L AE N UW EY
+lanouette L AE N UW EH T
+lanphear L AE N F IH R
+lanpher L AE N F ER
+lanphere L AE N F IH R
+lanphier L AE N F IH R
+lansberry L AE N Z B EH R IY
+lansbury L AE N Z B ER IY
+lansbury's L AE N Z B ER IY Z
+lansdale L AE N Z D EY L
+lansdell L AE N Z D AH L
+lansdown L AE N Z D AW N
+lansdowne L AE N S D AW N
+lanser L AE N S ER
+lansford L AE N S F ER D
+lansing L AE N S IH NG
+lansing's L AE N S IH NG Z
+lansky L AE N S K IY
+lanston L AE N S T AH N
+lant L AE N T
+lantana L AE N T AE N AH
+lanter L AE N T ER
+lanterman L AE N T ER M AH N
+lantern L AE N T ER N
+lanterns L AE N T ER N Z
+lanthanum L AE N TH AH N AH M
+lanthier L AE N TH IY ER
+lanting L AE N T IH NG
+lanting's L AE N T IH NG Z
+lantis L AA N T IH S
+lantos L AE N T OW S
+lantrip L AE N T R IH P
+lantry L AE N T R IY
+lantz L AE N T S
+lantzy L AE N T Z IY
+lanum L AE N AH M
+lanvin L AE N V IH N
+lanyard L AE N Y ER D
+lanyi L AA N Y IY
+lanyon L AE N Y AH N
+lanz L AE N Z
+lanza L AE N Z AH
+lanzelotti L AE N Z AH L AA T IY
+lanzer L AE N Z ER
+lanzet L AE N Z AH T
+lanzi L AE N Z IY
+lanzillo L AE N Z IH L OW
+lanzo L AE N Z OW
+lao L AW
+laos L AA OW S
+laos(2) L AW S
+laos(3) L EY OW S
+laotian L EY OW SH AH N
+laotian(2) L AA OW SH AH N
+laotian(3) L AW SH AH N
+lap L AE P
+lapage L AA P IH JH
+lapaglia L AA P AA G L IY AH
+lapalme L AA P AA L M IY
+lapan L AH P AE N
+laparoscopic L AE P ER AA S K AH P IH K
+laparoscopic(2) L AE P R AH S K AA P IH K
+laparoscopy L AE P ER AA S K AH P IY
+laparoscopy(2) L AE P R AH S K AH P IY
+lapd EH L EY P IY D IY
+lapd's EH L EY P IY D IY Z
+lapdog L AE P D AO G
+lape L EY P
+lapel L AH P EH L
+lapels L AH P EH L Z
+lapenna L AA P EH N AH
+lapenta L AA P EH N T AH
+laperle L AE P ER AH L
+lapeyrouse L AE P IH R UW S
+lapham L AE F AH M
+laphroaig L AE F R OW EY G
+lapiana L AA P IY AE N AH
+lapidary L AE P AH D EH R IY
+lapides L AH P AY D Z
+lapidus L AE P IH D IH S
+lapidus(2) L AH P IY D AH S
+lapier L EY P IY ER
+lapierre L AE P IY EH R
+lapin L AE P IH N
+lapine L AA P IY N IY
+lapinski L AH P IH N S K IY
+lapinsky L AH P IH N S K IY
+lapis L AE P AH S
+lapka L AA P K AH
+laplaca L AH P L AA K AH
+lapland L AE P L AE N D
+laplant L AH P L AO N T
+laplante L AH P L AA N T IY
+laplume L AH P L UW M
+lapoint L AH P OY N T
+lapointe L AH P OY N T
+lapolla L AH P OW L AH
+laporta L AH P AO R T AH
+laporte L AH P AO R T
+lapp L AE P
+lappe L AE P
+lapped L AE P T
+lappen L AE P AH N
+lappin L AH P AE N
+lapping L AE P IH NG
+lapps L AE P S
+laprade L AA P R AA D IY
+laprairie L AH P R EH R IY
+lapre L EY P ER
+laprise L AA P R AY Z
+laps L AE P S
+lapse L AE P S
+lapsed L AE P S T
+lapses L AE P S IH Z
+lapsing L AE P S IH NG
+lapsley L AE P S L IY
+laptop L AE P T AA P
+laptops L AE P T AA P S
+lar L AA R
+lara L AA R AH
+larabee L AE R AH B IY
+laraia L AA R AA Y AH
+laraine L ER EY N
+laramee L AE R AH M IY
+laramie L EH R AH M IY
+laramore L AE R AH M AO R
+laraway L AE R AH W EY
+larcenous L AA R S AH N AH S
+larceny L AA R S AH N IY
+larch L AA R CH
+larche L AA R CH IY
+larchmont L AA R CH M AA N T
+larchmont's L AA R CH M AA N T S
+larco L AA R K OW
+larcom L AA R K AA M
+larcom(2) L AA R K AH M
+lard L AA R D
+larded L AA R D IH D
+larder L AA R D ER
+lardner L AA R D N ER
+lare L EH R
+lareau L ER OW
+laredo L ER EY D OW
+lareina L AA R EY IY N AH
+larena L AA R EH N AH
+larew L AE R UW
+large L AA R JH
+largely L AA R JH L IY
+largen L AA R G AH N
+largeness L AA R JH N IH S
+largent L AA R JH AH N T
+larger L AA R JH ER
+largess L AA R JH AH S
+largesse L AA R G EH S
+largest L AA R JH AH S T
+largo L AA R G OW
+lariat L EH R IY AH T
+lariccia L AA R IY CH AH
+larijani L EH R IH JH AA N IY
+larimer L AE R IH M ER
+larimore L AA R IY M AO R
+larina L AA R IY N AH
+larine L AA R IY N IY
+larios L AA R IY OW Z
+lariscy L ER IH S K IY
+larison L AE R IH S AH N
+larissa L AA R IY S AH
+larivee L AE R IH V IY
+lariviere L AE R IH V IY EH R
+larizza L ER IH Z AH
+lark L AA R K
+larke L AA R K
+larkey L AA R K IY
+larkin L AA R K IH N
+larkins L AA R K IH N Z
+larks L AA R K S
+larkspur L AA R K S P ER
+larmer L AA R M ER
+larmon L AA R M AH N
+larmore L AA R M AO R
+larned L AA R N D
+larner L AA R N ER
+larocca L AA R OW K AH
+larocco L AA R OW K OW
+laroche L AA R OW SH
+laroche's L AA R OW SH IH Z
+laroche(2) L ER OW SH
+larochelle L AE R AH SH AH L
+larock L AE R AH K
+larocque L ER OW K
+laroe L AE R OW
+laroque L ER OW K
+larosa L AA R OW S AH
+larose L AA R OW S IY
+larosiere L AA R OW S Y EH R
+larouche L AA R UW SH
+laroux L ER UW
+larowe L AE R AW
+larrabee L AE R AH B IY
+larrance L AE R AH N S
+larrea L AE R IY AH
+larrick L AE R IH K
+larrimore L AA R IY M AO R
+larrison L AE R IH S AH N
+larrivee L AE R IH V IY
+larroquette L AA R OW K EH T
+larroquette's L AA R OW K EH T S
+larrow L AE R OW
+larry L EH R IY
+larry's L EH R IY Z
+lars L AA R Z
+larsen L AA R S AH N
+larsh L AA R SH
+larson L AA R S AH N
+larsson L AA R S AH N
+larue L ER UW
+laruso L AA R UW S OW
+larussa L AA R UW S AH
+larusso L AA R UW S OW
+larva L AA R V AH
+larvae L AA R V IY
+larval L AA R V AH L
+lary L EH R IY
+laryngeal L ER IH N JH IY AH L
+laryngitis L EH R AH N JH AY T AH S
+larynx L EH R IH NG K S
+larzelere L ER Z EH L ER
+las L AA S
+las(2) EH L EY EH S
+las-vegas L AA S V EY G AH S
+lasagna L AA S AA N Y AH
+lasagna(2) L AH Z AA N Y AH
+lasala L AA S AA L AH
+lasalle L AH S AE L
+lasater L AE S EY T ER
+lasca L AA S K AH
+lascala L AA S K AA L AH
+lascaux L AE S K OW
+lasch L AE SH
+lascivious L AH S IH V IY AH S
+lasco L AA S K OW
+lascola L AA S K OW L AH
+lase L EY Z
+lasecki L AH S EH T S K IY
+lasek L AA S EH K
+laser L EY Z ER
+laser's L EY Z ER Z
+lasers L EY Z ER Z
+lasersonic L EY Z ER S AA N IH K
+lasersonics L EY Z ER S AA N IH K S
+laseter L AE S IY T ER
+laseter(2) L AE S IH T ER
+lash L AE SH
+lashbrook L AE SH B R UH K
+lashed L AE SH T
+lasher L AE SH ER
+lashes L AE SH IH Z
+lashing L AE SH IH NG
+lashings L AE SH IH NG Z
+lashlee L AE SH L IY
+lashley L AE SH L IY
+lashomb L AE SH AH M
+lashua L AE SH UW AE
+lashway L AE SH W EY
+lasiter L AE S AY T ER
+lask L AE S K
+laska L AA S K AH
+laske L EY S K
+lasker L AE S K ER
+laskey L AE S K IY
+laski L AA S K IY
+laskin L AE S K IH N
+lasko L AE S K OW
+laskowski L AH S K AO F S K IY
+lasky L AE S K IY
+lasley L AE S L IY
+laslo L AA S L OW
+lasmo L AE S M OW
+lasorda L AH S AO R D AH
+lasorsa L AA S AO R S AH
+lasota L AA S OW T AH
+laspina L AA S P IY N AH
+lass L AE S
+lassa L AA S AH
+lasseigne L AH S EY N Y
+lassen L AE S AH N
+lasser L AE S ER
+lasseter L AE S IY T ER
+lassetter L AE S IH T ER
+lassie L AE S IY
+lassila L AA S IY L AH
+lassiter L AE S AY T ER
+lassman L AE S M AH N
+lassner L AE S N ER
+lasso L AE S OW
+lasswell L AE S W EH L
+last L AE S T
+last's L AE S T S
+last(2) L AO S T
+last(3) L AE S
+lasted L AE S T AH D
+lasted(2) L AE S T IH D
+laster L AE S T ER
+lastest L AE S T AH S T
+lasting L AE S T IH NG
+lastinger L AE S T IH NG ER
+lastingly L AE S T IH NG L IY
+lastly L AE S T L IY
+lastra L AE S T R AH
+lastrapes L AA S T R AA P EH S
+lasts L AE S T S
+lasumma L AH S UW M AH
+lasure L AA ZH ER
+laswell L AE S W EH L
+laszlo L AE Z L OW
+lat L AA T
+lat(2) L AE T
+lat-lon L AE T L AA N
+lat-lons L AE T L AA N Z
+lata L AA T AH
+lataif L AA T EY F
+latanze L AH T AA N Z EY
+latasha L AH T AA SH AH
+latch L AE CH
+latchaw L AE CH AO
+latched L AE CH T
+latches L AE CH AH Z
+latches(2) L AE CH IH Z
+latchford L AE CH F ER D
+latching L AE CH IH NG
+latchkey L AE CH K IY
+late L EY T
+latecomer L EY T K AH M ER
+latecomers L EY T K AH M ER Z
+latelies L EY T L IY Z
+latella L AA T EH L AH
+lately L EY T L IY
+latenan L EY T AH N AH N
+latency L EY T AH N S IY
+latendresse L AE T IH N D R EH S
+lateness L EY T N AH S
+latent L EY T AH N T
+later L EY T ER
+lateral L AE T ER AH L
+laterites L AE T ER AY T S
+laterriere L AA T EH R Y EH R
+laterza L AA T EH R Z AH
+latest L EY T AH S T
+latex L EY T EH K S
+latexes L EY T EH K S AH Z
+lath L AE TH
+latham L AE TH AH M
+latham's L AE TH AH M Z
+lathan L AE TH AH N
+lathe L EY DH
+lathem L AE TH IH M
+lather L AE DH ER
+lathers L AE DH ER Z
+lathes L EY DH Z
+lathon L AE TH AH N
+lathouris L AH TH UW R IH S
+lathrop L AE TH R AH P
+latigo L AH T IY G OW
+latimer L AE T AH M ER
+latimore L AA T IY M AO R
+latin L AE T AH N
+latina L AA T IY N AH
+latina(2) L AH T IY N AH
+latinate L AE T AH N EY T
+latini L AA T IY N IY
+latino L AA T IY N OW
+latino(2) L AH T IY N OW
+latinos L AA T IY N OW S
+latins L AE T AH N Z
+latiolais L AE T IY AH L EY
+latisha L AH T IH SH AH
+latitude L AE T AH T UW D
+latitudes L AE T AH T UW D Z
+latitudinal L AE T AH T UW D AH N AH L
+latka L AA T K AH
+latkas L AA T K AH Z
+latner L AE T N ER
+lato L AA T OW
+laton L AE T AH N
+latona L AA T OW N AH
+latonia L AA T OW N IY AH
+latorre L AA T AO R IY
+latour L AH T UH R
+latourette L AE T UH R EH T
+latoya L AH T OY AH
+latoya's L AH T OY AH Z
+latrine L AH T R IY N
+latrines L AH T R IY N Z
+latrobe L AA T R OW B
+latrone L AH T R OW N
+lats L AA T S
+lats(2) L AE T S
+latsch L AE CH
+latshaw L AE CH AO
+latson L AE T S AH N
+latta L AE T AH
+lattanzi L AA T AA N Z IY
+lattanzio L AA T AA N Z IY OW
+latte L AA T EY
+latter L AE T ER
+latter's L AE T ER Z
+lattice L AE T AH S
+latticework L AE T AH S W ER K
+lattimer L AE T AH M ER
+lattimore L AA T IY M AO R
+lattin L AE T IH N
+lattner L AE T N ER
+latty L AE T IY
+latulippe L AA T UW L IY P IY
+latvala L AA T V AA L AH
+latvia L AE T V IY AH
+latvia's L AE T V IY AH Z
+latvian L AE T V IY AH N
+latvians L AE T V IY AH N Z
+latz L AE T S
+latzoff L AE T Z AO F
+latzoff(2) L AE T S AO F
+lau L AW
+laub L AO B
+laubach L AW B AA K
+laubacher L AW B AA K ER
+laube L AO B
+laubenstein L AW B AH N S T AY N
+laubenstein(2) L AW B AH N S T IY N
+laubenthal L AW B IH N TH AH L
+lauber L AW B ER
+laubhan L AW B HH AH N
+laubscher L AW B SH ER
+lauch L AA CH
+lauck L AO K
+laud L AO D
+laudable L AO D AH B AH L
+laudanum L AO D AH N AH M
+laudatory L AO D AH T AO R IY
+laude L AO D
+lauded L AO D IH D
+laudenslager L AW D IH N S L EY G ER
+lauder L AO D ER
+lauder(2) L AW D ER
+lauderback L AW D ER B AE K
+lauderbaugh L AO D ER B AO
+lauderdale L AO D ER D EY L
+laudicina L AO D IY CH IY N AH
+lauding L AO D IH NG
+laudise L AO D AY Z
+laudner L AO D N ER
+laudner(2) L AW D N ER
+laudon L AO D AH N
+lauds L AO D Z
+laue L AW IY
+lauer L AW ER
+lauerman L AW ER M AH N
+lauf L AO F
+laufenberg L AW F AH N B ER G
+laufer L AO F ER
+lauffer L AO F ER
+laugh L AE F
+laughable L AE F AH B AH L
+laughed L AE F T
+laugher L AA K ER
+laughery L AE F ER IY
+laughing L AE F IH NG
+laughinghouse L AE F IH NG HH AW S
+laughingly L AE F IH NG L IY
+laughingstock L AE F IH NG S T AA K
+laughler L AE F L ER
+laughlin L AA K L IH N
+laughlin(2) L AA F L IH N
+laughman L AE F M AH N
+laughner L AE F N ER
+laughrey L AE F R IY
+laughridge L AE F R IH JH
+laughs L AE F S
+laughter L AE F T ER
+laughton L AO T AH N
+lauinger L AW IH NG ER
+lauman L AW M AH N
+laumann L AW M AH N
+laun L AO N
+launcelot L AO N S IH L AA T
+launch L AO N CH
+launched L AO N CH T
+launcher L AO N CH ER
+launchers L AO N CH ER Z
+launches L AO N CH AH Z
+launches(2) L AO N CH IH Z
+launching L AO N CH IH NG
+launchings L AO N CH IH NG Z
+launder L AO N D ER
+laundered L AO N D ER D
+launderer L AO N D ER ER
+launderers L AO N D ER ER Z
+laundering L AO N D ER IH NG
+launders L AO N D ER Z
+laundries L AO N D R IY Z
+laundromat L AO N D R AH M AE T
+laundromats L AO N D R AH M AE T S
+laundry L AO N D R IY
+launer L AO N ER
+launius L AW N IY IH S
+lauper L AW P ER
+laur L AO R
+laura L AO R AH
+laura's L AO R AH Z
+laurance L AO R AH N S
+laurdan L AO R D AH N
+laure L AO R
+laureano L AO R IY N OW
+laureate L AO R IY AH T
+laureates L AO R IY AH T S
+laureen L AO R IY N
+laurel L AO R AH L
+laurel's L AO R AH L Z
+laurels L AO R AH L Z
+lauren L AO R AH N
+laurena L AO R EH N AH
+laurence L AO R AH N S
+laurene L AO R IY N
+laurens L AO R AH N Z
+laurent L AO R AH N T
+laurentian L AO R EH N SH AH N
+laurentiis L AO R AH N T IY Z
+laurenz L AW R EY N Z
+lauretarian L AO R IH T EH R IY AH N
+lauretta L ER EH T AH
+laurette L AO R EH T
+laurey L AO R IY
+lauri L AO R IY
+lauri(2) L AA R IY
+lauria L AO R IY AH
+lauriat's L AA R IY IH T S
+lauriats L AA R IY IH T S
+laurice L AO R IH S
+lauricella L AO R IH S EH L AH
+laurich L AW R IH K
+lauridsen L AO R IH D S AH N
+laurie L AO R IY
+laurie's L AO R IY Z
+laurie's(2) L AA R IY Z
+laurie(2) L AA R IY
+laurin L AO R IH N
+laurino L AO R IY N OW
+lauritsen L AW R IH T S AH N
+lauritsen(2) L AA R IY T S AH N
+lauritzen L AW R IH T Z AH N
+lauritzen(2) L AA R IY T Z AH N
+lauro L AO R OW
+laursen L AW R S AH N
+laury L AO R IY
+lausanne L AO S AE N
+lausch L AW SH
+laut L AO T
+lauten L AW T AH N
+lautenbach L AW T AH N B AA K
+lautenberg L AW T AH N B ER G
+lautenschlager L AW T IH N SH L EY G ER
+lauter L AW T ER
+lauterbach L AW T ER B AA K
+lauth L AO TH
+lautner L AW T N ER
+lautzenheiser L AW T Z AH N HH AY Z ER
+lauver L AW V ER
+laux L AO K S
+lauzon L AW Z AH N
+lava L AA V AH
+laval L AH V AA L
+lavalle L AA V AA L IY
+lavallee L AE V AH L IY
+lavalley L AE V AH L IY
+lavan L EY V AH N
+lavarnway L AH V AA R N W EY
+lavatories L AE V AH T AO R IY Z
+lavatory L AE V AH T AO R IY
+lave L EY V
+laveau L AH V OW
+lavecchia L AA V EH K IY AH
+laveda L AA V EY D AH
+lavell L AA V EY L
+lavelle L AH V EH L
+lavely L EY V L IY
+laven L EY V AH N
+lavender L AE V AH N D ER
+laventhol L EY V AH N TH AA L
+laventure L AA V EH N CH ER
+laver L EY V ER
+laverdiere L AA V ER D IH R IY
+laverdure L AA V ER D UH R IY
+lavere L AA V EH R EY
+lavergne L AH V ER N Y
+laverne L AH V ER N
+lavers L EY V ER Z
+laverty L AE V ER T IY
+lavery L EY V ER IY
+lavetta L AA V EH T AH
+lavette L AH V EH T
+lavey L EY V IY
+lavi L EY V IY
+lavie L EY V IY
+lavie(2) L AH V IY
+lavigne L AH V IH N Y
+lavin L AE V IH N
+lavina L AA V IY N AH
+lavinder L AE V IH N D ER
+lavine L AA V IY N IY
+lavinia L AH V IH N Y AH
+laviolette L AE V IY OW L EH T
+lavis L AE V IH S
+lavish L AE V IH SH
+lavished L AE V IH SH T
+lavishes L AE V IH SH AH Z
+lavishing L AE V IH SH IH NG
+lavishly L AE V IH SH L IY
+lavoie L AH V W AA
+lavorgna L AH V AO R N AH
+lavoro L AH V AO R OW
+lavoy L AH V OY
+lavy L EY V IY
+law L AO
+law's L AO Z
+law(2) L AA
+lawall L AW AH L
+laware L AH W EH R
+lawbreaker L AO B R EY K ER
+lawbreakers L AO B R EY K ER Z
+lawbreaking L AO B R EY K IH NG
+lawes L AO Z
+lawford L AO F ER D
+lawful L AO F AH L
+lawfully L AO F AH L IY
+lawhead L AO HH EH D
+lawhon L AO HH AH N
+lawhorn L AE W ER N
+lawhorne L AE W ER N
+lawing L AO IH NG
+lawler L AO L ER
+lawless L AO L AH S
+lawlessness L AO L AH S N AH S
+lawley L AO L IY
+lawlis L AO L IH S
+lawlor L AO L ER
+lawmaker L AO M EY K ER
+lawmaker's L AO M EY K ER Z
+lawmakers L AO M EY K ER Z
+lawmakers' L AO M EY K ER Z
+lawmaking L AO M EY K IH NG
+lawman L AO M AH N
+lawmen L AO M EH N
+lawn L AO N
+lawner L AO N ER
+lawner(2) L AW N ER
+lawniczak L AA V N IH CH AE K
+lawnmower L AO N M OW ER
+lawnmowers L AO N M OW ER Z
+lawns L AO N Z
+lawnsdale L AO N Z D EY L
+lawnsdale's L AO N Z D EY L Z
+lawplan L AO P L AE N
+lawrance L AO R AH N S
+lawrence L AO R AH N S
+lawrence's L AO R AH N S IH Z
+lawrenceburg L AO R AH N S B ER G
+lawrenceville L AO R AH N S V IH L
+lawrencium L AO R EH N S IY AH M
+lawrenz L AA V R IH N Z
+lawrie L AO R IY
+lawry L AO R IY
+laws L AO Z
+lawshe L AO SH
+lawson L AO S AH N
+lawson's L AO S AH N Z
+lawsuit L AO S UW T
+lawsuit's L AO S UW T S
+lawsuits L AO S UW T S
+lawter L AO T ER
+lawther L AO DH ER
+lawton L AO T AH N
+lawver L AA V ER
+lawyer L AO Y ER
+lawyer's L AO Y ER Z
+lawyer(2) L OY ER
+lawyered L AO Y ER D
+lawyering L AO Y ER IH NG
+lawyerly L AO Y ER L IY
+lawyers L AO Y ER Z
+lawyers' L AO Y ER Z
+lawyers(2) L OY ER Z
+lax L AE K S
+laxalt L AE K S AA L T
+laxative L AE K S AH T IH V
+laxatives L AE K S AH T IH V Z
+laxey L AE K S IY
+laxity L AE K S AH T IY
+laxson L AE K S AH N
+laxton L AE K S T AH N
+lay L EY
+lay's L EY Z
+lay-up L EY AH P
+layah L EY AH
+layaway L EY AH W EY
+layborne L EY B AO R N
+layborne's L EY B AO R N Z
+laycock L EY K AA K
+layden L EY D AH N
+laye L EY
+layer L EY ER
+layered L EY ER D
+layering L EY ER IH NG
+layers L EY ER Z
+layfield L EY F IY L D
+layhee L EY HH IY
+laying L EY IH NG
+layland L EY L AH N D
+layman L EY M AH N
+layman's L EY M AH N Z
+laymen L EY M AH N
+laymon L EY M AH N
+layne L EY N
+layoff L EY AO F
+layoffs L EY AO F S
+layout L EY AW T
+layouts L EY AW T S
+layover L EY OW V ER
+layovers L EY OW V ER Z
+laypeople L EY P IY P AH L
+layperson L EY P ER S IH N
+lays L EY Z
+layson L EY Z AH N
+laythan L EY TH AH N
+layton L EY T AH N
+lazar L EY Z ER
+lazard L AH Z AA R D
+lazare L AA Z AA R EY
+lazaro L AH Z AA R OW
+lazaroff L AE Z ER AO F
+lazarski L AH Z AA R S K IY
+lazarus L AE Z ER AH S
+lazarz L AA Z AA R Z
+lazcano L AA Z K AA N OW
+lazear L AH Z IH R
+lazenby L AE Z IH N B IY
+lazer L EY Z ER
+lazere L AH Z EY R
+lazier L EY Z IY ER
+laziest L EY Z IY AH S T
+lazily L AE Z AH L IY
+laziness L EY Z IY N AH S
+lazo L AA Z OW
+lazor L AA Z AO R
+lazuli L AH Z UW L IY
+lazulite L AE Z AH L AY T
+lazur L AE Z ER
+lazy L EY Z IY
+lazzara L AA T S AA R AH
+lazzari L AA T S AA R IY
+lazzarini L AA T S AA R IY N IY
+lazzaro L AA T S AA R OW
+lazzell L AE Z AH L
+lb P AW N D
+lbs P AW N D Z
+lcs EH L S IY EH S
+le L AH
+lea L IY
+leabo L IY B OW
+leach L IY CH
+leach's L IY CH IH Z
+leached L IY CH T
+leaches L IY CH IH Z
+leaching L IY CH IH NG
+leachman L IY CH M AH N
+leachman's L IY CH M AH N Z
+leacock L IY K AA K
+lead L EH D
+lead(2) L IY D
+leadbelly L EH D B EH L IY
+leadbetter L IY D B IH T ER
+leadbetter(2) L EH D B IH T ER
+leaded L EH D IH D
+leaden L EH D AH N
+leader L IY D ER
+leader's L IY D ER Z
+leaderless L IY D ER L AH S
+leaders L IY D ER Z
+leaders' L IY D ER Z
+leadership L IY D ER SH IH P
+leadership's L IY D ER SH IH P S
+leaderships L IY D ER SH IH P S
+leading L IY D IH NG
+leadingham L IY D IH NG HH AE M
+leadoff L IY D AO F
+leads L IY D Z
+leadville L EH D V IH L
+leadwork L EH D W ER K
+leaf L IY F
+leafed L IY F T
+leafhopper L IY F HH AA P ER
+leafhoppers L IY F HH AA P ER Z
+leafing L IY F IH NG
+leafless L IY F L AH S
+leaflet L IY F L AH T
+leaflets L IY F L AH T S
+leaflike L IY F L AY K
+leafs L IY F S
+leafy L IY F IY
+league L IY G
+league's L IY G Z
+leaguer L IY G ER
+leaguers L IY G ER Z
+leagues L IY G Z
+leagues' L IY G Z
+leah L IY AH
+leahey L EY HH IY
+leahy L EY HH IY
+leak L IY K
+leakage L IY K AH JH
+leakage(2) L IY K IH JH
+leake L IY K
+leaked L IY K T
+leaker L IY K ER
+leakers L IY K ER Z
+leakey L IY K IY
+leaking L IY K IH NG
+leaks L IY K S
+leaky L IY K IY
+leal L IY L
+leala L IY L AH
+lealan L IY L AH N
+lealia L IY L IY AH
+lealie L IY L IY
+leaman L IY M AH N
+leamer L IY M ER
+leaming L IY M IH NG
+leamon L IY M AH N
+leamy L IY M IY
+lean L IY N
+leana L IY N AH
+leander L IY AE N D ER
+leandro L IY AA N D R OW
+leaned L IY N D
+leaner L IY N ER
+leaners L IY N ER Z
+leanest L IY N AH S T
+leaning L IY N IH NG
+leanings L IY N IH NG Z
+leann L IY AE N
+leans L IY N Z
+leant L IY AH N T
+leanza L IY AE N Z AH
+leap L IY P
+leaped L EH P T
+leaped(2) L IY P T
+leapfrog L IY P F R AO G
+leapfrogged L IY P F R AO G D
+leapfrogging L IY P F R AO G IH NG
+leaphart L IY P HH AA R T
+leaping L IY P IH NG
+leapley L IY P L IY
+leaps L IY P S
+leapt L EH P T
+leapt(2) L IY P T
+lear L IH R
+lear's L IY R Z
+leard L ER D
+learjet L IH R JH EH T
+learn L ER N
+learned L ER N D
+learned(2) L ER N IH D
+learner L ER N ER
+learners L ER N ER Z
+learning L ER N IH NG
+learns L ER N Z
+learnt L ER N T
+learonal L IY R AH N AH L
+leary L IH R IY
+leary's L IH R IY Z
+leas L IY Z
+leasable L IY S AH B AH L
+leasco L IY S K OW
+lease L IY S
+lease's L IY S IH Z
+leaseback L IY S B AE K
+leasebacks L IY S B AE K S
+leased L IY S T
+leasehold L IY S HH OW L D
+leaser L IY S ER
+leases L IY S IH Z
+leaseway L IY S W EY
+leaseway's L IY S W EY Z
+leash L IY SH
+leashed L IY SH T
+leashes L IY SH IH Z
+leasing L IY S IH NG
+leasing's L IY S IH NG Z
+leask L IY S K
+leason L IY S AH N
+least L IY S T
+leasure L EH ZH ER
+leath L IY TH
+leath's L IY TH S
+leatham L IY TH AH M
+leathem L EH TH IH M
+leather L EH DH ER
+leatherback L EH DH ER B AE K
+leatherbacks L EH DH ER B AE K S
+leatherberry L EH DH ER B EH R IY
+leatherbury L EH DH ER B EH R IY
+leatherman L EH DH ER M AH N
+leathers L EH DH ER Z
+leatherwood L EH DH ER W UH D
+leathery L EH DH ER IY
+leaton L IY T AH N
+leatrice L IY T R IH S
+leave L IY V
+leavell L IY V AH L
+leavelle L AH V EH L
+leaven L EH V AH N
+leavened L EH V AH N D
+leavening L EH V AH N IH NG
+leavens L EH V AH N Z
+leavenworth L EH V AH N W ER TH
+leaver L IY V ER
+leaver's L IY V ER Z
+leaverton L IY V ER T AH N
+leaves L IY V Z
+leavey L IY V IY
+leaving L IY V IH NG
+leavings L IY V IH NG Z
+leavins L IY V IH N Z
+leavitt L EH V IH T
+leavy L IY V IY
+leazer L IY Z ER
+lebanese L EH B AH N IY Z
+lebanon L EH B AH N AH N
+lebanon's L EH B AH N AH N Z
+lebar L IH B AA R
+lebaron L AH B EH R AH N
+lebarron L AH B EH R AH N
+lebeau L IH B OW
+lebeck L IY B EH K
+lebed L EH B EH D
+lebed's L EH B EH D Z
+lebeda L EY B EY D AH
+lebegue L EH B IH G
+lebel L EH B AH L
+leben L EH B AH N
+lebenthal L EH B AH N TH AO L
+leber L IY B ER
+lebert L EH B ER T
+leblanc L AH B L AE NG K
+leble L EH B AH L
+lebleu L EH B L UW
+leblond L IH B L AA N D
+lebo L EY B OW
+leboeuf L AH B AH F
+lebold L EH B OW L D
+lebon L EH B AH N
+lebouef L AH B AH F
+lebovitz L EH B AH V IH T S
+lebow L AH B OW
+lebow's L AH B OW Z
+lebowe L IH B OW
+lebowitz L EH B AH W IH T S
+lebrecht L EH B R IH K T
+lebreton L EH B R IH T AA N
+lebron L EH B R AH N
+lebrun L EH B R AH N
+lebsack L EH B S AH K
+lebudde L AH B AH D
+lecates L IH K EY T S
+leccese L EH CH EY Z IY
+lech L EH K
+lecher L EH CH ER
+lecherous L EH CH ER AH S
+lechler L EH K L ER
+lechman L EH K M AH N
+lechmere L EH K M IH R
+lechner L EH K N ER
+lechtenberg L EH K T AH N B ER G
+lechters L EH K T ER Z
+lechuga L EH CH UW G AH
+lecithin L EH S AH TH AH N
+lecithin(2) L EH S IH TH IH N
+leck L EH K
+leckey L EH K IY
+leckie L EH K IY
+leckrone L EH K R AH N
+leclair L EH K L ER
+leclaire L IH K L EH R
+leclerc L AH K L ER K
+leclercq L EH K L ER K
+leclere L EH K L ER
+lecli L EH K L IY
+lecli's L EH K L IY Z
+lecocq L EH K AH K
+lecomba L AH K AH M B AH
+lecompte L EH K AH M P T
+lecomte L IH K AA M T
+leconte L EH K OW N T IY
+lecount L IH K UW N T
+lecrone L EH K R OW N IY
+lecroy L EH K R OY
+lectec L EH K T EH K
+lecter L EH K T ER
+lectern L EH K T ER N
+lector L EH K T ER
+lecture L EH K CH ER
+lectured L EH K CH ER D
+lecturer L EH K CH ER ER
+lecturers L EH K CH ER ER Z
+lectures L EH K CH ER Z
+lecturing L EH K CH ER IH NG
+lecuyer L EH K AY ER
+lecy L IY S IY
+led L EH D
+leda L IY D AH
+leday L IY D EY
+ledbetter L EH D B ER T ER
+ledden L EH D AH N
+leddy L EH D IY
+ledeen L AH D IY N
+leder L EH D ER
+lederer L EH D ER ER
+lederle L EH D ER L IY
+lederman L IY D ER M AH N
+ledesma L EH D EH S M AH
+ledet L EH D IH T
+ledezma L EY D EY Z M AH
+ledford L EH D F ER D
+ledge L EH JH
+ledger L EH JH ER
+ledgers L EH JH ER Z
+ledgerwood L EH JH ER W UH D
+ledges L EH JH IH Z
+ledin L EH D IH N
+ledlow L EH D L OW
+ledo L EY D OW
+ledonne L EH D AH N
+ledoux L IH D UW
+ledvina L EH D V IY N AH
+ledwell L EH D W EH L
+ledwith L EH D W IH TH
+ledyard L EH D Y ER D
+lee L IY
+lee's L IY Z
+leeb L IY B
+leece L IY S
+leech L IY CH
+leeches L IY CH IH Z
+leeco L IY K OW
+leed L IY D
+leeder L IY D ER
+leedham L IY D HH AH M
+leedom L IY D AH M
+leeds L IY D Z
+leeds's L IY D Z IH Z
+leedy L IY D IY
+leek L IY K
+leeks L IY K S
+leeman L IY M AH N
+leeming L IY M IH NG
+leemon L IY M AH N
+leen L IY N
+leena L IY N AH
+leep L IY P
+leeper L IY P ER
+leery L IH R IY
+lees L IY Z
+leesburg L IY Z B ER G
+leese L IY S
+leeser L IY S ER
+leeson L IY S AH N
+leeson's L IY S AH N Z
+leet L IY T
+leetch L IY CH
+leete L IY T
+leeth L IY TH
+leeuwen L UW AH N
+leeuwen(2) L Y UW AH N
+leever L IY V ER
+leeward L IY W ER D
+leeway L IY W EY
+lefauve L AH F AA V
+lefave L IH F EY V
+lefcourt L EH F K AO R T
+lefeber L AH F EY B ER
+lefebre L AH F EY B ER
+lefebure L EH F IH B Y UW R
+lefebvre L AH F EY B ER
+lefever L AH F EY V ER
+lefevers L AH F EY V ER Z
+lefevre L AH F EY V ER
+leff L EH F
+leff's L EH F S
+leffel L EH F AH L
+leffert L EH F ER T
+lefferts L EH F ER T S
+leffew L EH F Y UW
+leffingwell L EH F IH NG G W EH L
+leffler L EH F L ER
+lefkowitz L EH F K AH W IH T S
+lefler L EH F L ER
+lefleur L IH F L ER
+leflore L EH F L ER
+lefort L EH F ER T
+lefrak L EH F R AE K
+lefrancois L EH F R AH N K W AA
+lefrere L AH F R EH R
+left L EH F T
+left's L EH F T S
+left-brace L EH F T B R EY S
+left-winger L EH F T W IH NG ER
+left-wingers L EH F T W IH NG ER Z
+lefthand L EH F T HH AE N D
+lefthanded L EH F T HH AE N D IH D
+lefties L EH F T IY Z
+leftism L EH F T IH Z AH M
+leftist L EH F T IH S T
+leftists L EH F T IH S T S
+leftists(2) L EH F T IH S S
+leftists(3) L EH F T IH S
+lefton L EH F T AH N
+leftover L EH F T OW V ER
+leftovers L EH F T OW V ER Z
+leftridge L EH F T R IH JH
+leftward L EH F T W ER D
+leftwich L EH F T W IH K
+leftwing L EH F T W IH NG
+leftwinger L EH F T W IH NG ER
+leftwingers L EH F T W IH NG ER Z
+lefty L EH F T IY
+leg L EH G
+leg's L EH G Z
+legacies L EH G AH S IY Z
+legacy L EH G AH S IY
+legal L IY G AH L
+legalese L EH G AH L IY S
+legalism L IY G AH L IH Z AH M
+legalistic L EH G AH L IH S T IH K
+legalities L IY G AE L IH T IY Z
+legalities(2) L IH G AE L IH T IY Z
+legality L IY G AE L AH T IY
+legalization L IY G AH L AH Z EY SH AH N
+legalize L IY G AH L AY Z
+legalized L IY G AH L AY Z D
+legalizing L IY G AH L AY Z IH NG
+legally L IY G AH L IY
+legals L IY G AH L Z
+legan L EH G AH N
+legare L EH G AA R IY
+legaspi L EH G AA S P IY
+legate L EH G AH T
+legates L EH G AH T S
+legato L AH G AA T OW
+legault L IH G OW
+lege L IY JH
+legend L EH JH AH N D
+legendary L EH JH AH N D EH R IY
+legendre L EH G IH N D R EY
+legends L EH JH AH N D Z
+legent L EH JH AH N T
+legent's L EH JH AH N T S
+leger L EH JH ER
+legerdemain L EH JH ER D AH M EY N
+legere L EH G ER
+leget L EH G IH T
+legette L IH ZH EH T
+legg L EH G
+legge L EH G
+legged L EH G AH D
+legged(2) L EH G D
+leggett L EH G IH T
+leggette L EH G EH T
+legging L EH G IH NG
+leggings L EH G IH NG Z
+leggio L EH JH IY OW
+leggitt L EH G IH T
+leggy L EH G IY
+leghorn L EH G HH AO R N
+leghorns L EH G HH AO R N Z
+legibility L EH JH AH B IH L AH T IY
+legible L EH JH AH B AH L
+legion L IY JH AH N
+legionaries L IY JH AH N EH R IY Z
+legionnaire L IY JH AH N EH R
+legionnaire's L IY JH AH N EH R Z
+legionnaires L IY JH AH N EH R Z
+legions L IY JH AH N Z
+legislate L EH JH IH S L EY T
+legislated L EH JH AH S L EY T AH D
+legislates L EH JH IH S L EY T S
+legislating L EH JH IH S L EY T IH NG
+legislation L EH JH AH S L EY SH AH N
+legislation's L EH JH AH S L EY SH AH N Z
+legislative L EH JH AH S L EY T IH V
+legislatively L EH JH IH S L EY T IH V L IY
+legislator L EH JH AH S L EY T ER
+legislators L EH JH AH S L EY T ER Z
+legislators' L EH JH IH S L EY T ER Z
+legislature L EH JH AH S L EY CH ER
+legislature's L EH JH AH S L EY CH ER Z
+legislatures L EH JH IH S L EY CH ER Z
+legit L EH JH IH T
+legit(2) L AH JH IH T
+legitimacy L AH JH IH T AH M AH S IY
+legitimacy(2) L IH JH IH T AH M AH S IY
+legitimate L AH JH IH T AH M AH T
+legitimately L AH JH IH T AH M AH T L IY
+legitimize L AH JH IH T AH M AY Z
+legitimize(2) L IH JH IH T AH M AY Z
+legitimized L IH JH IH T AH M AY Z D
+legitimizes L IH JH IH T AH M AY Z IH Z
+legitimizing L IH JH IH T AH M AY Z IH NG
+legler L EH G L ER
+legless L EH G L AH S
+legner L EH G N ER
+lego L EH G OW
+legore L EH G AO R
+legrand L EH G R AE N D
+legrande L EH G R AE N D
+legree L IH G R IY
+legroom L AH G R UW M
+legros L EH G R OW Z
+legs L EH G Z
+legume L EH G Y UW M
+legumes L EH G Y UW M Z
+legwork L EH G W ER K
+leh L EH
+lehan L IY HH AE N
+lehane L AH HH EY N
+lehder L EH D ER
+lehder's L EH D ER Z
+lehenbauer L EY AH N B AW ER
+lehew L EY HH Y UW
+lehigh L IY HH AY
+lehl L EH L
+lehman L IY M AH N
+lehman's L IY M AH N Z
+lehmann L EY M AH N
+lehmer L EH M ER
+lehmkuhl L EH M K AH L
+lehn L EH N
+lehne L EH N
+lehnen L EH N AH N
+lehner L EH N ER
+lehnert L EH N ER T
+lehnhoff L EH N HH AO F
+lehr L EH R
+lehrer L EH R ER
+lehrke L EH R K
+lehrman L EH R M AH N
+lehrmann L EH R M AH N
+lehtinen L EH T IH N AH N
+lehtonen L IH T AA N AH N
+lei L EY
+leib L IY B
+leibel L AY B AH L
+leibensperger L AY B IH N S P ER G ER
+leiber L IY B ER
+leibert L AY B ER T
+leibfried L AY B F ER IY D
+leibler L IY B L ER
+leibman L IY B M AH N
+leibniz L IY B N IH Z
+leibold L AY B OW L D
+leibovit L IY B AH V IH T
+leibovitz L IY B AH V IH T S
+leibowitz L IY B OW IH T S
+leibrand L AY B R AE N D
+leibrand's L AY B R AE N D Z
+leibrand's(2) L IY B R AE N D Z
+leibrand(2) L IY B R AE N D
+leibrock L AY B R AH K
+leiby L IY B IY
+leicester L EH S T ER
+leichliter L AY K L IY T ER
+leichner L AY K N ER
+leicht L AY K T
+leichter L AY K T ER
+leichtman L AY K T M AH N
+leichty L AY K T IY
+leick L IY K
+leider L AY D ER
+leiderman L AY D ER M AH N
+leiderman's L AY D ER M AH N Z
+leidig L AY D IH G
+leidner L AY D N ER
+leidy L IY D IY
+leier L AY ER
+leif L IY F
+leifer L AY F ER
+leifeste L AY F IH S T
+leifheit L AY F HH AY T
+leigh L IY
+leight L EY T
+leighton L EY T AH N
+leighty L EY T IY
+leija L IY Y AH
+leikam L AY K AH M
+leiken L AY K AH N
+leiker L AY K ER
+leila L IY L AH
+leilani L AH L AA N IY
+leilia L IY L IY AH
+leiman L AY M AH N
+leimbach L AY M B AA K
+leimer L AY M ER
+leimert L IY M ER T
+leimert(2) L AY M ER T
+lein L IY N
+leinart L AY N AA R T
+leinbach L AY N B AA K
+leinberger L AY N B ER G ER
+leindecker L AY N D IH K ER
+leinen L AY N AH N
+leiner L AY N ER
+leingang L AY NG G AH NG
+leininger L AY N IH NG ER
+leino L EY IY N OW
+leinonen L AY N AH N AH N
+leins L IY N Z
+leinsdorf L AY N Z D AO R F
+leinweber L AY N W IH B ER
+leiper L IY P ER
+leiphart L AY P HH AA R T
+leipold L AY P OW L D
+leipzig L AY P S IH G
+leis L EY Z
+leischner L AY SH N ER
+leise L IY S
+leisenring L AY S IH N R IH NG
+leiser L AY S ER
+leisey L IY S IY
+leishman L IY SH M AH N
+leising L AY S IH NG
+leisinger L AY S IH N JH ER
+leisner L AY S N ER
+leiss L AY S
+leist L IY IH S T
+leister L IY S T ER
+leistikow L AY S T IH K OW
+leistner L AY S T N ER
+leisure L EH ZH ER
+leisure(2) L IY ZH ER
+leisurely L IY Z ER L IY
+leisy L IY S IY
+leitch L IY CH
+leite L IY T
+leiter L AY T ER
+leiterman L AY T ER M AH N
+leith L IY TH
+leitha L IY DH AH
+leithia L IY DH IY AH
+leitman L AY T M AH N
+leitmotif L AY T M OW T IY F
+leitner L AY T N ER
+leitz L IY T S
+leitzel L AY T Z AH L
+leitzke L AY T S K IY
+leiva L IY V AH
+leja L EY Y AH
+lejeune L EH Y OY N
+lek L EH K
+lekachman L EH K AA K M AH N
+lekas L IY K AH Z
+lekberg L EH K B ER G
+lela L IY L AH
+lelah L EH L AH
+leland L IY L AH N D
+leleux L IH L OW
+lelia L IY L Y AH
+lellouche L EH L UW SH
+lem L EH M
+lema L IY M AH
+lemaire L AH M EH R
+lemaitre L IH M EY T ER
+lemaitre(2) L IH M EY T R AH
+leman L IY M AH N
+lemans L EH M AH N Z
+lemanski L IH M AE N S K IY
+lemar L IH M AA R
+lemarr L EH M ER
+lemaster L IY M AE S T ER
+lemasters L AH M AE S T ER Z
+lemay L EH M EY
+lembcke L EH M B K IY
+lemberg L EH M B ER G
+lemberger L EH M B ER G ER
+lembke L EH M B K
+lembo L EH M B OW
+lemburg L EH M B ER G
+lemcke L EH M K IY
+lemelin L EH M IH L IH N
+lemelle L IH M EH L
+lemen L IY M EH N
+lemercier L AH M ER S IY ER
+lemercier's L AH M ER S IY ER Z
+lemere L EH M ER
+lemery L EH M ER IY
+lemieux L AH M Y UW
+leming L IY M IH NG
+leming(2) L EH M IH NG
+lemire L EY M IH R EY
+lemke L EH M K IY
+lemler L EH M L ER
+lemley L EH M L IY
+lemm L EH M
+lemma L EH M AH
+lemme L EH M AH
+lemmen L EH M EH N
+lemmer L EH M ER
+lemmerman L EH M ER M AH N
+lemmie L EH M IY
+lemming L EH M IH NG
+lemmings L EH M IH NG Z
+lemmo L EH M OW
+lemmon L EH M AH N
+lemmond L EH M AH N D
+lemmons L EH M AH N Z
+lemoine L IH M OY N
+lemon L EH M AH N
+lemonade L EH M AH N EY D
+lemond L EH M AH N D
+lemonds L EH M AH N D Z
+lemons L EH M AH N Z
+lemont L AH M AA N T
+lemos L IY M OW Z
+lemp L EH M P
+lempert L EH M P ER T
+lempke L EH M P K
+lemuela L EH M UW L AH
+lemur L IY M ER
+lemurs L IY M ER Z
+lemus L IY M AH S
+lemzo L EH M Z OW
+len L EH N
+lena L IY N AH
+lena's L IY N AH Z
+lenahan L EH N AH HH AE N
+lenard L EH N ER D
+lenart L EH N ER T
+lenarz L EY N AA R Z
+lencioni L EH N CH OW N IY
+lend L EH N D
+lender L EH N D ER
+lender's L EH N D ER Z
+lenderman L EH N D ER M AH N
+lenders L EH N D ER Z
+lenders' L EH N D ER Z
+lending L EH N D IH NG
+lendings L EH N D IH NG Z
+lendl L EH N D AH L
+lends L EH N D Z
+lene L IY N
+lenehan L EH N IH HH AE N
+leneta L EH N EH T AH
+lenexa L EH N EH K S AH
+leng L EH NG
+lengacher L EH NG G AH K ER
+lengel L EH NG G AH L
+lenger L EH NG ER
+lengle L IH NG AH L
+length L EH NG K TH
+length(2) L EH NG TH
+lengthen L EH NG TH AH N
+lengthen(2) L EH NG K TH AH N
+lengthened L EH NG TH AH N D
+lengthened(2) L EH NG K TH AH N D
+lengthening L EH NG TH AH N IH NG
+lengthening(2) L EH NG K TH AH N IH NG
+lengthens L EH NG TH AH N Z
+lengthens(2) L EH NG K TH AH N Z
+lengths L EH NG K TH S
+lengths(2) L EH NG TH S
+lengthways L EH NG TH W EY Z
+lengthwise L EH NG TH W AY Z
+lengthy L EH NG TH IY
+lengyel L EH NG Y EH L
+lenhard L EH N ER D
+lenhardt L EH N HH AA R T
+lenhart L EH N HH AA R T
+lenhoff L EH N HH AO F
+leniency L IY N Y AH N S IY
+lenient L IY N IY AH N T
+lenient(2) L IY N Y AH N T
+leniently L IY N Y AH N T L IY
+lenig L EH N IH G
+lenihan L EH N IH HH AE N
+lenin L EH N AH N
+lenin's L EH N IH N Z
+lenin(2) L EH N IH N
+leningrad L EH N AH N G R AE D
+leningrad(2) L EH N IH N G R AE D
+lenington L EH N IH NG T AH N
+leninism L EH N IH N IH Z AH M
+leninist L EH N IH N IH S T
+lenis L IY N AH S
+lenita L EH N IY T AH
+lenius L IY N IY IH S
+lenk L EH NG K
+lenke L EH NG K
+lenker L EH NG K ER
+lennane L EH N EY N
+lennane(2) L IY N AE N
+lennar L EH N ER
+lennard L EH N ER D
+lennartz L EH N AA R T S
+lennie L EH N IY
+lennig L EH N IH G
+lenning L EH N IH NG
+lennon L EH N AH N
+lennon's L EH N AH N Z
+lennox L EH N AH K S
+lenny L EH N IY
+leno L EH N OW
+leno's L EH N OW Z
+leno's(2) L IY N OW Z
+leno(2) L IY N OW
+lenon L EH N AH N
+lenora L EH N ER AH
+lenore L AH N AO R
+lenos L IY N OW Z
+lenox L EH N AH K S
+lens L EH N Z
+lenscrafter L EH N Z K R AE F T ER
+lenscrafters L EH N Z K R AE F T ER Z
+lenses L EH N Z AH Z
+lenses(2) L EH N Z IH Z
+lensing L EH N S IH NG
+lent L EH N T
+lentil L EH N T AH L
+lentils L EH N T AH L Z
+lentinan L EH N T IH N AH N
+lentine L EH N T IY N IY
+lentini L EH N T IY N IY
+lentner L EH N T N ER
+lento L EH N T OW
+lenton L EH N T AH N
+lents L EH N T S
+lentsch L EH N CH
+lentz L EH N T S
+lentzsch L EH N T S
+leny L EH N IY
+lenz L EH N Z
+lenz's L EH N Z IH Z
+lenzen L EH N Z AH N
+lenzi L EH N Z IY
+lenzini L EH N Z IY N IY
+lenzo L EH N Z OW
+leo L IY OW
+leo's L IY OW Z
+leoda L EH D AH
+leoine L IH OY N
+leola L EH L AH
+leoma L IH OW M AH
+leominster L IY OW M IH N S T ER
+leon L IY AA N
+leon's L IY AA N Z
+leona L IY OW N AH
+leonara L EH N AA R AH
+leonard L EH N ER D
+leonard's L EH N ER D Z
+leonarda L EH N AA R D AH
+leonardi L EH N AA R D IY
+leonardis L EH N AA R D IH S
+leonardo L IY AH N AA R D OW
+leone L IY OW N
+leonel L IY OW N AH L
+leonelle L EH N EH L
+leonelli L EH N EH L IY
+leonerd L IY AH N ER D
+leones L IY OW N Z
+leonetti L EH N EH T IY
+leong L EH NG
+leonhard L IY AH N HH AA R T
+leonhardt L EH N HH AA R T
+leonhart L EH N HH AA R T
+leoni L EH OW N IY
+leoni(2) L IY OW N IY
+leonid L IY AH N IH D
+leonie L EH N IY
+leonora L IY AH N AO R AH
+leonore L IY AH N AO R
+leontine L EH N T IY N IY
+leontine(2) L IY AA N T AY N
+leontyne L IY AA N T AY N
+leopard L EH P ER D
+leopards L EH P ER D Z
+leopold L IY AH P OW L D
+leopoldina L EH P OW L D IY N AH
+leopoldine L EH P OW L D IY N IY
+leopoldo L IY AH P OW L D OW
+leora L EH R AH
+leos L IY OW Z
+leota L EH T AH
+leotard L IY AH T AA R D
+lep L EH P
+lepage L EH P IH JH
+lepak L EH P AH K
+lepard L EH P ER D
+lepe L IY P
+leper L EH P ER
+lepera L EH P EH R AH
+lepere L EY P EH R EY
+lepers L EH P ER Z
+lepine L EH P IY N IY
+lepisto L EH P IY S T OW
+lepkowski L IH P K AO F S K IY
+lepley L EH P L IY
+lepore L EH P AO R IY
+lepp L EH P
+leppanen L EH P AH N AH N
+leppard L EH P ER D
+leppek L EH P IH K
+lepper L EH P ER
+leppert L EH P ER T
+leppla L EH P L AH
+leppo L EH P OW
+lepre L EH P ER
+leprosy L EH P R AH S IY
+leptin L EH P T IH N
+leptonic L EH P T AA N IH K
+lequire L EY K W IH R EY
+lerach L EH R AH K
+lerch L ER K
+lerche L ER CH
+lereah L EH R EY AH
+lerette L ER EH T
+lerew L EH R UW
+lerhman L ER M AH N
+lerma L ER M AH
+lerman L EH R M AH N
+lerner L ER N ER
+lerner's L ER N ER Z
+leroux L ER UW
+leroy L IY R OY
+lerro L EH R OW
+lersch L ER SH
+lerum L EH R AH M
+les L EH S
+les(2) L EY
+lesa L IY S AH
+lesabre L AH S EY B ER
+lesabres L EH S AH B R AH S
+lesage L EH S IH JH
+lesane L EY S AA N EY
+lesbian L EH Z B IY AH N
+lesbianism L EH Z B IY AH N IH Z M
+lesbians L EH Z B IY AH N Z
+lescaze L AH S K EY Z
+lesch L EH SH
+leschly L EH SH L IY
+leser L EH S ER
+lesesne L EH S IH N
+lesh L EH SH
+lesharo L EH SH AA R OW
+lesher L EH SH ER
+lesi L EH S IY
+lesiak L EH S IY AE K
+lesieur L EH S IY ER
+lesinski L IH S IH N S K IY
+lesion L IY ZH AH N
+lesions L IY ZH AH N Z
+leske L EH S K
+lesko L EH S K OW
+lesley L EH S L IY
+leslie L EH S L IY
+lesmeister L EH S M AY S T ER
+lesner L EH S N ER
+lesniak L EH S N IY AE K
+lesnick L EH S N IH K
+lesniewski L EH S N EH F S K IY
+lesniewski(2) L EH S N UW S K IY
+lesotho L EH S OW TH OW
+lesperance L EH S P ER AA N S
+lespinasse L EH S P IH N AE S
+less L EH S
+lessard L EH S ER D
+lessee L EH S IY
+lessees L EH S IY Z
+lessen L EH S AH N
+lessened L EH S AH N D
+lessening L EH S AH N IH NG
+lessens L EH S AH N Z
+lesser L EH S ER
+lessig L EH S IH G
+lessin L EH S IH N
+lessing L EH S IH NG
+lessley L EH S L IY
+lessman L EH S M AH N
+lessnau L EH S N OW
+lessnau(2) L EH S N AW
+lessner L EH S N ER
+lessness L EH S N AH S
+lesson L EH S AH N
+lessons L EH S AH N Z
+lessor L EH S ER
+lessors L EH S ER Z
+lest L EH S T
+lestat L EH S T AE T
+lester L EH S T ER
+lestrange L EH S T R EY N JH
+lesuer L EH S UW ER
+lesueur L EH S UW ER
+lesure L EH SH UH R
+leszczynski L EH SH IH N S K IY
+leszek L EH S EH K
+let L EH T
+let's L EH T S
+leta L EH T AH
+letarte L EH T AA R T
+letcher L EH CH ER
+letchworth L EH CH W ER TH
+letdown L EH T D AW N
+letellier L EH T AH L IY ER
+letendre L AH T AA N D R AH
+leth L EH TH
+letha L EH TH AH
+lethal L IY TH AH L
+lethality L IY TH AE L AH T IY
+lethargic L AH TH AA R JH IH K
+lethargy L EH TH ER JH IY
+lethco L EH TH K OW
+lethia L EH TH IY AH
+leticia L AH T IH SH AH
+letitia L IH T IH SH IY AH
+letizia L EH T IY Z IY AH
+letner L EH T N ER
+leto L IY T OW
+letourneau L EH T UH R N OW
+lets L EH T S
+letsch L EH CH
+letsinger L EH T S IH N JH ER
+letson L EH T S AH N
+lett L EH T
+lettau L IH T OW
+letter L EH T ER
+lettered L EH T ER D
+letterhead L EH T ER HH EH D
+lettering L EH T ER IH NG
+letterman L EH T ER M AH N
+letterman's L EH T ER M AH N Z
+letterpress L EH T ER P R EH S
+letters L EH T ER Z
+lettice L EH T IH S
+lettie L EH T IY
+lettiere L EH T IY EH R
+lettieri L EH T IH R IY
+letting L EH T IH NG
+lettish L EH T IH SH
+letts L EH T S
+lettuce L EH T AH S
+letty L EH T IY
+letup L EH T AH P
+letz L EH T S
+leu L UW
+leu's L UW Z
+leubert L UW B ER T S
+leucadia L UW K EY D IY AH
+leucadia's L UW K EY D IY AH Z
+leuck L UW K
+leuenberger L UW AH N B ER G ER
+leuffer L UW F ER
+leugers L OY G ER Z
+leukemia L UW K IY M IY AH
+leukocyte L UW K AH S AY T
+leumi L UW M IY
+leung L UW NG
+leupold L OY P OW L D
+leuschner L OY SH N ER
+leuthold L OY TH OW L D
+leutwiler L UW T W AY L ER
+leuzzi L UW Z IY
+lev L EH V
+leva L EH V AH
+leval L AH V AA L
+levalley L EH V AH L IY
+levamisole L AH V AE M IH S OW L
+levan L EH V AH N
+levana L IH V AE N AH
+levander L EH V AH N D ER
+levandoski L IH V AH N D AW S K IY
+levandowski L IH V AH N D AO F S K IY
+levangie L EH V AH NG IY
+levant L AH V AE N T
+levario L EY V AA R IY OW
+levasseur L EH V AH S ER
+levay L EH V EY
+levchenko L EH V CH EH NG K OW
+leve L IY V
+leveck L EH V IH K
+levee L EH V IY
+levees L EH V IY Z
+leveille L EH V AY L
+level L EH V AH L
+level's L EH V AH L Z
+leveled L EH V AH L D
+leveler's L EH V AH L ER Z
+leveler's(2) L EH V L ER Z
+levelers L EH V AH L ER Z
+levelers(2) L EH V L ER Z
+leveling L EH V AH L IH NG
+leveling(2) L EH V L IH NG
+levell L EY V EY L
+levelled L EH V AH L D
+levels L EH V AH L Z
+leven L IY V AH N
+levenberg L IY V AH N B ER G
+levendusky L IH V IH N D AH S K IY
+levene L EH V IY N
+levengood L EH V IH N G UH D
+levenhagen L EH V IH N HH AH G AH N
+levens L IY V AH N Z
+levenson L EH V IH N S AH N
+levenstein L IY V AH N S T AY N
+levenstein(2) L IY V AH N S T IY N
+leventhal L EH V AH N TH AO L
+leveque L AH V IY K
+lever L EH V ER
+lever(2) L IY V ER
+leverage L EH V ER IH JH
+leverage(2) L EH V R AH JH
+leverage(3) L IY V ER IH JH
+leveraged L IY V ER IH JH D
+leveraged(2) L EH V ER IH JH D
+leveraged(3) L EH V R IH JH D
+leveraging L EH V R IH JH IH NG
+leveraging(2) L EH V ER IH JH IH NG
+leverenz L EH V ER IH N S
+leverett L EH V ER EH T
+leverette L EH V ER EH T
+leverich L EH V ER IH K
+levering L EH V ER IH NG
+leverone L EH V ER OW N IY
+levers L EH V ER Z
+leverson L EH V ER S AH N
+levert L EH V ER T
+leverton L IH V ER T AH N
+levesque L IH V EH S K
+levett L EH V IH T
+levey L IH V EY
+levi L IY V AY
+levi's L IY V AY Z
+leviathan L AH V AY AH TH AH N
+levick L EH V IH K
+levie L IY V IY
+levied L EH V IY D
+levien L EH V IY AH N
+levies L EH V IY Z
+levin L EH V IH N
+levin's L EH V IH N Z
+levin's(2) L AH V IH N Z
+levin(2) L AH V IH N
+levina L EH V IY N AH
+levine L AH V IY N
+levine's L AH V IY N Z
+leviner L EH V IH N ER
+levings L EH V IH NG Z
+levingston L IH V IH NG S T AH N
+levins L EH V IH N Z
+levinsky L IH V IH N S K IY
+levinsky's L IH V IH N S K IY Z
+levinson L EH V IH N S AH N
+levinson's L EH V IH N S AH N Z
+levinstone L EH V IH N S T OW N
+levis L EH V IH S
+levis(2) L IY V AY Z
+levison L EH V IH S AH N
+levit L EH V IH T
+levitan L EH V IH T AH N
+levitate L EH V IH T EY T
+levitated L EH V IH T EY T IH D
+levitating L EH V AH T EY T IH NG
+levitation L EH V IH T EY SH AH N
+levitch L EH V IH CH
+levitican L AH V IH T AH K AH N
+leviticus L AH V IH T AH K AH S
+leviton L IH V IH T AH N
+levitsky L IH V IH T S K IY
+levitt L EH V IH T
+levitt's L EH V IH T S
+levitte L EH V IH T
+levitte's L EH V IH T S
+levittown L EH V IH T AW N
+levittown's L EH V IH T AW N Z
+levity L EH V IH T IY
+levitz L EH V IH T S
+levy L EH V IY
+levy's L EH V IY Z
+levy's(2) L IY V IY Z
+levy(2) L IY V IY
+levying L EH V IY IH NG
+lew L UW
+lewallen L UW AO L AH N
+lewan L UW AH N
+lewanda L AH W AA N D AH
+lewandoski L UW AH N D AW S K IY
+lewandowski L UW AH N D AO F S K IY
+lewanna L UW IH N AH
+lewd L UW D
+lewellen L UW EH L AH N
+lewelling L UW EH L IH NG
+lewellyn L UW EH L IH N
+lewensky L UW EH N S K IY
+lewensky's L UW EH N S K IY Z
+lewers L UW ER Z
+lewey L UW IY
+lewi L UW IY
+lewicki L UW IH T S K IY
+lewin L UW IH N
+lewing L UW IH NG
+lewins L UW IH N Z
+lewinski L UW IH N S K IY
+lewinski(2) L AH W IH N S K IY
+lewinsky L UW IH N S K IY
+lewinsky's L UW IH N S K IY Z
+lewinsky's(2) L AH W IH N S K IY Z
+lewinsky(2) L AH W IH N S K IY
+lewinsohn L UW IH N S AH N
+lewinton L UW IH N T AH N
+lewis L UW IH S
+lewis' L UW IH S
+lewis's L UW IH S IH Z
+lewisburg L UW IH S B ER G
+lewiston L UW AH S T AH N
+lewke L UW K IY
+lewkowicz L UW K AH V IH CH
+lewman L UW M AH N
+lewter L UW T ER
+lewton L UW T AH N
+lewy L UW IY
+lex L EH K S
+lexical L EH K S IH K AH L
+lexicographer L EH K S IH K AA G R AH F ER
+lexicographers L EH K S IH K AA G R AH F ER Z
+lexicon L EH K S IH K AA N
+lexicons L EH K S IH K AA N Z
+lexie L EH K S IY
+lexine L EH K S AY N
+lexington L EH K S IH NG T AH N
+lexiphonic L EH K S AH F AO N AH K
+lexis L EH K S IH S
+lexmark L EH K S M AA R K
+lexus L EH K S AH S
+lexus's L EH K S AH S IH Z
+ley L EY
+leya L EY AH
+leyba L EY B AH
+leyda L EY D AH
+leyden L AY D AH N
+leyendecker L AY N D IH K ER
+leyh L EY
+leyland L EY L AH N D
+leyrer L EY R ER
+leys L EY Z
+leysen L EY S AH N
+leysen's L EY S AH N Z
+leyva L EY V AH
+lezotte L IH Z AO T
+lhasa L AA S AH
+lheureux L ER OW
+lhommedieu L OW M EH D Y UW
+li L IY
+li's L IY Z
+li-kang L IY K AE NG
+lia L IY AH
+lia's L IY AH Z
+liabilities L AY AH B IH L AH T IY Z
+liabilities(2) L AY AH B IH L IH T IY Z
+liability L AY AH B IH L IH T IY
+liable L AY AH B AH L
+liacos L AY AA K OW S
+liaison L IY EY Z AA N
+liaison(2) L EY Z AA N
+liaisons L IY EY S AA N Z
+liam L IY AH M
+liam's L IY AH M Z
+lian L Y AA N
+lian's L Y AA N Z
+liana L IY AA N AH
+liane L IY AE N
+liang L Y AE NG
+liang(2) L IY AE NG
+lianna L IY AA N AH
+lianne L IY AE N
+liao L IY AW
+liar L AY ER
+liars L AY ER Z
+liason L AY AH S AH N
+liason(2) L AY S AH N
+liasson L AY AH S AH N
+liau L IY AW
+lib L IH B
+libbed L IH B D
+libbey L IH B IY
+libbing L IH B IH NG
+libby L IH B IY
+libel L AY B AH L
+libeled L AY B AH L D
+libelous L AY B AH L AH S
+liberace L IH B ER AA CH IY
+liberal L IH B ER AH L
+liberal(2) L IH B R AH L
+liberalism L IH B ER AH L IH Z AH M
+liberalism's L IH B ER R AH L IH Z AH M Z
+liberalism's(2) L IH B R AH L IH Z AH M Z
+liberalism(2) L IH B R AH L IH Z AH M
+liberality L IH B ER AE L AH T IY
+liberalization L IH B AH R AH L IH Z EY SH AH N
+liberalization(2) L IH B R AH L IH Z EY SH AH N
+liberalizations L IH B ER AH L IH Z EY SH AH N Z
+liberalizations(2) L IH B R AH L IH Z EY SH AH N Z
+liberalize L IH B ER AH L AY Z
+liberalize(2) L IH B R AH L AY Z
+liberalized L IH B ER AH L AY Z D
+liberalized(2) L IH B R AH L AY Z D
+liberalizes L IH B ER AH L AY Z IH Z
+liberalizes(2) L IH B R AH L AY Z IH Z
+liberalizing L IH B ER AH L AY Z IH NG
+liberalizing(2) L IH B R AH L AY Z IH NG
+liberally L IH B ER AH L IY
+liberally(2) L IH B R AH L IY
+liberals L IH B ER AH L Z
+liberals' L IH B ER AH L Z
+liberals'(2) L IH B R AH L Z
+liberals(2) L IH B R AH L Z
+liberate L IH B ER EY T
+liberated L IH B ER EY T IH D
+liberati L IY B ER AA T IY
+liberating L IH B ER EY T IH NG
+liberation L IH B ER EY SH AH N
+liberato L IY B ER AA T OW
+liberator L IH B ER EY T AH R
+liberatore L IY B ER AA T AO R IY
+liberators L IH B ER EY T AH R Z
+liberia L AY B IH R IY AH
+liberia's L AY B IH R IY AH Z
+liberian L AY B IH R IY AH N
+liberians L AY B IH R IY AH N Z
+liberman L IH B ER M AH N
+libert L IH B ER T
+libertarian L IH B ER T EH R IY AH N
+libertarians L IH B ER T EH R IY AH N Z
+liberte L IH B ER T EY
+liberti L IY B EH R T IY
+liberties L IH B ER T IY Z
+libertine L IH B ER T IY N
+libertines L IH B ER T IY N Z
+liberto L IY B EH R T OW
+liberty L IH B ER T IY
+liberty's L IH B ER T IY Z
+libido L AH B IY D OW
+libman L IH B M AH N
+libor L IY B ER
+libra L IY B R AH
+librarian L AY B R EH R IY AH N
+librarians L AY B R EH R IY AH N Z
+libraries L AY B R EH R IY Z
+library L AY B R EH R IY
+library's L AY B R EH R IY Z
+libration L AY B R EY SH AH N
+librettist L AH B R EH T AH S T
+libretto L AH B R EH T OW
+libretto(2) L IH B R EH T OW
+librizzi L IY B R IY T S IY
+liby L AY B IY
+libya L IH B IY AH
+libya's L IH B IY AH Z
+libyan L IH B IY AH N
+libyans L IH B IY AH N Z
+licari L IY K AA R IY
+licata L IY K AA T AH
+licausi L IY K AO S IY
+licavoli L IY K AA V OW L IY
+licciardi L IY CH AA R D IY
+lice L AY S
+licea L IH S IY AH
+licence L AY S AH N S
+licences L AY S AH N S IH Z
+license L AY S AH N S
+licensed L AY S AH N S T
+licensee L AY S AH N S IY
+licensees L AY S AH N S IY Z
+licenser L AY S AH N S ER
+licenses L AY S AH N S IH Z
+licensing L AY S AH N S IH NG
+licensor L AY S AH N S ER
+licensure L AY S AH N CH ER
+licentious L AY S EH N CH AH S
+lich L IH CH
+lichen L AY K AH N
+lichens L AY K AH N Z
+lichlyter L IH K L AY T ER
+licht L IH K T
+lichtblau L IH CH T B L AW
+lichte L IH CH T
+lichten L IH K T AH N
+lichtenberg L IH K T AH N B ER G
+lichtenberger L IH K T AH N B ER G ER
+lichtenfels L IH K T IH N F AH L Z
+lichtenstein L IH K T AH N S T IY N
+lichtenstein(2) L IH K T AH N S T AY N
+lichtenwalner L IH K T IH N W AH L N ER
+lichtenwalter L IH K T IH N W AH L T ER
+lichter L IH K T ER
+lichterman L IH K T ER M AH N
+lichtman L IH K T M AH N
+lichty L IH CH T IY
+licio L IH S IY OW
+licitra L IY CH IY T R AH
+lick L IH K
+licked L IH K T
+licker L IH K ER
+lickety L IH K AH T IY
+licking L IH K IH NG
+licklider L IH K L AY D ER
+licks L IH K S
+lickteig L IH K T AY G
+lico L IY K OW
+licon L IH K AH N
+licorice L IH K ER IH SH
+lid L IH D
+lida L IY D AH
+liddell L IH D AH L
+liddick L IH D IH K
+liddicoat L IH D IH K OW T
+liddle L IH D AH L
+liddy L IH D IY
+liddy's L IH D IY Z
+lide L AY D
+liden L AY D AH N
+lidgerwood L IH JH ER W UH D
+lido L IY D OW
+lids L IH D Z
+lie L AY
+lieb L IY B
+liebe L IY B
+liebel L IY B AH L
+liebeler L IY B AH L ER
+liebelt L IY B IH L T
+liebenow L IY B IH N OW
+lieber L IY B ER
+lieberman L IY B ER M AH N
+lieberman's L IY B ER M AH N Z
+liebermann L IY B ER M AH N
+liebert L IY B ER T
+lieberthal L IY B ER TH AO L
+liebig L IY B IH G
+liebl L IY B AH L
+liebler L IY B L ER
+liebling L IY B AH L IH NG
+liebling(2) L IY B L IH NG
+liebman L IY B M AH N
+liebmann L IY B M AH N
+liebowitz L IY B AH W IH T S
+liechtenstein L IH K T AH N S T AY N
+liechty L IY CH T IY
+lied L AY D
+liedel L IY D AH L
+lieder L IY D ER
+liederman L IY D ER M AH N
+liederman's L IY D ER M AH N Z
+liedtke L IY T K IY
+liedtke's L IY T K IY Z
+lief L IY F
+liefer L IY F ER
+liege L IY JH
+liem L IY M
+liemandt L IY M AE N T
+lien L IY N
+lienau L AH N OW
+lienemann L IY N AH M AH N
+liener L IY N ER
+lienhard L IY N HH AA R D
+lienhart L IY N HH AA R T
+liens L IY N Z
+lierman L IH R M AH N
+liermann L IH R M AH N
+lies L AY Z
+liesch L IY SH
+liese L IY Z
+lieser L IY S ER
+liesin L IY S IH N
+lieske L IY S K IY
+lieson L IY S AO N
+lietz L IY T S
+lietzke L IY T S K IY
+lieu L UW
+lieu(2) L Y UW
+lieurance L UW R AH N S
+lieutenant L UW T EH N AH N T
+lieutenants L UW T EH N AH N T S
+life L AY F
+life's L AY F S
+lifeblood L AY F B L AH D
+lifeboat L AY F B OW T
+lifeboats L AY F B OW T S
+lifeco L IY F K OW
+lifeguard L AY F G AA R D
+lifeguards L AY F G AA R D Z
+lifeless L AY F L AH S
+lifelike L AY F L AY K
+lifeline L AY F L AY N
+lifelines L AY F L AY N Z
+lifelong L AY F L AO NG
+lifer L AY F ER
+lifers L AY F ER Z
+lifes L AY F S
+lifesaver L AY F S EY V ER
+lifesavers L AY F S EY V ER Z
+lifesaving L AY F S EY V IH NG
+lifespan L AY F S P AE N
+lifespans L AY F S P AE N Z
+lifestyle L AY F S T AY L
+lifestyles L AY F S T AY L Z
+lifetime L AY F T AY M
+lifetime's L AY F T AY M Z
+lifetimes L AY F T AY M Z
+liff L IH F
+liffe L IH F
+liffe's L IH F S
+lifland L IH F L AH N D
+lifo L IY F OW
+liford L IH F ER D
+lifsey L IH F S IY
+lifshitz L IH F SH IH T S
+lifson L IH F S AA N
+lifson's L IH F S AA N Z
+lift L IH F T
+lifted L IH F T AH D
+lifted(2) L IH F T IH D
+lifter L IH F T ER
+lifters L IH F T ER Z
+liftin L IH F T IH N
+lifting L IH F T IH NG
+liftoff L IH F T AO F
+lifton L IH F T AH N
+lifts L IH F T S
+ligachev L IH G AH CH EH V
+ligachev's L IH G AH CH EH V Z
+ligament L IH G AH M AH N T
+ligaments L IH G AH M AH N T S
+ligand L IH G AH N D
+ligands L IH G AH N D Z
+ligas L AY G AH Z
+ligation L AY G EY SH AH N
+ligget L IH G IH T
+liggett L IH G IH T
+liggett's L IH G EH T S
+liggins L IH G IH N Z
+liggio L IY JH IY OW
+light L AY T
+light's L AY T S
+lightbulb L AY T B AH L B
+lightbulbs L AY T B AH L B Z
+lightcap L AY T K AE P
+lighted L AY T AH D
+lighted(2) L AY T IH D
+lighten L AY T AH N
+lightened L AY T AH N D
+lightening L AY T AH N IH NG
+lightens L AY T AH N Z
+lighter L AY T ER
+lighters L AY T ER Z
+lightest L AY T AH S T
+lightfast L AY T F AE S T
+lightfastness L AY T F AE S T N AH S
+lightfoot L AY T F UH T
+lighthall L AY T HH AO L
+lightheaded L AY T HH EH D AH D
+lightheadedness L AY T HH EH D AH D N AH S
+lighthearted L AY T HH AA R T IH D
+lighthizer L AY T HH AY Z ER
+lighthouse L AY T HH AW S
+lighthouses L AY T HH AW S IH Z
+lighthouses(2) L AY T HH AW Z AH Z
+lighting L AY T IH NG
+lighting's L AY T IH NG Z
+lightle L AY T AH L
+lightly L AY T L IY
+lightner L AY T N ER
+lightness L AY T N AH S
+lightning L AY T N IH NG
+lightnings L AY T N IH NG Z
+lights L AY T S
+lightsey L AY T S IY
+lightship L AY T SH IH P
+lightships L AY T SH IH P S
+lightstone L AY T S T OW N
+lightweight L AY T W EY T
+lighty L AY T IY
+ligman L IH G M AH N
+lignin L IH G N IH N
+lignite L IH G N AY T
+ligon L IH G AH N
+liguori L IY G AO R IY
+lihue L IH HH W EY
+lijewski L IH Y EH F S K IY
+likable L AY K AH B AH L
+like L AY K
+likeable L AY K AH B AH L
+liked L AY K T
+likelier L AY K L IY ER
+likeliest L AY K L IY AH S T
+likelihood L AY K L IY HH UH D
+likely L AY K L IY
+liken L AY K AH N
+likened L AY K AH N D
+likeness L AY K N AH S
+likenesses L AY K N AH S IH Z
+likening L AY K AH N IH NG
+likens L AY K AH N Z
+likes L AY K S
+likewise L AY K W AY Z
+likhachov L IH K AH CH AA V
+likhyani L IH K Y AA N IY
+liking L AY K IH NG
+likins L IH K IH N Z
+likud L IH K AH D
+likud's L IH K AH D Z
+likud's(2) L IY K UW D Z
+likud(2) L IY K UW D
+lil L IH L
+lila L IY L AH
+lilac L AY L AE K
+lilacs L AY L AE K S
+lilah L IH L AH
+lilco L IH L K OW
+lilco's L IH L K OW Z
+lile L AY L
+liles L AY L Z
+liley L IH L IY
+lili L IH L IY
+lilia L IY L IY AH
+lilian L IH L IY AH N
+lilian(2) L IH L Y AH N
+liliana L IH L IY AE N AH
+liliane L IH L IY AE N
+liliane(2) L IH L IY AH N
+lilias L AY L IY AH Z
+lilien L IH L IY AH N
+lilienthal L IH L IY N TH AH L
+lilies L IH L IY Z
+lilith L IH L IH TH
+lilja L IY L Y AH
+liljedahl L IH L JH IH D AA L
+liljegren L IH L JH IH G R EH N
+lill L IH L
+lilla L IH L AH
+lillard L IH L ER D
+lille L IH L
+lille(2) L IY L
+lillehamer L IH L IY HH AE M ER
+lillehamer's L IH L IY HH AE M ER Z
+lillehammer L IH L IY HH AE M ER
+lillehammer's L IH L IY HH AE M ER Z
+liller L IH L ER
+lilley L IH L IY
+lilli L IH L IY
+lillian L IH L IY AH N
+lillian's L IH L IY AH N Z
+lilliana L IH L IY AE N AH
+lillibridge L IH L IH B R IH JH
+lillich L IH L IH K
+lillicrop L IH L IH K R AA P
+lillie L IH L IY
+lilliputian L IH L AH P Y UW SH AH N
+lillis L IH L IH S
+lillo L IH L OW
+lilly L IH L IY
+lilly's L IH L IY Z
+lilt L IH L T
+lily L IH L IY
+lily's L IH L IY Z
+lilyan L IH L IY AH N
+lilybell L IH L IY B EH L
+lim L IH M
+lima L AY M AH
+lima(2) L IY M AH
+liman L AY M AH N
+limas L AY M AH Z
+limas(2) L IY M AH Z
+limb L IH M
+limbach L IH M B AA K
+limbaugh L IH M B AO
+limbaugh's L IH M B AO Z
+limbed L IH M D
+limber L IH M B ER
+limberg L IH M B ER G
+limbers L IH M B ER Z
+limbert L IH M B ER T
+limbless L IH M L AH S
+limbo L IH M B OW
+limbrick L IH M B R IH K
+limbs L IH M Z
+limburg L IH M B ER G
+lime L AY M
+limehouse L AY M HH AW S
+limelight L AY M L AY T
+limerick L IH M ER IH K
+limerick's L IH M ER IH K S
+limericks L IH M ER IH K S
+limes L AY M Z
+limestone L AY M S T OW N
+limestones L AY M S T OW N Z
+limine L IH M AY N
+limine(2) L IH M IY N
+liming L AY M IH NG
+limit L IH M AH T
+limitation L IH M IH T EY SH AH N
+limitations L IH M IH T EY SH AH N Z
+limited L IH M AH T AH D
+limited's L IH M AH T AH D Z
+limited's(2) L IH M IH T IH D Z
+limited(2) L IH M IH T IH D
+limiting L IH M AH T IH NG
+limitless L IH M AH T L AH S
+limits L IH M AH T S
+limits(2) L IH M IH T S
+limmer L IH M ER
+limnology L IH M N AA L AH JH IY
+limo L IH M OW
+limoges L IH M OW JH IH Z
+limoges(2) L AH M OW ZH
+limon L IH M AH N
+limonite L AY M AH N AY T
+limos L IH M OW Z
+limos(2) L IY M OW Z
+limousine L IH M AH Z IY N
+limousines L IH M AH Z IY N Z
+limp L IH M P
+limped L IH M P T
+limpert L IH M P ER T
+limpets L IH M P AH T S
+limping L IH M P IH NG
+limps L IH M P S
+lin L IH N
+lina L IY N AH
+linafelter L IH N AH F EH L T ER
+linafelter(2) L AY N AH F EH L T ER
+linage L AY N IH JH
+linam L IH N AH M
+linares L IH N ER Z
+linc L IH NG K
+lincare L IH N K EH R
+lince L IH N S
+lincecum L IH N S IH K AH M
+linch L IH N CH
+linchpin L IH N CH P IH N
+lincicome L IH N S IH K OW M
+linck L IH NG K
+lincks L IH NG K S
+lincoln L IH NG K AH N
+lincoln's L IH NG K AH N Z
+lincolns L IH NG K AH N Z
+lincolnshire L IH NG K AH N SH IH R
+lind L IH N D
+linda L IH N D AH
+linda's L IH N D AH Z
+lindahl L IH N D AA L
+lindaman L IH N D AH M AH N
+lindamood L IH N D AH M UW D
+lindane L IH N D EY N
+lindau L IH N D AW
+lindauer L IH N D AW ER
+lindbeck L AY N D B EH K
+lindberg L AY N D B ER G
+lindbergh L IH N D B ER G
+lindblad L IH N D B L AH D
+lindblom L IH N D B L AH M
+lindbloom L IH N D B L UW M
+lindburg L AY N D B ER G
+linde L IH N D
+lindeen L IH N D IY N
+lindell L IH N D AH L
+lindeman L IH N D M AH N
+lindemann L IH N D AH M AH N
+lindemuth L IH N D IH M UW TH
+linden L IH N D AH N
+linden's L IH N D AH N Z
+lindenbaum L AY N D AH N B AW M
+lindenberg L IH N D AH N B ER G
+lindenberger L IH N D AH N B ER G ER
+lindenmuth L IH N D IH N M UW TH
+linder L IH N D ER
+linderman L AY N D ER M AH N
+lindfors L IH N D F ER Z
+lindgren L IH N D G R EH N
+lindh L IH N D
+lindholm L IH N D HH OW L M
+lindhorst L IH N D HH AO R S T
+lindig L IH N D IH G
+lindler L IH N D L ER
+lindley L IH N D L IY
+lindman L IH N D M AH N
+lindmark L IH N D M AA R K
+lindner L IH N D N ER
+lindner's L IH N D N ER Z
+lindo L IH N D OW
+lindon L IH N D AH N
+lindow L IH N D OW
+lindquist L IH N D K W IH S T
+lindroth L IH N D R AO TH
+lindsay L IH N D Z IY
+lindseth L IH N D S IH TH
+lindsey L IH N D Z IY
+lindsey's L IH N D Z IY Z
+lindskog L IH N D S K AH G
+lindsley L IH N D S L IY
+lindstedt L IH N D S T IH T
+lindstrand L IH N D S T R AH N D
+lindstrom L IH N D S T R AH M
+lindvall L IH N D V AH L
+lindy L IH N D IY
+line L AY N
+line's L AY N Z
+lineage L IH N IY AH JH
+lineages L IH N IY IH JH IH Z
+lineal L IH N IY AH L
+linear L IH N IY ER
+linear's L IH N IY ER Z
+linearly L IH N IY ER L IY
+lineback L AY N B AE K
+linebacker L AY N B AE K ER
+linebackers L AY N B AE K ER Z
+linebarger L IH N IH B AA R G ER
+linebarger(2) L AY N B AA R G ER
+linebaugh L IH N IH B AO
+lineberger L AY N B ER G ER
+lineberry L AY N B EH R IY
+lined L AY N D
+linehan L IH N IH HH AE N
+lineitem L AY N EY T AH M
+lineman L AY N M AH N
+linemen L AY N M AH N
+linen L IH N AH N
+linenberger L IH N AH N B ER G ER
+linenger L IH N AH N JH ER
+linenger's L IH N AH N JH ER Z
+linens L IH N AH N Z
+liner L AY N ER
+liner's L AY N ER Z
+linerboard L AY N ER B AO R D
+liners L AY N ER Z
+liners' L AY N ER Z
+lines L AY N Z
+lines' L AY N Z
+linette L IH N EH T
+lineup L AY N AH P
+lineups L AY N AH P S
+lineweaver L AY N W IY V ER
+linford L IH N F ER D
+ling L IH NG
+lingafelter L IH NG G AH F IH L T ER
+lingard L IH NG G ER D
+lingelbach L IH NG G IH L B AA K
+lingenfelter L IH NG G IH N F IH L T ER
+linger L IH NG G ER
+linger(2) L IH NG ER
+lingered L IH NG G ER D
+lingerfelt L IH NG G ER F EH L T
+lingerie L AA N ZH ER EY
+lingering L IH NG G ER IH NG
+lingering(2) L IH NG G R IH NG
+lingers L IH NG G ER Z
+lingg L IH NG G
+lingle L IH NG G AH L
+lingner L IH NG N ER
+lingo L IH NG G OW
+lings L IH NG Z
+lingua L IH NG G W AH
+linguine L IH NG G W IY N IY
+linguist L IH NG G W IH S T
+linguistic L IH NG G W IH S T IH K
+linguistically L IH NG G W IH S T IH K L IY
+linguistics L IH NG G W IH S T IH K S
+linguists L IH NG G W IH S T S
+linguists(2) L IH NG G W IH S S
+linguists(3) L IH NG G W IH S
+lingus L IH NG G AH S
+linh L IH N
+linhardt L IH N HH AA R T
+linhares L IH N HH ER Z
+linhart L IH N HH AA R T
+lini L IY N IY
+lining L AY N IH NG
+lininger L AY N IH NG ER
+linings L AY N IH NG Z
+link L IH NG K
+link's L IH NG K S
+linkage L IH NG K AH JH
+linkage(2) L IH NG K IH JH
+linkages L IH NG K IH JH IH Z
+linke L IH NG K
+linked L IH NG K T
+linkenhoker L IH NG K IH N HH AH K ER
+linker L IH NG K ER
+linking L IH NG K IH NG
+linkletter L IH NG K L EH T ER
+linkous L IH NG K AH S
+links L IH NG K S
+linkup L IH NG K AH P
+linkups L IH NG K AH P S
+linley L IH N L IY
+linn L IH N
+linnane L IH N AH N
+linnas L IH N AH S
+linne L IH N
+linnea L IH N IY AH
+linnehan L IH N IH HH AE N
+linnell L IH N AH L
+linneman L IH N M AH N
+linnemann L IH N M AH N
+linnet L IH N IH T
+linney L IH N IY
+linnik L IH N IH K
+lino L IY N OW
+linoleum L AH N OW L IY AH M
+linotype L IH N OW T AY P
+linowes L IH N OW Z
+linquist L IH N K W IH S T
+lins L IH N Z
+linsay L IH N S EY
+linscomb L IH N S K AH M
+linscott L IH N S K AH T
+linse L IH N S
+linseed L IH N S IY D
+linsey L IH N Z IY
+linsey-woolsey L IH N Z IY W UH L Z IY
+linskey L IH N S K IY
+linsky L IH N S K IY
+linsley L IH N S L IY
+linson L IH N S AH N
+linstrom L IH N S T R AH M
+lint L IH N T
+lintas L IH N T AH S
+lintel L IH N T AH L
+linters L IH N T ER Z
+linthicum L IH N TH IH K AH M
+lintner L IH N T N ER
+linton L IH N T AH N
+lintz L IH N T S
+linus L AY N AH S
+linux L IH N AH K S
+linville L IY N V IH L
+linwick L IH N W IH K
+linwood L IH N W UH D
+linz L IH N Z
+linzer L IH N Z ER
+linzey L IH N Z IY
+linzy L IH N Z IY
+liomine L IY AH M AY N
+lion L AY AH N
+lion's L AY AH N Z
+lionberger L AY AH N B ER G ER
+lionel L AY AH N AH L
+lionetti L IY AH N EH T IY
+lionetti(2) L AY AH N EH T IY
+lionheart L AY AH N HH AA R T
+lionize L AY AH N AY Z
+lionized L AY AH N AY Z D
+lions L AY AH N Z
+lions' L AY AH N Z
+liotier L IY OW T IY EY
+liotier(2) L IY OW T IY ER
+liotta L IY OW T AH
+liou L IY UW
+lip L IH P
+lipa L IY P AH
+lipari L IY P AA R IY
+lipe L AY P
+lipford L IH P F ER D
+lipham L IH F AH M
+lipid L AY P AH D
+lipide L IH P IY D
+lipinski L IH P IH N S K IY
+lipka L IH P K AH
+lipke L IH P K
+lipkin L IH P K IH N
+lipkind L IH P K IH N D
+lipkind(2) L IH P K AY N D
+lipman L IH P M AH N
+lipnick L IH P N IH K
+lipoprotein L IH P AH P R OW T IY N
+lipoproteins L IH P OW P R OW T IY N Z
+liposome L IH P AH S OW M
+liposomes L IH P AH S OW M Z
+liposuction L IH P OW S AH K SH AH N
+liposuction(2) L AY P OW S AH K SH AH N
+lipovsky L IH P AA V S K IY
+lipp L IH P
+lippa L IH P AH
+lippard L IH P ER D
+lippe L IH P
+lipped L IH P T
+lippens L IH P AH N Z
+lipper L IH P ER
+lipper's L IH P ER Z
+lippert L IH P ER T
+lippi L IH P IY
+lippincott L IH P IH N K AH T
+lippitt L IH P IH T
+lippman L IH P M AH N
+lippmann L IH P M AH N
+lippo L IH P OW
+lippold L IH P OW L D
+lipps L IH P S
+lippy L IH P IY
+lips L IH P S
+lips' L IH P S
+lipschitz L IH P SH IH T S
+lipschultz L IH P SH AH L T S
+lipschutz L IH P SH AH T S
+lipscomb L IH P S K AH M
+lipsett L IH P S IH T
+lipsey L IH P S IY
+lipshie L IH P SH IY
+lipshutz L IH P SH AH T S
+lipsig L IH P S IH G
+lipsitz L IH P S IH T S
+lipski L IH P S K IY
+lipsky L IH P S K AY
+lipson L IH P S AH N
+lipstein L IH P S T IY N
+lipstein(2) L IH P S T AY N
+lipstick L IH P S T IH K
+lipsticks L IH P S T IH K S
+liptak L IH P T AH K
+lipton L IH P T AH N
+lipton's L IH P T AH N Z
+lipuma L IY P UW M AH
+liquefaction L IH K W AH F AE K SH AH N
+liquefied L IH K W AH F AY D
+liquefy L IH K W AH F AY
+liqueur L IH K ER
+liqueurs L IH K ER Z
+liquid L IH K W AH D
+liquid(2) L IH K W IH D
+liquidate L IH K W IH D EY T
+liquidated L IH K W IH D EY T IH D
+liquidates L IH K W IH D EY T S
+liquidating L IH K W IH D EY T IH NG
+liquidation L IH K W IH D EY SH AH N
+liquidations L IH K W IH D EY SH AH N Z
+liquidator L IH K W IH D EY T ER
+liquidators L IH K W IH D EY T ER Z
+liquide L IH K W AY D
+liquidities L IH K W IH D AH T IY Z
+liquidity L IH K W IH D AH T IY
+liquidity(2) L IH K W IH D IH T IY
+liquids L IH K W AH D Z
+liquids(2) L IH K W IH D Z
+liqun L IH K UW N
+liquor L IH K ER
+liquori L IY K AO R IY
+liquors L IH K ER Z
+lira L IH R AH
+lira's L IH R AH Z
+lire L IH R AH
+lirette L ER EH T
+liro L IH R OW
+liroff L IH R AO F
+lis L IH S
+lisa L IY S AH
+lisa's L IY S AH Z
+lisabet L IH S AH B EH T
+lisabeth L IH S AH B EH TH
+lisak L IH S AH K
+lisanti L IH S AE N T IY
+lisbeth L IH S B IH TH
+lisbon L IH Z B AH N
+lisby L IH S B IY
+lisco L IH S K OW
+liscom L IH S K AH M
+lise L AY Z
+lisec L IH Z AH K
+lisenbee L IH S EH N B IY
+lisenbee(2) L IH S AH N B IY
+lisenby L IH S IH N B IY
+lisette L IH S EH T
+lish L IH SH
+lishman L IH SH M AH N
+lisi L IY S IY
+lisiecki L IH S IY T S K IY
+lisk L IH S K
+liska L IH S K AH
+liske L IH S K
+liskey L IH S K IY
+lisko L IH S K OW
+lisle L AY AH L
+lisman L IH Z M AH N
+lisowski L IH S AO F S K IY
+lisp L IH S P
+liss L IH S
+lissa L IH S AH
+lissack L IH S AH K
+lissie L IH S IY
+lissner L IH S N ER
+lissouba L IH S UW B AH
+lissy L IH S IY
+list L IH S T
+list's L IH S T S
+listed L IH S T AH D
+listed(2) L IH S T IH D
+listen L IH S AH N
+listened L IH S AH N D
+listener L IH S AH N ER
+listener(2) L IH S N ER
+listeners L IH S AH N ER Z
+listeners(2) L IH S N ER Z
+listening L IH S AH N IH NG
+listening(2) L IH S N IH NG
+listens L IH S AH N Z
+lister L IH S T ER
+listeria L IH S T IH R IY AH
+listerine L IH S T ER IY N
+listerines L IH S T ER IY N Z
+listing L IH S T IH NG
+listings L IH S T IH NG Z
+listless L IH S T L AH S
+listlessly L IH S T L AH S L IY
+liston L IH S T AH N
+lists L IH S T S
+lists(2) L IH S S
+lists(3) L IH S
+liszewski L IH SH EH F S K IY
+liszka L IH SH K AH
+liszt L IH S T
+lit L IH T
+lita L IY T AH
+litaker L IH T EY K ER
+litalien L IH T AH L IY N
+litan L AY T AH N
+litanies L IH T AH N IY Z
+litany L IH T AH N IY
+litaro L IH T AA R OW
+litchfield L IH CH F IY L D
+litchfield's L IH CH F IY L D Z
+litchford L IH CH F ER D
+litchford's L IH CH F ER D Z
+litco L IH T K OW
+litco's L IH T K OW Z
+lite L AY T
+litem L AY T EH M
+litem(2) L IY T EH M
+liter L IY T ER
+literacy L IH T ER AH S IY
+literal L IH T ER AH L
+literally L IH T ER AH L IY
+literally(2) L IH T R AH L IY
+literary L IH T ER EH R IY
+literate L IH T ER AH T
+literati L IH T ER AA T IY
+literature L IH T ER AH CH ER
+literaturnaya L IH T EH R AH T ER N AY AH
+liters L IY T ER Z
+lites L AY T S
+lithe L AY DH
+litherland L IH TH ER L AH N D
+lithgow L IH TH G AW
+lithic L IH TH IH K
+lithium L IH TH IY AH M
+lithograph L IH TH AH G R AE F
+lithographic L IH TH AH G R AE F IH K
+lithographs L IH TH AH G R AE F S
+lithography L AH TH AA G R AH F IY
+lithotripter L IH TH AH T R IH P T ER
+lithuania L IH TH AH W EY N IY AH
+lithuania's L IH TH AH W EY N IY AH Z
+lithuanian L IH TH AH W EY N IY AH N
+lithuanians L IH TH AH W EY N IY AH N Z
+litigant L IH T IH G AH N T
+litigants L IH T IH G AH N T S
+litigate L IH T IH G EY T
+litigated L IH T IH G EY T IH D
+litigates L IH T IH G EY T S
+litigating L IH T IH G EY T IH NG
+litigation L IH T AH G EY SH AH N
+litigations L IH T AH G EY SH AH N Z
+litigator L IH T AH G EY T ER
+litigators L IH T AH G EY T ER Z
+litigious L IH T IH JH AH S
+litke L IH T K IY
+litle L AY T AH L
+litman L IH T M AH N
+litmus L IH T M AH S
+lits L IH T S
+litsey L IH T S IY
+litt L IH T
+litteken L IH T IH K AH N
+littell L IH T AH L
+litten L IH T AH N
+litter L IH T ER
+litteral L IH T ER AH L
+littered L IH T ER D
+littering L IH T ER IH NG
+litters L IH T ER Z
+littig L IH T IH G
+little L IH T AH L
+little's L IH T AH L Z
+little-rock L IH T AH L R AO K
+littleboy L IH T AH L B OY
+littlechild L IH T AH L CH AY L D
+littlefield L IH T AH L F IY L D
+littleford L IH T AH L F ER D
+littlejohn L IH T AH L JH AA N
+littlepage L IH T AH L P EY JH
+littler L IH T AH L ER
+littler(2) L IH T L ER
+littles L IH T AH L Z
+littlest L IH T AH L AH S T
+littleton L IH T AH L T AH N
+littlewood L IH T AH L W UH D
+littman L IH T M AH N
+littmann L IH T M AH N
+litton L IH T AH N
+litton's L IH T AH N Z
+littoral L IH T ER AH L
+littrell L IH T R AH L
+litts L IH T S
+litty L IH T IY
+liturgical L AH T ER JH IH K AH L
+liturgy L IH T ER JH IY
+litvack L IH T V AE K
+litvak L IH T V AH K
+litvin L IH T V IH N
+litwack L IH T W AO K
+litwak L IH T W AH K
+litwiller L IH T W IH L ER
+litwin L IH T W IH N
+litz L IH T S
+litzenberg L IH T Z AH N B ER G
+litzenberger L IH T Z AH N B ER G ER
+litzinger L IH T Z IH NG ER
+liu L Y UW
+liuzza L IY UW T S AH
+liuzzi L IY UW T S IY
+liv L IH V
+livable L IH V AH B AH L
+livan L IY V AA N
+livan's L IY V AA N Z
+live L AY V
+live(2) L IH V
+lived L AY V D
+lived(2) L IH V D
+livelier L AY V L IY ER
+liveliest L AY V L IY AH S T
+livelihood L AY V L IY HH UH D
+livelihoods L AY V L IY HH UH D Z
+liveliness L AY V L IY N AH S
+lively L AY V L IY
+liven L AY V AH N
+livened L AY V AH N D
+livengood L IH V IH N G UH D
+liver L IH V ER
+livergood L IH V ER G UH D
+liveried L IH V R IY D
+liverman L IH V ER M AH N
+livermore L IH V ER M AO R
+livernois L IH V ER N W AA
+liverpool L IH V ER P UW L
+livers L IH V ER Z
+liverwort L IH V ER W ER T
+liverworts L IH V ER W ER T S
+livery L IH V ER IY
+lives L IH V Z
+lives' L AY V Z
+lives(2) L AY V Z
+livesay L IH V IH S EY
+livesey L IH V IH S IY
+livestock L AY V S T AA K
+livezey L IH V IH Z IY
+livia L IH V IY AH
+livid L IH V IH D
+lividity L IH V IH D IH T IY
+livin' L IH V IH N
+living L IH V IH NG
+livingood L IH V IH N G UH D
+livingroom L IH V IH NG R UW M
+livingrooms L IH V IH NG R UW M Z
+livings L IH V IH NG Z
+livingston L IH V IH NG S T AH N
+livingston's L IH V IH NG S T AH N Z
+livingstone L IH V IH NG S T OW N
+livingstone's L IH V IH NG S T OW N Z
+livingwell L IH V IH NG W EH L
+livingwell's L IH V IH NG W EH L Z
+livolsi L IY V OW L S IY
+livonia L IH V OW N Y AH
+livor L IH V AO R
+livoti L IY V OW T IY
+livsey L IH V Z IY
+livvie L IH V IY
+liz L IH Z
+liza L IY Z AH
+lizabeth L IH Z AH B EH TH
+lizak L IH Z AH K
+lizard L IH Z ER D
+lizard's L IH Z ER D Z
+lizards L IH Z ER D Z
+lizarraga L IY Z AA R AA G AH
+lizhi L IH Z IY
+lizotte L IH Z AO T
+lizzie L IH Z IY
+lizzy L IH Z IY
+ljubljana L Y UW B L Y AA N AH
+ljubomir L Y UW B OW M IH R
+llama L AA M AH
+llamas L AA M AH Z
+llana L AE N AH
+llanas L AE N AH Z
+llanes L EY N Z
+llano L AA N OW
+llanos L AA N OW Z
+llerena L EH R EY N AH
+llewellyn L UW EH L IH N
+llewelyn L UW IH L IH N
+llorens L AO R EY AH N Z
+llorente L AO R EY N T EY
+llosa L OW S AH
+llosa's L OW S AH Z
+llovio L OW V IY OW
+lloyd L OY D
+lloyd's L OY D Z
+lloyds L OY D Z
+lloyds' L OY D Z
+ln L EY N
+lo L OW
+lo's L OW Z
+load L OW D
+loaded L OW D AH D
+loaded(2) L OW D IH D
+loader L OW D ER
+loaders L OW D ER Z
+loadholt L OW D HH OW L T
+loading L OW D IH NG
+loadings L OW D IH NG Z
+loadman L OW D M AH N
+loadman's L OW D M AH N Z
+loads L OW D Z
+loaf L OW F
+loafer L OW F ER
+loafers L OW F ER Z
+loafs L OW F S
+loaiza L OW AA IY Z AH
+loam L OW M
+loamy L OW M IY
+loan L OW N
+loan's L OW N Z
+loaned L OW N D
+loaning L OW N IH NG
+loanloss L OW N L AO S
+loans L OW N Z
+loans' L OW N Z
+loar L AO R
+loath L OW TH
+loathe L OW DH
+loathed L OW DH D
+loathing L OW TH IH NG
+loathsome L OW DH S AH M
+loathsome(2) L OW TH S AH M
+loaves L OW V Z
+lob L AA B
+lobato L OW B AA T OW
+lobaugh L AA B AO
+lobb L AA B
+lobban L AA B AH N
+lobbed L AA B D
+lobbia L AA B IY AH
+lobbied L AA B IY D
+lobbies L AA B IY Z
+lobbing L AA B IH NG
+lobby L AA B IY
+lobby's L AA B IY Z
+lobbying L AA B IY IH NG
+lobbyist L AA B IY AH S T
+lobbyists L AA B IY IH S T S
+lobbyists' L AA B IY IH S T S
+lobbyists(2) L AA B IY IH S S
+lobbyists(3) L AA B IY IH S
+lobdell L AA B D AH L
+lobe L OW B
+lobed L OW B D
+lobel L OW B AH L
+lobell L OW B EH L
+lobello L OW B EH L OW
+lober L OW B ER
+loberg L OW B ER G
+lobes L OW B Z
+lobianco L OW B IY AA N K OW
+loblaw L AA B L AO
+loblolly L AA B L AA L IY
+lobo L OW B OW
+lobos L OW B OW S
+lobosco L OW B OW S K OW
+lobotomy L OW B OW T OW M IY
+lobs L AA B Z
+lobster L AA B S T ER
+lobster's L AA B S T ER Z
+lobsterman L AA B S T ER M AH N
+lobstermen L AA B S T ER M IH N
+lobsters L AA B S T ER Z
+lobue L OW B W EH
+lobules L AA B Y UW L Z
+loca L OW K AH
+locadia L OW K EY D IY AH
+local L OW K AH L
+local's L OW K AH L Z
+locale L OW K AE L
+locales L OW K AE L Z
+localities L OW K AE L IH T IY Z
+locality L OW K AE L AH T IY
+localization L OW K AH L AH Z EY SH AH N
+localize L OW K AH L AY Z
+localized L OW K AH L AY Z D
+locally L OW K AH L IY
+locals L OW K AH L Z
+locascio L AH K AE S IY OW
+locastro L AH K AE S T R OW
+locate L OW K EY T
+located L OW K EY T AH D
+located(2) L OW K EY D
+locatelli L OW K AA T EH L IY
+locates L OW K EY T S
+locating L OW K EY T IH NG
+location L OW K EY SH AH N
+locations L OW K EY SH AH N Z
+locator L OW K EY T ER
+locators L OW K EY T ER Z
+locey L OW S IY
+loch L AA K
+locher L AA K ER
+lochhead L AA K HH EH D
+lochner L AA K N ER
+lochridge L AA K R IH JH
+loci L OW K IY
+loci(2) L OW K AY
+locicero L OW CH IY CH EH R OW
+lock L AA K
+locka L AA K AH
+lockaby L AA K AH B IY
+lockamy L AA K AH M IY
+lockard L AA K ER D
+lockart L AA K AA R T
+lockdown L AA K D AW N
+locke L AA K
+locke-ober L AA K OW B ER
+locked L AA K T
+locken L AA K AH N
+locker L AA K ER
+lockerbie L AA K ER B IY
+lockerby L AA K ER B IY
+lockerman L AA K ER M AH N
+lockers L AA K ER Z
+lockert L AA K ER T
+locket L AA K IH T
+lockets L AA K IH T S
+lockett L AA K IH T
+lockett's L AA K AH T S
+lockey L AA K IY
+lockhart L AA K HH AA R T
+lockheed L AA K HH IY D
+lockheed's L AA K HH IY D Z
+lockie L AA K IY
+locking L AA K IH NG
+locklair L AA K L ER
+locklar L AA K L ER
+locklear L AA K L ER
+lockley L AA K L IY
+locklin L AA K L IH N
+lockman L AA K M AH N
+lockmiller L AA K M IH L ER
+lockner L AA K N ER
+lockney L AA K N EY
+lockney(2) L AA K N IY
+lockneys L AA K N EY Z
+lockneys(2) L AA K N IY Z
+lockout L AA K AW T
+lockouts L AA K AW T S
+lockport L AA K P AO R T
+lockrem L AA K R IH M
+lockridge L AA K R IH JH
+locks L AA K S
+locksmith L AA K S M IH TH
+lockstep L AA K S T EH P
+lockup L AA K AH P
+lockwood L AA K W UH D
+lockwood's L AA K W UH D Z
+lockyer L AA K Y ER
+loco L OW K OW
+lococo L OW K OW K OW
+locomotion L OW K AH M OW SH AH N
+locomotive L OW K AH M OW T IH V
+locomotives L OW K AH M OW T IH V Z
+locomotor L OW K AH M OW T ER
+loconte L OW K OW N T IY
+locsin L AA K S IH N
+loctite L AA K T AY T
+locurto L OW K UH R T OW
+locus L OW K AH S
+locust L OW K AH S T
+locusts L OW K AH S T S
+locusts(2) L OW K AH S S
+locusts(3) L OW K AH S
+locy L OW S IY
+lodato L OW D AA T OW
+lode L OW D
+lodema L OW D EH M AH
+loden L OW D AH N
+loder L OW D ER
+lodes L OW D Z
+lodestar L OW D S T AA R
+lodestone L OW D S T OW N
+lodge L AA JH
+lodge's L AA JH IH Z
+lodged L AA JH D
+lodgepole L AA JH P OW L
+lodges L AA JH AH Z
+lodges(2) L AA JH IH Z
+lodging L AA JH IH NG
+lodgings L AA JH IH NG Z
+lodi L OW D AY
+lodico L OW D IY K OW
+lodley L AA D L IY
+lodwick L AA D W IH K
+lodwrick L AA D R IH K
+loe L OW
+loeb L OW B
+loeber L OW B ER
+loeffel L OW F AH L
+loeffelholz L OW F IH L HH OW L Z
+loeffler L OW F L ER
+loehmann L OW M AH N
+loehmann's L OW M AH N Z
+loehr L AO R
+loella L OW EH L AH
+loeper L OW P ER
+loepfe L OW P F IY
+loera L AO R AH
+loesch L OW SH
+loesche L OW SH
+loescher L OW SH ER
+loeser L OW Z ER
+loess L OW AH S
+loesser L EH S ER
+loesser(2) L AA S ER
+loew L AA UW
+loew(2) L OW
+loewe L AA UW
+loewe(2) L OW
+loewen L AA UW AH N
+loewenson L OW W AH N S AH N
+loewenstein L OW AH N S T AY N
+loewenstein(2) L OW AH N S T IY N
+loewenthal L OW IH N TH AH L
+loewi L OW W IY
+loews L OW Z
+loewy L OW IY
+lofaro L OW F AA R OW
+lofaso L OW F AA S OW
+loffredo L OW F R EY D OW
+lofgren L AA F G R EH N
+lofland L AA F L AH N D
+loflin L AA F L IH N
+lofquist L AA F K W IH S T
+lofstrom L AA F S T R AH M
+loft L AO F T
+loft's L AO F T S
+lofthouse L AO F T HH AW S
+lofthus L AA F TH IH S
+loftier L AO F T IY ER
+loftin L AA F T IH N
+loftis L AA F T IH S
+lofton L AA F T AH N
+lofts L AO F T S
+loftus L AO F T AH S
+lofty L AO F T IY
+log L AO G
+logan L OW G AH N
+logar L OW G ER
+logarithm L AA G ER IH DH AH M
+logarithmic L AA G ER IH DH M IH K
+logarithms L AA G ER IH DH AH M Z
+logbook L AO G B UH K
+loge L OW JH
+loges L OW JH IH Z
+logged L AO G D
+logger L AA G ER
+loggerhead L AA G ER HH EH D
+loggerheads L AA G ER HH EH D Z
+loggers L AA G ER Z
+loggia L AA G IY AH
+logging L AO G IH NG
+loggins L AA G IH N Z
+loghry L AA G R IY
+logic L AA JH IH K
+logica L AA JH IH K AH
+logical L AA JH IH K AH L
+logically L AA JH IH K L IY
+logician L OW JH IH SH AH N
+logicon L AA JH IH K AA N
+logie L OW JH IY
+logistic L AH JH IH S T IH K
+logistical L AH JH IH S T IH K AH L
+logistically L AH JH IH S T IH K L IY
+logistics L AH JH IH S T IH K S
+logiudice L OW JH UW D AH S
+logjam L AA G JH AE M
+logjams L AA G JH AE M Z
+logo L OW G OW
+logogram L AO G AH G R AE M
+logograms L AO G AH G R AE M Z
+logographic L AO G AH G R AE F IH K
+logos L OW G OW Z
+logothetis L OW G OW TH EH T IH S
+lograsso L OW G R AA S OW
+logs L AO G Z
+logsdon L AA G Z D AH N
+logston L AA G S T AH N
+logue L OW G
+loguidice L OW G AY D IH S
+logwood L AA G W UH D
+loh L OW
+lohengrin L OW AH N G R IH N
+lohman L OW M AH N
+lohmann L OW M AH N
+lohmeier L OW M AY ER
+lohmeyer L OW M AY ER
+lohn L AA N
+lohner L OW N ER
+lohnes L OW N Z
+lohr L AO R
+lohrenz L AO R IH N S
+lohrey L AA R IY
+lohrman L AO R M AH N
+lohrmann L AO R M AH N
+lohse L OW S
+loiacano L OW Y AH K AA N OW
+loiacono L OW Y AH K OW N OW
+loibl L OY B AH L
+loin L OY N
+loincloth L OY N K L AO TH
+loire L OY R
+lois L OW AH S
+loise L UW AH S
+loise(2) L UW IY S
+loiseau L UW AH S OW
+loisel L OY Z EH L
+loiselle L OY Z EH L
+loiter L OY T ER
+loitering L OY T ER IH NG
+lok L AA K
+loken L OW K AH N
+loker L OW K ER
+lokey L OW K IY
+lokken L AA K AH N
+lola L OW L AH
+loleta L OW L EH T AH
+lolita L OW L IY T AH
+loll L AA L
+lollapalooza L AA L AH P AH L UW Z AH
+lollapaloozas L AA L AH P AH L UW Z AH Z
+lollar L AA L ER
+lollard L AA L ER D
+lolley L AA L IY
+lolli L AA L IY
+lolling L AA L IH NG
+lollipop L AA L IY P AA P
+lollipops L AA L IY P AA P S
+lollis L AH L IY S
+lolly L AA L IY
+loma L OW M AH
+loma-prieda L OW M AH P R IY EY D AH
+lomak L OW M AE K
+loman L OW M AH N
+lomas L OW M AH Z
+lomasney L AA M AH S N IY
+lomax L OW M AE K S
+lomb L AA M
+lomba L AA M B AH
+lombard L AA M B AA R D
+lombardi L AA M B AA R D IY
+lombardo L AA M B AA R D OW
+lombards L AA M B AA R D Z
+lomeli L OW M EH L IY
+lommen L OW M AH N
+lomonaco L OW M OW N AA K OW
+lompoc L AA M P AA K
+lon L AA N
+lona L OW N AH
+lonardo L OW N AA R D OW
+lonas L OW N AH Z
+loncar L AA N K AA R
+londo L AA N D OW
+london L AH N D AH N
+london's L AH N D AH N Z
+londonderry L AH N D AH N D EH R IY
+londoner L AH N D AH N ER
+londoners L AH N D AH N ER Z
+londono L OW N D OW N OW
+lone L OW N
+loneliness L OW N L IY N AH S
+lonely L OW N L IY
+loner L OW N ER
+lonergan L AA N ER G AH N
+lonero L OW N EH R OW
+loners L OW N ER Z
+lones L OW N Z
+lonesome L OW N S AH M
+lonetree L OW N T R IY
+loney L OW N IY
+long L AO NG
+long's L AO NG Z
+long-beach L AO NG B IY CH
+long-island L AO NG AY L AH N D
+long-overdue L AO NG OW V ER D UW
+long-range L AO NG R EY N JH
+long-term L AO NG T ER M
+long-winded L AO NG W IH N D IH D
+longacre L AO NG EY K ER
+longaker L AA NG G AH K ER
+longan L AA NG G AH N
+longanecker L AA NG G AH N EH K ER
+longbow L AO NG B OW
+longbrake L AO NG B R EY K
+longcor L OW NG G K AO R
+longden L AO NG D EH N
+longe L AA N JH
+longed L AO NG D
+longenecker L AA N JH N EH K ER
+longer L AO NG G ER
+longerbeam L AO NG G ER B IY M
+longest L AO NG G AH S T
+longest(2) L AO NG G IH S T
+longevity L AO N JH EH V AH T IY
+longfellow L AO NG F EH L OW
+longfield L AO NG F IY L D
+longhair L AO NG HH EH R
+longhand L AO NG HH AE N D
+longhi L OW N G IY
+longhorn L AO NG HH AO R N
+longhorns L AO NG HH AO R N Z
+longhouse L AO NG HH AW S
+longhurst L AA NG HH ER S T
+longing L AO NG IH NG
+longingly L AO NG IH NG L IY
+longings L AO NG IH NG Z
+longino L OW NG G IY N OW
+longish L AO NG IH SH
+longitude L AA N JH AH T UW D
+longitudes L AA N JH AH T UW D Z
+longitudinal L AA N JH AH T UW D AH N AH L
+longleaf L AO NG L IY F
+longleg L AO NG L EH G
+longlegs L AO NG L EH G Z
+longley L AA NG G L IY
+longman L AO NG M AH N
+longmeyer L AO NG M AY ER
+longmeyer's L AO NG M AY ER Z
+longmire L AA NG M AY R
+longmont L AO NG M AA N T
+longmore L OW NG M AO R
+longnecker L AO NG N EH K ER
+longo L AO NG G OW
+longobardi L OW NG G OW B AA R D IY
+longoria L OW NG G AO R IY AH
+longpre L AA NG P ER
+longrange L AO NG R EY N JH
+longs L AO NG Z
+longshore L AO NG SH AO R
+longshoremen L AO NG SH AO R M IH N
+longshoremen's L AO NG SH AO R M IH N Z
+longshot L AO NG SH AA T
+longspur L AO NG S P ER
+longspurs L AO NG S P ER Z
+longstaff L AO NG S T AE F
+longstanding L AO NG S T AE N D IH NG
+longstreet L AO NG S T R IY T
+longstreth L AA NG S T R EH TH
+longsworth L AO NG Z W ER TH
+longterm L AO NG T ER M
+longtime L AO NG T AY M
+longtin L AO NG T IH N
+longton L AO NG T AH N
+longuet L AO NG W EH T
+longview L AO NG V Y UW
+longwell L AO NG W EH L
+longwood L AO NG W UH D
+longworth L AO NG W ER TH
+loni L AA N IY
+lonigro L OW N IY G R OW
+lonnie L AO N IY
+lonny L AO N IY
+lonon L OW N AH N
+lonrho L AA N R OW
+lonrho's L AA N R OW Z
+lons L AA N Z
+lonsdale L AA N S D EY L
+lonski L AA N S K IY
+lonsky L AA N S K IY
+lonsky's L AA N S K IY Z
+lonsway L AA N S W EY
+loo L UW
+looart L UW AA R T
+looby L UW B IY
+look L UH K
+lookabaugh L UW K AH B AO
+lookabill L UH K AH B IH L
+lookalike L UH K AH L AY K
+looked L UH K T
+looker L UH K ER
+lookers L UH K ER Z
+lookin' L UH K IH N
+looking L UH K IH NG
+lookingbill L UH K IH NG B IH L
+lookit L UH K IH T
+lookout L UH K AW T
+looks L UH K S
+lookup L UH K AH P
+lookups L UH K AH P S
+loom L UW M
+looman L UW M AH N
+loomed L UW M D
+loomer L UW M ER
+looming L UW M IH NG
+loomis L UW M IH S
+looms L UW M Z
+loon L UW N
+looney L UW N IY
+loong L UH NG
+loons L UW N Z
+loony L UW N IY
+loop L UW P
+looped L UW P T
+looper L UW P ER
+loopers L UW P ER Z
+loophole L UW P HH OW L
+loopholes L UW P HH OW L Z
+looping L UW P IH NG
+loops L UW P S
+loopy L UW P IY
+loos L UW Z
+loose L UW S
+loosed L UW S T
+loosely L UW S L IY
+loosen L UW S AH N
+loosened L UW S AH N D
+loosening L UW S AH N IH NG
+loosens L UW S AH N Z
+looser L UW S ER
+looses L UW S IH Z
+loosestrife L UW S S T R AY F
+loosestrife(2) L UW S T R AY F
+loosestrifes L UW S S T R AY F S
+loosestrifes(2) L UW S T R AY F S
+loosing L UW S IH NG
+loot L UW T
+looted L UW T AH D
+looted(2) L UW T IH D
+lootens L UW T AH N Z
+looter L UW T ER
+looters L UW T ER Z
+looting L UW T IH NG
+lop L AA P
+lopardo L OW P AA R D OW
+lopata L OW P AA T AH
+lopatin L OW P AA T IY N
+lope L OW P
+lopeman L OW P M AH N
+loper L OW P ER
+lopes L OW P S
+lopez L OW P EH Z
+lopez's L OW P EH Z IH Z
+lopiccolo L OW P IY K OW L OW
+lopid L OW P IH D
+lopinto L AH P IH N T OW
+lopp L AA P
+lopped L AA P T
+loppers L AA P ER Z
+lopping L AA P IH NG
+loppnow L AA P N AW
+lopresti L OW P R EH S T IY
+lopresto L OW P R EH S T OW
+loprete L OW P R IY T
+lopsided L AA P S AY D IH D
+loquacious L OW K W EY SH AH S
+loquat L OW K W AA T
+lor L AO R
+lora L AO R AH
+lorah L AO R AH
+lorain L ER EY N
+loraine L ER EY N
+loral L AO R AH L
+loral's L AO R AH L Z
+loran L AO R AE N
+lorance L AO R AH N S
+lorang L AO R AH NG
+loranger L AO R EY N JH ER
+lorber L AO R B ER
+lorch L AO R K
+lord L AO R D
+lord's L AO R D Z
+lorden L AO R D AH N
+lordi L AO R D IY
+lords L AO R D Z
+lordstown L AO R D Z T AW N
+lordy L AO R D IY
+lore L AO R
+lorean L AO R IY AH N
+lorean's L AO R IY N Z
+loredo L AO R EY D OW
+loree L AO R IY
+lorei L AO R EY
+lorek L AO R IH K
+lorelei L AO R IH L AY
+lorelli L AO R EH L IY
+lorello L AO R EH L OW
+loren L AO R AH N
+lorena L AO R EH N AH
+lorena's L AO R EH N AH Z
+lorenc L AO R IH NG K
+lorence L AO R AH N S
+lorene L AO R IY N
+lorensen L AO R IH N S AH N
+lorenson L AO R IH N S AH N
+lorentz L AO R IH N T S
+lorentzen L AO R IH N T Z AH N
+lorenz L ER EH N T S
+lorenza L AO R EH N Z AH
+lorenzana L AO R EH N Z AE N AH
+lorenzen L AO R IH N Z AH N
+lorenzetti L AO R EH N Z EH T IY
+lorenzi L AO R EH N Z IY
+lorenzini L AO R EH N Z IY N IY
+lorenzo L ER EH N Z OW
+lorenzo's L AO R EH N Z OW Z
+lorenzo's(2) L ER EH N Z OW Z
+lorenzo(2) L AO EH N Z OW
+loreto L AO R EH T OW
+loretta L ER EH T AH
+lorette L AO R EH T
+loretto L AO R EH T OW
+lorey L AO R IY
+lorge L AO R JH
+lorgnette L AO R N Y EH T
+lorgnettes L AO R N Y EH T S
+lori L AO R IY
+lori's L AO R IY Z
+loria L AO R IY AH
+lorick L AO R IH K
+lorie L AO R IY
+lorillard L AO R AH L AA R D
+lorimar L AO R AH M AA R
+lorimar's L AO R AH M AA R Z
+lorimer L AO R IH M ER
+lorimor L AO R IH M ER
+lorin L AO R IH N
+lorincz L AO R IH N CH
+loring L AO R IH NG
+lorino L AO R IY N OW
+lorio L AO R IY OW
+loris L AO R IH S
+lorita L AO R IY T AH
+lorman L AO R M AH N
+lormand L AO R M AH N D
+lorna L AO R N AH
+lorne L AO R N
+loro L AO R OW
+lorraine L ER EY N
+lorrie L AO R IY
+lorries L AO R IY Z
+lorry L AO R IY
+lorson L AO R S AH N
+lortel L AO R T EH L
+lortie L AO R T IY
+lorton L AO R T AH N
+lortz L AO R T S
+lorusso L AO R UW S OW
+lory L AO R IY
+los L OW S
+los(2) L AO S
+los-angeles L AO S AE N JH AH L AH S
+los-palmas L AA S P AA L M AH S
+losada L OW S AA D AH
+losasso L OW S AA S OW
+loscalzo L OW S K AA L Z OW
+losch L AO SH
+loschiavo L OW S K IY AA V OW
+lose L UW Z
+losec L OW Z AH K
+losee L AH S IY
+loseke L AA S IH K
+loser L UW Z ER
+losers L UW Z ER Z
+losers' L OW Z ER Z
+loses L UW Z AH Z
+loses(2) L UW Z IH Z
+losey L AA S IY
+losh L AA SH
+losing L UW Z IH NG
+losinski L AH S IH N S K IY
+losito L OW S IY T OW
+loso L OW S OW
+losoya L AA S OY AE
+loss L AO S
+losses L AO S AH Z
+losses(2) L AO S IH Z
+lossing L AO S IH NG
+lost L AO S T
+losurdo L OW S UH R D OW
+losure L OW ZH ER
+lot L AA T
+lot's L AA T S
+lot(2) L AO T
+loth L AA TH
+lothian L AA TH IY AH N
+lothrop L AA TH R AH P
+lothrop(2) L OW TH R AH P
+lothson L AA TH S AH N
+lotion L OW SH AH N
+lotion's L OW SH AH N Z
+lotions L OW SH AH N Z
+lotito L OW T IY T OW
+loton L OW T AH N
+lots L AA T S
+lotspeich L AA T S P AY K
+lott L AA T
+lott's L AA T Z
+lotta L AA T AH
+lotte L AA T
+lotter L AA T ER
+lotteries L AA T ER IY Z
+lottery L AA T ER IY
+lottes L AA T S
+lottie L AA T IY
+lottman L AA T M AH N
+lotto L AA T OW
+lotts L AA T S
+lotty L AA T IY
+lotus L OW T AH S
+lotus' L OW T AH S
+lotus's L OW T AH S IH Z
+lotz L AA T S
+lotze L OW T Z
+lou L UW
+lou's L UW Z
+louanna L AW AA N AH
+louanna(2) L UW AE N AH
+louanne L UW AE N
+louart L UW AA R T
+louck L AW K
+loucks L AW K S
+loud L AW D
+louden L AW D AH N
+loudenslager L AW D IH N S L EY G ER
+louder L AW D ER
+louderback L AW D ER B AE K
+loudermilk L AW D ER M IH L K
+loudest L AW D AH S T
+loudin L UW D AE N
+loudly L AW D L IY
+loudon L AW D AH N
+loudspeaker L AW D S P IY K ER
+loudspeakers L AW D S P IY K ER Z
+louella L AW EH L AH
+louganis L UW G EY N IH S
+louganos L UW G AE N OW Z
+lougee L AW JH IY
+lough L AW
+lougheed L AW IY D
+loughery L AW ER IY
+loughlin L AO F L IH N
+loughman L AW M AH N
+loughmiller L AW M AH L ER
+loughner L AW N ER
+loughney L AW N IY
+loughran L AW R AH N
+loughrey L AW R IY
+loughridge L AW R IH JH
+loughry L AW R IY
+louie L UW IY
+louima L UW IY M AH
+louima's L UW IY M AH Z
+louis L UW IH S
+louis' L UW IH S
+louis'(2) L UW IY Z
+louis'(3) L UW IH S IH Z
+louis's L UW IH S IH Z
+louis(2) L UW IY
+louisa L UW IY Z AH
+louisan L UW IH S AH N
+louise L UW IY Z
+louisette L W IY Z EH T
+louisiana L UW IY Z IY AE N AH
+louisiana's L UW IY Z IY AE N AH Z
+louisianian L UW IY Z IY AE N IY AH N
+louisianians L UW IY Z IY AE N IY AH N Z
+louisville L UW IY V IH L
+louk L AW K
+louks L AW K S
+lounge L AW N JH
+lounges L AW N JH IH Z
+lounging L AW N JH IH NG
+lounsberry L AW N S B EH R IY
+loup L UW P
+loupe L UW P
+louque L UW K
+lour L AW R
+lourdes L AO R D Z
+loureiro L UH R EH R OW
+lourenco L AW R EH N K OW
+lourie L AW R IY
+loury L UW R IY
+louse L AW S
+lousiness L AW Z IY N AH S
+lousy L AW Z IY
+lout L AW T
+louth L AW TH
+louthan L AW TH AH N
+louts L AW T S
+loutzenhiser L AW T Z IH N HH AY Z ER
+louvier L AW V IY ER
+louviere L UW V IY EH R
+louvre L UW V R AH
+louw L UW
+loux L UW
+lovaas L AA V AA Z
+lovable L AH V AH B AH L
+lovage L AH V AH JH
+lovallo L OW V AA L OW
+lovan L OW V AH N
+lovas L OW V AH Z
+lovastatin L OW V AE S T AH T IH N
+lovato L OW V AA T OW
+love L AH V
+love's L AH V Z
+loveall L AH V AO L
+lovecchio L AH V EH K IY OW
+loved L AH V D
+loveday L AH V D EY
+lovegrove L AH V G R OW V
+lovejoy L AH V JH OY
+lovelace L AH V L EY S
+lovelan L AH V L AH N
+loveland L AH V L AH N D
+loveless L AH V L AH S
+lovell L AH V AH L
+lovely L AH V L IY
+lovemaking L AH V M EY K IH NG
+loven L AH V AH N
+lover L AH V ER
+lover's L AH V ER Z
+loverde L OW V EH R D IY
+loveridge L AH V R IH JH
+lovering L AH V ER IH NG
+lovern L AH V ER N
+lovers L AH V ER Z
+lovers' L AH V ER Z
+loves L AH V Z
+lovett L AH V IH T
+lovette L AH V EH T
+lovewell L AH V W EH L
+lovgren L AA V G R EH N
+lovick L AA V IH K
+lovie L AH V IY
+loville L OW V IH L
+lovin L OW V IH N
+loving L AH V IH NG
+lovinger L AH V IH NG ER
+lovingly L AH V IH NG L IY
+lovingood L AA V IH NG G UH D
+lovings L AH V IH NG Z
+lovins L OW V IH N Z
+lovitt L AA V IH T
+lovitz L OW V IH T S
+lovler L AH V L ER
+lovler's L AH V L ER Z
+lovvorn L AA V ER N
+low L OW
+low-spirited L OW S P IH R AH T IH D
+low-spiritedness L OW S P IH R IH T IH D N AH S
+lowborn L OW B AO R N
+lowden L OW D AH N
+lowder L OW D ER
+lowdermilk L OW D ER M IH L K
+lowdown L OW D AW N
+lowe L OW
+lowe's L OW Z
+lowekamp L OW K AE M P
+lowell L OW AH L
+lowen L OW AH N
+lowenberg L OW AH N B ER G
+lowensky L OW EH N S K IY
+lowenstein L OW AH N S T AY N
+lowenstein(2) L OW AH N S T IY N
+lowenthal L OW IH N TH AH L
+lower L OW ER
+lowered L OW ER D
+lowering L OW ER IH NG
+lowers L OW ER Z
+lowery L AW ER IY
+lowes L OW Z
+lowest L OW AH S T
+lowey L OW IY
+lowing L OW IH NG
+lowinsky L AH W IH N S K IY
+lowland L OW L AE N D
+lowlands L OW L AE N D Z
+lowly L OW L IY
+lowman L OW M AH N
+lown L AW N
+lowndes L OW N D IY Z
+lowndes(2) L OW N D Z
+lowney L OW N IY
+lowrance L AO R AH N S
+lowrey L AW R IY
+lowrie L AO R IY
+lowrimore L AO R IY M AO R
+lowry L AW R IY
+lows L OW Z
+lowther L OW DH ER
+lowy L OW IY
+lox L AA K S
+lox(2) L AH K S
+loy L OY
+loya L OY AH
+loyal L OY AH L
+loyalist L OY AH L IH S T
+loyalists L OY AH L IH S T S
+loyalists(2) L OY AH L IH S S
+loyalists(3) L OY AH L IH S
+loyall L OY AH L
+loyally L OY AH L IY
+loyalties L OY AH L T IY Z
+loyalton L OY AH L T IH N
+loyalty L OY AH L T IY
+loyce L OY S
+loyd L OY D
+loye L OY
+loyer L OY ER
+loynd L OY N D
+loyola L OY OW L AH
+loza L OW Z AH
+lozad L OW Z AE D
+lozada L OW Z AA D AH
+lozano L OW Z AA N OW
+lozano's L OW Z AA N OW Z
+lozeau L AH Z OW
+lozenge L AO Z AH N JH
+lozenges L AO Z AH N JH AH Z
+lozier L OW Z IY ER
+lozinski L AH Z IH N S K IY
+lozito L OW Z IY T OW
+lozon L OW Z AH N
+lozoya L OW Z OY AH
+lp EH L P IY
+lpn EH L P IY EH N
+ls EH L EH S
+lsd EH L EH S D IY
+ltd L IH M IH T IH D
+ltd(2) EH L T IY D IY
+lu L UW
+lua L UW AH
+luaka L UW AA K AH
+luallen L UW AE L AH N
+luana L UW AE N AH
+luanda L UW AA N D AH
+luanda's L UW AA N D AH Z
+luane L UW AH N
+luau L UW AW
+luba L UW B AH
+lubar L UW B AA R
+lubarsky L AH B AA R S K IY
+lubas L UW B AH Z
+lubavitch L UW B AH V IH CH
+lubavitcher L UW B AH V IH CH ER
+lubavitcher's L UW B AH V IH CH ER Z
+lubavitchers L UW B AH V IH CH ER Z
+lubben L AH B AH N
+lubber L AH B ER
+lubbers L AH B ER Z
+lubbock L AH B AH K
+lube L UW B
+lube's L UW B Z
+lubeck L UW B EH K
+lubell L UW B EH L
+lubensky L UW B EH N S K IY
+luber L UW B ER
+lubicons L UW B IH K AA N Z
+lubin L UW B IH N
+lubinov L UW B AH N AA V
+lubinov(2) L UW B AH N AA F
+lubinski L AH B IH N S K IY
+lubinsky L AH B IH N S K IY
+lubitz L UW B IH T S
+lubke L AH B K
+lublin L AH B L IH N
+lubow L UW B OW
+lubowski L UW B AW S K IY
+lubrano L UW B R AA N OW
+lubricant L UW B R AH K AH N T
+lubricants L UW B R AH K AH N T S
+lubricants(2) L UW B R IH K AH N T S
+lubricants(3) L UW B R AH K AH N S
+lubricants(4) L UW B R IH K AH N S
+lubricate L UW B R IH K EY T
+lubricated L UW B R AH K EY T IH D
+lubricating L UW B R AH K EY T IH NG
+lubrication L UW B R IH K EY SH AH N
+lubrizol L UW B R IH Z AA L
+luby L UW B IY
+luc L UW K
+luca L UW K AH
+lucado L UW K AA D OW
+lucarelli L UW K AA R EH L IY
+lucas L UW K AH S
+lucas' L UW K AH S
+lucas's L UW K AH S IH Z
+lucasfilm L UW K AE S F IH L M
+lucasfilm(2) L UW K AH S F IH L M
+lucasville L UW K AH S V IH L
+lucca L UW K AH
+lucchese L UW K EY Z IY
+lucchesi L UW K EH S IY
+lucchetti L UW K EH T IY
+lucci L UW CH IY
+lucco L UW K OW
+luce L UW S
+luce's L UW S IH Z
+lucent L UW S IH N T
+lucente L UW CH EH N T IY
+lucerne L UW S ER N
+lucero L UW CH EH R OW
+lucette L UW S EH T
+lucey L UW S IY
+luchini L UW K IY N IY
+luchsinger L AH K S IH N JH ER
+lucht L AH K T
+lucia L UW SH AH
+lucian L UW SH AH N
+luciani L UW CH AH N IY
+lucianna L UW CH AH N AH
+lucianne L UW S IY AE N
+luciano L UW CH IY AA N OW
+lucich L AH CH IH HH
+lucid L UW S AH D
+lucida L UW CH IY D AH
+lucidity L UW S IH D IH T IY
+lucido L UW CH IY D OW
+lucie L UW S IY
+lucien L UW S IY AH N
+lucienne L UW CH IY EH N
+lucier L UW S IY ER
+lucifer L UW S AH F ER
+lucile L UW S IY L
+lucille L UW S IY L
+lucinda L UW S IH N D AH
+lucio L UW S IY OW
+lucite L UW S AY T
+lucius L UW SH AH S
+luciw L UW S IH
+luck L AH K
+lucke L AH K
+lucked L AH K T
+lucken L AH K AH N
+luckenbach L AH K IH N B AA K
+luckenbaugh L AH K EH N B AO
+luckenbill L AH K IH N B AH L
+lucker L AH K ER
+luckett L AH K IH T
+luckey L AH K IY
+luckhardt L AH K HH AA R T
+luckie L AH K IY
+luckier L AH K IY ER
+luckiest L AH K IY AH S T
+luckily L AH K AH L IY
+lucking L AH K IH NG
+luckless L AH K L AH S
+luckman L AH K M AH N
+luckow L AH S K OW
+lucks L AH K S
+lucky L AH K IY
+lucky's L AH K IY Z
+luckyn L AH K IH N
+lucodendrum L UW K OW D EH N D R AH M
+lucrative L UW K R AH T IH V
+lucrecia L UW K R IY SH AH
+lucretia L UW K R IY SH AH
+lucus L UW K AH S
+lucy L UW S IY
+luczak L AH CH AE K
+ludcke L AH D K IY
+ludden L AH D AH N
+luddite L AH D AY T
+luddites L AH D AY T S
+luddy L AH D IY
+ludeke L AH D IH K
+ludella L UW D EH L AH
+ludeman L UW D M AH N
+ludemann L UW D M AH N
+ludewig L AH D UW IH G
+ludicrous L UW D AH K R AH S
+ludicrously L UW D AH K R AH S L IY
+ludington L AH D IH NG T AH N
+ludite L UW D AY T
+ludites L UW D AY T S
+ludke L AH D K IY
+ludlam L AH D L AH M
+ludlam's L AH D L AH M Z
+ludlow L AH D L OW
+ludlum L AH D L AH M
+ludlum's L AH D L AH M Z
+ludmer L AH D M ER
+ludmila L AH D M AY L AH
+ludmilla L AH D M IH L AH
+ludolph L AH D OW L F
+ludtke L AH D K IY
+ludvigsen L AH D V IH G S AH N
+ludvigson L AH D V IH G S AH N
+ludvik L AH D V IH K
+ludwick L AH D W IH K
+ludwig L AH D W IH G
+ludwiga L AH D V AY G AH
+ludwigshafen L AH D W IH G SH AH F AH N
+ludwin L AH D W IH N
+ludy L UW D IY
+lue L UW
+luebbe L UW B
+luebbers L UH B ER Z
+luebbert L UH B ER T
+luebke L UW B K
+lueck L UW IH K
+luecke L UW K
+luedecke L UH D IH K
+lueder L UH D ER
+lueders L UH D ER Z
+luedke L UW D K IY
+luedtke L UH D K IY
+lueh L W EH
+luehring L UH R IH NG
+luehrs L UH R Z
+lueken L UH K AH N
+luella L UW EH L AH
+luelle L UW L
+luellen L UH L AH N
+luepke L UW P K IY
+luera L UW EH R AH
+lueras L UH R AH Z
+lueras(2) L UW EH R AH Z
+luers L UW ER Z
+luerssen L UW R S AH N
+lueth L UW TH
+luetkemeyer L UH T K IH M AY ER
+luevano L UW EH V AA N OW
+luff L AH F
+luffed L AH F T
+luffman L AH F M AH N
+lufkin L AH F K IH N
+luft L AH F T
+lufthansa L AH F T AE N Z AH
+lufthansa's L AH F T AE N Z AH Z
+luftig L AH F T IH G
+luftkin L AH F T K IH N
+lufttransport L AH F T R AE N Z P AO R T
+lug L AH G
+lugano L UW G AA N OW
+lugar L UW G ER
+lugar's L UW G ER Z
+lugarda L UW G AA R D AH
+luge L UW JH
+luger L UW G ER
+lugers L UW G ER Z
+luggage L AH G AH JH
+luggage(2) L AH G IH JH
+lugging L AH G IH NG
+lugi L UW G IY
+luginbill L AH G IH N B AH L
+luginbuhl L AH G IH N B AH L
+lugkov L UW G K AO V
+lugo L UW G OW
+lugosi L UW G OW S IY
+lugosi(2) L AH G OW S IY
+lugs L AH G Z
+luguarda L UW G AA R D AH
+lugubrious L UW G Y UW B R IY AH S
+lugworm L AH G W ER M
+lugworms L AH G W ER M Z
+luhman L AH M AH N
+luhmann L AH M AH N
+luhn L AH N
+luhr L ER
+luhr(2) L UH R
+luhring L UH R IH NG
+luhrs L UH R Z
+lui L UW IH
+luick L UW K
+luigi L UW IY JH IY
+luigi's L UW IY JH IY Z
+luigi's(2) L W IY JH IY Z
+luikart L UW K AA R T
+luis L UW IY S
+luisa L UW IY Z AH
+luisi L UW S IY
+luiz L UW Z
+lujan L UW Y AA N
+luk L AH K
+luka L UW K AH
+lukach L AH K AH K
+lukacs L AH K AH K S
+lukas L UW K AH Z
+lukash L UW K AE SH
+lukasiewicz L AH K AA S AH V IH CH
+lukasik L AH K AA S IH K
+lukaszewski L AH K AH SH EH F S K IY
+lukavica L UW K AH V IH K AH
+lukavizta L UW K AH V IH T S T AH
+luke L UW K
+luke's L UW K S
+lukehart L UW K HH AA R T
+luken L UW K AH N
+lukenbill L UW K IH N B IH L
+lukens L UW K AH N Z
+luker L UW K ER
+lukes L UW K S
+lukewarm L UW K W AO R M
+lukin L UW K IH N
+lukins L UW K IH N Z
+lukman L AH K M AH N
+lukoil L UW K OY L
+lukowski L AH K AO F S K IY
+luks L AH K S
+lukyanov L UW K Y AH N AA V
+lula L UW L AH
+lula's L UW L AH Z
+lulie L AH L IY
+lull L AH L
+lullabies L AH L AH B AY Z
+lullaby L AH L AH B AY
+lulled L AH L D
+lulling L AH L IH NG
+lulls L AH L Z
+lulu L UW L UW
+lulue L UW L UW
+lum L AH M
+luma L UW M AH
+luman L UW M AH N
+lumb L AH M
+lumbago L AH M B EY G OW
+lumbar L AH M B AA R
+lumbard L AH M B ER D
+lumber L AH M B ER
+lumbering L AH M B ER IH NG
+lumberjack L AH M B ER JH AE K
+lumberman L AH M B ER M AH N
+lumberman's L AH M B ER M AE N Z
+lumbert L AH M B ER T
+lumberton L AH M B ER T AH N
+lumberyard L AH M B ER Y AA R D
+lumberyards L AH M B ER Y AA R D Z
+lumbra L AH M B R AH
+lumen L UW M AH N
+lumet L UW M AH T
+lumex L UW M AH K S
+lumia L UW M IY AH
+lumina L UW M IH N AH
+luminal L UW M AH N AH L
+luminance L UW M AH N AH N S
+luminaries L UW M AH N EH R IY Z
+luminary L UW M AH N EH R IY
+luminescence L UW M AH N EH S AH N S
+luminescent L UW M AH N EH S AH N T
+luminol L UW M IH N AO L
+luminoso L UW M IH N OW S OW
+luminous L UW M AH N AH S
+lumley L AH M L IY
+lumm L AH M
+lummus L AH M AH S
+lumonics L UW M AA N IH K S
+lump L AH M P
+lumpectomies L AH M P EH K T AH M IY Z
+lumpectomy L AH M P EH K T AH M IY
+lumped L AH M P T
+lumper L AH M P ER
+lumper's L AH M P ER Z
+lumping L AH M P IH NG
+lumpkin L AH M P K IH N
+lumpkins L AH M P K IH N Z
+lumpp L AH M P
+lumps L AH M P S
+lumpur L AH M P UH R
+lumpy L AH M P IY
+lumsden L AH M S D AH N
+lun L AH N
+luna L UW N AH
+lunacy L UW N AH S IY
+lunar L UW N ER
+lunati L UW N AA T IY
+lunatic L UW N AH T IH K
+lunatics L UW N AH T IH K S
+lunberg L AH N B ER G
+lunceford L AH N S IH F AO R D
+lunceford(2) L AH N S F AO R D
+lunch L AH N CH
+lunched L AH N CH T
+luncheon L AH N CH AH N
+luncheonette L AH N CH IH N EH T
+luncheonettes L AH N CH IH N EH T S
+luncheons L AH N CH AH N Z
+lunches L AH N CH IH Z
+lunching L AH N CH IH NG
+lunchroom L AH N CH R UW M
+lunchrooms L AH N CH R UW M Z
+lunchtime L AH N CH T AY M
+lund L AH N D
+lundahl L AH N D AA L
+lunday L AH N D EY
+lundberg L AH N D B ER G
+lundblad L AH N D B L AH D
+lundborg L AH N D B AO R G
+lunde L AH N D
+lundeen L AH N D IY N
+lundell L AH N D AH L
+lunden L AH N D AH N
+lunder L AH N D ER
+lundgren L AH N D G R EH N
+lundholm L AH N D HH OW L M
+lundin L AH N D IH N
+lundmark L AH N D M AA R K
+lundquist L AH N D K W IH S T
+lundstedt L AH N D S T IH T
+lundsten L AH N D S AH N
+lundstrom L AH N D S T R AH M
+lundt L AH N T
+lundy L AH N D IY
+lunenberg L UW N EH N B ER G
+lunetta L UW N EH T AH
+lung L AH NG
+lunge L AH N JH
+lunged L AH N JH D
+lunger L AH NG ER
+lunges L AH N JH IH Z
+lungfish L AH NG F IH SH
+lunging L AH N JH IH NG
+lungren L AH NG R EH N
+lungs L AH NG Z
+lunn L AH N
+lunney L AH N IY
+lunny L AH N IY
+lunsford L AH N S F ER D
+lunt L AH N T
+luntz L AH N T S
+luntz' L AH N T S
+luntz's L AH N T S IH Z
+lunz L AH N Z
+luo L W OW
+luoma L UW OW M AH
+luong L UW AO NG
+luongo L UW OW NG G OW
+lupa L UW P AH
+lupatkin L UW P AA T K IH N
+lupe L UW P
+luper L UW P ER
+lupfer L AH P F ER
+lupi L UW P IY
+lupica L UW P IY K AH
+lupien L AH P IY N
+lupin L UW P AH N
+lupinacci L UW P IY N AA CH IY
+lupine L UW P AY N
+lupinski L AH P IH N S K IY
+lupita L UW P IY T AH
+luplow L AH P L OW
+lupo L UW P OW
+lupone L UW P OW N
+luppino L UW P IY N OW
+luptak L AH P T AH K
+lupton L AH P T AH N
+lupus L UW P AH S
+luque L UW K
+luquette L AH K EH T
+lura L UH R AH
+lurch L ER CH
+lurched L ER CH T
+lurches L ER CH IH Z
+lurching L ER CH IH NG
+lure L UH R
+lured L UH R D
+lures L UH R Z
+lurette L ER EH T
+lurgi L ER JH IY
+luria L UH R IY AH
+lurid L UH R AH D
+lurie L UH R IY
+luring L UH R IH NG
+lurk L ER K
+lurked L ER K T
+lurking L ER K IH NG
+lurks L ER K S
+lurleen L ER L IY N
+lurlene L ER L IY N
+lurline L ER L AY N
+lurvey L ER V EY
+lurz L ER Z
+lusaka L UW S AA K AH
+lusardi L UW S AA R D IY
+lusby L AH S B IY
+lusch L AH SH
+luscher L AH SH ER
+luscious L AH SH IH S
+luscombe L UW S K OW M B IY
+luse L UW Z
+lush L AH SH
+lusher L AH SH ER
+lushlife L AH SH L AY F
+lushly L AH SH L IY
+lusignan L AH S IH G N AH N
+lusinchi L UW S IH N CH IY
+lusitania L UW S AH T EY N IY AH
+lusitania's L UW S AH T EY N IY AH Z
+lusitanias L UW S AH T EY N IY AH Z
+lusk L AH S K
+luskin L AH S K IH N
+lusky L AH S K IY
+lusser L AH S ER
+lussier L AH S IY ER
+lust L AH S T
+lusted L AH S T IH D
+luster L AH S T ER
+lustful L AH S T F AH L
+lustgarten L AH S T G AA R D AH N
+lustig L AH S T IH G
+lusting L AH S T IH NG
+lustre L AH S T ER
+lustrous L AH S T R AH S
+lusty L AH S T IY
+lute L UW T
+lutece L UW T EH S
+lutecia L UW T IY SH Y AH
+luten L UW T AH N
+luter L UW T ER
+lutes L UW T S
+lutey L UW T IY
+lutfalla L AH T F AE L AH
+lutgen L AH T G AH N
+luth L UW TH
+luther L UW TH ER
+lutheran L UW TH ER AH N
+lutherans L UW TH ER AH N Z
+luthi L UW DH IY
+luthy L AH TH IY
+lutman L AH T M AH N
+luton L UW T AH N
+lutsky L AH T S K IY
+lutter L AH T ER
+lutterman L AH T ER M AH N
+luttman L AH T M AH N
+lutton L AH T AH N
+luttrell L AH T R AH L
+luttrull L AH T R AH L
+luttwak L AH T W AA K
+lutweiler L AH T W AY L ER
+luty L UW T IY
+lutz L AH T S
+lutze L AH T Z
+lutzke L AH T S K IY
+luu L UW UW
+luvena L AH V IH N AH
+luvs L AH V Z
+luwana L AH W AE N AH
+lux L AH K S
+luxembourg L AH K S AH M B AO R G
+luxembourg(2) L AH K S AH M B ER G
+luxor L AH K S ER
+luxottica L AH K S OW T IY K AH
+luxottica's L AH K S OW T IY K AH Z
+luxottica's(2) L AH K S AA T IH K AH Z
+luxottica(2) L AH K S AA T IH K AH
+luxton L AH K S T AH N
+luxuriant L AH G ZH ER IY AH N T
+luxuries L AH G ZH ER IY Z
+luxurious L AH G ZH ER IY AH S
+luxury L AH G ZH ER IY
+luyster L AY S T ER
+luz L AH Z
+luzader L AH Z AH D ER
+luzar L UW Z ER
+luzhkov L UW ZH K AO V
+luzier L UW Z IY ER
+luzon L UW Z AA N
+luzzi L UW T S IY
+lwin L W IH N
+lwin(2) EH L W IH N
+lwin(3) L UW IH N
+lxi L K S IY
+lxi(2) EH L EH K S AY
+ly L AY
+lyall L AY AH L
+lyanne L IY AE N
+lyanne(2) L AY AE N
+lybarger L AY B AA R G ER
+lybeck L AY B EH K
+lybrand L AY B R AE N D
+lybrand's L AY B R AH N D Z
+lycan L AY K AH N
+lycoming L AY K AH M IH NG
+lycoming(2) L AY K OW M IH NG
+lycos L AY K OW S
+lycra L AY K R AH
+lycurgus L AY K ER G AH S
+lyda L AY D AH
+lydall L AY D AH L
+lyday L AY D EY
+lyde L AY D
+lyden L AY D AH N
+lydia L IH D IY AH
+lydic L IH D IH K
+lydick L IH D IH K
+lydie L IH D IY
+lydon L IH D AH N
+lye L AY
+lyell L AY EH L
+lyerla L AY ER L AH
+lyerly L AY ER L IY
+lyford L IH F ER D
+lying L AY IH NG
+lyke L AY K
+lykens L AY K AH N Z
+lykes L AY K S
+lykin L AY K AH N
+lykins L IH K AH N Z
+lyle L AY L
+lyle's L AY L Z
+lyles L AY L Z
+lyman L AY M AH N
+lyme L AY M
+lymph L IH M F
+lymphadenopathy L IH M F AH D EH N AH P AE TH IY
+lymphatic L IH M F AE T IH K
+lymphoblast L IH M F AH B L AE S T
+lymphoblastic L IH M F AH B L AE S T AH K
+lymphocyte L IH M F AH S AY T
+lymphocytes L IH M F AH S AY T S
+lymphoma L IH M F OW M AH
+lymphomas L IH M F OW M AH Z
+lyn L IH N
+lynam L IH N AH M
+lynch L IH N CH
+lynch's L IH N CH IH Z
+lynchburg L IH N CH B ER G
+lynched L IH N CH T
+lynching L IH N CH IH NG
+lynchings L IH N CH IH NG Z
+lynd L IH N D
+lynda L IH N D AH
+lynde L IH N D
+lynden L IH N D AH N
+lyndhurst L IH N D HH ER S T
+lyndon L IH N D AH N
+lynds L IH N D Z
+lyne L AY N
+lynes L AY N Z
+lyness L AY N EH S
+lynette L AY N EH T
+lynette(2) L IH N EH T
+lynford L IH N F ER D
+lyng L IH NG
+lynk L IH NG K
+lynn L IH N
+lynn's L IH N Z
+lynna L AY N AH
+lynne L IH N
+lynott L AY N AH T
+lynskey L IH N S K IY
+lynton L IH N T AH N
+lynx L IH NG K S
+lynxes L IH NG K S IH Z
+lyon L AY AH N
+lyon's L AY AH N Z
+lyondell L AY AH N D EH L
+lyonnais L IY AH N EY
+lyonnais's L AY AH N EY Z IH Z
+lyonnais(2) L AY AH N EY Z
+lyonnaise L AY AH N EY Z
+lyons L AY AH N Z
+lyons's L AY AH N Z IH Z
+lyphomed L AY F AH M EH D
+lyphomed's L AY F AH M EH D Z
+lyphomed's(2) L IH F AH M EH D Z
+lyphomed(2) L IH F AH M EH D
+lyra L AY R AH
+lyre L AY R
+lyric L IH R IH K
+lyrical L IH R IH K AH L
+lyrically L IH R IH K L IY
+lyricism L IH R IH S IH Z AH M
+lyricist L IH R IH S IH S T
+lyricists L IH R IH S IH S T S
+lyricists(2) L IH R IH S IH S S
+lyricists(3) L IH R IH S IH S
+lyrics L IH R IH K S
+lyris L IH R IH S
+lyrist L IH R IH S T
+lysaght L AY S AA T
+lysander L AY S AE N D ER
+lysandra L AY S AE N D R AH
+lysine L AY S IY N
+lysis L AY S IH S
+lysistrata L AY S IH S T R AA T AH
+lyski L AY S K IY
+lysne L AY N
+lysol L AY S AO L
+lyssy L IH S IY
+lyster L IH S T ER
+lyter L AY T ER
+lythgoe L IH TH G OW
+lytle L AY T AH L
+lyttle L IH T AH L
+lytton L IH T AH N
+lyubimov L Y UW B AH M AA V
+lyubimov's L Y UW B AH M AA V Z
+lyvers L AY V ER Z
+m EH M
+m'bow M B OW
+m'bow(2) EH M B OW
+m's EH M Z
+m-8 EH M EY T
+m-80 EH M EY T IY
+m-code EH M K OW D
+m-codes EH M K OW D Z
+m. EH M
+m.'s EH M Z
+m.s EH M Z
+m1 EH M W AH N
+m2 EH M T UW
+m3 EH M TH R IY
+m4 EH M F AO R
+m5 EH M F AY V
+ma M AA
+ma'am M AE M
+maack M AA K
+maaco M EY K OW
+maag M AA G
+maahs M AA Z
+maalox M EY L AA K S
+maam M AH M
+maas M AA Z
+maass M AA S
+maassen M AA S AH N
+maastricht M AA S T R IH K T
+mab M AE B
+mabe M EY B
+mabee M AE B IY
+mabel M EY B AH L
+mabelle M AH B EH L
+maben M AE B AH N
+maberry M AA B EH R IY
+mabery M AE B ER IY
+mabey M EY B IY
+mabie M AE B IY
+mabile M AA B AH L
+mabin M AE B IH N
+mabis M AE B IH S
+mable M EY B AH L
+mabley M AE B L IY
+mabon M EY B AH N
+mabrey M AE B R IY
+mabry M AE B ER IY
+mabus M AE B IH S
+mac M AE K
+mac's M AE K S
+macabre M AH K AA B R AH
+macabre(2) M AH K AA B ER
+macadam M AH K AE D AH M
+macadamia M AE K AH D EY M IY AH
+macallister M AH K AE L IH S T ER
+macalpine M AH K AE L P AY N
+macaluso M AE K AH L UW S OW
+macandrews M AH K AE N D R UW Z
+macao M AH K AW
+macaques M AH K AA K S
+macarena M AE K AH R IY N AH
+macari M AA K AA R IY
+macaroni M AE K ER OW N IY
+macarthur M AH K AA R TH ER
+macartney M AH K AA R T N IY
+macau M AH K AW
+macaulay M AH K AO L IY
+macauley M AH K AO L IY
+macaw M AH K AO
+macaws M AH K AO Z
+macbeth M AH K B EH TH
+macbride M AH K B R AY D
+maccabean M AE K AH B IY AH N
+maccabee M AE K AH B IY
+maccabees M AE K AH B IY Z
+maccallum M AH K AE L AH M
+maccaquano M AE K AH K W AA N OW
+maccarone M AE K ER OW N
+maccarthy M AH K AA R TH IY
+macchi M AE K IY
+macchia M AE K IY AH
+macchio M AE K IY OW
+macconnell M AH K AA N AH L
+maccormack M AH K AO R M AH K
+macdermott M AH K D ER M AH T
+macdiarmid M AH K D IH R M IH D
+macdill M AH K D IH L
+macdill's M AH K D IH L Z
+macdonald M AH K D AA N AH L D
+macdonald's M AH K D AA N AH L D Z
+macdonell M AH K D AA N AH L
+macdonnell M AH K D AA N AH L
+macdonough M AH K D AA N AH F
+macdougal M AH K D UW G AH L
+macdougall M AH K D UW G AH L
+macdowell M AH K D AW AH L
+macduff M AH K D AH F
+mace M EY S
+maceachern M AH K IY CH ER N
+maceda M AH S EY D AH
+macedo M AH S EY D OW
+macedonia M AE S AH D OW N IY AH
+macedonia(2) M AE K AH D OW N IY AH
+macedonian M AE S AH D OW N Y AH N
+macedonian(2) M AE K AH D OW N Y AH N
+macek M IH K EH K
+macera M AH S EH R AH
+macewan M AH K Y UW AH N
+macewan(2) M EY S W AA N
+macewen M AH K Y UW AH N
+macewen(2) M EY S W AA N
+macey M EY S IY
+macfadden M AH K F AE D AH N
+macfadyen M AH K F AE D IY AH N
+macfarland M AH K F AA R L AH N D
+macfarlane M AH K F AA R L AH N
+macgowan M AH G AW AH N
+macgraw M AH G R AA
+macgregor M AH G R EH G ER
+macgyver M AH G AY V ER
+macgyver's M AH G AY V ER Z
+mach M AA K
+macha M AE CH AH
+machacek M AE K AH S IH K
+machado M AH CH AA D OW
+machain M AH CH EY N
+machala M AH CH AA L AH
+machamer M AE K AH M ER
+mache M AE CH
+machel M AE CH AH L
+machen M AE K AH N
+macher M AE K ER
+macheski M AH CH EH S K IY
+machete M AH SH EH T IY
+machete(2) M AH CH EH T IY
+machetes M AH SH EH T IY Z
+machetes(2) M AH CH EH T IY Z
+machi M AA K IY
+machiavelli M AA K IY AH V EH L IY
+machiavelli's M AA K IY AH V EH L IY Z
+machiavelli's(2) M AA K Y AH V EH L IY Z
+machiavelli(2) M AA K Y AH V EH L IY
+machiavellian M AA K IY AH V EH L IY AH N
+machiavellian(2) M AA K Y AH V EH L IY AH N
+machida M AH CH IY D AH
+machin M AE CH IH N
+machination M AE K AH N EY SH AH N
+machination(2) M AE SH AH N EY SH AH N
+machinations M AE K AH N EY SH AH N Z
+machinations(2) M AE SH AH N EY SH AH N Z
+machine M AH SH IY N
+machine's M AH SH IY N Z
+machinea M AE SH AH N IY AH
+machined M AH SH IY N D
+machinegun M AH SH IY N G AH N
+machineguns M AH SH IY N G AH N Z
+machineries M AH SH IY N ER IY Z
+machineries(2) M AH SH IY N R IY Z
+machinery M AH SH IY N ER IY
+machinery(2) M AH SH IY N R IY
+machines M AH SH IY N Z
+machines' M AH CH IY N Z
+machining M AH SH IY N IH NG
+machinist M AH SH IY N AH S T
+machinists M AH SH IY N IH S T S
+machinists' M AH SH IY N IH S T S
+machinists'(2) M AH SH IY N IH S S
+machinists'(3) M AH SH IY N IH S
+machinists(2) M AH SH IY N IH S S
+machinists(3) M AH SH IY N IH S
+machismo M AH CH IH Z M OW
+machismo(2) M AH K IH Z M OW
+machivelli M AE K AH V EH L IY
+machivellian M AE K AH V EH L IY AH N
+machnik M AE K N IH K
+macho M AA CH OW
+machold M AH HH OW L D
+machowski M AH CH AO F S K IY
+macht M AE CH T
+machtley M AE T CH L IY
+machuca M AH CH UW K AH
+machuga M AH CH UW G AH
+maciag M AH K EY G
+macias M AA S IY AH S
+maciejewski M AH CH EH F S K IY
+maciejewski(2) M AH CH UW S K IY
+maciel M IH K IY L
+macik M AA CH IH K
+macinnes M AH K IH N AH S
+macinnis M AH K IH N AH S
+macintax M AE K AH N T AE K S
+macintosh M AE K AH N T AO SH
+macintosh's M AE K AH N T AA SH IH Z
+macintoshes M AE K AH N T AO SH IH Z
+macintyre M AE K AH N T AY R
+macioce M AA CH OW CH IY
+maciolek M AH CH IY OW L EH K
+macisaac M AH CH IH S AE K
+maciver M IY K IH V ER
+mack M AE K
+mack's M AE K S
+mackall M AE K AH L
+mackay M AH K EY
+macke M AE K
+mackel M AE K AH L
+mackellar M AH K EH L ER
+macken M AE K AH N
+mackenzie M AH K EH N Z IY
+mackerel M AE K ER AH L
+mackert M AE K ER T
+mackey M AE K IY
+mackie M AE K IY
+mackie's M AE K IY Z
+mackiewicz M AE K IY AH W IH T S
+mackiewicz(2) M AE K Y AH W IH T S
+mackin M AE K IH N
+mackinaw M AE K AH N AO
+mackinley M AH K IH N L IY
+mackinney M AH K IH N IY
+mackinnon M AH K IH N AH N
+mackintosh M AE K AH N T AA SH
+macklem M AE K L AH M
+mackler M AE K L ER
+mackley M AE K L IY
+macklin M AE K L IH N
+macklin's M AE K L IH N Z
+macknay M AE K N EY
+macknight M AH K N AY T
+macko M AE K OW
+mackowiak M AH S K AW IY AE K
+mackowski M AH S K AO F S K IY
+macks M AE K S
+macktal M AE K T AH L
+maclachlan M AH K L AE K L AH N
+maclaine M AH K L EY N
+maclaren M AH K L EH R AH N
+maclaughlin M AH K L AO K L IH N
+maclay M AH K L EY
+maclean M AH K L EY N
+macleish M AH K L IY SH
+maclellan M AH K L EH L AH N
+maclennan M AH K L EH N AH N
+macleod M AH K L AW D
+maclin M AE K L AH N
+macmahon M AH K M AE N
+macmaster M AH K M AE S T ER
+macmillan M AH K M IH L AH N
+macmillan's M AH K M IH L AH N Z
+macmullen M AH K M AH L AH N
+macmurray M AH K M ER IY
+macnab M AH K N AE B
+macnair M AH K N EH R
+macnamara M AE K N AH M EH R AH
+macnaughton M AH K N AO T AH N
+macneal M AH K N IY L
+macneil M AH K N IY L
+macneill M AH K N IY L
+macomb M EY K AH M
+macomber M AH K AA M B ER
+macon M EY K AH N
+macoute M AH K UW T
+macoutes M AH K UW T S
+macphail M AH K F EY L
+macphee M AH K F IY
+macpherson M AH K F ER S AH N
+macpherson's M AH K F ER S AH N Z
+macpherson's(2) M AH K F IH R S AH N Z
+macpherson(2) M AH K F IH R S AH N
+macquarrie M AH K EH R IY
+macqueen M AH K W IY N
+macrae M AH K R EY
+macrame M AE K R AH M EY
+macri M AE K R IY
+macro M AE K R OW
+macrodantin M AE K R OW D AE N T IH N
+macroeconomic M AE K R OW EH K AH N AA M IH K
+macroeconomic(2) M AE K R OW IY K AH N AA M IH K
+macroeconomics M AE K R OW EH K AH N AA M IH K S
+macroeconomics(2) M AE K R OW IY K AH N AA M IH K S
+macromedia M AE K R OW M IY D IY AH
+macrophage M AE K R OW F EY JH
+macrophages M AE K R OW F EY JH IH Z
+macrovision M AE K R OW V IH ZH AH N
+macs M AE K S
+macsharry M AH K SH EH R IY
+mactaggart M AH K T AE G ER T
+mactan M AH K T AE N
+mactavish M AH K T AE V IH SH
+macumber M AH K AH M B ER
+macumolo M AH K UW M OW L OW
+macumolo's M AH K UW M OW L OW Z
+macvicar M AH K V IH K ER
+macvicar's M AH K V IH K ER Z
+macvie M AE K V IY
+macwilliams M AH K W IH L Y AH M Z
+macworld M AE K W ER L D
+macy M EY S IY
+macy's M EY S IY Z
+macys M EY S IY Z
+maczko M AA CH K OW
+mad M AE D
+mada M AA D AH
+madagascar M AE D AH G AE S K ER
+madalena M AE D AH L EY N AH
+madam M AE D AH M
+madame M AE D AH M
+madame(2) M AH D AE M
+madan M EY D AH N
+madar M AE D ER
+madara M AA D AA R AH
+madaras M AA D AA R AA Z
+madaris M AE D ER IH S
+maday M AA D EY
+madcap M AE D K AE P
+madd M AE D
+maddalena M AA D AA L EH N AH
+maddamma M AH D AA M AH
+madden M AE D AH N
+maddening M AE D AH N IH NG
+maddening(2) M AE D N IH NG
+maddeningly M AE D AH N IH NG L IY
+maddeningly(2) M AE D N IH NG L IY
+madder M AE D ER
+maddie M AE D IY
+madding M AE D IH NG
+maddison M AE D IH S AH N
+maddock M AE D AH K
+maddocks M AE D AH K S
+maddox M AE D AH K S
+maddux M AE D AH K S
+maddy M AE D IY
+made M EY D
+madeira M AH D IH R AH
+madej M AE D IH JH
+madel M AE D AH L
+madelaine M AE D IH L EY N
+madeleine M AE D AH L EH N
+madelena M AA D EH L EH N AH
+madelene M AE D AH L IY N
+madelin M AE D AH L IH N
+madeline M AE D AH L IH N
+madella M AH D EH L AH
+madelle M AH D EH L
+madelon M AA D EY L AO N
+madelyn M AE D IH L IH N
+madelyn(2) M AE D L IH N
+mademoiselle M AE D AH M AH Z EH L
+maden M EY D AH N
+mader M EY D ER
+madera M AA D EH R AH
+madere M AE D ER
+madero M AA D EH R OW
+madewell M AE D IH W EH L
+madewell(2) M EY D W EH L
+madey M EY D IY
+madge M AE JH
+madhouse M AE D HH AW S
+madhusudan M AA D HH UW S UW D AH N
+madia M AA D IY AH
+madigan M AE D IH G AH N
+madill M AA D IY L
+madis M AE D AH S
+madison M AE D AH S AH N
+madison's M AE D AH S AH N Z
+madison's(2) M AE D IH S AH N Z
+madison(2) M AE D IH S AH N
+madkins M AE D K IH N Z
+madl M AE D AH L
+madlen M AE D AH L AH N
+madlin M AE D L IH N
+madlock M AE D L AA K
+madly M AE D L IY
+madman M AE D M AE N
+madmen M AE D M AH N
+madness M AE D N AH S
+madoc M AE D AH K
+madock M AE D AH K
+madoff M AE D AO F
+madog M AE D AH G
+madole M AH D OW L
+madonia M AA D OW N IY AH
+madonna M AH D AA N AH
+madonna's M AH D AA N AH Z
+madora M AH D AO R AH
+madore M AH D AO R EY
+madra M AA D R AH
+madras M AE D R AH S
+madre M AA D R EY
+madres M AA D R EY Z
+madrid M AH D R IH D
+madrids M AH D R IH D Z
+madrigal M AE D R AH G AH L
+madrigal(2) M AE D R IH G AH L
+madrigals M AE D R AH G AH L Z
+madrigals(2) M AE D R IH G AH L Z
+madril M AE D R IH L
+madron M AE D R AH N
+madruga M AE D R UW G AH
+madry M AE D R IY
+madsen M AE D S AH N
+madsen's M AE D S AH N Z
+madson M AE D S AH N
+madstones M AE D S T OW N Z
+mady M EY D IY
+madyun M AE D IY AH N
+madyun(2) M AE D Y AH N
+mae M EY
+mae's M EY Z
+maeda M EY IY D AH
+maeder M EH D ER
+maekawa M AA IH K AA W AH
+maelstrom M EY L S T R AH M
+maenza M AA EH N Z AH
+maersk M EH R S K
+maertens M EH R T AH N Z
+maertz M EH R T S
+maerz M EH R Z
+maes M EY Z
+maese M IY S
+maestas M EH S T AH Z
+maestra M AY S T R AH
+maestri M AA EH S T R IY
+maestro M AY S T R OW
+maeve M AH EH V
+maez M AY EH Z
+maffei M AE F AY
+maffeo M AA F IY OW
+maffett M AE F IH T
+maffia M AE F IY AH
+maffucci M AA F UW CH IY
+mafia M AA F IY AH
+mafia's M AA F IY AH Z
+mafias M AA F IY AH Z
+mafikeng M AA F AH K EH NG
+mag M AE G
+magadan M AE G AH D AE N
+magaji M AH G AA JH IY
+magallanes M AE G AH L EY N Z
+magallon M AE G AH L AA N
+magan M EY G AH N
+magana M AA G AE N AH
+magar M AE G ER
+magarian M AH G EH R IY AH N
+magaw M AE G AO
+magazine M AE G AH Z IY N
+magazine's M AE G AH Z IY N Z
+magaziner M AE G AH Z IY N ER
+magaziner's M AE G AH Z IY N ER Z
+magazines M AE G AH Z IY N Z
+magazines' M AE G AH Z IY N Z
+magby M AE G B IY
+magda M AE G D AH
+magdala M AA G D AA L AH
+magdalen M AE G D AH L AH N
+magdalena M AE G D AH L IY N AH
+magdalene M AE G D AH L IY N
+magdaleno M AA G D AA L EY N OW
+magee M AH G IY
+magel M AE G AH L
+magellan M AH JH EH L AH N
+magellan's M AH JH EH L AH N Z
+magellanic M AE JH AH L AE N IH K
+magenta M AH JH EH N T AH
+mager M AE G ER
+mager(2) M EY G ER
+magerman M AE G ER M AH N
+magers M AE G ER Z
+mages M EY JH IH Z
+maggard M AE G ER D
+maggart M AE G ER T
+maggi M AE JH IY
+maggie M AE G IY
+maggio M AA JH IY OW
+maggot M AE G AH T
+maggots M AE G AH T S
+maggs M AE G Z
+magi M EY JH AY
+magic M AE JH IH K
+magic's M AE JH IH K S
+magical M AE JH IH K AH L
+magically M AE JH IH K AH L IY
+magically(2) M AE JH IH K L IY
+magician M AH JH IH SH AH N
+magicians M AH JH IH SH AH N Z
+magid M AE JH IH D
+magie M EY JH IY
+magiera M AA JH IH R AH
+magill M AE JH AH L
+magin M AE JH IH N
+maginn M AE JH IH N
+maginnis M AE JH IH N IH S
+maginnis(2) M AH G IH N IH S
+maginot M AE JH IH N AA
+maginot(2) M AE JH IH N AH T
+magistad M AE JH IH S T AE D
+magisterial M AE JH IH S T IY R IY AH L
+magistrate M AE JH AH S T R EY T
+magistrate(2) M AE JH IH S T R EY T
+magistrates M AE JH IH S T R EY T S
+magistro M AA JH IY S T R OW
+maglaj M AA G L AY
+maglaj's M AA G L AY Z
+maglaj's(2) M AE G L AY Z
+maglaj(2) M AE G L AY
+maglev M AE G L EH V
+magley M AE G L IY
+magli M AE G L IY
+magliano M AA G L IY AA N OW
+maglica M AE G L IH K AH
+maglio M AE G L IY OW
+magliocco M AA G L IY OW K OW
+magliolo M AE G L IY OW L OW
+maglione M AA G L IY OW N IY
+maglis M AE G L IY Z
+magma M AE G M AH
+magma's M AE G M AH Z
+magna M AE G N AH
+magna's M AE G N AH Z
+magnan M AE G N AH N
+magnani M AA G N AA N IY
+magnanimous M AE G N AE N AH M AH S
+magnano M AA G N AA N OW
+magnant M AE G N AH N T
+magnate M AE G N AH T
+magnate(2) M AE G N EY T
+magnates M AE G N EY T S
+magnavox M AE G N AH V AA K S
+magner M AE G N ER
+magnesia M AE G N IY ZH AH
+magnesite M AE G N AH S AY T
+magnesium M AE G N IY Z IY AH M
+magness M AH G N IY S
+magnet M AE G N AH T
+magnet's M AE G N AH T S
+magnetek M AE G N EH T EH K
+magneti M AE G N EH T IY
+magnetic M AE G N EH T IH K
+magnetically M AE G N EH T IH K AH L IY
+magnetically(2) M AE G N EH T IH K L IY
+magnetics M AE G N EH T IH K S
+magnetism M AE G N AH T IH Z AH M
+magnetite M AE G N AH T AY T
+magnetization M AE G N AH T AH Z EY SH AH N
+magnetized M AE G N IH T AY Z D
+magnetometer M AE G N AH T AA M AH T ER
+magnetometers M AE G N AH T AA M AH T ER Z
+magnetron M AE G N AH T R AA N
+magnets M AE G N AH T S
+magnification M AE G N AH F AH K EY SH AH N
+magnifications M AE G N AH F AH K EY SH AH N Z
+magnificent M AE G N IH F AH S AH N T
+magnificent(2) M AE G N IH F IH S AH N T
+magnificently M AE G N IH F AH S AH N T L IY
+magnified M AE G N AH F AY D
+magnifier M AE G N AH F AY ER
+magnifiers M AE G N AH F AY ER Z
+magnifies M AE G N AH F AY Z
+magnify M AE G N AH F AY
+magnifying M AE G N AH F AY IH NG
+magnin M AE G N IH N
+magnitogorsk M AE G N IH T AH G AO R S K
+magnitude M AE G N AH T UW D
+magnitudes M AE G N AH T UW D Z
+magno M AE G N OW
+magnolia M AE G N OW L Y AH
+magnolias M AE G N OW L Y AH Z
+magnone M AA G N OW N IY
+magnum M AE G N AH M
+magnus M AE G N AH S
+magnuson M AE G N AH S AH N
+magnussen M AE G N AH S AH N
+magnusson M AE G N AH S AH N
+magoon M AH G UW N
+magouirk M AH G W ER K
+magowan M AA G OW W AA N
+magpie M AE G P AY
+magpies M AE G P AY Z
+magrane M AE G R EY N
+magrath M AH G R AE TH
+magri M AE G R IY
+magrini M AA G R IY N IY
+magro M AE G R OW
+magruder M AH G R UW D ER
+mags M AE G Z
+magten M AE G T EH N
+maguire M AH G W AY R
+magwood M AE G W UH D
+magyar M AE G Y AA R
+magyars M AE G Y AA R Z
+mah M AA
+mahabharata M AA HH AA B ER AA T AH
+mahady M AH HH AA D IY
+mahaffey M AH HH AE F IY
+mahaffy M AE HH AH F IY
+mahal M AH HH AA L
+mahala M AE HH AH L AH
+mahalah M AE HH AH L AH
+mahalia M AH HH AE L IY AH
+mahamud M AH HH AA M UH D
+mahan M EY AH N
+mahaney M AH HH EY N IY
+mahannah M AH HH AE N AH
+mahany M AE HH AH N IY
+mahar M AE HH ER
+maharaja M AA HH ER AA ZH AH
+maharaja's M AA HH ER AA ZH AH Z
+maharajahs M AA HH ER AA JH AH Z
+maharashtra M AA HH ER AA SH T R AH
+mahariv M AA HH AA R IY V
+maharive M AA HH AH R IY V
+mahathir M AE HH AH TH ER
+mahathir(2) M AH HH AE TH IH R
+mahathir(3) M AH HH AA TH IH R
+mahatma M AH HH AA T M AH
+mahayana M AA HH AH Y AA N AH
+mahdi M AA D IY
+mahe M EY HH IY
+mahen M EY HH EH N
+mahen(2) M EY AH N
+maher M AA R
+mahesh M AH HH EH SH
+maheu M AE HH Y UW
+mahfouz M AA F UW Z
+mahfouz's M AA F UW Z IH Z
+mahila M AH HH IH L AH
+mahin M AE HH IH N
+mahindra M AH HH IH N D R AH
+mahl M AA L
+mahle M EY HH AH L
+mahler M AA L ER
+mahler's M AA L ER Z
+mahlman M AA L M AH N
+mahlmann M AA L M AH N
+mahlon M EY L AO N
+mahlstedt M AA L S T IH T
+mahlum M AA L AH M
+mahmood M AE M UW D
+mahmood(2) M AA M UW D
+mahmoud M AE M UW D
+mahmoud(2) M AA M UW D
+mahmud M AE M UW D
+mahmud(2) M AA M UW D
+mahn M AE N
+mahnke M AE NG K
+mahnken M AA NG K AH N
+mahogany M AH HH AA G AH N IY
+mahon M EY AH N
+mahone M AE HH AH N
+mahoney M AH HH OW N IY
+mahony M AE HH AH N IY
+mahood M AA HH UH D
+mahowald M AE HH AW AO L D
+mahr M AA R
+mahrt M AA R T
+mahtan M AA T AA N
+mahtar M AA T ER
+mahurin M AE HH Y ER IH N
+mahvi M AA V IY
+mahwah M AA W AH
+mai M AY
+maia M AY AH
+maid M EY D
+maid's M EY D Z
+maida M EY D AH
+maidel M EY D AH L
+maiden M EY D AH N
+maidenform M EY D AH N F AO R M
+maidens M EY D AH N Z
+maidie M EY D IY
+maids M EY D Z
+maids' M EY D Z
+maiello M AY EH L OW
+maier M EY ER
+maiers M EY ER Z
+maietta M AY EH T AH
+mail M EY L
+mail's M EY L Z
+mailbag M EY L B AE G
+mailbags M EY L B AE G Z
+mailbox M EY L B AA K S
+mailboxes M EY L B AA K S IH Z
+maile M EY L
+mailed M EY L D
+mailer M EY L ER
+mailer's M EY L ER Z
+mailers M EY L ER Z
+mailey M EY L IY
+mailgram M EY L G R AE M
+mailgrams M EY L G R AE M Z
+mailhot M AY L HH AH T
+mailing M EY L IH NG
+mailings M EY L IH NG Z
+maillard M EH L AA R D
+maille M EY L
+maillet M EH L EH T
+mailloux M EH L UW
+mailman M EY L M AE N
+mailmen M EY L M EH N
+mailroom M EY L R UW M
+mailrooms M EY L R UW M Z
+mails M EY L Z
+mailson M EY L S AH N
+maim M EY M
+maimed M EY M D
+maiming M EY M IH NG
+maimone M EY M OW N
+maims M EY M Z
+main M EY N
+maina M EY N AH
+mainard M EY N ER D
+maine M EY N
+maine's M EY N Z
+mainer M EY N ER
+mainers M EY N ER Z
+maines M EY N Z
+mainframe M EY N F R EY M
+mainframes M EY N F R EY M Z
+mainichi M AA IH N IY CH IY
+mainland M EY N L AE N D
+mainland(2) M EY N L AH N D
+mainlander M EY N L AE N D ER
+mainlanders M EY N L AE N D ER Z
+mainline M EY N L AY N
+mainly M EY N L IY
+maino M EY N OW
+mainor M EY N ER
+mainord M EH N AO R D
+mains M EY N Z
+mainstay M EY N S T EY
+mainstays M EY N S T EY Z
+mainstream M EY N S T R IY M
+mainstreaming M EY N S T R IY M IH NG
+mainstreet M EY N S T R IY T
+maintain M EY N T EY N
+maintained M EY N T EY N D
+maintaining M EY N T EY N IH NG
+maintains M EY N T EY N Z
+maintenance M EY N T AH N AH N S
+maintenance(2) M EY N T N AH N S
+mainville M EY N V IH L
+mainwaring M EY N W EH R IH NG
+mainz M EY N Z
+maio M EY OW
+maiolo M AY OW L OW
+maione M AY OW N IY
+maiorana M AY AO R AE N AH
+maiorano M AY AO R AA N OW
+maiorino M AY AO R IY N OW
+mair M EH R
+maire M EH R
+mairead M OY R AH
+mairs M EH R Z
+mais M EY Z
+maisano M AH S AA N OW
+maisch M AY SH
+maisel M AY S AH L
+maish M AA IH SH
+maisie M EY Z IY
+maison M EY Z AH N
+maisonet M EH S AH N IH T
+maiti M EY T IY
+maitland M EY T L AH N D
+maitre M EY T R AH
+maize M EY Z
+maize's M EY Z AH Z
+maiziere M EY Z IH R
+maj M AE JH
+majcher M AE JH K ER
+majchrzak M AY R Z AH K
+majer M EY JH ER
+majerus M AE JH ER IH S
+majeske M AY EH S K IY
+majeski M AY EH S K IY
+majesta M AA Y EY S T AH
+majestic M AH JH EH S T IH K
+majestically M AH JH EH S T IH K AH L IY
+majestically(2) M AH JH EH S T IH K L IY
+majesty M AE JH AH S T IY
+majesty's M AE JH AH S T IY Z
+majette M AH ZH EH T
+majeure M AH JH UW R
+majewski M AY EH F S K IY
+majid M AH JH IH D
+majik M AE JH IH K
+majka M AY K AH
+majkowski M AY K AO F S K IY
+majnoon M AE JH N UW N
+majolica M AH JH AO L AH K AH
+major M EY JH ER
+major's M EY JH ER Z
+majorca M AY AO R K AH
+majordomo M EY JH ER D OW M OW
+majored M EY JH ER D
+majoring M EY JH ER IH NG
+majoritarian M AE JH ER IH T EH R IY AH N
+majorities M AH JH AO R IH T IY Z
+majority M AH JH AO R AH T IY
+majority's M AH JH AO R AH T IY Z
+majoros M AA Y AO R OW Z
+majors M EY JH ER Z
+majors' M EY JH ER Z
+majrooh M AE JH R UW
+majure M AA Y UH R EY
+mak M AE K
+mak-kwan M AE K K W AA N
+makar M AE K ER
+makara M AA K AA R AH
+makarewicz M AH K AA R IH V IH CH
+make M EY K
+makefield M EY K F IY L D
+makegood M EY K G UH D
+makegoods M EY K G UH D Z
+makela M AE K IH L AH
+makeover M AE K OW V ER
+makeovers M AE K OW V ER Z
+makepeace M AE K P IY S
+maker M EY K ER
+maker's M EY K ER Z
+makers M EY K ER Z
+makers' M EY K ER Z
+makes M EY K S
+makeshift M EY K SH IH F T
+makeup M EY K AH P
+makhoul M AH K UW L
+maki M AA K IY
+makin M AE K IH N
+makin' M EY K IH N
+makinen M AE K IH N AH N
+making M EY K IH NG
+makings M EY K IH NG Z
+makinson M AE K IH N S AH N
+makita M AH K IY T AH
+mako M AA K OW
+makos M EY K OW Z
+makoto M AH K OW T OW
+makowski M AH K AO F S K IY
+makowsky M AH K AW S K IY
+makris M AE K R IH S
+makro M AE K R OW
+maksoud M AE K S UW D
+maksymuk M AE K S IY M UH K
+maktoum M AE K T UW M
+maktoums M AE K T UW M Z
+makuch M AE K AH K
+mal M AE L
+mal's M AE L Z
+mala M AA L AH
+malabre M AE L AH B R AH
+malacanang M AH L AE K AH N AE NG
+malacca M AH L AE K AH
+malachowski M AH L AH HH AO F S K IY
+maladich M AE L AH D IH K
+maladich(2) M AE L AH D IH CH
+maladies M AE L AH D IY Z
+maladjusted M AE L AH JH AH S T IH D
+maladroit M AE L AH D R OY T
+malady M AE L AH D IY
+malaga M AE L AH G AH
+malagasy M AE L AH G AE S IY
+malahide M AE L AH HH AY D
+malaise M AE L EY Z
+malak M AE L AH K
+malamud M AE L AH M AH D
+malamugi M AE L AH M Y UW JH IY
+malamute M AE L AH M Y UW T
+malan M EY L AH N
+maland M AE L AH N D
+malaney M AH L EY N IY
+malanga M AA L AA NG G AH
+malanowski M AH L AH N AO F S K IY
+malaprop M AE L AH P R AA P
+malara M AA L AA R AH
+malaria M AH L EH R IY AH
+malarial M AH L EH R IY AH L
+malarkey M AH L AA R K IY
+malary M AE L AH R IY
+malaspina M AA L AA S P IY N AH
+malatesta M AA L AA T EH S T AH
+malathion M AH L AE TH IY AO N
+malathion(2) M AH L AE TH IY AH N
+malave M AA L AA V IY
+malawi M AH L AA W IY
+malawi's M AH L AA W IY Z
+malay M EY L EY
+malayan M AH L EY AH N
+malays M AH L EY Z
+malaysia M AH L EY ZH AH
+malaysia's M AH L EY ZH AH Z
+malaysian M AH L EY ZH AH N
+malaysians M AH L EY ZH AH N Z
+malbon M AE L B AH N
+malbrough M AE L B R AW
+malburg M AE L B ER G
+malchow M AA L HH AW
+malcolm M AE L K AH M
+malcolm's M AE L K AH M Z
+malcolmson M AE L K AH M S AH N
+malcom M AE L K AH M
+malcomb M AE L K AH M
+malcomson M AE L K AH M S AH N
+malcontent M AE L K AH N T EH N T
+malcontents M AE L K AH N T EH N T S
+malczewski M AH L CH EH F S K IY
+malden M AO L D AH N
+maldives M AO L D AY V Z
+maldonado M AE L D AH N AA D OW
+maldutis M AA L D UW T IH S
+male M EY L
+male's M EY L Z
+malec M AA L IH K
+malecha M AH L EH CH AH
+malecki M AH L EH K IY
+malefactor M AE L AH F AE K T ER
+malefactor(2) M AE L F AE K T ER
+malefactors M AE L AH F AE K T ER Z
+malefactors(2) M AE L F AE K T ER Z
+malek M AA L EH K
+malena M AE L IH N AH
+malenfant M AA L EY N F AH N T
+maler M EY L ER
+malerba M AA L EH R B AH
+males M EY L Z
+maleski M AH L EH S K IY
+malesky M AH L EH S K IY
+malevolent M AH L EH V AH L AH N T
+maley M EY L IY
+malfeasance M AE L F IY Z AH N S
+malfitano M AE L F IH T AA N OW
+malformation M AE L F AO R M EY SH AH N
+malformations M AE L F AO R M EY SH AH N Z
+malformed M AE L F AO R M D
+malfunction M AE L F AH NG K SH AH N
+malfunctioned M AE L F AH NG K SH AH N D
+malfunctioning M AE L F AH NG K SH AH N IH NG
+malfunctions M AE L F AH NG K SH AH N Z
+malhotra M AE L HH AA T R AH
+mali M AA L IY
+malia M AA L IY AH
+malibu M AE L AH B UW
+malice M AE L AH S
+malice(2) M AE L IH S
+malicious M AH L IH SH AH S
+maliciously M AH L IH SH IH S L IY
+malick M AE L IH K
+malicki M AH L IH K IY
+malicoat M AE L IH K OW T
+malign M AH L AY N
+malignancies M AH L IH G N AH N S IY Z
+malignancy M AH L IH G N AH N S IY
+malignant M AH L IH G N AH N T
+maligned M AH L AY N D
+malik M AE L IH K
+malin M AE L IH N
+malin(2) M EY L IH N
+malina M AA L IY N AH
+malinak M AE L IH N AE K
+malinda M AA L IY N D AH
+malinde M AE L IH N D
+maline M AA L IY N IY
+malino M AH L IY N OW
+malinoski M AH L IH N AW S K IY
+malinowski M AH L IH N AO F S K IY
+malinski M AH L IH N S K IY
+malis M AA L IY Z
+maliszewski M AH L IH SH EH F S K IY
+malizia M AH L IH Z IY AH
+malkiel M AO L K IY AH L
+malkiewicz M AA L K AH V IH CH
+malkin M AE L K IH N
+malkovich M AO L K AH V IH CH
+malkowski M AH L K AO F S K IY
+mall M AO L
+mall's M AO L Z
+mallard M AE L ER D
+mallards M AE L ER D Z
+malle M AE L
+malleability M AE L IY AH B IH L AH T IY
+malleable M AE L IY AH B AH L
+mallek M AE L IH K
+mallen M AO L AH N
+maller M AO L ER
+mallery M AE L ER IY
+mallet M AE L IH T
+malleton M AE L AH T AH N
+malleton's M AE L AH T AH N Z
+mallett M AE L IH T
+mallette M AH L EH T
+malley M AE L IY
+mallia M AA L IY AH
+mallick M AE L IH K
+mallicoat M AE L IH K OW T
+mallie M AO L IY
+mallightco M AE L AY T K OW
+mallin M AE L IH N
+mallinckrodt M AE L IH NG K R AA T
+mallinger M AO L IH NG ER
+mallinson M AE L IH N S AH N
+mallis M AE L IH S
+mallison M AE L IH S AH N
+mallo M AA L OW
+malloch M AE L AH K
+mallon M AE L AH N
+mallonee M AE L AH N IY
+mallory M AE L ER IY
+malloseismic M AA L OW S AY Z M IH K
+mallow M AE L OW
+mallows M AE L OW Z
+malloy M AH L OY
+mallozzi M AE L AA Z IY
+mallrat M AO L R AE T
+mallrats M AO L R AE T S
+malls M AO L Z
+mally M AE L IY
+malm M AA M
+malmberg M AA L M B ER G
+malmgren M AE L M G R EH N
+malmquist M AE L M K W IH S T
+malmstrom M AE L M S T R AH M
+malnar M AE L N ER
+malnourish M AE L N ER IH SH
+malnourished M AE L N ER IH SH T
+malnutrition M AE L N UW T R IH SH AH N
+malo M AA L OW
+malon M AE L AH N
+malone M AH L OW N
+malone's M AH L OW N Z
+maloney M AH L OW N IY
+maloof M AH L UW F
+malosovich M AH L AO S AH V IH CH
+malott M AH L AA T
+malouf M AE L OW F
+maloy M AE L OY
+malpass M AE L P AH S
+malphrus M AE L F R AH S
+malpractice M AE L P R AE K T AH S
+malpractice(2) M AE L P R AE K T IH S
+malrite M AE L R AY T
+malrite's M AE L R AY T S
+malsom M AE L S AH M
+malson M AE L S AH N
+malstrom M AE L S T R AH M
+malt M AO L T
+malta M AO L T AH
+maltais M AH L T EY
+maltase M AO L T EY S
+maltbie M AE L T B IY
+maltby M AE L T B IY
+malted M AO L T AH D
+malter M AO L T ER
+maltese M AO L T IY Z
+malting M AO L T IH NG
+maltose M AO L T OW S
+maltreated M AE L T R IY T IH D
+maltreatment M AE L T R IY T M AH N T
+malts M AO L T S
+maltz M AE L T S
+malueg M AE L UH G
+maluken M AE L UW K IH N
+maluso M AH L UW S OW
+malva M AA L V AH
+malval M AA L V AA L
+malveaux M AE L V OW
+malvern M AE L V ER N
+malvie M AO L V IY
+malvin M AE L V IH N
+malvina M AA L V IY N AH
+malvinas M AO L V IY N AH S
+maly M EY L IY
+malzahn M AE L Z AH N
+mam M AA M
+mam(2) EH M EY EH M
+mama M AA M AH
+mama's M AA M AH Z
+mamaroneck M AH M EH R AH N EH K
+mamas M AA M AH Z
+mamba M AA M B AH
+mambas M AA M B AH Z
+mambo M AA M B OW
+mame M EY M
+mameluke M AE M AH L UW K
+mamet M AE M AH T
+mamet's M AE M AH T S
+mamie M EY M IY
+mamis M AE M IH S
+mamma M AA M AH
+mammal M AE M AH L
+mammalian M AH M EY L IY AH N
+mammalian(2) M AH M EY L Y AH N
+mammallike M AE M AH L L AY K
+mammals M AE M AH L Z
+mammary M AE M ER IY
+mammen M AE M AH N
+mammogram M AE M OW G R AE M
+mammograms M AE M OW G R AE M Z
+mammography M AH M AA G R AH F IY
+mammoth M AE M AH TH
+mammoths M AE M AH TH S
+mamone M AH M OW N
+mamsted M AE M S T EH D
+mamula M AE M Y UW L AH
+man M AE N
+man's M AE N Z
+mana M AA N AH
+manac M AE N AE K
+manafort M AE N AH F AO R T
+manage M AE N AH JH
+manage(2) M AE N IH JH
+manageable M AE N IH JH AH B AH L
+managed M AE N AH JH D
+managed(2) M AE N IH JH D
+management M AE N AH JH M AH N T
+management's M AE N IH JH M AH N T S
+management(2) M AE N IH JH M AH N T
+managements M AE N IH JH M AH N T S
+managements' M AE N IH JH M AH N T S
+manager M AE N AH JH ER
+manager's M AE N IH JH ER Z
+manager(2) M AE N IH JH ER
+managerial M AE N IH JH IH R IY AH L
+managers M AE N AH JH ER Z
+managers' M AE N AH JH ER Z
+managers(2) M AE N IH JH ER Z
+manages M AE N IH JH IH Z
+managing M AE N AH JH IH NG
+managua M AH N AA G W AH
+managua's M AH N AA G W AH Z
+manahan M AE N AH HH AE N
+manak M AE N AH K
+manalo M AA N AA L OW
+manama M AE N AH M AH
+manard M AE N ER D
+manas M AA N AH Z
+manasco M AA N AA S K OW
+manasion M AE N AH SH AH N
+manasion's M AE N AH SH AH N Z
+manassas M AH N AA S AH S
+manatee M AE N AH T IY
+manatees M AE N AH T IY Z
+manatt M AE N AH T
+manbeck M AE N B EH K
+mancala M AA N K AA L AH
+mance M AE N S
+mancebo M AA N CH EH B OW
+mancera M AE N S EH R AH
+mancha M AA N K AH
+manchester M AE N CH EH S T ER
+manchu M AE N CH UW
+manchuria M AE N CH UH R IY AH
+mancil M AE N S IH L
+mancilla M AE N S IH L AH
+mancillas M AH N S IH L AH Z
+mancinelli M AA N CH IY N EH L IY
+mancini M AA N CH IY N IY
+mancino M AA N CH IY N OW
+manco M AE NG K OW
+mancusi M AA N K UW S IY
+mancuso M AE NG K Y UW S OW
+manda M AE N D AH
+mandala M AA D AH L AH
+mandalay M AE N D AH L EY
+mandalit M AE N D AH L IH T
+mandalite M AE N D AH L AY T
+mandamus M AE N D EY M AH S
+mandarin M AE N D ER AH N
+mandarine M AE N D ER IY N
+mandarino M AA N D AA R IY N OW
+mandarins M AE N D ER AH N Z
+mandate M AE N D EY T
+mandated M AE N D EY T IH D
+mandates M AE N D EY T S
+mandating M AE N D EY T IH NG
+mandato M AA N D AA T OW
+mandatory M AE N D AH T AO R IY
+mandel M AE N D AH L
+mandela M AE N D EH L AH
+mandela's M AE N D EH L AH Z
+mandelbaum M AE N D AH L B AW M
+mandell M AE N D AH L
+mandella M AE N D EH L AH
+mander M AE N D ER
+manders M AE N D ER Z
+manderscheid M AE N D ER SH AY D
+manderson M AE N D ER S AH N
+mandeville M AE N D AH V IH L
+mandi M AE N D IY
+mandible M AE N D AH B AH L
+mandible(2) M AE N D IH B AH L
+mandich M AE N D IH K
+mandie M AE N D IY
+mandigo M AA N D IY G OW
+mandl M AE N D AH L
+mandle M AE N D AH L
+mandler M AE N D L ER
+mandolin M AE N D AH L IH N
+mandracchia M AE N D R AE K IY AH
+mandrake M AE N D R EY K
+mandrell M AE N D R AH L
+mandresh M AE N D R EH SH
+mandrill M AE N D R IH L
+mandt M AE N T
+mandujano M AA N D UW Y AA N OW
+mandy M AE N D IY
+mane M EY N
+maned M EY N D
+manella M AH N EH L AH
+maner M EY N ER
+maners M EY N ER Z
+manes M EY N Z
+maness M AA N IH S
+manet M AE N EY
+manet(2) M AA N EY
+manette M AH N EH T
+maneuver M AH N UW V ER
+maneuverability M AH N UW V ER AH B IH L IH T IY
+maneuverability(2) M AH N UW V R AH B IH L IH T IY
+maneuverable M AH N UW V ER AH B AH L
+maneuvered M AH N UW V ER D
+maneuvering M AH N UW V ER IH NG
+maneuverings M AH N UW V ER IH NG Z
+maneuvers M AH N UW V ER Z
+maneval M AA N EY V AE L
+maney M EY N IY
+manford M AE N F ER D
+manfra M AE N F R AH
+manfre M AE N F ER
+manfred M AE N F R IH D
+manfredi M AA N F R EH D IY
+manfredo M AA N F R EY D OW
+manfully M AE N F AH L IY
+mang M AE NG
+manga M AE NG G AH
+mangan M AE NG G AH N
+manganaro M AA NG G AA N AA R OW
+manganello M AA NG G AA N EH L OW
+manganese M AE NG G AH N IY Z
+manganiello M AA NG G AA N IY EH L OW
+mangano M AA NG G AA N OW
+mangas M AE NG G AH Z
+mange M EY N JH
+mangel M EY NG G AH L
+mangels M EY NG G AH L Z
+mangement M EY N JH M AH N T
+mangen M AE NG AH N
+manger M EY N JH ER
+manges M EY N JH IH Z
+mangham M AE NG G AH M
+mangiapane M AE N JH IY AH P EY N
+mangiaracina M AA N JH ER AA CH IY N AH
+mangieri M AA NG G IH R IY
+mangin M AE NG G IH N
+mangine M AA NG G IY N IY
+mangini M AA NG G IY N IY
+mangino M AA NG G IY N OW
+mangione M AA N JH OW N IY
+manglapus M AE NG L AH P AH S
+mangle M AE NG G AH L
+mangled M AE NG G AH L D
+mangles M AE NG G AH L Z
+mangling M AE NG G AH L IH NG
+mangling(2) M AE NG G L IH NG
+mango M AE NG G OW
+mangoes M AE NG G OW Z
+mangold M AE N G OW L D
+mangone M AA NG G OW N IY
+mangope M AE NG G OW P EY
+mangosteen M AE NG G OW S T IY N
+mangosteens M AE NG G OW S T IY N Z
+mangosuthu M AE NG G AH S AH TH UW
+mangrove M AE N G R OW V
+mangrove(2) M AE NG G R OW V
+mangrum M AE NG G R AH M
+mangual M AE N G AH L
+mangueira M AA NG G Y EH R AH
+mangum M AE NG G AH M
+mangus M AE NG G IH S
+mangy M EY N JH IY
+manhandle M AE N HH AE N D AH L
+manhandled M AE N HH AE N D AH L D
+manhart M AE N HH AA R T
+manhasset M AE N HH AE S EH T
+manhattan M AE N HH AE T AH N
+manhattan's M AE N HH AE T AH N Z
+manheim M AE N HH AY M
+manhole M AE N HH OW L
+manhood M AE N HH UH D
+manhunt M AE N HH AH N T
+mani M AA N IY
+mania M EY N IY AH
+maniac M EY N IY AE K
+maniacal M AH N AY AH K AH L
+maniaci M AA N IY AA CH IY
+maniacs M EY N IY AE K S
+maniatis M AE N IY AA T IH S
+manic M AE N IH K
+manicure M AE N IH K Y ER
+manicured M AE N IH K Y ER D
+manicurist M AE N IH K Y ER IH S T
+manier M EH N IY ER
+manifest M AE N AH F EH S T
+manifestation M AE N AH F EH S T EY SH AH N
+manifestations M AE N AH F EH S T EY SH AH N Z
+manifested M AE N AH F EH S T AH D
+manifesting M AE N AH F EH S T IH NG
+manifestly M AE N AH F EH S T L IY
+manifesto M AE N AH F EH S T OW
+manifesto(2) M AE N IH F EH S T OW
+manifests M AE N AH F EH S T S
+manifests(2) M AE N AH F EH S S
+manifests(3) M AE N AH F EH S
+manifold M AE N AH F OW L D
+manifold(2) M AE N IH F OW L D
+manigat M AE N IH G AE T
+manigault M AE N IH G AO L T
+manigo M AA N IY G OW
+manik M AE N IH K
+manila M AH N IH L AH
+manila's M AH N IH L AH Z
+manilla M AH N IH L AH
+manilow M AE N IH L OW
+manioc M AE N IY AA K
+manion M AA N Y AO N
+maniples M AE N AH P AH L Z
+maniples(2) M AE N IH P AH L Z
+manipulate M AH N IH P Y AH L EY T
+manipulated M AH N IH P Y AH L EY T IH D
+manipulates M AH N IH P Y AH L EY T S
+manipulating M AH N IH P Y AH L EY T IH NG
+manipulation M AH N IH P Y AH L EY SH AH N
+manipulations M AH N IH P Y AH L EY SH AH N Z
+manipulative M AH N IH P Y AH L EY T IH V
+manipulator M AH N IH P Y AH L EY T ER
+manipulators M AH N IH P Y AH L EY T ER Z
+manis M AE N IH S
+maniscalco M AA N IY S K AA L K OW
+manischewitz M AE N IH SH EH V IH T S
+manish M AE N IH SH
+manitoba M AE N IH T OW B AH
+manitowoc M AE N IH T AH W AA K
+manjaca M AA N JH AA K AH
+manjarrez M AA N Y AA R EH Z
+mank M AE NG K
+manka M AE NG K AH
+mankato M AE N K AA T OW
+manke M AE NG K
+manker M AE NG K ER
+mankey M AE N K IY
+mankiewicz M AE NG K IH W IH T S
+mankiller M AE N K IH L ER
+mankin M AE NG K IH N
+mankind M AE N K AY N D
+mankind's M AE N K AY N D Z
+mankinds M AE N K AY N D Z
+mankins M AE NG K IH N Z
+manko M AE NG K OW
+mankowski M AH NG K AO F S K IY
+manley M AE N L IY
+manlove M AE N L AH V
+manly M AE N L IY
+manmade M AE N M EY D
+mann M AE N
+mann's M AE N Z
+manna M AE N AH
+mannarino M AE N ER IY N OW
+manne M AE N
+manned M AE N D
+mannella M AA N EH L AH
+mannen M AE N AH N
+mannequin M AE N AH K IH N
+mannequins M AE N AH K IH N Z
+manner M AE N ER
+mannered M AE N ER D
+mannering M AE N ER IH NG
+mannerism M AE N ER IH Z AH M
+mannerisms M AE N ER IH Z AH M Z
+mannerist M AE N ER AH S T
+mannerist(2) M AE N ER IH S T
+manners M AE N ER Z
+mannes M AE N Z
+mannesmann M AE N AH S M AH N
+manney M AE N IY
+mannheim M AE N HH AY M
+manni M AE N IY
+mannie M AE N IY
+mannina M AE N IH N AH
+manninen M AE N IH N AH N
+manning M AE N IH NG
+manning's M AE N IH NG Z
+mannino M AE N IY N OW
+mannion M AE N Y AH N
+mannis M AE N IH S
+mannix M AE N IH K S
+manno M AE N OW
+mannon M AE N AH N
+manns M AE N Z
+manny M AE N IY
+manny's M AE N IY Z
+mano M AA N OW
+manocchio M AA N OW K IY OW
+manoff M AE N AO F
+manolis M AE N AH L IH S
+manon M AA N AO N
+manoogian M AH N UW JH IY AH N
+manor M AE N ER
+manors M AE N ER Z
+manos M EY N OW Z
+manpower M AE N P AW ER
+manpower's M AE N P AW ER Z
+manring M AE N R IH NG
+manrique M AH N R IY K
+manriquez M AA N R IY K W EH Z
+manry M AE N R IY
+mans M AE N Z
+manseau M AH N S OW
+mansel M AE N S AH L
+mansell M AE N S AH L
+manser M AE N S ER
+mansfield M AE N Z F IY L D
+manship M AE N SH IH P
+mansion M AE N SH AH N
+mansions M AE N CH AH N Z
+manske M AE N S K
+mansker M AE N S K ER
+manslaughter M AE N S L AO T ER
+manso M AE N S OW
+manson M AE N S AH N
+manson's M AE N S AH N Z
+mansour M AE N S ER
+mansueto M AE N S W EY T OW
+mansur M AE N S ER
+manta M AE N T AH
+manteca M AA N T EH K AH
+manteer M AE N T IY R
+mantei M AE N T AY
+mantel M AE N T AH L
+mantell M AE N T EH L
+manter M AE N T ER
+manternach M AE N T ER N AH K
+manteufel M AE N T OY F AH L
+mantey M AE N T IY
+manthe M AE N DH
+manthei M AE N DH AY
+manthey M AE N TH IY
+mantia M AA N SH AH
+mantilla M AE N T IH L AH
+mantione M AA N T IY OW N IY
+mantis M AE N T IH S
+mantle M AE N T AH L
+mantle's M AE N T AH L Z
+mantles M AE N T AH L Z
+manton M AE N T AH N
+mantooth M AE N T UW TH
+mantra M AE N T R AH
+mantua M AE N CH UW AH
+mantz M AE N T S
+manu M AA N UW
+manual M AE N Y UW AH L
+manually M AE N Y UW AH L IY
+manuals M AE N Y UW AH L Z
+manucher M AE N UW K ER
+manuel M AA N W EH L
+manuela M AE N W EY L AH
+manuele M AE N UH L
+manufacture M AE N Y AH F AE K CH ER
+manufactured M AE N Y AH F AE K CH ER D
+manufacturer M AE N Y AH F AE K CH ER ER
+manufacturer's M AE N Y AH F AE K CH ER ER Z
+manufacturers M AE N Y AH F AE K CH ER ER Z
+manufacturers' M AE N AH F AE K CH ER ER Z
+manufactures M AE N Y AH F AE K CH ER Z
+manufacturing M AE N Y AH F AE K CH ER IH NG
+manufacturing's M AE N Y AH F AE K CH ER IH NG Z
+manure M AH N UH R
+manus M EY N IH S
+manuscript M AE N Y AH S K R IH P T
+manuscripts M AE N Y AH S K R IH P T S
+manvel M AE N V AH L
+manvil M AE N V IH L
+manville M AE N V IH L
+manville's M AE N V IH L Z
+manwaring M AE N W EH R IH NG
+manwarren M AH N W AO R AH N
+manweb M AE N W EH B
+manwell M AE N W EH L
+manwiller M AE N W IH L ER
+manx M AE NG K S
+many M EH N IY
+manz M AE N Z
+manza M AA N Z AH
+manzanares M AA N Z AA N AA R EH S
+manzanilla M AE N Z AH N IH L AH
+manzano M AA N Z AA N OW
+manzella M AE N Z EH L AH
+manzer M AE N Z ER
+manzi M AE N Z IY
+manzi's M AE N Z IY Z
+manzione M AA N Z IY OW N IY
+manzo M AE N Z OW
+mao M AW
+mao's M AW Z
+maoist M AW IH S T
+maoists M AW IH S T S
+maoists(2) M AW IH S S
+maoists(3) M AW IH S
+maori M AW R IY
+maoris M EY ER IH S
+maoris(2) M AW R IY Z
+map M AE P
+mapco M AE P K OW
+mapel M AE P AH L
+mapes M EY P S
+mapfumo M AE P F Y UW M OW
+mapi M AE P IY
+mapi's M AE P IY Z
+maple M EY P AH L
+maples M EY P AH L Z
+maplewood M EY P AH L W UH D
+mapp M AE P
+mapped M AE P T
+mapping M AE P IH NG
+mapplethorpe M AE P AH L TH AO R P
+maps M AE P S
+maputo M AH P UW T OW
+maputo's M AH P UW T OW Z
+maquila M AH K W IY L AH
+maquiladora M AE K W IH L AE D ER AH
+maquiladoras M AE K IY Y AH D AO R AH S
+maquilas M AE K W AH L AH S
+mar M AA R
+mara M AA R AH
+marabella M AE R AH B EH L AH
+marable M EH R AH B AH L
+marabou M EH R AH B UW
+maracle M AA R AH K AH L
+maradona M AA R AH D OW N AH
+maradona's M AA R AH D OW N AH Z
+maradonna M AA R AH D OW N AH
+maradonna's M AA R AH D OW N AH Z
+marafat M EH R AH F AE T
+marais M EH R EY
+marak M AE R AH K
+maralina M AA R AA L IY N AH
+maraline M AA R AA L IY N IY
+maran M AA R AA N
+maranda M ER AE N D AH
+marando M ER AE N D OW
+maraniss M ER AE N IH S
+marano M AA R AA N OW
+maranon M EH R AH N AA N
+marantette M EH R AH N T EH T
+maranto M ER AE N T OW
+marantz M AE R AH N T S
+maranville M AA R AA N V IH L
+maras M AA R AH Z
+maraschino M AE R AH S K IY N OW
+marasco M AA R AA S K OW
+marasek M ER AA S EH K
+marash M AA R AH SH
+marash' M AA R AH SH
+marash's M AA R AH SH IH S
+marathi M AH R AA T IY
+marathon M EH R AH TH AA N
+marathons M EH R AH TH AA N Z
+maraud M ER AO D
+marauder M ER AO D ER
+marauders M ER AO D ER Z
+marauding M ER AO D IH NG
+maravilla M AA R AA V IH L AH
+marbach M AA R B AA K
+marbella M AA R B EH L AH
+marberry M AA R B EH R IY
+marbil M AA R B IH L
+marble M AA R B AH L
+marble's M AA R B AH L Z
+marbled M AA R B AH L D
+marblehead M AA R B AH L HH EH D
+marbles M AA R B AH L Z
+marbod M AA R B AA D
+marbry M AA R B R IY
+marburger M AA R B ER G ER
+marbury M AA R B EH R IY
+marbut M AA R B AH T
+marc M AA R K
+marcade M AA R K EY D
+marcano M AA R K AA N OW
+marcantel M AA R K AA N T EH L
+marcantonio M AA R K AH N T OW N IY OW
+marceau M AA R S OW
+marceaux M AA R S OW
+marceca M AA R S EH K AH
+marcel M AA R S EH L
+marcela M AA R CH EH L AH
+marcelia M AA R CH EH L IY AH
+marcelino M AA R CH EH L IY N OW
+marcell M AA R S EY L
+marcella M AA R S EH L AH
+marcelle M AA R S EH L
+marcelli M AA R CH EH L IY
+marcellina M AA R CH EH L IY N AH
+marcelline M AA R CH EH L IY N IY
+marcellino M AA R CH EH L IY N OW
+marcello M AA R S EH L OW
+marcellus M AA R S EH L AH S
+marcelo M AA R CH EH L OW
+marcessa M AA R S EH S AH
+marcessa's M AA R S EH S AH Z
+march M AA R CH
+march's M AA R CH IH Z
+marchak M AA R CH AH K
+marchal M AA R CH AH L
+marchand M AA R K HH AE N D
+marchand(2) M AA R CH AE N D
+marchant M AA R CH AH N T
+marchbank M AA R CH B AE NG K
+marchbanks M AA R CH B AE NG K S
+marche M AA R SH
+marched M AA R CH T
+marchenko M AA R CH EH N K OW
+marcher M AA R CH ER
+marchers M AA R CH ER Z
+marches M AA R CH IH Z
+marchesani M AA R K EH S AA N IY
+marchesano M AA R K EH S AA N OW
+marcheschi M AA R CH EH SH IY
+marchese M AA R K IY Z IY
+marchesi M AA R K EH S IY
+marchessault M AA R SH IH S OW
+marchetta M AA R K EH T AH
+marchetti M AA R K EH T IY
+marchewka M ER CH Y UW K AH
+marchi M AA R K IY
+marching M AA R CH IH NG
+marchini M AA R K IY N IY
+marchinko M AA R CH IY NG K OW
+marchio M AA R K IY OW
+marchione M AA R K IY OW N IY
+marchioness M AA R SH AH N IH S
+marchioness(2) M AA R SH AH N EH S
+marchita M AA R K IY T AH
+marchitto M AA R K IY T OW
+marchman M AA R K M AH N
+marci M AA R S IY
+marcia M AA R SH AH
+marcia's M AA R SH AH Z
+marcial M AA R S IY AA L
+marciano M AA R CH IY AA N OW
+marciante M AA R CH AH N T IY
+marcie M AA R K IY
+marcil M AA R S IH L
+marcile M AA R CH AH L
+marcilio M AA R S IY L IY OW
+marcille M AA R S IH L
+marcin M AA R S IY N
+marcinek M ER CH IH N EH K
+marciniak M ER CH IH N IY AE K
+marcinko M AA R S IH NG K OW
+marcinkowski M ER CH IH NG K AO F S K IY
+marcinkus M AA R S IH NG K AH S
+marcissa M AA R S IH S AH
+marckesano M AA R K EH S AA N OW
+marcks M AA R K S
+marcmann M AA R K M AH N
+marco M AA R K OW
+marco's M AA R K OW Z
+marcoe M AA R K OW
+marcom M AA R K AH M
+marcon M AA R K AH N
+marcone M AA R K OW N IY
+marconi M AA R K OW N IY
+marcor M AA R K AO R
+marcos M AA R K OW S
+marcos' M AA R K OW S
+marcos'(2) M AA R K OW S IH Z
+marcos's M AA R K AH S IH Z
+marcoses M AA R K OW S IH Z
+marcoses' M AA R K OW S IH Z
+marcott M AA R K AA T
+marcotte M AA R K AO T
+marcou M AA R K UW
+marcoux M AA R K UW
+marcrum M AA R K R AH M
+marcucci M AA R K UW CH IY
+marcum M AA R K AH M
+marcus M AA R K AH S
+marcus's M AA R K AH S IH Z
+marcussen M AA R K AH S AH N
+marcy M AA R S IY
+marczak M AA R CH AE K
+marden M AA R D AH N
+marder M AA R D ER
+mardi M AA R D IY
+mardi-gras M AA R D IY G R AA
+mardis M AA R D IH S
+mardis(2) M AA R D IY S
+mardon M AA R D AH N
+mare M EH R
+mare's M EH R Z
+maready M ER EH D IY
+marean M AA R IY N
+marek M AA R EH K
+marelda M AA R EH L D AH
+marella M ER EH L AH
+marelli M EH R EH L IY
+mareno M AA R EH N OW
+mares M EH R Z
+maresca M AA R EH S K AH
+maresco M AA R EH S K OW
+maresh M AE R IH SH
+maret M AA R EY T
+marett M AE R IH T
+maretta M AA R EH T AH
+marette M ER EH T
+marez M AA R EH Z
+marfa M AA R F AH
+marga M AA R G AH
+margalo M AA R G AA L OW
+margalov M AA G AH L AO V
+margaret M AA R G ER IH T
+margaret's M AA R G ER IH T S
+margaret's(2) M AA R G R IH T S
+margaret(2) M AA R G R AH T
+margaret(3) M AA R G R IH T
+margareta M AA R G AA R EH T AH
+margarete M AA R G ER IY T
+margarethe M AA R G AA R EH DH IY
+margaretten M AA R G ER EH T AH N
+margarine M AA R JH ER AH N
+margarita M AA R G ER IY T AH
+margaritas M AA R G EH R IY T AH S
+margaux M AA R G OW
+marge M AA R JH
+margeotes M AA R JH IY OW T IY Z
+margerum M AA R G ER AH M
+margery M AA R JH ER IY
+margeson M AA R G IH S AH N
+marget M AA R G IH T
+margette M AA R ZH EH T
+margie M AA R JH IY
+margin M AA R JH AH N
+marginal M AA R JH AH N AH L
+marginalization M AA R JH AH N AH L AH Z EY SH AH N
+marginalize M AA R JH AH N AH L AY Z
+marginalized M AA R JH AH N AH L AY Z D
+marginalizes M AA R JH AH N AH L AY Z IH Z
+marginalizing M AA R JH AH N AH L AY Z IH NG
+marginally M AA R JH AH N AH L IY
+margined M AA R JH AH N D
+margining M AA R JH AH N IH NG
+margins M AA R JH AH N Z
+margiotta M AA R JH OW T AH
+margittai M AA R JH IH T AY
+margo M AA R G OW
+margolick M AA R G OW L IH K
+margolies M AA R G OW L IY Z
+margolin M AA R G AH L IH N
+margolin(2) M AA R G OW L AH N
+margolis M AA R G OW L IH S
+margory M ER G ER IY
+margoshes M AA R G AO SH IH Z
+margot M AA R G OW
+margraf M AA R G R AH F
+margrave M AA R G R EY V
+margret M AA R G R EH T
+margret's M AA R G R EH T S
+marguerite M AA R G ER IY T
+margulies M AA R G UW L IY Z
+margulis M AA R G AH L IH S
+margus M AA R G AH S
+margy M AA R JH IY
+marhefka M ER HH EH F K AH
+mari M AA R IY
+maria M ER IY AH
+maria's M ER IY AH Z
+mariachi M AA R IY AA CH IY
+mariah M ER AY AH
+mariam M EH R IY AE M
+marian M EH R IY AH N
+marian's M EH R IY AH N Z
+mariana M EH R IY AE N AH
+marianas M EH R IY AE N AH S
+mariani M AA R IY AA N IY
+mariani(2) M AA R IY AE N IY
+marianna M AA R IY AA N AH
+marianne M EH R IY AE N
+mariano M EH R IY AA N OW
+maribel M AE R IH B EH L
+marice M AA R IH S
+marich M AE R IH K
+maricle M AE R IH K AH L
+maricopa M EH R IH K OW P AH
+marie M ER IY
+marie's M ER IY Z
+mariel M EH R IY AH L
+marielito M EH R IY EH L IY T OW
+marielitos M EH R IY EH L IY T OW S
+marien M EH R IY N
+marienbonn M EH R IY N B AO N
+marienbonn's M EH R IY N B AO N Z
+marier M EH R IY ER
+marietta M EH R IY EH T AH
+marietta's M EH R IY EH T AH Z
+mariette M EH R IY EH T
+marife M AH R IY F EY
+marigold M EH R AH G OW L D
+marigolds M EH R AH G OW L D Z
+marijuana M EH R AH W AA N AH
+marik M AE R IH K
+marilda M AA R IY L D AH
+marilin M AE R IH L IH N
+marilla M AA R IH L AH
+marilu M EH R IY L UW
+marilyn M EH R AH L AH N
+marilyn's M EH R AH L AH N Z
+marilyn's(2) M EH R AH L IH N Z
+marilyn(2) M EH R AH L IH N
+marilynn M EH R AH L AH N
+marimba M ER IH M B AH
+marimbalax M ER IH M B AH L AH K S
+marin M EH R IH N
+marina M ER IY N AH
+marinaccio M AA R IH N AA CH IY OW
+marinade M AA R IH N EY D
+marinades M AA R IH N EY D Z
+marinaro M AA R IH N AA R OW
+marinas M ER IY N AH Z
+marinate M EH R AH N EY T
+marinated M EH R AH N EY T IH D
+marinates M EH R AH N EY T S
+marinating M EH R AH N EY T IH NG
+marine M ER IY N
+marine's M ER IY N Z
+marineau M EH R IH N OW
+marineland M ER IY N L AH N D
+marinelli M AA R IH N EH L IY
+marinello M AA R IH N EH L OW
+mariner M EH R AH N ER
+mariners M EH R AH N ER Z
+marines M ER IY N Z
+marines' M ER IY N Z
+marinez M AA R IY N EH Z
+maring M EH R IH NG
+marini M AA R IY N IY
+marinkovich M ER IH NG K AH V IH CH
+marino M ER IY N OW
+marino's M ER IY N OW Z
+marinoff M AE R IH N AO F
+marinos M ER IY N OW Z
+marinucci M AA R IY N UW CH IY
+marinvest M ER IH N V AH S T
+mario M AA R IY OW
+mario's M AA R IY OW Z
+marion M EH R IY AH N
+marion's M EH R IY AH N Z
+mariotta M EH R IY AA T AH
+mariotti M AA R IY OW T IY
+maris M EH R IH S
+marisa M AH R IH S AH
+mariscal M AA R AH S K AH L
+marish M EH R IH SH
+marissa M AH R IH S AH
+marissa's M AH R IH S AH Z
+marital M EH R AH T AH L
+maritime M EH R AH T AY M
+maritimes M EH R AH T AY M Z
+maritz M EH R IH T S
+mariucci M EH R IY UW CH IY
+marius M EH R IY AH S
+mariusa M AA R IY Y UW S AH
+marjai M AA R JH EY
+marje M AA R JH
+marjie M AA R JH IY
+marjoram M AA JH ER AH M
+marjorie M AA R JH ER IY
+marjorie(2) M AA R JH R IY
+marjory M AA R JH ER IY
+marjory(2) M AA R JH R IY
+marjy M AA R JH IY
+mark M AA R K
+mark's M AA R K S
+markair M AA R K EH R
+markair's M AA R K EH R Z
+markan M AA R K AH N
+markarian M AA R K EH R IY AH N
+markdown M AA R K D AW N
+markdowns M AA R K D AW N Z
+marke M AA R K
+marked M AA R K T
+markedly M AA R K AH D L IY
+markedly(2) M AA R K IH D L IY
+markee M AA R K IY
+markel M AA R K AH L
+markel(2) M AA R K EH L
+markell M AA R K AH L
+marken M AA R K AH N
+marker M AA R K ER
+markers M AA R K ER Z
+markert M AA R K ER T
+markese M AA R K IY S
+market M AA R K AH T
+market's M AA R K AH T S
+market(2) M AA R K IH T
+marketability M AA R K IH T AH B IH L IH T IY
+marketable M AA R K AH T AH B AH L
+marketamerica M AA R K AH T AH M EH R IH K AH
+marketed M AA R K AH T AH D
+marketed(2) M AA R K AH T IH D
+marketeer M AA R K AH T IH R
+marketeers M AA R K AH T IH R Z
+marketer M AA R K AH T ER
+marketer's M AA R K AH T ER Z
+marketers M AA R K AH T ER Z
+marketers' M AA R K AH T ER Z
+marketi M AA R K AH T IY
+marketing M AA R K AH T IH NG
+marketing's M AA R K AH T IH NG Z
+marketings M AA R K AH T IH NG Z
+marketmaker M AA R K AH T M EY K ER
+marketmakers M AA R K AH T M EY K ER Z
+marketplace M AA R K AH T P L EY S
+marketplace's M AA R K AH T P L EY S IH Z
+marketplace(2) M AA R K IH T P L EY S
+marketplaces M AA R K AH T P L EY S IH Z
+markets M AA R K AH T S
+markets' M AA R K IH T S
+markets(2) M AA R K IH T S
+marketscope M AA R K AH T S K OW P
+marketwide M AA R K AH T W AY D
+markey M AA R K IY
+markey's M AA R K IY Z
+markgraf M AA R K G R AH F
+markham M AA R K AH M
+markham's M AA R K AH M Z
+markie M AA R K IY
+markiewicz M AA R K AH V IH CH
+markin M AA R K IH N
+marking M AA R K IH NG
+markings M AA R K IH NG Z
+markka M AA R K AH
+markkaa M AA R K AA
+markkas M AA R K AH S
+markland M AA R K L AH N D
+markle M AA R K AH L
+markley M AA R K L IY
+markman M AA R K M AH N
+marko M AA R K OW
+markoff M AA R K AO F
+markos M AA R K OW Z
+markovic M AA R K AH V IH K
+markovich M AA R K AH V IH CH
+markovitz M AA R K AH V IH T S
+markow M AA R K OW
+markowicz M AA R K AH V IH CH
+markowitz M AA R K AH W IH T S
+markowski M ER K AO F S K IY
+marks M AA R K S
+marks's M AA R K S IH Z
+marksberry M AA R K S B EH R IY
+marksman M AA R K S M AH N
+marksmanship M AA R K S M AH N SH IH P
+marksmen M AA R K S M EH N
+markson M AA R K S AH N
+markum M AA R K AH M
+markunas M AA R K UW N AH Z
+markup M AA R K AH P
+markups M AA R K AH P S
+markus M AA R K AH S
+markuson M AA R K AH S AH N
+markwardt M AA R K W AO R T
+markwell M AA R K W EH L
+markwood M AA R K W UH D
+marky M AA R K IY
+marla M AA R L AH
+marland M AA R L AH N D
+marlar M AA R L ER
+marlatt M AA R L AH T
+marlboro M AA R L B ER OW
+marlboro's M AA R L B ER R OW Z
+marlboros M AA R L B ER R OW Z
+marlborough M AA R L B ER OW
+marleen M AA R L IY N
+marleene M AA R L IY N
+marlen M AA R L AH N
+marlena M AA R L EY N AH
+marlene M AA R L IY N
+marlens M AA R L AH N Z
+marler M AA R L ER
+marlett M AA R L IH T
+marlette M AA R L EH T
+marley M AA R L IY
+marliave M AA R L IY EH V
+marlin M AA R L AH N
+marlin(2) M AA R L IH N
+marling M AA R L IH NG
+marlins M AA R L AH N Z
+marlins' M AA R L AH N Z
+marlo M AA R L OW
+marlon M AA R L AH N
+marlow M AA R L OW
+marlowe M AA R L OW
+marlton M AA R L T AH N
+marlys M AA R L IY Z
+marmaduke M AA R M AH D UW K
+marmaduke's M AA R M AH D UW K S
+marmalade M AA R M AH L EY D
+marmalades M AA R M AH L EY D Z
+marmara M AA R M AA R AH
+marmer M AA R M ER
+marmion M AA R M IY AH N
+marmo M AA R M OW
+marmolejo M AA R M OW L EY Y OW
+marmon M AA R M AH N
+marmor M AA R M ER
+marmoset M AA R M AH Z EH T
+marnell M AA R N AH L
+marner M AA R N ER
+marney M AA R N IY
+maro M AA R OW
+maroc M AA R AO K
+marogen M EH R OW G AH N
+marohl M AE R OW L
+marohn M AA R AH N
+marois M ER W AA
+marold M AE R OW L D
+marolf M AE R OW L F
+marolt M AE R OW L T
+maron M AA R AO N
+marone M ER OW N
+maroney M ER OW N IY
+maroni M AA R OW N IY
+maronite M EH R AH N AY T
+maroon M ER UW N
+marooned M ER UW N D
+marooney M ER UW N IY
+marose M ER OW S
+marotta M ER AA T AH
+marotte M ER AO T
+marotto M AA R OW T OW
+marotz M AE R AH T S
+marous M EH R AH S
+marovich M AA R AH V IH CH
+marplan M AA R P L AE N
+marple M AA R P AH L
+marquai M AA R K W EY
+marquai(2) M AA R K EY
+marquand M AA R K W AH N D
+marquard M AA R K W AA R D
+marquardt M AA R K W AA R T
+marquart M AA R K W AA R T
+marque M AA R K
+marquee M AA R K IY
+marquerite M AA R G ER IY T
+marquerite(2) M AA R G R IH T
+marques M AA R K S
+marquess M AA R K W AH S
+marquest M AA R K W EH S T
+marquette M AA R K EH T
+marquez M AA R K EH Z
+marquis M AA R K IY
+marquiss M AA R K W IY S
+marquita M AA R K W IY T AH
+marr M AA R
+marra M AA R AH
+marrakech M AE R AH K EH SH
+marrazzo M AA R AA Z OW
+marred M AA R D
+marren M AA R AH N
+marrero M AA R EH R OW
+marrett M EH R IH T
+marriage M EH R IH JH
+marriages M EH R IH JH IH Z
+married M EH R IY D
+marries M EH R IY Z
+marrin M AE R IH N
+marriner M EH R IH N ER
+marring M AA R IH NG
+marriott M EH R IY AH T
+marriott's M EH R IY AH T S
+marris M AE R IH S
+marro M AA R OW
+marrocco M AA R OW K OW
+marron M EH R AH N
+marrone M AA R OW N IY
+marroquin M AA R OW K W IY N
+marrou M AH R UW
+marrow M EH R OW
+marrs M AA R Z
+marrufo M AA R UW F OW
+marrujo M AA R UW Y OW
+marry M EH R IY
+marrying M EH R IY IH NG
+mars M AA R Z
+mars' M AA R Z
+mars's M AA R Z IH Z
+marsal M AA R S AH L
+marsal(2) M AA R S AA L
+marsala M AA R S AA L AH
+marsalis M AA R S AH L IH S
+marsalis(2) M AA R S AA L IH S
+marsam M AA R S AE M
+marsch M AA R SH
+marschalk M AA R SH AO K
+marschall M AA R SH AH L
+marschke M AA R SH K
+marschner M AA R SH N ER
+marsden M AA R S D AH N
+marsdon M AA R S D AH N
+marse M AA R S
+marseca M AA R S EH K AH
+marseca's M AA R S EH K AH Z
+marsee M AA R S IY
+marseille M AA R S AY L
+marseilles M AA R S AY L AH S
+marseilles(2) M AA R S AY Z
+marseka M AA R S EH K AH
+marsella M AA R S EH L AH
+marsh M AA R SH
+marsh's M AA R SH IH Z
+marsha M AA R SH AH
+marshak M AA R SH AH K
+marshal M AA R SH AH L
+marshal's M AA R SH AH L Z
+marshaled M AA R SH AH L D
+marshaling M AA R SH AH L IH NG
+marshall M AA R SH AH L
+marshall's M AA R SH AH L Z
+marshalled M AA R SH AH L D
+marshalls M AA R SH AO L Z
+marshalltown M AA R SH AH L T AW N
+marshals M AA R SH AH L Z
+marshburn M AA R SH B ER N
+marshes M AA R SH AH Z
+marshes(2) M AA R SH IH Z
+marshfield M AA R SH F IY L D
+marshland M AA R SH L AE N D
+marshlands M AA R SH L AE N D Z
+marshmallow M AA R SH M EH L OW
+marshmallows M AA R SH M EH L OW Z
+marshman M AA R SH M AH N
+marshy M AA R SH IY
+marsicano M AA R S IY K AA N OW
+marsico M AA R S IY K OW
+marsiglia M AA R S IH G L IY AH
+marsili M AA R S IY L IY
+marsisa M AA R S IH S AH
+marsisa's M AA R S IH S AH Z
+marsland M AA R S L AH N D
+marso M AA R S OW
+marsolek M AA R S AH L EH K
+marson M AA R S AH N
+marsteller M AA R Z T EH L ER
+marsters M AA R S T ER Z
+marston M AA R S T AH N
+marsupial M AA R S UW P IY AH L
+marsupials M AA R S UW P IY AH L S
+marszalek M ER SH AA L EH K
+mart M AA R T
+mart's M AA R T S
+marta M AA R T AH
+marte M AA R T
+martech M AA R T EH K
+martek M AA R T EH K
+martel M AA R T EH L
+martell M AA R T EH L
+martella M AA R T EH L AH
+martelle M AA R T EH L
+martelli M AA R T EH L IY
+martellini M AA R T EH L IY N IY
+martello M AA R T EH L OW
+marten M AA R T AH N
+marteney M AA R T IH N IY
+martens M AA R T AH N Z
+martens's M AA R T AH N Z IH Z
+martensen M AA R T IH N S AH N
+martenson M AA R T IH N S AH N
+marter M AA R T ER
+marth M AA R TH
+martha M AA R TH AH
+martha's M AA R TH AH Z
+marthaler M AA R TH AH L ER
+marthe M AA R DH
+marthena M AA R TH IH N AH
+marti M AA R T IY
+marti's M AA R T IY Z
+martial M AA R SH AH L
+martialed M AA R SH AH L D
+martials M AA R SH AH L Z
+martian M AA R SH AH N
+martians M AA R SH AH N Z
+martie M AA R T IY
+martin M AA R T AH N
+martin's M AA R T AH N Z
+martin(2) M AA R T IH N
+martina M AA R T IY N AH
+martindale M AA R T IH N D EY L
+martine M AA R T IY N
+martineau M AA R T IH N OW
+martinec M AA R T IH N EH K
+martinek M AA R T IH N IH K
+martines M AA R T IY N Z
+martinez M AA R T IY N EH Z
+martinez's M AA R T IY N EH Z IH Z
+marting M AA R T IH NG
+martingale M AA R T IH NG EY L
+martini M AA R T IY N IY
+martinique M AA R T IH N IY K
+martinis M AA R T IY N IY Z
+martinka M AA R T IH NG K AH
+martinko M AA R T IH NG K OW
+martino M AA R T IY N OW
+martinovich M AA R T IH N AH V IH CH
+martins M AA R T IH N Z
+martins's M AA R T IH N Z IH Z
+martinsen M AA R T IH N S AH N
+martinson M AA R T IH N S AH N
+martinsville M AA R T IH N Z V IH L
+martiny M AA R T IH N IY
+martion M AA R SH Y AH N
+martire M AA R T IH R IY
+martirosov M AA R T IH R AH S AA V
+martis M AA R T IH S
+martita M AA R T IY T AH
+martocci M AA R T OW CH IY
+marton M AA R T AH N
+martone M AA R T OW N IY
+martorana M AA R T AO R AE N AH
+martorano M AA R T AO R AA N OW
+martorelli M AA R T AO R EH L IY
+marts M AA R T S
+martucci M AA R T UW CH IY
+marturano M AA R T UH R AA N OW
+martus M AA R T AH S
+marty M AA R T IY
+marty's M AA R T IY Z
+martyn M AA R T IH N
+martyr M AA R T ER
+martyrdom M AA R T ER D AH M
+martyre M AA R T AY R
+martyred M AA R T ER D
+martyrs M AA R T ER Z
+martz M AA R T S
+martz's M AA R T S IH Z
+marubeni M AA R UW B IY N IY
+maruca M ER UW K AH
+marucci M AA R UW CH IY
+marui M ER UW IY
+marukin M ER UW K IH N
+marulanda M AE R UW L AE N D AH
+marullo M AA R UW L OW
+maruska M ER AH S K AH
+maruti M ER UW T IY
+maruyama M AA R UW Y AA M AH
+maruyu M EH R UW Y UW
+marv M AA R V
+marva M AA R V AH
+marvel M AA R V AH L
+marvel's M AA R V AH L Z
+marvela M AA R V EY L AH
+marveled M AA R V AH L D
+marveling M AA R V AH L IH NG
+marvell M AA R V EH L
+marvella M AA R V EH L AH
+marvelle M AA R V EH L
+marvelous M AA R V AH L AH S
+marvelously M AA R V AH L AH S L IY
+marvels M AA R V AH L Z
+marver M AA R V ER
+marvin M AA R V IH N
+marvin's M AA R V IH N
+marwick M AA R W IH K
+marwick's M AA R W IH K S
+marwin M AA R W IH N
+marwood M AA R W UH D
+marx M AA R K S
+marxen M AA R K S AH N
+marxism M AA R K S IH Z AH M
+marxist M AA R K S AH S T
+marxist(2) M AA R K S IH S T
+marxists M AA R K S IH S T S
+marxists(2) M AA R K S IH S S
+marxists(3) M AA R K S IH S
+mary M EH R IY
+mary's M EH R IY Z
+marya M AA R Y AH
+maryalice M EH R IY AE L AH S
+maryann M EH R IY AE N
+maryanne M EH R IY AE N
+marybeth M EH R IY B EH TH
+maryland M EH R AH L AH N D
+maryland's M EH R AH L AH N D Z
+marylebone M ER L AH B OW N
+marylin M AE R IH L IH N
+marylou M AE R IY L UW
+marymount M EH R IY M AW N T
+marymount's M EH R IY M AW N T S
+maryruth M AE R IH R UW TH
+maryse M AA R IY S
+marysville M EH R IY Z V IH L
+maryville M EH R IY V IH L
+marz M AA R Z
+marzan M AA R Z AH N
+marzano M AA R Z AA N OW
+marzec M AA R Z IH K
+marzette M AA R Z EH T
+marzilli M AA R Z IY L IY
+marzo M AA R Z OW
+marzolf M AA R Z OW L F
+marzotto M AA R Z AA T OW
+marzullo M AA R Z UW L OW
+mas M AA Z
+masa M AA S AH
+masaaki M AA S AA AA K IY
+masahiko M AA S AA HH IY K OW
+masahiro M AA S AA HH IH R OW
+masai M AA S AA IY
+masakazu M AA S AA K AA Z UW
+masaki M AA S AA K IY
+masako M AH S AA K OW
+masami M AA S AA M IY
+masamilla M AA S AH M IH L AH
+masao M AA S AA OW
+masaru M AA S AA R UW
+masaya M AA S AA Y AH
+masayoshi M AA S AA Y OW SH IY
+masayuki M AA S AA Y UW K IY
+mascara M AE S K EH R AH
+mascarena M AE S K ER IH N AH
+mascarena(2) M AE K AH R IY N AH
+mascarenas M AE S K ER IH N AH Z
+mascarenas(2) M AE K AH R IY N AH Z
+mascari M AA S K AA R IY
+mascaro M AA S K AA R OW
+masch M AE SH
+maschino M AA S K IY N OW
+maschke M AE SH K
+masci M AE S IY
+mascia M AA S CH AH
+masciarelli M AA S CH ER EH L IY
+mascio M AE S IY OW
+mascioli M AA S CH OW L IY
+masco M AE S K OW
+mascola M AA S K OW L AH
+mascolo M AA S K OW L OW
+mascorro M AA S K AO R OW
+mascot M AE S K AH T
+mascot(2) M AE S K AA T
+mascots M AE S K AA T S
+masculine M AE S K Y AH L AH N
+masculinity M AE S K Y AH L IH N AH T IY
+masden M AE S D AH N
+mase M EY Z
+masefield M EY Z F IY L D
+masek M AA S EH K
+masella M AH S EH L AH
+maselli M AH S EH L IY
+maseng M AE S IH NG
+maser M EY Z ER
+maserati M AE S EH R AA T IY
+maseri M AH S EH R IY
+mash M AE SH
+mashalu M AH SH AE L UW
+mashantucket M AE SH AH N T AH K AH T
+mashaw M AE SH AO
+mashburn M AE SH B ER N
+mashed M AE SH T
+mashek M AE SH IH K
+masi M AA S IY
+masiello M AA S IY EH L OW
+masin M AA S IH N
+masini M AA S IY N IY
+masino M AA S IY N OW
+masius M AE S IY AH S
+mask M AE S K
+maske M EY S K
+masked M AE S K T
+maskell M AE S K AH L
+masker M AE S K ER
+masking M AE S K IH NG
+masks M AE S K S
+maslanka M AH S L AE NG K AH
+maslen M AE S AH L AH N
+masley M AE S L IY
+maslin M AE Z L IH N
+maslow M AA S L OW
+maslowski M AH S L AO F S K IY
+maslyukov M AE S L Y UW K AA V
+maso M AE Z OW
+masochism M AE S AH K IH Z AH M
+masochist M AE S AH K IH S T
+masochistic M AE S AH K IH S T IH K
+mason M EY S AH N
+mason's M EY S AH N Z
+masone M AH S OW N
+masoner M EY S AH N ER
+masonic M AH S AA N IH K
+masonite M AE S AH N AY T
+masonry M EY S AH N R IY
+masons M EY S AH N Z
+masood M AH S UW D
+masoud M AH S UW D
+masquerade M AE S K ER EY D
+masquerading M AE S K ER EY D IH NG
+masri M AA S R IY
+mass M AE S
+mass. M AE S
+mass.(2) M AE S AH CH UW S AH T S
+massa M AE S AH
+massachusetts M AE S AH CH UW S AH T S
+massachusetts' M AE S AH CH UW S AH T S
+massachussetts M AE S AH CH UW S AH T S
+massacre M AE S AH K ER
+massacred M AE S AH K ER D
+massacres M AE S IH K ER Z
+massacring M AE S AH K ER IH NG
+massad M AE S AH D
+massage M AH S AA ZH
+massaged M AH S AA ZH D
+massager M AH S AA ZH ER
+massagers M AH S AA ZH ER Z
+massages M AH S AA ZH IH Z
+massaging M AH S AA ZH IH NG
+massar M AE S ER
+massari M AA S AA R IY
+massaro M AH S AA R OW
+massat M AH S AA T
+massbauch M AE S B AA K
+masse M AE S
+massed M AE S T
+massenburg M AE S AH N B ER G
+massenet M AE S AH N EH T
+massenet's M AE S AH N EH T S
+massengale M AE S AH N G EY L
+massengill M AE S AH N G IH L
+masser M AE S ER
+massery M AE S ER IY
+masses M AE S AH Z
+masses(2) M AE S IH Z
+massett M AE S IH T
+massey M AE S IY
+massi M AE S IY
+massicotte M AE S IH K AO T
+massie M AE S IY
+massieu M AE S IY UW
+massif M AE S IY F
+massif(2) M AE S IH F
+massimino M AA S IY M IY N OW
+massimino's M AE S IH M IY N OW Z
+massimo M AE S IH M OW
+massing M AE S IH NG
+massingale M AA S IH NG G AA L IY
+massingill M AE S IH NG G AH L
+massive M AE S IH V
+massively M AE S IH V L IY
+massman M AE S M AH N
+massmann M AE S M AH N
+massmutual M AE S M Y UW CH UW AH L
+masso M AE S OW
+masson M AE S AH N
+massoni M AA S OW N IY
+massoth M AE S AH TH
+massport M AE S P AO R T
+massucci M AA S UW CH IY
+mast M AE S T
+mastandrea M AA S T AA N D R IY AH
+mastectomies M AE S T EH K T AH M IY Z
+mastectomy M AE S T EH K T AH M IY
+masted M AE S T AH D
+masted(2) M AE S T IH D
+mastel M EY S T AH L
+masteller M EY S T AH L ER
+masten M AE S T AH N
+master M AE S T ER
+master's M AE S T ER Z
+masterbate M AE S T ER B EY T
+masterbated M AE S T ER B EY T AH D
+masterbates M AE S T ER B EY T S
+masterbating M AE S T ER B EY T IH NG
+masterbation M AE S T ER B EY SH AH N
+mastercard M AE S T ER K AA R D
+mastercard's M AE S T ER K AA R D Z
+mastercards M AE S T ER K AA R D Z
+mastered M AE S T ER D
+masterful M AE S T ER F AH L
+masterfully M AE S T ER F AH L IY
+mastergate M AE S T ER G EY T
+mastering M AE S T ER IH NG
+masterly M AE S T ER L IY
+masterman M AE S T ER M AH N
+mastermind M AE S T ER M AY N D
+masterminded M AE S T ER M AY N D IH D
+masterminding M AE S T ER M AY N D IH NG
+masterminds M AE S T ER M AY N D Z
+masterpiece M AE S T ER P IY S
+masterpieces M AE S T ER P IY S AH Z
+masterpieces(2) M AE S T ER P IY S IH Z
+masters M AE S T ER Z
+masters' M AE S T ER Z
+masterson M AE S T ER S AH N
+masterstroke M AE S T ER S T R OW K
+masterwork M AE S T ER W ER K
+masterworks M AE S T ER W ER K S
+mastery M AE S T ER IY
+masthead M AE S T HH EH D
+mastif M AE S T AH F
+mastif's M AE S T AH F S
+mastiff M AE S T AH F
+mastifs M AE S T AH F S
+mastin M AE S T IH N
+mastodon M AE S T AH D AO N
+mastoiditis M AE S T OY D AY T AH S
+maston M AE S T AH N
+mastrangelo M AA S T R AA NG G EH L OW
+mastrianni M AA S T R IY AA N IY
+mastriano M AA S T R IY AA N OW
+mastrich M AE S T R IH CH
+mastrich's M AE S T R IH CH IH Z
+mastrich's(2) M AA S T R IH K S
+mastrich(2) M AA S T R IH K
+mastro M AE S T R OW
+mastrocola M AE S T R OW K OW L AH
+mastrogiovanni M AE S T R OW JH OW V AA N IY
+mastroianni M AE S T R OW Y AA N IY
+mastronardi M AE S T R OW N AA R D IY
+mastropietro M AE S T R OW P IY T R OW
+masts M AE S T S
+masts(2) M AE S S
+masturbate M AE S T ER B EY T
+masturbated M AE S T ER B EY T IH D
+masturbates M AE S T ER B EY T S
+masturbating M AE S T ER B EY T IH NG
+masturbation M AE S T ER B EY SH AH N
+masucci M AA S UW CH IY
+masuda M AH S UW D AH
+masullo M AA S UW L OW
+masur M AE S ER
+mat M AE T
+mata M AA T AH
+matabane M AE T AH B EY N
+matador M AE T AH D AO R
+matagorda M AE T AH G AO R D AH
+mataksas M AH T AE K S AH S
+matala M AH T AA L AH
+matala's M AH T AA L AH Z
+matalin M AE T AH L IH N
+matalin(2) M AE T L IH N
+matalon M AA T AA L AO N
+matamoros M AA T AA M AO R OW S
+matarazzo M AA T AA R AA Z OW
+matarese M AA T AA R EY Z IY
+matas M AA T AH Z
+matassa M AA T AA S AH
+mataya M AA T AA Y AH
+match M AE CH
+match's M AE CH IH Z
+matchbook M AE CH B UH K
+matchbooks M AE CH B UH K S
+matchbox M AE CH B AA K S
+matchboxes M AE CH B AA K S IH Z
+matched M AE CH T
+matches M AE CH AH Z
+matches(2) M AE CH IH Z
+matchett M AE CH IH T
+matching M AE CH IH NG
+matchlock M AE CH L AA K
+matchlocks M AE CH L AA K S
+matchmaker M AE CH M EY K ER
+matchmakers M AE CH M EY K ER Z
+matchmaking M AE CH M EY K IH NG
+matchup M AE CH AH P
+matchups M AE CH AH P S
+mate M EY T
+matecki M AH T EH K IY
+mated M EY T IH D
+mateer M AH T IH R
+mateja M AA T EY Y AH
+matejka M AH T EY K AH
+matell M AH T EH L
+matelski M AH T EH L S K IY
+mateo M AA T EY OW
+mater M AA T ER
+mater(2) M EY T ER
+mater(3) M AE T ER
+matera M AA T EH R AH
+material M AH T IH R IY AH L
+materialism M AH T IH R IY AH L IH Z AH M
+materialist M AH T IH R IY AH L IH S T
+materialistic M AH T IH R IY AH L IH S T IH K
+materiality M AH T IH R IY AE L IH T IY
+materialize M AH T IH R IY AH L AY Z
+materialized M AH T IH R IY AH L AY Z D
+materializes M AH T IH R IY AH L AY Z IH Z
+materializing M AH T IH R IY AH L AY Z IH NG
+materially M AH T IH R IY AH L IY
+materials M AH T IH R IY AH L Z
+materials' M AH T IH R IY AH L Z
+materiel M AH T IH R IY EH L
+materiels M AH T IH R IY EH L Z
+matern M AE T ER N
+materna M AA T EH R N AH
+maternal M AH T ER N AH L
+maternity M AH T ER N IH T IY
+mates M EY T S
+matewan M AE T UW AA N
+matewan(2) M EY T W AA N
+matey M EY T IY
+math M AE TH
+mathai M AA DH AA IY
+mathan M EY TH AH N
+mathe M EY DH
+mathea M AE DH IY AH
+matheis M AE DH AY Z
+mathematic M AE TH AH M AE T IH K
+mathematical M AE TH AH M AE T IH K AH L
+mathematically M AE TH AH M AE T IH K AH L IY
+mathematically(2) M AE TH AH M AE T IH K L IY
+mathematician M AE TH AH M AH T IH SH AH N
+mathematicians M AE TH AH M AH T IH SH AH N Z
+mathematics M AE TH AH M AE T IH K S
+mathena M AE TH IH N AH
+matheney M AE TH IH N IY
+matheny M AE TH IH N IY
+mather M AE DH ER
+matherly M AE DH ER L IY
+mathern M AE DH ER N
+matherne M AE TH ER N
+mathers M AE DH ER Z
+matherson M AE TH ER S AH N
+mathes M AE TH IH S
+matheson M AE TH AH S AH N
+matheson's M AE TH AH S AH N Z
+matheus M AE DH OY Z
+mathew M AE TH Y UW
+mathews M AE TH Y UW Z
+mathewson M AE TH Y UW S AH N
+mathey M AE DH IY
+mathia M AA DH IY AH
+mathias M AH TH AY AH S
+mathias(2) M AH T IY AH S
+mathiasen M AH TH AY AH S AH N
+mathiason M AH TH AY AH S AH N
+mathie M AE TH IY
+mathies M AE TH IY Z
+mathiesen M AE TH IY S AH N
+mathieson M AH TH IY Z AH N
+mathieu M AE TH Y UW
+mathilda M AH T IH L D AH
+mathilde M AE TH IH L D
+mathilde(2) M AH T IH L D
+mathis M AE TH IH S
+mathisen M AE TH AY Z AH N
+mathison M AE TH IH S AH N
+mathur M AE TH ER
+mathwig M AE TH W IH G
+mathy M AE TH IY
+mathys M EY TH IY Z
+matias M AA SH AH Z
+matic M AE T IH K
+matif M AA T IY F
+matilda M AH T IH L D AH
+matinee M AE T IH N EY
+mating M EY T IH NG
+mation M AE T Y AH N
+mation(2) M EY SH AH N
+matis M AA T IH S
+matisse M AE T IY S
+matisse's M AE T IY S IH Z
+matkin M AE T K IH N
+matkins M AE T K IH N Z
+matkovich M AA T K AH V IH CH
+matlack M AE T L AE K
+matlick M AE T L IH K
+matlin M AE T L IH N
+matlock M AE T L AA K
+matney M AE T N IY
+mato M AA T OW
+matoco M AH T AO K OW
+matola M AH T OW L AH
+matos M AA T OW Z
+matott M AE T AH T
+matousek M AH T UW S EH K
+matra M AE T R AH
+matra's M AE T R AH Z
+matranga M AA T R AA NG G AH
+matriarch M EY T R IY AA R K
+matriarchal M EY T R IY AA R K AH L
+matriarchy M EY T R IY AA R K IY
+matrice M EY T R IH S
+matrices M EY T R IH S IH Z
+matriculate M AH T R IH K Y AH L EY T
+matriculated M AH T R IH K Y AH L EY T AH D
+matriculates M AH T R IH K Y AH L EY T S
+matriculating M AH T R IH K Y AH L EY T IH NG
+matrilineal M AE T R IH L IH N IY AH L
+matrimonial M AE T R AH M OW N IY AH L
+matrimony M AE T R AH M OW N IY
+matrix M EY T R IH K S
+matrix's M EY T R IH K S IH Z
+matrixes M EY T R IH K S IH Z
+matron M EY T R AH N
+matronly M EY T R AH N L IY
+matrons M EY T R AH N Z
+mats M AE T S
+matsapa M AE T S AA P AH
+matsch M AE CH
+matsch's M AE CH AH Z
+matscher M AE CH ER
+matsen M AA T S AH N
+matsko M AA T S K OW
+matson M AA T S AH N
+matsu-ya M AE T S UW Y AH
+matsubara M AA T S UW B AA R AH
+matsuda M AA T S UW D AH
+matsui M AA T S UW IY
+matsukawa M AA T S UW K AA W AH
+matsumoto M AA T S UW M OW T OW
+matsumura M AA T S UW M UH R AH
+matsunaga M AA T S UW N AA G AH
+matsuo M AA T S UW OW
+matsuoka M AA T S UW OW K AH
+matsushita M AA T S UW SH IY T AH
+matsushita's M AA T S UW SH IY T AH Z
+matsuura M AA T S UW UH R AH
+matt M AE T
+matt's M AE T Z
+matta M AE T AH
+matte M AE T
+mattea M AE SH AH
+mattei M AE T AY
+matteis M AH T AY S
+mattel M AH T EH L
+mattel's M AH T EH L Z
+matteo M AA T EY OW
+matter M AE T ER
+matter's M AE T ER Z
+mattera M AA T EH R AH
+matterease M AE T ER IY Z
+matterease(2) M AH T R IY Z IY
+mattered M AE T ER D
+mattern M AE T ER N
+matters M AE T ER Z
+mattes M AE T S
+matteson M AE T IH S AH N
+matteucci M AA T UW CH IY
+matthau M AE T HH AW
+matthausen M AE T HH AW Z AH N
+matthea M AE T DH IY AH
+mattheis M AE T DH AY Z
+matthes M AE TH IH Z
+matthew M AE TH Y UW
+matthew's M AE TH Y UW Z
+matthews M AE TH Y UW Z
+matthews's M AE TH Y UW Z IH Z
+matthewson M AE TH Y UW S AH N
+matthey M AE T DH IY
+matthia M AA T DH IY AH
+matthias M AH TH AY AH S
+matthies M AE TH IY Z
+matthiesen M AE TH IY S AH N
+matthis M AE TH IH S
+matthys M AE TH IY Z
+mattias M AE SH AH Z
+mattice M AA T IH S
+mattick M AE T IH K
+mattie M AE T IY
+mattikalli M AE T IH K AA L IY
+mattila M AA T IY L AH
+mattina M AA T IY N AH
+matting M AE T IH NG
+mattingley M AE T IH NG G L IY
+mattingly M AE T IH NG L IY
+mattioli M AA T IY OW L IY
+mattis M AE T IH S
+mattison M AE T IH S AH N
+mattke M AE T K IY
+mattocks M AE T AH K S
+matton M AE T AH N
+mattoon M AH T UW N
+mattos M AE T OW Z
+mattox M AE T AH K S
+mattox(2) M AE T AA K S
+mattress M AE T R AH S
+mattress's M AE T R AH S IH Z
+mattresses M AE T R AH S AH Z
+mattresses(2) M AE T R AH S IH Z
+matts M AE T S
+mattson M AE T S AH N
+mattucci M AA T UW CH IY
+matty M AE T IY
+matula M AA T UW L AH
+matulich M AH T Y UW L IH HH
+matulis M AE T AH L IH S
+maturation M AE CH ER EY SH AH N
+maturation(2) M AE CH UH R EY SH AH N
+mature M AH CH UH R
+mature(2) M AH T Y UH R
+matured M AH T Y UH R D
+matures M AH CH UH R Z
+matures(2) M AH T Y UH R Z
+maturing M AH CH UH R IH NG
+maturing(2) M AH T Y UH R IH NG
+maturities M AH CH UH R IH T IY Z
+maturity M AH CH UH R AH T IY
+maturity(2) M AH T Y UH R IH T IY
+maturo M AA T UH R OW
+matus M AE T IH S
+matuschka M AH T AH SH K AH
+matusek M AH T UW S EH K
+matusi M AH T UW S IY
+matusiak M AH T AH S IY AE K
+matusik M AH T UW S IH K
+matuska M AH T AH S K AH
+matussi M AH T UW S IY
+matuszak M AH T AH SH AH K
+matuszewski M AH T AH SH EH F S K IY
+matyas M AE T Y AH S
+matz M AE T S
+matza M AA T Z AH
+matzek M AE T Z IH K
+matzen M AE T Z AH N
+matzinger M EY T S IH NG ER
+matzke M AE T S K IY
+matzner M AE T S N ER
+matzu M AE T Z UW
+mau M OW
+mau(2) M AW
+mauceri M AO CH EH R IY
+mauch M AO CH
+maucher M AW CH ER
+maucher(2) M AA K ER
+mauck M AO K
+maud M AO D
+maude M AO D
+maudlin M AO D L IH N
+maue M AW IY
+mauer M AW ER
+mauger M AO G ER
+maugeri M AO JH EH R IY
+maughan M AO G AH N
+maui M AW IY
+mauk M AO K
+maul M AO L
+maulden M AW L D AH N
+mauldin M AW L D AH N
+maulding M AO L D IH NG
+maule M AO L
+mauled M AO L D
+mauler M AO L ER
+maull M AO L
+maulsby M AO L S B IY
+mault M AO L T
+maultasch M AO L T AE SH
+maultsby M AO L T S B IY
+maumee M AW M IY
+mauna M AO N AH
+maund M AO N D
+maundering M AO N D ER IH NG
+maunderings M AO N D ER IH NG Z
+maune M AO N
+mauney M AO N IY
+maung M AO NG
+maupin M OW P AE N
+maura M AO R AH
+maura's M AO R AH Z
+maureen M AO R IY N
+maurer M AO R ER
+mauri M AO R IY
+maurice M AO R IY S
+maurice's M AO R AH S AH Z
+maurice's(2) M AO R IY S AH Z
+maurice(2) M AA R IH S
+mauricio M AW R IY S IY OW
+maurie M AO R IY
+mauriello M AO R IY EH L OW
+maurin M AO R IH N
+maurine M AO R IY N IY
+maurita M AO R IY T AH
+mauritania M AO R IH T EY N IY AH
+mauritania(2) M AO R IH T EY N Y AH
+mauritius M AO R IH T IY AH S
+mauritz M AO R IH T S
+maurizio M AO R IH Z IY OW
+mauro M AO R OW
+maurus M AO R AH S
+maury M AO R IY
+maus M AO Z
+mauser M AW S ER
+mausoleum M AO S AH L IY AH M
+mausolf M AW S OW L F
+mauss M AO S
+mausser M AW S ER
+maust M AO S T
+maute M AO T
+mauthe M AO DH
+mautner M AO T N ER
+mautz M AO T S
+mauve M AO V
+mauzey M AO Z IY
+mauzy M AO Z IY
+mav M AA V
+mavarach M AH V AA R AH CH
+mave M EY V
+maven M EY V AH N
+maven's M EY V AH N Z
+mavens M EY V AH N Z
+maverick M AE V ER IH K
+maverick's M AE V ER IH K S
+maverick's(2) M AE V R IH K S
+maverick(2) M AE V R IH K
+mavericks M AE V ER IH K S
+mavericks(2) M AE V R IH K S
+maverix M AE V ER IH K S
+maves M EY V Z
+mavis M EY V IH S
+mavrodi M AE V R OW D IY
+mavroules M AE V R UW L Z
+mavs M AA V Z
+mavs' M AA V Z
+maw M AO
+mawhinney M AE W IH N IY
+mawkish M AO K IH SH
+mawr M AO ER
+mawr(2) M AA R
+mawson M AO S AH N
+mawyer M AO IY ER
+max M AE K S
+max's M AE K S IH Z
+maxa M AE K S AH
+maxam M AE K S AH M
+maxcy M AE K S IY
+maxed M AE K S T
+maxell M AE K S EH L
+maxey M AE K S IY
+maxfield M AE K S F IY L D
+maxham M AE K S AH M
+maxi M AE K S IY
+maxicare M AE K S IY K EH R
+maxie M AE K S IY
+maxilla M AE K S IH L AH
+maxim M AE K S AH M
+maxima M AE K S AH M AH
+maximal M AE K S AH M AH L
+maxime M AE K S IY M
+maximilian M AE K S IH M IH L IY AH N
+maximization M AE K S IH M IH Z EY SH AH N
+maximize M AE K S AH M AY Z
+maximized M AE K S AH M AY Z D
+maximizes M AE K S AH M AY Z IH Z
+maximizing M AE K S AH M AY Z IH NG
+maxims M AE K S AH M Z
+maximum M AE K S AH M AH M
+maxine M AE K S IY N
+maxion M AE K S IY AA N
+maxis M AE K S IY Z
+maxon M AE K S AH N
+maxpharma M AE K S F AA R M AH
+maxsaver M AE K S EY V ER
+maxsavers M AE K S EY V ER Z
+maxson M AE K S AH N
+maxton M AE K S T AH N
+maxtor M AE K S T ER
+maxus M AE K S AH S
+maxus's M AE K S AH S IH Z
+maxwell M AE K S W EH L
+maxwell's M AE K S W EH L Z
+maxx M AE K S
+maxxam M AE K S AH M
+maxxim M AE K S IH M
+maxy M AE K S IY
+maxzide M AE K S IY T AH
+may M EY
+may's M EY Z
+maya M AY AH
+mayaguez M AY AH G EH Z
+mayall M EY AO L
+mayan M AY AH N
+mayans M AY AH N Z
+maybe M EY B IY
+maybee M EY B IY
+maybelle M EY B EH L
+maybelline M EY B AH L IY N
+mayben M EY B AH N
+mayberry M EY B EH R IY
+maybin M EY B IH N
+maybury M EY B EH R IY
+maycock M EY K AA K
+mayda M EY D AH
+mayday M EY D EY
+mayde M EY D
+mayden M EY D AH N
+maydena M EY D IH N AH
+maye M EY
+mayeaux M EY OW
+mayeda M AY IY D AH
+mayer M EY ER
+mayer's M EY ER Z
+mayernik M EY ER N IH K
+mayers M EY ER Z
+mayerson M EY ER S AH N
+mayes M EY Z
+mayeux M EY OW
+mayfair M EY F EH R
+mayfield M EY F IY L D
+mayfield(2) M EY F IH L D
+mayflower M EY F L AW ER
+mayhall M EY HH AO L
+mayhan M EY AH N
+mayhem M EY HH EH M
+mayher M EY ER
+mayhew M EY HH Y UW
+mayhue M EY HH Y UW
+mayhugh M EY HH AH
+mayland M EY L AH N D
+mayle M EY L
+mayle(2) M EY L IY
+mayme M EY M
+maynard M EY N ER D
+maynard's M EY N ER D Z
+mayne M EY N
+mayner M EY N ER
+maynes M EY N Z
+maynor M EY N ER
+mayo M EY OW
+mayon M EY AO N
+mayonnaise M EY AH N EY Z
+mayor M EY ER
+mayor's M EY ER Z
+mayoral M EY ER AH L
+mayoralty M EY ER AH L T IY
+mayorga M EY AO R G AH
+mayors M EY ER Z
+mayotte M EY AO T
+mayr M EY R
+mays M EY Z
+mays' M EY Z
+mayse M EY Z
+mayson M EY Z AH N
+maytag M EY T AE G
+mayton M EY T AH N
+mayville M EY V IH L
+mayweather M EY W EH DH ER
+maz M AA Z
+maza M AA Z AH
+mazaitis M AH Z AY T IH S
+mazanec M AH Z AE N IH K
+mazankowski M AE Z AH NG K AW S K IY
+mazda M AA Z D AH
+mazda's M AA Z D AH Z
+mazda's(2) M AE Z D AH Z
+mazda(2) M AE Z D AH
+maze M EY Z
+mazeika M AH Z AY K AH
+mazel M AH Z AH L
+mazeltov M AA Z AH L T AA F
+mazer M EY Z ER
+mazes M EY Z IH Z
+maziarz M AH Z IY ER Z
+mazie M EY Z IY
+mazo M AA Z OW
+mazola M AH Z OW L AH
+mazon M AA Z AO N
+mazon(2) M AH Z OW N
+mazone M AH Z OW N
+mazor M AA Z AO R
+mazowiecki M AH Z OW IY EH K IY
+mazur M AE Z ER
+mazurek M AH Z Y UW R EH K
+mazurkas M AH Z ER K AH Z
+mazurkiewicz M AH Z ER K AH V IH CH
+mazurowski M AH Z ER AO F S K IY
+mazyck M AE Z IH K
+mazza M AE Z AH
+mazzaferro M AE Z AH F EH R OW
+mazzanti M AA T S AA N T IY
+mazzara M AA T S AA R AH
+mazzarella M AA T S AA R EH L AH
+mazzei M AA T S EY IY
+mazzella M AA T S EH L AH
+mazzeo M AE Z IY OW
+mazzetti M AA T S EH T IY
+mazzie M AE Z IY
+mazziotti M AA T S IY OW T IY
+mazzo M AE Z OW
+mazzocchi M AA T S OW K IY
+mazzocco M AA T S OW K OW
+mazzola M AA T S OW L AH
+mazzola's M AA T S OW L AH Z
+mazzoli M AH Z OW L IY
+mazzolla M AH Z OW L AH
+mazzone M AA T S OW N IY
+mazzoni M AA T S OW N IY
+mazzorana M AE Z ER AA N AH
+mazzotta M AA T S OW T AH
+mazzuca M AA T S UW K AH
+mazzucco M AA T S UW K OW
+mbank EH M B AE NG K
+mbeki M B EH K IY
+mbeki(2) AH M B EH K IY
+mbeki(3) EH M B EH K IY
+mbira M AH B IH R AH
+mc M IH K
+mc(2) EH M S IY
+mcabee M AH K AE B IY
+mcabee(2) M AE K AH B IY
+mcadam M AH K AE D AH M
+mcadams M AH K AE D AH M Z
+mcadoo M AE K AH D UW
+mcadory M AH K AE D ER IY
+mcadow M AH K AE D OW
+mcafee M AE K AH F IY
+mcafee(2) M AH K AE F IY
+mcaffee M AE K AH F IY
+mcaffee(2) M AH K AE F IY
+mcafferty M AH K AE F ER T IY
+mcaleer M AE K AH L IH R
+mcaleese M AH K AH L IY Z
+mcaleese's M AH K AH L IY S IY Z
+mcaleese's(2) M AH K AH L IY S IH Z
+mcaleese(2) M AH K AH L IY Z IY
+mcalexander M AH K AE L IH G Z AE N D ER
+mcalinden M AH K L IH N D AH N
+mcalister M AH K AE L AH S T ER
+mcallen M AH K AO L AH N
+mcallister M AH K AE L AH S T ER
+mcaloon M AE K AH L UW N
+mcalpin M AH K AE L P AH N
+mcalpine M AH K AE L P AY N
+mcamis M AH K AE M AH S
+mcan M AH K AE N
+mcanally M AE K AH N AE L IY
+mcanany M AH K AE N AH N IY
+mcandrew M AH K AE N D R UW
+mcandrews M AH K AE N D R UW Z
+mcanelly M AE K AH N AE L IY
+mcaninch M AH K AE N IH N CH
+mcannally M AE K AH N AE L IY
+mcanulty M AE K AH N AH L T IY
+mcardle M AH K AA R D AH L
+mcarthur M AH K AA R TH ER
+mcartor M AH K AA R T ER
+mcatee M AH K AE T IY
+mcateer M AE K AH T IH R
+mcaulay M AH K AO L EY
+mcauley M AH K AO L IY
+mcauliff M AH K AO L AH F
+mcauliffe M AH K AO L AH F
+mcauliffe's M AH K AO L AH F S
+mcavity M AH K AE V AH T IY
+mcavoy M AE K AH V OY
+mcbain M AH K B EY N
+mcbane M AH K B EY N
+mcbay M AH K B EY
+mcbean M AH K B IY N
+mcbeath M AH K B EH TH
+mcbee M AH K B IY
+mcbeth M AH K B EH TH
+mcbirney M AH K B ER N IY
+mcbrayer M AH K B R EY ER
+mcbrearty M AH K B R IH R T IY
+mcbreen M AH K B R IY N
+mcbride M AH K B R AY D
+mcbridge M AH K B R IH JH
+mcbrien M AH K B R AY AH N
+mcbroom M AH K B R UW M
+mcbryar M AH K B R AY ER
+mcbryde M AH K B R AY D
+mcburnett M AH K B ER N AH T
+mcburney M AH K B ER N IY
+mccaa M AH K AA
+mccabe M AH K EY B
+mccabe(2) M AE K AH B IY
+mccadden M AH K AE D AH N
+mccade M AH K EY D
+mccafferty M AH K AE F ER T IY
+mccaffery M AH K AE F R IY
+mccaffrey M AH K AE F R IY
+mccaffrey's M AH K AE F R IY Z
+mccaghren M AH K AE G R AH N
+mccague M AH K EY G
+mccahan M AH K AE N
+mccahill M AH K AA HH IH L
+mccaig M AH K EY G
+mccain M AH K EY N
+mccain's M AH K EY N Z
+mccaleb M AH K EY L AH B
+mccalip M AH K AE L IH P
+mccalister M AH K AE L AH S T ER
+mccall M AH K AO L
+mccall's M AH K AO L Z
+mccalla M AH K AE L AH
+mccallen M AH K AO L AH N
+mccalley M AH K AE L IY
+mccallie M AH K AO L IY
+mccallion M AH K AE L Y AH N
+mccallister M AH K AE L AH S T ER
+mccallon M AH K AE L AH N
+mccallum M AH K AE L AH M
+mccalmont M AH K AE L M AH N T
+mccamant M AH K AE M AH N T
+mccambridge M AH K AE M B R IH JH
+mccambridge(2) M AH K EY M B R IH JH
+mccamey M AH K AE M IY
+mccamish M AH K AE M IH SH
+mccammon M AH K AE M AH N
+mccampbell M AH K AE M P B AH L
+mccamy M AH K EY M IY
+mccan M AH K AE N
+mccance M AH K AE N S
+mccandless M AH K AE N D L AH S
+mccandlish M AH K AE N D L IH SH
+mccane M AH K EY N
+mccanless M AH K AE N L AH S
+mccann M AH K AE N
+mccann's M AH K AE N Z
+mccanna M AH K AE N AH
+mccannon M AH K AE N AH N
+mccants M AH K AE N T S
+mccard M AH K AA R D
+mccardell M AH K AA R D AH L
+mccardle M AH K AA R D AH L
+mccarey M AH K AE R IY
+mccargar M AH K AA R G ER
+mccargo M AH K AA R G OW
+mccarl M AH K AA R L
+mccarley M AH K AA R L IY
+mccarn M AH K AA R N
+mccarney M AH K AA R N IY
+mccarran M AH K EH R AH N
+mccarrell M AH K AE R AH L
+mccarren M AH K EH R AH N
+mccarrick M AH K AE R IH K
+mccarroll M AH K AE R AH L
+mccarron M AH K AE R AH N
+mccarry M AH K AE R IY
+mccarson M AH K AA R S AH N
+mccart M AH K AA R T
+mccartan M AH K AA R T AH N
+mccarten M AH K AA R T AH N
+mccarter M AH K AA R T ER
+mccartha M AH K AA R TH AH
+mccarthy M AH K AA R TH IY
+mccarthy's M AH K AA R TH IY Z
+mccarthyism M AH K AA R TH IY IH Z AH M
+mccarthyite M AH K AA R TH IY AY T
+mccartin M AH K AA R T AH N
+mccartney M AH K AA R T N IY
+mccartney's M AH K AA R T N IY Z
+mccartt M AH K AA R T
+mccarty M AH K AA R T IY
+mccarver M AH K AA R V ER
+mccarville M AH K AA R V AH L
+mccary M IY K EH R IY
+mccaskey M AH K AE S K IY
+mccaskill M AH K AE S K AH L
+mccasland M AH K AE Z L AH N D
+mccaslin M AH K AE Z L AH N
+mccaughan M AH K AO N
+mccaughey M AH K AO IY
+mccaul M AH K AO L
+mccauley M AH K AO L IY
+mccaulley M AH K AO L IY
+mccausland M AH K AO Z L AH N D
+mccauslin M AH K AO Z L AH N
+mccauthy M AH K AW TH IY
+mccaw M AH K AO
+mccaw's M AH K AO Z
+mccawley M AH K AO L IY
+mccay M AH K EY
+mcchesney M AH K CH EH Z N IY
+mcchristian M AH K R IH S CH AH N
+mcclafferty M AH K L AE F ER T IY
+mcclaflin M AH K L AE F L AH N
+mcclain M AH K L EY N
+mcclaine M AH K L EY N
+mcclam M AH K L AE M
+mcclanahan M AH K L AE N AH HH AE N
+mcclane M AH K L EY N
+mcclaran M AH K L AE R AH N
+mcclard M IY K L ER D
+mcclaren M AH K L EH R AH N
+mcclarnon M AH K L AA R N AH N
+mcclarty M AH K L AA R T IY
+mcclary M AH K L EH R IY
+mcclaskey M AH K L AE S K IY
+mcclatchey M AH K L AE CH IY
+mcclatchy M AH K L AE CH IY
+mcclaugherty M AH K L AE F ER T IY
+mcclave M AH K L EY V
+mcclay M AH K L EY
+mccleaf M AH K L IY F
+mcclean M AH K L IY N
+mccleary M AH K L IH R IY
+mccleary's M AH K L IH R IY Z
+mccleave M AH K L IY V
+mccleery M AH K L IH R IY
+mcclees M AH K L IY Z
+mccleese M AH K L IY S
+mcclellan M AH K L EH L AH N
+mcclelland M AH K L EH L AH N D
+mcclellen M AH K L EH L AH N
+mcclements M AH K L EH M AH N T S
+mcclenaghan M AH K L EH N AH G AH N
+mcclenahan M AH K L EH N AH HH AE N
+mcclenathan M AH K L EH N AH TH AH N
+mcclendon M AH K L EY N D AH N
+mcclenny M AH K L EH N IY
+mccleskey M AH K L EH S K IY
+mcclimans M AH K L AY M AH N Z
+mcclimans(2) M AH K L IH M AH N Z
+mcclintic M AH K L IH N T IH K
+mcclintick M AH K L IH N T IH K
+mcclintock M AH G L IH N T AA K
+mcclinton M AH K L IH N T AH N
+mcclish M AH K L IH SH
+mcclory M AH K L AO R IY
+mccloskey M AH K L AO S K IY
+mcclosky M AH K L AO S K IY
+mccloud M AH K L AW D
+mccloy M AH K L OY
+mccluer M AH K L UW R
+mcclune M AH K L UW N
+mccluney M AH K L UW N IY
+mcclung M AH K L AH NG
+mcclure M AH K L UW R
+mcclurg M AH K L ER G
+mcclurkin M AH K L ER K AH N
+mccluskey M AH K L AH S K IY
+mccoig M AH K OY G
+mccoin M AH K OY N
+mccole M AH K OW L
+mccolgan M AH K OW L G AH N
+mccoll M AH K OW L
+mccollam M AH K AA L AH M
+mccolley M AH K AA L IY
+mccollister M AH K AA L AH S T ER
+mccolloch M AH K AA L AH K
+mccollom M AH K AA L AH M
+mccollough M AH K AA L AH
+mccollough(2) M AH K AA L AW
+mccollum M AH K AO L AH M
+mccolm M AH K OW M
+mccomas M AH K OW M AH S
+mccomb M AH K OW M
+mccomber M AH K OW M B ER
+mccomber(2) M AH K OW M ER
+mccombie M AH K OW M B IY
+mccombie(2) M AH K OW M IY
+mccombs M AH K AA M Z
+mccommon M AH K AA M AH N
+mccommons M AH K AA M AH N Z
+mccomsey M AH K AA M S IY
+mcconaghy M AH K AA N AH G IY
+mcconaha M AH K AA N AH HH AA
+mcconahay M AH K AA N AH HH EY
+mcconahy M AH K AA N AH HH IY
+mcconathy M AH K AA N AH TH IY
+mcconathy(2) M AE K AH N AE TH IY
+mcconaughey M AH K AA N AH G EY
+mcconaughy M AH K AA N AH G IY
+mccone M AH K OW N
+mcconico M AH K AA N AH K OW
+mcconkey M AH K AA NG K IY
+mcconn M AH K AA N
+mcconnaughey M AH K AA N AH G EY
+mcconnel M AH K AA N AH L
+mcconnel's M AH K AA N AH L Z
+mcconnell M AH K AA N AH L
+mcconnon M AH K AA N AH N
+mcconville M AH K AA N V IH L
+mccooey M AH K UW IY
+mccook M AH K UH K
+mccool M AH K UW L
+mccord M AH K AO R D
+mccorkel M AH K AO R K AH L
+mccorkell M AH K AO R K AH L
+mccorkindale M AH K AO R K AH N D EY L
+mccorkle M AH K AO R K AH L
+mccormac M AH K AO R M AH K
+mccormack M AH K AO R M AH K
+mccormick M AH K AO R M IH K
+mccormick's M AH K AO R M IH K S
+mccorquodale M AH K AO R K AH D EY L
+mccorry M AH K AO R IY
+mccort M AH K AO R T
+mccorvey M AH K AO R V IY
+mccosh M AH K AA SH
+mccoskey M AH K AA S K IY
+mccotter M AH K AA T ER
+mccoun M AH K AW N
+mccourt M AH K AO R T
+mccowan M AH K AW AH N
+mccowen M AH K AW AH N
+mccowin M AH K AW IH N
+mccown M AH K AW N
+mccoy M AH K OY
+mccoys M AH K OY Z
+mccracken M AH K R AE K AH N
+mccrackin M AH K R AE K AH N
+mccrady M AH K R EY D IY
+mccrae M AH K R EY
+mccraney M AH K R AE N IY
+mccranie M AH K R EY N IY
+mccrary M AH K R EH R IY
+mccravy M AH K R EY V IY
+mccraw M AH K R AO
+mccray M AH K R EY
+mccrea M AH K R EY
+mccreadie M AH K R IY D IY
+mccready M AH K R IY D IY
+mccreary M AH K R IH R IY
+mccredie M AH K R IY D IY
+mccree M AH K R IY
+mccreedy M AH K R IY D IY
+mccreery M AH K R IH R IY
+mccreight M AH K R EY T
+mccreless M AH K R IY L AH S
+mccrickard M AH K R IH K ER D
+mccright M AH K R AY T
+mccrillis M AH K R IH L AH S
+mccrimmon M AH K R IH M AH N
+mccrocklin M AH K R AA K L AH N
+mccrone M AH K R OW N
+mccrorey M AH K R AO R IY
+mccrory M AH K R AO R IY
+mccroskey M AH K R AA S K IY
+mccrossen M AH K R AO S AH N
+mccrudden M AH K R AH D AH N
+mccrum M AH K R AH M
+mccrumb M AH K R AH M
+mccrystal M AH K R IH S T AH L
+mccuan M AH K UW AH N
+mccubbin M AH K AH B AH N
+mccubbins M AH K AH B AH N Z
+mccue M AH K Y UW
+mccuen M AH K Y UW N
+mccuin M AH K UW AH N
+mccuistion M AH K W IH SH AH N
+mccuiston M AH K W IH S T AH N
+mcculla M AH K AH L AH
+mccullagh M AH K AH L AH G
+mccullah M AH K AH L AH
+mccullar M AH K AH L ER
+mccullars M AH K AH L ER Z
+mccullen M AH K AH L AH N
+mcculler M AH K AH L ER
+mccullers M AH K AH L ER Z
+mcculley M AH K AH L IY
+mcculloch M AH K AH L AH K
+mcculloh M AH K AH L AH
+mccullough M AH K AH L AH
+mccullum M AH K AH L AH M
+mccully M AH K AH L IY
+mccumber M AH K AH M B ER
+mccune M AH K Y UW N
+mccur M AH K ER
+mccurdy M AH K ER D IY
+mccurley M AH K ER L IY
+mccurry M AH K ER IY
+mccusker M AH K AH S K ER
+mccutchan M AH K AH CH AH N
+mccutchen M AH K AH CH AH N
+mccutcheon M AH K AH CH AH N
+mccuvey M AH K AH V IY
+mcdade M AH K D EY D
+mcdade's M AH K D EY D Z
+mcdaid M AH K D EY D
+mcdanel M AH K D AE N AH L
+mcdaniel M AH K D AE N Y AH L
+mcdaniels M AH K D AE N Y AH L Z
+mcdannel M AH K D AE N AH L
+mcdaris M AH K D AE R AH S
+mcdavid M AH K D EY V AH D
+mcdavitt M AH K D AE V AH T
+mcdeal M AH K D IY L
+mcdearmon M AH K D ER M AH N
+mcdermid M AH K D ER M AH D
+mcdermitt M AH K D ER M AH T
+mcdermot M AH K D ER M AH T
+mcdermott M AH K D ER M AH T
+mcdermott's M AH K D ER M AH T S
+mcdevitt M AH K D EH V AH T
+mcdiarmid M AH K D EH R M AH D
+mcdill M AH K D IH L
+mcdivett M AH D IH V AH T
+mcdivitt M AH K D IH V AH T
+mcdole M AH K D OW L
+mcdonagh M AH K D AH N AH
+mcdonald M AH K D AA N AH L D
+mcdonald's M AH K D AA N AH L D Z
+mcdonalds M AH K D AA N AH L D Z
+mcdonell M AH K D AA N AH L
+mcdonnel M AH K D AA N AH L
+mcdonnel's M AH K D AA N AH L Z
+mcdonnell M AH K D AA N AH L
+mcdonough M AH K D AH N AH
+mcdorman M AH K D AO R M AH N
+mcdougal M AH K D UW G AH L
+mcdougal's M AH K D UW G AH L Z
+mcdougald M AH K D UW G AH L D
+mcdougall M AH K D UW G AH L
+mcdougals M AH K D UW G AH L Z
+mcdougals' M AH K D UW G AH L Z
+mcdougle M AH K D UW G AH L
+mcdow M AH K D AW
+mcdowall M AH K D AW AH L
+mcdowell M AH K D AW AH L
+mcduff M AH K D AH F
+mcduffee M AH K D AH F IY
+mcduffie M AH K D AH F IY
+mcduffy M AH K D AH F IY
+mcdugal M AH K D UW G AH L
+mcdurman M AH K D ER M AH N
+mcdyess M AH K D AY AH S
+mceachern M AH K IY CH ER N
+mceachin M AH K IY CH AH N
+mcelderry M AE K AH L D IH R IY
+mceldowney M AE K AH L D AW N IY
+mcelfresh M AE K AH L F R EH SH
+mcelhaney M AE K AH L HH EY N IY
+mcelhannon M AE K AH L HH AE N AH N
+mcelhany M AE K AH L HH EY N IY
+mcelheney M AE K AH L HH EY N IY
+mcelheny M AE K AH L HH IY N IY
+mcelhiney M AE K AH L HH IH N IY
+mcelhinney M AE K AH L HH IH N IY
+mcelhinny M AE K AH L HH IH N IY
+mcelhone M AE K AH L HH OW N
+mcelligott M AH K EH L AH G AH T
+mcelmurray M AE K AH L M ER IY
+mcelmurry M AE K AH L M ER R IY
+mcelrath M AE K AH L R AE TH
+mcelrath(2) M AH K EH L R AE TH
+mcelravy M AE K AH L R EY V IY
+mcelreath M AE K AH L R AE TH
+mcelroy M AE K AH L R OY
+mcelvain M AE K AH L V EY N
+mcelvaine M AE K AH L V EY N
+mcelveen M AE K AH L V IY N
+mcelwain M AE K AH L W EY N
+mcelwaine M AE K AH L W EY N
+mcelwee M AE K AH L W IY
+mcelyea M AE K AH L Y EY
+mcenaney M AE K AH N EY N IY
+mcenany M AE K AH N EY N IY
+mcendree M AH K EH N D R IY
+mcenerney M AE K AH N EH R N IY
+mcenery M AH K EH N ER IY
+mcenroe M AE K AH N R OW
+mcentee M AE K AH N T IY
+mcentee(2) M AH K EH N T IY
+mcentire M AE K AH N T AY R
+mcentyre M AE K AH N T AY R
+mcerlean M AH K ER L IY N
+mceuen M AH K Y UW AH N
+mcever M AH K EH V ER
+mcevers M AH K EH V ER Z
+mcevilly M AH K EH V AH L IY
+mcevoy M AE K AH V OY
+mcewan M AE K UW AE N
+mcewen M AH K Y UW AH N
+mcfadden M AH K F AE D AH N
+mcfadden's M AH K F AE D AH N Z
+mcfaddin M AH K F AE D AH N
+mcfadin M AH K F AE D AH N
+mcfadyen M AH K F AE D IY AH N
+mcfall M AH K F AO L
+mcfalland M AH K F AE L AH N D
+mcfalls M AH K F AO L Z
+mcfann M AH K F AE N
+mcfarlan M AH K F AA R L AH N
+mcfarland M AH K F AA R L AH N D
+mcfarlane M AH K F AA R L AH N
+mcfarlane's M AH K F AA R L AH N Z
+mcfarlin M AH K F AA R L AH N
+mcfarling M AH K F AA R L IH NG
+mcfarren M AH K F EH R AH N
+mcfate M AH K F EY T
+mcfatridge M AH K F AE T R IH JH
+mcfatter M AH K F AE T ER
+mcfaul M AH K F AO L
+mcfayden M AH K F EY D AH N
+mcfee M AH K F IY
+mcfeely M AH K F IY L IY
+mcfeeters M AH K F IY T ER Z
+mcferran M AH K F EH R AH N
+mcferren M AH K F EH R AH N
+mcferrin M AH K F EH R AH N
+mcferron M AH K F EH R AH N
+mcfetridge M AH K F EH T R IH JH
+mcfly M AH K F L AY
+mcfly's M AH K F L AY Z
+mcfun M AH K F AH N
+mcfun's M AH K F AH N Z
+mcgaffey M AH G AE F IY
+mcgagh M AH G AO
+mcgaha M AH G AA HH AH
+mcgahan M AH G AE HH AH N
+mcgahee M AH G AE HH IY
+mcgahey M AH G AE HH IY
+mcgalley M AH G AE L IY
+mcgalley's M AH G AE L IY Z
+mcgalliard M AH G AE L IY AA R D
+mcgalliard(2) M AH G AE L Y AA R D
+mcgann M AH G AE N
+mcgannon M AH G AE N AH N
+mcgarity M AH G AE R AH T IY
+mcgarr M AH G AA R
+mcgarrah M AH G AE R AH
+mcgarrigle M AH G AE R AH G AH L
+mcgarrity M AH G AE R AH T IY
+mcgarry M AH G EH R IY
+mcgarvey M AH G AA R V EY
+mcgary M AH G EH R IY
+mcgath M AH G AE TH
+mcgaugh M AH G AO
+mcgaughey M AH G AO IY
+mcgaughy M AH G AO IY
+mcgauley M AH G AO L IY
+mcgavin M AH G AE V AH N
+mcgavock M AH G AE V AH K
+mcgaw M AH G AO
+mcgeachy M AH G IY CH IY
+mcgeary M AH G IH R IY
+mcgee M AH G IY
+mcgee's M AH G IY Z
+mcgeean M AH G IY AH N
+mcgeean's M AH G IY AH N Z
+mcgeehan M AH G IY HH AH N
+mcgeever M AH G IY V ER
+mcgegan M AH G EH G AH N
+mcgehee M AH G EH HH IY
+mcgeorge M AH K JH AO R JH
+mcgeough M AH G AH F
+mcgettigan M AH G EH T AH G AH N
+mcghee M AH G IY
+mcghie M AH G IY
+mcgibbon M AH G IH B AH N
+mcgill M AH G IH L
+mcgillen M AH G IH L AH N
+mcgillicuddy M AH G IH L AH K AH D IY
+mcgillis M AH G IH L AH S
+mcgillivray M AH G IH L AH V R EY
+mcgilton M AH G IH L T AH N
+mcgilvery M AH G IH L V ER IY
+mcgilvray M AH G IH L V R IY
+mcginess M AH G IH N AH S
+mcginley M AH G IH N L IY
+mcginn M AH G IH N
+mcginnes M AH G IH N Z
+mcginness M AH G IH N AH S
+mcginnis M AH G IH N AH S
+mcginniss M AH G IH N AH S
+mcginnity M AH G IH N AH T IY
+mcginty M AH G IH N T IY
+mcgirr M AH G ER
+mcgirt M AH G ER T
+mcgivern M AH G IH V ER N
+mcgivney M AH G IH V N IY
+mcglade M AH G L EY D
+mcglamery M AH G L AE M ER IY
+mcglashan M AH G L AE SH AH N
+mcglasson M AH G L AE S AH N
+mcglaughlin M AH G L AO F L AH N
+mcglaun M AH G L AO N
+mcglinchey M AH G L IH N CH IY
+mcglinn M AH G L IH N
+mcglocklin M AH G L AA K L AH N
+mcgloin M AH G L OY N
+mcglone M AH G L OW N
+mcglory M AH G L AO R IY
+mcglothen M AH G L AA TH AH N
+mcglothin M AH G L AA TH AH N
+mcglothlin M AH G L AA TH L AH N
+mcglynn M AH G L IH N
+mcgoey M AH G AA IY
+mcgoff M AH G AO F
+mcgoldrick M AH G OW L D R AH K
+mcgols M AH K G AA L Z
+mcgonagle M AH G AA N AH G AH L
+mcgonigal M AH G AA N AH G AH L
+mcgonigle M AH G AA N AH G AH L
+mcgough M AH G AW
+mcgough(2) M AH G AH F
+mcgourty M AH G UH R T IY
+mcgovern M AH G AH V ER N
+mcgovern's M AH G AH V ER N Z
+mcgowan M AH G AW AH N
+mcgowan's M AH G AW AH N Z
+mcgowen M AH G AW AH N
+mcgowin M AH K G AW AH N
+mcgown M AH G AW N
+mcgrady M AH G R EY D IY
+mcgrail M AH G R EY L
+mcgrain M AH G R EY N
+mcgranahan M AH G R AE N AH HH AE N
+mcgrane M AH G R EY N
+mcgrath M AH G R AE TH
+mcgraw M AH G R AO
+mcgray M AH G R EY
+mcgreal M AH G R IY L
+mcgreevey M AH G R IY V IY
+mcgreevy M AH G R IY V IY
+mcgregor M AH G R EH G ER
+mcgregory M AH G R EH G ER IY
+mcgrevin M AH G R EH V AH N
+mcgrew M AH G R UW
+mcgriff M AH G R IH F
+mcgroarty M AH G R AO R T IY
+mcgrogan M AH G R OW G AH N
+mcgrory M AH G R AO R IY
+mcgruder M AH G R UW D ER
+mcguane M AH G W EY N
+mcguckin M AH G AH K AH N
+mcgue M AH G Y UW
+mcguffee M AH G AH F IY
+mcguffey M AH G AH F IY
+mcguffie M AH G AH F IY
+mcguffin M AH G AH F AH N
+mcguigan M AH G IH G AH N
+mcguiness M AH G IH N AH S
+mcguinn M AH G IH N
+mcguinness M AH G IH N AH S
+mcguire M AH G W AY R
+mcguirk M AH G ER K
+mcguirt M AH G ER T
+mcgurk M AH G ER K
+mcgurn M AH G ER N
+mcguyer M AH G AY ER
+mcgwire M AH G W AY R
+mchaffie M AH K AE F IY
+mchale M AH K EY L
+mcham M AH K AE M
+mchan M AH K AE N
+mchaney M AH K AE N IY
+mchargue M AH K AA R G
+mchargue(2) M AH K AA R G Y UW
+mchatton M AH K AE T AH N
+mchenry M AH K EH N R IY
+mchone M AH K OW N
+mchugh M AH K Y UW
+mcilhenny M AE K IH L HH EH N IY
+mcilrath M AE K AH L R AE TH
+mcilrath(2) M AH K IH L R AE TH
+mcilroy M AE K AH L R OY
+mcilroy(2) M AH K IH L R OY
+mcilvain M AE K IH L V EY N
+mcilvain(2) M AH K IH L V EY N
+mcilvaine M AE K IH L V EY N
+mcilvaine(2) M AH K IH L V EY N
+mcilveen M AE K IH L V IY N
+mcilveen(2) M AH K IH L V IY N
+mcilwain M AE K IH L W EY N
+mcilwain(2) M AH K IH L W EY N
+mcinerney M AE K AH N EH R N IY
+mcinerny M AH K IH N ER N IY
+mcingvale M AE K IH NG V EY L
+mcinnes M AH G IH N AH S
+mcinnis M AH G IH N AH S
+mcinroy M AE K IH N R OY
+mcintee M AE K IH N T IY
+mcintire M AE K IH N T AY R
+mcintosh M AE K AH N T AO SH
+mcinturf M AE K IH N T ER F
+mcinturff M AE K IH N T ER F
+mcintyre M AE K IH N T AY R
+mcinvale M AE K IH N V EY L
+mcisaac M AH K AY Z AH K
+mciver M AH K IH V ER
+mcivor M AH K IH V ER
+mcjunkin M AH K JH AH NG K AH N
+mcjunkins M AH K JH AH NG K AH N Z
+mckaig M AH K EY G
+mckain M AH K EY N
+mckamey M AH K AE M IY
+mckane M AH K EY N
+mckanie M AH K EY N IY
+mckanna M AH K AE N AH
+mckarrick M AH K AE R IH K
+mckay M AH K EY
+mckeag M AH K IY G
+mckeague M AH K IY G
+mckean M AH K IY N
+mckeand M AH K IY N D
+mckechnie M AH K EH K N IY
+mckee M AH K IY
+mckee's M AH K IY Z
+mckeegan M AH K IY G AH N
+mckeehan M AH K IY HH AH N
+mckeel M AH K IY L
+mckeeman M AH K IY M AH N
+mckeen M AH K IY N
+mckeesport M AH K IY S P AO R T
+mckeever M AH K IY V ER
+mckeithan M AH K IY TH AH N
+mckeithen M AH K IY TH AH N
+mckell M AH K EH L
+mckellan M AH K EH L AH N
+mckellar M AH K EH L ER
+mckeller M AH K EH L ER
+mckellips M AH K EH L IH P S
+mckelvey M AE K AH L V EY
+mckelvie M AE K AH L V IY
+mckelvy M AE K AH L V IY
+mckemie M AH K EH M IY
+mckendree M AH K EH N D R IY
+mckendrick M AH K EH N D R IH K
+mckendry M AH K EH N D R IY
+mckenna M AH K EH N AH
+mckenney M AH K EH N IY
+mckennon M AH K EH N AH N
+mckenny M AH K EH N IY
+mckenrick M AH K EH N R IH K
+mckenzie M AH K EH N Z IY
+mckeon M AH K IY AH N
+mckeone M AH K IY AH N
+mckeough M AH K IY OW
+mckeown M AH K Y UW AH N
+mckercher M AH K ER CH ER
+mckern M AH K ER N
+mckernan M AH K ER N AH N
+mckesson M AH K EH S AH N
+mckesson's M AH K EH S AH N Z
+mckethan M AH K EH TH AH N
+mckevitt M AH K EH V AH T
+mckey M AH K IY
+mckibben M AH K IH B AH N
+mckibbin M AH K IH B AH N
+mckibbon M AH K IH B AH N
+mckids M AH K IH D Z
+mckie M AH K IY
+mckiernan M AH K IH R N AH N
+mckillip M AH K IH L AH P
+mckillop M AH K IH L AH P
+mckim M AH K IH M
+mckimmey M AH K IH M IY
+mckimmy M AH K IH M IY
+mckiness M AH K IH N AH S
+mckinlay M AH K IH N L IY
+mckinley M AH K IH N L IY
+mckinney M AH K IH N IY
+mckinney's M AH K IH N IY Z
+mckinnie M AH K IH N IY
+mckinnis M AH K IH N AH S
+mckinnon M AH K IH N AH N
+mckinny M AH K IH N IY
+mckinny's M AH K IH N IY Z
+mckinsey M AH K IH N Z IY
+mckinstry M AH K IH N S T R IY
+mckinzie M AH K IH N Z IY
+mckissack M AH K IH S AH K
+mckissic M AH K IH S IH K
+mckissick M AH K IH S IH K
+mckitrick M AH K IH T R IH K
+mckittrick M AH K IH T R IH K
+mcklatchy M AH K L AE CH IY
+mckneely M AH K N IY L IY
+mcknew M AH K N UW
+mcknight M AH K N AY T
+mckone M AH K OW N
+mckowen M AH K AW AH N
+mckown M AH K OW N
+mckoy M AH K OY
+mckree M AH K R IY
+mckrinkowski M AH K R IH N K AW S K IY
+mckune M AH K Y UW N
+mclachlan M AH K L AA K L AH N
+mclafferty M AH K L AE F ER T IY
+mclain M AH K L EY N
+mclamb M AH K L AE M
+mclanahan M AH K L AE N AH HH AE N
+mclane M AH K L EY N
+mclaren M AH K L EH R AH N
+mclarney M AH K L AA R N IY
+mclarty M AH K L AA R T IY
+mclarty's M AH K L AA R T IY Z
+mclauchlin M AH K L AO K L AH N
+mclaughlin M AH G L AA K L AH N
+mclaurin M AH K L AO R AH N
+mclaury M AH K L AO R IY
+mclawhorn M AH K L AE W ER N
+mclawhorn(2) M AH K L AW HH AO R N
+mclay M AH K L EY
+mclean M AH K L IY N
+mclean's M AH K L IY N Z
+mclean's(2) M AH K L EY N Z
+mclean(2) M AH K L EY N
+mclear M AH K L IH R
+mcleary M AH K L IH R IY
+mclees M AH K L IY Z
+mcleish M AH K L IY SH
+mcleland M AH K L EH L AH N D
+mclellan M AH K L EH L AH N
+mclelland M AH K L EH L AH N D
+mclemore M AH K L EH M ER
+mclendon M AH K L EH N D AH N
+mclennan M AH K L EH N AH N
+mcleod M AH K L AW D
+mcleroy M AH K L IY R OY
+mclerran M AH K L EH R AH N
+mclester M AH K L EH S T ER
+mclin M AH K L IH N
+mclinden M AH K L IH N D AH N
+mclinn M AH K L IH N
+mclish M AH K L IH SH
+mcloud M AH K L AW D
+mclouth M AH K L AW TH
+mclucas M AH K L UW K AH Z
+mcluckie M AH K L AH K IY
+mcluhan M AH K L UW AH N
+mclure M AH K L UW R
+mcmackin M AH K M AE K AH N
+mcmahan M AH K M EY HH AH N
+mcmahen M AH K M EY HH AH N
+mcmahill M AH K M EY HH IH L
+mcmahon M AH K M EY AH N
+mcmahon(2) M AH K M AE N
+mcmains M AH K M EY N Z
+mcmaken M AH K M EY K AH N
+mcmakin M AH K M AE K AH N
+mcmanama M AH K M AE N AH M AH
+mcmanaman M AH K M AE N AH M AH N
+mcmanamon M AH K M AE N AH M AH N
+mcmanaway M AH K M AE N AH W EY
+mcmanigal M AH K M AE N AH G AH L
+mcmanis M AH K M AE N AH S
+mcmann M AH K M AE N
+mcmannis M AH K M AE N AH S
+mcmanus M AH K M AE N AH S
+mcmartin M AH K M AA R T AH N
+mcmaster M AH K M AE S T ER
+mcmasters M AH K M AE S T ER Z
+mcmath M AH K M AE TH
+mcmeans M AH K M IY N Z
+mcmeekin M AH K M IY K AH N
+mcmeen M AH K M IY N
+mcmenamin M AH K M EH N AH M AH N
+mcmenamy M AH K M EH N AH M IY
+mcmenemy M AH K M EH N AH M IY
+mcmennamin M AH K M EH N AH M AH N
+mcmichael M AH K M AY K AH L
+mcmichen M AH K M IH CH AH N
+mcmickle M AH K M IH K AH L
+mcmil M AH K M IH L
+mcmillan M AH K M IH L AH N
+mcmillen M AH K M IH L AH N
+mcmiller M AH K M IH L ER
+mcmillian M AH K M IH L Y AH N
+mcmillian(2) M AH K M IH L AH N
+mcmillin M AH K M IH L IH N
+mcmillion M AH K M IH L Y AH N
+mcmillon M AH K M IH L AH N
+mcminn M AH K M IH N
+mcmonagle M AH K M AA N AH G AH L
+mcmonigle M AH K M AA N AH G AH L
+mcmoran M AH K M AO R AH N
+mcmorran M AH K M AO R AH N
+mcmorris M AH K M AO R AH S
+mcmorrow M AH K M AO R OW
+mcmuffin M AH K M AH F AH N
+mcmullan M AH K M AH L AH N
+mcmullen M AH K AH L AH N
+mcmullin M AH K M AH L AH N
+mcmunn M AH K M AH N
+mcmurdo M AH K M ER D OW
+mcmurphy M AH K M ER F IY
+mcmurray M AH K M ER EY
+mcmurrey M AH K M ER IY
+mcmurry M AH K M ER IY
+mcmurtrey M AH K M ER T R IY
+mcmurtrie M AH K M ER T ER IY
+mcmurtry M AH K M ER T R IY
+mcnab M AH K N AE B
+mcnabb M AH K N AE B
+mcnair M AH K N EH R
+mcnairy M AH K N EH R IY
+mcnall M AH K N AO L
+mcnalley M AH K N AE L IY
+mcnally M AH K N AE L IY
+mcnamara M AE K N AH M EH R AH
+mcnamara's M AE K N AH M EH R AH Z
+mcnamee M AE K N AH M IY
+mcnamer M AH K N EY M ER
+mcnaney M AH K N AE N IY
+mcnary M AH K N EH R IY
+mcnatt M AH K N AE T
+mcnaught M AH K N AO T
+mcnaughton M AH K N AO T AH N
+mcnay M AH K N EY
+mcneal M AH K N IY L
+mcneally M AH K N IY L IY
+mcnealy M AH K N IY L IY
+mcnear M AH K N IH R
+mcneary M AH K N IH R IY
+mcnease M AH K N IY Z
+mcnee M AH K N IY
+mcneece M AH K N IY S
+mcneel M AH K N IY L
+mcneeley M AH K N IY L IY
+mcneely M AH K N IY L IY
+mcneer M AH K N IH R
+mcnees M AH K N IY Z
+mcneese M AH K N IY S
+mcneff M AH K N EH F
+mcneice M AH K N IY S
+mcneil M AH K N IY L
+mcneill M AH K N IY L
+mcneilly M AH K N IY L IY
+mcneish M AH K N IY SH
+mcnelis M AH K N EH L AH S
+mcnellis M AH K N EH L AH S
+mcnelly M AH K N EH L IY
+mcnemar M AE K N AH M AA R
+mcnerney M AH K N ER N IY
+mcnett M AH K N EH T
+mcnevin M AH K N EH V AH N
+mcnew M AH K N UW
+mcnichol M AH K N IH K AH L
+mcnicholas M AH K N IH L AH L AH S
+mcnichols M AH K N IH K AH L Z
+mcnickle M AH K N IH K AH L
+mcnicol M AH K N IH K AO L
+mcniel M AH K N IY L
+mcniff M AH K N IH F
+mcninch M AH K N IH N CH
+mcnish M AH K N IH SH
+mcnitt M AH K N IH T
+mcnorton M AH K N AO R T AH N
+mcnuggets M AH K N AH G AH T S
+mcnulty M AH K N AH L T IY
+mcnutt M AH K N AH T
+mcomber M AH K AA M B ER
+mcorp EH M K AO R P
+mcorp's EH M K AO R P S
+mcpaper M AH K P EY P ER
+mcparland M AH K P AA R L AH N D
+mcpartland M AH K P AA R T L AH N D
+mcpartlin M AH K P AA R T L AH N
+mcpeak M AH K P IY K
+mcpeake M AH K P IY K
+mcpeck M AH K P EH K
+mcpeek M AH K P IY K
+mcpeters M AH K P IY T ER Z
+mcphail M AH K F EY L
+mcphatter M AH K F AE T ER
+mcphaul M AH K F AO L
+mcphearson M AH K F ER S AH N
+mcphearson(2) M AH K F IH R S AH N
+mcphee M AH K F IY
+mcpheeters M AH K F IY T ER Z
+mcpheron M AH K F EH R AH N
+mcpherson M AH K F ER S AH N
+mcphie M AH K F IY
+mcphillips M AH K F IH L AH P S
+mcpike M AH K P AY K
+mcquade M AH K W EY D
+mcquaid M AH K W EY D
+mcquaide M AH K W EY D
+mcquaig M AH K W EY G
+mcquain M AH K W EY N
+mcquarrie M AH K W AO R IY
+mcquary M IY K W EH R IY
+mcquay M AH K EY
+mcqueary M AH K W IH R IY
+mcqueen M AH K W IY N
+mcqueeney M AH K W IY N IY
+mcquerry M AH K W EH R IY
+mcquethy M AH K W EH TH IY
+mcquethy's M AH K W EH TH IY Z
+mcquigg M AH K W IH G
+mcquilkin M AH K W IH L K AH N
+mcquillan M AH K W IH L AH N
+mcquillen M AH K W IH L AH N
+mcquillin M AH K W IH L AH N
+mcquinn M AH K W IH N
+mcquire M AH K W AY R
+mcquiston M AH K W IH S T AH N
+mcquitty M AH K W IH T IY
+mcquown M AH K W AW N
+mcrae M AH K R EY
+mcrainey M AH K R AE N IY
+mcraney M AH K R AE N IY
+mcray M AH K R EY
+mcree M AH K R IY
+mcreynolds M AH K R EY N AH L D Z
+mcright M AH K R AY T
+mcroberts M AH K R AA B ER T S
+mcrorie M AH K R AO R IY
+mcroy M AH K R OY
+mcshan M AH K SH AE N
+mcshane M AH K SH EY N
+mcshea M AH K SH EY
+mcsherry M AH K SH EH R IY
+mcsleep M AH K S L IY P
+mcsorley M AH K S AO R L IY
+mcspadden M AH K S P AE D AH N
+mcstay M AH K S T EY
+mcswain M AH K S W EY N
+mcsween M AH K S W IY N
+mcsweeney M AH K S W IY N IY
+mctaggart M AH K T AE G ER T
+mctague M AH K T EY G
+mctavish M AH K T EY V IH SH
+mctavish(2) M AH K T AE V IH SH
+mcteer M AH K T IH R
+mcternan M AH K T ER N AH N
+mctier M AH K T AY ER
+mctier(2) M AH K T IH R
+mctiernan M AH K T AY R N AH N
+mctiernan(2) M AH K T IH R N AH N
+mctighe M AH K T AY G
+mctigue M AH K T IY G
+mcvay M AH K V EY
+mcvea M AH K V IY
+mcveigh M AH K V EY
+mcveigh's M AH K V EY Z
+mcvey M AH K V EY
+mcvicar M AH K V IH K ER
+mcvicker M AH K V IH K ER
+mcvoy M AH K V OY
+mcwain M AH K W EY N
+mcwaters M AH K W AO T ER Z
+mcwatters M AH K W AO T ER Z
+mcweeney M AH K W IY N IY
+mcwethy M AH K W EH TH IY
+mcwherter M AH K W ER T ER
+mcwhinney M AH K W IH N IY
+mcwhirt M AH K W ER T
+mcwhirter M AH K W ER T ER
+mcwhite M AH K W AY T
+mcwhorter M AH K W AO R T ER
+mcwilliam M AH K W IH L Y AH M
+mcwilliams M AH K W IH L Y AH M Z
+mcwright M AH K R AY T
+mczeal M AH K Z IY L
+me M IY
+mea M IY
+meacham M IY CH AH M
+meachum M IY CH AH M
+mead M IY D
+mead's M IY D Z
+meade M IY D
+meader M IY D ER
+meaders M IY D ER Z
+meador M IY D ER
+meadors M IY D ER Z
+meadow M EH D OW
+meadowland M EH D OW L AE N D
+meadowlands M EH D OW L AE N D Z
+meadowlark M EH D OW L AA R K
+meadows M EH D OW Z
+meads M IY D Z
+meager M IY G ER
+meagher M AA R
+meaker M IY K ER
+meakin M IY K IH N
+meal M IY L
+meal's M IY L Z
+mealer M IY L ER
+mealey M IY L IY
+mealing M IY L IH NG
+mealo M IY AH L OW
+mealor M IY L ER
+meals M IY L Z
+mealtime M IY L T AY M
+mealy M IY L IY
+mealynose M IY L IY N OW Z
+mealynosed M IY L IY N OW Z D
+mean M IY N
+meander M IY AE N D ER
+meandered M IY AE N D ER D
+meandering M IY AE N D ER IH NG
+meanders M IY AE N D ER Z
+meaner M IY N ER
+meanest M IY N AH S T
+meaney M IY N IY
+meaning M IY N IH NG
+meaningful M IY N IH NG F AH L
+meaningfully M IY N IH NG F AH L IY
+meaningless M IY N IH NG L AH S
+meanings M IY N IH NG Z
+meanness M IY N N AH S
+meanor M IY N ER
+means M IY N Z
+means' M IY N Z
+meant M EH N T
+meantime M IY N T AY M
+meanwhile M IY N W AY L
+meany M IY N IY
+mear M IH R
+meara M IY R AH
+meares M IY R Z
+mearns M ER N Z
+mears M IH R Z
+mease M IY Z
+measel M IY Z AH L
+measles M IY Z AH L Z
+measly M IY Z L IY
+measurable M EH ZH ER AH B AH L
+measurably M EH ZH ER AH B L IY
+measure M EH ZH ER
+measure's M EH ZH ER Z
+measured M EH ZH ER D
+measurement M EH ZH ER M AH N T
+measurements M EH ZH ER M AH N T S
+measures M EH ZH ER Z
+measurex M EH Z ER AH K S
+measuring M EH ZH ER IH NG
+meat M IY T
+meat-eating M IY T IY T IH NG
+meatball M IY T B AO L
+meatballs M IY T B AO L Z
+meath M IY TH
+meatier M IY T IY ER
+meatless M IY T L AH S
+meatloaf M IY T L OW F
+meatpacker M IY T P AE K ER
+meatpackers M IY T P AE K ER Z
+meatpacking M IY T P AE K IH NG
+meats M IY T S
+meaty M IY T IY
+meaux M OW
+meave M IY V
+mebane M EH B AH N
+meca M EH K AH
+mecca M EH K AH
+mecca's M EH K AH Z
+mech M EH K
+mecham M EH CH AH M
+mecham's M EH CH AH M Z
+mechanic M AH K AE N IH K
+mechanic(2) M IH K AE N IH K
+mechanical M AH K AE N IH K AH L
+mechanically M AH K AE N IH K L IY
+mechanics M AH K AE N IH K S
+mechanics' M AH K AE N IH K S
+mechanicsburg M AH K AE N IH K S B ER G
+mechanism M EH K AH N IH Z AH M
+mechanisms M EH K AH N IH Z AH M Z
+mechanistic M EH K AH N IH S T IH K
+mechanization M EH K AH N AH Z EY SH AH N
+mechanize M EH K AH N AY Z
+mechanized M EH K AH N AY Z D
+meche M EH CH
+mechem M EH K IH M
+mechem(2) M EH CH AH M
+mechler M EH K L ER
+mechling M EH K L IH NG
+meciar M EH S IY AA R
+meck M EH K
+meckel M EH K AH L
+meckes M EH K S
+mecklenburg M EH K L AH N B ER G
+meckler M EH K L ER
+meckley M EH K L IY
+meckstroth M EH K S T R AO TH
+mecum M EH K AH M
+med M EH D
+meda M EY D AH
+medaglia M EH D AA G L IY AH
+medal M EH D AH L
+medalist M EH D AH L IH S T
+medalist's M EH D AH L IH S T S
+medalists M EH D AH L IH S T S
+medalists(2) M EH D AH L IH S S
+medalists(3) M EH D AH L IH S
+medallion M AH D AE L Y AH N
+medallions M AH D AE L Y AH N Z
+medals M EH D AH L Z
+medaphis M EH D AH F IH S
+medar M EH D ER
+medarex M EH D ER EH K S
+medaris M EY D AA R IH S
+medcalf M EH D K AE L F
+medchem M EH D K EH M
+medchem's M EH D K EH M Z
+medco M EH D K OW
+medco's M EH D K OW Z
+meddaugh M EH D AO
+medders M EH D ER Z
+meddle M EH D AH L
+meddlesome M EH D AH L S AH M
+meddling M EH D AH L IH NG
+meddling(2) M EH D L IH NG
+medea M AH D IY AH
+medearis M EH D ER IH S
+medecin M EH D IH S IH N
+medecins M EH D IH S IH N Z
+medeiros M EY D IH R OW Z
+medel M EH D AH L
+medellin M IH D EH L IH N
+medema M EH D EH M AH
+medendorp M EH D EH N D AO R P
+meder M IY D ER
+mederos M EH D ER OW Z
+medes M IY D Z
+medeva M EH D EH V AH
+medex M EH D AH K S
+medfact M EH D F AE K T
+medfacts M EH D F AE K T S
+medfirst M EH D F ER S T
+medfly M EH D F L IY
+medford M EH D F ER D
+medgar M EH D G ER
+medgar's M EH D G ER Z
+medi M EH D IY
+media M IY D IY AH
+media's M IY D IY AH Z
+medial M IY D IY AH L
+medial(2) M IY D Y AH L
+mediamark M IY D IY AH M AA R K
+median M IY D IY AH N
+medianews M IY D IY AH Y UW Z
+mediaset M IY D IY AH S EH T
+mediate M IY D IY EY T
+mediated M IY D IY EY T IH D
+mediating M IY D IY EY T IH NG
+mediation M IY D IY EY SH AH N
+mediator M IY D IY EY T ER
+mediators M IY D IY EY T ER Z
+medic M EH D IH K
+medic's M EH D IH K S
+medicaid M EH D AH K EY D
+medical M EH D AH K AH L
+medical's M EH D AH K AH L Z
+medical's(2) M EH D IH K AH L Z
+medical(2) M EH D IH K AH L
+medically M EH D AH K L IY
+medically(2) M EH D IH K AH L IY
+medicare M EH D AH K EH R
+medicare's M EH D AH K EH R Z
+medicate M EH D IH K EY T
+medicated M EH D IH K EY T IH D
+medicates M EH D IH K EY T S
+medicating M EH D IH K EY T IH NG
+medication M EH D AH K EY SH AH N
+medications M EH D AH K EY SH AH N Z
+medici M EH D IY S IY
+medicinal M AH D IH S AH N AH L
+medicinally M AH D IH S AH N AH L IY
+medicine M EH D AH S AH N
+medicine's M EH D AH S AH N Z
+medicines M EH D AH S AH N Z
+medico M EH D IH K OW
+medics M EH D IH K S
+medicus M EH D IH K AH S
+medieval M IH D IY V AH L
+medieval(2) M IY D IY V AH L
+medieval(3) M IH D Y IY V AH L
+medigap M EH D IH G AE P
+medil M AH D IH L
+medimmune M EH D IH M Y UW N
+medin M EY D IY N
+medina M AH D AY N AH
+medina(2) M AH D IY N AH
+medinger M IY D IH NG ER
+medio M IY D IY OW
+medio(2) M EH D IY OW
+mediobanca M IH D IY OW B AE NG K AH
+mediocre M IY D IY OW K ER
+mediocrity M IY D IY AA K R AH T IY
+mediplex M EH D IH P L EH K S
+mediq M EH D IY K
+mediscare M EH D IH S K EY R
+medisgroup M EH D IH S G R UW P
+medisgroups M EH D IH S G R UW P S
+meditate M EH D AH T EY T
+meditating M EH D AH T EY T IH NG
+meditation M EH D AH T EY SH AH N
+meditations M EH D IH T EY SH AH N Z
+meditative M EH D AH T EY T IH V
+mediterranean M EH D AH T ER EY N IY AH N
+meditrust M EH D IH T R AH S T
+meditz M EH D IH T S
+medium M IY D IY AH M
+mediums M IY D IY AH M Z
+medivac M EH D IH V AE K
+medivaced M EH D IH V AE K T
+medland M EH D L AH N D
+medlar M EH D L ER
+medlen M EH D AH L AH N
+medler M EH D L ER
+medley M EH D L IY
+medlin M EH D L IH N
+medlock M EH D L AH K
+mednick M EH D N IH K
+medoff M EH D AO F
+medora M EY D AO R AH
+medrano M EH D R AA N OW
+medserv M EH D S ER V
+medsker M EH D S K ER
+medstone M EH D S T OW N
+medtronic M EH D T R AA N IH K
+medulla M IH D AH L AH
+medulla(2) M IH D UW L AH
+medusa M AH D UW S AH
+medusas M AH D UW S AH Z
+medved M EH D V AH D
+medvedev M EH D V AH D EH V
+medwin M EH D W IH N
+mee M IY
+meece M IY S
+meech M IY CH
+meecham M IY CH AH M
+meeder M IY D ER
+meegan M IY G AH N
+meehan M IY AH N
+meehans M IY HH AE N Z
+meehans(2) M IY AH N Z
+meehl M IY L
+meek M IY K
+meeker M IY K ER
+meekins M IY K IH N Z
+meekly M IY K L IY
+meeks M IY K S
+meeler M IY L ER
+meenaghan M IY N AH HH AE N
+meenan M IY N AH N
+meents M IY N T S
+meer M IY ER
+meers M IY ER Z
+meert M IY R T
+mees M IY Z
+meese M IY S
+meese's M IY S IH Z
+meester M IY S T ER
+meet M IY T
+meeting M IY T IH NG
+meeting's M IY T IH NG Z
+meetings M IY T IH NG Z
+meets M IY T S
+meetze M IY T Z
+meeuwsen M IY UW S AH N
+mefferd M EH F ER D
+meffert M EH F ER T
+mefford M EH F ER D
+meg M EH G
+mega M EH G AH
+megabit M EH G AH B IH T
+megabuck M EH G AH B AH K
+megabucks M EH G AH B AH K S
+megabyte M EH G AH B AY T
+megabytes M EH G AH B AY T S
+megacarrier M EH G AH K AE R Y ER
+megacarriers M EH G AH K AE R Y ER Z
+megace M IY G AH S
+megadeal M EH G AH D IY L
+megadeals M EH G AH D IY L Z
+megadeath M EH G AH D EH TH
+megafood M EH G AH F UW D
+megafoods M EH G AH F UW D Z
+megahertz M EH G AH HH ER T S
+megahouse M EH G AH HH AW S
+megahouses M EH G AH HH AW S IH Z
+megalomania M EH G AH L OW M EY N IY AH
+megalomaniac M EH G AH L OW M EY N IY AE K
+megalopolis M EH G AH L AA P AH L AH S
+megamerger M EH G AH M ER JH ER
+megamergers M EH G AH M ER JH ER Z
+megan M EY G AH N
+megan's M EY G AH N Z
+megaphone M EH G AH F OW N
+megaphones M EH G AH F OW N Z
+megaplex M EH G AH P L EH K S
+megaquest M EH G AH K W EH S T
+megaquest's M EH G AH K W EH S T S
+megarry M EH G ER IY
+megastore M EH G AH S T AO R
+megastores M EH G AH S T AO R Z
+megatons M EH G AH T AH N Z
+megawatt M EH G AH W AA T
+megawatts M EH G AH W AA T S
+megee M EH JH IY
+meger M EH G ER
+megginson M EH G IH N S AH N
+meggison M EH G IH S AH N
+meggs M EH G Z
+meghan M EH G AH N
+meghdar M EH G D AA R
+megill M EH JH AH L
+megna M EH G N AH
+megner M EH G N ER
+mehaffey M EH HH AH F IY
+mehaffey(2) M AH HH AE F IY
+mehalkoff M EH HH AE L K AO F
+mehall M AH HH AO L
+mehan M EY HH AE N
+mehanovitch M AH HH AE N AH V AH CH
+meharg M EY HH AA R G
+meharry M EY HH AE R IY
+mehdi M EH D IY
+mehetabel M IH HH EH T AH B IH L
+mehitabel M EH HH IH T AH B AH L
+mehitabelle M EH HH IH T AH B AH L
+mehl M EH L
+mehlberg M EH L B ER G
+mehle M EH HH AH L
+mehlenbacher M EH L IH N B AA K ER
+mehler M EH L ER
+mehlhaff M EH L HH AH F
+mehlhoff M EH L HH AO F
+mehlhorn M EH L HH ER N
+mehling M EH L IH NG
+mehlman M EH L M AH N
+mehmet M EH M AH T
+mehner M EH N ER
+mehnert M EH N ER T
+mehr M EH R
+mehrabian M EH R EY B IY AH N
+mehrabian(2) M ER EY B IY AH N
+mehran M EH R AH N
+mehrens M EH R AH N Z
+mehrer M EH R ER
+mehring M EH R IH NG
+mehringer M EH R IH NG ER
+mehrtens M EH R T AH N Z
+mehta M EH T AH
+mehta's M EH T AH Z
+mehul M EH HH UH L
+mei M AY
+mei(2) M EY
+mei-ling M EY L IH NG
+meidinger M AY D IH NG ER
+meidl M IY D AH L
+meier M AY ER
+meier's M AY ER Z
+meierfeld M AY R F EH L D
+meighan M EY G HH AH N
+meighan(2) M EH G AH N
+meighan(3) M IY AH N
+meigher M EY G ER
+meiji M EY JH IY
+meikle M IY K AH L
+mein M IY N
+meincke M AY NG K IY
+meinders M AY N D ER Z
+meindl M AY N D AH L
+meine M IY N
+meinecke M AY N IH K IY
+meineke M AY N IH K IY
+meinen M AY N AH N
+meiner M AY N ER
+meiners M AY N ER Z
+meinert M AY N ER T
+meinertzhagen M AY N ER T S HH AA G AH N
+meinhardt M AY N HH AA R T
+meinhart M AY N HH AA R T
+meinhold M AY N HH OW L D
+meininger M AY N IH NG ER
+meinke M IY NG K
+meints M AY N T S
+meinzer M AY N Z ER
+meiosis M AY OW S AH S
+meir M IH R
+meiring M AY R IH NG
+meis M IY Z
+meisch M AY SH
+meise M IY S
+meisel M AY S AH L
+meisels M AY S AH L Z
+meisenheimer M AY S IH N HH AY M ER
+meiser M AY S ER
+meishan M AY SH AH N
+meisinger M AY S IH N JH ER
+meisler M AY S AH L ER
+meisler(2) M AY S L ER
+meisner M AY S N ER
+meiss M AY S
+meissner M AY S N ER
+meister M AY S T ER
+meisters M AY S T ER Z
+meitz M IY T S
+meitzler M AY T S L ER
+meixner M IY K S N ER
+meiyuh M EY Y UW
+mejia M EY Y IY AH
+mejias M EY Y IY AH Z
+mekeel M EH K IY L
+mekong M EY K AA NG
+mel M EH L
+mel's M EH L Z
+melador M EH L AH D AO R
+melamed M EH L AH M EH D
+melamine M EH L AH M IY N
+melanby M EH L AH N B IY
+melancholic M EH L AH N K AA L IH K
+melancholy M EH L AH N K AA L IY
+melancon M IH L AE N K AH N
+meland M EH L AH N D
+melander M EH L AH N D ER
+melanesian M EH L AH N IY ZH AH N
+melanesians M EH L AH N IY ZH AH N Z
+melange M EH L AE NG
+melanie M EH L AH N IY
+melanin M EH L AH N AH N
+melanin(2) M EH L AH N IH N
+melanoma M EH L AH N OW M AH
+melanson M EH L AH N S AH N
+melantha M IH L AE N DH AH
+melany M EH L AH N IY
+melaragno M EH L AA R AA G N OW
+melatonin M EH L AH T OW N IH N
+melatonin's M EH L AH T OW N IH N Z
+melatonins M EH L AH T OW N IH N Z
+melba M EH L B AH
+melberg M EH L B ER G
+melbourne M EH L B ER N
+melbourne(2) M EH L B AO N
+melburn M EH L B ER N
+melby M EH L B IY
+melcher M EH L CH ER
+melchert M EH L CH ER T
+melching M EH L CH IH NG
+melchior M EY L CH IY ER
+melchiorre M EH L K IY AO R EY
+melchor M EH L CH ER
+meld M EH L D
+melded M EH L D AH D
+melded(2) M EH L D IH D
+melder M EH L D ER
+melding M EH L D IH NG
+meldon M EH L D AH N
+meldons M EH L D AH N Z
+meldrum M EH L D R AH M
+mele M IY L
+melear M EH L ER
+melee M EY L EY
+meleis M AH L EY AH S
+melendez M AH L EH N D EH Z
+melendrez M EY L EY N D R EH Z
+melendy M IH L EH N D IY
+melero M EY L EH R OW
+meleski M IH L EH S K IY
+melessa M EH L EH S AH
+melfi M EH L F IY
+melgaard M EH L G AA R D
+melgar M EY L G AA R
+melgoza M EH L G OW Z AH
+melhem M EH L AH M
+melhorn M EH L HH ER N
+meli M EH L IY
+melia M EH L IY AH
+melican M EH L IH K AH N
+melicent M EH L IH S AH N T
+melichar M EH L IH K ER
+melick M EH L IH K
+melikian M IH L IH K IY AH N
+melillo M EH L IH L OW
+melin M EH L IH N
+melina M EH L IY N AH
+melinda M AH L IH N D AH
+meline M EH L AY N
+meling M EH L IH NG
+melisent M EH L IH S AH N T
+melissa M AH L IH S AH
+melissa's M AH L IH S AH Z
+melisse M EH L IH S
+melita M EH L IY T AH
+melito M EH L IY T OW
+melitta M EH L IY T AH
+melius M IY L IY IH S
+melka M EH L K AH
+melkar M EH L K AA R
+melkar's M EH L K AA R Z
+melkonian M EH L K OW N IY AH N
+mell M EH L
+mella M EH L AH
+melland M EH L AH N D
+mellaril M EH L ER AH L
+melle M EH L
+mellem M EH L IH M
+mellema M EH L EH M AH
+mellen M EH L AH N
+meller M EH L ER
+mellett M EH L IH T
+melley M EH L IY
+mellgren M EH L G R EH N
+melli M EH L IY
+mellicent M EY L IY S AH N T
+mellick M EH L IH K
+mellie M EH L IY
+mellin M EH L IH N
+melling M EH L IH NG
+mellinger M EH L IH NG ER
+mellis M EH L IH S
+mellish M EH L IH SH
+mellman M EH L M AH N
+mello M EH L OW
+melloan M EH L OW N
+melloan's M EH L OW N Z
+mellon M EH L AH N
+mellon's M EH L AH N Z
+mellonby M EH L AH N B IY
+mellons M EH L AH N Z
+mellor M EH L ER
+mellott M EH L AH T
+mellow M EH L OW
+mellowed M EH L OW D
+mellowing M EH L OW IH NG
+melly M EH L IY
+melman M EH L M AH N
+melnick M EH L N IH K
+melnik M EH L N IH K
+melnor M EH L N ER
+melnyk M EH L N IH K
+melo M EH L OW
+meloche M EH L OW K IY
+melodic M AH L AA D IH K
+melodies M EH L AH D IY Z
+melodious M AH L OW D IY AH S
+melodrama M EH L AH D R AA M AH
+melodramas M EH L AH D R AA M AH Z
+melodramatic M EH L AH D R AH M AE T IH K
+melody M EH L AH D IY
+melon M EH L AH N
+melone M EH L OW N IY
+meloni M EH L OW N IY
+melons M EH L AH N Z
+melor M EH L AO R
+melor(2) M AH L AO R
+meloy M EH L OY
+melquist M EH L K W IH S T
+melridge M EH L R IH JH
+melridge's M EH L R IH JH IH Z
+melrod M EH L R AA D
+melrose M EH L R OW Z
+melroy M EH L R OY
+melson M EH L S AH N
+melt M EH L T
+meltdown M EH L T D AW N
+melted M EH L T AH D
+melted(2) M EH L T IH D
+melting M EH L T IH NG
+melton M EH L T AH N
+melts M EH L T S
+meltwater M EH L T W AA T ER
+meltwater(2) M EH L T W AO T ER
+meltz M EH L T S
+meltzer M EH L T S ER
+melucci M EH L UW CH IY
+melugin M EH L AH G IH N
+melva M EH L V AH
+melvie M EH L V IY
+melville M EH L V IH L
+melvin M EH L V IH N
+melvina M EH L V IY N AH
+melvine M EH L V AY N
+melvyn M EH L V IH N
+melwood M EH L W UH D
+melzer M EH L Z ER
+member M EH M B ER
+member's M EH M B ER Z
+membered M EH M B ER D
+members M EH M B ER Z
+members' M EH M B ER Z
+membership M EH M B ER SH IH P
+memberships M EH M B ER SH IH P S
+membrane M EH M B R EY N
+membranes M EH M B R EY N Z
+membranous M EH M B R AH N AH S
+memel M EH M AH L
+memento M IH M EH N T OW
+mementos M IH M EH N T OW Z
+memmer M EH M ER
+memmott M EH M AH T
+memnon M EH M N AA N
+memo M EH M OW
+memo's M EH M OW Z
+memoir M EH M W AA R
+memoirs M EH M W AA R Z
+memoli M EH M OW L IY
+memorabilia M EH M ER AH B IY L Y AH
+memorable M EH M ER AH B AH L
+memorably M EH M ER AH B L IY
+memoranda M EH M ER AE N D AH
+memorandum M EH M ER AE N D AH M
+memorandums M EH M ER AE N D AH M Z
+memorex M EH M AO R EH K S
+memorial M AH M AO R IY AH L
+memorialize M AH M AO R IY AH L AY Z
+memorialized M AH M AO R IY AH L AY Z D
+memorials M AH M AO R IY AH L Z
+memories M EH M ER IY Z
+memories' M EH M ER IY Z
+memorize M EH M ER AY Z
+memorized M EH M ER AY Z D
+memorizes M EH M ER AY Z IH Z
+memorizing M EH M ER AY Z IH NG
+memory M EH M ER IY
+memos M EH M OW Z
+memotec M EH M OW T EH K
+memphis M EH M F AH S
+memphis(2) M EH M F IH S
+memphis(3) M EH M P F AH S
+memphis(4) M EH M P F IH S
+memtec M EH M T EH K
+memtec's M EH M T EH K S
+men M EH N
+men's M EH N Z
+mena M IY N AH
+menace M EH N AH S
+menace(2) M EH N IH S
+menaced M EH N AH S T
+menaced(2) M EH N IH S T
+menaces M EH N AH S IH Z
+menaces(2) M EH N IH S IH Z
+menachem M AH N AA HH AH M
+menachem(2) M EH N AH HH EH M
+menacing M EH N AH S IH NG
+menacingly M EH N AH S IH NG L IY
+menagerie M AH N AE JH ER IY
+menahem M AH N AA HH AH M
+menaker M EH N AH K ER
+menapace M EH N AA P AA CH IY
+menard M IH N AA R D
+menasco M EH N AA S K OW
+menasion M EH N AE S IY AH N
+menasion's M EH N AE S IY AH N Z
+menatep M EH N AH T EH P
+mencer M EH N S ER
+mench M EH N CH
+menchaca M EH N K AA K AH
+mencher M EH N CH ER
+mencken M EH NG K AH N
+menconi M EH N K OW N IY
+mend M EH N D
+mendacious M EH N D EY SH AH S
+mendacity M EH N D AE S IH T IY
+mendan M EH N D AH N
+mende M EH N D
+mended M EH N D IH D
+mendel M EH N D AH L
+mendel's M EH N D AH L Z
+mendell M EH N D EH L
+mendelsohn M EH N D AH L S AH N
+mendelson M EH N D AH L S AH N
+mendelssohn M EH N D AH L S AH N
+mendenhall M EH N D AH N HH AO L
+mendes M EY N D EH S
+mendez M EH N D EH Z
+mendicino M EH N D IY CH IY N OW
+mendieta M EH N D IY T AH
+mendillo M EH N D IH L OW
+mending M EH N D IH NG
+mendiola M EH N D IY OW L AH
+mendivil M EY N D IY V IY L
+mendlowitz M EH N D L AH W IH T S
+mendocino M EH N D AH S IY N OW
+mendola M EH N D OW L AH
+mendolia M EH N D OW L IY AH
+mendonca M EH N D OW N K AH
+mendonsa M EH N D AA N S AH
+mendosa M EH N D OW S AH
+mendota M EH N D OW T AH
+mendota(2) M EH N D AA T AH
+mendoza M EH N D OW Z AH
+mendyk M EH N D IH K
+menear M IH N IH R
+meneely M IH N IY L IY
+menees M EH N IY Z
+menefee M EH N IH F IY
+menem M EH N AH M
+menem's M EH N AH M Z
+menendez M EH N EH N D EH Z
+meneses M EY N EY S EH S
+menezes M EY N EY Z EH S
+meng M EH NG
+menge M EH N JH
+mengel M EH NG G AH L
+mengele M EH NG G AH L AH
+menger M EH N JH ER
+mengers M EH NG G ER Z
+menges M EH N JH IH Z
+menghini M EH N G IY N IY
+mengistu M EH NG G IY S T UW
+menhaden M EH N HH EY D AH N
+menia M IY N Y AH
+menial M IY N IY AH L
+menifee M EH N IH F IY
+menil M EH N IY L
+meningitis M EH N AH N JH AY T AH S
+menino M AH N IY N OW
+menjivar M EY N Y IY V AA R
+menk M EH NG K
+menka M EH NG K AH
+menke M EH NG K
+menken M EH NG K AH N
+menkes M EH NG K S
+menlo M EH N L OW
+menn M EH N
+menna M EH N AH
+mennan M EH N AH N
+mennan's M EH N AH N Z
+menne M EH N
+mennella M EH N EH L AH
+mennen M EH N AH N
+mennenga M IH N EH NG G AH
+menning M EH N IH NG
+menninger M EH N IH NG ER
+mennini M EH N IY N IY
+mennonite M EH N AH N AY T
+mennonites M EH N AH N AY T S
+meno M EY N OW
+menon M EY N AO N
+menopausal M EH N AH P AW Z AH L
+menopause M EH N AH P AW Z
+menor M EH N ER
+menorah M AH N AO R AH
+menorah's M AH N AO R AH Z
+menorahs M AH N AO R AH Z
+menotomy M IH N AA T IH M IY
+menoyo M AH N OY OW
+mens M EH N Z
+mensah M EH N S AH
+mensch M EH N SH
+menschville M EH N SH V IH L
+menser M EH N S ER
+mensik M EH N S IH K
+mensing M EH N S IH NG
+mensinger M EH N S IH N JH ER
+menstrual M EH N S T R UW AH L
+menstrual(2) M EH N S T R AH L
+menstruation M EH N S T R UW EY SH AH N
+menswear M EH N Z W EY R
+mental M EH N T AH L
+mentality M EH N T AE L AH T IY
+mentality(2) M EH N T AE L IH T IY
+mentally M EH N T AH L IY
+mentally(2) M EH N AH L IY
+mente M EH N T
+mentel M EY N T EH L
+menter M EH N T ER
+menthol M EH N TH AO L
+mentholatum M EH N TH AH L EY T AH M
+mentink M EH N T IH NG K
+mention M EH N SH AH N
+mentioned M EH N SH AH N D
+mentioning M EH N SH AH N IH NG
+mentions M EH N SH AH N Z
+mento M EH N T OW
+menton M EH N T AH N
+mentor M EH N T AO R
+mentor's M EH N T AO R Z
+mentor(2) M EH N T ER
+mentored M EH N T ER D
+mentoring M EH N T ER IH NG
+mentors M EH N T ER Z
+mentors(2) M EH N T AO R Z
+mentz M EH N T S
+mentzel M EH N T Z AH L
+mentzer M EH N T Z ER
+menu M EH N Y UW
+menudo M AH N Y UW D OW
+menuhin M AH N UW HH IH N
+menuhin(2) M IH N Y UW IH N
+menus M EH N Y UW Z
+menz M EH N Z
+menze M EH N Z
+menzel M EH N Z AH L
+menzer M EH N Z ER
+menzie M EH N Z IY
+menzies M EH N Z IY Z
+menzione M EH N Z IY OW N IY
+menzione(2) M EH N Z Y OW N IY
+meo M IY OW
+meola M IY AA L AH
+meow M IY AW
+mequon M EH K W AH N
+mer M EH R
+mer(2) M ER
+merabank M EH R AH B AE NG K
+meranda M ER AA N D AH
+meraz M EH R AA Z
+merc M ER K
+merc's M ER K S
+merc's(2) M AA R K S
+merc(2) M AA R K
+mercadante M ER K AA D AA N T IY
+mercado M ER K AA D OW
+mercantil M ER K AE N T IH L
+mercantile M ER K AH N T AY L
+mercantile's M ER K AH N T IY L Z
+mercantilism M ER K AE N T AH L IH Z AH M
+mercantilist M ER K AE N T AH L IH S T
+mercator M ER K EY T ER
+merce M ER S
+merced M ER S T
+mercedes M ER S EY D IY Z
+mercedes's M ER S EY D IY Z
+mercedes's(2) M ER S EY D IY Z IH Z
+mercedeses M ER S EY D IY Z IH Z
+mercedeses(2) M ER S EY D IY Z
+mercenaries M ER S AH N EH R IY Z
+mercenary M ER S AH N EH R IY
+mercer M ER S ER
+merchandise M ER CH AH N D AY Z
+merchandiser M ER CH AH N D AY Z ER
+merchandisers M ER CH AH N D AY Z ER Z
+merchandising M ER CH AH N D AY Z IH NG
+merchant M ER CH AH N T
+merchant's M ER CH AH N T S
+merchantmen M ER CH AH N T M IH N
+merchants M ER CH AH N T S
+merchants' M ER CH AH N T S
+merchantsbank M ER CH AH N T S B AE NG K
+mercier M ER S IY ER
+mercies M ER S IY Z
+merciful M ER S IH F AH L
+mercifully M ER S IH F AH L IY
+mercifully(2) M ER S IH F L IY
+merciless M ER S AH L AH S
+mercilessly M ER S AH L AH S L IY
+merck M ER K
+merck's M ER K S
+mercland M ER K L AE N D
+mercosur M ER K OW S ER
+mercure M ER K UH R IY
+mercuri M ER K UH R IY
+mercurial M ER K Y UH R IY AH L
+mercuric M ER K Y UH R IH K
+mercurio M ER K UH R IY OW
+mercury M ER K Y ER IY
+mercury's M ER K Y ER IY Z
+mercy M ER S IY
+merdyce M ER D AY S
+mere M IH R
+meredith M EH R IH D IH TH
+merely M IH R L IY
+merenda M EH R EY N D AH
+merendino M ER EH N D IY N OW
+merengue M ER EY NG
+merest M EH R AH S T
+meretz M EH R EH T S
+merfeld M ER F EH L D
+merge M ER JH
+merged M ER JH D
+mergen M ER G AH N
+merger M ER JH ER
+merger's M ER JH ER Z
+mergers M ER JH ER Z
+merges M ER JH IH Z
+merging M ER JH IH NG
+merhige M ER HH IY JH
+meriam M IH R IY IH M
+merica M EH R IH K AH
+mericantante M EH R IY K AH N T AA N T EY
+mericle M EH R IH K AH L
+mericopa M EH R AH K OW P AH
+merida M ER IY D AH
+meriden M EH R IH D AH N
+merideth M EH R IH D IH TH
+meridian M ER IH D IY AH N
+meridian's M ER IH D IY AH N Z
+meridien M ER IH D IY AH N
+meridionale M ER IH D IY AH N AA L IY
+meridith M EH R IH D IH TH
+meridor M EH R IH D AO R
+meriel M IH R IY L
+merieux M EH R IY UW
+merillat M EH R IH L AE T
+merino M ER IY N OW
+merion M EH R IY AH N
+meris M EH R AH S
+merisel M EH R IH S EH L
+merit M EH R AH T
+merited M EH R IH T IH D
+merithew M ER IH TH Y UW
+meriting M EH R AH T IH NG
+meritless M EH R IH T L AH S
+meritocracy M EH R IH T AO K R AH S IY
+meritor M EH R AH T ER
+meritor(2) M EH R AH T AO R
+meritorious M EH R AH T AO R IY AH S
+merits M EH R AH T S
+merits(2) M EH R IH T S
+meritt M EH R IH T
+meriweather M EH R IH W EH DH ER
+meriwether M EH R IH W EH DH ER
+merk M ER K
+merkel M ER K AH L
+merker M ER K ER
+merkey M ER K IY
+merkich M ER K IH CH
+merkin M ER K IH N
+merklan M ER K L AH N
+merkle M ER K AH L
+merkley M ER K L IY
+merklin M ER K L IH N
+merksamer M ER K S AH M ER
+merkt M ER K T
+merkur M ER K ER
+merl M ER L
+merle M ER L
+merletti M ER L EH T IY
+merlin M ER L IH N
+merlina M ER L IY N AH
+merline M ER L AY N
+merlino M ER L IY N OW
+merlins M ER L IH N Z
+merlis M ER L IY Z
+merlo M EH R L OW
+merlot M ER L AH T
+merlots M ER L AH T S
+mermaid M ER M EY D
+mermaids M ER M EY D Z
+merman M ER M AE N
+mermelstein M ER M AH L S T AY N
+mermelstein(2) M ER M AH L S T IY N
+merna M EH R N AH
+merner M ER N ER
+mernick M ER N IH K
+mero M EH R OW
+merola M ER OW L AH
+merolla M ER OW L AH
+meroney M EH R AH N IY
+merow M EH R OW
+merrell M EH R AH L
+merrett M EH R IH T
+merriam M EH R IY AH M
+merrick M EH R IH K
+merricks M EH R IH K S
+merrie M EH R IY
+merrier M EH R IY ER
+merrifield M EH R IH F IY L D
+merrigan M EH R IH G AH N
+merrihew M ER IH HH Y UW
+merrill M EH R AH L
+merrill's M EH R AH L Z
+merrily M EH R AH L IY
+merrimac M EH R IH M AE K
+merrimack M EH R IH M AE K
+merriman M EH R IH M AH N
+merrin M EH R IH N
+merriott M EH R IY AH T
+merrit M EH R IH T
+merritt M EH R IH T
+merritts M EH R IH T S
+merriweather M EH R IH W EH DH ER
+merriwether M EH R IH W EH DH ER
+merrow M EH R OW
+merry M EH R IY
+merry-go-round M EH R IY G OW R AW N D
+merryfield M EH R IY F IY L D
+merryman M EH R IY M AH N
+mers M ER Z
+mersch M ER SH
+mersereau M ER S ER OW
+mershon M ER SH AH N
+mersman M ER S M AH N
+merson M ER S AH N
+merta M EH R T AH
+merten M ER T AH N
+mertens M ER T AH N Z
+mertes M EH R T EH S
+mertice M EH R T IH S
+mertins M ER T IH N Z
+mertle M ER T AH L
+merton M ER T AH N
+mertz M ER T S
+merv M ER V
+mervin M ER V IH N
+mervine M ER V AY N
+mervis M ER V IH S
+mervyn M ER V IH N
+mervyn's M ER V IH N Z
+merwe M ER W IY
+merwin M ER W IH N
+merwyn M ER W IH N
+meryl M EH R AH L
+meryll M EH R AH L
+merz M ER Z
+mesa M EY S AH
+mesa's M EY S AH Z
+mesaba M EH S AA B AH
+mesaros M EY S AA R OW Z
+mesbic M EH S B IH K
+mesbics M EH S B IH K S
+mescalero M EH S K AH L EH R OW
+mescaline M EH S K AH L IY N
+mesch M EH SH
+mesched M EH SH EH D
+mescher M EH SH ER
+meschke M EH SH K
+mesdames M EY D AE M Z
+meselsohn M EH Z AH L S AH N
+meselson M EH Z AH L S AH N
+mesenbrink M EH S IH N B R IH NG K
+mesenteric M EH S AH N T EH R IH K
+meserole M EH S ER OW L IY
+meserve M EH S ER V
+meservey M EH Z ER V EY
+mesh M EH SH
+meshed M EH SH T
+meshell M EH SH AH L
+meshes M EH SH IH Z
+meshing M EH SH IH NG
+meshulam M EH SH UW L AE M
+mesick M EH S IH K
+mesirow M EH S IH R OW
+meske M EH S K
+mesker M EH S K ER
+meskill M EH S K IH L
+meskimen M EH S K IY M EH N
+mesko M EH S K OW
+mesler M EH S AH L ER
+mesler(2) M EH S L ER
+mesmer M EH Z M ER
+mesmerism M EH S M ER IH Z AH M
+mesmerize M EH Z M ER AY Z
+mesmerized M EH Z M ER AY Z D
+mesmerizing M EH Z M ER AY Z IH NG
+mesner M EH S N ER
+mesodermal M EH Z AH D ER M AH L
+mesolithic M EH Z AH L IH TH IH K
+meson M EY Z AA N
+mesons M IY Z AA N Z
+mesopotamia M EH S AH P AH T EY M IY AH
+mesopotamian M EH S AH P AH T EY M IY AH N
+mesopotamians M EH S AH P AH T EY M IY AH N Z
+mesothelioma M EH S AH TH IY L IY OW M AH
+mesothorax M EH Z AH TH AO R AE K S
+mesozoic M EH S AH Z OW IH K
+mesquite M EH S K IY T
+mess M EH S
+messa M EH S AH
+message M EH S AH JH
+message(2) M EH S IH JH
+messagepad M EH S AH JH P AE D
+messages M EH S AH JH AH Z
+messages(2) M EH S IH JH IH Z
+messaging M EH S IH JH IH NG
+messamore M EH S AA M AO R
+messana M EH S AE N AH
+messed M EH S T
+messeghero M EH S AH G EH R OW
+messel M EH S AH L
+messenger M EH S AH N JH ER
+messenger(2) M EH S IH N JH ER
+messengers M EH S AH N JH ER Z
+messer M EH S ER
+messerli M EH S ER L IY
+messerly M EH S ER L IY
+messerschmidt M EH S ER SH M IH T
+messerschmitt M EH S ER SH M IH T
+messersmith M EH S ER S M IH TH
+messes M EH S IH Z
+messiaen M EH S IY EY N
+messiaen's M EH S IY EY N Z
+messiah M AH S AY AH
+messiahs M AH S AY AH Z
+messianic M EH S IY AE N IH K
+messick M EH S IH K
+messier M EH S IY ER
+messieurs M EY S Y ER Z
+messimer M EH S IH M ER
+messina M IH S IY N AH
+messineo M EH S IH N IY OW
+messing M EH S IH NG
+messinger M EH S IH NG ER
+messler M EH S L ER
+messman M EH S M AH N
+messmer M EH S M ER
+messmore M EH S M AO R
+messner M EH S N ER
+messrs M EH S ER Z
+messrs. M EH S ER Z
+messrs.(2) M IH S UW R Z
+messy M EH S IY
+mest M EH S T
+mesta M EH S T AH
+mestas M EH S T AH Z
+mestek M EH S T EH K
+mester M EH S T ER
+mestizo M EH S T IY Z OW
+meston M EH S T AH N
+mestrallet M EH S T R AH L EH T
+mestre M EH S T ER
+mestrovic M EH S T R OW V IH K
+meszaros M IH SH AA R OW Z
+met M EH T
+met's M EH T S
+meta M IY T AH
+metabolic M EH T AH B AA L IH K
+metabolism M AH T AE B AH L IH Z AH M
+metabolisms M AH T AE B AH L IH Z AH M Z
+metabolize M AH T AE B AH L AY Z
+metacarpal M EH T AH K AA R P AH L
+metacarpals M EH T AH K AA R P AH L Z
+metagogue M EH T AH G AO G
+metagogued M EH T AH G AO G D
+metairie M AH T EH R IY
+metal M EH T AH L
+metal's M EH T AH L Z
+metall M EH T AO L
+metallatz M EH T AE L AH T S
+metallgesellschaft M EH T AH L G EH S AH L SH AE F T
+metallgesellschaft's M EH T AH L G EH S AH L SH AE F T S
+metallic M AH T AE L IH K
+metallic's M AH T AE L IH K S
+metallica M AH T AE L IH K AH
+metallica's M AH T AE L IH K AH Z
+metallo M EH T AA L OW
+metallurgical M EH T AH L ER JH IH K AH L
+metallurgy M EH T AH L ER JH IY
+metals M EH T AH L Z
+metals' M EH T AH L Z
+metalwork M EH T AH L W ER K
+metalworker M EH T AH L W ER K ER
+metalworkers M EH T AH L W ER K ER Z
+metalworking M EH T AH L W ER K IH NG
+metamorphasis M EH T AH M AO R F AH S AH S
+metamorphic M EH T AH M AO R F IH K
+metamorphose M EH T AH M AO R F OW Z
+metamorphosis M EH T AH M AO R F AH S AH S
+metamucil M EH T AH M Y UW S AH L
+metamucil's M EH T AH M Y UW S AH L Z
+metaphor M EH T AH F AO R
+metaphorical M EH T AH F AO R IH K AH L
+metaphorically M EH T AH F AO R IH K L IY
+metaphors M EH T AH F AO R Z
+metaphysical M EH T AH F IH Z IH K AH L
+metaphysics M EH T AH F IH Z IH K S
+metastasis M AH T AE S T AH S IH S
+metastasize M AH T AE S T AH S AY Z
+metastasized M AH T AE S T AH S AY Z D
+metathorax M EH T AH TH AO R AE K S
+metavsky M AH T AE V S K IY
+metaxas M AH T AE K S AH S
+metcalf M EH T K AE F
+metcalfe M EH T K AH L F
+metcom M EH T K AA M
+mete M IY T
+mete(2) M EH T AH
+meted M IY T IH D
+meteor M IY T IY ER
+meteoric M IY T IY AO R IH K
+meteorite M IY T IY AO R AY T
+meteorological M IY T IY AO R AH L AA JH IH K AH L
+meteorologist M IY T IY ER AA L AH JH IH S T
+meteorologist's M IY T IY ER AA L AH JH IH S T S
+meteorologists M IY T IY ER AA L AH JH IH S T S
+meteorologists(2) M IY T IY ER AA L AH JH IH S S
+meteorologists(3) M IY T IY ER AA L AH JH IH S
+meteorology M IY T IY ER AA L AH JH IY
+meteors M IY T IY ER Z
+meter M IY T ER
+metered M IY T ER D
+metering M IY T ER IH NG
+meters M IY T ER Z
+metex M EH T EH K S
+meth M EH TH
+methadone M EH TH AH D OW N
+methamphetamine M EH TH AE M F EH T AH M IY N
+methamphetamine(2) M EH TH AE M F EH T AH M AY N
+methane M EH TH EY N
+methanex M EH TH AH N EH K S
+methanol M EH TH AH N AA L
+methazine M EH TH AH Z IY N
+metheney M EH TH IH N IY
+metheny M EH TH IH N IY
+methner M EH TH N ER
+method M EH TH AH D
+methode M AH TH OW D
+methodical M AH TH AA D AH K AH L
+methodical(2) M AH TH AA D IH K AH L
+methodically M AH TH AA D IH K AH L IY
+methodically(2) M AH TH AA D IH K L IY
+methodism M EH TH AH D IH Z AH M
+methodisms M EH TH AH D IH Z AH M Z
+methodist M EH TH AH D AH S T
+methodist(2) M EH TH AH D IH S T
+methodological M EH TH AH D AH L AA JH IH K AH L
+methodologies M EH TH OW D AA L AH JH IY Z
+methodology M EH TH AH D AA L AH JH IY
+methods M EH TH AH D Z
+methot M EH TH AH T
+methotrexate M EH TH OW T R EH K S EY T
+methuselah M AH TH Y UW Z AH L AH
+methvin M EH TH V IH N
+methyl M EH TH AH L
+methylene M EH TH IH L IY N
+metics M EH T IH K S
+meticulous M AH T IH K Y AH L AH S
+meticulously M AH T IH K Y AH L AH S L IY
+metier M EH T Y ER
+metis M EH T IH S
+metivier M EH T IH V IY ER
+metlakatla M EH T L AH K AE T L AH
+metlife M EH T L AY F
+metolachlor M AH T OW L AH K L ER
+metonomy M AH T AO N AH M IY
+metoyer M EH T OY ER
+metpath M EH T P AE TH
+metra M EH T R AH
+metrahealth M EH T R AH HH EH L TH
+metric M EH T R IH K
+metrical M EH T R IH K AH L
+metrically M EH T R IH K AH L IY
+metrick M EH T R IH K
+metrics M EH T R IH K S
+metro M EH T R OW
+metro's M EH T R OW Z
+metrobanc M EH T R OW B AE NG K
+metrobank M EH T R OW B AE NG K
+metrocall M EH T R OW K AO L
+metrocolor M EH T R OW K AH L ER
+metrocorp M EH T R OW K AO R P
+metrodade M EH T R OW D EY D
+metrodome M EH T R OW D OW M
+metrodome(2) M EH T R AH D OW M
+metromail M EH T R OW M EY L
+metromedia M EH T R OW M IY D IY AH
+metroplex M EH T R OW P L EH K S
+metroplexes M EH T R OW P L EH K S IH Z
+metropol M EH T R AH P OW L
+metropol's M EH T R AH P OW L Z
+metropoli M AH T R AA P AH L IY
+metropolis M AH T R AA P AH L AH S
+metropolitain M EH T R AH P AO L AH T AH N
+metropolitan M EH T R AH P AA L AH T AH N
+metropolitan's M EH T R AH P AA L AH T AH N Z
+metropolitans M EH T R AH P AA L AH T AH N Z
+mets M EH T S
+mets' M EH T S
+metsker M EH T S K ER
+mette M EH T
+metter M EH T ER
+metternich M EH T ER N IH CH
+mettle M EH T AH L
+mettlen M EH T L AH N
+mettler M EH T L ER
+metts M EH T S
+mettur M EH T ER
+metz M EH T S
+metze M EH T Z
+metzenbaum M EH T S AH N B AW M
+metzenbaum's M EH T S AH N B AW M Z
+metzer M EH T S ER
+metzgar M EH T S G ER
+metzger M EH T S G ER
+metzger's M EH T S G ER Z
+metzinger M EH T Z IH NG ER
+metzker M EH T S K ER
+metzler M EH T S L ER
+metzner M EH T S N ER
+meunier M OY N IY ER
+meurer M ER ER
+meuse M Y UW Z
+meuser M OY S ER
+meuth M Y UW TH
+mevacor M EH V AH K AO R
+mevarach M AH V AA R AH CH
+mevarach's M AH V AA R AH CH AH Z
+mevarachs M AH V AA R AH CH AH Z
+mew M Y UW
+mewas M Y UW AH S
+mewas(2) M IY W AH S
+mewborn M Y UW B ER N
+mewes M Y UW Z
+mex M EH K S
+mexicali M EH K S IH K AA L IY
+mexican M EH K S AH K AH N
+mexicana M EH K S IH K AE N AH
+mexicano M EH K S IH K AA N OW
+mexicanos M EH K S IH K AA N OW Z
+mexicans M EH K S IH K AH N Z
+mexico M EH K S AH K OW
+mexico's M EH K S AH K OW Z
+mey M EY
+meyer M AY ER
+meyer's M AY ER Z
+meyerbeer M AY ER B IH R
+meyerhoff M AY ER HH AO F
+meyering M EY ER IH NG
+meyerman M AY ER M AH N
+meyerowitz M AY ER AH W IH T S
+meyers M AY ER Z
+meyerson M AY ER S AH N
+meyn M EY N
+meyo M EY OW
+meyohas M EY OW HH AA S
+mez M EH Z
+meza M EH Z AH
+mezera M EY Z EH R AH
+mezey M EH Z IY
+mezger M EH Z JH ER
+mezhdumarodnom M EH Z D UW M AH R AA D N AH M
+mezo M EH Z OW
+mezro M EH Z R OW
+mezuzah M AH Z UH Z AH
+mezvinsky M EH Z V IH N S K IY
+mezvinsky's M EH Z V IH N S K IY Z
+mezzaluna M EH T S AH L UW N AH
+mezzaluna(2) M EH Z AH L UW N AH
+mezzanine M EH Z AH N IY N
+mezzo M EH Z OW
+mfume EH M F UW M EY
+mgm EH M G IY EH M
+mh EH M EY CH
+mhm AH M HH AH M
+mhoon M HH UW N
+mi M IY
+mi-vami M IY V AE M IY
+mia M IY AH
+miami M AY AE M IY
+miami's M AY AE M IY Z
+miano M IY AA N OW
+miara M AY AA R AH
+miasma M IY AE Z M AH
+miasma(2) M AY AE Z M AH
+miata M IY AA T AH
+miazga M IY AA Z G AH
+mib M IH B
+mic M IH K
+mica M AY K AH
+micaela M IY K EY L AH
+micah M AY K AH
+micale M IY K AA L IY
+micallef M IH K AH L EH F
+micanopy M IH K AE N AH P IY
+micatin M AY K AH T IH N
+micciche M IY CH IY K IY
+miccio M IY CH IY OW
+mice M AY S
+micek M IH CH EH K
+miceli M IY CH EH L IY
+mich M IH CH
+michael M AY K AH L
+michael's M AY K AH L Z
+michaela M AY K EH L AH
+michaelina M AY K AH L IY N AH
+michaeline M AY K AH L AY N
+michaeline(2) M AY K AH L IY N
+michaelis M AY K EH L IH S
+michaella M AY K EH L AH
+michaels M AY K AH L Z
+michaelsen M AY K AH L S AH N
+michaelson M AY K AH L S AH N
+michal M IH CH AH L
+michalak M IH CH AH L AE K
+michalec M IH HH AA L IH K
+michalek M IH HH AA L EH K
+michalik M IH K AH L IH K
+michalowski M IH CH AH L AO F S K IY
+michals M IH CH AH L Z
+michalski M IH CH AA L S K IY
+michalsky M IH CH AA L S K IY
+michaud M IH SH OW
+michaux M IH SH OW
+michcon M IH SH K AA N
+michcon's M IH SH K AA N Z
+micheal M AY K AH L
+micheaux M IH SH OW
+micheaux's M IH SH OW Z
+michel M IH SH EH L
+michel's M IH SH EH L Z
+michel's(2) M IH CH AH L Z
+michel's(3) M AY K AH L Z
+michel(2) M IH CH AH L
+michel(3) M AY K AH L
+michela M IH K EY L AH
+michela's M IH K EY L AH Z
+michelangelo M AY K AH L AE N JH AH L OW
+michelangelo's M AY K AH L AE N JH AH L OW Z
+michelangelo's(2) M IH K AH L AE N JH AH L OW Z
+michelangelo(2) M IH K AH L AE N JH AH L OW
+michelangelos M AY K AH L AE N JH AH L OW Z
+michelangelos(2) M IH K AH L AE N JH AH L OW Z
+michele M IH SH EH L
+micheletti M IH K AH L EH T IY
+micheli M IH K EH L IY
+michelin M IH SH AH L AH N
+michelin(2) M IH SH L AH N
+michelina M IH K AH L IY N AH
+micheline M IH SH AH L AH N
+michelini M IH K AH L IY N IY
+michell M IH CH AH L
+michelle M IH SH EH L
+michelle's M IH SH EH L Z
+michelli M IH CH EH L IY
+michelman M AY K AH L M AH N
+michelob M IH K AH L OW B
+michelotti M IH K AH L OW T IY
+michels M IH SH EH L Z
+michelsen M AY K AH L S AH N
+michelson M AY K AH L S AH N
+michener M IH CH N ER
+michener's M IH CH N ER Z
+michie M IH CH IY
+michiels M AY K AH L Z
+michiels(2) M IH CH IY L Z
+michigan M IH SH IH G AH N
+michigan's M IH SH IH G AH N Z
+michihiro M IH CH IY HH IY R OW
+michio M IH CH IY OW
+michl M IH CH AH L
+michler M IH CH L ER
+michna M IH CH N AH
+michoacan M IH CH OW K AH N
+michon M IH CH AH N
+mick M IH K
+micka M IH K AH
+micke M IH K
+mickel M IH K AH L
+mickelberry M IH K AH L B EH R IY
+mickels M IH K AH L Z
+mickelsen M IH K AH L S AH N
+mickelson M IH K AH L S AH N
+mickens M IH K AH N Z
+mickey M IH K IY
+mickey'll M IH K IY AH L
+mickey's M IH K IY Z
+micki M IH K IY
+mickie M IH K IY
+mickiewicz M IH K AH V IH CH
+mickish M IH K IH SH
+mickle M IH K AH L
+mickler M IH K L ER
+mickles M IH K AH L Z
+mickley M IH K L IY
+mickus M IH K AH S
+micky M IH K IY
+micoin M IH K OY N
+micom M AY K AA M
+micosukee M IH K AH S UW K IY
+micro M AY K R OW
+micro's M AY K R OW Z
+microage M AY K R OW EY JH
+microaire M AY K R OW EH R
+microamerica M AY K R OW AH M EH R IH K AH
+microbe M AY K R OW B
+microbes M AY K R OW B Z
+microbial M AY K R OW B IY AH L
+microbilt M AY K R OW B IH L T
+microbiologist M AY K R OW B IY AA L AH JH IH S T
+microbiologists M AY K R OW B IY AA L AH JH IH S T S
+microbiologists(2) M AY K R OW B IY AA L AH JH IH S
+microbiology M AY K R OW B AY AA L AH JH IY
+microbiology(2) M AY K R AH B AY AA L AH JH IY
+microbreweries M AY K R OW B R UW ER IY Z
+microbrewery M AY K R OW B R UW ER IY
+microcentrifuge M AY K R OW S EH N T R AH F Y UW JH
+microchip M AY K R OW CH IH P
+microchips M AY K R OW CH IH P S
+microcircuit M AY K R OW S ER K AH T
+microcircuits M AY K R OW S ER K AH T S
+microclimate M AY K R OW K L AY M AH T
+microclimates M AY K R OW K L AY M AH T S
+microcode M AY K R OW K OW D
+microcodes M AY K R OW K OW D Z
+microcom M AY K R OW K AA M
+microcomputer M AY K R OW K AH M P Y UW T ER
+microcomputers M AY K R OW K AH M P Y UW T ER Z
+microcosm M AY K R AH K AA Z AH M
+microdyne M AY K R OW D AY N
+microeconomic M AY K R OW EH K AH N AA M IH K
+microeconomics M AY K R OW EH K AH N AA M IH K S
+microelectronic M AY K R OW IH L EH K T R AA N IH K
+microelectronics M AY K R OW IH L EH K T R AA N IH K S
+microelettronica M AY K R OW IH L EH T R AA N IH K AH
+microfiche M AY K R OW F IY CH
+microfilm M AY K R AH F IH L M
+microfossil M AY K R OW F AA S AH L
+microfossils M AY K R OW F AA S AH L Z
+microgenesys M AY K R OW JH EH N AH S IH S
+micrografx M AY K R OW G R AE F EH K S
+microgram M AY K R OW G R AE M
+micrograms M AY K R OW G R AE M Z
+micrographic M AY K R OW G R AE F IH K
+micrographics M AY K R OW G R AE F IH K S
+microliter M AY K R OW L IY T ER
+microliters M AY K R OW L IY T ER Z
+micromanage M AY K R OW M AE N IH JH
+micromanaged M AY K R OW M AE N IH JH D
+micromanagement M AY K R OW M AE N IH JH M AH N T
+micromanages M AY K R OW M AE N IH JH AH Z
+micromanaging M AY K R OW M AE N IH JH IH NG
+micrometer M AY K R AA M AH T ER
+micrometers M AY K R AA M AH T ER Z
+micron M AY K R AA N
+micron's M AY K R AA N Z
+micronesia M AY K R OW N IY ZH AH
+micronic M AY K R AO N IH K
+micronics M AY K R AO N IH K S
+microns M AY K R AA N Z
+microorganism M AY K R OW AO R G AH N IH Z AH M
+microorganisms M AY K R OW AO R G AH N IH Z AH M Z
+micropaleontology M AY K R OW P EY L IY AH N T AA L AH JH IY
+microphone M AY K R AH F OW N
+microphones M AY K R OW F OW N Z
+micropolis M AY K R AO P AH L IH S
+micropro M AY K R OW P R OW
+microprocessor M AY K R OW P R AA S EH S ER
+microprocessors M AY K R OW P R AA S EH S ER Z
+microprose M AY K R OW P R OW Z
+micros M AY K R OW Z
+microscope M AY K R AH S K OW P
+microscopes M AY K R AH S K OW P S
+microscopic M AY K R AH S K AA P IH K
+microscopically M AY K R AH S K AA P IH K L IY
+microscopy M AY K R AH S K AH P IY
+microsemi M AY K R OW S EH M IY
+microsoft M AY K R OW S AO F T
+microsoft's M AY K R OW S AO F T S
+microsoft's(2) M AY K R OW S AO F S
+microsystems M AY K R OW S IH S T AH M Z
+microsystems' M AY K R OW S IH S T AH M Z
+microtel M AY K R OW T EH L
+microtubule M AY K R OW T UW B Y UW L
+microtubules M AY K R OW T UW B Y UW L Z
+microvax M AY K R OW V AE K S
+microware M AY K R OW W EH R
+microwavable M AY K R OW W EY V AH B AH L
+microwave M AY K R AH W EY V
+microwaved M AY K R OW W EY V D
+microwaves M AY K R OW W EY V Z
+microwaving M AY K R AH W EY V IH NG
+microx M IH K R AH K S
+micucci M IY K UW CH IY
+mid M IH D
+midafternoon M IH D AE F T ER N UW N
+midair M IH D EH R
+midamerica M IH D AH M EH R IH K AH
+midas M AY D AH S
+midcap M IH D K AE P
+midcentury M IH D S EH N CH ER IY
+midcon M IH D K AA N
+midcontinent M IH D K AA N T IH N AH N T
+midcourse M IH D K AO R S
+middaugh M IH D AO
+midday M IH D D EY
+middendorf M IH D AH N D AO R F
+middenstandsbank M IH D EH N S T AE N D Z B AE NG K
+middle M IH D AH L
+middle-class M IH D AH L K L AE S
+middlebrook M IH D AH L B R UH K
+middlebrooks M IH D AH L B R UH K S
+middleburg M IH D AH L B ER G
+middlebury M IH D AH L B EH R IY
+middlekauff M IH D AH L K OW F
+middleman M IH D AH L M AE N
+middlemen M IH D AH L M EH N
+middlemiss M IH D AH L M IH S
+middlesex M IH D AH L S EH K S
+middlesworth M IH D AH L Z W ER TH
+middleton M IH D AH L T AH N
+middletown M IH D AH L T AW N
+middleweight M IH D AH L W EY T
+middling M IH D AH L IH NG
+middling(2) M IH D L IH NG
+mideast M IH D IY S T
+mideastern M IH D IY S T ER N
+midflight M IH D F L AY T
+midge M IH JH
+midge's M IH JH IH Z
+midges M IH JH AH Z
+midges(2) M IH JH IH Z
+midget M IH JH AH T
+midgetman M IH JH AH T M AE N
+midgets M IH JH AH T S
+midgett M IH JH IH T
+midgett's M IH JH AH T S
+midgette M IH JH EH T
+midgley M IH JH L IY
+midi M IY D IY
+midi's M IY D IY Z
+midkiff M IH D K IH F
+midland M IH D L AE N D
+midland's M IH D L AE N D Z
+midlands M IH D L AE N D Z
+midlantic M IH D L AE N T IH K
+midlantic(2) M IH D L AE N IH K
+midler M IH D L ER
+midlevel M IH D L AH V AH L
+midlife M IH D L AY F
+midline M IH D L AY N
+midmorning M IH D M AO R N IH NG
+midnight M IH D N AY T
+midpac M IH D P AE K
+midpac's M IH D P AE K S
+midpoint M IH D P OY N T
+midprice M IH D P R AY S
+midpriced M IH D P R AY S T
+midrange M IH D R EY N JH
+midrib M IH D R IH B
+midseason M IH D S IY Z AH N
+midsection M IH D S EH K SH AH N
+midsession M IH D S EH SH AH N
+midshipman M IH D SH IH P M AH N
+midshipman's M IH D SH IH P M AH N Z
+midshipmen M IH D SH IH P M EH N
+midshipmen's M IH D SH IH P M EH N Z
+midsize M IH D S AY Z
+midsized M IH D S AY Z D
+midst M IH D S T
+midst(2) M IH S T
+midstream M IH D S T R IY M
+midsummer M IH D S AH M ER
+midterm M IH D T ER M
+midterms M IH D T ER M Z
+midthun M IH D TH AH N
+midtown M IH D T AW N
+midura M IY D UH R AH
+midway M IH D W EY
+midway's M IH D W EY Z
+midweek M IH D W IY K
+midwest M IH D W EH S T
+midwest's M IH D W EH S T S
+midwestern M IH D W EH S T ER N
+midwesterner M IH D W EH S T ER N ER
+midwesterners M IH D W EH S T ER N ER Z
+midwife M IH D W AY F
+midwifery M IH D W AY F ER IY
+midwinter M IH D W IH N T ER
+midwinter's M IH D W IH N T ER Z
+midwives M IH D W AY V Z
+midyear M IH D Y IH R
+midyett M IH D Y EH T
+midyette M IH D Y EH T
+miears M IY IH R Z
+mieczkowski M IY CH K AO F S K IY
+mieczyslaw M IY CH IH S L AO
+miedema M IY D EH M AH
+mielcarek M IY L K AA R EH K
+miele M IY L
+mielke M IY L K IY
+mien M IY N
+mieno M IY N OW
+mier M AY ER
+miera M IY R AH
+mieras M IH R AA Z
+miers M AY ER Z
+miert M AY ER T
+mierzejewski M IH R Z EY EH F S K IY
+mierzwa M IY R Z W AH
+mies M AY Z
+mieske M AY S K IY
+miesner M IY Z N ER
+miesse M IY S
+miffed M IH F T
+mifflin M IH F L IH N
+mifsud M IH F S AH D
+mig M IH G
+migdal M IH G D AH L
+migent M IH JH AH N T
+miggins M IH G IH N Z
+might M AY T
+might've M AY T AH V
+might-have-been M AY T AH V B IH N
+might-have-beens M AY T AH V B IH N Z
+mightier M AY T IY ER
+mightiest M AY T IY AH S T
+mightily M AY T AH L IY
+mightn't M AY T AH N T
+mighty M AY T IY
+migliaccio M IY G L IY AA CH IY OW
+miglin M IH G L IH N
+miglin's M IH G L IH N Z
+migliore M IY G L IY AO R IY
+mignanelli M IH G N AH N EH L IY
+mignano M IY G N AA N OW
+migneault M IH G N OW
+mignogna M IY G N OW G N AH
+mignon M IH G N AH N
+mignone M IY G N OW N IY
+mignons M IH G N AH N Z
+migra M IH G R AH
+migraine M AY G R EY N
+migraines M AY G R EY N Z
+migrant M AY G R AH N T
+migrants M AY G R AH N T S
+migrate M AY G R EY T
+migrated M AY G R EY T IH D
+migrates M AY G R EY T S
+migrating M AY G R EY T IH NG
+migration M AY G R EY SH AH N
+migrations M AY G R EY SH AH N Z
+migratory M AY G R AH T AO R IY
+migs M IH G Z
+miguel M IH G EH L
+migues M IY G EH S
+miguez M IY G EH Z
+mihai M IY HH AY
+mihai's M IY HH AY Z
+mihal M AY HH AH L
+mihalek M IH HH AH L EH K
+mihalic M IH HH AE L IH K
+mihalik M IH HH AH L IH K
+mihalko M IH HH AE L K OW
+mihaly M IH HH AH L IY
+mihelich M IH HH IH L IH K
+mihm M IH M
+mihn M IH N
+mihn's M IH N Z
+mihok M IH HH AH K
+mijares M IY Y AA R EH S
+mika M IY K AH
+mikado M IH K AA D OW
+mikael M AH K EY L
+mikaela M IY K EY L AH
+mikako M IY K AA K OW
+mikal M IY K AH L
+mike M AY K
+mike's M AY K S
+mikel M IH K AH L
+mikell M IH K AH L
+mikels M IH K AH L Z
+mikelson M IH K IH L S AH N
+mikes M AY K S
+mikesell M IH K IH S AH L
+mikesh M IH K IH SH
+mikeska M IH K EH S K AH
+mikey M AY K IY
+mikhail M IH K EY L
+mikhail(2) M IH K AY L
+mikidu M IH K IY D UW
+mikita M IH K IY T AH
+mikkelsen M IH K EH L S AH N
+mikkelson M IH K IH L S AH N
+mikkola M IH K OW L AH
+miklas M AY K L AH Z
+mikles M AY K AH L Z
+miklos M IY K L OW S
+miko M AY K OW
+mikol M IH K AO L
+mikolajczak M IH K AA L AY CH AE K
+mikolajczyk M IH K AA L AY CH IH K
+mikos M AY K OW Z
+mikrut M IH K R AH T
+miksch M IH K SH
+mikula M IH K UW L AH
+mikulak M IH K UW L AH K
+mikulec M IH K UW L IH K
+mikulic M IH K UW L IH K
+mikulich M IH K Y UW L IH HH
+mikulski M IH K AH L S K IY
+mikus M AY K AH S
+mikva M IH K V AH
+mil M IH L
+milacron M IH L AH K R AA N
+milacron's M IH L AH K R AA N Z
+miladic M IH L AA D IH K
+milagro M IH L AE G R OW
+milam M IH L AH M
+milan M AH L AA N
+milan's M IH L AA N Z
+milan(2) M IH L AA N
+milan(3) M AY L AE N
+milani M IY L AA N IY
+milano M IY L AA N OW
+milanowski M IH L AH N AO F S K IY
+milardo M IY L AA R D OW
+milas M AY L AH Z
+milazzo M IY L AA Z OW
+milbank M IH L B AE NG K
+milbauer M IH L B AW ER
+milberg M IH L B ER G
+milberger M IH L B ER G ER
+milbourn M IH L B UH R N
+milbourne M IH L B UH R N
+milbrandt M IH L B R AH N T
+milbrath M IH L B R AH TH
+milburn M IH L B ER N
+milby M IH L B IY
+milch M IH L CH
+milco M IH L K OW
+mild M AY L D
+mildenberger M AY L D AH N B ER G ER
+milder M AY L D ER
+mildest M AY L D AH S T
+mildew M IH L D UW
+mildews M IH L D UW Z
+mildly M AY L D L IY
+mildred M IH L D R IH D
+mildrid M IH L D ER IH D
+mile M AY L
+mileage M AY L AH JH
+mileage(2) M AY L IH JH
+mileham M IH L IH HH AE M
+milem M IH L AH M
+miler M AY L ER
+miles M AY L Z
+miles(2) M AY AH L Z
+mileski M IH L EH S K IY
+milestone M AY L S T OW N
+milestones M AY L S T OW N Z
+miletich M IH L IH T IH K
+milewski M IH L EH F S K IY
+miley M AY L IY
+milford M IH L F ER D
+milgram M IH L G R AE M
+milham M IH L HH AH M
+milhoan M IH L HH OW N
+milholland M IH L HH AH L AH N D
+milhollin M IH L HH AA L IH N
+milhorn M IH L HH ER N
+milhous M IH L HH AW S
+milhouse M IH L HH AW S
+milian M IH L IY AH N
+milicent M IH L IH S IH N T
+milich M IH L IH K
+milici M IY L IY CH IY
+milieu M IH L Y UH
+mililiter M IH L IH L IY T ER
+milissent M IH L IH S AH N T
+militancy M IH L AH T AH N S IY
+militant M IH L AH T AH N T
+militantly M IH L IH T AH N T L IY
+militants M IH L AH T AH N T S
+militaries M IH L AH T EH R IY Z
+militarily M IH L AH T EH R AH L IY
+militarism M IH L AH T ER IH Z AH M
+militaristic M IH L IH T ER IH S T IH K
+militarists M IH L AH T ER IH S T S
+militarists(2) M IH L AH T ER IH S S
+militarists(3) M IH L AH T ER IH S
+militarize M IH L AH T ER AY Z
+militarized M IH L AH T ER AY Z D
+military M IH L AH T EH R IY
+military's M IH L IH T EH R IY Z
+military(2) M IH L IH T EH R IY
+militate M IH L IH T EY T
+militello M IY L IY T EH L OW
+militia M AH L IH SH AH
+militia's M AH L IH SH AH Z
+militia's(2) M IH L IH SH AH Z
+militia(2) M IH L IH SH AH
+militiamen M AH L IH SH AH M IH N
+militias M AH L IH SH AH Z
+militias(2) M IH L IH SH AH Z
+milito M IY L IY T OW
+milius M AY L IY IH S
+milk M IH L K
+milke M IH L K
+milked M IH L K T
+milken M IH L K AH N
+milken's M IH L K AH N Z
+milkens M IH L K AH N Z
+milkens' M IH L K AH N Z
+milking M IH L K IH NG
+milkman M IH L K M AE N
+milko M IH L K OW
+milkovich M IH L K AH V IH CH
+milkowski M IH L K AO F S K IY
+milks M IH L K S
+milkshake M IH L K SH EY K
+milkweed M IH L K W IY D
+milky M IH L K IY
+mill M IH L
+mill's M IH L Z
+millage M IH L IH JH
+millan M IH L AH N
+millar M IH L ER
+millard M IH L ER D
+millard's M IH L ER D Z
+millau M IH L AW
+millay M IH L EY
+millbank M IH L B AE NG K
+millburn M IH L B ER N
+mille M IH L
+milled M IH L D
+milledge M IH L IH JH
+millen M IH L AH N
+millender M IH L EH N D ER
+millennia M AH L EH N IY AH
+millennial M IH L EH N IY AH L
+millennium M AH L EH N IY AH M
+millenniums M AH L EH N IY AH M Z
+miller M IH L ER
+miller's M IH L ER Z
+millerbrook M IH L ER B R UH K
+millerick M IH L ER IH K
+millers M IH L ER Z
+milleson M IH L IH S AH N
+millet M IH L AH T
+millets M IH L AH T S
+millett M IH L IH T
+millette M IH L EH T
+milley M IH L IY
+millhouse M IH L HH AW S
+milli M IH L IY
+millibar M IH L AH B AA R
+millican M IH L IH K AH N
+millicent M IH L IH S IH N T
+millicom M IH L IH K AA M
+millicom's M IH L IH K AA M Z
+millie M IH L IY
+milliet M IH L IY EH T
+milligal M IH L IH G AH L
+milligan M IH L IH G AH N
+milligauss M IH L IY G AW S
+milligram M IH L AH G R AE M
+milligrams M IH L AH G R AE M Z
+millikan M IH L AH K AH N
+milliken M IH L IH K AH N
+millikin M IH L IH K IH N
+milliliter M IH L AH L IY T ER
+milliliters M IH L AH L IY T ER Z
+milliman M IH L IH M AH N
+millimeter M IH L AH M IY T ER
+millimeters M IH L AH M IY T ER Z
+millin M IH L AH N
+milliner M IH L IH N ER
+milling M IH L IH NG
+millington M IH L IH NG T AH N
+million M IH L Y AH N
+millionaire M IH L Y AH N EH R
+millionaire's M IH L Y AH N EH R Z
+millionaires M IH L Y AH N EH R Z
+millions M IH L Y AH N Z
+millionth M IH L Y AH N TH
+millionths M IH L Y AH N T TH S
+millipore M IH L IH P AO R
+milliron M IH L ER AH N
+millirons M IH L ER OW N Z
+millis M IH L IH S
+millisecond M IH L IH S EH K AH N D
+milliseconds M IH L IH S EH K AH N D Z
+millisent M IH L AH S AH N T
+millman M IH L M AH N
+milln M IH L N
+millner M IH L N ER
+millon M IH L AH N
+milloy M IH L OY
+mills M IH L Z
+mills' M IH L Z
+mills's M IH L Z IH Z
+millsap M IH L S AE P
+millsaps M IH L S AE P S
+millspaugh M IH L S P AO
+millstein M IH L S T AY N
+millstein(2) M IH L S T IY N
+millstone M IH L S T OW N
+millward M IH L W ER D
+millwood M IH L W UH D
+millworker M IH L W AO R K ER
+millworkers M IH L W AO R K ER Z
+millworking M IH L W AO R K IH NG
+milly M IH L IY
+milman M IH L M AH N
+milne M IH L N
+milner M IH L N ER
+milnes M IH L N Z
+milo M AY L OW
+milodic M IH L OW D IH K
+milonas M IY L OW N AA Z
+milone M IH L OW N
+milos M IY L OW Z
+milosevic M IH L OW S AH V IH K
+milosevic's M IH L OW S AH V IH CH IH Z
+milosevic(2) M IH L OW S AH V IH CH
+milosevich M IH L AA S IH V IH CH
+milosh M IH L AO SH
+milot M IH L AH T
+milpitas M IH L P IY T AH S
+milroy M IH L R OY
+mils M IH L Z
+milsap M IH L S AE P
+milson M IH L S AH N
+milstead M IH L S T EH D
+milstein M IH L S T AY N
+milstein(2) M IH L S T IY N
+milt M IH L T
+miltenberger M IH L T AH N B ER G ER
+miltie M IH T IY
+miltner M IH L T N ER
+milton M IH L T AH N
+miltonic M IH L T AA N IH K
+milum M IH L AH M
+milunovich M IH L UW N AH V IH CH
+milward M IH L W ER D
+milwaukee M IH L W AO K IY
+milwaukee's M IH L W AO K IY Z
+milz M IH L Z
+mim M IH M
+mimbs M IH M Z
+mime M AY M
+mimeograph M IH M IY AH G R AE F
+mimi M IY M IY
+mimi's M IY M IY Z
+mimic M IH M IH K
+mimicked M IH M IH K T
+mimicking M IH M IH K IH NG
+mimicry M IH M IH K R IY
+mimics M IH M IH K S
+mimis M IY M IY Z
+mimms M IH M Z
+mimnaugh M IH M N AW
+mimosa M IH M OW S AH
+mims M IH M Z
+min M IH N
+mina M IY N AH
+mina(2) M IH N AH
+minahan M IH N AH HH AE N
+minami M IY N AA M IY
+minamide M IH N AH M IY D EY
+minar M AY N ER
+minard M IH N AA R D
+minardos M IH N AA R D OW S
+minaret M IH N ER EH T
+minarets M IH N ER EH T S
+minarik M IH N ER IH K
+minas M IY N AH S
+minasian M IH N AE ZH IH N
+minasian(2) M IH N EY ZH IH N
+minassian M IH N AE S ZH IH N
+minatome M IH N AH T OW M
+minc M IH NG K
+mince M IH N S
+minced M IH N S T
+mincemeat M IH N S M IY T
+mincer M IH N S ER
+mincers M IH N S ER Z
+minces M IH N S IH Z
+mincey M IH N S IY
+minch M IH N CH
+mincher M IH N CH ER
+minchew M IH N CH Y UW
+minchey M IH N CH IY
+minchin M IH N CH IH N
+mincing M IH N S IH NG
+minckler M IH NG K L ER
+mincks M IH NG K S
+mincy M IH N S IY
+mind M AY N D
+mind's M AY N D Z
+minda M IH N D AH
+mindanao M IH N D AH N AW
+mindanao(2) M IH N D AH N EY OW
+mindboggling M AY N D B AO G L IH NG
+minded M AY N D AH D
+minded(2) M AY N D IH D
+mindedly M AY N D IH D L IY
+mindedness M AY N D IH D N AH S
+mindel M IH N D AH L
+mindell M IH N D EH L
+minden M AY N D AH N
+minder M AY N D ER
+mindful M AY N D F AH L
+mindfully M AY N D F AH L IY
+minding M AY N D IH NG
+mindless M AY N D L AH S
+mindlessly M AY N D L AH S L IY
+mindlin M IH N D L IH N
+minds M AY N D Z
+mindset M AY N D S EH T
+mindsets M AY N D S EH T S
+mindy M IH N D IY
+mine M AY N
+mine's M AY N Z
+minea M IH N IY AH
+minear M IH N IH R
+mineau M IH N OW
+minebea M IH N AH B IY AH
+mined M AY N D
+mineer M AY N ER
+minefield M AY N F IY L D
+minefields M AY N F IY L D Z
+minehan M IH N IH HH AE N
+minehart M AY N HH AA R T
+minella M IH N EH L AH
+minelli M IH N EH L IY
+mineo M IH N IY OW
+mineola M IH N IY OW L AH
+mineowner M AY N OW N ER
+mineowners M AY N OW N ER Z
+miner M AY N ER
+miner's M AY N ER Z
+minera M IH N EH R AH
+mineral M IH N ER AH L
+mineral's M IH N ER AH L Z
+mineral's(2) M IH N R AH L Z
+mineral(2) M IH N R AH L
+mineralization M IH N ER AH L AH Z EY SH AH N
+mineralize M IH N ER AH L AY Z
+mineralogically M IH N ER AH L AA JH IH K AH L IY
+mineralogically(2) M IH N ER AH L AA JH IH K L IY
+mineralogist M IH N ER AE L AH JH IH S T
+mineralogist(2) M IH N ER AA L AH JH IH S T
+mineralogy M IH N ER AA L AH JH IY
+minerals M IH N ER AH L Z
+minerals' M IH N ER AH L Z
+minerals'(2) M IH N R AH L Z
+minerals(2) M IH N R AH L Z
+minerd M IH N ER D
+minero M IH N EH R OW
+miners M AY N ER Z
+miners' M AY N ER Z
+minerva M AH N ER V AH
+minerva(2) M IH N ER V AH
+minervini M IY N ER V IY N IY
+mines M AY N Z
+mines' M AY N Z
+minesweeper M AY N S W IY P ER
+minesweepers M AY N S W IY P ER Z
+minet M IH N IH T
+minet(2) M AY N AH T
+mineta M IH N EY T AH
+minette M IH N EH T
+mineworker M AY N W ER K ER
+mineworkers M AY N W ER K ER Z
+ming M IH NG
+ming-jen M IH NG JH EH N
+minge M IH N JH
+minger M IH NG ER
+minges M IH N JH IH Z
+mingle M IH NG G AH L
+mingled M IH NG G AH L D
+mingles M IH NG G AH L Z
+mingling M IH NG G AH L IH NG
+mingling(2) M IH NG G L IH NG
+mingo M IY NG G OW
+mings M IH NG Z
+mingun M IH N G AH N
+mingus M IH NG G IH S
+minh M IH N
+mini M IH N IY
+mini-cost M IH N IY K AO S T
+miniard M IH N Y ER D
+miniature M IH N IY AH CH UH R
+miniature(2) M IH N IH CH UH R
+miniatures M IH N IY AH CH ER Z
+miniatures(2) M IH N IH CH ER Z
+miniaturization M IH N IY AH CH ER IH Z EY SH AH N
+miniaturize M IH N IH CH ER AY Z
+miniaturized M IH N IH CH ER AY Z D
+minibus M IH N IY B AH S
+minibuses M IH N IY B AH S IH Z
+minicar M IH N IY K AA R
+minicars M IH N IY K AA R Z
+minich M IH N IH CH
+minichiello M IY N IY K IY EH L OW
+minick M IH N IH K
+minicomputer M IH N IY K AH M P Y UW T ER
+minicomputers M IH N IY K AH M P Y UW T ER Z
+minicucci M IY N IY K UW CH IY
+minidisc M IH N IY D IH S K
+minier M IH N IY ER
+minihan M IH N IH HH AE N
+minilab M IH N IY L AE B
+minilabs M IH N IY L AE B Z
+minimal M IH N AH M AH L
+minimalism M IH N AH M AH L IH Z AH M
+minimalist M IH N AH M AH L IH S T
+minimally M IH N AH M AH L IY
+minimill M IH N IY M AA L
+minimills M IH N IY M IH L Z
+minimize M IH N AH M AY Z
+minimized M IH N AH M AY Z D
+minimizes M IH N AH M AY Z AH Z
+minimizing M IH N AH M AY Z IH NG
+minimum M IH N AH M AH M
+minimums M IH N IH M AH M Z
+mining M AY N IH NG
+mining's M AY N IH NG Z
+mininger M AY N IH NG ER
+minion M IH N Y AH N
+minions M IH N Y AH N Z
+minis M IH N IY Z
+miniscribe M IH N IY S K R AY B
+miniscule M IH N IH S K Y UW L
+miniseries M IH N IH S EH R IY Z
+miniseries(2) M IH N IY S EH R IY Z
+minish M IH N IH SH
+miniskirt M IH N IY S K ER T
+miniskirts M IH N IY S K ER T S
+minister M IH N AH S T ER
+minister's M IH N IH S T ER Z
+minister(2) M IH N IH S T ER
+ministerial M IH N IH S T IY R IY AH L
+ministering M IH N IH S T R IH NG
+ministers M IH N AH S T ER Z
+ministers' M IH N IH S T ER Z
+ministers(2) M IH N IH S T ER Z
+ministership M IH N IH S T ER SH IH P
+ministral M IH N AH S T R AH L
+ministration M IH N AH S T R EY SH AH N
+ministrations M IH N AH S T R EY SH AH N Z
+ministries M IH N IH S T R IY Z
+ministry M IH N AH S T R IY
+ministry's M IH N AH S T R IY Z
+ministry(2) M IH N IH S T R IY
+minisupercomputer M IH N IY S UW P ER K AH M P Y UW T ER
+minisupercomputers M IH N IY S UW P ER K AH M P Y UW T ER Z
+minit M IH N IH T
+minitel M IH N AH T EH L
+minium M IH N IY AH M
+minivan M IH N IY V AE N
+minivans M IH N IY V AE N Z
+minix M IH N IH K S
+minjares M IY N Y AA R EH S
+minjarez M IY N Y AA R EH Z
+mink M IH NG K
+minke M IH NG K
+minkel M IH NG K AH L
+minkin M IH NG K IH N
+minkler M IH NG K L ER
+minkoff M IH NG K AO F
+minkow M IH NG K AW
+minks M IH NG K S
+minna M IH N AH
+minnaar M IH N AA R
+minneapolis M IH N IY AE P AH L IH S
+minneapolis's M IH N IY AE P AH L IH S IH Z
+minnelli M IH N EH L IY
+minner M IH N ER
+minnesota M IH N IH S OW T AH
+minnesota's M IH N AH S OW T AH Z
+minnesotan M IH N AH S OW T AH N
+minnesotans M IH N AH S OW T AH N Z
+minnetonka M IH N IH T AO NG K AH
+minney M IH N IY
+minnich M IH N IH CH
+minnick M IH N IH K
+minnie M IH N IY
+minnie's M IH N IY Z
+minniear M IH N IY IH R
+minnifield M IH N AH F IY L D
+minnig M IH N IH G
+minnis M IH N IH S
+minniti M IY N IY T IY
+minnix M IH N IH K S
+minnow M IH N OW
+minnows M IH N OW Z
+minns M IH N Z
+minntech M IH N T EH K
+minny M IH N IY
+mino M IY N OW
+minoan M AH N OW AH N
+minogue M IY N AO G
+minogue(2) M AH N OW G IY
+minoli M IH N OW L IY
+minolta M IH N AA L T AH
+minolta(2) M IH N OW L T AH
+minor M AY N ER
+minorca M AH N AO R K AH
+minorco M IH N AO R K OW
+minorco's M IH N AO R K AH Z
+minored M AY N ER D
+minoring M AY N ER IH NG
+minorite M IH N ER AY T
+minorities M AY N AO R AH T IY Z
+minorities(2) M AH N AO R AH T IY Z
+minority M AY N AO R AH T IY
+minority(2) M AH N AO R AH T IY
+minors M AY N ER Z
+minoru M IH N AO R UW
+minoso M AH N OW S OW
+minosos M AH N OW S OW Z
+minot M IH N AH T
+minot(2) M IH N AA T
+minott M IH N AH T
+minotti M IH N AO T IY
+minow M IH N OW
+minoxidil M IH N AA K S IH D IH L
+minpeco M IH N P EH K OW
+minshall M IH N SH AH L
+minshew M IH N SH UW
+minsk M IH N S K
+minskoff M IH N S K AO F
+minsky M IH N S K IY
+minson M IH N S AH N
+minstar M IH N S T AA R
+minstar's M IH N S T AA R Z
+minster M IH N S T ER
+minstrel M IH N S T R AH L
+minstrels M IH N S T R AH L Z
+mint M IH N T
+mint's M IH N T S
+minta M IH N T AH
+mintage M IH N T AH JH
+mintage(2) M IH N T IH JH
+minted M IH N T IH D
+minteer M IH N T IH R
+minter M IH N T ER
+mintha M IH N TH AH
+mintier M IH N T IY ER
+minting M IH N T IH NG
+minto M IH N T OW
+minton M IH N T AH N
+mints M IH N T S
+minturn M IH N T ER N
+mintz M IH N T S
+mintzer M IH N T Z ER
+minuet M IH N Y AH W EH T
+minus M AY N AH S
+minuscule M IH N AH S K Y UW L
+minuses M AY N AH S IH Z
+minute M IH N AH T
+minute's M IH N AH T S
+minute(2) M AY N UW T
+minute(3) M AY N Y UW T
+minutely M IH N AH T L IY
+minuteman M IH N AH T M AE N
+minutemen M IH N AH T M EH N
+minutes M IH N AH T S
+minutes' M IH N AH T S
+minutia M IH N UW SH IY AH
+minutiae M IH N UW SH IY AH
+minyard M IH N Y AA R D
+miocene M AY AH S IY N
+mion M AY AH N
+mione M AY OW N
+miot M AY AH T
+miotke M AY AA T K IY
+miotke(2) M Y AA T K IY
+mips M IH P S
+mir M IH R
+mir's M IH R Z
+mira M IH R AH
+mirabal M IH R AH B AH L
+mirabel M IH R AA B EH L
+mirabella M IH R AA B EH L AH
+mirabelle M AO R AH B AH L
+mirabelli M IH R AA B EH L IY
+mirabile M IH R AA B AH L
+mirabito M IH R AA B IY T OW
+miracid M IH R AE S AH D
+miracid's M IH R AE S AH D Z
+miracle M IH R AH K AH L
+miracles M IH R AH K AH L Z
+miraculous M ER AE K Y AH L AH S
+miraculously M ER AE K Y AH L AH S L IY
+mirad M AH R AE D
+mirada M IH R AA D AH
+mirage M ER AA ZH
+mirages M ER AA ZH AH Z
+miraglia M IH R AE G L IY AH
+mirak M IH R AE K
+miramar M IH R AH M AA R
+miramax M IH R AH M AE K S
+miramax's M IH R AH M AE K S IH Z
+miramontes M IH R AA M OW N T EH S
+miranda M ER AE N D AH
+miranda's M ER AE N D AH Z
+mirando M IH R AE N D OW
+miratec M IH R AH T EH K
+mire M AY R
+mire(2) M AY ER
+mired M AY R D
+mireles M IH R EY L EH S
+mirelez M IH R EY L EH Z
+mirell M IH R EH L
+mirella M IH R EH L AH
+mirelle M ER EH L
+mirenda M IH R EH N D AH
+mires M AY R Z
+miriam M IH R IY AH M
+mirick M IH R IH K
+mirilla M IH R IH L AH
+mirkin M ER K IH N
+mirna M ER N AH
+miro M IH R OW
+miro's M IH R OW Z
+miron M IH R AO N
+mironenko M IH R OW N EH NG K OW
+miroslav M IH R AH S L AA V
+mirra M IH R AH
+mirren M IH R AH N
+mirror M IH R ER
+mirror's M IH R ER Z
+mirrored M IH R ER D
+mirroring M IH R ER IH NG
+mirrors M IH R ER Z
+mirsad M IH R S AE D
+mirsky M ER S K IY
+mirth M ER TH
+mirti M ER T IY
+mirtle M ER T AH L
+mirto M IH R T OW
+mirtz M ER T S
+mirv M ER V
+mirza M ER Z AH
+mis M IH S
+misa M IY Z AH
+misa's M IY Z AH Z
+misadventure M IH S AH D V EH N CH ER
+misadventures M IH S AH D V EH N CH ER Z
+misallocate M IH S AE L AH K EY T
+misallocated M IH S AE L AH K EY T IH D
+misallocates M IH S AE L AH K EY T S
+misallocating M IH S AE L AH K EY T IH NG
+misallocation M IH S AE L AH K EY SH AH N
+misanthrope M IH S AH N TH R OW P
+misapplication M IH S AE P L AH K EY SH AH N
+misapplied M IH S AH P L AY D
+misapplies M IH S AH P L AY Z
+misapply M IH S AH P L AY
+misapplying M IH S AH P L AY IH NG
+misapprehension M IH S AE P R IY HH EH N SH AH N
+misappropriate M IH S AH P R OW P R IY EY T
+misappropriated M IH S AH P R OW P R IY EY T IH D
+misappropriates M IH S AH P R OW P R IY EY T S
+misappropriating M IH S AH P R OW P R IY EY T IH NG
+misappropriation M IH S AH P R OW P R IY EY SH AH N
+misater M IH S EY T ER
+misawa M IH S AA W AH
+misbegotten M IH S B AH G AA T AH N
+misbehave M IH S B AH HH EY V
+misbehave(2) M IH S B IY HH EY V
+misbehaved M IH S B AH HH EY V D
+misbehaved(2) M IH S B IY HH EY V D
+misbehaves M IH S B AH HH EY V Z
+misbehaves(2) M IH S B IY HH EY V Z
+misbehaving M IH S B AH HH EY V IH NG
+misbehaving(2) M IH S B IY HH EY V IH NG
+misbehavior M IH S B AH HH EY V Y ER
+misbehavior(2) M IH S B IY HH EY V Y ER
+misbrener M IH S B R EH N ER
+miscalculate M IH S K AE L K Y AH L EY T
+miscalculated M IH S K AE L K Y AH L EY T IH D
+miscalculates M IH S K AE L K Y AH L EY T S
+miscalculation M IH S K AE L K Y AH L EY SH AH N
+miscalculations M IH S K AE L K Y AH L EY SH AH N Z
+miscarriage M IH S K EH R AH JH
+miscarriages M IH S K EH R IH JH IH Z
+miscast M IH S K AE S T
+miscavige M IH S K AE V IH JH
+miscayuna M IH S K AY Y UW N AH
+miscayuna's M IH S K AY Y UW N AH Z
+miscellaneous M IH S AH L EY N IY AH S
+miscellany M IH S AH L EY N IY
+misch M IH SH
+mischa M IH SH AH
+mischaracterization M IH S K AE R AH K T ER AH Z EY SH AH N
+mischaracterizations M IH S K AE R AH K T ER AH Z EY SH AH N Z
+mischaracterize M IH S K AE R AH K T ER AY Z
+mischaracterized M IH S K AE R AH K T ER AY Z D
+mischaracterizes M IH S K AE R AH K T ER AY Z IH Z
+mischaracterizing M IH S K AE R AH K T ER AY Z IH NG
+mischarge M IH S CH AA R JH
+mischarged M IH S CH AA R JH D
+mischarges M IH S CH AA R JH IH Z
+mischarging M IH S CH AA R JH IH NG
+mischel M IH SH AH L
+mischer M IH SH ER
+mischief M IH S CH AH F
+mischievous M IH S CH AH V AH S
+mischke M IH SH K
+mischler M IH SH AH L ER
+mischler(2) M IH SH L ER
+miscibility M IH S IH B IH L IH T IY
+miscible M IH S AH B AH L
+miscible(2) M IH S IH B AH L
+miscommunicate M IH S K AH M Y UW N AH K EY T
+miscommunication M IH S K AH M Y UW N AH K EY SH AH N
+misconceive M IH S K AH N S IY V
+misconceived M IH S K AH N S IY V D
+misconceives M IH S K AH N S IY V Z
+misconceiving M IH S K AH N S IY V IH NG
+misconception M IH S K AH N S EH P SH AH N
+misconceptions M IH S K AH N S EH P SH AH N Z
+misconduct M IH S K AA N D AH K T
+misconstrue M IH S K AH N S T R UW
+misconstrued M IH S K AH N S T R UW D
+misconstrues M IH S K AH N S T R UW Z
+misconstruing M IH S K AH N S T R UW IH NG
+miscount M IH S K AW N T
+miscreant M IH S K R IY AH N T
+miscreants M IH S K R IY AH N T S
+miscreation M IH S K R IY EY SH AH N
+miscreations M IH S K R IY EY SH AH N Z
+miscue M IH S K Y UW
+miscues M IH S K Y UW Z
+misdeed M IH S D IY D
+misdeeds M IH S D IY D Z
+misdemeanor M IH S D AH M IY N ER
+misdemeanors M IH S D AH M IY N ER Z
+misdiagnose M IH S D AY IH G N OW Z
+misdiagnosed M IH S D AY IH G N OW Z D
+misdiagnoses M IH S D AY IH G N OW S IY Z
+misdiagnoses(2) M IH S D AY IH G N OW S AH Z
+misdiagnosis M IH S D AY IH G N OW S AH S
+misdirect M IH S D IH R EH K T
+misdirected M IH S D IH R EH K T IH D
+misek M IH S EH K
+misener M IH S IY N ER
+misenheimer M IH S IH N HH AY M ER
+miser M AY Z ER
+miserable M IH Z ER AH B AH L
+miserable(2) M IH Z R AH B AH L
+miserables M IH Z ER AH B AH L Z
+miserables(2) M IH Z R AH B AH L Z
+miserables(3) M IH Z ER AA B
+miserably M IH Z ER AH B L IY
+miserably(2) M IH Z R AH B L IY
+miseration M IH Z ER EY SH AH N
+miseries M IH Z ER IY Z
+miserly M AY Z ER L IY
+misers M AY Z ER Z
+misery M IH Z ER IY
+mises M AY Z IH Z
+misfeldt M IH S F IH L T
+misfire M IH S F AY ER
+misfit M IH S F IH T
+misfits M IH S F IH T S
+misfortune M IH S F AO R CH AH N
+misfortunes M IH S F AO R CH AH N Z
+misgive M IH S G IH V
+misgiving M IH S G IH V IH NG
+misgivings M IH S G IH V IH NG Z
+misgovernment M IH S G AH V ER N M AH N T
+misguide M IH S G AY D
+misguided M IH S G AY D IH D
+misguides M IH S G AY D Z
+mish M IH SH
+misha M IH SH AH
+mishandle M IH S HH AE N D AH L
+mishandled M IH S HH AE N D AH L D
+mishandles M IH S HH AE N D AH L Z
+mishandling M IH S HH AE N D L IH NG
+mishap M IH S HH AE P
+mishaps M IH S HH AE P S
+mishawaka M IH SH AH W AO K AH
+mishawaum M IH SH AH W AA M
+mishawum M IH SH AH W AH M
+mishear M IH S HH IY R
+misheard M IH S HH ER D
+mishkin M IY SH K IY N
+mishler M IH SH L ER
+mishmash M IH SH M AE SH
+mishoe M IY SH UW
+mishra M IH SH R AH
+misiak M IH S IY AE K
+misiaszek M IH S IY AA SH EH K
+misidentification M IH S AY D EH N T IH F IH K EY SH AH N
+misidentification(2) M IH S AY D EH N IH F IH K EY SH AH N
+misidentified M IH S AY D EH N T IH F AY D
+misidentified(2) M IH S AY D EH N IH F AY D
+misidentifies M IH S AY D EH N T IH F AY Z
+misidentifies(2) M IH S AY D EH N IH F AY Z
+misidentify M IH S AY D EH N T AH F AY
+misidentify(2) M IH S AY D EH N AH F AY
+misidentifying M IH S AY D EH N T AH F AY IH NG
+misidentifying(2) M IH S AY D EH N AH F AY IH NG
+misiewicz M IH S AH V IH CH
+misimpression M IH S IH M P R EH SH AH N
+misinform M IH S IH N F AO R M
+misinformation M IH S IH N F ER M EY SH AH N
+misinformed M IH S IH N F AO R M D
+misinforming M IH S IH N F AO R M IH NG
+misinforms M IH S IH N F AO R M Z
+misinterpret M IH S IH N T ER P R AH T
+misinterpretation M IH S IH N T ER P R AH T EY SH AH N
+misinterpreted M IH S IH N T ER P R AH T IH D
+misinterpreting M IH S IH N T ER P R AH T IH NG
+misinterprets M IH S IH N T ER P R AH T S
+misjudge M IH S JH AH JH
+misjudged M IH S JH AH JH D
+misjudges M IH S JH AH JH IH Z
+misjudging M IH S JH AH JH IH NG
+misjudgment M IH S JH AH JH M AH N T
+misjudgments M IH S JH AH JH M AH N T S
+miska M IH S K AH
+miske M IH S K
+miskell M IH S K AH L
+miskito M IH S K IY T OW
+miskitos M IH S K IY T OW S
+misko M IH S K OW
+mislabel M IH S L EY B AH L
+mislabeled M IH S L EY B AH L D
+mislabeling M IH S L EY B AH L IH NG
+mislabeling(2) M IH S L EY B L IH NG
+mislabels M IH S L EY B AH L Z
+mislaid M IH S L EY D
+mislead M IH S L IY D
+misleading M IH S L IY D IH NG
+misleadingly M IH S L IY D IH NG L IY
+misleads M IH S L IY D Z
+misled M IH S L EH D
+mismanage M IH S M AE N IH JH
+mismanaged M IH S M AE N IH JH D
+mismanagement M IH S M AE N IH JH M AH N T
+mismanages M IH S M AE N IH JH AH Z
+mismanaging M IH S M AE N IH JH IH NG
+mismatch M IH S M AE CH
+mismatched M IH S M AE CH T
+mismatches M IH S M AE CH IH Z
+misner M IH Z N ER
+misnomer M IH S N OW M ER
+misogyne M IH Z AH JH IH N
+misogynist M IH Z AH JH IH N IH S T
+misogynists M IH Z AH JH IH N IH S T S
+misogynists(2) M IH Z AH JH IH N IH S
+misogyny M IH Z AH JH IH N IY
+misperceive M IH S P ER S IY V
+misperceived M IH S P ER S IY V D
+misperceives M IH S P ER S IY V Z
+misperception M IH S P ER S EH P SH AH N
+misperceptions M IH S P ER S EH P SH AH N Z
+misplace M IH S P L EY S
+misplaced M IH S P L EY S T
+misplaces M IH S P L EY S IH Z
+misplacing M IH S P L EY S IH NG
+misprice M IH S P R AY S
+mispriced M IH S P R AY S T
+misprices M IH S P R AY S IH Z
+mispricing M IH S P R AY S IH NG
+misprint M IH S P R IH N T
+misprinted M IH S P R IH N T AH D
+misprints M IH S P R IH N T S
+misprision M IH S P R IH ZH AH N
+mispronounce M IH S P R AH N AW N S
+mispronounced M IH S P R AH N AW N S T
+mispronounces M IH S P R AH N AW N S IH Z
+mispronouncing M IH S P R AH N AW N S IH NG
+misquote M IH S K W OW T
+misquoted M IH S K W OW T IH D
+misquotes M IH S K W OW T S
+misquoting M IH S K W OW T IH NG
+misread M IH S R IY D
+misread(2) M IH S R EH D
+misreading M IH S R IY D IH NG
+misrecognition M IH S R EH K AH G N IH SH AH N
+misrecognize M IH S R EH K AH G N AY Z
+misrecognized M IH S R EH K AH G N AY Z D
+misrecognizes M IH S R EH K AH G N AY Z IH Z
+misrecognizing M IH S R EH K AH G N AY Z IH NG
+misremember M IH S R IY M EH M B ER
+misremembered M IH S R IY M EH M B ER D
+misreport M IH S R IH P AO R T
+misreported M IH S R IH P AO R T IH D
+misrepresent M IH S R EH P R AH Z EH N T
+misrepresentation M IH S R EH P R IH Z EH N T EY SH AH N
+misrepresentations M IH S R EH P R IH Z EH N T EY SH AH N Z
+misrepresented M IH S R EH P R IH Z EH N T IH D
+misrepresented(2) M IH S R EH P R IH Z EH N IH D
+misrepresenting M IH S R EH P R AH Z EH N T IH NG
+misrepresenting(2) M IH S R EH P R AH Z EH N IH NG
+misrepresents M IH S R EH P R AH Z EH N T S
+misrepresents(2) M IH S R EH P R AH Z EH N S
+misrule M IH S R UW L
+miss M IH S
+missal M IH S AH L
+missed M IH S T
+missel M IH S AH L
+misses M IH S AH Z
+misses(2) M IH S IH Z
+missett M IH S AH T
+missey M IH S IY
+misshapen M IH S SH EY P AH N
+misshapen(2) M IH S HH AE P AH N
+missie M IH S IY
+missildine M IH S IY L D IY N IY
+missildine(2) M IH S IH L D AY N
+missile M IH S AH L
+missile's M IH S AH L Z
+missiles M IH S AH L Z
+missiles' M IH S AH L Z
+missimer M IH S IH M ER
+missing M IH S IH NG
+mission M IH SH AH N
+mission's M IH SH AH N Z
+missionaries M IH SH AH N EH R IY Z
+missionary M IH SH AH N EH R IY
+missions M IH SH AH N Z
+mississauga M IH S IH S AO G AH
+mississippi M IH S IH S IH P IY
+mississippi's M IH S IH S IH P IY Z
+mississippian M IH S IH S IH P IY AH N
+mississippians M IH S IH S IH P IY AH N Z
+mississippis M IH S IH S IH P IY Z
+missive M IH S IH V
+missler M IH S L ER
+missoula M IH Z UW L AH
+missouri M AH Z UH R IY
+missouri's M AH Z UH R IY Z
+missouri's(2) M AH Z ER AH Z
+missouri(2) M AH Z ER AH
+missourian M AH Z UH R IY AH N
+missourians M AH Z UH R IY AH N Z
+misspeak M IH S S P IY K
+misspeak(2) M IH S P IY K
+misspell M IH S S P EH L
+misspell(2) M IH S P EH L
+misspelled M IH S S P EH L D
+misspelled(2) M IH S P EH L D
+misspelling M IH S S P EH L IH NG
+misspelling(2) M IH S P EH L IH NG
+misspells M IH S S P EH L Z
+misspells(2) M IH S P EH L Z
+misspend M IH S S P EH N D
+misspend(2) M IH S P EH N D
+misspending M IH S S P EH N D IH NG
+misspending(2) M IH S P EH N D IH NG
+misspent M IH S S P EH N T
+misspent(2) M IH S P EH N T
+misspoke M IH S S P OW K
+misspoke(2) M IH S P OW K
+misspoken M IH S S P OW K AH N
+misspoken(2) M IH S P OW K AH N
+misstate M IH S S T EY T
+misstate(2) M IH S T EY T
+misstated M IH S S T EY T IH D
+misstated(2) M IH S T EY T IH D
+misstatement M IH S T EY T M AH N T
+misstatements M IH S T EY T M AH N T S
+misstatements(2) M IH S T EY T M AH N S
+misstates M IH S S T EY T S
+misstates(2) M IH S T EY T S
+misstating M IH S S T EY T IH NG
+misstating(2) M IH S T EY T IH NG
+misstep M IH S S T EH P
+misstep(2) M IH S T EH P
+missteps M IH S S T EH P S
+missteps(2) M IH S T EH P S
+missus M IH S IH Z
+missy M IH S IY
+missy's M IH S IY Z
+mist M IH S T
+mistake M IH S T EY K
+mistaken M IH S T EY K AH N
+mistakenly M IH S T EY K AH N L IY
+mistakes M IH S T EY K S
+mistaking M IH S T EY K IH NG
+mister M IH S T ER
+mistero M IH S T EH R OW
+misters M IH S T ER Z
+mistic M IH S T IH K
+mistler M IH S T L ER
+mistletoe M IH S AH L T OW
+mistook M IH S T UH K
+mistral M IH S T R AH L
+mistreat M IH S T R IY T
+mistreated M IH S T R IY T IH D
+mistreating M IH S T R IY T IH NG
+mistreatment M IH S T R IY T M AH N T
+mistreats M IH S T R IY T S
+mistress M IH S T R AH S
+mistresses M IH S T R AH S AH Z
+mistresses(2) M IH S T R AH S IH Z
+mistretta M IH S T R EH T AH
+mistrial M IH S T R AY AH L
+mistrials M IH S T R AY AH L Z
+mistrust M IH S T R AH S T
+mistrusted M IH S T R AH S T IH D
+mistrustful M IH S T R AH S T F AH L
+mistrustful(2) M IH S T R AH S F AH L
+mistrusting M IH S T R AH S T IH NG
+mistrusts M IH S T R AH S T S
+mistrusts(2) M IH S T R AH S
+mistry M IH S T R IY
+mistry(2) M IH S T R AY
+mists M IH S T S
+misty M IH S T IY
+misunder M IH S AH N D ER
+misunderstand M IH S AH N D ER S T AE N D
+misunderstanding M IH S AH N D ER S T AE N D IH NG
+misunderstandings M IH S AH N D ER S T AE N D IH NG Z
+misunderstands M IH S AH N D ER S T AE N D Z
+misunderstood M IH S AH N D ER S T UH D
+misuraca M IH S UH R AA K AH
+misuse M IH S Y UW Z
+misuse(2) M IH S Y UW S
+misused M IH S Y UW Z D
+misuses M IH S Y UW Z IH Z
+misuses(2) M IH S Y UW S IH Z
+misusing M IH S Y UW Z IH NG
+mit EH M AY T IY
+mit(2) M IH T
+mita M IY T AH
+mitamura M IY T AH M UH R AH
+mitch M IH CH
+mitcham M IH CH AH M
+mitchel M IH CH AH L
+mitchell M IH CH AH L
+mitchell's M IH CH AH L Z
+mitchelson M IH CH AH L S AH N
+mitcheltree M IH CH IH L T R IY
+mitchem M IH CH IH M
+mitchen M IH CH AH N
+mitchener M IH CH IY N ER
+mitchner M IH CH N ER
+mitchum M IH CH AH M
+mite M AY T
+mitek M AY T EH K
+mitel M AY T EH L
+miter M AY T ER
+mitering M AY T ER IH NG
+mites M AY T S
+mithcell M IH TH S AH L
+mithridate M IH TH R IH D EY T
+mithridates M IH TH R IH D EY T S
+mithun M IH TH AH N
+miti M IH T IY
+miti(2) M IY T IY
+mitigate M IH T AH G EY T
+mitigated M IH T AH G EY T IH D
+mitigates M IH T AH G EY T S
+mitigating M IH T AH G EY T IH NG
+mitigation M IH T IH G EY SH AH N
+mitman M IH T M AH N
+mitnick M IH T N IH K
+mitochondria M AY T AH K AA N D R IY AH
+mitochondrion M AY T AH K AA N D R IY AH N
+mitofsky M IH T AO F S K IY
+mitra M IH T R AH
+mitral M AY T R AH L
+mitrano M IY T R AA N OW
+mitre M IH T R IY
+mitre(2) M AY T ER
+mitro M IH T R OW
+mitrovich M IH T R AH V IH CH
+mitsch M IH CH
+mitschke M IH CH K
+mitsotakis M IH T S OW T AA K IH S
+mitsuba M IY T S UW B AH
+mitsubishi M IH T S UW B IY SH IY
+mitsubishi's M IH T S UW B IY SH IY Z
+mitsui M IY T S UW IY
+mitsui's M IY T S UW IY Z
+mitsui(2) M IH T S UW IY
+mitsukoshi M IY T S UW K OW SH IY
+mitsuru M IY T S UW R UW
+mitt M IH T
+mittag M IH T AH G
+mittal M IH T AA L
+mittan M IH T AH N
+mitteleuropa M IH T EH L UW R OW P AH
+mittelman M IH T AH L M AH N
+mittelstadt M IH T IH L SH T AE T
+mittelstaedt M IH T IH L S T EH T
+mittelsteadt M IH T IH L S T EH T
+mitten M IH T AH N
+mittendorf M IH T IH N D AO R F
+mittens M IH T AH N Z
+mitterand M IY T ER AO N D
+mitterand's M IY T ER AO N D Z
+mitterand's(2) M IY T ER AE N D Z
+mitterand(2) M IY T ER AE N D
+mitterrand M IY T ER AO N D
+mitterrand's M IY T ER AE N D Z
+mitterrand(2) M IY T ER AE N D
+mittleman M IH T AH L M AH N
+mittler M IH T L ER
+mittman M IH T M AH N
+mitton M IH T AH N
+mitts M IH T S
+mityunov M IH T Y UW N AA V
+mitzel M IH T Z AH L
+mitzi M IH T S IY
+mitzner M IH T S N ER
+mitzvah M IH T S V AH
+miura M IY UH R AH
+mix M IH K S
+mixed M IH K S T
+mixer M IH K S ER
+mixers M IH K S ER Z
+mixes M IH K S AH Z
+mixes(2) M IH K S IH Z
+mixing M IH K S IH NG
+mixner M IH K S N ER
+mixon M IH K S AH N
+mixson M IH K S AH N
+mixte M IH K S T
+mixter M IH K S T ER
+mixture M IH K S CH ER
+mixtures M IH K S CH ER Z
+mixup M IH K S AH P
+mixups M IH K S AH P S
+miyagawa M IY AA G AA W AH
+miyahara M IY Y AA HH AA R AH
+miyake M IY Y AA K EY
+miyako M IY AH K OW
+miyamori M IY AA M AO R IY
+miyamoto M IY Y AA M OW T OW
+miyasaki M IY Y AA S AA K IY
+miyasato M IY Y AA S AA T OW
+miyashiro M IY Y AA SH IH R OW
+miyazaki M IY Y AA Z AA K IY
+miyazawa M IY Y AH Z AA W AH
+miyazawa's M IY AH Z AA W AH Z
+mizar M AY Z AA R
+mizar's M AY Z AA R Z
+mize M AY Z
+mize's M AY Z IH Z
+mizel M AY Z AH L
+mizel(2) M AY Z EH L
+mizell M IH Z AH L
+mizelle M IH Z EH L
+mizen M AY Z AH N
+mizer M AY Z ER
+mizner M IH Z N ER
+mizrahi M IY Z R AA HH IY
+mizuno M IH Z UW N OW
+mizzell M IH Z AH L
+mj's EH M JH EY Z
+mkhatshwa M AH K AE CH W AH
+mladenic M L AA D EH N IH CH
+mladic M L AA D IH CH
+mladic's M L AA D IH CH IH Z
+mlecko M L EH K OW
+mlecko(2) M AH L EH K OW
+mlotok M L OW T AA K
+mlotok(2) M AH L AA T AA K
+mmabatho M AH B AA TH OW
+mme M AH D AE M
+mme(2) EH M EH M IY
+mme(3) M AE D AH M
+mmmm M M
+mnemonic N IH M AA N IH K
+mnemonic(2) N IY M AA N IH K
+mnemonics N IH M AA N IH K S
+mnemonics(2) N IY M AA N IH K S
+mnookin M N UH K AH N
+mnookin(2) M AH N UH K AH N
+mo M OW
+moab M OW AE B
+moacq M OW K
+moad M OW D
+moak M OW K
+moakley M OW K L IY
+moami M OW M IY
+moammar M OW AH M AA R
+moan M OW N
+moaned M OW N D
+moaning M OW N IH NG
+moans M OW N Z
+moat M OW T
+moates M OW EY T S
+moats M OW T S
+moawiya M OW AA W IY AH
+mob M AA B
+mob's M AA B Z
+mobay M OW B EY
+mobbed M AA B D
+mobbs M AA B Z
+mobe M OW B
+moberg M OW B ER G
+moberly M OW B ER L IY
+mobil M OW B AH L
+mobil's M OW B AH L Z
+mobile M OW B AH L
+mobile's M OW B AH L Z
+mobiler M OW B IH L ER
+mobiles M OW B AH L Z
+mobilia M OW B IY L IY AH
+mobiliare M OW B AH L EH R
+mobility M OW B IH L AH T IY
+mobility(2) M OW B IH L IH T IY
+mobilization M OW B AH L AH Z EY SH AH N
+mobilization(2) M OW B AH L IH Z EY SH AH N
+mobilizations M OW B AH L AH Z EY SH AH N Z
+mobilize M OW B AH L AY Z
+mobilized M OW B AH L AY Z D
+mobilizer M OW B AH L AY Z ER
+mobilizers M OW B AH L AY Z ER Z
+mobilizing M OW B AH L AY Z IH NG
+mobius M OW B IY AH S
+mobley M OW B L IY
+mobs M AA B Z
+mobster M AA B S T ER
+mobster's M AA B S T ER Z
+mobsters M AA B S T ER Z
+mobutu M OW B Y UW T UW
+mobutu's M OW B Y UW T UW Z
+mobutu's(2) M AH B UW T UW Z
+mobutu(2) M AH Y UW T UW
+moby M OW B IY
+moca M OW K AH
+mocarski M AH K AA R S K IY
+mocatta M AH K AA T AH
+moccasin M AA K AH S IH N
+moccasins M AA K AH S IH N Z
+moccia M OW CH AH
+moccio M OW CH IY OW
+moceri M OW CH EH R IY
+moch M AA K
+mocha M OW K AH
+mochel M AA K AH L
+mochida M AH CH IY D AH
+mochizuki M OW CH IY Z UW K IY
+mock M AA K
+mock-heroically M AA K HH ER OW IH K L IY
+mockby M AA K B IY
+mocked M AA K T
+mockery M AA K ER IY
+mocking M AA K IH NG
+mockingbird M AA K IH NG B ER D
+mockler M AA K L ER
+mocks M AA K S
+moczygemba M AH CH IH G EH M B AH
+mod M AO D
+modal M OW D AH L
+modalism M OW D AH L IH Z AH M
+modalities M AH D AE L AH T IY Z
+modality M AH D AE L AH T IY
+modarressi M OW D AA R EH S IY
+mode M OW D
+moded M OW D IH D
+model M AA D AH L
+model's M AA D AH L Z
+modeled M AA D AH L D
+modeling M AA D AH L IH NG
+modeling(2) M AA D L IH NG
+modell M OW D EY L
+modelo M OW D EH L OW
+models M AA D AH L Z
+models' M AA D AH L Z
+modem M OW D AH M
+modems M OW D AH M Z
+moden M OW D AH N
+modena M OW D EH N AH
+moder M OW D ER
+moderate M AA D ER AH T
+moderate(2) M AA D ER EY T
+moderated M AA D ER EY T IH D
+moderately M AA D ER AH T L IY
+moderates M AA D ER AH T S
+moderates(2) M AA D ER EY T S
+moderating M AA D ER EY T IH NG
+moderation M AA D ER EY SH AH N
+moderator M AA D ER EY T ER
+moderators M AA D ER EY T ER Z
+modern M AA D ER N
+moderne M OW D EH R N
+modernism M AA D ER N IH Z AH M
+modernist M AA D ER N AH S T
+modernists M AA D ER N AH S T S
+modernists(2) M AA D ER N AH S S
+modernists(3) M AA D ER N AH S
+modernity M AA D ER N AH T IY
+modernization M AA D ER N AH Z EY SH AH N
+modernization(2) M AA D ER N AY Z EY SH AH
+modernize M AA D ER N AY Z
+modernized M AA D ER N AY Z D
+modernizes M AA D ER N AY Z IH Z
+modernizing M AA D ER N AY Z IH NG
+moderns M AA D ER N Z
+modes M OW D Z
+modesitt M AA D IH S IH T
+modest M AA D AH S T
+modesta M OW D EH S T AH
+modestia M OW D EH S T Y AH
+modestine M OW D EH S T IY N IY
+modestly M AA D AH S T L IY
+modesto M OW D EH S T OW
+modesty M AA D AH S T IY
+modglin M AA JH L IH N
+modi M OW D IY
+modic M AA D IH K
+modica M OW D IY K AH
+modicum M AA D IH K AH M
+modification M AA D AH F AH K EY SH AH N
+modifications M AA D AH F AH K EY SH AH N Z
+modified M AA D AH F AY D
+modifies M AA D AH F AY Z
+modify M AA D AH F AY
+modifying M AA D AH F AY IH NG
+modigliani M OW D IH G L IY AA N IY
+modigliani(2) M OW D IH G L IY AE N IY
+modiliani M OW D IH L IY AE N IY
+modine M OW D IY N
+modisette M AA D IH S EH T
+modjeski M AH JH EH S K IY
+modlin M AA D L IH N
+modrak M AA D R AH K
+modrow M AA D R OW
+modugno M OW D UW G N OW
+modulaire M AO JH UW L EH R
+modular M AA JH AH L ER
+modulate M AO JH Y UW L EY T
+modulate(2) M AO JH UW L EY T
+modulated M AO JH Y UW L EY T IH D
+modulated(2) M AO JH UW L EY T IH D
+modulation M AA JH AH L EY SH AH N
+modulator M AA JH AH L EY T ER
+module M AA JH UW L
+modules M AA JH UW L Z
+modus M OW D AH S
+modus-operandi M OW D AH AO P ER AE N D IY
+mody M OW D IY
+modzelewski M AH JH IH L EH F S K IY
+moe M OW
+moebius M OW B IY IH S
+moeckel M OW K AH L
+moede M OW D
+moehle M OW HH AH L
+moehlman M OW L M AH N
+moehring M AO R IH NG
+moeller M OW L ER
+moellering M OW L ER IH NG
+moen M OW N
+moench M OW NG K
+moening M AA AH N IH NG
+moerbe M AO R B
+moerke M AO R K
+moerman M OW ER M AH N
+moers M OW ER Z
+moertel M AO R T EH L
+moes M OW Z
+moesch M OW SH
+moeser M OW Z ER
+moessner M OW S N ER
+moet M OW IH T
+mof M AA F
+moffa M AA F AH
+moffat M AA F AH T
+moffatt M AA F AH T
+moffet M AA F IH T
+moffett M AA F IH T
+moffit M AA F IH T
+moffitt M AA F IH T
+mofford M AO F ER D
+mofield M OW F IY L D
+moga M OW G AH
+mogadishu M OW G AH D IY SH UW
+mogadishu's M OW G AH D IY SH UW Z
+mogan M OW G AH N
+mogavaro M OW G AH V AA R OW
+mogavero M OW G AA V EH R OW
+mogayon M OW G AA Y AH N
+mogayon's M OW G AA Y AH N Z
+mogel M OW G AH L
+mogensen M AA G IH N S AH N
+moger M OW G ER
+mogg M AA G
+mogle M OW G AH L
+moglia M AA G L IY AH
+mogopa M OW G OW P AH
+mogul M OW G AH L
+moguls M OW G AH L Z
+mohair M OW HH EH R
+mohamad M AH HH AA M AH D
+mohamadi M AH HH AA M AH D IY
+mohamed M OW HH AA M EH D
+mohammad M OW HH AA M EH D
+mohammed M OW HH AE M IH D
+mohan M OW HH AA N
+mohar M OW HH ER
+mohasco M OW HH AE S K OW
+mohawk M OW HH AO K
+mohawks M OW HH AO K S
+mohel M OW AH L
+moher M AA HH ER
+mohican M OW HH IY K AH N
+mohicans M OW HH IY K AH N Z
+mohit M OW HH IY T
+mohit(2) M OW HH IH T
+mohl M OW L
+mohler M OW L ER
+mohlman M OW L M AH N
+mohn M AA N
+mohney M AA N IY
+mohnke M AA N K
+mohnke(2) M AA N K IY
+mohnkern M AA N K ER N
+moholy-nagy M OW HH OW L IY N EY G IY
+mohon M OW HH AH N
+mohr M AO R
+mohring M AO R IH NG
+mohrman M AO R M AH N
+mohrmann M AO R M AH N
+mohs M AA S
+mohtashemi M OW T AH SH EY M IY
+moi M W AA
+moilanen M OY L AH N AH N
+moina M OY N AH
+moines M OY N Z
+moines(2) M OY N
+moir M OY R
+moira M OY R AH
+moisan M OY Z AE N
+moise M OY Z
+moises M OY Z IH Z
+moishe M OW SH EH
+moishe(2) M OY SH IH
+moisi M OY S IY
+moist M OY S T
+moisten M OY S AH N
+moistened M OY S AH N D
+moisture M OY S CH ER
+moisturizer M OY S CH ER AY Z ER
+mojave M OW HH AA V IY
+mojica M OW Y IY K AH
+mojo M OW JH OW
+mok M AA K
+moka M OW K AH
+moke M OW K
+mokes M OW K S
+mokhiber M AA K HH IH B ER
+mokoena M AH K OW N AH
+mokry M AA K R IY
+mol M AO L
+mola M OW L AH
+molaison M AH L EY Z AH N
+moland M AA L AH N D
+molander M AA L AH N D ER
+molano M OW L AA N OW
+molasses M AH L AE S AH Z
+molchan M OW L CH AH N
+mold M OW L D
+moldable M OW L D AH B AH L
+moldavia M OW L D EY V IY AH
+moldavia(2) M OW L D AA V IY AH
+moldavian M OW L D EY V IY AH N
+moldavian(2) M OW L D AA V IY AH N
+molded M OW L D AH D
+molded(2) M OW L D IH D
+molden M OW L D AH N
+moldenhauer M OW L D IH N HH AW ER
+molder M OW L D ER
+molders M OW L D ER Z
+molding M OW L D IH NG
+moldings M OW L D IH NG Z
+moldova M OW L D OW V AH
+moldovan M OW L D OW V AA N
+molds M OW L D Z
+moldy M OW L D IY
+mole M OW L
+molecular M AH L EH K Y AH L ER
+molecule M AA L AH K Y UW L
+molecules M AA L AH K Y UW L Z
+moleculon M OW L EH K Y UW L AA N
+molehill M OW L HH IH L
+molelike M OW L L AY K
+molen M OW L AH N
+molenaar M AA L IH N AA R
+molenda M OW L EH N D AH
+moler M OW L ER
+moles M OW L Z
+moleski M AH L EH S K IY
+molesky M AH L EH S K IY
+molest M AH L EH S T
+molestation M OW L EH S T EY SH AH N
+molested M AH L EH S T IH D
+molester M AH L EH S T ER
+molesters M AH L EH S T ER Z
+molesting M AH L EH S T IH NG
+molests M AH L EH S T S
+molests(2) M AH L EH S S
+molests(3) M AH L EH S
+molesworth M OW L Z W ER TH
+molex M OW L AH K S
+moliere M OW L Y EH R
+moliere's M OW L Y EH R Z
+molin M OW L IH N
+molina M AH L IY N AH
+molinar M AA L IH N ER
+molinari M AO L AH N AA R IY
+molinaro M OW L IY N AA R OW
+moline M OW L IY N
+molineaux M AO L AH N OW
+molinelli M OW L IY N EH L IY
+molino M OW L IY N OW
+molitor M OW L IY T ER
+moll M AA L
+molle M AA L
+mollen M AA L IH N
+mollenhauer M AA L IH N HH AW ER
+mollenkopf M AA L AH N K AO P F
+mollenkopf(2) M AA L AH N K AO F
+moller M AA L ER
+mollering M AA L ER IH NG
+mollet M AA L IH T
+mollett M AA L IH T
+molley M AA L IY
+mollica M AA L IH K AH
+mollie M AA L IY
+mollified M AA L AH F AY D
+mollify M AA L AH F AY
+mollison M AA L IH S AH N
+mollner M AA L N ER
+mollo M AA L OW
+mollohan M AA L AH HH AE N
+molloy M AA L OY
+mollusk M AA L AH S K
+mollusks M AA L AH S K S
+molly M AA L IY
+molly's M AA L IY Z
+mollycoddle M AA L IY K AA D AH L
+molnar M OW L N ER
+molnar(2) M OW L N AA R
+molner M OW L N ER
+molock M AA L AH K
+molokai M AA L AH K AY
+moloney M AH L OW N IY
+molonicks M AH L AO N IH K S
+molony M AH L AO N IY
+molotov M AO L AH T AA F
+molpus M AO L P AH S
+molpus' M AO L P AH S
+molpus's M AO L P AH S IH S
+molson M OW L S AH N
+molstad M OW L S T AH D
+molt M OW L T
+molten M OW L T AH N
+molter M OW L T ER
+molting M OW L T IH NG
+molton M OW L T AH N
+moltz M OW L T S
+molucca M AH L UW K AH
+moly M OW L IY
+molybdenum M AH L IH B D IH N AH M
+molyneaux M AA L IH N OW
+molzahn M OW L Z AH N
+mom M AA M
+mom's M AA M Z
+moma M OW M AH
+moma's M OW M AH Z
+moman M OW M AH N
+momayez M OW M EY EH Z
+mombasa M AA M B AA S AH
+moment M OW M AH N T
+moment's M OW M AH N T S
+momentarily M OW M AH N T EH R AH L IY
+momentary M OW M AH N T EH R IY
+momentous M OW M EH N T AH S
+moments M OW M AH N T S
+momentum M OW M EH N T AH M
+momigliano M OW M IH G L IY AA N OW
+momma M AA M AH
+mommens M AA M AH N Z
+mommies M AA M IY Z
+mommy M AA M IY
+mommy's M AA M IY Z
+momokawa M OW M OW K AA W AH
+momokawa's M OW M OW K AA W AH Z
+moms M AA M Z
+mon M OW N
+mon(2) M AA N
+mona M OW N AH
+mona's M OW N AH Z
+monacelli M OW N AA CH EH L IY
+monachino M OW N AA K IY N OW
+monaco M AA N AH K OW
+monaco's M AA N AH K OW Z
+monad M OW N AE D
+monadnock M AA N AE D N AA K
+monagene M AA N AH JH IY N
+monaghan M AA N AH HH AE N
+monahan M AA N AH HH AE N
+monarch M AA N AA R K
+monarch's M AA N AA R K S
+monarchies M AA N AA R K IY Z
+monarchist M AA N AA R K IH S T
+monarchists M AA N AA R K IH S T S
+monarchists(2) M AA N AA R K IH S S
+monarchists(3) M AA N AA R K IH S
+monarchs M AA N AA R K S
+monarchy M AA N AA R K IY
+monarrez M OW N AA R EH Z
+monash M AA N AE SH
+monasteries M AA N AH S T EH R IY Z
+monastery M AA N AH S T EH R IY
+monastic M AH N AE S T IH K
+monasticism M AH N AE S T AH S IH Z AH M
+monatomic M AA N AH T AA M IH K
+monca M OW N K AH
+moncada M OW N K AA D AH
+moncayo M OW N K EY OW
+monceaux M AH N S OW
+moncrief M AA N K R IY F
+moncur M AA N K ER
+moncure M OW N K UH R IY
+moncus M AA N K IH S
+monda M AA N D AH
+mondadori M AA N D AH D AO R IY
+mondale M AA N D EY L
+mondale's M AA N D EY L Z
+mondallo M AA N D AE L OW
+mondavi M AA N D AA V IY
+monday M AH N D IY
+monday's M AH N D IY Z
+monday's(2) M AH N D EY Z
+monday(2) M AH N D EY
+mondays M AH N D IY Z
+mondays(2) M AH N D EY Z
+monde M AA N D
+mondelli M OW N D EH L IY
+mondello M AA N D EH L OW
+mondeo M AA N D EY OW
+mondex M AA N D EH K S
+mondo M AA N D OW
+mondor M AA N D ER
+mondragon M OW N D R AA G AO N
+mondrian M AA N D R IY AH N
+mondrian(2) M AA N D R IY AE N
+mondry M AA N D R IY
+monds M AA N D Z
+mondschein M AA N D SH AY N
+mondy M AA N D IY
+mone M OW N
+monell M AA N AH L
+mones M OW N Z
+monessen M OW N AH S AH N
+monessen(2) M AH N EH S AH N
+monet M OW N EY
+monet's M OW N EY Z
+monetarily M AA N AH T ER IH L IY
+monetarism M AA N AH T ER IH Z AH M
+monetarist M AA N AH T ER IH S T
+monetarists M AA N AH T ER IH S T S
+monetarists(2) M AA N AH T ER IH S S
+monetarists(3) M AA N AH T ER IH S
+monetary M AA N AH T EH R IY
+monett M AA N IH T
+monette M AH N EH T
+money M AH N IY
+money's M AH N IY Z
+moneycard M AH N IY K AA R D
+moneycenter M AH N IY S EH N T ER
+moneyed M AH N IY D
+moneyless M AH N IY L IH S
+moneyline M AH N IY L AY N
+moneyline's M AH N IY L AY N Z
+moneymaker M AH N IY M EY K ER
+moneymakers M AH N IY M EY K ER Z
+moneymaking M AH N IY M EY K IH NG
+moneypenny M AH N IY P EH N IY
+moneys M AH N IY Z
+moneywatch M AH N IY W AA CH
+moneyweek M AH N IY W IY K
+moneyweek's M AH N IY W IY K S
+monfils M AA N F IH L Z
+monfort M AA N F ER T
+monforte M OW N F AO R T IY
+mong M AO NG
+mongan M AA NG G AH N
+monge M AA N JH
+mongeau M AH NG G OW
+mongelli M OW NG G EH L IY
+mongeon M AA N JH IH N
+monger M AH NG G ER
+mongering M AH NG G ER IH NG
+mongers M AH NG G ER Z
+mongiello M OW N JH EH L OW
+mongillo M OW NG G IH L OW
+mongol M AA NG G AH L
+mongold M AA N G OW L D
+mongolia M AA NG G OW L IY AH
+mongolia(2) M AA NG G OW L Y AH
+mongolian M AA NG G OW L IY AH N
+mongolian(2) M AA NG G OW L Y AH N
+mongoloid M AA NG G AH L OY D
+mongols M AA NG G AH L Z
+mongoose M AA NG G UW S
+mongooses M AA NG G UW S AH Z
+mongosutu M AA NG G OW S UW T UW
+mongosutu's M AA NG G OW S UW T UW Z
+mongstad M AO NG S T AE D
+monhollen M AA N HH AH L AH N
+monica M AA N IH K AH
+monica's M AA N IH K AH Z
+monical M AA N IH K AH L
+monico M OW N IY K OW
+monied M AH N IY D
+monier M OW N IY ER
+monies M AH N IY Z
+monieson M OW N IY S AH N
+monieson's M OW N IY S AH N Z
+monigold M AA N IH G OW L D
+moniker M AA N IH K ER
+monikers M AA N IH K ER Z
+moninger M OW N IH NG ER
+monique M OW N IY K
+monism M AA N IH Z AH M
+monisms M AA N IH Z AH M Z
+monit M AA N AH T
+monitor M AA N AH T ER
+monitored M AA N AH T ER D
+monitoring M AA N AH T ER IH NG
+monitors M AA N AH T ER Z
+moniz M AA N IH Z
+monje M AA N JH
+monk M AH NG K
+monk's M AH NG K S
+monkee M AA NG K IY
+monkees M AA NG K IY Z
+monkey M AH NG K IY
+monkeying M AH NG K IY IH NG
+monkeylike M AH NG K IY L AY K
+monkeys M AH NG K IY Z
+monks M AH NG K S
+monmouth M AA N M AH TH
+monmouth's M AA N M AH TH S
+monn M AA N
+monnett M AA N IH T
+monnier M AA N IY ER
+monnig M AA N IH G
+monnin M AA N IH N
+mono M OW N OW
+monocarpic M AA N AH K AA R P IH K
+monochromatic M AA N AH K R OW M AE T IH K
+monochrome M AA N AH K R OW M
+monoclate M AA N AH K L EY T
+monocle M AA N AH K AH L
+monoclinic M AA N AH K L IH N IH K
+monoclonal M AA N AH K L OW N AH L
+monogamous M AH N AA G AH M AH S
+monogamy M AH N AA G AH M IY
+monogram M AA N AH G R AE M
+monogrammed M AA N AH G R AE M D
+monograph M AA N AH G R AE F
+monohull M AA N AH HH AH L
+monolingual M AA N AH L IH NG G W AH L
+monolith M AA N AH L IH TH
+monolithic M AA N AH L IH TH IH K
+monoliths M AA N AH L IH TH S
+monologue M AA N AH L AO G
+monologues M AA N AH L AO G Z
+monomer M AA N AH M ER
+monomers M AA N AH M ER Z
+monongahela M AH N AO NG G AH HH EY L AH
+mononokai M AH N AA N AH K AY
+mononuclear M AA N AH N UW K L IY ER
+monophonic M AA N AH F AA N IH K
+monoplane M AA N AH P L EY N
+monoplanes M AA N AH P L EY N Z
+monopole M AA N AH P OW L
+monopoles M AA N AH P OW L Z
+monopolies M AH N AA P AH L IY Z
+monopolist M AH N AA P AH L AH S T
+monopolistic M AH N AA P AH L IH S T IH K
+monopolization M AH N AA P AH L IH Z EY SH AH N
+monopolize M AH N AA P AH L AY Z
+monopolized M AH N AA P AH L AY Z D
+monopolizes M AH N AA P AH L AY Z IH Z
+monopolizing M AH N AA P AH L AY Z IH NG
+monopoly M AH N AA P AH L IY
+monorail M AA N ER EY L
+monorails M AA N ER EY L Z
+monosaccharide M AA N AH S AE K ER AY D
+monoszon M AA N AH Z AA N
+monotheism M AA N AH TH IY IH Z AH M
+monotone M AA N AH T OW N
+monotonous M AH N AA T AH N AH S
+monotony M AH N AA T AH N IY
+monotype M AA N AH T AY P
+monovalent M AA N AH V EY L AH N T
+monoxide M AH N AA K S AY D
+monreal M AA N R AH L
+monro M AA N R OW
+monroe M AH N R OW
+monroe's M AH N R OW Z
+monroeville M AA N R OW V IH L
+monroeville(2) M AH N R OW V IH L
+monrovia M AA N R OW V IY AH
+monroy M AA N R OY
+monsanto M AA N S AE N T OW
+monsanto's M AA N S AE N T OW Z
+monsees M AA N S IY Z
+monsen M AA N S AH N
+monsey M AA N Z IY
+monsieur M AH S Y ER
+monsieurs M AH S Y ER Z
+monsignor M AA N S IY N Y ER
+monsignors M AA N S IY N Y ER Z
+monsky M AA N S K IY
+monsod M AA N S AA D
+monson M AA N S AH N
+monsoon M AA N S UW N
+monsoonal M AA N S UW N AH L
+monsoons M AA N S UW N Z
+monsour M AA N S ER
+monster M AA N S T ER
+monsters M AA N S T ER Z
+monstrosity M AA N S T R AA S AH T IY
+monstrous M AA N S T R AH S
+mont M AA N T
+montag M AH N T AE G
+montage M AA N T AA ZH
+montagna M OW N T AA G N AH
+montagne M AH N T EY N Y
+montagnier M AA N T AE N Y ER
+montagnino M OW N T AA G N IY N OW
+montagu M AA N T AH G Y UW
+montagu's M AA N T AH G Y UW Z
+montague M AA N T AH G Y UW
+montalban M AA N T AE L B AH N
+montalbano M OW N T AA L B AA N OW
+montalbo M AA N T AE L B OW
+montalto M OW N T AA L T OW
+montalvo M OW N T AA L V OW
+montana M AA N T AE N AH
+montana's M AA N T AE N AH Z
+montanan M AA N T AE N AH N
+montanans M AA N T AE N AH N Z
+montanans(2) M AO N T AE N AH N Z
+montanari M OW N T AA N AA R IY
+montanaro M OW N T AA N AA R OW
+montand M AA N T AH N D
+montanez M OW N T AA N EH Z
+montano M AO N T AA N OW
+montante M OW N T AA N T IY
+montanye M OW N T AA N Y EY
+montavon M OW N T AA V AO N
+montazeri M AA N T AH Z EH R IY
+montblanc M AA N T B L AE NG K
+montblanc(2) M OW N T B L AA NG K
+montclair M AA N T K L EH R
+monte M AA N T IY
+monte's M AA N T IY Z
+monteagudo M OW N T AH G UW D OW
+montebello M AA N T IH B EH L OW
+montecalvo M OW N T EH K AA L V OW
+montedison M AA N T EH D IH S AH N
+montedison's M AA N T EH D IH S AH Z
+montee M AA N T IY
+montefiore M AA N T AH F IY AO R IY
+montefiore(2) M AA N T AH F Y AO R
+monteforte M OW N T EH F AO R T IY
+montefusco M OW N T EH F UW S K OW
+montego M AO N T IY G OW
+monteil M AA N T AY L
+monteiro M AA N T EH R OW
+montejano M AA N T EY AA N OW
+montel M AA N T EH L
+montel's M AA N T EH L Z
+monteleone M AA N T EY L EY OW N IY
+montella M AA N T EH L AH
+montello M AA N T EH L OW
+montelongo M AA N T EH L OW NG G OW
+montemarano M AA N T EH M AA R AA N OW
+montemayor M AA N T EY M EY AO R
+montemurro M AA N T EH M UH R OW
+montenay M AA N T AH N EY
+montenegran M AA N T AH N EY G R AH N
+montenegro M AA N T AH N EY G R OW
+montenegro's M AA N T AH N EY G R OW Z
+monter M AA N T ER
+monterey M AA N T ER EY
+monterey(2) M AA N ER EY
+montero M AA N T EH R OW
+monterosso M OW N T ER OW S OW
+monterrey M AA N T ER EY
+monterrey(2) M AA N ER EY
+monterrey(3) M AA N T ER R EY
+monterrey(4) M AA N ER R EY
+montes M AA N T IY Z
+montesano M OW N T EH S AA N OW
+montesdeoca M OW N T EH S D IY AA K AH
+montesi M OW N T EH S IY
+montesino M OW N T EH S IY N OW
+montessori M AA N T AH S AO R IY
+monteverde M OW N T EH V EH R D IY
+montevideo M AA N T AH V IH D IY OW
+montevideo(2) M AA N T AH V IH D EY OW
+montez M OW N T EH Z
+montezuma M AA N T IH Z UW M AH
+montford M AH N T F AO R D
+montfort M AA N T F ER T
+montgomery M AA N T G AH M R IY
+montgomery's M AA N T G AH M R IY Z
+montgoris M AA N T G AO R IH S
+month M AH N TH
+month's M AH N TH S
+monthlong M AH N TH L AO NG
+monthly M AH N TH L IY
+months M AH N TH S
+months' M AA N TH S
+monti M AA N T IY
+monticciolo M AA N T IY CH IY OW L OW
+monticello M AA N T AH S EH L OW
+monticello(2) M AA N T IH S EH L OW
+montie M AA N T IY
+montiel M OW N T IY EH L
+montien M AA N T IY EH N
+montier M AA N T Y ER
+montieth M AA N T IY IH TH
+montijo M OW N T IY Y OW
+montini M OW N T IY N IY
+montjoy M AA N T JH OY
+montminy M AA N T M IH N IY
+montone M OW N T OW N IY
+montooth M AA N T UW TH
+montoya M AA N T OY AH
+montpelier M AA N T P IY L IY ER
+montpelier's M AA N T P IY L IY ER Z
+montreal M AH N T R IY AO L
+montreal's M AA N T R IY AA L Z
+montrealer M AH N T R IY AO L ER
+montrealer's M AH N T R IY AO L ER Z
+montrealers M AH N T R IY AO L ER Z
+montrone M AA N T R OW N
+montrose M AA N T R OW Z
+montross M OW N T R OW S
+montrouis M AA N T R UW IY
+montroy M AA N T R OY
+monts M AA N T S
+montserrat M AA N S ER AA T
+montuori M OW N T W AO R IY
+montvale M AA N T V EY L
+montville M OW N T V IH L
+monty M AO N T IY
+montz M AA N T S
+monument M AA N Y UW M AH N T
+monument(2) M AA N Y AH M AH N T
+monumental M AA N Y AH M EH N T AH L
+monumental(2) M AA N Y AH M EH N AH L
+monumental(3) M AA N Y UW M EH N T AH L
+monumentally M AA N Y AH M EH N T AH L IY
+monumentally(2) M AA N Y UW M EH N T AH L IY
+monumentally(3) M AA N Y AH M EH N AH L IY
+monumentally(4) M AA N Y UW M EH N AH L IY
+monuments M AA N Y AH M AH N T S
+monuments(2) M AA N Y UW M AH N T S
+monus M OW N AH S
+mony M OW N IY
+monzert M AA N Z ER T
+monzingo M OW N Z IY NG G OW
+monzo M AA N Z OW
+monzon M OW N Z AO N
+monzonite M AA N Z AH N AY T
+moo M UW
+mooberry M UW B EH R IY
+mood M UW D
+mood's M UW D Z
+moodie M UW D IY
+moods M UW D Z
+moody M UW D IY
+moody's M UW D IY Z
+mooers M UW ER Z
+moog M UW G
+mook M UH K
+moomaw M UW M AO
+moomey M UW M IY
+moon M UW N
+moon's M UW N Z
+moonbeam M UW N B IY M
+moonbeams M UW N B IY M Z
+moondreamer M UW N D R IY M ER
+moondreamers M UW N D R IY M ER Z
+moone M UW N
+mooney M UW N IY
+mooneyham M UW N IY HH AH M
+mooneyhan M UW N IY HH AH N
+moonie M UW N IY
+moonies M UW N IY Z
+moonlight M UW N L AY T
+moonlighting M UW N L AY T IH NG
+moonlike M UW N L AY K
+moonlit M UW N L IH T
+moons M UW N Z
+moonshine M UW N SH AY N
+moonstone M UW N S T OW N
+moonstones M UW N S T OW N Z
+moonstruck M UW N S T R AH K
+moonves M UW N V EH Z
+moor M UH R
+mooradian M UH R EY D IY AH N
+moorco M UH R K OW
+moorco(2) M AO R K OW
+moore M UH R
+moore's M UH R Z
+moore's(2) M AO R Z
+moore(2) M AO R
+moored M UH R D
+moorefield M UH R IH F IY L D
+moorefield(2) M UH R F IY L D
+moorehead M UH R HH EH D
+moorehouse M UH R HH AW S
+moorer M UH R ER
+moores M UH R Z
+moorestown M AO R Z T AW N
+moorhead M UH R HH EH D
+moorhouse M UH R HH AW S
+mooring M UH R IH NG
+moorings M UW R IH NG Z
+moorings(2) M AO R IH NG Z
+moorish M UH R IH SH
+moorland M UH R L AE N D
+moorland's M UH R L AE N D Z
+moorlands M UH R L AE N D Z
+moorman M UH R M AH N
+moormann M UH R M AH N
+moors M UH R Z
+moos M UW Z
+moosa M UW S AH
+moose M UW S
+moosehead M UW S HH EH D
+moosman M UW S M AH N
+moot M UW T
+moothart M UW TH AA R T
+moots M UW T S
+mooty M UW T IY
+mootz M UW T S
+mop M AA P
+mopboard M AA P B AO R D
+mope M OW P
+moped M OW P T
+moped(2) M OW P EH D
+mopeds M OW P EH D Z
+moping M OW P IH NG
+mopped M AA P T
+moppes M AA P S
+mopping M AA P IH NG
+mops M AA P S
+mopus M OW P AH S
+moquin M OW K W IY N
+mor M AO R
+mor's M AO R Z
+mora M AO R AH
+morabito M AO R AA B IY T OW
+morace M AO R AA CH IY
+morachov M AO R AH CH AO V
+morad M AO R AH D
+morado M AO R AA D OW
+moraga M AO R AA G AH
+moragne M ER EY N Y
+morahan M AO R AH HH AE N
+morain M ER EY N
+morainal M ER EY N AH L
+moraine M ER EY N
+morais M ER EY
+moraitis M AO R AY T IH S
+moral M AO R AH L
+morale M ER AE L
+morales M ER AE L Z
+morales(2) M AO R AE L EH S
+moralez M AO R AA L EH Z
+moralism M AO R AH L IH Z AH M
+moralist M AO R AH L IH S T
+moralistic M AO R AH L IH S T IH K
+moralists M AO R AH L IH S T S
+moralists(2) M AO R AH L IH S S
+moralists(3) M AO R AH L IH S
+morality M ER AE L AH T IY
+moralize M AO R AH L AY Z
+moralizing M AO R AH L AY Z IH NG
+morally M AO R AH L IY
+morals M AO R AH L Z
+moran M ER AE N
+morand M AO R AH N D
+morandan M AH R AE N D AH N
+morandi M AO R AA N D IY
+morando M AO R AA N D OW
+morang M AO R AH NG
+morano M AO R AA N OW
+morant M AO R AH N T
+morante M AO R AA N T IY
+morash M AO R AH SH
+moraski M ER AA S K IY
+morass M ER AE S
+morass(2) M AO R AE S
+morasses M ER AE S IH Z
+morasses(2) M AO R AE S IH Z
+morath M AO R AH TH
+moratoria M AO R AH T AO R IY AH
+moratorium M AO R AH T AO R IY AH M
+moratoriums M AO R AH T AO R IY AH M Z
+moravec M ER AA V IH K
+moravek M AO R AH V IH K
+moravian M ER EY V IY AH N
+morawski M ER AA F S K IY
+moray M ER EY
+moray(2) M AO R EY
+morays M ER EY Z
+morays(2) M AO R EY Z
+morbid M AO R B AH D
+morbidity M AO R B IH D AH T IY
+morbidly M AO R B AH D L IY
+morby M AO R B IY
+morcom M AO R K AH M
+mord M AO R D
+mordant M AO R D AH N T
+mordecai M AO R D AH K AY
+mordechai M AO R D AH K AY
+morden M AO R D AH N
+more M AO R
+morea M AO R IY AH
+moreau M ER OW
+moredock M AO R IH D AA K
+moree M ER IY
+moreen M AO R IY N
+morefield M AO R IH F IY L D
+morefield(2) M AO R F IY L D
+morehart M AO R IH HH AA R T
+morehart(2) M AO R HH AA R T
+morehead M AO R HH EH D
+morehouse M AO R HH AW S
+moreira M AO R EH R AH
+morejon M AO R IH JH AA N
+morel M ER EH L
+moreland M AO R L AH N D
+morell M AO R AH L
+morella M AO R EH L AH
+morelli M AO R EH L IY
+morello M ER EH L OW
+morelock M AO R IH L AA K
+morelock(2) M AO R L AA K
+moreman M AO R M AH N
+moren M AO R AH N
+morena M AO R EY N AH
+morency M AO R AO N S IY
+moreno M AO R IY N OW
+moreno(2) M AO R EY N OW
+moreover M AO R OW V ER
+morera M AO R EH R AH
+mores M AO R EY Z
+mores(2) M AO R IY Z
+moresco M AO R EH S K OW
+moreso M AO R EH S OW
+moret M AO R IH T
+moreton M AO R IH T AA N
+moretti M AO R EH T IY
+moretto M AO R EH T OW
+moretz M AO R IH T S
+morever M AO R EH V ER
+morey M AO R IY
+morfin M AO R F IH N
+morford M AO R F ER D
+morga M AO R G AH
+morgado M AO R G AA D OW
+morgan M AO R G AH N
+morgan's M AO R G AH N Z
+morgana M AO R G AE N AH
+morgans M AO R G AH N Z
+morganstern M AO R G AH N S T ER N
+morgante M AO R G AA N T IY
+morganti M AO R G AA N T IY
+morgantown M AO R G AH N T AW N
+morgart M AO R G AA R T
+morgen M AO R G AH N
+morgenroth M AO R G IH N R AO TH
+morgenstern M AO R G IH N S T ER N
+morgenthaler M AO R G IH N TH AH L ER
+morgenthau M AO R G AH N TH AW
+morgue M AO R G
+morgues M AO R G Z
+morgun M AO R G AH N
+mori M AO R IY
+moria M AO R IY AH
+morial M AO R IY AH L
+moriarity M AO R IY AA R AH T IY
+moriarty M AO R IY AA R T IY
+moribund M AO R AH B AH N D
+moric M AO R IH K
+morice M AO R IH S
+morici M AO R IY CH IY
+morihiro M AO R IY HH IH R OW
+morihiro's M AO R IY HH IH R OW Z
+morikawa M AO R IY K AA W AH
+morillo M AO R IH L OW
+morillom M AO R IH L AO M
+morillono M AO R IH L AH N OW
+morimoto M AO R IY M OW T OW
+morin M AO R IH N
+morine M AO R IY N IY
+moring M AO R IH NG
+morini M AO R IY N IY
+morino M AO R IY N OW
+morioka M AO R IY OW K AH
+moris M AO R IH S
+morisette M AO R IH S EH T
+morishita M AO R IY SH IY T AH
+morison M AO R IH S AH N
+morissette M AO R IH S EH T
+morita M AO R IY T AH
+moritz M AO R IH T S
+moriya M AO R IY AH
+morjera M AO R JH EH R AH
+mork M AO R K
+morken M AO R K AH N
+morlan M AO R L AH N
+morland M AO R L AH N D
+morley M AO R L IY
+morlock M AO R L AH K
+morman M AO R M AH N
+mormile M AO R M AY L
+mormino M AO R M IY N OW
+mormon M AO R M AH N
+mormonism M AO R M AH N IH Z M
+mormonism(2) M AO R M AH N IH Z AH M
+mormons M AO R M AH N Z
+morn M AO R N
+morna M AO R N AH
+morneau M ER N OW
+morneault M ER N OW
+morning M AO R N IH NG
+morning's M AO R N IH NG Z
+mornings M AO R N IH NG Z
+morningstar M AO R N IH NG S T AA R
+morningstar's M AO R N IH NG S T AA R Z
+moro M AO R OW
+moroccan M ER AA K AH N
+moroccans M ER AA K AH N Z
+morocco M ER AA K OW
+moron M AO R AA N
+morones M AO R OW N EH S
+moroney M ER OW N IY
+moroni M ER OW N IY
+moros M AO R OW Z
+morose M ER OW S
+morosky M AO R AO S K IY
+morovcic M AO R AA V CH IH K
+morovcic's M AO R AA V CH IH K S
+morowick M AO R AH W IH K
+moroz M AO R OW Z
+morph M AO R F
+morphed M AO R F T
+morphew M AO R F Y UW
+morphin M AO R F AH N
+morphine M AO R F IY N
+morphing M AO R F IH NG
+morphis M AO R F IH S
+morphogenesis M AO R F AH JH EH N AH S AH S
+morphological M AO R F AH L AA JH IH K AH L
+morphology M AO R F AA L AH JH IY
+morphonios M AO R F AO N IY AH S
+morphonios(2) M AO R F AO N IY OW S
+morphs M AO R F S
+morr M AO R
+morra M AO R AH
+morrall M AO R AA L
+morreale M AO R IY L IY
+morrell M AO R EH L
+morren M AO R AH N
+morrical M AO R IH K AH L
+morricone M AO R AH K OW N
+morricone's M AO R AH K OW N Z
+morricone's(2) M AO R AH K OW N IY Z
+morricone(2) M AO R AH K OW N IY
+morrie M AO R IY
+morrill M AO R IY L
+morrin M AO R IH N
+morris M AO R AH S
+morris' M AO R AH S
+morris's M AO R IH S IH Z
+morris(2) M AO R IH S
+morrisett M AO R AH S EH T
+morrisette M AO R IH S EH T
+morrisey M AO R IH S IY
+morrish M AO R IH SH
+morrison M AO R IH S AH N
+morrison's M AO R IH S AH N Z
+morriss M AO R IH S IH Z
+morrissette M AO R IH S EH T
+morrissey M AO R IH S IY
+morristown M AO R AH S T AW N
+morrisville M AO R AH S V IH L
+morrisville's M AO R AH S V IH L Z
+morro M AO R OW
+morrone M AO R OW N IY
+morrow M AA R OW
+morrow(2) M AO R OW
+morry M AO R IY
+morsch M AO R SH
+morse M AO R S
+morsel M AO R S AH L
+morsels M AO R S AH L Z
+morson M AO R S AH N
+morss M AO R S
+mort M AO R T
+mortal M AO R T AH L
+mortality M AO R T AE L AH T IY
+mortally M AO R T AH L IY
+mortals M AO R T AH L Z
+mortar M AO R T ER
+mortara M AO R T AA R AH
+mortars M AO R T ER Z
+morteki M AO R T EH K IY
+mortell M AO R T EY L
+mortellaro M AO R T EH L AA R OW
+mortem M AO R T AH M
+mortems M AO R T AH M Z
+morten M AO R T AH N
+mortensen M AO R T IH N S AH N
+mortenson M AO R T IH N S AH N
+morter M AO R T ER
+mortgage M AO R G AH JH
+mortgage's M AO R G IH JH IH Z
+mortgage(2) M AO R G IH JH
+mortgaged M AO R G IH JH D
+mortgagepower M AO R G IH JH P AW R
+mortgages M AO R G AH JH AH Z
+mortgages(2) M AO R G IH JH IH Z
+mortgaging M AO R G IH JH IH NG
+mortician M AO R T IH SH AH N
+mortie M AO R T IY
+mortier M AO R T IY ER
+mortified M AO R T AH F AY D
+mortify M AO R T IH F AY
+mortimer M AO R T IH M ER
+mortimore M AO R T IY M AO R
+mortis M AO R T IH S
+mortland M AO R T L AH N D
+mortner M AO R T N ER
+morton M AO R T AH N
+morton's M AO R T AH N Z
+mortuary M AO R CH UW EH R IY
+morty M AO R T IY
+moruhiro M AO R UW HH IH R OW
+moruhiro's M AO R UW HH IH R OW Z
+morvant M AO R V AH N T
+morven M AO R V AH N
+morvillo M AO R V IH L OW
+mory M AO R IY
+morze M AO R Z
+mos M AO S
+mosaic M OW Z EY IH K
+mosaical M OW Z EY IH K AH L
+mosaicked M OW Z EY IH K T
+mosaics M OW Z EY IH K S
+mosbacher M AA S B AA K ER
+mosbrucker M AA S B R AH K ER
+mosby M AO S B IY
+mosca M OW S K AH
+moscato M OW S K AA T OW
+moschella M OW S K EH L AH
+moschetti M OW S K EH T IY
+mosco M OW S K OW
+moscom M AO S K AH M
+moscoso M OW S K OW S OW
+moscow M AA S K OW
+moscow's M AO S K AW Z
+moscow's(2) M AA S K OW Z
+moscow(2) M AO S K AW
+moscowane M AA S K OW W EY N
+moscowitz M AA S K AH W IH T S
+mose M OW Z
+mosel M OW S AH L
+moseley M OW Z L IY
+moseley-braun M OW Z L IY B R AA N
+moselle M OW Z EH L
+mosely M OW Z L IY
+moseman M OW S M AH N
+moser M OW Z ER
+moses M OW Z AH S
+moses(2) M OW Z IH S
+mosey M OW Z IY
+mosh M AO SH
+moshe M OW SH EH
+moshe's M OW SH EH Z
+moshe's(2) M OW SH AH Z
+moshe(2) M OW SH AH
+mosher M OW ZH ER
+moshier M AA SH IY ER
+moshood M AA S HH UH D
+moshus M OW SH AH S
+moshus(2) M UW SH AH S
+mosie M AA S IY
+mosier M OW ZH ER
+mosier(2) M OW Z IY ER
+mosiman M OW S IY M AH N
+mosinee M AH S IY N IY
+mosk M AO S K
+moskal M AA S K AH L
+moskatel's M AO S K AH T EH L Z
+mosko M OW S K OW
+moskolenko M AO S K OW L EH NG K OW
+moskovitz M AA S K AH V IH T S
+moskow M AA S K OW
+moskowitz M AO S K AH W IH T S
+moskwa M AA S K V AH
+mosle M OW S AH L
+moslem M AA Z L AH M
+moslems M AA Z L AH M Z
+mosler M AA S AH L ER
+mosler(2) M AA S L ER
+mosley M OW Z L IY
+mosman M AA S M AH N
+mosque M AA S K
+mosque(2) M AO S K
+mosqueda M OW S K W EY D AH
+mosquera M OW S K W EH R AH
+mosques M AA S K S
+mosques(2) M AO S K S
+mosquito M AH S K IY T OW
+mosquitoes M AH S K IY T OW Z
+mosquitos M AH S K IY T OW Z
+moss M AO S
+mossad M OW S AE D
+mossad(2) M OW S AA D
+mossbacher M AA S B AA K ER
+mossbarger M AA S B AA R G ER
+mossberg M AO S B ER G
+mossburg M AO S B ER G
+mosser M AO S ER
+mosses M AO S AH Z
+mosses(2) M AO S IH Z
+mossey M AA S IY
+mossholder M AO S HH OW L D ER
+mosslike M AO S L AY K
+mossman M AO S M AH N
+mosso M OW S OW
+most M OW S T
+most(2) M OW S
+mostaert M AH S T EY R T
+mostar M OW S T AA R
+mostar's M OW S T AA R Z
+mostek M AA S T IH K
+mosteller M AA S T AH L ER
+moster M OW S T ER
+mostly M OW S T L IY
+mostly(2) M OW S L IY
+mostoller M AA S T OW L ER
+mostow M AA S T AW
+mostrom M AA S T R AH M
+mostyn M AA S T IH N
+mosul M OW S AH L
+mosur M OW S UH R
+moszkowski M AA S K AW S K IY
+mota M OW T AH
+mote M OW T
+motel M OW T EH L
+motels M OW T EH L Z
+moten M OW T AH N
+motes M OW T S
+moteurs M OW T UW R Z
+moth M AO TH
+mothball M AO TH B AO L
+mothballed M AO TH B AO L D
+mothballing M AO TH B AO L IH NG
+mothballs M AO TH B AO L Z
+mother M AH DH ER
+mother's M AH DH ER Z
+mother-in-law M AH DH ER IH N L AO
+mothercare M AH DH ER K EH R
+motherfucker M AH DH ER F AH K ER
+motherfuckers M AH DH ER F AH K ER Z
+motherhood M AH DH ER HH UH D
+mothering M AH DH ER IH NG
+motherland M AH DH ER L AE N D
+motherless M AH DH ER L IH S
+motherly M AH DH ER L IY
+mothers M AH DH ER Z
+mothers' M AH TH ER Z
+mothers-in-law M AH DH ER Z IH N L AO
+mothershead M AH DH ER Z HH EH D
+mothershed M AH DH ER SH EH D
+mothon M AA TH AH N
+moths M AO TH S
+moti M OW T IY
+motif M OW T IY F
+motifs M OW T IY F S
+motile M OW T AH L
+motility M OW T IH L IH T IY
+motion M OW SH AH N
+motioned M OW SH AH N D
+motioning M OW SH AH N IH NG
+motionless M OW SH AH N L AH S
+motions M OW SH AH N Z
+motivate M OW T AH V EY T
+motivated M OW T AH V EY T AH D
+motivates M OW T AH V EY T S
+motivating M OW T AH V EY T IH NG
+motivation M OW T AH V EY SH AH N
+motivational M OW T AH V EY SH AH N AH L
+motivations M OW T AH V EY SH AH N Z
+motivator M OW T AH V EY T ER
+motive M OW T IH V
+motives M OW T IH V Z
+motl M AA T AH L
+motley M AA T L IY
+moto M OW T OW
+moto(2) M AA T OW
+motohashi M OW T OW HH AA SH IY
+motola M OW T OW L AH
+moton M OW T OW N
+motonori M OW T OW N AO R IY
+motor M OW T ER
+motor's M OW T ER Z
+motorbike M OW T ER B AY K
+motorbikes M OW T ER B AY K S
+motorboat M OW T ER B OW T
+motorcade M OW T ER K EY D
+motorcades M OW T ER K EY D Z
+motorcar M OW T ER K AA R
+motorcars M OW T ER K AA R Z
+motorcycle M OW T ER S AY K AH L
+motorcycles M OW T ER S AY K AH L Z
+motorcyclist M OW T ER S AY K AH L IH S T
+motorcyclist(2) M OW T ER S AY K L IH S T
+motorcyclists M OW T ER S AY K AH L IH S T S
+motorcyclists(2) M OW T ER S AY K AH L IH S S
+motorcyclists(3) M OW T ER S AY K AH L IH S
+motorcyclists(4) M OW T ER S AY K L IH S
+motoren M OW T ER AH N
+motoring M OW T ER IH NG
+motorist M OW T ER IH S T
+motorists M OW T ER AH S T S
+motorists(2) M OW T ER IH S T S
+motorists(3) M OW T ER IH S S
+motorists(4) M OW T ER IH S
+motorize M OW T ER AY Z
+motorized M OW T ER AY Z D
+motorola M OW T ER OW L AH
+motorola's M OW T ER OW L AH Z
+motors M OW T ER Z
+motors' M OW T ER Z
+motown M OW T AW N
+motown's M OW T AW N Z
+motrin M AA T R IH N
+mots M AA T S
+motsinger M AA T S IH N JH ER
+motsoaledi M AA T S OW L EY D IY
+mott M AA T
+mott's M AA T S
+motte M AA T
+motter M AA T ER
+mottern M AA T ER N
+mottl M AA T AH L
+mottled M AA T AH L D
+mottley M AA T L IY
+mottling M AA T AH L IH NG
+mottling(2) M AA T L IH NG
+motto M AA T OW
+mottola M OW T OW L AH
+mottos M AA T OW Z
+mottram M AA T R AH M
+motts M AA T S
+mottus M AA T AH S
+motyka M AA T AY K AH
+motyl M OW T AH L
+motz M AA T S
+motzer M OW T Z ER
+motzko M AA T S K OW
+moua M AW AH
+moudry M OW D R IY
+moudy M AW D IY
+moueix M UW W AY K S
+moul M AW L
+mould M OW L D
+moulden M OW L D AH N
+moulder M OW L D ER
+moulding M OW L D IH NG
+mouldings M OW L D IH NG Z
+moulds M OW L D Z
+mouldy M OW L D IY
+moulin M UW L AE N
+moulinex M UW L IH N EH K S
+moulthrop M AW L TH R AH P
+moulton M OW L T AH N
+moultrie M OW L T R IY
+mounce M AW N S
+mound M AW N D
+mounds M AW N D Z
+mounger M AW NG ER
+mounsey M AW N S IY
+mount M AW N T
+mount-everest M AW N T EH V ER EH S T
+mountain M AW N T AH N
+mountain's M AW N T AH N Z
+mountaineer M AW N T IH N IH R
+mountaineering M AW N T IH N IH R IH NG
+mountaineers M AW N T IH N IH R Z
+mountainous M AW N T AH N AH S
+mountains M AW N T AH N Z
+mountainside M AW N T AH N S AY D
+mountainsides M AW N T AH N S AY D Z
+mountaintop M AW N T AH N T AA P
+mountaintops M AW N T AH N T AA P S
+mountcastle M AW N T K AE S AH L
+mounted M AW N T AH D
+mounted(2) M AW N T IH D
+mounted(3) M AW N IH D
+mountford M UW N T F AO R D
+mounties M AW N T IY Z
+mounties(2) M AW N IY Z
+mounting M AW N T IH NG
+mountjoy M AW N T JH OY
+mountleigh M AW N T L IY
+mountleigh's M AW N T L IY Z
+mounts M AW N T S
+mountz M AW N T S
+moura M UH R AH
+mourad M UW R AE D
+mouradian M AO R EY D IY AH N
+mourer M AO R ER
+mourn M AO R N
+mourned M AO R N D
+mourner M AO R N ER
+mourners M AO R N ER Z
+mournful M AO R N F AH L
+mourning M AO R N IH NG
+mourns M AO R N Z
+mouse M AW S
+mousehole M AW S HH OW L
+mousel M UW S EH L
+mousepad M AW S P AE D
+mouser M AW Z ER
+mousers M AW Z ER Z
+mousetrap M AW S T R AE P
+mousley M AW S L IY
+moussa M AW S AH
+mousse M UW S
+mousseau M UW S OW
+moussorgsky M UW S AO R G S K IY
+moussorgsky(2) M UW Z AO R G S K IY
+moustache M AH S T AE SH
+mousy M AW S IY
+mouth M AW TH
+mouthed M AW DH D
+mouthful M AW TH F UH L
+mouthing M AW DH IH NG
+mouthpart M AW TH P AA R T
+mouthparts M AW TH P AA R T S
+mouthpiece M AW TH P IY S
+mouthpieces M AW TH P IY S IH Z
+mouths M AW DH Z
+mouthwash M AW TH W AA SH
+mouthy M AW TH IY
+mouton M UW T AO N
+moutray M UW T R EY
+moutse M UW T S IY
+mouw M AW W
+mouzon M UW Z AO N
+movable M UW V AH B AH L
+move M UW V
+moved M UW V D
+movement M UW V M AH N T
+movement's M UW V M AH N T S
+movements M UW V M AH N T S
+mover M UW V ER
+movers M UW V ER Z
+moves M UW V Z
+movida M UW V IY D AH
+movie M UW V IY
+movie's M UW V IY Z
+moviegoer M UW V IY G OW ER
+moviegoers M UW V IY G OW ER Z
+moviegoing M UW V IY G OW IH NG
+movielab M UW V IY L AE B
+movieline M UW V IY L AY N
+moviemaker M UW V IY M EY K ER
+moviemakers M UW V IY M EY K ER Z
+moviemaking M UW V IY M EY K IH NG
+movies M UW V IY Z
+movietime M UW V IY T AY M
+moving M UW V IH NG
+movingly M UW V IH NG L IY
+mow M OW
+mowat M OW AH T
+mowatt M OW AH T
+mowbray M OW B R EY
+mowdy M OW D IY
+mowed M OW D
+mowell M AA W EH L
+mowen M OW AH N
+mower M OW ER
+mowers M OW ER Z
+mowery M AW ER IY
+mowing M AW IH NG
+mowrer M AO R ER
+mowrey M AO R IY
+mowry M AO R IY
+mows M AW Z
+moxie M AA K S IY
+moxley M AA K S L IY
+moxon M AA K S AH N
+moy M OY
+moya M OY AH
+moye M OY
+moyer M OY ER
+moyer's M OY ER Z
+moyers M OY ER Z
+moyes M OY Z
+moyl M OY L
+moylan M OY L AH N
+moyle M OY L
+moyna M OY N AH
+moynahan M OY N AH HH AE N
+moynihan M OY N IH HH AE N
+moynihan's M OY N IH HH AE N Z
+moyse M OY S
+mozambican M OW Z AE M B IY K AH N
+mozambicans M OW Z AE M B IY K AH N Z
+mozambique M OW Z AE M B IY K
+mozambique(2) M OW Z AH M B IY K
+mozart M OW Z AA R T
+mozart's M OW Z AA R T S
+mozart's(2) M OW T S AA R T S
+mozart(2) M OW T S AA R T
+mozartean M OW Z AA R T IY AH N
+mozartean(2) M OW T Z AA R T IY AH N
+mozee M AA Z IY
+mozelle M AH Z EH L
+mozena M AH Z IY N AH
+mozer M OW Z ER
+mozer's M OW Z ER Z
+mozingo M OW Z IY NG G OW
+mozley M AA Z L IY
+mpeg EH M P EH G
+mpg EH M P IY JH IY
+mpg(2) M AY L Z P ER G AE L AH N
+mph EH M P IY EY CH
+mph(2) M AY L Z P ER AW ER
+mr M IH S T ER
+mr. M IH S T ER
+mraz M R AE Z
+mrazek M R AA Z EH K
+mrazik M R AA Z IH K
+mroczek M R AA CH EH K
+mroczka M R AA CH K AH
+mroczkowski M R AH CH K AO F S K IY
+mrotek M R OW T EH K
+mroz M R AA Z
+mrozek M R OW Z EH K
+mrozinski M R AH Z IH N S K IY
+mrs M IH S IH Z
+mrs. M IH S IH Z
+mruk M R AH K
+ms M IH Z
+ms. M IH Z
+msgr M AA N S IY N Y ER
+mssrs M EH S ER Z
+mssrs. M EH S ER Z
+mt M AW N T
+mt(2) EH M T IY
+mtel EH M T EH L
+mu M UW
+muammar M UW AE M ER
+muavenet M UW AH V EH N IH T
+mubarak M UW B AA R IH K
+mubarak's M UW B AA R IH K S
+mubarak's(2) M Y UW B AA R IH K S
+mubarak(2) M Y UW B AA R IH K
+mucci M UW CH IY
+muccio M UW CH IY OW
+much M AH CH
+mucha M AH CH AH
+muchmore M AH K M AO R
+muchnick M AH K N IH K
+mucho M UW CH OW
+muchow M AH CH OW
+muck M AH K
+muckenfuss M AH K AH N F AH S
+muckey M AH K IY
+mucking M AH K IH NG
+muckle M AH K AH L
+muckleroy M AH K L ER OY
+muckleroy(2) M AH K AH L R OY
+muckrake M AH K R EY K
+muckraker M AH K R EY K ER
+muckraking M AH K R EY K IH NG
+mucky M AH K IY
+mucosa M Y UW K OW S AH
+mucosal M Y UW K OW S AH L
+mucous M Y UW K AH S
+mucus M Y UW K AH S
+mud M AH D
+mudd M AH D
+muddied M AH D IY D
+muddier M AH D IY ER
+muddle M AH D AH L
+muddled M AH D AH L D
+muddleheaded M AH D AH L HH EH D AH D
+muddleheaded(2) M AH D AH L HH EH D IH D
+muddles M AH D AH L Z
+muddling M AH D AH L IH NG
+muddling(2) M AH D L IH NG
+muddy M AH D IY
+muddying M AH D IY IH NG
+mudge M AH JH
+mudgett M AH JH IH T
+mudra M AH D R AH
+mudrick M AH D R IH K
+mudry M AH D R IY
+muds M AH D Z
+mudslide M AH D S L AY D
+mudslides M AH D S L AY D Z
+mudslinging M AH D S L IH NG IH NG
+mudwagon M AH D W AE G AH N
+muecke M UW K
+muegge M UW G
+muehl M Y UW L
+muehlbauer M Y UW L B AW ER
+muehlebach M Y UW L B AA K
+muehler M Y UW L ER
+mueller M Y UW L ER
+muellner M Y UW L N ER
+muench M Y UW NG K
+muenchen M Y UW N CH AH N
+muenchow M UW N CH AW
+muenster M Y UW N S T ER
+muetzel M Y UW T Z AH L
+muff M AH F
+muffin M AH F AH N
+muffins M AH F AH N Z
+muffle M AH F AH L
+muffled M AH F AH L D
+muffler M AH F L ER
+mufflers M AH F L ER Z
+muffles M AH F AH L Z
+muffley M AH F L IY
+muffling M AH F L IH NG
+muffling(2) M AH F AH L IH NG
+muffoletto M UW F OW L EH T OW
+muffs M AH F S
+muffy M AH F IY
+mug M AH G
+mugabe M UW G AA B EY
+mugabe's M UW G AA B EY Z
+mugar M Y UW G ER
+mugavero M UW G AA V EH R OW
+mugford M AH G F ER D
+mugged M AH G D
+mugger M AH G ER
+muggeridge M AH G ER IH JH
+muggers M AH G ER Z
+mugging M AH G IH NG
+muggings M AH G IH NG Z
+muggsy M AH G S IY
+muggy M AH G IY
+mughniyeh M AH G N IH Y AH
+mugniyah M AH G N IH Y AH
+mugs M AH G Z
+mugu M UW G UW
+muha M Y UW HH AH
+muhabara M UW HH AH B AA R AH
+muhamed M UH HH AA M EH D
+muhamed's M UH HH AA M EH D Z
+muhammad M UH HH AA M AH D
+muhammad's M UH HH AA M AH D Z
+muhammed M UH HH AA M EH D
+muhammed's M UH HH AA M EH D Z
+muharram M AH HH AE R AH M
+muhl M AH L
+muhlbauer M UW L B AW ER
+muhlenkamp M UW L IH N K AE M P
+muhr M UH R
+muhs M AH S
+mui M UW IH
+muilenburg M UW L AH N B ER G
+muir M Y UH R
+muirfield M Y UH R F IY L D
+muirhead M Y UH R HH EH D
+muise M UW Z
+mujahadeen M Y UW JH AE HH AH D IY N
+mujahedeen M UW JH AH HH EH D IY N
+mujahideen M UW JH AH HH EH D IY N
+mujica M Y UW JH IH K AH
+mujzel M AH JH Z AH L
+mukai M UW K AA IY
+mukasey M Y UW K IH S IY
+mukherjee M AH K HH ER JH IY
+mukhopadhyay M UW K OW P AA D Y AY
+mukluk M AH K L AH K
+mul's M UH L Z
+mula M Y UW L AH
+mulanaphy M Y UW L AH N AE F IY
+mulanax M Y UW L AH N AE K S
+mulatto M AH L AA T OW
+mulberry M AH L B EH R IY
+mulcahey M AH L K AH HH IY
+mulcahy M AH L K EY HH IY
+mulcare M AH L K ER
+mulch M AH L CH
+mulched M AH L CH T
+mulches M AH L CH IH Z
+mulching M AH L CH IH NG
+mulct M AH L K T
+mulder M AH L D ER
+muldoon M AH L D UW N
+muldorfer M AH L D AO F ER
+muldowney M AH L D AW N IY
+muldrew M AH L D R UW
+muldrow M AH L D R AW
+mule M Y UW L
+mules M Y UW L Z
+mulford M AH L F ER D
+mulgrew M AH L G R UW
+mulhall M AH L HH AH L
+mulhearn M AH L HH ER N
+mulheren M AH L HH EH R AH N
+mulheren's M AH L HH EH R AH N Z
+mulherin M AH L HH ER IH N
+mulhern M AH L HH ER N
+mulholland M AH L HH AA L AH N D
+mulhouse M AH L HH AW S
+mulkern M AH L K ER N
+mulkey M AH L K IY
+mulkins M AH L K IH N Z
+mull M AH L
+mullady M AH L AH D IY
+mullah M AH L AH
+mullahs M AH L AH Z
+mullally M AH L AH L IY
+mullaly M AH L AH L IY
+mullan M AH L AH N
+mullane M AH L AH N
+mullaney M AH L AH N IY
+mullany M AH L AH N IY
+mullarkey M AH L AA R K IY
+mulldorfer M AH L D AO R F ER
+mulled M AH L D
+mullen M AH L AH N
+mullenax M AH L AH N AE K S
+mullendore M UW L EH N D AO R
+mullenix M UW L IH N IH K S
+mullenix(2) M AH L AH N IH K S
+mullens M AH L AH N Z
+muller M AH L ER
+muller's M AH L ER Z
+mullet M AH L AH T
+mullett M UW L IH T
+mullican M AH L IH K AH N
+mulligan M AH L IH G AH N
+mulligans M AH L IH G AH N Z
+mulliken M AH L IH K AH N
+mullikin M AH L IH K IH N
+mullin M AH L IH N
+mullinax M AH L IH N AE K S
+mullineaux M AH L IH N OW
+mulling M AH L IH NG
+mullings M AH L IH NG Z
+mullinix M AH L IH N IH K S
+mullins M AH L IH N Z
+mullis M AH L IH S
+mulloy M AH L OY
+mulls M AH L Z
+mulnix M AH L N IH K S
+mulqueen M AH L K W IY N
+mulroney M AH L R OW N IY
+mulroney's M AH L R OW N IY Z
+mulrooney M AH L R UW N IY
+mulroy M AH L R OY
+mulry M AH L R IY
+multer M AH L T ER
+multi M AH L T IY
+multibank M AH L T IY B AE NG K
+multibillion M AH L T AY B IH L Y AH N
+multibillion(2) M AH L T IY B IH L Y AH N
+multicandidate M AH L T IY K AE N D IH D EY T
+multicandidate(2) M AH L T IY K AE N D AH D AH T
+multicenter M AH L T IY S EH N T ER
+multicolor M AH L T IY K AH L ER
+multicolored M AH L T IY K AH L ER D
+multicultural M AH L T IY K AH L CH ER AH L
+multiculturalism M AH L T IY K AH L CH ER AH L IH Z AH M
+multidex M AH L T IH D EH K S
+multiemployer M AH L T IY IH M P L OY ER
+multiethnic M AH L T IY EH TH N IH K
+multifacet M AH L T IY F AE S AH T
+multifaceted M AH L T IY F AE S AH T IH D
+multifamily M AH L T AY F AE M AH L IY
+multifamily(2) M AH L T IY F AE M L IY
+multifoods M AH L T IY F UW D Z
+multifoods' M AH L T IY F UW D Z
+multilateral M AH L T IH L AE T ER AH L
+multilateral(2) M AH L T IY L AE T ER AH L
+multilateralism M AH L T IH L AE T ER AH L IH Z AH M
+multilateralism(2) M AH L T IH L AE T ER AH L IH Z M
+multilaterally M AH L T IH L AE T ER AH L IY
+multilaterally(2) M AH L T IY L AE T ER AH L IY
+multilayer M AH L T IY L EY ER
+multilayered M AH L T IY L EY ER D
+multilevel M AH L T AY L EH V AH L
+multilevel(2) M AH L T IY L EH V AH L
+multiline M AH L T IY L AY N
+multilingual M AH L T IY L IH NG W AH L
+multilingual(2) M AH L T AY L IH NG W AH L
+multimarket M AH L T IY M AA R K IH T
+multimate M AH L T IY M EY T
+multimedia M AH L T IY M IY D IY AH
+multimedia's M AH L T IY M IY D IY AH Z
+multimedia's(2) M AH L T AY M IY D IY AH Z
+multimedia(2) M AH L T AY M IY D IY AH
+multimillion M AH L T AY M IH L Y AH N
+multimillion(2) M AH L T IY M IH L Y AH N
+multimillionaire M AH L T IY M IH L Y AH N EH R
+multimillionaire(2) M AH L T AY M IH L Y AH N EH R
+multimillionaires M AH L T IY M IH L Y AH N EH R Z
+multimillionaires(2) M AH L T AY M IH L Y AH N EH R Z
+multinational M AH L T AY N AE SH AH N AH L
+multinational(2) M AH L T IY N AE SH AH N AH L
+multinationals M AH L T AY N AE SH AH N AH L Z
+multinationals(2) M AH L T IY N AE SH AH N AH L Z
+multipart M AH L T IY P AA R T
+multiparty M AH L T IY P AA R T IY
+multiplayer M AH L T IY P L EY ER
+multiple M AH L T AH P AH L
+multiples M AH L T AH P AH L Z
+multiplex M AH L T IY P L EH K S
+multiplexer M AH L T IY P L EH K S ER
+multiplexers M AH L T IY P L EH K S ER Z
+multiplication M AH L T AH P L AH K EY SH AH N
+multiplicity M AH L T AH P L IH S IH T IY
+multiplied M AH L T AH P L AY D
+multiplier M AH L T AH P L AY ER
+multiplies M AH L T AH P L AY Z
+multiply M AH L T AH P L AY
+multiplying M AH L T AH P L AY IH NG
+multiprocessor M AH L T IY P R AA S EH S ER
+multipurpose M AH L T IY P ER P AH S
+multiracial M AH L T AY R EY SH AH L
+multistate M AH L T IY S T EY T
+multistory M AH L T IY S T AO R IY
+multitask M AH L T IY T AE S K
+multitasking M AH L T IY T AE S K IH NG
+multitude M AH L T AH T UW D
+multitude(2) M AH L T AH T Y UW D
+multitudes M AH L T AH T Y UW D Z
+multiuser M AH L T IY Y UW Z ER
+multivalve M AH L T IY V AE L V
+multivision M AH L T IY V IH ZH AH N
+multiyear M AH L T IY Y IY R
+multnomah M AH L N OW M AH
+mulvaney M AH L V EY N IY
+mulvany M AH L V EY N IY
+mulvehill M AH L V HH IH L
+mulvehill(2) M AH L V IH HH IH L
+mulvey M AH L V EY
+mulvihill M AH L V IY HH IH L
+mulvihill(2) M AH L V IH HH IH L
+mum M AH M
+muma M Y UW M AH
+mumaw M UW M AO
+mumble M AH M B AH L
+mumbled M AH M B AH L D
+mumbles M AH M B AH L Z
+mumbling M AH M B AH L IH NG
+mumbling(2) M AH M B L IH NG
+mumbo M AH M B OW
+mumby M AH M B IY
+mumford M AH M F ER D
+mumia M AH M IY Y AH
+mumm M AH M
+mumma M AH M AH
+mumme M AH M
+mummert M AH M ER T
+mummey M AH M IY
+mummies M AH M IY Z
+mummification M AH M IH F IH K EY SH AH N
+mummified M AH M IH F AY D
+mummify M AH M AH F AY
+mummifying M AH M AH F AY IH NG
+mummy M AH M IY
+mummy's M AH M IY Z
+mumper M AH M P ER
+mumphrey M AH M F R IY
+mumpower M AH M P OW ER
+mumps M AH M P S
+mums M AH M Z
+mun M AH N
+munafo M UW N AA F OW
+munce M AH N S
+muncee M AH N S IY
+muncey M AH N S IY
+munch M AH N CH
+munchausen M AH N CH AW Z IH N
+munched M AH N CH T
+munchies M AH N CH IY Z
+munching M AH N CH IH NG
+muncie M AH N S IY
+muncy M AH N S IY
+mund M AH N D
+mundane M AH N D EY N
+munday M AH N D EY
+mundell M AH N D AH L
+munden M AH N D AH N
+mundi M AH N D IY
+mundie M AH N D IY
+mundinger M AH N D IH NG ER
+mundis M AH N D IH S
+mundlow M AH N D L OW
+mundo M AH N D OW
+mundorf M AH N D AO R F
+mundorff M AH N D AO R F
+mundt M AH N T
+mundy M AH N D IY
+munford M AH N F ER D
+munford's M AH N F ER D Z
+munger M AH NG ER
+mungia M UW N JH AH
+mungin M AH NG G IH N
+mungle M AH NG G AH L
+mungo M AH NG G OW
+munguia M UW N G W IY AH
+muni M Y UW N IY
+munich M Y UW N IH K
+munich's M Y UW N IH K S
+municipal M Y UW N IH S AH P AH L
+municipalities M Y UW N IH S AH P AE L IH T IY Z
+municipality M Y UW N IH S AH P AE L AH T IY
+municipally M Y UW N IH S IH P AH L IY
+municipally(2) M Y UW N IH S IH P L IY
+municipals M Y UW N IH S IH P AH L Z
+munier M Y UW N IY ER
+munis M Y UW N IH S
+munition M Y UW N IH SH AH N
+munitions M Y UW N IH SH AH N Z
+muniz M Y UW N IH Z
+munk M AH NG K
+munkres M AH NG K ER Z
+munley M AH N L IY
+munn M AH N
+munnell M AH N AH L
+munnerlyn M AH N ER L IH N
+munni M Y UW N IY
+munni(2) M AH N IY
+munns M AH N Z
+munos M UW N OW Z
+munoz M UW N Y OW Z
+munro M AH N R OW
+munroe M AH N R OW
+muns M AH N Z
+munsch M AH N SH
+munsell M AH N S AH L
+munsey M AH N Z IY
+munsingwear M AH N S IH NG W EH R
+munson M AH N S AH N
+munster M AH N S T ER
+munsterman M AH N S T ER M AH N
+munt M AH N T
+muntean M AH N T IY N
+munter M AH N T ER
+muntz M AH N T S
+munyan M AH N Y AH N
+munyon M AH N Y AH N
+munz M AH N Z
+munzer M AH N Z ER
+muoio M W OW IY OW
+muolo M W OW L OW
+muppet M AH P AH T
+muppets M AH P IH T S
+mura M UH R AH
+murad M Y UH R AE D
+murai M Y ER AY
+murakami M UH R AA K AA M IY
+mural M Y UH R AH L
+murali M ER AA L IY
+murals M Y UH R AH L Z
+muramatsu M UW R AA M AA T S UW
+muramoto M UH R AA M OW T OW
+muranaga M ER R AH N AA G AH
+murano M UH R AA N OW
+muraoka M UH R AA OW K AH
+murase M Y ER EY Z
+muraski M ER AA S K IY
+murasky M ER AE S K IY
+murata M UH R AA T AH
+muratore M UH R AA T AO R EY
+muravich M ER AH V IH CH
+murawski M ER AA F S K IY
+murayama M ER AY AA M AH
+murayama's M ER AY AA M AH Z
+murch M ER K
+murchie M ER CH IY
+murchinson M ER CH IH N S AH N
+murchison M ER CH IH S AH N
+murdaugh M ER D AO
+murden M ER D AH N
+murder M ER D ER
+murdered M ER D ER D
+murderer M ER D ER ER
+murderer's M ER D ER ER Z
+murderers M ER D ER ER Z
+murdering M ER D ER IH NG
+murderous M ER D ER AH S
+murders M ER D ER Z
+murdick M ER D IH K
+murdoch M ER D AA K
+murdoch's M ER D AA K S
+murdock M ER D AA K
+murdock's M ER D AA K S
+murdocks M ER D AA K S
+murdy M ER D IY
+murff M ER F
+murfin M ER F IH N
+murguia M UH R G W IY AH
+muri M UH R IY
+murial M Y UH R IY AH L
+murias M Y UH R IY AH S
+muriel M Y UH R IY AH L
+murihuro M UH R IY HH UH R OW
+murihuro's M UH R IY HH UH R OW Z
+murillo M AH R IH L OW
+murin M Y UH R IH N
+murine M Y UH R IY N
+murjani M ER JH AA N IY
+murk M ER K
+murkier M ER K IY ER
+murkowski M ER K AW S K IY
+murky M ER K IY
+murley M ER L IY
+murmansk M ER M AE N S K
+murmur M ER M ER
+murmured M ER M ER D
+murmuring M ER M ER IH NG
+murmurs M ER M ER Z
+murnan M ER N AH N
+murnane M ER N AH N
+murnian M ER N IY AH N
+muro M UH R OW
+murph M ER F
+murphey M ER F IY
+murphree M ER F R IY
+murphrey M ER F R IY
+murphy M ER F IY
+murphy's M ER F IY Z
+murphys M ER F IY Z
+murr M ER
+murrah M ER R AA
+murray M ER IY
+murray's M ER IY Z
+murray(2) M AH R IY
+murree M ER IY
+murrelet M ER L IH T
+murrell M AO R AH L
+murren M ER AH N
+murrey M ER IY
+murrie M ER IY
+murrieta M UH R IY T AH
+murrill M AO R AH L
+murrin M AO R IH N
+murrow M AH R OW
+murry M ER IY
+murtagh M ER T AH G
+murtaugh M ER T AO
+murtha M ER TH AH
+murthy M ER TH IY
+murto M ER T OW
+murton M ER T AH N
+murty M ER T IY
+murveit M ER V IY T
+murzyn M ER Z IH N
+musa M Y UW S AH
+musacchio M Y UW S AE K IY OW
+musalo M AH S AA L OW
+musante M UW S AA N T IY
+musarra M UW S AA R AH
+musavi M Y UW S AA V IY
+musburger M AH S B ER G ER
+muscarella M UW S K AA R EH L AH
+muscarello M UW S K AA R EH L OW
+muscat M AH S K AE T
+muscatine M AH S K AH T IY N
+muscato M UW S K AA T OW
+musch M AH SH
+muscle M AH S AH L
+muscled M AH S AH L D
+muscles M AH S AH L Z
+muscling M AH S AH L IH NG
+muscling(2) M AH S L IH NG
+musco M UW S K OW
+muscocho M AH S K AA CH OW
+muscovite M AH S K AH V AY T
+muscovites M AH S K AH V AY T S
+muscular M AH S K Y AH L ER
+musculature M AH S K Y AH L AH CH ER
+muse M Y UW Z
+mused M Y UW Z D
+musee M Y UW Z IY
+muses M Y UW Z AH Z
+muses(2) M Y UW Z IH Z
+museum M Y UW Z IY AH M
+museum's M Y UW Z IY AH M Z
+museums M Y UW Z IY AH M Z
+musgrave M AH S G R AH V
+musgrave's M AH S G R AH V Z
+musgrave's(2) M AH S G R EY V Z
+musgrave(2) M AH S G R EY V
+musgrove M AH S G R AH V
+mush M AH SH
+musha M Y UW SH AH
+musha(2) M UW SH AH
+musher M AH SH ER
+mushers M AH SH ER Z
+mushroom M AH SH R UW M
+mushroomed M AH SH R UH M D
+mushrooming M AH SH R UH M IH NG
+mushrooms M AH SH R UW M Z
+mushrush M AH SH R AH SH
+mushtaq M AH SH T AE K
+mushy M AH SH IY
+musial M Y UW Z IY AH L
+music M Y UW Z IH K
+music's M Y UW Z IH K S
+musica M Y UW Z IH K AH
+musica's M Y UW Z IH K AH Z
+musical M Y UW Z IH K AH L
+musicality M Y UW Z IH K AE L AH T IY
+musically M Y UW Z IH K L IY
+musicals M Y UW Z IH K AH L Z
+musich M Y UW S IH K
+musician M Y UW Z IH SH AH N
+musician's M Y UW Z IH SH AH N Z
+musicians M Y UW Z IH SH AH N Z
+musicians' M Y UW Z IH SH AH N Z
+musicianship M Y UW Z IH SH AH N SH IH P
+musick M Y UW S IH K
+musicland M Y UW Z IH K L AE N D
+musicologist M Y UW Z IH K AA L AH JH AH S T
+musics M Y UW Z IH K S
+musidora M UW S IY D AO R AH
+musil M UW Z AH L
+musing M Y UW Z IH NG
+musings M Y UW Z IH NG Z
+musk M AH S K
+muska M AH S K AH
+muske M AH S K
+muskegon M AH S K IY G IH N
+musket M AH S K AH T
+musketeer M AH S K AH T IY R
+musketeers M AH S K AH T IY R Z
+muskie M AH S K IY
+muskie's M AH S K IY Z
+muskmelon M AH S K M EH L AH N
+muskogee M AH S K OW G IY
+muskopf M AH S K AO P F
+muskopf(2) M AH S K AO F
+muskrat M AH S K R AE T
+muskrats M AH S K R AE T Z
+musky M AH S K IY
+muslim M AH Z L AH M
+muslim(2) M AH Z L IH M
+muslims M AH Z L AH M Z
+muslims(2) M AH Z L IH M Z
+muslin M AH Z L AH N
+musman M AH S M AH N
+musolf M Y UW S OW L F
+musolino M UW S OW L IY N OW
+musschenbroek M AH S CH EH N B R OW K
+mussel M AH S AH L
+mussell M AH S AH L
+musselman M AH S AH L M AH N
+mussels M AH S AH L Z
+musselwhite M AH S AH L W AY T
+musser M AH S ER
+mussman M AH S M AH N
+musso M UW S OW
+mussolini M UW S OW L IY N IY
+mussolini's M UW S OW L IY N IY Z
+musson M AH S AH N
+must M AH S T
+must've M AH S T IH V
+mustache M AH S T AE SH
+mustached M AH S T AE SH T
+mustaches M AH S T AE SH IH Z
+mustachio M AH S T AE SH IY OW
+mustachioed M AH S T AE SH IY OW D
+mustafa M UW S T AA F AH
+mustain M AH S T EY N
+mustang M AH S T AE NG
+mustangs M AH S T AE NG Z
+mustard M AH S T ER D
+mustards M AH S T ER D Z
+muster M AH S T ER
+mustered M AH S T ER D
+mustering M AH S T ER IH NG
+musters M AH S T ER Z
+mustin M AH S T IH N
+mustn't M AH S AH N T
+musto M AH S T OW
+mustoe M AH S T OW
+muston M AH S T AH N
+musty M AH S T IY
+musumeci M UW S UW M EH CH IY
+muszynski M AH SH IH N S K IY
+mutable M Y UW T AH B AH L
+mutagen M Y UW T AH JH EH N
+mutagens M Y UW T AH JH EH N Z
+mutant M Y UW T AH N T
+mutants M Y UW T AH N T S
+mutate M Y UW T EY T
+mutated M Y UW T EY T IH D
+mutating M Y UW T EY T IH NG
+mutation M Y UW T EY SH AH N
+mutations M Y UW T EY SH AH N Z
+mutch M AH CH
+mutchler M AH CH L ER
+mute M Y UW T
+muted M Y UW T IH D
+mutert M Y UW T ER T
+mutes M Y UW T S
+muth M UW TH
+muti M UW T IY
+muti(2) M Y UW T IY
+mutilate M Y UW T AH L EY T
+mutilated M Y UW T AH L EY T AH D
+mutilated(2) M Y UW T AH L EY T IH D
+mutilating M Y UW T AH L EY T IH NG
+mutilation M Y UW T AH L EY SH AH N
+mutilations M Y UW T AH L EY SH AH N Z
+mutineer M Y UW T AH N IH R
+mutineers M Y UW T IH N IH R Z
+muting M Y UW T IH NG
+mutinied M Y UW T AH N IY D
+mutinies M Y UW T AH N IY Z
+mutinous M Y UW T AH N AH S
+mutiny M Y UW T AH N IY
+mutlangen M AH T L AE NG G AH N
+mutsch M AH CH
+mutschler M AH CH L ER
+mutt M AH T
+mutter M AH T ER
+muttered M AH T ER D
+muttering M AH T ER IH NG
+mutterings M AH T ER IH NG Z
+mutters M AH T ER Z
+mutton M AH T AH N
+mutts M AH T S
+mutual M Y UW CH AH W AH L
+mutual's M Y UW CH AH W AH L Z
+mutualism M Y UW CH AH W AH L IH Z AH M
+mutuality M Y UW CH AH W AE L IH T IY
+mutually M Y UW CH UW AH L IY
+mutz M AH T S
+mutzich M Y UW T S IH CH
+mutzman M AH T S M AH N
+mutzman's M AH T S M AH N Z
+muzak M Y UW Z AE K
+muzik M Y UW Z IH K
+muzio M Y UW Z IY OW
+muzyka M Y UW Z IH K AH
+muzzey M AH Z IY
+muzzle M AH Z AH L
+muzzled M AH Z AH L D
+muzzles M AH Z AH L Z
+muzzy M AH Z IY
+mwanza M W AA N Z AH
+my M AY
+myanmar M Y AA N M AA R
+myanmar's M Y AA N M AA R Z
+myatt M AY AH T
+mycenaean M AY S AH N IY AH N
+mycogen M AY K OW G AH N
+mycology M AY K AA L AH JH IY
+myelin M AY IH L IH N
+myer M AY ER
+myers M AY ER Z
+myers's M AY ER Z IH Z
+myerson M AY R S AH N
+myette M AY EH T
+myhand M AY HH AE N D
+myhre M IH R
+myhren M IH R AH N
+myklebust M IH K AH L B AH S T
+myla M AY L AH
+myla's M AY L AH Z
+mylan M AY L AH N
+mylar M AY L AA R
+myler M AY L ER
+myles M AY L Z
+mylod M AY L AA D
+myna M AY N AH
+mynatt M IH N AH T
+mynatt(2) M AY N AH T
+mynhier M IH N HH IY ER
+myocardial M AY AH K AA R D IY AH L
+myocardium M AY AH K AA R D IY AH M
+myojin M Y OW JH IH N
+myopia M AY OW P IY AH
+myopic M AY AA P IH K
+myoscint M Y AO S IH N T
+myosin M AY AH S AH N
+myotrophin M AY OW T R OW F IH N
+myra M AY R AH
+myre M AY R
+myren M AY R AH N
+myreon M AY R IY AH N
+myres M AY R Z
+myriad M IH R IY AH D
+myriam M IH R IY AH M
+myrick M AY R IH K
+myrilla M IH R IH L AH
+myrlene M IH R L IY N
+myrlie M IH R L IY
+myrmidon M ER M IH D IH N
+myrmidons M ER M IH D IH N Z
+myrna M ER N AH
+myron M AY R AH N
+myrrh M ER
+myrta M ER T AH
+myrtia M ER SH AH
+myrtice M IH R T IH S
+myrtis M IH R T IH S
+myrtle M ER T AH L
+myrtles M ER T AH L Z
+myself M AY S EH L F
+myslinski M IH S L IH N S K IY
+mysliwiec M IH S L IH V IY K
+mystere M IH S T IH R
+mysteries M IH S T ER IY Z
+mysterious M IH S T IH R IY AH S
+mysteriously M IH S T IH R IY AH S L IY
+mysteriously(2) M IH S T IH R Y AH S L IY
+mysterium M IH S T IY R IY AH M
+mystery M IH S T ER IY
+mystic M IH S T IH K
+mystical M IH S T IH K AH L
+mysticism M IH S T IH S IH Z AH M
+mystics M IH S T IH K S
+mystified M IH S T AH F AY D
+mystifies M IH S T AH F AY Z
+mystify M IH S T AH F AY
+mystifying M IH S T AH F AY IH NG
+mystique M IH S T IY K
+myszka M IH SH K AH
+myth M IH TH
+mythic M IH TH IH K
+mythical M IH TH AH K AH L
+mythical(2) M IH TH IH K AH L
+mythological M IH TH AH L AA JH IH K AH L
+mythology M AH TH AA L AH JH IY
+myths M IH TH S
+myung M Y AH NG
+n EH N
+n'djamena N D Y AH M IY N AH
+n'dour N D AW R
+n's EH N Z
+n-tuple EH N T UW P AH L
+n. EH N
+n.'s EH N Z
+n.s EH N Z
+n92762 EH N N AY N T UW S EH V AH N S IH K S T UW
+na N AA
+naab N AA B
+naas N AA Z
+nab N AE B
+nabb N AE B
+nabbed N AE B D
+nabbing N AE B IH NG
+naber N EY B ER
+nabers N EY B ER Z
+nabi N AA B IY
+nabi(2) N EY B IY
+nabil N AA B IY
+nabisco N AH B IH S K OW
+nabisco's N AH B IH S K OW Z
+nablus N AE B L AH S
+nabob N AE B AA B
+nabobs N AE B AA B Z
+nabokov N AE B AH K AA V
+nabokov's N AE B AH K AA V Z
+nabors N EY B ER Z
+nabozny N AH B AA Z N IY
+nabretta N AH B R EH T AH
+naccarato N AA K ER AA T OW
+nacchio N AE K IY OW
+nacco N AE K OW
+nace N EY S
+nachbar N AE K B ER
+nachman N AE K M AH N
+nachmany N AE K M AH N IY
+nacho N AE CH OW
+nacho(2) N AA CH OW
+nachos N AA CH OW Z
+nachos(2) N AE CH OW Z
+nachreiner N AE K R AY N ER
+nachtigal N AE CH T IH G AH L
+nacional N EY S IY AH N AH L
+nack N AE K
+nacke N AE K
+naclerio N AA K L EH R IY OW
+nacobre N AE K AH B R AH
+nacogdoches N AH K AA G D AH CH IH Z
+nad N AE D
+nada N AA D AH
+nadal N AA D EY AE L
+nadeau N AH D OW
+nadein N AH D AY N
+nadel N AA D EH L
+nadell N AA D EY L
+nader N EY D ER
+nader's N EY D ER Z
+naderite N EY D ER AY T
+naderites N EY D ER AY T S
+nadgwick N AE JH W IH K
+nadia N AE D Y AH
+nadia(2) N AA D Y AH
+nadine N AH D IY N
+nading N EY D IH NG
+nadir N EY D ER
+nadja N AE D Y AH
+nadjen N AA JH AH N
+nadler N EY D AH L ER
+nadler(2) N EY D L ER
+nadolny N AH D OW L N IY
+nadolski N AH D OW L S K IY
+naef N IY F
+naegele N EH G AH L
+naegeli N EH G IH L IY
+naeger N EH G ER
+naeve N IY V
+nafco N AE F K OW
+naff N AE F
+naffziger N AE F Z IH G ER
+nafta N AE F T AH
+nafta's N AE F T AH Z
+naftalis N AE F T AA L IH S
+nafziger N AE F Z IH G ER
+nag N AE G
+nagai N AA G AA IY
+nagano N AA G AA N OW
+nagao N AA G AA OW
+nagasaki N AA G AA S AA K IY
+nagata N AA G AA T AH
+nagel N EY G AH L
+nagele N AE G AH L
+nagengast N AE G IH NG G AH S T
+nager N EY G ER
+nagged N AE G D
+nagging N AE G IH NG
+nagi N AA G IY
+nagin N EY G IH N
+nagle N EY G AH L
+nagler N EY G L ER
+nagorno N AH G AO R N OW
+nagorski N AH G AO R S K IY
+nagoya N AH G OY AH
+nags N AE G Z
+nagy N EY G IY
+nagymaros N AE JH IH M AA R OW S
+nah N AA
+nahas N AA HH AH Z
+nahm N AE M
+nahm(2) N AA M
+nahmias N AA M IY AH Z
+nahum N AE HH AH M
+naidoo N EY D UW
+naify N EY F AY
+naik N EY K
+nail N EY L
+nailed N EY L D
+nailing N EY L IH NG
+naill N EY L
+nailor N EY L ER
+nails N EY L Z
+naim N AY IH M
+naiman N EY M AH N
+nair N EH R
+naira N EH R AH
+nairn N EH R N
+nairne N EH R N
+nairobi N AY R OW B IY
+naisbitt N EY S B IH T
+naisbitt(2) N EY Z B IH T
+naish N AA IH SH
+naish(2) N EY SH
+naismith N EY Z M IH TH
+naismith(2) N EY S M IH TH
+naito N EY T OW
+naive N AY IY V
+naively N AA IY V L IY
+naivete N AA IY V AH T EY
+najar N AA Y AA R
+najarian N AH JH EH R IY AH N
+najera N AA JH EH R AH
+najib N AH JH IY B
+najib's N AH JH IY B Z
+najibullah N AE JH IH B UH L AH
+najibullah's N AE JH IH B UH L AH Z
+najjar N AA Y AA R
+nakagawa N AA K AA G AA W AH
+nakahara N AA K AA HH AA R AH
+nakai N AA K AA IY
+nakajima N AA K AA JH IY M AH
+nakama N AA K AA M AH
+nakamoto N AA K AA M OW T OW
+nakamura N AA K AA M UH R AH
+nakanishi N AA K AA N IY SH IY
+nakano N AA K AA N OW
+nakao N AA K AA OW
+nakashima N AA K AA SH IY M AH
+nakasone N AA K AH S OW N IY
+nakasone's N AA K AH S OW N IY Z
+nakata N AA K AA T AH
+nakatani N AA K AA T AA N IY
+nakayama N AA K AA Y AA M AH
+naked N EY K AH D
+nakhamkin N AE K AE M K IH N
+nalbandian N AE L B AE N D IY AH N
+nalbone N AE L B OW N
+nalcap N AE L K AE P
+nalco N AE L K OW
+naldo N AA L D OW
+nale N EY L
+nalepa N AH L IY P AH
+nall N AO L
+nalley N AE L IY
+nalls N AO L Z
+nally N AE L IY
+nam N AE M
+namara N AH M AA R AH
+nambi N AE M B IY
+nambla N AE M B L AH
+namby-pamby N AE M B IY P AE M B IY
+name N EY M
+name's N EY M Z
+named N EY M D
+nameless N EY M L AH S
+namely N EY M L IY
+nameplate N EY M P L EY T
+nameplates N EY M P L EY T S
+namer N EY M ER
+names N EY M Z
+namesake N EY M S EY K
+namesakes N EY M S EY K S
+namibia N AH M IH B IY AH
+namibia's N AH M IH B IY AH Z
+namibian N AH M IH B IY AH N
+naming N EY M IH NG
+namis N AE M IH S
+namphy N AE M F IY
+nan N AE N
+nan's N AE N Z
+nana N AE N AH
+nancarrow N AE NG K AE R OW
+nance N AE N S
+nanchang N AE N CH AE NG
+nancy N AE N S IY
+nancy's N AE N S IY Z
+nandaime N AE N D EY M
+nandi N AA N D IY
+nandita N AA N D IY T AH
+nando N AE N D OW
+nandonet N AE N D OW N EH T
+nanette N AH N EH T
+nanez N AA N EH Z
+nang N AE NG
+nangaku N AE NG G AA K UW
+nangle N AE NG G AH L
+nania N AA N IY AH
+nanjing N AE N JH IH NG
+nankai N AE NG K AY
+nankervis N AE NG K ER V IH S
+nanking N AE NG K IH NG
+nanna N AE N AH
+nanney N AE N IY
+nanni N AE N IY
+nannies N AE N IY Z
+nanninga N AA N IY NG G AH
+nannini N AA N IY N IY
+nanny N AE N IY
+nano N AA N OW
+nano(2) N AE N OW
+nanobaby N AE N OW B EY B IY
+nanogram N AA N OW G R AE M
+nanogram(2) N AE N OW G R AE M
+nanograms N AE N OW G R AE M Z
+nanos N AA N OW Z
+nanos(2) N AE N OW Z
+nanosecond N AE N OW S EH K AH N D
+nanoseconds N AE N OW S EH K AH N D Z
+nantes N AE N T S
+nantucket N AE N T AH K IH T
+nantucket's N AE N T AH K IH T S
+nantz N AE N T S
+naoki N EY OW K IY
+naoma N AA OW M AH
+naomi N EY OW M IY
+nap N AE P
+napa N AE P AH
+napalm N EY P AA M
+napco N AE P K OW
+napea N AA P IY AH
+naperville N EY P ER V IH L
+naphtha N AE F TH AH
+naphthalene N AE F TH AH L IY N
+napier N EY P IY ER
+napierala N AA P IH R AA L AH
+napkin N AE P K IH N
+napkins N AE P K IH N Z
+naples N EY P AH L Z
+napoleon N AH P OW L IY AH N
+napoleon's N AH P OW L IY AH N Z
+napoleon(2) N AH P OW L Y AH N
+napoleonic N AH P OW L IY AA N IH K
+napoles N AE P AH L Z
+napoletano N AA P OW L EH T AA N OW
+napoli N AE P AH L IY
+napolitan N AA P OW L IY T AA N
+napolitano N AA P OW L IY T AA N OW
+napora N AA P AO R AH
+napp N AE P
+nappa N AE P AH
+napped N AE P T
+napper N AE P ER
+nappi N AE P IY
+nappier N AE P IY ER
+napping N AE P IH NG
+nappo N AE P OW
+naprosyn N AE P R AH S IH N
+naps N AE P S
+naquin N AE K W IH N
+naqvi N AE K V IY
+naqvi(2) N AA K V IY
+nara N AA R AH
+naral N AA R AA L
+naramore N AA R AA M AO R
+naranja N AA R AA N Y AH
+naranjo N AA R AA N Y OW
+narasimha N AA R AH S IH M HH AA
+narasimhan N AA R AH S IH M HH AA N
+narayan N AA R AA Y AA N
+narayanan N AA R AY AA N AH N
+narazaki N AA R AA Z AA K IY
+narc N AA R K
+narciso N AA R CH IY S OW
+narcisse N AA R S IH S
+narcissism N AA R S IH S IH Z AH M
+narcissist N AA R S IH S IH S T
+narcissistic N AA R S IH S IH S T IH K
+narcissus N AA R S IH S AH S
+narco N AA R K OW
+narcolepsy N AA R K AH L EH P S IY
+narcos N AA R K OW S
+narcotic N AA R K AA T IH K
+narcotics N AA R K AA T IH K S
+nard N AA R D
+narda N AA R D AH
+nardella N AA R D EH L AH
+nardelli N AA R D EH L IY
+nardi N AA R D IY
+nardiello N AA R D IY EH L OW
+nardini N AA R D IY N IY
+nardo N AA R D OW
+nardone N AA R D OW N IY
+nardozzi N AA R D OW T S IY
+narducci N AA R D UW CH IY
+nares N AE R Z
+narita N EH R IY T AH
+narjes N AA R Y AH S
+narlikar N AA R L IH K AA R
+narlock N AA R L AH K
+narly N AA R L IY
+naro N AA R OW
+narodny N ER AA D N IY
+naron N AA R AO N
+narragansett N EH R AH G AE N S AH T
+narramore N AA R AA M AO R
+narrate N EH R EY T
+narrated N EH R EY T IH D
+narrates N EH R EY T S
+narration N EH R EY SH AH N
+narrative N AE R AH T IH V
+narrative(2) N EH R AH T IH V
+narratives N AE R AH T IH V Z
+narratives(2) N EH R AH T IH V Z
+narrator N EH R EY T ER
+narrators N EH R EY T ER Z
+narron N AE R AH N
+narrow N EH R OW
+narrow(2) N AE R OW
+narrowed N EH R OW D
+narrower N EH R OW ER
+narrowest N EH R OW AH S T
+narrowing N EH R OW IH NG
+narrowly N EH R OW L IY
+narrowness N EH R OW N AH S
+narrows N EH R OW Z
+nars N AA R Z
+naruhito N AA R UW HH IY T OW
+narum N ER AH M
+narvaez N AA R V AA EH Z
+narveson N AA R V IH S AH N
+nary N EH R IY
+nasa N AE S AH
+nasa's N AE S AH Z
+nasal N EY Z AH L
+nasally N EY Z AH L IY
+nasby N AE S B IY
+nasca N AA S K AH
+nascar N AE S K AA R
+nascent N EY S AH N T
+nascimento N AE S IH M EH N T OW
+nasco N AE S K OW
+nasdaq N AE Z D AE K
+nasdaq's N AE Z D AE K S
+nase N EY Z
+naser N EY Z ER
+nash N AE SH
+nash's N AE SH IH Z
+nashashibi N AE SH AH SH IY B IY
+nashburg N AE SH B ER G
+nashburg's N AE SH B ER G Z
+nashnamie N AE SH N AH M IY
+nashua N AE SH UW AH
+nashua's N AE SH UW AH Z
+nashville N AE SH V IH L
+nashville's N AE SH V IH L Z
+nasional N AE S IY AH N AE L
+naslund N AE S L AH N D
+naso N AA S OW
+nason N AE S AH N
+nasons N AE S AH N Z
+nasopharynx N AH S AA F ER IH NG K S
+nasr N AA S ER
+nasrullah N AH Z R UW L AH
+nass N AE S
+nassar N AE S ER
+nassau N AE S AO
+nasser N AE S ER
+nassif N AE S IH F
+nast N AE S T
+nast's N AE S T S
+nasta N AE S T AH
+nastasi N AA S T AA S IY
+nastier N AE S T IY ER
+nastiest N AE S T IY AH S T
+nastiness N AE S T IY N AH S
+nasty N AE S T IY
+nasworthy N AE S W ER DH IY
+nat N AE T
+nata N AA T AH
+natal N EY T AH L
+natal(2) N AH T AA L
+natala N AA T AA L AH
+natale N AA T AA L IY
+natali N AA T AA L IY
+natalia N AH T AA L Y AH
+natalie N AE T AH L IY
+natalle N AH T AA L EY
+natalle's N AH T AA L EY Z
+natan N EY T AH N
+natasha N AH T AA SH AH
+natasha's N AH T AA SH AH Z
+natasha's(2) N AH T AE SH AH Z
+natasha(2) N AH T AE SH AH
+natcher N AE CH ER
+natchez N AE CH EH Z
+natchez' N AE CH EH Z
+natchez's N AE CH EH Z IH Z
+natchitoches N AE K AH T AO SH
+nate N EY T
+natec's N EY T EH K S
+nath N AE TH
+nathalia N AH TH AE L IY AH
+nathalie N AE T AH L IY
+nathan N EY TH AH N
+nathan's N EY TH AH N Z
+nathanael N AE TH AH N EY L
+nathania N AH TH AE N IY AH
+nathaniel N AH TH AE N Y AH L
+nathanson N AE TH AH N S AH N
+nathe N EY DH
+nathene N AH TH IY N
+natick N EY T IH K
+nation N EY SH AH N
+nation's N EY SH AH N Z
+nationair N EY SH AH N EH R
+national N AE SH AH N AH L
+national's N AE SH AH N AH L Z
+national's(2) N AE SH N AH L Z
+national(2) N AE SH N AH L
+nationale N AE SH AH N AE L EY
+nationale(2) N AE SH AH N AH L
+nationales N AE SH AH N AA L EH S
+nationalism N AE SH AH N AH L IH Z AH M
+nationalist N AE SH AH N AH L AH S T
+nationalist(2) N AE SH AH N AH L IH S T
+nationalist(3) N AE SH N AH L AH S T
+nationalist(4) N AE SH N AH L IH S T
+nationalistic N AE SH AH N AH L IH S T IH K
+nationalistic(2) N AE SH N AH L IH S T IH K
+nationalists N AE SH AH N AH L IH S T S
+nationalists(2) N AE SH N AH L IH S T S
+nationalists(3) N AE SH AH N AH L IH S
+nationalists(4) N AE SH N AH L IH S
+nationalities N AE SH AH N AE L IH T IY Z
+nationality N AE SH AH N AE L AH T IY
+nationality(2) N AE SH AH N AE L IH T IY
+nationalization N AE SH AH N AH L AH Z EY SH AH N
+nationalization(2) N AE SH N AH L AH Z EY SH AH N
+nationalizations N AE SH AH N AH L AH Z EY SH AH N Z
+nationalizations(2) N AE SH N AH L AH Z EY SH AH N Z
+nationalize N AE SH AH N AH L AY Z
+nationalize(2) N AE SH N AH L AY Z
+nationalized N AE SH AH N AH L AY Z D
+nationalized(2) N AE SH N AH L AY Z D
+nationalizes N AE SH AH N AH L AY Z IH Z
+nationalizes(2) N AE SH N AH L AY Z IH Z
+nationalizing N AE SH AH N AH L AY Z IH NG
+nationalizing(2) N AE SH N AH L AY Z IH NG
+nationally N AE SH AH N AH L IY
+nationally(2) N AE SH N AH L IY
+nationals N AE SH AH N AH L Z
+nationals(2) N AE SH N AH L Z
+nationhood N EY SH AH N HH UH D
+nations N EY SH AH N Z
+nations' N EY SH AH N Z
+nationsbanc N EY SH AH N Z B AE NG K
+nationsbanc's N EY SH AH N Z B AE NG K
+nationsbanc's(2) N EY SH AH N Z B AA NG K
+nationsbanc(2) N EY SH AH N Z B AA NG K
+nationsbank N EY SH AH N Z B AE NG K
+nationsbank's N EY SH AH N Z B AE NG K S
+nationwide N EY SH AH N W AY D
+nationwide's N EY SH AH N W AY D Z
+native N EY T IH V
+natives N EY T IH V Z
+natividad N AH T IH V IH D AA D
+nativism N EY T IH V IH Z AH M
+nativist N EY T IH V IH S T
+nativity N AH T IH V AH T IY
+nato N EY T OW
+nato's N EY T OW Z
+natoli N AA T OW L IY
+natomas N EY T OW M AH Z
+nats N AE T S
+natsios N AE T S IY OW S
+natter N AE T ER
+nattering N AE T ER IH NG
+nattie N AE T IY
+nattily N AE T AH L IY
+natty N AE T IY
+natuna N AH T UW N AH
+natural N AE CH ER AH L
+natural's N AE CH ER AH L Z
+natural's(2) N AE CH R AH L Z
+natural(2) N AE CH R AH L
+naturalism N AE CH ER AH L IH Z AH M
+naturalism(2) N AE CH R AH L IH Z AH M
+naturalist N AE CH ER AH L AH S T
+naturalist(2) N AE CH R AH L AH S T
+naturalistic N AE CH ER AH L IH S T IH K
+naturalistic(2) N AE CH R AH L IH S T IH K
+naturalists N AE CH ER AH L IH S T S
+naturalists(2) N AE CH R AH L IH S T S
+naturalists(3) N AE CH ER AH L IH S
+naturalists(4) N AE CH R AH L IH S
+naturalization N AE CH ER AH L AH Z EY SH AH N
+naturalization(2) N AE CH R AH L AH Z EY SH AH N
+naturalize N AE CH ER AH L AY Z
+naturalize(2) N AE CH R AH L AY Z
+naturalized N AE CH ER AH L AY Z D
+naturalized(2) N AE CH R AH L AY Z D
+naturalizes N AE CH ER AH L AY Z IH Z
+naturalizes(2) N AE CH R AH L AY Z IH Z
+naturalizing N AE CH ER AH L AY Z IH NG
+naturalizing(2) N AE CH R AH L AY Z IH NG
+naturally N AE CH ER AH L IY
+naturally(2) N AE CH R AH L IY
+nature N EY CH ER
+nature's N EY CH ER Z
+natured N EY CH ER D
+naturedly N EY CH ER D L IY
+natures N EY CH ER Z
+natwest N AE T W EH S T
+natwest's N AE T W EH S T S
+natzke N AE T S K IY
+nau N OW
+nauer N AW ER
+nauert N AW ER T
+naugatuck N AO G AH T AH K
+naught N AO T
+naughton N AO T AH N
+naughty N AO T IY
+naugle N AO G AH L
+naugles N AO G AH L Z
+nault N AO L T
+nauman N AW M AH N
+naumann N AW M AH N
+naus N AO Z
+nausea N AO Z IY AH
+nauseam N AW Z IY M
+nauseate N AO Z IY EY T
+nauseated N AO Z IY EY T AH D
+nauseating N AO ZH IY EY T IH NG
+nauseous N AO SH AH S
+nauss N AO S
+nauta N AA UW T AH
+nautica N AO T AH K AH
+nautical N AO T AH K AH L
+nautilus N AO T AH L AH S
+nautilus's N AO T AH L AH S IH Z
+nav N AE V
+nava N AA V AH
+navajo N AA V AH HH OW
+navajo(2) N AE V AH HH OW
+navajos N AA V AH HH OW Z
+navajos(2) N AE V AH HH OW Z
+naval N EY V AH L
+navar N AA V AA R
+navarette N AE V ER EH T
+navarra N AA V AA R AH
+navarre N AA V AA R
+navarrete N AE V ER IY T
+navarrette N AE V ER EH T
+navarro N AH V AA R OW
+navas N AA V AH S
+navcom N AE V K AA M
+nave N EY V
+navel N EY V AH L
+navellier N AH V EH L Y ER
+navickas N AA V IY K AA Z
+navies N EY V IY Z
+navigable N AE V AH G AH B AH L
+navigate N AE V AH G EY T
+navigated N AE V AH G EY T IH D
+navigates N AE V AH G EY T S
+navigating N AE V AH G EY T IH NG
+navigation N AE V AH G EY SH AH N
+navigational N AE V AH G EY SH AH N AH L
+navigator N AE V AH G EY T ER
+navigators N AE V AH G EY T ER Z
+navin N AA V IY N
+navin-chandr N AA V IH N CH AA N D ER
+navin-chandra N AA V IH N CH AA N D R AH
+navis N AA V IH S
+navistar N AE V IH S T AA R
+navlab N AE V L AE B
+navratilova N AE V R AE T IH L OW V AH
+navratilova's N AE V R AE T IH L OW V AH Z
+navstar N AE V S T AA R
+navy N EY V IY
+navy's N EY V IY Z
+naw N AA
+nawrocki N AA V R OW T S K IY
+nawrot N AO R AH T
+nay N EY
+nayden N EY D IH N
+naylor N EY L ER
+nays N EY Z
+naysayer N EY S EY ER
+naysayers N EY S EY ER Z
+nayyar N EY Y AA R
+nazar N AA Z AA R
+nazarbayev N AA Z AH R B AY Y EH V
+nazareth N AE Z AH R IH TH
+nazarian N AH Z EH R IY AH N
+nazario N AA Z AA R IY OW
+nazer N EY Z ER
+nazer's N EY Z ER Z
+nazi N AA T S IY
+nazi's N AA T S IY Z
+nazionale N AA T S IY OW N AA L IY
+nazis N AA T S IY Z
+nazis' N AA T S IY Z
+nazism N AE Z IH Z AH M
+nazzaro N AA T S AA R OW
+ndau EH N D AW
+ne N IY
+ne'er N EH R
+ne(2) N AO R TH IY S T
+ne(3) EH N IY
+ne(4) N EY
+neace N IY S
+nead N IY D
+neagle N IY G AH L
+neal N IY L
+neal's N IY L Z
+neala N IY L AH
+neale N IY L
+nealey N IY L IY
+nealis N IY L IH S
+neall N IY L
+nealon N IY L AH N
+nealson N IY L S AH N
+nealy N IY L IY
+neanderthal N IY AE N D ER TH AO L
+neanderthals N IY AE N D ER TH AO L Z
+neapolitan N IY AH P AA L AH T AH N
+near N IH R
+nearby N IH R B AY
+neared N IH R D
+nearer N IH R ER
+nearest N IH R AH S T
+nearhood N IH R HH UH D
+nearing N IH R IH NG
+nearly N IH R L IY
+nears N IH R Z
+nearsighted N IY R S AY T IH D
+nearsightedness N IY R S AY T IH D N AH S
+neary N IH R IY
+neas N IY Z
+nease N IY Z
+neat N IY T
+neater N IY T ER
+neatest N IY T AH S T
+neathery N EH TH ER IY
+neatly N IY T L IY
+neatness N IY T N AH S
+neault N OW
+neave N IY V
+neaves N IY V Z
+nebeker N EH B IH K ER
+nebel N EH B AH L
+nebergall N IY B ER G AH L
+neblett N EH B L IH T
+nebraska N AH B R AE S K AH
+nebraska's N AH B R AE S K AH Z
+nebraskan N AH B R AE S K AH N
+nebraskans N AH B R AE S K AH N Z
+nebula N EH B Y AH L AH
+nebulizer N EH B Y AH L AY Z ER
+nebulous N EH B Y AH L AH S
+nec N EH K
+necaise N EH K AY S
+necci N EH CH IY
+necessarily N EH S AH S EH R AH L IY
+necessary N EH S AH S EH R IY
+necessitate N AH S EH S AH T EY T
+necessitated N AH S EH S AH T EY T AH D
+necessitates N AH S EH S AH T EY T S
+necessitating N AH S EH S IH T EY T IH NG
+necessities N AH S EH S IH T IY Z
+necessity N AH S EH S AH T IY
+necessity(2) N AH S EH S IH T IY
+nechayev N EH CH AY EH V
+nechyba N EH CH IY B AH
+neck N EH K
+necked N EH K T
+necker N EH K ER
+necklace N EH K L AH S
+necklaces N EH K L AH S IH Z
+necklacing N EH K L AH S IH NG
+necks N EH K S
+necktie N EH K T AY
+neckties N EH K T AY Z
+neckwear N EH K W EH R
+neco N IY K OW
+neco's N IY K OW Z
+necrologist N AH K R AO L AH JH IH S T
+necrologists N AH K R AO L AH JH IH S T S
+necrologists(2) N AH K R AO L AH JH IH S
+necrology N AH K R AO L AH JH IY
+necromancer N EH K R AH M AE N S ER
+necromancy N EH K R AH M AE N S IY
+necropolis N AH K R AA P AH L AH S
+necrosis N AH K R OW S AH S
+nectar N EH K T ER
+necula N EH K Y UW L AH
+ned N EH D
+ned's N EH D Z
+neda N EY D AH
+nedd N EH D
+nedda N EH D AH
+neddick N EH D IH K
+neddo N EH D OW
+nedeau N IH D OW
+nedel N IY D AH L
+nederland N EH D ER L AH N D
+nederlanden N EH D ER L AE N D AH N
+nederlander N EH D ER L AE N D ER
+nederlandsche N EH D ER L AE N D SH IY
+nederlandse N EH D ER L AE N D S IY
+nedlloyd N EH D AH L OY D
+nedlloyd(2) N EH D L OY D
+nedrow N EH D R OW
+nedved N EH D V AH D
+nedved(2) N EH D V EH D
+nee N IY
+neeb N IY B
+neece N IY S
+neeco N IY K OW
+need N IY D
+needed N IY D AH D
+needed(2) N IY D IH D
+needelman N IY D AH L M AH N
+needful N IY D F AH L
+needham N IY D AH M
+needham's N IY D AH M Z
+needier N IY D IY ER
+neediest N IY D IY IH S T
+needing N IY D IH NG
+needle N IY D AH L
+needled N IY D AH L D
+needlefish N IY D AH L F IH SH
+needlelike N IY D AH L L AY K
+needleman N IY D AH L M AH N
+needlepoint N IY D AH L P OY N T
+needler N IY D AH L ER
+needler(2) N IY D L ER
+needles N IY D AH L Z
+needless N IY D L AH S
+needlessly N IY D L AH S L IY
+needlework N IY D AH L W ER K
+needling N IY D L IH NG
+needn't N IY D AH N T
+needs N IY D Z
+needy N IY D IY
+neef N IY F
+neel N IY L
+neeld N IY L D
+neeley N IY L IY
+neels N IY L Z
+neely N IY L IY
+neeman N IY M AH N
+neenan N IY N AH N
+neeper N IY P ER
+neer N IH R
+nees N IY Z
+neese N IY Z
+neeson N IY S AH N
+neet N IY T
+nefarious N AH F EH R IY AH S
+neff N EH F
+neft N EH F T
+neftegorsk N EH F T IH G AO R S K
+neg N EH G
+negara N EH G AA R AH
+negate N IH G EY T
+negated N IY G EY T IH D
+negated(2) N IH G EY T AH D
+negates N IH G EY T S
+negating N IH G EY T IH NG
+negation N AH G EY SH AH N
+negative N EH G AH T IH V
+negatively N EH G AH T IH V L IY
+negatives N EH G AH T IH V Z
+negativism N EH G AH T IH V IH Z AH M
+negativity N EH G AH T IH V AH T IY
+negatron N EH G AH T R AA N
+negatrons N EH G AH T R AA N Z
+negent N EH G AH N T
+negent(2) N EH JH AH N T
+negev N EH G EH V
+neglect N AH G L EH K T
+neglect(2) N IH G L EH K T
+neglected N AH G L EH K T AH D
+neglected(2) N IH G L EH K T IH D
+neglectful N IH G L EH K T F AH L
+neglecting N IH G L EH K T IH NG
+neglects N IH G L EH K T S
+negley N EH G L IY
+neglia N EH G L IY AH
+negligence N EH G L AH JH AH N S
+negligence(2) N EH G L IH JH AH N S
+negligent N EH G L AH JH AH N T
+negligent(2) N EH G L IH JH AH N T
+negligently N EH G L IH JH AH N T L IY
+negligible N EH G L AH JH AH B AH L
+negligible(2) N EH G L IH JH AH B AH L
+negotiable N AH G OW SH AH B AH L
+negotiate N AH G OW SH IY EY T
+negotiate(2) N IH G OW SH IY EY T
+negotiated N AH G OW SH IY EY T AH D
+negotiated(2) N IH G OW SH IY EY T IH D
+negotiates N IH G OW SH IY EY T S
+negotiating N IH G OW SH IY EY T IH NG
+negotiation N IH G OW SH IY EY SH AH N
+negotiations N AH G OW SH IY EY SH AH N Z
+negotiations(2) N IH G OW SH IY EY SH AH N Z
+negotiator N AH G OW SH IY EY T ER
+negotiator's N IH G OW SH IY EY T ER Z
+negotiator(2) N IH G OW SH IY EY T ER
+negotiators N IH G OW SH IY EY T ER Z
+negotiators' N AH G OW SH IY EY T ER Z
+negrete N EH G R IY T
+negri N EH G R IY
+negrin N EH G R IH N
+negro N IY G R OW
+negroes N IY G R OW Z
+negroid N IY G R OY D
+negron N EH G R AH N
+negroni N EH G R OW N IY
+negropalpus N EH G R AH P AA L P AH S
+negros N IY G R OW Z
+negs N EH G Z
+negu N EH G UW
+negus N IY G AH S
+nehemiah N IY AH M AY AH
+neher N EY ER
+nehls N EH L Z
+nehring N EH R IH NG
+nehru N EY R UW
+neibauer N AY B AW ER
+neiberg N AY B ER G
+neibert N IY B ER T
+neice N IY S
+neider N IY D ER
+neidhardt N AY D HH AA R T
+neidhart N AY D HH AA R T
+neidigh N IY D AY
+neidl N IY D AH L
+neidlinger N AY D AH L IH NG ER
+neidlinger(2) N IY D L IH NG ER
+neier N AY ER
+neifert N IY F ER T
+neiger N AY G ER
+neighbor N EY B ER
+neighbor's N EY B ER Z
+neighborhood N EY B ER HH UH D
+neighborhood's N EY B ER HH UH D Z
+neighborhoods N EY B ER HH UH D Z
+neighboring N EY B ER IH NG
+neighborly N EY B ER L IY
+neighbors N EY B ER Z
+neighbors' N EY B ER Z
+neighmond N EY M AH N D
+neighmond's N EY M AH N D Z
+neikirk N IY K ER K
+neil N IY L
+neil's N IY L Z
+neilan N IY L AH N
+neild N IY L D
+neile N IY L
+neill N IY L
+neils N IY L Z
+neilsen N AY L S AH N
+neilson N IY L S AH N
+neiman N IY M AH N
+neimeyer N AY M AY ER
+nein N IY N
+neira N EH R AH
+neis N IY Z
+neisen N AY S AH N
+neises N IY Z IH Z
+neisler N AY S AH L ER
+neisler(2) N AY S L ER
+neiss N IY S
+neiswender N AY S W EH N D ER
+neither N IY DH ER
+neither(2) N AY DH ER
+neitz N IY T S
+neitzel N AY T Z AH L
+neitzke N AY T S K IY
+nej N EY
+nejamatin N EH JH AH M AE T IH N
+nekia N AH K IY AH
+nekoosa N IH K UW S AH
+nekton N EH K T AH N
+nel N EH L
+nela N EH L AH
+nelda N EH L D AH
+nelia N EH L IY AH
+nelina N EH L IY N AH
+nelita N EH L IY T AH
+nell N EH L
+nella N EH L AH
+nellcor N EH L K AO R
+nelle N EH L
+neller N EH L ER
+nelles N EH L Z
+nellette N EH L EH T
+nelli N EH L IY
+nelliana N EH L IY AE N AH
+nellie N EH L IY
+nelligan N EH L IH G AH N
+nellis N EH L IH S
+nellwyn N EH L W IH N
+nelly N EH L IY
+nelms N EH L M Z
+neloms N EH L AH M Z
+nelon N EH L AH N
+nels N EH L Z
+nelsen N EH L S AH N
+nelson N EH L S AH N
+nelson's N EH L S AH N Z
+nematode N EH M AH T OW D
+nematodes N EH M AH T OW D Z
+nemean N IY M IY AH N
+nemec N EH M IH K
+nemecek N EH M IH S IH K
+nemer N IY M ER
+nemeroff N EH M ER AO F
+nemes N IY M Z
+nemesis N EH M AH S IH S
+nemeth N EY M IH TH
+nemetz N EH M IH T S
+nemir N AH M ER
+nemitz N EH M IH T S
+nemmers N EH M ER Z
+nemo N EH M OW
+nemos N IY M OW Z
+nemours N IH M AO R Z
+nendick N EH N D IH K
+nene N IY N
+nenet N EH N IH T
+neni N EH N IY
+neni's N EH N IY S
+nenninger N EH N IH NG ER
+neo N IY OW
+neoax N IY OW AE K S
+neoclassic N IY OW K L AE S IH K
+neoclassical N IY OW K L AE S IH K AH L
+neoconservative N IY OW K AH N S ER V AH T IH V
+neoconservatives N IY OW K AH N S ER V AH T IH V Z
+neola N IY AA L AH
+neoliberal N IY OW L IH B ER AH L
+neoliberals N IY OW L IH B ER AH L Z
+neoma N EY OW M AH
+neon N IY AA N
+neonatal N IY OW N EY T AH L
+neonazi N IY OW N AA T S IY
+neonazis N IY OW N AA T S IY Z
+neons N IY AA N Z
+neophyte N IY AH F AY T
+neophytes N IY AH F AY T S
+neoplasm N IY AH P L AE Z AH M
+neoplatonic N IY OW P L AH T AA N IH K
+neoplatonist N IY OW P L EY T AH N AH S T
+neopolis N IY AO P AH L IH S
+neopositivism N IY OW P AO Z AH T AH V IH Z AH M
+neopositivist N IY OW P AO Z AH T AH V IH S T
+neoprene N IY AH P R IY N
+neoprene(2) N IY OW P R IY N
+neoprobe N IY OW P R OW B
+neorx N IY OW R EH K S
+neotenic N IY AH T IY N IH K
+neoteny N IY AA T AH N IY
+nepa N IY P AH
+nepal N AH P AO L
+nepalese N EH P AH L IY Z
+nepali N AH P AO L IY
+nephew N EH F Y UW
+nephew's N EH F Y UW Z
+nephews N EH F Y UW Z
+nephridium N AH F R IH D IY AH M
+nephrite N EH F R AY T
+nephron N EH F R AA N
+nephrosis N AH F R OW S AH S
+nepl N EH P AH L
+nepl(2) EH N IY P IY EH L
+neponset N AH P AA N S IH T
+nepool N AH P UW L
+nepotism N EH P AH T IH Z AH M
+neptune N EH P T UW N
+neptunium N EH P T UW N IY AH M
+nerco N ER K OW
+nerd N ER D
+nerds N ER D Z
+nerdy N ER D IY
+nerenberg N IH R AH N B ER G
+neri N EH R IY
+nerice N EH R IH S
+nerine N EH R IY N
+nerio N EH R IY OW
+neritic N ER IH T IH K
+nerl N ER L
+nerlich N ER L IH K
+nerney N ER N IY
+nero N IH R OW
+nero's N IH R OW Z
+nerone N EH R AH N
+nerren N EH R AH N
+neruda N AH R UW D AH
+nervana N ER V AE N AH
+nerve N ER V
+nerves N ER V Z
+nervion N ER V IY AH N
+nervosa N ER V OW S AH
+nervous N ER V AH S
+nervously N ER V AH S L IY
+nervousness N ER V AH S N AH S
+nervy N ER V IY
+nes N EH S
+nesbit N EH S B IH T
+nesbitt N EH Z B IH T
+nesby N EH S B IY
+nesci N EH S IY
+nesheim N EH S HH AY M
+nesi N EH S IY
+nesler N EH S AH L ER
+nesler's N EH S AH L ER Z
+nesler's(2) N EH S L ER Z
+nesler(2) N EH S L ER
+nesmith N EH Z M IH TH
+ness N EH S
+nessa N EH S AH
+nessel N EH S AH L
+nessen N IY S AH N
+nesser N EH S ER
+nesseth N EH S IH TH
+nessi N EH S IY
+nessie N EH S IY
+nessler N EH S L ER
+nest N EH S T
+nest-egg N EH S T EY G
+nesta N EH S T AH
+neste N EH S T
+nestea N EH S T IY AH
+nested N EH S T AH D
+nested(2) N EH S T IH D
+nester N EH S T ER
+nesters N EH S T ER Z
+nesting N EH S T IH NG
+nestle N EH S AH L
+nestle's N EH S AH L Z
+nestle's(2) N EH S L IY Z
+nestle(2) N EH S L IY
+nestled N EH S AH L D
+nestler N EH S AH L ER
+nestler(2) N EH S L ER
+nestles N EH S AH L Z
+nestling N EH S T L IH NG
+nestling(2) N EH S L IH NG
+nestlings N EH S T L IH NG Z
+nestlings(2) N EH S L IH NG Z
+nestor N EH S T ER
+nestorian N EH S T AO R IY AH N
+nestorianism N EH S T AO R IY AH N IH Z AH M
+nests N EH S T S
+net N EH T
+netan N EH T AH N
+netanyahu N EH T AH N Y AA HH UW
+netanyahu's N EH T AH N Y AA HH UW Z
+netback N EH T B AE K
+netcom N EH T K AA M
+neth N EH TH
+nether N EH DH ER
+nethercutt N EH TH ER K AH T
+netherland N EH DH ER L AH N D
+netherlandic N EH DH ER L AE N D IH K
+netherlands N EH DH ER L AH N D Z
+netherlands' N EH TH ER L AE N D Z
+nethers N EH DH ER Z
+netherton N EH DH ER T AH N
+netherworld N EH DH ER W ER L D
+nethery N EH DH ER IY
+nethuva N EH TH UW V AH
+nethuva's N EH TH UW V AH Z
+netlike N EH T L AY K
+neto N EH T OW
+nets N EH T S
+netscape N EH T S K EY P
+netscape's N EH T S K EY P S
+nett N EH T
+netta N EH T AH
+netted N EH T IH D
+netter N EH T ER
+netterville N EH T ER V IH L
+nettesheim N EH T IH S SH AY M
+nettie N EH T IY
+netting N EH T IH NG
+nettle N EH T AH L
+nettled N EH T AH L D
+nettles N EH T AH L Z
+nettlesome N EH T AH L S AH M
+nettleton N EH T AH L T AH N
+nettleton's N EH T AH L T AH N Z
+netto N EH T OW
+netty N EH T IY
+netview N EH T V Y UW
+netware N EH T W EH R
+network N EH T W ER K
+network's N EH T W ER K S
+networked N EH T W ER K T
+networking N EH T W ER K IH NG
+networks N EH T W ER K S
+networks' N EH T W ER K S
+networth N EH T W ER TH
+netz N EH T S
+netzel N EH T Z AH L
+netzer N EH T Z ER
+netzley N EH T S L IY
+neu N OY
+neubauer N UW B AW ER
+neubecker N UW B EH K ER
+neuber N UW B ER
+neuberger N UW B ER G ER
+neubert N UW B ER T
+neuburg N UW B ER G
+neuburger N UW B ER G ER
+neudecker N UW D IH K ER
+neue N UW IY
+neuendorf N UW AH N D AO R F
+neuendorffer N UW N D AO R F ER
+neuenfeldt N UW AH N F EH L T
+neuenschwander N UW AH N SH W AO N D ER
+neuer N OY ER
+neufeld N UW F EH L D
+neufeld's N UW F EH L D Z
+neugebauer N UW G AH B AW ER
+neugent N UW JH AH N T
+neuhart N UW HH AA R T
+neuharth N UW HH AA R TH
+neuhaus N UW HH AW S
+neuhauser N UW HH AW Z ER
+neuhoff N UW HH AO F
+neukam N UW K AH M
+neukirchen N UW K ER CH AH N
+neukirchen(2) N UW K IH R CH AH N
+neukom N UW K AA M
+neumaier N UW M AY ER
+neuman N UW M AH N
+neumann N UW M AH N
+neumayer N UW M EY ER
+neumeier N UW M AY ER
+neumeister N UW M AY S T ER
+neumeyer N UW M AY ER
+neumiller N UW M AH L ER
+neuner N UW N ER
+neupert N UW P ER T
+neupogen N UW P OW JH EH N
+neural N UH R AH L
+neural(2) N Y UH R AH L
+neurasthenia N UH R AE S TH IY N IY AH
+neuro N UH R OW
+neurofibromatosis N UH R OW F AY B R OW M AH T OW S IH S
+neurohr N UH R AO R
+neurologic N UH R AH L AA JH IH K
+neurological N UH R AH L AA JH IH K AH L
+neurologist N UH R AA L AH JH AH S T
+neurologists N UH R AA L AH JH AH S T S
+neurologists(2) N UH R AA L AH JH AH S S
+neurologists(3) N UH R AA L AH JH AH S
+neurology N UH R AA L AH JH IY
+neurons N UH R AA N Z
+neuropathy N UH R OW P AE TH IY
+neuropathy(2) N UH R AO P AH TH IY
+neuropathy(3) N Y UH R OW P AE TH IY
+neuroscience N Y UH R OW S AY AH N S
+neuroscientist N Y UH R OW S AY AH N T IH S T
+neuroscientist(2) N Y UH R OW S AY AH N IH S T
+neuroses N UH R OW S IY Z
+neurosis N UH R OW S AH S
+neurosurgeon N UH R OW S ER JH AH N
+neurosurgeons N UH R OW S ER JH AH N Z
+neurosurgery N UH R OW S ER JH ER IY
+neuroth N UH R AO TH
+neurotic N UH R AA T IH K
+neuser N UW S ER
+neustadt N UW SH T AE T
+neustine N UW S T AY N
+neuter N UW T ER
+neutered N UW T ER D
+neutering N UW T ER IH NG
+neutral N UW T R AH L
+neutralism N UW T R AH L IH Z AH M
+neutralist N UW T R AH L AH S T
+neutrality N UW T R AE L AH T IY
+neutralization N UW T R AH L AH Z EY SH AH N
+neutralize N UW T R AH L AY Z
+neutralized N UW T R AH L AY Z D
+neutralizes N UW T R AH L AY Z IH Z
+neutralizing N UW T R AH L AY Z IH NG
+neutrally N UW T R AH L IY
+neutrals N UW T R AH L Z
+neutrino N UW T R IY N OW
+neutrinos N UW T R IY N OW Z
+neutrogena N UW T R AH JH IY N AH
+neutron N UW T R AA N
+neutrons N UW T R AA N Z
+neuville N UW V IH L
+neuwirth N UW W ER TH
+neuzil N UW Z AH L
+neva N EY V AH
+nevada N AH V AA D AH
+nevada's N AH V AE D AH Z
+nevada's(2) N AH V AA D AH Z
+nevada(2) N AH V AE D AH
+nevadan N AH V AE D AH N
+nevadans N AH V AE D AH N Z
+nevala N EY V AA L AH
+nevarach N AH V AA R AH CH
+nevarach's N AH V AA R AH CH AH Z
+nevarez N EY V AA R EH Z
+neve N IY V
+neveau N IH V OW
+nevel N EY V EH L
+nevels N EH V AH L Z
+never N EH V ER
+neverland N EH V ER L AE N D
+neverland(2) N EH V ER L AH N D
+nevermind N EH V ER M AY N D
+nevermore N EH V ER M AO R
+nevers N EH V ER Z
+nevertheless N EH V ER DH AH L EH S
+neves N IY V Z
+neveu N IH V UW
+nevil N EY V IY L
+nevile N EY V AY L
+nevill N EH V IH L
+neville N EH V IH L
+nevills N EH V IH L Z
+nevils N EH V AH L Z
+nevin N EH V IH N
+nevin's N EH V IH N Z
+nevins N EH V IH N Z
+nevis N EH V IH S
+nevitt N EH V IH T
+nevius N IY V IY IH S
+new N UW
+new(2) N Y UW
+new-bedford N UW B EH D F ER D
+new-bern N UW B ER N
+new-caledonia N UW K AE L AH D OW N IY AH
+new-delhi N UW D EH L IY
+new-hampshire N UW HH AE M P SH ER
+new-hampshire's N UW HH AE M P SH ER Z
+new-hampshirite N UW HH AE M P SH ER AY T
+new-hampshirites N UW HH AE M P SH ER AY T S
+new-haven N UW HH EY V AH N
+new-jersey N UW JH ER Z IY
+new-jersey's N UW JH ER Z IY Z
+new-london N UW L AH N D AH N
+new-mexican N UW M EH K S IH K AH N
+new-mexicans N UW M EH K S IH K AH N Z
+new-mexico N UW M EH K S AH K OW
+new-mexico's N UW M EH K S AH K OW Z
+new-orleans N UW AO R L IY N Z
+new-orleans(2) N Y UW AO R L IY N Z
+new-years N UW Y IY R Z
+new-york N UW Y AO R K
+new-york's N UW Y AO R K S
+new-york-city N UW Y AO R K S IH T IY
+new-yorker N UW Y AO R K ER
+new-yorkers N UW Y AO R K ER Z
+new-zealand N UW Z IY L AH N D
+newall N UW AO L
+newark N UW ER K
+newark's N Y UW ER K S
+newark(2) N Y UW ER K
+newbauer N UW B AW ER
+newberg N UW B ER G
+newberger N UW B ER G ER
+newbern N UW B ER N
+newberry N UW B EH R IY
+newbery N UW B EH R IY
+newbill N UW B IH L
+newbold N UW B OW L D
+newborn N UW B AO R N
+newborns N UW B AO R N Z
+newbraudwick N UW B R AA D W IH K
+newbridge N UW B R IH JH
+newbrough N UW B R AW
+newburg N UW B ER G
+newburger N UW B ER G ER
+newburgh N UW B ER G
+newburn N UW B ER N
+newbury N UW B EH R IY
+newbury's N UW B EH R IY Z
+newby N UW B IY
+newcastle N UW K AE S AH L
+newcastle's N UW K AE S AH L Z
+newcom N UW K AH M
+newcomb N UW K AH M
+newcombe N UW K AH M
+newcome N UW K AH M
+newcomer N UW K AH M ER
+newcomers N UW K AH M ER Z
+newcor N UW K AO R
+newedge N UW AH JH
+newell N UW AH L
+newell's N UW AH L Z
+newer N UW ER
+newest N UW AH S T
+newey N UW IY
+newfangle N UW F AE NG G AH L
+newfangled N UW F AE NG G AH L D
+newfield N UW F IY L D
+newfound N UW F AW N D
+newfoundland N UW F AH N D L AH N D
+newgard N UW G ER D
+newgate N UW G EY T
+newgateway N UW G EY T W EY
+newhall N UW HH AO L
+newhall's N UW HH AO L Z
+newhard N UW HH AA R D
+newhart N UW HH AA R T
+newhouse N UW HH AW S
+newill N IY W IH L
+newingham N UW IH NG HH AE M
+newish N UW IH SH
+newkirk N UW K ER K
+newlan N UW L AH N
+newland N UW L AH N D
+newley N UW L IY
+newlin N UW L IH N
+newlon N UW L AH N
+newlun N UW L AH N
+newly N UW L IY
+newlyn N UW L IH N
+newlywed N UW L IY W EH D
+newlyweds N UW L IY W EH D Z
+newman N UW M AH N
+newman's N UW M AH N Z
+newmann N UW M AH N
+newmark N UW M AA R K
+newmarket N UW M AA R K AH T
+newmeyer N UW M AY ER
+newmont N UW M AA N T
+newmont's N UW M AA N T S
+newmyer N UW M IY ER
+newnam N UW N AH M
+newness N UW N AH S
+neworld N EH W ER L D
+neworld(2) N UW ER L D
+newport N UW P AO R T
+newport's N UW P AO R T S
+newport-news N UW P AO R T N UW Z
+newquist N UW K W IH S T
+news N UW Z
+news' N UW Z
+news's N UW Z IH Z
+news(2) N Y UW Z
+newscast N UW Z K AE S T
+newscaster N UW Z K AE S T ER
+newscasters N UW Z K AE S T ER Z
+newscasts N UW Z K AE S T S
+newscasts(2) N UW Z K AE S S
+newscasts(3) N UW Z K AE S
+newscorp N UW Z K AO R P
+newscorp's N UW Z K AO R P S
+newsday N UW Z D EY
+newsday's N UW Z D EY Z
+newsflash N UW S F L AE SH
+newsflashes N UW S F L AE SH AH Z
+newsgroup N UW Z G R UW P
+newsgroups N UW Z G R UW P S
+newsham N UW SH AH M
+newshour N UW Z AW R
+newsies N UW Z IY Z
+newsletter N UW Z L EH T ER
+newsletter's N UW Z L EH T ER Z
+newsletters N UW Z L EH T ER Z
+newslink N UW Z L IH NG K
+newslink's N UW Z L IH NG K S
+newsmagazine N UW Z M AE G AH Z IY N
+newsmagazines N UW Z M AE G AH Z IY N Z
+newsmaker N UW Z M EY K ER
+newsmakers N UW Z M EY K ER Z
+newsman N UW Z M AE N
+newsman(2) N UW Z M AH N
+newsmen N UW Z M IH N
+newsnight N UW Z N AY T
+newsom N UW Z AH M
+newsome N UW S AH M
+newson N UW S AH N
+newspaper N UW Z P EY P ER
+newspaper's N UW Z P EY P ER Z
+newspaperman N UW Z P EY P ER M AE N
+newspapermen N UW Z P AE P ER M AH N
+newspapers N UW Z P EY P ER Z
+newspapers' N UW Z P EY P ER Z
+newspeak N UW S P IY K
+newspeople N UW Z P IY P AH L
+newsperson N UW Z P ER S AH N
+newspersons N UW Z P ER S AH N Z
+newsprint N UW Z P R IH N T
+newsreel N UW Z R IY L
+newsreels N UW Z R IY L Z
+newsroom N UW Z R UW M
+newsroom's N UW Z R UW M Z
+newsrooms N UW Z R UW M Z
+newsstand N UW Z S T AE N D
+newsstands N UW Z S T AE N D Z
+newstrom N UW Z T R AH M
+newsum N UW Z AH M
+newswanger N UW Z W AO NG ER
+newsweek N UW Z W IY K
+newsweek's N UW Z W IY K S
+newsweekly N UW Z W IY K L IY
+newswire N UW Z W AY R
+newswires N UW Z W AY R Z
+newswoman N UW Z W UH M AH N
+newswomen N UW Z W IH M AH N
+newsworthy N UW Z W ER DH IY
+newsy N UW Z IY
+newt N UW T
+newt's N UW T S
+newton N UW T AH N
+newton's N UW T AH N Z
+newtonchik N UW T AA N CH IH K
+newtonian N UW T OW N IY AH N
+newtown N UW T AW N
+newtowne N UW T AW N
+newts N UW T S
+newvector N UW V EH K T ER
+newville N UW V IH L
+newwave N UW W EY V
+nex N EH K S
+nexgen N EH K S JH EH N
+nexis N EH K S IH S
+nexrad N EH K S R AE D
+next N EH K S T
+next's N EH K S T S
+next(2) N EH K S
+nextel N EH K S T EH L
+nextel's N EH K S T EH L Z
+nextstep N EH K S T S T EH P
+nextstep(2) N EH K S T EH P
+nexus N EH K S AH S
+ney N EY
+neyens N AY N Z
+neyer N EY ER
+neyhart N EY HH AA R T
+neyland N EY L AH N D
+neylon N EY L AH N
+neyman N EY M AH N
+neysa N EY S AH
+nez N EH Z
+ng EH NG
+ng(2) IH NG
+ngai G AY
+ngai(2) EH N G AY
+ngema EH N JH EH M AA
+nghi G IY
+nghi(2) EH N G IY
+ngo G OW
+ngo's G OW Z
+ngor EH NG AO R
+ngor(2) G AO R
+ngos G OW Z
+ngueppe EH N G EH P
+ngueppe(2) EH N G EH P IY
+nguyen N UW Y EH N
+ni N IY
+niacin N AY AH S AH N
+niacin(2) N AY AH S IH N
+niad N AY AE D
+niagara N AY AE G R AH
+niagara's N AY AE G R AH Z
+niaid N AY EY D
+nial N AY AH L
+niall N AY L
+nib N IH B
+nibbe N IH B
+nibble N IH B AH L
+nibbled N IH B AH L D
+nibbles N IH B AH L Z
+nibbling N IH B AH L IH NG
+nibbling(2) N IH B L IH NG
+nibert N IH B ER T
+niblack N IH B L AE K
+niblett N IH B L IH T
+niblock N IH B L AA K
+nibs N IH B Z
+nic EH N AY S IY
+nic(2) N IH K
+nicandros N IH K AE N D R OW S
+nicaragua N IH K ER AA G W AH
+nicaragua's N IH K ER AA G W AH Z
+nicaraguan N IH K ER AA G W AH N
+nicaraguans N IH K ER AA G W AH N Z
+nicastro N IH K AE S T R OW
+niccoli N IY K OW L IY
+niccolite N IH K AH L AY T
+niccum N IH K AH M
+nice N AY S
+nice(2) N IY S
+nicely N AY S L IY
+nicen N AY S AH N
+niceness N AY S N AH S
+nicer N AY S ER
+nicest N AY S IH S T
+niceties N AY S IH T IY Z
+nicety N AY S IH T IY
+niche N IH CH
+nichelson N IH CH IH L S AH N
+niches N IH CH IH Z
+nichol N IH K AO L
+nichola N IH HH OW L AH
+nicholas N IH K AH L AH S
+nicholas' N IH K AH L AH S
+nicholas'(2) N IH K L AH S
+nicholas's N IH K AH L AH S IH Z
+nicholas's(2) N IH K L AH S IH Z
+nicholas(2) N IH K L AH S
+nichole N IH K OW L
+nicholes N IH K OW L Z
+nicholi N IH K AH L AY
+nicholl N IH K AH L
+nicholls N IH K AH L Z
+nichols N IH K AH L Z
+nichols' N IH K AH L Z
+nichols's N IH K AH L Z IH Z
+nicholson N IH K AH L S AH N
+nicholson's N IH K AH L S AH N Z
+nichter N IH K T ER
+nick N IH K
+nick's N IH K S
+nicked N IH K T
+nickel N IH K AH L
+nickel's N IH K AH L Z
+nickell N IH K AH L
+nickelodeon N IH K IH L OW D IY AH N
+nickels N IH K AH L Z
+nickelson N IH K IH L S AH N
+nickens N IH K AH N Z
+nickerson N IH K ER S AH N
+nickeson N IH K IH S AH N
+nickey N IH K IY
+nicki N IH K IY
+nicklas N IH K L AH Z
+nicklaus N IH K L AH S
+nicklaus's N IH K L AH S IH Z
+nickle N IH K AH L
+nickleby N IH K AH L B IY
+nickles N IH K AH L Z
+nickless N IH K L AH S
+nicklin N IH K L IH N
+nicklow N IH K L OW
+nickname N IH K N EY M
+nicknamed N IH K N EY M D
+nicknames N IH K N EY M Z
+nickol N IH K AH L
+nickolas N IH K AH L AH Z
+nickoloff N IH K AH L AO F
+nickols N IH K AH L Z
+nickolson N IH K OW L S AH N
+nicks N IH K S
+nickson N IH K S AH N
+nickum N IH K AH M
+nicky N IH K IY
+nicky's N IH K IY Z
+niclaneshia N IH K L AH N EH SH AH
+niclaneshia's N IH K L AH N EH SH AH Z
+nicley N IH K L IY
+nico N IY K OW
+nicodemo N IY K OW D EY M OW
+nicoderm N IH K AH D ER M
+nicol N IH K AH L
+nicola N IH K OW L AH
+nicolae N IH K OW L AY
+nicolai N IY K OW L AA IY
+nicolaides N IH K AH L EY D Z
+nicolaisen N IH K AH L AY S AH N
+nicolas N IH K AH L AH S
+nicolau N IH K AH L AW
+nicolaus N IH K AH L AW Z
+nicolay N IH K AH L EY
+nicole N IH K OW L
+nicole's N IH K OW L Z
+nicolet N IH K AH L EH T
+nicoletta N IH K AH L EH T AH
+nicolette N IH K AH L EH T
+nicoletti N IY K OW L EH T IY
+nicoletti(2) N IH K AH L EH T IY
+nicoli N IY K OW L IY
+nicolin N IH K AH L IH N
+nicolina N IY K OW L IY N AH
+nicoline N IY K OW L IY N IY
+nicolini N IY K OW L IY N IY
+nicoll N IH K AH L
+nicolle N IH K OW L
+nicollier N IH K OW L Y ER
+nicolls N IH K AH L Z
+nicolo N IH K AH L OW
+nicoloff N IH K AH L AO F
+nicolosi N IY K OW L OW S IY
+nicols N IH K AH L Z
+nicolson N IH K OW L S AH N
+nicor N AY K AO R
+nicorette N IH K ER EH T
+nicosia N IH K AH S IY AH
+nicoski N IH K AO S K IY
+nicoson N IH K AH S AH N
+nicotera N IY K OW T EH R AH
+nicotine N IH K AH T IY N
+nicotine's N IH K AH T IY N Z
+nicotra N IH K AA T R AH
+nida N IY D AH
+nidal N IH D AA L
+nidal's N IH D AA L Z
+niday N AY D EY
+nidiffer N IH D IH F ER
+nie N IY
+nie(2) N AY
+niebauer N IY B AW ER
+niebling N IY B AH L IH NG
+niebling(2) N IY B L IH NG
+niebuhr N IY B UH R
+niebur N IY B ER
+niece N IY S
+niece's N IY S IH Z
+nieces N IY S IH Z
+nied N IY D
+niedbala N IY D B AA L AH
+niedbalski N IY D B AA L S K IY
+nieder N IY D ER
+niederer N IY D ER ER
+niederhauser N IY D ER HH AW Z ER
+niederman N AY D ER M AH N
+niedermeier N IY D ER M AY ER
+niedermeyer N IY D ER M AY ER
+niedzielski N IY JH IY L S K IY
+niedzwiecki N IY JH V IY T S K IY
+niehaus N IY HH AW S
+niehaus(2) N AY HH AW S
+niehoff N IY HH AO F
+niekamp N IY K AE M P
+niel N IY L
+nieland N IY L AH N D
+nield N IY L D
+nields N IY L D Z
+niels N IY L Z
+nielsen N IY L S AH N
+nielsen's N IY L S AH N Z
+nielson N IY L S AH N
+nieman N IY M AH N
+niemann N IY M AH N
+niemczyk N IY M CH IH K
+niemeier N IY M AY ER
+niemela N IY M EH L AH
+niemeyer N IY M AY ER
+niemi N IY M IY
+niemiec N IY M IY K
+niemoeller N AY M AO L ER
+niemuth N IY M AH TH
+nienaber N IY N AH B ER
+nienhaus N IY N HH AW S
+nienhuis N IY N HH UW IH Z
+nienow N IY N OW
+nier N IY ER
+nierenberg N IH R AH N B ER G
+nierman N IH R M AH N
+nies N AY Z
+niese N IY Z
+niesen N IY S AH N
+niess N IY S
+nieto N IY T OW
+nieto's N IY T OW Z
+nieto's(2) N IY AH T OW Z
+nieto(2) N IY AH T OW
+nietzsche N IY CH IY
+nieves N IY EH V EH S
+niezgoda N IY Z G OW D AH
+nifedipine N AY F EH D AH P IY N
+nifedipine(2) N AH F EH D AH P IY N
+nifong N IH F AO NG
+nifty N IH F T IY
+nigel N AY JH AH L
+niger N AY JH ER
+nigeria N AY JH IH R IY AH
+nigeria's N AY JH IH R IY AH Z
+nigerian N AY JH IH R IY AH N
+nigerians N AY JH IH R IY AH N Z
+nigg N IH G
+niggard N IH G ER D
+niggardliness N IH G ER D L IY N AH S
+niggardly N IH G ER D L IY
+nigger N IH G ER
+nigger's N IH G ER Z
+niggers N IH G ER Z
+nigh N AY
+nighswonger N AY S W AO NG ER
+night N AY T
+night's N AY T S
+nightclub N AY T K L AH B
+nightclubs N AY T K L AH B Z
+nightengale N AY T IH NG G AH L
+nightengale's N AY T IH NG G AH L Z
+nightengales N AY T IH NG G AH L Z
+nighter N AY T ER
+nighters N AY T ER Z
+nightfall N AY T F AO L
+nighthawk N AY T HH AO K
+nighthawks N AY T HH AO K S
+nighthorse N AY T HH AO R S
+nightingale N AY T IH NG G EY L
+nightlife N AY T L AY F
+nightline N AY T L AY N
+nightline's N AY T L AY N Z
+nightlines N AY T L AY N Z
+nightly N AY T L IY
+nightmare N AY T M EH R
+nightmares N AY T M EH R Z
+nightmarish N AY T M EH R IH SH
+nights N AY T S
+nights' N AY T S
+nightshade N AY CH EY D
+nightshirt N AY CH ER T
+nightshirts N AY CH ER T S
+nightstage N AY T S T EY JH
+nightstand N AY T S T AE N D
+nightstands N AY T S T AE N D Z
+nightstick N AY T S T IH K
+nightsticks N AY T S T IH K S
+nighttime N AY T T AY M
+nighttimes N AY T T AY M Z
+nigrelli N IY G R EH L IY
+nigris N IH G R IH S
+nigro N IH G R OW
+niguel N IH G EH L
+nihart N IH HH AA R T
+nihay N AY HH EY
+nihay(2) N IY HH EY
+nihei N IH HH EY
+nihilism N AY AH L IH Z AH M
+nihilists N AY AH L AH S T S
+nihilists(2) N AY AH L AH S S
+nihilists(3) N AY AH L AH S
+nihiser N IH HH AY Z ER
+nihon N IH HH AA N
+niihau N IY HH AW
+nik N IH K
+nike N AY K IY
+nike's N AY K IY Z
+nikes N AY K S
+nikes(2) N AY K IY Z
+niki N IH K IY
+nikita N IH K IY T AH
+nikita(2) N AH K IY T AH
+nikk's N IH K S
+nikkei N IH K EY
+nikkei's N IY K EY Z
+nikkei(2) N IY K EY
+nikkei(3) N AY K IY
+nikkel N IH K AH L
+nikkhah N IH K HH AA
+nikki N IH K IY
+nikko N IY K OW
+nikko's N IY K OW Z
+niko N IY K OW
+niko's N IY K OW Z
+nikola N IH K OW L AH
+nikolai N IH K OW L AY
+nikolaivich N IH K OW L AY V IH CH
+nikolaus N IH K AH L AW Z
+nikolic N IH K AA L IH K
+nikolich N IH K AA L IH HH
+nikon N AY K AA N
+nikou N IY K UW
+nikovski N IH K AA F S K IY
+nil N IH L
+nila N IY L AH
+nilan N IY L AA N
+niland N AY L AH N D
+nile N AY L
+niles N AY L Z
+nilges N IH L JH IH Z
+nill N IH L
+nilles N AY L Z
+nilly N IH L IY
+nils N IH L Z
+nilsen N IH L S AH N
+nilson N IH L S AH N
+nilsson N IH L S AH N
+nimble N IH M B AH L
+nimbly N IH M B L IY
+nimbus N IH M B AH S
+nimby N IH M B IY
+nimitz N IH M IH T S
+nimmer N IH M ER
+nimmo N IH M OW
+nimmons N IH M AH N Z
+nimoy N IY M OY
+nimrod N IH M R AA D
+nimrodi N IH M R OW D IY
+nims N IH M Z
+nimtz N IH M T S
+nina N IY N AH
+ninad N AY N AH D
+ninagawa N IY N AA G AA W AH
+nincompoop N IH NG K AH M P UW P
+nincompoops N IH NG K AH M P UW P S
+nine N AY N
+9 N AY N
+nine's N AY N Z
+ninefold N IH N F OW L D
+niner N AY N ER
+niners N AY N ER Z
+niners' N AY N ER Z
+nines N AY N Z
+nineteen N AY N T IY N
+nineteenth N AY N T IY N TH
+nineties N AY N T IY Z
+nineties' N AY N T IY Z
+ninetieth N AY N T IY IH TH
+ninette N IH N EH T
+ninety N AY N T IY
+ninety's N AY N T IY Z
+nineveh N IH N AH V AH
+ning N IH NG
+ninja N IH N JH AH
+ninjas N IH N JH AH Z
+ninneman N IH N M AH N
+ninny N IH N IY
+nino N IY N OW
+nino(2) N IY N Y OW
+ninon N IH N AH N
+ninos N IY N OW Z
+ninos(2) N IY N Y OW Z
+ninsu N IH N S UW
+nintendo N IH N T EH N D OW
+nintendo's N IH N T EH N D OW Z
+ninth N AY N TH
+ninths N AY N TH S
+niobite N AY OW B AY T
+niobium N AY OW B IY AH M
+nip N IH P
+nipon N IH P AA N
+nipp N IH P
+nipped N IH P T
+nipper N IH P ER
+nippert N IH P ER T
+nipping N IH P IH NG
+nipple N IH P AH L
+nipples N IH P AH L Z
+nippon N IH P AA N
+nippondenso N IH P AA N D EH N S OW
+nippy N IH P IY
+nips N IH P S
+nipsco N IH P S K OW
+niquette N IH K EH T
+nir N IH R
+nirenberg N AY R AH N B ER G
+niriko N IH R IH K OW
+niro N IH R OW
+nirvana N IH R V AA N AH
+nirvana's N IH R V AA N AH Z
+nirvana's(2) N ER V AA N AH Z
+nirvana(2) N ER V AA N AH
+nirvanas N IH R V AA N AH Z
+nirvanas(2) N ER V AA N AH Z
+nisbet N IH Z B AH T
+nisbett N IH S B IH T
+nisei N IH S EY
+nishi N IY SH IY
+nishida N IY SH IY D AH
+nishikawa N IY SH IY K AA W AH
+nishimo N IH SH IY M OW
+nishimoto N IY SH IY M OW T OW
+nishimura N IY SH IY M UH R AH
+nishioka N IY SH IY OW K AH
+nishiyama N IY SH IY Y AA M AH
+nishizawa N IY SH IH Z AA W AH
+niskanen N IH S K AH N AH N
+nisley N IH Z L IY
+nissa N IH S AH
+nissan N IY S AA N
+nissan's N IY S AA N Z
+nissans N IY S AA N Z
+nissei N IH S EY
+nissen N IH S AH N
+nissenbaum N IH S AH N B AW M
+nisshin N IH SH IH N
+nissho N IH SH OW
+nissim N IH S IH M
+nissin N IH S IH N
+nissley N IH S L IY
+nist N IH S T
+nistler N IH S T L ER
+niswander N IH S W AO N D ER
+niswonger N IH S W AO NG ER
+nit N IH T
+nita N IY T AH
+nite N AY T
+nithuekan N IH TH W AH K AA N
+nithuekan's N IH TH W AH K AA N Z
+nitka N IH T K AH
+nito N IY T OW
+nitpick N IH T P IH K
+nitpicking N IH T P IH K IH NG
+nitrate N AY T R EY T
+nitrates N AY T R EY T S
+nitrating N AY T R EY T IH NG
+nitration N AY T R EY SH AH N
+nitric N AY T R IH K
+nitride N AY T R AY D
+nitriles N AY T R AH L Z
+nitro N IH T R OW
+nitrocellulose N AY T R OW S EH L Y AH L OW S
+nitrogen N AY T R AH JH AH N
+nitrogenous N AY T R AA JH AH N AH S
+nitroglycerin N AY T R OW G L IH S ER AH N
+nitroglycerin(2) N AY T R AH G L IH S ER AH N
+nitroglycerin(3) N AY CH R AH G L IH S ER AH N
+nitroglycerine N AY T R OW G L IH S ER AH N
+nitroglycerine(2) N AY T R AH G L IH S ER AH N
+nitroglycerine(3) N AY CH R AH G L IH S ER AH N
+nitrosamines N IH T R AA S AH M IY N Z
+nitrosomine N IH T R AA S AH M IY N
+nitrosomines N IH T R AA S AH M IY N Z
+nitrous N IH T R AH S
+nitsa N IH T S AH
+nitsch N IH CH
+nitsche N IH CH
+nitschke N IH CH K
+nitta N IH T AH
+nitta(2) N IY T AH
+nitto N IH T OW
+nitty N IH T IY
+nitz N IH T S
+nitza N IH T Z AH
+nitza's N IH T Z AH Z
+nitzberg N IH T S B ER G
+nitze N IH T S IY
+nitzel N IH T Z AH L
+nitzsche N IH T Z SH
+nitzsche(2) N IH T SH
+niven N AY V AH N
+nivens N AY V AH N Z
+niver N AY V ER
+nivison N IH V IH S AH N
+nix N IH K S
+nixdorf N IH K S D AO R F
+nixdorf's N IH K S D AO R F S
+nixed N IH K S T
+nixes N IH K S IH Z
+nixie N IH K S IY
+nixon N IH K S AH N
+nixon's N IH K S AH N Z
+nixons N IH K S AH N Z
+nizar N AY Z AA R
+nizhny N IH ZH N IY
+niziolek N IH Z IY OW L EH K
+niznik N IH Z N IH K
+njt EH N JH EY T IY
+nkohse EH N K OW S IY
+no N OW
+no's N OW Z
+noa N OW AH
+noaa N OW AH
+noaa(2) EH N OW EY EY
+noack N OW K
+noah N OW AH
+noah's N OW AH Z
+noakes N OW K S
+noam N OW M
+noami N OW M IY
+nobatoshi N OW B AH T OW SH IY
+nobbe N AA B
+nobec N OW B EH K
+nobec's N OW B EH K S
+nobel N OW B EH L
+nobelium N OW B EH L IY AH M
+nobile N AA B AH L
+nobility N OW B IH L AH T IY
+nobis N OW B IH S
+noble N OW B AH L
+noble's N OW B AH L Z
+nobleman N OW B AH L M AH N
+nobleman's N OW B AH L M AH N Z
+nobler N OW B L ER
+nobles N OW B AH L Z
+noblesse N OW B L EH S
+noblest N OW B L IH S T
+noblet N AA B L AH T
+noblett N AA B L IH T
+noblewoman N OW B AH L W UH M AH N
+noblin N AA B L IH N
+noblitt N AA B L IH T
+nobly N AA B L IY
+nobodies N OW B AA D IY Z
+nobodies(2) N OW B AH D IY Z
+nobody N OW B AA D IY
+nobody'd N OW B AA D IY D
+nobody'd(2) N OW B AH D IY D
+nobody's N OW B AA D IY Z
+nobody's(2) N OW B AH D IY Z
+nobody(2) N OW B AH D IY
+noboru N OW B AO R UW
+nobrega N AA B R IH G AH
+nobriga N AA B R IH G AH
+nobuaki N OW B UW AA K IY
+nobuo N OW B UW OW
+nobuto N OW B UW T OW
+nobuyuki N OW B UW Y UW K IY
+noce N OW S
+nocella N OW CH EH L AH
+nocera N OW CH EH R AH
+nock N AA K
+nockard N AA K ER D
+nocturnal N AA K T ER N AH L
+nod N AA D
+noda N OW D AH
+nodded N AA D AH D
+nodded(2) N AA D IH D
+nodding N AA D IH NG
+node N OW D
+nodes N OW D Z
+nodine N OW D IY N IY
+nods N AA D Z
+nodular N AA JH AH L ER
+nodule N AA JH UW L
+nodules N AA JH UW L Z
+noe N OW
+noecker N OW K ER
+noel N OW EH L
+noel's N OW EH L Z
+noell N OW L
+noelle N OW EH L
+noes N OW Z
+noeth N OW TH
+noffke N AA F K
+noffsinger N AA F S IH N JH ER
+nofsinger N AA F S IH N JH ER
+noftsker N AO F T S K ER
+nofziger N AO F Z IH G ER
+noga N OW G AH
+nogales N OW G AA L EH S
+nogawa N OW G AA W AH
+noggle N AA G AH L
+nogle N OW G AH L
+noguchi N OW G UW CH IY
+nogueira N OW G EH R AH
+noguera N OW G EH R AH
+noh N OW
+nohl N OW L
+nohr N AO R
+noiman N OY M AH N
+noir N OY R
+noirs N OY R Z
+noise N OY Z
+noises N OY Z IH Z
+noisier N OY Z IY ER
+noisiest N OY Z IY AH S T
+noisily N OY Z AH L IY
+noisy N OY Z IY
+nokes N OW K S
+nokia N OW K IY AH
+nokia's N OW K IY AH Z
+nokyo N OW K Y OW
+nola N OW L AH
+nolan N OW L AH N
+nolana N OW L AE N AH
+noland N OW L AH N D
+nolanda N AH L AE N D AH
+nolasco N OW L AA S K OW
+nold N OW L D
+nolde N OW L D
+nolden N OW L D AH N
+nolder N OW L D ER
+nole N OW L
+nolen N AA L AH N
+noles N OW L Z
+nolet N OW L IH T
+noleta N OW L EH T AH
+nolette N OW L EH T
+nolf N OW L F
+nolie N AA L IY
+nolin N OW L IH N
+nolita N OW L IY T AH
+noll N OW L
+nolla N OW L AH
+nollan N AA L AH N
+noller N OW L ER
+nolley N AA L IY
+nollie N OW L IY
+nolls N OW L Z
+nolo N OW L OW
+nolt N OW L T
+nolte N OW L T
+nolting N OW L T IH NG
+nom N AA M
+nomad N OW M AE D
+nomad's N OW M AE D Z
+nomadic N OW M AE D IH K
+nomads N OW M AE D Z
+nome N OW M
+nome's N OW M Z
+nomenclatorial N OW M IH N K L AH T AO R IY AH L
+nomenclatural N OW M AH N K L EY CH ER AH L
+nomenclature N OW M AH N K L EY CH ER
+nomenklatura N OW M EH NG K L AH CH UH R AH
+nomi N OW M IY
+nominal N AA M AH N AH L
+nominally N AA M AH N AH L IY
+nominate N AA M AH N AH T
+nominate(2) N AA M AH N EY T
+nominated N AA M AH N EY T AH D
+nominates N AA M AH N EY T S
+nominates(2) N AA M AH N AH T S
+nominating N AA M AH N EY T IH NG
+nomination N AA M AH N EY SH AH N
+nominations N AA M AH N EY SH AH N Z
+nominee N AA M AH N IY
+nominee's N AA M AH N IY Z
+nominees N AA M AH N IY Z
+nomo N OW M OW
+nomura N OW M UH R AH
+nomura's N OW M UH R AH Z
+nomura's(2) N UW M ER AH Z
+non N AA N
+non-catholic N AA N K AE TH L IH K
+non-catholics N AA N K AE TH L IH K S
+non-nonsense N AA N N AA N S EH N S
+non-sequitor N AA N S EH K W IH T ER
+non-sequitors N AA N S EH K W IH T ER Z
+non-smoking N AA N S M OW K IH NG
+non-stop N AA N S T AA P
+non-stops N AA N S T AA P S
+non-supervisory N AA N S UW P ER V AY Z ER IY
+nona N AA N AH
+nonacademic N AA N AE K AH D EH M IH K
+nonaccrual N AA N AH K R UW AH L
+nonaccruing N AA N AH K R UW IH NG
+nonaggression N AA N AH G R EH SH AH N
+nonagricultural N AA N AE G R IH K AH L CH ER AH L
+nonalcoholic N AA N AE L K AH HH AA L IH K
+nonalign N AA N AH L AY N
+nonaligned N AA N AH L AY N D
+nonautomotive N AA N AO T OW M OW T IH V
+nonbank N AA N B AE NG K
+nonbanking N AA N B AE NG K IH NG
+nonbeliever N AA N B AH L IY V ER
+nonbelievers N AA N B AH L IY V ER Z
+nonbinding N AA N B AY N D IH NG
+nonbiting N AA N B AY T IH NG
+nonbuilding N AA N B IH L D IH NG
+nonbusiness N AA N B IH Z N AH S
+noncallable N AA N K AO L AH B AH L
+noncash N AA N K AE SH
+nonce N AA N S
+nonchalance N AA N SH AH L AA N S
+nonchalant N AA N SH AH L AA N T
+nonchalantly N AA N SH AH L AA N T L IY
+noncolor N AA N K AH L ER
+noncombatant N AA N K AH M B AE T AH N T
+noncombatants N AA N K AH M B AE T AH N T S
+noncommercial N AA N K AH M ER SH AH L
+noncommittal N AA N K AH M IH T AH L
+noncommunist N AA N K AA M Y UW N IH S T
+noncommunists N AA N K AA M Y UW N IH S T S
+noncompete N AA N K AH M P IY T
+noncompetitive N AA N K AH M P EH T AH T IH V
+noncompliance N AA N K AH M P L AY AH N S
+nonconformist N AA N K AH N F AO R M IH S T
+nonconformists N AA N K AH N F AO R M AH S T S
+nonconformists(2) N AA N K AH N F AO R M AH S S
+nonconformists(3) N AA N K AH N F AO R M AH S
+nonconformity N AA N K AH N F AO R M AH T IY
+noncontract N AA N K AA N T R AE K T
+noncontroversial N AA N K AA N T R AH V ER SH AH L
+nonconvertible N AA N K AH N V ER T AH B AH L
+noncore N AA N K AO R
+noncorporate N AA N K AO R P R AH T
+noncriminal N AA N K R IH M IH N AH L
+noncumulative N AA N K Y UW M Y AH L AH T IH V
+nondeductible N AA N D IH D AH K T IH B AH L
+nondefense N AA N D IH F EH N S
+nondescript N AA N D IH S K R IH P T
+nondirect N AA N D ER EH K T
+nondiscriminate N AA N D IH S K R IH M AH N AH T
+nondiscrimination N AA N D IH S K R IH M IH N EY SH AH N
+nondiscriminatory N AA N D IH S K R IH M AH N AH T AO R IY
+nondollar N AA N D AA L ER
+nondurable N AA N D UH R AH B AH L
+nondurables N AA N D UH R AH B AH L Z
+none N AH N
+noneconomic N AA N EH K AH N AA M IH K
+nonelectrical N AA N IH L EH K T R IH K AH L
+nonemergency N AA N IH M ER JH AH N S IY
+nonentity N AA N EH N T AH T IY
+nonessential N AA N IH S EH N CH AH L
+nonesuch N AH N S AH CH
+nonetheless N AH N DH AH L EH S
+nonevent N AA N IH V EH N T
+nonexclusive N AA N IH K S K L UW S IH V
+nonexecutive N AA N IH G Z EH K Y AH T IH V
+nonexistent N AA N AH G Z IH S T AH N T
+nonfarm N AA N F AA R M
+nonfat N AA N F AE T
+nonfatal N AA N F EY T AH L
+nonferrous N AA N F EH R AH S
+nonfiction N AA N F IH K SH AH N
+nonfinancial N AA N F AH N AE N SH AH L
+nonfinancial(2) N AA N F AY N AE N SH AH L
+nonfood N AA N F UW D
+nongovernment N AA N G AH V ER N M AH N T
+nongovernmental N AA N G AH V ER N M EH N T AH L
+nongreek N AA N G R IY K
+nonhuman N AA N HH Y UW M AH N
+nonie N AA N IY
+noninflationary N AA N IH N F L EY SH AH N EH R IY
+noninterest N AA N IH N T R AH S T
+noninterference N AA N IH N T ER F IH R AH N S
+nonintervention N AA N IH N T ER V EH N CH AH N
+nonjet N AA N JH EH T
+nonjets N AA N JH EH T S
+nonlethal N AA N L IY TH AH L
+nonlinear N AA N L IH N IY ER
+nonliturgical N AA N L AH T ER JH IH K AH L
+nonmanagement N AA N M AE N IH JH M AH N T
+nonmanufacturing N AA N M AE N Y AH F AE K CH ER IH NG
+nonmember N AA N M EH M B ER
+nonmembers N AA N M EH M B ER Z
+nonmilitary N AA N M IH L AH T EH R IY
+nonnative N AA N EY T IH V
+nonnatives N AA N EY T IH V Z
+nonnemacher N AA N IH M AH K ER
+nonnuclear N AA N UW K L IY ER
+nonoperating N AA N AO P ER EY T IH NG
+nonpacifist N AA N P AE S IH F IH S T
+nonpacifists N AA N P AE S IH F IH S T S
+nonpacifists(2) N AA N P AE S IH F IH S S
+nonpacifists(3) N AA N P AE S IH F IH S
+nonpartisan N AA N P AA R T AH Z AH N
+nonpaying N AA N P EY IH NG
+nonpayment N AA N P EY M AH N T
+nonperforming N AA N P ER F AO R M IH NG
+nonplanar N AA N P L EY N ER
+nonpluss N AA N P L AH S
+nonplussed N AA N P L AH S T
+nonpoisonous N AA N P OY Z AH N AH S
+nonpolitical N AA N P AH L IH T IH K AH L
+nonprescription N AA N P R AH S K R IH P SH AH N
+nonproductive N AA N P R AH D AH K T IH V
+nonprofessional N AA N P R AH F EH SH AH N AH L
+nonprofessionals N AA N P R AH F EH SH AH N AH L Z
+nonprofit N AA N P R AA F AH T
+nonprofits N AA N P R AA F IH T S
+nonproliferation N AA N P R AH L IH F ER EY SH AH N
+nonpublic N AA N P AH B L IH K
+nonqualified N AA N K W AA L AH F AY D
+nonracial N AA N R EY SH AH L
+nonrecurring N AA N R IH K ER IH NG
+nonrefundable N AA N R IH F AH N D AH B AH L
+nonregulated N AA N R EH G Y AH L EY T IH D
+nonreligious N AA N R IH L IH JH AH S
+nonrenewable N AA N R IY N UW AH B AH L
+nonresident N AA N R EH Z AH D AH N T
+nonresidential N AA N R EH Z AH D EH N SH AH L
+nonresidential(2) N AA N R EH Z AH D EH N CH AH L
+nonresidents N AA N R EH Z AH D AH N T S
+nonresponsive N AA N R IH S P AA N S IH V
+nonrestricted N AA N R IH S T R IH K T AH D
+nonrestricted(2) N AA N R IY S T R IH K T AH D
+nonroman N AA N R OW M AH N
+nonruling N AA N R UW L IH NG
+nonsectarian N AA N S EH K T EH R IY AH N
+nonsense N AA N S EH N S
+nonsensical N AA N S EH N S IH K AH L
+nonsmoker N AA N S M OW K ER
+nonsmokers N AA N S M OW K ER Z
+nonsmokers' N AA N S M OW K ER Z
+nonsmoking N AA N S M OW K IH NG
+nonspecific N AA N S P AH S IH F IH K
+nonsporting N AA N S P AO R T IH NG
+nonstandard N AA N S T AE N D ER D
+nonstarter N AA N S T AA R T ER
+nonstarters N AA N S T AA R T ER Z
+nonstick N AA N S T IH K
+nonstop N AA N S T AA P
+nonstops N AA N S T AA P S
+nonstrategic N AA N S T R AH T IY JH IH K
+nonsurgical N AA N S ER JH IH K AH L
+nontaxable N AA N T AE K S AH B AH L
+nontechnical N AA N T EH K N IH K AH L
+nontoxic N AA N T AA K S IH K
+nontraditional N AA N T R AH D IH SH AH N AH L
+nontransferable N AA N T R AE N S F ER AH B AH L
+nonturbo N AO N T ER B OW
+nonturbos N AO N T ER B OW Z
+nonunion N AA N Y UW N Y AH N
+nonunionized N AA N Y UW N Y AH N AY Z D
+nonutility N AA N Y UW T IH L IH T IY
+nonverbal N AA N V ER B AH L
+nonviolence N AA N V AY AH L AH N S
+nonviolent N AA N V AY AH L AH N T
+nonvolatile N AA N V AA L AH T AH L
+nonvoting N AA N V OW T IH NG
+nonwhite N AA N W AY T
+nonwhite(2) N AA N HH W AY T
+nonwhites N AA N W AY T S
+nonwhites(2) N AA N HH W AY T S
+nonwoven N AA N W OW V IH N
+nonwovens N AA N W OW V AH N Z
+noodle N UW D AH L
+noodles N UW D AH L Z
+nook N UH K
+nooks N UH K S
+noon N UW N
+noonan N UW N AH N
+noone N UW N
+nooney N UW N IY
+noons N UW N Z
+noontime N UW N T AY M
+noorda N UH R D AH
+noose N UW S
+nope N OW P
+nor N AO R
+nora N AO R AH
+nora's N AO R AH Z
+norah N AO R AH
+noramco N AO R AE M K OW
+noranda N AO R AE N D AH
+noranda's N AO R AE N D AH Z
+norba N AO R B AH
+norbeck N AO R B EH K
+norberg N AO R B ER G
+norbert N AO R B ER T
+norberta N AO R B EH R T AH
+norberto N AO R B ER T OW
+norbury N AO R B EH R IY
+norby N AO R B IY
+norcen N AO R S AH N
+norcen's N AO R S AH N Z
+norcia N AO R CH AH
+norco N AO R K OW
+norcross N AO R K R AO S
+nord N AO R D
+nordahl N AO R D AA L
+nordan N AO R D AH N
+nordbanken N AO R D B AE NG K AH N
+nordberg N AO R D B ER G
+nordby N AO R D B IY
+nordeen N ER D IY N
+nordell N AO R D AH L
+norden N AO R D AH N
+norder N AO R D ER
+nordgren N AO R D G R EH N
+nordic N AO R D IH K
+nordica N AO R D IH K AH
+nordictrack N AO R D IH K T R AE K
+nordin N AO R D IH N
+nordine N AO R D IY N IY
+nordio N AO R D IY OW
+nordisk N AO R D IH S K
+nordling N AO R D AH L IH NG
+nordling(2) N AO R D L IH NG
+nordlund N AO R D L AH N D
+nordman N AO R D M AH N
+nordmann N AO R D M AH N
+nordmeyer N AO R D M AY ER
+nordquist N AO R D K W IH S T
+nordson N AO R D S AH N
+nordstrom N AO R D S T R AH M
+nordstrom's N AO R D S T R AH M Z
+nordstroms N AO R D S T R AH M Z
+nordyke N AO R D AY K
+noreco N AO R EH K OW
+nored N AO R D
+noreen N ER IY N
+noreiga N AO R EY G AH
+norelco N ER EH L K OW
+norell N AO R AH L
+norem N AO R IH M
+noren N AO R AH N
+norenberg N AO R AH N B ER G
+norenco N AO R AH N K OW
+norenko N AH R EH N K OW
+norex N AO R AH K S
+norfleet N AO R F L IY T
+norfolk N AO R F AH K
+norfolk's N AO R F AH K S
+norgaard N AO R G AA R D
+norgard N AO R G ER D
+norge N AO R JH
+norgren N AO R G R AH N
+norick N AO R IH K
+noriega N AO R IY EY G AH
+noriega's N AO R IY EY G AH Z
+noriegas N AO R IY EY G AH S
+norilsk N AO R IH L S K
+norimatsu N AO R IY M AA T S UW
+norinchukin N AO R IH N CH UW K IH N
+norinko N AO R IH NG K OW
+norita N AH R IY T AH
+nork N AO R K
+norkus N AO R K IH S
+norland N AO R L AH N D
+norlander N AO R L AH N D ER
+norlin N AO R L IH N
+norling N AO R L IH NG
+norm N AO R M
+norma N AO R M AH
+norma-jean N AO R M AH JH IY N
+normal N AO R M AH L
+normalcy N AO R M AH L S IY
+normality N AO R M AE L AH T IY
+normalization N AO R M AH L IH Z EY SH AH N
+normalize N AO R M AH L AY Z
+normalized N AO R M AH L AY Z D
+normalizes N AO R M AH L AY Z IH Z
+normalizing N AO R M AH L AY Z IH NG
+normally N AO R M AH L IY
+normally(2) N AO R M L IY
+norman N AO R M AH N
+norman's N AO R M AH N Z
+normand N AO R M AH N D
+normandie N AO R M AH N D IY
+normandin N AO R M AH N D IH N
+normandy N AO R M AH N D IY
+normative N AO R M AH T IH V
+norment N AO R M AH N T
+normick N AO R M IH K
+normie N AO R M IY
+normile N AO R M AY L
+norming N AO R M IH NG
+normington N AO R M IH NG T AH N
+normoyle N AO R M OY L
+norms N AO R M Z
+normy N AO R M IY
+norna N AO R N AH
+norodom N AO R OW D AH M
+norodom(2) N AO R AH D AH M
+norplant N AO R P L AE N T
+norplant's N AO R P L AE N T S
+norquist N AO R K W IH S T
+norred N AO R D
+norrell N AO R AH L
+norrie N AO R IY
+norrington N AO R IH NG T AH N
+norris N AO R IH S
+norris's N AO R AH S IH Z
+norrod N AO R AH D
+norry N AO R IY
+norse N AO R S
+norsemen N AO R S M IH N
+norsk N AO R S K
+norske N AO R S K IY
+norstan N AO R S T AH N
+norstar N AO R S T AA R
+norstrom N AO R S T R AH M
+norsworthy N AO R S W ER DH IY
+norte N AO R T
+nortek N AO R T EH K
+nortel N AO R T EH L
+north N AO R TH
+north's N AO R TH S
+northam N AO R TH AH M
+northampton N AO R TH AE M P T AH N
+northbound N AO R TH B AW N D
+northbrook N AO R TH B R UH K
+northcliff N AO R TH K L IH F
+northcott N AO R TH K AH T
+northcraft N AO R TH K R AE F T
+northcutt N AO R TH K AH T
+northeast N AO R TH IY S T
+northeast's N AO R TH IY S T S
+northeasterly N AO R TH IY S T ER L IY
+northeastern N AO R TH IY S T ER N
+northeasterner N AO R TH IY S T ER N ER
+northeasterners N AO R TH IY S T ER N ER Z
+northeastward N AO R TH IY S T W ER D
+norther N AO R DH ER
+northerly N AO R DH ER L IY
+northern N AO R DH ER N
+northern's N AO R DH ER N Z
+northerner N AO R DH ER N ER
+northerners N AO R DH ER N ER Z
+northernmost N AO R DH ER N M OW S T
+northey N AO R DH IY
+northfield N AO R TH F IY L D
+northgate N AO R TH G EY T
+northington N AO R TH IH NG T AH N
+northland N AO R TH L AE N D
+northolt N AO R TH AO L T
+northridge N AO R TH R IH JH
+northrop N AO R TH R AH P
+northrop's N AO R TH R AH P S
+northrup N AO R TH R AH P
+northrup's N AO R TH R AH P S
+northstar N AO R TH S T AA R
+northstar's N AO R TH S T AA R Z
+northup N AO R TH AH P
+northvale N AO R TH V EY L
+northview N AO R TH V Y UW
+northward N AO R TH W ER D
+northwardly N AO R TH W ER D L IY
+northway N AO R TH W EY
+northwest N AO R TH W EH S T
+northwest's N AO R TH W EH S T S
+northwesterly N AO R TH W EH S T ER L IY
+northwestern N AO R TH W EH S T ER N
+northwestern's N AO R TH W EH S T ER N Z
+northwood N AO R TH W UH D
+norton N AO R T AH N
+norton's N AO R T AH N Z
+norvel N AO R V AH L
+norvell N AO R V AH L
+norvil N AO R V AH L
+norville N AO R V IH L
+norvin N AO R V IH N
+norwalk N AO R W AO K
+norward N AO R W ER D
+norway N AO R W EY
+norway's N AO R W EY Z
+norweb N AO R W EH B
+norwegian N AO R W IY JH AH N
+norwegians N AO R W IY JH AH N Z
+norwell N AO R W EH L
+norwest N AO R W EH S T
+norwest's N AO R W EH S T S
+norwich N AO R W IH CH
+norwin N AO R W IH N
+norwitz N AO R W IH T S
+norwood N AO R W UH D
+norwyn N AO R W IH N
+nosair N OW Z EY R
+nosair's N OW Z EY R Z
+nosair's(2) N OW S EY R Z
+nosair(2) N OW S EY R
+nosal N OW Z AH L
+nose N OW Z
+nosebleed N OW Z B L IY D
+nosed N OW Z D
+nosedive N OW Z D AY V
+nosedived N OW Z D AY V D
+nosek N OW S EH K
+noses N OW Z IH Z
+noseworthy N OW Z W ER DH IY
+nosiness N OW Z IY N AH S
+nosing N OW Z IH NG
+noska N OW S K AH
+noss N AO S
+nostalgia N AO S T AE L JH AH
+nostalgic N AO S T AE L JH IH K
+nostra N AO S T R AH
+nostradamus N AO S T R AH D AE M AH S
+nostrand N AA S T R AH N D
+nostril N AA S T R IH L
+nostrils N AA S T R AH L Z
+nostrums N AA S T R AH M Z
+nosy N OW Z IY
+not N AA T
+notable N OW T AH B AH L
+notables N OW T AH B AH L Z
+notably N OW T AH B L IY
+notarianni N OW T AA R IY AA N IY
+notaro N OW T AA R OW
+notary N OW T ER IY
+notation N OW T EY SH AH N
+notations N OW T EY SH AH N Z
+notch N AA CH
+notched N AA CH T
+notches N AA CH AH Z
+notches(2) N AA CH IH Z
+note N OW T
+note's N OW T S
+notebaert N OW T AH B EH R T
+notebook N OW T B UH K
+notebooks N OW T B UH K S
+noteboom N AA T IH B UW M
+noteboom(2) N UW T IH B UW M
+noted N OW T AH D
+noted(2) N OW T IH D
+noteholder N OW T HH OW L D ER
+noteholders N OW T HH OW L D ER Z
+notes N OW T S
+notes' N OW T S
+notestine N OW T EH S T IY N IY
+notetaker N OW T T EY K ER
+notetakers N OW T T EY K ER Z
+noteware N OW T W EH R
+noteworthy N OW T W ER DH IY
+noth N AA TH
+nothdurft N AA TH D ER F T
+nother N AH DH ER
+nothin N AA TH IH N
+nothin' N AH TH IH N
+nothing N AH TH IH NG
+nothing's N AH TH IH NG Z
+nothingness N AH TH IH NG N AH S
+nothings N AH TH IH NG Z
+nothnagel N AA TH N AH G AH L
+nothstein N AA TH S T IY N
+nothstein(2) N AA TH S T AY N
+notice N OW T AH S
+notice(2) N OW T IH S
+noticeable N OW T AH S AH B AH L
+noticeably N OW T IH S AH B L IY
+noticed N OW T AH S T
+notices N OW T AH S AH Z
+notices(2) N OW T IH S IH Z
+noticing N OW T IH S IH NG
+notification N OW T AH F AH K EY SH AH N
+notifications N OW T AH F AH K EY SH AH N Z
+notified N OW T AH F AY D
+notifies N OW T AH F AY Z
+notify N OW T AH F AY
+notifying N OW T AH F AY IH NG
+noting N OW T IH NG
+notion N OW SH AH N
+notions N OW SH AH N Z
+notis N OW T IH S
+noto N OW T OW
+notochord N OW T AH K AO R D
+notoriety N OW T ER AY AH T IY
+notorious N OW T AO R IY AH S
+notoriously N OW T AO R IY AH S L IY
+notre N OW T R AH
+notre(2) N OW T ER
+nots N AA T S
+nott N AA T
+nottage N AA T IH JH
+notte N AA T
+notter N AA T ER
+nottingham N AA T IH NG HH AE M
+notwithstanding N AA T W IH TH S T AE N D IH NG
+notz N AA T S
+noun N AW N
+nouns N AW N Z
+nourish N ER IH SH
+nourished N ER IH SH T
+nourishes N ER IH SH AH Z
+nourishing N ER IH SH IH NG
+nourishment N ER IH SH M AH N T
+nourse N AO R S
+nous N UW S
+nouveau N UW V OW
+nouvel N UW V AH L
+nouvelle N UW V EH L
+nov N OW V EH M B ER
+nov(2) N OW V
+nova N OW V AH
+nova's N OW V AH Z
+novacare N OW V AH K EH R
+novacek N AA V AH CH EH K
+novack N AA V AH K
+novacor N OW V AH K AO R
+novak N OW V AE K
+novak's N OW V AE K S
+novakovich N AH V AA K AH V IH CH
+novakowski N AH V AH K AO F S K IY
+novametrix N OW V AE M AH T R IH K S
+novas N OW V AH Z
+novato N OW V AA T OW
+novel N AA V AH L
+novel's N AA V AH L Z
+novelist N AA V AH L AH S T
+novelistic N AA V AH L IH S T IH K
+novelists N AA V AH L AH S T S
+novelists(2) N AA V AH L AH S S
+novelists(3) N AA V AH L AH S
+novell N OW V EH L
+novell's N OW V EH L Z
+novella N OW V EH L AH
+novelli N OW V EH L IY
+novello N OW V EH L OW
+novellus N OW V EH L AH S
+novelly N OW V AH L IY
+novels N AA V AH L Z
+novelties N AA V AH L T IY Z
+novelty N AA V AH L T IY
+november N OW V EH M B ER
+november's N OW V EH M B ER Z
+noverco N OW V ER K OW
+novey N OW V IY
+novgorod N AA V G ER AA D
+novi N OW V IY
+novi(2) N OW V AY
+novia N OW V IY AH
+novice N AA V AH S
+novices N AA V AH S IH Z
+novick N OW V IH K
+novick(2) N AA V IH K
+novicki N AH V IH T S K IY
+novinger N OW V IH NG ER
+novitski N AH V IH T S K IY
+novitsky N AH V IH T S K IY
+novo N OW V OW
+novo's N OW V OW Z
+novoa N OW V OW AH
+novogrod N OW V OW G R AE D
+novopharm N OW V OW F AA R M
+novosad N AA V AH S AE D
+novosel N AA V AH S EH L
+novosibirsk N OW V AH S IY B IH R S K
+novosti N OW V AO S T IY
+novotel N OW V OW T EH L
+novotels N OW V OW T EH L Z
+novotney N AA V AH T N IY
+novotny N AH V OW T N IY
+novum N OW V AH M
+novy N OW V IY
+now N AW
+now's N AW Z
+nowa N AW AH
+nowack N AW AH K
+nowacki N AW AA T S K IY
+nowaczyk N AW AH CH IH K
+nowaday N AW AH D EY
+nowadays N AW AH D EY Z
+nowak N OW V AE K
+nowakowski N AW AH K AO F S K IY
+nowell N OW AH L
+nowels N AW AH L Z
+nowhere N OW W EH R
+nowhere(2) N OW HH W EH R
+nowicki N AW IH T S K IY
+nowinski N AW IH N S K IY
+nowlan N AW L AH N
+nowland N AW L AH N D
+nowlin N AW L IH N
+nowling N AW L IH NG
+nowotny N AW OW T N IY
+noxell N AA K S EH L
+noxema N AA K S IY M AH
+noxious N AA K SH AH S
+noxon N AA K S AH N
+noxso N AA K S OW
+noyce N OY S
+noyd N OY D
+noyes N OY Z
+noyola N OY OW L AH
+nozzle N AA Z AH L
+nozzles N AA Z AH L Z
+npr EH N P IY AA R
+npr's EH N P IY AA R Z
+npr.org EH N P IY AA R D AA T AO R G
+nth EH N TH
+nu N UW
+nuala N UW AA L AH
+nuance N UW AA N S
+nuanced N UW AA N S T
+nuances N UW AA N S IH Z
+nub N AH B
+nuber N UW B ER
+nubian N Y UW B IY AH N
+nucci N UW CH IY
+nuccio N UW CH IY OW
+nuckles N AH K AH L Z
+nuckolls N AH K AH L Z
+nuckols N AH K AH L Z
+nuclear N UW K L IY ER
+nucleation N UW K L IY EY SH AH N
+nuclei N UW K L IY AY
+nucleic N UW K L EY IH K
+nucleonic N UW K L IY AA N IH K
+nucleonics N UW K L IY AA N IH K S
+nucleotide N UW K L IY AH T AY D
+nucleus N UW K L IY AH S
+nucor N UW K AO R
+nucor's N UW K AO R Z
+nucorp N UW K AO R P
+nudd N AH D
+nude N UW D
+nudelman N AH D AH L M AH N
+nudes N UW D Z
+nudey N UW D IY
+nudge N AH JH
+nudged N AH JH D
+nudges N AH JH IH Z
+nudging N AH JH IH NG
+nudist N UW D IH S T
+nudity N UW D IH T IY
+nudo N UW D OW
+nuevo N W EY V OW
+nuexco N W EY K S K OW
+nueyung N UW Y AH NG
+nufer N UW F ER
+nuffer N AH F ER
+nugan N UW G AH N
+nugent N UW JH AH N T
+nugett N UW JH AH T
+nugget N AH G IH T
+nugget's N AH G IH T S
+nuggets N AH G AH T S
+nuhfer N UW F ER
+nuhn N AH N
+nuisance N UW S AH N S
+nuisances N UW S AH N S IH Z
+nujoma N UW JH OW M AH
+nuke N UW K
+nukem N UW K AH M
+nukes N UW K S
+nuland N UW L AE N D
+nuland(2) N UW L AH N D
+null N AH L
+nullification N AH L AH F AH K EY SH AH N
+nullified N AH L AH F AY D
+nullifies N AH L AH F AY Z
+nullify N AH L AH F AY
+nullifying N AH L AH F AY IH NG
+nulph N AH L F
+nulton N AH L T AH N
+nulty N AH L T IY
+numac N UW M AE K
+numb N AH M
+numbed N AH M D
+number N AH M B ER
+number's N AH M B ER Z
+numbered N AH M B ER D
+numbering N AH M B ER IH NG
+numbers N AH M B ER Z
+numbing N AH M IH NG
+numbingly N AH M IH NG L IY
+numbness N AH M N AH S
+numed N UW M EH D
+numeiri N UW M EY R IY
+numeral N UW M ER AH L
+numerals N UW M ER AH L Z
+numeric N UW M EH R IH K
+numerica N UW M EH R IH K AH
+numerical N UW M EH R AH K AH L
+numerical(2) N UW M EH R IH K AH L
+numerically N UW M EH R IH K L IY
+numerology N UW M ER AA L AH JH IY
+numerous N UW M ER AH S
+numia N UW M Y AH
+numidia N UW M IH D IY AH
+numismatic N UW M IH S M AE T IH K
+numismatics N UW M IH S M AE T IH K S
+numismatist N UW M IH S M AH T IH S T
+numismatists N UW M IH S M AH T IH S T S
+numismatists(2) N UW M IH S M AH T IH S S
+numismatists(3) N UW M IH S M AH T IH S
+nummi N UW M IY
+nun N AH N
+nun's N AH N Z
+nunamaker N UW N AA M EY K ER
+nunan N UW N AA N
+nuncio N AH N S IY OW
+nunemaker N UW N M EY K ER
+nunes N UW N Z
+nunez N UW N EH Z
+nungesser N AH NG G IH S ER
+nunley N AH N L IY
+nunn N AH N
+nunn's N AH N Z
+nunnally N AH N AH L IY
+nunnelley N AH N IH L IY
+nunnelly N AH N AH L IY
+nunnery N AH N ER IY
+nuno N UW N OW
+nuno's N UW N OW Z
+nuns N AH N Z
+nuns' N AH N Z
+nunsense N AH N S EH N S
+nunziata N UW N Z IY AA T AH
+nunziato N UW N Z IY AA T OW
+nunzio N AH N Z IY OW
+nuova N W OW V AH
+nuovo N W OW V OW
+nupeng N Y UW P EH NG
+nuptial N AH P CH AH L
+nur N UH R
+nuremberg N UH R AH M B ER G
+nureyev N ER AY AH V
+nurmi N UH R M IY
+nurnberger N ER N B ER G ER
+nurock N UW R AA K
+nurr N ER
+nurre N ER
+nurse N ER S
+nurse's N ER S IH Z
+nursed N ER S T
+nurseries N ER S ER IY Z
+nursery N ER S ER IY
+nurseryman N ER S ER IY M AE N
+nurserymen N ER S ER IY M AH N
+nurses N ER S AH Z
+nurses' N ER S AH Z
+nurses'(2) N ER S IH Z
+nurses(2) N ER S IH Z
+nursing N ER S IH NG
+nurture N ER CH ER
+nurtured N ER CH ER D
+nurturer N ER T ER ER
+nurturers N ER T ER ER Z
+nurtures N ER CH ER Z
+nurturing N ER CH ER IH NG
+nusbaum N AH S B AW M
+nusbaum(2) N AH S B AA M
+nusen N UW S AH N
+nuss N AH S
+nussbaum N AH S B AW M
+nussbaum's N AH S B AW M Z
+nussbaum's(2) N AH S B AA M Z
+nussbaum(2) N AH S B AA M
+nussbaumer N AH S B AW M ER
+nusser N AH S ER
+nussle N AH S AH L
+nusz N AH SH
+nut N AH T
+nut's N AH T S
+nutcracker N AH T K R AE K ER
+nutcrackers N AH T K R AE K ER Z
+nute N Y UW T
+nutlets N AH T L AH T S
+nutley N AH T L IY
+nutmeg N AH T M EH G
+nutone N UW T OW N
+nutrasweet N UW T R AH S W IY T
+nutri N UW T R IY
+nutri(2) N UW T R IH
+nutria N UW T R IY AH
+nutriclean N UW T R IH K L IY N
+nutrient N UW T R IY AH N T
+nutrients N UW T R IY AH N T S
+nutrition N UW T R IH SH AH N
+nutritional N UW T R IH SH AH N AH L
+nutritionally N UW T R IH SH AH N AH L IY
+nutritionally(2) N UW T R IH SH N AH L IY
+nutritionist N UW T R IH SH AH N IH S T
+nutritionists N UW T R IH SH AH N IH S T S
+nutritionists(2) N UW T R IH SH AH N IH S S
+nutritionists(3) N UW T R IH SH AH N IH S
+nutritious N UW T R IH SH AH S
+nutritive N UW T R AH T IH V
+nuts N AH T S
+nutshell N AH T SH EH L
+nutshells N AH T SH EH L Z
+nutt N AH T
+nuttall N AH T AH L
+nutter N AH T ER
+nutting N AH T IH NG
+nuttle N AH T AH L
+nutty N AH T IY
+nuveen N UW V IY N
+nuxoll N AH K S AH L
+nuys N AY Z
+nuzum N UW Z AH M
+nuzzi N UW T S IY
+nuzzle N AH Z AH L
+nuzzo N UW Z OW
+nvhome EH N V IY HH OW M
+nvhomes EH N V IY HH OW M Z
+nvryan EH N V R AY AH N
+nyack N AY AE K
+nyberg N AY B ER G
+nyborg N IH B AO R G
+nyborg(2) N AY B AO R G
+nyce N AY S
+nycor N AY K AO R
+nycum N IH K AH M
+nycum(2) N AY K AH M
+nycz N IH CH
+nydam N IH D AH M
+nydegger N IH D IH G ER
+nydegger(2) N AY D IH G ER
+nydia N IH D IY AH
+nye N AY
+nyenhuis N AY AH N HH UW S
+nyerere N AY ER IH R
+nyeri N AY ER IY
+nyers N AY R Z
+nyet N Y EH T
+nyet(2) EH N W AY IY T IY
+nygaard N IH G AA R D
+nygaard(2) N AY G AA R D
+nygard N IH G ER D
+nygard(2) N AY G ER D
+nygren N IH G R EH N
+nygren(2) N AY G R EH N
+nyhan N AY HH AE N
+nyholm N IH HH OW L M
+nyholm(2) N AY HH OW L M
+nyhus N IH HH IH S
+nyina N AY IY N AH
+nyland N IH L AH N D
+nyland(2) N AY L AH N D
+nylander N IH L AH N D ER
+nylander(2) N AY L AH N D ER
+nylen N IH L AH N
+nylex N AY L AH K S
+nylon N AY L AA N
+nylons N AY L AA N Z
+nylund N IH L AH N D
+nylund(2) N AY L AH N D
+nyman N AY M AH N
+nymex N AY M EH K S
+nymph N IH M F
+nymphomaniac N IH M F AH M EY N IY AE K
+nymphomaniac(2) N IH M F OW M EY N IY AE K
+nymphomaniacs N IH M F AH M EY N IY AE K S
+nymphomaniacs(2) N IH M F OW M EY N IY AE K S
+nymphs N IH M F S
+nynex N AY N EH K S
+nynex's N AY N EH K S IH Z
+nyquist N IH K W IH S T
+nyquist(2) N AY K W IH S T
+nyssa N IH S AH
+nystrom N AY S T R AH M
+nyx N IH K S
+n_words EH N W ER D Z
+o OW
+o' OW
+o'banion OW B AE N Y AH N
+o'bannon OW B AE N AH N
+o'bara OW B AA R AH
+o'barr OW B AA R
+o'beirne OW B ER N
+o'berg OW B ER G
+o'berle OW B ER AH L
+o'berry OW B EH R IY
+o'boyle OW B OY L
+o'bradovich OW B R AE D AH V IH CH
+o'brecht OW B R EH K T
+o'bregon OW B R EH G AH N
+o'bremski OW B R EH M S K IY
+o'brenovich OW B R EH N AH V IH CH
+o'brian OW B R AY AH N
+o'briant OW B R AY AH N T
+o'brien OW B R AY IH N
+o'brien's OW B R AY IH N Z
+o'bringer OW B R IH NG ER
+o'brinsky OW B R IH N S K IY
+o'bryan OW B R AY AH N
+o'bryant OW B R AY AH N T
+o'byrne OW B ER N
+o'callaghan OW K AE L AH G AH N
+o'callahan OW K AE L AH HH AE N
+o'campo OW K AE M P OW
+o'cana OW K AE N AH
+o'canas OW K AE N AH Z
+o'carroll OW K AE R AH L
+o'carroll(2) OW K EH R AH L
+o'cilla OW S IH L AH
+o'clair OW K L ER
+o'clock AH K L AA K
+o'connell OW K AA N AH L
+o'conner OW K AA N ER
+o'conner's OW K AA N ER Z
+o'connor OW K AA N ER
+o'connor's OW K AA N ER Z
+o'day OW D EY
+o'dea OW D EY
+o'deli OW D EH L IY
+o'dell OW D EH L
+o'dell's OW D EH L Z
+o'diorne OW D Y AO R N IY
+o'diorne(2) OW D Y AO R N
+o'doherty OW D AA ER T IY
+o'doherty(2) OW D OW ER T IY
+o'donald OW D AA N AH L D
+o'donnel OW D AA N AH L
+o'donnell OW D AA N AH L
+o'donnell's OW D AA N AH L Z
+o'donoghue OW D AA N AH HH UW
+o'donoghue(2) OW D AA N AH HH Y UW
+o'donohue OW D AA N AH HH Y UW
+o'donovan OW D AA N AH V AH N
+o'dougherty OW D AA HH ER T IY
+o'dougherty(2) OW D AA ER T IY
+o'dowd OW D AW D
+o'driscoll OW D R IH S K AA L
+o'dwyer OW D W AY R
+o'fallon OW F AE L AH N
+o'farrell OW F AE R AH L
+o'five OW F AY V
+o'flaherty OW F L EY HH ER T IY
+o'flaherty(2) OW F L EY ER T IY
+o'flynn OW F L IH N
+o'glove OW G L AH V
+o'gorman OW G AO R M AH N
+o'grady OW G R EY D IY
+o'grady's OW G R EY D IY Z
+o'guin OW G UW IY N
+o'guinn OW G W IH N
+o'hagan OW HH AA G AA N
+o'hagan(2) OW HH EY G AH N
+o'hair OW HH EH R
+o'hallaron OW HH AE L ER AH N
+o'halloran OW HH AE L ER AH N
+o'halloron OW HH AE L ER AH N
+o'hanesian OW HH AH N EH ZH IH N
+o'hanian OW HH EY N IY AH N
+o'hanlon OW HH AE N L AH N
+o'hara OW HH EH R AH
+o'hara's OW HH EH R AH Z
+o'hare OW HH EH R
+o'harra OW HH ER AH
+o'hashi OW HH AA SH IY
+o'haver OW HH EY V ER
+o'hearn OW HH ER N
+o'hern OW HH ER N
+o'herron OW HH EH R AH N
+o'kane OW K EY N
+o'keefe OW K IY F
+o'keeffe OW K IY F
+o'keeffe's OW K IY F S
+o'kelley OW K EH L IY
+o'kelly OW K EH L IY
+o'keson OW K IY S AH
+o'kicki OW K IH K IY
+o'lague OW L EY G
+o'laughlin OW L AO K L IH N
+o'lear OW L IH R
+o'leary OW L IH R IY
+o'leary's OW L IH R IY Z
+o'loughlin OW L AW K L IH N
+o'mahoney OW M AH HH OW N IY
+o'mahony OW M AH HH OW N IY
+o'malley OW M AE L IY
+o'mara OW M AA R AH
+o'marska OW M AA R S K AH
+o'meara OW M IY R AH
+o'meara(2) OW M AA R AH
+o'melveny OW M EH L V AH N IY
+o'mori OW M AO R IY
+o'neal OW N IY L
+o'neil OW N IY L
+o'neill OW N IY L
+o'neill's OW N IY L Z
+o'nuts OW N AH T S
+o'nuts(2) AH N AH T S
+o'quinn OW K W IH N
+o'reilly OW R AY L IY
+o'riley OW R AY L IY
+o'roark OW R AO R K
+o'rourke OW R AO R K
+o's OW Z
+o'shaughnessy OW SH AA N IH S IY
+o'shea OW SH EY
+o'shell OW SH EH L
+o'smarty OW S M AA R T IY
+o'steen OW S T IY N
+o'sullivan OW S AH L AH V AH N
+o'toole OW T UW L
+o. OW
+o.'s OW Z
+o.s OW Z
+o.s' OW Z
+oad OW EY D IY
+oahu OW AA HH UW
+oak OW K
+oak's OW K S
+oakar OW K AA R
+oakbrook OW K B R UH K
+oakdale OW K D EY L
+oakes OW K S
+oakey OW K IY
+oakite OW K AY T
+oakland OW K L AH N D
+oakland's OW K L AH N D Z
+oakleaf OW K L IY F
+oakley OW K L IY
+oakley's OW K L IY Z
+oakman OW K M AH N
+oakmark OW K M AA R K
+oakmont OW K M AA N T
+oakridge OW K R IH JH
+oaks OW K S
+oaks' OW K S
+oakville OW K V IH L
+oakwood OW K W UH D
+oaky OW K IY
+oana OW N AH
+oanh OW N
+oar AO R
+oared AO R D
+oarlock AO R L AA K
+oars AO R Z
+oarsman AO R Z M AH N
+oas OW EY EH S
+oases OW EY S IY Z
+oasis OW EY S IH S
+oat OW T
+oates OW T S
+oath OW TH
+oathout OW TH AW T
+oaths OW DH Z
+oaths(2) OW TH S
+oatis OW T IH S
+oatley OW T L IY
+oatman OW T M AH N
+oatmeal OW T M IY L
+oats OW T S
+oaxaca OW K S AH K AH
+oba OW B AH
+obadiah OW B AH D AY AH
+obama OW B AA M AH
+obando OW B AE N D OW
+obanion OW B AE N Y AH N
+obannon OW B AE N AH N
+obar AH B AA R
+obara OW B AA R AH
+obarr OW B AA R
+obdurate AA B D ER AH T
+obedience OW B IY D IY AH N S
+obedient OW B IY D IY AH N T
+obediently OW B IY D IY AH N T L IY
+obediently(2) OW B IY D Y AH N T L IY
+obeid OW B AY D
+obeirne OW B ER R N
+obelia OW B EH L IY AH
+obenchain AA B IH N K AY N
+obenshain AA B IH N SH AY N
+ober OW B ER
+oberbeck OW B ER B EH K
+oberdorf OW B ER D AO R F
+oberg OW B ER G
+oberhaus OW B ER HH AW S
+oberhausen OW B ER HH AW Z AH N
+oberhelman OW B ER HH AH L M AH N
+oberholtzer OW B ER HH OW L T Z ER
+oberlander OW B ER L AH N D ER
+oberle OW B ER AH L
+oberlin OW B ER L IH N
+oberly OW B ER L IY
+obermaier OW B ER M AY R
+oberman OW B ER M AH N
+obermeier OW B ER M AY ER
+obermeyer OW B ER M AY ER
+obermiller OW B ER M IH L ER
+oberon OW B ER AA N
+oberry OW B EH R IY
+oberst OW B ER S T
+oberstar OW B ER S T AA R
+obert AA B ER T
+oberweis OW B ER W AY S
+obese OW B IY S
+obese(2) AH B IY S
+obesity OW B IY S AH T IY
+obesity(2) AH B IY S AH T IY
+obey OW B EY
+obeyed OW B EY D
+obeying OW B EY IH NG
+obeys OW B EY Z
+obfuscate AA B F AH S K EY T
+obfuscation AA B F AH S K EY SH AH N
+obie OW B IY
+obispo OW B IH S P OW
+obit OW B IH T
+obits OW B IH T S
+obituaries OW B IH CH UW EH R IY Z
+obituary OW B IH CH UW EH R IY
+object AA B JH EH K T
+object(2) AH B JH EH K T
+objected AH B JH EH K T AH D
+objecting AH B JH EH K T IH NG
+objection AH B JH EH K SH AH N
+objection's AH B JH EH K SH AH N Z
+objectionable AH B JH EH K SH AH N AH B AH L
+objections AH B JH EH K SH AH N Z
+objective AH B JH EH K T IH V
+objectively AA B JH EH K T IH V L IY
+objectives AH B JH EH K T IH V Z
+objectivity AA B JH EH K T IH V IH T IY
+objector AH B JH EH K T ER
+objectors AH B JH EH K T ER Z
+objects AA B JH EH K T S
+objects(2) AH B JH EH K T S
+objects(3) AA B JH EH K S
+objects(4) AH B JH EH K S
+oblak AA B L AH K
+oblak(2) OW B L AE K
+oblander AA B L AH N D ER
+oblast AA B L AE S T
+oblate AA B L EY T
+obligate AA B L AH G EY T
+obligated AA B L AH G EY T IH D
+obligates AA B L AH G EY T S
+obligating AA B L AH G EY T IH NG
+obligation AA B L AH G EY SH AH N
+obligations AA B L AH G EY SH AH N Z
+obligatory AH B L IH G AH T AO R IY
+oblige AH B L AY JH
+obliged AH B L AY JH D
+obliges AH B L AY JH IH Z
+obliging AH B L AY JH IH NG
+obligingly AH B L AY JH IH NG L IY
+oblinger OW B AH L IH NG ER
+oblinger(2) OW B L IH NG ER
+oblique AH B L IY K
+obliquely AH B L IY K L IY
+obliterate AH B L IH T ER EY T
+obliterated AH B L IH T ER EY T IH D
+obliterates AH B L IH T ER EY T S
+obliterating AH B L IH T ER EY T IH NG
+obliteration AH B L IH T ER EY SH AH N
+oblivion AH B L IH V IY AH N
+oblivious AH B L IH V IY AH S
+oblong AA B L AO NG
+obnoxious AA B N AA K SH AH S
+oboe OW B OW
+oboist OW B OW AH S T
+obon OW B AH N
+oboyle OW B OY L
+obradovich OW B R AE D AH V IH CH
+obrecht OW B R IH K T
+obregon AA B R IH G AH N
+obremski OW B R EH M S K IY
+obremsky OW B R EH M S K IY
+obrenovich OW B R EH N AH V IH CH
+obrian OW B R AY AH N
+obriant OW B R AY AH N T
+obrien OW B R AY IH N
+obringer OW B R IH NG ER
+obrinsky OW B R IH N S K IY
+obryan OW B R AY AH N
+obryant OW B R AY AH N T
+obscene AA B S IY N
+obscene(2) AH B S IY N
+obscenely AA B S IY N AH L IY
+obscenely(2) AA B S IY N L IY
+obscenities AA B S EH N IH T IY Z
+obscenity AH B S EH N IH T IY
+obscure AH B S K Y UH R
+obscured AH B S K Y UH R D
+obscures AH B S K Y UH R Z
+obscuring AH B S K Y UH R IH NG
+obscurity AH B S K Y UH R AH T IY
+obsequious AH B S IY K W IY AH S
+observable AH B Z ER V AH B AH L
+observables AH B Z ER V AH B AH L Z
+observance AH B Z ER V AH N S
+observances AH B Z ER V AH N S IH Z
+observant AH B Z ER V AH N T
+observateur AA B Z ER V AH T UH R
+observation AA B Z ER V EY SH AH N
+observations AA B Z ER V EY SH AH N Z
+observatories AH B Z ER V AH T AO R IY Z
+observatory AH B Z ER V AH T AO R IY
+observatory's AH B Z ER V AH T AO R IY Z
+observe AH B Z ER V
+observed AH B Z ER V D
+observer AH B Z ER V ER
+observers AH B Z ER V ER Z
+observes AH B Z ER V Z
+observing AH B Z ER V IH NG
+obsess AH B S EH S
+obsessed AH B S EH S T
+obsesses AH B S EH S IH Z
+obsessing AH B S EH S IH NG
+obsession AH B S EH SH AH N
+obsessional AH B S EH SH AH N AH L
+obsessions AH B S EH SH AH N Z
+obsessive AH B S EH S IH V
+obsessively AA B S EH S IH V L IY
+obshchestvennom AA B SH AH S T V EH N AH M
+obsidian AH B S IH D IY AH N
+obsolescence AA B S AH L EH S AH N S
+obsolescent AA B S AH L EH S AH N T
+obsolete AA B S AH L IY T
+obsoletes AA B S AH L IY T S
+obst AA B S T
+obstacle AA B S T AH K AH L
+obstacles AA B S T AH K AH L Z
+obstetric AH B S T EH T R IH K
+obstetrical AH B S T EH T R IH K AH L
+obstetrician AA B S T AH T R IH SH AH N
+obstetricians AA B S T AH T R IH SH AH N Z
+obstetrics AH B S T EH T R IH K S
+obstfeld AA B S T F EH L D
+obstinacy AA B S T AH N AH S IY
+obstinate AA B S T AH N AH T
+obstreperous AH B S T R EH P ER AH S
+obstruct AH B S T R AH K T
+obstructed AH B S T R AH K T IH D
+obstructing AH B S T R AH K T IH NG
+obstruction AH B S T R AH K SH AH N
+obstructionism AH B S T R AH K SH AH N IH Z AH M
+obstructionist AH B S T R AH K SH AH N AH S T
+obstructionist(2) AH B S T R AH K SH AH N IH S T
+obstructionists AH B S T R AH K SH AH N AH S T S
+obstructionists(2) AH B S T R AH K SH AH N IH S T S
+obstructionists(3) AH B S T R AH K SH AH N IH S S
+obstructionists(4) AH B S T R AH K SH AH N IH S
+obstructions AH B S T R AH K SH AH N Z
+obstructive AH B S T R AH K T IH V
+obstructs AH B S T R AH K T S
+obtain AH B T EY N
+obtainable AH B T EY N AH B AH L
+obtained AH B T EY N D
+obtaining AH B T EY N IH NG
+obtains AH B T EY N Z
+obtrude AH B T R UW D
+obtrudes AH B T R UW D Z
+obtrusive AH B T R UW S IH V
+obtuse AA B T UW S
+obuchowski OW B Y UW K AW S K IY
+obuchowski(2) OW B UW K AW S K IY
+obuchowski(3) OW B UW CH OW S K IY
+obverse AH B V ER S
+obviate AA B V IY EY T
+obviated AA B V IY EY T AH D
+obviates AA B V IY EY T S
+obviating AA B V IY EY T IH NG
+obvious AA B V IY AH S
+obviously AA B V IY AH S L IY
+obyrne OW B ER N
+ocain OW K AA IY N
+ocala OW K AE L AH
+ocallaghan OW K AE L AH G AH N
+ocallahan OW K AE L AH HH AE N
+ocampo OW K AE M P OW
+ocana OW K AE N AH
+ocanas OW K AE N AH Z
+ocarroll OW K AE R AH L
+ocarroll(2) OW K EH R AH L
+ocasio OW K AA S IY OW
+ocaw OW K AO
+ocaw's OW K AO Z
+occasion AH K EY ZH AH N
+occasional AH K EY ZH AH N AH L
+occasionally AH K EY ZH AH N AH L IY
+occasionally(2) AH K EY ZH N AH L IY
+occasionally(3) AH K EY ZH AH N L IY
+occasioned AH K EY ZH AH N D
+occasions AH K EY ZH AH N Z
+occhino OW K IY N OW
+occhipinti OW K IY P IY N T IY
+occhoa OW CH OW AH
+occhoa's OW CH OW AH Z
+occident AA K S AH D EH N T
+occidental AA K S AH D EH N T AH L
+occidental's AA K S AH D EH N T AH L Z
+occidental's(2) AA K S AH D EH N AH L Z
+occidental(2) AA K S AH D EH N AH L
+occidentale AA K S IH D EH N T AH L
+occidentale's AA K S IH D EH N T AH L Z
+occipital AA K S IH P AH T AH L
+occlusion AH K L UW ZH AH N
+occult AH K AH L T
+occupancy AA K Y AH P AH N S IY
+occupant AA K Y AH P AH N T
+occupants AA K Y AH P AH N T S
+occupation AA K Y AH P EY SH AH N
+occupational AA K Y AH P EY SH AH N AH L
+occupations AA K Y AH P EY SH AH N Z
+occupied AA K Y AH P AY D
+occupier AA K Y AH P AY ER
+occupiers AA K Y AH P AY ER Z
+occupies AA K Y AH P AY Z
+occupy AA K Y AH P AY
+occupying AA K Y AH P AY IH NG
+occur AH K ER
+occuring AH K ER IH NG
+occurred AH K ER D
+occurrence AH K ER AH N S
+occurrences AH K ER AH N S IH Z
+occurring AH K ER IH NG
+occurs AH K ER Z
+ocean OW SH AH N
+ocean's OW SH AH N Z
+oceana OW SH IY AE N AH
+oceaneering OW SH AH N IH R IH NG
+oceanfront OW SH AH N F R AH N T
+oceangoing OW SH AH N G OW IH NG
+oceania OW SH Y AE N IY AH
+oceanic OW SH IY AE N IH K
+oceanographer OW SH AH N AA G R AH F ER
+oceanographic OW SH AH N AH G R AE F IH K
+oceanography OW SH AH N AA G R AH F IY
+oceans OW SH AH N Z
+oceanside OW SH AH N S AY D
+oceanview OW SH AH N V Y UW
+ocelot AA S AH L AA T
+ocelot's AA S AH L AA T S
+och AA K
+ocheltree AA CH IH L T R IY
+ochoa AA CH OW AH
+ochoa(2) OW CH OW AH
+ochra AA K R AH
+ochre OW K ER
+ochs AA K S
+ochs(2) OW K S
+ochsenschlager AA K S AH N SH L AA G ER
+ochsner AA K S N ER
+ocilla OW S IH L AH
+ocker AA K ER
+ockerbloom AA K ER B L UW M
+ockerman AA K ER M AH N
+oclair OW K L ER
+ocon AH K AA N
+oconnell OW K AA N AH L
+oconner OW K AA N ER
+oconner's OW K AA N ER Z
+oconnor OW K AA N ER
+oconnor's OW K AA N ER Z
+oct AO K T OW B ER
+oct(2) AO K T
+oct. AO K T
+oct.(2) AO K T OW B ER
+octagon AA K T AH G AA N
+octagonal AA K T AE G AH N AH L
+octahedral AA K T AH HH IY D R AH L
+octahedron AA K T AH HH IY D R AH N
+octane AA K T EY N
+octave AA K T IH V
+octaves AA K T IH V Z
+octavia AA K T EY V IY AH
+octavio AA K T EY V IY OW
+octavius AA K T EY V IY AH S
+octavus AA K T AH V UW S
+octel AA K T EH L
+octet AA K T EH T
+octial AA K T Y AH L
+octillion AA K T IH L Y AH N
+october AA K T OW B ER
+october's AA K T OW B ER Z
+octogenarian AA K T AH JH IH N EH R IY AH N
+octopi AA K T AH P AY
+octopus AA K T AH P UH S
+octuplet AA K T AH P L AH T
+octuplets AA K T AH P L AH T S
+oda OW D AH
+odaiko OW D EY K OW
+odaniel AA D AH N IY L
+oday OW D EY
+odd AA D
+oddball AA D B AO L
+oddballs AA D B AO L Z
+odden AA D AH N
+odder AA D ER
+oddest AA D AH S T
+oddi AA D IY
+oddi(2) OW D IY
+oddities AA D AH T IY Z
+oddity AA D AH T IY
+oddler AA D L ER
+oddler's AA D L ER Z
+oddly AA D L IY
+odds AA D Z
+odds-on AA D Z AA N
+oddsmaker AA D Z M EY K ER
+oddsmakers AA D Z M EY K ER Z
+oddy AA D IY
+ode OW D
+odea AA D IY AH
+oded OW D EH D
+odegaard AA D IH G AA R D
+odegard AA D IH G ER D
+odekirk AA D IH K ER K
+odele OW D EH L IY
+odelet AA D IH L IH T
+odelette AA D IH L EH T
+odelia OW D EH L IY AH
+odelinda OW D EH L IY N D AH
+odell OW D EH L
+odella OW D EH L AH
+odem OW D IH M
+oden OW D AH N
+odenthal AA D IH N TH AH L
+odeon OW D IY AH N
+oder OW D ER
+odes OW D Z
+odessa OW D EH S AH
+odetics OW D EH T IH K S
+odette OW D EH T
+odgers AA JH ER Z
+odiaum OW D IY AH M
+odiaun OW D IY AH N
+odier OW D IY ER
+odilia OW D IY L IY AH
+odin OW D AH N
+odiorne OW D IY AO R N IY
+odious OW D IY AH S
+odland AA D L AH N D
+odle OW D AH L
+odneal OW D N IY L
+odoherty OW D AA ER T IY
+odoherty(2) OW D OW ER T IY
+odolf AH D OW L F
+odom OW D AH M
+odometer OW D AA M AH T ER
+odometers OW D AA M AH T ER Z
+odoms OW D AH M Z
+odonald OW D AA N AH L D
+odonnel OW D AA N AH L
+odonnell OW D AA N AH L
+odonoghue OW D AA N AH HH Y UW
+odonoghue(2) OW D AA N AH HH UW
+odonohue OW D AA N AH HH Y UW
+odonovan OW D AA N AH V AH N
+odor OW D ER
+odorant OW D ER AH N T
+odorless OW D ER L AH S
+odorous OW D ER AH S
+odors OW D ER Z
+odowd OW D AW D
+odp OW D IY P IY
+odriscoll OW D R IH S K AA L
+odum OW D AH M
+odwalla AA D W AA L AH
+odwyer OW D W AY ER
+odysseus OW D IH S IY AH S
+odyssey AA D AH S IY
+odyssey's AA D AH S IY Z
+oedipal EH D AH P AH L
+oedipus EH D IH P AH S
+oehler OW L ER
+oehlert OW L ER T
+oehlke OW L K
+oehme OW M
+oehmen OW M AH N
+oehmens OW M AH N Z
+oehrlein AO R L AY N
+oeien OW IY AH N
+oelke OW L K
+oelkers OW L K ER Z
+oelman OW L M AH N
+oelrich OW L R IH K
+oelschlager OW L SH L EY G ER
+oenophile IY N AH F AY L
+oerlikon AO R L IH K AA N
+oertel AO R T AH L
+oesch OW SH
+oeser OW Z ER
+oest OW IH S T
+oesterle OW S T ER AH L
+oesterling OW S T ER L IH NG
+oesterreich OW S T ER AY K
+oesterreichische OW S T ER AY K IH SH IY
+oestreich OW S T R AY K
+oestreicher OW S T R AY K ER
+oetken OW T K AH N
+oetting OW T IH NG
+oettinger OW T IH N JH ER
+oettinger(2) OW T IH NG ER
+oeuvre UW V R AH
+oeuvre(2) ER V
+of AH V
+ofallon OW F AE L AH N
+ofarrell OW F EH R AH L
+ofarrell(2) OW F AE R AH L
+ofc OW EH F S IY
+ofelia OW F EY L IY AH
+ofer OW F ER
+off AO F
+off's AO F S
+offbeat AO F B IY T
+offen AO F AH N
+offend AH F EH N D
+offended AH F EH N D AH D
+offended(2) AH F EH N D IH D
+offender AH F EH N D ER
+offenders AH F EH N D ER Z
+offending AH F EH N D IH NG
+offends AH F EH N D Z
+offense AH F EH N S
+offenses AH F EH N S IH Z
+offensive AH F EH N S IH V
+offensively AH F EH N S IH V L IY
+offensives AH F EH N S IH V Z
+offer AO F ER
+offer's AO F ER Z
+offerdahl AA F ER D AA L
+offered AO F ER D
+offerer AO F ER ER
+offerers AO F ER ER Z
+offering AO F ER IH NG
+offering's AO F ER IH NG Z
+offering's(2) AO F R IH NG Z
+offering(2) AO F R IH NG
+offerings AO F ER IH NG Z
+offerings(2) AO F R IH NG Z
+offerman AO F ER M AH N
+offermann AO F ER M AH N
+offers AO F ER Z
+offhand AO F HH AE N D
+office AO F AH S
+office's AO F AH S IH Z
+officeholder AO F AH S HH OW L D ER
+officeholders AO F AH S HH OW L D ER Z
+officemax AO F AH S M AE K S
+officer AO F AH S ER
+officer's AO F IH S ER Z
+officer(2) AO F IH S ER
+officers AO F AH S ER Z
+officers' AO F IH S ER Z
+officers(2) AO F IH S ER Z
+offices AO F AH S AH Z
+offices(2) AO F AH S IH Z
+official AH F IH SH AH L
+official's AH F IH SH AH L Z
+officialdom AH F IH SH AH L D AH M
+officially AH F IH SH AH L IY
+officials AH F IH SH AH L Z
+officials' AH F IH SH AH L Z
+officiate AH F IH SH IY EY T
+officiated AH F IH SH IY EY T AH D
+officiates AH F IH SH IY EY T S
+officiating AH F IH SH IY EY T IH NG
+officio AH F IH S IY OW
+offield AA F IY L D
+offill AO F IH L
+offing AO F IH NG
+offner AA F N ER
+offord AA F ER D
+offs AO F S
+offset AO F S EH T
+offsets AO F S EH T S
+offsetting AO F S EH T IH NG
+offshoot AO F SH UW T
+offshoots AO F SH UW T S
+offshore AO F SH AO R
+offspring AO F S P R IH NG
+offstage AO F S T EY JH
+offutt AA F AH T
+ofilia OW F IY L IY AH
+oflaherty OW F L EY HH ER T IY
+oflaherty(2) OW F L EY ER T IY
+oflynn OW F L IH N
+oft AO F T
+oftedahl AA F T IH D AA L
+oftel AA F T EH L
+often AO F AH N
+often(2) AO F T AH N
+oftener AO F AH N ER
+oftener(2) AO F T AH N ER
+oftentimes AO F AH N T AY M Z
+oftentimes(2) AO F T AH N T AY M Z
+og AA G
+ogan OW G AH N
+ogara OW G AA R AH
+ogata OW G AA T AH
+ogawa OW G AA W AH
+ogborn AA G B ER N
+ogburn AA G B ER N
+ogden AA G D AH N
+ogden's AA G D AH N Z
+ogg AA G
+ogier OW G IY ER
+ogilvie AA JH IH L V IY
+ogilvie(2) OW G IH L V IY
+ogilvy OW G AH L V IY
+ogilvy's OW G AH L V IY Z
+oglala OW G L AA L AH
+ogle OW G AH L
+oglebay OW G AH L B EY
+ogled OW G AH L D
+ogles OW G AH L Z
+oglesbee OW G AH L Z B IY
+oglesby AA G AH L S B IY
+oglethorpe OW G AH L TH AO R P
+ogletree OW G AH L T R IY
+ognibene OW G N IY B EH N AH
+ogoni OW G OW N IY
+ogonyok OW G OW N Y AA K
+ogorman OW G AO R M AH N
+ogrady OW G R EY D IY
+ogre OW G ER
+ogren AA G R EH N
+ogress OW G R AH S
+oguin OW G UW IY N
+oguinn OW G W IH N
+oh OW
+oh's OW Z
+ohagan OW HH AA G AH N
+ohagan(2) OW HH EY G AH N
+ohair OW HH EH R
+ohalloran OW HH AE L ER AH N
+ohanesian OW HH AH N EH ZH IH N
+ohanian OW HH EY N IY AH N
+ohanlon OW HH AE N L AH N
+ohara OW HH EH R AH
+ohara's OW HH EH R AH Z
+ohare OW HH EH R
+oharra OW HH ER AH
+ohashi OW HH AA SH IY
+ohaver OW HH EY V ER
+ohba OW B AH
+ohbayashi OW B AA Y AA SH IY
+ohearn OW HH ER N
+ohern OW HH ER N
+oherron OW HH EH R AH N
+ohio OW HH AY OW
+ohio's OW HH AY OW Z
+ohioan OW HH AY OW AH N
+ohioans OW HH AY OW AH N Z
+ohkawara OW K AA W AA R AH
+ohl OW L
+ohland OW L AH N D
+ohlendorf OW L IH N D AO R F
+ohler OW L ER
+ohlin OW L IH N
+ohlinger OW L IH NG ER
+ohlman OW L M AH N
+ohlmann OW L M AH N
+ohlmeyer OW L M AY R
+ohlrich OW L R IH K
+ohlsen OW L S AH N
+ohlson OW L S AH N
+ohlsson OW L S AH N
+ohm OW M
+ohm's OW M Z
+ohmae OW M EY
+ohman OW M AH N
+ohmann OW M AH N
+ohmer OW M ER
+ohms OW M Z
+ohmura OW M UW R AH
+ohnemus OW N IH M IH S
+ohnstad OW N S T AH D
+ohr AO R
+ohrt AO R T
+ohs OW Z
+oi OY
+oie OY
+oien AA IY N
+oil OY L
+oil's OY L Z
+oiled OY L D
+oiler OY L ER
+oilers OY L ER Z
+oilfield OY L F IY L D
+oilfields OY L F IY L D Z
+oiling OY L IH NG
+oilman OY L M AE N
+oilmen OY L M EH N
+oils OY L Z
+oilseed OY L S IY D
+oilseeds OY L S IY D Z
+oilwell OY L W EH L
+oily OY L IY
+ointment OY N T M AH N T
+oishi OW IY SH IY
+oj OW JH EY
+oja OW Y AH
+ojala OW Y AA L AH
+ojeda OW Y EY D AH
+oji OW JH IY
+ojibwa OW JH IH B W AH
+ok OW K EY
+oka OW K AH
+okabe OW K AA B EY
+okada OW K AA D AH
+okaloosa AO K AH L UW S AH
+okaloosa(2) OW K AH L UW S AH
+okamoto OW K AH M OW T OW
+okamura OW K AH M UH R AH
+okane OW K EY N
+okano OW K AA N OW
+okasaki OW K AH S AA K IY
+okasan OW K EY Z AH N
+okay OW K EY
+okayed OW K EY D
+okays OW K EY Z
+okaz OW K AA Z
+okazaki OW K AA Z AA K IY
+okdo AO K D OW
+okeechobee OW K IY CH OW B IY
+okeefe OW K IY F
+okeeffe OW K IY F
+okelley OW K EH L IY
+okelly OW K EH L IY
+oken OW K EY AH N
+okerlund AA K ER L AH N D
+okeson OW K IH S AH N
+okey OW K IY
+okey-dokey OW K IY D OW K IY
+oki OW K IY
+okie OW K IY
+okimoto OW K IY M OW T OW
+okin OW K IH N
+okinawa OW K IH N AA W AH
+okinawa(2) OW K IY N AA W AH
+okinawans OW K IH N AA W AH N Z
+okinawans(2) OW K IY N AA W AH N Z
+oklahoma OW K L AH HH OW M AH
+oklahoma's OW K L AH HH OW M AH Z
+oklahoman OW K L AH HH OW M AH N
+oklahomans OW K L AH HH OW M AH N Z
+okon OW K OW N
+okoniewski OW K AA N IY EH F S K IY
+okoniewski(2) OW K AH N UW S K IY
+okonski AH K AA N S K IY
+okpo AA K P OW
+okra OW K R AH
+okray AA K R EY
+oksana AA K S AE N AH
+oksana's AA K S AE N AH Z
+oksenberg AA K S AH N B ER G
+okubo OW K UW B OW
+okuda OW K UW D AH
+okuma OW K Y UW M ER
+okumura OW K UW M UH R AH
+okun OW K UW N
+okuno OW K Y UW N OW
+okura OW K UW R AH
+okurowski OW K ER OW S K IY
+okwu AO K W UW
+ol' OW L
+ola OW L AH
+olack OW L AE K
+olaf OW L AA F
+olafson OW L AH F S AH N
+olague OW L AA G
+olah AH L AA
+olah(2) OW L AH
+olajuwon AH L AY JH UW AA N
+olajuwon's AH L AY JH UW AA N Z
+oland AA L AH N D
+olander AA L AH N D ER
+olano AH L AA N OW
+olasky OW L AE S K IY
+olathe OW L AE TH IY
+olaughlin OW L AO K L IH N
+olay OW L EY
+olayan OW L AY AH N
+olberding OW L B ER D IH NG
+olbrich OW L B R IH K
+olcott OW L K AH T
+olczak OW L CH AE K
+old OW L D
+old's OW L D Z
+old-timer OW L D T AY M ER
+old-timers OW L D T AY M ER Z
+oldaker OW L D AH K ER
+oldani OW L D AA N IY
+olde OW L D
+olden OW L D AH N
+oldenburg OW L D AH N B ER G
+oldenkamp OW L D IH N K AE M P
+older OW L D ER
+oldest OW L D AH S T
+oldfashioned OW L D F AE SH AH N D
+oldfather OW L D F AA DH ER
+oldfield OW L D F IY L D
+oldham OW L D AH M
+oldham's OW L D AH M Z
+oldie OW L D IY
+oldies OW L D IY Z
+oldman OW L D M AH N
+oldroyd OW L D R OY D
+olds OW L D Z
+oldsmar OW L D Z M AA R
+oldsmobile OW L D Z M OW B IY L
+oldsmobile's OW L D Z M OW B IY L Z
+oldsmobile's(2) OW L Z M OW B IY L Z
+oldsmobiles OW L D Z M OW B IY L Z
+oldster OW L D S T ER
+oldsters OW L D S T ER Z
+oldt OW L T
+ole OW L
+ole(2) OW L EY
+olea AA L IY AH
+olea(2) OW L IY
+oleaginous OW L IY AE JH AH N AH S
+olean OW L IY N
+oleander OW L IY AE N D ER
+oleandrin OW L IY AE N D R IH N
+olear OW L IH R
+oleary OW L IH R IY
+oleaster OW L IY AE S T ER
+olefin OW L AH F IH N
+olefins OW L AH F IH N Z
+oleg OW L AH G
+olejniczak AH L EY N IH CH AE K
+olejnik AH L EY N IH K
+oleksiak AH L EH K S IY AE K
+oleksy AH L EH K S IY
+olen AA L AH N
+olender AA L EH N D ER
+olenick AA L IH N IH K
+olenik AA L IH N IH K
+oleo OW L IY OW
+oleoyl OW L IY OY L
+oleoyls OW L IY OY L Z
+oler OW L ER
+oles OW L Z
+oles(2) OW L EY Z
+olesen AA L IY Z AH N
+oleske OW L AH S K IY
+olesky AH L EH S K IY
+oleson AA L IH S AH N
+olestra OW L EH S T R AH
+olexa AH L IY K S AH
+olexson OW L AH K S AH N
+oley OW L IY
+olfactory OW L F AE K T ER IY
+olga OW L G AH
+olguin OW L G IH N
+olick OW L IH K
+oliff AA L IH F
+oligarch OW L IH G AA R K
+oligarchs OW L IH G AA R K S
+oligarchy AA L AH G AA R K IY
+oliger AA L IH G ER
+oligocene AA L AH G OW S IY N
+oligopolistic OW L IH G AH P OW L IH S T IH K
+oligopoly AA L IH G AA P AH L IY
+olin OW L IH N
+olin's OW L IH N Z
+olinda OW L IY N D AH
+olinde AA L IH N D
+olinger AA L IH NG ER
+oliphant AA L IH F AH N T
+oliva OW L IY V AH
+olivares OW L IY V AA R EH S
+olivarez OW L IY V AA R EH Z
+olivas OW L IY V AA Z
+olive AA L AH V
+olive(2) AA L IH V
+oliveira AA L IH V EY R AH
+oliver AA L AH V ER
+oliver's AA L IH V ER Z
+oliver(2) AA L IH V ER
+olivera OW L IY V EH R AH
+oliveras OW L IY V EH R AA Z
+oliveri OW L IY V EH R IY
+oliveria AA L IH V IY R IY AH
+oliverio AA L IH V IY R IY OW
+olivero OW L IY V EH R OW
+oliveros OW L IY V EH R OW Z
+olives AA L IH V Z
+oliveto OW L IY V EY T OW
+olivette AA L IH V EH T
+olivetti AA L IH V EH T IY
+olivetti's AA L IH V EH T IY Z
+olivia OW L IH V IY AH
+olivia's OW L IH V IY AH Z
+olivier OW L IH V IY EY
+olivieri OW L IY V IH R IY
+olivine AA L AH V IY N
+olivo AO L IY V OW
+oliwa OW L IY W AH
+olk OW K
+olk(2) OW L K
+olkowski OW L K AO F S K IY
+olkowski's OW L K AO F S K IY Z
+ollar AA L ER
+oller AA L ER
+olley AA L IY
+ollie AA L IY
+ollie's AA L IY Z
+ollie's(2) OW L IY Z
+ollie(2) OW L IY
+olliff AA L IH F
+ollila AA L IH L AH
+ollinger AA L IH NG ER
+ollinger's AA L IH NG ER Z
+ollis AO L IY Z
+ollison AA L IH S AH N
+ollison's AA L IH S AH N Z
+olly AA L IY
+olmeda OW L M EY D AH
+olmedo OW L M EY D OW
+olmert OW L M ER T
+olmo OW L M OW
+olmos OW L M OW Z
+olmstead OW L M S T EH D
+olmstead's OW L M S T EH D Z
+olney OW L N IY
+olof OW L AO F
+olof's OW L AO F S
+olofson AA L AH F S AH N
+olofson's AA L AH F S AH N Z
+olokuei OW L OW K UW IY
+olokuei's OW L OW K UW IY Z
+oloughlin OW L AW K L IH N
+olovo AH L AO V OW
+olsdat OW L Z D AE T
+olsen OW L S AH N
+olsen's OW L S AH N Z
+olshan OW L SH AH N
+olshansky OW L SH AH N S K IY
+olshansky's OW L SH AH N S K IY Z
+olshefski OW L SH EH F S K IY
+olshefski's OW L SH EH F S K IY Z
+olsher OW L SH ER
+olson OW L S AH N
+olson's OW L S AH N Z
+olsson OW L S AH N
+olstad OW L S T AH D
+olsten OW L S T AH N
+olszewski OW L SH EH F S K IY
+olt OW L T
+olthoff OW L T HH AO F
+oltman OW L T M AH N
+oltmann OW L T M AH N
+oltmanns OW L T M AH N Z
+olund AA L AH N D
+olva OW L V AH
+olver OW L V ER
+olvera OW L V EH R AH
+olvey OW L V IY
+olympia OW L IH M P IY AH
+olympia's OW L IH M P IY AH Z
+olympiad OW L IH M P IY AE D
+olympian OW L IH M P IY AH N
+olympians OW L IH M P IY AH N Z
+olympias OW L IH M P IY AH S
+olympic OW L IH M P IH K
+olympic's OW L IH M P IH K S
+olympics OW L IH M P IH K S
+olympus OW L IH M P AH S
+oma OW M AH
+omaar OW M AA R
+omaha OW M AH HH AA
+omaha's OW M AH HH AA Z
+omahoney OW M AH HH OW N IY
+omahony OW M AH HH OW N IY
+omalley OW M AE L IY
+oman OW M AA N
+omani OW M AA N IY
+omans OW M AA N Z
+omar OW M AA R
+omara OW M AA R AH
+omarska OW M AA R S K AH
+omary AH M EH R IY
+ombudsman AA M B AH D Z M AH N
+omdahl AA M D AA L
+omead OW M IY D
+omeara OW M IY R AH
+omeara(2) OW M AA R AH
+omega OW M EH G AH
+omega(2) OW M EY G AH
+omelet AA M L AH T
+omelets AA M L AH T S
+omelia OW M EH L IY AH
+omen OW M AH N
+omens OW M AH N Z
+omer OW M ER
+ominous AA M AH N AH S
+ominously AA M AH N AH S L IY
+omission OW M IH SH AH N
+omissions OW M IH SH AH N Z
+omit OW M IH T
+omits OW M IH T S
+omitted OW M IH T AH D
+omitted(2) OW M IH T IH D
+omitting OW M IH T IH NG
+omlor AA M L ER
+ommen AA M AH N
+ommen(2) OW M AH N
+omni AA M N IY
+omnibank AA M N IH B AE NG K
+omnibook AA M N IH B UH K
+omnibus AA M N AH B AH S
+omnibuses AA M N AH B AH S AH Z
+omnicare AA M N IH K EH R
+omnicom AA M N IH K AA M
+omnicom's AA M N IH K AA M Z
+omnipotence AA M N IH P AH T AH N S
+omnipotent AA M N IH P AH T AH N T
+omnipresence AA M N AH P R EH Z AH N S
+omnipresent AA M N IH P R EH Z AH N T
+omniscient AA M N IH SH AH N T
+omnivorous AA M N IH V ER AH S
+omohundro OW M OW HH UW N D R OW
+omonia AH M OW N IY AH
+omonia(2) OW M OW N Y AH
+omori OW M AO R IY
+omron AA M R AH N
+on AA N
+on(2) AO N
+ona AH N AA
+onagers AA N AH JH ER Z
+onan OW N AH N
+onassis OW N AE S IH S
+onassis' OW N AE S IH S
+onassis'(2) OW N AA S IH S
+onassis's OW N AE S IH S IH S
+onassis's(2) OW N AA S IH S IH S
+onassis(2) OW N AA S IH S
+onate OW N EY T
+onawa OW N AA W AH
+onboard AA N B AO R D
+oncale OW N K AA L IY
+once W AH N S
+oncogen AA NG K OW JH AH N
+oncogene AA NG K OW JH IY N
+oncogenes AA NG K AA JH EH N IY S
+oncologist AA NG K AA L AH JH IH S T
+oncologists AA NG K AA L AH JH IH S T S
+oncologists(2) AA NG K AA L AH JH IH S S
+oncologists(3) AA NG K AA L AH JH IH S
+oncology AA NG K AA L AH JH IY
+oncoming AO N K AH M IH NG
+oncor AA N K AO R
+ondaatje AA N D AA T Y AH
+onder AA N D ER
+onderdonk AA N D ER D AH NG K
+ondo AO N D OW
+ondracek AA N D R AH S EH K
+one W AH N
+1 W AH N
+1(2) HH W AH N
+one's W AH N Z
+one(2) HH W AH N
+one-up-manship W AH N AH P M AE N SH IH P
+one-upmanship W AH N AH P M AH N SH IH P
+one-way W AH N W EY
+oneal OW N IY L
+oneall AA N AH L
+onecomm W AH N K AA M
+oneida OW N AY D AH
+oneil OW N IY L
+oneill OW N IY L
+oneness W AH N N AH S
+oneness(2) W AH N AH S
+oneok OW N IY AA K
+onerous OW N ER AH S
+ones W AH N Z
+ones' W AH N Z
+oneself W AH N S EH L F
+onetime W AH N T AY M
+onex W AH N EH K S
+onex's W AH N EH K S IH Z
+oney OW N IY
+oneyear W AH N Y IH R
+ong AO NG
+ongoing AA N G OW IH NG
+ongoing(2) AO N G OW IH NG
+ongpin AO NG P IH N
+onion AH N Y AH N
+onions AH N Y AH N Z
+onishi OW N IY SH IY
+onken AA NG K AH N
+onley AA N L IY
+online AO N L AY N
+online's AO N L AY N Z
+onlooker AO N L UH K ER
+onlookers AO N L UH K ER Z
+only OW N L IY
+onnen AA N AH N
+onni AA N IY
+onno AA N OW
+ono OW N OW
+onoda OW N OW D AH
+onofre OW N AO F R IY
+onofrio OW N OW F R IY OW
+onomastic AA N AH M AE S T IH K
+onomastics AA N AH M AE S T IH K S
+onomatopeia AA N AH M AE T AH P IY AH
+onondaga AA N AH N D AO G AH
+onorato OW N AO R AA T OW
+onrushing AA N R AH SH IH NG
+ons AA N Z
+onscreen AA N S K R IY N
+onset AA N S EH T
+onset(2) AO N S EH T
+onshore AA N SH AO R
+onsite AA N S AY T
+onslaught AO N S L AO T
+onslow AA N S L OW
+onstad AA N S T AH D
+onstage AA N S T EY JH
+onstott AA N S T AH T
+ontario AA N T EH R IY OW
+ontario's AA N T EH R IY OW Z
+ontiveros OW N T IY V EH R OW Z
+ontko AA N T K OW
+onto AA N T UW
+onto(2) AO N T UW
+ontogeny AA N T AA JH AH N IY
+ontological AA N T AH L AA JH IH K AH L
+ontology AA N T AA L AH JH IY
+onus OW N AH S
+onward AO N W ER D
+onwards AA N W ER D Z
+onyx AA N IH K S
+oodle UW D AH L
+oodles UW D AH L Z
+ooh UW
+oohs UW Z
+ooley UW L IY
+oolong UW L AO NG
+oomph UW M F
+oona UW N AH
+oooh UW
+ooohs UW Z
+ooohs(2) OW Z
+oop UW P
+ooph UW F
+oops UW P S
+ooten UW T AH N
+ooze UW Z
+oozed UW Z D
+oozes UW Z IH Z
+oozing UW Z IH NG
+op AA P
+op's AA P S
+op(2) AO P
+opacity OW P AE S AH T IY
+opal OW P AH L
+opal's OW P AH L Z
+opalina OW P AA L IY N AH
+opaline OW P AH L IY N
+opalines OW P AH L IY N Z
+opalka AH P AA L K AH
+opaque OW P EY K
+opax OW P AE K S
+opcom AA P K AA M
+opdahl AA P D AA L
+opdyke AA P D AY K
+opec OW P EH K
+opec's OW P EH K S
+opel OW P AH L
+opel's OW P AH L Z
+open OW P AH N
+opened OW P AH N D
+opener OW P AH N ER
+openers OW P AH N ER Z
+opening OW P AH N IH NG
+openings OW P AH N IH NG Z
+openly OW P AH N L IY
+openness OW P AH N N AH S
+openness(2) OW P AH N AH S
+opens OW P AH N Z
+openshaw OW P AH N SH AO
+openwork OW P AH N W ER K
+opera AA P R AH
+opera's AA P R AH Z
+operable AA P ER AH B AH L
+operan AA P ER AH N
+operandi AA P ER AE N D IY
+operandi(2) AA P ER AE N D AY
+operandi(3) AA P ER EH N D AY
+operant AA P ER AH N T
+operas AA P R AH Z
+operate AA P ER EY T
+operate(2) AO P ER EY T
+operated AA P ER EY T AH D
+operates AA P ER EY T S
+operatic AA P ER AE T IH K
+operating AA P ER EY T IH NG
+operating(2) AO P ER EY T IH NG
+operation AA P ER EY SH AH N
+operation's AA P ER EY SH AH N Z
+operational AA P ER EY SH AH N AH L
+operationally AA P ER EY SH AH N AH L IY
+operationally(2) AA P ER EY SH N AH L IY
+operations AA P ER EY SH AH N Z
+operations' AA P ER EY SH AH N Z
+operative AA P ER AH T IH V
+operatives AA P ER AH T IH V Z
+operator AA P ER EY T ER
+operator's AA P ER EY T ER Z
+operators AA P ER EY T ER Z
+operators' AO P ER EY T ER Z
+operators(2) AO P ER EY T ER Z
+opere OW P EH R
+operetta AA P ER EH T AH
+operettas AA P ER EH T AH Z
+opfer AA P F ER
+opheim AA P HH AY M
+ophelia AH F IY L Y AH
+ophthalmic AA F TH AE L M IH K
+ophthalmologist AA P TH AH M AA L AH JH IH S T
+ophthalmologist(2) AA F TH AH M AA L AH JH IH S T
+ophthalmologists AA P TH AH M AA L AH JH IH S T S
+ophthalmologists(2) AA P TH AH M AA L AH JH IH S
+ophthalmologists(3) AA F TH AH M AA L AH JH IH S T S
+ophthalmologists(4) AA F TH AH M AA L AH JH IH S
+ophthalmology AA P TH AH M AA L AH JH IY
+ophthalmology(2) AA F TH AH M AA L AH JH IY
+ophthalmoscope AA F TH AE L M AH S K OW P
+ophuls OW F AH L Z
+opiate OW P IY AH T
+opiates OW P IY AH T S
+opic AA P IH K
+opic's AA P IH K S
+opie OW P IY
+opiela OW P IY L AH
+opine OW P AY N
+opined OW P AY N D
+opines OW P AY N Z
+opining OW P AY N IH NG
+opinion AH P IH N Y AH N
+opinionate AH P IH N Y AH N EY T
+opinionated AH P IH N Y AH N EY T IH D
+opinions AH P IH N Y AH N Z
+opitz AA P IH T S
+opium OW P IY AH M
+opland AA P L AH N D
+ople OW P AH L
+oplinger OW P AH L IH NG ER
+oplinger(2) OW P L IH NG ER
+opossum OW P AA S AH M
+opp AA P
+oppedisano OW P EH D IY S AA N OW
+oppel AA P AH L
+oppelt AA P IH L T
+oppenheim AA P IH N HH AY M
+oppenheimer AA P AH N HH AY M ER
+oppenheimer's AA P AH N HH AY M ER Z
+oppenheimers AA P AH N HH AY M ER Z
+oppens AA P AH N Z
+opper AA P ER
+opperman AA P ER M AH N
+oppermann AA P ER M AH N
+oppler AO P L ER
+oppliger AA P L IH G ER
+opponent AH P OW N AH N T
+opponent's AH P OW N AH N T S
+opponents AH P OW N AH N T S
+opponents' AH P OW N AH N T S
+opportune AA P ER T UW N
+opportunism AA P ER T UW N IH Z AH M
+opportunist AA P ER T UW N IH S T
+opportunistic AA P ER T UW N IH S T IH K
+opportunists AA P ER T UW N IH S T S
+opportunists(2) AA P ER T UW N IH S S
+opportunists(3) AA P ER T UW N IH S
+opportunities AA P ER T UW N AH T IY Z
+opportunity AA P ER T UW N AH T IY
+oppose AH P OW Z
+opposed AH P OW Z D
+opposes AH P OW Z IH Z
+opposing AH P OW Z IH NG
+opposite AA P AH Z AH T
+opposite(2) AA P Z AH T
+opposites AA P AH Z AH T S
+opposition AA P AH Z IH SH AH N
+opposition's AA P AH Z IH SH AH N Z
+oppositions AA P AH Z IH SH AH N Z
+oppress AH P R EH S
+oppressed AH P R EH S T
+oppresses AH P R EH S IH Z
+oppressing AH P R EH S IH NG
+oppression AH P R EH SH AH N
+oppressions AH P R EH SH AH N Z
+oppressive AH P R EH S IH V
+oppressor AH P R EH S ER
+oppressors AH P R EH S ER Z
+opprobrium AH P R OW B R IY AH M
+oprah OW P R AH
+oprah's OW P R AH Z
+opry AA P R IY
+opryland AA P R IY L AH N D
+ops AA P S
+opsahl AA P S AA L
+opsal AA P S AH L
+opt AA P T
+optation AA P T EY SH AH N
+opted AA P T IH D
+optek AA P T EH K
+opthalmologist AA F TH AH L M AA L AH JH IH S T
+opthalmology AA F TH AH L M AO L AH JH IY
+optic AA P T IH K
+optica AA P T IH K AH
+optical AA P T IH K AH L
+optical's AA P T IH K AH L Z
+optically AA P T IH K L IY
+optician AA P T IH SH AH N
+opticians AA P T IH SH AH N Z
+optics AA P T IH K S
+optima AA P T AH M AH
+optimal AA P T AH M AH L
+optimism AA P T AH M IH Z AH M
+optimist AA P T AH M IH S T
+optimistic AA P T AH M IH S T IH K
+optimistically AA P T IH M IH S T IH K AH L IY
+optimistically(2) AA P T IH M IH S T IH K L IY
+optimists AA P T AH M IH S T S
+optimists(2) AA P T AH M IH S S
+optimists(3) AA P T AH M IH S
+optimization AA P T AH M AH Z EY SH AH N
+optimize AA P T AH M AY Z
+optimum AA P T AH M AH M
+opting AA P T IH NG
+option AA P SH AH N
+option's AA P SH AH N Z
+option(2) AO P SH AH N
+optional AA P SH AH N AH L
+optional(2) AO P SH AH N AH L
+optioned AA P SH AH N D
+optioned(2) AO P SH AH N D
+optioning AA P SH AH N IH NG
+optioning(2) AO P SH AH N IH NG
+options AA P SH AH N Z
+options' AA P SH AH N Z
+options(2) AO P SH AH N Z
+opto AA P T OW
+optometric AA P T OW M EH T R IH K
+optometrist AA P T AA M AH T R IH S T
+optometrists AA P T AA M AH T R IH S T S
+optometrists(2) AA P T AA M AH T R IH S S
+optometrists(3) AA P T AA M AH T R IH S
+optometry AA P T AA M AH T R IY
+opts AA P T S
+optus AA P T AH S
+opulence AA P Y AH L AH N S
+opulent AA P Y AH L AH N T
+opus OW P AH S
+oquendo OW K W EH N D OW
+oquin OW K W IY N
+oquinn OW K W IY N
+or AO R
+or(2) ER
+ora AO R AH
+orabel AO R AA B EH L
+orabelle AO R AH B AH L
+oracle AO R AH K AH L
+oracle's AO R AH K AH L Z
+oracles AO R AH K AH L Z
+oradour AO R AH D AO R
+oraflex AO R AH F L EH K S
+orahood AO R AH HH UH D
+oral AO R AH L
+oralia AO R AA L IY AH
+oralie AO R AH L IY
+orally AO R AH L IY
+oram AO R AH M
+oran AO R AA N
+orand AO R AH N D
+orange AO R AH N JH
+orange(2) AO R IH N JH
+orangeburg AO R AH N JH B ER G
+oranges AO R AH N JH AH Z
+oranges(2) AO R IH N JH IH Z
+orangina AO R AE N JH IY N ER
+orangina(2) AO R AE N JH IY N AH
+orangutan AO R AE NG AH T AE N
+orangutan's AO R AE NG AH T AE N Z
+orangutan's(2) AO R AE NG AH T AA N Z
+orangutan(2) AO R AE NG AH T AA N
+orangutans AO R AE NG AH T AE N Z
+orangutans(2) AO R AE NG AH T AA N Z
+orasure AO R AH SH UH R
+oration AO R EY SH AH N
+orations AO R EY SH AH N Z
+orator AO R AH T ER
+oratorical AO R AH T AO R AH K AH L
+oratorio AA R AH T AO R IY OW
+orators AO R AH T ER Z
+oratory AO R AH T AO R IY
+oravec AO R AA V IH K
+oravetz AO R AH V IH T S
+orb AO R B
+orbach AO R B AA K
+orban AO R B AH N
+orbanco AO R B AE NG K OW
+orben AO R B AH N
+orbin AO R B IH N
+orbis AO R B IH S
+orbit AO R B AH T
+orbital AO R B AH T AH L
+orbited AO R B AH T AH D
+orbiter AO R B AH T ER
+orbiters AO R B AH T ER Z
+orbiting AO R B AH T IH NG
+orbits AO R B AH T S
+orca AO R K AH
+orcas AO R K AH S
+orchard AO R CH ER D
+orchards AO R CH ER D Z
+orchestra AO R K AH S T R AH
+orchestra's AO R K AH S T R AH Z
+orchestral AO R K EH S T R AH L
+orchestrally AO R K EH S T R AH L IY
+orchestras AO R K AH S T R AH Z
+orchestrate AO R K IH S T R EY T
+orchestrated AO R K IH S T R EY T IH D
+orchestrates AO R K AH S T R EY T S
+orchestrating AO R K IH S T R EY T IH NG
+orchestration AO R K AH S T R EY SH AH N
+orchestrations AO R K AH S T R EY SH AH N Z
+orchid AO R K AH D
+orchids AO R K AH D Z
+orct AO R K T
+orcutt AO R K AH T
+ord AO R D
+ordain AO R D EY N
+ordained AO R D EY N D
+ordaining AO R D EY N IH NG
+ordaz AO R D AA Z
+ordeal AO R D IY L
+ordeals AO R D IY L Z
+ordella AO R D EH L AH
+order AO R D ER
+order's AO R D ER Z
+ordered AO R D ER D
+ordering AO R D ER IH NG
+orderliness AO R D ER L IY N AH S
+orderly AO R D ER L IY
+orders AO R D ER Z
+ordinance AO R D AH N AH N S
+ordinances AO R D AH N AH N S IH Z
+ordinaries AO R D AH N EH R IY Z
+ordinarily AO R D AH N EH R AH L IY
+ordinary AO R D AH N EH R IY
+ordination AO R D AH N EY SH AH N
+ordiway AO R D IY W EY
+ordnance AO R D N AH N S
+ordnance's AO R D N AH N S IH Z
+ordonez AO R D OW N EH Z
+ordoyne AO R D OY N
+ordway AO R D W EY
+ore AO R
+orea ER IY AH
+orear ER IH R
+orebaugh AO R EH B AO
+oreffice AO R EH F IH S
+orefice AO R EH F AY S
+oregan AO R EH G AH N
+oregano AO R EH G AH N OW
+oregano(2) ER EH G AH N OW
+oregon AO R AH G AH N
+oregon's AO R AH G AH N Z
+oregon's(2) AO R AH G AA N Z
+oregon(2) AO R AH G AA N
+oregonian AO R AH G OW N IY AH N
+oregonians AO R AH G OW N IY AH N Z
+oreilly AO R AH L IY
+orel AO R AH L
+orela AO R EH L AH
+orelia AO R EH L IY AH
+orellana AO R EH L AE N AH
+orelon AO R AH L AA N
+orem AO R IH M
+oren AO R AH N
+orenda AO R EH N D AH
+orendorff AO R IH N D AO R F
+orens AO R AH N Z
+orenstein AO R AH N S T AY N
+orenstein(2) AO R AH N S T IY N
+orenthal AO R AH N TH AA L
+oreo AO R IY OW
+ores AO R Z
+oreskovich AO R EH S K AH V IH CH
+orestes AO R EH S T IY Z
+orf AO R F
+orfield AO R F IY L D
+orford AO R F ER D
+org AO R G
+organ AO R G AH N
+organelles AO R G AH N EH L Z
+organic AO R G AE N IH K
+organically AO R G AE N IH K L IY
+organics AO R G AE N IH K S
+organisation AO R G AH N IH Z EY SH AH N
+organisations AO R G AH N IH Z EY SH AH N Z
+organism AO R G AH N IH Z AH M
+organism's AO R G AH N IH Z AH M Z
+organismic AO R G AH N IH Z M IH K
+organisms AO R G AH N IH Z AH M Z
+organist AO R G AH N AH S T
+organization AO R G AH N AH Z EY SH AH N
+organization's AO R G AH N IH Z EY SH AH N Z
+organizational AO R G AH N AH Z EY SH AH N AH L
+organizations AO R G AH N AH Z EY SH AH N Z
+organize AO R G AH N AY Z
+organized AO R G AH N AY Z D
+organizer AO R G AH N AY Z ER
+organizers AO R G AH N AY Z ER Z
+organizes AO R G AH N AY Z IH Z
+organizing AO R G AH N AY Z IH NG
+organogenesis AO R G AH N OW JH EH N AH S IH S
+organs AO R G AH N Z
+organum AO R G AH N AH M
+orgasm AO R G AE Z AH M
+orgasms AO R G AE Z AH M Z
+orgel AO R G AH L
+orgeron AO R G ER AH N
+orgies AO R JH IY Z
+orgill AO R JH AH L
+orgotein AO R G OW T AY N
+orgy AO R JH IY
+ori AO R IY
+oriana AO R IY AE N AH
+orick AO R IH K
+orielda AO R IY L D AH
+orielle AO R IY EH L
+orient AO R IY EH N T
+oriental AO R IY EH N T AH L
+oriental(2) AO R IY EH N AH L
+orientals AO R IY EH N T AH L Z
+orientals(2) AO R IY EH N AH L Z
+orientated AO R IY AH N T EY T IH D
+orientation AO R IY EH N T EY SH AH N
+orientations AO R IY EH N T EY SH AH N Z
+oriented AO R IY EH N T AH D
+oriented(2) AO R IY EH N T IH D
+orifice AO R AH F AH S
+orifices AO R AH F AH S AH Z
+origin AO R AH JH AH N
+original ER IH JH AH N AH L
+originality ER IH JH AH N AE L IH T IY
+originally ER IH JH AH N AH L IY
+originally(2) ER IH JH N AH L IY
+originals ER IH JH AH N AH L Z
+originate ER IH JH AH N EY T
+originated ER IH JH AH N EY T AH D
+originated(2) AO R IH JH AH N EY T IH D
+originates ER IH JH AH N EY T S
+originating ER IH JH AH N EY T IH NG
+origination ER IH JH AH N EY SH AH N
+originations ER IH JH AH N EY SH AH N Z
+originator ER IH JH AH N EY T ER
+originators ER IH JH AH N EY T ER Z
+origins AO R AH JH IH N Z
+oriley OW R AY L IY
+orilla AO R IH L AH
+orin AO R IH N
+orinda ER IH N D AH
+orinoco AO R AH N OW K OW
+oriola AO R IY OW L AH
+oriole AO R IY OW L
+orioles AO R IY OW L Z
+orioles' AO R IY OW L Z
+orion OW R AY AH N
+orion's OW R AY AH N Z
+orion's(2) AO R AY AH N Z
+orion(2) AO R AY AH N
+oriordan OW R IH R D AH N
+oriordan(2) AO R IH R D AH N
+oritz AO R IH T S
+orix AO R IH K S
+orkem AO R K AH M
+orkin AO R K IH N
+orkney AO R K N IY
+orks AO R K S
+orky AO R K IY
+orla AO R L AH
+orlan AO R L AH N
+orland AO R L AH N D
+orlanda AO R L AA N D AH
+orlandi AO R L AA N D IY
+orlando AO R L AE N D OW
+orlando's AO R L AE N D OW Z
+orlean AO R L IY AH N
+orlean's AO R L IY AH N Z
+orlean's(2) AO R L IY N Z
+orleanian AO R L IY AH N IY AH N
+orleanians AO R L IY AH N IY AH N Z
+orleans AO R L IY AH N Z
+orleans(2) AO R L IY N Z
+orlena AO R L IH N AH
+orlene AO R L IY N
+orlich AO R L IH K
+orlick AO R L IH K
+orloff AO R L AO F
+orloff's AO R L AO F S
+orloski AO R L AW S K IY
+orloski's AO R L AW S K IY Z
+orlosky AO R L OW S K IY
+orlosky's AO R L OW S K IY Z
+orlowski AO R L AO F S K IY
+orlowski's AO R L AO F S K IY Z
+orly AO R L IY
+orman AO R M AH N
+ormand AO R M AH N D
+ormand's AO R M AH N D Z
+orme AO R M
+ormerod AO R M ER AH D
+ormes AO R M Z
+ormiston AO R M IH S T AA N
+ormiston's AO R M IH S T AA N Z
+ormond AO R M AH N D
+ormond's AO R M AH N D Z
+ormonde AO R M AH N D
+ormsbee AO R M Z B IY
+ormsby AO R M Z B IY
+ormsby's AO R M Z B IY Z
+orn AO R N
+orna AO R N AH
+ornament AO R N AH M AH N T
+ornamental AO R N AH M EH N T AH L
+ornamentally AO R N AH M EH N T AH L IY
+ornamentation AO R N AH M EH N T EY SH AH N
+ornamented AO R N AH M EH N T IH D
+ornaments AO R N AH M AH N T S
+ornate AO R N EY T
+ornately AO R N EY T L IY
+ornda AO R N D AH
+orndoff AO R N D AO F
+orndorff AO R N D AO R F
+orne AO R N
+ornelas AO R N IH L AH Z
+ornella AO R N EH L AH
+ornella's AO R N EH L AH Z
+ornellas AO R N EH L AH Z
+orner AO R N ER
+ornery AO R N ER IY
+ornette AO R N EH T
+ornish AO R N IH SH
+ornithological AO R N IH TH AH L AO JH IH K AH L
+ornithology AO R N IH TH AA L AH JH IY
+ornoff AO R N AA F
+ornstein AO R N S T AY N
+ornstein(2) AO R N S T IY N
+oro AO R OW
+oroark OW R AO R K
+orogenic AO R AH JH EH N IH K
+orogil AO R OW G IH L
+orographic AO R AH G R AE F IH K
+orona AO R OW N AH
+oropeza AO R OW P EH Z AH
+oros AO R OW Z
+orosco AO R OW S K OW
+orosz AO R AH SH
+orourke ER UH R K
+orozco AO R OW Z K OW
+orpah AO R P AA
+orphan AO R F AH N
+orphanage AO R F AH N AH JH
+orphanages AO R F AH N IH JH IH Z
+orphaned AO R F AH N D
+orphaning AO R F AH N IH NG
+orphans AO R F AH N Z
+orphee AO R F IY
+orpheum AO R F IY UW M
+orpheus AO R F IY AH S
+orphic AO R F IH K
+orpiment AO R P AH M AH N T
+orr AO R
+orran AO R AA N
+orrell AO R EY L
+orren AO R AH N
+orrery AO R ER IY
+orrick AO R IH K
+orrico AO R IY K OW
+orrin AO R IH N
+orris AO R IH S
+orrison AO R IH S AH N
+orsa AO R S AH
+orsak AO R S AH K
+orsay AO R S EY
+orsay(2) AH R S EY
+orsborn AO R S B ER N
+orsborn(2) AO R Z B ER N
+orsburn AO R S B ER N
+orsburn(2) AO R Z B ER N
+orser AO R S ER
+orsi AO R S IY
+orsini AO R S IY N IY
+orsino AO R S IY N OW
+orso AO R S OW
+orsola AO R S OW L AH
+orson AO R S AH N
+ort AO R T
+orta AO R T AH
+ortega AO R T EY G AH
+ortega's AO R T EY G AH Z
+ortegas AO R T EY G AH S
+ortego AO R T EY G OW
+ortegon AO R T EY G AO N
+orten AO R T AH N
+ortenzio AO R T EH N Z IY OW
+ortez AO R T EH Z
+orth AO R TH
+ortho AO R TH OW
+orthoclase AO R TH AH K L EY S
+orthodontia AO R TH AH D AA N CH IY AH
+orthodontic AO R TH AH D AA N T IH K
+orthodontics AO R TH AH D AA N T IH K S
+orthodontist AO R TH AH D AA N T AH S T
+orthodontist's AO R TH AH D AA N T AH S T S
+orthodontists AO R TH AH D AA N T AH S T S
+orthodontists(2) AO R TH AH D AA N T AH S S
+orthodontists(3) AO R TH AH D AA N T AH S
+orthodox AO R TH AH D AA K S
+orthodoxy AO R TH AH D AA K S IY
+orthogonal AO R TH AO G AH N AH L
+orthography AO R TH AA G R AH F IY
+orthopedic AO R TH AH P IY D IH K
+orthopedist AO R TH AH P IY D AH S T
+orthopedists AO R TH AH P IY D AH S T S
+orthopedists(2) AO R TH AH P IY D AH S S
+orthopedists(3) AO R TH AH P IY D AH S
+ortis AO R T IH S
+ortiz AO R T IY Z
+ortlieb AO R T L IY B
+ortloff AO R T L AO F
+ortman AO R T M AH N
+ortmann AO R T M AH N
+ortner AO R T N ER
+ortolano AO R T OW L AA N OW
+ortomisio AO R T AH M IH S IY OW
+orton AO R T AH N
+ortwein AO R T W AY N
+ortwin AO R T W IH N
+orum AO R AH M
+orva AO R V AH
+orval AO R V AH L
+orville AO R V IH L
+orvin AO R V IH N
+orvis AO R V IH S
+orwell AO R W EH L
+orwell's AO R W EH L Z
+orwellian AO R W EH L IY AH N
+orwick AO R W IH K
+orwig AO R W IH G
+ory AO R IY
+oryx AO R IH K S
+orzech AO R Z IH HH
+orzechowski AO R Z IH HH AO F S K IY
+orzel AO R Z AH L
+os AA S
+osage OW S EY JH
+osages OW S EY JH AH Z
+osaka OW S AA K AH
+osake OW S AA K IY
+osaki OW S AA K IY
+osakowa OW S AH K OW AH
+osakowa's OW S AH K OW AH Z
+osama OW S AA M AH
+osamu OW S AA M UW
+osberg AA S B ER G
+osbert AA S B ER T
+osbon AA S B AH N
+osborn AO Z B AO R N
+osborne AO Z B AO R N
+osborne's AO Z B AO R N Z
+osbourn AA S B ER N
+osbourne AA S B ER N
+osbun AA S B AH N
+osburn AA S B ER N
+osby AA S B IY
+oscalus AO S K AH L AH S
+oscar AO S K ER
+oscar's AO S K ER Z
+oscars AO S K ER Z
+oscarson AA S K AA R S AH N
+osceola AO S K IY OW L AH
+osceola(2) AO S IY OW L AH
+oscillate AA S AH L EY T
+oscillated AA S AH L EY T AH D
+oscillates AA S AH L EY T S
+oscillating AA S AH L EY T IH NG
+oscillation AA S AH L EY SH AH N
+oscillations AA S AH L EY SH AH N Z
+oscillator AA S AH L EY T ER
+oscillators AA S AH L EY T ER Z
+oscillatory AA S AH L AH T AO R IY
+oscilloscope AO S IH L AH S K OW P
+oscilloscopes AO S IH L AH S K OW P S
+osco AA S K OW
+ose OW Z
+oseguera OW S EY G EH R AH
+oser OW S ER
+osgood AA S G UH D
+osh AA SH
+osha OW SH AH
+osha's OW SH AH Z
+oshaf OW SH AA F
+oshatz OW SH AE T S
+oshaughnessy OW SH AA N IH S IY
+oshawa AO SH AA W AH
+oshea OW SH EY
+oshel AA SH AH L
+oshell OW SH AH L
+osher AA SH ER
+oshields OW SH IY L D Z
+oshima OW SH IY M AH
+oshiro OW SH IH R OW
+oshita OW SH IY T AH
+oshkosh AO SH K AO SH
+oshman AO SH M AH N
+oshman's AO SH M AH N Z
+osiecki AH S IY T S K IY
+osika AH S AY K AH
+osinski AH S IH N S K IY
+oskar AO S K ER
+osland AA S L AH N D
+osler AA Z L ER
+osley AA S L IY
+oslin AA S L IH N
+oslo AA Z L OW
+oslund AA S L AH N D
+osman AA S M AH N
+osmar AA S M ER
+osmena AO Z M IY N AH
+osment AA S M AH N T
+osmer AA S AH M ER
+osmium AA Z M IY AH M
+osmon AA S M AH N
+osmond AA S M AH N D
+osmonds AO Z M AH N D Z
+osmosis AO Z M OW S IH S
+osmotic AA Z M AA T AH K
+osmun AA Z M AH N
+osmund AA S M AH N D
+osmundson AA Z M AH N D S AH N
+osorio OW S AO R IY OW
+osowski AH S AO F S K IY
+ospina OW S P IY N AH
+osprey AO S P R IY
+osred AA S ER D
+osric AA Z R IH K
+oss AO S
+ossa AA S AH
+ossetia AA S EH SH Y AH
+ossetia(2) AA S IY SH Y AH
+ossetian AA S EH SH Y IH N
+ossetian(2) AA S IY SH Y IH N
+ossetians AA S EH SH Y IH N Z
+ossetians(2) AA S IY SH Y IH N Z
+ossicles AA S AH K AH L Z
+ossification AA S AH F AH K EY SH AH N
+ossified AA S AH F AY D
+ossify AA S AH F AY
+ossman AA S M AH N
+osso OW S OW
+osswald AA S W AH L D
+ost OW S T
+ostankino AA S T AH N K IH N OW
+ostberg AA S T B ER G
+ostby AA S T B IY
+osteen AA S T IY N
+osten AA S AH N
+ostendorf AA S T AH N D AO R F
+ostensible AA S T EH N S AH B AH L
+ostensibly AA S T EH N S AH B L IY
+ostenson AA S T IH N S AH N
+ostentation AO S T EH N T EY SH AH N
+ostentatious AA S T AH N T EY SH AH S
+ostentatiously AA S T AH N T EY SH AH S L IY
+osteoarthritis AA S T IY OW AA R TH R AY T AH S
+osteopathic AA S T IY AH P AE TH IH K
+osteoporosis AO S T IY AA P ER OW S IH S
+oster AA S T ER
+osterberg AA S T ER B ER G
+ostergaard AA S T ER G AA R D
+ostergard AA S T ER G ER D
+ostergren AA S T ER G R EH N
+osterhaus AA S T ER HH AW S
+osterhoff OW S T ER HH AO F
+osterholt AA S T ER HH OW L T
+osterhoudt AA S T ER HH AW T
+osterhout AA S T ER HH AW T
+osterkamp AA S T ER K AE M P
+osterling AA S T ER L IH NG
+osterloh OW S T EH R L OW
+osterlund AA S T ER L AH N D
+osterman AA S T ER M AH N
+ostermann AA S T ER M AH N
+ostermeier AA S T ER M AY ER
+ostermeyer AA S T ER M AY ER
+ostermiller AA S T ER M IH L ER
+osterreichische AO S T ER R AY K IH SH IY
+ostertag AA S T ER T AH G
+osthoff AA S T HH AO F
+ostia AA S T IY AH
+ostin AA S T AH N
+ostinato AA S T AH N AA T OW
+osting AA S T IH NG
+ostling AA S AH L IH NG
+ostling(2) AA S T L IH NG
+ostling(3) AA S L IH NG
+ostlund AA S T L AH N D
+ostman AA S T M AH N
+ostpolitik OW S T P OW L IH T IH K
+ostracism AO S T R AH S IH Z AH M
+ostracize AO S T R AH S AY Z
+ostracized AO S T R AH S AY Z D
+ostrand AA S T R AH N D
+ostrander AA S T R AH N D ER
+ostrem AA S T R IH M
+ostrich AO S T R IH CH
+ostriches AA S T R IH CH IH Z
+ostroff AO S T R AO F
+ostrogoth AA S T R AH G AA TH
+ostrogoths AA S T R AH G AA TH S
+ostrom AA S T R AH M
+ostroski AH S T R AW S K IY
+ostrosky AH S T R OW S K IY
+ostrow AA S T R AW
+ostrow(2) AA S T R OW
+ostrowski AH S T R AO F S K IY
+ostrowsky AH S T R AW S K IY
+ostrum AA S T R AH M
+ostwald AA S T W AH L D
+osuch AA S AH K
+osullivan OW S AH L IH V AH N
+osuna OW S UW N AH
+oswald AO Z W AO L D
+oswald's AO Z W AO L D Z
+oswalt AA S W AH L T
+oswego AA S W IY G OW
+oswell AA S W EH L
+ot AO T
+ot(2) OW T IY
+ota OW T AH
+otaiba OW T EY B AH
+otani OW T AA N IY
+otello OW T EH L OW
+oteri OW T EH R IY
+otero OW T EH R OW
+otey OW T IY
+otha AH DH AA
+othello AH TH EH L OW
+other AH DH ER
+other's AH DH ER Z
+otherness AH DH ER N AH S
+others AH DH ER Z
+others' AH DH ER Z
+otherwise AH DH ER W AY Z
+otherworldly AH DH ER W ER L D L IY
+othilia OW TH IY L IY AH
+othman AA TH M AH N
+othman's AA TH M AH N Z
+otis OW T IH S
+otmar AA T M AA R
+otologies OW T AA L AH JH IY Z
+otology OW T AA L AH JH IY
+otomobil OW T OW M OW B AH L
+otoole AA T UW L
+otremba OW T R EH M B AH
+otsego AA T S EY G OW
+otsuka OW T S UW K AH
+ott AA T
+ottaviani OW T AA V IY AA N IY
+ottaviano OW T AA V IY AA N OW
+ottawa AA T AH W AA
+ottawa's AA T AH W AH Z
+ottaway AA T AH W EY
+ottaway's AA T AH W EY Z
+otte AA T
+otten AA T AH N
+otten's AA T AH N Z
+ottens AA T AH N Z
+otter AA T ER
+otter's AA T ER Z
+otterbein AA T ER B AY N
+otterbein's AA T ER B AY N Z
+otterloo AA T ER L UW
+otters AA T ER Z
+otterson AA T ER S AH N
+otterson's AA T ER S AH N Z
+ottesen AA T IY Z AH N
+otteson AA T IH S AH N
+ottilie AA T AH L IY
+otting AA T IH NG
+ottley AA T L IY
+ottman AA T M AH N
+otto AA T OW
+otto's AA T OW Z
+ottoman AA T AH M AH N
+ottosen AA T OW S AH N
+ottoson AA T AH S AH N
+otts AA T S
+ottum AA T AH M
+otulsky AH T UH L S K IY
+otwell AA T W EH L
+ou UW
+ouaga W AA G AH
+ouagadougou W AA G AH D UW G UW
+oubre UW B ER
+ouch AW CH
+ouderkirk AW D ER K ER K
+ouelette AA UW L EH T
+ouellet AA UW L IH T
+ouellette AA UW L EH T
+ought AO T
+oughta AO T AH
+oughtn't AO T AH N T
+oui W IY
+oui(2) UW W IY
+ouimet W IY M EH T
+ouimette W IY M EH T
+ounce AW N S
+ounces AW N S AH Z
+ounces(2) AW N S IH Z
+ounsted AW N S T EH D
+our AW ER
+our(2) AW R
+our(3) AA R
+ourada OW UH R AA D AH
+ours AW ER Z
+ours(2) AA R Z
+ours(3) AW R Z
+ourself AW ER S EH L F
+ourself(2) AA R S EH L F
+ourselves AW ER S EH L V Z
+ourselves(2) AA R S EH L V Z
+ourso ER S OW
+ouseba UW S AH B AH
+ousley AW S L IY
+oust AW S T
+ousted AW S T IH D
+ouster AW S T ER
+ousting AW S T IH NG
+out AW T
+out's AW T S
+out-mode AW T M OW D
+out-moded AW T M OW D IH D
+outage AW T AH JH
+outage(2) AW T IH JH
+outages AW T IH JH IH Z
+outback AW T B AE K
+outbid AW T B IH D
+outbidded AW T B IH D AH D
+outbidding AW T B IH D IH NG
+outbids AW T B IH D Z
+outboard AW T B AO R D
+outboard's AW T B AO R D Z
+outboards AW T B AO R D Z
+outbound AW T B AW N D
+outbreak AW T B R EY K
+outbreaks AW T B R EY K S
+outburst AW T B ER S T
+outbursts AW T B ER S T S
+outbursts(2) AW T B ER S S
+outbursts(3) AW T B ER S
+outcalt AW T K AH L T
+outcast AW T K AE S T
+outcasts AW T K AE S T S
+outcasts(2) AW T K AE S S
+outcasts(3) AW T K AE S
+outclass AW T K L AE S
+outclassed AW T K L AE S T
+outclasses AW T K L AE S IH Z
+outclassing AW T K L AE S IH NG
+outcome AW T K AH M
+outcomes AW T K AH M Z
+outcries AW T K R AY Z
+outcry AW T K R AY
+outdate AW T D EY T
+outdated AW T D EY T IH D
+outdid AW T D IH D
+outdistance AW T D IH S T AH N S
+outdistanced AW T D IH S T AH N S T
+outdistances AW T D IH S T AH N S IH Z
+outdistancing AW T D IH S T AH N S IH NG
+outdo AW T D UW
+outdoes AW T D AH Z
+outdoing AW T D UW IH NG
+outdone AW T D AH N
+outdoor AW T D AO R
+outdoors AW T D AO R Z
+outdoorsman AW T D AO R Z M AH N
+outed AW T AH D
+outen AW T AH N
+outer AW T ER
+outermost AW T ER M OW S T
+outerwear AW T ER W EH R
+outfield AW T F IY L D
+outfielder AW T F IY L D ER
+outfielders AW T F IY L D ER Z
+outfields AW T F IY L D Z
+outfit AW T F IH T
+outfits AW T F IH T S
+outfitted AW T F IH T IH D
+outfitter AW T F IH T ER
+outfitters AW T F IH T ER Z
+outfitting AW T F IH T IH NG
+outflank AW T F L AE NG K
+outflanked AW T F L AE NG K T
+outflanking AW T F L AE NG K IH NG
+outflanks AW T F L AE NG K S
+outflow AW T F L OW
+outflows AW T F L OW Z
+outfox AW T F AA K S
+outfoxed AW T F AA K S T
+outfoxes AW T F AA K S IH Z
+outfoxing AW T F AA K S IH NG
+outgain AW T G EY N
+outgained AW T G EY N D
+outgaining AW T G EY N IH NG
+outgains AW T G EY N Z
+outgo AW T G OW
+outgoing AW T G OW IH NG
+outgrew AW T G R UW
+outgrow AW T G R OW
+outgrowing AW T G R OW IH NG
+outgrown AW T G R OW N
+outgrows AW T G R OW Z
+outgrowth AW T G R OW TH
+outguess AW T G EH S
+outguessed AW T G EH S T
+outguesses AW T G EH S IH Z
+outguessing AW T G EH S IH NG
+outgun AW T G AH N
+outgunned AW T G AH N D
+outgunning AW T G AH N IH NG
+outguns AW T G AH N Z
+outhouse AW T HH AW S
+outhouses AW T HH AW S IH Z
+outing AW T IH NG
+outings AW T IH NG Z
+outland AW T L AE N D
+outland(2) AW T L AH N D
+outlandish AW T L AE N D IH SH
+outlast AW T L AE S T
+outlasted AW T L AE S T IH D
+outlasting AW T L AE S T IH NG
+outlasts AW T L AE S T S
+outlasts(2) AW T L AE S
+outlaw AW T L AO
+outlawed AW T L AO D
+outlawing AW T L AO IH NG
+outlawry AW T L AO R IY
+outlaws AW T L AO Z
+outlay AW T L EY
+outlays AW T L EY Z
+outler AW T AH L ER
+outler(2) AW T L ER
+outlet AW T L EH T
+outlet's AW T L EH T S
+outlets AW T L EH T S
+outley AW T L IY
+outlier AW T L AY ER
+outliers AW T L AY ER Z
+outline AW T L AY N
+outlined AW T L AY N D
+outlines AW T L AY N Z
+outlining AW T L AY N IH NG
+outlive AW T L IH V
+outlived AW T L IH V D
+outlives AW T L IH V Z
+outliving AW T L IH V IH NG
+outlook AW T L UH K
+outlooks AW T L UH K S
+outlying AW T L AY IH NG
+outman AW T M AH N
+outman(2) AW T M AE N
+outmaneuver AW T M AH N UW V ER
+outmaneuvered AW T M AH N UW V ER D
+outmaneuvering AW T M AH N UW V ER IH NG
+outmaneuvers AW T M AH N UW V ER Z
+outmanned AW T M AE N D
+outmode AW T M OW D
+outmoded AW T M OW D AH D
+outmoded(2) AW T M OW D IH D
+outnumber AW T N AH M B ER
+outnumbered AW T N AH M B ER D
+outnumbering AW T N AH M B ER IH NG
+outnumbers AW T N AH M B ER Z
+outokumpu UW T AH K AH M P UW
+outpace AW T P EY S
+outpaced AW T P EY S T
+outpaces AW T P EY S IH Z
+outpacing AW T P EY S IH NG
+outpatient AW T P EY SH AH N T
+outpatients AW T P EY SH AH N T S
+outperform AW T P ER F AO R M
+outperformance AW T P ER F AO R M AH N S
+outperformed AW T P ER F AO R M D
+outperformer AW T P ER F AO R M ER
+outperformers AW T P ER F AO R M ER Z
+outperforming AW T P ER F AO R M IH NG
+outperforms AW T P ER F AO R M Z
+outplacement AW T P L EY S M AH N T
+outpost AW T P OW S T
+outposts AW T P OW S T S
+outposts(2) AW T P OW S S
+outposts(3) AW T P OW S
+outpouch AW T P AW CH
+outpouching AW T P AW CH IH NG
+outpour AW T P AO R
+outpouring AW T P AO R IH NG
+outpours AW T P AO R Z
+output AW T P UH T
+outputs AW T P UH T S
+outrage AW T R EY JH
+outraged AW T R EY JH D
+outrageous AW T R EY JH AH S
+outrageously AW T R EY JH AH S L IY
+outrageousness AW T R EY JH AH S N AH S
+outrages AW T R EY JH IH Z
+outraging AW T R EY JH IH NG
+outran AW T R AE N
+outreach AW T R IY CH
+outrider AW T R AY D ER
+outriders AW T R AY D ER Z
+outrigger AW T R IH G ER
+outriggers AW T R IH G ER Z
+outright AW T R AY T
+outrun AW T R AH N
+outrunning AW T R AH N IH NG
+outruns AW T R AH N Z
+outs AW T S
+outscore AW T S K AO R
+outscored AW T S K AO R D
+outscores AW T S K AO R Z
+outscoring AW T S K AO R IH NG
+outsell AW T S EH L
+outselling AW T S EH L IH NG
+outsells AW T S EH L Z
+outset AW T S EH T
+outshine AW CH AY N
+outshines AW CH AY N Z
+outshining AW CH AY N IH NG
+outshone AW T SH OW N
+outside AW T S AY D
+outsider AW T S AY D ER
+outsider's AW T S AY D ER Z
+outsiders AW T S AY D ER Z
+outsiders' AW T S AY D ER Z
+outsides AW T S AY D Z
+outsize AW T S AY Z
+outsized AW T S AY Z D
+outskirt AW T S K ER T
+outskirts AW T S K ER T S
+outsmart AW T S M AA R T
+outsmarted AW T S M AA R T AH D
+outsmarting AW T S M AA R T IH NG
+outsmarts AW T S M AA R T S
+outsold AW T S OW L D
+outsource AW T S AO R S
+outsourced AW T S AO R S T
+outsources AW T S AO R S IH Z
+outsourcing AW T S AO R S IH NG
+outspend AW T S P EH N D
+outspending AW T S P EH N D IH NG
+outspends AW T S P EH N D Z
+outspent AW T S P EH N T
+outspoken AW T S P OW K AH N
+outspokenness AW T S P OW K AH N AH S
+outstanding AW T S T AE N D IH NG
+outstandingly AW T S T AE N D IH NG L IY
+outstretch AW T S T R EH CH
+outstretched AW T S T R EH CH T
+outstrip AW T S T R IH P
+outstripped AW T S T R IH P T
+outstripping AW T S T R IH P IH NG
+outstrips AW T S T R IH P S
+outta UW T AH
+outta(2) AW T AH
+outtake AW T T EY K
+outtake(2) AW T EY K
+outtakes AW T T EY K S
+outtakes(2) AW T EY K S
+outten AW T AH N
+outvote AW T V OW T
+outvoted AW T V OW T AH D
+outvotes AW T V OW T S
+outvoting AW T V OW T IH NG
+outward AW T W ER D
+outwardly AW T W ER D L IY
+outwards AW T W ER D Z
+outweigh AW T W EY
+outweighed AW T W EY D
+outweighing AW T W EY IH NG
+outweighs AW T W EY Z
+outwit AW T W IH T
+outwits AW T W IH T S
+outwitted AW T W IH T AH D
+outwitting AW T W IH T IH NG
+ouzts AW Z T S
+ouzts(2) AW S T S
+ova OW V AH
+oval OW V AH L
+ovalle AA V EY L
+ovarian OW V EH R IY AH N
+ovaries OW V ER IY Z
+ovary OW V ER IY
+ovate OW V EY T
+ovation OW V EY SH AH N
+ovations OW V EY SH AH N Z
+oven AH V AH N
+ovens AH V AH N Z
+over OW V ER
+overabundance OW V ER AH B AH N D AH N S
+overacker OW V ER AH K ER
+overact OW V ER AE K T
+overacted OW V ER AE K T IH D
+overactive OW V ER AE K T IH V
+overacts OW V ER AE K T S
+overall OW V ER AO L
+overallotment OW V ER AH L AA T M AH N T
+overallotments OW V ER AH L AA T M AH N T S
+overalls OW V ER AO L Z
+overambitious OW V ER AE M B IH SH AH S
+overarching OW V ER AA R CH IH NG
+overate OW V ER EY T
+overbaugh OW V ER B AO
+overbay OW V ER B EY
+overbearing OW V ER B EH R IH NG
+overbeck OW V ER B EH K
+overbey OW V ER B IY
+overbill OW V ER B IH L
+overbilled OW V ER B IH L D
+overbilling OW V ER B IH L IH NG
+overbills OW V ER B IH L Z
+overblown OW V ER B L OW N
+overboard OW V ER B AO R D
+overbook OW V ER B UH K
+overbooked OW V ER B UH K T
+overbooking OW V ER B UH K IH NG
+overbooks OW V ER B UH K S
+overbought OW V ER B AO T
+overbuilding OW V ER B IH L D IH NG
+overbuilt OW V ER B IH L T
+overburden OW V ER B ER D AH N
+overburdened OW V ER B ER D AH N D
+overbuy OW V ER B AY
+overby OW V ER B IY
+overcame OW V ER K EY M
+overcapacity OW V ER K AH P AE S AH T IY
+overcash OW V ER K AE SH
+overcast OW V ER K AE S T
+overcharge OW V ER CH AA R JH
+overcharged OW V ER CH AA R JH D
+overcharges OW V ER CH AA R JH IH Z
+overcharging OW V ER CH AA R JH IH NG
+overcoat OW V ER K OW T
+overcoats OW V ER K OW T S
+overcome OW V ER K AH M
+overcomes OW V ER K AH M Z
+overcoming OW V ER K AH M IH NG
+overconfidence OW V ER K AA N F IH D AH N S
+overconfident OW V ER K AA N F IH D AH N T
+overconsumption OW V ER K AH N S AH M P SH AH N
+overcook OW V ER K UH K
+overcooked OW V ER K UH K T
+overcooking OW V ER K UH K IH NG
+overcooks OW V ER K UH K S
+overcrowd OW V ER K R AW D
+overcrowded OW V ER K R AW D IH D
+overcrowding OW V ER K R AW D IH NG
+overcrowds OW V ER K R AW D Z
+overdamping OW V ER D AE M P IH NG
+overdependence OW V ER D IH P EH N D AH N S
+overdependent OW V ER D IH P EH N D AH N T
+overdid OW V ER D IH D
+overdo OW V ER D UW
+overdoes OW V ER D AH Z
+overdoing OW V ER D UW IH NG
+overdone OW V ER D AH N
+overdorf OW V ER D AO R F
+overdose OW V ER D OW S
+overdosed OW V ER D OW S T
+overdoses OW V ER D OW S IH Z
+overdosing OW V ER D OW S IH NG
+overdraft OW V ER D R AE F T
+overdrafting OW V ER D R AE F T IH NG
+overdrafts OW V ER D R AE F T S
+overdraw OW V ER D R AO
+overdrawn OW V ER D R AO N
+overdress OW V ER D R EH S
+overdrew OW V ER D R UW
+overdrive OW V ER D R AY V
+overdue OW V ER D UW
+overeager OW V ER IY G ER
+overeat OW V ER IY T
+overeating OW V ER IY T IH NG
+overemphasize OW V ER EH M F AH S AY Z
+overemphasized OW V ER EH M F AH S AY Z D
+overemphasizes OW V ER EH M F AH S AY Z IH Z
+overemphasizing OW V ER EH M F AH S AY Z IH NG
+overestimate OW V ER EH S T AH M EY T
+overestimated OW V ER EH S T AH M EY T IH D
+overestimates OW V ER EH S T AH M EY T S
+overestimating OW V ER EH S T AH M EY T IH NG
+overexcite OW V ER EH K S AY T
+overexcited OW V ER EH K S AY T IH D
+overexcites OW V ER EH K S AY T S
+overexciting OW V ER EH K S AY T IH NG
+overexpansion OW V ER IH K S P AE N SH AH N
+overexpose OW V ER IH K S P OW Z
+overexposed OW V ER IH K S P OW Z D
+overexposes OW V ER IH K S P OW Z IH Z
+overexposing OW V ER IH K S P OW Z IH NG
+overexposure OW V ER IH K S P OW ZH ER
+overextend OW V ER IH K S T EH N D
+overextended OW V ER IH K S T EH N D AH D
+overextending OW V ER IH K S T EH N D IH NG
+overextends OW V ER IH K S T EH N D Z
+overfed OW V ER F EH D
+overfeed OW V ER F IY D
+overfelt OW V ER F EH L T
+overfield OW V ER F IY L D
+overfill OW V ER F IH L
+overfishing OW V ER F IH SH IH NG
+overflight OW V ER F L AY T
+overflights OW V ER F L AY T S
+overflow OW V ER F L OW
+overflowed OW V ER F L OW D
+overflowing OW V ER F L OW IH NG
+overflows OW V ER F L OW Z
+overfly OW V ER F L AY
+overflying OW V ER F L AY IH NG
+overfund OW V ER F AH N D
+overfunded OW V ER F AH N D IH D
+overfunding OW V ER F AH N D IH NG
+overgaard OW V ER G AA R D
+overgenerous OW V ER JH EH N ER AH S
+overgrazing OW V ER G R EY Z IH NG
+overgrowing OW V ER G R OW W IH NG
+overgrown OW V ER G R OW N
+overgrowth OW V ER G R OW TH
+overhang OW V ER HH AE NG
+overhanging OW V ER HH AE NG IH NG
+overhangs OW V ER HH AE NG Z
+overhaul OW V ER HH AO L
+overhauled OW V ER HH AO L D
+overhauling OW V ER HH AO L IH NG
+overhauls OW V ER HH AO L Z
+overhead OW V ER HH EH D
+overheads OW V ER HH EH D Z
+overhear OW V ER HH IY R
+overheard OW V ER HH ER D
+overhearing OW V ER HH IY R IH NG
+overhears OW V ER HH IY R Z
+overheat OW V ER HH IY T
+overheated OW V ER HH IY T IH D
+overheating OW V ER HH IY T IH NG
+overheats OW V ER HH IY T S
+overholser OW V ER HH OW L S ER
+overholt OW V ER HH OW L T
+overholtzer OW V ER HH OW L T Z ER
+overhung OW V ER HH AH NG
+overjoyed OW V ER JH OY D
+overkill OW V ER K IH L
+overkilling OW V ER K IH L IH NG
+overlaid OW V ER L EY D
+overlain OW V ER L EY N
+overland OW V ER L AE N D
+overland(2) OW V ER L AH N D
+overlap OW V ER L AE P
+overlapped OW V ER L AE P T
+overlapping OW V ER L AE P IH NG
+overlaps OW V ER L AE P S
+overlay OW V ER L EY
+overlays OW V ER L EY Z
+overleverage OW V ER L EH V R IH JH
+overleveraged OW V ER L EH V R IH JH D
+overley OW V ER L IY
+overload OW V ER L OW D
+overloaded OW V ER L OW D IH D
+overloading OW V ER L OW D IH NG
+overloads OW V ER L OW D Z
+overlock OW V ER L AA K
+overlook OW V ER L UH K
+overlooked OW V ER L UH K T
+overlooking OW V ER L UH K IH NG
+overlooks OW V ER L UH K S
+overlord OW V ER L AO R D
+overlords OW V ER L AO R D Z
+overly OW V ER L IY
+overlying OW V ER L AY IH NG
+overman OW V ER M AH N
+overmatch OW V ER M AE CH
+overmatched OW V ER M AE CH T
+overmyer OW V ER M IY ER
+overnight OW V ER N AY T
+overnighter OW V ER N AY T ER
+overnighters OW V ER N AY T ER Z
+overnite OW V ER N AY T
+overoptimism OW V ER AA P T IH M IH Z AH M
+overpaid OW V ER P EY D
+overpass OW V ER P AE S
+overpasses OW V ER P AE S IH Z
+overpay OW V ER P EY
+overpaying OW V ER P EY IH NG
+overpayment OW V ER P EY M AH N T
+overpayments OW V ER P EY M AH N T S
+overpeck OW V ER P EH K
+overplay OW V ER P L EY
+overplayed OW V ER P L EY D
+overplaying OW V ER P L EY IH NG
+overplays OW V ER P L EY Z
+overpopulate OW V ER P AA P Y AH L EY T
+overpopulated OW V ER P AA P Y AH L EY T IH D
+overpopulates OW V ER P AA P Y AH L EY T S
+overpopulating OW V ER P AA P Y AH L EY T IH NG
+overpopulation OW V ER P AA P Y AH L EY SH AH N
+overpower OW V ER P AW ER
+overpowered OW V ER P AW ER D
+overpowering OW V ER P AW R IH NG
+overpowers OW V ER P AW ER Z
+overprice OW V ER P R AY S
+overpriced OW V ER P R AY S T
+overprices OW V ER P R AY S IH Z
+overpricing OW V ER P R AY S IH NG
+overproduce OW V ER P R AH D UW S
+overproduced OW V ER P R AH D UW S T
+overproducer OW V ER P R AH D UW S ER
+overproducers OW V ER P R AH D UW S ER Z
+overproducing OW V ER P R AH D Y UW S IH NG
+overproduction OW V ER P R AH D AH K SH AH N
+overprotect OW V ER P R AH T EH K T
+overprotected OW V ER P R AH T EH K T AH D
+overprotection OW V ER P R AH T EH K SH AH N
+overprotective OW V ER P R AH T EH K T AH V
+overqualified OW V ER K W AA L AH F AY D
+overqualify OW V ER K W AA L IH F AY
+overran OW V ER R AE N
+overrate OW V ER R EY T
+overrated OW V ER R EY T IH D
+overrates OW V ER R EY T S
+overrating OW V ER R EY T IH NG
+overreach OW V ER R IY CH
+overreached OW V ER R IY CH T
+overreaches OW V ER R IY CH IH Z
+overreaching OW V ER R IY CH IH NG
+overreact OW V ER R IY AE K T
+overreacted OW V ER R IY AE K T IH D
+overreacting OW V ER R IY AE K T IH NG
+overreaction OW V ER R IY AE K SH AH N
+overreacts OW V ER R IY AE K T S
+overregulate OW V ER R EH G Y AH L EY T
+overregulated OW V ER R EH G Y AH L EY T IH D
+overregulates OW V ER R EH G Y AH L EY T S
+overregulation OW V ER R EH G Y AH L EY SH AH N
+overreliance OW V ER R IH L AY AH N S
+overrepresent OW V ER R EH P R AH Z EH N T
+overrepresented OW V ER R EH P R AH Z EH N T IH D
+overridden OW V ER R IH D AH N
+override OW V ER R AY D
+overrides OW V ER R AY D Z
+overriding OW V ER R AY D IH NG
+overripe OW V ER R AY P
+overrode OW V ER R OW D
+overrule OW V ER R UW L
+overruled OW V ER R UW L D
+overrules OW V ER R UW L Z
+overruling OW V ER R UW L IH NG
+overrun OW V ER R AH N
+overrunning OW V ER R AH N IH NG
+overruns OW V ER R AH N Z
+overs OW V ER Z
+oversaw OW V ER S AO
+oversea OW V ER S IY
+overseas OW V ER S IY Z
+oversee OW V ER S IY
+overseeing OW V ER S IY IH NG
+overseen OW V ER S IY N
+overseer OW V ER S IY ER
+overseers OW V ER S IY ER Z
+oversees OW V ER S IY Z
+oversell OW V ER S EH L
+overselling OW V ER S EH L IH NG
+oversensitive OW V ER S EH N S AH T IH V
+oversensitivity OW V ER S EH N S AH T IH V IH T IY
+overshadow OW V ER SH AE D OW
+overshadowed OW V ER SH AE D OW D
+overshadowing OW V ER SH AE D OW IH NG
+overshadows OW V ER SH AE D OW Z
+overshoot OW V ER SH UW T
+overshooting OW V ER SH UW T IH NG
+overshot OW V ER SH AA T
+oversight OW V ER S AY T
+oversimplification OW V ER S IH M P L IH F IH K EY SH AH N
+oversimplified OW V ER S IH M P L IH F AY D
+oversimplify OW V ER S IH M P L IH F AY
+oversimplifying OW V ER S IH M P L IH F AY IH NG
+oversize OW V ER S AY Z
+oversized OW V ER S AY Z D
+oversizes OW V ER S AY Z IH Z
+oversizing OW V ER S AY Z IH NG
+oversleep OW V ER S L IY P
+overslept OW V ER S L EH P T
+oversold OW V ER S OW L D
+overson OW V ER S AH N
+overspend OW V ER S P EH N D
+overspending OW V ER S P EH N D IH NG
+overspends OW V ER S P EH N D Z
+overspent OW V ER S P EH N T
+overstaff OW V ER S T AE F
+overstaffed OW V ER S T AE F T
+overstate OW V ER S T EY T
+overstated OW V ER S T EY T IH D
+overstatement OW V ER S T EY T M AH N T
+overstatements OW V ER S T EY T M AH N T S
+overstates OW V ER S T EY T S
+overstating OW V ER S T EY T IH NG
+overstay OW V ER S T EY
+overstayed OW V ER S T EY D
+overstep OW V ER S T EH P
+overstepped OW V ER S T EH P T
+overstepping OW V ER S T EH P IH NG
+overstock OW V ER S T AA K
+overstocked OW V ER S T AA K T
+overstreet OW V ER S T R IY T
+overstrom OW V ER S T R AA M
+overstuff OW V ER S T AH F
+overstuffed OW V ER S T AH F T
+oversubscribe OW V ER S AH B S K R AY B
+oversubscribed OW V ER S AH B S K R AY B D
+oversupplied OW V ER S AH P L AY D
+oversupply OW V ER S AH P L AY
+overt OW V ER T
+overtake OW V ER T EY K
+overtaken OW V ER T EY K AH N
+overtakes OW V ER T EY K S
+overtaking OW V ER T EY K IH NG
+overtax OW V ER T AE K S
+overtaxed OW V ER T AE K S T
+overthrew OW V ER TH R UW
+overthrow OW V ER TH R OW
+overthrowing OW V ER TH R OW IH NG
+overthrown OW V ER TH R OW N
+overthrows OW V ER TH R OW Z
+overtime OW V ER T AY M
+overtly OW V ER T L IY
+overton OW V ER T AH N
+overtone OW V ER T OW N
+overtones OW V ER T OW N Z
+overtook OW V ER T UH K
+overtrain OW V ER T R EY N
+overtraining OW V ER T R EY N IH NG
+overture OW V ER CH ER
+overtures OW V ER CH UH R Z
+overturf OW V ER T ER F
+overturn OW V ER T ER N
+overturned OW V ER T ER N D
+overturning OW V ER T ER N IH NG
+overturns OW V ER T ER N Z
+overuse OW V ER Y UW Z
+overused OW V ER Y UW Z D
+overuses OW V ER Y UW Z IH Z
+overusing OW V ER Y UW Z IH NG
+overvaluation OW V ER V AE L Y UW EY SH AH N
+overvalue OW V ER V AE L Y UW
+overvalued OW V ER V AE L Y UW D
+overview OW V ER V Y UW
+overviews OW V ER V Y UW Z
+overweight OW V ER W EY T
+overweighted OW V ER W EY T IH D
+overwhelm OW V ER W EH L M
+overwhelm(2) OW V ER HH W EH L M
+overwhelmability OW V ER W EH L M AH B IH L AH T IY
+overwhelmability(2) OW V ER HH W EH L M AH B IH L AH T IY
+overwhelmed OW V ER W EH L M D
+overwhelmed(2) OW V ER HH W EH L M D
+overwhelming OW V ER W EH L M IH NG
+overwhelming(2) OW V ER HH W EH L M IH NG
+overwhelmingly OW V ER W EH L M IH NG L IY
+overwhelmingly(2) OW V ER HH W EH L M IH NG L IY
+overwhelms OW V ER W EH L M Z
+overwhelms(2) OW V ER HH W EH L M Z
+overwinter OW V ER W IH N T ER
+overwork OW V ER W ER K
+overworked OW V ER W ER K T
+overworking OW V ER W ER K IH NG
+overworks OW V ER W ER K S
+overwrite OW V ER R AY T
+overwrites OW V ER R AY T S
+overwriting OW V ER R AY T IH NG
+overwritten OW V ER R IH T AH N
+overwrote OW V ER R OW T
+overwrought OW V ER R AO T
+overy OW V ER IY
+overzealous OW V ER Z EH L AH S
+overzealously OW V ER Z EH L AH S L IY
+oveson AA V AH S AH N
+ovett OW V EH T
+ovett's OW V EH T S
+ovex OW V EH K S
+oviatt OW V IY AA T
+oviatt's OW V IY AA T S
+oviedo OW V IY EY D OW
+oviparous OW V IH P ER AH S
+ovitt OW V IH T
+ovitt's OW V IH T S
+ovitz OW V IH T S
+ovitz's OW V IH T S IH Z
+ovoid OW V OY D
+ovonic OW V AA N IH K
+ovoviviparous OW V OW V AY V IH P ER AH S
+ovshinsky AA V SH IH N S K IY
+ovulation OW V Y AH L EY SH AH N
+ovulations OW V Y AH L EY SH AH N Z
+ovule OW V Y UW L
+ovules OW V Y UW L Z
+ovum OW V AH M
+ow OW
+ow(2) AW
+owada OW AA D AH
+owades OW AA D Z
+owczarzak AW CH AA R Z AH K
+owe OW
+owed OW D
+owen OW AH N
+owen's OW AH N Z
+owenby AW IH N B IY
+owenby's AW IH N B IY Z
+owens OW AH N Z
+owens's OW AH N Z IH Z
+owensboro OW AH N Z B ER OW
+owensby AW IH N S B IY
+owensby's AW IH N S B IY Z
+owes OW Z
+owing OW IH NG
+owings OW IH NG Z
+owl AW L
+owls AW L Z
+own OW N
+ownbey AW N B IY
+ownby AW N B IY
+owned OW N D
+owner OW N ER
+owner's OW N ER Z
+owners OW N ER Z
+owners' OW N ER Z
+ownership OW N ER SH IH P
+owning OW N IH NG
+owns OW N Z
+owosso OW AO S OW
+owsley AW S L IY
+owyhee OW IH HH IY
+ox AA K S
+oxalates AA K S AH L EY T S
+oxalis AA K S AH L AH S
+oxbow AA K S B OW
+oxbridge AA K S B R IH JH
+oxcart AA K S K AA R T
+oxdon AA K S D AA N
+oxen AA K S AH N
+oxendine AA K S IH N D AY N
+oxfam AA K S F AE M
+oxfam's AA K S F AE M Z
+oxford AA K S F ER D
+oxford's AA K S F ER D Z
+oxfords AA K S F ER D Z
+oxidant AA K S AH D AH N T
+oxidants AA K S IH D AH N T S
+oxidation AA K S AH D EY SH AH N
+oxide AA K S AY D
+oxides AA K S AY D Z
+oxidize AA K S AH D AY Z
+oxidized AA K S AH D AY Z D
+oxidizer AA K S IH D AY Z ER
+oxidizing AA K S AH D AY Z IH NG
+oxidyne AA K S IH D AY N
+oxley AA K S L IY
+oxman AA K S M AH N
+oxnard AA K S N ER D
+oxner AA K S N ER
+oxoco AA K S OW K OW
+oxton AA K S T AH N
+oxy AA K S IY
+oxygen AA K S AH JH AH N
+oxygen(2) AA K S IH JH AH N
+oxygenate AA K S AH JH AH N EY T
+oxygenated AA K S AH JH AH N EY T AH D
+oxymoron AA K S IY M AO R AA N
+oxytocin AA K S AH T OW S AH N
+oy OY
+oyama OW Y AA M AH
+oye OY
+oyen OY IH N
+oyer OY ER
+oyler OY L ER
+oyola OY OW L AH
+oyster OY S T ER
+oysters OY S T ER Z
+oz AA Z
+ozaki OW Z AA K IY
+ozal OW Z AH L
+ozal's OW Z AA L Z
+ozanich AH Z AE N IH HH
+ozanne OW Z AE N
+ozark OW Z AA R K
+ozarks OW Z AA R K S
+ozawa OW Z AA W AH
+ozbun AA Z B AH N
+ozburn AA Z B ER N
+ozelle AH Z EH L
+ozga OW Z G AH
+ozick OW Z IH K
+ozick's OW Z IH K S
+ozier OW Z IY ER
+ozimek AH Z IH M EH K
+ozment AA Z M AH N T
+ozmet AA Z M AH T
+ozmun AA Z M AH N
+ozolins OW Z OW L IY N Z
+ozols OW Z OW L Z
+ozone OW Z OW N
+ozora AH Z AO R AH
+ozuna OW Z UW N AH
+ozzie AA Z IY
+p P IY
+p's P IY Z
+p. P IY
+p.'s P IY Z
+p.m. P IY EH M
+p.s P IY Z
+pa P AA
+paap P AA P
+paape P AA P
+paar P AA R
+paasch P AA SH
+paavola P AA V OW L AH
+pablo P AA B L OW
+pablum P AE B L AH M
+pabon P AA B AO N
+pabst P AE B S T
+pac P AE K
+pac's P AE K S
+paca P AA K AH
+paca(2) P AE K AH
+paccar P AH K AA R
+paccione P AA K CH OW N IY
+pace P EY S
+pace's P EY S IH Z
+paced P EY S T
+pacella P AH S EH L AH
+pacelli P AH S EH L IY
+pacemaker P EY S M EY K ER
+pacemakers P EY S M EY K ER Z
+pacer P EY S ER
+pacers P EY S ER Z
+paces P EY S IH Z
+pacesetter P EY S EH T ER
+paceway P EY S W EY
+pacey P EY S IY
+pacheco P AH CH EH K OW
+pachinko P AH CH IH NG K OW
+pacholder P AE CH AH L D ER
+pacholski P AH HH OW L S K IY
+pachter P AE K T ER
+pachysandra P AE CH IH S AE N D R AH
+paci P AA CH IY
+pacific P AH S IH F IH K
+pacific's P AH S IH F IH K S
+pacifica P AH S IH F IH K AH
+pacificare P AH S IH F IH K EH R
+pacification P AE S AH F AH K EY SH AH N
+pacifico P AA CH IY F IY K OW
+pacificorp P AH S IH F IH K AO R P
+pacified P AE S AH F AY D
+pacifier P AE S AH F AY ER
+pacifiers P AE S AH F AY ER Z
+pacifism P AE S IH F IH Z AH M
+pacifist P AE S IH F IH S T
+pacifists P AE S IH F IH S T S
+pacifists(2) P AE S IH F IH S S
+pacifists(3) P AE S IH F IH S
+pacify P AE S AH F AY
+pacing P EY S IH NG
+pacini P AA CH IY N IY
+pacino P AH S IY N OW
+pack P AE K
+package P AE K AH JH
+package's P AE K IH JH IH Z
+package(2) P AE K IH JH
+packaged P AE K IH JH D
+packager P AE K IH JH ER
+packagers P AE K IH JH ER Z
+packages P AE K AH JH AH Z
+packages(2) P AE K IH JH IH Z
+packaging P AE K IH JH IH NG
+packard P AE K ER D
+packard's P AE K ER D Z
+packed P AE K T
+packer P AE K ER
+packers P AE K ER Z
+packet P AE K AH T
+packet(2) P AE K IH T
+packets P AE K IH T S
+packett P AE K IH T
+packham P AE K HH AH M
+packing P AE K IH NG
+packinghouse P AE K IH NG HH AW S
+packman P AE K M AH N
+packs P AE K S
+packwood P AE K W UH D
+packwood's P AE K W UH D Z
+pacman P AE K M AH N
+paco P EY K OW
+pacs P AE K S
+pact P AE K T
+pact's P AE K T S
+pactel P AE K T EH L
+pactel's P AE K T EH L Z
+pacto P AE K T OW
+pacts P AE K T S
+pacts(2) P AE K S
+pacyna P AA K IY N AH
+pacyna(2) P AH S IY N AH
+paczkowski P AH CH K AO F S K IY
+pad P AE D
+paddack P AE D AH K
+padded P AE D AH D
+padded(2) P AE D IH D
+padden P AE D AH N
+paddies P AE D IY Z
+padding P AE D IH NG
+paddington P AE D IH NG T AH N
+paddle P AE D AH L
+paddled P AE D AH L D
+paddles P AE D AH L Z
+paddling P AE D AH L IH NG
+paddling(2) P AE D L IH NG
+paddock P AE D AH K
+paddy P AE D IY
+paddy's P AE D IY Z
+paden P EY D AH N
+paderewski P AA D ER UW S K IY
+padfield P AE D F IY L D
+padget P AE JH IH T
+padgett P AE JH IH T
+padgitt P AE JH IH T
+padilla P AH D IH L AH
+padley P AE D L IY
+padlock P AE D L AA K
+padlocked P AE D L AA K T
+padlocks P AE D L AA K S
+padmanabhan P AE D M AE N AH B AE N
+padmanabhan(2) P AA D M AH N AA B AH N
+padovano P AA D OW V AA N OW
+padre P AE D R EY
+padres P AE D R EY Z
+padrick P AE D R IH K
+padro P AA D R OW
+padron P AE D R AH N
+pads P AE D Z
+padua P AE D Y UW AH
+paduano P AA D UW AA N OW
+paducah P AH D UW K AH
+padula P AA D UW L AH
+pae P AY
+paean P IY AH N
+paeans P IY AH N Z
+paek P IY K
+paeth P IY TH
+paetz P IY T S
+paez P AY EH Z
+paff P AE F
+pafford P AE F ER D
+pagan P EY G AH N
+paganelli P AA G AA N EH L IY
+pagani P AA G AA N IY
+paganini P AE G AH N IY N IY
+paganism P EY G AH N IH Z AH M
+pagano P AA G AA N OW
+pagar P AE G ER
+page P EY JH
+page's P EY JH IH Z
+pageant P AE JH AH N T
+pageantry P AE JH AH N T R IY
+pageants P AE JH AH N T S
+paged P EY JH D
+pagel P AE G AH L
+pagels P AE G AH L Z
+pagemaker P EY JH M EY K ER
+pagenkopf P AE G AH N K AO P F
+pagenkopf(2) P AE G AH N K AO F
+pager P EY JH ER
+pagers P EY JH ER Z
+pages P EY JH AH Z
+pages(2) P EY JH IH Z
+paget P AE JH AH T
+pagett P AE JH AH T
+pagette P AE JH EH T
+pagey P EY JH IY
+pagezy P AE JH EH Z IY
+pagination P AE JH AH N EY SH AH N
+paging P EY JH IH NG
+paglia P AE G L IY AH
+pagliaro P AE G L IY AA R OW
+pagliarulo P AE G L IY ER UW L OW
+pagliuca P AE G L IY UW K AH
+pagliuca's P AE G L IY UW K AH Z
+pagni P AE G N IY
+pagnotta P AA G N OW T AH
+pagoda P AH G OW D AH
+pagoda's P AH G OW D AH Z
+pagodas P AH G OW D AH Z
+pago_pago P AA G OW P AA G OW
+pagurian P AH G Y UH R IY AH N
+pah P AE
+pahl P AA L
+pahnos P AA N OW S
+pai P AA IY
+paid P EY D
+paige P EY JH
+paighton P EY T AH N
+paign P EY N
+paik P EY K
+pail P EY L
+paille P EY L
+pails P EY L Z
+pain P EY N
+paine P EY N
+pained P EY N D
+painesville P EY N Z V IH L
+painewebber P EY N W EH B ER
+painewebber's P EY N W EH B ER
+painful P EY N F AH L
+painfully P EY N F AH L IY
+painkiller P EY N K IH L ER
+painkillers P EY N K IH L ER Z
+painless P EY N L AH S
+painlessly P EY N L AH S L IY
+paino P EY N OW
+pains P EY N Z
+painstaking P EY N S T EY K IH NG
+painstakingly P EY N S T EY K IH NG L IY
+paint P EY N T
+paintball P EY N T B AA L
+paintbrush P EY N T B R AH SH
+paintbrushes P EY N T B R AH SH IH S
+painted P EY N T AH D
+painted(2) P EY N T IH D
+painted(3) P EY N AH D
+painted(4) P EY N IH D
+painter P EY N T ER
+painter's P EY N T ER Z
+painter's(2) P EY N ER Z
+painter(2) P EY N ER
+painterly P EY N T ER L IY
+painterly(2) P EY N ER L IY
+painters P EY N T ER Z
+painters(2) P EY N ER Z
+painting P EY N T IH NG
+painting(2) P EY N IH NG
+paintings P EY N T IH NG Z
+paintings(2) P EY N IH NG Z
+paints P EY N T S
+pair P EH R
+paired P EH R D
+pairing P EH R IH NG
+pairs P EH R Z
+pais P EY Z
+paisley P EY Z L IY
+paisley's P EY Z L IY Z
+pait P EY T
+paiute P AY Y UW T
+paiva P EY V AH
+paiz P EY Z
+pajak P AY AH K
+pajama P AH JH AA M AH
+pajama(2) P AH JH AE M AH
+pajamas P AH JH AA M AH Z
+pajamas(2) P AH JH AE M AH Z
+pajole P AH JH OW L
+pajoli P AH JH OW L IY
+pak P AE K
+pak's P AE K S
+pake P EY K
+pakeha P AH K EY HH AA
+pakistan P AE K IH S T AE N
+pakistan's P AE K IH S T AE N Z
+pakistani P AE K IH S T AE N IY
+pakistanian P AE K IH S T AE N IY AH N
+pakistanis P AE K IH S T AE N IY Z
+pakula P AH K UW L AH
+pakulski P AH K AH L S K IY
+pal P AE L
+pal's P AE L Z
+palace P AE L AH S
+palace's P AE L AH S AH Z
+palace's(2) P AE L AH S IH Z
+palaces P AE L AH S AH Z
+palaces(2) P AE L AH S IH Z
+palacio P AH L EY S IY OW
+palacios P AA L AA S IY OW Z
+paladin P AE L AH D IH N
+paladino P AA L AA D IY N OW
+palafox P AE L AH F AA K S
+palais P AH L EY
+palance P AE L AH N S
+palansky P AH L AE N S K IY
+palardy P AH L AA R D IY
+palash P AH L AE SH
+palatability P AE L AH T AH B IH L AH T IY
+palatable P AE L AH T AH B AH L
+palate P AE L AH T
+palate(2) P AE L IH T
+palates P AE L AH T S
+palatial P AH L EY SH AH L
+palatine P AE L AH T AY N
+palau P AE L AW
+palau's P AH L AW UW Z
+palauans P AH L AW AH N Z
+palay P EY L EY
+palazina P AE L AH Z IY N AH
+palazzi P AA L AA T S IY
+palazzo P AH L AA Z OW
+palazzola P AA L AA T S OW L AH
+palazzolo P AA L AA T S OW L OW
+palca P AE L K AH
+palca's P AE L K AH Z
+palco P AE L K OW
+paldon P AA L D AH N
+pale P EY L
+palecek P AA L IH CH EH K
+paled P EY L D
+palen P AE L AH N
+paleo P EY L IY OW
+paleobotany P EY L IY OW B AA T AH N IY
+paleocene P EY L IY AH S IY N
+paleontologist P EY L IY AH N T AA L AH JH IH S T
+paleontologists P EY L IY AH N T AA L AH JH IH S T S
+paleontologists(2) P EY L IY AH N T AA L AH JH IH S S
+paleontologists(3) P EY L IY AH N T AA L AH JH IH S
+paleontology P EY L IY AH N T AA L AH JH IY
+paleozoic P EY L IY AH Z OW IH K
+palermo P AH L EH R M OW
+pales P EY L Z
+palese P AA L EY Z IY
+palest P EY L AH S T
+palestine P AE L AH S T AY N
+palestinian P AE L IH S T IH N IY AH N
+palestinian's P AE L IH S T IH N IY AH N Z
+palestinians P AE L IH S T IH N IY AH N Z
+palestinians' P AE L AH S T IH N IY AH N Z
+palette P AE L AH T
+paley P EY L IY
+palfrey P AE L F R IY
+palimony P AE L IH M OW N IY
+palin P AE L IH N
+palinkas P AE L IH NG K AH Z
+palisade P AE L IH S EY D
+palisades P AE L IH S EY D Z
+palka P AE L K AH
+palkar P AE L K AA R
+palko P AE L K OW
+palkovic P AH L K AA V IH K
+pall P AA L
+pall(2) P AO L
+palla P AE L AH
+palladino P AA L AA D IY N OW
+palladium P AH L EY D IY AH M
+pallante P AA L AA N T IY
+pallas P AE L AH S
+paller P AE L ER
+palleschi P AA L EH S K IY
+pallet P AE L AH T
+pallets P AE L AH T S
+pallett P AE L AH T
+palliative P AE L IY AH T IH V
+palliatives P AE L IY AH T IH V Z
+pallid P AE L AH D
+pallidotomy P AE L IH D AO T AH M IY
+pallo P AE L OW
+pallone P AA L OW N IY
+palm P AA M
+palm(2) P AA L M
+palm-springs P AA M S P R IH NG Z
+palm-springs(2) P AA L M S P R IH NG Z
+palma P AA L M AH
+palma's P AA L M AH Z
+palmateer P AE L M AH T IH R
+palmatier P AE L M AH T IY ER
+palmdale P AA M D EY L
+palmdale's P AA M D EY L Z
+palme P AA M
+palme(2) P AA L M
+palmer P AA M ER
+palmer's P AA M ER Z
+palmer's(2) P AA L M ER Z
+palmer(2) P AA L M ER
+palmeri P AA L M EH R IY
+palmerino P AO L M EH R IY N OW
+palmero P AA L M EH R OW
+palmerton P AA M ER T AH N
+palmertree P AA M ER T R IY
+palmetto P AE L M EH T OW
+palmetto(2) P AA L M EH T OW
+palmgren P AE L M G R EH N
+palmieri P AO L M IY EH R IY
+palminteri P AO L M IH N T EH R IY
+palmira P AA L M IH R AH
+palmisano P AA L M IY S AA N OW
+palmist P AA M IH S T
+palmistry P AA M IH S T R IY
+palmists P AA M IH S T S
+palmiter P AE L M AY T ER
+palmitic P AE L M IH T IH K
+palmolive P AA L M AA L IH V
+palmore P AE L M AO R
+palmquist P AE L M K W IH S T
+palms P AA M Z
+palms(2) P AA L M Z
+palmstierna P AO L M S T IY EH R N AH
+palo P AE L OW
+palo-alto P AE L OW AE L T OW
+paloma P AA L OW M AH
+palomar P AE L AH M AA R
+palomares P AA L OW M AA R EH S
+palomba P AA L OW M B AH
+palombi P AH L AA M B IY
+palombo P AH L AA M B OW
+palometa P AA L OW M EH T AH
+palomino P AE L AH M IY N OW
+palomita P AA L OW M IY T AH
+palomo P AA L OW M OW
+palone P AH L OW N
+palonius P AH L OW N IY AH S
+palos P AA L OW Z
+palpable P AE L P AH B AH L
+palpably P AE L P AH B L IY
+palpitate P AE L P AH T EY T
+palpitated P AE L P AH T EY T AH D
+palpitates P AE L P AH T EY T S
+palpitating P AE L P AH T EY T IH NG
+palpitation P AE L P AH T EY SH AH N
+palpitations P AE L P IH T EY SH AH N Z
+pals P AE L Z
+palsy P AO L Z IY
+palton P AO L T AH N
+paltry P AO L T R IY
+paltz P AO L T S
+paluch P AE L AH K
+paluck P AE L AH K
+palumbo P AH L AH M B OW
+paluzzi P AA L UW T S IY
+pam P AE M
+pam's P AE M Z
+pamacho P AH M AA CH OW
+pamby P AE M B IY
+pamela P AE M AH L AH
+pamela's P AE M AH L AH Z
+pamelina P AA M EH L IY N AH
+pamella P AH M EH L AH
+pamer P EY M ER
+pammy P AE M IY
+pamour P AE M AO R
+pampas P AE M P AH Z
+pampel P AE M P AH L
+pamper P AE M P ER
+pampered P AE M P ER D
+pamperin P AE M P ER IH N
+pampering P AE M P ER IH NG
+pampers P AE M P ER Z
+pamphlet P AE M F L AH T
+pamphleteer P AE M F L AH T IH R
+pamphleteers P AE M F L AH T IH R Z
+pamphlets P AE M F L AH T S
+pamplin P AE M P L IH N
+pamplona P AE M P L OW N AH
+pan P AE N
+pan's P AE N Z
+panacea P AE N AH S IY AH
+panache P AH N AA SH
+panaco P AE N AH K OW
+panagopoulos P AE N AH G AA P AH L IH S
+panagos P AA N AA G OW Z
+panam P AE N AE M
+panama P AE N AH M AA
+panama's P AE N AH M AA Z
+panamanian P AE N AH M EY N IY AH N
+panamanians P AE N AH M EY N IY AH N Z
+panamsat P AH N AE M S AE T
+panamsat(2) P AE N AE M S AE T
+panaro P AA N AA R OW
+panas P AE N AH Z
+panasonic P AE N AH S AA N IH K
+pancake P AE N K EY K
+pancaked P AE N K EY K T
+pancakes P AE N K EY K S
+pancanadian P AE NG K AH N EY D IY AH N
+pancer P AE N S ER
+pancho P AE N CH OW
+panciera P AA N CH IH R AH
+pancoast P AE N K OW S T
+pancontinental P AE N K AA N T AH N EH N T AH L
+pancreas P AE N K R IY AH S
+pancreatic P AE N K R IY AE T IH K
+panda P AE N D AH
+pandanus P AE N D EY N AH S
+pandas P AE N D AH Z
+pandemic P AE N D EH M IH K
+pandemonium P AE N D IH M OW N IY AH M
+pander P AE N D ER
+pandered P AE N D ER D
+pandering P AE N D ER IH NG
+pandey P AA N D EY
+pandick P AE N D IH K
+pandit P AH N D AH T
+pando P AA N D OW
+pandolfi P AA N D OW L F IY
+pandolfo P AA N D OW L F OW
+pandora P AE N D AO R AH
+pandora's P AE N D AO R AH Z
+pandy P AE N D IY
+pandya P AA N D Y AH
+pane P EY N
+panebianco P AA N EH B IY AA N K OW
+panek P AE N IH K
+panel P AE N AH L
+panel's P AE N AH L Z
+paneled P AE N AH L D
+paneling P AE N AH L IH NG
+panelist P AE N AH L AH S T
+panelists P AE N AH L IH S T S
+panelists(2) P AE N AH L IH S S
+panelists(3) P AE N AH L IH S
+panelization P AE N AH L AH Z EY SH AH N
+panelize P AE N AH L AY Z
+panelized P AE N AH L AY Z D
+panella P AH N EH L AH
+panels P AE N AH L Z
+panels' P AE N AH L Z
+panem P EY N AH M
+panepinto P AA N EH P IY N T OW
+panes P EY N Z
+panetta P AH N EH T AH
+panetta's P AH N EH T AH Z
+panfida P AE N F IY D AH
+panfil P AE N F IH L
+panfile P AE N F AY L
+panful P AE N F AH L
+panfuls P AE N F AH L Z
+pang P AE NG
+pangallo P AA NG G AA L OW
+pangborn P AE NG B AO R N
+pangburn P AE NG B ER N
+pangels P AE NG G EH L Z
+pangle P AE NG G AH L
+pangloss P AE N G L AA S
+pangloss(2) P AE NG G L AA S
+pangs P AE NG Z
+panhandle P AE N HH AE N D AH L
+panhandle's P AE N HH AE N D AH L Z
+panhandler P AE N HH AE N D L ER
+panhandlers P AE N HH AE N D L ER Z
+panhandling P AE N HH AE N D L IH NG
+paniagua P AA N IY AA G AH
+panic P AE N IH K
+panic's P AE N IH K S
+paniccia P AA N IY CH AH
+panicked P AE N IH K T
+panicking P AE N IH K IH NG
+panicky P AE N IH K IY
+panico P AA N IY K OW
+panics P AE N IH K S
+panik P AE N IH K
+pankau P AE NG K AW
+pankey P AE N K IY
+pankki P AE NG K IY
+panko P AE NG K OW
+pankonin P AE NG K AH N IH N
+pankow P AE NG K OW
+pankratz P AE NG K R AH T S
+panky P AE NG K IY
+panmunjom P AE N M UW N JH AO M
+panmure P AE N M UH R
+panned P AE N D
+pannell P AE N AH L
+pannier P AE N IY ER
+pannill P AE N IH L
+pannill's P AE N IH L Z
+panning P AE N IH NG
+pannone P AA N OW N IY
+pannu P AA N UW
+pannullo P AA N UW L OW
+panny P AE N IY
+panoply P AE N AA P L IY
+panopolys P AH N AA P AH L IY Z
+panora P AH N AO R AH
+panorama P AE N ER AE M AH
+panoramic P AE N ER AE M IH K
+panos P AA N OW S
+panoz P AE N AA Z
+panozzo P AH N AA Z OW
+panphila P AE N F IH L AH
+pans P AE N Z
+pansies P AE N Z IY Z
+pansophic P AE N S AH F IH K
+pansy P AE N Z IY
+pant P AE N T
+pantaleo P AA N T AA L IY OW
+pantalone P AE N T AH L OW N
+pantaloon P AE N T AH L UW N
+pantaloons P AE N T AH L UW N Z
+pantano P AA N T AA N OW
+panted P AE N T IH D
+pantel P AA N T EH L
+panter P AE N T ER
+pantera's P AA N T EH R AH Z
+pantex P AE N T EH K S
+panthea P AE N TH IY AH
+pantheistic P AE N TH IY IH S T IH K
+pantheon P AE N TH IY AA N
+panther P AE N TH ER
+panther's P AE N TH ER Z
+panthers P AE N TH ER Z
+panthers' P AE N TH ER Z
+panties P AE N T IY Z
+panting P AE N T IH NG
+pantle P AE N T AH L
+pantoja P AA N T OW Y AH
+pantomime P AE N T AH M AY M
+panton P AE N T AH N
+pantry P AE N T R IY
+pants P AE N T S
+pantsuit P AE N T S UW T
+pantsuit(2) P AE N S UW T
+pantsuits P AE N T S UW T S
+pantsuits(2) P AE N S UW T S
+pantuso P AA N T UW S OW
+panty P AE N T IY
+pantyhose P AE N T IY HH OW Z
+panza P AE N Z AH
+panzarella P AA N Z AA R EH L AH
+panzer P AE N Z ER
+panzhihua P AE N Z IH HH Y UW AH
+panzica P AE N Z IH K AH
+pao P AW
+pao's P AW Z
+paolella P AA OW L EH L AH
+paoletti P AA OW L EH T IY
+paoli P AW L IY
+paoli(2) P EY OW L IY
+paolillo P AA OW L IH L OW
+paolini P AA OW L IY N IY
+paolino P AA OW L IY N OW
+paolo P AW L OW
+paolucci P AA OW L UW CH IY
+paone P EY OW N
+paonessa P AA OW N EH S AH
+pap P AE P
+papa P AA P AH
+papacy P EY P AH S IY
+papadakis P AA P AA D AA K IH S
+papadopoulos P AE P AH D AA P AH L AH S
+papadopoulos(2) P AA P AH D AA P AH L AH S
+papageorge P AE P AH JH AO R JH
+papageorge(2) P AA P AH JH AO R JH
+papago P AA P AH G OW
+papal P EY P AH L
+papale P AA P AA L IY
+papaleo P AA P EY L IY AH
+papalia P AA P AA L IY AH
+papandrea P AA P AA N D R IY AH
+papandreou P AH P AE N D R IY UW
+papania P AA P AA N IY AH
+paparazzi P AA P AA R AO Z IY
+paparazzi's P AA P AA R AO Z IY Z
+paparazzis P AA P AA R AO Z IY Z
+paparella P AA P AA R EH L AH
+papas P AA P AH Z
+papaw P AO P AO
+papay P AE P EY
+papaya P AH P AY AH
+papayas P AH P AY AH Z
+papazian P AH P EY Z IY AH N
+pape P EY P
+papenfuss P AE P AH N F AH S
+paper P EY P ER
+paper's P EY P ER Z
+paperback P EY P ER B AE K
+paperbacks P EY P ER B AE K S
+paperboard P EY P ER B AO R D
+paperboy P EY P ER B AO Y
+paperboy's P EY P ER B AO Y Z
+paperboys P EY P ER B AO Y Z
+papered P EY P ER D
+papering P EY P ER IH NG
+paperless P EY P ER L AH S
+papermaking P AE P ER M EY K IH NG
+papermate P EY P ER M EY T
+papernick P EY P ER N IH K
+papers P EY P ER Z
+papers' P EY P ER Z
+paperweight P EY P ER W EY T
+paperwork P EY P ER W ER K
+paperworker P EY P ER W ER K ER
+paperworkers P EY P ER W ER K ER Z
+papery P EY P ER IY
+papesh P AE P IH SH
+papier P EY P Y ER
+papier-mache P EY P ER M AH SH EY
+papillion P AH P IH L Y AH N
+papilloma P AE P IH L OW M AH
+papin P AA P IY N
+papineau P AE P IH N OW
+papini P AA P IY N IY
+papke P EY P K
+papo P AE P OW
+papon P AE P AO N
+papon's P AE P AO N Z
+papp P AE P
+pappa P AE P AH
+pappadio P AH P EY D IY OW
+pappalardo P AA P AA L AA R D OW
+pappas P AE P AH S
+pappert P AE P ER T
+paprika P AE P R IY K AH
+paprika(2) P AH P R IY K AH
+paprocki P AH P R OW T S K IY
+papson P AE P S AH N
+papua P AE P Y UW AH
+paque P AE K
+paquet P AA K EY T
+paquette P AH K EH T
+paquin P AE K W IH N
+par P AA R
+par's P AA R Z
+para P EH R AH
+parable P EH R AH B AH L
+parables P EH R AH B AH L Z
+parabola P ER AE B AH L AH
+parabolic P EH R AH B AA L IH K
+parachute P EH R AH SH UW T
+parachuted P EH R AH SH UW T IH D
+parachutes P EH R AH SH UW T S
+parachuting P EH R AH SH UW T IH NG
+parada P ER AE D AH
+parade P ER EY D
+paraded P ER EY D IH D
+paradee P EH R AH D IY
+parades P ER EY D Z
+paradigm P EH R AH D AY M
+paradigms P EH R AH D AY M Z
+parading P ER EY D IH NG
+paradis P ER AE D IH S
+paradise P EH R AH D AY S
+paradiso P ER AH D IY S OW
+parador P EH R AH D AO R
+paradowski P ER AH D AO F S K IY
+paradox P EH R AH D AA K S
+paradoxes P EH R AH D AA K S IH Z
+paradoxical P EH R AH D AA K S IH K AH L
+paradoxically P EH R AH D AA K S AH K L IY
+paradoxically(2) P EH R AH D AA K S AH K AH L IY
+parady P ER AE D IY
+paradyne P EH R AH D AY N
+paradyne's P EH R AH D AY N Z
+paraffin P EH R AH F AH N
+parag P ER AA G
+paraglide P EH R AH G L AY D
+paragon P EH R AH G AA N
+paragraph P AE R AH G R AE F
+paragraph(2) P EH R AH G R AE F
+paragraphs P AE R AH G R AE F S
+paragraphs(2) P EH R AH G R AE F S
+paraguay P EH R AH G W EY
+paraguayan P EH R AH G W AY AH N
+parakeet P EH R AH K IY T
+parakeets P EH R AH K IY T S
+paralegal P EH R AH L IY G AH L
+paralegals P EH R AH L IY G AH L Z
+parallax P EH R AH L AE K S
+parallel P EH R AH L EH L
+paralleled P EH R AH L EH L D
+paralleling P EH R AH L EH L IH NG
+parallelism P EH R AH L EH L IH Z AH M
+parallels P EH R AH L EH L Z
+paralympic P EH R AH L IH M P IH K
+paralysis P ER AE L AH S AH S
+paralysis(2) P ER AE L IH S IH S
+paralytic P EH R AH L IH T IH K
+paralyze P EH R AH L AY Z
+paralyzed P EH R AH L AY Z D
+paralyzes P EH R AH L AY Z IH Z
+paralyzing P EH R AH L AY Z IH NG
+paramagnetic P AE R AH M AE G N EH T IH K
+paramax P EH R AH M AE K S
+paramecium P EH R AH M IY S IY AH M
+paramedic P EH R AH M EH D IH K
+paramedics P EH R AH M EH D IH K S
+parameter P ER AE M AH T ER
+parameters P ER AE M AH T ER Z
+parametric P EH R AH M EH T R IH K
+paramilitaries P EH R AH M IH L AH T EH R IY Z
+paramilitary P EH R AH M IH L AH T EH R IY
+paramo P ER AE M OW
+paramonova P EH R AH M AH N OW V AH
+paramore P EH AH M AO R
+paramount P EH R AH M AW N T
+paramount's P EH R AH M AW N T S
+paramus P ER AE M AH S
+parana P ER AA N AH
+paranoia P EH R AH N OY AH
+paranoiac P EH R AH N OY AE K
+paranoid P EH R AH N OY D
+paranormal P EH R AH N AO R M AH L
+parapet P EH R AH P EH T
+paraphernalia P EH R AH F AH N EY L Y AH
+paraphrase P EH R AH F R EY Z
+paraphrasing P EH R AH F R EY Z IH NG
+paraplegia P EH R AH P L IY JH IY AH
+paraplegic P EH R AH P L EH G IH K
+paraplegic(2) P EH R AH P L IY JH IH K
+parasite P EH R AH S AY T
+parasites P EH R AH S AY T S
+parasitic P EH R AH S IH T IH K
+parasympathetic P EH R AH S IH M P AH TH EH T IH K
+paratore P ER AH T AO R IY
+paratroop P EH R AH T R UW P
+paratrooper P EH R AH T R UW P ER
+paratroopers P EH R AH T R UW P ER Z
+paratroops P EH R AH T R UW P S
+parazoa P EH R AH Z OW AH
+parboil P AA R B OY L
+parboiling P AA R B OY L IH NG
+parc P AA R K
+parcel P AA R S AH L
+parceled P AA R S AH L D
+parceling P AA R S AH L IH NG
+parceling(2) P AA R S L IH NG
+parcell P AA R S EY L
+parcells P AA R S AH L Z
+parcels P AA R S AH L Z
+parch P AA R CH
+parched P AA R CH T
+parcher P AA R CH ER
+parchman P AA R K M AH N
+parchment P AA R CH M AH N T
+parchmentlike P AA R CH M AH N T L AY K
+parcplace P AA R K P L EY S
+parde P AA R D
+pardee P AA R D IY
+parden P AA R D AH N
+pardi P AA R D IY
+pardini P AA R D IY N IY
+pardo P AA R D OW
+pardoe P AA R D OW
+pardon P AA R D AH N
+pardoned P AA R D AH N D
+pardoning P AA R D AH N IH NG
+pardons P AA R D AH N Z
+pardue P AA R D UW
+pardus P AA R D AH S
+pardy P AA R D IY
+pare P EH R
+pared P EH R D
+paredes P AA R EY D EH S
+paredez P AA R EY D EH Z
+paredis P EH R AH D IH S
+paredo P AH R EY D OW
+parekh P AA R IH K
+parella P AA R EH L AH
+parent P EH R AH N T
+parent's P EH R AH N T S
+parentage P EH R AH N T AH JH
+parental P ER EH N T AH L
+parente P AA R EH N T IY
+parenteau P AA R EH N T OW
+parentheses P ER EH N TH AH S IY Z
+parenthesis P ER EH N TH AH S IH S
+parenthetical P ER EH N TH EH T IH K AH L
+parenthetically P ER EH N TH EH T IH K AH L IY
+parenthetically(2) P ER EH N TH EH T IH K L IY
+parenthood P EH R AH N T HH UH D
+parenti P AA R EH N T IY
+parenting P EH R AH N T IH NG
+parents P EH R AH N T S
+parents' P EH R AH N T S
+pares P EH R Z
+pareti P EH R EH T IY
+paretti P EH R EH T IY
+parfitt P AA R F IH T
+parfums P ER F Y UW M Z
+parfums(2) P AA R F Y UW M Z
+parga P AA R G AH
+pargesa P AA R JH EH S AH
+parham P AA R HH AH M
+pariagua P AA R IY AA G W AH
+pariah P ER AY AH
+pariahs P ER AY AH Z
+paribas P EH R IY B AH S
+paribas's P EH R IY B AH S IH Z
+parietal P ER AY AH T AH L
+parikh P AE R IH K
+parillo P AA R IH L OW
+parimutuel P EH R IH M Y UW CH UW AH L
+paring P EH R IH NG
+paris P EH R IH S
+paris' P EH R IH S
+paris'(2) P AE R IH S
+paris's P EH R IH S IH Z
+paris(2) P AE R IH S
+parise P AA R AY Z
+pariseau P AE R IH S OW
+parish P AE R IH SH
+parish(2) P EH R IH SH
+parishes P AE R IH SH IH Z
+parishes(2) P EH R IH SH IH Z
+parishioner P ER IH SH AH N ER
+parishioners P ER IH SH AH N ER Z
+parisi P AA R IY S IY
+parisian P ER IH ZH AH N
+parisians P ER IH S IY AH N Z
+parisienne P ER IH S IY EH N
+parities P EH R AH T IY Z
+parity P EH R AH T IY
+parizeau P EH R IH Z OW
+parizek P ER IH Z EH K
+parizo P AA R IY Z OW
+park P AA R K
+park's P AA R K S
+parka P AA R K AH
+parkas P AA R K AH Z
+parke P AA R K
+parked P AA R K T
+parker P AA R K ER
+parker's P AA R K ER Z
+parkers P AA R K ER Z
+parkersburg P AA R K ER Z B ER G
+parkerson P AA R K ER S AH N
+parkes P AA R K S
+parkey P AA R K IY
+parkfield P AA R K F IY L D
+parkhill P AA R K HH IH L
+parkhurst P AA R K HH ER S T
+parkin P AA R K IH N
+parking P AA R K IH NG
+parkins P AA R K IH N Z
+parkinson P AA R K IH N S AH N
+parkinson's P AA R K IH N S AH N Z
+parkinsonism P AA R K IH N S AH N IH Z IH M
+parkison P AA R K IH S AH N
+parkland P AA R K L AE N D
+parkman P AA R K M AH N
+parks P AA R K S
+parks' P AA R K S
+parkside P AA R K S AY D
+parkway P AA R K W EY
+parlance P AA R L AH N S
+parlato P AA R L AA T OW
+parlay P AA R L EY
+parlayed P AA R L EY D
+parlaying P AA R L EY IH NG
+parlays P AA R L EY Z
+parlee P AA R L IY
+parler P AA R L ER
+parlett P AA R L IH T
+parlette P AA R L EH T
+parley P AA R L IY
+parliament P AA R L AH M AH N T
+parliament's P AA R L AH M AH N T S
+parliamentarian P AA R L AH M AH N T EH R IY AH N
+parliamentarianism P AA R L AH M AH N T EH R IY AH N IH Z AH M
+parliamentarianism(2) P AA R L AH M AH N T EH R IY AH N IH Z M
+parliamentarians P AA R L AH M EH N T EH R IY AH N Z
+parliamentary P AA R L AH M EH N T ER IY
+parliamentary(2) P AA R L AH M EH N ER IY
+parliaments P AA R L AH M AH N T S
+parlier P AA R L IY ER
+parlin P AA R L IH N
+parlodel P AA R L OW D EH L
+parlor P AA R L ER
+parlors P AA R L ER Z
+parlour P AA R L ER
+parlow P AA R L OW
+parma P AA R M AH
+parmalat P AA R M AH L AE T
+parman P AA R M AH N
+parmar P AA R M AA R
+parmele P AA R M EH L IY
+parmelee P AA R M IH L IY
+parmenter P AA R M AH N T ER
+parmentier P AA R M AH N T IY ER
+parmer P AA R M ER
+parmesan P AA R M AH Z AA N
+parmeter P AA R M IH T ER
+parmley P AA R M L IY
+parnassus P AA R N AE S AH S
+parnell P AA R N AH L
+parnella P AA R N EH L AH
+parnes P AA R N Z
+parness P AA R N AH S
+paro P AA R OW
+parochial P ER OW K IY AH L
+parochialism P ER OW K IY AH L IH Z AH M
+parodi P AA R OW D IY
+parodied P EH R AH D IY D
+parodies P EH R AH D IY Z
+parodist P AE R AH D IH S T
+parody P EH R AH D IY
+parole P ER OW L
+paroled P ER OW L D
+parolee P ER OW L IY
+parolees P ER OW L IY Z
+paroles P ER OW L Z
+paroling P ER OW L IH NG
+parpart P AA R P AA R T
+parquet P AA R K EY
+parr P AA R
+parra P AA R AH
+parrack P AE R AH K
+parramore P AA R AA M AO R
+parras P EH R AH Z
+parrella P AA R EH L AH
+parrent P AA R AH N T
+parrett P AE R IH T
+parretti P ER EH T IY
+parretti's P ER EH T IY S
+parried P EH R IY D
+parrill P AE R AH L
+parrilla P AA R IH L AH
+parrillo P AA R IH L OW
+parrinello P AA R IY N EH L OW
+parrino P AA R IY N OW
+parriott P AE R IY AH T
+parris P EH R IH S
+parrish P EH R IH SH
+parrishes P EH R IH SH IH Z
+parrot P EH R AH T
+parrots P EH R AH T S
+parrott P EH R AH T
+parrotta P AA R OW T AH
+parrow P AE R OW
+parry P EH R IY
+pars P AA R Z
+parse P AA R S
+parsec P AA R S EH K
+parsed P AA R S T
+parsefal P AA R S IH F AH L
+parsell P AA R S AH L
+parser P AA R S ER
+parsers P AA R S ER Z
+parshall P AA R SH AH L
+parshley P AA R SH L IY
+parsi P AA R S IY
+parsifal P AA R S IH F AH L
+parsifal(2) P AA R Z AH F AA L
+parsimonious P AA R S AH M OW N IY AH S
+parsimony P AA R S AH M OW N IY
+parsing P AA R S IH NG
+parsippany P AA R S IH P AH N IY
+parsky P AA R S K IY
+parsley P AA R S L IY
+parslow P AA R S L OW
+parson P AA R S AH N
+parsonage P AA R S AH N IH JH
+parsonages P AA R S AH N IH JH AH Z
+parsons P AA R S AH N Z
+parsow P AA R S OW
+part P AA R T
+part's P AA R T S
+part-time P AA R T T AY M
+partain P AA R T EY N
+partake P AA R T EY K
+partch P AA R CH
+parte P AA R T
+parte(2) P AA R T EY
+partecipazioni P AA R T EH S IH P AE Z IY OW N IY
+parted P AA R T AH D
+parted(2) P AA R T IH D
+partee P AA R T IY
+parten P AA R T AH N
+partenope P AA R T AH N OW P
+parthenia P AA R TH EH N IY AH
+parthenogenetic P AA R TH AH N OW JH AH N EH T IH K
+parthenon P AA R TH AH N AA N
+parthian P AA R TH IY AH N
+parti P AA R T IY
+partial P AA R SH AH L
+partiality P AA R SH IY AE L AH T IY
+partially P AA R SH AH L IY
+partially(2) P AA R SH L IY
+participant P AA R T IH S AH P AH N T
+participants P AA R T IH S AH P AH N T S
+participants' P AA R T IH S AH P AH N T S
+participate P AA R T IH S AH P EY T
+participated P AA R T IH S AH P EY T AH D
+participated(2) P AA R T IH S AH P EY T IH D
+participates P AA R T IH S AH P EY T S
+participating P AA R T IH S AH P EY T IH NG
+participation P AA R T IH S AH P EY SH AH N
+participations P AA R T IH S AH P EY SH AH N Z
+participative P AA R T IH S AH P AH T IH V
+participatory P AA R T IH S AH P AH T AO R IY
+participle P AA R T IH S IH P AH L
+participles P AA R T IH S IH P AH L Z
+particle P AA R T AH K AH L
+particle(2) P AA R T IH K AH L
+particles P AA R T AH K AH L Z
+particles(2) P AA R T IH K AH L Z
+particular P ER T IH K Y AH L ER
+particular(2) P AA T IH K Y AH L ER
+particularity P ER T IH K Y AH L AE R AH T IY
+particularly P AA R T IH K Y AH L ER L IY
+particularly(2) P ER T IH K Y AH L ER L IY
+particulars P ER T IH K Y AH L ER Z
+particulate P ER T IH K Y AH L AH T
+particulates P AA R T IH K Y AH L AH T S
+partida P AA R T IY D AH
+partido P AA R T IY D OW
+partied P AA R T IY D
+parties P AA R T IY Z
+parties' P AA R T IY Z
+partin P AA R T IH N
+parting P AA R T IH NG
+partington P AA R T IH NG T AH N
+partisan P AA R T AH Z AH N
+partisaned P AA R T AH Z AH N D
+partisans P AA R T AH Z AH N Z
+partisanship P AA R T AH Z AH N SH IH P
+partition P AA R T IH SH AH N
+partitioned P AA R T IH SH AH N D
+partitioning P AA R T IH SH AH N IH NG
+partitions P AA R T IH SH AH N Z
+partlow P AA R T L OW
+partly P AA R T L IY
+partner P AA R T N ER
+partner's P AA R T N ER Z
+partnering P AA R T N ER IH NG
+partners P AA R T N ER Z
+partners' P AA R T N ER Z
+partnership P AA R T N ER SH IH P
+partnership's P AA R T N ER SH IH P S
+partnerships P AA R T N ER SH IH P S
+partnerships' P AA R T N ER SH IH P S
+partney P AA R T N IY
+parton P AA R T AH N
+partridge P AA R T R AH JH
+partridge(2) P AA R T R IH JH
+partridges P AA R T R IH JH IH Z
+parts P AA R T S
+parts' P AA R T S
+parttime P AA R T T AY M
+partum P AA R T AH M
+party P AA R T IY
+party's P AA R T IY Z
+partying P AA R T IY IH NG
+partyka P ER T IH K AH
+parvin P AA R V IH N
+pary P AA R IY
+parziale P AA R Z IY AA L IY
+parzych P AA R Z IH HH
+pas P AA Z
+pas-de-deux P AA D AH D UW
+pasadena P AE S AH D IY N ER
+pascagoula P AE S K AH G UW L AH
+pascal P AE S K AE L
+pascale P AE S K AE L
+pascarella P AA S K AA R EH L AH
+pascarelli P AA S K AA R EH L IY
+pasch P AE S K
+paschal P AE SH AH L
+paschall P AE SH AH L
+paschen P AE SH AH N
+paschke P AE SH K
+pasco P AA S K OW
+pascoe P AE S K OW
+pascua P AA S K UW AH
+pascual P AE S K UW AH L
+pascucci P AA S K UW CH IY
+pascutto P AH S K Y UW T OW
+pascuzzi P AA S K UW T S IY
+pasek P AA S EH K
+paseo P AA S EY OW
+pash P AE SH
+pasha P AH SH AA
+pasha(2) P AA SH AH
+pashley P AE SH L IY
+pasillas P AA S IH L AH Z
+pasing P EY S IH NG
+pasion P AA ZH IY N
+pask P AE S K
+paske P EY S K
+paskey P AE S K IY
+pasko P AA S K OW
+paslay P AE S L EY
+pasley P AE S L IY
+pasman P AE S M AH N
+paso P AE S OW
+paso's P AE S OW Z
+pasok P AA Z AA K
+pasok(2) P AE S AO K
+pasqua P AA S K W AH
+pasquale P AA S K W AA L EY
+pasquarella P AA S K W AA R EH L AH
+pasquarelli P AA S K W AA R EH L IY
+pasquarello P AA S K W AA R EH L OW
+pasquariello P AA S K W AA R IY EH L OW
+pasque P AE S K
+pasquinelli P AA S K W IY N EH L IY
+pasquini P AA S K W IY N IY
+pass P AE S
+passable P AE S AH B AH L
+passably P AE S AH B L IY
+passafiume P AA S AA F IY UW M
+passage P AE S AH JH
+passage(2) P AE S IH JH
+passages P AE S AH JH AH Z
+passages(2) P AE S IH JH IH Z
+passageway P AE S AH JH W EY
+passageway(2) P AE S IH JH W EY
+passaic P AH S EY IH K
+passalacqua P AE S AH L AE K W AH
+passanisi P AA S AA N IY S IY
+passante P AA S AA N T IY
+passantino P AA S AA N T IY N OW
+passarella P AA S AA R EH L AH
+passarelli P AA S AA R EH L IY
+passaretti P AA S AA R EH T IY
+passaro P AA S AA R OW
+passat P AE S AE T
+passbook P AE S B UH K
+passbooks P AE S B UH K S
+passe P AE S EY
+passed P AE S T
+passel P AE S IH L
+passenger P AE S AH N JH ER
+passenger's P AE S AH N JH ER Z
+passengers P AE S AH N JH ER Z
+passengers' P AE S AH N JH ER Z
+passer P AE S ER
+passerby P AE S ER B IY
+passero P AA S EH R OW
+passers P AE S ER Z
+passersby P AE S ER Z B IY
+passes P AE S AH Z
+passes(2) P AE S IH Z
+passey P AE S IY
+passim P AE S IY M
+passing P AE S IH NG
+passino P AA S IY N OW
+passion P AE SH AH N
+passionate P AE SH AH N AH T
+passionately P AE SH AH N AH T L IY
+passions P AE SH AH N Z
+passive P AE S IH V
+passively P AE S IH V L IY
+passivity P AH S IH V IH T IY
+passman P AE S M AH N
+passmore P AA S M AO R
+passon P AE S AH N
+passover P AE S OW V ER
+passow P AE S OW
+passport P AE S P AO R T
+passports P AE S P AO R T S
+password P AE S W ER D
+passwords P AE S W ER D Z
+past P AE S T
+pasta P AA S T AH
+pastas P AA S T AH Z
+paste P EY S T
+pasted P EY S T IH D
+pastel P AE S T EH L
+pastels P AE S T EH L Z
+paster P AE S T ER
+pasternack P AE S T ER N AE K
+pasternak P AE S T ER N AE K
+pasternak's P AE S T ER N AE K S
+pastes P EY S T S
+pasteur P AH S T UW R
+pasteurization P AE S CH ER AH Z EY SH AH N
+pasteurize P AE S CH ER AY Z
+pasteurized P AE S CH ER AY Z D
+pasteurizes P AE S CH ER AY Z IH Z
+pasteurizing P AE S CH ER AY Z IH NG
+pastiche P AE S T IY SH
+pastiches P AE S T IY SH AH Z
+pastime P AE S T AY M
+pastimes P AE S T AY M Z
+pasting P EY S T IH NG
+pastor P AE S T ER
+pastor's P AE S T ER Z
+pastora P AE S T AO R AH
+pastoral P AE S T ER AH L
+pastoralism P AE S T ER AH L IH Z AH M
+pastoralize P AE T ER AH L AY Z
+pastore P AE S T AO R
+pastorino P AA S T AO R IY N OW
+pastorius P AE S T AO R IY IH S
+pastors P AE S T ER Z
+pastrami P AH S T R AA M IY
+pastrana P AA S T R AE N AH
+pastries P EY S T R IY Z
+pastry P EY S T R IY
+pasts P AE S T S
+pasts(2) P AE S S
+pasts(3) P AE S
+pastula P AA S T UW L AH
+pasture P AE S CH ER
+pastures P AE S CH ER Z
+paszek P AA SH EH K
+paszkiewicz P AA SH K AH V IH CH
+pasztor P AE S T ER
+pat P AE T
+pat's P AE T S
+patagonia P AE T AH G OW N IY AH
+patagonian P AE T AH G OW N IY AH N
+patak P AE T AH K
+pataki P AH T AA K IY
+pataki's P AH T AA K IY Z
+pataky P AE T AH K IY
+patalano P AA T AA L AA N OW
+patane P AE T AH N
+patch P AE CH
+patched P AE CH T
+patchell P AE CH AH L
+patchen P AE CH AH N
+patches P AE CH AH Z
+patches(2) P AE CH IH Z
+patchett P AE CH IH T
+patchin P AE CH IH N
+patching P AE CH IH NG
+patchwork P AE CH W ER K
+patchworks P AE CH W ER K S
+patchy P AE CH IY
+patco P AE T K OW
+pate P EY T
+patek P AA T EH K
+patel P AH T EH L
+patella P AH T EH L AH
+patenaude P AE T IH N OW D
+patent P AE T AH N T
+patentable P AE T AH N T AH B AH L
+patented P AE T AH N T AH D
+patented(2) P AE T AH N T IH D
+patenting P AE T AH N T IH NG
+patently P AE T AH N T L IY
+patents P AE T AH N T S
+pater P EY T ER
+patera P AA T EH R AH
+paternal P AH T ER N AH L
+paternalism P AH T ER N AH L IH Z AH M
+paternalistic P AH T ER N AH L IH S T IH K
+paternity P AH T ER N IH T IY
+paterno P AA T EH R N OW
+paternostro P AA T ER N OW S T R OW
+paterson P AE T ER S AH N
+pates P EY T S
+patese P AH T IY S IY
+patese(2) P AH T IY S
+patey P EY T IY
+path P AE TH
+pathak P AH TH AA K
+pathak(2) P AH T AA K
+pathan P AE TH AH N
+pathans P AE TH AH N Z
+pathe P AE TH
+pathet-lao P AE TH AH T L AW
+pathetic P AH TH EH T IH K
+pathetically P AH TH EH T IH K AH L IY
+pathetically(2) P AH TH EH T IH K L IY
+pathfinder P AE TH F AY N D ER
+pathmark P AE TH M AA R K
+pathmark's P AE TH M AA R K S
+pathogen P AE TH AH JH AH N
+pathogenic P AE TH AH JH EH N IH K
+pathogens P AE TH AH JH AH N Z
+pathological P AE TH AH L AA JH IH K AH L
+pathologically P AE TH AH L AA JH IH K L IY
+pathologies P AH TH AA L AH JH IY Z
+pathologist P AH TH AA L AH JH AH S T
+pathologists P AH TH AA L AH JH AH S T S
+pathologists(2) P AH TH AA L AH JH AH S S
+pathologists(3) P AH TH AA L AH JH AH S
+pathology P AH TH AA L AH JH IY
+pathos P EY TH AA S
+paths P AE DH Z
+paths(2) P AE TH S
+pathway P AE TH W EY
+pathways P AE TH W EY Z
+patience P EY SH AH N S
+patient P EY SH AH N T
+patient's P EY SH AH N T S
+patiently P EY SH AH N T L IY
+patients P EY SH AH N T S
+patients' P EY SH AH N T S
+patients(2) P EY SH AH N Z
+patillo P AH T IH L OW
+patin P AE T IH N
+patina P AH T IY N AH
+patinkin P AH T IH NG K IH N
+patino P AA T IY N OW
+patio P AE T IY OW
+patios P AE T IY OW Z
+patlan P AE T L AH N
+patlex P AE T L EH K S
+patlex's P AE T L EH K S IH Z
+patman P AE T M AH N
+patmore P AE T M AO R
+patnaude P AA T N AO D IY
+patnode P AE T N OW D
+paton P AE T AH N
+patons P AE T AH N Z
+patriarca P AA T R IY AA R K AH
+patriarch P EY T R IY AA R K
+patriarch's P EY T R IY AA R K S
+patriarchal P EY T R IY AA R K AH L
+patriarchate P EY T R IY AA R K AH T
+patriarchs P EY T R IY AA R K S
+patriarchy P EY T R IY AA R K IY
+patrice P AH T R IY S
+patricelli P AA T R IY CH EH L IY
+patricia P AH T R IH SH AH
+patrician P AH T R IH SH AH N
+patricians P AH T R IH SH AH N Z
+patricio P AH T R IH S IY OW
+patrick P AE T R IH K
+patrick's P AE T R IH K S
+patricks P AE T R IH K S
+patricof P AE T R IH K AO F
+patridge P AE T R IH JH
+patrie P AE T ER IY
+patrilineal P AE T R IH L IH N IY AH L
+patrimonial P AE T R AH M OW N Y AH L
+patrimonial(2) P AE T R AH M OW N IY AH L
+patrimony P AE T R AH M OW N IY
+patriot P EY T R IY AH T
+patriot's P EY T R IY AH T S
+patriotic P EY T R IY AA T IH K
+patriotism P EY T R IY AH T IH Z AH M
+patriots P EY T R IY AH T S
+patristic P AH T R IH S T IH K
+patrizio P AA T R IY Z IY OW
+patrol P AH T R OW L
+patrol's P AH T R OW L Z
+patrolled P AH T R OW L D
+patrolling P AH T R OW L IH NG
+patrolman P AH T R OW L M AE N
+patrolmen P AH T R OW L M EH N
+patrols P AH T R OW L Z
+patron P EY T R AH N
+patronage P AE T R AH N IH JH
+patronage(2) P EY T R AH N AH JH
+patronage(3) P EY T R AH N IH JH
+patrone P AA T R OW N IY
+patroness P EY T R AH N AH S
+patronize P EY T R AH N AY Z
+patronize(2) P AE T R AH N AY Z
+patronized P EY T R AH N AY Z D
+patronized(2) P AE T R AH N AY Z D
+patronizes P EY T R AH N AY Z AH Z
+patronizing P EY T R AH N AY Z IH NG
+patrons P EY T R AH N Z
+patronym P AE T R AH N IH M
+patronymic P AE T R AH N IH M IH K
+patry P AE T R IY
+pats P AE T S
+patsies P AE T S IY Z
+patsy P AE T S IY
+patt P AE T
+patted P AE T AH D
+patted(2) P AE T IH D
+pattee P AE T IY
+patten P AE T AH N
+patten's P AE T AH N Z
+patter P AE T ER
+pattered P AE T ER D
+pattern P AE T ER N
+patterned P AE T ER N D
+patterns P AE T ER N Z
+patterson P AE T ER S AH N
+patterson's P AE T ER S AH N Z
+patteson P AE T IH S AH N
+patti P AE T IY
+pattie P AE T IY
+patties P AE T IY Z
+pattillo P AA T IH L OW
+pattin P AE T IH N
+patting P AE T IH NG
+pattinson P AE T IH N S AH N
+pattis P AE T IH S
+pattison P AE T IH S AH N
+pattiz P AE T IH Z
+patton P AE T AH N
+patton's P AE T AH N Z
+patty P AE T IY
+patty's P AE T IY Z
+patuxent P AH T AH K S AH N T
+patuxet P AH T AH K S AH T
+patuxets P AH T AH K S AH T S
+paty P EY T IY
+patz P AE T S
+patzer P EY T Z ER
+patzke P AE T S K IY
+paucity P AO S AH T IY
+paugh P AO
+paul P AO L
+paul's P AO L Z
+paula P AO L AH
+paulding P AO L D IH NG
+paule P AO L
+paules P AO L Z
+pauletta P AA L EH T AH
+paulette P AO L EH T
+pauley P AO L IY
+paulhamus P AO L HH EY M AH S
+paulhus P AW L HH IH S
+pauli P AO L IY
+paulick P AO L IH K
+paulik P AO L IH K
+paulin P AO L IH N
+paulina P AO L IY N AH
+pauline P AO L IY N
+pauling P AO L IH NG
+paulino P AO L IY N OW
+paulita P AO L IY T AH
+paulk P AO L K
+paull P AO L
+paullin P AO L IH N
+paulo P AO L OW
+paulos P AW L OW Z
+pauls P AO L Z
+paulsen P AW L S AH N
+paulson P AO L S AH N
+paulus P AO L AH S
+pauly P AO L IY
+paunchy P AO N CH IY
+paup P AO P
+pauper P AO P ER
+paupers P AO P ER Z
+pause P AO Z
+paused P AO Z D
+pauses P AO Z AH Z
+pauses(2) P AO Z IH Z
+pausing P AO Z IH NG
+paustian P AO Z CH IH N
+pautler P AW T AH L ER
+pautler(2) P AW T L ER
+pautsch P AW CH
+pautz P AO T S
+pauwels P AW W AH L Z
+pavao P AA V AW
+pavarotti P AE V ER AA T IY
+pavarotti's P AE V ER AA T IY
+pave P EY V
+paved P EY V D
+pavek P AE V IH K
+pavel P AE V AH L
+pavelic P AH V EH L IH K
+pavelic(2) P AE V L IH K
+pavelka P AH V EH L K AH
+pavelko P AH V EH L K OW
+pavement P EY V M AH N T
+pavements P EY V M AH N T S
+paver P EY V ER
+paves P EY V Z
+pavese P AA V EY Z IY
+pavey P EY V IY
+pavia P EY V IY AH
+pavich P AE V IH CH
+pavilion P AH V IH L Y AH N
+pavilions P AH V IH L Y AH N Z
+pavillion P AH V IH L Y AH N
+paving P EY V IH NG
+pavlak P AA V L AH K
+pavlic P AE V L IH K
+pavlica P AE V L IH K AH
+pavlicek P AA V L IH CH EH K
+pavlich P AA V L IH HH
+pavlick P AE V L IH K
+pavlik P AE V L IH K
+pavlis P AE V L IH S
+pavlock P AE V L AH K
+pavlov P AE V L AA V
+pavlovian P AE V L OW V IY AH N
+pavlovic P AH V L AA V IH K
+pavlovich P AE V L AH V IH CH
+pavo P AA V OW
+pavon P AA V AH N
+pavone P AH V OW N
+paw P AO
+pawed P AO D
+pawelek P AA V EH L EH K
+pawelski P AA V EH L S K IY
+pawelsky P AA V EH L S K IY
+pawing P AO IH NG
+pawlak P AO L AH K
+pawley P AO L IY
+pawlicki P AA V L IH T S K IY
+pawlik P AO L IH K
+pawlikowski P AA V L IH K AO F S K IY
+pawling P AO L IH NG
+pawloski P AA V L AW S K IY
+pawlowicz P AA V L AH V IH CH
+pawlowski P AA V L AO F S K IY
+pawluk P AA V L AH K
+pawn P AO N
+pawned P AO N D
+pawnee P AO N IY
+pawnees P AO N IY Z
+pawns P AO N Z
+pawnshop P AO N SH AA P
+pawnshops P AO N SH AA P S
+paws P AO Z
+pawson P AO S AH N
+pawtucket P AO T AH K IH T
+pawtuxet P AO T AH K S AH T
+pax P AE K S
+paxar P AE K S ER
+paxman P AE K S M AH N
+paxon P AE K S AH N
+paxson P AE K S AH N
+paxton P AE K S T AH N
+pay P EY
+pay'n P EY AH N
+payable P EY AH B AH L
+payables P EY AH B AH L Z
+payan P EY AH N
+payback P EY B AE K
+paybacks P EY B AE K S
+paycheck P EY CH EH K
+paychecks P EY CH EH K S
+paychex P EY CH EH K S
+payco P EY K OW
+payday P EY D EY
+paye P EY
+payer P EY ER
+payer's P EY ER Z
+payers P EY ER Z
+payers' P EY ER Z
+payette P EY EH T
+payeur P EY ER
+payin' P EY IH N
+paying P EY IH NG
+payless P EY L EH S
+payload P EY L OW D
+payload's P EY L OW D Z
+payloads P EY L OW D Z
+paylor P EY L ER
+payment P EY M AH N T
+payments P EY M AH N T S
+paymer P EY M ER
+payna P EY N AH
+payne P EY N
+paynter P EY N T ER
+payoff P EY AO F
+payoffs P EY AO F S
+payola P EY OW L AH
+payout P EY AW T
+payouts P EY AW T S
+payroll P EY R OW L
+payrolls P EY R OW L Z
+pays P EY Z
+paysinger P EY S IH NG G ER
+paysinger(2) P EY Z IH NG G ER
+payson P EY Z AH N
+paysop P EY S AA P
+paysops P EY S AA P S
+payton P EY T AH N
+paz P AA Z
+pazner P AA Z N ER
+pazos P AA Z OW Z
+pazuto P AH Z UW T OW
+pc P IY S IY
+pc's P IY S IY Z
+pcs P IY S IY Z
+pea P IY
+peabody P IY B AA D IY
+peabody's P IY B AA D IY Z
+peace P IY S
+peaceable P IY S AH B AH L
+peaceably P IY S AH B L IY
+peaceful P IY S F AH L
+peacefully P IY S F AH L IY
+peacefulness P IY S F AH L N AH S
+peacekeeper P IY S K IY P ER
+peacekeepers P IY S K IY P ER Z
+peacekeeping P IY S K IY P IH NG
+peacemaker P IY S M EY K ER
+peacemaker's P IY S M EY K ER Z
+peacemakers P IY S M EY K ER Z
+peacemaking P IY S M EY K IH NG
+peacetime P IY S T AY M
+peach P IY CH
+peacher P IY CH ER
+peaches P IY CH AH Z
+peaches(2) P IY CH IH Z
+peachey P IY CH IY
+peachtree P IY CH T R IY
+peachy P IY CH IY
+peacock P IY K AA K
+peacocks P IY K AA K S
+peaden P EH D AH N
+peafowl P IY F AW L
+peagler P IY G L ER
+peak P IY K
+peake P IY K
+peaked P IY K T
+peakes P IY K S
+peakes' P IY K S
+peaking P IY K IH NG
+peaks P IY K S
+peaks' P IY K S
+peal P IY L
+peale P IY L
+pealer P IY L ER
+peanut P IY N AH T
+peanuts P IY N AH T S
+peapack P IY P AE K
+peapod P IY P AO D
+pear P EH R
+pearce P IH R S
+pearcy P ER K IY
+pearl P ER L
+pearl-harbor P ER L HH AA R B ER
+pearle P ER L
+pearline P ER L AY N
+pearling P ER L IH NG
+pearlman P ER L M AE N
+pearls P ER L Z
+pearlstein P ER L S T AY N
+pearlstein(2) P ER L S T IY N
+pearlstine P ER L S T AY N
+pearly P ER L IY
+pearman P EH R M AH N
+pears P EH R Z
+pearsall P EH R S AO L
+pearse P ER S
+pearson P IH R S AH N
+pearson's P IH R S AH N Z
+peart P ER T
+peary P IY R IY
+peas P IY Z
+peasant P EH Z AH N T
+peasantry P EH Z AH N T R IY
+peasants P EH Z AH N T S
+peasants' P EH Z AH N T S
+pease P IY Z
+pease(2) P IY S
+peasey P IY Z IY
+peasey's P IY Z IY Z
+peaslee P IY Z L IY
+peasley P IY Z L IY
+peat P IY T
+peat's P IY T S
+peatross P IY T R AH S
+peaudouce P OW D UW S
+peavey P IY V IY
+peavler P IY V L ER
+peavy P IY V IY
+peay P IY
+pebble P EH B AH L
+pebbles P EH B AH L Z
+pebereau P EH B ER OW
+pebereau's P EH B ER OW Z
+pebley P EH B L IY
+pecan P AH K AA N
+pecan(2) P IY K AA N
+pecan(3) P IH K AE N
+pecanins P EH K AH N IH N Z
+pecanins' P EH K AH N IH N Z
+pecans P IH K AE N Z
+pecans(2) P IY K AA N Z
+pecans(3) P AH K AA N Z
+pecci P EH CH IY
+pech P EH K
+pecha P EH CH AH
+pechacek P EH K AH S IH K
+pechin P EH CH IH N
+pechiney P EH CH IH N IY
+pechman P EH K M AH N
+pechora P AH K AO R AH
+pechora(2) P EH K ER AH
+pecht P EH K T
+pecina P EH CH IY N AH
+peck P EH K
+peck's P EH K S
+pecka P EH K AH
+peckenpaugh P IH K EH N P AO
+peckham P EH K AH M
+pecking P EH K IH NG
+peckinpaugh P IH K IH N P AO
+peckman P EH K M AH N
+peco P EY K OW
+peco's P EY K OW Z
+pecor P EH K ER
+pecora P EH K AO R AH
+pecoraro P EH K AO R AA R OW
+pecore P EH K AO R IY
+pecot P EH K AH T
+pectic P EH K T IH K
+pectin P EH K T AH N
+pectin(2) P EH K T IH N
+pectoral P EH K T ER AH L
+pectoris P EH K T AH R IH S
+peculiar P AH K Y UW L Y ER
+peculiar(2) P IH K Y UW L Y ER
+peculiarities P IH K Y UW L IY EH R AH T IY Z
+peculiarity P IH K Y UW L IY EH R AH T IY
+peculiarly P IH K Y UW L Y ER L IY
+pecuniary P EH K Y UW N IY EH R IY
+pedagogical P EH D AH G AA JH IH K AH L
+pedagogy P EH D AH G OW JH IY
+pedal P EH D AH L
+pedaled P EH D AH L D
+pedaling P EH D AH L IH NG
+pedaling(2) P EH D L IH NG
+pedalled P EH D AH L D
+pedals P EH D AH L Z
+pedantic P AH D AE N T IH K
+pedantry P EH D AH N T R IY
+peddicord P EH D IH K AO R D
+peddie P EH D IY
+peddle P EH D AH L
+peddled P EH D AH L D
+peddler P EH D L ER
+peddlers P EH D L ER Z
+peddles P EH D AH L Z
+peddling P EH D AH L IH NG
+peddling(2) P EH D L IH NG
+peddy P EH D IY
+peden P EH D AH N
+pedersen P EH D ER S AH N
+pederson P EH D ER S AH N
+pedestal P EH D AH S T AH L
+pedestals P EH D AH S T AH L Z
+pedestrian P AH D EH S T R IY AH N
+pedestrians P AH D EH S T R IY AH N Z
+pediatric P IY D IY AE T R IH K
+pediatrician P IY D IY AH T R IH SH AH N
+pediatricians P IY D IY AH T R IH SH AH N Z
+pediatrics P IY D IY AE T R IH K S
+pedicure P EH D IH K Y ER
+pedicure(2) P EH D IH K Y AO R
+pedicures P EH D IH K Y ER Z
+pedicures(2) P EH D IH K Y AO R Z
+pedigo P EH D IY G OW
+pedigree P EH D AH G R IY
+pedigrees P EH D AH G R IY Z
+pedley P EH D L IY
+pedone P EY D OW N EY
+pedophile P EH D OW F AY L
+pedophile(2) P EH D AH F IH L
+pedophiles P EH D OW F AY L Z
+pedophiles(2) P EH D AH F IH L Z
+pedophilia P EH D AH F IH L Y AH
+pedophiliac P EH D AH F IH L Y AE K
+pedophiliacs P EH D AH F IH L Y AE K S
+pedophilic P EH D OW F IH L IH K
+pedowitz P EH D OW IH T S
+pedowitz(2) P AH D AW IH T S
+pedraza P EY D R AA Z AH
+pedretti P EH D R EH T IY
+pedrick P EH D R IH K
+pedro P EY D R OW
+pedroli P EH D R OW L IY
+pedros P EY D R OW Z
+pedrosa P EY D R OW S AH
+pedroso P EY D R OW S OW
+pedrotti P EH D R OW T IY
+pedroza P EY D R OW Z AH
+pee P IY
+peebler P IY B L ER
+peebles P IY B AH L Z
+peed P IY D
+peedin P IY D IH N
+peek P IY K
+peeked P IY K T
+peeking P IY K IH NG
+peeks P IY K S
+peel P IY L
+peele P IY L
+peeled P IY L D
+peeler P IY L ER
+peelers P IY L ER Z
+peeling P IY L IH NG
+peels P IY L Z
+peens P IY N Z
+peep P IY P
+peeped P IY P T
+peeping P IY P IH NG
+peeples P IY P AH L Z
+peeps P IY P S
+peer P IH R
+peerage P IH R AH JH
+peered P IH R D
+peering P IY R IH NG
+peerless P IH R L IH S
+peers P IH R Z
+peerson P IH R S AH N
+peery P IY R IY
+peet P IY T
+peet's P IY T S
+peete P IY T
+peeters P IY T ER Z
+peets P IY T S
+peetz P IY T S
+peeve P IY V
+peeved P IY V D
+peeves P IY V Z
+peevey P IY V IY
+peevish P IY V IH SH
+peevy P IY V IY
+peewee P IY W IY
+peffer P EH F ER
+peffley P EH F L IY
+peg P EH G
+pegasus P EH G AH S AH S
+pegboard P EH G B AO R D
+pegboards P EH G B AO R D Z
+pegg P EH G
+pegged P EH G D
+peggie P EH G IY
+pegging P EH G IH NG
+peggs P EH G Z
+peggy P EH G IY
+peglow P EH G L OW
+pegmatite P EH G M AH T AY T
+pegram P EH G R AE M
+pegs P EH G Z
+peguero P EY G EH R OW
+pegues P EY G EH S
+pehl P EH L
+pehrson P EH R S AH N
+pei P EY
+pei's P EY Z
+peifer P AY F ER
+peiffer P AY F ER
+peil P IY L
+peinado P EY IY N AA D OW
+peine P IY N
+peipu P EY P UW
+peirce P IH R S
+peirce(2) P IY R S
+peirson P IY R S AH N
+peiser P AY S ER
+peitz P IY T S
+peixoto P AH K S OW T OW
+pejorative P AH JH AO R AH T IH V
+pekala P IH K AA L AH
+pekar P EH K ER
+pekarek P EH K ER IH K
+pekin P IY K AH N
+peking P IY K IH NG
+peko P IY K OW
+pekrul P EH K R AH L
+peladeau P EH L AH D OW
+pelaez P EY L AA EH Z
+pelagia P EH L AA JH AH
+pelagian P IH L EY JH IY AH N
+pelagians P IH L EY JH IY AH N Z
+pelagic P AH L AE JH IH K
+pelagreeny P EH L AH G R IY N IY
+pelayo P EY L EY OW
+pelc P EH L K
+pelchat P EH L CH AH T
+pelczar P EH L CH ER
+pele P EH L EY
+pelekunu P EH L AH K UW N UW
+pelekunu's P EH L AH K UW N UW Z
+peleponnesian P EH L AH P AH N IY ZH AH N
+pelerin P EH L ER IH N
+pelfrey P EH L F R IY
+pelham P EH L AH M
+pelican P EH L AH K AH N
+pelican's P EH L IH K AH N Z
+pelicans P EH L IH K AH N Z
+pelikan P EH L IH K AE N
+pelino P EH L IY N OW
+pelissier P EH L IH S IY ER
+pelka P EH L K AH
+pelkey P EH L K IY
+pelky P EH L K IY
+pell P EH L
+pell's P EH L Z
+pella P EH L AH
+pellagra P AH L AE G R AH
+pelland P EH L AH N D
+pelle P EH L
+pellecchia P EH L EH K IY AH
+pellegrin P EH L IH G R IH N
+pellegrini P EH L EH G R IY N IY
+pellegrino P EH L EH G R IY N OW
+peller P EH L ER
+pellerin P EH L ER IH N
+pellerito P EH L ER IY T OW
+pellet P EH L AH T
+pelleted P EH L AH T AH D
+pelleted(2) P EH L AH T IH D
+pelletier P EH L AH T IH R
+pellets P EH L AH T S
+pellett P EH L IH T
+pelleu P EH L UW
+pelley P EH L IY
+pellicane P EH L IH K EY N
+pellicano P EH L IY K AA N OW
+pellman P EH L M AH N
+pellow P EH L OW
+pellston P EH L S T AH N
+pellum P EH L AH M
+pelon P EH L AH N
+peloponnesian P EH L AH P AH N IY ZH AH N
+peloquin P EY L OW K W IY N
+pelosi P EH L OW S IY
+peloso P EH L OW S OW
+pelot P EH L AH T
+pelphrey P EH L F R IY
+pels P EH L Z
+pelster P EH L S T ER
+pelt P EH L T
+pelted P EH L T IH D
+peltier P EH L T IY ER
+pelting P EH L T IH NG
+pelto P EH L T OW
+pelton P EH L T AH N
+pelts P EH L T S
+peltz P EH L T S
+peltzer P EH L T Z ER
+peluso P EH L UW S OW
+pelvic P EH L V IH K
+pelvis P EH L V AH S
+pelz P EH L Z
+pelzel P EH L Z AH L
+pelzer P EH L Z ER
+pember P EH M B ER
+pemberton P EH M B ER T AH N
+pembina P EH M B IH N AH
+pemble P EH M B AH L
+pembleton P EH M B AH L T AA N
+pembridge P EH M B R IH JH
+pembroke P EH M B R OW K
+pembroke(2) P EH M B R UH K
+pemex P EH M EH K S
+pemrich P EH M R IH CH
+pen P EH N
+pen's P EH N Z
+pena P EH N AH
+pena's P EH N AH Z
+pena's(2) P EY N Y AH Z
+pena(2) P EY N Y AH
+penal P IY N AH L
+penalize P EH N AH L AY Z
+penalize(2) P IY N AH L AY Z
+penalized P IY N AH L AY Z D
+penalizes P EH N AH L AY Z IH Z
+penalizes(2) P IY N AH L AY Z IH Z
+penalizing P IY N AH L AY Z IH NG
+penaloza P EH N AA L OW Z AH
+penalties P EH N AH L T IY Z
+penalty P EH N AH L T IY
+penance P EH N AH N S
+penang P EH N AE NG
+penans P EH N AH N Z
+penberthy P IH N B ER TH IY
+pence P EH N S
+penchant P EH N CH AH N T
+pencil P EH N S AH L
+penciled P EH N S AH L D
+pencils P EH N S AH L Z
+pendant P EH N D AH N T
+pendarvis P EH N D AA R V IH S
+pendell P EH N D AH L
+pendelton P IH N D EH L T AH N
+pender P EH N D ER
+pendergast P EH N D ER G AE S T
+pendergraft P EH N D ER G R AH F T
+pendergraph P EH N D ER G R AE F
+pendergrass P EH N D ER G R AH S
+pendergrast P EH N D ER G R AH S T
+penders P EH N D ER Z
+pending P EH N D IH NG
+pendleton P EH N D AH L T AH N
+pendley P EH N D L IY
+pendola P EH N D OW L AH
+pendril P EH N D R IH L
+pendril's P EH N D R IH L Z
+pendry P EH N D R IY
+pendulous P EH N JH AH L AH S
+pendulum P EH N JH AH L AH M
+pendyala P EH D Y AA L AH
+penelas P EH N AH L AA S
+penelope P AH N EH L AH P IY
+penetrate P EH N AH T R EY T
+penetrated P EH N AH T R EY T AH D
+penetrated(2) P EH N AH T R EY T IH D
+penetrates P EH N AH T R EY T S
+penetrating P EH N AH T R EY T IH NG
+penetration P EH N AH T R EY SH AH N
+penetrator P EH N AH T R EY T ER
+penetrators P EH N AH T R EY T ER Z
+penfield P EH N F IY L D
+penfil P EH N F IH L
+penfold P EH N F OW L D
+peng P EH NG
+pengassan P EH NG G AE S AH N
+pengelly P EH NG G AH L IY
+pengo P EH NG G OW
+penguin P EH NG G W AH N
+penguins P EH NG G W AH N Z
+penh P EH N
+penh's P EH N Z
+penicillin P EH N AH S IH L AH N
+penicillins P EH N AH S IH L AH N Z
+penick P EH N IH K
+penikese P EH N IH K IY Z
+penile P IY N AY L
+peninger P EH N IH NG ER
+peninsula P AH N IH N S AH L AH
+peninsular P AH N IH N S AH L ER
+penis P IY N IH S
+penises P IY N IH S IH Z
+peniston P EH N IH S T AA N
+penitent P EH N IH T IH N T
+penitentiaries P EH N IH T EH N CH ER IY Z
+penitentiary P EH N IH T EH N CH ER IY
+penix P EH N IH K S
+penja P EH N JH AH
+penja's P EH N JH AH Z
+penkala P IH NG K AA L AH
+penkava P EH NG K AA V AH
+penland P EH N L AH N D
+penley P EH N L IY
+penman P EH N M AH N
+penn P EH N
+penn's P EH N Z
+penn-hills P EH N HH IH L Z
+penna P EH N AH
+penna(2) P EH N S IH L V EY N Y AH
+pennacchio P EH N AA K IY OW
+pennant P EH N AH N T
+pennants P EH N AH N T S
+pennbancorp P EH N B AE N K AO R P
+penncorp P EH N K AO R P
+penne-pasta P EH N EY P AA S T AH
+pennebaker P EH N IH B AH K ER
+pennebaker(2) P EH N IH B EY K ER
+penned P EH N D
+pennel P EH N AH L
+pennell P EH N AH L
+pennella P EH N EH L AH
+penner P EH N ER
+pennex P EH N AH K S
+penney P EH N IY
+penney's P EH N IY Z
+pennick P EH N IH K
+pennie P EH N IY
+pennies P EH N IY Z
+penniless P EH N IY L AH S
+penniman P EH N IH M AH N
+penning P EH N IH NG
+penninger P EH N IH NG ER
+pennings P EH N IH NG Z
+pennington P EH N IH NG T AH N
+pennino P EH N IY N OW
+pennisi P EH N IY S IY
+pennix P EH N IH K S
+pennock P EH N AH K
+penns P EH N Z
+pennsauken P EH N S AO K AH N
+pennsylvania P EH N S AH L V EY N Y AH
+pennsylvania's P EH N S AH L V EY N Y AH Z
+pennsylvanian P EH N S IH L V EY N IY AH N
+pennsylvanians P EH N S IH L V EY N IY AH N Z
+pennwalt P EH N W AO L T
+penny P EH N IY
+penny's P EH N IY Z
+pennypacker P EH N IH P AE K ER
+pennypacker(2) P EH N IY P AE K ER
+pennywell P EH N IY W EH L
+pennzoil P EH N Z OY L
+pennzoil's P EH N Z OY L Z
+penobscot P AH N AA B S K AA T
+penology P IY N AA L AH JH IY
+penoyer P EH N OY ER
+penril P EH N R IH L
+penrod P EH N R AA D
+penrod's P EH N R AA D Z
+penrose P EH N R OW Z
+penry P EH N R IY
+pens P EH N Z
+pens' P EH N Z
+pensacola P EH N S AH K OW L AH
+pense P EH N S
+pensinger P EH N S IH N JH ER
+pension P EH N SH AH N
+pensioner P EH N SH AH N ER
+pensioners P EH N SH AH N ER Z
+pensions P EH N SH AH N Z
+pensive P EH N S IH V
+penske P EH N S K IY
+penson P EH N S AH N
+pensyl P EH N S IH L
+pent P EH N T
+penta P EH N T AH
+pentagon P EH N T IH G AA N
+pentagon's P EH N T IH G AA N Z
+pentagon's(2) P EH N IH G AA N Z
+pentagon(2) P EH N IH G AA N
+pentagons P EH N T IH G AA N Z
+pentagons(2) P EH N IH G AA N Z
+pentair P EH N T EH R
+pentamidine P EH N T AE M IH D IY N
+pentane P EH N T EY N
+pentathlon P EH N T AE TH L AH N
+pentax P EH N T AE K S
+pentech P EH N T EH K
+pentecost P EH N T AH K AO S T
+pentecostal P EH N T AH K AO S T AH L
+penthea P EH N TH IY AH
+penthouse P EH N T HH AW S
+penthouses P EH N T HH AW S IH Z
+pentimento P EH N T IH M EH N T OW
+pentium P EH N T IY AH M
+pentiums P EH N T IY AH M Z
+pentland P EH N T L AH N D
+penton P EH N T AH N
+pentothal P EH N T AH TH AA L
+pentron P EH N T R AH N
+pentrust P EH N T R AH S T
+pentz P EH N T S
+penuel P EH N UH L
+penultimate P EH N AH L T AH M AH T
+penumbra P IH N AH M B R AH
+penurious P EH N Y UW R IY AH S
+penury P EH N Y UH R IY
+penwell P EH N W EH L
+penwest P EH N W EH S T
+penza P EH N Z AH
+penzer P EH N Z ER
+peon P IY AH N
+peonies P IY AH N IY Z
+peons P IY AH N Z
+peony P IY AH N IY
+people P IY P AH L
+people's P IY P AH L Z
+peopled P IY P AH L D
+peoples P IY P AH L Z
+peoples' P IY P AH L Z
+peoria P IY AO R IY AH
+peoria's P IY AO R IY AH Z
+pep P EH P
+pepcid P EH P S IH D
+pepe P EH P IY
+pepenadores P EH P EH N AH D AO R EH Z
+peper P EH P ER
+pepi P EH P IY
+pepin P EH P IH N
+pepita P EH P IY T AH
+pepitone P EH P IH T OW N
+peplinski P IH P L IH N S K IY
+peplow P EH P L OW
+peppard P EH P ER D
+peppel P EH P AH L
+pepper P EH P ER
+pepper's P EH P ER Z
+pepperdine P EH P ER D AY N
+peppered P EH P ER D
+pepperell P EH P ER AH L
+pepperidge P EH P ER IH JH
+pepperidge(2) P EH P R IH JH
+peppering P EH P ER IH NG
+pepperman P EH P ER M AH N
+peppermint P EH P ER M IH N T
+pepperoni P EH P ER OW N IY
+peppers P EH P ER Z
+peppi P EH P IY
+peppin P EH P IH N
+pepple P EH P AH L
+peppler P EH P L ER
+peppy P EH P IY
+pepsi P EH P S IY
+pepsi's P EH P S IY Z
+pepsico P EH P S IH K OW
+pepsico's P EH P S IH K OW Z
+peptic P EH P T IH K
+peptide P EH P T AY D
+peptides P EH P T AY D Z
+pequeno P EY K W EY N OW
+pequignot P IH K W IH G N AH T
+per P ER
+per-se P ER S EY
+pera P ER AH
+peragine P ER AA JH IY N IY
+peraino P ER AA IY N OW
+perala P ER AA L AH
+perales P ER AA L EH S
+peralez P ER AA L EH Z
+peralta P ER AA L T AH
+peras P EH R AH S
+peratis P ER AA T IH S
+peratis' P ER AA T IH S
+peratis'(2) P ER AE T IH S
+peratis(2) P ER AE T IH S
+peraza P ER AA Z AH
+perazzo P ER AA Z OW
+perc P ER K
+perce P ER S
+perceive P ER S IY V
+perceived P ER S IY V D
+perceives P ER S IY V Z
+perceiving P ER S IY V IH NG
+percell P ER S EH L
+percent P ER S EH N T
+percentage P ER S EH N T AH JH
+percentage(2) P ER S EH N AH JH
+percentage(3) P ER S EH N T IH JH
+percentage(4) P ER S EH N IH JH
+percentages P ER S EH N T IH JH IH Z
+percentages(2) P ER S EH N IH JH IH Z
+percentile P ER S EH N T AY L
+percentiles P ER S EH N T AY L Z
+percents P ER S EH N T S
+percept P ER S EH P T
+perceptible P ER S EH P T AH B AH L
+perception P ER S EH P SH AH N
+perceptions P ER S EH P SH AH N Z
+perceptive P ER S EH P T IH V
+perceptual P ER S EH P CH AH W AH L
+perceval P ER S EY V AE L
+perch P ER CH
+perchance P ER CH AE N S
+perched P ER CH T
+perches P ER CH IH Z
+perchlorate P ER K L AO R EY T
+perchloric P ER K L AO R IH K
+percifield P ER S IH F IY L D
+percipient P ER S IH P IY AH N T
+percipient(2) P ER S IH P Y AH N T
+percival P ER S IH V AH L
+percle P ER K AH L
+percolate P ER K AH L EY T
+percolated P ER K AH L EY T AH D
+percolating P ER K AH L EY T IH NG
+percolator P ER K AH L EY T ER
+percolators P ER K AH L EY T ER Z
+percs P ER K S
+percussion P ER K AH SH AH N
+percussionist P ER K AH SH AH N IH S T
+percussive P ER K AH S AH V
+percutaneous P ER K Y UW T EY N IY AH S
+percy P ER S IY
+percy's P ER S IY Z
+perdew P ER D UW
+perdita P ER D IY T AH
+perdomo P ER D OW M OW
+perdue P ER D UW
+pere P ER
+perea P ER IY AH
+pereda P ER EY D AH
+peregoy P ER IH G OY
+peregrine P EH R AH G R IY N
+peregrines P EH R AH G R IY N Z
+pereira P ER EH R AH
+perella P ER EH L AH
+perelman P EH R AH L M AH N
+perelman's P EH R AH L M AH N Z
+peremptory P ER EH M P T ER IY
+perennial P ER EH N IY AH L
+perennially P ER EH N IY AH L IY
+perennials P ER EH N IY AH L Z
+perera P ER EH R AH
+peres P EH R EH Z
+peres' P EH R EH Z
+peres's P EH R EH Z IH Z
+perestroika P EH R AH S T R OY K AH
+peretti P ER EH T IY
+peretz P ER IH T S
+pereyra P ER EH R AH
+perez P EH R EH Z
+perfect P ER F EH K T
+perfect(2) P ER F IH K T
+perfecta P ER F EH K T AH
+perfected P ER F EH K T AH D
+perfecting P ER F EH K T IH NG
+perfection P ER F EH K SH AH N
+perfectionism P ER F EH K SH AH N IH Z AH M
+perfectionist P ER F EH K SH AH N AH S T
+perfectionist(2) P ER F EH K SH AH N IH S T
+perfectionists P ER F EH K SH AH N AH S T S
+perfectly P ER F AH K T L IY
+perfectly(2) P ER F AH K L IY
+perfetti P ER F EH T IY
+perfetto P ER F EH T OW
+perfidy P ER F IH D IY
+perforate P ER F ER EY T
+perforated P ER F ER EY T AH D
+perforated(2) P ER F ER EY T IH D
+perforates P ER F ER EY T S
+perforating P ER F ER EY T IH NG
+perforation P ER F ER EY SH AH N
+perforations P ER F ER EY SH AH N Z
+perforce P ER F AO R S
+perform P ER F AO R M
+performa P ER F AO R M AH
+performance P ER F AO R M AH N S
+performances P ER F AO R M AH N S AH Z
+performances(2) P ER F AO R M AH N S IH Z
+performative P ER F AO R M AH T IH V
+performatives P ER F AO R M AH T IH V Z
+performed P ER F AO R M D
+performer P ER F AO R M ER
+performers P ER F AO R M ER Z
+performers' P ER F AO R M ER Z
+performing P ER F AO R M IH NG
+performs P ER F AO R M Z
+perfume P ER F Y UW M
+perfumed P ER F Y UW M D
+perfumes P ER F Y UW M Z
+perfuming P ER F Y UW M IH NG
+perfunctory P ER F AH NG K T ER IY
+pergamon P ER G AH M AH N
+pergande P ER G IH N D
+pergola P ER G AH L AH
+pergola(2) P ER G OW L AH
+pergolas P ER G AH L AH Z
+perham P ER HH AH M
+perhaps P ER HH AE P S
+peria P EH R IY AH
+peria's P EH R IY AH Z
+perich P ER IH K
+peridot P EH R IH D AO T
+peridot(2) P EH R IH D OW
+perignon P ER IH N Y AA N
+perignon(2) P EH R IH G N AA N
+perigo P ER IY G OW
+peril P EH R AH L
+perillo P ER IH L OW
+perilous P EH R AH L AH S
+perilously P EH R AH L AH S L IY
+perils P EH R AH L Z
+periman P ER IY M AH N
+perimeter P ER IH M AH T ER
+perimeters P ER IH M AH T ER Z
+perin P ER IH N
+perine P ER IY N IY
+perini P ER IY N IY
+perino P ER IY N OW
+period P IH R IY AH D
+period's P IH R IY AH D Z
+periodic P IH R IY AA D IH K
+periodical P IH R IY AA D IH K AH L
+periodically P IY R IY AA D IH K AH L IY
+periodically(2) P IY R IY AA D IH K L IY
+periodicals P IH R IY AA D IH K AH L Z
+periodontal P EH R IY AH D AA N T AH L
+periodontal(2) P EH R IY AH D AA N AH L
+periods P IH R IY AH D Z
+peripatetic P EH R AH P AH T EH T IH K
+peripheral P ER IH F ER AH L
+peripheral(2) P ER IH F R AH L
+peripherally P ER IH F ER AH L IY
+peripherally(2) P ER IH F R AH L IY
+peripherals P ER IH F ER AH L Z
+peripherals(2) P ER IH F R AH L Z
+periphery P ER IH F ER IY
+periscope P EH R AH S K OW P
+periscopes P EH R AH S K OW P S
+perish P EH R IH SH
+perishable P EH R IH SH AH B AH L
+perishables P EH R IH SH AH B AH L Z
+perished P EH R IH SH T
+perishing P EH R IH SH IH NG
+peristyle P EH R AH S T AY L
+perito P EH R IY T OW
+perjure P ER JH ER
+perjured P ER JH ER D
+perjurer P ER JH ER ER
+perjures P ER JH ER Z
+perjuring P ER JH ER IH NG
+perjury P ER JH ER IY
+perk P ER K
+perked P ER K T
+perkey P ER K IY
+perkin P ER K IH N
+perking P ER K IH NG
+perkins P ER K AH N Z
+perkins' P ER K IH N Z
+perkins's P ER K IH N Z IH Z
+perkins(2) P ER K IH N Z
+perkinson P ER K IH N S AH N
+perko P ER K OW
+perkovic P ER K AH V IH CH
+perkovich P ER K AH V IH CH
+perkowski P ER K AO F S K IY
+perks P ER K S
+perky P ER K IY
+perl P ER L
+perla P ER L AH
+perlberg P ER L B ER G
+perle P ER L
+perley P ER L IY
+perlin P ER L IH N
+perlis P ER L IH S
+perlite P ER L AY T
+perlman P ER L M AH N
+perlmutter P ER L M AH T ER
+perlow P ER L OW
+perls P ER L Z
+perlstein P ER L S T AY N
+perlstein(2) P ER L S T IY N
+perma P ER M AH
+perman P ER M AH N
+permanence P ER M AH N AH N S
+permanent P ER M AH N AH N T
+permanente P ER M AH N EH N T EY
+permanently P ER M AH N AH N T L IY
+permeability P ER M IY AH B IH L IH T IY
+permeable P ER M IY AH B AH L
+permeate P ER M IY EY T
+permeated P ER M IY EY T IH D
+permeates P ER M IY EY T S
+permeating P ER M IY EY T IH NG
+permenante P ER M AH N EH N T EY
+permenter P ER M AH N T ER
+permiam P ER M AY AH M
+permiam(2) P ER M IY AH M
+permian P ER M IY AH N
+permissible P ER M IH S AH B AH L
+permission P ER M IH SH AH N
+permissions P ER M IH SH AH N Z
+permissive P ER M IH S IH V
+permissiveness P ER M IH S IH V N AH S
+permit P ER M IH T
+permits P ER M IH T S
+permitted P ER M IH T AH D
+permitted(2) P ER M IH T IH D
+permitting P ER M IH T IH NG
+permount P ER M AW N T
+permut P ER M AH T
+permutate P ER M Y UW T EY T
+permutated P ER M Y UW T EY T AH D
+permutates P ER M Y UW T EY T S
+permutating P ER M Y UW T EY T IH NG
+permutation P ER M Y UW T EY SH AH N
+permutations P ER M Y UW T EY SH AH N Z
+permute P ER M Y UW T
+perna P ER N AH
+pernell P ER N AH L
+pernella P ER N EH L AH
+pernice P ER N IH S
+perniciaro P ER N IY CH ER OW
+pernicious P ER N IH SH AH S
+perno P ER N OW
+pernod P EH R N OW
+pernod's P ER N AA D Z
+pernod(2) P ER N AA D
+pero P ER OW
+peron P ER AO N
+perona P ER OW N AH
+perone P ER OW N
+peroni P ER OW N IY
+peronism P EH R AH N IH Z AH M
+peronist P EH R AH N IH S T
+peronists P EH R AH N IH S T S
+peronists(2) P EH R AH N IH S S
+peronists(3) P EH R AH N IH S
+perot P ER OW
+perot's P ER OW Z
+perots P ER OW Z
+perotti P ER OW T IY
+peroutka P ER UW T K AH
+perovich P ER AH V IH CH
+peroxide P ER AA K S AY D
+perpendicular P ER P AH N D IH K Y AH L ER
+perpetrate P ER P AH T R EY T
+perpetrated P ER P AH T R EY T IH D
+perpetrates P ER P AH T R EY T S
+perpetrating P ER P AH T R EY T IH NG
+perpetrator P ER P AH T R EY T ER
+perpetrator's P ER P AH T R EY T ER Z
+perpetrators P ER P AH T R EY T ER Z
+perpetua P ER P EH CH UW AH
+perpetual P ER P EH CH UW AH L
+perpetually P ER P EH CH UW AH L IY
+perpetuals P ER P EH CH UW AH L Z
+perpetuate P ER P EH CH AH W EY T
+perpetuated P ER P EH CH AH W EY T IH D
+perpetuates P ER P EH CH AH W EY T S
+perpetuating P ER P EH CH AH W EY T IH NG
+perpetuation P ER P EH CH AH W EY SH AH N
+perpetuity P ER P IH T Y UW IH T IY
+perpich P ER P IH K
+perplex P ER P L EH K S
+perplexed P ER P L EH K S T
+perplexes P ER P L EH K S IH Z
+perplexing P ER P L EH K S IH NG
+perplexity P ER P L EH K S AH T IY
+perquisite P ER K W AH Z IH T
+perquisites P ER K W AH Z IH T S
+perquisites(2) P ER K W IH Z IH T S
+perra P ER R AH
+perras P ER R AH Z
+perrault P EH R AO L T
+perrault(2) P ER AO L T
+perreault P ER R OW
+perreira P ER R EH R AH
+perrell P ER R EY L
+perrella P ER R EH L AH
+perrelli P ER R EH L IY
+perren P ER R AH N
+perret P ER R IH T
+perrett P ER R IH T
+perretta P ER R EH T AH
+perretti P ER R EH T IY
+perri P ER R IY
+perricone P ER R IY K OW N IY
+perriello P ER R IY EH L OW
+perrier P EH R IY ER
+perrier(2) P EH R IY EY
+perrigo P ER R IY G OW
+perrin P EH R IH N
+perrine P ER R IY N IY
+perrino P ER R IY N OW
+perrins P EH R IH N Z
+perritt P ER R IH T
+perro P ER R OW
+perrodin P ER R AH D IH N
+perron P EH R AH N
+perrone P ER R OW N IY
+perrot P ER R AH T
+perrott P ER R AA T
+perrotta P ER R OW T AH
+perrotti P ER R OW T IY
+perrotto P ER R OW T OW
+perrow P ER R OW
+perry P EH R IY
+perry's P EH R IY Z
+perryman P ER R IY M AH N
+perryn P ER R IH N
+pers P ER S
+persall P ER S AH L
+persaud P ER S AO D
+perschbacher P ER SH B AA K ER
+perse P ER S
+persecute P ER S AH K Y UW T
+persecuted P ER S AH K Y UW T AH D
+persecutes P ER S AH K Y UW T S
+persecuting P ER S IH K Y UW T IH NG
+persecution P ER S AH K Y UW SH AH N
+persecutions P ER S AH K Y UW SH AH N S
+persecutor P ER S AH K Y UW T ER
+persecutors P ER S AH K Y UW T ER Z
+persepolis P ER S EH P AH L AH S
+perses P ER S IH Z
+perset P ER S EH T
+perseus P ER S IY AH S
+perseverance P ER S AH V IH R AH N S
+persevere P ER S AH V IH R
+persevered P ER S AH V IH R D
+perseveres P ER S AH V IH R Z
+persevering P ER S AH V IH R IH NG
+pershall P ER SH AH L
+pershare P ER SH EH R
+pershing P ER SH IH NG
+pershing's P ER SH IH NG Z
+pershings P ER SH IH NG Z
+persia P ER ZH AH
+persian P ER ZH AH N
+persians P ER ZH AH N Z
+persico P ER S IY K OW
+persing P ER S IH NG
+persinger P ER S IH N JH ER
+persis P ER S IH S
+persist P ER S IH S T
+persisted P ER S IH S T AH D
+persisted(2) P ER S IH S T IH D
+persistence P ER S IH S T AH N S
+persistent P ER S IH S T AH N T
+persistently P ER S IH S T AH N T L IY
+persisting P ER S IH S T IH NG
+persists P ER S IH S T S
+persists(2) P ER S IH S S
+persists(3) P ER S IH S
+persky P ER S K IY
+persley P ER S L IY
+person P ER S AH N
+person's P ER S AH N Z
+persona P ER S OW N AH
+personable P ER S AH N AH B AH L
+personably P ER S AH N AH B L IY
+personae P ER S OW N EY
+personal P ER S IH N IH L
+personalink P ER S AH N AH L IH NG K
+personalities P ER S AH N AE L IH T IY Z
+personality P ER S AH N AE L IH T IY
+personalization P ER S AH N AH L AH Z EY SH AH N
+personalize P ER S AH N AH L AY Z
+personalized P ER S AH N AH L AY Z D
+personalizes P ER S AH N AH L AY Z IH Z
+personalizing P ER S AH N AH L AY Z IH NG
+personally P ER S AH N AH L IY
+personally(2) P ER S AH N L IY
+personally(3) P ER S N AH L IY
+personals P ER S IH N IH L Z
+personic P ER S AA N IH K
+personics P ER S AA N IH K S
+personification P ER S AA N AH F AH K EY SH AH N
+personified P ER S AA N AH F AY D
+personifies P ER S AA N AH F AY Z
+personify P ER S AA N AH F AY
+personifying P ER S AA N AH F AY IH NG
+personnel P ER S AH N EH L
+persons P ER S AH N Z
+perspective P ER S P EH K T IH V
+perspectives P ER S P EH K T IH V Z
+perspicacious P ER S P AH K EY SH AH S
+perspiration P ER S P ER EY SH AH N
+perspire P ER S P AY R
+perspiring P ER S P AY R IH NG
+persson P ER S AH N
+persuadable P ER S W EY D AH B AH L
+persuade P ER S W EY D
+persuaded P ER S W EY D AH D
+persuaded(2) P ER S W EY D IH D
+persuades P ER S W EY D Z
+persuading P ER S W EY D IH NG
+persuasion P ER S W EY ZH AH N
+persuasions P ER S W EY ZH AH N Z
+persuasive P ER S W EY S IH V
+persuasively P ER S W EY S IH V L IY
+persuasiveness P ER S W EY S IH V N AH S
+persyn P ER S IH N
+pert P ER T
+pertain P ER T EY N
+pertained P ER T EY N D
+pertaining P ER T EY N IH NG
+pertains P ER T EY N Z
+pertamina P ER T AH M IY N AH
+perth P ER TH
+pertinent P ER T IH N IH N T
+pertinently P ER T IH N IH N T L IY
+pertschuk P ER T CH AH K
+pertuit P ER T IH T
+pertuit(2) P ER T UW AH T
+perturb P ER T ER B
+perturbation P ER T ER B EY SH AH N
+perturbations P ER T ER B EY SH AH N Z
+perturbed P ER T ER B D
+perturbing P ER T ER B IH NG
+perturbs P ER T ER B Z
+pertussis P ER T AH S IH S
+peru P ER UW
+peru's P ER UW Z
+perugia P ER UW G IY AH
+perugina P EH R UW JH IY N AH
+perugini P ER UW JH IY N IY
+perulac P EH R UW L AE K
+perusal P ER UW Z AH L
+peruse P ER UW Z
+perused P ER UW Z D
+peruses P ER UW Z IH Z
+perusing P ER UW Z IH NG
+perusse P ER UW S IY
+peruvian P ER UW V IY AH N
+peruvians P ER UW V IY AH N Z
+peruzzi P ER UW T S IY
+pervade P ER V EY D
+pervaded P ER V EY D IH D
+pervades P ER V EY D Z
+pervading P ER V EY D IH NG
+pervasive P ER V EY S IH V
+pervasiveness P ER V EY S IH V N IH S
+perverse P ER V ER S
+perversely P ER V ER S L IY
+perversion P ER V ER ZH AH N
+perversity P ER V ER S AH T IY
+pervert P ER V ER T
+perverted P ER V ER T IH D
+perverting P ER V ER T IH NG
+perverts P ER V ER T S
+pervomaiskaya P ER V OW M EY S K AY AH
+perz P ER Z
+perzigian P ER Z IH G IY AH N
+pesatori P EH S AH T AO R IY
+pesavento P EH S AH V EH N T OW
+pescatore P EH S K AA T AO R IY
+pesce P EH S
+pesch P EH SH
+peschel P EH SH AH L
+peschke P EH SH K
+pesci P EH S K IY
+pesek P EH S EH K
+peseta P AH S EY T AH
+pesetas P AH S EY T AH Z
+pesh P EH SH
+peshawar P EH SH AH W AO R
+peshek P EH SH EH K
+pesina P EH S IY N AH
+peskin P EH S K IH N
+pesky P EH S K IY
+pesnell P IH S N EH L
+peso P EY S OW
+peso's P EY S OW Z
+pesola P EH S OW L AH
+pesos P EY S OW Z
+pessimism P EH S AH M IH Z AH M
+pessimist P EH S AH M AH S T
+pessimistic P EH S AH M IH S T IH K
+pessimists P EH S AH M IH S T S
+pessimists(2) P EH S AH M IH S S
+pessimists(3) P EH S AH M IH S
+pessin P EH S IH N
+pest P EH S T
+pesta P EH S T AH
+pestana P EH S T AE N AH
+pester P EH S T ER
+pestered P EH S T ER D
+pestering P EH S T ER IH NG
+pesters P EH S T ER Z
+pesticide P EH S T AH S AY D
+pesticides P EH S T AH S AY D Z
+pestilence P EH S T AH L AH N S
+pestillo P EH S T IH L OW
+pestillo(2) P EH S T IY OW
+pestka P EH S T K AH
+pests P EH S T S
+pet P EH T
+pet's P EH T S
+peta P IY T AH
+peta's P IY T AH Z
+petain P AH T EY N
+petain(2) P EY T AE N
+petak P EH T AH K
+petal P EH T AH L
+petals P EH T AH L Z
+petaluma P EH T AH L UW M AH
+petard P EH T ER D
+petard(2) P AH T AA D
+pete P IY T
+pete's P IY T S
+peter P IY T ER
+peter's P IY T ER Z
+peterbilt P IY T ER B IH L T
+peterborough P IY T ER B ER OW
+petered P IY T ER D
+petering P IY T ER IH NG
+peterka P IH T ER K AH
+peterkin P IH T ER K IH N
+peterman P IY T ER M AH N
+petermann P IY T ER M AH N
+peterpaul P IY T ER P AO L
+peters P IY T ER Z
+petersburg P IY T ER Z B ER G
+petersen P IY T ER S AH N
+petersen's P IY T ER S AH N Z
+peterson P IY T ER S AH N
+peterson's P IY T ER S AH N Z
+petery P IY T ER IY
+petey P IY T IY
+peth P EH TH
+pethel P EH TH AH L
+pethtel P EH TH AH L
+petie P EH T IY
+petillo P EH T IH L OW
+petino P EH T IY N OW
+petipa P EH T IY P AH
+petipa's P EH T IY P AH Z
+petit P EH T IY
+petite P AH T IY T
+petites P EH T IY T S
+petition P AH T IH SH AH N
+petitioned P AH T IH SH AH N D
+petitioner P AH T IH SH AH N ER
+petitioners P AH T IH SH AH N ER Z
+petitioning P AH T IH SH AH N IH NG
+petitions P AH T IH SH AH N Z
+petitjean P IH T IH T JH AH N
+petito P EH T IY T OW
+petitt P EH T IH T
+petitti P EH T IY T IY
+petitto P EH T IY T OW
+petko P EH T K OW
+petkovsek P EH T K AA V S EH K
+petkus P EH T K IH S
+peto P IY T OW
+petr P EH T ER
+petra P EH T R AH
+petracca P EH T R AA K AH
+petraglia P EH T R AA G L IY AH
+petraitis P EH T R AY T IH S
+petrak P EH T R AH K
+petrakis P EH T R AH K IH S
+petralia P EH T R AA L IY AH
+petrarca P EH T R AA R K AH
+petras P EH T R AH Z
+petrasek P IH T R AA S EH K
+petrash P EH T R AH SH
+petrauskas P EH T R AW S K AH Z
+petre P EH T ER
+petrea P EH T R IY AH
+petree P EH T R IY
+petrella P EH T R EH L AH
+petrelli P EH T R EH L IY
+petrels P EH T R AH L Z
+petrey P EH T R IY
+petri P EH T R IY
+petri(2) P IY T R IY
+petrich P EH T R IH K
+petricioli P EH T R IH S IY OW L IY
+petrick P EH T R IH K
+petrides P EH T R AY D Z
+petrie P EH T R IY
+petrie's P EH T R IY Z
+petrified P EH T R AH F AY D
+petrify P EH T R AH F AY
+petrik P EH T R IH K
+petrilla P EH T R IH L AH
+petrilli P EH T R IY L IY
+petrillo P EH T R IH L OW
+petrin P EH T R IH N
+petrina P EH T R IY N AH
+petrini P EH T R IY N IY
+petrino P EH T R IY N OW
+petrizzo P EH T R IY Z OW
+petro P EH T R OW
+petrobras P EH T R AA B R AH S
+petrocelli P EH T R OW CH EH L IY
+petrochemical P EH T R OW K EH M IH K AH L
+petrochemicals P EH T R OW K EH M IH K AH L Z
+petrocorp P EH T R OW K AO R P
+petrodollar P EH T R OW D AA L ER
+petrodollars P EH T R OW D AA L ER Z
+petroff P EH T R AO F
+petrofina P EH T R AH F IY N AH
+petrofina(2) P EH T R OW F IY N AH
+petroglyph P EH T R OW G L IH F
+petroglyphs P EH T R OW G L IH F S
+petrol P EH T R OW L
+petrolane P EH T R OW L EY N
+petrolear P EH T R OW L IH R
+petroleos P AH T R OW L IY OW S
+petroles P EH T R OW L Z
+petroleum P AH T R OW L IY AH M
+petroleum's P AH T R OW L IY AH M Z
+petrolia P AH T R OW L IY AH
+petrology P AH T R AA L AH JH IY
+petromin P EH T R AH M IH N
+petromineral P EH T R OW M IH N ER AH L
+petrominerals P EH T R OW M IH N ER AH L Z
+petronas P EH T R OW N AH S
+petrone P EH T R OW N IY
+petronella P EH T R OW N EH L AH
+petroni P EH T R OW N IY
+petronia P EH T R OW N IY AH
+petronilla P EH T R AH N IH L AH
+petronio P EH T R OW N IY OW
+petropoulos P IH T R AA P AH L IH S
+petros P EH T R OW Z
+petrosa P EH T R OW Z AH
+petrosino P EH T R OW S IY N OW
+petroski P IH T R AW S K IY
+petroski(2) P IH T R AA S K IY
+petrosky P IH T R OW S K IY
+petrossian P AH T R AO Z AH N
+petrossian(2) P AH T R OW S Y AH N
+petrosynthese P AH T R OW S IH N TH IY S
+petrovic P IH T R AA V IH K
+petrovich P EH T R AH V IH CH
+petrovietnam P EH T R OW V IY EH T N AA M
+petrow P EH T R OW
+petrowski P IH T R AO F S K IY
+petrowsky P IH T R AW S K IY
+petru P EH T R UW
+petruccelli P EH T R UW CH EH L IY
+petrucci P EH T R UW CH IY
+petrucelli P EH T R UW CH EH L IY
+petrus P EH T R AH S
+petruska P IH T R AH S K AH
+petruzzelli P EH T R UW T S EH L IY
+petruzzi P EH T R UW T S IY
+petry P EH T R IY
+pets P EH T S
+petsch P EH CH
+petsche P EH CH
+petsmart P EH T S M AA R T
+petstuff P EH T S T AH F
+pett P EH T
+petta P EH T AH
+pettaway P EH T AH W EY
+petted P EH T AH D
+petted(2) P EH T IH D
+pettee P EH T IY
+pettengill P EH T IH NG G AH L
+petter P EH T ER
+pettersen P EH T ER S AH N
+petterson P EH T ER S AH N
+pettersson P IY T ER S AH N
+pettersson(2) P EH T ER S AH N
+pettet P EH T IH T
+petteway P EH T W EY
+pettey P EH T IY
+petteys P EH T IY Z
+petti P EH T IY
+petticoat P EH T IY K OW T
+petticoats P EH T IY K OW T S
+pettie P EH T IY
+petties P EH T IY Z
+pettigrew P EH T IH G R UW
+pettijohn P EH T IH JH AA N
+pettinato P EH T IY N AA T OW
+pettine P EH T IY N IY
+pettiness P EH T IY N AH S
+petting P EH T IH NG
+pettinger P EH T IH NG ER
+pettingill P IH T IH NG G AH L
+pettis P EH T IH S
+pettit P EH T IH T
+pettitt P EH T IH T
+pettry P EH T R IY
+pettus P EH T AH S
+pettway P EH T W EY
+petty P EH T IY
+petulance P EH CH AH L AH N S
+petulant P EH CH AH L AH N T
+petunia P AH T UW N IY AH
+petunia(2) P AH T UW N Y AH
+petunias P AH T UW N IY AH Z
+petunias(2) P AH T UW N Y AH Z
+petway P EH T W EY
+petz P EH T S
+petzel P EH T Z AH L
+petzinger P EH T S IH NG ER
+petzold P EH T Z OW L D
+petzoldt P EH T Z OW L T
+peugeot P Y UW ZH OW
+peugh P Y UW
+pevehouse P IY V HH AW S
+peveler P EH V AH L ER
+peverell P EH V ER EH L
+peveto P EH V EH T OW
+pevey P IH V EY
+pew P Y UW
+pewabic P Y UW AA B IH K
+pewex P EH W EH K S
+pewitt P Y UW IH T
+pews P Y UW Z
+pewter P Y UW T ER
+peyman P EY M AH N
+peyot P EY AO T
+peyrelevade P EH R EH L AH V EY D
+peyser P EY Z ER
+peyton P EY T AH N
+pez P EH Z
+pezeshkan P AH Z EH SH K AH N
+pezim P EH Z IY M
+pezim's P EH Z IY M Z
+pezza P EH Z AH
+pezzella P EH T S EH L AH
+pezzullo P EH T S UW L OW
+pfaff F AE F
+pfahl F AA L
+pfahler F AA L ER
+pfalzgraf F AE L Z G R AE F
+pfannenstiel F AE N AH N S T IY L
+pfarr F AA R
+pfau F AW
+pfeffer F EH F ER
+pfefferkorn F EH F ER K AO R N
+pfefferle F EH F ER AH L
+pfeifer F AY F ER
+pfeiff F AY F
+pfeiffer F AY F ER
+pfeifle F AY F AH L
+pfeil F AY L
+pfennig F EH N IH G
+pfennigs F EH N IH G Z
+pfenning F EH N IH NG
+pfenninger F EH N IH NG ER
+pfeuffer F Y UW F ER
+pfiester F AY S T ER
+pfiesteria F AY S T EH R IY AH
+pfiffner F IH F N ER
+pfingsten F IH NG S T AH N
+pfister F IH S T ER
+pfisterer F IH S T ER ER
+pfizer F AY Z ER
+pfizer's F AY Z ER Z
+pflaum F L AW M
+pfleger F L IY G ER
+pfleiderer F L AY D ER ER
+pflieger F L IY G ER
+pflueger F L UW G ER
+pflug F L UW G
+pfluger F L UW G ER
+pflum F L AH M
+pfohl F OW L
+pforzheimer F AO R Z HH AY M ER
+pfost F AA S T
+pfund F AH N D
+pfundstein F AH N D S T IY N
+pfundstein(2) F AH N D S T AY N
+pgm P IY JH IY EH M
+ph P IY EY CH
+phagan F EY G AH N
+phagocyte F AE G AH S AY T
+phagocytes F AE G AH S AY T S
+phair F EH R
+phalange F AH L AE N JH
+phalange(2) F AH L EY N JH
+phalanges F AH L AE N JH IY Z
+phalanges(2) F AH L EY N JH IH Z
+phalanx F EY L AE NG K S
+phalen F AE L AH N
+phallic F AE L IH K
+pham F AE M
+phan F AE N
+phaneuf F AE N UW F
+phantasm F AE N T AE Z AH M
+phantasmagoria F AE N T AE Z M AH G AO R IY AH
+phantom F AE N T AH M
+phantom(2) F AE N AH M
+phantoms F AE N T AH M Z
+phantoms(2) F AE N AH M Z
+phar F AA R
+pharaoh F EH R OW
+pharaoh(2) F EY R OW
+pharaohs F EH R OW Z
+pharaohs(2) F EY R OW Z
+pharaon F EH R OW N
+pharaonic F EH R AH AA N IH K
+phares F EH R Z
+pharis F AE R AH S
+pharisaism F AE R IH S EY IH Z AH M
+phariss F ER IH S
+pharma F AA R M AH
+pharmaceutical F AA R M AH S UW T IH K AH L
+pharmaceuticals F AA R M AH S UW T IH K AH L Z
+pharmacia F AA R M EY S IY AH
+pharmacies F AA R M AH S IY Z
+pharmacist F AA R M AH S IH S T
+pharmacists F AA R M AH S IH S T S
+pharmacists(2) F AA R M AH S IH S S
+pharmacists(3) F AA R M AH S IH S
+pharmacological F AA R M AH K AH L AA JH IH K AH L
+pharmacologist F AA R M AH K AA L AH JH IH S T
+pharmacologists F AA R M AH K AA L AH JH IH S T S
+pharmacologists(2) F AA R M AH K AA L AH JH IH S S
+pharmacologists(3) F AA R M AH K AA L AH JH IH S
+pharmacology F AA R M AH K AA L AH JH IY
+pharmacy F AA R M AH S IY
+pharmakinetic F AA R M AH K AH N EH T IH K
+pharmakinetics F AA R M AH K AH N EH T IH K S
+pharo F AA R OW
+pharoah F EY R OW
+pharoah(2) F EH R OW
+pharoahs F EY R OW Z
+pharoahs(2) F EH R OW Z
+pharos F EH R OW Z
+pharr F AA R
+pharris F AE R IH S
+pharynx F EH R IH NG K S
+phase F EY Z
+phased F EY Z D
+phaseout F EY Z AW T
+phases F EY Z AH Z
+phases(2) F EY Z IH Z
+phasing F EY Z IH NG
+pheasant F EH Z AH N T
+pheasants F EH Z AH N T S
+phebe F IY B IY
+phebus F IY B AH S
+phedra F EH D R AH
+phegley F EH G L IY
+phelan F EH L AH N
+phelps F EH L P S
+phelps's F EH L P S IH Z
+phen F EH N
+phenfen F EH N F EH N
+phenicie F EH N AH K IY
+phenix F EH N IH K S
+phenol F IY N AA L
+phenol(2) F EH N AH L
+phenolic F AH N AA L IH K
+phenolphthalein F IY N AA L F TH EY L AH N
+phenolphthalein(2) F EH N AA L F TH EY L AH N
+phenom F EH N AH M
+phenomena F AH N AA M AH N AH
+phenomenal F AH N AA M AH N AH L
+phenomenally F AH N AA M AH N AH L IY
+phenomenon F AH N AA M AH N AA N
+phenotype F IY N AH T AY P
+phenotypes F IY N AH T AY P S
+phenotypic F IY N AH T IH P IH K
+phenylthaline F IY N AH L TH EY L IY N
+pherigo F EH R IY G OW
+pheromone F EH R AH M OW N
+pheromones F EH R AH M OW N Z
+pherson F ER S AH N
+phetteplace F EH T P L EY S
+phew F Y UW
+phi F AY
+phibbs F IH B Z
+phibro F IH B R OW
+phifer F AY F ER
+phil F IH L
+phil's F IH L Z
+philadelphia F IH L AH D EH L F IY AH
+philadelphia's F IH L AH D EH L F IY AH Z
+philadelphian F IH L AH D EH L F IY AH N
+philadelphians F IH L AH D EH L F IY AH N Z
+philana F IH L AE N AH
+philandering F AY L AE N D ER IH NG
+philandering(2) F AH L AE N D ER IH NG
+philantha F IH L AE N TH AH
+philanthropic F IH L AH N TH R AA P IH K
+philanthropies F AH L AE N TH R AH P IY Z
+philanthropist F AH L AE N TH R AH P AH S T
+philanthropist(2) F IH L AE N TH R AH P IH S T
+philanthropists F IH L AE N TH R AH P IH S T S
+philanthropists(2) F IH L AE N TH R AH P IH S S
+philanthropists(3) F IH L AE N TH R AH P IH S
+philanthropy F IH L AE N TH R AH P IY
+philatelic F IH L AH T EH L AH K
+philatelist F IH L AE T AH L IH S T
+philately F IH L AE T AH L IY
+philbeck F IH L B EH K
+philbert F IH L B ER T
+philberta F IH L B ER T AH
+philbin F IH L B IH N
+philbrick F IH L B R IH K
+philbrook F IH L B R UH K
+philby F IH L B IY
+phileas F AH L EY AH S
+philemon F AH L EY M AH N
+philene F IH L IY N
+phileo F IH L IY OW
+philharmonia F IH L HH AA R M OW N IY AH
+philharmonic F IH L HH AA R M AA N IH K
+philharmonic's F IH L HH AA R M AA N IH K S
+philhower F IH L AW ER
+philibert F IH L IH B ER T
+philibosian F IH L IH B OW Z IY AH N
+philida F AH L IY D AH
+philina F AH L IY N AH
+philip F IH L AH P
+philip's F IH L AH P S
+philip's(2) F IH L IH P S
+philip(2) F IH L IH P
+philipp F IH L IH P
+philippa F IH L IH P AH
+philippe F IH L IY P EY
+philippi F IH L IH P IY
+philippic F IH L IH P IH K
+philippine F IH L AH P IY N
+philippines F IH L AH P IY N Z
+philippines' F IH L AH P IY N Z
+philippino F IH L AH P IY N OW
+philippoussis F IH L AH P UW S AH S
+philipps F IH L IH P S
+philips F IH L AH P S
+philips' F IH L IH P S
+philips's F IH L IH P S IH Z
+philips(2) F IH L IH P S
+philipson F IH L AH P S AH N
+philistia F IH L IH S T IY AH
+philistine F IH L AH S T IY N
+philistines F IH L AH S T IY N Z
+phillabaum F IH L AH B AW M
+philley F IH L IY
+phillie F IH L IY
+phillies F IH L IY Z
+phillip F IH L IH P
+phillip's F IH L IH P S
+phillipe F IH L IY P
+phillipine F IH L AH P IY N
+phillipines F IH L AH P IY N Z
+phillipp F IH L IH P
+phillippe F IH L AH P
+phillippi F AH L IY P IY
+phillipps F IH L IH P S
+phillips F IH L IH P S
+phillips' F IH L IH P S
+phillips's F IH L IH P S IH Z
+phillipson F IH L AH P S AH N
+phillis F IH L IH S
+philly F IH L IY
+philo F IY L OW
+philodendron F IH L AH D EH N D R AH N
+philomela F IH L AH M IY L AH
+philomena F IH L AH M IY N AH
+philon F IH L AH N
+philosopher F AH L AA S AH F ER
+philosophers F AH L AA S AH F ER Z
+philosophic F IH L AH S AA F IH K
+philosophical F IH L AH S AA F IH K AH L
+philosophically F IH L AH S AA F IH K AH L IY
+philosophically(2) F IH L AH S AA F IH K L IY
+philosophies F AH L AA S AH F IY Z
+philosophy F AH L AA S AH F IY
+philp F IH L P
+philpot F IH L P AH T
+philpott F IH L P AH T
+philson F IH L S AH N
+philyaw F IH L Y AA
+phineas F IH N IY AH S
+phinney F IH N IY
+phippen F IH P AH N
+phipps F IH P S
+phlcorp P IY EY CH EH L K AO R P
+phlebitis F L AH B AY T IH S
+phlegmatic F L EH G M AE T IH K
+phlogopite F L AA G AH P AY T
+phnom F N AA M
+phnom(2) P AH N AA M
+phobia F OW B IY AH
+phobias F OW B IY AH Z
+phobic F OW B IH K
+phobos F OW B OW S
+phoebe F IY B IY
+phoebus F IY B AH S
+phoenicia F AH N IY SH AH
+phoenician F AH N IY SH AH N
+phoenicians F AH N IY SH AH N Z
+phoenix F IY N IH K S
+phoenix's F IY N IH K S IH Z
+phone F OW N
+phone's F OW N Z
+phoned F OW N D
+phonemate F OW N M EY T
+phoneme F OW N IY M
+phonemes F OW N IY M Z
+phonemic F AH N IY M IH K
+phones F OW N Z
+phonetic F AH N EH T IH K
+phonetically F AH N EH T IH K L IY
+phonetics F AH N EH T IH K S
+phoney F OW N IY
+phonic F AA N IH K
+phonics F AA N IH K S
+phoning F OW N IH NG
+phonograph F OW N AH G R AE F
+phonographs F OW N AH G R AE F S
+phonological F OW N AH L AA JH IH K AH L
+phonology F AH N AA L AH JH IY
+phony F OW N IY
+phooey F UW IY
+phosphate F AA S F EY T
+phosphates F AA S F EY T S
+phosphatic F AA S F AE T IH K
+phosphor F AA S F AO R
+phosphorescence F AA S F ER EH S AH N S
+phosphoric F AA S F ER IH K
+phosphorite F AA S F ER AY T
+phosphorites F AA S F ER AY T S
+phosphorous F AA S F ER AH S
+phosphors F AA S F AO R Z
+phosphorus F AA S F ER AH S
+photo F OW T OW
+photo's F OW T OW Z
+photocall F OW T OW K AA L
+photochemical F OW T OW K EH M AH K AH L
+photochemical(2) F OW T OW K EH M IH K AH L
+photoconductive F OW T OW K AH N D AH K T IH V
+photocopied F OW T OW K AA P IY D
+photocopier F OW T OW K AA P IY ER
+photocopiers F OW T OW K AA P IY ER Z
+photocopies F OW T OW K AA P IY Z
+photocopy F OW T OW K AA P IY
+photocopying F OW T OW K AA P IY IH NG
+photodynamic F OW T OW D AY N AE M IH K
+photoelectric F OW T OW IH L EH K T R IH K
+photofinisher F OW T OW F IH N IH SH ER
+photofinishers F OW T OW F IH N IH SH ER Z
+photofinishing F OW T OW F IH N IH SH IH NG
+photogenic F OW T AH JH EH N IH K
+photograph F OW T AH G R AE F
+photographed F OW T AH G R AE F T
+photographer F AH T AA G R AH F ER
+photographer's F AH T AA G R AH F ER Z
+photographers F AH T AA G R AH F ER Z
+photographic F OW T AH G R AE F IH K
+photographing F OW T AH G R AE F IH NG
+photographs F OW T AH G R AE F S
+photography F AH T AA G R AH F IY
+photojournalist F OW T OW JH ER N AH L AH S T
+photometer F AH T AA M IH T ER
+photon F OW T AA N
+photons F OW T AA N Z
+photoop F OW T OW AO P
+photophoresis F OW T OW F ER IY S IH S
+photorefractive F OW T OW R IH F R AE K T IH V
+photos F OW T OW Z
+photosynthesis F OW T OW S IH N TH AH S IH S
+phototaxis F OW T AH T AE K S IH S
+phototron F OW T AH T R AA N
+photovoltaic F OW T AH V OW L T EY IH K
+photovoltaics F OW T OW V OW L T EY IH K S
+photronic F OW T R AA N IH K
+photronics F OW T R AA N IH K S
+phrase F R EY Z
+phrased F R EY Z D
+phraseology F R EY Z IY AO L AO JH IY
+phrases F R EY Z AH Z
+phrases(2) F R EY Z IH Z
+phrasing F R EY Z IH NG
+phrygian F R IH JH IY AH N
+phu F UW
+phua F Y UW AH
+phung F AH NG
+phuong F UW AO NG
+phut F AH T
+phy F AY
+phyla F AY L AH
+phyle F AY L
+phylis F AY L AH S
+phyllis F IH L IH S
+phyllys F IH L IY Z
+phylogeny F AY L AA JH AH N IY
+phylum F AY L AH M
+physical F IH Z IH K AH L
+physically F IH Z IH K AH L IY
+physically(2) F IH Z IH K L IY
+physicals F IH Z IH K AH L Z
+physician F AH Z IH SH AH N
+physician's F AH Z IH SH AH N Z
+physicians F AH Z IH SH AH N Z
+physicians' F IH Z IH SH AH N Z
+physicians(2) F IH Z IH SH AH N Z
+physicist F IH Z IH S IH S T
+physicists F IH Z IH S IH S T S
+physicists(2) F IH Z IH S IH S S
+physicists(3) F IH Z IH S IH S
+physics F IH Z IH K S
+physics' F IH S IH K S
+physio F IH Z IY OW
+physiological F IH Z IY AH L AA JH IH K AH L
+physiologically F IH Z IY AH L AA JH IH K L IY
+physiologist F IH Z IY AA L AH JH IH S T
+physiology F IH Z IY AA L AH JH IY
+physique F AH Z IY K
+phytogeography F AY T OW JH IY AA G R AH F IY
+phytoplankton F AY T OW P L AE NG T AH N
+pi P AY
+pi-meson P AY M EY Z AA N
+pia P IY AH
+piacente P IY AA CH EH N T IY
+piacentini P IY AA CH EH N T IY N IY
+piaget P IY AH ZH EY
+piaget's P IY AH ZH EY Z
+piana P IY AE N AH
+pianist P IY AE N AH S T
+pianist's P IY AE N AH S T S
+pianist's(2) P IY AH N IH S T S
+pianist(2) P IY AA N AH S T
+pianist(3) P IY AH N IH S T
+pianists P IY AE N AH S T S
+pianists(2) P IY AH N IH S T S
+pianists(3) P IY AE N AH S
+pianists(4) P IY AH N IH S
+pianka P IY AA NG K AH
+piano P IY AE N OW
+piano's P IY AE N OW Z
+piano's(2) P IY AE N AH Z
+piano(2) P IY AE N AH
+pianos P IY AE N OW Z
+pianos(2) P IY AE N AH Z
+piascik P IY AH S CH IH K
+piasecki P IY AH S EH T S K IY
+piasio P IY AE S IY OW
+piatek P IY AA T EH K
+piatkowski P IY AH T K AO F S K IY
+piatt P AY AH T
+piazza P IY AE Z AH
+piazzolla P IY AH Z AA L AH
+pic P IH K
+pic-a-pasta P IH K AH P AA S T AH
+pica P AY K AH
+picabo P AH K AA B OW
+picante P IY K AA N T EY
+picard P IH K AA R D
+picariello P IY K AA R IY EH L OW
+picaro P IY K AA R OW
+picas P AY K AH Z
+picasso P IH K AA S OW
+picasso's P IH K AA S OW Z
+picassos P IH K AA S OW S
+picayune P IH K IY Y UW N
+picazo P IY K AA Z OW
+piccadilly P IH K AH D IH L IY
+picchi P IH K IY
+picchu P IY CH UW
+picciano P IY CH IY AA N OW
+piccinini P IY CH IY N IY N IY
+piccione P IY K CH OW N IY
+piccirilli P IY CH IH R IY L IY
+piccirillo P IY CH IH R IH L OW
+picco P IH K OW
+piccola P IY K OW L AH
+piccoli P IY K OW L IY
+piccolo P IH K AH L OW
+piccone P IY K OW N IY
+picha P IH CH AH
+pichardo P IH CH AA R D OW
+piche P IH CH
+picheny P AH CH EY N IY
+picher P IH CH ER
+pichette P AH SH EH T
+pichler P IH K AH L ER
+pichler(2) P IH K L ER
+pichon P IH CH AH N
+picht P IH K T
+picinich P IH S IH N IH CH
+pick P IH K
+pickands P IH K AH N D Z
+pickar P IH K AA R
+pickard P IH K AA R D
+pickart P IH K AA R T
+picked P IH K T
+pickel P IH K AH L
+pickell P IH K AH L
+pickelsimer P IH K IH L S IH M ER
+picken P IH K AH N
+pickens P IH K AH N Z
+pickens' P IH K AH N Z
+pickens's P IH K AH N Z IH Z
+picker P IH K ER
+pickeral P IH K ER AH L
+pickerel P IH K ER AH L
+pickerell P IH K ER AH L
+pickerill P IH K ER IH L
+pickering P IH K ER IH NG
+pickers P IH K ER Z
+pickert P IH K ER T
+picket P IH K AH T
+picket(2) P IH K IH T
+picketed P IH K AH T IH D
+picketer P IH K AH T ER
+picketers P IH K AH T ER Z
+picketing P IH K AH T IH NG
+pickets P IH K AH T S
+pickett P IH K IH T
+pickett's P IH K IH T S
+pickford P IH K F ER D
+pickier P IH K IY ER
+picking P IH K IH NG
+pickings P IH K IH NG Z
+pickins P IH K IH N Z
+pickle P IH K AH L
+pickled P IH K AH L D
+pickler P IH K AH L ER
+pickler(2) P IH K L ER
+pickles P IH K AH L Z
+picklesimer P IH K AH L S IH M ER
+pickling P IH K L IH NG
+pickney P IH K N IY
+pickpocket P IH K P AA K AH T
+pickpockets P IH K P AA K AH T S
+pickrel P IH K R AH L
+pickrell P IH K R AH L
+pickren P IH K ER AH N
+pickron P IH K R AH N
+picks P IH K S
+pickup P IH K AH P
+pickups P IH K AH P S
+pickus P IH K AH S
+pickwick P IH K W IH K
+pickworth P IH K W ER TH
+picky P IH K IY
+picnic P IH K N IH K
+picnics P IH K N IH K S
+pico P IY K OW
+picon P IH K AH N
+picone P IH K OW N
+picop P IH K AA P
+picotte P IH K AO T
+picou P IY K UW
+picoult P IH K OW L T
+picower P IH K AW R
+pictet P IH K T IH T
+picton P IH K T AH N
+pictorial P IH K T AO R IY AH L
+picts P IH K T S
+picture P IH K CH ER
+picture's P IH K CH ER Z
+pictured P IH K CH ER D
+pictures P IH K CH ER Z
+pictures' P IH K CH ER Z
+picturesque P IH K CH ER AH S K
+picturetel P IH K CH ER T EH L
+picturing P IH K CH ER IH NG
+pidcock P IH D K AH K
+piddle P IH D AH L
+piddles P IH D AH L Z
+piddling P IH D AH L IH NG
+piddling(2) P IH D L IH NG
+piddock P IH D AH K
+pidgeon P IH D JH IH N
+pie P AY
+piebald P AY B AO L D
+piece P IY S
+pieced P IY S T
+piecemeal P IY S M IY L
+pieces P IY S AH Z
+pieces(2) P IY S IH Z
+piecework P IY S W ER K
+piech P IY CH
+piech's P IY CH IH Z
+piechocki P IY HH OW T S K IY
+piechota P IY HH OW T AH
+piechowski P IY HH AO F S K IY
+piecing P IY S IH NG
+piecuch P IY K AH K
+pieczynski P IY CH IH N S K IY
+pied P AY D
+piedboeuf P IY D B AH F
+piedmont P IY D M AA N T
+piedmont's P IY D M AA N T S
+piedra P IY D R AH
+piehl P IY L
+piekarski P IY K AA R S K IY
+piel P IY L
+piela P IY L AH
+pienta P IY N T AH
+pieper P IY P ER
+piepgras P IY P G R AE S
+piepho P IY F OW
+pier P IH R
+pieraccini P IH R AH CH IY N IY
+pieraccini(2) P Y EH R AH CH IY N IY
+pieratt P IY R AH T
+pierce P IH R S
+pierce's P IH R S IH Z
+pierceall P IH R S IY L
+pierced P IH R S T
+piercey P IH R S IY
+piercing P IH R S IH NG
+piercy P IH R K IY
+pierette P IH R EH T
+pieri P IY R IY
+pierie P IY EH R IY
+pierie's P IY EH R IY Z
+pierini P IH R IY N IY
+pierman P IH R M AH N
+piero P IY R OW
+pieroni P IH R OW N IY
+pierotti P IH R OW T IY
+pierpoint P IH R P OY N T
+pierpont P IH R P AA N T
+pierre P IY EH R
+pierre's P IY EH R Z
+pierrelouis P IH R IH L W IY Z
+pierrelouis(2) P Y EH R L W IY Z
+pierrepont P IH R EY P OW N T
+pierrepont(2) P Y EH R P OW N T
+pierro P IH R OW
+pierron P IH R AO N
+piers P IH R Z
+piersall P IH R S AH L
+piersol P IH R S AO L
+pierson P IH R S AH N
+pies P AY Z
+pies's P AY Z IH Z
+piet P AY IH T
+piet(2) P Y EH T
+piet(3) P IY T
+pieter P IY T ER
+pietermaritzburg P IY T ER M EH R IH T S B ER G
+pieters P IY T ER Z
+pieties P AY AH T IY Z
+pietila P IY T IY L AH
+pietism P IY T IH Z AH M
+pietrangelo P IY T R AA NG G EH L OW
+pietras P IY T R AH Z
+pietro P IY EH T R OW
+pietrowski P IY T R AO F S K IY
+pietruski P IY EH T R AH S K IY
+pietruszka P IY T R AH SH K AH
+pietrzak P IY T ER Z AE K
+pietrzyk P IY T ER Z IH K
+pietsch P IY CH
+piette P IY T
+piety P AY AH T IY
+pietz P IY T S
+piezoelectric P AY AH Z OW AH L EH K T R IH K
+pifer P AY F ER
+pig P IH G
+pig's P IH G Z
+pigan P IH G AH N
+pigeon P IH JH AH N
+pigeon's P IH JH AH N Z
+pigeon(2) P IH JH IH N
+pigeonhole P IH JH AH N HH OW L
+pigeonholed P IH JH AH N HH OW L D
+pigeons P IH JH AH N Z
+pigford P IH G F ER D
+pigg P IH G
+piggee P IH G IY
+piggly P IH G L IY
+piggott P IH G AH T
+piggy P IH G IY
+piggyback P IH G IY B AE K
+piggybacked P IH G IY B AE K T
+piggybacking P IH G IY B AE K IH NG
+piglet P IH G L IH T
+piglets P IH G L IH T S
+pigman P IH G M AH N
+pigment P IH G M AH N T
+pigmentation P IH G M AH N T EY SH AH N
+pigments P IH G M AH N T S
+pigmied P IH G M IY D
+pigmy P IH G M IY
+pignataro P IY G N AA T AA R OW
+pignatelli P IY G N AA T EH L IY
+pignato P IY G N AA T OW
+pignone P IY G N OW N IY
+pigott P IH G AH T
+pigs P IH G Z
+pigskin P IH G S K IH N
+pigskins P IH G S K IH N Z
+pigue P IY G
+pih P IH
+pih(2) P IY AY EY CH
+pihl P IH L
+pik P IH K
+pike P AY K
+piker P AY K ER
+pikers P AY K ER Z
+pikes P AY K S
+pikul P IH K AH L
+pikula P IH K UW L AH
+pikus P AY K AH S
+pil P IH L
+piland P IH L AH N D
+pilant P IY L AH N T
+pilar P AY L ER
+pilarski P IH L AA R S K IY
+pilaster P AH L AE S T ER
+pilasters P AH L AE S T ER Z
+pilat P IY L AA T
+pilato P IY L AA T OW
+pilatus P IY L EY T AH S
+pilch P IH L CH
+pilcher P IH L CH ER
+pile P AY L
+pilecki P IH L EH K IY
+piled P AY L D
+pileggi P IH L EH JH IY
+piles P AY L Z
+pileup P AY L AH P
+pilevsky P IH L EH V S K IY
+pilfer P IH L F ER
+pilferage P IH L F ER IH JH
+pilfered P IH L F ER D
+pilfering P IH L F ER IH NG
+pilfers P IH L F ER Z
+pilger P IH L G ER
+pilgram P IH L G R AH M
+pilgreen P IH L G R IY N
+pilgrim P IH L G R AH M
+pilgrim's P IH L G R AH M Z
+pilgrim(2) P IH L G R IH M
+pilgrimage P IH L G R AH M AH JH
+pilgrimage(2) P IH L G R AH M IH JH
+pilgrimages P IH L G R AH M IH JH IH Z
+pilgrims P IH L G R AH M Z
+piling P AY L IH NG
+pilings P AY L IH NG Z
+pilkenton P IH L K EH N T AH N
+pilkerton P IH L K ER T AH N
+pilkington P IH L K IH NG T AH N
+pilkinton P IH L K IH N T AH N
+pill P IH L
+pill's P IH L Z
+pilla P IH L AH
+pillage P IH L IH JH
+pillaged P IH L IH JH D
+pillager P IH L IH JH ER
+pillager's P IH L IH JH ER Z
+pillagers P IH L IH JH ER Z
+pillages P IH L IH JH IH Z
+pillaging P IH L IH JH IH NG
+pillar P IH L ER
+pillard P IH L ER D
+pillared P IH L ER D
+pillars P IH L ER Z
+pille P IH L
+piller P IH L ER
+pilley P IH L IY
+pilling P IH L IH NG
+pillion P IH L Y AH N
+pilloried P IH L ER IY D
+pillory P IH L ER IY
+pillow P IH L OW
+pillows P IH L OW Z
+pillowtex P IH L OW T EH K S
+pills P IH L Z
+pillsbury P IH L Z B EH R IY
+pillsbury's P IH L Z B EH R IY Z
+pilnak P IH L N AE K
+pilon P IY L AO N
+pilot P AY L AH T
+pilot's P AY L AH T S
+piloted P AY L AH T IH D
+piloting P AY L AH T IH NG
+pilotless P AY L AH T L AH S
+pilots P AY L AH T S
+pilots' P AY L AH T S
+pilotte P IH L AO T
+pilsner P IH L Z N ER
+pilson P IH L S AH N
+piltdown P IH L T D AW N
+piltz P IH L T S
+pilz P IH L Z
+pima P IY M AH
+pimco P IH M K OW
+pimental P IH M EH N T AH L
+pimentel P IH M IH N T AH L
+pimm P IH M
+pimm's P IH M Z
+pimp P IH M P
+pimping P IH M P IH NG
+pimplapure P IH M P L AH P Y UH R
+pimple P IH M P AH L
+pimples P IH M P AH L Z
+pimps P IH M P S
+pin P IH N
+pina P IY N AH
+pinard P IH N ER D
+pinatubo P IH N AH T UW B OW
+pinault P IH N AO L T
+pinball P IH N B AO L
+pincavage P IH NG K AH V IH JH
+pincerlike P IH N S ER L AY K
+pincers P IH N S ER Z
+pinch P IH N CH
+pinched P IH N CH T
+pincher P IH N CH ER
+pinchers P IH N CH ER Z
+pinching P IH N CH IH NG
+pinckard P IH NG K ER D
+pinckney P IH NG K N IY
+pincus P IH NG K AH S
+pindaric P IH N D AE R IH K
+pindell P IH N D AH L
+pinder P AY N D ER
+pindling P IH N D L IH NG
+pine P AY N
+pineal P AY N IY AH L
+pineapple P AY N AE P AH L
+pineapples P AY N AE P AH L Z
+pineau P IH N OW
+pined P AY N D
+pineda P IY N EH D AH
+pinedo P IY N EY D OW
+pinegar P IH N IH G ER
+pineiro P IY N EH R OW
+pinellas P IH N EH L AH S
+pinelli P IH N EH L IY
+pineo P IH N IY OW
+piner P AY N ER
+pinero P IH N EH R OW
+pines P AY N Z
+pinetta P AH N EH T AH
+pinetta's P AH N EH T AH Z
+pinette P IH N EH T
+ping P IH NG
+pinged P IH NG D
+pingel P IH NG G AH L
+pinging P IH NG IH NG
+pingitore P IH NG G IY T AO R IY
+pingleton P IH NG G AH L T AA N
+pingley P IH NG G L IY
+pingpong P IH NG P AO NG
+pingree P IH NG G R IY
+pings P IH NG Z
+pinheiro P IY N HH EH R OW
+pinho P IH N HH OW
+pinhole P IH N HH OW L
+pinholes P IH N HH OW L Z
+pini P IY N IY
+pining P AY N IH NG
+pinion P IH N Y AH N
+pink P IH NG K
+pinkard P IH NG K ER D
+pinkelman P IH NG K AH L M AH N
+pinker P IH NG K ER
+pinkerman P IH NG K ER M AH N
+pinkerton P IH NG K ER T AH N
+pinkerton's P IH NG K ER T AH N Z
+pinkest P IH NG K IH S T
+pinkett P IH NG K IH T
+pinkham P IH NG K HH AH M
+pinkie P IH NG K IY
+pinkish P IH NG K IH SH
+pinkley P IH NG K L IY
+pinkney P IH NG K N IY
+pinkos P IH NG K OW Z
+pinkowski P IH NG K AO F S K IY
+pinks P IH NG K S
+pinkstaff P IH NG K S T AE F
+pinkston P IH NG K S T AH N
+pinkus P IH NG K AH S
+pinkwater P IH NG K W AO T ER
+pinkwater's P IH NG K W AO T ER Z
+pinky P IH NG K IY
+pinn P IH N
+pinnacle P IH N AH K AH L
+pinnacle's P IH N IH K AH L Z
+pinned P IH N D
+pinnell P IH N AH L
+pinneo P IH N IY OW
+pinner P IH N ER
+pinney P IH N IY
+pinnick P IH N IH K
+pinning P IH N IH NG
+pinnix P IH N IH K S
+pinnock P IH N AH K
+pinnow P IH N OW
+pino P IY N OW
+pino's P IY N OW Z
+pinocchio P IH N OW K IY OW
+pinochet P IH N AH SH EY
+pinochet's P IH N AH SH EY Z
+pinochet's(2) P IY N AO CH EH T S
+pinochet's(3) P IY N OW SH EY Z
+pinochet(2) P IY N AO CH EH T
+pinochet(3) P IY N OW SH EY
+pinola P IH N OW L AH
+pinot P IH N AH T
+pinpoint P IH N P OY N T
+pinpointed P IH N P OY N T IH D
+pinpointing P IH N P OY N T IH NG
+pinpoints P IH N P OY N T S
+pinprick P IH N P R IH K
+pinquater P IH N K W AA T ER
+pins P IH N Z
+pinshan P IH N SH AH N
+pinsker P IH N S K ER
+pinsky P IH N S K IY
+pinson P IH N S AH N
+pinsoneault P IH N S AH N AO L T
+pinsoneault(2) P IH N S AH N OW
+pinstripe P IH N S T R AY P
+pinstriped P IH N S T R AY P T
+pinstripes P IH N S T R AY P S
+pint P AY N T
+pint-size P AY N T S AY Z
+pint-sized P AY N T S AY Z D
+pinta P IH N T AH
+pintar P IY N T AA R
+pinter P AY N T ER
+pinto P IH N T OW
+pints P AY N T S
+piny P AY N IY
+pinyan P IH N Y AH N
+pinzon P IH N Z AO N
+pio P AY OW
+pion P AY AA N
+pioneer P AY AH N IH R
+pioneer's P AY AH N IH R Z
+pioneered P AY AH N IH R D
+pioneering P AY AH N IH R IH NG
+pioneers P AY AH N IH R Z
+piontek P IY OW N T EH K
+piontkowski P IY OW N T K AO F S K IY
+piorkowski P IY AO R K AO F S K IY
+piotrowski P IY OW T R AO F S K IY
+piotter P IY AA T ER
+pious P AY AH S
+piously P AY AH S L IY
+pip P IH P
+pipe P AY P
+piped P AY P T
+pipefish P AY P F IH SH
+pipefishes P AY P F IH SH IH Z
+pipeline P AY P L AY N
+pipeline's P AY P L AY N Z
+pipelines P AY P L AY N Z
+pipelines' P AY P L AY N Z
+piper P AY P ER
+pipers P AY P ER Z
+pipes P AY P S
+pipetec P AY P T EH K
+pipette P AY P EH T
+pipetter P AY P EH T ER
+pipetters P AY P EH T ER Z
+pipettes P AY P EH T S
+pipher P IH F ER
+piping P AY P IH NG
+pipitone P IH P IH T OW N
+pipkin P IH P K IH N
+pipkins P IH P K IH N Z
+pipp P IH P
+pippen P IH P AH N
+pippen's P IH P AH N Z
+pippenger P IH P IH N JH ER
+pippert P IH P ER T
+pippin P IH P IH N
+pippins P IH P IH N Z
+pips P IH P S
+piquant P IY K AH N T
+pique P IY K
+piqued P IY K T
+piquette P IH K EH T
+piracy P AY R AH S IY
+piraeus P AH R EY AH S
+piraino P IH R EY N OW
+pirandello P IH R AH N D EH L OW
+piranha P IH R AE N HH AH
+pirate P AY R AH T
+pirate's P AY R AH T S
+pirated P AY R AH T IH D
+pirates P AY R AH T S
+pirating P AY R AH T IH NG
+pirelli P IH R EH L IY
+pirelli's P IH R EH L IY Z
+pires P AY R Z
+pirestani P IH R EH S T AA N IY
+pirie P IH R IY
+pirkey P ER K IY
+pirkl P ER K AH L
+pirkle P ER K AH L
+pirko P ER K OW
+piro P IH R OW
+pirog P ER AA G
+pirone P IH R OW N
+pirouette P IH R UW EH
+pirouettes P IH R UW EH T S
+pirozzi P IH R AA Z IY
+pirrello P IH R EH L OW
+pirro P IH R OW
+pirrone P IH R OW N IY
+pirtle P ER T AH L
+pisa P IY S AH
+pisani P IY S AA N IY
+pisano P IY S AA N OW
+pisarek P IH S ER EH K
+pisarski P IH S AA R S K IY
+pisca P IH S K AH
+piscataway P IH S K AE T AH W EY
+pisces P AY S IY Z
+pischel P IH SH AH L
+pischke P IH SH K
+pisciotta P IY S CH OW T AH
+piscitelli P IY S CH IY T EH L IY
+piscitello P IH S IH T EH L OW
+piscopo P IY S K OW P OW
+pisello P IH S EH L OW
+pisoni P IH S OW N IY
+piss P IH S
+pissed P IH S T
+pistachio P AH S T AE SH IY OW
+pistachios P AH S T AE SH IY OW Z
+pistil P IH S T AH L
+pistilli P IY S T IY L IY
+pistol P IH S T AH L
+pistole P IH S T OW L
+pistole(2) P IH S T OW L EY
+pistols P IH S T AH L Z
+piston P IH S T AH N
+pistone P IY S T OW N
+pistons P IH S T AH N Z
+pistor P IH S T ER
+pistorio P IH S T AO R IY OW
+pit P IH T
+pita P IY T AH
+pitblado P IH T B L AA D OW
+pitch P IH CH
+pitchblende P IH CH B L EH N D
+pitched P IH CH T
+pitcher P IH CH ER
+pitcher's P IH CH ER Z
+pitchers P IH CH ER Z
+pitches P IH CH IH Z
+pitchford P IH CH F ER D
+pitchfork P IH CH F AO R K
+pitchforks P IH CH F AO R K S
+pitching P IH CH IH NG
+pitchman P IH CH M AH N
+pitchmen P IH CH M EH N
+pitcock P IH T K AA K
+pitfall P IH T F AO L
+pitfalls P IH T F AO L Z
+pith P IH TH
+pithy P IH TH IY
+pitiable P IH T IY AH B AH L
+pitied P IH T IY D
+pitiesalpetriere P IY T Y EY S AA L P EH T R IY EH R
+pitiful P IH T AH F AH L
+pitifully P IH T IH F AH L IY
+pitifully(2) P IH T IH F L IY
+pitiless P IH T IY L AH S
+pitino P AH T IY N OW
+pitkin P IH T K IH N
+pitman P IH T M AH N
+pitner P IH T N ER
+pitney P IH T N IY
+pitofsky P AH T AA F S K IY
+pitre P AY T ER
+pits P IH T S
+pitsch P IH CH
+pitsenbarger P IH T S IH N B AA R G ER
+pitstick P IH T S T IH K
+pitswon P IH T S W AA N
+pitt P IH T
+pitt's P IH T S
+pittance P IH T AH N S
+pittard P IH T ER D
+pitted P IH T AH D
+pitted(2) P IH T IH D
+pittencrieff P IH T IH N K R IY F
+pittenger P IH T IH N JH ER
+pitting P IH T IH NG
+pittinger P IH T IH NG ER
+pittle P IH T AH L
+pittman P IH T M AH N
+pittner P IH T N ER
+pitts P IH T S
+pitts's P IH T S IH Z
+pittsboro P IH T S B ER OW
+pittsburg P IH T S B ER G
+pittsburgh P IH T S B ER G
+pittsburgh's P IH T S B ER G Z
+pittsburgher P IH T S B ER G ER
+pittsburghers P IH T S B ER G ER Z
+pittsfield P IH T S F IY L D
+pittsford P IH T S F ER D
+pittsley P IH T S L IY
+pittston P IH T S T AH N
+pituitary P AH T UW AH T EH R IY
+pituitary(2) P IH T UW IH T EH R IY
+pity P IH T IY
+pitying P IH T IY IH NG
+pitz P IH T S
+pitzen P IH T Z AH N
+pitzer P IH T Z ER
+pius P AY AH S
+piver P AY V ER
+pivonka P IH V AA NG K AH
+pivot P IH V AH T
+pivotal P IH V AH T AH L
+pivoted P IH V AH T AH D
+pivoted(2) P IH V AH T IH D
+pivoting P IH V AH T IH NG
+pivots P IH V AH T S
+pix P IH K S
+pixar P IH K S AA R
+pixel P IH K S AH L
+pixels P IH K S AH L Z
+pixie P IH K S IY
+pixler P IH K S L ER
+pixley P IH K S L IY
+pizana P IY Z AE N AH
+pizano P IY Z AA N OW
+pizarro P IH Z AA R OW
+pizatti P IH Z AA T IY
+pizazz P IH Z AE Z
+pizer P AY Z ER
+pizza P IY T S AH
+pizza's P IY T S AH Z
+pizzano P IY T S AA N OW
+pizzas P IY T S AH Z
+pizzazier P IH Z AE Z Y ER
+pizzazz P IH Z AE Z
+pizzeria P IY T S ER IY AH
+pizzerias P IY T S ER IY AH Z
+pizzi P IH Z IY
+pizzimenti P IY T S IY M EH N T IY
+pizzino P IY T S IY N OW
+pizzitola P IY T S IY T OW L AH
+pizzo P IH Z OW
+pizzolato P IY T S OW L AA T OW
+pizzuti P IY T S UW T IY
+pizzuto P IY T S UW T OW
+pj's P IY JH EY Z
+pla P L AA
+placard P L AE K ER D
+placards P L AE K ER D Z
+placate P L EY K EY T
+placating P L EY K EY T IH NG
+place P L EY S
+place's P L EY S IH Z
+placebo P L AH S IY B OW
+placebos P L AH S IY B OW Z
+placed P L EY S T
+placek P L AA CH EH K
+placemat P L EY S M AE T
+placement P L EY S M AH N T
+placements P L EY S M AH N T S
+placencia P L AA CH EH N CH AH
+placenta P L AH S EH N T AH
+placentia P L AH S EH N SH AH
+placer P L AE S ER
+placer(2) P L EY S ER
+places P L EY S AH Z
+places(2) P L EY S IH Z
+placeta P L AH S EY T AH
+placetas P L AH S EY T AH Z
+placeway P L EY S W EY
+placid P L AE S AH D
+placid's P L AE S IH D Z
+placid(2) P L AE S IH D
+placida P L AA CH IY D AH
+placidly P L AE S IH D L IY
+placido P L AA CH IH D OW
+placido(2) P L AH S IY D OW
+placing P L EY S IH NG
+plack P L AE K
+plack's P L AE K S
+placke P L AE K
+placko P L AE K OW
+placoid P L AE K OY D
+placzek P L AA CH EH K
+plagens P L AE G AH N Z
+plagge P L AE G
+plagiarism P L EY JH ER IH Z AH M
+plagiarize P L EY JH ER AY Z
+plagiarized P L EY JH ER AY Z D
+plagioclase P L EY JH IY AH K L EY S
+plague P L EY G
+plagued P L EY G D
+plagues P L EY G Z
+plaguing P L EY G IH NG
+plaia P L AA Y AH
+plaid P L AE D
+plain P L EY N
+plainclothes P L EY N K L OW Z
+plainer P L EY N ER
+plaines P L EY N Z
+plainfield P L EY N F IY L D
+plainly P L EY N L IY
+plaino P L EY N OW
+plains P L EY N Z
+plainsong P L EY N S AO NG
+plaintiff P L EY N T AH F
+plaintiff's P L EY N T IH F S
+plaintiff's(2) P L EY N IH F S
+plaintiff(2) P L EY N AH F
+plaintiffs P L EY N T IH F S
+plaintiffs' P L EY N T IH F S
+plaintiffs'(2) P L EY N IH F S
+plaintiffs(2) P L EY N IH F S
+plaintive P L EY N T IH V
+plaintive(2) P L EY N IH V
+plaintively P L EY N T AY V L IY
+plaintively(2) P L EY N AY V L IY
+plainview P L EY N V Y UW
+plair P L EH R
+plaisance P L EY S AH N S
+plaisted P L AA IH S T IH D
+plaisted(2) P L EY S T IH D
+plait P L EY T
+plaited P L EY T AH D
+plaiting P L EY T IH NG
+plaits P L EY T S
+plake P L EY K
+plam P L AE M
+plamann P L AA M AH N
+plambeck P L AE M B EH K
+plamondon P L AA M OW N D AO N
+plan P L AE N
+plan's P L AE N Z
+planar P L EY N ER
+planarian P L AH N EH R IY AH N
+planas P L AE N AH Z
+planck P L AE NG K
+plane P L EY N
+plane's P L EY N Z
+planecon P L AE N AH K AA N
+planecon(2) P L AE N K AA N
+planed P L EY N D
+planeload P L EY N L OW D
+planeloads P L EY N L OW D Z
+planer P L EY N ER
+planers P L EY N ER Z
+planes P L EY N Z
+planes' P L EY N Z
+planet P L AE N AH T
+planet's P L AE N AH T S
+planetarium P L AE N AH T EH R IY AH M
+planetary P L AE N AH T EH R IY
+planets P L AE N AH T S
+planitzer P L AE N IH T S ER
+plank P L AE NG K
+planking P L AE NG K IH NG
+planks P L AE NG K S
+plankton P L AE NG K T AH N
+planktonic P L AE NG K T AA N IH K
+planned P L AE N D
+planner P L AE N ER
+planner's P L AE N ER Z
+planners P L AE N ER Z
+planners' P L AE N ER Z
+planning P L AE N IH NG
+plano P L EY N OW
+plans P L AE N Z
+plans' P L AE N Z
+plant P L AE N T
+plant's P L AE N T S
+plantain P L AE N T AH N
+plantains P L AE N T AH N Z
+plantation P L AE N T EY SH AH N
+plantations P L AE N T EY SH AH N Z
+plante P L AE N T
+planted P L AE N T AH D
+planted(2) P L AE N T IH D
+planted(3) P L AE N AH D
+planted(4) P L AE N IH D
+planter P L AE N T ER
+planters P L AE N T ER Z
+plantiffs P L AE N T IH F S
+planting P L AE N T IH NG
+plantings P L AE N T IH NG Z
+plantlike P L AE N T L AY K
+plantronic P L AE N T R AA N IH K
+plantronics P L AE N T R AA N IH K S
+plants P L AE N T S
+plants' P L AE N T S
+plantz P L AE N T S
+plaque P L AE K
+plaques P L AE K S
+plas P L AE S
+plascencia P L AA S CH EH N CH AH
+plasencia P L AA S EH N CH AH
+plaskett P L AE S K IH T
+plasma P L AE Z M AH
+plasminogen P L AE Z M IH N AH JH IH N
+plasmodia P L AE Z M OW D IY AH
+plasmodium P L AE Z M OW D IY AH M
+plass P L AE S
+plassard P L AE S ER D
+plasse P L AE S
+plaster P L AE S T ER
+plasterboard P L AE S T ER B AO R D
+plastered P L AE S T ER D
+plasterer P L AE S T ER ER
+plastering P L AE S T ER IH NG
+plasters P L AE S T ER Z
+plasterwork P L AE S T ER W ER K
+plastic P L AE S T IH K
+plasticine P L AE S T IH S IY N
+plasticizer P L AE S T AH S AY Z ER
+plastics P L AE S T IH K S
+plata P L AA T AH
+plate P L EY T
+plateau P L AE T OW
+plateaued P L AE T OW D
+plateauing P L AH T OW IH NG
+plated P L EY T AH D
+plated(2) P L EY T IH D
+platek P L AA T EH K
+platelet P L EY T L AH T
+platelets P L EY T L AH T S
+platelike P L EY T L AY K
+platen P L AE T AH N
+plater P L EY T ER
+plates P L EY T S
+platform P L AE T F AO R M
+platform's P L AE T F AO R M Z
+platforms P L AE T F AO R M Z
+plath P L AE TH
+plating P L EY T IH NG
+platinum P L AE T N AH M
+platinum's P L AE T AH N AH M Z
+platinum's(2) P L AE T N AH M Z
+platinum(2) P L AE T AH N AH M
+platitude P L AE T IH T UW D
+platitudes P L AE T IH T UW D Z
+platner P L AE T N ER
+plato P L EY T OW
+plato's P L EY T OW Z
+platona P L AA T OW N AH
+platonic P L AH T AA N IH K
+platonist P L EY T AH N AH S T
+platonists P L EY T AH N AH S T S
+platonists(2) P L EY T AH N AH S S
+platonists(3) P L EY T AH N AH S
+platoon P L AH T UW N
+platoons P L AH T UW N Z
+platt P L AE T
+platte P L AE T
+platten P L AE T AH N
+platter P L AE T ER
+platters P L AE T ER Z
+plattner P L AE T N ER
+platts P L AE T S
+plattsburgh P L AE T S B ER G
+platy P L EY T IY
+platypus P L AE T AH P UH S
+platz P L AE T S
+platzer P L EY T Z ER
+plauche P L AO CH
+plaudit P L AO D IH T
+plaudits P L AO D IH T S
+plaugher P L AO ER
+plausibility P L AO Z IH B IH L IH T IY
+plausible P L AO Z AH B AH L
+plausibly P L AO Z AH B L IY
+plaut P L AO T
+plautz P L AO T S
+plavsic P L AE V S IH K
+plavsic's P L AE V S IH K S
+plax P L AE K S
+play P L EY
+play's P L EY Z
+playa P L AY AH
+playback P L EY B AE K
+playbook P L EY B UH K
+playboy P L EY B OY
+playboy's P L EY B OY Z
+playcount P L EY K AW N T
+played P L EY D
+player P L EY ER
+player's P L EY ER Z
+players P L EY ER Z
+players' P L EY ER Z
+playford P L EY F ER D
+playful P L EY F AH L
+playfully P L EY F AH L IY
+playfulness P L EY F AH L N AH S
+playground P L EY G R AW N D
+playground(2) P L EY G R AW N
+playgrounds P L EY G R AW N D Z
+playgrounds(2) P L EY G R AW N Z
+playhouse P L EY HH AW S
+playhouses P L EY HH AW S IH Z
+playin' P L EY IH N
+playing P L EY IH NG
+playmate P L EY M EY T
+playmates P L EY M EY T S
+playoff P L EY AO F
+playoffs P L EY AO F S
+playpen P L EY P EH N
+playpens P L EY P EH N Z
+playroom P L EY R UW M
+playrooms P L EY R UW M Z
+plays P L EY Z
+playstation P L EY S T EY SH AH N
+playstations P L EY S T EY SH AH N Z
+playtex P L EY T EH K S
+plaything P L EY TH IH NG
+playthings P L EY TH IH NG Z
+playwright P L EY R AY T
+playwright's P L EY R AY T S
+playwrights P L EY R AY T S
+plaza P L AA Z AH
+plaza's P L AA Z AH Z
+plaza's(2) P L AE Z AH Z
+plaza(2) P L AE Z AH
+plazas P L AA Z AH Z
+plazas(2) P L AE Z AH Z
+plazic P L EY Z IH K
+plea P L IY
+plead P L IY D
+pleaded P L IY D AH D
+pleaded(2) P L IY D IH D
+pleading P L IY D IH NG
+pleadings P L IY D IH NG Z
+pleads P L IY D Z
+pleas P L IY Z
+pleasant P L EH Z AH N T
+pleasantly P L EH Z AH N T L IY
+pleasanton P L EH Z AH N T AH N
+pleasantries P L EH Z AH N T R IY Z
+pleasantry P L EH Z AH N T R IY
+pleasants P L EH Z AH N T S
+pleasantville P L EH Z AH N T V IH L
+please P L IY Z
+pleased P L IY Z D
+pleaser P L IY Z ER
+pleases P L IY Z IH Z
+pleasing P L IY Z IH NG
+pleasingly P L IY Z IH NG L IY
+pleasurable P L EH ZH ER AH B AH L
+pleasurama P L EH ZH UH R AE M AH
+pleasure P L EH ZH ER
+pleasures P L EH ZH ER Z
+pleat P L IY T
+pleats P L IY T S
+plebeian P L AH B IY AH N
+plebeians P L AH B IY AH N Z
+plebiscite P L EH B AH S AY T
+plebiscite(2) P L IY B IH S AY T
+pled P L EH D
+pledge P L EH JH
+pledged P L EH JH D
+pledger P L EH JH ER
+pledges P L EH JH IH Z
+pledging P L EH JH IH NG
+pleiad P L IY AH D
+pleiades P L IY AH D IY Z
+pleiads P L IY AH D Z
+plein P L IY N
+pleistocene P L AY S T AH S IY N
+plemmons P L EH M AH N Z
+plemons P L EH M AH N Z
+plenary P L EH N ER IY
+plenary(2) P L IY N ER IY
+plenet P L EH N IH T
+plenmeer P L EH N M IH R
+plentiful P L EH N T AH F AH L
+plentiful(2) P L EH N T IH F AH L
+plentiful(3) P L EH N AH F AH L
+plentiful(4) P L EH N IH F AH L
+plenty P L EH N T IY
+plenty(2) P L EH N IY
+plenum P L EH N AH M
+plenum's P L EH N AH M Z
+pleonasm P L IY AH N AE Z M
+plescia P L EY S IY AH
+plese P L IY Z
+pleshar P L EH SH AA R
+pleskow P L EH S K AW
+pless P L EH S
+plessey P L EH S IY
+plessey's P L EH S IY Z
+plessinger P L EH S IH NG ER
+plessis P L EH S IH S
+plessy P L EH S IY
+pletcher P L EH CH ER
+plethora P L EH TH ER AH
+plethora(2) P L AH TH AO R AH
+pletscher P L EH CH ER
+plett P L EH T
+pletz P L EH T S
+pleurisy P L UH R AH S IY
+pleva P L EY V AH
+plew P L UW
+plewa P L UW AH
+plex P L EH K S
+plexiglas P L EH K S IH G L AE S
+plexiglas(2) P L EH K S IY G L AE S
+plexiglass P L EH K S IH G L AE S
+plexiglass(2) P L EH K S IY G L AE S
+plexus P L EH K S AH S
+pliable P L AY AH B AH L
+pliant P L AY AH N T
+plichta P L IH CH T AH
+plied P L AY D
+plier P L AY ER
+pliers P L AY ER Z
+plies P L AY Z
+plight P L AY T
+pliler P L AY L ER
+plimpton P L IH M P T AH N
+plinius P L IH N IY AH S
+plink P L IH NG K
+plinking P L IH NG K IH NG
+plinth P L IH N TH
+pliny P L IH N IY
+pliocene P L AY AH S IY N
+plisetskaya P L IH S AH T S K AY AH
+pliska P L IH S K AH
+plitt P L IH T
+plocar P L OW K AA R
+plocek P L OW CH EH K
+ploch P L AA K
+plocher P L AA K ER
+plock P L AA K
+plod P L AA D
+plodded P L AA D AH D
+plodded(2) P L AA D IH D
+plodding P L AA D IH NG
+ploeger P L OW G ER
+ploetz P L OW T S
+plog P L AA G
+plohn P L OW N
+plonka P L OW NG K AH
+plonski P L AA N S K IY
+ploof P L UW F
+plop P L AA P
+plopped P L AA P T
+plosive P L OW S IH V
+ploss P L AO S
+plot P L AA T
+plotkin P L AA T K IH N
+plotner P L AA T N ER
+plotnick P L AA T N IH K
+plots P L AA T S
+plott P L AA T
+plotted P L AA T AH D
+plotted(2) P L AA T IH D
+plotter P L AA T ER
+plotters P L AA T ER Z
+plotting P L AA T IH NG
+plotts P L AA T S
+plotz P L AA T S
+plouff P L OW F
+plouffe P L OW F
+plough P L AW
+plough(2) P L OW
+ploughed P L AW D
+ploughs P L AW Z
+ploughshare P L AW SH EY R
+ploughshares P L AW SH EY R Z
+plourde P L AO R D
+plover P L AH V ER
+plovers P L AH V ER Z
+plow P L AW
+plowden P L AW D AH N
+plowed P L AW D
+plowing P L AW IH NG
+plowman P L AW M AH N
+plowman's P L AW M AH N Z
+plowright P L AW R AY T
+plows P L AW Z
+plowshare P L AW SH EY R
+plowshares P L AW SH EY R Z
+ploy P L OY
+ploys P L OY Z
+plucinski P L AH CH IH N S K IY
+pluck P L AH K
+pluck's P L AH K S
+plucked P L AH K T
+plucker P L AH K ER
+plucking P L AH K IH NG
+plucks P L AH K S
+plucky P L AH K IY
+plude P L UW D
+plue P L UW
+pluff P L AH F
+plug P L AH G
+plugged P L AH G D
+plugging P L AH G IH NG
+plugs P L AH G Z
+plum P L AH M
+plum's P L AH M Z
+plumage P L UW M AH JH
+plumage(2) P L UW M IH JH
+plumages P L UW M AH JH AH Z
+plumages(2) P L UW M IH JH IH Z
+plumb P L AH M
+plumbed P L AH M D
+plumber P L AH M ER
+plumbers P L AH M ER Z
+plumbing P L AH M IH NG
+plume P L UW M
+plumer P L UW M ER
+plumeri P L UW M EH R IY
+plumes P L UW M Z
+plumlee P L AH M L IY
+plumley P L AH M L IY
+plummer P L AH M ER
+plummet P L AH M AH T
+plummeted P L AH M AH T IH D
+plummeting P L AH M AH T IH NG
+plummets P L AH M AH T S
+plump P L AH M P
+plumped P L AH M P T
+plums P L AH M Z
+plunder P L AH N D ER
+plundered P L AH N D ER D
+plundering P L AH N D ER IH NG
+plunge P L AH N JH
+plunged P L AH N JH D
+plunger P L AH N JH ER
+plunger's P L AH N JH ER Z
+plunges P L AH N JH IH Z
+plunging P L AH N JH IH NG
+plunk P L AH NG K
+plunked P L AH NG K T
+plunker P L AH NG K ER
+plunkers P L AH NG K ER Z
+plunkett P L AH NG K IH T
+plunking P L AH NG K IH NG
+plunkitt P L AH NG K IH T
+plural P L UH R AH L
+pluralism P L UH R AH L IH Z AH M
+pluralistic P L UH R AH L IH S T IH K
+plurality P L ER AE L IH T IY
+pluralize P L UH R AH L AY Z
+pluralized P L UH R AH L AY Z D
+pluralizes P L UH R AH L AY Z IH Z
+pluralizing P L UH R AH L AY Z IH NG
+plurals P L UH R AH L Z
+pluribus P L UH R IH B AH S
+plurilateral P L UH R IH L AE T ER AH L
+plus P L AH S
+plus's P L AH S IH Z
+pluses P L AH S IH Z
+plush P L AH SH
+pluta P L UW T AH
+pluth P L UW TH
+pluto P L UW T OW
+pluto's P L UW T OW Z
+plutocrat P L UW T AH K R AE T
+plutocrats P L UW T AH K R AE T S
+plutonian P L UW T OW N IY AH N
+plutonic P L UW T AA N IH K
+plutonium P L UW T OW N IY AH M
+pluvial P L UW V IY AH L
+ply P L AY
+plybon P L IH B AH N
+plying P L AY IH NG
+plyler P L AY L ER
+plymale P L AY M EY L
+plymouth P L IH M AH TH
+plymouth's P L IH M AH TH S
+plympton P L IH M P T AH N
+plywood P L AY W UH D
+pm P IY EH M
+pneumatic N UW M AE T IH K
+pneumatics N UH M AE T IH K S
+pneumo N UW M OW
+pneumocystis N UW M OW S IH S T IH S
+pneumonia N UW M OW N Y AH
+pneumonia(2) N AH M OW N Y AH
+pneumonic N UW M AA N IH K
+po P OW
+po-jen P OW JH EH N
+poach P OW CH
+poached P OW CH T
+poacher P OW CH ER
+poachers P OW CH ER Z
+poaching P OW CH IH NG
+poag P OW G
+poage P OW IH JH
+poarch P AO R HH
+pobanz P OW B AA N Z
+pobla P OW B L AH
+poblano P OW B L AA N OW
+pobst P AA B S T
+pocahontas P OW K AH HH AA N T AH S
+pocahontas(2) P OW K AH HH AA N AH S
+pocatello P OW K AH T EH L OW
+poch P AA K
+poche P AA CH
+pochiluk P AH CH IY L UW K
+pociask P AH CH IY AH S K
+pocius P OW S IY IH S
+pock P AA K
+pocked P AA K T
+pocket P AA K AH T
+pocketbook P AA K AH T B UH K
+pocketbooks P AA K AH T B UH K S
+pocketed P AA K AH T IH D
+pocketful P AA K AH T F UH L
+pocketing P AA K AH T IH NG
+pockets P AA K AH T S
+pocklington P AA K L IH NG T AH N
+pockmark P AA K M AA R K
+pockmarked P AA K M AA R K T
+pocks P AA K S
+poclain P AA K L IH N
+poco P OW K OW
+pocock P AA K AH K
+pocono P OW K AH N OW
+poconos P OW K AH N OW Z
+pocus P OW K AH S
+pod P AA D
+pod's P AA D Z
+podany P AH D AO N IY
+podell P OW D EY L
+podesta P OW D EH S T AH
+podge P AA JH
+podgorski P AA JH AO R S K IY
+podgurski P AA JH ER S K IY
+podhoretz P AA D HH ER EH T S
+podhoretz(2) P AA D HH AO R EH T S
+podiatrist P AH D AY AH T R IH S T
+podium P OW D IY AH M
+podiums P OW D IY AH M Z
+podleska P AA D L EH S K AH
+podnar P AA D N AA R
+podolak P AH D OW L AH K
+podoll P AA D AH L
+podolski P AH D OW L S K IY
+podolsky P AH D OW L S K IY
+podrasky P AH D R AE S K IY
+podraza P OW D R AA Z AH
+pods P AA D Z
+podunk P OW T AH NG K
+poduska P OW D AH S K AH
+poe P OW
+poe's P OW Z
+poehl P OW L
+poehl's P OW L Z
+poehl's(2) P AO L Z
+poehler P OW L ER
+poehlman P OW L M AH N
+poel P OW AH L
+poelman P OW L M AH N
+poem P OW AH M
+poems P OW AH M Z
+poer P OW ER
+poeschel P OW SH AH L
+poeschl P OW S K AH L
+poet P OW AH T
+poet's P OW AH T S
+poetic P OW EH T IH K
+poetically P OW EH T IH K L IY
+poetry P OW AH T R IY
+poets P OW AH T S
+pofahl P AA F AA L
+poff P AO F
+poffenbarger P AA F IH N B AA R G ER
+poffenberger P AO F AH N B ER G ER
+pog P AA G
+poggi P AA JH IY
+poggioli P OW JH OW L IY
+pogo P OW G OW
+pogorzelski P AH G ER Z EH L S K IY
+pogrom P AH G R AA M
+pogrom(2) P OW G R AH M
+pogroms P AH G R AA M Z
+pogroms(2) P OW G R AH M Z
+pogs P AA G Z
+pogue P OW G
+poh P OW
+pohang P OW HH AE NG
+pohjola P OW JH OW L AH
+pohl P OW L
+pohl's P OW L Z
+pohlad P OW L AE D
+pohle P OW HH AH L
+pohlman P OW L M AH N
+pohlmann P OW L M AH N
+pohnpei P OW N P EY
+poignancy P OY N Y AH N S IY
+poignant P OY N Y AH N T
+poignantly P OY N Y AH N T L IY
+poindexter P OY N D EH K S T ER
+poindexter's P OY N D EH K S T ER Z
+poinot P OY N AA T
+poinsett P OY N S IH T
+poinsettia P OY N S EH T IY AH
+poinsettia(2) P OY N S EH T AH
+poinsettias P OY N S EH T IY AH Z
+poinsettias(2) P OY N S EH T AH Z
+point P OY N T
+point's P OY N T S
+pointe P OY N T
+pointed P OY N T AH D
+pointed(2) P OY N AH D
+pointed(3) P OY N T IH D
+pointedly P OY N T IH D L IY
+pointedly(2) P OY N AH D L IY
+pointenoire P OY N T AH N OY R
+pointer P OY N T ER
+pointers P OY N T ER Z
+pointing P OY N T IH NG
+pointingly P OY N T IH NG L IY
+pointless P OY N T L AH S
+points P OY N T S
+pointy P OY N T IY
+poirier P OY R IY ER
+poirrier P OY R IY ER
+poise P OY Z
+poised P OY Z D
+poison P OY Z AH N
+poisoned P OY Z AH N D
+poisoning P OY Z AH N IH NG
+poisonings P OY Z AH N IH NG Z
+poisonous P OY Z AH N AH S
+poisons P OY Z AH N Z
+poissant P OY Z S AO N T
+poisson P OY Z S AH N
+poitier P OY T Y ER
+poitier(2) P W AA T Y EY
+poitra P OY T R AH
+poitras P OY T R AA Z
+pokazukha P AA K AH Z UW K HH AH
+poke P OW K
+poked P OW K T
+poker P OW K ER
+pokes P OW K S
+pokeweed P OW K W IY D
+pokey P OW K IY
+poking P OW K IH NG
+pokorney P AA K ER N IY
+pokorny P AH K AO R N IY
+pokorski P AH K AO R S K IY
+poky P OW K IY
+pol P AO L
+polacek P AA L AH CH EH K
+polachek P AA L AH K IH K
+polack P OW L AE K
+polak P OW L AH K
+polakoff P AA L AH K AO F
+polakowski P AH L AH K AO F S K IY
+polan P OW L AH N
+polanco P OW L AA N K OW
+poland P OW L AH N D
+poland's P OW L AH N D Z
+polandri P AH L AA N D R IY
+polanski P AH L AE N S K IY
+polansky P AH L AE N S K IY
+polar P OW L ER
+polarimeter P OW L ER IH M AH T ER
+polaris P OW L EH R AH S
+polariscope P OW L EH R AH S K OW P
+polarity P OW L EH R AH T IY
+polarization P OW L ER AH Z EY SH AH N
+polarization(2) P OW L ER IH Z EY SH AH N
+polarize P OW L ER AY Z
+polarized P OW L ER AY Z D
+polarizer P OW L ER AY Z ER
+polarizes P OW L ER AY Z IH Z
+polarizing P OW L ER AY Z IH NG
+polarography P OW L ER AA G R AH F IY
+polaroid P OW L ER OY D
+polaroid's P OW L ER OY D Z
+polaroids P OW L ER OY D Z
+polasek P AH L AA S EH K
+polaski P AH L AA S K IY
+polasky P AH L AA S K IY
+polce P OW L S
+polcyn P OW L S IH N
+polder P OW L D ER
+pole P OW L
+polecat P OW L K AE T
+polecats P OW L K AE T S
+polek P OW L EH K
+polemic P AH L EH M IH K
+polemical P AH L EH M AH K AH L
+polemicist P AH L EH M AH S AH S T
+polemics P OW L EH M IH K S
+polen P OW L AH N
+poles P OW L Z
+poletti P OW L EH T IY
+polevanov P AH L EH V AH N AA V
+polevoi P OW L AH V OY
+poleward P OW L W ER D
+poley P OW L IY
+polgar P OW L G ER
+polhamus P OW L HH AH M IH S
+polhemus P OW L HH IH M AH S
+polhill P OW L HH IH L
+poli P OW L IY
+poli(2) P OW L AY
+policastro P OW L IY K AE S T R OW
+police P AH L IY S
+police's P AH L IY S IH Z
+policed P AH L IY S T
+policeman P AH L IY S M AH N
+policeman's P AH L IY S M AH N Z
+policemen P AH L IY S M IH N
+polices P AH L IY S IH Z
+policewoman P AH L IY S W UH M AH N
+policewomen P AH L IY S W IH M EH N
+polich P AA L IH K
+policies P AA L AH S IY Z
+policing P AH L IY S IH NG
+policy P AA L AH S IY
+policy's P AA L AH S IY Z
+policyholder P AA L AH S IY HH OW L D ER
+policyholder's P AA L AH S IY HH OW L D ER Z
+policyholders P AA L AH S IY HH OW L D ER Z
+policyholders' P AA L AH S IY HH OW L D ER Z
+policymaker P AA L AH S IY M EY K ER
+policymakers P AA L AH S IY M EY K ER Z
+policymaking P AA L AH S IY M EY K IH NG
+polidori P OW L IY D AO R IY
+polidoro P OW L IY D AO R OW
+polifroni P AA L AH F R OW N IY
+polimeni P OW L IY M EH N IY
+polin P OW L IH N
+poling P OW L IH NG
+polino P OW L IY N OW
+polinski P AH L IH N S K IY
+polinsky P AH L IH N S K IY
+polio P OW L IY OW
+poliquin P OW L IY K W IY N
+polis P OW L AH S
+polis(2) P OW L AY Z
+polisario P OW L IH S EH R IY OW
+polish P AA L IH SH
+polish(2) P OW L IH SH
+polished P AA L IH SH T
+polishing P AA L IH SH IH NG
+politano P OW L IY T AA N OW
+politburo P AA L AH T B Y UH R OW
+politburo's P AA L AH T B Y UH R OW Z
+polite P AH L AY T
+politely P AH L AY T L IY
+politeness P AH L AY T N AH S
+polites P AH L AY T S
+politi P OW L IY T IY
+politic P AA L AH T IH K
+political P AH L IH T AH K AH L
+political(2) P AH L IH T IH K AH L
+politically P AH L IH T IH K AH L IY
+politically(2) P L IH T IH K L IY
+politician P AA L AH T IH SH AH N
+politician's P AA L AH T IH SH AH N Z
+politicians P AA L AH T IH SH AH N Z
+politicians' P AA L AH T IH SH AH N Z
+politicization P AH L IH T AH S AH Z EY SH AH N
+politicize P AH L IH T IH S AY Z
+politicized P AH L IH T IH S AY Z D
+politicizing P AH L IH T IH S AY Z IH NG
+politicking P AA L AH T IH K IH NG
+politico P AH L IH T IH K OW
+politicos P AH L IH T IH K OW Z
+politics P AA L AH T IH K S
+politics' P AA L AH T IH K S
+politis P AA L AY T IH S
+polito P OW L IY T OW
+politte P AH L IH T
+polity P AA L AH T IY
+politz P AA L IH T S
+polivka P OW L IY V K AH
+polizzi P OW L IY T S IY
+polje P OW L JH IY
+polk P OW K
+polk's P OW K S
+polk's(2) P OW L K S
+polk(2) P OW L K
+polka P OW L K AH
+polka(2) P OW K AH
+polkas P OW L K AH Z
+polkas(2) P OW K AH Z
+polkinghorn P OW L K IH NG HH AO R N
+poll P OW L
+poll's P OW L Z
+pollack P AA L AH K
+pollack's P AA L AH K S
+pollak P AA L AH K
+pollan P AA L AH N
+polland P AA L AH N D
+pollard P AA L ER D
+pollard's P AA L ER D Z
+polled P OW L D
+pollen P AA L AH N
+pollens P AA L AH N Z
+pollet P AA L IH T
+pollett P AA L IH T
+polley P AA L IY
+pollick P AA L IH K
+pollina P OW L IY N AH
+pollinate P AA L AH N EY T
+pollinated P AA L IH N EY T IH D
+pollinates P AA L AH N EY T S
+pollination P AA L AH N EY SH AH N
+polling P OW L IH NG
+pollinger P OW L IH NG ER
+pollini P AH L IY N IY
+pollinia P AA L IH N IY AH
+pollino P OW L IY N OW
+pollio P AA L IY OW
+pollitt P AA L IH T
+pollman P OW L M AH N
+pollner P OW L N ER
+pollo P AA L OW
+pollock P AA L AH K
+polloi P AA L OY
+pollok P AA L AH K
+polls P OW L Z
+pollster P OW L S T ER
+pollsters P OW L S T ER Z
+pollutant P AH L UW T AH N T
+pollutants P AH L UW T AH N T S
+pollute P AH L UW T
+polluted P AH L UW T AH D
+polluted(2) P AH L UW T IH D
+polluter P AH L UW T ER
+polluters P AH L UW T ER Z
+pollutes P AH L UW T S
+polluting P AH L UW T IH NG
+pollution P AH L UW SH AH N
+pollux P AA L AH K S
+polly P AA L IY
+polly's P AA L IY Z
+pollyanna P AA L IY AE N AH
+pollyannish P AA L IY AE N IH SH
+polo P OW L OW
+polo's P OW L OW Z
+polonaise P AA L AH N EY Z
+polonium P AH L OW N IY AH M
+polonsky P AH L AA N S K IY
+pols P OW L Z
+polsby P OW L Z B IY
+polsinelli P OW L S IY N EH L IY
+polskin P AA L S K IH N
+polskin(2) P OW L S K IH N
+polsky P OW L S K IY
+polson P OW L S AH N
+polster P OW L S T ER
+polston P OW L S T AH N
+poltergeist P OW L T ER G AY S T
+poltergeists P OW L T ER G AY S T S
+poltergeists(2) P OW L T ER G AY S S
+poltergeists(3) P OW L T ER G AY S
+poltrack P OW L T R AE K
+polus P OW L AH S
+poly P AA L IY
+poly's P AA L IY Z
+polyacetylene P AA L IY AH S EH T AH L IY N
+polyak P AA L IY AE K
+polyamide P AA L IY AE M AY D
+polyandrous P AA L IY AE N D R AH S
+polyandry P AA L IY AE N D R IY
+polybutylene P AA L IY B Y UW T AH L IY N
+polycarpic P AA L IH K AA R P IH K
+polycarpic(2) P AA L IY K AA R P IH K
+polycast P AA L IY K AE S T
+polychlorinate P AA L IY K L AO R IH N EY T
+polychlorinated P AA L IY K L AO R IH N EY T IH D
+polychrome P AA L IH K R OW M
+polychrome(2) P AA L IY K R OW M
+polyconomics P AA L IH K AH N AA M IH K S
+polyester P AA L IY EH S T ER
+polyesters P AA L IY EH S T ER Z
+polyethylene P AA L IY EH TH AH L IY N
+polygamous P AH L IH G AH M AH S
+polygamy P AH L IH G AH M IY
+polyglot P AA L IY G L AA T
+polygon P AA L IH G AA N
+polygon(2) P AA L IY G AA N
+polygonal P AH L IH G AH N AH L
+polygram P AA L IY G R AE M
+polygram's P AA L IH G R AE M Z
+polygraph P AA L IH G R AE F
+polygraphs P AA L IY G R AE F S
+polygynous P AH L IH JH AH N AH S
+polygyny P AH L IH JH AH N IY
+polyhedron P AA L IH HH IY D R AH N
+polyhedron(2) P AA L IY HH IY D R AH N
+polyhedrons P AA L IH HH IY D R AH N Z
+polyhedrons(2) P AA L IY HH IY D R AH N Z
+polyhemoglobin P AA L IH HH AH M AA G L AH B IH N
+polyhemoglobin(2) P AA L IY HH AH M AA G L AH B IH N
+polymarker P AA L IY M AA R K ER
+polymarkers P AA L IY M AA R K ER Z
+polymer P AA L AH M ER
+polymerase P AA L IH M ER EY S
+polymerization P AA L IH M ER AH Z EY SH AH N
+polymerize P AA L IH M ER AY Z
+polymerized P AA L IH M ER AY Z D
+polymerizes P AA L IH M ER AY Z AH Z
+polymers P AA L IH M ER Z
+polymorph P AA L IY M AO R F
+polymorphic P AA L IY M AO R F IH K
+polymorphism P AA L IY M AO R F IH Z AH M
+polymorphism(2) P AA L IY M AO R F IH Z M
+polynesia P AA L IH N IY ZH AH
+polynesian P AA L IH N IY ZH AH N
+polynomial P AA L IH N OW M IY AH L
+polyolefin P AA L IY OW L AH F IH N
+polyp P AA L AH P
+polyphase P AA L IH F EY Z
+polyphonic P AA L IH F AA N IH K
+polyphony P AH L IH F AH N IY
+polypropylene P AA L IY P R OW P AH L IY N
+polyps P AA L IH P S
+polysaccharide P AA L IH S AE K ER AY D
+polysaccharide(2) P AA L IY S AE K ER AY D
+polysaccharides P AA L IH S AE K ER AY D Z
+polysaccharides(2) P AA L IY S AE K ER AY D Z
+polysar P AA L IH S AA R
+polysar's P AA L IH S AA R Z
+polysilicon P AA L IY S IH L IH K AA N
+polystyrene P AA L IH S T AY R IY N
+polystyrene(2) P AA L IY S T AY R IY N
+polysyllabic P AA L IY S IH L AE B IH K
+polytech P AA L IH T EH K
+polytech(2) P AA L IY T EH K
+polytechnic P AA L IH T EH K N IH K
+polytechnic(2) P AA L IY T EH K N IH K
+polytechnologies P AA L IY T EH K N AA L AH JH IY Z
+polytechnology P AA L IY T EH K N AA L AH JH IY
+polytheism P AA L IH TH IY IH Z AH M
+polytheistic P AA L IH TH IY IH S T IH K
+polytropic P AA L IY T R AO P IH K
+polyurethane P AA L IY UH R AH TH EY N
+polyvinyl P AA L IY V AY N AH L
+polzer P OW L Z ER
+polzin P OW L Z IH N
+pom P AO M
+poma P OW M AH
+pombo P AA M B OW
+pomerance P AA M ER AE N S
+pomerania P AA M ER EY N IY AH
+pomeranian P AA M ER EY N IY AH N
+pomerantz P AA M ER AE N T S
+pomeranz P AA M ER AE N S
+pomerleau P AA M ER L OW
+pomeroy P AA M ER OY
+pomicino P OW M IH S IY N OW
+pommel P AA M AH L
+pommer P AA M ER
+pommier P AA M IY ER
+pomodoro P AA M AH D AO R OW
+pomography P AH M AA G R AH F IY
+pomology P OW M AA L AH JH IY
+pomona P OW M OW N AH
+pomp P AA M P
+pompa P AA M P AH
+pompadour P AA M P AH D AO R
+pompadur P AA M P AH D ER
+pompano P AA M P AH N OW
+pompeo P OW M P IY OW
+pomper P AA M P ER
+pompey P AA M P IY
+pompidou P AA M P IH D UW
+pompilio P OW M P IY L IY OW
+pomplun P AA M P L AH N
+pompom P AA M P AA M
+pompoms P AA M P AA M Z
+pompon P AA M P AA N
+pomponio P OW M P OW N IY OW
+pompons P AA M P AA N Z
+pomposity P AA M P AA S IH T IY
+pompous P AA M P AH S
+pompousness P AA M P AH S N AH S
+pomrenze P AA M R AH N Z
+pomroy P AA M R OY
+pon P AA N
+ponce P OW N S EY
+ponce(2) P AA N S
+ponce(3) P AA N S EY
+poncet P AA N S AH T
+ponchan P AA N CH AH N
+poncho P AA N CH OW
+ponchos P AA N CH OW Z
+pond P AA N D
+pond's P AA N D Z
+ponder P AA N D ER
+pondered P AA N D ER D
+pondering P AA N D ER IH NG
+ponderosa P AA N D ER OW S AH
+ponderosa's P AA N D ER OW S AH Z
+ponderous P AA N D ER AH S
+ponders P AA N D ER Z
+pondimin P AA N D AH M IH N
+ponds P AA N D Z
+pong P AO NG
+pongratz P AA NG G R AH T S
+poniatowski P AH N IY AH T AO F S K IY
+ponied P OW N IY D
+ponies P OW N IY Z
+pons P AA N Z
+ponsolle P AA N S OW L
+pont P AA N T
+pont's P AA N T S
+pontarelli P OW N T AA R EH L IY
+pontbriand P AA N T B R IY AH N D
+ponte P AA N T
+pontes P OW N T EH S
+ponti P AA N T IY
+pontiac P AA N T IY AE K
+pontiac's P AA N T IY AE K S
+pontiac's(2) P AA N IY AE K S
+pontiac(2) P AA N IY AE K
+pontiacs P AA N T IY AE K S
+pontiacs(2) P AA N IY AE K S
+pontiff P AA N T AH F
+pontiff's P AA N T AH F S
+pontiff(2) P AA N T IH F
+pontifical P AA N T IH F AH K AH L
+pontificate P AA N T IH F AH K EY T
+pontificated P AA N T IH F AH K EY T IH D
+pontificater P AA N T IH F AH K EY T ER
+pontificaters P AA N T IH F AH K EY T ER Z
+pontificates P AA N T IH F AH K EY T S
+pontificating P AA N T IH F AH K EY T IH NG
+pontification P AA N T IH F AH K EY SH AH N
+pontifications P AA N T IH F AH K EY SH AH N Z
+pontikes P AA N T IY K EH Z
+pontillo P OW N T IH L OW
+pontious P OW N SH IH S
+pontius P AA N T IY IH S
+ponto P AA N T OW
+ponton P AA N T AH N
+pontoon P AA N T UW N
+pontoons P AA N T UW N Z
+ponts P AA N T S
+pony P OW N IY
+ponytail P OW N IY T EY L
+ponzetti P AA N Z EH T IY
+ponzi P AA N Z IY
+ponzio P AA N Z IY OW
+ponzo P AA N Z OW
+poo P UW
+pooch P UW CH
+pooches P UW CH IH Z
+poodle P UW D AH L
+poodles P UW D AH L Z
+poof P UW F
+pooh P UW
+pooh-bah P UW B AH
+poohed P UW D
+pool P UW L
+pool's P UW L Z
+pool-side P UW L S AY D
+poolas P UW L AH S
+poole P UW L
+pooled P UW L D
+pooler P UW L ER
+pooley P UW L IY
+pooling P UW L IH NG
+pools P UW L Z
+poolside P UW L S AY D
+poon P UW N
+poop P UW P
+pooped P UW P T
+pooper P UW P ER
+poopers P UW P ER Z
+poops P UW P S
+poor P UH R
+poor's P UH R Z
+poor-spirited P UH R S P IH R IH T IH D
+poor-spiritedness P UH R S P IH R IH T IH D N AH S
+poorbaugh P UH R B AO
+poore P UH R
+poorer P UH R ER
+poorest P UH R IH S T
+poorhouse P UH R HH AW S
+poorly P UH R L IY
+poorman P UH R M AH N
+poors P UH R Z
+poors(2) P AO R Z
+pooser P UW Z ER
+poovey P UW V IY
+pop P AA P
+pop's P AA P S
+popa P OW P AH
+poparelli P OW P AH R EH L IY
+popcorn P AA P K AO R N
+pope P OW P
+pope's P OW P S
+popeil P OW P IY L
+popejoy P OW P JH OY
+popejoy's P OW P JH OY Z
+popek P OW P IH K
+popelka P AH P EH L K AH
+popes P OW P Z
+popeye P AA P AY
+popeye's P AA P AY Z
+popeyes P AO P AY Z
+popham P AA F AH M
+popick P AA P IH K
+popiel P AA P IY L
+popieluszko P OW P IY EH L AH S K OW
+popik P OW P IH K
+popken P AA P K AH N
+popkin P AA P K IH N
+popko P OW P K OW
+poplar P AA P L ER
+poplawski P AH P L AA F S K IY
+poplin P AA P L IH N
+popoff P AA P AO F
+popolare P AA P OW L AA R IY
+popov P OW P AH V
+popovic P AA P AH V IH K
+popovich P AA P AH V IH CH
+popowski P AH P AO F S K IY
+popp P AA P
+poppa P AA P AH
+poppe P AA P
+poppea P AA P IY AH
+popped P AA P T
+poppell P AA P AH L
+poppen P AA P AH N
+popper P AA P ER
+poppers P AA P ER Z
+poppies P AA P IY Z
+popping P AA P IH NG
+poppins P AA P IH N Z
+popple P AA P AH L
+poppleton P AA P AH L T AA N
+popplewell P AA P AH L W EH L
+poppy P AA P IY
+poppy's P AA P IY Z
+poppycock P AA P IY K AO K
+pops P AA P S
+popsicle P AA P S IH K AH L
+popu P OW P Y UW
+populace P AA P Y AH L AH S
+popular P AA P Y AH L ER
+popularity P AA P Y AH L EH R AH T IY
+popularization P AA P Y AH L ER AH Z EY SH AH N
+popularize P AA P Y AH L ER AY Z
+popularized P AA P Y AH L ER AY Z D
+popularizer P AA P Y AH L ER AY Z ER
+popularizing P AA P Y AH L ER AY Z IH NG
+popularly P AA P Y AH L ER L IY
+populate P AA P Y AH L EY T
+populated P AA P Y AH L EY T AH D
+populating P AA P Y AH L EY T IH NG
+population P AA P Y AH L EY SH AH N
+populations P AA P Y AH L EY SH AH N Z
+populism P AA P Y AH L IH Z AH M
+populist P AA P Y AH L AH S T
+populists P AA P Y AH L IH S T S
+populists(2) P AA P Y AH L IH S S
+populists(3) P AA P Y AH L IH S
+populous P AA P Y AH L AH S
+popwell P AA P W EH L
+poquette P AH K EH T
+por P AO R
+porada P AO R AA D AH
+porath P AO R AH TH
+porcaro P AO R K AA R OW
+porcelain P AO R S AH L AH N
+porcelains P AO R S AH L AH N Z
+porcella P AO R CH EH L AH
+porcelli P AO R CH EH L IY
+porcello P AO R CH EH L OW
+porch P AO R CH
+porcher P AO R CH ER
+porcher(2) P AO R SH EY
+porches P AO R CH AH Z
+porches(2) P AO R CH IH Z
+porchia P AO R K IY AH
+porco P AO R K OW
+porcupine P AO R K Y AH P AY N
+porcupines P AO R K Y AH P AY N Z
+pordy P AO R D IY
+pore P AO R
+pored P AO R D
+poremba P AO R EH M B AH
+pores P AO R Z
+porges P AO R JH IH Z
+porgy P AO R G IY
+poring P AO R IH NG
+pork P AO R K
+pork-barrel P AO R K B EH R AH L
+porker P AO R K ER
+porkers P AO R K ER Z
+porky P AO R K IY
+porn P AO R N
+porno P AO R N OW
+pornographer P AO R N AA G R AH F ER
+pornographers P AO R N AA G R AH F ER Z
+pornographic P AO R N AH G R AE F IH K
+pornography P AO R N AA G R AH F IY
+porous P AO R AH S
+porphyritic P AO R F ER IH T IH K
+porphyry P AO R F ER IY
+porpoise P AO R P AH S
+porpoises P AO R P AH S AH Z
+porr P AO R
+porras P AO R AA Z
+porrazzo P AO R AA Z OW
+porreca P AO R EH K AH
+porretta P AO R EH T AH
+porridge P AO R AH JH
+porritt P AO R IH T
+porro P AO R OW
+porsche P AO R SH AH
+porsche's P AO R SH AH Z
+porsche's(2) P AO R SH IH Z
+porsche(2) P AO R SH
+porsches P AO R SH IH Z
+port P AO R T
+port's P AO R T S
+port-angeles P AO R T AE N JH AH L IH S
+port-arthur P AO R T AA R TH ER
+port-au-prince P AO R T OW P R IH N S
+port-clinton P AO R T K L IH N T AH N
+port-london P AO R T L AH N D AH N
+port-victoria P AO R T V IH K T AO R IY AH
+porta P AO R T AH
+portability P AO R T AH B IH L IH T IY
+portable P AO R T AH B AH L
+portables P AO R T AH B AH L Z
+portadown P AO R T AH D AW N
+portage P AO R T AH JH
+portage(2) P AO R T IH JH
+portal P AO R T AH L
+portales P AO R T AA L EH S
+portals P AO R T AH L Z
+portanova P AO R T AA N OW V AH
+portculis P AO R T K AH L IH S
+porte P AO R T
+portec P AO R T EH K
+portec's P AO R T EH K S
+ported P AO R T IH D
+portee P AO R T IY
+portela P AO R T EH L AH
+portell P AO R T EY L
+portelli P AO R T EH L IY
+portend P AO R T EH N D
+portending P AO R T EH N D IH NG
+portends P AO R T EH N D Z
+portent P AO R T EH N T
+portentous P AO R T EH N T AH S
+portents P AO R T EH N T S
+porteous P AO R T IY IH S
+porter P AO R T ER
+porter's P AO R T ER Z
+portera P AO R T EH R AH
+porterages P AO R T ER IH JH IH Z
+porterfield P AO R T ER F IY L D
+porters P AO R T ER Z
+portfolio P AO R T F OW L IY OW
+portfolio's P AO R T F OW L IY OW Z
+portfolios P AO R T F OW L IY OW Z
+porth P AO R TH
+portia P AO R SH AH
+portico P AO R T AH K OW
+portier P AO R T IY ER
+portilla P AO R T IH L AH
+portillo P AO R T IH L OW
+portinadi P AO R T IH N AA D IY
+porting P AO R T IH NG
+portion P AO R SH AH N
+portions P AO R SH AH N Z
+portis P AO R T IH S
+portland P AO R T L AH N D
+portland's P AO R T L AH N D Z
+portlock P AO R T L AA K
+portly P AO R T L IY
+portman P AO R T M AH N
+portner P AO R T N ER
+portney P AO R T N IY
+portnoy P AO R T N OY
+porto P AO R T OW
+portrait P AO R T R AH T
+portraits P AO R T R AH T S
+portray P AO R T R EY
+portrayal P AO R T R EY AH L
+portrayals P AO R T R EY AH L Z
+portrayed P AO R T R EY D
+portraying P AO R T R EY IH NG
+portrays P AO R T R EY Z
+ports P AO R T S
+portsmouth P AO R T S M AH TH
+portugal P AO R CH AH G AH L
+portugal's P AO R CH AH G AH L Z
+portugalia P AO R CH UW G EY L IY AH
+portuguese P AO R CH AH G IY Z
+portwood P AO R T W UH D
+portz P AO R T S
+port_au_prince P AO R T OW P R IH N S
+porzio P AO R Z IY OW
+pos P AA S
+pos(2) P IY OW EH S
+posa P OW S AH
+posada P OW S AA D AH
+posavina P OW S AH V IY N AH
+posavina(2) P AO S AH V IY N AH
+posch P AO SH
+posco P AO S K OW
+pose P OW Z
+posed P OW Z D
+poseidon P AH S AY D AH N
+poseidon's P AH S AY D AH N Z
+posen P OW Z AH N
+poser P OW Z ER
+poses P OW Z AH Z
+poses(2) P OW Z IH Z
+posey P OW Z IY
+posh P AA SH
+poshard P AA SH ER D
+posing P OW Z IH NG
+posit P AA Z AH T
+posited P AA Z AH T AH D
+position P AH Z IH SH AH N
+positioned P AH Z IH SH AH N D
+positioning P AH Z IH SH AH N IH NG
+positions P AH Z IH SH AH N Z
+positive P AA Z AH T IH V
+positively P AA Z AH T IH V L IY
+positives P AA Z AH T IH V Z
+positivism P AA Z AH T IH V IH Z AH M
+positron P AA Z AH T R AA N
+positrons P AA Z AH T R AA N Z
+posits P AA Z AH T S
+posluns P AO Z L AH N Z
+posluszny P AH S L AH SH N IY
+posner P OW Z N ER
+posner's P OW Z N ER Z
+posner's(2) P AO Z N ER Z
+posner(2) P AO Z N ER
+posners P OW Z N ER Z
+posners(2) P AO Z N ER Z
+posnick P AO S N IH K
+pospisil P OW S P IY S IY L
+poss P AO S
+posse P AA S IY
+possehl P AA S AH L
+posses P AA S IY Z
+possess P AH Z EH S
+possessed P AH Z EH S T
+possesses P AH Z EH S AH Z
+possesses(2) P AH Z EH S IH Z
+possessing P AH Z EH S IH NG
+possession P AH Z EH SH AH N
+possessions P AH Z EH SH AH N Z
+possessive P AH Z EH S IH V
+possessiveness P AH Z EH S IH V N AH S
+possessor P AH Z EH S ER
+possibilities P AA S AH B IH L AH T IY Z
+possibility P AA S AH B IH L AH T IY
+possible P AA S AH B AH L
+possibly P AA S AH B L IY
+possum P AA S AH M
+possums P AA S AH M Z
+post P OW S T
+post's P OW S T S
+post-attack P OW S T AH T AE K
+postage P OW S T AH JH
+postage(2) P OW S T IH JH
+postal P OW S T AH L
+postal's P OW S T AH L Z
+postcard P OW S T K AA R D
+postcard(2) P OW S K AA R D
+postcards P OW S T K AA R D Z
+postcards(2) P OW S K AA R D Z
+postcrash P OW S T K R AE SH
+postdate P OW S T D EY T
+postdated P OW S T D EY T AH D
+postdates P OW S T D EY T S
+postdating P OW S T D EY T IH NG
+postdoctoral P OW S T D AA K T ER AH L
+posted P OW S T IH D
+postel P AA S T AH L
+postell P AA S T AH L
+postema P AA S T EH M AH
+posten P OW S T AH N
+poster P OW S T ER
+posteraro P AO S T EH R AA R OW
+posterior P AO S T IH R IY EH R
+posteriors P AO S T IH R IY EH R Z
+posterity P AA S T EH R AH T IY
+posters P OW S T ER Z
+postgame P OW S T G EY M
+posthole P OW S T HH OW L
+postholes P OW S T HH OW L Z
+posthumous P AA S CH UH M AH S
+posthumously P AA S CH UH M AH S L IY
+posting P OW S T IH NG
+postings P OW S T IH NG Z
+postino P AO S T IY N OW
+postipankki P AO S T IH P AE NG K IY
+postit P OW S T IH T
+postle P AA S AH L
+postlethwait P OW S T AH L TH W EY T
+postlewait P AA S T AH L W EY T
+postlewaite P OW S T AH L W EY T
+postma P OW S T M AH
+postman P OW S T M AH N
+postman(2) P OW S M AH N
+postmark P OW S T M AA R K
+postmarked P OW S T M AA R K T
+postmarked(2) P OW S M AA R K T
+postmaster P OW S T M AE S T ER
+postmaster(2) P OW S M AE S T ER
+postmasters P OW S T M AE S T ER Z
+postmasters(2) P OW S M AE S T ER Z
+postmodern P OW S T M AA D ER N
+postmortem P OW S T M AO R T EH M
+postnatal P OW S T N EY T AH L
+poston P OW S T AH N
+postpone P OW S T P OW N
+postpone(2) P OW S P OW N
+postponed P OW S T P OW N D
+postponed(2) P OW S P OW N D
+postponement P OW S T P OW N M AH N T
+postponement(2) P OW S P OW N M AH N T
+postponements P OW S T P OW N M AH N T S
+postponements(2) P OW S P OW N M AH N T S
+postpones P OW S T P OW N Z
+postpones(2) P OW S P OW N Z
+postponing P OW S T P OW N IH NG
+postponing(2) P OW S P OW N IH NG
+postrel P AO S T R EH L
+postrelle P OW S T R EH L
+postretirement P OW S T R IY T AY ER M AH N T
+posts P OW S T S
+posts(2) P OW S S
+posts(3) P OW S
+postscript P OW S K R IH P T
+postscript(2) P OW S T S K R IH P T
+postscripts P OW S K R IH P T S
+postscripts(2) P OW S T S K R IH P T S
+postscripts(3) P OW S K R IH P S
+postscripts(4) P OW S T S K R IH P S
+posttraumatic P OW S T T R AO M AE T IH K
+posttraumatic(2) P OW S T R AO M AE T IH K
+postulate P AA S CH AH L EY T
+postulate(2) P AA S CH AH L AH T
+postulates P AA S CH AH L EY T S
+postulates(2) P AA S CH AH L AH T S
+posture P AA S CH ER
+postures P AA S CH ER Z
+posturing P AA S CH ER IH NG
+posturings P AA S CH ER IH NG Z
+postwar P OW S T W AO R
+posuvalyuk P AA S UW V AA L Y UH K
+pot P AA T
+pot's P AA T S
+potable P OW T AH B AH L
+potamkin P OW T AE M K IH N
+potapov P AA T AH P AA V
+potash P AA T AE SH
+potassium P AH T AE S IY AH M
+potato P AH T EY T OW
+potatoe P AH T EY T OW
+potatoes P AH T EY T OW Z
+potbaryoskin P AA T B AA R Y AO S K AH N
+pote P OW T
+poteat P OW T IY T
+poteet P AA T IY T
+poteete P AA T IY T
+potemkin P AH T EH M K IH N
+potempa P OW T EH M P AH
+poten P OW T AH N
+potency P OW T AH N S IY
+potent P OW T AH N T
+potentate P OW T AH N T EY T
+potentates P OW T AH N T EY T S
+potential P AH T EH N SH AH L
+potential(2) P AH T EH N CH AH L
+potentially P AH T EH N SH AH L IY
+potentially(2) P AH T EH N CH AH L IY
+potentials P AH T EH N CH AH L Z
+potentials(2) P AH T EH N SH AH L Z
+potenza P OW T EH N Z AH
+poth P AA TH
+pothier P OW TH IY ER
+pothitos P AH TH IY T OW S
+pothole P AA T HH OW L
+potholed P AA T HH OW L D
+potholes P AA T HH OW L Z
+potier P OW T IY ER
+potiker P OW T IH K ER
+potion P OW SH AH N
+potions P OW SH AH N Z
+potlatch P AA T L AE CH
+potluck P AA T L AH K
+potocki P AH T OW T S K IY
+potomac P AH T OW M AH K
+potpie P AA T P AY
+potpies P AA T P AY Z
+potpourri P OW P UH R IY
+potpourris P OW P UH R IY Z
+potratz P AA T R AH T S
+pots P AA T S
+potsdam P AA T S D AE M
+potshot P AA SH AA T
+potshots P AA CH AA T S
+pott P AA T
+pottebaum P AA T B AW M
+potted P AA T IH D
+potteiger P AA T AY G ER
+pottenger P AA T IH N JH ER
+potter P AA T ER
+potter's P AA T ER Z
+potters P AA T ER Z
+pottery P AA T ER IY
+potthast P AA TH AH S T
+potthoff P AA T HH AO F
+potthurst P AA T HH ER S T
+pottinger P AA T IH NG ER
+pottle P AA T AH L
+pottorff P AA T ER F
+potts P AA T S
+potty P AA T IY
+potucek P AA T AH CH EH K
+potvin P AA T V IH N
+pou P UW
+pouch P AW CH
+poucher P AW CH ER
+pouches P AW CH AH Z
+poudrier P AW D ER IY ER
+pough P AW
+poughkeepsie P AH K IH P S IY
+poughkeepsie's P AH K IH P S IY Z
+poul P UW L
+poulenc P UW L AH NG K
+poulenc's P UW L AH NG K S
+poulin P UW L AE N
+pouliot P UW L IY OW
+poulos P UW L AH S
+poulsen P AW L S AH N
+poulson P AW L S AH N
+poulter P OW L T ER
+poultice P OW L T AH S
+poultices P OW L T AH S IH Z
+poulton P AW L T AH N
+poultry P OW L T R IY
+pounce P AW N S
+pounced P AW N S T
+pouncey P AW N S IY
+pouncing P AW N S IH NG
+pouncy P UW NG K IY
+pound P AW N D
+pound's P AW N D Z
+pound's(2) P AW N Z
+poundage P AW N D IH JH
+pounded P AW N D IH D
+pounder P AW N D ER
+pounders P AW N D ER Z
+pounding P AW N D IH NG
+pounds P AW N D Z
+pounds(2) P AW N Z
+poundstone P AW N D S T OW N
+poupard P UW P ER D
+pour P AO R
+pourciau P AO R S IY OW
+poured P AO R D
+pouring P AO R IH NG
+pours P AO R Z
+poussaint P UW S AA N T
+poussant P UW S AH N T
+poussin P UW S IH N
+pousson P UW S AA N
+poust P AW S T
+pout P AW T
+pouted P AW T IH D
+pouter P AW T ER
+pouting P AW T IH NG
+poutre P AW T ER
+pouts P AW T S
+pouty P AW T IY
+poveromo P OW V EH R OW M OW
+poverty P AA V ER T IY
+povich P OW V IH CH
+povich's P OW V IH CH IH Z
+pow P AW
+powalsky P OW AE L S K IY
+powder P AW D ER
+powdered P AW D ER D
+powdering P AW D ER IH NG
+powderly P AW D ER L IY
+powders P AW D ER Z
+powdery P AW D ER IY
+powe P AW
+powell P AW AH L
+powell's P OW IH L Z
+powelson P AW AH L S AH N
+power P AW ER
+power's P AW ER Z
+powerball P AW ER B AO L
+powerboat P AW ER B OW T
+powerbook P AW ER B UH K
+powercise P AW R S AY Z
+powered P AW ER D
+powerful P AW ER F AH L
+powerfully P AW ER F L IY
+powergen P AW ER JH EH N
+powerhouse P AW ER HH AW S
+powerhouses P AW ER HH AW S IH Z
+powering P AW ER IH NG
+powerless P AW ER L AH S
+powerlessness P AW ER L AH S N AH S
+powerpc P AW ER P IY S IY
+powerpcs P AW ER P IY S IY Z
+powerpcs' P AW ER P IY S IY Z
+powers P AW ER Z
+powers' P AW ER Z
+powersoft P AW ER S AA F T
+powertrain P AW R T R EY N
+powis P AW IH S
+powles P AW AH L Z
+powless P AW L IH S
+powley P AW L IY
+pownall P AW N AH L
+pows P OW Z
+powter P AW T ER
+powwow P AW W AW
+powwows P AW W AW Z
+pox P AA K S
+poyer P OY ER
+poyner P OY N ER
+poynor P OY N ER
+poynter P OY N T ER
+poynton P OY N T AH N
+poyser P OY S ER
+poythress P OY TH R IH S
+poznan P AA Z N AH N
+poznanski P AH Z N AE N S K IY
+pozner P AA Z N ER
+pozniak P AA Z N IY AE K
+poznikov P AA Z N IH K AA V
+pozo P OW Z OW
+pozos P OW Z OW S
+pozzi P AA Z IY
+ppm P IY P IY EH M
+prab P R AE B
+pracht P R AE K T
+practicable P R AE K T AH K AH B AH L
+practical P R AE K T AH K AH L
+practical(2) P R AE K T IH K AH L
+practicality P R AE K T IH K AE L AH T IY
+practically P R AE K T AH K L IY
+practically(2) P R AE K T AH K AH L IY
+practice P R AE K T AH S
+practice(2) P R AE K T IH S
+practiced P R AE K T AH S T
+practiced(2) P R AE K T IH S T
+practices P R AE K T AH S AH Z
+practices(2) P R AE K T IH S IH Z
+practicing P R AE K T AH S IH NG
+practitioner P R AE K T IH SH AH N ER
+practitioner(2) P R AE K T IH SH N ER
+practitioners P R AE K T IH SH AH N ER Z
+practitioners(2) P R AE K T IH SH N ER Z
+prada P R AA D AH
+pradesh P R AH D EH SH
+pradetto P R AH D EH T OW
+prado P R AA D OW
+praetor P R IY T ER
+praetorian P R IY T AO R IY AH N
+prager P R EY G ER
+pragmatic P R AE G M AE T IH K
+pragmatically P R AE G M AE T IH K AH L IY
+pragmatically(2) P R AE G M AE T IH K L IY
+pragmatism P R AE G M AH T IH Z AH M
+pragmatist P R AE G M AH T IH S T
+pragmatists P R AE G M AH T IH S T S
+pragmatists(2) P R AE G M AH T IH S S
+pragmatists(3) P R AE G M AH T IH S
+prague P R AA G
+prague's P R AA G Z
+prahl P R AA L
+prairie P R EH R IY
+prairie's P R EH R IY Z
+prairies P R EY R IY Z
+praise P R EY Z
+praised P R EY Z D
+praises P R EY Z AH Z
+praises(2) P R EY Z IH Z
+praiseworthy P R EY Z W ER DH IY
+praising P R EY Z IH NG
+prakash P R AA K AA SH
+prall P R AO L
+pralle P R EY L
+pran P R AA N
+pran(2) P R AE N
+prance P R AE N S
+prancer P R AE N S ER
+prances P R AE N S IH Z
+prancing P R AE N S IH NG
+prange P R EY N JH
+pranger P R EY N JH ER
+prank P R AE NG K
+pranks P R AE NG K S
+prankster P R AE NG K S T ER
+pranksters P R AE NG K S T ER Z
+prapas P R AA P AH S
+prasad P R AE S AH D
+prasek P R AA S EH K
+prashant P R AA SH AA N T
+pratap P R AA T AH P
+prater P R EY T ER
+pratfall P R AE T F AO L
+pratfalls P R AE T F AO L Z
+prather P R AE DH ER
+prato P R AA T OW
+prats P R AE T S
+pratt P R AE T
+pratt's P R AE T S
+pratte P R AE T
+prattle P R AE T AH L
+prattled P R AE T AH L D
+prattles P R AE T AH L Z
+prattling P R AE T L IH NG
+prattville P R AE T V IH L
+praun P R AO N
+prause P R AO Z
+pravda P R AE V D AH
+pravda's P R AE V D AH Z
+prawn P R AO N
+prawns P R AO N Z
+praxair P R AE K S EH R
+praxis P R AE K S IH S
+pray P R EY
+prayed P R EY D
+prayer P R EH R
+prayer(2) P R EY ER
+prayerful P R EH R F AH L
+prayerful(2) P R EY ER F AH L
+prayers P R EH R Z
+prayers(2) P R EY ER Z
+praying P R EY IH NG
+prays P R EY Z
+praytor P R EY T ER
+prazak P R AA Z AH K
+prchal P ER SH AE L
+pre P R IY
+preach P R IY CH
+preached P R IY CH T
+preacher P R IY CH ER
+preacher's P R IY CH ER Z
+preachers P R IY CH ER Z
+preaches P R IY CH IH Z
+preaching P R IY CH IH NG
+preachy P R IY CH IY
+preadolescence P R IY AE D AH L EH S IH S
+preadolescent P R IY AE D AH L EH S IH N T
+preakness P R IY K N AH S
+preamble P R IY AE M B AH L
+prearrange P R IY ER EY N JH
+prearranged P R IY ER EY N JH D
+prearranges P R IY ER EY N JH AH Z
+prearranging P R IY ER EY N JH IH NG
+preas P R IY Z
+prebble P R EH B AH L
+prebe P R IY B
+preble P R EH B AH L
+prebon P R IY B AA N
+precambrian P R IY K AE M B R IY AH N
+precancerous P R IY K AE N S ER AH S
+precarious P R IY K EH R IY AH S
+precariously P R IH K EH R IY AH S L IY
+precast P R IY K AE S T
+precaution P R IY K AO SH AH N
+precautionary P R IH K AO SH AH N EH R IY
+precautions P R IY K AO SH AH N Z
+precede P R IH S IY D
+preceded P R IH S IY D IH D
+preceded(2) P R IY S IY D AH D
+preceded(3) P R IY S IY D IH D
+precedence P R EH S AH D AH N S
+precedent P R EH S IH D AH N T
+precedents P R EH S AH D AH N T S
+precedents(2) P R EH S AH D EH N T S
+precedes P R IH S IY D Z
+preceding P R IY S IY D IH NG
+preceed P R IH S IY D
+preceeding P R IH S IY D IH NG
+preceeds P R IH S IY D Z
+precept P R IY S EH P T
+precepts P R IY S EH P T S
+precession P R IY S EH SH AH N
+precht P R EH K T
+prechter P R EH K T ER
+prechtl P R EH K T AH L
+preciado P R EH CH AA D OW
+precinct P R IY S IH NG K T
+precinct(2) P R IY S IH NG K
+precincts P R IY S IH NG K T S
+precincts(2) P R IY S IH NG K S
+precious P R EH SH AH S
+precip P R EH S IH P
+precipice P R EH S AH P AH S
+precipitate P R IH S IH P IH T EY T
+precipitated P R IH S IH P IH T EY T IH D
+precipitating P R IH S IH P AH T EY T IH NG
+precipitation P R IH S IH P IH T EY SH AH N
+precipitous P R IH S IH P IH T AH S
+precipitously P R IY S IH P IH T AH S L IY
+precis P R EY S IY
+precise P R IH S AY S
+precise(2) P R IY S AY S
+precisely P R IH S AY S L IY
+precisely(2) P R IY S AY S L IY
+precision P R IY S IH ZH AH N
+preclinical P R IY K L IH N IH K AH L
+preclude P R IH K L UW D
+preclude(2) P R IY K L UW D
+precluded P R IH K L UW D IH D
+precluded(2) P R IY K L UW D IH D
+precludes P R IH K L UW D Z
+precludes(2) P R IY K L UW D Z
+precluding P R IH K L UW D IH NG
+preclusion P R IH K L UW ZH AH N
+preclusion(2) P R IY K L UW ZH AH N
+precocious P R IH K OW SH AH S
+precocious(2) P R IY K OW SH AH S
+preconceive P R IY K AH N S IY V
+preconceived P R IY K AH N S IY V D
+preconception P R IY K AH N S EH P SH AH N
+preconceptions P R IY K AH N S EH P SH AH N Z
+precondition P R IY K AH N D IH SH AH N
+preconditions P R IY K AH N D IH SH AH N Z
+precook P R IY K UH K
+precooked P R IY K UH K T
+precourt P R IH K AO R T
+precrash P R IY K R AE SH
+precursor P R IY K ER S ER
+precursors P R IY K ER S ER Z
+predaceous P R IY D EY SH AH S
+predate P R IY D EY T
+predated P R IY D EY T IH D
+predates P R IY D EY T S
+predation P R AH D EY SH AH N
+predator P R EH D AH T ER
+predators P R EH D AH T ER Z
+predatory P R EH D AH T AO R IY
+predawn P R IY D AO N
+preddy P R EH D IY
+predecessor P R EH D AH S EH S ER
+predecessor's P R EH D AH S EH S ER Z
+predecessors P R EH D AH S EH S ER Z
+predecessors' P R EH D AH S EH S ER Z
+predestination P R IY D EH S T AH N EY SH AH N
+predestine P R IY D EH S T AH N
+predestined P R IY D EH S T AH N D
+predetermine P R IY D IH T ER M AH N
+predetermine(2) P R IY D IY T ER M AH N
+predetermined P R IY D IY T ER M IH N D
+predicament P R IH D IH K AH M AH N T
+predicament(2) P R IY D IH K AH M AH N T
+predicaments P R IH D IH K AH M AH N T S
+predicate P R EH D AH K EY T
+predicate(2) P R EH D IH K AH T
+predicated P R EH D AH K EY T IH D
+predicates P R EH D AH K EY T S
+predicates(2) P R EH D IH K AH T S
+predicating P R EH D AH K EY T IH NG
+predicating(2) P R EH D IH K AH T IH NG
+predict P R IH D IH K T
+predict(2) P R IY D IH K T
+predictability P R IH D IH K T AH B IH L IH T IY
+predictable P R IH D IH K T AH B AH L
+predictable(2) P R IY D IH K T AH B AH L
+predictably P R IH D IH K T AH B L IY
+predicted P R IH D IH K T IH D
+predicted(2) P R IY D IH K T AH D
+predicted(3) P R IY D IH K T IH D
+predicting P R IH D IH K T IH NG
+predicting(2) P R IY D IH K T IH NG
+prediction P R IY D IH K SH AH N
+predictions P R IY D IH K SH AH N Z
+predictive P R IH D IH K T IH V
+predictive(2) P R IY D IH K T IH V
+predictor P R IH D IH K T ER
+predictors P R IH D IH K T ER Z
+predictors(2) P R IY D IH K T ER Z
+predicts P R IH D IH K T S
+predicts(2) P R IY D IH K T S
+predicts(3) P R IH D IH K S
+predicts(4) P R IY D IH K S
+predilection P R EH D AH L EH K SH AH N
+predilections P R EH D AH L EH K SH AH N Z
+predispose P R IY D IH S P OW Z
+predisposed P R IY D IH S P OW Z D
+predisposing P R IY D IH S P OW Z IH NG
+predisposition P R IY D IH S P AH Z IH SH AH N
+predispositions P R IY D IH S P AH Z IH SH AH N Z
+predmore P R EH D M AO R
+predominance P R IH D AA M AH N AH N S
+predominant P R IH D AA M AH N AH N T
+predominantly P R IH D AA M AH N AH N T L IY
+predominate P R IH D AA M AH N EY T
+predominate(2) P R IH D AA M AH N AH T
+predominated P R IH D AA M AH N EY T IH D
+predominates P R IH D AA M AH N EY T S
+predominating P R IH D AA M AH N EY T IH NG
+pree P R IY
+preece P R IY S
+preelection P R IY IH L EH K SH AH N
+preeminence P R IY EH M AH N AH N S
+preeminent P R IY EH M AH N AH N T
+preempt P R IY EH M P T
+preempted P R IY EH M P T IH D
+preempting P R IY EH M P T IH NG
+preemption P R IY EH M P SH AH N
+preemptive P R IY EH M P T IH V
+preemptively P R IY EH M P T IH V L IY
+preempts P R IY EH M P T S
+preen P R IY N
+preened P R IY N D
+preening P R IY N IH NG
+preexist P R IY IH G Z IH S T
+preexisted P R IY IH G Z IH S T IH D
+preexisting P R IY IH G Z IH S T IH NG
+preexists P R IY IH G Z IH S T S
+preexists(2) P R IY IH G Z IH S S
+preexists(3) P R IY IH G Z IH S
+prefab P R IY F AE B
+prefabricate P R IY F AE B R IH K EY T
+prefabricated P R IY F AE B R IH K EY T IH D
+prefabrication P R IY F AE B R AH K EY SH AH N
+prefabs P R IY F AE B Z
+preface P R EH F AH S
+prefaced P R EH F AH S T
+prefect P R IY F EH K T
+prefectural P R IY F EH K CH ER AH L
+prefecture P R IY F EH K CH ER
+prefer P R AH F ER
+prefer(2) P R IH F ER
+prefer(3) P R IY F ER
+preferable P R EH F ER AH B AH L
+preferable(2) P R EH F R AH B AH L
+preferably P R EH F ER AH B L IY
+preferably(2) P R EH F R AH B L IY
+prefered P R IH F ER D
+preference P R EH F ER AH N S
+preference(2) P R EH F R AH N S
+preferenced P R EH F ER AH N S T
+preferenced(2) P R EH F R AH N S T
+preferences P R EH F ER AH N S IH Z
+preferences(2) P R EH F R AH N S IH Z
+preferential P R EH F ER EH N CH AH L
+preferential(2) P R EH F ER EH N SH AH L
+preferentially P R EH F ER EH N CH AH L IY
+preferentially(2) P R EH F ER EH N SH AH L IY
+preferred P R AH F ER D
+preferred(2) P R IH F ER D
+preferred(3) P R IY F ER D
+preferreds P R IY F ER AH D Z
+preferring P R IH F ER IH NG
+prefers P R AH F ER Z
+prefers(2) P R IH F ER Z
+prefers(3) P R IY F ER Z
+prefix P R IY F IH K S
+prefrontal P R IY F R AH N T AH L
+pregler P R EH G L ER
+pregnancies P R EH G N AH N S IY Z
+pregnancy P R EH G N AH N S IY
+pregnant P R EH G N AH N T
+prego P R EY G OW
+preheim P R EH HH AY M
+prehistoric P R IY HH IH S T AO R IH K
+prehn P R EH N
+preholiday P R IY HH AO L IH D EY
+preignition P R IY AH G N IH SH AH N
+preis P R IY Z
+preiser P R AY S ER
+preisig P R AY Z IH G
+preisler P R AY S AH L ER
+preisler(2) P R AY S L ER
+preiss P R AY S
+prejean P R IY JH IY N
+prejudge P R IY JH AH JH
+prejudged P R IY JH AH JH D
+prejudgment P R IY JH AH JH M AH N T
+prejudice P R EH JH AH D IH S
+prejudiced P R EH JH AH D AH S T
+prejudices P R EH JH AH D IH S IH Z
+prejudicial P R EH JH AH D IH SH AH L
+prejudicing P R EH JH AH D IH S IH NG
+prekindergarten P R IY K IH N D ER G AA D AH N
+prelate P R EH L IH T
+prelate(2) P R IY L EY T
+prelates P R EH L IH T S
+prelim P R IH L IH M
+prelim(2) P R IY L IH M
+preliminaries P R IH L IH M AH N EH R IY Z
+preliminaries(2) P R IY L IH M AH N EH R IY Z
+preliminarily P R IH L IH M AH N EH R IH L IY
+preliminary P R IH L IH M AH N EH R IY
+preliminary(2) P R IY L IH M AH N EH R IY
+prelims P R IY L IH M Z
+prell P R EH L
+prellwitz P R EH L W IH T S
+prelude P R EY L UW D
+preludes P R EY L UW D Z
+prem P R EH M
+premadasa P R IY M AH D AA S AH
+premarin P R EH M ER IH N
+premarital P R IY M EH R AH T AH L
+premark P R IY M AA R K
+premarket P R IY M AA R K AH T
+premature P R IY M AH CH UH R
+prematurely P R IY M AH CH UH R L IY
+premeditate P R IY M EH D AH T EY T
+premeditated P R IY M EH D AH T EY T IH D
+premeditation P R IY M EH D AH T EY SH AH N
+premier P R EH M IH R
+premier's P R EH M IH R Z
+premier's(2) P R IY M IH R Z
+premier(2) P R IY M IH R
+premiere P R EH M IH R
+premiered P R EH M IH R D
+premieres P R EH M IH R Z
+premiering P R EH M IH R IH NG
+premiers P R EH M IH R Z
+premiership P R EH M IH R SH IH P
+premise P R EH M IH S
+premised P R EH M AH S T
+premises P R EH M AH S AH Z
+premium P R IY M IY AH M
+premiums P R IY M IY AH M Z
+premo P R EH M OW
+premodern P R IY M AO D ER N
+premonition P R EH M AH N IH SH AH N
+premonitions P R EH M AH N IH SH AH N Z
+premonitory P R AH M AH N AH T ER IY
+prenatal P R IY N EY T AH L
+prendergast P R EH N D ER G AE S T
+prenger P R EH N JH ER
+prenn P R EH N
+prensa P R EH N S AH
+prentice P R EH N T IH S
+prentiss P R EH N T IH S
+prentnieks P R EH N T N IY EH K S
+prenuptial P R IY N AH P SH AH L
+preoccupation P R IY AA K Y AH P EY SH AH N
+preoccupations P R IY AA K Y AH P EY SH AH N Z
+preoccupied P R IY AA K Y AH P AY D
+preoccupies P R IY AA K Y AH P AY Z
+preoccupy P R IY AA K Y AH P AY
+preordain P R IY AO R D EY N
+preordained P R IY AO R D EY N D
+prep P R EH P
+prepackage P R IY P AE K AH JH
+prepackaged P R IY P AE K AH JH D
+prepaid P R IY P EY D
+preparation P R EH P ER EY SH AH N
+preparations P R EH P ER EY SH AH N Z
+preparatory P R IH P EH R AH T AO R IY
+preparatory(2) P R EH P R AH T AO R IY
+prepare P R IY P EH R
+prepared P R IY P EH R D
+preparedness P R IY P EH R AH D N AH S
+preparer P R IY P EH R ER
+preparers P R IY P EH R ER Z
+prepares P R IY P EH R Z
+prepares(2) P ER P EH R Z
+preparing P R IY P EH R IH NG
+preparing(2) P ER P EH R IH NG
+prepay P R IY P EY
+prepaying P R IY P EY IH NG
+prepayment P R IY P EY M AH N T
+prepayments P R IY P EY M AH N T S
+preplanning P R IY P L AE N IH NG
+preponderance P R IY P AA N D R AH N S
+preposterous P R IH P AA S T ER AH S
+preposterous(2) P R IH P AA S T R AH S
+prepped P R EH P T
+preppie P R EH P IY
+prepping P R EH P IH NG
+preppy P R EH P IY
+prepuce P R EH P Y UW S
+prequel P R IY K W EH L
+prerecord P R IY R IY K AO R D
+prerecord(2) P R IY R IH K AO R D
+prerecorded P R IY R IY K AO R D IH D
+prerequisite P R IY R EH K W AH Z AH T
+prerequisites P R IY R EH K W AH Z AH T S
+prerogative P R IH R AA G AH T IH V
+prerogative(2) P ER AA G AH T IH V
+prerogatives P R IH R AA G AH T IH V Z
+prerogatives(2) P ER AA G AH T IH V Z
+pres P R EH Z
+presage P R EH S IH JH
+presaged P R EH S IH JH D
+presages P R EH S IH JH IH Z
+presaging P R EH S IH JH IH NG
+presale P R IY S EY L
+presario P R IH S AA R IY OW
+presby P R EH S B IY
+presby(2) P R EH Z B IY
+presbyterian P R EH S B IH T IH R IY AH N
+presbyterian(2) P R EH Z B IH T IH R IY AH N
+presbyterians P R EH S B IH T IH R IY AH N Z
+presbyterians(2) P R EH Z B IH T IH R IY AH N Z
+preschel P R EH SH AH L
+prescher P R EH SH ER
+preschool P R IY S K UW L
+preschooler P R IY S K UW L ER
+preschoolers P R IY S K UW L ER Z
+preschools P R IY S K UW L Z
+prescience P R IY SH IY AH N S
+prescient P R EH S IY AH N T
+prescot P R EH S K AH T
+prescott P R EH S K AA T
+prescribe P R AH S K R AY B
+prescribe(2) P R IY S K R AY B
+prescribed P R IY S K R AY B D
+prescriber P R IY S K R AY B ER
+prescribers P R IY S K R AY B ER Z
+prescribes P R IY S K R AY B Z
+prescribing P R IY S K R AY B IH NG
+prescription P R AH S K R IH P SH AH N
+prescriptions P R AH S K R IH P SH AH N Z
+presence P R EH Z AH N S
+presences P R EH Z AH N S IH Z
+present P R EH Z AH N T
+present(2) P R IY Z EH N T
+present(3) P ER Z EH N T
+presentable P R AH Z EH N T AH B AH L
+presentation P R EH Z AH N T EY SH AH N
+presentations P R EH Z AH N T EY SH AH N Z
+presented P R IY Z EH N T AH D
+presented(2) P ER Z EH N T AH D
+presented(3) P R IY Z EH N AH D
+presented(4) P ER Z EH N AH D
+presenter P R EH Z AH N T ER
+presenter(2) P R IY Z EH N T ER
+presenters P R EH Z AH N T ER Z
+presenters(2) P R IY Z EH N T ER Z
+presenting P R IH Z EH N T IH NG
+presenting(2) P R IY Z EH N T IH NG
+presently P R EH Z AH N T L IY
+presentment P R IY Z EH N T M AH N T
+presents P R EH Z AH N T S
+presents(2) P R IY Z EH N T S
+preservation P R EH Z ER V EY SH AH N
+preservationist P R EH Z ER V EY SH AH N IH S T
+preservationists P R EH Z ER V EY SH AH N IH S T S
+preservationists(2) P R EH Z ER V EY SH AH N IH S S
+preservationists(3) P R EH Z ER V EY SH AH N IH S
+preservative P R IY Z ER V AH T IH V
+preservatives P R AH Z ER V AH T IH V Z
+preserve P R AH Z ER V
+preserve(2) P R IH Z ER V
+preserve(3) P R IY Z ER V
+preserved P R AH Z ER V D
+preserved(2) P R IH Z ER V D
+preserved(3) P R IY Z ER V D
+preserver P R IY Z ER V ER
+preserver(2) P R IH Z ER V ER
+preserver(3) P R AH Z ER V ER
+preservers P R IY Z ER V ER Z
+preservers(2) P R AH Z ER V ER Z
+preserves P R AH Z ER V Z
+preserves(2) P R IH Z ER V Z
+preserves(3) P R IY Z ER V Z
+preserving P R AH Z ER V IH NG
+preserving(2) P R IH Z ER V IH NG
+preserving(3) P R IY Z ER V IH NG
+preset P R IY S EH T
+preside P R IH Z AY D
+preside(2) P R IY Z AY D
+presided P R IH Z AY D IH D
+presided(2) P R IY Z AY D AH D
+presided(3) P R IY Z AY D IH D
+presidencies P R EH Z AH D AH N S IY Z
+presidency P R EH Z AH D AH N S IY
+presidency's P R EH Z AH D AH N S IY Z
+president P R EH Z AH D EH N T
+president's P R EH Z IH D AH N T S
+president(2) P R EH Z IH D AH N T
+presidential P R EH Z AH D EH N CH AH L
+presidential's P R EH Z AH D EH N CH AH L Z
+presidential's(2) P R EH Z AH D EH N SH AH L Z
+presidential(2) P R EH Z AH D EH N SH AH L
+presidentialist P R EH Z AH D EH N CH AH L IH S T
+presidentialist(2) P R EH Z AH D EH N SH AH L IH S T
+presidentially P R EH S IH D EH N CH AH L IY
+presidentially(2) P R EH S IH D EH N SH AH L IY
+presidents P R EH Z AH D EH N T S
+presidents' P R EH Z IH D AH N T S
+presidents(2) P R EH Z IH D AH N T S
+presidents(3) P R EH Z IH D AH N S
+presides P R IH Z AY D Z
+presides(2) P R IY Z AY D Z
+presiding P R IH Z AY D IH NG
+presiding(2) P R IY Z AY D IH NG
+presidio P R IH S IH D IY OW
+presidium P R IH S IH D IY AH M
+preslar P R IH S L AA R
+presler P R EH S AH L ER
+presler(2) P R EH S L ER
+presley P R EH S L IY
+presley's P R EH S L IY Z
+presnall P R EH S N AH L
+presnell P R EH S N AH L
+presplit P R IY S P L IH T
+presque-isle P R EH S K AY L
+press P R EH S
+press' P R EH S
+press's P R EH S IH Z
+pressboard P R EH S B AO R D
+pressburger P R EH S B ER G ER
+presse P R EH S
+pressed P R EH S T
+pressel P R EH S AH L
+presser P R EH S ER
+presser's P R EH S ER Z
+presses P R EH S AH Z
+presses(2) P R EH S IH Z
+pressey P R EH S IY
+pressing P R EH S IH NG
+pressler P R EH S L ER
+pressley P R EH S L IY
+pressly P R EH S L IY
+pressman P R EH S M AH N
+pressnell P R EH S N AH L
+presson P R EH S AH N
+presstek P R EH S T EH K
+pressure P R EH SH ER
+pressure's P R EH SH ER Z
+pressured P R EH SH ER D
+pressures P R EH SH ER Z
+pressuring P R EH SH ER IH NG
+pressurization P R EH SH ER IH Z EY SH AH N
+pressurize P R EH SH ER AY Z
+pressurized P R EH SH ER AY Z D
+pressurizes P R EH SH ER AY Z IH Z
+pressurizing P R EH SH ER AY Z IH NG
+presswood P R EH S W UH D
+presswoods P R EH S W UH D Z
+prest P R EH S T
+presta P R EH S T AH
+prestage P R EH S T IH JH
+prestech P R EH S T EH K
+presti P R EH S T IY
+prestia P R EH S T Y AH
+prestidge P R EH S T IH JH
+prestidigitation P R EH S T IH D IH JH AH T EY SH AH N
+prestidigitator P R EH S T IH D IH JH AH T EY T ER
+prestidigitators P R EH S T IH D IH JH AH T EY T ER Z
+prestige P R EH S T IY ZH
+prestigiacomo P R EH S T IY JH AH K OW M OW
+prestigious P R EH S T IH JH AH S
+prestigious(2) P ER S T IY JH AH S
+presto P R EH S T OW
+preston P R EH S T AH N
+preston's P R EH S T AH N Z
+prestowitz P R EH S T AH W IH T S
+prestridge P R EH S T R IH JH
+prestwich P R EH S T W IH CH
+prestwood P R EH S T W UH D
+presumably P R AH Z UW M AH B L IY
+presumably(2) P R IH Z UW M AH B L IY
+presumably(3) P R IY Z UW M AH B L IY
+presume P R IH Z UW M
+presumed P R AH Z UW M D
+presumed(2) P R IH Z UW M D
+presumed(3) P R IY Z UW M D
+presumes P R AH Z UW M Z
+presumes(2) P R IY Z UW M Z
+presuming P R IH Z UW M IH NG
+presuming(2) P R IY Z UW M IH NG
+presumption P R IH Z AH M P SH AH N
+presumption(2) P R IY Z AH M P SH AH N
+presumptions P R IH Z AH M P SH AH N Z
+presumptions(2) P R IY Z AH M P SH AH N Z
+presumptive P R IY Z AH M P T IH V
+presumptuous P R IH Z AH M P CH AH W AH S
+presuppose P R IY S AH P OW Z
+presupposes P R IY S AH P OW Z IH Z
+presupposition P R IY S AH P AH Z IH SH AH N
+presutti P R EH S UW T IY
+preszler P R EH S L ER
+pret P R EH T
+pretax P R IY T AE K S
+prete P R IY T
+preteen P R IY T IY N
+preteens P R IY T IY N Z
+pretend P R IY T EH N D
+pretended P R IY T EH N D AH D
+pretended(2) P R IY T EH N D IH D
+pretender P R IY T EH N D ER
+pretenders P R IY T EH N D ER Z
+pretending P R IY T EH N D IH NG
+pretends P R IY T EH N D Z
+pretense P R IY T EH N S
+pretenses P R IY T EH N S IH Z
+pretension P R IY T EH N SH AH N
+pretensions P R AH T EH N SH AH N Z
+pretentious P R IY T EH N SH AH S
+preterm P R IY T ER M
+pretext P R IY T EH K S T
+pretoria P R IY T AO R IY AH
+pretoria's P R IY T AO R IY AH Z
+pretrial P R IY T R AY AH L
+pretti P R EH T IY
+prettier P R IH T IY ER
+pretties P R IH T IY Z
+prettiest P R IH T IY AH S T
+pretty P R IH T IY
+prettyman P R EH T IY M AH N
+pretzel P R EH T Z AH L
+pretzels P R EH T Z AH L Z
+pretzer P R EH T Z ER
+preuss P R UW S
+preussag P R UW S AE G
+preusser P R OY S ER
+prevail P R IH V EY L
+prevail(2) P R IY V EY L
+prevailed P R IH V EY L D
+prevailed(2) P R IY V EY L D
+prevailing P R IH V EY L IH NG
+prevailing(2) P R IY V EY L IH NG
+prevails P R IH V EY L Z
+prevails(2) P R IY V EY L Z
+preval P R IY V AE L
+prevalence P R EH V AH L AH N S
+prevalent P R EH V AH L AH N T
+prevaricate P R AH V EH R AH K EY T
+prevaricated P R AH V EH R AH K EY T AH D
+prevaricates P R AH V EH R AH K EY T S
+prevaricating P R AH V EH R AH K EY T IH NG
+prevarication P R AH V EH R AH K EY SH AH N
+prevatt P R IH V AE T
+prevatte P R IH V AE T
+prevent P R IH V EH N T
+prevent(2) P R IY V EH N T
+preventable P R IH V EH N T AH B AH L
+preventable(2) P R IY V EH N T AH B AH L
+preventative P R IY V EH N T AH T IH V
+preventatives P R IY V EH N T AH T IH V Z
+prevented P R IH V EH N T IH D
+prevented(2) P R IY V EH N T IH D
+prevented(3) P R IH V EH N IH D
+prevented(4) P R IY V EH N IH D
+preventing P R IH V EH N T IH NG
+preventing(2) P R IY V EH N T IH NG
+preventing(3) P R IH V EH N IH NG
+preventing(4) P R IY V EH N IH NG
+prevention P R IY V EH N SH AH N
+preventive P R IH V EH N T IH V
+preventive(2) P R IY V EH N T IH V
+preventive(3) P R IH V EH N IH V
+preventive(4) P R IY V EH N IH V
+prevents P R IH V EH N T S
+prevents(2) P R IY V EH N T S
+prevette P R IH V EH T
+preview P R IY V Y UW
+previewed P R IY V Y UW D
+previewing P R IY V Y UW IH NG
+previews P R IY V Y UW Z
+previn P R EH V AH N
+previous P R IY V IY AH S
+previously P R IY V IY AH S L IY
+previte P R EH V AY T
+previti P R EH V IY T IY
+prevo P R EH V OW
+prevost P R EY V OW S T
+prew P R UW
+prewar P R IY W AO R
+preway P R IY W EY
+prewett P R UW IH T
+prewitt P R UW IH T
+prey P R EY
+preyed P R EY D
+preyer P R EY ER
+preying P R EY IH NG
+preyista P R EY IH S T AH
+preyistas P R EY IH S T AH Z
+preys P R EY Z
+preziosi P R EH Z IY OW S IY
+prezioso P R EH Z IY OW S OW
+prezzano P R EH Z AA N OW
+pri P R AY
+pri(2) P R IY
+priam P R AY AE M
+priam's P R AY AE M Z
+priam's(2) P R AY AH M Z
+priam(2) P R AY AH M
+pribble P R IH B AH L
+pribula P R IY B UW L AH
+pribyl P R IH B AH L
+price P R AY S
+price's P R AY S IH Z
+priced P R AY S T
+priceless P R AY S L AH S
+pricer P R AY S ER
+prices P R AY S AH Z
+prices(2) P R AY S IH Z
+pricey P R AY S IY
+prichard P R IH CH ER D
+prichett P R IH CH IH T
+pricier P R AY S IY ER
+priciest P R AY S IY IH S T
+pricing P R AY S IH NG
+pricings P R AY S IH NG Z
+prick P R IH K
+pricked P R IH K T
+prickett P R IH K IH T
+prickleback P R IH K AH L B AE K
+pricklebacks P R IH K AH L B AE K S
+prickly P R IH K L IY
+pricks P R IH K S
+pricor P R AY K AO R
+priddy P R IH D IY
+pride P R AY D
+prideaux P R IH D OW
+prided P R AY D IH D
+pridemore P R AY D M AO R
+prides P R AY D Z
+pridgen P R IH JH AH N
+pridgeon P R IH D JH IH N
+pridmore P R IH D M AO R
+priebe P R IY B
+priebke P R IY B K IY
+pried P R AY D
+priem P R IY M
+prien P R IY N
+prier P R AY ER
+pries P R AY Z
+priess P R IY S
+priest P R IY S T
+priest's P R IY S T S
+priester P R IY S T ER
+priestess P R IY S T AH S
+priesthood P R IY S T HH UH D
+priestley P R IY S T L IY
+priestly P R IY S T L IY
+priests P R IY S T S
+priests(2) P R IY S S
+priests(3) P R IY S
+prieta P R IY T AH
+prieta(2) P R IY EY T AH
+prieto P R IY T OW
+prieur P R IY ER
+prig P R IH G
+prigge P R IH G
+prigmore P R IH G M AO R
+prihoda P R IY HH OW D AH
+prijedor P R IH JH EH D ER
+prill P R IH L
+prillaman P R IH L AH M AH N
+prim P R IH M
+prima P R IY M AH
+primack P R IH M AH K
+primacy P R AY M AH S IY
+primakov P R IY M AH K AA V
+primakov(2) P R IY M AH K AA F
+primal P R AY M AH L
+primaries P R AY M EH R IY Z
+primaries(2) P R AY M ER IY Z
+primarily P R AY M EH R AH L IY
+primark P R IH M AA R K
+primary P R AY M EH R IY
+primate P R AY M EY T
+primates P R AY M EY T S
+primavera P R IY M AA V EH R AH
+prime P R AY M
+prime's P R AY M Z
+primeau P R IH M OW
+primeaux P R IH M OW
+primebank P R AY M B AE NG K
+primeco P R AY M K OW
+primed P R AY M D
+primenews P R AY M N UW Z
+primer P R AY M ER
+primerica P R IH M EH R IH K AH
+primerica's P R IH M EH R IH K AH Z
+primers P R AY M ER Z
+primes P R AY M Z
+primestar P R AY M S T AA R
+primetime P R AY M T AY M
+primeval P R AY M IY V AH L
+primiano P R IY M IY AA N OW
+priming P R AY M IH NG
+primitive P R IH M AH T IH V
+primitive(2) P R IH M IH T IH V
+primitivistic P R IH M IH T IH V IH S T IH K
+primly P R IH M L IY
+primm P R IH M
+primmer P R IH M ER
+primo P R IY M OW
+primo's P R IY M OW Z
+primordial P R IH M AO R D IY AH L
+primordial(2) P R AY M AO R D IY AH L
+primp P R IH M P
+primrose P R IH M R OW Z
+primroses P R IH M R OW Z AH Z
+primroses(2) P R IH M R OW Z IH Z
+primus P R AY M AH S
+prince P R IH N S
+prince's P R IH N S IH Z
+princely P R IH N S L IY
+princes P R IH N S AH Z
+princes(2) P R IH N S IH Z
+princess P R IH N S EH S
+princess' P R IH N S EH S
+princess's P R IH N S EH S IH Z
+princesses P R IH N S EH S IH Z
+princeton P R IH N S T AH N
+princeton's P R IH N S T AH N Z
+princeville P R IH N S V IH L
+principal P R IH N S AH P AH L
+principal's P R IH N S AH P AH L Z
+principalities P R IH N S IH P AE L IH T IY Z
+principality P R IH N S IH P AE L IH T IY
+principally P R IH N S IH P L IY
+principals P R IH N S AH P AH L Z
+principato P R IY N CH IY P AA T OW
+principe P R IY N CH IY P IY
+principia P R IH N S IH P IY AH
+principle P R IH N S AH P AH L
+principled P R IH N S AH P AH L D
+principles P R IH N S AH P AH L Z
+prindiville P R IY N D IY V IH L
+prindl P R IH N D AH L
+prindle P R IH N D AH L
+prine P R AY N
+pring P R IH NG
+pringle P R IH NG G AH L
+pringle's P R IH NG G AH L Z
+prinkey P R IH NG K IY
+prinos P R IY N OW S
+prins P R IH N Z
+prinsen P R IH N S AH N
+print P R IH N T
+printable P R IH N T AH B AH L
+printed P R IH N T AH D
+printed(2) P R IH N T IH D
+printed(3) P R IH N AH D
+printed(4) P R IH N IH D
+printemps P R IH N T EH M P S
+printer P R IH N T ER
+printer's P R IH N T ER Z
+printer's(2) P R IH N ER Z
+printer(2) P R IH N ER
+printers P R IH N T ER Z
+printers(2) P R IH N ER Z
+printing P R IH N T IH NG
+printing's P R IH N T IH NG Z
+printing's(2) P R IH N IH NG Z
+printing(2) P R IH N IH NG
+printings P R IH N T IH NG Z
+printings(2) P R IH N IH NG Z
+printmaker P R IH N T M EY K ER
+printmakers P R IH N T M EY K ER Z
+printmaking P R IH N T M EY K IH NG
+printon P R IH N T AH N
+printout P R IH N T AW T
+printouts P R IH N T AW T S
+prints P R IH N T S
+printup P R IH N T AH P
+printy P R IH N T IY
+printz P R IH N T S
+prinz P R IH N Z
+prinz's P R IH N Z AH Z
+priola P R IY OW L AH
+prioleau P R IY OW L OW
+priolo P R IY OW L OW
+prior P R AY ER
+priore P R IY AO R IY
+priore(2) P R AY AO R AY
+priorities P R AY AO R AH T IY Z
+prioritize P R AY AO R AH T AY Z
+prioritized P R AY AO R AH T AY Z D
+prioritizes P R AY AO R AH T AY Z IH Z
+prioritizing P R AY AO R AH T AY Z IH NG
+priority P R AY AO R AH T IY
+priors P R AY ER Z
+priory P R AY ER IY
+priroda P R AH R OW D AH
+pris P R IH S
+prisburg P R IH S B ER G
+priscilla P R IH S IH L AH
+priscilla's P R IH S IH L AH Z
+prisco P R IY S K OW
+prisk P R IH S K
+prism P R IH Z AH M
+prismatic P R IH Z M AE T IH K
+prisms P R IH Z AH M Z
+prison P R IH Z AH N
+prison's P R IH Z AH N Z
+prisoned P R IH Z AH N D
+prisoner P R IH Z AH N ER
+prisoner's P R IH Z AH N ER Z
+prisoner's(2) P R IH Z N ER Z
+prisoner(2) P R IH Z N ER
+prisoners P R IH Z AH N ER Z
+prisoners' P R IH Z AH N ER Z
+prisoners'(2) P R IH Z N ER Z
+prisoners(2) P R IH Z N ER Z
+prisons P R IH Z AH N Z
+prissie P R IH S IY
+prissy P R IH S IY
+pristine P R IH S T IY N
+pritchard P R IH CH ER D
+pritchett P R IH CH IH T
+prithvi P R IH TH V IY
+pritt P R IH T
+pritts P R IH T S
+pritz P R IH T S
+pritzker P R IH T S K ER
+pritzkers P R IH T S K ER Z
+pritzl P R IH T Z AH L
+privacies P R AY V AH S IY Z
+privacy P R AY V AH S IY
+private P R AY V AH T
+private-eye P R AY V AH T AY
+privately P R AY V AH T L IY
+privates P R AY V AH T S
+privation P R AY V EY SH AH N
+privations P R AY V EY SH AH N Z
+privatisation P R AY V AH T AH Z EY SH AH N
+privatization P R AY V AH T AH Z EY SH AH N
+privatizations P R AY V AH T AH Z EY SH AH N Z
+privatize P R IH V AH T AY Z
+privatized P R AY V AH T AY Z D
+privatizing P R AY V AH T AY Z IH NG
+privett P R IH V IH T
+privette P R IH V EH T
+privilege P R IH V L AH JH
+privilege(2) P R IH V L IH JH
+privilege(3) P R IH V IH L AH JH
+privilege(4) P R IH V IH L IH JH
+privileged P R IH V L AH JH D
+privileged(2) P R IH V L IH JH D
+privileged(3) P R IH V IH L AH JH D
+privileged(4) P R IH V IH L IH JH D
+privileges P R IH V L AH JH AH Z
+privileges(2) P R IH V L IH JH IH Z
+privileges(3) P R IH V IH L AH JH AH Z
+privileges(4) P R IH V IH L IH JH IH Z
+privitera P R IY V IY T EH R AH
+privott P R IH V AH T
+privy P R IH V IY
+prix P R IY
+priyam P R IY AH M
+prizant P R IY Z AA N T
+prize P R AY Z
+prized P R AY Z D
+prizes P R AY Z AH Z
+prizes(2) P R AY Z IH Z
+prizm P R IH Z AH M
+pro P R OW
+pro's P R OW Z
+proactive P R OW AE K T IH V
+proactively P R OW AE K T IH V L IY
+prob P R AA B
+prob(2) P R OW B
+proba P R OW B AH
+probabilities P R AA B AH B IH L AH T IY Z
+probability P R AA B AH B IH L AH T IY
+probable P R AA B AH B AH L
+probably P R AA B AH B L IY
+probably(2) P R AA B L IY
+probasco P R OW B AA S K OW
+probate P R OW B EY T
+probation P R OW B EY SH AH N
+probationary P R OW B EY SH AH N EH R IY
+probationer P R OW B EY SH AH N ER
+probationers P R OW B EY SH AH N ER Z
+probative P R OW B EY T IH V
+probe P R OW B
+probe's P R OW B Z
+probed P R OW B D
+probenecid P R AA B EH N AH S IH D
+probert P R AA B ER T
+probes P R OW B Z
+probing P R OW B IH NG
+probity P R OW B AH T IY
+problem P R AA B L AH M
+problem's P R AA B L AH M Z
+problematic P R AA B L AH M AE T IH K
+problematical P R AA B L AH M AE T IH K AH L
+problems P R AA B L AH M Z
+proboscis P R OW B AA S AH S
+probst P R AA B S T
+probursa P R OW B ER S AH
+probus P R OW B IH S
+procaccini P R OW K AA CH IY N IY
+procaine P R OW K EY N
+procardia P R OW K AA R D IY AH
+procassini P R AA K AH S IY N IY
+procedural P R AH S IY JH ER AH L
+procedurally P R AH S IY JH ER AH L IY
+procedurally(2) P R AH S IY JH R AH L IY
+procedure P R AH S IY JH ER
+procedure(2) P R OW S IY JH ER
+procedures P R AH S IY JH ER Z
+procedures(2) P R OW S IY JH ER Z
+proceed P R AH S IY D
+proceed(2) P R OW S IY D
+proceed(3) P ER S IY D
+proceeded P R AH S IY D AH D
+proceeded(2) P R OW S IY D IH D
+proceeding P R AH S IY D IH NG
+proceeding(2) P R OW S IY D IH NG
+proceedings P R OW S IY D IH NG Z
+proceedings(2) P R AH S IY D IH NG Z
+proceeds P R AH S IY D Z
+proceeds(2) P R OW S IY D Z
+procell P R OW S EH L
+proceso P R OW S EH S OW
+process P R AA S EH S
+process(2) P R AO S EH S
+processed P R AA S EH S T
+processes P R AA S EH S AH Z
+processing P R AA S EH S IH NG
+procession P R AH S EH SH AH N
+procession(2) P R OW S EH SH AH N
+processional P R AH S EH SH AH N AH L
+processional(2) P R OW S EH SH AH N AH L
+processions P R OW S EH SH AH N Z
+processor P R AA S EH S ER
+processor's P R AA S EH S ER Z
+processors P R AA S EH S ER Z
+proch P R AA K
+prochaska P R AH HH AA S K AH
+prochazka P R AH HH AA Z K AH
+prochnow P R AA N AW
+procida P R OW CH IY D AH
+prock P R AA K
+prockter P R AA K T ER
+proclaim P R OW K L EY M
+proclaimed P R OW K L EY M D
+proclaiming P R OW K L EY M IH NG
+proclaims P R OW K L EY M Z
+proclamation P R AA K L AH M EY SH AH N
+proclamations P R AA K L AH M EY SH AH N Z
+proclivities P R OW K L IH V AH T IY Z
+proclivity P R OW K L IH V AH T IY
+proconsul P R OW K AA N S AH L
+procopio P R OW K OW P IY OW
+procordia P R AA K AO R D IY AH
+procrastinate P R AH K R AE S T AH N EY T
+procrastinated P R AH K R AE S T AH N EY T AH D
+procrastinates P R AH K R AE S T AH N EY T S
+procrastinating P R AH K R AE S T AH N EY T IH NG
+procrastination P R AH K R AE S T AH N EY SH AH N
+procrastinator P R AH K R AE S T AH N EY T ER
+procrastinators P R AH K R AE S T AH N EY T ER Z
+procreate P R OW K R IY EY T
+procreated P R OW K R IY EY T AH D
+procreates P R OW K R IY EY T S
+procreating P R OW K R IY EY T IH NG
+procreation P R OW K R IY EY SH AH N
+procter P R AA K T ER
+proctor P R AA K T ER
+proctor's P R AA K T ER Z
+proctors P R AA K T ER Z
+proctorsilex P R AO K T ER S AY L EH K S
+procure P R OW K Y UH R
+procured P R OW K Y UH R D
+procurement P R OW K Y UH R M AH N T
+procurements P R OW K Y UH R M AH N T S
+procurer P R OW K Y UH R ER
+procuring P R OW K Y UH R IH NG
+procyte P R OW S AY T
+prod P R AA D
+prodded P R AA D IH D
+prodding P R AA D IH NG
+prodi P R OW D IY
+prodi's P R OW D IY Z
+prodigal P R AA D IH G AH L
+prodigies P R AA D AH JH IY Z
+prodigious P R AH D IH JH AH S
+prodigiously P R OW D IH JH IH S L IY
+prodigy P R AA D AH JH IY
+prodigy's P R AA D AH JH IY Z
+prods P R AA D Z
+produc P R OW D UW K
+produce P R AH D UW S
+produce(2) P R OW D UW S
+produced P R AH D UW S T
+producer P R AH D UW S ER
+producer's P R AH D UW S ER Z
+producers P R AH D UW S ER Z
+producers' P R AH D UW S ER Z
+produces P R AH D UW S AH Z
+produces(2) P R AH D UW S IH Z
+producing P R AH D UW S IH NG
+product P R AA D AH K T
+product's P R AA D AH K T S
+product's(2) P R AA D AH K S
+production P R AH D AH K SH AH N
+production's P R OW D AH K SH AH N Z
+production's(2) P R AH D AH K SH AH N Z
+production's(3) P ER D AH K SH AH N Z
+production(2) P R OW D AH K SH AH N
+production(3) P ER D AH K SH AH N
+productions P R AH D AH K SH AH N Z
+productions' P R AH D AH K SH AH N Z
+productions'(2) P R OW D AH K SH AH N Z
+productions'(3) P ER D AH K SH AH N Z
+productions(2) P R OW D AH K SH AH N Z
+productions(3) P ER D AH K SH AH N Z
+productive P R AH D AH K T IH V
+productive(2) P R OW D AH K T IH V
+productive(3) P ER D AH K T IH V
+productively P R AH D AH K T IH V L IY
+productively(2) P R OW D AH K T IH V L IY
+productively(3) P ER D AH K T IH V L IY
+productivity P R OW D AH K T IH V AH T IY
+productivity(2) P R OW D AH K T IH V IH T IY
+products P R AA D AH K T S
+products' P R AO D AH K T S
+products'(2) P R AO D AH K S
+products(2) P R AA D AH K S
+prody P OW D IY
+proehl P R OW L
+prof. P R AO F
+prof.(2) P R AH F EH S ER
+profanation P R AO F AH N EY SH AH N
+profane P R OW F EY N
+profanity P R OW F AE N AH T IY
+profess P R AH F EH S
+professed P R AH F EH S T
+professes P R AH F EH S IH Z
+professing P R AH F EH S IH NG
+profession P R AH F EH SH AH N
+profession's P R AH F EH SH AH N Z
+professional P R AH F EH SH AH N AH L
+professionalism P R AH F EH SH AH N AH L IH Z AH M
+professionalize P R AH F EH SH AH N AH L AY Z
+professionalized P R AH F EH SH AH N AH L AY Z D
+professionally P R AH F EH SH AH N AH L IY
+professionally(2) P R AH F EH SH N AH L IY
+professionals P R AH F EH SH AH N AH L Z
+professionals' P R AH F EH SH AH N AH L Z
+professions P R AH F EH SH AH N Z
+professor P R AH F EH S ER
+professor's P R AH F EH S ER Z
+professorial P R OW F AH S AO R IY AH L
+professors P R AH F EH S ER Z
+professors' P R AH F EH S ER Z
+professorship P R AH F EH S ER SH IH P
+professorships P R AH F EH S ER SH IH P S
+profeta P R OW F EH T AH
+proffer P R AA F ER
+proffered P R AA F ER D
+proffering P R AA F ER IH NG
+proffit P R AA F IH T
+proffitt P R AA F IH T
+proficiency P R AH F IH SH AH N S IY
+proficient P R AA F IH SH AH N T
+profile P R OW F AY L
+profiled P R OW F AY L D
+profiles P R OW F AY L Z
+profiling P R OW F AY L IH NG
+profit P R AA F AH T
+profit(2) P R AA F IH T
+profitability P R AA F IH T AH B IH L IH T IY
+profitable P R AA F AH T AH B AH L
+profitably P R AA F AH T AH B L IY
+profited P R AA F AH T AH D
+profiteer P R AA F AH T IH R
+profiteering P R AA F AH T IH R IH NG
+profiteers P R AA F AH T IH R Z
+profiting P R AA F AH T IH NG
+profits P R AA F IH T S
+profitt P R AA F IH T
+profittaking P R AA F IH T T EY K IH NG
+profligacy P R AO F L IH G AE S IY
+profligate P R AO F L IH G EY T
+profound P R OW F AW N D
+profoundly P R OW F AW N D L IY
+profs P R AA F S
+profuse P R AH F Y UW S
+profusely P R AH F Y UW S L IY
+profusion P R AH F Y UW ZH AH N
+progenitor P R OW JH EH N IH T ER
+progeny P R AA JH AH N IY
+progesterone P R OW JH EH S T ER OW N
+progestin P R OW JH EH S T IH N
+proglacial P R OW G L EY SH AH L
+prognoses P R AA G N OW S IY Z
+prognosis P R AA G N OW S AH S
+prognosticate P R AA G N AA S T AH K EY T
+prognosticated P R AA G N AA S T AH K EY T IH D
+prognosticater P R AA G N AA S T AH K EY T ER
+prognosticates P R AA G N AA S T AH K EY T S
+prognosticating P R AA G N AA S T AH K EY T IH NG
+prognostication P R AA G N AA S T AH K EY SH AH N
+prognostications P R AA G N AA S T AH K EY SH AH N Z
+prognosticative P R AA G N AA S T AH K EY T IH V
+program P R OW G R AE M
+program's P R OW G R AE M Z
+programing P R OW G R AE M IH NG
+programmable P R OW G R AE M AH B AH L
+programmatic P R AA G R AH M AE T IH K
+programme P R OW G R AE M
+programmed P R OW G R AE M D
+programmer P R OW G R AE M ER
+programmers P R OW G R AE M ER Z
+programming P R OW G R AE M IH NG
+programs P R OW G R AE M Z
+programs' P R OW G R AE M Z
+progress P R AA G R EH S
+progress(2) P R AH G R EH S
+progress(3) P R OW G R EH S
+progressed P R AH G R EH S T
+progresses P R AA G R EH S AH Z
+progresses(2) P R OW G R EH S AH Z
+progressing P R AH G R EH S IH NG
+progression P R AH G R EH SH AH N
+progressive P R AH G R EH S IH V
+progressively P R AA G R EH S IH V L IY
+progressives P R AA G R EH S IH V Z
+progressivity P R AA G R EH S IH V AH T IY
+prohaska P R AH HH AA S K AH
+prohibit P R OW HH IH B AH T
+prohibited P R OW HH IH B AH T AH D
+prohibiting P R OW HH IH B AH T IH NG
+prohibition P R OW AH B IH SH AH N
+prohibition's P R OW AH B IH SH AH N Z
+prohibitions P R OW AH B IH SH AH N Z
+prohibitive P R OW HH IH B AH T IH V
+prohibitively P R OW HH IH B AH T IH V L IY
+prohibitory P R OW HH IH B AH T AO R IY
+prohibits P R OW HH IH B AH T S
+proia P R OW Y AH
+proietti P R OY EH T IY
+project P R AA JH EH K T
+project's P R AA JH EH K T S
+project's(2) P R AA JH EH K S
+project(2) P R AH JH EH K T
+projected P R AH JH EH K T AH D
+projectile P R AH JH EH K T AH L
+projectile(2) P R AH JH EH K T AY L
+projectiles P R AH JH EH K T AH L Z
+projectiles(2) P R AH JH EH K T AY L Z
+projecting P R AH JH EH K T IH NG
+projection P R AH JH EH K SH AH N
+projections P R AH JH EH K SH AH N Z
+projective P R AH JH EH K T IH V
+projector P R AH JH EH K T ER
+projectors P R AH JH EH K T ER Z
+projects P R AA JH EH K T S
+projects' P R AO JH EH K T S
+projects'(2) P R AO JH EH K S
+projects(2) P R AH JH EH K T S
+projects(3) P R AA JH EH K S
+projects(4) P R AH JH EH K S
+prokofiev P R AA K OW F IY V
+prokop P R OW K AH P
+prolactin P R OW L AE K T AH N
+proler P R OW L ER
+proletarian P R OW L AH T EH R IY AH N
+proletariat P R OW L AH T EH R IY AH T
+proleukin P R OW L UW K IH N
+proliferate P R OW L IH F ER EY T
+proliferated P R AH L IH F ER EY T IH D
+proliferates P R OW L IH F ER EY T S
+proliferating P R OW L IH F ER EY T IH NG
+proliferation P R OW L IH F ER EY SH AH N
+prolific P R OW L IH F IH K
+prolifically P R OW L IH F IH K L IY
+prolinea P R OW L IH N IY AH
+prolog P R OW L AA G
+prologue P R OW L AA G
+prolong P R AH L AO NG
+prolonged P R AH L AO NG D
+prolonging P R OW L AO NG IH NG
+prolongs P R AH L AO NG Z
+prom P R AA M
+promenade P R AA M AH N EY D
+promenades P R AA M AH N EY D Z
+promethium P R AH M IY TH IY AH M
+promilacidic P R OW M IH L AH S IY D IH K
+prominence P R AA M AH N AH N S
+prominences P R AA M AH N AH N S AH Z
+prominent P R AA M AH N AH N T
+prominently P R AA M AH N AH N T L IY
+promiscuity P R OW M IH S K Y UW AH T IY
+promiscuity(2) P R AA M IH S K Y UW AH T IY
+promiscuous P R OW M IH S K W AH S
+promiscuous(2) P R AA M IH S K Y UW AH S
+promise P R AA M AH S
+promised P R AA M AH S T
+promises P R AA M AH S AH Z
+promising P R AA M AH S IH NG
+promissory P R AA M AH S AO R IY
+promo P R OW M OW
+promos P R OW M OW Z
+promote P R AH M OW T
+promoted P R AH M OW T AH D
+promoter P R AH M OW T ER
+promoters P R AH M OW T ER Z
+promotes P R AH M OW T S
+promoting P R AH M OW T IH NG
+promotion P R AH M OW SH AH N
+promotion(2) P ER M OW SH AH N
+promotional P R AH M OW SH AH N AH L
+promotional(2) P ER M OW SH AH N AH L
+promotions P R AH M OW SH AH N Z
+promotions(2) P ER M OW SH AH N Z
+prompt P R AA M P T
+prompted P R AA M P T AH D
+prompted(2) P R AA M P T IH D
+prompting P R AA M P T IH NG
+promptly P R AA M P T L IY
+promptly(2) P R AA M P L IY
+prompts P R AA M P T S
+prompts(2) P R AA M P S
+proms P R AA M Z
+promster P R AA M S T ER
+promsters P R AA M S T ER Z
+promulgate P R OW M AH L G EY T
+promulgated P R AA M AH L G EY T AH D
+promulgates P R OW M AH L G EY T S
+promulgating P R AA M AH L G EY T IH NG
+promus P R OW M AH S
+prone P R OW N
+prong P R AO NG
+pronged P R AO NG D
+pronger P R AO N G ER
+pronghorn P R AO NG HH AO R N
+prongs P R AO NG Z
+pronoun P R OW N AW N
+pronounce P R AH N AW N S
+pronounced P R AH N AW N S T
+pronouncement P R AH N AW N S M AH N T
+pronouncements P R AH N AW N S M AH N T S
+pronounces P R AH N AW N S IH Z
+pronouncing P R AH N AW N S IH NG
+pronouns P R OW N AW N Z
+pronovost P R OW N OW V OW S T
+pronto P R AA N T OW
+pronunciation P R OW N AH N S IY EY SH AH N
+pronunciation(2) P R AH N AH N S IY EY SH AH N
+pronunciations P R OW N AH N S IY EY SH AH N Z
+pronunciations(2) P R AH N AH N S IY EY SH AH N Z
+proof P R UW F
+proofed P R UW F T
+proofing P R UW F IH NG
+proofread P R UW F R IY D
+proofreading P R UW F R IY D IH NG
+proofs P R UW F S
+prop P R AA P
+propaganda P R AA P AH G AE N D AH
+propagandist P R AA P AH G AE N D AH S T
+propagandistic P R AA P AH G AH N D IH S T IH K
+propagandists P R AA P AH G AE N D AH S T S
+propagandists(2) P R AA P AH G AE N D AH S S
+propagandists(3) P R AA P AH G AE N D AH S
+propagandize P R AA P AH G AE N D AY Z
+propagate P R AA P AH G EY T
+propagated P R AA P AH G EY T IH D
+propagating P R AA P AH G EY T IH NG
+propagation P R AA P AH G EY SH AH N
+propane P R OW P EY N
+propel P R AH P EH L
+propellant P R AH P EH L AH N T
+propellants P R OW P EH L AH N T S
+propelled P R AH P EH L D
+propeller P R AH P EH L ER
+propellers P R AH P EH L ER Z
+propelling P R AH P EH L IH NG
+propels P R AH P EH L Z
+propensities P R AH P EH N S AH T IY Z
+propensity P R AH P EH N S IH T IY
+proper P R AA P ER
+properly P R AA P ER L IY
+properties P R AA P ER T IY Z
+properties' P R OW P ER T IY Z
+property P R AA P ER T IY
+property's P R AA P ER T IY Z
+propes P R OW P S
+propfan P R AA P F AE N
+prophecies P R AA F AH S IY Z
+prophecy P R AA F AH S IY
+prophesied P R AA F AH S AY D
+prophesied(2) P R AA F AH S IY D
+prophesies P R AA F AH S AY Z
+prophet P R AA F AH T
+prophetess P R AA F AH T AH S
+prophetic P R AH F EH T IH K
+prophets P R AA F AH T S
+prophylactic P R AA F IH L AE K T IH K
+prophylactic(2) P R OW F IH L AE K T IH K
+propionic P R OW P IY AA N IH K
+propitious P R AH P IH SH AH S
+proponent P R AH P OW N AH N T
+proponents P R AH P OW N AH N T S
+proportion P R AH P AO R SH AH N
+proportional P R AH P AO R SH AH N AH L
+proportionality P R AH P AO R SH AH N AE L IH T IY
+proportionally P R AH P AO R SH AH N AH L IY
+proportionally(2) P R AH P AO R SH N AH L IY
+proportionate P R AH P AO R SH AH N AH T
+proportionately P R AH P AO R SH AH N AH T L IY
+proportioned P R AH P AO R SH AH N D
+proportions P R AH P AO R SH AH N Z
+proposal P R AH P OW Z AH L
+proposal's P R AH P OW Z AH L Z
+proposals P R AH P OW Z AH L Z
+propose P R AH P OW Z
+proposed P R AH P OW Z D
+proposes P R AH P OW Z IH Z
+proposing P R AH P OW Z IH NG
+proposition P R AA P AH Z IH SH AH N
+propositioned P R AA P AH Z IH SH AH N D
+propositions P R AA P AH Z IH SH AH N Z
+propound P R AH P AW N D
+propounded P R AH P AW N D AH D
+propp P R AA P
+propped P R AA P T
+propper P R AA P ER
+propping P R AA P IH NG
+propps P R AA P S
+proprietaries P R AH P R AY AH T EH R IY Z
+proprietary P R AH P R AY AH T EH R IY
+proprietor P R AH P R AY AH T ER
+proprietor's P R AH P R AY AH T ER Z
+proprietors P R AH P R AY AH T ER Z
+proprietorship P R AH P R AY AH T ER SH IH P
+proprietorships P R AH P R AY AH T ER SH IH P S
+propriety P R AH P R AY AH T IY
+props P R AA P S
+propst P R AA P S T
+propulsion P R AH P AH L SH AH N
+propylene P R OW P AH L IY N
+prorate P R OW R EY T
+prorated P R OW R EY T IH D
+proration P R OW R EY SH AH N
+prorok P R AO R AH K
+pros P R OW Z
+pros' P R OW Z
+prosaic P R OW Z EY IH K
+proscar P R AO S K AA R
+prosch P R AO SH
+proscia P R OW S CH AH
+proscribe P R OW S K R AY B
+proscribed P R OW S K R AY B D
+proscribes P R OW S K R AY B Z
+proscription P R OW S K R IH P SH AH N
+prose P R OW Z
+prosecutable P R AA S IH K Y UW T AH B AH L
+prosecute P R AA S AH K Y UW T
+prosecuted P R AA S IH K Y UW T IH D
+prosecutes P R AA S IH K Y UW T S
+prosecuting P R AA S IH K Y UW T IH NG
+prosecution P R AA S AH K Y UW SH AH N
+prosecution's P R AA S AH K Y UW SH AH N Z
+prosecutions P R AA S AH K Y UW SH AH N Z
+prosecutor P R AA S IH K Y UW T ER
+prosecutor's P R AA S IH K Y UW T ER Z
+prosecutorial P R AA S IH K Y UW T AO R IY AH L
+prosecutors P R AA S IH K Y UW T ER Z
+prosecutors' P R AA S AH K Y UW T ER Z
+prosek P R OW S EH K
+prosekey P R OW S EH K IY
+proselytize P R AA S AH L AH T AY Z
+proselytized P R AA S AH L AH T AY Z D
+proselytizing P R AA S AH L AH T AY Z IH NG
+proserpina P R OW S ER P AH N AH
+proserpina(2) P R AA S ER P IY N AH
+proserv P R OW S ER V
+proshare P R OW SH EH R
+prosise P R OW S AY Z
+proskauer P R AO S K AW R
+proske P R OW S K
+prosody P R AA S AH D IY
+prosorba P R AA S AO R B AH
+prospect P R AA S P EH K T
+prospecting P R AO S P EH K T IH NG
+prospective P R AH S P EH K T IH V
+prospectively P R AH S P EH K T IH V L IY
+prospector P R AO S P EH K T ER
+prospectors P R AO S P EH K T ER Z
+prospects P R AA S P EH K T S
+prospects(2) P R AA S P EH K S
+prospectus P R AH S P EH K T AH S
+prospectuses P R AH S P EH K T AH S IH Z
+prospekt P R AA S P EH K T
+prosper P R AA S P ER
+prospera P R OW S P EH R AH
+prospered P R AA S P ER D
+prosperi P R OW S P EH R IY
+prospering P R AA S P ER IH NG
+prosperity P R AA S P EH R AH T IY
+prosperous P R AA S P ER AH S
+prospers P R AA S P ER Z
+pross P R AO S
+prosser P R AO S ER
+prost P R AA S T
+prostaglandin P R OW S T AE G L AE N D IH N
+prostaglandins P R OW S T AE G L AE N D IH N Z
+prostate P R AA S T EY T
+prostatectomy P R AA S T EY T EH K T AH M IY
+prostatic P R OW S T AE T IH K
+prostheses P R AA S TH IY S IY Z
+prosthesis P R AO S TH EH S IH S
+prosthesis(2) P R AO S TH IY S AH S
+prosthetic P R AA S TH EH T IH K
+prosthetics P R AA S TH EH T IH K S
+prostitute P R AA S T AH T UW T
+prostitutes P R AA S T AH T UW T S
+prostitution P R AA S T AH T UW SH AH N
+prostrate P R AA S T R EY T
+prostration P R AA S T R EY SH AH N
+protagonist P R OW T AE G AH N AH S T
+protagonists P R OW T AE G AH N AH S T S
+protagonists(2) P R OW T AE G AH N AH S S
+protagonists(3) P R OW T AE G AH N AH S
+protean P R OW T IY AH N
+protease P R OW T IY EY Z
+protect P R AH T EH K T
+protect(2) P ER T EH K T
+protected P R AH T EH K T AH D
+protected(2) P R AH T EH K T IH D
+protected(3) P ER T EH K T IH D
+protectee P R AH T EH K T IY
+protectee(2) P ER T EH K T IY
+protectees P R AH T EH K T IY Z
+protectees(2) P ER T EH K T IY Z
+protecting P R AH T EH K T IH NG
+protecting(2) P ER T EH K T IH NG
+protection P R AH T EH K SH AH N
+protection(2) P ER T EH K SH AH N
+protectionism P R AH T EH K SH AH N IH Z AH M
+protectionism(2) P ER T EH K SH AH N IH Z AH M
+protectionist P R AH T EH K SH AH N IH S T
+protectionist(2) P ER T EH K SH AH N IH S T
+protectionists P R AH T EH K SH AH N IH S T S
+protectionists(2) P ER T EH K SH AH N IH S T S
+protectionists(3) P R AH T EH K SH AH N IH S
+protectionists(4) P ER T EH K SH AH N IH S
+protections P R AH T EH K SH AH N Z
+protections(2) P ER T EH K SH AH N Z
+protective P R AH T EH K T IH V
+protective(2) P ER T EH K T IH V
+protectively P R AH T EH K T IH V L IY
+protectively(2) P ER T EH K T IH V L IY
+protector P R AH T EH K T ER
+protectorate P R AH T EH K T ER AH T
+protectors P R AH T EH K T ER Z
+protects P R AH T EH K T S
+protege P R OW T AH ZH EY
+proteges P R OW T IH Z EY Z
+protein P R OW T IY N
+protein's P R OW T IY N Z
+proteinaceous P R OW T IH N EY SH AH S
+proteins P R OW T IY N Z
+protest P R OW T EH S T
+protest(2) P R AH T EH S T
+protestant P R AA T AH S T AH N T
+protestantism P R AA T AH S T AH N T IH Z AH M
+protestants P R AA T AH S T AH N T S
+protestation P R OW T EH S T EY SH AH N
+protestations P R OW T EH S T EY SH AH N Z
+protested P R AH T EH S T AH D
+protested(2) P R OW T EH S T AH D
+protester P R OW T EH S T ER
+protesters P R OW T EH S T ER Z
+protesters' P R OW T EH S T ER Z
+protesting P R AH T EH S T IH NG
+protesting(2) P R OW T EH S T IH NG
+protestors P R OW T EH S T ER Z
+protests P R OW T EH S T S
+protests(2) P R OW T EH S
+protests(3) P R AH T EH S T S
+protests(4) P R AH T EH S
+prothallus P R OW TH AE L AH S
+prothero P R AA DH ER OW
+prothorax P R OW TH AO R AE K S
+prothro P R OW TH R OW
+protigal P R AA T IH G AH L
+protium P R OW T IY AH M
+proto P R OW T AH
+proto-stirrup P R OW T OW S T ER AH P
+protocol P R OW T AH K AA L
+protocol(2) P R OW T AH K AO L
+protocols P R OW T AH K AO L Z
+protohistory P R OW T OW HH IH S T ER IY
+proton P R OW T AA N
+proton's P R OW T AA N Z
+protons P R OW T AA N Z
+prototype P R OW T AH T AY P
+prototypes P R OW T AH T AY P S
+prototypical P R OW T AH T IH P IH K AH L
+protozoa P R OW T AH Z OW AH
+protozoan P R OW T AH Z OW AH N
+protozoans P R OW T AH Z OW AH N Z
+protract P R OW T R AE K T
+protracted P R OW T R AE K T IH D
+protropin P R AA T R AH P IH N
+protropin(2) P R OW T R OW P IH N
+protrude P R OW T R UW D
+protruding P R OW T R UW D IH NG
+protuberance P R OW T UW B ER AH N S
+protuberance(2) P R AH T UW B ER AH N S
+protuberances P R OW T UW B ER AH N S AH Z
+protuberances(2) P R AH T UW B ER AH N S AH Z
+protz P R AA T S
+protzman P R AA T S M AH N
+proud P R AW D
+prouder P R AW D ER
+proudest P R AW D AH S T
+proudfit P R AW D F IH T
+proudfoot P R AW D F UH T
+proudfoot's P R AW D F UH T S
+proudly P R AW D L IY
+prough P R AW
+proulx P R AW L K S
+prouse P R AW S
+proust P R AW S T
+proust(2) P R UW S T
+prout P R AW T
+prouty P R AW T IY
+provable P R UW V AH B AH L
+provance P R OW V AH N S
+provant P R OW V AH N T
+prove P R UW V
+proved P R UW V D
+proven P R UW V AH N
+provenance P R AA V AH N AH N S
+provence P R OW V AH N S
+provencher P R AA V IH N CH ER
+provencio P R OW V EH N S IY OW
+provenience P R AH V EH N IY AH N S
+proventus P R OW V EH N T AH S
+provenza P R OW V EH N Z AH
+provenzano P R OW V EH N Z AA N OW
+provera P R OW V EH R AH
+proverb P R AA V ER B
+proverbial P R AH V ER B IY AH L
+proverbs P R AA V ER B Z
+proves P R UW V Z
+provide P R AH V AY D
+provided P R AH V AY D AH D
+provided(2) P R AH V AY D IH D
+providence P R AA V AH D AH N S
+providence's P R AA V AH D AH N S IH Z
+provideniya P R OW V IH D EH N IH Y AH
+provident P R AA V IH D AH N T
+providential P R AA V AH D EH N CH AH L
+provider P R AH V AY D ER
+providers P R AH V AY D ER Z
+provides P R AH V AY D Z
+providian P R OW V IH D IY AH N
+providing P R AH V AY D IH NG
+provigo P R OW V IH G OW
+provigo's P R OW V IY G OW Z
+province P R AA V AH N S
+province's P R AA V AH N S IH Z
+province(2) P R AA V IH N S
+provinces P R AA V AH N S AH Z
+provincetown P R AA V AH N S T AW N
+provincial P R AH V IH N SH AH L
+provincialism P R AH V IH N CH AH L IH Z AH M
+provincially P R AH V IH N SH AH L IY
+provine P R OW V IY N IY
+proving P R UW V IH NG
+provision P R AH V IH ZH AH N
+provisional P R AH V IH ZH AH N AH L
+provisionally P R AH V IH ZH AH N AH L IY
+provisionally(2) P R AH V IH ZH N AH L IY
+provisioning P R AH V IH ZH AH N IH NG
+provisions P R AH V IH ZH AH N Z
+proviso P R AH V AY Z OW
+provisos P R AH V AY Z OW Z
+provo P R OW V OW
+provocation P R AA V AH K EY SH AH N
+provocations P R AA V AH K EY SH AH N Z
+provocative P R OW V AA K AH T IH V
+provocatively P R OW V AA K AH T IH V L IY
+provoke P R AH V OW K
+provoked P R AH V OW K T
+provokes P R AH V OW K S
+provoking P R AH V OW K IH NG
+provolone P R OW V AH L OW N
+provost P R OW V OW S T
+provosts P R OW V OW S T S
+provosts(2) P R OW V OW S S
+provosts(3) P R OW V OW S
+provote P R OW V OW T
+provus P R OW V AH S
+prow P R AW
+prowant P R AW AH N T
+prowell P R AA W EH L
+prowess P R AW AH S
+prowl P R AW L
+prowler P R AW L ER
+prowling P R AW L IH NG
+prows P R AW Z
+prowse P R AW Z
+proxies P R AA K S IY Z
+proximal P R AA K S AH M AH L
+proximate P R AA K S AH M AH T
+proximity P R AA K S IH M AH T IY
+proxmire P R AA K S M AY R
+proxy P R AA K S IY
+prozac P R OW Z AE K
+pru P R UW
+pru's P R UW Z
+prucapital P R UW K AE P IH T AH L
+prucha P R AH CH AH
+prude P R UW D
+pruden P R UW D AH N
+prudence P R UW D AH N S
+prudency P R UW D AH N S IY
+prudent P R UW D AH N T
+prudente P R AH D IH N T
+prudential P R UW D EH N CH AH L
+prudential's P R UW D EH N CH AH L Z
+prudential(2) P R UW D EH N SH AH L
+prudentialbache P R UW D EH N T IY AE L B AE CH
+prudentialbache(2) P R UW D EH N SH AH L B AE CH
+prudently P R UW D AH N T L IY
+prudentrust P R UW D AH N T R AH S T
+prudery P R UW D ER IY
+prudhoe P R AH D HH OW
+prudhomme P R AH D HH AH M
+prudish P R UW D IH SH
+prudit P R UW D IH T
+prue P R UW
+pruer P R UW ER
+pruess P R UW S
+prueter P R UH T ER
+pruett P R UW T
+pruette P R UW EH T
+prugh P R UW
+pruiett P R UW IH T
+pruitt P R UW IH T
+prune P R UW N
+pruneau P R AH N OW
+pruned P R UW N D
+pruneda P R UW N EH D AH
+prunedale P R UW N D EY L
+prunella P R UW N EH L AH
+pruner P R UW N ER
+prunes P R UW N Z
+prunier P R UW N IY ER
+pruning P R UW N IH NG
+prunskiene P R UW N S K IY N
+prunty P R AH N T IY
+prurient P R UH R IY AH N T
+prus P R AH S
+prusak P R UW S AH K
+prusha P R AH SH AH
+prusinski P R AH S IH N S K IY
+pruski P R AH S K IY
+pruss P R AH S
+prussak P R AH S AH K
+prussia P R AH SH AH
+prussian P R AH SH AH N
+prust P R AH S T
+prutzman P R AH T S M AH N
+pruyn P R AY N
+pry P R AY
+pryce P R AY S
+pryde P R AY D
+pryer P R AY ER
+prying P R AY IH NG
+prynne P R IH N
+pryor P R AY ER
+pryor's P R AY ER Z
+przybocki P R AH Z B AA K IY
+przybyl P ER Z IH B AH L
+przybyla P ER Z AH B IH L AH
+przybylski P ER Z AH B IH L S K IY
+przybysz P ER Z IH B IH SH
+przywara P ER Z AH V AA R AH
+psalm S AA L M
+psalm(2) S AA M
+psalms S AA L M Z
+psalms(2) S AA M Z
+psalter S AO L T ER
+psalters S AO L T ER Z
+psarouthakis S EH R UW TH AA K IH S
+psencik S EH N S IH K
+pseudo S UW D OW
+pseudomonas S UW D AH M OW N AH Z
+pseudonym S UW D AH N IH M
+pseudonyms S UW D AH N IH M Z
+pseudopodial S UW D AH P OW D IY AH L
+pseudoscience S UW D OW S AY AH N S
+pseudoscientific S UW D OW S AY AH N T IH F IH K
+pshew P SH UW
+psi S AY
+psilocybin S AY L AH S AY B AH N
+psoriasis S ER AY AH S AH S
+psych S AY K
+psyche S AY K IY
+psyched S AY K T
+psychedelic S AY K AH D EH L IH K
+psyches S AY K IY Z
+psychiatric S AY K IY AE T R IH K
+psychiatrist S AH K AY AH T R AH S T
+psychiatrist's S AH K AY AH T R AH S T S
+psychiatrists S AH K AY AH T R AH S T S
+psychiatrists(2) S AH K AY AH T R AH S S
+psychiatrists(3) S AH K AY AH T R AH S
+psychiatry S AY K AY AH T R IY
+psychiatry(2) S IH K AY AH T R IY
+psychic S AY K IH K
+psychical S AY K IH K AH L
+psychics S AY K IH K S
+psycho S AY K OW
+psychoanalysis S AY K OW AH N AE L AH S AH S
+psychoanalysis(2) S AY K OW AH N AE L IH S IH S
+psychoanalyst S AY K OW AE N AH L AH S T
+psychoanalytic S AY K OW AE N AH L IH T IH K
+psychobabble S AY K OW B AE B AH L
+psychodynamic S AY K OW D AY N AE M IH K
+psychogenic S AY K OW JH EH N IH K
+psychokinesis S AY K OW K AH N IY S AH S
+psychological S AY K AH L AA JH IH K AH L
+psychologically S AY K AH L AA JH IH K L IY
+psychologist S AY K AA L AH JH AH S T
+psychologists S AY K AA L AH JH AH S T S
+psychologists(2) S AY K AA L AH JH AH S S
+psychologists(3) S AY K AA L AH JH AH S
+psychology S AY K AA L AH JH IY
+psychopath S AY K OW P AE TH
+psychopathic S AY K AH P AE TH IH K
+psychopaths S AY K OW P AE TH S
+psychopathy S AY K AA P AH TH IY
+psychosis S AY K OW S AH S
+psychosomatic S AY K OW S AH M AE T IH K
+psychotherapeutic S AY K OW TH EH R AH P Y UW T IH K
+psychotherapist S AY K AH TH EH R AH P IH S T
+psychotherapists S AY K AH TH EH R AH P IH S T S
+psychotherapists(2) S AY K AH TH EH R AH P IH S S
+psychotherapists(3) S AY K AH TH EH R AH P IH S
+psychotherapy S AY K OW TH EH R AH P IY
+psychotic S AY K AA T IH K
+psyllium S IH L IY AH M
+ptacek T AA CH EH K
+ptak T AE K
+ptolemaic T AA L AH M EY IH K
+ptolemy T AA L AH M IY
+ptomaine T OW M EY N
+ptomaines T OW M EY N Z
+ptovsky P AH T AO V S K IY
+pty T AY
+ptyon T AY AO N
+pu P UW
+puat P Y UW AE T
+pub P AH B
+pubco P AH B K OW
+puberty P Y UW B ER T IY
+pubic P Y UW B IH K
+public P AH B L IH K
+public's P AH B L IH K S
+public-spirit P AH B L IH K S P IH R IH T
+public-spirited P AH B L IH K S P IH R IH T AH D
+public-spiritedness P AH B L IH K S P IH R IH T IH D N AH S
+publically P AH B L IH K L IY
+publication P AH B L IH K EY SH AH N
+publication's P AH B L IH K EY SH AH N Z
+publications P AH B L IH K EY SH AH N Z
+publications' P AH B L IH K EY SH AH N Z
+publicis P AH B L IY S IH S
+publicist P AH B L IH S IH S T
+publicists P AH B L IH S IH S T S
+publicists(2) P AH B L IH S IH S S
+publicists(3) P AH B L IH S IH S
+publicity P AH B L IH S AH T IY
+publicity(2) P AH B L IH S IH T IY
+publicize P AH B L IH S AY Z
+publicized P AH B L IH S AY Z D
+publicizing P AH B L AH S AY Z IH NG
+publicker P AH B L IH K ER
+publicly P AH B L IH K L IY
+publics P AH B L IH K S
+publish P AH B L IH SH
+published P AH B L IH SH T
+publisher P AH B L IH SH ER
+publisher's P AH B L IH SH ER Z
+publishers P AH B L IH SH ER Z
+publishers' P AH B L IH SH ER Z
+publishes P AH B L IH SH AH Z
+publishes(2) P AH B L IH SH IH Z
+publishing P AH B L IH SH IH NG
+publishing's P AH B L IH SH IH NG Z
+publishings P AH B L IH SH IH NG Z
+publitech P AH B L IH T EH K
+publix P AH B L IH K S
+pubs P AH B Z
+pucci P UW CH IY
+pucciarelli P UW CH ER EH L IY
+puccinelli P UW CH IY N EH L IY
+puccini P UW CH IY N IY
+puccio P UW CH IY OW
+puchalski P AH HH AA L S K IY
+puche P UW CH
+pucillo P UW CH IH L OW
+puck P AH K
+pucker P AH K ER
+puckett P AH K IH T
+puckish P AH K IH SH
+pudding P UH D IH NG
+puddings P UH D IH NG Z
+puddle P AH D AH L
+puddles P AH D AH L Z
+puder P Y UW D ER
+pudgie P AH JH IY
+pudgie's P AH JH IY Z
+pudgies P AH JH IY Z
+pudgy P AH JH IY
+pudlo P AH D L OW
+pudong P Y UW D AO NG
+pudong(2) P UW D AO NG
+pudwill P AH D W IH L
+puebla P W EY B L AH
+pueblo P W EH B L OW
+puente P UW N T
+puentes P W EH N T EH S
+puerile P Y UW R IY L
+puerto P W EH R T OW
+puerto(2) P AO R T AH
+puerto(3) P AO R T ER
+puerto-rico P W EH R T OW R IY K OW
+puerto-rico(2) P AO R T AH R IY K OW
+puerto-rico(3) P AO R T ER R IY K OW
+puerto_rican P W EH R T OW R IY K AH N
+puerto_rican(2) P AO R T AH R IY K AH N
+puerto_rican(3) P AO R T ER R IY K AH N
+puerto_ricans P W EH R T OW R IY K AH N Z
+puerto_ricans(2) P AO R T AH R IY K AH N Z
+puerto_ricans(3) P AO R T ER R IY K AH N Z
+puett P UW T
+puetz P UW T S
+pufahl P Y UW F AA L
+puff P AH F
+puffed P AH F T
+puffenbarger P AH F IH N B AA R G ER
+puffer P AH F ER
+puffer's P AH F ER Z
+puffery P AH F ER IY
+puffin P AH F IH N
+puffing P AH F IH NG
+puffins P AH F IH N Z
+puffs P AH F S
+puffy P AH F IY
+pug P AH G
+puga P Y UW G AH
+puget P Y UW JH IH T
+puget-1 P Y UW JH IH T W AH N
+pugh P Y UW
+pugh's P Y UW Z
+pughs P Y UW Z
+pugilism P Y UW JH AH L IH Z AH M
+pugilist P Y UW JH AH L IH S T
+pugilistic P Y UW JH AH L IH S T IH K
+puglia P AH G L IY AH
+pugliese P UW G L IY EY Z IY
+puglisi P UW G L IY S IY
+pugmire P AH G M AY R
+pugnacious P AH G N AE SH IH S
+pugsley P AH G S L IY
+pugwash P AH G W AA SH
+puhl P AH L
+puig P UW G
+puipoe P UW IY P OW
+puipoe(2) P W IY P OW
+pujol P Y UW JH AH L
+puke P Y UW K
+pukes P Y UW K S
+pulaski P Y UW L AE S K IY
+pulcini P UW L CH IY N IY
+puleo P UW L IY OW
+pulford P UH L F ER D
+pulice P UW L IH S
+pulido P UW L IY D OW
+pulitzer P UH L AH T S ER
+pulkrabek P AH L K R AH B IH K
+pull P UH L
+pullam P UH L AH M
+pullan P UH L AH N
+pullano P UW L AA N OW
+pullara P UW L AA R AH
+pullback P UH L B AE K
+pullbacks P UH L B AE K S
+pulled P UH L D
+pullen P UH L AH N
+puller P UH L ER
+pulley P UH L IY
+pulleys P UH L IY Z
+pulliam P UH L IY AH M
+pullin P UH L IH N
+pulling P UH L IH NG
+pullins P UH L IH N Z
+pullman P UH L M AH N
+pullman's P UH L M AH N Z
+pullout P UH L AW T
+pullouts P UH L AW T S
+pulls P UH L Z
+pullum P UH L AH M
+pulmazyme P UH L M AH Z AY M
+pulmazyme's P UH L M AH Z AY M Z
+pulmonary P UH L M AH N EH R IY
+pulmozyme P UH L M OW Z AY M
+pulos P UW L OW Z
+pulp P AH L P
+pulping P AH L P IH NG
+pulpit P UH L P IH T
+pulpits P UH L P IH T S
+pulpwood P AH L P W UH D
+puls P UH L Z
+pulsar P UH L S ER
+pulsar's P UH L S ER Z
+pulsating P AH L S EY T IH NG
+pulse P AH L S
+pulses P AH L S IH Z
+pulsifer P AH L S IH F ER
+pulsing P AH L S IH NG
+pulsipher P UH L S IH F ER
+pulte P UH L T IY
+pultz P UH L T S
+pulver P UH L V ER
+pulverize P AH L V ER AY Z
+pulverized P AH L V ER AY Z D
+pulvermacher P AH L V ER M AH K ER
+puma P UW M AH
+puma's P Y UW M AH Z
+pumice P AH M AH S
+pumilia P UW M IY L IY AH
+puming P UW M IH NG
+pummel P AH M AH L
+pummeled P AH M AH L D
+pummeling P AH M AH L IH NG
+pummill P AH M IH L
+pump P AH M P
+pumped P AH M P T
+pumpernickel P AH M P ER N IH K AH L
+pumphrey P AH M F R IY
+pumping P AH M P IH NG
+pumpkin P AH M P K IH N
+pumpkin(2) P AH M K IH N
+pumpkins P AH M P K AH N Z
+pumpkins(2) P AH M K AH N Z
+pumps P AH M P S
+pumsie P AH M Z IY
+pun P AH N
+punch P AH N CH
+punched P AH N CH T
+punches P AH N CH IH Z
+punching P AH N CH IH NG
+punchline P AH N CH L AY N
+punchy P AH N CH IY
+punctate P AH N K T EY T
+punctilious P AH NG K T IH L IY AH S
+punctual P AH NG K CH UW AH L
+punctuality P AH NG K CH UW AE L IH T IY
+punctuate P AH NG K CH UW EY T
+punctuated P AH NG K CH UW EY T IH D
+punctuating P AH NG K CH UW EY D IH NG
+punctuation P AH NG K CH UW EY SH AH N
+puncture P AH NG K CH ER
+puncture(2) P AH NG K SH ER
+punctured P AH NG K CH ER D
+punctured(2) P AH NG K SH ER D
+punctures P AH NG K CH ER Z
+punctures(2) P AH NG K SH ER Z
+puncturing P AH NG K CH ER IH NG
+puncturing(2) P AH NG K SH ER IH NG
+pundit P AH N D AH T
+punditry P AH N D AH T R IY
+pundits P AH N D IH T S
+pundt P AH N T
+puneet P UW N IY T
+pung P AH NG
+pungent P AH N JH AH N T
+pungently P AH N JH AH N T L IY
+punic P Y UW N IH K
+punish P AH N IH SH
+punishable P AH N IH SH AH B AH L
+punished P AH N IH SH T
+punisher P AH N IH SH ER
+punishes P AH N IH SH AH Z
+punishing P AH N IH SH IH NG
+punishingly P AH N IH SH IH NG L IY
+punishment P AH N IH SH M AH N T
+punishments P AH N IH SH M AH N T S
+punit P AH N IH T
+punitive P Y UW N AH T IH V
+punjab P AH N JH AA B
+punjab's P AH N JH AA B Z
+punjab's(2) P AH N JH AE B Z
+punjab(2) P AH N JH AE B
+punk P AH NG K
+punkin P AH NG K IH N
+punks P AH NG K S
+punky P AH NG K IY
+puns P AH N Z
+punsalan P AH N S AA L AH N
+punt P AH N T
+punta P UH N T ER
+punter P AH N T ER
+punto P UW N T OW
+punts P AH N T S
+punxatauney P AH NG K S AH T AA N IY
+puny P Y UW N IY
+puopolo P W OW P OW L OW
+pup P AH P
+pupa P Y UW P AH
+pupil P Y UW P AH L
+pupils P Y UW P AH L Z
+pupo P UW P OW
+puppet P AH P AH T
+puppet(2) P AH P IH T
+puppeteer P AH P AH T IY R
+puppeteers P AH P AH T IY R Z
+puppetry P AH P AH T R IY
+puppets P AH P AH T S
+puppets(2) P AH P IH T S
+puppies P AH P IY Z
+puppy P AH P IY
+pups P AH P S
+pur P ER
+pura P UH R AH
+pura(2) P Y UH R AH
+purcell P ER S EH L
+purchase P ER CH AH S
+purchased P ER CH AH S T
+purchaser P ER CH AH S ER
+purchaser's P ER CH AH S ER Z
+purchasers P ER CH AH S ER Z
+purchasers' P ER CH AH S ER Z
+purchases P ER CH AH S AH Z
+purchases(2) P ER CH AH S IH Z
+purchasing P ER CH AH S IH NG
+purdham P ER D AH M
+purdie P ER D IY
+purdin P ER D IH N
+purdom P ER D AH M
+purdon P ER D AH N
+purdue P ER D UW
+purdum P ER D AH M
+purdy P ER D IY
+pure P Y UH R
+purebred P Y UH R B R EH D
+purebreds P Y UH R B R EH D Z
+puree P Y UH R EY
+purely P Y UH R L IY
+purer P Y UH R ER
+purest P Y UH R AH S T
+purex P Y UH R EH K S
+purgason P ER G AH S AH N
+purgatory P ER G AH T AO R IY
+purge P ER JH
+purged P ER JH D
+purges P ER JH IH Z
+purging P ER JH IH NG
+puri P UH R IY
+puricelli P UH R IY CH EH L IY
+purification P Y UH R AH F AH K EY SH AH N
+purified P Y UH R AH F AY D
+purifier P Y UH R AH F AY ER
+purifiers P Y UH R AH F AY ER Z
+purifoy P Y UW R IH F OY
+purify P Y UH R AH F AY
+purifying P Y UH R AH F AY IH NG
+purile P W EH R AH L
+purim P UH R AH M
+purim(2) P UH R IY M
+purina P Y UH R IH N AH
+purina(2) P ER IY N AH
+purina(3) P Y UH R IY N AH
+purington P Y UH R IH NG T AH N
+purinton P Y UW R IH N T AH N
+puris P Y UH R IH S
+purist P Y UH R IH S T
+puristic P Y UH R IH S T IH K
+purists P Y UH R AH S T S
+purists(2) P Y UH R IH S T S
+purists(3) P Y UH R IH S S
+purists(4) P Y UH R IH S
+puritan P Y UH R AH T AH N
+puritanical P Y UH R AH T AE N IH K AH L
+puritanism P Y UH R AH T AH N IH Z AH M
+puritanisms P Y UH R AH T AH N IH Z AH M Z
+puritans P Y UH R AH T AH N Z
+purity P Y UH R AH T IY
+purity(2) P Y UH R IH T IY
+purk P ER K
+purkey P ER K IY
+purloin P ER L OY N
+purloined P ER L OY N D
+purnell P ER N AH L
+purolator P Y UH R AH L EY T ER
+purolator's P Y UH R AH L EY T ER Z
+purpa P ER P AH
+purple P ER P AH L
+purples P ER P AH L Z
+purplish P ER P L IH SH
+purport P ER P AO R T
+purported P ER P AO R T IH D
+purportedly P ER P AO R T IH D L IY
+purporting P ER P AO R T IH NG
+purports P ER P AO R T S
+purpose P ER P AH S
+purposeful P ER P AH S F AH L
+purposefully P ER P AH S F AH L IY
+purposeless P ER P AH S L AH S
+purposely P ER P AH S L IY
+purposes P ER P AH S AH Z
+purposes(2) P ER P AH S IH Z
+purr P ER
+purring P ER IH NG
+purrington P ER IH NG T AH N
+purrs P ER Z
+purse P ER S
+pursed P ER S T
+pursel P ER S AH L
+pursell P ER S AH L
+purser P ER S ER
+purses P ER S IH Z
+pursifull P ER S IH F AH L
+pursley P ER S L IY
+pursuant P ER S UW AH N T
+pursue P ER S UW
+pursued P ER S UW D
+pursuer P ER S UW ER
+pursuers P ER S UW ER Z
+pursues P ER S UW Z
+pursueth P ER S UW AH TH
+pursuing P ER S UW IH NG
+pursuit P ER S UW T
+pursuits P ER S UW T S
+purt P ER T
+purtee P ER T IY
+purtell P ER T AH L
+purtle P ER T AH L
+purulent P Y UH R UW L AH N T
+purves P ER V Z
+purvey P ER V EY
+purveyed P ER V EY D
+purveying P ER V EY IH NG
+purveyor P ER V EY ER
+purveyors P ER V EY ER Z
+purveys P ER V EY Z
+purviance P UH R V IY AH N S
+purview P ER V Y UW
+purvin P ER V IH N
+purvis P ER V IH S
+puryear P ER Y IH R
+pus P AH S
+pusan P UW S AA N
+pusant P Y UW S AA N T
+pusateri P UW S AA T EH R IY
+pusch P AH SH
+pusey P Y UW Z IY
+push P UH SH
+push-up P UH SH AH P
+push-ups P UH SH AH P S
+pushed P UH SH T
+pusher P UH SH ER
+pushers P UH SH ER Z
+pushes P UH SH AH Z
+pushes(2) P UH SH IH Z
+pushing P UH SH IH NG
+pushkin P UH SH K IH N
+pushover P UH SH OW V ER
+pushup P UH SH AH P
+pushups P UH SH AH P S
+pushy P UH SH IY
+pusillanimous P Y UW S AH L AE N AH M AH S
+puskar P AH S K ER
+puskarich P AH S K ER IH K
+puskas P AH S K AH Z
+puss P UH S
+puss(2) P AH S
+pusses P UH S IH Z
+pusses(2) P AH S IH Z
+pussies P UH S IY Z
+pussy P UH S IY
+pussycat P UH S IY K AE T
+pussycats P UH S IY K AE T S
+pussyfoot P UH S IY F UH T
+pussyfooted P UH S IY F UH T AH D
+pussyfooting P UH S IY F UH T IH NG
+pussyfoots P UH S IY F UH T S
+pustejovsky P AH S T EY AA V S K IY
+put P UH T
+put-on P UH T AA N
+put-ons P UH T AA N Z
+putative P Y UW T AH T IH V
+putco P AH T K OW
+putco(2) P UH T K OW
+putdown P UH T D AW N
+putdowns P UH T D AW N Z
+pute P Y UW T
+puterbaugh P Y UW T ER B AO
+putes P Y UW T S
+puth P UW TH
+puthoff P AH T HH AO F
+putman P AH T M AH N
+putnam P AH T N AH M
+putnam's P AH T N AH M Z
+putney P AH T N IY
+putrid P Y UW T R IH D
+puts P UH T S
+putsch P UH CH
+putt P AH T
+puttable P AH T AH B AH L
+putted P AH T IH D
+puttenbay P AH T IH N B EY
+putter P AH T ER
+putterer P AH T ER ER
+puttering P AH T ER IH NG
+putterman P AH T ER M AH N
+putters P AH T ER Z
+putting P AH T IH NG
+putting(2) P UH T IH NG
+puttnam P AH T N AH M
+puttnam's P AH T N AH M Z
+putts P AH T S
+putty P AH T IY
+putz P AH T S
+putzier P AH T Z IY ER
+puusepp P UW Z AH P
+puza P UW Z AH
+puzio P UW Z IY OW
+puzo P UW Z OW
+puzzle P AH Z AH L
+puzzled P AH Z AH L D
+puzzlemaster P AH Z AH L M AE S T ER
+puzzlement P AH Z AH L M AH N T
+puzzler P AH Z L ER
+puzzles P AH Z AH L Z
+puzzling P AH Z AH L IH NG
+puzzling(2) P AH Z L IH NG
+puzzo P UW Z OW
+pyatt P AY AH T
+pyburn P IH B ER N
+pye P AY
+pyeatt P AY AH T
+pygmalion P IH G M EY L Y AH N
+pygmies P IH G M IY Z
+pygmy P IH G M IY
+pyhrric P IH R IH K
+pyka P IH K AH
+pyke P AY K
+pyland P AY L AH N D
+pylant P IH L AO N T
+pylant(2) P IH L AE N T
+pyle P AY L
+pyle's P AY L Z
+pyles P AY L Z
+pylon P AY L AA N
+pylons P AY L AA N Z
+pylori P AY L AO R IY
+pylos P AY L OW S
+pymm P IH M
+pyne P AY N
+pynes P AY N Z
+pyongyang P Y AO NG Y AE NG
+pyongyang's P Y AO NG Y AE NG Z
+pyper P AY P ER
+pyramid P IH R AH M IH D
+pyramidal P ER AE M AH D AH L
+pyramids P IH R AH M IH D Z
+pyre P AY ER
+pyrena P IH R IY N AH
+pyrenees P IH R AH IY Z
+pyrenees' P IH R AH IY Z
+pyres P AY ER Z
+pyrite P AY R AY T
+pyro P AY R OW
+pyron P IH R AH N
+pyrotechnic P AY R OW T EH K N IH K
+pyrotechnics P AY R OW T EH K N IH K S
+pyroxene P AY R AA K S IY N
+pyrrhic P IH R IH K
+pysher P IH SH ER
+pytel P IH T AH L
+pythagorean P IH TH AH G AO R IY AH N
+pythagorus P IH TH AE G AH R AH S
+pythia P IH TH IY AH
+python P AY TH AA N
+python's P AY TH AA N Z
+pyxis P IH K S IH S
+q K Y UW
+q's K Y UW Z
+q. K Y UW
+q.'s K Y UW Z
+q.s K Y UW Z
+qana K AA N AH
+qantas K AE N T AH S
+qantas(2) K AA N T AH S
+qasr K EY Z ER
+qasr(2) K Y UW EY EH S AA R
+qatar K AH T AA R
+qawi K AA W IY
+qi K IY
+qian K IY AA N
+qian(2) JH IH N
+qiao K IY AW
+qiaotou CH AW T UW
+qichen K IH CH IH N
+qin K IH N
+qing K IH NG
+qingdao CH IH NG D AW
+qingming K IH NG M IH NG
+qintex K IH N T EH K S
+qiryat K IH R Y AA T
+qmax K Y UW M AE K S
+qom K AA M
+qu K UW
+qua K W AA
+quach K W AA CH
+quack K W AE K
+quackenbush K W AE K AH N B UH SH
+quackery K W AE K ER IY
+quacks K W AE K S
+quad K W AA D
+quade K W EY D
+quadra K W AE D R AH
+quadrant K W AA D R AH N T
+quadrennial K W AA D R EH N IY AH L
+quadrex K W AA D R EH K S
+quadriceps K W AA D R AH S EH P S
+quadriplegic K W AA D R AH P L IY JH IH K
+quadruple K W AA D R UW P AH L
+quadrupled K W AA D R UW P AH L D
+quadrupling K W AA D R UW P AH L IH NG
+quadrupling(2) K W AA D R UW P L IH NG
+quads K W AA D Z
+quaglia K W AE G L IY AH
+quagmire K W AE G M AY ER
+quai K IY
+quai(2) K EY
+quaid K W EY D
+quail K W EY L
+quails K W EY L Z
+quain K W EY N
+quaint K W EY N T
+quaintance K W EY N T AH N S
+quaintly K W EY N T L IY
+quake K W EY K
+quake's K W EY K S
+quakenbush K W AH K EH N B UH SH
+quaker K W EY K ER
+quaker's K W EY K ER Z
+quakers K W EY K ER Z
+quakes K W EY K S
+quaking K W EY K IH NG
+qual K W AA L
+qualcast K W AA L K AE S T
+qualcomm K W AA L K AA M
+qualcomm's K W AA L K AA M Z
+quale K W EY L
+qualex K W AA L EH K S
+qualey K W EY L IY
+qualification K W AA L AH F AH K EY SH AH N
+qualifications K W AA L AH F AH K EY SH AH N Z
+qualified K W AA L AH F AY D
+qualifier K W AA L AH F AY ER
+qualifiers K W AA L AH F AY ER Z
+qualifies K W AA L AH F AY Z
+qualify K W AA L AH F AY
+qualifying K W AA L AH F AY IH NG
+qualitative K W AA L AH T EY T IH V
+qualitatively K W AA L AH T EY T IH V L IY
+qualities K W AA L AH T IY Z
+quality K W AA L AH T IY
+qualley K W AO L IY
+qualls K W AA L Z
+qualls(2) K W EY L Z
+qualms K W AA M Z
+qualms(2) K W AA L M Z
+quam K W AA M
+quamme K W AE M
+quan K W AO N
+quandaries K W AA N D ER IY Z
+quandary K W AA N D ER IY
+quandary(2) K W AA N D R IY
+quandt K W AO N D T
+quanex K W AA N EH K S
+quang K W AO NG
+quant K W AE N T
+quantico K W AA N T IH K OW
+quantifiable K W AA N T IH F AY AH B EH L
+quantifiable(2) K W AA N IH F AY AH B EH L
+quantification K W AA N T IH F AH K EY SH AH N
+quantified K W AA N T IH F AY D
+quantified(2) K W AA N IH F AY D
+quantify K W AA N T IH F AY
+quantify(2) K W AA N IH F AY
+quantifying K W AA N T IH F AY IH NG
+quantifying(2) K W AA N IH F AY IH NG
+quantitative K W AA N T IH T EY T IH V
+quantitative(2) K W AA N IH T EY T IH V
+quantitatively K W AA N T IH T EY T AH V L IY
+quantitatively(2) K W AA N IH T EY T AH V L IY
+quantities K W AA N T AH T IY Z
+quantities(2) K W AA N AH T IY Z
+quantity K W AA N T AH T IY
+quantity(2) K W AA N AH T IY
+quantum K W AA N T AH M
+quantum's K W AA N T AH M Z
+quantum's(2) K W AA N AH M Z
+quantum(2) K W AA N AH M
+quaquil K W AE K W IH L
+quaranta K W ER AE N T AH
+quarante K W ER AA N T EY
+quarantine K W AO R AH N T IY N
+quarantined K W AO R AH N T IY N D
+quarantined(2) K W AO R AH N T AY N D
+quarantines K W AO R AH N T IY N Z
+quarantines(2) K W AO R AH N T AY N Z
+quarantining K W AO R AH N T IY N IH NG
+quarantining(2) K W AO R AH N T AY N IH NG
+quark K W AA R K
+quarks K W AA R K S
+quarles K W AO R L Z
+quarnstrom K W AO R N S T R AH M
+quarre K W AA R
+quarrel K W AO R AH L
+quarreled K W AO R AH L D
+quarreling K W AA R AH L IH NG
+quarreling(2) K W AA R L IH NG
+quarrels K W AO R AH L Z
+quarrelsome K W AO R AH L S AH M
+quarries K W AO R IY Z
+quarry K W AO R IY
+quarrying K W AO R IY IH NG
+quart K W AO R T
+quartararo K W AA R T AA R AA R OW
+quarter K W AO R T ER
+quarter's K W AO R T ER Z
+quarter's(2) K AO R T ER Z
+quarter(2) K AO R T ER
+quarterback K W AO R T ER B AE K
+quarterback(2) K AO R T ER B AE K
+quarterbacking K W AO R T ER B AE K IH NG
+quarterbacking(2) K AO R T ER B AE K IH NG
+quarterbacks K W AO R T ER B AE K S
+quarterbacks(2) K AO R T ER B AE K S
+quarterdeck K W AO R T ER D EH K
+quarterdeck(2) K AO R T ER D EH K
+quarterly K W AO R T ER L IY
+quarterly(2) K AO R T ER L IY
+quarterman K W AO R T ER M AH N
+quarterman(2) K AO R T ER M AH N
+quartermaster K W AO R T ER M AE S T ER
+quartermaster(2) K AO R T ER M AE S T ER
+quarters K W AO R T ER Z
+quarters' K W AA R T ER Z
+quarters's K AO R T ER Z
+quarters's(2) K W AO R T ER Z
+quartet K W AO R T EH T
+quartet's K W AO R T EH T S
+quartets K W AO R T EH T S
+quarteurlanc K W AA R T ER L AE NG K
+quartile K W AO R T IH L
+quarto K W AO R T OW
+quarts K W AO R T S
+quartz K W AO R T S
+quasar K W EY Z AA R
+quash K W AO SH
+quashed K W AO SH T
+quashing K W AO SH IH NG
+quasi K W AA S IY
+quasimodo K AE Z IY M OW D OW
+quassia K W AA SH IY AH
+quast K W AA S T
+quaternary K W AA T ER N EH R IY
+quattlebaum K W AO T AH L B AW M
+quattro K W AO T R OW
+quattrocchi K W AA T R OW K IY
+quattrochi K W AA T R OW K IY
+quattrone K W AA T R OW N IY
+quave K W EY V
+quaver K W EY V ER
+quavered K W EY V ER D
+quavering K W EY V ER IH NG
+quavers K W EY V ER Z
+quay K IY
+quay(2) K EY
+quaye K EY
+quaye(2) K W EY
+quayle K W EY L
+quayle's K W EY L Z
+quayles K W EY L Z
+quazulu K W AA Z UW L UW
+quazulu's K W AA Z UW L UW Z
+qubilah K UW B IH L AH
+qubilah(2) K W AH B IH L AH
+quddus K UW D UW S
+que K Y UW
+quealy K W IY L IY
+queasiness K W IY Z IY N AH S
+queasy K W IY Z IY
+queau K W OW
+quebec K W AH B EH K
+quebec's K W IH B EH K S
+quebecker K W AH B EH K ER
+quebecker(2) K W EH B EH K ER
+quebeckers K W EH B EH K ER Z
+quebeckers(2) K W AH B EH K ER Z
+quebecois K W EH B AH S W AA
+quebecois(2) K W EH B EH K W AA
+quebecoise K EH B EH K W AA
+quebecor K W EH B IH K AO R
+quebedeaux K W EH B IH D OW
+quechee K W EH CH IY
+queen K W IY N
+queen's K W IY N Z
+queena K W IY N AH
+queenan K W IY N AH N
+queener K W IY N ER
+queenfish K W IY N F IH SH
+queenfish's K W IY N F IH SH IH Z
+queenie K W IY N IY
+queens K W IY N Z
+queensberry K W IY N Z B EH R IY
+queensland K W IY N Z L AE N D
+queensway K W IY N Z W EY
+queer K W IH R
+queerer K W IH R ER
+queers K W IH R Z
+quek K W EH K
+quel K W EH L
+quell K W EH L
+quelled K W EH L D
+quellette K W IH L EH T
+quelling K W EH L IH NG
+quello K W EH L OW
+quemoy K W IH M OY
+quemoy(2) K W IY M OY
+quenby K W EH N B IY
+quench K W EH N CH
+quencher K W EH N CH ER
+quenchers K W EH N CH ER Z
+quenches K W EH N CH AH Z
+quenching K W EH N CH IH NG
+quennel K W EH N AH L
+quenneville K W EY N EY V IH L
+quentin K W EH N T IH N
+quenzer K W EH N Z ER
+querida K W EH R IY D AH
+queried K W IH R IY D
+queries K W IH R IY Z
+querns K W ER N Z
+querry K W EH R IY
+querulous K W EH R AH L AH S
+query K W IY R IY
+ques K Y UW Z
+ques(2) K W EH S
+quesada K W EY S AA D AH
+quesenberry K W IY Z AH N B EH R IY
+quesinberry K W EH S IH N B EH R IY
+quesnel K W EY S N EH L
+quesnell K W EY S N EY L
+quest K W EH S T
+questar K W EH S T ER
+questech K W EH S T EH K
+question K W EH S CH AH N
+question's K W EH S CH AH N Z
+question's(2) K W EH SH AH N Z
+question(2) K W EH SH AH N
+question-mark K W EH S CH AH N M AA R K
+questionable K W EH S CH AH N AH B AH L
+questioned K W EH S CH AH N D
+questioner K W EH S CH AH N ER
+questioners K W EH S CH AH N ER Z
+questioning K W EH S CH AH N IH NG
+questionings K W EH S CH AH N IH NG Z
+questionnaire K W EH S CH AH N EH R
+questionnaires K W EH S CH AH N EH R Z
+questions K W EH S CH AH N Z
+questions' K W EH S CH AH N Z
+questran K W EH S T R AE N
+questrom K W EH S T R AH M
+quests K W EH S T S
+queue K Y UW
+queues K Y UW Z
+queuing K Y UW IH NG
+quevedo K W EY V EY D OW
+quezada K W EY Z AA D AH
+qui K W IY
+quibble K W IH B AH L
+quibbles K W IH B AH L Z
+quibbling K W IH B AH L IH NG
+quibbling(2) K W IH B L IH NG
+quiche K IY SH
+quick K W IH K
+quickel K W IH K AH L
+quicken K W IH K AH N
+quickened K W IH K AH N D
+quickening K W IH K AH N IH NG
+quickens K W IH K AH N Z
+quicker K W IH K ER
+quickest K W IH K IH S T
+quickie K W IH K IY
+quickly K W IH K L IY
+quickness K W IH K N AH S
+quicksand K W IH K S AE N D
+quicksands K W IH K S AE N D Z
+quicksilver K W IH K S IH L V ER
+quicktime K W IH K T AY M
+quid K W IH D
+quiescent K W AY EH S AH N T
+quiet K W AY AH T
+quieted K W AY AH T AH D
+quieted(2) K W AY AH T IH D
+quieter K W AY AH T ER
+quietest K W AY AH T AH S T
+quieting K W AY AH T IH NG
+quietist K W AY AH T AH S T
+quietly K W AY AH T L IY
+quietness K W AY AH T N AH S
+quiets K W AY AH T S
+quiett K W IY T
+quievoni K W IH V AO N IY
+quigg K W IH G
+quiggle K W IH G AH L
+quigley K W IH G L IY
+quijada K W IY Y AA D AH
+quijano K W IY Y AA N OW
+quik K W IH K
+quiksilver K W IH K S IH L V ER
+quilali K W IH L AA L IY
+quiles K W IY L EH S
+quilici K W IY L IY CH IY
+quill K W IH L
+quillan K W IH L AH N
+quillen K W IH L AH N
+quillian K W IH L Y AH N
+quillin K W IH L IH N
+quilling K W IH L IH NG
+quillman K W IY L M AE N
+quillon K W IH L AH N
+quilmes K W IH L M Z
+quilt K W IH L T
+quilted K W IH L T IH D
+quilter K W IH L T ER
+quilters K W IH L T ER Z
+quilting K W IH L T IH NG
+quilts K W IH L T S
+quilty K W IH L T IY
+quimby K W IH M B IY
+quin K W IH N
+quina K W IY N AH
+quina's K W IY N AH Z
+quinby K W IH N B IY
+quince K W IH N S
+quincey K W IH N S IY
+quincy K W IH N S IY
+quincy's K W IH N S IY Z
+quindlen K W IH N D L AH N
+quine K W AY N
+quinine K W AY N AY N
+quinlan K W IH N L AH N
+quinley K W IH N L IY
+quinlin K W IH N L IH N
+quinlivan K W IH N L IH V AH N
+quinn K W IH N
+quinn's K W IH N Z
+quinnell K W IH N AH L
+quinney K W IH N IY
+quinobequin K W IH N OW B IH K W IH N
+quinoco K W IH N OW K OW
+quinon K W IH N AH N
+quinones K W IH N OW N Z
+quinonez K W IY N OW N EH Z
+quint K W IH N T
+quinta K W IH N T AH
+quintal K W IH N T AH L
+quintana K W IY N T AE N AH
+quintanar K W IH N T AH N ER
+quintanilla K W IH N T AH N IH L AH
+quintela K W IY N T EY L AH
+quinter K W IH N T ER
+quintero K W IY N T EH R OW
+quinteros K W IY N T EH R OW Z
+quintessence K W IH N T EH S AH N S
+quintessential K W IH N T IH S EH N SH AH L
+quintessential(2) K W IH N T IH S EH N CH AH L
+quintessentially K W IH N T AH S EH N CH AH L IY
+quintet K W IH N T EH T
+quintile K W IH N T IH L
+quintile(2) K W IH N T AY L
+quintin K W IH N T IH N
+quintina K W IY N T IY N AH
+quinto K W IH N T OW
+quinton K W IH N T AO N
+quints K W IH N T S
+quintuple K W IH N T UW P AH L
+quintuple(2) K W IH N T AH P AH L
+quintupled K W IH N T Y UW P AH L D
+quintupled(2) K W IH N T AH P AH L D
+quintuplet K W IH N T AH P L AH T
+quintuplets K W IH N T AH P L AH T S
+quip K W IH P
+quipp K W IH P
+quipped K W IH P T
+quips K W IH P S
+quiram K W AO R AH M
+quire K W AY R
+quirin K W IH R IH N
+quiring K W AY R IH NG
+quirion K W IH R IY AH N
+quirk K W ER K
+quirke K W ER K
+quirks K W ER K S
+quirky K W ER K IY
+quiroga K W IH R OW G AH
+quiros K W IH R OW Z
+quiroz K W IH R OW Z
+quiry K W AY R IY
+quisenberry K W AY Z AH N B EH R IY
+quisling K W IH Z L IH NG
+quist K W IH S T
+quist's K W IH S T S
+quit K W IH T
+quite K W AY T
+quito K W IY T OW
+quito's K W IY T OW Z
+quito's(2) K IY T OW Z
+quito(2) K IY T OW
+quits K W IH T S
+quitter K W IH T ER
+quitters K W IH T ER Z
+quitting K W IH T IH NG
+quiver K W IH V ER
+quivering K W IH V ER IH NG
+quixote K IY HH OW T IY
+quixotic K W IH K S AA T IH K
+quiz K W IH Z
+quizard K W IH Z ER D
+quizzed K W IH Z D
+quizzes K W IH Z IH Z
+quizzical K W IH Z AH K AH L
+quizzing K W IH Z IH NG
+quo K W OW
+quon K W AA N
+quorum K W AO R AH M
+quorums K W AO R AH M Z
+quota K W OW T AH
+quotable K W OW T AH B AH L
+quotas K W OW T AH Z
+quotation K W OW T EY SH AH N
+quotations K W OW T EY SH AH N Z
+quote K W OW T
+quoted K W OW T AH D
+quoted(2) K W OW T IH D
+quotes K W OW T S
+quotient K W OW SH AH N T
+quoting K W OW T IH NG
+quotron K W AA T R AH N
+quotron's K W AA T R AH N Z
+qureshey K UH R EY SH EY
+qureshi K UH R EY SH IY
+r AA R
+r's AA R Z
+r. AA R
+r.'s AA R Z
+r.s AA R Z
+ra R AA
+raab R AA B
+raab's R AA B Z
+raabe R AA B
+raad R AA D
+raap R AA P
+raasch R AA SH
+raatz R AA T S
+rab R AE B
+rabago R AA B AA G OW
+rabalais R AE B AH L EY
+rabb R AE B
+rabbani R AH B AE N IY
+rabbani(2) R AH B AA N IY
+rabbi R AE B AY
+rabbinical R AH B IH N IH K AH L
+rabbis R AE B AY Z
+rabbit R AE B AH T
+rabbit(2) R AE B IH T
+rabbitears R AE B IH T IY R Z
+rabbitlike R AE B AH T L AY K
+rabbits R AE B AH T S
+rabbitt R AE B IH T
+rabble R AE B AH L
+rabe R EY B
+rabel R AE B AH L
+raben R AE B AH N
+rabenold R AE B IH N OW L D
+raber R EY B ER
+rabes R EY B IY Z
+rabey R EY B IY
+rabi R AA B IY
+rabid R AE B IH D
+rabid(2) R EY B IH D
+rabideau R AE B IH D OW
+rabies R EY B IY Z
+rabin R AA B IY N
+rabin's R AA B IY N Z
+rabine R AH B IY N
+rabiner R AH B IY N ER
+rabinovich R AH B IH N AH V IH CH
+rabinovitz R AH B IH N AH V IH T S
+rabinowitz R AH B IH N AH W IH T S
+rabkin R AE B K IH N
+rabobank R AA B OW B AE NG K
+raboin R AH B OY N
+rabold R AE B OW L D
+rabon R AA B AO N
+raborn R AE B ER N
+rabourn R AH B UH R N
+raboy R AE B OY
+rabuck R AE B AH K
+rabuka R AH B UW K AH
+rabun R AE B AH N
+raburn R AE B ER N
+raby R EY B IY
+racal R AE K AH L
+racamier R AE K AH M AY R
+racamier(2) R AH K EY M Y ER
+racanelli R AA K AA N EH L IY
+racca R AE K AH
+raccoon R AE K UW N
+raccoons R AE K UW N Z
+race R EY S
+race's R EY S IH Z
+raced R EY S T
+racehorse R EY S HH AO R S
+racehorses R AE S HH AO R S IH Z
+racemes R EY S IY M Z
+racer R EY S ER
+racers R EY S ER Z
+races R EY S AH Z
+races(2) R EY S IH Z
+racetrack R EY S T R AE K
+racetracks R EY S T R AE K S
+racette R AH S EH T
+raceway R EY S W EY
+racey R EY S IY
+rach R AE CH
+rachad R AH SH AA D
+rachael R EY CH AH L
+rachal R AE K AH L
+rachel R EY CH AH L
+rachel's R EY CH AH L Z
+rachelle R AH SH EH L
+rachels R EY CH IH L Z
+rachelvolt R AH SH EH L V AO L T
+rachford R AE CH F ER D
+rachi R AH SH IY
+rachlin R AE K L IH N
+rachmaninoff R AE K M AE N IH N AO F
+racial R EY SH AH L
+racialism R EY SH AH L IH Z AH M
+racially R EY SH AH L IY
+racicot R AE S IH K AA T
+racier R EY S IY ER
+raciest R EY S IY AH S T
+racine R AH S IY N
+raciness R EY S IY N AH S
+racing R EY S IH NG
+racing's R EY S IH NG Z
+racioppi R AA CH OW P IY
+racism R EY S IH Z AH M
+racist R EY S IH S T
+racists R EY S IH S T S
+racists(2) R EY S IH S S
+racists(3) R EY S IH S
+rack R AE K
+racked R AE K T
+racker R AE K ER
+rackers R AE K ER Z
+racket R AE K IH T
+racketeer R AE K IH T IH R
+racketeering R AE K IH T IH R IH NG
+racketeers R AE K AH T IH R Z
+rackets R AE K AH T S
+racking R AE K IH NG
+rackley R AE K L IY
+rackliff R AE K L IH F
+rackliffe R AE K L IH F
+rackmil R AE K M IH L
+rackow R AA S K OW
+racks R AE K S
+raconteur R AE K AA N T UW R
+racquet R AE K IH T
+racquetball R AE K AH T B AO L
+racquets R AE K IH T S
+racy R EY S IY
+racz R AA CH
+raczka R AA CH K AH
+raczkowski R AH CH K AO F S K IY
+raczynski R AH CH IH N S K IY
+rad R AE D
+rada R AA D AH
+radabaugh R AE D AH B AO
+radakovich R AH D AE K AH V IH CH
+radant R AA D AH N T
+radar R EY D AA R
+radars R EY D AA R Z
+radatz R AE D AH T S
+radavan R AA D AH V AH N
+radbert R AE D B ER T
+radborne R AH D B AO R N
+radbourn R AH D B UH R N
+radbourne R AH D B UH R N
+radburn R AE D B ER N
+radcliff R AE D K L IH F
+radcliffe R AE D K L IH F
+raddatz R AE D AH T S
+radde R AE D
+radder R AE D ER
+radditz R AE D IH T S
+radebaugh R AE D IH B AO
+radecki R AH D EH K IY
+radel R AE D AH L
+radell R AA D EY L
+radella R AH D EH L AH
+rademacher R AE D IH M AH K ER
+rademaker R EY D M EY K ER
+raden R EY D AH N
+rader R EY D ER
+radermacher R AE D ER M AH K ER
+radford R AE D F ER D
+radha R AA D AH
+radi R AA D IY
+radial R EY D IY AH L
+radially R EY D IY AH L IY
+radials R EY D IY AH L Z
+radiance R EY D IY AH N S
+radiance(2) R EY D Y AH N S
+radiant R EY D IY AH N T
+radiant(2) R EY D Y AH N T
+radiate R EY D IY AH T
+radiate(2) R EY D IY EY T
+radiated R EY D IY EY T AH D
+radiated(2) R EY D IY EY T IH D
+radiates R EY D IY EY T S
+radiating R EY D IY EY T IH NG
+radiation R EY D IY EY SH AH N
+radiation's R EY D IY EY SH AH N Z
+radiator R EY D IY EY T ER
+radiators R EY D IY EY T ER Z
+radical R AE D AH K AH L
+radical(2) R AE D IH K AH L
+radicalism R AE D IH K AH L IH Z AH M
+radicalization R AE D IH K AH L IH Z EY SH AH N
+radicalize R AE D IH K AH L AY Z
+radicalized R AE D IH K AH L AY Z D
+radically R AE D IH K L IY
+radicals R AE D AH K AH L Z
+radicals(2) R AE D IH K AH L Z
+radice R AE D IH S
+radich R AE D IH K
+radick R AE D IH K
+radin R AE D IH N
+radinka R AH D IH NG K AH
+radio R EY D IY OW
+radio's R EY D IY OW Z
+radioactive R EY D IY OW AE K T IH V
+radioactivity R EY D IY OW AE K T IH V AH T IY
+radioed R EY D IY OW D
+radiography R EY D IY AA G R AH F IY
+radiological R EY D IY AH L AA JH IH K AH L
+radiologist R EY D IY AA L AH JH IH S T
+radiologists R EY D IY AA L AH JH IH S T S
+radiologists(2) R EY D IY AA L AH JH IH S S
+radiologists(3) R EY D IY AA L AH JH IH S
+radiology R EY D IY AA L AH JH IY
+radioman R EY D IY OW M AE N
+radios R EY D IY OW Z
+radish R AE D IH SH
+radishes R AE D IH SH IH Z
+radisson R AE D AH S AH N
+raditz R EY D IH T S
+radium R EY D IY AH M
+radius R EY D IY AH S
+radke R EY D K IY
+radke(2) R AE D K IY
+radko R AE D K OW
+radle R EY D AH L
+radler R EY D AH L ER
+radler(2) R AE D L ER
+radley R AE D L IY
+radliff R AE D L IH F
+radloff R AE D L AO F
+radman R AE D M AH N
+radmilla R AE D M IH L AH
+radmund R AE D M AH N D
+radner R AE D N ER
+radney R AE D N IY
+radnor R AE D N ER
+rado R AA D OW
+radolf R AE D OW L F
+radomski R AH D AA M S K IY
+radon R EY D AA N
+rados R AA D OW Z
+radosevich R AH D AA S IH V IH CH
+radosh R AH D AO SH
+radovan R AA D OW V AA N
+radowski R AH D OW S K IY
+radowski's R AH D OW S K IY Z
+radtke R AE D K IY
+radu R AA D UW
+radwan R AE D W AH N
+rady R EY D IY
+radziewicz R AA JH AH V IH CH
+radzik R AE D Z IH K
+rae R EY
+raeburn R EY B ER N
+raeder R EH D ER
+raedler R EH D L ER
+rael R EY L
+raether R EH DH ER
+raetz R IY T S
+raf R AE F
+rafael R AA F AY EH L
+rafale R AH F EY L
+rafalski R AH F AA L S K IY
+rafe R EY F
+rafelghem R AH F EH L G AH M
+raff R AE F
+raffa R AE F AH
+raffaele R AA F AY EH L EY
+raffaelli R AA F AA EH L IY
+raffel R AE F AH L
+raffensperger R AE F IH N S P ER G ER
+rafferty R AE F ER T IY
+raffetto R AA F EH T OW
+raffety R AE F T IY
+raffi R AE F IY
+raffi's R AE F IY Z
+raffield R AE F IY L D
+raffish R AE F IH SH
+raffle R AE F AH L
+raffles R AE F AH L Z
+raffo R AE F OW
+rafi R AE F IY
+rafi(2) R AA F IY
+rafik R AE F IH K
+rafsanjani R AE F S AH N JH AA N IY
+raft R AE F T
+rafted R AE F T AH D
+rafted(2) R AE F T IH D
+rafter R AE F T ER
+rafters R AE F T ER Z
+raftery R AE F T ER IY
+rafting R AE F T IH NG
+rafts R AE F T S
+rafuse R AA F UW S IY
+rag R AE G
+ragain R AE G AH N
+ragan R EY G AH N
+ragas R AA G AH Z
+ragavan R AA G AH V AA N
+ragavan's R AA G AH V AA N Z
+rage R EY JH
+raged R EY JH D
+ragel R EY G AH L
+ragen R AE G AH N
+rager R EY G ER
+rages R EY JH IH Z
+ragged R AE G AH D
+raggedy R AE G AH D IY
+raggio R AA JH IY OW
+raghida R AH G IY D AH
+ragin R AE JH IH N
+raging R EY JH IH NG
+ragland R AE G L AH N D
+ragle R EY G AH L
+raglin R AE G L IH N
+ragmen R AE G M AH N
+rago R AA G OW
+ragon R AA G AO N
+ragona R AA G OW N AH
+ragone R AA G OW N IY
+ragonese R AA G OW N EY Z IY
+rags R AE G Z
+ragsdale R AE G Z D EY L
+ragtag R AE G T AE G
+ragtime R AE G T AY M
+ragtop R AE G T AO P
+ragu R AE G UW
+ragucci R AA G UW CH IY
+rague R EY G
+rague(2) R AE G
+ragunathan R AA G UW N AH TH AA N
+ragusa R AA G UW S AH
+ragweed R AE G W IY D
+rah R AA
+rahal R AH HH AA L
+rahe R EY HH IY
+raheem R AH HH IY M
+rahill R AA HH IH L
+rahilly R AE HH AH L IY
+rahim R AH HH IY M
+rahl R AA L
+rahm R AE M
+rahm(2) R AA M
+rahman R AA M AH N
+rahman's R AA M AH N Z
+rahming R AA M IH NG
+rahn R AE N
+rahrig R AE R IH G
+rahul R AH HH UW L
+rahway R AA W EY
+rai R AA IY
+raia R AA Y AH
+raible R EY B AH L
+raiche R EY CH
+raid R EY D
+raided R EY D IH D
+raider R EY D ER
+raider's R EY D ER Z
+raiders R EY D ER Z
+raiders' R EY D ER Z
+raiding R EY D IH NG
+raids R EY D Z
+raiff R EY F
+raiford R EY F ER D
+raikes R EY K S
+raiko R EY K OW
+rail R EY L
+rail's R EY L Z
+railbike R EY L B AY K
+railbiker R EY L B AY K ER
+railbikers R EY L B IH K ER Z
+railcar R EY L K AA R
+railcars R EY L K AA R Z
+raile R EY L
+railed R EY L D
+railey R EY L IY
+railing R EY L IH NG
+railings R EY L IH NG Z
+railroad R EY L R OW D
+railroad's R EY L R OW D Z
+railroaded R EY L R OW D IH D
+railroading R EY L R OW D IH NG
+railroads R EY L R OW D Z
+railroads' R EY L R OW D Z
+rails R EY L Z
+railsback R EY L Z B AE K
+railtex R EY L T EH K S
+railway R EY L W EY
+railway's R EY L W EY Z
+railways R EY L W EY Z
+raimer R EY M ER
+raimo R EY M OW
+raimond R EY M AH N D
+raimondi R AH M OW N D IY
+raimondo R EY M AA N D OW
+rain R EY N
+raina R EY N AH
+rainbolt R EY N B OW L T
+rainbow R EY N B OW
+rainbows R EY N B OW Z
+raincoat R EY N K OW T
+raincoat's R EY N K OW T S
+raincoats R EY N K OW T S
+raindancer R EY N D AE N S ER
+raindrop R EY N D R AA P
+raindrops R EY N D R AA P S
+raine R EY N
+rained R EY N D
+rainer R EY N ER
+raineri R AH N EH R IY
+raines R EY N Z
+rainey R EY N IY
+rainfall R EY N F AO L
+rainfalls R EY N F AO L Z
+rainford R AY N F ER D
+rainforest R AY N F AO R AH S T
+rainforests R AY N F AO R AH S T S
+rainforests(2) R AY N F AO R AH S S
+rainforests(3) R AY N F AO R AH S
+rainger R AA IH NG ER
+rainie R EY N IY
+rainier R EY N IH R
+rainiest R EY N IY AH S T
+raining R EY N IH NG
+rainley R EY N L IY
+rainley's R EY N L IY Z
+rainmaker R EY N M EY K ER
+rainman R EY N M AH N
+rainone R EY N OW N
+rains R EY N Z
+rainstorm R EY N S T AO R M
+rainstorms R EY N S T AO R M Z
+rainville R EY N V IH L
+rainwater R EY N W AO T ER
+rainy R EY N IY
+rais R EY S
+raisa R EY S AH
+raisa(2) R AA IY S AH
+raisanen R AY S AH N AH N
+raisbeck R EY Z B EH K
+raisch R AY SH
+raise R EY Z
+raised R EY Z D
+raiser R EY Z ER
+raisers R EY Z ER Z
+raises R EY Z AH Z
+raises(2) R EY Z IH Z
+raisin R EY Z IH N
+raising R EY Z IH NG
+raisins R EY Z AH N Z
+raisins(2) R EY Z IH N Z
+raisler R EY Z L ER
+raison R EY S AA N
+raisor R EY Z ER
+raissa R EY S AH
+rait R EY T
+raith R EY TH
+raithel R EY TH AH L
+raitt R EY T
+raj R AA ZH
+raj(2) R AA JH
+rajala R AA Y AA L AH
+rajala(2) R AA JH AA L AH
+rajaratnam R AA JH ER AA T N AA M
+rajewski R AY EH F S K IY
+rajiv R AA JH IY V
+rajiv(2) R AA ZH IY V
+rajko R AA ZH K OW
+rajkumar R AA ZH K UW M AA R
+rajneesh R AA JH N IY SH
+raju R AA Y UW
+rak R AE K
+rake R EY K
+raked R EY K T
+raker R EY K ER
+rakers R EY K ER Z
+rakes R EY K S
+rakestraw R EY K S T R AO
+rakich R AE K IH CH
+raking R EY K IH NG
+rakish R EY K IH SH
+rakiya R AH K IY AH
+rakocy R AH K OW CH IY
+rakoczy R AH K OW CH IY
+rakoff R AE K AO F
+rakolta R AH K AA L T AH
+rakovica R AH K OW V IH K AH
+rakow R AE K AW
+rakowski R AH K AW S K IY
+raleigh R AO L IY
+raleigh's R AO L IY Z
+rales R EY L Z
+rales' R EY L Z
+rales's R EY L Z IH Z
+raleses R AH L IY S IH Z
+raley R AE L IY
+ralf R AA L F
+rall R AO L
+rallied R AE L IY D
+rallies R AE L IY Z
+rallis R AE L IH S
+rallo R AE L OW
+ralls R AO L Z
+rally R AE L IY
+rally's R AE L IY Z
+rallying R AE L IY IH NG
+ralph R AE L F
+ralph's R AE L F S
+ralphs R AE L F S
+ralston R AO L S T AH N
+ralston's R AA L S T AH N Z
+ram R AE M
+rama R AA M AH
+ramada R AH M AA D AH
+ramada's R AH M AA D AH Z
+ramadan R AE M AH D AH N
+ramadan(2) R AA M AH D AA N
+ramage R AE M IH JH
+ramaker R AA M EY K ER
+ramala R AH M AA L AH
+ramallah R AH M AE L AH
+ramallah(2) R AH M AA L AH
+raman R EY M AH N
+raman(2) R AA M AH N
+ramaphosa R AE M AH F OW S AH
+ramaswami R AA M AH S W AA M IY
+ramat R AE M AE T
+ramat(2) R AA M AH T
+rambeau R AH M B OW
+rambeau(2) R AE M B OW
+ramberg R AE M B ER G
+rambert R AE M B ER T
+rambin R AE M B IH N
+ramble R AE M B AH L
+rambled R AE M B AH L D
+rambler R AE M B L ER
+ramblers R AE M B L ER Z
+rambling R AE M B L IH NG
+rambling(2) R AE M B AH L IH NG
+rambo R AE M B OW
+rambow R AE M B OW
+rambunctious R AE M B AH NG K SH AH S
+ramel R AE M AH L
+ramella R AH M EH L AH
+ramer R EY M ER
+rameriz R AA M EH R IY Z
+rameses R AE M AH S IY Z
+ramesh R AA M EH SH
+ramesses R AE M AH S IH Z
+ramesses(2) R AE M S IY Z
+ramey R AE M IY
+rami R AA M IY
+ramification R AE M AH F AH K EY SH AH N
+ramifications R AE M AH F AH K EY SH AH N Z
+ramify R AE M AH F AY
+ramires R AA M IH R EH S
+ramirez R AH M IH R EH Z
+ramiro R AH M IH R OW
+ramlawi R AE M L AW IY
+ramler R AE M L ER
+ramlow R AE M L OW
+ramm R AE M
+rammed R AE M D
+rammel R AE M AH L
+rammer R AE M ER
+ramming R AE M IH NG
+ramo R EY M OW
+ramon R AH M OW N
+ramona R AH M OW N AH
+ramonda R AH M AA N D AH
+ramone R AH M OW N
+ramos R AA M OW S
+ramos(2) R EY M OW S
+ramp R AE M P
+rampage R AE M P EY JH
+rampaged R AE M P EY JH D
+rampager R AE M P EY JH ER
+rampages R AE M P EY JH IH Z
+rampaging R AE M P EY JH IH NG
+rampaging(2) R AE M P AH JH IH NG
+rampant R AE M P AH N T
+ramparts R AE M P AA R T S
+rampell R AE M P EH L
+rampey R AE M P IY
+ramping R AE M P IH NG
+rampley R AE M P L IY
+ramps R AE M P S
+rampy R AE M P IY
+ramqvist R AE M K V IH S T
+ramqvist(2) R AE M K W IH S T
+ramrod R AE M R AA D
+rams R AE M Z
+ramsay R AE M Z IY
+ramsay(2) R AE M S EY
+ramsburg R AE M S B ER G
+ramsdell R AE M S D AH L
+ramsden R AE M S D AH N
+ramser R AE M Z ER
+ramses R AE M S IY Z
+ramseur R AH M S ER
+ramsey R AE M Z IY
+ramsey's R AE M Z IY Z
+ramseyer R AE M Z IY ER
+ramseys R AE M Z IY Z
+ramseys(2) R AE M S IY Z
+ramshackle R AE M SH AE K AH L
+ramstad R AE M S T AH D
+ramstein R AE M S T AY N
+ramstein(2) R AE M S T IY N
+ramtane R AE M T EY N
+ramtek R AE M T EH K
+ramtha R AE M TH AH
+ramthun R AE M TH AH N
+ramu R AA M UW
+ramune R AE M Y UW N
+ramus R EY M AH S
+ramzi R AE M Z IY
+ran R AE N
+rana R AE N AH
+ranalli R AH N AE L IY
+ranallo R AH N AE L OW
+rance R AE N S
+rance's R AE N S IH Z
+ranch R AE N CH
+ranch's R AE N CH IH Z
+rancher R AE N CH ER
+ranchera R AA N CH EH R AH
+ranchero R AA N CH EH R OW
+ranchero(2) R AE N CH EH R OW
+ranchers R AE N CH ER Z
+ranches R AE N CH AH Z
+ranching R AE N CH IH NG
+ranchland R AE N CH L AH N D
+rancho R AE N CH OW
+rancid R AE N S IH D
+rancidity R AE N S IH D IH T IY
+ranck R AE NG K
+ranco R AE NG K OW
+rancor R AE NG K ER
+rancorous R AE NG K ER AH S
+rancorousness R AE NG K ER AH S N IH S
+rancourt R AH N K AO R T
+rand R AE N D
+rand's R AE N D Z
+randa R AA N D AH
+randa's R AA N D AH Z
+randal R AE N D AH L
+randall R AE N D AH L
+randazzo R AA N D AA Z OW
+randel R AE N D AH L
+randell R AE N D EH L
+rander R AE N D ER
+randi R AE N D IY
+randle R AE N D AH L
+randleman R AE N D AH L M AH N
+randles R AE N D AH L Z
+randlett R AE N D L IH T
+rando R AA N D OW
+randol R AE N D AH L
+randolf R AE N D OW L F
+randolph R AE N D AA L F
+random R AE N D AH M
+randomize R AE N D AH M AY Z
+randomized R AE N D AH M AY Z D
+randomly R AE N D AH M L IY
+randomness R AE N D AH M N AH S
+rands R AE N D Z
+randy R AE N D IY
+randy's R AE N D IY Z
+ranee R AE N IY
+raneri R AA N EH R IY
+ranes R EY N Z
+raney R EY N IY
+ranft R AE N F T
+rang R AE NG
+range R EY N JH
+ranged R EY N JH D
+rangel R AE N JH EH L
+ranger R EY N JH ER
+ranger's R EY N JH ER Z
+rangers R EY N JH ER Z
+rangers' R EY N JH ER Z
+ranges R EY N JH AH Z
+ranges(2) R EY N JH IH Z
+ranging R EY N JH IH NG
+rangoon R AE NG G UW N
+rangoon's R AE NG G UW N Z
+rangy R EY N JH IY
+ranh R AE N
+rani R AA N IY
+rania R AA N IY AH
+ranieri R AE N IY EH R IY
+ranieri(2) R AH N IY EH R IY
+rank R AE NG K
+ranke R AE NG K
+ranked R AE NG K T
+ranker R AE NG K ER
+rankers R AE NG K ER Z
+rankin R AE NG K IH N
+rankine R AE NG K AY N
+ranking R AE NG K IH NG
+rankings R AE NG K IH NG Z
+rankins R AE NG K IH N Z
+rankle R AE NG K AH L
+rankled R AE NG K AH L D
+rankles R AE NG K AH L Z
+rankling R AE NG K L IH NG
+ranks R AE NG K S
+ranley R AE N L IY
+rann R AE N
+ranney R AE N IY
+rannow R AE N OW
+rans R AE N Z
+ransack R AE N S AE K
+ransacked R AE N S AE K T
+ransacking R AE N S AE K IH NG
+ransall R AE N S AA L
+ransbottom R AE N S B AH T AA M
+ransburg R AE N Z B ER G
+ransburg's R AE N Z B ER G Z
+ransdell R AE N Z D EH L
+ransford R AE N S F ER D
+ransier R AE N S IY ER
+ransley R AE N S L IY
+ransom R AE N S AH M
+ransom's R AE N S AH M Z
+ransome R AE N S AH M
+ransoms R AE N S AH M Z
+ranson R AE N S AH N
+ransone R AE N S AH N
+rant R AE N T
+ranta R AE N T AH
+rantala R AA N T AA L AH
+ranted R AE N T AH D
+ranted(2) R AE N T IH D
+ranting R AE N T IH NG
+rantoul R AE N T UW L
+rantz R AE N T S
+ranum R AE N AH M
+ranz R AE N Z
+rao R AW
+rao's R AW Z
+raoul R AA UW L
+raoux R AE UW
+rap R AE P
+rapacious R AH P AE SH IH S
+rapacious(2) R AH P EY SH IH S
+rapacz R AA P AH CH
+rapanelli R AE P AH N EH L IY
+rapaport R AE P AH P AO R T
+rape R EY P
+raped R EY P T
+raper R EY P ER
+rapers R EY P ER Z
+rapes R EY P S
+rapeseed R EY P S IY D
+raphael R AA F AY EH L
+raphael(2) R AA F Y EH L
+raphael(3) R EY F IY AH L
+raphaela R AE F AY EH L AH
+raphaelite R AE F Y EH L AY T
+raphalian R AH F EY L IY AH N
+raphel R AE F AH L
+rapid R AE P AH D
+rapid(2) R AE P IH D
+rapidity R AH P IH D AH T IY
+rapidly R AE P AH D L IY
+rapids R AE P AH D Z
+rapids(2) R AE P IH D Z
+rapier R EY P IY ER
+raping R EY P IH NG
+rapist R EY P IH S T
+rapist's R EY P IH S T S
+rapists R EY P IH S T S
+rapists(2) R EY P IH S S
+rapists(3) R EY P IH S
+rapkin R AE P K IH N
+rapley R AE P L IY
+rapoca R AH P OW K ER
+rapoport R AH P AA P AO R T
+rapoport(2) R AE P AH P AO R T
+raposa R AA P OW S AH
+raposo R AA P OW S OW
+rapoza R AA P OW Z AH
+rapozo R AA P OW Z OW
+rapp R AE P
+rappa R AE P AH
+rappahannock R AE P AH HH AE N AH K
+rappaport R AE P AH P AO R T
+rappe R AE P
+rapped R AE P T
+rappelling R AH P EH L IH NG
+rapper R AE P ER
+rappers R AE P ER Z
+rapping R AE P IH NG
+rappold R AE P OW L D
+rappoport R AE P AH P AO R T
+rapport R AE P AO R
+rapprochement R AE P R OW SH M AA N
+raps R AE P S
+rapson R AE P S AH N
+rapt R AE P T
+raptis R AH P T IY S
+raptly R AE P T L IY
+raptopoulos R AE P T AA P OW L AH S
+raptor R AE P T ER
+raptorial R AE P T AO R IY AH L
+raptors R AE P T ER Z
+rapture R AE P CH ER
+rapturous R AE P CH ER AH S
+rapuano R AA P UW AA N OW
+raquel R AH K EH L
+rara R AA R AH
+rardon R AA R D AH N
+rare R EH R
+rarefied R EH R AH F AY D
+rarefy R EH R AH F AY
+rarely R EH R L IY
+rareness R EH R N IH S
+rarer R EH R ER
+rarest R EH R AH S T
+rarick R AE R IH K
+raritan R EH R IH T AH N
+rarities R EH R IH T IY Z
+rarity R EH R AH T IY
+rarity(2) R EH R IH T IY
+ras R AE S
+rasbury R AE S B EH R IY
+rascal R AE S K AH L
+rascals R AE S K AH L Z
+rasch R AE SH
+rasche R AE SH
+raschke R AE SH K
+rasco R AA S K OW
+rascoe R AE S K OW
+rascon R AE S K AH N
+rase R EY Z
+raser R EY Z ER
+rasey R AE S IY
+rash R AE SH
+rashad R AH SH AA D
+rasheed R AH SH IY D
+rashes R AE SH IH Z
+rashid R AH SH IY D
+rashid(2) R AA SH IY D
+rasia R AA S IY AH
+rask R AE S K
+raska R AA S K AH
+raske R EY S K
+raskin R AE S K IH N
+raskyn R AE S K IH N
+rasmin R AE S M AH N
+rasmin(2) R AE Z M IH N
+rasmus R AE Z M IH S
+rasmuson R AE Z M AH S AH N
+rasmussen R AE S M AH S AH N
+rasmusson R AE Z M AH S AH N
+rasnake R AE S N AH K
+rasner R AE S N ER
+rasnick R AE S N IH K
+raso R AA S OW
+rasor R EY Z ER
+rasorite R AE S ER AY T
+rasp R AE S P
+raspberries R AE Z B EH R IY Z
+raspberry R AE Z B EH R IY
+rasped R AE S P T
+rasps R AE S P S
+rasputin R AH S P Y UW T IH N
+rasputin's R AE S P Y UW T AH N Z
+raspy R AE S P IY
+rast R AE S T
+raster R AE S T ER
+rasterop R AE S T ER AA P
+rasterops R AE S T ER AA P S
+rastetter R EY S T IH T ER
+rastus R AE S T AH S
+rat R AE T
+rat's R AE T S
+rat-a-tat R AE T AH T AE T
+rata R AE T AH
+ratajczak R AE T AH CH EH K
+ratatisement R AE T AH T AY Z M AH N T
+ratatisements R AE T AH T AY Z M AH N T S
+ratay R AE T EY
+ratchet R AE CH AH T
+ratchet(2) R AE T CH AH T
+ratcheted R AE CH AH T IH D
+ratcheted(2) R AE T CH AH T AH D
+ratcheting R AE CH AH T IH NG
+ratchford R AE CH F ER D
+ratcliff R AE T K L IH F
+ratcliffe R AE T K L IH F
+rate R EY T
+rate's R EY T S
+rated R EY T AH D
+rated(2) R EY T IH D
+rateliff R AE T L IH F
+ratepayer R EY T P EY ER
+ratepayers R EY T P EY ER Z
+ratepayers' R EY T P EY ER Z
+rater R EY T ER
+raters R EY T ER Z
+rates R EY T S
+rath R AE TH
+rathbone R AE TH B OW N
+rathbun R AE TH B AH N
+rathburn R AE TH B ER N
+rathburne R AE TH B ER N
+rathburne's R AE TH B ER N Z
+rathe R EY DH
+rathel R AE TH AH L
+rather R AE DH ER
+rather's R AE DH ER Z
+rather(2) R AH DH ER
+rathert R AE TH ER T
+rathgeber R AE TH G IH B ER
+rathje R AE TH JH AH
+rathjen R AE TH JH AH N
+rathke R AE TH K AH
+rathman R AE TH M AH N
+rathmann R AE TH M AH N
+rathskeller R AE TH S K EH L ER
+ratican R AE T IH K AH N
+ratieni R AH T IY N IY
+ratier R EY T Y ER
+ratification R AE T AH F AH K EY SH AH N
+ratified R AE T AH F AY D
+ratifies R AE T AH F AY Z
+ratify R AE T AH F AY
+ratifying R AE T AH F AY IH NG
+rating R EY T IH NG
+ratings R EY T IH NG Z
+ratio R EY SH IY OW
+ration R AE SH AH N
+ration(2) R EY SH AH N
+rational R AE SH AH N AH L
+rational(2) R AE SH N AH L
+rationale R AE SH AH N AE L
+rationales R AE SH AH N AE L Z
+rationality R AE SH AH N AE L IH T IY
+rationalization R AE SH AH N AH L IH Z EY SH AH N
+rationalization(2) R AE SH N AH L IH Z EY SH AH N
+rationalizations R AE SH AH N AH L IH Z EY SH AH N Z
+rationalizations(2) R AE SH N AH L IH Z EY SH AH N Z
+rationalize R AE SH AH N AH L AY Z
+rationalized R AE SH AH N AH L AY Z D
+rationalizing R AE SH AH N AH L AY Z IH NG
+rationally R AE SH AH N AH L IY
+rationally(2) R AE SH N AH L IY
+rationed R AE SH AH N D
+rationed(2) R EY SH AH N D
+rationing R AE SH AH N IH NG
+rationing(2) R AE SH N IH NG
+rationing(3) R EY SH AH N IH NG
+rations R AE SH AH N Z
+ratios R EY SH IY OW Z
+ratko R AE T K OW
+ratkovich R AA T K AH V IH CH
+ratkowski R AH T K AO F S K IY
+ratledge R AE T L IH JH
+ratley R AE T L IY
+ratliff R AE T L IH F
+ratliffe R AE T L IH F
+ratliffe's R AE T L IH F S
+ratner R AE T N ER
+ratners R AE T N ER Z
+raton R AH T OW N
+rats R AE T S
+rattan R AE T AE N
+rattatouille R AE T AH T UW IY
+ratte R AE T
+ratterman R AE T ER M AH N
+ratterree R AE T ER IY
+rattigan R AE T IH G AH N
+rattigan's R AE T IH G AH N Z
+rattle R AE T AH L
+rattled R AE T AH L D
+rattler R AE T AH L ER
+rattler(2) R AE T L ER
+rattles R AE T AH L Z
+rattlesnake R AE T AH L S N EY K
+rattlesnakes R AE T AH L S N EY K S
+rattling R AE T L IH NG
+rattling(2) R AE T AH L IH NG
+rattner R AE T N ER
+rattray R AE T R EY
+ratts R AE T S
+ratty R AE T IY
+ratu R AA T UW
+ratz R AE T S
+ratzinger R AE T S IH NG ER
+ratzlaff R AE T Z L AH F
+rau R AW
+raub R AO B
+rauber R AW B ER
+raucci R AO CH IY
+rauch R AO CH
+raucher R AO CH ER
+raucher's R AO CH ER Z
+raucous R AO K AH S
+raudabaugh R AO D AH B AO
+raudenbush R AW D IH N B UH SH
+rauen R AW AH N
+rauer R AW ER
+rauh R AO
+raul R AO L
+raul(2) R AA UW L
+raul(3) R AW L
+raulerson R AO L ER S AH N
+rauls R AA UW L Z
+raulston R AO L S T AH N
+raum R AO M
+raun R AO N
+raunchy R AO N CH IY
+raup R AO P
+raupp R AO P
+rausch R AW SH
+rauschenberg R AW SH AH N B ER G
+rauscher R AW SH ER
+rauser R AW S ER
+raut R AW T
+rautenberg R AW T AH N B ER G
+rauth R AO TH
+rautio R AW T IY OW
+ravage R AE V IH JH
+ravaged R AE V IH JH D
+ravages R AE V IH JH IH Z
+ravaging R AE V IH JH IH NG
+ravan R EY V AH N
+rave R EY V
+raved R EY V D
+ravel R AE V AH L
+ravel's R AH V EH L Z
+ravel(2) R AH V EH L
+raveled R AE V AH L D
+raveling R AE V AH L IH NG
+raveling(2) R AE V L IH NG
+ravelo R AA V EH L OW
+raven R EY V AH N
+ravenel R AE V IH N EH L
+ravenell R AE V IH N EH L
+ravenna R AH V EH N AH
+ravenous R AE V AH N AH S
+ravens R EY V AH N Z
+ravenscraft R EY V AH N Z K R AE F T
+ravenscroft R EY V AH N Z K R AO F T
+ravenswood R EY V AH N Z W UH D
+raver R EY V ER
+raves R EY V Z
+ravi R AA V IY
+ravi's R AA V IY S
+ravin R AE V IH N
+ravin's R AE V IH N Z
+ravindran R AA V IH N D R AH N
+ravine R AH V IY N
+ravines R AH V IY N Z
+raving R EY V IH NG
+ravinous R EY V IH N IH S
+ravinus R EY V AH N IH S
+ravioli R AE V IY OW L IY
+ravishankar R AA V IY SH AA NG K AA R
+ravishing R AE V IH SH IH NG
+ravitch R AE V IH CH
+ravitz R AE V IH T S
+raw R AA
+rawalpindi R AE W AO L P IH N D IY
+rawding R AO D IH NG
+rawdon R AO D AH N
+rawe R AO
+rawest R AA AH S T
+rawhide R AO HH AY D
+rawl R AO L
+rawles R AO L Z
+rawley R AO L IY
+rawling R AO L IH NG
+rawlings R AO L IH NG Z
+rawlins R AO L IH N Z
+rawlinson R AO L IH N S AH N
+rawls R AO L Z
+rawness R AO N IH S
+rawski R AO S K IY
+rawson R AO S AH N
+rax R AE K S
+raxter R AE K S T ER
+ray R EY
+ray's R EY Z
+raya R EY AH
+raybon R EY B AH N
+rayborn R EY B ER N
+raybould R EY B OW L D
+raybourn R EY B UH R N
+raybuck R EY B AH K
+rayburn R EY B ER N
+rayburn's R EY B ER N Z
+raychem R EY K EH M
+raycon R EY K AH N
+raycraft R EY K R AE F T
+raye R EY
+rayed R EY D
+rayfield R EY F IY L D
+rayford R EY F ER D
+raygoza R EY G OW Z AH
+rayl R EY L
+rayle R EY L
+rayman R EY M AH N
+raymark R EY M AA R K
+raymark's R EY M AA R K S
+rayment R EY M AH N T
+raymer R EY M ER
+raymo R EY M OW
+raymond R EY M AH N D
+raymonda R EY M AA N D AH
+raymund R EY M AH N D
+raymundo R EY M AH N D OW
+raynard R EY N ER D
+rayne R EY N
+rayner R EY N ER
+raynes R EY N Z
+raynet R EY N EH T
+rayno R EY N OW
+raynor R EY N ER
+rayon R EY AH N
+rayonier R EY OW N IH R
+rayos R EY OW Z
+rayovac R EY AH V AE K
+rayrock R EY R AA K
+rays R EY Z
+rayson R EY Z AH N
+raysor R EY S ER
+raytech R EY T EH K
+raytheon R EY TH IY AA N
+raytheon's R EY TH IY AA N Z
+raz R AE Z
+raza R AE Z AH
+razaleigh R AE Z AH L IY
+raze R EY Z
+razed R EY Z D
+razing R EY Z IH NG
+razo R AA Z OW
+razor R EY Z ER
+razor's R EY Z ER Z
+razorback R EY Z ER B AE K
+razorback's R EY Z ER B AE K S
+razorbacks R EY Z ER B AE K S
+razors R EY Z ER Z
+razzano R AA T S AA N OW
+razzle R AE Z AH L
+razzmatazz R AE Z M AH T AE Z
+rb AA R B IY
+re R EY
+re's R EY Z
+re(2) R IY
+rea R EY
+rea's R EY Z
+reabsorb R IY AH B Z AO R B
+reabsorbed R IY AH B Z AO R B D
+reach R IY CH
+reachable R IY CH AH B AH L
+reached R IY CH T
+reaches R IY CH AH Z
+reaches(2) R IY CH IH Z
+reaching R IY CH IH NG
+reacquire R IY AH K W AY R
+reacquired R IY AH K W AY R D
+react R IY AE K T
+reacted R IY AE K T AH D
+reacted(2) R IY AE K T IH D
+reacting R IY AE K T IH NG
+reaction R IY AE K SH AH N
+reactionaries R IY AE K SH AH N EH R IY Z
+reactionary R IY AE K SH AH N EH R IY
+reactions R IY AE K SH AH N Z
+reactivate R IY AE K T AH V EY T
+reactivated R IY AE K T AH V EY T IH D
+reactivating R IY AE K T IH V EY T IH NG
+reactive R IY AE K T IH V
+reactivity R IY AE K T IH V AH T IY
+reactor R IY AE K T ER
+reactor's R IY AE K T ER Z
+reactors R IY AE K T ER Z
+reacts R IY AE K T S
+read R EH D
+read's R IY D Z
+read(2) R IY D
+readability R IY D AH B IH L IH T IY
+readable R IY D AH B AH L
+reade R EH D
+reader R IY D ER
+reader's R IY D ER Z
+readerman R IY D ER M AH N
+readers R IY D ER Z
+readers' R IY D ER Z
+readership R IY D ER SH IH P
+readied R EH D IY D
+readier R EH D IY ER
+readies R EH D IY Z
+readily R EH D AH L IY
+readiness R EH D IY N AH S
+reading R EH D IH NG
+reading(2) R IY D IH NG
+readinger R EH D IH NG ER
+readings R EH D IH NG Z
+readings(2) R IY D IH NG Z
+readjust R IY AH JH AH S T
+readjusted R IY AH JH AH S T IH D
+readjusting R IY AH JH AH S T IH NG
+readjustment R IY AH JH AH S T M AH N T
+readjustments R IY AH JH AH S T M AH N T S
+readmit R IY AH D M IH T
+readmitted R IY AH D M IH T IH D
+readout R IY D AW T
+reads R IY D Z
+readus R EH D IH S
+ready R EH D IY
+readying R EH D IY IH NG
+reaffiliation R IY AH F IH L IY EY SH AH N
+reaffirm R IY AH F ER M
+reaffirmation R IY AE F ER M EY SH AH N
+reaffirmed R IY AH F ER M D
+reaffirming R IY AH F ER M IH NG
+reaffirms R IY AH F ER M Z
+reagan R EY G AH N
+reagan's R EY G AH N Z
+reagan's(2) R IY G AH N Z
+reagan(2) R IY G AH N
+reaganesque R EY G AH N EH S K
+reaganesque(2) R IY G AH N EH S K
+reaganism R EY G AH N IH Z AH M
+reaganism(2) R IY G AH N IH Z AH M
+reaganite R EY G AH N AY T
+reaganite(2) R IY G AH N AY T
+reaganites R EY G AH N AY T S
+reaganomics R EY G AH N AA M IH K S
+reagans R EY G AH N Z
+reagans' R EY G AH N Z
+reagans'(2) R IY G AH N Z
+reagen R IY G AH N
+reagent R IY EY JH AH N T
+reagent(2) R IY JH AH N T
+reagents R IY EY JH AH N T S
+reagents(2) R IY JH AH N T S
+reagle R IY G AH L
+reagor R IY G ER
+real R IY L
+realamerica R IY L AH M EH R IH K AH
+realcap R IY L K AE P
+reale R IY L
+realestate R IY L IH S T EY T
+reali R IY L IY
+realign R IY AH L AY N
+realigned R IY AH L AY N D
+realigning R IY AH L AY N IH NG
+realignment R IY AH L AY N M AH N T
+realignments R IY AH L AY N M AH N T S
+realism R IY L IH Z AH M
+realist R IY L IH S T
+realistic R IY AH L IH S T IH K
+realistically R IY AH L IH S T IH K L IY
+realists R IY L IH S T S
+realists(2) R IY L IH S S
+realists(3) R IY L IH S
+realities R IY AE L AH T IY Z
+reality R IY AE L AH T IY
+realizable R IY AH L AY Z AH B AH L
+realization R IY L AH Z EY SH AH N
+realizations R IY L AH Z EY SH AH N Z
+realize R IY L AY Z
+realize(2) R IY AH L AY Z
+realized R IY L AY Z D
+realized(2) R IY AH L AY Z D
+realizes R IY AH L AY Z IH Z
+realizes(2) R IY L AY Z IH Z
+realizing R IY L AY Z IH NG
+realizing(2) R IY AH L AY Z IH NG
+reallocate R IY AE L AH K EY T
+reallocated R IY AE L AH K EY T IH D
+reallocating R IY AE L AH K EY T IH NG
+reallocation R IY AE L AH K EY SH AH N
+reallowance R IY AH L AW AH N S
+really R IH L IY
+really(2) R IY L IY
+realm R EH L M
+realms R EH L M Z
+realmuto R AH L M UW T OW
+realpolitik R IY L P AO L IH T IH K
+realtor R IY AH L T ER
+realtor's R IY AH L T ER Z
+realtor's(2) R IY L T ER Z
+realtor(2) R IY L T ER
+realtors R IY AH L T ER Z
+realtors(2) R IY L T ER Z
+realty R IY AH L T IY
+realty's R IY AH L T IY Z
+realty's(2) R IY L T IY Z
+realty(2) R IH L IH T IY
+realty(3) R IY L T IY
+ream R IY M
+reamer R IY M ER
+reamer's R IY M ER Z
+reamers R IY M ER Z
+reames R IY M Z
+reams R IY M Z
+reamy R IY M IY
+reanalyse R IY AE N AH L AY Z
+reanalysed R IY AE N AH L AY Z D
+reanalyses R IY AE N AH L AY Z AH Z
+reanalysing R IY AE N AH L AY Z IH NG
+reaney R IY N IY
+reap R IY P
+reaped R IY P T
+reaper R IY P ER
+reaping R IY P IH NG
+reappear R IY AH P IH R
+reappearance R IY AH P IH R AH N S
+reappeared R IY AH P IH R D
+reappears R IY AH P IH R Z
+reapply R IY AH P L IY
+reappoint R IY AH P OY N T
+reappointed R IY AH P OY N T IH D
+reappointed(2) R IY AH P OY N IH D
+reappointment R IY AH P OY N T M AH N T
+reapportionment R IY AH P AO R SH AH N M AH N T
+reappraisal R IY AH P R EY Z AH L
+reappraise R IY AH P R EY Z
+reappraised R IY AH P R EY Z D
+reaps R IY P S
+rear R IH R
+rearden R IH R D AH N
+reardon R IH R D AH N
+reared R IH R D
+rearick R IH R IH K
+rearing R IH R IH NG
+rearm R IY AA R M
+rearmament R IY AA R M AH M AH N T
+rearming R IY AA R M IH NG
+rearrange R IY ER EY N JH
+rearranged R IY ER EY N JH D
+rearrangement R IY ER EY N JH M AH N T
+rearranging R IY ER EY N JH IH NG
+rearrest R IY ER EH S T
+rearrested R IY ER EH S T IH D
+rears R IH R Z
+rearview R IH R V Y UW
+rearview(2) R IY R V Y UW
+reas R IY Z
+rease R IY S
+reaser R IY S ER
+reasner R IY S N ER
+reason R IY Z AH N
+reasonable R IY Z AH N AH B AH L
+reasonable(2) R IY Z N AH B AH L
+reasonableness R IY Z AH N AH B AH L N AH S
+reasonableness(2) R IY Z N AH B AH L N AH S
+reasonably R IY Z AH N AH B L IY
+reasoned R IY Z AH N D
+reasoner R IY Z AH N ER
+reasoner's R IY Z AH N ER Z
+reasoning R IY Z AH N IH NG
+reasonover R IY Z AH N OW V ER
+reasons R IY Z AH N Z
+reasor R IY S ER
+reassemble R IY AH S EH M B AH L
+reassembled R IY AH S EH M B AH L D
+reassembly R IY AH S EH M B L IY
+reassert R IY AH S ER T
+reasserted R IY AH S ER T AH D
+reasserted(2) R IY AH S ER T IH D
+reasserting R IY AH S ER T IH NG
+reassertion R IY AH S ER SH AH N
+reasserts R IY AH S ER T S
+reassess R IY AH S EH S
+reassessed R IY AH S EH S T
+reassessing R IY AH S EH S IH NG
+reassessment R IY AH S EH S M AH N T
+reassign R IY AH S AY N
+reassigned R IY AH S AY N D
+reassigning R IY AH S AY N IH NG
+reassignment R IY AH S AY N M AH N T
+reassignments R IY AH S AY N M AH N T S
+reassume R IY AH S UW M
+reassumed R IY AH S UW M D
+reassurance R IY AH SH UH R AH N S
+reassurances R IY AH SH ER AH N S IH Z
+reassurances(2) R IY AH SH UH R AH N S IH Z
+reassure R IY AH SH UH R
+reassured R IY AH SH UH R D
+reassures R IY AH SH UH R Z
+reassuring R IY AH SH UH R IH NG
+reassuringly R IY AH SH ER IH NG L IY
+reassuringly(2) R IY AH SH UH R IH NG L IY
+reatta R IY AA T AH
+reattach R IY AH T AE CH
+reattached R IY AH T AE CH T
+reaume R UW M
+reauthorization R IY AO TH ER IH Z EY SH AH N
+reauthorize R IY AO TH ER AY Z
+reauthorized R IY AO TH ER AY Z D
+reauthorizing R IY AO TH ER AY Z IH NG
+reaux R OW
+reave R IY V
+reaver R IY V ER
+reaver's R IY V ER Z
+reaves R IY V Z
+reavis R IY V IH S
+reawaken R IY AH W EY K AH N
+reawakened R IY AH W EY K AH N D
+reawakening R IY AH W EY K AH N IH NG
+reay R EY
+reba R IY B AH
+reback R IY B AE K
+rebalancing R IY B AE L AH N S IH NG
+rebar R IY B AA R
+rebate R IY B EY T
+rebated R IY B EY T IH D
+rebates R IY B EY T S
+rebbe R IY B AH
+rebbe's R IY B AH Z
+rebecca R AH B EH K AH
+rebecca's R AH B EH K AH Z
+rebeck R IY B EH K
+rebeka R IH B IY K AH
+rebekka R IH B EH K AH
+rebel R EH B AH L
+rebel's R EH B AH L Z
+rebel(2) R IH B EH L
+rebelled R IH B EH L D
+rebelling R IH B EH L IH NG
+rebellion R IH B EH L Y AH N
+rebellion's R IH B EH L Y AH N Z
+rebellions R IH B EH L Y AH N Z
+rebellious R IH B EH L Y AH S
+rebellious(2) R AH B EH L Y AH S
+rebelliousness R AH B EH L IY AH S N AH S
+rebello R EH B EH L OW
+rebelo R EH B EH L OW
+rebels R EH B AH L Z
+rebels' R EH B AH L Z
+rebels(2) R IH B EH L Z
+reber R EH B ER
+rebert R EH B ER T
+rebholz R EH B HH OW L Z
+rebid R IY B IH D
+rebirth R IY B ER TH
+rebirths R IY B ER TH S
+rebman R EH B M AH N
+rebmann R EH B M AH N
+rebo R IY B OW
+reboard R IY B AO R D
+rebook R IY B UH K
+rebooked R IY B UH K T
+reborn R IY B AO R N
+rebound R IY B AW N D
+rebounded R IY B AW N D IH D
+rebounding R IY B AW N D IH NG
+rebounds R IY B AW N D Z
+rebroadcast R IY B R AO D K AE S T
+rebstock R EH B S T AA K
+rebuck R EH B AH K
+rebuff R IH B AH F
+rebuff(2) R IY B AH F
+rebuffed R IH B AH F T
+rebuffed(2) R IY B AH F T
+rebuffing R IY B AH F IH NG
+rebuffs R IY B AH F S
+rebuild R IY B IH L D
+rebuilder R IY B IH L D ER
+rebuilders R IY B IH L D ER Z
+rebuilding R IY B IH L D IH NG
+rebuilds R IY B IH L D Z
+rebuilt R IY B IH L T
+rebuke R IY B Y UW K
+rebuke(2) R IH B Y UW K
+rebuked R IH B Y UW K T
+rebuked(2) R IY B Y UW K T
+rebukes R IY B Y UW K S
+rebuking R IY B Y UW K IH NG
+rebus R IY B AH S
+rebut R IH B AH T
+rebut(2) R IY B AH T
+rebuttal R IH B AH T AH L
+rebuttal(2) R IY B AH T AH L
+rebuttals R IH B AH T AH L Z
+rebutted R IH B AH T IH D
+rebutting R IH B AH T IH NG
+rebutting(2) R IY B AH T IH NG
+rec R EH K
+recadi R IH K AE D IY
+recalcitrance R IH K AE L S AH T R AH N S
+recalcitrant R IH K AE L S IH T R AH N T
+recalculate R IY K AE L K Y AH L EY T
+recalculated R IY K AE L K Y AH L EY T IH D
+recalculating R IY K AE L K Y AH L EY T IH NG
+recalculation R IY K AE L K Y AH L EY SH AH N
+recall R IY K AO L
+recall(2) R IH K AO L
+recalled R IH K AO L D
+recalling R IH K AO L IH NG
+recalls R IY K AO L Z
+recalls(2) R IH K AO L Z
+recant R IY K AE N T
+recantation R EH K AH N T EY SH AH N
+recantation(2) R IY K AE N T EY SH AH N
+recanted R IY K AE N T IH D
+recanting R AH K AE N T IH NG
+recap R IY K AE P
+recap(2) R IH K AE P
+recapitalization R IY K AE P IH T AH L IH Z EY SH AH N
+recapitalizations R IY K AE P AH T AH L AH Z EY SH AH N Z
+recapitalize R IY K AE P IH T AH L AY Z
+recapitalized R IY K AE P IH T AH L AY Z D
+recapitalizing R IY K AE P IH T AH L AY Z IH NG
+recapitulate R IY K AH P IH CH AH L EY T
+recapitulates R IY K AH P IH CH AH L EY T S
+recapped R IY K AE P T
+recapping R IY K AE P IH NG
+recaps R IY K AE P S
+recapture R IY K AE P CH ER
+recaptured R IY K AE P CH ER D
+recapturing R IY K AE P CH ER IH NG
+recarey R IY K EH R IY
+recast R IY K AE S T
+recasting R IY K AE S T IH NG
+recchia R EH K IY AH
+recede R IH S IY D
+receded R AH S IY D AH D
+receded(2) R IH S IY D IH D
+receded(3) R IY S IY D IH D
+recedes R IY S IY D Z
+receding R IH S IY D IH NG
+receding(2) R IY S IY D IH NG
+receipt R IH S IY T
+receipt(2) R IY S IY T
+receipts R IH S IY T S
+receipts(2) R IY S IY T S
+receivable R IH S IY V AH B AH L
+receivables R IH S IY V AH B AH L Z
+receive R AH S IY V
+receive(2) R IH S IY V
+receive(3) R IY S IY V
+received R AH S IY V D
+received(2) R IH S IY V D
+received(3) R IY S IY V D
+receiver R AH S IY V ER
+receiver(2) R IH S IY V ER
+receiver(3) R IY S IY V ER
+receivers R AH S IY V ER Z
+receivers(2) R IH S IY V ER Z
+receivers(3) R IY S IY V ER Z
+receivership R IH S IY V ER SH IH P
+receivership(2) R IY S IY V ER SH IH P
+receiverships R IH S IY V ER SH IH P S
+receives R AH S IY V Z
+receives(2) R IH S IY V Z
+receives(3) R IY S IY V Z
+receiving R AH S IY V IH NG
+receiving(2) R IH S IY V IH NG
+receiving(3) R IY S IY V IH NG
+recent R IY S AH N T
+recently R IY S AH N T L IY
+recently(2) R IY S AH N L IY
+receptacle R AH S EH P T AH K AH L
+receptacles R IH S EH P T IH K AH L Z
+receptech R IY S EH P T EH K
+reception R IH S EH P SH AH N
+reception(2) R IY S EH P SH AH N
+receptionist R IH S EH P SH AH N IH S T
+receptionist(2) R IY S EH P SH AH N IH S T
+receptionists R IH S EH P SH AH N IH S T S
+receptionists(2) R IY S EH P SH AH N IH S T S
+receptionists(3) R IH S EH P SH AH N IH S
+receptionists(4) R IY S EH P SH AH N IH S
+receptions R IH S EH P SH AH N Z
+receptive R IH S EH P T IH V
+receptive(2) R IY S EH P T IH V
+receptivity R IY S EH P T IH V IH T IY
+receptor R IY S EH P T ER
+receptors R AH S EH P T ER Z
+recertification R IY S ER T AH F AH K EY SH AH N
+recertified R IY S ER T IH F AY D
+recertify R IY S ER T AH F AY
+recertifying R IY S ER T AH F AY IH NG
+recess R IH S EH S
+recess(2) R IY S EH S
+recessed R IH S EH S T
+recessed(2) R IY S EH S T
+recesses R IY S EH S AH Z
+recessing R IY S EH S IH NG
+recession R IH S EH SH AH N
+recession's R IY S EH SH AH N Z
+recession(2) R IY S EH SH AH N
+recessionary R IY S EH SH AH N EH R IY
+recessions R IH S EH SH AH N Z
+recessive R AH S EH S IH V
+rech R EH K
+recharge R IY CH AA R JH
+rechargeable R IY CH AA R JH AH B AH L
+recharged R IY CH AA R JH D
+recharging R IY CH AA R JH IH NG
+recheck R IY CH EH K
+rechecked R IY CH EH K T
+rechristen R IY K R IH S AH N
+rechristened R IY K R IH S AH N D
+recht R EH K T
+recidivism R AH S IH D IH V IH Z AH M
+recidivist R AH S IH D IH V IH S T
+recidivists R AH S IH D IH V IH S T S
+recidivists(2) R AH S IH D IH V IH S S
+recidivists(3) R AH S IH D IH V IH S
+recine R EH CH IY N IY
+recio R EH CH IY OW
+recipe R EH S AH P IY
+recipe's R EH S AH P IY Z
+recipes R EH S AH P IY Z
+recipient R AH S IH P IY AH N T
+recipient's R IH S IH P IY AH N T S
+recipient(2) R IH S IH P IY AH N T
+recipients R IH S IH P IY AH N T S
+recipients' R IH S IH P IY AH N T S
+reciprocal R IH S IH P R AH K AH L
+reciprocant R IY S IH P R AH K AH N T
+reciprocants R IY S IH P R AH K AH N T S
+reciprocate R IH S IH P R AH K EY T
+reciprocated R IH S IH P R AH K EY T IH D
+reciprocates R IH S IH P R AH K EY T S
+reciprocating R IH S IH P R AH K EY T IH NG
+reciprocity R EH S IH P R AA S IH T IY
+recision R IH S IH ZH AH N
+recisions R IH S IH ZH AH N Z
+recission R AH S IH SH AH N
+recital R AH S AY T AH L
+recitals R IH S AY T AH L Z
+recitation R EH S AH T EY SH AH N
+recitations R EH S IH T EY SH AH N Z
+recitatives R EH S AH T AH T IY V Z
+recite R AH S AY T
+recited R AH S AY T AH D
+recites R IY S AY T S
+reciting R IY S AY T IH NG
+reck R EH K
+reckard R EH K ER D
+recker R EH K ER
+reckitt R EH K IH T
+reckless R EH K L AH S
+recklessly R EH K L AH S L IY
+recklessness R EH K L AH S N AH S
+reckner R EH K N ER
+reckon R EH K AH N
+reckoned R EH K AH N D
+reckoning R EH K AH N IH NG
+reckoning(2) R EH K N IH NG
+reckons R EH K AH N Z
+recktenwald R IH K T EH N W AH L D
+reclaim R IY K L EY M
+reclaimed R IY K L EY M D
+reclaimer R IY K L EY M ER
+reclaimer's R IY K L EY M ER Z
+reclaiming R IY K L EY M IH NG
+reclamation R EH K L AH M EY SH AH N
+reclassification R IY K L AE S AH F AH K EY SH AH N
+reclassified R IY K L AE S AH F AY D
+reclassify R IY K L AE S IH F AY
+reclassifying R IY K L AE S IH F AY IH NG
+recline R IH K L AY N
+reclined R IH K L AY N D
+recliner R IH K L AY N ER
+reclines R IH K L AY N Z
+reclining R IH K L AY N IH NG
+reclining(2) R IY K L AY N IH NG
+recluse R IH K L UW S
+reclusive R IH K L UW S IH V
+reclusive(2) R IY K L UW S IH V
+reco R IY K OW
+reco(2) R EH K OW
+recognition R EH K AH G N IH SH AH N
+recognition's R EH K IH G N IH SH AH N Z
+recognition(2) R EH K IH G N IH SH AH N
+recognizable R EH K AH G N AY Z AH B AH L
+recognizably R EH K AH G N AY Z AH B L IY
+recognizance R IH K AA N AH Z AH N S
+recognize R EH K AH G N AY Z
+recognized R EH K AH G N AY Z D
+recognizes R EH K AH G N AY Z AH Z
+recognizes(2) R EH K AH G N AY Z IH Z
+recognizing R EH K AH G N AY Z IH NG
+recoil R IY K OY L
+recoiled R IY K OY L D
+recoils R IY K OY L Z
+recollect R EH K AH L EH K T
+recollect(2) R IY K AH L EH K T
+recollected R EH K AH L EH K T IH D
+recollected(2) R IY K AH L EH K T IH D
+recollecting R EH K AH L EH K T IH NG
+recollecting(2) R IY K AH L EH K T IH NG
+recollection R EH K AH L EH K SH AH N
+recollections R EH K AH L EH K SH AH N Z
+recollects R EH K AH L EH K T S
+recollects(2) R IY K AH L EH K T S
+recombinant R IH K AA M B IH N AH N T
+recombine R IY K AH M B AY N
+recommend R EH K AH M EH N D
+recommendation R EH K AH M AH N D EY SH AH N
+recommendations R EH K AH M AH N D EY SH AH N Z
+recommended R EH K AH M EH N D AH D
+recommended(2) R EH K AH M EH N D IH D
+recommending R EH K AH M EH N D IH NG
+recommends R EH K AH M EH N D Z
+recommit R IH K AA M IH T
+recommit(2) R IY K AH M IH T
+recommited R IH K AA M IH T IH D
+recommited(2) R IY K AH M IH T IH D
+recompense R EH K AH M P EH N S
+recon R IY K AO N
+reconcile R EH K AH N S AY L
+reconciled R EH K AH N S AY L D
+reconciles R EH K AH N S AY L Z
+reconciliation R EH K AH N S IH L IY EY SH AH N
+reconciliations R EH K AH N S IH L IY EY SH AH N Z
+reconciling R EH K AH N S AY L IH NG
+recondite R EH K AH N D AY T
+recondition R IY K AH N D IH SH AH N
+reconditioned R IY K AH N D IH SH AH N D
+reconditioning R IY K AH N D IH SH AH N IH NG
+reconditioning(2) R IY K AH N D IH SH N IH NG
+reconfiguration R IY K AH N F IH G Y ER EY SH AH N
+reconfigure R IY K AH N F IH G Y ER
+reconfigured R IY K AH N F IH G Y ER D
+reconfirm R IY K AH N F ER M
+reconfirmation R IY K AA N F ER M EY SH AH N
+reconfirmed R IY K AH N F ER M D
+reconnaissance R IY K AA N AH S AH N S
+reconnect R IY K AH N EH K T
+reconnected R IY K AH N EH K T IH D
+reconnecting R IY K AH N EH K T IH NG
+reconnects R IY K AH N EH K T S
+reconnoiter R IY K AH N OY T ER
+reconquer R IY K AO NG K ER
+reconquered R IY K AO NG K ER D
+reconsider R IY K AH N S IH D ER
+reconsideration R IY K AH N S IH D ER EY SH AH N
+reconsidered R IY K AH N S IH D ER D
+reconsidering R IY K AH N S IH D ER IH NG
+reconstitute R IY K AA N S T AH T UW T
+reconstituted R IY K AA N S T AH T UW T IH D
+reconstituting R IY K AA N S T IH T UW T IH NG
+reconstruct R IY K AH N S T R AH K T
+reconstructed R IY K AH N S T R AH K T IH D
+reconstructing R IY K AH N S T R AH K T IH NG
+reconstruction R IY K AH N S T R AH K SH AH N
+reconstructions R IY K AH N S T R AH K SH AH N Z
+reconstructive R IY K AH N S T R AH K T IH V
+reconvene R IY K AH N V IY N
+reconvened R IY K AH N V IY N D
+reconvenes R IY K AH N V IY N Z
+record R AH K AO R D
+record's R EH K ER D Z
+record(2) R EH K ER D
+record(3) R IH K AO R D
+recordable R IH K AO R D AH B AH L
+recorded R AH K AO R D AH D
+recorded(2) R IH K AO R D IH D
+recorder R IH K AO R D ER
+recorder(2) R IY K AO R D ER
+recorders R IH K AO R D ER Z
+recorders(2) R IY K AO R D ER Z
+recording R AH K AO R D IH NG
+recording(2) R IH K AO R D IH NG
+recordings R IH K AO R D IH NG Z
+recordkeeping R EH K ER D K IY P IH NG
+records R AH K AO R D Z
+records' R EH K ER D Z
+records(2) R EH K ER D Z
+records(3) R IH K AO R D Z
+recore R EH K AO R IY
+recoton R IH K AO T IH N
+recount R IH K AW N T
+recount(2) R IY K AW N T
+recounted R IH K AW N T IH D
+recounted(2) R IY K AW N T IH D
+recounting R IH K AW N T IH NG
+recounting(2) R IY K AW N T IH NG
+recounts R IY K AW N T S
+recounts(2) R IH K AW N T S
+recoup R IH K UW P
+recouped R IH K UW P T
+recouping R IH K UW P IH NG
+recoups R IH K UW P S
+recourse R IY K AO R S
+recover R IH K AH V ER
+recoverable R IH K AH V ER AH B AH L
+recovered R AH K AH V ER D
+recovered(2) R IH K AH V ER D
+recoveries R IH K AH V ER IY Z
+recovering R AH K AH V ER IH NG
+recovering(2) R IH K AH V ER IH NG
+recovers R IH K AH V ER Z
+recovery R IH K AH V R IY
+recovery's R IH K AH V ER IY Z
+recovery's(2) R IH K AH V R IY Z
+recovery(2) R IH K AH V ER IY
+recreate R EH K R IY EY T
+recreate(2) R IY K R IY EY T
+recreated R EH K R IY EY T IH D
+recreated(2) R IY K R IY EY T IH D
+recreates R EH K R IY EY T S
+recreates(2) R IY K R IY EY T S
+recreating R EH K R IY EY T IH NG
+recreating(2) R IY K R IY EY T IH NG
+recreation R EH K R IY EY SH AH N
+recreational R EH K R IY EY SH AH N AH L
+recriminate R IH K R IH M IH N EY T
+recrimination R IH K R IH M IH N EY SH AH N
+recriminations R IH K R IH M IH N EY SH AH N Z
+recross R IY K R AO S
+recruit R AH K R UW T
+recruit's R IY K R UW T S
+recruit(2) R IH K R UW T
+recruit(3) R IY K R UW T
+recruited R IH K R UW T IH D
+recruited(2) R IY K R UW T IH D
+recruiter R IH K R UW T ER
+recruiters R IH K R UW T ER Z
+recruiting R AH K R UW T IH NG
+recruiting(2) R IH K R UW T IH NG
+recruiting(3) R IY K R UW T IH NG
+recruitment R AH K R UW T M AH N T
+recruitment(2) R IH K R UW T M AH N T
+recruitment(3) R IY K R UW T M AH N T
+recruits R AH K R UW T S
+recruits(2) R IH K R UW T S
+recruits(3) R IY K R UW T S
+rectal R EH K T AH L
+rectangle R EH K T AE NG G AH L
+rectangles R EH K T AE NG G AH L Z
+rectangular R EH K T AE NG G Y AH L ER
+rectenwald R EH K T IH N W AO L D
+rectification R EH K T AH F AH K EY SH AH N
+rectified R EH K T AH F AY D
+rectifier R EH K T AH F AY ER
+rectifiers R EH K T AH F AY ER Z
+rectifies R EH K T AH F AY Z
+rectify R EH K T AH F AY
+rectifying R EH K T AH F AY IH NG
+rectitude R EH K T IH T UW D
+rector R EH K T ER
+rectory R EH K T ER IY
+rectum R EH K T AH M
+recuperate R IH K UW P ER EY T
+recuperated R IH K UW P ER EY T AH D
+recuperater R IH K UW P ER EY T ER
+recuperates R IH K UW P ER EY T S
+recuperating R IH K UW P ER EY T IH NG
+recuperating(2) R IY K UW P ER EY T IH NG
+recuperation R IH K UW P ER EY SH AH N
+recuperative R IH K UW P ER AH T IH V
+recupero R EY K UW P EH R OW
+recur R IH K ER
+recur(2) R IY K ER
+recurred R IY K ER D
+recurrence R IH K ER AH N S
+recurrence(2) R IY K ER AH N S
+recurrent R IH K ER AH N T
+recurrent(2) R IY K ER AH N T
+recurring R IH K ER IH NG
+recurring(2) R IY K ER IH NG
+recusal R IH K Y UW Z AH L
+recuse R IH K Y UW Z
+recused R IH K Y UW Z D
+recusing R IH K Y UW Z IH NG
+recyclable R IY S AY K L AH B AH L
+recyclables R IY S AY K L AH B AH L Z
+recycle R IY S AY K AH L
+recycled R IY S AY K AH L D
+recycler R IY S AY K L ER
+recyclers R IY S AY K L ER Z
+recycles R IY S AY K AH L Z
+recycling R IY S AY K AH L IH NG
+recycling(2) R IY S AY K L IH NG
+reczek R EH CH EH K
+red R EH D
+red-eye R EH D AY
+red-eyes R EH D AY Z
+red-handed R EH D HH AE N D AH D
+red-handed(2) R EH D HH AE N D IH D
+red-herring R EH D HH EH R IH NG
+red-herrings R EH D HH EH R IH NG Z
+reda R EY D AH
+redact R IH D AE K T
+redacted R IH D AE K T IH D
+redactes R IH D AE K T S
+redacting R IH D AE K T IH NG
+redbird R EH D B ER D
+redbook R EH D B UH K
+redbud R EH D B AH D
+redburn R EH D B ER N
+redcay R EH D K EY
+redco R EH D K OW
+redcoat R EH D K OW T
+redcoats R EH D K OW T S
+redd R EH D
+reddell R EH D AH L
+redden R EH D AH N
+redder R EH D ER
+reddest R EH D IH S T
+reddick R EH D IH K
+reddig R EH D IH G
+reddin R EH D IH N
+redding R EH D IH NG
+reddinger R EH D IH NG ER
+reddington R EH D IH NG T AH N
+reddish R EH D IH SH
+redditt R EH D IH T
+reddoch R EH D AH K
+reddy R EH D IY
+redecorate R IY D EH K ER EY T
+redecorated R IY D EH K ER EY T IH D
+redecorating R IY D EH K ER EY T IH NG
+redecoration R IY D EH K ER EY SH AH N
+rededicate R IY D EH D AH K EY T
+rededication R IY D EH D AH K EY SH AH N
+redeem R IH D IY M
+redeemable R IH D IY M AH B AH L
+redeemed R IH D IY M D
+redeeming R IH D IY M IH NG
+redeems R AH D IY M Z
+redefine R IY D IH F AY N
+redefined R IY D IH F AY N D
+redefines R IY D IH F AY N Z
+redefining R IY D IH F AY N IH NG
+redefinition R IY D EH F AH N IH SH AH N
+redeker R EH D IH K ER
+redel R EH D AH L
+redell R EH D AH L
+redemption R IH D EH M P SH AH N
+redemption(2) R IH D EH M SH AH N
+redemptions R IH D EH M P SH AH N Z
+redemptions(2) R IH D EH M SH AH N Z
+redemptive R IH D EH M P T IH V
+redemptive(2) R IH D EH M T IH V
+redenbaugh R EH D IH N B AW
+redenius R EH D IY N IY IH S
+redeploy R IY D IH P L OY
+redeployed R IY D IH P L OY D
+redeploying R IY D IH P L OY IH NG
+redeployment R IY D IH P L OY M AH N T
+redeployments R IY D IH P L OY M AH N T S
+redeposition R IY D EH P AH Z IH SH AH N
+reder R EH D ER
+redesign R IY D IH Z AY N
+redesigned R IY D IH Z AY N D
+redesigning R IY D IH Z AY N IH NG
+redevelop R IY D IH V EH L AH P
+redevelopment R IY D IH V EH L AH P M AH N T
+redeye R EH D AY
+redeyes R EH D AY Z
+redfearn R EH D F ER N
+redfern R EH D F ER N
+redfield R EH D F IY L D
+redfish R EH D F IH SH
+redford R EH D F ER D
+redford's R EH D F ER D Z
+redgrave R EH D G R EY V
+redhanded R EH D HH AE N D IH D
+redhead R EH D HH EH D
+redheaded R EH D HH EH D IH D
+redheads R EH D HH EH D Z
+redi R EH D IY
+redial R IY D AY AH L
+redic R EH D IH K
+redick R EH D IH K
+redicker R IY D IH K ER
+redid R IY D IH D
+redifer R EH D IH F ER
+redifer(2) R IY D AH F ER
+rediffusion R IY D IH F Y UW ZH AH N
+rediger R EH D IH G ER
+rediker R EH D IH K ER
+reding R IY D IH NG
+redinger R EH D IH NG ER
+redington R EH D IH NG T AH N
+redirect R IY D ER EH K T
+redirected R IY D ER EH K T IH D
+redirecting R IY D ER EH K T IH NG
+redirection R IY D ER EH K SH AH N
+rediscover R IY D IH S K AH V ER
+rediscovered R IY D IH S K AH V ER D
+rediscovering R IY D IH S K AH V ER IH NG
+rediscovery R IY D IH S K AH V R IY
+redish R EH D IH SH
+redisplay R IY D IH S P L EY
+redistribute R IY D IH S T R IH B Y UW T
+redistributed R IY D IH S T R IH B Y UW T IH D
+redistributed(2) R IY D IH S T R IH B Y AH T IH D
+redistributing R IY D IH S T R IH B Y UW T IH NG
+redistributing(2) R IY D IH S T R IH B Y AH T IH NG
+redistribution R IY D IH S T R AH B Y UW SH AH N
+redistributive R IY D IH S T R IH B Y UW T IH V
+redistributive(2) R IY D IH S T R IH B Y AH T IH V
+redistricting R IY D IH S T R IH K T IH NG
+redken R EH D K AH N
+redland R EH D L AH N D
+redler R EH D L ER
+redley R EH D L IY
+redlich R EH D L IH K
+redlin R EH D L IH N
+redlinger R EH D AH L IH NG ER
+redlinger(2) R EH D L IH NG ER
+redlining R EH D L AY N IH NG
+redman R EH D M AE N
+redmann R EH D M AH N
+redmon R EH D M AH N
+redmond R EH D M AH N D
+redmund R EH D M AH N D
+redneck R EH D N EH K
+rednecks R EH D N EH K S
+redner R EH D N ER
+redness R EH D N AH S
+rednour R EH D N UH R
+redo R IY D UW
+redoglia R AH D AA G L IY AH
+redoing R IY D UW IH NG
+redolent R EH D AH L AH N T
+redondo R IH D AA N D OW
+redone R IY D AH N
+redouble R IY D AH B AH L
+redoubled R IY D AH B AH L D
+redoubling R IY D AH B AH L IH NG
+redoubling(2) R IY D AH B L IH NG
+redoubt R AH D AW T
+redoubtable R AH D AW T AH B AH L
+redound R IH D AW N D
+redpath R EH D P AE TH
+redpoll R EH D P OW L
+redpolls R EH D P OW L Z
+redraft R IY D R AE F T
+redrafted R IY D R AE F T IH D
+redraw R IY D R AO
+redrawing R IY D R AO IH NG
+redrawn R IY D R AO N
+redress R IH D R EH S
+redress(2) R IY D R EH S
+redressing R IY D R EH S IH NG
+reds R EH D Z
+reds' R EH D Z
+redshaw R EH D SH AO
+redskin R EH D S K IH N
+redskins R EH D S K IH N Z
+redskins' R EH D S K IH N Z
+redstone R EH D S T OW N
+redstone's R EH D S T OW N Z
+reduce R AH D UW S
+reduce(2) R IH D UW S
+reduce(3) R IY D UW S
+reduced R AH D UW S T
+reduced(2) R IH D UW S T
+reduced(3) R IY D UW S T
+reduces R AH D UW S AH Z
+reduces(2) R IH D UW S IH Z
+reduces(3) R IY D UW S IH Z
+reducible R AH D UW S AH B AH L
+reducing R AH D UW S IH NG
+reducing(2) R IH D UW S IH NG
+reducing(3) R IY D UW S IH NG
+reduction R AH D AH K SH AH N
+reduction(2) R IY D AH K SH AH N
+reductions R IY D AH K SH AH N Z
+redundancies R IH D AH N D AH N S IY Z
+redundancy R IH D AH N D AH N S IY
+redundant R IH D AH N D AH N T
+redus R IY D AH S
+redux R IY D AH K S
+redwald R EH D W AH L D
+redwine R EH D W AY N
+redwood R EH D W UH D
+redwoods R EH D W UH D Z
+ree R IY
+reeb R IY B
+reeb's R IY B Z
+reebok R IY B AA K
+reebok's R IY B AA K S
+reeboks R IY B AA K S
+reebs R IY B Z
+reebs' R IY B Z
+reece R IY S
+reeche R IY CH
+reeck R IY K
+reed R IY D
+reed's R IY D Z
+reeder R IY D ER
+reeders R IY D ER Z
+reeds R IY D Z
+reeducate R IY EH JH AH K EY T
+reeducation R IY EH D Y AH K EY SH AH N
+reeducation(2) R IY EH JH AH K EY SH AH N
+reedy R IY D IY
+reef R IY F
+reefer R IY F ER
+reefers R IY F ER Z
+reefs R IY F S
+reeg R IY G
+reeh R IY
+reek R IY K
+reeking R IY K IH NG
+reeks R IY K S
+reel R IY L
+reelect R IY IH L EH K T
+reelected R IY IH L EH K T AH D
+reelected(2) R IY IH L EH K T IH D
+reelecting R IY IH L EH K T IH NG
+reelection R IY IH L EH K SH AH N
+reeled R IY L D
+reeling R IY L IH NG
+reels R IY L Z
+reemerge R IY IH M ER JH
+reemerged R IY IH M ER JH D
+reemergence R IY IH M ER JH AH N S
+reemphasize R IY EH M F AH S AY Z
+reemployment R IY IH M P L OY M AH N T
+reen R IY N
+reenact R IY IH N AE K T
+reenacted R IY IH N AE K T IH D
+reenactment R IY IH N AE K T M AH N T
+reenactments R IY IH N AE K T M AH N T S
+reenacts R IY IH N AE K T S
+reengineer R IY EH N JH AH N IH R
+reengineering R IY EH N JH AH N IH R IH NG
+reenter R IY IH N T ER
+reentered R IY IH N T ER D
+reentering R IY IH N T ER IH NG
+reentry R IY IH N T R IY
+reents R IY N T S
+reep R IY P
+rees R IY Z
+reese R IY S
+reese's R IY S IH Z
+reeser R IY S ER
+reesjones R IY S JH OW N Z
+reesjones' R IY S JH OW N Z
+reesjones'(2) R IY S JH OW N Z AH Z
+reesman R IY S M AH N
+reesor R IY S ER
+reestablish R IY IH S T AE B L IH SH
+reestablished R IY IH S T AE B L IH SH T
+reestablishing R IY IH S T AE B L IH SH IH NG
+reetz R IY T S
+reevaluate R IY IH V AE L UW EY T
+reevaluated R IY IH V AE L Y UW EY T IH D
+reevaluating R IY IH V AE L Y UW EY T IH NG
+reevaluation R IY IH V AE L Y UW EY SH AH N
+reeve R IY V
+reever R IY V ER
+reeves R IY V Z
+reeves' R IY V Z
+reeves's R IY V Z IH Z
+reexamination R IY IH G Z AE M AH N EY SH AH N
+reexamine R IY EH G Z AE M AH N
+reexamined R IY IH G Z AE M AH N D
+reexamining R IY IH G Z AE M AH N IH NG
+reexport R IY EH K S P AO R T
+reexports R IY EH K S P AO R T S
+ref R EH F
+refaat R AH F AA T
+refah R AH F AA
+refco R EH F K OW
+refcorp R EH F K AO R P
+refenes R EH F IH N EH S
+refenes(2) R IH F IY N Z
+refer R AH F ER
+refer(2) R IH F ER
+referee R EH F ER IY
+referee's R EH F ER IY Z
+referees R EH F ER IY Z
+reference R EH F ER AH N S
+reference(2) R EH F R AH N S
+referenced R EH F ER AH N S T
+referenced(2) R EH F R AH N S T
+references R EH F ER AH N S IH Z
+references(2) R EH F R AH N S IH Z
+referencing R EH F ER AH N S IH NG
+referencing(2) R EH F R AH N S IH NG
+referenda R EH F ER EH N D AH
+referendum R EH F ER EH N D AH M
+referendums R EH F ER EH N D AH M Z
+refering R IH F ER IH NG
+referral R IH F ER AH L
+referrals R IH F ER AH L Z
+referred R AH F ER D
+referred(2) R IH F ER D
+referring R IH F ER IH NG
+refers R AH F ER Z
+refers(2) R IH F ER Z
+reff R EH F
+reffett R EH F IH T
+reffitt R EH F IH T
+reffner R EH F N ER
+refile R IY F AY L
+refiled R IY F AY L D
+refill R IY F IH L
+refilled R IY F IH L D
+refills R IY F IH L Z
+refinance R IY F AH N AE N S
+refinance(2) R IY F AY N AE N S
+refinanced R IY F AH N AE N S T
+refinanced(2) R IY F AY N AE N S T
+refinances R IY F AH N AE N S IH Z
+refinances(2) R IY F AY N AE N S IH Z
+refinancing R IY F AH N AE N S IH NG
+refinancing(2) R IY F AY N AE N S IH NG
+refinancings R IY F AH N AE N S IH NG Z
+refinancings(2) R IY F AY N AE N S IH NG Z
+refine R AH F AY N
+refine(2) R IH F AY N
+refined R AH F AY N D
+refined(2) R IH F AY N D
+refinement R AH F AY N M AH N T
+refinements R IH F AY N M AH N T S
+refiner R IH F AY N ER
+refiner's R IH F AY N ER Z
+refineries R IH F AY N ER IY Z
+refiners R IH F AY N ER Z
+refiners' R IH F AY N ER Z
+refinery R IH F AY N ER IY
+refinery's R IH F AY N ER IY Z
+refines R IH F AY N Z
+refining R AH F AY N IH NG
+refining(2) R IH F AY N IH NG
+refinish R IY F IH N IH SH
+refinished R IY F IH N IH SH T
+refinishing R IY F IH N IH SH IH NG
+refit R IY F IH T
+refitted R IY F IH T IH D
+refitting R IY F IH T IH NG
+reflag R IY F L AE G
+reflagged R IY F L AE G D
+reflagging R IY F L AE G IH NG
+reflate R IY F L EY T
+reflation R IY F L EY SH AH N
+reflect R AH F L EH K T
+reflect(2) R IH F L EH K T
+reflected R AH F L EH K T AH D
+reflected(2) R IH F L EH K T IH D
+reflecting R AH F L EH K T IH NG
+reflecting(2) R IH F L EH K T IH NG
+reflection R AH F L EH K SH AH N
+reflection(2) R IH F L EH K SH AH N
+reflections R IH F L EH K SH AH N Z
+reflective R IH F L EH K T IH V
+reflectone R IY F L EH K T OW N
+reflectone's R IY F L EH K T OW N Z
+reflector R IH F L EH K T ER
+reflectors R IH F L EH K T ER Z
+reflects R IH F L EH K T S
+reflects(2) R IH F L EH K S
+reflex R IY F L EH K S
+reflexes R IY F L EH K S AH Z
+reflexive R AH F L EH K S IH V
+reflexively R IY F L EH K S IH V L IY
+reflexivity R IY F L EH K S IH V IH T IY
+refocus R IY F OW K AH S
+refocused R IY F OW K AH S T
+refocuses R IY F OW K AH S IH Z
+refocusing R IY F OW K AH S IH NG
+reforest R IY F AO R AH S T
+reforestation R IY F AO R AH S T EY SH AH N
+reform R AH F AO R M
+reform(2) R IH F AO R M
+reforma R IH F AO R M AH
+reformation R EH F ER M EY SH AH N
+reformatories R IH F AO R M AH T AO R IY Z
+reformatory R IH F AO R M AH T AO R IY
+reformed R IH F AO R M D
+reformer R IH F AO R M ER
+reformers R IH F AO R M ER Z
+reformers' R IH F AO R M ER Z
+reforming R IH F AO R M IH NG
+reformist R IH F AO R M IH S T
+reformists R IH F AO R M IH S T S
+reformists(2) R IH F AO R M IH S S
+reforms R AH F AO R M Z
+reforms(2) R IH F AO R M Z
+reformulate R IY F AO R M Y AH L EY T
+reformulated R IY F AO R M Y AH L EY T IH D
+refractive R AH F R AE K T IH V
+refractor R AH F R AE K T ER
+refractories R IH F R AE K T ER IY Z
+refractors R AH F R AE K T ER Z
+refractory R AH F R AE K T ER IY
+refrain R IH F R EY N
+refrained R IH F R EY N D
+refraining R IH F R EY N IH NG
+refrains R IH F R EY N Z
+refresh R IH F R EH SH
+refreshed R IY F R EH SH T
+refresher R IH F R EH SH ER
+refreshes R IH F R EH SH IH Z
+refreshing R IH F R EH SH IH NG
+refreshingly R IY F R EH SH IH NG L IY
+refreshment R AH F R EH SH M AH N T
+refreshments R AH F R EH SH M AH N T S
+refrigerant R IH F R IH JH ER AH N T
+refrigerants R IH F R IH JH ER AH N T S
+refrigerate R IH F R IH JH ER EY T
+refrigerated R IH F R IH JH ER EY T IH D
+refrigeration R IH F R IH JH ER EY SH AH N
+refrigerator R AH F R IH JH ER EY T ER
+refrigerator(2) R IH F R IH JH ER EY T ER
+refrigerators R IH F R IH JH ER EY T ER Z
+refsnes R EH F S N IY Z
+refuel R IY F Y UW AH L
+refueled R IY F Y UW AH L D
+refueling R IY F Y UW AH L IH NG
+refueling(2) R IY F Y UW L IH NG
+refuge R EH F Y UW JH
+refuge's R EH F Y UW JH IH Z
+refugee R EH F Y UW JH IY
+refugees R EH F Y UW JH IY Z
+refugees' R EH F Y UW JH IY Z
+refuges R EH F Y UW JH IH Z
+refugio R AH F Y UW JH IY OW
+refund R IH F AH N D
+refund(2) R IY F AH N D
+refundable R IH F AH N D AH B AH L
+refunded R IH F AH N D IH D
+refunding R IH F AH N D IH NG
+refundings R IY F AH N D IH NG Z
+refunds R IH F AH N D Z
+refunds(2) R IY F AH N D Z
+refurbish R IY F ER B IH SH
+refurbished R IY F ER B IH SH T
+refurbishing R IY F ER B IH SH IH NG
+refurbishment R IY F ER B IH SH M AH N T
+refusal R AH F Y UW Z AH L
+refusal(2) R IH F Y UW Z AH L
+refusals R IH F Y UW Z AH L Z
+refuse R AH F Y UW Z
+refuse(2) R EH F Y UW Z
+refuse(3) R IH F Y UW Z
+refused R AH F Y UW Z D
+refused(2) R IH F Y UW Z D
+refusenik R IH F Y UW Z N IH K
+refuseniks R IH F Y UW Z N IH K S
+refuses R AH F Y UW Z AH Z
+refuses(2) R IH F Y UW Z IH Z
+refusing R AH F Y UW Z IH NG
+refusing(2) R IH F Y UW Z IH NG
+refutation R EH F Y UW T EY SH AH N
+refute R IH F Y UW T
+refuted R IH F Y UW T IH D
+refutes R IH F Y UW T S
+refuting R IH F Y UW T IH NG
+reg R EH G
+rega R IY G AH
+regain R IH G EY N
+regained R IY G EY N D
+regaining R IH G EY N IH NG
+regains R IY G EY N Z
+regal R IY G AH L
+regalado R EY G AA L AA D OW
+regaled R IH G EY L D
+regales R IH G EY L Z
+regalia R IH G EY L Y AH
+regaling R IH G EY L IH NG
+regally R IY G AH L IY
+regan R IY G AH N
+regan's R IY G AH N Z
+regard R AH G AA R D
+regard(2) R IH G AA R D
+regarded R AH G AA R D AH D
+regarded(2) R IH G AA R D IH D
+regarding R AH G AA R D IH NG
+regarding(2) R IH G AA R D IH NG
+regardless R AH G AA R D L AH S
+regards R IH G AA R D Z
+regas R IY G AH Z
+regatta R IH G AA T AH
+regattas R AH G AA T AH Z
+regehr R EH G IH R
+regel R EH G AH L
+regen R EH G AH N
+regency R IY JH AH N S IY
+regency's R IY JH AH N S IY Z
+regenerate R IY JH EH N ER EY T
+regenerated R IY JH EH N ER EY T IH D
+regenerating R IY JH EH N ER EY T IH NG
+regeneration R IY JH EH N ER EY SH AH N
+regeneron R IY JH EH N ER AO N
+regensburg R IY G AH N Z B ER G
+regensteiner R EH G AH N S T AY N ER
+regent R IY JH AH N T
+regents R IY JH AH N T S
+reger R IY G ER
+regester R EH JH IH S T ER
+reggae R EH G EY
+reggie R EH JH IY
+reggio R EH JH IY OW
+reggy R EH G IY
+regie R EH G IY
+regier R IY G IY ER
+regime R AH ZH IY M
+regime's R EY ZH IY M Z
+regime(2) R EY ZH IY M
+regimen R EH JH AH M AH N
+regimens R EH JH AH M AH N Z
+regiment R EH JH AH M AH N T
+regimental R EH JH AH M EH N T AH L
+regimentation R EH JH AH M EH N T EY SH AH N
+regimented R EH JH AH M EH N T IH D
+regiments R EH JH AH M AH N T S
+regimes R AH ZH IY M Z
+regimes(2) R EY ZH IY M Z
+regina R IH JH IY N AH
+reginald R EH JH AH N AH L D
+reginald's R EH JH AH N AH L D Z
+region R IY JH AH N
+region's R IY JH AH N Z
+regional R IY JH AH N AH L
+regionalize R IY JH AH N AH L AY Z
+regionalized R IY JH AH N AH L AY Z D
+regionally R IY JH AH N AH L IY
+regionals R IY JH AH N AH L Z
+regions R IY JH AH N Z
+regis R IY JH IH S
+register R EH JH IH S T ER
+register's R EH JH IH S T ER Z
+registered R EH JH IH S T ER D
+registering R EH JH IH S T ER IH NG
+registering(2) R EH JH IH S T R IH NG
+registers R EH JH AH S T ER Z
+registers(2) R EH JH IH S T ER Z
+registrant R EH JH AH S T R AH N T
+registrants R EH JH AH S T R AH N T S
+registrar R EH JH IH S T R AA R
+registrars R EH JH IH S T R AA R Z
+registration R EH JH IH S T R EY SH AH N
+registrations R EH JH IH S T R EY SH AH N Z
+registries R EH JH IH S T R IY Z
+registry R EH JH IH S T R IY
+regner R EH G N ER
+regnery R EH G N ER IY
+regnier R EH G N IY ER
+rego R EH G OW
+regress R IY G R EH S
+regress(2) R IH G R EH S
+regression R AH G R EH SH AH N
+regressions R AH G R EH SH AH N Z
+regressive R AH G R EH S IH V
+regret R AH G R EH T
+regret(2) R IH G R EH T
+regretful R IH G R EH T F AH L
+regretfully R IH G R EH T F AH L IY
+regrets R IH G R EH T S
+regrettable R IH G R EH T AH B AH L
+regrettably R IH G R EH T AH B L IY
+regretted R IH G R EH T IH D
+regretting R IH G R EH T IH NG
+regroup R IY G R UW P
+regrouped R IY G R UW P T
+regrouping R IY G R UW P IH NG
+regs R EH G Z
+regula R EH G UW L AH
+regular R EH G Y AH L ER
+regular(2) R EY G Y AH L ER
+regularity R EH G Y AH L EH R AH T IY
+regularly R EH G Y AH L ER L IY
+regulars R EH G Y AH L ER Z
+regulate R EH G Y AH L EY T
+regulated R EH G Y AH L EY T AH D
+regulated(2) R EH G Y AH L EY T IH D
+regulates R EH G Y AH L EY T S
+regulating R EH G Y AH L EY T IH NG
+regulatingly R EH G Y AH L EY T IH NG L IY
+regulation R EH G Y AH L EY SH AH N
+regulations R EH G Y AH L EY SH AH N Z
+regulative R EH G Y AH L EY T IH V
+regulator R EH G Y AH L EY T ER
+regulator's R EH G Y AH L EY T ER Z
+regulators R EH G Y AH L EY T ER Z
+regulators' R EH G Y AH L EY T ER Z
+regulatory R EH G Y AH L AH T AO R IY
+regwan R EH G W AA N
+reh R EH
+reha R IY HH AH
+rehab R IY HH AE B
+rehabilitate R IY HH AH B IH L AH T EY T
+rehabilitate(2) R IY AH B IH L AH T EY T
+rehabilitated R IY HH AH B IH L AH T EY T IH D
+rehabilitated(2) R IY AH B IH L AH T EY T IH D
+rehabilitating R IY HH AH B IH L AH T EY T IH NG
+rehabilitating(2) R IY AH B IH L AH T EY T IH NG
+rehabilitation R IY HH AH B IH L AH T EY SH AH N
+rehabilitation(2) R IY AH B IH L AH T EY SH AH N
+rehabilitations R IY HH AH B IH L AH T EY SH AH N Z
+rehabilitations(2) R IY AH B IH L AH T EY SH AH N Z
+rehabilitative R IY HH AH B IH L AH T EY T IH V
+rehabilitative(2) R IY AH B IH L AH T EY T IH V
+rehabilitator R IY HH AH B IH L AH T EY T ER
+rehabilitators R IY HH AH B IH L AH T EY T ER Z
+rehability R IY HH AH B IH L AH T IY
+rehability(2) R IY AH B IH L AH T IY
+rehak R EH HH AH K
+rehash R IY HH AE SH
+rehashing R IY HH AE SH IH NG
+rehbein R EH B AY N
+rehbein(2) R EH B IY N
+rehberg R EH B ER G
+rehberger R EH B ER G ER
+rehder R EH D ER
+rehear R IY HH IY R
+rehearing R IY HH IY R IH NG
+rehearings R IY HH IY R IH NG Z
+rehearsal R IH HH ER S AH L
+rehearsal(2) R IY HH ER S AH L
+rehearsals R IH HH ER S AH L Z
+rehearse R IY HH ER S
+rehearsed R IY HH ER S T
+rehearses R IY HH ER S IH Z
+rehearsing R IH HH ER S IH NG
+reher R EH R
+rehfeld R EH F EH L D
+rehfeldt R EH F EH L T
+rehg R EH JH
+rehire R IY HH AY R
+rehired R IY HH AY ER D
+rehiring R IY HH AY R IH NG
+rehkopf R EH K AO P F
+rehkopf(2) R EH K AO F
+rehling R EH L IH NG
+rehm R EH M
+rehman R EH M AH N
+rehmann R EH M AH N
+rehmer R EH M ER
+rehn R EH N
+rehnquist R EH N K W IH S T
+rehor R EH HH ER
+rehrig R EH R IH G
+rehydrate R IY HH AY D R EY T
+rehydration R IY HH AY D R EY SH AH N
+reibel R AY B AH L
+reiber R AY B ER
+reich R AY K
+reich's R AY K S
+reichard R AY K ER D
+reichardt R AY K AA R T
+reichart R IY IH K HH AA R T
+reiche R AY K
+reichel R AY K AH L
+reichelderfer R AY K IH L D ER F ER
+reichelt R AY K IH L T
+reichenbach R AY K AH N B AA K
+reichenberg R AY K AH N B ER G
+reichenberger R AY K AH N B ER G ER
+reicher R AY K ER
+reichert R AY K ER T
+reichhold R AY K HH OW L D
+reichhold's R AY K HH OW L D Z
+reichhold's(2) R AY K OW L D Z
+reichhold(2) R AY K OW L D
+reichl R AY K AH L
+reichle R AY K AH L
+reichler R AY K L ER
+reichley R AY K L IY
+reichlin R AY K L IH N
+reichling R AY K AH L IH NG
+reichling(2) R AY K L IH NG
+reichman R AY K M AH N
+reichmann R AY K M AH N
+reichmanns R AY K M AH N Z
+reichmuth R AY K M UW TH
+reichow R AY K OW
+reichstuhl R AY K S T UW L
+reichwein R AY K W AY N
+reick R IY K
+reicks R AY K S
+reid R IY D
+reid's R IY D Z
+reid-miller R IY D M IH L ER
+reidel R AY D AH L
+reidenbach R AY D IH N B AA K
+reider R IY D ER
+reiders R IY D ER Z
+reiders' R IY D ER Z
+reidinger R AY D IH NG ER
+reidt R IY D T
+reidy R IY D IY
+reier R EY ER
+reierson R AY ER S AH N
+reif R IY F
+reifel R AY F AH L
+reiff R IY F
+reifschneider R AY F SH N AY D ER
+reifsnyder R AY F S N AY D ER
+reifsteck R AY F S T IH K
+reigel R AY G AH L
+reiger R AY G ER
+reighard R AY G HH ER D
+reigle R IY G AH L
+reign R EY N
+reigned R EY N D
+reigning R EY N IH NG
+reignite R IY IH G N AY T
+reignited R IY IH G N AY T IH D
+reigniting R IY IH G N AY T IH NG
+reigns R EY N Z
+reiher R AY HH ER
+reihl R AY L
+reiki R EY K IY
+reil R EY L
+reiland R AY L AH N D
+reiley R EY L IY
+reiling R AY L IH NG
+reilley R EY L IY
+reilly R AY L IY
+reilly's R AY L IY Z
+reily R IY L IY
+reim R IY M
+reiman R AY M AH N
+reimann R AY M AH N
+reimburse R IY IH M B ER S
+reimbursed R IY IH M B ER S T
+reimbursement R IY IH M B ER S M AH N T
+reimbursements R IY IH M B ER S M AH N T S
+reimburses R IY IH M B ER S IH Z
+reimbursing R IY IH M B ER S IH NG
+reimer R AY M ER
+reimers R AY M ER Z
+reimpose R IY IH M P OW Z
+reimposed R IY IH M P OW Z D
+reimposing R IY IH M P OW Z IH NG
+reimposition R IY IH M P AH Z IH SH AH N
+reims R IY M Z
+rein R EY N
+reina R EY IY N AH
+reinaldo R EY N AA L D OW
+reinard R AY N ER D
+reinbold R AY N B OW L D
+reinbolt R AY N B OW L T
+reincarnate R IY IH N K AA R N EY T
+reincarnated R IY IH N K AA R N EY T IH D
+reincarnation R IY IH N K AA R N EY SH AH N
+reincke R AY NG K IY
+reincorporate R IY IH N K AO R P ER EY T
+reincorporating R IY IH N K AO R P ER EY T IH NG
+reincorporation R IY IH N K AO R P ER EY SH AH N
+reindeer R EY N D IH R
+reindel R AY N D AH L
+reinders R AY N D ER Z
+reindl R AY N D AH L
+reindustrialize R IY IH N D AH S T R IY AH L AY Z
+reine R EY N
+reineck R AY N EH K
+reinecke R AY N IH K IY
+reined R EY N D
+reineke R AY N IH K
+reiner R AY N ER
+reiner's R AY N ER Z
+reiners R AY N ER Z
+reinert R AY N ER T
+reinertsen R AY N ER T S AH N
+reinertson R AY N ER T S AH N
+reines R EY N Z
+reiney R EY N IY
+reinforce R IY IH N F AO R S
+reinforced R IY IH N F AO R S T
+reinforcement R IY IH N F AO R S M AH N T
+reinforcements R IY IH N F AO R S M AH N T S
+reinforces R IY IH N F AO R S IH Z
+reinforcing R IY IH N F AO R S IH NG
+reingold R AY NG G OW L D
+reinhard R AY N HH AA R D
+reinhardt R AY N HH AA R T
+reinhart R AY N HH AA R T
+reinhart's R AY N HH AA R T S
+reinheimer R AY N HH AY M ER
+reinhold R AY N HH OW L T
+reinholz R AY N HH OW L Z
+reinig R AY N IH G
+reining R EY N IH NG
+reininger R AY N IH NG ER
+reinitz R AY N IH T S
+reinke R EY NG K
+reinking R AY NG K IH NG
+reinoehl R AY N OW L
+reins R EY N Z
+reinsch R AY N SH
+reinsdorf R AY N Z D AO R F
+reinsel R AY N S AH L
+reinspect R IY IH N S P EH K T
+reinspection R IY IH N S P EH K SH AH N
+reinspections R IY IH N S P EH K SH AH N S
+reinstall R IY IH N S T AA L
+reinstalled R IY IH N S T AA L D
+reinstalls R IY IH N S T AA L Z
+reinstate R IY IH N S T EY T
+reinstated R IY IH N S T EY T IH D
+reinstatement R IY IH N S T EY T M AH N T
+reinstating R IY IH N S T EY T IH NG
+reinstein R AY N S T AY N
+reinstitute R IY IH N S T IH T UW T
+reinstituted R IY IH N S T IH T UW T IH D
+reinstituting R IY IH N S T AH T UW T IH NG
+reinsurance R IY IH N SH UH R AH N S
+reinsure R IY IH N SH UH R
+reinsured R IY IH N SH UH R D
+reinsurer R IY IH N SH UH R ER
+reinsurers R IY IH N SH UH R ER Z
+reintegrate R IY IH N T AH G R EY T
+reintegrated R IY IH N T AH G R EY T IH D
+reintegration R IY IH N T AH G R EY SH AH N
+reinterpret R IY IH N T ER P R AH T
+reinterpretation R IY IH N T ER P R AH T EY SH AH N
+reinterpreted R IY IH N T ER P R AH T IH D
+reinterpreting R IY IH N T ER P R AH T IH NG
+reintroduce R IY IH N T R AH D UW S
+reintroduced R IY IH N T R AH D UW S T
+reintroduces R IY IH N T R AH D UW S IH Z
+reintroducing R IY IH N T R AH D UW S IH NG
+reintroduction R IY IH N T R AH D AH K SH AH N
+reints R AY N T S
+reinvent R IY IH N V EH N T
+reinvented R IY IH N V EH N T IH D
+reinventing R IY IH N V EH N T IH NG
+reinvention R IY IH N V EH N SH AH N
+reinvest R IY IH N V EH S T
+reinvested R IY IH N V EH S T IH D
+reinvesting R IY IH N V EH S T IH NG
+reinvestment R IY IH N V EH S T M AH N T
+reinvestment(2) R IY IH N V EH S M AH N T
+reinvests R IY IH N V EH S T S
+reinvests(2) R IY IH N V EH S S
+reinvests(3) R IY IH N V EH S
+reinvigorate R IY IH N V IH G ER EY T
+reinvigorated R IY IH N V IH G ER EY T IH D
+reinvigorating R IY IH N V IH G ER EY T IH NG
+reinvigoration R IY IH N V IH G ER EY SH AH N
+reinvite R IY IH N V AY T
+reinvited R IY IH N V AY T IH D
+reinwald R AY N W AO L D
+reis R IY Z
+reisch R AY SH
+reischauer R AY SH AW R
+reischman R AY SH M AH N
+reisdorf R AY S D AO R F
+reise R IY S
+reisen R AY S AH N
+reisenauer R AY S IH N AW ER
+reiser R AY S ER
+reisert R AY S ER T
+reish R IY IH SH
+reisig R AY S IH G
+reising R AY S IH NG
+reisinger R AY S IH N JH ER
+reisman R AY S M AH N
+reisner R AY S N ER
+reiss R AY S
+reissig R AY S IH G
+reissman R AY S M AH N
+reissue R IY IH SH UW
+reissued R IY IH SH UW D
+reissuing R IY IH SH UW IH NG
+reist R IY IH S T
+reister R IY IH S T ER
+reiswig R AY S W IH G
+reisz R AY SH
+reit R AY T
+reitan R AY T AH N
+reitano R EY IY T AA N OW
+reiten R AY T AH N
+reiter R AY T ER
+reitera R IY IH T ER AH
+reiterate R IY IH T ER EY T
+reiterated R IY IH T ER EY T IH D
+reiterates R IY IH T ER EY S
+reiterating R IY IH T ER EY T IH NG
+reiteration R IY IH T ER EY SH AH N
+reith R IY TH
+reither R AY DH ER
+reitman R AY T M AH N
+reitmeier R AY T M AY ER
+reitmeyer R AY T M AY ER
+reits R AY T S
+reitsma R AY T S M AH
+reitter R AY T ER
+reitz R AY T S
+reitzel R AY T S AH L
+reitzes R AY T S IH Z
+reitzfeld R IY T S F EH L D
+reitzfeld(2) R AY T S F EH L D
+reject R IH JH EH K T
+reject(2) R IY JH EH K T
+rejected R IH JH EH K T IH D
+rejected(2) R IY JH EH K T AH D
+rejected(3) R IY JH EH K T IH D
+rejecting R IH JH EH K T IH NG
+rejecting(2) R IY JH EH K T IH NG
+rejection R IH JH EH K SH AH N
+rejection(2) R IY JH EH K SH AH N
+rejectionist R IH JH EH K SH AH N IH S T
+rejectionist(2) R IY JH EH K SH AH N IH S T
+rejectionists R IH JH EH K SH AH N IH S T S
+rejectionists(2) R IY JH EH K SH AH N IH S T S
+rejections R IH JH EH K SH AH N Z
+rejections(2) R IY JH EH K SH AH N Z
+rejects R IH JH EH K T S
+rejects(2) R IY JH EH K T S
+rejects(3) R IH JH EH K S
+rejects(4) R IY JH EH K S
+rejiggering R IY JH IH G ER IH NG
+rejoice R IH JH OY S
+rejoiced R IH JH OY S T
+rejoicing R IH JH OY S IH NG
+rejoin R IY JH OY N
+rejoinder R IH JH OY N D ER
+rejoinder(2) R IY JH OY N D ER
+rejoined R IY JH OY N D
+rejoining R IY JH OY N IH NG
+rejoins R IY JH OY N Z
+rejuvenate R IH JH UW V AH N EY T
+rejuvenated R IH JH UW V AH N EY T IH D
+rejuvenates R IH JH UW V IH N EY T S
+rejuvenating R IY JH UW V AH N EY T IH NG
+rejuvenation R IH JH UW V AH N EY SH AH N
+rekenthaler R EH K AH N T AA L ER
+rekenthaler(2) R EH K AH N TH AA L ER
+reker R IY K ER
+rekindle R IY K IH N D AH L
+rekindled R IY K IH N D AH L D
+rekindling R IY K IH N D L IH NG
+relabel R IY L EY B AH L
+relapse R IY L AE P S
+relapsed R IY L AE P S T
+relapses R IY L AE P S IH Z
+relapses(2) R IH L AE P S IH Z
+relapsing R IH L AE P S IH NG
+relate R IH L EY T
+relate(2) R IY L EY T
+related R IH L EY T IH D
+related(2) R IY L EY T AH D
+related(3) R IY L EY T IH D
+relates R IH L EY T S
+relates(2) R IY L EY T S
+relating R IH L EY T IH NG
+relating(2) R IY L EY T IH NG
+relation R IY L EY SH AH N
+relational R IY L EY SH AH N AH L
+relations R IY L EY SH AH N Z
+relationship R IY L EY SH AH N SH IH P
+relationships R IY L EY SH AH N SH IH P S
+relative R EH L AH T IH V
+relative's R EH L AH T IH V Z
+relatively R EH L AH T IH V L IY
+relatives R EH L AH T IH V Z
+relativism R EH L AH T IH V IH Z AH M
+relativistic R EH L AH T IH V IH S T IH K
+relativity R EH L AH T IH V AH T IY
+relaunch R IY L AO N CH
+relaunched R IY L AO N CH T
+relax R IH L AE K S
+relax(2) R IY L AE K S
+relaxation R IY L AE K S EY SH AH N
+relaxed R IH L AE K S T
+relaxed(2) R IY L AE K S T
+relaxes R IH L AE K S IH Z
+relaxing R IH L AE K S IH NG
+relaxing(2) R IY L AE K S IH NG
+relay R IY L EY
+relayed R IY L EY D
+relaying R IY L EY IH NG
+relays R IY L EY Z
+relearn R IY L EH R N
+relearning R IY L EH R N IH NG
+release R IY L IY S
+released R IY L IY S T
+releases R IH L IY S IH Z
+releasing R IY L IY S IH NG
+releford R EH L IH F ER D
+relegate R EH L AH G EY T
+relegated R EH L AH G EY T IH D
+relegating R EH L AH G EY T IH NG
+relend R IY L EH N D
+relending R IY L EH N D IH NG
+relent R IH L EH N T
+relented R IH L EH N T IH D
+relented(2) R IY L EH N T IH D
+relented(3) R AH L EH N AH D
+relented(4) R IY L EH N AH D
+relenting R IH L EH N T IH NG
+relentless R IH L EH N T L IH S
+relentlessly R IH L EH N T L AH S L IY
+relevance R EH L AH V AH N S
+relevancy R EH L AH V AH N S IY
+relevant R EH L AH V AH N T
+relf R EH L F
+relford R EH L F ER D
+reli R EH L IY
+reliability R IY L AY AH B IH L AH T IY
+reliable R IH L AY AH B AH L
+reliable(2) R IY L AY AH B AH L
+reliably R IH L AY AH B L IY
+reliably(2) R IY L AY AH B L IY
+reliance R IH L AY AH N S
+reliance's R IH L AY AH N S IH Z
+reliance's(2) R IY L AY AH N S IH Z
+reliance(2) R IY L AY AH N S
+reliant R IH L AY AH N T
+reliant(2) R IY L AY AH N T
+relic R EH L IH K
+relics R EH L IH K S
+relied R IH L AY D
+relied(2) R IY L AY D
+relief R IH L IY F
+relief(2) R IY L IY F
+reliefs R IY L IY F S
+relies R IH L AY Z
+relies(2) R IY L AY Z
+relieve R IH L IY V
+relieve(2) R IY L IY V
+relieved R IH L IY V D
+relieved(2) R IY L IY V D
+reliever R IY L IY V ER
+relievers R IY L IY V ER Z
+relieves R IY L IY V Z
+relieving R IH L IY V IH NG
+relieving(2) R IY L IY V IH NG
+reliford R EH L IH F AO R D
+relig R IH L IH JH
+religion R IH L IH JH AH N
+religion's R IH L IH JH AH N Z
+religion(2) R IY L IH JH AH N
+religione R IH L IH JH IY OW N IY
+religionist R IY L IH JH AH N IH S T
+religions R IY L IH JH AH N Z
+religiosity R IH L IH JH IY AA S AH T IY
+religious R IH L IH JH AH S
+religious(2) R IY L IH JH AH S
+religiously R IH L IH JH AH S L IY
+relinquish R IH L IH NG K W IH SH
+relinquish(2) R IY L IH NG K W IH SH
+relinquished R IH L IH NG K W IH SH T
+relinquished(2) R IY L IH NG K W IH SH T
+relinquishes R IH L IH NG K W IH SH IH Z
+relinquishing R IY L IH NG K W IH SH IH NG
+relish R EH L IH SH
+relished R EH L IH SH T
+relishes R EH L IH SH AH Z
+relishes(2) R EH L IH SH IH Z
+relishing R EH L IH SH IH NG
+relive R IY L IH V
+relived R IY L IH V D
+reliving R IY L IH V IH NG
+rella R EH L AH
+reller R EH L ER
+relman R EH L M AH N
+reload R IY L OW D
+reloadable R IY L OW D AH B AH L
+reloaded R IY L OW D IH D
+reloads R IY L OW D Z
+relocate R IY L OW K EY T
+relocated R IY L OW K EY T IH D
+relocating R IY L OW K EY T IH NG
+relocation R IY L OW K EY SH AH N
+relocations R IY L OW K EY SH AH N Z
+relondo R IH L AO N D OW
+reloral R IY L AO R AH L
+relph R EH L F
+reluctance R IH L AH K T AH N S
+reluctance(2) R IY L AH K T AH N S
+reluctant R IH L AH K T AH N T
+reluctant(2) R IY L AH K T AH N T
+reluctantly R IH L AH K T AH N T L IY
+rely R IH L AY
+rely(2) R IY L AY
+relyea R EH L Y EY
+relying R IY L AY IH NG
+rem R EH M
+remade R IY M EY D
+remain R IH M EY N
+remain(2) R IY M EY N
+remainder R IH M EY N D ER
+remainder(2) R IY M EY N D ER
+remained R IH M EY N D
+remained(2) R IY M EY N D
+remaining R IH M EY N IH NG
+remaining(2) R IY M EY N IH NG
+remains R IH M EY N Z
+remains(2) R IY M EY N Z
+remake R IY M EY K
+remakes R IY M EY K S
+remaking R IY M EY K IH NG
+remaley R EH M AH L IY
+remaly R IY M AH L IY
+remand R IH M AE N D
+remanded R IH M AE N D IH D
+remanufacture R IY M AE N Y UW F AE K CH ER
+remanufacture(2) R IY M AE N Y AH F AE K CH ER
+remanufactured R IY M AE N Y UW F AE K CH ER D
+remanufactured(2) R IY M AE N Y AH F AE K CH ER D
+remark R IH M AA R K
+remark(2) R IY M AA R K
+remarkable R IH M AA R K AH B AH L
+remarkable(2) R IY M AA R K AH B AH L
+remarkably R IH M AA R K AH B L IY
+remarkably(2) R IY M AA R K AH B L IY
+remarked R IH M AA R K T
+remarked(2) R IY M AA R K T
+remarket R IY M AA R K AH T
+remarketed R IY M AA R K AH T IH D
+remarketing R IY M AA R K AH T IH NG
+remarking R IH M AA R K IH NG
+remarks R IH M AA R K S
+remarks(2) R IY M AA R K S
+remarriage R IY M EH R IH JH
+remarried R IY M EH R IY D
+remarry R IY M EH R IY
+remarrying R IY M EH R IY IH NG
+rematch R IY M AE CH
+rembert R EH M B ER T
+rembold R EH M B OW L D
+rembrandt R EH M B R AE N T
+rembrandt's R EH M B R AE N T S
+rembrandts R EH M B R AE N T S
+remco R EH M K OW
+remedial R IH M IY D IY AH L
+remediate R IY M IY D IY AH T
+remediate(2) R IY M IY D IY EY T
+remediation R IH M IY D IY EY SH AH N
+remedied R EH M AH D IY D
+remedies R EH M AH D IY Z
+remedy R EH M AH D IY
+remedying R EH M AH D IY IH NG
+remember R IH M EH M B ER
+remember(2) R IY M EH M B ER
+remembered R IH M EH M B ER D
+remembered(2) R IY M EH M B ER D
+remembering R IH M EH M B ER IH NG
+remembering(2) R IY M EH M B ER IH NG
+remembering(3) R IH M EH M B R IH NG
+remembering(4) R IY M EH M B R IH NG
+remembers R IH M EH M B ER Z
+remembers(2) R IY M EH M B ER Z
+remembrance R IY M EH M B R AH N S
+remembrances R IH M EH M B R AH N S IH Z
+remer R IY M ER
+remerchandise R IY M ER CH AH N D AY Z
+remerchandised R IY M ER CH AH N D AY Z D
+remerci R IH M ER S IY
+remi R EH M IY
+remic R EH M IH K
+remick R EH M IH K
+remics R EH M IH K S
+remigio R IH M IH JH IY OW
+remillard R EH M IH L ER D
+remind R IY M AY N D
+reminded R IY M AY N D AH D
+reminded(2) R IY M AY N D IH D
+reminder R IY M AY N D ER
+reminders R IY M AY N D ER Z
+reminding R IY M AY N D IH NG
+reminds R IY M AY N D Z
+remington R EH M IH NG T AH N
+remingtons R EH M IH NG T AH N Z
+reminisce R EH M AH N IH S
+reminisced R EH M AH N IH S T
+reminiscence R EH M AH N IH S AH N S
+reminiscences R EH M AH N IH S AH N S IH Z
+reminiscent R EH M AH N IH S AH N T
+reminisces R EH M AH N IH S IH Z
+reminiscing R EH M AH N IH S IH NG
+remis R EY M IY Z
+remiss R IY M IH S
+remisses R IY M IH S IH Z
+remission R IY M IH SH AH N
+remissions R IY M IH SH AH N Z
+remit R IY M IH T
+remittance R IY M IH T AH N S
+remittance(2) R AH M IH T AH N S
+remittances R IY M IH T AH N S IH Z
+remittances(2) R AH M IH T AH N S IH Z
+remitted R IY M IH T IH D
+remley R EH M L IY
+remlinger R EH M AH L IH NG ER
+remlinger(2) R EH M L IH NG ER
+remme R EH M
+remmel R EH M AH L
+remmers R EH M ER Z
+remmert R EH M ER T
+remmington R EH M IH NG T IH N
+remmy R EH M IY
+remnant R EH M N AH N T
+remnants R EH M N AH N T S
+remnick R EH M N IH K
+remo R EH M OW
+remodel R IY M AA D AH L
+remodeled R IY M AA D AH L D
+remodeling R IH M AA D AH L IH NG
+remodeling(2) R IH M AA D L IH NG
+remold R IY M OW L D
+remolded R IY M OW L D IH D
+remorse R IH M AO R S
+remorseful R IH M AO R S F AH L
+remorseless R IH M AO R S L AH S
+remote R IH M OW T
+remote(2) R IY M OW T
+remotely R IY M OW T L IY
+remoteness R IY M OW T N AH S
+remotest R IH M OW T AH S T
+remoulded R IY M OW L D IH D
+removable R IH M UW V AH B AH L
+removal R IH M UW V AH L
+removals R IH M UW V AH L Z
+remove R IY M UW V
+removed R IY M UW V D
+remover R IH M UW V ER
+removes R IY M UW V Z
+removing R IY M UW V IH NG
+rempac R EH M P AE K
+rempe R EH M P
+rempel R EH M P AH L
+rempfer R EH M P F ER
+remsberg R EH M S B ER G
+remsburg R EH M S B ER G
+remsen R EH M S AH N
+remson R EH M S AH N
+remunerate R IH M Y UW N ER EY T
+remuneration R IH M Y UW N ER EY SH AH N
+remunerative R IY M Y UW N ER AH T IH V
+remus R IY M AH S
+remy R EH M IY
+ren R EH N
+rena R IY N AH
+renaissance R EH N AH S AA N S
+renaissance's R EH N AH S AA N S IH Z
+renal R IY N AH L
+renaldo R EH N AA L D OW
+rename R IY N EY M
+renamed R IY N EY M D
+renaming R IY N EY M IH NG
+renamo R EH N AA M OW
+renard R IH N AA R D
+renata R AH N AA T AH
+renate R AH N AA T AH
+renationalization R IY N AE SH AH N AH L IH Z EY SH AH N
+renationalize R IY N AE SH AH N AH L AY Z
+renato R EH N AA T OW
+renaud R IH N OW
+renault R AH N OW
+renault's R IH N AO L T S
+renault's(2) R AH N OW Z
+renault(2) R IH N AO L T
+renbarger R EH N B AA R G ER
+rencen R EH N S AH N
+rench R EH N CH
+rencher R EH N CH ER
+renco R EH N K OW
+renda R EH N D AH
+rendall R EH N D AH L
+rende R EH N D
+rendell R EH N D AH L
+rendell's R EH N D AH L Z
+render R EH N D ER
+rendered R EH N D ER D
+rendering R EH N D ER IH NG
+renderings R EH N D ER IH NG Z
+renders R EH N D ER Z
+rendezvous R AA N D IH V UW
+rendina R EH N D IY N AH
+rending R EH N D IH NG
+rendition R EH N D IH SH AH N
+renditions R EH N D IH SH AH N Z
+rendleman R EH N D AH L M AH N
+rendon R EH N D OW N
+rene R AH N EY
+reneau R IH N OW
+renee R AH N EY
+renegade R EH N AH G EY D
+renegades R EH N AH G EY D Z
+renegar R EH N IH G ER
+renege R IH N IH G
+reneged R IH N IH G D
+reneging R IH N IH G IH NG
+renegotiate R IY N IH G OW SH IY EY T
+renegotiated R IY N IH G OW SH IY EY T IH D
+renegotiating R IY N IH G OW SH IY EY T IH NG
+renegotiation R IY N IH G OW SH IY EY SH AH N
+renegotiations R IY N IH G OW SH IY EY SH AH N Z
+renehan R EH N IH HH AE N
+renew R IH N UW
+renewable R IY N UW AH B AH L
+renewal R IH N UW AH L
+renewals R IH N UW AH L Z
+renewed R IH N UW D
+renewed(2) R IY N UW D
+renewing R IH N UW IH NG
+renews R IH N UW Z
+renfred R EH N F ER D
+renfrew R EH N F R UW
+renfro R EH N F R OW
+renfroe R EH N F R OW
+renfrow R EH N F R AW
+rengel R EH NG G AH L
+rengo R EH NG G OW
+rengo's R EH NG G OW Z
+renick R EH N IH K
+renier R IY N IY ER
+renin R IY N AH N
+renison R EH N IH S AH N
+renita R EH N IY T AH
+renk R EH NG K
+renken R EH NG K AH N
+renko R EH NG K OW
+renminbi R EH N M IH N B IY
+renn R EH N
+renna R EH N AH
+rennard R IH N AA R D
+renne R EH N
+rennels R EH N AH L Z
+renner R EH N ER
+rennert R EH N ER T
+rennet R EH N AH T
+rennick R EH N IH K
+rennie R EH N IY
+renninger R EH N IH NG ER
+renno R EH N OW
+renny R EH N IY
+reno R IY N OW
+reno's R IY N OW Z
+renoir R EH N W AA R
+renoirs R EH N W AA R Z
+renominate R IY N AO M IH N EY T
+renominated R IY N AA M AH N EY T IH D
+renomination R IY N AA M AH N EY SH AH N
+renouf R AH N UW F
+renounce R IH N AW N S
+renounced R IH N AW N S T
+renounces R IH N AW N S IH Z
+renouncing R IH N AW N S IH NG
+renovatable R EH N AH V EY T AH B AH L
+renovate R EH N AH V EY T
+renovated R EH N AH V EY T IH D
+renovating R EH N AH V EY T IH NG
+renovation R EH N AH V EY SH AH N
+renovations R EH N AH V EY SH AH N Z
+renovator R EH N AH V EY T ER
+renovators R EH N AH V EY T ER Z
+renown R IH N AW N
+renowned R IH N AW N D
+renquist R EH N K W IH S T
+rens R EH N Z
+rensberger R EH N S B ER G ER
+rensch R EH N SH
+renschler R EH N SH AH L ER
+renschler(2) R EH N SH L ER
+renshaw R EH N SH AO
+rensing R EH N S IH NG
+rensselaer R EH N S AH L IH R
+renstrom R EH N S T R AH M
+rent R EH N T
+renta R EH N T AH
+rentable R EH N T AH B AH L
+rental R EH N T AH L
+rentals R EH N T AH L Z
+rentas R EH N T AH Z
+rented R EH N T AH D
+rented(2) R EH N T IH D
+renter R EH N T ER
+renteria R EH N T EH R IY AH
+renters R EH N T ER Z
+rentfro R EH N T F R OW
+rentfrow R EH N T F R AW
+renting R EH N T IH NG
+rentmeester R EH N T M IY S T ER
+renton R EH N T AH N
+rents R EH N T S
+rentsch R EH N CH
+rentschler R EH N CH L ER
+rentz R EH N T S
+renunciate R IH N AH N S IY EY T
+renunciation R IH N AH N S IY EY SH AH N
+renuzit R IY N UW Z IH T
+renwick R EH N W IH K
+reny R IY N IY
+renz R EH N Z
+renzi R EH N Z IY
+renzulli R EH N Z UW L IY
+reo R IY OW
+reoccupy R IY AO K Y UW P AY
+reoccur R IY AH K ER
+reoffend R IY AO F EH N D
+reoffended R IY AO F EH N D IH D
+reoffer R IY AO F ER
+reoffered R IY AO F ER D
+reoffering R IY AO F ER IH NG
+reopen R IY OW P AH N
+reopened R IY OW P AH N D
+reopening R IY OW P AH N IH NG
+reopens R IY OW P AH N Z
+reorder R IY AO R D ER
+reordering R IY AO R D ER IH NG
+reorganization R IY AO R G AH N AH Z EY SH AH N
+reorganizations R IY AO R G AH N IH Z EY SH AH N Z
+reorganize R IY AO R G AH N AY Z
+reorganized R IY AO R G AH N AY Z D
+reorganizes R IY AO R G AH N AY Z IH Z
+reorganizing R IY AO R G AH N AY Z IH NG
+reorient R IY AO R IY EH N T
+reorientate R IY AO R IY EH N T EY T
+rep R EH P
+rep's R EH P S
+rep(2) R EH P R IY Z EH T AH T IH V
+rep. R EH P R IY Z EH T AH T IH V
+repack R IY P AE K
+repackage R IY P AE K IH JH
+repackaged R IY P AE K IH JH D
+repackages R IY P AE K IH JH IH Z
+repackaging R IY P AE K IH JH IH NG
+repacked R IY P AE K T
+repaid R IY P EY D
+repaint R IY P EY N T
+repainted R IY P EY N T AH D
+repainting R IY P EY N T IH NG
+repair R IH P EH R
+repairable R IH P EH R AH B AH L
+repaired R IH P EH R D
+repaired(2) R IY P EH R D
+repairing R IH P EH R IH NG
+repairing(2) R IY P EH R IH NG
+repairman R IH P EH R M AE N
+repairman(2) R IY P EH R M AE N
+repairmen R IH P EH R M EH N
+repairs R IH P EH R Z
+repairs(2) R IY P EH R Z
+repap R IY P AE P
+reparation R EH P ER EY SH AH N
+reparations R EH P ER EY SH AH N Z
+repartee R EH P ER T IY
+repasky R IH P AA S K IY
+repass R IY P AE S
+repatriate R IY P EY T R IY EY T
+repatriated R IY P EY T R IY EY T IH D
+repatriating R IY P EY T R IY EY T IH NG
+repatriation R IY P EY T R IY EY SH AH N
+repay R IY P EY
+repayable R IY P EY AH B AH L
+repaying R IY P EY IH NG
+repayment R IY P EY M AH N T
+repayments R IY P EY M AH N T S
+repays R IY P EY Z
+repeal R IH P IY L
+repeal(2) R IY P IY L
+repealed R IH P IY L D
+repealed(2) R IY P IY L D
+repealing R IY P IY L IH NG
+repeals R IY P IY L Z
+repeat R IH P IY T
+repeat(2) R IY P IY T
+repeatable R IH P IY T AH B AH L
+repeated R IH P IY T IH D
+repeated(2) R IY P IY T AH D
+repeated(3) R IY P IY T IH D
+repeatedly R IH P IY T IH D L IY
+repeater R IH P IY T ER
+repeaters R IH P IY T ER Z
+repeating R IH P IY T IH NG
+repeating(2) R IY P IY T IH NG
+repeats R IH P IY T S
+repeats(2) R IY P IY T S
+repel R IH P EH L
+repelled R AH P EH L D
+repelled(2) R IH P EH L D
+repellent R IH P EH L AH N T
+repellents R IH P EH L AH N T S
+repelling R AH P EH L IH NG
+repels R IH P EH L Z
+repent R IH P EH N T
+repentance R IH P EH N T AH N S
+repentant R IH P EH N T AH N T
+repented R IH P EH N T IH D
+repenting R IH P EH N T IH NG
+repents R IH P EH N T S
+repercussion R IY P ER K AH SH AH N
+repercussion(2) R IY P R AH K AH SH AH N
+repercussions R IY P ER K AH SH AH N Z
+repercussions(2) R IY P R AH K AH SH AH N Z
+reperfusion R EH P ER F Y UW ZH AH N
+repertoire R EH P ER T W AA R
+repertory R EH P ER T AO R IY
+repetition R EH P AH T IH SH AH N
+repetitions R EH P AH T IH SH AH N Z
+repetitious R EH P AH T IH SH AH S
+repetitive R IH P EH T IH T IH V
+repetti R EH P EH T IY
+repetto R EH P EH T OW
+reph R EH F
+rephrase R IY F R EY Z
+repinski R IH P IH N S K IY
+repka R EH P K AH
+repko R EH P K OW
+replace R IY P L EY S
+replace(2) ER P L EY S
+replaceable R IY P L EY S AH B AH L
+replaced R IY P L EY S T
+replacement R IH P L EY S M AH N T
+replacements R IY P L EY S M AH N T S
+replaces R IH P L EY S IH Z
+replacing R IH P L EY S IH NG
+replant R IY P L AE N T
+replanted R IY P L AE N T IH D
+replanted(2) R IY P L AE N IH D
+replanting R IY P L AE N T IH NG
+replay R IY P L EY
+replayed R IY P L EY D
+replaying R IY P L EY IH NG
+replays R IY P L EY Z
+replenish R IY P L EH N IH SH
+replenished R IY P L EH N IH SH T
+replenishing R IY P L EH N IH SH IH NG
+replenishment R IH P L EH N IH SH M AH N T
+replete R IY P L IY T
+replica R EH P L IH K AH
+replicas R EH P L AH K AH Z
+replicase R EH P L IH K EY Z
+replicate R EH P L AH K EY T
+replicated R EH P L IH K EY T IH D
+replicates R EH P L IH K EY T S
+replicating R EH P L IH K EY T IH NG
+replication R EH P L AH K EY SH AH N
+replied R IH P L AY D
+replied(2) R IY P L AY D
+replies R IH P L AY Z
+replies(2) R IY P L AY Z
+repligen R IH P L AY JH IH N
+repligen's R IH P L AY JH IH N Z
+replogle R EH P L OW G AH L
+reply R IH P L AY
+reply(2) R IY P L AY
+replying R IH P L AY IH NG
+replying(2) R IY P L AY IH NG
+repo R IY P OW
+reponse R IH P AA N S
+report R IY P AO R T
+report's R IY P AO R T S
+report's(2) R IH P AO R T S
+report(2) R IH P AO R T
+reportable R IH P AO R T AH B AH L
+reportage R IH P AO R T IH JH
+reported R IY P AO R T AH D
+reported(2) R IH P AO R T AH D
+reportedly R IH P AO R T AH D L IY
+reportedly(2) R IY P AO R T AH D L IY
+reporter R IH P AO R T ER
+reporter's R IH P AO R T ER Z
+reporters R IH P AO R T ER Z
+reporters' R IH P AO R T ER Z
+reporting R IY P AO R T IH NG
+reporting(2) R IH P AO R T IH NG
+reportorial R EH P ER T AO R IY AH L
+reports R IH P AO R T S
+reports' R IH P AO R T S
+reports'(2) R IY P AO R T S
+reports(2) R IY P AO R T S
+repos R IY P OW Z
+reposa R EH P OW S AH
+repose R IY P OW Z
+reposition R IY P AH Z IH SH AH N
+repositioned R IY P AH Z IH SH AH N D
+repositioning R IY P AH Z IH SH AH N IH NG
+repositories R IY P AA Z AH T AO R IY Z
+repository R IY P AA Z AH T AO R IY
+repossess R IY P AH Z EH S
+repossessed R IY P AH Z EH S T
+repossession R IY P AH Z EH SH AH N
+repossessions R IY P AH Z EH SH AH N Z
+repp R EH P
+reppert R EH P ER T
+reppond R EH P AH N D
+reppucci R EH P UW CH IY
+repr R EH P ER
+reprehensible R EH P R IH HH EH N S AH B AH L
+represent R EH P R AH Z EH N T
+represent(2) R EH P R IH Z EH N T
+representation R EH P R AH Z EH N T EY SH AH N
+representational R EH P R AH Z AH N T EY SH AH N AH L
+representations R EH P R AH Z AH N T EY SH AH N Z
+representative R EH P R AH Z EH N T AH T IH V
+representative's R EH P R IH Z EH N T AH T IH V Z
+representative's(2) R EH P R IH Z EH N AH T IH V Z
+representative(2) R EH P R IH Z EH N T AH T IH V
+representative(3) R EH P R AH Z EH N AH T IH V
+representative(4) R EH P R IH Z EH N AH T IH V
+representatives R EH P R AH Z EH N T AH T IH V Z
+representatives' R EH P R AH S EH N T AH T IH V Z
+representatives'(2) R EH P R AH S EH N AH T IH V Z
+representatives(2) R EH P R IH Z EH N T AH T IH V Z
+representatives(3) R EH P R AH Z EH N AH T IH V Z
+representatives(4) R EH P R IH Z EH N AH T IH V Z
+represented R EH P R AH Z EH N T AH D
+represented(2) R EH P R IH Z EH N T IH D
+represented(3) R EH P R AH Z EH N AH D
+represented(4) R EH P R IH Z EH N IH D
+representing R EH P R IH Z EH N T IH NG
+representing(2) R EH P R IH Z EH N IH NG
+represents R EH P R AH Z EH N T S
+represents(2) R EH P R IH Z EH N T S
+repress R IY P R EH S
+repressed R IY P R EH S T
+repressing R IY P R EH S IH NG
+repression R IY P R EH SH AH N
+repressions R IY P R EH SH AH N Z
+repressive R IY P R EH S IH V
+reprice R IY P R AY S
+repriced R IY P R AY S T
+repricing R IY P R AY S IH NG
+reprieve R IY P R IY V
+reprimand R EH P R AH M AE N D
+reprimanded R EH P R AH M AE N D IH D
+reprimands R EH P R AH M AE N D Z
+reprint R IY P R IH N T
+reprinted R IY P R IH N T IH D
+reprinting R IY P R IH N T IH NG
+reprints R IY P R IH N T S
+reprisal R IY P R AY Z AH L
+reprisals R IH P R AY Z AH L Z
+reprisals(2) R IY P R AY Z AH L Z
+reprise R IH P R AY Z
+reprise(2) R IH P R IY Z
+reproach R IY P R OW CH
+reprobate R EH P R AO B EY T
+reprocess R IY P R AO S EH S
+reprocessed R IY P R AO S EH S T
+reprocessing R IY P R AO S EH S IH NG
+reproduce R IY P R AH D UW S
+reproduced R IY P R AH D UW S T
+reproduces R IY P R AH D UW S IH Z
+reproducing R IY P R AH D UW S IH NG
+reproduction R IY P R AH D AH K SH AH N
+reproductions R IY P R AH D AH K SH AH N Z
+reproductive R IY P R AH D AH K T IH V
+reprogram R IY P R OW G R AE M
+reprogrammed R IY P R OW G R AE M D
+reprogramming R IY P R OW G R AE M IH NG
+reprograms R IY P R OW G R AE M Z
+reprograph R EH P R OW G R AE F
+reprographic R EH P R OW G R AE F IH K
+reprographics R EH P R OW G R AE F IH K S
+reps R EH P S
+repsher R EH P SH ER
+repsol R EH P S AA L
+reptile R EH P T AY L
+reptiles R EH P T AY L Z
+reptilian R EH P T IH L Y AH N
+reptilians R EH P T IH L Y AH N Z
+republic R IY P AH B L AH K
+republic's R IY P AH B L IH K S
+republic(2) R IY P AH B L IH K
+republica R IH P AH B L IH K AH
+republican R IH P AH B L IH K AH N
+republican's R IY P AH B L IH K AH N Z
+republican(2) R IY P AH B L AH K AH N
+republican(3) R IY P AH B L IH K AH N
+republicanism R IH P AH B L IH K AH N IH Z AH M
+republicans R IH P AH B L IH K AH N Z
+republicans' R IH P AH B L IH K AH N Z
+republicans'(2) R IY P AH B L IH K AH N Z
+republicans(2) R IY P AH B L AH K AH N Z
+republicans(3) R IY P AH B L IH K AH N Z
+republicbank R IY P AH B L IH K B AE NG K
+republicbank's R IY P AH B L IH K B AE NG K S
+republics R IY P AH B L IH K S
+republika R IH P AH B L IH K AH
+repudiate R IY P Y UW D IY EY T
+repudiated R IY P Y UW D IY EY T AH D
+repudiates R IY P Y UW D IY EY T S
+repudiating R IY P Y UW D IY EY T IH NG
+repudiation R IH P Y UW D IY EY SH AH N
+repugnant R IH P AH G N AH N T
+repugnant(2) R IY P AH G N AH N T
+repulse R IY P AH L S
+repulsed R IY P AH L S T
+repulsing R IY P AH L S IH NG
+repulsive R IY P AH L S IH V
+repurchase R IY P ER CH AH S
+repurchased R IY P ER CH AH S T
+repurchases R IY P ER CH AH S IH Z
+repurchasing R IY P ER CH AH S IH NG
+reputable R EH P Y AH T AH B AH L
+reputation R EH P Y AH T EY SH AH N
+reputations R EH P Y AH T EY SH AH N Z
+repute R IY P Y UW T
+reputed R IH P Y UW T IH D
+reputed(2) R IY P Y UW T AH D
+reputed(3) R IY P Y UW T IH D
+reputedly R IH P Y UW T IH D L IY
+requa R EY K W AH
+requalify R IY K W AA L AH F AY
+request R IH K W EH S T
+request(2) R IY K W EH S T
+requested R IH K W EH S T IH D
+requested(2) R IY K W EH S T AH D
+requested(3) R IY K W EH S T IH D
+requester R IH K W EH S T ER
+requesting R IH K W EH S T IH NG
+requesting(2) R IY K W EH S T IH NG
+requests R IH K W EH S T S
+requests(2) R IY K W EH S T S
+requests(3) R IH K W EH S
+requests(4) R IY K W EH S
+requiem R EH K W IY AH M
+require R IY K W AY ER
+require(2) R IY K W AY R
+require(3) R IH K W AY ER
+required R IY K W AY ER D
+required(2) R IY K W AY R D
+requirement R IH K W AY R M AH N T
+requirements R IH K W AY R M AH N T S
+requires R IY K W AY ER Z
+requires(2) R IY K W AY R Z
+requiring R IY K W AY ER IH NG
+requiring(2) R IY K W AY R IH NG
+requisite R EH K W AH Z AH T
+requisites R EH K W AH Z AH T S
+requisition R EH K W AH Z IH SH AH N
+requisitioned R EH K W AH Z IH SH AH N D
+reread R IY R IY D
+rereading R IY R IY D IH NG
+reregulate R IY R EH G Y AH L EY T
+reregulation R IY R EH G Y AH L EY SH AH N
+reroute R IY R UW T
+reroute(2) R IY R AW T
+rerouted R IY R UW T IH D
+rerouted(2) R IY R AW T IH D
+rerouting R IY R UW T IH NG
+rerouting(2) R IY R AW T IH NG
+rerun R IY R AH N
+rerunning R IY R AH N IH NG
+reruns R IY R AH N Z
+res R EY Z
+resale R IY S EY L
+resales R IY S EY L Z
+resch R EH SH
+reschedule R IY S K EH JH UW L
+rescheduled R IY S K EH JH UW L D
+rescheduling R IY S K EH JH UW L IH NG
+reschedulings R IY SH K EH JH UW L IH NG Z
+reschke R EH SH K
+rescigno R EH S CH IY G N OW
+rescind R IH S IH N D
+rescind(2) R IY S IH N D
+rescinded R IH S IH N D IH D
+rescinded(2) R IY S IH N D AH D
+rescinded(3) R IY S IH N D IH D
+rescinding R IH S IH N D IH NG
+rescinds R IH S IH N D Z
+rescinds(2) R IY S IH N D Z
+rescission R IH S IH ZH AH N
+rescissions R IH S IH ZH AH N Z
+rescue R EH S K Y UW
+rescued R EH S K Y UW D
+rescuer R EH S K Y UW ER
+rescuers R EH S K Y UW ER Z
+rescues R EH S K Y UW Z
+rescuing R EH S K Y UW IH NG
+resdel R EH Z D EH L
+reseachers R IY S ER CH ER Z
+reseal R IY S IY L
+resealable R IY S IY L AH B AH L
+resealed R IY S IY L D
+reseals R IY S IY L Z
+research R IY S ER CH
+research's R IY S ER CH IH Z
+researched R IY S ER CH T
+researcher R IY S ER CH ER
+researchers R IY S ER CH ER Z
+researchers' R IY S ER CH ER Z
+researches R IY S ER CH IH Z
+researching R IY S ER CH IH NG
+reseda R EH S EY D AH
+reseed R IY S IY D
+resell R IY S EH L
+reseller R IY S EH L ER
+resellers R IY S EH L ER Z
+reselling R IY S EH L IH NG
+resells R IY S EH L Z
+resemblance R IH Z EH M B L AH N S
+resemblance(2) R IY Z EH M B L AH N S
+resemblances R IY Z EH M B L AH N S AH Z
+resemble R IH Z EH M B AH L
+resemble(2) R IY Z EH M B AH L
+resembled R IH Z EH M B AH L D
+resembled(2) R IY Z EH M B AH L D
+resembles R IH Z EH M B AH L Z
+resembles(2) R IY Z EH M B AH L Z
+resembling R IH Z EH M B AH L IH NG
+resembling(2) R IY Z EH M B AH L IH NG
+resembling(3) R IY Z EH M B L IH NG
+resende R IH S EH N D EY
+resendes R EH S IH N D Z
+resendez R EY S EY N D EH Z
+resendiz R IH S EH N D IH Z
+resent R IH Z EH N T
+resent(2) R IY Z EH N T
+resented R IY Z EH N T AH D
+resented(2) R IY Z EH N AH D
+resentful R IH Z EH N T F AH L
+resenting R IH Z EH N T IH NG
+resenting(2) R IY Z EH N T IH NG
+resenting(3) R IH Z EH N IH NG
+resenting(4) R IY Z EH N IH NG
+resentment R IH Z EH N T M AH N T
+resentment(2) R IH Z EH N M AH N T
+resentments R IH Z EH N T M AH N T S
+resentments(2) R IH Z EH N M AH N T S
+resents R IH Z EH N T S
+reser R IY Z ER
+reservation R EH Z ER V EY SH AH N
+reservationist R EH Z ER V EY SH AH N IH S T
+reservationists R EH Z ER V EY SH AH N IH S T S
+reservationists(2) R EH Z ER V EY SH AH N IH S S
+reservationists(3) R EH Z ER V EY SH AH N IH S
+reservations R EH Z ER V EY SH AH N Z
+reserve R IH Z ER V
+reserve's R IH Z ER V Z
+reserve's(2) R IY Z ER V Z
+reserve(2) R IY Z ER V
+reserved R IH Z ER V D
+reserved(2) R IY Z ER V D
+reserveese R EH Z ER V IY S
+reserves R IH Z ER V Z
+reserves(2) R IY Z ER V Z
+reserving R IH Z ER V IH NG
+reserving(2) R IY Z ER V IH NG
+reservist R IH Z ER V IH S T
+reservists R IH Z ER V IH S T S
+reservists(2) R IH Z ER V IH S S
+reservists(3) R IH Z ER V IH S
+reservoir R EH Z AH V W AA R
+reservoir(2) R EH Z ER V W AA R
+reservoirs R EH Z ER V W AA R Z
+reset R IY S EH T
+resetar R EH S IH T ER
+reseting R IY S EH T IH NG
+resets R IY S EH T S
+resettable R IY S EH T AH B AH L
+resettle R IY S EH T AH L
+resettled R IY S EH T AH L D
+resettlement R IY S EH T AH L M AH N T
+resh R EH SH
+reshape R IY SH EY P
+reshaped R IY SH EY P T
+reshaping R IY SH EY P IH NG
+reshot R IY SH AO T
+reshuffle R IY SH AH F AH L
+reshuffled R IY SH AH F AH L D
+reshuffling R IY SH AH F AH L IH NG
+reshuffling(2) R IY SH AH F L IH NG
+reside R IH Z AY D
+reside(2) R IY Z AY D
+resided R IH Z AY D IH D
+residence R EH Z IH D AH N S
+residences R EH Z IH D AH N S IH Z
+residencies R EH Z IH D EH N S IY Z
+residency R EH Z IH D AH N S IY
+resident R EH Z IH D AH N T
+resident's R EH Z IH D AH N T S
+residential R EH Z IH D EH N CH AH L
+residents R EH Z IH D AH N T S
+residents' R EH Z IH D AH N T S
+resides R IH Z AY D Z
+resides(2) R IY Z AY D Z
+residing R IH Z AY D IH NG
+residing(2) R IY Z AY D IH NG
+residual R IH Z IH JH UW AH L
+residuals R IH Z IH JH UW AH L Z
+residue R EH Z AH D UW
+residues R EH Z AH D UW Z
+resign R IH Z AY N
+resign(2) R IY Z AY N
+resign(3) R IY S AY N
+resignation R EH Z AH G N EY SH AH N
+resignation(2) R EH Z IH G N EY SH AH N
+resignations R EH Z IH G N EY SH AH N Z
+resigned R IH Z AY N D
+resigned(2) R IY Z AY N D
+resigned(3) R IY S AY N D
+resignee R EH Z IH G N IY
+resignees R EH Z IH G N IY Z
+resigning R IH Z AY N IH NG
+resigning(2) R IY Z AY N IH NG
+resigning(3) R IY S AY N IH NG
+resigns R IH Z AY N Z
+resigns(2) R IY Z AY N Z
+resigns(3) R IY S AY N Z
+resilience R IH Z IH L IY AH N S
+resilience(2) R IH Z IH L Y AH N S
+resiliency R IH Z IH L Y AH N S IY
+resilient R IH Z IH L Y AH N T
+resin R EH Z AH N
+resin(2) R EH Z IH N
+resins R EH Z AH N Z
+resins(2) R EH Z IH N Z
+resist R IH Z IH S T
+resist(2) R IY Z IH S T
+resistance R IH Z IH S T AH N S
+resistance(2) R IY Z IH S T AH N S
+resistant R IH Z IH S T AH N T
+resistant(2) R IY Z IH S T AH N T
+resisted R IH Z IH S T IH D
+resisted(2) R IY Z IH S T AH D
+resisted(3) R IY Z IH S T IH D
+resistence R IH Z IH S T AH N S
+resisting R IH Z IH S T IH NG
+resisting(2) R IY Z IH S T IH NG
+resistiveness R IH Z IH S T IH V N AH S
+resistors R IH Z IH S T ER Z
+resists R IH Z IH S T S
+resists(2) R IY Z IH S T S
+resists(3) R IH Z IH S
+resists(4) R IY Z IH S
+reske R EH S K
+resler R EH Z L ER
+resnais R EH S N EY
+resner R EH S N ER
+resnick R EH Z N IH K
+resnick's R EH Z N IH K S
+resnik R EH S N IH K
+reso R IH Z OW
+reso's R IY S OW Z
+reso's(2) R IY Z OW Z
+reso's(3) R IH S OW Z
+reso's(4) R IH Z OW Z
+reso(2) R IY Z OW
+reso(3) R IH S OW
+reso(4) R IY S OW
+resold R IY S OW L D
+resolute R EH Z AH L UW T
+resolutely R EH S AH L UW T L IY
+resolutely(2) R EH Z AH L UW T L IY
+resolution R EH Z AH L UW SH AH N
+resolution's R EH Z AH L UW SH AH N Z
+resolutions R EH Z AH L UW SH AH N Z
+resolve R IY Z AA L V
+resolved R IY Z AA L V D
+resolves R IY Z AA L V Z
+resolving R IY Z AA L V IH NG
+resonance R EH Z AH N AH N S
+resonant R EH Z AH N AH N T
+resonate R EH Z AH N EY T
+resonated R EH Z AH N EY T IH D
+resonates R EH Z AH N EY T S
+resonating R EH Z AH N EY T IH NG
+resort R IH Z AO R T
+resort's R IH Z AO R T S
+resort(2) R IY Z AO R T
+resort(3) R IY S AO R T
+resorted R IH Z AO R T IH D
+resorted(2) R IY Z AO R T IH D
+resorted(3) R IY S AO R T IH D
+resorting R IH Z AO R T IH NG
+resorting(2) R IY Z AO R T IH NG
+resorting(3) R IY S AO R T IH NG
+resorts R IH Z AO R T S
+resorts' R IH Z AO R T S
+resorts(2) R IY Z AO R T S
+resorts(3) R IY S AO R T S
+resound R IY S AW N D
+resound(2) R IY Z AW N D
+resounding R IY S AW N D IH NG
+resoundingly R IH Z AW N D IH NG L IY
+resource R IY S AO R S
+resourceful R IY S AO R S F AH L
+resourcefulness R IY S AO R S F AH L N AH S
+resources R IY S AO R S IH Z
+resources' R IY S AO R S IH Z
+respeak R IY S P IY K
+respect R IH S P EH K T
+respect(2) R IY S P EH K T
+respectability R IY S P EH K T AH B IH L IH T IY
+respectable R IH S P EH K T AH B AH L
+respectable(2) R IY S P EH K T AH B AH L
+respectably R IY S P EH K T AH B L IY
+respected R IH S P EH K T IH D
+respected(2) R IY S P EH K T AH D
+respected(3) R IY S P EH K T IH D
+respectful R IH S P EH K T F AH L
+respectfully R IH S P EH K T F AH L IY
+respecting R IY S P EH K T IH NG
+respective R IH S P EH K T IH V
+respective(2) R IY S P EH K T IH V
+respectively R IH S P EH K T IH V L IY
+respects R IH S P EH K T S
+respects(2) R IY S P EH K T S
+respects(3) R AH S P EH K S
+respects(4) R IY S P EH K S
+respess R EY S P IH S
+respiration R EH S P ER EY SH AH N
+respirator R EH S P ER EY T ER
+respirators R EH S P ER EY T ER Z
+respiratory R EH S P ER AH T AO R IY
+respironic R EH S P ER AA N IH K
+respironics R EH S ER AA N IH K S
+respite R EH S P IH T
+resplendent R IY S P L EH N D AH N T
+respond R IH S P AA N D
+respond(2) R IY S P AA N D
+responded R IH S P AA N D IH D
+responded(2) R IY S P AA N D AH D
+responded(3) R IY S P AA N D IH D
+respondent R IH S P AA N D AH N T
+respondents R IH S P AA N D AH N T S
+respondents' R IH S P AA N D AH N T S
+responder R IH S P AA N D ER
+responders R IH S P AA N D ER Z
+responding R IH S P AA N D IH NG
+responding(2) R IY S P AA N D IH NG
+responds R IH S P AA N D Z
+responds(2) R IY S P AA N D Z
+response R IH S P AA N S
+response(2) R IY S P AA N S
+responses R IH S P AA N S IH Z
+responses(2) R IY S P AA N S AH Z
+responses(3) R IY S P AA N S IH Z
+responsibilities R IY S P AA N S AH B IH L AH T IY Z
+responsibility R IY S P AA N S AH B IH L AH T IY
+responsible R IY S P AA N S AH B AH L
+responsibly R IH S P AA N S AH B L IY
+responsive R IH S P AA N S IH V
+responsiveness R IH S P AA N S IH V N AH S
+respress R EH S P R IH S
+ress R EH S
+ressa R EH S AH
+ressa's R EH S AH Z
+resseguie R EH S IH G W IY
+ressel R EH S AH L
+ressler R EH S L ER
+rest R EH S T
+restage R IY S T EY JH
+restaged R IY S T EY JH D
+restaino R EH S T AA IY N OW
+restart R IY S T AA R T
+restarted R IY S T AA R T IH D
+restarting R IY S T AA R T IH NG
+restate R IY S T EY T
+restated R IY S T EY T IH D
+restatement R IY S T EY T M AH N T
+restatements R IY S T EY T M AH N T S
+restates R IY S T EY T S
+restating R IY S T EY T IH NG
+restaurant R EH S T ER AA N T
+restaurant's R EH S T ER AA N T S
+restaurant's(2) R EH S T R AA N T S
+restaurant(2) R EH S T R AA N T
+restauranteur R EH S T R AA N T ER
+restauranteurs R EH S T R AA N T ER Z
+restaurants R EH S T ER AA N T S
+restaurants' R EH S T ER AA N T S
+restaurants'(2) R EH S T R AA N T S
+restaurants(2) R EH S T R AA N T S
+restaurateur R EH S T ER AH T ER
+restaurateur(2) R EH S T R AH T ER
+restaurateurs R EH S T ER AH T ER Z
+restaurateurs(2) R EH S T R AH T ER Z
+rested R EH S T AH D
+rested(2) R EH S T IH D
+rester R EH S T ER
+restful R EH S T F AH L
+resting R EH S T IH NG
+restitute R EH S T IH T UW T
+restitution R EH S T IH T UW SH AH N
+restive R EH S T IH V
+restiveness R EH S T IH V N AH S
+restivo R EH S T IY V OW
+restless R EH S T L AH S
+restlessly R EH S T L AH S L IY
+restlessness R EH S T L AH S N AH S
+resto R EH S T OW
+restock R IY S T AA K
+restocked R IY S T AA K T
+restocking R IY S T AA K IH NG
+reston R EH S T AH N
+restoration R EH S T ER EY SH AH N
+restorations R EH S T ER EY SH AH N Z
+restorative R AH S T AO R AH T IH V
+restore R IH S T AO R
+restored R IH S T AO R D
+restorer R IH S T AO R ER
+restores R IH S T AO R Z
+restoring R IH S T AO R IH NG
+restrain R IY S T R EY N
+restrained R IY S T R EY N D
+restraining R IY S T R EY N IH NG
+restrains R IY S T R EY N Z
+restraint R IH S T R EY N T
+restraint(2) R IY S T R EY N T
+restraints R IH S T R EY N T S
+restraints(2) R IY S T R EY N T S
+restrepo R EH S T R EH P OW
+restrict R IY S T R IH K T
+restricted R IY S T R IH K T AH D
+restricted(2) R IY S T R IH K T IH D
+restricting R IY S T R IH K T IH NG
+restriction R IY S T R IH K SH AH N
+restrictions R IY S T R IH K SH AH N Z
+restrictive R IY S T R IH K T IH V
+restrictiveness R AH S T R IH K T IH V N AH S
+restricts R IY S T R IH K T S
+restroom R EH S T R UW M
+restrooms R EH S T R UW M Z
+restructure R IY S T R AH K CH ER
+restructured R IY S T R AH K CH ER D
+restructures R IY S T R AH K CH ER Z
+restructuring R IY S T R AH K CH ER IH NG
+restructurings R IY S T R AH K CH ER IH NG Z
+rests R EH S T S
+restyle R IY S T AY L
+restyled R IY S T AY L D
+resubmit R IY S AH B M IH T
+resubmitted R IY S AH B M IH T IH D
+resubmitting R IY S AH B M IH T IH NG
+result R IH Z AH L T
+result(2) R IY Z AH L T
+resultant R IY Z AH L T AH N T
+resulted R IH Z AH L T IH D
+resulted(2) R IY Z AH L T AH D
+resulted(3) R IY Z AH L T IH D
+resulting R IH Z AH L T IH NG
+resulting(2) R IY Z AH L T IH NG
+results R IH Z AH L T S
+results(2) R IY Z AH L T S
+resume R IH Z UW M
+resume(2) R IY Z UW M
+resume(3) R EH Z AH M EY
+resumed R IH Z UW M D
+resumed(2) R IY Z UW M D
+resumes R IH Z UW M Z
+resumes(2) R IY Z UW M Z
+resumes(3) R EH Z AH M EY Z
+resuming R IH Z UW M IH NG
+resuming(2) R IY Z UW M IH NG
+resumption R IH Z AH M P SH AH N
+resumption(2) R IY Z AH M P SH AH N
+resumption(3) R IH Z AH M SH AH N
+resumption(4) R IY Z AH M SH AH N
+resupply R IY S AH P L AY
+resurface R IY S ER F AH S
+resurfaced R IY S ER F AH S T
+resurfacing R IY S ER F AH S IH NG
+resurgence R IY S ER JH AH N S
+resurgency R IH S ER JH AH N S IY
+resurgency(2) R IY S ER JH AH N S IY
+resurgent R IH S ER JH AH N T
+resurgent(2) R IY S ER JH AH N T
+resurging R IY S ER JH IH NG
+resurrect R EH Z ER EH K T
+resurrected R EH Z ER EH K T IH D
+resurrecting R EH Z ER EH K T IH NG
+resurrection R EH Z ER EH K SH AH N
+resuscitate R IH S AH S IH T EY T
+resuscitate(2) R IY S AH S IH T EY T
+resuscitated R IH S AH S IH T EY T IH D
+resuscitating R IH S AH S IH T EY T IH NG
+resuscitation R IH S AH S IH T EY SH AH N
+resveratrol R EH S V ER AH T R AO L
+ret R EH T
+reta R EH T AH
+retablos R IY T AE B L OW S
+retail R IY T EY L
+retailed R IY T EY L D
+retailer R IY T EY L ER
+retailer's R IY T EY L ER Z
+retailers R IY T EY L ER Z
+retailers' R IY T EY L ER Z
+retailing R IY T EY L IH NG
+retailing's R IY T EY L IH NG Z
+retails R IY T EY L Z
+retain R IH T EY N
+retain(2) R IY T EY N
+retained R IH T EY N D
+retained(2) R IY T EY N D
+retainer R IH T EY N ER
+retainer(2) R IY T EY N ER
+retainers R IH T EY N ER Z
+retaining R IH T EY N IH NG
+retaining(2) R IY T EY N IH NG
+retains R IH T EY N Z
+retains(2) R IY T EY N Z
+retake R IY T EY K
+retaken R IY T EY K AH N
+retaking R IY T EY K IH NG
+retaliate R IH T AE L IY EY T
+retaliate(2) R IY T AE L IY EY T
+retaliated R IH T AE L IY EY T IH D
+retaliated(2) R IY T AE L IY EY T IH D
+retaliating R IH T AE L IY EY T IH NG
+retaliation R IY T AE L IY EY SH AH N
+retaliatory R IY T AE L Y AH T AO R IY
+retana R EH T AE N AH
+retard R IH T AA R D
+retard(2) R IY T AA R D
+retardant R IY T AA R D AH N T
+retardation R IY T AA R D EY SH AH N
+retarded R IH T AA R D IH D
+retarded(2) R IY T AA R D AH D
+retarded(3) R IY T AA R D IH D
+retarding R IH T AA R D IH NG
+retarding(2) R IY T AA R D IH NG
+retards R IH T AA R D Z
+retards(2) R IY T AA R D Z
+retell R IY T EH L
+retelling R IY T EH L IH NG
+retemeyer R EH T AH M AY R
+retention R IY T EH N SH AH N
+retest R IY T EH S T
+retested R IY T EH S T IH D
+retesting R IY T EH S T IH NG
+retests R IY T EH S T S
+retests(2) R IY T EH S S
+retests(3) R IY T EH S
+retherford R IH TH ER F ER D
+rethink R IY TH IH NG K
+rethinking R IY TH IH NG K IH NG
+rethought R IY TH AO T
+reti R EH T IY
+reticence R EH T IH S AH N S
+reticent R EH T IH S AH N T
+retin R EH T IH N
+retina R EH T AH N AH
+retinal R EH T AH N AH L
+retinoblastoma R EH T IH N OW B L AE S T OW M AH
+retinoid R EH T IH N OY D
+retinoids R EH T IH N OY D Z
+retinue R EH T AH N UW
+retinyl R EH T IH N AH L
+retire R IH T AY R
+retire(2) R IY T AY R
+retire(3) R IY T AY ER
+retired R IH T AY R D
+retired(2) R IY T AY ER D
+retired(3) R IY T AY R D
+retiree R IY T AY R IY
+retiree's R IH T AY R IY Z
+retirees R IY T AY R IY Z
+retirees' R IH T AY R IY Z
+retirement R IY T AY ER M AH N T
+retirement's R IH T AY R M AH N T S
+retirement's(2) R IY T AY R M AH N T S
+retirement(2) R IH T AY ER M AH N T
+retirements R IH T AY R M AH N T S
+retirements(2) R IY T AY R M AH N T S
+retires R IH T AY R Z
+retires(2) R IY T AY ER Z
+retires(3) R IY T AY R Z
+retiring R IH T AY R IH NG
+retiring(2) R IY T AY ER IH NG
+retiring(3) R IY T AY R IH NG
+retlin R EH T L IH N
+reto R IY T UW
+retook R IY T UH K
+retool R IY T UW L
+retooled R IY T UW L D
+retooling R IY T UW L IH NG
+retort R IY T AO R T
+retorted R IY T AO R T IH D
+retorts R IH T AO R T S
+retorts(2) R IY T AO R T S
+retouching R IY T AH CH IH NG
+retrace R IY T R EY S
+retraced R IY T R EY S T
+retracement R IY T R EY S M AH N T
+retracing R IY T R EY S IH NG
+retract R IY T R AE K T
+retractable R IY T R AE K T AH B AH L
+retracted R IY T R AE K T AH D
+retracting R IY T R AE K T IH NG
+retraction R IY T R AE K SH AH N
+retracts R IY T R AE K T S
+retrain R IY T R EY N
+retrained R IY T R EY N D
+retraining R IY T R EY N IH NG
+retransmission R IY T R AE N Z M IH SH AH N
+retread R IY T R EH D
+retreading R IY T R EH D IH NG
+retreads R IY T R EH D Z
+retreat R IY T R IY T
+retreated R IY T R IY T AH D
+retreated(2) R IY T R IY T IH D
+retreating R IY T R IY T IH NG
+retreats R IY T R IY T S
+retrench R IY T R EH N CH
+retrenched R IY T R EH N CH T
+retrenching R IY T R EH N CH IH NG
+retrenchment R IY T R EH N CH M AH N T
+retrenchments R IY T R EH N CH M AH N T S
+retrial R IY T R AY AH L
+retribution R EH T R AH B Y UW SH AH N
+retried R IY T R AY D
+retrieval R IH T R IY V AH L
+retrieval(2) R IY T R IY V AH L
+retrieve R IH T R IY V
+retrieve(2) R IY T R IY V
+retrieved R IY T R IY V D
+retriever R IY T R IY V ER
+retrievers R IY T R IY V ER Z
+retrieves R IH T R IY V Z
+retrieves(2) R IY T R IY V Z
+retrieving R IY T R IY V IH NG
+retro R EH T R OW
+retroactive R EH T R OW AE K T IH V
+retroactively R EH T R OW AE K T IH V L IY
+retroactivity R EH T R OW AE K T IH V IH T IY
+retrocession R EH T R OW S EH SH AH N
+retrocessionaries R EH T R OW S EH SH AH N EH R IY Z
+retrocessionary R EH T R OW S EH SH AH N EH R IY
+retrofit R EH T R OW F IH T
+retrofits R EH T R OW F IH T S
+retrofitted R EH T R OW F IH T IH D
+retrofitter R EH T R OW F IH T ER
+retrofitting R EH T R OW F IH T IH NG
+retrograde R EH T R AH G R EY D
+retrospect R EH T R AH S P EH K T
+retrospective R EH T R AH S P EH K T IH V
+retrospectively R EH T R OW S P EH K T IH V L IY
+retrovir R EH T R OW V IH R
+retrovirus R EH T R OW V AY R AH S
+retroviruses R EH T R OW V AY R AH S IH Z
+retry R IY T R AY
+retrying R IY T R AY IH NG
+rettberg R EH T B ER G
+retter R EH T ER
+rettew R EH CH UW
+rettig R EH T IH G
+rettinger R EH T IH N JH ER
+rettinger(2) R EH T IH NG ER
+rettke R EH T K IY
+retton R EH T AH N
+return R IH T ER N
+return(2) R IY T ER N
+returnable R IY T ER N AH B AH L
+returned R IH T ER N D
+returned(2) R IY T ER N D
+returnee R IH T ER N IY
+returnees R IH T ER N IY Z
+returning R IH T ER N IH NG
+returning(2) R IY T ER N IH NG
+returns R IH T ER N Z
+returns' R AH T ER N Z
+returns'(2) R IY T ER N Z
+returns(2) R IY T ER N Z
+retz R EH T S
+retzer R EH T Z ER
+retzlaff R EH T Z L AH F
+retzloff R EH T Z L AO F
+reuben R UW B AH N
+reuber R OY B ER
+reul R UW L
+reuland R OY L AH N D
+reule R UW L
+reum R IY AH M
+reunification R IY UW N AH F AH K EY SH AH N
+reunified R IY UW N AH F AY D
+reunify R IY UW N AH F AY
+reunion R IY UW N Y AH N
+reunions R IY UW N Y AH N Z
+reunite R IY UW N AY T
+reunited R IY UW N AY T IH D
+reunites R IY UW N AY T S
+reuniting R IY UW N AY T IH NG
+reusable R IY UW Z AH B AH L
+reusch R OY SH
+reuse R IY Y UW S
+reuse(2) R IY Y UW Z
+reused R IY UW Z D
+reusing R IY Y UW Z IH NG
+reuss R UW S
+reusser R OY S ER
+reust R UW S T
+reuter R OY T ER
+reuter's R OY T ER Z
+reuters R OY T ER Z
+reuters' R OY T ER Z
+reuters's R OY T ER Z IH Z
+reuters's(2) R OY T ER Z
+reutgers R OY T G ER Z
+reuther R OY DH ER
+reutter R OY T ER
+reutzel R OY T Z AH L
+rev R EH V
+reva R EY V AH
+revak R EH V AH K
+revaluation R IY V AE L Y UW EY SH AH N
+revaluations R IY IH V AE L Y UW EY SH AH N Z
+revalue R IY V AE L Y UW
+revalued R IY V AE L Y UW D
+revaluing R IY V AE L Y UW IH NG
+revamp R IY V AE M P
+revamped R IY V AE M P T
+revamping R IY V AE M P IH NG
+revamps R IY V AE M P S
+revard R IH V AA R D
+revco R EH V K OW
+revco's R EH V K OW Z
+reveal R IH V IY L
+reveal(2) R IY V IY L
+revealed R IH V IY L D
+revealed(2) R IY V IY L D
+revealing R IH V IY L IH NG
+revealing(2) R IY V IY L IH NG
+reveals R IH V IY L Z
+reveals(2) R IY V IY L Z
+revel R EH V AH L
+revelation R EH V AH L EY SH AH N
+revelations R EH V AH L EY SH AH N Z
+revelatory R IH V EH L AH T AO R IY
+reveled R EH V AH L D
+reveler R EH V AH L ER
+revelers R EH V AH L ER Z
+reveles R EY V EY L EH S
+reveling R EH V AH L IH NG
+revell R EY V EY L
+revelle R IH V EH L
+reveller R EH V AH L ER
+revellers R EH V AH L ER Z
+revello R EH V EH L OW
+revelry R EH V AH L R IY
+revels R EH V AH L Z
+revenge R IY V EH N JH
+revenue R EH V AH N UW
+revenue(2) R EH V AH N Y UW
+revenuer R EH V AH N UW ER
+revenuer(2) R EH V AH N Y UW ER
+revenuers R EH V AH N UW ER Z
+revenuers(2) R EH V AH N Y UW ER Z
+revenues R EH V AH N UW Z
+revenues(2) R EH V AH N Y UW Z
+reverb R IY V ER B
+reverbed R IY V ER B D
+reverberate R IH V ER B ER AH T
+reverberate(2) R IH V ER B ER EY T
+reverberated R IH V ER B ER EY T IH D
+reverberated(2) R IY V ER B ER EY T AH D
+reverberated(3) R IY V ER B ER EY T IH D
+reverberates R IH V ER B ER EY T S
+reverberating R IH V ER B ER EY T IH NG
+reverberating(2) R IY V ER B ER EY T IH NG
+reverberation R IY V ER B ER EY SH AH N
+reverberations R IH V ER B ER EY SH AH N Z
+revercomb R EH V ER K AH M
+revere R IH V IH R
+revered R IH V IH R D
+reverence R EH V ER AH N S
+reverend R EH V ER AH N D
+reverend(2) R EH V R AH N D
+reverent R EH V ER AH N T
+reverential R EH V ER EH N CH AH L
+reverential(2) R EH V ER EH N SH AH L
+reverently R EH V ER AH N T L IY
+reveres R IH V IH R Z
+reverie R EH V ER IY
+reveries R EH V ER IY Z
+revering R IH V IH R IH NG
+reveron R EH V ER AA N
+reveron's R EH V ER AA N Z
+reversal R IH V ER S AH L
+reversal(2) R IY V ER S AH L
+reversals R IH V ER S AH L Z
+reversals(2) R IY V ER S AH L Z
+reverse R IH V ER S
+reverse(2) R IY V ER S
+reversed R IH V ER S T
+reversed(2) R IY V ER S T
+reverser R IH V ER S ER
+reversers R IH V ER S ER Z
+reverses R IH V ER S IH Z
+reverses(2) R IY V ER S AH Z
+reverses(3) R IY V ER S IH Z
+reversible R IH V ER S AH B AH L
+reversible(2) R IY V ER S AH B AH L
+reversing R IH V ER S IH NG
+reversing(2) R IY V ER S IH NG
+reversion R IH V ER ZH AH N
+revert R IH V ER T
+revert(2) R IY V ER T
+reverted R IH V ER T IH D
+reverted(2) R IY V ER T IH D
+reverting R IH V ER T IH NG
+reverts R IH V ER T S
+reves R IY V Z
+revette R IH V EH T
+revier R IY V IY ER
+review R IY V Y UW
+review's R IY V Y UW Z
+reviewed R IY V Y UW D
+reviewer R IY V Y UW ER
+reviewer's R IY V Y UW ER Z
+reviewers R IY V Y UW ER Z
+reviewing R IY V Y UW IH NG
+reviews R IY V Y UW Z
+reviews(2) R AH V Y UW Z
+reviglio R AH V IH G L IY OW
+revile R IY V AY L
+reviled R IY V AY L D
+revilla R EH V IH L AH
+reville R EH V IH L
+revis R EH V IH S
+revise R IH V AY Z
+revise(2) R IY V AY Z
+revised R IH V AY Z D
+revised(2) R IY V AY Z D
+revises R IH V AY Z IH Z
+revises(2) R IY V AY Z IH Z
+revising R IH V AY Z IH NG
+revising(2) R IY V AY Z IH NG
+revision R IY V IH ZH AH N
+revisionism R IY V IH ZH AH N IH Z AH M
+revisionist R IY V IH ZH AH N IH S T
+revisionists R IY V IH ZH AH N IH S T S
+revisionists(2) R IY V IH ZH AH N IH S S
+revisionists(3) R IY V IH ZH AH N IH S
+revisions R IY V IH ZH AH N Z
+revisit R IY V IH Z IH T
+revisited R IY V IH Z AH T IH D
+revisiting R IY V IH Z IH T IH NG
+revisits R IY V IH Z IH T S
+revitalization R IY V AY T AH L AH Z EY SH AH N
+revitalize R IY V AY T AH L AY Z
+revitalized R IY V AY T AH L AY Z D
+revitalizing R IY V AY T AH L AY Z IH NG
+revival R IH V AY V AH L
+revival(2) R IY V AY V AH L
+revivalist R IY V AY V AH L IH S T
+revivals R IY V AY V AH L Z
+revive R IH V AY V
+revive(2) R IY V AY V
+revived R IH V AY V D
+revived(2) R IY V AY V D
+revives R IY V AY V Z
+reviving R IH V AY V IH NG
+reviving(2) R IY V AY V IH NG
+revlon R EH V L AA N
+revlon's R EH V L AA N Z
+revocable R EH V AH K AH B AH L
+revocation R EH V AH K EY SH AH N
+revocations R EH V AH K EY SH AH N Z
+revoir R IH V W AA R
+revoke R IH V OW K
+revoke(2) R IY V OW K
+revoked R IH V OW K T
+revoked(2) R IY V OW K T
+revoking R IH V OW K IH NG
+revoking(2) R IY V OW K IH NG
+revolt R IH V OW L T
+revolt(2) R IY V OW L T
+revolted R IH V OW L T IH D
+revolted(2) R IY V OW L T AH D
+revolted(3) R IY V OW L T IH D
+revolting R IY V OW L T IH NG
+revolts R IY V OW L T S
+revolucion R EH V OW L UW S IY OW N
+revolucionario R EH V OW L UW S IY AH N EH R IY OW
+revolution R EH V AH L UW SH AH N
+revolution's R EH V AH L UW SH AH N Z
+revolutionaries R EH V AH L UW SH AH N EH R IY Z
+revolutionary R EH V AH L UW SH AH N EH R IY
+revolutionist R EH V AH L UW SH AH N IH S T
+revolutionists R EH V AH L UW SH AH N IH S T S
+revolutionists(2) R EH V AH L UW SH AH N IH S S
+revolutionists(3) R EH V AH L UW SH AH N IH S
+revolutionize R EH V AH L UW SH AH N AY Z
+revolutionized R EH V AH L UW SH AH N AY Z D
+revolutionizing R EH V AH L UW SH AH N AY Z IH NG
+revolutions R EH V AH L UW SH AH N Z
+revolve R IY V AA L V
+revolved R IY V AA L V D
+revolver R IH V AA L V ER
+revolvers R IH V AA L V ER Z
+revolves R IY V AA L V Z
+revolving R IY V AA L V IH NG
+revord R IH V AO R D
+revs R EH V Z
+revson R EH V S AH N
+revue R IH V Y UW
+revuelta R AH V W EH L T AH
+revues R IH V Y UW Z
+revulsion R IH V AH L SH AH N
+revulsion(2) R IY V AH L SH AH N
+revved R EH V D
+revving R EH V IH NG
+revzin R EH V Z IH N
+rew R UW
+reward R IH W AO R D
+reward(2) R IY W AO R D
+rewarded R IH W AO R D IH D
+rewarded(2) R IY W AO R D AH D
+rewarded(3) R IY W AO R D IH D
+rewarding R IH W AO R D IH NG
+rewarding(2) R IY W AO R D IH NG
+rewards R IH W AO R D Z
+rewards(2) R IY W AO R D Z
+rewatching R IY W AA CH IH NG
+rewerts R UW ER T S
+rewey R UW IY
+rewind R IY W AY N D
+rewire R IY W AY ER
+rewired R IY W AY ER D
+rewiring R IY W AY ER IH NG
+rewis R UW IH S
+reword R IY W ER D
+rework R IY W ER K
+reworked R IY W ER K T
+reworking R IY W ER K IH NG
+rewrite R IY R AY T
+rewrites R IY R AY T S
+rewriting R IY R AY T IH NG
+rewritten R IY R IH T AH N
+rewrote R IY R OW T
+rex R EH K S
+rexall R EH K S AO L
+rexana R IH G Z AE N AH
+rexene R EH K S IY N
+rexford R EH K S F ER D
+rexham R EH K S AH M
+rexnord R EH K S N AO R D
+rexon R EH K S AH N
+rexroad R EH K S R OW D
+rexroat R EH K S R OW T
+rexrode R EH K S R OW D
+rexrodt R EH K S R OW D
+rexroth R EH K S R AA TH
+rey R EY
+reyburn R EY B ER N
+reycraft R EY K R AE F T
+reyer R EY ER
+reyes R EY IH S
+reykjavik R EH K Y AH V IH K
+reykjavik(2) R EY K AH V IH K
+reyman R EY M AH N
+reyna R EY N AH
+reynaga R IY N AA G AH
+reynaldo R EY N AA L D OW
+reynard R EY N ER D
+reynaud R EY N AO D
+reynold R EH N AH L D
+reynolds R EH N AH L D Z
+reynolds' R EH N AH L D Z
+reynolds's R EH N AH L D Z IH Z
+reynoldson R EY N OW L D S AH N
+reynosa R IY N OW S AH
+reynoso R IY N OW S OW
+reza R EH Z AH
+rezabek R IH Z AA B EH K
+rezac R EH Z AH K
+rezek R EH Z EH K
+rezendes R EY Z EY N D EH S
+reznicek R EH Z N IH CH EH K
+reznick R EH Z N IH K
+reznik R EH Z N IH K
+rezoning R IY Z OW N IH NG
+rha R AA
+rhame R EY M
+rhames R EY M Z
+rhapsodic R AE P S AA D IH K
+rhapsodize R AE P S AH D AY Z
+rhapsodizes R AE P S AH D AY Z IH Z
+rhapsody R AE P S AH D IY
+rhea R IY AH
+rheault R OW
+rheaume R UW M
+rhee R IY
+rheem R IY M
+rhein R AY N
+rheinberger R AY N B ER G ER
+rheingold R AY N G OW L D
+rheinisch R AY N IH SH
+rheinstein R AY N S T AY N
+rhem R EH M
+rheology R IY AO L AH JH IY
+rhesus R IY S AH S
+rheta R IY T AH
+rhetoric R EH T ER IH K
+rhetorical R IH T AO R IH K AH L
+rhetorically R AH T AO R IH K L IY
+rhetorician R EH T ER IH SH AH N
+rhetoricians R EH T ER IH SH AH N Z
+rhett R EH T
+rheumatic R UW M AE T IH K
+rheumatism R UW M AH T IH Z AH M
+rheumatoid R UW M AH T OY D
+rheumatologist R UW M AH T AA L AH JH AH S T
+rheumatology R UW M AH T AA L AH JH IY
+rhew R UW
+rhin R IH N
+rhine R AY N
+rhinehardt R AY N HH AA R T
+rhinehart R AY N HH AA R T
+rhineland R AY N L AE N D
+rhineman R AY N M AH N
+rhineman's R AY N M AH N Z
+rhines R AY N Z
+rhinesmith R AY N S M IH TH
+rhinestone R AY N S T OW N
+rhinestones R AY N S T OW N Z
+rhino R AY N OW
+rhinoceros R AY N AA S ER AH S
+rhinos R AY N OW Z
+rhizoid R AY Z OY D
+rhizoidal R AY Z OY D AH L
+rhizome R AY Z OW M
+rhizomes R AY Z OW M Z
+rho R OW
+rhoad R OW D
+rhoades R OW D Z
+rhoads R OW D Z
+rhoda R OW D AH
+rhodanthe R OW D AE N TH
+rhode R OW D
+rhode-island R OW D AY L AH N D
+rhode-island's R OW D AY L AH N D Z
+rhode-islander R OW D AY L AH N D ER
+rhode-islanders R OW D AY L AH N D ER Z
+rhoden R OW D AH N
+rhodes R OW D Z
+rhodesia R OW D IY ZH AH
+rhodesian R OW D IY ZH AH N
+rhodia R OW D IY AH
+rhodies R OW D IY Z
+rhodium R OW D IY AH M
+rhododendron R OW D AH D EH N D R AH N
+rhodopsin R OW D AA P S AH N
+rhodus R OW D AH S
+rhody R OW D IY
+rhome R OW M
+rhonda R AA N D AH
+rhone R OW N
+rhoney R OW N IY
+rhorer R AO R ER
+rhoten R OW T AH N
+rhoto R OW T OW
+rhoton R OW T AH N
+rhubarb R UW B AA R B
+rhude R UW D
+rhudy R UW D IY
+rhue R UW
+rhule R UW L
+rhyme R AY M
+rhymed R AY M D
+rhymer R AY M ER
+rhymes R AY M Z
+rhyming R AY M IH NG
+rhyne R AY N
+rhyner R AY N ER
+rhynes R AY N Z
+rhys R IY S
+rhys-jones R IY S JH OW N Z
+rhythm R IH DH AH M
+rhythmic R IH DH M IH K
+rhythmically R IH DH M IH K L IY
+rhythms R IH DH AH M Z
+ria R IY AH
+riad R IY AA D
+riady R IY AA D IY
+riadys R IY AA D IY Z
+rial R AY AH L
+rials R AY L Z
+rib R IH B
+riba R IY B AH
+ribald R AY B AA L D
+ribaldry R AY B AA L D R IY
+ribar R IH B AA R
+ribas R AY B AH Z
+ribaudo R IY B AO D OW
+ribavirin R IH B AE V IH R IH N
+ribbed R IH B D
+ribbing R IH B IH NG
+ribbit R IH B IH T
+ribble R IH B AH L
+ribbon R IH B AH N
+ribbons R IH B AH N Z
+ribeiro R IY B EH R OW
+ribera R IY B EH R AH
+ribi R IY B IY
+ribicoff R IH B IH K AO F
+ribka R IH B K AH
+ribonucleic R AY B OW N UW K L EY IH K
+ribs R IH B Z
+ric R IH K
+rica R IY K AH
+rica's R IY K AH Z
+ricadonna R IY K AA D OW N AH
+rican R IY K AH N
+ricans R IH K AH N Z
+ricard R IH K AA R D
+ricardo R IH K AA R D OW
+ricaurte R AH K AA R T EY
+ricca R IY K AH
+riccardi R IY K AA R D IY
+riccardo R IH K AA R D OW
+ricci R IY CH IY
+ricciardelli R IY CH ER D EH L IY
+ricciardi R IY CH AA R D IY
+riccio R IY CH IY OW
+riccitelli R IY CH IY T EH L IY
+ricciuti R IY K CH UW T IY
+ricco R IH K OW
+riccobono R IY K OW B OW N OW
+rice R AY S
+rice's R AY S IH Z
+riceville R AY S V IH L
+rich R IH CH
+rich's R IH CH IH Z
+richa R IH CH AH
+richard R IH CH ER D
+richard's R IH CH ER D Z
+richards R IH CH ER D Z
+richards' R IH CH ER D Z
+richards's R IH CH ER D Z IH Z
+richardson R IH CH ER D S AH N
+richardson's R IH CH ER D S AH N Z
+richardsonsmith R IH CH ER D S AH N S M IH TH
+richardt R IH K AA R T
+richarson R IH CH AA R S AH N
+richart R IH K HH AA R T
+richaud R IH SH OW D
+richbourg R IH CH B AO R G
+richburg R IH CH B ER G
+richco R IH K OW
+richcreek R IH CH K R IY K
+riche R IH CH
+richelieu R IH SH AH L UW
+richelson R IH CH AH L S AH N
+richemont R IH CH AH M AA N T
+richenthal R IH K AH N TH AO L
+richer R IH CH ER
+richerd R IH CH ER D
+richerson R IH CH ER S AH N
+richert R IH K ER T
+riches R IH CH AH Z
+riches(2) R IH CH IH Z
+richesin R IH K IH S IH N
+richeson R IH K IH S AH N
+richest R IH CH AH S T
+richey R IH CH IY
+richfield R IH CH F IY L D
+richfield's R IH CH F IY L D Z
+richford R IH CH F ER D
+richie R IH CH IY
+richins R IH K IH N Z
+richison R IH CH IH S AH N
+richland R IH CH L AH N D
+richland(2) R IH CH L AE N
+richly R IH CH L IY
+richman R IH CH M AE N
+richmond R IH CH M AH N D
+richmond's R IH CH M AH N D Z
+richner R IH K N ER
+richness R IH CH N AH S
+richoux R IH SH UW
+richstone R IH CH S T OW N
+richter R IH K T ER
+richton R IH CH T AH N
+richts R IH K T S
+richwhite R IH CH W AY T
+richwine R IH CH W AY N
+ricigliano R IH S IH G L IY AA N OW
+rick R IH K
+rick's R IH K S
+rickabaugh R IH K AH B AO
+rickard R IH K ER D
+rickards R IH K ER D Z
+ricke R IH K
+rickel R IH K AH L
+rickels R IH K AH L Z
+ricken R IH K AH N
+rickenbach R IH K IH N B AA K
+rickenbaker R IH K IH N B AH K ER
+ricker R IH K ER
+rickers R IH K ER Z
+rickerson R IH K ER S AH N
+rickert R IH K ER T
+rickets R IH K IH T S
+ricketson R IH K IH T S AH N
+rickett R IH K IH T
+ricketts R IH K IH T S
+rickety R IH K AH T IY
+rickey R IH K IY
+ricki R IH K IY
+rickie R IH K IY
+ricklefs R IH K L IH F S
+rickles R IH K AH L Z
+rickles' R IH K AH L Z
+rickles'(2) R IH K AH L Z IH Z
+rickman R IH K M AH N
+rickner R IH K N ER
+ricks R IH K S
+rickson R IH K S AH N
+rickward R IH K W ER D
+rickwood R IH K W UH D
+ricky R IH K IY
+rico R IY K OW
+rico's R IY K OW Z
+ricochet R IH K AH SH EY
+ricocheted R IH K AH SH EY D
+ricocheting R IH K AH SH EY IH NG
+ricoh R IY K OW
+ricoh's R IY K OW Z
+ricostruzione R IY K OW S T R UW Z IY OW N IY
+rid R IH D
+ridable R AY D AH B AH L
+riddance R IH D AH N S
+riddell R IH D AH L
+ridden R IH D AH N
+ridder R IH D ER
+ridder's R IH D ER Z
+riddick R IH D IH K
+ridding R IH D IH NG
+riddle R IH D AH L
+riddled R IH D AH L D
+riddler R IH D L ER
+riddles R IH D AH L Z
+riddock R IH D AH K
+ride R AY D
+rideau R IH D OW
+rideaux R IH D OW
+ridell R IH D EH L
+riden R AY D AH N
+ridener R IH D IY N ER
+ridenhour R IH D IH N AW R
+ridenour R IH D IH N UH R
+rideout R AY D AW T
+rider R AY D ER
+rider's R AY D ER Z
+riders R AY D ER Z
+ridership R AY D ER SH IH P
+rides R AY D Z
+ridge R IH JH
+ridge's R IH JH IH S
+ridgecrest R IH JH K R EH S T
+ridged R IH JH D
+ridgefield R IH JH F IY L D
+ridgell R IH JH AH L
+ridgely R IH JH L IY
+ridges R IH JH AH Z
+ridges(2) R IH JH IH Z
+ridgeway R IH JH W EY
+ridgewood R IH JH W UH D
+ridgley R IH JH L IY
+ridgway R IH JH W EY
+ridicule R IH D AH K Y UW L
+ridiculed R IH D AH K Y UW L D
+ridicules R IH D AH K Y UW L Z
+ridiculing R IH D AH K Y UW L IH NG
+ridiculous R IH D IH K Y AH L AH S
+ridiculously R AH D IH K Y AH L AH S L IY
+riding R AY D IH NG
+ridinger R AY D IH NG ER
+ridings R AY D IH NG Z
+ridley R IH D L IY
+ridling R IH D L IH NG
+ridlon R IH D L AH N
+ridner R IH D N ER
+ridolfi R IY D OW L F IY
+ridout R IH D AW T
+ridpath R IH D P AE TH
+rids R IH D Z
+riebe R IY B
+riebel R IY B AH L
+rieben R IY B AH N
+rieber R IY B ER
+riebman R IY B M AH N
+riechers R IY K ER Z
+rieck R IY K
+riecke R IY K
+ried R IY D
+riede R IY D
+riedel R IY D AH L
+rieder R IY D ER
+riederer R IY D ER ER
+rieders R IY D ER Z
+rieders' R IY D ER Z
+riedesel R IY D IH S AH L
+riedl R IY D AH L
+riedlinger R IY D AH L IH NG ER
+riedlinger(2) R IY D L IH NG ER
+riedy R IY D IY
+rief R IY F
+rieg R IY G
+riege R IY JH
+riegel R IY G AH L
+rieger R IY G ER
+riegert R IY G ER T
+riegle R IY G AH L
+riegler R IY G L ER
+riehl R IY L
+riehle R IY HH AH L
+riehm R IY M
+riek R IY K
+rieke R IY K
+rieken R IY K AH N
+rieker R IY K ER
+riel R IY L
+rielly R IY L IY
+riely R IY L IY
+rieman R IY M AH N
+riemann R IY M AH N
+riemenschneider R IY M IH N SH N AY D ER
+riemer R IY M ER
+riemersma R IY M EH R S M AH
+riendeau R AH N D OW
+rienstra R IY N S T R AH
+riepe R IY P
+riera R IY R AH
+rierson R IY R S AH N
+ries R AY Z
+riesberg R IY S B ER G
+riese R IY Z
+riesen R IY S AH N
+riesenberg R IY S AH N B ER G
+rieser R IY S ER
+riesh R AY SH
+riesh(2) R IY SH
+riesling R IY Z L IH NG
+riess R IY S
+riester R AY IH S T ER
+riesterer R IY S T ER ER
+rieth R AY IH TH
+rietveld R IY T V IH L D
+rietz R IY T S
+rieves R IY V Z
+rife R AY F
+rifenburgh R IH F AH N B ER G
+riff R IH F
+riffe R IH F
+riffed R IH F T
+riffel R IH F AH L
+riffey R IH F IY
+riffing R IH F IH NG
+riffle R IH F AH L
+riffraff R IH F R AE F
+riffs R IH F S
+rifkin R IH F K IH N
+rifkin's R IH F K IH N Z
+rifkind R IH F K IH N D
+rifle R AY F AH L
+rifled R AY F AH L D
+rifleman R AY F AH L M AH N
+riflery R AY F AH L R IY
+rifles R AY F AH L Z
+rifling R AY F L IH NG
+rift R IH F T
+rifts R IH F T S
+rig R IH G
+riga R IY G AH
+rigas R AY G AH Z
+rigatoni R IH G AH T OW N IY
+rigby R IH G B IY
+rigdon R IH G D AH N
+rigel R AY JH AH L
+rigg R IH G
+riggan R IH G AH N
+rigged R IH G D
+riggen R IH G AH N
+riggenbach R IH G IH N B AA K
+riggi R IH JH IY
+riggin R IH G IH N
+rigging R IH G IH NG
+riggings R IH G IH NG Z
+riggins R IH G IH N Z
+riggio R IY JH IY OW
+riggle R IH G AH L
+riggleman R IH G AH L M AH N
+riggs R IH G Z
+riggsbee R IH G Z B IY
+righetti R IY G EH T IY
+righi R IY G IY
+right R AY T
+right's R AY T S
+right-brace R AY T B R EY S
+right-winger R AY T W IH NG ER
+right-wingers R AY T W IH NG ER Z
+righted R AY T IH D
+righteous R AY CH AH S
+righteously R AY CH AH S L IY
+righteousness R AY CH AH S N AH S
+righter R AY T ER
+rightful R AY T F AH L
+rightfully R AY T F AH L IY
+righthand R AY T HH AE N D
+righthanded R AY T HH AE N D IH D
+rightish R AY T IH SH
+rightist R AY T IH S T
+rightists R AY T IH S T S
+rightly R AY T L IY
+rightmire R AY T M AY R
+rightmyer R AY T M IY ER
+rightness R AY T N AH S
+righto R AY T OW
+rights R AY T S
+rights' R AY T S
+rightward R AY T W ER D
+rightwing R AY T W IH NG
+righty R AY T IY
+rigid R IH JH AH D
+rigid(2) R IH JH IH D
+rigidities R IH JH IH D IH T IY Z
+rigidity R IH JH IH D AH T IY
+rigidly R IH JH IH D L IY
+rigler R AY G AH L ER
+rigler(2) R IH G L ER
+rigney R IH G N IY
+rigo R IY G OW
+rigoletto R IH G AH L EH T OW
+rigoni R IY G OW N IY
+rigor R IH G ER
+rigorous R IH G ER AH S
+rigorously R IH G ER AH S L IY
+rigors R IH G ER Z
+rigs R IH G Z
+rigsbee R IH G Z B IY
+rigsby R IH G Z B IY
+rigueur R IH G Y UW R
+rigueur(2) R IH G ER
+riha R AY HH AH
+rihn R IH N
+rijn R IY AH N
+rikard R IH K ER D
+rike R AY K
+rikeld R AY K EH L D
+rikeld(2) R IH K EH L D
+riker R AY K ER
+riker's R AY K ER Z
+rikers R AY K ER Z
+rikki R IH K IY
+riklis R IH K L IH S
+riksbank R IH K S B AE NG K
+riksdag R IH K S D AE G
+rile R AY L
+riled R AY L D
+riles R AY L Z
+riley R AY L IY
+riley's R AY L IY Z
+rill R IH L
+rill's R IH L Z
+rilla R IH L AH
+rillette R IH L EH T
+rilling R IH L IH NG
+rilwanu R IH L W AA N UW
+rim R IH M
+rima R IY M AH
+rimbey R IH M B IY
+rimel R IH M AH L
+rimer R AY M ER
+rimes R AY M Z
+rimkus R IH M K AH S
+rimmed R IH M D
+rimmer R IH M ER
+rimpochet R IH P OW CH IH T
+rimpochet(2) R IH M P OW CH AH T
+rimpochets R IH P OW CH IH T S
+rimpochets(2) R IH M P OW CH IH T S
+rims R IH M Z
+rimson R IH M S AH N
+rina R IY N AH
+rinaldi R IY N AA L D IY
+rinaldo R IH N AA L D OW
+rinard R IH N ER D
+rinas R AY N AH Z
+rinaudo R IY N AO D OW
+rinck R IH NG K
+rincon R IH NG K AH N
+rind R AY N D
+rindahl R IH N D AA L
+rinderer R IH N D ER ER
+rinderknecht R IH N D ER K N IH K T
+rindfleisch R IH N D F L AY SH
+rinds R AY N D Z
+rindt R IH N T
+rine R AY N
+rineer R IH N IH R
+rinehardt R AY N HH AA R T
+rinehart R AY N HH AA R T
+rinehimer R AY N HH AY M ER
+rinella R IH N EH L AH
+riner R AY N ER
+rines R AY N Z
+riney R AY N IY
+ring R IH NG
+ring's R IH NG Z
+ring-around-the-rosy R IH NG ER AW N DH ER OW Z IY
+ringberg R IH NG B ER G
+ringdahl R IH NG D AA L
+ringe R IH NG
+ringed R IH NG D
+ringeisen R IH NG G AY S AH N
+ringel R IH NG G AH L
+ringen R IH NG AH N
+ringenberg R IH NG AH N B ER G
+ringer R IH NG ER
+ringers R IH NG ER Z
+ringgenberg R IH NG G AH N B ER G
+ringgit R IH NG IH T
+ringgold R IH NG G OW L D
+ringing R IH NG IH NG
+ringland R IH NG G L AH N D
+ringle R IH NG G AH L
+ringleader R IH NG L IY D ER
+ringleaders R IH NG L IY D ER Z
+ringler R IH NG G AH L ER
+ringler(2) R IH NG G L ER
+ringley R IH NG G L IY
+ringling R IH NG L IH NG
+ringmaster R IH NG M AE S T ER
+ringneck R IH NG N EH K
+ringo R IY NG G OW
+ringold R IH NG G OW L D
+ringquist R IH NG K W IH S T
+rings R IH NG Z
+ringside R IH NG S AY D
+ringstad R IH NG S T AH D
+ringuette R IH NG EH T
+ringwald R IH NG W AO L D
+ringwood R IH NG W UH D
+rini R IY N IY
+rininger R IH N IH NG ER
+rink R IH NG K
+rinke R IH NG K
+rinkenberger R IH NG K AH N B ER G ER
+rinker R IH NG K ER
+rinko R IH NG K OW
+rinks R IH NG K S
+rinn R IH N
+rinne R IH N
+rinse R IH N S
+rinsing R IH N S IH NG
+rintala R IY N T AA L AH
+rintel R IH N T EH L
+rintel's R IH N T EH L Z
+rintels R IH N T EH L Z
+rintels' R IH N T EH L Z
+rio R IY OW
+rio's R IY OW Z
+rio-de-janeiro R IY OW D IY JH AH N EH R OW
+riojas R IY OW Y AA Z
+riolo R IY OW L OW
+rion R AY AH N
+riopel R IY AH P EH L
+riopelle R IY AH P EH L IY
+riordan R IH R D AH N
+riordan's R IH R D AH N Z
+rios R IY OW S
+riot R AY AH T
+rioted R AY AH T IH D
+rioter R AY AH T ER
+rioters R AY AH T ER Z
+rioting R AY AH T IH NG
+riotous R AY AH T AH S
+riots R AY AH T S
+riots' R AY AH T S
+rioux R UW
+rip R IH P
+ripa R IY P AH
+ripe R AY P
+ripen R AY P AH N
+ripened R AY P AH N D
+ripening R AY P AH N IH NG
+ripening(2) R AY P N IH NG
+riphagen R IH P AA G AH N
+ripka R IY P K AH
+ripke R IH P K
+ripken R IH P K AH N
+ripken's R IH P K AH N Z
+ripkin R IH P K IH N
+ripley R IH P L IY
+ripoff R IH P AO F
+ripoffs R IH P AO F S
+riposte R IH P OW S T
+ripostes R IH P AO S T S
+ripp R IH P
+rippe R IH P
+ripped R IH P T
+rippee R IH P IY
+rippel R IH P AH L
+rippeon R IH P IY AH N
+ripper R IH P ER
+ripperger R IH P ER G ER
+rippetoe R IH P IH T OW
+rippey R IH P IY
+ripping R IH P IH NG
+ripple R IH P AH L
+rippled R IH P AH L D
+ripples R IH P AH L Z
+rippling R IH P AH L IH NG
+rippling(2) R IH P L IH NG
+ripplinger R IH P AH L IH NG ER
+ripplinger(2) R IH P L IH NG ER
+rippon R IH P AH N
+rippy R IH P IY
+rips R IH P S
+risa R IY S AH
+risberg R IH S B ER G
+risc R IH S K
+risch R IH SH
+risden R IH S D AH N
+risdon R IH S D AH N
+rise R AY Z
+risen R IH Z AH N
+risenhoover R IH S IH N HH UW V ER
+risenhoover(2) R AY Z IH N HH UW V ER
+riser R AY Z ER
+rises R AY Z AH Z
+rises(2) R AY Z IH Z
+rish R IH SH
+rishel R IH SH AH L
+rishell R IH SH AH L
+risher R IH SH ER
+risi R IY S IY
+risin R AY Z IH N
+rising R AY Z IH NG
+risinger R AY Z IH NG ER
+risk R IH S K
+riske R IH S K
+riske's R IH S K S
+risked R IH S K T
+riskier R IH S K IY ER
+riskiest R IH S K IY AH S T
+riskin R IH S K IH N
+riskiness R IH S K IY N AH S
+risking R IH S K IH NG
+riskless R IH S K L AH S
+risko R IH S K OW
+risks R IH S K S
+risky R IH S K IY
+risley R IH Z L IY
+risner R IH S N ER
+riso R IY S OW
+rison R IH S AH N
+rispoli R IY S P OW L IY
+risque R IH S K EY
+riss R IH S
+risse R IH S
+risser R IH S ER
+rissler R IH S L ER
+rissman R IH S M AH N
+rissmiller R IH S M IH L ER
+rissmiller's R IH S M IH L ER Z
+risso R IH S OW
+risso's R IH S OW Z
+rissoli R IH S OW L IY
+rissoli's R IH S OW L IY Z
+rist R IH S T
+ristau R IH S T AW
+rister R IH S T ER
+riston R IH S T AH N
+ristorante R IH S T ER AA N T EY
+ristorantes R IH S T ER AA N T EY Z
+ristow R IH S T OW
+rita R IY T AH
+rita's R IY T AH Z
+ritacco R IY T AA K OW
+ritalin R IH T AH L IH N
+ritcey R IH T S IY
+ritcey's R IH T S IY Z
+ritch R IH CH
+ritchey R IH CH IY
+ritchey's R IH CH IY Z
+ritchie R IH CH IY
+ritchie's R IH CH IY Z
+rite R AY T
+rite's R AY T S
+ritenour R IH T AH N AW R
+ritenour's R IH T AH N AW R Z
+ritenour's(2) R AY T AH N AW R Z
+ritenour(2) R AY T AH N AW R
+riter R AY T ER
+rites R AY T S
+ritesh R IH T EH SH
+ritger R IH T G ER
+ritner R IH T N ER
+ritsema R IH T S IY M AH
+ritson R IH T S AH N
+ritt R IH T
+ritt's R IH T S
+rittenberg R IH T AH N B ER G
+rittenberg's R IH T AH N B ER G Z
+rittenberry R IH T AH N B EH R IY
+rittenberry's R IH T AH N B EH R IY Z
+rittenhouse R IH T AH N HH AW S
+rittenhouse's R IH T AH N HH AW S IH Z
+rittenour R IH T AH N AW R
+rittenour's R IH T AH N AW R Z
+ritter R IH T ER
+ritter's R IH T ER Z
+ritterbusch R IH T ER B UH SH
+rittereiser R IH T ER AY Z ER
+rittereiser's R IH T ER AY Z ER Z
+rittgers R IH T G ER Z
+ritthaler R IH TH AH L ER
+rittle R IH T AH L
+rittman R IH T M AH N
+rittner R IH T N ER
+ritts R IH T S
+ritual R IH CH UW AH L
+ritualistic R IH CH UW AH L IH S T IH K
+ritualistically R IH CH UW AH L IH S T IH K AH L IY
+ritualistically(2) R IH CH UW AH L IH S T IH K L IY
+rituals R IH CH UW AH L Z
+ritz R IH T S
+ritzel R IH T Z AH L
+ritzenthaler R IH T Z IH N TH AH L ER
+ritzenthaler(2) R IH T S IH N TH AA L ER
+ritzer R IH T Z ER
+ritzert R IH T Z ER T
+ritziest R IH T S IY AH S T
+ritzman R IH T S M AH N
+ritzy R IH T S IY
+riunite R IY UW N AY T
+riunite(2) R IY UW N AY T IY
+riva R IY V AH
+rival R AY V AH L
+rival's R AY V AH L Z
+rivaled R AY V AH L D
+rivaling R AY V AH L IH NG
+rivaling(2) R AY V L IH NG
+rivalries R AY V AH L R IY Z
+rivalry R AY V AH L R IY
+rivals R AY V AH L Z
+rivals' R AY V AH L Z
+rivard R IH V ER D
+rivas R IY V AA Z
+riven R IH V AH N
+rivenbark R IH V IH N B AA R K
+rivenburg R IH V AH N B ER G
+rivenburgh R IH V IH N B ER G
+river R IH V ER
+river's R IH V ER Z
+rivera R IH V EH R AH
+riverbank R IH V ER B AE NG K
+riverbed R IH V ER B EH D
+riverbend R IH V ER B EH N D
+riverboat R IH V ER B OW T
+riverboat's R IH V ER B OW T S
+riverboats R IH V ER B OW T S
+riverdale R IH V ER D EY L
+riverfront R IH V ER F R AH N T
+riverhead R IH V ER HH EH D
+rivero R IY V EH R OW
+rivers R IH V ER Z
+riverside R IH V ER S AY D
+riverso R IH V ER S OW
+riverway R IH V ER W EY
+riverwood R IH V ER W UH D
+rives R AY V Z
+rivest R IH V IH S T
+rivet R IH V AH T
+riveted R IH V AH T IH D
+riveting R IH V AH T IH NG
+rivets R IH V AH T S
+rivett R IH V IH T
+rivette R IH V EH T
+riviello R IY V IY EH L OW
+riviera R IH V IY EH R AH
+riviere R IH V IY EH R
+rivieres R IH V Y IH R EH Z
+rivkin R IH V K IH N
+rivkind R IH V K IH N D
+rivlin R IH V L IH N
+rix R IH K S
+riyad R IY AA D
+riyad(2) R IY AE D
+riyadh R IY AE D
+riyadh(2) R IY AA D
+riyals R IY Y AA L Z
+riz R IH Z
+rizer R AY Z ER
+rizk R IH Z K
+rizo R IY Z OW
+rizor R AY Z ER
+rizza R IH Z AH
+rizzi R IH Z IY
+rizzo R IH Z OW
+rizzoli R IH Z OW L IY
+rizzolo R IY T S OW L OW
+rizzuti R IY T S UW T IY
+rizzuto R IY T S UW T OW
+ro R OW
+roa R OW AH
+roach R OW CH
+roache R OW CH
+roaches R OW CH IH Z
+road R OW D
+road's R OW D Z
+roadblock R OW D B L AA K
+roadblocks R OW D B L AA K S
+roadcap R OW D K AE P
+roades R OW D Z
+roadhouse R OW D HH AW S
+roadie R OW D IY
+roadmaster R OW D M AE S T ER
+roadrailer R OW D R EY L ER
+roadrunner R OW D R AH N ER
+roads R OW D Z
+roadshow R OW D SH OW
+roadside R OW D S AY D
+roadsides R OW D S AY D Z
+roadster R OW D S T ER
+roadway R OW D W EY
+roadways R OW D W EY Z
+roadwork R OW D W ER K
+roady R OW D IY
+roald R OW L D
+roam R OW M
+roamed R OW M D
+roaming R OW M IH NG
+roams R OW M Z
+roan R OW N
+roane R OW N
+roanna R OW N AH
+roanoke R OW AH N OW K
+roar R AO R
+roared R AO R D
+roaring R AO R IH NG
+roark R AO R K
+roarke R AO R K
+roars R AO R Z
+roarty R AO R T IY
+roast R OW S T
+roasted R OW S T AH D
+roasted(2) R OW S T IH D
+roaster R OW S T ER
+roasters R OW S T ER Z
+roasting R OW S T IH NG
+roasts R OW S T S
+roat R OW T
+roath R OW TH
+rob R AA B
+rob's R AA B Z
+roback R OW B AE K
+robaina R OW B EY N AH
+robak R OW B AH K
+robar R AH B AA R
+robards R AA B ER D Z
+robare R OW B AA R EY
+robarge R AA B AA R G
+robart R AA B AA R T
+robarts R AA B AA R T S
+robb R AA B
+robb's R AA B Z
+robbe R AA B
+robbed R AA B D
+robben R AA B AH N
+robber R AA B ER
+robberies R AA B ER IY Z
+robbers R AA B ER Z
+robberson R AA B ER S AH N
+robbery R AA B ER IY
+robbie R AA B IY
+robbie's R AA B IY Z
+robbin R AA B IH N
+robbing R AA B IH NG
+robbins R AA B IH N Z
+robbs R AA B Z
+robby R AA B IY
+robby's R AA B IY Z
+robe R OW B
+robeck R OW B EH K
+robed R OW B D
+robel R OW B AH L
+robello R OW B EH L OW
+robelo R AA B EH L OW
+rober R OW B ER
+roberds R AA B ER D Z
+roberg R OW B ER G
+roberge R AA B ER JH
+robers R OW B ER Z
+roberson R AA B ER S AH N
+robert R AA B ER T
+robert's R AA B ER T S
+roberta R AH B ER T AH
+roberti R AH B ER T IY
+roberto R AH B EH R T OW
+roberto(2) R OW B EH R T OW
+roberts R AA B ER T S
+roberts' R AA B ER T S
+roberts's R AA B ER T S IH Z
+robertshaw R AA B ER T SH AO
+robertson R AA B ER T S AH N
+robertson's R AA B ER T S AH N Z
+robes R OW B Z
+robeson R OW B IH S AH N
+robey R OW B IY
+robia R OW B IY AH
+robichaud R AA B IH SH OW
+robichaux R AA B IH SH OW
+robicheaux R AA B IH SH OW
+robideau R AA B IH D OW
+robidoux R AA B IH D UW
+robie R OW B IY
+robillard R AA B IH L ER D
+robin R AA B AH N
+robin's R AA B AH N Z
+robin's(2) R AA B IH N Z
+robin(2) R AA B IH N
+robina R AH B IY N AH
+robinett R AA B IH N EH T
+robinette R AA B IH N EH T
+robinhood R AA B IH N HH UH D
+robinia R OW B IY N IY AH
+robins R AA B AH N Z
+robins' R AA B AH N Z
+robins's R AA B AH N Z IH Z
+robinson R AA B AH N S AH N
+robinson's R AA B AH N S AH N Z
+robinsons R AA B AH N S AH N Z
+robinsons' R AA B AH N S AH N Z
+robishaw R AA B IH SH AO
+robison R AA B IH S AH N
+robitaille R AA B IH T EY L
+robitussin R AA B IH T AH S IH N
+robitussin(2) R OW B AH T AH S IH N
+robl R AA B AH L
+roble R OW B AH L
+robledo R OW B L EY D OW
+roblee R AA B L IY
+robles R OW B AH L Z
+robley R AA B L IY
+roblin R AA B L IH N
+robling R OW B AH L IH NG
+robling(2) R OW B L IH NG
+robnett R AA B N IH T
+robo R OW B OW
+robocop R OW B OW K AA P
+robot R OW B AA T
+robot's R OW B AA T S
+robot's(2) R OW B AH T S
+robot(2) R OW B AH T
+robotic R OW B AA T IH K
+robotics R OW B AA T IH K S
+robots R OW B AA T S
+robots(2) R OW B AH T S
+robs R AA B Z
+robson R AA B S AH N
+robuck R AA B AH K
+robust R OW B AH S T
+robusta R AA B AH S T AH
+robustas R AA B AH S T AH S
+robustelli R OW B AH S T EH L IY
+robustelli's R OW B AH S T EH L IY Z
+robustly R OW B AH S T L IY
+robustness R OW B AH S T N AH S
+roby R OW B IY
+robyn R AA B IH N
+roc R AA K
+roca R OW K AH
+rocap R OW K AE P
+rocard R OW K ER D
+rocard(2) R OW K AA R D
+rocard(3) R OW SH AA R D
+rocard(4) R AH K AA R D
+rocca R AA K AH
+roccaforte R OW K AH F AO R T IY
+roccas R AA K AH S
+rocchi R OW K IY
+rocchio R OW K IY OW
+rocco R AA K OW
+rocco's R AA K OW Z
+roch R AA K
+rocha R OW K AH
+rochat R AA CH AH T
+rochberg R OW CH B ER G
+roche R OW CH
+roche's R OW SH IH Z
+roche(2) R OW SH
+rochefort R AA K IH F ER T
+rochefort(2) R AA SH F ER T
+rochefort(3) R AA K F ER T
+rocheleau R AA SH IH L OW
+rochella R AH CH EH L AH
+rochelle R OW SH EH L
+rochelle's R OW SH EH L Z
+rochelle's(2) R AH SH EH L Z
+rochelle(2) R AH SH EH L
+rocher R OW CH ER
+rocher(2) R OW SH ER
+rochester R AA CH EH S T ER
+rochester's R AA CH EH S T ER Z
+rochette R AH SH EH T
+rochford R AA CH F ER D
+rochlin R AA K L IH N
+rochon R AA CH AH N
+rock R AA K
+rock'n'roll R AA K AH N R OW L
+rock's R AA K S
+rock-and-roll R AA K AE N D R OW L
+rockabilly R AA K AH B IH L IY
+rockafellow R AA K AH F EH L OW
+rockaway R AA K AH W EY
+rocke R AA K
+rocked R AA K T
+rockefeller R AA K AH F EH L ER
+rockefeller's R AA K AH F EH L ER Z
+rockefellers R AA K AH F EH L ER Z
+rockel R AA K AH L
+rockenbach R AA K IH N B AA K
+rocker R AA K ER
+rockers R AA K ER Z
+rocket R AA K AH T
+rocket's R AA K AH T S
+rocketdyne R AA K IH T D AY N
+rocketed R AA K AH T IH D
+rocketing R AA K AH T IH NG
+rocketry R AA K AH T R IY
+rockets R AA K AH T S
+rockett R AA K IH T
+rockette R AA K EH T
+rockettes R AA K EH T S
+rockey R AA K IY
+rockford R AA K F ER D
+rockhill R AA K HH IH L
+rockhold R AA K HH OW L D
+rockholt R AA K HH OW L T
+rockies R AA K IY Z
+rockin' R AA K IH N
+rocking R AA K IH NG
+rockingham R AA K IH NG HH AE M
+rockland R AA K L AH N D
+rockley R AA K L IY
+rocklin R AA K L IH N
+rockman R AA K M AH N
+rockmore R AA K M AO R
+rockne R AA K N IY
+rockoff R AA K AO F
+rockow R AA S K OW
+rockport R AA K P AO R T
+rockresort R AA K R IH Z AO R T
+rockresorts R AA K R IH Z AO R T S
+rockrose R AA K R OW Z
+rocks R AA K S
+rockville R AA K V IH L
+rockwell R AA K W EH L
+rockwell's R AA K W EH L Z
+rockwood R AA K W UH D
+rocky R AA K IY
+rococo R AH K OW K OW
+rocque R AA K
+rod R AA D
+roda R OW D AH
+rodabaugh R AA D AH B AO
+rodak R OW D AH K
+rodale R OW D EY L
+rodarte R AA D AA R T
+rodas R OW D AH Z
+rodd R AA D
+rodden R AA D AH N
+roddenberry R AA D AH N B EH R IY
+roddey R AA D IY
+roddick R AA D IH K
+roddie R AA D IY
+rodding R AA D IH NG
+roddy R AA D IY
+rode R OW D
+rodebaugh R AA D IH B AO
+rodefer R AA D IH F ER
+rodeffer R AA D IH F ER
+rodeheaver R AA D IH HH IY V ER
+rodela R OW D EH L AH
+rodell R AA D AH L
+roden R OW D AH N
+rodenbaugh R AA D IH N B AW
+rodenbeck R OW D AH N B EH K
+rodenberg R OW D AH N B ER G
+rodenberger R OW D AH N B ER G ER
+rodenburg R OW D AH N B ER G
+rodent R OW D AH N T
+rodenticide R OW D EH N T IH S AY D
+rodents R OW D AH N T S
+rodeo R OW D IY OW
+rodeos R OW D IY OW Z
+roder R OW D ER
+roderica R OW D ER IY K AH
+roderick R AA D R IH K
+roderick's R AA D R IH K S
+rodes R OW D Z
+rodewald R AA D UW AO L D
+rodeway R OW D W EY
+rodge R AA JH
+rodger R AA JH ER
+rodgers R AA JH ER Z
+rodgin R AA JH IH N
+rodham R AO D AH M
+rodi R OW D IY
+rodick R AA D IH K
+rodier R OW D IY ER
+rodime R OW D IY M
+rodin R OW D IH N
+rodin(2) R OW D AE N
+rodine R OW D IY N IY
+rodino R OW D IY N OW
+rodkey R AA D K IY
+rodman R AA D M AH N
+rodman's R AA D M AH N Z
+rodmond R AA D M AH N D
+rodmund R AA D M AH N D
+rodney R AA D N IY
+rodocker R AA D AH K ER
+rodolf R AA D OW L F
+rodolfo R OW D AA L F OW
+rodolph R OW D AA L F
+rodrick R AA D R IH K
+rodrigeuz R OW D R IY JH UW Z
+rodrigo R AH D R IY G OW
+rodrigue R OW D R IY G
+rodrigues R AA D R IY G IH S
+rodriguez R AA D R IY G EH Z
+rodriguez's R AA D R IY G EH Z IH Z
+rodriques R AA D R IY G EH S
+rodriquez R AA D R IY K EH Z
+rods R AA D Z
+rodwell R AA D W EH L
+rody R OW D IY
+roe R OW
+roeber R OW B ER
+roebke R OW B K
+roebling R OW B L IH NG
+roebuck R OW B AH K
+roebuck's R OW B AH K S
+roecker R OW K ER
+roed R OW D
+roedel R OW D AH L
+roeder R OW D ER
+roederer R OW D ER ER
+roediger R OW D IH G ER
+roedl R OW D AH L
+roegner R OW G N ER
+roehi R OW IY
+roehl R OW L
+roehling R OW L IH NG
+roehm R OW M
+roehr R AO R
+roehrich R AO R IH K
+roehrig R AO R IH G
+roehrs R AO R Z
+roeland R OW L AH N D
+roelke R OW L K
+roell R OW L
+roelle R OW L
+roeller R OW L ER
+roelofs R OW L AH F S
+roemer R OW M ER
+roemmich R OW M IH K
+roen R OW N
+roeper R OW P ER
+roepke R OW P K
+roes R OW Z
+roesch R OW SH
+roese R OW S
+roesel R OW S AH L
+roeser R OW Z ER
+roeske R OW S K
+roesler R OW S AH L ER
+roesler(2) R OW S L ER
+roesner R OW S N ER
+roessler R OW S AH L ER
+roessler(2) R OW S L ER
+roessner R OW S N ER
+roether R OW DH ER
+roethler R OW TH AH L ER
+roethler(2) R OW TH L ER
+roettger R OW T G ER
+roever R AA EH V ER
+roff R AO F
+roffe R AA F
+roffman R AO F M AH N
+rofin R OW F IH N
+rog R AA G
+rogachev R OW G AH CH AH V
+rogacki R AH G AA T S K IY
+rogaine R OW G EY N
+rogal R OW G AH L
+rogala R OW G AA L AH
+rogalla R OW G AA L AH
+rogalski R AH G AA L S K IY
+rogan R OW G AH N
+rogel R OW G AH L
+rogelio R OW G IY L IY OW
+roger R AA JH ER
+roger's R AA JH ER Z
+rogernomics R OW G ER N AA M IH K S
+rogers R AA JH ER Z
+rogers' R AA JH ER Z
+rogers's R AA JH ER Z IH Z
+rogerson R AA G ER S AH N
+roget R OW ZH EY
+roget's R OW ZH EY Z
+rogge R AA G
+roggenbuck R AA G IH N B AH K
+roggenkamp R AA G IH N K AE M P
+roggio R AA Z IY OW
+roggow R AA G OW
+rogier R OW G IY ER
+rogin R OW G IH N
+roginski R AH G IH N S K IY
+rogness R AA G N IH S
+rogoff R AA G AO F
+rogowski R AH G AO F S K IY
+rogozinski R AH G AH Z IH N S K IY
+rogstad R AA G S T AH D
+rogue R OW G
+rogues R OW G Z
+rogus R OW G AH S
+roh R OW
+roh's R OW Z
+rohan R OW AH N
+rohana R AH HH AE N AH
+rohatyn R AA HH AH T IH N
+rohatyn's R AA HH AH T IH N Z
+rohatyn's(2) R OW HH AE T AH N Z
+rohatyn(2) R OW HH AE T AH N
+rohde R OW D
+rohde(2) R OW D AH
+rohe R OW
+roher R OW ER
+rohl R OW L
+rohland R OW L AH N D
+rohleder R OW L IH D ER
+rohlf R OW L F
+rohlfing R OW L F IH NG
+rohlfs R OW L F S
+rohlicek R AA L AH CH EH K
+rohling R OW L IH NG
+rohlman R OW L M AH N
+rohloff R OW L AO F
+rohm R OW M
+rohman R OW M AH N
+rohmer R OW M ER
+rohn R AA N
+rohner R OW N ER
+rohr R AO R
+rohrbach R AO R B AA K
+rohrbacher R AO R B AA K ER
+rohrback R AO R B AE K
+rohrbaugh R AO R B AW
+rohrbough R AO R B AW
+rohrer R AO R ER
+rohrich R AO R IH K
+rohrig R AO R IH G
+rohrman R AO R M AH N
+rohrs R AO R Z
+rohs R OW Z
+rohstoff R OW S T AO F
+rohwedder R OW W IH D ER
+rohweder R OW W IH D ER
+rohwer R OW W ER
+rohypnol R OW HH AY P N AO L
+roi R OY
+roig R OY G
+roil R OY L
+roiled R OY L D
+roiling R OY L IH NG
+roister R OY S T ER
+roister's R OY S T ER Z
+rojas R OW HH AA S
+rojek R OW Y EH K
+rojo R OW JH OW
+roka R OW K AH
+rokahr R OW K AA R
+rokar R OW K AA R
+rokicki R AH K IH K IY
+rokos R OW K OW Z
+rokosz R AA K AH SH
+rol R OW L
+rolan R OW L AH N
+roland R OW L AH N D
+rolanda R OW L AA N D AH
+rolando R OW L AA N D OW
+roldan R OW L D AH N
+role R OW L
+rolemodel R OW L M AA D AH L
+rolemodels R OW L M AA D AH L Z
+rolen R OW L AH N
+roleplaying R OW L P L EY IH NG
+roles R OW L Z
+rolette R OW L EH T
+rolex R OW L EH K S
+roley R OW L IY
+rolf R OW L F
+rolfe R OW L F
+rolfes R OW L F S
+rolfs R OW L F S
+rolfson R OW L F S AH N
+rolin R OW L IH N
+roling R OW L IH NG
+rolison R AA L IH S AH N
+roll R OW L
+roll's R OW L Z
+rolla R AA L AH
+rolland R AA L AH N D
+rolland's R OW L AH N D Z
+rollback R OW L B AE K
+rollbacks R OW L B AE K S
+rolle R OW L
+rolled R OW L D
+rollei R OW L EY
+rollen R AO L AH N
+roller R OW L ER
+rollerblade R OW L ER B L EY D
+rollerblades R OW L ER B L EY D Z
+rollerblading R OW L ER B L EY D IH NG
+rollercoaster R OW L ER K OW S T ER
+rollers R OW L ER Z
+rollet R OW L EH T
+rolley R AA L IY
+rolli R AA L IY
+rollicking R AA L IH K IH NG
+rollie R OW L IY
+rollie(2) R AO L IY
+rollin R AA L IH N
+rollin' R OW L IH N
+rolling R OW L IH NG
+rollinger R OW L IH NG ER
+rollings R OW L IH NG Z
+rollins R AA L IH N Z
+rollins' R AA L IH N Z
+rollins's R AA L IH N Z IH Z
+rollinson R AA L IH N S AH N
+rollison R AA L IH S AH N
+rollman R OW L M AH N
+rollo R AA L OW
+rollout R OW L AW T
+rollover R OW L OW V ER
+rollovers R OW L OW V ER Z
+rolls R OW L Z
+rolls's R OW L Z IH Z
+rolltop R OW L T AA P
+rollwagen R OW L W AE G AH N
+rolly R OW L IY
+rollyson R AA L IH S AH N
+rolm R OW M
+rolnick R OW L N IH K
+rolodex R OW L AH D EH K S
+roloff R AA L AO F
+rolon R OW L AH N
+rolph R OW L F
+rolston R OW L S T AH N
+rolt R OW L T
+rom R AA M
+rom's R AA M Z
+roma R OW M AH
+romack R AA M AH K
+romagnoli R OW M AA G N OW L IY
+romagnolo R OW M AA N Y OW L OW
+romain R OW M EY N
+romaine R OW M EY N
+roman R OW M AH N
+roman's R OW M AH N Z
+romance R OW M AE N S
+romances R OW M AE N S IH Z
+romancing R OW M AE N S IH NG
+romanek R AA M AH N IH K
+romanelli R OW M AA N EH L IY
+romanello R OW M AA N EH L OW
+romanesque R OW M AH N EH S K
+romani R OW M AA N IY
+romania R OW M EY N IY AH
+romania's R OW M EY N IY AH Z
+romanian R OW M EY N IY AH N
+romanians R OW M EY N IY AH N Z
+romaniello R OW M AA N IY EH L OW
+romanik R AH M AE N IH K
+romann R OW M AH N
+romano R OW M AA N OW
+romano's R OW M AA N OW Z
+romanoff R OW M AH N AO F
+romanone R OW M AA N OW N
+romanones R OW M AA N OW N Z
+romanoski R AH M AH N AW S K IY
+romanov R OW M AH N AO V
+romanov(2) R OW M AH N AO F
+romanow R AH M AE N OW
+romanowski R AH M AH N AO F S K IY
+romans R OW M AH N Z
+romanski R AH M AE N S K IY
+romantic R OW M AE N T IH K
+romantically R OW M AE N T IH K AH L IY
+romantically(2) R OW M AE N T IH K L IY
+romanticism R OW M AE N T AH S IH Z AH M
+romanticize R OW M AE N T AH S AY Z
+romanticized R OW M AE N T AH S AY Z D
+romanticizing R OW M AE N T AH S AY Z IH NG
+romantics R OW M AE N T IH K S
+romany R AA M AH N IY
+romany(2) R OW M AH N IY
+romas R OW M AH Z
+rombach R AA M B AA K
+romberg R AA M B ER G
+romberger R AA M B ER G ER
+rome R OW M
+rome's R OW M Z
+romel R OW M AH L
+romella R OW M EH L AH
+romelle R AH M EH L
+romeo R OW M IY OW
+romer R OW M ER
+romero R OW M EH R OW
+romesburg R OW M Z B ER G
+romey R OW M IY
+romick R AA M IH K
+romig R OW M IH G
+romilda R AH M IY L D AH
+romina R AH M IY N AH
+romine R AH M IY N IY
+romine(2) R AA M IH N
+romines R AA M IH N Z
+romines(2) R AH M IY N IY Z
+rominger R OW M IH NG ER
+romito R OW M IY T OW
+romley R AA M L IY
+romm R AA M
+rommel R AA M AH L
+romney R AA M N IY
+romney's R AA M N IY Z
+romo R OW M OW
+romola R AA M AH L AH
+romp R AA M P
+romping R AA M P IH NG
+roms R AA M Z
+romuald R OW M Y UW AA L D
+romulus R AA M Y AH L AH S
+ron R AA N
+ron's R AA N Z
+rona R OW N AH
+ronald R AA N AH L D
+ronalda R OW N AA L D AH
+ronan R OW N AH N
+ronan's R OW N AH N Z
+ronayne R AA N EY N
+ronca R OW N K AH
+ronco R OW N K OW
+ronda R AA N D AH
+rondeau R AA N D OW
+rondinelli R OW N D IY N EH L IY
+rondon R AA N D AH N
+rondonia R AA N D OW N IY AH
+rone R OW N
+ronen R OW N AH N
+roney R OW N IY
+rong R AO NG
+rongji R AO NG JH IY
+roni R OW N IY
+ronin R OW N IH N
+ronk R AA NG K
+ronko R AA NG K OW
+ronna R AA N AH
+ronne R AA N
+ronnie R AA N IY
+ronning R AA N IH NG
+ronny R AA N IY
+ronquillo R OW N K W IH L OW
+ronson R AA N S AH N
+ronstadt R AA N S T AE T
+rood R UW D
+roode R UW D
+roof R UW F
+roof(2) R UH F
+roofed R UW F T
+roofer R UW F ER
+roofers R UW F ER Z
+roofing R UW F IH NG
+roofs R UW F S
+rooftop R UW F T AA P
+rooftops R UW F T AA P S
+rooftree R UW F T R IY
+rook R UH K
+rookard R UH K ER D
+rooke R UH K
+rooker R UH K ER
+rookie R UH K IY
+rookies R UH K IY Z
+rooks R UH K S
+rookstool R UH K S T UW L
+room R UW M
+room's R UW M Z
+roome R UW M
+roomful R UW M F UH L
+roomier R UW M IY ER
+roominess R UW M IY N AH S
+rooming R UW M IH NG
+roommate R UW M EY T
+roommates R UW M EY T S
+rooms R UW M Z
+roomy R UW M IY
+roone R UW N
+rooney R UW N IY
+rooney's R UW N IY Z
+roop R UW P
+roope R UW P
+roorda R UH R D AH
+roos R UW Z
+roosa R UW S AH
+roose R UW Z
+roosevelt R OW Z AH V EH L T
+roosevelt's R OW Z AH V EH L T S
+roosevelt's(2) R UW Z AH V EH L T S
+roosevelt(2) R UW Z AH V EH L T
+roosevelts R OW Z AH V EH L T S
+roosevelts(2) R UW Z AH V EH L T S
+roost R UW S T
+roosted R UW S T IH D
+rooster R UW S T ER
+roosters R UW S T ER Z
+root R UW T
+rooted R UW T AH D
+rooted(2) R UW T IH D
+rooter R UW T ER
+rooters R UW T ER Z
+rooting R UW T IH NG
+rootless R UW T L AH S
+roots R UW T S
+rootstein R UW T S T AY N
+ropak R OW P AE K
+rope R OW P
+roped R OW P T
+roper R OW P ER
+roper's R OW P ER Z
+ropers R OW P ER Z
+ropes R OW P S
+roping R OW P IH NG
+ropp R AA P
+roppolo R OW P OW L OW
+rops R AA P S
+roque R OW K
+roquemore R OW K M AO R
+rorabaugh R AO R AH B AO
+rorer R AO R ER
+rorer's R AO R ER Z
+rorex R AO R EH K S
+rorick R AO R IH K
+rorie R AO R IY
+rork R AO R K
+rorke R AO R K
+rorrer R AO ER R
+rorschach R AO R SH AA
+rorschach(2) R AO R SH AA CH
+rory R AO R IY
+ros R AO S
+rosa R OW Z AH
+rosa's R OW Z AH Z
+rosabel R OW Z AH B EH L
+rosabelle R AA S AH B AH L
+rosado R AH S AA D OW
+rosalee R OW S AH L IY
+rosalee(2) R OW Z AH L IY
+rosales R OW S EY L Z
+rosalez R OW S AA L EH Z
+rosalia R OW Z AH L IY AH
+rosalie R OW Z AH L IY
+rosalind R AA Z AH L IH N D
+rosalinda R OW S AA L IY N D AH
+rosalyn R AA Z AH L IH N
+rosalyn's R AA Z AH L IH N Z
+rosalynd R AA Z AH L IH N D
+rosalynn R OW Z AH L IH N
+rosamilia R OW Z AA M IY L IY AH
+rosamond R OW Z AH M AH N D
+rosamund R OW Z AH M UH N D
+rosan R OW Z AH N
+rosander R OW Z AE N D ER
+rosanna R OW Z AE N AH
+rosanne R OW Z AE N
+rosano R OW Z AA N OW
+rosaria R OW Z AA R IY AH
+rosaria's R OW Z AA R IY AH Z
+rosaries R OW Z ER IY Z
+rosario R OW Z AA R IY OW
+rosary R OW Z ER IY
+rosas R OW Z AH Z
+rosasco R OW Z AA S K OW
+rosati R OW Z AA T IY
+rosato R OW Z AA T OW
+rosberg R AA S B ER G
+rosborough R AA S B ER OW
+rosch R AO SH
+roscher R AO SH ER
+roscoe R AA S K OW
+rose R OW Z
+rose's R OW Z IH Z
+roseanne R OW Z AE N
+roseanne's R OW Z AE N Z
+roseate R OW Z IY AH T
+roseberry R OW Z B EH R IY
+roseboom R OW Z B UW M
+roseboro R OW Z B ER OW
+roseborough R OW Z B ER OW
+rosebrock R OW Z B R AH K
+rosebrook R OW Z B R UH K
+rosebrough R OW Z B R AW
+rosebud R OW Z B AH D
+rosebush R OW Z B UH SH
+rosecrans R OW Z K R AE N Z
+rosekrans R OW Z K R AH N Z
+rosel R OW Z AH L
+roseland R OW Z L AH N D
+roselawn R OW Z L AO N
+roselawn's R OW Z L AO N Z
+roseline R OW Z L AY N
+rosell R OW Z AH L
+rosella R OW Z EH L AH
+rosellen R OW Z AH L AH N
+roselli R OW S EH L IY
+rosello R OW S EH L OW
+roseman R OW Z M AH N
+rosemarie R OW Z M ER IY
+rosemary R OW Z M EH R IY
+rosemead R OW Z M IY D
+rosemeyer R OW Z M AY ER
+rosemond R OW Z M AH N D
+rosemont R OW Z M AA N T
+rosen R OW Z AH N
+rosen's R OW Z AH N Z
+rosenau R OW Z N AW
+rosenbach R OW Z AH N B AA K
+rosenbalm R OW Z AH N B AA M
+rosenbaum R OW Z AH N B AW M
+rosenbeck R OW Z AH N B EH K
+rosenberg R OW Z AH N B ER G
+rosenberg's R OW Z AH N B ER G Z
+rosenberger R OW Z AH N B ER G ER
+rosenbergs R OW Z AH N B ER G Z
+rosenberry R OW Z AH N B EH R IY
+rosenblatt R OW Z AH N B L AE T
+rosenblatts R OW Z AH N B L AE T S
+rosenbloom R OW Z AH N B L UW M
+rosenblum R OW Z AH N B L UW M
+rosenbluth R OW Z AH N B L UW TH
+rosenboom R OW Z AH N B UW M
+rosenburg R OW Z AH N B ER G
+rosencrans R OW Z AH N K R AE N Z
+rosendahl R OW Z AH N D AA L
+rosendale R OW Z AH N D EY L
+rosene R AA S IY N
+rosener R OW Z AH N ER
+rosenfeld R OW Z AH N F EH L D
+rosenfield R OW Z AH N F IY L D
+rosengarten R OW Z AH N G AA R T AH N
+rosengrant R OW Z AH N G R AE N T
+rosengren R OW Z AH N G R EH N
+rosenhaus R OW Z AH N HH AW S
+rosenkrans R OW Z AH N K R AE N Z
+rosenkrantz R OW Z AH N K R AE N T S
+rosenkranz R OW Z AH N K R AE N T S
+rosenlund R OW Z AH N L AH N D
+rosenman R OW Z AH N M AH N
+rosenow R OW Z AH N AW
+rosenquist R OW Z AH N K W IH S T
+rosenshine R OW Z AH N SH AY N
+rosensteel R OW Z AH N S T IY L
+rosenstein R OW Z AH N S T AY N
+rosenstein(2) R OW Z AH N S T IY N
+rosenstiel R OW Z AH N S T IY L
+rosenstock R OW Z AH N S T AA K
+rosensweig R OW Z AH N S W AY G
+rosenthal R OW Z AH N TH AO L
+rosentreter R OW Z AH N T R EH T ER
+rosenwald R OW Z AH N W AO L D
+rosenwasser R OW Z AH N W AO S ER
+rosenzweig R OW Z AH N Z W AY G
+roser R OW Z ER
+roses R OW Z IH Z
+rosete R AA S IY T
+rosett R OW Z AH T
+rosetta R OW Z EH T AH
+rosette R AH S EH T
+rosettes R OW Z EH T S
+rosetti R OW S EH T IY
+rosevear R OW Z V IH R
+roseville R OW Z V IH L
+rosewicz R OW Z W IH T S
+rosewood R OW Z W UH D
+rosewood's R OW Z W UH D Z
+rosey R OW Z IY
+rosh R AO SH
+roshier R OW SH Y ER
+rosiak R AA S IY AE K
+rosie R OW Z IY
+rosie's R OW Z IY Z
+rosier R OW Z IY ER
+rosin R AA Z AH N
+rosina R OW Z IY N AH
+rosine R OW S IY N IY
+rosing R OW Z IH NG
+rosinski R AH S IH N S K IY
+rosinsky R AH S IH N S K IY
+rosita R OW Z IY T AH
+roskam R AA S K AH M
+roske R OW S K
+rosko R OW S K OW
+roskos R OW S K OW Z
+roslin R AA S L IH N
+roslund R AO Z L AH N D
+roslyn R AA Z L IH N
+rosman R AA S M AH N
+rosmunda R OW S M UW N D AH
+rosneft R AA Z N IH F T
+rosner R AA S N ER
+rosoff R AA S AO F
+rosol R OW S AO L
+rospatch R AO S P AE CH
+ross R AA S
+ross' R AA S
+ross's R AA S IH Z
+ross(2) R AO S
+rossa R OW S AH
+rossano R OW S AA N OW
+rossbach R AA S B AA K
+rossborough R AO S B ER OW
+rosse R AA S
+rosselin R AA S IH L IH N
+rossell R AA S AH L
+rosselli R OW S EH L IY
+rosselot R AA S IH L AH T
+rossen R AO S AH N
+rosser R AO S ER
+rossetti R OW S EH T IY
+rossetto R OW S EH T OW
+rossi R AO S IY
+rossie R AO S IY
+rossignol R AA S IH G N AO L
+rossin R AA S IH N
+rossing R AO S IH NG
+rossini R OW S IY N IY
+rossiter R AO S IH T ER
+rossiya R AO S IY AH
+rossler R AA S AH L ER
+rossler(2) R AA S L ER
+rosslyn R AA S L IH N
+rossman R AO S M AH N
+rossmann R AO S M AH N
+rossmiller R AA S M IH L ER
+rossmore R AA S M AO R
+rossner R AA S N ER
+rosso R OW S OW
+rosson R AA S AH N
+rossow R AA S OW
+rost R AA S T
+rostad R AA S T AH D
+rosten R AA S AH N
+rostenkowski R AO S T EH NG K AW S K IY
+rostenkowski's R AO S T EH NG K AW S K IY Z
+roster R AA S T ER
+rosters R AA S T ER Z
+roston R AA S T AH N
+rostov R AA S T AA V
+rostovondon R AA S T AA V AH D AA N
+rostron R AA S T R AH N
+rostropovich R AO S T R AH P OW V IH CH
+rostropovich(2) R AH S T R AA P AH V IH CH
+rostrum R AA S T R AH M
+rostuca R AO S T UW K AH
+rosty R AO S T IY
+roswald R AA S W AH L D
+roswell R AA S W EH L
+rosy R OW Z IY
+roszak R AA SH AH K
+roszell R AA SH AH L
+roszkowski R AH SH K AO F S K IY
+rot R AA T
+rota R OW T AH
+rotan R OW T AH N
+rotary R OW T ER IY
+rotate R OW T EY T
+rotated R OW T EY T IH D
+rotates R OW T EY T S
+rotating R OW T EY T IH NG
+rotation R OW T EY SH AH N
+rotational R OW T EY SH AH N AH L
+rotationally R OW T EY SH AH N AH L IY
+rotations R OW T EY SH AH N Z
+rotberg R AA T B ER G
+rotblat R AA T B L AE T
+rote R OW T
+rotea R OW T IY AH
+rotella R OW T EH L AH
+roten R OW T AH N
+rotenberg R OW T AH N B ER G
+rotenberry R OW T AH N B EH R IY
+rotert R AA T ER T
+roth R AO TH
+roth's R AA TH S
+rothacker R AO TH AH K ER
+rothbard R AO TH B ER D
+rothbart R AO TH B AA R T
+rothbauer R AO TH B AW ER
+rothberg R AO TH B ER G
+rothchild R AO TH CH AY L D
+rothe R OW DH
+rothenberg R AO TH AH N B ER G
+rothenberger R AO TH AH N B ER G ER
+rother R AO TH ER
+rothermel R AA TH ER M AH L
+rothert R AA TH ER T
+rothery R AA TH ER IY
+rothfuss R AO TH F AH S
+rothgeb R AO TH G IH B
+rothkopf R AO TH K AO P F
+rothkopf(2) R AO TH K AO F
+rothlisberger R AO TH L IH S B ER G ER
+rothman R AO TH M AH N
+rothmans R AO TH M AH N Z
+rothmans's R AO TH M AH N Z IH Z
+rothmeier R AO TH M AY R
+rothrock R AO TH R AH K
+roths R AO TH S
+rothschild R AO TH S CH AY L D
+rothschild's R AO TH CH AY L D Z
+rothschilds R AO TH CH AY L D Z
+rothstein R AO TH S T AY N
+rothstein(2) R AO TH S T IY N
+rothwax R AO TH W AE K S
+rothweiler R AO TH W AY L ER
+rothwell R AO TH W EH L
+rothwells R AO TH W EH L Z
+roti R OW T IY
+rotisserie R OW T IH S ER IY
+rotman R AA T M AH N
+roto R OW T OW
+rotolo R OW T OW L OW
+rotondi R OW T OW N D IY
+rotondo R OW T OW N D OW
+rotor R OW T ER
+rotors R OW T ER Z
+rototill R OW T AH T IH L
+rototill(2) R OW T OW T IH L
+rototilled R OW T AH T IH L D
+rototilled(2) R OW T OW T IH L D
+rototiller R OW T AH T IH L ER
+rototiller(2) R OW T OW T IH L ER
+rototilles R OW T AH T IH L Z
+rototilles(2) R OW T OW T IH L Z
+rototilling R OW T AH T IH L IH NG
+rototilling(2) R OW T OW T IH L IH NG
+rotramel R AA T R AH M AH L
+rotruck R AA T R AH K
+rots R AA T S
+rott R AA T
+rotted R AA T IH D
+rotten R AA T AH N
+rottenberg R AA T AH N B ER G
+rotter R AA T ER
+rotterdam R AA T ER D AE M
+rotting R AA T IH NG
+rottinghaus R AA T IH NG HH AW S
+rottler R AA T L ER
+rottman R AA T M AH N
+rottmann R AA T M AH N
+rotund R OW T AH N D
+rotunda R OW T AH N D AH
+rotundo R OW T UW N D OW
+rotunno R OW T UW N OW
+rotz R AA T S
+roubal R UW B AE L
+rouble R UW B AH L
+rouch R AW CH
+roudabush R AW D AH B UH SH
+roudebush R AW D IH B UH SH
+rouge R UW ZH
+rougeau R UW ZH OW
+rough R AH F
+rough's R AH F S
+roughed R AH F T
+rougher R AH F ER
+roughest R AH F AH S T
+roughing R AH F IH NG
+roughly R AH F L IY
+roughneck R AH F N EH K
+roughnecks R AH F N EH K S
+roughness R AH F N AH S
+roughshod R AH F SH AA D
+rought R AO T
+roughton R AH F T AH N
+rouillard R W IY L AA R D
+roukema R UW K M AA
+roukos R UW K OW S
+roulac R UW L AE K
+rouleau R UW L OW
+roulette R UW L EH T
+roulette's R UW L EH T S
+roulettes R UW L EH T S
+roulhac R UW L HH AH K
+roulston R AW L S T AH N
+round R AW N D
+round's R AW N D Z
+roundabout R AW N D AH B AW T
+rounded R AW N D AH D
+rounded(2) R AW N D IH D
+rounder R AW N D ER
+roundhead R AW N D HH EH D
+roundhouse R AW N D HH AW S
+rounding R AW N D IH NG
+roundly R AW N D L IY
+rounds R AW N D Z
+rounds(2) R AW N Z
+roundtable R AW N D T EY B AH L
+roundtree R AW N D T R IY
+roundtrip R AW N D T R IH P
+roundup R AW N D AH P
+roundworm R AW N D W ER M
+roundworms R AW N D W ER M Z
+roundy R AW N D IY
+rounsaville R UW N S AH V IH L
+rountree R AW N T R IY
+roupe R UW P
+rourk R AO R K
+rourke R AO R K
+rouse R AW S
+rouse's R AW Z IH Z
+rouse(2) R AW Z
+roused R AW Z D
+rouser R AW Z ER
+rousey R AW S IY
+roush R AW SH
+rousing R AW Z IH NG
+rousse R AW S
+rousseau R UW S OW
+roussel R UW S EH L
+rousselet R UW S AH L EH T
+roussell R UW S EH L
+rousselle R UW S EH L
+roussin R UW S AE N
+roussos R UW S OW Z
+rout R AW T
+route R UW T
+route(2) R AW T
+routed R UW T IH D
+routed(2) R AW T IH D
+router R UW T ER
+router(2) R AW T ER
+routers R UW T ER Z
+routers(2) R AW T ER Z
+routes R UW T S
+routes(2) R AW T S
+routes(3) R UH T S
+routh R AW TH
+routhier R AW TH IY ER
+routine R UW T IY N
+routinely R UW T IY N L IY
+routines R UW T IY N Z
+routing R AW T IH NG
+routing(2) R UW T IH NG
+routledge R AW T L IH JH
+routon R AW T AH N
+routson R AW T S AH N
+routt R AW T
+routzahn R AW T Z AH N
+roux R UW
+rouyn R UW IH N
+rouzer R AW Z ER
+rovaniemi R OW V AE N IY EH M IY
+rove R OW V
+roven R OW V AH N
+rover R OW V ER
+rover's R OW V ER Z
+rovers R OW V ER Z
+roving R OW V IH NG
+rovings R OW V IH NG Z
+rovira R OW V IH R AH
+rovito R OW V IY T OW
+rovner R AA V N ER
+row R OW
+row's R OW Z
+rowaine R OW EY N
+rowaine's R OW EY N Z
+rowan R OW AH N
+rowan's R OW AH N Z
+rowand R OW AH N D
+rowboat R OW B OW T
+rowbotham R OW B AH TH AE M
+rowden R OW D AH N
+rowdies R AW D IY Z
+rowdiness R AW D IY N AH S
+rowdy R AW D IY
+rowe R OW
+rowe's R OW Z
+rowed R OW D
+rowell R OW IH L
+rowen R OW AH N
+rowena R OW IY N AH
+rowenta R OW EH N T AH
+rower R OW ER
+rowes R OW Z
+rowin R OW IH N
+rowing R OW IH NG
+rowinski R OW IH N S K IY
+rowland R OW L AH N D
+rowland's R OW L AH N D Z
+rowlands R OW L AH N D Z
+rowles R OW L Z
+rowlett R OW L IH T
+rowlette R OW L EH T
+rowley R OW L IY
+rowlie R OW L IY
+rowly R OW L IY
+rowney R OW N IY
+rowntree R OW N T R IY
+rowntree's R OW N T R IY Z
+rowny R OW N IY
+rows R OW Z
+rowse R OW S
+rowser R OW Z ER
+rowsey R OW S IY
+rowson R OW S AH N
+rowton R OW T AH N
+rox R AA K S
+rox's R AA K S IH S
+roxana R AA K S AE N AH
+roxani R AA K S AA N IY
+roxanna R AA K S AE N AH
+roxanne R AA K S IH N
+roxanne(2) R AA K S AE N
+roxborough R AA K S B AH R OW
+roxbury R AA K S B EH R IY
+roxie R AA K S IY
+roxine R AA K S AY N
+roxy R AA K S IY
+roy R OY
+roy's R OY Z
+royal R OY AH L
+royal's R OY AH L Z
+royale R OY AE L
+royalist R OY AH L IH S T
+royall R OY AH L
+royally R OY AH L IY
+royals R OY AH L Z
+royals' R OY AH L Z
+royalties R OY AH L T IY Z
+royalty R OY AH L T IY
+roybal R OY B AH L
+royce R OY S
+royce's R OY S IH Z
+royces R OY S IH Z
+roycroft R OY K R AH F T
+royd R OY D
+royden R OY D AH N
+roydon R OY D AH N
+roye R OY
+royer R OY ER
+royex R OY EH K S
+royex's R OY EH K S IH Z
+royko R OY K OW
+roylance R OY L AH N S
+royle R OY L
+roys R OY Z
+royse R OY S
+royster R OY S T ER
+royster's R OY S T ER Z
+royston R OY S T AH N
+roz R AA Z
+roza R OW Z AH
+rozak R OW Z AH K
+rozanski R AH Z AE N S K IY
+rozar R OW Z ER
+rozas R OW Z AA Z
+rozeboom R AA Z IH B UW M
+rozek R OW Z EH K
+rozell R AA Z AH L
+rozella R OW Z EH L AH
+rozelle R AH Z EH L
+rozema R AH Z IY M AH
+rozen R AA Z AH N
+rozier R OW Z IY ER
+rozman R AA Z M AH N
+roznowski R AH Z N AO F S K IY
+rozsa R OW Z S AH
+rozycki R AH Z IH T S K IY
+rozzell R AA Z AH L
+rozzi R AA Z IY
+rpf AA R P IY EH F
+rpm AA R P IY EH M
+rrrot AA R AA R AA R OW T IY
+rrrot(2) AA R OW T IY
+rrrot(3) R R AA T
+ru R UW
+ru(2) AA R Y UW
+rua R UW AH
+ruam R UW AH M
+ruane R UW EY N
+ruano R UW AA N OW
+ruark R UW AA R K
+rub R AH B
+ruback R UW B AE K
+rubalcaba R UW B AA L K AA B AH
+rubalcava R UW B AA L K AA V AH
+rubano R UW B AA N OW
+rubbed R AH B D
+rubber R AH B ER
+rubberize R AH B ER AY Z
+rubberized R AH B ER AY Z D
+rubbermaid R AH B ER M EY D
+rubbermaid's R AH B ER M EY D Z
+rubbers R AH B ER Z
+rubbery R AH B ER IY
+rubbia R AH B IY AH
+rubbing R AH B IH NG
+rubbish R AH B IH SH
+rubble R AH B AH L
+rubbo R UW B OW
+rube R UW B
+rubeck R UW B EH K
+rubel R UW B AH L
+rubell R UW B AH L
+rubella R UW B EH L AH
+ruben R UW B AH N
+rubendall R AH B IH N D AH L
+rubenfeld R AH B IH N F EH L D
+rubens R UW B AH N Z
+rubenstein R UW B AH N S T AY N
+rubenstein(2) R UW B AH N S T IY N
+ruberg R UW B ER G
+rubert R UW B ER T
+ruberto R UW B EH R T OW
+rubey R UW B IY
+rubi R UW B IY
+rubia R UW B IY AH
+rubicam R UW B IH K AH M
+rubicam's R UW B IH K AH M Z
+rubicon R UW B IH K AO N
+rubie R UW B IY
+rubies R UW B IY Z
+rubik R UW B IH K
+rubik's R UW B IH K S
+rubin R UW B IH N
+rubin's R UW B IH N Z
+rubina R UW B IY N AH
+rubino R UW B IY N OW
+rubinson R AH B IH N S AH N
+rubinstein R UW B IH N S T IY N
+rubinstein(2) R UW B IH N S T AY N
+rubio R UW B IY OW
+rubios R UW B IY OW Z
+rubis R UW B IH S
+ruble R UW B AH L
+ruble's R UW B AH L Z
+rubles R UW B AH L Z
+rubley R AH B L IY
+rubloff R AH B L AO F
+rubottom R AH B AH T AA M
+rubout R AH B AW T
+rubric R UW B R IH K
+rubright R AH B R AY T
+rubs R AH B Z
+ruby R UW B IY
+ruby's R UW B IY Z
+rucci R UW CH IY
+ruch R AH CH
+ruchlamer R UW K L AH M ER
+ruchti R UW K T IY
+rucinski R AH CH IH N S K IY
+ruck R AH K
+ruckel R AH K AH L
+ruckelshaus R AH K AH L Z HH AW S
+rucker R AH K ER
+ruckert R AH K ER T
+rucki R AH K IY
+ruckle R AH K AH L
+ruckman R AH K M AH N
+rucks R AH K S
+ruckus R AH K AH S
+rud R AH D
+ruda R UW D AH
+rudani R UW D AA N IY
+rudasill R AH D AH S IH L
+rudd R AH D
+ruddell R AH D AH L
+rudden R AH D AH N
+rudder R AH D ER
+rudderless R AH D ER L AH S
+ruddick R AH D IH K
+ruddle R AH D AH L
+ruddock R AH D AH K
+ruddy R AH D IY
+rude R UW D
+rudeen R AH D IY N
+rudel R UW D AH L
+rudell R AH D AH L
+rudelle R AH D EH L
+rudely R UW D L IY
+ruden R UW D AH N
+rudeness R UW D N AH S
+rudenstein R UW D IH N S T IY N
+rudenstein(2) R UW D IH N S T AY N
+rudenstine R UW D AH N Z T AY N
+ruder R UW D ER
+ruder's R UW D ER Z
+ruderman R UW D ER M AH N
+rudesill R AH D IH S AH L
+rudest R UW D AH S T
+rudge R AH JH
+rudi R UW D IY
+rudi's R UW D IY Z
+rudich R AH D IH K
+rudich(2) R UW D IH K
+rudicker R AH D IH K ER
+rudie R UW D IY
+rudiger R AH D IH G ER
+rudiment R UW D IH M AH N T
+rudimentary R UW D AH M EH N T ER IY
+rudiments R UW D IH M AH N T S
+rudin R UW D IH N
+ruding R UW D IH NG
+rudis R UW D IY Z
+rudisill R AH D IH S IH L
+rudkin R AH D K IH N
+rudloff R AH D L AO F
+rudman R AH D M AH N
+rudman's R AH D M AH N Z
+rudner R AH D N ER
+rudnet R AH D N EH T
+rudnick R AH D N IH K
+rudnicki R AH D N IH K IY
+rudnicky R AH D N IH K IY
+rudnik R AH D N IH K
+rudolf R UW D AA L F
+rudolf(2) R UW D AA F
+rudolph R UW D AO L F
+rudolph(2) R UW D AO F
+rudow R UW D OW
+rudy R UW D IY
+rudy's R UW D IY Z
+rudyard R AH D Y ER D
+rudzinski R AH JH IH N S K IY
+rue R UW
+rueb R UW B
+ruebel R UW B AH L
+rueckert R UW K ER T
+rueda R UW EH D AH
+ruediger R UW D IH G ER
+ruedlinger R UW D L IH NG ER
+ruedy R UW D IY
+ruef R UW F
+rueff R UW F
+rueful R UW F AH L
+ruefully R UW F AH L IY
+rueger R UH G ER
+ruegg R UW G
+ruegsegger R UH G S IH G ER
+ruehl R UH L
+ruehle R UW HH AH L
+ruel R UW L
+ruelas R UW L AH Z
+ruella R UW EH L AH
+ruelle R UW EH L
+ruesch R UW SH
+ruess R UW S
+ruest R UW S T
+rueter R UW T ER
+rueth R UW TH
+ruether R UW TH ER
+ruetz R UW T S
+ruf R AH F
+rufe R UW F
+rufenacht R UW F AH N AA K T
+rufener R AH F IY N ER
+rufer R UW F ER
+ruff R AH F
+ruffalo R UW F AA L OW
+ruffcorn R AH F K ER N
+ruffer R AH F ER
+ruffin R AH F IH N
+ruffing R AH F IH NG
+ruffini R UW F IY N IY
+ruffino R UW F IY N OW
+ruffle R AH F AH L
+ruffled R AH F AH L D
+ruffles R AH F AH L Z
+ruffling R AH F AH L IH NG
+ruffling(2) R AH F L IH NG
+ruffner R AH F N ER
+ruffo R AH F OW
+ruffolo R UW F OW L OW
+rufford R AH F ER D
+rufina R UW F IY N AH
+rufo R UW F OW
+ruford R UW F ER D
+rufow R UW F OW
+rufty R AH F T IY
+rufus R UW F AH S
+rug R AH G
+rugby R AH G B IY
+ruge R UW JH
+rugen R AH G AH N
+ruger R UW G ER
+rugeroni R UW JH EH R OW N IY
+rugg R AH G
+rugged R AH G AH D
+ruggedly R AH G AH D L IY
+ruggeri R UW JH EH R IY
+ruggerio R UW JH EH R IY OW
+ruggieri R UW JH IH R IY
+ruggiero R UW JH IH R OW
+ruggirello R UW JH IH R EH L OW
+ruggles R AH G AH L Z
+rugh R AH
+rugs R AH G Z
+ruh R AH
+ruhe R UW HH
+ruhl R AH L
+ruhland R AH L AH N D
+ruhle R UW AH L
+ruhlman R UW L M AH N
+ruhnau R UW N AW
+ruhnke R AH NG K
+ruhollah R UW HH AA L AH
+ruhr R UH R
+ruhrgas R UH R G AH S
+ruhul R UW HH UW L
+ruin R UW AH N
+ruin(2) R UW IH N
+ruined R UW AH N D
+ruined(2) R UW IH N D
+ruining R UW IH N IH NG
+ruinous R UW AH N AH S
+ruins R UW AH N Z
+ruins(2) R UW IH N Z
+ruis R UW IH Z
+ruiter R UW T ER
+ruiz R UW W IY Z
+rujith R UW JH IY TH
+rukavina R AH K AH V AY N AH
+rukeyser R UW K EY Z ER
+rula R UW L AH
+ruland R UW L AH N D
+rule R UW L
+rule's R UW L Z
+rulebook R UW L B UH K
+ruled R UW L D
+rulemaking R UW L M EY K IH NG
+ruler R UW L ER
+rulers R UW L ER Z
+rules R UW L Z
+ruley R UW L IY
+ruling R UW L IH NG
+ruling's R UW L IH NG Z
+rulings R UW L IH NG Z
+rulison R AH L IH S AH N
+rulli R UW L IY
+rullman R AH L M AH N
+rullo R UW L OW
+rulon R UW L AH N
+rum R AH M
+rumack R UW M AE K
+rumage R AH M IH JH
+ruman R UW M AH N
+rumania R UW M EY N IY AH
+rumanian R UW M EY N IY AH N
+rumanian(2) R UW M EY N Y AH N
+rumbaugh R AH M B AO
+rumberger R AH M B ER G ER
+rumble R AH M B AH L
+rumbled R AH M B AH L D
+rumbles R AH M B AH L Z
+rumbley R AH M B L IY
+rumbling R AH M B AH L IH NG
+rumbling's R AH M B AH L IH NG Z
+rumbling's(2) R AH M B L IH NG Z
+rumbling(2) R AH M B L IH NG
+rumblings R AH M B AH L IH NG Z
+rumblings(2) R AH M B L IH NG Z
+rumbold R AH M B OW L D
+rumen R UW M AH N
+rumer R UW M ER
+rumery R AH M ER IY
+rumfelt R AH M F EH L T
+rumford R AH M F ER D
+rumina R UW M IH N AH
+ruminant R UW M AH N AH N T
+ruminate R UW M IH N EY T
+ruminated R UW M IH N EY T IH D
+rumination R UW M IH N EY SH AH N
+ruminations R UW M IH N EY SH AH N Z
+ruminski R AH M IH N S K IY
+rumler R AH M L ER
+rumley R AH M L IY
+rummage R AH M IH JH
+rummaged R AH M IH JH D
+rummages R AH M IH JH AH Z
+rummaging R AH M IH JH IH NG
+rummel R AH M AH L
+rummell R AH M AH L
+rummy R AH M IY
+rumney R AH M N IY
+rumor R UW M ER
+rumore R UW M AO R
+rumored R UW M ER D
+rumors R UW M ER Z
+rumour R UW M ER
+rumours R UW M ER Z
+rump R AH M P
+rumpel R AH M P AH L
+rumpf R AH M P F
+rumph R AH M F
+rumple R AH M P AH L
+rumpled R AH M P AH L D
+rumrill R AH M R IH L
+rums R AH M Z
+rumsey R AH M Z IY
+rumsfeld R AH M Z F EH L D
+rumson R AH M S AH N
+run R AH N
+run's R AH N Z
+run-down R AH N D AW N
+run-on R AH N AA N
+run-ons R AH N AA N Z
+runabout R AH N AH B AW T
+runaround R AH N AH R AW N D
+runaround(2) R AH N AH R AW N
+runaway R AH N AH W EY
+runaways R AH N AH W EY Z
+runcie R AH N S IY
+runck R AH NG K
+runckel R AH NG K AH L
+runco R AH NG K OW
+rund R AH N D
+rundall R AH N D AH L
+runde R AH N D
+rundell R AH N D AH L
+rundle R AH N D AH L
+rundown R AH N D AW N
+rundquist R AH N D K W IH S T
+rune R UW N
+runes R UW N Z
+rung R AH NG
+runge R AH N JH
+rungs R AH NG Z
+runion R UW N Y AH N
+runions R UW N Y AH N Z
+runk R AH NG K
+runkel R AH NG K AH L
+runkle R AH NG K AH L
+runkles R AH NG K AH L Z
+runko R AH N K OW
+runnells R AH N AH L Z
+runnels R AH N AH L Z
+runner R AH N ER
+runner's R AH N ER Z
+runners R AH N ER Z
+runnin' R AH N IH N
+running R AH N IH NG
+runnings R AH N IH NG Z
+runnion R AH N Y AH N
+runny R AH N IY
+runoff R AH N AO F
+runquist R AH N K W IH S T
+runs R AH N Z
+runte R AH N T
+runup R AH N AH P
+runups R AH N AH P S
+runway R AH N W EY
+runways R AH N W EY Z
+runyan R AH N Y AH N
+runyon R AH N Y AH N
+runzheimer R AH N Z HH AY M ER
+ruocco R UW OW K OW
+ruoff R UW AO F
+ruotolo R UW OW T OW L OW
+rupard R UW P ER D
+rupaul R UW P AA L
+rupe R UW P
+rupee R UW P IY
+rupees R UW P IY Z
+rupert R UW P ER T
+ruperta R UW P EH R T AH
+ruphy R UW F IY
+rupiah R UW P AY AH
+ruple R UW P AH L
+rupley R AH P L IY
+rupnow R AH P N OW
+ruposi R UW P OW S IY
+rupp R AH P
+ruppe R AH P
+ruppel R AH P AH L
+ruppenthal R AH P IH N TH AH L
+ruppert R AH P ER T
+rupprecht R UW P R EH K T
+ruprecht R AH P R IH K T
+rupture R AH P CH ER
+ruptured R AH P CH ER D
+ruptures R AH P CH ER Z
+rupturing R AH P CH ER IH NG
+rural R UH R AH L
+rurik R UH R IH K
+ruritania R UH R AH T EY N IY AH
+rus R AH S
+rusalka R UW S AE L K AH
+rusch R AH SH
+rusche R AH SH
+ruscitti R UW S CH IY T IY
+rusconi R UW S K OW N IY
+ruse R UW Z
+rused R UW Z D
+ruseler R UW S IH L ER
+ruses R UW Z IH Z
+rush R AH SH
+rush's R AH SH IH Z
+rushdie R AH SH D IY
+rushdie's R AH SH D IY Z
+rushed R AH SH T
+rusher R AH SH ER
+rushes R AH SH AH Z
+rushes(2) R AH SH IH Z
+rushford R AH SH F ER D
+rushin R AH SH IH N
+rushing R AH SH IH NG
+rushlow R AH SH L OW
+rushmore R AH SH M AO R
+rushton R AH SH T AH N
+rusin R UW S IH N
+rusinko R UW S IH NG K OW
+rusk R AH S K
+rusk's R AH S K S
+ruskin R AH S K IH N
+ruslan R AH S L AH N
+rusnak R AH S N AH K
+rusnock R AH S N AH K
+russ R AH S
+russa R UW S AH
+russak R AH S AH K
+russe R AH S
+russel R AH S AH L
+russel's R AH S AH L Z
+russell R AH S AH L
+russell's R AH S AH L Z
+russellville R AH S AH L V IH L
+russert R AH S ER T
+russet R AH S IH T
+russets R AH S IH T S
+russett R AH S IH T
+russey R AH S IY
+russi R UW S IY
+russia R AH SH AH
+russia's R AH SH AH Z
+russian R AH SH AH N
+russian's R AH SH AH N Z
+russians R AH SH AH N Z
+russians' R AH SH AH N Z
+russification R AH S AH F AH K EY SH AH N
+russification(2) R UW S AH F AH K EY SH AH N
+russified R AH S AH F AY D
+russin R AH S IH N
+russler R AH S L ER
+russman R AH S M AH N
+russo R UW S OW
+russolillo R UW S OW L IH L OW
+russolillo(2) R UW S OW L IY OW
+russom R AH S AH M
+russomanno R AH S AH M IH N OW
+russow R AH S OW
+russum R AH S AH M
+rust R AH S T
+rust's R AH S T S
+rustad R AH S T AH D
+rusted R AH S T AH D
+rusted(2) R AH S T IH D
+rustic R AH S T IH K
+rustier R AH S T IY ER
+rustiest R AH S T IY AH S T
+rustigan R AH S T IH G AH N
+rustin R AH S T IH N
+rusting R AH S T IH NG
+rustle R AH S AH L
+rustler R AH S L ER
+rustlers R AH S AH L ER Z
+rustlers(2) R AH S L ER Z
+rustling R AH S L IH NG
+ruston R AH S T AH N
+rustproof R AH S T P R UW F
+rustproofing R AH S T P R UW F IH NG
+rusts R AH S T S
+rusts(2) R AH S S
+rusts(3) R AH S
+rusty R AH S T IY
+rusty's R AH S T IY Z
+rustys R AH S T IY Z
+ruszkowski R AH SH K AO F S K IY
+rut R AH T
+ruta R UW T AH
+rutabaga R UW T AH B EY G AH
+rutabagas R UW T AH B EY G AH Z
+rutan R UW T AH N
+rutan's R UW T AH N Z
+ruter R UW T ER
+rutgard R AH T G AA R D
+rutger R AH T G ER
+rutger's R AH T G ER Z
+rutgers R AH T G ER Z
+ruth R UW TH
+ruth's R UW TH S
+ruthann R UW TH AE N
+ruthenberg R AH TH AH N B ER G
+ruther R UW TH ER
+rutherford R AH TH ER F ER D
+ruthie R UW TH IY
+ruthless R UW TH L AH S
+ruthlessly R UW TH L AH S L IY
+ruthlessness R UW TH L AH S N AH S
+ruthven R AH TH V AH N
+rutigliano R UW T IY G L IY AA N OW
+rutile R UW T IY L
+rutkoski R AH T K AW S K IY
+rutkowski R AH T K AO F S K IY
+rutland R AH T L AH N D
+rutledge R AH T L IH JH
+rutley R AH T L IY
+rutman R AH T M AH N
+ruts R AH T S
+rutskoi R UW T S K OY
+rutskoi's R UW T S K OY Z
+rutstein R AH T S T AY N
+rutstein(2) R AH T S T IY N
+rutt R AH T
+ruttan R AH T AH N
+rutted R AH T IH D
+rutten R AH T AH N
+ruttenberg R AH T AH N B ER G
+rutter R AH T ER
+ruttle R AH T AH L
+ruttles R AH T AH L Z
+rutts R AH T S
+rutz R AH T S
+rutzen R AH T Z AH N
+ruud R UW D
+ruvalcaba R UW V AA L K AA B AH
+ruvolo R UW V OW L OW
+ruwe R UW W
+rux R AH K S
+ruxpin R AH K S P IH N
+ruxpin's R AH K S P IH N Z
+ruybal R AY B AH L
+ruyle R AY L
+ruzek R UW Z EH K
+ruzich R AH Z IH HH
+ruzicka R UW Z IH K AH
+ruzzo R UW Z OW
+rwanda R AH W AA N D AH
+rwanda's R AH W AA N D AH Z
+rwanda's(2) R UW AA N D AH Z
+rwanda(2) R UW AA N D AH
+rwandan R AH W AA N D AH N
+rwandan's R AH W AA N D AH N Z
+rwandan's(2) R UW AA N D AH N Z
+rwandan(2) R UW AA N D AH N
+rwandans R AH W AA N D AH N Z
+rwandans(2) R UW AA N D AH N Z
+rwandese R AH W AA D IY Z
+rwandese(2) R UW AA D IY Z
+ryal R IY AA L
+ryall R IY AA L
+ryals R IY AA L Z
+ryan R AY AH N
+ryan's R AY AH N Z
+ryanair R AY AH N EH R
+ryanodine R AY AE N AH D IY N
+ryans R AY AH N Z
+ryava R AY AA V AH
+ryave R AY AH V
+ryba R IH B AH
+ryback R AY B AE K
+rybacki R IH B AA T S K IY
+rybacki(2) R IH B AA K IY
+rybak R IH B AH K
+rybakov R AY B AH K AA V
+rybakov's R AY B AH K AA V Z
+rybarczyk R IH B ER CH IH K
+ryberg R AY B ER G
+rybicki R IH B IH T S K IY
+rybinski R IH B IH N S K IY
+rybka R IH B K AH
+rybolt R IH B OW L T
+ryburn R IH B ER N
+rychlik R IH CH L IH K
+rychlik(2) R IH K L IH K
+ryckman R IH K M AH N
+rycroft R IH K R AH F T
+ryczek R IH CH EH K
+rydberg R IH D B ER G
+rydell R IH D AH L
+ryden R AY D AH N
+ryder R AY D ER
+ryder's R AY D ER Z
+rydman R IH D M AH N
+rydzewski R IH JH EH F S K IY
+rye R AY
+ryen R AY AH N
+ryer R AY ER
+ryerson R AY R S AH N
+rygiel R IH G IY L
+ryka R AY K AH
+ryker R AY K ER
+rykiel R IY K Y EH L
+rykiel(2) R IH K Y EH L
+rykoff R AY K AO F
+rykowski R IH K AO F S K IY
+rylan R AY L AH N
+ryland R IH L AH N D
+rylander R IH L AH N D ER
+ryle R AY L
+rylee R IH L IY
+ryles R AY L Z
+ryley R AY L IY
+ryman R AY M AH N
+rymer R AY M ER
+rynders R IH N D ER Z
+rynearson R IH N ER S AH N
+ryner R AY N ER
+rynes R AY N Z
+ryno R IH N OW
+ryobi R AY OW B IY
+ryohei R AY OW HH EY
+ryon R AY AH N
+ryrie R AY R IY
+rys R IH S
+rysavy R IH S AA V IY
+ryser R AY S ER
+ryskamp R AY S K AE M P
+ryther R IH DH ER
+ryton R IH T AH N
+ryutaro R Y UW T AA R OW
+ryuzo R AY UW Z OW
+ryzhkov R AY Z K AA V
+rzasa ER Z AA S AH
+rzepka ER Z EH P K AH
+s EH S
+s's EH S IH Z
+s. EH S
+s.'s EH S IH Z
+sa S AA
+saab S AA B
+saab's S AA B Z
+saad S AA D
+saal S AA L
+saam S AA M
+saamstaan S AA M S T AA N
+saar S AA R
+saari S AA R IY
+saarinen S AA R IH N AH N
+saarinen(2) S AH R IY N AH N
+saatchi S AA CH IY
+saatchi's S AA CH IY Z
+saathoff S AA T HH AO F
+saavedra S AA V EY D R AH
+sab's S AE B Z
+saba S AA B AH
+sabah S AA B AH
+sabala S AA B AA L AH
+sabalan S AE B AH L AH N
+saban S EY B AH N
+sabas S AA B AH Z
+sabat S AA B AA T
+sabatine S AA B AA T IY N IY
+sabatini S AE B AH T IY N IY
+sabatino S AA B AA T IY N OW
+sabatista S AA B AH T IY S T AH
+sabatista's S AA B AH T IY S T AH Z
+sabatistas S AA B AH T IY S T AH Z
+sabatistas' S AA B AH T IY S T AH Z
+sabatka S AA B AA T K AH
+sabato S AA B AA T OW
+sabaudia S AH B AO D IY AH
+sabb S AE B
+sabbagh S AE B AH G
+sabbath S AE B AH TH
+sabbaths S AE B AH TH S
+sabbatical S AH B AE T IH K AH L
+sabbaticals S AH B AE T IH K AH L Z
+sabedra S AH B EH D R AH
+sabel S AA B EH L
+sabella S AH B EH L AH
+sabena S AH B IY N AH
+saber S EY B ER
+saberbein S EY B ER B AY N
+saberbein's S EY B ER B AY N Z
+sabers S EY B ER Z
+sabertech S EY B ER T EH K
+sabey S EY B IY
+sabia S AA B IY AH
+sabin S EY B IH N
+sabina S AH B IY N AH
+sabine S AH B IY N
+sabine's S AH B IY N Z
+sabino S AA B IY N OW
+sabins S EY B IH N Z
+sabir S EY B ER
+sabir(2) S AH B IH R
+sablan S AE B L AH N
+sable S EY B AH L
+sables S EY B AH L Z
+sabo S AA B OW
+sabol S AA B AO L
+sabol's S AA B AO L Z
+sabortech S EY B ER T EH K
+sabotage S AE B AH T AA ZH
+sabotaged S AE B AH T AA ZH D
+sabotaging S AE B AH T AA ZH IH NG
+saboteur S AE B AH T ER
+saboteurs S AE B AH T ER Z
+saboteurs(2) S AE B IH T AO R Z
+sabourin S AE B UH R AE N
+sabra S AA B R AH
+sabre S EY B ER
+sabres S EY B ER Z
+sabretech S EY B ER T EH K
+sabrina S AH B R IY N AH
+sabry S AA B R IY
+sabta S AE B T AH
+sabunuma S AE B UW N AH M AH
+sac S AE K
+sacca S AE K AH
+saccharin S AE K ER AH N
+saccharine S AE K ER AY N
+sacco S AE K OW
+sacco's S AE K OW Z
+saccoccio S AA K OW CH IY OW
+saccomanno S AE K AH M AE N OW
+saccone S AA K OW N IY
+saccule S AE K Y UW L
+sacha S AE CH AH
+sachdev S AE CH D EH V
+sacher S AE K ER
+sacher(2) S AA SH ER
+sachet S AE SH EY
+sachi S AE CH IY
+sachin S AE CH AH N
+sachs S AE K S
+sachs' S AE K S
+sachs's S AE K S IH Z
+sachs(2) S AA K S
+sachse S AE CH S
+sacilor S AE S AH L ER
+sacirbey S AA K ER B IY
+sacirbey's S AA K ER B IY Z
+sack S AE K
+sacked S AE K T
+sackett S AE K IH T
+sacking S AE K IH NG
+sackler S AE K L ER
+sackman S AE K M AH N
+sackmann S AE K M AH N
+sackrider S AE K R AY D ER
+sacks S AE K S
+sacksteder S AE K S T EH D ER
+sackville S AE K V IH L
+saco S EY K OW
+sacra S AE K R AH
+sacrament S AE K R AH M AH N T
+sacramental S AE K R AH M AH N T AH L
+sacramento S AE K R AH M EH N T OW
+sacramento's S AE K R AH M EH N T OW Z
+sacraments S AE K R AH M AH N T S
+sacred S EY K R AH D
+sacred(2) S EY K R IH D
+sacredness S EY K R IH D N IH S
+sacrifice S AE K R AH F AY S
+sacrificed S AE K R AH F AY S T
+sacrifices S AE K R AH F AY S IH Z
+sacrificial S AE K R AH F IH SH AH L
+sacrificing S AE K R AH F AY S IH NG
+sacrilege S AE K R AH L AH JH
+sacrilegious S AE K R AH L EH JH IH S
+sacrosanct S AE K R OW S AE NG K T
+sacs S AE K S
+sad S AE D
+sada S AA D AH
+sadaka S AH D AA K AH
+sadako S AA D AA K OW
+sadao S AH D AW
+sadat S AA D AA T
+sadat's S AA D AA T S
+sadat's(2) S AH D AE T S
+sadat(2) S AH D AE T
+saddam S AA D AH M
+saddam's S AA D AH M Z
+saddam's(2) S AH D AA M Z
+saddam(2) S AH D AA M
+sadden S AE D AH N
+saddened S AE D AH N D
+saddening S AE D AH N IH NG
+saddening(2) S AE D N IH NG
+saddens S AE D AH N Z
+sadder S AE D ER
+saddest S AE D AH S T
+saddle S AE D AH L
+saddlebag S AE D AH L B AE G
+saddlebags S AE D AH L B AE G Z
+saddled S AE D AH L D
+saddler S AE D AH L ER
+saddler(2) S AE D L ER
+saddles S AE D AH L Z
+saddling S AE D AH L IH NG
+saddling(2) S AE D L IH NG
+saddoris S AE D ER IH S
+sadeghi S AA D EH G IY
+sadeh S AA D EH
+sadeh-koniecpol S AA D EH K OW N IY EH K P AO L
+sadek S AE D IH K
+sadella S AH D EH L AH
+sader S EY D ER
+sadie S AE D IY
+sadie's S EY D IY Z
+sadira S AA D IH R AH
+sadism S EY D IH Z AH M
+sadist S EY D AH S T
+sadistic S AH D IH S T IH K
+sadler S AE D L ER
+sadlier S AE D L IY ER
+sadlon S AE D L AH N
+sadlowski S AE D L AW S K IY
+sadly S AE D L IY
+sadness S AE D N AH S
+sado S EY D OW
+sadoff S AE D AO F
+sadowski S AH D AO F S K IY
+sadowsky S AH D AW S K IY
+sadye S AE D AY
+saechao S IY CH AW
+saeed S AA IY D
+saeger S EH G ER
+saehan S EY AH N
+saelens S EH L AH N Z
+saemaul S EY M AO L
+saenger S EH N JH ER
+saens's S EY N Z IH Z
+saenz S IY N Z
+saez S IY Z
+safari S AH F AA R IY
+safarik S AE F ER IH K
+safaris S AH F AA R IY Z
+safdie S AE F D IY
+safe S EY F
+safecard S EY F K AA R D
+safecard's S EY F K AA R D Z
+safeco S EY F K OW
+safeguard S EY F G AA R D
+safeguarded S EY F G AA R D IH D
+safeguarding S EY F G AA R D IH NG
+safeguards S EY F G AA R D Z
+safehouse S EY F HH AW S
+safekeeping S EY F K IY P IH NG
+safely S EY F L IY
+safer S EY F ER
+safes S EY F S
+safest S EY F AH S T
+safeties S EY F T IY Z
+safety S EY F T IY
+safety's S EY F T IY Z
+safeway S EY F W EY
+safeway's S EY F W EY Z
+saffell S AE F AH L
+saffer S AE F ER
+safferstein S AE F ER S T IY N
+safferstein(2) S AE F ER S T AY N
+saffir S AH F IY R
+saffle S AE F AH L
+safflower S AE F L AW ER
+saffold S AE F OW L D
+safford S AE F ER D
+saffran S AE F R AH N
+saffron S AE F R AH N
+safian S EY F IY AH N
+safier S AH F IH R
+safing S EY F IH NG
+safir S AE F ER
+safire S AH F AY R
+safire's S AH F AY R Z
+safko S AA F K OW
+safley S AE F L IY
+safra S AE F R AH
+safra's S AE F R AH Z
+safran S AE F R AH N
+safranek S AE F R AH N IH K
+safrit S AE F R IH T
+sag S AE G
+saga S AA G AH
+sagan S EY G AH N
+sagansky S AH G AE N S K IY
+sagar S AA G AA R
+sagas S AA G AH Z
+sage S EY JH
+sage's S EY JH AH Z
+sagebrush S EY JH B R AH SH
+sagen S AE G AH N
+sager S EY G ER
+sagers S EY G ER Z
+sages S EY JH IH Z
+sagged S AE G D
+saggese S AE G IY Z
+sagging S AE G IH NG
+saginaw S AE G IH N AO
+sagittal S AE JH AH T AH L
+sago S EY G OW
+sagona S AA G OW N AH
+sagraves S AA G R AA V EH S
+sags S AE G Z
+saguaro S AH G W AO R OW
+saguenay S AE G AH N EY
+saha S AA HH AH
+sahagian S AH HH IY JH IY AH N
+sahagun S AE HH AH G AH N
+sahara S AH HH EH R AH
+saharan S AE HH ER AH N
+sahgal S AA G AH L
+sahl S AA L
+sahlen S AA L AH N
+sahli S AA L IY
+sahlin S AA L IH N
+sahlman S AA L M AH N
+sahm S AE M
+sahr S AE R
+sai S AY
+sai(2) EH S EY AY
+saia S AA Y AH
+said S EH D
+saidan S EY D AH N
+saidiner S EY D IH N ER
+saif S AA IY F
+saif(2) S AY F
+saigon S AY G AA N
+saiki S EY K IY
+sail S EY L
+sailboat S EY L B OW T
+sailboats S EY L B OW T S
+sailed S EY L D
+sailer S EY L ER
+sailfish S EY L F IH SH
+sailing S EY L IH NG
+sailor S EY L ER
+sailor's S EY L ER Z
+sailors S EY L ER Z
+sailors' S EY L ER Z
+sails S EY L Z
+sain S EY N
+sainato S AH N AA T OW
+saindon S EY N D AH N
+saine S EY N
+sainsbury S EY N S B EH R IY
+saint S EY N T
+saint's S EY N T S
+saint-saens S EY N T S AA N Z
+sainted S EY N T IH D
+sainthood S EY N T HH UH D
+saintly S EY N T L IY
+saints S EY N T S
+saints' S EY N T S
+sainz S EY N Z
+saipan S EY P AH N
+saipan's S EY P AH N Z
+sais S EY Z
+saison S EY S AA N
+saitama S AA IH T AA M AH
+saito S EY T OW
+saitta S EY T AH
+saiz S EY Z
+sajak S AE JH AE K
+sajdak S AY D AH K
+sak S AE K
+sakaguchi S AA K AA G UW CH IY
+sakai S AA K AA IY
+sakal S EY K AH L
+sakamoto S AA K AA M OW T OW
+sakata S AA K AA T AH
+sakau S AA K AA UW
+sake S EY K
+sake's S EY K S
+saker S EY K ER
+sakes S EY K S
+sakhalin S AE K HH AH L IH N
+sakharov S AA K ER AA V
+saki S AA K IY
+sakigake S AA K IY G AA K IY
+sakina S AH K IY N AH
+sako S AA K OW
+sakowitz S AE K AH W IH T S
+sakowski S AH K AO F S K IY
+saks S AE K S
+saks's S AE K S IH Z
+saksa S AE K S AH
+saksida S AA K S IY D AH
+sakuma S AA K UW M AH
+sakura S AE K UH R AH
+sakurai S AA K UH R AA IY
+sal S AE L
+sal's S AE L Z
+sala S AA L AH
+salaam S AH L AA M
+salable S EY L AH B AH L
+salables S EY L AH B AH L Z
+salacious S AH L EY SH AH S
+salad S AE L AH D
+salada S AH L AA D AH
+saladin S AE L AH D IH N
+saladino S AA L AA D IY N OW
+salads S AE L AH D Z
+salafia S AH L EY F IY AH
+salah S AE L AH
+salak S AE L AH K
+salam S AA L AA M
+salama S AA L AA M AH
+salamanca S AE L AH M AE NG K AH
+salamander S AE L AH M AE N D ER
+salamanders S AE L AH M AE N D ER Z
+salameh S AA L AA M EH
+salameh's S AA L AA M EH Z
+salami S AH L AA M IY
+salamis S AH L AA M IY Z
+salamon S AE L AH M AH N
+salamone S AE L AH M OW N
+salant S AE L AH N T
+salaried S AE L ER IY D
+salaries S AE L ER IY Z
+salary S AE L ER IY
+salarymen S AE L ER IY M AH N
+salas S AA L AA Z
+salata S AA L AA T AH
+salatino S AA L AA T IY N OW
+salawah S AE L AH W AA
+salay S AE L EY
+salaz S AA L AA Z
+salazar S AE L AH Z AA R
+salberg S AE L B ER G
+salce S EY L S
+salcedo S AA L CH EY D OW
+salcido S AA L CH IY D OW
+saldana S AA L D AE N AH
+saldivar S AA L D IY V AA R
+saldovar S AA L D AH V AA R
+sale S EY L
+sale's S EY L Z
+saleable S EY L AH B AH L
+saleeby S AE L IY B IY
+saleem S AE L IY M
+saleh S AA L EH HH
+salek S AA L EH K
+salem S EY L AH M
+salem's S EY L AH M Z
+salema S AH L IY M AH
+salemi S AA L EH M IY
+salemme S AE L IH M
+salerno S AH L EH R N OW
+sales S EY L Z
+sales' S EY L Z
+salesman S EY L Z M AH N
+salesman's S EY L Z M AH N Z
+salesmanship S EY L Z M AH N SH IH P
+salesmen S EY L Z M IH N
+salesmen's S EY L Z M IH N Z
+salespeople S EY L Z P IY P AH L
+salesperson S EY L Z P ER S AH N
+saleswoman S EY L Z W UH M AH N
+saleswomen S EY L Z W IH M AH N
+salgado S AA L G AA D OW
+salguero S AA L G EH R OW
+salhany S AE L HH EY N IY
+saliba S AA L IY B AH
+salick S AE L IH K
+salient S EY L IY AH N T
+salient(2) S EY L Y AH N T
+salif S AH L IY F
+saligman S AE L IH G M AH N
+salim S AE L IH M
+salim(2) S AA L IY M
+salin S AA L IY N
+salina S AH L IY N AH
+salinas S AH L IY N AH S
+salinas' S AH L IY N AH S
+salinas'(2) S AH L IY N AH Z
+salinas's S AH L IY N AH S IH Z
+salinas(2) S AH L IY N AH Z
+saline S AH L IY N
+saling S EY L IH NG
+salinger S EY L IH NG ER
+salinger's S EY L IH NG ER Z
+salinger's(2) S AE L IH N JH ER Z
+salinger(2) S AE L IH N JH ER
+salingers S AE L IH NG ER Z
+salingers(2) S AE L IH N JH ER Z
+salinity S AH L IH N AH T IY
+salis S AA L IH S
+salisbury S AE L Z B ER IY
+saliva S AH L AY V AH
+salivate S AE L AH V EY T
+salivated S AE L AH V EY T AH D
+salivating S AE L AH V EY T IH NG
+salizzoni S AE L IH Z OW N IY
+salk S AO K
+salk's S AO K S
+salkeld S AE L K IH L D
+salkin S AE L K IH N
+sall S AO L
+sallade S AE L EY D
+sallas S AA L AA Z
+salle S EY L
+sallee S AE L IY
+salleh S AA L EH
+saller S AO L ER
+salles S AA L EH S
+salley S AE L IY
+sallie S AE L IY
+sallies S AE L IY Z
+salling S AO L IH NG
+sallis S AE L IH S
+salls S AO L Z
+sally S AE L IY
+sally's S AE L IY Z
+salm S AA M
+salman S AE M AH N
+salmans S AE M AH N Z
+salmela S AA L M EY L AH
+salmen S AE L M EH N
+salmeron S AA L M EH R AO N
+salmi S AA L M IY
+salminen S AE L M IH N AH N
+salmon S AE M AH N
+salmond S AE L M AH N D
+salmonella S AE L M AH N EH L AH
+salmons S AE M AH N Z
+salmonson S AA L M OW N S AH N
+salo S AA L OW
+salois S AH L W AA
+saloma S AA L OW M AH
+salome S AH L OW M IY
+salomi S AA L OW M IY
+salomon S AE L AH M AH N
+salomon's S AE L AH M AH N Z
+salomone S AA L OW M OW N IY
+salon S AH L AA N
+salone S AH L OW N
+salonga S AH L AO NG G AH
+salons S AH L AA N Z
+saloojee S AH L UW JH IY
+saloon S AH L UW N
+saloons S AH L UW N Z
+salopek S AE L AH P IH K
+salow S AE L OW
+salpetriere S AE L P EH T R IY EH R
+salsa S AO L S AH
+salsberry S AO L S B EH R IY
+salsbery S AE L S B ER IY
+salsbury S AE L Z B ER IY
+salser S EY L S ER
+salsgiver S AE L S G IH V ER
+salsman S AO L S M AH N
+salt S AO L T
+saltarelli S AO L T AA R EH L IY
+saltbox S AO L T B AA K S
+salted S AO L T AH D
+salted(2) S AO L T IH D
+salter S AO L T ER
+salter's S AO L T ER Z
+salters S AO L T ER Z
+saltier S AO L T IY ER
+salting S AO L T IH NG
+saltlike S AO L T L AY K
+saltmarsh S AO L T M AA R SH
+salton S AO L T AH N
+salts S AO L T S
+saltsman S AO L T S M AH N
+saltwater S AO L T W AA T ER
+salty S AO L T IY
+saltz S AE L T S
+saltzburg S AO L T S B ER G
+saltzman S AO L T S M AH N
+salus S AE L IH S
+salutary S AE L Y AH T EH R IY
+salutatorian S AH L UW T AH T AO R IY AH N
+salute S AH L UW T
+saluted S AH L UW T AH D
+salutes S AH L UW T S
+saluting S AH L UW T IH NG
+salva S AA L V AH
+salvador S AE L V AH D AO R
+salvador's S AE L V AH D AO R Z
+salvadoran S AE L V AH D AO R AH N
+salvadorans S AE L V AH D AO R AH N Z
+salvadore S AA L V AA D AO R EY
+salvage S AE L V AH JH
+salvage(2) S AE L V IH JH
+salvageable S AE L V IH JH AH B AH L
+salvaged S AE L V IH JH D
+salvager S AE L V IH JH ER
+salvagers S AE L V IH JH ER Z
+salvaggio S AA L V AA JH IY OW
+salvaging S AE L V IH JH IH NG
+salvas S AA L V AA Z
+salvati S AA L V AA T IY
+salvatierra S AA L V AA T IH R AH
+salvation S AE L V EY SH AH N
+salvato S AA L V AA T OW
+salvatore S AE L V AH T AO R IY
+salvatore(2) S AE L V AH D AO R
+salvatori S AA L V AA T AO R IY
+salve S AA V
+salves S AA V Z
+salvesen S AA L V IY Z AH N
+salveson S AA L V EY S AH N
+salvetti S AA L V EH T IY
+salvi S AA L V IY
+salvi's S AA L V IY Z
+salvia S AE L V IY AH
+salvigsen S AE L V IH G S AH N
+salvigsten S AE L V IH G S T AH N
+salvina S AA L V IY N AH
+salvino S AE L V IY N OW
+salvo S AE L V OW
+salvos S AE L V OW Z
+salvucci S AA L V UW CH IY
+salway S AE L W EY
+salwen S AE L W AH N
+salyard S AO L Y ER D
+salyards S AE L Y AA R D Z
+salyer S AA L IY ER
+salyers S AA L IY ER Z
+salz S AO L Z
+salzano S AA L Z AA N OW
+salzberg S AO L Z B ER G
+salzberg(2) S AO L T S B ER G
+salzburg S AO L Z B ER G
+salzburg(2) S AO L T S B ER G
+salzer S EY L Z ER
+salzgitter S AO L T S G IH T ER
+salzhauer S AO L T S HH AW R
+salzhauer(2) S AO L T S AW R
+salzman S AO L Z M AH N
+salzmann S AO L Z M AH N
+salzwedel S AE L Z W IH D AH L
+sam S AE M
+sam's S AE M Z
+sam-joo S AA M JH UW
+sama S AA M AH
+samaha S AE M AH HH AH
+samaniego S AA M AA N IY G OW
+samano S AA M AA N OW
+samantha S AH M AE N TH AH
+samar S AE M AA R
+samara S AE M ER AH
+samaranch S AE M ER AE N CH
+samaras S AE M ER AH Z
+samaria S EY M ER IY AH
+samarin S AA M AA R IY N
+samaritan S AH M EH R IH T AH N
+samaritans S AH M EH R IH T AH N Z
+samarkand S AE M AA R K AE N D
+samatar S AE M AH T AA R
+samba S AA M B AH
+samberg S AE M B ER G
+sambo S AE M B OW
+samborski S AH M B AO R S K IY
+sambrano S AA M B R AA N OW
+sambre S AE M B R AH
+sambuca S AE M B Y UW K AH
+samcor S AE M K AO R
+same S EY M
+same's S EY M Z
+samedan S AE M AH D AH N
+sameer S AA M IH R
+samek S AE M IH K
+samella S AH M EH L AH
+samelle S AH M EH L
+samelson S AE M IH L S AH N
+sameness S EY M N AH S
+samerol S AE M ER AO L
+sames S EY M Z
+samet S AE M IH T
+samford S AE M F ER D
+sami S AE M IY
+sami's S AE M IY Z
+samina S AH M IH N AH
+samir S AH M IH R
+samir(2) S AA M IH R
+sammarco S AA M AA R K OW
+sammartino S AA M AA R T IY N OW
+sammet S AE M IH T
+sammie S AE M IY
+sammis S AE M IH S
+sammon S AE M AH N
+sammons S AE M AH N Z
+samms S AE M Z
+sammut S AE M AH T
+sammy S AE M IY
+samoa S AH M OW AH
+samoan S AH M OW AH N
+samojlik S AH M OY L IH K
+samons S AA M OW N Z
+samora S AA M AO R AH
+samos S EY M AA S
+samoth S AE M AH TH
+samp S AE M P
+sampan S AE M P AE N
+sampans S AE M P AE N Z
+samper S AE M P ER
+samper's S AE M P ER Z
+sampere S AE M P IY R
+sampey S AE M P IY
+sample S AE M P AH L
+sample's S AE M P AH L Z
+sampled S AE M P AH L D
+sampler S AE M P L ER
+samplers S AE M P L ER Z
+samples S AE M P AH L Z
+sampley S AE M P L IY
+sampling S AE M P L IH NG
+samplings S AE M P L IH NG Z
+sampras S AE M P R AH S
+sampras' S AE M P R AH S
+sampras's S AE M P R AH S IH Z
+sampre S AE M P R IY
+sampre(2) S AE M P ER
+sampsel S AE M P S AH L
+sampsell S AE M P S AH L
+sampson S AE M P S AH N
+samra S AE M R AH
+sams S AE M Z
+samsara S AH M S AA R AH
+samsel S AE M S AH L
+samsom S AE M S AH M
+samson S AE M S AH N
+samsonite S AE M S AH N AY T
+samsung S AE M S AH NG
+samsung's S AE M S AH NG Z
+samudio S AA M UW D IY OW
+samuel S AE M Y UW L
+samuel's S AE M Y UW L Z
+samuela S AE M Y UW EH L AH
+samuelle S AE M Y UW EH L
+samuels S AE M Y UW AH L Z
+samuelsen S AE M UH L S AH N
+samuelson S AE M Y UW AH L S AH N
+samurai S AE M UH R AY
+samurai's S AE M ER AY Z
+samurai(2) S AE M ER AY
+samurais S AE M ER AY Z
+samurais(2) S AE M ER IH Z
+san S AE N
+san-andreas S AE N AA N D R EY AH S
+san-diego S AE N D IY EY G OW
+san-fran S AE N F R AE N
+san-francisco S AE N F R AE N S IH S K OW
+san-jose S AE N HH OW Z EY
+san-juan S AE N W AA N
+san-salvador S AE N S AE L V AH D AO R
+sana S AA N AH
+sanaa S AH N AA
+sanabria S AH N AE B R IY AH
+sanada S AA N AA D AH
+sanborn S AE N B AO R N
+sanches S AA N CH EH S
+sanchez S AE N CH EH Z
+sanchez's S AE N CH EH Z IH Z
+sancho S AA N K OW
+sancia S AA N CH AH
+sanctification S AE NG K T AH F AH K EY SH AH N
+sanctify S AE NG K T AH F AY
+sanctimonious S AE NG K T AH M OW N IY AH S
+sanctimony S AE NG K T IH M OW N IY
+sanction S AE NG K SH AH N
+sanction's S AE NG K SH AH N Z
+sanction's(2) S AE NG SH AH N Z
+sanction(2) S AE NG SH AH N
+sanctioned S AE NG K SH AH N D
+sanctioned(2) S AE NG SH AH N D
+sanctioning S AE NG K SH AH N IH NG
+sanctioning(2) S AE NG SH AH N IH NG
+sanctions S AE NG K SH AH N Z
+sanctions' S AE NG K SH AH N Z
+sanctions'(2) S AE NG SH AH N Z
+sanctions(2) S AE NG SH AH N Z
+sanctity S AE NG K T IH T IY
+sanctuaries S AE NG K CH UW EH R IY Z
+sanctuary S AE NG K CH UW EH R IY
+sanctum S AE NG K T AH M
+sand S AE N D
+sand's S AE N D Z
+sanda S AE N D AH
+sandage S AE N D IH JH
+sandahl S AE N D AA L
+sandal S AE N D AH L
+sandall S AE N D AA L
+sandalo S AE N D AE L OW
+sandals S AE N D AH L Z
+sandau S AE N D AW
+sandbag S AE N D B AE G
+sandbagged S AE N D B AE G D
+sandbagger S AE N D B AE G ER
+sandbaggers S AE N D B AE G ER Z
+sandbagging S AE N D B AE G IH NG
+sandbags S AE N D B AE G Z
+sandbar S AE N D B AA R
+sandberg S AE N D B ER G
+sandblast S AE N D B L AE S T
+sandblasted S AE N D B L AE S T IH D
+sandbox S AE N D B AA K S
+sandburg S AE N D B ER G
+sande S AE N D
+sanded S AE N D IH D
+sandeen S AE N D IY N
+sandefer S AE N D IY F ER
+sandefur S AE N D EH F ER
+sandel S AE N D EH L
+sandell S AE N D EH L
+sanden S AE N D AH N
+sander S AE N D ER
+sanderfer S AE N D ER F ER
+sanderford S AE N D ER F AO R D
+sanderlin S AE N D ER L IH N
+sanders S AE N D ER Z
+sanders's S AE N D ER Z IH Z
+sanderson S AE N D ER S AH N
+sandford S AE N D F ER D
+sandgren S AE N D G R EH N
+sandhill S AE N D HH IH L
+sandhog S AE N D HH AO G
+sandhogs S AE N D HH AO G Z
+sandhu S AE N D HH UW
+sandi S AE N D IY
+sandia S AE N D IY AH
+sandidge S AE N D IH JH
+sandie S AE N D IY
+sandifer S AE N D AY F ER
+sandiford S AE N D IH F ER D
+sandin S AE N D IH N
+sanding S AE N D IH NG
+sandinista S AE N D IH N IH S T AH
+sandinista(2) S AE N D IH N IY S T AH
+sandinistas S AE N D IH N IY S T AH Z
+sandinistas' S AE N D IH N IY S T AH Z
+sandino S AE N D IY N OW
+sandino's S AE N D IY N OW Z
+sandler S AE N D L ER
+sandlin S AE N D L IH N
+sandling S AE D L IH NG
+sandman S AE N D M AE N
+sandmann S AE N D M AH N
+sandmeyer S AE N D M AY ER
+sandner S AE N D N ER
+sandness S AE N D N AH S
+sando S AE N D OW
+sandom S AE N D AH M
+sandon S AE N D AO N
+sandor S AE N D ER
+sandos S AE N D OW Z
+sandos(2) S AE N D OW S
+sandose S AE N D OW Z
+sandoval S AE N D OW V AH L
+sandow S AE N D OW
+sandoz S AE N D OW Z
+sandoz's S AE N D AH Z IH Z
+sandpaper S AE N D P EY P ER
+sandpoint S AE N D P OY N T
+sandquist S AE N D K W IH S T
+sandra S AE N D R AH
+sandridge S AE N D R IH JH
+sandro S AE N D R OW
+sandrock S AE N D R AA K
+sands S AE N D Z
+sandstone S AE N D S T OW N
+sandstone(2) S AE N S T OW N
+sandstorm S AE N D S T AO R M
+sandstorms S AE N D S T AO R M Z
+sandstrom S AE N D S T R AH M
+sandt S AE N T
+sandtown S AE N D T AW N
+sandtown(2) S AE N T AW N
+sandusky S AE N D AH S K IY
+sandvig S AE N D V IH G
+sandvik S AE N D V IH K
+sandwich S AE N D W IH CH
+sandwich(2) S AE N W IH CH
+sandwich(3) S AE M W IH CH
+sandwiched S AE N D W IH CH T
+sandwiched(2) S AE N W IH CH T
+sandwiched(3) S AE M W IH CH T
+sandwiches S AE N D W IH CH IH Z
+sandwiches(2) S AE N W IH CH IH Z
+sandwiches(3) S AE M W IH CH IH Z
+sandwick S AE N D W IH K
+sandy S AE N D IY
+sandy's S AE N D IY Z
+sane S EY N
+saner S EY N ER
+sanfilippo S AE N F IH L IH P OW
+sanford S AE N F ER D
+sanford's S AE N F ER D Z
+sang S AE NG
+sang-gon S AA NG G AO N
+sanger S AE NG ER
+sangiovese S AE N JH IY OW V IY S
+sangster S AE NG S T ER
+sanguine S AE NG G W IH N
+sanguinetti S AA NG IY N EH T IY
+sangyo S AE N JH Y OW
+sanhedrin S AE N HH IY D R IH N
+sani S AE N IY
+sani(2) S AE N IH
+sanitary S AE N IH T EH R IY
+sanitation S AE N AH T EY SH AH N
+sanitation(2) S AE N IH T EY SH AH N
+sanitize S AE N IH T AY Z
+sanitized S AE N IH T AY Z D
+sanitizing S AE N AH T AY Z IH NG
+sanity S AE N AH T IY
+sanjay S AE N JH EY
+sanjiv S AA N JH IY V
+sanjuan S AA N Y UW AA N
+sank S AE NG K
+sanka S AE NG K AH
+sankara S AA N K AA R AH
+sankara's S AA N K AA R AH Z
+sankei S AE NG K IY
+sanker S AE NG K ER
+sankey S AE NG K IY
+sanko S AE NG K OW
+sanks S AE NG K S
+sankyo S AE NG K Y OW
+sanmark S AE N M AA R K
+sanmartin S AE N M AA R T IH N
+sanmiguel S AA N M IY G EH L
+sanna S AE N AH
+sanner S AE N ER
+sannes S AE N Z
+sano S AA N OW
+sanofi S AH N OW F IY
+sanrio S AE N R IY OW
+sans S AE N Z
+sans-culottes S AA N K UW L AO T
+sansbury S AE N S B EH R IY
+sanseverino S AA N S EH V ER IY N OW
+sansing S AE N S IH NG
+sanskrit S AE N S K R IH T
+sanso S AE N S OW
+sansom S AE N S AH M
+sanson S AE N S AH N
+sansone S AE N S AH N
+sansoucie S AE N S OW K IY
+sansui S AE N S UW IY
+sansui's S AE N S UW IY Z
+sant S AE N T
+santa S AE N T AH
+santa's S AE N T AH
+santa's(2) S AE N AH
+santa(2) S AE N AH
+santa-croce S AE N T AH K R OW CH IY
+santa-croce(2) S AE N AH K R OW CH IY
+santa-cruz S AE N T AH K R UW Z
+santa-cruz(2) S AE N AH K R UW Z
+santa-fe S AE N T AH F EY
+santa-fe's S AE N T AH F EY Z
+santa-fe's(2) S AE N AH F EY Z
+santa-fe(2) S AE N AH F EY
+santa-maria S AE N T AH M ER IY AH
+santa-maria(2) S AE N AH M ER IY AH
+santagata S AA N T AA G AA T AH
+santala S AE N T AA L AH
+santana S AE N T AE N AH
+santander S AE N T AE N D ER
+santangelo S AA N T AA NG G EH L OW
+santaniello S AA N T AA N IY EH L OW
+santarelli S AA N T AA R EH L IY
+santarsiero S AA N T AA R S IH R OW
+santas S AE N T AH S
+santayana S AE N T AY AA N AH
+sante S AE N T AH
+santella S AA N T EH L AH
+santelli S AA N T EH L IY
+santer S AE N T ER
+santeria S AE N T EH R IY AH
+santerre S AE N T EH R
+santi S AE N T IY
+santia S AA N T Y AH
+santiago S AE N T IY AA G OW
+santidad S AA N T IH D AE D
+santiesteban S AE N T IY S T IH B AH N
+santillan S AE N T IH L AH N
+santillanes S AE N T IH L EY N Z
+santilli S AA N T IY L IY
+santillo S AE N T IH L OW
+santin S AE N T IH N
+santini S AE N T IY N IY
+santino S AA N T IY N OW
+santistevan S AA N T IY S T EY V AA N
+santo S AE N T OW
+santon S AE N T AH N
+santone S AA N T OW N IY
+santoni S AA N T OW N IY
+santopietro S AA N T OW P IY T R OW
+santor S AE N T ER
+santora S AA N T AO R AH
+santore S AA N T AO R IY
+santorelli S AA N T AO R EH L IY
+santoro S AE N T AO R OW
+santorum S AE N T AO R AH M
+santorum's S AE N T AO R AH M Z
+santos S AE N T OW S
+santosh S AA N T AA SH
+santosuosso S AA N T OW S W OW S OW
+santow S AE N T OW
+santoyo S AA N T OW Y OW
+santry S AE N T R IY
+santucci S AA N T UW CH IY
+santulli S AA N T UW L IY
+santy S AE N T IY
+sanville S AA N V IH L
+sanwa S AE N W AH
+sanwa's S AE N W AH Z
+sanyo S AA N Y OW
+sanz S AE N Z
+sanzo S AE N Z OW
+sanzone S AA N Z OW N IY
+sao S AW
+saone S EY OW N
+saouma S AW Y UW M AH
+sap S AE P
+sapanski S AH P AE N S K IY
+saperstein S EY P ER S T AY N
+saperstein(2) S EY P ER S T IY N
+saphira S AA F IH R AH
+sapia S AA P IY AH
+sapien S AE P IY N
+sapiens S EY P IY AH N Z
+sapienza S AA P IY N Z AH
+sapiro S AH P IH R OW
+sapling S AE P L IH NG
+saplings S AE P L IH NG Z
+sapoa S AH P OW AH
+sapone S AA P OW N IY
+saponification S AH P AA N AH F AH K EY SH AH N
+saporito S AA P AO R IY T OW
+sapp S AE P
+sapped S AE P T
+sappenfield S AH P EH N F IY L D
+sapper S AE P ER
+sapphire S AE F AY ER
+sapping S AE P IH NG
+sappington S AE P IH NG T AH N
+sapporo S AH P AO R OW
+saps S AE P S
+saputo S AA P UW T OW
+sar S AA R
+sara S EH R AH
+sara's S EH R AH Z
+sara-lee S EH R AH L IY
+sarabia S ER EY B IY AH
+saracco S AA R AA K OW
+saraceni S AA R AA CH EH N IY
+saraceno S AA R AA CH EH N OW
+saracens S EH R AH S AH N Z
+saracino S AA R AA CH IY N OW
+sarafian S ER EY F IY AH N
+sarafin S AE R AH F IH N
+sarafina S AE R AH F IY N AH
+sarage S AE R AH JH
+sarage's S AE R AH JH IH Z
+sarah S EH R AH
+sarah's S EH R AH Z
+sarajevan S AA R AH Y EY V AH N
+sarajevan's S AA R AH Y EY V AH N Z
+sarajevans S AA R AH Y EY V AH N Z
+sarajevo S AA R AH Y EY V OW
+sarajevo's S AA R AH Y EY V OW Z
+saran S ER AE N
+sarandon S EH R AH N D IH N
+sarandon(2) S EH R AE N D IH N
+sarant S AE R AH N T
+sarasin S EH R IH S IH N
+sarasota S EH R AH S OW T AH
+saratoga S EH R AH T OW G AH
+saratov S EH R AH T AO V
+saratov(2) S EH R AH T AO F
+saravia S ER EY V IY AH
+sarawak S EH R AH W AA K
+sarazen S EH R AH Z AH N
+sarazin S AA R AA Z IY N
+sarbane S AA R B EY N
+sarbanes S AA R B EY N Z
+sarber S AA R B ER
+sarcasm S AA R K AE Z AH M
+sarcastic S AA R K AE S T IH K
+sarcastically S AA R K AE S T IH K L IY
+sarchet S AA R SH EH T
+sarcoma S AA R K OW M ER
+sarcophagus S AA R K AA F AH G AH S
+sardas S AA R D AH S
+sardella S AA R D EH L AH
+sardina S AA R D IY N AH
+sardinas S AA R D IH N AH Z
+sardine S AA R D IY N
+sardines S AA R D IY N Z
+sardinha S AA R D IH N HH AH
+sardinia S AA R D IY N IY AH
+sardo S AA R D OW
+sardonic S AA R D AA N IH K
+sardonically S AA R D AA N IH K AH L IY
+sardonically(2) S AA R D AA N IH K L IY
+sare S EH R
+sarejevo S AA R AH Y EY V OW
+sarejevo's S AA R AH Y EY V OW Z
+sarene S ER IY N
+sarette S ER EH T
+sarff S AA R F
+sargasso S AA R G AE S OW
+sarge S AA R JH
+sargeant S AA R JH AH N T
+sargen S AA R G AH N
+sargent S AA R JH AH N T
+sargis S AA R G IH S
+sari S AA R IY
+sari's S AA R IY Z
+sarich S AE R IH K
+sarin S AA R IH N
+sarine S AA R IY N IY
+saris S AA R IY Z
+sarisi S AH R IY S IY
+sark S AA R K
+sarka S AA R K AH
+sarkar S AA R K AA R
+sarkis S AA R K IH S
+sarkisian S AA R K IH ZH IH N
+sarkissian S AA R K IH S ZH IH N
+sarles S AA R L Z
+sarli S AA R L IY
+sarlo S AA R L OW
+sarlos S AA R L OW S
+sarmatian S AA R M EY SH AH N
+sarmento S AA R M EH N T OW
+sarmiento S AA R M IY N T OW
+sarna S AA R N AH
+sarney S AA R N IY
+sarney's S AA R N IY Z
+sarni S AA R N IY
+sarno S AA R N OW
+sarnoff S AA R N AO F
+sarnowski S ER N AO F S K IY
+sarofim S EH R AH F IY M
+sarokin S EH R AH K IH N
+sarong S ER AO NG
+sarongs S ER AO NG Z
+saros S AA R OW S
+sarowiwa S AE R OW W IY W AH
+sarra S AA R AH
+sarratt S ER AE T
+sarrazin S AA R AH Z IH N
+sarrett S AE R IH T
+sarris S AE R IH S
+sarro S AA R OW
+sars S AA R Z
+sarsfield S AA R S F IY L D
+sartain S AA R T EY N
+sarti S AA R T IY
+sartin S AA R T IH N
+sartor S AA R T ER
+sartori S AA R T AO R IY
+sartorial S AA R T AO R IY AH L
+sartorius S AA R T AO R IY IH S
+sartrain S AA R T R EY N
+sartre S AA R T R AH
+sartwell S AA R T W EH L
+sarum S AE R AH M
+sarver S AA R V ER
+sarvis S AA R V IH S
+sas S AE S
+sasaki S AA S AA K IY
+sasayama S AE S AH Y AA M AH
+sasek S AE S IH K
+sash S AE SH
+sasha S AE SH AH
+sashes S AE SH IH Z
+saskatchewan S AE S K AE CH AH W AO N
+saskatoon S AE S K AH T UW N
+saslow S AE S L OW
+sasnett S AE S N IH T
+sass S AE S
+sassafras S AE S AH F R AE S
+sassafras's S AE S AH F R AE S AH Z
+sassafras's(2) S AE S AH F R AE S IH Z
+sassaman S AE S AH M AH N
+sassano S AA S AA N OW
+sasse S AE S
+sasseen S AE S IY N
+sasser S AE S ER
+sasser's S AE S ER Z
+sassi S AE S IY
+sassman S AE S M AH N
+sassnet S AE S N EH T
+sassnet's S AE S N EH T S
+sassnets S AE S N EH T S
+sasso S AE S OW
+sasson S AE S AH N
+sassone S AA S OW N IY
+sassoon S AH S UW N
+sassou S AE S UW
+sassounguesso S AE S UW NG G EH S OW
+sassulo S AH S UW L OW
+sassy S AE S IY
+sassy's S AE S IY Z
+sat S AE T
+satagaj S AE T AH G AY
+satan S EY T AH N
+satanic S AH T AE N IH K
+satanism S EY T AH N IH Z AH M
+satanist S EY T AH N IH S T
+satanjeev S AA T AA N JH IY V
+satchell S AE CH AH L
+satcher S AE CH ER
+sate S EY T
+sated S EY T IH D
+satellite S AE T AH L AY T
+satellite's S AE T AH L AY T S
+satellites S AE T AH L AY T S
+sater S AE T ER
+sates S EY T S
+sather S AE DH ER
+sathre S AE TH ER
+sathyavagiswaran S AE TH Y AH V AA G IH S W AA R AH N
+satin S AE T AH N
+satins S AE T AH N Z
+satire S AE T AY ER
+satires S AE T AY ER Z
+satiric S AH T IH R IH K
+satirical S AH T IH R AH K AH L
+satirical(2) S AH T IH R IH K AH L
+satirist S AE T ER AH S T
+satirists S AE T ER AH S T S
+satirists(2) S AE T ER AH S S
+satirists(3) S AE T ER AH S
+satirize S AE T ER AY Z
+satirizes S AE T ER AY Z IH Z
+satirizing S AE T ER AY Z IH NG
+satisfaction S AE T AH S F AE K SH AH N
+satisfaction(2) S AE T IH S F AE K SH AH N
+satisfactions S AE T AH S F AE K SH AH N Z
+satisfactorily S AE T IH S F AE K T R AH L IY
+satisfactory S AE T AH S F AE K T R IY
+satisfactory(2) S AE T IH S F AE K T ER IY
+satisfied S AE T AH S F AY D
+satisfied(2) S AE T IH S F AY D
+satisfies S AE T IH S F AY Z
+satisfy S AE T AH S F AY
+satisfy(2) S AE T IH S F AY
+satisfying S AE T IH S F AY IH NG
+satloff S AE T L AO F
+sato S AA T OW
+satoh S AA T OW
+satoshi S AA T OW SH IY
+satre S EY T ER
+satriani S AE T R IY AA N IY
+satter S AE T ER
+satterfield S AE T ER F IY L D
+satterlee S AE T ER L IY
+satterly S AE T ER L IY
+satterwhite S AE T ER W AY T
+sattler S AE T L ER
+saturate S AE CH ER EY T
+saturated S AE CH ER EY T AH D
+saturated(2) S AE CH ER EY T IH D
+saturating S AE CH ER EY T IH NG
+saturation S AE CH ER EY SH AH N
+saturday S AE T ER D IY
+saturday's S AE T ER D IY Z
+saturday's(2) S AE T ER D EY Z
+saturday(2) S AE T IH D EY
+saturdays S AE T ER D IY Z
+saturdays(2) S AE T ER D EY Z
+saturn S AE T ER N
+saturn's S AE T ER N Z
+saturns S AE T ER N Z
+satya S AA T Y AH
+satyandra S AA T Y AA N D R AH
+satz S AE T S
+sauber S AO B ER
+sauce S AO S
+sauceda S AW S EY D AH
+saucedo S AW S EY D OW
+saucepan S AO S P AE N
+saucer S AO S ER
+saucers S AO S ER Z
+sauces S AO S AH Z
+sauces(2) S AO S IH Z
+saucier S AO S IY ER
+saucony S AO K AH N IY
+saucy S AO S IY
+saud S AO D
+sauder S AO D ER
+saudi S AO D IY
+saudi(2) S AW D IY
+saudia S AO D IY AH
+saudia(2) S AW D IY AH
+saudiization S AW IY IH Z EY SH AH N
+saudis S AO D IY Z
+saudis' S AO D IY Z
+saudis'(2) S AW D IY Z
+saudis(2) S AW D IY Z
+sauer S AW ER
+sauerkraut S AW ER K R AW T
+sauers S AW ER Z
+sauerteig S AW ER T EY G
+sauerwein S AW ER W AY N
+sauey S AO IY
+saugerties S AO G ER T IY Z
+sauk S AO K
+saul S AO L
+saulnier S AW L N IY ER
+sauls S AO L Z
+saulsberry S AO L S B EH R IY
+saulsbury S AO L S B EH R IY
+sault S AO L T
+saulter S AO L T ER
+saulters S AW L T ER Z
+saum S AO M
+sauna S AO N AH
+saunas S AO N AH Z
+saunders S AO N D ER Z
+saunders' S AO N D ER Z
+saunders's S AO N D ER Z IH Z
+saunderson S AO N D ER S AH N
+saundra S AO N D R AH
+saundra's S AO N D R AH Z
+saunier S AO N IY ER
+saunter S AO N T ER
+saur S AO R
+saurer S AW ER R
+sauro S AO R OW
+saus S AO Z
+sausage S AO S AH JH
+sausage(2) S AO S IH JH
+sausages S AO S IH JH IH Z
+sausalito S AO S AH L IY T OW
+sause S AO Z
+sauseda S AW S EY D AH
+sauser S AW S ER
+sausser S AO S ER
+saute S AO T EY
+sauteed S AO T EY D
+sauter S AO T EY ER
+sauterne S OW T ER N
+sauternes S OW T ER N Z
+sautter S AO T ER
+sauvage S AO V IH JH
+sauvageau S OW V AH ZH OW
+sauve S AO V
+sauvignon S AO V IH N Y AA N
+sava S AA V AH
+savage S AE V AH JH
+savage(2) S AE V IH JH
+savaged S AE V IH JH D
+savagely S AE V IH JH L IY
+savagery S AE V IH JH EH R IY
+savages S AE V AH JH AH Z
+savages(2) S AE V IH JH IH Z
+savaging S AE V IH JH IH NG
+savaiko S AH V EY K OW
+savala S AA V AA L AH
+savalas S AH V AA L AH S
+savanna S AH V AE N AH
+savannah S AH V AE N AH
+savannas S AH V AE N AH Z
+savant S AH V AA N T
+savants S AE V AH N T S
+savard S AE V ER D
+savarese S AA V AA R EY Z IY
+savarino S AA V AA R IY N OW
+savary S AE V EH R IY
+savas S AA V AA Z
+savasta S AH V AE S T AH
+savastano S AA V AA S T AA N OW
+save S EY V
+save's S EY V Z
+saved S EY V D
+savedra S AH V EH D R AH
+savel S AA V EH L
+savell S AA V EY L
+savely S EY V L IY
+saver S EY V ER
+savers S EY V ER Z
+savery S EY V ER IY
+saves S EY V Z
+saviano S AA V IY AA N OW
+savich S AE V IH CH
+savickas S AE V IH K AH Z
+savidge S AE V IH JH
+savier S EY V Y ER
+savikas S AH V IY K AH S
+savill S AA V IY L
+saville S AA V IH L
+savimbi S AH V IH M B IY
+savin S AE V IH N
+savin's S AE V IH N Z
+savina S AH V IY N AH
+saving S EY V IH NG
+savings S EY V IH NG Z
+savings' S EY V IH NG Z
+savings's S EY V IH NG Z
+savings's(2) S EY V IH NG Z IH Z
+savini S AA V IY N IY
+savino S AA V IY N OW
+savio S AA V IY OW
+savion S AE V IY AO N
+savion(2) S AE V Y AO N
+savior S EY V Y ER
+savior's S EY V Y ER Z
+saviors S EY V Y ER Z
+savir S EY V ER
+savir(2) S AH V IY R
+savitch S AE V IH CH
+savitsky S AH V IH T S K IY
+savitt S AH V IH T
+savitz S AE V IH T S
+savko S AE V K OW
+savo S AA V OW
+savoca S AA V OW K AH
+savoia S AA V OW Y AH
+savoie S AA V W AA
+savon S EY V AO N
+savona S AA V OW N AH
+savor S EY V ER
+savored S EY V ER D
+savoring S EY V ER IH NG
+savors S EY V ER Z
+savory S EY V ER IY
+savoy S AH V OY
+savr S EY V ER
+savviest S AE V IY IH S T
+savvy S AE V IY
+saw S AO
+sawa S AO W AH
+sawall S AO W AO L
+sawasdee S AH W AA Z D IY
+sawatzky S AH W AA T S K IY
+sawaya S AO W AA Y AH
+sawchuk S AO CH AH K
+sawdey S AO D IY
+sawdon S AO D AH N
+sawdust S AO D AH S T
+sawdy S AO D IY
+sawed S AO D
+sawhill S AO HH IH L
+sawicki S AO IH T S K IY
+sawicz S AW IH T S
+sawin S AO IY N
+sawing S AO IH NG
+sawka S AO K AH
+sawmill S AO M IH L
+sawmills S AO M IH L Z
+saws S AO Z
+sawshank S AO SH AE N K
+sawtell S AO T EH L
+sawtelle S AO T EH L
+sawyer S AO Y ER
+sawyer's S AO Y ER Z
+sawyer(2) S OY ER
+sawyers S AO Y ER Z
+sax S AE K S
+saxby S AE K S B IY
+saxe S AE K S
+saxena S AE K S IH N AH
+saxer S AE K S ER
+saxman S AE K S M AH N
+saxon S AE K S AH N
+saxon's S AE K S AH N Z
+saxona S AE K S AH N AH
+saxons S AE K S AH N Z
+saxony S AE K S AH N IY
+saxophone S AE K S AH F OW N
+saxophones S AE K S AH F OW N Z
+saxophonist S AE K S AH F OW N IH S T
+saxton S AE K S T AH N
+say S EY
+sayad S AY AE D
+sayad's S AY AE D Z
+saybrook S EY B R UH K
+saye S EY
+sayed S AA Y EH D
+sayed(2) S EY Y IH D
+sayed(3) S EY D
+sayegh S EY IH G
+sayer S EY ER
+sayers S EY ER Z
+sayiid S AY IH D
+sayiid(2) S AY IY D
+sayin' S EY IH N
+saying S EY IH NG
+sayings S EY IH NG Z
+sayito S AY IY T OW
+sayle S EY L
+sayler S EY L ER
+sayles S EY L Z
+saylor S EY L ER
+saylors S EY L ER Z
+sayre S EH R
+sayres S EH R Z
+says S EH Z
+says(2) S IH Z
+sayyid S AY IH D
+sazama S AA Z AA M AH
+sbarro S B AA R OW
+sbf EH S B IY EH F
+scab S K AE B
+scabbard S K AE B ER D
+scabs S K AE B Z
+scaccia S K AA CH AH
+scad S K AE D
+scadden S K AE D AH N
+scads S K AE D Z
+scaduto S K AA D UW T OW
+scaff S K AE F
+scaffidi S K AA F IY D IY
+scaffold S K AE F AH L D
+scaffolding S K AE F AH L D IH NG
+scaffolds S K AE F AH L D Z
+scafidi S K AA F IY D IY
+scaggs S K AE G Z
+scaglione S K AE G L IY OW N IY
+scags S K AE G Z
+scahill S K EY HH IH L
+scaife S K EY F
+scala S K AA L AH
+scalamandre S K AA L AH M AA N D ER
+scalamandre(2) S K AE L AH M AE N D ER
+scalar S K EY L ER
+scald S K AO L D
+scalded S K AO L D IH D
+scalding S K AO L D IH NG
+scalds S K AO L D Z
+scale S K EY L
+scaleatron S K EY L IY AH T R AO N
+scaled S K EY L D
+scalera S K AA L EH R AH
+scales S K EY L Z
+scalese S K AA L EY Z IY
+scalf S K AE L F
+scalfaro S K AE L F AA R OW
+scali S K AA L IY
+scali(2) S K EY L IY
+scalia S K AA L IY AH
+scalia's S K AA L IY AH Z
+scalia's(2) S K AA L Y AH Z
+scalia(2) S K AA L Y AH
+scaling S K EY L IH NG
+scalise S K AA L AY Z
+scalisi S K AA L IY S IY
+scallan S K AE L AH N
+scallion S K AE L Y AH N
+scallions S K AE L Y AH N Z
+scallon S K AE L AH N
+scallop S K AE L AH P
+scalloped S K AA L AH P T
+scallops S K AE L AH P S
+scally S K AE L IY
+scalp S K AE L P
+scalped S K AE L P T
+scalpel S K AE L P AH L
+scalpels S K AE L P AH L Z
+scalper S K AE L P ER
+scalpers S K AE L P ER Z
+scalping S K AE L P IH NG
+scalps S K AE L P S
+scalzi S K AA L Z IY
+scalzitti S K AA L Z IY T IY
+scalzo S K AA L Z OW
+scam S K AE M
+scammed S K AE M D
+scammell S K AE M AH L
+scammer S K AE M ER
+scammers S K AE M ER Z
+scammon S K AE M AH N
+scamper S K AE M P ER
+scampered S K AE M P ER D
+scampering S K AE M P ER IH NG
+scams S K AE M Z
+scan S K AE N
+scandal S K AE N D AH L
+scandal's S K AE N D AH L Z
+scandalize S K AE N D AH L AY Z
+scandalized S K AE N D AH L AY Z D
+scandalous S K AE N D AH L AH S
+scandals S K AE N D AH L Z
+scandia S K AE N D IY AH
+scandinavia S K AE N D IH N EY V IY AH
+scandinavia's S K AE N D IH N EY V IY AH Z
+scandinavian S K AE N D IH N EY V IY AH N
+scandinavians S K AE N D IH N EY V IY AH N Z
+scania S K AA N IY AH
+scanlan S K AE N L AH N
+scanland S K AE N L AH N D
+scanlin S K AE N L IH N
+scanlon S K AE N L AH N
+scanlon's S K AE N L AH N Z
+scanned S K AE N D
+scannell S K AE N AH L
+scanner S K AE N ER
+scanners S K AE N ER Z
+scanning S K AE N IH NG
+scans S K AE N Z
+scant S K AE N T
+scantily S K AE N T AH L IY
+scantiness S K AE N T IY N AH S
+scantlin S K AE N T L IH N
+scanty S K AE N T IY
+scapa S K AA P AH
+scape S K EY P
+scapegoat S K EY P G OW T
+scapegoated S K EY P G OW T IH D
+scapegoating S K EY P G OW T IH NG
+scapegoats S K EY P G OW T S
+scapula S K AE P Y AH L AH
+scar S K AA R
+scaramouch S K AE R AH M AW CH
+scarano S K AA R AA N OW
+scarberry S K AA R B EH R IY
+scarborough S K AA R B ER OW
+scarbro S K AA R B R OW
+scarbrough S K AA R B R AW
+scarce S K EH R S
+scarcella S K AA R S EH L AH
+scarcely S K EH R S L IY
+scarcer S K EH R S ER
+scarcity S K EH R S IH T IY
+scardina S K AA R D IY N AH
+scardino S K AA R D IY N OW
+scare S K EH R
+scarecrow S K AE R K R OW
+scared S K EH R D
+scares S K EH R Z
+scarf S K AA R F
+scarface S K AA R F EY S
+scarff S K AA R F
+scarfo S K AA R F OW
+scarfs S K AA R F S
+scargill S K AA R G IH L
+scarier S K EH R IY ER
+scariest S K EH R IY AH S T
+scaring S K EH R IH NG
+scarlata S K AA R L AA T AH
+scarlet S K AA R L AH T
+scarlett S K AA R L IH T
+scarola S K AA R OW L AH
+scarp S K AA R P
+scarpa S K AA R P AH
+scarpati S K AA R P AA T IY
+scarpelli S K AA R P EH L IY
+scarpello S K AA R P EH L OW
+scarpinatto S K AA R P IH N AA T OW
+scarpino S K AA R P IY N OW
+scarpone S K AA R P OW N IY
+scarpulla S K AA R P UH L AH
+scarred S K AA R D
+scarring S K AA R IH NG
+scarry S K AE R IY
+scars S K AA R Z
+scarsdale S K AA R Z D EY L
+scarsella S K AA R S EH L AH
+scarves S K AA R V Z
+scary S K EH R IY
+scat S K AE T
+scatena S K AA T EH N AH
+scates S K EY T S
+scathing S K EY DH IH NG
+scatological S K AE T AH L AO JH AH K AH L
+scatology S K AE T AO L AH JH IY
+scatter S K AE T ER
+scattered S K AE T ER D
+scattergood S K AE T ER G UH D
+scattergories S K AE T ER G AO R IY Z
+scattergory S K AE T ER G AO R IY
+scattering S K AE T ER IH NG
+scattershot S K AE T ER SH AA T
+scaturro S K AA T UH R OW
+scavenge S K AE V AH N JH
+scavenger S K AE V AH N JH ER
+scavengers S K AE V AH N JH ER Z
+scavenging S K AE V AH N JH IH NG
+scavo S K AA V OW
+scavone S K AH V OW N
+scavuzzo S K AA V UW Z OW
+scearce S ER S
+scenario S IH N EH R IY OW
+scenarios S IH N EH R IY OW Z
+scene S IY N
+sceneries S IY N ER IY Z
+scenery S IY N ER IY
+scenes S IY N Z
+scenic S IY N IH K
+scent S EH N T
+scented S EH N T IH D
+scents S EH N T S
+sceptre S EH P T ER
+sceptre(2) S K EH P T ER
+scerbo S K EH R B OW
+scerzusky S ER Z UW S K IY
+schaab SH AA B
+schaack SH AA K
+schaad SH AA D
+schaadt SH AA T
+schaaf SH AA F
+schaafsma SH AA F S M AH
+schaal SH AA L
+schaap SH AA P
+schaar SH AA R
+schab SH AE B
+schabacker SH AA B AE K ER
+schabel SH AE B AH L
+schaben SH AE B AH N
+schaber SH EY B ER
+schaberg SH AA B ER G
+schabes SH EY B Z
+schacher SH AE K ER
+schachner SH AE K N ER
+schacht SH AE K T
+schachter SH AE K T ER
+schack SH AE K
+schad SH AE D
+schade SH EY D
+schadel SH AE D AH L
+schaden SH AE D AH N
+schader SH EY D ER
+schadler SH EY D AH L ER
+schadler(2) SH EY D L ER
+schadt SH AE T
+schaecher SH EH K ER
+schaedel SH EH D AH L
+schaedler SH EH D AH L ER
+schaedler(2) SH EH D L ER
+schaefer SH EY F ER
+schaefers SH EY F ER Z
+schaeffer SH EH F ER
+schaeffler SH AE F L ER
+schaer SH AA ER
+schafer SH EY F ER
+schaff SH AE F
+schaffer SH EY F ER
+schaffert SH AE F ER T
+schaffler SH AE F L ER
+schaffner SH AE F N ER
+schaible S K EY B AH L
+schairer SH AY ER R
+schaja SH AA JH AH
+schake SH EY K
+schalk SH AO K
+schall SH AO L
+schaller SH AO L ER
+schallock SH AE L AH K
+schalow SH AE L OW
+schama SH AA M AH
+schamber SH AE M B ER
+schamberger SH AE M B ER G ER
+schamel SH AE M AH L
+schamp SH AE M P
+schanbacher SH AE N B AA K ER
+schanck SH AE NG K
+schaner SH EY N ER
+schank SH AE NG K
+schantz SH AE N T S
+schanz SH AE N S
+schaper SH EY P ER
+schapiro SH AE P AY R OW
+schapp SH AE P
+schappell SH AE P AH L
+schappert SH AE P ER T
+schar SH AA R
+schara S K AE R AH
+schardt SH AA R T
+scharenberg SH EH R AH N B ER G
+scharer SH EH R ER
+scharf SH AA R F
+scharfe S K AA R F
+scharfenberg SH AA R F AH N B ER G
+scharff SH AA R F
+scharffenberger SH AA R F AH N B ER G ER
+scharlau SH AA R L AW
+scharnhorst SH AA R N HH AO R S T
+scharp SH AA R P
+scharpf SH AA R P F
+scharr SH AA R
+scharrer SH AA R ER
+schartz SH AA R T S
+schattner SH AE T N ER
+schatz SH AE T S
+schatzberg SH AE T S B ER G
+schatzel SH AE T Z AH L
+schatzman SH AE T Z M AH N
+schau SH OW
+schaub SH AO B
+schauble SH OW B AH L
+schauer SH AW ER
+schauf SH AW F
+schaufler SH AW F AH L ER
+schaufler(2) SH AW F L ER
+schaul SH OW L
+schaum SH OW M
+schaumberg SH OW M B ER G
+schaumburg SH AW M B ER G
+schaus S K HH AW S
+schaut SH OW T
+schave SH EY V
+schear SH IH R
+schechter SH EH K T ER
+schechtman SH EH K T M AH N
+scheck SH EH K
+scheckel SH EH K AH L
+schecter SH EH K T ER
+schedler SH EH D AH L ER
+schedler(2) SH EH D L ER
+schedule S K EH JH UH L
+schedule(2) S K EH JH UW L
+scheduled S K EH JH UH L D
+scheduled(2) S K EH JH UW L D
+scheduler S K EH JH UH L ER
+scheduler(2) S K EH JH UW L ER
+schedulers S K EH JH UH L ER Z
+schedulers(2) S K EH JH UW L ER Z
+schedules S K EH JH UH L Z
+schedules(2) S K EH JH UW L Z
+scheduling S K EH JH UH L IH NG
+scheduling(2) S K EH JH UW L IH NG
+scheel SH IY L
+scheele SH IY L
+scheeler SH IY L ER
+scheer SH IH R
+scheerer SH IH R ER
+scheets SH IY T S
+scheetz SH IY T S
+scheff SH EH F
+scheffel SH EH F AH L
+scheffer SH EH F ER
+scheffler SH EH F AH L ER
+scheffler(2) SH EH F L ER
+schehr SH EH R
+scheib SH AY B
+scheibe SH AY B
+scheibel SH AY B AH L
+scheiber SH AY B ER
+scheible S K AY B AH L
+scheibner SH AY B N ER
+scheid SH AY D
+scheidecker SH AY D IH K ER
+scheidegger SH AY D IH G ER
+scheidel SH AY D AH L
+scheider SH AY D ER
+scheiderer SH AY D ER ER
+scheidler SH AY D AH L ER
+scheidler(2) SH AY D L ER
+scheidt SH AY T
+scheier SH AY ER
+scheiman SH AY M AH N
+schein SH AY N
+scheinberg SH AY N B ER G
+scheiner SH AY N ER
+scheirer SH AY ER R
+scheler SH IY L ER
+schelin SH EH L IH N
+schell S K EH L
+schellenberg SH EH L AH N B ER G
+schellenberger SH EH L AH N B ER G ER
+schellenger SH EH L IH N JH ER
+scheller S K EH L ER
+schellhammer SH EH L HH AH M ER
+schellhase SH EH L HH AH S
+schellhorn SH EH L HH ER N
+schelling S K EH L IH NG
+schellinger SH EH L IH NG ER
+schemata S K IH M AE T AH
+schematic S K IH M AE T IH K
+schembri SH EH M B R IY
+scheme S K IY M
+schemed S K IY M D
+schemel SH EH M AH L
+schemer S K IY M ER
+schemes S K IY M Z
+scheming S K IY M IH NG
+schemm SH EH M
+schemmel SH EH M AH L
+schempf SH EH M F
+schempp SH EH M P
+schena SH IY N AH
+schenck SH EH NG K
+schendel SH EH N D AH L
+schenectady S K AH N EH K T AH D IY
+schenectady's S K AH N EH K T AH D IY Z
+schenk SH EH NG K
+schenkel SH EH NG K AH L
+schenken SH EH NG K AH N
+schenker SH EH NG K ER
+schenley SH EH N L IY
+scheper SH IY P ER
+schepers SH IY P ER Z
+schepis SH EH P IH S
+schepp SH EH P
+scher SH ER
+scherb SH ER B
+scherbarth SH ER B AA R TH
+scherer SH IH R ER
+scherer's SH EH R ER Z
+scherf SH ER F
+scherff SH ER F
+scherger SH ER G ER
+schering SH ER IH NG
+schering's SH EH R IH NG Z
+schering(2) SH EH R IH NG
+scherlis SH ER L IH S
+scherman SH ER M AH N
+schermer SH ER M ER
+schermerhorn SH ER M ER HH ER N
+scherr SH EH R
+scherrer SH EH R ER
+schertz SH ER T S
+schertzer SH ER T S ER
+scherz SH ER Z
+scherzer SH ER Z ER
+scherzinger SH ER Z IH NG ER
+schetter SH EH T ER
+schettino SH EH T IY N OW
+schettler SH EH T AH L ER
+schettler(2) SH EH T L ER
+scheu SH OY
+scheuer SH OY ER
+scheuerman SH OY ER M AH N
+scheuermann SH OY ER M AH N
+scheufler SH OY F AH L ER
+scheufler(2) SH OY F L ER
+scheunemann SH OY N M AH N
+scheurer SH ER ER
+scheurich SH OY R IH K
+scheuring SH ER IH NG
+scheve SH IY V
+schewe SH Y UW
+schexnayder SH EH K S N EY D ER
+schexnider SH EH K S N AY D ER
+schey SH EY
+schiano S K IY AA N OW
+schiappa S K IY AA P AH
+schiavi S K IY AA V IY
+schiavo S K IY AA V OW
+schiavo's S K IY AA V OW Z
+schiavone S K IY AA V OW N IY
+schiavoni S K IY AA V OW N IY
+schick SH IH K
+schicker SH IH K ER
+schickler SH IH K AH L ER
+schickler(2) SH IH K L ER
+schickling SH IH K AH L IH NG
+schickling(2) SH IH K L IH NG
+schiebel SH IY B AH L
+schieber SH IY B ER
+schiefelbein SH IY F IH L B AY N
+schiefer SH IY F ER
+schieffelin SH IY F AH L IH N
+schieffer SH IY F ER
+schiel SH IY L
+schield SH IY L D
+schiele SH IY L
+schielke SH IY L K
+schiemann SH IY M AH N
+schier SH AY ER
+schieren SH IH R AH N
+schierl SH IH R L
+schiess SH IY S
+schiesser SH IY S ER
+schiewe SH IY W IY
+schifano S K IY F AA N OW
+schiferon SH IH F ER AO N
+schiferon's SH IH F ER AO N Z
+schiferon's(2) SH IH F R AO N Z
+schiferon(2) SH IH F R AO N
+schiff SH IH F
+schiffbauer SH IH F B AW ER
+schiffer SH IH F ER
+schiffler SH IH F AH L ER
+schiffler(2) SH IH F L ER
+schiffman SH IH F M AH N
+schiffner SH IH F N ER
+schild SH AY L D
+schilder SH AY L D ER
+schildknecht SH AY L D K AH N EH K T
+schildt SH IH L T
+schilke SH IH L K
+schill SH IH L
+schillaci S K IY L AA CH IY
+schiller SH IH L ER
+schiller's SH IH L ER Z
+schilling SH IH L IH NG
+schilling's SH IH L IH NG Z
+schillinger SH IH L IH NG ER
+schillings SH IH L IH NG Z
+schillo S K IH L OW
+schilt SH IH L T
+schiltknecht SH IH L T N EH K T
+schiltz SH IH L T S
+schilz SH IH L Z
+schimberni SH IH M B ER N IY
+schimek SH IH M IH K
+schimke S K IH M K
+schimmel SH IH M AH L
+schimmelbusch SH IH M AH L B UH SH
+schimming SH IH M IH NG
+schimpf SH IH M P F
+schindel SH IH N D AH L
+schindler SH IH N D L ER
+schindler's SH IH N D L ER Z
+schinke S K IH NG K
+schinkel SH IH NG K AH L
+schipani S K IY P AA N IY
+schiphol S K IH P AH L
+schipke SH IH P K IY
+schipper SH IH P ER
+schippers SH IH P ER Z
+schiraldi S K IH R AA L D IY
+schirm SH ER M
+schirmer SH ER M ER
+schiro S K IH R OW
+schirtzinger SH ER T Z IH NG ER
+schisler SH IH S AH L ER
+schisler(2) SH IH S L ER
+schism S K IH Z AH M
+schisms S K IH Z AH M Z
+schissel SH IH S AH L
+schissler SH IH S AH L ER
+schissler(2) SH IH S L ER
+schist SH IH S T
+schists SH IH S T S
+schizophrenia S K IH T S AH F R IY N IY AH
+schizophrenic SH IH Z AH F R EH N IH K
+schlabach SH L AE B AA K
+schlachter SH L AE K T ER
+schlack SH L AE K
+schlafer SH L EY F ER
+schlafly SH L AE F L IY
+schlag SH L AE G
+schlagel SH L AE G AH L
+schlager SH L EY G ER
+schlageter SH L AE G IY T ER
+schlake SH L EY K
+schlang SH L AE NG
+schlangen SH L AE NG AH N
+schlanger SH L AE NG ER
+schlarb SH L AA R B
+schlater SH L EY T ER
+schlatter SH L AE T ER
+schlauch SH L AW K
+schlecht SH L EH K T
+schlechter SH L EH K T ER
+schlee SH L IY
+schleeter SH L IY T ER
+schlegel SH L EY G AH L
+schlegelmilch SH L EH G IH L M IH L K
+schleich SH L AY K
+schleicher SH L AY K ER
+schleif SH L AY F
+schleifer SH L AY F ER
+schleiger SH L AY G ER
+schleimer SH L AY M ER
+schlein SH L AY N
+schleis SH L AY Z
+schlemmer SH L EH M ER
+schlender SH L EH N D ER
+schlenker SH L EH NG K ER
+schlepp SH L EH P
+schlereth SH L EH R IH TH
+schlesinger SH L EH S IH N JH ER
+schlesser SH L EH S ER
+schlessinger SH L EH S IH N JH ER
+schleswig SH L EH S W IH G
+schley SH L EY
+schleyer SH L EY ER
+schlicher SH L IH K ER
+schlicht SH L IH K T
+schlichter SH L IH K T ER
+schlichting SH L IH K T IH NG
+schlick SH L IH K
+schlicker SH L IH K ER
+schlict SH L IH K T
+schlie SH L IY
+schliep SH L IY P
+schlieper SH L IY P ER
+schlink SH L IH NG K
+schlitt SH L IH T
+schlitter SH L IH T ER
+schlitz SH L IH T S
+schlobohm SH L AA B OW M
+schlock SH L AA K
+schloemer SH L OW M ER
+schloesser SH L AA IH S ER
+schloesser(2) SH L AA S ER
+schlosberg SH L AA S B ER G
+schloss SH L AO S
+schlossberg SH L AO S B ER G
+schlosser SH L AO S ER
+schlossman SH L AO S M AH N
+schlott SH L AA T
+schlotter SH L AA T ER
+schlotterbeck SH L AA T ER B EH K
+schlottman SH L AA T M AH N
+schlotzhauer SH L AA T S HH AW ER
+schlough SH L AW
+schlueter SH L UH T ER
+schlumberger SH L AH M B ER ZH EY
+schlumberger(2) SH L AH M B ER G ER
+schlund SH L AH N D
+schlup SH L AH P
+schluter SH L UW T ER
+schmader SH M EY D ER
+schmahl SH M AA L
+schmal SH M AE L
+schmale SH M EY L
+schmall SH M AO L
+schmaltz SH M AA L T S
+schmalz SH M AO L Z
+schmancy SH M AE N S IY
+schmaus SH M AW Z
+schmead SH M IY D
+schmechel SH M EH K AH L
+schmeck SH M EH K
+schmehl SH M EH L
+schmeichel SH M AY K AH L
+schmeiser SH M AY S ER
+schmeling SH M EH L IH NG
+schmelter SH M EH L T ER
+schmeltz SH M EH L T S
+schmeltzer SH M EH L T Z ER
+schmelz SH M EH L Z
+schmelzer SH M EH L Z ER
+schmelzle SH M EH L Z AH L
+schmergel SH M ER G AH L
+schmertz SH M ER T S
+schmetterer SH M EH T ER ER
+schmick SH M IH K
+schmid SH M IH D
+schmiddy SH M IH D IY
+schmidgall SH M IH JH AH L
+schmidl SH M IH D AH L
+schmidlin SH M IH D L IH N
+schmidt SH M IH T
+schmidt's SH M IH T S
+schmidtke SH M IH T K IY
+schmied SH M AY D
+schmieder SH M AY D ER
+schmieg SH M IY G
+schmierer SH M AY ER ER
+schmiesing SH M IY S IH NG
+schmit SH M IH T
+schmitt SH M IH T
+schmitter SH M IH T ER
+schmittou SH M IH CH UW
+schmitz SH M IH T S
+schmitzer SH M IH T S ER
+schmoke SH M OW K
+schmoker SH M OW K ER
+schmoldt SH M OW L T
+schmoll SH M AA L
+schmooze SH M UW Z
+schmoozing SH M UW Z IH NG
+schmotzer SH M OW T Z ER
+schmoyer SH M OY ER
+schmuck SH M AH K
+schmucker SH M AH K ER
+schmuckler SH M AH K L ER
+schmuhl SH M AH L
+schmults SH M AH L T S
+schmunk SH M AH NG K
+schmutz SH M AH T S
+schmutzler SH M AH T Z AH L ER
+schmutzler(2) SH M AH T Z L ER
+schnabel SH N AE B AH L
+schnack SH N AE K
+schnackenberg SH N AE K AH N B ER G
+schnake SH N EY K
+schnakenberg SH N EY K AH N B ER G
+schnall SH N AO L
+schnapp SH N AE P
+schnapps SH N AE P S
+schnarr SH N AE R
+schnauzer SH N AW Z ER
+schneberger SH N IY B ER G ER
+schnebly SH N EH B L IY
+schneck SH N EH K
+schneckloth SH N EH K L AH TH
+schnee SH N IY
+schneeberger SH N IY B ER G ER
+schneeman SH N IY M AH N
+schneerson SH N IH R S AH N
+schneerson's SH N IH R S AH N Z
+schneid SH N AY D
+schneider SH N AY D ER
+schneider's SH N AY D ER Z
+schneiderman SH N AY D ER M AH N
+schneiderman's SH N AY D ER M AH N Z
+schneiders SH N AY D ER Z
+schneiders' SH N AY D ER Z
+schneidewind SH N AY D AH W IH N D
+schneidewind's SH N AY D AH W IH N D Z
+schneier SH N AY ER
+schneiter SH N AY T ER
+schnell SH N EH L
+schnelle SH N EH L
+schneller SH N EH L ER
+schnepf SH N EH P F
+schnepp SH N EH P
+schnettler SH N EH T AH L ER
+schnettler(2) SH N EH T L ER
+schnetzer SH N EH T Z ER
+schnick SH N IH K
+schnider SH N AY D ER
+schnieder SH N AY D ER
+schnieders SH N AY D ER Z
+schnier SH N AY ER
+schnitker SH N IH T K ER
+schnittke SH N IH T K IY
+schnitz SH N IH T S
+schnitzer SH N IH T Z ER
+schnitzler SH N IH T S L ER
+schnoebelen SH N OW B AH L AH N
+schnook SH N UH K
+schnooks SH N UH K S
+schnoor SH N UH R
+schnorr SH N AO R
+schnur SH N ER
+schnurr SH N ER
+schnyder SH N AY D ER
+schnyder's SH N AY D ER Z
+schobel SH OW B AH L
+schober SH OW B ER
+schobert SH AA B ER T
+schoch SH AA K
+schock SH AA K
+schoeck SH OW K
+schoeffler SH OW F AH L ER
+schoeffler(2) SH OW F L ER
+schoeller SH OW L ER
+schoellhorn SH OW L HH AO R N
+schoemaker SH OW M EY K ER
+schoen SH OW N
+schoenbaum SH OW N B AW M
+schoenbeck SH OW N B EH K
+schoenberg SH OW N B ER G
+schoenberger SH OW N B ER G ER
+schoenborn SH OW N B ER N
+schoendorf SH OW N D AO R F
+schoene SH AA IY N
+schoeneck SH OW N EH K
+schoenecker SH OW N EH K ER
+schoeneman SH AA IY N M AH N
+schoenemann SH AA IY N M AH N
+schoener SH OW N ER
+schoenfeld SH OW N F EH L D
+schoenfelder SH OW N F EH L D ER
+schoenfeldt SH OW N F IH L T
+schoenhals SH OW N HH AH L Z
+schoenherr SH OW N HH ER
+schoenhof SH OW N HH AA F
+schoenhof's SH OW N HH AA F S
+schoenholtz SH OW N HH OW L T S
+schoenig SH OW N IH G
+schoening SH AA AH N IH NG
+schoenrock SH OW N R AH K
+schoenthal SH OW N TH AO L
+schoenwald SH OW N W AO L D
+schoepe SH OW P
+schoepf SH OW P
+schoepke SH OW P K IY
+schoepp SH OW P
+schoeppner SH OW P N ER
+schoettle SH OW T AH L
+schoff SH AO F
+schoffstall SH AO F S T AH L
+schofield S K OW F IY L D
+scholar S K AA L ER
+scholar's S K AA L ER Z
+scholarly S K AA L ER L IY
+scholars S K AA L ER Z
+scholarship S K AA L ER SH IH P
+scholarships S K AA L ER SH IH P S
+scholastic S K AH L AE S T IH K
+scholberg SH OW L B ER G
+scholer SH OW L ER
+scholes S K OW L Z
+scholey SH OW L IY
+scholfield S K OW L F IY L D
+scholl SH AA L
+scholle SH OW L
+scholler SH AA L ER
+schollmeyer SH AA L M AY ER
+scholten SH OW L T AH N
+scholtes SH OW L T S
+scholtz SH OW L T S
+scholz SH OW L Z
+scholze SH OW L Z
+schomaker SH OW M EY K ER
+schomberg SH AA M B ER G
+schomburg SH AA M B ER G
+schomer SH OW M ER
+schommer SH AA M ER
+schon SH AA N
+schonberg SH AA N B ER G
+schonberger SH AA N B ER G ER
+schone SH OW N
+schoneman SH OW N M AH N
+schonfeld SH AA N F EH L D
+schons SH AA N Z
+schoo SH UW
+schoof SH UH F
+schook SH UH K
+school S K UW L
+school's S K UW L Z
+schoolbook S K UW L B UH K
+schoolbooks S K UW L B UH K S
+schoolboy S K UW L B OY
+schoolboys S K UW L B OY Z
+schoolbus S K UW L B AH S
+schoolchild S K UW L CH AY L D
+schoolchildren S K UW L CH IH L D R AH N
+schoolcraft S K UW L K R AE F T
+schooled S K UW L D
+schooler S K UW L ER
+schoolers S K UW L ER Z
+schooley S K UW L IY
+schoolfield S K UW L F IY L D
+schoolhouse S K UW L HH AW S
+schooling S K UW L IH NG
+schoolmaster S K UW L M AE S T ER
+schoolmate S K UW L M EY T
+schoolmates S K UW L M EY T S
+schoolroom S K UW L R UW M
+schools S K UW L Z
+schools' S K UW L Z
+schoolteacher S K UW L T IY CH ER
+schoolteachers S K UW L T IY CH ER Z
+schooltime S K UW L T AY M
+schoolwork S K UW L W ER K
+schoolyard S K UW L Y AA R D
+schoon S K UW N
+schooner S K UW N ER
+schooners S K UW N ER Z
+schoonmaker SH UW N M EY K ER
+schoonover SH UW N AH V ER
+schopf SH AA P F
+schopfer SH AA P F ER
+schopp SH AA P
+schoppe SH AA P
+schor SH AO R
+schork SH AO R K
+schorn SH AO R N
+schorr SH AO R
+schorr's SH AO R Z
+schorsch SH AO R SH
+schott SH AA T
+schott's SH AA T S
+schottenstein SH AA T AH N S T IY N
+schottenstein(2) SH AA T AH N S T AY N
+schou SH UW
+schouten SH AA UW T AH N
+schow SH AW
+schowalter SH AW AH L T ER
+schrack SH R AE K
+schrade SH R EY D
+schrader SH R EY D ER
+schraeder SH R EH D ER
+schrag SH R AE G
+schrage SH R EY JH
+schrager SH R EY G ER
+schram SH R AE M
+schramm SH R AE M
+schrandt SH R AE N T
+schrank SH R AE NG K
+schrantz SH R AE N T S
+schranz SH R AE N S
+schraufnagel SH R AW F N AH G AH L
+schrecengost SH R EH S IH NG G AH S T
+schreck SH R EH K
+schreckengost SH R EH K IH NG G AH S T
+schrecongost SH R EH K AH NG G AH S T
+schreder SH R IY D ER
+schreffler SH R EH F AH L ER
+schreffler(2) SH R EH F L ER
+schreger SH R EH G ER
+schreiber SH R AY B ER
+schreibman SH R AY B M AH N
+schreier SH R AY ER
+schreifels SH R AY F AH L Z
+schreiner SH R AY N ER
+schreiter SH R AY T ER
+schremp SH R EH M P
+schrempf SH R EH M P F
+schrempp SH R EH M P
+schrenk SH R EH NG K
+schreur SH R ER
+schreurs SH R ER Z
+schreyer SH R AY R
+schriber SH R AY B ER
+schrick SH R IH K
+schricker SH R IH K ER
+schrieber SH R IY B ER
+schriefer SH R IY F ER
+schrier SH R AY ER
+schriever SH R IY V ER
+schrimpf SH R IH M P F
+schrimsher SH R IH M SH ER
+schriner SH R AY N ER
+schriver SH R AY V ER
+schroader SH R OW D ER
+schrock SH R AA K
+schroder SH R OW D ER
+schroders SH R OW D ER Z
+schrodt SH R AA T
+schroeck SH R OW K
+schroeder SH R OW D ER
+schroeder's SH R OW D ER Z
+schroedl SH R OW D AH L
+schroepfer SH R OW P F ER
+schroer SH R OW ER
+schroeter SH R OW T ER
+schroff SH R AO F
+schroll SH R OW L
+schrom SH R AA M
+schronce SH R AA N S
+schropp SH R AA P
+schroth SH R AO TH
+schroyer SH R OY ER
+schrum SH R AH M
+schrumpf SH R AH M P F
+schrupp SH R AH P
+schryer SH R AY ER
+schryver SH R AY V ER
+schtick SH T IH K
+schubach SH AH B AA K
+schubel SH UW B AH L
+schubert SH UW B ER T
+schubert's SH UW B ER T S
+schubring SH AH B ER IH NG
+schuch SH AH K
+schuchard SH AH K ER D
+schuchardt SH AH K AA R T
+schuchart SH AH K HH AA R T
+schuchert S K AH CH ER T
+schuchman SH AH K M AH N
+schuchmann SH AH K M AH N
+schuck SH AH K
+schucker SH AH K ER
+schuckman SH AH K M AH N
+schue SH UW
+schuele SH UW L
+schueler SH UW L ER
+schuelke SH UW L K
+schueller SH UW L ER
+schueneman SH UW N AH M AH N
+schuenemann SH UW N AH M AH N
+schuerman SH UW ER M AH N
+schuermann SH UW ER M AH N
+schuessler SH UW S L ER
+schuett S K UW T
+schuette S K UW T
+schuetz SH UW T S
+schuetze SH UW T S
+schuff SH AH F
+schug SH AH G
+schuh SH UW
+schuhmacher SH UW M AA K ER
+schuhmann SH UW M AH N
+schuitema SH UW T IH M AH
+schuknecht SH AH K N IH K T
+schul SH UH L
+schuld SH UH D
+schuldener SH UW L D AH N ER
+schuldener's SH UW L D AH N ER Z
+schulder SH UW L D ER
+schuldt SH UH L T
+schulenberg SH UW L AH N B ER G
+schulenburg SH UW L AH N B ER G
+schuler SH UW L ER
+schulhauf SH UW L HH AA F
+schulhaufs SH UW L HH AA F S
+schulhof SH UW L HH AO F
+schulke SH UH L K IY
+schull SH UH L
+schuller SH UW L ER
+schulman SH UW L M AH N
+schulof SH UW L AO F
+schult SH AH L T
+schulte SH AH L T
+schulten SH AH L T AH N
+schultes SH AH L T S
+schultheis SH AH L DH AY Z
+schultheiss SH AH L TH AY S
+schultz SH UH L T S
+schultze SH AH L T Z
+schulz SH UH L T S
+schulze SH UH L T S
+schum SH AH M
+schumacher SH UW M AA K ER
+schumacker SH UW M AA K ER
+schumaker SH UW M EY K ER
+schuman SH UW M AH N
+schumann SH UW M AH N
+schumann's SH UW M AH N Z
+schumer SH UW M ER
+schumer's SH UW M ER Z
+schumm SH AH M
+schumpert SH AH M P ER T
+schundler SH AH N D L ER
+schuneman SH UW N M AH N
+schunk SH AH NG K
+schupak SH UW P AE K
+schupbach SH AH P B AA K
+schupp SH AH P
+schur SH ER
+schuring SH ER IH NG
+schurman SH ER M AH N
+schurr SH ER
+schurrenberg SH ER AH N B ER G
+schussler SH AH S L ER
+schuster SH UW S T ER
+schut SH AH T
+schuth SH UW TH
+schutt SH AH T
+schutte S K AH T
+schutter SH AH T ER
+schuttler SH AH T L ER
+schutz SH AH T S
+schutz's SH AH T S IH Z
+schutzman SH AH T Z M AH N
+schuur SH UH R
+schuyler S K AY L ER
+schuylkill S K Y UW L K IH L
+schwab SH W AA B
+schwab's SH W AA B Z
+schwabe SH W AO B
+schwaderer SH W AO D ER ER
+schwager SH W EY G ER
+schwahn SH W AO N
+schwaiger SH W AY G ER
+schwake SH W EY K
+schwalb SH W AO L B
+schwalbach SH W AO L B AA K
+schwalbe SH W AO L B
+schwalier SH W AA L Y ER
+schwall SH W AO L
+schwaller SH W AO L ER
+schwalm SH W AA L M
+schwam SH W AO M
+schwan SH W AO N
+schwandt SH W AO N T
+schwanke SH W AO NG K
+schwantes SH W AO N T S
+schwanz SH W AO N S
+schwark SH W AO R K
+schwarm SH W AO R M
+schwartz SH W AO R T S
+schwartzberg SH W AO R T S B ER G
+schwartzberg's SH W AO R T S B ER G Z
+schwartzchild SH W AO R T S CH AY L D
+schwartzkopf SH W AO R T S K AO P F
+schwartzkopf(2) SH W AO R T S K AO F
+schwartzman SH W AO R T S M AH N
+schwarz SH W AO R T S
+schwarze SH W AO R T S
+schwarzenegger SH W AO R Z AH N EY G ER
+schwarzenegger's SH W AO R Z AH N EY G ER Z
+schwarzer SH W AO R T S ER
+schwarzkopf SH W AO R T S K AO P F
+schwarzkopf's SH W AO R T S K AO P F S
+schwarzkopf's(2) SH W AO R T S K AO F S
+schwarzkopf(2) SH W AO R T S K AO F
+schwarzman SH W AO R T S M AH N
+schwebach SH W EH B AA K
+schwebel SH W EH B AH L
+schwebke SH W EH B K
+schwed SH W EH D
+schweda SH W IY D AH
+schwede SH W IY D
+schweder SH W IY D ER
+schweer SH W IH R
+schweers SH W IH R Z
+schwegel SH W EH G AH L
+schwegler SH W EH G AH L ER
+schwegler(2) SH W EH G L ER
+schwegman SH W EH G M AH N
+schweich SH W AY K
+schweickert SH W AY K ER T
+schweiger SH W AY G ER
+schweigert SH W AY G ER T
+schweighardt SH W AY G HH AA R T
+schweikert SH W AY K ER T
+schweinsberg SH W AY N S B ER G
+schweiss SH W AY S
+schweitzer SH W AY T S ER
+schweitzer's SH W AY T S ER Z
+schweizer SH W AY Z ER
+schweizerische SH W AY Z ER IH SH
+schwemm SH W EH M
+schwemmer SH W EH M ER
+schwendeman SH W EH N D M AH N
+schwenk SH W EH NG K
+schwenke SH W EH NG K
+schwenker SH W EH NG K ER
+schwenn SH W EH N
+schwent SH W EH N T
+schweppe SH W EH P
+schweppes SH W EH P S
+schwer SH W ER
+schwerdloff SH W ER D L AO F
+schwerdt SH W ER T
+schwerdtfeger SH W ER T F EY G ER
+schwerin SH W EH R IH N
+schwering SH W IH R IH NG
+schwerner SH W ER N ER
+schwerner's SH W ER N ER Z
+schwertfeger SH W ER T F IH G ER
+schwertner SH W ER T N ER
+schwichtenberg SH W IH K T AH N B ER G
+schwieger SH W IY G ER
+schwier SH W AY ER
+schwiesow SH W IY S OW
+schwieterman SH W IY T ER M AH N
+schwimmer SH W IH M ER
+schwind SH W IH N D
+schwindt SH W IH N T
+schwing SH W IH NG
+schwinger SH W IH NG ER
+schwinn SH W IH N
+schwisow SH W IH S OW
+schwoerer SH W OW ER ER
+sci S IY
+sci(2) EH S S IY AY
+sciacca S K AO K AA
+scialabba S K AO L AA B AH
+scialdone SH AO L D OW N IY
+sciandra SH AO N D R AH
+scianna SH AO N AH
+sciara SH AA R AH
+sciaroni S IY ER OW N IY
+sciarra S IY AA R AH
+sciarrino SH ER IY N OW
+sciascia SH AO S CH AH
+scibelli S IH B EH L IY
+scibilia S IH B IY L IY AH
+scicchitano S IH K IH T AA N OW
+sciclone S IH K L OW N IY
+scicom S IH K AA M
+science S AY AH N S
+science's S AY AH N S IH Z
+sciences S AY AH N S AH Z
+sciences' S AY AH N S IH Z
+sciences(2) S AY AH N S IH Z
+scientific S AY AH N T IH F IH K
+scientific's S AY AH N T IH F IH K S
+scientifically S AY AH N T IH F IH K AH L IY
+scientifically(2) S AY AH N T IH F IH K L IY
+scientifics S AY AH N T IH F IH K S
+scientist S AY AH N T IH S T
+scientist's S AY AH N T IH S T S
+scientists S AY AH N T IH S T S
+scientists' S AY AH N T IH S T S
+scientists(2) S AY N T IH S T S
+scientists(3) S AY N T IH S
+scientists(4) S AY AH N T IH S
+scientologist S AY AH N T AA L AH JH AH S T
+scientologists S AY AH N T AA L AH JH AH S T S
+scientology S AY AH N T AA L AH JH IY
+scifres S AY F ER Z
+scilla S IH L AH
+scillas S IH L AH Z
+scimeca S IH M EH K AH
+scimeca(2) S AY M EH K AH
+scimed S AY M EH D
+scimone S IH M OW N
+scinta S IH N T AH
+scintilla S IH N T IH L AH
+scintilore S IH N T AH L AO R IY
+scinto S IH N T OW
+scioli S IY OW L IY
+scion S AY AH N
+sciortino S IY AO R T IY N OW
+scios S K AY OW S
+scioto S K IY OW T OW
+scipio S IH P IY OW
+scipione S IH P IY OW N IY
+scire S AY R
+scism S K IH Z AH M
+scissor S IH Z ER
+scissors S IH Z ER Z
+scitex S IY T EH K S
+sciulli S IY UW L IY
+sciullo S IY UW L OW
+sciuto S IY UW T OW
+sclafani S K L AA F AA N IY
+scleroderma S K L IH R AH D ER M AH
+sclerosis S K L ER OW S AH S
+scobee S K AA B IY
+scobey S K OW B IY
+scobie S K AA B IY
+scoby S K OW B IY
+scocozza S K AA K AA Z AH
+scoff S K AO F
+scoffed S K AO F T
+scoffield S K AO F IY L D
+scofflaws S K AA F L AO Z
+scoffs S K AO F S
+scofield S K OW F IY L D
+scoggin S K AA G IH N
+scoggins S K AA G IH N Z
+scogin S K OW G IH N
+scohier S K OW Y ER
+scola S K OW L AH
+scolari S K OW L AA R IY
+scolaro S K OW L AA R OW
+scold S K OW L D
+scolded S K OW L D AH D
+scolded(2) S K OW L D IH D
+scolding S K OW L D IH NG
+scolds S K OW L D Z
+scoles S K OW L Z
+scolia S K OW L Y AH
+scoma S K OW M AH
+sconc S K AA N S
+sconce S K AA N S
+sconces S K AA N S IH Z
+scone S K OW N
+scones S K OW N Z
+sconiers S K AO N IY ER Z
+sconnix S K AA N IH K S
+sconyers S K AO N IY ER Z
+scooby S K UW B IY
+scoop S K UW P
+scooped S K UW P T
+scooper S K UW P ER
+scooping S K UW P IH NG
+scoops S K UW P S
+scoot S K UW T
+scooter S K UW T ER
+scooters S K UW T ER Z
+scoots S K UW T S
+scope S K OW P
+scopes S K OW P S
+scopic S K AA P IH K
+scoping S K OW P IH NG
+scopolamine S K AO P AH L AH M IY N
+scopolamine(2) S K OW P L AH M IY N
+scor S K AO R
+scorch S K AO R CH
+scorched S K AO R CH T
+scorcher S K AO R CH ER
+scorching S K AO R CH IH NG
+score S K AO R
+scoreboard S K AO R B AO R D
+scorecard S K AO R K AA R D
+scorecards S K AO R K AA R D Z
+scored S K AO R D
+scorekeeper S K AO R K IY P ER
+scorekeepers S K AO R K IY P ER Z
+scorekeeping S K AO R K IY P IH NG
+scoreless S K AO R L AH S
+scorer S K AO R ER
+scorers S K AO R ER Z
+scores S K AO R Z
+scoring S K AO R IH NG
+scorn S K AO R N
+scorned S K AO R N D
+scornful S K AO R N F AH L
+scorns S K AO R N Z
+scorpio S K AO R P IY OW
+scorpion S K AO R P IY AH N
+scorpions S K AO R P IY AH N Z
+scorsese S K AO R S IY Z
+scorsese's S K AO R S IY Z IH Z
+scorsese's(2) S K AO R S EY Z IY Z
+scorsese(2) S K AO R S EY Z IY
+scorsone S K AO R S AH N
+scortese S K AO R T IY Z
+scortese(2) S K AO R T IY Z IY
+scorza S K AO R Z AH
+scot S K AA T
+scotch S K AA CH
+scotched S K AA CH T
+scotches S K AA CH IH Z
+scotchgard S K AA CH G AA R D
+scotia S K OW SH AH
+scotia's S K OW SH AH Z
+scotland S K AA T L AH N D
+scotland's S K AA T L AH N D Z
+scots S K AA T S
+scotsman S K AA T S M AH N
+scott S K AA T
+scott's S K AA T S
+scotten S K AA T AH N
+scottie S K AA T IY
+scottish S K AA T IH SH
+scotto S K OW T OW
+scotto(2) S K AA T OW
+scotton S K AA T AH N
+scotts S K AA T S
+scottsbluff S K AA T S B L AH F
+scottsdale S K AA T S D EY L
+scotty S K AA T IY
+scotty's S K AA T IY Z
+scoundrel S K AW N D R AH L
+scoundrels S K AW N D R AH L Z
+scour S K AW ER
+scour(2) S K AW R
+scoured S K AW ER D
+scourge S K ER JH
+scourged S K ER JH D
+scourges S K ER JH IH Z
+scourging S K ER JH IH NG
+scouring S K AW ER IH NG
+scours S K AW ER Z
+scout S K AW T
+scout's S K AW T S
+scouted S K AW T AH D
+scouten S K AW T AH N
+scouter S K AW T ER
+scouters S K AW T ER Z
+scouting S K AW T IH NG
+scoutmaster S K AW T M AE S T ER
+scouts S K AW T S
+scovel S K OW V AH L
+scovell S K AA V AH L
+scovil S K OW V AH L
+scovill S K AA V AH L
+scoville S K OW V IH L
+scow S K AW
+scowcroft S K OW K R AO F T
+scowden S K AW D AH N
+scowl S K AW L
+scowled S K AW L D
+scowling S K AW L IH NG
+scozzafava S K OW T S AA F AA V AH
+scrabble S K R AE B AH L
+scragg S K R AE G
+scraggle S K R AE G AH L
+scraggly S K R AE G L IY
+scramble S K R AE M B AH L
+scrambled S K R AE M B AH L D
+scrambles S K R AE M B AH L Z
+scrambling S K R AE M B AH L IH NG
+scrambling(2) S K R AE M B L IH NG
+scranton S K R AE N T AH N
+scrap S K R AE P
+scrapbook S K R AE P B UH K
+scrapbooks S K R AE P B UH K S
+scrape S K R EY P
+scraped S K R EY P T
+scraper S K R EY P ER
+scrapers S K R EY P ER Z
+scrapes S K R EY P S
+scraping S K R EY P IH NG
+scrapings S K R EY P IH NG Z
+scrapiron S K R AE P AY ER N
+scrapped S K R AE P T
+scrapping S K R AE P IH NG
+scrappy S K R AE P IY
+scraps S K R AE P S
+scratch S K R AE CH
+scratched S K R AE CH T
+scratches S K R AE CH AH Z
+scratches(2) S K R AE CH IH Z
+scratching S K R AE CH IH NG
+scratchy S K R AE CH IY
+scrawl S K R AO L
+scrawled S K R AO L D
+scrawny S K R AO N IY
+scream S K R IY M
+screamed S K R IY M D
+screamer S K R IY M ER
+screamers S K R IY M ER Z
+screaming S K R IY M IH NG
+screamingly S K R IY M IH NG L IY
+screams S K R IY M Z
+screech S K R IY CH
+screeched S K R IY CH T
+screeches S K R IY CH IH Z
+screeching S K R IY CH IH NG
+screed S K R IY D
+screen S K R IY N
+screened S K R IY N D
+screener S K R IY N ER
+screeners S K R IY N ER Z
+screening S K R IY N IH NG
+screenings S K R IY N IH NG Z
+screenplay S K R IY N P L EY
+screenplays S K R IY N P L EY Z
+screens S K R IY N Z
+screenwriter S K R IY N R AY T ER
+screenwriters S K R IY N R AY T ER Z
+screenwriting S K R IY N R AY T IH NG
+screw S K R UW
+screwball S K R UW B AO L
+screwdriver S K R UW D R AY V ER
+screwdrivers S K R UW D R AY V ER Z
+screwed S K R UW D
+screwing S K R UW IH NG
+screws S K R UW Z
+screwy S K R UW IY
+scribble S K R IH B AH L
+scribbled S K R IH B AH L D
+scribbler S K R IH B L ER
+scribblers S K R IH B L ER Z
+scribbles S K R IH B AH L Z
+scribbling S K R IH B AH L IH NG
+scribbling(2) S K R IH B L IH NG
+scribe S K R AY B
+scriber S K R AY B ER
+scribes S K R AY B Z
+scribner S K R IH B N ER
+scribner's S K R IH B N ER Z
+scribners S K R IH B N ER Z
+scrimgeour S K R IH M G AO R
+scrimmage S K R IH M IH JH
+scrimp S K R IH M P
+scrimping S K R IH M P IH NG
+scrimshaw S K R IH M SH AO
+scrip S K R IH P
+scripp S K R IH P
+scripp's S K R IH P S
+scripps S K R IH P S
+script S K R IH P T
+scripted S K R IH P T IH D
+scripts S K R IH P T S
+scripts(2) S K R IH P S
+scriptural S K R IH P CH ER AH L
+scripture S K R IH P CH ER
+scriptures S K R IH P CH ER Z
+scriptwriter S K R IH P T R AY T ER
+scriptwriters S K R IH P T R AY T ER Z
+scriptwriting S K R IH P T R AY T IH NG
+scritchfield S K R IH CH F IY L D
+scriven S K R IH V IH N
+scrivener S K R IH V N ER
+scrivens S K R AY V AH N Z
+scriver S K R AY V ER
+scrivner S K R IH V N ER
+scrod S K R AA D
+scroggin S K R AA G IH N
+scroggins S K R AA G IH N Z
+scroggs S K R AA G Z
+scrogham S K R AA G HH AH M
+scroll S K R OW L
+scrolls S K R OW L Z
+scronce S K R AA N S
+scrooge S K R UW JH
+scrotten S K R AO T IH N
+scrounge S K R AW N JH
+scrounged S K R AW N JH D
+scrounging S K R AW N JH IH NG
+scrub S K R AH B
+scrubbed S K R AH B D
+scrubber S K R AH B ER
+scrubbers S K R AH B ER Z
+scrubbing S K R AH B IH NG
+scrubby S K R AH B IY
+scruffy S K R AH F IY
+scruggs S K R AH G Z
+scrunch S K R AH N CH
+scrunched S K R AH N CH T
+scruple S K R UW P AH L
+scruples S K R UW P AH L Z
+scrupulous S K R UW P Y AH L AH S
+scrupulously S K R UW P Y AH L AH S L IY
+scrutinize S K R UW T AH N AY Z
+scrutinized S K R UW T AH N AY Z D
+scrutinizes S K R UW T AH N AY Z IH Z
+scrutinizing S K R UW T AH N AY Z IH NG
+scrutiny S K R UW T AH N IY
+scruton S K R UW T AH N
+scrutton S K R AH T AH N
+scrutton's S K R AH T AH N Z
+scuba S K UW B AH
+scud S K AH D
+scudder S K AH D ER
+scudder's S K AH D ER Z
+scuderi S K UW D EH R IY
+scuds S K AH D Z
+scuff S K AH F
+scuffed S K AH F T
+scuffle S K AH F AH L
+scuffled S K AH F AH L D
+scuffles S K AH F AH L Z
+scuffling S K AH F AH L IH NG
+scull S K AH L
+sculley S K AH L IY
+sculley's S K AH L IY Z
+scullin S K AH L IH N
+scullion S K AH L Y AH N
+scully S K AH L IY
+sculpt S K AH L P T
+sculpted S K AH L P T IH D
+sculpting S K AH L P T IH NG
+sculptor S K AH L P T ER
+sculptors S K AH L P T ER Z
+sculpts S K AH L P T S
+sculptural S K AH L P CH ER AH L
+sculpture S K AH L P CH ER
+sculptured S K AH L P CH ER D
+sculptures S K AH L P CH ER Z
+sculpturing S K AH L P T ER IH NG
+sculpturing(2) S K AH L P CH ER IH NG
+scum S K AH M
+scupper S K AH P ER
+scuppernong S K AH P ER N AO NG
+scurdall S K ER D AA L
+scurdell S K ER D EH L
+scurlock S K ER L AH K
+scurried S K ER IY D
+scurrilous S K ER AH L AH S
+scurry S K ER IY
+scurrying S K ER IY IH NG
+scutt S K AH T
+scuttle S K AH T AH L
+scuttlebutt S K AH T AH L B AH T
+scuttled S K AH T AH L D
+scuttling S K AH T AH L IH NG
+scuttling(2) S K AH T L IH NG
+scylla S IH L AH
+scythe S IH TH
+scythe(2) S AY TH
+scythian S IH TH IY AH N
+sczechuan S EH CH UW AA N
+sczepanski S IH P AE N S K IY
+sdn EH S D IY EH N
+se S AW TH IY S T
+se(2) S EY
+se(3) EH S IY
+sea S IY
+sea's S IY Z
+seabaugh S IY B AO
+seabeach S IY B IY CH
+seabed S IY B EH D
+seabee S IY B IY
+seabees S IY B IY Z
+seaberg S IY B ER G
+seaberry S IY B EH R IY
+seabert S IY B ER T
+seaboard S IY B AO R D
+seabold S IY B OW L D
+seabolt S IY B OW L T
+seaborn S IY B ER N
+seaborne S IY B AO R N
+seabright S IY B R AY T
+seabrook S IY B R UH K
+seabrook's S IY B R UH K S
+seabrooks S IY B R UH K S
+seaburg S IY B ER G
+seabury S IY B EH R IY
+seaco S IY K OW
+seacoast S IY K OW S T
+seader S IY D ER
+seadrift S IY D R IH F T
+seafarer S IY F EH R ER
+seafarers S IY F EH R ER Z
+seafirst S IY F ER S T
+seafood S IY F UW D
+seafoods S IY F UW D Z
+seaford S IY F ER D
+seafront S IY F R AH N T
+seaga S IY G AH
+seagal S IH G AA L
+seagate S IY G EY T
+seagate's S IY G EY T S
+seager S IY G ER
+seagle S IY G AH L
+seago S IY G OW
+seagoing S IY G OW IH NG
+seagram S IY G R AH M
+seagram's S IY G R AH M Z
+seagrams S IY G R AH M Z
+seagrams' S IY G R AH M Z
+seagrave S IY G R EY V
+seagraves S IY G R EY V Z
+seagren S IY G R EH N
+seagrove S IY G R OW V
+seagroves S IY G R OW V Z
+seagull S IY G AH L
+seagull's S IY G AH L Z
+seagulls S IY G AH L Z
+seahawk S IY HH AO K
+seahawks S IY HH AO K S
+seaholm S IY HH OW M
+seal S IY L
+seal's S IY L Z
+sealand S IY L AE N D
+sealand's S IY L AE N D Z
+sealant S IY L AH N T
+sealants S IY L AH N T S
+seale S IY L
+sealed S IY L D
+sealer S IY L ER
+seales S IY L Z
+sealey S IY L IY
+sealey's S IY L IY Z
+sealift S IY L IH F T
+sealing S IY L IH NG
+sealock S IY L AA K
+seals S IY L Z
+sealtest S IY L T EH S T
+sealy S IY L IY
+seam S IY M
+seaman S IY M AH N
+seaman's S IY M AH N Z
+seamans S IY M AH N Z
+seamen S IY M AH N
+seamen's S IY M AH N Z
+seamless S IY M L AH S
+seamlessly S IY M L AH S L IY
+seamon S IY M AH N
+seamons S IY M AH N Z
+seams S IY M Z
+seamster S IY M S T ER
+seamstress S IY M S T R IH S
+seamstresses S IY M S T R AH S AH Z
+seamus SH EY M AH S
+seamy S IY M IY
+sean SH AO N
+sean's SH AO N Z
+seanang SH AA N AH NG
+seanangs SH AA N AH NG Z
+seance S EY AA N S
+seanor S IY N ER
+seaport S IY P AO R T
+seaports S IY P AO R T S
+seapower S IY P AW ER
+seaq S IY K
+seaquest S IY K W EH S T
+seaquist S IY K W IH S T
+sear S IH R
+search S ER CH
+searched S ER CH T
+searcher S ER CH ER
+searchers S ER CH ER Z
+searches S ER CH IH Z
+searching S ER CH IH NG
+searchlight S ER CH L AY T
+searchlights S ER CH L AY T S
+searcy S ER S IY
+seared S IH R D
+searfoss S ER F AH S
+searight S IH R AY T
+searing S IH R IH NG
+searl S ER L
+searle S ER L
+searle's S ER L Z
+searles S ER L Z
+searls S ER L Z
+sears S IH R Z
+sears' S IH R Z
+sears's S IH R Z IH Z
+sears's(2) S IH R Z
+searson S ER S AH N
+seas S IY Z
+sease S IY Z
+seashell S IY SH EH L
+seashells S IY SH EH L Z
+seashore S IY SH AO R
+seasick S IY S IH K
+seaside S IY S AY D
+season S IY Z AH N
+season's S IY Z AH N Z
+seasonable S IY Z AH N AH B AH L
+seasonal S IY Z AH N AH L
+seasonality S IY Z AH N AE L IH T IY
+seasonally S IY Z AH N AH L IY
+seasonally(2) S IY Z N AH L IY
+seasoned S IY Z AH N D
+seasoning S IY Z AH N IH NG
+seasonings S IY Z AH N IH NG Z
+seasons S IY Z AH N Z
+seastrand S IY S T R AE N D
+seastrom S IY S T R AH M
+seat S IY T
+seat's S IY T S
+seatbelt S IY T B EH L T
+seatbelts S IY T B EH L T S
+seated S IY T AH D
+seated(2) S IY T IH D
+seater S IY T ER
+seating S IY T IH NG
+seatings S IY T IH NG Z
+seato S IY T OW
+seaton S IY T AH N
+seatrain S IY T R EY N
+seats S IY T S
+seattle S IY AE T AH L
+seattle's S IY AE T AH L Z
+seaver S IY V ER
+seavers S IY V ER Z
+seavey S IY V IY
+seaward S IY W ER D
+seawater S IY W AA T ER
+seawater(2) S IY W AO T ER
+seaway S IY W EY
+seaweed S IY W IY D
+seaweeds S IY W IY D Z
+seawell S IY W EH L
+seawolf S IY W UH L F
+seawolf's S IY W UH L F S
+seaworthy S IY W AO R DH IY
+seawright S IY R AY T
+seay S EY
+sebaceous S AH B EY SH AH S
+sebald S IY B AO L D
+sebastian S AH B AE S CH AH N
+sebastian's S AH B AE S CH AH N Z
+sebastiana S AH B AE S T IY AA N AH
+sebastiane S AH B AE S T IY EH N
+sebastiani S AH B AE S T IY AA N IY
+sebastiani(2) S AH B AE S T Y AA N IY
+sebastianis S AH B AE S T IY AA N IY Z
+sebastianis(2) S AH B AE S T Y AA N IY Z
+sebby S EH B IY
+sebek S EH B IH K
+seber S IY B ER
+sebert S EH B ER T
+sebesta S EH B EH S T AH
+sebi S EH B IY
+sebo S EH B OW
+sebold S EH B OW L D
+sebree S IH B R IY
+sebring S IY B R IH NG
+sec S EH K
+secada S AH K AA D AH
+secateur S EY K AH T ER
+secateurs S EY K AH T ER Z
+secaucus S IH K AO K AH S
+secchia S EH K IY AH
+secede S IH S IY D
+seceded S IH S IY D IH D
+seceding S IH S IY D IH NG
+secession S IH S EH SH AH N
+secessionist S IH S EH SH AH N IH S T
+secessionists S IH S EH SH AH N IH S T S
+secessionists(2) S IH S EH SH AH N IH S S
+secessionists(3) S IH S EH SH AH N IH S
+sechler S EH K L ER
+sechrest S EH K ER IH S T
+sechrist S EH K ER IH S T
+sechrist(2) S IY K R IH S T
+seck S EH K
+seckel S EH K AH L
+seckinger S EH K IH NG ER
+seckler S EH K L ER
+seckman S EH K M AH N
+seclude S AH K L UW D
+secluded S IH K L UW D IH D
+seclusion S IH K L UW ZH AH N
+seco S EH K OW
+secom S EH K AA M
+secomerica S EH K OW M EH R IH K AH
+second S EH K AH N D
+second's S EH K AH N D Z
+second(2) S EH K AH N
+secondaries S EH K AH N D EH R IY Z
+secondarily S EH K AH N D EH R AH L IY
+secondary S EH K AH N D EH R IY
+seconded S EH K AH N D IH D
+seconded(2) S EH K AH N AH D
+secondhand S EH K AH N D HH AE N D
+secondhand(2) S EH K AH N HH AE N D
+secondly S EH K AH N D L IY
+secondly(2) S EH K AH N L IY
+seconds S EH K AH N D Z
+seconds(2) S EH K AH N Z
+secor S EH K ER
+secord S IY K AO R D
+secord's S IY K AO R D Z
+secoy S EH K OY
+secrecy S IY K R AH S IY
+secrest S EH K ER IH S T
+secret S IY K R AH T
+secret(2) S IY K R IH T
+secretarial S EH K R AH T EH R IY AH L
+secretariat S EH K R IH T EH R IY AH T
+secretaries S EH K R AH T EH R IY Z
+secretaries' S EH K R IH T EH R IY Z
+secretary S EH K R AH T EH R IY
+secretary's S EH K R AH T EH R IY Z
+secrete S IH K R IY T
+secreted S AH K R IY T AH D
+secretion S AH K R IY SH AH N
+secretions S AH K R IY SH AH N Z
+secretive S IY K R AH T IH V
+secretiveness S IY K R AH T IH V N AH S
+secretly S IY K R IH T L IY
+secrets S IY K R AH T S
+secrets(2) S IY K R IH T S
+secrist S EH K ER IH S T
+sect S EH K T
+sect's S EH K T S
+sectarian S EH K T EH R IY AH N
+sectarianism S EH K T EH R IY AH N IH Z AH M
+secteur S EH K T UW R
+section S EH K SH AH N
+section's S EH K SH AH N Z
+sectional S EH K SH AH N AH L
+sectioned S EH K SH AH N D
+sectioning S EH K SH AH N IH NG
+sections S EH K SH AH N Z
+sector S EH K T ER
+sector's S EH K T ER Z
+sectoral S EH K T ER AH L
+sectors S EH K T ER Z
+sects S EH K T S
+secular S EH K Y AH L ER
+secularism S EH K Y AH L ER IH Z AH M
+secularist S EH K Y AH L ER IH S T
+secularists S EH K Y AH L ER IH S T S
+secularists(2) S EH K Y AH L ER IH S S
+secularists(3) S EH K Y AH L ER IH S
+secularized S EH K Y AH L ER AY Z D
+seculow S EH K Y AH L OW
+secunda S IH K AH N D AH
+secure S IH K Y UH R
+secured S IH K Y UH R D
+securely S IH K Y UH R L IY
+secures S IH K Y UH R Z
+securing S IH K Y UH R IH NG
+securities S IH K Y UH R AH T IY Z
+securities' S IH K Y UH R AH T IY Z
+securitization S IH K Y UH R AH T AH Z EY SH AH N
+securitize S IH K Y UH R AH T AY Z
+securitized S IH K Y UH R AH T AY Z D
+securitizing S IH K Y UH R AH T AY Z IH NG
+security S IH K Y UH R AH T IY
+security's S IH K Y UH R AH T IY Z
+seda S EY D AH
+sedalia S AH D EY L Y AH
+sedam S EH D AH M
+sedan S AH D AE N
+sedano S EY D AA N OW
+sedans S IH D AE N Z
+sedate S IH D EY T
+sedated S IH D EY T IH D
+sedately S IH D EY T L IY
+sedates S IH D EY T S
+sedating S AH D EY T IH NG
+sedation S AH D EY SH AH N
+sedative S EH D AH T IH V
+sedberry S EH D B EH R IY
+sedco S EH D K OW
+seddon S EH D AH N
+sedentary S EH D AH N T EH R IY
+seder S EY D ER
+sedge S EH JH
+sedgewick S EH JH W IH K
+sedgley S EH JH L IY
+sedgwick S EH JH W IH K
+sedillo S EH D IH L OW
+sediment S EH D AH M AH N T
+sedimentary S EH D AH M EH N T ER IY
+sedimentation S EH D AH M AH N T EY SH AH N
+sediments S EH D AH M AH N T S
+sedita S EH D IY T AH
+sedition S IH D IH SH AH N
+seditious S IH D IH SH AH S
+sedivy S EH D IH V IY
+sedlacek S EH D L AH S IH K
+sedlack S EH D L AH K
+sedlak S EH D L AH K
+sedlar S EH D L ER
+sedler S EH D L ER
+sedlock S EH D L AH K
+sedona S AH D OW N AH
+sedor S EH D AO R
+sedore S EH D AO R IY
+seduce S IH D UW S
+seduced S IH D UW S T
+seducer S IH D UW S ER
+seducing S IH D UW S IH NG
+seduction S IH D AH K SH AH N
+seductive S IH D AH K T IH V
+seductively S AH D AH K T IH V L IY
+sedum S EH D AH M
+sedums S EH D AH M Z
+sedwick S EH D W IH K
+see S IY
+see-kiong S IY K Y AO NG
+seebach S IY B AA K
+seebeck S IY B EH K
+seeber S IY B ER
+seeberger S IY B ER G ER
+seebold S IY B OW L D
+seeburger S IY B ER G ER
+seed S IY D
+seed's S IY D Z
+seedeater S IY D IY T ER
+seedeaters S IY D IY T ER Z
+seeded S IY D AH D
+seeded(2) S IY D IH D
+seeding S IY D IH NG
+seedling S IY D L IH NG
+seedlings S IY D L IH NG Z
+seedorf S IY D AO R F
+seedpod S IY D P AA D
+seeds S IY D Z
+seedsman S IY D Z M AH N
+seedy S IY D IY
+seefeld S IY F EH L D
+seefeldt S IY F IH L T
+seegars S IY G ER Z
+seeger S IY G ER
+seegers S IY G ER Z
+seegert S IY G ER T
+seegmiller S IY G M IH L ER
+seehafer S IY HH AH F ER
+seehusen S IY HH UW S AH N
+seeing S IY IH NG
+seek S IY K
+seekamp S IY K AE M P
+seeker S IY K ER
+seeker's S IY K ER Z
+seekers S IY K ER Z
+seeking S IY K IH NG
+seekins S IY K IH N Z
+seekonk S IY K AA NG K
+seeks S IY K S
+seel S IY L
+seelbach S IY L B AA K
+seelert S IY L ER T
+seeley S IY L IY
+seelig S IY L IH G
+seelig's S IY L IH G Z
+seeling S IY L IH NG
+seelinger S IY L IH NG ER
+seelman S IY L M AH N
+seely S IY L IY
+seelye S IY L AY
+seem S IY M
+seema S IY M AA
+seemala S IY M AH L AH
+seeman S IY M AH N
+seemann S IY M AH N
+seemed S IY M D
+seeming S IY M IH NG
+seemingly S IY M IH NG L IY
+seems S IY M Z
+seen S IY N
+seep S IY P
+seepage S IY P IH JH
+seeped S IY P T
+seeping S IY P IH NG
+seeps S IY P S
+seer S IY R
+seers S IY R Z
+seery S IY R IY
+sees S IY Z
+seesaw S IY S AO
+seesawed S IY S AO D
+seesawing S IY S AO IH NG
+seese S IY Z
+seethe S IY DH
+seething S IY TH IH NG
+seetin S IY T IH N
+seeton S IY T AH N
+seever S IY V ER
+seevers S IY V ER Z
+seewald S IY W AO L D
+sefcik S EH F S IH K
+seff S EH F
+sefton S EH F T AH N
+sega S IY G AH
+sega's S EY G AH Z
+sega(2) S EY G AH
+segal S IY G AH L
+segalas S EH G AH L AH S
+segall S EY G AA L
+segar S IY G ER
+segarra S EH G AA R AH
+segars S EH G ER Z
+sege S EH JH
+segel S IY G AH L
+seger S IY G ER
+segers S IY G ER Z
+segerstrom S EH G ER S T R AH M
+segler S EH G L ER
+segment S EH G M AH N T
+segment's S EH G M AH N T S
+segment(2) S EH G M EH N T
+segmentation S EH G M AH N T EY SH AH N
+segmented S EH G M EH N T IH D
+segmented(2) S EH G M EH N IH D
+segments S EH G M AH N T S
+segments(2) S EH G M EH N T S
+segner S EH G N ER
+sego S IY G OW
+segovia S EH G OW V IY AH
+segraves S EY G R AA V EH S
+segregate S EH G R AH G EY T
+segregated S EH G R AH G EY T IH D
+segregating S EH G R IH G EY T IH NG
+segregation S EH G R AH G EY SH AH N
+segregationist S EH G R AH G EY SH AH N IH S T
+segregationists S EH G R AH G EY SH AH N IH S T S
+segregationists(2) S EH G R AH G EY SH AH N IH S S
+segregationists(3) S EH G R AH G EY SH AH N IH S
+segrest S EH G ER IH S T
+segrest(2) S IY G R EH S T
+segreto S EH G R EH T OW
+segue S EH G
+segue(2) S EH G W EY
+seguin S AH G IY N
+seguin(2) S IY G AH N
+segundo S EH G UH N D OW
+segur S EY G UH R
+segura S EY G UH R AH
+seguros S EY G Y ER OW Z
+seher S EH HH ER
+sehnert S EH N ER T
+sehorn S EH HH ER N
+sehr S EH R
+seib S IY B
+seibel S AY B AH L
+seiber S AY B ER
+seiberlich S AY B ER L IH K
+seiberling S AY B ER L IH NG
+seibert S AY B ER T
+seibold S AY B OW L D
+seibu S AY B UW
+seid S AY D
+seide S AY D
+seidel S AY D AH L
+seidell S AY D AH L
+seidelman S AY D AH L M AH N
+seiden S AY D AH N
+seidenberg S AY D AH N B ER G
+seider S AY D ER
+seiders S AY D ER Z
+seidl S AY D AH L
+seidler S AY D L ER
+seidman S AY D M AH N
+seidman's S AY D M AH N Z
+seidner S AY D N ER
+seier S AY ER
+seif S IY F
+seife S IY F
+seifer S AY F ER
+seifert S AY F ER T
+seiffert S AY F ER T
+seifried S AY F ER IY D
+seigal S IY G AH L
+seige S IY JH
+seigel S AY G AH L
+seigel(2) S IY G AH L
+seiger S AY G ER
+seigle S IY G AH L
+seigler S AY G AH L ER
+seigler(2) S IY G AH L ER
+seigler(3) S IY G L ER
+seigniorage S IY G N IY ER IH JH
+seiji S EY JH IY
+seiki S EY K IY
+seiko S EY K OW
+seil S AY L
+seiler S AY L ER
+seils S AY L Z
+seim S AY M
+sein S AY N
+seine S EY N IY
+seinfeld S AY N F EH L D
+seinfeld's S AY N F EH L D Z
+seip S IY P
+seipel S AY P AH L
+seiple S IY P AH L
+seipp S IY P
+seis S IY S
+seiser S AY S ER
+seismic S AY Z M IH K
+seismological S AY Z M AH L AO JH AH K AH L
+seismologist S AY Z M AA L AH JH AH S T
+seismologists S AY Z M AA L AH JH AH S T S
+seismologists(2) S AY Z M AA L AH JH AH S S
+seismologists(3) S AY Z M AA L AH JH AH S
+seismology S AY Z M AA L AH JH IY
+seita S EY T AH
+seitel S IY T EH L
+seiter S AY T ER
+seith S IY TH
+seither S AY DH ER
+seitman S IY T M AH N
+seitter S AY T ER
+seitz S AY T S
+seitzinger S AY T Z IH NG ER
+seivert S AY V ER T
+seiwert S AY W ER T
+seix S IY K S
+seixas S IY K S AH S
+seiyaku S EY Y AA K UW
+seiyu S IY Y UW
+seize S IY Z
+seized S IY Z D
+seizes S IY Z IH Z
+seizing S IY Z IH NG
+seizure S IY ZH ER
+seizures S IY ZH ER Z
+sejm S EY M
+sekerak S EH K ER AH K
+seki S EY K IY
+sekisui S EY K IH S UW IY
+seko S EH K OW
+seko's S EH K OW Z
+sekula S IH K UW L AH
+sekulow S EH K UW L OW
+sel S EH L
+sela S EH L AH
+selander S EH L AH N D ER
+selas S EH L AH S
+selassie S AH L AE S IY
+selbe S EH L B
+selberg S EH L B ER G
+selby S EH L B IY
+selchow S EH L CH AW
+selda S EH L D AH
+seldane S EH L D EY N
+selden S EH L D AH N
+selders S EH L D ER Z
+seldin S EH L D IH N
+seldom S EH L D AH M
+seldon S EH L D AH N
+select S AH L EH K T
+selected S AH L EH K T AH D
+selected(2) S AH L EH K T IH D
+selecting S AH L EH K T IH NG
+selection S AH L EH K SH AH N
+selections S AH L EH K SH AH N Z
+selective S AH L EH K T IH V
+selectively S AH L EH K T IH V L IY
+selectivity S IH L EH K T IH V AH T IY
+selectnet S AH L EH K T N EH T
+selects S AH L EH K T S
+selena S AH L IY N AH
+selena's S AH L IY N AH Z
+selene S AH L IY N
+selenite S EH L IH N AY T
+selenium S AH L IY N IY AH M
+seles S EH L EH S
+seles' S EH L EH S
+seley S IY L IY
+self S EH L F
+self's S EH L F S
+self-aggrandizement S EH L F AE G R AH N D AY Z M AH N T
+self-aggrandizing S EH L F AH G R AE N D AY Z IH NG
+self-confidence S EH L F K AA N F AH D AH N S
+self-confident S EH L F K AA N F AH D AH N T
+self-congratulation S EH L F K AH N G R AE CH AH L EY SH AH N
+self-consistent S EH L F K AH N S IH S T AH N T
+self-contained S EH L F K AH N T EY N D
+self-control S EH L F K AH N T R OW L
+self-deceiving S EH L F D IY S IY V IH NG
+self-deception S EH L F D AH S EH P SH AH N
+self-deliverance S EH L F D IH L IH V ER AH N S
+self-deprecating S EH L F D EH P R AH K EY T IH NG
+self-determination S EH L F D IH T ER M AH N EY SH AH N
+self-dormant S EH L F D AO R M AH N T
+self-energizing S EH L F EH N ER JH AY Z IH NG
+self-enrichment S EH L F AH N R IH CH M AH N T
+self-fertilizing S EH L F F ER T AH L AY Z IH NG
+self-fruitful S EH L F F R UW T F AH L
+self-govern S EH L F G AH V ER N
+self-governing S EH L F G AH V ER N IH NG
+self-government S EH L F G AH V ER N M AH N T
+self-help S EH L F HH EH L P
+self-improvement S EH L F IH M P R UW V M AH N T
+self-perpetuate S EH L F P ER P EH CH UW EY T
+self-perpetuating S EH L F P ER P EH CH UW EY T IH NG
+self-perpetuation S EH L F P ER P EH CH UW EY SH AH N
+self-pollinate S EH L F P AA L AH N EY T
+self-portrait S EH L F P AO R T R AH T
+self-professed S EH L F P R AH F EH S T
+self-subsistence S EH L F S AH B S IH S T AH N S
+self-sufficiency S EH L F S AH F IH SH AH N S IY
+self-sufficient S EH L F S AH F IH SH AH N T
+self-sufficient(2) S EH L F S AH F IH SH IH N T
+self-torment S EH L F T AO R M EH N T
+self-torments S EH L F T AO R M EH N T S
+selfish S EH L F IH SH
+selfishness S EH L F IH SH N AH S
+selfless S EH L F L AH S
+selflessness S EH L F L AH S N IH S
+selfridge S EH L F R IH JH
+selfs S EH L F S
+selia S EH L IY AH
+selie S EH L IY
+selies S EH L IY Z
+selies' S EH L IY Z
+selig S EH L IH G
+seliga S EH L IH G AH
+seliger S EH L IH G ER
+seligman S EH L IH G M AH N
+seligmann S EH L IH G M AH N
+seligson S EH L IH G S AH N
+selikoff S EH L IH K AO F
+selin S EH L IH N
+selina S AH L IY N AH
+selinas S AH L IY N AH Z
+selinas's S AH L IY N AH S IH Z
+selinas(2) S AH L IY N AH S
+selinda S EH L IY N D AH
+selinger S EH L IH NG ER
+seljuk S EH L JH AH K
+selk S EH L K
+selke S EH L K
+selkin S EH L K IH N
+selkirk S EH L K ER K
+selkirk's S EH L K ER K S
+sell S EH L
+sella S EH L AH
+selland S EH L AH N D
+sellards S EH L ER D Z
+sellars S EH L ER Z
+sellars's S EH L ER Z IH Z
+selle S EH L
+selleck S EH L IH K
+sellen S EH L AH N
+seller S EH L ER
+seller's S EH L ER Z
+sellers S EH L ER Z
+sellers' S EH L ER Z
+selley S EH L IY
+sellick S EH L IH K
+sellier S EH L Y ER
+sellin S EH L IH N
+selling S EH L IH NG
+sellinger S EH L IH NG ER
+sellings S EH L IH NG Z
+sellman S EH L M AH N
+sellmeyer S EH L M AY ER
+sellner S EH L N ER
+selloff S EH L AO F
+selloffs S EH L AO F S
+sellon S EH L AH N
+sellout S EH L AW T
+sellouts S EH L AW T S
+sells S EH L Z
+selma S EH L M AH
+selman S EH L M AH N
+selmer S EH L M ER
+selmon S EH L M AH N
+selner S EH L N ER
+selover S EH L AH V ER
+selowsky S EH L AW S K IY
+selph S EH L F
+selsor S EH L S ER
+seltz S EH L T S
+seltzer S EH L T S ER
+selva S EY L V AH
+selvage S EH L V IH JH
+selvaggio S EH L V AA JH IY OW
+selves S EH L V Z
+selvey S EH L V IY
+selvidge S EH L V IH JH
+selvig S EH L V IH G
+selway S EH L W EY
+selwin S EH L W IH N
+selwitz S EH L W IH T S
+selwyn S EH L W IH N
+selz S EH L Z
+selzer S EH L Z ER
+selzer's S EH L Z ER Z
+sema S IY M AH
+seman S IY M AH N
+semans S IY M AH N Z
+semantic S IH M AE N T IH K
+semantics S IH M AE N T IH K S
+sematech S EH M AH T EH K
+sember S EH M B ER
+semblance S EH M B L AH N S
+semegran S EH M AH G R AH N
+semel S EH M AH L
+semele S EH M AH L IY
+semen S IY M AH N
+semenza S EH M EH N Z AH
+semerad S EH M ER AE D
+semester S AH M EH S T ER
+semesters S AH M EH S T ER Z
+semi S EH M IY
+semi(2) S EH M AY
+semi-colon S EH M IY K OW L AH N
+semi-colon(2) S EH M AH K OW L AH N
+semi-height S EH M IY HH AY T
+semi-height(2) S EH M IH HH AY T
+semi-height(3) S EH M AY HH AY T
+semi-heights S EH M IY HH AY T S
+semi-heights(2) S EH M AY HH AY T S
+semi-heights(3) S EH M IH HH AY T S
+semiannual S EH M IY AE N Y AH W AH L
+semiannual(2) S EH M AY AE N Y AH W AH L
+semiannual(3) S EH M AH AE N Y AH W AH L
+semiannually S EH M IY AE N UW AH L IY
+semiannually(2) S EH M AY AE N UW AH L IY
+semiannually(3) S EH M IY AE N UW L IY
+semiannually(4) S EH M AY AE N UW L IY
+semiautomatic S EH M IY AO T AH M AE T IH K
+semiautomatic(2) S EH M AY AO T AH M AE T IH K
+semiautomatic(3) S EH M IH AO T AH M AE T IH K
+semicircular S EH M IY S ER K Y AH L ER
+semicircular(2) S EH M AY S ER K Y AH L ER
+semicircular(3) S EH M AH S ER K Y AH L ER
+semiclad S EH M IY K L AE D
+semiclad(2) S EH M AY K L AE D
+semiclad(3) S EH M AH K L AE D
+semiclassical S EH M IY K L AE S IH K AH L
+semiclassical(2) S EH M IH K L AE S IH K AH L
+semiclassical(3) S EH M AY K L AE S IH K AH L
+semicon S EH M IH K AA N
+semiconductor S EH M IY K AH N D AH K T ER
+semiconductor's S EH M IY K AH N D AH K T ER Z
+semiconductor's(2) S EH M IH K AH N D AH K T ER Z
+semiconductor's(3) S EH M AY K AH N D AH K T ER Z
+semiconductor(2) S EH M IH K AH N D AH K T ER
+semiconductor(3) S EH M AY K AH N D AH K T ER
+semiconductors S EH M IY K AH N D AH K T ER Z
+semiconductors(2) S EH M IH K AH N D AH K T ER Z
+semiconductors(3) S EH M AY K AH N D AH K T ER Z
+semicylindrical S EH M IY S AH L IH N D R IH K AH L
+semicylindrical(2) S EH M IH S AH L IH N D R IH K AH L
+semicylindrical(3) S EH M AY S AH L IH N D R IH K AH L
+semidry S EH M IY D R AY
+semidry(2) S EH M IH D R AY
+semidry(3) S EH M AY D R AY
+semidrying S EH M IY D R AY IH NG
+semidrying(2) S EH M IH D R AY IH NG
+semidrying(3) S EH M AY D R AY IH NG
+semien S EH M IY N
+semifinal S EH M IY F AY N AH L
+semifinal(2) S EH M IH F AY N AH L
+semifinal(3) S EH M AY F AY N AH L
+semifinalist S EH M IY F AY N AH L IH S T
+semifinalist(2) S EH M IH F AY N AH L IH S T
+semifinalist(3) S EH M AY F AY N AH L IH S T
+semifinalists S EH M IY F AY N AH L IH S T S
+semifinalists(2) S EH M IY F AY N AH L IH S
+semifinalists(3) S EH M AY F AY N AH L IH S T S
+semifinalists(4) S EH M AY F AY N AH L IH S
+semifinals S EH M IY F AY N AH L Z
+semifinals(2) S EH M IH F AY N AH L Z
+semifinals(3) S EH M AY F AY N AH L Z
+semifinish S EH M IY F IH N IH SH
+semifinish(2) S EH M AY F IH N IH SH
+semifinish(3) S EH M IH F IH N IH SH
+semifinished S EH M IY F IH N IH SH T
+semifinished(2) S EH M AY F IH N IH SH T
+semifinished(3) S EH M IH F IH N IH SH T
+semigloss S EH M IY G L AA S
+semigloss(2) S EH M IH G L AA S
+semilegendary S EH M IY L EH JH AH N D EH R IY
+semilegendary(2) S EH M IH L EH JH AH N D EH R IY
+seminal S EH M AH N AH L
+seminar S EH M AH N AA R
+seminara S EH M IH N AA R AH
+seminarian S EH M AH N EH R IY AH N
+seminarians S EH M AH N EH R IY AH N Z
+seminaries S EH M AH N EH R IY Z
+seminario S EH M IH N EH R IY OW
+seminars S EH M AH N AA R Z
+seminary S EH M AH N EH R IY
+seminole S EH M IH N OW L
+seminoles S EH M IH N OW L Z
+semionenkov S EH M IY OW N EH NG K AA V
+semiotic S EH M IY AA T IH K
+semiotics S EH M IY AA T IH K S
+semipermanent S EH M IY P ER M AH N AH N T
+semipermanent(2) S EH M IH P ER M AH N AH N T
+semipermanent(3) S EH M AY P ER M AH N AH N T
+semiprecious S EH M IY P R EH SH AH S
+semiprecious(2) S EH M IH P R EH SH AH S
+semiprecious(3) S EH M AY P R EH SH AH S
+semira S EH M IH R AH
+semireligious S EH M IY R IH L IH JH AH S
+semireligious(2) S EH M IH R IH L IH JH AH S
+semireligious(3) S EH M AY R IH L IH JH AH S
+semis S EH M AY Z
+semisecrecy S EH M IY S IY K R AH S IY
+semisecrecy(2) S EH M IH S IY K R AH S IY
+semite S EH M AY T
+semitic S AH M IH T IH K
+semitism S EH M IH T IH Z AH M
+semitrailer S EH M IY T R EY L ER
+semitrailer(2) S EH M IH T R EY L ER
+semitropical S EH M IY T R AA P IH K AH L
+semitropical(2) S EH M IH T R AA P IH K AH L
+semitropical(3) S EH M AY T R AA P IH K AH L
+semler S EH M L ER
+semmel S EH M AH L
+semmens S EH M AH N Z
+semmes S EH M Z
+semmler S EH M L ER
+semolina S EH M AH L IY N AH
+semon S EH M AH N
+semones S EY M OW N EH S
+semple S EH M P AH L
+semrad S EH M R AH D
+semrau S EH M R AW
+semrow S EH M R OW
+semtex S EH M T EH K S
+sen S EH N
+sen(2) S EH N AH T ER
+sena S EH N AH
+senate S EH N AH T
+senate's S EH N IH T S
+senate(2) S EH N IH T
+senator S EH N AH T ER
+senator's S EH N AH T ER Z
+senatore S EH N AA T AO R IY
+senatorial S EH N AH T AO R IY AH L
+senators S EH N AH T ER Z
+senators' S EH N AH T ER Z
+send S EH N D
+sendak S EH N D AE K
+sendawal S EH N D AA W AH L
+sendelbach S EH N D IH L B AA K
+sender S EH N D ER
+sendero S EH N D EH R OW
+senders S EH N D ER Z
+sending S EH N D IH NG
+sendo S EH N D OW
+sends S EH N D Z
+seneca S EH N AH K AH
+senecal S EH N IH K AH L
+senechal S EH N IH K AH L
+seneff S EH N AH F
+senegal S EH N AH G AO L
+senegalese S EH N AH G AH L IY Z
+senegambia S EH N AH G AE M B IY AH
+seneker S EH N AH K ER
+senesac S EH N IH S AE K
+senescence S AH N EH S AH N S
+senese S EH N IY Z
+seney S EH N IY
+senf S EH N F
+senff S EH N F
+senft S EH N F T
+seng S EH NG
+senger S EH NG ER
+sengers S EH NG ER Z
+senile S IY N AY L
+senility S AH N IH L AH T IY
+senior S IY N Y ER
+seniority S IY N Y AO R IH T IY
+seniornet S IY N Y ER N EH T
+seniors S IY N Y ER Z
+senk S EH NG K
+senkbeil S EH NG K B AY L
+senko S EH NG K OW
+senn S EH N
+senna S EH N AH
+senne S EH N
+senner S EH N ER
+sennet S EH N AH T
+sennett S EH N IH T
+sennott S EH N AH T
+senor S IY N Y AO R
+senora S IY N Y AO R AH
+sens S EH N Z
+sensabaugh S EH N S AH B AO
+sensation S EH N S EY SH AH N
+sensational S EH N S EY SH AH N AH L
+sensationalism S EH N S EY SH AH N AH L IH Z AH M
+sensationalist S EH N S EY SH AH N AH L IH S T
+sensationalistic S EH N S EY SH AH N AH L IH S T IH K
+sensationalize S EH N S EY SH AH N AH L AY Z
+sensationalized S EH N S EY SH AH N AH L AY Z D
+sensationalizes S EH N S EY SH AH N AH L AY Z IH Z
+sensationalizing S EH N S EY SH AH N AH L AY Z IH NG
+sensations S EH N S EY SH AH N Z
+sense S EH N S
+sense-data S EH N S D EY T AH
+sense-data(2) S EH N S D AE T AH
+sense-datas S EH N S D EY T AH Z
+sense-datas(2) S EH N S D AE T AH Z
+sense-datum S EH N S D AE T AH M
+sense-datum(2) S EH N S D EY T AH M
+sensed S EH N S T
+senseless S EH N S L AH S
+sensenbrenner S EH N S AH N B R EH N ER
+senseney S EH N S IH N IY
+sensenig S EH N S IH N IH G
+senses S EH N S IH Z
+sensibilities S EH N S IH B IH L IH T IY Z
+sensibility S EH N S IH B IH L IH T IY
+sensible S EH N S AH B AH L
+sensibly S EH N S AH B L IY
+sensing S EH N S IH NG
+sensitive S EH N S AH T IH V
+sensitive(2) S EH N S IH T IH V
+sensitively S EH N S IH T IH V L IY
+sensitiveness S EH N S AH T IH V N AH S
+sensitivities S EH N S IH T IH V IH T IY Z
+sensitivity S EH N S IH T IH V IH T IY
+sensitize S EH N S AH T AY Z
+sensitized S EH N S AH T AY Z D
+senske S EH N S K
+sensor S EH N S ER
+sensor's S EH N S ER Z
+sensormatic S EH N S ER M AE T IH K
+sensors S EH N S ER Z
+sensory S EH N S ER IY
+sensual S EH N CH AH W AH L
+sensuality S EH N CH AH W AE L AH T IY
+sensuous S EH N CH AH W AH S
+sent S EH N T
+sentell S EH N T AH L
+sentelle S EH N T EH L
+sentence S EH N T AH N S
+sentenced S EH N T AH N S T
+sentences S EH N T AH N S AH Z
+sentences(2) S EH N T AH N S IH Z
+sentencing S EH N T AH N S IH NG
+senter S EH N T ER
+senters S EH N T ER Z
+sentiment S EH N T AH M AH N T
+sentiment(2) S EH N AH M AH N T
+sentimental S EH N T AH M EH N T AH L
+sentimental(2) S EH N AH M EH N T AH L
+sentimental(3) S EH N T AH M EH N AH L
+sentimental(4) S EH N AH M EH N AH L
+sentimentality S EH N T AH M EH N T AE L IH T IY
+sentimentality(2) S EH N AH M EH N T AE L IH T IY
+sentiments S EH N T AH M AH N T S
+sentiments(2) S EH N AH M AH N T S
+sentinel S EH N T AH N AH L
+sentinels S EH N T AH N AH L Z
+sentman S EH N T M AH N
+sentra S EH N T R AH
+sentras S EH N T R AH S
+sentries S EH N T R IY Z
+sentry S EH N T R IY
+senty S EH N T IY
+sentz S EH N T S
+senzaki S EY N Z AA K IY
+seo S IY OW
+seo(2) S EY OW
+seoul S OW L
+seoul's S OW L Z
+seow S IY OW
+seow's S IY OW Z
+seow(2) S IY AW
+sep S EH P
+sep(2) EH S IY P IY
+separate S EH P ER EY T
+separate(2) S EH P ER IH T
+separate(3) S EH P R AH T
+separated S EH P ER EY T AH D
+separated(2) S EH P ER EY T IH D
+separately S EH P ER AH T L IY
+separately(2) S EH P R AH T L IY
+separateness S EH P ER AH T N AH S
+separates S EH P ER EY T S
+separates(2) S EH P ER IH T S
+separating S EH P ER EY T IH NG
+separation S EH P ER EY SH AH N
+separations S EH P ER EY SH AH N Z
+separatism S EH P ER AH T IH Z AH M
+separatist S EH P ER AH T IH S T
+separatists S EH P ER AH T IH S T S
+separatists(2) S EH P R AH T IH S T S
+separatists(3) S EH P R AH T IH S S
+separatists(4) S EH P R AH T IH S
+sepe S IY P
+sepeda S EY P EY D AH
+sephardic S AH F AA R D IH K
+sephardim S IH F AA R D IH M
+sephardim(2) S EH F AA R D IY M
+sephlon S EH F L AO N
+sephlon's S EH F L AO N Z
+sepia S IY P IY AH
+sepich S EH P IH CH
+sepik S EH P IH K
+sepp S EH P
+seppala S EH P AA L AH
+seppi S EH P IY
+sepsis S EH P S IH S
+sept S EH P T
+septa S EH P T AH
+september S EH P T EH M B ER
+september's S EH P T EH M B ER Z
+septer S EH P T ER
+septic S EH P T IH K
+septima S EH P T IY M AH
+septimus S EH P T IH M IH S
+septuagenarian S EH P CH UW AH JH AH N EH R IY AH N
+sepulvado S EY P UW L V AA D OW
+sepulveda S EY P UW L V EY D AH
+sequa S EH K W AH
+sequa's S EH K W AH Z
+sequeira S EY K W EH R AH
+sequel S IY K W AH L
+sequels S IY K W AH L Z
+sequence S IY K W AH N S
+sequences S IY K W AH N S AH Z
+sequences(2) S IY K W AH N S IH Z
+sequencing S IY K W AH N S IH NG
+sequent S IY K W AH N T
+sequential S AH K W EH N CH AH L
+sequentially S AH K W EH N CH AH L IY
+sequester S IH K W EH S T ER
+sequestered S IH K W EH S T ER D
+sequestering S IH K W EH S T ER IH NG
+sequesters S IH K W EH S T ER Z
+sequestration S EH K W AH S T R EY SH AH N
+sequin S IY K W AH N
+sequin(2) S IY K W IH N
+sequined S IY K W AH N D
+sequins S IY K W AH N Z
+sequins(2) S IY K W IH N Z
+sequitur S EH K W IH T ER
+sequiturs S EH K W IH T ER Z
+sequoia S IH K W OY AH
+sequoias S IH K W OY AH Z
+sequoyah S AH K W OY AH
+sera S IH R AH
+serafin S EH R AH F IH N
+serafina S ER AA F IY N AH
+serafine S ER AA F IY N IY
+serafini S ER AA F IY N IY
+serafino S ER AA F IY N OW
+seragut S EH R AH G AH T
+seraphina S ER AA F IY N AH
+seraphine S ER AA F IY N IY
+seratonin S ER AA T OW N IH N
+seratti S EH R AA T IY
+seraw S ER AA
+serb S ER B
+serb's S ER B Z
+serbaine S ER B EY N
+serbia S ER B IY AH
+serbia's S ER B IY AH Z
+serbian S ER B IY AH N
+serbian's S ER B IY AH N Z
+serbians S ER B IY AH N Z
+serbias S ER B IY AH Z
+serbin S ER B IH N
+serbo-croatia S ER B OW K R OW EY SH AH
+serbo-croatian S ER B OW K R OW EY SH AH N
+serbs S ER B Z
+serbs' S ER B Z
+serbska S ER B S K AH
+serco S ER K OW
+serda S EH R D AH
+sere S IH R
+serena S AH R IY N AH
+serenade S EH R AH N EY D
+serenaded S EH R AH N EY D IH D
+serenading S EH R AH N EY D IH NG
+serendipitous S EH R AH N D IH P IH T AH S
+serendipity S EH R AH N D IH P IH T IY
+serene S ER IY N
+serenely S ER IY N AH L IY
+serenely(2) S ER IY N L IY
+serengeti S EH R AH N G EH T IY
+serenity S ER EH N AH T IY
+sereno S EH R EY N OW
+seres S IY R Z
+serex S EH R AH K S
+serf S ER F
+serfass S ER F AE S
+serfin S ER F IH N
+serfin(2) S EH R F IH N
+serfling S ER F L IH NG
+serfs S ER F S
+serge S ER JH
+sergeant S AA R JH AH N T
+sergeants S AA R JH AH N T S
+sergei S ER G EY
+sergei(2) S EH R G EY
+sergent S ER JH AH N T
+sergey S EH R JH IY
+sergey(2) S EH R G EY
+sergi S EH R JH IY
+sergio S ER JH IY OW
+sergius S ER JH IY AH S
+seria S IY R IY AH
+serial S IH R IY AH L
+serialize S IH R IY AH L AY Z
+serialized S IH R IY AH L AY Z D
+serials S IH R IY AH L Z
+series S IH R IY Z
+series' S IH R IY Z
+serilda S ER IY L D AH
+serino S ER IY N OW
+serio S IY R IY OW
+serious S IH R IY AH S
+seriously S IH R IY AH S L IY
+seriousness S IH R IY AH S N AH S
+serle S AO R AH L
+serlin S ER L IH N
+serling S ER L IH N NG
+serlo S EH R L OW
+sermersheim S ER M ER S HH AY M
+sermon S ER M AH N
+sermons S ER M AH N Z
+serna S EH R N AH
+seroka S EH R OW K AH
+serological S EH R AH L AO JH IH K AH L
+serologist S EH R AA L AH JH IH S T
+serology S EH R AA L AH JH IY
+serono S EH R AA N OW
+serota S ER OW T AH
+serotonin S ER AH T OW N IH N
+serowski S ER AW S K IY
+serpa S EH R P AH
+serpas S ER P AH Z
+serpe S ER P
+serpent S ER P AH N T
+serpent's S ER P AH N T S
+serpentine S ER P AH N T AY N
+serpents S ER P AH N T S
+serpico S ER P IY K OW
+serr S EH R
+serra S EH R AH
+serra's S EH R AH Z
+serrano S ER AA N OW
+serrano's S ER AA N OW Z
+serrano's(2) S ER AE N OW Z
+serrano(2) S ER AE N OW
+serranto S ER AA N T OW
+serrao S EH R AW
+serrate S EH R EY T
+serrated S EH R EY T IH D
+serrato S ER AA T OW
+serratore S ER AA T AO R IY
+serres S EH R EH S
+serritella S EH R IH T EH L AH
+sertich S ER T IH K
+serum S IH R AH M
+serv S ER V
+servaas S ER V AA S
+servais S ER V EY
+servam S ER V AH M
+servan S ER V AH N
+servant S ER V AH N T
+servants S ER V AH N T S
+servants' S ER V AH N T S
+serve S ER V
+served S ER V D
+servello S ER V EH L OW
+server S ER V ER
+servers S ER V ER Z
+serves S ER V Z
+service S ER V AH S
+service's S ER V IH S IH Z
+service(2) S ER V IH S
+serviceable S ER V AH S AH B AH L
+serviced S ER V IH S T
+serviceman S ER V AH S M AE N
+servicemaster S ER V IH S M AE S T ER
+servicemen S ER V AH S M EH N
+servicemen's S ER V IH S M EH N Z
+servicer S ER V IH S ER
+services S ER V AH S AH Z
+services' S ER V IH S IH Z
+services'(2) S ER V AH S AH Z
+services(2) S ER V IH S IH Z
+servicing S ER V IH S IH NG
+servico S ER V IH K OW
+servidio S ER V IY D IY OW
+servile S ER V AH L
+servin S ER V IH N
+serving S ER V IH NG
+servings S ER V IH NG Z
+serviou S ER V IY UW
+servis S ER V IH S
+serviss S ER V IH S
+servitude S ER V AH T UW D
+servo S ER V OW
+sesame S EH S AH M IY
+sesdaq S EH S D AE K
+sese S IY S IY
+seshadri S EH SH AA D R IY
+sesit S EH Z IH T
+seskar S EH S K AA R
+seskar's S EH S K AA R Z
+sesler S EH S AH L ER
+sesler(2) S EH S L ER
+sesno S EH S N OW
+sesno's S EH S N OW Z
+sessa S EH S AH
+session S EH SH AH N
+session's S EH SH AH N Z
+sessions S EH SH AH N Z
+sessions' S EH SH AH N Z
+sessler S EH S L ER
+sessoms S EH S AH M Z
+sessums S EH S AH M Z
+sestak S EH S T AH K
+sestanovich S EH S T AE N AH V IH CH
+sestito S EH S T IY T OW
+set S EH T
+setaro S EH T AA R OW
+setback S EH T B AE K
+setbacks S EH T B AE K S
+seth S EH TH
+seth's S EH TH S
+sether S EH DH ER
+sethi S EH TH IY
+sethness S EH TH N AH S
+sethuraman S EH TH ER AA M AA N
+seti S EH T IY
+setliff S EH T L IH F
+seto S EH T OW
+seton S IY T AH N
+sets S EH T S
+setser S EH T S ER
+settanni S EH T AA N IY
+sette S EH T
+setter S EH T ER
+setterlund S EH T ER L AH N D
+setters S EH T ER Z
+setting S EH T IH NG
+settings S EH T IH NG Z
+settle S EH T AH L
+settled S EH T AH L D
+settlement S EH T AH L M AH N T
+settlement's S EH T AH L M AH N T S
+settlements S EH T AH L M AH N T S
+settlemire S EH T AH L M AY R
+settlemyre S EH T AH L M AY R
+settler S EH T AH L ER
+settler(2) S EH T L ER
+settlers S EH T L ER Z
+settlers' S EH T L ER Z
+settlers(2) S EH T AH L ER Z
+settles S EH T AH L Z
+settling S EH T AH L IH NG
+settling(2) S EH T L IH NG
+settsu S EH T S UW
+setty S EH T IY
+setup S EH T AH P
+setups S EH T AH P S
+setzer S EH T Z ER
+setzler S EH T S L ER
+seubert S UW B ER T
+seufert S UW F ER T
+seuss S UW S
+sevareid S EH V AH R AY D
+sevcik S EH V S IH K
+seve S EH V EY
+seven S EH V AH N
+7 S EH V AH N
+seven's S EH V AH N Z
+sevenfold S EH V AH N F OW L D
+sevens S EH V AH N Z
+seventeen S EH V AH N T IY N
+seventeens S EH V AH N T IY N Z
+seventeenth S EH V AH N T IY N TH
+seventh S EH V AH N TH
+sevenths S EH V AH N TH S
+seventies S EH V AH N T IY Z
+seventies(2) S EH V AH N IY Z
+seventieth S EH V AH N T IY IH TH
+seventieth(2) S EH V AH N IY IH TH
+seventy S EH V AH N T IY
+seventy's S EH V AH N T IY Z
+seventy(2) S EH V AH N IY
+sever S EH V ER
+severa S EY V EH R AH
+several S EH V R AH L
+several(2) S EH V ER AH L
+severally S EH V R AH L IY
+severance S EH V ER AH N S
+severance(2) S EH V R AH N S
+severe S AH V IH R
+severed S EH V ER D
+severely S AH V IH R L IY
+severest S AH V IH R AH S T
+severeville S AH V IH R V IH L
+severin S EH V ER IH N
+severing S EH V ER IH NG
+severini S EH V ER IY N IY
+severino S EH V ER IY N OW
+severity S IH V EH R IH T IY
+severn S EH V ER N
+severns S EH V ER N Z
+severovic S EH V ER OW V IH K
+severs S EH V ER Z
+severson S EH V ER S AH N
+severt S EH V ER T
+severtson S EH V ER T S AH N
+sevey S IH V EY
+sevick S EH V IH K
+sevier S EH V Y ER
+sevigny S IH V IH G N IY
+sevilla S EH V IH L AH
+seville S AH V IH L
+sevin S EH V IH N
+sevruga S EH V R UW G AH
+sevy S IY V IY
+sew S OW
+sewage S UW AH JH
+sewage(2) S UW IH JH
+sewald S UW AH L D
+sewall S UW AH L
+seward S UW ER D
+seward's S UW ER D Z
+sewed S OW D
+sewell S UW AH L
+sewell(2) S UW IH L
+sewer S UW ER
+sewerage S UW ER IH JH
+sewers S UW ER Z
+sewing S OW IH NG
+sewn S OW N
+sex S EH K S
+sexauer S EH K S AW ER
+sexed S EH K S T
+sexes S EH K S AH Z
+sexes(2) S EH K S IH Z
+sexier S EH K S IY ER
+sexiest S EH K S IY AH S T
+sexiness S EH K S IY N AH S
+sexism S EH K S IH Z AH M
+sexist S EH K S IH S T
+sexless S EH K S L IH S
+sexson S EH K S AH N
+sextet S EH K S T EH T
+sexton S EH K S T AH N
+sextuplet S EH K S T AH P L IH T
+sextuplets S EH K S T AH P L IH T S
+sextus S EH K S T AH S
+sexual S EH K SH UW AH L
+sexuality S EH K SH UW AE L AH T IY
+sexually S EH K SH UW AH L IY
+sexy S EH K S IY
+seybert S EY B ER T
+seybold S EY B OW L D
+seychelles S EY SH EH L Z
+seydel S EY D AH L
+seydoux S EY D UW
+seyer S EY ER
+seyfarth S EY F AA R TH
+seyfert S EY F ER T
+seyfried S EY F ER IY D
+seyi S EY IY
+seyler S EY L ER
+seyller S EY L ER
+seymore S IY M AO R
+seymour S IY M AO R
+seymour's S IY M AO R Z
+sfernice S F ER N IH S
+sfernice(2) S AH F ER N IH S
+sferra S F EH R AH
+sferrazza S F ER AA T S AH
+sffed S F EH D
+sffed(2) EH S EH F EH D
+sffed(3) EH S EH F EH F IY D IY
+sforza S F AO R Z AH
+sfuzzi S F UW T Z IY
+sgambati S K AA M B AA T IY
+sgro S K R OW
+sgroi S K R OY
+sh EH S EY CH
+sha SH AA
+sha'ath SH AA TH
+shaak SH AA K
+shaanxi SH AA NG K S IY
+shaath SH AA TH
+shaath's SH AA TH S
+shabad SH AH B AE D
+shabazz SH AA B AA Z
+shabazz's SH AA B AA Z IH Z
+shabby SH AE B IY
+shaber SH EY B ER
+shack SH AE K
+shackelford SH AE K IH L F ER D
+shackelton SH AH K EH L T AH N
+shackett SH AE K IH T
+shackle SH AE K AH L
+shackled SH AE K AH L D
+shackleford SH AE K AH L F ER D
+shackles SH AE K AH L Z
+shackleton SH AE K AH L T AH N
+shackleton's SH AE K AH L T AH N Z
+shackletons SH AE K AH L T AH N Z
+shacklett SH AE K L IH T
+shacks SH AE K S
+shad SH AE D
+shad's SH AE D Z
+shadbush SH AE D B UH SH
+shadd SH AE D
+shadden SH AE D AH N
+shaddix SH AE D IH K S
+shaddock SH AE D AH K
+shadduck SH AE D AH K
+shade SH EY D
+shaded SH EY D IH D
+shadegg SH AE D EH G
+shadel SH AE D AH L
+shader SH EY D ER
+shades SH EY D Z
+shadid SH AE D IH D
+shading SH EY D IH NG
+shadings SH EY D IH NG Z
+shadle SH EY D AH L
+shadley SH AE D L IY
+shadoan SH AE D OW N
+shadow SH AE D OW
+shadowed SH AE D OW D
+shadowens SH AE D OW AH N Z
+shadowing SH AE D OW IH NG
+shadowland SH AE D OW L AE N D
+shadowlands SH AE D OW L AE N D Z
+shadows SH AE D OW Z
+shadowy SH AE D OW IY
+shadrick SH AE D R IH K
+shadur SH AE D ER
+shadwell SH AE D W EH L
+shadwick SH AE D W IH K
+shady SH EY D IY
+shaefer SH EY F ER
+shaeffer SH EH F ER
+shaer SH EY ER
+shafer SH EY F ER
+shaff SH AE F
+shaffer SH EY F ER
+shaffner SH AE F N ER
+shafran SH AE F R AH N
+shaft SH AE F T
+shafted SH AE F T IH D
+shafting SH AE F T IH NG
+shafts SH AE F T S
+shag SH AE G
+shaggy SH AE G IY
+shah SH AA
+shah's SH AA Z
+shahan SH AE HH AH N
+shahar SH AH HH AA R
+shahar's SH AH HH AA R Z
+shaheed SH AH HH IY D
+shaheen SH AH HH IY N
+shahian SH AH HH IY AH N
+shahidi SH AH HH IY D IY
+shahin SH AE HH IH N
+shahinian SH AH HH IH N IY AH N
+shahrokh SH AA R AA K
+shahrzad SH AA R Z AE D
+shai SH AY
+shaik SH EY K
+shaiken SH EY K AH N
+shaikh SH EY K
+shain SH EY N
+shaine SH EY N
+shaka SH AA K AH
+shake SH EY K
+shakedown SH EY K D AW N
+shakedowns SH EY K D AW N Z
+shaken SH EY K AH N
+shakeout SH EY K AW T
+shaker SH EY K ER
+shakers SH EY K ER Z
+shakes SH EY K S
+shakespeare SH EY K S P IY R
+shakespeare's SH EY K S P IY R Z
+shakespearean SH EY K S P IH R IY AH N
+shakeup SH EY K AH P
+shakeups SH EY K AH P S
+shakier SH EY K IY ER
+shakiest SH EY K IY IH S T
+shakiness SH EY K IY N AH S
+shaking SH EY K IH NG
+shakir SH AE K IH R
+shaklee SH AE K L IY
+shakunaga SH AA K UW N AA G AH
+shakur SH AA K ER
+shaky SH EY K IY
+shalala SH AH L EY L AH
+shalala's SH AH L EY L AH Z
+shale SH EY L
+shaler SH EY L ER
+shales SH EY L Z
+shali SH AE L IY
+shalikashvili SH AE L IY K AA SH V IY L IY
+shalikashvili's SH AE L IY K AA SH V IY L IY Z
+shall SH AE L
+shall's SH AE L Z
+shallcross SH AE L K R AA S
+shallenberger SH AO L AH N B ER G ER
+shallow SH AE L OW
+shallower SH AE L OW ER
+shallowness SH AE L OW N AH S
+shalnev SH AA L N EH V
+shalnev(2) SH AA L N EH F
+shalom SH AH L OW M
+shalt SH AE L T
+sham SH AE M
+shamalia SH AH M AA L Y AH
+shamalia(2) SH AH M EY L Y AH
+shaman SH EY M AH N
+shamanists SH EY M AH N IH S T S
+shamanists(2) SH EY M AH N IH S
+shamans SH EY M AH N Z
+shamas SH AE M AH S
+shambaugh SH AE M B AO
+shamberger SH AE M B ER G ER
+shamble SH AE M B AH L
+shambles SH AE M B AH L Z
+shambley SH AE M B L IY
+shamblin SH AE M B L IH N
+shambo SH AE M B OW
+shamburg SH AE M B ER G
+shamburger SH AE M B ER G ER
+shame SH EY M
+shamed SH EY M D
+shameful SH EY M F AH L
+shamel SH AE M AH L
+shameless SH EY M L AH S
+shamelessly SH EY M L AH S L IY
+shamelle SH AH M EH L
+shames SH EY M Z
+shaming SH EY M IH NG
+shamir SH AH M IH R
+shamir's SH AH M IH R Z
+shammond SH AE M AH N D
+shamp SH AE M P
+shampine SH AE M P AY N
+shampoo SH AE M P UW
+shampooed SH AE M P UW D
+shampoos SH AE M P UW Z
+shamrock SH AE M R AA K
+shamrock's SH AE M R AA K S
+shamu SH AA M UW
+shamus SH EY M AH S
+shan SH AE N
+shana SH AE N AH
+shana(2) SH EY N AH
+shanafelt SH AE N AH F EH L T
+shanahan SH AE N AH HH AE N
+shanansky SH AH N AE N S K IY
+shand SH AE N D
+shandling SH AE N D L IH NG
+shandong SH AA N D OW NG
+shands SH AE N D Z
+shandwick SH AE N D W IH K
+shandwick's SH AE N D W IH K S
+shandy SH AE N D IY
+shane SH EY N
+shaner SH EY N ER
+shaneyfelt SH AE N IY F EH L T
+shanghai SH AE NG HH AY
+shanghai's SH AE NG HH AY Z
+shangkun SH AE NG K AH N
+shangri SH AE NG G R IY
+shanholtz SH AE N HH OW L T S
+shanholtzer SH AE N HH OW L T Z ER
+shank SH AE NG K
+shankar SH AE NG K AA R
+shankel SH AE NG K AH L
+shanken SH AE NG K AH N
+shanker SH AE NG K ER
+shankland SH AE NG K L AH N D
+shankle SH AE NG K AH L
+shankles SH AE NG K AH L Z
+shanklin SH AE NG K L IH N
+shankman SH AE NG K M AH N
+shanks SH AE NG K S
+shanley SH AE N L IY
+shannahan SH AE N AH HH AE N
+shannon SH AE N AH N
+shannon's SH AE N AH N Z
+shansev SH AE N S EH V
+shansev(2) SH AE N S EH F
+shant SH AA N T
+shanti SH AE N T IY
+shanties SH AE N T IY Z
+shanty SH AE N T IY
+shantytown SH AE N T IY T AW N
+shantytowns SH AE N T IY T AW N Z
+shantz SH AE N T S
+shao SH AW
+shap SH AE P
+shape SH EY P
+shaped SH EY P T
+shapeless SH EY P L AH S
+shapely SH EY P L IY
+shapero SH AH P IH R OW
+shapes SH EY P S
+shaping SH EY P IH NG
+shapira SH AH P IH R AH
+shapiro SH AH P IH R OW
+shapiro's SH AH P IH R OW Z
+shapiros SH AH P IH R OW Z
+shapley SH AE P L IY
+shapp SH AE P
+shappell SH AE P AH L
+shaq SH AE K
+shaquille SH AH K IY L
+shara SH AA R AH
+sharaa SH AA R AH
+sharansky SH ER AE N S K IY
+sharar SH ER AA R
+sharber SH AA R B ER
+sharbono SH AA R B OW N OW
+shard SH AA R D
+shards SH AA R D Z
+share SH EH R
+share's SH EH R Z
+sharecrop SH EH R K R AA P
+sharecropper SH EH R K R AA P ER
+sharecroppers SH EH R K R AA P ER Z
+shared SH EH R D
+shareholder SH EH R HH OW L D ER
+shareholder's SH EH R HH OW L D ER Z
+shareholders SH EH R HH OW L D ER Z
+shareholders' SH EH R HH OW L D ER Z
+shareholding SH EH R HH OW L D IH NG
+shareholdings SH EH R HH OW L D IH NG Z
+sharell SH AH R EH L
+shareowner SH EH R OW N ER
+shareowners SH EH R OW N ER Z
+sharer SH EH R ER
+shares SH EH R Z
+shares' SH EH R Z
+shareware SH EH R W EH R
+sharf SH AA R F
+sharfman SH AA R F M AH N
+shari SH AA R IY
+sharia SH AA R IY AH
+sharif SH ER IY F
+sharing SH EH R IH NG
+shark SH AA R K
+sharkey SH AA R K IY
+sharking SH AA R K IH NG
+sharklike SH AA R K L AY K
+sharks SH AA R K S
+sharla SH AA R L AH
+sharleen SH AA R L IY N
+sharlene SH AA R L IY N
+sharline SH AA R L AY N
+sharlow SH AA R L OW
+sharm SH AA R M
+sharma SH AA R M AH
+sharma's SH AA R M AH Z
+sharman SH AA R M AH N
+sharon SH AE R AH N
+sharon's SH EH R AH N Z
+sharon's(2) SH AE R AH N Z
+sharon's(3) SH AH R OW N Z
+sharon(2) SH EH R AH N
+sharon(3) SH AH R OW N
+sharp SH AA R P
+sharp's SH AA R P S
+sharp-sign SH AA R P S AY N
+sharpe SH AA R P
+sharpen SH AA R P AH N
+sharpened SH AA R P AH N D
+sharpening SH AA R P AH N IH NG
+sharpening(2) SH AA R P N IH NG
+sharpens SH AA R P AH N Z
+sharper SH AA R P ER
+sharpest SH AA R P AH S T
+sharpeville SH AA R P AH V IH L
+sharpie SH AA R P IY
+sharpies SH AA R P IY Z
+sharples SH AA R P AH L Z
+sharpless SH AA R P L AH S
+sharpley SH AA R P L IY
+sharply SH AA R P L IY
+sharpnack SH AA R P N AH K
+sharpness SH AA R P N AH S
+sharps SH AA R P S
+sharpshooter SH AA R P SH UW T ER
+sharpshooters SH AA R P SH UW T ER Z
+sharpton SH AA R P T AH N
+sharpy SH AA R P IY
+sharpy's SH AA R P IY Z
+sharrar SH ER AA R
+sharrer SH AA R ER
+sharrett SH AE R IH T
+sharrock SH AE R AH K
+sharron SH AE R AH N
+sharrow SH AE R OW
+sharry SH AA R IY
+shartzer SH AA R T Z ER
+sharum SH ER AH M
+sharyl SH EH R AH L
+shas SH AH S
+shashlik SH AE SH L IH K
+shashoua SH AH SH UW AH
+shasta SH AE S T AH
+shasta's SH AE S T AH Z
+shasteen SH AH S T IY N
+shatkin SH AE T K IH N
+shatley SH AE T L IY
+shatman SH AE T M AH N
+shatner SH AE T N ER
+shatrov SH AE T R AA V
+shatt SH AE T
+shatter SH AE T ER
+shattered SH AE T ER D
+shattering SH AE T ER IH NG
+shatterproof SH AE T ER P R UW F
+shatters SH AE T ER Z
+shattuck SH AE T AH K
+shatz SH AE T S
+shatz(2) SH AA T S
+shatzer SH EY T Z ER
+shaub SH AO B
+shauger SH AW G ER
+shaughnessy SH AO N IH S IY
+shaul SH AO L
+shaulis SH AW L IH S
+shaull SH AO L
+shaun SH AO N
+shauna SH AO N AH
+shave SH EY V
+shaved SH EY V D
+shavelson SH EY V AH L S IH N
+shavelson(2) SH AE V AH L S IH N
+shaven SH EY V AH N
+shaver SH EY V ER
+shavers SH EY V ER Z
+shaves SH EY V Z
+shaving SH EY V IH NG
+shavings SH EY V IH NG Z
+shavord SH AH V AO R D
+shaw SH AO
+shaw's SH AO Z
+shawcross SH AO K R AO S
+shawgo SH AO G OW
+shawhan SH AE W AH N
+shawinigan SH AH W IH N IH G AH N
+shawl SH AO L
+shawler SH AO L ER
+shawley SH AO L IY
+shawls SH AO L Z
+shawmut SH AO M AH T
+shawmut's SH AO M AH T S
+shawn SH AO N
+shawn's SH AO N Z
+shawna SH AO N AH
+shawnee SH AO N IY
+shawnut SH AO N AH T
+shawshank SH AO SH AE N K
+shawver SH AO V ER
+shay SH EY
+shaykin SH EY K IH N
+shaykin's SH EY K IH N Z
+shayne SH EY N
+shays SH EY Z
+shcharansky SH ER AE N S K IY
+shchedrin SH EH D R IH N
+shcherbitsky SH ER B IH T S K IY
+she SH IY
+she'd SH IY D
+she'll SH IY L
+she's SH IY Z
+shea SH EY
+shea's SH EY Z
+shead S HH EH D
+sheaf SH IY F
+sheaffer SH IY F ER
+sheahan SH IY AH N
+shealey SH IY L IY
+shealy SH IY L IY
+shean SH IY N
+shear SH IH R
+shear's SH IY R Z
+sheard SH IH R D
+sheared SH IH R D
+shearer SH IH R ER
+shearin SH IH R IH N
+shearing SH IH R IH NG
+shearman SH IY R M AH N
+shearn SH IH R N
+shearon SH IH R AH N
+shearouse SH IH R AW S
+shears SH IY R Z
+shearson SH IH R S AH N
+shearson's SH IH R S AH N Z
+sheath SH IY TH
+sheathbill SH IY TH B IH L
+sheathbills SH IY TH B IH L Z
+sheathe SH IY DH
+sheathed SH IY DH D
+sheathing SH IY DH IH NG
+sheats SH IY T S
+sheaves SH IY V Z
+sheba SH IY B AH
+shebek SH EH B AH K
+sheboygan SH AH B OY G AH N
+sheck SH EH K
+sheck's SH EH K S
+sheckler SH EH K L ER
+shed SH EH D
+shedd SH EH D
+shedden SH EH D AH N
+shedding SH EH D IH NG
+shedlock SH EH D L AA K
+shedrick SH EH D R IH K
+sheds SH EH D Z
+sheeder SH IY D ER
+sheedy SH IY D IY
+sheehan SH IY AH N
+sheehan's SH IY AH N Z
+sheehan's(2) SH IY HH AH N Z
+sheehan(2) SH IY HH AH N
+sheehy SH IY HH IY
+sheehy(2) SH IY IY
+sheek SH IY K
+sheeks SH IY K S
+sheela SH IY L AH
+sheelah SH IY L AH
+sheelen SH IY L AH N
+sheeler SH IY L ER
+sheeley SH IY L IY
+sheely SH IY L IY
+sheen SH IY N
+sheen's SH IY N Z
+sheena SH IY N AH
+sheens SH IY N Z
+sheep SH IY P
+sheep's SH IY P S
+sheepish SH IY P IH SH
+sheepishly SH IY P IH SH L IY
+sheeps SH IY P S
+sheepskin SH IY P S K IH N
+sheer SH IH R
+sheeran SH IH R AH N
+sheerer SH IY R ER
+sheerin SH IH R IH N
+sheesh SH IY SH
+sheesley SH IY Z L IY
+sheet SH IY T
+sheeting SH IY T IH NG
+sheets SH IY T S
+sheetz SH IY T S
+sheff SH EH F
+sheffer SH EH F ER
+sheffey SH EH F IY
+sheffield SH EH F IY L D
+sheffler SH EH F L ER
+sheftel SH EH F T EH L
+sheftel's SH EH F T EH L Z
+shegog SH EH G AA G
+shehan SH EH HH AH N
+shehane SH EH HH AH N
+shehorn SH EH HH ER N
+sheik SH IY K
+sheik's SH IY K S
+sheikdom SH IY K D AH M
+sheikdoms SH IY K D AH M Z
+sheikh SH IY K
+sheiks SH IY K S
+sheil SH AY L
+sheila SH IY L AH
+sheila's SH IY L AH Z
+sheilah SH IY L AH
+sheilds SH AY L D Z
+sheils SH AY L Z
+shein SH AY N
+sheinberg SH AY N B ER G
+shek SH EH K
+shek's SH EH K S
+shekel SH EH K AH L
+shekels SH EH K AH L Z
+shelburne SH EH L B ER N
+shelby SH EH L B IY
+shelby's SH EH L B IY Z
+shelbyville SH EH L B IY V IH L
+sheldahl SH EH L D AA L
+shelden SH EH L D AH N
+sheldon SH EH L D AH N
+shelev SH EH L IH V
+sheley SH IY L IY
+shelf SH EH L F
+shelhah SH EH L HH AH
+shelhamer SH EH L HH AH M ER
+shelia SH IH L Y AH
+sheline SH EH L AY N
+shell SH EH L
+shell's SH EH L Z
+shellabarger SH EH L AH B AA R G ER
+shelled SH EH L D
+shellenbarger SH EH L IH N B AA R G ER
+shellenberger SH EH L AH N B ER G ER
+sheller SH EH L ER
+shelley SH EH L IY
+shelley's SH EH L IY Z
+shellfish SH EH L F IH SH
+shellhammer SH EH L HH AE M ER
+shellhorn SH EH L HH ER N
+shelling SH EH L IH NG
+shellings SH EH L IH NG Z
+shellito SH EY L IY T OW
+shellman SH EH L M AH N
+shells SH EH L Z
+shellshock SH EH L SH AA K
+shellshocked SH EH L SH AA K T
+shelly SH EH L IY
+shelman SH EH L M AH N
+shelnutt SH EH L N AH T
+shelor SH EH L ER
+shelp SH EH L P
+shelstad SH EH L S T AH D
+shelter SH EH L T ER
+sheltered SH EH L T ER D
+sheltering SH EH L T ER IH NG
+shelters SH EH L T ER Z
+shelton SH EH L T AH N
+shelton's SH EH L T AH N Z
+shelve SH EH L V
+shelved SH EH L V D
+shelves SH EH L V Z
+shelving SH EH L V IH NG
+shema SH IH M AH
+shemanski SH IH M AE N S K IY
+shemona SH IH M OW N AH
+shemwell SH EH M W EH L
+shen SH EH N
+shena SH IY N AH
+shenandoah SH EH N AH N D OW AH
+shenanigan SH AH N AE N IH G AH N
+shenanigans SH AH N AE N IH G AH N Z
+shenberger SH EH N B ER G ER
+shenefield SH EH N IH F IY L D
+sheneman SH IY N M AH N
+sheng SH EH NG
+sheng-fen SH EH NG F EH N
+shenice SH AH N IY S
+shenk SH EH NG K
+shenker SH EH NG K ER
+shenkman SH EH NG K M AH N
+shenton SH EH N T AH N
+shenyang SH EH N Y AE NG
+shenzhen SH EH N ZH EH N
+shep SH EH P
+shepard SH EH P ER D
+shepard's SH EH P ER D Z
+shepardson SH EH P AA R D S AH N
+sheperd SH EH P ER D
+shephard SH EH P ER D
+shepheard SH EH P ER D
+shepherd SH EH P ER D
+shepherd's SH EH P ER D Z
+shepherded SH EH P ER D IH D
+shepherding SH EH P ER D IH NG
+shepherds SH EH P ER D Z
+shepler SH EH P L ER
+shepley SH EH P L IY
+shepp SH EH P
+sheppard SH EH P ER D
+sheppard's SH EH P ER D Z
+sheppards SH EH P ER D Z
+shepper SH EH P ER
+shepperd SH EH P ER D
+shepperson SH EH P ER S AH N
+sheppy SH EH P IY
+sher SH ER
+sherak SH EH R AE K
+sherard SH EH R ER D
+sheraton SH EH R AH T AH N
+sheraton's SH EH R AH T AH N Z
+sherbert SH ER B ER T
+sherbet SH ER B AH T
+sherbondy SH ER B AA N D IY
+sherborne SH ER B ER N
+sherbourn SH ER B UH R N
+sherbourne SH ER B UH R N
+sherburn SH ER B ER N
+sherburne SH ER B ER N
+shere SH IH R
+sheree SH ER IY
+sherer SH IH R ER
+sherfey SH ER F IY
+sherfield SH ER F IY L D
+sheri SH EH R IY
+sherick SH EH R IH K
+sheridan SH EH R IH D AH N
+sheriff SH EH R AH F
+sheriff's SH EH R AH F S
+sheriff's(2) SH EH R IH F S
+sheriff(2) SH EH R IH F
+sheriffs SH EH R AH F S
+sherin SH EH R IH N
+sherk SH ER K
+sherley SH ER L IY
+sherlin SH ER L IH N
+sherlock SH ER L AA K
+sherlock's SH ER L AA K S
+sherlund SH ER L AH N D
+sherman SH ER M AH N
+sherman's SH ER M AH N Z
+shermer SH ER M ER
+shernoff SH ER N AO F
+sherod SH EH R AH D
+sherr SH EH R
+sherr's SH EH R Z
+sherrard SH EH R ER D
+sherrell SH EH R AH L
+sherrer SH EH R ER
+sherrgold SH EH R G OW L D
+sherri SH EH R IY
+sherri's SH EH R IY Z
+sherrick SH EH R IH K
+sherrie SH EH R IY
+sherriff SH EH R IH F
+sherrill SH EH R IH L
+sherrin SH EH R IH N
+sherrit SH EH R IH T
+sherritt SH EH R IH T
+sherrod SH EH R AH D
+sherron SH EH R AH N
+sherrow SH EH R OW
+sherry SH EH R IY
+sherry's SH EH R IY Z
+shertzer SH ER T Z ER
+sherva SH ER V AH
+sherwin SH ER W IH N
+sherwood SH ER W UH D
+sherwood's SH ER W UH D Z
+sheryl SH EH R AH L
+sheshunoff SH EH SH UW N AO F
+sheth SH EH TH
+shetland SH EH T L AH N D
+shetler SH EH T L ER
+shetley SH EH T L IY
+shetter SH EH T ER
+shetterly SH EH T ER L IY
+shevardnadze SH EH V ER D N AA D Z IY
+shevardnadze's SH EH V ER D N AA D Z IY Z
+shevlin SH EH V L IH N
+shevtl SH EH V IH L
+shevtl(2) SH IY V IH L
+shew SH UW
+sheward SH UW ER D
+shewchuk SH UW CH AH K
+shewell SH EH W EH L
+shewmake SH UW M EY K
+shewmaker SH UW M EY K ER
+shh SH
+shi SH IY
+shia SH IY AH
+shiah SH IY AH
+shias SH IY AH Z
+shibanna SH IH B AE N AH
+shibata SH IY B AA T AH
+shibboleth SH IH B AH L EH TH
+shibley SH IH B L IY
+shick SH IH K
+shicoff SH IH K AO F
+shideler SH IH D AH L ER
+shidler SH AY D AH L ER
+shidler(2) SH AY D L ER
+shied SH AY D
+shieh SH IY
+shiel SH IY L
+shiela SH AY L AH
+shield SH IY L D
+shield's SH IY L D Z
+shielded SH IY L D IH D
+shielding SH IY L D IH NG
+shields SH IY L D Z
+shiels SH IY L Z
+shier SH AY ER
+shies SH AY Z
+shiff SH IH F
+shiffer SH IH F ER
+shiffler SH IH F L ER
+shifflet SH IH F L IH T
+shifflett SH IH F L IH T
+shiffman SH IH F M AH N
+shiflet SH IH F L IH T
+shiflett SH IH F L IH T
+shifrin SH IH F R IH N
+shift SH IH F T
+shifted SH IH F T AH D
+shifted(2) SH IH F T IH D
+shifter SH IH F T ER
+shifting SH IH F T IH NG
+shiftless SH IH F T L IH S
+shifts SH IH F T S
+shifty SH IH F T IY
+shigeki SH IH G EY K IY
+shigekuni SH IY G IH K UW N IY
+shigeo SH IH G EY OW
+shigeru SH IH G EY R UW
+shigley SH IH G L IY
+shih SH IY
+shihan SH IY HH AA N
+shiina SH IY N AH
+shiite SH IY AY T
+shiites SH IY AY T S
+shiley SH IH L IY
+shill SH IH L
+shiller SH IH L ER
+shilling SH IH L IH NG
+shillingburg SH IH L IH NG B ER G
+shillinger SH IH L IH N JH ER
+shillinglaw SH IH L IH NG L AO
+shillings SH IH L IH NG Z
+shillington SH IH L IH NG T AH N
+shiloh SH AY L OW
+shilts SH IH L T S
+shim SH IH M
+shima SH IY M AH
+shimabukuro SH IY M AA B UW K UH R OW
+shimada SH IY M AA D AH
+shimbun SH IH M B AH N
+shimbun(2) SH IH M B UW N
+shimek SH IH M IH K
+shimel SH IH M AH L
+shimer SH AY M ER
+shimizu SH IH M IY Z UW
+shimko SH IH M K OW
+shimkus SH IH M K AH S
+shimmel SH IH M AH L
+shimmer SH IH M ER
+shimmered SH IH M ER D
+shimmering SH IH M ER IH NG
+shimmerlik SH IH M ER L IH K
+shimmers SH IH M ER Z
+shimmin SH IH M IH N
+shimmy SH IH M IY
+shimoda SH IH M OW D AH
+shimoga SH IH M OW G AH
+shimokawa SH IH M OW K AA W AH
+shimon SH IY M OW N
+shimon(2) SH IY M AH N
+shimone SH IY M OW N
+shimp SH IH M P
+shin SH IH N
+shinall SH IH N AH L
+shinault SH IH N AW L T
+shinbein SH IH N B AY N
+shinbone SH IH N B OW N
+shindig SH IH N D IH G
+shindle SH IH N D AH L
+shindledecker SH IH N D AH L D IH K ER
+shindler SH IH N D L ER
+shindler's SH IH N D L ER Z
+shindou SH IH N D OW
+shine SH AY N
+shined SH AY N D
+shiner SH AY N ER
+shines SH AY N Z
+shing SH IH NG
+shingle SH IH NG G AH L
+shingledecker SH IH NG G AH L D IH K ER
+shingler SH IH NG L ER
+shingles SH IH NG G AH L Z
+shingleton SH IH NG G AH L T AH N
+shinichi SH IH N IY CH IY
+shining SH AY N IH NG
+shinkle SH IH NG K AH L
+shinko SH IH NG K OW
+shinn SH IH N
+shinners SH IH N ER Z
+shinnick SH IH N IH K
+shinri SH IH N R IY
+shinrikyo SH IH N R IY K Y OW
+shinsei SH IH N S EY
+shinsky SH IH N S K IY
+shintaro SH IH N T AA R OW
+shinto SH IH N T OW
+shinwa SH IH N W AH
+shinxiaku SH IH N CH Y AA K UW
+shiny SH AY N IY
+shinyuka SH IH N Y UW K AH
+shiong SH IY AO NG
+shionogi SH IY AH N OW G IY
+ship SH IH P
+ship's SH IH P S
+shipboard SH IH P B AO R D
+shipbuilder SH IH P B IH L D ER
+shipbuilders SH IH P B IH L D ER Z
+shipbuilding SH IH P B IH L D IH NG
+shipbuildings SH IH P B IH L D IH NG Z
+shipe SH AY P
+shipes SH AY P S
+shipholding SH IH P HH OW L D IH NG
+shiplett SH IH P L IH T
+shipley SH IH P L IY
+shipload SH IH P L OW D
+shiploads SH IH P L OW D Z
+shipman SH IH P M AH N
+shipmate SH IH P M EY T
+shipmates SH IH P M EY T S
+shipment SH IH P M AH N T
+shipments SH IH P M AH N T S
+shipowner SH IH P OW N ER
+shipowners SH IH P OW N ER Z
+shipp SH IH P
+shipp's SH IH P S
+shipped SH IH P T
+shippee SH IH P IY
+shipper SH IH P ER
+shipper's SH IH P ER Z
+shippers SH IH P ER Z
+shippey SH IH P IY
+shipping SH IH P IH NG
+shippingport SH IH P IH NG P AO R T
+shipps SH IH P S
+shippy SH IH P IY
+ships SH IH P S
+ships' SH IH P S
+shipshape SH IH P SH EY P
+shipton SH IH P T AH N
+shipwash SH IH P W AA SH
+shipwreck SH IH P R EH K
+shipwright SH IH P R AY T
+shipwrights SH IH P R AY T S
+shipyard SH IH P Y AA R D
+shipyard's SH IH P Y AA R D Z
+shipyards SH IH P Y AA R D Z
+shir SH ER
+shira SH IH R AH
+shirah SH IH R AH
+shiraishi SH IH R AA IY SH IY
+shirazi SH IH R AA Z IY
+shire SH AY R
+shirell SH IH R EH L
+shirelle SH IH R EH L
+shireman SH IH R EY M AH N
+shiremanstown SH AY R M AH N Z T AW N
+shirer SH AY ER R
+shires SH AY R Z
+shirey SH AY R IY
+shirin SH IH R AH N
+shirk SH ER K
+shirked SH ER K T
+shirkey SH ER K IY
+shirking SH ER K IH NG
+shirl SH ER L
+shirlee SH ER L IY
+shirleen SH ER L IY N
+shirlene SH ER L IY N
+shirley SH ER L IY
+shirley's SH ER L IY Z
+shirlie SH ER L IY
+shiroma SH IH R OW M AH
+shirone SH IH R OW N
+shirr SH ER
+shirrell SH AO R AH L
+shirt SH ER T
+shirted SH ER T AH D
+shirting SH ER T IH NG
+shirts SH ER T S
+shirtsleeve SH ER T S L IY V
+shiseido SH IH S EY D OW
+shishido SH IY SH IY D OW
+shisler SH IH S AH L ER
+shisler(2) SH IH S L ER
+shissler SH IH S L ER
+shit SH IH T
+shithead SH IH T HH EH D
+shitila SH AH T IH L AH
+shitty SH IH T IY
+shiu SH UW
+shiva SH IY V AH
+shive SH AY V
+shiveley SH IH V IH L IY
+shiveley(2) SH IH V L IY
+shively SH AY V L IY
+shiver SH IH V ER
+shiverdecker SH IH V ER D IH K ER
+shivered SH IH V ER D
+shivering SH IH V ER IH NG
+shivers SH IH V ER Z
+shives SH AY V Z
+shivley SH IH V L IY
+shiyuan SH IY UW AA N
+shizuka SH IH Z UW K AH
+shizuoka SH IY Z W OW K AH
+shlaes SH L EY Z
+shlenker SH L EH NG K ER
+shlobidan SH L OW B IH D AH N
+shoaf SH OW F
+shoaff SH OW F
+shoals SH OW L Z
+shobana SH OW B AA N AH
+shobana's SH OW B AA N AH Z
+shobanna SH OW B AA N AH
+shobanna's SH OW B AA N AH Z
+shobe SH OW B
+shober SH OW B ER
+shoberg SH OW B ER G
+shobert SH AA B ER T
+shock SH AA K
+shocked SH AA K T
+shocker SH AA K ER
+shockey SH AA K IY
+shocking SH AA K IH NG
+shockingly SH AA K IH NG L IY
+shockley SH AA K L IY
+shocks SH AA K S
+shockwave SH AA K W EY V
+shockwaves SH AA K W EY V Z
+shod SH AA D
+shoddy SH AA D IY
+shoe SH UW
+shoe's SH UW Z
+shoebox SH OW B AA K S
+shoehorn SH UW HH AO R N
+shoehorned SH UW HH AO R N D
+shoelace SH UW L EY S
+shoelaces SH UW L EY S AH Z
+shoemake SH UW M EY K
+shoemaker SH UW M EY K ER
+shoemakers SH UW M EY K ER Z
+shoemate SH UW M EY T
+shoen SH UW N
+shoeprint SH UW P R IH N T
+shoeprints SH UW P R IH N T S
+shoes SH UW Z
+shoeshine SH UW SH AY N
+shoestring SH UW S T R IH NG
+shoff SH AO F
+shoffner SH AO F N ER
+shofner SH AA F N ER
+shogren SH AA G R EH N
+shogun SH OW G AH N
+shohat SH OW HH AE T
+shoichi SH OW IY CH IY
+shoichiro SH OW IH CH IH R OW
+shoji SH OW JH IY
+shokhin SH OW K IH N
+shoko SH OW K OW
+sholar SH OW L ER
+sholem SH OW L AH M
+sholes SH OW L Z
+sholl SH AA L
+shollenberger SH AA L AH N B ER G ER
+sholly SH AA L IY
+sholtis SH OW L T IH S
+sholto SH OW L T OW
+shomaker SH OW M EY K ER
+shomo SH OW M OW
+shon SH AA N
+shona SH OW N AH
+shone SH OW N
+shoney SH OW N IY
+shoney's SH OW N IY Z
+shonk SH AA NG K
+shonka SH AA NG K AH
+shonkwiler SH AA NG K W AY L ER
+shontz SH AA N T S
+shoo SH UW
+shoob SH UW B
+shooed SH UW D
+shoofly SH UW F L AY
+shook SH UH K
+shoop SH UW P
+shoopman SH UW P M AH N
+shooshan SH UW SH AH N
+shoot SH UW T
+shootdown SH UW T D AW N
+shooter SH UW T ER
+shooters SH UW T ER Z
+shootin' SH UW T IH N
+shooting SH UW T IH NG
+shootings SH UW T IH NG Z
+shootout SH UW T AW T
+shootouts SH UW T AW T S
+shoots SH UW T S
+shop SH AA P
+shop's SH AA P S
+shope SH OW P
+shopkeeper SH AA P K IY P ER
+shopkeepers SH AA P K IY P ER Z
+shopko SH AA P K OW
+shopkorn SH AA P K AO R N
+shoplift SH AA P L IH F T
+shoplifter SH AA P L IH F T ER
+shoplifters SH AA P L IH F T ER Z
+shoplifting SH AA P L IH F T IH NG
+shoppe SH AA P
+shopped SH AA P T
+shopper SH AA P ER
+shopper's SH AA P ER Z
+shoppers SH AA P ER Z
+shoppers' SH AA P ER Z
+shoppes SH AA P S
+shopping SH AA P IH NG
+shopping's SH AA P IH NG Z
+shops SH AA P S
+shoptaw SH AA P T AO
+shopwell SH AA P W EH L
+shopworn SH AA P W AO R N
+shor SH IY ER
+shorb SH AO R B
+shore SH AO R
+shore's SH AO R Z
+shorebird SH AO R B ER D
+shored SH AO R D
+shoreham SH AO R AH M
+shoreham(2) SH AO R HH AE M
+shoreline SH AO R L AY N
+shorenstein SH AO R AH N S T IY N
+shorenstein(2) SH AO R AH N S T AY N
+shores SH AO R Z
+shoreward SH AO R W ER D
+shorey SH AO R IY
+shorin SH AO R IH N
+shoring SH AO R IH NG
+shorkey SH AO R K IY
+shorn SH AO R N
+shorr SH AO R
+short SH AO R T
+short-winded SH AO R T W IH N D IH D
+shortage SH AO R T AH JH
+shortage(2) SH AO R T IH JH
+shortages SH AO R T AH JH AH Z
+shortages(2) SH AO R T IH JH IH Z
+shortall SH AO R T AH L
+shortcake SH AO R T K EY K
+shortchange SH AO R T CH EY N JH
+shortchanged SH AO R T CH EY N JH D
+shortchanging SH AO R T CH EY N JH IH NG
+shortcoming SH AO R T K AH M IH NG
+shortcomings SH AO R T K AH M IH NG Z
+shortcut SH AO R T K AH T
+shortcuts SH AO R T K AH T S
+shorted SH AO R T IH D
+shortell SH AO R T EH L
+shorten SH AO R T AH N
+shortened SH AO R T AH N D
+shortening SH AO R T AH N IH NG
+shortening(2) SH AO R T N IH NG
+shortens SH AO R T AH N Z
+shorter SH AO R T ER
+shorter's SH AO R T ER Z
+shortest SH AO R T IH S T
+shortfall SH AO R T F AO L
+shortfalls SH AO R T F AO L Z
+shortgrass SH AO R T G R AE S
+shorthair SH AO R T HH EH R
+shorthaired SH AO R T HH EH R D
+shorthand SH AO R T HH AE N D
+shorting SH AO R T IH NG
+shortlived SH AO R T L IH V D
+shortlived(2) SH AO R T L AY V D
+shortly SH AO R T L IY
+shortness SH AO R T N AH S
+shortridge SH AO R T R IH JH
+shorts SH AO R T S
+shorts' SH AO R T S
+shortsighted SH AO R T S AY T IH D
+shortsightedness SH AO R T S AY T IH D N IH S
+shortstop SH AO R T S T AA P
+shortt SH AO R T
+shortterm SH AO R T T ER M
+shortwave SH AO R T W EY V
+shorty SH AO R T IY
+shortz SH AO R T S
+shortz' SH AO R T S
+shortz's SH AO R T S IH Z
+shosh SH OW SH
+shoshone SH OW SH OW N IY
+shostak SH AA S T AH K
+shostakovich SH AO S T AH K OW V IH CH
+shot SH AA T
+shotgun SH AA T G AH N
+shotguns SH AA T G AH N Z
+shots SH AA T S
+shott SH AA T
+shotts SH AA T S
+shotwell SH AA T W EH L
+shougang SH AW G AA NG
+shough SH AW
+should SH UH D
+should've SH UH D AH V
+shoulder SH OW L D ER
+shouldered SH OW L D ER D
+shouldering SH OW L D ER IH NG
+shoulders SH OW L D ER Z
+shouldn't SH UH D AH N T
+shouli SH UW L IY
+shoults SH OW L T S
+shoultz SH OW L T S
+shoumaker SH UW M EY K ER
+shoun SH AW N
+shoup SH UW P
+shoupe SH UW P
+shouse S HH AW S
+shout SH AW T
+shouted SH AW T AH D
+shouted(2) SH AW T IH D
+shouting SH AW T IH NG
+shouts SH AW T S
+shoval SH OW V AE L
+shove SH AH V
+shoved SH AH V D
+shovel SH AH V AH L
+shoveled SH AH V AH L D
+shoveling SH AH V L IH NG
+shovels SH AH V AH L Z
+shover SH AH V ER
+shoves SH AH V Z
+shoving SH AH V IH NG
+shovlin SH AA V L IH N
+show SH OW
+show's SH OW Z
+showa SH OW AH
+showalter SH OW AH L T ER
+showbiz SH OW B IH Z
+showboat SH OW B OW T
+showboat's SH OW B OW T S
+showbuzz SH OW B AH Z
+showcase SH OW K EY S
+showcased SH OW K EY S T
+showcases SH OW K EY S IH Z
+showcasing SH OW K EY S IH NG
+showdown SH OW D AW N
+showdowns SH OW D AW N Z
+showed SH OW D
+showell SH AA W EH L
+shower SH AW ER
+showered SH AW ER D
+showering SH AW ER IH NG
+showers SH AW ER Z
+showgirl SH OW G ER L
+showgirls SH OW G ER L Z
+showiest SH OW IY AH S T
+showing SH OW IH NG
+showings SH OW IH NG Z
+showman SH OW M AH N
+showmanship SH OW M AH N SH IH P
+shown SH OW N
+showpiece SH OW P IY S
+showplace SH OW P L EY S
+showroom SH OW R UH M
+showroom(2) SH OW R UW M
+showrooms SH OW R UW M Z
+shows SH OW Z
+shows' SH OW Z
+showscan SH OW S K AE N
+showtime SH OW T AY M
+showtime's SH OW T AY M Z
+showy SH OW IY
+shrader SH R EY D ER
+shrake SH R EY K
+shramek SH R AE M IH K
+shrank SH R AE NG K
+shrapnel SH R AE P N AH L
+shreck SH R EH K
+shred SH R EH D
+shredded SH R EH D AH D
+shredded(2) SH R EH D IH D
+shredder SH R EH D ER
+shredders SH R EH D ER Z
+shredding SH R EH D IH NG
+shreds SH R EH D Z
+shreeve SH R IY V
+shreffler SH R EH F L ER
+shreiber SH R AY B ER
+shreiner SH R AY N ER
+shreve SH R IY V
+shreveport SH R IY V P AO R T
+shreves SH R IY V Z
+shrewd SH R UW D
+shrewdest SH R UW D AH S T
+shrewdly SH R UW D L IY
+shrewdness SH R UW D N AH S
+shrewsberry SH R UW Z B EH R IY
+shrewsbury SH R UW Z B EH R IY
+shri SH R IY
+shriber SH R AY B ER
+shribman SH R IH B M AH N
+shrider SH R AY D ER
+shriek SH R IY K
+shrieked SH R IY K T
+shrieking SH R IY K IH NG
+shrieks SH R IY K S
+shrift SH R IH F T
+shrikant SH R IY K AA N T
+shrikelike SH R AY K L AY K
+shrill SH R IH L
+shrimp SH R IH M P
+shrimper SH R IH M P ER
+shrimpers SH R IH M P ER Z
+shrine SH R AY N
+shriner SH R AY N ER
+shriners SH R AY N ER Z
+shrines SH R AY N Z
+shrink SH R IH NG K
+shrinkage SH R IH NG K IH JH
+shrinking SH R IH NG K IH NG
+shrinks SH R IH NG K S
+shrivel SH R IH V AH L
+shriveled SH R IH V AH L D
+shriveling SH R IH V AH L IH NG
+shriveling(2) SH R IH V L IH NG
+shriver SH R AY V ER
+shrock SH R AA K
+shrode SH R OW D
+shroff SH R AO F
+shrontz SH R AA N T S
+shropshire SH R AA P SH AY R
+shroud SH R AW D
+shrouded SH R AW D IH D
+shrouding SH R AW D IH NG
+shrouds SH R AW D Z
+shrout SH R AW T
+shroyer SH R OY ER
+shrub SH R AH B
+shrubbery SH R AH B ER IY
+shrubby SH R AH B IY
+shrublike SH R AH B L AY K
+shrubs SH R AH B Z
+shrug SH R AH G
+shrugged SH R AH G D
+shrugging SH R AH G IH NG
+shrugs SH R AH G Z
+shrum SH R AH M
+shrunk SH R AH NG K
+shrunken SH R AH NG K AH N
+shryock SH R AY AA K
+shtick SH T IH K
+shtyrov SH T IY R AO V
+shu SH UW
+shuart SH UW ER T
+shubert SH UW B ER T
+shubin SH UW B IH N
+shuchman SH AH K M AH N
+shuchman's SH AH K M AH N Z
+shuck SH AH K
+shucked SH AH K T
+shucking SH AH K IH NG
+shucks SH AH K S
+shuda SH UW D AH
+shudder SH AH D ER
+shuddered SH AH D ER D
+shuddering SH AH D ER IH NG
+shudders SH AH D ER Z
+shue SH UW
+shuey SH UW IY
+shufelt SH UW F EH L T
+shuff SH AH F
+shuffield SH AH F IY L D
+shuffle SH AH F AH L
+shuffled SH AH F AH L D
+shuffler SH AH F AH L ER
+shuffler(2) SH AH F L ER
+shufflers SH AH F AH L ER Z
+shufflers(2) SH AH F L ER Z
+shuffles SH AH F AH L Z
+shuffling SH AH F L IH NG
+shuffling(2) SH AH F UH L IH NG
+shuford SH UW F ER D
+shufro SH AH F R OW
+shugars SH UW G ER Z
+shugart SH AH G AA R T
+shughart SH AH G HH AA R T
+shugrue SH AH G R UW
+shui SH UW IY
+shukla SH AH K L AH
+shukri SH UW K R IY
+shula SH UW L AH
+shular SH UW L ER
+shuler SH UW L ER
+shull SH AH L
+shulman SH UH L M AH N
+shultis SH AH L T IH S
+shults SH AH L T S
+shultz SH UH L T S
+shultz's SH UH L T S IH Z
+shum SH AH M
+shumake SH UW M EY K
+shumaker SH UW M EY K ER
+shuman SH UW M AH N
+shumard SH UW M ER D
+shumate SH UW M EY T
+shumeet SH UW M IY T
+shumer SH UW M ER
+shumpert SH AH M P ER T
+shumsky SH AH M S K IY
+shumway SH AH M W EY
+shun SH AH N
+shunk SH AH NG K
+shunned SH AH N D
+shunning SH AH N IH NG
+shuns SH AH N Z
+shunt SH AH N T
+shunted SH AH N T IH D
+shunting SH AH N T IH NG
+shunto SH AH N T OW
+shunts SH AH N T S
+shupe SH UW P
+shupert SH UW P ER T
+shuping SH UW P IH NG
+shupp SH AH P
+shur SH ER
+shure SH UH R
+shurgard SH UH R G AA R D
+shurley SH ER L IY
+shurr SH ER
+shurtleff SH ER T L IH F
+shurtliff SH ER T L IH F
+shurtz SH ER T S
+shuster SH AH S T ER
+shusterman SH AH S T ER M AH N
+shut SH AH T
+shutdown SH AH T D AW N
+shutdowns SH AH T D AW N Z
+shute SH UW T
+shutes SH UW T S
+shutout SH AH T AW T
+shuts SH AH T S
+shutt SH AH T
+shutter SH AH T ER
+shuttered SH AH T ER D
+shuttering SH AH T ER IH NG
+shutters SH AH T ER Z
+shutting SH AH T IH NG
+shuttle SH AH T AH L
+shuttle's SH AH T AH L Z
+shuttled SH AH T AH L D
+shuttles SH AH T AH L Z
+shuttlesworth SH AH T AH L Z W ER TH
+shuttleworth SH AH T AH L W ER TH
+shuttling SH AH T AH L IH NG
+shuttling(2) SH AH T L IH NG
+shutts SH AH T S
+shuwa SH UW W AH
+shuwa's SH UW W AH Z
+shy SH AY
+shying SH AY IH NG
+shyjan SH AY JH AE N
+shylock SH AY L AA K
+shyly SH AY L IY
+shymanski SH AH M AE N S K IY
+shyne SH AY N
+shyness SH AY N AH S
+shyster SH AY S T ER
+shysters SH AY S T ER Z
+si S IY
+siad S AY AE D
+siam S AY AE M
+siamese S AY AH M IY Z
+siang S Y AE NG
+siang(2) SH AE NG
+siano S IY AA N OW
+sias ZH AO Z
+sib S IH B
+sibbie S IH B IY
+sibby S IH B IY
+sibelle S IH B EH L
+siberia S AY B IH R IY AH
+siberian S AY B IH R IY AH N
+sibert S IH B ER T
+sibil S IH B AH L
+sibilia S IY B IY L IY AH
+sibilla S IH B IH L AH
+sibille S IH B IH L
+sible S AY B AH L
+sibley S IH B L IY
+sibling S IH B L IH NG
+siblings S IH B L IH NG Z
+sibson S IH B S AH N
+sibyl S IH B AH L
+sibyll S IH B IH L
+sic S IH K
+sica S IY K AH
+sicard S IH K ER D
+sichel S IH K AH L
+sichuan S IH CH W AA N
+sicilia S IH S IH L Y AH
+sicilian S IH S IH L IY AH N
+siciliano S IY CH IY L IY AA N OW
+sicily S IH S AH L IY
+sick S IH K
+sickel S IH K AH L
+sickels S IH K AH L Z
+sicken S IH K AH N
+sickened S IH K AH N D
+sickening S IH K AH N IH NG
+sickening(2) S IH K N IH NG
+sicker S IH K ER
+sickest S IH K AH S T
+sickinger S IH K IH NG ER
+sickle S IH K AH L
+sickler S IH K L ER
+sickles S IH K AH L Z
+sickly S IH K L IY
+sickman S IH K M AH N
+sickness S IH K N AH S
+siconolfi S IY K OW N OW L F IY
+sicotte S IH K AO T
+sid S IH D
+sid's S IH D Z
+sidak S IH D AE K
+siddall S IH D AH L
+siddeley S IH D AH L IY
+siddell S IH D AH L
+sidden S IH D AH N
+siddens S IH D AH N Z
+siddhartha S IH D AA R T AH
+siddig S IH D IH G
+siddiqi S IY D IY K IY
+siddiqui S IY D IY K W IY
+siddle S IH D AH L
+siddons S IH D AH N Z
+side S AY D
+side's S AY D Z
+sidearm S AY D AA R M
+sidearms S AY D AA R M Z
+sidebar S AY D B AA R
+sidebars S AY D B AA R Z
+sided S AY D AH D
+sided(2) S AY D IH D
+sidek S AY D EH K
+sidekick S AY D K IH K
+sideline S AY D L AY N
+sidelined S AY D L AY N D
+sidelines S AY D L AY N Z
+sidell S AY D AH L
+sideman S AY D M AE N
+sidener S IH D IY N ER
+sider S AY D ER
+siderca S IH D ER K AH
+sideris S IH D ER IH S
+siderographer S AY D ER AO G R AH F ER
+siderographers S AY D ER AO G R AH F ER Z
+siders S AY D ER Z
+siders' S AY D ER Z
+sides S AY D Z
+sides' S AY D Z
+sideshow S AY D SH OW
+sideshows S AY D SH OW Z
+sidestep S AY D S T EH P
+sidestepped S AY D S T EH P T
+sidestepping S AY D S T EH P IH NG
+sidesteps S AY D S T EH P S
+sidestream S AY D S T R IY M
+sidetrack S AY D T R AE K
+sidetracked S AY D T R AE K T
+sidewalk S AY D W AO K
+sidewalks S AY D W AO K S
+sidewater S AY D W AO T ER
+sideways S AY D W EY Z
+sidewinder S AY D W AY N D ER
+sidewise S AY D W AY Z
+sidey S AY D IY
+sidgraph S IH D G R AE F
+sidhu S IH D HH UW
+sidi S IH D IY
+siding S AY D IH NG
+sidle S AY D AH L
+sidled S AY D AH L D
+sidler S AY D AH L ER
+sidler(2) S AY D L ER
+sidles S AY D AH L Z
+sidley S IH D L IY
+sidling S AY D AH L IH NG
+sidling(2) S AY D L IH NG
+sidman S IH D M AH N
+sidney S IH D N IY
+sidon S AY D AH N
+sidonia S IY D OW N IY AH
+sidor S IH D ER
+sidoti S IY D OW T IY
+sidra S IH D R AH
+sids S IH D Z
+sidwell S IH D W EH L
+sie S IY
+sie(2) EH S AY IY
+siebe S IY B
+siebel S IY B AH L
+siebels S IY B AH L Z
+sieben S IY B AH N
+siebenaler S IY B IH N AH L ER
+siebenaler(2) S IY B IH N AA L ER
+sieber S IY B ER
+siebers S IY B ER Z
+siebert S IY B ER T
+siebold S IY B OW L D
+siebrecht S IY B R IH K T
+sieck S IY K
+siecle S IY K AH L
+siedenburg S IY D AH N B ER G
+siedlecki S IY D L EH T S K IY
+siedschlag S IY D SH L AH G
+siefert S IY F ER T
+siefert's S IY F ER T S
+siefken S IY F K AH N
+siefker S IY F K ER
+sieg S IY G
+siegal S IY G AH L
+siegan S IY G AH N
+siegan's S IY G AH N Z
+siege S IY JH
+siegecraft S IY JH K R AE F T
+siegel S IY G AH L
+siegel's S IY G AH L Z
+siegell S IY G AH L
+siegelman S IY G AH L M AH N
+siegenthaler S IY G IH N TH AH L ER
+sieger S IY G ER
+siegert S IY G ER T
+sieges S IY JH IH Z
+siegfried S IY G F R IY D
+siegle S IY G AH L
+siegler S IY G L ER
+siegman S IY G M AH N
+siegmann S IY G M AH N
+siegmund S IY G M AH N D
+siegrist S IY G R IH S T
+sieh S IY
+sieja S EY AH
+sieja(2) S EY JH AH
+siek S IY K
+siekierski S IY K IH R S K IY
+siekman S IY K M AH N
+sielaff S IY L AE F
+sieler S IY L ER
+sieling S IY L IH NG
+sieloff S IY L AO F
+sielski S IY L S K IY
+siem S IY M
+siemel S IY M AH L
+siemens S IY M AH N Z
+siemens's S IY M AH N Z
+siemens's(2) S IY M AH N Z IH Z
+siemer S IY M ER
+siemers S IY M ER Z
+sieminski S IY M IH N S K IY
+siemon S IY M AH N
+siems S IY M Z
+siemsen S IY M S AH N
+sienko S IY EH NG K OW
+sienna S IY EH N AH
+sienna's S IY EH N AH Z
+sieracki S IH R AA T S K IY
+sierchio S IY R CH IY OW
+sierra S IY EH R AH
+sierra's S IY EH R AH Z
+sierracin S IY EH R AH S IH N
+sierras S IY EH R AH Z
+siers S IY R Z
+sies S IY Z
+siese S IY EH S
+siess S IY S
+sietsema S IY T S IY M AH
+sieve S IH V
+siever S IY V ER
+sievers S IY V ER Z
+sievert S IY V ER T
+sieves S IH V Z
+sieving S IH V IH NG
+siew S UW
+siewert S IY W ER T
+siewiorek S AH W AO R IH K
+sifco S IH F K OW
+sifers S AY F ER Z
+sifford S IH F ER D
+sift S IH F T
+sifted S IH F T IH D
+sifting S IH F T IH NG
+sifts S IH F T S
+sifuentes S IY F W EH N T EH S
+sig S IH G
+sigafoos S IH G AH F UW Z
+sigal S AY JH AH L
+sigala S IY G AA L AH
+sigel S IH G AH L
+sigfreda S IY G F R EH D AH
+sigg S IH G
+siggers S IH G ER Z
+siggins S IH G IH N Z
+sigh S AY
+sighed S AY D
+sighing S AY IH NG
+sighs S AY Z
+sight S AY T
+sight-seer S AY T S IY R
+sighted S AY T AH D
+sighted(2) S AY T IH D
+sighting S AY T IH NG
+sightings S AY T IH NG Z
+sights S AY T S
+sightsee S AY T S IY
+sightseeing S AY T S IY IH NG
+sightseer S AY T S IY ER
+sightseer(2) S AY T S IY R
+sightseers S AY T S IY ER Z
+sightseers(2) S AY T S IY R Z
+sigl S IH G AH L
+sigle S AY G AH L
+sigler S AY G AH L ER
+sigler(2) S AY G L ER
+sigler(3) S IH G L ER
+sigley S IH G L IY
+siglin S IH G L IH N
+sigma S IH G M AH
+sigmaform S IH G M AH F AO R M
+sigman S IH G M AH N
+sigmon S IH G M AH N
+sigmund S IH G M AH N D
+sign S AY N
+sign's S AY N Z
+signa S IH G N AH
+signage S AY N IH JH
+signal S IH G N AH L
+signal's S IH G N AH L Z
+signaled S IH G N AH L D
+signaling S IH G N AH L IH NG
+signalled S IH G N AH L D
+signalling S IH G N AH L IH NG
+signals S IH G N AH L Z
+signatories S IH G N AH T AO R IY Z
+signatory S IH G N AH T AO R IY
+signature S IH G N AH CH ER
+signatures S IH G N AH CH ER Z
+signed S AY N D
+signer S AY N ER
+signers S AY N ER Z
+signet S IH G N IH T
+significance S AH G N IH F IH K AH N S
+significance(2) S IH G N IH F IH K AH N S
+significant S AH G N IH F IH K AH N T
+significant(2) S IH G N IH F IH K AH N T
+significantly S IH G N IH F IH K AH N T L IY
+signified S IH G N AH F AY D
+signifies S IH G N AH F AY Z
+signify S IH G N AH F AY
+signifying S IH G N AH F AY IH NG
+signing S AY N IH NG
+signings S AY N IH NG Z
+signor S IY N Y AO R
+signore S IY N Y AO R EY
+signorelli S IY G N AO R EH L IY
+signori S IH G N AO R IY
+signori(2) S IY N Y AO R IY
+signpost S AY N P OW S T
+signposts S AY N P OW S T S
+signposts(2) S AY N P OW S S
+signposts(3) S AY N P OW S
+signs S AY N Z
+sigoloff S IH G AH L AO F
+sigourney S IH G AO R N IY
+sigrid S IH G R IH D
+sigrist S IH G R IH S T
+sigur S IH G ER
+sigurd S IH G ER D
+sigurdson S IH G ER D S AH N
+sigwald S IH G W AH L D
+sihanouk S IY AH N UH K
+sikes S AY K S
+sikh S IY K
+sikhs S IY K S
+sikkema S IH K IY M AH
+siklie S IH K L IY
+sikora S IH K AO R AH
+sikorski S IH K AO R S K IY
+sikorsky S IH K AO R S K IY
+sil S IH L
+silajdzic S IH L AA JH IH K
+silajdzic's S IH L AA JH IH K S
+silas S AY L AH S
+silbaugh S IH L B AO
+silber S IH L B ER
+silberberg S IH L B ER B ER G
+silberg S IH L B ER G
+silbergeld S IH L B ER G EH L D
+silberman S IH L B ER M AH N
+silbernagel S IH L B ER N AH G AH L
+silberner S IH L B ER N ER
+silberner's S IH L B ER N ER Z
+silberstein S IH L B ER S T IY N
+silberstein(2) S IH L B ER S T AY N
+silbert S IH L B ER T
+silcott S IH L K AH T
+silcox S IH L K AA K S
+silence S AY L AH N S
+silenced S AY L AH N S T
+silences S AY L AH N S IH Z
+silencing S AY L AH N S IH NG
+silent S AY L AH N T
+silently S AY L AH N T L IY
+sileo S IH L IY OW
+siler S AY L ER
+silesia S IH L IY Z AH
+silex S IH L AH K S
+silex(2) S AY L EH K S
+silfies S IH L F IY Z
+silga S IH L G AH
+silguero S IY L G EH R OW
+silhouette S IH L AH W EH T
+silhouetted S IH L AH W EH T IH D
+silhouettes S IH L AH W EH T S
+silica S IH L AH K AH
+silica(2) S IH L IH K AH
+silicate S IH L AH K AH T
+silicate(2) S IH L AH K EY T
+silicates S IH L AH K AH T S
+silicates(2) S IH L AH K EY T S
+silicon S IH L AH K AH N
+silicone S IH L AH K OW N
+silicones S IH L AH K OW N Z
+siliconix S IH L IH K AA N IH K S
+silk S IH L K
+silken S IH L K AH N
+silkey S IH L K IY
+silks S IH L K S
+silkwood S IH L K W UH D
+silkworm S IH L K W ER M
+silkworms S IH L K W ER M Z
+silky S IH L K IY
+sill S IH L
+siller S IH L ER
+sillerman S IH L ER M AH N
+sillier S IH L IY ER
+silliest S IH L IY AH S T
+silliman S IH L IH M AH N
+silliness S IH L IY N AH S
+sillman S IH L M AH N
+sills S IH L Z
+silly S IH L IY
+silman S IH L M AH N
+silmon S IY L M AO N
+silo S AY L OW
+silos S AY L OW Z
+silsbee S IH L Z B IY
+silsby S IH L S B IY
+silt S IH L T
+siltec S IH L T EH K
+silva S IH L V AH
+silva's S IH L V AH Z
+silva(2) S EH L V AH
+silvadio S IH L V AA D IY OW
+silvadio's S IH L V AA D IY OW Z
+silvana S IH L V AA N AH
+silvar S IH L V AA R
+silvas S IH L V AH Z
+silveira S IY L V EH R AH
+silver S IH L V ER
+silver's S IH L V ER Z
+silvera S IY L V EH R AH
+silverado S IH L V ER AA D OW
+silverberg S IH L V ER B ER G
+silvercrest S IH L V ER K R EH S T
+silverdome S IH L V ER D OW M
+silveri S IY L V EH R IY
+silveria S IY L V EH R IY AH
+silverio S IY L V EH R IY OW
+silverlake S IH L V ER L EY K
+silverman S IH L V ER M AE N
+silvernail S IH L V ER N EY L
+silverplate S IH L V ER P L EY T
+silvers S IH L V ER Z
+silvershoe S IH L V ER SH UW
+silverside S IH L V ER S AY D
+silversides S IH L V ER S AY D Z
+silverstein S IH L V ER S T IY N
+silverstein(2) S IH L V ER S T AY N
+silverstone S IH L V ER S T OW N
+silverthorn S IH L V ER TH AO R N
+silverthorne S IH L V ER TH AO R N
+silverware S IH L V ER W EH R
+silvery S IH L V ER IY
+silvester S IH L V EH S T ER
+silvestre S IY L V EY S T R EY
+silvestri S IY L V EH S T R IY
+silvestro S IY L V EY S T R OW
+silvey S IH L V IY
+silvi S IH L V IY
+silvia S IH L V IY AH
+silvie S IH L V IY
+silvio S IH L V IY OW
+silvis S IH L V IH S
+silvius S IH L V IY IH S
+sim S IH M
+sima S IY M AH
+simard S IH M ER D
+simas S AY M AH Z
+simba S IH M B AH
+simba's S IH M B AH Z
+simcha S IH M HH AH
+simco S IH M K OW
+simcoe S IH M K OW
+simcox S IH M K AA K S
+sime S AY M
+simek S IH M IH K
+simenson S IH M IH N S AH N
+simental S IH M EH N T AH L
+simeon S IH M IY AH N
+simeone S IH M IY AH N
+simer S AY M ER
+simerly S AY M ER L IY
+simerson S IH M ER S AH N
+simes S AY M Z
+simex S IH M EH K S
+simex(2) S AY M EH K S
+simi S IY M IY
+simian S IH M IY AH N
+simich S IH M IH CH
+simien S IH M IY N
+similack S IH M AH L AE K
+similar S IH M AH L ER
+similarities S IH M AH L EH R AH T IY Z
+similarity S IH M AH L EH R AH T IY
+similarly S IH M AH L ER L IY
+similiar S IH M IH L AA R
+simington S IH M IH NG T AH N
+siminski S IH M IH N S K IY
+simion S IH M IY AA N
+simione S IY M IY OW N IY
+simison S IH M IH S AH N
+simkin S IH M K IH N
+simkins S IH M K IH N Z
+simko S IH M K OW
+simler S IH M AH L ER
+simler(2) S IH M L ER
+simm S IH M
+simmer S IH M ER
+simmered S IH M ER D
+simmering S IH M ER IH NG
+simmerman S IH M ER M AH N
+simmers S IH M ER Z
+simmert S IH M ER T
+simmon S IH M AH N
+simmon's S IH M AH N Z
+simmonds S IH M AH N D Z
+simmons S IH M AH N Z
+simmons' S IH M AH N Z
+simmons's S IH M AH N Z IH Z
+simms S IH M Z
+simo S IY M OW
+simoes S AY M OW Z
+simon S AY M AH N
+simon's S AY M AH N Z
+simona S IH M OW N AH
+simonds S AY M AH N D Z
+simone S IH M OW N
+simone's S IH M OW N Z
+simoneau S IH M AH N OW
+simoneaux S IH M AH N OW
+simonelli S IY M OW N EH L IY
+simonet S IH M AH N EH T
+simonetta S IY M AH N EH T AH
+simonette S IH M AH N EH T
+simonetti S IY M OW N EH T IY
+simoni S IY M OW N IY
+simonian S IH M OW N IY AH N
+simonich S IH M AH N IH K
+simonin S IH M AH N IH N
+simonis S IH M AH N IH S
+simons S AY M AH N Z
+simonsen S IH M AH N S AH N
+simonson S IH M AH N S AH N
+simonsson S AY M AH N S AH N
+simonton S AY M AH N T AH N
+simonton(2) S IH M AA N T AH N
+simony S AY M AH N IY
+simper S IH M P ER
+simpkins S IH M P K IH N Z
+simple S IH M P AH L
+simpler S IH M P AH L ER
+simpler(2) S IH M P L ER
+simplesse S IH M P L EH S
+simplest S IH M P L AH S T
+simplex S IH M P L EH K S
+simplicity S IH M P L IH S AH T IY
+simplicity(2) S IH M P L IH S IH T IY
+simplification S IH M P L AH F IH K EY SH AH N
+simplified S IH M P L AH F AY D
+simplifies S IH M P L AH F AY Z
+simplify S IH M P L AH F AY
+simplifying S IH M P L AH F AY IH NG
+simplistic S IH M P L IH S T IH K
+simplot S IH M P L AA T
+simply S IH M P L IY
+simpson S IH M P S AH N
+simpson's S IH M P S AH N Z
+simpsons S IH M P S AH N Z
+simpsons' S IH M P S AH N Z
+sims S IH M Z
+sims' S IH M Z
+simsbury S IH M Z B EH R IY
+simson S IH M S AH N
+simulac S IH M Y AH L AE K
+simulate S IH M Y AH L AH T
+simulate(2) S IH M Y AH L EY T
+simulated S IH M Y AH L EY T IH D
+simulates S IH M Y AH L EY T S
+simulating S IH M Y AH L EY T IH NG
+simulation S IH M Y AH L EY SH AH N
+simulations S IH M Y UW L EY SH AH N Z
+simulations(2) S IH M Y AH L EY SH AH N Z
+simulator S IH M Y AH L EY T ER
+simulators S IH M Y AH L EY T ER Z
+simulcast S AY M Y AH L K AE S T
+simulcast(2) S IH M Y AH L K AE S T
+simultaneous S AY M AH L T EY N IY AH S
+simultaneously S AY M AH L T EY N IY AH S L IY
+sin S IH N
+sinagra S IH N AE G R AH
+sinai S AY N AY
+sinar S AY N ER
+sinatra S AH N AA T R AH
+sinatra's S AH N AA T R AH Z
+sinay S IH N EY
+sinbad S IH N B AE D
+sincavage S IY N K AA V IH JH
+since S IH N S
+sincere S IH N S IH R
+sincerely S IH N S IH R L IY
+sincerity S IH N S EH R AH T IY
+sinclair S IH N K L EH R
+sind S IH N D
+sindelar S IH N D IH L ER
+sindlinger S IH N D L IH NG ER
+sindona S IH N D OW N AH
+sindoni S IY N D OW N IY
+sindt S IH N T
+sine S AY N
+sinead S IH N EY AE D
+sinead(2) SH IH N IY D
+sineath S IH N EH TH
+sinegal S IH N IH G AH L
+siner S AY N ER
+sines S AY N Z
+sinewy S IH N Y UW IY
+sinfonia S IH N F OW N IY AH
+sinful S IH N F AH L
+sing S IH NG
+sing's S IH NG Z
+singapore S IH NG AH P AO R
+singapore's S IH NG AH P AO R Z
+singaporean S IH NG G AH P AO R IY AH N
+singaporeans S IH NG G AH P AO R IY AH N Z
+singe S IH N JH
+singed S IH N JH D
+singel S IH NG G AH L
+singer S IH NG ER
+singer's S IH NG ER Z
+singerman S IH N JH ER M AH N
+singers S IH NG ER Z
+singh S IH NG
+singh's S IH NG Z
+singin' S IH NG IH N
+singing S IH NG IH NG
+singlaub S IH NG L AW B
+single S IH NG G AH L
+single-handed S IH NG G AH L HH AE N D IH D
+singled S IH NG G AH L D
+singlehandedly S IH NG G AH L HH AE N D IH D L IY
+singler S IH NG G AH L ER
+singler(2) S IH NG G L ER
+singles S IH NG G AH L Z
+singletary S IH NG G AH L T EH R IY
+singleterry S IH NG G AH L T EH R IY
+singleton S IH NG G AH L T AH N
+singleton's S IH NG G AH L T AH N Z
+singley S IH NG G L IY
+singling S IH NG G AH L IH NG
+singling(2) S IH NG G L IH NG
+singly S IH NG G L IY
+sings S IH NG Z
+singular S IH NG G Y AH L ER
+singularization S IH NG G Y AH L ER IH Z EY SH AH N
+singularly S IH NG G Y AH L ER L IY
+sinha S IH N HH AH
+sinhalese S IH N AH L IY Z
+siniard S IH N IY ER D
+sinibaldi S IH N IH B AA L D IY
+siniscalchi S IH N IH S K AA L K IY
+sinise S IH N IY Z
+sinisi S IH N IY S IY
+sinister S IH N IH S T ER
+sink S IH NG K
+sinker S IH NG K ER
+sinkfield S IH NG K F IY L D
+sinkhole S IH NG K HH OW L
+sinkhorn S IH NG K HH ER N
+sinking S IH NG K IH NG
+sinkler S IH NG K L ER
+sinko S IH NG K OW
+sinks S IH NG K S
+sinn S IH N
+sinned S IH N D
+sinner S IH N ER
+sinners S IH N ER Z
+sinnett S IH N IH T
+sinning S IH N IH NG
+sinnott S IH N AH T
+sino S AY N OW
+sinopec S AY N OW P EH K
+sinopoli S IY N OW P OW L IY
+sinopoli(2) S IY N AA P OW L IY
+sinor S AY N ER
+sinquefield S IH N K W IH F IY L D
+sins S IH N Z
+sinsabaugh S IH N S AH B AO
+sinsel S IH N S AH L
+sinton S IH N T AH N
+sinuous S IH N W AH S
+sinus S AY N AH S
+sinuses S AY N AH S AH Z
+sinusoid S AY N AH S OY D
+sinusoidal S AY N AH S OY D AH L
+sinusoidally S AY N AH S OY D AH L IY
+sinyard S IH N Y AA R D
+siobhan SH AW B AA N
+sioux S UW
+sip S IH P
+sipa S IY P AH
+sipe S AY P
+sipelstein S IH P AH L S T AY N
+sipelstein(2) S IH P AH L S T IY N
+sipes S AY P S
+siphon S AY F AH N
+siphoned S AY F AH N D
+siphoning S AY F AH N IH NG
+siphons S AY F AH N Z
+siple S AY P AH L
+sipos S AY P OW Z
+sipp S IH P
+sipped S IH P T
+sippel S IH P AH L
+sippican S IH P IH K AH N
+sipping S IH P IH NG
+sipple S IH P AH L
+sips S IH P S
+sir S ER
+siracusa S IH R AA K UW S AH
+siracuse S IH R AA K UW S IY
+siragusa S IH R AA G UW S AH
+siravo S IH R AA V OW
+sircy S ER K IY
+sire S AY ER
+sirek S AO R IH K
+siren S AY R AH N
+sirena S IH R EH N AH
+sirens S AY R AH N Z
+sires S AY R Z
+sirhan S IH R HH AA N
+sirhan(2) S IH R HH AE N
+siri S IH R IY
+sirianni S IH R IY AA N IY
+sirignano S IH R IY N Y AA N OW
+siris S AY R IH S
+siris(2) S IH R IH S
+sirk S ER K
+sirkin S ER K IH N
+sirko S ER K OW
+sirles S ER L Z
+sirman S ER M AH N
+sirmans S ER M AH N Z
+sirmon S ER M AH N
+sirmons S ER M AH N Z
+sirna S ER N AH
+sirohi S ER OW HH IY
+sirois S AY R W AA
+siroky S IH R AH K IY
+siron S AO R AH N
+sirota S IH R OW T AH
+sirowitz S IH R AH W IH T S
+sirri S IH R IY
+sirrine S IH R IY N IY
+sis S IH S
+sisco S IY S K OW
+siscoe S IH S K OW
+sisemore S AY Z M AO R
+sisk S IH S K
+siska S IY S K AH
+siskel S IH S K AH L
+siskel's S IH S K AH L Z
+siskin S IH S K IH N
+siskind S IH S K IH N D
+sisko S IH S K OW
+sisler S IH S AH L ER
+sisler(2) S IH S L ER
+sisley S IH Z L IY
+sisneros S IH S N ER OW Z
+sisney S IH Z N IY
+sison S IH S AH N
+sissel S IH S AH L
+sissie S IH S IY
+sissom S IH S AH M
+sisson S IH S AH N
+sissy S IH S IY
+sistare S IY S T AA R IY
+sistek S IH S T IH K
+sister S IH S T ER
+sister's S IH S T ER Z
+sisterhood S IH S T ER HH UH D
+sisters S IH S T ER Z
+sisti S IH S T IY
+sistine S IH S T IY N
+sisto S IH S T OW
+sistrunk S IH S T R AH NG K
+sisulu S IH S UW L UW
+sit S IH T
+sitar S IH T AA R
+sitars S IH T AA R Z
+sitcom S IH T K AA M
+sitcoms S IH T K AA M Z
+site S AY T
+site's S AY T S
+sited S AY T IH D
+sitek S IH T EH K
+sitenski S IH T EH N S K IY
+sitenski's S IH T EH N S K IY Z
+sitenskis S IH T EH N S K IY Z
+sites S AY T S
+sithe S AY DH
+siting S AY T IH NG
+sitiveni S IY T IH V IY N IY
+sitka S IH T K AH
+sitko S IH T K OW
+sitler S AY T AH L ER
+sitler(2) S AY T L ER
+sitler(3) S IH T L ER
+sitmar S IH T M AA R
+sito S IY T OW
+sito's S IY T OW Z
+sitrick S IH T R IH K
+sits S IH T S
+sitter S IH T ER
+sitterly S IH T ER L IY
+sitters S IH T ER Z
+sittig S IH T IH G
+sittin' S IH T AH N
+sitting S IH T IH NG
+sittler S IH T L ER
+sittner S IH T N ER
+sitton S IH T AH N
+sitts S IH T S
+situate S IH CH UW EY T
+situated S IH CH UW EY T IH D
+situation S IH CH UW EY SH AH N
+situation's S IH CH UW EY SH AH N Z
+situational S IH CH UW EY SH AH N AH L
+situations S IH CH UW EY SH AH N Z
+situs S AY T AH S
+sitz S IH T S
+sitze S IH T Z
+sitzer S IH T Z ER
+sitzes S IH T S IH Z
+sitzman S IH T S M AH N
+sitzmann S IH T S M AH N
+siu S IY UW
+siuda S IY UW D AH
+sivak S IH V AH K
+siver S AY V ER
+siverling S IH V ER L IH NG
+siverson S IH V ER S AH N
+sivertsen S IH V ER T S AH N
+sivertson S IH V ER T S AH N
+sivils S IH V AH L Z
+sivley S IH V L IY
+sivy S IH V IY
+siwek S IH W IH K
+six S IH K S
+6 S IH K S
+six's S IH K S IH Z
+sixed S IH K S T
+sixer S IH K S ER
+sixers S IH K S ER Z
+sixes S IH K S IH Z
+sixfold S IH K S F OW L D
+sixteen S IH K S T IY N
+sixteen's S IH K S T IY N Z
+sixteens S IH K S T IY N Z
+sixteenth S IH K S T IY N TH
+sixteenths S IH K S T IY N TH S
+sixth S IH K S TH
+sixths S IH K S TH S
+sixties S IH K S T IY Z
+sixtieth S IH K S T IY IH TH
+sixty S IH K S T IY
+sixty's S IH K S T IY Z
+sizable S AY Z AH B AH L
+size S AY Z
+sizeable S AY Z AH B AH L
+sized S AY Z D
+sizeler S AY Z L ER
+sizelove S AY Z L AH V
+sizemore S AY Z M AO R
+sizer S AY Z ER
+sizes S AY Z AH Z
+sizes(2) S AY Z IH Z
+sizing S AY Z IH NG
+sizzle S IH Z AH L
+sizzled S IH Z AH L D
+sizzler S IH Z L ER
+sizzlin S IH Z L IH N
+sizzling S IH Z AH L IH NG
+sizzling(2) S IH Z L IH NG
+sjoberg SH OW B ER G
+sjoblom SH OW B L AA M
+sjodin SH OW D IH N
+sjogren SH OW G R AH N
+sjolander SH OW L AE N D ER
+sjoquist SH OW K W IH S T
+sjostrom SH OW S T R AH M
+skaar S K AA R
+skadden S K AE D IH N
+skaff S K AE F
+skaggs S K AE G Z
+skains S K EY N Z
+skala S K AA L AH
+skalicky S K AH L IH K IY
+skalla S K AE L AH
+skalski S K AA L S K IY
+skalsky S K AA L S K IY
+skandia S K AE N D IY ER
+skandia(2) S K AE N D IY AH
+skandia(3) S K AE N D Y AH
+skandinaviska S K AE N D IH N AH V IH S K AH
+skanska S K AE N S K AH
+skarda S K AA R D AH
+skare S K EH R
+skase S K EY Z
+skate S K EY T
+skateboard S K EY T B AO R D
+skateboarding S K EY T B AO R D IH NG
+skated S K EY T IH D
+skater S K EY T ER
+skaters S K EY T ER Z
+skates S K EY T S
+skating S K EY T IH NG
+skeat S K IY T
+skeel S K IY L
+skeels S K IY L Z
+skeen S K IY N
+skeens S K IY N Z
+skees S K IY Z
+skeet S K IY T
+skeete S K IY T
+skeeter S K IY T ER
+skeeters S K IY T ER Z
+skeets S K IY T S
+skeffington S K EH F IH NG T AH N
+skehan S K EY AH N
+skein S K EY N
+skeins S K EY N Z
+skeletal S K EH L AH T AH L
+skeleton S K EH L AH T AH N
+skeletons S K EH L AH T AH N Z
+skellenger S K EH L IH N JH ER
+skelley S K EH L IY
+skelly S K EH L IY
+skelter S K EH L T ER
+skelton S K EH L T AH N
+skenandore S K IH N AE N D ER
+skender S K EH N D ER
+skenderian S K EH N D EH R IY AH N
+skene S K IY N
+skeoch S K IY AA CH
+skeptic S K EH P T IH K
+skeptical S K EH P T AH K AH L
+skeptical(2) S K EH P T IH K AH L
+skeptically S K EH P T IH K AH L IY
+skeptically(2) S K EH P T IH K L IY
+skepticism S K EH P T IH S IH Z AH M
+skeptics S K EH P T IH K S
+skerdal S K EH R D AA L
+skerry S K EH R IY
+sketch S K EH CH
+sketchbook S K EH CH B UH K
+sketchbooks S K EH CH B UH K S
+sketched S K EH CH T
+sketches S K EH CH AH Z
+sketches(2) S K EH CH IH Z
+sketching S K EH CH IH NG
+sketchy S K EH CH IY
+skew S K Y UW
+skewed S K Y UW D
+skewer S K Y UW ER
+skewered S K Y UW ER D
+skewers S K Y UW ER Z
+skewes S K Y UW Z
+skewing S K Y UW IH NG
+skews S K Y UW Z
+ski S K IY
+skiba S K AY B AH
+skibbe S K IH B
+skibicki S K IH B IH K IY
+skibinski S K IH B IH N S K IY
+skibo S K AY B OW
+skibo(2) S K IY B OW
+skid S K IH D
+skidded S K IH D AH D
+skidded(2) S K IH D IH D
+skidding S K IH D IH NG
+skidgel S K IH JH AH L
+skidmore S K IH D M AO R
+skids S K IH D Z
+skied S K IY D
+skier S K AY R
+skier(2) S K IY ER
+skiers S K IY ER Z
+skies S K AY Z
+skiff S K IH F
+skiffington S K IH F IH NG T AH N
+skiffs S K IH F S
+skiing S K IY IH NG
+skiles S K AY L Z
+skill S K IH L
+skilled S K IH L D
+skillen S K IH L AH N
+skillern S K IH L ER N
+skillet S K IH L AH T
+skillful S K IH L F AH L
+skillfully S K IH L F AH L IY
+skillin S K IH L IH N
+skilling S K IH L IH NG
+skillings S K IH L IH NG Z
+skillman S K IH L M AH N
+skills S K IH L Z
+skilton S K IH L T AH N
+skim S K IH M
+skimmed S K IH M D
+skimmer S K IH M ER
+skimmers S K IH M ER Z
+skimming S K IH M IH NG
+skimp S K IH M P
+skimpier S K IH M P IY ER
+skimpiest S K IH M P IY AH S T
+skimping S K IH M P IH NG
+skimpy S K IH M P IY
+skin S K IH N
+skin's S K IH N Z
+skinflint S K IH N F L IH N T
+skinhead S K IH N HH EH D
+skinheads S K IH N HH EH D Z
+skinks S K IH NG K S
+skinless S K IH N L AH S
+skinned S K IH N D
+skinner S K IH N ER
+skinner's S K IH N ER Z
+skinnier S K IH N IY ER
+skinniest S K IH N IY AH S T
+skinny S K IH N IY
+skins S K IH N Z
+skins' S K IH N Z
+skip S K IH P
+skipjack S K IH P JH AE K
+skipjack's S K IH P JH AE K S
+skipjacks S K IH P JH AE K S
+skipp S K IH P
+skippa S K IH P AH
+skippa's S K IH P AH Z
+skipped S K IH P T
+skipper S K IH P ER
+skipper's S K IH P ER Z
+skippers S K IH P ER Z
+skipping S K IH P IH NG
+skippy S K IH P IY
+skips S K IH P S
+skipton S K IH P T AH N
+skipwith S K IH P W IH TH
+skipworth S K IH P W ER TH
+skirdall S K ER D AA L
+skirmish S K ER M IH SH
+skirmishes S K ER M IH SH IH Z
+skirmishing S K ER M IH SH IH NG
+skirt S K ER T
+skirted S K ER T IH D
+skirting S K ER T IH NG
+skirts S K ER T S
+skirvin S K ER V IH N
+skis S K IY Z
+skit S K IH T
+skits S K IH T S
+skittish S K IH T IH SH
+skittishness S K IH T IH SH N AH S
+skittle S K IH T AH L
+skittles S K IH T AH L Z
+skiver S K AY V ER
+sklar S K L AA R
+sklenar S K L EH N ER
+skoal S K OW L
+skoczylas S K AH CH IH L AH Z
+skoda S K OW D AH
+skoff S K AO F
+skog S K AA G
+skogen S K AA G AH N
+skoglund S K AA G L AH N D
+skok S K AA K
+skokie S K OW K IY
+skoler S K OW L ER
+skolnick S K OW L N IH K
+skolnik S K OW L N IH K
+skolniks S K OW L N IH K S
+skonieczny S K AH N IY CH N IY
+skoog S K UW G
+skop S K AA P
+skopje S K AO P L IY EY
+skora S K AO R AH
+skorupa S K ER UW P AH
+skorupski S K ER AH P S K IY
+skousen S K UW S AH N
+skov S K AA V
+skow S K AW
+skowhegan S K OW HH IY G AH N
+skowron S K AW R AH N
+skowronek S K AW R OW N EH K
+skowronski S K AW R AA N S K IY
+skramstad S K R AE M S T AE D
+skroch S K R AA K
+skrocki S K R AA K IY
+skrzypek S K ER Z IH P EH K
+skudra S K UW D R AH
+skufca S K AH F K AH
+skulduggery S K AH L D AH G ER IY
+skulk S K AH L K
+skull S K AH L
+skulls S K AH L Z
+skunk S K AH NG K
+skunks S K AH NG K S
+skura S K UH R AH
+skurdal S K ER D AH L
+skurka S K ER K AH
+skutt S K AH T
+sky S K AY
+sky's S K AY Z
+skybox S K AY B AA K S
+skyboxes S K AY B AA K S IH Z
+skycap S K AY K AE P
+skydive S K AY D AY V
+skydiving S K AY D AY V IH NG
+skydome S K AY D OW M
+skyhawk S K AY HH AO K
+skyhawks S K AY HH AO K S
+skyhigh S K AY HH AY
+skyhopping S K AY HH AO P IH NG
+skylark S K AY L AA R K
+skylarks S K AY L AA R K S
+skylawn S K AY L AO N
+skyles S K AY L Z
+skylight S K AY L AY T
+skylights S K AY L AY T S
+skyline S K AY L AY N
+skylines S K AY L AY N Z
+skylite S K AY L AY T
+skylites S K AY L AY T S
+skyrocket S K AY R AA K AH T
+skyrocketed S K AY R AA K AH T IH D
+skyrocketing S K AY R AA K AH T IH NG
+skyrockets S K AY R AA K AH T S
+skyscraper S K AY S K R EY P ER
+skyscrapers S K AY S K R EY P ER Z
+skytel S K AY T EH L
+skyward S K AY W ER D
+skywave S K AY W EY V
+skyway S K AY W EY
+skywest S K AY W EH S T
+skywriter S K AY R AY T ER
+skywriters S K AY R AY T ER Z
+skywriting S K AY R AY T IH NG
+slab S L AE B
+slabaugh S L AE B AO
+slabs S L AE B Z
+slaby S L EY B IY
+slack S L AE K
+slacked S L AE K T
+slacken S L AE K AH N
+slackened S L AE K AH N D
+slackening S L AE K AH N IH NG
+slackens S L AE K AH N Z
+slacker S L AE K ER
+slackers S L AE K ER Z
+slackness S L AE K N AH S
+slacks S L AE K S
+slade S L EY D
+sladek S L AE D IH K
+sladky S L AE D K IY
+slag S L AE G
+slagel S L AE G AH L
+slager S L EY G ER
+slaght S L AE T
+slagle S L EY G AH L
+slagter S L AE G T ER
+slain S L EY N
+slaine S L EY N
+slalom S L AA L AH M
+slam S L AE M
+slama S L AA M AH
+slammed S L AE M D
+slammer S L AE M ER
+slamming S L AE M IH NG
+slams S L AE M Z
+slander S L AE N D ER
+slandered S L AE N D ER D
+slanderer S L AE N D ER ER
+slandering S L AE N D ER IH NG
+slanderous S L AE N D ER AH S
+slanders S L AE N D ER Z
+slane S L EY N
+slaney S L EY N IY
+slang S L AE NG
+slanina S L AA N IY N AH
+slankard S L AE NG K ER D
+slant S L AE N T
+slanted S L AE N T AH D
+slanted(2) S L AE N T IH D
+slanted(3) S L AE N AH D
+slanted(4) S L AE N IH D
+slanting S L AE N T IH NG
+slap S L AE P
+slapdash S L AE P D AE SH
+slape S L EY P
+slaphappy S L AE P HH AE P IY
+slapped S L AE P T
+slappey S L AE P IY
+slapping S L AE P IH NG
+slaps S L AE P S
+slapstick S L AE P S T IH K
+slash S L AE SH
+slashed S L AE SH T
+slasher S L AE SH ER
+slashes S L AE SH IH Z
+slashing S L AE SH IH NG
+slat S L AE T
+slate S L EY T
+slated S L EY T IH D
+slaten S L EY T AH N
+slater S L EY T ER
+slater's S L EY T ER Z
+slaters S L EY T ER Z
+slates S L EY T S
+slather S L AE DH ER
+slathered S L AE DH ER D
+slathering S L AE DH ER IH NG
+slathers S L AE DH ER Z
+slating S L EY T IH NG
+slatkin S L AE T K IH N
+slaton S L AE T AH N
+slats S L AE T S
+slatten S L AE T AH N
+slatter S L AE T ER
+slattery S L AE T ER IY
+slatton S L AE T AH N
+slaugh S L AO
+slaughter S L AO T ER
+slaughtered S L AO T ER D
+slaughterhouse S L AO T ER HH AW S
+slaughterhouses S L AO T ER HH AW S IH Z
+slaughtering S L AO T ER IH NG
+slaughterings S L AO T ER IH NG Z
+slaughters S L AO T ER Z
+slauson S L AW Z AH N
+slav S L AA V
+slava S L AA V AH
+slave S L EY V
+slaven S L EY V AH N
+slavens S L EY V AH N Z
+slavery S L EY V ER IY
+slaves S L EY V Z
+slavic S L AA V IH K
+slavick S L AE V IH K
+slavik S L AA V IH K
+slavin S L AE V IH N
+slavinski S L AH V IH N S K IY
+slavish S L EY V IH SH
+slavishly S L AE V IH SH L IY
+slavonia S L AH V OW N IY AH
+slavonia(2) S L AH V OW N Y AH
+slavs S L AA V Z
+slaw S L AO
+slawinski S L AA V IH N S K IY
+slawson S L AO S AH N
+slay S L EY
+slayback S L EY B AE K
+slaybaugh S L EY B AO
+slayden S L EY D AH N
+slaydon S L EY D AH N
+slayer S L EY ER
+slaying S L EY IH NG
+slayings S L EY IH NG Z
+slaymaker S L EY M EY K ER
+slayter S L EY T ER
+slayton S L EY T AH N
+sleasman S L IY Z M AH N
+sleator S L EY T ER
+sleaze S L IY Z
+sleazy S L IY Z IY
+slechta S L EH CH T AH
+sled S L EH D
+sledd S L EH D
+sledding S L EH D IH NG
+sledge S L EH JH
+sledgehammer S L EH JH HH AE M ER
+sleds S L EH D Z
+sledz S L EH D Z
+slee S L IY
+sleek S L IY K
+sleeker S L IY K ER
+sleekest S L IY K AH S T
+sleekly S L IY K L IY
+sleeman S L IY M AH N
+sleep S L IY P
+sleeper S L IY P ER
+sleepers S L IY P ER Z
+sleepily S L IY P AH L IY
+sleepiness S L IY P IY N AH S
+sleeping S L IY P IH NG
+sleepless S L IY P L AH S
+sleeps S L IY P S
+sleepwalk S L IY P W AO K
+sleepwalker S L IY P W AO K ER
+sleepwalkers S L IY P W AO K ER Z
+sleepwalking S L IY P W AO K IH NG
+sleepwear S L IY P W EH R
+sleepy S L IY P IY
+sleet S L IY T
+sleeter S L IY T ER
+sleeth S L IY TH
+sleeve S L IY V
+sleeved S L IY V D
+sleeveless S L IY V L IH S
+sleeves S L IY V Z
+sleigh S L EY
+sleight S L AY T
+sleipner S L AY P N ER
+slemmer S L EH M ER
+slemp S L EH M P
+slender S L EH N D ER
+slentz S L EH N T S
+slepian S L IY P IY AH N
+slepian(2) S L IY P Y AH N
+slept S L EH P T
+slessenger S L EH S EH N G ER
+sletten S L EH T AH N
+sleuth S L UW TH
+sleuthing S L UW TH IH NG
+sleuths S L UW TH S
+sleven S L IY V AH N
+slevin S L EH V IH N
+slew S L UW
+slezak S L EH Z AH K
+slice S L AY S
+sliced S L AY S T
+slicer S L AY S ER
+slices S L AY S AH Z
+slices(2) S L AY S IH Z
+slicing S L AY S IH NG
+slick S L IH K
+slicked S L IH K T
+slicker S L IH K ER
+slickers S L IH K ER Z
+slickest S L IH K AH S T
+slickly S L IH K L IY
+slicks S L IH K S
+slid S L IH D
+slide S L AY D
+slider S L AY D ER
+slides S L AY D Z
+sliding S L AY D IH NG
+slife S L AY F
+slifer S L AY F ER
+slifka S L IH F K AH
+slifko S L IH F K OW
+sligar S L IH G ER
+sliger S L AY G ER
+sligh S L AY
+slight S L AY T
+slighted S L AY T IH D
+slightest S L AY T AH S T
+slighting S L AY T IH NG
+slightly S L AY T L IY
+slights S L AY T S
+sliker S L AY K ER
+slim S L IH M
+slimak S L IH M AH K
+slime S L AY M
+slimmed S L IH M D
+slimmer S L IH M ER
+slimmest S L IH M AH S T
+slimming S L IH M IH NG
+slimp S L IH M P
+slims S L IH M Z
+slimy S L AY M IY
+sliney S L IH N IY
+sling S L IH NG
+slinger S L IH NG ER
+slingerland S L IH NG G ER L AH N D
+slinging S L IH NG IH NG
+slings S L IH NG Z
+slingshot S L IH NG SH AA T
+slingshots S L IH NG SH AA T S
+slinkard S L IH NG K ER D
+slinker S L IH NG K ER
+slinky S L IH NG K IY
+slip S L IH P
+slip-on S L IH P AA N
+slip-ons S L IH P AA N Z
+slippage S L IH P IH JH
+slipped S L IH P T
+slipper S L IH P ER
+slippers S L IH P ER Z
+slippery S L IH P ER IY
+slippery(2) S L IH P R IY
+slipping S L IH P IH NG
+slips S L IH P S
+slipshod S L IH P SH AA D
+slit S L IH T
+sliter S L IY T ER
+slither S L IH DH ER
+slithering S L IH DH ER IH NG
+slits S L IH T S
+slitting S L IH T IH NG
+sliva S L IY V AH
+sliver S L IH V ER
+slivers S L IH V ER Z
+slivinski S L IH V IH N S K IY
+slivka S L IH V K AH
+slivovitz S L IH V AH V IH T S
+sliwa S L AY V AH
+sliwinski S L IH V IH N S K IY
+sloan S L OW N
+sloan's S L OW N Z
+sloane S L OW N
+sloat S L OW T
+sloate S L OW T
+slob S L AA B
+slobber S L AA B ER
+slobbering S L AA B ER IH NG
+sloboda S L AH B OW D AH
+slobodan S L OW B OW D AA N
+slobogin S L AH B OW G AH N
+slobogin's S L AH B OW G AH N Z
+slobs S L AA B Z
+slocan S L OW K AH N
+slocan's S L OW K AH N Z
+slocomb S L OW K AH M
+slocum S L OW K AH M
+slocumb S L OW K AH M
+sloe S L OW
+slog S L AA G
+slogan S L OW G AH N
+slogans S L OW G AH N Z
+slogged S L AA G D
+slogging S L AA G IH NG
+slokum S L OW K AH M
+sloma S L OW M AH
+sloman S L OW M AH N
+slominski S L AH M IH N S K IY
+slomski S L AA M S K IY
+slonaker S L AA N AH K ER
+slone S L OW N
+sloniker S L AA N IH K ER
+sloop S L UW P
+slop S L AA P
+slope S L OW P
+sloper S L OW P ER
+slopes S L OW P S
+sloping S L OW P IH NG
+sloppier S L AA P IY ER
+sloppiest S L AA P IY AH S T
+sloppily S L AA P AH L IY
+sloppiness S L AA P IY N AH S
+sloppy S L AA P IY
+slorc S L AO R K
+slosh S L AA SH
+sloshing S L AA SH IH NG
+sloss S L AO S
+slot S L AA T
+slota S L OW T AH
+sloth S L OW TH
+slothower S L AA TH OW ER
+slotnick S L AA T N IH K
+slots S L AA T S
+slott S L AA T
+slotted S L AA T IH D
+slotting S L AA T IH NG
+slouch S L AW CH
+slouches S L AW CH IH Z
+slouching S L AW CH IH NG
+slough S L AH F
+sloughs S L AH F S
+slovacek S L AA V AH CH EH K
+slovak S L OW V AE K
+slovak(2) S L OW V AA K
+slovakia S L OW V AA K IY AH
+slovakia's S L OW V AA K IY AH Z
+slovakia's(2) S L OW V AE K IY AH Z
+slovaks S L OW V AE K S
+slovaks(2) S L OW V AA K S
+slovene S L OW V IY N
+slovenes S L OW V IY N Z
+slovenia S L OW V IY N IY AH
+slovenian S L OW V IY N IY AH N
+slovenliness S L AH V AH N L IY N AH S
+slovenly S L AH V AH N L IY
+slover S L OW V ER
+sloves S L OW V Z
+slovo S L OW V OW
+slovonia S L AH V OW N IY AH
+slovonia(2) S L AH V OW N Y AH
+slow S L OW
+slowdown S L OW D AW N
+slowdowns S L OW D AW N Z
+slowed S L OW D
+slower S L OW ER
+slowest S L OW AH S T
+slowey S L OW IY
+slowik S L OW IH K
+slowing S L OW IH NG
+slowinski S L OW IH N S K IY
+slowly S L OW L IY
+slowness S L OW N AH S
+slowpoke S L OW P OW K
+slows S L OW Z
+sluder S L UW D ER
+sludge S L AH JH
+sludgy S L AH JH IY
+slug S L AH G
+sluga S L UW G AH
+slugfest S L AH G F EH S T
+slugged S L AH G D
+slugger S L AH G ER
+sluggers S L AH G ER Z
+slugging S L AH G IH NG
+sluggish S L AH G IH SH
+sluggishly S L AH G IH SH L IY
+sluggishness S L AH G IH SH N AH S
+slugs S L AH G Z
+sluice S L UW S
+sluicing S L UW S IH NG
+sluiter S L UW T ER
+sluka S L UW K AH
+slum S L AH M
+slumber S L AH M B ER
+slumbering S L AH M B ER IH NG
+slump S L AH M P
+slumped S L AH M P T
+slumping S L AH M P IH NG
+slumps S L AH M P S
+slums S L AH M Z
+slung S L AH NG
+slupic S L UW P IH K
+slur S L ER
+slurp S L ER P
+slurred S L ER D
+slurring S L ER IH NG
+slurry S L ER IY
+slurs S L ER Z
+slush S L AH SH
+slushayete S L UH SH EY EH T
+slusher S L AH SH ER
+sluss S L AH S
+slusser S L AH S ER
+slut S L AH T
+slutsky S L AH T S K IY
+slutty S L AH T IY
+slutz S L AH T S
+slutzky S L AH T S K IY
+sluyter S L AY T ER
+sly S L AY
+slye S L AY
+slyly S L AY L IY
+slyness S L AY N AH S
+slyter S L AY T ER
+smaby S M EY B IY
+smack S M AE K
+smacked S M AE K T
+smacking S M AE K IH NG
+smacks S M AE K S
+smail S M EY L
+smaldone S M AE L D AH N
+smale S M EY L
+small S M AO L
+smallcap S M AO L K AE P
+smallen S M AO L AH N
+smaller S M AO L ER
+smallest S M AO L AH S T
+smalley S M AA L IY
+smalling S M AO L IH NG
+smallish S M AO L IH SH
+smallman S M AO L M AH N
+smallness S M AO L N AH S
+smallpox S M AO L P AA K S
+smallridge S M AO L R IH JH
+smalls S M AO L Z
+smalltalk S M AO L T AO K
+smalltown S M AO L T AW N
+smallwood S M AO L W UH D
+smaltz S M AE L T S
+smarmy S M AA R M IY
+smarr S M AE R
+smart S M AA R T
+smartaleck S M AA R T EH L AH K
+smartass S M AA R T AE S
+smartcard S M AA R T K AA R D
+smarted S M AA R T AH D
+smarten S M AA R T AH N
+smartened S M AA R T AH N D
+smartening S M AA R T AH N IH NG
+smarter S M AA R T ER
+smartest S M AA R T AH S T
+smarties S M AA R T IY Z
+smarting S M AA R T IH NG
+smartish S M AA R T IH SH
+smartly S M AA R T L IY
+smartmoney S M AA R T M AH N IY
+smartness S M AA R T N IH S
+smarts S M AA R T S
+smartt S M AA R T
+smarty S M AA R T IY
+smash S M AE SH
+smashed S M AE SH T
+smasher S M AE SH ER
+smashes S M AE SH IH Z
+smashing S M AE SH IH NG
+smather S M AE DH ER
+smathers S M AE DH ER Z
+smatter S M AE T ER
+smattering S M AE T ER IH NG
+smay S M EY
+smead S M IY D
+smeal S M IY L
+smear S M IH R
+smeared S M IH R D
+smearing S M IH R IH NG
+smears S M IH R Z
+smeby S M IY B IY
+smedberg S M EH D B ER G
+smedley S M EH D L IY
+smee S M IY
+smeeting S M IY T IH NG
+smejkal S M EH JH K AH L
+smelcer S M EH L S ER
+smell S M EH L
+smelled S M EH L D
+smelley S M EH L IY
+smelling S M EH L IH NG
+smells S M EH L Z
+smelly S M EH L IY
+smelser S M EH L S ER
+smelt S M EH L T
+smelter S M EH L T ER
+smelter's S M EH L T ER Z
+smelters S M EH L T ER Z
+smelting S M EH L T IH NG
+smeltz S M EH L T S
+smeltzer S M EH L T Z ER
+smestad S M EH S T AH D
+smet S M EH T
+smetana S M EH T AH N AH
+smethers S M EH DH ER Z
+smethurst S M EH TH ER S T
+smetzer S M EH T Z ER
+smick S M IH K
+smid S M IH D
+smiddy S M IH D IY
+smidgen S M IH JH AH N
+smidt S M IH D T
+smigel S M IH JH AH L
+smigelski S M IH G EH L S K IY
+smigiel S M IH JH IY L
+smigielski S M IH G IY L S K IY
+smile S M AY L
+smiled S M AY L D
+smiles S M AY L Z
+smiley S M AY L IY
+smilgis S M IH L G IH Z
+smilgis(2) S M IH L JH IH Z
+smilie S M IH L IY
+smiling S M AY L IH NG
+smilingly S M AY L IH NG L IY
+smillie S M IH L IY
+smilow S M IH L OW
+smink S M IH NG K
+smirk S M ER K
+smirking S M ER K IH NG
+smirks S M ER K S
+smirnoff S M ER N AO F
+smirnov S M ER N AA F
+smirnova S M ER N OW V AH
+smisek S M IH S EH K
+smit S M IH T
+smith S M IH TH
+smith's S M IH TH S
+smithburg S M IH TH B ER G
+smithee S M IH TH IY
+smither S M IH DH ER
+smithereen S M IH DH ER IY N
+smithereens S M IH DH ER IY N Z
+smitherman S M IH DH ER M AH N
+smithers S M IH DH ER Z
+smithey S M IH TH IY
+smithfield S M IH TH F IY L D
+smithhart S M IH TH HH AA R T
+smithkline S M IH TH K L AY N
+smithkline's S M IH TH K L AY N Z
+smiths S M IH TH S
+smithson S M IH TH S AH N
+smithson's S M IH TH S AH N Z
+smithsonian S M IH TH S OW N IY AH N
+smithsonian's S M IH TH S OW N IY AH N Z
+smithsonian's(2) S M IH S OW N IY AH N Z
+smithsonian(2) S M IH S OW N IY AH N
+smithtown S M IH TH T AW N
+smithwick S M IH TH W IH K
+smitley S M IH T L IY
+smits S M IH T S
+smitten S M IH T AH N
+smittle S M IH T AH L
+smitty S M IH T IY
+smoak S M OW K
+smock S M AA K
+smog S M AA G
+smoggiest S M AA G IY AH S T
+smoggy S M AO G IY
+smoke S M OW K
+smoked S M OW K T
+smokejumper S M OW K JH AH M P ER
+smokejumpers S M OW K JH AH M P ER Z
+smokeless S M OW K L AH S
+smoker S M OW K ER
+smoker's S M OW K ER Z
+smokers S M OW K ER Z
+smokers' S M OW K ER Z
+smokes S M OW K S
+smokescreen S M OW K S K R IY N
+smokestack S M OW K S T AE K
+smokestacks S M OW K S T AE K S
+smokey S M OW K IY
+smoking S M OW K IH NG
+smoking's S M OW K IH NG Z
+smoky S M OW K IY
+smola S M OW L AH
+smolak S M OW L AH K
+smolder S M OW L D ER
+smoldering S M OW L D ER IH NG
+smolen S M AA L AH N
+smolensk S M OW L EH N S K
+smolenski S M AH L EH N S K IY
+smoley S M OW L IY
+smolik S M OW L IH K
+smolin S M OW L IH N
+smolinski S M AH L IH N S K IY
+smolinsky S M AH L IH N S K IY
+smolka S M OW L K AH
+smoot S M UW T
+smooth S M UW DH
+smoothed S M UW DH D
+smoothen S M UW DH IH N
+smoothens S M UW DH IH N Z
+smoother S M UW DH ER
+smoothest S M UW DH AH S T
+smoothing S M UW DH IH NG
+smoothly S M UW DH L IY
+smoothness S M UW DH N AH S
+smooths S M UW DH Z
+smoots S M UW T S
+smorgasbord S M AO R G AH S B AO R D
+smosh S M UH SH
+smoshed S M UH SH T
+smoshes S M UH SH AH Z
+smoshing S M UH SH IH NG
+smother S M AH DH ER
+smothered S M AH DH ER D
+smothering S M AH DH ER IH NG
+smotherman S M AH DH ER M AH N
+smothermon S M AA TH ER M OW N
+smothers S M AH DH ER Z
+smotrich S M AA T R IH K
+smouse S M AW S
+smoyer S M OY ER
+smrekar S M R EH K ER
+smrekar(2) S M ER IH K ER
+smuck S M AH K
+smucker S M AH K ER
+smudge S M AH JH
+smudged S M AH JH D
+smug S M AH G
+smuggle S M AH G AH L
+smuggled S M AH G AH L D
+smuggler S M AH G L ER
+smuggler's S M AH G L ER Z
+smuggler(2) S M AH G AH L ER
+smugglers S M AH G L ER Z
+smugglers' S M AH G L ER Z
+smugglers'(2) S M AH G AH L ER Z
+smugglers(2) S M AH G AH L ER Z
+smuggling S M AH G L IH NG
+smuggling(2) S M AH G AH L IH NG
+smugly S M AH G L IY
+smugness S M AH G N AH S
+smull S M AH L
+smullen S M AH L AH N
+smurf S M ER F
+smurfit S M ER F IH T
+smurfs S M ER F S
+smut S M AH T
+smyers S M AY ER Z
+smylie S M IH L IY
+smyly S M IH L IY
+smyre S M AY R
+smyrna S M ER N AH
+smyser S M AY S ER
+smyth S M AY TH
+smyth(2) S M IH TH
+smythe S M AY DH
+snabel S N AA B AH L
+snack S N AE K
+snackbar S N AE K B AA R
+snacked S N AE K T
+snacking S N AE K IH NG
+snacks S N AE K S
+snackwell S N AE K W EH L
+snackwell's S N AE K W EH L Z
+snackwells S N AE K W EH L Z
+snader S N EY D ER
+snafu S N AE F UW
+snafus S N AE F AH S
+snag S N AE G
+snagged S N AE G D
+snagger S N AE G ER
+snaggers S N AE G ER Z
+snagging S N AE G IH NG
+snags S N AE G Z
+snail S N EY L
+snail's S N EY L Z
+snails S N EY L Z
+snake S N EY K
+snake's S N EY K S
+snakebite S N EY K B AY T
+snakebites S N EY K B AY T S
+snakelike S N EY K L AY K
+snakes S N EY K S
+snaking S N EY K IH NG
+snap S N AE P
+snapdragon S N AE P D R AE G AH N
+snapdragons S N AE P D R AE G AH N Z
+snape S N EY P
+snapp S N AE P
+snapped S N AE P T
+snapper S N AE P ER
+snapping S N AE P IH NG
+snapple S N AE P AH L
+snapple's S N AE P AH L Z
+snapples S N AE P AH L Z
+snappy S N AE P IY
+snaps S N AE P S
+snapshot S N AE P SH AA T
+snapshots S N AE P SH AA T S
+snare S N EH R
+snared S N EH R D
+snares S N EH R Z
+snaring S N EH R IH NG
+snarl S N AA R L
+snarled S N AA R AH L D
+snarling S N AA R L IH NG
+snarls S N AA R L Z
+snarr S N AE R
+snarski S N AA R S K IY
+snatch S N AE CH
+snatched S N AE CH T
+snatcher S N AE CH ER
+snatchers S N AE CH ER Z
+snatches S N AE CH IH Z
+snatching S N AE CH IH NG
+snavely S N EY V L IY
+snay S N EY
+snazzier S N AE Z IY ER
+snazzy S N AE Z IY
+snead S N IY D
+sneak S N IY K
+sneaked S N IY K T
+sneaker S N IY K ER
+sneakers S N IY K ER Z
+sneaking S N IY K IH NG
+sneaks S N IY K S
+sneaky S N IY K IY
+sneary S N IH R IY
+sneath S N EH TH
+snecma S N EH K M AA
+snedaker S N EH D AH K ER
+snedden S N EH D AH N
+sneddon S N EH D AH N
+snedegar S N EH D IH G ER
+snedeker S N EH D IH K ER
+snee S N IY
+sneed S N IY D
+sneer S N IH R
+sneered S N IH R D
+sneering S N IH R IH NG
+sneeringer S N IH R IH N JH ER
+sneers S N IH R Z
+sneeze S N IY Z
+sneezed S N IY Z D
+sneezes S N IY Z IH Z
+sneezing S N IY Z IH NG
+sneh S N EH
+sneider S N AY D ER
+snelgrove S N EH L G R OW V
+snell S N EH L
+snellen S N EH L AH N
+snellenberger S N EH L AH N B ER G ER
+sneller S N EH L ER
+snellgrove S N EH L G R OW V
+snelling S N EH L IH NG
+snellings S N EH L IH NG Z
+snelson S N EH L S AH N
+snethen S N EH TH AH N
+snia S N IY AH
+snicker S N IH K ER
+snickered S N IH K ER D
+snickering S N IH K ER IH NG
+snickers S N IH K ER Z
+snide S N AY D
+snider S N AY D ER
+snidow S N IH D OW
+sniegowski S N IY G AO F S K IY
+sniff S N IH F
+sniffed S N IH F T
+sniffen S N IH F AH N
+sniffer S N IH F ER
+sniffier S N IH F IY ER
+sniffiest S N IH F IY AH S T
+sniffily S N IH F AH L IY
+sniffing S N IH F IH NG
+sniffle S N IH F AH L
+sniffler S N IH F L ER
+sniffles S N IH F AH L Z
+sniffling S N IH F L IH NG
+sniffs S N IH F S
+sniffy S N IH F IY
+snifter S N IH F T ER
+snifters S N IH F T ER Z
+snip S N IH P
+snipe S N AY P
+sniped S N AY P T
+sniper S N AY P ER
+sniper's S N AY P ER Z
+snipers S N AY P ER Z
+snipers' S N AY P ER Z
+snipes S N AY P S
+sniping S N AY P IH NG
+snippet S N IH P AH T
+snippets S N IH P AH T S
+snips S N IH P S
+snitch S N IH CH
+snitching S N IH CH IH NG
+snitker S N IH T K ER
+snitzer S N IH T Z ER
+snively S N AY V L IY
+snob S N AA B
+snobbery S N AA B ER IY
+snobbish S N AA B IH SH
+snobby S N AA B IY
+snobs S N AA B Z
+snodderly S N AA D ER L IY
+snoddy S N AA D IY
+snodgrass S N AA D G R AE S
+snohomish S N AA HH AH M IH SH
+snoke S N OW K
+snook S N UH K
+snooker S N UH K ER
+snookered S N UH K ER D
+snooks S N UH K S
+snoop S N UW P
+snooping S N UW P IH NG
+snoopy S N UW P IY
+snooty S N UW T IY
+snooze S N UW Z
+snoozing S N UW Z IH NG
+snore S N AO R
+snoring S N AO R IH NG
+snort S N AO R T
+snorted S N AO R T IH D
+snorter S N AO R T ER
+snorters S N AO R T ER Z
+snorting S N AO R T IH NG
+snorts S N AO R T S
+snot S N AO T
+snouffer S N OW F ER
+snout S N AW T
+snout's S N AW T S
+snouts S N AW T S
+snover S N OW V ER
+snow S N OW
+snow's S N OW Z
+snowball S N OW B AO L
+snowball's S N OW B AO L Z
+snowballed S N OW B AO L D
+snowballing S N OW B AO L IH NG
+snowballs S N OW B AO L Z
+snowberger S N OW B ER G ER
+snowbird S N OW B ER D
+snowbirds S N OW B ER D Z
+snowboard S N OW B AO R D
+snowboarder S N OW B AO R D ER
+snowboarders S N OW B AO R D ER Z
+snowboards S N OW B AO R D Z
+snowbound S N OW B AW N D
+snowden S N OW D AH N
+snowdon S N OW D AH N
+snowe S N OW
+snowed S N OW D
+snowfall S N OW F AA L
+snowfalls S N OW F AA L Z
+snowflake S N OW F L EY K
+snowflakes S N OW F L EY K S
+snowing S N OW IH NG
+snowman S N OW M AE N
+snowmobile S N OW M OW B IY L
+snowmobiles S N OW M OW B IY L Z
+snowplow S N OW P L AW
+snowplows S N OW P L AW Z
+snows S N OW Z
+snowshoe S N OW SH UW
+snowstorm S N OW S T AO R M
+snowstorms S N OW S T AO R M Z
+snowy S N OW IY
+snub S N AH B
+snubbed S N AH B D
+snubbing S N AH B IH NG
+snubs S N AH B Z
+snuck S N AH K
+snuff S N AH F
+snuffed S N AH F T
+snuffer S N AH F ER
+snuffing S N AH F IH NG
+snuffs S N AH F S
+snug S N AH G
+snugging S N AH G IH NG
+snuggle S N AH G AH L
+snuggs S N AH G Z
+snugly S N AH G L IY
+snyder S N AY D ER
+snyder's S N AY D ER Z
+snydergeneral S N AY D ER JH EH N ER AH L
+so S OW
+so's S OW Z
+so-called S OW K AO L D
+so-so S OW S OW
+soady S OW D IY
+soak S OW K
+soaked S OW K T
+soaker S OW K ER
+soaking S OW K IH NG
+soaks S OW K S
+soap S OW P
+soapbox S OW P B AA K S
+soaps S OW P S
+soapy S OW P IY
+soar S AO R
+soard S AO R D
+soared S AO R D
+soares S AO R EH S
+soaring S AO R IH NG
+soars S AO R Z
+soave S OW V
+sob S AA B
+sobbed S AA B D
+sobbing S AA B IH NG
+sobbingly S AA B IH NG L IY
+sobczak S AA B CH AE K
+sobczyk S AA B CH IH K
+sobeck S OW B EH K
+sobecki S AH B EH T S K IY
+sobek S OW B IH K
+sobel S OW B AH L
+sobelman S OW B AH L M AH N
+sober S OW B ER
+sobered S OW B ER D
+sobering S OW B ER IH NG
+soberly S OW B ER L IY
+sobers S OW B ER Z
+sobey S OW B IY
+sobibor S OW B IY B AO R
+sobibor(2) S OW B IH B AO R
+sobiech S AA B IY HH
+sobieski S OW B IY EH S K IY
+sobil S OW B AH L
+sobil's S OW B AH L Z
+sobils S OW B AH L Z
+sobin S OW B IH N
+sobkowiak S AH B K AW IY AE K
+soble S OW B AH L
+sobocinski S AH B AH CH IH N S K IY
+sobol S OW B AH L
+soboleski S AH B AH L EH S K IY
+sobolewski S AH B AH L EH F S K IY
+sobolik S AH B OW L IH K
+sobon S OW B AO N
+sobota S AH B OW T AH
+sobotka S AH B OW T K AH
+sobotta S OW B OW T AH
+sobriety S AH B R AY AH T IY
+sobriquet S OW B R AH K EY
+sobriquet(2) S AH B R AH K EH T
+sobs S AA B Z
+socal S OW K AH L
+socalled S OW K AA L D
+socanav S AA K AH N AA V
+socarras S OW K AA R AA Z
+soccer S AA K ER
+soccer's S AA K ER Z
+socci S OW CH IY
+socha S OW CH AH
+sochacki S AH CH AE K IY
+sochet S OW SH EY
+sochi S OW CH IY
+sochor S AA K ER
+socia S OW CH AH
+sociable S OW SH AH B AH L
+social S OW SH AH L
+socialism S OW SH AH L IH Z AH M
+socialist S OW SH AH L AH S T
+socialist(2) S OW SH AH L IH S T
+socialistic S OW SH AH L IH S T IH K
+socialists S OW SH AH L AH S T S
+socialists' S OW SH AH L IH S T S
+socialists'(2) S OW SH AH L IH S S
+socialists'(3) S OW SH AH L IH S
+socialists(2) S OW SH AH L IH S T S
+socialists(3) S OW SH AH L IH S S
+socialists(4) S OW SH AH L IH S
+socialite S OW SH AH L AY T
+socialites S OW SH AH L AY T S
+socialization S OW SH AH L IH Z EY SH AH N
+socialize S OW SH AH L AY Z
+socialized S OW SH AH L AY Z D
+socializing S OW SH AH L AY Z IH NG
+socially S OW SH AH L IY
+sociedad S OW S IY D AE D
+societa S OW S IY EH T AH
+societal S AH S AY IH T AH L
+societe S OW S IY EH T EY
+societies S AH S AY AH T IY Z
+society S AH S AY AH T IY
+society's S AH S AY AH T IY Z
+socio S OW S IY OW
+socioeconomic S OW S IY OW EH K AH N AA M IH K
+sociological S OW S IY AH L AA JH IH K AH L
+sociologist S OW S IY AA L AH JH IH S T
+sociologists S OW S IY AA L AH JH IH S T S
+sociologists(2) S OW S IY AA L AH JH IH S S
+sociologists(3) S OW S IY AA L AH JH IH S
+sociology S OW S IY AA L AH JH IY
+sociopath S OW S IY OW P AE TH
+sociopaths S OW S IY OW P AE DH Z
+sock S AA K
+socked S AA K T
+socket S AA K AH T
+sockets S AA K AH T S
+socking S AA K IH NG
+socks S AA K S
+sockwell S AA K W EH L
+soco S OW K OW
+soco's S OW K OW Z
+soco's(2) S AA K OW Z
+soco(2) S AA K OW
+socol S OW K AA L
+socrates S AA K R AH T IY Z
+socratic S AH K R AE T IH K
+sod S AA D
+soda S OW D AH
+soda's S OW D AH Z
+sodano S OW D AA N OW
+sodaro S OW D AA R OW
+sodas S OW D AH Z
+sodden S AA D AH N
+sodders S AA D ER Z
+sodecom S OW D AH K AA M
+soden S OW D AH N
+soder S OW D ER
+soderberg S OW D ER B ER G
+soderbergh S OW D ER B ER G
+soderblom S OW D ER B L AA M
+sodergren S AA D ER G R EH N
+soderholm S OW D ER HH OW L M
+soderlund S AA D ER L AH N D
+soderman S OW D ER M AH N
+soderquist S AA D ER K W IH S T
+soderstrom S AA D ER S T R AH M
+soditic S OW D IH T IH K
+sodium S OW D IY AH M
+sodom S AA D AH M
+sodomize S AH D AH M AY Z
+sodomized S AA D AH M AY Z D
+sodomized(2) S AH D AH M AY Z D
+sodomizer S AH D AH M AY Z ER
+sodomizes S AH D AH M AY Z AH Z
+sodomizing S AH D AH M AY Z IH NG
+sodomy S AA D AH M IY
+sodus S OW D AH S
+soeder S OW D ER
+soens S OW N Z
+soerensen S AO R AH N S AH N
+sofa S OW F AH
+sofaer S OW F EY R
+sofamor S OW F AH M AO R
+sofas S OW F AH Z
+sofer S OW F ER
+sofer's S OW F ER Z
+soffel S AO F AH L
+soffer S AO F ER
+sofia S OW F IY AH
+sofia's S OW F IY AH Z
+sofian S OW F IY AH N
+sofians S OW F IY AH N Z
+sofie S AA F IY
+sofranko S AH F R AE NG K OW
+soft S AA F T
+soft(2) S AO F T
+softball S AO F T B AO L
+softball(2) S AO F B AO L
+softballs S AO F T B AO L Z
+softballs(2) S AO F B AO L Z
+softbank S AO F T B AE NG K
+softdrink S AO F T D R IH NG K
+softech S AO F T EH K
+soften S AA F AH N
+soften(2) S AO F AH N
+softened S AO F AH N D
+softener S AO F AH N ER
+softening S AO F AH N IH NG
+softening(2) S AO F N IH NG
+softens S AO F AH N Z
+softer S AA F T ER
+softer(2) S AO F T ER
+softest S AO F T AH S T
+softimage S AO F T IH M IH JH
+softkey S AA F T K EY
+softletter S AO F T L EH T ER
+softly S AO F T L IY
+softly(2) S AO F L IY
+softness S AO F T N AH S
+softness(2) S AO F N AH S
+softsoap S AO F T S OW P
+softsoap(2) S AO F S OW P
+softspoken S AO F T S P OW K AH N
+softspoken(2) S AO F S P OW K AH N
+software S AO F T W EH R
+software's S AO F T W EH R Z
+software's(2) S AO F W EH R Z
+software(2) S AO F W EH R
+softwood S AO F T W UH D
+sogang S OW G AE NG
+soggy S AA G IY
+sogo S OW G OW
+sohio S OW HH AY OW
+sohl S OW L
+sohm S OW M
+sohmer S OW M ER
+sohn S AA N
+sohns S AA N Z
+soho S OW HH OW
+soifer S OY F ER
+soiffer S OY F ER
+soil S OY L
+soil's S OY L Z
+soileau S OY L OW
+soiled S OY L D
+soils S OY L Z
+soir S OY R
+soiree S W AA R EY
+soisson S OY Z S AH N
+soja S OW JH AH
+sojka S OY K AH
+sojourn S OW JH ER N
+sojourner S OW JH ER N ER
+sojourners S OW JH ER N ER Z
+sojourning S OW JH ER N IH NG
+sok S AA K
+sokaiya S AH K AY Y AH
+sokol S OW K AH L
+sokolik S AH K OW L IH K
+sokolin S AA K AH L IH N
+sokoloff S AA K AH L AO F
+sokoloski S AH K AH L AW S K IY
+sokolov S AA K AH L AA V
+sokolow S AA K AH L OW
+sokolow's S AA K AH L OW Z
+sokolowski S AH K AH L AO F S K IY
+sol S AA L
+sol(2) S OW L
+sola S OW L AH
+solace S AA L AH S
+solace(2) S OW L IH S
+solak S OW L AH K
+solaman S AA L AH M AH N
+solan S OW L AH N
+solana S OW L AE N AH
+soland S AA L AH N D
+solangi S OW L AA N JH IY
+solano S OW L AA N OW
+solar S OW L ER
+solares S OW L AA R EH S
+solari S OW L AA R IY
+solaris S OW L EH R IH S
+solarz S OW L AA R Z
+solazzo S OW L AA Z OW
+solberg S OW L B ER G
+solchaga S OW L CH AA G AH
+sold S OW L D
+soldan S OW L D AH N
+soldano S OW L D AA N OW
+solder S AA D ER
+soldering S AA D ER IH NG
+soldier S OW L JH ER
+soldier's S OW L JH ER Z
+soldiering S OW L JH ER IH NG
+soldiers S OW L JH ER Z
+soldiers' S OW L JH ER Z
+soldner S OW L D N ER
+soldo S OW L D OW
+sole S OW L
+solecki S AH L EH T S K IY
+soledad S OW L D AE D
+soleil S OW L AY L
+solely S OW L L IY
+solem S OW L IH M
+solemin S OW L EH M IH N
+solemn S AA L AH M
+solemnity S AH L EH M N AH T IY
+solemnly S AO L AH M L IY
+soler S OW L ER
+soleri S OW L EH R IY
+soles S OW L Z
+solesbee S OW L Z B IY
+soley S OW L IY
+solheim S OW L HH AY M
+soli S OW L IY
+solicit S AH L IH S IH T
+solicitation S AH L IH S IH T EY SH AH N
+solicitations S AH L IH S IH T EY SH AH N Z
+solicited S AH L IH S IH T IH D
+soliciting S AH L IH S AH T IH NG
+solicitor S AH L IH S AH T ER
+solicitors S AH L IH S AH T ER Z
+solicitous S AH L IH S AH T AH S
+solicits S AH L IH S AH T S
+solicitude S AH L IH S IH T UW D
+solid S AA L AH D
+solid-state S AA L AH D S T EY T
+solidarity S AA L AH D EH R AH T IY
+solidarity's S AA L AH D EH R AH T IY Z
+soliday S OW L IY D EY
+soliders S AA L IH D ER Z
+solidified S AH L IH D AH F AY D
+solidifies S AH L IH D AH F AY Z
+solidify S AH L IH D AH F AY
+solidifying S AH L IH D AH F AY IH NG
+solidity S AH L IH D AH T IY
+solidly S AA L AH D L IY
+solids S AA L AH D Z
+solie S OW L IY
+soliloquize S AH L IH L AH K W AY Z
+soliloquy S AH L IH L AH K W IY
+soliman S AA L IH M AH N
+soliman's S AA L IH M AH N Z
+solimine S OW L IY M IY N IY
+solimon S OW L IH M AH N
+solin S OW L IH N
+solingen S OW L IH NG G EH N
+solingen(2) S AA L IH NG G EH N
+solinger S OW L IH NG ER
+solis S OW L IH S
+solita S OW L IY T AH
+solitaire S AA L AH T EH R
+solitariness S AA L AH T EH R IY N IH S
+solitary S AA L AH T EH R IY
+solitec S AA L IH T EH K
+solitron S OW L IH T R AA N
+solitude S AA L AH T UW D
+soliz S OW L IY Z
+soll S AA L
+sollars S AA L ER Z
+sollenberger S AA L AH N B ER G ER
+soller S AA L ER
+sollers S AA L ER Z
+solley S AA L IY
+solliday S AA L IY D EY
+sollie S AA L IY
+sollinger S AA L IH NG ER
+sollish S AA L IH SH
+solloway S AA L OW W EY
+solly S AA L IY
+solo S OW L OW
+solodar S AA L AH D ER
+soloff S AA L AO F
+soloist S OW L OW AH S T
+soloist(2) S OW L OW IH S T
+soloists S OW L OW AH S T S
+soloists(2) S OW L OW AH S S
+soloists(3) S OW L OW AH S
+soloman S OW L OW M AE N
+solomon S AA L AH M AH N
+solomon's S AA L AH M AH N Z
+solomos S AA L AH M OW S
+solon S OW L AH N
+solorio S OW L AO R IY OW
+solorzano S OW L AO R Z AA N OW
+solos S OW L OW Z
+soloviev S AA L OW V IY V
+solow S AA L OW
+soloway S OW L OW W EY
+solstice S AO L S T IH S
+solstices S AO L S T IH S IH S
+solt S OW L T
+soltau S OW L T AW
+soltero S OW L T EH R OW
+soltes S OW L T S
+soltesz S OW L T IH SH
+solti S OW L T IY
+soltis S OW L T IH S
+soltys S OW L T IY Z
+soltysiak S OW L T IH S IY AE K
+soluble S AA L Y AH B AH L
+solum S OW L AH M
+solution S AH L UW SH AH N
+solutions S AH L UW SH AH N Z
+solvable S AA L V AH B AH L
+solvay S OW L V EY
+solve S AA L V
+solved S AA L V D
+solvency S AO L V AH N S IY
+solvent S AA L V AH N T
+solvents S AO L V AH N T S
+solver S AA L V ER
+solvers S AA L V ER Z
+solves S AA L V Z
+solvig S OW L V IH G
+solving S AA L V IH NG
+solwin S OW L W IH N
+solwin's S OW L W IH N Z
+solzhenitsyn S OW L Z AH N IH T S IH N
+som S AA M
+soma S OW M AH
+somali S AH M AA L IY
+somalia S AH M AA L IY AH
+somalia's S AH M AA L IY AH Z
+somalia's(2) S AH M AA L Y AH Z
+somalia(2) S AH M AA L Y AH
+somalian S AH M AA L Y AH N
+somalians S AH M AA L Y AH N Z
+somalias S AH M AA L IY AH Z
+somalias(2) S AH M AA L Y AH Z
+somaliland S AH M AA L IY L AE N D
+somalis S AH M AA L IY Z
+somatogen S OW M AE T AH JH EH N
+somatotropin S OW M AH T AA T R AH P IH N
+somber S AA M B ER
+somberly S AA M B ER L IY
+sombrero S AA M B R EH R OW
+some S AH M
+somebody S AH M B AA D IY
+somebody's S AH M B AA D IY
+somebody's(2) S AH M B AH D IY
+somebody(2) S AH M B AH D IY
+someday S AH M D EY
+somehow S AH M HH AW
+someone S AH M W AH N
+someone's S AH M W AH N Z
+someplace S AH M P L EY S
+somer S AH M ER
+somers S AH M ER Z
+somersault S AH M ER S AO L T
+somersaulting S AH M ER S AO L T IH NG
+somersaults S AH M ER S AO L T S
+somerset S AH M ER S EH T
+somerton S AH M ER T AH N
+somerville S AH M ER V IH L
+somes S AH M Z
+somesh S OW M EH SH
+somethin' S AH M TH IH N
+something S AH M TH IH NG
+something's S AH M TH IH NG Z
+somethings S AH M TH IH NG Z
+sometime S AH M T AY M
+sometimes S AH M T AY M Z
+somewhat S AH M W AH T
+somewhat(2) S AH M HH W AH T
+somewhere S AH M W EH R
+somewheres S AH M W EH R Z
+somma S AA M AH
+sommer S AH M ER
+sommerfeld S AA M ER F EH L D
+sommerfeldt S AA M ER F IH L T
+sommerfield S AH M ER F IY L D
+sommers S AH M ER R Z
+sommersby S AH M ER R Z B IY
+sommerville S AA M ER V IH L
+somnolence S AA M N AH L AH N S
+somnolent S AA M N AH L AH N T
+somogyi S OW M OW G Y IY
+somoza S AH M OW Z AH
+son S AH N
+son's S AH N Z
+sonar S OW N AA R
+sonat S AA N AH T
+sonata S AH N AA T AH
+sonatas S AA N AA T AH Z
+sonatrach S AA N AH T R AE K
+sonchez S AA N CH EH Z
+sondag S AA N D AH G
+sonderman S AA N D ER M AH N
+sondgeroth S AA N JH ER AA TH
+sondheim S AA N D HH AY M
+sondheim's S AA N D HH AY M Z
+sondheimer S AA N D HH AY M ER
+sondra S AA N D R AH
+sones S OW N Z
+sonesta S AH N EH S T AH
+sonet S OW N AH T
+sonex S OW N AH K S
+song S AO NG
+song's S AO NG Z
+songbird S AO NG B ER D
+songbirds S AO NG B ER D Z
+songer S AO NG ER
+songs S AO NG Z
+songwriter S AO NG R AY T ER
+songwriters S AO NG R AY T ER Z
+songwriting S AO NG R AY T IH NG
+songy S AA N JH IY
+soni S OW N IY
+sonia S OW N Y AH
+sonic S AA N IH K
+sonics S AA N IH K S
+sonier S OW N IY ER
+sonja S OW N Y AH
+sonji S AO N JH IY
+sonn S AA N
+sonne S AA N
+sonneborn S AA N IH B AO R N
+sonnen S AA N AH N
+sonnenberg S AA N AH N B ER G
+sonnenblick S AH N EH N B L IH K
+sonnenburg S AA N AH N B ER G
+sonnenfeld S AA N IH N F EH L D
+sonnenschein S AA N IH N SH AY N
+sonner S AA N ER
+sonnet S AA N IH T
+sonnets S AA N IH T S
+sonnett S AA N AH T
+sonnier S AH N IY ER
+sonntag S AA N T AH G
+sonny S AH N IY
+sonny's S AH N IY Z
+sonoco S AH N OW K OW
+sonoda S OW N OW D AH
+sonogram S AO N AH G R AE M
+sonograms S AO N AH G R AE M Z
+sonoma S AH N OW M AH
+sonora S AH N AO R AH
+sonorous S AA N ER AH S
+sonrise S AH N R AY Z
+sons S AH N Z
+sons' S AA N Z
+sontag S AA N T AE G
+sonum S AA N AH M
+sony S OW N IY
+sony's S OW N IY Z
+sonya S OW N Y AH
+soo S UW
+sood S UW D
+soohoo S UW HH UW
+soon S UW N
+sooner S UW N ER
+sooner's S UW N ER Z
+sooners S UW N ER Z
+soonest S UW N AH S T
+soong S UW NG
+soonyi S UW N Y IY
+soonyi's S UW N Y IY Z
+soos S UW Z
+soot S UH T
+sooter S UH T ER
+soothe S UW DH
+soothed S UW DH D
+soothes S UW DH Z
+soothing S UW DH IH NG
+soothingly S UW DH IH NG L IY
+soothsayer S UW TH S EY ER
+soothsayers S UW TH S EY ER Z
+soots S UH T S
+sooty S UW T IY
+sooy S UW IY
+sop S AA P
+sope S OW P
+soper S OW P ER
+sopher S AA F ER
+sophia S OW F IY AH
+sophie S OW F IY
+sophie's S OW F IY Z
+sophisticate S AH F IH S T AH K EY T
+sophisticate(2) S AH F IH S T AH K AH T
+sophisticated S AH F IH S T AH K EY T IH D
+sophisticated(2) S AH F IH S T IH K EY T AH D
+sophisticates S AH F IH S T AH K IH T S
+sophistication S AH F IH S T AH K EY SH AH N
+sophocles S AA F AH K L IY Z
+sophomore S AA F M AO R
+sophomores S AA F M AO R Z
+sophomoric S AA F OW M AA R IH K
+sophronia S OW F R OW N IY AH
+sophy S OW F IY
+sopko S OW P K OW
+sopp S AA P
+sopping S AA P IH NG
+soprano S AH P R AA N OW
+soprano(2) S AH P R AE N OW
+sopranos S AH P R AE N OW Z
+sops S AA P S
+soquip S OW K W IH P
+sor S AO R
+soranno S AO R AA N OW
+sorbello S AO R B EH L OW
+sorber S AO R B ER
+sorbet S AO R B EY
+sorbet(2) S AO R B EH T
+sorbo S AO R B OW
+sorbonne S AO R B AA N
+sorbus S AO R B AH S
+sorce S AO R S
+sorcerer S AO R S ER ER
+sorcerers S AO R S ER ER Z
+sorcery S AO R S ER IY
+sorcha S AO R K AH
+sorci S AO R CH IY
+sordid S AO R D AH D
+sordoni S AO R D OW N IY
+sore S AO R
+sorel S AO R AH L
+sorell S AO R AH L
+sorely S AO R L IY
+sorensen S AO R IH N S AH N
+sorenson S AO R AH N S AH N
+sorento S ER EH N T OW
+sorento's S ER EH N T OW Z
+sores S AO R Z
+sorey S AO R IY
+sorg S AO R G
+sorge S AO R JH
+sorgen S AO R G AH N
+sorghum S AO R G AH M
+soria S AO R IY AH
+soriano S AO R IY AA N OW
+sorice S AO R IH S
+sorin S AO R IH N
+sorkin S AO R K IH N
+sorkow S AO R K AW
+sorlie S AO R L IY
+soroka S AO R OW K AH
+sororities S ER AO R AH T IY Z
+sorority S ER AO R AH T IY
+soros S AO R OW S
+soros's S AO R OW S IH Z
+sorovski S AO R AO V S K IY
+sorovski's S AO R AO V S K IY Z
+sorpasso S AO R P AA S OW
+sorrel S AO R AH L
+sorrell S AO R AH L
+sorrell's S AO R AH L Z
+sorrells S AO R AH L Z
+sorrels S AO R AH L Z
+sorrenti S AO R EH N T IY
+sorrow S AA R OW
+sorrowful S AA R OW F AH L
+sorrows S AA R OW Z
+sorry S AA R IY
+sort S AO R T
+sorted S AO R T IH D
+sorter S AO R T ER
+sorters S AO R T ER Z
+sortie S AO R T IY
+sorties S AO R T IY Z
+sorting S AO R T IH NG
+sortino S AO R T IY N OW
+sortor S AO R T ER
+sorts S AO R T S
+sorum S AO R AH M
+sorus S AO R AH S
+sorvino S AO R V IY N OW
+sosa S OW S AH
+sosebee S AA S IH B IY
+soshi S OW SH IY
+sosin S OW S IH N
+sosinski S AH S IH N S K IY
+soskin S AA S K IH N
+sosna S OW S N AH
+sosnoff S AO S N AO F
+sosnoff's S AO S N AO F S
+sosnowski S AH S N AO F S K IY
+soss S AO S
+sossamon S OW S AA M AO N
+sosuke S OW S UW K EY
+sot S AO T
+sotak S OW T AH K
+sotello S OW T EH L OW
+sotelo S OW T EH L OW
+soter S OW T ER
+sotheby S AA TH AH B IY
+sotheby's S AA TH AH B IY Z
+soto S OW T OW
+sotolongo S OW T OW L OW NG G OW
+sotomayor S OW T OW M EY AO R
+sotti S OW T IY
+sottile S OW T AH L
+souccar S UW K AA R
+soucek S OW S IH K
+soucie S OW K IY
+soucy S OW S IY
+souder S AW D ER
+souders S AW D ER Z
+souers S AW ER Z
+souffle S UW F L EY
+sought S AO T
+souk S UW K
+soukup S AW K AH P
+soul S OW L
+soule S AW L
+soules S UW L Z
+soulful S OW L F AH L
+soulier S UW L IY ER
+souljah S UW L JH AH
+soulless S OW L L AH S
+soulliere S UW L IY EH R
+souls S OW L Z
+sound S AW N D
+sound's S AW N D Z
+soundbite S AW N D B AY T
+soundbites S AW N D B AY T S
+sounded S AW N D AH D
+sounded(2) S AW N D IH D
+sounder S AW N D ER
+soundest S AW N D AH S T
+sounding S AW N D IH NG
+soundings S AW N D IH NG Z
+soundly S AW N D L IY
+soundness S AW N D N AH S
+sounds S AW N D Z
+sounds(2) S AW N Z
+soundscan S AW N D S K AE N
+soundtrack S AW N D T R AE K
+soundtrack(2) S AW N T R AE K
+soundtracks S AW N D T R AE K S
+soundtracks(2) S AW N T R AE K S
+soundview S AW N D V Y UW
+soup S UW P
+soup's S UW P S
+souped S UW P T
+soups S UW P S
+soupy S UW P IY
+sour S AW ER
+sour(2) S AW R
+sourby S AW R B IY
+source S AO R S
+source's S AO R S IH Z
+sourcebook S AO R S B UH K
+sources S AO R S AH Z
+sources' S AO R S AH Z
+sourcing S AO R S IH NG
+soured S AW ER D
+souring S AW ER IH NG
+souris S UW R IH S
+sourrouille S AO R UW IY
+sours S AW ER Z
+sours(2) S AW R Z
+sous S UW Z
+sousa S UW Z AH
+sousa's S UW Z AH Z
+sousaphone S UW Z AH F OW N
+sousley S AW S L IY
+soutar S UW T AA R
+souter S UW T ER
+souter(2) S AW T ER
+south S AW TH
+south's S AW TH S
+southall S AW TH AH L
+southam S AW TH AH M
+southampton S AW TH HH AE M P T AH N
+southard S AW TH ER D
+southbound S AW TH B AW N D
+southdown S AW TH D AW N
+southdown's S AW TH D AW N Z
+southeast S AW TH IY S T
+southeast's S AW TH IY S T S
+southeastern S AW TH IY S T ER N
+southeastern's S AW TH IY S T ER N Z
+souther S AH DH ER
+southerland S AH DH ER L AH N D
+southerly S AH DH ER L IY
+southern S AH DH ER N
+southern's S AH DH ER N Z
+southerner S AH DH ER N ER
+southerners S AH DH ER N ER Z
+southernmost S AH DH ER N M OW S T
+southernnet S AH DH ER N EH T
+southernnet's S AH DH ER N EH T S
+southers S AH DH ER Z
+southfield S AW TH F IY L D
+southgate S AW TH G EY T
+southin S AW TH IH N
+southland S AW TH L AE N D
+southland's S AW TH L AE N D Z
+southlife S AW TH L AY F
+southmark S AW TH M AA R K
+southmark's S AW TH M AA R K S
+southold S AW TH OW L D
+southport S AW TH P AO R T
+souths S AW TH S
+southside S AW TH S AY D
+southstate S AW TH S T EY T
+southwall S AW TH W AO L
+southward S AW TH W ER D
+southway S AW TH W EY
+southwell S AW TH W EH L
+southwest S AW TH W EH S T
+southwest's S AW TH W EH S T S
+southwestern S AW TH W EH S T ER N
+southwick S AW TH W IH K
+southwood S AW TH W UH D
+southworth S AW TH W ER TH
+souto S UW T OW
+souvenir S UW V AH N IH R
+souvenirs S UW V AH N IH R Z
+souveroff S UW V ER AO F
+souza S UW Z AH
+souzas S UW Z AH Z
+sova S OW V AH
+sovereign S AA V R AH N
+sovereigns S AA V R AH N Z
+sovereignty S AA V R AH N T IY
+sovetskaya S OW V EH T S K AY AH
+sovexportfilm S OW V EH K S P AO R T F IH L M
+sovey S OW V IY
+soviet S OW V IY AH T
+soviet's S OW V IY EH T S
+soviet(2) S OW V IY EH T
+soviet-union S OW V IY EH T Y UW N Y AH N
+sovietologist S OW V IY AH T AA L AH JH IH S T
+sovietologists S OW V IY AH T AA L AH JH IH S T S
+sovietologists(2) S OW V IY AH T AA L AH JH IH S S
+sovietologists(3) S OW V IY AH T AA L AH JH IH S
+soviets S OW V IY EH T S
+soviets' S OW V IY EH T S
+sovine S AA V AY N
+sovran S AA V R AH N
+sovran's S AA V R AH N Z
+sovrans S AA V R AH N Z
+sovyetsky S OW V Y EH T S K IY
+sow S AW
+sow(2) S OW
+sowa S OW AH
+soward S OW ER D
+sowards S OW ER D Z
+sowash S OW AH SH
+sowata S OW AA T AH
+sowata's S OW AA T AH Z
+sowden S OW D AH N
+sowder S OW D ER
+sowders S OW D ER Z
+sowed S AW D
+sowed(2) S OW D
+sowell S AA W EH L
+sower S OW ER
+sowers S OW ER Z
+soweto S OW EY T OW
+sowing S OW IH NG
+sowinski S OW IH N S K IY
+sowle S OW L
+sowles S OW L Z
+sown S OW N
+sows S OW Z
+sox S AA K S
+sox's S AA K S IH Z
+soy S OY
+soya S OY AH
+soyars S OY ER Z
+soybean S OY B IY N
+soybeans S OY B IY N Z
+soyka S OY K AH
+soysauce S OY S AO S
+soyuz S OY AH Z
+soyuz's S OY AH Z IH Z
+soyuz's(2) S OY UW Z IH Z
+soyuz(2) S OY UW Z
+soza S OW Z AH
+sozio S OW Z IY OW
+spa S P AA
+space S P EY S
+spaceball S P EY S B AO L
+spaceballs S P EY S B AO L Z
+spaceband S P EY S B AE N D
+spacebands S P EY S B AE N D Z
+spacecraft S P EY S K R AE F T
+spacecraft's S P EY S K R AE F T S
+spaced S P EY S T
+spacehab S P EY S HH AE B
+spacek S P AA CH EH K
+spacek(2) S P AA S EH K
+spacelink S P EY S L IH NG K
+spacenet S P EY S N EH T
+spaceport S P EY S P AO R T
+spacer S P EY S ER
+spacers S P EY S ER Z
+spaces S P EY S AH Z
+spaces(2) S P EY S IH Z
+spaceship S P EY S SH IH P
+spaceships S P EY S SH IH P S
+spacesuit S P EY S UW T
+spacesuits S P EY S UW T S
+spacewalk S P EY S W AA K
+spacewalking S P EY S W AA K IH NG
+spacewalks S P EY S W AA K S
+spacey S P EY S IY
+spacial S P EY SH AH L
+spacing S P EY S IH NG
+spacious S P EY SH AH S
+spack S P AE K
+spackman S P AE K M AH N
+spada S P AA D AH
+spadaccini S P AA D AA CH IY N IY
+spadafora S P AA D AA F AO R AH
+spadafore S P AA D AO F AO R
+spadaro S P AA D AA R OW
+spade S P EY D
+spader S P EY D ER
+spades S P EY D Z
+spadework S P EY D W ER K
+spadoni S P AA D OW N IY
+spady S P EY D IY
+spaeth S P IY TH
+spafford S P AE F ER D
+spaghetti S P AH G EH T IY
+spagna S P AE G N AH
+spagnola S P AA G N OW L AH
+spagnoli S P AA G N OW L IY
+spagnolo S P AA G N OW L OW
+spagnuolo S P AA G N Y UW OW L OW
+spago S P EY G OW
+spahn S P AA N
+spahr S P AA R
+spaid S P EY D
+spain S P EY N
+spain's S P EY N Z
+spainhour S P AY N AW R
+spainhower S P AY N HH OW ER
+spak S P AE K
+spake S P EY K
+spalding S P AO L D IH NG
+spalink S P EY L IH NG K
+spalink(2) S P AA L IH NG K
+spall S P AO L
+spalla S P AE L AH
+spallone S P AE L OW N
+spalvins S P AE L V IH N Z
+spam S P AE M
+spampinato S P AA M P IY N AA T OW
+span S P AE N
+span's S P AE N Z
+spanbauer S P AE N B AW ER
+spandex S P AE N D AH K S
+spang S P AE NG
+spangenberg S P AE NG AH N B ER G
+spangle S P AE NG G AH L
+spangled S P AE NG G AH L D
+spangler S P AE NG G AH L ER
+spangler(2) S P AE NG G L ER
+spaniard S P AE N Y ER D
+spaniards S P AE N Y ER D Z
+spaniel S P AE N Y AH L
+spanier S P AE N Y ER
+spaniol S P AE N Y AH L
+spanish S P AE N IH SH
+spank S P AE NG K
+spanked S P AE NG K T
+spanking S P AE NG K IH NG
+spanky S P AE N K IY
+spann S P AE N
+spanned S P AE N D
+spanner S P AE N ER
+spanning S P AE N IH NG
+spanninger S P AE N IH NG ER
+spano S P AA N OW
+spanos S P EY N OW Z
+spans S P AE N Z
+spanton S P AE N T AH N
+spar S P AA R
+sparacino S P ER AH CH IY N OW
+sparacio S P ER EY S IY OW
+sparaco S P ER AE K OW
+sparano S P ER AE N OW
+sparc S P AA R K
+spare S P EH R
+spared S P EH R D
+spares S P EH R Z
+sparger S P AA R JH ER
+spargo S P AA R G OW
+spargur S P AA R G ER
+sparing S P EH R IH NG
+sparingly S P EH R IH NG L IY
+spark S P AA R K
+sparked S P AA R K T
+sparkes S P AA R K S
+sparking S P AA R K IH NG
+sparkle S P AA R K AH L
+sparkled S P AA R K AH L D
+sparkles S P AA R K AH L Z
+sparkling S P AA R K L IH NG
+sparkling(2) S P AA R K AH L IH NG
+sparkly S P AA R K L IY
+sparkman S P AA R K M AH N
+sparks S P AA R K S
+sparky S P AA R K IY
+sparlin S P AA R L IH N
+sparling S P AA R L IH NG
+sparr S P AE R
+sparred S P AA R D
+sparring S P AA R IH NG
+sparrow S P EH R OW
+sparrows S P EH R OW Z
+sparse S P AA R S
+sparsely S P AA R S L IY
+sparta S P AA R T AH
+spartacus S P AA R T AH K AH S
+spartan S P AA R T AH N
+spartanburg S P AA R T AH N B ER G
+spartech S P AA R T EH K
+spartz S P AA R T S
+spas S P AA Z
+spasm S P AE Z AH M
+spasmodic S P AE Z M AO D IH K
+spasmodically S P AE Z M AO D IH K L IY
+spasms S P AE Z AH M Z
+spasso S P AE S OW
+spat S P AE T
+spatafora S P AA T AA F AO R AH
+spatafore S P AE T AH F AO R
+spataro S P AA T AA R OW
+spate S P EY T
+spates S P EY T S
+spath S P AE TH
+spatial S P EY SH AH L
+spatola S P AA T OW L AH
+spats S P AE T S
+spatter S P AE T ER
+spattered S P AE T ER D
+spattering S P AE T ER IH NG
+spatters S P AE T ER Z
+spatula S P AE CH UH L AH
+spatz S P AE T S
+spaugh S P AO
+spaulding S P AO L D IH NG
+spaur S P AO R
+spavo S P AA V OW
+spaw S P AO
+spawn S P AA N
+spawn(2) S P AO N
+spawned S P AO N D
+spawning S P AA N IH NG
+spawning(2) S P AO N IH NG
+spawns S P AA N Z
+spawns(2) S P AO N Z
+spayd S P EY D
+spayde S P EY D
+spaziani S P AA Z IY AA N IY
+speagle S P IY G AH L
+speak S P IY K
+speake S P IY K
+speaker S P IY K ER
+speaker's S P IY K ER Z
+speakers S P IY K ER Z
+speakership S P IY K ER SH IH P
+speakes S P IY K S
+speakes's S P IY K S IH Z
+speaking S P IY K IH NG
+speakman S P IY K M AH N
+speaks S P IY K S
+spear S P IH R
+speare S P IY R
+spearhead S P IH R HH EH D
+spearheaded S P IH R HH EH D IH D
+spearheading S P IH R HH EH D IH NG
+spearing S P IH R IH NG
+spearman S P IH R M AH N
+spears S P IH R Z
+speas S P IY Z
+spease S P IY Z
+spec S P EH K
+specht S P EH K T
+special S P EH SH AH L
+special's S P EH SH AH L Z
+speciale S P EH CH AH L IY
+specialist S P EH SH AH L AH S T
+specialist(2) S P EH SH AH L IH S T
+specialists S P EH SH AH L AH S T S
+specialists' S P EH SH AH L IH S T S
+specialists'(2) S P EH SH AH L IH S S
+specialists'(3) S P EH SH AH L IH S
+specialists(2) S P EH SH AH L IH S T S
+specialists(3) S P EH SH AH L IH S S
+specialists(4) S P EH SH AH L IH S
+specialities S P EH SH AH L T IY Z
+speciality S P EH SH IY AE L IH T IY
+specialization S P EH SH AH L AH Z EY SH AH N
+specialize S P EH SH AH L AY Z
+specialized S P EH SH AH L AY Z D
+specializes S P EH SH AH L AY Z AH Z
+specializes(2) S P EH SH AH L AY Z IH Z
+specializing S P EH SH AH L AY Z IH NG
+specially S P EH SH AH L IY
+specially(2) S P EH SH L IY
+specials S P EH SH AH L Z
+specialties S P EH SH AH L T IY Z
+specialty S P EH SH AH L T IY
+specialty(2) S P EY SH AH L T IY
+species S P IY SH IY Z
+species' S P IY SH IY Z
+specific S P AH S IH F IH K
+specific(2) S P IH S IH F IH K
+specifically S P AH S IH F IH K L IY
+specification S P EH S IH F IH K EY SH AH N
+specifications S P EH S AH F AH K EY SH AH N Z
+specificity S P EH S AH F IH S AH T IY
+specifics S P IH S IH F IH K S
+specified S P EH S AH F AY D
+specifies S P EH S AH F AY Z
+specify S P EH S AH F AY
+specifying S P EH S AH F AY IH NG
+specimen S P EH S AH M AH N
+specimens S P EH S AH M AH N Z
+specious S P IY SH AH S
+speck S P EH K
+specker S P EH K ER
+speckle S P EH K AH L
+speckled S P EH K AH L D
+speckman S P EH K M AH N
+specks S P EH K S
+specs S P EH K S
+spectacle S P EH K T AH K AH L
+spectacles S P EH K T AH K AH L Z
+spectacular S P EH K T AE K Y AH L ER
+spectacularly S P EH K T AE K Y AH L ER L IY
+spectator S P EH K T EY T ER
+spectators S P EH K T EY T ER Z
+specter S P EH K T ER
+specter's S P EH K T ER Z
+specthrie S P EH K TH R IY
+spector S P EH K T ER
+spectra S P EH K T R AH
+spectra's S P EH K T R AH Z
+spectradyne S P EH K T R AH D AY N
+spectramed S P EH K T R AH M D
+spectramed(2) S P EH K T R AH M EH D
+spectran S P EH K T R AE N
+spectravision S P EH K T R AH V IH ZH AH N
+spectre S P EH K T ER
+spectrograph S P EH K T R AH G R AE F
+spectrometer S P EH K T R AA M AH T ER
+spectrometry S P EH K T R AA M AH T R IY
+spectroscopy S P EH K T R AA S K AH P IY
+spectrum S P EH K T R AH M
+spectrum's S P EH K T R AH M Z
+spectrums S P EH K T R AH M Z
+speculate S P EH K Y AH L EY T
+speculated S P EH K Y AH L EY T AH D
+speculated(2) S P EH K Y AH L EY T IH D
+speculates S P EH K Y AH L EY T S
+speculating S P EH K Y AH L EY T IH NG
+speculation S P EH K Y AH L EY SH AH N
+speculations S P EH K Y AH L EY SH AH N Z
+speculative S P EH K Y AH L AH T IH V
+speculator S P EH K Y AH L EY T ER
+speculators S P EH K Y AH L EY T ER Z
+speculators' S P EH K Y AH L ER T EY Z
+sped S P EH D
+speece S P IY S
+speech S P IY CH
+speeches S P IY CH AH Z
+speeches(2) S P IY CH IH Z
+speechify S P IY CH AH F AY
+speechifying S P IY CH AH F AY IH NG
+speechless S P IY CH L AH S
+speechwriter S P IY CH R AY T ER
+speechwriters S P IY CH R AY T ER Z
+speed S P IY D
+speedboat S P IY D B OW T
+speedboats S P IY D B OW T S
+speeded S P IY D IH D
+speeder S P IY D ER
+speeders S P IY D ER Z
+speedier S P IY D IY ER
+speedily S P IY D AH L IY
+speeding S P IY D IH NG
+speedometer S P IY D AA M AH T ER
+speedring S P IY D R IH NG
+speeds S P IY D Z
+speedskate S P IY D S K EY T
+speedskating S P IY D S K EY T IH NG
+speedup S P IY D AH P
+speedway S P IY D W EY
+speedy S P IY D IY
+speegle S P IY G AH L
+speelman S P IY L M AH N
+speer S P IH R
+spees S P IY Z
+spegal S P IY G AH L
+spehar S P EH HH ER
+speich S P AY K
+speicher S P AY K ER
+speidel S P AY D AH L
+speier S P AY ER
+speight S P EY T
+speights S P EY T S
+speigner S P AY G N ER
+speir S P IH R
+speirs S P IH R Z
+speiser S P AY Z ER
+spektr S P EH K T ER
+spektr's S P EH K T ER Z
+spell S P EH L
+spellacy S P EH L AH S IY
+spellbinding S P EH L B AY N D IH NG
+spellbound S P EH L B AW N D
+spelled S P EH L D
+speller S P EH L ER
+spellers S P EH L ER Z
+spelling S P EH L IH NG
+spelling's S P EH L IH NG Z
+spellings S P EH L IH NG Z
+spellman S P EH L M AH N
+spellman's S P EH L M AH N Z
+spellmeyer S P EH L M AY ER
+spellmeyer's S P EH L M AY ER Z
+spells S P EH L Z
+spelman S P EH L M AH N
+speltz S P EH L T S
+spelunk S P AH L AH NG K
+spelunked S P AH L AH NG K T
+spelunker S P AH L AH NG K ER
+spelunkers S P AH L AH NG K ER Z
+spelunking S P AH L AH NG K IH NG
+spelunks S P AH L AH NG K S
+spence S P EH N S
+spencer S P EH N S ER
+spencer's S P EH N S ER Z
+spencers S P EH N S ER Z
+spend S P EH N D
+spendable S P EH N D AH B AH L
+spender S P EH N D ER
+spenders S P EH N D ER Z
+spending S P EH N D IH NG
+spendley S P EH N D L IY
+spendlove S P EH N D L AH V
+spends S P EH N D Z
+spends(2) S P EH N Z
+spendthrift S P EH N D TH R IH F T
+spengler S P IH NG AH L ER
+spengler(2) S P IH NG L ER
+spenner S P EH N ER
+speno S P EH N OW
+spens S P EH N S
+spenser S P EH N S ER
+spenser's S P EH N S ER Z
+spensers S P EH N S ER Z
+spent S P EH N T
+spera S P EH R AH
+speranza S P ER AA N Z AH
+sperbeck S P ER B EH K
+sperber S P ER B ER
+sperduto S P ER D UW T OW
+sperl S P ER L
+sperle S P AO R AH L
+sperlich S P ER L IH K
+sperling S P ER L IH NG
+sperm S P ER M
+sperms S P ER M Z
+spero S P EH R OW
+speros S P EH R OW Z
+sperrazza S P ER AA T S AH
+sperrfrist S P EH R F R IH S T
+sperry S P EH R IY
+spessard S P EH S ER D
+speth S P EH TH
+spethmann S P EH TH M AH N
+spetsnaz S P EH T S N AE Z
+spevak S P EH V AH K
+spew S P Y UW
+spewed S P Y UW D
+spewing S P Y UW IH NG
+spews S P Y UW Z
+spey S P EY
+speyer S P EY ER
+speziale S P EH Z IY AA L IY
+spezzano S P EH T S AA N OW
+sphar S F AA R
+sphere S F IH R
+spheres S F IH R Z
+spherical S F EH R IH K AH L
+spheroid S F IH R OY D
+sphinx S F IH NG K S
+spic S P IH K
+spice S P AY S
+spiced S P AY S T
+spiceland S P AY S L AE N D
+spicer S P AY S ER
+spices S P AY S AH Z
+spices(2) S P AY S IH Z
+spicey S P AY S IY
+spicher S P IH CH ER
+spicing S P AY S IH NG
+spickard S P IH K ER D
+spickler S P IH K L ER
+spicuzza S P IY K UW T S AH
+spicy S P AY S IY
+spidel S P IH D AH L
+spidell S P IH D AH L
+spider S P AY D ER
+spiderman S P AY D ER M AE N
+spiders S P AY D ER Z
+spidle S P AY D AH L
+spie S P IY
+spied S P AY D
+spiegel S P IY G AH L
+spiegelberg S P IY G AH L B ER G
+spiegelman S P IY G AH L M AH N
+spiegler S P IY G L ER
+spieker S P IY K ER
+spiel S P IY L
+spielberg S P IY L B ER G
+spielberg's S P IY L B ER G Z
+spielberger S P IY L B ER G ER
+spieler S P IY L ER
+spielman S P IY L M AH N
+spielmann S P IY L M AH N
+spielvogel S P IY L V OW G AH L
+spier S P AY ER
+spiering S P AY ER IH NG
+spiers S P AY ER Z
+spies S P AY Z
+spiess S P IY Z
+spieth S P AY AH TH
+spiewak S P IY W AE K
+spiffing S P IH F IH NG
+spiffy S P IH F IY
+spight S P AY T
+spigner S P AY G N ER
+spigot S P IH G AH T
+spigots S P IH G AH T S
+spike S P AY K
+spiked S P AY K T
+spiker S P AY K ER
+spikes S P AY K S
+spiking S P AY K IH NG
+spiky S P AY K IY
+spilde S P IH L D
+spilker S P IH L K ER
+spill S P IH L
+spill's S P IH L Z
+spillage S P IH L IH JH
+spillane S P IH L AH N
+spilled S P IH L D
+spiller S P IH L ER
+spillers S P IH L ER Z
+spilling S P IH L IH NG
+spillman S P IH L M AH N
+spillover S P IH L OW V ER
+spills S P IH L Z
+spillway S P IH L W EY
+spilman S P IH L M AH N
+spilotro S P IH L AA T R OW
+spilt S P IH L T
+spin S P IH N
+spina S P IY N AH
+spinach S P IH N AH CH
+spinal S P AY N AH L
+spinale S P IY N AA L IY
+spindel S P IH N D AH L
+spindle S P IH N D AH L
+spindler S P IH N D AH L ER
+spindler(2) S P IH N D L ER
+spine S P AY N
+spineless S P AY N L AH S
+spinella S P IH N EH L AH
+spinelli S P IH N EH L IY
+spinello S P IH N EH L OW
+spines S P AY N Z
+spinfizz S P IH N F IH Z
+spinifex S P IH N IH F EH K S
+spink S P IH NG K
+spinks S P IH NG K S
+spinks's S P IH NG K S IH Z
+spinner S P IH N ER
+spinner's S P IH N ER Z
+spinners S P IH N ER Z
+spinney S P IH N IY
+spinning S P IH N IH NG
+spino S P IY N OW
+spinoff S P IH N AO F
+spinoffs S P IH N AO F S
+spinola S P IY N OW L AH
+spinosa S P IY N OW S AH
+spinoza S P IH N OW Z AH
+spins S P IH N Z
+spinster S P IH N S T ER
+spiny S P AY N IY
+spira S P IH R AH
+spiral S P AY R AH L
+spiraled S P AY R AH L D
+spiraling S P AY R AH L IH NG
+spiralling S P AY R AH L IH NG
+spirals S P AY R AH L Z
+spire S P AY R
+spires S P AY R Z
+spirit S P IH R AH T
+spirit(2) S P IH R IH T
+spirited S P IH R AH T AH D
+spirited(2) S P IH R IH T IH D
+spiritedness S P IH R IH T IH D N AH S
+spirito S P IH R IY T OW
+spirits S P IH R AH T S
+spirits(2) S P IH R IH T S
+spiritual S P IH R IH CH AH W AH L
+spiritual(2) S P IH R IH CH W AH L
+spiritualism S P IH R IH CH AH W AH L IH Z M
+spiritualism(2) S P IH R IH CH W AH L IH Z M
+spiritualist S P IH R IH CH AH W AH L IH S T
+spiritualists S P IH R IH CH AH W AH L IH S T S
+spirituality S P IH R IH CH AH W AE L AH T IY
+spiritually S P IH R IH CH AH W AH L IY
+spirituals S P IH R IH CH AH W AH L Z
+spirituals(2) S P IH R IH CH W AH L Z
+spiro S P IH R OW
+spisak S P IH S AH K
+spit S P IH T
+spitale S P IY T AA L IY
+spitball S P IH T B AO L
+spitball's S P IH T B AO L Z
+spite S P AY T
+spiteful S P AY T F AH L
+spiteri S P IY T EH R IY
+spitler S P IH T L ER
+spits S P IH T S
+spitting S P IH T IH NG
+spittle S P IH T AH L
+spittler S P IH T L ER
+spitz S P IH T S
+spitzer S P IH T Z ER
+spitzley S P IH T S L IY
+spitznagel S P IH T S N EY G AH L
+spiva S P IY V AH
+spivack S P IH V AH K
+spivak S P IH V AH K
+spivey S P IH V IY
+spiwak S P IH V AH K
+spizzirri S P IY T S IH R IY
+splain S P L EY N
+splaine S P L EY N
+splash S P L AE SH
+splashed S P L AE SH T
+splashes S P L AE SH AH Z
+splashes(2) S P L AE SH IH Z
+splashing S P L AE SH IH NG
+splashy S P L AE SH IY
+splat S P L AE T
+splatter S P L AE T ER
+splattered S P L AE T ER D
+splawn S P L AO N
+spleen S P L IY N
+spleisson S P EY S AH N
+splendid S P L EH N D AH D
+splendid(2) S P L EH N D IH D
+splendidly S P L EH N D AH D L IY
+splendor S P L EH N D ER
+splenic S P L EH N IH K
+splenic(2) S P L IY N IH K
+splice S P L AY S
+spliced S P L AY S T
+splices S P L AY S IH Z
+splichal S P L IH CH AH L
+splicing S P L AY S IH NG
+splint S P L IH N T
+splinter S P L IH N T ER
+splintered S P L IH N T ER D
+splintering S P L IH N T ER IH NG
+splintery S P L IH N T ER IY
+splints S P L IH N T S
+split S P L IH T
+splits S P L IH T S
+splitt S P L IH T
+splitting S P L IH T IH NG
+splurge S P L ER JH
+splurged S P L ER JH D
+splurging S P L ER JH IH NG
+spoarer S P AO R ER
+spock S P AA K
+spoden S P OW D AH N
+spoelstra S P OW L S T R AH
+spoerl S P AO R L
+spofford S P AA F ER D
+spogli S P AA G L IY
+spohn S P AA N
+spohr S P AA R
+spoil S P OY L
+spoilage S P OY L AH JH
+spoilage(2) S P OY L IH JH
+spoiled S P OY L D
+spoiler S P OY L ER
+spoilers S P OY L ER Z
+spoiling S P OY L IH NG
+spoils S P OY L Z
+spokane S P OW K AE N
+spokane(2) S P OW K EY N
+spoke S P OW K
+spoken S P OW K AH N
+spokenly S P OW K AH N L IY
+spokes S P OW K S
+spokesman S P OW K S M AH N
+spokesmen S P OW K S M IH N
+spokespeople S P OW K S P IY P AH L
+spokesperson S P OW K S P ER S AH N
+spokespersons S P OW K S P ER S AH N Z
+spokeswoman S P OW K S W UH M AH N
+spokeswomen S P OW K S W IH M AH N
+spoleto S P OW L EY T OW
+spoletto S P OW L EY T OW
+spoletto's S P OW L EY T OW Z
+spomer S P OW M ER
+sponaugle S P AA N AO G AH L
+spong S P AO NG
+sponge S P AH N JH
+sponged S P AH N JH D
+spongeform S P AH N JH F AO R M
+sponges S P AH N JH AH Z
+spongy S P AH N JH IY
+sponsel S P AA N S AH L
+sponseller S P AA N S AH L ER
+sponsler S P AA N S AH L ER
+sponsler(2) S P AA N S L ER
+sponsor S P AA N S ER
+sponsor's S P AA N S ER Z
+sponsored S P AA N S ER D
+sponsoring S P AA N S ER IH NG
+sponsors S P AA N S ER Z
+sponsorship S P AA N S ER SH IH P
+sponsorships S P AA N S ER SH IH P S
+spontaneity S P AA N T AH N IY AH T IY
+spontaneous S P AA N T EY N IY AH S
+spontaneously S P AA N T EY N IY AH S L IY
+spoof S P UW F
+spoofed S P UW F T
+spoofing S P UW F IH NG
+spoofs S P UW F S
+spook S P UW K
+spooked S P UW K T
+spooks S P UW K S
+spooky S P UW K IY
+spool S P UW L
+spoon S P UW N
+spoonemore S P UW N M AO R
+spooner S P UW N ER
+spoonful S P UW N F UH L
+spoonfuls S P UW N F UH L Z
+spoons S P UW N Z
+spoor S P UH R
+spoor's S P UH R Z
+sporadic S P ER AE D IH K
+sporadically S P ER AE D IH K L IY
+sporck S P AO R K
+spore S P AO R
+sporer S P AO R ER
+spores S P AO R Z
+sporkin S P AO R K IH N
+sporkin's S P AO R K IH N Z
+sporleder S P AO R L IH D ER
+sporn S P AO R N
+sporophyte S P AO R F AY T
+sporophytes S P AO R F AY T S
+sporrer S P AO ER R
+sport S P AO R T
+sport's S P AO R T S
+sported S P AO R T IH D
+sportier S P AO R T IY ER
+sporting S P AO R T IH NG
+sportingly S P AO R T IH NG L IY
+sports S P AO R T S
+sports' S P AO R T S
+sportsbar S P AO R T S B AA R
+sportscaster S P AO R T S K AE S T ER
+sportscasters S P AO R T S K AE S T ER Z
+sportschannel S P AO R T S CH AE N AH L
+sportsclub S P AO R T S K L AH B
+sportsman S P AO R T S M AH N
+sportsmanship S P AO R T S M AH N SH IH P
+sportsmen S P AO R T S M IH N
+sportster S P AO R T S T ER
+sportswear S P AO R T S W EH R
+sportswriter S P AO R T S R AY T ER
+sportswriters S P AO R T S R AY T ER Z
+sporty S P AO R T IY
+sposato S P OW S AA T OW
+sposito S P OW S IY T OW
+spot S P AA T
+spotless S P AA T L AH S
+spotlight S P AA T L AY T
+spotlighted S P AA T L AY T IH D
+spotlighting S P AA T L AY T IH NG
+spotlights S P AA T L AY T S
+spoto S P OW T OW
+spots S P AA T S
+spotted S P AA T AH D
+spotted(2) S P AA T IH D
+spotter S P AA T ER
+spotters S P AA T ER Z
+spotting S P AA T IH NG
+spotts S P AA T S
+spotty S P AA T IY
+spousal S P AW Z AH L
+spouse S P AW S
+spouse's S P AW S IH Z
+spouses S P AW S AH Z
+spouses(2) S P AW S IH Z
+spout S P AW T
+spouted S P AW T AH D
+spouting S P AW T IH NG
+spouts S P AW T S
+spracklen S P R AE K AH L AH N
+spradley S P R AE D L IY
+spradlin S P R AE D L IH N
+spradling S P R AE D L IH NG
+spragg S P R AE G
+spraggins S P R AE G IH N Z
+sprague S P R EY G
+sprague's S P R EY G Z
+sprain S P R EY N
+sprained S P R EY N D
+sprains S P R EY N Z
+spraker S P R EY K ER
+sprang S P R AE NG
+spranger S P R AE NG ER
+sprankle S P R AE NG K AH L
+spratley S P R AE T L IY
+spratlin S P R AE T L IH N
+spratling S P R AE T L IH NG
+spratt S P R AE T
+sprawl S P R AO L
+sprawled S P R AO L D
+sprawling S P R AO L IH NG
+sprawls S P R AO L Z
+spray S P R EY
+sprayberry S P R EY B EH R IY
+sprayed S P R EY D
+sprayer S P R EY ER
+sprayers S P R EY ER Z
+spraying S P R EY IH NG
+sprays S P R EY Z
+spread S P R EH D
+spreader S P R EH D ER
+spreading S P R EH D IH NG
+spreads S P R EH D Z
+spreadsheet S P R EH D SH IY T
+spreadsheets S P R EH D SH IY T S
+sprecher S P R EH K ER
+spreckels S P R EH K AH L Z
+spree S P R IY
+spreeman S P R IY M AH N
+spreen S P R IY N
+sprees S P R IY Z
+sprehe S P R IY HH
+spreitzer S P R AY T Z ER
+spreng S P R EH NG
+sprenger S P R EH N JH ER
+sprenkle S P R EH NG K AH L
+sprick S P R IH K
+sprigg S P R IH G
+sprigged S P R IH G D
+spriggs S P R IH G Z
+sprightly S P R AY T L IY
+spring S P R IH NG
+spring's S P R IH NG Z
+spring(2) S P ER IH NG
+springboard S P R IH NG B AO R D
+springborn S P R IH NG G B ER N
+springdale S P R IH NG D EY L
+springer S P R IH NG ER
+springerville S P R IH NG ER V IH L
+springfield S P R IH NG F IY L D
+springfield's S P R IH NG F IY L D Z
+springing S P R IH NG IH NG
+springman S P R IH NG M AH N
+springs S P R IH NG Z
+springs(2) S P ER IH NG Z
+springstead S P R IH NG S T EH D
+springsteen S P R IH NG S T IY N
+springsteen's S P R IH NG S T IY N Z
+springston S P R IH NG S T AH N
+springtime S P R IH NG T AY M
+sprinkel S P R IH NG K AH L
+sprinkle S P R IH NG K AH L
+sprinkled S P R IH NG K AH L D
+sprinkler S P R IH NG K L ER
+sprinkler(2) S P R IH NG K AH L ER
+sprinklers S P R IH NG K L ER Z
+sprinklers(2) S P R IH NG K AH L ER Z
+sprinkles S P R IH NG K AH L Z
+sprinkling S P R IH NG K L IH NG
+sprinkling(2) S P R IH NG K AH L IH NG
+sprint S P R IH N T
+sprint's S P R IH N T S
+sprinted S P R IH N T IH D
+sprinter S P R IH N T ER
+sprinters S P R IH N T ER Z
+sprinting S P R IH N T IH NG
+sprints S P R IH N T S
+sprite S P R AY T
+sprizzo S P R IH Z OW
+sproat S P R OW T
+sprock S P R AA K
+sprocket S P R AA K AH T
+sprogus S P R OW G AH S
+sprogus's S P R OW G AH S IH Z
+sproles S P R OW L Z
+sprong S P R AO NG
+sprott S P R AA T
+sproul S P R AW L
+sproule S P R UW L
+sproull S P R UW L
+sprouls S P R AW L Z
+sprouse S P R AW S
+sprout S P R AW T
+sproutaphile S P R AW T AH F AY L
+sproutaphiles S P R AW T AH F AY L Z
+sprouted S P R AW T AH D
+sprouted(2) S P R AW T IH D
+sprouting S P R AW T IH NG
+sprouts S P R AW T S
+sprow S P R AW
+sprowl S P R AW L
+sprowle S P R AW AH L
+sprowls S P R AW L Z
+spruce S P R UW S
+spruced S P R UW S T
+sprucing S P R UW S IH NG
+spruell S P R UW L
+spruiell S P R UW L
+spruill S P R UW L
+sprung S P R AH NG
+sprunger S P R AH NG ER
+spry S P R AY
+spud S P AH D
+spud's S P AH D Z
+spuds S P AH D Z
+spuhler S P UW L ER
+spun S P AH N
+spunk S P AH NG K
+spunky S P AH NG K IY
+spur S P ER
+spurdle S P ER D AH L
+spurge S P ER JH
+spurgeon S P ER JH IH N
+spurgin S P ER JH IH N
+spurious S P Y UH R IY AH S
+spurious(2) S P ER IY AH S
+spurlin S P ER L IH N
+spurling S P ER L IH NG
+spurlock S P ER L AA K
+spurn S P ER N
+spurned S P ER N D
+spurning S P ER N IH NG
+spurns S P ER N Z
+spurr S P ER
+spurred S P ER D
+spurrier S P ER IY ER
+spurring S P ER IH NG
+spurs S P ER Z
+spurt S P ER T
+spurted S P ER T IH D
+spurting S P ER T IH NG
+spurts S P ER T S
+sputnik S P AH T N IH K
+sputniks S P AH T N IH K S
+sputter S P AH T ER
+sputtered S P AH T ER D
+sputtering S P AH T ER IH NG
+sputters S P AH T ER Z
+spy S P AY
+spy's S P AY Z
+spycatcher S P AY K AE CH ER
+spychalski S P IH HH AA L S K IY
+spyglass S P AY G L AE S
+spying S P AY IH NG
+spyker S P AY K ER
+squabble S K W AA B AH L
+squabbled S K W AA B AH L D
+squabbles S K W AA B AH L Z
+squabbling S K W AA B AH L IH NG
+squabbling(2) S K W AA B L IH NG
+squad S K W AA D
+squad's S K W AA D Z
+squadron S K W AA D R AH N
+squadrons S K W AA D R AH N Z
+squads S K W AA D Z
+squalid S K W AA L AH D
+squall S K W AO L
+squalls S K W AO L Z
+squalor S K W AA L ER
+squander S K W AA N D ER
+squandered S K W AA N D ER D
+squandering S K W AA N D ER IH NG
+squanders S K W AA N D ER Z
+square S K W EH R
+squared S K W EH R D
+squarely S K W EH R L IY
+squares S K W EH R Z
+squaring S K W EH R IH NG
+squash S K W AA SH
+squashed S K W AA SH T
+squashing S K W AA SH IH NG
+squashy S K W AA SH IY
+squat S K W AA T
+squats S K W AA T S
+squatter S K W AA T ER
+squatters S K W AA T ER Z
+squatting S K W AA T IH NG
+squatty S K W AA T IY
+squawk S K W AO K
+squawking S K W AO K IH NG
+squawks S K W AO K S
+squeak S K W IY K
+squeaked S K W IY K T
+squeaker S K W IY K ER
+squeakers S K W IY K ER Z
+squeaking S K W IY K IH NG
+squeaks S K W IY K S
+squeaky S K W IY K IY
+squeal S K W IY L
+squealing S K W IY L IH NG
+squeals S K W IY L Z
+squeamish S K W IY M IH SH
+squeamishness S K W IY M IH SH N AH S
+squeegee S K W IY JH IY
+squeeze S K W IY Z
+squeezed S K W IY Z D
+squeezes S K W IY Z IH Z
+squeezing S K W IY Z IH NG
+squelch S K W EH L CH
+squelched S K W EH L CH T
+squelching S K W EH L CH IH NG
+squibb S K W IH B
+squibb's S K W IH B Z
+squid S K W IH D
+squier S K W AY ER
+squiers S K W AY ER Z
+squiggle S K W IH G AH L
+squiggles S K W IH G AH L Z
+squillace S K W IH L AH S
+squillacote S K W IH L AH K OW T
+squillacote's S K W IH L AH K OW T S
+squillante S K W IY L AA N T EY
+squint S K W IH N T
+squinting S K W IH N T IH NG
+squire S K W AY R
+squires S K W AY ER Z
+squirm S K W ER M
+squirming S K W ER M IH NG
+squirms S K W ER M Z
+squirrel S K W ER AH L
+squirreled S K W ER AH L D
+squirrels S K W ER AH L Z
+squirt S K W ER T
+squirted S K W ER T AH D
+squirted(2) S K W ER T IH D
+squirting S K W ER T IH NG
+squirts S K W ER T S
+squishy S K W IH SH IY
+squitieri S K W IY T IH R IY
+squyres S K W AY R Z
+sr S IY N Y ER
+sr(2) S IH S T ER
+srader SH R EY D ER
+sram SH R AE M
+sram(2) EH S R AE M
+sramek SH R AE M IH K
+srdan S ER D AE N
+srebrenica S R EY B R EH N IY T S AH
+srebrenica's S R EY B R EH N IY T S AH Z
+srebrenica's(2) SH R EY B R AH N IY T S AH Z
+srebrenica(2) SH R EY B R AH N IY T S AH
+sremac S R IY M AE K
+sri SH R IY
+sri(2) EH S AA R AY
+sri(3) S R IY
+sri-lanka S R IY L AE NG K AH
+sri-lanka(2) SH R IY L AE NG K AH
+srinagar S R IY N AH G AA R
+srinagar(2) SH R IY N AH G AA R
+srinagarb S R IY N AH G AA R B
+srinagarb(2) SH R IY N AH G AA R B
+srinivas S R IY N IH V AA S
+srinivasan S R IY N IY V AA S AA N
+srinivasan(2) SH R IY N IY V AA S AA N
+sriram S R IY R AA M
+sriram(2) SH R IY R AA M
+srivastava S R IY V AA S T AA V AH
+srivastava(2) SH R IY V AA S T AA V AH
+srock SH R AA K
+sroge SH R OW G
+sroka SH R OW K AH
+sroufe SH R OW F
+srpska S R AH P S K AH
+ssangyong S AE NG Y AO NG
+st S T R IY T
+st(2) S EY N T
+st-james S EY N T JH EY M Z
+st-johns S EY N T JH AA N Z
+sta S T AH
+sta(2) EH S T IY EY
+staab S T AA B
+staack S T AA K
+staal S T AA L
+staar S T AA R
+staar's S T AA R Z
+staas S T AA Z
+staat S T AA T
+staats S T AA T S
+stab S T AE B
+stabbed S T AE B D
+stabbing S T AE B IH NG
+stabbings S T AE B IH NG Z
+stabenow S T AE B IH N OW
+stabile S T EY B IH L
+stability S T AH B IH L IH T IY
+stabilization S T EY B AH L AH Z EY SH AH N
+stabilize S T EY B AH L AY Z
+stabilized S T EY B AH L AY Z D
+stabilizer S T EY B AH L AY Z ER
+stabilizers S T EY B AH L AY Z ER Z
+stabilizes S T EY B AH L AY Z AH Z
+stabilizes(2) S T EY B AH L AY Z IH Z
+stabilizing S T EY B AH L AY Z IH NG
+stable S T EY B AH L
+stabler S T EY B AH L ER
+stabler(2) S T EY B L ER
+stables S T EY B AH L Z
+stablest S T EY B AH L AH S T
+stabley S T AE B L IY
+stabs S T AE B Z
+stac S T AE K
+stac's S T AE K S
+staccato S T AH K AA T OW
+stacey S T EY S IY
+stach S T AE CH
+stachnik S T AE K N IH K
+stachowiak S T AH HH AW IY AE K
+stachowicz S T AA HH AH V IH CH
+stachowski S T AH HH AO F S K IY
+stachura S T AA K UH R AH
+stachurski S T AH HH ER S K IY
+stacia S T AA CH AH
+stacie S T AE K IY
+stack S T AE K
+stacked S T AE K T
+stacker S T AE K ER
+stackhouse S T AE K HH AW S
+stacking S T AE K IH NG
+stackpole S T AE K P OW L
+stacks S T AE K S
+stacy S T EY S IY
+stade S T EY D
+stadel S T AE D AH L
+stadelman S T AE D AH L M AH N
+stader S T EY D ER
+stadia S T EY D IY AH
+stadium S T EY D IY AH M
+stadium's S T EY D IY AH M Z
+stadiums S T EY D IY AH M Z
+stadler S T AE D L ER
+stadnik S T AE D N IH K
+stadt S T AE D T
+stadtlander SH T AE T L AE N D ER
+stadtmiller SH T AE T M IH L ER
+staebell S T EH B EH L
+staebler S T EY L ER
+staehle S T EY L
+staff S T AE F
+staff's S T AE F S
+staffa S T AA F AH
+staffed S T AE F T
+staffer S T AE F ER
+staffers S T AE F ER Z
+staffieri S T AA F IH R IY
+staffing S T AE F IH NG
+stafford S T AE F ER D
+stafford's S T AE F ER D Z
+staffordshire S T AE F ER D SH ER
+staffordshire's S T AE F ER D SH ER Z
+staffordshire's(2) S T AE F ER D SH AY ER Z
+staffordshire(2) S T AE F ER D SH AY ER
+staffs S T AE F S
+stag S T AE G
+stage S T EY JH
+stagecoach S T EY JH K OW CH
+stagecraft S T EY JH K R AE F T
+staged S T EY JH D
+stagehand S T EY JH HH AE N D
+stagehands S T EY JH HH AE N D Z
+stager S T EY JH ER
+stages S T EY JH AH Z
+stages(2) S T EY JH IH Z
+stagflate S T AE G F L EY T
+stagflation S T AE G F L EY SH AH N
+stagg S T AE G
+stagger S T AE G ER
+staggered S T AE G ER D
+staggering S T AE G ER IH NG
+staggers S T AE G ER Z
+staggs S T AE G Z
+staging S T EY JH IH NG
+stagliano S T AA G L IY AA N OW
+stagnant S T AE G N AH N T
+stagnaro S T AA G N AA R OW
+stagnate S T AE G N EY T
+stagnated S T AE G N EY T IH D
+stagnating S T AE G N EY T IH NG
+stagnation S T AE G N EY SH AH N
+stagner S T AE G N ER
+stahl S T AA L
+stahlberg S T AA L B ER G
+stahle S T EY HH AH L
+stahlecker S T AA L IH K ER
+stahler S T AA L ER
+stahley S T AE L IY
+stahlhut S T AA L HH AH T
+stahlman S T AA L M AH N
+stahly S T AE L IY
+stahmer S T AA M ER
+stahnke S T AE NG K
+stahr S T AE R
+stai S T AA IY
+staib S T EY B
+staid S T EY D
+staiger S T AY G ER
+stailey S T EY L IY
+stain S T EY N
+stainback S T EY N B AE K
+stainbrook S T EY N B R UH K
+stained S T EY N D
+staines S T EY N Z
+staining S T EY N IH NG
+stainless S T EY N L AH S
+stainmaster S T EY N M AE S T ER
+stains S T EY N Z
+stair S T EH R
+staircase S T EH R K EY S
+staircases S T EH R K EY S IH Z
+stairs S T EH R Z
+stairway S T EH R W EY
+stairways S T EH R W EY Z
+stairwell S T EH R W EH L
+stairwells S T EH R W EH L Z
+stake S T EY K
+stake's S T EY K S
+stake-out S T EY K AW T
+staked S T EY K T
+stakeholder S T EY K HH OW L D ER
+stakeholders S T EY K HH OW L D ER Z
+stakeout S T EY K AW T
+stakeouts S T EY K AW T S
+staker S T EY K ER
+stakes S T EY K S
+staking S T EY K IH NG
+stalcup S T AO L K AH P
+stalder S T AO L D ER
+stale S T EY L
+stalemate S T EY L M EY T
+stalemated S T EY L M EY T IH D
+staley S T EY L IY
+staley's S T EY L IY Z
+stalin S T AA L AH N
+stalin's S T AA L IH N Z
+stalingrad S T AE L IH N G R AE D
+stalinism S T AE L IH N IH Z AH M
+stalinist S T AA L IH N IH S T
+stalinistic S T AA L IH N IH S T IH K
+stalinists S T AE L IH N IH S T S
+stalinists(2) S T AE L IH N IH S S
+stalinists(3) S T AE L IH N IH S
+stalinization S T AE L IH N IH Z EY SH AH N
+stalinize S T AE L IH N AY Z
+stalk S T AO K
+stalked S T AO K T
+stalker S T AO K ER
+stalkers S T AO K ER Z
+stalking S T AO K IH NG
+stalks S T AO K S
+stalky S T AO K IY
+stall S T AO L
+stallard S T AE L ER D
+stallcup S T AO L K AH P
+stalled S T AO L D
+staller S T AO L ER
+stallibrass S T AE L IH B R AE S
+stalling S T AO L IH NG
+stallings S T AO L IH NG Z
+stallion S T AE L Y AH N
+stallions S T AE L Y AH N Z
+stallkamp S T AO L K AE M P
+stallman S T AO L M AH N
+stallone S T AH L OW N
+stallone's S T AH L OW N Z
+stalls S T AO L Z
+stallsmith S T AO L S M IH TH
+stallworth S T AO L W ER TH
+stalnaker S T AE L N AH K ER
+staloff S T AE L AO F
+stalon S T EY L AH N
+stalowa S T AH L OW AH
+stalter S T AO L T ER
+stalvey S T AE L V IY
+stalwart S T AO L W ER T
+stalwarts S T AO L W ER T S
+stalzer S T EY L Z ER
+stam S T AE M
+stamand S T AE M AH N D
+stamant S T AE M AH N T
+stamas S T AA M AH Z
+stamaty S T AE M AH T IY
+stambaugh S T AE M B AO
+stamberg S T AE M B ER G
+stamenson S T EY M AH N S AH N
+stamer S T EY M ER
+stamey S T EY M IY
+stamford S T AE M F ER D
+stamina S T AE M AH N AH
+stamler S T AE M L ER
+stamm S T AE M
+stammen S T AE M AH N
+stammer S T AE M ER
+stamos S T EY M OW Z
+stamour S T AH M UH R
+stamp S T AE M P
+stamped S T AE M P T
+stampede S T AE M P IY D
+stampeded S T AE M P IY D AH D
+stampeded(2) S T AE M P IY D IH D
+stampeding S T AE M P IY D IH NG
+stamper S T AE M P ER
+stampfli S T AE M P F L IY
+stamping S T AE M P IH NG
+stampings S T AE M P IH NG Z
+stampley S T AE M P L IY
+stamps S T AE M P S
+stan S T AE N
+stan's S T AE N Z
+stanadyne S T AE N AH D AY N
+stanaland S T AE N AH L AH N D
+stanard S T AE N ER D
+stanaway S T AE N AH W EY
+stanback S T AE N B AE K
+stanberry S T AE N B EH R IY
+stanbery S T AE N B ER IY
+stanbic S T AE N B IH K
+stanbrough S T AE N B R AW
+stanbury S T AE N B EH R IY
+stance S T AE N S
+stances S T AE N S IH Z
+stanch S T AE N CH
+stanched S T AE N CH T
+stanchfield S T AE N CH F IY L D
+stanching S T AE N CH IH NG
+stancik S T AE N S IH K
+stancil S T AE N S IH L
+stancill S T AE N S IH L
+stancliff S T AE N K L IH F
+stanco S T AE NG K OW
+stanczak S T AE N CH AE K
+stanczyk S T AE N CH IH K
+stand S T AE N D
+standa S T AE N D AH
+standard S T AE N D ER D
+standard's S T AE N D ER D Z
+standard-bearer S T AE N D ER D B EH R ER
+standard-bearers S T AE N D ER D B EH R ER Z
+standardization S T AE N D ER D IH Z EY SH AH N
+standardize S T AE N D ER D AY Z
+standardized S T AE N D ER D AY Z D
+standardizing S T AE N D ER D AY Z IH NG
+standards S T AE N D ER D Z
+standby S T AE N D B AY
+standbys S T AE N D B AY Z
+standefer S T AE N D IH F ER
+standen S T AE N D AH N
+stander S T AE N D ER
+standerfer S T AE N D ER F ER
+standerford S T AE N D ER F ER D
+standex S T AE N D AH K S
+standfield S T AE N D F IY L D
+standifer S T AE N D IH F ER
+standiford S T AE N D IH F ER D
+standin' S T AE N D IH N
+standing S T AE N D IH NG
+standings S T AE N D IH NG Z
+standish S T AE N D IH SH
+standlee S T AE N D L IY
+standley S T AE N D L IY
+standoff S T AE N D AO F
+standoffs S T AE N D AO F S
+standout S T AE N D AW T
+standouts S T AE N D AW T S
+standpoint S T AE N D P OY N T
+standpoints S T AE N D P OY N T S
+standre S T AE N D ER
+standridge S T AE N D R IH JH
+stands S T AE N D Z
+standstill S T AE N D S T IH L
+standup S T AE N D AH P
+stanek S T AE N IH K
+stanfield S T AE N F IY L D
+stanfill S T AE N F AH L
+stanford S T AE N F ER D
+stanford's S T AE N F ER D Z
+stanforth S T AE N F ER TH
+stang S T AE NG
+stanga S T AA NG G AH
+stange S T AE N JH
+stangel S T EY NG G AH L
+stangeland S T EY NG G IH L AH N D
+stangeland(2) S T EY NG G L AH N D
+stangelo S T AA NG G EH L OW
+stanger S T AE NG ER
+stangl S T AE NG G AH L
+stangland S T AE NG G L AH N D
+stangle S T AE NG G AH L
+stangler S T AE NG G AH L ER
+stangler(2) S T AE NG G L ER
+stango S T AA NG G OW
+stanhope S T AE N AH P
+staniar S T EY N IY AA R
+stanich S T AE N IH CH
+stanifer S T AE N IH F ER
+stanis S T AE N IH S
+stanish S T AE N IH SH
+stanislas S T AH N IH S L AH S
+stanislav S T AE N IH S L AA V
+stanislaw S T AE N IH S L AO
+stanislawski S T AH N IH S L AA F S K IY
+staniszewski S T AH N IH SH EH F S K IY
+stank S T AE NG K
+stanke S T AE NG K
+stankevich S T AE NG K AH V IH CH
+stankey S T AE NG K IY
+stankiewicz S T AE N K AH V IH CH
+stanko S T AE NG K OW
+stankovich S T AE NG K AH V IH CH
+stankowski S T AH NG K AO F S K IY
+stankus S T AE NG K AH S
+stanleigh S T AE N L AH
+stanley S T AE N L IY
+stanley's S T AE N L IY Z
+stanleytown S T AE N L IY T AW N
+stanline S T AE N L AY N
+stanly S T AE N L IY
+stanmore S T AE N M AO R
+stann S T AE N
+stannard S T AE N ER D
+stannie S T AE N IY
+stano S T AA N OW
+stanphill S T AE N P HH IH L
+stanphill(2) S T AE M P HH IH L
+stansberry S T AE N S B EH R IY
+stansbury S T AE N S B EH R IY
+stansel S T AE N S AH L
+stansell S T AE N S AH L
+stansfield S T AE N S F IY L D
+stansky S T AE N S K IY
+stant S T AE N T
+stanton S T AE N T AH N
+stanway S T AE N W EY
+stanwick S T AE N W IH K
+stanwood S T AE N W UH D
+stanza S T AE N Z AH
+stanzas S T AE N Z AH Z
+stanzione S T AA N Z IY OW N IY
+stapel S T AE P AH L
+stapf S T AE P F
+staph S T AE F
+staphylococcus S T AE F AH L AH K AO K AH S
+staple S T EY P AH L
+stapled S T EY P AH L D
+stapler S T EY P AH L ER
+stapler(2) S T EY P L ER
+staplers S T EY P AH L ER Z
+staplers(2) S T EY P L ER Z
+staples S T EY P AH L Z
+stapleton S T EY P AH L T AH N
+stapley S T AE P L IY
+stapling S T EY P AH L IH NG
+stapling(2) S T EY P L IH NG
+stapp S T AE P
+star S T AA R
+star's S T AA R Z
+starace S T AA R AA CH IY
+starbird S T AA R B ER D
+starboard S T AA R B ER D
+starboards S T AA R B ER R D Z
+starboards(2) S T AA R B AO R D Z
+starbuck S T AA R B AH K
+starbuck's S T AA R B AH K S
+starbucks S T AA R B AH K S
+starcevich S T AA R S IH V IH CH
+starch S T AA R CH
+starched S T AA R CH T
+starcher S T AA R CH ER
+starches S T AA R CH IH Z
+starchlike S T AA R CH L AY K
+starchy S T AA R CH IY
+starck S T AA R K
+starckmann S T AA R K M AH N
+starcraft S T AA R K R AE F T
+starcross S T AA R K R AO S
+stardel S T AA R D EH L
+stardent S T AA R D EH N T
+stardom S T AA R D AH M
+stardust S T AA R D AH S T
+stare S T EH R
+stared S T EH R D
+starer S T EH R ER
+stares S T EH R Z
+starfish S T AA R F IH SH
+stargate S T AA R G EY T
+stargates S T AA R G EY T S
+stargazer S T AA R G EY Z ER
+stargazers S T AA R G EY Z ER Z
+starin S T AE R IH N
+staring S T EH R IH NG
+stark S T AA R K
+stark's S T AA R K S
+starke S T AA R K
+starkel S T AA R K AH L
+starker S T AA R K ER
+starkes S T AA R K S
+starkey S T AA R K IY
+starkist S T AA R K IH S T
+starkly S T AA R K L IY
+starkman S T AA R K M AH N
+starkness S T AA R K N IH S
+starkovich S T AA R K AH V IH CH
+starks S T AA R K S
+starkweather S T AA R K W EH DH ER
+starlet S T AA R L AH T
+starlets S T AA R L AH T S
+starlight S T AA R L AY T
+starlike S T AA R L AY K
+starlin S T AA R L IH N
+starling S T AA R L IH NG
+starliper S T AA R L IH P ER
+starlit S T AA R L IH T
+starman S T AA R M AH N
+starmer S T AA R M ER
+starn S T AA R N
+starner S T AA R N ER
+starnes S T AA R N Z
+starns S T AA R N Z
+starodubstev S T AA R OW D AH B S T EH V
+staron S T AE R AH N
+starplex S T AA R P L EH K S
+starpointe S T AA R P OY N T
+starr S T AA R
+starr's S T AA R Z
+starred S T AA R D
+starrett S T AE R IH T
+starring S T AA R IH NG
+starrs S T AA R Z
+starry S T AA R IY
+stars S T AA R Z
+stars' S T AA R Z
+starship S T AA R SH IH P
+starsight S T AA R S AY T
+starstream S T AA R S T R IY M
+starstruck S T AA R S T R AH K
+start S T AA R T
+start-up S T AA R T AH P
+start-ups S T AA R T AH P S
+started S T AA R T AH D
+started(2) S T AA R T IH D
+starter S T AA R T ER
+starters S T AA R T ER Z
+starting S T AA R T IH NG
+startle S T AA R T AH L
+startled S T AA R T AH L D
+startles S T AA R T AH L Z
+startling S T AA R T L IH NG
+startlingly S T AA R T L IH NG L IY
+starts S T AA R T S
+startup S T AA R T AH P
+startups S T AA R T AH P S
+starvation S T AA R V EY SH AH N
+starve S T AA R V
+starved S T AA R V D
+starving S T AA R V IH NG
+starwalt S T AA R W AH L T
+starwave S T AA R W EY V
+stary S T EH R IY
+starzyk S T AA R Z IH K
+stash S T AE SH
+stashed S T AE SH T
+stashing S T AE SH IH NG
+stasi S T AA S IY
+stasiak S T AA S IY AE K
+stasik S T AA S IH K
+stasio S T AA S IY OW
+stasko S T AA S K OW
+stasney S T AE S N IY
+stasny S T AE S N IY
+stassen S T AE S AH N
+stassi S T AE S IY
+stastny S T AE S T N IY
+staszak S T AA SH AH K
+staszewski S T AH SH EH F S K IY
+stat S T AE T
+state S T EY T
+state's S T EY T S
+statecraft S T EY T K R AE F T
+stated S T EY T AH D
+stated(2) S T EY T IH D
+statehood S T EY T HH UH D
+statehouse S T EY T HH AW S
+statehouses S T EY T HH AW S IH Z
+stateless S T EY T L IH S
+stately S T EY T L IY
+statement S T EY T M AH N T
+statement's S T EY T M AH N T S
+statements S T EY T M AH N T S
+staten S T AE T AH N
+stater S T EY T ER
+stater's S T EY T ER Z
+staters S T EY T ER Z
+states S T EY T S
+states' S T EY T S
+statesborough S T EY T S B AH R OW
+stateside S T EY T S AY D
+statesman S T EY T S M AH N
+statesman's S T EY T S M AH N Z
+statesmanlike S T AH T EH S M AH N L AY K
+statesmanship S T EY T S M AH N SH IH P
+statesmen S T EY T S M IH N
+stateswest S T EY T S W EH S T
+statewide S T EY T W AY D
+statham S T AE TH AH M
+stathis S T AE TH IH S
+stathopoulos S T AH TH AA P AH L IH S
+static S T AE T IH K
+statin S T EY T IH N
+statin's S T EY T IH N Z
+stating S T EY T IH NG
+statins S T EY T IH N Z
+station S T EY SH AH N
+station's S T EY SH AH N Z
+stationary S T EY SH AH N EH R IY
+stationed S T EY SH AH N D
+stationer S T EY SH AH N ER
+stationers S T EY SH AH N ER Z
+stationery S T EY SH AH N EH R IY
+stationing S T EY SH AH N IH NG
+stations S T EY SH AH N Z
+stations' S T EY SH AH N Z
+statism S T EY T IH Z AH M
+statist S T EY T IH S T
+statistic S T AH T IH S T IH K
+statistical S T AH T IH S T IH K AH L
+statistically S T AH T IH S T IH K AH L IY
+statistically(2) S T AH T IH S T IH K L IY
+statistician S T AE T AH S T IH SH AH N
+statisticians S T AE T IH S T IH SH AH N Z
+statistics S T AH T IH S T IH K S
+statistics' S T AH T IH S T IH K S
+statists S T EY T IH S T S
+statists(2) S T EY T IH S S
+statists(3) S T EY T IH S
+statler S T AE T L ER
+statoil S T AH T OY L
+staton S T AE T AH N
+stats S T AE T S
+stattin S T AE T IH N
+statton S T AE T AH N
+statuary S T AE CH UW EH R IY
+statue S T AE CH UW
+statues S T AE CH UW Z
+statuesque S T AE CH UW EH S K
+statuette S T AE CH UW EH T
+statuettes S T AE CH UW EH T S
+statum S T AE T AH M
+stature S T AE CH ER
+status S T AE T AH S
+status(2) S T EY T AH S
+statute S T AE CH UW T
+statute's S T AE CH UW T S
+statutes S T AE CH UW T S
+statutorily S T AE CH AH T AO R AH L IY
+statutorily(2) S T AE CH Y UW T AO R AH L IY
+statutory S T AE CH AH T AO R IY
+statz S T AE T S
+statzer S T AE T Z ER
+statzer(2) S T EY T Z ER
+staub S T AO B
+stauber S T AW B ER
+staubin S T AW B IH N
+staubs S T AO B Z
+stauch S T AO CH
+staudacher S T AW D AH K ER
+staude S T AO D
+stauder S T AW D ER
+staudinger S T AW D IH NG ER
+staudt S T AO D T
+stauff S T AO F
+stauffacher S T AW F AH K ER
+stauffer S T AO F ER
+stauffer's S T AO F ER Z
+staunch S T AO N CH
+staunchest S T AO N CH AH S T
+staunchly S T AO N CH L IY
+staunton S T AO N T AH N
+staup S T AO P
+stauss S T AO S
+stauter S T AW T ER
+stave S T EY V
+staved S T EY V D
+stavely S T EY V L IY
+staver S T EY V ER
+staves S T EY V Z
+staving S T EY V IH NG
+stavinoha S T AE V IH N OW HH AH
+stavola S T AA V OW L AH
+stavropoulos S T AH V R AA P AH L IH S
+stavros S T AH V R OW Z
+stawicki S T AA V IH T S K IY
+stawski S T AA F S K IY
+stay S T EY
+stayed S T EY D
+stayer S T EY ER
+staying S T EY IH NG
+stayner S T EY N ER
+stayover S T EY OW V ER
+stayovers S T EY OW V ER Z
+stays S T EY Z
+stayton S T EY T AH N
+stclair S EY N T K L EH R
+stds EH S T IY D IY Z
+stds(2) EH S T IY D IY EH S
+stead S T EH D
+steadfast S T EH D F AE S T
+steadfastly S T EH D F AE S T L IY
+steadfastness S T EH D F AE S T N AH S
+steadham S T EH D HH AH M
+steadied S T EH D IY D
+steadier S T EH D IY ER
+steadily S T EH D AH L IY
+steadiness S T EH D IY N IH S
+steadman S T EH D M AH N
+steady S T EH D IY
+steagall S T IY G AH L
+steagle S T IY G AH L
+steak S T EY K
+steakhouse S T EY K HH AW S
+steakhouses S T EY K HH AW S IH Z
+steakley S T IY K L IY
+steaks S T EY K S
+steal S T IY L
+stealer S T IY L ER
+stealey S T IY L IY
+stealing S T IY L IH NG
+steals S T IY L Z
+stealth S T EH L TH
+stealthier S T EH L TH IY ER
+stealthies S T EH L TH IY Z
+stealthiest S T EH L TH IY AH S T
+stealthy S T EH L TH IY
+steam S T IY M
+steamboat S T IY M B OW T
+steamboats S T IY M B OW T S
+steamed S T IY M D
+steamer S T IY M ER
+steamers S T IY M ER Z
+steamier S T IY M IY ER
+steamiest S T IY M IY AH S T
+steamily S T IY M AH L IY
+steaming S T IY M IH NG
+steamroller S T IY M R OW L ER
+steamrollered S T IY M R OW L ER D
+steams S T IY M Z
+steamship S T IY M SH IH P
+steamy S T IY M IY
+stear S T IH R
+stearic S T IY R IH K
+stearman S T IH R M AH N
+stearn S T ER N
+stearne S T ER N
+stearns S T ER N Z
+stearns's S T ER N Z IH Z
+stears S T IY R Z
+stebbins S T EH B IH N Z
+steber S T IY B ER
+stebner S T EH B N ER
+stec S T EH K
+stech S T EH K
+stecher S T EH K ER
+stechler S T EH K L ER
+stechschulte S T EH K SH AH L T
+steck S T EH K
+steckel S T EH K AH L
+steckelberg S T EH K AH L B ER G
+stecker S T EH K ER
+stecklein S T EH K L AY N
+steckler S T EH K L ER
+steckley S T EH K L IY
+steckman S T EH K M AH N
+stedman S T EH D M AH N
+steeb S T IY B
+steeber S T IY B ER
+steed S T IY D
+steed's S T IY D Z
+steedley S T IY D L IY
+steedman S T IY D M AH N
+steeds S T IY D Z
+steeg S T IY G
+steege S T IY JH
+steego S T IY G OW
+steel S T IY L
+steel's S T IY L Z
+steelcase S T IY L K EY S
+steele S T IY L
+steeler S T IY L ER
+steelers S T IY L ER Z
+steeley S T IY L IY
+steelhead S T IY L HH EH D
+steelmaker S T IY L M EY K ER
+steelmaker's S T IY L M EY K ER Z
+steelmakers S T IY L M EY K ER Z
+steelmakers' S T IY L M AH K ER Z
+steelmaking S T IY L M EY K IH NG
+steelman S T IY L M AH N
+steels S T IY L Z
+steelworker S T IY L W ER K ER
+steelworkers S T IY L W ER K ER Z
+steelworkers' S T IY L W ER K ER Z
+steelworks S T IY L W ER K S
+steely S T IY L IY
+steen S T IY N
+steenbergen S T IY N B ER G AH N
+steenburgen S T IY N B ER G AH N
+steenkamp S T IY N K AE M P
+steenkiste S T IY N K IH S T
+steenrod S T IY N R AH D
+steensma S T IY N Z M AH
+steenson S T IY N S AH N
+steep S T IY P
+steeped S T IY P T
+steepened S T IY P AH N D
+steeper S T IY P ER
+steepest S T IY P AH S T
+steeple S T IY P AH L
+steeplechase S T IY P AH L CH EY S
+steeples S T IY P AH L Z
+steeply S T IY P L IY
+steepness S T IY P N AH S
+steer S T IH R
+steere S T IH R
+steered S T IH R D
+steering S T IH R IH NG
+steers S T IH R Z
+stees S T IY Z
+steeton S T IY T AH N
+steever S T IY V ER
+steeves S T IY V Z
+stefa S T EH F AH
+stefan S T EH F AA N
+stefanelli S T EH F AA N EH L IY
+stefani S T EH F AH N IY
+stefani's S T EH F AH N IY Z
+stefaniak S T IH F AE N IY AE K
+stefanic S T IH F AE N IH K
+stefanich S T EH F AH N IH CH
+stefanick S T EH F AH N IH K
+stefanie S T EH F AH N IY
+stefanik S T IH F AE N IH K
+stefanko S T IH F AE NG K OW
+stefano S T EH F AH N OW
+stefanopolis S T EH F AH N AO P AH L AH S
+stefanowicz S T IH F AE N AH V IH CH
+stefanski S T IH F AE N S K IY
+steffan S T EH F AH N
+steffanci S T EH F AA N S IY
+steffe S T EH F
+steffek S T EH F IH K
+steffel S T EH F AH L
+steffen S T EH F AH N
+steffenhagen S T EH F IH N HH AH G AH N
+steffens S T EH F AH N Z
+steffensen S T EH F IH N S AH N
+steffensmeier S T EH F IH N S M AY ER
+steffenson S T EH F IH N S AH N
+steffes S T EH F S
+steffey S T EH F IY
+steffi S T EH F IY
+steffie S T EH F IY
+steffler S T EH F L ER
+steffy S T EH F IY
+stefko S T EH F K OW
+stefl S T EH F AH L
+stegall S T EH G AH L
+stegar S T IY G ER
+stegar's S T IY G ER Z
+stege S T IY JH
+stegeman S T IY G M AH N
+stegemann S T IY G M AH N
+stegemeier S T EH G M AY R
+stegenga S T EH JH EH NG G AH
+steger S T IY G ER
+stegmaier S T EH G M AY ER
+stegman S T EH G M AH N
+stegmann S T EH G M AH N
+stegner S T EH G N ER
+stegosaurus S T EH G AH S AO R AH S
+stehle S T EH HH AH L
+stehlik S T EH L IH K
+stehlin S T EH L IH N
+stehling S T EH L IH NG
+stehman S T EH M AH N
+stehr S T EH R
+steib S T IY B
+steichen S T AY K AH N
+steidel S T AY D AH L
+steidinger S T AY D IH NG ER
+steidl S T IY D AH L
+steidle S T IY D AH L
+steidtmann S T AY T M AH N
+steier S T AY ER
+steig S T IY G
+steiger S T AY G ER
+steigerwald S T AY G ER W AO L D
+steigerwalt S T AY G ER W AH L T
+steil S T IY L
+steiman S T AY M AH N
+steimel S T AY M AH L
+steimer S T AY M ER
+steimle S T IY M AH L
+stein S T AY N
+stein's S T AY N Z
+steinacker S T AY N AE K ER
+steinbach S T AY N B AA K
+steinbacher S T AY N B AA K ER
+steinback S T AY N B AE K
+steinbauer S T AY N B AW ER
+steinbaugh S T AY N B AW
+steinbeck S T AY N B EH K
+steinbeck's S T AY N B EH K S
+steinberg S T AY N B ER G
+steinberg's S T AY N B ER G Z
+steinbergen S T AY N B AH R G AH N
+steinberger S T AY N B ER G ER
+steinbock S T AY N B AA K
+steinborn S T AY N B AO R N
+steinbrecher S T AY N B R EH K ER
+steinbrenner S T AY N B R EH N ER
+steinbrink S T AY N B R IH NG K
+steinem S T AY N AH M
+steiner S T AY N ER
+steiner's S T AY N ER Z
+steinert S T AY N ER T
+steines S T AY N Z
+steinfeld S T AY N F EH L D
+steinfeldt S T AY N F EH L T
+steingut S T AY N G AH T
+steinhagen S T AY N HH AE G AH N
+steinhardt S T AY N HH AA R T
+steinhardt's S T AY N HH AA R T S
+steinhart S T AY N HH AA R T
+steinhauer S T AY N HH AW ER
+steinhaus S T AY N HH AW S
+steinhauser S T AY N HH AW Z ER
+steinhilber S T AY N HH IH L B ER
+steinhoff S T AY N HH AO F
+steinhorst S T AY N HH AO R S T
+steininger S T AY N IH NG ER
+steinkamp S T AY NG K AE M P
+steinke S T AY NG K
+steinkraus S T AY NG K R AW Z
+steinkrauss S T AY N K R AW S
+steinkuehler S T AY N K Y UW L ER
+steinle S T AY N AH L
+steinman S T AY N M AH N
+steinmann S T AY N M AH N
+steinmetz S T AY N M EH T S
+steinmeyer S T AY N M AY ER
+steinmiller S T AY N M IH L ER
+steinroe S T AY N R OW
+steinway S T AY N W EY
+steinway's S T AY N W EY Z
+steitz S T IY T S
+stejskal S T EH JH S K AH L
+steketee S T EH K IH T IY
+stekly S T EH K L IY
+stelco S T EH L K OW
+stelian S T IY L IY AH N
+stell S T EH L
+stella S T EH L AH
+stella's S T EH L AH Z
+stellar S T EH L ER
+stellarton S T EH L ER T AH N
+stellato S T EH L AA T OW
+stelle S T EH L
+stellenbosch S T EH L AH N B AO SH
+steller S T EH L ER
+stellhorn S T EH L HH ER N
+stelling S T EH L IH NG
+stelljes S T EY L Y EH S
+stellmach S T EH L M AH K
+stellmacher S T EH L M AH K ER
+stellman S T EH L M AH N
+stello S T EH L OW
+stelly S T EH L IY
+stelmach S T EH L M AH K
+stelmack S T EH L M AH K
+steloff S T EH L AO F
+stelter S T EH L T ER
+steltz S T EH L T S
+stelzer S T EH L Z ER
+stelzner S T EH L Z N ER
+stem S T EH M
+stemberg S T EH M B ER G
+stembridge S T EH M B R IH JH
+stemen S T EH M AH N
+stemler S T EH M L ER
+stemlike S T EH M L AY K
+stemm S T EH M
+stemmed S T EH M D
+stemmer S T EH M ER
+stemming S T EH M IH NG
+stemmler S T EH M L ER
+stempel S T EH M P AH L
+stempel's S T EH M P AH L Z
+stemper S T EH M P ER
+stempien S T EH M P IY N
+stemple S T EH M P AH L
+stempler S T EH M P L ER
+stempler's S T EH M P L ER Z
+stemposts S T EH M P OW S T S
+stemposts(2) S T EH M P OW S S
+stemposts(3) S T EH M P OW S
+stems S T EH M Z
+sten S T EH N
+stena S T IY N AH
+stena(2) S T EH N AH
+stena(3) S T EY N AH
+stenberg S T EH N B ER G
+stencel S T EH N S AH L
+stench S T EH N CH
+stencil S T EH N S IH L
+stenciled S T EH N S IH L D
+stenciling S T EH N S IH L IH NG
+stenciling(2) S T EH N S L IH NG
+stendal S T EH N D AH L
+stender S T EH N D ER
+stendig S T EH N D IH G
+stene S T IY N
+stenerson S T EH N ER S AH N
+stengel S T EH NG G AH L
+stenger S T EH N JH ER
+stenglein S T IH NG L AY N
+stenholm S T EH N HH OW L M
+stenhouse S T EH N HH AW S
+stenner S T EH N ER
+stennett S T EH N IH T
+stennis S T EH N IH S
+steno S T EH N OW
+stenographer S T EH N AH G R AH F ER
+stenographic S T EH N AH G R AE F IH K
+stenquist S T EH N K W IH S T
+stenseth S T EH N S IH TH
+stensland S T EH N S L AH N D
+stenson S T EH N S AH N
+stensrud S T EH N S R AH D
+stenstrom S T EH N S T R AH M
+stent S T EH N T
+stentor S T EH N T ER
+stentors S T EH N T ER Z
+stentz S T EH N T S
+steny S T EH N IY
+stenz S T EH N Z
+stenzel S T EH N Z AH L
+step S T EH P
+stepan S T EH P AH N
+stepanakert S T AH P AE N AH K ER T
+stepanek S T EH P AH N IH K
+stepanian S T IH P EY N IY AH N
+stepanian's S T IH P EY N IY AH N Z
+stepanski S T IH P AE N S K IY
+stepchild S T EH P CH AY L D
+stepchildren S T EH P CH IH L D R AH N
+stepdaughter S T EH P D AO T ER
+stepdaughters S T EH P D AO T ER Z
+stepfather S T EH P F AA DH ER
+steph S T EH F
+stepha S T EH F AH
+stephan S T EH F AH N
+stephana S T EH F AA N AH
+stephane S T EH F AA N
+stephani S T EH F AH N IY
+stephania S T IH F AE N IY AH
+stephanie S T EH F AH N IY
+stephanopoulos S T EH F AH N AA P AH L AH S
+stephanopoulos' S T EH F AH N AA P AH L AH S
+stephanopoulos's S T EH F AH N AA P AH L AH S IH S
+stephans S T EH F AH N Z
+stephany S T EH F AH N IY
+stephen S T IY V AH N
+stephen's S T IY V AH N Z
+stephen's(2) S T EH F AH N Z
+stephen(2) S T EH F AH N
+stephens S T IY V AH N Z
+stephens's S T IY V IH N Z IH Z
+stephens(2) S T EH F AH N Z
+stephenson S T IY V AH N S AH N
+stephenville S T IY V IH N V IH L
+stepien S T EH P IY AH N
+stepka S T EH P K AH
+stepladder S T EH P L AE D ER
+stepladders S T EH P L AE D ER Z
+stepmother S T EH P M AH DH ER
+stepney S T EH P N IY
+stepp S T EH P
+steppe S T EH P
+stepped S T EH P T
+steppel S T EH P AH L
+steppenwolf S T EH P AH N W UH L F
+stepper S T EH P ER
+steppers S T EH P ER Z
+steppes S T EH P S
+steppin' S T EH P IH N
+stepping S T EH P IH NG
+steppingstone S T EH P IH NG S T OW N
+steps S T EH P S
+stepsister S T EH P S IH S T ER
+stepsisters S T EH P S IH S T ER Z
+stepson S T EH P S AH N
+steptoe S T EH P T OW
+sterba S T EH R B AH
+sterbenz S T ER B IH N S
+sterchi S T EH R K IY
+stereo S T EH R IY OW
+stereographic S T EH R IY AH G R AE F IH K
+stereolab S T EH IY OW L AE B
+stereomicroscope S T EH R IY OW M AY K R AH S K OW P
+stereos S T EH R IY OW Z
+stereotype S T EH R IY AH T AY P
+stereotype(2) S T EH R IY OW T AY P
+stereotyped S T EH R IY AH T AY P T
+stereotyped(2) S T EH R IY OW T AY P T
+stereotypes S T EH R IY AH T AY P S
+stereotypes(2) S T EH R IY OW T AY P S
+stereotypical S T EH R IY OW T IH P IH K AH L
+stereotypical(2) S T EH R IY AH T IH P IH K AH L
+stereotyping S T EH R IY AH T AY P IH NG
+stereotyping(2) S T EH R IY OW T AY P IH NG
+sterett S T EH R IH T
+sterett's S T EH R AH T S
+sterile S T EH R AH L
+sterility S T ER IH L IH T IY
+sterilization S T EH R AH L AH Z EY SH AH N
+sterilization(2) S T EH R AH L IH Z EY SH AH N
+sterilizations S T EH R AH L AH Z EY SH AH N Z
+sterilizations(2) S T EH R AH L IH Z EY SH AH N Z
+sterilize S T EH R AH L AY Z
+sterilized S T EH R AH L AY Z D
+sterilizer S T EH R AH L AY Z ER
+sterilizers S T EH R AH L AY Z ER Z
+sterilizes S T EH R AH L AY Z IH Z
+sterilizing S T EH R AH L AY Z IH NG
+sterk S T ER K
+sterkel S T ER K AH L
+sterle S T AO R AH L
+sterling S T ER L IH NG
+sterling's S T ER L IH NG Z
+sterman S T ER M AH N
+stermer S T ER M ER
+stern S T ER N
+stern's S T ER N Z
+sternbach S T ER N B AA K
+sternberg S T ER N B ER G
+sternberger S T ER N B ER G ER
+sterne S T ER N
+sternem S T ER N EH M
+sterner S T ER N ER
+sternest S T ER N AH S T
+sternfeld S T ER N F EH L D
+sternhagen S T ER N HH AH G AH N
+sternly S T ER N L IY
+sternness S T ER N N AH S
+sternness(2) S T ER N AH S
+sternpost S T ER N P OW S T
+sternposts S T ER N P OW S T S
+sternposts(2) S T ER N P OW S S
+sternposts(3) S T ER N P OW S
+sterns S T ER N Z
+steroid S T ER OY D
+steroids S T EH R OY D Z
+sterr S T EH R
+sterrett S T EH R IH T
+sterry S T EH R IY
+stet S T EH T
+stethem S T EH TH AH M
+stethem(2) S T EH T AH M
+stethoscope S T EH TH AH S K OW P
+stethoscopes S T EH TH AH S K OW P S
+stetler S T EH T L ER
+stetson S T EH T S AH N
+stetter S T EH T ER
+stettler S T EH T L ER
+stettner S T EH T N ER
+stetz S T EH T S
+stetzel S T EH T Z AH L
+stetzer S T EH T Z ER
+steuart S T OY AA R T
+steuben S T Y UW B IH N
+steuben(2) S T UW B IH N
+steubenville S T UW B AH N V IH L
+steuber S T OY B ER
+steuck S T UW K
+steuer S T OY ER
+steuerwald S T OY ER W AO L D
+steurer S T ER ER
+steuver S T UW V ER
+stevana S T IH V AE N AH
+steve S T IY V
+steve's S T IY V Z
+stevedore S T IY V AH D AO R
+stevedoring S T IY V AH D AO R IH NG
+steven S T IY V AH N
+steven's S T IY V AH N Z
+stevena S T EH V IH N AH
+stevens S T IY V AH N Z
+stevens' S T IY V AH N Z
+stevens's S T IY V AH N Z AH Z
+stevens's(2) S T IY V AH N Z IH Z
+stevenson S T IY V AH N S AH N
+stever S T IY V ER
+steverson S T EH V ER S AH N
+steves S T IY V Z
+steveson S T EH V IH S AH N
+stevick S T EH V IH K
+stevie S T IY V IY
+stevison S T EH V IH S AH N
+stew S T UW
+stew's S T UW Z
+steward S T UW ER D
+stewardess S T UW ER D AH S
+stewardesses S T UW ER D AH S IH Z
+stewards S T UW ER D Z
+stewardship S T UW ER D SH IH P
+stewart S T UW ER T
+stewart's S T UW ER T S
+stewed S T UW D
+stewing S T UW IH NG
+stews S T UW Z
+steyer S T EY ER
+stibel S T IH B AH L
+stice S T AY S
+stich S T IH CH
+sticha S T IH CH AH
+stichnoth S T IH K N AA TH
+sticht S T IH K T
+stichter S T IH K T ER
+stick S T IH K
+sticka S T IH K AH
+stickball S T IH K B AO L
+stickel S T IH K AH L
+stickels S T IH K AH L Z
+sticker S T IH K ER
+stickers S T IH K ER Z
+stickier S T IH K IY ER
+stickiest S T IH K IY AH S T
+sticking S T IH K IH NG
+stickland S T IH K L AH N D
+stickle S T IH K AH L
+stickler S T IH K AH L ER
+stickler(2) S T IH K L ER
+stickles S T IH K AH L Z
+stickley S T IH K L IY
+stickney S T IH K N IY
+sticks S T IH K S
+sticktight S T IH K T AY T
+sticktights S T IH K T AY T S
+sticky S T IH K IY
+stidd S T IH D
+stidham S T IH D HH AH M
+stiebel S T IY B AH L
+stieber S T IY B ER
+stief S T IY F
+stiefel S T IY F AH L
+stiefelhagen S T IY F AH L HH EY G AH N
+stiefelhagen(2) S T AY F AH L HH EY G AH N
+stiefvater S T IY F V AH T ER
+stieg S T IY G
+stiegemeier S T IY JH AH M AY R
+stiegler S T IY G L ER
+stieglitz S T IY G L IH T S
+stiehl S T IY L
+stiens S T IY N Z
+stier S T AY ER
+stiers S T AY ER Z
+stierwalt S T IH R W AH L T
+stieve S T IY V
+stifel S T IH F AH L
+stiff S T IH F
+stiffed S T IH F T
+stiffel S T IH F AH L
+stiffen S T IH F AH N
+stiffened S T IH F AH N D
+stiffener S T IH F AH N ER
+stiffening S T IH F AH N IH NG
+stiffening(2) S T IH F N IH NG
+stiffens S T IH F AH N Z
+stiffer S T IH F ER
+stiffest S T IH F AH S T
+stiffler S T IH F L ER
+stiffly S T IH F L IY
+stiffness S T IH F N AH S
+stiffs S T IH F S
+stifle S T AY F AH L
+stifled S T AY F AH L D
+stifles S T AY F AH L Z
+stifling S T AY F L IH NG
+stifling(2) S T AY F AH L IH NG
+stifter S T IH F T ER
+stig S T IH G
+stigall S T IH G AH L
+stiger S T AY G ER
+stigers S T AY G ER Z
+stigler S T IH G L ER
+stiglitz S T IH G L IH T S
+stigma S T IH G M AH
+stigmata S T IH G M AA T AH
+stigmatism S T IH G M AH T IH Z AH M
+stigmatize S T IH G M AH T AY Z
+stigmatized S T IH G M AH T AY Z D
+stigmatizing S T IH G M AH T AY Z IH NG
+stihl S T IH L
+stika S T IH K AH
+stikeleather S T IH K IH L EH DH ER
+stikeleather(2) S T IH K L EH DH ER
+stikeleather(3) S T AY K L EH DH ER
+stil S T IH L
+stile S T AY L
+stiles S T AY L Z
+stiletto S T AH L EH T OW
+stilettos S T AH L EH T OW Z
+still S T IH L
+stillborn S T IH L B AO R N
+stille S T IH L
+stilled S T IH L D
+stiller S T IH L ER
+stiller's S T IH L ER Z
+stilley S T IH L IY
+stillinger S T IH L IH NG ER
+stillings S T IH L IH NG Z
+stillion S T IH L Y AH N
+stillman S T IH L M AH N
+stillness S T IH L N AH S
+stills S T IH L Z
+stillson S T IH L S AH N
+stillwagon S T IH L W AE G AH N
+stillwater S T IH L W AO T ER
+stillwell S T IH L W EH L
+stillwell's S T IH L W EH L Z
+stils S T IH L Z
+stilson S T IH L S AH N
+stilt S T IH L T
+stilted S T IH L T IH D
+stiltner S T IH L T N ER
+stilts S T IH L T S
+stilwell S T IH L W EH L
+stimac S T IH M AH K
+stimmel S T IH M AH L
+stimpert S T IH M P ER T
+stimpson S T IH M P S AH N
+stimpy S T IH M P IY
+stimson S T IH M S AH N
+stimulant S T IH M Y AH L AH N T
+stimulants S T IH M Y AH L AH N T S
+stimulate S T IH M Y AH L EY T
+stimulated S T IH M Y AH L EY T AH D
+stimulated(2) S T IH M Y AH L EY T IH D
+stimulates S T IH M Y AH L EY T S
+stimulating S T IH M Y AH L EY T IH NG
+stimulation S T IH M Y AH L EY SH AH N
+stimulative S T IH M Y AH L EY T IH V
+stimulator S T IH M Y AH L EY T ER
+stimulators S T IH M Y AH L EY T ER Z
+stimuli S T IH M Y AH L AY
+stimulus S T IH M Y AH L AH S
+stinar S T AY N AA R
+stinchcomb S T IH N CH K AH M
+stinchfield S T IH N CH F IY L D
+stine S T AY N
+stinebaugh S T IH N IH B AO
+stinel S T IH N AH L
+stinel's S T IH N AH L Z
+stinel's(2) S T IH N EH L Z
+stinel(2) S T IH N EH L
+stineman S T AY N M AH N
+stiner S T AY N ER
+stines S T AY N Z
+sting S T IH NG
+sting's S T IH NG Z
+stinger S T IH NG ER
+stingers S T IH NG ER Z
+stingier S T IH N JH IY ER
+stinginess S T IH N JH IY N IH S
+stinging S T IH NG IH NG
+stingley S T IH NG G L IY
+stings S T IH NG Z
+stingy S T IH N JH IY
+stink S T IH NG K
+stinkbug S T IH NG K B AH G
+stinkbugs S T IH NG K B AH G Z
+stinkers S T IH NG K ER Z
+stinking S T IH NG K IH NG
+stinks S T IH NG K S
+stinky S T IH NG K IY
+stinnett S T IH N IH T
+stinnette S T IH N EH T
+stinson S T IH N S AH N
+stint S T IH N T
+stints S T IH N T S
+stipanovich S T IH P AE N AH V IH CH
+stipe S T AY P
+stipend S T AY P AH N D
+stipends S T AY P AH N D Z
+stipes S T AY P S
+stipp S T IH P
+stipulate S T IH P Y AH L EY T
+stipulated S T IH P Y AH L EY T IH D
+stipulates S T IH P Y AH L EY T S
+stipulating S T IH P Y AH L EY T IH NG
+stipulation S T IH P Y AH L EY SH AH N
+stipulations S T IH P Y AH L EY SH AH N Z
+stir S T ER
+stires S T AY R Z
+stirewalt S T AO R UW AH L T
+stirling S T ER L IH NG
+stirling's S T ER L IH NG Z
+stirn S T ER N
+stirred S T ER D
+stirring S T ER IH NG
+stirrings S T ER IH NG Z
+stirrup S T ER AH P
+stirrups S T ER AH P S
+stirs S T ER Z
+stitch S T IH CH
+stitched S T IH CH T
+stitches S T IH CH IH Z
+stitching S T IH CH IH NG
+stiteler S T AY T L ER
+stitely S T AY T L IY
+stites S T AY T S
+stith S T IH TH
+stitt S T IH T
+stitz S T IH T S
+stitzel S T IH T Z AH L
+stitzer S T IH T Z ER
+stiver S T AY V ER
+stivers S T AY V ER Z
+stiverson S T IH V ER S AH N
+stivoric S T IH V AO R IH K
+stjohn S EY N T JH AA N
+stobaugh S T AA B AO
+stobbe S T AA B
+stober S T OW B ER
+stobie S T AA B IY
+stochastic S T OW K AE S T IH K
+stock S T AA K
+stock's S T AA K S
+stockard S T AA K ER D
+stockbridge S T AA K B R IH JH
+stockbroker S T AA K B R OW K ER
+stockbroker's S T AA K B R OW K ER Z
+stockbrokerage S T AA K B R OW K ER IH JH
+stockbrokerages S T AA K B R OW K ER IH JH IH Z
+stockbrokers S T AA K B R OW K ER Z
+stockbrokers' S T AA K B R OW K ER Z
+stockbroking S T AA K B R OW K IH NG
+stockburger S T AA K B ER G ER
+stockdale S T AA K D EY L
+stockdale's S T AA K D EY L Z
+stocke S T AA K
+stocked S T AA K T
+stockel S T AA K AH L
+stocker S T AA K ER
+stockert S T AA K ER T
+stockett S T AA K IH T
+stockford S T AA K F ER D
+stockham S T AA K HH AH M
+stockhausen S T AA K HH AW Z AH N
+stockholder S T AA K HH OW L D ER
+stockholders S T AA K HH OW L D ER Z
+stockholders' S T AA K HH OW L D ER Z
+stockholding S T AA K HH OW L D IH NG
+stockholdings S T AA K HH OW L D IH NG Z
+stockholm S T AA K HH OW L M
+stockholm's S T AA K HH OW L M Z
+stocking S T AA K IH NG
+stockinger S T AA K IH NG ER
+stockings S T AA K IH NG Z
+stockley S T AA K L IY
+stockman S T AA K M AH N
+stockman's S T AA K M AE N Z
+stockmarket S T AA K M AA R K IH T
+stockpile S T AA K P AY L
+stockpiled S T AA K P AY L D
+stockpiles S T AA K P AY L Z
+stockpiling S T AA K P AY L IH NG
+stockroom S T AA K R UW M
+stocks S T AA K S
+stocks' S T AA K S
+stocksdale S T AA K S D EY L
+stockslager S T AA K S L EY G ER
+stockstill S T AA K S T IH L
+stockton S T AA K T AH N
+stockwell S T AA K W EH L
+stocky S T AA K IY
+stockyard S T AA K Y AA R D
+stockyards S T AA K Y AA R D Z
+stocum S T OW K AH M
+stoddard S T AA D ER D
+stoddard's S T AA D ER D Z
+stodghill S T AA JH HH IH L
+stodgy S T AA JH IY
+stodola S T OW D OW L AH
+stodolsky S T AH D AO L S K IY
+stoeber S T OW B ER
+stoeckel S T OW K AH L
+stoecker S T OW K ER
+stoeckle S T OW K AH L
+stoecklein S T OW K L AY N
+stoeger S T OW G ER
+stoehr S T AO R
+stoelting S T OW L T IH NG
+stoeltze S T OW L T S
+stoermer S T AO R M ER
+stoessel S T OW S AH L
+stoever S T AA EH V ER
+stofer S T OW F ER
+stoff S T AO F
+stoffel S T AA F AH L
+stoffels S T AA F AH L Z
+stoffer S T AO F ER
+stoffers S T AO F ER Z
+stoffregen S T AA F R IH G AH N
+stofko S T OW F K OW
+stoga S T OW G AH
+stogdill S T AA G D IH L
+stogner S T AA G N ER
+stogsdill S T AA G Z D IH L
+stohl S T OW L
+stohler S T OW L ER
+stohr S T AO R
+stoia S T OW Y AH
+stoiber S T OY B ER
+stoic S T OW IH K
+stoically S T OW IH K L IY
+stoicism S T OW AH S IH Z AH M
+stoics S T OW IH K S
+stoke S T OW K
+stoked S T OW K T
+stokely S T OW K L IY
+stoker S T OW K ER
+stokes S T OW K S
+stoking S T OW K IH NG
+stokke S T AA K
+stokley S T AA K L IY
+stoklosa S T AH K L OW S AH
+stol S T OW L
+stolar S T OW L ER
+stolarski S T AH L AA R S K IY
+stolarz S T OW L AA R Z
+stolberg S T OW L B ER G
+stoldt S T OW L T
+stole S T OW L
+stolen S T OW L AH N
+stoler S T OW L ER
+stolfi S T OW L F IY
+stolichnaya S T OW L IH K N AY AH
+stolid S T AA L AH D
+stoll S T OW L
+stollar S T AA L ER
+stolle S T AA L
+stollen S T AA L AH N
+stoller S T OW L ER
+stolley S T AA L IY
+stollings S T OW L IH NG Z
+stolp S T OW L P
+stolpe S T OW L P
+stolper S T OW L P ER
+stolt S T OW L T
+stolte S T OW L T
+stoltenberg S T OW L T AH N B ER G
+stoltman S T OW L T M AH N
+stoltz S T OW L T S
+stoltzfus S T OW L T S F AH S
+stoltzman S T OW L T S M AH N
+stolz S T OW L Z
+stolze S T OW L Z
+stomach S T AH M AH K
+stomachs S T AH M AH K S
+stomata S T OW M AH T AH
+stombaugh S T AA M B AO
+stomp S T AA M P
+stomped S T AA M P T
+stomping S T AA M P IH NG
+stone S T OW N
+stone's S T OW N Z
+stoneback S T OW N B AE K
+stoneberg S T OW N B ER G
+stoneberger S T OW N B ER G ER
+stonebraker S T AA N IH B R AH K ER
+stonebraker(2) S T OW N B R EY K ER
+stoneburner S T OW N B ER N ER
+stonecipher S T OW N S AY F ER
+stonecutter S T OW N K AH T ER
+stonecutters S T OW N K AH T ER Z
+stonecypher S T AA N IH S IH F ER
+stonecypher(2) S T OW N S AY F ER
+stoned S T OW N D
+stoneham S T OW N AH M
+stonehenge S T OW N HH EH N JH
+stonehill S T OW N HH IH L
+stonehocker S T OW N HH AA K ER
+stonehouse S T OW N HH AW S
+stoneking S T OW N K IH NG
+stoneman S T OW N M AH N
+stoner S T OW N ER
+stoneridge S T OW N R IH JH
+stonerock S T OW N R AA K
+stones S T OW N Z
+stones' S T OW N Z
+stonesifer S T OW N S AY F ER
+stonestreet S T OW N S T R IY T
+stonewall S T OW N W AO L
+stonewalled S T OW N W AO L D
+stonewalling S T OW N W AO L IH NG
+stoneware S T OW N W EH R
+stoney S T OW N IY
+stong S T AO NG
+stonge S T AA N JH
+stoning S T OW N IH NG
+stony S T OW N IY
+stonyfield S T OW N IY F IY L D
+stood S T UH D
+stooge S T UW JH
+stooges S T UW JH IH Z
+stookey S T UW K IY
+stooksbury S T UW K S B EH R IY
+stool S T UW L
+stools S T UW L Z
+stoop S T UW P
+stooped S T UW P T
+stooping S T UW P IH NG
+stoops S T UW P S
+stoots S T UW T S
+stop S T AA P
+stopa S T OW P AH
+stopgap S T AA P G AE P
+stopher S T AA F ER
+stopka S T OW P K AH
+stoplight S T AA P L AY T
+stoplights S T AA P L AY T S
+stopover S T AA P OW V ER
+stopovers S T AA P OW V ER Z
+stoppage S T AA P IH JH
+stoppages S T AA P IH JH IH Z
+stopped S T AA P T
+stoppel S T AA P AH L
+stopper S T AA P ER
+stoppers S T AA P ER Z
+stopping S T AA P IH NG
+stops S T AA P S
+stopwatch S T AA P W AA CH
+stopwatches S T AA P W AA CH IH Z
+stora S T AO R AH
+stora's S T AO R AH Z
+storage S T AO R AH JH
+storage(2) S T AO R IH JH
+storagetek S T AO R AH JH T EH K
+storaska S T AO R AE S AH
+storbeck S T AO R B EH K
+storch S T AO R K
+storck S T AO R K
+stordahl S T AO R D AA L
+store S T AO R
+store's S T AO R Z
+stored S T AO R D
+storefront S T AO R F R AA N T
+storefronts S T AO R F R AA N T S
+storehouse S T AO R HH AW S
+storehouse's S T AO R HH AW S IH Z
+storehouses S T AO R HH AW Z AH Z
+storekeeper S T AO R K IY P ER
+storekeepers S T AO R K IY P ER Z
+storer S T AO R ER
+storer's S T AO R ER Z
+storeroom S T AO R R UW M
+stores S T AO R Z
+stores' S T AO R Z
+storey S T AO R IY
+storfer S T AO R F ER
+storie S T AO R IY
+storied S T AO R IY D
+stories S T AO R IY Z
+storing S T AO R IH NG
+stork S T AO R K
+storlie S T AO R L IY
+storm S T AO R M
+storm's S T AO R M Z
+stormed S T AO R M D
+storment S T AO R M AH N T
+stormer S T AO R M ER
+stormes S T AO R M Z
+stormiest S T AO R M IY IH S T
+storminess S T AO R M IY N IH S
+storming S T AO R M IH NG
+stormont S T AO R M OW N T
+storms S T AO R M Z
+stormy S T AO R M IY
+storr S T AO R
+storrow S T AA R OW
+storrs S T AO R Z
+storti S T AO R T IY
+storting S T AO R T IH NG
+storts S T AO R T S
+stortz S T AO R T S
+story S T AO R IY
+story's S T AO R IY Z
+storyboard S T AO R IY B AO R D
+storybook S T AO R IY B UH K
+storybooks S T AO R IY B UH K S
+storyline S T AO R IY L AY N
+storylines S T AO R IY L AY N Z
+storyteller S T AO R IY T EH L ER
+storytellers S T AO R IY T EH L ER Z
+storytelling S T AO R IY T EH L IH NG
+storz S T AO R Z
+stossel S T AA S AH L
+stossel's S T AA S AH L Z
+stotler S T AA T L ER
+stott S T AA T
+stottlemyer S T AA T AH L M AY ER
+stotts S T AA T S
+stotz S T AA T S
+stoudemire S T UW D AH M AY R
+stoudenmire S T UW D AH N M AY R
+stouder S T AH D ER
+stoudt S T AH D T
+stouffer S T AH F ER
+stouffer(2) S T OW F ER
+stouffs S T AH F S
+stouffs(2) S T OW F S
+stough S T AH F
+stoughton S T OW T AH N
+stoup S T UW P
+stout S T AW T
+stoute S T AW T
+stoutenburg S T AW T AH N B ER G
+stoutly S T AW T L IY
+stoutness S T AW T N AH S
+stovall S T OW V AA L
+stove S T OW V
+stover S T OW V ER
+stoves S T OW V Z
+stow S T OW
+stowe S T OW
+stowed S T OW D
+stowell S T AA W EH L
+stower S T OW ER
+stowers S T OW ER Z
+stoy S T OY
+stoyer S T OY ER
+stpierre S EY N T P Y EH R
+stracener S T R AE S IY N ER
+strachan S T R AE CH AH N
+strack S T R AE K
+stracke S T R AE K
+strada S T R AA D AH
+straddle S T R AE D AH L
+straddled S T R AE D AH L D
+straddles S T R AE D AH L Z
+straddling S T R AE D L IH NG
+strader S T R EY D ER
+stradford S T R AE D F ER D
+stradivarius S T R AE D IH V EH R IY AH S
+stradley S T R AE D L IY
+stradling S T R AE D L IH NG
+strafe S T R EY F
+strafing S T R EY F IH NG
+straggle S T R AE G AH L
+straggled S T R AE G AH L D
+straggler S T R AE G L ER
+stragglers S T R AE G L ER Z
+strahan S T R AE HH AH N
+strahl S T R AA L
+strahle S T R EY HH AH L
+strahler S T R AA L ER
+strahm S T R AA M
+straight S T R EY T
+straightaway S T R EY T AH W EY
+straightedge S T R EY T EH JH
+straighten S T R EY T AH N
+straightened S T R EY T AH N D
+straightening S T R EY T AH N IH NG
+straightening(2) S T R EY T N IH NG
+straightens S T R EY T AH N Z
+straighter S T R EY T ER
+straightforward S T R EY T F AO R W ER D
+straightforwardly S T R EY T F AO R W ER D L IY
+straights S T R EY T S
+strain S T R EY N
+strained S T R EY N D
+straining S T R EY N IH NG
+strains S T R EY N Z
+strait S T R EY T
+straitjacket S T R EY T JH AE K AH T
+straits S T R EY T S
+straka S T R AA K AH
+straker S T R EY K ER
+straley S T R AE L IY
+stram S T R AE M
+stranahan S T R AE N AH HH AE N
+strand S T R AE N D
+strandberg S T R AE N D B ER G
+strande S T R AE N D
+stranded S T R AE N D AH D
+stranded(2) S T R AE N D IH D
+stranding S T R AE N D IH NG
+strandline S T R AE N D L AY N
+strandline(2) S T R AE N L AY N
+strandlines S T R AE N D L AY N Z
+strandlines(2) S T R AE N L AY N Z
+strands S T R AE N D Z
+strang S T R AE NG
+strange S T R EY N JH
+strangelove S T R EY N JH L AH V
+strangely S T R EY N JH L IY
+strangeness S T R EY N JH N AH S
+stranger S T R EY N JH ER
+stranger's S T R EY N JH ER Z
+strangers S T R EY N JH ER Z
+strangest S T R EY N JH IH S T
+strangis S T R AE N JH IH S
+strangle S T R AE NG G AH L
+strangled S T R AE NG G AH L D
+stranglehold S T R AE NG G AH L HH OW L D
+strangler S T R AE NG G L ER
+strangling S T R AE NG G AH L IH NG
+strangling(2) S T R AE NG G L IH NG
+strangulate S T R AE NG G Y AH L EY T
+strangulation S T R AE NG G Y AH L EY SH AH N
+strangulations S T R AE NG G Y AH L EY SH AH N Z
+strangwayes S T R AE NG W EY Z
+strano S T R AA N OW
+stransky S T R AE N S K IY
+strap S T R AE P
+strapped S T R AE P T
+strapping S T R AE P IH NG
+straps S T R AE P S
+strasberg S T R AE S B ER G
+strasbourg S T R AE S B AO R G
+strasburg S T R AE S B ER G
+strasburger S T R AE S B ER G ER
+strassburg S T R AE S B ER G
+strassburger S T R AE S B ER G ER
+strasser S T R AE S ER
+strassman S T R AE S M AH N
+strassner S T R AE S N ER
+straszheim S T R AE S HH AY M
+strata S T R AE T AH
+stratacom S T R AE T AH K AA M
+stratagem S T R AE T AH JH AH M
+stratagems S T R AE T AH JH AH M Z
+stratas S T R AE T AH Z
+strate S T R EY T
+strategem S T R AE T IH JH EH M
+strategic S T R AH T IY JH IH K
+strategical S T R AH T IY JH IH K AH L
+strategically S T R AH T IY JH IH K L IY
+strategies S T R AE T AH JH IY Z
+strategist S T R AE T IH JH IH S T
+strategists S T R AE T IH JH IH S T S
+strategists(2) S T R AE T IH JH IH S S
+strategists(3) S T R AE T IH JH IH S
+strategize S T R AE T AH JH AY Z
+strategizing S T R AE T AH JH AY Z IH NG
+strategy S T R AE T AH JH IY
+strategy's S T R AE T AH JH IY Z
+strater S T R EY T ER
+stratford S T R AE T F ER D
+strathman S T R AE TH M AH N
+stratified S T R AE T AH F AY D
+stratify S T R AE T AH F AY
+stratigraphic S T R AE T AH G R AE F IH K
+stratman S T R AE T M AH N
+stratmann S T R AE T M AH N
+stratocaster S T R AE T OW K AE S T ER
+stratoflex S T R AE T OW F L EH K S
+stratosphere S T R AE T AH S F IH R
+stratospheric S T R AE T AH S F IH R IH K
+stratton S T R AE T AH N
+stratum S T R AE T AH M
+stratus S T R AE T AH S
+stratus's S T R AE T AH S IH Z
+straub S T R AW B
+straube S T R AW B
+strauch S T R AW K
+straughan S T R AO AH N
+straughn S T R AO N
+straughter S T R AO T ER
+straum S T R AW M
+straum(2) S T R AA M
+straus S T R AW S
+strausbaugh S T R AW S B AW
+strause S T R AW S
+strauser S T R AW S ER
+strauss S T R AW S
+strauss's S T R AW S IH Z
+strausser S T R AW S ER
+stravinsky S T R AH V IH N S K IY
+stravinsky's S T R AH V IH N S K IY Z
+straw S T R AO
+strawberries S T R AO B EH R IY Z
+strawberry S T R AO B EH R IY
+strawbridge S T R AO B R IH JH
+strawder S T R AO D ER
+strawderman S T R AO D ER M AH N
+strawn S T R AO N
+straws S T R AO Z
+strawser S T R AO Z ER
+stray S T R EY
+strayed S T R EY D
+strayer S T R EY ER
+strayhorn S T R EY HH ER N
+straying S T R EY IH NG
+strays S T R EY Z
+streak S T R IY K
+streaked S T R IY K T
+streaker S T R IY K ER
+streaking S T R IY K IH NG
+streaks S T R IY K S
+stream S T R IY M
+streamed S T R IY M D
+streamer S T R IY M ER
+streamers S T R IY M ER Z
+streaming S T R IY M IH NG
+streamline S T R IY M L AY N
+streamlined S T R IY M L AY N D
+streamlining S T R IY M L AY N IH NG
+streams S T R IY M Z
+streater S T R IY T ER
+streb S T R EH B
+strebe S T R IY B
+strebeck S T R IY B EH K
+strebel S T R EH B AH L
+streck S T R EH K
+strecker S T R EH K ER
+streed S T R IY D
+streep S T R IY P
+streeper S T R IY P ER
+street S T R IY T
+street's S T R IY T S
+streetcar S T R IY T K AA R
+streeter S T R IY T ER
+streeters S T R IY T ER Z
+streetman S T R IY T M AH N
+streets S T R IY T S
+streett S T R IY T
+streetwise S T R IY T W AY Z
+streety S T R IY T IY
+streff S T R EH F
+strege S T R IY JH
+strehl S T R EH L
+strehle S T R EH L
+strehlow S T R EH L OW
+streib S T R AY B
+streiber S T R AY B ER
+streich S T R AY K
+streicher S T R AY K ER
+streiff S T R AY F
+streight S T R EY T
+streiker S T R AY K ER
+streisand S T R AY Z AH N D
+streisand's S T R AY Z AH N D Z
+streisand's(2) S T R AY S AE N D Z
+streisand(2) S T R AY S AE N D
+streit S T R AY T
+streitmatter S T R AY T M AH T ER
+strelow S T R EH L OW
+streng S T R EH NG
+strenger S T R EH NG G ER
+strength S T R EH NG K TH
+strength(2) S T R EH NG TH
+strengthen S T R EH NG TH AH N
+strengthened S T R EH NG TH AH N D
+strengthening S T R EH NG TH AH N IH NG
+strengthens S T R EH NG TH AH N Z
+strengths S T R EH NG K TH S
+strengths(2) S T R EH NG TH S
+strenio S T R IY N IY OW
+strenuous S T R EH N Y UW AH S
+strenuously S T R EH N Y UW AH S L IY
+strep S T R EH P
+streps S T R EH P S
+streptococcus S T R EH P T AH K AO K AH S
+streptokinase S T R EH P T AH K AY N EY S
+streptokinase(2) S T R EH P T OW K AY N EY Z
+stress S T R EH S
+stressed S T R EH S T
+stresses S T R EH S AH Z
+stresses(2) S T R EH S IH Z
+stressful S T R EH S F AH L
+stressing S T R EH S IH NG
+stressor S T R EH S ER
+stressors S T R EH S ER Z
+stretch S T R EH CH
+stretched S T R EH CH T
+stretcher S T R EH CH ER
+stretcher-bearer S T R EH CH ER B EH R ER
+stretcher-bearers S T R EH CH ER B EH R ER Z
+stretchers S T R EH CH ER Z
+stretches S T R EH CH AH Z
+stretches(2) S T R EH CH IH Z
+stretching S T R EH CH IH NG
+stretto S T R EH T OW
+strevig S T R EH V IH G
+strew S T R UW
+strewn S T R UW N
+strey S T R EY
+striar S T R AY R
+stribling S T ER AH B AH L IH NG
+stribling(2) S T R IH B L IH NG
+strick S T R IH K
+stricken S T R IH K AH N
+stricker S T R IH K ER
+strickland S T R IH K L AH N D
+stricklen S T R IH K AH L AH N
+strickler S T R IH K L ER
+stricklin S T R IH K L IH N
+strickling S T R IH K L IH NG
+strict S T R IH K T
+stricter S T R IH K T ER
+strictest S T R IH K T AH S T
+strictly S T R IH K T L IY
+stricture S T R IH K CH ER
+strictures S T R IH K CH ER Z
+stride S T R AY D
+stridency S T R AY D AH N S IY
+strident S T R AY D AH N T
+stridently S T R AY D AH N T L IY
+strider S T R AY D ER
+strides S T R AY D Z
+striding S T R AY D IH NG
+strieber S T R AY B ER
+striegel S T R IY G AH L
+strieker S T R IY K ER
+strieker's S T R IY K ER Z
+strieter S T R IY T ER
+strife S T R AY F
+strifes S T R AY F S
+strike S T R AY K
+strike's S T R AY K S
+strikebreaker S T R AY K B R EY K ER
+strikebreakers S T R AY K B R EY K ER Z
+strikeout S T R AY K AW T
+strikeouts S T R AY K AW T S
+striker S T R AY K ER
+striker's S T R AY K ER Z
+strikers S T R AY K ER Z
+strikers' S T R AY K ER Z
+strikes S T R AY K S
+strikes' S T R AY K S
+striking S T R AY K IH NG
+strikingly S T R AY K IH NG L IY
+strimple S T R IH M P AH L
+strinden S T R IH N D AH N
+strine S T R AY N
+string S T R IH NG
+stringed S T R IH NG D
+stringency S T R IH N JH AH N S IY
+stringent S T R IH N JH AH N T
+stringently S T R IH N JH AH N T L IY
+stringer S T R IH NG ER
+stringers S T R IH NG ER Z
+stringfellow S T R IH NG F EH L OW
+stringfield S T R IH NG F IY L D
+stringham S T R IH NG HH AE M
+stringing S T R IH NG IH NG
+strings S T R IH NG Z
+stringy S T R IH NG IY
+strip S T R IH P
+strip's S T R IH P S
+stripe S T R AY P
+striped S T R AY P T
+striper S T R AY P ER
+stripers S T R AY P ER Z
+stripes S T R AY P S
+striplin S T R IH P L IH N
+stripling S T R IH P L IH NG
+stripped S T R IH P T
+stripper S T R IH P ER
+strippers S T R IH P ER Z
+stripping S T R IH P IH NG
+strips S T R IH P S
+striptease S T R IH P T IY Z
+strite S T R AY T
+strittmatter S T R IH T M AH T ER
+strive S T R AY V
+striven S T R IH V AH N
+strives S T R AY V Z
+striving S T R AY V IH NG
+strivings S T R AY V IH NG Z
+strnad S T ER N AE D
+strobe S T R OW B
+strobel S T R OW B AH L
+strobel's S T R OW B AH L Z
+strober S T R OW B ER
+strobl S T R AA B AH L
+stroble S T R OW B AH L
+strobridge S T R AA B R IH JH
+strock S T R AA K
+strode S T R OW D
+stroder S T R OW D ER
+stroebel S T R OW B AH L
+stroessner S T R OW S N ER
+stroganoff S T R OW G AH N AO F
+stroh S T R OW
+strohecker S T R OW IH K ER
+strohl S T R OW L
+strohm S T R OW M
+strohmaier S T R OW M AY ER
+strohman S T R OW M AH N
+strohmeier S T R OW M AY ER
+strohmeyer S T R OW M AY ER
+stroik S T R OY K
+strojny S T R OW Y N IY
+stroke S T R OW K
+stroked S T R OW K T
+strokes S T R OW K S
+stroking S T R OW K IH NG
+strole S T R OW L
+stroll S T R OW L
+strolled S T R OW L D
+stroller S T R OW L ER
+strollers S T R OW L ER Z
+strolling S T R OW L IH NG
+strollo S T R AA L OW
+strolls S T R OW L Z
+strom S T R AA M
+stroma S T R OW M AH
+stromain S T R AA M AY N
+stroman S T R OW M AH N
+strombeck S T R AA M B EH K
+stromberg S T R AA M B ER G
+stromboli S T R AA M B OW L IY
+stromboli's S T R AA M B OW L IY Z
+strome S T R OW M
+stromer S T R OW M ER
+stromgren S T R AA M G R EH N
+stromme S T R AA M
+strommen S T R AA M AH N
+stromquist S T R AA M K W IH S T
+stronach S T R AA N AH K
+strong S T R AO NG
+stronger S T R AO NG ER
+stronger(2) S T R AO NG G ER
+strongest S T R AO NG G AH S T
+stronghold S T R AO NG HH OW L D
+strongholds S T R AO NG HH OW L D Z
+strongly S T R AO NG L IY
+strongman S T R AO NG M AE N
+strontium S T R AA N T IY AH M
+stroock S T R UH K
+stroop S T R UW P
+stroope S T R UW P
+stroot S T R UW T
+strope S T R OW P
+stroschein S T R AO SH AY N
+strosnider S T R AA S N AY D ER
+strossen S T R AO S EH N
+strossen(2) S T R AO S IH N
+strother S T R AA DH ER
+strothers S T R AH DH ER Z
+strothman S T R AA TH M AH N
+stroud S T R AW D
+strough S T R AW
+stroup S T R UW P
+stroupe S T R UW P
+strouse S T R AW S
+strout S T R AW T
+strouth S T R AW TH
+strove S T R OW V
+strow S T R OW
+strozier S T R OW Z IY ER
+strub S T R AH B
+strubbe S T R AH B
+strube S T R UW B
+strubel S T R UW B AH L
+struble S T R UW B AH L
+struchen S T R AH K AH N
+struck S T R AH K
+struckman S T R AH K M AH N
+structural S T R AH K CH ER AH L
+structurally S T R AH K CH ER AH L IY
+structure S T R AH K CH ER
+structure's S T R AH K CH ER Z
+structured S T R AH K CH ER D
+structures S T R AH K CH ER Z
+structuring S T R AH K CH ER IH NG
+struebing S T R UH B IH NG
+struggle S T R AH G AH L
+struggle's S T R AH G AH L Z
+struggled S T R AH G AH L D
+struggles S T R AH G AH L Z
+struggling S T R AH G AH L IH NG
+struggling(2) S T R AH G L IH NG
+strum S T R AH M
+strumming S T R AH M IH NG
+strums S T R AH M Z
+strung S T R AH NG
+strunk S T R AH NG K
+strunk's S T R AH NG K S
+strupp S T R AH P
+struss S T R AH S
+strut S T R AH T
+struthers S T R AH DH ER Z
+struts S T R AH T S
+strutting S T R AH T IH NG
+strutton S T R AH T AH N
+strutz S T R AH T S
+struve S T R UW V
+strycharz S T R IH HH ER Z
+strychnine S T R IH K N AY N
+stryker S T R AY K ER
+strzelecki S T R EH Z IH L EH T S K IY
+strzelecki(2) S T ER Z IH L EH T S K IY
+stu S T UW
+stuard S T UW ER D
+stuart S T UW ER T
+stuart's S T UW ER T S
+stuart's(2) S T Y UW ER T S
+stuart's(3) S T AO R T S
+stuart(2) S T Y UW ER T
+stuart(3) S T AO R T
+stuarts S T UW ER T S
+stub S T AH B
+stubbe S T AH B
+stubbed S T AH B D
+stubbins S T AH B IH N Z
+stubble S T AH B AH L
+stubblefield S T AH B AH L F IY L D
+stubborn S T AH B ER N
+stubbornly S T AH B ER N L IY
+stubbornness S T AH B ER N N AH S
+stubbornness(2) S T AH B ER N AH S
+stubbs S T AH B Z
+stubby S T AH B IY
+stuber S T UW B ER
+stubs S T AH B Z
+stucco S T AH K OW
+stuccoed S T AH K OW D
+stuchell S T AH K AH L
+stuck S T AH K
+stucke S T AH K
+stucker S T AH K ER
+stuckert S T AH K ER T
+stuckey S T AH K IY
+stucki S T AH K IY
+stuckman S T AH K M AH N
+stucky S T AH K IY
+stud S T AH D
+studdard S T AH D ER D
+studded S T AH D IH D
+studds S T AH D Z
+stude S T UW D
+studebaker S T UW D AH B EY K ER
+studeman S T UW D M AH N
+studeman(2) S T UW D AH M AH N
+student S T UW D AH N T
+student's S T UW D AH N T S
+students S T UW D AH N T S
+students' S T UW D AH N T S
+studer S T UW D ER
+studied S T AH D IY D
+studies S T AH D IY Z
+studio S T UW D IY OW
+studio's S T UW D IY OW Z
+studios S T UW D IY OW Z
+studios' S T UW D IY OW Z
+studious S T UW D IY AH S
+studiously S T UW D IY AH S L IY
+studley S T AH D L IY
+studnicka S T AH D N IH S K AH
+studs S T AH D Z
+studstill S T AH D S T IH L
+studt S T AH D T
+studtgard S T AH T G AA R D
+study S T AH D IY
+study's S T AH D IY Z
+studying S T AH D IY IH NG
+studzinski S T AH JH IH N S K IY
+stuebe S T UW B
+stueber S T UH B ER
+stueck S T UW K
+stueve S T UW V
+stuewe S T UW
+stuff S T AH F
+stuff's S T AH F S
+stuff-it S T AH F IH T
+stuff-it's S T AH F IH T S
+stuffed S T AH F T
+stuffer S T AH F ER
+stuffing S T AH F IH NG
+stufflebeam S T AH F AH L B IY M
+stufflebean S T AH F AH L B IY N
+stuffs S T AH F S
+stuffy S T AH F IY
+stuhler S T UW L ER
+stuhr S T ER
+stuhr(2) S T UH R
+stuka S T UW K AH
+stukel S T UW K AH L
+stukes S T UW K S
+stukey S T AH K IY
+stull S T AH L
+stuller S T AH L ER
+stultify S T AH L T AH F AY
+stultifying S T AH L T AH F AY IH NG
+stults S T AH L T S
+stultz S T AH L T S
+stum S T AH M
+stumbaugh S T AH M B AO
+stumble S T AH M B AH L
+stumbled S T AH M B AH L D
+stumbles S T AH M B AH L Z
+stumbling S T AH M B AH L IH NG
+stumbling(2) S T AH M B L IH NG
+stumbo S T AH M B OW
+stumm S T AH M
+stump S T AH M P
+stumpage S T AH M P IH JH
+stumpe S T AH M P
+stumped S T AH M P T
+stumper S T AH M P ER
+stumpf S T AH M P F
+stumpff S T AH M P F
+stumph S T AH M F
+stumping S T AH M P IH NG
+stumpo S T AH M P OW
+stumpp S T AH M P
+stumps S T AH M P S
+stun S T AH N
+stung S T AH NG
+stunk S T AH NG K
+stunned S T AH N D
+stunner S T AH N ER
+stunning S T AH N IH NG
+stunningly S T AH N IH NG L IY
+stuns S T AH N Z
+stunt S T AH N T
+stunted S T AH N T IH D
+stunts S T AH N T S
+stuntz S T AH N T S
+stupa S T UW P AH
+stupak S T UW P AH K
+stupar S T UW P ER
+stupay S T UW P EY
+stupendous S T UW P EH N D AH S
+stupid S T UW P AH D
+stupid(2) S T UW P IH D
+stupidest S T UW P IH D AH S T
+stupidity S T UW P IH D IH T IY
+stupidly S T UW P AH D L IY
+stupka S T AH P K AH
+stupor S T UW P ER
+stupp S T AH P
+stupski S T AH P S K IY
+sturbridge S T ER B R IH JH
+sturc S T ER K
+sturdevant S T ER D IH V AH N T
+sturdhal S T ER D AA L
+sturdier S T ER D IY ER
+sturdiness S T ER D IY N AH S
+sturdivant S T ER D IH V AH N T
+sturdy S T ER D IY
+sturgell S T ER G AH L
+sturgeon S T ER JH AH N
+sturgeon(2) S T ER JH IH N
+sturgeons S T ER JH AH N Z
+sturges S T ER JH IH Z
+sturgess S T ER G IH S
+sturgill S T ER G AH L
+sturgis S T ER JH IH S
+sturkie S T ER K IY
+sturm S T ER M
+sturman S T ER M AH N
+sturmans S T ER M AH N Z
+sturmer S T ER M ER
+sturn S T ER N
+sturrock S T AO R AH K
+sturtevant S T ER T AH V AH N T
+sturtz S T ER T S
+sturza S T ER Z AH
+stutes S T UW T S
+stutesman S T UW T S M AH N
+stuteville S T UW T V IH L
+stutheit S T AH TH AY T
+stutler S T AH T L ER
+stutner S T AH T N ER
+stutsman S T AH T S M AH N
+stutter S T AH T ER
+stuttering S T AH T ER IH NG
+stutters S T AH T ER Z
+stuttgart S T AH T G ER T
+stuttgart(2) S T UW T G AA R T
+stuttgart(3) SH T UW T G AA R T
+stutts S T AH T S
+stutz S T AH T S
+stutzman S T AH T S M AH N
+stuve S T UW V
+stuver S T UW V ER
+stuyvesant S T AY V AH S AH N T
+sty S T AY
+styer S T AY ER
+styers S T AY ER Z
+stygian S T IH JH IY AH N
+style S T AY L
+styled S T AY L D
+styles S T AY L Z
+styling S T AY L IH NG
+stylish S T AY L IH SH
+stylishly S T AY L IH SH L IY
+stylist S T AY L IH S T
+stylistic S T AY L IH S T IH K
+stylistically S T AY L IH S T IH K L IY
+stylists S T AY L IH S T S
+stylists(2) S T AY L IH S S
+stylists(3) S T AY L IH S
+stylites S T IH L AY T S
+stylize S T AY L AY Z
+stylize(2) S T AY AH L AY Z
+stylized S T AY L AY Z D
+stylus S T AY L AH S
+stymie S T AY M IY
+stymied S T AY M IY D
+stymies S T AY M IY Z
+styne S T AY N
+styrene S T AY R IY N
+styrofoam S T AY R AH F OW M
+styron S T AY R AO N
+stys S T IH S
+styx S T IH K S
+st_charles S EY N T CH AA R AH L Z
+st_clair S EY N T K L EH R
+st_claire S EY N T K L EH R
+st_cyr S EY N T K IH R
+st_cyr(2) S EY N T S IH R
+st_denis S EY N T D EH N IH S
+st_dennis S EY N T D EH N IH S
+st_george S EY N T JH AO R JH
+st_germain S EY N T JH ER M EY N
+st_germaine S EY N T JH ER M EY N
+st_germaine(2) S AA N ZH ER M EY N
+st_hilaire S EY N T HH IH L EY R
+st_jacques S EY N T JH AA K S
+st_jacques(2) S AA N ZH AA K S
+st_james S EY N T JH EY M Z
+st_jean S EY N T JH IY N
+st_john S EY N T JH AA N
+st_julien S EY N T JH UW L IY AH N
+st_laurent S EY N T L AO R AH N T
+st_laurent(2) S AA N L AO R AO N T
+st_lawrence S EY N T L AO R AH N S
+st_louis S EY N T L UW AH S
+st_louis(2) S EY N T L UW IY
+st_lucia S EY N T L UW SH AH
+st_lucia(2) S EY N T L UW S IY AH
+st_marie S EY N T M ER IY
+st_martin S EY N T M AA R T IH N
+st_mary S EY N T M EH R IY
+st_peter S EY N T P IY T ER
+st_petersburg S EY N T P IY T ER Z B ER G
+st_pierre S EY N T P Y EH R
+st_thomas S EY N T T AA M AH S
+st_thomas(2) S EY N T AA M AH S
+su S UW
+su(2) EH S Y UW
+suard S UW AA R D
+suard(2) S W AA R D
+suarez S W AA R EH Z
+suasion S W EY ZH AH N
+suata S UW AA T AH
+suata's S UW AA T AH Z
+suave S W AA V
+suazo S W AA Z OW
+sub S AH B
+sub's S AH B Z
+sub-way S AH B W EY
+suba S UW B AH
+subacute S AH B AH K Y UW T
+subandrio S AH B AE N D R IY OW
+subaru S UW B ER UW
+subassemblies S AH B AH S EH M B L IY Z
+subassembly S AH B AH S EH M B L IY
+subatomic S AH B AH T AA M IH K
+subbed S AH B D
+subbing S AH B IH NG
+subchapter S AH B CH AE P T ER
+subcommander S AH B K AH M AE N D ER
+subcommander's S AH B K AH M AE N D ER Z
+subcommanders S AH B K AH M AE N D ER Z
+subcommittee S AH B K AH M IH T IY
+subcommittee's S AH B K AH M IH T IY Z
+subcommittees S AH B K AH M IH T IY Z
+subcompact S AH B K AA M P AE K T
+subcompacts S AH B K AA M P AE K T S
+subconscious S AH B K AA N SH AH S
+subconsciously S AH B K AA N SH AH S L IY
+subcontinent S AH B K AA N T IH N AH N T
+subcontinents S AH B K AA N T IH N AH N T S
+subcontract S AH B K AA N T R AE K T
+subcontracted S AH B K AA N T R AE K T IH D
+subcontracting S AH B K AH N T R AE K T IH NG
+subcontractor S AH B K AA N T R AE K T ER
+subcontractors S AH B K AA N T R AE K T ER Z
+subcontracts S AH B K AA N T R AE K T S
+subculture S AH B K AH L CH ER
+subcultures S AH B K AH L CH ER Z
+subdivide S AH B D AH V AY D
+subdivided S AH B D IH V AY D IH D
+subdivision S AH B D IH V IH ZH AH N
+subdivisions S AH B D IH V IH ZH AH N Z
+subdue S AH B D UW
+subdued S AH B D UW D
+subduing S AH B D UW IH NG
+suber S UW B ER
+subfamilies S AH B F AE M AH L IY Z
+subfamily S AH B F AE M AH L IY
+subgroup S AH B G R UW P
+subgroups S AH B G R UW P S
+subhlok S AH B L AA K
+subhuman S AH B HH Y UW M AH N
+subia S UW B IY AH
+subic S UW B IH K
+subject S AH B JH EH K T
+subject's S AH B JH IH K T S
+subject(2) S AH B JH IH K T
+subjected S AH B JH EH K T IH D
+subjecting S AH B JH EH K T IH NG
+subjective S AH B JH EH K T IH V
+subjectivity S AH B JH EH K T IH V IH T IY
+subjects S AH B JH IH K T S
+subjects' S AH B JH EH K T S
+subjects'(2) S AH B JH EH K S
+subjects(2) S AH B JH EH K T S
+subjects(3) S AH B JH EH K S
+subjugate S AH B JH AH G EY T
+subjugated S AH B JH AH G EY T IH D
+subkingdom S AH B K IH NG D AH M
+sublease S AH B L IY S
+subleasing S AH B L IY S IH NG
+sublet S AH B L EH T
+sublett S UW B L IH T
+sublime S AH B L AY M
+subliminal S AH B L IH M IH N AH L
+subliminally S AH B L IH M IH N AH L IY
+subluxation S AH B L AH K S EY SH AH N
+subluxations S AH B L AH K S EY SH AH N Z
+submachine S AH B M AH SH IY N
+submarine S AH B M ER IY N
+submarine's S AH B M ER IY N Z
+submarines S AH B M ER IY N Z
+submarines's S AH B M ER IY N Z IH Z
+submerge S AH B M ER JH
+submerged S AH B M ER JH D
+submergence S AH B M ER JH AH N S
+submerse S AH B M ER S
+submersed S AH B M ER S T
+submersible S AH B M ER S IH B AH L
+submersion S AH B M ER ZH AH N
+subminimum S AH B M IH N IH M AH M
+submission S AH B M IH SH AH N
+submissions S AH B M IH SH AH N Z
+submissive S AH B M IH S IH V
+submit S AH B M IH T
+submits S AH B M IH T S
+submitted S AH B M IH T AH D
+submitting S AH B M IH T IH NG
+subnotebook S AH B N OW T B UH K
+subordinate S AH B AO R D AH N EY T
+subordinate(2) S AH B AO R D AH N AH T
+subordinated S AH B AO R D AH N EY T IH D
+subordinates S AH B AO R D AH N EY T S
+subordinates(2) S AH B AO R D AH N AH T S
+subordinating S AH B AO R D AH N EY T IH NG
+subordination S AH B AO R D AH N EY SH AH N
+subotnick S AH B AA T N IH K
+subpar S AH B P AA R
+subplot S AH B P L AA T
+subplots S AH B P L AA T S
+subpoena S AH P IY N AH
+subpoenaed S AH P IY N AH D
+subpoenaing S AH P IY N AH IH NG
+subpoenas S AH P IY N AH Z
+subprincipal S AH B P R IH N S AH P AH L
+subprincipals S AH B P R IH N S AH P AH L Z
+subramanian S UW B R AH M AA N IY AH N
+subroto S UW B R OW T OW
+subs S AH B Z
+subs's S AH B Z IH Z
+subsaharan S AH B S AH HH EH R AH N
+subscribe S AH B S K R AY B
+subscribed S AH B S K R AY B D
+subscriber S AH B S K R AY B ER
+subscriber's S AH B S K R AY B ER Z
+subscribers S AH B S K R AY B ER Z
+subscribers' S AH B S K R AY B ER Z
+subscribes S AH B S K R AY B Z
+subscribing S AH B S K R AY B IH NG
+subscription S AH B S K R IH P SH AH N
+subscriptions S AH B S K R IH P SH AH N Z
+subsection S AH B S EH K SH AH N
+subsequent S AH B S AH K W AH N T
+subsequently S AH B S AH K W AH N T L IY
+subservience S AH B S ER V IY AH N S
+subservient S AH B S ER V IY AH N T
+subset S AH B S EH T
+subside S AH B S AY D
+subsided S AH B S AY D IH D
+subsidence S AH B S AY D AH N S
+subsides S AH B S AY D Z
+subsidiaries S AH B S IH D IY EH R IY Z
+subsidiaries' S AH B S IH D IY EH R IY Z
+subsidiary S AH B S IH D IY EH R IY
+subsidiary's S AH B S IH D IY EH R IY Z
+subsidies S AH B S AH D IY Z
+subsidies(2) S AH B S IH D IY Z
+subsiding S AH B S AY D IH NG
+subsidization S AH B S IH D IH Z EY SH AH N
+subsidize S AH B S IH D AY Z
+subsidized S AH B S IH D AY Z D
+subsidizes S AH B S IH D AY Z IH Z
+subsidizing S AH B S IH D AY Z IH NG
+subsidy S AH B S IH D IY
+subsist S AH B S IH S T
+subsistence S AH B S IH S T AH N S
+subsoil S AH B S OY L
+substance S AH B S T AH N S
+substances S AH B S T AH N S AH Z
+substances(2) S AH B S T AH N S IH Z
+substandard S AH B S T AE N D ER D
+substantial S AH B S T AE N CH AH L
+substantial(2) S AH B S T AE N SH AH L
+substantially S AH B S T AE N SH AH L IY
+substantially(2) S AH B S T AE N CH AH L IY
+substantiate S AH B S T AE N CH IY EY T
+substantiate(2) S AH B S T AE N SH IY EY T
+substantiated S AH B S T AE N SH IY EY T IH D
+substantiated(2) S AH B S T AE N CH IY EY T IH D
+substantiates S AH B S T AE N CH IY EY T S
+substantiates(2) S AH B S T AE N SH IY EY T S
+substantiation S AH B S T AE N CH IY EY SH AH N
+substantiation(2) S AH B S T AE N SH IY EY SH AH N
+substantive S AH B S T AH N T IH V
+substantively S AH B S T AH N T IH V L IY
+substation S AH B S T EY SH AH N
+substitute S AH B S T AH T UW T
+substituted S AH B S T AH T UW T AH D
+substitutes S AH B S T AH T UW T S
+substituting S AH B S T IH T UW T IH NG
+substitution S AH B S T IH T UW SH AH N
+substitutions S AH B S T IH T Y UW SH AH N Z
+substrate S AH B S T R EY T
+substrates S AH B S T R EY T S
+subsurface S AH B S ER F AH S
+subsystem S AH B S IH S T AH M
+subsystems S AH B S IH S T AH M Z
+subterfuge S AH B T ER F Y UW JH
+subterranean S AH B T ER EY N IY AH N
+subtext S AH B T EH K S T
+subtitle S AH B T AY T AH L
+subtitled S AH B T AY T AH L D
+subtitles S AH B T AY T AH L Z
+subtle S AH T AH L
+subtler S AH T AH L ER
+subtler(2) S AH T L ER
+subtleties S AH T AH L T IY Z
+subtlety S AH T AH L T IY
+subtly S AH T AH L IY
+subtract S AH B T R AE K T
+subtracted S AH B T R AE K T IH D
+subtracting S AH B T R AE K T IH NG
+subtraction S AH B T R AE K SH AH N
+subtype S AH B T AY P
+subtyping S AH B T AY P IH NG
+suburb S AH B ER B
+suburb's S AH B ER B Z
+suburban S AH B ER B AH N
+suburbanite S AH B ER B AH N AY T
+suburbanites S AH B ER B AH N AY T S
+suburbanization S AH B ER B AH N IH Z EY SH AH N
+suburbanize S AH B ER B AH N AY Z
+suburbans S AH B ER B AH N Z
+suburbia S AH B ER B IY AH
+suburbs S AH B ER B Z
+subversion S AH B V ER ZH AH N
+subversive S AH B V ER S IH V
+subversives S AH B V ER S IH V Z
+subvert S AH B V ER T
+subverted S AH B V ER T IH D
+subverting S AH B V ER T IH NG
+subverts S AH B V ER T S
+subvolcanic S AH B V AA L K AE N IH K
+subway S AH B W EY
+subways S AH B W EY Z
+subzero S AH B Z IH R OW
+subzero(2) S AH B Z IY R OW
+suc S AH K
+succeed S AH K S IY D
+succeeded S AH K S IY D AH D
+succeeded(2) S AH K S IY D IH D
+succeeding S AH K S IY D IH NG
+succeeds S AH K S IY D Z
+success S AH K S EH S
+successes S AH K S EH S AH Z
+successes(2) S AH K S EH S IH Z
+successful S AH K S EH S F AH L
+successfully S AH K S EH S F AH L IY
+succession S AH K S EH SH AH N
+successive S AH K S EH S IH V
+successively S AH K S EH S IH V L IY
+successor S AH K S EH S ER
+successors S AH K S EH S ER Z
+succinct S AH K S IH NG K T
+succinctly S AH K S IH NG K T L IY
+succor S AH K ER
+succulent S AH K Y AH L IH N T
+succulents S AH K Y AH L AH N T S
+succumb S AH K AH M
+succumbed S AH K AH M D
+succumbing S AH K AH M IH NG
+succumbs S AH K AH M Z
+such S AH CH
+suchan S AH CH AH N
+suchanek S AH K AH N IH K
+suchard S UW SH AA R D
+sucharski S AH K AA R S K IY
+suchecki S AH K EH K IY
+sucher S AH CH ER
+suchinda S UW CH IH N D AH
+suchocki S AH K AA K IY
+suchomel S AH K OW M EH L
+suchy S AH CH IY
+suck S AH K
+sucked S AH K T
+sucker S AH K ER
+suckered S AH K ER D
+suckers S AH K ER Z
+sucking S AH K IH NG
+suckle S AH K AH L
+suckling S AH K L IH NG
+suckow S AH K AW
+suckrow S AH K R OW
+sucks S AH K S
+sucralose S UW K R AH L OW S
+sucre S UW K ER
+sucrose S UW K R OW S
+suction S AH K SH AH N
+suda S UW D AH
+sudafed S UW D AH F EH D
+sudan S UW D AE N
+sudan's S UW D AE N Z
+sudanese S UW D AH N IY Z
+sudano S UW D AA N OW
+sudbeck S AH D B EH K
+sudberry S AH D B EH R IY
+sudbury S AH D B EH R IY
+sudbury's S AH D B EH R IY Z
+sudd S AH D
+suddam S AH D AA M
+suddam's S AH D AA M Z
+suddarth S AH D AA R TH
+suddath S AH D AH TH
+sudden S AH D AH N
+suddenly S AH D AH N L IY
+suddenness S AH D AH N N AH S
+sudderth S AH D ER TH
+suddeth S AH D IH TH
+suddreth S AH D R IH TH
+sudduth S AH D AH TH
+suder S UW D ER
+suderman S UW D ER M AH N
+sudler S UW D AH L ER
+sudler(2) S UW D L ER
+sudol S UW D AH L
+suds S AH D Z
+sue S UW
+sued S UW D
+suede S W EY D
+suedes S W EY D Z
+sueker S UW K ER
+suen S UW N
+sues S UW Z
+suess S W IH S
+suey S UW IY
+suez S UW EH Z
+suez's S UW EH Z IH Z
+suffer S AH F ER
+suffered S AH F ER D
+sufferer S AH F ER ER
+sufferers S AH F ER ER Z
+suffering S AH F ER IH NG
+suffering(2) S AH F R IH NG
+sufferings S AH F ER IH NG Z
+sufferings(2) S AH F R IH NG Z
+suffern S AH F ER N
+suffers S AH F ER Z
+suffice S AH F AY S
+sufficed S AH F AY S T
+suffices S AH F AY S IH Z
+sufficiency S AH F IH SH AH N S IY
+sufficient S AH F IH SH AH N T
+sufficiently S AH F IH SH AH N T L IY
+suffield S AH F IY L D
+suffield's S AH F IY L D Z
+suffix S AH F IH K S
+suffocate S AH F AH K EY T
+suffocated S AH F AH K EY T IH D
+suffocating S AH F AH K EY T IH NG
+suffocation S AH F AH K EY SH AH N
+suffolk S AH F AH K
+suffrage S AH F R IH JH
+suffragette S AH F R AH JH EH T
+suffragettes S AH F R AH JH EH T S
+suffragist S AH F R AH JH IH S T
+suffragists S AH F R AH JH IH S T S
+suffragists(2) S AH F R AH JH IH S S
+suffragists(3) S AH F R AH JH IH S
+suffuse S AH F Y UW Z
+suffused S AH F Y UW Z D
+suffuses S AH F Y UW Z IH Z
+suffusing S AH F Y UW Z IH NG
+sugar SH UH G ER
+sugar's SH UH G ER Z
+sugarcane SH UH G ER K EY N
+sugared SH UH G ER D
+sugarman SH UH G ER M AH N
+sugars SH UH G ER Z
+sugary SH UH G ER IY
+sugden S AH G D AH N
+sugerman S UW G ER M AH N
+sugg S AH G
+suggest S AH G JH EH S T
+suggested S AH G JH EH S T AH D
+suggested(2) S AH G JH EH S T IH D
+suggestible S AH G JH EH S T AH B AH L
+suggesting S AH G JH EH S T IH NG
+suggestion S AH G JH EH S CH AH N
+suggestions S AH G JH EH S CH AH N Z
+suggestive S AH G JH EH S T IH V
+suggestiveness S AH G JH EH S T IH V N AH S
+suggests S AH G JH EH S T S
+suggests(2) S AH G JH EH S S
+suggests(3) S AH G JH EH S
+suggs S AH G Z
+sugihara S UW G IY HH AA R AH
+sugimoto S UW G IY M OW T OW
+sugiyama S UW G IY Y AA M AH
+sugrue S AH G R UW
+suh S AH
+suharto S UW HH AA R T OW
+suharto's S UW HH AA R T OW Z
+suhler S UW L ER
+suhm S UW M
+suhr S UH R
+suhre S UH R
+suhua S UW HH W AA
+suhud S UW HH UH D
+sui S UW IY
+sui(2) S W IY
+suicidal S UW AH S AY D AH L
+suicide S UW AH S AY D
+suicide(2) S UW IH S AY D
+suicides S UW AH S AY D Z
+suing S UW IH NG
+suire S UH R
+suisse S W IH S
+suisse's S W IH S IH Z
+suisse's(2) S W IY S IH Z
+suisse(2) S W IY S
+suit S UW T
+suit's S UW T S
+suitability S UW T AH B IH L IH T IY
+suitable S UW T AH B AH L
+suitably S UW T AH B L IY
+suitcase S UW T K EY S
+suitcases S UW T K EY S IH Z
+suite S W IY T
+suited S UW T AH D
+suited(2) S UW T IH D
+suiter S UW T ER
+suites S W IY T S
+suiting S UW T IH NG
+suitor S UW T ER
+suitor's S UW T ER Z
+suitors S UW T ER Z
+suits S UW T S
+suitt S UW T
+suk S AH K
+sukarno S UW K AA R N OW
+sukarno's S UW K AA R N OW Z
+sukey S UW K IY
+sukharev S AH K HH ER AH V
+sukhumi S UW K HH UW M IY
+suki S UW K IY
+sukiyaki S UW K IY AA K IY
+sukru S UH K R UW
+sukru(2) S UW K R UW
+sukthankar S UW K T AA NG K AA R
+sukup S UW K AH P
+sul S AH L
+sulak S UW L AH K
+sulawesi S UW L AH W EH S IY
+sulcer S AH L S ER
+sulek S UW L IH K
+suleski S Y UW L EH S K IY
+sulewski S Y UW L EH F S K IY
+suleyman S UW L IY M AH N
+sulfa S AH L F AH
+sulfate S AH L F EY T
+sulfide S AH L F AY D
+sulfite S AH L F AY T
+sulfites S AH L F AY T S
+sulfur S AH L F ER
+sulfuric S AH L F Y UH R IH K
+sulfurophane S AH L F ER AH F EY N
+sulgrave S AH L G R EY V
+sulik S UW L IH K
+sulk S AH L K
+sulked S AH L K T
+sulking S AH L K IH NG
+sulkowski S AH L K AO F S K IY
+sullen S AH L AH N
+sullenberger S AH L AH N B ER G ER
+sullenger S UW L IH N JH ER
+sullens S AH L AH N Z
+sullie S AH L IY
+sullied S AH L IY D
+sullinger S AH L IH NG ER
+sullins S AH L IH N Z
+sullivan S AH L AH V AH N
+sullivan's S AH L IH V AH N Z
+sullivan(2) S AH L IH V AH N
+sullivans S AH L IH V AH N Z
+sullivant S AH L IH V AH N T
+sullo S UW L OW
+sully S AH L IY
+sulpetro S UW L P EH T R OW
+sulphate S AH L F EY T
+sulphates S AH L F EY T S
+sulphur S AH L F ER
+sulser S AH L S ER
+sult S AH L T
+sultan S AH L T AH N
+sultan's S AH L T AH N Z
+sultanate S AH L T AH N AH T
+sultans S AH L T AH N Z
+sulton S AH L T AH N
+sultry S AH L T R IY
+sulya S UW L Y AH
+sulzbach S AH L Z B AA K
+sulzberger S AH L T S B ER G ER
+sulzer S AH L Z ER
+sum S AH M
+suma S UW M AH
+sumac S UW M AE K
+suman S UW M AH N
+sumarlin S UW M AA R L IH N
+sumatoma S UW M AH T OW M AH
+sumatomo S UW M AH T OW M OW
+sumatra S UW M AA T R AH
+sumatran S UW M AA T R AH N
+sumeria S AH M ER IY AH
+sumerlin S AH M ER L IH N
+sumgait S AH M G EY T
+sumida S UW M IY D AH
+suminski S AH M IH N S K IY
+sumita S UW M IY T AH
+sumita's S UW M IY T AH Z
+sumitomo S UW M IH T OW M OW
+sumitomo's S UW M IH T OW M OW Z
+sumler S AH M L ER
+sumlin S AH M L IH N
+summa S UW M AH
+summagraphic S AH M AH G R AE F IH K
+summagraphics S AH M AH G R AE F IH K S
+summar S AH M ER
+summaries S AH M ER IY Z
+summarily S AH M EH R IH L IY
+summarize S AH M ER AY Z
+summarized S AH M ER AY Z D
+summarizes S AH M ER AY Z IH Z
+summarizing S AH M ER AY Z IH NG
+summary S AH M ER IY
+summation S AH M EY SH AH N
+summations S AH M EY SH AH N Z
+summcorp S AH M K AO R P
+summed S AH M D
+summer S AH M ER
+summer's S AH M ER Z
+summerall S AH M ER AO L
+summerfield S AH M ER F IY L D
+summerford S AH M ER F ER D
+summerhill S AH M ER HH IH L
+summerlin S AH M ER L IH N
+summerour S AH M ER ER
+summers S AH M ER Z
+summers's S AH M ER Z IH Z
+summerson S AH M ER S AH N
+summertime S AH M ER T AY M
+summerville S AH M ER V IH L
+summey S AH M IY
+summing S AH M IH NG
+summit S AH M AH T
+summit's S AH M AH T S
+summit(2) S AH M IH T
+summiteer S AH M IH T IH R
+summiteers S AH M IH T IH R Z
+summitry S AH M IH T R IY
+summits S AH M IH T S
+summitt S AH M IH T
+summitville S AH M IH T V IH L
+summon S AH M AH N
+summoned S AH M AH N D
+summoning S AH M AH N IH NG
+summons S AH M AH N Z
+summonsed S AH M AH N Z D
+summonses S AH M AH N Z IH Z
+summor's S AH M ER Z
+summum S AH M AH M
+summy S AH M IY
+sumner S AH M N ER
+sumners S AH M N ER Z
+sumo S UW M OW
+sump S AH M P
+sumpter S AH M P T ER
+sumptuous S AH M P CH W AH S
+sumptuous(2) S AH M P CH UW AH S
+sumrall S AH M R AH L
+sumrell S UW M R EY L
+sumrow S AH M R OW
+sums S AH M Z
+sumter S AH M T ER
+sun S AH N
+sun's S AH N Z
+sunamerica S AH N AH M EH R AH K AH
+sunau S UW N AW
+sunbath S AH N B AE TH
+sunbathe S AH N B EY DH
+sunbathing S AH N B EY DH IH NG
+sunbeam S AH N B IY M
+sunbeam's S AH N B IY M Z
+sunbelt S AH N B EH L T
+sunbelt's S AH N B EH L T S
+sunbird S AH N B ER D
+sunbirds S AH N B ER D Z
+sunburn S AH N B ER N
+sunburned S AH N B ER N D
+suncoast S AH N K OW S T
+suncook S AH N K UH K
+suncor S AH N K AO R
+sund S AH N D
+sundae S AH N D EY
+sundae's S AH N D EY Z
+sundahl S AH N D AA L
+sundai S AH N D AY
+sundance S AH N D AE N S
+sundar S UW N D AA R
+sundararajan S UW N D AA R AH R AA JH AH N
+sunday S AH N D EY
+sunday's S AH N D EY Z
+sunday's(2) S AH N D IY Z
+sunday(2) S AH N D IY
+sundays S AH N D EY Z
+sundays(2) S AH N D IY Z
+sundberg S AH N D B ER G
+sundby S AH N D B IY
+sunde S AH N D
+sundeen S AH N D IY N
+sundell S AH N D AH L
+sunder S AH N D ER
+sunderland S AH N D ER L AH N D
+sunderlin S AH N D ER L IH N
+sunderman S AH N D ER M AH N
+sundermeyer S AH N D ER M AY ER
+sundews S AH N D UW Z
+sundheim S AH N D HH AY M
+sundial S AH N D AY L
+sundin S AH N D AH N
+sundlun S AH N D L AH N
+sundown S AH N D AW N
+sundquist S AH N D K W IH S T
+sundry S AH N D R IY
+sundstrand S AH N D S T R AE N D
+sundstrom S AH N D S T R AH M
+sundt S AH N T
+sundy S AH N D IY
+sunfire S AH N F AY R
+sunfish S AH N F IH SH
+sunflower S AH N F L AW ER
+sunflowers S AH N F L AW ER Z
+sung S AH NG
+sung's S AH NG Z
+sungard S AH N G AA R D
+sungard's S AH N G AA R D Z
+sunglass S AH N G L AE S
+sunglasses S AH N G L AE S IH Z
+sungroup S AH N G R UW P
+suni S UW N IY
+sunia S UW N IY AH
+suniga S UW N IY G AH
+sunil S UW N IH L
+sunk S AH NG K
+sunken S AH NG K AH N
+sunkist S AH N K IH S T
+sunland S AH N L AE N D
+sunlight S AH N L AY T
+sunlit S AH N L IH T
+sunlite S AH N L AY T
+sunni S UW N IY
+sunning S AH N IH NG
+sunnis S UH N IY Z
+sunny S AH N IY
+sunnyside S AH N IY S AY D
+sunnyvale S AH N IY V EY L
+sunobe S UW N OW B IY
+sunobe's S UW N OW B IY Z
+sunoco S IH N OW K OW
+sunpoint S AH N P OY N T
+sunrise S AH N R AY Z
+sunrise's S AH N R AY Z IH Z
+sunroof S AH N R UW F
+sunroom S AH N R UW M
+suns S AH N Z
+sunscreen S AH N S K R IY N
+sunscreens S AH N S K R IY N Z
+sunseri S AH N S EH R IY
+sunset S AH N S EH T
+sunsets S AH N S EH T S
+sunshine S AH N SH AY N
+sunshine's S AH N SH AY N Z
+sunshiny S AH N SH AY N IY
+sunspot S AH N S P AA T
+sunspots S AH N S P AA T S
+sunstar S AH N S T AA R
+sunstate S AH N S T EY T
+sunstates S AH N S T EY T S
+sunsweet S AH N S W IY T
+sunsweet's S AH N S W IY T S
+suntan S AH N T AE N
+sunter S AH N T ER
+suntory S AH N T AO R IY
+suntrust S AH N T R AH S T
+suntrust's S AH N T R AH S T S
+sununu S AH N UW N UW
+sununu's S AH N UW N UW Z
+sunup S AH N AH P
+sunward S AH N W ER D
+sunworld S AH N W ER L D
+sunworld's S AH N W ER L D Z
+suny S UW N IY
+suon S UW AO N
+sup S AH P
+supak S UW P AH K
+supan S UW P AH N
+super S UW P ER
+superabrasive S UW P ER AH B R EY S IH V
+superabrasives S UW P ER AH B R EY S IH V Z
+superamerica S UW P ER AH M EH R IH K AH
+superb S UH P ER B
+superbar S UW P ER B AA R
+superbly S UW P ER B L IY
+superbowl S UW P ER B OW L
+superbowl's S UW P ER B OW L Z
+superbowls S UW P ER B OW L Z
+supercalifragilistic S UW P ER K AE L AH F R AE JH AH L IH S T IH K
+supercalifragilisticexpealidoshus S UW P ER K AE L AH F R AE JH AH L IH S T IH K EH K S P IY AE L AH D OW SH AH S
+supercenter S UW P ER S EH N T ER
+supercenters S UW P ER S EH N T ER S
+supercharge S UW P ER CH AA R JH
+supercharged S UW P ER CH AA R JH D
+supercilious S UW P ER S IH L IY AH S
+supercollider S UW P ER K AH L AY D ER
+supercomputer S UW P ER K AH M P Y UW T ER
+supercomputers S UW P ER K AH M P Y UW T ER Z
+supercomputing S UW P ER K AH M P Y UW T IH NG
+superconducting S UW P ER K AH N D AH K T IH NG
+superconductive S UW P ER K AH N D AH K T IH V
+superconductivity S UW P ER K AA N D AH K T IH V AH T IY
+superconductor S UW P ER K AH N D AH K T ER
+superconductors S UW P ER K AH N D AH K T ER Z
+supercool S UW P ER K UW L
+supercooled S UW P ER K UW L D
+supercut S UW P ER K AH T
+supercuts S UW P ER K AH T S
+superdelegate S UW P ER D EH L AH G AH T
+superdelegates S UW P ER D EH L AH G AH T S
+superdome S UW P ER D OW M
+superdot S UW P ER D AA T
+superdrug S UW P ER D R AH G
+superfamily S UW P ER F AE M L IY
+superfan S UW P ER F AE N
+superfast S UW P ER F AE S T
+superficial S UW P ER F IH SH AH L
+superficially S UW P ER F IH SH AH L L IY
+superficially(2) S UW P ER F IH SH AH L IY
+superfluidity S UW P ER F L UW IH D AH T IY
+superfluous S UW P ER F L W AH S
+superfon S UW P ER F IH N
+superfreighter S UW P ER F R EY T ER
+superfreighters S UW P ER F R EY T ER Z
+superfund S UW P ER F AH N D
+supergiant S UW P ER JH AY AH N T
+supergiants S UW P ER JH AY AH N T S
+superheated S UW P ER HH IY T IH D
+superhero S UW P ER HH IY R OW
+superheroes S UW P ER HH IY R OW Z
+superheterodyne S UW P ER HH EH T ER AH D AY N
+superhighway S UW P ER HH AY W EY
+superhighways S UW P ER HH AY W EY Z
+superhuman S UW P ER HH Y UW M AH N
+superimpose S UW P ER AH M P OW Z
+superimposed S UW P ER AH M P OW Z D
+superintendant S UW P ER AH N T EH N D AH N T
+superintendant(2) S UW P ER IH N T EH N D AH N T
+superintendent S UW P ER AH N T EH N D AH N T
+superintendent's S UW P ER IH N T EH N D AH N T S
+superintendent(2) S UW P ER IH N T EH N D AH N T
+superintendents S UW P ER AH N T EH N D AH N T S
+superintendents(2) S UW P ER IH N T EH N D AH N T S
+superior S UW P IH R IY ER
+superior's S UW P IY R IY ER Z
+superiority S UW P IH R IY AO R IH T IY
+superiors S UW P IH R IY ER Z
+superlative S UH P ER L AH T IH V
+superlatives S UH P ER L AH T IH V Z
+supermac S UW P ER M AE K
+supermajority S UW P ER M AH JH AO R IH T IY
+superman S UW P ER M AH N
+superman's S UW P ER M AE N Z
+superman(2) S UW P ER M AE N
+supermarket S UW P ER M AA R K IH T
+supermarket's S UW P ER M AA R K AH T S
+supermarkets S UW P ER M AA R K IH T S
+superminicomputer S UW P ER M IH N IY K AH M P Y UW T ER
+superminicomputers S UW P ER M IH N IY K AH M P Y UW T ER Z
+supermodel S UW P ER M AA D AH L
+supermodels S UW P ER M AA D AH L Z
+supernatural S UW P ER N AE CH ER AH L
+supernaturalism S UW P ER N AE CH ER AH L IH Z AH M
+supernova S UW P ER N OW V AH
+superoxide S UW P ER AA K S AY D
+superpower S UW P ER P AW ER
+superpowers S UW P ER P AW ER Z
+superpowers' S UW P ER P AW R Z
+superpremium S UW P ER P R IY M IY AH M
+superpremium(2) S UW P ER P R IY M Y AH M
+superregional S UW P ER R IY JH AH N AH L
+superregionals S UW P ER R IY JH AH N AH L Z
+superregionals' S UW P ER R IY JH AH N AH L Z
+supers S UW P ER Z
+supersaver S UW P ER S EY V ER
+supersecret S UW P ER S IY K R IH T
+supersede S UW P ER S IY D
+superseded S UW P ER S IY D AH D
+supersedes S UW P ER S IY D Z
+superseding S UW P ER S IY D IH NG
+supersonic S UW P ER S AA N IH K
+superstar S UW P ER S T AA R
+superstars S UW P ER S T AA R Z
+superstation S UW P ER S T EY SH AH N
+superstition S UW P ER S T IH SH AH N
+superstitions S UW P ER S T IH SH AH N Z
+superstitious S UW P ER S T IH SH AH S
+superstore S UW P ER S T AO R
+superstores S UW P ER S T AO R Z
+superstructure S UW P ER S T R AH K CH ER
+superstructures S UW P ER S T R AH K CH ER Z
+supertanker S UW P ER T AE NG K ER
+supervalu S UW P ER V AE L Y UW
+supervise S UW P ER V AY Z
+supervised S UW P ER V AY Z D
+supervises S UW P ER V AY Z IH Z
+supervising S UW P ER V AY Z IH NG
+supervision S UW P ER V IH ZH AH N
+supervisor S UW P ER V AY Z ER
+supervisor's S UW P ER V AY Z ER Z
+supervisors S UW P ER V AY Z ER Z
+supervisors' S UW P ER V AY Z ER Z
+supervisory S UW P ER V AY Z ER IY
+supervoting S UW P ER V OW T IH NG
+superwoman S UW P ER W UH M AH N
+superwomen S UW P ER W IH M IH N
+superx S UW P ER EH K S
+supine S AH P AY N
+supine(2) S UW P AY N
+supinski S AH P IH N S K IY
+suppa S UW P AH
+supper S AH P ER
+suppers S AH P ER Z
+suppes S AH P S
+supplant S AH P L AE N T
+supplanted S AH P L AE N T AH D
+supplanting S AH P L AE N T IH NG
+supplants S AH P L AE N T S
+supple S AH P AH L
+supplee S AH P L IY
+supplement S AH P L AH M AH N T
+supplement(2) S AH P L AH M EH N T
+supplemental S AH P L AH M EH N T AH L
+supplemental(2) S AH P L AH M EH N AH L
+supplementary S AH P L AH M EH N T ER IY
+supplementary(2) S AH P L AH M EH N ER IY
+supplementary(3) S AH P L AH M EH N T R IY
+supplementary(4) S AH P L AH M EH N CH R IY
+supplemented S AH P L AH M EH N T AH D
+supplementing S AH P L AH M AH N T IH NG
+supplementing(2) S AH P L AH M EH N T IH NG
+supplements S AH P L AH M AH N T S
+supplements(2) S AH P L AH M EH N T S
+supplicant S AH P L AH K AH N T
+supplied S AH P L AY D
+supplier S AH P L AY ER
+supplier's S AH P L AY ER Z
+suppliers S AH P L AY ER Z
+suppliers' S AH P L AY ER Z
+supplies S AH P L AY Z
+supply S AH P L AY
+supply's S AH P L AY Z
+supplying S AH P L AY IH NG
+support S AH P AO R T
+supportable S AH P AO R T AH B AH L
+supported S AH P AO R T AH D
+supported(2) S AH P AO R T IH D
+supporter S AH P AO R T ER
+supporters S AH P AO R T ER Z
+supporting S AH P AO R T IH NG
+supportive S AH P AO R T IH V
+supports S AH P AO R T S
+suppose S AH P OW Z
+supposed S AH P OW Z D
+supposedly S AH P OW Z AH D L IY
+supposes S AH P OW Z IH Z
+supposing S AH P OW Z IH NG
+supposition S AH P AH Z IH SH AH N
+suppositions S AH P AH Z IH SH AH N Z
+suppress S AH P R EH S
+suppressant S AH P R EH S AH N T
+suppressants S AH P R EH S AH N T S
+suppressed S AH P R EH S T
+suppresses S AH P R EH S IH Z
+suppressing S AH P R EH S IH NG
+suppression S AH P R EH SH AH N
+suppressor S AH P R EH S ER
+supra S UW P R AH
+supranational S UW P R AH N AE SH AH N AH L
+supremacist S UW P R EH M AH S IH S T
+supremacists S UW P R EH M AH S IH S T S
+supremacists(2) S UW P R EH M AH S IH S S
+supremacists(3) S UW P R EH M AH S IH S
+supremacy S AH P R EH M AH S IY
+supreme S AH P R IY M
+supreme(2) S ER P R IY M
+supremely S UW P R IY M AH L IY
+supremes S UW P R IY M Z
+suprenant S UW P R EY N AH N T
+suprisingly S UW P R AY Z IH NG L IY
+suprisingly(2) S ER P R AY Z IH NG L IY
+sur S ER
+sura S UH R AH
+surace S UH R AA S EY
+surat S ER AA T
+surat's S ER AA T S
+surbaugh S ER B AO
+surber S ER B ER
+surcharge S ER CH AA R JH
+surcharges S ER CH AA R JH IH Z
+sure SH UH R
+surely SH UH R L IY
+suren S UH R AH N
+surer SH UH R ER
+sures SH UH R Z
+suresh S ER EH SH
+surest SH UH R IH S T
+surette S ER EH T
+surety SH UH R AH T IY
+surf S ER F
+surf's S ER F S
+surface S ER F AH S
+surfaced S ER F IH S T
+surfaceness S ER F AH S N AH S
+surfaces S ER F AH S AH Z
+surfaces(2) S ER F AH S IH Z
+surfacing S ER F AH S IH NG
+surfactant S ER F AE K T AH N T
+surfboard S ER F B AO R D
+surfboards S ER F B AO R D Z
+surfed S ER F T
+surfeit S ER F AH T
+surfer S ER F ER
+surfers S ER F ER Z
+surfing S ER F IH NG
+surge S ER JH
+surged S ER JH D
+surgeon S ER JH AH N
+surgeon's S ER JH AH N Z
+surgeon(2) S ER JH IH N
+surgeons S ER JH AH N Z
+surgeons' S ER JH IH N Z
+surgeries S ER JH ER IY Z
+surgery S ER JH ER IY
+surges S ER JH AH Z
+surges(2) S ER JH IH Z
+surgical S ER JH IH K AH L
+surgical's S ER JH IH K AH L Z
+surgically S ER JH IH K AH L IY
+surgically(2) S ER JH IH K L IY
+surging S ER JH IH NG
+suriano S UH R IY AA N OW
+surinam S UH R AH N AA M
+suriname S ER IH N AA M
+surles S AO R AH L Z
+surly S ER L IY
+surma S ER M AH
+surman S ER M AH N
+surmise S ER M AY Z
+surmised S ER M AY Z D
+surmises S ER M AY Z IH Z
+surmount S ER M AW N T
+surmounted S ER M AW N T IH D
+surmounting S ER M AW N T IH NG
+surname S ER N EY M
+surnames S ER N EY M Z
+surowiec S ER AW IY K
+surpass S ER P AE S
+surpassed S ER P AE S T
+surpasses S ER P AE S IH Z
+surpassing S ER P AE S IH NG
+surplus S ER P L AH S
+surpluses S ER P L AH S IH Z
+surprenant S ER P R IH N AH N T
+surprise S ER P R AY Z
+surprise(2) S AH P R AY Z
+surprised S ER P R AY Z D
+surprised(2) S AH P R AY Z D
+surprises S ER P R AY Z IH Z
+surprises(2) S AH P R AY Z IH Z
+surprising S ER P R AY Z IH NG
+surprising(2) S AH P R AY Z IH NG
+surprisingly S ER P R AY Z IH NG L IY
+surprisingly(2) S AH P R AY Z IH NG L IY
+surratt S AO R AH T
+surreal S ER IY L
+surrealism S ER IY L IH Z AH M
+surrealism's S ER IY L IH Z AH M Z
+surrealism's(2) S ER IY AH L IH Z AH M Z
+surrealism(2) S ER IY AH L IH Z AH M
+surrealisms S ER IY L IH Z AH M Z
+surrealisms(2) S ER IY AH L IH Z AH M Z
+surrealistic S ER IY L IH S T IH K
+surrealistic(2) S ER IY AH L IH S T IH K
+surrebuttal S ER IH B AH T AH L
+surrebuttal(2) S ER IY B AH T AH L
+surrell S AO R AH L
+surrency S AO R AH N S IY
+surrender S ER EH N D ER
+surrendered S ER EH N D ER D
+surrendering S ER EH N D ER IH NG
+surrenders S ER EH N D ER Z
+surreptitious S ER AH P T IH SH AH S
+surreptitiously S ER AH P T IH SH AH S L IY
+surrett S AO R IH T
+surrette S ER EH T
+surrey S ER IY
+surrogacy S ER AH G AH S IY
+surrogate S ER AH G AH T
+surrogate(2) S ER AH G EY T
+surrogates S ER AH G AH T S
+surrogates(2) S ER AH G EY T S
+surrogation S ER AH G EY SH AH N
+surround S ER AW N D
+surrounded S ER AW N D AH D
+surrounded(2) S ER AW N D IH D
+surrounding S ER AW N D IH NG
+surroundings S ER AW N D IH NG Z
+surrounds S ER AW N D Z
+surry S ER IY
+surtax S ER T AE K S
+surtaxes S ER T AE K S IH Z
+surveil S ER V EY L
+surveillance S ER V EY L AH N S
+surveilling S ER V EY L IH NG
+survey S ER V EY
+survey's S ER V EY Z
+surveyed S ER V EY D
+surveying S ER V EY IH NG
+surveyor S ER V EY ER
+surveyor's S ER V EY ER Z
+surveyors S ER V EY ER Z
+surveys S ER V EY Z
+survivability S ER V AY V AH B IH L IH T IY
+survivable S ER V AY V AH B AH L
+survival S ER V AY V AH L
+survivalist S ER V AY V AH L IH S T
+survivalists S ER V AY V AH L IH S T S
+survivalists(2) S ER V AY V AH L IH S S
+survivalists(3) S ER V AY V AH L IH S
+survive S ER V AY V
+survived S ER V AY V D
+survives S ER V AY V Z
+surviving S ER V AY V IH NG
+survivor S ER V AY V ER
+survivor's S ER V AY V ER Z
+survivors S ER V AY V ER Z
+sus S AH S
+susa S UW S AH
+susan S UW Z AH N
+susan's S UW Z AH N Z
+susana S UW S AA N AH
+susann S UW Z AE N
+susanna S UW Z AE N AH
+susannah S UW S AE N AH
+susanne S UW Z AE N
+susceptibility S AH S EH P T AH B IH L AH T IY
+susceptible S AH S EH P T AH B AH L
+susette S UW Z EH T
+sushi S UW SH IY
+susi S UW S IY
+susie S UW Z IY
+susie's S UW Z IY Z
+suski S AH S K IY
+suskind S AH S K IH N D
+susko S AH S K OW
+susman S AH S M AH N
+susong S AH S AO NG
+suspect S AH S P EH K T
+suspect's S AH S P EH K T S
+suspected S AH S P EH K T AH D
+suspected(2) S AH S P EH K T IH D
+suspecting S AH S P EH K T IH NG
+suspects S AH S P EH K T S
+suspects' S AH S P EH K T S
+suspects(2) S AH S P EH K S
+suspend S AH S P EH N D
+suspended S AH S P EH N D AH D
+suspended(2) S AH S P EH N D IH D
+suspender S AH S P EH N D ER
+suspenders S AH S P EH N D ER Z
+suspending S AH S P EH N D IH NG
+suspends S AH S P EH N D Z
+suspense S AH S P EH N S
+suspenseful S AH S P EH N S F AH L
+suspension S AH S P EH N SH AH N
+suspensions S AH S P EH N SH AH N Z
+suspicion S AH S P IH SH AH N
+suspicions S AH S P IH SH AH N Z
+suspicious S AH S P IH SH AH S
+suspiciously S AH S P IH SH AH S L IY
+susquehanna S UW S K W EH HH AE N AH
+susquehanna's S UW S K W EH HH AE N AH Z
+suss S AH S
+susser S AH S ER
+sussex S AH S IH K S
+susskind S AH S K IH N D
+sussman S AH S M AH N
+susswein S AH S W IY N
+susswein(2) S AH S W AY N
+sustain S AH S T EY N
+sustainability S AH S T EY N AH B IH L IH T IY
+sustainable S AH S T EY N AH B AH L
+sustained S AH S T EY N D
+sustaining S AH S T EY N IH NG
+sustains S AH S T EY N Z
+sustaita S UW S T EY T AH
+sustenance S AH S T AH N AH N S
+susteren S AH S T EH R AH N
+susumu S UW S UW M UW
+susy S UW Z IY
+sutch S AH CH
+sutcliff S AH T K L IH F
+sutcliffe S AH T K L IH F
+suter S UW T ER
+sutera S UW T EH R AH
+sutfin S AH T F IH N
+suthard S AH TH ER D
+suther S AH DH ER
+sutherland S AH DH ER L AH N D
+sutherland's S AH DH ER L AH N D Z
+sutherlin S AH TH ER L IH N
+sutherlin(2) S AH DH ER L IH N
+suthers S AH DH ER Z
+sutley S AH T L IY
+sutliff S AH T L IH F
+sutner S AH T N ER
+sutnick S AH T N IH K
+suto S UW T OW
+sutor S UW T ER
+sutphen S AH T F AH N
+sutphin S AH T F IH N
+sutro S UW T R OW
+sutro's S UW T R OW Z
+sutter S AH T ER
+suttle S AH T AH L
+suttles S AH T AH L Z
+suttmeier S AH T M AY R
+sutton S AH T AH N
+sutton's S AH T AH N Z
+suture S UW CH ER
+sutured S UW CH ER D
+sutures S UW CH ER Z
+suturing S UW CH ER IH NG
+suu EH S Y UW Y UW
+suu(2) S UW
+suva S UW V AH
+suydam S AY D AH M
+suzanna S UW Z AE N AH
+suzanne S UW Z AE N
+suzette S UW Z EH T
+suzhou S UW ZH UW
+suzie S AH Z IY
+suzman S UW Z M AH N
+suzuana S UW Z UW AA N AH
+suzuki S AH Z UW K IY
+suzy S UW Z IY
+suzy's S UW Z IY Z
+svec S V EH K
+svehla S V EH L AH
+svelte S V EH L T
+sven S V EH N
+svendsen S V EH N D S AH N
+svensk S V EH N S K
+svenska S V EH N S K AH
+svenson S V EH N S AH N
+svensson S V EH N S AH N
+sverdlovsk S V ER D L AA V S K
+sverige S V EH R IH JH
+svetlana S V EH T L AA N AH
+svetlik S V EH T L IH K
+svitak S V IH T AH K
+svizzera S V IH Z EH R AH
+svoboda S V OW B OW D AH
+svoray S V AO R EY
+swab S W AA B
+swabs S W AA B Z
+swaby S W AA B IY
+swackhamer S W AO K AE M ER
+swader S W EY D ER
+swadley S W AA D L IY
+swafford S W AA F ER D
+swager S W EY G ER
+swagerty S W AE JH ER T IY
+swaggart S W AE G ER T
+swagger S W AE G ER
+swaggering S W AE G ER IH NG
+swaggerty S W AE G ER T IY
+swahili S W AA HH IY L IY
+swailes S W EY L Z
+swails S W EY L Z
+swaim S W EY M
+swain S W EY N
+swaine S W EY N
+swainston S W EY N S T AH N
+swales S W EY L Z
+swalley S W AO L IY
+swallow S W AA L OW
+swallow(2) S W AO L OW
+swallowed S W AA L OW D
+swallowing S W AA L OW IH NG
+swallows S W AA L OW Z
+swam S W AE M
+swami S W AA M IY
+swaminathan S W AA M IH N AA TH AH N
+swamp S W AA M P
+swamp(2) S W AO M P
+swampbuster S W AA M P B AH S T ER
+swamped S W AO M P T
+swamper S W AA M P ER
+swampers S W AA M P ER Z
+swamping S W AA M P IH NG
+swamps S W AA M P S
+swamps(2) S W AO M P S
+swampy S W AA M P IY
+swan S W AA N
+swan(2) S W AO N
+swanberg S W AA N B ER G
+swanda S W AA N D AH
+swander S W AA N D ER
+swanee S W AA N IY
+swaner S W AO N ER
+swaney S W AO N IY
+swanger S W AO NG ER
+swango S W AA NG G OW
+swanigan S W AA N IH G AH N
+swank S W AE NG K
+swanke S W AO NG K
+swanky S W AA NG K IY
+swann S W AA N
+swann's S W AA N Z
+swanner S W AA N ER
+swans S W AA N Z
+swans(2) S W AO N Z
+swanson S W AA N S AH N
+swanstrom S W AA N S T R AH M
+swantek S W AO N T IH K
+swanton S W AA N T AH N
+swanzy S W AA N Z IY
+swap S W AA P
+swape S W EY P
+swapes S W EY P S
+swapo S W AA P OW
+swapo's S W AA P OW Z
+swapp S W AA P
+swapped S W AA P T
+swapped(2) S W AO P T
+swapping S W AA P IH NG
+swaps S W AA P S
+sward S W AO R D
+swaringen S W EH R IH NG AH N
+swarm S W AO R M
+swarmed S W AO R M D
+swarming S W AO R M IH NG
+swarms S W AO R M Z
+swarner S W AO R N ER
+swarovski S W AA R AA V S K IY
+swart S W AO R T
+swarthmore S W AO R TH M AO R
+swarthout S W AO R TH AW T
+swarthy S W AO R DH IY
+swarthy(2) S W AO R TH IY
+swartley S W AO R T L IY
+swartout S W AO R T AH T
+swarts S W AO R T S
+swartwood S W AO R T W UH D
+swartwout S W AO R T W AW T
+swartz S W AO R T S
+swartz(2) SH W AO R T S
+swartzbaugh S W AO R T S B AA
+swartzendruber S W AO R T S AH N D R UW B ER
+swartzentruber S W AO R T S AH N T R UW B ER
+swartzlander S W AO R T S L AE N D ER
+swartzwelder S W AO R T S W EH L D ER
+swasey S W AA Z IY
+swashbuckling S W AA SH B AH K L IH NG
+swastika S W AA S T IH K AH
+swastikas S W AA S T IH K AH Z
+swat S W AA T
+swatch S W AA CH
+swatched S W AA CH T
+swatches S W AA CH AH Z
+swatches(2) S W AA CH IH Z
+swatching S W AA CH IH NG
+swatek S W AO T IH K
+swath S W AA TH
+swathe S W AA DH
+swathe(2) S W EY DH
+swathed S W AA DH D
+swatow S W AA T OW
+swatted S W AA T IH D
+swatzell S W AO T Z AH L
+swauger S W AW G ER
+swavely S W EY V L IY
+sway S W EY
+swayed S W EY D
+swaying S W EY IH NG
+swayne S W EY N
+sways S W EY Z
+swayze S W EY Z
+swayze(2) S W EY Z IY
+swazi S W AA Z IY
+swaziland S W AA Z IH L AH N D
+sweaney S W IY N IY
+sweany S W IY N IY
+swear S W EH R
+swearengen S W IH R IH NG AH N
+swearengin S W EH R IH NG AH N
+swearing S W EH R IH NG
+swearingen S W EH R IH NG AH N
+swearingin S W EH R IH NG AH N
+swears S W EH R Z
+sweat S W EH T
+sweated S W EH T IH D
+sweater S W EH T ER
+sweaters S W EH T ER Z
+sweatin' S W EH T IH N
+sweating S W EH T IH NG
+sweatman S W IY T M AH N
+sweatpants S W EH T P AE N T S
+sweats S W EH T S
+sweatshirt S W EH T SH ER T
+sweatshirts S W EH T SH ER T S
+sweatshop S W EH T SH AA P
+sweatshops S W EH T SH AA P S
+sweatsuit S W EH T S UW T
+sweatt S W IY T
+sweaty S W EH T IY
+sweazy S W IY Z IY
+swecker S W EH K ER
+swed S W EH D
+sweda S W IY D AH
+swedberg S W EH D B ER G
+swede S W IY D
+sweden S W IY D AH N
+sweden's S W IY D AH N Z
+swedes S W IY D Z
+swedish S W IY D IH SH
+swedlund S W EH D L AH N D
+sweeden S W IY D AH N
+sween S W IY N
+sweeney S W IY N IY
+sweeny S W IY N IY
+sweep S W IY P
+sweeper S W IY P ER
+sweepers S W IY P ER Z
+sweeping S W IY P IH NG
+sweeps S W IY P S
+sweepstake S W IY P S T EY K
+sweepstakes S W IY P S T EY K S
+sweers S W IH R Z
+sweet S W IY T
+sweeten S W IY T AH N
+sweetened S W IY T AH N D
+sweetener S W IY T AH N ER
+sweetener(2) S W IY T N ER
+sweeteners S W IY T AH N ER Z
+sweeteners(2) S W IY T N ER Z
+sweetening S W IY T AH N IH NG
+sweetening(2) S W IY T N IH NG
+sweetens S W IY T AH N Z
+sweeter S W IY T ER
+sweetest S W IY T AH S T
+sweetheart S W IY T HH AA R T
+sweethearts S W IY T HH AA R T S
+sweetie S W IY T IY
+sweeting S W IY T IH NG
+sweetland S W IY T L AH N D
+sweetly S W IY T L IY
+sweetman S W IY T M AH N
+sweetness S W IY T N AH S
+sweeton S W IY T AH N
+sweets S W IY T S
+sweetser S W IY T S ER
+sweetwater S W IY T W AA T ER
+sweezey S W IY Z IY
+sweezy S W IY Z IY
+sweger S W IY G ER
+swehla S W EH L AH
+sweig S W AY G
+sweigard S W AY G ER D
+sweigart S W IY G AA R T
+sweigert S W AY G ER T
+sweitzer S W AY T Z ER
+swell S W EH L
+swelled S W EH L D
+swelling S W EH L IH NG
+swells S W EH L Z
+swelter S W EH L T ER
+sweltered S W EH L T ER D
+sweltering S W EH L T ER IH NG
+swelters S W EH L T ER Z
+sweltry S W EH L T R IY
+swem S W EH M
+swendsen S W EH N D S AH N
+swenet S W EH N AH T
+sweney S W EH N IY
+swensen S W EH N S AH N
+swensen's S W EH N S AH N Z
+swenson S W EH N S AH N
+swept S W EH P T
+swerdlow S W ER D L AW
+swergold S W ER G OW L D
+swerling S W ER L IH NG
+swerve S W ER V
+swerved S W ER V D
+swete S W IY T
+swetland S W EH T L AH N D
+swetnam S W EH T N AH M
+swett S W EH T
+swetz S W EH T S
+swezey S W EH Z IY
+swiatek S V IY AA T EH K
+swiatkowski S V IY AH T K AO F S K IY
+swicegood S W IH S IH G UH D
+swick S W IH K
+swickard S W IH K ER D
+swider S W AY D ER
+swiderski S V IH D ER S K IY
+swiderski(2) S W IH D ER S K IY
+swiech S W IY CH
+swier S W AY ER
+swift S W IH F T
+swift's S W IH F T S
+swifter S W IH F T ER
+swiftest S W IH F T AH S T
+swiftly S W IH F T L IY
+swiftness S W IH F T N AH S
+swifts S W IH F T S
+swig S W IH G
+swigart S W IH G AA R T
+swiger S W AY G ER
+swigert S W IH G ER T
+swiggum S W IH G AH M
+swihart S W IH HH AA R T
+swill S W IH L
+swilley S W IH L IY
+swilling S W IH L IH NG
+swillinger S W IH L IH NG ER
+swim S W IH M
+swimmer S W IH M ER
+swimmers S W IH M ER Z
+swimming S W IH M IH NG
+swims S W IH M Z
+swimsuit S W IH M S UW T
+swimsuits S W IH M S UW T S
+swimwear S W IH M W EH R
+swinburne's S W IH N B ER N Z
+swinburnes S W IH N B ER N Z
+swindall S W IH N D AH L
+swindell S W IH N D AH L
+swindle S W IH N D AH L
+swindled S W IH N D AH L D
+swindlehurst S W IH N D AH L HH ER S T
+swindler S W IH N D AH L ER
+swindler(2) S W IH N D L ER
+swindlers S W IH N D L ER Z
+swindles S W IH N D AH L Z
+swindling S W IH N D L IH NG
+swine S W AY N
+swineford S W IH N IH F ER D
+swineford(2) S W AY N IH F ER D
+swinehart S W AY N HH AA R T
+swiney S W AY N IY
+swinford S W IH N F ER D
+swing S W IH NG
+swinger S W IH NG ER
+swingers S W IH NG ER Z
+swinging S W IH NG IH NG
+swingle S W IH NG G AH L
+swingler S W IH NG G AH L ER
+swingler(2) S W IH NG G L ER
+swingley S W IH NG G L IY
+swings S W IH NG Z
+swink S W IH NG K
+swinney S W IH N IY
+swinson S W IH N S AH N
+swint S W IH N T
+swinton S W IH N T AH N
+swipe S W AY P
+swiped S W AY P T
+swipes S W AY P S
+swiping S W AY P IH NG
+swire S W AY R
+swirl S W ER L
+swirled S W ER L D
+swirling S W ER L IH NG
+swirls S W ER L Z
+swirsky S W ER S K IY
+swish S W IH SH
+swished S W IH SH T
+swisher S W IH SH ER
+swishes S W IH SH IH Z
+swiss S W IH S
+swissair S W IH S EH R
+swisshelm S W IH SH IH L M
+swisshelm(2) S W IH S HH EH L M
+swistak S W IH S T AH K
+switaj S W IH T AY
+switala S W IH T AA L AH
+switalski S W IH T AA L S K IY
+switch S W IH CH
+switchblade S W IH CH B L EY D
+switchblades S W IH CH B L EY D Z
+switchboard S W IH CH B AO R D
+switchboards S W IH CH B AO R D Z
+switched S W IH CH T
+switcher S W IH CH ER
+switchers S W IH CH ER Z
+switches S W IH CH AH Z
+switches(2) S W IH CH IH Z
+switching S W IH CH IH NG
+switzer S W IH T S ER
+switzerland S W IH T S ER L AH N D
+switzerland's S W IH T S ER L AH N D Z
+swivel S W IH V AH L
+swiveled S W IH V AH L D
+swiveling S W IH V AH L IH NG
+swiveling(2) S W IH V L IH NG
+swivels S W IH V AH L Z
+swoboda S W OW B OW D AH
+swofford S W AA F ER D
+swogger S W AA G ER
+swollen S W OW L AH N
+swonger S W AO NG ER
+swoon S W UW N
+swooned S W UW N D
+swooning S W UW N IH NG
+swoop S W UW P
+swoope S W UW P
+swooped S W UW P T
+swooping S W UW P IH NG
+swoops S W UW P S
+swoosh S W UW SH
+swooshed S W UW SH T
+swope S W OW P
+swopes S W OW P S
+swor S W ER
+sword S AO R D
+swordfish S AO R D F IH SH
+swordfish's S AO R D F IH SH IH Z
+swordlike S AO R D L AY K
+swordplay S AO R D P L EY
+swordplays S AO R D P L EY Z
+swords S AO R D Z
+swore S W AO R
+sworn S W AO R N
+swoveland S W OW V L AH N D
+swoyer S W OY ER
+swum S W AH M
+swung S W AH NG
+swyers S W AY ER Z
+swygert S W IH G ER T
+swyto S W IY T OW
+sy S AY
+sybase S AY B EY S
+sybase's S AY B EY S IH Z
+sybert S IH B ER T
+sybil S IH B IH L
+sybilla S IH B IH L AH
+sybille S IH B IH L
+sybron S IH B R AH N
+sycamore S IH K AH M AO R
+sycara S IH K AA R AH
+sycophantic S IH K AH F AE N T IH K
+syd S IH D
+sydell S AY D EH L
+syders S AY D ER Z
+syders' S AY D ER Z
+sydney S IH D N IY
+sydney's S IH D N IY Z
+sydnor S IH D N ER
+sydow S IH D OW
+syed S AY D
+syers S AY ER Z
+syfert S IH F ER T
+sygma S IH G M AH
+sykes S AY K S
+sykora S IH K AO R AH
+syler S AY L ER
+sylla S IH L AH
+syllabic S AH L AE B IH K
+syllable S IH L AH B AH L
+syllables S IH L AH B AH L Z
+syllabus S IH L AH B AH S
+sylmar S IH L M AA R
+sylph S IH L F
+sylphide S IH L F IH D
+sylva S IH L V AH
+sylvain S IH L V EY N
+sylvan S IH L V AH N
+sylvana S IH L V AE N AH
+sylvania S IH L V EY N IY AH
+sylvanus S IH L V AH N IH S
+sylvest S Y L V EY IH S T
+sylvest(2) S Y L V EH S T
+sylvester S IH L V EH S T ER
+sylvestre S IH L V EH S T ER
+sylvia S IH L V IY AH
+sylvia's S IH L V IY AH Z
+sylvie S IH L V IY
+sylvio S IH L V IY OW
+sylvio's S IH L V IY OW Z
+sylvite S IH L V AY T
+sym S IH M
+symanski S IH M AE N S K IY
+symantec S IH M AE N T EH K
+symantec's S IH M AE N T EH K S
+symbion S IH M B IY AH N
+symbion's S IH M B IY AH N Z
+symbiosis S IH M B AY OW S AH S
+symbiotic S IH M B IY AA T IH K
+symbol S IH M B AH L
+symbol's S IH M B AH L Z
+symbolic S IH M B AA L IH K
+symbolically S IH M B AA L IH K AH L IY
+symbolically(2) S IH M B AA L IH K L IY
+symbolics S IH M B AA L IH K S
+symbolism S IH M B AH L IH Z AH M
+symbolists S IH M B AH L AH S T S
+symbolists(2) S IH M B AH L IH S T S
+symbolists(3) S IH M B AH L IH S S
+symbolists(4) S IH M B AH L IH S
+symbolize S IH M B AH L AY Z
+symbolized S IH M B AH L AY Z D
+symbolizes S IH M B AH L AY Z AH Z
+symbolizes(2) S IH M B AH L AY Z IH Z
+symbolizing S IH M B AH L AY Z IH NG
+symbols S IH M B AH L Z
+syme S AY M
+symes S AY M Z
+symington S IH M IH NG T AH N
+symmes S IH M Z
+symmetrical S AH M EH T R IH K AH L
+symmetrically S AH M EH T R IH K L IY
+symmetry S IH M AH T R IY
+symmonds S IH M AH N D Z
+symms S IH M Z
+symon S IH M AH N
+symonds S IH M AH N D Z
+symons S IH M AH N Z
+sympathetic S IH M P AH TH EH T IH K
+sympathetically S IH M P AH TH EH T IH K AH L IY
+sympathetically(2) S IH M P AH TH EH T IH K L IY
+sympathies S IH M P AH TH IY Z
+sympathize S IH M P AH TH AY Z
+sympathized S IH M P AH TH AY Z D
+sympathizer S IH M P AH TH AY Z ER
+sympathizers S IH M P AH TH AY Z ER Z
+sympathizes S IH M P AH TH AY Z IH Z
+sympathizing S IH M P AH TH AY Z IH NG
+sympathy S IH M P AH TH IY
+symphonic S IH M F AA N IH K
+symphonies S IH M F AH N IY Z
+symphony S IH M F AH N IY
+symphony's S IH M F AH N IY Z
+symposium S IH M P OW Z IY AH M
+symposiums S IH M P OW Z IY AH M Z
+sympson S IH M P S AH N
+symptom S IH M P T AH M
+symptomatic S IH M P T AH M AE T IH K
+symptoms S IH M P T AH M Z
+syms S IH M Z
+symtron S IH M T R AA N
+syn S IH N
+syna S IH N AH
+synagogue S IH N AH G AO G
+synagogues S IH N AH G AO G Z
+synalloy S IH N AE L OY
+synalloy's S IH N AE L OY Z
+synan S AY N AH N
+synapse S IH AE P S
+synapses S IH AE P S IH Z
+synar S IH N AA R
+synar(2) S AY N AA R
+synbiotics S IH N B IY AA T IH K S
+synbiotics(2) S IH M B IY AA T IH K S
+sync S IH NG K
+synch S IH N CH
+synchro S IH NG K R OW
+synchronic S IH NG K R AA N IH K
+synchronicity S IH NG K R AH N IH S IH T IY
+synchronization S IH NG K R AH N AH Z EY SH AH N
+synchronize S IH NG K R AH N AY Z
+synchronized S IH NG K R AH N AY Z D
+synchronizes S IH NG K R AH N AY Z IH Z
+synchronizing S IH NG K R AH N AY Z IH NG
+syncom S IH NG K AA M
+syncopate S IH NG K AH P EY T
+syncopated S IH NG K AH P EY T IH D
+syncopation S IH NG K AH P EY SH AH N
+syncor S IH N K AO R
+synder S IH N D ER
+syndicate S IH N D IH K AH T
+syndicate's S IH N D IH K AH T S
+syndicate(2) S IH N D AH K EY T
+syndicated S IH N D IH K EY T IH D
+syndicates S IH N D IH K EY T S
+syndicates(2) S IH N D IH K AH T S
+syndicating S IH N D IH K EY T IH NG
+syndication S IH N D IH K EY SH AH N
+syndications S IH N D IH K EY SH AH N Z
+syndicator S IH N D IH K EY T ER
+syndicators S IH N D IH K EY T ER Z
+syndicats S IH N D IH K IH T S
+syndrich S IH D R IH CH
+syndrome S IH N D R OW M
+syndromes S IH N D R OW M Z
+synergen S IH N ER JH EH N
+synergen's S IH N ER JH EH N Z
+synergetic S IH N ER JH EH T IH K
+synergies S IH N ER JH IY Z
+synergism S IH N ER JH IH Z AH M
+synergistic S IH N ER JH IH S T IH K
+synergy S IH N ER JH IY
+synergy's S IH N ER JH IY Z
+syngman S IH NG M AH N
+synhorst S IH N HH AO R S T
+synnott S IH N AH T
+synod S IH N AH D
+synod's S IH N AH D Z
+synonym S IH N AH N IH M
+synonymous S AH N AA N AH M AH S
+synonymously S AH N AA N AH M AH S L IY
+synopsis S IH N AA P S IH S
+synoptic S IH N AA P T IH K
+synoptics S IH N AA P T IH K S
+synovus S AH N OW V AH S
+synovus(2) S AY N OW V AH S
+syntax S IH N T AE K S
+syntech S IH N T EH K
+syntex S IH N T EH K S
+syntex's S IH N T EH K S IH Z
+synthesis S IH N TH AH S AH S
+synthesize S IH N TH AH S AY Z
+synthesized S IH N TH IH S AY Z D
+synthesizer S IH N TH AH S AY Z ER
+synthesizers S IH N TH AH S AY Z ER Z
+synthesizing S IH N TH AH S AY Z IH NG
+synthetic S IH N TH EH T IH K
+synthetically S IH N TH EH T IH K L IY
+synthetics S IH N TH EH T IH K S
+syntrex S IH N T R AH K S
+syp S AY P
+syp(2) EH S W AY P IY
+sypher S IH F ER
+syphers S IH F ER Z
+syphilis S IH F AH L IH S
+syphon S AY F AH N
+sypniewski S IH P N IY EH F S K IY
+sypniewski(2) S IH P N UW S K IY
+sypolt S IH P OW L T
+syracuse S IH R AH K Y UW Z
+syrek S IH R IH K
+syria S IH R IY AH
+syria's S IH R IY AH Z
+syrian S IH R IY AH N
+syrians S IH R IY AH N Z
+syring S AY R IH NG
+syringe S ER IH N JH
+syringe(2) S IH R IH N JH
+syringes S ER IH N JH AH Z
+syron S AY R AH N
+syrup S ER AH P
+syrup(2) S IH R AH P
+syrups S ER AH P S
+sysco S IH S K OW
+syscon S AY S K AH N
+syscon's S AY S K AH N Z
+system S IH S T AH M
+system's S IH S T AH M Z
+systemat S IH S T AH M AE T
+systematic S IH S T AH M AE T IH K
+systematically S IH S T AH M AE T IH K L IY
+systematics S IH S T AH M AE T IH K S
+systemhouse S IH S T AH M HH AW S
+systemhouse's S IH S T AH M HH AW S IH Z
+systemic S IH S T EH M IH K
+systemically S AH S T EH M IH K L IY
+systemix S IH S T IH M IH K S
+systemix(2) S IH S T EH M IH K S
+systemone S IH S T AH M OW N
+systems S IH S T AH M Z
+systems' S IH S T AH M Z
+systemwide S IH S T AH M W AY D
+systran S AY S T R AE N
+systran(2) S IH S T R AE N
+sytsma S IH T S M AH
+syverson S IH V ER S AH N
+syvertsen S IH V ER T S AH N
+szabo SH AA B OW
+szafran SH AA F R AH N
+szafranski SH AH F R AE N S K IY
+szalay SH AA L AY
+szalkowski SH AH L K AO F S K IY
+szanto SH AE N T OW
+szarek SH AA R EH K
+szatkowski SH AH T K AO F S K IY
+szczech SH EH K
+szczepaniak SH IH P AE N IY AE K
+szczepanik SH IH P AE N IH K
+szczepanski SH IH P AE N S K IY
+szczerba SH ER B AH
+szczesniak SH EH Z N IY AE K
+szczesny SH EH Z N IY
+szczygiel SH IH G IY L
+sze SH IY
+sze(2) SH EY
+sze-di SH EY D IY
+szekely SH IY K L IY
+szeliga SH IH L AY G AH
+szeto SH IY T OW
+szewczyk SH UW CH IH K
+szilagyi SH IH L AA G IY
+szilard S IH L ER D
+szilard(2) Z IH L ER D
+szoke SH OW K
+szostak SH AA S T AH K
+szostek SH AA S T EH K
+szot SH AA T
+szott SH AA T
+szuba SH UW B AH
+szuch SH AH CH
+szucs SH AH K S
+szumski SH AH M S K IY
+szwed SH V EH D
+szydlowski SH IH D L AO F S K IY
+szymanowski SH IH M AH N AO F S K IY
+szymanski SH IH M AE N S K IY
+szymborski SH IH M B AO R S K IY
+szymczak SH IH M CH AE K
+t T IY
+t'ang T AE NG
+t's T IY Z
+t-bone T IY B OW N
+t-lam T IY L AE M
+t. T IY
+t.'s T IY Z
+t.s T IY Z
+ta T AA
+taaffe T AA F
+tab T AE B
+tabacalera T AH B AE K AH L EH R AH
+tabachneck T AH B AA CH N EH K
+tabak T AE B AE K
+tabak(2) T AH B AE K
+tabaka T AA B AA K AH
+tabar T AA B AA R
+tabares T AA B AA R EH S
+tabasco T AH B AE S K OW
+tabb T AE B
+tabbert T AE B ER T
+tabbing T AE B IH NG
+tabby T AE B IY
+taber T EY B ER
+tabernacle T AE B ER N AE K AH L
+tabitha T AE B IH TH AH
+tablature T AE B L AH CH ER
+table T EY B AH L
+table's T EY B AH L Z
+tableau T AH B L OW
+tableaux T AH B L OW
+tablecloth T EY B AH L K L AO TH
+tablecloths T EY B AH L K L AO TH S
+tabled T EY B AH L D
+tabler T EY B AH L ER
+tabler(2) T EY B L ER
+tables T EY B AH L Z
+tablespoon T EY B AH L S P UW N
+tablespoons T EY B AH L S P UW N Z
+tablet T AE B L AH T
+tabletop T EY B AH L T AA P
+tablets T AE B L AH T S
+tableware T EY B AH L W EH R
+tabling T EY B AH L IH NG
+tabling(2) T EY B L IH NG
+tabloid T AE B L OY D
+tabloidization T AE B L OY D AH Z EY SH AH N
+tabloids T AE B L OY D Z
+tabone T AA B OW N
+taboo T AE B UW
+taboos T AE B UW Z
+tabor T EY B ER
+tabor's T EY B ER Z
+taborn T AE B ER N
+tabron T AE B R AH N
+tabs T AE B Z
+tabuchi T AA B UW CH IY
+tabulate T AE B Y AH L EY T
+tabulated T AE B Y AH L EY T IH D
+tabulating T AE B Y AH L EY T IH NG
+tabulation T AE B Y AH L EY SH AH N
+tabulations T AE B Y AH L EY SH AH N Z
+tabulature T AE B Y AH L AH CH ER
+tac T AE K
+tacey T EY S IY
+tacit T AE S IH T
+tacita T AA CH IY T AH
+tacitly T AE S IH T L IY
+taciturn T AE S IH T ER N
+tack T AE K
+tacke T AE K
+tacked T AE K T
+tacker T AE K ER
+tackett T AE K IH T
+tacking T AE K IH NG
+tackitt T AE K IH T
+tackle T AE K AH L
+tackled T AE K AH L D
+tackles T AE K AH L Z
+tackling T AE K L IH NG
+tackling(2) T AE K AH L IH NG
+tacks T AE K S
+tacky T AE K IY
+taco T AA K OW
+tacoma T AH K OW M AH
+tacoma's T AH K OW M AH Z
+tacos T AA K OW Z
+tact T AE K T
+tactful T AE K T F AH L
+tactfully T AE K T F AH L IY
+tactic T AE K T IH K
+tactical T AE K T IH K AH L
+tactically T AE K T IH K AH L IY
+tactician T AE K T IH SH AH N
+tacticians T AE K T IH SH AH N Z
+tactics T AE K T IH K S
+tactile T AE K T IH L
+tactile(2) T AE K T AY L
+tactless T AE K T L AH S
+tacy T EY S IY
+tad T AE D
+tada T AA D AH
+tadashi T AA D AA SH IY
+tadd T AE D
+taddei T AE D AY
+taddeo T AA D IY OW
+taddy T AE D IY
+tadeusz T AE D IY UW Z
+tadic T AE D IH K
+tadlock T AE D L AH K
+tadpole T AE D P OW L
+tadpoles T AE D P OW L Z
+tadros T EY D R OW Z
+tadych T AA D IH HH
+tae T EY
+tae(2) T AY
+taegu T EY G UW
+taekwondo T AE K W AA N D OW
+taekwondo(2) T AY K W AA N D OW
+taewoo T AY W UW
+tafaro T AH F AA R OW
+tafel T AE F AH L
+taff T AE F
+taffe T AE F
+taffel T AE F AH L
+taffeta T AE F AH T AH
+taffy T AE F IY
+taflinger T EY F AH L IH NG ER
+taflinger(2) T EY F L IH NG ER
+tafolla T AH F AA L AH
+tafoya T AA F OY AH
+taft T AE F T
+taft's T AE F T S
+tag T AE G
+tagalog T AE G AH L AA G
+tagamet T AE G AH M EH T
+taganka T AH G AA NG K AH
+tager T EY G ER
+tagg T AE G
+taggart T AE G ER T
+taggart's T AE G ER T S
+tagge T AE G
+tagged T AE G D
+taggert T AE G ER T
+tagging T AE G IH NG
+tagle T EY G AH L
+tagliaferri T AA G L Y AA F EH R IY
+taglieri T AA G L IH R IY
+tagline T AE G L AY N
+tagout T AE G AW T
+tags T AE G Z
+tague T AA G
+taher T EY ER
+tahiti T AH HH IY T IY
+tahmassebi T AA M AH S IY B IY
+tahoe T AE HH OW
+tai T AY
+taibi T EY B IY
+taiko T EY K OW
+tail T EY L
+tailed T EY L D
+tailgate T EY L G EY T
+tailhook T EY L HH UH K
+tailing T EY L IH NG
+tailings T EY L IH NG Z
+taillon T EY L AH N
+tailor T EY L ER
+tailored T EY L ER D
+tailoring T EY L ER IH NG
+tailors T EY L ER Z
+tailpipe T EY L P AY P
+tails T EY L Z
+tailspin T EY L S P IH N
+taima T AY M AH
+tainer T EY N ER
+taing T AA IH NG
+taint T EY N T
+tainted T EY N T IH D
+tainter T EY N T ER
+tainting T EY N T IH NG
+taints T EY N T S
+taipei T AY P EY
+taipei's T AY P EY Z
+taira T AA IH R AH
+taisei T EY S EY
+taisho T EY SH OW
+tait T EY T
+taite T EY T
+taitt T EY T
+taiwan T AY W AA N
+taiwan's T AY W AA N Z
+taiwanese T AY W AA N IY Z
+taiyo T AY Y OW
+taj T AA ZH
+tajik T AA JH IH K
+tajikistan T AA JH IY K IH S T AE N
+tajikistan's T AA JH IY K IH S T AE N Z
+tajima T AA JH IY M AH
+tak T AE K
+takach T AE K AH K
+takacs T AE K AH K S
+takagi T AA K AA G IY
+takahashi T AA K AA HH AA SH IY
+takaki T AA K AA K IY
+takako T AA K AA K OW
+takanashi T AA K AA N AA SH IY
+takao T AA K AA OW
+takara T AA K AA R AH
+takasago T AA K AA S AA G OW
+takashi T AA K AA SH IY
+takashima T AA K AA SH IY M AH
+takashimaya T AA K AA SH IH M AA Y AH
+takata T AA K AA T AH
+takayama T AA K AA Y AA M AH
+take T EY K
+takecare T EY K EH R
+takeda T AA K EY D AH
+takei T AA K EY
+takemoto T AA K EY M OW T OW
+takemura T AA K EY M UH R AH
+taken T EY K AH N
+takeo T AA K EY OW
+takeoff T EY K AO F
+takeoffs T EY K AO F S
+takeout T EY K AW T
+takeover T EY K OW V ER
+takeovers T EY K OW V ER Z
+taker T EY K ER
+takers T EY K ER Z
+takes T EY K S
+takeshi T AH K EH SH IY
+takeshima T AE K IH SH IY M AH
+takeshita T AA K AH SH IY T AH
+takeshita's T AA K AH SH IY T AH Z
+taketa T AA K EY T AH
+taketh T EY K AH TH
+taketomi T AA K IH T OW M IY
+takeuchi T AA K EY UW CH IY
+taki T AE K IY
+taki's T AE K IY Z
+takihyo T AH K IY Y OW
+takin' T EY K IH N
+taking T EY K IH NG
+takings T EY K IH NG Z
+takla-makan T AE K L AH M EY K AH N
+taku T AA K UW
+takushoku T AA K AH SH OW K UW
+tal T AA L
+talaga T AA L AA G AH
+talal T AH L AA L
+talamantes T AA L AA M AA N T EH S
+talamantez T AA L AA M AA N T EH Z
+talamo T AA L AA M OW
+talarico T AA L AA R IY K OW
+talavera T AA L AA V EH R AH
+talbert T AE L B ER T
+talbot T AE L B AH T
+talbot's T AE L B AH T S
+talbots T AE L B AH T S
+talbott T AE L B AH T
+talbott's T AE L B AH T S
+talc T AE L K
+talcott T AE L K AH T
+talcs T AE L K S
+talcum T AE L K AH M
+tale T EY L
+talent T AE L AH N T
+talented T AE L AH N T AH D
+talented(2) T AE L AH N T IH D
+talents T AE L AH N T S
+talerico T AA L ER IY K OW
+tales T EY L Z
+talese T AH L IY Z
+talese(2) T AH L IY Z IY
+talford T AE L F ER D
+taliban T AE L IH B AE N
+taliban's T AE L IH B AE N Z
+talibans T AE L IH B AE N Z
+taligent T AE L IH JH EH N T
+talisman T AE L IH S M AH N
+talitha T AE L IH DH AH
+talk T AO K
+talk's T AO K S
+talkable T AO K AH B AH L
+talkative T AO K AH T IH V
+talkback T AO K B AE K
+talked T AO K T
+talker T AO K ER
+talkers T AO K ER Z
+talkie T AO K IY
+talkies T AO K IY Z
+talkin T AA K AH N
+talkin' T AO K IH N
+talking T AO K IH NG
+talking's T AO K IH NG Z
+talkington T AO K IH NG T AH N
+talks T AO K S
+talky T AO K IY
+tall T AO L
+talladega T AE L AH D EY G AH
+tallahassean T AE L AH HH AE S IY AH N
+tallahasseans T AE L AH HH AE S IY AH N Z
+tallahassee T AE L AH HH AE S IY
+tallahassee's T AE L AH HH AE S IY Z
+tallant T AA L AH N T
+tallarico T AA L AA R IY K OW
+tallent T AA L AH N T
+taller T AO L ER
+tallerico T AA L ER IY K OW
+tallest T AO L IH S T
+talley T AE L IY
+tallgrass T AA L G R AE S
+tallie T AO L IY
+tallied T AE L IY D
+tallies T AE L IY Z
+tallil T AH L IH L
+tallmadge T AE L M AE JH
+tallman T AO L M AH N
+tallo T AE L OW
+tallon T AE L AH N
+tallow T AE L OW
+tallula T AA L UW L AH
+tallulah T AE L UW L AH
+tally T AE L IY
+tallyho T AE L IY HH OW
+tallying T AE L IY IH NG
+talmadge T AE L M AE JH
+talmage T AE L M IH JH
+talman T AE L M AH N
+talmor T AE L M AO R
+talmud T AE L M AH D
+talon T AE L AH N
+talons T AE L AH N Z
+talsma T AA L S M AH
+talton T AE L T AH N
+taltos T AA L T OW Z
+talty T AO L T IY
+tam T AE M
+tama T AA M AH
+tamales T AH M AA L IY Z
+tamanaha T AA M AA N AA HH AH
+tamara T AH M AA R AH
+tamarac T AE M ER AE K
+tamargo T AA M AA R G OW
+tamarin T AE M ER AH N
+tamarins T AE M ER AH N Z
+tamarisk T AE M ER IH S K
+tamarisks T AE M ER IH S K S
+tamas T AA M AH Z
+tamashiro T AA M AA SH IH R OW
+tamayo T AA M AA Y OW
+tamblyn T AE M B L IH N
+tambo T AE M B OW
+tambocor T AE M B OW K AO R
+tambourine T AE M B ER IY N
+tambrands T AE M B R AE N D Z
+tambs T AE M Z
+tamburello T AA M B UH R EH L OW
+tamburo T AA M B UH R OW
+tamburri T AA M B UH R IY
+tamburrino T AA M B UH R IY N OW
+tamburro T AA M B UH R OW
+tame T EY M
+tamed T EY M D
+tamer T EY M ER
+tames T EY M Z
+tamez T AA M EH Z
+tami T AE M IY
+tamiami T AE M IY AE M IY
+tamil T AH M IH L
+tamil(2) T AE M IH L
+tamils T AH M IH L Z
+tamils(2) T AE M IH L Z
+taming T EY M IH NG
+tamke T AE M K IY
+tamm T AE M
+tammany T AE M AH N IY
+tammaro T AA M AA R OW
+tammen T AE M AH N
+tammie T AE M IY
+tamminga T AA M IY NG G AH
+tammo T AE M OW
+tammy T AE M IY
+tamoxifen T AE M AA K S AH F AH N
+tamp T AE M P
+tampa T AE M P AH
+tampa's T AE M P AH Z
+tampax T AE M P AE K S
+tamper T AE M P ER
+tampered T AE M P ER D
+tampering T AE M P ER IH NG
+tamping T AE M P IH NG
+tamplin T AE M P L IH N
+tampon T AE M P AA N
+tampons T AE M P AA N Z
+tampopo T AE M P OW P OW
+tamposi T AE M P OW S IY
+tamps T AE M P S
+tamraz T AE M R AE Z
+tamraz's T AE M R AE Z AH Z
+tamres T AE M R EH Z
+tamura T AA M UH R AH
+tan T AE N
+tanabe T AA N AA B EY
+tanaka T AA N AA K AH
+tanartkit T AE N AA R T K IH T
+tancredi T AA N K R EH D IY
+tancredo T AE N K R EY D OW
+tandem T AE N D AH M
+tandem's T AE N D AH M Z
+tandon T AE N D AH N
+tandy T AE N D IY
+tandy's T AE N D IY Z
+tandycraft T AE N D IY K R AE F T
+tandycrafts T AE N D IY K R AE F T S
+taneja T AH N EY HH AH
+tanen T AE N AH N
+tanenbaum T AE N AH N B AW M
+taney T EY N IY
+tang T AE NG
+tang(2) T AA NG
+tange T AE N JH
+tangeman T EY N JH M AH N
+tangen T AE NG AH N
+tangent T AE N JH AH N T
+tangential T AE N JH EH N CH AH L
+tangentially T AE N JH EH N CH AH L IY
+tangents T AE N JH AH N T S
+tanger T AE NG ER
+tangerine T AE N JH ER IY N
+tangerines T AE N JH ER IY N Z
+tangible T AE N JH AH B AH L
+tangibles T AE N JH AH B AH L Z
+tangibly T AE N JH AH B L IY
+tangiers T AE N JH IH R Z
+tangle T AE NG G AH L
+tangled T AE NG G AH L D
+tangles T AE NG G AH L Z
+tanglewood T AE NG G AH L W UH D
+tangling T AE NG G L IH NG
+tangney T AE NG G N IY
+tango T AE NG G OW
+tangos T AE NG G OW Z
+tangqui T AE NG K W IY
+tangredi T AA NG G R EH D IY
+tangs T AE NG Z
+tanguay T AE N G EY
+tanguma T AA NG G UW M AH
+tani T AA N IY
+tania T AA N Y AH
+taniguchi T AA N IH G UW CH IY
+tanimoto T AA N IY M OW T OW
+tanimura T AA N IH M UW R AH
+tanis T AE N IH S
+tanjug T AE N JH AH G
+tank T AE NG K
+tank's T AE NG K S
+tankan T AE NG K AH N
+tankard T AE NG K ER D
+tanke T AE NG K
+tanked T AE NG K T
+tanker T AE NG K ER
+tankers T AE NG K ER Z
+tankersley T AE NG K ER S L IY
+tanking T AE NG K IH NG
+tanks T AE NG K S
+tanksley T AE NG K S L IY
+tann T AE N
+tannahill T AE N AH HH IH L
+tanned T AE N D
+tannehill T AE N IH HH IH L
+tannen T AE N AH N
+tannenbaum T AE N AH N B AW M
+tanner T AE N ER
+tannest T AE N IH S T
+tanney T AE N IY
+tannhauser T AE N HH AW Z ER
+tanning T AE N IH NG
+tanqueray T AE NG K W ER EY
+tans T AE N Z
+tansey T AE N Z IY
+tanski T AE N S K IY
+tansy T AE N Z IY
+tant T AE N T
+tantalize T AE N T AH L AY Z
+tantalize(2) T AE N AH L AY Z
+tantalized T AE N T AH L AY Z D
+tantalized(2) T AE N AH L AY Z D
+tantalizes T AE N T AH L AY Z IH Z
+tantalizes(2) T AE N AH L AY Z AH Z
+tantalizing T AE N T AH L AY Z IH NG
+tantalizing(2) T AE N AH L AY Z IH NG
+tantalizingly T AE N T AH L AY Z IH NG L IY
+tantalizingly(2) T AE N AH L AY Z IH NG L IY
+tantalum T AE N T AH L AH M
+tantalus T AE N T AH L AH S
+tantamount T AE N T AH M AW N T
+tantillo T AA N T IH L OW
+tanton T AE N T AH N
+tantric T AE N T R IH K
+tantrum T AE N T R AH M
+tantrums T AE N T R AH M Z
+tanu T AA N UW
+tanya T AA N Y AH
+tanzania T AE N Z EY N IY AH
+tanzania's T AE N Z EY N IY AH Z
+tanzania's(2) T AE N Z AH N IY AH Z
+tanzania's(3) T AE N Z EY N Y AH Z
+tanzania(2) T AE N Z AH N IY AH
+tanzania(3) T AE N Z EY N Y AH
+tanzanian T AE N Z EY N IY AH N
+tanzanian(2) T AE N Z EY N Y AH N
+tanzer T AE N Z ER
+tanzi T AE N Z IY
+tao T AW
+tao(2) D AW
+taoism D AW IH Z AH M
+taoist D AW IH S T
+taoists D AW AH S T S
+taoists(2) D AW AH S S
+taoists(3) D AW AH S
+taormina T AA AO R M IY N AH
+taos T AW Z
+tap T AE P
+tapas T AH P AH S
+tape T EY P
+tape's T EY P S
+taped T EY P T
+tapeie T EY P IY EY
+tapeie's T EY P IY EY Z
+taper T EY P ER
+tapered T EY P ER D
+tapering T EY P ER IH NG
+tapers T EY P ER Z
+tapes T EY P S
+tapestries T AE P AH S T R IY Z
+tapestry T AE P AH S T R IY
+tapia T AA P IY AH
+tapias T AH P IY AH S
+tapie T AE P IY
+taping T EY P IH NG
+tapings T EY P IH NG Z
+tapley T AE P L IY
+taplin T AE P L IH N
+tapp T AE P
+tappan T AE P AH N
+tappe T AE P
+tapped T AE P T
+tappen T AE P AH N
+tapper T AE P ER
+tappet T AE P AH T
+tappin T AE P IH N
+tapping T AE P IH NG
+taps T AE P S
+tapscott T AE P S K AH T
+tar T AA R
+tara T EH R AH
+tara's T EH R AH Z
+tara's(2) T AA R AH Z
+tara(2) T AA R AH
+tarahumara T AA R AH HH UW M AA R AH
+tarallo T ER AE L OW
+tarango T AA R AA NG G OW
+tarantino T AA R AA N T IY N OW
+taranto T ER AE N T OW
+taranto's T ER AE N T OW Z
+tarantula T AH R AE N CH UW L AH
+tarantula(2) T AH R AE N CH AH L AH
+tarantulas T AH R AE N CH UW L AH Z
+tarantulas(2) T AH R AE N CH AH L AH Z
+taras T AA R AH Z
+tarasoff T EH R IH S AO F
+taravella T AE R AH V EH L AH
+tarbell T AA R B EH L
+tarbert T AA R B ER T
+tarbet T AA R B IH T
+tarbox T AA R B AA K S
+tarbutton T AA R B AH T AH N
+tardif T AA R D IH F
+tardiff T AA R D IH F
+tardiness T AA R D IY N AH S
+tarditi T AA R D IH T IY
+tardy T AA R D IY
+target T AA R G AH T
+target's T AA R G AH T S
+target(2) T ER G AH T
+targeted T AA R G AH T IH D
+targeting T AA R G AH T IH NG
+targets T AA R G AH T S
+tarheel T AA R HH IY L
+tarheels T AA R HH IY L Z
+tariff T EH R AH F
+tariffs T EH R AH F S
+tarin T AA R IY N
+tariq T AA R IY K
+tarkington T AA R K IH NG T AH N
+tarkowski T ER K AO F S K IY
+tarleton T AA R L T AH N
+tarlow T AA R L OW
+tarlton T AA R L T AH N
+tarmac T AA R M AE K
+tarmacs T AA R M AE K S
+tarman T AA R M AH N
+tarnish T AA R N IH SH
+tarnished T AA R N IH SH T
+tarnishing T AA R N IH SH IH NG
+tarnoff T AA R N AO F
+tarnoff's T AA R N AO F S
+tarnow T AA R N OW
+tarnower T AA R N AW ER
+tarnowski T ER N AO F S K IY
+taro T EH R OW
+tarom T EH R AH M
+tarot T AE R OW
+tarots T AE R OW Z
+tarp T AA R P
+tarpey T AA R P IY
+tarpley T AA R P L IY
+tarpon T AA R P AH N
+tarps T AA R P S
+tarpy T AA R P IY
+tarquinio T AA R K W IY N IY OW
+tarr T AA R
+tarrance T AA R AH N S
+tarrant T AA R AH N T
+tarred T AA R D
+tarring T AA R IH NG
+tarry T EH R IY
+tarrytown T EH R IY T AW N
+tarses T AA R S IH S
+tarsus T AA R S AH S
+tart T AA R T
+tartaglia T AA R T AE G L IY AH
+tartaglione T AA R T AE G L IY OW N IY
+tartan T AA R T AH N
+tartar T AA R T ER
+tartars T AA R T ER Z
+tarte T AA R T
+tarter T AA R T ER
+tartikoff T AA R T IH K AO F
+tartikoff's T AA R T IH K AO F S
+tartikoffs T AA R T IH K AO F S
+tartly T AA R T L IY
+tartness T AA R T N AH S
+tarts T AA R T S
+tartt T AA R T
+tarver T AA R V ER
+tarvin T AA R V IH N
+tarzan T AA R Z AE N
+tarzan's T AA R Z AE N Z
+tarzan's(2) T AA R Z AH N Z
+tarzan(2) T AA R Z AH N
+tasaday T AE S AH D EY
+tasca T AA S K AH
+tasch T AE SH
+taschner T AE SH N ER
+taser T EY Z ER
+tash T AE SH
+tasha T AE SH AH
+tashin T AE SH IH N
+tashiro T AA SH IH R OW
+tashjian T AE SH JH IY AH N
+tashkent T AE SH K EH N T
+task T AE S K
+tasked T AE S K T
+tasker T AE S K ER
+taskforce T AE S K F AO R S
+tasking T AE S K IH NG
+taskmaster T AE S K M AE S T ER
+tasks T AE S K S
+tasm T AE S AH M
+tasman T AE Z M AH N
+tasmania T AE Z M EY N IY AH
+tasmanian T AE Z M EY N IY AH N
+tass T AE S
+tassel T AE S AH L
+tasseled T AE S AH L D
+tassi T AE S IY
+tassin T AE S IH N
+tassinari T AA S IY N AA R IY
+tasso T AE S OW
+tassone T AA S OW N IY
+taste T EY S T
+tasted T EY S T AH D
+tasted(2) T EY S T IH D
+tasteful T EY S T F AH L
+tastefully T EY S T F AH L IY
+tasteless T EY S T L AH S
+taster T EY S T ER
+taster's T EY S T ER Z
+tasters T EY S T ER Z
+tastes T EY S T S
+tastier T EY S T IY ER
+tastiness T EY S T IY N AH S
+tasting T EY S T IH NG
+tastings T EY S T IH NG Z
+tasty T EY S T IY
+tat T AE T
+tata T AA T AH
+tatar T AE T ER
+tatars T AE T ER Z
+tatarstan T AA T ER S T AE N
+tatarstan(2) T AA T AA R S T AE N
+tate T EY T
+tate's T EY T S
+tateho T AH T EY HH OW
+tateho's T AH T EY HH OW Z
+tatem T AE T IH M
+tater T EY T ER
+tatge T EY T JH
+tatham T AE TH AH M
+tatiana T AE T IY AE N AH
+tatiana(2) T AE T Y AA N AH
+tatlock T AE T L AA K
+tatman T AE T M AH N
+tatom T AE T AH M
+tatra T AE T R AH
+tatro T AE T R OW
+tatsch T AE CH
+tatsukichi T AH T S UW K IY CH IY
+tatsuno T AE T S UW N OW
+tatter T AE T ER
+tattered T AE T ER D
+tatters T AE T ER Z
+tattersall T AE T ER S AH L
+tattle T AE T AH L
+tattled T AE T AH L D
+tattler T AE T L ER
+tattoo T AE T UW
+tattooed T AE T UW D
+tattooing T AE T UW IH NG
+tattoos T AE T UW Z
+tatty T AE T IY
+tatu T AA T UW
+tatum T EY T AH M
+tatyana T AA T Y AA N AH
+taub T AW B
+taube T AO B
+tauber T AW B ER
+taubert T AW B ER T
+taubes T AW B Z
+taubman T AW B M AH N
+taucher T AW K ER
+tauer T AW ER
+taught T AO T
+tauke T AW K
+taul T AO L
+taulbee T AO L B IY
+taunt T AO N T
+taunted T AO N T IH D
+taunting T AO N T IH NG
+taunton T AO N T AH N
+taunts T AO N T S
+taurus T AO R AH S
+tauruses T AO R AH S AH Z
+tausch T AW SH
+tauscher T AW SH ER
+taussig T AW S IH G
+taut T AO T
+tauzin T AW Z IH N
+tavano T AA V AA N OW
+tavares T AA V AA R EH S
+tavarez T AA V AA R EH Z
+tavel T AA V EH L
+tavenner T AE V IH N ER
+tavera T AA V EH R AH
+taveras T AA V EH R AA Z
+tavern T AE V ER N
+taverna T AA V EH R N AH
+taverna's T AA V EH R N AH Z
+tavernas T AA V EH R N AH Z
+tavernier T AE V ER N IY ER
+taverns T AE V ER N Z
+taves T EY V Z
+tavie T EY V IY
+tavis T AA V IH S
+tavish T EY V IH SH
+tavist T AE V IH S T
+tavlin T AE V L IH N
+tavoulareas T AA V UW L EH R IY AH S
+tavy T EY V IY
+tawana T AA W AA N AH
+tawdry T AO D R IY
+tawes T AO Z
+tawfiq T AA F IH K
+tawil T AO AH L
+tawney T AO N IY
+tawny T AA N IY
+tax T AE K S
+tax's T AE K S IH Z
+taxability T AE K S AH B IH L IH T IY
+taxable T AE K S AH B AH L
+taxables T AE K S AH B AH L Z
+taxation T AE K S EY SH AH N
+taxcut T AE K S K AH T
+taxed T AE K S T
+taxer T AE K S ER
+taxers T AE K S ER Z
+taxes T AE K S AH Z
+taxes' T AE K S IH Z
+taxes(2) T AE K S IH Z
+taxi T AE K S IY
+taxi's T AE K S IY Z
+taxicab T AE K S IY K AE B
+taxicabs T AE K S IY K AE B Z
+taxidermist T AE K S AH D ER M AH S T
+taxidermists T AE K S AH D ER M AH S T S
+taxidermists(2) T AE K S AH D ER M AH S
+taxidermy T AE K S AH D ER M IY
+taxied T AE K S IY D
+taxiing T AE K S IY IH NG
+taxing T AE K S IH NG
+taxis T AE K S IY Z
+taxiway T AE K S IY W EY
+taxol T AE K S AA L
+taxpayer T AE K S P EY ER
+taxpayer's T AE K S P EY ER Z
+taxpayers T AE K S P EY ER Z
+taxpayers' T AE K S P EY ER Z
+taxpaying T AE K S P EY IH NG
+tay T EY
+tayler T EY L ER
+tayloe T EY L OW
+taylor T EY L ER
+taylor's T EY L ER Z
+taylors T EY L ER Z
+tayman T EY M AH N
+tays T EY Z
+tb T IY B IY
+tbilisi T AH B IH L IY S IY
+tbilisi(2) T AH B L IY S IY
+tcas T IY S IY EY EH S
+tchaikovsky CH EY K AA V S K IY
+tchaikovsky's CH EY K AA V S K IY Z
+tchaikovsky's(2) CH AY K AA V S K IY Z
+tchaikovsky's(3) CH AY K AA F S K IY Z
+tchaikovsky(2) CH AY K AA V S K IY
+tchaikovsky(3) CH AY K AA F S K IY
+tchuruk CH UH R IH K
+te T IY
+tea T IY
+teac T IY K
+teac(2) T IY AE K
+teach T IY CH
+teachable T IY CH AH B AH L
+teacher T IY CH ER
+teacher's T IY CH ER Z
+teachers T IY CH ER Z
+teachers' T IY CH ER Z
+teaches T IY CH AH Z
+teaches(2) T IY CH IH Z
+teachey T IY CH IY
+teaching T IY CH IH NG
+teachings T IY CH IH NG Z
+teachout T IY CH AW T
+teacup T IY K AH P
+teaford T IY F AO R D
+teaford(2) T IY F ER D
+teagarden T IY G AA R D AH N
+teagle T IY G AH L
+teague T IY G
+teahan T IY AH N
+teak T IY K
+teakamp T IY K AE M P
+teakwood T IY K W UH D
+teal T IY L
+teale T IY L
+teall T IY L
+team T IY M
+team's T IY M Z
+teamed T IY M D
+teamer T IY M ER
+teaming T IY M IH NG
+teammate T IY M EY T
+teammates T IY M M EY T S
+teams T IY M Z
+teams' T IY M Z
+teamster T IY M S T ER
+teamster's T IY M S T ER Z
+teamsters T IY M S T ER Z
+teamsters' T IY M S T ER Z
+teamwork T IY M W ER K
+teaneck T IY N EH K
+teaney T IY N IY
+teapot T IY P AA T
+tear T EH R
+tear(2) T IH R
+teare T IY R
+tearful T IH R F AH L
+tearfully T IH R F AH L IY
+tearing T EH R IH NG
+tearing(2) T IH R IH NG
+tearle T AO R AH L
+tears T EH R Z
+tears(2) T IH R Z
+teary T IH R IY
+teas T IY Z
+teasdale T IY Z D EY L
+tease T IY Z
+teased T IY Z D
+teaser T IY Z ER
+teases T IY Z IH Z
+teasing T IY Z IH NG
+teasley T IY Z L IY
+teason T IY S AO N
+teaspoon T IY S P UW N
+teaspoonful T IY S P UW N F AH L
+teaspoons T IY S P UW N Z
+teast T IY S T
+teaster T IY S T ER
+teat T IY T
+teate T IY EY T
+teater T IY T ER
+teatro T IY T R OW
+teats T IY T S
+tebbe T EH B
+tebben T EH B AH N
+tebbetts T EH B IH T S
+tebbit T EH B IH T
+tebbs T EH B Z
+tebeau T IH B OW
+tebelskis T AH B EH L S K IY S
+tebo T EH B OW
+tebuthiuron T EH B AH TH Y UW R AA N
+tec T EH K
+tech T EH K
+tech's T EH K S
+techie T EH K IY
+techies T EH K IY Z
+techint T EH CH IH N T
+techint(2) T EH K IH N T
+technic T EH K N IH K
+technical T EH K N IH K AH L
+technical's T EH K N IH K AH L Z
+technicalities T EH K N IH K AE L AH T IY Z
+technicality T EH K N IH K AE L IH T IY
+technically T EH K N IH K AH L IY
+technically(2) T EH K N IH K L IY
+technicals T EH K N IH K AH L Z
+technician T EH K N IH SH AH N
+technician's T EH K N IH SH AH N Z
+technicians T EH K N IH SH AH N Z
+technicolor T EH K N IH K AH L ER
+technicon T EH K N IH K AA N
+technics T EH K N IH K S
+technique T EH K N IY K
+techniques T EH K N IY K S
+technitrol T EH K N IH T R OW L
+techno T EH K N OW
+technocrat T EH K N AH K R AE T
+technocratic T EH K N AH K R AE T IH K
+technocrats T EH K N AH K R AE T S
+technodyne T EH K N OW D AY N
+technologic T EH K N AH L AA JH IH K
+technological T EH K N AH L AA JH IH K AH L
+technologically T EH K N AH L AA JH IH K AH L IY
+technologically(2) T EH K N AH L AA JH IH K L IY
+technologies T EH K N AA L AH JH IY Z
+technologies' T EH K N AA L AH JH IY Z
+technologist T EH K N AA L AH JH IH S T
+technologists T EH K N AA L AH JH IH S T S
+technologists(2) T EH K N AA L AH JH IH S S
+technologists(3) T EH K N AA L AH JH IH S
+technology T EH K N AA L AH JH IY
+technology's T EH K N AA L AH JH IY Z
+technomic T EH K N AA M IH K
+technophobe T EH K N OW F OW B
+technophobe's T EH K N OW F OW B Z
+technophobes T EH K N OW F OW B Z
+techs T EH K S
+techsystem T EH K S IH S T AH M
+techsystems T EH K S IH S T AH M Z
+techy T EH CH IY
+teck T EH K
+teck's T EH K S
+tecla T EH K L AH
+teco T IY K OW
+tecogen T EH K OW G AH N
+tecogen(2) T EH K OW JH EH N
+tecos T IY K OW S
+tectonic T EH K T AA N IH K
+tectonics T EH K T AA N IH K S
+tecumseh T AH K AH M S AH
+ted T EH D
+ted's T EH D Z
+tedder T EH D ER
+teddie T EH D IY
+teddy T EH D IY
+teddy's T EH D IY Z
+tedeschi T EH D EH S K IY
+tedesco T EH D EH S K OW
+tedesco's T EH D EH S K OW Z
+tedford T EH D F ER D
+tedious T IY D IY AH S
+tediously T IY D IY AH S L IY
+tedium T IY D IY AH M
+tedman T EH D M AH N
+tedmond T EH D M AH N D
+tedmund T EH D M AH N D
+tedrick T EH D R IH K
+tedrow T EH D R OW
+tee T IY
+teed T IY D
+teegarden T IY G AA R D AH N
+teegardin T IY G AA R D IH N
+teehan T IY AH N
+teeing T IY IH NG
+teel T IY L
+teele T IY L
+teeley T IY L IY
+teeling T IY L IH NG
+teem T IY M
+teeming T IY M IH NG
+teems T IY M Z
+teen T IY N
+teena T IY N AH
+teenage T IY N EY JH
+teenaged T IY N EY JH D
+teenager T IY N EY JH ER
+teenager's T IY N EY JH ER Z
+teenagers T IY N EY JH ER Z
+teenie T IY N IY
+teens T IY N Z
+teensy T IY N S IY
+teeny T IY N IY
+teeple T IY P AH L
+teeples T IY P AH L Z
+teer T IH R
+tees T IY Z
+teet T IY T
+teeter T IY T ER
+teeter's T IY T ER Z
+teetered T IY T ER D
+teetering T IY T ER IH NG
+teeters T IY T ER Z
+teeth T IY TH
+teethe T IY DH
+teething T IY DH IH NG
+teets T IY T S
+teffeteller T EH F IH T EH L ER
+tefft T EH F T
+teflon T EH F L AH N
+tefra T EH F R AH
+tegeler T EH G AH L ER
+tegethoff T EH G IH T AO F
+tegge T EH G
+tegtmeier T EH T M AY ER
+tegtmeyer T EH T M AY ER
+tegucigalpa T EH G UW S IY G AE L P AH
+tegucigalpa(2) T EH G UW CH IY G AA L P AH
+tehan T EY AH N
+teheran T EH HH ER AA N
+teheran's T EH HH ER AA N Z
+teherani T EH HH ER AA N IY
+teherani's T EH HH ER AA N IY Z
+teheranis T EH HH ER AA N IY Z
+teherans T EH HH ER AA N Z
+tehran T EY R AA N
+tehran's T EY R AA N Z
+tehrani T EY R AA N IY
+tehrani's T EY R AA N IY Z
+tehranis T EY R AA N IY Z
+tehrans T EY R AA N Z
+teich T AY K
+teicher T AY K ER
+teichert T AY K ER T
+teichman T AY K M AH N
+teichmann T AY K M AH N
+teicholz T AY K HH AO L T S
+teig T IY G
+teige T AY JH
+teigen T AY G AH N
+teikoku T EY K OW K UW
+teitel T AY T AH L
+teitelbaum T AY T AH L B AW M
+teitell T AY T EH L
+teixeira T AH K S EH R AH
+tejada T EY Y AA D AH
+tejan T EY JH AH N
+tejano T EY Y AA N OW
+tejas T IY JH AH S
+tejeda T EY Y EY D AH
+tejera T EY IH R AH
+tejon T EH JH AA N
+tek T EH K
+teknowledge T EH K N AA L EH JH
+tektronix T EH K T R AA N IH K S
+tel T EH L
+tel-aviv T EH L AA V IY V
+telaction T EH L AE K SH AH N
+telamon T EH L AH M AH N
+telander T IY L AE N D ER
+telander(2) T IH L AE N D ER
+telco T EH L K OW
+tele T EH L IY
+tele(2) T EH L AH
+telecable T EH L AH K EY B AH L
+telecard T EH L AH K AA R D
+telecast T EH L AH K AE S T
+telecasts T EH L AH K AE S T S
+telecasts(2) T EH L AH K AE S S
+telecasts(3) T EH L AH K AE S
+telecharge T EH L AH CH AA R JH
+telecheck T EH L AH CH EH K
+telecom T EH L AH K AA M
+telecom's T EH L AH K AA M Z
+telecommunication T EH L AH K AH M Y UW N IH K EY SH AH N
+telecommunications T EH L AH K AH M Y UW N AH K EY SH AH N Z
+telecommunications' T EH L AH K AH M Y UW N AH K EY SH AH N Z
+telecommute T EH L AH K AH M Y UW T
+telecommuter T EH L AH K AH M Y UW T ER
+telecommuter's T EH L AH K AH M Y UW T ER Z
+telecommuters T EH L AH K AH M Y UW T ER Z
+telecommuting T EH L AH K AH M Y UW T IH NG
+telecoms T EH L AH K AA M Z
+teleconference T EH L AH K AA N F R AH N S
+teleconferencing T EH L AH K AA N F R AH N S IH NG
+teleconnect T EH L AH K AH N EH K T
+telecrafter T EH L AH K R AE F T ER
+telecredit T EH L AH K R EH D IH T
+telectron T EH L AH K T R AA N
+telectronic T EH L AH K T R AA N IH K
+telectronics T EH L AH K T R AA N IH K S
+teledesic T EH L AH D EH S IH K
+teledyne T EH L AH D AY N
+teledyne's T EH L AH D AY N Z
+teleflex T EH L AH F L EH K S
+telefon T EH L AH F AA N
+telefonica T EH L AH F AA N IH K AH
+telefonos T EH L EH F OW N OW S
+telefunken T EH L AH F AH NG K AH N
+telegenic T EH L AH JH EH N IH K
+teleglobe T EH L AH G L OW B
+telegram T EH L AH G R AE M
+telegrams T EH L AH G R AE M Z
+telegraph T EH L AH G R AE F
+telegraph's T EH L AH G R AE F S
+telegraphed T EH L AH G R AE F T
+telekom T EH L AH K AA M
+telekom's T EH L AH K AA M Z
+telemacho T EH L AH M AA CH OW
+telemanagement T EH L AH M AE N IH JH M AH N T
+telemarket T EH L AH M AA R K IH T
+telemarketer T EH L AH M AA R K IH T ER
+telemarketers T EH L AH M AA R K IH T ER Z
+telemarketing T EH L AH M AA R K AH T IH NG
+telematic T EH L AH M AE T IH K
+telematics T EH L AH M AE T IH K S
+telemecanique T EH L AH M AH K AE N IH K
+telemedia T EH L AH M IY D IY AH
+telemedicine T EH L IH M EH D IH S AH N
+telemetry T AH L EH M AH T R IY
+telemundo T EH L AH M UW N D OW
+telenet T EH L AH N EH T
+teleological T IY L IY AH L AO JH IH K AH L
+telepath T EH L AH P AE TH
+telepathic T EH L AH P AE TH AH K
+telepathy T AH L EH P AH TH IY
+telephone T EH L AH F OW N
+telephone's T EH L AH F OW N Z
+telephoned T EH L AH F OW N D
+telephones T EH L AH F OW N Z
+telephonic T EH L AH F AA N IH K
+telephonics T EH L AH F AA N IH K S
+telephoning T EH L AH F OW N IH NG
+telephoniques T EH L AH F AA N IY K S
+telephony T EH L AH F OW N IY
+telephoto T EH L AH F OW T OW
+telepicture T EH L AH P IH K CH ER
+telepictures T EH L AH P IH K CH ER Z
+teleport T EH L AH P AO R T
+teleport's T EH L AH P AO R T S
+teleprobe T EH L AH P R OW B
+teleprompter T EH L AH P R AA M P T ER
+telequest T EH L AH K W EH S T
+telerate T EH L ER EY T
+telesat T EH L AH S AE T
+telescience T EH L AH S AY AH N S
+telesciences T EH L AH S AY AH N S IH Z
+telesco T EH L EH S K OW
+telescope T EH L AH S K OW P
+telescope's T EH L AH S K OW P S
+telescopes T EH L AH S K OW P S
+telescopic T EH L AH S K AO P IH K
+telescript T EH L AH S K R IH P T
+telesis T EH L AH S IH S
+telesis' T EH L AH S IH S
+telesis's T EH L AH S IH S IH Z
+telesphere T EH L AH S F IH R
+telestrator T EH L AH S T R EY T ER
+telesystem T EH L AH S IH S T AH M
+teletext T EH L AH T EH K S T
+telethon T EH L AH TH AA N
+teletron T EH L AH T R AA N
+telettra T EH L EH T R AH
+teletype T EH L AH T AY P
+teletypes T EH L AH T AY P S
+televangelist T EH L AH V AE N JH AH L AH S T
+televangelists T EH L AH V AE N JH AH L AH S T S
+televangelists(2) T EH L AH V AE N JH AH L AH S S
+televangelists(3) T EH L AH V AE N JH AH L AH S
+televideo T EH L AH V IH D IY OW
+televisa T EH L AH V IY Z AH
+televisa's T EH L AH V IY Z AH Z
+televise T EH L AH V AY Z
+televised T EH L AH V AY Z D
+televising T EH L AH V AY Z IH NG
+television T EH L AH V IH ZH AH N
+television's T EH L AH V IH ZH AH N Z
+televisions T EH L AH V IH ZH AH N Z
+televison T EH L IH V IH ZH AH N
+telewest T EH L AH W EH S T
+telex T EH L EH K S
+telex's T EH L EH K S IH Z
+telexed T EH L EH S K T
+telexes T EH L EH K S IH S
+telfair T EH L F AY R
+telfer T EH L F ER
+telfor T EH L F ER
+telford T EH L F ER D
+telfour T EH L F ER
+telit T EH L IH T
+tell T EH L
+tellabs T EH L AE B Z
+tellefsen T EH L IH F S AH N
+tellep T EH L AH P
+teller T EH L ER
+teller's T EH L ER Z
+tellers T EH L ER Z
+telles T EH L Z
+tellez T EY L EH Z
+tellier T EH L IY ER
+tellin' T EH L IH N
+telling T EH L IH NG
+tellingly T EH L IH NG L IY
+tellis T EH L IH S
+tello T EH L OW
+tells T EH L Z
+telltale T EH L T EY L
+telltales T EH L T EY L Z
+telluride T EH L Y ER AY D
+tellurides T EH L Y ER AY D Z
+tellurium T EH L UH R IY AH M
+telly T EH L IY
+telmex T EH L M EH K S
+telmex's T EH L M EH K S IH Z
+telomerase T AH L OW M ER EY Z
+telomere T EH L AH M IY R
+telomeres T EH L AH M IY R Z
+telos T EH L OW S
+telsource T EH L S AO R S
+telstar T EH L S T AA R
+telstra T EH L S T R AH
+teltschik T EH L CH IH K
+telugu T EH L UH G UW
+telustrator T EH L AH S T R EY T ER
+telustrator(2) T EH L Y AH S T R EY T ER
+telxon T EH L Z AA N
+telxon's T EH L Z AH N Z
+telzrow T EH L Z R OW
+temblor T EH M B L ER
+temblors T EH M B L ER Z
+temco T EH M K OW
+temecula T AH M EH K Y AH L AH
+temerity T AH M EH R AH T IY
+temerlin T EH M ER L IH N
+temerous T EH M ER AH S
+temkin T EH M K IH N
+temme T EH M
+temp T EH M P
+tempe T EH M P IY
+tempel T EH M P AH L
+tempelsman T EH M P AH L Z M AH N
+temper T EH M P ER
+tempera T EH M P ER AH
+temperament T EH M P R AH M AH N T
+temperament(2) T EH M P ER M AH N T
+temperamental T EH M P R AH M EH N T AH L
+temperamental(2) T EH M P ER M EH N T AH L
+temperamentally T EH M P R AH M EH N T AH L IY
+temperamentally(2) T EH M P ER M EH N T AH L IY
+temperamentally(3) T EH M P R AH M EH N AH L IY
+temperamentally(4) T EH M P ER M EH N AH L IY
+temperaments T EH M P R AH M AH N T S
+temperaments(2) T EH M P ER M AH N T S
+temperance T EH M P ER AH N S
+temperance(2) T EH M P R AH N S
+temperate T EH M P R AH T
+temperate(2) T EH M P ER AH T
+temperature T EH M P R AH CH ER
+temperature(2) T EH M P ER AH CH ER
+temperatures T EH M P R AH CH ER Z
+temperatures(2) T EH M P ER AH CH ER Z
+tempered T EH M P ER D
+tempering T EH M P ER IH NG
+tempers T EH M P ER Z
+tempest T EH M P AH S T
+tempesta T EH M P EH S T AH
+tempestuous T EH M P EH S CH UW AH S
+templar T EH M P L ER
+templars T EH M P L ER Z
+template T EH M P L AH T
+template(2) T EH M P L EY T
+temple T EH M P AH L
+temple's T EH M P AH L Z
+templeman T EH M P AH L M AH N
+templer T EH M P AH L ER
+templer(2) T EH M P L ER
+templers T EH M P AH L ER Z
+templers(2) T EH M P L ER Z
+temples T EH M P AH L Z
+templet T EH M P L IH T
+templeton T EH M P AH L T AH N
+templeton's T EH M P AH L T AH N Z
+templin T EH M P L IH N
+tempo T EH M P OW
+temporal T EH M P ER AH L
+temporally T EH M P ER AH L IY
+temporaries T EH M P ER EH R IY Z
+temporarily T EH M P ER EH R AH L IY
+temporary T EH M P ER EH R IY
+tempore T EH M P AO R
+tempore(2) T EH M P AO R IY
+temporize T EH M P ER AY Z
+temporizing T EH M P ER AY Z IH NG
+tempos T EH M P OW Z
+temps T EH M P S
+tempt T EH M P T
+temptation T EH M T EY SH AH N
+temptations T EH M T EY SH AH N Z
+tempted T EH M P T AH D
+tempted(2) T EH M P T IH D
+tempting T EH M P T IH NG
+temptress T EH M P T R IH S
+tempts T EH M P T S
+ten T EH N
+ten's T EH N Z
+tena T EH N AH
+tenable T EH N AH B AH L
+tenacious T AH N EY SH AH S
+tenaciously T AH N EY SH AH S L IY
+tenacity T AH N AE S IH T IY
+tenaglia T EH N AA G L IY AH
+tenancy T EH N AH N S IY
+tenant T EH N AH N T
+tenant's T EH N AH N T S
+tenants T EH N AH N T S
+tenants' T EH N AH N T S
+tenbrink T EH N B R IH NG K
+tench T EH N CH
+tencza T EH N CH AH
+tend T EH N D
+tended T EH N D AH D
+tended(2) T EH N D IH D
+tendencies T EH N D AH N S IY Z
+tendency T EH N D AH N S IY
+tendentious T EH N D EH N SH AH S
+tender T EH N D ER
+tendered T EH N D ER D
+tendering T EH N D ER IH NG
+tenderloin T EH N D ER L OY N
+tenderly T EH N D ER L IY
+tenderness T EH N D ER N AH S
+tenders T EH N D ER Z
+tending T EH N D IH NG
+tendler T EH N D L ER
+tendon T EH N D AH N
+tendons T EH N D AH N Z
+tends T EH N D Z
+tenebrous T EH N AH B R AH S
+tenement T EH N AH M AH N T
+tenements T EH N AH M AH N T S
+tenenbaum T EH N AH N B AW M
+tener T EH N ER
+tenera T EH N EH R AH
+tenet T EH N AH T
+tenets T EH N AH T S
+teneyck T EH N IY K
+tenfold T EH N F OW L D
+teng T EH NG
+teng-wen T EH NG W EH N
+tengelmann T EH NG G AH L M AH N
+tengiz T EH NG G IH Z
+tenglemann T EH NG G AH L M AH N
+tenn T EH N AH S IY
+tenn(2) T EH N
+tennant T EH N AH N T
+tenncare T EH N K EH R
+tenncare's T EH N K EH R Z
+tenneco T EH N AH K OW
+tenneco's T EH N AH K OW Z
+tennell T EH N AH L
+tennenbaum T EH N AH N B AW M
+tennent T EH N AH N T
+tenner T EH N ER
+tennessean T EH N IH S IY AH N
+tennesseans T EH N IH S IY AH N Z
+tennessee T EH N AH S IY
+tennessee's T EH N AH S IY Z
+tenney T EH N IY
+tennis T EH N AH S
+tennis's T EH N AH S IH Z
+tennis(2) T EH N IH S
+tennison T EH N IH S AH N
+tenny T EH N IY
+tennyson T EH N IH S AH N
+tenor T EH N ER
+tenore T EH N AO R
+tenorio T EH N AO R IY OW
+tenors T EH N ER Z
+tenpas T EH N P AH Z
+tenpenny T EH N P EH N IY
+tenrecs T EH N R EH K S
+tens T EH N Z
+tense T EH N S
+tensely T EH N S L IY
+tensile T EH N S AH L
+tensiometer T EH N S IY AA M IH T ER
+tension T EH N SH AH N
+tensions T EH N CH AH N Z
+tent T EH N T
+tentacle T EH N T AH K AH L
+tentacles T EH N T AH K AH L Z
+tentative T EH N T AH T IH V
+tentative(2) T EH N AH T IH V
+tentatively T EH N T AH T IH V L IY
+tentatively(2) T EH N T AH V L IY
+tenth T EH N TH
+tenths T EH N TH S
+tenting T EH N T IH NG
+tents T EH N T S
+tenuous T EH N Y AH W AH S
+tenure T EH N Y ER
+tenured T EH N Y ER D
+tenures T EH N Y ER Z
+tenuta T EH N UW T AH
+tenzer T EH N Z ER
+teo T EY OW
+teodoro T IY OW D AO R OW
+tepe T IY P
+teper T IY P ER
+tepid T EH P IH D
+teply T EH P L IY
+tepoztlan T IH P AO S T L AH N
+tepper T EH P ER
+tepperman T EH P ER M AH N
+tequila T AH K IY L AH
+tequiliu T AH K IY L Y UW
+ter T ER
+terada T ER AA D AH
+teradata T EH R AH D AA T AH
+teradyne T EH R AH D AY N
+teradyne's T EH R AH D AY N Z
+teran T EH R AH N
+terasawa T EH R AH S AA W AH
+terbush T ER B AH SH
+terbush(2) T ER B UH SH
+tercel T ER S AH L
+tercero T ER CH EH R OW
+terence T EH R AH N S
+terence's T EH R AH N S IH Z
+terentia T ER EH N SH AH
+teresa T ER IY S AH
+teresa's T ER IY S AH Z
+teresa's(2) T ER EY S AH Z
+teresa(2) T ER EY S AH
+terese T EH R IY Z
+teresi T ER EH S IY
+teresita T ER EH S IY T AH
+teressa T ER EH S AH
+terex T EH R AH K S
+tereza T ER EY Z AH
+tereza's T ER EY Z AH Z
+terhaar T ER HH AA R
+terhorst T ER HH AO R S T
+terhune T ER HH Y UW N
+teri T EH R IY
+teriyaki T EH R IH Y AA K IY
+terkel T ER K AH L
+terkhorn T ER K AO R N
+terlecki T ER L EH T S K IY
+terlizzi T ER L IY T S IY
+term T ER M
+term's T ER M Z
+terman T ER M AH N
+termed T ER M D
+termeer T ER M IH R
+termer T ER M ER
+termers T ER M ER Z
+terminable T ER M AH N AH B AH L
+terminal T ER M AH N AH L
+terminally T ER M AH N AH L IY
+terminals T ER M AH N AH L Z
+terminate T ER M AH N EY T
+terminated T ER M AH N EY T AH D
+terminated(2) T ER M AH N EY T IH D
+terminates T ER M IH N EY T S
+terminating T ER M AH N EY T IH NG
+termination T ER M AH N EY SH AH N
+terminations T ER M AH N EY SH AH N Z
+terminator T ER M AH N EY T ER
+termine T ER M IH N
+terming T ER M IH NG
+termini T ER M IH N AY
+terminology T ER M IH N AA L AH JH IY
+termite T ER M AY T
+termites T ER M AY T S
+terms T ER M Z
+ternes T ER N Z
+terns T ER N Z
+terpening T ER P AH N IH NG
+terpsichorde T ER P S IH K AO R D
+terpstra T EH R P S T R AH
+terra T EH R AH
+terra's T EH R AH Z
+terracciano T ER AA CH IY AA N OW
+terrace T EH R AH S
+terraced T EH R AH S T
+terraces T EH R AH S AH Z
+terraces(2) T EH R AH S IH Z
+terrain T ER EY N
+terrains T ER EY N Z
+terral T EH R AH L
+terrana T ER AE N AH
+terrance T EH R AH N S
+terrano T ER AA N OW
+terranova T ER AA N OW V AH
+terrasi T ER AA S IY
+terrazas T EH R AA Z AA Z
+terre T EH R AH
+terre(2) T EH R
+terre-haute T EH R AH HH OW T
+terre-haute(2) T EH R AH HH AH T
+terrebonne T ER EH B OW N IY
+terrebonne(2) T ER AH B AH N
+terrel T EH R AH L
+terrell T EH R AH L
+terrence T EH R AH N S
+terrestrial T ER EH S T R IY AH L
+terri T EH R IY
+terrible T EH R AH B AH L
+terribly T EH R AH B L IY
+terrie T EH R IY
+terrien T EH R IY AH N
+terrier T EH R IY ER
+terriers T EH R IY ER Z
+terrific T ER IH F IH K
+terrifically T ER IH F IH K L IY
+terrified T EH R AH F AY D
+terrifies T EH R AH F AY Z
+terrify T EH R AH F AY
+terrifying T EH R AH F AY IH NG
+terrile T EH R IY L
+terrill T EH R AH L
+terrington T EH R IH NG T AH N
+terrio T EH R IY OW
+terris T EH R IH S
+territo T ER IY T OW
+territorial T EH R IH T AO R IY AH L
+territorialism T EH R AH T AO R IY AH L IH Z AH M
+territorially T EH R IH T AO R IY AH L IY
+territories T EH R AH T AO R IY Z
+territory T EH R IH T AO R IY
+territory's T EH R IH T AO R IY Z
+terrizzi T EH R IH T S IY
+terrones T EH R AH N Z
+terror T EH R ER
+terrorism T EH R ER IH Z AH M
+terrorist T EH R ER IH S T
+terroristic T EH R ER IH S T IH K
+terrorists T EH R ER AH S T S
+terrorists' T EH R ER IH S T S
+terrorists'(2) T EH R ER IH S S
+terrorists'(3) T EH R ER IH S
+terrorists(2) T EH R ER IH S T S
+terrorists(3) T EH R ER IH S S
+terrorists(4) T EH R ER IH S
+terrorize T EH R ER AY Z
+terrorized T EH R ER AY Z D
+terrorizes T EH R ER AY Z IH Z
+terrorizing T EH R ER AY Z IH NG
+terrors T EH R ER Z
+terry T EH R IY
+terry's T EH R IY Z
+terse T ER S
+tersely T ER S L IY
+terseness T ER S N AH S
+tertia T EH R SH AH
+tertiary T ER SH ER IY
+tertiary(2) T ER SH IY EH R IY
+tertius T ER T IY IH S
+tertius(2) T ER SH Y IH S
+teruko T EH R UW K OW
+teruya T EH R UW Y AH
+tervo T EH R V OW
+terwilliger T ER W IH L IH G ER
+terzian T ER Z IY AH N
+tesar T IH S AA R
+tesch T EH SH
+teschner T EH SH N ER
+tesco T EH S K OW
+tese T IY S
+tesh T EH SH
+teska T EH S K AH
+teske T EH S K
+tesla T EH S L AH
+tesla(2) T EH Z L AH
+tesler T EH S AH L ER
+tesler(2) T EH S L ER
+teslik T EH S L IH K
+tesmer T EH S AH M ER
+tesobono T EH S AH B OW N OW
+tesobonos T EH S AH B OW N OW S
+tesobonos(2) T EH S AH B OW N OW Z
+tesol T IY S AO L
+tesoriero T EH S AO R IH R OW
+tesoro T EH S AO R OW
+tesoro's T EH S AO R OW Z
+tess T EH S
+tessa T EH S AH
+tesselate T EH S AH L EY T
+tesselated T EH S AH L EY T IH D
+tessick T EH S IH K
+tessie T EH S IY
+tessier T EH S IY ER
+tessitore T EH S IY T AO R IY
+tessler T EH S L ER
+tessman T EH S M AH N
+tessmer T EH S M ER
+tessy T EH S IY
+test T EH S T
+test's T EH S T S
+testa T EH S T AH
+testament T EH S T AH M AH N T
+testamentary T EH S T AH M EH N T ER IY
+testaments T EH S T AH M AH N T S
+tested T EH S T AH D
+tested(2) T EH S T IH D
+tester T EH S T ER
+testerman T EH S T ER M AH N
+testers T EH S T ER Z
+testers(2) T EH S T AH Z
+testes T EH S T IY Z
+testes(2) T EH S T S
+testicle T EH S T IH K AH L
+testicles T EH S T IH K AH L Z
+testicular T EH S T IH K Y AH L ER
+testified T EH S T AH F AY D
+testifies T EH S T AH F AY Z
+testify T EH S T AH F AY
+testifying T EH S T AH F AY IH NG
+testily T EH S T AH L IY
+testimonial T EH S T AH M OW N IY AH L
+testimonials T EH S T AH M OW N IY AH L Z
+testimonies T EH S T AH M OW N IY Z
+testimony T EH S T AH M OW N IY
+testing T EH S T IH NG
+teston T EH S T AH N
+testor T EH S T ER
+testosterone T EH S T AA S T ER OW N
+testrake T EH S T R EY K
+tests T EH S T S
+tests' T EH S T S
+testuro T EH S T UH R OW
+testy T EH S T IY
+tet T EH T
+teta T EH T AH
+tetanus T EH T AH N AH S
+tete T EH T
+teter T IY T ER
+teters T IY T ER Z
+tether T EH DH ER
+tethered T EH DH ER D
+tethers T EH DH ER Z
+teti T EH T IY
+tetley T EH T L IY
+tetlow T EH T L OW
+teton T IY T AH N
+teton(2) T IY T AA N
+tetons T IY T AH N Z
+tetons(2) T IY T AA N Z
+tetra T EH T R AH
+tetrads T EH T R AE D Z
+tetrahedral T EH T R AH HH IY D R AH L
+tetrahedron T EH T R AH HH IY D R AH N
+tetramerous T EH T R AE M ER AH S
+tetrault T EH T R AW L T
+tetravalent T EH T R AH V EY L AH N T
+tetreault T IH T R OW
+tetrick T EH T R IH K
+tetro T EH T R OW
+tetsuji T EH T S UW JH IY
+tetsuo T EH T S UW OW
+tettamanti T EH T AH M AE N T IY
+tetterton T EH T ER T AH N
+tetzlaff T EH T Z L AH F
+tetzloff T EH T Z L AO F
+teuber T OY B ER
+teubner T OY B N ER
+teufel T OY F AH L
+teuscher T OY SH ER
+teutonic T UW T AO N IH K
+teutsch T OY CH
+teva T EY V AH
+tevatron T EH V AH T R AA N
+teves T IY V Z
+tevis T EH V IH S
+tevlin T EH V L IH N
+tevye T EH V IY
+tew CH UW
+tew(2) T UW
+tew(3) T IY IY D AH B AH L Y UW
+tewell T EH W EH L
+tewes CH UW Z
+tewksbury T UW K S B ER IY
+tews CH UW Z
+tex T EH K S
+texaco T EH K S AH K OW
+texaco's T EH K S AH K OW Z
+texan T EH K S AH N
+texan's T EH K S AH N Z
+texans T EH K S AH N Z
+texarkana T EH K S AA R K AE N AH
+texas T EH K S AH S
+texas' T EH K S AH S IH Z
+texas'(2) T EH K S AH S
+texas's T EH K S AH S AH Z
+texas's(2) T EH K S AH S IH Z
+texasgulf T EH K S AH S G AH L F
+texeira T EY K S EH R AH
+texfi T EH K S F IY
+texpool T EH K S P UW L
+texscan T EH K S K AE N
+texstar T EH K S T AA R
+texstyrene T EH K S T AY R IY N
+text T EH K S T
+textbook T EH K S T B UH K
+textbooks T EH K S T B UH K S
+texter T EH K S T ER
+textile T EH K S T AY L
+textiles T EH K S T AY L Z
+textor T EH K S T ER
+textron T EH K S T R AA N
+textron's T EH K S T R AA N Z
+texts T EH K S T S
+textual T EH K S CH AH W AH L
+texture T EH K S CH ER
+textured T EH K S CH ER D
+textures T EH K S CH ER Z
+tezak T EH Z AH K
+tezeno T EY Z EY N OW
+th T IY EY CH
+thabo TH EY B OW
+thach TH AE CH
+thacher TH AE K ER
+thacker TH AE K ER
+thackeray TH AE K ER IY
+thackery's TH AE K ER IY Z
+thackston TH AE K S T AH N
+thad TH AE D
+thada TH AA D AH
+thadda TH AE D AH
+thaddea TH AE D IY AH
+thaddeus TH AE D IY AH S
+thaden TH EY D AH N
+thagard TH AE G ER D
+thaggard TH AE G ER D
+thai T AY
+thai's T AY Z
+thailand T AY L AE N D
+thailand's T AY L AE N D Z
+thain TH EY N
+thaine TH EY N
+thais T AY Z
+thakkar TH AE K ER
+thal TH AE L
+thalacker TH AE L AH K ER
+thalamus TH AE L AH M AH S
+thalassa TH AA L AA S AH
+thaler TH EY L ER
+thalheimer TH AE L HH AY M ER
+thalia TH EY L Y AH
+thalia's TH EY L Y AH Z
+thalidomide TH AH L IH D AH M AY D
+thalidomide's TH AH L IH D AH M AY D Z
+thall TH AO L
+thallium TH AE L IY AH M
+thalman TH AE L M AH N
+thalmann TH AO L M AH N
+tham TH AE M
+thames T EH M Z
+than DH AE N
+than(2) DH AH N
+thanatology TH AE N AH T AO L AH JH IY
+thane TH EY N
+thang TH AE NG
+thanh TH AE N
+thank TH AE NG K
+thank's TH AE NG K S
+thanked TH AE NG K T
+thankful TH AE NG K F AH L
+thankfully TH AE NG K F AH L IY
+thanking TH AE NG K IH NG
+thankless TH AE NG K L AH S
+thanks TH AE NG K S
+thanksgiving TH AE NG K S G IH V IH NG
+thankyou TH AE NG K Y UW
+thano TH AA N OW
+thanos TH AA N OW S
+thao DH AW
+thar TH AA R
+tharp TH AA R P
+tharpe TH AA R P
+tharpe's TH AA R P S
+tharrington TH AE R IH NG T AH N
+thaser TH EY Z ER
+thassos TH AE S OW S
+that DH AE T
+that'd DH AE T IH D
+that'll DH AE T AH L
+that's DH AE T S
+that've DH AE T AH V
+that(2) DH AH T
+thatch TH AE CH
+thatched TH AE CH T
+thatcher TH AE CH ER
+thatcher's TH AE CH ER Z
+thatcherism TH AE CH ER IH Z AH M
+thatcherite TH AE CH ER AY T
+thatchers TH AE CH ER Z
+thatches TH AE CH IH Z
+thau DH AW
+thaw TH AO
+thawed TH AO D
+thawing TH AO IH NG
+thaws TH AO Z
+thaxter TH AE K S T ER
+thaxter's TH AE K S T ER Z
+thaxton TH AE K S T AH N
+thaxton's TH AE K S T AH N Z
+thayer TH EY ER
+thayer's TH EY ER Z
+thayers TH EY ER Z
+thayne TH EY N
+the DH AH
+the(2) DH IY
+thea TH IY AH
+theall TH IY L
+theano TH IY N OW
+theater TH IY AH T ER
+theater's TH IY AH T ER Z
+theatergoer TH IY T ER G OW ER
+theatergoer(2) TH IY IH T ER G OW ER
+theatergoers TH IY T ER G OW ER Z
+theatergoers(2) TH IY IH T ER G OW ER Z
+theaters TH IY AH T ER Z
+theatre TH IY AH T ER
+theatre's TH IY AH T ER Z
+theatres TH IY AH T ER Z
+theatric TH IY T R IH K
+theatrical TH IY AE T R IH K AH L
+theatricality TH IY AE T R AH K AE L AH T IY
+theatrically TH IY AE T R IH K AH L IY
+theatrically(2) TH IY AE T R IH K L IY
+theatrics TH IY T R IH K S
+thebeau TH IH B OW
+theberge TH EH B ER JH
+thebes TH IY B Z
+thecla TH EH K L AH
+theda TH IY D AH
+theda's TH IY D AH Z
+thede TH IY D
+thedford TH EH D F ER D
+thee DH IY
+theel TH IY L
+theft TH EH F T
+thefts TH EH F T S
+theil TH AY L
+theile TH AY L
+theilen TH AY L AH N
+theiler TH AY L ER
+thein TH AY N
+their DH EH R
+theirs DH EH R Z
+theirself DH EH R S EH L F
+theirselves DH EH R S EH L V Z
+theis DH AY Z
+theisen TH AY S AH N
+theism TH IY IH Z AH M
+theiss TH AY S
+theissen TH AY S AH N
+thekla TH EH K L AH
+thelander TH EH L AH N D ER
+thelen TH EH L AH N
+thelin TH EH L IH N
+thelma TH EH L M AH
+thelma's TH EH L M AH Z
+thelonius TH IH L OW N IY AH S
+them DH EH M
+them(2) DH AH M
+thematic TH IY M AE T IH K
+thematically TH AH M AE T IH K L IY
+theme TH IY M
+themed TH IY M D
+themes TH IY M Z
+theming TH IY M IH NG
+themself DH EH M S EH L F
+themself(2) DH AH M S EH L F
+themselves DH EH M S EH L V Z
+themselves(2) DH AH M S EH L V Z
+then DH EH N
+thence DH EH N S
+thenceforth DH EH N S F AO R TH
+theo TH IY OW
+theo's TH IY OW Z
+theobald TH IY AH B AH L D
+theocracy TH IY AA K R AH S IY
+theocratic TH IY AH K R AE T IH K
+theodor TH IY AH D ER
+theodora TH IY AH D AO R AH
+theodore TH IY AH D AO R
+theodorou TH IY AH D ER UW
+theodric TH IY AH D R IH K
+theola TH IY AH L AH
+theologian TH IY AH L OW JH IY AH N
+theologians TH IY AH L OW JH AH N Z
+theological TH IY AH L AA JH IH K AH L
+theologically TH IY AH L AA JH IH K L IY
+theology TH IY AA L AH JH IY
+theon TH IY AH N
+theone TH IY AA N
+theophania TH IY AH F AE N IY AH
+theophila TH EY AH F IY L AH
+theora TH IY ER AH
+theorem TH IH R AH M
+theoretical TH IY ER EH T IH K AH L
+theoretically TH IY ER EH T IH K AH L IY
+theoretically(2) TH IY ER EH T IH K L IY
+theoretician TH IY ER AH T IH SH AH N
+theoreticians TH IY ER AH T IH SH AH N Z
+theories TH IH R IY Z
+theories(2) TH IY ER IY Z
+theorist TH IY ER IH S T
+theorists TH IY ER IH S T S
+theorists(2) TH IY ER IH S S
+theorists(3) TH IY ER IH S
+theorize TH IY ER AY Z
+theorized TH IY ER AY Z D
+theorizes TH IY ER AY Z IH Z
+theorizing TH IY ER AY Z IH NG
+theory TH IH R IY
+theory's TH IH R IY Z
+theory's(2) TH IY ER IY Z
+theory(2) TH IY ER IY
+thera TH EH R AH
+therafectin TH EH R AH F EH K T IH N
+therani T EH R AA N IY
+therapeutic TH EH R AH P Y UW T IH K
+therapeutically TH EH R AH P Y UW T IH K AH L IY
+therapeutically(2) TH EH R AH P Y UW T IH K L IY
+therapeutics TH EH R AH P Y UW T IH K S
+therapies TH EH R AH P IY Z
+therapist TH EH R AH P AH S T
+therapist's TH EH R AH P AH S T S
+therapist's(2) TH EH R AH P IH S T S
+therapist(2) TH EH R AH P IH S T
+therapists TH EH R AH P IH S T S
+therapists's TH EH R AH P IH S T S
+therapists's(2) TH EH R AH P IH S S
+therapists(2) TH EH R AH P IH S S
+therapists(3) TH EH R AH P IH S
+therapy TH EH R AH P IY
+there DH EH R
+there'd DH EH R D
+there'll DH EH R AH L
+there're DH EH R ER
+there's DH EH R Z
+there've DH EH R V
+thereabouts DH EH R AH B AW T S
+thereafter DH EH R AE F T ER
+thereby DH EH R B AY
+therefore DH EH R F AO R
+therein DH EH R IH N
+thereof DH EH R AH V
+thereon DH EH R AO N
+theresa T ER IY S AH
+theresa's T ER IY S AH Z
+theresa's(2) T ER EY S AH Z
+theresa(2) T ER EY S AH
+therese TH EH R IY S
+thereupon DH EH R AH P AA N
+theriault TH EH R IY OW
+therien TH IH R IY N
+theriot TH IH R IY AA T
+therm TH ER M
+thermae TH ER M IY
+thermal TH ER M AH L
+thermco TH ER M K OW
+thermedics TH ER M EH D IH K S
+thermits TH ER M IH T S
+thermo TH ER M OW
+thermometer TH ER M AA M AH T ER
+thermometers TH ER M AA M AH T ER Z
+thermonuclear TH ER M OW N UW K L IY ER
+thermopatch TH ER M OW P AE CH
+thermoplastic TH ER M AH P L AE S T IH K
+thermoplastics TH ER M AH P L AE S T IH K S
+thermos TH ER M AH S
+thermosetting TH ER M OW S EH T IH NG
+thermostat TH ER M AH S T AE T
+thermostats TH ER M AH S T AE T S
+theron TH EH R AH N
+theroux TH ER UW
+therrell TH EH R AH L
+therriault TH EH R IY OW
+therrien TH EH R IY N
+thesaurus TH AH S AO R AH S
+these DH IY Z
+theses TH IY S IY Z
+thesing DH IY Z IH NG
+thesing(2) TH IY S IH NG
+thesis TH IY S AH S
+thespian TH EH S P IY AH N
+theta TH EY T AH
+thetford TH EH T F ER D
+thetis TH IY T AH S
+theurer TH ER ER
+theus DH Y UW Z
+thew TH UW
+thewlis TH Y UW L IH S
+they DH EY
+they'd DH EY D
+they'll DH EY L
+they're DH EH R
+they've DH EY V
+thi TH IY
+thiamin TH AY AH M AH N
+thibadeau T IH B AH D OW
+thibault TH IH B OW
+thibeau TH IH B OW
+thibeault T IY B OW
+thibeaux TH IH B OW
+thibedeau TH IH B IH D OW
+thibert TH IH B ER T
+thibodeau TH IH B AH D OW
+thibodeaux TH IH B AH D OW
+thick TH IH K
+thicken TH IH K AH N
+thickened TH IH K AH N D
+thickener TH IH K AH N ER
+thickening TH IH K AH N IH NG
+thickening(2) TH IH K N IH NG
+thickens TH IH K AH N Z
+thicker TH IH K ER
+thickest TH IH K IH S T
+thicket TH IH K IH T
+thickets TH IH K AH T S
+thickhead TH IH K HH EH D
+thickly TH IH K L IY
+thickness TH IH K N AH S
+thiebaud TH IY B OW
+thiede TH IY D
+thief TH IY F
+thief's TH IY F S
+thiel TH IY L
+thiele TH IY L
+thielemann TH IY L M AH N
+thielen TH IY L AH N
+thielke TH IY L K
+thielman TH IY L M AH N
+thielsch TH IY L SH
+thiem TH IY M
+thieman TH IY M AH N
+thiemann TH IY M AH N
+thieme TH IY M
+thien TH IY N
+thier TH IY ER
+thierry TH IH R IY
+thiery TH IH R IY
+thies TH IY Z
+thiesen TH IY S AH N
+thiessen TH IY S AH N
+thievery TH IY V ER IY
+thieves TH IY V Z
+thieves' TH IY V Z
+thieving TH IY V IH NG
+thigh TH AY
+thighs TH AY Z
+thigpen TH IH G P AH N
+thill TH IH L
+thima TH IY M AH
+thimble TH IH M B AH L
+thin TH IH N
+thine DH AY N
+thing TH IH NG
+thing's TH IH NG Z
+thingamabob TH IH NG AH M AH B AA B
+things TH IH NG Z
+things' TH IH NG Z
+thingy TH IH NG IY
+think TH IH NG K
+think's TH IH NG K S
+thinker TH IH NG K ER
+thinkers TH IH NG K ER Z
+thinkin TH IH NG K IH N
+thinkin' TH IH NG K IH N
+thinking TH IH NG K IH NG
+thinkpad TH IH NG K P AE D
+thinks TH IH NG K S
+thinly TH IH N L IY
+thinned TH IH N D
+thinner TH IH N ER
+thinnes TH IH N Z
+thinnes(2) TH IH N IH Z
+thinness TH IH N N IH S
+thinness(2) TH IH N IH S
+thinnest TH IH N IH S T
+thinning TH IH N IH NG
+thins TH IH N Z
+thiodiglycol TH AY OW D IH G L IH K AA L
+thiodiglycol(2) TH AY OW D IH G L AY K AA L
+thiokol TH AY AH K AO L
+thiokol's TH AY AH K AO L Z
+third TH ER D
+third's TH ER D Z
+thirdly TH ER D L IY
+thirdquarter TH ER D K W AO R T ER
+thirdquarter(2) TH ER D K AO R T ER
+thirds TH ER D Z
+thirst TH ER S T
+thirsty TH ER S T IY
+thirteen TH ER T IY N
+thirteen's TH ER T IY N Z
+thirteenth TH ER T IY N TH
+thirteenths TH ER T IY N TH S
+thirties TH ER T IY Z
+thirtieth TH ER T IY AH TH
+thirtieth(2) TH ER T IY IH TH
+thirty TH ER D IY
+thirty's TH ER D IY Z
+thirty's(2) TH ER T IY Z
+thirty(2) TH ER T IY
+thirtysomething TH ER T IY S AH M TH IH NG
+thiry TH IH R IY
+thirza TH ER Z AH
+this DH IH S
+this'll DH IH S AH L
+thissen TH IH S AH N
+thistle TH IH S AH L
+thistles TH IH S AH L Z
+thivierge TH IH V Y EH R ZH
+tho DH OW
+thobe TH OW B
+thode TH OW D
+thoele TH OW L
+thoen TH OW N
+thoene TH AA IY N
+thoennes TH OW N Z
+thole TH OW L
+tholen TH AA L AH N
+tholl TH AA L
+thom T AA M
+thoma TH OW M AH
+thoma(2) T OW M AH
+thoman TH OW M AH N
+thomann DH OW M AH N
+thomas T AA M AH S
+thomas' T AA M AH S IH Z
+thomas'(2) T AA M AH S
+thomas's T AA M AH S IH Z
+thomasas T AA M AH S AH S
+thomases T AA M AH S IH Z
+thomasina TH OW M AA S IY N AH
+thomasina(2) T AA M AA S IY N AH
+thomasine TH OW M AA S IY N IY
+thomasine(2) T AA M AA S IY N IY
+thomasine(3) T AA M AA S IY N
+thomason TH AA M AH S AH N
+thomason(2) T AA M AH S AH N
+thomassen TH AA M AH S AH N
+thomassen(2) T AA M AH S AH N
+thomasson TH AA M AH S AH N
+thomasson(2) T AA M AH S AH N
+thomasville T AA M AH S V IH L
+thome TH OW M
+thomes TH OW M Z
+thometz TH OW M EH T S
+thomison TH AA M IH S AH N
+thomley TH AA M L IY
+thommen TH AA M AH N
+thomp TH AA M P
+thompkins T AA M P K IH N Z
+thompkins(2) T AA M K IH N Z
+thompsen T AA M P S AH N
+thompsen(2) T AA M S AH N
+thompson T AA M P S AH N
+thompson's T AA M P S AH N Z
+thompson's(2) T AA M S AH N Z
+thompson(2) T AA M S AH N
+thompsons T AA M P S AH N Z
+thompsons(2) T AA M S AH N Z
+thoms TH AA M Z
+thomsen TH AA M S AH N
+thomson T AA M S AH N
+thomson's T AA M S AH N Z
+thomspon TH AA M S P AH N
+thomure TH AA M Y UW R
+thon TH AA N
+thone TH OW N
+thong TH AO NG
+thor TH AO R
+thora TH AO R AH
+thoracic TH AO R AE S IH K
+thorald TH AO R AH L D
+thorax TH AO R AE K S
+thorbert TH AO R B ER T
+thorberta TH AO R B EH R T AH
+thorburn TH AO R B ER N
+thordia TH AO R D IY AH
+thordis TH AO R D IH S
+thoreau TH ER OW
+thorell TH AO R AH L
+thoren TH AO R AH N
+thoresen TH AO R IY Z AH N
+thoreson TH AO R IH S AH N
+thorington TH AO R IH NG T AH N
+thorium TH AA R IY AH M
+thorley TH AO R L IY
+thorman TH AO R M AH N
+thormond TH AO R M AH N D
+thormund TH AO R M AH N D
+thorn TH AO R N
+thorn's TH AO R N Z
+thornberg TH AO R N B ER G
+thornberry TH AO R N B EH R IY
+thornberry's TH AO R N B EH R IY Z
+thornberrys TH AO R N B EH R IY Z
+thornburg TH AO R N B ER G
+thornburg's TH AO R N B ER G Z
+thornburgh TH AO R N B ER G
+thornburgh's TH AO R N B ER G Z
+thornburghs TH AO R N B ER G Z
+thornburgs TH AO R N B ER G Z
+thornbury TH AO R N B EH R IY
+thornbury's TH AO R N B EH R IY Z
+thornburys TH AO R N B EH R IY Z
+thorndike TH AO R N D IH K
+thorndike's TH AO R N D IH K S
+thorndikes TH AO R N D IH K S
+thorndyke TH AO R N D AY K
+thorne TH AO R N
+thornell TH AO R N AH L
+thorner TH AO R N ER
+thornhill TH AO R N HH IH L
+thorniest TH AO R N IY AH S T
+thornley TH AO R N L IY
+thornock TH AO R N AH K
+thorns TH AO R N Z
+thornsberry TH AO R N Z B EH R IY
+thornsbury TH AO R N Z B EH R IY
+thornton TH AO R N T AH N
+thorny TH AO R N IY
+thoro TH AO R OW
+thorough TH ER OW
+thorough(2) TH AO R OW
+thoroughbred TH ER OW B R EH D
+thoroughbreds TH ER OW B R EH D Z
+thoroughfare TH ER OW F EH R
+thoroughfares TH ER OW F EH R Z
+thoroughly TH ER OW L IY
+thoroughness TH ER OW N AH S
+thorp TH AO R P
+thorpe TH AO R P
+thorsell TH AO R S AH L
+thorsen TH AO R S AH N
+thorson TH AO R S AH N
+thorstad TH AO R S T AH D
+thorsten T AO R S T AH N
+thorstenson TH AO R S T AH N S AH N
+thortec TH AO R T EH K
+thorton TH AO R T AH N
+thorton's TH AO R T AH N Z
+thorup TH AO R AH P
+thorvald TH AO R V AA L D
+those DH OW Z
+thou DH AW
+though DH OW
+thought TH AO T
+thoughtful TH AO T F AH L
+thoughtfully TH AO T F AH L IY
+thoughtfulness TH AO T F AH L N IH S
+thoughtless TH AO T L AH S
+thoughts TH AO T S
+thous DH AW Z
+thousand TH AW Z AH N D
+thousand(2) TH AW Z AH N
+thousands TH AW Z AH N D Z
+thousands(2) TH AW Z AH N Z
+thousandth TH AW Z AH N D TH
+thousandth(2) TH AW Z AH N TH
+thousandths TH AW Z AH N D TH S
+thousandths(2) TH AW Z AH N TH S
+thraco-illyrian TH R EY K OW IH L IH R IY AH N
+thrailkill TH R EY L K IH L
+thrall TH R AO L
+thrash TH R AE SH
+thrashed TH R AE SH T
+thrasher TH R AE SH ER
+thrashes TH R AE SH IH Z
+thrashing TH R AE SH IH NG
+thread TH R EH D
+threadbare TH R EH D B EH R
+threaded TH R EH D AH D
+threaded(2) TH R EH D IH D
+threadfin TH R EH D F IH N
+threadgill TH R EH D G IH L
+threading TH R EH D IH NG
+threads TH R EH D Z
+threat TH R EH T
+threaten TH R EH T AH N
+threatened TH R EH T AH N D
+threatening TH R EH T AH N IH NG
+threatening(2) TH R EH T N IH NG
+threateningly TH R EH T AH N IH NG L IY
+threateningly(2) TH R EH T N IH NG L IY
+threatens TH R EH T AH N Z
+threats TH R EH T S
+threatt TH R IY T
+three TH R IY
+3 TH R IY
+three's TH R IY Z
+threefold TH R IY F OW L D
+threemonth TH R IY M AH N TH
+threes TH R IY Z
+threesome TH R IY S AH M
+threet TH R IY T
+threlkeld TH R EH L K EH L D
+thresh TH R EH SH
+thresher TH R EH SH ER
+threshold TH R EH SH OW L D
+thresholds TH R EH SH HH OW L D Z
+threw TH R UW
+thrice TH R AY S
+thrift TH R IH F T
+thrift's TH R IH F T S
+thriftier TH R IH F T IY ER
+thrifts TH R IH F T S
+thrifts' TH R IH F T S
+thrifts'(2) TH R IH F S
+thrifts(2) TH R IH F S
+thrifty TH R IH F T IY
+thrill TH R IH L
+thrilled TH R IH L D
+thriller TH R IH L ER
+thrillers TH R IH L ER Z
+thrilling TH R IH L IH NG
+thrills TH R IH L Z
+thrips TH R IH P S
+thristing TH R IH S T IH NG
+thrive TH R AY V
+thrived TH R AY V D
+thrives TH R AY V Z
+thriving TH R AY V IH NG
+throat TH R OW T
+throated TH R OW T IH D
+throats TH R OW T S
+throaty TH R OW T IY
+throb TH R AA B
+throbbing TH R AA B IH NG
+throes TH R OW Z
+throgmorton TH R AH G M AO R T AH N
+throm TH R AA M
+thrombolysis TH R AA M B OW L IH S IH S
+thrombolysis(2) TH R AA M B AA L IH S IH S
+thrombolytic TH R AA M B OW L IH T IH K
+thrombosis TH R AA M B OW S AH S
+throne TH R OW N
+throneberry TH R OW N B EH R IY
+throng TH R AO NG
+thronged TH R AO NG D
+throngs TH R AO NG Z
+thronson TH R AA N S AH N
+throop TH R UW P
+throttle TH R AA T AH L
+throttled TH R AA T AH L D
+throttles TH R AA T AH L Z
+throttling TH R AA T AH L IH NG
+throttling(2) TH R AA T L IH NG
+through TH R UW
+throughout TH R UW AW T
+throughput TH R UW P UH T
+throughs TH R UW Z
+throughway TH R UW W EY
+throve TH R OW V
+throw TH R OW
+throwaway TH R OW AH W EY
+throwback TH R OW B AE K
+thrower TH R OW ER
+throwers TH R OW ER Z
+throwing TH R OW IH NG
+thrown TH R OW N
+throws TH R OW Z
+thru TH R UW
+thrun TH R AH N
+thrush TH R AH SH
+thrushes TH R AH SH AH Z
+thrushes(2) TH R AH SH IH Z
+thrust TH R AH S T
+thruster TH R AH S T ER
+thrusters TH R AH S T ER Z
+thrusting TH R AH S T IH NG
+thrusts TH R AH S T S
+thrusts(2) TH R AH S S
+thrusts(3) TH R AH S
+thruway TH R UW W EY
+ths TH S
+thud TH AH D
+thug TH AH G
+thuggery TH AH G ER IY
+thugs TH AH G Z
+thul TH AH L
+thulin TH UW L IH N
+thull TH AH L
+thum TH AH M
+thuma TH UW M AH
+thuman TH UW M AH N
+thumann TH UW M AH N
+thumb TH AH M
+thumbed TH AH M D
+thumbing TH AH M IH NG
+thumbnail TH AH M N EY L
+thumbs TH AH M Z
+thumm TH AH M
+thumma TH AH M AH
+thump TH AH M P
+thumped TH AH M P T
+thumper TH AH M P ER
+thumping TH AH M P IH NG
+thumps TH AH M P S
+thun TH AH N
+thunberg TH AH N B ER G
+thunder TH AH N D ER
+thunderbird TH AH N D ER B ER D
+thunderbirds TH AH N D ER B ER D Z
+thunderbolt TH AH N D ER B AO L T
+thundercat TH AH N D ER K AE T
+thundercats TH AH N D ER K AE T S
+thundered TH AH N D ER D
+thundering TH AH N D ER IH NG
+thunderous TH AH N D ER AH S
+thunders TH AH N D ER Z
+thundershower TH AH N D ER SH AW W ER
+thundershowers TH AH N D ER SH AW W ER Z
+thunderstorm TH AH N D ER S T AO R M
+thunderstorms TH AH N D ER S T AO R M Z
+thunderstruck TH AH N D ER S T R AH K
+thune TH UW N
+thunk TH AH N K
+thuot TH AW T
+thuot(2) TH UW T
+thur DH ER
+thurber TH ER B ER
+thurgood TH ER G UH D
+thurlow TH ER L OW
+thurm TH ER M
+thurman TH ER M AH N
+thurmon TH ER M AH N
+thurmond TH ER M AH N D
+thurmond's TH ER M AH N D Z
+thurn TH ER N
+thurnau TH ER N OW
+thurner TH ER N ER
+thurnher TH ER N ER
+thurow TH UH R OW
+thursby TH ER S B IY
+thursday TH ER Z D EY
+thursday's TH ER Z D IY Z
+thursday's(2) TH ER Z D EY Z
+thursday(2) TH ER Z D IY
+thursdays TH ER Z D EY Z
+thursdays(2) TH ER Z D IY Z
+thurstan TH ER S T AH N
+thurston TH ER S T AH N
+thus DH AH S
+thusfar DH AH S F AA R
+thusly DH AH S L IY
+thuy T UW
+thwart TH W AO R T
+thwarted TH W AO R T AH D
+thwarted(2) TH W AO R T IH D
+thwarting TH W AO R T IH NG
+thwarts TH W AO R T S
+thweatt TH W IY T
+thwing TH W IH NG
+thy DH AY
+thygerson TH AY G ER S AH N
+thyme TH AY M
+thymidine TH IH M IH D IY N
+thyra TH AY R AH
+thyroid TH AY R OY D
+thyssen T AY S AH N
+thyssen's T AY S AH N Z
+ti T IY
+tia T IY AH
+tiaacref T IY AH K R EH F
+tiaacref's T IY AH K R EH F S
+tian T Y AA N
+tiananmen T IY EH N AE N M EH N
+tianjin T IY AE N JH IH N
+tiano T IY AA N OW
+tiara T IY AA R AH
+tiaras T IY AA R AH Z
+tibbals T IH B AH L Z
+tibbets T IH B IH T S
+tibbett T IH B IH T
+tibbetts T IH B IH T S
+tibbie T IH B IY
+tibbits T IH B IH T S
+tibbitts T IH B IH T S
+tibbs T IH B Z
+tibby T IH B IY
+tiber T AY B ER
+tiberi T IY B EH R IY
+tiberia T IH B IY R IY AH
+tiberio T IH B IY R IY OW
+tiberon T IH B ER AH N
+tibet T AH B EH T
+tibetan T IH B EH T AH N
+tibetans T AH B EH T AH N Z
+tibi T IH B IY
+tibia T IH B IY AH
+tibia(2) T IH B Y AH
+tibidow T IH B IY D OW
+tic T IH K
+tice T AY S
+ticer T AY S ER
+tichenor T IH K AH N ER
+tichy T IH CH IY
+ticinus T IH S IY N AH S
+tick T IH K
+ticked T IH K T
+ticker T IH K ER
+ticket T IH K AH T
+ticket's T IH K AH T S
+ticket(2) T IH K IH T
+ticketed T IH K AH T IH D
+ticketing T IH K AH T IH NG
+ticketless T IH K AH T L AH S
+ticketmaster T IH K IH T M AE S T ER
+ticketmaster's T IH K AH T M AE S T ER Z
+ticketron T IH K AH T R AA N
+tickets T IH K AH T S
+tickets(2) T IH K IH T S
+ticking T IH K IH NG
+tickle T IH K AH L
+tickled T IH K AH L D
+tickles T IH K AH L Z
+ticklish T IH K AH L IH SH
+tickner T IH K N ER
+ticknor T IH K N ER
+ticks T IH K S
+ticonderoga T AY K AA N D ER OW G AH
+ticonderoga's T AY K AA N D ER OW G AH Z
+ticor T AY K AO R
+tics T IH K S
+tidal T AY D AH L
+tidball T IH D B AO L
+tidbit T IH D B IH T
+tidbits T IH D B IH T S
+tidd T IH D
+tiddly T IH D L IY
+tiddlywinks T IH D L IH W IH NG K S
+tiddlywinks(2) T IH D L IY W IH NG K S
+tide T AY D
+tides T AY D Z
+tidewater T AY D W AO T ER
+tiding T AY D IH NG
+tidings T AY D IH NG Z
+tidmore T IH D M AO R
+tidrick T IH D R IH K
+tidwell T IH D W AH L
+tidy T AY D IY
+tie T AY
+tied T AY D
+tiede T IY D
+tiedeman T IY D M AH N
+tiedemann T IY D M AH N
+tiedt T IY D T
+tiegs T IY G Z
+tiein T AY IH N
+tieing T AY IH NG
+tieken T IY K AH N
+tieless T AY L AH S
+tieman T IY M AH N
+tiemann T IY M AH N
+tiemeyer T IY M AY ER
+tien T Y EH N
+tien-fu T Y EH N F UW
+tienanmen T Y EH N AH N M EH N
+tier T IY R
+tierce T IY R S
+tierco T IY R K OW
+tiered T IY R D
+tiernan T IH R N AH N
+tierney T IH R N IY
+tierno T IH R N OW
+tiers T IY R Z
+ties T AY Z
+tieszen T IY SH AH N
+tietje T IY T JH
+tietjen T IY T JH AH N
+tietmeyer T IY T M AY R
+tietmeyer(2) T AY T M AY R
+tietz T IY T S
+tietze T IY T Z
+tietze(2) T IY T Z IY
+tieu T IY UW
+tiff T IH F
+tiffany T IH F AH N IY
+tiffany's T IH F AH N IY Z
+tiffin T IH F IH N
+tifft T IH F T
+tift T IH F T
+tifton T IH F T AH N
+tig T IH G
+tigar T AY G AA R
+tigar's T AY G AA R Z
+tigar's(2) T AY G ER Z
+tigar(2) T AY G ER
+tiger T AY G ER
+tiger's T AY G ER Z
+tigera T IH JH EH R AH
+tigers T AY G ER Z
+tigers' T AY G ER Z
+tigert T AY G ER T
+tigges T IH G Z
+tiggs T IH G Z
+tighe T AY G
+tight T AY T
+tighten T AY T AH N
+tightened T AY T AH N D
+tightening T AY T AH N IH NG
+tightening(2) T AY T N IH NG
+tightenings T AY T AH N IH NG Z
+tightenings(2) T AY T N IH NG Z
+tightens T AY T AH N Z
+tighter T AY T ER
+tightest T AY T AH S T
+tightfisted T AY T F IH S T IH D
+tightly T AY T L IY
+tightness T AY T N AH S
+tightrope T AY T R OW P
+tights T AY T S
+tightwad T AY T W AA D
+tigner T AY G N ER
+tignor T IH G N ER
+tigon T IH G AH N
+tigrean T IH G R IY N
+tigris T AY G R AH S
+tigue T IY G
+tijerina T IY Y EH R IY N AH
+tijuana T IH W AA N AH
+tike T AY K
+tikes T AY K S
+tiki T IY K IY
+til T IH L
+tilbury T IH L B EH R IY
+tilda T IH L D AH
+tilden T IH L D AH N
+tile T AY L
+tiled T AY L D
+tiles T AY L Z
+tiley T AY L IY
+tilford T IH L F ER D
+tilghman T IH L M AH N
+till T IH L
+tiller T IH L ER
+tillery T IH L ER IY
+tilles T AY L Z
+tillett T IH L IH T
+tilley T IH L IY
+tillie T IH L IY
+tilling T IH L IH NG
+tillinghast T IH L IH NG HH AE S T
+tillis T IH L IH S
+tillison T IH L IH S AH N
+tillman T IH L M AH N
+tillmon T IH L M AH N
+tillotson T IH L AH T S AH N
+tillson T IH L S AH N
+tilly T IH L IY
+tilly's T IH L IY Z
+tilman T IH L M AH N
+tilney T IH L N IY
+tilson T IH L S AH N
+tilt T IH L T
+tilted T IH L T AH D
+tilted(2) T IH L T IH D
+tilth T IH L TH
+tilting T IH L T IH NG
+tilton T IH L T AH N
+tilts T IH L T S
+tim T IH M
+tim's T IH M Z
+timan T AY M AH N
+timber T IH M B ER
+timberlake T IH M B ER L EY K
+timberland T IH M B ER L AE N D
+timberlands T IH M B ER L AE N D Z
+timberline T IH M B ER L AY N
+timberman T IH M B ER M AH N
+timbers T IH M B ER Z
+timblin T IH M B L IH N
+timbre T IH M B ER
+timbrook T IH M B R UH K
+timbs T IH M Z
+timbuktu T IH M B AH K T UW
+time T AY M
+time's T AY M Z
+timed T AY M D
+timeframe T AY M F R EY M
+timeless T AY M L AH S
+timeline T AY M L AY N
+timelines T AY M L AY N Z
+timeliness T AY M L IY N AH S
+timely T AY M L IY
+timeout T AY M AW T
+timepiece T AY M P IY S
+timeplex T AY M P L EH K S
+timer T AY M ER
+timers T AY M ER Z
+times T AY M Z
+times' T AY M Z
+times's T AY M Z IH Z
+timeshare T AY M SH EH R
+timetable T AY M T EY B AH L
+timetables T AY M T EY B AH L Z
+timewise T AY M W AY Z
+timex T AY M EH K S
+timid T IH M IH D
+timidity T AH M IH D AH T IY
+timidly T IH M AH D L IY
+timing T AY M IH NG
+timisoara T IH M AH S OW AA R AH
+timisoara(2) T IH M AH S W AA R AH
+timken T IH M K AH N
+timko T IH M K OW
+timlen T IH M L AH N
+timlin T IH M L IH N
+timm T IH M
+timme T IH M
+timmeny T IH M AH N IY
+timmer T IH M ER
+timmerman T IH M ER M AH N
+timmermann T IH M ER M AH N
+timmers T IH M ER Z
+timmie T IH M IY
+timmins T IH M IH N Z
+timmons T IH M AH N Z
+timms T IH M Z
+timmy T IH M IY
+timon T AY M AH N
+timoney T IH M AH N IY
+timor T IY M AO R
+timor's T IY M AO R Z
+timorese T IY M AO R IY Z
+timorous T IH M ER AH S
+timothea T IH M AH DH IY AH
+timothy T IH M AH TH IY
+timpani T IH M P AH N IY
+timpe T IH M P
+timpone T IY M P OW N IY
+timpson T IH M P S AH N
+tims T IH M Z
+timson T IH M S AH N
+timur T IH M ER
+timurian T IH M UH R IY AH N
+tin T IH N
+tina T IY N AH
+tina's T IY N AH Z
+tinajero T IY N AA Y EH R OW
+tinch T IH N CH
+tincher T IH N CH ER
+tincture T IH NG K CH ER
+tinctures T IH NG K CH ER Z
+tindal T IH N D AH L
+tindall T IH N D AH L
+tindel T IH N D AH L
+tindell T IH N D AH L
+tinder T IH N D ER
+tinderbox T IH N D ER B AA K S
+tindle T IH N D AH L
+tindol T IH N D AH L
+tine T AY N
+tiner T AY N ER
+tines T AY N Z
+ting T IH NG
+tinge T IH N JH
+tinged T IH NG D
+tingen T IH NG AH N
+tingey T IH NG G IY
+tingle T IH NG G AH L
+tingler T IH NG G AH L ER
+tingler(2) T IH NG G L ER
+tingley T IH NG G L IY
+tingling T IH NG G AH L IH NG
+tingling(2) T IH NG G L IH NG
+tinier T AY N IY ER
+tiniest T AY N IY AH S T
+tinker T IH NG K ER
+tinker's T IH NG K ER Z
+tinkered T IH NG K ER D
+tinkerer T IH NG K ER ER
+tinkerers T IH NG K ER ER Z
+tinkering T IH NG K ER IH NG
+tinkering(2) T IH NG K R IH NG
+tinkey T IH N K IY
+tinkham T IH NG K AH M
+tinkle T IH NG K AH L
+tinkled T IH NG K AH L D
+tinkler T IH NG K AH L ER
+tinkler(2) T IH NG K L ER
+tinkling T IH NG K AH L IH NG
+tinkling(2) T IH NG K L IH NG
+tinley T IH N L IY
+tinman T IH N M AE N
+tinnell T IH N AH L
+tinney T IH N IY
+tinnin T IH N IH N
+tinnon T IH N AH N
+tinny T IH N IY
+tino T IY N OW
+tinoco T IY N OW K OW
+tins T IH N Z
+tinsel T IH N S AH L
+tinseltown T IH N S AH L T AW N
+tinsley T IH N S L IY
+tinsman T IH N S M AH N
+tint T IH N T
+tinted T IH N T IH D
+tinto T IH N T OW
+tinton T IH N T AH N
+tints T IH N T S
+tintype T IH N T AY P
+tiny T AY N IY
+tip T IH P
+tipa T IH P AH
+tiphook T IH P HH UH K
+tipler T AY P AH L ER
+tipler(2) T AY P L ER
+tipo T IY P OW
+tipoff T IH P AO F
+tipp T IH P
+tipped T IH P T
+tippen T IH P AH N
+tippens T IH P AH N Z
+tipper T IH P ER
+tipperary T IH P ER EH R IY
+tippers T IH P ER Z
+tippet T IH P AH T
+tippets T IH P IH T S
+tippett T IH P IH T
+tippetts T IH P IH T S
+tippie T IH P IY
+tippin T IH P IH N
+tipping T IH P IH NG
+tippins T IH P IH N Z
+tippit T IH P IH T
+tippitt T IH P IH T
+tipple T IH P AH L
+tipps T IH P S
+tippy T IH P IY
+tippy's T IH P IY Z
+tips T IH P S
+tipster T IH P S T ER
+tipsword T IH P S AO R D
+tipsy T IH P S IY
+tiptoe T IH P T OW
+tiptoed T IH P T OW D
+tiptoeing T IH P T OW IH NG
+tipton T IH P T AH N
+tirade T AY R EY D
+tirades T AY R EY D Z
+tirado T IH R AA D OW
+tiramisu T IH R AH M IH S UW
+tirana T IH R AA N AH
+tirane T IH R EY N
+tire T AY ER
+tired T AY ER D
+tiredness T AY ER D N IH S
+tireless T AY ER L AH S
+tirelessly T AY R L AH S L IY
+tirello T IH R EH L OW
+tiremaker T AY R M EY K ER
+tires T AY ER Z
+tiresome T AY ER S AH M
+tirey T AY R IY
+tiring T AY R IH NG
+tirone T IH R OW N
+tiros T AY R OW Z
+tirpak T ER P AH K
+tirrell T IH R EY L
+tis T IH Z
+tisch T IH SH
+tisch's T IH SH IH Z
+tischer T IH SH ER
+tischler T IH SH AH L ER
+tischler(2) T IH SH L ER
+tisdale T IH S D EY L
+tisdel T IH S D AH L
+tisdell T IH S D AH L
+tish T IH SH
+tish's T IH SH IH Z
+tisher T IH SH ER
+tishler T IH SH L ER
+tishman T IH SH M AH N
+tison T IH S AH N
+tissue T IH S Y UW
+tissue(2) T IH SH UW
+tissues T IH S Y UW Z
+tissues(2) T IH SH UW Z
+tit T IH T
+tit-for-tat T IH T F AO R T AE T
+tita T IY T AH
+titan T AY T AH N
+titanate T AY T AH N EY T
+titania T AH T AA N Y AH
+titanic T AY T AE N IH K
+titanium T AY T EY N IY AH M
+titans T AY T AH N Z
+titcomb T IH T K AH M
+tithe T AY DH
+tithing T AY DH IH NG
+titian T IH SH AH N
+titillate T IH T AH L EY T
+titillated T IH T AH L EY T IH D
+titillating T IH T AH L EY T IH NG
+titillation T IH T IH L EY SH AH N
+titinus T IH T AH N AH S
+title T AY T AH L
+titled T AY T AH L D
+titleholder T AY T AH L HH OW L D ER
+titles T AY T AH L Z
+titlow T IH T L OW
+titman T IH T M AH N
+tito T IY T OW
+tito's T IY T OW Z
+titone T IH T AH N
+titsworth T IH T S W ER TH
+tittel T IH T AH L
+titter T IH T ER
+titterington T IH T ER IH NG T AH N
+tittle T IH T AH L
+tittsworth T IH T S W ER TH
+titular T IH CH AH L ER
+titus T AY T AH S
+titusville T AY T AH S V IH L
+titzer T IH T Z ER
+tivoli T IH V AH L IY
+tizzy T IH Z IY
+tjaden JH EY D AH N
+tjarks JH AA R K S
+tkach K AE CH
+tkacz K AA CH
+tlateloco T L AE T IH L OW K OW
+tlingit T L IY NG G IH T
+to T UW
+to(2) T IH
+to(3) T AH
+toa T OW AH
+toad T OW D
+toads T OW D Z
+toal T OW L
+toalson T OW L S AH N
+toalster T OW L S T ER
+toast T OW S T
+toasted T OW S T IH D
+toaster T OW S T ER
+toasters T OW S T ER Z
+toasting T OW S T IH NG
+toastmaster T OW S T M AE S T ER
+toasts T OW S T S
+toasts(2) T OW S S
+toasts(3) T OW S
+tobacco T AH B AE K OW
+tobacco's T AH B AE K OW Z
+tobaccos T AH B AE K OW Z
+toback CH UW B AE K
+tobago T AH B EY G OW
+tobar T OW B ER
+tobe T OW B
+toben T OW B AH N
+tober T OW B ER
+tobey T OW B IY
+tobia T OW B IY AH
+tobias T AH B AY AH S
+tobiason T AH B AY AH S AH N
+tobie T OW B IY
+tobin T OW B IH N
+tobler T OW B AH L ER
+tobler(2) T OW B L ER
+toboggan T AH B AA G AH N
+toboggans T AH B AA G AH N Z
+tobolski T AH B OW L S K IY
+tobruk T OW B R UH K
+tobu T OW B UW
+toby T OW B IY
+toby's T OW B IY Z
+tocci T OW CH IY
+tocco T AA K OW
+tock T AA K
+tocqueville T OW K V IH L
+tocqueville's T OW K V IH L Z
+toczek T AA CH EH K
+tod T AA D
+toda T OW D AH
+todaro T OW D AA R OW
+today T AH D EY
+today'll T AH D EY L
+today'll(2) T UW D EY L
+today's T AH D EY Z
+today's(2) T UW D EY Z
+today(2) T UW D EY
+todays T AH D EY Z
+todays(2) T UW D EY Z
+todd T AA D
+todd's T AA D Z
+toddle T AA D AH L
+toddler T AA D L ER
+toddlers T AA D L ER Z
+toddling T AA D L IH NG
+todhunter T AA D HH AH N T ER
+todi's T OW D IY S
+todisco T OW D IY S K OW
+todman T AA D M AH N
+todoroff T AA D ER AO F
+todt T AA D T
+toe T OW
+toed T OW D
+toehold T OW HH OW L D
+toeing T OW IH NG
+toelle T OW L
+toenail T OW N EY L
+toenails T OW N EY L Z
+toenjes T OW N JH IH Z
+toensing T OW N S IH NG
+toepfer T OW P F ER
+toes T OW Z
+toews T AA UW Z
+toffee T AA F IY
+toffler T AO F L ER
+toft T AA F T
+tofte T OW F T
+tofu T OW F UW
+toga T OW G AH
+together T AH G EH DH ER
+togetherness T AH G EH DH ER N AH S
+togethers T AH G EH DH ER Z
+toggle T AA G AH L
+toggled T AA G AH L D
+toggling T AA G L IH NG
+tognino T AA G N IY N OW
+togo T OW G OW
+togs T AA G Z
+toibin T OY B IH N
+toil T OY L
+toiled T OY L D
+toilet T OY L AH T
+toiletries T OY L AH T R IY Z
+toiletry T OY L AH T R IY
+toilets T OY L AH T S
+toiling T OY L IH NG
+toils T OY L Z
+toity T OY T IY
+toivonen T OY V AH N AH N
+tokai T OW K AY
+tokar T OW K AA R
+tokarczyk T AA K ER CH IH K
+tokars T OW K AA R Z
+tokarski T AH K AA R S K IY
+tokarz T OW K AA R Z
+token T OW K AH N
+tokenism T OW K AH N IH Z AH M
+tokens T OW K AH N Z
+tokio T OW K IY OW
+tokkin T AA K IH N
+tokos T OW K OW S
+tokunaga T OW K UW N AA G AH
+tokuo T AA K Y UW OW
+tokuyama T OW K UW Y AA M AH
+tokyo T OW K IY OW
+tokyo's T OW K IY OW Z
+tokyu T OW K Y UW
+tol T AO L
+tolan T OW L AH N
+toland T OW L AH N D
+tolanthe T OW L AA N DH IY
+tolar T OW L ER
+tolbert T OW L B ER T
+told T OW L D
+toldrian T OW L D R IY AH N
+tole T OW L
+toledo T AH L IY D OW
+toledo's T AH L IY D OW Z
+tolen T OW L AH N
+tolentino T OW L EH N T IY N OW
+toler T OW L ER
+tolerable T AA L ER AH B AH L
+tolerance T AA L ER AH N S
+tolerances T AA L ER AH N S IH Z
+tolerant T AA L ER AH N T
+tolerants T AA L ER AH N T S
+tolerate T AA L ER EY T
+tolerated T AA L ER EY T AH D
+tolerates T AO L ER EY T S
+tolerating T AA L ER EY T IH NG
+toleration T AA L ER EY SH AH N
+toles T OW L Z
+tolhurst T OW L HH ER S T
+tolin T OW L IH N
+toliver T OW L IH V ER
+toll T OW L
+tolland T AA L AH N D
+tolland's T AA L AH N D Z
+tollbooth T OW L B UW TH
+tolle T AA L
+tolled T OW L D
+tollefsen T AA L IH F S AH N
+tollefson T AA L IH F S AH N
+toller T OW L ER
+tolles T OW L Z
+tolleson T AA L IH S AH N
+tollett T AA L IH T
+tolley T AA L IY
+tolling T OW L IH NG
+tollison T AA L IH S AH N
+tolliver T OW L IH V ER
+tolls T OW L Z
+tolly T OW L IY
+tolman T AA L M AH N
+tolsma T OW L S M AH
+tolson T OW L S AH N
+tolstoy T OW L S T OY
+tolstoy's T OW L S T OY Z
+tom T AA M
+tom's T AA M Z
+toma T OW M AH
+tomahawk T AA M AH HH AO K
+tomahawks T AA M AH HH AO K S
+tomaino T OW M AA IY N OW
+tomako T OW M AA K OW
+tomako's T OW M AA K OW Z
+toman T OW M AH N
+tomanek T AA M AH N IH K
+tomaro T OW M AA R OW
+tomas T OW M AA S
+tomasek T AH M AA S EH K
+tomaselli T OW M AA S EH L IY
+tomasello T OW M AA S EH L OW
+tomasetti T OW M AA S EH T IY
+tomasi T OW M AA S IY
+tomasic T AH M AA S IH K
+tomasik T AH M AA S IH K
+tomasina T AO M AH S IY N AH
+tomasine T OW M AA S IY N IY
+tomasini T OW M AA S IY N IY
+tomasino T OW M AA S IY N OW
+tomasko T AH M AA S K OW
+tomaso T OW M AA S OW
+tomassetti T OW M AA S EH T IY
+tomassi T OW M AA S IY
+tomasso T OW M AA S OW
+tomasulo T OW M AA S UW L OW
+tomaszewski T AH M AH SH EH F S K IY
+tomatino T AA M AH T IY N OW
+tomatino's T AA M AH T IY N OW Z
+tomato T AH M EY T OW
+tomato(2) T AH M AA T OW
+tomatoe T AH M EY T OW
+tomatoe(2) T AH M AA T OW
+tomatoes T AH M EY T OW Z
+tomatoes(2) T AH M AA T OW Z
+tomatos T AH M EY T OW Z
+tomatos(2) T AH M AA T OW Z
+tomayko T AH M AY K OW
+tomb T UW M
+tomberlin T AA M B ER L IH N
+tomblike T UW M L AY K
+tomblin T AA M B L IH N
+tomboy T AA M B OY
+tombs T UW M Z
+tombstone T UW M S T OW N
+tombstones T UW M S T OW N Z
+tomcat T AA M K AE T
+tomczak T AA M CH AE K
+tomczyk T AA M CH IH K
+tome T OW M
+tomei T AA M AY
+tomek T OW M EH K
+tomeo T OW M IY OW
+tomer T OW M ER
+tomerlin T AA M ER L IH N
+tomes T OW M Z
+tomey T OW M IY
+tomich T AA M IH K
+tomiichi T OW M IY IY CH IY
+tomilson T AA M AH L S AH N
+tomita T OW M IY T AH
+tomkiewicz T AA M K AH V IH CH
+tomkin T AA M K IH N
+tomkins T AA M K IH N Z
+tomkinson T AA M K IH N S AH N
+tomko T AA M K OW
+tomlin T AA M L IH N
+tomlinson T AA M L IH N S AH N
+tommie T AA M IY
+tommy T AA M IY
+tommy's T AA M IY Z
+tommy-lee T AA M IY L IY
+tomographic T OW M OW G R AE F IH K
+tomorrow T AH M AA R OW
+tomorrow's T AH M AA R OW Z
+tomorrow's(2) T UW M AA R OW Z
+tomorrow(2) T UW M AA R OW
+tomorrows T AH M AA R OW Z
+tomorrows(2) T UW M AA R OW Z
+tompane T AA M P EY N
+tompkins T AA M P K IH N Z
+tompkinses T AA M P K IH N S IH Z
+tompson T AA M P S AH N
+toms T AA M Z
+tomshich T AA M SH IH K
+tomsic T AA M S IH K
+tomson T AA M S AH N
+ton T AH N
+tonal T OW N AH L
+tonalities T OW N AE L AH T IY Z
+tonality T OW N AE L AH T IY
+tonawanda T AA N AH W AA N D AH
+tonda T AA N D AH
+tondreau T AH N D R OW
+tone T OW N
+toned T OW N D
+tonegawa T OW N IH G AA W AH
+tonelli T OW N EH L IY
+toner T OW N ER
+tones T OW N Z
+toney T OW N IY
+tong T AO NG
+tonga T AA N G AH
+tonga's T AA N G AH Z
+tonge T AA N JH
+tongs T AA NG Z
+tongs(2) T AO NG Z
+tongue T AH NG
+tongued T AH NG D
+tongues T AH NG Z
+toni T OW N IY
+tonia T OW N IY AH
+tonic T AA N IH K
+tonics T AA N IH K S
+tonie T OW N IY
+toniest T OW N IY S T
+tonight T AH N AY T
+tonight's T AH N AY T S
+tonight's(2) T UW N AY T S
+tonight(2) T UW N AY T
+toning T OW N IH NG
+tonini T OW N IY N IY
+tonite T AH N AY T
+tonjes T OW N Y EH S
+tonk T AO NG K
+tonka T AA NG K AH
+tonka's T AA NG K AH Z
+tonkin T AA NG K IH N
+tonkovich T AA NG K AH V IH CH
+tonks T AA NG K S
+tonn T AA N
+tonnage T AH N AH JH
+tonnage(2) T AH N IH JH
+tonnages T AH N AH JH AH Z
+tonne T AH N
+tonner T AH N ER
+tonnes T AH N Z
+tonnesen T AH N S AH N
+tons T AH N Z
+tonsil T AA N S AH L
+tonsillectomies T AA N S IH L EH K T AH M IY Z
+tonsillectomy T AA N S IH L EH K T AH M IY
+tonsils T AA N S AH L Z
+tonti T AA N T IY
+tonton T AA N T AH N
+tontons T AA N T AH N Z
+tony T OW N IY
+tony's T OW N IY Z
+tonya T AA N Y AH
+tonya's T AA N Y AH Z
+tonyes T OW N Y AH Z
+tonys T OW N IY Z
+tonysk T OW N IY S K
+too T UW
+toobin T UW B AH N
+toobin's T UW B AH N Z
+toogood T UW G UH D
+toohey T UW IY
+took T UH K
+tooke T UH K
+tooker T UH K ER
+tookes T UH K S
+tool T UW L
+toolan T UW L AH N
+toolbox T UW L B AO K S
+toole T UW L
+tooled T UW L D
+tooley T UW L IY
+tooling T UW L IH NG
+toolmaker T UW L M EY K ER
+toolmakers T UW L M EY K ER Z
+toolroom T UW L R UW M
+tools T UW L Z
+toolworks T UW L W ER K S
+tooman T UW M AH N
+toombs T UW M Z
+toomer T UW M ER
+toomey T UW M IY
+toon T UW N
+toone T UW N
+toops T UW P S
+toot T UW T
+tootal T UW T AH L
+toote T UW T
+tooth T UW TH
+toothaker T UW TH AH K ER
+toothbrush T UW TH B R AH SH
+toothbrushes T UW TH B R AH SH IH Z
+toothed T UW TH T
+toothed(2) T UW DH D
+toothless T UW TH L AH S
+toothlike T UW TH L AY K
+toothman T UW TH M AH N
+toothpaste T UW TH P EY S T
+toothpastes T UW TH P EY S T S
+toothpick T UW TH P IH K
+toothpicks T UW TH P IH K S
+toothy T UW TH IY
+tootle T UW T AH L
+toots T UW T S
+toots(2) T UH T S
+tootsie T UW T S IY
+tootsie(2) T UH T S IY
+top T AA P
+top(2) T AO P
+topalian T AH P EY L IY AH N
+topanga T OW P AE NG G AH
+topanga(2) T AH P AE NG G AH
+topaz T OW P AE Z
+tope T OW P
+topeka T AH P IY K AH
+topeka's T AH P IY K AH Z
+topeka(2) T OW P IY K AH
+topekan T AH P IY K AH N
+topekans T AH P IY K AH N Z
+topel T OW P AH L
+topete T AA P IY T
+topham T AA F AH M
+topiary T OW P IY EH R IY
+topic T AA P IH K
+topical T AA P AH K AH L
+topical(2) T AA P IH K AH L
+topics T AA P IH K S
+topix T OW P IH K S
+topix(2) T AA P IH K S
+topkapi T AA P K AA P IY
+topknot T AA P N AA T
+topless T AA P L AH S
+topliff T AA P L IH F
+topographic T AA P AH G R AE F IH K
+topography T AH P AA G R AH F IY
+topol T OW P AA L
+topological T AH P AH L AA JH IH K AH L
+topology T AH P AO L AH JH IY
+topolski T AH P OW L S K IY
+topor T AA P ER
+topp T AA P
+topped T AA P T
+topper T AA P ER
+toppers T AA P ER Z
+toppin T AA P IH N
+topping T AA P IH NG
+toppings T AA P IH NG Z
+toppins T AA P IH N Z
+topple T AA P AH L
+toppled T AA P AH L D
+topples T AA P AH L Z
+toppling T AA P AH L IH NG
+toppling(2) T AA P L IH NG
+topps T AA P S
+tops T AA P S
+topsoil T AA P S OY L
+topsy T AA P S IY
+topsy-turvy T AA P S IY T ER V IY
+toquepala T AA K W EH P AA L AH
+tor T AO R
+torah T AO R AH
+torain T ER EY N
+torald T AO R AH L D
+toran T AO R AA N
+toray T AO R EY
+torbeck T AO R B EH K
+torbert T AO R B ER T
+torbett T AO R B IH T
+torch T AO R CH
+torched T AO R CH T
+torches T AO R CH IH Z
+torchia T AO R K IY AH
+torching T AO R CH IH NG
+torchmark T AO R CH M AA R K
+tordella T AO R D EH L AH
+tore T AO R
+torell T AO R EH L
+torelli T AO R EH L IY
+torello T AO R EH L OW
+toren T AO R AH N
+torey T AO R IY
+torgersen T AO R G ER S AH N
+torgerson T AO R G ER S AH N
+torgeson T AO R G IH S AH N
+tori T AO R IY
+torian T AO R IY AH N
+toribio T AO R IY B IY OW
+torie T AO R IY
+toriente T AO R IY EH N T EY
+tories T AO R IY Z
+tories' T AO R IY Z
+torino T AO R IY N OW
+torkelson T AO R K IH L S AH N
+torley T AO R L IY
+torma T AO R M AH
+torme T AO R M
+torme(2) T AO R M EY
+torment T AO R M EH N T
+tormenta T AO R M EH N T AH
+tormented T AO R M EH N T IH D
+tormenting T AO R M EH N T IH NG
+tormentor T AO R M EH N T ER
+tormentors T AO R M EH N T ER Z
+torments T AO R M EH N T S
+tormey T AO R M IY
+torn T AO R N
+tornabene T AO R N AA B EH N AH
+tornadic T AO R N EY D IH K
+tornado T AO R N EY D OW
+tornado's T AO R N EY D OW Z
+tornadoes T AO R N EY D OW Z
+tornados T AO R N EY D OW Z
+tornatore T AO R N AA T AO R IY
+torney T AO R N IY
+torno T AO R N OW
+tornow T AO R N OW
+tornquist T AO R N K W IH S T
+toro T AO R OW
+torok T AO R AH K
+toronado T AO R AH N AA D OW
+toronto T ER AA N T OW
+toronto's T ER AA N T OW Z
+toronto's(2) T AO R AA N T OW Z
+toronto(2) T AO R AA N T OW
+torosian T ER AA ZH IH N
+torp T AO R P
+torpedo T AO R P IY D OW
+torpedoed T AO R P IY D OW D
+torpedoes T AO R P IY D OW Z
+torpedoing T AO R P IY D OW IH NG
+torpedos T AO R P IY D OW Z
+torpey T AO R P IY
+torpid T AO R P AH D
+torpor T AO R P ER
+torque T AO R K
+torr T AO R
+torrance T AO R AH N S
+torras T AO R AH S
+torray T AO R EY
+torre T AO R
+torregrossa T AO R EH G R OW S AH
+torrejon T AO R AH JH AA N
+torrence T AO R AH N S
+torrens T AO R AH N Z
+torrent T AO R AH N T
+torrential T AO R EH N CH AH L
+torrential(2) T AO R EH N SH AH L
+torrents T AO R AH N T S
+torrenzano T AO R EH N Z AA N OW
+torreon T AO R IY AH N
+torres T AO R EH Z
+torrey T AO R IY
+torrez T AO R EH Z
+torricelli T AO R IH S EH L IY
+torrid T AO R AH D
+torrijos T AO R IY OW S
+torrington T AO R IH NG T AH N
+torrisi T AO R IY S IY
+torry T AO R IY
+torsiello T AO R S IY EH L OW
+torsion T AO R SH AH N
+torso T AO R S OW
+torsos T AO R S OW Z
+torstar T AO R S T AA R
+torsten T AO R S T AH N
+tort T AO R T
+torte T AO R T
+torti T AO R T IY
+tortilla T AO R T IY AH
+tortillas T AO R T IY AH Z
+tortoise T AO R T AH S
+tortoises T AO R T AH S AH Z
+tortora T AO R T AO R AH
+tortorella T AO R T AO R EH L AH
+tortorelli T AO R T AO R EH L IY
+tortorello T AO R T AO R EH L OW
+tortorice T AO R T AO R IH S
+tortorici T AO R T AO R IY CH IY
+tortoriello T AO R T AO R IY EH L OW
+torts T AO R T S
+tortuous T AO R CH AH W AH S
+torture T AO R CH ER
+tortured T AO R CH ER D
+torturer T AO R CH ER ER
+torturers T AO R CH ER ER Z
+tortures T AO R CH ER Z
+torturing T AO R CH ER IH NG
+torturous T AO R CH UW AH S
+toru T AO R UW
+torumi T AO R UW M IY
+torumi's T AO R UW M IY Z
+tory T AO R IY
+tosca T AO S K AH
+toscanini T AO S K AH N IY N IY
+toscanini's T AH S K AH N IY N IY Z
+toscano T OW S K AA N OW
+tosch T AO SH
+tosco T AO S K OW
+tosh T AA SH
+toshiba T OW SH IY B AH
+toshiba's T OW SH IY B AH Z
+toshiharu T OW SH IH HH AA R UW
+toshihiko T OW SH IH HH IY K OW
+toshiki T OW SH IY K IY
+toshimitsu T OW SH IY M IY T S UW
+toshio T OW SH IY OW
+toshiyuki T OW SH IH Y UW K IY
+tosi T OW S IY
+toso T OW S OW
+toss T AO S
+tossed T AO S T
+tosses T AO S IH Z
+tossing T AO S IH NG
+tostado T OW S T AA D OW
+toste T OW S T
+tostenson T AA S T IH N S AH N
+tosti T AO S T IY
+tosto T OW S T OW
+tot T AA T
+tota T OW T AH
+total T OW T AH L
+total's T OW T AH L Z
+totaled T OW T AH L D
+totaling T OW T AH L IH NG
+totalitarian T OW T AE L IH T EH R IY AH N
+totalitarianism T OW T AE L AH T EH R IY AH N IH Z AH M
+totalitarians T OW T AE L AH T EH R IY AH N Z
+totality T OW T AE L AH T IY
+totalled T OW T AH L D
+totalling T OW T AH L IH NG
+totally T OW T AH L IY
+totals T OW T AH L Z
+totaro T OW T AA R OW
+tote T OW T
+toted T OW T IH D
+totem T OW T AH M
+totems T OW T AH M Z
+totenberg T OW T AH N B ER G
+totes T OW T S
+toth T AA TH
+totherow T AH DH ER OW
+toti T OW T IY
+toting T OW T IH NG
+totino's T AH T IY N OW Z
+totman T AA T M AH N
+toto T OW T OW
+tots T AA T S
+totten T AA T AH N
+tottenberg T AA T AH N B ER G
+tottenham T AA T AH N AH M
+tottenham(2) T AA T AH N HH AE M
+totter T AA T ER
+tottering T AA T ER IH NG
+totton T AA T AH N
+totty T AA T IY
+totzke T AA T S K IY
+touareg T UW ER AH G
+touch T AH CH
+touchable T AH CH AH B AH L
+touchdown T AH CH D AW N
+touchdowns T AH CH D AW N Z
+touche T UW SH
+touched T AH CH T
+touches T AH CH AH Z
+touches(2) T AH CH IH Z
+touchet T UW SH EH T
+touchette T UW SH EH T
+touching T AH CH IH NG
+touchstone T AH CH S T OW N
+touchton T AH CH T AH N
+touchy T AH CH IY
+toufexis T UW F EH K S IH S
+tougaloo T UW G AH L UW
+tougas T AH G AH Z
+tough T AH F
+toughed T AH F T
+toughen T AH F AH N
+toughened T AH F AH N D
+toughening T AH F AH N IH NG
+toughens T AH F AH N Z
+tougher T AH F ER
+toughest T AH F AH S T
+toughie T AH F IY
+toughness T AH F N AH S
+toughs T AH F S
+touhey T AH HH IY
+toulouse T UW L UW Z
+toupee T UW P EY
+toupin T UW P IH N
+toups T UW P S
+tour T UH R
+tour's T UH R Z
+tourangeau T UH R EY NG G OW
+toured T UH R D
+tourette T ER EH T
+tourette's T ER EH T S
+touretzky T ER EH T S K IY
+tourigny T UH R AY N IY
+touring T UH R IH NG
+tourism T UH R IH Z AH M
+tourist T UH R AH S T
+tourist(2) T UH R IH S T
+tourists T UH R AH S T S
+tourists(2) T UH R IH S T S
+tourists(3) T UH R IH S S
+tourists(4) T UH R IH S
+tourmaline T UH R M AH L IY N
+tournament T UH R N AH M AH N T
+tournament's T UH R N AH M AH N T S
+tournaments T ER N AH M AH N T S
+tournedos T UH R N AH D OW
+tourney T ER N IY
+tourneys T UW R N IY Z
+tourniquet T ER N IH K IH T
+tournquist T UW R N K W IH S T
+touro T UW R OW
+tours T UH R Z
+tours(2) T AO R Z
+tourtelot T UH R T AH L AA T
+tourtelot(2) T UH R T AH L OW
+tourville T UH R V IH L
+tousey T AH S IY
+tousignant T UW S IH G N AH N T
+tousley T AH S L IY
+toussaint T UW S AE N
+toussaud T UW S AA D
+toussaud's T UW S AA D Z
+toussie T UW S IY
+tout T AW T
+toutant T UW T AO N T
+touted T AW T IH D
+touting T AW T IH NG
+touts T AW T S
+touvier T UW V IY EY
+touvier's T UW V IY EY Z
+tov T OW V
+tovar T OW V AA R
+tovaz T OW V AA Z
+tovey T OW V IY
+tovia T OW V IY AH
+tovia(2) T OW V Y AH
+tow T OW
+toward T AH W AO R D
+toward(2) T AO R D
+towards T AH W AO R D Z
+towards(2) T AO R D Z
+towbin T OW B IH N
+towboat T OW B OW T
+towe T OW
+towed T OW D
+towel T AW AH L
+towel(2) T AW L
+toweling T AW AH L IH NG
+toweling(2) T AW L IH NG
+towell T AA W EH L
+towels T AW AH L Z
+towels(2) T AW L Z
+tower T AW ER
+tower's T AW ER Z
+towered T AW ER D
+towering T AW ER IH NG
+towering(2) T AW R IH NG
+towers T AW ER Z
+towers' T AW ER Z
+towery T OW ER IY
+towey T OW IY
+towing T OW IH NG
+towle T AW L
+towle's T AW L Z
+towler T OW L ER
+towles T OW AH L Z
+town T AW N
+town's T AW N Z
+towne T AW N
+towner T AW N ER
+towners T AW N ER Z
+townes T AW N Z
+townhouse T AW N HH AW S
+townhouses T AW N HH AW S IH Z
+townie T AW N IY
+townley T AW N L IY
+towns T AW N Z
+townsel T AW N S AH L
+townsell T AW N S AH L
+townsend T AW N Z AH N D
+townsend's T AW N Z AH N D Z
+townsfolk T AW N Z F OW K
+townshend T AW N SH EH N D
+township T AW N SH IH P
+township's T AW N SH IH P S
+townships T AW N SH IH P S
+townsley T AW N S L IY
+townsman T AW N Z M AH N
+townson T AW N S AH N
+townspeople T AW N Z P IY P AH L
+towry T AO R IY
+tows T OW Z
+towsley T OW S L IY
+towson T OW S AH N
+toxic T AA K S IH K
+toxicity T AA K S IH S AH T IY
+toxicological T AA K S AH K AH L AA JH IH K AH L
+toxicologist T AA K S IH K AA L AH JH IH S T
+toxicologists T AA K S IH K AA L AH JH IH S T S
+toxicologists(2) T AA K S IH K AA L AH JH IH S S
+toxicologists(3) T AA K S IH K AA L AH JH IH S
+toxicology T AA K S IH K AA L AH JH IY
+toxics T AA K S IH K S
+toxin T AA K S AH N
+toxins T AA K S AH N Z
+toy T OY
+toy's T OY Z
+toya T OY AH
+toyama T OW Y AA M AH
+toye T OY
+toyed T OY D
+toying T OY IH NG
+toyko T OY K OW
+toymaker T OY M EY K ER
+toymakers T OY M EY K ER Z
+toyo T OW Y OW
+toyobo T OW Y OW B OW
+toyoda T OW Y OW D AH
+toyoo T OY UW
+toyota T OW Y OW T AH
+toyota's T OW Y OW T AH Z
+toyotas T OY OW T AH Z
+toys T OY Z
+toys' T OY Z
+toystore T OY S T AO R
+toystores T OY S T AO R Z
+tozer T OW Z ER
+tozier T OW Z IY ER
+tozzi T AA Z IY
+traber T R EY B ER
+trabert T R AE B ER T
+trabucco T R AA B UW K OW
+trabue T R AA B W EH
+trac T R AE K
+trace T R EY S
+traceable T R EY S AH B AH L
+traced T R EY S T
+tracer T R EY S ER
+tracers T R EY S ER Z
+traces T R EY S AH Z
+traces(2) T R EY S IH Z
+tracey T R EY S IY
+trachea T R EY K IY AH
+tracheal T R EY K IY AH L
+tracheophyte T R EY K IY AH F AY T
+tracheophytes T R EY K IY AH F AY T S
+trachsel T R AE K S AH L
+tracht T R AE K T
+trachtenberg T R AE K T AH N B ER G
+traci T R EY S IY
+tracie T R EY S IY
+tracinda T R AH S IH N D AH
+tracinda's T R AH S IH N D AH Z
+tracing T R EY S IH NG
+track T R AE K
+track's T R AE K S
+trackage T R AE K IH JH
+trackball T R AE K B AO L
+trackballs T R AE K B AO L Z
+tracked T R AE K T
+tracker T R AE K ER
+trackers T R AE K ER Z
+tracking T R AE K IH NG
+tracks T R AE K S
+tracor T R EY S ER
+tracor(2) T R EH K ER
+tracor(3) T R EY K AO R
+tracor(4) T R AE K AO R
+tract T R AE K T
+tractable T R AE K T AH B AH L
+tractebel T R AE K T AH B AH L
+traction T R AE K SH AH N
+tractor T R AE K T ER
+tractors T R AE K T ER Z
+tracts T R AE K T S
+tracy T R EY S IY
+tracy's T R EY S IY Z
+tracz T R AA CH
+traczyk T R AA CH IH K
+tradable T R EY D AH B AH L
+trade T R EY D
+trade's T R EY D Z
+tradeable T R EY D AH B AH L
+traded T R EY D IH D
+trademark T R EY D M AA R K
+trademarked T R EY D M AA R K T
+trademarks T R EY D M AA R K S
+tradeoff T R EY D AO F
+tradeoffs T R EY D AO F S
+trader T R EY D ER
+trader's T R EY D ER Z
+traders T R EY D ER Z
+traders' T R EY D ER Z
+trades T R EY D Z
+tradesmen T R EY D Z M AH N
+trading T R EY D IH NG
+trading's T R EY D IH NG Z
+tradings T R EY D IH NG Z
+tradition T R AH D IH SH AH N
+traditional T R AH D IH SH AH N AH L
+traditionalist T R AH D IH SH AH N AH L IH S T
+traditionalists T R AH D IH SH N AH L AH S T S
+traditionally T R AH D IH SH AH N AH L IY
+traditionally(2) T R AH D IH SH N AH L IY
+traditions T R AH D IH SH AH N Z
+traeger T R EH G ER
+traer T R EH R
+trafalgar T R AH F AE L G ER
+traffic T R AE F IH K
+traffic's T R AE F IH K S
+trafficker T R AE F IH K ER
+traffickers T R AE F IH K ER Z
+trafficking T R AE F IH K IH NG
+trafford T R AE F ER D
+traficant T R AE F IH K AH N T
+traficante T R AA F IY K AA N T IY
+traficants T R AE F IH K AH N T S
+trafillio T R AH F IY L IY OW
+trafillio's T R AH F IY L IY OW Z
+trafton T R AE F T AH N
+tragedies T R AE JH AH D IY Z
+tragedy T R AE JH AH D IY
+trager T R EY G ER
+trageser T R AE G IY Z ER
+tragic T R AE JH IH K
+tragically T R AE JH IH K L IY
+tragicomic T R AE JH IH K AA M IH K
+tragos T R AE G OW Z
+trahan T R AE HH AH N
+trahern T R AE HH ER N
+trail T R EY L
+trailblazer T R EY L B L EY Z ER
+trailblazers T R EY L B L EY Z ER Z
+trailed T R EY L D
+trailer T R EY L ER
+trailers T R EY L ER Z
+trailhead T R EY L HH EH D
+trailing T R EY L IH NG
+trails T R EY L Z
+trails' T R EY L Z
+trailways T R EY L W EY Z
+trailways' T R EY L W EY Z
+train T R EY N
+train's T R EY N Z
+traina T R EY N AH
+trainable T R EY N AH B AH L
+trained T R EY N D
+trainee T R EY N IY
+trainees T R EY N IY Z
+trainer T R EY N ER
+trainers T R EY N ER Z
+training T R EY N IH NG
+trainmen T R EY N M AH N
+trainor T R EY N ER
+trains T R EY N Z
+traipse T R EY P S
+traipsing T R EY P S IH NG
+traister T R EY S T ER
+trait T R EY T
+traitor T R EY T ER
+traitorous T R EY T ER AH S
+traitors T R EY T ER Z
+traits T R EY T S
+trajan T R EY JH AH N
+trajan's T R EY JH AH N Z
+trajectory T R AH JH EH K T ER IY
+trak T R AE K
+trakas T R AA K AH Z
+tram T R AE M
+tramble T R AE M B AH L
+tramco T R AE M K OW
+tramel T R AE M AH L
+tramell T R AA M EY L
+tramiel T R AE M IY AH L
+trammel T R AE M AH L
+trammell T R AE M AH L
+tramontana T R AA M OW N T AE N AH
+tramontano T R AA M OW N T AA N OW
+tramonte T R AA M OW N T IY
+tramontin T R AH M AA N T IH N
+tramp T R AE M P
+trampe T R AE M P
+tramped T R AE M P T
+tramping T R AE M P IH NG
+trample T R AE M P AH L
+trampled T R AE M P AH L D
+tramples T R AE M P AH L Z
+trampling T R AE M P L IH NG
+trampoline T R AE M P AH L IY N
+tramps T R AE M P Z
+trams T R AE M Z
+tran T R AE N
+tranberg T R AE N B ER G
+trance T R AE N S
+tranche T R AE N CH
+tranches T R AE N CH EH Z
+tranchina T R AA N K IY N AH
+trane T R EY N
+trang T R AE NG
+trani T R AA N IY
+tranquil T R AE NG K W AH L
+tranquil(2) T R AE NG K W IH L
+tranquility T R AE NG K W IH L IH T IY
+tranquilize T R AE NG K W AH L AY Z
+tranquilizer T R AE NG K W AH L AY Z ER
+tranquilizers T R AE NG K W AH L AY Z ER Z
+tranquilizing T R AE NG K W AH L AY Z IH NG
+trans T R AE N Z
+transact T R AE N Z AE K T
+transacted T R AE N S AE K T IH D
+transacted(2) T R AE N Z AE K T IH D
+transaction T R AE N Z AE K SH AH N
+transaction's T R AE N Z AE K SH AH N Z
+transactions T R AE N Z AE K SH AH N Z
+transafrica T R AE N Z AE F R IH K AH
+transalaska T R AE N Z AH L AE S K AH
+transalta T R AE N Z AO L T AH
+transamerica T R AE N S AH M EH R IH K AH
+transamerica's T R AE N Z AH M EH R IH K AH Z
+transamerican T R AE N Z AH M EH R IH K AH N
+transamerican's T R AE N Z AH M EH R IH K AH N Z
+transatlantic T R AE N Z AH T L AE N T IH K
+transatlantic(2) T R AE N Z AH T L AE N IH K
+transcanada T R AE N Z K AE N AH T AH
+transcanada's T R AE N Z K AE N AH D AH Z
+transcapital T R AE N Z K AE P IH T AH L
+transcend T R AE N S EH N D
+transcended T R AE N S EH N D IH D
+transcendence T R AE N S EH N D AH N S
+transcendent T R AE N S EH N D AH N T
+transcendental T R AE N S AH N D EH N T AH L
+transcendental(2) T R AE N S AH N D EH N AH L
+transcending T R AE N S EH N D IH NG
+transcends T R AE N S EH N D Z
+transchannel T R AH N S CH AE N AH L
+transchannel's T R AH N S CH AE N AH L Z
+transcisco T R AE N S IH S K OW
+transco T R AE N S K OW
+transcon T R AE N Z K AA N
+transcontinental T R AE N Z K AA N T IH N EH N T AH L
+transcontinental's T R AE N Z K AA N T IH N EH N T AH L Z
+transcontinental's(2) T R AE N Z K AA N IH N EH N T AH L Z
+transcontinental's(3) T R AE N Z K AA N T IH N EH N AH L Z
+transcontinental's(4) T R AE N Z K AA N IH N EH N AH L Z
+transcontinental(2) T R AE N Z K AA N IH N EH N T AH L
+transcontinental(3) T R AE N Z K AA N T IH N EH N AH L
+transcontinental(4) T R AE N Z K AA N IH N EH N AH L
+transcribe T R AE N S K R AY B
+transcribed T R AE N S K R AY B D
+transcriber T R AE N S K R AY B ER
+transcribers T R AE N S K R AY B ER Z
+transcribes T R AE N S K R AY B Z
+transcribing T R AE N S K R AY B IH NG
+transcript T R AE N S K R IH P T
+transcription T R AE N S K R IH P SH AH N
+transcriptions T R AE N S K R IH P SH AH N Z
+transcripts T R AE N S K R IH P T S
+transducer T R AE N S D UW S ER
+transducers T R AE N S D UW S ER Z
+transect T R AE N S EH K T
+transected T R AE N S EH K T IH D
+transection T R AE N S EH K SH AH N
+transfer T R AE N S F ER
+transferability T R AE N S F ER AH B IH L IH T IY
+transferable T R AE N S F ER AH B AH L
+transfered T R AE N S F ER D
+transference T R AE N S F ER AH N S
+transfering T R AE N S F ER IH NG
+transferrable T R AE N S F ER AH B AH L
+transferred T R AE N S F ER D
+transferring T R AE N S F ER IH NG
+transfers T R AE N S F ER Z
+transfix T R AE N S F IH K S
+transfixed T R AE N S F IH K S T
+transform T R AE N S F AO R M
+transformation T R AE N S F ER M EY SH AH N
+transformational T R AE N S F ER M EY SH AH N AH L
+transformations T R AE N S F ER M EY SH AH N Z
+transformed T R AE N S F AO R M D
+transformer T R AE N S F AO R M ER
+transformers T R AE N S F AO R M ER Z
+transforming T R AE N S F AO R M IH NG
+transforms T R AE N S F AO R M Z
+transfuse T R AE N S F Y UW Z
+transfused T R AE N S F Y UW Z D
+transfusion T R AE N S F Y UW ZH AH N
+transfusions T R AE N S F Y UW ZH AH N Z
+transgender T R AE N Z JH EH N D ER
+transgenic T R AE N Z JH EH N IH K
+transgress T R AE N Z G R EH S
+transgressed T R AE N Z G R EH S T
+transgresses T R AE N Z G R EH S IH S
+transgressing T R AE N Z G R EH S IH NG
+transgression T R AE N Z G R EH SH AH N
+transgressions T R AE N Z G R EH SH AH N Z
+transgressor T R AE N Z G R EH S ER
+transience T R AE N Z IY AH N S
+transient T R AE N ZH AH N T
+transients T R AE N Z IY AH N T S
+transillumination T R AE N Z AH L UW M AH N EY SH AH N
+transimage T R AE N Z IH M IH JH
+transistor T R AE N Z IH S T ER
+transistors T R AE N Z IH S T ER Z
+transit T R AE N Z IH T
+transited T R AE N Z IH T IH D
+transiting T R AE N Z IH T IH NG
+transition T R AE N Z IH SH AH N
+transitional T R AE N S IH SH AH N AH L
+transitional(2) T R AE N Z IH SH AH N AH L
+transitioning T R AE N Z IH SH AH N IH NG
+transitions T R AE N Z IH SH AH N Z
+transitory T R AE N Z AH T AO R IY
+transits T R AE N Z IH T S
+transkei T R AE N Z K EY
+translate T R AE N Z L EY T
+translate(2) T R AE N S L EY T
+translated T R AE N Z L EY T AH D
+translated(2) T R AE N S L EY T IH D
+translates T R AE N Z L EY T S
+translates(2) T R AE N S L EY T S
+translating T R AE N Z L EY T IH NG
+translating(2) T R AE N S L EY T IH NG
+translation T R AE N Z L EY SH AH N
+translation(2) T R AE N S L EY SH AH N
+translations T R AE N Z L EY SH AH N Z
+translations(2) T R AE N S L EY SH AH N Z
+translator T R AE N S L EY T ER
+translator(2) T R AE N Z L EY T ER
+translators T R AE N S L EY T ER Z
+translators(2) T R AE N Z L EY T ER Z
+translogic T R AE N Z L AA JH IH K
+translucent T R AE N S L UW S AH N T
+transmark T R AE N Z M AA R K
+transmedia T R AE N Z M IY D IY AH
+transmission T R AE N S M IH SH AH N
+transmission(2) T R AE N Z M IH SH AH N
+transmissions T R AE N Z M IH SH AH N Z
+transmit T R AE N Z M IH T
+transmits T R AE N Z M IH T S
+transmittable T R AE N Z M IH T AH B AH L
+transmittal T R AE N S M IH T AH L
+transmitted T R AE N S M IH T IH D
+transmitted(2) T R AE N Z M IH T AH D
+transmitter T R AE N S M IH T ER
+transmitter's T R AE N S M IH T ER Z
+transmitters T R AE N S M IH T ER Z
+transmitting T R AE N S M IH T IH NG
+transnational T R AE N S N AE SH AH N AH L
+transoceanic T R AE N Z OW SH IY AE N IH K
+transohio T R AE N Z OW HH AY OW
+transom T R AE N S AH M
+transoms T R AE N S AH M Z
+transou T R AE N Z UW
+transpac T R AE N Z P AE K
+transpacific T R AE N S P AH S IH F IH K
+transparencies T R AE N S P EH R AH N S IY Z
+transparency T R AE N S P EH R AH N S IY
+transparent T R AE N S P EH R AH N T
+transparently T R AE N S P EH R AH N T L IY
+transpark T R AE N S P AA R K
+transpire T R AE N S P AY ER
+transpired T R AE N S P AY ER D
+transpires T R AE N S P AY ER Z
+transpiring T R AE N S P AY ER IH NG
+transplant T R AE N S P L AE N T
+transplantation T R AE N Z P L AE N T EY SH AH N
+transplanted T R AE N S P L AE N T IH D
+transplanting T R AE N S P L AE N T IH NG
+transplants T R AE N S P L AE N T S
+transponder T R AE N S P AA N D ER
+transponders T R AE N S P AA N D ER Z
+transport T R AE N S P AO R T
+transportable T R AE N S P AO R T AH B AH L
+transportation T R AE N S P ER T EY SH AH N
+transportation's T R AE N S P ER T EY SH AH N Z
+transported T R AE N S P AO R T AH D
+transporter T R AE N S P AO R T ER
+transporters T R AE N S P AO R T ER Z
+transporting T R AE N S P AO R T IH NG
+transports T R AE N S P AO R T S
+transpose T R AE N S P OW Z
+transposed T R AE N S P OW Z D
+transracial T R AE N Z R EY SH AH L
+transrapid T R AE N Z R AE P IH D
+transsexual T R AE N S EH K SH Y UW AH L
+transsexuals T R AE N S EH K SH Y UW AH L Z
+transtar T R AE N S T AA R
+transtechnology T R AE N Z T AH K N AA L AH JH IY
+transtector T R AE N Z T EH K T ER
+transue T R AE N Z UW
+transvaal T R AE N Z V AA L
+transverse T R AE N Z V ER S
+transvestite T R AE N Z V EH S T AY T
+transvestites T R AE N Z V EH S T AY T S
+transway T R AE N Z W EY
+transwestern T R AE N Z W EH S T ER N
+transworld T R AE N S W ER L D
+transylvania T R AE N Z IY L V EY N IY AH
+transylvania(2) T R AE N S IH L V EY N Y AH
+trant T R AE N T
+tranter T R AE N T ER
+trantham T R AE N TH AH M
+tranum T R AE N AH M
+tranzonic T R AE N Z AA N IH K
+trap T R AE P
+trapani T R AA P AA N IY
+trapasso T R AA P AA S OW
+trapelo T R AH P EH L OW
+trapeze T R AH P IY Z
+traphagen T R AE F AH G AH N
+trapnell T R AE P N AH L
+trapp T R AE P
+trappe T R AE P
+trapped T R AE P T
+trapper T R AE P ER
+trappers T R AE P ER Z
+trapping T R AE P IH NG
+trappings T R AE P IH NG Z
+trappist T R AE P IH S T
+traps T R AE P S
+trash T R AE SH
+trashed T R AE SH T
+trashes T R AE SH IH Z
+trashing T R AE SH IH NG
+trashy T R AE SH IY
+trask T R AE S K
+traub T R AO B
+traudt T R AO D T
+trauger T R AW G ER
+traugh T R AO
+traughber T R AO B ER
+traugott T R AW G AH T
+traum T R AO M
+trauma T R AO M AH
+traumas T R AO M AH Z
+traumatic T R AO M AE T IH K
+traumatize T R AO M AH T AY Z
+traumatized T R AO M AH T AY Z D
+trausch T R AW SH
+traut T R AO T
+trauth T R AO TH
+trautman T R AW T M AH N
+trautmann T R AW T M AH N
+trautner T R AW T N ER
+trautwein T R AW T W AY N
+travaglini T R AA V AA G L IY N IY
+travail T R AH V EY L
+travails T R AH V EY L Z
+travel T R AE V AH L
+travelday T R AE V AH L D EY
+traveldays T R AE V AH L D EY Z
+traveled T R AE V AH L D
+traveler T R AE V AH L ER
+traveler's T R AE V AH L ER Z
+traveler(2) T R AE V L ER
+travelers T R AE V AH L ER Z
+travelers' T R AE V AH L ER Z
+travelers(2) T R AE V L ER Z
+travelgate T R AE V AH L G EY T
+traveling T R AE V AH L IH NG
+traveling(2) T R AE V L IH NG
+travelled T R AE V AH L D
+traveller T R AE V AH L ER
+travellers T R AE V AH L ER Z
+travelling T R AE V AH L IH NG
+travelling(2) T R AE V L IH NG
+travelodge T R AE V AH L AA JH
+travelogue T R AE V AH L AO G
+travels T R AE V AH L Z
+travelstead T R AE V AH L S T EH D
+travenol T R AE V AH N AH L
+traver T R EY V ER
+travers T R AE V ER Z
+traverse T R AE V ER S
+traverse(2) T R AH V ER S
+traversed T R AE V ER S T
+traversed(2) T R AH V ER S T
+traversing T R AH V ER S IH NG
+traverso T R AA V EH R S OW
+travesties T R AE V AH S T IY Z
+travesty T R AE V AH S T IY
+traviata T R AA V IY AA T AH
+travieso T R AA V IY S OW
+travis T R AE V IH S
+travisano T R AE V IH S AA N OW
+travnik T R AE V N IH K
+travolta T R AH V OW L T AH
+travolta's T R AH V OW L T AH Z
+travoltas T R AH V OW L T AH Z
+traweek T R AO IY K
+trawick T R AO IH K
+trawler T R AO L ER
+trawlers T R AO L ER Z
+trax T R AE K S
+traxler T R AE K S L ER
+tray T R EY
+trayer T R EY ER
+traylor T R EY L ER
+traynham T R EY N HH AH M
+traynor T R EY N ER
+trays T R EY Z
+traywick T R EY W IH K
+trbovich T ER B AA V IH CH
+tre T R EY
+treacherous T R EH CH ER AH S
+treachery T R EH CH ER IY
+treacy T R EY S IY
+tread T R EH D
+treadaway T R EH D AH W EY
+treading T R EH D IH NG
+treadmill T R EH D M IH L
+treadmills T R EH D M IH L Z
+treads T R EH D Z
+treadway T R EH D W EY
+treadwell T R EH D W EH L
+treadwheel T R EH D W IY L
+treanor T R IY N ER
+trease T R IY Z
+treason T R IY Z AH N
+treaster T R IY S T ER
+treasure T R EH ZH ER
+treasured T R EH ZH ER D
+treasurer T R EH ZH ER ER
+treasurer's T R EH ZH ER ER Z
+treasurers T R EH ZH ER ER Z
+treasures T R EH ZH ER Z
+treasuries T R EH ZH ER IY Z
+treasury T R EH ZH ER IY
+treasury's T R EH ZH ER IY Z
+treasurys T R EH ZH ER IY Z
+treat T R IY T
+treatable T R IY T AH B AH L
+treated T R IY T AH D
+treated(2) T R IY T IH D
+treater T R IY T ER
+treaters T R IY T ER Z
+treaties T R IY T IY Z
+treating T R IY T IH NG
+treatise T R IY T AH S
+treatises T R IY T AH S AH Z
+treatment T R IY T M AH N T
+treatments T R IY T M AH N T S
+treats T R IY T S
+treaty T R IY T IY
+treaty's T R IY T IY Z
+trebilcock T R IH B IH L K AH K
+treble T R EH B AH L
+trebled T R EH B AH L D
+treblinka T R EH B L IH NG K ER
+treblinka(2) T R EH B L IH NG K AH
+trecker T R EH K ER
+treder T R IY D ER
+tredway T R EH D W EY
+tree T R IY
+treece T R IY S
+treeless T R IY L AH S
+treen T R IY N
+trees T R IY Z
+treese T R IY Z
+treesh T R IY SH
+treesweet T R IY S W IY T
+treetop T R IY T AO P
+treetops T R IY T AO P S
+trefethen T R EH F IH TH AH N
+trefgarne T R EH F G AA R N
+trefry T R EH F R IY
+trefz T R EH F Z
+treglia T R EH G L IY AH
+trego T R EH G OW
+tregoning T R EH G AH N IH NG
+tregre T R EH G ER
+tregurtha T R EH G ER TH AH
+treharne T R EH HH AA R N
+treiber T R AY B ER
+treichel T R AY K AH
+treichler T R AY K AH L ER
+treichler(2) T R AY K L ER
+treinen T R AY N AH N
+trejo T R EY Y OW
+trek T R EH K
+trekked T R EH K T
+trekking T R EH K IH NG
+treks T R EH K S
+trela T R EH L AH
+trella T R EH L AH
+trelleborg T R EH L AH B AO R G
+trelleborg's T R EH L AH B AO R G Z
+trellis T R EH L AH S
+treloar T R EH L AO R
+tremain T R EH M AY N
+tremaine T R IH M EY N
+tremayne T R EH M EY N
+trembath T R EH M B AH TH
+tremblay T R EH M B L EY
+tremble T R EH M B AH L
+trembled T R EH M B AH L D
+trembley T R EH M B L IY
+trembling T R EH M B AH L IH NG
+trembling(2) T R EH M B L IH NG
+trembly T R EH M B L IY
+tremel T R EH M AH L
+tremendous T R AH M EH N D AH S
+tremendous(2) T R IH M EH N D AH S
+tremendously T R AH M EH N D AH S L IY
+tremendously(2) T R IH M EH N D AH S L IY
+tremens T R EH M AH N Z
+treml T R EH M AH L
+tremmel T R EH M AH L
+tremont T R EH M AH N T
+tremor T R EH M ER
+tremors T R EH M ER Z
+tremper T R EH M P ER
+tremulous T R EH M Y AH L AH S
+tremulously T R EH M Y AH L AH S L IY
+trenary T R EH N EH R IY
+trench T R EH N CH
+trenchant T R EH N CH AH N T
+trenchard T R EH NG K ER D
+trencher T R EH N CH ER
+trenches T R EH N CH IH Z
+trend T R EH N D
+trended T R EH N D IH D
+trendier T R EH N D Y ER
+trendier(2) T R EH N D IY ER
+trendiest T R EH N D IY S T
+trendiest(2) T R EH N D IY AH S T
+trending T R EH N D IH NG
+trendless T R EH N D L AH S
+trendline T R EH N D L AY N
+trends T R EH N D Z
+trends(2) T R EH N Z
+trendsetter T R EH N D S EH T ER
+trendy T R EH N D IY
+trenholm T R EH N HH OW L M
+trenkamp T R EH N K AE M P
+trenkle T R EH NG K AH L
+trent T R EH N T
+trent's T R EH N T S
+trente-et-quarante T R EY N T EY K W AA R EH N T EY
+trentham T R EH N TH AH M
+trentman T R EH N T M AH N
+trenton T R EH N T AH N
+trenton's T R EH N T AH N Z
+treon T R IY AH N
+trepagnier T R EH P AH G N IY ER
+trepanier T R EH P AH N IY ER
+trepidation T R EH P IH D EY SH AH N
+treppel T R EH P AH L
+treptow T R EH P T OW
+tresch T R EH SH
+trescott T R EH S K AH T
+trespass T R EH S P AE S
+trespass(2) T R EH S P AH S
+trespassing T R EH S P AE S IH NG
+trespassing(2) T R EH S P AH S IH NG
+tress T R EH S
+tressel T R EH S AH L
+tresses T R EH S IH Z
+tressler T R EH S L ER
+trest T R EH S T
+trester T R EH S T ER
+trestle T R EH S AH L
+trethewey T R EH TH Y UW IY
+tretinoin T R EH T IH N OY N
+trettel T R EH T AH L
+tretter T R EH T ER
+trettin T R EH T IH N
+treu T R UW
+treuhand T R UW HH AE N D
+treuhandanstalt T R UW HH AE N D AH N S T AA L T
+treurnicht T R UW R N IH K T
+trevathan T R EH V AH TH AH N
+trevelyan T R AH V EH L Y AH N
+trevino T R AH V IY N OW
+treviso T R EH V IY S OW
+trevizo T R EH V IY Z OW
+trevor T R EH V ER
+trew T R UW
+trexler T R EH K S L ER
+trey T R EY
+treybig T R EY B IH G
+trezise T R EH Z AY Z
+trezza T R EH Z AH
+tri T R AY
+tri-state T R AY S T EY T
+triad T R AY AE D
+triad's T R AY AE D Z
+triads T R AY AE D Z
+triage T R AY IH JH
+trial T R AY AH L
+trial's T R AY AH L Z
+trial(2) T R AY L
+trials T R AY AH L Z
+trials(2) T R AY L Z
+triana T R IY AE N AH
+triangle T R AY AE NG G AH L
+triangle's T R AY AE NG G AH L Z
+triangles T R AY AE NG G AH L Z
+triangular T R AY AE NG G Y AH L ER
+triangulation T R AY AE NG G Y UW L EY SH AH N
+triano T R IY AA N OW
+triarc T R AY AA R K
+triassic T R AY AE S IH K
+triathlon T R AY AE TH L AH N
+trib T R IH B
+tribal T R AY B AH L
+tribalism T R AY B AH L IH Z M
+tribalism(2) T R AY B AH L IH Z AH M
+tribasa T R AY B AE S AH
+tribbett T R IH B IH T
+tribbey T R IH B IY
+tribble T R IH B AH L
+tribbles T R IH B AH L Z
+tribby T R IH B IY
+tribe T R AY B
+tribe's T R AY B Z
+tribeca T R IH B EH K AH
+tribes T R AY B Z
+tribesman T R AY B Z M AE N
+tribesmen T R AY B Z M IH N
+trible T R IH B AH L
+triborough T R AY B ER OW
+tribulation T R IH B Y AH L EY SH AH N
+tribulations T R IH B Y AH L EY SH AH N Z
+tribull T R IH B AH L
+tribunal T R AH B Y UW N AH L
+tribunals T R AY B Y UW N AH L Z
+tribune T R IH B Y UW N
+tribune's T R IH B Y UW N Z
+tributaries T R IH B Y AH T EH R IY Z
+tributary T R IH B Y AH T EH R IY
+tribute T R IH B Y UW T
+tribute's T R IH B Y UW T S
+tributes T R IH B Y UW T S
+tricarico T R IY K AA R IY K OW
+trice T R AY S
+tricentrol T R AY S EH N T R AA L
+tricentrol's T R AY S EH N T R AA L Z
+triceps T R AY S EH P S
+triceratops T R AY S EH R AH T AO P S
+triche T R IH CH
+trichet T R IH CH IH T
+tricia T R IH SH AH
+tricia's T R IH SH AH Z
+tricil T R IH S IH L
+trick T R IH K
+tricked T R IH K T
+trickel T R IH K AH L
+trickery T R IH K ER IY
+trickett T R IH K IH T
+trickey T R IH K IY
+trickier T R IH K IY ER
+trickiest T R IH K IY AH S T
+tricking T R IH K IH NG
+trickle T R IH K AH L
+trickled T R IH K AH L D
+trickles T R IH K AH L Z
+trickling T R IH K L IH NG
+tricks T R IH K S
+trickster T R IH K S T ER
+tricksters T R IH K S T ER Z
+tricky T R IH K IY
+trico T R IY K OW
+tricuspid T R AY K AH S P AH D
+tricycle T R IH S IH K AH L
+trident T R AY D AH N T
+tridex T R IH D EH K S
+trie T R AY
+tried T R AY D
+triennial T R AY EH N IY AH L
+trier T R AY ER
+trierweiler T R IH R W AY L ER
+tries T R AY Z
+trieste T R IY S T
+trieu T R UW
+trifari T R IH F AA R IY
+trifecta T R AY F EH K T AH
+trifle T R AY F AH L
+trifles T R AY F AH L Z
+trifling T R AY F L IH NG
+trig T R IH G
+trigg T R IH G
+trigger T R IH G ER
+triggered T R IH G ER D
+triggering T R IH G ER IH NG
+triggers T R IH G ER Z
+triggs T R IH G Z
+triglyceride T R AY G L IH S ER AY D
+triglycerides T R AY G L IH S ER AY D Z
+trigo T R IY G OW
+trilateral T R AY L AE T ER AH L
+trilby T R IH L B IY
+trill T R IH L
+trillin T R IH L IH N
+trilling T R IH L IH NG
+trillion T R IH L Y AH N
+trillions T R IH L Y AH N Z
+trillo T R IH L OW
+trilogy T R IH L AH JH IY
+trilon T R IH L AH N
+trim T R IH M
+trimac T R IH M AE K
+trimarchi T R IY M AA R K IY
+trimarco T R IH M AA R K OW
+trimas T R IY M AH S
+trimble T R IH M B AH L
+trimboli T R IY M B OW L IY
+trimedyne T R AY M D AY N
+trimester T R AY M EH S T ER
+trimetrexate T R IH M EH T R AH K S EY T
+trimm T R IH M
+trimmed T R IH M D
+trimmer T R IH M ER
+trimmers T R IH M ER Z
+trimming T R IH M IH NG
+trimmings T R IH M IH NG Z
+trimpe T R IH M P
+trims T R IH M Z
+trincomalee T R IH NG K OW M AH L IY
+trine T R AY N
+tringali T R IH NG G AA L IY
+trinh T R IH N
+trinidad T R IH N IH D AE D
+trinity T R IH N AH T IY
+trinity's T R IH N IH T IY Z
+trinity(2) T R IH N IH T IY
+trinka T R IH NG K AH
+trinket T R IH NG K AH T
+trinkets T R IH NG K AH T S
+trinkle T R IH NG K AH L
+trinova T R AY N OW V AH
+trintex T R IH N T EH K S
+trio T R IY OW
+trio's T R IY OW Z
+triola T R IY OW L AH
+triolo T R IY OW L OW
+triomphe T R IY OW M F
+trip T R IH P
+trip's T R IH P S
+tripartite T R AY P AA R T AY T
+tripe T R AY P
+tripi T R IY P IY
+triple T R IH P AH L
+triplecast T R IH P AH L K AE S T
+tripled T R IH P AH L D
+triples T R IH P AH L Z
+triplet T R IH P L AH T
+triplets T R IH P L AH T S
+triplett T R IH P L IH T
+triplex T R IH P L EH K S
+triplicate T R IH P L IH K AH T
+tripling T R IH P AH L IH NG
+tripling(2) T R IH P L IH NG
+tripod T R AY P AA D
+tripodi T R IY P OW D IY
+tripods T R AY P AA D Z
+tripoli T R IH P AH L IY
+tripoli's T R IH P AH L IY Z
+tripp T R IH P
+tripp's T R IH P S
+trippe T R IH P
+tripped T R IH P T
+trippel T R IH P AH L
+tripper T R IH P ER
+trippers T R IH P ER Z
+trippett T R IH P IH T
+trippie T R IH P IY
+tripping T R IH P IH NG
+tripple T R IH P AH L
+trips T R IH P S
+triptych T R IH P T IH K
+triremes T R AY R IY M Z
+trish T R IH SH
+trisha T R IH SH AH
+trisha's T R IH SH AH Z
+triska T R IH S K AH
+trisler T R IH S AH L ER
+trisler(2) T R IH S L ER
+trism T R IH Z AH M
+trista T R IH S T AH
+tristan T R IH S T AE N
+tristar T R AY S T AA R
+tristate T R AY S T EY T
+tristram T R IH S T R AH M
+tritch T R IH CH
+trite T R AY T
+trites T R AY T S
+tritium T R IH T IY AH M
+triton T R AY T AH N
+triton's T R AY T AH N Z
+tritsch T R IH CH
+tritschler T R IH CH L ER
+tritt T R IH T
+tritz T R IH T S
+triumph T R AY AH M F
+triumphal T R AY AH M F AH L
+triumphant T R AY AH M F AH N T
+triumphantly T R AY AH M F AH N T L IY
+triumphed T R AY AH M F T
+triumphs T R AY AH M F S
+triumvirate T R AY AH M V ER AH T
+trivedi T R IY V EH D IY
+trivest T R IH V AH S T
+trivest(2) T R AY V EH S T
+trivett T R IH V IH T
+trivette T R IH V EH T
+trivia T R IH V IY AH
+trivial T R IH V IY AH L
+triviality T R IH V IY AE L AH T IY
+trivialize T R IH V IY AH L AY Z
+trivialize(2) T R IH V Y AH L AY Z
+trivialized T R IH V IY AH L AY Z D
+trivialized(2) T R IH V Y AH L AY Z D
+trivializes T R IH V IY AH L AY Z IH Z
+trivializes(2) T R IH V Y AH L AY Z IH Z
+trivializing T R IH V IY AH L AY Z IH NG
+trivializing(2) T R IH V Y AH L AY Z IH NG
+trixie T R IH K S IY
+trixy T R IH K S IY
+trizec T R IH Z AH K
+trizec's T R IH Z EH K S
+trnka T R IH NG K AH
+trnka(2) T R NG K AA
+trnopolje T R AH N AO P AO L IY
+trnopolje(2) T EH R N AH P AO L Y EH
+trobaugh T R AA B AO
+troche T R AA CH
+trochmann T R AA CH M AE N
+trochmann(2) T R AA K M AE N
+trocki T R AA K IY
+trod T R AA D
+trodden T R AA D AH N
+troeger T R OW G ER
+troendle T R OW N D AH L
+troester T R OW S T ER
+trogdon T R AA G D AH N
+troha T R OW HH AH
+troia T R OW Y AH
+troiani T R OW Y AA N IY
+troiano T R OW IY AA N OW
+troika T R OY K AH
+trois T W AA
+troise T R OY Z
+troisi T R OY S IY
+trojan T R OW JH AH N
+trojanowski T R AH Y AH N AO F S K IY
+trojans T R OW JH AH N Z
+trokel T R OW K AH L
+trolinger T R OW L IH NG ER
+troll T R OW L
+trolley T R AA L IY
+trolleys T R AA L IY Z
+trolling T R OW L IH NG
+trollinger T R OW L IH NG ER
+troma T R OW M AH
+trombino T R OW M B IY N OW
+tromble T R AA M B AH L
+trombley T R AA M B L IY
+trombly T R AA M B L IY
+trombone T R AA M B OW N
+trombones T R AA M B OW N Z
+trombonist T R AA M B OW N IH S T
+tromp T R AA M P
+trompeter T R AA M P IY T ER
+tron T R AA N
+troncoso T R OW N K OW S OW
+trone T R OW N
+tronic T R AA N IH K
+troon T R UW N
+troop T R UW P
+troop's T R UW P S
+trooped T R UW P T
+trooper T R UW P ER
+trooper's T R UW P ER Z
+troopers T R UW P ER Z
+troopers' T R UW P ER Z
+trooping T R UW P IH NG
+troops T R UW P S
+troops' T R UW P S
+troost T R UW S T
+tropea T R OW P IY AH
+tropeano T R OW P IY N OW
+trophies T R OW F IY Z
+trophy T R OW F IY
+tropic T R AA P IH K
+tropical T R AA P IH K AH L
+tropicana T R AA P IH K AE N AH
+tropicana's T R AA P IH K AE N AH Z
+tropics T R AA P IH K S
+tropopause T R AA P AH P AO Z
+tropp T R AA P
+tropworld T R AA P W ER L D
+trosch T R AA SH
+trosclair T R AH S K L EH R
+trosper T R AA S P ER
+trost T R AA S T
+trostel T R AA S T AH L
+trostle T R AA S AH L
+trot T R AA T
+troth T R OW TH
+troth(2) T R AO TH
+trotman T R AA T M AH N
+trots T R AA T S
+trotsky T R AA T S K IY
+trott T R AA T
+trotted T R AA T AH D
+trotted(2) T R AA T IH D
+trotten T R AA T AH N
+trotter T R AA T ER
+trottier T R AA T IY ER
+trotting T R AA T IH NG
+troubadour T R UW B AH D AO R
+troubh T R UW B
+trouble T R AH B AH L
+troubled T R AH B AH L D
+troublefield T R AH B AH L F IY L D
+troublemaker T R AH B AH L M EY K ER
+troublemakers T R AH B AH L M EY K ER Z
+troubles T R AH B AH L Z
+troubleshooter T R AH B AH L SH UW T ER
+troublesome T R AH B AH L S AH M
+troubling T R AH B AH L IH NG
+troubling(2) T R AH B L IH NG
+troudt T R AW D T
+trough T R AO F
+troughs T R AO F S
+trounce T R AW N S
+trounced T R AW N S T
+trouncing T R AW N S IH NG
+troung T R AW NG
+troup T R UW P
+troupe T R UW P
+troupe's T R UW P S
+troupes T R UW P S
+trousdale T ER AH S D EY L
+trouser T R AW Z ER
+trousers T R AW Z ER Z
+trout T R AW T
+trout's T R AW T S
+troutman T R AW T M AH N
+troutner T R AW T N ER
+troutt T R AW T
+troutwine T R AW T W AY N
+trovato T R OW V AA T OW
+trovatore T R OW V AH T AO R
+trove T R OW V
+trow T R OW
+trowbridge T R OW B R IH JH
+trowel T R AW W EH L
+trowell T R AA W EH L
+trower T R AW ER
+troxel T R AA K S AH L
+troxell T R AA K S AH L
+troxler T R AA K S L ER
+troy T R OY
+troyan T R OY AH N
+troyanos T R OY AA N OW S
+troyat T R OY AE T
+troyer T R OY ER
+troyka T R OY K AH
+troyu T R OY UW
+truancy T R UW AH N S IY
+truant T R UW AH N T
+truax T R UW AE K S
+trubey T R UW B IY
+truby T R UW B IY
+trucco T R UW K OW
+truce T R UW S
+truchan T R AH CH AH N
+truck T R AH K
+truck's T R AH K S
+trucked T R AH K T
+truckee T R AH K IY
+trucker T R AH K ER
+truckers T R AH K ER Z
+truckers' T R AH K ER Z
+trucking T R AH K IH NG
+truckload T R AH K L OW D
+truckloads T R AH K L OW D Z
+trucks T R AH K S
+trucks' T R AH K S
+truculent T R AH K Y AH L AH N T
+truda T R UW D AH
+trude T R UW D
+trudeau T R UW D OW
+trudel T R UW D AH L
+trudell T R AH D AH L
+trudge T R AH JH
+trudged T R AH JH D
+trudgen T R AH JH AH N
+trudges T R AH JH IH Z
+trudging T R AH JH IH NG
+trudia T R UW D IY AH
+trudie T R UW D IY
+trudo T R UW D OW
+trudy T R UW D IY
+true T R UW
+true-view T R UW V Y UW
+trueblood T R UW B L AH D
+truell T R UW AH L
+truelove T R UW L AH V
+trueman T R UH M AH N
+truer T R UW ER
+truesdale T R UW Z D EY L
+truesdell T R UW Z D EH L
+truest T R UW IH S T
+truett T R UW T
+truex T R UW EH K S
+truffaut T R UW F OW
+truffaut's T R UW F OW Z
+truffle T R AH F AH L
+truffles T R AH F AH L Z
+truglio T R AH G L IY OW
+truicko T R UW K OW
+truicko(2) T R UW IY K OW
+truism T R UW IH Z AH M
+truitt T R UW T
+trujillo T R UW HH IY OW
+trull T R AH L
+trullinger T R AH L IH NG ER
+trulock T R AH L AH K
+trulove T R UW L OW V IY
+trulson T R AH L S AH N
+truluck T R AH L AH K
+truly T R UW L IY
+truman T R UW M AH N
+truman's T R UW M AH N Z
+trumble T R AH M B AH L
+trumbo T R AH M B OW
+trumbull T R AH M B AH L
+trumka T R AH M K AH
+trump T R AH M P
+trump's T R AH M P S
+trumped T R AH M P T
+trumpet T R AH M P AH T
+trumpeted T R AH M P AH T IH D
+trumpeter T R AH M P AH T ER
+trumpeting T R AH M P AH T IH NG
+trumpets T R AH M P AH T S
+trumpower T R AH M P OW ER
+trumps T R AH M P S
+truncate T R AH NG K EY T
+truncated T R AH NG K EY T IH D
+truncates T R AH NG K EY T S
+truncating T R AH NG K EY T IH NG
+truncation T R AH NG K EY SH AH N
+truncheon T R AH N CH IH N
+truncheons T R AH N CH IH N Z
+trundle T R AH N D AH L
+trundled T R AH N D AH L D
+trunk T R AH NG K
+trunkline T R AH NG K L AY N
+trunks T R AH NG K S
+trunnell T R AH N AH L
+trunzo T R AH N Z OW
+truong T R AO NG
+trupiano T R UW P IY AA N OW
+trupin T R UW P IH N
+trupin's T R UW P IH N Z
+trupp T R AH P
+truro T R UW R OW
+trus T R AH S
+truscott T R AH S K AH T
+truskowski T R AH S K AO F S K IY
+trusler T R AH S AH L ER
+trusler(2) T R AH S L ER
+truslow T R AH S L OW
+truss T R AH S
+trussell T R AH S AH L
+trusses T R AH S IH Z
+trust T R AH S T
+trust's T R AH S T S
+trustco T R AH S T K OW
+trustcorp T R AH S T K AO R P
+trusted T R AH S T IH D
+trustee T R AH S T IY
+trustee's T R AH S T IY Z
+trustees T R AH S T IY Z
+trustees' T R AH S T IY Z
+trusteeship T R AH S T IY SH IH P
+trusthouse T R AH S T HH AW S
+trusting T R AH S T IH NG
+trusts T R AH S T S
+trusts' T R AH S T S
+trustworthiness T R AH S T W ER DH IY N AH S
+trustworthy T R AH S T W ER DH IY
+trusty T R AH S T IY
+truszkowski T R AH SH K AO F S K IY
+truth T R UW TH
+truthful T R UW TH F AH L
+truthfully T R UW TH F AH L IY
+truthfulness T R UW TH F AH L N AH S
+truths T R UW TH S
+truxal T R AH K S AH L
+truxillo T R AH K S IH L OW
+try T R AY
+try-on T R AY AA N
+try-ons T R AY AA N Z
+tryart T R AY AA R T
+tryba T R IH B AH
+trybus T R IH B IH S
+trygg T R IH G
+trygstad T R IH G S T AH D
+trygve T R IH G V IY
+tryin' T R AY IH N
+trying T R AY IH NG
+trying(2) T R AY NG
+tryon T R AY AH N
+tryout T R AY AW T
+tryouts T R AY AW T S
+tryphena T R IH F IH N AH
+tryst T R IH S T
+tryst(2) T R AY S T
+trzaska T ER Z AA S K AH
+trzcinski T ER ZH IH N S K IY
+trzeciak T ER Z EH CH IY AE K
+ts T IY EH S
+tsai T S AY
+tsai's T S AY Z
+tsai's(2) S AY Z
+tsai(2) S AY
+tsakos T S AA K OW S
+tsang T S AE NG
+tsang(2) S AE NG
+tsao T S AW
+tsao(2) S AW
+tsar Z AA R
+tsar(2) T S AA R
+tschantz CH AE N T S
+tschetter CH EH T ER
+tschida CH AY D AH
+tschirhart CH ER HH AA R T
+tschopp CH AA P
+tschudy CH UW D IY
+tschumi CH UW M IY
+tse T S IY
+tse(2) S IY
+tsemel T S EH M AH L
+tseng T S EH NG
+tseng(2) S EH NG
+tsetse T S IY T S IY
+tsetse(2) T IY T S IY
+tshisekedi SH IH S EH K AH D IY
+tsiang T S Y AE NG
+tsingtao S IH NG T AW
+tsingtao(2) T S IH NG D AW
+tso T S OW
+tso(2) S OW
+tsongas T S AO NG G AH S
+tsongas' T S AO NG G AH S
+tsongas'(2) S AO NG G AH S
+tsongas's T S AO NG G AH S AH Z
+tsongas's(2) S AO NG G AH S AH Z
+tsongas(2) S AO NG G AH S
+tsu T S UW
+tsuda T S UW D AH
+tsuda(2) S UW D AH
+tsui T S UW IY
+tsui(2) S UW IY
+tsuji T S UW JH IY
+tsuji(2) S UW JH IY
+tsukamoto T S UW K AA M OW T OW
+tsukamoto(2) S UW K AA M OW T OW
+tsukuba T S UW K Y UW B AH
+tsukuba(2) S UW K Y UW B AH
+tsunami T S UW N AA M IY
+tsunami(2) S UW N AA M IY
+tsuneo T S UW N IY OW
+tsuneo(2) S UW N IY OW
+tsurumi T S UW R UW M IY
+tsurumi(2) S UW R UW M IY
+tsutomu T S UW T OW M UW
+tt's T IY T IY Z
+tu T UW
+tub T AH B
+tuba T UW B AH
+tubal T UW B AH L
+tubb T AH B
+tubbs T AH B Z
+tubby T AH B IY
+tube T UW B
+tube(2) T Y UW B
+tuberculosis T AH B ER K Y AH L OW S IH S
+tuberculosis(2) T UW B ER K Y AH L OW S AH S
+tuberculosis(3) T UW B ER K Y UW L OW S AH S
+tuberville T UW B ER V IH L
+tubes T UW B Z
+tubing T UW B IH NG
+tubman T AH B M AH N
+tubs T AH B Z
+tubular T UW B Y AH L ER
+tubule T UW B Y UW L
+tucci T UW CH IY
+tucci's T UW CH IY S
+tucciarone T UW CH ER OW N IY
+tuccillo T UW CH IH L OW
+tucek T UW CH EH K
+tuch T AH CH
+tuchman T AH K M AH N
+tucholski T AH HH OW L S K IY
+tuck T AH K
+tucked T AH K T
+tucker T AH K ER
+tucker's T AH K ER Z
+tuckerman T AH K ER M AH N
+tuckett T AH K IH T
+tuckey T AH K IY
+tucking T AH K IH NG
+tuckman T AH K M AH N
+tucks T AH K S
+tucson T UW S AA N
+tucuman T UW K Y UW M AH N
+tude T UW D
+tudisco T UW D IY S K OW
+tudjman T UH JH M AH N
+tudjman's T UH JH M AH N Z
+tudor T UW D ER
+tudor's T Y UW D ER Z
+tudor(2) T Y UW D ER
+tue T UW
+tuel T UW L
+tuell T UW L
+tuesday T UW Z D IY
+tuesday's T UW Z D IY Z
+tuesday's(2) T UW Z D EY Z
+tuesday's(3) T Y UW Z D EY Z
+tuesday(2) T UW Z D EY
+tuesday(3) T Y UW Z D EY
+tuesdays T UW Z D EY Z
+tuesdays(2) T UW Z D IY Z
+tuesdays(3) T Y UW Z D EY Z
+tufa T UW F AH
+tufano T UW F AA N OW
+tuff T AH F
+tufnel T AH F N IH L
+tufo T UW F OW
+tuft T AH F T
+tufte T AH F T
+tufted T AH F T AH D
+tufted(2) T AH F T IH D
+tuftlike T AH F T L AY K
+tufts T AH F T S
+tug T AH G
+tugboat T AH G B OW T
+tugboats T AH G B OW T S
+tugged T AH G D
+tugging T AH G IH NG
+tuggle T AH G AH L
+tugman T AH G M AH N
+tugs T AH G Z
+tugwell T AH G W EH L
+tuhan T UW HH AH N
+tuinstra T UW IH N S T R AH
+tuite T UW T
+tuition T Y UW IH SH AH N
+tuitions T UW IH SH AH N Z
+tuk T UW K
+tuks T AH K S
+tula T UW L AH
+tulane T UW L EY N
+tuley T Y UW L IY
+tulip T UW L AH P
+tulips T UW L AH P S
+tull T AH L
+tullar T AH L ER
+tuller T AH L ER
+tulley T UW L IY
+tullia T AH L IY AH
+tullier T AH L IY ER
+tullio T UW L IY OW
+tullis T AH L IH S
+tullius T AH L IY IH S
+tullo T UW L OW
+tulloch T AH L AH K
+tullock T AH L AH K
+tullos T AH L OW Z
+tully T AH L IY
+tulsa T AH L S AH
+tuma T UW M AH
+tumacoceri T UW M AH K OW CH ER IY
+tuman CH UW M AH N
+tumazos T UW M AA Z OW S
+tumble T AH M B AH L
+tumbled T AH M B AH L D
+tumbler T AH M B L ER
+tumbler's T AH M B L ER Z
+tumblers T AH M B L ER Z
+tumbles T AH M B AH L Z
+tumbleson T AH M B AH L S AH N
+tumblin T AH M B L IH N
+tumbling T AH M B AH L IH NG
+tumbling(2) T AH M B L IH NG
+tumeric T UW M EH R IH K
+tumescent T UW M EH S IH N T
+tumey T AH M IY
+tuminello T UW M IY N EH L OW
+tumlin T AH M L IH N
+tumlinson T AH M L IH N S AH N
+tummies T AH M IY Z
+tumminello T UW M IY N EH L OW
+tummond T AH M AH N D
+tummy T AH M IY
+tumolo T UW M OW L OW
+tumor T UW M ER
+tumors T UW M ER Z
+tums T AH M Z
+tums' T AH M Z
+tumult T UW M AH L T
+tumultuous T UW M AH L CH UW AH S
+tumulty T UW M AH L T IY
+tuna T UW N AH
+tuna(2) T Y UW N AH
+tunable T UW N AH B AH L
+tunafish T UW N AH F IH SH
+tunas T UW N AH Z
+tunde T AH N D
+tundra T AH N D R AH
+tune T UW N
+tuned T UW N D
+tuneful T UW N F AH L
+tuner T UW N ER
+tunes T UW N Z
+tuneup T UW N AH P
+tung T AH NG
+tung's T AH NG Z
+tungate T UW NG EY T
+tungsram T AH NG Z R AE M
+tungsrom T AH NG Z R AH M
+tungsrom's T AH NG Z R AH M Z
+tungsten T AH NG S T AH N
+tunic T UW N IH K
+tunica T UW N IH K AH
+tunica's T UW N IH K AH Z
+tunicate T UW N IH K AH T
+tunick T AH N IH K
+tuning T UW N IH NG
+tunis T UW N IH S
+tunis(2) T UW N IY S
+tunisia T UW N IY ZH AH
+tunisian T UW N IY ZH AH N
+tunison T AH N IH S AH N
+tunison(2) T UW N IH S AH N
+tunkelang T AH NG K L AE NG
+tunks T AH NG K S
+tunku T AH NG K UW
+tunnel T AH N AH L
+tunnel's T AH N AH L Z
+tunneling T AH N AH L IH NG
+tunnell T AH N AH L
+tunnels T AH N AH L Z
+tunney T AH N IY
+tunny T AH N IY
+tunstall T AH N S T AH L
+tuohey T UW HH EY
+tuohy T UW IY
+tuolumne T W AO L UW M
+tuomi T W OW M IY
+tupa T UW P AH
+tupac T UW P AO K
+tupelo T Y UW P AH L OW
+tupelo(2) T UW P AH L OW
+tupelov T UW P AH L AA V
+tupper T AH P ER
+tupperware T AH P ER W EH R
+tupy T UW P IY
+turandot T ER AE N D AH T
+turano T UH R AA N OW
+turban T ER B AH N
+turbans T ER B AH N Z
+turbas T ER B AH S
+turben T ER B AH N
+turberville T ER B ER V IH L
+turbett T ER B IH T
+turbeville T ER B V IH L
+turbidity T ER B IH D AH T IY
+turbin T ER B IH N
+turbine T ER B AY N
+turbinen T ER B IH N AH N
+turbines T ER B AY N Z
+turbo T ER B OW
+turbocharge T ER B OW CH AA R JH
+turbocharged T ER B OW CH AA R JH D
+turbocharges T ER B OW CH AA R JH IH Z
+turbocharging T ER B OW CH AA R JH IH NG
+turbofan T ER B OW F AE N
+turbojet T ER B OW JH EH T
+turboprop T ER B OW P R AA P
+turboprops T ER B OW P R AA P S
+turbos T ER B OW Z
+turbot T ER B OW
+turbot(2) T ER B AH T
+turbotax T ER B OW T AE K S
+turbulence T ER B Y AH L AH N S
+turbulent T ER B Y AH L AH N T
+turbyfill T ER B IH F IH L
+turchi T UH R K IY
+turchin T ER CH IH N
+turchyn T ER CH IH N
+turck T ER K
+turco T ER K OW
+turcott T ER K AH T
+turcotte T ER K AO T
+turcotte's T ER K AO T S
+ture T UH R
+turek T Y UW R IH K
+turenne T Y UW R IH N
+turf T ER F
+turgeon T ER JH IH N
+turgid T ER JH IH D
+turgut T ER G AH T
+turi T UH R IY
+turin T Y UH R IH N
+turin(2) T UH R IH N
+turing T UH R IH NG
+turismo T UH R IH S M OW
+turk T ER K
+turkel T ER K AH L
+turkey T ER K IY
+turkey's T ER K IY Z
+turkeys T ER K IY Z
+turkic T ER K IH K
+turkington T ER K IH NG T AH N
+turkish T ER K IH SH
+turkmen T ER K M EH N
+turkmenistan T ER K M EH N IH S T AE N
+turko T ER K OW
+turkovich T ER K AH V IH CH
+turks T ER K S
+turley T ER L IY
+turlington T ER L IH NG T AH N
+turlough T ER L OW
+turlough(2) T ER L AW
+turman T ER M AH N
+turmel T ER M AH L
+turmoil T ER M OY L
+turn T ER N
+turnabout T ER N AH B AW T
+turnage T ER N IH JH
+turnaround T ER N ER AW N D
+turnarounds T ER N ER AW N D Z
+turnbaugh T ER N B AO
+turnbo T UH R N B OW
+turnbough T ER N B AW
+turnbow T ER N B OW
+turnbridge T ER N B R IH JH
+turnbull T ER N B UH L
+turncoat T ER N K OW T
+turndown T ER N D AW N
+turned T ER N D
+turner T ER N ER
+turner's T ER N ER Z
+turney T ER N IY
+turnham T ER N HH AH M
+turning T ER N IH NG
+turnip T ER N AH P
+turnips T ER N AH P S
+turnipseed T ER N IH P S IY D
+turnkey T ER N K IY
+turnley T ER N L IY
+turnmire T ER N M AY R
+turnoff T ER N AO F
+turnout T ER N AW T
+turnouts T ER N AW T S
+turnover T ER N OW V ER
+turnovers T ER N OW V ER Z
+turnpike T ER N P AY K
+turnpikes T ER N P AY K S
+turnquest T ER N K W EH S T
+turnquist T ER N K W IH S T
+turns T ER N Z
+turnstile T ER N S T AY L
+turnstiles T ER N S T AY L Z
+turntable T ER N T EY B AH L
+turntables T ER N T EY B AH L Z
+turo T UH R OW
+turow T UH R OW
+turowski T ER AO F S K IY
+turpen T ER P AH N
+turpentine T ER P AH N T AY N
+turpin T ER P IH N
+turpitude T ER P IH T UW D
+turquoise T ER K W OY Z
+turrell T AO R AH L
+turrentine T UH R EH N T IY N IY
+turret T ER AH T
+turret(2) T ER T
+turrets T ER AH T S
+turri T UH R IY
+turrill T AO R AH L
+tursi T UH R S IY
+turski T ER S K IY
+turtle T ER T AH L
+turtle's T ER T AH L Z
+turtleneck T ER T AH L N EH K
+turtlenecks T ER T AH L N EH K S
+turtles T ER T AH L Z
+turton T ER T AH N
+turvey T ER V EY
+turville T ER V IH L
+turvy T ER V IY
+tusa T UW S AH
+tuscaloosa T AH S K AH L UW S AH
+tuscaloosa's T AH S K AH L UW S AH Z
+tuscan T AH S K AH N
+tuscany T AH S K AH N IY
+tush T UH SH
+tushes T UH SH IH Z
+tusing T UW S IH NG
+tusk T AH S K
+tuskegee T AH S K AH G IY
+tuskegee(2) T AH S K IY G IY
+tusks T AH S K S
+tusla T UW Z L AH
+tussaud's T UW S OW Z
+tussaud's(2) T AH S OW Z
+tussey T AH S IY
+tussing T AH S IH NG
+tussle T AH S AH L
+tussled T AH S AH L D
+tussles T AH S AH L Z
+tustin T AH S T IH N
+tut T AH T
+tut's T AH T S
+tutelage T Y UW T IH L IH JH
+tuten T Y UW T AH N
+tuthill T AH T HH IH L
+tutino T UW T IY N OW
+tutko T AH T K OW
+tutor T UW T ER
+tutored T UW T ER D
+tutorial T UW T AO R IY AH L
+tutorials T UW T AO R IY AH L Z
+tutoring T UW T ER IH NG
+tutors T UW T ER Z
+tutsi T UW T S IY
+tutsi's T UW T S IY Z
+tutsis T UW T S IY Z
+tutt T AH T
+tutterow T AH T ER OW
+tutti T UW T IY
+tuttle T AH T AH L
+tutton T AH T AH N
+tutu T UW T UW
+tutwiler T AH T W AY L ER
+tux T AH K S
+tuxedo T AH K S IY D OW
+tuxedos T AH K S IY D OW Z
+tuxford T AH K S F ER D
+tuxhorn T AH K S HH ER N
+tuyle T UW L
+tuzla T UW Z L AH
+tuzla's T UW Z L AH Z
+tuzzolino T UW T S OW L IY N OW
+tv T IY V IY
+tv(2) T EH L AH V IH ZH AH N
+tvedt T V EH D T
+tveit T V IY T
+tvsat T AH V S AE T
+twaddell T W AA D EH L
+twaddle T W AA D AH L
+twain T W EY N
+twain's T W EY N Z
+twang T W AA NG
+twangy T W AA N JH IY
+twardowski T W ER D AW S K IY
+twardy T W AO R D IY
+twarog T W AO R AO G
+twas T W AH Z
+tweak T W IY K
+tweaked T W IY K T
+tweaking T W IY K IH NG
+tweaks T W IY K S
+twedt T W EH D T
+tweed T W IY D
+tweedie T W IY D IY
+tweedle T W IY D AH L
+tweedy T W IY D IY
+tweet T W IY T
+tweezer T W IY Z ER
+tweezerman T W IY Z ER M AE N
+tweezers T W IY Z ER Z
+twelfth T W EH L F TH
+twelve T W EH L V
+twelvth T W EH L V TH
+twenties T W EH N T IY Z
+twenties(2) T W EH N IY Z
+twentieth T W EH N T IY AH TH
+twentieth(2) T W EH N T IY IH TH
+twentieth(3) T W EH N IY AH TH
+twentieth(4) T W EH N IY IH TH
+twenty T W EH N T IY
+twenty's T W EH N T IY Z
+twenty's(2) T W EH N IY Z
+twenty(2) T W EH N IY
+twentysomething T W EH N T IY S AH M TH IH NG
+twentysomething(2) T W EH N IY S AH M TH IH NG
+twentysomethings T W EH N T IY S AH M TH IH NG Z
+twentysomethings(2) T W EH N IY S AH M TH IH NG Z
+twersky T W ER S K IY
+tweten T W IY T AH N
+twice T W AY S
+twichell T W IH CH AH L
+twiddle T W IH D AH L
+twiddling T W IH D L IH NG
+twiddy T W IH D IY
+twiford T W IH F ER D
+twig T W IH G
+twigg T W IH G
+twigged T W IH G D
+twiggs T W IH G Z
+twiggy T W IH G IY
+twigs T W IH G Z
+twilight T W AY L AY T
+twill T W IH L
+twilley T W IH L IY
+twin T W IH N
+twine T W AY N
+twined T W AY N D
+twinge T W IH N JH
+twining T W AY N IH NG
+twinjet T W IH N JH EH T
+twinjets T W IH N JH EH T S
+twinkie T W IH NG K IY
+twinkies T W IH NG K IY Z
+twinkle T W IH NG K AH L
+twinkled T W IH NG K AH L D
+twinkles T W IH NG K AH L Z
+twinkling T W IH NG K AH L IH NG
+twinkling(2) T W IH NG K L IH NG
+twins T W IH N Z
+twins' T W IH N Z
+twinsburg T W IH N Z B ER G
+twirl T W ER L
+twirled T W ER L D
+twirler T W ER L ER
+twirling T W ER L IH NG
+twirls T W ER L Z
+twiss T W IH S
+twist T W IH S T
+twisted T W IH S T AH D
+twisted(2) T W IH S T IH D
+twister T W IH S T ER
+twisters T W IH S T ER Z
+twisting T W IH S T IH NG
+twists T W IH S T S
+twisty T W IH S T IY
+twitch T W IH CH
+twitched T W IH CH T
+twitchell T W IH CH AH L
+twitches T W IH CH IH Z
+twitching T W IH CH IH NG
+twite T W AY T
+twitty T W IH T IY
+two T UW
+2 T UW
+two's T UW Z
+twofold T UW F OW L D
+twohig T W OW HH IH G
+twombly T W UW M B L IY
+twomey T W AA M IY
+twonshein T W AA N SH AY N
+twonshein's T W AA N SH AY N Z
+tworek T W ER IH K
+twos T UW Z
+twosome T UW S AH M
+twothirds T UW TH ER D Z
+twyford T W AY F ER D
+twyla T W AY L AH
+twyman T W AY M AH N
+ty T AY
+ty-sachs T AY S AE K S
+tybalt T IH B AH L T
+tyburski T AY B ER S K IY
+tyce T AY S
+tyco T AY K OW
+tyco's T AY K OW Z
+tycoon T AY K UW N
+tycoon's T AY K UW N Z
+tycoons T AY K UW N Z
+tydings T AY D IH NG Z
+tye T AY
+tyer T AY ER
+tygar T AY G AA R
+tygart T AY G AA R T
+tyger T AY G ER
+tying T AY IH NG
+tyke T AY K
+tylan T AY L AH N
+tylee T AY L IY
+tylenol T AY L AH N AO L
+tylenol's T AY L AH N AO L Z
+tyler T AY L ER
+tyler's T AY L ER Z
+tylka T IH L K AH
+tyminski T IH M IH N S K IY
+tymnet T AY M N EH T
+tympanic T IH M P AE N IH K
+tympanum T IH M P AH N AH M
+tynan T AY N AH N
+tyndall T IH N D AH L
+tyne T AY N
+tyner T AY N ER
+tynes T AY N Z
+tyo T AY OW
+tyo(2) T IY W AY OW
+type T AY P
+typeable T AY P AH B AH L
+typecast T AY P K AE S T
+typecasting T AY P K AE S T IH NG
+typed T AY P T
+typeface T AY P F EY S
+typefaces T AY P F EY S AH Z
+types T AY P S
+typeset T AY P S EH T
+typesetting T AY P S EH T IH NG
+typewriter T AY P R AY T ER
+typewriters T AY P R AY T ER Z
+typewriting T AY P R AY T IH NG
+typewritten T AY P R IH T AH N
+typhoid T AY F OY D
+typhoon T AY F UW N
+typhoons T AY F UW N Z
+typhus T AY F AH S
+typical T IH P AH K AH L
+typical(2) T IH P IH K AH L
+typically T IH P IH K L IY
+typically(2) T IH P IH K AH L IY
+typified T IH P AH F AY D
+typifies T IH P AH F AY Z
+typify T IH P AH F AY
+typing T AY P IH NG
+typings T AY P IH NG Z
+typist T AY P IH S T
+typists T AY P IH S T S
+typists(2) T AY P IH S S
+typists(3) T AY P IH S
+typo T AY P OW
+typographical T AY P AH G R AE F IH K AH L
+typography T AH P AA G R AH F IY
+tyra T AY R AH
+tyrannical T ER AE N IH K AH L
+tyrannies T IH R AH N IY Z
+tyrannosaurus T IH R AE N AH S AO R AH S
+tyranny T IH R AH N IY
+tyrant T AY R AH N T
+tyrants T AY R AH N T S
+tyre T AY R
+tyree T AY R IY
+tyrell T AY R AH L
+tyrone T AY R OW N
+tyrrell T AY R EH L
+tyrrhenian T ER IY N IY AH N
+tysinger T AY S IH N JH ER
+tyson T AY S AH N
+tyson's T AY S AH N Z
+tysons T AY S AH N Z
+tyus T Y UW S
+t_a_c T IY EY S IY
+t_a_c(2) T AE K
+u Y UW
+u's Y UW Z
+u. Y UW
+u.'s Y UW Z
+u.s Y UW Z
+uarco Y UW AA R K OW
+uart Y UW AA R T
+ubben AH B AH N
+uber Y UW B ER
+ubiquitous Y UW B IH K W IH T AH S
+ubiquity Y UW B IH K W IH T IY
+uccel UW CH AH L
+uccel's UW CH AH L Z
+ucci UW CH IY
+uchida UW K IY D AH
+uclaf AH K L AE F
+uclaf(2) Y UW K L AE F
+udagawa UW D AA G AA W AH
+udale Y UW D EY L
+udall Y UW D AH L
+uday UW D EY
+uddin AH D IH N
+ude UW D
+udell AH D AH L
+udelle AH D EH L
+uden UW D AH N
+udo UW D OW
+udolf AH D OW L F
+udvar AH D V AA R
+udverhye UW D V EH R HH IY
+udverhye's UW D V EH R HH IY Z
+udverhye's(2) Y UW D V EH R HH IY Z
+udverhye(2) Y UW D V EH R HH IY
+udy Y UW D IY
+uebel UH B AH L
+ueberroth Y UW B ER R AO TH
+uecker UH K ER
+ueckert UH K ER T
+ueda W EH D AH
+ueda(2) UW EY D AH
+uehara UW EY HH AA R AH
+uehling UH L IH NG
+ueki Y UW EH K IY
+ueland UH L AH N D
+uelman UH L M AH N
+uelmen UH L M EH N
+uelmen's UH L M EH N Z
+uemura UW IH M UW R AH
+ueno W EH N OW
+ueno(2) UW EY N OW
+uenohara W EH N OW HH AA R AH
+uenohara(2) UW EY N OW HH AA R AH
+uffelman AH F AH L M AH N
+ugalde UW G AA L D IY
+uganda Y UW G AE N D AH
+uganda's Y UW G AE N D AH Z
+uganda(2) Y UW G AA N D AH
+ugandan Y UW G AE N D AH N
+ugandan(2) Y UW G AA N D AH N
+ugarte UW G AA R T IY
+ugh AH G
+ugity AH G IH T IY
+uglier AH G L IY ER
+ugliest AH G L IY AH S T
+ugliness AH G L IY N AH S
+ugly AH G L IY
+ugolin Y UW G AH L IH N
+ugolini UW G OW L IY N IY
+ugric Y UW G R IH K
+uh AH
+uh-huh AH HH AH
+uhde AH D
+uhde(2) UW D AH
+uher UW ER
+uhh AH
+uhl AH L
+uhland UW L AH N D
+uhle UW AH L
+uhler UW L ER
+uhlich UW L IH K
+uhlig UW L IH G
+uhlir UW L ER
+uhlman UW L M AH N
+uhlmann UW L M AH N
+uhls UW L Z
+uhr UH R
+uhrich UH R IH K
+uhrig UH R IH G
+uhrin UH R IH N
+uinta Y UW IH N T AH
+ukase Y UW K EY Z
+ukman AH K M AH N
+ukraine Y UW K R EY N
+ukraine's Y UW K R EY N Z
+ukrainian Y UW K R EY N IY AH N
+ukrainian's Y UW K R EY N IY AH N Z
+ukrainians Y UW K R EY N IY AH N Z
+ukulele Y UW K AH L EY L IY
+ul AH L
+ul(2) Y UW EH L
+ula Y UW L AH
+ulam Y UW L AE M
+uland Y UW L AH N D
+ulatowski AH L AH T AO F S K IY
+ulbrich AH L B R IH K
+ulbricht AH L B R IH K T
+ulcer AH L S ER
+ulceration AH L S ER EY SH AH N
+ulcerations AH L S ER EY SH AH N Z
+ulcers AH L S ER Z
+ulch AH L CH
+ulee Y UW L IY
+ulee's Y UW L IY Z
+ulery AH L ER IY
+ulf AH L F
+ulfred AH L F ER D
+ulger AH L G ER
+uli Y UW L IY
+uliano UW L IY AA N OW
+uliaski Y UW L Y AE S K IY
+uliassi Y UW L Y AE S IY
+uliassi's Y UW L Y AE S IY Z
+ulibarri UW L IY B AA R IY
+ulicny AH L IH K N IY
+ulima UW L IY M AH
+ulin Y UW L IH N
+ulitsa Y UW L IH T S AH
+ulland AH L AH N D
+ullenberg Y UW L AH N B ER G
+ullery UW L ER IY
+ullman AH L M AH N
+ullmann AH L M AH N
+ullmer AH L M ER
+ulloa UW L OW AH
+ullock AH L AH K
+ullom AH L AH M
+ullrich UH L R IH K
+ullyses Y UW L IH S IY Z
+ulm AH L M
+ulman AH L M AH N
+ulmar AH L M ER
+ulmer AH L M ER
+ulmus AH L M AH S
+ulrey AH L R IY
+ulric AH L R IH K
+ulrica AH L R IH K AH
+ulrich AH L R IH CH
+ulrick AH L R IH K
+ulsan AH L S AH N
+ulsh AH L SH
+ulshafer AH L SH AH F ER
+ulster AH L S T ER
+ulterior AH L T IH R IY ER
+ultima AH L T IH M AH
+ultimate AH L T AH M AH T
+ultimately AH L T AH M AH T L IY
+ultimatum AH L T AH M EY T AH M
+ultimatums AH L T AH M EY T AH M Z
+ultra AH L T R AH
+ultra's AH L T R AH Z
+ultraconservative AH L T R AH K AH N S ER V AH T IH V
+ultrair AH L T R EH R
+ultramar AH L T R AH M AA R
+ultramodern AH L T R AH M AA D ER N
+ultranationalist AH L T R AH N AE SH AH N AH L AH S T
+ultranationalist's AH L T R AH N AE SH AH N AH L AH S T S
+ultranationalists AH L T R AH N AE SH AH N AH L AH S T S
+ultrasonic AH L T R AH S AA N IH K
+ultrasound AH L T R AH S AW N D
+ultrasystem AH L T R AH S IH S T AH M
+ultrasystems AH L T R AH S IH S T AH M Z
+ultraviolet AH L T R AH V AY AH L IH T
+ulundi Y UW L AH N D IY
+ulva UW L V AH
+ulvert AH L V ER T
+ulysses Y UW L IH S IY Z
+um AH M
+uma Y UW M AH
+umana UW M AA N AH
+umansky AH M AE N S K IY
+umass Y UW M AE S
+umbach AH M B AA K
+umbarger AH M B AA R G ER
+umbaugh AH M B AW
+umbel AH M B AH L
+umberger AH M B ER G ER
+umberto AH M B EH R T OW
+umbilical AH M B IH L IH K AH L
+umble AH M B AH L
+umbra AH M B R AH
+umbrage AH M B R IH JH
+umbrella AH M B R EH L AH
+umbrellas AH M B R EH L AH Z
+umbria AH M B R IY AH
+umetsu Y UW M EH T S UW
+umfleet AH M F L IY T
+umholtz AH M HH OW L T S
+umland AH M L AH N D
+umlasi UW M L AA S IY
+umlauf AH M L AW F
+umm AH M
+ummel AH M AH L
+umphlett AH M F L EH T
+umphress AH M F R IH S
+umphrey AH M F R IY
+umpire AH M P AY ER
+umpires AH M P AY ER Z
+umpteen AH M P T IY N
+umpteenth AH M P T IY N TH
+umscheid AH M SH AY D
+umstead AH M S T EH D
+un AH N
+un(2) Y UW EH N
+una UW N AH
+una(2) Y UW EH N EY
+unabashed AH N AH B AE SH T
+unabashedly AH N AH B AE SH IH D L IY
+unabated AH N AH B EY T IH D
+unable AH N EY B AH L
+unabom Y UW N AH B AO M
+unabomb Y UW N AH B AO M
+unabomb's Y UW N AH B AO M Z
+unabomber Y UW N AH B AO M ER
+unabomber's Y UW N AH B AO M ER Z
+unabombers Y UW N AH B AO M ER Z
+unabombing Y UW N AH B AO M IH NG
+unabombings Y UW N AH B AO M IH NG Z
+unabridged AH N AH B R IH JH D
+unacceptable AH N AE K S EH P T AH B AH L
+unacceptably AH N AE K S EH P T AH B L IY
+unaccompanied AH N AH K AH M P AH N IY D
+unaccountable AH N AH K AW N T AH B AH L
+unaccountably AH N AH K AW N T AH B L IY
+unaccounted AH N AH K AW N T IH D
+unaccredited AH N AH K R EH D IH T IH D
+unaccustomed AH N AH K AH S T AH M D
+unaddressed AH N AH D R EH S T
+unadjust AH N AH JH AH S T
+unadjustable AH N AH JH AH S T IH B AH L
+unadjusted AH N AH JH AH S T IH D
+unadorn AH N AH D AO R N
+unadorned AH N AH D AO R N D
+unadulterated AH N AH D AH L T ER EY T IH D
+unaffected AH N AH F EH K T IH D
+unaffiliate AH N AH F IH L IY EY T
+unaffiliated AH N AH F IH L IY EY T IH D
+unaffordable AH N AH F AO R D AH B AH L
+unafraid AH N AH F R EY D
+unaided AH N EY D IH D
+unalienable AH N EY L IY EH N AH B AH L
+unalienable(2) AH N EY L Y EH N AH B AH L
+unallocate AH N AE L AH K EY T
+unallocated AH N AE L AH K EY T IH D
+unallowable AH N AH L AW AH B AH L
+unalloyed AH N AE L OY D
+unalterable AH N AO L T ER AH B AH L
+unalterably AH N AO L T ER AH B L IY
+unaltered AH N AO L T ER D
+unambiguous AH N AE M B IH G Y AH W AH S
+unambiguously AH N AE M B IH G Y UW AH S L IY
+unamended AH N AH M EH N D IH D
+unamerican AH N AH M EH R IH K AH N
+unamortized AH N AE M ER T AY Z D
+unangst AO N AH NG S T
+unanimity Y UW N AH N IH M AH T IY
+unanimity(2) Y UW N AH N IH M IH T IY
+unanimous Y UW N AE N AH M AH S
+unanimously Y UW N AE N AH M AH S L IY
+unannounced AH N AH N AW N S T
+unanswerable AH N AE N S ER AH B AH L
+unanswered AH N AE N S ER D
+unanticipated AH N AE N T IH S AH P EY T IH D
+unapologetic AH N AH P AA L AH JH EH T IH K
+unappealing AH N AH P IY L IH NG
+unappetizing AH N AE P AH T AY Z IH NG
+unappreciated AH N AH P R IY SH IY EY T IH D
+unapproved AH N AH P R UW V D
+unarm AH N AA R M
+unarmed AH N AA R M D
+unashamed AH N AH SH EY M D
+unashamedly AH N AH SH EY M AH D L IY
+unassailable AH N AH S EY L AH B AH L
+unassisted AH N AH S IH S T IH D
+unassuming AH N AH S UW M IH NG
+unattach AH N AH T AE CH
+unattached AH N AH T AE CH T
+unattainable AH N AH T EY N AH B AH L
+unattended AH N AH T EH N D IH D
+unattractive AH N AH T R AE K T IH V
+unaudited AH N AO D AH T IH D
+unauthentic AH N AO TH EH N T IH K
+unauthorized AH N AO TH ER AY Z D
+unavailability AH N AH V EY L AH B IH L IH T IY
+unavailable AH N AH V EY L AH B AH L
+unavailing AH N AH V EY L IH NG
+unavoidable AH N AH V OY D AH B AH L
+unavoidably AH N AH V OY D AH B L IY
+unaware AH N AH W EH R
+unawares AH N AH W EH R Z
+unbalance AH N B AE L AH N S
+unbalanced AH N B AE L AH N S T
+unbearable AH N B EH R AH B AH L
+unbearably AH N B EH R AH B L IY
+unbeatable AH N B IY T AH B AH L
+unbeaten AH N B IY T AH N
+unbecoming AH N B IH K AH M IH NG
+unbecoming(2) AH N B IY K AH M IH NG
+unbeknown AH N B IH N OW N
+unbeknown(2) AH N B IY N OW N
+unbeknownst AH N B IY N OW N S T
+unbelievable AH N B AH L IY V AH B AH L
+unbelievably AH N B AH L IY V AH B L IY
+unbelieving AH N B AH L IY V IH NG
+unbend AH N B EH N D
+unbending AH N B EH N D IH NG
+unbiased AH N B AY AH S T
+unblemished AH N B L EH M IH SH T
+unbolt AH N B OW L T
+unbolted AH N B OW L T IH D
+unbook AH N B UH K
+unborn AH N B AO R N
+unbound AH N B AW N D
+unbounded AH N B AW N D IH D
+unbowed AH N B OW D
+unbowed(2) AH N B AW D
+unbranded AH N B R AE N D IH D
+unbreakability AH N B R EY K AH B IH L IH T IY
+unbreakable AH N B R EY K AH B AH L
+unbridled AH N B R AY D AH L D
+unbroken AH N B R OW K AH N
+unbuildable AH N B IH L D AH B AH L
+unbuilt AH N B IH L T
+unbundle AH N B AH N D AH L
+unbundled AH N B AH N D AH L D
+unbundling AH N B AH N D L IH NG
+unburden AH N B ER D AH N
+unburdened AH N B ER D AH N D
+unburned AH N B ER N D
+unbutton AH N B AH T AH N
+unbuttoned AH N B AH T AH N D
+uncalled AH N K AO L D
+uncannily AH N K AE N AH L IY
+uncanny AH N K AE N IY
+uncapher AH N K AH F ER
+uncapitalized AH N K AE P IH T AH L AY Z D
+uncaring AH N K EH R IH NG
+unceasing AH N S IY S IH NG
+uncensored AH N S EH N S ER D
+unceremonious AH N S EH R AH M OW N IY AH S
+unceremoniously AH N S EH R AH M OW N IY AH S L IY
+uncertain AH N S ER T AH N
+uncertainly AH N S ER T AH N L IY
+uncertainties AH N S ER T AH N T IY Z
+uncertainty AH N S ER T AH N T IY
+unchallenged AH N CH AE L IH N JH D
+unchanged AH N CH EY N JH D
+unchanging AH N CH EY N JH IH NG
+uncharacteristic AH N K EH R IH K T ER IH S T IH K
+uncharacteristically AH N K EH R IH K T ER IH S T IH K L IY
+uncharted AH N CH AA R T IH D
+unchartered AH N CH AA R T ER D
+unchecked AH N CH EH K T
+uncivil AH N S IH V AH L
+uncivilized AH N S IH V AH L AY Z D
+unclaimed AH N K L EY M D
+unclamp AH N K L AE M P
+unclamps AH N K L AE M P S
+unclassified AH N K L AE S IH F AY D
+unclassify AH N K L AE S IH F AY
+uncle AH NG K AH L
+uncle's AH NG K AH L Z
+unclean AH N K L IY N
+unclear AH N K L IH R
+uncles AH NG K AH L Z
+uncluttered AH N K L AH T ER D
+uncoat AH N K OW T
+uncoated AH N K OW T IH D
+uncoil AH N K OY L
+uncoiled AH N K OY L D
+uncollectable AH N K AH L EH K T AH B AH L
+uncollected AH N K AH L EH K T IH D
+uncollectible AH N K AH L EH K T IH B AH L
+uncomfortable AH N K AH M F ER T AH B AH L
+uncomfortably AH N K AH M F T AH B L IY
+uncommitted AH N K AH M IH T IH D
+uncommon AH N K AA M AH N
+uncommonly AH N K AA M AH N L IY
+uncompensate AH N K AA M P AH N S EY T
+uncompensated AH N K AA M P AH N S EY T IH D
+uncompetitive AH N K AH M P EH T AH T IH V
+uncomplete AH N K AH M P L IY T
+uncompleted AH N K AH M P L IY T IH D
+uncomplicate AH N K AA M P L AH K EY T
+uncomplicated AH N K AA M P L AH K EY T IH D
+uncompromising AH N K AA M P R AH M AY Z IH NG
+unconcealed AH N K AH N S IY L D
+unconcern AH N K AH N S ER N
+unconcerned AH N K AH N S ER N D
+unconditional AH N K AH N D IH SH AH N AH L
+unconditionally AH N K AH N D IH SH AH N AH L IY
+unconditionally(2) AH N K AH N D IH SH N AH L IY
+unconfined AH N K AH N F AY N D
+unconfirmed AH N K AH N F ER M D
+unconnected AH N K AH N EH K T IH D
+unconscionable AH N K AA N SH AH N AH B AH L
+unconscious AH N K AA N SH AH S
+unconsciously AH N K AA N SH AH S L IY
+unconsciousness AH N K AA N SH AH S N IH S
+unconsolidated AH N K AH N S AA L AH D EY T IH D
+unconstitutional AH N K AA N S T AH T UW SH AH N AH L
+unconstitutionally AH N K AA N S T AH T UW SH AH N AH L IY
+unconstitutionally(2) AH N K AA N S T AH T UW SH N AH L IY
+unconstrained AH N K AH N S T R EY N D
+uncontaminated AH N K AH N T AE M AH N EY T AH D
+uncontested AH N K AH N T EH S T IH D
+uncontradicted AH N K AO N T R AH D IH K T IH D
+uncontrollable AH N K AH N T R OW L AH B AH L
+uncontrollably AH N K AH N T R OW L AH B L IY
+uncontrolled AH N K AH N T R OW L D
+uncontroversial AH N K AA N T R AH V ER SH AH L
+unconventional AH N K AH N V EH N SH AH N AH L
+unconverted AH N K AH N V ER T IH D
+unconvinced AH N K AH N V IH N S T
+unconvincing AH N K AH N V IH N S IH NG
+uncool AH N K UW L
+uncooperative AH N K OW AA P ER AH T IH V
+uncoordinated AH N K OW AO R D AH N EY T IH D
+uncork AH N K AO R K
+uncorked AH N K AO R K T
+uncorks AH N K AO R K S
+uncorrected AH N K ER EH K T IH D
+uncorroborated AH N K ER AA B ER EY T IH D
+uncounted AH N K AW N T IH D
+uncouple AH N K AH P AH L
+uncouth AH N K UW TH
+uncover AH N K AH V ER
+uncovered AH N K AH V ER D
+uncovering AH N K AH V ER IH NG
+uncovers AH N K AH V ER Z
+uncritical AH N K R IH T IH K AH L
+uncritically AH N K R IH T IH K AH L IY
+uncritically(2) AH N K R IH T IH K L IY
+unctad AH N K T AE D
+unctuous AH NG CH W AH S
+uncured AH N K Y ER D
+uncut AH N K AH T
+und AH N D
+undamaged AH N D AE M AH JH D
+undated AH N D EY T IH D
+undaunted AH N D AO N T IH D
+undecided AH N D IH S AY D IH D
+undecideds AH N D IH S AY D IH D Z
+undeclared AH N D IH K L EH R D
+undefeated AH N D IH F IY T IH D
+undefined AH N D IH F AY N D
+undelivered AH N D IH L IH V ER D
+undemocratic AH N D EH M AH K R AE T IH K
+undeniable AH N D IH N AY AH B AH L
+undeniably AH N D IH N AY AH B L IY
+under AH N D ER
+under-age AH N D ER EY JH
+underachiever AH N D ER AH CH IY V ER
+underachievers AH N D ER AH CH IY V ER Z
+underage AH N D ER IH JH
+underarm AH N D ER AA R M
+underbelly AH N D ER B EH L IY
+underberg AH N D ER B ER G
+underbid AH N D ER B IH D
+underbrush AH N D ER B R AH SH
+undercapitalize AH N D ER K AE P AH T AH L AY Z
+undercapitalized AH N D ER K AE P AH T AH L AY Z D
+undercarriage AH N D ER K AE R IH JH
+underclass AH N D ER K L AE S
+underclassmen AH N D ER K L AE S M EH N
+undercoat AH N D ER K OW T
+undercook AH N D ER K UH K
+undercooked AH N D ER K UH K T
+undercount AH N D ER K AW N T
+undercounted AH N D ER K AW N T IH D
+undercover AH N D ER K AH V ER
+undercurrent AH N D ER K ER AH N T
+undercurrents AH N D ER K ER AH N T S
+undercut AH N D ER K AH T
+undercuts AH N D ER K AH T S
+undercutting AH N D ER K AH T IH NG
+underdahl AH N D ER D AA L
+underdevelop AH N D ER D IH V EH L AH P
+underdeveloped AH N D ER D IH V EH L AH P T
+underdevelopment AH N D ER D AH V EH L AH P M AH N T
+underdog AH N D ER D AO G
+underdogs AH N D ER D AO G Z
+underdown AH N D ER D AW N
+underemploy AH N D ER IH M P L OY
+underemployed AH N D ER IH M P L OY D
+underemployment AH N D ER IH M P L OY M AH N T
+underestimate AH N D ER EH S T AH M EY T
+underestimate(2) AH N D ER EH S T AH M AH T
+underestimated AH N D ER EH S T AH M EY T IH D
+underestimates AH N D ER EH S T IH M IH T S
+underestimates(2) AH N D ER EH S T IH M EY T S
+underestimating AH N D ER EH S T IH M EY T IH NG
+underfinance AH N D ER F IH N AE N S
+underfinanced AH N D ER F IH N AE N S T
+underfoot AH N D ER F UH T
+underfund AH N D ER F AH N D
+underfunded AH N D ER F AH N D IH D
+underfunding AH N D ER F AH N D IH NG
+undergarment AH N D ER G AA R M AH N T
+undergarments AH N D ER G AA R M AH N T S
+undergo AH N D ER G OW
+undergoes AH N D ER G OW Z
+undergoing AH N D ER G OW IH NG
+undergone AH N D ER G AO N
+undergrad AH N D ER G R AE D
+undergraduate AH N D ER G R AE JH AH W AH T
+undergraduates AH N D ER G R AE JH AH W AH T S
+underground AH N D ER G R AW N D
+undergrowth AH N D ER G R OW TH
+underhanded AH N D ER HH AE N D IH D
+underhill AH N D ER HH IH L
+underinsure AH N D ER IH N SH AO R
+underinsured AH N D ER IH N SH AO R D
+underkoffler AH N D ER K AH F AH L ER
+underlie AH N D ER L AY
+underlies AH N D ER L AY Z
+underline AH N D ER L AY N
+underlined AH N D ER L AY N D
+underlines AH N D ER L AY N Z
+underling AH N D ER L IH NG
+underlings AH N D ER L IH NG Z
+underlining AH N D ER L AY N IH NG
+underly AH N D ER L AY
+underlying AH N D ER L AY IH NG
+underman AH N D ER M AE N
+undermanned AH N D ER M AE N D
+undermine AH N D ER M AY N
+undermined AH N D ER M AY N D
+undermines AH N D ER M AY N Z
+undermining AH N D ER M AY N IH NG
+underneath AH N D ER N IY TH
+undernourish AH N D ER N ER IH SH
+undernourished AH N D ER N ER IH SH T
+underpaid AH N D ER P EY D
+underpants AH N D ER P AE N T S
+underpass AH N D ER P AE S
+underpay AH N D ER P EY
+underpaying AH N D ER P EY IH NG
+underpayment AH N D ER P EY M AH N T
+underpayments AH N D ER P EY M AH N T S
+underperform AH N D ER P ER F AO R M
+underperformance AH N D ER P ER F AO R M AH N S
+underperformed AH N D ER P ER F AO R M D
+underperformer AH N D ER P ER F AO R M ER
+underperforming AH N D ER P ER F AO R M IH NG
+underpin AH N D ER P IH N
+underpinned AH N D ER P IH N D
+underpinning AH N D ER P IH N IH NG
+underpinnings AH N D ER P IH N IH NG Z
+underplay AH N D ER P L EY
+underplayed AH N D ER P L EY D
+underpower AH N D ER P AW ER
+underpowered AH N D ER P AW ER D
+underprice AH N D ER P R AY S
+underpriced AH N D ER P R AY S T
+underpricing AH N D ER P R AY S IH NG
+underpriviledged AH N D ER P R IH V L IH JH D
+underrate AH N D ER R EY T
+underrated AH N D ER R EY T IH D
+underreport AH N D ER R IH P AO R T
+underreported AH N D ER R IH P AO R T IH D
+underreporting AH N D ER R IH P AO R T IH NG
+underrepresent AH N D ER R EH P R IH Z EH N T
+underrepresented AH N D ER R EH P R IH Z EH N T IH D
+underscore AH N D ER S K AO R
+underscored AH N D ER S K AO R D
+underscores AH N D ER S K AO R Z
+underscoring AH N D ER S K AO R IH NG
+undersea AH N D ER S IY
+underseas AH N D ER S IY Z
+undersecretary AH N D ER S EH K R IH T EH R IY
+undersell AH N D ER S EH L
+underselling AH N D ER S EH L IH NG
+underserve AH N D ER S ER V
+underserved AH N D ER S ER V D
+undershirt AH N D ER SH ER T
+undershirts AH N D ER SH ER T S
+underside AH N D ER S AY D
+undersized AH N D ER S AY Z D
+undersold AH N D ER S OW L D
+underspin AH N D ER S P IH N
+understaff AH N D ER S T AE F
+understaffed AH N D ER S T AE F T
+understand AH N D ER S T AE N D
+understandable AH N D ER S T AE N D AH B AH L
+understandably AH N D ER S T AE N D AH B L IY
+understanding AH N D ER S T AE N D IH NG
+understandings AH N D ER S T AE N D IH NG Z
+understands AH N D ER S T AE N D Z
+understate AH N D ER S T EY T
+understated AH N D ER S T EY T IH D
+understatement AH N D ER S T EY T M AH N T
+understates AH N D ER S T EY T S
+understating AH N D ER S T EY T IH NG
+understood AH N D ER S T UH D
+understory AH N D ER S T AO R IY
+understudy AH N D ER S T AH D IY
+undersubscribed AH N D ER S AH B S K R AY B D
+undertake AH N D ER T EY K
+undertaken AH N D ER T EY K AH N
+undertaker AH N D ER T EY K ER
+undertakes AH N D ER T EY K S
+undertaking AH N D ER T EY K IH NG
+undertakings AH N D ER T EY K IH NG Z
+undertone AH N D ER T OW N
+undertones AH N D ER T OW N Z
+undertook AH N D ER T UH K
+undertow AH N D ER T OW
+undertows AH N D ER T OW Z
+underuse AH N D ER Y UW Z
+underused AH N D ER Y UW Z D
+underutilize AH N D ER Y UW T AH L AY Z
+underutilized AH N D ER Y UW T AH L AY Z D
+undervaluation AH N D ER V AE L Y UW EY SH AH N
+undervalue AH N D ER V AE L Y UW
+undervalued AH N D ER V AE L Y UW D
+undervalues AH N D ER V AE L Y UW Z
+undervaluing AH N D ER V AE L Y UW IH NG
+underwater AH N D ER W AO T ER
+underway AH N D ER W EY
+underwear AH N D ER W EH R
+underweight AH N D ER W EY T
+underweighted AH N D ER W EY T IH D
+underwent AH N D ER W EH N T
+underwhelm AH N D ER W EH L M
+underwhelmed AH N D ER W EH L M D
+underwithheld AH N D ER W IH TH HH EH L D
+underwithhold AH N D ER W IH TH HH OW L D
+underwithholding AH N D ER W IH TH HH OW L D IH NG
+underwood AH N D ER W UH D
+underwoods AH N D ER W UH D Z
+underworld AH N D ER W ER L D
+underwrite AH N D ER R AY T
+underwriter AH N D ER R AY T ER
+underwriter's AH N D ER R AY T ER Z
+underwriters AH N D ER R AY T ER Z
+underwriters' AH N D ER R AY T ER Z
+underwrites AH N D ER R AY T S
+underwriting AH N D ER R AY T IH NG
+underwritings AH N D ER R AY T IH NG Z
+underwritten AH N D ER R IH T AH N
+underwrote AH N D ER R OW T
+undeserved AH N D IH Z ER V D
+undeserving AH N D IH Z ER V IH NG
+undesirable AH N D IH Z AY R AH B AH L
+undetectable AH N D IH T EH K T AH B AH L
+undetected AH N D IH T EH K T IH D
+undetermined AH N D IH T ER M IH N D
+undetermined(2) AH N D IY T ER M AH N D
+undetermining AH N D IH T ER M IH N IH NG
+undetermining(2) AH N D IY T ER M AH N IH NG
+undeterred AH N D IH T ER D
+undeveloped AH N D IH V EH L AH P T
+undiagnosed AH N D AY AE G N OW S T
+undid AH N D IH D
+undifferentiated AH N D IH F ER EH N SH IY EY T IH D
+undignified AH N D IH G N IH F AY D
+undilute AH N D AH L UW T
+undiluted AH N D AH L UW T IH D
+undiminished AH N D AH M IH N IH SH T
+undine AH N D IY N
+undiplomatic AH N D IH P L AH M AE T IH K
+undiplomatically AH N D IH P L AH M AE T IH K L IY
+undisciplined AH N D IH S IH P L IH N D
+undisclosed AH N D IH S K L OW Z D
+undiscovered AH N D IH S K AH V ER D
+undisguised AH N D IH S G AY Z D
+undisputed AH N D IH S P Y UW T IH D
+undistinguished AH N D IH S T IH NG G W IH SH T
+undistributed AH N D IH S T R IH B Y UW T IH D
+undisturbed AH N D IH S T ER B D
+undiversified AH N D IH V ER S IH F AY D
+undivided AH N D AH V AY D IH D
+undo AH N D UW
+undock AH N D AA K
+undocking AH N D AA K IH NG
+undocumented AH N D AA K Y AH M EH N T IH D
+undocumented(2) AH N D AA K Y AH M EH N IH D
+undoing AH N D UW IH NG
+undone AH N D AH N
+undoubted AH N D AW T IH D
+undoubtedly AH N D AW T IH D L IY
+undreamed AH N D R IY M D
+undress AH N D R EH S
+undressed AH N D R EH S T
+undue AH N D UW
+undulate AH N JH AH L EY T
+undulated AH N JH AH L EY T AH D
+undulates AH N JH AH L EY T S
+undulating AH N JH AH L EY T IH NG
+unduly AH N D UW L IY
+undying AH N D AY IH NG
+unearned AH N ER N D
+unearth AH N ER TH
+unearthed AH N ER TH T
+unearthing AH N ER TH IH NG
+unearthly AH N ER TH L IY
+unease AH N IY Z
+uneasily AH N IY Z AH L IY
+uneasiness AH N IY Z IY N AH S
+uneasy AH N IY Z IY
+uneconomic AH N EH K AH N AA M IH K
+uneconomical AH N EH K AH N AA M IH K AH L
+unedited AH N EH D AH T IH D
+uneducated AH N EH JH UH K EY T IH D
+unelectable AH N IH L EH K T AH B AH L
+unelected AH N IH L EH K T IH D
+unemotional AH N IY M OW SH AH N AH L
+unemotional(2) AH N AH M OW SH AH N AH L
+unemploy AH N IH M P L OY
+unemployable AH N IH M P L OY AH B AH L
+unemployed AH N EH M P L OY D
+unemployment AH N IH M P L OY M AH N T
+unencumber AH N EH N K AH M B ER
+unencumbered AH N EH N K AH M B ER D
+unending AH N EH N D IH NG
+unenforceable AH N EH N F AO R S AH B AH L
+unenforced AH N EH N F AO R S T
+unenlightened AH N EH N L AY T AH N D
+unenthusiastic AH N IH N TH UW Z IY AE S T IH K
+unenumerated AH N IH N UW M ER EY T IH D
+unenviable AH N EH N V IY AH B AH L
+uneo Y UW N IY OW
+unequal AH N IY K W AH L
+unequaled AH N IY K W AH L D
+unequivocably AH N IH K W IH V AH K AH B L IY
+unequivocal AH N IH K W IH V AH K AH L
+unequivocal(2) AH N IY K W IH V AH K AH L
+unequivocally AH N IY K W IH V AH K AH L IY
+unequivocally(2) AH N IY K W IH V AH K L IY
+unesco Y UW N EH S K OW
+unethical AH N EH TH IH K AH L
+unethically AH N EH TH IH K L IY
+uneven AH N IY V AH N
+unevenly AH N IY V AH N L IY
+uneventful AH N IY V EH N T F AH L
+unexciting AH N IH K S AY T IH NG
+unexercised AH N EH K S ER S AY Z D
+unexpected AH N IH K S P EH K T IH D
+unexpectedly AH N IH K S P EH K T IH D L IY
+unexpired AH N IH K S P AY ER D
+unexplainable AH N IH K S P L EY N AH B AH L
+unexplained AH N IH K S P L EY N D
+unexploded AH N IH K S P L OW D IH D
+unexploited AH N IH K S P L OY T IH D
+unexplored AH N IH K S P L AO R D
+unfailing AH N F EY L IH NG
+unfailingly AH N F EY L IH NG L IY
+unfair AH N F EH R
+unfair(2) AO N F EH R
+unfairly AH N F EH R L IY
+unfairness AH N F EH R N AH S
+unfaithful AH N F EY TH F AH L
+unfamiliar AH N F AH M IH L Y ER
+unfamiliarities AH N F AH M IH L Y EH R AH T IY Z
+unfamiliarity AH N F AH M IH L Y EH R AH T IY
+unfashionable AH N F AE SH AH N AH B AH L
+unfathomable AH N F AE DH AH M AH B AH L
+unfav AH N F EY V
+unfavorable AH N F EY V ER AH B AH L
+unfavorably AH N F EY V ER AH B L IY
+unfazed AH N F EY Z D
+unfeasible AH N F IY Z AH B AH L
+unfeeling AH N F IY L IH NG
+unfenced AH N F EH N S T
+unfettered AH N F EH T ER D
+unfilled AH N F IH L D
+unfiltered AH N F IH L T ER D
+unfinished AH N F IH N IH SH T
+unfit AH N F IH T
+unflagging AH N F L AE G IH NG
+unflappable AH N F L AE P AH B AH L
+unflattering AH N F L AE T ER IH NG
+unflinching AH N F L IH N CH IH NG
+unfocused AH N F OW K AH S T
+unfold AH N F OW L D
+unfolded AH N F OW L D AH D
+unfolding AH N F OW L D IH NG
+unfolds AH N F OW L D Z
+unforeseeable AH N F AO R S IY AH B AH L
+unforeseen AH N F AO R S IY N
+unforgettable AH N F ER G EH T AH B AH L
+unforgivable AH N F AO R G IH V AH B AH L
+unforgiven AH N F AO R G IH V AH N
+unforgiven(2) AH N F ER G IH V AH N
+unforgiving AH N F ER G IH V IH NG
+unformed AH N F AO R M D
+unfortunate AH N F AO R CH AH N AH T
+unfortunate(2) AH N F AO R CH UW N AH T
+unfortunately AH N F AO R CH AH N AH T L IY
+unfortunately(2) AH N F AO R CH UW N AH T L IY
+unfortunates AH N F AO R CH AH N AH T S
+unfortunates(2) AH N F AO R CH UW N AH T S
+unfounded AH N F AW N D IH D
+unfriendly AH N F R EH N D L IY
+unfrozen AH N F R OW Z IH N
+unfulfilled AH N F UH L F IH L D
+unfunded AH N F AH N D IH D
+unfunnily AH N F AH N AH L IY
+unfurl AH N F ER L
+unfurled AH N F ER L D
+unfurling AH N F ER L IH NG
+ung AH NG
+ungainly AH N G EY N L IY
+ungar AH NG G ER
+ungaro UW NG G AA R OW
+unger AH NG G ER
+ungerer AH NG ER ER
+ungermann AH N JH ER M AH N
+unglamorous AH N G L AE M ER AH S
+unglue AH N G L UW
+unglued AH N G L UW D
+ungo AH N G OW
+ungodly AH N G AO D L IY
+ungovernable AH N G AH V ER N AH B AH L
+ungrateful AH N G R EY T F AH L
+unguarded AH N G AA R D IH D
+unhampered AH N HH AE M P ER D
+unhappily AH N HH AE P AH L IY
+unhappiness AH N HH AE P IY N IH S
+unhappy AH N HH AE P IY
+unharmed AH N HH AA R M D
+unhealthful AH N HH EH L TH F AH L
+unhealthy AH N HH EH L TH IY
+unheard AH N HH ER D
+unhedged AH N HH EH JH D
+unheeded AH N HH IY D IH D
+unhelpful AH N HH EH L P F AH L
+unheralded AH N HH EH R AH L D IH D
+unhesitatingly AH N HH EH Z IH T EY T IH NG L IY
+unhindered AH N HH IH N D ER D
+unhinge AH N HH IH N JH
+unhinged AH N HH IH N JH D
+unhitch AH N HH IH CH
+unholy AH N HH OW L IY
+unhook AH N HH UH K
+unhorsed AH N HH AO R S T
+unhurried AH N HH ER IY D
+unhurt AH N HH ER T
+uni Y UW N IY
+unibancorp Y UW N IH B AE N K AO R P
+unicef Y UW N AH S EH F
+unicellular Y UW N IH S EH L Y AH L ER
+unicenter Y UW N IH S EH N T ER
+unicom Y UW N IH K AO M
+unicorn Y UW N IH K AO R N
+unicorp Y UW N IH K AO R P
+unicorp's Y UW N IH K AO R P S
+unicycle Y UW N AH S AY K AH L
+unicycles Y UW N AH S AY K AH L Z
+uniden Y UW N IH D EH N
+uniden's Y UW N IH D EH N Z
+unidentified AH N AY D EH N T AH F AY D
+unification Y UW N AH F AH K EY SH AH N
+unified Y UW N AH F AY D
+unifil Y UW N IH F IH L
+uniforce Y UW N IH F AO R S
+uniform Y UW N AH F AO R M
+uniformed Y UW N AH F AO R M D
+uniformity Y UW N AH F AO R M AH T IY
+uniformly Y UW N AH F AO R M L IY
+uniforms Y UW N AH F AO R M Z
+unify Y UW N AH F AY
+unifying Y UW N AH F AY IH NG
+unigesco Y UW N IH G EH S K OW
+unikom Y UW N IH K AO M
+unilab Y UW N IH L AE B
+unilateral Y UW N AH L AE T ER AH L
+unilateralism Y UW N IH L AE T ER AH L IH Z AH M
+unilaterally Y UW N AH L AE T ER AH L IY
+unilaterally(2) Y UW N AH L AE T R AH L IY
+unilever Y UW N IH L IY V ER
+unilever's Y UW N IH L IY V ER Z
+unimaginable AH N IH M AE JH IH N AH B AH L
+unimaginative AH N IH M AE JH IH N AH T IH V
+unimagined AH N IH M AE JH AH N D
+unimate Y UW N IH M EY T
+unimation Y UW N IH M EY SH AH N
+unimedia Y UW N IH M IY D IY AH
+unimpaired AH N IH M P EH R D
+unimpeachable AH N IH M P IY CH AH B AH L
+unimpeded AH N IH M P IY D IH D
+unimportant AH N IH M P AO R T AH N T
+unimpressed AH N IH M P R EH S T
+unimpressive AH N IH M P R EH S IH V
+unimproved AH N IH M P R UW V D
+unincorporated AH N IH N K AO R P ER EY T IH D
+unindicted AH N IH N D AY T IH D
+uninfected AH N IH N F EH K T IH D
+uninformative AH N IH N F AO R M AH T IH V
+uninformed AH N IH N F AO R M D
+uninhabitable AH N IH N HH AE B AH T AH B AH L
+uninhabited AH N IH N HH AE B AH T IH D
+uninhibited AH N IH N HH IH B IH T IH D
+uninitiated AH N IH N IH SH IY EY T IH D
+uninitiated(2) AH N IY N IH SH IY EY T IH D
+uninjured AH N IH N JH ER D
+uninspired AH N IH N S P AY ER D
+uninspiring AH N IH N S P AY R IH NG
+uninsurable AH N IH N SH UH R AH B AH L
+uninsured AH N IH N SH UH R D
+unintelligible AH N IH N T EH L AH JH AH B AH L
+unintended AH N IH N T EH N D IH D
+unintentional AH N IH N T EH N SH AH N AH L
+unintentionally AH N IH N T EH N SH AH N AH L IY
+unintentionally(2) AH N IH N T EH N SH N AH L IY
+uninterested AH N IH N T R AH S T AH D
+uninteresting AH N IH N T R AH S T IH NG
+uninterrupted AH N IH N T ER AH P T IH D
+uninterrupted(2) AH N IH N ER AH P T IH D
+uninterruptible AH N IH N T ER AH P T AH B AH L
+uninterruptible(2) AH N IH N ER AH P T AH B AH L
+uninvited AH N IH N V AY T IH D
+uninviting AH N IH N V AY T IH NG
+uninvolved AH N IH N V AO L V D
+union Y UW N Y AH N
+union's Y UW N Y AH N Z
+uniondale Y UW N Y AH N D EY L
+unionfed Y UW N Y AH N F EH D
+unionism Y UW N Y AH N IH Z AH M
+unionist Y UW N Y AH N AH S T
+unionists Y UW N Y AH N IH S T S
+unionization Y UW N Y AH N AH Z EY SH AH N
+unionize Y UW N Y AH N AY Z
+unionized Y UW N Y AH N AY Z D
+unionizing Y UW N Y AH N AY Z IH NG
+unions Y UW N Y AH N Z
+unions' Y UW N Y AH N Z
+unique Y UW N IY K
+uniquely Y UW N IY K L IY
+uniqueness Y UW N IY K N AH S
+uniroyal Y UW N IH R OY AH L
+unisex Y UW N IH S EH K S
+unisom Y UW N AH S AA M
+unison Y UW N AH S AH N
+unison(2) Y UW N IH S AH N
+unisons Y UW N AH S AH N Z
+unisons(2) Y UW N IH S AH N Z
+unisource Y UW N IH S AO R S
+unissued AH N IH SH UW D
+unisys Y UW N IH S IH S
+unisys' Y UW N IH S IH S
+unisys's Y UW N IH S IH S IH Z
+unit Y UW N AH T
+unit's Y UW N IH T S
+unit(2) Y UW N IH T
+unita Y UW N IY T AH
+unitaf Y UW N IH T AE F
+unitarian Y UW N AH T EH R IY AH N
+unitary Y UW N IH T EH R IY
+unitas Y UW N AY T AH S
+unite Y UW N AY T
+united Y UW N AY T AH D
+united's Y UW N AY T AH D Z
+united(2) Y UW N AY T IH D
+unitedbank Y UW N AY T IH D B AE NG K
+unitek Y UW N IH T EH K
+unitel Y UW N IH T EH L
+unites Y UW N AY T S
+unitholder Y UW N IH T HH OW L D ER
+unitholders Y UW N IH T HH OW L D ER Z
+uniting Y UW N AY T IH NG
+unitrin Y UW N IH T R IH N
+unitrin's Y UW N IH T R IH N Z
+unitrode Y UW N IH T R OW D
+unitrode's Y UW N IH T R OW D Z
+units Y UW N AH T S
+units' Y UW N IH T S
+units(2) Y UW N IH T S
+unity Y UW N AH T IY
+unity(2) Y UW N IH T IY
+univa Y UW N IH V AH
+univar Y UW N IH V AA R
+univation Y UW N IH V EY SH AH N
+universal Y UW N AH V ER S AH L
+universal's Y UW N AH V ER S AH L Z
+universality Y UW N AH V ER S AE L AH T IY
+universally Y UW N AH V ER S AH L IY
+universe Y UW N AH V ER S
+universes Y UW N AH V ER S IH Z
+universities Y UW N AH V ER S AH T IY Z
+universities' Y UW N IH V ER S IH T IY Z
+university Y UW N AH V ER S AH T IY
+university's Y UW N AH V ER S AH T IY Z
+univisa Y UW N IH V IY S AH
+univision Y UW N IH V IH ZH AH N
+unix Y UW N IH K S
+unjust AH N JH AH S T
+unjustifiable AH N JH AH S T IH F AY AH B AH L
+unjustifiably AH N JH AH S T IH F AY AH B L IY
+unjustified AH N JH AH S T AH F AY D
+unjustly AH N JH AH S T L IY
+unkefer AH NG K IH F ER
+unkempt AH N K EH M P T
+unkind AH N K AY N D
+unkindest AH N K AY N D IH S T
+unknowable AH N N OW AH B AH L
+unknowing AH N N OW IH NG
+unknowingly AH N N OW IH NG L IY
+unknown AH N N OW N
+unknowns AH N OW N Z
+unlabeled AH N L EY B AH L D
+unland AH N L AH N D
+unlawful AH N L AO F AH L
+unlawfully AH N L AO F AH L IY
+unleaded AH N L EH D AH D
+unleash AH N L IY SH
+unleashed AH N L IY SH T
+unleashes AH N L IY SH IH Z
+unleashing AH N L IY SH IH NG
+unless AH N L EH S
+unleveraged AH N L EH V R IH JH D
+unlicensed AH N L AY S AH N S T
+unlike AH N L AY K
+unlikely AH N L AY K L IY
+unlimited AH N L IH M AH T AH D
+unlimited(2) AH N L IH M IH T IH D
+unlined AH N L AY N D
+unlisted AH N L IH S T IH D
+unlivable AH N L IH V AH B AH L
+unload AH N L OW D
+unloaded AH N L OW D AH D
+unloaded(2) AH N L OW D IH D
+unloading AH N L OW D IH NG
+unloads AH N L OW D Z
+unlock AH N L AA K
+unlocked AH N L AA K T
+unlocking AH N L AA K IH NG
+unloved AH N L AH V D
+unlucky AH N L AH K IY
+unmade AH N M EY D
+unmanage AH N M AE N IH JH
+unmanageable AH N M AE N IH JH AH B AH L
+unmanaged AH N M AE N IH JH D
+unmanned AH N M AE N D
+unmarked AH N M AA R K T
+unmarried AH N M EH R IY D
+unmask AH N M AE S K
+unmasked AH N M AE S K T
+unmatched AH N M AE CH T
+unmentionable AH N M EH N SH AH N AH B AH L
+unmentioned AH N M EH N CH AH N D
+unmet AH N M EH T
+unmistakable AH N M IH S T EY K AH B AH L
+unmistakably AH N M IH S T EY K AH B L IY
+unmitigated AH N M IH T AH G EY T IH D
+unmixed AH N M IH K S T
+unmolested AH N M AH L EH S T IH D
+unmoved AH N M UW V D
+unnamed AH N N EY M D
+unnatural AH N N AE CH ER AH L
+unnaturally AH N N AE CH ER AH L IY
+unnaturally(2) AH N N AE CH ER L IY
+unnaturally(3) AH N AE CH ER L IY
+unnaturally(4) AH N N AE CH R AH L IY
+unnecessarily AH N N EH S AH S EH R AH L IY
+unnecessary AH N N EH S AH S EH R IY
+unneeded AH N N IY D IH D
+unnerve AH N ER V
+unnerved AH N N ER V D
+unnerving AH N ER V IH NG
+unnoticed AH N N OW T IH S T
+uno AH N OW
+uno(2) UW N OW
+unobstructed AH N AH B S T R AH K T IH D
+unobtainable AH N AH B T EY N AH B AH L
+unobtrusive AH N AH B T R UW S IH V
+unocal Y UW N AH K AE L
+unocal's Y UW N AH K AE L Z
+unocal's(2) Y UW N AH K AO L Z
+unocal(2) Y UW N AH K AO L
+unoccupied AH N AA K Y AH P AY D
+unofficial AH N AH F IH SH AH L
+unofficially AH N AH F IH SH AH L IY
+unopened AH N OW P AH N D
+unopposed AH N AH P OW Z D
+unorganized AH N AO R G AH N AY Z D
+unorthodox AH N AO R TH AH D AA K S
+unos UW N OW Z
+unosom Y UW N OW S AO M
+unosom(2) Y UW N OW S AH M
+unpack AH N P AE K
+unpacked AH N P AE K T
+unpacking AH N P AE K IH NG
+unpaid AH N P EY D
+unpainted AH N P EY N T IH D
+unpalatable AH N P AE L AH T AH B AH L
+unparalleled AH N P EH R AH L EH L D
+unpatriotic AH N P EY T R IY AA T IH K
+unpayable AH N P EY AH B AH L
+unperturbed AH N P ER T ER B D
+unplaced AH N P L EY S T
+unplanned AH N P L AE N D
+unpleasant AH N P L EH Z AH N T
+unpleasantly AH N P L EH Z AH N T L IY
+unpleasantness AH N P L EH Z AH N T N AH S
+unplug AH N P L AH G
+unplugged AH N P L AH G D
+unpopular AH N P AA P Y AH L ER
+unpopularity AH N P AA P Y AH L EH R IH T IY
+unprecedented AH N P R EH S IH D EH N T IH D
+unprecedentedly AH N P R EH S AH D EH N T IH D L IY
+unpredictability AH N P R AH D IH K T AH B IH L IH T IY
+unpredictable AH N P R IH D IH K T AH B AH L
+unpredictably AH N P R IH D IH K T AH B L IY
+unprepared AH N P R IY P EH R D
+unpreserved AH N P R AH Z ER V D
+unpreserved(2) AH N P R IH Z ER V D
+unpreserved(3) AH N P R IY Z ER V D
+unpressurized AH N P R EH SH ER AY Z D
+unpretentious AH N P R IY T EH N SH AH S
+unprincipled AH N P R IH N S AH P AH L D
+unprintable AH N P R IH N T AH B AH L
+unprocessed AH N P R AO S EH S T
+unproductive AH N P R AH D AH K T IH V
+unprofessional AH N P R AH F EH SH AH N AH L
+unprofitability AH N P R AA F IH T AH B IH L IH T IY
+unprofitable AH N P R AA F IH T AH B AH L
+unprofor AH P R OW F AO R
+unprofor's AH P R OW F AO R Z
+unpromising AH N P R AO M IH S IH NG
+unprotected AH N P R AH T EH K T IH D
+unproved AH N P R UW V D
+unproven AH N P R UW V AH N
+unprovoked AH N P R AH V OW K T
+unpublicized AH N P AH B L IH S AY Z D
+unpublished AH N P AH B L IH SH T
+unpunished AH N P AH N IH SH T
+unqualified AH N K W AA L IH F AY D
+unquestionable AH N K W EH S CH AH N AH B AH L
+unquestionably AH N K W EH S CH AH N AH B L IY
+unquestioned AH N K W EH S CH AH N D
+unquestioning AH N K W EH S CH AH N IH NG
+unquote AH N K W OW T
+unrated AH N R EY T IH D
+unrath AH N R AH TH
+unratified AH N R AE T IH F AY D
+unravel AH N R AE V AH L
+unraveled AH N R AE V AH L D
+unraveling AH N R AE V AH L IH NG
+unraveling(2) AH N R AE V L IH NG
+unravels AH N R AE V AH L Z
+unreachable AH N R IY CH AH B AH L
+unread AH N R EH D
+unreadable AH N R IY D AH B AH L
+unreal AH N R IY L
+unrealistic AH N R IY L IH S T IH K
+unrealistically AH N R IY AH L IH S T IH K L IY
+unreality AH N R IY AE L AH T IY
+unrealized AH N R IY AH L AY Z D
+unreasonable AH N R IY Z N AH B AH L
+unreasonably AH N R IY Z AH N AH B L IY
+unreasoning AH N R IY Z N IH NG
+unreceptive AH N R IH S EH P T IH V
+unrecognizable AH N R EH K AH G N AY Z AH B AH L
+unrecognized AH N R EH K AH G N AY Z D
+unreconciled AH N R EH K AH N S AY L D
+unreconstructed AH N R IY K AH N S T R AH K T IH D
+unrecorded AH N R IH K AO R D IH D
+unredeemed AH N R IY D IY M D
+unrefined AH N R IY F AY N D
+unrefuted AH N R IY F Y UW T IH D
+unregistered AH N R EH JH IH S T ER D
+unregulated AH N R EH G Y AH L EY T IH D
+unrehearsed AH N R IY HH ER S T
+unreimbursed AH N R IY IH M B ER S T
+unrein AO N R AY N
+unrelated AH N R IH L EY T IH D
+unrelated(2) AH N R IY L EY T IH D
+unreleased AH N R IH L IY S T
+unrelenting AH N R IY L EH N T IH NG
+unreliability AH N R IY L AY AH B IH L IH T IY
+unreliable AH N R IH L AY AH B AH L
+unreliable(2) AH N R IY L AY AH B AH L
+unrelieved AH N R IY L IY V D
+unremarkable AH N R IH M AA R K AH B AH L
+unremarked AH N R IH M AA R K T
+unremitted AH N R IH M IH T IH D
+unremitting AH N R IH M IH T IH NG
+unremitting(2) AH N R IY M IH T IH NG
+unrepentant AH N R IH P EH N T AH N T
+unrepentant(2) AH N R IY P EH N T AH N T
+unreported AH N R IY P AO R T IH D
+unrepresentative AH N R EH P R IH Z EH N T AH T IH V
+unrepresented AH N R EH P R IH Z EH N T IH D
+unrequited AH N R IY K W AY T IH D
+unresolved AH N R IH Z AA L V D
+unresponsive AH N R IY S P AA N S IH V
+unrest AH N R EH S T
+unrestrained AH N R IY S T R EY N D
+unrestricted AH N R IY S T R IH K T IH D
+unrevised AH N R IY V AY Z D
+unring AH N R IH NG
+unrivaled AH N R AY V AH L D
+unrue AH N R UW
+unruffled AH N R AH F AH L D
+unruh AH N R UW
+unruly AH N R UW L IY
+unsafe AH N S EY F
+unsaid AH N S EH D
+unsalable AH N S EY L AH B AH L
+unsaleable AH N S EY L AH B AH L
+unsanctioned AH N S AE NG K SH AH N D
+unsanitary AH N S AE N AH T EH R IY
+unsatisfactory AH N S AH T IH S F AE K T ER IY
+unsatisfied AH N S AE T IH S F AY D
+unsatisfying AH N S AE T IH S F AY IH NG
+unsaturated AH N S AE CH ER EY T IH D
+unsavory AH N S EY V ER IY
+unscathed AH N S K EY DH D
+unscheduled AH N S K EH JH UW L D
+unscientific AH N S AY AH N T IH F IH K
+unscom AH N S K AO M
+unscramble AH N S K R AE M B AH L
+unscripted AH N S K R IH P T IH D
+unscrupulous AH N S K R UW P Y AH L AH S
+unseal AH N S IY L
+unsealed AH N S IY L D
+unseasonably AH N S IY Z AH N AH B L IY
+unseat AH N S IY T
+unseated AH N S IY T IH D
+unseating AH N S IY T IH NG
+unsecured AH N S IH K Y UH R D
+unsecured(2) AH N S IY K Y UH R D
+unseemly AH N S IY M L IY
+unseen AH N S IY N
+unsell AH N S EH L
+unsentimental AH N S EH N T IH M EH N T AH L
+unser AH N S ER
+unserviceable AH N S ER V AH S AH B AH L
+unset AH N S EH T
+unsettle AH N S EH T AH L
+unsettled AH N S EH T AH L D
+unsettling AH N S EH T AH L IH NG
+unsettling(2) AH N S EH T L IH NG
+unshackle AH N SH AE K AH L
+unshackled AH N SH AE K AH L D
+unshakable AH N SH EY K AH B AH L
+unshakeable AH N SH EY K AH B AH L
+unshaken AH N SH EY K AH N
+unsharpened AH N SH AA R P AH N D
+unshaven AH N SH EY V AH N
+unsightly AH N S AY T L IY
+unsigned AH N S AY N D
+unsinkable AH N S IH NG K AH B AH L
+unskilled AH N S K IH L D
+unsmiling AH N S M AY L IH NG
+unsold AH N S OW L D
+unsolicited AH N S AH L IH S IH T IH D
+unsolvable AH N S AA L V AH B AH L
+unsolved AH N S AA L V D
+unsophisticated AH N S AH F IH S T IH K EY T IH D
+unsound AH N S AW N D
+unsparing AH N S P EH R IH NG
+unspeakable AH N S P IY K AH B AH L
+unspecified AH N S P EH S AH F AY D
+unspectacular AH N S P EH K T AE K Y AH L ER
+unspent AH N S P EH N T
+unspoiled AH N S P OY L D
+unspoken AH N S P OW K AH N
+unsportsmanlike AH N S P AO R T S M AH N L AY K
+unstable AH N S T EY B AH L
+unstained AH N S T EY N D
+unstated AH N S T EY T IH D
+unsteady AH N S T EH D IY
+unstinting AH N S T IH N T IH NG
+unstoppable AH N S T AA P AH B AH L
+unstructured AH N S T R AH K SH ER D
+unstuck AH N S T AH K
+unsubscribe AH N S AH B S K R AY B
+unsubscribed AH N S AH B S K R AY B D
+unsubsidized AH N S AH B S AH D AY Z D
+unsubstantiated AH N S AH B S T AE N SH IY EY T IH D
+unsubtle AH N S AH T AH L
+unsuccessful AH N S AH K S EH S F AH L
+unsuccessfully AH N S AH K S EH S F AH L IY
+unsuitable AH N S UW T AH B AH L
+unsuited AH N S UW T IH D
+unsullied AH N S AH L IY D
+unsung AH N S AH NG
+unsupervised AH N S UW P ER V AY Z D
+unsupportable AH N S AH P AO R T AH B AH L
+unsupported AH N S AH P AO R T IH D
+unsure AH N SH UH R
+unsurpassed AH N S ER P AE S T
+unsurprising AH N S ER P R AY Z IH NG
+unsurprisingly AH N S ER P R AY Z IH NG L IY
+unsuspected AH N S AH S P EH K T IH D
+unsuspecting AH N S AH S P EH K T IH NG
+unsustainable AH N S AH S T EY N AH B AH L
+unsustainably AH N S AH S T EY N AH B L IY
+unswayed AH N S W EY D
+unswerving AH N S W ER V IH NG
+unsworth AH N S W ER TH
+unsympathetic AH N S IH M P AH TH EH T IH K
+untainted AH N T EY N T IH D
+untangle AH N T AE NG G AH L
+untangling AH N T AE NG L IH NG
+untapped AH N T AE P T
+untaxed AH N T AE K S T
+unted AH N T EH D
+untenable AH N T EH N AH B AH L
+untendered AH N T EH N D ER D
+unterberg AH N T ER B ER G
+unterman AH N T ER M AH N
+untermeyer AH N T ER M AY R
+unterreiner AO N T ER AY N ER
+untested AH N T EH S T IH D
+unthinkable AH N TH IH NG K AH B AH L
+unthinking AH N TH IH NG K IH NG
+unthinkingly AH N TH IH NG K IH NG L IY
+untidy AH N T AY D IY
+untie AH N T AY
+untied AH N T AY D
+untiedt AO N T IY T
+until AH N T IH L
+untimely AH N T AY M L IY
+unto AH N T UW
+untold AH N T OW L D
+untouchable AH N T AH CH AH B AH L
+untouchables AH N T AH CH AH B AH L Z
+untouched AH N T AH CH T
+untoward AH N T UW AO R D
+untoward(2) AH N T AH W AO R D
+untraceable AH N T R EY S AH B AH L
+untraditional AH N T R AH D IH SH AH N AH L
+untrained AH N T R EY N D
+untrammeled AH N T R AE M AH L D
+untreatable AH N T R IY T AH B AH L
+untreated AH N T R IY T IH D
+untried AH N T R AY D
+untroubled AH N T R AH B AH L D
+untrue AH N T R UW
+untrustworthy AH N T R AH S T W ER DH IY
+untruth AH N T R UW TH
+untruthful AH N T R UW TH F AH L
+untruths AH N T R UW TH S
+untruths(2) AH N T R UW DH S
+unturned AH N T ER N D
+untypical AH N T IH P IH K AH L
+unum Y UW N AH M
+unum(2) UW N AH M
+unusable AH N Y UW Z AH B AH L
+unused AH N Y UW Z D
+unusual AH N Y UW ZH AH W AH L
+unusual(2) AH N Y UW ZH UW AH L
+unusual(3) AH N Y UW ZH W AH L
+unusually AH N Y UW ZH AH W AH L IY
+unusually(2) AH N Y UW ZH UW AH L IY
+unusually(3) AH N Y UW ZH W AH L IY
+unvarnished AH N V AA R N IH SH T
+unveil AH N V EY L
+unveiled AH N V EY L D
+unveiling AH N V EY L IH NG
+unveils AH N V EY L Z
+unverifiable AH N V EH R IH F AY AH B AH L
+unverified AH N V EH R IH F AY D
+unverzagt AO N V ER Z AO G T
+unwanted AH N W AO N T IH D
+unwarranted AH N W AO R AH N T IH D
+unwary AH N W EH R IY
+unwashed AH N W AA SH T
+unwavering AH N W EY V ER IH NG
+unwed AH N W EH D
+unwelcome AH N W EH L K AH M
+unwelcomed AH N W EH L K AH M D
+unwieldiness AH N W IY L D IY N AH S
+unwielding AH N W IY L D IH NG
+unwieldy AH N W IY L D IY
+unwilling AH N W IH L IH NG
+unwillingly AH N W IH L IH NG L IY
+unwillingness AH N W IH L IH NG N IH S
+unwin AO N W IH N
+unwind AH N W AY N D
+unwinding AH N W AY N D IH NG
+unwinnable AH N W IH N AH B AH L
+unwise AH N W AY Z
+unwisely AH N W AY Z L IY
+unwitting AH N W IH T IH NG
+unwittingly AH N W IH T IH NG L IY
+unworkable AH N W ER K AH B AH L
+unworried AH N W ER IY D
+unworthy AH N W ER DH IY
+unwound AH N W AW N D
+unwrap AH N R AE P
+unwrapped AH N R AE P T
+unwrapping AH N R AE P IH NG
+unwritten AH N R IH T AH N
+unyielding AH N Y IY L D IH NG
+unz AH N Z
+unzicker AO N Z IH K ER
+unzip AH N Z IH P
+unzipped AH N Z IH P T
+up AH P
+up's AH P S
+upbeat AH P B IY T
+upbraid AH P B R EY D
+upbraided AH P B R EY D IH D
+upbringing AH P B R IH NG IH NG
+upchurch AH P CH ER CH
+upcoming AH P K AH M IH NG
+update AH P D EY T
+updated AH P D EY T AH D
+updated(2) AH P D EY T IH D
+updates AH P D EY T S
+updating AH P D EY T IH NG
+updegraff AH P D IH G R AH F
+updegrove UW P D EH G R OW V IY
+updike AH P D AY K
+updraft AH P D R AE F T
+updrafts AH P D R AE F T S
+updyke AH P D AY K
+upfront AH P F R AH N T
+upgrade AH P G R EY D
+upgraded AH P G R EY D AH D
+upgraded(2) AH P G R EY D IH D
+upgrader AH P G R EY D ER
+upgrades AH P G R EY D Z
+upgrading AH P G R EY D IH NG
+upham AH P AH M
+upheaval AH P HH IY V AH L
+upheavals AH P HH IY V AH L Z
+upheld AH P HH EH L D
+uphill AH P HH IH L
+uphoff AH P HH AO F
+uphold AH P HH OW L D
+upholding AH P HH OW L D IH NG
+upholds AH P HH OW L D Z
+upholster AH P OW L S T ER
+upholstered AH P OW L S T ER D
+upholstery AH P OW L S T ER IY
+upjohn AH P JH AA N
+upjohn's AH P JH AA N Z
+upkeep AH P K IY P
+upland AH P L AH N D
+uplands AH P L AH N D Z
+uplift AH P L IH F T
+uplifted AH P L IH F T IH D
+uplifting AH P L IH F T IH NG
+uplinger UW P AH L IH NG ER
+uplinger(2) UW P L IH NG ER
+upmanship AH P M AH N SH IH P
+upmarket AH P M AA R K AH T
+upon AH P AA N
+upp AH P
+upped AH P T
+upper AH P ER
+upperclass AH P ER K L AE S
+upperman AH P ER M AH N
+uppermost AH P ER M OW S T
+uppers AH P ER Z
+upping AH P IH NG
+uppity AH P AH T IY
+upright AH P R AY T
+uprights AH P R AY T S
+uprise AH P R AY Z
+uprising AH P R AY Z IH NG
+uprisings AH P R AY Z IH NG Z
+upriver AH P R IH V ER
+uproar AH P R AO R
+uproot AH P R UW T
+uprooted AH P R UW T IH D
+uprooting AH P R UW T IH NG
+ups AH P S
+upscale AH P S K EY L
+upset AH P S EH T
+upsets AH P S EH T S
+upsetting AH P S EH T IH NG
+upshaw AH P SH AO
+upshot AH P SH AA T
+upshur AH P SH ER
+upside AH P S AY D
+upsize AH P S AY Z
+upsizing AH P S AY Z IH NG
+upson AH P S AH N
+upstage AH P S T EY JH
+upstaged AH P S T EY JH D
+upstairs AH P S T EH R Z
+upstanding AH P S T AE N D IH NG
+upstart AH P S T AA R T
+upstarts AH P S T AA R T S
+upstate AH P S T EY T
+upstream AH P S T R IY M
+upsurge AH P S ER JH
+upswing AH P S W IH NG
+upswings AH P S W IH NG Z
+uptain AH P T EY N
+uptake AH P T EY K
+uptegrove AH P T IH G R AH V
+uptick AH P T IH K
+upticks AH P T IH K S
+uptight AH P T AY T
+upton AH P T AH N
+uptown AH P T AW N
+uptrend AH P T R EH N D
+upturn AH P T ER N
+upturns AH P T ER N Z
+upward AH P W ER D
+upwardly AH P W ER D L IY
+upwards AH P W ER D Z
+upwood AH P W UH D
+ur ER
+ur(2) UH R
+ural Y UH R AH L
+urals Y UH R AH L Z
+uram Y UW R AH M
+uranga ER AA NG G AH
+uranium Y ER EY N IY AH M
+uranus Y UW R AH N AH S
+uranus(2) Y ER AH N AH S
+urbach ER B AA K
+urbain ER B EY N
+urban ER B AH N
+urban's ER B AH N Z
+urbana ER B AE N AH
+urbanchuk ER B AH N CH AH K
+urbanczyk ER B AH N CH IH K
+urbane ER B EY N
+urbanek ER B AE N EH K
+urbani ER B AA N IY
+urbaniak ER B AE N IY AE K
+urbanik ER B AE N IH K
+urbanism ER B AH N IH Z M
+urbanite ER B AH N AY T
+urbanites ER B AH N AY T S
+urbanization ER B AH N AH Z EY SH AH N
+urbanization(2) ER B AH N IH Z EY SH AH N
+urbanize ER B AH N AY Z
+urbanized ER B AH N AY Z D
+urbano ER B AA N OW
+urbanowicz ER B AE N AH V IH CH
+urbanski ER B AE N S K IY
+urbas ER B AH Z
+urbaszewski ER B AH S UW S K IY
+urbina ER B IY N AH
+urchin ER CH AH N
+urchins ER CH AH N Z
+urda ER D AH
+urdangarin ER D AE NG AA R IH N
+urdiales ER D IY EY L Z
+urdu ER D UW
+ure Y UW R
+urea Y ER IY AH
+uremia Y ER IY M IY AH
+uren ER EH N
+urena ER EY N AH
+uresti ER EH S T IY
+urethane Y ER AH TH EY N
+urethra Y ER IY TH R AH
+urey Y ER IY
+urfer ER F ER
+urge ER JH
+urged ER JH D
+urgen ER JH EH N
+urgen's ER JH EH N Z
+urgency ER JH AH N S IY
+urgent ER JH AH N T
+urgently ER JH AH N T L IY
+urges ER JH AH Z
+urges(2) ER JH IH Z
+urging ER JH IH NG
+urgings ER JH IH NG Z
+urgo ER G OW
+uri Y ER IY
+uri's Y ER IY Z
+urian Y ER IY AH N
+uriarte Y ER IY AA R T IY
+urias Y ER IY AH Z
+uribe Y ER IY B IY
+uric Y ER IH K
+urich Y ER IH K
+urick Y ER R IH K
+urie Y ER IY
+uriegas Y ER IY G AH Z
+urinalysis Y ER AH N AE L AH S IH S
+urinary Y ER AH N EH R IY
+urinate Y ER AH N EY T
+urinating Y ER AH N EY T IH NG
+urine Y ER AH N
+urine(2) Y UH R AH N
+urioste Y ER IY OW S T IY
+urkel ER K AH L
+urman ER M AH N
+urn ER N
+urness ER N AH S
+urokinase Y ER AH K AH N EY Z
+urologist Y ER AA L AH JH AH S T
+urologists Y ER AA L AH JH AH S T S
+urology Y ER AA L AH JH IY
+urquhart ER K AA R T
+urquidez ER K W IY D EH Z
+urquidi ER K W IY D IY
+urquiza ER K W IY Z AH
+urrea ER IY AH
+urrutia ER UW SH AH
+ursa ER S AH
+urschel ER SH AH L
+ursery ER S ER IY
+ursie ER S IY
+ursin ER S IH N
+ursini ER S IY N IY
+urso ER S OW
+ursola ER S OW L AH
+urson ER S AH N
+urstadt ER S T AE T
+ursula ER S AH L AH
+ursus ER S AH S
+ursy ER S IY
+urton ER T AH N
+uruguay Y ER AH G W EY
+uruguay's Y ER AH G W EY Z
+uruguay's(2) Y ER AH G W AY Z
+uruguay(2) Y ER AH G W AY
+uruguayan Y ER AH G W EY AH N
+uruguayan(2) Y ER AH G W AY AH N
+urwin ER W AH N
+ury Y UW R IY
+ury(2) Y ER IY
+us AH S
+us(2) Y UW EH S
+usa Y UW EH S EY
+usable Y UW Z AH B AH L
+usafe Y UW S EY F
+usage Y UW S AH JH
+usage(2) Y UW S IH JH
+usages Y UW S AH JH AH Z
+usages(2) Y UW S IH JH IH Z
+usaid Y UW EH S EY D
+usair Y UW EH S EH R
+usair's Y UW EH S EH R Z
+usairways Y UW EH S EH R W EY Z
+usameribancs Y UW EH S AH M EH R IH B AE N K S
+usbancorp Y UW EH S B AE NG K AO R P
+use Y UW S
+use(2) Y UW Z
+usec Y UW S EH K
+used Y UW Z D
+useful Y UW S F AH L
+useful's Y UW S F AH L Z
+usefully Y UW S F AH L IY
+usefulness Y UW S F AH L N AH S
+useless Y UW S L AH S
+uselman Y UW S AH L M AH N
+uselton Y UW S AH L T AH N
+usenet Y UW Z N EH T
+user Y UW Z ER
+user's Y UW Z ER Z
+users Y UW Z ER Z
+users' Y UW Z ER Z
+usery Y UW Z ER IY
+uses Y UW S AH Z
+uses(2) Y UW S IH Z
+uses(3) Y UW Z AH Z
+uses(4) Y UW Z IH Z
+usher AH SH ER
+ushered AH SH ER D
+ushering AH SH ER IH NG
+ushers AH SH ER Z
+usines Y UW Z IY N Z
+using Y UW Z IH NG
+usinor Y UW S AH N ER
+usoniam Y UW S OW N IY AH N
+usrey AH S R IY
+usry AH S R IY
+uss Y UW EH S EH S
+ussery AH S ER IY
+ustasha Y UW S T AA SH AH
+ustinov UW S T IH N AA V
+ustinov(2) Y UW S T IH N AA V
+ustrust Y UW EH S T R AH S T
+usual Y UW ZH AH W AH L
+usual(2) Y UW ZH UW AH L
+usually Y UW ZH AH W AH L IY
+usually(2) Y UW ZH AH L IY
+usurp Y UW S ER P
+usurpation Y UW S ER P EY SH AH N
+usurped Y UW S ER P T
+usurping Y UW S ER P IH NG
+usurps Y UW S ER P S
+usury Y UW ZH ER IY
+usury(2) Y UW Z ER IY
+utah Y UW T AO
+utah's Y UW T AA Z
+utamaro Y UW T AH M AA R OW
+utech Y UW T EH K
+utecht Y UW T EH K T
+utensils Y UW T EH N S AH L Z
+uterine Y UW T ER AH N
+utero Y UW T ER OW
+uterus Y UW T ER AH S
+utgoff AH T G AO F
+uthe AH DH
+uthe(2) AH TH
+uther Y UW TH ER
+uther(2) AH DH ER
+utica Y UW T AH K AH
+utica(2) Y UW T IY K AH
+utilicorp Y UW T IH L AH K AO R P
+utilicorp(2) Y UW T IH L AH K AO R
+utilitarian Y UW T IH L AH T EH R IY AH N
+utilities Y UW T IH L AH T IY Z
+utilities' Y UW T IH L AH T IY Z
+utility Y UW T IH L AH T IY
+utility's Y UW T IH L AH T IY Z
+utilization Y UW T AH L AH Z EY SH AH N
+utilize Y UW T AH L AY Z
+utilized Y UW T AH L AY Z D
+utilizes Y UW T AH L AY Z IH Z
+utilizing Y UW T AH L AY Z IH NG
+utke AH T K IY
+utley AH T L IY
+utmost AH T M OW S T
+utopia Y UW T OW P IY AH
+utopian Y UW T OW P IY AH N
+utopians Y UW T OW P IY AH N Z
+utopias Y UW T OW P IY AH Z
+utsey AH T S IY
+utsumi UW T S UW M IY
+utt AH T
+uttech AH T EH K
+utter AH T ER
+utterance AH T ER AH N S
+utterances AH T ER AH N S IH Z
+uttered AH T ER D
+uttering AH T ER IH NG
+utterly AH T ER L IY
+utters AH T ER Z
+utz AH T S
+utzinger AH T Z IH NG ER
+uva Y UW V AH
+uva(2) Y UW V IY EY
+uwe Y UW
+uy UW IY
+uy(2) Y UW W AY
+uyeda AY IY D AH
+uyehara UW Y EY HH AA R AH
+uyeno AY EY N OW
+uys Y UW IY Z
+uys(2) Y UW W AY EH S
+uzbek UW Z B EH K
+uzbekistan UW Z B EH K IH S T AE N
+uzbeks UW Z B EH K S
+uzelac AH Z EH L AH K
+uzi UW Z IY
+uzis UW Z IY Z
+uzmack UW Z M AE K
+uzzell UW Z EH L
+uzzle AH Z AH L
+u_s_m_c Y UW EH S EH M S IY
+v V IY
+v's V IY Z
+v. V IY
+v.'s V IY Z
+v.s V IY Z
+vaal V AA L
+vaapenfabrikk V AA P EH N F AH B R IH K
+vaapenfabrikk(2) V AA P AH N F AA B R IH K
+vaca V AE K AH
+vacancies V EY K AH N S IY Z
+vacancy V EY K AH N S IY
+vacant V EY K AH N T
+vacanti V AH K AE N T IY
+vacate V EY K EY T
+vacated V EY K EY T AH D
+vacating V EY K EY T IH NG
+vacation V EY K EY SH AH N
+vacationed V EY K EY SH AH N D
+vacationer V EY K EY SH AH N ER
+vacationers V EY K EY SH AH N ER Z
+vacationers' V EY K EY SH AH N ER Z
+vacationing V EY K EY SH AH N IH NG
+vacationing(2) V EY K EY SH N IH NG
+vacations V EY K EY SH AH N Z
+vacaville V AE K AH V IH L
+vacca V AE K AH
+vaccarella V AA K ER EH L AH
+vaccaro V AH K AA R OW
+vaccinate V AE K S AH N EY T
+vaccinated V AE K S AH N EY T IH D
+vaccination V AE K S AH N EY SH AH N
+vaccinations V AE K S AH N EY SH AH N Z
+vaccine V AE K S IY N
+vaccine's V AE K S IY N Z
+vaccines V AE K S IY N Z
+vaccinia V AH CH IY N IY AH
+vacco V AE K OW
+vacek V AA CH EH K
+vacha V AE CH AH
+vachon V AE CH AH N
+vacillate V AE S AH L EY T
+vacillated V AE S AH L EY T IH D
+vacillates V AE S AH L EY T S
+vacillating V AE S AH L EY T IH NG
+vacillation V AE S AH L EY SH AH N
+vaclav V AE K L AA V
+vaclav(2) V AA K L AA V
+vaclavik V AE K L AH V IH K
+vacuous V AE K Y UW AH S
+vacutainer V AE K Y UW T EY N ER
+vacuum V AE K Y UW M
+vacuuming V AE K Y UW M IH NG
+vacuums V AE K Y UW M Z
+vadala V AA D AA L AH
+vadas V AA D AA Z
+vadehra V AH D EY R AH
+vaden V EY D AH N
+vader V EY D ER
+vadim V AA D IY M
+vadnais V AH D N EY
+vadney V AE D N IY
+vaeth V IY TH
+vagabond V AE G AH B AA N D
+vagabonds V AE G AH B AA N D Z
+vagaries V EY G ER IY Z
+vagary V EY G ER IY
+vagelos V AH JH EH L OW S
+vagina V AH JH AY N AH
+vaginal V AH JH AY N AH L
+vagrancy V EY G R AH N S IY
+vagrant V EY G R AH N T
+vagrants V EY G R AH N T S
+vague V EY G
+vaguely V EY G L IY
+vagueness V EY G N IH S
+vaguer V EY G ER
+vaguest V EY G IH S T
+vaguine V AH G W IY N
+vahey V AE HH IY
+vahid V AA HH IY D
+vahl V AA L
+vahle V EY HH AH L
+vail V EY L
+vailab V EY L AE B
+vaile V EY L
+vaillancourt V EY L AH N K AO R T
+vain V EY N
+vainly V EY N L IY
+vajda V AY D AH
+vajna V AY N AH
+vakuf V AE K AH F
+val V AE L
+vala V AA L AH
+valable V AE L AH B AH L
+valade V AA L AA D EY
+valadez V AA L AA D EH Z
+valasek V AH L AA S EH K
+valborga V AA L B AO R G AH
+valcourt V AH L K AO R T
+valda V AA L D AH
+valdemar V AA L D EY M AA R
+valderrama V AA L D EH R AA M AH
+valdes V AE L D EH Z
+valdes-perez V AE L D EH Z P ER EH Z
+valdeshari V AE L D EH SH AA R IY
+valdez V AE L D EH Z
+valdis V AE L D IH S
+valdivia V AA L D IY V IY AH
+valdosta V AE L D AO S T AH
+valdovinos V AA L D OW V IY N OW Z
+vale V EY L
+valea V AH L IY AH
+valeda V AA L EY D AH
+valedictorian V AE L AH D IH K T AO R IY AH N
+valedictory V AE L AH D IH K T ER IY
+valek V AA L EH K
+valence V EY L AH N S
+valencia V AH L EH N S IY AH
+valencia's V AH L EH N S IY AH Z
+valencienne V AH L EH N S IY EH N
+valens V AE L AH N Z
+valensuela V AE L AH N Z W EY L AH
+valensuela's V AE L AH N Z W EY L AH Z
+valent V AA L EY AH N T
+valenta V AH L EH N T AH
+valente V AA L EH N T IY
+valenti V AH L EH N T IY
+valentia V AA L EH N SH AH
+valentin V AA L EY N T IY N
+valentina V AE L IH N T IY N AH
+valentine V AE L AH N T AY N
+valentine's V AE L AH N T AY N Z
+valentines V AE L AH N T AY N Z
+valentini V AE L AH N T IY N IY
+valentino V AE L AH N T IY N OW
+valentino's V AE L AH N T IY N OW Z
+valenza V AH L EH N Z AH
+valenzano V AE L EH N Z AA N OW
+valenzuela V AA L EH N Z UW L AH
+valeo V AE L IY OW
+valera V AH L EH R AH
+valeri V AA L EH R IY
+valeria V AH L IY R IY AH
+valerian V AH L IH R IY AH N
+valeriano V AA L ER IY AA N OW
+valerie V AE L ER IY
+valerio V AH L IY R IY OW
+valero V AH L EH R OW
+valery V AE L ER IY
+vales V EY L Z
+valeska V AA L EY S K AH
+valet V AE L EY
+valhalla V AE L HH AE L AH
+valhi V AE L HH IY
+valia V AE L Y AH
+valiant V AE L Y AH N T
+valiantly V AE L Y AH N T L IY
+valid V AE L AH D
+valid(2) V AE L IH D
+valida V AA L IY D AH
+validate V AE L AH D EY T
+validated V AE L AH D EY T AH D
+validates V AE L AH D EY T S
+validating V AE L AH D EY T IH NG
+validation V AE L AH D EY SH AH N
+valided V AE L AH D IH D
+validity V AH L IH D AH T IY
+validity(2) V AH L IH D IH T IY
+validly V AE L IH D L IY
+valiente V AA L IY N T IY
+valin V AE L IH N
+valiquette V AE L IH K EH T
+valis V AE L IH S
+valium V EY L IY AH M
+valk V AO K
+valko V AE L K OW
+valla V AE L AH
+valladares V AA L AA D AA R EH S
+vallance V AE L AH N S
+vallandingham V AE L AH N D IH NG HH AE M
+vallario V AA L AA R IY OW
+vallarta V AE L AA R T AH
+vallas V AE L AH Z
+valle V EY L
+valleau V AH L OW
+vallee V AE L IY
+vallegrande V AE L IY G R AE N D IY
+vallegrande(2) V AE L IY G R AE N D
+vallejo V AA L EY Y OW
+vallejos V AA L EY Y OW Z
+vallely V EY L IY
+vallely(2) V AE L IY
+vallery V AE L ER IY
+valles V EY L Z
+vallette V AE L EH T
+valley V AE L IY
+valley's V AE L IY Z
+valleys V AE L IY Z
+vallez V AA L EH Z
+valli V AE L IY
+valliant V AA L IY AH N T
+vallie V AO L IY
+vallier V AE L IY ER
+valliere V AE L IY EH R
+vallis V AE L IH S
+vallo V AE L OW
+vallone V AA L OW N IY
+vallot V AE L AH T
+valls V AO L Z
+valmeyer V AE L M AY ER
+valmont V AO L M AA N T
+valois V AE L W AA
+valone V AH L OW N
+valonia V AH L OW N Y AH
+valor V AE L ER
+valoree V AE L ER IY
+valores V AH L AO R EH Z
+valparaiso V AE L P ER EY S OW
+valsella V AO L S EH L AH
+valspar V AE L Z P AA R
+valtek V AO L T EH K
+valtierra V AA L T IH R AH
+valu V AE L Y UW
+valuable V AE L Y AH B AH L
+valuable(2) V AE L Y UW B AH L
+valuables V AE L Y AH B AH L Z
+valuables(2) V AE L Y UW B AH L Z
+valuation V AE L Y UW EY SH AH N
+valuations V AE L Y UW EY SH AH N Z
+value V AE L Y UW
+valued V AE L Y UW D
+valueless V AE L Y UW L AH S
+valuepoint V AE L Y UW P OY N T
+values V AE L Y UW Z
+values' V AE L Y UW Z
+valuevision V AE L Y UW V IH ZH AH N
+valuing V AE L Y UW IH NG
+valujet V AE L Y UW JH EH T
+valujet's V AE L Y UW JH EH T S
+valukas V AH L UW K AH S
+valvano V AA L V AA N OW
+valve V AE L V
+valverde V AA L V EH R D EY
+valves V AE L V Z
+valvo V AA L V OW
+valvoline V AE L V AH L IY N
+vamos V AA M OW Z
+vamp V AE M P
+vampire V AE M P AY R
+vampire's V AE M P AY R Z
+vampires V AE M P AY R Z
+vampiric V AE M P IH R IH K
+van V AE N
+van-gogh V AE N G OW
+vana V AE N AH
+vanacker V AE N AE K ER
+vanacore V AA N AA K AO R IY
+vanadium V AH N EY D IY AH M
+vanaken V AE N AH K AH N
+vanallen V AH N AO L AH N
+vanalstine V AE N AE L S T IY N
+vanalstyne V AE N AH L S T AY N
+vanaman V AE N AO M AH N
+vanamburg V AE N AE M B ER G
+vanamburgh V AE N AE M B ER G
+vanantwerp V AH N AE N T W ER P
+vanarsdale V AE N ER Z D EY L
+vanarsdall V AH N AA R S D AH L
+vanasse V AE N AE S
+vanatta V AA N AA T AH
+vanatter V AA N AE T ER
+vanauken V AE N AW K AH N
+vanausdall V AE N AW S D AH L
+vanbebber V AE N B EH B ER
+vanbeek V AE N B IY K
+vanbenschoten V AE N B EH N SH AH T AH N
+vanbergen V AE N B ER G AH N
+vanbibber V AE N B IH B ER
+vanblarcom V AE N B L AA R K AH M
+vanblaricom V AE N B L AE R IH K AH M
+vanbrocklin V AE N B R AA K L IH N
+vanbrunt V AE N B R AH N T
+vanburen V AE N B Y UW R AH N
+vanbuskirk V AE N B AH S K ER K
+vancamp V AE N K AE M P
+vancampen V AE N K AE M P AH N
+vance V AE N S
+vancil V AE N S AH L
+vancise V AA N CH AY S
+vancleave V AE N K L AH V
+vancleef V AE N K L IY F
+vancleve V AE N K L IY V
+vancomycin V AE N K OW M AY S IH N
+vancott V AH N K AA T
+vancourt V AH N K AO R T
+vancouver V AE N K UW V ER
+vancouver's V AE N K UW V ER Z
+vancura V AA N K UH R AH
+vancuren V AE N K Y UW R AH N
+vandaele V AE N D EH L
+vandagriff V AE N D AE G R IH F
+vandagriff(2) V AE N D AH G R IH F
+vandal V AE N D AH L
+vandalen V AE N D AE L AH N
+vandalism V AE N D AH L IH Z AH M
+vandalize V AE N D AH L AY Z
+vandalized V AE N D AH L AY Z D
+vandalizing V AE N D AH L AY Z IH NG
+vandall V AE N D AO L
+vandals V AE N D AH L Z
+vandam V AE N D AE M
+vandamme V AE N D AE M
+vande V AE N D
+vandeberg V AE N D AH B ER G
+vandecar V AE N D AH K AA R
+vandegrift V AE N D AH G R IH F T
+vandehei V AE N D AH HH AY
+vandehey V AE N D IH HH IY
+vandella V AE N D EH L AH
+vandellas V AE N D EH L AH Z
+vandeman V AE N D AH M AH N
+vandemark V AE N D AH M AA R K
+vanden V AE N D AH N
+vandenberg V AE N D AH N B ER G
+vandenbergh V AE N D AH N B ER G
+vandenberghe V AE N D AH N B ER G
+vandenboom V AE N D AH N B UW M
+vandenbos V AE N D AH N B OW Z
+vandenbosch V AE N D AH N B AO SH
+vandenbrink V AE N D AH N B R IH NG K
+vandenburg V AE N D AH N B ER G
+vandenburgh V AE N D AH N B ER G
+vandenheuvel V AE N D AH N HH OY V AH L
+vander V AE N D ER
+vanderbeck V AE N D ER B EH K
+vanderbeek V AE N D ER B IY K
+vanderberg V AE N D ER B ER G
+vanderbilt V AE N D ER B IH L T
+vanderburg V AE N D ER B ER G
+vanderbush V AE N D ER B UH SH
+vandercook V AE N D ER K UH K
+vanderford V AE N D ER F ER D
+vandergriff V AE N D ER G R IH F
+vandergrift V AE N D ER G R IH F T
+vandergrift's V AE N D ER G R IH F T S
+vanderheide V AE N D ER HH AY D
+vanderheiden V AE N D ER HH AY D AH N
+vanderheyden V AE N D ER HH EY D AH N
+vanderhoef V AE N D ER HH OW F
+vanderhoff V AE N D ER HH AO F
+vanderhoof V AE N D ER HH UH F
+vanderhorst V AE N D ER HH AO R S T
+vanderkolk V AE N D ER K OW K
+vanderkooi V AE N D ER K UW IY
+vanderlaan V AE N D ER L AA N
+vanderleest V AE N D ER AH L IY S T
+vanderlinde V AE N D ER L IH N D
+vanderlinden V AE N D ER L IH N D AH N
+vanderlip V AE N D ER L IH P
+vandermark V AE N D ER M AA R K
+vandermeer V AE N D ER M IH R
+vandermeulen V AE N D ER M OY L AH N
+vandermolen V AE N D ER M AA L AH N
+vanderploeg V AE N D ER P L OW G
+vanderpoel V AE N D ER P OW L
+vanderpol V AE N D ER P AO L
+vanderpool V AE N D ER P UW L
+vanderschaaf V AE N D ER SH AA F
+vanderslice V AE N D ER S L AY S
+vandersluis V AE N D ER S L UW IH S
+vandersluis(2) V AE N D ER S L UW S
+vanderveen V AE N D ER V IY N
+vanderveer V AE N D ER V IH R
+vandervelde V AE N D ER V EH L D
+vandervelden V AE N D ER V EH L D AH N
+vandervliet V AE N D ER V L IY T
+vandervoort V AE N D ER V UH R T
+vandervort V AE N D ER V AO R T
+vanderwal V AE N D ER W AA L
+vanderwall V AE N D ER W AA L
+vanderweele V AE N D ER W IY L
+vanderweide V AE N D ER W AY D
+vanderwerf V AE N D ER W ER F
+vanderwerff V AE N D ER W ER F
+vanderwilt V AE N D ER W IH L T
+vanderwoude V AE N D ER W AW D
+vanderzanden V AE N D ER Z AE N D AH N
+vanderzee V AE N D ER Z IY
+vandeusen V AE N D OY S AH N
+vandevander V AE N D AH V AE N D ER
+vandeveer V AE N D AH V IH R
+vandevelde V AE N D AH V EH L D
+vandeven V AE N D AH V AH N
+vandevender V AE N D AH V EH N D ER
+vandeventer V AE N D AH V AH N T ER
+vandever V AE N D IY V ER
+vandevoorde V AE N D AH V UH R D
+vandevoort V AE N D AH V UH R T
+vandewalker V AE N D AH W AO K ER
+vandewalle V AE N D UW EY L
+vandewater V AE N D AH W AO T ER
+vandezande V AE N D AH Z IH N D
+vandine V AE N D AY N
+vandiver V AE N D AY V ER
+vandivier V AE N D AY V IY ER
+vandoren V AE N D AO R AH N
+vandorn V AE N D AO R N
+vandriel V AE N D R IY L
+vandross V AE N D R AO S
+vandunk V AE N D AH NG K
+vandusen V AE N D UW S AH N
+vanduyn V AE N D AY N
+vanduyne V AE N D AY N
+vanduzer V AE N D UW Z ER
+vandyck V AE N D IH K
+vandyk V AE N D IH K
+vandyke V AE N D AY K
+vandyken V AE N D AY K AH N
+vandyne V AE N D AY N
+vane V EY N
+vaneaton V AE N AH T AA N
+vanecek V AE N EH S IH K
+vaneck V AA N EH K
+vanegas V AE N IY G AH Z
+vanek V AE N EH K
+vanella V AH N EH L AH
+vanengen V AE N EH NG AH N
+vanepps V AE N EH P S
+vanes V EY N Z
+vaness V AE N AH S
+vanessa V AH N EH S AH
+vanessen V AA N IH S AH N
+vanetten V AE N EH T AH N
+vanevery V AH N EH V R IY
+vanfleet V AE N F L IY T
+vanfossan V AE N F AA S AH N
+vanfossen V AE N F AA S AH N
+vang V AE NG
+vangel V EY NG G AH L
+vangelder V EY NG G IH L D ER
+vangie V AE NG IY
+vangieson V AE NG G IY Z AH N
+vangilder V AE NG G IH L D ER
+vangorden V AE NG G ER D AH N
+vangorder V AE NG G ER D ER
+vangorp V AE NG G ER P
+vanguard V AE N G AA R D
+vanguard's V AE N G AA R D Z
+vanguilder V AE N G AY L D ER
+vangundy V AH NG G AH N D IY
+vangy V AE N JH IY
+vanhall V AE N HH AO L
+vanhandel V AE N HH AE N D AH L
+vanhecke V AE N HH EH K
+vanheel V AE N HH IY L
+vanhise V AE N HH AY Z
+vanhoesen V AE N HH OW S AH N
+vanhook V AE N HH UH K
+vanhoose V AE N HH UW S
+vanhooser V AE N HH UW Z ER
+vanhoozer V AE N HH UW Z ER
+vanhorn V AE N HH AO R N
+vanhorne V AE N HH AO R N
+vanhousen V AE N HH AW S AH N
+vanhouten V AE N HH AA UW T AH N
+vanhove V AE N HH AH V
+vanhoy V AE N HH OY
+vanhuss V AE N HH AH S
+vanhyning V AE N HH AY N IH NG
+vania V AA N IY AH
+vanier V AE N IY ER
+vanik V AA N IH K
+vanilla V AH N IH L AH
+vanilli V AH N IH L IY
+vanillin V AH N IH L IH N
+vanish V AE N IH SH
+vanished V AE N IH SH T
+vanishes V AE N IH SH IH Z
+vanishing V AE N IH SH IH NG
+vanities V AE N AH T IY Z
+vanity V AE N AH T IY
+vanity(2) V AE N IH T IY
+vankampen V AE N K AE M P AH N
+vankeuren V AE NG K OY R AH N
+vankirk V AE NG K ER K
+vankleeck V AE NG K L IY K
+vankuren V AE NG K Y UW R AH N
+vanlandingham V AE N L AE N D IH NG HH AE M
+vanlanen V AE N L AE N AH N
+vanlaningham V AE N L AE N IH NG HH AE M
+vanleer V AE N L IH R
+vanleeuwen V AE N L UW AH N
+vanleuven V AE N L OY V AH N
+vanliere V AE N L IH R
+vanliew V AE N L IY UW
+vanloan V AE N L OW N
+vanloo V AE N L UW
+vanlue V AE N L UW
+vanluven V AE N L UW V AH N
+vanmaanen V AE N M AA N AH N
+vanmarter V AE N M AA R T ER
+vanmatre V AE N M EY T ER
+vanmeter V AE N M IY T ER
+vanmetre V AE N M IY T ER
+vann V AE N
+vanna V AE N AH
+vanname V AE N AH M
+vannater V AE N AE T ER
+vannatta V AA N AA T AH
+vannatter V AE N AE T ER
+vannatter's V AE N AE T ER Z
+vannelli V AA N EH L IY
+vanness V AE N IY S
+vannest V AE N IY S T
+vannguyen V AE N G IY AH N
+vannguyen(2) V AE N UW Y EH N
+vanni V AE N IY
+vannice V AE N IH S
+vannie V AE N IY
+vannorman V AE N AO R M AH N
+vannortwick V AH N AO R T W IH K
+vannostrand V AE N AA S T R AH N D
+vannote V AE N OW T
+vannoy V AE N OY
+vannucci V AA N UW CH IY
+vanny V AE N IY
+vano V AA N OW
+vanora V AE N ER AH
+vanorden V AE N AO R D AH N
+vanorder V AE N AO R D ER
+vanorman V AE N AO R M AH N
+vanornum V AE N AO R N AH M
+vanosdol V AE N AA S D AH L
+vanoss V AE N AA S
+vanostrand V AE N AA S T R AH N D
+vanous V AE N AH S
+vanover V AE N OW V ER
+vanpatten V AE N P AE T AH N
+vanpelt V AE N P EH L T
+vanputten V AE N P AH T AH N
+vanquish V AE NG K W IH SH
+vanquished V AE NG K W IH SH T
+vanriper V AE N R AY P ER
+vanroekel V AE N R OW K AH L
+vanrossum V AE N R AA S AH M
+vanryn V AE N R IH N
+vans V AE N Z
+vansandt V AE N S AE N T
+vansant V AA N S AH N T
+vanschaick V AE N SH AY K
+vanschoick V AE N SH OY K
+vansciver V AE N S K AY V ER
+vanscoy V AE N S K OY
+vanscoyoc V AE N S K OY AA K
+vanscyoc V AE N S IY AA K
+vanselow V AE N S IH L OW
+vansickel V AE N S IH K AH L
+vansickle V AE N S IH K AH L
+vanskike V AE N S K AY K
+vanskiver V AE N S K AY V ER
+vanslooten V AE N S L UW T AH N
+vanslyke V AE N S L AY K
+vanstone V AE N S T OW N
+vanstory V AE N S T AO R IY
+vanstraten V AE N S T R EY T AH N
+vansyckle V AE N S AY K AH L
+vantage V AE N T AH JH
+vantage's V AE N T IH JH IH Z
+vantage(2) V AE N T IH JH
+vantages V AE N T IH JH IH Z
+vantages(2) V AE N IH JH IH Z
+vantassel V AE N T AE S AH L
+vantassell V AE N T AE S AH L
+vantil V AA N T IY L
+vantilburg V AE N T IH L B ER G
+vantine V AA N T IY N IY
+vantol V AE N T AO L
+vantran V AE N T R AE N
+vantrease V AH N T R IY S
+vantreese V AE N T R IY S
+vantuyl V AE N T AY L
+vanuaaku V AE N W AH AA K UW
+vanuatu V AE N UW AA T UW
+vanunu V AH N UW N UW
+vanvalkenburg V AE N V AO K AH N B ER G
+vanvalkenburgh V AE N V AE L K IH N B ER G
+vanveen V AH N V IY N
+vanvlack V AE N V L AE K
+vanvleck V AE N V L EH K
+vanvleet V AE N V L IY T
+vanvliet V AE N V L IY T
+vanvooren V AE N V UH R AH N
+vanvoorhis V AE N V UH R HH IH S
+vanvoorst V AE N V UH R S T
+vanvorst V AE N V AO R S T
+vanvranken V AE N V R AE NG K AH N
+vanwagenen V AE N W AE G AH N AH N
+vanwagner V AE N W AE G N ER
+vanwagoner V AE N W AE G AH N ER
+vanwart V AE N W AO R T
+vanwert V AE N W ER T
+vanwey V AE N W IY
+vanwhy V AE N W IY
+vanwie V AE N W IY
+vanwieren V AE N W IH R AH N
+vanwinkle V AE N W IH NG K AH L
+vanwormer V AE N W ER M ER
+vanwyck V AE N W IH K
+vanwyhe V AE N W AY HH
+vanwyk V AE N W IH K
+vanya V AA N Y AH
+vanya's V AA N Y AH Z
+vanyo V AA N Y OW
+vanzandt V AE N Z AE N T
+vanzant V AA N Z AH N T
+vanzanten V AE N Z AE N T AH N
+vanzee V AA N Z IY
+vanzile V AA N Z AY L
+vapid V AE P IH D
+vapor V EY P ER
+vaporization V EY P ER AH Z EY SH AH N
+vaporize V EY P ER AY Z
+vaporized V EY P ER AY Z D
+vapors V EY P ER Z
+vaporware V EY P ER W EH R
+vaquera V AA K W EH R AH
+vara V AA R AH
+varady V ER AA D IY
+varani V ER AA N IY
+varano V AA R AA N OW
+varble V AA R B AH L
+varco V AA R K OW
+vardeman V AA R D M AH N
+varden V AA R D AH N
+vardon V AA R D AO N
+varela V AA R EY L AH
+vares V AA R EH S
+vares(2) V EY R Z
+varga V AA R G AH
+vargas V AA R G AH S
+vargason V AA R G AH S AH N
+varghese V AA R G HH IY Z
+vargo V AA R G OW
+vari V AA R IY
+variability V EH R IY AH B IH L IH T IY
+variable V EH R IY AH B AH L
+variables V EH R IY AH B AH L Z
+variably V EH R IY AH B L IY
+varian V EH R IY AH N
+variance V EH R IY AH N S
+variances V EH R IY AH N S IH Z
+variant V EH R IY AH N T
+variants V EH R IY AH N T S
+variation V EH R IY EY SH AH N
+variations V EH R IY EY SH AH N Z
+varick V EH R IH K
+varied V EH R IY D
+variegate V EH R IH G EY T
+variegated V EH R IH G EY T AH D
+varies V EH R IY Z
+varietal V ER IY T AH L
+varietals V ER AY AH T AH L Z
+varieties V ER AY AH T IY Z
+variety V ER AY AH T IY
+varig V EH R IH G
+varin V AA R IY N
+varina V AA R IY N AH
+various V EH R IY AH S
+variously V EH R IY AH S L IY
+varisco V AA R IY S K OW
+varitronic V EH R IH T R AA N IH K
+varity V EH R IH T IY
+varity's V EH R IH T IY Z
+varityper V EH R IH T AY P ER
+varlam V AA R L AE M
+varlen V AA R L AH N
+varley V AA R L IY
+varma V AA R M AH
+varmint V AA R M IH N T
+varmus V AA R M AH S
+varn V AA R N
+varnado V AA R N AA D OW
+varnadoe V AA R N AA D OW
+varnadore V AA R N AA D AO R EY
+varnell V AA R N AH L
+varner V AA R N ER
+varnes V AA R N Z
+varney V AA R N IY
+varni V AA R N IY
+varnish V AA R N IH SH
+varnished V AA R N IH SH T
+varnishes V AA R N IH SH AH Z
+varnishes(2) V AA R N IH SH IH Z
+varnon V AA R N AO N
+varnum V AA R N AH M
+varo V EH R OW
+varo(2) V AA R OW
+varon V AA R AO N
+varona V AA R OW N AH
+varone V ER OW N
+varricchio V AA R IY K IY OW
+varrone V AA R OW N EY
+vars V AA R Z
+varsity V AA R S IH T IY
+vartanian V AA R T EY N IY AH N
+varvaro V AA R V AA R OW
+varvel V AA R V EH L
+varves V AA R V Z
+vary V EH R IY
+varying V EH R IY IH NG
+varzi V AA R Z IY
+vasbinder V AE S B IH N D ER
+vasbinder(2) V AE S B AY N D ER
+vasco V AE S K OW
+vasconcellos V AE S K AH N S EH L OW Z
+vasconcelos V AA S K OW N S EY L OW Z
+vascular V AE S K Y AH L ER
+vase V EY S
+vase(2) V AA Z
+vasectomies V AE Z EH K T AH M IY Z
+vasectomies(2) V AE S EH K T AH M IY Z
+vasectomy V AE Z EH K T AH M IY
+vasectomy(2) V AE S EH K T AH M IY
+vasek V AA S EH K
+vaseline V AE S AH L IY N
+vases V EY S AH Z
+vases(2) V AA Z IH Z
+vasey V AE S IY
+vashinsky V AH SH IH N S K IY
+vashti V AE SH T IY
+vasicek V AA S IH CH EH K
+vasil V AA S IY L
+vasile V AA S AH L
+vasily V AE S AH L IY
+vaske V EY S K
+vaskevitch V AE S K AH V IH CH
+vasko V AA S K OW
+vaslev V AA S L IH V
+vaslov V AE S L AA V
+vaslov's V AE S L AA V Z
+vasotec V EY Z OW T EH K
+vasques V AA S K W EH S
+vasquez V AE S K EH Z
+vass V AE S
+vassal V AE S AH L
+vassallo V AA S AA L OW
+vassals V AE S AH L Z
+vassar V AE S ER
+vassel V AE S AH L
+vasser V AE S ER
+vasseur V AE S ER
+vassey V AE S IY
+vassilios V AH S IH L Y AH S
+vassiliou V AE S IH L IY UW
+vassily V AH S IH L IY
+vast V AE S T
+vasta V AE S T AH
+vastine V AA S T IY N IY
+vastly V AE S T L IY
+vastness V AE S T N AH S
+vastola V AA S T OW L AH
+vat V AE T
+vater V EY T ER
+vath V AE TH
+vatican V AE T IH K AH N
+vatican's V AE T IH K AH N Z
+vats V AE T S
+vatted V AE T IH D
+vatter V AE T ER
+vaudeville V AA D V IH L
+vaudevillian V AA D V IH L Y AH N
+vaugh V AO
+vaughan V AO N
+vaughan's V AO N Z
+vaughn V AO N
+vaughn's V AO N Z
+vaughns V AO N Z
+vaught V AO T
+vault V AO L T
+vaulted V AO L T AH D
+vaulted(2) V AO L T IH D
+vaulting V AO L T IH NG
+vaults V AO L T S
+vaunted V AO N T IH D
+vaupel V AW P EH L
+vause V AO S
+vaux V AO K S
+vauxhall V AA K S HH AO L
+vavra V AE V R AH
+vavrek V AA V R EH K
+vawter V AO T ER
+vax V AE K S
+vaxes V AE K S IH Z
+vaxstation V AE K S T EY SH AH N
+vayda V EY D AH
+vaz V AE Z
+vazquez V AE S K EH Z
+ve V IY
+ve(2) V IY IY
+veach V IY CH
+veal V IY L
+veale V IY L
+veals V IY L Z
+veasey V IY Z IY
+veasley V IY Z L IY
+veatch V IY CH
+veazey V IY Z IY
+veazie V IY Z IY
+veba V IY B AH
+vecchiarelli V EH K IY AA R EH L IY
+vecchio V EH K IY OW
+vecchione V EH K IY OW N IY
+vecci V EH CH IY
+vecellio V EH CH EH L IY OW
+vector V EH K T ER
+vectors V EH K T ER Z
+vectra V EH K T R ER
+veda V EY D AH
+vedder V EH D ER
+vedette V IH D EH T
+vedis V EY D IH S
+vedula V EH D UW L AH
+vee V IY
+veech V IY CH
+veeco V IY K OW
+veeder V IY D ER
+veegenan V IY G AH N AH N
+veen V IY N
+veenstra V IY N S T R AH
+veep V IY P
+veer V IH R
+veered V IH R D
+veering V IH R IH NG
+veers V IH R Z
+vees V IY Z
+vega V EY G AH
+vegan V EH G AH N
+vegans V EH G AH N Z
+vegas V EY G AH S
+vegemite V EH JH AH M AY T
+vegesna V EH G EH S N AH
+vegetable V EH JH T AH B AH L
+vegetables V EH JH T AH B AH L Z
+vegetal V EH JH AH T AH L
+vegetarian V EH JH AH T EH R IY AH N
+vegetarianism V EH JH AH T EH R IY AH N IH Z AH M
+vegetarians V EH JH AH T EH R IY AH N Z
+vegetate V EH JH AH T EY T
+vegetation V EH JH AH T EY SH AH N
+vegetative V EH JH AH T EY T IH V
+veggie V EH JH IY
+veggies V EH JH IY Z
+vegh V EH G
+vegisnax V AH G IH S N AE K S
+vehemence V IY AH M AH N S
+vehemence(2) V AH HH IY M AH N S
+vehement V IY AH M AH N T
+vehement(2) V AH HH IY M AH N T
+vehemently V IY AH M AH N T L IY
+vehemently(2) V AH HH IY M AH N T L IY
+vehicle V IY HH IH K AH L
+vehicle's V IY HH IH K AH L Z
+vehicle(2) V IY IH K AH L
+vehicles V IY HH IH K AH L Z
+vehicles' V EH HH IH K AH L Z
+vehicles(2) V IY IH K AH L Z
+vehicular V IY HH IH K Y AH L ER
+veiga V EY G AH
+veigel V AY G AH L
+veil V EY L
+veiled V EY L D
+veiling V EY L IH NG
+veillette V AH L EH T
+veilleux V AH L OW
+veilleux(2) V EY L OW
+veillon V EY L AH N
+veils V EY L Z
+vein V EY N
+veins V EY N Z
+veira V EY R AH
+veit V IY T
+veitch V AY CH
+veith V IY TH
+vela V EH L AH
+velagrande V EH L AH G R AA N D EY
+velagrande's V EH L AH G R AA N D EY Z
+velarde V EH L AA R D IY
+velardi V EH L AA R D IY
+velardo V EY L AA R D OW
+velasco V EH L AA S K OW
+velasquez V EH L AE S K EH Z
+velayati V EH L AY AA T IY
+velazco V AH L AE S K OW
+velazquez V EH L AE S K EH Z
+velcro V EH L K R OW
+velda V EH L D AH
+veldhuizen V EH L D HH IH Z AH N
+veldman V EH L D M AH N
+veley V EH L IY
+velez V EH L EH Z
+velie V EH L IY
+velika V EH L IH K AH
+veliotis V EH L IY OW T IH S
+veliz V EH L IH Z
+vella V EH L AH
+vellucci V EH L UW CH IY
+velma V EH L M AH
+velo V EH L OW
+velobind V EH L AH B IH N D
+velobind(2) V EH L OW B AY N D
+velociraptor V AH L AO S AH R AE P T ER
+velocities V AH L AA S AH T IY Z
+velocity V AH L AA S AH T IY
+veloso V EH L OW S OW
+velotta V EH L OW T AH
+veloz V EY L OW Z
+velsicol V EH L S IH K AA L
+velte V EH L T
+velten V EH L T AH N
+veltman V EH L T M AH N
+veltre V EH L T ER
+veltri V EH L T R IY
+velveeta V EH L V IY T AH
+velvet V EH L V AH T
+velvety V EH L V AH T IY
+vemich V EH M IH CH
+vempala V EH M P AA L AH
+vena V IY N AH
+venable V EH N AH B AH L
+venables V EH N AH B AH L Z
+venacuro V EH N AH K Y UH R OW
+venal V IY N AH L
+venality V IH N AE L IH T IY
+venalum V EH N AH L AH M
+venango V EH N AE NG G OW
+venard V EH N ER D
+vencill V EH N S IH L
+vencor V EH N K AO R
+vendee V EH N D IY
+vendela V EH N D EH L AH
+vendetta V EH N D EH T AH
+vendettas V EH N D EH T AH Z
+vendetti V EH N D EH T IY
+vending V EH N D IH NG
+venditti V EH N D IY T IY
+vendo V EH N D OW
+vendome V EH N D OW M
+vendome(2) V AA N D OW M
+vendor V EH N D ER
+vendor's V EH N D ER Z
+vendors V EH N D ER Z
+vendors' V EH N D ER Z
+veneer V AH N IH R
+veneers V AH N IH R Z
+venegas V EH N IH G AH Z
+venema V EH N IH M AH
+venerable V EH N ER AH B AH L
+venerate V EH N ER EY T
+venerated V EH N ER EY T IH D
+venerates V EH N ER EY T S
+venerating V EH N ER EY T IH NG
+veneration V EH N ER EY SH AH N
+venereal V AH N IH R IY AH L
+venetian V AH N IY SH AH N
+veney V EH N IY
+venezia V EH N EH Z IY AH
+veneziano V EH N EH Z IY AA N OW
+venezuela V EH N IH Z W EY L AH
+venezuela's V EH N IH Z W EY L AH Z
+venezuelan V EH N IH Z W EY L AH N
+venezuelans V EH N IH Z W EY L AH N Z
+vengeance V EH N JH AH N S
+vengeful V EH N JH F AH L
+venice V EH N AH S
+venice's V EH N IH S IH Z
+venice(2) V EH N IH S
+venier V IY N IY ER
+venison V EH N AH S AH N
+venita V EH N IY T AH
+venkatesh V EH N K AA T EH SH
+venn V EH N
+vennard V EH N ER D
+venne V EH N
+venneman V EH N M AH N
+venner V EH N ER
+vennick V EH N IH K
+venning V EH N IH NG
+veno V EY N OW
+venom V EH N AH M
+venomous V EH N AH M AH S
+venous V IY N AH S
+vensel V EH N S AH L
+venson V EH N S AH N
+vent V EH N T
+ventech V EH N T EH K
+vented V EH N T IH D
+venter V EH N T ER
+venters V EH N T ER Z
+venti V EH N T IY
+ventilate V EH N T AH L EY T
+ventilate(2) V EH N AH L EY T
+ventilated V EH N T AH L EY T IH D
+ventilated(2) V EH N AH L EY T IH D
+ventilating V EH N T AH L EY T IH NG
+ventilating(2) V EH N AH L EY T IH NG
+ventilation V EH N T AH L EY SH AH N
+ventilation(2) V EH N AH L EY SH AH N
+ventilator V EH N T AH L EY T ER
+ventilator(2) V EH N AH L EY T ER
+ventimiglia V EH N T IH M IH G L IY AH
+venting V EH N T IH NG
+ventner V EH N T N ER
+vento V EH N T OW
+ventola V EH N T OW L AH
+ventral V EH N T R AH L
+ventre V EH N T ER
+ventrella V EH N T R EH L AH
+ventres V EH N T ER Z
+ventresca V EH N T R EH S K AH
+ventress V EH N T R IH S
+ventricular V EH N T R IH K Y UW L ER
+ventritex V EH N T R IH T EH K S
+vents V EH N T S
+ventura V EH N CH ER AH
+ventura(2) V EH N T UH R AH
+venture V EH N CH ER
+venture's V EH N CH ER Z
+ventured V EH N CH ER D
+venturella V EH N T UH R EH L AH
+ventures V EH N CH ER Z
+ventures' V EH N CH ER Z
+venturesome V EH N CH ER S AH M
+venturi V EH N T UH R IY
+venturian V EH N T UH R IY AH N
+venturing V EH N CH ER IH NG
+venturini V EH N T UH R IY N IY
+venturino V EH N T UH R IY N OW
+venue V EH N Y UW
+venues V EH N UW Z
+venus V IY N AH S
+venuti V EH N UW T IY
+venuto V EH N UW T OW
+venzke V EH N Z K
+ver V ER
+vera V EH R AH
+veracity V ER AE S IH T IY
+veranda V ER AE N D AH
+verandas V ER AE N D AH Z
+veras V EH R AH Z
+verb V ER B
+verba V EH R B AH
+verbal V ER B AH L
+verbalize V ER B AH L AY Z
+verbalizing V ER B AH L AY Z IH NG
+verbally V ER B AE L IY
+verbatim V ER B EY T AH M
+verbeck V ER B EH K
+verbeek V ER B IY K
+verbeke V ER B IH K
+verbena V ER B IY N AH
+verbiage V ER B IY IH JH
+verble V ER B AH L
+verboon V ER B UW N
+verboons V ER B UW N Z
+verboten V ER B OW T AH N
+verbrugge V ER B R AH G
+verbs V ER B Z
+verburg V ER B ER G
+vercammen V ER K AE M AH N
+vercher V ER K ER
+verda V EH R D AH
+verdant V ER D AH N T
+verde V ER D IY
+verderame V ER D ER AH M
+verderber V ER D ER B ER
+verderosa V ER D ER OW S AH
+verdes V ER D IY
+verdi V EH R D IY
+verdi's V ER D IY Z
+verdict V ER D IH K T
+verdicts V ER D IH K T S
+verdier V ER D IY ER
+verdin V ER D IH N
+verdinsgang V ER D IH N S G AE NG
+verdon V EH R D AO N
+verdon(2) V ER D AH N
+verdone V EH R D OW N EY
+verdugo V ER D UW G OW
+verduin V EH R D UW IH N
+verdun V ER D AH N
+verduzco V ER D UW Z K OW
+vere V IH R
+vereb V EH R IH B
+vereen V IH R IY N
+vereinsbank V ER AY N Z B AE NG K
+verena V ER EY N AH
+verene V EH R IY N
+veres V IY R Z
+verex V EH R AH K S
+verga V EH R G AH
+vergara V ER G AA R AH
+verge V ER JH
+verges V ER JH IH Z
+verges's V ER JH IH Z IH Z
+verges's(2) V ER JH IY Z IH Z
+verges(2) V ER JH IY Z
+vergesh V ER G EH SH
+vergesh's V ER G EH SH IH S
+vergil V ER JH AH L
+verging V ER JH IH NG
+vergresh V ER G R EH SH
+vergresh's V ER G R EH SH IH S
+verhage V ER HH IH JH
+verhagen V ER HH AH G AH N
+verhey V ER HH IY
+verhoef V ER HH OW F
+verhoeven V ER HH OW V AH N
+verhoff V ER HH AO F
+verhofstadt V ER HH AO F S T AE T
+verhulst V ER HH AH L S T
+veribanc V EH R IH B AE NG K
+verifiable V EH R AH F AY AH B AH L
+verification V EH R AH F AH K EY SH AH N
+verified V EH R AH F AY D
+verifies V EH R AH F AY Z
+verify V EH R AH F AY
+verifying V EH R AH F AY IH NG
+verina V ER IY N AH
+verine V ER IY N IY
+verisimilitude V EH R AH S AH M IH L AH T UW D
+verit V EH R IH T
+veritable V EH R IH T AH B AH L
+veritably V EH R IH T AH B L IY
+verities V EH R AH T IY Z
+verity V EH R AH T IY
+verity's V EH R AH T IY Z
+verity(2) V EH R IH T IY
+verkuilen V ER K AH L AH N
+verla V EH R L AH
+verlag V ER L AE G
+verleger V ER L AH G ER
+verley V ER L IY
+verma V EH R M AH
+vermeer V ER M IH R
+vermette V ER M EH T
+vermeulen V ER M OY L AH N
+vermilion V ER M IH L Y AH N
+vermillion V ER M IH L Y AH N
+vermilya V ER M IY L Y AH
+vermilyea V ER M IY L Y AH
+vermin V ER M IH N
+vermont V ER M AA N T
+vermont's V ER M AA N T S
+vermonter V ER M AA N T ER
+vermonters V ER M AA N T ER Z
+vermouth V ER M UW TH
+vern V ER N
+verna V ER N AH
+vernacular V ER N AE K Y AH L ER
+vernal V ER N AH L
+verne V ER N
+verner V ER N ER
+vernes V ER N Z
+verneta V ER N EH T AH
+verney V ER N IY
+vernick V ER N IH K
+vernier V ER N IY ER
+vernis V ER N IH S
+vernita V ER N IY T AH
+vernitron V ER N IH T R AA N
+verno V EH R N OW
+vernon V ER N AH N
+vernon's V ER N AH N Z
+vernonia V ER N OW N IY AH
+vernor V ER N ER
+vero V EH R OW
+veroa V ER OW AH
+veron V EH R AH N
+verona V ER OW N AH
+veronda V EH R AA N D AH
+veronica V ER AA N IH K AH
+veronique V EH R AA N IY K
+veronis V EH R OW N IH S
+verrall V EH R AH L
+verrastro V EH R AE S T R OW
+verrell V EH R EY L
+verret V EH R EY T
+verrett V EH R IH T
+verrette V ER EH T
+verri V EH R IY
+verrier V EH R IY ER
+verrill V EH R IY L
+verrilli V ER IY L IY
+verry V EH R IY
+vers V ER S
+versa V ER S AH
+versace V ER S AA CH EY
+versace's V ER S AA CH EY Z
+versace's(2) V ER S AA CH IY Z
+versace(2) V ER S AA CH IY
+versailles V EH R S AY
+versailles(2) V EH R S EY L Z
+versatile V ER S AH T AH L
+versatile(2) V ER S AH T AY L
+versatility V ER S AH T IH L AH T IY
+verse V ER S
+versed V ER S T
+verser V ER S ER
+verses V ER S AH Z
+verses(2) V ER S IH Z
+versicherung V ER S IH CH ER AH NG
+versicherungs V ER S IH CH ER AH NG Z
+version V ER ZH AH N
+versions V ER ZH AH N Z
+versluis V ER S L UW IH Z
+versteeg V ER S T IY G
+verstraete V ER S T R EH T
+versus V ER S AH S
+versus(2) V ER S AH Z
+vert V ER T
+vertebra V ER T AH B R AH
+vertebrae V ER T AH B R EY
+vertebral V ER T AH B R AH L
+vertebrate V ER T AH B R EY T
+vertebrates V ER T AH B R EY T S
+vertel V ER T EH L
+vertel's V ER T EH L Z
+vertex V ER T EH K S
+vertibrak V ER T AH B R AE K
+vertical V ER T IH K AH L
+vertically V ER T IH K L IY
+verticom V ER T IH K AA M
+vertigo V ER T IH G OW
+vertol V ER T AA L
+vertrees V ER T R IY Z
+vertucci V ER T UW CH IY
+vertz V ER T S
+verve V ER V
+verville V ER V IH L
+verwey V ER W IY
+verwoerd V ER W AO R D
+very V EH R IY
+vescinoid V EH S IH N OY D
+vescio V EH S IY OW
+vesco V EH S K OW
+vesel V EH S AH L
+veselka V EY S EY L K AH
+vesely V IY Z L IY
+vesey V EH S IY
+vesicle V EH Z IH K AH L
+vesicles V EH Z IH K AH L Z
+vesmen V EH S M AH N
+vesna V EH S N AH
+vespa V EY S P AH
+vesper V EH S P ER
+vespera V EY S P EH R AH
+vess V EH S
+vessel V EH S AH L
+vessel's V EH S AH L Z
+vessell V EH S AH L
+vessels V EH S AH L Z
+vessels's V EH S AH L Z IH Z
+vesser V EH S ER
+vessey V EH S IY
+vest V EH S T
+vesta V EH S T AH
+vestal V EH S T AH L
+vestar V EH S T ER
+vested V EH S T AH D
+vested(2) V EH S T IH D
+vester V EH S T ER
+vestibule V EH S T IH B Y UW L
+vestige V EH S T IH JH
+vestiges V EH S T IH JH IH Z
+vestigial V AH S T IH JH IY AH L
+vesting V EH S T IH NG
+vestron V EH S T R AH N
+vestron's V EH S T R AH N Z
+vests V EH S T S
+vesuvius V AH S UW V IY AH S
+vet V EH T
+veta V EH T AH
+vetco V EH T K OW
+veteran V EH T ER AH N
+veteran's V EH T ER AH N Z
+veteran(2) V EH T R AH N
+veterans V EH T ER AH N Z
+veterans' V EH T ER AH N Z
+veterans'(2) V EH T R AH N Z
+veterans(2) V EH T R AH N Z
+vetere V EH T ER
+veterinarian V EH T R AH N EH R IY AH N
+veterinarian(2) V EH T ER AH N EH R IY AH N
+veterinarians V EH T R AH N EH R IY AH N Z
+veterinarians(2) V EH T ER AH N EH R IY AH N Z
+veterinary V EH T R AH N EH R IY
+veteto V EH T EH T OW
+veto V IY T OW
+vetoed V IY T OW D
+vetoes V IY T OW Z
+vetoing V IY T OW IH NG
+vetos V IY T OW Z
+vetrano V EH T R AA N OW
+vets V EH T S
+vetsch V EH CH
+vette V EH T
+vetted V EH T IH D
+vetter V EH T ER
+vetting V EH T IH NG
+veuve V Y UW V
+vevay V EH V EY
+veverka V EY V EH R K AH
+vevey V EH V IY
+vevila V EY V IY L AH
+vex V EH K S
+vexatious V EH K S EY SH AH S
+vexed V EH K S T
+vexing V EH K S IH NG
+vey V EY
+veyne V EY N
+vezina V EH Z IY N AH
+vi V AY
+vi(2) V IY
+vi(3) V IY AY
+via V AY AH
+via(2) V IY AH
+viability V AY AH B IH L AH T IY
+viable V AY AH B AH L
+viacom V AY AH K AA M
+viacom's V AY AH K AA M Z
+viaduct V AY AH D AH K T
+viaducts V AY AH D AH K T S
+viag V AY AE G
+viag's V AY AE G Z
+viagene V AY AH JH IY N
+viagra V IY AE G R AH
+vial V AY AH L
+viall V AY AH L
+vialpando V IY AA L P AA N D OW
+vials V AY AH L Z
+vian V IY AH N
+viana V IY AE N AH
+viani V IY AA N IY
+viano V IY AA N OW
+viansa V IY AA N S AH
+viar V AY ER
+viars V AY ER Z
+viatical V AY AE T IH K AH L
+viator V AY EY T ER
+viau V IY OW
+vibbert V IH B ER T
+vibe V AY B
+vibes V AY B Z
+vibhu V IY B UW
+vibrancy V AY B R AH N S IY
+vibrant V AY B R AH N T
+vibrate V AY B R EY T
+vibrates V AY B R EY T S
+vibrating V AY B R EY T IH NG
+vibration V AY B R EY SH AH N
+vibrations V AY B R EY SH AH N Z
+vibrato V IY B R AA T OW
+vibrator V AY B R EY T ER
+vic V IH K
+vic's V IH K S
+vicar V IH K ER
+vicari V IY K AA R IY
+vicario V IY K AA R IY OW
+vicarious V AY K EH R IY AH S
+vicariously V AY K EH R IY AH S L IY
+vicars V IH K ER Z
+vicary V IH K ER IY
+vice V AY S
+vice-president V AY S P R EH Z AH D AH N T
+vice-presidential V AY S P R EH Z AH D EH N CH AH L
+vice-presidential(2) V AY S P R EH Z AH D EH N SH AH L
+vice-presidents V AY S P R EH Z AH D AH N T S
+vicencio V IH S EH N S IY OW
+vicente V IY CH EH N T IY
+vicenzi V IH S EH N Z IY
+viceroy V AY S R OY
+vices V AY S AH Z
+vices(2) V AY S IH Z
+vichy V IY SH IY
+vicinity V AH S IH N AH T IY
+vicinity(2) V IH S IH N IH T IY
+vicino V IY CH IY N OW
+vicious V IH SH AH S
+viciously V IH SH AH S L IY
+viciousness V IH SH AH S N IH S
+vicissitude V IH S IH S IH T UW D
+vicissitudes V IH S IH S IH T UW D Z
+vick V IH K
+vicker V IH K ER
+vickerman V IH K ER M AH N
+vickers V IH K ER Z
+vickery V IH S K ER IY
+vickery(2) V IH K ER IY
+vickey V IH K IY
+vicki V IH K IY
+vickie V IH K IY
+vickland V IH K L AH N D
+vicknair V IH K N ER
+vickrey V IH K R IY
+vickroy V IH K R OY
+vicks V IH K S
+vicksburg V IH K S B ER G
+vicky V IH K IY
+vicky's V IH K IY Z
+vicomte V IH K AA M T IY
+vicomte(2) V IH K AA M T
+vicon V IH K AH N
+vicon's V IH K AH N Z
+vicorp V AY K AO R P
+victim V IH K T AH M
+victim's V IH K T AH M Z
+victim's(2) V IH K T IH M Z
+victim(2) V IH K T IH M
+victimhood V IH K T AH M HH UH D
+victimization V IH K T AH M AH Z EY SH AH N
+victimize V IH K T AH M AY Z
+victimized V IH K T AH M AY Z D
+victimizing V IH K T AH M AY Z IH NG
+victimless V IH K T AH M L AH S
+victims V IH K T AH M Z
+victims' V IH K T IH M Z
+victims(2) V IH K T IH M Z
+victoire V IH K T W AA R
+victor V IH K T ER
+victor's V IH K T ER Z
+victoria V IH K T AO R IY AH
+victoria's V IH K T AO R IY AH Z
+victorian V IH K T AO R IY AH N
+victorians V IH K T AO R IY AH N Z
+victorias V IH K T AO R IY AH Z
+victories V IH K T ER IY Z
+victories(2) V IH K T R IY Z
+victorine V IY K T AO R IY N IY
+victorino V IY K T AO R IY N OW
+victorious V IH K T AO R IY AH S
+victors V IH K T ER Z
+victory V IH K T ER IY
+victory(2) V IH K T R IY
+vicuna V IH K Y UW N AH
+vida V AY D AH
+vidal V AY D AE L
+vidales V IY D AA L EH S
+vidalia V IH D EY L Y AH
+vidalia(2) V AY D EY L Y AH
+vidartes V IH D AA R T EH S
+vidaurri V IH D AO R IY
+vide V AY D
+video V IH D IY OW
+video's V IH D IY OW Z
+videocassette V IH D IY OW K AE S EH T
+videocassettes V IH D IY OW K AE S EH T S
+videoconference V IY D IY OW K AA N F R AH N S
+videoconferencing V IY D IY OW K AA N F R AH N S IH NG
+videodisk V IH D IY OW D IH S K
+videodisks V IH D IY OW D IH S K S
+videogame V IH D IY OW G EY M
+videographer V IH D IY AO G R AH F ER
+videophone V IH D IY OW F OW N
+videos V IH D IY OW Z
+videotape V IH D IY OW T EY P
+videotaped V IH D IY OW T EY P T
+videotapes V IH D IY OW T EY P S
+videotaping V IH D IY OW T EY P IH NG
+videotex V IH D IY OW T EH K S
+videotext V IH D IY OW T EH K S T
+videotron V IH D IY OW T R AA N
+vidigo V IH D IY G OW
+vidmar V IH D M ER
+vidonia V IY D OW N IY AH
+vidor V IY D AO R
+vidor(2) V IH D AO R
+vidrine V IY D R IY N
+vie V AY
+vieau V IY OW
+viebrock V IY B R AH K
+vied V AY D
+viedma V IY D M AH
+viegas V IY G AH Z
+vieira V IY EH R AH
+viejo V IY EH JH OW
+viel V IY L
+viele V IY L
+vielma V IY L M AH
+vien V IY N
+vienna V IY EH N AH
+vienna's V IY EH N AH Z
+vienneau V AH N OW
+viennese V IY EH N IY S
+vienot V IY N AA T
+viens V IY N Z
+viera V IY R AH
+viereck V IH R IH K
+vierling V IH R L IH NG
+vierra V IH R AH
+viers V IH R Z
+viertel V IH R T EH L
+viertel's V IH R T EH L Z
+viertels V IH R T EH L Z
+vies V AY Z
+viet V IY EH T
+vietcong V IY EH T K AO NG
+vietcong(2) V Y EH T K AO NG
+vieth V AY IH TH
+vietnam V IY EH T N AA M
+vietnam's V IY EH T N AA M Z
+vietnamese V IY EH T N AA M IY S
+vietor V IY T ER
+viets V IY T S
+vietti V IY EH T IY
+view V Y UW
+viewed V Y UW D
+viewer V Y UW ER
+viewer's V Y UW ER Z
+viewers V Y UW ER Z
+viewers' V Y UW ER Z
+viewership V Y UW ER SH IH P
+viewfinder V Y UW F AY N D ER
+viewing V Y UW IH NG
+viewpoint V Y UW P OY N T
+viewpoints V Y UW P OY N T S
+views V Y UW Z
+vieyra V IY EH R AH
+vig V IH G
+vigdor V IH G D ER
+vigeant V IH JH AH N T
+vigeland V AY G L AH N D
+vigeland's V AY G L AH N D Z
+vigen V IH G AH N
+viger V AY G ER
+viger(2) V IH G ER
+viggiano V IH JH IY AA N OW
+vigil V IH JH AH L
+vigilance V IH JH AH L AH N S
+vigilant V IH JH AH L AH N T
+vigilante V IH JH AH L AE N T IY
+vigilantes V IH JH AH L AE N T IY Z
+vigilantism V IH JH AH L AE N T IH Z AH M
+vigilia V IY JH IY L IY AH
+vigils V IH JH AH L Z
+viglione V IH G L IY OW N IY
+vigliotti V IH G L IY AO T IY
+viglund V IH G L AH N D
+viglund's V IH G L AH N D Z
+vigna V IH G N AH
+vigneau V IH G N OW
+vigneault V IH G N OW
+vignette V IH N Y EH T
+vignette(2) V IY N Y EH T
+vignettes V IH N Y EH T S
+vignola V IY G N OW L AH
+vigo V IY G OW
+vigor V IH G ER
+vigorito V IY G AO R IY T OW
+vigorous V IH G ER AH S
+vigorously V IH G ER AH S L IY
+vigue V IY G
+viguerie V IH G ER IY
+viguerie(2) V IY G EH R IY
+vigus V AY G AH S
+vik V IH K
+vike V AY K
+vikes V AY K S
+viking V AY K IH NG
+viking's V AY K IH NG Z
+vikings V AY K IH NG Z
+viktor V IH K T ER
+vila V IY L AH
+vilardo V IY L AA R D OW
+vilas V IY L AA Z
+vile V AY L
+viles V AY L Z
+vilhauer V IH L HH AW ER
+vilification V IH L AH F AH K EY SH AH N
+vilified V IH L AH F AY D
+vilify V IH L IH F AY
+villa V IH L AH
+villa's V IH L AH Z
+villafana V IY L AA F AE N AH
+villafane V IY L AA F AA N EY
+villafranca V IH L AH F R AE NG K AH
+villafuerte V IY L AA F W EH R T EY
+village V IH L AH JH
+village's V IH L IH JH IH Z
+village(2) V IH L IH JH
+villager V IH L IH JH ER
+villagers V IH L IH JH ER Z
+villages V IH L AH JH AH Z
+villages(2) V IH L IH JH IH Z
+villagomez V IY L AA G OW M EH Z
+villagran V IY L AA G R AA N
+villagrana V IY L AA G R AE N AH
+villain V IH L AH N
+villainous V IH L AH N AH S
+villains V IH L AH N Z
+villalba V IY L AA L B AH
+villalobos V IY L AA L OW B OW Z
+villalon V IY L AA L AO N
+villalovos V IY L AA L OW V OW Z
+villalpando V IY L AA L P AA N D OW
+villalva V IY L AA L V AH
+villamil V IY L AA M IY L
+villani V IY L AA N IY
+villano V IY L AA N OW
+villanova V IH L AH N OW V AH
+villanovan V IH L AH N OW V AH N
+villanueva V IY L AA N W EH V AH
+villar V IH L ER
+villard V IH L ER D
+villareal V IH L ER IY AA L
+villari V IY L AA R IY
+villarreal V IY L AA R IY L
+villars V IH L ER Z
+villas V IH L AH Z
+villasana V IY L AA S AE N AH
+villasenor V IY L AA S EY AH N AO R
+villaverde V IY L AA V EH R D IY
+villavicencio V IH L AH V IH S EH N S IY OW
+ville V IH L
+ville's V IH L Z
+villegas V IH L IH G AH Z
+villela V IH L IH L AH
+villella V IY L EH L AH
+villeneuve V IH L IH N UW V
+villeneuve(2) V IH L N UW V
+villers V IH L ER Z
+villette V IH L EH T
+villi V IH L IY
+villiers V IH L Y ER Z
+villines V IH L AY N Z
+villwock V IH L W AH K
+vilma V IH L M AH
+vilnius V IH L N IY AH S
+viloria V IY L AO R IY AH
+vim V IH M
+vin V IH N
+vina V IY N AH
+vinal V AY N AH L
+vinca V IH NG K AH
+vince V IH N S
+vince's V IH N S IH S
+vincelette V IH N S IH L EH T
+vincennes V IH N S EH N AH S
+vincent V IH N S AH N T
+vincent's V IH N S IH N T S
+vincent(2) V IH N S IH N T
+vincente V IH N CH EH N T IY
+vincenti V IY N CH EH N T IY
+vincentia V IY N CH EH N SH AH
+vincenzo V IH N S EH N Z OW
+vinci V IH N S IY
+vinci's V IH N S IY Z
+vinci's(2) V IH N CH IY Z
+vinci(2) V IH N CH IY
+vinciguerra V IY N CH IY G EH R AH
+vindicate V IH N D AH K EY T
+vindicated V IH N D AH K EY T IH D
+vindicates V IH N D IH K EY T S
+vindication V IH N D AH K EY SH AH N
+vindicator V IH N D AH K EY T ER
+vindictive V IH N D IH K T IH V
+vindictiveness V IH N D IH K T IH V N AH S
+vine V AY N
+vinegar V IH N AH G ER
+vinegars V IH N IH G ER Z
+vineland V AY N L AH N D
+viner V AY N ER
+vines V AY N Z
+vinet V IH N IH T
+viney V AY N IY
+vineyard V IH N Y ER D
+vineyards V IH N Y ER D Z
+vingmed V IH NG M EH D
+vingo V IH NG G OW
+vini V IY N IY
+vinicio V IH N IH S IY OW
+vinick V IH N IH K
+vinick's V IH N IH K S
+vinik V IH N IH K
+vining V AY N IH NG
+vining's V AY N IH NG Z
+vinita V IY N IY T AH
+vinje V IH N JH
+vink V IH NG K
+vinnick V IH N IH K
+vinnick's V IH N IH K S
+vinnie V IH N IY
+vinny V IH N IY
+vinocur V IH N AH K ER
+vinsant V IY N S AH N T
+vinso V IH N S OW
+vinson V IH N S AH N
+vint V IH N T
+vintage V IH N T IH JH
+vintages V IH N T IH JH IH Z
+vintner V IH N T N ER
+vintners V IH N T N ER Z
+vinton V IH N T AH N
+vinyard V IH N Y ER D
+vinyl V AY N AH L
+vinzant V IH N Z AH N T
+viola V AY OW L AH
+viola(2) V IY OW L AH
+violable V AY AH L AH B AH L
+violante V IY OW L AA N T IY
+violas V IY OW L AH Z
+violate V AY AH L EY T
+violated V AY AH L EY T IH D
+violates V AY AH L EY T S
+violating V AY AH L EY T IH NG
+violation V AY AH L EY SH AH N
+violations V AY AH L EY SH AH N Z
+violator V AY AH L EY T ER
+violators V AY AH L EY T ER Z
+viole V AY OW L
+violence V AY AH L AH N S
+violent V AY AH L AH N T
+violent(2) V AY L AH N T
+violently V AY AH L AH N T L IY
+violently(2) V AY L AH N T L IY
+violet V AY AH L IH T
+violet(2) V AY L IH T
+violeta V IY OW L EH T AH
+violeta(2) V AY OW L EH T AH
+violets V AY AH L AH T S
+violets(2) V AY L AH T S
+violett V AY AH L AH T
+violett(2) V AY L AH T
+violett(3) V IY OW L EH T
+violetta V IY OW L EH T AH
+violette V IY OW L EH T
+violin V AY AH L IH N
+violinist V AY AH L IH N AH S T
+violinists V AY AH L IH N AH S T S
+violinists(2) V AY AH L IH N AH S S
+violinists(3) V AY AH L IH N AH S
+violins V AY AH L IH N Z
+violist V IY OW L AH S T
+violist's V IY OW L AH S T S
+violist's(2) V IY OW L AH S
+violists V IY OW L AH S T S
+violists(2) V IY OW L AH S
+viper V AY P ER
+vipers V AY P ER Z
+vipin V IH P IH N
+vipond V IH P AH N D
+vipont V IH P AA N T
+vipont's V IH P AA N T S
+vipperman V IH P ER M AH N
+vipul V IY P UW L
+virag V AO R AH G
+virago V IH R AH G OW
+viral V AY R AH L
+viramontes V IH R AA M OW N T EH S
+viratek V IH R AH T EH K
+viray V AY R EY
+virazole V IH R AH Z OW L
+virazole(2) V AY R AH Z OW L
+virco V ER K OW
+virden V ER D AH N
+viren V IH R AH N
+vires V AY R Z
+virga V ER G AH
+virge V ER JH
+virgen V ER JH AH N
+virgie V ER G IY
+virgil V ER JH AH L
+virgilio V ER JH IH L IY OW
+virgin V ER JH IH N
+virgin's V ER JH AH N Z
+virginal V ER JH AH N AH L
+virginia V ER JH IH N Y AH
+virginia's V ER JH IH N Y AH Z
+virginian V ER JH IH N Y AH N
+virginians V ER JH IH N Y AH N Z
+virginity V ER JH IH N IH T IY
+virgins V ER JH AH N Z
+virgo V ER G OW
+virgy V ER JH IY
+viridis V AO R IH D IH S
+viridis(2) V IH R IH D IH S
+virile V IH R AH L
+virility V ER IH L AH T IY
+virina V IH R IY N AH
+virkler V ER K AH L ER
+virkler(2) V ER K L ER
+virna V ER N AH
+virnig V ER N IH G
+virological V AY R AH L AA JH IH K AH L
+virologist V IH R AA L AH JH IH S T
+virologists V IH R AA L AH JH IH S T S
+virologists(2) V IH R AA L AH JH IH S S
+virologists(3) V IH R AA L AH JH IH S
+virology V IH R AA L AH JH IY
+viromune V AY R OW M Y UW N
+virts V ER T S
+virtual V ER CH UW AH L
+virtually V ER CH UW AH L IY
+virtually(2) V ER CH UW L IY
+virtue V ER CH UW
+virtues V ER CH UW Z
+virtuosity V ER CH UW AA S IH T IY
+virtuoso V ER CH UW OW S OW
+virtuous V ER CH UW AH S
+virulence V IH R AH L AH N S
+virulent V IH R AH L AH N T
+virulently V IH R AH L AH N T L IY
+virus V AY R AH S
+virus's V AY R AH S IH Z
+viruses V AY R AH S AH Z
+viruses(2) V AY R AH S IH Z
+virzi V IH R Z IY
+vis V IH S
+vis-a-vis V IY Z AH V IY
+visa V IY Z AH
+visa's V IY Z AH Z
+visage V IH Z AH JH
+visas V IY Z AH Z
+viscardi V IY S K AA R D IY
+visceral V IH S ER AH L
+viscerally V IH S ER AH L IY
+visclosky V IH S K L AO S K IY
+visco V IY S K OW
+viscomi V IY S K OW M IY
+visconti V IY S K OW N T IY
+viscosity V IH S K AA S AH T IY
+viscount V IH S K AW N T
+viscounts V IH S K AW N T S
+viscous V IH S K AH S
+viscusi V IY S K UW S IY
+viscuso V IY S K UW S OW
+vise V AY S
+visegrad V IH S AH G R AE D
+visenteno V IH S AH N T EH N OW
+vishay V IH SH EY
+vishnu V IH SH N UW
+visibility V IH Z AH B IH L IH T IY
+visible V IH Z AH B AH L
+visibly V IH Z AH B L IY
+visicalc V IH Z IH K AE L K
+visigoth V IH Z AH G AA TH
+visigoths V IH Z AH G AA TH S
+vision V IH ZH AH N
+vision's V IH ZH AH N Z
+visionaries V IH ZH AH N EH R IY Z
+visionary V IH ZH AH N EH R IY
+visions V IH ZH AH N Z
+visit V IH Z AH T
+visit(2) V IH Z IH T
+visitation V IH Z AH T EY SH AH N
+visitation(2) V IH Z IH T EY SH AH N
+visitations V IH Z AH T EY SH AH N Z
+visitations(2) V IH Z IH T EY SH AH N Z
+visited V IH Z AH T AH D
+visited(2) V IH Z IH T IH D
+visiting V IH Z AH T IH NG
+visiting(2) V IH Z IH T IH NG
+visitor V IH Z AH T ER
+visitor's V IH Z AH T ER Z
+visitor's(2) V IH Z IH T ER Z
+visitor(2) V IH Z IH T ER
+visitors V IH Z AH T ER Z
+visitors' V IH S AH T ER Z
+visitors'(2) V IH S IH T ER Z
+visitors(2) V IH Z IH T ER Z
+visits V IH Z AH T S
+visits(2) V IH Z IH T S
+visnic V IH S N IH CH
+visor V AY Z ER
+visors V AY Z ER Z
+visscher V IH SH ER
+visser V IH S ER
+vist V IH S T
+vista V IH S T AH
+vista's V IH S T AH Z
+vistas V IH S T AH Z
+viston V IH S T AH N
+visual V IH ZH AH W AH L
+visualization V IH ZH W AH L AH Z EY SH AH N
+visualize V IH ZH W AH L AY Z
+visualized V IH ZH W AH L AY Z D
+visualizing V IH ZH W AH L AY Z IH NG
+visually V IH ZH W AH L IY
+visuals V IH ZH W AH L Z
+visx V IH S EH K S
+vita V AY T AH
+vitae V AY T AH
+vitagliano V IY T AA G L IY AA N OW
+vital V AY T AH L
+vitale V IH T AE L IY
+vitale(2) V AY T AE L
+vitali V IY T AA L IY
+vitalink V AY T AH L IH NG K
+vitality V AY T AE L AH T IY
+vitally V AY T AH L IY
+vitaly V AH T AE L IY
+vitaly(2) V IY T AA L IY
+vitamin V AY T AH M AH N
+vitamins V AY T AH M AH N Z
+vitanza V IH T AE N Z AH
+vitarine V IH T ER IY N
+vitarine's V IH T ER IY N Z
+vitek V IH T EH K
+vitelli V IH T EH L IY
+vitello V IH T EH L OW
+vitez V IH T EH Z
+vitez(2) V AY T EH Z
+viti V IY T IY
+vitia V IY SH AH
+vitiello V IY T IY EH L OW
+vitiligo V IY T IH L IH G OW
+vitner V IH T N ER
+vito V IY T OW
+vitolo V IY T OW L OW
+vitramon V IH T R AH M AA N
+vitrano V IY T R AA N OW
+vitreous V IH T R IY AH S
+vitric V IH T R IH K
+vitriol V IH T R IY AH L
+vitriolic V IH T R IY AA L IH K
+vitro V IH T R OW
+vitro(2) V IY T R OW
+vitronics V AY T R AA N IH K S
+vitruvius V IH T R UW V IY AH S
+vitry V IH T R IY
+vitt V IH T
+vittetoe V IH T IH T OW
+vittitow V IH T IH T OW
+vittle V IH T AH L
+vittles V IH T AH L Z
+vittoria V IH T AO R IY AH
+vittorio V IY T AO R IY OW
+vitucci V IY T UW CH IY
+vitulli V IY T UW L IY
+vitullo V IY T UW L OW
+vituperative V AY T UW P ER AH T IH V
+vituperative(2) V AH T UW P ER AH T IH V
+viv V IH V
+viva V IY V AH
+vivacious V AH V EY SH AH S
+vivaldi V IH V AA L D IY
+vivas V IY V AH Z
+vive V IY V
+vive(2) V AY V
+viveiros V IY V IH R OW Z
+vivendi V IH V EH N D IY
+viverette V IH V ER EH T
+viveros V IY V EH R OW Z
+vives V AY V Z
+vivian V IH V IY AH N
+viviana V IH V IY AE N AH
+viviani V IY V IY AA N IY
+viviano V IY V IY AA N OW
+vivid V IH V AH D
+vivid(2) V IH V IH D
+vividly V IH V AH D L IY
+vividness V IH V AH D N AH S
+vivie V IH V IY
+vivien V IH V IY AH N
+vivienne V IH V IY AH N
+vivier V AY V IY ER
+viviparous V AY V IH P ER AH S
+vivisepulture V IH V IY S EH P AH L CH ER
+vivo V IY V OW
+vivona V IY V OW N AH
+vivra V IY V R AH
+vivyan V IY V Y AA N
+vixen V IH K S IH N
+viyella V IH Y EH L AH
+vizcaino V IY Z K AA IY N OW
+vizcarra V IY Z K AA R AH
+vizcaya V IH Z K AY AH
+vizzini V IY T S IY N IY
+vlach V L AE CH
+vlachos V L EY K OW S
+vlad V L AE D
+vlad's V L AE D Z
+vladeck V L AE D EH K
+vladimir V L AE D AH M IH R
+vladislav V L AE D AH S L AA V
+vladivostok V L AE D IH V AO S T AA K
+vladivostok(2) V L AE D IH V OW S T AA K
+vlahakis V L AH HH AO K IH S
+vlahos V L AA HH OW S
+vlasak V L AA S AH K
+vlasic V L AE Z IH K
+vlcek V L EH S IH K
+vliet V L IY T
+vlok V L AA K
+vnesheconombank V AH N EH SH AH K AA N AH M B AE NG K
+vo V OW
+vo(2) V IY OW
+vobis V OW B AH S
+vocabulary V OW K AE B Y AH L EH R IY
+vocal V OW K AH L
+vocalist V OW K AH L IH S T
+vocally V OW K AH L IY
+vocals V OW K AH L Z
+vocaltec V OW K AH L T EH K
+vocation V OW K EY SH AH N
+vocational V OW K EY SH AH N AH L
+vocations V OW K EY SH AH N Z
+vociferate V AH S IH F ER EY T
+vociferated V AH S IH F ER EY T AH D
+vociferates V AH S IH F ER EY T S
+vociferating V AH S IH F ER EY T IH NG
+vociferous V OW S IH F ER AH S
+vociferously V AH S IH F ER AH S L IY
+vocke V AA K
+vocs V AA K S
+vodafone V OW D AH F OW N
+vodavi V OW D AA V IY
+vodicka V AA D IH K AH
+vodka V AA D K AH
+vodkas V AA D K AH Z
+voegele V OW G AH L
+voegeli V OW G IH L IY
+voelkel V OW L K AH L
+voelker V OW L K ER
+voell V OW L
+voeller V OW L ER
+voeltz V OW L T S
+voelz V OW L Z
+voest V OW S T
+vogan V OW G AH N
+voge V OW JH
+vogel V OW G AH L
+vogeler V OW G AH L ER
+vogelgesang V AA G IH L G IH S AH NG
+vogelpohl V AA G IH L P OW L
+vogels V OW G AH L Z
+vogelsang V AA G IH L S AH NG
+vogelsong V AA G IH L S AO NG
+vogelstein V OW G AH L S T IY N
+vogelstein(2) V OW G AH L S T AY N
+voges V OW JH IH Z
+voght V AA T
+vogl V AA G AH L
+vogler V OW G L ER
+vogosca V OW G OW S K AH
+vogosca(2) V AH G OW S K AH
+vogt V OW T
+vogtle V AA G T AH L
+vogue V OW G
+vohs V AA S
+voice V OY S
+voice's V OY S IH Z
+voiced V OY S T
+voiceless V OY S L AH S
+voicemail V OY S M EY L
+voiceover V OY S OW V ER
+voices V OY S AH Z
+voices(2) V OY S IH Z
+voicework V OY S W ER K
+voiceworks V OY S W ER K S
+voicing V OY S IH NG
+void V OY D
+voided V OY D IH D
+voiding V OY D IH NG
+voids V OY D Z
+voight V OY T
+voigt V OY G T
+voigt(2) V OY T
+voigts V OY G T S
+voigts(2) V OY T S
+voila V W AA L AA
+voiles V OY L Z
+voinovich V OY N AH V IH CH
+voir V W AA R
+voisey V W AA S EY
+voisey(2) V OY S EY
+voisin V OY Z AE N
+voisine V OY Z IY N
+voit V OY T
+vojta V OY T AH
+vokes V OW K S
+voland V AA L AH N D
+volante V OW L AA N T EY
+volatile V AA L AH T AH L
+volatility V AA L AH T IH L AH T IY
+volberding V OW L B ER D IH NG
+volcanic V AA L K AE N IH K
+volcanically V AA L K AE N IH K L IY
+volcano V AA L K EY N OW
+volcano's V AA L K EY N OW Z
+volcanoes V AA L K EY N OW Z
+volcanologist V AO L K AH N AO L AH JH IH S T
+volcanologists V AO L K AH N AO L AH JH IH S T S
+volcanologists(2) V AO L K AH N AO L AH JH IH S
+volcanos V AA L K EY N OW Z
+volcker V OW L K ER
+volcker's V OW L K ER Z
+vold V OW L D
+volden V OW L D AH N
+volentine V OW L EH N T IY N IY
+voles V OW L Z
+voleta V OW L EH T AH
+volga V AA L G AH
+volgograd V OW L G OW G R AE D
+volin V OW L IH N
+volio V OW L IY OW
+volition V OW L IH SH AH N
+volk V OW L K
+volker V OW L K ER
+volkers V OW L K ER Z
+volkert V OW L K ER T
+volkman V OW L K M AH N
+volkmann V OW L K M AH N
+volkmar V OW L K M ER
+volkmer V OW L K M ER
+volkogonov V OW L K AO G AH N AO V
+volksbank V OW L K S B AE NG K
+volksfuersorge V OW L K S F Y UW R S AO R JH
+volkswagen V OW L K S W AE G AH N
+volkswagen's V OW L K S W AE G AH N Z
+volkswagens V OW L K S W AE G AH N Z
+voll V AA L
+volland V AA L AH N D
+vollbrecht V AA L B R IH K T
+volle V AA L
+vollenweider V AA L IH N W AY D ER
+voller V AA L ER
+volley V AA L IY
+volleyball V AA L IY B AO L
+volleys V AA L IY Z
+vollman V AA L M AH N
+vollmar V AA L M ER
+vollmer V AA L M ER
+vollrath V AA L R AH TH
+volmer V OW L M ER
+volner V OW L N ER
+volney V OW L N IY
+volokh V AA L AA K
+volpe V OW L P
+volpi V OW L P IY
+volpicella V OW L P IH S EH L AH
+volt V OW L T
+volta V OW L T AH
+voltage V OW L T AH JH
+voltage's V OW L T IH JH IH Z
+voltage(2) V OW L T IH JH
+voltages V OW L T AH JH AH Z
+voltages(2) V OW L T IH JH IH Z
+voltaire V OW L T EH R
+voltaren V OW L T ER AH N
+volts V OW L T S
+voltz V OW L T S
+voluble V AA L Y AH B AH L
+volume V AA L Y UW M
+volume's V AA L Y AH M Z
+volumes V AA L Y UW M Z
+voluminous V AH L UW M AH N AH S
+voluntarily V AA L AH N T EH R AH L IY
+voluntarism V OW L AH N T ER IH Z AH M
+voluntary V AA L AH N T EH R IY
+volunteer V AA L AH N T IH R
+volunteered V AA L AH N T IH R D
+volunteering V AO L AH N T IH R IH NG
+volunteerism V AO L AH N T IH R IH Z AH M
+volunteers V AA L AH N T IH R Z
+voluptuous V AH L AH P CH AH W AH S
+volvo V OW L V OW
+volvo's V OW L V OW Z
+volvos V AO L V OW Z
+volvovitz V OW L V AH V IH T S
+volvox V AA L V AA K S
+volz V OW L Z
+vomit V AA M AH T
+vomiting V AA M AH T IH NG
+von V AO N
+von-braun V AA N B R AO N
+vona V OW N AH
+vonada V OW N AA D AH
+vonallmen V AA N AH L M EH N
+vonarx V AH N AA R K S
+vonbargen V AA N B AA R G AH N
+vonbehren V AA N B IH R AH N
+vonbergen V AA N B ER G AH N
+voncannon V AA N K AE N AH N
+vonder V AA N D ER
+vonderhaar V AA N D ER HH AA R
+vonderheide V AA N D ER HH AY D
+vondra V AA N D R AH
+vondracek V AA N D R AH S IH K
+vondrak V AA N D R AH K
+vondrasek V AH N D R AA S EH K
+vonfeldt V AA N F IH L T
+vong V AO NG
+vongunten V AA NG G AH N T AH N
+vonk V AA NG K
+vonnegut V AA N AH G AH T
+vonnie V AA N IY
+vonny V AA N IY
+vonruden V AA N R UW D AH N
+vons V AA N Z
+vons's V AA N Z IH Z
+vonseggern V AA N S IH G ER N
+vonstein V AA N S T AY N
+vonstein(2) V AA N S T IY N
+vontobel V AA N T OW B AH L
+voodoo V UW D UW
+voorhees V UH R HH IY Z
+voorheis V UH R HH AY Z
+voorhies V UH R HH IY Z
+voorhis V UH R HH IH S
+vora V AO R AH
+voracious V AO R EY SH AH S
+voracity V ER AE S AH T IY
+voracity(2) V AO R AE S AH T IY
+vorce V AO R S
+vore V AO R
+vorhauer V AO R HH AW R
+vorhees V AO R HH IY Z
+vorhies V AO R HH IY Z
+voris V AO R IH S
+vornado V AO R N AA D OW
+vornado(2) V AO R N EY D OW
+vorndran V AO R N D R AH N
+vorontsov V AO R AA N T S AA V
+voros V AO R OW Z
+vorpahl V AO R P AA L
+vortec V AO R T EH K
+vortex V AO R T EH K S
+vorwald V AO R W AO L D
+vorwerk V AO R W ER K
+vos V AA S
+vosberg V AA S B ER G
+vosburg V AA S B ER G
+vosburgh V AA S B ER G
+vose V OW Z
+voshell V AA SH AH L
+vosler V AA S AH L ER
+vosler(2) V AA S L ER
+voss V AO S
+vossen V AO S AH N
+vossler V AA S AH L ER
+vossler(2) V AA S L ER
+votava V OW T AA V AH
+votaw V OW T AO
+vote V OW T
+vote's V OW T S
+voted V OW T AH D
+voted(2) V OW T IH D
+voter V OW T ER
+voter's V OW T ER Z
+voters V OW T ER Z
+voters' V OW T ER Z
+votes V OW T S
+voth V AA TH
+voting V OW T IH NG
+votrax V AA T R AE K S
+votruba V AH T R UW B AH
+vouch V AW CH
+vouched V AW CH T
+voucher V AW CH ER
+vouchers V AW CH ER Z
+vouching V AW CH IH NG
+vought V AO T
+vous V UW
+voute V UW T
+vow V AW
+vowed V AW D
+vowel V AW AH L
+vowell V AA W EH L
+vowels V AW AH L Z
+vowels(2) V AW L Z
+vowing V AW IH NG
+vowles V AW AH L Z
+vows V AW Z
+vox V AA K S
+voyage V OY AH JH
+voyage(2) V OY IH JH
+voyaged V OY AH JH D
+voyaged(2) V OY IH JH D
+voyager V OY AH JH ER
+voyager's V OY IH JH ER Z
+voyager(2) V OY IH JH ER
+voyagers V OY IH JH ER Z
+voyages V OY AH JH AH Z
+voyages(2) V OY IH JH IH Z
+voyer V OY ER
+voyeur V OY Y UW R
+voyeurism V OY Y UW R IH Z AH M
+voyeuristic V OY Y AH R IH S T IH K
+voyles V OY L Z
+voynavich V OY N AH V IH CH
+voytek V OY T IH K
+voytko V OY T K OW
+vrabel V R AE B AH L
+vradenburg V R EY D AH N B ER G
+vrain V R EY N
+vrana V R AE N AH
+vranesevic V R AA N AH S EH V IH CH
+vranitzky V R AH N IH T S K IY
+vranos V R AA N OW S
+vrba V ER B AA
+vrdolyak V ER D OW L IY AE K
+vredenburg V R IY D AH N B ER G
+vreeland V R IY L AH N D
+vremya V R EH M IY AH
+vries V R IY Z
+vroman V R OW M AH N
+vroom V R UW M
+vrooman V R UW M AH N
+vs V ER S AH Z
+vs(2) V IY EH S
+vsel V IY S EH L
+vu V UW
+vu(2) V IY Y UW
+vue V Y UW
+vuitton V UW T AH N
+vukelich V AH K EH L IH HH
+vukovar V UW K AH V AA R
+vukovich V Y UW K AH V IH CH
+vukovich(2) V UW K AH V IH CH
+vulcan V AH L K AH N
+vulcan's V AH L K AH N Z
+vulcans V AH L K AH N Z
+vulgamore V AH L G AH M AO R
+vulgar V AH L G ER
+vulgarity V AH L G EH R IH T IY
+vulgarization V AH L G ER IH Z EY SH AH N
+vullo V UW L OW
+vulnerabilities V AH L N ER AH B IH L IH T IY Z
+vulnerability V AH L N ER AH B IH L IH T IY
+vulnerable V AH L N ER AH B AH L
+vultaggio V UW L T AA JH IY OW
+vulture V AH L CH ER
+vultures V AH L CH ER Z
+vulva V UH L V AH
+vuncannon V AH N K AH N AA N
+vuncannon(2) V AH N K AE N AH N
+vuolo V UW OW L OW
+vuong V UW AO NG
+vy V AY
+vyacheslav V Y AA CH AH S L AA V
+vyas V Y AA S
+vyas(2) V AY AH S
+vying V AY IH NG
+w D AH B AH L Y UW
+w's D AH B AH L Y UW Z
+w. D AH B AH L Y UW
+w.'s D AH B AH L Y UW Z
+w.s D AH B AH L Y UW Z
+wa W AA
+waack W AA K
+waag W AA G
+waage W AA IH JH
+waah W AA
+waal W AA L
+waara W AA R AH
+waas W AA Z
+wabash W AO B AE SH
+wabash's W AO B AE SH AH Z
+wace W EY S
+wach W AO CH
+wacha W AA CH AH
+wachholz W AO K HH OW L Z
+wachner W AE K N ER
+wacho W AA CH OW
+wachob W AO K AH B
+wachovia W AA CH OW V IY AH
+wachowiak V AH HH AW IY AE K
+wachowski V AH HH AO F S K IY
+wachs W AO K S
+wachsman W AO K S M AH N
+wachsmuth W AO K S M UH TH
+wachtel W AO CH AH L
+wachtell W AA K T EH L
+wachter W AO K T ER
+wachtler W AE K T L ER
+wack W AE K
+wackenhut W AA K AH N HH AH T
+wacker W AE K ER
+wackerle W AE K ER AH L
+wackerle(2) W AE K ER L IY
+wacko W AE K OW
+wackos W AE K OW Z
+wacks W AE K S
+wacksman W AE K S M AH N
+wacksman's W AE K S M AH N Z
+wacky W AE K IY
+waco W EY K OW
+wactlar W AA K T L ER
+wad W AA D
+wada W AA D AH
+wadas W AA D AH Z
+wadded W AA D AH D
+wadded(2) W AA D IH D
+waddell W AA D EH L
+waddie W AA D IY
+waddill W AO D IH L
+waddington W AA D IH NG T AH N
+waddle W AA D AH L
+waddy W AA D IY
+wade W EY D
+wade's W EY D Z
+waded W EY D IH D
+wadel W EY D AH L
+wader W EY D ER
+waders W EY D ER Z
+wades W EY D Z
+wadford W AO D F ER D
+wadhams W AO D AH M Z
+wading W EY D IH NG
+wadkins W AO D K IH N Z
+wadle W AO D AH L
+wadleigh W AO D L IY
+wadley W AA D L IY
+wadlington W AA D L IH NG T AH N
+wadlow W AA D L OW
+wadman W AO D M AH N
+wads W AA D Z
+wadsworth W AA D Z W ER TH
+wadsworth's W AA D Z W ER TH S
+waechter W EH K T ER
+waeltermann W AA L T ER M AH N
+waeltermann(2) V AE L T ER M AH N
+waertsilae W EH R T S AH L EY
+wafer W EY F ER
+wafers W EY F ER Z
+waffenschmidt W AA F AH N SH M IH T
+waffle W AA F AH L
+waffled W AA F AH L D
+waffles W AA F AH L Z
+waffling W AA F L IH NG
+wafford W AA F ER D
+waft W AA F T
+wafted W AA F T IH D
+wafting W AA F T IH NG
+wag W AE G
+wag's W AE G Z
+waga W AA G AH
+waga(2) D AH B AH L Y UW EY JH IY EY
+waga(3) D AH B AH Y UW EY JH IY EY
+wagaman W AE G AH M AH N
+wagar W AE G ER
+wage W EY JH
+waged W EY JH D
+wageman W EY JH M AH N
+wagenaar W AE G AH N AA R
+wagener W AE G AH N ER
+wagenknecht W AE G AH N IH K T
+wager W EY JH ER
+wagered W EY JH ER D
+wagering W EY JH ER IH NG
+wagers W EY JH ER Z
+wages W EY JH AH Z
+wages(2) W EY JH IH Z
+wagg W AE G
+wagged W AE G D
+waggener W AE G AH N ER
+wagging W AE G IH NG
+waggling W AE G AH L IH NG
+waggling(2) W AE G L IH NG
+waggoner W AE G AH N ER
+waggy W AE G IY
+waging W EY JH IH NG
+wagle W AE G AH L
+wagler W AE G L ER
+wagley W AE G L IY
+wagman W AE G M AH N
+wagner W AE G N ER
+wagner's W AE G N ER Z
+wagner's(2) V AE G N ER Z
+wagner(2) V AA G N ER
+wagnerian W AE G N EH R IY AH N
+wagnerian(2) V AA G N EH R IY AH N
+wagnon W AE G N AH N
+wagon W AE G AH N
+wagoneer W AE G AH N IH R
+wagoneers W AE G AH N IH R Z
+wagoner W AE G AH N ER
+wagons W AE G AH N Z
+wags W AE G Z
+wagstaff W AE G S T AE F
+wagster W AE G S T ER
+waguespack W AE G IH S P AE K
+wagy W AE G IY
+wah W AA
+wah's W AA Z
+wah-pei W AA P EY
+wahid W AA HH IY D
+wahine W AH HH IY N IY
+wahines W AH HH IY N IY Z
+wahl W AA L
+wahlberg W AA L B ER G
+wahle W AO L
+wahlen W AA L AH N
+wahler W AA L ER
+wahlers W AA L ER Z
+wahlert W AA L ER T
+wahlgren W AA L G R AH N
+wahlquist W AA L K W IH S T
+wahlstrom W AA L S T R AH M
+wahoo W AH HH UW
+wahoo(2) W AA HH UW
+wai W AY
+waibel W EY B AH L
+waibel(2) W AY B AH L
+waid W EY D
+waide W EY D
+waidelich W AY D L IH K
+waif W EY F
+waifer W EY F ER
+waigel W AY G AH L
+waikiki W AY K IY K IY
+wail W EY L
+wailed W EY L D
+wailes W EY L Z
+wailing W EY L IH NG
+wails W EY L Z
+wain W EY N
+wainer W EY N ER
+wainio W EY N IY OW
+wainman W EY N M AH N
+wainoco W EY N OW K OW
+wainoco's W EY N OW K OW Z
+wainright W EY N R AY T
+wainscott W EY N S K AH T
+wainscotting W EY N S K AO T IH NG
+wainwright W EY N R AY T
+wais W EY Z
+waisanen W AY S AH N AH N
+waisner W EY Z N ER
+waist W EY S T
+waistline W EY S T L AY N
+waists W EY S T S
+wait W EY T
+waite W EY T
+waite's W EY T S
+waited W EY T AH D
+waited(2) W EY T IH D
+waiter W EY T ER
+waiter's W EY T ER Z
+waiters W EY T ER Z
+waites W EY T S
+waitin' W EY T IH N
+waiting W EY T IH NG
+waitkus W EY T K AH S
+waitman W AY T M AH N
+waitress W EY T R AH S
+waitresses W EY T R AH S IH Z
+waits W EY T S
+waitt W EY T
+waitzkin W EY T S K IH N
+waive W EY V
+waived W EY V D
+waiver W EY V ER
+waivers W EY V ER Z
+waives W EY V Z
+waiving W EY V IH NG
+wajda V AY D AH
+wakabayashi W AA K AA B AA Y AA SH IY
+wake W EY K
+wakefield W EY K F IY L D
+wakeham W AE K AH M
+wakeland W EY K L AH N D
+wakeley W AE K L IY
+wakely W EY K L IY
+wakeman W EY K M AH N
+waken W EY K AH N
+wakes W EY K S
+wakeup W EY K AH P
+wakid W EY K AH D
+waking W EY K IH NG
+wakley W AE K L IY
+wako W AE K OW
+wal W AO L
+wala W AO L AH
+wala's W AO L AH Z
+walas W AO L AH Z
+walberg W AO L B ER G
+walbert W AO L B ER T
+walborn W AO L B ER N
+walbridge W AO L B R IH JH
+walbro W AO L B R OW
+walburn W AO L B ER N
+walby W AO L B IY
+walch W AO L CH
+walcher W AO L CH ER
+walck W AO L K
+walcot W AO L K AA T
+walcott W AO L K AA T
+walczak V AA L CH AE K
+walczyk V AA L CH IH K
+wald W AO L D
+walda V AA L D AH
+waldbaum W AO L D B AW M
+walde W AO L D
+waldeck W AO L D EH K
+waldecker W AO L D EH K ER
+waldegard W AO L D AH G AA R D
+waldemar V AA L D AH M AA R
+walden W AO L D AH N
+waldenbooks W AO L D AH N B UH K S
+waldenbooks' W AO L D AH N B UH K S
+walder W AO L D ER
+waldheim W AO L D HH AY M
+waldheim's W AO L D HH AY M Z
+waldheim's(2) V AO L D HH AY M Z
+waldheim(2) V AO L D HH AY M
+waldholtz W AO L D HH OW L T S
+waldholtz's W AO L D HH OW L T S IH Z
+waldholz W AO L D HH OW L T S
+waldhorn W AO L D HH AO R N
+waldie W AO L D IY
+walding W AO L D IH NG
+waldinger W AO L D IH NG ER
+waldman W AA L D M AH N
+waldmann W AO L D M AH N
+waldner W AO L D N ER
+waldo W AA L D OW
+waldo(2) W AO L D OW
+waldoch W AO L D AA K
+waldock W AO L D AA K
+waldon W AO L D AH N
+waldorf W AO L D AO R F
+waldow W AO L D OW
+waldren W AO L D R AH N
+waldrep W AO L D R AH P
+waldridge W AO L D R IH JH
+waldrip W AO L D R AH P
+waldron W AO L D R AH N
+waldroop W AO L D R UW P
+waldrop W AO L D R AA P
+waldroup W AO L D R UW P
+waldrum W AO L D R AH M
+waldrup W AO L D R AH P
+waldschmidt W AO L D SH M IH T
+waldvogel W AO L D V OW G AH L
+wale W EY L
+waleed W AA L IY D
+walek V AA L EH K
+walen W EY L AH N
+walenta W AH L EH N T AH
+walenta(2) V AH L EH N T AH
+wales W EY L Z
+wales' W EY L Z
+walesa W AH L EH S AH
+walesa's W AH L EH S AH Z
+walesa's(2) V AH L EH S AH Z
+walesa(2) V AH L EH S AH
+waleson W EY L S AH N
+walford W AO L F ER D
+walfred W AO L F R EH D
+walgreen W AO L G R IY N
+walgren W AO L G R AH N
+walicki W AH L IH K IY
+walid W AA L IY D
+waligora W AO L IH G AO R AH
+walinsky W AH L IH N S K IY
+walizer W AO L AY Z ER
+walk W AO K
+walk(2) W AA K
+walk-on W AO K AA N
+walk-ons W AO K AA N Z
+walke W AO K
+walked W AO K T
+walken W AO K AH N
+walkenhorst W AO K AH N HH AO R S T
+walker W AO K ER
+walker's W AO K ER Z
+walkers W AO K ER Z
+walkie W AO K IY
+walkin' W AO K IH N
+walking W AO K IH NG
+walkington W AO K IH NG T AH N
+walkinshaw W AO K AH N SH AO
+walkley W AO K L IY
+walkman W AO K M AE N
+walkman(2) W AO K M AH N
+walkner W AO K N ER
+walko W AO K OW
+walkout W AO K AW T
+walkouts W AO K AW T S
+walkowiak W AO K AW IY AE K
+walkowski W AO K AO F S K IY
+walks W AO K S
+walkup W AO K AH P
+walkure W AO K Y ER
+walkway W AO K W EY
+walkways W AO K W EY Z
+wall W AO L
+wall's W AO L Z
+wall-tex W AO L T EH K S
+walla W AO L AH
+wallabies W AA L AH B IY Z
+wallaby W AA L AH B IY
+wallace W AO L AH S
+wallace's W AO L AH S AH Z
+wallace(2) W AO L IH S
+wallach W AO L AH K
+wallack W AO L AH K
+wallander W AO L AH N D ER
+wallar W AO L ER
+wallboard W AO L B AO R D
+walle W AO L
+walled W AO L D
+wallen W AO L AH N
+wallenberg W AO L AH N B ER G
+wallenberg's W AO L AH N B ER G Z
+wallenstein W AO L AH N S T AY N
+wallenstein(2) W AO L AH N S T IY N
+waller W AO L ER
+wallerstein W AO L ER S T AY N
+wallerstein(2) W AO L ER S T IY N
+walles W AO L Z
+wallet W AO L AH T
+wallets W AO L AH T S
+walley W AO L IY
+walleye W AO L AY
+wallflower W AO L F L AW ER
+wallgren W AO L G R AH N
+wallich W AO L IH K
+wallich's W AO L IH K S
+wallick W AO L IH K
+wallie W AO L IY
+wallin W AO L IH N
+walling W AO L IH NG
+wallingford W AO L IH NG F ER D
+wallington W AO L IH NG T AH N
+wallis W AO L IH S
+wallison W AO L IH S AH N
+wallman W AO L M AH N
+wallner W AO L N ER
+wallo W AA L OW
+walloch W AO L AH K
+wallop W AA L AH P
+walloping W AO L AH P IH NG
+wallops W AA L AH P S
+wallow W AA L OW
+wallowed W AA L OW D
+wallowing W AA L OW IH NG
+wallpaper W AO L P EY P ER
+wallpapered W AO L P EY P ER D
+wallpapering W AO L P EY P ER IH NG
+wallpapers W AO L P EY P ER Z
+walls W AO L Z
+wallsend W AO L S EH N D
+wallstreet W AO L S T R IY T
+wallwork W AO L W ER K
+wally W AO L IY
+wally's W AO L IY Z
+wally(2) W EY L IY
+walmart W AO L M AA R T
+walmer W AO L M ER
+walmond W AO L M AH N D
+walmsley W AO L M S L IY
+waln W AO L N
+walnut W AO L N AH T
+walnuts W AO L N AH T S
+walp W AE L P
+walp(2) W AO L P
+walpole W AO L P OW L
+walrath W AO L R AH TH
+walraven W AO L R EY V AH N
+walrod W AO L R AA D
+walrus W AO L R AH S
+walruses W AA L R AH S IH Z
+walser W AO L Z ER
+walsh W AO L SH
+walsh's W AO L SH IH Z
+walski V AA L S K IY
+walstad W AO L S T AE D
+walston W AO L S T AH N
+walstrom W AO L S T R AH M
+walsworth W AO L S W ER TH
+walt W AO L T
+walter W AO L T ER
+walter's W AO L T ER Z
+waltermire W AO L T ER M AY R
+walters W AO L T ER Z
+walters' W AO L T ER Z
+walth W AO L TH
+walthall W AO L TH AH L
+waltham W AO L TH AH M
+walther W AO L TH ER
+walthers W AO L TH ER Z
+walthose W AO L T HH OW Z
+walthour W AO L T AW R
+waltman W AO L T M AH N
+waltner W AO L T N ER
+walton W AO L T AH N
+walton's W AO L T AH N Z
+waltons W AO L T AH N Z
+waltrip W AO L T R IH P
+walts W AO L T S
+waltz W AO L T S
+waltz(2) W AO L S
+waltzer W AO L T S ER
+waltzer(2) W AO L S ER
+waltzes W AO L T S AH Z
+waltzes(2) W AO L S AH Z
+waltzing W AO L T S IH NG
+waltzing(2) W AO L S IH NG
+walworth W AO L W ER TH
+walwyn W AO L W IH N
+walz W AO L Z
+walzer W AO L Z ER
+wambach W AO M B AA K
+wambaugh W AO M B AA
+wamble W AA M B AH L
+wambold W AA M B OW L D
+wamboldt W AA M B OW L T
+wambolt W AA M B OW L T
+wampler W AA M P L ER
+wampole W AA M P OW L
+wampum W AA M P AH M
+wamser W AA M Z ER
+wamsley W AA M Z L IY
+wan W AA N
+wanamaker W AA N AH M EY K ER
+wanat W EY N AH T
+wand W AA N D
+wanda W AA N D AH
+wandel W AA N D AH L
+wandell W AA N D AH L
+wander W AA N D ER
+wandered W AA N D ER D
+wanderer W AA N D ER ER
+wanderers W AA N D ER ER Z
+wandering W AA N D ER IH NG
+wanderings W AA N D ER IH NG Z
+wanderlust W AA N D ER L AH S T
+wanders W AA N D ER Z
+wandersee W AA N D ER S IY
+wandie W AA N D IY
+wandis W AA N D IH S
+wandler W AA N D L ER
+wandling W AA N D L IH NG
+wandrey W AA N D R IY
+wands W AA N D Z
+wane W EY N
+waned W EY N D
+wanek W EY N IH K
+waner W EY N ER
+wanes W EY N Z
+wang W AE NG
+wang's W AE NG Z
+wangen W AE NG AH N
+wanger W AE NG ER
+wangerin W AO NG G ER IH N
+wangle W AE NG G AH L
+wangled W AE NG G AH L D
+wangler W AE NG G L ER
+waning W EY N IH NG
+wank W AA NG K
+wanke W AA NG K
+wanko W AA NG K OW
+wanless W AA N L AH S
+wann W AA N
+wanna W AA N AH
+wannabe W AA N AH B IY
+wannabee W AA N AH B IY
+wannabees W AA N AH B IY Z
+wannabes W AA N AH B IY Z
+wannamaker W AA N AH M EY K ER
+wannemacher W AA N AH M AA K ER
+wanner W AA N ER
+wanninger W AA N IH NG ER
+wanniski W AH N IH S K IY
+wanser W AO N Z ER
+wansley W AO N Z L IY
+want W AA N T
+want(2) W AO N T
+wanta W AA N T AH
+wanta(2) W AA N AH
+wantage W AA N T IH JH
+wantages W AA N T IH JH IH Z
+wante W AA N T AH
+wanted W AA N T AH D
+wanted(2) W AO N T IH D
+wanted(3) W AO N IH D
+wanting W AA N T IH NG
+wanting(2) W AA N IH NG
+wantland W AA N T L AH N D
+wanton W AO N T AH N
+wanton(2) W AA N T AH N
+wantonly W AO N T AH N L IY
+wantonly(2) W AA N T AH N L IY
+wants W AA N T S
+wants(2) W AO N T S
+wantz W AA N T S
+wanzer W AA N Z ER
+wapiti W AH P IY T IY
+waples W AO P AH L Z
+wapner W AA P N ER
+wapping W AA P IH NG
+war W AO R
+war's W AO R Z
+warbington W AO R B IH NG T AH N
+warble W AO R B AH L
+warbled W AO R B AH L D
+warbler W AO R B L ER
+warblers W AO R B L ER Z
+warbles W AO R B AH L Z
+warbling W AO R B AH L IH NG
+warbling(2) W AO R B L IH NG
+warburg W AO R B ER G
+warburg's W AO R B ER G Z
+warburton W AO R B ER T AH N
+warchol W AO R K AO L
+ward W AO R D
+ward's W AO R D Z
+warda W AO R D AH
+wardair W AO R D EH R
+warde W AO R D
+warded W AO R D IH D
+wardell W AO R D EH L
+warden W AO R D AH N
+warden's W AO R D AH N Z
+wardens W AO R D AH N Z
+wardens' W AO R D AH N Z
+warder W AO R D ER
+warders W AO R D ER Z
+warding W AO R D IH NG
+wardlaw W AO R D L AO
+wardle W AO R D AH L
+wardley W AO R D L IY
+wardlow W AO R D L OW
+wardrip W AO R D R IH P
+wardrobe W AO R D R OW B
+wardrobes W AO R D R OW B Z
+wardrop W AO R D R AA P
+wards W AO R D Z
+wardwell W AO R D W EH L
+ware W EH R
+warehime W EH R HH AY M
+warehouse W EH R HH AW S
+warehoused W EH R HH AW Z D
+warehouses W EH R HH AW Z IH Z
+warehouses(2) W EH R HH AW S IH Z
+warehousing W EH R HH AW Z IH NG
+wareing W EH R IH NG
+waren W EH R AH N
+wares W EH R Z
+warf W AO R F
+warfare W AO R F EH R
+warfel W AO R F AH L
+warfield W AO R F IY L D
+warford W AO R F ER D
+warga W AO R G AH
+wargo W AO R G OW
+warhead W AO R HH EH D
+warheads W AO R HH EH D Z
+warhol W AO R HH AO L
+warhol's W AO HH R AO L Z
+warhurst W AO R HH ER S T
+warily W EH R AH L IY
+wariness W EH R IY N IH S
+waring W EH R IH NG
+wark W AO R K
+warkentin W AO R K EH N T IH N
+warkentin(2) W AO R K AH N T IH N
+warley W AO R L IY
+warlick W AO R L IH K
+warlike W AO R L AY K
+warling W AO R L IH NG
+warloeck W AO R L AA K
+warlord W AO R L AO R D
+warlords W AO R L AO R D Z
+warm W AO R M
+warmack W AO R M AE K
+warman W AO R M AH N
+warmed W AO R M D
+warmer W AO R M ER
+warmest W AO R M AH S T
+warming W AO R M IH NG
+warmington W AO R M IH NG T AH N
+warminster W AO R M IH N S T ER
+warmish W AO R M IH SH
+warmly W AO R M L IY
+warmond W AO R M AH N D
+warmonger W AO R M AA NG G ER
+warmongering W AO R M AA NG G ER IH NG
+warmoth W AO R M AH TH
+warms W AO R M Z
+warmth W AO R M TH
+warmup W AO R M AH P
+warmus W AO R M AH S
+warmuth W AO R M UH TH
+warn W AO R N
+warnaco W AO R N AH K OW
+warncke W AO R NG K IY
+warne W AO R N
+warnecke W AO R N IH K
+warned W AO R N D
+warneke W AO R N IH K
+warnell W AO R N AH L
+warner W AO R N ER
+warner's W AO R N ER Z
+warners W AO R N ER Z
+warnes W AO R N Z
+warnick W AO R N IH K
+warnico W AO R N IH K OW
+warning W AO R N IH NG
+warningly W AO R N IH NG L IY
+warnings W AO R N IH NG Z
+warnke W AO R NG K IY
+warnken W AO R NG K AH N
+warno W AA R N OW
+warnock W AO R N AA K
+warns W AO R N Z
+waronker W AO R AA NG K ER
+warp W AO R P
+warpath W AO R P AE TH
+warped W AO R P T
+warping W AO R P IH NG
+warplane W AO R P L EY N
+warplanes W AO R P L EY N Z
+warps W AO R P S
+warr W AO R
+warrant W AO R AH N T
+warranted W AO R AH N T IH D
+warranties W AO R AH N T IY Z
+warrantless W AO R AH N T L AH S
+warrants W AO R AH N T S
+warranty W AO R AH N T IY
+warrell W AO R EH L
+warren W AO R AH N
+warren's W AO R AH N Z
+warrens W AO R AH N Z
+warrenton W AA R AH N T AH N
+warrick W AO R IH K
+warriner W AO R AH N ER
+warring W AO R IH NG
+warrington W AO R IH NG T AH N
+warrior W AO R IY ER
+warrior(2) W AO R Y ER
+warriors W AO R IY ER Z
+warriors(2) W AO R Y ER Z
+wars W AO R Z
+wars' W AO R Z
+warsaw W AO R S AO
+warsaw's W AO R S AO Z
+warsaws W AO R S AO Z
+warshauer W AO R SH AW ER
+warshaw W AO R SH AO
+warshawsky W AO R SH AH W S K IY
+warship W AO R SH IH P
+warships W AO R SH IH P S
+warstler W AO R S T L ER
+wart W AO R T
+wartenberg W AO R T AH N B ER G
+warth W AO R TH
+warthen W AO R TH AH N
+wartime W AO R T AY M
+wartimes W AO R T AY M Z
+wartman W AO R T M AH N
+warton W AO R T AH N
+warts W AO R T S
+wartzman W AO R T S M AH N
+warwick W AO R W IH K
+warwick's W AO R W IH K S
+wary W EH R IY
+warzecha W AO R Z EH HH AH
+was W AA Z
+was(2) W AH Z
+was(3) W AO Z
+wasatch W AA S AE CH
+wasch W AO SH
+wascher W AO SH ER
+wasco W AO S K OW
+wascom W AO S K AA M
+wasden W AO S D AH N
+waseda W AH S IY D AH
+wasem W AO S IH M
+wash W AA SH
+wash(2) W AO SH
+washabaugh W AO SH AH B AO
+washable W AA SH AH B AH L
+washam W AA SH AH M
+washbasin W AA SH B EY S AH N
+washboard W AA SH B AO R D
+washburn W AA SH B ER N
+washburne W AO SH B ER N
+washcloth W AA SH K L AO TH
+washed W AA SH T
+washer W AA SH ER
+washers W AA SH ER Z
+washes W AA SH IH Z
+washi's W AA SH IY Z
+washing W AA SH IH NG
+washington W AA SH IH NG T AH N
+washington's W AA SH IH NG T AH N Z
+washington's(2) W AO SH IH NG T AH N Z
+washington(2) W AO SH IH NG T AH N
+washingtonian W AA SH IH NG T OW N IY AH N
+washingtonian(2) W AO SH IH NG T OW N IY AH N
+washingtonians W AA SH IH NG T OW N IY AH N Z
+washingtonians(2) W AO SH IH NG T OW N IY AH N Z
+washko V AA SH K OW
+washoe W AA SH OW
+washout W AA SH AW T
+washouts W AA SH AW T S
+washroom W AA SH R UW M
+washtub W AA SH T AH B
+washy W AA SH IY
+wasielewski V AH S IY L EH F S K IY
+wasik V AA S IH K
+wasil W AO S AH L
+wasilewski V AH S IH L EH F S K IY
+wasinger W AO S IH N JH ER
+wasiyu W AH S IY UW
+waskiewicz V AA S K AH V IH CH
+wasko V AA S K OW
+waskow V AA S K OW
+wasley W AO S L IY
+wasmer W AO S AH M ER
+wasmund W AO Z M AH N D
+wasmuth W AO Z M UW TH
+wasn't W AA Z AH N T
+wasn't(2) W AH Z AH N T
+wason W AA S AH N
+wasp W AA S P
+wasp's W AA S P S
+wasps W AA S P S
+wass W AH S
+wass(2) W AA S
+wassel W AO S AH L
+wassell W AO S AH L
+wassenaar W AO S IH N AA R
+wasser W AO S ER
+wasserman W AA S ER M AH N
+wasserman's W AA S ER M AH N Z
+wasserstein W AA S ER S T IY N
+wasserstein(2) W AA S ER S T AY N
+wassilievitch W AA S IH L Y AH V IH CH
+wassily V AH S Y IH L Y IY
+wassink W AO S IH NG K
+wassman W AO S M AH N
+wassmer W AA S M ER
+wassom W AA S AH M
+wasson W AO S AH N
+wassum W AA S AH M
+waste W EY S T
+waste's W EY S T S
+wastebasket W EY S T B AE S K AH T
+wastebaskets W EY S T B AE S K AH T S
+wasted W EY S T AH D
+wasted(2) W EY S T IH D
+wasteful W EY S T F AH L
+wastefulness W EY S T F AH L N AH S
+wasteland W EY S T L AE N D
+wastepaper W EY S T P EY P ER
+waster W EY S T ER
+wasters W EY S T ER Z
+wastes W EY S T S
+wastewater W EY S T W AO T ER
+wasting W EY S T IH NG
+waszak V AA SH AH K
+waszkiewicz V AA SH K AH V IH CH
+wat W AO T
+watanabe W AA T AA N AA B EY
+watch W AA CH
+watch(2) W AO CH
+watchdog W AA CH D AO G
+watchdogs W AA CH D AO G Z
+watched W AA CH T
+watched(2) W AO CH T
+watcher W AA CH ER
+watchers W AA CH ER Z
+watches W AA CH AH Z
+watches(2) W AA CH IH Z
+watchful W AA CH F AH L
+watchin' W AA CH IH N
+watching W AA CH IH NG
+watchman W AA CH M AH N
+watchmen W AA CH M EH N
+watchorn W AO CH ER N
+watchword W AA CH W ER D
+watchwords W AA CH W ER D Z
+water W AO T ER
+water's W AO T ER Z
+water-repellent W AO T ER R IH P EH L AH N T
+waterbed W AO T ER B EH D
+waterbeds W AO T ER B EH D Z
+waterborne W AO T ER B AO R N
+waterbottle W AO T ER B AO T AH L
+waterbottles W AO T ER B AO T AH L Z
+waterbury W AO T ER B EH R IY
+watercolor W AO T ER K AH L ER
+watercolors W AO T ER K AH L ER Z
+watercress W AO T ER K R EH S
+watered W AO T ER D
+waterer W AO T ER ER
+waterfall W AO T ER F AO L
+waterfalls W AO T ER F AO L Z
+waterfield W AO T ER F IY L D
+waterford W AO T ER F ER D
+waterfowl W AO T ER F AW L
+waterfront W AO T ER F R AH N T
+waterfronts W AO T ER F R AH N T S
+watergate W AO T ER G EY T
+watergate(2) W AA T ER G EY T
+waterhouse W AO T ER HH AW S
+waterhouse's W AO T ER HH AW S IH Z
+watering W AO T ER IH NG
+waterishness W AO T ER IH SH N AH S
+waterlog W AO T ER L AA G
+waterlogged W AO T ER L AA G D
+waterloo W AO T ER L UW
+waterman W AO T ER M AH N
+waterman's W AO T ER M AH N Z
+watermark W AO T ER M AA R K
+watermarks W AO T ER M AA R K S
+watermelon W AO T ER M EH L AH N
+watermelons W AO T ER M EH L AH N Z
+watermen W AO T ER M AH N
+waterproof W AO T ER P R UW F
+waterproofing W AO T ER P R UW F IH NG
+waters W AO T ER Z
+watershed W AO T ER SH EH D
+watershed(2) W AA T ER SH EH D
+watersheds W AO T ER SH EH D Z
+watersheds(2) W AA T ER SH EH D Z
+waterson W AO T ER S AH N
+waterstein W AO T ER S T IY N
+waterstein(2) W AO T ER S T AY N
+waterston W AO T ER S T AH N
+waterstone W AO T ER S T OW N
+waterstone's W AO T ER S T OW N Z
+watertight W AO T ER T AY T
+watertown W AO T ER T AW N
+waterville W AO T ER V IH L
+waterway W AO T ER W EY
+waterways W AO T ER W EY Z
+waterwork W AO T ER W ER K
+waterworks W AO T ER W ER K S
+waterworld W AO T ER W ER L D
+waterworth W AO T ER W ER TH
+watery W AO T ER IY
+watford W AO T F ER D
+wathen W AO TH AH N
+watkin W AO T K IH N
+watkins W AA T K IH N Z
+watkins' W AA T K IH N Z
+watkinson W AO T K IH N S AH N
+watland W AA T L AH N D
+watley W AA T L IY
+watling W AO T AH L IH NG
+watling(2) W AO T L IH NG
+watlington W AO T AH L IH NG T AH N
+watlington(2) W AO T L IH NG T AH N
+watne W AO T N
+watrous W AA T R AH S
+watry W AA T R IY
+watsco W AA T S K OW
+watson W AA T S AH N
+watson's W AA T S AH N Z
+watsonville W AA T S AH N V IH L
+watt W AA T
+watt's W AA T S
+wattage W AA T AH JH
+wattenbarger W AO T IH N B AA R G ER
+wattenberg W AA T AH N B ER G
+wattenburg W AA T AH N B ER G
+watters W AA T ER Z
+wattie W AA T IY
+wattle W AA T AH L
+wattled W AA T AH L D
+wattles W AA T AH L Z
+wattleton W AA T AH L T AH N
+watton W AO T AH N
+watts W AA T S
+wattwil W AA T W IH L
+watwood W AO T W UH D
+watz W AA T S
+watzman W AA T S M AH N
+waugaman W AO G AH M AH N
+waugh W AO
+waugh's W AO Z
+waukegan W AO K IY G AH N
+waukesha W AO K IY SH AH
+wausau W AO S AO
+wauters W AW T ER Z
+wave W EY V
+waved W EY V D
+wavelength W EY V L EH NG TH
+wavelengths W EY V L EH NG TH S
+waver W EY V ER
+wavered W EY V ER D
+wavering W EY V ER IH NG
+waverley W EY V ER L IY
+waverly W EY V ER L IY
+waves W EY V Z
+wavetek W EY V T EH K
+waving W EY V IH NG
+wavra W AA V R AH
+wavy W EY V IY
+wawrzyniak W AA R Z IH N IY AE K
+wax W AE K S
+waxed W AE K S T
+waxes W AE K S IH Z
+waxing W AE K S IH NG
+waxler W AE K S L ER
+waxman W AE K S M AH N
+waxman's W AE K S M AH N Z
+waxy W AE K S IY
+way W EY
+way's W EY Z
+wayans W EY AH N Z
+wayans(2) HH W EY AH N Z
+waybright W EY B R AY T
+waycaster W EY K AE S T ER
+waye W EY
+waylaid W EY L EY D
+wayland W EY L AH N D
+waylay W EY L EY
+waylon W EY L AA N
+wayman W EY M AH N
+waymire W EY M AY R
+wayne W EY N
+wayne's W EY N Z
+waynesboro W EY N Z B ER OW
+waynesville W EY N Z V IH L
+waynick W EY N IH K
+ways W EY Z
+wayside W EY S AY D
+wayson W EY Z AH N
+wayt W EY T
+wayward W EY W ER D
+wazir W AA Z IH R
+wazir's W AA Z IH R Z
+we W IY
+we'd W IY D
+we'll W IY L
+we'll(2) W IH L
+we're W IY R
+we're(2) W IH R
+we're(3) W ER
+we've W IY V
+weak W IY K
+weaken W IY K AH N
+weakened W IY K AH N D
+weakening W IY K AH N IH NG
+weakens W IY K AH N Z
+weaker W IY K ER
+weakest W IY K AH S T
+weakland W IY K L AH N D
+weakley W IY K L IY
+weakling W IY K L IH NG
+weakly W IY K L IY
+weakness W IY K N AH S
+weaknesses W IY K N AH S AH Z
+weaknesses(2) W IY K N AH S IH Z
+weaks W IY K S
+wealth W EH L TH
+wealthier W EH L TH IY ER
+wealthiest W EH L TH IY AH S T
+wealths W EH L TH S
+wealthy W EH L TH IY
+wean W IY N
+weaned W IY N D
+weaning W IY N IH NG
+weant W IY N T
+weapon W EH P AH N
+weapon's W EH P AH N Z
+weaponry W EH P AH N R IY
+weapons W EH P AH N Z
+weapons' W EH P AH N Z
+wear W EH R
+wearable W EH R AH B AH L
+wearer W EH R ER
+wearers W EH R ER Z
+wearever W EH R EH V ER
+wearhouse W EH R HH AW S
+wearied W IH R IY D
+wearily W EH R AH L IY
+weariness W IH R IY N AH S
+wearing W EH R IH NG
+wearisome W IH R IY S AH M
+wears W EH R Z
+weary W IH R IY
+wearying W IY R IY IH NG
+wease W IY Z
+weasel W IY Z AH L
+weasellike W IY Z AH L L AY K
+weasels W IY Z AH L Z
+weast W IY S T
+weather W EH DH ER
+weather's W EH DH ER Z
+weatherall W EH DH ER AO L
+weatherbee W EH DH ER B IY
+weatherby W EH DH ER B IY
+weathered W EH DH ER D
+weatherford W EH DH ER F ER D
+weatherhead W EH DH ER HH EH D
+weatherholt W EH DH ER HH OW L T
+weatherholtz W EH DH ER HH OW L T S
+weathering W EH DH ER IH NG
+weatherington W EH DH ER IH NG T AH N
+weatherly W EH DH ER L IY
+weatherman W EH DH ER M AE N
+weathermen W EH DH ER M EH N
+weatherperson W EH TH ER P ER S AH N
+weatherproof W EH DH ER P R UW F
+weathers W EH DH ER Z
+weathersbee W EH DH ER Z B IY
+weathersby W EH DH ER S B IY
+weatherspoon W EH DH ER S P UW N
+weatherstone W EH DH ER S T OW N
+weatherwax W EH DH ER W AE K S
+weathington W EH TH IH NG T AH N
+weave W IY V
+weaved W IY V D
+weaver W IY V ER
+weaver's W IY V ER Z
+weaverling W IY V ER L IH NG
+weavers W IY V ER Z
+weaves W IY V Z
+weavil W IY V AH L
+weaving W IY V IH NG
+weavings W IY V IH NG Z
+web W EH B
+webb W EH B
+webb's W EH B Z
+webbed W EH B D
+webber W EH B ER
+webber's W EH B ER Z
+webbing W EH B IH NG
+webbs W EH B Z
+weber W EH B ER
+weber's V EY B ER Z
+weber's(2) W EH B ER Z
+weberg W EH B ER G
+webers W EH B ER Z
+webley W EH B L IY
+webmaster W EH B M AE S T ER
+webre W EH B ER
+webs W EH B Z
+website W EH B S AY T
+webster W EH B S T ER
+webster's W EH B S T ER Z
+websters W EH B S T ER Z
+wechsel W EH K S AH L
+wechsler W EH K S L ER
+wechsler(2) W EH SH L ER
+wecht W EH K T
+wecht's W EH K T S
+wechter W EH K T ER
+weck W EH K
+wecker W EH K ER
+weckerly W EH K ER L IY
+weckesser W EH K IH S ER
+weckwerth W EH K W ER TH
+wed W EH D
+wedbush W EH D B UH SH
+wedd W EH D
+wedded W EH D AH D
+wedded(2) W EH D IH D
+weddell W EH D AH L
+wedding W EH D IH NG
+weddings W EH D IH NG Z
+weddington W EH D IH NG T AH N
+weddle W EH D AH L
+wedekind W EH D IH K IH N D
+wedeking W EH D IH K IH NG
+wedel W EH D AH L
+wedell W EH D AH L
+wedemeyer W EH D IH M AY ER
+wedge W EH JH
+wedged W EH JH D
+wedges W EH JH AH Z
+wedges(2) W EH JH IH Z
+wedgestone W EH JH S T OW N
+wedgewood W EH JH W UH D
+wedgewood's W EH JH W UH D Z
+wedgeworth W EH JH W ER TH
+wedgwood W EH JH W UH D
+wedig W EH D IH G
+wedin W EH D IH N
+wedlock W EH D L AA K
+wednesday W EH N Z D IY
+wednesday's W EH N Z D IY Z
+wednesday's(2) W EH N Z D EY Z
+wednesday(2) W EH N Z D EY
+wednesdays W EH N Z D EY Z
+wednesdays(2) W EH N Z D IY Z
+wedowee W EH D AW W IY
+wedowee's W EH D AW W IY Z
+wedtech W EH D T EH K
+wedtech's W EH D T EH K S
+wee W IY
+weeber W IY B ER
+weech W IY CH
+weed W IY D
+weeded W IY D IH D
+weeden W IY D AH N
+weeding W IY D IH NG
+weedman W IY D M AH N
+weedon W IY D AH N
+weeds W IY D Z
+weedy W IY D IY
+weehawken W IY HH AO K AH N
+week W IY K
+week's W IY K S
+weekday W IY K D EY
+weekdays W IY K D EY Z
+weekend W IY K EH N D
+weekend's W IY K EH N D Z
+weekend(2) W IY K IH N D
+weekender W IY K EH N D ER
+weekends W IY K EH N D Z
+weekes W IY K S
+weekley W IY K L IY
+weeklies W IY K L IY Z
+weeklong W IY K L AO NG
+weekly W IY K L IY
+weekly's W IY K L IY Z
+weeks W IY K S
+weeks' W IY K S
+weems W IY M Z
+weeny W IY N IY
+weep W IY P
+weeping W IY P IH NG
+weeps W IY P S
+weepy W IY P IY
+weers W IY ER Z
+weerts W IH R T S
+weese W IY Z
+weesner W IY Z N ER
+weevil W IY V AH L
+weevils W IY V AH L Z
+wegbreit W EH G B R AY T
+wege W IY JH
+wegener W EH G IY N ER
+weger W IY G ER
+weglarz W EH G L AA R Z
+wegman W EH G M AH N
+wegmann W EH G M AH N
+wegner W EH G N ER
+wegrzyn W EH G ER Z IH N
+wehde W EH D
+wehe W IY HH
+wehlan W EH L AH N
+wehle W EH L IY
+wehler W EH L ER
+wehling W EH L IH NG
+wehman W EH M AH N
+wehmeier W EH M AY ER
+wehmeyer W EH M AY ER
+wehner W EH N ER
+wehr W EH R
+wehrenberg W EH R AH N B ER G
+wehrheim W EH R HH AY M
+wehrle W EH R AH L
+wehrli W EH R L IY
+wehrly W EH R L IY
+wehrman W EH R M AH N
+wehrmann W EH R M AH N
+wehunt W EH HH AH N T
+wei W EY
+weiand W AY AH N D
+weibel W AY B AH L
+weible W IY B AH L
+weich W AY K
+weichel W AY K AH L
+weichert W AY K ER T
+weichman W AY K M AH N
+weicht W AY K T
+weick W IY K
+weicker W AY K ER
+weicker's W AY K ER Z
+weida V AY D AH
+weide W AY D IY
+weidel W AY D AH L
+weideman W AY D M AH N
+weidemann W AY D M AH N
+weidenbach W AY D IH N B AA K
+weidenbaum W AY D AH N B AW M
+weidenfeld W AY D AH N F EH L D
+weider W AY D ER
+weiderman W AY D ER M AH N
+weidig W AY D IH G
+weidinger W AY D IH NG ER
+weidler W AY D AH L ER
+weidler(2) W AY D L ER
+weidlich W AY D L IH K
+weidman W AY D M AH N
+weidmann W AY D M AH N
+weidner W AY D N ER
+weier W EY ER
+weigand W AY G AH N D
+weigandt W AY G AH N T
+weigel W AY G AH L
+weigelt W AY G IH L T
+weigert W AY G ER T
+weigh W EY
+weighed W EY D
+weighing W EY IH NG
+weighs W EY Z
+weight W EY T
+weighted W EY T IH D
+weighting W EY T IH NG
+weightings W EY T IH NG Z
+weightless W EY T L AH S
+weightlessness W EY T L AH S N AH S
+weightlifter W EY T L IH F T ER
+weightlifters W EY T L IH F T ER Z
+weightlifting W EY T L IH F T IH NG
+weightman W AY T M AH N
+weights W EY T S
+weighty W EY T IY
+weigl W IY G AH L
+weigle W IY G AH L
+weigold W AY G OW L D
+weihe W IY HH
+weiher W AY HH ER
+weik W IY K
+weikel W AY K AH L
+weiker W AY K ER
+weikert W AY K ER T
+weikle W IY K AH L
+weil W AY L
+weil's W AY L Z
+weil(2) W IY L
+weiland W AY L AH N D
+weilbacher W AY L B AA K ER
+weild W AY L D
+weild(2) W IY L D
+weiler W AY L ER
+weill W AY L
+weill's W AY L Z
+weiman W AY M AH N
+weimann W AY M AH N
+weimar V AY M AA R
+weimer W AY M ER
+weimeyer W AY M AY ER
+wein W IY N
+weinand W AY N AH N D
+weinbach W AY N B AA K
+weinbaum W AY N B AW M
+weinberg W AY N B ER G
+weinberger W AY N B ER G ER
+weinberger's W AY N B ER G ER Z
+weindel W AY N D AH L
+weinel W AY N AH L
+weiner W AY N ER
+weinert W AY N ER T
+weinfeld W AY N F EH L D
+weingart W AY NG G AA R T
+weingarten W AY N G AA R T AH N
+weingartner W AY NG G AA R T N ER
+weinger W AY N G ER
+weinhardt W AY N HH AA R T
+weinheimer W AY N HH AY M ER
+weinhold W AY N HH OW L D
+weininger W AY N IH NG ER
+weinkauf W AY NG K AW F
+weinman W AY N M AH N
+weinmann W AY N M AH N
+weinreb W AY N R IH B
+weinreich W AY N R AY K
+weinrich W AY N R IH K
+weinroth W AY N R AO TH
+weins W IY N Z
+weinstein W AY N S T AY N
+weinstein's W AY N S T AY N Z
+weinstein's(2) W AY N S T IY N Z
+weinstein(2) W AY N S T IY N
+weinstock W AY N S T AA K
+weintraub W AY N T R AW B
+weintz W AY N T S
+weintz' W AY N T S
+weintz's W AY N T S IH Z
+weinzierl W AY N Z IH R L
+weipert W AY P ER T
+weir W IY R
+weir's W IY R Z
+weirauch W AY R AW K
+weird W IH R D
+weirder W IH R D ER
+weirdest W IH R D AH S T
+weirdly W IH R D L IY
+weirdness W IH R D N AH S
+weirdo W IH R D OW
+weirdos W IH R D OW Z
+weirich W AY R IH K
+weirick W AY R IH K
+weirton W IH R T AH N
+weirton's W IH R T AH N Z
+weis W AY S
+weisbach W AY S B AA K
+weisbecker W AY S B EH K ER
+weisberg W AY S B ER G
+weisberger W AY S B ER G ER
+weisbrod W AY S B R AA D
+weisbrot W AY S B R AH T
+weischedel W AY SH AH D AH L
+weise W IY S
+weisel W AY S AH L
+weisel(2) W AY Z AH L
+weisel(3) W IY Z EH L
+weiseman W AY S AH M AH N
+weisenbach W AY S IH N B AA K
+weisenbach(2) W AY Z IH N B AA K
+weisenberg W AY S AH N B ER G
+weisenberg(2) W AY Z AH N B ER G
+weisenberger W AY S AH N B ER G ER
+weisenberger(2) W AY Z AH N B ER G ER
+weisenborn W AY S IH N B ER N
+weisenborn(2) W AY Z IH N B ER N
+weisenburger W AY S AH N B ER G ER
+weisenburger(2) W AY S IH N B ER G ER
+weisensel W AY S IH N S AH L
+weisensel(2) W AY Z IH N S AH L
+weisenthal W AY S IH N TH AA L
+weisenthal(2) W AY Z IH N TH AA L
+weiser W AY S ER
+weisfeld W AY S F EH L D
+weisfield's W AY S F IY L D Z
+weisgerber W AY S G ER B ER
+weishaar W AY SH AA R
+weishaupt W AY SH AW P T
+weisheit W AY SH AY T
+weisinger W AY S IH N JH ER
+weiskopf W AY S K AO F
+weisman W AY S M AH N
+weismann W AY S M AH N
+weisner W AY S N ER
+weiss W AY S
+weiss's W AY S IH Z
+weissberg W AY S B ER G
+weisse W AY S
+weissenborn W AY S IH N B ER N
+weisser W AY S ER
+weissert W AY S ER T
+weissinger W AY S IH N JH ER
+weissman W AY S M AH N
+weissmann W AY S M AH N
+weist W IY IH S T
+weist(2) W AY S T
+weisz V AY SH
+weitek W EY T EH K
+weith W IY TH
+weitkamp W AY T K AE M P
+weitler W AY T L ER
+weitman W AY T M AH N
+weitz W IY T S
+weitzel W AY T Z AH L
+weitzen W AY T S AH N
+weitzman W AY T S M AH N
+weitzman's W AY T S M AH N Z
+weitzner W AY T S N ER
+weizman W AY Z M AH N
+weizsaecker W AY S AE K ER
+weksel W EH K S AH L
+welbilt W EH L B IH L T
+welbilt's W EH L B IH L T S
+welborn W EH L B ER N
+welborne W EH L B ER N
+welby W EH L B IY
+welch W EH L CH
+welch's W EH L CH IH Z
+welchel W EH L CH AH L
+welcher W EH L CH ER
+welcome W EH L K AH M
+welcomed W EH L K AH M D
+welcomes W EH L K AH M Z
+welcoming W EH L K AH M IH NG
+weld W EH L D
+weld's W EH L D Z
+welded W EH L D IH D
+welden W EH L D AH N
+welder W EH L D ER
+welders W EH L D ER Z
+weldin W EH L D IH N
+welding W EH L D IH NG
+weldon W EH L D AH N
+weldon's W EH L D AH N Z
+welds W EH L D Z
+weldwood W EH L D W UH D
+weldy W EH L D IY
+welfare W EH L F EH R
+welford W EH L F ER D
+welge W EH L JH
+welinder W EH L IH N D ER
+welinsk W EH L IH N S K
+welk W EH L K
+welke W EH L K
+welker W EH L K ER
+well W EH L
+well-doer W EH L D UW R
+welland W EH L AH N D
+wellbeing W EH L B IY IH NG
+wellborn W EH L B AO R N
+wellbrock W EH L B R AH K
+wellco W EH L K OW
+wellcome W EH L K AH M
+wellcome's W EH L K AH M Z
+welle W EH L
+wellek W EH L EH K
+wellen W EH L AH N
+wellendorf W EH L IH N D AO R F
+wellens W EH L AH N Z
+weller W EH L ER
+welles W EH L Z
+welles' W EH L Z
+wellesley W EH L Z L IY
+wellfleet W EH L F L IY T
+wellhead W EH L HH EH D
+wellies W EH L IY Z
+welling W EH L IH NG
+wellington W EH L IH NG T AH N
+wellington's W EH L IH NG T AH N Z
+welliver W EH L IH V ER
+wellman W EH L M AH N
+wellner W EH L N ER
+wellness W EH L N AH S
+wellnitz W EH L N IH T S
+wellons W EH L AH N Z
+wellpoint W EH L P OY N T
+wells W EH L Z
+wells's W EH L Z IH Z
+wellspring W EH L S P R IH NG
+wellstone W EH L S OW N
+wellstone's W EH L S OW N Z
+welltech W EH L T EH K
+welna W EH L N AH
+welp W EH L P
+welsch W EH L SH
+welser W EH L S ER
+welsh W EH L CH
+welsh(2) W EH L SH
+welshans W EH L SH AH N Z
+welt W EH L T
+welte W EH L T
+welter W EH L T ER
+welterweight W EH L T ER W EY T
+weltman W EH L T M AH N
+welton W EH L T AH N
+welty W EH L T IY
+weltz W EH L T S
+welz W EH L Z
+wembley W EH M B L IY
+wemhoff W EH M HH AO F
+wemmer W EH M ER
+wempe W EH M P
+wemple W EH M P AH L
+wen W EH N
+wenatchee W AH N AE CH IY
+wenberg W EH N B ER G
+wenceslaus W EH N S AH S L AO S
+wenches W EH N CH IH Z
+wenchester W EH N CH EH S T ER
+wenchester's W EH N CH EH S T ER Z
+wenck W EH NG K
+wend W EH N D
+wenda W EH N D AH
+wende W EH N D
+wendel W EH N D AH L
+wendeline W EH N D IH L AY N
+wendelken W EH N D IH L K AH N
+wendell W EH N D AH L
+wender W EH N D ER
+wenders W EH N D ER Z
+wending W EH N D IH NG
+wendland W EH N D L AH N D
+wendlandt W EH N D L AH N T
+wendler W EH N D L ER
+wendling W EH N D L IH NG
+wendorf W EH N D AO R F
+wendorff W EH N D AO R F
+wends W EH N D Z
+wendt W EH N T
+wendy W EH N D IY
+wendy's W EH N D IY Z
+wenfan W EH N F AE N
+weng W EH NG
+wenge W EH N JH
+wenge(2) W EH NG
+wenger W EH NG ER
+wengerd W EH NG G ER D
+wengert W EH NG G ER T
+wengler W IH NG AH L ER
+wengler(2) W IH NG G L ER
+wenig W EH N IH G
+weniger W EH N IH G ER
+weninger W EH N IH NG ER
+wenk W EH NG K
+wenke W EH NG K
+wenker W EH NG K ER
+wennberg W EH N B ER G
+wenner W EH N ER
+wennerstrom W EH N ER S T R AH M
+wenning W EH N IH NG
+wenninger W EH N IH NG ER
+wenona W EH N AH N AH
+wenrich W EH N R IH K
+wenrick W EH N R IH K
+wensberg W EH N Z B ER G
+wensel W EH N S AH L
+wenstrom W EH N S T R AH M
+went W EH N T
+wente W EH N T
+wentland W EH N T L AH N D
+wentling W EH N T L IH NG
+wentworth W EH N T W ER TH
+wentz W EH N T S
+wentzel W EH N T Z AH L
+wentzell W EH N T Z AH L
+wentzville W EH N T S V IH L
+wenz W EH N Z
+wenzel W EH N Z AH L
+wenzhou W EH N Z UW
+wenzl W EH N Z AH L
+wenzler W EH N Z L ER
+wenzlick W EH N Z L IH K
+weppler W EH P L ER
+wept W EH P T
+werber W ER B ER
+werden W ER D AH N
+werder W ER D ER
+werdesheim W ER D Z HH AY M
+were W ER
+wereldhave W EH R AH L D HH AA V EY
+weren't W ER AH N T
+weren't(2) W ER N T
+werewolf W EH R W UH L F
+wergin W ER G IH N
+werk W ER K
+werke W ER K
+werkheiser W ER K HH AY S ER
+werking W ER K IH NG
+werkmeister W ER K M AY S T ER
+werle W AO R AH L
+werley W ER L IY
+werling W ER L IH NG
+werman W ER M AH N
+wermer W ER M ER
+wermiel W ER M IY AH L
+wermuth W ER M UW TH
+werne W ER N AH
+wernecke W ER N IH K
+werner W ER N ER
+werner's W ER N ER Z
+wernert W ER N ER T
+wernet W ER N IH T
+wernette W ER N EH T
+wernick W ER N IH K
+wernicke W ER N IH K
+wernimont W ER N IH M AH N T
+werning W ER N IH NG
+wernli W ER N L IY
+werntz W ER N T S
+werre W EH R
+werry W EH R IY
+werst W ER S T
+wert W ER T
+wertenberger W ER T AH N B ER G ER
+werth W ER TH
+wertheim W ER T HH AY M
+wertheimer W ER T HH AY M ER
+werther W ER DH ER
+wertman W ER T M AH N
+werts W ER T S
+wertz W ER T S
+wery W EH R IY
+wes W EH S
+wesat W EH S AE T
+wesat(2) W IY S AE T
+wesch W EH SH
+wesche W EH SH
+wesco W EH S K OW
+wescoat W EH S K OW T
+wescott W EH S K AA T
+weseloh W EY S EY L OW
+wesely W IY Z L IY
+weseman W IY Z M AH N
+wesemann W IY Z M AH N
+wesenberg W IY Z AH N B ER G
+wesker W EH S K ER
+wesker's W EH S K ER Z
+wesler W EH S AH L ER
+wesler(2) W EH S L ER
+wesley W EH S L IY
+wesleyan W EH Z L IY AH N
+weslia W EH S L IY AH
+weslia(2) HH W EH S L IY AH
+wesner W EH S N ER
+wesolek W EH S AH L IH K
+wesolowski V IH S AH L AO F S K IY
+wesp W EH S P
+wespac W EH S P AE K
+wespercorp W EH S P ER K AO R P
+wesray W EH S R EY
+wess W EH S
+wessel W EH S AH L
+wessell W EH S AH L
+wessells W EH S AH L Z
+wesselman W EH S AH L M AH N
+wessels W EH S AH L Z
+wessex W EH S AH K S
+wessinger W EH S IH N JH ER
+wessler W EH S L ER
+wessling W EH S AH L IH NG
+wessling(2) W EH S L IH NG
+wessman W EH S M AH N
+wessner W EH S N ER
+wesson W EH S AH N
+west W EH S T
+west's W EH S T S
+westair W EH S T EH R
+westall W EH S T AH L
+westall's W EH S T AH L Z
+westamerica W EH S T AH M EH R IH K AH
+westamerica's W EH S T AH M EH R IH K AH Z
+westar W EH S T ER
+westbay W EH S T B EY
+westberg W EH S T B ER G
+westberry W EH S T B EH R IY
+westboro W EH S T B ER OW
+westborough W EH S T B ER OW
+westbound W EH S T B AW N D
+westbridge W EH S T B R IH JH
+westbrook W EH S T B R UH K
+westbrooks W EH S T B R UH K S
+westburne W EH S T B ER N
+westbury W EH S T B EH R IY
+westby W EH S T B IY
+westcap W EH S T K AE P
+westchester W EH S T CH EH S T ER
+westchester's W EH S T CH EH S T ER Z
+westcoast W EH S T K OW S T
+westcoast's W EH S T K OW S T S
+westcorp W EH S T K AO R P
+westcott W EH S T K AA T
+westdeutsche W EH S T D OY CH
+westech W EH S T EH K
+westen W EH S T AH N
+westenberger W EH S T AH N B ER G ER
+westendorf W EH S T IH N D AO R F
+wester W EH S T ER
+westerbeck W EH S T ER B EH K
+westerberg W EH S T ER B ER G
+westerdam W EH S T ER D AE M
+westerdam's W EH S T ER D AE M Z
+westerfeld W EH S T ER F EH L D
+westerfield W EH S T ER F IY L D
+westergaard W EH S T ER G AA R D
+westergard W EH S T ER G ER D
+westergren W EH S T ER G R EH N
+westerhoff W EH S T ER HH AO F
+westerhold W EH S T ER HH OW L D
+westerlies W EH S T ER L IY Z
+westerlund W EH S T ER L AH N D
+westerly W EH S T ER L IY
+westerman W EH S T ER M AH N
+westermann W EH S T ER M AH N
+westermeyer W EH S T ER M AY ER
+western W EH S T ER N
+western's W EH S T ER N Z
+western(2) HH W EH S T ER N
+westerner W EH S T ER N ER
+westerners W EH S T ER N ER Z
+westernization W EH S T ER N IH Z EY SH AH N
+westernize W EH S T ER N AY Z
+westernized W EH S T ER N AY Z D
+westernmost W EH S T ER N M OW S T
+westerns W EH S T ER N Z
+westervelt W EH S T ER V IH L T
+westfaelisches W EH S T F EY L IH SH IH Z
+westfahl W EH S T F AA L
+westfall W EH S T F AO L
+westfed W EH S T F EH D
+westfield W EH S T F IY L D
+westford W EH S T F ER D
+westgate W EH S T G EY T
+westhampton W EH S T HH AE M P T AH N
+westheimer W EH S T HH AY M ER
+westhoff W EH S T HH AO F
+westin W EH S T IH N
+westinghouse W EH S T IH NG HH AW S
+westinghouse's W EH S T IH NG HH AW S IH Z
+westlake W EH S T L EY K
+westland W EH S T L AH N D
+westleigh W EH S T L AY
+westley W EH S T L IY
+westling W EH S T L IH NG
+westlund W EH S T L AH N D
+westman W EH S T M AH N
+westmarc W EH S T M AA R K
+westmark W EH S T M AA R K
+westmark's W EH S T M AA R K S
+westmin W EH S T M IH N
+westminster W EH S T M IH N S T ER
+westmoreland W EH S T M AO R L AH N D
+weston W EH S T AH N
+westover W EH S T OW V ER
+westpac W EH S T P AE K
+westpac's W EH S T P AE K S
+westphal W EH S T F AH L
+westphalen W EH S T F AH L AH N
+westphalia W EH S T F EY L IY AH
+westphalia(2) W EH S T F EY L Y AH
+westport W EH S T P AO R T
+westpride W EH S T P R AY D
+westra W EH S T R AH
+westrich W EH S T R IH K
+westrick W EH S T R IH K
+westridge W EH S T R IH JH
+westrom W EH S T R AH M
+westrum W EH S T R AH M
+westrup W EH S T R AH P
+westside W EH S T S AY D
+westtech W EH S T EH K
+westtech's W EH S T EH K S
+westvaco W EH S T V AE K OW
+westward W EH S T W ER D
+westwards W EH S T W ER D Z
+westwood W EH S T W UH D
+westwood's W EH S T W UH D Z
+westworld W EH S T W ER L D
+wesun W IY S AH N
+wet W EH T
+wetherbee W EH DH ER B IY
+wetherby W EH TH ER B IY
+wetherell W EH TH ER AH L
+wetherill W EH TH ER AH L
+wetherington W EH DH ER IH NG T AH N
+wetherly W EH DH ER L IY
+wethington W EH TH IH NG T AH N
+wetland W EH T L AE N D
+wetlands W EH T L AE N D Z
+wetlands' W EH T L AE N D Z
+wetmore W EH T M AO R
+wetness W EH T N AH S
+wetsel W EH T S AH L
+wetstein W EH T S T IY N
+wetstein(2) W EH T S T AY N
+wetsuit W EH T S UW T
+wettengel W EH T IH NG G AH L
+wetter W EH T ER
+wetterau W EH T ER AW
+wettergreen W EH T ER G R IY N
+wettest W EH T AH S T
+wetting W EH T IH NG
+wetting(2) HH W EH T IH NG
+wettlaufer W EH T L AW F ER
+wettstein W EH T S T AY N
+wettstein(2) W EH T S T IY N
+wetz W EH T S
+wetzel W EH T Z AH L
+wetzler W EH T S L ER
+wetzstein W EH T S T AY N
+wetzstein(2) W EH T S T IY N
+wever W IY V ER
+wexler W EH K S L ER
+wexner W EH K S N ER
+wey W EY
+weyand W EY AH N D
+weyandt W EY AH N T
+weyant W EY AH N T
+weyenberg W AY N B ER G
+weyer W EY ER
+weyerhaeuser W EH R HH AW Z ER
+weyerhaeuser's W EH R HH AW Z ER Z
+weyers W EY ER Z
+weyforth W EY F AO R TH
+weygandt W EY G AH N T
+weyhrauch W EY R AW K
+weyl W EY L
+weyland W EY L AH N D
+weylin W EY L IH N
+weyman W EY M AH N
+weymer W EY M ER
+weymouth W EY M AH TH
+weyrauch W EH R AW K
+weyrich W EH R IH K
+weyrick W EY R IH K
+whack W AE K
+whack(2) HH W AE K
+whacked W AE K T
+whacked(2) HH W AE K T
+whacker W AE K ER
+whacker(2) HH W AE K ER
+whacking W AE K IH NG
+whacking(2) HH W AE K IH NG
+whacko W AE K OW
+whacks W AE K S
+whacks(2) HH W AE K S
+whale W EY L
+whale's W EY L Z
+whale's(2) HH W EY L Z
+whale(2) HH W EY L
+whalen W EY L AH N
+whalen(2) HH W EY L AH N
+whaler W EY L ER
+whaler(2) HH W EY L ER
+whalers W EY L ER Z
+whalers(2) HH W EY L ER Z
+whales W EY L Z
+whales(2) HH W EY L Z
+whaley W EY L IY
+whaley(2) HH W EY L IY
+whalin W AE L IH N
+whaling W EY L IH NG
+whaling(2) HH W EY L IH NG
+whalley W AE L IY
+wham W AE M
+wham(2) HH W AE M
+whammy W AE M IY
+whammy(2) HH W AE M IY
+whampoa W AE M P OW AH
+whan W AE N
+whan(2) HH W AE N
+whang W AE NG
+whang(2) HH W AE NG
+wharf W AO R F
+wharf's W AO R F S
+wharf's(2) HH W AO R F S
+wharf(2) HH W AO R F
+wharff W AA R F
+wharff(2) HH W AA R F
+wharfs W AO R F S
+wharfs(2) HH W AO R F S
+wharry W AE R IY
+wharry(2) HH W AE R IY
+wharton W AO R T AH N
+wharton's W AO R T AH N Z
+what W AH T
+what'd W AH T IH D
+what'd(2) HH W AH T IH D
+what'll W AH T AH L
+what'll(2) HH W AH T AH L
+what're W AH T ER
+what're(2) HH W AH T ER
+what's W AH T S
+what's(2) HH W AH T S
+what(2) HH W AH T
+whate W EY T
+whatever W AH T EH V ER
+whatever's W AH T EH V ER Z
+whatever's(2) HH W AH T EH V ER Z
+whatever(2) HH W AH T EH V ER
+whatley W AH T L IY
+whatley(2) HH W AH T L IY
+whatnot W AH T N AA T
+whatnot(2) HH W AH T N AA T
+whats W AH T S
+whats(2) HH W AH T S
+whatsoever W AH T S OW EH V ER
+whatsoever(2) HH W AH T S OW EH V ER
+whay-yu W EY Y UW
+whay-yu(2) HH W EY Y UW
+wheat W IY T
+wheat(2) HH W IY T
+wheaten W IY T AH N
+wheaten(2) HH W IY T AH N
+wheatie W IY T IY
+wheatie(2) HH W IY T IY
+wheaties W IY T IY Z
+wheaties(2) HH W IY T IY Z
+wheatley W IY T L IY
+wheatley(2) HH W IY T L IY
+wheatly W IY T L IY
+wheatly(2) HH W IY T L IY
+wheaton W IY T AH N
+wheaton(2) HH W IY T AH N
+whedbee W EH D B IY
+whedbee(2) HH W EH D B IY
+whedon W EH D AH N
+whedon(2) HH W EH D AH N
+wheel W IY L
+wheel(2) HH W IY L
+wheelabrator W IY L AH B R EY T ER
+wheelabrator(2) HH W IY L AH B R EY T ER
+wheelan W IY L AH N
+wheelan(2) HH W IY L AH N
+wheeland W IY L AH N D
+wheeland(2) HH W IY L AH N D
+wheelbarrow W IY L B EH R OW
+wheelbarrow(2) HH W IY L B EH R OW
+wheelbarrows W IY L B EH R OW Z
+wheelbarrows(2) HH W IY L B EH R OW Z
+wheelbase W IY L B EY S
+wheelbase(2) HH W IY L B EY S
+wheelchair W IY L CH EH R
+wheelchair(2) HH W IY L CH EH R
+wheelchairs W IY L CH EH R Z
+wheelchairs(2) HH W IY L CH EH R Z
+wheeldon W IY L D AH N
+wheeldon(2) HH W IY L D AH N
+wheeled W IY L D
+wheeled(2) HH W IY L D
+wheeler W IY L ER
+wheeler's W IY L ER Z
+wheeler's(2) HH W IY L ER Z
+wheeler(2) HH W IY L ER
+wheelers W IY L ER Z
+wheelers(2) HH W IY L ER Z
+wheeless W IY L AH S
+wheeless(2) HH W IY L AH S
+wheeling W IY L IH NG
+wheeling's W IY L IH NG Z
+wheeling's(2) HH W IY L IH NG Z
+wheeling(2) HH W IY L IH NG
+wheelis W IY L IH S
+wheelis(2) HH W IY L IH S
+wheelock W IY L AA K
+wheelock(2) HH W IY L AA K
+wheelon W IY L AH N
+wheelon(2) HH W IY L AH N
+wheels W IY L Z
+wheels(2) HH W IY L Z
+wheelus W IY L AH S
+wheelus(2) HH W IY L AH S
+wheelwright W IY L R AY T
+wheelwright(2) HH W IY L R AY T
+wheelwriter W IY L R AY T ER
+wheelwriter(2) HH W IY L R AY T ER
+wheeze W IY Z
+wheeze(2) HH W IY Z
+wheezes W IY Z AH Z
+wheezes(2) HH W IY Z AH Z
+wheezes(3) W IY Z IH Z
+wheezing W IY Z IH NG
+wheezing(2) HH W IY Z IH NG
+whelan W EH L AH N
+whelan(2) HH W EH L AH N
+whelan(3) HH W IY L AH N
+whelan(4) W IY L AH N
+whelchel W EH L CH AH L
+whelchel(2) HH W EH L CH AH L
+wheless W IY L IH S
+wheless(2) HH W IY L IH S
+whelpley W EH L P L IY
+whelpley(2) HH W EH L P L IY
+whelton W EH L T AH N
+whelton(2) HH W EH L T AH N
+when W EH N
+when'll W EH N AH L
+when'll(2) HH W EH N AH L
+when's W EH N Z
+when's(2) HH W EH N Z
+when(2) HH W EH N
+when(3) W IH N
+when(4) HH W IH N
+whence W EH N S
+whence(2) HH W EH N S
+whenever W EH N EH V ER
+whenever(2) HH W EH N EH V ER
+where W EH R
+where'd W EH R D
+where'd(2) HH W EH R D
+where's W EH R Z
+where's(2) HH W EH R Z
+where(2) HH W EH R
+whereabouts W EH R AH B AW T S
+whereabouts(2) HH W EH R AH B AW T S
+whereas W EH R AE Z
+whereas(2) HH W EH R AE Z
+whereby W EH R B AY
+whereby(2) HH W EH R B AY
+wherein W EH R IH N
+wherein(2) HH W EH R IH N
+whereupon W EH R AH P AA N
+whereupon(2) HH W EH R AH P AA N
+wherever W EH R EH V ER
+wherever(2) HH W EH R EH V ER
+wherewithal W EH R W IH DH AO L
+wherewithal(2) HH W EH R W IH DH AO L
+wherley W ER L IY
+wherley(2) HH W ER L IY
+wherry W EH R IY
+wherry(2) HH W EH R IY
+whet W EH T
+whet(2) HH W EH T
+whether W EH DH ER
+whether(2) HH W EH DH ER
+whetsel W EH T S AH L
+whetsel(2) HH W EH T S AH L
+whetsell W EH T S AH L
+whetsell(2) HH W EH T S AH L
+whetstine W EH T S T IY N
+whetstine(2) HH W EH T S T IY N
+whetstone W EH T S T OW N
+whetstone(2) HH W EH T S T OW N
+whetted W EH T IH D
+whetted(2) HH W EH T IH D
+whetzel W EH T Z AH L
+whetzel(2) HH W EH T Z AH L
+whew W UW
+whew(2) HH W UW
+whew(3) HH Y UW
+whey W EY
+whey(2) HH W EY
+which W IH CH
+which're W IH CH ER
+which're(2) HH W IH CH ER
+which's W IH CH IH Z
+which's(2) HH W IH CH IH Z
+which(2) HH W IH CH
+whichard W IH CH ER D
+whichard(2) HH W IH CH ER D
+whichever W IH CH EH V ER
+whichever(2) HH W IH CH EH V ER
+whicker W IH K ER
+whicker(2) HH W IH K ER
+whidby W IH D B IY
+whidby(2) HH W IH D B IY
+whidden W IH D AH N
+whidden(2) HH W IH D AH N
+whiddon W IH D AH N
+whiddon(2) HH W IH D AH N
+whiff W IH F
+whiff(2) HH W IH F
+whig W IH G
+whig(2) HH W IH G
+whigham W IH G AH M
+whigham(2) HH W IH G AH M
+whigs W IH G Z
+whigs(2) HH W IH G Z
+whilden W AY L D AH N
+whilden(2) HH W AY L D AH N
+while W AY L
+while(2) HH W AY L
+whiles W AY L Z
+whiles(2) HH W AY L Z
+whilst W AY L S T
+whim W IH M
+whim(2) HH W IH M
+whimper W IH M P ER
+whimper(2) HH W IH M P ER
+whimpering W IH M P ER IH NG
+whimpering(2) HH W IH M P ER IH NG
+whims W IH M Z
+whims(2) HH W IH M Z
+whimsical W IH M Z IH K AH L
+whimsical(2) HH W IH M Z IH K AH L
+whimsically W IH M Z IH K L IY
+whimsically(2) HH W IH M Z IH K L IY
+whimsy W IH M S IY
+whimsy(2) HH W IH M S IY
+whine W AY N
+whine(2) HH W AY N
+whiner W AY N ER
+whiner(2) HH W AY N ER
+whiners W AY N ER Z
+whiners(2) HH W AY N ER Z
+whinery W AY N ER IY
+whinery(2) HH W AY N ER IY
+whines W AY N Z
+whines(2) HH W AY N Z
+whining W AY N IH NG
+whining(2) HH W AY N IH NG
+whinnery W IH N ER IY
+whinnery(2) HH W IH N ER IY
+whinney W IH N IY
+whinney(2) HH W IH N IY
+whiny W AY N IY
+whiny(2) HH W AY N IY
+whip W IH P
+whip(2) HH W IH P
+whipkey W IH P K IY
+whipkey(2) HH W IH P K IY
+whiplash W IH P L AE SH
+whiplash(2) HH W IH P L AE SH
+whiplashes W IH P L AE SH AH Z
+whiplashes(2) HH W IH P L AE SH AH Z
+whipp W IH P
+whipp(2) HH W IH P
+whippany W IH P AH N IY
+whippany(2) HH W IH P AH N IY
+whipped W IH P T
+whipped(2) HH W IH P T
+whipping W IH P IH NG
+whipping(2) HH W IH P IH NG
+whipple W IH P AH L
+whipple's W IH P AH L Z
+whipple's(2) HH W IH P AH L Z
+whipple(2) HH W IH P AH L
+whippoorwills W IH P ER W IH L Z
+whippoorwills(2) HH W IH P ER W IH L Z
+whipps W IH P S
+whipps(2) HH W IH P S
+whips W IH P S
+whips(2) HH W IH P S
+whipsaw W IH P S AO
+whipsaw(2) HH W IH P S AO
+whipsawed W IH P S AO D
+whipsawed(2) HH W IH P S AO D
+whipsawing W IH P S AO IH NG
+whipsawing(2) HH W IH P S AO IH NG
+whirl W ER L
+whirl(2) HH W ER L
+whirled W ER L D
+whirled(2) HH W ER L D
+whirley W ER L IY
+whirley(2) HH W ER L IY
+whirling W ER L IH NG
+whirling(2) HH W ER L IH NG
+whirlpool W ER L P UW L
+whirlpool's W ER L P UW L Z
+whirlpool's(2) HH W ER L P UW L Z
+whirlpool(2) HH W ER L P UW L
+whirlpools W ER L P UW L Z
+whirlpools(2) HH W ER L P UW L Z
+whirlwind W ER L W IH N D
+whirlwind(2) HH W ER L W IH N D
+whirring W ER IH NG
+whirring(2) HH W ER IH NG
+whisenand W IH S IH N AE N D
+whisenand(2) HH W IH S IH N AE N D
+whisenant W IH S IH N AH N T
+whisenant(2) HH W IH S IH N AH N T
+whisenhunt W AY Z AH N HH AH N T
+whisenhunt(2) HH W AY Z AH N HH AH N T
+whisk W IH S K
+whisk(2) HH W IH S K
+whisked W IH S K T
+whisked(2) HH W IH S K T
+whisker W IH S K ER
+whisker(2) HH W IH S K ER
+whiskers W IH S K ER Z
+whiskers(2) HH W IH S K ER Z
+whiskey W IH S K IY
+whiskey(2) HH W IH S K IY
+whiskeys W IH S K IY Z
+whiskeys(2) HH W IH S K IY Z
+whisks W IH S K S
+whisks(2) HH W IH S K S
+whisky W IH S K IY
+whisky(2) HH W IH S K IY
+whisler W IH S L ER
+whisler(2) HH W IH S L ER
+whisman W IH S M AH N
+whisman(2) HH W IH S M AH N
+whisnant W IH S N AH N T
+whisnant(2) HH W IH S N AH N T
+whisner W IH S N ER
+whisner(2) HH W IH S N ER
+whisonant W IH S AH N AH N T
+whisper W IH S P ER
+whisper(2) HH W IH S P ER
+whispered W IH S P ER D
+whispered(2) HH W IH S P ER D
+whispering W IH S P ER IH NG
+whispering(2) HH W IH S P ER IH NG
+whispers W IH S P ER Z
+whispers(2) HH W IH S P ER Z
+whistle W IH S AH L
+whistle(2) HH W IH S AH L
+whistleblower W IH S AH L B L OW ER
+whistleblower(2) HH W IH S AH L B L OW ER
+whistleblowers W IH S AH L B L OW ER Z
+whistleblowers(2) HH W IH S AH L B L OW ER Z
+whistled W IH S AH L D
+whistled(2) HH W IH S AH L D
+whistler W IH S L ER
+whistler(2) HH W IH S L ER
+whistlers W IH S L ER Z
+whistlers(2) HH W IH S L ER Z
+whistles W IH S AH L Z
+whistles(2) HH W IH S AH L Z
+whistling W IH S L IH NG
+whistling(2) HH W IH S L IH NG
+whiston W IH S T AH N
+whiston(2) HH W IH S T AH N
+whit W IH T
+whit(2) HH W IH T
+whitacre W IH T AH K ER
+whitacre(2) HH W IH T AH K ER
+whitaker W IH T AH K ER
+whitaker(2) HH W IH T AH K ER
+whitbeck W IH T B EH K
+whitbeck(2) HH W IH T B EH K
+whitbread W IH T B R EH D
+whitbread(2) HH W IH T B R EH D
+whitby W IH T B IY
+whitby(2) HH W IH T B IY
+whitcher W IH CH ER
+whitcher(2) HH W IH CH ER
+whitchurch W IH T CH ER CH
+whitchurch(2) HH W IH T CH ER CH
+whitcomb W IH T K AH M
+whitcomb(2) HH W IH T K AH M
+whitcraft W IH T K R AE F T
+whitcraft(2) HH W IH T K R AE F T
+white W AY T
+white's W AY T S
+white's(2) HH W AY T S
+white(2) HH W AY T
+whiteaker W IH T AH K ER
+whiteaker(2) HH W IH T AH K ER
+whitebread W AY T B R EH D
+whitebread(2) HH W AY T B R EH D
+whitecotton W AY T K AA T AH N
+whitecotton(2) HH W AY T K AA T AH N
+whited W AY T IH D
+whited(2) HH W AY T IH D
+whitefield W AY T F IY L D
+whitefield(2) HH W AY T F IY L D
+whitefish W AY T F IH SH
+whitefish(2) HH W AY T F IH SH
+whiteford W AY T F AO R D
+whiteford(2) HH W AY T F AO R D
+whitehair W AY T HH EH R
+whitehair(2) HH W AY T HH EH R
+whitehall W AY T HH AO L
+whitehall's W AY T HH AO L Z
+whitehall's(2) HH W AY T HH AO L Z
+whitehall(2) HH W AY T HH AO L
+whitehead W AY T HH EH D
+whitehead's W AY T HH EH D Z
+whitehead's(2) HH W AY T HH EH D Z
+whitehead(2) HH W AY T HH EH D
+whitehill W AY T HH IH L
+whitehill(2) HH W AY T HH IH L
+whitehorn W AY T HH AO R N
+whitehorn(2) HH W AY T HH AO R N
+whitehorse W AY T HH AO R S
+whitehorse(2) HH W AY T HH AO R S
+whitehouse W AY T HH AW S
+whitehouse(2) HH W AY T HH AW S
+whitehurst W AY T HH ER S T
+whitehurst's W AY T HH ER S T
+whitehurst(2) HH W AY T HH ER S T
+whitelaw W AY T L AO
+whitelaw(2) HH W AY T L AO
+whiteley W AY T L IY
+whiteley(2) HH W AY T L IY
+whitelock W AY T L AA K
+whitelock(2) HH W AY T L AA K
+whitely W AY T L IY
+whitely(2) HH W AY T L IY
+whiteman W AY T M AH N
+whiteman(2) HH W AY T M AH N
+whitemont W AY T M AA N T
+whitemont(2) HH W AY T M AA N T
+whiten W AY T AH N
+whiten(2) HH W AY T AH N
+whitenack W AY T N AE K
+whitenack(2) HH W AY T N AE K
+whiteneir W AY T N IH R
+whiteneir(2) HH W AY T N IH R
+whitener W AY T N ER
+whitener(2) HH W AY T N ER
+whiteness W AY T N AH S
+whiteness(2) HH W AY T N AH S
+whitenight W AY T N AY T
+whitenight(2) HH W AY T N AY T
+whitening W AY T IH N IH NG
+whitening(2) W AY T N IH NG
+whitening(3) HH W AY T IH N IH NG
+whitening(4) HH W AY T N IH NG
+whiter W AY T ER
+whiter(2) HH W AY T ER
+whites W AY T S
+whites(2) HH W AY T S
+whitescarver W AY T S K AA R V ER
+whitescarver(2) HH W AY T S K AA R V ER
+whitesel W AY T S EH L
+whitesel(2) HH W AY T S EH L
+whitesell W AY T S EH L
+whitesell(2) HH W AY T S EH L
+whiteside W AY T S AY D
+whiteside(2) HH W AY T S AY D
+whitesides W AY T S AY D Z
+whitesides(2) HH W AY T S AY D Z
+whitest W AY T IH S T
+whitest(2) HH W AY T IH S T
+whitestone W AY T S T OW N
+whitestone(2) HH W AY T S T OW N
+whitetail W AY T T EY L
+whitetail(2) HH W AY T T EY L
+whitetail(3) HH W AY T EY L
+whitewash W AY T W AA SH
+whitewash(2) HH W AY T W AA SH
+whitewashed W AY T W AA SH T
+whitewashed(2) HH W AY T W AA SH T
+whitewater W AY T W AO T ER
+whitewater's W AY T W AO T ER Z
+whitewater's(2) HH W AY T W AO T ER Z
+whitewater(2) HH W AY T W AO T ER
+whitey W AY T IY
+whitey(2) HH W AY T IY
+whitfield W IH T F IY L D
+whitfield(2) HH W IH T F IY L D
+whitfill W IH T F IH L
+whitfill(2) HH W IH T F IH L
+whitford W IH T F ER D
+whitford(2) HH W IH T F ER D
+whitham W IH TH AH M
+whitham(2) HH W IH TH AH M
+whitham(3) HH W IH T AH M
+whither W IH DH ER
+whither(2) HH W IH DH ER
+whiting W AY T IH NG
+whiting(2) HH W AY T IH NG
+whitings W AY T IH NG Z
+whitings(2) HH W AY T IH NG Z
+whitis W AY T IH S
+whitis(2) HH W AY T IH S
+whitish W AY T IH SH
+whitish(2) HH W AY T IH SH
+whitlatch W IH T L AE CH
+whitlatch(2) HH W IH T L AE CH
+whitledge W IH T L EH JH
+whitledge(2) HH W IH T L EH JH
+whitley W IH T L IY
+whitley(2) HH W IH T L IY
+whitling W IH T L IH NG
+whitling(2) HH W IH T L IH NG
+whitlock W IH T L AA K
+whitlock(2) HH W IH T L AA K
+whitlow W IH T L OW
+whitlow(2) HH W IH T L OW
+whitly W IH T L IY
+whitly(2) HH W IH T L IY
+whitman W IH T M AH N
+whitman's W IH T M AH N Z
+whitman's(2) HH W IH T M AH N Z
+whitman(2) HH W IH T M AH N
+whitmarsh W IH T M AA R SH
+whitmarsh(2) HH W IH T M AA R SH
+whitmer W IH T M ER
+whitmer(2) HH W IH T M ER
+whitmill W IH T M IH L
+whitmill(2) HH W IH T M IH L
+whitmire W IH T M AY R
+whitmire(2) HH W IH T M AY R
+whitmore W IH T M AO R
+whitmore(2) HH W IH T M AO R
+whitmoyer W IH T M OY ER
+whitmoyer(2) HH W IH T M OY ER
+whitmyer W IH T M AY ER
+whitmyer(2) HH W IH T M AY ER
+whitner W IH T N ER
+whitner(2) HH W IH T N ER
+whitney W IH T N IY
+whitney's W IH T N IY Z
+whitney's(2) HH W IH T N IY Z
+whitney(2) HH W IH T N IY
+whiton W IH T AH N
+whiton(2) HH W IH T AH N
+whitrow W IH T R OW
+whitrow(2) HH W IH T R OW
+whitsel W IH T S AH L
+whitsel(2) HH W IH T S AH L
+whitsell W IH T S AH L
+whitsell(2) HH W IH T S AH L
+whitsett W IH T S IH T
+whitsett(2) HH W IH T S IH T
+whitsitt W IH T S IH T
+whitsitt(2) HH W IH T S IH T
+whitson W IH T S AH N
+whitson(2) HH W IH T S AH N
+whitt W IH T
+whitt(2) HH W IH T
+whittaker W IH T AH K ER
+whittaker(2) HH W IH T AH K ER
+whitted W IH T IH D
+whitted(2) HH W IH T IH D
+whittemore W IH T M AO R
+whittemore(2) HH W IH T M AO R
+whitten W IH T AH N
+whitten(2) HH W IH T AH N
+whittenberg W IH T AH N B ER G
+whittenberg(2) HH W IH T AH N B ER G
+whittenburg W IH T AH N B ER G
+whittenburg(2) HH W IH T AH N B ER G
+whittet W IH T IH T
+whittet(2) HH W IH T IH T
+whittier W IH T IY ER
+whittier(2) HH W IH T IY ER
+whitting W IH T IH NG
+whitting(2) HH W IH T IH NG
+whittingham W IH T IH NG HH AE M
+whittingham(2) HH W IH T IH NG HH AE M
+whittinghill W IH T IH NG HH IH L
+whittinghill(2) HH W IH T IH NG HH IH L
+whittington W IH T IH NG T AH N
+whittington(2) HH W IH T IH NG T AH N
+whittle W IH T AH L
+whittle's W IH T AH L Z
+whittle's(2) HH W IH T AH L Z
+whittle(2) HH W IH T AH L
+whittled W IH T AH L D
+whittled(2) HH W IH T AH L D
+whittlesey W IH T AH L S IY
+whittlesey(2) HH W IH T AH L S IY
+whittling W IH T L IH NG
+whittling(2) HH W IH T L IH NG
+whitton W IH T AH N
+whitton(2) HH W IH T AH N
+whitty W IH T IY
+whitty(2) HH W IH T IY
+whitwam W IH T W AA M
+whitwam(2) HH W IH T W AA M
+whitwell W IH T W EH L
+whitwell(2) HH W IH T W EH L
+whitworth W IH T W ER TH
+whitworth(2) HH W IH T W ER TH
+whiz W IH Z
+whiz(2) HH W IH Z
+whizzed W IH Z D
+whizzed(2) HH W IH Z D
+whizzer W IH Z ER
+whizzer(2) HH W IH Z ER
+whizzes W IH Z IH Z
+whizzes(2) HH W IH Z IH Z
+whizzing W IH Z IH NG
+whizzing(2) HH W IH Z IH NG
+who HH UW
+who'd HH UW D
+who'll HH UW L
+who're HH UW ER
+who's HH UW Z
+who've HH UW V
+whoa W OW
+whoa(2) HH W OW
+whoa(3) HH OW
+whobrey W AA B R IY
+whodunit HH UW D AH N IH T
+whodunits HH UW D AH N IH T S
+whoever HH UW EH V ER
+whoever's HH UW EH V ER Z
+whole HH OW L
+wholehearted HH OW L HH AA R T IH D
+wholeheartedly HH OW L HH AA R T IH D L IY
+wholeness HH OW L N IH S
+wholes HH OW L Z
+wholesale HH OW L S EY L
+wholesaler HH OW L S EY L ER
+wholesaler's HH OW L S EY L ER Z
+wholesalers HH OW L S EY L ER Z
+wholesalers' HH OW L S EY L ER Z
+wholesales HH OW L S EY L Z
+wholesaling HH OW L S EY L IH NG
+wholesome HH OW L S AH M
+wholesomeness HH OW L S AH M N AH S
+wholey HH AA L IY
+wholly HH OW L IY
+whom HH UW M
+whomever HH UW M EH V ER
+whomsoever HH UW M S OW EH V ER
+whoop W UW P
+whoop(2) HH W UW P
+whoopdedoo W UH P D IY D UW
+whoopdedoo(2) HH W UH P D IY D UW
+whooped W UW P T
+whooped(2) HH W UW P T
+whoopee W UW P IY
+whoopee(2) HH W UW P IY
+whoopi W UW P IY
+whoopi(2) HH W UW P IY
+whoopie W UW P IY
+whoopie(2) HH W UW P IY
+whooping W UW P IH NG
+whooping(2) HH W UW P IH NG
+whoops W UW P S
+whoops(2) HH W UW P S
+whoosh W UW SH
+whoosh(2) HH W UW SH
+whopper W AA P ER
+whopper(2) HH W AA P ER
+whoppers W AA P ER Z
+whoppers(2) HH W AA P ER Z
+whopping W AA P IH NG
+whopping(2) HH W AA P IH NG
+whore HH AO R
+whorehouse HH AO R HH AW S
+whores HH AO R Z
+whorl W ER L
+whorl(2) W AO R L
+whorl(3) HH W AO R L
+whorley HH AO R L IY
+whorley(2) W AO R L IY
+whorley(3) HH W AO R L IY
+whorls W ER L Z
+whorls(2) W AO R L Z
+whorls(3) HH W AO R L Z
+whorton HH AO R T AH N
+whose HH UW Z
+whosoever HH UW S OW EH V ER
+why W AY
+why'd W AY D
+why'd(2) HH W AY D
+why's W AY Z
+why's(2) HH W AY Z
+why(2) HH W AY
+whys W AY Z
+whys(2) HH W AY Z
+whyte W AY T
+whyte(2) HH W AY T
+wiacek V AY AH CH EH K
+wian W AY AH N
+wiant W AY AH N T
+wiard W AY AA R D
+wiater W AY AH T ER
+wiatrowski V IY AH T R AO F S K IY
+wiatt W AY AH T
+wibbelsman W IH B AH L Z M AH N
+wibbenmeyer W IH B IH N M AY ER
+wiberg W AY B ER G
+wible W AY B AH L
+wicat W IH K AE T
+wicca W IH K AH
+wiccan W IH K AH N
+wice W AY S
+wich W IH CH
+wichern W IH K ER N
+wichert W IH CH ER T
+wichita W IH CH AH T AO
+wichita's W IH CH AH T AO Z
+wichman W IH CH M AH N
+wichmann W IH CH M AH N
+wick W IH K
+wickard W IH K ER D
+wicke W IH K
+wicked W IH K AH D
+wickedly W IH K IH D L IY
+wickedness W IH K AH D N AH S
+wickens W IH K AH N Z
+wicker W IH K ER
+wickerham W IH K ER HH AE M
+wickersham W IH K ER SH AE M
+wickert W IH K ER T
+wickes W IH K S
+wickes's W IH K S IH Z
+wicket W IH K AH T
+wicket(2) HH W IH K AH T
+wickets W IH K AH T S
+wickets(2) HH W IH K AH T S
+wickett W IH K IH T
+wickey W IH K IY
+wickham W IH K AH M
+wickizer W IH K AY Z ER
+wickland W IH K L AH N D
+wicklander W IH K L AE N D ER
+wickley W IH K L IY
+wickliff W IH K L IH F
+wickliffe W IH K L IH F
+wickline W IH K L AY N
+wicklund W IH K L AH N D
+wickman W IH K M AH N
+wicks W IH K S
+wickstrom W IH K S T R AH M
+wickware W IH K W EH R
+wickwire V IH S K V AY R
+wicor W AY K AO R
+widder W IH D ER
+widdle W IH D AH L
+widdled W IH D AH L D
+widdly W IH D L IY
+widdows W IH D OW Z
+widdowson W IH D AW S AH N
+wide W AY D
+wide's W AY D Z
+widebody W AY D B AA D IY
+widell W IH D AH L
+widely W AY D L IY
+wideman W AY D M AH N
+widen W AY D AH N
+widened W AY D AH N D
+widener W IH D IY N ER
+widening W AY D AH N IH NG
+widens W AY D AH N Z
+wider W AY D ER
+widespread W AY D S P R EH D
+widest W AY D AH S T
+widger W IH JH ER
+widget W IH JH IH T
+widgets W IH JH IH T S
+widhalm W IH D HH AA M
+widick W IH D IH K
+widing W AY D IH NG
+widmaier W IH D M AY ER
+widman W IH D M AH N
+widmann W IH D M AH N
+widmar W IH D M ER
+widmayer W IH D M EY ER
+widmer W IH D M ER
+widnall W IH D N AH L
+widner W IH D N ER
+widow W IH D OW
+widow's W IH D OW Z
+widowed W IH D OW D
+widower W IH D OW ER
+widowers W IH D OW ER Z
+widows W IH D OW Z
+widrick W IH D R IH K
+widrig W IH D R IH G
+width W IH D TH
+widths W IH D TH S
+widuri W IH D UH R IY
+wieand W IY AH N D
+wiebe W IY B
+wieber W IY B ER
+wieberg W IY B ER G
+wiebke W IY B K IY
+wiebold W IY B OW L D
+wiebusch W IY B AH SH
+wiech W IY CH
+wiechert W IY K ER T
+wiechman W IY K M AH N
+wiechmann W IY K M AH N
+wieck W IY K
+wieczorek V IY CH AO R EH K
+wied W IY D
+wiedel W IY D AH L
+wiedeman W IY D M AH N
+wiedemann W IY D M AH N
+wieden W IY D AH N
+wieder W IY D ER
+wiederaufbau W IY D ER AO F B AW
+wiederhold W IY D ER HH OW L D
+wiederholt W IY D ER HH OW L T
+wiederkehr W IY D ER K IH R
+wiedman W IY D M AH N
+wiedmann W IY D M AH N
+wiedmeyer W IY D M AY ER
+wiedner W IY D N ER
+wiedrich W IY D R IH K
+wiegand W IY G AH N D
+wiegel W IY G AH L
+wiegers W IY G ER Z
+wiegert W IY G ER T
+wiegman W IY G M AH N
+wiegmann W IY G M AH N
+wiehe W IY
+wieland W IY L AH N D
+wield W IY L D
+wielded W IY L D IH D
+wielding W IY L D IH NG
+wields W IY L D Z
+wielgus W IY L G AH S
+wieman W IY M AH N
+wiemann W IY M AH N
+wiemer W IY M ER
+wiemers W IY M ER Z
+wien W IY N
+wiencek V IY N CH EH K
+wienecke W IY N IH K
+wieneke W IY N IH K
+wiener W IY N ER
+wiener(2) W AY N ER
+wieners W IY N ER Z
+wienerschnitzel W IY N ER SH N IH T S AH L
+wienerschnitzel's W IY N ER SH N IH T S AH L Z
+wienerschnitzel's(2) V IY N ER SH N IH T S AH L Z
+wienerschnitzel(2) V IY N ER SH N IH T S AH L
+wienke W IY NG K
+wiens W IY N Z
+wier W IH R
+wierdin W IH R D IH N
+wierenga V IH R EH NG G AH
+wierman W IH R M AH N
+wiers W IY R Z
+wiersema V IH R S IY M AH
+wiersma V IH R S M AH
+wierzba V IH R Z B AH
+wierzbicki V IH R Z B IH T S K IY
+wies W AY Z
+wiesbaden W IY S B AA D AH N
+wiesbaden(2) W AY S B AA D AH N
+wiese W IY Z
+wiesel W IY S AH L
+wieseler W IY S AH L ER
+wiesemann W IY S M AH N
+wiesen W IY S AH N
+wiesenthal W IY S AH N TH AA L
+wiesenthal(2) W IY Z AH N TH AA L
+wieser W IY S ER
+wiesman W IY Z M AH N
+wiesner W IY Z N ER
+wiess W IY S
+wiessner W IY S N ER
+wiest W AY IH S T
+wieting W IY T IH NG
+wife W AY F
+wife's W AY F S
+wig W IH G
+wigal W IH G AH L
+wigand W IH G AH N D
+wigand's W IH G AH N D Z
+wigen W IH G AH N
+wigfall W IH G F AO L
+wigfield W IH G F IY L D
+wigg W IH G
+wiggans W IH G AH N Z
+wigger W IH G ER
+wiggers W IH G ER Z
+wiggin W IH G IH N
+wiggington W IH G IH NG T AH N
+wiggins W IH G IH N Z
+wigginton W IH G IH N T AH N
+wiggle W IH G AH L
+wigglesworth W IH G AH L Z W ER TH
+wiggling W IH G AH L IH NG
+wiggling(2) W IH G L IH NG
+wiggly W IH G AH L IY
+wiggs W IH G Z
+wight W AY T
+wightman W AY T M AH N
+wigington W IH G IH NG T AH N
+wiginton W IH JH IH N T AH N
+wigle W AY G AH L
+wigley W IH G L IY
+wigmore W IH G M AO R
+wignall W IH G N AH L
+wigs W IH G Z
+wigton W IH G T AH N
+wigton's W IH G T AH N Z
+wigwam W IH G W AA M
+wiitala V IY T AA L AH
+wik W IH K
+wike W AY K
+wikel W IH K AH L
+wiker W AY K ER
+wikle W AY K AH L
+wiklund W IH K L AH N D
+wikoff W IH K AO F
+wikowsky W IH K AW S K IY
+wikstrom W IH K S T R AH M
+wil W IH L
+wil's W IH L Z
+wiland W AY L AH N D
+wilander W AY L AH N D ER
+wilbanks W IH L B AH NG K S
+wilber W IH L B ER
+wilberforce W IH L B ER F AO R S
+wilberg W IH L B ER G
+wilbert W IH L B ER T
+wilbon W IH L B AH N
+wilborn W IH L B ER N
+wilbourn W IH L B ER N
+wilbourne W IH L B ER N
+wilbur W IH L B ER
+wilburn W IH L B ER N
+wilcher W IH L CH ER
+wilcock W IH L K AA K
+wilcox W IH L K AA K S
+wilcoxen W IH L K AA K S AH N
+wilcoxon W IH L K AA K S AH N
+wilcoxson W IH L K AA K S AH N
+wilczak V IH L CH AE K
+wilczek V IH L CH EH K
+wilczewski V IH L CH EH F S K IY
+wilczynski V IH L CH IH N S K IY
+wild W AY L D
+wildasin W AY L D AH S IH N
+wildavsky W IH L D AE V S K IY
+wildcard W AY L D K AA R D
+wildcat W AY L D K AE T
+wildcats W AY L D K AE T S
+wildcatter W AY L D K AE T ER
+wildcatters W AY L D K AE T ER Z
+wildcatting W AY L D K AE T IH NG
+wilde W AY L D
+wilde's W AY L D Z
+wildeman W AY L D M AH N
+wilden W AY L D AH N
+wilder W AY L D ER
+wilder's W AY L D ER Z
+wilderman W AY L D ER M AH N
+wildermuth W AY L D ER M UW TH
+wilderness W IH L D ER N AH S
+wildes W AY L D Z
+wildest W AY L D IH S T
+wildey W IH L D IY
+wildfire W AY L D F AY ER
+wildfires W AY L D F AY ER Z
+wildflower W AY L D F L AW ER
+wildflowers W AY L D F L AW R Z
+wilding W AY L D IH NG
+wildlife W AY L D L AY F
+wildly W AY L D L IY
+wildman W AY L D M AH N
+wildmon W AY L D M AH N
+wildness W AY L D N AH S
+wildon W AY L D AH N
+wildrick W AY L D R IH K
+wilds W AY L D Z
+wildt W IH L T
+wildwood W AY L D W UH D
+wildwoods W AY L D W UH D Z
+wile W AY L
+wileen W IH L IY N
+wileman W AY L M AH N
+wilemon W IH L IH M AA N
+wilen W AY L AH N
+wilensky W AH L IH N S K IY
+wiler W AY L ER
+wiles W AY L Z
+wiles's W AY L Z IH Z
+wiley W AY L IY
+wilfert W IH L F ER T
+wilfong W IH L F AO NG
+wilford W IH L F ER D
+wilfred W IH L F R IH D
+wilfreda W IH L F R IH D AH
+wilfredo W IH L F EY D OW
+wilfrid W IH L F R IH D
+wilfried W IH L F R IY D
+wilfully W IH L F AH L IY
+wilgus W IH L G AH S
+wilham W IH L HH AH M
+wilhelm W IH L HH EH L M
+wilhelma W IH L HH EH L M AH
+wilhelmi W IH L HH EH L M IY
+wilhelmina W IH L HH EH L M IY N AH
+wilhelmine W IH L HH IH L M IH N
+wilhelms W IH L HH EH L M Z
+wilhelmsen W IH L HH IH L M S AH N
+wilhelmy W IH L HH IH L M IY
+wilhemina W IH L HH EH M IY N AH
+wilhide W IH L HH AY D
+wilhite W IH L HH AY T
+wilhoit W IH L HH OY T
+wilhoite W IH L HH OY T
+wiliams W IH L IY AH M Z
+wiling W AY L IH NG
+wilinski V IH L IH N S K IY
+wilk W IH L K
+wilke W IH L K
+wilken W IH L K AH N
+wilkening W IH L K AH N IH NG
+wilkens W IH L K AH N Z
+wilkenson W IH L K IH N S AH N
+wilker W IH L K ER
+wilkerson W IH L K ER S AH N
+wilkes W IH L K S
+wilkesboro W IH L K S B ER OW
+wilkey W IH L K IY
+wilkie W IH L K IY
+wilkin W IH L K IH N
+wilking W IH L K IH NG
+wilkins W IH L K IH N Z
+wilkinson W IH L K AH N S AH N
+wilkinson's W IH L K IH N S AH N Z
+wilkinson(2) W IH L K IH N S AH N
+wilkis W IH L K IH S
+wilkison W IH L K IH S AH N
+wilkowski V IH L K AO F S K IY
+wilks W IH L K S
+will W IH L
+will's W IH L Z
+will(2) W AH L
+willa W IH L AH
+willabelle W IH L AH B EH L
+willadsen W IH L AE D S AH N
+willaims W IH L AH M Z
+willam W IH L AH M
+willamette W AH L AE M AH T
+willamette's W AH L AE M AH T S
+willamette's(2) W IH L AH M EH T S
+willamette(2) W IH L AH M EH T
+willamina W IH L AH M AY N AH
+willapa W IH L AA P AH
+willapa's W IH L AA P AH Z
+willard W IH L ER D
+willbanks W IH L B AE NG K S
+willcox W IH L K AA K S
+willcutt W IH L K AH T
+willden W IH L D AH N
+wille W IH L
+willed W IH L D
+willeford W IH L IH F ER D
+willeford(2) W IH L F ER D
+willem W IH L AH M
+willems W IH L AH M Z
+willemsen W IH L EH M S AH N
+willemsen(2) W IH L AH M S AH N
+willen W IH L AH N
+willenborg W IH L IH N B AO R G
+willenbring W IH L AH N B R IH NG
+willens W IH L AH N Z
+willer W IH L ER
+willers W IH L ER Z
+willert W IH L ER T
+willes W AY L Z
+willet W IH L IH T
+willets W IH L IH T S
+willett W IH L IH T
+willette W IH L EH T
+willetts W IH L IH T S
+willey W IH L IY
+willford W IH L F ER D
+willful W IH L F AH L
+willfully W IH L F AH L IY
+willhelm W IH L HH EH L M
+willhite W IH L HH AY T
+willhoit W IH L HH OY T
+willhoite W IH L HH OY T
+willi W IH L IY
+william W IH L Y AH M
+william's W IH L Y AH M Z
+williams W IH L Y AH M Z
+williams' W IH L Y AH M Z
+williams's W IH L Y AH M Z IH Z
+williamsburg W IH L Y AH M Z B ER G
+williamsburgh W IH L Y AH M Z B ER G
+williamsen W IH L Y AH M S AH N
+williamson W IH L Y AH M S AH N
+williamson's W IH L Y AH M S AH N Z
+williamsport W IH L Y AH M S P AO R T
+williamstown W IH L Y AH M S T AW N
+williard W IH L Y AA R D
+willie W IH L IY
+willie's W IH L IY Z
+williford W IH L IH F ER D
+willig W IH L IH G
+willing W IH L IH NG
+willinger W IH L IH NG ER
+willingham W IH L IH NG HH AE M
+willingly W IH L IH NG L IY
+willingness W IH L IH NG N AH S
+willis W IH L IH S
+willis's W IH L IH S IH Z
+willison W IH L IH S AH N
+williston W IH L IH S T AA N
+willits W IH L IH T S
+willke W IH L K IY
+willkie W IH L K IY
+willman W IH L M AH N
+willmann W IH L M AH N
+willmon W IH L M AH N
+willmore W IH L M AO R
+willmott W IH L M AH T
+willms W IH L M Z
+willner W IH L N ER
+willock W IH L AH K
+willoughby W IH L AH B IY
+willow W IH L OW
+willowbrook W IH L OW B R UH K
+willowes W IH L OW Z
+willows W IH L OW Z
+willowy W IH L AH W IY
+willpower W IH L P AW ER
+wills W IH L Z
+willse W IH L S IY
+willsey W IH L S IY
+willson W IH L S AH N
+willwerth W IH L W ER TH
+willy W IH L IY
+willyard W IH L Y AA R D
+wilma W IH L M AH
+wilmar W IH L M ER
+wilmarth W IH L M AA R TH
+wilmer W IH L M ER
+wilmes W IH L M Z
+wilmet W IH L M IH T
+wilmeth W IH L M IH TH
+wilmette W IH L M EH T
+wilmington W IH L M IH NG T AH N
+wilmore W IH L M AO R
+wilmot W IH L M AH T
+wilmoth W IH L M AH TH
+wilmott W IH L M AH T
+wilmouth W IH L M AW TH
+wilms W IH L M Z
+wilmut W IH L M AH T
+wilner W IH L N ER
+wilpon W IH L P AA N
+wilsey W IH L S IY
+wilshire W IH L SH AY R
+wilshusen W IH L SH UW S AH N
+wilson W IH L S AH N
+wilson's W IH L S AH N Z
+wilt W IH L T
+wilted W IH L T IH D
+wiltel W IH L T EH L
+wiltfong W IH L T F AO NG
+wiltgen W IH L T G AH N
+wilthew W IH L TH Y UW
+wilting W IH L T IH NG
+wilton W IH L T AH N
+wiltron W IH L T R AH N
+wiltrout W IH L T R AW T
+wilts W IH L T S
+wiltse W IH L T S
+wiltsey W IH L T S IY
+wiltshire W IH L CH AY R
+wiltsie W IH L T S IY
+wiltz W IH L T S
+wily W AY L IY
+wiman W AY M AH N
+wimberley W IH M B ER L IY
+wimberly W IH M B ER L IY
+wimbish W IH M B IH SH
+wimbledon W IH M B AH L D AH N
+wimbley W IH M B L IY
+wimbush W IH M B AH SH
+wimbush(2) W IH M B UH SH
+wimer W AY M ER
+wimmer W IH M ER
+wimp W IH M P
+wimpee W IH M P IY
+wimpiness W IH M P IY N AH S
+wimps W IH M P S
+wimpy W IH M P IY
+wims W IH M Z
+wimsatt W IH M S AH T
+win W IH N
+win's W IH N Z
+winamac W IH N AH M AE K
+winamac's W IH N AH M AE K S
+winans W IH N AH N Z
+winans's W IH N AH N Z IH Z
+winant W AY N AH N T
+winberg W IH N B ER G
+winberry W IH N B EH R IY
+winborn W IH N B ER N
+winborne W IH N B ER N
+winburn W IH N B ER N
+winbush W IH N B UH SH
+wince W IH N S
+winced W IH N S T
+wincek W IH N S IH K
+winch W IH N CH
+winchel W IH N K AH L
+winchell W IH N CH AH L
+winchell's W IH N CH AH L Z
+winchester W IH N CH EH S T ER
+wincing W IH N S IH NG
+winckler W IH NG K L ER
+wind W AY N D
+wind's W IH N D Z
+wind(2) W IH N D
+windchill W IH N D CH IH L
+windchime W IH N D CH AY M
+windchimes W IH N D CH AY M Z
+windecker W IH N D EH K ER
+winded W IH N D IH D
+winded(2) W AY N D IH D
+windell W IH N D AH L
+windels W IH N D AH L Z
+winder W IH N D ER
+winder(2) W AY N D ER
+winders W IH N D ER Z
+winders(2) W AY N D ER Z
+windes W IH N D Z
+windes(2) W AY N D Z
+windfall W IH N D F AO L
+windfalls W IH N D F AO L Z
+windham W IH N D AH M
+windheim W IH N D HH AY M
+windhoek W IH N D HH OW K
+windholz W IH N D HH OW L Z
+windhorst W IH N D HH AO R S T
+winding W AY N D IH NG
+windisch W IH N D IH SH
+windish W IH N D IH SH
+windlass W IH N D L AH S
+windle W IH N D AH L
+windler W IH N D L ER
+windley W IH N D L IY
+windmere W IH N D M IH R
+windmere's W IH N D M IH R Z
+windmill W IH N D M IH L
+windmiller W IH N D M IH L ER
+windmills W IH N D M IH L Z
+windom W IH N D AH M
+windon W IH N D AH N
+window W IH N D OW
+windowed W IH N D OW D
+windowless W IH N D OW L AH S
+windowpane W IH N D OW P EY N
+windowpanes W IH N D OW P EY N Z
+windows W IH N D OW Z
+winds W IH N D Z
+winds(2) W AY N D Z
+windshield W IH N D SH IY L D
+windshields W IH N D SH IY L D Z
+windsor W IH N Z ER
+windsor's W IH N Z ER Z
+windsors W IH N Z ER Z
+windspeed W IH N D S P IY D
+windstar W IH N D S T AA R
+windstar's W IH N D S T AA R Z
+windstorm W IH N D S T AO R M
+windswept W IH N S W EH P T
+windt W IH N T
+windup W AY N D AH P
+windward W IH N D W ER D
+windy W IH N D IY
+windy(2) W AY N D IY
+wine W AY N
+wine's W AY N Z
+winebarger W IH N IH B AA R G ER
+wineberg W AY N B ER G
+winebrenner W IH N IH B R IH N ER
+winecoff W IH N IH K AO F
+wined W AY N D
+winegar W IH N IH G ER
+winegarden W AY N G AA R D AH N
+winegardner W IH N IH G AA R D N ER
+wineheim W AY N HH AY M
+wineinger W AY N IH NG ER
+wineland W AY N L AH N D
+wineland(2) W IH N IH L AH N D
+winema W IH N IH M AH
+wineman W AY N M AH N
+winemiller W AY N M IH L ER
+winer W AY N ER
+wineries W AY N ER IY Z
+winery W AY N ER IY
+winery's W AY N ER IY Z
+wines W AY N Z
+winey W AY N IY
+winfield W IH N F IY L D
+winford W IH N F ER D
+winfred W IH N F R IH D
+winfree W IH N F R IY
+winfrey W IH N F R IY
+winfrid W IH N F R IH D
+wing W IH NG
+wing's W IH NG Z
+wingard W IH NG G ER D
+wingate W IH N G EY T
+wingback W IH NG B AE K
+winge W IH N JH
+winged W IH NG D
+winger W IH NG ER
+wingers W IH NG ER Z
+wingert W IH NG G ER T
+wingerter W IH NG G ER T ER
+winget W IH NG G IH T
+wingett W IH NG G IH T
+wingfield W IH NG F IY L D
+winging W IH NG IH NG
+wingler W IH NG G AH L ER
+wingler(2) W IH NG G L ER
+winglike W IH NG L AY K
+wingman W IH NG M AH N
+wingo W IY NG G OW
+wingrove W IH N G R OW V
+wings W IH NG Z
+wings' W IH NG Z
+wingspan W IH NG S P AE N
+winiarski V IH N IY AA R S K IY
+winick W IH N IH K
+winiecki V IH N IY T S K IY
+winifred W IH N IH F R IH D
+winik W IH N IH K
+wining W AY N IH NG
+wininger W AY N IH NG ER
+winings W AY N IH NG Z
+wink W IH NG K
+winked W IH NG K T
+winkel W IH NG K AH L
+winkelman W IH NG K AH L M AH N
+winkelmann W IH NG K AH L M AH N
+winkels W IH NG K AH L Z
+winker W IH NG K ER
+winkfield W IH NG K F IY L D
+winking W IH NG K IH NG
+winkle W IH NG K AH L
+winkleman W IH NG K AH L M AH N
+winkler W IH NG K L ER
+winkles W IH NG K AH L Z
+winkley W IH NG K L IY
+winkowski V IH NG K AO F S K IY
+winks W IH NG K S
+winland W IH N L AH N D
+winn W IH N
+winnable W IH N AH B AH L
+winne W IH N
+winnebago W IH N AH B EY G OW
+winnebago's W IH N AH B EY G OW Z
+winner W IH N ER
+winner's W IH N ER Z
+winners W IH N ER Z
+winners' W IH N ER Z
+winnetka W IH N EH T K AH
+winnett W IH N IH T
+winney W IH N IY
+winnick W IH N IH K
+winnicki V IH N IH T S K IY
+winnie W IH N IY
+winning W IH N IH NG
+winningest W IH N IH NG AH S T
+winningham W IH N IH NG HH AE M
+winnings W IH N IH NG Z
+winnipeg W IH N IH P AH G
+winnow W IH N OW
+winnowed W IH N OW D
+winnowing W IH N OW IH NG
+winny W IH N IY
+wino W IY N OW
+winograd W IH N AH G R AE D
+winokur W IH N AH K ER
+winola V IH N OW L AH
+winona W IH N AH N AH
+winonah W IH N AH N AH
+winooski W IH N UW S K IY
+winos W IY N OW S
+winquist W IH N K W IH S T
+wins W IH N Z
+winsett W IH N S IH T
+winship W IH N SH IH P
+winski W IH N S K IY
+winslet W IH N S L IH T
+winslet's W IH N S L IH T S
+winslett W IH N S L IH T
+winslow W IH N Z L OW
+winsome W IH N S AH M
+winson W IH N S AH N
+winsor W IH N Z ER
+winstanley W IH N S T AH N L IY
+winstead W IH N S T EH D
+winston W IH N S T AH N
+wint W IH N T
+winter W IH N T ER
+winter's W IH N T ER Z
+winterberg W IH N T ER B ER G
+winterbourne W IH N T ER B AO R N
+wintered W IH N T ER D
+winterhalter W IH N T ER HH AO L T ER
+winterize W IH N T ER AY Z
+winterized W IH N T ER AY Z D
+wintermute W IH N T ER M Y UW T
+winterrowd W IH N T ER AW D
+winters W IH N T ER Z
+wintershall W IH N T ER SH AE L
+wintersteen W IH N T ER S T IY N
+winterstein W IH N T ER S T AY N
+winterstein(2) W IH N T ER S T IY N
+winterthur W IH N T ER TH ER
+wintertime W IH N T ER T AY M
+winterton W IH N T ER T AH N
+winther W IH N TH ER
+winthrop W IH N TH R AH P
+winthrop's W IH N TH R AH P S
+wintle W IH N T AH L
+wintom W IH N T AH M
+winton W IH N T AH N
+wintour W IH N T UH R
+wintry W IH N T R IY
+wintz W IH N T S
+wintzer W IH N T S ER
+winward W IH N W ER D
+winwood W IH N W UH D
+winwood's W IH N W UH D Z
+winword W IH N W ER D
+winzeler W IH N Z AH L ER
+winzer W IH N Z ER
+wion W AY AH N
+wipe W AY P
+wiped W AY P T
+wipeout W AY P AW T
+wiper W AY P ER
+wipers W AY P ER Z
+wipes W AY P S
+wipf W IH P F
+wiping W AY P IH NG
+wipperfurth W IH P ER F ER TH
+wire W AY ER
+wire(2) W AY R
+wired W AY ER D
+wired(2) W AY R D
+wireless W AY R L IH S
+wireless's W AY ER L AH S IH Z
+wireline W AY R L AY N
+wireman W AY R M AH N
+wires W AY ER Z
+wires(2) W AY R Z
+wiretap W AY ER T AE P
+wiretapped W AY ER T AE P T
+wiretapping W AY ER T AE P IH NG
+wiretaps W AY R T AE P S
+wirick W IH R IH K
+wiring W AY R IH NG
+wirkkala V ER K AA L AH
+wirkus W ER K IH S
+wirsing W ER S IH NG
+wirt W ER T
+wirtanen W ER T AH N AH N
+wirth W ER TH
+wirthlin W ER TH L IH N
+wirtz W ER T S
+wiry W IH R IY
+wirz W ER Z
+wis W IH S
+wisby W IH S B IY
+wisch W IH SH
+wischmeyer W IH SH M AY ER
+wisconsin W IH S K AA N S AH N
+wisconsin's W IH S K AA N S AH N Z
+wisdom W IH Z D AH M
+wise W AY Z
+wisecarver W AY Z K AA R V ER
+wisecrack W AY Z K R AE K
+wisecracking W AY Z K R AE K IH NG
+wisecracks W AY Z K R AE K S
+wisecup W AY Z K AH P
+wised W AY Z D
+wiseguy W AY Z G AY
+wisehart W AY Z HH AA R T
+wisel W AY Z AH L
+wiseley W IH S IH L IY
+wiseley(2) W AY Z L IY
+wisely W AY Z L IY
+wiseman W AY Z M AH N
+wisenbaker W AY Z AH N B EY K ER
+wisener W IH S IY N ER
+wiser W AY Z ER
+wisest W AY Z AH S T
+wish W IH SH
+wisham W IH SH AH M
+wishard W IH SH ER D
+wishart W IH SH AA R T
+wishbone W IH SH B OW N
+wished W IH SH T
+wisher W IH SH ER
+wishers W IH SH ER Z
+wishes W IH SH IH Z
+wishful W IH SH F AH L
+wishfully W IH SH F AH L IY
+wishing W IH SH IH NG
+wishner W IH SH N ER
+wishnick W IH SH N IH K
+wishon W IH SH AH N
+wishy W IH SH IY
+wisinski V IH S IH N S K IY
+wisler W IH S AH L ER
+wisler(2) W IH S L ER
+wisley W IH Z L IY
+wisman W IH Z M AH N
+wismer W IH Z AH M ER
+wisner W IH S N ER
+wisneski V IH S N EH S K IY
+wisnewski V IH S N EH F S K IY
+wisnieski V IH S N IY S K IY
+wisniewski W IH Z N IY EH F S K IY
+wisor W AY Z ER
+wisp W IH S P
+wispy W IH S P IY
+wiss W IH S
+wissa W IH S AH
+wissel W IH S AH L
+wisser W IH S ER
+wissing W IH S IH NG
+wissinger W IH S IH NG ER
+wissink W IH S IH NG K
+wissler W IH S L ER
+wissman W IH S M AH N
+wissmann W IH S M AH N
+wissner W IH S N ER
+wist W IH S T
+wistful W IH S T F AH L
+wistfully W IH S T F AH L IY
+wistfulness W IH S T F AH L N AH S
+wiswell W IH S W EH L
+wisz V IH SH
+wit W IH T
+wit's W IH T S
+witbeck W IH T B EH K
+witbrock W IH T B R AO K
+witch W IH CH
+witch's W IH CH IH Z
+witchcraft W IH CH K R AE F T
+witcher W IH CH ER
+witches W IH CH AH Z
+witches(2) W IH CH IH Z
+witchey W IH CH IY
+witchhunt W IH CH HH AH N T
+witching W IH CH IH NG
+witchy W IH CH IY
+witco W IH T K OW
+witczak V IH T CH AE K
+witek V IH T EH K
+with W IH DH
+with(2) W IH TH
+witham W IH TH AH M
+withdraw W IH DH D R AO
+withdraw(2) W IH TH D R AO
+withdrawal W IH DH D R AO AH L
+withdrawal(2) W IH TH D R AO AH L
+withdrawals W IH TH D R AO AH L Z
+withdrawals(2) W IH DH D R AO AH L Z
+withdrawing W IH TH D R AO IH NG
+withdrawing(2) W IH DH D R AO IH NG
+withdrawn W IH TH D R AO N
+withdrawn(2) W IH DH D R AO N
+withdraws W IH DH D R AO Z
+withdraws(2) W IH TH D R AO Z
+withdrew W IH TH D R UW
+withdrew(2) W IH DH D R UW
+withe W IH TH
+withee W IH TH IY
+withem W IH TH IH M
+wither W IH DH ER
+withered W IH DH ER D
+witherell W IH TH ER AH L
+withering W IH DH ER IH NG
+witherington W IH TH ER IH NG T AH N
+witherow W IH TH ER OW
+withers W IH DH ER Z
+witherspoon W IH DH ER S P UW N
+withey W IH TH IY
+withheld W IH TH HH EH L D
+withhold W IH TH HH OW L D
+withholding W IH TH HH OW L D IH NG
+withholds W IH TH HH OW L D Z
+within W IH DH IH N
+within(2) W IH TH IH N
+withington W IH TH IH NG T AH N
+withnail W IH TH N EY L
+without W IH TH AW T
+without(2) W IH DH AW T
+withrow W IH TH R OW
+withstand W IH TH S T AE N D
+withstanding W IH TH S T AE N D IH NG
+withstands W IH TH S T AE N D Z
+withstood W IH TH S T UH D
+witkin W IH T K IH N
+witkop W IH T K AH P
+witkowski V IH T K AO F S K IY
+witless W IH T L AH S
+witman W IH T M AH N
+witmer W IH T M ER
+witness W IH T N AH S
+witness' W IH T N AH S
+witness's W IH T N AH S IH Z
+witnessed W IH T N AH S T
+witnesses W IH T N AH S AH Z
+witnesses' W IH T N AH S IH Z
+witnesses(2) W IH T N AH S IH Z
+witnessing W IH T N AH S IH NG
+witowski V IH T AO F S K IY
+wits W IH T S
+witt W IH T
+witte W IH T
+witted W IH T IH D
+wittekind W IH T IH K IH N D
+witteman W IH T M AH N
+witten W IH T AH N
+wittenauer W IH T IH N AW ER
+wittenberg W IH T AH N B ER G
+wittenborn W IH T IH N B ER N
+wittenburg W IH T AH N B ER G
+wittenmyer W IH T IH N M IY ER
+wittenmyer(2) W IH T IH N M AY ER
+witter W IH T ER
+witter's W IH T ER Z
+witters W IH T ER Z
+witthuhn W IH TH AH N
+wittig W IH T IH G
+wittily W IH T AH L IY
+witting W IH T IH NG
+wittingly W IH T IH NG L IY
+wittke W IH T K IY
+wittkopp W IH T K AH P
+wittler W IH T L ER
+wittman W IH T M AH N
+wittmann W IH T M AH N
+wittmer W IH T M ER
+wittmeyer W IH T M AY ER
+wittner W IH T N ER
+witton W IH T AH N
+wittrock W IH T R AH K
+witts W IH T S
+wittwer W IH T W ER
+witty W IH T IY
+witucki W IH T AH K IY
+witwatersrand W IH T W AO T ER S R AE N D
+witwer W IH T W ER
+witz W IH T S
+witzel W IH T Z AH L
+witzig W IH T Z IH G
+witzke W IH T S K IY
+wives W AY V Z
+wives' W AY V Z
+wix W IH K S
+wixom W IH K S AH M
+wixon W IH K S AH N
+wixson W IH K S AH N
+wixted W IH K S T IH D
+wiz W IH Z
+wiz(2) HH W IH Z
+wizard W IH Z ER D
+wizardry W IH Z ER D R IY
+wizards W IH Z ER D Z
+wizen W AY Z AH N
+wizened W AY Z AH N D
+wlodarczyk W AH L AA D ER CH IH K
+wlodarski W AH L AH D AA R S K IY
+wm W IH L Y AH M
+wm(2) D AH B AH Y UW EH M
+wnek W N EH K
+wnuk W N AH K
+wo W OW
+wo(2) HH W OW
+wobbe W AA B
+wobble W AA B AH L
+wobbled W AA B AH L D
+wobbling W AA B AH L IH NG
+wobbling(2) W AA B L IH NG
+wobbly W AA B AH L IY
+wobegon W OW B AH G AA N
+wobig W OW B IH G
+wobst W AA B S T
+woburn W UW B ER N
+woe W OW
+woebegone W OW B IH G AO N
+woeful W OW F AH L
+woefully W OW F AH L IY
+woehl W OW L
+woehler W OW L ER
+woehr W AO R
+woehrle W AO R AH L
+woelfel W OW L F AH L
+woelfle W OW L F AH L
+woerner W AO R N ER
+woes W OW Z
+woessner W OW S N ER
+woeste W OW S T
+wofford W AA F ER D
+wofford's W AA F ER D Z
+wogan W OW G AH N
+woggle W AO G AH L
+wogoman W OW G OW M AH N
+wohl W OW L
+wohler W OW L ER
+wohlers W OW L ER Z
+wohlfarth W OW L F AA R TH
+wohlfeil W OW L F AY L
+wohlford W OW L F ER D
+wohlgemuth W OW L G AH M UW TH
+wohlstetter W OW L S T EH T ER
+wohlwend W OW L W EH N D
+woitschatzke W OY CH AE T S K IY
+wojahn W OW HH AA N
+wojciak W OY CH IY AE K
+wojcicki W OY CH IH T S K IY
+wojciech W OY CH EH K
+wojciech(2) V OY CH EH K
+wojciechowski W OY CH IH HH AO F S K IY
+wojcik W OY CH IH K
+wojdyla W OY D IH L AH
+wojick W OY CH IH K
+wojnar W OY N ER
+wojnarowski W OY N ER AW S K IY
+wojnilower W OY N AH L OW ER
+wojnowski W OY N AW S K IY
+wojtas W OY T AH S
+wojtaszek W OY T AA SH EH K
+wojtkiewicz W OY T K AH V IH CH
+wojtkowski W OY T K AW S K IY
+wojtowicz W OY T AH V IH CH
+wok W AA K
+woke W OW K
+woken W OW K AH N
+woks W AA K S
+wola W OW L AH
+wolak W OW L AH K
+wolanin W AA L AH N IH N
+wolanski V AH L AE N S K IY
+wolaver W AA L AH V ER
+wolber W OW L B ER
+wolbert W OW L B ER T
+wolcott W OW L K AH T
+wold W OW L D
+wolden W OW L D AH N
+woldt W OW L T
+wolenzac W OW L AH N Z AE K
+wolenzac's W OW L AH N Z AE K S
+wolf W UH L F
+wolf's W UH L F S
+wolfarth W UH L F AA R TH
+wolfe W UH L F
+wolfe's W UH L F S
+wolfenbarger W UH L F IH N B AA R G ER
+wolfenden W UH L F EH N D AH N
+wolfenschmidt W UH L F AH N SH M IH T
+wolfensohn W UH L F AH N S AH N
+wolfer W UH L F ER
+wolfert W UH L F ER T
+wolff W UH L F
+wolfgang W UH L F G AE NG
+wolfgram W UH L F G R AE M
+wolfinbarger W UH L F IH N B AA R G ER
+wolfinger W UH L F IH NG ER
+wolfley W UH L F L IY
+wolfman W UH L F M AH N
+wolford W OW L F ER D
+wolfram W UH L F R AE M
+wolfrey W UH L F R IY
+wolfrom W UH L F R AH M
+wolfrum W UH L F R AH M
+wolfsburg W UH L F S B ER G
+wolfson W UH L F S AH N
+wolgamott W OW L G AH M AA T
+wolgast W OW L G AH S T
+wolgemuth W OW L G IH M UW TH
+wolin W OW L IH N
+wolinski V AH L IH N S K IY
+wolinsky V AH L IH N S K IY
+wolitarsky W OW L IH T AA R S K IY
+wolk W OW K
+wolkanczik W AH L K AE NG K Z IH K
+wolkanczik's W AH L K AE NG K Z IH K S
+wolke W OW L K
+wolken W OW K AH N
+wolken(2) W AO L K AH N
+wolkoff W OW L K AO F
+woll W AA L
+wollack W AA L AH K
+wollaeger W AH L EY G ER
+wollam W AA L AH M
+wollard W AA L ER D
+wolle W AA L
+wollen W AA L AH N
+wollenberg W AA L AH N B ER G
+wollenweber W AA L IH N W IH B ER
+woller W AA L ER
+wollin W AA L IH N
+wollman W AA L M AH N
+wollner W AA L N ER
+wollschlager W AA L SH L EY G ER
+wolman W AA L M AH N
+wolohan W AA L AH HH AE N
+woloszyn V AH L AA SH IH N
+wolpe W OW L P IY
+wolper W OW L P ER
+wolpert W OW L P ER T
+wolrath W OW L R AE TH
+wolsey W OW L S IY
+wolsfeld W OW L Z F EH L D
+wolske W OW L S K
+wolski V OW L S K IY
+wolsky V OW L S K IY
+wolstenholme W OW L S T IH N HH OW L M
+wolter W OW L T ER
+wolters W OW L T ER Z
+woltman W OW L T M AH N
+woltz W OW L T S
+wolven W UH L V AH N
+wolverine W UH L V ER IY N
+wolverine's W UH L V ER IY N Z
+wolverton W UH L V ER T AH N
+wolves W UH L V Z
+wolz W OW L Z
+womac W OW M AH K
+womack W OW M AE K
+woman W UH M AH N
+woman's W UH M AH N Z
+womanhood W UH M AH N HH UH D
+womanize W UH M AH N AY Z
+womanizer W UH M AH N AY Z ER
+womanizing W UH M AH N AY Z IH NG
+womb W UW M
+wombacher W AA M B AA K ER
+wombat W AA M B AE T
+wombats W AA M B AE T S
+womble W AA M B AH L
+wombles W AA M B AH L Z
+women W IH M AH N
+women's W IH M AH N Z
+womens' W IH M AH N Z
+womer W OW M ER
+wometco W OW M EH T K OW
+wommack W AA M AH K
+won W AH N
+won't W OW N T
+won(2) W AA N
+wond W AO N D
+wonda W AA N D AH
+wonder W AH N D ER
+wonder's W AH N D ER Z
+wondered W AH N D ER D
+wonderful W AH N D ER F AH L
+wonderfully W AH N D ER F AH L IY
+wonderfully(2) W AH N D ER F L IY
+wonderfulness W AH N D ER F AH L N AH S
+wondering W AH N D ER IH NG
+wonderland W AH N D ER L AE N D
+wonderly W AH N D ER L IY
+wonderment W AH N D ER M AH N T
+wonders W AH N D ER Z
+wondra W AA N D R AH
+wondrous W AH N D R AH S
+wong W AO NG
+wong's W AO NG Z
+wonk W AA N K
+wonks W AA N K S
+wonksahachee W AA N K S AH HH AE CH IY
+wonnacott W AH N AH K AA T
+wont W OW N T
+woo W UW
+woo's W UW Z
+wood W UH D
+wood's W UH D Z
+woodall W UH D AO L
+woodard W UH D ER D
+woodbeck W UH D B EH K
+woodberry W UH D B EH R IY
+woodbridge W UH D B R IH JH
+woodburn W UH D B ER N
+woodbury W UH D B EH R IY
+woodby W UH D B IY
+woodcarver W UH D K AA R V ER
+woodcarvers W UH D K AA R V ER Z
+woodchip W UH D CH IH P
+woodchips W UH D CH IH P S
+woodchuck W UH D CH AH K
+woodchucks W UH D CH AH K S
+woodcliff W UH D K L IH F
+woodcock W UH D K AA K
+woodcox W UH D K AA K S
+wooddell W UH D AH L
+wooded W UH D IH D
+woodell W UH D AH L
+wooden W UH D AH N
+woodfield W UH D F IY L D
+woodfill W UH D F IH L
+woodfin W UH D F IH N
+woodford W UH D F ER D
+woodfork W UH D F ER K
+woodhall W UH D HH AO L
+woodham W UH D HH AH M
+woodhams W UH D HH AH M Z
+woodhead W UH D HH EH D
+woodhouse W UH D HH AW S
+woodhull W UH D HH AH L
+woodie W UH D IY
+woodin W UH D IH N
+wooding W UH D IH NG
+woodington W UH D IH NG T AH N
+woodis W UH D IH S
+woodke W UH D K IY
+woodland W UH D L AE N D
+woodland(2) W UH D L AH N D
+woodlands W UH D L AE N D Z
+woodlands(2) W UH D L AH N D Z
+woodle W UH D AH L
+woodlee W UH D L IY
+woodley W UH D L IY
+woodlief W UH D L IY F
+woodliff W UH D L IH F
+woodling W UH D L IH NG
+woodlock W UH D L AA K
+woodlot W UH D L AA T
+woodmac W UH D M AE K
+woodman W UH D M AH N
+woodmansee W UH D M AH N S IY
+woodpecker W UH D P EH K ER
+woodpeckers W UH D P EH K ER Z
+woodpile W UH D P AY L
+woodpiles W UH D P AY L Z
+woodrich W UH D R IH CH
+woodrick W UH D R IH K
+woodring W UH D R IH NG
+woodrome W UH D R AH M
+woodroof W UH D R UW F
+woodrow W UH D R OW
+woodruff W UH D R AH F
+woodrum W UH D R AH M
+woods W UH D Z
+woodshed W UH D SH EH D
+woodsheds W UH D SH EH D Z
+woodside W UH D S AY D
+woodsmall W UH D S M AO L
+woodsman W UH D Z M AE N
+woodsmen W UH D Z M AH N
+woodsmen's W UH D Z M AH N Z
+woodson W UH D S AH N
+woodstock W UH D S T AA K
+woodstream W UH D S T R IY M
+woodward W UH D W AO R D
+woodward's W UH D W ER D Z
+woodward(2) W UH D W ER D
+woodwind W UH D W IH N D
+woodwinds W UH D W IH N D Z
+woodwork W UH D W ER K
+woodworker W UH D W ER K ER
+woodworkers W UH D W ER K ER Z
+woodworking W UH D W ER K IH NG
+woodworth W UH D W ER TH
+woody W UH D IY
+woody's W UH D IY Z
+woodyard W UH D Y AA R D
+wooed W UW D
+woof W UW F
+woofer W UH F ER
+woofers W UH F ER Z
+woofter W UW F T ER
+woogie W UW G IY
+woogie(2) W UH G IY
+wooing W UW IH NG
+wool W UH L
+woolard W UH L ER D
+woolbright W UH L B R AY T
+woolco W UH L K OW
+woolcock W UH L K AA K
+wooldridge W UH L D R IH JH
+woolen W UH L AH N
+woolens W UH L AH N Z
+woolery W UH L ER IY
+woolever W UH L EH V ER
+wooley W UH L IY
+woolf W UH L F
+woolfolk W UH L F OW K
+woolford W UH L F ER D
+woolfork W UH L F AO R K
+woollard W UH L ER D
+woollcott W UH L K AA T
+woollen W UH L AH N
+woolley W UH L IY
+woolly W UH L IY
+woolman W UH L M AH N
+woolridge W UH L R IH JH
+wools W UH L Z
+woolsey W UH L Z IY
+woolsey's W UH L Z IY Z
+woolson W UH L S AH N
+woolston W UH L S T AH N
+woolum W UH L AH M
+woolums W UH L AH M Z
+woolverton W UH L V ER T AH N
+woolwine W UH L W AY N
+woolworth W UH L W ER TH
+woolworth's W UH L W ER TH S
+wooly W UH L IY
+woomer W UW M ER
+woong W UW NG
+woos W UW Z
+woosley W UW Z L IY
+wooster W UW S T ER
+wootan W UW T AH N
+wooten W UW T AH N
+wooters W UW T ER Z
+wooton W UW T AH N
+wootten W UW T AH N
+wootton W UW T AH N
+woozy W UW Z IY
+wop W AA P
+wops W AA P S
+wor W AO R
+wor(2) D AH B EH L Y UW OW AA R
+wor(3) D AH B AH Y UW OW AA R
+worcester W UH S T ER
+worcestershire W UH S T AH SH ER
+word W ER D
+word's W ER D Z
+worded W ER D IH D
+wordell W ER D AH L
+worden W ER D AH N
+wording W ER D IH NG
+wordless W ER D L AH S
+wordperfect W ER D P ER F EH K T
+words W ER D Z
+wordsmith W ER D S M IH TH
+wordstar W ER D S T AA R
+wordsworth W ER D Z W ER TH
+wordy W ER D IY
+wore W AO R
+work W ER K
+work's W ER K S
+workable W ER K AH B AH L
+workaday W ER K AH D EY
+workaholic W ER K AH HH AA L IH K
+workaholics W ER K AH HH AA L IH K S
+workbench W ER K B EH N CH
+workday W ER K D EY
+workdays W ER K D EY Z
+worked W ER K T
+worker W ER K ER
+worker's W ER K ER Z
+workers W ER K ER Z
+workers' W ER K ER Z
+workfare W ER K F EH R
+workforce W ER K F AO R S
+workgroup W ER K G R UW P
+workgroups W ER K G R UW P S
+workhorse W ER K HH AO R S
+workhorses W ER K HH AO R S IH Z
+workin' W ER K AH N
+working W ER K IH NG
+workinger W ER K IH NG ER
+workings W ER K IH NG Z
+workload W ER K L OW D
+workloads W ER K L OW D Z
+workman W ER K M AH N
+workman's W ER K M AH N Z
+workmanlike W ER K M AE N L AY K
+workmanship W ER K M AH N SH IH P
+workmen W ER K M IH N
+workmen's W ER K M AH N Z
+workout W ER K AW T
+workouts W ER K AW T S
+workplace W ER K P L EY S
+workplaces W ER K P L EY S IH Z
+workroom W ER K R UW M
+works W ER K S
+works' W ER K S
+worksheet W ER K SH IY T
+worksheets W ER K SH IY T S
+workshop W ER K SH AA P
+workshops W ER K SH AA P S
+workstation W ER K S T EY SH AH N
+workstations W ER K S T EY SH AH N Z
+workweek W ER K W IY K
+workweeks W ER K W IY K S
+worland W ER L AH N D
+worlco W ER L K OW
+world W ER L D
+world's W ER L D Z
+worldcom W ER L D K AA M
+worldcorp W ER L D K AO R P
+worlder W ER L D ER
+worlders W ER L D ER Z
+worldliness W ER L D L IY N AH S
+worldly W ER L D L IY
+worldnews W ER L D N UW Z
+worldpass W ER L D P AE S
+worlds W ER L D Z
+worldscope W ER L D S K OW P
+worldspan W ER L D S P AE N
+worldvision W ER L D V IH ZH AH N
+worldwide W ER L D W AY D
+worldwide's W ER L D W AY D Z
+worley W ER L IY
+worm W ER M
+worm's W ER M Z
+worman W ER M AH N
+wormington W ER M IH NG T AH N
+wormley W ER M L IY
+wormlike W ER M L AY K
+worms W ER M Z
+wormser W ER M Z ER
+wormuth W ER M UW TH
+wormwood W ER M W UH D
+worn W AO R N
+worner W AO R N ER
+woronoff W AO R AH N AO F
+worrall W ER R AH L
+worrel W ER R AH L
+worrell W ER R AH L
+worried W ER IY D
+worrier W ER IY ER
+worriers W ER IY ER Z
+worries W ER IY Z
+worrisome W ER IY S AH M
+worry W ER IY
+worrying W ER IY IH NG
+worse W ER S
+worseck W ER S EH K
+worseck(2) W AO R S EH K
+worsen W ER S AH N
+worsened W ER S AH N D
+worsening W ER S AH N IH NG
+worsening(2) W ER S N IH NG
+worsens W ER S AH N Z
+worsham W ER SH AH M
+worship W ER SH AH P
+worship(2) W ER SH IH P
+worshiped W ER SH IH P T
+worshiper W ER SH AH P ER
+worshipers W ER SH IH P ER Z
+worshipful W ER SH AH P F AH L
+worshipped W ER SH AH P T
+worshippers W ER SH IH P ER Z
+worshipping W ER SH AH P IH NG
+worships W ER SH AH P S
+worsley W ER S L IY
+worst W ER S T
+worst-case W ER S T K EY S
+worsted W ER S T IH D
+worstell W ER S T AH L
+worster W ER S T ER
+worth W ER TH
+worth's W ER TH S
+wortham W ER TH AH M
+worthen W ER TH AH N
+worthen's W ER TH AH N Z
+worthey W ER DH IY
+worthier W ER DH IY ER
+worthies W ER DH IY Z
+worthiest W ER DH IY AH S T
+worthiness W ER DH IY N IH S
+worthing W ER TH IH NG
+worthington W ER DH IH NG T AH N
+worthless W ER TH L AH S
+worthley W ER TH L IY
+worthman W ER TH M AH N
+worthog W AO R T HH AO G
+worths W ER TH S
+worthwhile W ER TH W AY L
+worthy W ER DH IY
+wortley W ER T L IY
+wortman W ER T M AH N
+wortmann W ER T M AH N
+worton W ER T AH N
+worts W ER T S
+wotan W OW T AH N
+wotherspoon W AH DH ER S P UW N
+wotring W AA T ER IH NG
+wotton W AA T AH N
+wouk W UW K
+wouk(2) W OW K
+would W UH D
+would've W UH D AH V
+wouldn't W UH D AH N T
+woulfe W AW L F
+wound W AW N D
+wound(2) W UW N D
+wounded W UW N D AH D
+wounded(2) W UW N D IH D
+wounding W UW N D IH NG
+wounds W UW N D Z
+wouters W AW T ER Z
+wove W OW V
+woven W OW V AH N
+wow W AW
+wow's W AW Z
+wowed W AW D
+wowie W AW IY
+wowing W AW IH NG
+wows W AW Z
+woy W OY
+wozniak V AA Z N IY AE K
+woznick W AA Z N IH K
+woznicki V AH Z N IH T S K IY
+wozny W AA Z N IY
+wrack R AE K
+wracked R AE K T
+wracking R AE K IH NG
+wrage R EY JH
+wragg R AE G
+wrangell R AE NG G AH L
+wrangle R AE NG G AH L
+wrangled R AE NG G AH L D
+wrangler R AE NG G AH L ER
+wrangler(2) R AE NG G L ER
+wranglers R AE NG G AH L ER Z
+wranglers(2) R AE NG G L ER Z
+wrangles R AE NG G AH L Z
+wrangling R AE NG G AH L IH NG
+wrangling(2) R AE NG G L IH NG
+wranglings R AE NG G AH L IH NG Z
+wranglings(2) R AE NG G L IH NG Z
+wrap R AE P
+wrapped R AE P T
+wrapper R AE P ER
+wrappers R AE P ER Z
+wrapping R AE P IH NG
+wraps R AE P S
+wrapup R AE P AH P
+wrath R AE TH
+wrather R AE DH ER
+wray R EY
+wreak R IY K
+wreaked R IY K T
+wreaking R IY K IH NG
+wreaks R IY K S
+wreath R IY TH
+wreaths R IY TH S
+wreaths(2) R IY DH Z
+wreck R EH K
+wreckage R EH K AH JH
+wreckage(2) R EH K IH JH
+wrecked R EH K T
+wrecker R EH K ER
+wrecking R EH K IH NG
+wrecks R EH K S
+wrede R IY D
+wren R EH N
+wrench R EH N CH
+wrenched R EH N CH T
+wrenches R EH N CH IH Z
+wrenching R EH N CH IH NG
+wrenn R EH N
+wrest R EH S T
+wrested R EH S T IH D
+wresting R EH S T IH NG
+wrestle R EH S AH L
+wrestled R EH S AH L D
+wrestler R EH S AH L ER
+wrestler(2) R EH S L ER
+wrestlers R EH S L ER Z
+wrestlers(2) R EH S AH L ER Z
+wrestles R EH S AH L Z
+wrestling R EH S L IH NG
+wrestling(2) R EH S AH L IH NG
+wretched R EH CH IH D
+wretchedly R EH CH IH D L IY
+wrice R AY S
+wriggle R IH G AH L
+wright R AY T
+wright's R AY T S
+wrights R AY T S
+wrightsman R AY T S M AH N
+wrightson R AY T S AH N
+wrigley R IH G L IY
+wrigley's R IH G L IY Z
+wring R IH NG
+wringer R IH NG ER
+wringing R IH NG IH NG
+wrinkle R IH NG K AH L
+wrinkled R IH NG K AH L D
+wrinkles R IH NG K AH L Z
+wrinkling R IH NG K AH L IH NG
+wrinkling(2) R IH NG K L IH NG
+wrisley R IH Z L IY
+wrist R IH S T
+wriston R IH S T AH N
+wrists R IH S T S
+wristwatch R IH S T W AA CH
+wristwatches R IH S T W AA CH IH Z
+writ R IH T
+write R AY T
+writedown R AY T D AW N
+writedowns R AY T D AW N Z
+writeoff R AY T AO F
+writeoffs R AY T AO F S
+writer R AY T ER
+writer's R AY T ER Z
+writers R AY T ER Z
+writers' R AY T ER Z
+writes R AY T S
+writhe R IH TH
+writhing R AY DH IH NG
+writhing(2) R IH TH IH NG
+writing R AY T IH NG
+writings R AY T IH NG Z
+writs R IH T S
+written R IH T AH N
+wrobel R OW B AH L
+wrobleski R AH B L EH S K IY
+wroblewski R AH B L UW F S K IY
+wroclaw R AA K L AO
+wroe R OW
+wrona R OW N AH
+wrong R AO NG
+wrongdoer R AO NG D UW ER
+wrongdoers R AO NG D UW ER Z
+wrongdoing R AO NG D UW IH NG
+wrongdoings R AO NG D UW IH NG Z
+wronged R AO NG D
+wrongful R AO NG F AH L
+wrongfully R AO NG F AH L IY
+wrongheaded R AO NG HH EH D IH D
+wrongly R AO NG L IY
+wrongs R AO NG Z
+wronski R AA N S K IY
+wrote R OW T
+wroten R OW T AH N
+wrought R AO T
+wrubel R UW B AH L
+wruck R AH K
+wrung R AH NG
+wry R AY
+wrye R AY
+wryly R AY L IY
+wryness R AY N AH S
+wrzesinski R AH Z IH S IH N S K IY
+ws D AH B AH L Y UW EH S
+ws(2) D AH B Y AH EH S
+wu W UW
+wu's W UW Z
+wu(2) D AH B AH L Y UW Y UW
+wu(3) D AH B Y AH Y UW
+wubben W AH B AH N
+wuellner W UH L N ER
+wuensch W UH N SH
+wuerth W UH R TH
+wuerttemberg W ER T AH M B ER G
+wuertz W UH R T S
+wuest W UW IH S T
+wuhan W UW AH N
+wujcik W AH JH S IH K
+wulf W UH L F
+wulff W UH L F
+wuli W UW L IY
+wuliger W UW L IH G ER
+wunder W AH N D ER
+wunderkind W AH N D ER K AY N D
+wunderkind(2) W AH N D ER K IH N D
+wunderle W AH N D ER L IY
+wunderlich W AH N D ER L IH K
+wunderlin W AH N D ER L IH N
+wunsch W AH N SH
+wunschel W AH N SH AH L
+wurdeman W ER D M AH N
+wurl W ER L
+wurlitzer W ER L IH T S ER
+wurm W ER M
+wurst W ER S T
+wurster W ER S T ER
+wursthaus W ER S T HH AW S
+wurth W ER TH
+wurtman W ER T M AH N
+wurtz W ER T S
+wurtzel W ER T Z AH L
+wurz W ER Z
+wurzel W ER Z AH L
+wurzer W ER Z ER
+wuss W AH S
+wussler W AH S L ER
+wussow W AH S OW
+wuthering W AH DH ER IH NG
+wuthrich W AH TH R IH K
+wuttke W AH T K IY
+wuxi W AH K S IY
+wuyda W OY D AH
+wuzzy W UH Z IY
+wy W EY
+wy(2) D AH B AH L Y UW W AY
+wyand W AY AH N D
+wyant W AY AH N T
+wyatt W AY AH T
+wyatt's W AY AH T S
+wyble W AY B AH L
+wyborn V IH B ER N
+wyche W AY CH
+wyckoff W IH K AO F
+wycliff W IH K L IH F
+wycoff W IH K AO F
+wyden W AY D
+wyden(2) W AY D AH N
+wydra W AY D R AH
+wye W AY
+wyer W AY ER
+wyers W AY ER Z
+wyeth W AY EH TH
+wyffels W IH F AH L Z
+wygal W AY G AH L
+wygant W AY G AH N T
+wygod W AY G AA D
+wyk W IH K
+wyka V IH K AH
+wyke W AY K
+wykes W AY K S
+wykle W AY K AH L
+wykoff W IH K AO F
+wyland W AY L AH N D
+wylde W AY L D
+wyle W AY L
+wyler W AY L ER
+wyles W AY L Z
+wylie W AY L IY
+wyllie W IH L IY
+wylma W AY L M AH
+wyly W AY L IY
+wyman W AY M AH N
+wymer W AY M ER
+wymore W AY M AO R
+wyndham W IH N D AH M
+wyne W AY N
+wyner W AY N ER
+wynes W AY N Z
+wynette W IH N EH T
+wynette(2) HH W IH N EH T
+wyngaarden W IH N G AA R D AH N
+wynia W IH N IY AH
+wynkoop W IH NG K UW P
+wynn W IH N
+wynn's W IH N Z
+wynne W IH N
+wynns W IH N Z
+wynona W AY N OW N AH
+wynona(2) HH W AY N OW N AH
+wynter W IH N T ER
+wynton W IH N T AH N
+wynyard W IH N Y ER D
+wyoming W AY OW M IH NG
+wyoming's W AY OW M IH NG Z
+wyre W AY R
+wyrick W IH R IH K
+wyse W AY Z
+wyse's W AY Z IH Z
+wyser W AY Z ER
+wysocki V IH S OW T S K IY
+wysocki(2) V IH S AA T S K IY
+wysong W IH S AO NG
+wyss W IH S
+wyszynski V IH SH IH N S K IY
+wythe W AY DH
+x EH K S
+x's EH K S IH Z
+x-acto EH G Z AE K T OW
+x-ray EH K S R EY
+x-rays EH K S R EY Z
+x. EH K S
+x.'s EH K S IH Z
+x.(2) AE K S
+x.ers EH K S ER Z
+x.s EH K S IH Z
+xan SH AA N
+xanada Z AH N AA D AH
+xanax Z AE N AE K S
+xanthe Z AE N DH
+xantippe Z AE N T IH P
+xaver Z EY V ER
+xavier Z EY V Y ER
+xaviera IH G Z EY V Y EH R AH
+xebec Z EH B AH K
+xena Z IY N AH
+xene Z IY N
+xenia Z IY N IY AH
+xenon Z IY N AA N
+xenophobia Z EH N AH F OW B IY AH
+xenophobic Z EH N AH F AA B IH K
+xenophon Z EH N AH F AH N
+xenos Z IY N OW Z
+xeriscape Z EH R IH S K EY P
+xerox Z IH R AA K S
+xerox's Z IH R AA K S IH Z
+xeroxed Z IH R AA K S T
+xeroxes Z IH R AA K S IH Z
+xeroxing Z IH R AA K S IH NG
+xers EH K S EH R Z
+xers(2) K S EH R Z
+xers(3) EH K S IY AA R EH S
+xerxes Z ER K S IY Z
+xhosa Z OW SH AH
+xi SH IY
+xiamen Z IY EY M AH N
+xian Z Y AA N
+xiang SH IY AA NG
+xiao ZH AW
+xiaogang ZH AW G AE NG
+xiaoping ZH AW P IH NG
+xiaoping's ZH AW P IH NG Z
+xiaoyun SH AW Y UW N
+xicor Z AY K AO R
+xidex Z IH D AH K S
+xie Z IY
+xilinx Z AY L IH NG K S
+xing SH IH NG
+xinhua Z IH N HH Y UW AH
+xinjiang Z IH N JH IY AE NG
+xio ZH AO
+xiong ZH AO NG
+xoma Z OW M AH
+xoma's Z OW M AH Z
+xoma's(2) IH G Z OW M AH Z
+xoma's(3) EH K S OW M AH Z
+xoma(2) IH G Z OW M AH
+xoma(3) EH K S OW M AH
+xscribe EH K S K R AY B
+xtra EH K S T R AH
+xu Z UW
+xuan ZH W AA N
+xudong Z UW D AO NG
+xudong(2) ZH W EY D AO NG
+xue Z UW
+xuedong Z UW D AO NG
+xuemei Z UW M AY
+xus Z AH S
+xylia Z AY L IY AH
+xylina Z AY L IH N AH
+xylogic Z AY L AA JH IH K
+xylogics Z AY L AA JH IH K S
+xylon Z AY L AH N
+xylona Z AY L AH N AH
+xylophone Z AY L AH F OW N
+xyvision Z AY V IH ZH AH N
+y W AY
+y'all Y AO L
+y's W AY Z
+y. W AY
+y.'s W AY Z
+ya Y AA
+ya'll Y AA L
+yaacov Y AA K OW V
+yabba Y AE B AH
+yabbadabbadoo Y AE B AH D AE B AH D UW
+yablon Y AE B L AH N
+yablonski Y AH B L AA N S K IY
+yablonsky Y AH B L AA N S K IY
+yacht Y AA T
+yachter Y AA T ER
+yachters Y AA T ER Z
+yachting Y AA T IH NG
+yachting's Y AA T IH NG Z
+yachts Y AA T S
+yachtsman Y AA T S M AH N
+yack Y AE K
+yackel Y AE K AH L
+yackley Y AE K L IY
+yacko Y AE K OW
+yacktman Y AE K T M AH N
+yacono Y AE K AH N OW
+yacos Y AA K OW S
+yacoub Y AE K AW B
+yadda Y AA D AH
+yaden Y EY D AH N
+yadon Y AE D AH N
+yaeger Y IY JH ER
+yaffe Y AE F
+yager Y EY JH ER
+yagi Y AA G IY
+yagoda Y AH G OW D AH
+yah Y AA
+yahi Y AA HH IY
+yahn Y AE N
+yahnke Y AE NG K
+yahoo Y AA HH UW
+yahoos Y AA HH UW Z
+yahr Y AA R
+yahweh Y AA W EH
+yahya Y AH Y AH
+yak Y AE K
+yake Y EY K
+yakel Y AE K AH L
+yakima Y AE K IH M AH
+yaklin Y AE K L IH N
+yakov Y AA K AO V
+yakovlev Y AH K AA V L AH V
+yakovlev(2) Y AA K AH V L EH V
+yakusa Y AH K UW Z AH
+yakutakay Y AH HH UW T AH K EY
+yale Y EY L
+yale's Y EY L Z
+yalin Y AA L IH N
+yalta Y AO L T AH
+yam Y AE M
+yamada Y AH M AA D AH
+yamagata Y AA M AA G AA T AH
+yamaguchi Y AA M AA G UW CH IY
+yamaha Y AA M AA HH AA
+yamaichi Y AA M AA IY CH IY
+yamaichi's Y AA M AA IY CH IY Z
+yamamoto Y AA M AA M OW T OW
+yamanaka Y AA M AA N AA K AH
+yamane Y AA M AA N EY
+yamane(2) Y AH M AA N IY
+yamani Y AA M AA N IY
+yamanouchi Y AA M AA N UW CH IY
+yamasaki Y AA M AA S AA K IY
+yamashiro Y AA M AA SH IH R OW
+yamashita Y AA M AA SH IY T AH
+yamatake Y AA M AA T AA K EY
+yamato Y AA M AA T OW
+yamauchi Y AA M AA UW CH IY
+yamauchi's Y AA M AA UW CH IY Z
+yamazaki Y AA M AA Z AA K IY
+yamin Y AE M IH N
+yams Y AE M Z
+yan Y AE N
+yan-bin Y AA N B IH N
+yanbu Y AE N B UW
+yancey Y AE N S IY
+yancy Y AE N S IY
+yanda Y AE N D AH
+yandell Y AE N D AH L
+yandle Y AE N D AH L
+yandow Y AE N D OW
+yanes Y EY N Z
+yaney Y EY N IY
+yanez Y AE N IH Z
+yang Y AE NG
+yangsheng Y AA NG SH EH NG
+yangtze Y AE NG K T S IY
+yani Y AA N IY
+yanick Y AE N IH K
+yanik Y AE N IH K
+yanis Y AE N AH S
+yanish Y AE N IH SH
+yank Y AE NG K
+yankass Y AE NG K AE S
+yanke Y AE NG K
+yanked Y AE NG K T
+yankee Y AE NG K IY
+yankee's Y AE NG K IY Z
+yankees Y AE NG K IY Z
+yankees' Y AE NG K IY Z
+yankelovich Y AE NG K EH L AH V IH CH
+yankey Y AE NG K IY
+yanking Y AE NG K IH NG
+yanko Y AE NG K OW
+yankovich Y AE NG K AH V IH CH
+yankowski Y AH NG K AO F S K IY
+yanks Y AE NG K S
+yanni Y AE N IY
+yannick Y AE N IH K
+yannone Y AE N AH N
+yannuzzi Y AA N UW T S IY
+yano Y AA N OW
+yanofsky Y AH N AA F S K IY
+yanomami Y AE N OW M AE M IY
+yanomami(2) Y AA N OW M AA M IY
+yant Y AE N T
+yantis Y AE N T IH S
+yantz Y AE N T S
+yao Y AW
+yaobang Y AW B AE NG
+yaohan Y AW HH AA N
+yap Y AE P
+yaple Y EY P AH L
+yapp Y AE P
+yaps Y AE P S
+yarber Y AA R B ER
+yarberry Y AA R B EH R IY
+yarboro Y AA R B ER OW
+yarborough Y AA R B ER OW
+yarbough Y AA R B AW
+yarbro Y AA R B R OW
+yarbrough Y AA R B ER OW
+yarchoan Y AA R CH OW N
+yard Y AA R D
+yard's Y AA R D Z
+yardage Y AA R D IH JH
+yarde Y AA R D
+yardeni Y AA R D IY N IY
+yarder Y AA R D ER
+yardley Y AA R D L IY
+yards Y AA R D Z
+yardstick Y AA R D S T IH K
+yardsticks Y AA R D S T IH K S
+yarger Y AA R JH ER
+yarling Y AA R L IH NG
+yarmulke Y AA R M AH L K AH
+yarmulke(2) Y AA R M AH K AH
+yarmulkes Y AA R M AH L K AH S
+yarmulkes(2) Y AA R M AH K AH S
+yarn Y AA R N
+yarnall Y AA R N AH L
+yarnell Y AA R N AH L
+yarns Y AA R N Z
+yaron Y EH R AH N
+yaros Y EH R OW Z
+yarosh Y AE R AH SH
+yarrington Y AE R IH NG T AH N
+yarrow Y EH R OW
+yarrow(2) Y AA R OW
+yarwood Y AA R W UH D
+yasin Y AE S IH N
+yasir Y AA S ER
+yasir(2) Y AA S IH R
+yasmin Y AE Z M IH N
+yasmine Y AE Z M IH N
+yass Y AE S
+yasser Y AE S ER
+yasser's Y AE S ER Z
+yasser's(2) Y AA S ER Z
+yasser(2) Y AA S ER
+yassin Y AE S IH N
+yassir Y AE S IH R
+yassir's Y AE S IH R Z
+yassir's(2) Y AA S IH R Z
+yassir(2) Y AA S IH R
+yasso Y AA S OW
+yassukovich Y AH S UW K AH V IH CH
+yastrow Y AE S T R OW
+yasuda Y AA S UW D AH
+yasuhiko Y AA S UW HH IY K OW
+yasuhiro Y AA S UW HH IY R OW
+yasunori Y AA S UW N AO R IY
+yasuo Y AA S UW OW
+yasushi Y AA S UW SH IY
+yasutaka Y AA S UW T AA K AH
+yasuyoshi Y AA S UW Y OW SH IY
+yater Y EY T ER
+yates Y EY T S
+yatsko Y AA T S K OW
+yau Y OW
+yauch Y AO CH
+yauger Y AO JH ER
+yaun Y AO N
+yaupon Y AO P AH N
+yaupons Y AO P AH N Z
+yavlinsky Y AE V L IH N S K IY
+yaw Y AO
+yawn Y AO N
+yawned Y AO N D
+yawner Y AO N ER
+yawning Y AO N IH NG
+yawns Y AO N Z
+yaworski Y AH W ER S K IY
+yax Y AE K S
+yay Y EY
+yazov Y AE Z AA V
+yazov(2) Y AA Z AO V
+yazzie Y AE Z IY
+ybanez IY B AE N IH Z
+ybarbo IY B AA R B OW
+ybarra IY B AA R AH
+ydstie Y IH D S T IY
+ydstie's Y IH D S T IY Z
+ydstie's(2) IH D S T IY Z
+ydstie(2) IH D S T IY
+ye Y IY
+ye(2) Y EH
+ye-yi Y EY Y IY
+yea Y EY
+yeadon Y EH D AH N
+yeager Y EY G ER
+yeagle Y IY G AH L
+yeagley Y IY G L IY
+yeah Y AE
+yeakel Y IY K AH L
+yeakey Y IY K IY
+yeakle Y IY K AH L
+yeakley Y IY K L IY
+yeaman Y IY M AH N
+yeamans Y IY M AH N Z
+year Y IH R
+year's Y IH R Z
+yearago Y IH R AH G OW
+yearbook Y IH R B UH K
+yearbooks Y IH R B UH K S
+yearby Y ER B IY
+yearearlier Y IH R ER L Y ER
+yearend Y IH R EH N D
+yeargain Y ER G AH N
+yeargain(2) Y IH G EY N
+yeargan Y ER G AH N
+yeargin Y ER JH IH N
+yearick Y IY R IH K
+yearick(2) Y IH R IH K
+yearling Y ER L IH NG
+yearling(2) Y IH L IH NG
+yearlings Y ER L IH NG Z
+yearlings(2) Y IH L IH NG Z
+yearlong Y IH R L AO NG
+yearly Y IH R L IY
+yearn Y ER N
+yearned Y ER N D
+yearning Y ER N IH NG
+yearnings Y ER N IH NG Z
+yearns Y ER N Z
+yearout Y IH R AW T
+years Y IH R Z
+years' Y IH R Z
+years(2) Y ER Z
+yearsley Y ER S L IY
+yearwood Y IH R W UH D
+yeary Y IH R IY
+yeas Y EY Z
+yeas(2) Y IY Z
+yeas(3) Y IY S
+yeast Y IY S T
+yeasts Y IY S T S
+yeater Y IY T ER
+yeates Y IY EY T S
+yeatman Y IY T M AH N
+yeaton Y IY T AH N
+yeats Y EY T S
+yeatts Y IY T S
+yeazel Y IY Z AH L
+yeck Y EH K
+yeckley Y EH K L IY
+yedda Y EH D AH
+yedinak Y EH D IH N AE K
+yediyat Y EH D IH Y AE T
+yee Y IY
+yegor Y EY G ER
+yeh Y EH
+yehiya Y AH HH IY AH
+yehle Y EH HH AH L
+yehuda Y AH HH UW D AH
+yehudi Y EY HH UW D IY
+yeiri Y EH R IY
+yeiser Y IY S ER
+yeisley Y IY S L IY
+yekaterinburg Y EH K AE T ER IY N B AH R G
+yeldell Y EH L D AH L
+yelena Y EH L IH N AH
+yell Y EH L
+yelland Y EH L AH N D
+yelle Y EH L
+yelled Y EH L D
+yellen Y EH L AH N
+yellin Y EH L IH N
+yellin' Y EH L IH N
+yelling Y EH L IH NG
+yellow Y EH L OW
+yellower Y EH L OW ER
+yellowest Y EH L OW IH S T
+yellowing Y EH L OW IH NG
+yellowish Y EH L OW IH SH
+yellowknife Y EH L OW N AY F
+yellows Y EH L OW Z
+yellowstone Y EH L OW S T OW N
+yellowstone's Y EH L OW S T OW N Z
+yells Y EH L Z
+yelp Y EH L P
+yelping Y EH L P IH NG
+yelton Y EH L T AH N
+yeltsin Y EH L T S AH N
+yeltsin's Y EH L T S AH N Z
+yelverton Y EH L V ER T AH N
+yelvington Y EH L V IH NG T AH N
+yemen Y EH M AH N
+yemen's Y EH M AH N Z
+yemeni Y EH M AH N IY
+yemeni(2) Y EH M IY N IY
+yemenidjian Y EH M AH N IH JH IY AH N
+yen Y EH N
+yen's Y EH N Z
+yenching Y EH N CH IH NG
+yender Y EH N D ER
+yene Y EH N IY
+yene(2) Y EH N
+yenlu Y EH N L UW
+yentl Y EH N T AH L
+yeo Y IY OW
+yeoman Y OW M AH N
+yeoman's Y OW M AH N Z
+yeomans Y OW M AH N Z
+yeosock Y OW S AO K
+yep Y EH P
+yepez Y EH P IH Z
+yepsen Y EH P S EH N
+yer Y ER
+yerby Y ER B IY
+yerdon Y ER D AH N
+yerena Y EH R IH N AH
+yerevan Y EH R AH V AH N
+yerger Y ER JH ER
+yergin Y ER G AH N
+yerian Y IY R IY AH N
+yerke Y ER K
+yerkes Y ER K IY Z
+yerkey Y ER K IY
+yerman Y ER M AH N
+yerxa Y ER K S AH
+yes Y EH S
+yesen Y EH S AH N
+yeses Y EH S IH Z
+yeshiva Y IH SH IY V AH
+yeske Y EH S K
+yessuey Y EH S UW IY
+yest Y EH S T
+yesterday Y EH S T ER D EY
+yesterday's Y EH S T ER D EY Z
+yesterday's(2) Y EH S T ER D IY Z
+yesterday(2) Y EH S T ER D IY
+yesterdays Y EH S T ER D EY Z
+yesterdays(2) Y EH S T ER D IY Z
+yesteryear Y EH S T ER Y IH R
+yet Y EH T
+yeti Y EH T IY
+yetman Y EH T M AH N
+yetnikoff Y EH T N IH K AO F
+yett Y EH T
+yetta Y EH T AH
+yetter Y EH T ER
+yeung Y UW NG
+yeutter Y UW T ER
+yevette Y IH V EH T
+yevgeny Y EH V G EH N IY
+yevlinsky Y EH V L IH N S K IY
+yevlinsky's Y EH V L IH N S K IY Z
+yevtushenko Y EH V T AH SH EH NG K OW
+yew Y UW
+yew's Y UW Z
+yglesias IY G L EY S IY AH S
+yi Y IY
+yiddish Y IH D IH SH
+yie Y IY
+yie(2) Y AY
+yield Y IY L D
+yielded Y IY L D AH D
+yielded(2) Y IY L D IH D
+yielding Y IY L D IH NG
+yields Y IY L D Z
+yigal Y IH G AE L
+yigal(2) Y IH G AA L
+yigal(3) Y IY G AA L
+yikes Y AY K S
+yilin Y IH L IH N
+yim Y IH M
+yin Y IH N
+ying Y IH NG
+yinger Y IH NG ER
+yingling Y IH NG G AH L IH NG
+yingling(2) Y IH NG G L IH NG
+yingst Y IH NG G S T
+yingst(2) Y IH NG K S T
+yip Y IH P
+yippee Y IH P IY
+yirng-an Y IH R NG AA N
+yitzhak Y IH T S AA K
+yitzhak(2) Y IH T S AE K
+ylang-ylang Y AH L AE NG Y AH L AE NG
+ylvisaker Y IH L V IH S AA K ER
+ynez Y N EH Z
+yniguez IY N IY G EH Z
+ynjiun Y IH N JH IH N
+ynjiun(2) Y IH N JH IY UW N
+yo Y OW
+yoak Y OW K
+yoakam Y OW K AH M
+yoakum Y OW K AH M
+yoast Y OW S T
+yocam Y OW K AH M
+yocham Y AA CH AH M
+yochelson Y OW K EH L S AH N
+yochelson(2) Y OW CH EH L S AH N
+yochim Y AA CH IH M
+yochum Y AA CH AH M
+yochum(2) Y AA K AH M
+yockey Y AA K IY
+yocom Y OW K AH M
+yocum Y OW K AH M
+yodel Y OW D AH L
+yodeling Y OW D AH L IH NG
+yodeling(2) Y OW D L IH NG
+yoder Y OW D ER
+yodice Y OW D IH S
+yoe Y OW
+yoes Y OW Z
+yoest Y EH S T
+yoest(2) Y AO S T
+yoffie Y AO F IY
+yoga Y OW G AH
+yogi Y OW G IY
+yogiism Y OW G IH Z AH M
+yogiism(2) Y OW G IH S AH M
+yogiisms Y OW G IY S AH M Z
+yogiisms(2) Y OW G IH Z AH M Z
+yogurt Y OW G ER T
+yoh Y OW
+yohe Y OW HH EY
+yohei Y OW HH EY
+yohn Y AA N
+yoho Y OW HH OW
+yoichi Y OW IY CH IY
+yokado Y AH K AA D OW
+yoke Y OW K
+yoked Y OW K T
+yokel Y OW K EH L
+yokelson Y OW K EH L S AH N
+yokes Y OW K S
+yokich Y OW K IH CH
+yokley Y AA K L IY
+yoko Y OW K OW
+yokohama Y OW K AH HH AA M AH
+yokokohji Y OW K OW K OW JH IY
+yokota Y OW K OW T AH
+yokoyama Y OW K OW Y AA M AH
+yokum Y OW K AH M
+yola Y OW L AH
+yolanda Y OW L AA N D AH
+yolande Y OW L AH N D
+yolk Y OW K
+yolks Y OW K S
+yom Y AA M
+yom's Y AA M Z
+yom's(2) Y OW M Z
+yom(2) Y OW M
+yomiuri Y OW M IY ER IY
+yon Y AA N
+yona Y OW N AH
+yonan Y OW N AH N
+yonce Y AA N S
+yonder Y AA N D ER
+yoneyama Y OW N IY AA M AH
+yong Y AO NG
+yongbyon Y AO NG B Y AO N
+yongbyon's Y AO NG B Y AO N Z
+yongchaiyudh Y AO NG CH EY Y UW D
+yongue Y AA NG G
+yonhap Y AA N HH AE P
+yonke Y AA NG K
+yonker Y AA NG K ER
+yonkers Y AA NG K ER Z
+yonsei Y AH N S EY
+yontef Y AO N T EH F
+yonts Y AA N T S
+yontz Y AA N T S
+yoo Y UW
+yoon Y UW N
+yoor Y UW R
+yoor's Y UW R Z
+yoos Y UW Z
+yopp Y AA P
+yoram Y AO R AH M
+yorba Y AO R B AH
+yordy Y AO R D IY
+yore Y AO R
+yorich Y AO R IH CH
+yorio Y AO R Y OW
+york Y AO R K
+york's Y AO R K S
+yorkbased Y AO R K B EY S T
+yorke Y AO R K
+yorker Y AO R K ER
+yorker's Y AO R K ER Z
+yorkers Y AO R K ER Z
+yorks Y AO R K S
+yorkshire Y AO R K SH ER
+yorktown Y AO R K T AW N
+yorktown's Y AO R K T AW N Z
+yorrick Y AO R IH K
+yoruba Y AH R UW B AH
+yosef Y OW S AH F
+yosemite Y OW S EH M IH T IY
+yoshi Y OW SH IY
+yoshiaki Y OW SH IY AA K IY
+yoshida Y OW SH IY D AH
+yoshihara Y OW SH IH HH AA R AH
+yoshihashi Y OW SH IH HH AA SH IY
+yoshihiro Y OW SH IH HH IY R OW
+yoshihiro's Y OW SH IH HH IY R OW Z
+yoshihisa Y OW SH IH HH IY S AH
+yoshikawa Y OW SH IY K AA W AH
+yoshikazu Y OW SH IH K AA Z UW
+yoshimoto Y OW SH IY M OW T OW
+yoshimura Y OW SH IH M UW R AH
+yoshino Y OW SH IY N OW
+yoshio Y OW SH IY OW
+yoshioka Y OW SH IY OW K AH
+yoshiro Y OW SH IH R OW
+yoss Y AO S
+yossi Y OW S IY
+yost Y OW S T
+yother Y AH DH ER
+yott Y AA T
+you Y UW
+you'd Y UW D
+you'd(2) Y UH D
+you'll Y UW L
+you're Y UH R
+you're(2) Y UW R
+you've Y UW V
+youell Y AA UW L
+youghal Y OW AH L
+youker Y AW K ER
+youman Y UW M AH N
+youmans Y UW M AH N Z
+youn Y AH N
+younan Y AH N AH N
+younce Y AW N S
+younes Y AH N Z
+young Y AH NG
+young's Y AH NG Z
+youngberg Y AH NG B ER G
+youngblood Y AH NG B L AH D
+youngblut Y AH NG B L AH T
+youngdahl Y AH NG D AA L
+younge Y AH N JH
+younger Y AH NG G ER
+youngerman Y AH NG ER M AH N
+youngers Y AH NG G ER Z
+youngest Y AH NG G AH S T
+younglove Y AH NG L AH V
+youngman Y AH NG M AE N
+youngquist Y AH NG K W IH S T
+youngren Y AH N G R EH N
+youngs Y AH NG Z
+youngster Y AH NG S T ER
+youngster's Y AH NG S T ER Z
+youngsters Y AH NG S T ER Z
+youngsters' Y AH NG S T ER Z
+youngstown Y AH NG Z T AW N
+youngstrom Y AH NG S T R AH M
+younis Y AH N IH S
+younker Y AH NG K ER
+younkers Y AH NG K ER Z
+younkers' Y AH NG K ER Z
+younkin Y AH NG K IH N
+younkins Y AH NG K IH N Z
+yount Y AW N T
+younts Y AW N T S
+your Y AO R
+your(2) Y UH R
+youree Y AO R IY
+youri Y UH R IY
+yours Y UH R Z
+yours(2) Y AO R Z
+yours(3) Y ER Z
+yourself Y ER S EH L F
+yourself(2) Y UH R S EH L F
+yourself(3) Y AO R S EH L F
+yourselfer Y AO R S EH L F ER
+yourselfers Y AO R S EH L F ER Z
+yourselves Y UH R S EH L V Z
+yourselves(2) Y AO R S EH L V Z
+yous Y UW S
+youse Y AW S
+youse(2) Y UW Z
+yousef Y UW S EH F
+yousef's Y UW S EH F S
+yousif Y AW S IH F
+yousif(2) Y UW S IH F
+youssef Y UW S EH F
+youth Y UW TH
+youth's Y UW TH S
+youthful Y UW TH F AH L
+youths Y UW DH Z
+youths(2) Y UW TH S
+youtsey Y AW T S IY
+youtz Y AW T S
+youville Y UW V IH L
+yow Y AW
+yowell Y AA W EH L
+yoy Y OY
+yoyo Y OW Y OW
+yoyos Y OW Y OW Z
+ypsilanti IH P S AH L AE N T IY
+yquem IY K W AH M
+ysleta IY S L EY T AH
+yttrium IH T R IY AH M
+yu Y UW
+yu's Y UW Z
+yuan Y UW AA N
+yuan's Y UW AA N Z
+yuba Y UW B AH
+yucaipa Y UW K AY P AH
+yucatan Y UW K AH T AE N
+yucca Y AH K AH
+yuck Y AH K
+yucky Y AH K IY
+yue Y UW
+yuen Y W EH N
+yuen(2) Y UW EH N
+yugo Y UW G OW
+yugo's Y UW G OW Z
+yugos Y UW G OW S
+yugoslav Y UW G OW S L AA V
+yugoslavia Y UW G OW S L AA V IY AH
+yugoslavia's Y UW G OW S L AA V IY AH Z
+yugoslavian Y UW G OW S L AA V IY AH N
+yugoslavs Y UW G OW S L AE V Z
+yuhas Y UW HH AH Z
+yuhasz Y AH HH AH SH
+yuichi Y UW CH IY
+yuichi(2) Y UW IY CH IY
+yuill Y UW L
+yuille Y UW L
+yuk Y AH K
+yukio Y UW K IY OW
+yuko Y UW K OW
+yukon Y UW K AA N
+yuks Y AH K S
+yul Y AH L
+yule Y UW L
+yuletide Y UW L T AY D
+yuli Y UW L IY
+yulian Y UW L IY AH N
+yum Y AH M
+yuma Y UW M AH
+yuma's Y UW M AH Z
+yummies Y AH M IY Z
+yummy Y AH M IY
+yun Y AH N
+yunde Y UW N D EY
+yundt Y AH N D T
+yung Y AH NG
+yung's Y AH NG Z
+yunich Y UW N IH CH
+yunis Y UW N IH S
+yunk Y AH NG K
+yunker Y AH NG K ER
+yup Y AH P
+yuppie Y AH P IY
+yuppies Y AH P IY Z
+yuppified Y AH P IH F AY D
+yuppify Y AH P IH F AY
+yurachek Y ER AE CH EH K
+yurchak Y ER CH AH K
+yurchak(2) Y ER AH K
+yurchenko Y ER CH EH NG K OW
+yurek Y UH R EH K
+yuri Y UH R IY
+yurick Y UH R IH K
+yurko Y ER K OW
+yurkovich Y ER K AH V IH CH
+yurman Y ER M AH N
+yurt Y UH R T
+yury Y UH R IY
+yusef Y UW S EH F
+yusef's Y UW S EH F S
+yusen Y UW S AH N
+yusko Y AH S K OW
+yust Y AH S T
+yustef Y UW S T EH F
+yutaka Y UW T AA K AH
+yutzy Y AH T Z IY
+yuval Y UW V AH L
+yuzong Y UW Z AO NG
+yves IY V
+yvette IH V EH T
+yvonne IH V AA N
+yvonne's IH V AA N Z
+yzaguirre IY Z AH G W AY ER
+z Z IY
+z's Z IY Z
+z. Z IY
+z.'s Z IY Z
+zabala Z AA B AA L AH
+zabar's Z AE B AA R Z
+zabawa Z AA B AA W AH
+zabel Z EY B AH L
+zabielski Z AH B IY L S K IY
+zabinski Z AH B IH N S K IY
+zablocki Z AH B L OW T S K IY
+zaborowski Z AH B ER AO F S K IY
+zabows Z EY B OW Z
+zabowski Z AH B AW S K IY
+zabriskie Z AE B R IH S K IY
+zacarias Z AA K AA R IY AH Z
+zaccagnini Z AA K AH G N IY N IY
+zaccagnino Z AA K AH G N IY N OW
+zaccardi Z AA K AA R D IY
+zaccaria Z AA K AA R IY AH
+zaccaro Z AA K AA R OW
+zaccheus Z AE K OY Z
+zaccone Z AA K OW N IY
+zacek Z AA CH EH K
+zach Z AE K
+zachar Z AH K AA R
+zachariah Z AE K ER AY AH
+zacharias Z AE K ER AY AH S
+zachary Z AE K ER IY
+zacher Z AE K ER
+zachery Z AE K ER IY
+zachi Z AA K IY
+zachi(2) Z AA CH IY
+zachman Z AE K M AH N
+zachmann Z AA K M AH N
+zachow Z AA K OW
+zachry Z AA K R IY
+zack Z AE K
+zack's Z AE K S
+zackery Z AE K ER IY
+zacks Z AE K S
+zada Z AA D AH
+zadar Z EY D AA R
+zadar(2) Z IH D AA R
+zadeh Z AA D EH
+zadillo Z AH D IH L OW
+zadoc Z AA D AH K
+zadok Z AA D AH K
+zadora Z AH D AO R AH
+zadrozny Z AH D R OW Z N IY
+zaentz Z AE N T S
+zaffino Z AA F IY N OW
+zaffuto Z AH F UW T OW
+zaftig Z AE F T IH G
+zaftig's Z AE F T IH G Z
+zag Z AE G
+zagar Z AA G AA R
+zagat Z AE G AH T
+zagel Z EY G AH L
+zager Z EY G ER
+zagged Z AE G D
+zagha Z AA G AH
+zagladin Z AE G L AH D IH N
+zagorski Z AH G AO R S K IY
+zagreb Z AA G R EH B
+zagreb's Z AA G R EH B Z
+zags Z AE G Z
+zagury Z AE G Y ER IY
+zaher Z EY ER
+zahir Z AH HH IH R
+zahler Z AA L ER
+zahm Z AE M
+zahn Z AE N
+zahner Z AA N ER
+zahniser Z AA N AY Z ER
+zahnow Z AA N OW
+zahradnik Z ER AE D N IH K
+zaibatsu Z EY B AE T S UW
+zaid Z EY D
+zaino Z EY N OW
+zaire Z AY IH R
+zaire's Z AY IH R Z
+zairean Z AY IH R AH N
+zairean's Z AY IH R AH N Z
+zaireans Z AY IH R AH N Z
+zairian Z AY IH R IY AH N
+zairian's Z AY IH R IY AH N Z
+zairians Z AY IH R IY AH N Z
+zaiser Z AY S ER
+zaitech Z EY T EH K
+zaitsev Z EY T S EH V
+zaitsev's Z EY T S EH V Z
+zaitz Z EY T S
+zajac Z AY AH K
+zajdel Z AE JH D AH L
+zajic Z AE JH IH K
+zajicek Z AY IH CH EH K
+zajkowski Z AY K AO F S K IY
+zak Z AE K
+zakarian Z AH K EH R IY AH N
+zakharov Z AE K ER AA V
+zaki Z AA K IY
+zakrajsek Z AH K R AY S EH K
+zakrzewski Z AA K ER Z UW S K IY
+zalar Z AA L AA R
+zalay Z AH L EY
+zaldivar Z AA L D IY V AA R
+zale Z EY L
+zale's Z EY L Z
+zalenski Z AH L EH N S K IY
+zaleski Z AH L EH S K IY
+zalesky Z AH L EH S K IY
+zalewski Z AH L EH F S K IY
+zalewski(2) Z AH L UW S K IY
+zaley Z EY L IY
+zaley's Z EY L IY Z
+zalm Z AA M
+zalman Z AA L M AH N
+zaloudek Z AE L AW D IH K
+zalygin Z AE L IH G IH N
+zaman Z EY M AH N
+zamarello Z AE M ER EH L OW
+zamarripa Z AA M AA R IY P AH
+zamarron Z AA M AA R AO N
+zambelli Z AA M B EH L IY
+zambia Z AE M B IY AH
+zambia's Z AE M B IY AH Z
+zambian Z AE M B IY AH N
+zambito Z AA M B IY T OW
+zambo Z AE M B OW
+zamboanga Z AE M B OW NG G AH
+zambrana Z AA M B R AE N AH
+zambrano Z AA M B R AA N OW
+zambrano(2) Z AE M B R AE N OW
+zamfir Z AE M F IH R
+zammit Z AE M IH T
+zamora Z AH M AO R AH
+zamorano Z AA M AO R AA N OW
+zampedri Z AA M P EH D R IY
+zampino Z AA M P IY N OW
+zamudio Z AA M UW D IY OW
+zamzow Z AE M Z OW
+zan Z AE N
+zanamivir Z AE N AH M IH V ER
+zanca Z AE NG K AH
+zand Z AE N D
+zander Z AE N D ER
+zanders Z AE N D ER Z
+zandi Z AA N D IY
+zandi(2) Z AE N D IY
+zandra Z AE N D R AH
+zandstra Z AE N D S T R AH
+zandt Z AE N T
+zandy Z AE N D IY
+zandy's Z AE N D IY Z
+zane Z EY N
+zanella Z AH N EH L AH
+zaneta Z AA N EH T AH
+zang Z AE NG
+zangara Z AA NG G AA R AH
+zangari Z AA NG G AA R IY
+zanger Z AE NG ER
+zanghi Z AA N G IY
+zani Z AA N IY
+zaniest Z EY N IY AH S T
+zaniewski Z AE N IY EH F S K IY
+zaniewski(2) Z AH N UW F S K IY
+zank Z AE NG K
+zanni Z AE N IY
+zanoni Z AA N OW N IY
+zanoyan Z AH N OY AH N
+zant Z AE N T
+zantac Z AE N T AE K
+zanu Z AA N UW
+zanuck Z AE N AH K
+zanussi Z AH N UW S IY
+zany Z EY N IY
+zanzibar Z AE N Z AH B AA R
+zap Z AE P
+zapalac Z AH P AA L AH K
+zapata Z AA P AA T AH
+zapatista Z AA P AH T IY S T AH
+zapatista's Z AA P AH T IY S T AH Z
+zapatistas Z AA P AH T IY S T AH Z
+zapf Z AE P F
+zapien Z AE P IY N
+zapmail Z AE P M EY L
+zapp Z AE P
+zappa Z AE P AH
+zappa's Z AE P AH Z
+zappala Z AA P AA L AH
+zapped Z AE P T
+zappia Z AE P IY AH
+zapping Z AE P IH NG
+zappone Z AA P OW N IY
+zappulla Z AA P UW L AH
+zapruder Z AH P R UW D ER
+zaps Z AE P S
+zara Z AE R AH
+zaragoza Z AA R AA G OW Z AH
+zarah Z AE R AH
+zarate Z AA R EY T
+zarb Z AA R B
+zarcone Z AA R K OW N IY
+zared Z EH R D
+zarek Z AA R EH K
+zarella Z AH R EH L AH
+zaremba Z AA R EH M B AH
+zaremski Z ER EH S K IY
+zaretsky Z ER EH T S K IY
+zarett Z EH R AH T
+zaria Z AA R IY AH
+zaring Z EH R IH NG
+zarlengo Z AA R L EY NG G OW
+zarling Z AA R L IH NG
+zaro Z AE R OW
+zarr Z AE R
+zarre Z AA R
+zarre(2) Z AA R IY
+zarrella Z AA R EH L AH
+zarro Z AA R OW
+zarroli Z ER OW L IY
+zarroli's Z ER OW L IY Z
+zartman Z AA R T M AH N
+zaruba Z ER UW B AH
+zary Z AA R IY
+zarzecki Z AA R Z EH K IY
+zarzusky Z AA R Z UW S K IY
+zarzycki Z ER Z IH T S K IY
+zasada Z AA S AA D AH
+zaske Z EY S K
+zaslavskaya Z AE S L AH V S K AY AH
+zaslow Z AA S L OW
+zastrow Z AE S T R OW
+zaucha Z AW HH AH
+zaugg Z AO G
+zaun Z AO N
+zauner Z AO N ER
+zavada Z AA V AA D AH
+zavadil Z AA V AA D IY L
+zavala Z AA V AA L AH
+zavery Z EY V ER IY
+zavodnik Z AH V AA D N IH K
+zavodny Z AH V AA D N IY
+zawacki Z AA V AA T S K IY
+zawada Z AA W AA D AH
+zawadzki Z AA V AA JH K IY
+zawislak Z AA V IH S L AH K
+zawistowski Z AA V IH S T AO F S K IY
+zayac Z AY AH K
+zayas Z EY AA Z
+zayed Z EY AH D
+zayre Z EY R
+zayre's Z EY ER Z
+zazueta Z AA Z W EH T AH
+zbig Z B IH G
+zbigniew Z B IH G N UW
+zbikowski Z B IH K AW S K IY
+zbinden Z B AY N D AH N
+zdrojewski Z D R OY UW S K IY
+ze Z IY
+zea Z IY
+zeagler Z IY G L ER
+zeal Z IY L
+zealand Z IY L AH N D
+zealand's Z IY L AH N D Z
+zealander Z IY L AH N D ER
+zealanders Z IY L AH N D ER Z
+zealot Z EH L AH T
+zealot(2) Z IY L AH T
+zealotry Z EH L AH T R IY
+zealots Z EH L AH T S
+zealots(2) Z IY L AH T S
+zealous Z EH L AH S
+zealously Z IY L AH S L IY
+zealously(2) Z EH L AH S L IY
+zebell Z IY B EH L
+zebley Z EH B L IY
+zebra Z IY B R AH
+zebras Z IY B R AH Z
+zebrowski Z AH B R AO F S K IY
+zebulon Z IY B AH L AH N
+zecca Z EH K AH
+zech Z EH K
+zecher Z EH K ER
+zechman Z EH K M AH N
+zeck Z EH K
+zeckendorf Z EH K AH N D AO R F
+zed Z EH D
+zedekiah Z EH D AH K AY AH
+zedillo Z EY D IY OW
+zedillo's Z EY D IY OW Z
+zedillo's(2) Z EH D IH L OW Z
+zedillo(2) Z EH D IH L OW
+zedillos Z EY D IY OW Z
+zedillos(2) Z EH D IH L OW Z
+zedong Z EY D AO NG
+zedong(2) Z IY D AH NG
+zee Z IY
+zeeb Z IY B
+zeeble Z IY B AH L
+zeebrugge Z IY B R UW G IY
+zeek Z IY K
+zeeland Z IY L AH N D
+zeeman Z IY M AH N
+zeese Z IY Z
+zeese(2) Z IY S
+zeff Z EH F
+zeffirelli Z EH F IH R EH L IY
+zegeer Z IH G IH R
+zeger Z IY G ER
+zegers Z IY G ER Z
+zeglin Z EH G L IH N
+zeh Z EH
+zehnder Z EH N D ER
+zehner Z EH N ER
+zehntel Z EH N T EH L
+zehr Z EH R
+zehren Z EH R AH N
+zehring Z EH R IH NG
+zeibel Z AY B AH L
+zeibel's Z AY B AH L Z
+zeichner Z AY K N ER
+zeiders Z AY D ER Z
+zeidler Z AY D AH L ER
+zeidler(2) Z AY D L ER
+zeidman Z AY D M AH N
+zeien Z AY AH N
+zeiger Z AY G ER
+zeigler Z AY G AH L ER
+zeigler(2) Z AY G L ER
+zeiler Z AY L ER
+zeilinger Z AY L IH NG ER
+zeimet Z AY M IH T
+zeinab Z AY N AE B
+zeiner Z AY N ER
+zeis Z IY Z
+zeiser Z AY S ER
+zeisler Z AY S AH L ER
+zeisler(2) Z AY S L ER
+zeiss Z AY S
+zeit Z AY T
+zeiter Z AY T ER
+zeitgeist T S AY T G AY S T
+zeitler Z AY T AH L ER
+zeitler(2) Z AY T L ER
+zeitlin Z AY T L IH N
+zeitung Z AY T AH NG
+zeitz Z IY T S
+zekauskas Z AH K AW S K AH S
+zeke Z IY K
+zel Z EH L
+zelaputon Z EH L AH P Y UW T AH N
+zelasko Z IH L AA S K OW
+zelaya Z EY L AY AH
+zelazny Z IH L AA Z N IY
+zelda Z EH L D AH
+zeldin Z EH L D IH N
+zele Z IY L
+zelek Z EH L IH K
+zelem Z EH L AH M
+zelenak Z EH L IH N AH K
+zelenka Z IH L EH NG K AH
+zeleny Z IH L IY N IY
+zelesnik Z AH L EH S N IH K
+zeleznik Z IH L EH Z N IH K
+zelia Z EH L IY AH
+zelie Z EH L IY
+zeliff Z EH L IH F
+zelikow Z EH L IH K OW
+zelina Z EH L IY N AH
+zelinka Z IH L IH NG K AH
+zelinski Z IH L IH N S K IY
+zelinsky Z IH L IH N S K IY
+zelko Z EH L K OW
+zell Z EH L
+zellars Z EH L ER Z
+zelle Z EH L
+zeller Z EH L ER
+zellerbach Z EH L ER B AA K
+zellers Z EH L ER Z
+zellman Z EH L M AH N
+zellmer Z EH L M ER
+zellner Z EH L N ER
+zelma Z EH L M AH
+zelman Z EH L M AH N
+zelnick Z EH L N IH K
+zelos Z IY L OW Z
+zelotes Z EH L AH T S
+zeltner Z EH L T N ER
+zeltzer Z EH L T S ER
+zelvin Z EH L V IH N
+zemaitis Z EH M AY T AH S
+zeman Z IY M AH N
+zemanek Z EH M AH N IH K
+zemba Z EH M B AH
+zembower Z EH M B AW ER
+zembriski Z EH M B R IH S K IY
+zemecki Z AH M EH K IY
+zemeckis Z AH M EH K IY Z
+zemel Z EH M AH L
+zemin Z IY M IH N
+zemin's Z IY M IH N Z
+zemke Z EH M K
+zempel Z EH M P AH L
+zen Z EH N
+zena Z IY N AH
+zenaida Z IH N EY D AH
+zenas Z IY N AH Z
+zenchu Z EH N CH UW
+zenda Z EH N D AH
+zendejas Z IY N D IH JH AH Z
+zender Z EH N D ER
+zeneca Z EH N AH K AH
+zeneca's Z EH N AH K AH Z
+zeng Z EH NG
+zenger Z IY N JH ER
+zenia Z EY N IY AH
+zenica Z EH N IH K AH
+zenina Z EH N IY N AH
+zenith Z IY N AH TH
+zenith's Z IY N IH TH S
+zenith(2) Z IY N IH TH
+zenk Z EH NG K
+zenker Z EH NG K ER
+zenna Z EH N AH
+zenner Z EH N ER
+zeno Z EY N OW
+zenobia Z AH N OW B IY AH
+zenon Z IY N AH N
+zenor Z EH N ER
+zens Z EH N Z
+zent Z EH N T
+zentec Z EH N T EH K
+zentner Z EH N T N ER
+zentralsparkasse Z EH N T R AH L S P AA R K AA Z IH
+zentz Z EH N T S
+zenz Z EH N Z
+zeoli Z IY AA L IY
+zeos Z IY OW S
+zepa Z EH P AH
+zepa(2) Z IY P AH
+zepa(3) Z IY IY P IY EY
+zepeda Z EY P EY D AH
+zephyr Z EH F ER
+zephyrs Z EH F ER Z
+zepp Z EH P
+zeppelin Z EH P IH L IH N
+zeppenfeld Z EH P AH F EH L D
+zera Z EH R AH
+zerbe Z IH R B
+zerbe(2) Z IH R B IY
+zerby Z IH R B IY
+zercomo Z ER K OW M OW
+zerilli Z ER IY L IY
+zeringue Z EH R IH NG
+zerkle Z IH R K AH L
+zerlina Z ER L IY N AH
+zerlinda Z ER L IY N D AH
+zermeno Z ER M EH N OW
+zern Z IH R N
+zero Z IH R OW
+0 Z IH R OW
+0(2) OW
+zero's Z IH R OW Z
+zero's(2) Z IY R OW Z
+zero(2) Z IY R OW
+zeroed Z IH R OW D
+zeroed(2) Z IY R OW D
+zeroes Z IH R OW Z
+zeroes(2) Z IY R OW Z
+zeroing Z IY R OW IH NG
+zeroli Z AH R OW L IY
+zeros Z IH R OW Z
+zerr Z IH R
+zertuche Z IH R T AH K
+zervas Z IH R V AH Z
+zervos Z IH R V OW Z
+zervos(2) Z ER V OW S
+zerwhale Z ER W EY L
+zest Z EH S T
+zestful Z EH S T F AH L
+zeta Z EY T AH
+zettel Z EH T AH L
+zettle Z EH T AH L
+zettlemoyer Z EH T AH L M OY ER
+zettler Z EH T L ER
+zeus Z UW S
+zev Z EH V
+zeva Z EY V AH
+zewe Z IY W IY
+zewe(2) Z EH W EY
+zeyno Z EY N OW
+zhambu Z AA M B UW
+zhan Z AA N
+zhang ZH AE NG
+zhang(2) ZH AA NG
+zhao ZH AW
+zhao(2) JH AW
+zhejiang ZH IY JH AA NG
+zheng Z EH NG
+zhenyu ZH EH N Y UW
+zhirinovsky ZH IH R AH N AA F S K IY
+zhirinovsky's ZH IH R AH N AA F S K IY Z
+zhirinovsky's(2) ZH IH R N AA F S K IY Z
+zhirinovsky(2) ZH IH R N AA F S K IY
+zhivago ZH IH V AA G OW
+zhivkov ZH IH V K AA V
+zhou Z UW
+zhu Z UW
+zhuhai Z UW HH AY
+zi Z IY
+zia Z IY AH
+zia's Z IY AH Z
+ziad Z IY AE D
+ziad(2) Z IY AY EY D IY
+ziad(3) Z AY AE D
+ziahe Z IY AA
+ziahe(2) Z IY AA HH IY
+ziashivaney Z IY AA SH IH V EY N IY
+zibell Z AY B EH L
+ziccardi Z IY K AA R D IY
+zich Z IH CH
+zick Z IH K
+zickefoose Z IH K IH F UW S
+zico Z IY K OW
+zidek Z IH D IH K
+zieba Z IY B AH
+ziebarth Z IY B AA R TH
+ziebell Z IY B EH L
+zieg Z IY G
+ziegenbein Z IY G IH N B AY N
+ziegenfuss Z IY G IH N F AH S
+ziegenhorn Z IY G IH N HH ER N
+zieger Z IY G ER
+ziegfeld Z IH G F EH L D
+ziegfield Z IH G F IY L D
+ziegler Z IY G L ER
+ziehl Z IY L
+ziehm Z IY M
+ziel Z IY L
+zielinski Z IY L IH N S K IY
+zielke Z IY L K
+zieman Z IY M AH N
+ziemann Z IY M AH N
+ziemba Z IY M B AH
+ziemer Z IY M ER
+ziemian Z IY M IY AH N
+ziemke Z IY M K
+zientek Z IY N T IH K
+zier Z IH R
+zierke Z IY R K
+ziesemer Z IY S IY M ER
+zieske Z IY S K
+zieske(2) Z IY S K IY
+ziesmer Z IY S AH M ER
+zietlow Z IY T L OW
+zietz Z IY T S
+ziff Z IH F
+ziff's Z IH F S
+zifferero Z IH F ER EH R OW
+zig Z IH G
+zig-zag Z IH G Z AE G
+zig-zagged Z IH G Z AE G D
+ziggurat Z IH G ER AE T
+ziggurats Z IH G ER AE T S
+ziglar Z IH G L ER
+zigler Z AY G AH L ER
+zigler(2) Z AY G L ER
+zigman Z IH G M AH N
+zigzag Z IH G Z AE G
+zigzagged Z IH G Z AE G D
+zigzagging Z IH G Z AE G IH NG
+zigzags Z IH G Z AE G Z
+zika Z IH K AH
+zike Z AY K
+zil Z IH L
+zilber Z IH L B ER
+zilch Z IH L CH
+zile Z AY L
+zilka Z IH L K AH
+zilkha Z IH L K HH AH
+zill Z IH L
+zilla Z IH L AH
+zillah Z IH L AH
+ziller Z IH L ER
+zillion Z IH L Y AH N
+zillionaire Z IH L Y AH N EH R
+zillions Z IH L Y AH N Z
+zillmer Z IH L M ER
+zilmer Z IH L M ER
+zilvia Z IH L V IY AH
+zim Z IH M
+zima Z IY M AH
+zimbabwe Z IH M B AA B W EY
+zimbabwe's Z IH M B AA B W EY Z
+zimbabwean Z IH M B AA B W IY AH N
+zimbalist Z IH M B AH L IH S T
+zimbelman Z IH M B AH L M AH N
+zimdars Z IH M D ER Z
+zimerman Z AY M ER M AH N
+zimmer Z IH M ER
+zimmerer Z IH M ER ER
+zimmerle Z IH M ER AH L
+zimmerly Z IH M ER L IY
+zimmerman Z IH M ER M AH N
+zimmermann Z IH M ER M AH N
+zimmers Z IH M ER Z
+zimny Z IH M N IY
+zimpfer Z IH M P F ER
+zinc Z IH NG K
+zinck Z IH NG K
+zinda Z IH N D AH
+zinder Z IH N D ER
+zine Z AY N
+zines Z AY N Z
+zinfandel Z IH N F AH N D EH L
+zing Z IH NG
+zinga Z IH NG AH
+zingale Z IH NG G AA L IY
+zingaro Z IH NG G AA R OW
+zinger Z IH NG ER
+zingg Z IH NG G
+zingler Z IH NG G AH L ER
+zingler(2) Z IH NG G L ER
+zinia Z IY N IY AH
+zink Z IH NG K
+zinke Z IH NG K
+zinman Z IH N M AH N
+zinn Z IH N
+zinner Z IH N ER
+zinni Z IH N IY
+zinnia Z IH N IY AH
+zinnias Z IH N IY AH Z
+zinno Z IH N OW
+zins Z IH N Z
+zinser Z IH N S ER
+zinsmeister Z IH N S M AY S T ER
+zinter Z IH N T ER
+ziobro Z IY OW B R OW
+ziolkowski Z IY OW L K AO F S K IY
+ziomek Z IY OW M EH K
+zion Z AY AH N
+zionism Z AY AH N IH Z AH M
+zionist Z AY AH N IH S T
+zionists Z AY AH N IH S T S
+zions Z AY AH N Z
+zip Z IH P
+zipf Z IH P F
+zipfel Z IH P F AH L
+zipkin Z IH P K IH N
+zipless Z IH P L AH S
+zipp Z IH P
+zipped Z IH P T
+zipper Z IH P ER
+zippered Z IH P ER D
+zipperer Z IH P ER ER
+zippering Z IH P ER IH NG
+zippers Z IH P ER Z
+zipping Z IH P IH NG
+zippo Z IH P OW
+zippora Z IY P AO R AH
+zippy Z IH P IY
+zips Z IH P S
+zirbel Z ER B AH L
+zirbes Z ER B Z
+zircon Z ER K AH N
+zirconium Z ER K OW N IY AH M
+zirconiums Z ER K OW N IY AH M Z
+zircons Z ER K AA N Z
+zirella Z AH R EH L AH
+zirk Z ER K
+zirkel Z ER K AH L
+zirkelbach Z ER K IH L B AA K
+zirkle Z ER K AH L
+zisa Z AY S AH
+zises Z AY Z IH Z
+zisk Z IH S K
+ziska Z IH S K AH
+zisson Z IH S AH N
+zita Z IY T AH
+zitek Z IH T IH K
+zither Z IH DH ER
+zithers Z IH DH ER Z
+zito Z IY T OW
+zito's Z IY T OW Z
+zittel Z IH T AH L
+ziv Z IH V
+ziwei Z IY W EY
+ziyad Z IY AE D
+ziyang ZH IY AE NG
+ziyang(2) ZH IY AA NG
+zizzo Z IH Z OW
+zlata Z L AA T AH
+zlata's Z L AA T AH Z
+zlin Z L IH N
+zlobin Z L AO B IH N
+zlogar Z L OW G ER
+zlomsowitch Z L AA M S OW IH CH
+zlotnick Z L AA T N IH K
+zloty Z L AO T IY
+zlotys Z L AO T IY Z
+zmijewski Z M IY UW S K IY
+zobel Z OW B AH L
+zobrist Z AA B R IH S T
+zoch Z AA K
+zocor Z OW K ER
+zocor(2) Z OW K AO R
+zodiac Z OW D IY AE K
+zody Z OW D IY
+zoe Z OW IY
+zoeller Z OW L ER
+zoellick Z OW L IH K
+zoellner Z OW L N ER
+zoete Z OW T IY
+zofagart Z OW F AH G AA R T
+zofran Z OW F R AE N
+zogby Z AO G B IY
+zogg Z AA G
+zoghby Z OW B IY
+zoh Z OW
+zola Z OW L AH
+zoll Z AA L
+zollars Z AA L ER Z
+zoller Z AA L ER
+zollinger Z AA L IH NG ER
+zollman Z AA L M AH N
+zollner Z AA L N ER
+zollo Z AA L OW
+zolman Z AA L M AH N
+zoloft Z AA L AA F T
+zoloft(2) Z OW L AA F T
+zolp Z OW L P
+zoltan Z OW L T AH N
+zombie Z AA M B IY
+zombies Z AA M B IY Z
+zon Z AO N
+zona Z OW N AH
+zondervan Z AA N D ER V AE N
+zone Z OW N
+zoned Z OW N D
+zones Z OW N Z
+zongol Z AO NG G AO L
+zoning Z OW N IH NG
+zoo Z UW
+zoo's Z UW Z
+zook Z UH K
+zoological Z UW L AA JH IH K AH L
+zoologist Z OW AA L AH JH AH S T
+zoologists Z OW AA L AH JH AH S T S
+zoologists(2) Z OW AA L AH JH AH S
+zoology Z OW AA L AH JH IY
+zoom Z UW M
+zoomed Z UW M D
+zooming Z UW M IH NG
+zooms Z UW M Z
+zoos Z UW Z
+zoot-suit Z UW T S UW T
+zopfi Z OW P F IY
+zora Z AO R AH
+zorah Z AO R AH
+zoran Z AO R AH N
+zorana Z AO R AE N AH
+zorich Z AO R IH K
+zorina Z AO R IY N AH
+zorine Z AO R IY N IY
+zorinsky Z AO R IH N S K IY
+zorkin Z AO R K IH N
+zorn Z AO R N
+zornes Z AO R N Z
+zornow Z AO R N AW
+zorro Z AO R OW
+zortman Z AO R T M AH N
+zorz Z AO R Z
+zorzi Z AO R Z IY
+zosen Z OW Z AH N
+zoss Z AO S
+zoster Z AA S T ER
+zotos Z OW T OW Z
+zotter Z AA T ER
+zoucha Z UW HH AH
+zounds Z AW N D Z
+zovirax Z OW V IH R AE K S
+zovut Z OW V AH T
+zsa ZH AA
+zsa-zsa ZH AA ZH AA
+zsazsa ZH AA ZH AA
+zschau ZH AW
+zuba Z UW B AH
+zube Z UW B
+zuber Z UW B ER
+zubia Z UW B IY AH
+zubillaga Z UW B IH L AA G AH
+zubin Z UW B IH N
+zuboff Z UW B AO F
+zubrod Z AH B R AH D
+zuccarelli Z UW K ER EH L IY
+zuccaro Z UW K AA R OW
+zucchini Z UW K IY N IY
+zucco Z UW K OW
+zuch Z AH CH
+zuchowski Z AH HH AO F S K IY
+zuchowski(2) Z UW K AO F S K IY
+zuck Z AH K
+zucker Z AH K ER
+zucker's Z AH K ER Z
+zucker's(2) Z UW K ER Z
+zucker(2) Z UW K ER
+zuckerman Z AH K ER M AH N
+zuckerman's Z AH K ER M AH N Z
+zuckerman's(2) Z UW K ER M AH N Z
+zuckerman(2) Z UW K ER M AH N
+zue Z UW
+zue's Z UW Z
+zuege Z UW JH
+zuehlke Z UH L K
+zuelke Z UW L K
+zuercher Z UH R K ER
+zufall Z UW F AH L
+zufelt Z AH F IH L T
+zug Z AH G
+zug's Z AH G Z
+zuganov Z UW G AH N AO V
+zuganov's Z UW G AH N AO V S
+zuganov's(2) Z UW G AH N AO F S
+zuganov(2) Z UW G AH N AO F
+zuhlke Z UW L K
+zuidema Z UW IH D EH M AH
+zuk Z AH K
+zukas Z UW K AH Z
+zuker Z UW K ER
+zukerman Z UW K ER M AH N
+zukin Z UW K IH N
+zukowski Z AH K AO F S K IY
+zulauf Z UW L AW F
+zuleger Z UW L IH G ER
+zulfikar Z AH L F IH K AA R
+zulli Z UW L IY
+zullo Z UW L OW
+zulma Z UH L M AH
+zulu Z UW L UW
+zuluaga Z UW L UW AA G AH
+zulus Z UW L UW Z
+zumbro Z AH M B R OW
+zumbrun Z AH M B R AH N
+zumel Z UW M EH L
+zummo Z UW M OW
+zumpano Z UW M P AA N OW
+zumstein Z AH M S T IY N
+zumstein(2) Z AH M S T AY N
+zumwalt Z AH M W AH L T
+zundel Z AH N D AH L
+zungu Z AH NG UW
+zuni Z UW N IY
+zuniga Z UW N IY G AH
+zunino Z UW N IY N OW
+zunker Z AH NG K ER
+zupan Z UW P AH N
+zupancic Z AH P AE NG K IH K
+zupanja Z AH P AE N JH AH
+zupko Z AH P K OW
+zurawski Z ER AA F S K IY
+zurcher Z ER K ER
+zurek Z UH R EH K
+zurfluh Z ER F L UW
+zuri Z UH R IY
+zurich Z UH R IH K
+zurich's Z UH R IH K S
+zurita Z ER AY T AH
+zurkuhlen Z ER K Y UW L AH N
+zurn Z ER N
+zurowski Z UW R OW S K IY
+zurve Z ER V
+zuver Z UW V ER
+zuzana Z UW Z AA N AH
+zuzu Z UW Z UW
+zvornik Z V AO R N IH K
+zwack Z W AO K
+zwahlen Z W AA L AH N
+zwart Z W AO R T
+zweber Z W IY B ER
+zweibel Z W AY B AH L
+zweifel Z W AY F AH L
+zweig Z W AY G
+zwerdling Z W ER D L IH NG
+zwerdling's Z W ER D L IH NG Z
+zwetchkenbaum Z W EH CH K AH N B AA M
+zwick Z W IH K
+zwicker Z W IH K ER
+zwicky Z W IH K IY
+zwiebel Z W IY B AH L
+zwiefelhofer Z W IY F AH L HH AA F ER
+zwieg Z W IY G
+zwilling Z W IH L IH NG
+zwolinski Z V AH L IH N S K IY
+zycad Z IH K AE D
+zych Z AY CH
+zycher Z IH K ER
+zydeco Z AY D EH K OW
+zydeco(2) Z IH D AH K OW
+zydeco(3) Z AY D AH K OW
+zygmunt Z IH G M AH N T
+zygote Z AY G OW T
+zyla Z IH L AH
+zylka Z IH L K AH
+zylstra Z IH L S T R AH
+zyman Z AY M AH N
+zynda Z IH N D AH
+zysk Z AY S K
+zyskowski Z IH S K AO F S K IY
+zyuganov Z Y UW G AA N AA V
+zyuganov's Z Y UW G AA N AA V Z
+zyuganov's(2) Z UW G AA N AA V Z
+zyuganov(2) Z UW G AA N AA V
+zywicki Z IH W IH K IY
+{brace B R EY S
+{left-brace L EH F T B R EY S
+}close-brace K L OW Z B R EY S
+}right-brace R AY T B R EY S
diff --git a/dom/media/webspeech/recognition/models/dict/en-US.dic.dmp b/dom/media/webspeech/recognition/models/dict/en-US.dic.dmp
new file mode 100644
index 000000000..7c8212232
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/dict/en-US.dic.dmp
Binary files differ
diff --git a/dom/media/webspeech/recognition/models/en-US/README b/dom/media/webspeech/recognition/models/en-US/README
new file mode 100644
index 000000000..53ee8b321
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/README
@@ -0,0 +1,34 @@
+/* ====================================================================
+ * Copyright (c) 2015 Alpha Cephei Inc. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ALPHA CEPHEI INC. ``AS IS'' AND.
+ * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,.
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALPHA CEPHEI INC.
+ * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT.
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,.
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY.
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT.
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ====================================================================
+ *
+ */
+
+This directory contains generic US english acoustic model trained with
+latest sphinxtrain.
diff --git a/dom/media/webspeech/recognition/models/en-US/feat.params b/dom/media/webspeech/recognition/models/en-US/feat.params
new file mode 100644
index 000000000..324987f32
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/feat.params
@@ -0,0 +1,12 @@
+-lowerf 130
+-upperf 3700
+-nfilt 20
+-transform dct
+-lifter 22
+-feat 1s_c_d_dd
+-svspec 0-12/13-25/26-38
+-agc none
+-cmn current
+-varnorm no
+-cmninit 30.09,0.49,5.51,7.43,-2.39,-1.64,-4.71,0.03,-5.11,0.20,4.84,6.14,0.35
+-model ptm
diff --git a/dom/media/webspeech/recognition/models/en-US/mdef b/dom/media/webspeech/recognition/models/en-US/mdef
new file mode 100644
index 000000000..13ed14782
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/mdef
@@ -0,0 +1,137105 @@
+0.3
+42 n_base
+137053 n_tri
+548380 n_state_map
+5126 n_tied_state
+126 n_tied_ci_state
+42 n_tied_tmat
+#
+# Columns definitions
+#base lft rt p attrib tmat ... state id's ...
++NSN+ - - - filler 0 0 1 2 N
++SPN+ - - - filler 1 3 4 5 N
+ AA - - - n/a 2 6 7 8 N
+ AE - - - n/a 3 9 10 11 N
+ AH - - - n/a 4 12 13 14 N
+ AO - - - n/a 5 15 16 17 N
+ AW - - - n/a 6 18 19 20 N
+ AY - - - n/a 7 21 22 23 N
+ B - - - n/a 8 24 25 26 N
+ CH - - - n/a 9 27 28 29 N
+ D - - - n/a 10 30 31 32 N
+ DH - - - n/a 11 33 34 35 N
+ EH - - - n/a 12 36 37 38 N
+ ER - - - n/a 13 39 40 41 N
+ EY - - - n/a 14 42 43 44 N
+ F - - - n/a 15 45 46 47 N
+ G - - - n/a 16 48 49 50 N
+ HH - - - n/a 17 51 52 53 N
+ IH - - - n/a 18 54 55 56 N
+ IY - - - n/a 19 57 58 59 N
+ JH - - - n/a 20 60 61 62 N
+ K - - - n/a 21 63 64 65 N
+ L - - - n/a 22 66 67 68 N
+ M - - - n/a 23 69 70 71 N
+ N - - - n/a 24 72 73 74 N
+ NG - - - n/a 25 75 76 77 N
+ OW - - - n/a 26 78 79 80 N
+ OY - - - n/a 27 81 82 83 N
+ P - - - n/a 28 84 85 86 N
+ R - - - n/a 29 87 88 89 N
+ S - - - n/a 30 90 91 92 N
+ SH - - - n/a 31 93 94 95 N
+ SIL - - - filler 32 96 97 98 N
+ T - - - n/a 33 99 100 101 N
+ TH - - - n/a 34 102 103 104 N
+ UH - - - n/a 35 105 106 107 N
+ UW - - - n/a 36 108 109 110 N
+ V - - - n/a 37 111 112 113 N
+ W - - - n/a 38 114 115 116 N
+ Y - - - n/a 39 117 118 119 N
+ Z - - - n/a 40 120 121 122 N
+ ZH - - - n/a 41 123 124 125 N
+ AA AA AA s n/a 2 162 182 215 N
+ AA AA AE s n/a 2 162 169 215 N
+ AA AA AH b n/a 2 162 167 215 N
+ AA AA AH s n/a 2 162 169 215 N
+ AA AA AO s n/a 2 162 182 215 N
+ AA AA AW s n/a 2 162 182 215 N
+ AA AA AY s n/a 2 162 169 215 N
+ AA AA B b n/a 2 162 167 211 N
+ AA AA B s n/a 2 162 169 211 N
+ AA AA CH b n/a 2 162 167 209 N
+ AA AA CH s n/a 2 162 169 209 N
+ AA AA D b n/a 2 162 168 213 N
+ AA AA D s n/a 2 162 169 213 N
+ AA AA DH s n/a 2 162 169 218 N
+ AA AA EH s n/a 2 162 169 215 N
+ AA AA ER b n/a 2 162 201 215 N
+ AA AA ER s n/a 2 164 201 215 N
+ AA AA EY s n/a 2 162 169 215 N
+ AA AA F b n/a 2 162 167 210 N
+ AA AA F s n/a 2 162 169 210 N
+ AA AA G b n/a 2 162 167 217 N
+ AA AA G i n/a 2 162 168 217 N
+ AA AA G s n/a 2 162 169 217 N
+ AA AA HH b n/a 2 162 167 207 N
+ AA AA HH s n/a 2 162 169 207 N
+ AA AA IH s n/a 2 162 169 215 N
+ AA AA IY b n/a 2 162 167 215 N
+ AA AA IY s n/a 2 162 169 215 N
+ AA AA JH b n/a 2 162 167 214 N
+ AA AA JH s n/a 2 162 169 214 N
+ AA AA K b n/a 2 162 171 208 N
+ AA AA K i n/a 2 162 171 208 N
+ AA AA K s n/a 2 162 171 208 N
+ AA AA L b n/a 2 162 182 230 N
+ AA AA L s n/a 2 162 182 230 N
+ AA AA M b n/a 2 162 184 224 N
+ AA AA M s n/a 2 162 184 224 N
+ AA AA N b n/a 2 162 189 222 N
+ AA AA N s n/a 2 162 189 220 N
+ AA AA NG b n/a 2 162 184 222 N
+ AA AA NG s n/a 2 162 184 220 N
+ AA AA OW s n/a 2 162 182 215 N
+ AA AA OY s n/a 2 162 169 215 N
+ AA AA P b n/a 2 162 172 210 N
+ AA AA P s n/a 2 162 172 210 N
+ AA AA R b n/a 2 162 201 227 N
+ AA AA R s n/a 2 164 201 227 N
+ AA AA S b n/a 2 162 167 206 N
+ AA AA S s n/a 2 162 169 206 N
+ AA AA SH b n/a 2 162 167 209 N
+ AA AA SH s n/a 2 162 169 209 N
+ AA AA SIL s n/a 2 162 169 207 N
+ AA AA T b n/a 2 162 171 215 N
+ AA AA T s n/a 2 162 171 215 N
+ AA AA TH b n/a 2 162 167 206 N
+ AA AA TH s n/a 2 162 169 206 N
+ AA AA UH s n/a 2 162 182 215 N
+ AA AA UW b n/a 2 162 182 215 N
+ AA AA UW s n/a 2 162 182 215 N
+ AA AA V b n/a 2 162 167 211 N
+ AA AA V s n/a 2 162 169 211 N
+ AA AA W b n/a 2 162 182 211 N
+ AA AA W s n/a 2 162 182 211 N
+ AA AA Y b n/a 2 162 167 213 N
+ AA AA Y s n/a 2 162 169 213 N
+ AA AA Z b n/a 2 162 167 219 N
+ AA AA Z s n/a 2 162 169 219 N
+ AA AA ZH b n/a 2 162 167 219 N
+ AA AA ZH s n/a 2 162 169 219 N
+ AA AE AA s n/a 2 130 182 215 N
+ AA AE AE s n/a 2 130 169 215 N
+ AA AE AH b n/a 2 130 167 215 N
+ AA AE AH s n/a 2 130 169 215 N
+ AA AE AO s n/a 2 130 182 215 N
+ AA AE AW s n/a 2 130 182 215 N
+ AA AE AY s n/a 2 130 169 215 N
+ AA AE B b n/a 2 130 167 211 N
+ AA AE B i n/a 2 142 168 211 N
+ AA AE B s n/a 2 130 169 211 N
+ AA AE CH b n/a 2 130 167 209 N
+ AA AE CH s n/a 2 130 169 209 N
+ AA AE D b n/a 2 130 168 213 N
+ AA AE D s n/a 2 130 169 213 N
+ AA AE DH s n/a 2 130 169 218 N
+ AA AE EH s n/a 2 130 169 215 N
+ AA AE ER b n/a 2 130 197 215 N
+ AA AE ER s n/a 2 130 197 215 N
+ AA AE EY s n/a 2 130 169 215 N
+ AA AE F b n/a 2 130 167 210 N
+ AA AE F s n/a 2 130 169 210 N
+ AA AE G b n/a 2 130 167 217 N
+ AA AE G s n/a 2 130 169 217 N
+ AA AE HH b n/a 2 130 167 207 N
+ AA AE HH s n/a 2 130 169 207 N
+ AA AE IH s n/a 2 130 169 215 N
+ AA AE IY b n/a 2 130 167 215 N
+ AA AE IY s n/a 2 130 169 215 N
+ AA AE JH b n/a 2 130 167 214 N
+ AA AE JH s n/a 2 130 169 214 N
+ AA AE K b n/a 2 130 171 208 N
+ AA AE K i n/a 2 142 171 208 N
+ AA AE K s n/a 2 130 171 208 N
+ AA AE L b n/a 2 130 182 230 N
+ AA AE L s n/a 2 130 182 230 N
+ AA AE M b n/a 2 130 184 224 N
+ AA AE M s n/a 2 130 184 224 N
+ AA AE N b n/a 2 130 188 222 N
+ AA AE N s n/a 2 130 188 220 N
+ AA AE NG b n/a 2 130 184 222 N
+ AA AE NG s n/a 2 130 184 220 N
+ AA AE OW s n/a 2 130 182 215 N
+ AA AE OY s n/a 2 130 169 215 N
+ AA AE P b n/a 2 130 172 210 N
+ AA AE P s n/a 2 130 172 210 N
+ AA AE R b n/a 2 130 197 227 N
+ AA AE R s n/a 2 130 197 227 N
+ AA AE S b n/a 2 130 167 206 N
+ AA AE S s n/a 2 130 169 206 N
+ AA AE SH b n/a 2 130 167 209 N
+ AA AE SH s n/a 2 130 169 209 N
+ AA AE SIL s n/a 2 130 169 207 N
+ AA AE T b n/a 2 130 171 215 N
+ AA AE T s n/a 2 130 171 215 N
+ AA AE TH b n/a 2 130 167 206 N
+ AA AE TH s n/a 2 130 169 206 N
+ AA AE UH s n/a 2 130 182 215 N
+ AA AE UW b n/a 2 130 182 215 N
+ AA AE UW s n/a 2 130 182 215 N
+ AA AE V b n/a 2 130 167 211 N
+ AA AE V s n/a 2 130 169 211 N
+ AA AE W b n/a 2 130 182 211 N
+ AA AE W s n/a 2 130 182 211 N
+ AA AE Y b n/a 2 130 167 213 N
+ AA AE Y s n/a 2 130 169 213 N
+ AA AE Z b n/a 2 130 167 219 N
+ AA AE Z s n/a 2 130 169 219 N
+ AA AE ZH b n/a 2 130 167 219 N
+ AA AE ZH s n/a 2 130 169 219 N
+ AA AH AA s n/a 2 129 182 215 N
+ AA AH AE s n/a 2 129 169 215 N
+ AA AH AH b n/a 2 129 167 215 N
+ AA AH AH s n/a 2 129 169 215 N
+ AA AH AO s n/a 2 129 182 215 N
+ AA AH AW s n/a 2 129 182 215 N
+ AA AH AY s n/a 2 129 169 215 N
+ AA AH B b n/a 2 129 167 211 N
+ AA AH B s n/a 2 129 169 211 N
+ AA AH CH b n/a 2 129 167 209 N
+ AA AH CH s n/a 2 129 169 209 N
+ AA AH D b n/a 2 129 168 213 N
+ AA AH D s n/a 2 129 169 213 N
+ AA AH DH s n/a 2 129 169 218 N
+ AA AH EH s n/a 2 129 169 215 N
+ AA AH ER b n/a 2 129 197 215 N
+ AA AH ER s n/a 2 129 197 215 N
+ AA AH EY s n/a 2 129 169 215 N
+ AA AH F b n/a 2 129 167 210 N
+ AA AH F s n/a 2 129 169 210 N
+ AA AH G b n/a 2 129 167 217 N
+ AA AH G s n/a 2 129 169 217 N
+ AA AH HH b n/a 2 129 167 207 N
+ AA AH HH s n/a 2 129 169 207 N
+ AA AH IH s n/a 2 129 169 215 N
+ AA AH IY b n/a 2 129 167 215 N
+ AA AH IY s n/a 2 129 169 215 N
+ AA AH JH b n/a 2 129 167 214 N
+ AA AH JH s n/a 2 129 169 214 N
+ AA AH K b n/a 2 129 171 208 N
+ AA AH K i n/a 2 142 171 208 N
+ AA AH K s n/a 2 129 171 208 N
+ AA AH L b n/a 2 129 182 230 N
+ AA AH L s n/a 2 129 182 230 N
+ AA AH M b n/a 2 130 184 224 N
+ AA AH M s n/a 2 130 184 224 N
+ AA AH N b n/a 2 130 188 222 N
+ AA AH N i n/a 2 142 187 220 N
+ AA AH N s n/a 2 130 188 220 N
+ AA AH NG b n/a 2 130 184 222 N
+ AA AH NG s n/a 2 130 184 220 N
+ AA AH OW s n/a 2 129 182 215 N
+ AA AH OY s n/a 2 129 169 215 N
+ AA AH P b n/a 2 129 172 210 N
+ AA AH P s n/a 2 129 172 210 N
+ AA AH R b n/a 2 129 197 227 N
+ AA AH R i n/a 2 142 200 225 N
+ AA AH R s n/a 2 129 197 227 N
+ AA AH S b n/a 2 129 167 206 N
+ AA AH S s n/a 2 129 169 206 N
+ AA AH SH b n/a 2 129 167 209 N
+ AA AH SH s n/a 2 129 169 209 N
+ AA AH SIL s n/a 2 129 169 207 N
+ AA AH T b n/a 2 129 171 215 N
+ AA AH T i n/a 2 142 171 215 N
+ AA AH T s n/a 2 129 171 215 N
+ AA AH TH b n/a 2 129 167 206 N
+ AA AH TH i n/a 2 142 168 206 N
+ AA AH TH s n/a 2 129 169 206 N
+ AA AH UH s n/a 2 129 182 215 N
+ AA AH UW b n/a 2 129 182 215 N
+ AA AH UW s n/a 2 129 182 215 N
+ AA AH V b n/a 2 129 167 211 N
+ AA AH V s n/a 2 129 169 211 N
+ AA AH W b n/a 2 129 182 211 N
+ AA AH W s n/a 2 129 182 211 N
+ AA AH Y b n/a 2 129 167 213 N
+ AA AH Y s n/a 2 129 169 213 N
+ AA AH Z b n/a 2 129 167 219 N
+ AA AH Z s n/a 2 129 169 219 N
+ AA AH ZH b n/a 2 129 167 219 N
+ AA AH ZH s n/a 2 129 169 219 N
+ AA AO AA s n/a 2 162 182 215 N
+ AA AO AE s n/a 2 162 169 215 N
+ AA AO AH b n/a 2 162 167 215 N
+ AA AO AH s n/a 2 162 169 215 N
+ AA AO AO s n/a 2 162 182 215 N
+ AA AO AW s n/a 2 162 182 215 N
+ AA AO AY s n/a 2 162 169 215 N
+ AA AO B b n/a 2 162 167 211 N
+ AA AO B s n/a 2 162 169 211 N
+ AA AO CH b n/a 2 162 167 209 N
+ AA AO CH s n/a 2 162 169 209 N
+ AA AO D b n/a 2 162 168 213 N
+ AA AO D s n/a 2 162 169 213 N
+ AA AO DH s n/a 2 162 169 218 N
+ AA AO EH s n/a 2 162 169 215 N
+ AA AO ER b n/a 2 162 201 215 N
+ AA AO ER s n/a 2 164 201 215 N
+ AA AO EY s n/a 2 162 169 215 N
+ AA AO F b n/a 2 162 167 210 N
+ AA AO F s n/a 2 162 169 210 N
+ AA AO G b n/a 2 162 167 217 N
+ AA AO G s n/a 2 162 169 217 N
+ AA AO HH b n/a 2 162 167 207 N
+ AA AO HH s n/a 2 162 169 207 N
+ AA AO IH s n/a 2 162 169 215 N
+ AA AO IY b n/a 2 162 167 215 N
+ AA AO IY s n/a 2 162 169 215 N
+ AA AO JH b n/a 2 162 167 214 N
+ AA AO JH s n/a 2 162 169 214 N
+ AA AO K b n/a 2 162 171 208 N
+ AA AO K s n/a 2 162 171 208 N
+ AA AO L b n/a 2 162 182 230 N
+ AA AO L s n/a 2 162 182 230 N
+ AA AO M b n/a 2 162 184 224 N
+ AA AO M s n/a 2 162 184 224 N
+ AA AO N b n/a 2 162 189 222 N
+ AA AO N s n/a 2 162 189 220 N
+ AA AO NG b n/a 2 162 184 222 N
+ AA AO NG s n/a 2 162 184 220 N
+ AA AO OW s n/a 2 162 182 215 N
+ AA AO OY s n/a 2 162 169 215 N
+ AA AO P b n/a 2 162 172 210 N
+ AA AO P s n/a 2 162 172 210 N
+ AA AO R b n/a 2 162 201 227 N
+ AA AO R i n/a 2 164 199 225 N
+ AA AO R s n/a 2 164 201 227 N
+ AA AO S b n/a 2 162 167 206 N
+ AA AO S s n/a 2 162 169 206 N
+ AA AO SH b n/a 2 162 167 209 N
+ AA AO SH s n/a 2 162 169 209 N
+ AA AO SIL s n/a 2 162 169 207 N
+ AA AO T b n/a 2 162 171 215 N
+ AA AO T s n/a 2 162 171 215 N
+ AA AO TH b n/a 2 162 167 206 N
+ AA AO TH s n/a 2 162 169 206 N
+ AA AO UH s n/a 2 162 182 215 N
+ AA AO UW b n/a 2 162 182 215 N
+ AA AO UW s n/a 2 162 182 215 N
+ AA AO V b n/a 2 162 167 211 N
+ AA AO V s n/a 2 162 169 211 N
+ AA AO W b n/a 2 162 182 211 N
+ AA AO W s n/a 2 162 182 211 N
+ AA AO Y b n/a 2 162 167 213 N
+ AA AO Y s n/a 2 162 169 213 N
+ AA AO Z b n/a 2 162 167 219 N
+ AA AO Z s n/a 2 162 169 219 N
+ AA AO ZH b n/a 2 162 167 219 N
+ AA AO ZH s n/a 2 162 169 219 N
+ AA AW AA s n/a 2 162 182 215 N
+ AA AW AE s n/a 2 162 169 215 N
+ AA AW AH b n/a 2 162 167 215 N
+ AA AW AH s n/a 2 162 169 215 N
+ AA AW AO s n/a 2 162 182 215 N
+ AA AW AW s n/a 2 162 182 215 N
+ AA AW AY s n/a 2 162 169 215 N
+ AA AW B b n/a 2 162 167 211 N
+ AA AW B s n/a 2 162 169 211 N
+ AA AW CH b n/a 2 162 167 209 N
+ AA AW CH s n/a 2 162 169 209 N
+ AA AW D b n/a 2 162 168 213 N
+ AA AW D s n/a 2 162 169 213 N
+ AA AW DH s n/a 2 162 169 218 N
+ AA AW EH s n/a 2 162 169 215 N
+ AA AW ER b n/a 2 162 201 215 N
+ AA AW ER s n/a 2 164 201 215 N
+ AA AW EY s n/a 2 162 169 215 N
+ AA AW F b n/a 2 162 167 210 N
+ AA AW F s n/a 2 162 169 210 N
+ AA AW G b n/a 2 162 167 217 N
+ AA AW G s n/a 2 162 169 217 N
+ AA AW HH b n/a 2 162 167 207 N
+ AA AW HH s n/a 2 162 169 207 N
+ AA AW IH s n/a 2 162 169 215 N
+ AA AW IY b n/a 2 162 167 215 N
+ AA AW IY s n/a 2 162 169 215 N
+ AA AW JH b n/a 2 162 167 214 N
+ AA AW JH s n/a 2 162 169 214 N
+ AA AW K b n/a 2 162 171 208 N
+ AA AW K s n/a 2 162 171 208 N
+ AA AW L b n/a 2 162 182 230 N
+ AA AW L i n/a 2 162 182 230 N
+ AA AW L s n/a 2 162 182 230 N
+ AA AW M b n/a 2 162 184 224 N
+ AA AW M i n/a 2 162 184 224 N
+ AA AW M s n/a 2 162 184 224 N
+ AA AW N b n/a 2 162 194 223 N
+ AA AW N i n/a 2 162 194 223 N
+ AA AW N s n/a 2 162 194 223 N
+ AA AW NG b n/a 2 162 184 223 N
+ AA AW NG s n/a 2 162 184 223 N
+ AA AW OW s n/a 2 162 182 215 N
+ AA AW OY s n/a 2 162 169 215 N
+ AA AW P b n/a 2 162 172 210 N
+ AA AW P s n/a 2 162 172 210 N
+ AA AW R b n/a 2 162 201 227 N
+ AA AW R i n/a 2 164 199 225 N
+ AA AW R s n/a 2 164 201 227 N
+ AA AW S b n/a 2 162 167 206 N
+ AA AW S s n/a 2 162 169 206 N
+ AA AW SH b n/a 2 162 167 209 N
+ AA AW SH s n/a 2 162 169 209 N
+ AA AW SIL s n/a 2 162 169 207 N
+ AA AW T b n/a 2 162 171 215 N
+ AA AW T i n/a 2 162 171 215 N
+ AA AW T s n/a 2 162 171 215 N
+ AA AW TH b n/a 2 162 167 206 N
+ AA AW TH s n/a 2 162 169 206 N
+ AA AW UH s n/a 2 162 182 215 N
+ AA AW UW b n/a 2 162 182 215 N
+ AA AW UW s n/a 2 162 182 215 N
+ AA AW V b n/a 2 162 167 211 N
+ AA AW V s n/a 2 162 169 211 N
+ AA AW W b n/a 2 162 182 211 N
+ AA AW W s n/a 2 162 182 211 N
+ AA AW Y b n/a 2 162 167 213 N
+ AA AW Y s n/a 2 162 169 213 N
+ AA AW Z b n/a 2 162 167 219 N
+ AA AW Z s n/a 2 162 169 219 N
+ AA AW ZH b n/a 2 162 167 219 N
+ AA AW ZH s n/a 2 162 169 219 N
+ AA AY AA s n/a 2 141 183 215 N
+ AA AY AE s n/a 2 141 169 215 N
+ AA AY AH b n/a 2 141 167 215 N
+ AA AY AH s n/a 2 141 169 215 N
+ AA AY AO s n/a 2 141 183 215 N
+ AA AY AW s n/a 2 141 183 215 N
+ AA AY AY s n/a 2 141 169 215 N
+ AA AY B b n/a 2 141 167 211 N
+ AA AY B s n/a 2 141 169 211 N
+ AA AY CH b n/a 2 141 167 209 N
+ AA AY CH i n/a 2 142 168 209 N
+ AA AY CH s n/a 2 141 169 209 N
+ AA AY D b n/a 2 141 168 213 N
+ AA AY D i n/a 2 142 168 213 N
+ AA AY D s n/a 2 141 169 213 N
+ AA AY DH s n/a 2 141 169 218 N
+ AA AY EH s n/a 2 141 169 215 N
+ AA AY ER b n/a 2 141 197 215 N
+ AA AY ER s n/a 2 141 197 215 N
+ AA AY EY s n/a 2 141 169 215 N
+ AA AY F b n/a 2 141 167 210 N
+ AA AY F s n/a 2 141 169 210 N
+ AA AY G b n/a 2 141 167 217 N
+ AA AY G i n/a 2 142 168 217 N
+ AA AY G s n/a 2 141 169 217 N
+ AA AY HH b n/a 2 141 167 207 N
+ AA AY HH s n/a 2 141 169 207 N
+ AA AY IH s n/a 2 141 169 215 N
+ AA AY IY b n/a 2 141 167 215 N
+ AA AY IY s n/a 2 141 169 215 N
+ AA AY JH b n/a 2 141 167 214 N
+ AA AY JH s n/a 2 141 169 214 N
+ AA AY K b n/a 2 141 171 208 N
+ AA AY K i n/a 2 142 171 208 N
+ AA AY K s n/a 2 141 171 208 N
+ AA AY L b n/a 2 141 183 230 N
+ AA AY L i n/a 2 142 183 230 N
+ AA AY L s n/a 2 141 183 230 N
+ AA AY M b n/a 2 141 184 224 N
+ AA AY M i n/a 2 142 184 224 N
+ AA AY M s n/a 2 141 184 224 N
+ AA AY N b n/a 2 141 188 222 N
+ AA AY N i n/a 2 142 187 220 N
+ AA AY N s n/a 2 141 188 220 N
+ AA AY NG b n/a 2 141 184 222 N
+ AA AY NG s n/a 2 141 184 220 N
+ AA AY OW s n/a 2 141 183 215 N
+ AA AY OY s n/a 2 141 169 215 N
+ AA AY P b n/a 2 141 172 210 N
+ AA AY P i n/a 2 142 172 210 N
+ AA AY P s n/a 2 141 172 210 N
+ AA AY R b n/a 2 141 197 227 N
+ AA AY R i n/a 2 142 200 225 N
+ AA AY R s n/a 2 141 197 227 N
+ AA AY S b n/a 2 141 167 206 N
+ AA AY S i n/a 2 142 168 206 N
+ AA AY S s n/a 2 141 169 206 N
+ AA AY SH b n/a 2 141 167 209 N
+ AA AY SH i n/a 2 142 168 209 N
+ AA AY SH s n/a 2 141 169 209 N
+ AA AY SIL s n/a 2 141 169 207 N
+ AA AY T b n/a 2 141 171 215 N
+ AA AY T i n/a 2 142 171 215 N
+ AA AY T s n/a 2 141 171 215 N
+ AA AY TH b n/a 2 141 167 206 N
+ AA AY TH s n/a 2 141 169 206 N
+ AA AY UH s n/a 2 141 183 215 N
+ AA AY UW b n/a 2 141 183 215 N
+ AA AY UW s n/a 2 141 183 215 N
+ AA AY V b n/a 2 141 167 211 N
+ AA AY V i n/a 2 142 168 211 N
+ AA AY V s n/a 2 141 169 211 N
+ AA AY W b n/a 2 141 183 211 N
+ AA AY W s n/a 2 141 183 211 N
+ AA AY Y b n/a 2 141 167 213 N
+ AA AY Y s n/a 2 141 169 213 N
+ AA AY Z b n/a 2 141 167 219 N
+ AA AY Z s n/a 2 141 169 219 N
+ AA AY ZH b n/a 2 141 167 219 N
+ AA AY ZH s n/a 2 141 169 219 N
+ AA B AA e n/a 2 155 181 215 N
+ AA B AA s n/a 2 155 181 215 N
+ AA B AE e n/a 2 155 176 215 N
+ AA B AE s n/a 2 155 176 215 N
+ AA B AH b n/a 2 155 176 215 N
+ AA B AH e n/a 2 155 176 215 N
+ AA B AH i n/a 2 155 176 215 N
+ AA B AH s n/a 2 155 176 215 N
+ AA B AO e n/a 2 155 181 215 N
+ AA B AO i n/a 2 155 181 215 N
+ AA B AO s n/a 2 155 181 215 N
+ AA B AW e n/a 2 155 181 215 N
+ AA B AW s n/a 2 155 181 215 N
+ AA B AY e n/a 2 155 176 215 N
+ AA B AY s n/a 2 155 176 215 N
+ AA B B b n/a 2 155 176 211 N
+ AA B B e n/a 2 155 176 211 N
+ AA B B i n/a 2 155 176 211 N
+ AA B B s n/a 2 155 176 211 N
+ AA B CH b n/a 2 155 178 209 N
+ AA B CH e n/a 2 155 178 209 N
+ AA B CH i n/a 2 155 178 209 N
+ AA B CH s n/a 2 155 178 209 N
+ AA B D b n/a 2 155 178 214 N
+ AA B D e n/a 2 155 178 214 N
+ AA B D i n/a 2 155 178 214 N
+ AA B D s n/a 2 155 178 214 N
+ AA B DH e n/a 2 155 176 218 N
+ AA B DH i n/a 2 155 176 218 N
+ AA B DH s n/a 2 155 176 218 N
+ AA B EH e n/a 2 155 176 215 N
+ AA B EH s n/a 2 155 176 215 N
+ AA B ER b n/a 2 156 202 215 N
+ AA B ER e n/a 2 156 202 215 N
+ AA B ER i n/a 2 156 201 215 N
+ AA B ER s n/a 2 156 202 215 N
+ AA B EY e n/a 2 155 176 215 N
+ AA B EY i n/a 2 155 176 215 N
+ AA B EY s n/a 2 155 176 215 N
+ AA B F b n/a 2 155 176 210 N
+ AA B F e n/a 2 155 176 210 N
+ AA B F i n/a 2 155 176 210 N
+ AA B F s n/a 2 155 176 210 N
+ AA B G b n/a 2 155 176 217 N
+ AA B G e n/a 2 155 176 217 N
+ AA B G i n/a 2 155 176 217 N
+ AA B G s n/a 2 155 176 217 N
+ AA B HH b n/a 2 155 176 207 N
+ AA B HH e n/a 2 155 176 207 N
+ AA B HH i n/a 2 155 176 207 N
+ AA B HH s n/a 2 155 176 207 N
+ AA B IH e n/a 2 155 176 215 N
+ AA B IH s n/a 2 155 176 215 N
+ AA B IY b n/a 2 155 176 215 N
+ AA B IY e n/a 2 155 176 215 N
+ AA B IY i n/a 2 155 176 215 N
+ AA B IY s n/a 2 155 176 215 N
+ AA B JH b n/a 2 155 178 214 N
+ AA B JH e n/a 2 155 178 214 N
+ AA B JH i n/a 2 155 178 214 N
+ AA B JH s n/a 2 155 178 214 N
+ AA B K b n/a 2 155 177 208 N
+ AA B K e n/a 2 155 177 208 N
+ AA B K i n/a 2 155 177 208 N
+ AA B K s n/a 2 155 177 208 N
+ AA B L b n/a 2 155 181 231 N
+ AA B L e n/a 2 155 181 231 N
+ AA B L i n/a 2 155 181 231 N
+ AA B L s n/a 2 155 181 231 N
+ AA B M b n/a 2 155 186 224 N
+ AA B M e n/a 2 155 186 224 N
+ AA B M i n/a 2 155 186 224 N
+ AA B M s n/a 2 155 186 224 N
+ AA B N b n/a 2 155 189 222 N
+ AA B N e n/a 2 155 189 220 N
+ AA B N i n/a 2 155 189 220 N
+ AA B N s n/a 2 155 189 220 N
+ AA B NG b n/a 2 155 186 222 N
+ AA B NG e n/a 2 155 186 220 N
+ AA B NG i n/a 2 155 186 220 N
+ AA B NG s n/a 2 155 186 220 N
+ AA B OW e n/a 2 155 181 215 N
+ AA B OW i n/a 2 155 181 215 N
+ AA B OW s n/a 2 155 181 215 N
+ AA B OY e n/a 2 155 176 215 N
+ AA B OY s n/a 2 155 176 215 N
+ AA B P b n/a 2 155 177 210 N
+ AA B P e n/a 2 155 177 210 N
+ AA B P i n/a 2 155 177 210 N
+ AA B P s n/a 2 155 177 210 N
+ AA B R b n/a 2 156 202 227 N
+ AA B R e n/a 2 156 202 227 N
+ AA B R i n/a 2 156 201 226 N
+ AA B R s n/a 2 156 202 227 N
+ AA B S b n/a 2 155 176 206 N
+ AA B S e n/a 2 155 176 206 N
+ AA B S i n/a 2 155 176 206 N
+ AA B S s n/a 2 155 176 206 N
+ AA B SH b n/a 2 155 176 209 N
+ AA B SH e n/a 2 155 176 209 N
+ AA B SH i n/a 2 155 176 209 N
+ AA B SH s n/a 2 155 176 209 N
+ AA B SIL e n/a 2 155 176 207 N
+ AA B SIL s n/a 2 155 176 207 N
+ AA B T b n/a 2 155 178 215 N
+ AA B T e n/a 2 155 178 215 N
+ AA B T i n/a 2 155 178 215 N
+ AA B T s n/a 2 155 178 215 N
+ AA B TH b n/a 2 155 176 206 N
+ AA B TH e n/a 2 155 176 206 N
+ AA B TH i n/a 2 155 176 206 N
+ AA B TH s n/a 2 155 176 206 N
+ AA B UH e n/a 2 155 181 215 N
+ AA B UH s n/a 2 155 181 215 N
+ AA B UW b n/a 2 155 181 215 N
+ AA B UW e n/a 2 155 181 215 N
+ AA B UW s n/a 2 155 181 215 N
+ AA B V b n/a 2 155 176 211 N
+ AA B V e n/a 2 155 176 211 N
+ AA B V i n/a 2 155 176 211 N
+ AA B V s n/a 2 155 176 211 N
+ AA B W b n/a 2 155 181 211 N
+ AA B W e n/a 2 155 181 211 N
+ AA B W i n/a 2 155 181 211 N
+ AA B W s n/a 2 155 181 211 N
+ AA B Y b n/a 2 155 176 214 N
+ AA B Y e n/a 2 155 176 214 N
+ AA B Y i n/a 2 155 176 214 N
+ AA B Y s n/a 2 155 176 214 N
+ AA B Z b n/a 2 155 176 218 N
+ AA B Z e n/a 2 155 176 218 N
+ AA B Z i n/a 2 155 176 218 N
+ AA B Z s n/a 2 155 176 218 N
+ AA B ZH b n/a 2 155 176 218 N
+ AA B ZH e n/a 2 155 176 218 N
+ AA B ZH s n/a 2 155 176 218 N
+ AA CH AA e n/a 2 146 182 215 N
+ AA CH AA s n/a 2 146 182 215 N
+ AA CH AE e n/a 2 146 167 215 N
+ AA CH AE s n/a 2 146 169 215 N
+ AA CH AH b n/a 2 146 167 215 N
+ AA CH AH e n/a 2 146 167 215 N
+ AA CH AH s n/a 2 146 169 215 N
+ AA CH AO e n/a 2 146 182 215 N
+ AA CH AO s n/a 2 146 182 215 N
+ AA CH AW e n/a 2 146 182 215 N
+ AA CH AW s n/a 2 146 182 215 N
+ AA CH AY e n/a 2 146 167 215 N
+ AA CH AY s n/a 2 146 169 215 N
+ AA CH B b n/a 2 146 167 211 N
+ AA CH B e n/a 2 146 167 211 N
+ AA CH B i n/a 2 151 167 211 N
+ AA CH B s n/a 2 146 169 211 N
+ AA CH CH b n/a 2 146 167 209 N
+ AA CH CH e n/a 2 146 167 209 N
+ AA CH CH i n/a 2 151 167 209 N
+ AA CH CH s n/a 2 146 169 209 N
+ AA CH D b n/a 2 146 167 213 N
+ AA CH D e n/a 2 146 167 213 N
+ AA CH D i n/a 2 149 167 213 N
+ AA CH D s n/a 2 146 169 213 N
+ AA CH DH e n/a 2 146 167 218 N
+ AA CH DH s n/a 2 146 169 218 N
+ AA CH EH e n/a 2 146 167 215 N
+ AA CH EH s n/a 2 146 169 215 N
+ AA CH ER b n/a 2 146 197 215 N
+ AA CH ER e n/a 2 145 197 215 N
+ AA CH ER i n/a 2 145 199 215 N
+ AA CH ER s n/a 2 145 197 215 N
+ AA CH EY e n/a 2 146 167 215 N
+ AA CH EY s n/a 2 146 169 215 N
+ AA CH F b n/a 2 146 167 210 N
+ AA CH F e n/a 2 146 167 210 N
+ AA CH F s n/a 2 146 169 210 N
+ AA CH G b n/a 2 146 167 217 N
+ AA CH G e n/a 2 146 167 217 N
+ AA CH G i n/a 2 151 167 217 N
+ AA CH G s n/a 2 146 169 217 N
+ AA CH HH b n/a 2 146 167 207 N
+ AA CH HH e n/a 2 146 167 207 N
+ AA CH HH i n/a 2 151 167 207 N
+ AA CH HH s n/a 2 146 169 207 N
+ AA CH IH e n/a 2 146 167 215 N
+ AA CH IH i n/a 2 151 167 215 N
+ AA CH IH s n/a 2 146 169 215 N
+ AA CH IY b n/a 2 146 167 215 N
+ AA CH IY e n/a 2 146 167 215 N
+ AA CH IY i n/a 2 151 167 215 N
+ AA CH IY s n/a 2 146 169 215 N
+ AA CH JH b n/a 2 146 167 214 N
+ AA CH JH e n/a 2 146 167 214 N
+ AA CH JH s n/a 2 146 169 214 N
+ AA CH K b n/a 2 146 171 208 N
+ AA CH K e n/a 2 146 171 208 N
+ AA CH K i n/a 2 151 171 208 N
+ AA CH K s n/a 2 146 171 208 N
+ AA CH L b n/a 2 146 182 231 N
+ AA CH L e n/a 2 146 182 231 N
+ AA CH L i n/a 2 151 182 231 N
+ AA CH L s n/a 2 146 182 231 N
+ AA CH M b n/a 2 146 185 224 N
+ AA CH M e n/a 2 146 185 224 N
+ AA CH M i n/a 2 154 185 224 N
+ AA CH M s n/a 2 146 185 224 N
+ AA CH N b n/a 2 146 191 222 N
+ AA CH N e n/a 2 146 191 220 N
+ AA CH N i n/a 2 154 191 220 N
+ AA CH N s n/a 2 146 191 220 N
+ AA CH NG b n/a 2 146 185 222 N
+ AA CH NG e n/a 2 146 185 220 N
+ AA CH NG i n/a 2 154 185 220 N
+ AA CH NG s n/a 2 146 185 220 N
+ AA CH OW e n/a 2 146 182 215 N
+ AA CH OW s n/a 2 146 182 215 N
+ AA CH OY e n/a 2 146 167 215 N
+ AA CH OY s n/a 2 146 169 215 N
+ AA CH P b n/a 2 146 172 210 N
+ AA CH P e n/a 2 146 172 210 N
+ AA CH P i n/a 2 151 172 210 N
+ AA CH P s n/a 2 146 172 210 N
+ AA CH R b n/a 2 146 197 227 N
+ AA CH R e n/a 2 145 197 227 N
+ AA CH R i n/a 2 145 199 226 N
+ AA CH R s n/a 2 145 197 227 N
+ AA CH S b n/a 2 146 167 206 N
+ AA CH S e n/a 2 146 167 206 N
+ AA CH S s n/a 2 146 169 206 N
+ AA CH SH b n/a 2 146 167 209 N
+ AA CH SH e n/a 2 146 167 209 N
+ AA CH SH s n/a 2 146 169 209 N
+ AA CH SIL e n/a 2 146 167 207 N
+ AA CH SIL s n/a 2 146 169 207 N
+ AA CH T b n/a 2 146 171 215 N
+ AA CH T e n/a 2 146 171 215 N
+ AA CH T i n/a 2 149 171 215 N
+ AA CH T s n/a 2 146 171 215 N
+ AA CH TH b n/a 2 146 167 206 N
+ AA CH TH e n/a 2 146 167 206 N
+ AA CH TH s n/a 2 146 169 206 N
+ AA CH UH e n/a 2 146 182 215 N
+ AA CH UH s n/a 2 146 182 215 N
+ AA CH UW b n/a 2 146 182 215 N
+ AA CH UW e n/a 2 146 182 215 N
+ AA CH UW i n/a 2 151 182 215 N
+ AA CH UW s n/a 2 146 182 215 N
+ AA CH V b n/a 2 146 167 211 N
+ AA CH V e n/a 2 146 167 211 N
+ AA CH V i n/a 2 151 167 211 N
+ AA CH V s n/a 2 146 169 211 N
+ AA CH W b n/a 2 146 182 211 N
+ AA CH W e n/a 2 146 182 211 N
+ AA CH W s n/a 2 146 182 211 N
+ AA CH Y b n/a 2 146 167 213 N
+ AA CH Y e n/a 2 146 167 213 N
+ AA CH Y s n/a 2 146 169 213 N
+ AA CH Z b n/a 2 146 167 219 N
+ AA CH Z e n/a 2 146 167 219 N
+ AA CH Z i n/a 2 151 167 219 N
+ AA CH Z s n/a 2 146 169 219 N
+ AA CH ZH b n/a 2 146 167 219 N
+ AA CH ZH e n/a 2 146 167 219 N
+ AA CH ZH s n/a 2 146 169 219 N
+ AA D AA e n/a 2 130 183 215 N
+ AA D AA s n/a 2 130 183 215 N
+ AA D AE e n/a 2 130 168 215 N
+ AA D AE s n/a 2 130 169 215 N
+ AA D AH b n/a 2 130 167 215 N
+ AA D AH e n/a 2 130 168 215 N
+ AA D AH i n/a 2 139 168 215 N
+ AA D AH s n/a 2 130 169 215 N
+ AA D AO e n/a 2 130 183 215 N
+ AA D AO s n/a 2 130 183 215 N
+ AA D AW e n/a 2 130 183 215 N
+ AA D AW s n/a 2 130 183 215 N
+ AA D AY e n/a 2 130 168 215 N
+ AA D AY s n/a 2 130 169 215 N
+ AA D B b n/a 2 130 167 211 N
+ AA D B e n/a 2 130 168 211 N
+ AA D B i n/a 2 139 168 211 N
+ AA D B s n/a 2 130 169 211 N
+ AA D CH b n/a 2 130 167 209 N
+ AA D CH e n/a 2 130 168 209 N
+ AA D CH i n/a 2 139 168 209 N
+ AA D CH s n/a 2 130 169 209 N
+ AA D D b n/a 2 130 168 213 N
+ AA D D e n/a 2 130 168 213 N
+ AA D D i n/a 2 139 168 213 N
+ AA D D s n/a 2 130 169 213 N
+ AA D DH e n/a 2 130 168 218 N
+ AA D DH s n/a 2 130 169 218 N
+ AA D EH e n/a 2 130 168 215 N
+ AA D EH i n/a 2 139 168 215 N
+ AA D EH s n/a 2 130 169 215 N
+ AA D ER b n/a 2 130 197 215 N
+ AA D ER e n/a 2 130 197 215 N
+ AA D ER i n/a 2 140 200 215 N
+ AA D ER s n/a 2 130 197 215 N
+ AA D EY e n/a 2 130 168 215 N
+ AA D EY i n/a 2 139 168 215 N
+ AA D EY s n/a 2 130 169 215 N
+ AA D F b n/a 2 130 167 210 N
+ AA D F e n/a 2 130 168 210 N
+ AA D F i n/a 2 139 168 210 N
+ AA D F s n/a 2 130 169 210 N
+ AA D G b n/a 2 130 167 217 N
+ AA D G e n/a 2 130 168 217 N
+ AA D G i n/a 2 139 168 217 N
+ AA D G s n/a 2 130 169 217 N
+ AA D HH b n/a 2 130 167 207 N
+ AA D HH e n/a 2 130 168 207 N
+ AA D HH i n/a 2 139 168 207 N
+ AA D HH s n/a 2 130 169 207 N
+ AA D IH e n/a 2 130 168 215 N
+ AA D IH s n/a 2 130 169 215 N
+ AA D IY b n/a 2 130 167 215 N
+ AA D IY e n/a 2 130 168 215 N
+ AA D IY i n/a 2 139 168 215 N
+ AA D IY s n/a 2 130 169 215 N
+ AA D JH b n/a 2 130 167 214 N
+ AA D JH e n/a 2 130 168 214 N
+ AA D JH i n/a 2 139 168 214 N
+ AA D JH s n/a 2 130 169 214 N
+ AA D K b n/a 2 130 170 208 N
+ AA D K e n/a 2 130 170 208 N
+ AA D K i n/a 2 139 170 208 N
+ AA D K s n/a 2 130 170 208 N
+ AA D L b n/a 2 130 183 230 N
+ AA D L e n/a 2 130 183 229 N
+ AA D L i n/a 2 139 183 229 N
+ AA D L s n/a 2 130 183 229 N
+ AA D M b n/a 2 132 184 224 N
+ AA D M e n/a 2 132 184 224 N
+ AA D M i n/a 2 139 184 224 N
+ AA D M s n/a 2 132 184 224 N
+ AA D N b n/a 2 132 188 222 N
+ AA D N e n/a 2 132 188 220 N
+ AA D N i n/a 2 139 187 220 N
+ AA D N s n/a 2 132 188 220 N
+ AA D NG b n/a 2 132 184 222 N
+ AA D NG e n/a 2 132 184 220 N
+ AA D NG i n/a 2 139 184 220 N
+ AA D NG s n/a 2 132 184 220 N
+ AA D OW e n/a 2 130 183 215 N
+ AA D OW i n/a 2 139 183 215 N
+ AA D OW s n/a 2 130 183 215 N
+ AA D OY e n/a 2 130 168 215 N
+ AA D OY i n/a 2 139 168 215 N
+ AA D OY s n/a 2 130 169 215 N
+ AA D P b n/a 2 130 172 210 N
+ AA D P e n/a 2 130 172 210 N
+ AA D P i n/a 2 139 172 210 N
+ AA D P s n/a 2 130 172 210 N
+ AA D R b n/a 2 130 197 227 N
+ AA D R e n/a 2 130 197 227 N
+ AA D R i n/a 2 140 200 227 N
+ AA D R s n/a 2 130 197 227 N
+ AA D S b n/a 2 130 167 206 N
+ AA D S e n/a 2 130 168 206 N
+ AA D S i n/a 2 139 168 206 N
+ AA D S s n/a 2 130 169 206 N
+ AA D SH b n/a 2 130 167 209 N
+ AA D SH e n/a 2 130 168 209 N
+ AA D SH i n/a 2 139 168 209 N
+ AA D SH s n/a 2 130 169 209 N
+ AA D SIL e n/a 2 130 168 207 N
+ AA D SIL s n/a 2 130 169 207 N
+ AA D T b n/a 2 130 170 215 N
+ AA D T e n/a 2 130 170 215 N
+ AA D T i n/a 2 139 170 215 N
+ AA D T s n/a 2 130 170 215 N
+ AA D TH b n/a 2 130 167 206 N
+ AA D TH e n/a 2 130 168 206 N
+ AA D TH i n/a 2 139 168 206 N
+ AA D TH s n/a 2 130 169 206 N
+ AA D UH e n/a 2 130 183 215 N
+ AA D UH s n/a 2 130 183 215 N
+ AA D UW b n/a 2 130 183 215 N
+ AA D UW e n/a 2 130 183 215 N
+ AA D UW s n/a 2 130 183 215 N
+ AA D V b n/a 2 130 167 211 N
+ AA D V e n/a 2 130 168 211 N
+ AA D V i n/a 2 139 168 211 N
+ AA D V s n/a 2 130 169 211 N
+ AA D W b n/a 2 130 183 211 N
+ AA D W e n/a 2 130 183 211 N
+ AA D W i n/a 2 139 183 211 N
+ AA D W s n/a 2 130 183 211 N
+ AA D Y b n/a 2 130 167 213 N
+ AA D Y e n/a 2 130 168 213 N
+ AA D Y i n/a 2 139 168 213 N
+ AA D Y s n/a 2 130 169 213 N
+ AA D Z b n/a 2 130 167 219 N
+ AA D Z e n/a 2 130 168 219 N
+ AA D Z i n/a 2 139 168 219 N
+ AA D Z s n/a 2 130 169 219 N
+ AA D ZH b n/a 2 130 167 219 N
+ AA D ZH e n/a 2 130 168 219 N
+ AA D ZH i n/a 2 139 168 219 N
+ AA D ZH s n/a 2 130 169 219 N
+ AA DH AA e n/a 2 130 182 215 N
+ AA DH AA s n/a 2 130 182 215 N
+ AA DH AE e n/a 2 130 168 215 N
+ AA DH AE s n/a 2 130 169 215 N
+ AA DH AH b n/a 2 130 167 215 N
+ AA DH AH e n/a 2 130 168 215 N
+ AA DH AH s n/a 2 130 169 215 N
+ AA DH AO e n/a 2 130 182 215 N
+ AA DH AO s n/a 2 130 182 215 N
+ AA DH AW e n/a 2 130 182 215 N
+ AA DH AW s n/a 2 130 182 215 N
+ AA DH AY e n/a 2 130 168 215 N
+ AA DH AY s n/a 2 130 169 215 N
+ AA DH B b n/a 2 130 167 211 N
+ AA DH B e n/a 2 130 168 211 N
+ AA DH B s n/a 2 130 169 211 N
+ AA DH CH b n/a 2 130 167 209 N
+ AA DH CH e n/a 2 130 168 209 N
+ AA DH CH s n/a 2 130 169 209 N
+ AA DH D b n/a 2 130 168 213 N
+ AA DH D e n/a 2 130 168 213 N
+ AA DH D s n/a 2 130 169 213 N
+ AA DH DH e n/a 2 130 168 218 N
+ AA DH DH s n/a 2 130 169 218 N
+ AA DH EH e n/a 2 130 168 215 N
+ AA DH EH s n/a 2 130 169 215 N
+ AA DH ER b n/a 2 130 197 215 N
+ AA DH ER e n/a 2 130 197 215 N
+ AA DH ER s n/a 2 130 197 215 N
+ AA DH EY e n/a 2 130 168 215 N
+ AA DH EY s n/a 2 130 169 215 N
+ AA DH F b n/a 2 130 167 210 N
+ AA DH F e n/a 2 130 168 210 N
+ AA DH F s n/a 2 130 169 210 N
+ AA DH G b n/a 2 130 167 217 N
+ AA DH G e n/a 2 130 168 217 N
+ AA DH G s n/a 2 130 169 217 N
+ AA DH HH b n/a 2 130 167 207 N
+ AA DH HH e n/a 2 130 168 207 N
+ AA DH HH s n/a 2 130 169 207 N
+ AA DH IH e n/a 2 130 168 215 N
+ AA DH IH s n/a 2 130 169 215 N
+ AA DH IY b n/a 2 130 167 215 N
+ AA DH IY e n/a 2 130 168 215 N
+ AA DH IY i n/a 2 136 168 215 N
+ AA DH IY s n/a 2 130 169 215 N
+ AA DH JH b n/a 2 130 167 214 N
+ AA DH JH e n/a 2 130 168 214 N
+ AA DH JH s n/a 2 130 169 214 N
+ AA DH K b n/a 2 130 171 208 N
+ AA DH K e n/a 2 130 171 208 N
+ AA DH K s n/a 2 130 171 208 N
+ AA DH L b n/a 2 130 182 231 N
+ AA DH L e n/a 2 130 182 231 N
+ AA DH L s n/a 2 130 182 231 N
+ AA DH M b n/a 2 131 184 224 N
+ AA DH M e n/a 2 131 184 224 N
+ AA DH M s n/a 2 131 184 224 N
+ AA DH N b n/a 2 131 188 222 N
+ AA DH N e n/a 2 131 188 220 N
+ AA DH N s n/a 2 131 188 220 N
+ AA DH NG b n/a 2 131 184 222 N
+ AA DH NG e n/a 2 131 184 220 N
+ AA DH NG s n/a 2 131 184 220 N
+ AA DH OW e n/a 2 130 182 215 N
+ AA DH OW s n/a 2 130 182 215 N
+ AA DH OY e n/a 2 130 168 215 N
+ AA DH OY s n/a 2 130 169 215 N
+ AA DH P b n/a 2 130 172 210 N
+ AA DH P e n/a 2 130 172 210 N
+ AA DH P s n/a 2 130 172 210 N
+ AA DH R b n/a 2 130 197 227 N
+ AA DH R e n/a 2 130 197 227 N
+ AA DH R s n/a 2 130 197 227 N
+ AA DH S b n/a 2 130 167 206 N
+ AA DH S e n/a 2 130 168 206 N
+ AA DH S s n/a 2 130 169 206 N
+ AA DH SH b n/a 2 130 167 209 N
+ AA DH SH e n/a 2 130 168 209 N
+ AA DH SH s n/a 2 130 169 209 N
+ AA DH SIL e n/a 2 130 168 207 N
+ AA DH SIL s n/a 2 130 169 207 N
+ AA DH T b n/a 2 130 171 215 N
+ AA DH T e n/a 2 130 171 215 N
+ AA DH T s n/a 2 130 171 215 N
+ AA DH TH b n/a 2 130 167 206 N
+ AA DH TH e n/a 2 130 168 206 N
+ AA DH TH s n/a 2 130 169 206 N
+ AA DH UH e n/a 2 130 182 215 N
+ AA DH UH s n/a 2 130 182 215 N
+ AA DH UW b n/a 2 130 182 215 N
+ AA DH UW e n/a 2 130 182 215 N
+ AA DH UW s n/a 2 130 182 215 N
+ AA DH V b n/a 2 130 167 211 N
+ AA DH V e n/a 2 130 168 211 N
+ AA DH V s n/a 2 130 169 211 N
+ AA DH W b n/a 2 130 182 211 N
+ AA DH W e n/a 2 130 182 211 N
+ AA DH W s n/a 2 130 182 211 N
+ AA DH Y b n/a 2 130 167 213 N
+ AA DH Y e n/a 2 130 168 213 N
+ AA DH Y s n/a 2 130 169 213 N
+ AA DH Z b n/a 2 130 167 219 N
+ AA DH Z e n/a 2 130 168 219 N
+ AA DH Z s n/a 2 130 169 219 N
+ AA DH ZH b n/a 2 130 167 219 N
+ AA DH ZH e n/a 2 130 168 219 N
+ AA DH ZH s n/a 2 130 169 219 N
+ AA EH AA s n/a 2 130 182 215 N
+ AA EH AE s n/a 2 130 169 215 N
+ AA EH AH b n/a 2 130 167 215 N
+ AA EH AH s n/a 2 130 169 215 N
+ AA EH AO s n/a 2 130 182 215 N
+ AA EH AW s n/a 2 130 182 215 N
+ AA EH AY s n/a 2 130 169 215 N
+ AA EH B b n/a 2 130 167 211 N
+ AA EH B s n/a 2 130 169 211 N
+ AA EH CH b n/a 2 130 167 209 N
+ AA EH CH s n/a 2 130 169 209 N
+ AA EH D b n/a 2 130 168 213 N
+ AA EH D s n/a 2 130 169 213 N
+ AA EH DH s n/a 2 130 169 218 N
+ AA EH EH s n/a 2 130 169 215 N
+ AA EH ER b n/a 2 130 197 215 N
+ AA EH ER s n/a 2 130 197 215 N
+ AA EH EY s n/a 2 130 169 215 N
+ AA EH F b n/a 2 130 167 210 N
+ AA EH F s n/a 2 130 169 210 N
+ AA EH G b n/a 2 130 167 217 N
+ AA EH G s n/a 2 130 169 217 N
+ AA EH HH b n/a 2 130 167 207 N
+ AA EH HH s n/a 2 130 169 207 N
+ AA EH IH s n/a 2 130 169 215 N
+ AA EH IY b n/a 2 130 167 215 N
+ AA EH IY s n/a 2 130 169 215 N
+ AA EH JH b n/a 2 130 167 214 N
+ AA EH JH s n/a 2 130 169 214 N
+ AA EH K b n/a 2 130 171 208 N
+ AA EH K s n/a 2 130 171 208 N
+ AA EH L b n/a 2 130 182 230 N
+ AA EH L s n/a 2 130 182 230 N
+ AA EH M b n/a 2 130 184 224 N
+ AA EH M s n/a 2 130 184 224 N
+ AA EH N b n/a 2 130 188 222 N
+ AA EH N s n/a 2 130 188 220 N
+ AA EH NG b n/a 2 130 184 222 N
+ AA EH NG s n/a 2 130 184 220 N
+ AA EH OW s n/a 2 130 182 215 N
+ AA EH OY s n/a 2 130 169 215 N
+ AA EH P b n/a 2 130 172 210 N
+ AA EH P s n/a 2 130 172 210 N
+ AA EH R b n/a 2 130 197 227 N
+ AA EH R i n/a 2 142 200 225 N
+ AA EH R s n/a 2 130 197 227 N
+ AA EH S b n/a 2 130 167 206 N
+ AA EH S s n/a 2 130 169 206 N
+ AA EH SH b n/a 2 130 167 209 N
+ AA EH SH s n/a 2 130 169 209 N
+ AA EH SIL s n/a 2 130 169 207 N
+ AA EH T b n/a 2 130 171 215 N
+ AA EH T s n/a 2 130 171 215 N
+ AA EH TH b n/a 2 130 167 206 N
+ AA EH TH s n/a 2 130 169 206 N
+ AA EH UH s n/a 2 130 182 215 N
+ AA EH UW b n/a 2 130 182 215 N
+ AA EH UW s n/a 2 130 182 215 N
+ AA EH V b n/a 2 130 167 211 N
+ AA EH V s n/a 2 130 169 211 N
+ AA EH W b n/a 2 130 182 211 N
+ AA EH W s n/a 2 130 182 211 N
+ AA EH Y b n/a 2 130 167 213 N
+ AA EH Y s n/a 2 130 169 213 N
+ AA EH Z b n/a 2 130 167 219 N
+ AA EH Z s n/a 2 130 169 219 N
+ AA EH ZH b n/a 2 130 167 219 N
+ AA EH ZH s n/a 2 130 169 219 N
+ AA ER AA e n/a 2 165 182 215 N
+ AA ER AA s n/a 2 165 182 215 N
+ AA ER AE e n/a 2 165 173 215 N
+ AA ER AE s n/a 2 165 173 215 N
+ AA ER AH b n/a 2 166 173 215 N
+ AA ER AH e n/a 2 165 173 215 N
+ AA ER AH s n/a 2 165 173 215 N
+ AA ER AO e n/a 2 165 182 215 N
+ AA ER AO s n/a 2 165 182 215 N
+ AA ER AW e n/a 2 165 182 215 N
+ AA ER AW s n/a 2 165 182 215 N
+ AA ER AY e n/a 2 165 173 215 N
+ AA ER AY s n/a 2 165 173 215 N
+ AA ER B b n/a 2 166 174 211 N
+ AA ER B e n/a 2 165 174 211 N
+ AA ER B i n/a 2 165 174 211 N
+ AA ER B s n/a 2 165 174 211 N
+ AA ER CH b n/a 2 166 173 209 N
+ AA ER CH e n/a 2 165 173 209 N
+ AA ER CH i n/a 2 165 173 209 N
+ AA ER CH s n/a 2 165 173 209 N
+ AA ER D b n/a 2 166 173 213 N
+ AA ER D e n/a 2 165 173 213 N
+ AA ER D i n/a 2 165 173 213 N
+ AA ER D s n/a 2 165 173 213 N
+ AA ER DH e n/a 2 165 173 218 N
+ AA ER DH s n/a 2 165 173 218 N
+ AA ER EH e n/a 2 165 173 215 N
+ AA ER EH s n/a 2 165 173 215 N
+ AA ER ER b n/a 2 166 202 215 N
+ AA ER ER e n/a 2 165 202 215 N
+ AA ER ER s n/a 2 165 202 215 N
+ AA ER EY e n/a 2 165 173 215 N
+ AA ER EY s n/a 2 165 173 215 N
+ AA ER F b n/a 2 166 174 210 N
+ AA ER F e n/a 2 165 174 210 N
+ AA ER F i n/a 2 165 174 210 N
+ AA ER F s n/a 2 165 174 210 N
+ AA ER G b n/a 2 166 173 217 N
+ AA ER G e n/a 2 165 173 217 N
+ AA ER G i n/a 2 165 173 217 N
+ AA ER G s n/a 2 165 173 217 N
+ AA ER HH b n/a 2 166 173 207 N
+ AA ER HH e n/a 2 165 173 207 N
+ AA ER HH s n/a 2 165 173 207 N
+ AA ER IH e n/a 2 165 173 215 N
+ AA ER IH s n/a 2 165 173 215 N
+ AA ER IY b n/a 2 166 173 215 N
+ AA ER IY e n/a 2 165 173 215 N
+ AA ER IY i n/a 2 165 173 215 N
+ AA ER IY s n/a 2 165 173 215 N
+ AA ER JH b n/a 2 166 173 214 N
+ AA ER JH e n/a 2 165 173 214 N
+ AA ER JH i n/a 2 165 173 214 N
+ AA ER JH s n/a 2 165 173 214 N
+ AA ER K b n/a 2 166 173 208 N
+ AA ER K e n/a 2 165 173 208 N
+ AA ER K i n/a 2 165 173 208 N
+ AA ER K s n/a 2 165 173 208 N
+ AA ER L b n/a 2 166 182 230 N
+ AA ER L e n/a 2 165 182 230 N
+ AA ER L i n/a 2 165 182 230 N
+ AA ER L s n/a 2 165 182 230 N
+ AA ER M b n/a 2 166 185 224 N
+ AA ER M e n/a 2 165 185 224 N
+ AA ER M i n/a 2 165 185 224 N
+ AA ER M s n/a 2 165 185 224 N
+ AA ER N b n/a 2 166 192 222 N
+ AA ER N e n/a 2 165 192 220 N
+ AA ER N i n/a 2 165 192 220 N
+ AA ER N s n/a 2 165 192 220 N
+ AA ER NG b n/a 2 166 185 222 N
+ AA ER NG e n/a 2 165 185 220 N
+ AA ER NG i n/a 2 165 185 220 N
+ AA ER NG s n/a 2 165 185 220 N
+ AA ER OW e n/a 2 165 182 215 N
+ AA ER OW s n/a 2 165 182 215 N
+ AA ER OY e n/a 2 165 173 215 N
+ AA ER OY s n/a 2 165 173 215 N
+ AA ER P b n/a 2 166 174 210 N
+ AA ER P e n/a 2 165 174 210 N
+ AA ER P i n/a 2 165 174 210 N
+ AA ER P s n/a 2 165 174 210 N
+ AA ER R b n/a 2 166 202 227 N
+ AA ER R e n/a 2 165 202 227 N
+ AA ER R i n/a 2 165 199 225 N
+ AA ER R s n/a 2 165 202 227 N
+ AA ER S b n/a 2 166 173 206 N
+ AA ER S e n/a 2 165 173 206 N
+ AA ER S i n/a 2 165 173 206 N
+ AA ER S s n/a 2 165 173 206 N
+ AA ER SH b n/a 2 166 173 209 N
+ AA ER SH e n/a 2 165 173 209 N
+ AA ER SH i n/a 2 165 173 209 N
+ AA ER SH s n/a 2 165 173 209 N
+ AA ER SIL e n/a 2 165 173 207 N
+ AA ER SIL s n/a 2 165 173 207 N
+ AA ER T b n/a 2 166 173 215 N
+ AA ER T e n/a 2 165 173 215 N
+ AA ER T i n/a 2 165 173 215 N
+ AA ER T s n/a 2 165 173 215 N
+ AA ER TH b n/a 2 166 173 206 N
+ AA ER TH e n/a 2 165 173 206 N
+ AA ER TH i n/a 2 165 173 206 N
+ AA ER TH s n/a 2 165 173 206 N
+ AA ER UH e n/a 2 165 182 215 N
+ AA ER UH s n/a 2 165 182 215 N
+ AA ER UW b n/a 2 166 182 215 N
+ AA ER UW e n/a 2 165 182 215 N
+ AA ER UW s n/a 2 165 182 215 N
+ AA ER V b n/a 2 166 174 211 N
+ AA ER V e n/a 2 165 174 211 N
+ AA ER V i n/a 2 165 174 211 N
+ AA ER V s n/a 2 165 174 211 N
+ AA ER W b n/a 2 166 182 211 N
+ AA ER W e n/a 2 165 182 211 N
+ AA ER W s n/a 2 165 182 211 N
+ AA ER Y b n/a 2 166 173 213 N
+ AA ER Y e n/a 2 165 173 213 N
+ AA ER Y i n/a 2 165 173 213 N
+ AA ER Y s n/a 2 165 173 213 N
+ AA ER Z b n/a 2 166 173 219 N
+ AA ER Z e n/a 2 165 173 219 N
+ AA ER Z i n/a 2 165 173 219 N
+ AA ER Z s n/a 2 165 173 219 N
+ AA ER ZH b n/a 2 166 173 219 N
+ AA ER ZH e n/a 2 165 173 219 N
+ AA ER ZH i n/a 2 165 173 219 N
+ AA ER ZH s n/a 2 165 173 219 N
+ AA EY AA e n/a 2 141 183 215 N
+ AA EY AA s n/a 2 141 183 215 N
+ AA EY AE e n/a 2 141 168 215 N
+ AA EY AE s n/a 2 141 169 215 N
+ AA EY AH b n/a 2 141 167 215 N
+ AA EY AH e n/a 2 141 168 215 N
+ AA EY AH s n/a 2 141 169 215 N
+ AA EY AO e n/a 2 141 183 215 N
+ AA EY AO s n/a 2 141 183 215 N
+ AA EY AW e n/a 2 141 183 215 N
+ AA EY AW s n/a 2 141 183 215 N
+ AA EY AY e n/a 2 141 168 215 N
+ AA EY AY s n/a 2 141 169 215 N
+ AA EY B b n/a 2 141 167 211 N
+ AA EY B e n/a 2 141 168 211 N
+ AA EY B s n/a 2 141 169 211 N
+ AA EY CH b n/a 2 141 167 209 N
+ AA EY CH e n/a 2 141 168 209 N
+ AA EY CH s n/a 2 141 169 209 N
+ AA EY D b n/a 2 141 168 213 N
+ AA EY D e n/a 2 141 168 213 N
+ AA EY D s n/a 2 141 169 213 N
+ AA EY DH e n/a 2 141 168 218 N
+ AA EY DH s n/a 2 141 169 218 N
+ AA EY EH e n/a 2 141 168 215 N
+ AA EY EH s n/a 2 141 169 215 N
+ AA EY ER b n/a 2 141 197 215 N
+ AA EY ER e n/a 2 141 197 215 N
+ AA EY ER s n/a 2 141 197 215 N
+ AA EY EY e n/a 2 141 168 215 N
+ AA EY EY s n/a 2 141 169 215 N
+ AA EY F b n/a 2 141 167 210 N
+ AA EY F e n/a 2 141 168 210 N
+ AA EY F s n/a 2 141 169 210 N
+ AA EY G b n/a 2 141 167 217 N
+ AA EY G e n/a 2 141 168 217 N
+ AA EY G i n/a 2 142 168 217 N
+ AA EY G s n/a 2 141 169 217 N
+ AA EY HH b n/a 2 141 167 207 N
+ AA EY HH e n/a 2 141 168 207 N
+ AA EY HH s n/a 2 141 169 207 N
+ AA EY IH e n/a 2 141 168 215 N
+ AA EY IH s n/a 2 141 169 215 N
+ AA EY IY b n/a 2 141 167 215 N
+ AA EY IY e n/a 2 141 168 215 N
+ AA EY IY s n/a 2 141 169 215 N
+ AA EY JH b n/a 2 141 167 214 N
+ AA EY JH e n/a 2 141 168 214 N
+ AA EY JH s n/a 2 141 169 214 N
+ AA EY K b n/a 2 141 171 208 N
+ AA EY K e n/a 2 141 171 208 N
+ AA EY K i n/a 2 142 171 208 N
+ AA EY K s n/a 2 141 171 208 N
+ AA EY L b n/a 2 141 183 230 N
+ AA EY L e n/a 2 141 183 230 N
+ AA EY L s n/a 2 141 183 230 N
+ AA EY M b n/a 2 141 184 224 N
+ AA EY M e n/a 2 141 184 224 N
+ AA EY M s n/a 2 141 184 224 N
+ AA EY N b n/a 2 141 188 222 N
+ AA EY N e n/a 2 141 188 220 N
+ AA EY N i n/a 2 142 187 220 N
+ AA EY N s n/a 2 141 188 220 N
+ AA EY NG b n/a 2 141 184 222 N
+ AA EY NG e n/a 2 141 184 220 N
+ AA EY NG s n/a 2 141 184 220 N
+ AA EY OW e n/a 2 141 183 215 N
+ AA EY OW s n/a 2 141 183 215 N
+ AA EY OY e n/a 2 141 168 215 N
+ AA EY OY s n/a 2 141 169 215 N
+ AA EY P b n/a 2 141 172 210 N
+ AA EY P e n/a 2 141 172 210 N
+ AA EY P s n/a 2 141 172 210 N
+ AA EY R b n/a 2 141 197 227 N
+ AA EY R e n/a 2 141 197 227 N
+ AA EY R i n/a 2 142 200 225 N
+ AA EY R s n/a 2 141 197 227 N
+ AA EY S b n/a 2 141 167 206 N
+ AA EY S e n/a 2 141 168 206 N
+ AA EY S i n/a 2 142 168 206 N
+ AA EY S s n/a 2 141 169 206 N
+ AA EY SH b n/a 2 141 167 209 N
+ AA EY SH e n/a 2 141 168 209 N
+ AA EY SH s n/a 2 141 169 209 N
+ AA EY SIL e n/a 2 141 168 207 N
+ AA EY SIL s n/a 2 141 169 207 N
+ AA EY T b n/a 2 141 171 215 N
+ AA EY T e n/a 2 141 171 215 N
+ AA EY T i n/a 2 142 171 215 N
+ AA EY T s n/a 2 141 171 215 N
+ AA EY TH b n/a 2 141 167 206 N
+ AA EY TH e n/a 2 141 168 206 N
+ AA EY TH s n/a 2 141 169 206 N
+ AA EY UH e n/a 2 141 183 215 N
+ AA EY UH s n/a 2 141 183 215 N
+ AA EY UW b n/a 2 141 183 215 N
+ AA EY UW e n/a 2 141 183 215 N
+ AA EY UW s n/a 2 141 183 215 N
+ AA EY V b n/a 2 141 167 211 N
+ AA EY V e n/a 2 141 168 211 N
+ AA EY V i n/a 2 142 168 211 N
+ AA EY V s n/a 2 141 169 211 N
+ AA EY W b n/a 2 141 183 211 N
+ AA EY W e n/a 2 141 183 211 N
+ AA EY W s n/a 2 141 183 211 N
+ AA EY Y b n/a 2 141 167 213 N
+ AA EY Y e n/a 2 141 168 213 N
+ AA EY Y s n/a 2 141 169 213 N
+ AA EY Z b n/a 2 141 167 219 N
+ AA EY Z e n/a 2 141 168 219 N
+ AA EY Z i n/a 2 142 168 219 N
+ AA EY Z s n/a 2 141 169 219 N
+ AA EY ZH b n/a 2 141 167 219 N
+ AA EY ZH e n/a 2 141 168 219 N
+ AA EY ZH s n/a 2 141 169 219 N
+ AA F AA e n/a 2 144 181 215 N
+ AA F AA s n/a 2 144 181 215 N
+ AA F AE e n/a 2 144 176 215 N
+ AA F AE s n/a 2 144 176 215 N
+ AA F AH b n/a 2 144 176 215 N
+ AA F AH e n/a 2 144 176 215 N
+ AA F AH s n/a 2 144 176 215 N
+ AA F AO e n/a 2 144 181 215 N
+ AA F AO s n/a 2 144 181 215 N
+ AA F AW e n/a 2 144 181 215 N
+ AA F AW s n/a 2 144 181 215 N
+ AA F AY e n/a 2 144 176 215 N
+ AA F AY i n/a 2 149 176 215 N
+ AA F AY s n/a 2 144 176 215 N
+ AA F B b n/a 2 143 176 211 N
+ AA F B e n/a 2 144 176 211 N
+ AA F B i n/a 2 149 176 211 N
+ AA F B s n/a 2 144 176 211 N
+ AA F CH b n/a 2 143 176 209 N
+ AA F CH e n/a 2 144 176 209 N
+ AA F CH i n/a 2 149 176 209 N
+ AA F CH s n/a 2 144 176 209 N
+ AA F D b n/a 2 143 176 214 N
+ AA F D e n/a 2 144 176 214 N
+ AA F D i n/a 2 149 176 214 N
+ AA F D s n/a 2 144 176 214 N
+ AA F DH e n/a 2 144 176 218 N
+ AA F DH i n/a 2 149 176 218 N
+ AA F DH s n/a 2 144 176 218 N
+ AA F EH e n/a 2 144 176 215 N
+ AA F EH i n/a 2 149 176 215 N
+ AA F EH s n/a 2 144 176 215 N
+ AA F ER b n/a 2 143 202 215 N
+ AA F ER e n/a 2 143 202 215 N
+ AA F ER s n/a 2 143 202 215 N
+ AA F EY e n/a 2 144 176 215 N
+ AA F EY s n/a 2 144 176 215 N
+ AA F F b n/a 2 144 176 210 N
+ AA F F e n/a 2 144 176 210 N
+ AA F F s n/a 2 144 176 210 N
+ AA F G b n/a 2 143 176 217 N
+ AA F G e n/a 2 144 176 217 N
+ AA F G i n/a 2 149 176 217 N
+ AA F G s n/a 2 144 176 217 N
+ AA F HH b n/a 2 144 176 207 N
+ AA F HH e n/a 2 144 176 207 N
+ AA F HH s n/a 2 144 176 207 N
+ AA F IH e n/a 2 144 176 215 N
+ AA F IH i n/a 2 149 176 215 N
+ AA F IH s n/a 2 144 176 215 N
+ AA F IY b n/a 2 144 176 215 N
+ AA F IY e n/a 2 144 176 215 N
+ AA F IY i n/a 2 149 176 215 N
+ AA F IY s n/a 2 144 176 215 N
+ AA F JH b n/a 2 143 176 214 N
+ AA F JH e n/a 2 144 176 214 N
+ AA F JH i n/a 2 149 176 214 N
+ AA F JH s n/a 2 144 176 214 N
+ AA F K b n/a 2 143 177 208 N
+ AA F K e n/a 2 144 177 208 N
+ AA F K i n/a 2 149 177 208 N
+ AA F K s n/a 2 144 177 208 N
+ AA F L b n/a 2 144 181 231 N
+ AA F L e n/a 2 144 181 231 N
+ AA F L i n/a 2 149 181 231 N
+ AA F L s n/a 2 144 181 231 N
+ AA F M b n/a 2 144 186 224 N
+ AA F M e n/a 2 144 186 224 N
+ AA F M i n/a 2 149 186 224 N
+ AA F M s n/a 2 144 186 224 N
+ AA F N b n/a 2 144 190 222 N
+ AA F N e n/a 2 144 190 220 N
+ AA F N i n/a 2 149 189 220 N
+ AA F N s n/a 2 144 190 220 N
+ AA F NG b n/a 2 144 186 222 N
+ AA F NG e n/a 2 144 186 220 N
+ AA F NG s n/a 2 144 186 220 N
+ AA F OW e n/a 2 144 181 215 N
+ AA F OW s n/a 2 144 181 215 N
+ AA F OY e n/a 2 144 176 215 N
+ AA F OY s n/a 2 144 176 215 N
+ AA F P b n/a 2 143 177 210 N
+ AA F P e n/a 2 144 177 210 N
+ AA F P i n/a 2 149 177 210 N
+ AA F P s n/a 2 144 177 210 N
+ AA F R b n/a 2 143 202 227 N
+ AA F R e n/a 2 143 202 227 N
+ AA F R i n/a 2 150 201 228 N
+ AA F R s n/a 2 143 202 227 N
+ AA F S b n/a 2 144 176 206 N
+ AA F S e n/a 2 144 176 206 N
+ AA F S i n/a 2 149 176 206 N
+ AA F S s n/a 2 144 176 206 N
+ AA F SH b n/a 2 144 176 209 N
+ AA F SH e n/a 2 144 176 209 N
+ AA F SH i n/a 2 149 176 209 N
+ AA F SH s n/a 2 144 176 209 N
+ AA F SIL e n/a 2 144 176 207 N
+ AA F SIL s n/a 2 144 176 207 N
+ AA F T b n/a 2 143 177 215 N
+ AA F T e n/a 2 144 177 215 N
+ AA F T i n/a 2 149 177 215 N
+ AA F T s n/a 2 144 177 215 N
+ AA F TH b n/a 2 144 176 206 N
+ AA F TH e n/a 2 144 176 206 N
+ AA F TH i n/a 2 149 176 206 N
+ AA F TH s n/a 2 144 176 206 N
+ AA F UH e n/a 2 144 181 215 N
+ AA F UH s n/a 2 144 181 215 N
+ AA F UW b n/a 2 144 181 215 N
+ AA F UW e n/a 2 144 181 215 N
+ AA F UW s n/a 2 144 181 215 N
+ AA F V b n/a 2 144 176 211 N
+ AA F V e n/a 2 144 176 211 N
+ AA F V i n/a 2 149 176 211 N
+ AA F V s n/a 2 144 176 211 N
+ AA F W b n/a 2 144 181 211 N
+ AA F W e n/a 2 144 181 211 N
+ AA F W s n/a 2 144 181 211 N
+ AA F Y b n/a 2 144 176 214 N
+ AA F Y e n/a 2 144 176 214 N
+ AA F Y i n/a 2 149 176 214 N
+ AA F Y s n/a 2 144 176 214 N
+ AA F Z b n/a 2 144 176 219 N
+ AA F Z e n/a 2 144 176 219 N
+ AA F Z i n/a 2 149 176 219 N
+ AA F Z s n/a 2 144 176 219 N
+ AA F ZH b n/a 2 144 176 219 N
+ AA F ZH e n/a 2 144 176 219 N
+ AA F ZH s n/a 2 144 176 219 N
+ AA G AA e n/a 2 130 183 216 N
+ AA G AA s n/a 2 130 183 216 N
+ AA G AE e n/a 2 130 168 216 N
+ AA G AE s n/a 2 130 169 216 N
+ AA G AH b n/a 2 130 167 216 N
+ AA G AH e n/a 2 130 168 216 N
+ AA G AH s n/a 2 130 169 216 N
+ AA G AO e n/a 2 130 183 216 N
+ AA G AO s n/a 2 130 183 216 N
+ AA G AW e n/a 2 130 183 216 N
+ AA G AW s n/a 2 130 183 216 N
+ AA G AY e n/a 2 130 168 216 N
+ AA G AY s n/a 2 130 169 216 N
+ AA G B b n/a 2 130 167 211 N
+ AA G B e n/a 2 130 168 211 N
+ AA G B i n/a 2 138 168 211 N
+ AA G B s n/a 2 130 169 211 N
+ AA G CH b n/a 2 130 167 209 N
+ AA G CH e n/a 2 130 168 209 N
+ AA G CH i n/a 2 138 168 209 N
+ AA G CH s n/a 2 130 169 209 N
+ AA G D b n/a 2 130 168 213 N
+ AA G D e n/a 2 130 168 213 N
+ AA G D i n/a 2 138 168 213 N
+ AA G D s n/a 2 130 169 213 N
+ AA G DH e n/a 2 130 168 218 N
+ AA G DH s n/a 2 130 169 218 N
+ AA G EH e n/a 2 130 168 216 N
+ AA G EH i n/a 2 138 168 216 N
+ AA G EH s n/a 2 130 169 216 N
+ AA G ER b n/a 2 130 197 216 N
+ AA G ER e n/a 2 130 197 216 N
+ AA G ER i n/a 2 136 200 216 N
+ AA G ER s n/a 2 130 197 216 N
+ AA G EY e n/a 2 130 168 216 N
+ AA G EY s n/a 2 130 169 216 N
+ AA G F b n/a 2 130 167 210 N
+ AA G F e n/a 2 130 168 210 N
+ AA G F i n/a 2 138 168 210 N
+ AA G F s n/a 2 130 169 210 N
+ AA G G b n/a 2 130 167 217 N
+ AA G G e n/a 2 130 168 217 N
+ AA G G i n/a 2 138 168 217 N
+ AA G G s n/a 2 130 169 217 N
+ AA G HH b n/a 2 130 167 207 N
+ AA G HH e n/a 2 130 168 207 N
+ AA G HH i n/a 2 138 168 207 N
+ AA G HH s n/a 2 130 169 207 N
+ AA G IH e n/a 2 130 168 216 N
+ AA G IH s n/a 2 130 169 216 N
+ AA G IY b n/a 2 130 167 216 N
+ AA G IY e n/a 2 130 168 216 N
+ AA G IY i n/a 2 138 168 216 N
+ AA G IY s n/a 2 130 169 216 N
+ AA G JH b n/a 2 130 167 214 N
+ AA G JH e n/a 2 130 168 214 N
+ AA G JH i n/a 2 138 168 214 N
+ AA G JH s n/a 2 130 169 214 N
+ AA G K b n/a 2 130 170 208 N
+ AA G K e n/a 2 130 170 208 N
+ AA G K i n/a 2 137 170 208 N
+ AA G K s n/a 2 130 170 208 N
+ AA G L b n/a 2 130 183 230 N
+ AA G L e n/a 2 130 183 230 N
+ AA G L i n/a 2 138 183 230 N
+ AA G L s n/a 2 130 183 230 N
+ AA G M b n/a 2 132 184 224 N
+ AA G M e n/a 2 132 184 224 N
+ AA G M i n/a 2 138 184 224 N
+ AA G M s n/a 2 132 184 224 N
+ AA G N b n/a 2 132 188 222 N
+ AA G N e n/a 2 132 188 221 N
+ AA G N i n/a 2 138 187 221 N
+ AA G N s n/a 2 132 188 221 N
+ AA G NG b n/a 2 132 184 222 N
+ AA G NG e n/a 2 132 184 221 N
+ AA G NG i n/a 2 138 184 221 N
+ AA G NG s n/a 2 132 184 221 N
+ AA G OW e n/a 2 130 183 216 N
+ AA G OW i n/a 2 138 183 216 N
+ AA G OW s n/a 2 130 183 216 N
+ AA G OY e n/a 2 130 168 216 N
+ AA G OY s n/a 2 130 169 216 N
+ AA G P b n/a 2 130 172 210 N
+ AA G P e n/a 2 130 172 210 N
+ AA G P i n/a 2 137 172 210 N
+ AA G P s n/a 2 130 172 210 N
+ AA G R b n/a 2 130 197 227 N
+ AA G R e n/a 2 130 197 227 N
+ AA G R i n/a 2 136 200 226 N
+ AA G R s n/a 2 130 197 227 N
+ AA G S b n/a 2 130 167 206 N
+ AA G S e n/a 2 130 168 206 N
+ AA G S i n/a 2 138 168 206 N
+ AA G S s n/a 2 130 169 206 N
+ AA G SH b n/a 2 130 167 209 N
+ AA G SH e n/a 2 130 168 209 N
+ AA G SH i n/a 2 138 168 209 N
+ AA G SH s n/a 2 130 169 209 N
+ AA G SIL e n/a 2 130 168 207 N
+ AA G SIL s n/a 2 130 169 207 N
+ AA G T b n/a 2 130 170 216 N
+ AA G T e n/a 2 130 170 216 N
+ AA G T i n/a 2 137 170 216 N
+ AA G T s n/a 2 130 170 216 N
+ AA G TH b n/a 2 130 167 206 N
+ AA G TH e n/a 2 130 168 206 N
+ AA G TH i n/a 2 138 168 206 N
+ AA G TH s n/a 2 130 169 206 N
+ AA G UH e n/a 2 130 183 216 N
+ AA G UH s n/a 2 130 183 216 N
+ AA G UW b n/a 2 130 183 216 N
+ AA G UW e n/a 2 130 183 216 N
+ AA G UW i n/a 2 138 183 216 N
+ AA G UW s n/a 2 130 183 216 N
+ AA G V b n/a 2 130 167 211 N
+ AA G V e n/a 2 130 168 211 N
+ AA G V i n/a 2 138 168 211 N
+ AA G V s n/a 2 130 169 211 N
+ AA G W b n/a 2 130 183 211 N
+ AA G W e n/a 2 130 183 211 N
+ AA G W i n/a 2 138 183 211 N
+ AA G W s n/a 2 130 183 211 N
+ AA G Y b n/a 2 130 167 213 N
+ AA G Y e n/a 2 130 168 213 N
+ AA G Y i n/a 2 138 168 213 N
+ AA G Y s n/a 2 130 169 213 N
+ AA G Z b n/a 2 130 167 219 N
+ AA G Z e n/a 2 130 168 219 N
+ AA G Z i n/a 2 138 168 219 N
+ AA G Z s n/a 2 130 169 219 N
+ AA G ZH b n/a 2 130 167 219 N
+ AA G ZH e n/a 2 130 168 219 N
+ AA G ZH i n/a 2 138 168 219 N
+ AA G ZH s n/a 2 130 169 219 N
+ AA HH AA e n/a 2 146 182 215 N
+ AA HH AA s n/a 2 146 182 215 N
+ AA HH AE e n/a 2 146 167 215 N
+ AA HH AE s n/a 2 146 169 215 N
+ AA HH AH b n/a 2 146 167 215 N
+ AA HH AH e n/a 2 146 167 215 N
+ AA HH AH s n/a 2 146 169 215 N
+ AA HH AO e n/a 2 146 182 215 N
+ AA HH AO s n/a 2 146 182 215 N
+ AA HH AW e n/a 2 146 182 215 N
+ AA HH AW s n/a 2 146 182 215 N
+ AA HH AY e n/a 2 146 167 215 N
+ AA HH AY i n/a 2 153 167 215 N
+ AA HH AY s n/a 2 146 169 215 N
+ AA HH B b n/a 2 146 167 211 N
+ AA HH B e n/a 2 146 167 211 N
+ AA HH B i n/a 2 153 167 211 N
+ AA HH B s n/a 2 146 169 211 N
+ AA HH CH b n/a 2 146 167 209 N
+ AA HH CH e n/a 2 146 167 209 N
+ AA HH CH i n/a 2 153 167 209 N
+ AA HH CH s n/a 2 146 169 209 N
+ AA HH D b n/a 2 146 167 213 N
+ AA HH D e n/a 2 146 167 213 N
+ AA HH D i n/a 2 149 167 213 N
+ AA HH D s n/a 2 146 169 213 N
+ AA HH DH e n/a 2 146 167 218 N
+ AA HH DH s n/a 2 146 169 218 N
+ AA HH EH e n/a 2 146 167 215 N
+ AA HH EH s n/a 2 146 169 215 N
+ AA HH ER b n/a 2 146 197 215 N
+ AA HH ER e n/a 2 145 197 215 N
+ AA HH ER i n/a 2 148 205 215 N
+ AA HH ER s n/a 2 145 197 215 N
+ AA HH EY e n/a 2 146 167 215 N
+ AA HH EY s n/a 2 146 169 215 N
+ AA HH F b n/a 2 146 167 210 N
+ AA HH F e n/a 2 146 167 210 N
+ AA HH F i n/a 2 153 167 210 N
+ AA HH F s n/a 2 146 169 210 N
+ AA HH G b n/a 2 146 167 217 N
+ AA HH G e n/a 2 146 167 217 N
+ AA HH G i n/a 2 153 167 217 N
+ AA HH G s n/a 2 146 169 217 N
+ AA HH HH b n/a 2 146 167 207 N
+ AA HH HH e n/a 2 146 167 207 N
+ AA HH HH i n/a 2 153 167 207 N
+ AA HH HH s n/a 2 146 169 207 N
+ AA HH IH e n/a 2 146 167 215 N
+ AA HH IH i n/a 2 153 167 215 N
+ AA HH IH s n/a 2 146 169 215 N
+ AA HH IY b n/a 2 146 167 215 N
+ AA HH IY e n/a 2 146 167 215 N
+ AA HH IY i n/a 2 153 167 215 N
+ AA HH IY s n/a 2 146 169 215 N
+ AA HH JH b n/a 2 146 167 214 N
+ AA HH JH e n/a 2 146 167 214 N
+ AA HH JH i n/a 2 153 167 214 N
+ AA HH JH s n/a 2 146 169 214 N
+ AA HH K b n/a 2 146 171 208 N
+ AA HH K e n/a 2 146 171 208 N
+ AA HH K i n/a 2 153 171 208 N
+ AA HH K s n/a 2 146 171 208 N
+ AA HH L b n/a 2 146 182 231 N
+ AA HH L e n/a 2 146 182 231 N
+ AA HH L i n/a 2 153 182 231 N
+ AA HH L s n/a 2 146 182 231 N
+ AA HH M b n/a 2 146 185 224 N
+ AA HH M e n/a 2 146 185 224 N
+ AA HH M i n/a 2 154 185 224 N
+ AA HH M s n/a 2 146 185 224 N
+ AA HH N b n/a 2 146 191 222 N
+ AA HH N e n/a 2 146 191 220 N
+ AA HH N i n/a 2 154 191 220 N
+ AA HH N s n/a 2 146 191 220 N
+ AA HH NG b n/a 2 146 185 222 N
+ AA HH NG e n/a 2 146 185 220 N
+ AA HH NG i n/a 2 154 185 220 N
+ AA HH NG s n/a 2 146 185 220 N
+ AA HH OW e n/a 2 146 182 215 N
+ AA HH OW s n/a 2 146 182 215 N
+ AA HH OY e n/a 2 146 167 215 N
+ AA HH OY s n/a 2 146 169 215 N
+ AA HH P b n/a 2 146 172 210 N
+ AA HH P e n/a 2 146 172 210 N
+ AA HH P i n/a 2 153 172 210 N
+ AA HH P s n/a 2 146 172 210 N
+ AA HH R b n/a 2 146 197 227 N
+ AA HH R e n/a 2 145 197 227 N
+ AA HH R i n/a 2 147 205 225 N
+ AA HH R s n/a 2 145 197 227 N
+ AA HH S b n/a 2 146 167 206 N
+ AA HH S e n/a 2 146 167 206 N
+ AA HH S i n/a 2 153 167 206 N
+ AA HH S s n/a 2 146 169 206 N
+ AA HH SH b n/a 2 146 167 209 N
+ AA HH SH e n/a 2 146 167 209 N
+ AA HH SH i n/a 2 153 167 209 N
+ AA HH SH s n/a 2 146 169 209 N
+ AA HH SIL e n/a 2 146 167 207 N
+ AA HH SIL s n/a 2 146 169 207 N
+ AA HH T b n/a 2 146 171 215 N
+ AA HH T e n/a 2 146 171 215 N
+ AA HH T i n/a 2 149 171 215 N
+ AA HH T s n/a 2 146 171 215 N
+ AA HH TH b n/a 2 146 167 206 N
+ AA HH TH e n/a 2 146 167 206 N
+ AA HH TH i n/a 2 153 167 206 N
+ AA HH TH s n/a 2 146 169 206 N
+ AA HH UH e n/a 2 146 182 215 N
+ AA HH UH s n/a 2 146 182 215 N
+ AA HH UW b n/a 2 146 182 215 N
+ AA HH UW e n/a 2 146 182 215 N
+ AA HH UW i n/a 2 153 182 215 N
+ AA HH UW s n/a 2 146 182 215 N
+ AA HH V b n/a 2 146 167 211 N
+ AA HH V e n/a 2 146 167 211 N
+ AA HH V i n/a 2 153 167 211 N
+ AA HH V s n/a 2 146 169 211 N
+ AA HH W b n/a 2 146 182 211 N
+ AA HH W e n/a 2 146 182 211 N
+ AA HH W i n/a 2 153 182 211 N
+ AA HH W s n/a 2 146 182 211 N
+ AA HH Y b n/a 2 146 167 213 N
+ AA HH Y e n/a 2 146 167 213 N
+ AA HH Y i n/a 2 153 167 213 N
+ AA HH Y s n/a 2 146 169 213 N
+ AA HH Z b n/a 2 146 167 219 N
+ AA HH Z e n/a 2 146 167 219 N
+ AA HH Z i n/a 2 153 167 219 N
+ AA HH Z s n/a 2 146 169 219 N
+ AA HH ZH b n/a 2 146 167 219 N
+ AA HH ZH e n/a 2 146 167 219 N
+ AA HH ZH s n/a 2 146 169 219 N
+ AA IH AA s n/a 2 129 182 215 N
+ AA IH AE s n/a 2 129 169 215 N
+ AA IH AH b n/a 2 129 167 215 N
+ AA IH AH s n/a 2 129 169 215 N
+ AA IH AO s n/a 2 129 182 215 N
+ AA IH AW s n/a 2 129 182 215 N
+ AA IH AY s n/a 2 129 169 215 N
+ AA IH B b n/a 2 129 167 211 N
+ AA IH B s n/a 2 129 169 211 N
+ AA IH CH b n/a 2 129 167 209 N
+ AA IH CH s n/a 2 129 169 209 N
+ AA IH D b n/a 2 129 168 213 N
+ AA IH D s n/a 2 129 169 213 N
+ AA IH DH s n/a 2 129 169 218 N
+ AA IH EH s n/a 2 129 169 215 N
+ AA IH ER b n/a 2 129 197 215 N
+ AA IH ER s n/a 2 129 197 215 N
+ AA IH EY s n/a 2 129 169 215 N
+ AA IH F b n/a 2 129 167 210 N
+ AA IH F s n/a 2 129 169 210 N
+ AA IH G b n/a 2 129 167 217 N
+ AA IH G s n/a 2 129 169 217 N
+ AA IH HH b n/a 2 129 167 207 N
+ AA IH HH s n/a 2 129 169 207 N
+ AA IH IH s n/a 2 129 169 215 N
+ AA IH IY b n/a 2 129 167 215 N
+ AA IH IY s n/a 2 129 169 215 N
+ AA IH JH b n/a 2 129 167 214 N
+ AA IH JH s n/a 2 129 169 214 N
+ AA IH K b n/a 2 129 171 208 N
+ AA IH K s n/a 2 129 171 208 N
+ AA IH L b n/a 2 129 182 230 N
+ AA IH L s n/a 2 129 182 230 N
+ AA IH M b n/a 2 130 184 224 N
+ AA IH M s n/a 2 130 184 224 N
+ AA IH N b n/a 2 130 188 222 N
+ AA IH N i n/a 2 142 187 220 N
+ AA IH N s n/a 2 130 188 220 N
+ AA IH NG b n/a 2 130 184 222 N
+ AA IH NG s n/a 2 130 184 220 N
+ AA IH OW s n/a 2 129 182 215 N
+ AA IH OY s n/a 2 129 169 215 N
+ AA IH P b n/a 2 129 172 210 N
+ AA IH P s n/a 2 129 172 210 N
+ AA IH R b n/a 2 129 197 227 N
+ AA IH R s n/a 2 129 197 227 N
+ AA IH S b n/a 2 129 167 206 N
+ AA IH S s n/a 2 129 169 206 N
+ AA IH SH b n/a 2 129 167 209 N
+ AA IH SH s n/a 2 129 169 209 N
+ AA IH SIL s n/a 2 129 169 207 N
+ AA IH T b n/a 2 129 171 215 N
+ AA IH T s n/a 2 129 171 215 N
+ AA IH TH b n/a 2 129 167 206 N
+ AA IH TH s n/a 2 129 169 206 N
+ AA IH UH s n/a 2 129 182 215 N
+ AA IH UW b n/a 2 129 182 215 N
+ AA IH UW s n/a 2 129 182 215 N
+ AA IH V b n/a 2 129 167 211 N
+ AA IH V s n/a 2 129 169 211 N
+ AA IH W b n/a 2 129 182 211 N
+ AA IH W s n/a 2 129 182 211 N
+ AA IH Y b n/a 2 129 167 213 N
+ AA IH Y s n/a 2 129 169 213 N
+ AA IH Z b n/a 2 129 167 219 N
+ AA IH Z s n/a 2 129 169 219 N
+ AA IH ZH b n/a 2 129 167 219 N
+ AA IH ZH s n/a 2 129 169 219 N
+ AA IY AA e n/a 2 141 183 215 N
+ AA IY AA i n/a 2 142 183 215 N
+ AA IY AA s n/a 2 141 183 215 N
+ AA IY AE e n/a 2 141 168 215 N
+ AA IY AE s n/a 2 141 169 215 N
+ AA IY AH b n/a 2 141 167 215 N
+ AA IY AH e n/a 2 141 168 215 N
+ AA IY AH s n/a 2 141 169 215 N
+ AA IY AO e n/a 2 141 183 215 N
+ AA IY AO s n/a 2 141 183 215 N
+ AA IY AW e n/a 2 141 183 215 N
+ AA IY AW s n/a 2 141 183 215 N
+ AA IY AY e n/a 2 141 168 215 N
+ AA IY AY s n/a 2 141 169 215 N
+ AA IY B b n/a 2 141 167 211 N
+ AA IY B e n/a 2 141 168 211 N
+ AA IY B s n/a 2 141 169 211 N
+ AA IY CH b n/a 2 141 167 209 N
+ AA IY CH e n/a 2 141 168 209 N
+ AA IY CH i n/a 2 142 168 209 N
+ AA IY CH s n/a 2 141 169 209 N
+ AA IY D b n/a 2 141 168 213 N
+ AA IY D e n/a 2 141 168 213 N
+ AA IY D i n/a 2 142 168 213 N
+ AA IY D s n/a 2 141 169 213 N
+ AA IY DH e n/a 2 141 168 218 N
+ AA IY DH s n/a 2 141 169 218 N
+ AA IY EH e n/a 2 141 168 215 N
+ AA IY EH s n/a 2 141 169 215 N
+ AA IY ER b n/a 2 141 197 215 N
+ AA IY ER e n/a 2 141 197 215 N
+ AA IY ER s n/a 2 141 197 215 N
+ AA IY EY e n/a 2 141 168 215 N
+ AA IY EY s n/a 2 141 169 215 N
+ AA IY F b n/a 2 141 167 210 N
+ AA IY F e n/a 2 141 168 210 N
+ AA IY F i n/a 2 142 168 210 N
+ AA IY F s n/a 2 141 169 210 N
+ AA IY G b n/a 2 141 167 217 N
+ AA IY G e n/a 2 141 168 217 N
+ AA IY G i n/a 2 142 168 217 N
+ AA IY G s n/a 2 141 169 217 N
+ AA IY HH b n/a 2 141 167 207 N
+ AA IY HH e n/a 2 141 168 207 N
+ AA IY HH i n/a 2 142 168 207 N
+ AA IY HH s n/a 2 141 169 207 N
+ AA IY IH e n/a 2 141 168 215 N
+ AA IY IH s n/a 2 141 169 215 N
+ AA IY IY b n/a 2 141 167 215 N
+ AA IY IY e n/a 2 141 168 215 N
+ AA IY IY i n/a 2 142 168 215 N
+ AA IY IY s n/a 2 141 169 215 N
+ AA IY JH b n/a 2 141 167 214 N
+ AA IY JH e n/a 2 141 168 214 N
+ AA IY JH i n/a 2 142 168 214 N
+ AA IY JH s n/a 2 141 169 214 N
+ AA IY K b n/a 2 141 171 208 N
+ AA IY K e n/a 2 141 171 208 N
+ AA IY K i n/a 2 142 171 208 N
+ AA IY K s n/a 2 141 171 208 N
+ AA IY L b n/a 2 141 183 230 N
+ AA IY L e n/a 2 141 183 230 N
+ AA IY L i n/a 2 142 183 230 N
+ AA IY L s n/a 2 141 183 230 N
+ AA IY M b n/a 2 141 184 224 N
+ AA IY M e n/a 2 141 184 224 N
+ AA IY M i n/a 2 142 184 224 N
+ AA IY M s n/a 2 141 184 224 N
+ AA IY N b n/a 2 141 188 222 N
+ AA IY N e n/a 2 141 188 220 N
+ AA IY N i n/a 2 142 187 220 N
+ AA IY N s n/a 2 141 188 220 N
+ AA IY NG b n/a 2 141 184 222 N
+ AA IY NG e n/a 2 141 184 220 N
+ AA IY NG i n/a 2 142 184 220 N
+ AA IY NG s n/a 2 141 184 220 N
+ AA IY OW e n/a 2 141 183 215 N
+ AA IY OW s n/a 2 141 183 215 N
+ AA IY OY e n/a 2 141 168 215 N
+ AA IY OY s n/a 2 141 169 215 N
+ AA IY P b n/a 2 141 172 210 N
+ AA IY P e n/a 2 141 172 210 N
+ AA IY P i n/a 2 142 172 210 N
+ AA IY P s n/a 2 141 172 210 N
+ AA IY R b n/a 2 141 197 227 N
+ AA IY R e n/a 2 141 197 227 N
+ AA IY R i n/a 2 142 200 225 N
+ AA IY R s n/a 2 141 197 227 N
+ AA IY S b n/a 2 141 167 206 N
+ AA IY S e n/a 2 141 168 206 N
+ AA IY S i n/a 2 142 168 206 N
+ AA IY S s n/a 2 141 169 206 N
+ AA IY SH b n/a 2 141 167 209 N
+ AA IY SH e n/a 2 141 168 209 N
+ AA IY SH i n/a 2 142 168 209 N
+ AA IY SH s n/a 2 141 169 209 N
+ AA IY SIL e n/a 2 141 168 207 N
+ AA IY SIL s n/a 2 141 169 207 N
+ AA IY T b n/a 2 141 171 215 N
+ AA IY T e n/a 2 141 171 215 N
+ AA IY T i n/a 2 142 171 215 N
+ AA IY T s n/a 2 141 171 215 N
+ AA IY TH b n/a 2 141 167 206 N
+ AA IY TH e n/a 2 141 168 206 N
+ AA IY TH i n/a 2 142 168 206 N
+ AA IY TH s n/a 2 141 169 206 N
+ AA IY UH e n/a 2 141 183 215 N
+ AA IY UH s n/a 2 141 183 215 N
+ AA IY UW b n/a 2 141 183 215 N
+ AA IY UW e n/a 2 141 183 215 N
+ AA IY UW s n/a 2 141 183 215 N
+ AA IY V b n/a 2 141 167 211 N
+ AA IY V e n/a 2 141 168 211 N
+ AA IY V i n/a 2 142 168 211 N
+ AA IY V s n/a 2 141 169 211 N
+ AA IY W b n/a 2 141 183 211 N
+ AA IY W e n/a 2 141 183 211 N
+ AA IY W s n/a 2 141 183 211 N
+ AA IY Y b n/a 2 141 167 213 N
+ AA IY Y e n/a 2 141 168 213 N
+ AA IY Y s n/a 2 141 169 213 N
+ AA IY Z b n/a 2 141 167 219 N
+ AA IY Z e n/a 2 141 168 219 N
+ AA IY Z i n/a 2 142 168 219 N
+ AA IY Z s n/a 2 141 169 219 N
+ AA IY ZH b n/a 2 141 167 219 N
+ AA IY ZH e n/a 2 141 168 219 N
+ AA IY ZH s n/a 2 141 169 219 N
+ AA JH AA e n/a 2 130 182 215 N
+ AA JH AA s n/a 2 130 182 215 N
+ AA JH AE e n/a 2 130 168 215 N
+ AA JH AE s n/a 2 130 169 215 N
+ AA JH AH b n/a 2 130 167 215 N
+ AA JH AH e n/a 2 130 168 215 N
+ AA JH AH i n/a 2 138 168 215 N
+ AA JH AH s n/a 2 130 169 215 N
+ AA JH AO e n/a 2 130 182 215 N
+ AA JH AO s n/a 2 130 182 215 N
+ AA JH AW e n/a 2 130 182 215 N
+ AA JH AW s n/a 2 130 182 215 N
+ AA JH AY e n/a 2 130 168 215 N
+ AA JH AY s n/a 2 130 169 215 N
+ AA JH B b n/a 2 130 167 211 N
+ AA JH B e n/a 2 130 168 211 N
+ AA JH B i n/a 2 138 168 211 N
+ AA JH B s n/a 2 130 169 211 N
+ AA JH CH b n/a 2 130 167 209 N
+ AA JH CH e n/a 2 130 168 209 N
+ AA JH CH i n/a 2 138 168 209 N
+ AA JH CH s n/a 2 130 169 209 N
+ AA JH D b n/a 2 130 168 213 N
+ AA JH D e n/a 2 130 168 213 N
+ AA JH D i n/a 2 138 168 213 N
+ AA JH D s n/a 2 130 169 213 N
+ AA JH DH e n/a 2 130 168 218 N
+ AA JH DH s n/a 2 130 169 218 N
+ AA JH EH e n/a 2 130 168 215 N
+ AA JH EH s n/a 2 130 169 215 N
+ AA JH ER b n/a 2 130 197 215 N
+ AA JH ER e n/a 2 130 197 215 N
+ AA JH ER s n/a 2 130 197 215 N
+ AA JH EY e n/a 2 130 168 215 N
+ AA JH EY s n/a 2 130 169 215 N
+ AA JH F b n/a 2 130 167 210 N
+ AA JH F e n/a 2 130 168 210 N
+ AA JH F i n/a 2 138 168 210 N
+ AA JH F s n/a 2 130 169 210 N
+ AA JH G b n/a 2 130 167 217 N
+ AA JH G e n/a 2 130 168 217 N
+ AA JH G i n/a 2 138 168 217 N
+ AA JH G s n/a 2 130 169 217 N
+ AA JH HH b n/a 2 130 167 207 N
+ AA JH HH e n/a 2 130 168 207 N
+ AA JH HH i n/a 2 138 168 207 N
+ AA JH HH s n/a 2 130 169 207 N
+ AA JH IH e n/a 2 130 168 215 N
+ AA JH IH s n/a 2 130 169 215 N
+ AA JH IY b n/a 2 130 167 215 N
+ AA JH IY e n/a 2 130 168 215 N
+ AA JH IY s n/a 2 130 169 215 N
+ AA JH JH b n/a 2 130 167 214 N
+ AA JH JH e n/a 2 130 168 214 N
+ AA JH JH i n/a 2 138 168 214 N
+ AA JH JH s n/a 2 130 169 214 N
+ AA JH K b n/a 2 130 171 208 N
+ AA JH K e n/a 2 130 171 208 N
+ AA JH K i n/a 2 138 171 208 N
+ AA JH K s n/a 2 130 171 208 N
+ AA JH L b n/a 2 130 182 230 N
+ AA JH L e n/a 2 130 182 230 N
+ AA JH L i n/a 2 138 182 230 N
+ AA JH L s n/a 2 130 182 230 N
+ AA JH M b n/a 2 132 184 224 N
+ AA JH M e n/a 2 132 184 224 N
+ AA JH M i n/a 2 138 184 224 N
+ AA JH M s n/a 2 132 184 224 N
+ AA JH N b n/a 2 132 188 222 N
+ AA JH N e n/a 2 132 188 220 N
+ AA JH N i n/a 2 138 187 220 N
+ AA JH N s n/a 2 132 188 220 N
+ AA JH NG b n/a 2 132 184 222 N
+ AA JH NG e n/a 2 132 184 220 N
+ AA JH NG i n/a 2 138 184 220 N
+ AA JH NG s n/a 2 132 184 220 N
+ AA JH OW e n/a 2 130 182 215 N
+ AA JH OW s n/a 2 130 182 215 N
+ AA JH OY e n/a 2 130 168 215 N
+ AA JH OY s n/a 2 130 169 215 N
+ AA JH P b n/a 2 130 172 210 N
+ AA JH P e n/a 2 130 172 210 N
+ AA JH P i n/a 2 138 172 210 N
+ AA JH P s n/a 2 130 172 210 N
+ AA JH R b n/a 2 130 197 227 N
+ AA JH R e n/a 2 130 197 227 N
+ AA JH R i n/a 2 136 200 226 N
+ AA JH R s n/a 2 130 197 227 N
+ AA JH S b n/a 2 130 167 206 N
+ AA JH S e n/a 2 130 168 206 N
+ AA JH S i n/a 2 138 168 206 N
+ AA JH S s n/a 2 130 169 206 N
+ AA JH SH b n/a 2 130 167 209 N
+ AA JH SH e n/a 2 130 168 209 N
+ AA JH SH i n/a 2 138 168 209 N
+ AA JH SH s n/a 2 130 169 209 N
+ AA JH SIL e n/a 2 130 168 207 N
+ AA JH SIL s n/a 2 130 169 207 N
+ AA JH T b n/a 2 130 171 215 N
+ AA JH T e n/a 2 130 171 215 N
+ AA JH T i n/a 2 138 171 215 N
+ AA JH T s n/a 2 130 171 215 N
+ AA JH TH b n/a 2 130 167 206 N
+ AA JH TH e n/a 2 130 168 206 N
+ AA JH TH i n/a 2 138 168 206 N
+ AA JH TH s n/a 2 130 169 206 N
+ AA JH UH e n/a 2 130 182 215 N
+ AA JH UH s n/a 2 130 182 215 N
+ AA JH UW b n/a 2 130 182 215 N
+ AA JH UW e n/a 2 130 182 215 N
+ AA JH UW i n/a 2 138 182 215 N
+ AA JH UW s n/a 2 130 182 215 N
+ AA JH V b n/a 2 130 167 211 N
+ AA JH V e n/a 2 130 168 211 N
+ AA JH V i n/a 2 138 168 211 N
+ AA JH V s n/a 2 130 169 211 N
+ AA JH W b n/a 2 130 182 211 N
+ AA JH W e n/a 2 130 182 211 N
+ AA JH W i n/a 2 138 182 211 N
+ AA JH W s n/a 2 130 182 211 N
+ AA JH Y b n/a 2 130 167 213 N
+ AA JH Y e n/a 2 130 168 213 N
+ AA JH Y s n/a 2 130 169 213 N
+ AA JH Z b n/a 2 130 167 219 N
+ AA JH Z e n/a 2 130 168 219 N
+ AA JH Z i n/a 2 138 168 219 N
+ AA JH Z s n/a 2 130 169 219 N
+ AA JH ZH b n/a 2 130 167 219 N
+ AA JH ZH e n/a 2 130 168 219 N
+ AA JH ZH s n/a 2 130 169 219 N
+ AA K AA e n/a 2 146 182 216 N
+ AA K AA s n/a 2 146 182 216 N
+ AA K AE e n/a 2 146 167 216 N
+ AA K AE s n/a 2 146 169 216 N
+ AA K AH b n/a 2 146 167 216 N
+ AA K AH e n/a 2 146 167 216 N
+ AA K AH s n/a 2 146 169 216 N
+ AA K AO e n/a 2 146 182 216 N
+ AA K AO s n/a 2 146 182 216 N
+ AA K AW e n/a 2 146 182 216 N
+ AA K AW s n/a 2 146 182 216 N
+ AA K AY e n/a 2 146 167 216 N
+ AA K AY i n/a 2 151 167 216 N
+ AA K AY s n/a 2 146 169 216 N
+ AA K B b n/a 2 146 167 211 N
+ AA K B e n/a 2 146 167 211 N
+ AA K B i n/a 2 151 167 211 N
+ AA K B s n/a 2 146 169 211 N
+ AA K CH b n/a 2 146 167 209 N
+ AA K CH e n/a 2 146 167 209 N
+ AA K CH i n/a 2 151 167 209 N
+ AA K CH s n/a 2 146 169 209 N
+ AA K D b n/a 2 146 167 213 N
+ AA K D e n/a 2 146 167 213 N
+ AA K D i n/a 2 151 167 213 N
+ AA K D s n/a 2 146 169 213 N
+ AA K DH e n/a 2 146 167 218 N
+ AA K DH s n/a 2 146 169 218 N
+ AA K EH e n/a 2 146 167 216 N
+ AA K EH s n/a 2 146 169 216 N
+ AA K ER b n/a 2 146 197 216 N
+ AA K ER e n/a 2 145 197 216 N
+ AA K ER s n/a 2 145 197 216 N
+ AA K EY e n/a 2 146 167 216 N
+ AA K EY i n/a 2 151 167 216 N
+ AA K EY s n/a 2 146 169 216 N
+ AA K F b n/a 2 146 167 210 N
+ AA K F e n/a 2 146 167 210 N
+ AA K F i n/a 2 151 167 210 N
+ AA K F s n/a 2 146 169 210 N
+ AA K G b n/a 2 146 167 217 N
+ AA K G e n/a 2 146 167 217 N
+ AA K G i n/a 2 151 167 217 N
+ AA K G s n/a 2 146 169 217 N
+ AA K HH b n/a 2 146 167 207 N
+ AA K HH e n/a 2 146 167 207 N
+ AA K HH i n/a 2 151 167 207 N
+ AA K HH s n/a 2 146 169 207 N
+ AA K IH e n/a 2 146 167 216 N
+ AA K IH i n/a 2 151 167 216 N
+ AA K IH s n/a 2 146 169 216 N
+ AA K IY b n/a 2 146 167 216 N
+ AA K IY e n/a 2 146 167 216 N
+ AA K IY i n/a 2 151 167 216 N
+ AA K IY s n/a 2 146 169 216 N
+ AA K JH b n/a 2 146 167 214 N
+ AA K JH e n/a 2 146 167 214 N
+ AA K JH i n/a 2 151 167 214 N
+ AA K JH s n/a 2 146 169 214 N
+ AA K K b n/a 2 146 171 208 N
+ AA K K e n/a 2 146 171 208 N
+ AA K K i n/a 2 151 171 208 N
+ AA K K s n/a 2 146 171 208 N
+ AA K L b n/a 2 146 182 231 N
+ AA K L e n/a 2 146 182 231 N
+ AA K L i n/a 2 151 182 231 N
+ AA K L s n/a 2 146 182 231 N
+ AA K M b n/a 2 146 185 224 N
+ AA K M e n/a 2 146 185 224 N
+ AA K M i n/a 2 152 185 224 N
+ AA K M s n/a 2 146 185 224 N
+ AA K N b n/a 2 146 191 222 N
+ AA K N e n/a 2 146 191 221 N
+ AA K N i n/a 2 152 191 221 N
+ AA K N s n/a 2 146 191 221 N
+ AA K NG b n/a 2 146 185 222 N
+ AA K NG e n/a 2 146 185 221 N
+ AA K NG i n/a 2 152 185 221 N
+ AA K NG s n/a 2 146 185 221 N
+ AA K OW e n/a 2 146 182 216 N
+ AA K OW i n/a 2 151 182 216 N
+ AA K OW s n/a 2 146 182 216 N
+ AA K OY e n/a 2 146 167 216 N
+ AA K OY i n/a 2 151 167 216 N
+ AA K OY s n/a 2 146 169 216 N
+ AA K P b n/a 2 146 172 210 N
+ AA K P e n/a 2 146 172 210 N
+ AA K P i n/a 2 151 172 210 N
+ AA K P s n/a 2 146 172 210 N
+ AA K R b n/a 2 146 197 227 N
+ AA K R e n/a 2 145 197 227 N
+ AA K R i n/a 2 148 199 226 N
+ AA K R s n/a 2 145 197 227 N
+ AA K S b n/a 2 146 167 206 N
+ AA K S e n/a 2 146 167 206 N
+ AA K S i n/a 2 151 167 206 N
+ AA K S s n/a 2 146 169 206 N
+ AA K SH b n/a 2 146 167 209 N
+ AA K SH e n/a 2 146 167 209 N
+ AA K SH i n/a 2 151 167 209 N
+ AA K SH s n/a 2 146 169 209 N
+ AA K SIL e n/a 2 146 167 207 N
+ AA K SIL s n/a 2 146 169 207 N
+ AA K T b n/a 2 146 171 216 N
+ AA K T e n/a 2 146 171 216 N
+ AA K T i n/a 2 151 171 216 N
+ AA K T s n/a 2 146 171 216 N
+ AA K TH b n/a 2 146 167 206 N
+ AA K TH e n/a 2 146 167 206 N
+ AA K TH i n/a 2 151 167 206 N
+ AA K TH s n/a 2 146 169 206 N
+ AA K UH e n/a 2 146 182 216 N
+ AA K UH s n/a 2 146 182 216 N
+ AA K UW b n/a 2 146 182 216 N
+ AA K UW e n/a 2 146 182 216 N
+ AA K UW i n/a 2 151 182 216 N
+ AA K UW s n/a 2 146 182 216 N
+ AA K V b n/a 2 146 167 211 N
+ AA K V e n/a 2 146 167 211 N
+ AA K V i n/a 2 151 167 211 N
+ AA K V s n/a 2 146 169 211 N
+ AA K W b n/a 2 146 182 211 N
+ AA K W e n/a 2 146 182 211 N
+ AA K W i n/a 2 151 182 211 N
+ AA K W s n/a 2 146 182 211 N
+ AA K Y b n/a 2 146 167 213 N
+ AA K Y e n/a 2 146 167 213 N
+ AA K Y i n/a 2 151 167 213 N
+ AA K Y s n/a 2 146 169 213 N
+ AA K Z b n/a 2 146 167 219 N
+ AA K Z e n/a 2 146 167 219 N
+ AA K Z i n/a 2 151 167 219 N
+ AA K Z s n/a 2 146 169 219 N
+ AA K ZH b n/a 2 146 167 219 N
+ AA K ZH e n/a 2 146 167 219 N
+ AA K ZH i n/a 2 151 167 219 N
+ AA K ZH s n/a 2 146 169 219 N
+ AA L AA e n/a 2 157 182 215 N
+ AA L AA s n/a 2 157 182 215 N
+ AA L AE e n/a 2 157 176 215 N
+ AA L AE s n/a 2 157 177 215 N
+ AA L AH b n/a 2 158 177 215 N
+ AA L AH e n/a 2 157 176 215 N
+ AA L AH i n/a 2 157 177 215 N
+ AA L AH s n/a 2 157 177 215 N
+ AA L AO e n/a 2 157 182 215 N
+ AA L AO s n/a 2 157 182 215 N
+ AA L AW e n/a 2 157 182 215 N
+ AA L AW s n/a 2 157 182 215 N
+ AA L AY e n/a 2 157 176 215 N
+ AA L AY s n/a 2 157 177 215 N
+ AA L B b n/a 2 158 177 211 N
+ AA L B e n/a 2 157 176 211 N
+ AA L B i n/a 2 157 177 211 N
+ AA L B s n/a 2 157 177 211 N
+ AA L CH b n/a 2 158 178 209 N
+ AA L CH e n/a 2 157 178 209 N
+ AA L CH i n/a 2 157 178 209 N
+ AA L CH s n/a 2 157 178 209 N
+ AA L D b n/a 2 158 178 213 N
+ AA L D e n/a 2 157 178 213 N
+ AA L D i n/a 2 157 178 213 N
+ AA L D s n/a 2 157 178 213 N
+ AA L DH e n/a 2 157 176 218 N
+ AA L DH s n/a 2 157 177 218 N
+ AA L EH e n/a 2 157 176 215 N
+ AA L EH i n/a 2 157 177 215 N
+ AA L EH s n/a 2 157 177 215 N
+ AA L ER b n/a 2 158 203 215 N
+ AA L ER e n/a 2 159 203 215 N
+ AA L ER i n/a 2 159 203 215 N
+ AA L ER s n/a 2 159 203 215 N
+ AA L EY e n/a 2 157 176 215 N
+ AA L EY s n/a 2 157 177 215 N
+ AA L F b n/a 2 158 177 210 N
+ AA L F e n/a 2 157 176 210 N
+ AA L F i n/a 2 157 177 210 N
+ AA L F s n/a 2 157 177 210 N
+ AA L G b n/a 2 158 177 217 N
+ AA L G e n/a 2 157 176 217 N
+ AA L G i n/a 2 157 177 217 N
+ AA L G s n/a 2 157 177 217 N
+ AA L HH b n/a 2 158 177 207 N
+ AA L HH e n/a 2 157 176 207 N
+ AA L HH i n/a 2 157 177 207 N
+ AA L HH s n/a 2 157 177 207 N
+ AA L IH e n/a 2 157 176 215 N
+ AA L IH i n/a 2 157 177 215 N
+ AA L IH s n/a 2 157 177 215 N
+ AA L IY b n/a 2 158 177 215 N
+ AA L IY e n/a 2 157 176 215 N
+ AA L IY i n/a 2 157 177 215 N
+ AA L IY s n/a 2 157 177 215 N
+ AA L JH b n/a 2 158 178 214 N
+ AA L JH e n/a 2 157 178 214 N
+ AA L JH i n/a 2 157 178 214 N
+ AA L JH s n/a 2 157 178 214 N
+ AA L K b n/a 2 158 177 208 N
+ AA L K e n/a 2 157 177 208 N
+ AA L K i n/a 2 157 177 208 N
+ AA L K s n/a 2 157 177 208 N
+ AA L L b n/a 2 158 182 230 N
+ AA L L e n/a 2 157 182 230 N
+ AA L L i n/a 2 157 182 230 N
+ AA L L s n/a 2 157 182 230 N
+ AA L M b n/a 2 158 184 224 N
+ AA L M e n/a 2 157 184 224 N
+ AA L M i n/a 2 157 184 224 N
+ AA L M s n/a 2 157 184 224 N
+ AA L N b n/a 2 158 189 222 N
+ AA L N e n/a 2 157 189 220 N
+ AA L N i n/a 2 157 189 220 N
+ AA L N s n/a 2 157 189 220 N
+ AA L NG b n/a 2 158 184 222 N
+ AA L NG e n/a 2 157 184 220 N
+ AA L NG i n/a 2 157 184 220 N
+ AA L NG s n/a 2 157 184 220 N
+ AA L OW e n/a 2 157 182 215 N
+ AA L OW i n/a 2 157 182 215 N
+ AA L OW s n/a 2 157 182 215 N
+ AA L OY e n/a 2 157 176 215 N
+ AA L OY s n/a 2 157 177 215 N
+ AA L P b n/a 2 158 177 210 N
+ AA L P e n/a 2 157 177 210 N
+ AA L P i n/a 2 157 177 210 N
+ AA L P s n/a 2 157 177 210 N
+ AA L R b n/a 2 158 203 228 N
+ AA L R e n/a 2 159 203 228 N
+ AA L R i n/a 2 159 203 228 N
+ AA L R s n/a 2 159 203 228 N
+ AA L S b n/a 2 158 177 206 N
+ AA L S e n/a 2 157 176 206 N
+ AA L S i n/a 2 157 177 206 N
+ AA L S s n/a 2 157 177 206 N
+ AA L SH b n/a 2 158 177 209 N
+ AA L SH e n/a 2 157 176 209 N
+ AA L SH i n/a 2 157 177 209 N
+ AA L SH s n/a 2 157 177 209 N
+ AA L SIL e n/a 2 157 176 207 N
+ AA L SIL s n/a 2 157 177 207 N
+ AA L T b n/a 2 158 178 215 N
+ AA L T e n/a 2 157 178 215 N
+ AA L T i n/a 2 157 178 215 N
+ AA L T s n/a 2 157 178 215 N
+ AA L TH b n/a 2 158 177 206 N
+ AA L TH e n/a 2 157 176 206 N
+ AA L TH i n/a 2 157 177 206 N
+ AA L TH s n/a 2 157 177 206 N
+ AA L UH e n/a 2 157 182 215 N
+ AA L UH s n/a 2 157 182 215 N
+ AA L UW b n/a 2 158 182 215 N
+ AA L UW e n/a 2 157 182 215 N
+ AA L UW i n/a 2 157 182 215 N
+ AA L UW s n/a 2 157 182 215 N
+ AA L V b n/a 2 158 177 211 N
+ AA L V e n/a 2 157 176 211 N
+ AA L V i n/a 2 157 177 211 N
+ AA L V s n/a 2 157 177 211 N
+ AA L W b n/a 2 158 182 211 N
+ AA L W e n/a 2 157 182 211 N
+ AA L W i n/a 2 157 182 211 N
+ AA L W s n/a 2 157 182 211 N
+ AA L Y b n/a 2 158 177 213 N
+ AA L Y e n/a 2 157 176 213 N
+ AA L Y i n/a 2 157 177 213 N
+ AA L Y s n/a 2 157 177 213 N
+ AA L Z b n/a 2 158 177 219 N
+ AA L Z e n/a 2 157 176 219 N
+ AA L Z i n/a 2 157 177 219 N
+ AA L Z s n/a 2 157 177 219 N
+ AA L ZH b n/a 2 158 177 219 N
+ AA L ZH e n/a 2 157 176 219 N
+ AA L ZH i n/a 2 157 177 219 N
+ AA L ZH s n/a 2 157 177 219 N
+ AA M AA e n/a 2 163 186 215 N
+ AA M AA s n/a 2 163 186 215 N
+ AA M AE e n/a 2 163 186 215 N
+ AA M AE s n/a 2 163 186 215 N
+ AA M AH b n/a 2 162 186 215 N
+ AA M AH e n/a 2 163 186 215 N
+ AA M AH i n/a 2 163 186 215 N
+ AA M AH s n/a 2 163 186 215 N
+ AA M AO e n/a 2 163 186 215 N
+ AA M AO s n/a 2 163 186 215 N
+ AA M AW e n/a 2 163 186 215 N
+ AA M AW s n/a 2 163 186 215 N
+ AA M AY e n/a 2 163 186 215 N
+ AA M AY s n/a 2 163 186 215 N
+ AA M B b n/a 2 162 186 211 N
+ AA M B e n/a 2 163 186 211 N
+ AA M B i n/a 2 163 186 211 N
+ AA M B s n/a 2 163 186 211 N
+ AA M CH b n/a 2 162 186 209 N
+ AA M CH e n/a 2 163 186 209 N
+ AA M CH i n/a 2 163 186 209 N
+ AA M CH s n/a 2 163 186 209 N
+ AA M D b n/a 2 162 189 215 N
+ AA M D e n/a 2 163 189 215 N
+ AA M D i n/a 2 163 189 215 N
+ AA M D s n/a 2 163 189 215 N
+ AA M DH e n/a 2 163 186 218 N
+ AA M DH i n/a 2 163 186 218 N
+ AA M DH s n/a 2 163 186 218 N
+ AA M EH e n/a 2 163 186 215 N
+ AA M EH i n/a 2 163 186 215 N
+ AA M EH s n/a 2 163 186 215 N
+ AA M ER b n/a 2 162 204 215 N
+ AA M ER e n/a 2 164 203 215 N
+ AA M ER s n/a 2 164 204 215 N
+ AA M EY e n/a 2 163 186 215 N
+ AA M EY s n/a 2 163 186 215 N
+ AA M F b n/a 2 162 186 210 N
+ AA M F e n/a 2 163 186 210 N
+ AA M F i n/a 2 163 186 210 N
+ AA M F s n/a 2 163 186 210 N
+ AA M G b n/a 2 162 186 217 N
+ AA M G e n/a 2 163 186 217 N
+ AA M G i n/a 2 163 186 217 N
+ AA M G s n/a 2 163 186 217 N
+ AA M HH b n/a 2 162 186 207 N
+ AA M HH e n/a 2 163 186 207 N
+ AA M HH i n/a 2 163 186 207 N
+ AA M HH s n/a 2 163 186 207 N
+ AA M IH e n/a 2 163 186 215 N
+ AA M IH i n/a 2 163 186 215 N
+ AA M IH s n/a 2 163 186 215 N
+ AA M IY b n/a 2 162 186 215 N
+ AA M IY e n/a 2 163 186 215 N
+ AA M IY i n/a 2 163 186 215 N
+ AA M IY s n/a 2 163 186 215 N
+ AA M JH b n/a 2 162 186 214 N
+ AA M JH e n/a 2 163 186 214 N
+ AA M JH i n/a 2 163 186 214 N
+ AA M JH s n/a 2 163 186 214 N
+ AA M K b n/a 2 162 196 208 N
+ AA M K e n/a 2 163 196 208 N
+ AA M K i n/a 2 163 196 208 N
+ AA M K s n/a 2 163 196 208 N
+ AA M L b n/a 2 162 186 231 N
+ AA M L e n/a 2 163 186 231 N
+ AA M L i n/a 2 163 186 231 N
+ AA M L s n/a 2 163 186 231 N
+ AA M M b n/a 2 162 186 224 N
+ AA M M e n/a 2 163 186 224 N
+ AA M M i n/a 2 163 186 224 N
+ AA M M s n/a 2 163 186 224 N
+ AA M N b n/a 2 162 189 222 N
+ AA M N e n/a 2 163 189 220 N
+ AA M N i n/a 2 163 189 220 N
+ AA M N s n/a 2 163 189 220 N
+ AA M NG b n/a 2 162 186 222 N
+ AA M NG e n/a 2 163 186 220 N
+ AA M NG i n/a 2 163 186 220 N
+ AA M NG s n/a 2 163 186 220 N
+ AA M OW e n/a 2 163 186 215 N
+ AA M OW i n/a 2 163 186 215 N
+ AA M OW s n/a 2 163 186 215 N
+ AA M OY e n/a 2 163 186 215 N
+ AA M OY s n/a 2 163 186 215 N
+ AA M P b n/a 2 162 196 210 N
+ AA M P e n/a 2 163 196 210 N
+ AA M P i n/a 2 163 196 210 N
+ AA M P s n/a 2 163 196 210 N
+ AA M R b n/a 2 162 204 227 N
+ AA M R e n/a 2 164 203 227 N
+ AA M R i n/a 2 164 204 225 N
+ AA M R s n/a 2 164 204 227 N
+ AA M S b n/a 2 162 186 206 N
+ AA M S e n/a 2 163 186 206 N
+ AA M S i n/a 2 163 186 206 N
+ AA M S s n/a 2 163 186 206 N
+ AA M SH b n/a 2 162 186 209 N
+ AA M SH e n/a 2 163 186 209 N
+ AA M SH i n/a 2 163 186 209 N
+ AA M SH s n/a 2 163 186 209 N
+ AA M SIL e n/a 2 163 186 207 N
+ AA M SIL s n/a 2 163 186 207 N
+ AA M T b n/a 2 162 196 212 N
+ AA M T e n/a 2 163 196 212 N
+ AA M T i n/a 2 163 196 212 N
+ AA M T s n/a 2 163 196 212 N
+ AA M TH b n/a 2 162 186 206 N
+ AA M TH e n/a 2 163 186 206 N
+ AA M TH i n/a 2 163 186 206 N
+ AA M TH s n/a 2 163 186 206 N
+ AA M UH e n/a 2 163 186 215 N
+ AA M UH s n/a 2 163 186 215 N
+ AA M UW b n/a 2 162 186 215 N
+ AA M UW e n/a 2 163 186 215 N
+ AA M UW i n/a 2 163 186 215 N
+ AA M UW s n/a 2 163 186 215 N
+ AA M V b n/a 2 162 186 211 N
+ AA M V e n/a 2 163 186 211 N
+ AA M V i n/a 2 163 186 211 N
+ AA M V s n/a 2 163 186 211 N
+ AA M W b n/a 2 162 186 211 N
+ AA M W e n/a 2 163 186 211 N
+ AA M W i n/a 2 163 186 211 N
+ AA M W s n/a 2 163 186 211 N
+ AA M Y b n/a 2 162 186 215 N
+ AA M Y e n/a 2 163 186 215 N
+ AA M Y i n/a 2 163 186 215 N
+ AA M Y s n/a 2 163 186 215 N
+ AA M Z b n/a 2 162 186 218 N
+ AA M Z e n/a 2 163 186 218 N
+ AA M Z i n/a 2 163 186 218 N
+ AA M Z s n/a 2 163 186 218 N
+ AA M ZH b n/a 2 162 186 218 N
+ AA M ZH e n/a 2 163 186 218 N
+ AA M ZH s n/a 2 163 186 218 N
+ AA N AA e n/a 2 128 184 215 N
+ AA N AA s n/a 2 128 184 215 N
+ AA N AE e n/a 2 128 184 215 N
+ AA N AE s n/a 2 128 184 215 N
+ AA N AH b n/a 2 128 184 215 N
+ AA N AH e n/a 2 128 184 215 N
+ AA N AH s n/a 2 128 184 215 N
+ AA N AO e n/a 2 128 184 215 N
+ AA N AO s n/a 2 128 184 215 N
+ AA N AW e n/a 2 128 184 215 N
+ AA N AW s n/a 2 128 184 215 N
+ AA N AY e n/a 2 128 184 215 N
+ AA N AY s n/a 2 128 184 215 N
+ AA N B b n/a 2 128 184 211 N
+ AA N B e n/a 2 128 184 211 N
+ AA N B i n/a 2 126 184 211 N
+ AA N B s n/a 2 128 184 211 N
+ AA N CH b n/a 2 128 184 209 N
+ AA N CH e n/a 2 128 184 209 N
+ AA N CH i n/a 2 126 184 209 N
+ AA N CH s n/a 2 128 184 209 N
+ AA N D b n/a 2 128 188 215 N
+ AA N D e n/a 2 128 188 215 N
+ AA N D i n/a 2 126 187 215 N
+ AA N D s n/a 2 128 188 215 N
+ AA N DH e n/a 2 128 184 218 N
+ AA N DH s n/a 2 128 184 218 N
+ AA N EH e n/a 2 128 184 215 N
+ AA N EH s n/a 2 128 184 215 N
+ AA N ER b n/a 2 128 197 215 N
+ AA N ER e n/a 2 128 197 215 N
+ AA N ER s n/a 2 128 197 215 N
+ AA N EY e n/a 2 128 184 215 N
+ AA N EY s n/a 2 128 184 215 N
+ AA N F b n/a 2 128 184 210 N
+ AA N F e n/a 2 128 184 210 N
+ AA N F i n/a 2 126 184 210 N
+ AA N F s n/a 2 128 184 210 N
+ AA N G b n/a 2 128 184 217 N
+ AA N G e n/a 2 128 184 217 N
+ AA N G i n/a 2 126 184 217 N
+ AA N G s n/a 2 128 184 217 N
+ AA N HH b n/a 2 128 184 207 N
+ AA N HH e n/a 2 128 184 207 N
+ AA N HH i n/a 2 126 184 207 N
+ AA N HH s n/a 2 128 184 207 N
+ AA N IH e n/a 2 128 184 215 N
+ AA N IH i n/a 2 126 184 215 N
+ AA N IH s n/a 2 128 184 215 N
+ AA N IY b n/a 2 128 184 215 N
+ AA N IY e n/a 2 128 184 215 N
+ AA N IY i n/a 2 126 184 215 N
+ AA N IY s n/a 2 128 184 215 N
+ AA N JH b n/a 2 128 184 214 N
+ AA N JH e n/a 2 128 184 214 N
+ AA N JH i n/a 2 126 184 214 N
+ AA N JH s n/a 2 128 184 214 N
+ AA N K b n/a 2 128 196 208 N
+ AA N K e n/a 2 128 196 208 N
+ AA N K i n/a 2 127 196 208 N
+ AA N K s n/a 2 128 196 208 N
+ AA N L b n/a 2 128 184 230 N
+ AA N L e n/a 2 128 184 230 N
+ AA N L i n/a 2 126 184 230 N
+ AA N L s n/a 2 128 184 230 N
+ AA N M b n/a 2 128 184 224 N
+ AA N M e n/a 2 128 184 224 N
+ AA N M i n/a 2 126 184 224 N
+ AA N M s n/a 2 128 184 224 N
+ AA N N b n/a 2 128 188 222 N
+ AA N N e n/a 2 128 188 220 N
+ AA N N i n/a 2 126 187 220 N
+ AA N N s n/a 2 128 188 220 N
+ AA N NG b n/a 2 128 184 222 N
+ AA N NG e n/a 2 128 184 220 N
+ AA N NG s n/a 2 128 184 220 N
+ AA N OW e n/a 2 128 184 215 N
+ AA N OW i n/a 2 126 184 215 N
+ AA N OW s n/a 2 128 184 215 N
+ AA N OY e n/a 2 128 184 215 N
+ AA N OY s n/a 2 128 184 215 N
+ AA N P b n/a 2 128 196 210 N
+ AA N P e n/a 2 128 196 210 N
+ AA N P i n/a 2 127 196 210 N
+ AA N P s n/a 2 128 196 210 N
+ AA N R b n/a 2 128 197 227 N
+ AA N R e n/a 2 128 197 227 N
+ AA N R i n/a 2 126 197 227 N
+ AA N R s n/a 2 128 197 227 N
+ AA N S b n/a 2 128 184 206 N
+ AA N S e n/a 2 128 184 206 N
+ AA N S i n/a 2 126 184 206 N
+ AA N S s n/a 2 128 184 206 N
+ AA N SH b n/a 2 128 184 209 N
+ AA N SH e n/a 2 128 184 209 N
+ AA N SH i n/a 2 126 184 209 N
+ AA N SH s n/a 2 128 184 209 N
+ AA N SIL e n/a 2 128 184 207 N
+ AA N SIL s n/a 2 128 184 207 N
+ AA N T b n/a 2 128 195 212 N
+ AA N T e n/a 2 128 195 212 N
+ AA N T i n/a 2 127 195 212 N
+ AA N T s n/a 2 128 195 212 N
+ AA N TH b n/a 2 128 184 206 N
+ AA N TH e n/a 2 128 184 206 N
+ AA N TH i n/a 2 126 184 206 N
+ AA N TH s n/a 2 128 184 206 N
+ AA N UH e n/a 2 128 184 215 N
+ AA N UH s n/a 2 128 184 215 N
+ AA N UW b n/a 2 128 184 215 N
+ AA N UW e n/a 2 128 184 215 N
+ AA N UW i n/a 2 126 184 215 N
+ AA N UW s n/a 2 128 184 215 N
+ AA N V b n/a 2 128 184 211 N
+ AA N V e n/a 2 128 184 211 N
+ AA N V i n/a 2 126 184 211 N
+ AA N V s n/a 2 128 184 211 N
+ AA N W b n/a 2 128 184 211 N
+ AA N W e n/a 2 128 184 211 N
+ AA N W i n/a 2 126 184 211 N
+ AA N W s n/a 2 128 184 211 N
+ AA N Y b n/a 2 128 184 215 N
+ AA N Y e n/a 2 128 184 215 N
+ AA N Y i n/a 2 126 184 215 N
+ AA N Y s n/a 2 128 184 215 N
+ AA N Z b n/a 2 128 184 219 N
+ AA N Z e n/a 2 128 184 219 N
+ AA N Z i n/a 2 126 184 219 N
+ AA N Z s n/a 2 128 184 219 N
+ AA N ZH b n/a 2 128 184 219 N
+ AA N ZH e n/a 2 128 184 219 N
+ AA N ZH i n/a 2 126 184 219 N
+ AA N ZH s n/a 2 128 184 219 N
+ AA NG AA s n/a 2 128 184 216 N
+ AA NG AE s n/a 2 128 184 216 N
+ AA NG AH b n/a 2 128 184 216 N
+ AA NG AH s n/a 2 128 184 216 N
+ AA NG AO s n/a 2 128 184 216 N
+ AA NG AW s n/a 2 128 184 216 N
+ AA NG AY s n/a 2 128 184 216 N
+ AA NG B b n/a 2 128 184 211 N
+ AA NG B s n/a 2 128 184 211 N
+ AA NG CH b n/a 2 128 184 209 N
+ AA NG CH s n/a 2 128 184 209 N
+ AA NG D b n/a 2 128 188 216 N
+ AA NG D s n/a 2 128 188 216 N
+ AA NG DH s n/a 2 128 184 218 N
+ AA NG EH s n/a 2 128 184 216 N
+ AA NG ER b n/a 2 128 197 216 N
+ AA NG ER s n/a 2 128 197 216 N
+ AA NG EY s n/a 2 128 184 216 N
+ AA NG F b n/a 2 128 184 210 N
+ AA NG F s n/a 2 128 184 210 N
+ AA NG G b n/a 2 128 184 217 N
+ AA NG G s n/a 2 128 184 217 N
+ AA NG HH b n/a 2 128 184 207 N
+ AA NG HH s n/a 2 128 184 207 N
+ AA NG IH s n/a 2 128 184 216 N
+ AA NG IY b n/a 2 128 184 216 N
+ AA NG IY s n/a 2 128 184 216 N
+ AA NG JH b n/a 2 128 184 214 N
+ AA NG JH s n/a 2 128 184 214 N
+ AA NG K b n/a 2 128 196 208 N
+ AA NG K s n/a 2 128 196 208 N
+ AA NG L b n/a 2 128 185 230 N
+ AA NG L s n/a 2 128 185 230 N
+ AA NG M b n/a 2 128 184 224 N
+ AA NG M s n/a 2 128 184 224 N
+ AA NG N b n/a 2 128 188 222 N
+ AA NG N i n/a 2 126 187 221 N
+ AA NG N s n/a 2 128 188 221 N
+ AA NG NG b n/a 2 128 184 222 N
+ AA NG NG s n/a 2 128 184 221 N
+ AA NG OW s n/a 2 128 184 216 N
+ AA NG OY s n/a 2 128 184 216 N
+ AA NG P b n/a 2 128 196 210 N
+ AA NG P s n/a 2 128 196 210 N
+ AA NG R b n/a 2 128 197 227 N
+ AA NG R i n/a 2 126 200 225 N
+ AA NG R s n/a 2 128 197 227 N
+ AA NG S b n/a 2 128 184 206 N
+ AA NG S s n/a 2 128 184 206 N
+ AA NG SH b n/a 2 128 184 209 N
+ AA NG SH s n/a 2 128 184 209 N
+ AA NG SIL s n/a 2 128 184 207 N
+ AA NG T b n/a 2 128 196 212 N
+ AA NG T s n/a 2 128 196 212 N
+ AA NG TH b n/a 2 128 184 206 N
+ AA NG TH s n/a 2 128 184 206 N
+ AA NG UH s n/a 2 128 184 216 N
+ AA NG UW b n/a 2 128 184 216 N
+ AA NG UW s n/a 2 128 184 216 N
+ AA NG V b n/a 2 128 184 211 N
+ AA NG V s n/a 2 128 184 211 N
+ AA NG W b n/a 2 128 185 211 N
+ AA NG W s n/a 2 128 185 211 N
+ AA NG Y b n/a 2 128 184 216 N
+ AA NG Y s n/a 2 128 184 216 N
+ AA NG Z b n/a 2 128 184 219 N
+ AA NG Z s n/a 2 128 184 219 N
+ AA NG ZH b n/a 2 128 184 219 N
+ AA NG ZH s n/a 2 128 184 219 N
+ AA OW AA s n/a 2 162 182 215 N
+ AA OW AE s n/a 2 162 169 215 N
+ AA OW AH b n/a 2 162 167 215 N
+ AA OW AH s n/a 2 162 169 215 N
+ AA OW AO s n/a 2 162 182 215 N
+ AA OW AW s n/a 2 162 182 215 N
+ AA OW AY s n/a 2 162 169 215 N
+ AA OW B b n/a 2 162 167 211 N
+ AA OW B s n/a 2 162 169 211 N
+ AA OW CH b n/a 2 162 167 209 N
+ AA OW CH i n/a 2 162 168 209 N
+ AA OW CH s n/a 2 162 169 209 N
+ AA OW D b n/a 2 162 168 213 N
+ AA OW D i n/a 2 162 168 213 N
+ AA OW D s n/a 2 162 169 213 N
+ AA OW DH s n/a 2 162 169 218 N
+ AA OW EH s n/a 2 162 169 215 N
+ AA OW ER b n/a 2 162 201 215 N
+ AA OW ER s n/a 2 164 201 215 N
+ AA OW EY s n/a 2 162 169 215 N
+ AA OW F b n/a 2 162 167 210 N
+ AA OW F s n/a 2 162 169 210 N
+ AA OW G b n/a 2 162 167 217 N
+ AA OW G i n/a 2 162 168 217 N
+ AA OW G s n/a 2 162 169 217 N
+ AA OW HH b n/a 2 162 167 207 N
+ AA OW HH i n/a 2 162 168 207 N
+ AA OW HH s n/a 2 162 169 207 N
+ AA OW IH i n/a 2 162 168 215 N
+ AA OW IH s n/a 2 162 169 215 N
+ AA OW IY b n/a 2 162 167 215 N
+ AA OW IY i n/a 2 162 168 215 N
+ AA OW IY s n/a 2 162 169 215 N
+ AA OW JH b n/a 2 162 167 214 N
+ AA OW JH s n/a 2 162 169 214 N
+ AA OW K b n/a 2 162 171 208 N
+ AA OW K i n/a 2 162 171 208 N
+ AA OW K s n/a 2 162 171 208 N
+ AA OW L b n/a 2 162 182 230 N
+ AA OW L i n/a 2 162 182 230 N
+ AA OW L s n/a 2 162 182 230 N
+ AA OW M b n/a 2 162 184 224 N
+ AA OW M i n/a 2 162 184 224 N
+ AA OW M s n/a 2 162 184 224 N
+ AA OW N b n/a 2 162 194 223 N
+ AA OW N s n/a 2 162 194 223 N
+ AA OW NG b n/a 2 162 184 223 N
+ AA OW NG s n/a 2 162 184 223 N
+ AA OW OW s n/a 2 162 182 215 N
+ AA OW OY s n/a 2 162 169 215 N
+ AA OW P b n/a 2 162 172 210 N
+ AA OW P i n/a 2 162 172 210 N
+ AA OW P s n/a 2 162 172 210 N
+ AA OW R b n/a 2 162 201 227 N
+ AA OW R i n/a 2 164 199 225 N
+ AA OW R s n/a 2 164 201 227 N
+ AA OW S b n/a 2 162 167 206 N
+ AA OW S s n/a 2 162 169 206 N
+ AA OW SH b n/a 2 162 167 209 N
+ AA OW SH s n/a 2 162 169 209 N
+ AA OW SIL s n/a 2 162 169 207 N
+ AA OW T b n/a 2 162 171 215 N
+ AA OW T i n/a 2 162 171 215 N
+ AA OW T s n/a 2 162 171 215 N
+ AA OW TH b n/a 2 162 167 206 N
+ AA OW TH i n/a 2 162 168 206 N
+ AA OW TH s n/a 2 162 169 206 N
+ AA OW UH s n/a 2 162 182 215 N
+ AA OW UW b n/a 2 162 182 215 N
+ AA OW UW s n/a 2 162 182 215 N
+ AA OW V b n/a 2 162 167 211 N
+ AA OW V s n/a 2 162 169 211 N
+ AA OW W b n/a 2 162 182 211 N
+ AA OW W i n/a 2 162 182 211 N
+ AA OW W s n/a 2 162 182 211 N
+ AA OW Y b n/a 2 162 167 213 N
+ AA OW Y s n/a 2 162 169 213 N
+ AA OW Z b n/a 2 162 167 219 N
+ AA OW Z i n/a 2 162 168 219 N
+ AA OW Z s n/a 2 162 169 219 N
+ AA OW ZH b n/a 2 162 167 219 N
+ AA OW ZH s n/a 2 162 169 219 N
+ AA OY AA s n/a 2 141 183 215 N
+ AA OY AE s n/a 2 141 169 215 N
+ AA OY AH b n/a 2 141 167 215 N
+ AA OY AH s n/a 2 141 169 215 N
+ AA OY AO s n/a 2 141 183 215 N
+ AA OY AW s n/a 2 141 183 215 N
+ AA OY AY s n/a 2 141 169 215 N
+ AA OY B b n/a 2 141 167 211 N
+ AA OY B s n/a 2 141 169 211 N
+ AA OY CH b n/a 2 141 167 209 N
+ AA OY CH s n/a 2 141 169 209 N
+ AA OY D b n/a 2 141 168 213 N
+ AA OY D s n/a 2 141 169 213 N
+ AA OY DH s n/a 2 141 169 218 N
+ AA OY EH s n/a 2 141 169 215 N
+ AA OY ER b n/a 2 141 197 215 N
+ AA OY ER s n/a 2 141 197 215 N
+ AA OY EY s n/a 2 141 169 215 N
+ AA OY F b n/a 2 141 167 210 N
+ AA OY F s n/a 2 141 169 210 N
+ AA OY G b n/a 2 141 167 217 N
+ AA OY G s n/a 2 141 169 217 N
+ AA OY HH b n/a 2 141 167 207 N
+ AA OY HH s n/a 2 141 169 207 N
+ AA OY IH s n/a 2 141 169 215 N
+ AA OY IY b n/a 2 141 167 215 N
+ AA OY IY s n/a 2 141 169 215 N
+ AA OY JH b n/a 2 141 167 214 N
+ AA OY JH s n/a 2 141 169 214 N
+ AA OY K b n/a 2 141 171 208 N
+ AA OY K i n/a 2 142 171 208 N
+ AA OY K s n/a 2 141 171 208 N
+ AA OY L b n/a 2 141 183 230 N
+ AA OY L i n/a 2 142 183 230 N
+ AA OY L s n/a 2 141 183 230 N
+ AA OY M b n/a 2 141 184 224 N
+ AA OY M s n/a 2 141 184 224 N
+ AA OY N b n/a 2 141 188 222 N
+ AA OY N i n/a 2 142 187 220 N
+ AA OY N s n/a 2 141 188 220 N
+ AA OY NG b n/a 2 141 184 222 N
+ AA OY NG s n/a 2 141 184 220 N
+ AA OY OW s n/a 2 141 183 215 N
+ AA OY OY s n/a 2 141 169 215 N
+ AA OY P b n/a 2 141 172 210 N
+ AA OY P s n/a 2 141 172 210 N
+ AA OY R b n/a 2 141 197 227 N
+ AA OY R i n/a 2 142 200 225 N
+ AA OY R s n/a 2 141 197 227 N
+ AA OY S b n/a 2 141 167 206 N
+ AA OY S s n/a 2 141 169 206 N
+ AA OY SH b n/a 2 141 167 209 N
+ AA OY SH s n/a 2 141 169 209 N
+ AA OY SIL s n/a 2 141 169 207 N
+ AA OY T b n/a 2 141 171 215 N
+ AA OY T s n/a 2 141 171 215 N
+ AA OY TH b n/a 2 141 167 206 N
+ AA OY TH s n/a 2 141 169 206 N
+ AA OY UH s n/a 2 141 183 215 N
+ AA OY UW b n/a 2 141 183 215 N
+ AA OY UW s n/a 2 141 183 215 N
+ AA OY V b n/a 2 141 167 211 N
+ AA OY V s n/a 2 141 169 211 N
+ AA OY W b n/a 2 141 183 211 N
+ AA OY W s n/a 2 141 183 211 N
+ AA OY Y b n/a 2 141 167 213 N
+ AA OY Y s n/a 2 141 169 213 N
+ AA OY Z b n/a 2 141 167 219 N
+ AA OY Z s n/a 2 141 169 219 N
+ AA OY ZH b n/a 2 141 167 219 N
+ AA OY ZH s n/a 2 141 169 219 N
+ AA P AA e n/a 2 144 182 215 N
+ AA P AA s n/a 2 144 182 215 N
+ AA P AE e n/a 2 144 175 215 N
+ AA P AE s n/a 2 144 175 215 N
+ AA P AH b n/a 2 144 175 215 N
+ AA P AH e n/a 2 144 175 215 N
+ AA P AH s n/a 2 144 175 215 N
+ AA P AO e n/a 2 144 182 215 N
+ AA P AO s n/a 2 144 182 215 N
+ AA P AW e n/a 2 144 182 215 N
+ AA P AW s n/a 2 144 182 215 N
+ AA P AY e n/a 2 144 175 215 N
+ AA P AY s n/a 2 144 175 215 N
+ AA P B b n/a 2 143 175 211 N
+ AA P B e n/a 2 144 175 211 N
+ AA P B i n/a 2 153 175 211 N
+ AA P B s n/a 2 144 175 211 N
+ AA P CH b n/a 2 143 175 209 N
+ AA P CH e n/a 2 144 175 209 N
+ AA P CH i n/a 2 153 175 209 N
+ AA P CH s n/a 2 144 175 209 N
+ AA P D b n/a 2 143 176 214 N
+ AA P D e n/a 2 144 176 214 N
+ AA P D i n/a 2 149 176 214 N
+ AA P D s n/a 2 144 176 214 N
+ AA P DH e n/a 2 144 175 218 N
+ AA P DH s n/a 2 144 175 218 N
+ AA P EH e n/a 2 144 175 215 N
+ AA P EH s n/a 2 144 175 215 N
+ AA P ER b n/a 2 143 205 215 N
+ AA P ER e n/a 2 143 205 215 N
+ AA P ER s n/a 2 143 205 215 N
+ AA P EY e n/a 2 144 175 215 N
+ AA P EY s n/a 2 144 175 215 N
+ AA P F b n/a 2 144 175 210 N
+ AA P F e n/a 2 144 175 210 N
+ AA P F i n/a 2 153 175 210 N
+ AA P F s n/a 2 144 175 210 N
+ AA P G b n/a 2 143 175 217 N
+ AA P G e n/a 2 144 175 217 N
+ AA P G i n/a 2 153 175 217 N
+ AA P G s n/a 2 144 175 217 N
+ AA P HH b n/a 2 144 175 207 N
+ AA P HH e n/a 2 144 175 207 N
+ AA P HH i n/a 2 153 175 207 N
+ AA P HH s n/a 2 144 175 207 N
+ AA P IH e n/a 2 144 175 215 N
+ AA P IH s n/a 2 144 175 215 N
+ AA P IY b n/a 2 144 175 215 N
+ AA P IY e n/a 2 144 175 215 N
+ AA P IY i n/a 2 153 175 215 N
+ AA P IY s n/a 2 144 175 215 N
+ AA P JH b n/a 2 143 175 214 N
+ AA P JH e n/a 2 144 175 214 N
+ AA P JH i n/a 2 153 175 214 N
+ AA P JH s n/a 2 144 175 214 N
+ AA P K b n/a 2 143 175 208 N
+ AA P K e n/a 2 144 175 208 N
+ AA P K i n/a 2 153 175 208 N
+ AA P K s n/a 2 144 175 208 N
+ AA P L b n/a 2 144 182 231 N
+ AA P L e n/a 2 144 182 231 N
+ AA P L i n/a 2 153 182 231 N
+ AA P L s n/a 2 144 182 231 N
+ AA P M b n/a 2 144 186 224 N
+ AA P M e n/a 2 144 186 224 N
+ AA P M i n/a 2 154 186 224 N
+ AA P M s n/a 2 144 186 224 N
+ AA P N b n/a 2 144 190 222 N
+ AA P N e n/a 2 144 190 220 N
+ AA P N i n/a 2 154 190 220 N
+ AA P N s n/a 2 144 190 220 N
+ AA P NG b n/a 2 144 186 222 N
+ AA P NG e n/a 2 144 186 220 N
+ AA P NG i n/a 2 154 186 220 N
+ AA P NG s n/a 2 144 186 220 N
+ AA P OW e n/a 2 144 182 215 N
+ AA P OW i n/a 2 153 182 215 N
+ AA P OW s n/a 2 144 182 215 N
+ AA P OY e n/a 2 144 175 215 N
+ AA P OY s n/a 2 144 175 215 N
+ AA P P b n/a 2 143 175 210 N
+ AA P P e n/a 2 144 175 210 N
+ AA P P i n/a 2 153 175 210 N
+ AA P P s n/a 2 144 175 210 N
+ AA P R b n/a 2 143 205 227 N
+ AA P R e n/a 2 143 205 227 N
+ AA P R i n/a 2 148 205 225 N
+ AA P R s n/a 2 143 205 227 N
+ AA P S b n/a 2 144 175 206 N
+ AA P S e n/a 2 144 175 206 N
+ AA P S i n/a 2 153 175 206 N
+ AA P S s n/a 2 144 175 206 N
+ AA P SH b n/a 2 144 175 209 N
+ AA P SH e n/a 2 144 175 209 N
+ AA P SH i n/a 2 153 175 209 N
+ AA P SH s n/a 2 144 175 209 N
+ AA P SIL e n/a 2 144 175 207 N
+ AA P SIL s n/a 2 144 175 207 N
+ AA P T b n/a 2 143 177 215 N
+ AA P T e n/a 2 144 177 215 N
+ AA P T i n/a 2 149 177 215 N
+ AA P T s n/a 2 144 177 215 N
+ AA P TH b n/a 2 144 175 206 N
+ AA P TH e n/a 2 144 175 206 N
+ AA P TH i n/a 2 153 175 206 N
+ AA P TH s n/a 2 144 175 206 N
+ AA P UH e n/a 2 144 182 215 N
+ AA P UH s n/a 2 144 182 215 N
+ AA P UW b n/a 2 144 182 215 N
+ AA P UW e n/a 2 144 182 215 N
+ AA P UW s n/a 2 144 182 215 N
+ AA P V b n/a 2 144 175 211 N
+ AA P V e n/a 2 144 175 211 N
+ AA P V i n/a 2 153 175 211 N
+ AA P V s n/a 2 144 175 211 N
+ AA P W b n/a 2 144 182 211 N
+ AA P W e n/a 2 144 182 211 N
+ AA P W s n/a 2 144 182 211 N
+ AA P Y b n/a 2 144 175 214 N
+ AA P Y e n/a 2 144 175 214 N
+ AA P Y s n/a 2 144 175 214 N
+ AA P Z b n/a 2 144 175 218 N
+ AA P Z e n/a 2 144 175 218 N
+ AA P Z i n/a 2 153 175 218 N
+ AA P Z s n/a 2 144 175 218 N
+ AA P ZH b n/a 2 144 175 218 N
+ AA P ZH e n/a 2 144 175 218 N
+ AA P ZH i n/a 2 153 175 218 N
+ AA P ZH s n/a 2 144 175 218 N
+ AA R AA e n/a 2 165 182 215 N
+ AA R AA s n/a 2 165 182 215 N
+ AA R AE e n/a 2 165 173 215 N
+ AA R AE s n/a 2 165 173 215 N
+ AA R AH b n/a 2 166 173 215 N
+ AA R AH e n/a 2 165 173 215 N
+ AA R AH i n/a 2 165 173 215 N
+ AA R AH s n/a 2 165 173 215 N
+ AA R AO e n/a 2 165 182 215 N
+ AA R AO s n/a 2 165 182 215 N
+ AA R AW e n/a 2 165 182 215 N
+ AA R AW s n/a 2 165 182 215 N
+ AA R AY e n/a 2 165 173 215 N
+ AA R AY s n/a 2 165 173 215 N
+ AA R B b n/a 2 166 174 211 N
+ AA R B e n/a 2 165 174 211 N
+ AA R B i n/a 2 165 174 211 N
+ AA R B s n/a 2 165 174 211 N
+ AA R CH b n/a 2 166 173 209 N
+ AA R CH e n/a 2 165 173 209 N
+ AA R CH i n/a 2 165 173 209 N
+ AA R CH s n/a 2 165 173 209 N
+ AA R D b n/a 2 166 173 213 N
+ AA R D e n/a 2 165 173 213 N
+ AA R D i n/a 2 165 173 213 N
+ AA R D s n/a 2 165 173 213 N
+ AA R DH e n/a 2 165 173 218 N
+ AA R DH i n/a 2 165 173 218 N
+ AA R DH s n/a 2 165 173 218 N
+ AA R EH e n/a 2 165 173 215 N
+ AA R EH i n/a 2 165 173 215 N
+ AA R EH s n/a 2 165 173 215 N
+ AA R ER b n/a 2 166 202 215 N
+ AA R ER e n/a 2 165 201 215 N
+ AA R ER i n/a 2 165 199 215 N
+ AA R ER s n/a 2 165 202 215 N
+ AA R EY e n/a 2 165 173 215 N
+ AA R EY i n/a 2 165 173 215 N
+ AA R EY s n/a 2 165 173 215 N
+ AA R F b n/a 2 166 174 210 N
+ AA R F e n/a 2 165 174 210 N
+ AA R F i n/a 2 165 174 210 N
+ AA R F s n/a 2 165 174 210 N
+ AA R G b n/a 2 166 173 217 N
+ AA R G e n/a 2 165 173 217 N
+ AA R G i n/a 2 165 173 217 N
+ AA R G s n/a 2 165 173 217 N
+ AA R HH b n/a 2 166 173 207 N
+ AA R HH e n/a 2 165 173 207 N
+ AA R HH i n/a 2 165 173 207 N
+ AA R HH s n/a 2 165 173 207 N
+ AA R IH e n/a 2 165 173 215 N
+ AA R IH i n/a 2 165 173 215 N
+ AA R IH s n/a 2 165 173 215 N
+ AA R IY b n/a 2 166 173 215 N
+ AA R IY e n/a 2 165 173 215 N
+ AA R IY i n/a 2 165 173 215 N
+ AA R IY s n/a 2 165 173 215 N
+ AA R JH b n/a 2 166 173 214 N
+ AA R JH e n/a 2 165 173 214 N
+ AA R JH i n/a 2 165 173 214 N
+ AA R JH s n/a 2 165 173 214 N
+ AA R K b n/a 2 166 173 208 N
+ AA R K e n/a 2 165 173 208 N
+ AA R K i n/a 2 165 173 208 N
+ AA R K s n/a 2 165 173 208 N
+ AA R L b n/a 2 166 182 230 N
+ AA R L e n/a 2 165 182 230 N
+ AA R L i n/a 2 165 182 230 N
+ AA R L s n/a 2 165 182 230 N
+ AA R M b n/a 2 166 185 224 N
+ AA R M e n/a 2 165 185 224 N
+ AA R M i n/a 2 165 185 224 N
+ AA R M s n/a 2 165 185 224 N
+ AA R N b n/a 2 166 192 222 N
+ AA R N e n/a 2 165 192 220 N
+ AA R N i n/a 2 165 192 220 N
+ AA R N s n/a 2 165 192 220 N
+ AA R NG b n/a 2 166 185 222 N
+ AA R NG e n/a 2 165 185 220 N
+ AA R NG i n/a 2 165 185 220 N
+ AA R NG s n/a 2 165 185 220 N
+ AA R OW e n/a 2 165 182 215 N
+ AA R OW i n/a 2 165 182 215 N
+ AA R OW s n/a 2 165 182 215 N
+ AA R OY e n/a 2 165 173 215 N
+ AA R OY s n/a 2 165 173 215 N
+ AA R P b n/a 2 166 174 210 N
+ AA R P e n/a 2 165 174 210 N
+ AA R P i n/a 2 165 174 210 N
+ AA R P s n/a 2 165 174 210 N
+ AA R R b n/a 2 166 202 227 N
+ AA R R e n/a 2 165 201 227 N
+ AA R R i n/a 2 165 199 227 N
+ AA R R s n/a 2 165 202 227 N
+ AA R S b n/a 2 166 173 206 N
+ AA R S e n/a 2 165 173 206 N
+ AA R S i n/a 2 165 173 206 N
+ AA R S s n/a 2 165 173 206 N
+ AA R SH b n/a 2 166 173 209 N
+ AA R SH e n/a 2 165 173 209 N
+ AA R SH i n/a 2 165 173 209 N
+ AA R SH s n/a 2 165 173 209 N
+ AA R SIL e n/a 2 165 173 207 N
+ AA R SIL s n/a 2 165 173 207 N
+ AA R T b n/a 2 166 173 215 N
+ AA R T e n/a 2 165 173 215 N
+ AA R T i n/a 2 165 173 215 N
+ AA R T s n/a 2 165 173 215 N
+ AA R TH b n/a 2 166 173 206 N
+ AA R TH e n/a 2 165 173 206 N
+ AA R TH i n/a 2 165 173 206 N
+ AA R TH s n/a 2 165 173 206 N
+ AA R UH e n/a 2 165 182 215 N
+ AA R UH s n/a 2 165 182 215 N
+ AA R UW b n/a 2 166 182 215 N
+ AA R UW e n/a 2 165 182 215 N
+ AA R UW i n/a 2 165 182 215 N
+ AA R UW s n/a 2 165 182 215 N
+ AA R V b n/a 2 166 174 211 N
+ AA R V e n/a 2 165 174 211 N
+ AA R V i n/a 2 165 174 211 N
+ AA R V s n/a 2 165 174 211 N
+ AA R W b n/a 2 166 182 211 N
+ AA R W e n/a 2 165 182 211 N
+ AA R W i n/a 2 165 182 211 N
+ AA R W s n/a 2 165 182 211 N
+ AA R Y b n/a 2 166 173 213 N
+ AA R Y e n/a 2 165 173 213 N
+ AA R Y i n/a 2 165 173 213 N
+ AA R Y s n/a 2 165 173 213 N
+ AA R Z b n/a 2 166 173 219 N
+ AA R Z e n/a 2 165 173 219 N
+ AA R Z i n/a 2 165 173 219 N
+ AA R Z s n/a 2 165 173 219 N
+ AA R ZH b n/a 2 166 173 219 N
+ AA R ZH e n/a 2 165 173 219 N
+ AA R ZH i n/a 2 165 173 219 N
+ AA R ZH s n/a 2 165 173 219 N
+ AA S AA e n/a 2 130 182 215 N
+ AA S AA i n/a 2 134 182 215 N
+ AA S AA s n/a 2 130 182 215 N
+ AA S AE e n/a 2 130 167 215 N
+ AA S AE s n/a 2 130 169 215 N
+ AA S AH b n/a 2 130 167 215 N
+ AA S AH e n/a 2 130 167 215 N
+ AA S AH i n/a 2 134 167 215 N
+ AA S AH s n/a 2 130 169 215 N
+ AA S AO e n/a 2 130 182 215 N
+ AA S AO s n/a 2 130 182 215 N
+ AA S AW e n/a 2 130 182 215 N
+ AA S AW s n/a 2 130 182 215 N
+ AA S AY e n/a 2 130 167 215 N
+ AA S AY s n/a 2 130 169 215 N
+ AA S B b n/a 2 130 167 211 N
+ AA S B e n/a 2 130 167 211 N
+ AA S B i n/a 2 134 167 211 N
+ AA S B s n/a 2 130 169 211 N
+ AA S CH b n/a 2 130 167 209 N
+ AA S CH e n/a 2 130 167 209 N
+ AA S CH i n/a 2 134 167 209 N
+ AA S CH s n/a 2 130 169 209 N
+ AA S D b n/a 2 130 167 213 N
+ AA S D e n/a 2 130 167 213 N
+ AA S D i n/a 2 134 167 213 N
+ AA S D s n/a 2 130 169 213 N
+ AA S DH e n/a 2 130 167 218 N
+ AA S DH s n/a 2 130 169 218 N
+ AA S EH e n/a 2 130 167 215 N
+ AA S EH s n/a 2 130 169 215 N
+ AA S ER b n/a 2 130 197 215 N
+ AA S ER e n/a 2 130 197 215 N
+ AA S ER s n/a 2 130 197 215 N
+ AA S EY e n/a 2 130 167 215 N
+ AA S EY s n/a 2 130 169 215 N
+ AA S F b n/a 2 130 167 210 N
+ AA S F e n/a 2 130 167 210 N
+ AA S F i n/a 2 134 167 210 N
+ AA S F s n/a 2 130 169 210 N
+ AA S G b n/a 2 130 167 217 N
+ AA S G e n/a 2 130 167 217 N
+ AA S G i n/a 2 134 167 217 N
+ AA S G s n/a 2 130 169 217 N
+ AA S HH b n/a 2 130 167 207 N
+ AA S HH e n/a 2 130 167 207 N
+ AA S HH i n/a 2 134 167 207 N
+ AA S HH s n/a 2 130 169 207 N
+ AA S IH e n/a 2 130 167 215 N
+ AA S IH i n/a 2 134 167 215 N
+ AA S IH s n/a 2 130 169 215 N
+ AA S IY b n/a 2 130 167 215 N
+ AA S IY e n/a 2 130 167 215 N
+ AA S IY i n/a 2 134 167 215 N
+ AA S IY s n/a 2 130 169 215 N
+ AA S JH b n/a 2 130 167 214 N
+ AA S JH e n/a 2 130 167 214 N
+ AA S JH s n/a 2 130 169 214 N
+ AA S K b n/a 2 130 171 208 N
+ AA S K e n/a 2 130 171 208 N
+ AA S K i n/a 2 134 171 208 N
+ AA S K s n/a 2 130 171 208 N
+ AA S L b n/a 2 130 182 231 N
+ AA S L e n/a 2 130 182 231 N
+ AA S L i n/a 2 134 182 231 N
+ AA S L s n/a 2 130 182 231 N
+ AA S M b n/a 2 131 185 224 N
+ AA S M e n/a 2 131 185 224 N
+ AA S M i n/a 2 134 185 224 N
+ AA S M s n/a 2 131 185 224 N
+ AA S N b n/a 2 131 188 222 N
+ AA S N e n/a 2 131 188 220 N
+ AA S N i n/a 2 134 188 220 N
+ AA S N s n/a 2 131 188 220 N
+ AA S NG b n/a 2 131 185 222 N
+ AA S NG e n/a 2 131 185 220 N
+ AA S NG i n/a 2 134 185 220 N
+ AA S NG s n/a 2 131 185 220 N
+ AA S OW e n/a 2 130 182 215 N
+ AA S OW i n/a 2 134 182 215 N
+ AA S OW s n/a 2 130 182 215 N
+ AA S OY e n/a 2 130 167 215 N
+ AA S OY s n/a 2 130 169 215 N
+ AA S P b n/a 2 130 172 210 N
+ AA S P e n/a 2 130 172 210 N
+ AA S P i n/a 2 134 172 210 N
+ AA S P s n/a 2 130 172 210 N
+ AA S R b n/a 2 130 197 227 N
+ AA S R e n/a 2 130 197 227 N
+ AA S R i n/a 2 135 197 227 N
+ AA S R s n/a 2 130 197 227 N
+ AA S S b n/a 2 130 167 206 N
+ AA S S e n/a 2 130 167 206 N
+ AA S S i n/a 2 134 167 206 N
+ AA S S s n/a 2 130 169 206 N
+ AA S SH b n/a 2 130 167 209 N
+ AA S SH e n/a 2 130 167 209 N
+ AA S SH i n/a 2 134 167 209 N
+ AA S SH s n/a 2 130 169 209 N
+ AA S SIL e n/a 2 130 167 207 N
+ AA S SIL s n/a 2 130 169 207 N
+ AA S T b n/a 2 130 171 215 N
+ AA S T e n/a 2 130 171 215 N
+ AA S T i n/a 2 134 171 215 N
+ AA S T s n/a 2 130 171 215 N
+ AA S TH b n/a 2 130 167 206 N
+ AA S TH e n/a 2 130 167 206 N
+ AA S TH i n/a 2 134 167 206 N
+ AA S TH s n/a 2 130 169 206 N
+ AA S UH e n/a 2 130 182 215 N
+ AA S UH s n/a 2 130 182 215 N
+ AA S UW b n/a 2 130 182 215 N
+ AA S UW e n/a 2 130 182 215 N
+ AA S UW s n/a 2 130 182 215 N
+ AA S V b n/a 2 130 167 211 N
+ AA S V e n/a 2 130 167 211 N
+ AA S V i n/a 2 134 167 211 N
+ AA S V s n/a 2 130 169 211 N
+ AA S W b n/a 2 130 182 211 N
+ AA S W e n/a 2 130 182 211 N
+ AA S W i n/a 2 134 182 211 N
+ AA S W s n/a 2 130 182 211 N
+ AA S Y b n/a 2 130 167 213 N
+ AA S Y e n/a 2 130 167 213 N
+ AA S Y i n/a 2 134 167 213 N
+ AA S Y s n/a 2 130 169 213 N
+ AA S Z b n/a 2 130 167 219 N
+ AA S Z e n/a 2 130 167 219 N
+ AA S Z i n/a 2 134 167 219 N
+ AA S Z s n/a 2 130 169 219 N
+ AA S ZH b n/a 2 130 167 219 N
+ AA S ZH e n/a 2 130 167 219 N
+ AA S ZH i n/a 2 134 167 219 N
+ AA S ZH s n/a 2 130 169 219 N
+ AA SH AA e n/a 2 146 182 215 N
+ AA SH AA s n/a 2 146 182 215 N
+ AA SH AE e n/a 2 146 167 215 N
+ AA SH AE s n/a 2 146 169 215 N
+ AA SH AH b n/a 2 146 167 215 N
+ AA SH AH e n/a 2 146 167 215 N
+ AA SH AH i n/a 2 146 167 215 N
+ AA SH AH s n/a 2 146 169 215 N
+ AA SH AO e n/a 2 146 182 215 N
+ AA SH AO s n/a 2 146 182 215 N
+ AA SH AW e n/a 2 146 182 215 N
+ AA SH AW s n/a 2 146 182 215 N
+ AA SH AY e n/a 2 146 167 215 N
+ AA SH AY s n/a 2 146 169 215 N
+ AA SH B b n/a 2 146 167 211 N
+ AA SH B e n/a 2 146 167 211 N
+ AA SH B i n/a 2 146 167 211 N
+ AA SH B s n/a 2 146 169 211 N
+ AA SH CH b n/a 2 146 167 209 N
+ AA SH CH e n/a 2 146 167 209 N
+ AA SH CH i n/a 2 146 167 209 N
+ AA SH CH s n/a 2 146 169 209 N
+ AA SH D b n/a 2 146 167 213 N
+ AA SH D e n/a 2 146 167 213 N
+ AA SH D i n/a 2 146 167 213 N
+ AA SH D s n/a 2 146 169 213 N
+ AA SH DH e n/a 2 146 167 218 N
+ AA SH DH s n/a 2 146 169 218 N
+ AA SH EH e n/a 2 146 167 215 N
+ AA SH EH s n/a 2 146 169 215 N
+ AA SH ER b n/a 2 146 197 215 N
+ AA SH ER e n/a 2 145 197 215 N
+ AA SH ER i n/a 2 145 199 215 N
+ AA SH ER s n/a 2 145 197 215 N
+ AA SH EY e n/a 2 146 167 215 N
+ AA SH EY s n/a 2 146 169 215 N
+ AA SH F b n/a 2 146 167 210 N
+ AA SH F e n/a 2 146 167 210 N
+ AA SH F i n/a 2 146 167 210 N
+ AA SH F s n/a 2 146 169 210 N
+ AA SH G b n/a 2 146 167 217 N
+ AA SH G e n/a 2 146 167 217 N
+ AA SH G i n/a 2 146 167 217 N
+ AA SH G s n/a 2 146 169 217 N
+ AA SH HH b n/a 2 146 167 207 N
+ AA SH HH e n/a 2 146 167 207 N
+ AA SH HH i n/a 2 146 167 207 N
+ AA SH HH s n/a 2 146 169 207 N
+ AA SH IH e n/a 2 146 167 215 N
+ AA SH IH s n/a 2 146 169 215 N
+ AA SH IY b n/a 2 146 167 215 N
+ AA SH IY e n/a 2 146 167 215 N
+ AA SH IY i n/a 2 146 167 215 N
+ AA SH IY s n/a 2 146 169 215 N
+ AA SH JH b n/a 2 146 167 214 N
+ AA SH JH e n/a 2 146 167 214 N
+ AA SH JH i n/a 2 146 167 214 N
+ AA SH JH s n/a 2 146 169 214 N
+ AA SH K b n/a 2 146 171 208 N
+ AA SH K e n/a 2 146 171 208 N
+ AA SH K i n/a 2 146 171 208 N
+ AA SH K s n/a 2 146 171 208 N
+ AA SH L b n/a 2 146 182 231 N
+ AA SH L e n/a 2 146 182 231 N
+ AA SH L i n/a 2 146 182 231 N
+ AA SH L s n/a 2 146 182 231 N
+ AA SH M b n/a 2 146 185 224 N
+ AA SH M e n/a 2 146 185 224 N
+ AA SH M i n/a 2 146 185 224 N
+ AA SH M s n/a 2 146 185 224 N
+ AA SH N b n/a 2 146 191 222 N
+ AA SH N e n/a 2 146 191 220 N
+ AA SH N i n/a 2 146 191 220 N
+ AA SH N s n/a 2 146 191 220 N
+ AA SH NG b n/a 2 146 185 222 N
+ AA SH NG e n/a 2 146 185 220 N
+ AA SH NG i n/a 2 146 185 220 N
+ AA SH NG s n/a 2 146 185 220 N
+ AA SH OW e n/a 2 146 182 215 N
+ AA SH OW s n/a 2 146 182 215 N
+ AA SH OY e n/a 2 146 167 215 N
+ AA SH OY s n/a 2 146 169 215 N
+ AA SH P b n/a 2 146 172 210 N
+ AA SH P e n/a 2 146 172 210 N
+ AA SH P i n/a 2 146 172 210 N
+ AA SH P s n/a 2 146 172 210 N
+ AA SH R b n/a 2 146 197 227 N
+ AA SH R e n/a 2 145 197 227 N
+ AA SH R i n/a 2 145 199 226 N
+ AA SH R s n/a 2 145 197 227 N
+ AA SH S b n/a 2 146 167 206 N
+ AA SH S e n/a 2 146 167 206 N
+ AA SH S i n/a 2 146 167 206 N
+ AA SH S s n/a 2 146 169 206 N
+ AA SH SH b n/a 2 146 167 209 N
+ AA SH SH e n/a 2 146 167 209 N
+ AA SH SH i n/a 2 146 167 209 N
+ AA SH SH s n/a 2 146 169 209 N
+ AA SH SIL e n/a 2 146 167 207 N
+ AA SH SIL s n/a 2 146 169 207 N
+ AA SH T b n/a 2 146 171 215 N
+ AA SH T e n/a 2 146 171 215 N
+ AA SH T i n/a 2 146 171 215 N
+ AA SH T s n/a 2 146 171 215 N
+ AA SH TH b n/a 2 146 167 206 N
+ AA SH TH e n/a 2 146 167 206 N
+ AA SH TH i n/a 2 146 167 206 N
+ AA SH TH s n/a 2 146 169 206 N
+ AA SH UH e n/a 2 146 182 215 N
+ AA SH UH s n/a 2 146 182 215 N
+ AA SH UW b n/a 2 146 182 215 N
+ AA SH UW e n/a 2 146 182 215 N
+ AA SH UW i n/a 2 146 182 215 N
+ AA SH UW s n/a 2 146 182 215 N
+ AA SH V b n/a 2 146 167 211 N
+ AA SH V e n/a 2 146 167 211 N
+ AA SH V i n/a 2 146 167 211 N
+ AA SH V s n/a 2 146 169 211 N
+ AA SH W b n/a 2 146 182 211 N
+ AA SH W e n/a 2 146 182 211 N
+ AA SH W i n/a 2 146 182 211 N
+ AA SH W s n/a 2 146 182 211 N
+ AA SH Y b n/a 2 146 167 213 N
+ AA SH Y e n/a 2 146 167 213 N
+ AA SH Y s n/a 2 146 169 213 N
+ AA SH Z b n/a 2 146 167 219 N
+ AA SH Z e n/a 2 146 167 219 N
+ AA SH Z i n/a 2 146 167 219 N
+ AA SH Z s n/a 2 146 169 219 N
+ AA SH ZH b n/a 2 146 167 219 N
+ AA SH ZH e n/a 2 146 167 219 N
+ AA SH ZH s n/a 2 146 169 219 N
+ AA SIL AA s n/a 2 144 182 215 N
+ AA SIL AE s n/a 2 144 169 215 N
+ AA SIL AH b n/a 2 144 167 215 N
+ AA SIL AH s n/a 2 144 169 215 N
+ AA SIL AO s n/a 2 144 182 215 N
+ AA SIL AW s n/a 2 144 182 215 N
+ AA SIL AY s n/a 2 144 169 215 N
+ AA SIL B b n/a 2 144 167 211 N
+ AA SIL B s n/a 2 144 169 211 N
+ AA SIL CH b n/a 2 144 167 209 N
+ AA SIL CH s n/a 2 144 169 209 N
+ AA SIL D b n/a 2 144 167 213 N
+ AA SIL D s n/a 2 144 169 213 N
+ AA SIL DH s n/a 2 144 169 218 N
+ AA SIL EH s n/a 2 144 169 215 N
+ AA SIL ER b n/a 2 143 198 215 N
+ AA SIL ER s n/a 2 143 198 215 N
+ AA SIL EY s n/a 2 144 169 215 N
+ AA SIL F b n/a 2 144 167 210 N
+ AA SIL F s n/a 2 144 169 210 N
+ AA SIL G b n/a 2 144 167 217 N
+ AA SIL G s n/a 2 144 169 217 N
+ AA SIL HH b n/a 2 144 167 207 N
+ AA SIL HH s n/a 2 144 169 207 N
+ AA SIL IH s n/a 2 144 169 215 N
+ AA SIL IY b n/a 2 144 167 215 N
+ AA SIL IY s n/a 2 144 169 215 N
+ AA SIL JH b n/a 2 144 167 214 N
+ AA SIL JH s n/a 2 144 169 214 N
+ AA SIL K b n/a 2 144 171 208 N
+ AA SIL K s n/a 2 144 171 208 N
+ AA SIL L b n/a 2 144 182 231 N
+ AA SIL L s n/a 2 144 182 231 N
+ AA SIL M b n/a 2 144 185 224 N
+ AA SIL M s n/a 2 144 185 224 N
+ AA SIL N b n/a 2 144 193 222 N
+ AA SIL N s n/a 2 144 193 220 N
+ AA SIL NG b n/a 2 144 185 222 N
+ AA SIL NG s n/a 2 144 185 220 N
+ AA SIL OW s n/a 2 144 182 215 N
+ AA SIL OY s n/a 2 144 169 215 N
+ AA SIL P b n/a 2 144 172 210 N
+ AA SIL P s n/a 2 144 172 210 N
+ AA SIL R b n/a 2 143 198 227 N
+ AA SIL R s n/a 2 143 198 227 N
+ AA SIL S b n/a 2 144 167 206 N
+ AA SIL S s n/a 2 144 169 206 N
+ AA SIL SH b n/a 2 144 167 209 N
+ AA SIL SH s n/a 2 144 169 209 N
+ AA SIL SIL s n/a 2 144 169 207 N
+ AA SIL T b n/a 2 144 171 215 N
+ AA SIL T s n/a 2 144 171 215 N
+ AA SIL TH b n/a 2 144 167 206 N
+ AA SIL TH s n/a 2 144 169 206 N
+ AA SIL UH s n/a 2 144 182 215 N
+ AA SIL UW b n/a 2 144 182 215 N
+ AA SIL UW s n/a 2 144 182 215 N
+ AA SIL V b n/a 2 144 167 211 N
+ AA SIL V s n/a 2 144 169 211 N
+ AA SIL W b n/a 2 144 182 211 N
+ AA SIL W s n/a 2 144 182 211 N
+ AA SIL Y b n/a 2 144 167 213 N
+ AA SIL Y s n/a 2 144 169 213 N
+ AA SIL Z b n/a 2 144 167 219 N
+ AA SIL Z s n/a 2 144 169 219 N
+ AA SIL ZH b n/a 2 144 167 219 N
+ AA SIL ZH s n/a 2 144 169 219 N
+ AA T AA e n/a 2 130 182 215 N
+ AA T AA s n/a 2 130 182 215 N
+ AA T AE e n/a 2 130 167 215 N
+ AA T AE s n/a 2 130 169 215 N
+ AA T AH b n/a 2 130 167 215 N
+ AA T AH e n/a 2 130 167 215 N
+ AA T AH s n/a 2 130 169 215 N
+ AA T AO e n/a 2 130 182 215 N
+ AA T AO i n/a 2 133 182 215 N
+ AA T AO s n/a 2 130 182 215 N
+ AA T AW e n/a 2 130 182 215 N
+ AA T AW s n/a 2 130 182 215 N
+ AA T AY e n/a 2 130 167 215 N
+ AA T AY s n/a 2 130 169 215 N
+ AA T B b n/a 2 130 167 211 N
+ AA T B e n/a 2 130 167 211 N
+ AA T B i n/a 2 133 167 211 N
+ AA T B s n/a 2 130 169 211 N
+ AA T CH b n/a 2 130 167 209 N
+ AA T CH e n/a 2 130 167 209 N
+ AA T CH i n/a 2 133 167 209 N
+ AA T CH s n/a 2 130 169 209 N
+ AA T D b n/a 2 130 167 213 N
+ AA T D e n/a 2 130 167 213 N
+ AA T D i n/a 2 134 167 213 N
+ AA T D s n/a 2 130 169 213 N
+ AA T DH e n/a 2 130 167 218 N
+ AA T DH s n/a 2 130 169 218 N
+ AA T EH e n/a 2 130 167 215 N
+ AA T EH i n/a 2 133 167 215 N
+ AA T EH s n/a 2 130 169 215 N
+ AA T ER b n/a 2 130 197 215 N
+ AA T ER e n/a 2 130 197 215 N
+ AA T ER i n/a 2 135 200 215 N
+ AA T ER s n/a 2 130 197 215 N
+ AA T EY e n/a 2 130 167 215 N
+ AA T EY s n/a 2 130 169 215 N
+ AA T F b n/a 2 130 167 210 N
+ AA T F e n/a 2 130 167 210 N
+ AA T F i n/a 2 133 167 210 N
+ AA T F s n/a 2 130 169 210 N
+ AA T G b n/a 2 130 167 217 N
+ AA T G e n/a 2 130 167 217 N
+ AA T G i n/a 2 133 167 217 N
+ AA T G s n/a 2 130 169 217 N
+ AA T HH b n/a 2 130 167 207 N
+ AA T HH e n/a 2 130 167 207 N
+ AA T HH i n/a 2 133 167 207 N
+ AA T HH s n/a 2 130 169 207 N
+ AA T IH e n/a 2 130 167 215 N
+ AA T IH i n/a 2 133 167 215 N
+ AA T IH s n/a 2 130 169 215 N
+ AA T IY b n/a 2 130 167 215 N
+ AA T IY e n/a 2 130 167 215 N
+ AA T IY i n/a 2 133 167 215 N
+ AA T IY s n/a 2 130 169 215 N
+ AA T JH b n/a 2 130 167 214 N
+ AA T JH e n/a 2 130 167 214 N
+ AA T JH i n/a 2 133 167 214 N
+ AA T JH s n/a 2 130 169 214 N
+ AA T K b n/a 2 130 171 208 N
+ AA T K e n/a 2 130 171 208 N
+ AA T K i n/a 2 134 171 208 N
+ AA T K s n/a 2 130 171 208 N
+ AA T L b n/a 2 130 182 231 N
+ AA T L e n/a 2 130 182 231 N
+ AA T L i n/a 2 133 182 231 N
+ AA T L s n/a 2 130 182 231 N
+ AA T M b n/a 2 131 185 224 N
+ AA T M e n/a 2 131 185 224 N
+ AA T M i n/a 2 133 185 224 N
+ AA T M s n/a 2 131 185 224 N
+ AA T N b n/a 2 132 188 222 N
+ AA T N e n/a 2 132 188 220 N
+ AA T N i n/a 2 134 188 220 N
+ AA T N s n/a 2 132 188 220 N
+ AA T NG b n/a 2 131 185 222 N
+ AA T NG e n/a 2 131 185 220 N
+ AA T NG i n/a 2 133 185 220 N
+ AA T NG s n/a 2 131 185 220 N
+ AA T OW e n/a 2 130 182 215 N
+ AA T OW i n/a 2 133 182 215 N
+ AA T OW s n/a 2 130 182 215 N
+ AA T OY e n/a 2 130 167 215 N
+ AA T OY s n/a 2 130 169 215 N
+ AA T P b n/a 2 130 172 210 N
+ AA T P e n/a 2 130 172 210 N
+ AA T P i n/a 2 134 172 210 N
+ AA T P s n/a 2 130 172 210 N
+ AA T R b n/a 2 130 197 227 N
+ AA T R e n/a 2 130 197 227 N
+ AA T R i n/a 2 135 200 227 N
+ AA T R s n/a 2 130 197 227 N
+ AA T S b n/a 2 130 167 206 N
+ AA T S e n/a 2 130 167 206 N
+ AA T S i n/a 2 134 167 206 N
+ AA T S s n/a 2 130 169 206 N
+ AA T SH b n/a 2 130 167 209 N
+ AA T SH e n/a 2 130 167 209 N
+ AA T SH i n/a 2 133 167 209 N
+ AA T SH s n/a 2 130 169 209 N
+ AA T SIL e n/a 2 130 167 207 N
+ AA T SIL s n/a 2 130 169 207 N
+ AA T T b n/a 2 130 171 215 N
+ AA T T e n/a 2 130 171 215 N
+ AA T T i n/a 2 134 171 215 N
+ AA T T s n/a 2 130 171 215 N
+ AA T TH b n/a 2 130 167 206 N
+ AA T TH e n/a 2 130 167 206 N
+ AA T TH i n/a 2 134 167 206 N
+ AA T TH s n/a 2 130 169 206 N
+ AA T UH e n/a 2 130 182 215 N
+ AA T UH s n/a 2 130 182 215 N
+ AA T UW b n/a 2 130 182 215 N
+ AA T UW e n/a 2 130 182 215 N
+ AA T UW i n/a 2 133 182 215 N
+ AA T UW s n/a 2 130 182 215 N
+ AA T V b n/a 2 130 167 211 N
+ AA T V e n/a 2 130 167 211 N
+ AA T V i n/a 2 133 167 211 N
+ AA T V s n/a 2 130 169 211 N
+ AA T W b n/a 2 130 182 211 N
+ AA T W e n/a 2 130 182 211 N
+ AA T W i n/a 2 133 182 211 N
+ AA T W s n/a 2 130 182 211 N
+ AA T Y b n/a 2 130 167 213 N
+ AA T Y e n/a 2 130 167 213 N
+ AA T Y i n/a 2 133 167 213 N
+ AA T Y s n/a 2 130 169 213 N
+ AA T Z b n/a 2 130 167 219 N
+ AA T Z e n/a 2 130 167 219 N
+ AA T Z i n/a 2 134 167 219 N
+ AA T Z s n/a 2 130 169 219 N
+ AA T ZH b n/a 2 130 167 219 N
+ AA T ZH e n/a 2 130 167 219 N
+ AA T ZH i n/a 2 133 167 219 N
+ AA T ZH s n/a 2 130 169 219 N
+ AA TH AA s n/a 2 130 182 215 N
+ AA TH AE s n/a 2 130 169 215 N
+ AA TH AH b n/a 2 130 167 215 N
+ AA TH AH s n/a 2 130 169 215 N
+ AA TH AO s n/a 2 130 182 215 N
+ AA TH AW s n/a 2 130 182 215 N
+ AA TH AY s n/a 2 130 169 215 N
+ AA TH B b n/a 2 130 167 211 N
+ AA TH B s n/a 2 130 169 211 N
+ AA TH CH b n/a 2 130 167 209 N
+ AA TH CH s n/a 2 130 169 209 N
+ AA TH D b n/a 2 130 167 213 N
+ AA TH D i n/a 2 134 167 213 N
+ AA TH D s n/a 2 130 169 213 N
+ AA TH DH s n/a 2 130 169 218 N
+ AA TH EH s n/a 2 130 169 215 N
+ AA TH ER b n/a 2 130 197 215 N
+ AA TH ER s n/a 2 130 197 215 N
+ AA TH EY s n/a 2 130 169 215 N
+ AA TH F b n/a 2 130 167 210 N
+ AA TH F s n/a 2 130 169 210 N
+ AA TH G b n/a 2 130 167 217 N
+ AA TH G i n/a 2 134 167 217 N
+ AA TH G s n/a 2 130 169 217 N
+ AA TH HH b n/a 2 130 167 207 N
+ AA TH HH s n/a 2 130 169 207 N
+ AA TH IH s n/a 2 130 169 215 N
+ AA TH IY b n/a 2 130 167 215 N
+ AA TH IY i n/a 2 134 167 215 N
+ AA TH IY s n/a 2 130 169 215 N
+ AA TH JH b n/a 2 130 167 214 N
+ AA TH JH s n/a 2 130 169 214 N
+ AA TH K b n/a 2 130 171 208 N
+ AA TH K i n/a 2 134 171 208 N
+ AA TH K s n/a 2 130 171 208 N
+ AA TH L b n/a 2 130 182 231 N
+ AA TH L i n/a 2 134 182 231 N
+ AA TH L s n/a 2 130 182 231 N
+ AA TH M b n/a 2 131 185 224 N
+ AA TH M i n/a 2 134 185 224 N
+ AA TH M s n/a 2 131 185 224 N
+ AA TH N b n/a 2 131 188 222 N
+ AA TH N i n/a 2 134 188 220 N
+ AA TH N s n/a 2 131 188 220 N
+ AA TH NG b n/a 2 131 185 222 N
+ AA TH NG s n/a 2 131 185 220 N
+ AA TH OW s n/a 2 130 182 215 N
+ AA TH OY s n/a 2 130 169 215 N
+ AA TH P b n/a 2 130 172 210 N
+ AA TH P i n/a 2 134 172 210 N
+ AA TH P s n/a 2 130 172 210 N
+ AA TH R b n/a 2 130 197 227 N
+ AA TH R i n/a 2 135 197 227 N
+ AA TH R s n/a 2 130 197 227 N
+ AA TH S b n/a 2 130 167 206 N
+ AA TH S i n/a 2 134 167 206 N
+ AA TH S s n/a 2 130 169 206 N
+ AA TH SH b n/a 2 130 167 209 N
+ AA TH SH s n/a 2 130 169 209 N
+ AA TH SIL s n/a 2 130 169 207 N
+ AA TH T b n/a 2 130 171 215 N
+ AA TH T i n/a 2 134 171 215 N
+ AA TH T s n/a 2 130 171 215 N
+ AA TH TH b n/a 2 130 167 206 N
+ AA TH TH i n/a 2 134 167 206 N
+ AA TH TH s n/a 2 130 169 206 N
+ AA TH UH s n/a 2 130 182 215 N
+ AA TH UW b n/a 2 130 182 215 N
+ AA TH UW s n/a 2 130 182 215 N
+ AA TH V b n/a 2 130 167 211 N
+ AA TH V s n/a 2 130 169 211 N
+ AA TH W b n/a 2 130 182 211 N
+ AA TH W s n/a 2 130 182 211 N
+ AA TH Y b n/a 2 130 167 213 N
+ AA TH Y s n/a 2 130 169 213 N
+ AA TH Z b n/a 2 130 167 219 N
+ AA TH Z i n/a 2 134 167 219 N
+ AA TH Z s n/a 2 130 169 219 N
+ AA TH ZH b n/a 2 130 167 219 N
+ AA TH ZH s n/a 2 130 169 219 N
+ AA UH AA s n/a 2 162 182 215 N
+ AA UH AE s n/a 2 162 169 215 N
+ AA UH AH b n/a 2 162 167 215 N
+ AA UH AH s n/a 2 162 169 215 N
+ AA UH AO s n/a 2 162 182 215 N
+ AA UH AW s n/a 2 162 182 215 N
+ AA UH AY s n/a 2 162 169 215 N
+ AA UH B b n/a 2 162 167 211 N
+ AA UH B s n/a 2 162 169 211 N
+ AA UH CH b n/a 2 162 167 209 N
+ AA UH CH s n/a 2 162 169 209 N
+ AA UH D b n/a 2 162 168 213 N
+ AA UH D s n/a 2 162 169 213 N
+ AA UH DH s n/a 2 162 169 218 N
+ AA UH EH s n/a 2 162 169 215 N
+ AA UH ER b n/a 2 162 201 215 N
+ AA UH ER s n/a 2 164 201 215 N
+ AA UH EY s n/a 2 162 169 215 N
+ AA UH F b n/a 2 162 167 210 N
+ AA UH F s n/a 2 162 169 210 N
+ AA UH G b n/a 2 162 167 217 N
+ AA UH G s n/a 2 162 169 217 N
+ AA UH HH b n/a 2 162 167 207 N
+ AA UH HH s n/a 2 162 169 207 N
+ AA UH IH s n/a 2 162 169 215 N
+ AA UH IY b n/a 2 162 167 215 N
+ AA UH IY s n/a 2 162 169 215 N
+ AA UH JH b n/a 2 162 167 214 N
+ AA UH JH s n/a 2 162 169 214 N
+ AA UH K b n/a 2 162 171 208 N
+ AA UH K s n/a 2 162 171 208 N
+ AA UH L b n/a 2 162 182 230 N
+ AA UH L s n/a 2 162 182 230 N
+ AA UH M b n/a 2 162 184 224 N
+ AA UH M s n/a 2 162 184 224 N
+ AA UH N b n/a 2 162 189 222 N
+ AA UH N s n/a 2 162 189 220 N
+ AA UH NG b n/a 2 162 184 222 N
+ AA UH NG s n/a 2 162 184 220 N
+ AA UH OW s n/a 2 162 182 215 N
+ AA UH OY s n/a 2 162 169 215 N
+ AA UH P b n/a 2 162 172 210 N
+ AA UH P s n/a 2 162 172 210 N
+ AA UH R b n/a 2 162 201 227 N
+ AA UH R s n/a 2 164 201 227 N
+ AA UH S b n/a 2 162 167 206 N
+ AA UH S s n/a 2 162 169 206 N
+ AA UH SH b n/a 2 162 167 209 N
+ AA UH SH s n/a 2 162 169 209 N
+ AA UH SIL s n/a 2 162 169 207 N
+ AA UH T b n/a 2 162 171 215 N
+ AA UH T s n/a 2 162 171 215 N
+ AA UH TH b n/a 2 162 167 206 N
+ AA UH TH s n/a 2 162 169 206 N
+ AA UH UH s n/a 2 162 182 215 N
+ AA UH UW b n/a 2 162 182 215 N
+ AA UH UW s n/a 2 162 182 215 N
+ AA UH V b n/a 2 162 167 211 N
+ AA UH V s n/a 2 162 169 211 N
+ AA UH W b n/a 2 162 182 211 N
+ AA UH W s n/a 2 162 182 211 N
+ AA UH Y b n/a 2 162 167 213 N
+ AA UH Y s n/a 2 162 169 213 N
+ AA UH Z b n/a 2 162 167 219 N
+ AA UH Z s n/a 2 162 169 219 N
+ AA UH ZH b n/a 2 162 167 219 N
+ AA UH ZH s n/a 2 162 169 219 N
+ AA UW AA e n/a 2 162 182 215 N
+ AA UW AA s n/a 2 162 182 215 N
+ AA UW AE e n/a 2 162 168 215 N
+ AA UW AE s n/a 2 162 169 215 N
+ AA UW AH b n/a 2 162 167 215 N
+ AA UW AH e n/a 2 162 168 215 N
+ AA UW AH s n/a 2 162 169 215 N
+ AA UW AO e n/a 2 162 182 215 N
+ AA UW AO s n/a 2 162 182 215 N
+ AA UW AW e n/a 2 162 182 215 N
+ AA UW AW s n/a 2 162 182 215 N
+ AA UW AY e n/a 2 162 168 215 N
+ AA UW AY s n/a 2 162 169 215 N
+ AA UW B b n/a 2 162 167 211 N
+ AA UW B e n/a 2 162 168 211 N
+ AA UW B i n/a 2 162 168 211 N
+ AA UW B s n/a 2 162 169 211 N
+ AA UW CH b n/a 2 162 167 209 N
+ AA UW CH e n/a 2 162 168 209 N
+ AA UW CH s n/a 2 162 169 209 N
+ AA UW D b n/a 2 162 168 213 N
+ AA UW D e n/a 2 162 168 213 N
+ AA UW D i n/a 2 162 168 213 N
+ AA UW D s n/a 2 162 169 213 N
+ AA UW DH e n/a 2 162 168 218 N
+ AA UW DH s n/a 2 162 169 218 N
+ AA UW EH e n/a 2 162 168 215 N
+ AA UW EH s n/a 2 162 169 215 N
+ AA UW ER b n/a 2 162 201 215 N
+ AA UW ER e n/a 2 164 201 215 N
+ AA UW ER s n/a 2 164 201 215 N
+ AA UW EY e n/a 2 162 168 215 N
+ AA UW EY s n/a 2 162 169 215 N
+ AA UW F b n/a 2 162 167 210 N
+ AA UW F e n/a 2 162 168 210 N
+ AA UW F s n/a 2 162 169 210 N
+ AA UW G b n/a 2 162 167 217 N
+ AA UW G e n/a 2 162 168 217 N
+ AA UW G i n/a 2 162 168 217 N
+ AA UW G s n/a 2 162 169 217 N
+ AA UW HH b n/a 2 162 167 207 N
+ AA UW HH e n/a 2 162 168 207 N
+ AA UW HH s n/a 2 162 169 207 N
+ AA UW IH e n/a 2 162 168 215 N
+ AA UW IH s n/a 2 162 169 215 N
+ AA UW IY b n/a 2 162 167 215 N
+ AA UW IY e n/a 2 162 168 215 N
+ AA UW IY s n/a 2 162 169 215 N
+ AA UW JH b n/a 2 162 167 214 N
+ AA UW JH e n/a 2 162 168 214 N
+ AA UW JH s n/a 2 162 169 214 N
+ AA UW K b n/a 2 162 171 208 N
+ AA UW K e n/a 2 162 171 208 N
+ AA UW K i n/a 2 162 171 208 N
+ AA UW K s n/a 2 162 171 208 N
+ AA UW L b n/a 2 162 182 230 N
+ AA UW L e n/a 2 162 182 230 N
+ AA UW L i n/a 2 162 182 230 N
+ AA UW L s n/a 2 162 182 230 N
+ AA UW M b n/a 2 162 184 224 N
+ AA UW M e n/a 2 162 184 224 N
+ AA UW M i n/a 2 162 184 224 N
+ AA UW M s n/a 2 162 184 224 N
+ AA UW N b n/a 2 162 194 223 N
+ AA UW N e n/a 2 162 194 223 N
+ AA UW N i n/a 2 162 194 223 N
+ AA UW N s n/a 2 162 194 223 N
+ AA UW NG b n/a 2 162 184 223 N
+ AA UW NG e n/a 2 162 184 223 N
+ AA UW NG s n/a 2 162 184 223 N
+ AA UW OW e n/a 2 162 182 215 N
+ AA UW OW s n/a 2 162 182 215 N
+ AA UW OY e n/a 2 162 168 215 N
+ AA UW OY s n/a 2 162 169 215 N
+ AA UW P b n/a 2 162 172 210 N
+ AA UW P e n/a 2 162 172 210 N
+ AA UW P i n/a 2 162 172 210 N
+ AA UW P s n/a 2 162 172 210 N
+ AA UW R b n/a 2 162 201 227 N
+ AA UW R e n/a 2 164 201 227 N
+ AA UW R i n/a 2 164 199 225 N
+ AA UW R s n/a 2 164 201 227 N
+ AA UW S b n/a 2 162 167 206 N
+ AA UW S e n/a 2 162 168 206 N
+ AA UW S i n/a 2 162 168 206 N
+ AA UW S s n/a 2 162 169 206 N
+ AA UW SH b n/a 2 162 167 209 N
+ AA UW SH e n/a 2 162 168 209 N
+ AA UW SH i n/a 2 162 168 209 N
+ AA UW SH s n/a 2 162 169 209 N
+ AA UW SIL e n/a 2 162 168 207 N
+ AA UW SIL s n/a 2 162 169 207 N
+ AA UW T b n/a 2 162 171 215 N
+ AA UW T e n/a 2 162 171 215 N
+ AA UW T i n/a 2 162 171 215 N
+ AA UW T s n/a 2 162 171 215 N
+ AA UW TH b n/a 2 162 167 206 N
+ AA UW TH e n/a 2 162 168 206 N
+ AA UW TH s n/a 2 162 169 206 N
+ AA UW UH e n/a 2 162 182 215 N
+ AA UW UH s n/a 2 162 182 215 N
+ AA UW UW b n/a 2 162 182 215 N
+ AA UW UW e n/a 2 162 182 215 N
+ AA UW UW s n/a 2 162 182 215 N
+ AA UW V b n/a 2 162 167 211 N
+ AA UW V e n/a 2 162 168 211 N
+ AA UW V s n/a 2 162 169 211 N
+ AA UW W b n/a 2 162 182 211 N
+ AA UW W e n/a 2 162 182 211 N
+ AA UW W s n/a 2 162 182 211 N
+ AA UW Y b n/a 2 162 167 213 N
+ AA UW Y e n/a 2 162 168 213 N
+ AA UW Y s n/a 2 162 169 213 N
+ AA UW Z b n/a 2 162 167 219 N
+ AA UW Z e n/a 2 162 168 219 N
+ AA UW Z s n/a 2 162 169 219 N
+ AA UW ZH b n/a 2 162 167 219 N
+ AA UW ZH e n/a 2 162 168 219 N
+ AA UW ZH s n/a 2 162 169 219 N
+ AA V AA e n/a 2 156 181 215 N
+ AA V AA s n/a 2 156 181 215 N
+ AA V AE e n/a 2 156 176 215 N
+ AA V AE s n/a 2 156 176 215 N
+ AA V AH b n/a 2 156 176 215 N
+ AA V AH e n/a 2 156 176 215 N
+ AA V AH s n/a 2 156 176 215 N
+ AA V AO e n/a 2 156 181 215 N
+ AA V AO s n/a 2 156 181 215 N
+ AA V AW e n/a 2 156 181 215 N
+ AA V AW s n/a 2 156 181 215 N
+ AA V AY e n/a 2 156 176 215 N
+ AA V AY s n/a 2 156 176 215 N
+ AA V B b n/a 2 156 176 211 N
+ AA V B e n/a 2 156 176 211 N
+ AA V B s n/a 2 156 176 211 N
+ AA V CH b n/a 2 156 178 209 N
+ AA V CH e n/a 2 156 178 209 N
+ AA V CH i n/a 2 155 178 209 N
+ AA V CH s n/a 2 156 178 209 N
+ AA V D b n/a 2 156 178 214 N
+ AA V D e n/a 2 156 178 214 N
+ AA V D i n/a 2 155 178 214 N
+ AA V D s n/a 2 156 178 214 N
+ AA V DH e n/a 2 156 176 218 N
+ AA V DH s n/a 2 156 176 218 N
+ AA V EH e n/a 2 156 176 215 N
+ AA V EH i n/a 2 155 176 215 N
+ AA V EH s n/a 2 156 176 215 N
+ AA V ER b n/a 2 156 202 215 N
+ AA V ER e n/a 2 156 202 215 N
+ AA V ER s n/a 2 156 202 215 N
+ AA V EY e n/a 2 156 176 215 N
+ AA V EY s n/a 2 156 176 215 N
+ AA V F b n/a 2 156 176 210 N
+ AA V F e n/a 2 156 176 210 N
+ AA V F s n/a 2 156 176 210 N
+ AA V G b n/a 2 156 176 217 N
+ AA V G e n/a 2 156 176 217 N
+ AA V G i n/a 2 155 176 217 N
+ AA V G s n/a 2 156 176 217 N
+ AA V HH b n/a 2 156 176 207 N
+ AA V HH e n/a 2 156 176 207 N
+ AA V HH i n/a 2 155 176 207 N
+ AA V HH s n/a 2 156 176 207 N
+ AA V IH e n/a 2 156 176 215 N
+ AA V IH i n/a 2 155 176 215 N
+ AA V IH s n/a 2 156 176 215 N
+ AA V IY b n/a 2 156 176 215 N
+ AA V IY e n/a 2 156 176 215 N
+ AA V IY i n/a 2 155 176 215 N
+ AA V IY s n/a 2 156 176 215 N
+ AA V JH b n/a 2 156 178 214 N
+ AA V JH e n/a 2 156 178 214 N
+ AA V JH i n/a 2 155 178 214 N
+ AA V JH s n/a 2 156 178 214 N
+ AA V K b n/a 2 156 177 208 N
+ AA V K e n/a 2 156 177 208 N
+ AA V K i n/a 2 155 177 208 N
+ AA V K s n/a 2 156 177 208 N
+ AA V L b n/a 2 156 181 231 N
+ AA V L e n/a 2 156 181 231 N
+ AA V L i n/a 2 155 181 231 N
+ AA V L s n/a 2 156 181 231 N
+ AA V M b n/a 2 156 186 224 N
+ AA V M e n/a 2 156 186 224 N
+ AA V M i n/a 2 155 186 224 N
+ AA V M s n/a 2 156 186 224 N
+ AA V N b n/a 2 156 189 222 N
+ AA V N e n/a 2 156 189 220 N
+ AA V N i n/a 2 155 189 220 N
+ AA V N s n/a 2 156 189 220 N
+ AA V NG b n/a 2 156 186 222 N
+ AA V NG e n/a 2 156 186 220 N
+ AA V NG i n/a 2 155 186 220 N
+ AA V NG s n/a 2 156 186 220 N
+ AA V OW e n/a 2 156 181 215 N
+ AA V OW s n/a 2 156 181 215 N
+ AA V OY e n/a 2 156 176 215 N
+ AA V OY s n/a 2 156 176 215 N
+ AA V P b n/a 2 156 177 210 N
+ AA V P e n/a 2 156 177 210 N
+ AA V P i n/a 2 155 177 210 N
+ AA V P s n/a 2 156 177 210 N
+ AA V R b n/a 2 156 202 227 N
+ AA V R e n/a 2 156 202 227 N
+ AA V R i n/a 2 156 201 228 N
+ AA V R s n/a 2 156 202 227 N
+ AA V S b n/a 2 156 176 206 N
+ AA V S e n/a 2 156 176 206 N
+ AA V S i n/a 2 155 176 206 N
+ AA V S s n/a 2 156 176 206 N
+ AA V SH b n/a 2 156 176 209 N
+ AA V SH e n/a 2 156 176 209 N
+ AA V SH i n/a 2 155 176 209 N
+ AA V SH s n/a 2 156 176 209 N
+ AA V SIL e n/a 2 156 176 207 N
+ AA V SIL s n/a 2 156 176 207 N
+ AA V T b n/a 2 156 178 215 N
+ AA V T e n/a 2 156 178 215 N
+ AA V T i n/a 2 155 178 215 N
+ AA V T s n/a 2 156 178 215 N
+ AA V TH b n/a 2 156 176 206 N
+ AA V TH e n/a 2 156 176 206 N
+ AA V TH i n/a 2 155 176 206 N
+ AA V TH s n/a 2 156 176 206 N
+ AA V UH e n/a 2 156 181 215 N
+ AA V UH s n/a 2 156 181 215 N
+ AA V UW b n/a 2 156 181 215 N
+ AA V UW e n/a 2 156 181 215 N
+ AA V UW s n/a 2 156 181 215 N
+ AA V V b n/a 2 156 176 211 N
+ AA V V e n/a 2 156 176 211 N
+ AA V V i n/a 2 155 176 211 N
+ AA V V s n/a 2 156 176 211 N
+ AA V W b n/a 2 156 181 211 N
+ AA V W e n/a 2 156 181 211 N
+ AA V W i n/a 2 155 181 211 N
+ AA V W s n/a 2 156 181 211 N
+ AA V Y b n/a 2 156 176 214 N
+ AA V Y e n/a 2 156 176 214 N
+ AA V Y i n/a 2 155 176 214 N
+ AA V Y s n/a 2 156 176 214 N
+ AA V Z b n/a 2 156 176 219 N
+ AA V Z e n/a 2 156 176 219 N
+ AA V Z i n/a 2 155 176 219 N
+ AA V Z s n/a 2 156 176 219 N
+ AA V ZH b n/a 2 156 176 219 N
+ AA V ZH e n/a 2 156 176 219 N
+ AA V ZH s n/a 2 156 176 219 N
+ AA W AA e n/a 2 161 181 215 N
+ AA W AA s n/a 2 161 181 215 N
+ AA W AE e n/a 2 161 178 215 N
+ AA W AE s n/a 2 161 178 215 N
+ AA W AH b n/a 2 161 178 215 N
+ AA W AH e n/a 2 161 178 215 N
+ AA W AH i n/a 2 161 178 215 N
+ AA W AH s n/a 2 161 178 215 N
+ AA W AO e n/a 2 161 181 215 N
+ AA W AO s n/a 2 161 181 215 N
+ AA W AW e n/a 2 161 181 215 N
+ AA W AW s n/a 2 161 181 215 N
+ AA W AY e n/a 2 161 178 215 N
+ AA W AY s n/a 2 161 178 215 N
+ AA W B b n/a 2 161 178 211 N
+ AA W B e n/a 2 161 178 211 N
+ AA W B i n/a 2 161 178 211 N
+ AA W B s n/a 2 161 178 211 N
+ AA W CH b n/a 2 161 180 209 N
+ AA W CH e n/a 2 161 180 209 N
+ AA W CH i n/a 2 161 180 209 N
+ AA W CH s n/a 2 161 180 209 N
+ AA W D b n/a 2 161 180 214 N
+ AA W D e n/a 2 161 180 214 N
+ AA W D i n/a 2 161 180 214 N
+ AA W D s n/a 2 161 180 214 N
+ AA W DH e n/a 2 161 179 218 N
+ AA W DH i n/a 2 161 179 218 N
+ AA W DH s n/a 2 161 179 218 N
+ AA W EH e n/a 2 161 178 215 N
+ AA W EH s n/a 2 161 178 215 N
+ AA W ER b n/a 2 161 204 215 N
+ AA W ER e n/a 2 161 203 215 N
+ AA W ER i n/a 2 161 204 215 N
+ AA W ER s n/a 2 161 204 215 N
+ AA W EY e n/a 2 161 178 215 N
+ AA W EY s n/a 2 161 178 215 N
+ AA W F b n/a 2 161 178 210 N
+ AA W F e n/a 2 161 178 210 N
+ AA W F i n/a 2 161 178 210 N
+ AA W F s n/a 2 161 178 210 N
+ AA W G b n/a 2 161 178 217 N
+ AA W G e n/a 2 161 178 217 N
+ AA W G i n/a 2 161 178 217 N
+ AA W G s n/a 2 161 178 217 N
+ AA W HH b n/a 2 161 178 207 N
+ AA W HH e n/a 2 161 178 207 N
+ AA W HH i n/a 2 161 178 207 N
+ AA W HH s n/a 2 161 178 207 N
+ AA W IH e n/a 2 161 178 215 N
+ AA W IH i n/a 2 161 178 215 N
+ AA W IH s n/a 2 161 178 215 N
+ AA W IY b n/a 2 161 178 215 N
+ AA W IY e n/a 2 161 178 215 N
+ AA W IY i n/a 2 161 178 215 N
+ AA W IY s n/a 2 161 178 215 N
+ AA W JH b n/a 2 161 180 214 N
+ AA W JH e n/a 2 161 180 214 N
+ AA W JH s n/a 2 161 180 214 N
+ AA W K b n/a 2 161 178 208 N
+ AA W K e n/a 2 161 178 208 N
+ AA W K i n/a 2 161 178 208 N
+ AA W K s n/a 2 161 178 208 N
+ AA W L b n/a 2 158 181 231 N
+ AA W L e n/a 2 157 181 231 N
+ AA W L i n/a 2 157 181 231 N
+ AA W L s n/a 2 157 181 231 N
+ AA W M b n/a 2 161 186 224 N
+ AA W M e n/a 2 161 186 224 N
+ AA W M i n/a 2 161 186 224 N
+ AA W M s n/a 2 161 186 224 N
+ AA W N b n/a 2 160 194 223 N
+ AA W N e n/a 2 160 194 223 N
+ AA W N i n/a 2 160 194 223 N
+ AA W N s n/a 2 160 194 223 N
+ AA W NG b n/a 2 161 186 223 N
+ AA W NG e n/a 2 161 186 223 N
+ AA W NG i n/a 2 161 186 223 N
+ AA W NG s n/a 2 161 186 223 N
+ AA W OW e n/a 2 161 181 215 N
+ AA W OW s n/a 2 161 181 215 N
+ AA W OY e n/a 2 161 178 215 N
+ AA W OY s n/a 2 161 178 215 N
+ AA W P b n/a 2 161 178 210 N
+ AA W P e n/a 2 161 178 210 N
+ AA W P i n/a 2 161 178 210 N
+ AA W P s n/a 2 161 178 210 N
+ AA W R b n/a 2 161 204 228 N
+ AA W R e n/a 2 161 203 228 N
+ AA W R i n/a 2 161 204 225 N
+ AA W R s n/a 2 161 204 228 N
+ AA W S b n/a 2 161 178 206 N
+ AA W S e n/a 2 161 178 206 N
+ AA W S i n/a 2 161 178 206 N
+ AA W S s n/a 2 161 178 206 N
+ AA W SH b n/a 2 161 180 209 N
+ AA W SH e n/a 2 161 180 209 N
+ AA W SH i n/a 2 161 180 209 N
+ AA W SH s n/a 2 161 180 209 N
+ AA W SIL e n/a 2 161 178 207 N
+ AA W SIL s n/a 2 161 178 207 N
+ AA W T b n/a 2 161 179 215 N
+ AA W T e n/a 2 161 179 215 N
+ AA W T i n/a 2 161 180 215 N
+ AA W T s n/a 2 161 179 215 N
+ AA W TH b n/a 2 161 178 206 N
+ AA W TH e n/a 2 161 178 206 N
+ AA W TH i n/a 2 161 178 206 N
+ AA W TH s n/a 2 161 178 206 N
+ AA W UH e n/a 2 161 181 215 N
+ AA W UH s n/a 2 161 181 215 N
+ AA W UW b n/a 2 161 181 215 N
+ AA W UW e n/a 2 161 181 215 N
+ AA W UW s n/a 2 161 181 215 N
+ AA W V b n/a 2 161 179 211 N
+ AA W V e n/a 2 161 179 211 N
+ AA W V i n/a 2 161 179 211 N
+ AA W V s n/a 2 161 179 211 N
+ AA W W b n/a 2 158 181 211 N
+ AA W W e n/a 2 157 181 211 N
+ AA W W i n/a 2 157 181 211 N
+ AA W W s n/a 2 157 181 211 N
+ AA W Y b n/a 2 161 179 214 N
+ AA W Y e n/a 2 161 179 214 N
+ AA W Y i n/a 2 161 180 214 N
+ AA W Y s n/a 2 161 179 214 N
+ AA W Z b n/a 2 161 179 219 N
+ AA W Z e n/a 2 161 179 219 N
+ AA W Z i n/a 2 161 179 219 N
+ AA W Z s n/a 2 161 179 219 N
+ AA W ZH b n/a 2 161 179 219 N
+ AA W ZH e n/a 2 161 179 219 N
+ AA W ZH s n/a 2 161 179 219 N
+ AA Y AA e n/a 2 141 183 215 N
+ AA Y AA s n/a 2 141 183 215 N
+ AA Y AE e n/a 2 141 168 215 N
+ AA Y AE s n/a 2 141 169 215 N
+ AA Y AH b n/a 2 141 167 215 N
+ AA Y AH e n/a 2 141 168 215 N
+ AA Y AH s n/a 2 141 169 215 N
+ AA Y AO e n/a 2 141 183 215 N
+ AA Y AO s n/a 2 141 183 215 N
+ AA Y AW e n/a 2 141 183 215 N
+ AA Y AW s n/a 2 141 183 215 N
+ AA Y AY e n/a 2 141 168 215 N
+ AA Y AY s n/a 2 141 169 215 N
+ AA Y B b n/a 2 141 167 211 N
+ AA Y B e n/a 2 141 168 211 N
+ AA Y B i n/a 2 142 168 211 N
+ AA Y B s n/a 2 141 169 211 N
+ AA Y CH b n/a 2 141 167 209 N
+ AA Y CH e n/a 2 141 168 209 N
+ AA Y CH i n/a 2 142 168 209 N
+ AA Y CH s n/a 2 141 169 209 N
+ AA Y D b n/a 2 141 168 213 N
+ AA Y D e n/a 2 141 168 213 N
+ AA Y D i n/a 2 142 168 213 N
+ AA Y D s n/a 2 141 169 213 N
+ AA Y DH e n/a 2 141 168 218 N
+ AA Y DH s n/a 2 141 169 218 N
+ AA Y EH e n/a 2 141 168 215 N
+ AA Y EH s n/a 2 141 169 215 N
+ AA Y ER b n/a 2 141 197 215 N
+ AA Y ER e n/a 2 141 197 215 N
+ AA Y ER i n/a 2 142 200 215 N
+ AA Y ER s n/a 2 141 197 215 N
+ AA Y EY e n/a 2 141 168 215 N
+ AA Y EY s n/a 2 141 169 215 N
+ AA Y F b n/a 2 141 167 210 N
+ AA Y F e n/a 2 141 168 210 N
+ AA Y F i n/a 2 142 168 210 N
+ AA Y F s n/a 2 141 169 210 N
+ AA Y G b n/a 2 141 167 217 N
+ AA Y G e n/a 2 141 168 217 N
+ AA Y G i n/a 2 142 168 217 N
+ AA Y G s n/a 2 141 169 217 N
+ AA Y HH b n/a 2 141 167 207 N
+ AA Y HH e n/a 2 141 168 207 N
+ AA Y HH i n/a 2 142 168 207 N
+ AA Y HH s n/a 2 141 169 207 N
+ AA Y IH e n/a 2 141 168 215 N
+ AA Y IH s n/a 2 141 169 215 N
+ AA Y IY b n/a 2 141 167 215 N
+ AA Y IY e n/a 2 141 168 215 N
+ AA Y IY s n/a 2 141 169 215 N
+ AA Y JH b n/a 2 141 167 214 N
+ AA Y JH e n/a 2 141 168 214 N
+ AA Y JH s n/a 2 141 169 214 N
+ AA Y K b n/a 2 141 171 208 N
+ AA Y K e n/a 2 141 171 208 N
+ AA Y K i n/a 2 142 171 208 N
+ AA Y K s n/a 2 141 171 208 N
+ AA Y L b n/a 2 141 183 230 N
+ AA Y L e n/a 2 141 183 230 N
+ AA Y L i n/a 2 142 183 230 N
+ AA Y L s n/a 2 141 183 230 N
+ AA Y M b n/a 2 141 184 224 N
+ AA Y M e n/a 2 141 184 224 N
+ AA Y M i n/a 2 142 184 224 N
+ AA Y M s n/a 2 141 184 224 N
+ AA Y N b n/a 2 141 188 222 N
+ AA Y N e n/a 2 141 188 220 N
+ AA Y N i n/a 2 142 187 220 N
+ AA Y N s n/a 2 141 188 220 N
+ AA Y NG b n/a 2 141 184 222 N
+ AA Y NG e n/a 2 141 184 220 N
+ AA Y NG i n/a 2 142 184 220 N
+ AA Y NG s n/a 2 141 184 220 N
+ AA Y OW e n/a 2 141 183 215 N
+ AA Y OW s n/a 2 141 183 215 N
+ AA Y OY e n/a 2 141 168 215 N
+ AA Y OY s n/a 2 141 169 215 N
+ AA Y P b n/a 2 141 172 210 N
+ AA Y P e n/a 2 141 172 210 N
+ AA Y P i n/a 2 142 172 210 N
+ AA Y P s n/a 2 141 172 210 N
+ AA Y R b n/a 2 141 197 227 N
+ AA Y R e n/a 2 141 197 227 N
+ AA Y R i n/a 2 142 200 226 N
+ AA Y R s n/a 2 141 197 227 N
+ AA Y S b n/a 2 141 167 206 N
+ AA Y S e n/a 2 141 168 206 N
+ AA Y S i n/a 2 142 168 206 N
+ AA Y S s n/a 2 141 169 206 N
+ AA Y SH b n/a 2 141 167 209 N
+ AA Y SH e n/a 2 141 168 209 N
+ AA Y SH i n/a 2 142 168 209 N
+ AA Y SH s n/a 2 141 169 209 N
+ AA Y SIL e n/a 2 141 168 207 N
+ AA Y SIL s n/a 2 141 169 207 N
+ AA Y T b n/a 2 141 171 215 N
+ AA Y T e n/a 2 141 171 215 N
+ AA Y T i n/a 2 142 171 215 N
+ AA Y T s n/a 2 141 171 215 N
+ AA Y TH b n/a 2 141 167 206 N
+ AA Y TH e n/a 2 141 168 206 N
+ AA Y TH s n/a 2 141 169 206 N
+ AA Y UH e n/a 2 141 183 215 N
+ AA Y UH s n/a 2 141 183 215 N
+ AA Y UW b n/a 2 141 183 215 N
+ AA Y UW e n/a 2 141 183 215 N
+ AA Y UW i n/a 2 142 183 215 N
+ AA Y UW s n/a 2 141 183 215 N
+ AA Y V b n/a 2 141 167 211 N
+ AA Y V e n/a 2 141 168 211 N
+ AA Y V i n/a 2 142 168 211 N
+ AA Y V s n/a 2 141 169 211 N
+ AA Y W b n/a 2 141 183 211 N
+ AA Y W e n/a 2 141 183 211 N
+ AA Y W i n/a 2 142 183 211 N
+ AA Y W s n/a 2 141 183 211 N
+ AA Y Y b n/a 2 141 167 213 N
+ AA Y Y e n/a 2 141 168 213 N
+ AA Y Y i n/a 2 142 168 213 N
+ AA Y Y s n/a 2 141 169 213 N
+ AA Y Z b n/a 2 141 167 219 N
+ AA Y Z e n/a 2 141 168 219 N
+ AA Y Z i n/a 2 142 168 219 N
+ AA Y Z s n/a 2 141 169 219 N
+ AA Y ZH b n/a 2 141 167 219 N
+ AA Y ZH e n/a 2 141 168 219 N
+ AA Y ZH i n/a 2 142 168 219 N
+ AA Y ZH s n/a 2 141 169 219 N
+ AA Z AA s n/a 2 130 182 215 N
+ AA Z AE s n/a 2 130 169 215 N
+ AA Z AH b n/a 2 130 167 215 N
+ AA Z AH s n/a 2 130 169 215 N
+ AA Z AO s n/a 2 130 182 215 N
+ AA Z AW s n/a 2 130 182 215 N
+ AA Z AY s n/a 2 130 169 215 N
+ AA Z B b n/a 2 130 167 211 N
+ AA Z B i n/a 2 136 168 211 N
+ AA Z B s n/a 2 130 169 211 N
+ AA Z CH b n/a 2 130 167 209 N
+ AA Z CH i n/a 2 136 168 209 N
+ AA Z CH s n/a 2 130 169 209 N
+ AA Z D b n/a 2 130 168 213 N
+ AA Z D i n/a 2 136 168 213 N
+ AA Z D s n/a 2 130 169 213 N
+ AA Z DH s n/a 2 130 169 218 N
+ AA Z EH s n/a 2 130 169 215 N
+ AA Z ER b n/a 2 130 197 215 N
+ AA Z ER s n/a 2 130 197 215 N
+ AA Z EY s n/a 2 130 169 215 N
+ AA Z F b n/a 2 130 167 210 N
+ AA Z F i n/a 2 136 168 210 N
+ AA Z F s n/a 2 130 169 210 N
+ AA Z G b n/a 2 130 167 217 N
+ AA Z G i n/a 2 136 168 217 N
+ AA Z G s n/a 2 130 169 217 N
+ AA Z HH b n/a 2 130 167 207 N
+ AA Z HH i n/a 2 136 168 207 N
+ AA Z HH s n/a 2 130 169 207 N
+ AA Z IH s n/a 2 130 169 215 N
+ AA Z IY b n/a 2 130 167 215 N
+ AA Z IY i n/a 2 136 168 215 N
+ AA Z IY s n/a 2 130 169 215 N
+ AA Z JH b n/a 2 130 167 214 N
+ AA Z JH s n/a 2 130 169 214 N
+ AA Z K b n/a 2 130 171 208 N
+ AA Z K i n/a 2 138 171 208 N
+ AA Z K s n/a 2 130 171 208 N
+ AA Z L b n/a 2 130 182 231 N
+ AA Z L i n/a 2 136 182 231 N
+ AA Z L s n/a 2 130 182 231 N
+ AA Z M b n/a 2 131 184 224 N
+ AA Z M i n/a 2 136 184 224 N
+ AA Z M s n/a 2 131 184 224 N
+ AA Z N b n/a 2 131 188 222 N
+ AA Z N i n/a 2 136 187 220 N
+ AA Z N s n/a 2 131 188 220 N
+ AA Z NG b n/a 2 131 184 222 N
+ AA Z NG i n/a 2 136 184 220 N
+ AA Z NG s n/a 2 131 184 220 N
+ AA Z OW s n/a 2 130 182 215 N
+ AA Z OY s n/a 2 130 169 215 N
+ AA Z P b n/a 2 130 172 210 N
+ AA Z P i n/a 2 138 172 210 N
+ AA Z P s n/a 2 130 172 210 N
+ AA Z R b n/a 2 130 197 227 N
+ AA Z R i n/a 2 136 197 227 N
+ AA Z R s n/a 2 130 197 227 N
+ AA Z S b n/a 2 130 167 206 N
+ AA Z S i n/a 2 136 168 206 N
+ AA Z S s n/a 2 130 169 206 N
+ AA Z SH b n/a 2 130 167 209 N
+ AA Z SH s n/a 2 130 169 209 N
+ AA Z SIL s n/a 2 130 169 207 N
+ AA Z T b n/a 2 130 171 215 N
+ AA Z T i n/a 2 138 171 215 N
+ AA Z T s n/a 2 130 171 215 N
+ AA Z TH b n/a 2 130 167 206 N
+ AA Z TH s n/a 2 130 169 206 N
+ AA Z UH s n/a 2 130 182 215 N
+ AA Z UW b n/a 2 130 182 215 N
+ AA Z UW s n/a 2 130 182 215 N
+ AA Z V b n/a 2 130 167 211 N
+ AA Z V i n/a 2 136 168 211 N
+ AA Z V s n/a 2 130 169 211 N
+ AA Z W b n/a 2 130 182 211 N
+ AA Z W i n/a 2 136 182 211 N
+ AA Z W s n/a 2 130 182 211 N
+ AA Z Y b n/a 2 130 167 213 N
+ AA Z Y s n/a 2 130 169 213 N
+ AA Z Z b n/a 2 130 167 219 N
+ AA Z Z i n/a 2 136 168 219 N
+ AA Z Z s n/a 2 130 169 219 N
+ AA Z ZH b n/a 2 130 167 219 N
+ AA Z ZH s n/a 2 130 169 219 N
+ AA ZH AA e n/a 2 130 182 215 N
+ AA ZH AA s n/a 2 130 182 215 N
+ AA ZH AE e n/a 2 130 168 215 N
+ AA ZH AE s n/a 2 130 169 215 N
+ AA ZH AH b n/a 2 130 167 215 N
+ AA ZH AH e n/a 2 130 168 215 N
+ AA ZH AH s n/a 2 130 169 215 N
+ AA ZH AO e n/a 2 130 182 215 N
+ AA ZH AO s n/a 2 130 182 215 N
+ AA ZH AW e n/a 2 130 182 215 N
+ AA ZH AW s n/a 2 130 182 215 N
+ AA ZH AY e n/a 2 130 168 215 N
+ AA ZH AY s n/a 2 130 169 215 N
+ AA ZH B b n/a 2 130 167 211 N
+ AA ZH B e n/a 2 130 168 211 N
+ AA ZH B s n/a 2 130 169 211 N
+ AA ZH CH b n/a 2 130 167 209 N
+ AA ZH CH e n/a 2 130 168 209 N
+ AA ZH CH s n/a 2 130 169 209 N
+ AA ZH D b n/a 2 130 168 213 N
+ AA ZH D e n/a 2 130 168 213 N
+ AA ZH D s n/a 2 130 169 213 N
+ AA ZH DH e n/a 2 130 168 218 N
+ AA ZH DH s n/a 2 130 169 218 N
+ AA ZH EH e n/a 2 130 168 215 N
+ AA ZH EH s n/a 2 130 169 215 N
+ AA ZH ER b n/a 2 130 197 215 N
+ AA ZH ER e n/a 2 130 197 215 N
+ AA ZH ER s n/a 2 130 197 215 N
+ AA ZH EY e n/a 2 130 168 215 N
+ AA ZH EY s n/a 2 130 169 215 N
+ AA ZH F b n/a 2 130 167 210 N
+ AA ZH F e n/a 2 130 168 210 N
+ AA ZH F s n/a 2 130 169 210 N
+ AA ZH G b n/a 2 130 167 217 N
+ AA ZH G e n/a 2 130 168 217 N
+ AA ZH G s n/a 2 130 169 217 N
+ AA ZH HH b n/a 2 130 167 207 N
+ AA ZH HH e n/a 2 130 168 207 N
+ AA ZH HH s n/a 2 130 169 207 N
+ AA ZH IH e n/a 2 130 168 215 N
+ AA ZH IH s n/a 2 130 169 215 N
+ AA ZH IY b n/a 2 130 167 215 N
+ AA ZH IY e n/a 2 130 168 215 N
+ AA ZH IY s n/a 2 130 169 215 N
+ AA ZH JH b n/a 2 130 167 214 N
+ AA ZH JH e n/a 2 130 168 214 N
+ AA ZH JH s n/a 2 130 169 214 N
+ AA ZH K b n/a 2 130 171 208 N
+ AA ZH K e n/a 2 130 171 208 N
+ AA ZH K i n/a 2 138 171 208 N
+ AA ZH K s n/a 2 130 171 208 N
+ AA ZH L b n/a 2 130 182 231 N
+ AA ZH L e n/a 2 130 182 231 N
+ AA ZH L i n/a 2 138 182 231 N
+ AA ZH L s n/a 2 130 182 231 N
+ AA ZH M b n/a 2 131 184 224 N
+ AA ZH M e n/a 2 131 184 224 N
+ AA ZH M s n/a 2 131 184 224 N
+ AA ZH N b n/a 2 131 188 222 N
+ AA ZH N e n/a 2 131 188 220 N
+ AA ZH N i n/a 2 138 187 220 N
+ AA ZH N s n/a 2 131 188 220 N
+ AA ZH NG b n/a 2 131 184 222 N
+ AA ZH NG e n/a 2 131 184 220 N
+ AA ZH NG i n/a 2 138 184 220 N
+ AA ZH NG s n/a 2 131 184 220 N
+ AA ZH OW e n/a 2 130 182 215 N
+ AA ZH OW s n/a 2 130 182 215 N
+ AA ZH OY e n/a 2 130 168 215 N
+ AA ZH OY s n/a 2 130 169 215 N
+ AA ZH P b n/a 2 130 172 210 N
+ AA ZH P e n/a 2 130 172 210 N
+ AA ZH P s n/a 2 130 172 210 N
+ AA ZH R b n/a 2 130 197 227 N
+ AA ZH R e n/a 2 130 197 227 N
+ AA ZH R i n/a 2 136 200 226 N
+ AA ZH R s n/a 2 130 197 227 N
+ AA ZH S b n/a 2 130 167 206 N
+ AA ZH S e n/a 2 130 168 206 N
+ AA ZH S s n/a 2 130 169 206 N
+ AA ZH SH b n/a 2 130 167 209 N
+ AA ZH SH e n/a 2 130 168 209 N
+ AA ZH SH s n/a 2 130 169 209 N
+ AA ZH SIL e n/a 2 130 168 207 N
+ AA ZH SIL s n/a 2 130 169 207 N
+ AA ZH T b n/a 2 130 171 215 N
+ AA ZH T e n/a 2 130 171 215 N
+ AA ZH T s n/a 2 130 171 215 N
+ AA ZH TH b n/a 2 130 167 206 N
+ AA ZH TH e n/a 2 130 168 206 N
+ AA ZH TH s n/a 2 130 169 206 N
+ AA ZH UH e n/a 2 130 182 215 N
+ AA ZH UH s n/a 2 130 182 215 N
+ AA ZH UW b n/a 2 130 182 215 N
+ AA ZH UW e n/a 2 130 182 215 N
+ AA ZH UW s n/a 2 130 182 215 N
+ AA ZH V b n/a 2 130 167 211 N
+ AA ZH V e n/a 2 130 168 211 N
+ AA ZH V s n/a 2 130 169 211 N
+ AA ZH W b n/a 2 130 182 211 N
+ AA ZH W e n/a 2 130 182 211 N
+ AA ZH W s n/a 2 130 182 211 N
+ AA ZH Y b n/a 2 130 167 213 N
+ AA ZH Y e n/a 2 130 168 213 N
+ AA ZH Y s n/a 2 130 169 213 N
+ AA ZH Z b n/a 2 130 167 219 N
+ AA ZH Z e n/a 2 130 168 219 N
+ AA ZH Z s n/a 2 130 169 219 N
+ AA ZH ZH b n/a 2 130 167 219 N
+ AA ZH ZH e n/a 2 130 168 219 N
+ AA ZH ZH i n/a 2 138 168 219 N
+ AA ZH ZH s n/a 2 130 169 219 N
+ AE AA AH b n/a 3 270 288 340 N
+ AE AA B b n/a 3 270 288 338 N
+ AE AA CH b n/a 3 270 303 342 N
+ AE AA D b n/a 3 270 315 340 N
+ AE AA ER b n/a 3 270 290 357 N
+ AE AA F b n/a 3 270 288 348 N
+ AE AA G b n/a 3 270 306 353 N
+ AE AA HH b n/a 3 270 288 339 N
+ AE AA JH b n/a 3 270 306 341 N
+ AE AA K b n/a 3 270 300 352 N
+ AE AA L b n/a 3 270 292 364 N
+ AE AA M b n/a 3 278 335 357 N
+ AE AA N b n/a 3 278 333 358 N
+ AE AA NG b n/a 3 278 333 360 N
+ AE AA OY b n/a 3 270 288 357 N
+ AE AA P b n/a 3 270 288 349 N
+ AE AA R b n/a 3 270 290 357 N
+ AE AA S b n/a 3 270 314 350 N
+ AE AA SH b n/a 3 270 288 351 N
+ AE AA T b n/a 3 270 310 343 N
+ AE AA TH b n/a 3 270 288 350 N
+ AE AA V b n/a 3 270 288 338 N
+ AE AA Z b n/a 3 270 311 346 N
+ AE AA ZH b n/a 3 270 288 340 N
+ AE AE AH b n/a 3 272 288 340 N
+ AE AE B b n/a 3 272 288 338 N
+ AE AE CH b n/a 3 272 304 342 N
+ AE AE D b n/a 3 272 315 340 N
+ AE AE ER b n/a 3 272 290 357 N
+ AE AE F b n/a 3 272 288 348 N
+ AE AE G b n/a 3 272 306 353 N
+ AE AE HH b n/a 3 272 288 339 N
+ AE AE JH b n/a 3 272 306 341 N
+ AE AE K b n/a 3 272 300 352 N
+ AE AE L b n/a 3 272 291 364 N
+ AE AE M b n/a 3 280 335 357 N
+ AE AE M i n/a 3 238 322 361 N
+ AE AE N b n/a 3 280 333 358 N
+ AE AE NG b n/a 3 280 333 360 N
+ AE AE OY b n/a 3 272 288 357 N
+ AE AE P b n/a 3 272 288 349 N
+ AE AE R b n/a 3 272 290 357 N
+ AE AE S b n/a 3 272 314 350 N
+ AE AE SH b n/a 3 272 288 351 N
+ AE AE T b n/a 3 272 309 343 N
+ AE AE TH b n/a 3 272 288 350 N
+ AE AE V b n/a 3 272 288 338 N
+ AE AE Z b n/a 3 272 311 346 N
+ AE AE ZH b n/a 3 272 288 340 N
+ AE AH AH b n/a 3 272 288 340 N
+ AE AH B b n/a 3 272 288 338 N
+ AE AH CH b n/a 3 272 304 342 N
+ AE AH D b n/a 3 272 315 340 N
+ AE AH ER b n/a 3 272 290 357 N
+ AE AH F b n/a 3 272 288 348 N
+ AE AH G b n/a 3 272 306 353 N
+ AE AH HH b n/a 3 272 288 339 N
+ AE AH JH b n/a 3 272 306 341 N
+ AE AH K b n/a 3 272 300 352 N
+ AE AH L b n/a 3 272 291 364 N
+ AE AH M b n/a 3 280 335 357 N
+ AE AH N b n/a 3 280 333 358 N
+ AE AH N i n/a 3 238 320 354 N
+ AE AH NG b n/a 3 280 333 360 N
+ AE AH NG i n/a 3 238 329 360 N
+ AE AH OY b n/a 3 272 288 357 N
+ AE AH P b n/a 3 272 288 349 N
+ AE AH R b n/a 3 272 290 357 N
+ AE AH S b n/a 3 272 314 350 N
+ AE AH SH b n/a 3 272 288 351 N
+ AE AH T b n/a 3 272 309 343 N
+ AE AH TH b n/a 3 272 288 350 N
+ AE AH V b n/a 3 272 288 338 N
+ AE AH Z b n/a 3 272 311 346 N
+ AE AH ZH b n/a 3 272 288 340 N
+ AE AO AH b n/a 3 270 288 340 N
+ AE AO B b n/a 3 270 288 338 N
+ AE AO CH b n/a 3 270 303 342 N
+ AE AO D b n/a 3 270 315 340 N
+ AE AO ER b n/a 3 270 290 357 N
+ AE AO F b n/a 3 270 288 348 N
+ AE AO G b n/a 3 270 306 353 N
+ AE AO HH b n/a 3 270 288 339 N
+ AE AO JH b n/a 3 270 306 341 N
+ AE AO K b n/a 3 270 300 352 N
+ AE AO L b n/a 3 270 292 364 N
+ AE AO M b n/a 3 278 335 357 N
+ AE AO N b n/a 3 278 333 358 N
+ AE AO N i n/a 3 257 327 354 N
+ AE AO NG b n/a 3 278 333 360 N
+ AE AO OY b n/a 3 270 288 357 N
+ AE AO P b n/a 3 270 288 349 N
+ AE AO R b n/a 3 270 290 357 N
+ AE AO S b n/a 3 270 314 350 N
+ AE AO SH b n/a 3 270 288 351 N
+ AE AO T b n/a 3 270 310 343 N
+ AE AO TH b n/a 3 270 288 350 N
+ AE AO V b n/a 3 270 288 338 N
+ AE AO Z b n/a 3 270 311 346 N
+ AE AO ZH b n/a 3 270 288 340 N
+ AE AW AH b n/a 3 270 288 340 N
+ AE AW B b n/a 3 270 288 338 N
+ AE AW CH b n/a 3 270 303 342 N
+ AE AW D b n/a 3 270 315 340 N
+ AE AW ER b n/a 3 270 290 357 N
+ AE AW F b n/a 3 270 288 348 N
+ AE AW G b n/a 3 270 306 353 N
+ AE AW HH b n/a 3 270 288 339 N
+ AE AW JH b n/a 3 270 306 341 N
+ AE AW K b n/a 3 270 300 352 N
+ AE AW K i n/a 3 262 299 352 N
+ AE AW L b n/a 3 270 292 364 N
+ AE AW M b n/a 3 278 335 357 N
+ AE AW N b n/a 3 278 333 358 N
+ AE AW NG b n/a 3 278 333 360 N
+ AE AW OY b n/a 3 270 288 357 N
+ AE AW P b n/a 3 270 288 349 N
+ AE AW R b n/a 3 270 290 357 N
+ AE AW S b n/a 3 270 314 350 N
+ AE AW SH b n/a 3 270 288 351 N
+ AE AW T b n/a 3 270 310 343 N
+ AE AW TH b n/a 3 270 288 350 N
+ AE AW V b n/a 3 270 288 338 N
+ AE AW Z b n/a 3 270 311 346 N
+ AE AW ZH b n/a 3 270 288 340 N
+ AE AY AH b n/a 3 273 286 340 N
+ AE AY B b n/a 3 273 286 338 N
+ AE AY B i n/a 3 240 286 338 N
+ AE AY CH b n/a 3 273 304 342 N
+ AE AY D b n/a 3 273 315 340 N
+ AE AY D i n/a 3 240 304 340 N
+ AE AY ER b n/a 3 273 290 357 N
+ AE AY F b n/a 3 273 287 348 N
+ AE AY F i n/a 3 240 294 348 N
+ AE AY G b n/a 3 273 306 353 N
+ AE AY G i n/a 3 240 306 353 N
+ AE AY HH b n/a 3 273 287 339 N
+ AE AY JH b n/a 3 273 306 341 N
+ AE AY K b n/a 3 273 300 352 N
+ AE AY K i n/a 3 240 299 352 N
+ AE AY L b n/a 3 273 291 364 N
+ AE AY L i n/a 3 240 291 364 N
+ AE AY M b n/a 3 282 335 357 N
+ AE AY M i n/a 3 238 322 361 N
+ AE AY N b n/a 3 281 334 358 N
+ AE AY N i n/a 3 238 320 354 N
+ AE AY NG b n/a 3 281 334 360 N
+ AE AY NG i n/a 3 238 329 360 N
+ AE AY OY b n/a 3 273 286 357 N
+ AE AY P b n/a 3 273 287 349 N
+ AE AY P i n/a 3 240 286 349 N
+ AE AY R b n/a 3 273 290 357 N
+ AE AY S b n/a 3 273 314 350 N
+ AE AY S i n/a 3 240 294 350 N
+ AE AY SH b n/a 3 273 287 351 N
+ AE AY T b n/a 3 273 309 343 N
+ AE AY T i n/a 3 240 304 339 N
+ AE AY TH b n/a 3 273 287 350 N
+ AE AY TH i n/a 3 240 294 350 N
+ AE AY V b n/a 3 273 286 338 N
+ AE AY Z b n/a 3 273 311 346 N
+ AE AY Z i n/a 3 240 286 347 N
+ AE AY ZH b n/a 3 273 286 340 N
+ AE B AA i n/a 3 236 290 361 N
+ AE B AH b n/a 3 268 288 340 N
+ AE B B b n/a 3 268 288 338 N
+ AE B B i n/a 3 236 286 338 N
+ AE B CH b n/a 3 268 304 342 N
+ AE B CH i n/a 3 236 304 342 N
+ AE B D b n/a 3 268 315 340 N
+ AE B D i n/a 3 236 304 340 N
+ AE B DH i n/a 3 236 286 338 N
+ AE B ER b n/a 3 268 290 357 N
+ AE B ER i n/a 3 236 290 362 N
+ AE B F b n/a 3 268 288 348 N
+ AE B F i n/a 3 236 294 348 N
+ AE B G b n/a 3 268 306 353 N
+ AE B G i n/a 3 236 306 353 N
+ AE B HH b n/a 3 268 288 339 N
+ AE B HH i n/a 3 236 286 339 N
+ AE B JH b n/a 3 268 306 341 N
+ AE B JH i n/a 3 236 306 341 N
+ AE B K b n/a 3 268 300 352 N
+ AE B K i n/a 3 236 299 352 N
+ AE B L b n/a 3 268 292 364 N
+ AE B L i n/a 3 236 292 364 N
+ AE B M b n/a 3 277 335 357 N
+ AE B M i n/a 3 242 322 361 N
+ AE B N b n/a 3 277 332 358 N
+ AE B N i n/a 3 242 320 355 N
+ AE B NG b n/a 3 277 333 360 N
+ AE B NG i n/a 3 242 329 360 N
+ AE B OY b n/a 3 268 288 357 N
+ AE B P b n/a 3 268 288 349 N
+ AE B P i n/a 3 236 286 349 N
+ AE B R b n/a 3 268 290 357 N
+ AE B R i n/a 3 236 290 362 N
+ AE B S b n/a 3 268 314 350 N
+ AE B S i n/a 3 236 294 350 N
+ AE B SH b n/a 3 268 288 351 N
+ AE B SH i n/a 3 236 294 351 N
+ AE B T b n/a 3 265 310 343 N
+ AE B T i n/a 3 236 304 339 N
+ AE B TH b n/a 3 268 288 350 N
+ AE B TH i n/a 3 236 294 350 N
+ AE B V b n/a 3 268 288 338 N
+ AE B V i n/a 3 236 286 338 N
+ AE B Z b n/a 3 267 311 346 N
+ AE B Z i n/a 3 236 286 347 N
+ AE B ZH b n/a 3 268 288 340 N
+ AE CH AH b n/a 3 268 288 340 N
+ AE CH AO i n/a 3 247 290 361 N
+ AE CH B b n/a 3 268 288 338 N
+ AE CH B i n/a 3 248 286 338 N
+ AE CH CH b n/a 3 268 303 342 N
+ AE CH D b n/a 3 268 315 340 N
+ AE CH D i n/a 3 248 304 340 N
+ AE CH ER b n/a 3 268 290 357 N
+ AE CH F b n/a 3 268 288 348 N
+ AE CH F i n/a 3 248 294 348 N
+ AE CH G b n/a 3 268 306 353 N
+ AE CH G i n/a 3 248 306 353 N
+ AE CH HH b n/a 3 268 288 339 N
+ AE CH JH b n/a 3 268 306 341 N
+ AE CH JH i n/a 3 247 306 341 N
+ AE CH K b n/a 3 268 300 352 N
+ AE CH K i n/a 3 247 299 352 N
+ AE CH L b n/a 3 268 291 364 N
+ AE CH L i n/a 3 247 291 364 N
+ AE CH M b n/a 3 276 335 357 N
+ AE CH M i n/a 3 254 322 361 N
+ AE CH N b n/a 3 276 332 358 N
+ AE CH N i n/a 3 254 320 354 N
+ AE CH NG b n/a 3 276 333 360 N
+ AE CH NG i n/a 3 254 329 360 N
+ AE CH OY b n/a 3 268 288 357 N
+ AE CH P b n/a 3 268 288 349 N
+ AE CH P i n/a 3 248 286 349 N
+ AE CH R b n/a 3 268 290 357 N
+ AE CH R i n/a 3 247 290 362 N
+ AE CH S b n/a 3 268 314 350 N
+ AE CH S i n/a 3 247 294 350 N
+ AE CH SH b n/a 3 268 288 351 N
+ AE CH T b n/a 3 265 309 343 N
+ AE CH T i n/a 3 248 303 339 N
+ AE CH TH b n/a 3 268 288 350 N
+ AE CH V b n/a 3 268 288 338 N
+ AE CH V i n/a 3 248 286 338 N
+ AE CH Z b n/a 3 267 311 346 N
+ AE CH Z i n/a 3 247 286 347 N
+ AE CH ZH b n/a 3 268 288 340 N
+ AE D AH b n/a 3 268 288 340 N
+ AE D AW i n/a 3 241 290 340 N
+ AE D B b n/a 3 268 288 338 N
+ AE D B i n/a 3 241 286 338 N
+ AE D CH b n/a 3 268 304 342 N
+ AE D D b n/a 3 268 315 340 N
+ AE D D i n/a 3 241 304 340 N
+ AE D ER b n/a 3 268 290 357 N
+ AE D F b n/a 3 268 288 348 N
+ AE D F i n/a 3 241 294 348 N
+ AE D G b n/a 3 268 306 353 N
+ AE D G i n/a 3 241 306 353 N
+ AE D HH b n/a 3 268 288 339 N
+ AE D HH i n/a 3 241 286 339 N
+ AE D JH b n/a 3 268 306 341 N
+ AE D K b n/a 3 268 300 352 N
+ AE D K i n/a 3 241 299 352 N
+ AE D L b n/a 3 268 291 364 N
+ AE D L i n/a 3 241 291 364 N
+ AE D M b n/a 3 277 335 357 N
+ AE D M i n/a 3 239 322 361 N
+ AE D N b n/a 3 277 332 358 N
+ AE D N i n/a 3 239 320 354 N
+ AE D NG b n/a 3 277 333 360 N
+ AE D NG i n/a 3 239 329 360 N
+ AE D OY b n/a 3 268 288 357 N
+ AE D P b n/a 3 268 288 349 N
+ AE D P i n/a 3 241 286 349 N
+ AE D R b n/a 3 268 290 357 N
+ AE D R i n/a 3 241 290 362 N
+ AE D S b n/a 3 268 314 350 N
+ AE D S i n/a 3 241 294 350 N
+ AE D SH b n/a 3 268 288 351 N
+ AE D SH i n/a 3 241 294 351 N
+ AE D T b n/a 3 265 310 343 N
+ AE D T i n/a 3 239 304 339 N
+ AE D TH b n/a 3 268 288 350 N
+ AE D UH i n/a 3 241 290 361 N
+ AE D V b n/a 3 268 288 338 N
+ AE D V i n/a 3 241 286 338 N
+ AE D W i n/a 3 241 291 364 N
+ AE D Z b n/a 3 267 311 346 N
+ AE D Z i n/a 3 241 286 347 N
+ AE D ZH b n/a 3 268 288 340 N
+ AE D ZH i n/a 3 241 286 340 N
+ AE DH AH b n/a 3 269 288 340 N
+ AE DH B b n/a 3 269 308 338 N
+ AE DH CH b n/a 3 269 308 342 N
+ AE DH D b n/a 3 269 315 340 N
+ AE DH ER b n/a 3 269 290 357 N
+ AE DH F b n/a 3 269 288 348 N
+ AE DH G b n/a 3 269 308 353 N
+ AE DH HH b n/a 3 269 288 342 N
+ AE DH JH b n/a 3 269 308 341 N
+ AE DH K b n/a 3 269 300 352 N
+ AE DH L b n/a 3 269 291 364 N
+ AE DH M b n/a 3 277 335 357 N
+ AE DH N b n/a 3 277 332 358 N
+ AE DH N i n/a 3 243 323 356 N
+ AE DH NG b n/a 3 277 333 360 N
+ AE DH OY b n/a 3 269 288 357 N
+ AE DH P b n/a 3 269 308 349 N
+ AE DH R b n/a 3 269 290 357 N
+ AE DH S b n/a 3 269 314 350 N
+ AE DH SH b n/a 3 269 288 351 N
+ AE DH T b n/a 3 265 310 343 N
+ AE DH T i n/a 3 237 308 342 N
+ AE DH TH b n/a 3 269 288 350 N
+ AE DH V b n/a 3 269 288 338 N
+ AE DH Z b n/a 3 267 311 346 N
+ AE DH ZH b n/a 3 269 288 340 N
+ AE EH AH b n/a 3 272 288 340 N
+ AE EH B b n/a 3 272 288 338 N
+ AE EH CH b n/a 3 272 304 342 N
+ AE EH D b n/a 3 272 315 340 N
+ AE EH ER b n/a 3 272 290 357 N
+ AE EH F b n/a 3 272 288 348 N
+ AE EH G b n/a 3 272 306 353 N
+ AE EH HH b n/a 3 272 288 339 N
+ AE EH JH b n/a 3 272 306 341 N
+ AE EH K b n/a 3 272 300 352 N
+ AE EH K i n/a 3 240 299 352 N
+ AE EH L b n/a 3 272 291 364 N
+ AE EH M b n/a 3 280 335 357 N
+ AE EH N b n/a 3 280 333 358 N
+ AE EH N i n/a 3 238 320 354 N
+ AE EH NG b n/a 3 280 333 360 N
+ AE EH OY b n/a 3 272 288 357 N
+ AE EH P b n/a 3 272 288 349 N
+ AE EH R b n/a 3 272 290 357 N
+ AE EH S b n/a 3 272 314 350 N
+ AE EH SH b n/a 3 272 288 351 N
+ AE EH T b n/a 3 272 309 343 N
+ AE EH TH b n/a 3 272 288 350 N
+ AE EH V b n/a 3 272 288 338 N
+ AE EH Z b n/a 3 272 311 346 N
+ AE EH ZH b n/a 3 272 288 340 N
+ AE ER AH b n/a 3 272 288 340 N
+ AE ER B b n/a 3 272 288 338 N
+ AE ER B i n/a 3 264 286 338 N
+ AE ER CH b n/a 3 272 303 342 N
+ AE ER CH i n/a 3 264 303 342 N
+ AE ER D b n/a 3 272 315 340 N
+ AE ER D i n/a 3 264 303 340 N
+ AE ER ER b n/a 3 272 290 357 N
+ AE ER F b n/a 3 272 288 348 N
+ AE ER F i n/a 3 264 297 348 N
+ AE ER G b n/a 3 272 306 353 N
+ AE ER G i n/a 3 264 306 353 N
+ AE ER HH b n/a 3 272 288 339 N
+ AE ER JH b n/a 3 272 306 341 N
+ AE ER JH i n/a 3 264 306 341 N
+ AE ER K b n/a 3 272 300 352 N
+ AE ER K i n/a 3 264 299 352 N
+ AE ER L b n/a 3 272 292 364 N
+ AE ER L i n/a 3 264 292 364 N
+ AE ER M b n/a 3 280 335 357 N
+ AE ER M i n/a 3 257 322 361 N
+ AE ER N b n/a 3 280 333 358 N
+ AE ER N i n/a 3 257 321 356 N
+ AE ER NG b n/a 3 280 333 360 N
+ AE ER NG i n/a 3 261 329 360 N
+ AE ER OY b n/a 3 272 288 357 N
+ AE ER P b n/a 3 272 288 349 N
+ AE ER P i n/a 3 264 286 349 N
+ AE ER R b n/a 3 272 290 357 N
+ AE ER R i n/a 3 264 290 362 N
+ AE ER S b n/a 3 272 314 350 N
+ AE ER S i n/a 3 264 297 350 N
+ AE ER SH b n/a 3 272 288 351 N
+ AE ER SH i n/a 3 264 297 351 N
+ AE ER T b n/a 3 272 310 343 N
+ AE ER T i n/a 3 264 303 339 N
+ AE ER TH b n/a 3 272 288 350 N
+ AE ER V b n/a 3 272 288 338 N
+ AE ER Z b n/a 3 272 311 346 N
+ AE ER Z i n/a 3 264 286 347 N
+ AE ER ZH b n/a 3 272 288 340 N
+ AE EY AH b n/a 3 275 286 340 N
+ AE EY B b n/a 3 275 286 338 N
+ AE EY CH b n/a 3 275 304 342 N
+ AE EY D b n/a 3 275 315 340 N
+ AE EY D i n/a 3 240 304 340 N
+ AE EY ER b n/a 3 275 290 357 N
+ AE EY F b n/a 3 275 287 348 N
+ AE EY G b n/a 3 275 306 353 N
+ AE EY HH b n/a 3 275 287 339 N
+ AE EY JH b n/a 3 275 306 341 N
+ AE EY K b n/a 3 275 300 352 N
+ AE EY L b n/a 3 275 291 364 N
+ AE EY M b n/a 3 281 335 357 N
+ AE EY M i n/a 3 238 322 361 N
+ AE EY N b n/a 3 281 334 358 N
+ AE EY N i n/a 3 238 321 354 N
+ AE EY NG b n/a 3 281 334 360 N
+ AE EY OY b n/a 3 275 286 357 N
+ AE EY P b n/a 3 275 287 349 N
+ AE EY R b n/a 3 275 290 357 N
+ AE EY S b n/a 3 275 314 350 N
+ AE EY SH b n/a 3 275 287 351 N
+ AE EY T b n/a 3 274 309 343 N
+ AE EY TH b n/a 3 275 287 350 N
+ AE EY V b n/a 3 275 286 338 N
+ AE EY Z b n/a 3 273 311 346 N
+ AE EY ZH b n/a 3 275 286 340 N
+ AE F AH b n/a 3 269 288 340 N
+ AE F AO i n/a 3 233 290 361 N
+ AE F B b n/a 3 269 288 338 N
+ AE F B i n/a 3 233 286 338 N
+ AE F CH b n/a 3 269 303 342 N
+ AE F CH i n/a 3 233 303 342 N
+ AE F D b n/a 3 269 315 340 N
+ AE F D i n/a 3 233 304 340 N
+ AE F DH i n/a 3 233 286 338 N
+ AE F ER b n/a 3 269 290 357 N
+ AE F ER i n/a 3 233 290 362 N
+ AE F F b n/a 3 269 288 348 N
+ AE F F i n/a 3 233 294 348 N
+ AE F G b n/a 3 269 306 353 N
+ AE F G i n/a 3 233 306 353 N
+ AE F HH b n/a 3 269 288 339 N
+ AE F HH i n/a 3 233 286 339 N
+ AE F JH b n/a 3 269 306 341 N
+ AE F JH i n/a 3 233 306 341 N
+ AE F K b n/a 3 269 300 352 N
+ AE F K i n/a 3 233 299 352 N
+ AE F L b n/a 3 269 291 364 N
+ AE F L i n/a 3 233 291 364 N
+ AE F M b n/a 3 277 335 357 N
+ AE F M i n/a 3 252 322 361 N
+ AE F N b n/a 3 276 332 358 N
+ AE F N i n/a 3 252 320 354 N
+ AE F NG b n/a 3 277 333 360 N
+ AE F NG i n/a 3 252 329 360 N
+ AE F OY b n/a 3 269 288 357 N
+ AE F P b n/a 3 269 288 349 N
+ AE F R b n/a 3 269 290 357 N
+ AE F R i n/a 3 233 290 362 N
+ AE F S b n/a 3 269 314 350 N
+ AE F S i n/a 3 233 294 350 N
+ AE F SH b n/a 3 269 288 351 N
+ AE F SH i n/a 3 233 294 351 N
+ AE F T b n/a 3 265 310 343 N
+ AE F T i n/a 3 233 303 339 N
+ AE F TH b n/a 3 269 288 350 N
+ AE F TH i n/a 3 233 294 350 N
+ AE F V b n/a 3 269 288 338 N
+ AE F V i n/a 3 233 286 338 N
+ AE F Z b n/a 3 267 311 346 N
+ AE F Z i n/a 3 233 286 347 N
+ AE F ZH b n/a 3 269 288 340 N
+ AE G AH b n/a 3 268 286 340 N
+ AE G AO i n/a 3 240 290 361 N
+ AE G B b n/a 3 268 286 338 N
+ AE G B i n/a 3 240 286 338 N
+ AE G CH b n/a 3 268 304 342 N
+ AE G CH i n/a 3 240 304 342 N
+ AE G D b n/a 3 268 315 340 N
+ AE G D i n/a 3 240 304 340 N
+ AE G DH i n/a 3 240 286 338 N
+ AE G ER b n/a 3 268 290 357 N
+ AE G F b n/a 3 268 287 348 N
+ AE G F i n/a 3 240 294 348 N
+ AE G G b n/a 3 268 306 353 N
+ AE G G i n/a 3 240 306 353 N
+ AE G HH b n/a 3 268 287 339 N
+ AE G HH i n/a 3 240 286 339 N
+ AE G JH b n/a 3 268 306 341 N
+ AE G JH i n/a 3 240 306 341 N
+ AE G K b n/a 3 268 300 352 N
+ AE G K i n/a 3 240 299 352 N
+ AE G L b n/a 3 268 291 364 N
+ AE G L i n/a 3 240 291 364 N
+ AE G M b n/a 3 277 335 357 N
+ AE G M i n/a 3 238 325 361 N
+ AE G N b n/a 3 277 332 358 N
+ AE G N i n/a 3 238 324 356 N
+ AE G NG b n/a 3 277 333 360 N
+ AE G NG i n/a 3 238 329 360 N
+ AE G OY b n/a 3 268 286 357 N
+ AE G P b n/a 3 268 287 349 N
+ AE G P i n/a 3 240 286 349 N
+ AE G R b n/a 3 268 290 357 N
+ AE G R i n/a 3 240 290 362 N
+ AE G S b n/a 3 268 314 350 N
+ AE G S i n/a 3 240 294 350 N
+ AE G SH b n/a 3 268 287 351 N
+ AE G SH i n/a 3 240 294 351 N
+ AE G T b n/a 3 266 309 343 N
+ AE G T i n/a 3 240 304 339 N
+ AE G TH b n/a 3 268 287 350 N
+ AE G TH i n/a 3 240 294 350 N
+ AE G V b n/a 3 268 286 338 N
+ AE G V i n/a 3 240 286 338 N
+ AE G Z b n/a 3 267 311 346 N
+ AE G Z i n/a 3 240 286 347 N
+ AE G ZH b n/a 3 268 286 340 N
+ AE HH AH b n/a 3 269 317 346 N
+ AE HH B b n/a 3 269 316 338 N
+ AE HH B i n/a 3 244 316 338 N
+ AE HH CH b n/a 3 269 316 343 N
+ AE HH CH i n/a 3 244 316 344 N
+ AE HH D b n/a 3 269 315 345 N
+ AE HH D i n/a 3 246 313 345 N
+ AE HH EH i n/a 3 244 317 347 N
+ AE HH ER b n/a 3 269 317 357 N
+ AE HH F b n/a 3 269 317 348 N
+ AE HH F i n/a 3 244 317 348 N
+ AE HH G b n/a 3 269 317 353 N
+ AE HH G i n/a 3 244 317 353 N
+ AE HH HH b n/a 3 269 316 346 N
+ AE HH HH i n/a 3 244 316 347 N
+ AE HH JH b n/a 3 269 316 343 N
+ AE HH JH i n/a 3 244 316 344 N
+ AE HH K b n/a 3 269 316 352 N
+ AE HH K i n/a 3 244 316 352 N
+ AE HH L b n/a 3 269 317 364 N
+ AE HH L i n/a 3 244 317 364 N
+ AE HH M b n/a 3 276 335 357 N
+ AE HH M i n/a 3 255 326 361 N
+ AE HH N b n/a 3 276 332 358 N
+ AE HH N i n/a 3 255 326 355 N
+ AE HH NG b n/a 3 276 333 360 N
+ AE HH NG i n/a 3 253 329 360 N
+ AE HH OY b n/a 3 269 317 357 N
+ AE HH P b n/a 3 269 316 349 N
+ AE HH P i n/a 3 244 316 349 N
+ AE HH R b n/a 3 269 317 357 N
+ AE HH R i n/a 3 244 317 362 N
+ AE HH S b n/a 3 269 314 350 N
+ AE HH S i n/a 3 244 314 350 N
+ AE HH SH b n/a 3 269 316 351 N
+ AE HH SH i n/a 3 244 316 351 N
+ AE HH T b n/a 3 265 309 343 N
+ AE HH T i n/a 3 244 314 344 N
+ AE HH TH b n/a 3 269 316 350 N
+ AE HH TH i n/a 3 244 316 350 N
+ AE HH V b n/a 3 269 318 336 N
+ AE HH V i n/a 3 245 318 336 N
+ AE HH W i n/a 3 244 316 364 N
+ AE HH Z b n/a 3 267 311 346 N
+ AE HH Z i n/a 3 245 319 347 N
+ AE HH ZH b n/a 3 269 318 346 N
+ AE IH AH b n/a 3 272 288 340 N
+ AE IH B b n/a 3 272 288 338 N
+ AE IH CH b n/a 3 272 304 342 N
+ AE IH D b n/a 3 272 315 340 N
+ AE IH ER b n/a 3 272 290 357 N
+ AE IH F b n/a 3 272 288 348 N
+ AE IH G b n/a 3 272 306 353 N
+ AE IH HH b n/a 3 272 288 339 N
+ AE IH JH b n/a 3 272 306 341 N
+ AE IH K b n/a 3 272 300 352 N
+ AE IH L b n/a 3 272 291 364 N
+ AE IH M b n/a 3 279 335 357 N
+ AE IH N b n/a 3 279 333 358 N
+ AE IH NG b n/a 3 279 333 360 N
+ AE IH OY b n/a 3 272 288 357 N
+ AE IH P b n/a 3 272 288 349 N
+ AE IH P i n/a 3 240 286 349 N
+ AE IH R b n/a 3 272 290 357 N
+ AE IH S b n/a 3 272 314 350 N
+ AE IH S i n/a 3 240 294 350 N
+ AE IH SH b n/a 3 272 288 351 N
+ AE IH T b n/a 3 272 309 343 N
+ AE IH TH b n/a 3 272 288 350 N
+ AE IH V b n/a 3 272 288 338 N
+ AE IH Z b n/a 3 272 311 346 N
+ AE IH ZH b n/a 3 272 288 340 N
+ AE IY AH b n/a 3 275 286 340 N
+ AE IY B b n/a 3 275 286 338 N
+ AE IY B i n/a 3 240 286 338 N
+ AE IY CH b n/a 3 275 304 342 N
+ AE IY D b n/a 3 275 315 340 N
+ AE IY D i n/a 3 240 304 340 N
+ AE IY ER b n/a 3 275 290 357 N
+ AE IY F b n/a 3 275 287 348 N
+ AE IY F i n/a 3 240 294 348 N
+ AE IY G b n/a 3 275 306 353 N
+ AE IY G i n/a 3 240 306 353 N
+ AE IY HH b n/a 3 275 287 339 N
+ AE IY JH b n/a 3 275 306 341 N
+ AE IY JH i n/a 3 240 306 341 N
+ AE IY K b n/a 3 275 300 352 N
+ AE IY K i n/a 3 240 299 352 N
+ AE IY L b n/a 3 275 291 364 N
+ AE IY L i n/a 3 240 291 364 N
+ AE IY M b n/a 3 282 335 357 N
+ AE IY M i n/a 3 238 322 361 N
+ AE IY N b n/a 3 281 334 358 N
+ AE IY N i n/a 3 238 321 354 N
+ AE IY NG b n/a 3 281 334 360 N
+ AE IY NG i n/a 3 238 329 360 N
+ AE IY OY b n/a 3 275 286 357 N
+ AE IY P b n/a 3 275 287 349 N
+ AE IY P i n/a 3 240 286 349 N
+ AE IY R b n/a 3 275 290 357 N
+ AE IY S b n/a 3 275 314 350 N
+ AE IY S i n/a 3 240 294 350 N
+ AE IY SH b n/a 3 275 287 351 N
+ AE IY T b n/a 3 274 309 343 N
+ AE IY T i n/a 3 240 304 339 N
+ AE IY TH b n/a 3 275 287 350 N
+ AE IY TH i n/a 3 240 294 350 N
+ AE IY V b n/a 3 275 286 338 N
+ AE IY Z b n/a 3 273 311 346 N
+ AE IY Z i n/a 3 240 286 347 N
+ AE IY ZH b n/a 3 275 286 340 N
+ AE JH AA i n/a 3 241 290 361 N
+ AE JH AH b n/a 3 268 288 340 N
+ AE JH B b n/a 3 268 288 338 N
+ AE JH B i n/a 3 241 286 338 N
+ AE JH CH b n/a 3 268 304 342 N
+ AE JH D b n/a 3 268 315 340 N
+ AE JH D i n/a 3 241 304 340 N
+ AE JH ER b n/a 3 268 290 357 N
+ AE JH F b n/a 3 268 288 348 N
+ AE JH F i n/a 3 241 294 348 N
+ AE JH G b n/a 3 268 306 353 N
+ AE JH G i n/a 3 241 306 353 N
+ AE JH HH b n/a 3 268 288 339 N
+ AE JH HH i n/a 3 241 286 339 N
+ AE JH JH b n/a 3 268 306 341 N
+ AE JH K b n/a 3 268 300 352 N
+ AE JH K i n/a 3 241 299 352 N
+ AE JH L b n/a 3 268 291 364 N
+ AE JH L i n/a 3 241 291 364 N
+ AE JH M b n/a 3 276 335 357 N
+ AE JH M i n/a 3 239 322 361 N
+ AE JH N b n/a 3 276 332 358 N
+ AE JH N i n/a 3 239 320 354 N
+ AE JH NG b n/a 3 276 333 360 N
+ AE JH NG i n/a 3 239 329 360 N
+ AE JH OY b n/a 3 268 288 357 N
+ AE JH P b n/a 3 268 288 349 N
+ AE JH P i n/a 3 241 286 349 N
+ AE JH R b n/a 3 268 290 357 N
+ AE JH R i n/a 3 241 290 362 N
+ AE JH S b n/a 3 268 314 350 N
+ AE JH S i n/a 3 241 294 350 N
+ AE JH SH b n/a 3 268 288 351 N
+ AE JH T b n/a 3 265 309 343 N
+ AE JH T i n/a 3 241 304 339 N
+ AE JH TH b n/a 3 268 288 350 N
+ AE JH V b n/a 3 268 288 338 N
+ AE JH V i n/a 3 241 286 338 N
+ AE JH Z b n/a 3 267 311 346 N
+ AE JH Z i n/a 3 241 286 347 N
+ AE JH ZH b n/a 3 268 288 340 N
+ AE K AA e n/a 3 249 290 361 N
+ AE K AE e n/a 3 249 286 340 N
+ AE K AH b n/a 3 268 286 340 N
+ AE K AH e n/a 3 249 286 340 N
+ AE K AH i n/a 3 249 286 340 N
+ AE K AO e n/a 3 249 290 361 N
+ AE K AW e n/a 3 249 290 340 N
+ AE K AW i n/a 3 249 290 340 N
+ AE K AY e n/a 3 249 286 361 N
+ AE K B b n/a 3 268 286 338 N
+ AE K B e n/a 3 249 286 338 N
+ AE K B i n/a 3 249 286 338 N
+ AE K CH b n/a 3 268 303 342 N
+ AE K CH e n/a 3 249 303 342 N
+ AE K CH i n/a 3 249 303 342 N
+ AE K D b n/a 3 268 315 340 N
+ AE K D e n/a 3 249 303 340 N
+ AE K D i n/a 3 249 303 340 N
+ AE K DH e n/a 3 249 286 338 N
+ AE K DH i n/a 3 249 286 338 N
+ AE K EH e n/a 3 249 286 340 N
+ AE K ER b n/a 3 268 290 357 N
+ AE K ER e n/a 3 249 290 362 N
+ AE K ER i n/a 3 249 290 362 N
+ AE K EY e n/a 3 249 286 340 N
+ AE K F b n/a 3 268 287 348 N
+ AE K F e n/a 3 249 296 348 N
+ AE K F i n/a 3 249 296 348 N
+ AE K G b n/a 3 268 306 353 N
+ AE K G e n/a 3 249 306 353 N
+ AE K G i n/a 3 249 306 353 N
+ AE K HH b n/a 3 268 287 339 N
+ AE K HH e n/a 3 249 287 339 N
+ AE K HH i n/a 3 249 287 339 N
+ AE K IH e n/a 3 249 286 340 N
+ AE K IY e n/a 3 249 286 340 N
+ AE K JH b n/a 3 268 306 341 N
+ AE K JH e n/a 3 249 306 341 N
+ AE K K b n/a 3 268 300 352 N
+ AE K K e n/a 3 249 300 352 N
+ AE K K i n/a 3 249 300 352 N
+ AE K L b n/a 3 268 293 363 N
+ AE K L e n/a 3 249 293 363 N
+ AE K L i n/a 3 249 293 363 N
+ AE K M b n/a 3 277 335 357 N
+ AE K M e n/a 3 254 335 361 N
+ AE K M i n/a 3 254 325 361 N
+ AE K N b n/a 3 277 332 358 N
+ AE K N e n/a 3 254 332 358 N
+ AE K N i n/a 3 254 325 357 N
+ AE K NG b n/a 3 277 333 360 N
+ AE K NG e n/a 3 253 333 360 N
+ AE K NG i n/a 3 253 329 360 N
+ AE K OW e n/a 3 249 290 361 N
+ AE K OY b n/a 3 268 286 357 N
+ AE K OY e n/a 3 249 286 361 N
+ AE K P b n/a 3 268 287 349 N
+ AE K P e n/a 3 249 287 349 N
+ AE K P i n/a 3 249 287 349 N
+ AE K R b n/a 3 268 290 357 N
+ AE K R e n/a 3 249 290 362 N
+ AE K R i n/a 3 249 290 362 N
+ AE K S b n/a 3 268 314 350 N
+ AE K S e n/a 3 249 296 350 N
+ AE K S i n/a 3 249 296 350 N
+ AE K SH b n/a 3 268 287 351 N
+ AE K SH e n/a 3 249 296 351 N
+ AE K SH i n/a 3 249 296 351 N
+ AE K SIL e n/a 3 249 287 339 N
+ AE K T b n/a 3 266 309 343 N
+ AE K T e n/a 3 249 303 339 N
+ AE K T i n/a 3 249 303 339 N
+ AE K TH b n/a 3 268 287 350 N
+ AE K TH e n/a 3 249 296 350 N
+ AE K TH i n/a 3 249 296 350 N
+ AE K UH e n/a 3 249 290 361 N
+ AE K UW e n/a 3 249 290 361 N
+ AE K UW i n/a 3 249 290 361 N
+ AE K V b n/a 3 268 286 338 N
+ AE K V e n/a 3 249 286 338 N
+ AE K V i n/a 3 249 286 338 N
+ AE K W e n/a 3 249 293 363 N
+ AE K W i n/a 3 249 293 363 N
+ AE K Y e n/a 3 249 286 340 N
+ AE K Z b n/a 3 267 311 346 N
+ AE K Z e n/a 3 249 286 346 N
+ AE K Z i n/a 3 249 286 347 N
+ AE K ZH b n/a 3 268 286 340 N
+ AE K ZH e n/a 3 249 286 340 N
+ AE K ZH i n/a 3 249 286 340 N
+ AE L AH b n/a 3 270 298 340 N
+ AE L AH i n/a 3 262 298 340 N
+ AE L B b n/a 3 270 298 338 N
+ AE L B i n/a 3 262 298 338 N
+ AE L CH b n/a 3 270 307 342 N
+ AE L CH i n/a 3 262 307 342 N
+ AE L D b n/a 3 270 315 340 N
+ AE L D i n/a 3 262 307 340 N
+ AE L DH i n/a 3 262 298 338 N
+ AE L EH i n/a 3 262 298 340 N
+ AE L ER b n/a 3 270 298 357 N
+ AE L F b n/a 3 270 298 348 N
+ AE L F i n/a 3 262 298 348 N
+ AE L G b n/a 3 270 307 353 N
+ AE L G i n/a 3 262 307 353 N
+ AE L HH b n/a 3 270 298 339 N
+ AE L HH i n/a 3 262 298 339 N
+ AE L JH b n/a 3 270 307 341 N
+ AE L JH i n/a 3 262 307 341 N
+ AE L K b n/a 3 270 301 352 N
+ AE L K i n/a 3 262 301 352 N
+ AE L L b n/a 3 270 292 364 N
+ AE L L i n/a 3 262 292 364 N
+ AE L M b n/a 3 278 335 357 N
+ AE L M i n/a 3 260 327 361 N
+ AE L N b n/a 3 278 333 358 N
+ AE L N i n/a 3 260 327 355 N
+ AE L NG b n/a 3 278 333 360 N
+ AE L NG i n/a 3 263 330 360 N
+ AE L OY b n/a 3 270 298 357 N
+ AE L P b n/a 3 270 298 349 N
+ AE L P i n/a 3 262 298 349 N
+ AE L R b n/a 3 270 298 357 N
+ AE L R i n/a 3 262 298 362 N
+ AE L S b n/a 3 270 314 350 N
+ AE L S i n/a 3 262 298 350 N
+ AE L SH b n/a 3 270 298 351 N
+ AE L SH i n/a 3 262 298 351 N
+ AE L T b n/a 3 270 310 343 N
+ AE L T i n/a 3 262 307 339 N
+ AE L TH b n/a 3 270 298 350 N
+ AE L TH i n/a 3 262 298 350 N
+ AE L V b n/a 3 270 298 338 N
+ AE L V i n/a 3 262 298 338 N
+ AE L W i n/a 3 262 292 364 N
+ AE L Z b n/a 3 270 311 346 N
+ AE L Z i n/a 3 262 298 347 N
+ AE L ZH b n/a 3 270 298 340 N
+ AE M AE i n/a 3 258 289 340 N
+ AE M AH b n/a 3 271 289 340 N
+ AE M AH i n/a 3 258 289 340 N
+ AE M B b n/a 3 271 289 338 N
+ AE M B i n/a 3 258 289 338 N
+ AE M CH b n/a 3 271 305 339 N
+ AE M CH i n/a 3 258 305 339 N
+ AE M D b n/a 3 271 315 340 N
+ AE M D i n/a 3 258 305 340 N
+ AE M DH i n/a 3 258 289 338 N
+ AE M EH i n/a 3 258 289 340 N
+ AE M ER b n/a 3 271 290 357 N
+ AE M F b n/a 3 271 289 348 N
+ AE M F i n/a 3 258 295 348 N
+ AE M G b n/a 3 271 306 353 N
+ AE M G i n/a 3 258 306 353 N
+ AE M HH b n/a 3 271 289 339 N
+ AE M HH i n/a 3 258 289 339 N
+ AE M JH b n/a 3 271 306 341 N
+ AE M JH i n/a 3 258 306 341 N
+ AE M K b n/a 3 271 300 352 N
+ AE M K i n/a 3 258 299 352 N
+ AE M L b n/a 3 271 292 364 N
+ AE M L i n/a 3 258 292 364 N
+ AE M M b n/a 3 279 335 357 N
+ AE M M i n/a 3 256 328 361 N
+ AE M N b n/a 3 279 332 358 N
+ AE M N i n/a 3 256 328 355 N
+ AE M NG b n/a 3 279 333 360 N
+ AE M NG i n/a 3 256 329 360 N
+ AE M OY b n/a 3 271 289 357 N
+ AE M P b n/a 3 271 289 349 N
+ AE M P i n/a 3 258 289 349 N
+ AE M R b n/a 3 271 290 357 N
+ AE M R i n/a 3 258 290 362 N
+ AE M S b n/a 3 271 314 350 N
+ AE M S i n/a 3 258 295 350 N
+ AE M SH b n/a 3 271 289 351 N
+ AE M SH i n/a 3 258 295 351 N
+ AE M T b n/a 3 271 310 343 N
+ AE M T i n/a 3 258 305 339 N
+ AE M TH b n/a 3 271 289 350 N
+ AE M TH i n/a 3 258 295 350 N
+ AE M V b n/a 3 271 289 338 N
+ AE M V i n/a 3 258 289 338 N
+ AE M W i n/a 3 258 292 364 N
+ AE M Z b n/a 3 271 311 346 N
+ AE M Z i n/a 3 258 289 347 N
+ AE M ZH b n/a 3 271 289 340 N
+ AE N AH b n/a 3 271 289 340 N
+ AE N B b n/a 3 271 289 338 N
+ AE N B i n/a 3 259 289 338 N
+ AE N CH b n/a 3 271 305 339 N
+ AE N CH i n/a 3 259 305 339 N
+ AE N D b n/a 3 271 315 340 N
+ AE N D i n/a 3 259 305 340 N
+ AE N ER b n/a 3 271 290 357 N
+ AE N F b n/a 3 271 289 348 N
+ AE N F i n/a 3 259 295 348 N
+ AE N G b n/a 3 271 306 353 N
+ AE N G i n/a 3 259 306 353 N
+ AE N HH b n/a 3 271 289 339 N
+ AE N HH i n/a 3 259 289 339 N
+ AE N JH b n/a 3 271 306 341 N
+ AE N JH i n/a 3 259 306 341 N
+ AE N K b n/a 3 271 300 352 N
+ AE N K i n/a 3 259 299 352 N
+ AE N L b n/a 3 271 291 364 N
+ AE N L i n/a 3 259 291 364 N
+ AE N M b n/a 3 279 335 357 N
+ AE N M i n/a 3 256 326 361 N
+ AE N N b n/a 3 279 332 358 N
+ AE N N i n/a 3 256 326 354 N
+ AE N NG b n/a 3 279 333 360 N
+ AE N NG i n/a 3 256 329 360 N
+ AE N OY b n/a 3 271 289 357 N
+ AE N P b n/a 3 271 289 349 N
+ AE N P i n/a 3 259 289 349 N
+ AE N R b n/a 3 271 290 357 N
+ AE N R i n/a 3 259 290 362 N
+ AE N S b n/a 3 271 314 350 N
+ AE N S i n/a 3 259 295 350 N
+ AE N SH b n/a 3 271 289 351 N
+ AE N SH i n/a 3 259 295 351 N
+ AE N T b n/a 3 271 310 343 N
+ AE N T i n/a 3 259 305 339 N
+ AE N TH b n/a 3 271 289 350 N
+ AE N TH i n/a 3 259 295 350 N
+ AE N V b n/a 3 271 289 338 N
+ AE N V i n/a 3 259 289 338 N
+ AE N Z b n/a 3 271 311 346 N
+ AE N Z i n/a 3 259 289 347 N
+ AE N ZH b n/a 3 271 289 340 N
+ AE N ZH i n/a 3 259 289 340 N
+ AE NG AH b n/a 3 273 286 340 N
+ AE NG B b n/a 3 273 286 338 N
+ AE NG CH b n/a 3 273 305 339 N
+ AE NG D b n/a 3 274 315 340 N
+ AE NG ER b n/a 3 273 290 357 N
+ AE NG F b n/a 3 274 287 348 N
+ AE NG G b n/a 3 273 306 353 N
+ AE NG HH b n/a 3 273 287 339 N
+ AE NG JH b n/a 3 273 306 341 N
+ AE NG K b n/a 3 273 300 352 N
+ AE NG L b n/a 3 273 291 363 N
+ AE NG M b n/a 3 281 335 357 N
+ AE NG M i n/a 3 256 328 361 N
+ AE NG N b n/a 3 281 332 358 N
+ AE NG NG b n/a 3 281 333 360 N
+ AE NG OY b n/a 3 273 286 357 N
+ AE NG P b n/a 3 273 287 349 N
+ AE NG R b n/a 3 273 290 357 N
+ AE NG S b n/a 3 273 314 350 N
+ AE NG SH b n/a 3 273 287 351 N
+ AE NG T b n/a 3 274 309 343 N
+ AE NG TH b n/a 3 273 287 350 N
+ AE NG V b n/a 3 273 286 338 N
+ AE NG Z b n/a 3 273 311 346 N
+ AE NG ZH b n/a 3 273 286 340 N
+ AE OW AH b n/a 3 270 288 340 N
+ AE OW B b n/a 3 270 288 338 N
+ AE OW B i n/a 3 263 286 338 N
+ AE OW CH b n/a 3 270 303 342 N
+ AE OW D b n/a 3 270 315 340 N
+ AE OW ER b n/a 3 270 290 357 N
+ AE OW F b n/a 3 270 288 348 N
+ AE OW G b n/a 3 270 306 353 N
+ AE OW G i n/a 3 263 306 353 N
+ AE OW HH b n/a 3 270 288 339 N
+ AE OW JH b n/a 3 270 306 341 N
+ AE OW K b n/a 3 270 300 352 N
+ AE OW K i n/a 3 262 299 352 N
+ AE OW L b n/a 3 270 292 364 N
+ AE OW L i n/a 3 263 292 364 N
+ AE OW M b n/a 3 278 335 357 N
+ AE OW N b n/a 3 278 333 358 N
+ AE OW N i n/a 3 257 327 354 N
+ AE OW NG b n/a 3 278 333 360 N
+ AE OW OY b n/a 3 270 288 357 N
+ AE OW P b n/a 3 270 288 349 N
+ AE OW P i n/a 3 262 286 349 N
+ AE OW R b n/a 3 270 290 357 N
+ AE OW S b n/a 3 270 314 350 N
+ AE OW SH b n/a 3 270 288 351 N
+ AE OW T b n/a 3 270 310 343 N
+ AE OW TH b n/a 3 270 288 350 N
+ AE OW V b n/a 3 270 288 338 N
+ AE OW Z b n/a 3 270 311 346 N
+ AE OW Z i n/a 3 263 286 347 N
+ AE OW ZH b n/a 3 270 288 340 N
+ AE OY AA e n/a 3 240 290 361 N
+ AE OY AE e n/a 3 240 286 340 N
+ AE OY AH b n/a 3 273 286 340 N
+ AE OY AH e n/a 3 240 286 340 N
+ AE OY AO e n/a 3 240 290 361 N
+ AE OY AW e n/a 3 240 290 340 N
+ AE OY AY e n/a 3 240 286 361 N
+ AE OY B b n/a 3 273 286 338 N
+ AE OY B e n/a 3 240 286 338 N
+ AE OY CH b n/a 3 273 304 342 N
+ AE OY CH e n/a 3 240 304 342 N
+ AE OY D b n/a 3 273 315 340 N
+ AE OY D e n/a 3 240 304 340 N
+ AE OY DH e n/a 3 240 286 338 N
+ AE OY EH e n/a 3 240 286 340 N
+ AE OY ER b n/a 3 273 290 357 N
+ AE OY ER e n/a 3 240 290 362 N
+ AE OY EY e n/a 3 240 286 340 N
+ AE OY F b n/a 3 273 287 348 N
+ AE OY F e n/a 3 240 294 348 N
+ AE OY G b n/a 3 273 306 353 N
+ AE OY G e n/a 3 240 306 353 N
+ AE OY HH b n/a 3 273 287 339 N
+ AE OY HH e n/a 3 240 286 339 N
+ AE OY IH e n/a 3 240 286 340 N
+ AE OY IY e n/a 3 240 286 340 N
+ AE OY JH b n/a 3 273 306 341 N
+ AE OY JH e n/a 3 240 306 341 N
+ AE OY JH i n/a 3 240 306 341 N
+ AE OY K b n/a 3 273 300 352 N
+ AE OY K e n/a 3 240 299 352 N
+ AE OY K i n/a 3 240 299 352 N
+ AE OY L b n/a 3 273 291 364 N
+ AE OY L e n/a 3 240 291 364 N
+ AE OY L i n/a 3 240 291 364 N
+ AE OY M b n/a 3 282 335 357 N
+ AE OY M e n/a 3 238 335 361 N
+ AE OY N b n/a 3 281 334 358 N
+ AE OY N e n/a 3 238 334 358 N
+ AE OY NG b n/a 3 281 334 360 N
+ AE OY NG e n/a 3 238 334 360 N
+ AE OY OW e n/a 3 240 290 361 N
+ AE OY OY b n/a 3 273 286 357 N
+ AE OY OY e n/a 3 240 286 361 N
+ AE OY P b n/a 3 273 287 349 N
+ AE OY P e n/a 3 240 286 349 N
+ AE OY R b n/a 3 273 290 357 N
+ AE OY R e n/a 3 240 290 362 N
+ AE OY S b n/a 3 273 314 350 N
+ AE OY S e n/a 3 240 294 350 N
+ AE OY SH b n/a 3 273 287 351 N
+ AE OY SH e n/a 3 240 294 351 N
+ AE OY SIL e n/a 3 240 286 339 N
+ AE OY T b n/a 3 273 309 343 N
+ AE OY T e n/a 3 240 304 339 N
+ AE OY T i n/a 3 240 304 339 N
+ AE OY TH b n/a 3 273 287 350 N
+ AE OY TH e n/a 3 240 294 350 N
+ AE OY UH e n/a 3 240 290 361 N
+ AE OY UW e n/a 3 240 290 361 N
+ AE OY V b n/a 3 273 286 338 N
+ AE OY V e n/a 3 240 286 338 N
+ AE OY W e n/a 3 240 291 364 N
+ AE OY Y e n/a 3 240 286 340 N
+ AE OY Z b n/a 3 273 311 346 N
+ AE OY Z e n/a 3 240 286 346 N
+ AE OY ZH b n/a 3 273 286 340 N
+ AE OY ZH e n/a 3 240 286 340 N
+ AE P AA e n/a 3 250 290 361 N
+ AE P AE e n/a 3 250 286 340 N
+ AE P AH b n/a 3 268 288 340 N
+ AE P AH e n/a 3 250 286 340 N
+ AE P AO e n/a 3 250 290 361 N
+ AE P AW e n/a 3 250 290 340 N
+ AE P AY e n/a 3 250 286 361 N
+ AE P B b n/a 3 268 288 338 N
+ AE P B e n/a 3 250 286 338 N
+ AE P B i n/a 3 250 286 338 N
+ AE P CH b n/a 3 268 303 342 N
+ AE P CH e n/a 3 250 303 342 N
+ AE P CH i n/a 3 250 303 342 N
+ AE P D b n/a 3 268 315 340 N
+ AE P D e n/a 3 250 303 340 N
+ AE P D i n/a 3 250 303 340 N
+ AE P DH e n/a 3 250 286 338 N
+ AE P DH i n/a 3 250 286 338 N
+ AE P EH e n/a 3 250 286 340 N
+ AE P ER b n/a 3 268 290 357 N
+ AE P ER e n/a 3 250 290 362 N
+ AE P EY e n/a 3 250 286 340 N
+ AE P F b n/a 3 268 288 348 N
+ AE P F e n/a 3 250 294 348 N
+ AE P F i n/a 3 250 294 348 N
+ AE P G b n/a 3 268 306 353 N
+ AE P G e n/a 3 250 306 353 N
+ AE P G i n/a 3 250 306 353 N
+ AE P HH b n/a 3 268 288 339 N
+ AE P HH e n/a 3 250 287 339 N
+ AE P IH e n/a 3 250 286 340 N
+ AE P IY e n/a 3 250 286 340 N
+ AE P JH b n/a 3 268 306 341 N
+ AE P JH e n/a 3 250 306 341 N
+ AE P JH i n/a 3 250 306 341 N
+ AE P K b n/a 3 268 300 352 N
+ AE P K e n/a 3 250 300 352 N
+ AE P K i n/a 3 250 300 352 N
+ AE P L b n/a 3 268 291 364 N
+ AE P L e n/a 3 250 291 364 N
+ AE P L i n/a 3 250 291 364 N
+ AE P M b n/a 3 277 335 357 N
+ AE P M e n/a 3 253 335 361 N
+ AE P M i n/a 3 253 322 361 N
+ AE P N b n/a 3 277 332 358 N
+ AE P N e n/a 3 253 332 358 N
+ AE P N i n/a 3 253 320 354 N
+ AE P NG b n/a 3 277 333 360 N
+ AE P NG e n/a 3 253 333 360 N
+ AE P NG i n/a 3 253 329 360 N
+ AE P OW e n/a 3 250 290 361 N
+ AE P OY b n/a 3 268 288 357 N
+ AE P OY e n/a 3 250 286 361 N
+ AE P P b n/a 3 268 288 349 N
+ AE P P e n/a 3 250 287 349 N
+ AE P P i n/a 3 250 287 349 N
+ AE P R b n/a 3 268 290 357 N
+ AE P R e n/a 3 250 290 362 N
+ AE P R i n/a 3 250 290 362 N
+ AE P S b n/a 3 268 314 350 N
+ AE P S e n/a 3 250 296 350 N
+ AE P S i n/a 3 250 296 350 N
+ AE P SH b n/a 3 268 288 351 N
+ AE P SH e n/a 3 250 296 351 N
+ AE P SH i n/a 3 250 296 351 N
+ AE P SIL e n/a 3 250 287 339 N
+ AE P T b n/a 3 265 310 343 N
+ AE P T e n/a 3 250 303 339 N
+ AE P T i n/a 3 250 303 339 N
+ AE P TH b n/a 3 268 288 350 N
+ AE P TH e n/a 3 250 296 350 N
+ AE P TH i n/a 3 250 296 350 N
+ AE P UH e n/a 3 250 290 361 N
+ AE P UW e n/a 3 250 290 361 N
+ AE P V b n/a 3 268 288 338 N
+ AE P V e n/a 3 250 286 338 N
+ AE P V i n/a 3 250 286 338 N
+ AE P W e n/a 3 250 291 364 N
+ AE P Y e n/a 3 250 286 340 N
+ AE P Z b n/a 3 267 311 346 N
+ AE P Z e n/a 3 250 286 346 N
+ AE P Z i n/a 3 250 286 347 N
+ AE P ZH b n/a 3 268 288 340 N
+ AE P ZH e n/a 3 250 286 340 N
+ AE R AH b n/a 3 272 297 340 N
+ AE R B b n/a 3 272 297 338 N
+ AE R B i n/a 3 264 297 338 N
+ AE R CH b n/a 3 272 303 342 N
+ AE R CH i n/a 3 264 303 342 N
+ AE R D b n/a 3 272 315 340 N
+ AE R D i n/a 3 264 303 340 N
+ AE R DH i n/a 3 264 297 337 N
+ AE R ER b n/a 3 272 297 357 N
+ AE R EY i n/a 3 264 297 340 N
+ AE R F b n/a 3 272 288 348 N
+ AE R F i n/a 3 264 297 348 N
+ AE R G b n/a 3 272 306 353 N
+ AE R G i n/a 3 264 306 353 N
+ AE R HH b n/a 3 272 297 339 N
+ AE R HH i n/a 3 264 297 339 N
+ AE R JH b n/a 3 272 306 341 N
+ AE R JH i n/a 3 264 306 341 N
+ AE R K b n/a 3 272 302 352 N
+ AE R K i n/a 3 264 302 352 N
+ AE R L b n/a 3 272 292 364 N
+ AE R L i n/a 3 264 292 364 N
+ AE R M b n/a 3 280 335 357 N
+ AE R M i n/a 3 257 322 361 N
+ AE R N b n/a 3 280 333 358 N
+ AE R N i n/a 3 257 321 356 N
+ AE R NG b n/a 3 280 333 360 N
+ AE R NG i n/a 3 261 330 360 N
+ AE R OY b n/a 3 272 297 357 N
+ AE R P b n/a 3 272 297 349 N
+ AE R P i n/a 3 264 297 349 N
+ AE R R b n/a 3 272 297 357 N
+ AE R R i n/a 3 264 297 362 N
+ AE R S b n/a 3 272 314 350 N
+ AE R S i n/a 3 264 297 350 N
+ AE R SH b n/a 3 272 288 351 N
+ AE R SH i n/a 3 264 297 351 N
+ AE R T b n/a 3 272 310 343 N
+ AE R T i n/a 3 264 303 339 N
+ AE R TH b n/a 3 272 288 350 N
+ AE R TH i n/a 3 264 297 350 N
+ AE R UW i n/a 3 264 297 361 N
+ AE R V b n/a 3 272 297 338 N
+ AE R V i n/a 3 264 297 338 N
+ AE R W i n/a 3 264 292 364 N
+ AE R Z b n/a 3 272 311 346 N
+ AE R Z i n/a 3 264 297 347 N
+ AE R ZH b n/a 3 272 297 340 N
+ AE S AA e n/a 3 234 290 361 N
+ AE S AE e n/a 3 234 286 340 N
+ AE S AH b n/a 3 269 288 340 N
+ AE S AH e n/a 3 234 286 340 N
+ AE S AO e n/a 3 234 290 361 N
+ AE S AW e n/a 3 234 290 340 N
+ AE S AY e n/a 3 234 286 361 N
+ AE S B b n/a 3 269 288 338 N
+ AE S B e n/a 3 234 286 338 N
+ AE S B i n/a 3 234 286 338 N
+ AE S CH b n/a 3 269 303 342 N
+ AE S CH e n/a 3 234 303 342 N
+ AE S CH i n/a 3 234 303 342 N
+ AE S D b n/a 3 269 315 340 N
+ AE S D e n/a 3 234 304 340 N
+ AE S D i n/a 3 234 304 340 N
+ AE S DH e n/a 3 234 286 338 N
+ AE S DH i n/a 3 234 286 338 N
+ AE S EH e n/a 3 234 286 340 N
+ AE S EH i n/a 3 234 286 340 N
+ AE S ER b n/a 3 269 290 357 N
+ AE S ER e n/a 3 234 290 362 N
+ AE S EY e n/a 3 234 286 340 N
+ AE S F b n/a 3 269 288 348 N
+ AE S F e n/a 3 234 294 348 N
+ AE S F i n/a 3 234 294 348 N
+ AE S G b n/a 3 269 306 353 N
+ AE S G e n/a 3 234 306 353 N
+ AE S G i n/a 3 234 306 353 N
+ AE S HH b n/a 3 269 288 339 N
+ AE S HH e n/a 3 234 286 339 N
+ AE S HH i n/a 3 234 286 339 N
+ AE S IH e n/a 3 234 286 340 N
+ AE S IY e n/a 3 234 286 340 N
+ AE S JH b n/a 3 269 306 341 N
+ AE S JH e n/a 3 234 306 341 N
+ AE S JH i n/a 3 234 306 341 N
+ AE S K b n/a 3 269 300 352 N
+ AE S K e n/a 3 234 299 352 N
+ AE S K i n/a 3 234 299 352 N
+ AE S L b n/a 3 269 291 364 N
+ AE S L e n/a 3 234 291 364 N
+ AE S L i n/a 3 234 291 364 N
+ AE S M b n/a 3 277 335 357 N
+ AE S M e n/a 3 252 335 361 N
+ AE S M i n/a 3 252 322 361 N
+ AE S N b n/a 3 276 332 358 N
+ AE S N e n/a 3 252 332 358 N
+ AE S N i n/a 3 252 320 354 N
+ AE S NG b n/a 3 277 333 360 N
+ AE S NG e n/a 3 252 333 360 N
+ AE S NG i n/a 3 252 329 360 N
+ AE S OW e n/a 3 234 290 361 N
+ AE S OY b n/a 3 269 288 357 N
+ AE S OY e n/a 3 234 286 361 N
+ AE S P b n/a 3 269 288 349 N
+ AE S P e n/a 3 234 286 349 N
+ AE S P i n/a 3 234 286 349 N
+ AE S R b n/a 3 269 290 357 N
+ AE S R e n/a 3 234 290 362 N
+ AE S R i n/a 3 234 290 362 N
+ AE S S b n/a 3 269 314 350 N
+ AE S S e n/a 3 234 294 350 N
+ AE S S i n/a 3 234 294 350 N
+ AE S SH b n/a 3 269 288 351 N
+ AE S SH e n/a 3 234 294 351 N
+ AE S SH i n/a 3 234 294 351 N
+ AE S SIL e n/a 3 234 286 339 N
+ AE S T b n/a 3 265 310 343 N
+ AE S T e n/a 3 234 303 339 N
+ AE S T i n/a 3 234 303 339 N
+ AE S TH b n/a 3 269 288 350 N
+ AE S TH e n/a 3 234 294 350 N
+ AE S TH i n/a 3 234 294 350 N
+ AE S UH e n/a 3 234 290 361 N
+ AE S UW e n/a 3 234 290 361 N
+ AE S V b n/a 3 269 288 338 N
+ AE S V e n/a 3 234 286 338 N
+ AE S V i n/a 3 234 286 338 N
+ AE S W e n/a 3 234 291 364 N
+ AE S Y e n/a 3 234 286 340 N
+ AE S Z b n/a 3 267 311 346 N
+ AE S Z e n/a 3 234 286 346 N
+ AE S Z i n/a 3 234 286 347 N
+ AE S ZH b n/a 3 269 288 340 N
+ AE S ZH e n/a 3 234 286 340 N
+ AE SH AH b n/a 3 269 288 340 N
+ AE SH AH i n/a 3 234 286 340 N
+ AE SH B b n/a 3 269 288 338 N
+ AE SH B i n/a 3 234 286 338 N
+ AE SH CH b n/a 3 269 303 342 N
+ AE SH D b n/a 3 269 315 340 N
+ AE SH D i n/a 3 234 304 340 N
+ AE SH ER b n/a 3 269 290 357 N
+ AE SH F b n/a 3 269 288 348 N
+ AE SH F i n/a 3 234 294 348 N
+ AE SH G b n/a 3 269 306 353 N
+ AE SH G i n/a 3 234 306 353 N
+ AE SH HH b n/a 3 269 288 339 N
+ AE SH HH i n/a 3 234 286 339 N
+ AE SH JH b n/a 3 269 306 341 N
+ AE SH K b n/a 3 269 300 352 N
+ AE SH K i n/a 3 234 299 352 N
+ AE SH L b n/a 3 269 293 363 N
+ AE SH L i n/a 3 232 293 363 N
+ AE SH M b n/a 3 277 335 357 N
+ AE SH M i n/a 3 251 322 361 N
+ AE SH N b n/a 3 276 332 358 N
+ AE SH N i n/a 3 251 320 354 N
+ AE SH NG b n/a 3 277 333 360 N
+ AE SH NG i n/a 3 252 329 360 N
+ AE SH OY b n/a 3 269 288 357 N
+ AE SH P b n/a 3 269 288 349 N
+ AE SH P i n/a 3 234 286 349 N
+ AE SH R b n/a 3 269 290 357 N
+ AE SH R i n/a 3 234 290 362 N
+ AE SH S b n/a 3 269 314 350 N
+ AE SH S i n/a 3 234 294 350 N
+ AE SH SH b n/a 3 269 288 351 N
+ AE SH T b n/a 3 265 309 343 N
+ AE SH T i n/a 3 234 303 339 N
+ AE SH TH b n/a 3 269 288 350 N
+ AE SH V b n/a 3 269 288 338 N
+ AE SH V i n/a 3 234 286 338 N
+ AE SH W i n/a 3 232 293 363 N
+ AE SH Z b n/a 3 267 311 346 N
+ AE SH ZH b n/a 3 269 288 340 N
+ AE SIL AH b n/a 3 285 288 340 N
+ AE SIL B b n/a 3 285 288 338 N
+ AE SIL CH b n/a 3 285 303 342 N
+ AE SIL D b n/a 3 285 315 340 N
+ AE SIL ER b n/a 3 285 290 357 N
+ AE SIL F b n/a 3 285 288 348 N
+ AE SIL G b n/a 3 285 306 353 N
+ AE SIL HH b n/a 3 285 288 339 N
+ AE SIL JH b n/a 3 285 306 341 N
+ AE SIL K b n/a 3 285 300 352 N
+ AE SIL L b n/a 3 285 291 364 N
+ AE SIL M b n/a 3 285 335 357 N
+ AE SIL N b n/a 3 283 331 359 N
+ AE SIL NG b n/a 3 283 333 360 N
+ AE SIL OY b n/a 3 285 288 357 N
+ AE SIL P b n/a 3 285 288 349 N
+ AE SIL R b n/a 3 285 290 357 N
+ AE SIL S b n/a 3 285 314 350 N
+ AE SIL SH b n/a 3 285 288 351 N
+ AE SIL T b n/a 3 284 312 343 N
+ AE SIL TH b n/a 3 285 288 350 N
+ AE SIL V b n/a 3 285 288 338 N
+ AE SIL Z b n/a 3 284 312 347 N
+ AE SIL ZH b n/a 3 285 288 340 N
+ AE T AH b n/a 3 268 288 340 N
+ AE T AO i n/a 3 247 290 361 N
+ AE T B b n/a 3 268 288 338 N
+ AE T B i n/a 3 248 286 338 N
+ AE T CH b n/a 3 268 303 342 N
+ AE T CH i n/a 3 247 303 342 N
+ AE T D b n/a 3 268 315 340 N
+ AE T D i n/a 3 248 303 340 N
+ AE T ER b n/a 3 268 290 357 N
+ AE T F b n/a 3 268 288 348 N
+ AE T F i n/a 3 248 294 348 N
+ AE T G b n/a 3 268 306 353 N
+ AE T G i n/a 3 248 306 353 N
+ AE T HH b n/a 3 268 288 339 N
+ AE T HH i n/a 3 247 287 339 N
+ AE T JH b n/a 3 268 306 341 N
+ AE T K b n/a 3 268 300 352 N
+ AE T K i n/a 3 247 300 352 N
+ AE T L b n/a 3 268 291 364 N
+ AE T L i n/a 3 247 291 364 N
+ AE T M b n/a 3 277 335 357 N
+ AE T M i n/a 3 251 322 361 N
+ AE T N b n/a 3 277 332 358 N
+ AE T N i n/a 3 251 320 354 N
+ AE T NG b n/a 3 277 333 360 N
+ AE T NG i n/a 3 253 329 360 N
+ AE T OY b n/a 3 268 288 357 N
+ AE T P b n/a 3 268 288 349 N
+ AE T P i n/a 3 247 287 349 N
+ AE T R b n/a 3 268 290 357 N
+ AE T R i n/a 3 247 290 362 N
+ AE T S b n/a 3 268 314 350 N
+ AE T S i n/a 3 247 296 350 N
+ AE T SH b n/a 3 268 288 351 N
+ AE T SH i n/a 3 247 296 351 N
+ AE T T b n/a 3 265 310 343 N
+ AE T T i n/a 3 248 303 339 N
+ AE T TH b n/a 3 268 288 350 N
+ AE T TH i n/a 3 247 296 350 N
+ AE T V b n/a 3 268 288 338 N
+ AE T V i n/a 3 248 286 338 N
+ AE T W i n/a 3 248 291 364 N
+ AE T Z b n/a 3 267 311 346 N
+ AE T Z i n/a 3 247 286 347 N
+ AE T ZH b n/a 3 268 288 340 N
+ AE TH AH b n/a 3 269 288 340 N
+ AE TH B b n/a 3 269 308 338 N
+ AE TH CH b n/a 3 269 308 342 N
+ AE TH CH i n/a 3 236 308 342 N
+ AE TH D b n/a 3 269 315 340 N
+ AE TH D i n/a 3 236 308 340 N
+ AE TH ER b n/a 3 269 290 357 N
+ AE TH F b n/a 3 269 288 348 N
+ AE TH G b n/a 3 269 308 353 N
+ AE TH G i n/a 3 236 308 353 N
+ AE TH HH b n/a 3 269 288 339 N
+ AE TH JH b n/a 3 269 308 341 N
+ AE TH K b n/a 3 269 300 352 N
+ AE TH K i n/a 3 236 299 352 N
+ AE TH L b n/a 3 269 291 364 N
+ AE TH L i n/a 3 236 291 364 N
+ AE TH M b n/a 3 277 335 357 N
+ AE TH M i n/a 3 252 322 361 N
+ AE TH N b n/a 3 276 332 358 N
+ AE TH N i n/a 3 252 323 356 N
+ AE TH NG b n/a 3 277 333 360 N
+ AE TH NG i n/a 3 252 330 360 N
+ AE TH OY b n/a 3 269 288 357 N
+ AE TH P b n/a 3 269 308 349 N
+ AE TH R b n/a 3 269 290 357 N
+ AE TH R i n/a 3 236 290 362 N
+ AE TH S b n/a 3 269 314 350 N
+ AE TH S i n/a 3 236 294 350 N
+ AE TH SH b n/a 3 269 288 351 N
+ AE TH SH i n/a 3 236 294 351 N
+ AE TH T b n/a 3 265 310 343 N
+ AE TH T i n/a 3 236 308 339 N
+ AE TH TH b n/a 3 269 288 350 N
+ AE TH V b n/a 3 269 288 338 N
+ AE TH Z b n/a 3 267 311 346 N
+ AE TH ZH b n/a 3 269 288 340 N
+ AE UH AH b n/a 3 270 288 340 N
+ AE UH B b n/a 3 270 288 338 N
+ AE UH CH b n/a 3 270 303 342 N
+ AE UH D b n/a 3 270 315 340 N
+ AE UH ER b n/a 3 270 290 357 N
+ AE UH F b n/a 3 270 288 348 N
+ AE UH G b n/a 3 270 306 353 N
+ AE UH HH b n/a 3 270 288 339 N
+ AE UH JH b n/a 3 270 306 341 N
+ AE UH K b n/a 3 270 300 352 N
+ AE UH L b n/a 3 270 292 364 N
+ AE UH M b n/a 3 278 335 357 N
+ AE UH N b n/a 3 278 333 358 N
+ AE UH NG b n/a 3 278 333 360 N
+ AE UH OY b n/a 3 270 288 357 N
+ AE UH P b n/a 3 270 288 349 N
+ AE UH R b n/a 3 270 290 357 N
+ AE UH S b n/a 3 270 314 350 N
+ AE UH SH b n/a 3 270 288 351 N
+ AE UH T b n/a 3 270 310 343 N
+ AE UH TH b n/a 3 270 288 350 N
+ AE UH V b n/a 3 270 288 338 N
+ AE UH Z b n/a 3 270 311 346 N
+ AE UH ZH b n/a 3 270 288 340 N
+ AE UW AA e n/a 3 263 290 361 N
+ AE UW AE e n/a 3 263 286 340 N
+ AE UW AH b n/a 3 270 288 340 N
+ AE UW AH e n/a 3 263 286 340 N
+ AE UW AO e n/a 3 263 290 361 N
+ AE UW AW e n/a 3 263 290 340 N
+ AE UW AY e n/a 3 263 286 361 N
+ AE UW B b n/a 3 270 288 338 N
+ AE UW B e n/a 3 263 286 338 N
+ AE UW CH b n/a 3 270 303 342 N
+ AE UW CH e n/a 3 262 303 342 N
+ AE UW D b n/a 3 270 315 340 N
+ AE UW D e n/a 3 263 303 340 N
+ AE UW D i n/a 3 263 303 340 N
+ AE UW DH e n/a 3 263 286 338 N
+ AE UW EH e n/a 3 263 286 340 N
+ AE UW ER b n/a 3 270 290 357 N
+ AE UW ER e n/a 3 263 290 362 N
+ AE UW EY e n/a 3 263 286 340 N
+ AE UW F b n/a 3 270 288 348 N
+ AE UW F e n/a 3 262 294 348 N
+ AE UW F i n/a 3 262 294 348 N
+ AE UW G b n/a 3 270 306 353 N
+ AE UW G e n/a 3 263 306 353 N
+ AE UW HH b n/a 3 270 288 339 N
+ AE UW HH e n/a 3 262 286 339 N
+ AE UW IH e n/a 3 263 286 340 N
+ AE UW IY e n/a 3 263 286 340 N
+ AE UW JH b n/a 3 270 306 341 N
+ AE UW JH e n/a 3 263 306 341 N
+ AE UW K b n/a 3 270 300 352 N
+ AE UW K e n/a 3 262 299 352 N
+ AE UW K i n/a 3 262 299 352 N
+ AE UW L b n/a 3 270 292 364 N
+ AE UW L e n/a 3 263 292 364 N
+ AE UW L i n/a 3 263 292 364 N
+ AE UW M b n/a 3 278 335 357 N
+ AE UW M e n/a 3 257 335 361 N
+ AE UW M i n/a 3 257 327 361 N
+ AE UW N b n/a 3 278 333 358 N
+ AE UW N e n/a 3 257 333 358 N
+ AE UW N i n/a 3 257 327 354 N
+ AE UW NG b n/a 3 278 333 360 N
+ AE UW NG e n/a 3 261 333 360 N
+ AE UW OW e n/a 3 263 290 361 N
+ AE UW OY b n/a 3 270 288 357 N
+ AE UW OY e n/a 3 263 286 361 N
+ AE UW P b n/a 3 270 288 349 N
+ AE UW P e n/a 3 262 286 349 N
+ AE UW R b n/a 3 270 290 357 N
+ AE UW R e n/a 3 263 290 362 N
+ AE UW S b n/a 3 270 314 350 N
+ AE UW S e n/a 3 262 294 350 N
+ AE UW SH b n/a 3 270 288 351 N
+ AE UW SH e n/a 3 262 294 351 N
+ AE UW SH i n/a 3 262 294 351 N
+ AE UW SIL e n/a 3 262 286 339 N
+ AE UW T b n/a 3 270 310 343 N
+ AE UW T e n/a 3 262 303 339 N
+ AE UW T i n/a 3 262 303 339 N
+ AE UW TH b n/a 3 270 288 350 N
+ AE UW TH e n/a 3 262 294 350 N
+ AE UW UH e n/a 3 263 290 361 N
+ AE UW UW e n/a 3 263 290 361 N
+ AE UW V b n/a 3 270 288 338 N
+ AE UW V e n/a 3 263 286 338 N
+ AE UW V i n/a 3 263 286 338 N
+ AE UW W e n/a 3 263 292 364 N
+ AE UW Y e n/a 3 263 286 340 N
+ AE UW Z b n/a 3 270 311 346 N
+ AE UW Z e n/a 3 263 286 346 N
+ AE UW ZH b n/a 3 270 288 340 N
+ AE UW ZH e n/a 3 263 286 340 N
+ AE V AH b n/a 3 269 288 340 N
+ AE V B b n/a 3 269 288 338 N
+ AE V CH b n/a 3 269 304 342 N
+ AE V CH i n/a 3 235 304 342 N
+ AE V D b n/a 3 269 315 340 N
+ AE V D i n/a 3 235 304 340 N
+ AE V ER b n/a 3 269 290 357 N
+ AE V F b n/a 3 269 288 348 N
+ AE V G b n/a 3 269 306 353 N
+ AE V G i n/a 3 235 306 353 N
+ AE V HH b n/a 3 269 288 342 N
+ AE V HH i n/a 3 235 286 342 N
+ AE V JH b n/a 3 269 306 341 N
+ AE V K b n/a 3 269 300 352 N
+ AE V K i n/a 3 235 299 352 N
+ AE V L b n/a 3 269 292 364 N
+ AE V L i n/a 3 235 292 364 N
+ AE V M b n/a 3 277 335 357 N
+ AE V M i n/a 3 242 322 361 N
+ AE V N b n/a 3 277 332 358 N
+ AE V N i n/a 3 242 320 354 N
+ AE V NG b n/a 3 277 333 360 N
+ AE V NG i n/a 3 242 329 360 N
+ AE V OY b n/a 3 269 288 357 N
+ AE V P b n/a 3 269 288 349 N
+ AE V P i n/a 3 235 286 349 N
+ AE V R b n/a 3 269 290 357 N
+ AE V R i n/a 3 235 290 362 N
+ AE V S b n/a 3 269 314 350 N
+ AE V S i n/a 3 235 294 350 N
+ AE V SH b n/a 3 269 288 351 N
+ AE V SH i n/a 3 235 294 351 N
+ AE V T b n/a 3 265 310 343 N
+ AE V T i n/a 3 235 304 342 N
+ AE V TH b n/a 3 269 288 350 N
+ AE V TH i n/a 3 235 294 350 N
+ AE V V b n/a 3 269 288 338 N
+ AE V V i n/a 3 235 286 338 N
+ AE V Z b n/a 3 267 311 346 N
+ AE V Z i n/a 3 235 286 347 N
+ AE V ZH b n/a 3 269 288 340 N
+ AE W AH b n/a 3 270 298 340 N
+ AE W B b n/a 3 270 298 338 N
+ AE W B i n/a 3 263 298 338 N
+ AE W CH b n/a 3 270 307 342 N
+ AE W CH i n/a 3 262 307 342 N
+ AE W D b n/a 3 270 315 340 N
+ AE W D i n/a 3 263 307 340 N
+ AE W ER b n/a 3 270 298 357 N
+ AE W F b n/a 3 270 298 348 N
+ AE W F i n/a 3 262 298 348 N
+ AE W G b n/a 3 270 307 353 N
+ AE W G i n/a 3 263 307 353 N
+ AE W HH b n/a 3 270 298 339 N
+ AE W JH b n/a 3 270 307 341 N
+ AE W JH i n/a 3 263 307 341 N
+ AE W K b n/a 3 270 301 352 N
+ AE W K i n/a 3 262 301 352 N
+ AE W L b n/a 3 270 292 364 N
+ AE W L i n/a 3 263 292 364 N
+ AE W M b n/a 3 278 335 357 N
+ AE W M i n/a 3 260 327 361 N
+ AE W N b n/a 3 278 333 358 N
+ AE W N i n/a 3 260 327 355 N
+ AE W NG b n/a 3 278 333 360 N
+ AE W NG i n/a 3 263 330 360 N
+ AE W OY b n/a 3 270 298 357 N
+ AE W P b n/a 3 270 298 349 N
+ AE W P i n/a 3 262 298 349 N
+ AE W R b n/a 3 270 298 357 N
+ AE W R i n/a 3 263 298 362 N
+ AE W S b n/a 3 270 314 350 N
+ AE W S i n/a 3 262 298 350 N
+ AE W SH b n/a 3 270 298 351 N
+ AE W SH i n/a 3 262 298 351 N
+ AE W T b n/a 3 270 310 343 N
+ AE W T i n/a 3 262 307 339 N
+ AE W TH b n/a 3 270 298 350 N
+ AE W V b n/a 3 270 298 338 N
+ AE W Z b n/a 3 270 311 346 N
+ AE W ZH b n/a 3 270 298 340 N
+ AE Y AA e n/a 3 240 290 361 N
+ AE Y AE e n/a 3 240 286 340 N
+ AE Y AH b n/a 3 275 286 340 N
+ AE Y AH e n/a 3 240 286 340 N
+ AE Y AO e n/a 3 240 290 361 N
+ AE Y AW e n/a 3 240 290 340 N
+ AE Y AY e n/a 3 240 286 361 N
+ AE Y B b n/a 3 275 286 338 N
+ AE Y B e n/a 3 240 286 338 N
+ AE Y B i n/a 3 240 286 338 N
+ AE Y CH b n/a 3 275 304 342 N
+ AE Y CH e n/a 3 240 304 342 N
+ AE Y D b n/a 3 275 315 340 N
+ AE Y D e n/a 3 240 304 340 N
+ AE Y D i n/a 3 240 304 340 N
+ AE Y DH e n/a 3 240 286 338 N
+ AE Y EH e n/a 3 240 286 340 N
+ AE Y ER b n/a 3 275 290 357 N
+ AE Y ER e n/a 3 240 290 362 N
+ AE Y EY e n/a 3 240 286 340 N
+ AE Y F b n/a 3 275 287 348 N
+ AE Y F e n/a 3 240 294 348 N
+ AE Y F i n/a 3 240 294 348 N
+ AE Y G b n/a 3 275 306 353 N
+ AE Y G e n/a 3 240 306 353 N
+ AE Y G i n/a 3 240 306 353 N
+ AE Y HH b n/a 3 275 287 339 N
+ AE Y HH e n/a 3 240 286 339 N
+ AE Y IH e n/a 3 240 286 340 N
+ AE Y IY e n/a 3 240 286 340 N
+ AE Y JH b n/a 3 275 306 341 N
+ AE Y JH e n/a 3 240 306 341 N
+ AE Y K b n/a 3 275 301 352 N
+ AE Y K e n/a 3 240 299 352 N
+ AE Y K i n/a 3 240 299 352 N
+ AE Y L b n/a 3 275 291 364 N
+ AE Y L e n/a 3 240 291 364 N
+ AE Y L i n/a 3 240 291 364 N
+ AE Y M b n/a 3 282 335 357 N
+ AE Y M e n/a 3 239 335 361 N
+ AE Y M i n/a 3 239 322 361 N
+ AE Y N b n/a 3 281 334 358 N
+ AE Y N e n/a 3 239 334 358 N
+ AE Y N i n/a 3 239 320 354 N
+ AE Y NG b n/a 3 281 334 360 N
+ AE Y NG e n/a 3 239 334 360 N
+ AE Y NG i n/a 3 239 329 360 N
+ AE Y OW e n/a 3 240 290 361 N
+ AE Y OY b n/a 3 275 286 357 N
+ AE Y OY e n/a 3 240 286 361 N
+ AE Y P b n/a 3 275 287 349 N
+ AE Y P e n/a 3 240 286 349 N
+ AE Y P i n/a 3 240 286 349 N
+ AE Y R b n/a 3 275 290 357 N
+ AE Y R e n/a 3 240 290 362 N
+ AE Y R i n/a 3 240 290 362 N
+ AE Y S b n/a 3 275 314 350 N
+ AE Y S e n/a 3 240 294 350 N
+ AE Y S i n/a 3 240 294 350 N
+ AE Y SH b n/a 3 275 287 351 N
+ AE Y SH e n/a 3 240 294 351 N
+ AE Y SH i n/a 3 240 294 351 N
+ AE Y SIL e n/a 3 240 286 339 N
+ AE Y T b n/a 3 274 309 343 N
+ AE Y T e n/a 3 240 304 339 N
+ AE Y T i n/a 3 240 304 339 N
+ AE Y TH b n/a 3 275 287 350 N
+ AE Y TH e n/a 3 240 294 350 N
+ AE Y TH i n/a 3 240 294 350 N
+ AE Y UH e n/a 3 240 290 361 N
+ AE Y UW e n/a 3 240 290 361 N
+ AE Y V b n/a 3 275 286 338 N
+ AE Y V e n/a 3 240 286 338 N
+ AE Y V i n/a 3 240 286 338 N
+ AE Y W e n/a 3 240 291 364 N
+ AE Y Y e n/a 3 240 286 340 N
+ AE Y Z b n/a 3 273 311 346 N
+ AE Y Z e n/a 3 240 286 346 N
+ AE Y Z i n/a 3 240 286 347 N
+ AE Y ZH b n/a 3 275 286 340 N
+ AE Y ZH e n/a 3 240 286 340 N
+ AE Z AH b n/a 3 269 288 340 N
+ AE Z B b n/a 3 269 288 338 N
+ AE Z B i n/a 3 235 286 338 N
+ AE Z CH b n/a 3 269 304 342 N
+ AE Z D b n/a 3 269 315 340 N
+ AE Z D i n/a 3 235 304 340 N
+ AE Z ER b n/a 3 269 290 357 N
+ AE Z F b n/a 3 269 288 348 N
+ AE Z F i n/a 3 235 294 348 N
+ AE Z G b n/a 3 269 306 353 N
+ AE Z G i n/a 3 235 306 353 N
+ AE Z HH b n/a 3 269 288 342 N
+ AE Z JH b n/a 3 269 306 341 N
+ AE Z JH i n/a 3 235 306 341 N
+ AE Z K b n/a 3 269 300 352 N
+ AE Z K i n/a 3 235 299 352 N
+ AE Z L b n/a 3 269 291 364 N
+ AE Z L i n/a 3 235 291 364 N
+ AE Z M b n/a 3 277 335 357 N
+ AE Z M i n/a 3 243 322 361 N
+ AE Z N b n/a 3 276 332 358 N
+ AE Z N i n/a 3 243 320 354 N
+ AE Z NG b n/a 3 277 333 360 N
+ AE Z NG i n/a 3 243 329 360 N
+ AE Z OY b n/a 3 269 288 357 N
+ AE Z P b n/a 3 269 288 349 N
+ AE Z P i n/a 3 235 286 349 N
+ AE Z R b n/a 3 269 290 357 N
+ AE Z R i n/a 3 235 290 362 N
+ AE Z S b n/a 3 269 314 350 N
+ AE Z S i n/a 3 235 294 350 N
+ AE Z SH b n/a 3 269 288 351 N
+ AE Z T b n/a 3 265 310 343 N
+ AE Z T i n/a 3 235 304 342 N
+ AE Z TH b n/a 3 269 288 350 N
+ AE Z V b n/a 3 269 288 338 N
+ AE Z Z b n/a 3 267 311 346 N
+ AE Z Z i n/a 3 235 286 347 N
+ AE Z ZH b n/a 3 269 288 340 N
+ AE ZH AH b n/a 3 269 288 340 N
+ AE ZH B b n/a 3 269 288 338 N
+ AE ZH CH b n/a 3 269 304 342 N
+ AE ZH D b n/a 3 269 315 340 N
+ AE ZH ER b n/a 3 269 290 357 N
+ AE ZH F b n/a 3 269 288 348 N
+ AE ZH G b n/a 3 269 306 353 N
+ AE ZH HH b n/a 3 269 288 342 N
+ AE ZH JH b n/a 3 269 306 341 N
+ AE ZH K b n/a 3 269 300 352 N
+ AE ZH L b n/a 3 269 291 363 N
+ AE ZH M b n/a 3 277 335 357 N
+ AE ZH N b n/a 3 276 332 358 N
+ AE ZH NG b n/a 3 277 333 360 N
+ AE ZH NG i n/a 3 239 329 360 N
+ AE ZH OY b n/a 3 269 288 357 N
+ AE ZH P b n/a 3 269 288 349 N
+ AE ZH R b n/a 3 269 290 357 N
+ AE ZH S b n/a 3 269 314 350 N
+ AE ZH SH b n/a 3 269 288 351 N
+ AE ZH T b n/a 3 265 309 343 N
+ AE ZH TH b n/a 3 269 288 350 N
+ AE ZH V b n/a 3 269 288 338 N
+ AE ZH Z b n/a 3 267 311 346 N
+ AE ZH ZH b n/a 3 269 288 340 N
+ AH AA AA e n/a 4 386 687 752 N
+ AH AA AA s n/a 4 388 677 752 N
+ AH AA AE e n/a 4 386 687 752 N
+ AH AA AE s n/a 4 388 677 752 N
+ AH AA AH e n/a 4 386 687 752 N
+ AH AA AH s n/a 4 388 677 752 N
+ AH AA AO e n/a 4 386 687 752 N
+ AH AA AO s n/a 4 388 677 752 N
+ AH AA AW e n/a 4 386 687 752 N
+ AH AA AW s n/a 4 388 677 752 N
+ AH AA AY e n/a 4 386 687 752 N
+ AH AA AY s n/a 4 388 677 752 N
+ AH AA B b n/a 4 372 674 731 N
+ AH AA B e n/a 4 372 687 738 N
+ AH AA B s n/a 4 372 674 731 N
+ AH AA CH b n/a 4 380 568 776 N
+ AH AA CH e n/a 4 380 568 776 N
+ AH AA CH s n/a 4 380 568 776 N
+ AH AA D b n/a 4 381 568 772 N
+ AH AA D e n/a 4 381 568 775 N
+ AH AA D s n/a 4 381 568 772 N
+ AH AA DH b n/a 4 388 680 717 N
+ AH AA DH e n/a 4 388 687 738 N
+ AH AA DH s n/a 4 388 680 717 N
+ AH AA EH e n/a 4 386 687 752 N
+ AH AA EH s n/a 4 388 677 752 N
+ AH AA ER e n/a 4 386 687 752 N
+ AH AA ER s n/a 4 388 677 752 N
+ AH AA EY e n/a 4 386 687 752 N
+ AH AA EY s n/a 4 388 677 752 N
+ AH AA F b n/a 4 372 678 742 N
+ AH AA F e n/a 4 372 687 745 N
+ AH AA F s n/a 4 372 678 742 N
+ AH AA G b n/a 4 382 568 793 N
+ AH AA G e n/a 4 382 568 791 N
+ AH AA G s n/a 4 382 568 791 N
+ AH AA HH b n/a 4 388 677 752 N
+ AH AA HH e n/a 4 386 687 752 N
+ AH AA HH s n/a 4 388 677 753 N
+ AH AA IH e n/a 4 386 687 751 N
+ AH AA IH s n/a 4 388 677 751 N
+ AH AA IY e n/a 4 386 687 750 N
+ AH AA IY s n/a 4 388 677 750 N
+ AH AA JH b n/a 4 381 568 772 N
+ AH AA JH e n/a 4 381 568 775 N
+ AH AA JH s n/a 4 381 568 772 N
+ AH AA K b n/a 4 382 568 787 N
+ AH AA K e n/a 4 382 568 787 N
+ AH AA K s n/a 4 382 568 787 N
+ AH AA L b n/a 4 403 706 836 N
+ AH AA L e n/a 4 403 706 836 N
+ AH AA L i n/a 4 403 706 828 N
+ AH AA L s n/a 4 403 706 836 N
+ AH AA M b n/a 4 372 678 823 N
+ AH AA M e n/a 4 372 687 823 N
+ AH AA M i n/a 4 372 678 823 N
+ AH AA M s n/a 4 372 678 823 N
+ AH AA N b n/a 4 387 596 800 N
+ AH AA N e n/a 4 387 596 799 N
+ AH AA N i n/a 4 386 596 799 N
+ AH AA N s n/a 4 387 596 799 N
+ AH AA NG b n/a 4 387 604 823 N
+ AH AA NG e n/a 4 386 604 823 N
+ AH AA NG s n/a 4 387 604 823 N
+ AH AA OW e n/a 4 386 687 752 N
+ AH AA OW s n/a 4 388 677 752 N
+ AH AA OY e n/a 4 386 687 752 N
+ AH AA OY s n/a 4 388 677 752 N
+ AH AA P b n/a 4 372 680 729 N
+ AH AA P e n/a 4 372 687 734 N
+ AH AA P s n/a 4 372 680 730 N
+ AH AA R b n/a 4 388 677 725 N
+ AH AA R e n/a 4 386 687 725 N
+ AH AA R s n/a 4 388 677 725 N
+ AH AA S b n/a 4 382 542 760 N
+ AH AA S e n/a 4 382 554 763 N
+ AH AA S i n/a 4 380 540 756 N
+ AH AA S s n/a 4 382 540 756 N
+ AH AA SH b n/a 4 388 542 754 N
+ AH AA SH e n/a 4 386 554 764 N
+ AH AA SH s n/a 4 388 540 754 N
+ AH AA SIL e n/a 4 386 687 739 N
+ AH AA SIL s n/a 4 388 677 740 N
+ AH AA T b n/a 4 381 568 776 N
+ AH AA T e n/a 4 380 568 776 N
+ AH AA T s n/a 4 381 568 776 N
+ AH AA TH b n/a 4 388 677 743 N
+ AH AA TH e n/a 4 386 687 743 N
+ AH AA TH s n/a 4 388 677 743 N
+ AH AA UH e n/a 4 386 687 751 N
+ AH AA UH s n/a 4 388 677 751 N
+ AH AA UW e n/a 4 386 687 751 N
+ AH AA UW s n/a 4 388 677 751 N
+ AH AA V b n/a 4 372 678 713 N
+ AH AA V e n/a 4 372 687 738 N
+ AH AA V s n/a 4 372 678 713 N
+ AH AA W b n/a 4 403 706 841 N
+ AH AA W e n/a 4 403 706 841 N
+ AH AA W s n/a 4 403 706 841 N
+ AH AA Y b n/a 4 388 677 750 N
+ AH AA Y e n/a 4 386 687 750 N
+ AH AA Y s n/a 4 388 677 750 N
+ AH AA Z b n/a 4 382 542 767 N
+ AH AA Z e n/a 4 382 554 767 N
+ AH AA Z s n/a 4 382 540 767 N
+ AH AA ZH e n/a 4 388 554 767 N
+ AH AA ZH s n/a 4 388 540 767 N
+ AH AE AA s n/a 4 509 663 752 N
+ AH AE AE s n/a 4 509 663 752 N
+ AH AE AH s n/a 4 509 663 752 N
+ AH AE AO s n/a 4 509 663 752 N
+ AH AE AW s n/a 4 509 663 752 N
+ AH AE AY s n/a 4 509 663 752 N
+ AH AE B b n/a 4 514 646 726 N
+ AH AE B s n/a 4 514 646 726 N
+ AH AE CH b n/a 4 507 562 776 N
+ AH AE CH s n/a 4 507 562 776 N
+ AH AE D b n/a 4 507 562 772 N
+ AH AE D s n/a 4 507 562 772 N
+ AH AE DH b n/a 4 514 657 717 N
+ AH AE DH s n/a 4 514 657 717 N
+ AH AE EH s n/a 4 509 663 752 N
+ AH AE ER s n/a 4 509 663 752 N
+ AH AE EY s n/a 4 509 663 752 N
+ AH AE F b n/a 4 514 658 742 N
+ AH AE F i n/a 4 517 658 742 N
+ AH AE F s n/a 4 514 662 742 N
+ AH AE G b n/a 4 510 567 792 N
+ AH AE G s n/a 4 510 568 791 N
+ AH AE HH b n/a 4 509 658 752 N
+ AH AE HH s n/a 4 509 664 753 N
+ AH AE IH s n/a 4 509 663 751 N
+ AH AE IY s n/a 4 509 663 750 N
+ AH AE JH b n/a 4 507 562 772 N
+ AH AE JH s n/a 4 507 562 772 N
+ AH AE K b n/a 4 510 568 788 N
+ AH AE K s n/a 4 510 568 788 N
+ AH AE L b n/a 4 518 707 836 N
+ AH AE L s n/a 4 518 707 836 N
+ AH AE M b n/a 4 514 669 818 N
+ AH AE M i n/a 4 514 669 817 N
+ AH AE M s n/a 4 514 669 818 N
+ AH AE N b n/a 4 513 596 800 N
+ AH AE N i n/a 4 509 596 799 N
+ AH AE N s n/a 4 509 596 799 N
+ AH AE NG b n/a 4 513 605 816 N
+ AH AE NG s n/a 4 509 605 816 N
+ AH AE OW s n/a 4 509 663 752 N
+ AH AE OY s n/a 4 509 663 752 N
+ AH AE P b n/a 4 514 655 729 N
+ AH AE P s n/a 4 514 662 730 N
+ AH AE R b n/a 4 509 658 725 N
+ AH AE R s n/a 4 509 669 725 N
+ AH AE S b n/a 4 509 536 760 N
+ AH AE S s n/a 4 509 540 756 N
+ AH AE SH b n/a 4 509 536 754 N
+ AH AE SH s n/a 4 509 540 754 N
+ AH AE SIL s n/a 4 509 663 740 N
+ AH AE T b n/a 4 507 562 776 N
+ AH AE T s n/a 4 507 562 776 N
+ AH AE TH b n/a 4 514 658 743 N
+ AH AE TH s n/a 4 514 662 743 N
+ AH AE UH s n/a 4 509 663 751 N
+ AH AE UW s n/a 4 509 663 751 N
+ AH AE V b n/a 4 514 644 714 N
+ AH AE V i n/a 4 514 644 715 N
+ AH AE V s n/a 4 514 644 714 N
+ AH AE W b n/a 4 518 707 840 N
+ AH AE W s n/a 4 518 707 840 N
+ AH AE Y b n/a 4 509 658 750 N
+ AH AE Y s n/a 4 509 663 750 N
+ AH AE Z b n/a 4 509 536 767 N
+ AH AE Z s n/a 4 509 536 767 N
+ AH AE ZH s n/a 4 509 536 767 N
+ AH AH AA s n/a 4 512 663 752 N
+ AH AH AE s n/a 4 512 663 752 N
+ AH AH AH s n/a 4 512 663 752 N
+ AH AH AO s n/a 4 512 663 752 N
+ AH AH AW s n/a 4 512 663 752 N
+ AH AH AY s n/a 4 512 663 752 N
+ AH AH B b n/a 4 512 646 726 N
+ AH AH B s n/a 4 512 646 726 N
+ AH AH CH b n/a 4 512 562 776 N
+ AH AH CH s n/a 4 512 562 776 N
+ AH AH D b n/a 4 512 562 772 N
+ AH AH D s n/a 4 512 562 772 N
+ AH AH DH b n/a 4 514 657 717 N
+ AH AH DH s n/a 4 514 657 717 N
+ AH AH EH s n/a 4 512 663 752 N
+ AH AH ER s n/a 4 512 663 752 N
+ AH AH EY s n/a 4 512 663 752 N
+ AH AH F b n/a 4 512 658 742 N
+ AH AH F s n/a 4 512 662 742 N
+ AH AH G b n/a 4 512 567 792 N
+ AH AH G s n/a 4 512 568 791 N
+ AH AH HH b n/a 4 511 658 752 N
+ AH AH HH s n/a 4 512 664 753 N
+ AH AH IH s n/a 4 512 663 751 N
+ AH AH IY s n/a 4 512 663 750 N
+ AH AH JH b n/a 4 512 562 772 N
+ AH AH JH s n/a 4 512 562 772 N
+ AH AH K b n/a 4 512 568 787 N
+ AH AH K i n/a 4 512 579 787 N
+ AH AH K s n/a 4 512 568 787 N
+ AH AH L b n/a 4 519 707 836 N
+ AH AH L i n/a 4 519 707 828 N
+ AH AH L s n/a 4 519 707 836 N
+ AH AH M b n/a 4 512 669 818 N
+ AH AH M i n/a 4 512 669 817 N
+ AH AH M s n/a 4 512 669 818 N
+ AH AH N b n/a 4 511 596 800 N
+ AH AH N i n/a 4 512 596 799 N
+ AH AH N s n/a 4 512 596 799 N
+ AH AH NG b n/a 4 511 605 816 N
+ AH AH NG s n/a 4 512 605 816 N
+ AH AH OW s n/a 4 512 663 752 N
+ AH AH OY s n/a 4 512 663 752 N
+ AH AH P b n/a 4 512 655 729 N
+ AH AH P s n/a 4 512 663 730 N
+ AH AH R b n/a 4 511 658 725 N
+ AH AH R s n/a 4 512 669 725 N
+ AH AH S b n/a 4 512 536 760 N
+ AH AH S s n/a 4 512 540 756 N
+ AH AH SH b n/a 4 511 536 754 N
+ AH AH SH s n/a 4 512 540 754 N
+ AH AH SIL s n/a 4 512 663 740 N
+ AH AH T b n/a 4 512 562 776 N
+ AH AH T i n/a 4 512 562 770 N
+ AH AH T s n/a 4 512 562 776 N
+ AH AH TH b n/a 4 514 658 743 N
+ AH AH TH s n/a 4 514 662 743 N
+ AH AH UH s n/a 4 512 663 751 N
+ AH AH UW s n/a 4 512 663 751 N
+ AH AH V b n/a 4 511 644 714 N
+ AH AH V s n/a 4 512 644 714 N
+ AH AH W b n/a 4 519 707 840 N
+ AH AH W s n/a 4 519 707 840 N
+ AH AH Y b n/a 4 511 658 750 N
+ AH AH Y s n/a 4 512 663 750 N
+ AH AH Z b n/a 4 512 536 767 N
+ AH AH Z s n/a 4 512 536 767 N
+ AH AH ZH s n/a 4 512 536 767 N
+ AH AO AA e n/a 4 386 687 752 N
+ AH AO AA s n/a 4 388 677 752 N
+ AH AO AE e n/a 4 386 687 752 N
+ AH AO AE s n/a 4 388 677 752 N
+ AH AO AH e n/a 4 386 687 752 N
+ AH AO AH s n/a 4 388 677 752 N
+ AH AO AO e n/a 4 386 687 752 N
+ AH AO AO s n/a 4 388 677 752 N
+ AH AO AW e n/a 4 386 687 752 N
+ AH AO AW s n/a 4 388 677 752 N
+ AH AO AY e n/a 4 386 687 752 N
+ AH AO AY s n/a 4 388 677 752 N
+ AH AO B b n/a 4 372 674 731 N
+ AH AO B e n/a 4 372 687 738 N
+ AH AO B s n/a 4 372 674 731 N
+ AH AO CH b n/a 4 380 568 776 N
+ AH AO CH e n/a 4 380 568 776 N
+ AH AO CH s n/a 4 380 568 776 N
+ AH AO D b n/a 4 381 568 772 N
+ AH AO D e n/a 4 381 568 775 N
+ AH AO D s n/a 4 381 568 772 N
+ AH AO DH b n/a 4 388 680 717 N
+ AH AO DH e n/a 4 388 687 738 N
+ AH AO DH s n/a 4 388 680 717 N
+ AH AO EH e n/a 4 386 687 752 N
+ AH AO EH s n/a 4 388 677 752 N
+ AH AO ER e n/a 4 386 687 752 N
+ AH AO ER s n/a 4 388 677 752 N
+ AH AO EY e n/a 4 386 687 752 N
+ AH AO EY s n/a 4 388 677 752 N
+ AH AO F b n/a 4 372 678 742 N
+ AH AO F e n/a 4 372 687 745 N
+ AH AO F s n/a 4 372 678 742 N
+ AH AO G b n/a 4 382 568 793 N
+ AH AO G e n/a 4 382 568 791 N
+ AH AO G s n/a 4 382 568 791 N
+ AH AO HH b n/a 4 388 677 752 N
+ AH AO HH e n/a 4 386 687 752 N
+ AH AO HH s n/a 4 388 677 753 N
+ AH AO IH e n/a 4 386 687 751 N
+ AH AO IH s n/a 4 388 677 751 N
+ AH AO IY e n/a 4 386 687 750 N
+ AH AO IY s n/a 4 388 677 750 N
+ AH AO JH b n/a 4 381 568 772 N
+ AH AO JH e n/a 4 381 568 775 N
+ AH AO JH s n/a 4 381 568 772 N
+ AH AO K b n/a 4 382 568 787 N
+ AH AO K e n/a 4 382 568 787 N
+ AH AO K s n/a 4 382 568 787 N
+ AH AO L b n/a 4 403 707 836 N
+ AH AO L e n/a 4 403 707 836 N
+ AH AO L i n/a 4 403 707 828 N
+ AH AO L s n/a 4 403 707 836 N
+ AH AO M b n/a 4 372 678 823 N
+ AH AO M e n/a 4 372 687 823 N
+ AH AO M s n/a 4 372 678 823 N
+ AH AO N b n/a 4 387 596 800 N
+ AH AO N e n/a 4 387 596 799 N
+ AH AO N i n/a 4 386 596 799 N
+ AH AO N s n/a 4 387 596 799 N
+ AH AO NG b n/a 4 387 604 823 N
+ AH AO NG e n/a 4 386 604 823 N
+ AH AO NG s n/a 4 387 604 823 N
+ AH AO OW e n/a 4 386 687 752 N
+ AH AO OW s n/a 4 388 677 752 N
+ AH AO OY e n/a 4 386 687 752 N
+ AH AO OY s n/a 4 388 677 752 N
+ AH AO P b n/a 4 372 680 729 N
+ AH AO P e n/a 4 372 687 734 N
+ AH AO P s n/a 4 372 680 730 N
+ AH AO R b n/a 4 388 677 725 N
+ AH AO R e n/a 4 386 687 725 N
+ AH AO R s n/a 4 388 677 725 N
+ AH AO S b n/a 4 382 542 760 N
+ AH AO S e n/a 4 382 554 763 N
+ AH AO S s n/a 4 382 540 756 N
+ AH AO SH b n/a 4 388 542 754 N
+ AH AO SH e n/a 4 386 554 764 N
+ AH AO SH s n/a 4 388 540 754 N
+ AH AO SIL e n/a 4 386 687 739 N
+ AH AO SIL s n/a 4 388 677 740 N
+ AH AO T b n/a 4 381 568 776 N
+ AH AO T e n/a 4 380 568 776 N
+ AH AO T s n/a 4 381 568 776 N
+ AH AO TH b n/a 4 388 677 743 N
+ AH AO TH e n/a 4 386 687 743 N
+ AH AO TH s n/a 4 388 677 743 N
+ AH AO UH e n/a 4 386 687 751 N
+ AH AO UH s n/a 4 388 677 751 N
+ AH AO UW e n/a 4 386 687 751 N
+ AH AO UW s n/a 4 388 677 751 N
+ AH AO V b n/a 4 372 678 713 N
+ AH AO V e n/a 4 372 687 738 N
+ AH AO V s n/a 4 372 678 713 N
+ AH AO W b n/a 4 403 706 841 N
+ AH AO W e n/a 4 403 706 841 N
+ AH AO W s n/a 4 403 706 841 N
+ AH AO Y b n/a 4 388 677 750 N
+ AH AO Y e n/a 4 386 687 750 N
+ AH AO Y s n/a 4 388 677 750 N
+ AH AO Z b n/a 4 382 542 767 N
+ AH AO Z e n/a 4 382 554 767 N
+ AH AO Z s n/a 4 382 540 767 N
+ AH AO ZH e n/a 4 388 554 767 N
+ AH AO ZH s n/a 4 388 540 767 N
+ AH AW AA e n/a 4 386 687 752 N
+ AH AW AA s n/a 4 388 677 752 N
+ AH AW AE e n/a 4 386 687 752 N
+ AH AW AE s n/a 4 388 677 752 N
+ AH AW AH e n/a 4 386 687 752 N
+ AH AW AH s n/a 4 388 677 752 N
+ AH AW AO e n/a 4 386 687 752 N
+ AH AW AO s n/a 4 388 677 752 N
+ AH AW AW e n/a 4 386 687 752 N
+ AH AW AW s n/a 4 388 677 752 N
+ AH AW AY e n/a 4 386 687 752 N
+ AH AW AY s n/a 4 388 677 752 N
+ AH AW B b n/a 4 370 674 731 N
+ AH AW B e n/a 4 370 687 738 N
+ AH AW B i n/a 4 370 675 731 N
+ AH AW B s n/a 4 370 674 731 N
+ AH AW CH b n/a 4 384 568 776 N
+ AH AW CH e n/a 4 384 568 776 N
+ AH AW CH i n/a 4 384 586 784 N
+ AH AW CH s n/a 4 384 568 776 N
+ AH AW D b n/a 4 384 568 772 N
+ AH AW D e n/a 4 384 568 775 N
+ AH AW D i n/a 4 384 587 786 N
+ AH AW D s n/a 4 384 568 772 N
+ AH AW DH b n/a 4 388 680 717 N
+ AH AW DH e n/a 4 388 687 738 N
+ AH AW DH s n/a 4 388 680 717 N
+ AH AW EH e n/a 4 386 687 752 N
+ AH AW EH s n/a 4 388 677 752 N
+ AH AW ER e n/a 4 386 687 752 N
+ AH AW ER s n/a 4 388 677 752 N
+ AH AW EY e n/a 4 386 687 752 N
+ AH AW EY s n/a 4 388 677 752 N
+ AH AW F b n/a 4 370 678 742 N
+ AH AW F e n/a 4 370 687 745 N
+ AH AW F s n/a 4 370 678 742 N
+ AH AW G b n/a 4 384 568 793 N
+ AH AW G e n/a 4 384 568 791 N
+ AH AW G s n/a 4 384 568 791 N
+ AH AW HH b n/a 4 388 677 752 N
+ AH AW HH e n/a 4 386 687 752 N
+ AH AW HH s n/a 4 388 677 753 N
+ AH AW IH e n/a 4 386 687 751 N
+ AH AW IH s n/a 4 388 677 751 N
+ AH AW IY e n/a 4 386 687 750 N
+ AH AW IY s n/a 4 388 677 750 N
+ AH AW JH b n/a 4 384 568 772 N
+ AH AW JH e n/a 4 384 568 775 N
+ AH AW JH i n/a 4 384 586 784 N
+ AH AW JH s n/a 4 384 568 772 N
+ AH AW K b n/a 4 384 568 787 N
+ AH AW K e n/a 4 384 568 787 N
+ AH AW K i n/a 4 384 587 787 N
+ AH AW K s n/a 4 384 568 787 N
+ AH AW L b n/a 4 403 706 836 N
+ AH AW L e n/a 4 403 706 836 N
+ AH AW L i n/a 4 403 706 828 N
+ AH AW L s n/a 4 403 706 836 N
+ AH AW M b n/a 4 370 678 823 N
+ AH AW M e n/a 4 370 687 823 N
+ AH AW M i n/a 4 370 678 823 N
+ AH AW M s n/a 4 370 678 823 N
+ AH AW N b n/a 4 387 596 800 N
+ AH AW N e n/a 4 387 596 799 N
+ AH AW N i n/a 4 386 596 799 N
+ AH AW N s n/a 4 387 596 799 N
+ AH AW NG b n/a 4 387 604 823 N
+ AH AW NG e n/a 4 386 604 823 N
+ AH AW NG s n/a 4 387 604 823 N
+ AH AW OW e n/a 4 386 687 752 N
+ AH AW OW s n/a 4 388 677 752 N
+ AH AW OY e n/a 4 386 687 752 N
+ AH AW OY s n/a 4 388 677 752 N
+ AH AW P b n/a 4 370 680 729 N
+ AH AW P e n/a 4 370 687 734 N
+ AH AW P s n/a 4 370 680 730 N
+ AH AW R b n/a 4 388 677 725 N
+ AH AW R e n/a 4 386 687 725 N
+ AH AW R s n/a 4 388 677 725 N
+ AH AW S b n/a 4 384 542 760 N
+ AH AW S e n/a 4 384 555 763 N
+ AH AW S i n/a 4 384 540 756 N
+ AH AW S s n/a 4 384 540 756 N
+ AH AW SH b n/a 4 388 542 754 N
+ AH AW SH e n/a 4 386 555 764 N
+ AH AW SH s n/a 4 388 540 754 N
+ AH AW SIL e n/a 4 386 687 739 N
+ AH AW SIL s n/a 4 388 677 740 N
+ AH AW T b n/a 4 384 568 776 N
+ AH AW T e n/a 4 384 568 776 N
+ AH AW T i n/a 4 384 586 784 N
+ AH AW T s n/a 4 384 568 776 N
+ AH AW TH b n/a 4 388 677 743 N
+ AH AW TH e n/a 4 386 687 743 N
+ AH AW TH s n/a 4 388 677 743 N
+ AH AW UH e n/a 4 386 687 751 N
+ AH AW UH s n/a 4 388 677 751 N
+ AH AW UW e n/a 4 386 687 751 N
+ AH AW UW s n/a 4 388 677 751 N
+ AH AW V b n/a 4 370 678 713 N
+ AH AW V e n/a 4 370 687 738 N
+ AH AW V s n/a 4 370 678 713 N
+ AH AW W b n/a 4 403 706 841 N
+ AH AW W e n/a 4 403 706 841 N
+ AH AW W s n/a 4 403 706 841 N
+ AH AW Y b n/a 4 388 677 750 N
+ AH AW Y e n/a 4 386 687 750 N
+ AH AW Y s n/a 4 388 677 750 N
+ AH AW Z b n/a 4 385 542 767 N
+ AH AW Z e n/a 4 385 555 767 N
+ AH AW Z i n/a 4 385 540 767 N
+ AH AW Z s n/a 4 385 540 767 N
+ AH AW ZH e n/a 4 388 555 767 N
+ AH AW ZH s n/a 4 388 540 767 N
+ AH AY AA e n/a 4 527 671 752 N
+ AH AY AA s n/a 4 528 663 752 N
+ AH AY AE e n/a 4 527 671 752 N
+ AH AY AE s n/a 4 528 663 752 N
+ AH AY AH e n/a 4 527 671 752 N
+ AH AY AH s n/a 4 528 663 752 N
+ AH AY AO e n/a 4 527 671 752 N
+ AH AY AO s n/a 4 528 663 752 N
+ AH AY AW e n/a 4 527 671 752 N
+ AH AY AW s n/a 4 528 663 752 N
+ AH AY AY e n/a 4 527 671 752 N
+ AH AY AY s n/a 4 528 663 752 N
+ AH AY B b n/a 4 530 647 726 N
+ AH AY B e n/a 4 530 647 738 N
+ AH AY B i n/a 4 530 647 726 N
+ AH AY B s n/a 4 530 647 726 N
+ AH AY CH b n/a 4 524 563 776 N
+ AH AY CH e n/a 4 524 563 776 N
+ AH AY CH i n/a 4 524 586 771 N
+ AH AY CH s n/a 4 524 563 776 N
+ AH AY D b n/a 4 524 563 772 N
+ AH AY D e n/a 4 524 563 775 N
+ AH AY D i n/a 4 524 563 773 N
+ AH AY D s n/a 4 524 563 772 N
+ AH AY DH b n/a 4 528 656 717 N
+ AH AY DH e n/a 4 527 655 738 N
+ AH AY DH s n/a 4 528 656 717 N
+ AH AY EH e n/a 4 527 671 752 N
+ AH AY EH s n/a 4 528 663 752 N
+ AH AY ER e n/a 4 527 671 752 N
+ AH AY ER s n/a 4 528 663 752 N
+ AH AY EY e n/a 4 527 671 752 N
+ AH AY EY s n/a 4 528 663 752 N
+ AH AY F b n/a 4 530 658 743 N
+ AH AY F e n/a 4 530 671 745 N
+ AH AY F i n/a 4 530 658 743 N
+ AH AY F s n/a 4 530 662 743 N
+ AH AY G b n/a 4 524 567 792 N
+ AH AY G e n/a 4 524 567 791 N
+ AH AY G i n/a 4 524 582 791 N
+ AH AY G s n/a 4 524 567 791 N
+ AH AY HH b n/a 4 530 658 752 N
+ AH AY HH e n/a 4 527 671 752 N
+ AH AY HH i n/a 4 530 658 752 N
+ AH AY HH s n/a 4 530 664 753 N
+ AH AY IH e n/a 4 527 671 751 N
+ AH AY IH i n/a 4 528 658 751 N
+ AH AY IH s n/a 4 528 663 751 N
+ AH AY IY e n/a 4 527 671 750 N
+ AH AY IY s n/a 4 528 663 750 N
+ AH AY JH b n/a 4 524 563 772 N
+ AH AY JH e n/a 4 524 563 775 N
+ AH AY JH i n/a 4 524 586 771 N
+ AH AY JH s n/a 4 524 563 772 N
+ AH AY K b n/a 4 524 567 788 N
+ AH AY K e n/a 4 524 567 790 N
+ AH AY K i n/a 4 524 580 788 N
+ AH AY K s n/a 4 524 567 788 N
+ AH AY L b n/a 4 528 701 838 N
+ AH AY L e n/a 4 527 701 838 N
+ AH AY L i n/a 4 528 701 838 N
+ AH AY L s n/a 4 528 701 838 N
+ AH AY M b n/a 4 530 667 818 N
+ AH AY M e n/a 4 530 667 821 N
+ AH AY M i n/a 4 530 667 818 N
+ AH AY M s n/a 4 530 667 818 N
+ AH AY N b n/a 4 520 603 805 N
+ AH AY N e n/a 4 520 603 805 N
+ AH AY N i n/a 4 526 602 804 N
+ AH AY N s n/a 4 520 603 805 N
+ AH AY NG b n/a 4 528 605 816 N
+ AH AY NG e n/a 4 527 605 821 N
+ AH AY NG i n/a 4 528 605 816 N
+ AH AY NG s n/a 4 528 605 816 N
+ AH AY OW e n/a 4 527 671 752 N
+ AH AY OW s n/a 4 528 663 752 N
+ AH AY OY e n/a 4 527 671 752 N
+ AH AY OY s n/a 4 528 663 752 N
+ AH AY P b n/a 4 530 658 730 N
+ AH AY P e n/a 4 530 671 734 N
+ AH AY P i n/a 4 530 658 730 N
+ AH AY P s n/a 4 530 662 730 N
+ AH AY R b n/a 4 528 658 725 N
+ AH AY R e n/a 4 527 671 725 N
+ AH AY R i n/a 4 528 658 725 N
+ AH AY R s n/a 4 528 667 725 N
+ AH AY S b n/a 4 524 549 765 N
+ AH AY S e n/a 4 524 554 765 N
+ AH AY S i n/a 4 524 549 765 N
+ AH AY S s n/a 4 524 549 765 N
+ AH AY SH b n/a 4 530 549 764 N
+ AH AY SH e n/a 4 527 554 764 N
+ AH AY SH i n/a 4 530 549 764 N
+ AH AY SH s n/a 4 530 549 764 N
+ AH AY SIL e n/a 4 527 672 739 N
+ AH AY SIL s n/a 4 530 663 740 N
+ AH AY T b n/a 4 524 563 776 N
+ AH AY T e n/a 4 524 563 776 N
+ AH AY T i n/a 4 524 563 770 N
+ AH AY T s n/a 4 524 563 776 N
+ AH AY TH b n/a 4 530 658 743 N
+ AH AY TH e n/a 4 527 671 743 N
+ AH AY TH i n/a 4 530 658 743 N
+ AH AY TH s n/a 4 530 662 743 N
+ AH AY UH e n/a 4 527 671 751 N
+ AH AY UH s n/a 4 528 663 751 N
+ AH AY UW e n/a 4 527 671 751 N
+ AH AY UW s n/a 4 528 663 751 N
+ AH AY V b n/a 4 530 645 722 N
+ AH AY V e n/a 4 530 645 738 N
+ AH AY V i n/a 4 530 645 722 N
+ AH AY V s n/a 4 530 645 722 N
+ AH AY W b n/a 4 528 701 840 N
+ AH AY W e n/a 4 527 701 840 N
+ AH AY W i n/a 4 528 701 839 N
+ AH AY W s n/a 4 528 701 840 N
+ AH AY Y b n/a 4 528 658 750 N
+ AH AY Y e n/a 4 527 671 750 N
+ AH AY Y s n/a 4 528 663 750 N
+ AH AY Z b n/a 4 521 550 767 N
+ AH AY Z e n/a 4 521 554 767 N
+ AH AY Z i n/a 4 521 552 767 N
+ AH AY Z s n/a 4 521 552 767 N
+ AH AY ZH e n/a 4 527 554 767 N
+ AH AY ZH s n/a 4 528 552 767 N
+ AH B AA e n/a 4 368 687 752 N
+ AH B AA i n/a 4 368 677 752 N
+ AH B AA s n/a 4 368 677 752 N
+ AH B AE e n/a 4 368 687 752 N
+ AH B AE s n/a 4 368 677 752 N
+ AH B AH e n/a 4 368 687 752 N
+ AH B AH s n/a 4 368 677 752 N
+ AH B AO e n/a 4 368 687 752 N
+ AH B AO s n/a 4 368 677 752 N
+ AH B AW e n/a 4 368 687 752 N
+ AH B AW s n/a 4 368 677 752 N
+ AH B AY e n/a 4 368 687 752 N
+ AH B AY s n/a 4 368 677 752 N
+ AH B B b n/a 4 373 675 733 N
+ AH B B e n/a 4 373 687 738 N
+ AH B B i n/a 4 373 675 733 N
+ AH B B s n/a 4 373 675 733 N
+ AH B CH b n/a 4 378 559 776 N
+ AH B CH e n/a 4 378 566 776 N
+ AH B CH i n/a 4 378 590 779 N
+ AH B CH s n/a 4 378 559 776 N
+ AH B D b n/a 4 379 559 772 N
+ AH B D e n/a 4 379 566 774 N
+ AH B D i n/a 4 379 590 782 N
+ AH B D s n/a 4 379 559 772 N
+ AH B DH b n/a 4 368 680 717 N
+ AH B DH e n/a 4 368 687 738 N
+ AH B DH s n/a 4 368 680 717 N
+ AH B EH e n/a 4 368 687 752 N
+ AH B EH s n/a 4 368 677 752 N
+ AH B ER e n/a 4 368 687 752 N
+ AH B ER s n/a 4 368 677 752 N
+ AH B EY e n/a 4 368 687 752 N
+ AH B EY s n/a 4 368 677 752 N
+ AH B F b n/a 4 371 678 742 N
+ AH B F e n/a 4 371 687 745 N
+ AH B F i n/a 4 373 678 742 N
+ AH B F s n/a 4 371 678 742 N
+ AH B G b n/a 4 368 567 792 N
+ AH B G e n/a 4 368 568 791 N
+ AH B G i n/a 4 368 591 791 N
+ AH B G s n/a 4 368 568 791 N
+ AH B HH b n/a 4 368 677 752 N
+ AH B HH e n/a 4 368 687 752 N
+ AH B HH i n/a 4 368 677 752 N
+ AH B HH s n/a 4 368 677 753 N
+ AH B IH e n/a 4 368 687 751 N
+ AH B IH s n/a 4 368 677 751 N
+ AH B IY e n/a 4 368 687 750 N
+ AH B IY s n/a 4 368 677 750 N
+ AH B JH b n/a 4 379 559 772 N
+ AH B JH e n/a 4 379 566 775 N
+ AH B JH i n/a 4 379 590 780 N
+ AH B JH s n/a 4 379 559 772 N
+ AH B K b n/a 4 368 568 790 N
+ AH B K e n/a 4 368 568 790 N
+ AH B K i n/a 4 368 591 789 N
+ AH B K s n/a 4 368 568 790 N
+ AH B L b n/a 4 405 711 833 N
+ AH B L e n/a 4 405 711 833 N
+ AH B L i n/a 4 405 709 832 N
+ AH B L s n/a 4 405 711 833 N
+ AH B M b n/a 4 371 669 818 N
+ AH B M e n/a 4 371 669 821 N
+ AH B M i n/a 4 373 669 817 N
+ AH B M s n/a 4 371 669 818 N
+ AH B N b n/a 4 378 592 798 N
+ AH B N e n/a 4 378 593 797 N
+ AH B N i n/a 4 378 593 798 N
+ AH B N s n/a 4 378 593 798 N
+ AH B NG b n/a 4 368 604 816 N
+ AH B NG e n/a 4 368 604 821 N
+ AH B NG i n/a 4 368 604 816 N
+ AH B NG s n/a 4 368 604 816 N
+ AH B OW e n/a 4 368 687 752 N
+ AH B OW s n/a 4 368 677 752 N
+ AH B OY e n/a 4 368 687 752 N
+ AH B OY s n/a 4 368 677 752 N
+ AH B P b n/a 4 372 680 729 N
+ AH B P e n/a 4 372 687 734 N
+ AH B P i n/a 4 373 680 729 N
+ AH B P s n/a 4 372 680 730 N
+ AH B R b n/a 4 368 677 725 N
+ AH B R e n/a 4 368 687 725 N
+ AH B R i n/a 4 368 677 725 N
+ AH B R s n/a 4 368 677 725 N
+ AH B S b n/a 4 366 536 760 N
+ AH B S e n/a 4 366 554 763 N
+ AH B S i n/a 4 366 536 757 N
+ AH B S s n/a 4 366 540 756 N
+ AH B SH b n/a 4 379 536 754 N
+ AH B SH e n/a 4 379 554 764 N
+ AH B SH i n/a 4 379 536 754 N
+ AH B SH s n/a 4 379 540 754 N
+ AH B SIL e n/a 4 368 687 739 N
+ AH B SIL s n/a 4 368 677 740 N
+ AH B T b n/a 4 379 559 776 N
+ AH B T e n/a 4 379 566 776 N
+ AH B T i n/a 4 379 590 782 N
+ AH B T s n/a 4 379 559 776 N
+ AH B TH b n/a 4 366 677 743 N
+ AH B TH e n/a 4 366 687 743 N
+ AH B TH i n/a 4 366 677 743 N
+ AH B TH s n/a 4 366 677 743 N
+ AH B UH e n/a 4 368 687 751 N
+ AH B UH s n/a 4 368 677 751 N
+ AH B UW e n/a 4 368 687 751 N
+ AH B UW s n/a 4 368 677 751 N
+ AH B V b n/a 4 371 678 714 N
+ AH B V e n/a 4 371 687 738 N
+ AH B V i n/a 4 373 688 716 N
+ AH B V s n/a 4 371 678 714 N
+ AH B W b n/a 4 405 712 833 N
+ AH B W e n/a 4 405 711 833 N
+ AH B W i n/a 4 405 709 832 N
+ AH B W s n/a 4 405 712 833 N
+ AH B Y b n/a 4 379 677 750 N
+ AH B Y e n/a 4 379 687 750 N
+ AH B Y i n/a 4 379 677 750 N
+ AH B Y s n/a 4 379 677 750 N
+ AH B Z b n/a 4 368 536 766 N
+ AH B Z e n/a 4 368 554 766 N
+ AH B Z i n/a 4 368 536 766 N
+ AH B Z s n/a 4 368 536 766 N
+ AH B ZH e n/a 4 379 554 766 N
+ AH B ZH s n/a 4 379 536 766 N
+ AH CH AA e n/a 4 435 671 752 N
+ AH CH AA s n/a 4 434 663 752 N
+ AH CH AE e n/a 4 435 671 752 N
+ AH CH AE s n/a 4 434 663 752 N
+ AH CH AH e n/a 4 435 671 752 N
+ AH CH AH s n/a 4 434 663 752 N
+ AH CH AO e n/a 4 435 671 752 N
+ AH CH AO s n/a 4 434 663 752 N
+ AH CH AW e n/a 4 435 671 752 N
+ AH CH AW s n/a 4 434 663 752 N
+ AH CH AY e n/a 4 435 671 752 N
+ AH CH AY s n/a 4 434 663 752 N
+ AH CH B b n/a 4 444 646 726 N
+ AH CH B e n/a 4 452 646 738 N
+ AH CH B i n/a 4 444 646 726 N
+ AH CH B s n/a 4 444 646 726 N
+ AH CH CH b n/a 4 434 559 776 N
+ AH CH CH e n/a 4 435 566 776 N
+ AH CH CH s n/a 4 434 559 776 N
+ AH CH D b n/a 4 434 559 772 N
+ AH CH D e n/a 4 435 566 775 N
+ AH CH D i n/a 4 435 558 773 N
+ AH CH D s n/a 4 434 559 772 N
+ AH CH DH b n/a 4 435 657 717 N
+ AH CH DH e n/a 4 435 655 738 N
+ AH CH DH s n/a 4 435 657 717 N
+ AH CH EH e n/a 4 435 671 752 N
+ AH CH EH s n/a 4 434 663 752 N
+ AH CH ER e n/a 4 435 671 752 N
+ AH CH ER s n/a 4 434 663 752 N
+ AH CH EY e n/a 4 435 671 752 N
+ AH CH EY s n/a 4 434 663 752 N
+ AH CH F b n/a 4 444 658 742 N
+ AH CH F e n/a 4 452 671 745 N
+ AH CH F i n/a 4 444 658 742 N
+ AH CH F s n/a 4 444 662 742 N
+ AH CH G b n/a 4 434 567 792 N
+ AH CH G e n/a 4 435 569 791 N
+ AH CH G i n/a 4 435 581 791 N
+ AH CH G s n/a 4 434 569 791 N
+ AH CH HH b n/a 4 434 658 752 N
+ AH CH HH e n/a 4 435 671 752 N
+ AH CH HH s n/a 4 434 664 753 N
+ AH CH IH e n/a 4 435 671 751 N
+ AH CH IH s n/a 4 434 663 751 N
+ AH CH IY e n/a 4 435 671 750 N
+ AH CH IY s n/a 4 434 663 750 N
+ AH CH JH b n/a 4 434 559 772 N
+ AH CH JH e n/a 4 435 566 775 N
+ AH CH JH i n/a 4 435 591 771 N
+ AH CH JH s n/a 4 434 559 772 N
+ AH CH K b n/a 4 434 569 788 N
+ AH CH K e n/a 4 435 569 790 N
+ AH CH K i n/a 4 435 581 788 N
+ AH CH K s n/a 4 434 569 788 N
+ AH CH L b n/a 4 462 694 835 N
+ AH CH L e n/a 4 463 701 835 N
+ AH CH L i n/a 4 463 702 825 N
+ AH CH L s n/a 4 462 694 835 N
+ AH CH M b n/a 4 444 666 815 N
+ AH CH M e n/a 4 452 666 821 N
+ AH CH M i n/a 4 444 665 813 N
+ AH CH M s n/a 4 444 666 815 N
+ AH CH N b n/a 4 437 618 803 N
+ AH CH N e n/a 4 437 618 803 N
+ AH CH N i n/a 4 437 618 803 N
+ AH CH N s n/a 4 437 618 803 N
+ AH CH NG b n/a 4 436 600 816 N
+ AH CH NG e n/a 4 435 600 821 N
+ AH CH NG i n/a 4 435 600 816 N
+ AH CH NG s n/a 4 435 600 816 N
+ AH CH OW e n/a 4 435 671 752 N
+ AH CH OW s n/a 4 434 663 752 N
+ AH CH OY e n/a 4 435 671 752 N
+ AH CH OY s n/a 4 434 663 752 N
+ AH CH P b n/a 4 444 655 730 N
+ AH CH P e n/a 4 452 671 734 N
+ AH CH P i n/a 4 444 658 730 N
+ AH CH P s n/a 4 444 662 730 N
+ AH CH R b n/a 4 434 658 725 N
+ AH CH R e n/a 4 435 671 725 N
+ AH CH R s n/a 4 434 667 725 N
+ AH CH S b n/a 4 436 550 759 N
+ AH CH S e n/a 4 436 554 763 N
+ AH CH S i n/a 4 436 546 759 N
+ AH CH S s n/a 4 436 546 759 N
+ AH CH SH b n/a 4 436 550 754 N
+ AH CH SH e n/a 4 436 554 764 N
+ AH CH SH s n/a 4 436 546 754 N
+ AH CH SIL e n/a 4 435 672 739 N
+ AH CH SIL s n/a 4 434 663 740 N
+ AH CH T b n/a 4 434 559 776 N
+ AH CH T e n/a 4 435 566 776 N
+ AH CH T i n/a 4 435 559 771 N
+ AH CH T s n/a 4 434 559 776 N
+ AH CH TH b n/a 4 434 658 743 N
+ AH CH TH e n/a 4 435 671 743 N
+ AH CH TH s n/a 4 434 662 743 N
+ AH CH UH e n/a 4 435 671 751 N
+ AH CH UH s n/a 4 434 663 751 N
+ AH CH UW e n/a 4 435 671 751 N
+ AH CH UW s n/a 4 434 663 751 N
+ AH CH V b n/a 4 444 643 722 N
+ AH CH V e n/a 4 452 643 738 N
+ AH CH V i n/a 4 444 644 722 N
+ AH CH V s n/a 4 444 643 721 N
+ AH CH W b n/a 4 462 696 840 N
+ AH CH W e n/a 4 463 701 840 N
+ AH CH W i n/a 4 463 702 839 N
+ AH CH W s n/a 4 462 696 840 N
+ AH CH Y b n/a 4 434 658 750 N
+ AH CH Y e n/a 4 435 671 750 N
+ AH CH Y i n/a 4 435 658 750 N
+ AH CH Y s n/a 4 434 663 750 N
+ AH CH Z b n/a 4 436 550 768 N
+ AH CH Z e n/a 4 436 554 768 N
+ AH CH Z i n/a 4 436 544 768 N
+ AH CH Z s n/a 4 436 544 768 N
+ AH CH ZH e n/a 4 436 554 768 N
+ AH CH ZH s n/a 4 436 544 768 N
+ AH D AA e n/a 4 489 629 752 N
+ AH D AA s n/a 4 489 663 752 N
+ AH D AE e n/a 4 489 624 752 N
+ AH D AE s n/a 4 489 663 752 N
+ AH D AH e n/a 4 489 624 752 N
+ AH D AH s n/a 4 489 663 752 N
+ AH D AO e n/a 4 489 629 752 N
+ AH D AO i n/a 4 488 658 752 N
+ AH D AO s n/a 4 489 663 752 N
+ AH D AW e n/a 4 489 624 752 N
+ AH D AW s n/a 4 489 663 752 N
+ AH D AY e n/a 4 489 629 752 N
+ AH D AY s n/a 4 489 663 752 N
+ AH D B b n/a 4 480 646 726 N
+ AH D B e n/a 4 504 634 738 N
+ AH D B i n/a 4 482 642 733 N
+ AH D B s n/a 4 480 646 726 N
+ AH D CH b n/a 4 475 559 776 N
+ AH D CH e n/a 4 500 566 776 N
+ AH D CH i n/a 4 483 584 771 N
+ AH D CH s n/a 4 475 559 776 N
+ AH D D b n/a 4 493 559 772 N
+ AH D D e n/a 4 501 566 775 N
+ AH D D i n/a 4 493 558 773 N
+ AH D D s n/a 4 493 559 772 N
+ AH D DH b n/a 4 477 656 717 N
+ AH D DH e n/a 4 504 624 738 N
+ AH D DH s n/a 4 483 656 717 N
+ AH D EH e n/a 4 489 624 752 N
+ AH D EH s n/a 4 489 663 752 N
+ AH D ER e n/a 4 489 629 752 N
+ AH D ER i n/a 4 488 658 752 N
+ AH D ER s n/a 4 489 663 752 N
+ AH D EY e n/a 4 489 624 752 N
+ AH D EY s n/a 4 489 663 752 N
+ AH D F b n/a 4 480 658 743 N
+ AH D F e n/a 4 504 634 745 N
+ AH D F i n/a 4 480 658 742 N
+ AH D F s n/a 4 480 662 743 N
+ AH D G b n/a 4 475 573 792 N
+ AH D G e n/a 4 502 574 791 N
+ AH D G i n/a 4 483 584 791 N
+ AH D G s n/a 4 475 574 791 N
+ AH D HH b n/a 4 474 658 752 N
+ AH D HH e n/a 4 474 629 752 N
+ AH D HH i n/a 4 483 658 752 N
+ AH D HH s n/a 4 474 664 753 N
+ AH D IH e n/a 4 489 624 751 N
+ AH D IH s n/a 4 489 663 751 N
+ AH D IY e n/a 4 489 624 750 N
+ AH D IY s n/a 4 489 663 750 N
+ AH D JH b n/a 4 475 559 772 N
+ AH D JH e n/a 4 501 566 775 N
+ AH D JH i n/a 4 483 577 772 N
+ AH D JH s n/a 4 475 559 772 N
+ AH D K b n/a 4 475 574 790 N
+ AH D K e n/a 4 502 574 790 N
+ AH D K i n/a 4 483 584 789 N
+ AH D K s n/a 4 475 574 790 N
+ AH D L b n/a 4 496 694 835 N
+ AH D L e n/a 4 496 701 835 N
+ AH D L i n/a 4 496 703 825 N
+ AH D L s n/a 4 496 694 835 N
+ AH D M b n/a 4 480 665 818 N
+ AH D M e n/a 4 505 634 821 N
+ AH D M i n/a 4 480 665 818 N
+ AH D M s n/a 4 480 665 818 N
+ AH D N b n/a 4 490 611 808 N
+ AH D N e n/a 4 501 611 809 N
+ AH D N i n/a 4 488 610 811 N
+ AH D N s n/a 4 490 611 808 N
+ AH D NG b n/a 4 474 608 816 N
+ AH D NG e n/a 4 474 608 821 N
+ AH D NG i n/a 4 483 610 816 N
+ AH D NG s n/a 4 474 608 816 N
+ AH D OW e n/a 4 489 629 752 N
+ AH D OW s n/a 4 489 663 752 N
+ AH D OY e n/a 4 489 629 752 N
+ AH D OY s n/a 4 489 663 752 N
+ AH D P b n/a 4 482 655 729 N
+ AH D P e n/a 4 506 634 734 N
+ AH D P i n/a 4 482 658 728 N
+ AH D P s n/a 4 482 662 728 N
+ AH D R b n/a 4 499 658 725 N
+ AH D R e n/a 4 499 639 725 N
+ AH D R i n/a 4 499 658 725 N
+ AH D R s n/a 4 499 667 725 N
+ AH D S b n/a 4 474 539 757 N
+ AH D S e n/a 4 503 554 763 N
+ AH D S i n/a 4 480 539 757 N
+ AH D S s n/a 4 474 540 756 N
+ AH D SH b n/a 4 474 539 757 N
+ AH D SH e n/a 4 474 554 764 N
+ AH D SH i n/a 4 480 539 757 N
+ AH D SH s n/a 4 474 540 756 N
+ AH D SIL e n/a 4 474 624 739 N
+ AH D SIL s n/a 4 473 663 740 N
+ AH D T b n/a 4 493 559 776 N
+ AH D T e n/a 4 501 566 776 N
+ AH D T i n/a 4 493 559 770 N
+ AH D T s n/a 4 493 559 776 N
+ AH D TH b n/a 4 474 658 743 N
+ AH D TH e n/a 4 504 624 743 N
+ AH D TH i n/a 4 480 658 743 N
+ AH D TH s n/a 4 474 662 743 N
+ AH D UH e n/a 4 489 629 751 N
+ AH D UH s n/a 4 489 663 751 N
+ AH D UW e n/a 4 489 629 751 N
+ AH D UW i n/a 4 488 658 751 N
+ AH D UW s n/a 4 489 663 751 N
+ AH D V b n/a 4 480 644 721 N
+ AH D V e n/a 4 504 634 738 N
+ AH D V i n/a 4 480 644 722 N
+ AH D V s n/a 4 480 644 721 N
+ AH D W b n/a 4 498 696 840 N
+ AH D W e n/a 4 498 701 839 N
+ AH D W i n/a 4 498 703 839 N
+ AH D W s n/a 4 498 696 840 N
+ AH D Y b n/a 4 490 658 750 N
+ AH D Y e n/a 4 490 624 750 N
+ AH D Y s n/a 4 490 663 750 N
+ AH D Z b n/a 4 482 537 766 N
+ AH D Z e n/a 4 503 554 766 N
+ AH D Z i n/a 4 482 537 766 N
+ AH D Z s n/a 4 482 537 766 N
+ AH D ZH e n/a 4 483 554 766 N
+ AH D ZH s n/a 4 483 537 766 N
+ AH DH AA e n/a 4 491 629 746 N
+ AH DH AA s n/a 4 491 663 746 N
+ AH DH AE e n/a 4 491 630 751 N
+ AH DH AE s n/a 4 491 663 751 N
+ AH DH AH e n/a 4 491 630 751 N
+ AH DH AH s n/a 4 491 663 751 N
+ AH DH AO e n/a 4 491 629 746 N
+ AH DH AO s n/a 4 491 663 746 N
+ AH DH AW e n/a 4 491 630 751 N
+ AH DH AW s n/a 4 491 663 751 N
+ AH DH AY e n/a 4 491 629 746 N
+ AH DH AY s n/a 4 491 663 746 N
+ AH DH B b n/a 4 487 650 726 N
+ AH DH B e n/a 4 506 632 735 N
+ AH DH B i n/a 4 486 652 726 N
+ AH DH B s n/a 4 487 650 726 N
+ AH DH CH b n/a 4 484 565 776 N
+ AH DH CH e n/a 4 500 565 777 N
+ AH DH CH s n/a 4 487 565 776 N
+ AH DH D b n/a 4 487 565 772 N
+ AH DH D e n/a 4 500 565 775 N
+ AH DH D s n/a 4 487 565 772 N
+ AH DH DH b n/a 4 485 656 717 N
+ AH DH DH e n/a 4 504 625 738 N
+ AH DH DH s n/a 4 487 656 717 N
+ AH DH EH e n/a 4 491 630 751 N
+ AH DH EH s n/a 4 491 663 751 N
+ AH DH ER e n/a 4 491 629 746 N
+ AH DH ER i n/a 4 491 658 746 N
+ AH DH ER s n/a 4 491 663 746 N
+ AH DH EY e n/a 4 491 630 750 N
+ AH DH EY s n/a 4 491 663 750 N
+ AH DH F b n/a 4 487 658 743 N
+ AH DH F e n/a 4 504 631 745 N
+ AH DH F s n/a 4 487 662 743 N
+ AH DH G b n/a 4 484 575 793 N
+ AH DH G e n/a 4 502 575 793 N
+ AH DH G s n/a 4 487 575 793 N
+ AH DH HH b n/a 4 484 658 753 N
+ AH DH HH e n/a 4 484 628 753 N
+ AH DH HH s n/a 4 487 664 753 N
+ AH DH IH e n/a 4 492 630 750 N
+ AH DH IH s n/a 4 492 663 750 N
+ AH DH IY e n/a 4 492 630 750 N
+ AH DH IY s n/a 4 492 663 750 N
+ AH DH JH b n/a 4 484 565 772 N
+ AH DH JH e n/a 4 500 565 775 N
+ AH DH JH s n/a 4 487 565 772 N
+ AH DH K b n/a 4 484 575 790 N
+ AH DH K e n/a 4 502 575 790 N
+ AH DH K s n/a 4 487 575 790 N
+ AH DH L b n/a 4 496 694 835 N
+ AH DH L e n/a 4 496 694 835 N
+ AH DH L i n/a 4 496 703 825 N
+ AH DH L s n/a 4 496 694 835 N
+ AH DH M b n/a 4 487 673 819 N
+ AH DH M e n/a 4 505 633 821 N
+ AH DH M i n/a 4 486 673 819 N
+ AH DH M s n/a 4 487 673 819 N
+ AH DH N b n/a 4 487 593 797 N
+ AH DH N e n/a 4 501 594 797 N
+ AH DH N i n/a 4 487 594 797 N
+ AH DH N s n/a 4 487 593 797 N
+ AH DH NG b n/a 4 484 605 816 N
+ AH DH NG e n/a 4 475 605 821 N
+ AH DH NG s n/a 4 487 605 816 N
+ AH DH OW e n/a 4 491 629 746 N
+ AH DH OW s n/a 4 491 663 746 N
+ AH DH OY e n/a 4 491 629 746 N
+ AH DH OY s n/a 4 491 663 746 N
+ AH DH P b n/a 4 487 655 729 N
+ AH DH P e n/a 4 506 632 734 N
+ AH DH P i n/a 4 486 658 728 N
+ AH DH P s n/a 4 487 662 728 N
+ AH DH R b n/a 4 499 658 724 N
+ AH DH R e n/a 4 499 639 724 N
+ AH DH R s n/a 4 499 667 724 N
+ AH DH S b n/a 4 485 536 760 N
+ AH DH S e n/a 4 503 557 761 N
+ AH DH S i n/a 4 485 536 760 N
+ AH DH S s n/a 4 487 540 759 N
+ AH DH SH b n/a 4 484 536 754 N
+ AH DH SH e n/a 4 475 557 764 N
+ AH DH SH s n/a 4 487 540 754 N
+ AH DH SIL e n/a 4 473 625 740 N
+ AH DH SIL s n/a 4 487 663 740 N
+ AH DH T b n/a 4 487 565 776 N
+ AH DH T e n/a 4 500 565 777 N
+ AH DH T i n/a 4 487 583 785 N
+ AH DH T s n/a 4 487 565 776 N
+ AH DH TH b n/a 4 484 658 743 N
+ AH DH TH e n/a 4 504 626 743 N
+ AH DH TH s n/a 4 487 662 743 N
+ AH DH UH e n/a 4 492 629 750 N
+ AH DH UH s n/a 4 492 663 750 N
+ AH DH UW e n/a 4 492 629 750 N
+ AH DH UW s n/a 4 492 663 750 N
+ AH DH V b n/a 4 487 648 723 N
+ AH DH V e n/a 4 504 634 738 N
+ AH DH V s n/a 4 487 649 723 N
+ AH DH W b n/a 4 495 696 842 N
+ AH DH W e n/a 4 495 695 842 N
+ AH DH W s n/a 4 495 696 842 N
+ AH DH Y b n/a 4 492 658 750 N
+ AH DH Y e n/a 4 492 630 750 N
+ AH DH Y s n/a 4 492 663 750 N
+ AH DH Z b n/a 4 485 536 767 N
+ AH DH Z e n/a 4 503 556 767 N
+ AH DH Z i n/a 4 485 536 767 N
+ AH DH Z s n/a 4 487 536 767 N
+ AH DH ZH e n/a 4 483 557 767 N
+ AH DH ZH s n/a 4 487 536 767 N
+ AH EH AA s n/a 4 509 663 752 N
+ AH EH AE s n/a 4 509 663 752 N
+ AH EH AH s n/a 4 509 663 752 N
+ AH EH AO s n/a 4 509 663 752 N
+ AH EH AW s n/a 4 509 663 752 N
+ AH EH AY s n/a 4 509 663 752 N
+ AH EH B b n/a 4 514 646 726 N
+ AH EH B s n/a 4 514 646 726 N
+ AH EH CH b n/a 4 513 562 776 N
+ AH EH CH i n/a 4 507 586 771 N
+ AH EH CH s n/a 4 507 562 776 N
+ AH EH D b n/a 4 513 562 772 N
+ AH EH D s n/a 4 507 562 772 N
+ AH EH DH b n/a 4 514 657 717 N
+ AH EH DH s n/a 4 514 657 717 N
+ AH EH EH s n/a 4 509 663 752 N
+ AH EH ER s n/a 4 509 663 752 N
+ AH EH EY s n/a 4 509 663 752 N
+ AH EH F b n/a 4 514 658 742 N
+ AH EH F s n/a 4 514 662 742 N
+ AH EH G b n/a 4 513 567 792 N
+ AH EH G s n/a 4 510 568 791 N
+ AH EH HH b n/a 4 513 658 752 N
+ AH EH HH s n/a 4 509 664 753 N
+ AH EH IH s n/a 4 509 663 751 N
+ AH EH IY s n/a 4 509 663 750 N
+ AH EH JH b n/a 4 513 562 772 N
+ AH EH JH s n/a 4 507 562 772 N
+ AH EH K b n/a 4 513 568 788 N
+ AH EH K i n/a 4 510 579 788 N
+ AH EH K s n/a 4 510 568 788 N
+ AH EH L b n/a 4 518 707 836 N
+ AH EH L i n/a 4 519 707 828 N
+ AH EH L s n/a 4 518 707 836 N
+ AH EH M b n/a 4 514 669 818 N
+ AH EH M i n/a 4 514 669 817 N
+ AH EH M s n/a 4 514 669 818 N
+ AH EH N b n/a 4 513 596 800 N
+ AH EH N i n/a 4 509 596 799 N
+ AH EH N s n/a 4 509 596 799 N
+ AH EH NG b n/a 4 513 605 816 N
+ AH EH NG s n/a 4 509 605 816 N
+ AH EH OW s n/a 4 509 663 752 N
+ AH EH OY s n/a 4 509 663 752 N
+ AH EH P b n/a 4 514 655 729 N
+ AH EH P s n/a 4 514 663 730 N
+ AH EH R b n/a 4 513 658 725 N
+ AH EH R s n/a 4 509 669 725 N
+ AH EH S b n/a 4 513 536 760 N
+ AH EH S s n/a 4 509 540 756 N
+ AH EH SH b n/a 4 513 536 754 N
+ AH EH SH i n/a 4 507 536 754 N
+ AH EH SH s n/a 4 509 540 754 N
+ AH EH SIL s n/a 4 509 663 740 N
+ AH EH T b n/a 4 513 562 776 N
+ AH EH T s n/a 4 507 562 776 N
+ AH EH TH b n/a 4 514 658 743 N
+ AH EH TH s n/a 4 514 662 743 N
+ AH EH UH s n/a 4 509 663 751 N
+ AH EH UW s n/a 4 509 663 751 N
+ AH EH V b n/a 4 514 644 714 N
+ AH EH V s n/a 4 514 644 714 N
+ AH EH W b n/a 4 518 707 840 N
+ AH EH W s n/a 4 518 707 840 N
+ AH EH Y b n/a 4 513 658 750 N
+ AH EH Y s n/a 4 509 663 750 N
+ AH EH Z b n/a 4 513 536 767 N
+ AH EH Z s n/a 4 509 536 767 N
+ AH EH ZH s n/a 4 509 536 767 N
+ AH ER AA e n/a 4 394 687 752 N
+ AH ER AA s n/a 4 395 677 752 N
+ AH ER AE e n/a 4 394 687 752 N
+ AH ER AE s n/a 4 395 677 752 N
+ AH ER AH e n/a 4 394 687 752 N
+ AH ER AH s n/a 4 395 677 752 N
+ AH ER AO e n/a 4 394 687 752 N
+ AH ER AO s n/a 4 395 677 752 N
+ AH ER AW e n/a 4 394 687 752 N
+ AH ER AW s n/a 4 395 677 752 N
+ AH ER AY e n/a 4 394 687 752 N
+ AH ER AY s n/a 4 395 677 752 N
+ AH ER B b n/a 4 398 691 732 N
+ AH ER B e n/a 4 398 691 738 N
+ AH ER B i n/a 4 400 691 732 N
+ AH ER B s n/a 4 398 691 732 N
+ AH ER CH b n/a 4 396 571 778 N
+ AH ER CH e n/a 4 391 571 778 N
+ AH ER CH i n/a 4 391 571 778 N
+ AH ER CH s n/a 4 391 571 778 N
+ AH ER D b n/a 4 396 571 778 N
+ AH ER D e n/a 4 391 571 778 N
+ AH ER D i n/a 4 391 571 778 N
+ AH ER D s n/a 4 391 571 778 N
+ AH ER DH b n/a 4 394 680 717 N
+ AH ER DH e n/a 4 394 687 738 N
+ AH ER DH i n/a 4 394 685 717 N
+ AH ER DH s n/a 4 394 680 717 N
+ AH ER EH e n/a 4 394 687 752 N
+ AH ER EH s n/a 4 395 677 752 N
+ AH ER ER e n/a 4 394 687 752 N
+ AH ER ER i n/a 4 394 677 752 N
+ AH ER ER s n/a 4 395 677 752 N
+ AH ER EY e n/a 4 394 687 752 N
+ AH ER EY s n/a 4 395 677 752 N
+ AH ER F b n/a 4 398 691 744 N
+ AH ER F e n/a 4 398 691 744 N
+ AH ER F i n/a 4 400 691 744 N
+ AH ER F s n/a 4 398 691 744 N
+ AH ER G b n/a 4 396 571 793 N
+ AH ER G e n/a 4 396 571 791 N
+ AH ER G i n/a 4 395 569 791 N
+ AH ER G s n/a 4 396 571 791 N
+ AH ER HH b n/a 4 394 677 752 N
+ AH ER HH e n/a 4 394 687 752 N
+ AH ER HH s n/a 4 395 677 753 N
+ AH ER IH e n/a 4 394 687 751 N
+ AH ER IH s n/a 4 395 677 751 N
+ AH ER IY e n/a 4 394 687 750 N
+ AH ER IY s n/a 4 395 677 750 N
+ AH ER JH b n/a 4 396 571 778 N
+ AH ER JH e n/a 4 391 571 778 N
+ AH ER JH i n/a 4 391 571 778 N
+ AH ER JH s n/a 4 391 571 778 N
+ AH ER K b n/a 4 396 570 787 N
+ AH ER K e n/a 4 396 570 787 N
+ AH ER K i n/a 4 395 570 787 N
+ AH ER K s n/a 4 396 570 787 N
+ AH ER L b n/a 4 402 708 836 N
+ AH ER L e n/a 4 402 708 836 N
+ AH ER L i n/a 4 402 708 830 N
+ AH ER L s n/a 4 402 708 836 N
+ AH ER M b n/a 4 398 692 822 N
+ AH ER M e n/a 4 398 692 822 N
+ AH ER M i n/a 4 401 692 822 N
+ AH ER M s n/a 4 398 692 822 N
+ AH ER N b n/a 4 393 598 801 N
+ AH ER N e n/a 4 396 598 801 N
+ AH ER N i n/a 4 397 598 801 N
+ AH ER N s n/a 4 396 598 801 N
+ AH ER NG b n/a 4 393 604 823 N
+ AH ER NG e n/a 4 394 604 823 N
+ AH ER NG i n/a 4 394 604 823 N
+ AH ER NG s n/a 4 395 604 823 N
+ AH ER OW e n/a 4 394 687 752 N
+ AH ER OW i n/a 4 394 677 752 N
+ AH ER OW s n/a 4 395 677 752 N
+ AH ER OY e n/a 4 394 687 752 N
+ AH ER OY s n/a 4 395 677 752 N
+ AH ER P b n/a 4 398 689 729 N
+ AH ER P e n/a 4 398 689 734 N
+ AH ER P i n/a 4 399 689 729 N
+ AH ER P s n/a 4 398 689 730 N
+ AH ER R b n/a 4 394 677 725 N
+ AH ER R e n/a 4 394 687 725 N
+ AH ER R i n/a 4 394 677 725 N
+ AH ER R s n/a 4 395 677 725 N
+ AH ER S b n/a 4 394 542 755 N
+ AH ER S e n/a 4 392 554 763 N
+ AH ER S i n/a 4 392 541 755 N
+ AH ER S s n/a 4 392 541 755 N
+ AH ER SH b n/a 4 394 542 754 N
+ AH ER SH e n/a 4 394 554 764 N
+ AH ER SH i n/a 4 395 542 754 N
+ AH ER SH s n/a 4 395 542 754 N
+ AH ER SIL e n/a 4 394 687 739 N
+ AH ER SIL s n/a 4 395 677 740 N
+ AH ER T b n/a 4 396 571 778 N
+ AH ER T e n/a 4 391 571 778 N
+ AH ER T i n/a 4 391 571 778 N
+ AH ER T s n/a 4 391 571 778 N
+ AH ER TH b n/a 4 394 677 745 N
+ AH ER TH e n/a 4 394 687 743 N
+ AH ER TH i n/a 4 395 677 745 N
+ AH ER TH s n/a 4 395 677 745 N
+ AH ER UH e n/a 4 394 687 751 N
+ AH ER UH s n/a 4 395 677 751 N
+ AH ER UW e n/a 4 394 687 751 N
+ AH ER UW s n/a 4 395 677 751 N
+ AH ER V b n/a 4 398 690 718 N
+ AH ER V e n/a 4 398 690 738 N
+ AH ER V i n/a 4 400 691 718 N
+ AH ER V s n/a 4 398 690 718 N
+ AH ER W b n/a 4 402 708 841 N
+ AH ER W e n/a 4 402 708 841 N
+ AH ER W i n/a 4 402 708 841 N
+ AH ER W s n/a 4 402 708 841 N
+ AH ER Y b n/a 4 394 677 750 N
+ AH ER Y e n/a 4 394 687 750 N
+ AH ER Y s n/a 4 395 677 750 N
+ AH ER Z b n/a 4 394 542 767 N
+ AH ER Z e n/a 4 392 554 767 N
+ AH ER Z i n/a 4 392 541 767 N
+ AH ER Z s n/a 4 392 541 767 N
+ AH ER ZH e n/a 4 394 554 767 N
+ AH ER ZH s n/a 4 394 542 767 N
+ AH EY AA e n/a 4 527 671 752 N
+ AH EY AA s n/a 4 528 663 752 N
+ AH EY AE e n/a 4 527 671 752 N
+ AH EY AE s n/a 4 528 663 752 N
+ AH EY AH e n/a 4 527 671 752 N
+ AH EY AH s n/a 4 528 663 752 N
+ AH EY AO e n/a 4 527 671 752 N
+ AH EY AO s n/a 4 528 663 752 N
+ AH EY AW e n/a 4 527 671 752 N
+ AH EY AW s n/a 4 528 663 752 N
+ AH EY AY e n/a 4 527 671 752 N
+ AH EY AY s n/a 4 528 663 752 N
+ AH EY B b n/a 4 531 647 726 N
+ AH EY B e n/a 4 531 647 738 N
+ AH EY B i n/a 4 531 647 726 N
+ AH EY B s n/a 4 531 647 726 N
+ AH EY CH b n/a 4 523 563 776 N
+ AH EY CH e n/a 4 523 563 776 N
+ AH EY CH s n/a 4 523 563 776 N
+ AH EY D b n/a 4 523 563 772 N
+ AH EY D e n/a 4 523 563 775 N
+ AH EY D i n/a 4 522 563 773 N
+ AH EY D s n/a 4 523 563 772 N
+ AH EY DH b n/a 4 528 657 717 N
+ AH EY DH e n/a 4 527 655 738 N
+ AH EY DH s n/a 4 528 657 717 N
+ AH EY EH e n/a 4 527 671 752 N
+ AH EY EH s n/a 4 528 663 752 N
+ AH EY ER e n/a 4 527 671 752 N
+ AH EY ER s n/a 4 528 663 752 N
+ AH EY EY e n/a 4 527 671 752 N
+ AH EY EY s n/a 4 528 663 752 N
+ AH EY F b n/a 4 531 658 743 N
+ AH EY F e n/a 4 531 671 745 N
+ AH EY F i n/a 4 531 658 743 N
+ AH EY F s n/a 4 531 662 743 N
+ AH EY G b n/a 4 523 567 792 N
+ AH EY G e n/a 4 523 567 791 N
+ AH EY G s n/a 4 523 567 791 N
+ AH EY HH b n/a 4 530 658 752 N
+ AH EY HH e n/a 4 527 671 752 N
+ AH EY HH s n/a 4 530 664 753 N
+ AH EY IH e n/a 4 527 671 751 N
+ AH EY IH s n/a 4 528 663 751 N
+ AH EY IY e n/a 4 527 671 750 N
+ AH EY IY s n/a 4 528 663 750 N
+ AH EY JH b n/a 4 523 563 772 N
+ AH EY JH e n/a 4 523 563 775 N
+ AH EY JH s n/a 4 523 563 772 N
+ AH EY K b n/a 4 523 567 788 N
+ AH EY K e n/a 4 523 567 790 N
+ AH EY K i n/a 4 521 580 788 N
+ AH EY K s n/a 4 523 567 788 N
+ AH EY L b n/a 4 532 701 838 N
+ AH EY L e n/a 4 532 701 837 N
+ AH EY L i n/a 4 532 701 838 N
+ AH EY L s n/a 4 532 701 838 N
+ AH EY M b n/a 4 531 667 818 N
+ AH EY M e n/a 4 531 667 820 N
+ AH EY M i n/a 4 531 667 818 N
+ AH EY M s n/a 4 531 667 818 N
+ AH EY N b n/a 4 520 603 805 N
+ AH EY N e n/a 4 520 603 805 N
+ AH EY N i n/a 4 525 602 804 N
+ AH EY N s n/a 4 520 603 805 N
+ AH EY NG b n/a 4 528 605 816 N
+ AH EY NG e n/a 4 527 605 820 N
+ AH EY NG s n/a 4 528 605 816 N
+ AH EY OW e n/a 4 527 671 752 N
+ AH EY OW s n/a 4 528 663 752 N
+ AH EY OY e n/a 4 527 671 752 N
+ AH EY OY s n/a 4 528 663 752 N
+ AH EY P b n/a 4 531 658 730 N
+ AH EY P e n/a 4 531 671 734 N
+ AH EY P i n/a 4 531 658 730 N
+ AH EY P s n/a 4 531 662 730 N
+ AH EY R b n/a 4 531 658 725 N
+ AH EY R e n/a 4 531 671 725 N
+ AH EY R s n/a 4 531 667 725 N
+ AH EY S b n/a 4 521 549 765 N
+ AH EY S e n/a 4 521 554 765 N
+ AH EY S i n/a 4 521 549 765 N
+ AH EY S s n/a 4 521 549 765 N
+ AH EY SH b n/a 4 530 549 764 N
+ AH EY SH e n/a 4 527 554 764 N
+ AH EY SH s n/a 4 530 549 764 N
+ AH EY SIL e n/a 4 527 672 739 N
+ AH EY SIL s n/a 4 530 663 740 N
+ AH EY T b n/a 4 523 563 776 N
+ AH EY T e n/a 4 523 563 776 N
+ AH EY T i n/a 4 521 563 770 N
+ AH EY T s n/a 4 523 563 776 N
+ AH EY TH b n/a 4 530 658 743 N
+ AH EY TH e n/a 4 527 671 743 N
+ AH EY TH i n/a 4 530 658 743 N
+ AH EY TH s n/a 4 530 662 743 N
+ AH EY UH e n/a 4 527 671 751 N
+ AH EY UH s n/a 4 528 663 751 N
+ AH EY UW e n/a 4 527 671 751 N
+ AH EY UW s n/a 4 528 663 751 N
+ AH EY V b n/a 4 531 645 722 N
+ AH EY V e n/a 4 531 645 738 N
+ AH EY V i n/a 4 531 645 722 N
+ AH EY V s n/a 4 531 645 722 N
+ AH EY W b n/a 4 532 701 840 N
+ AH EY W e n/a 4 532 701 840 N
+ AH EY W i n/a 4 532 701 839 N
+ AH EY W s n/a 4 532 701 840 N
+ AH EY Y b n/a 4 528 658 750 N
+ AH EY Y e n/a 4 527 671 750 N
+ AH EY Y s n/a 4 528 663 750 N
+ AH EY Z b n/a 4 521 550 767 N
+ AH EY Z e n/a 4 521 554 767 N
+ AH EY Z i n/a 4 521 553 767 N
+ AH EY Z s n/a 4 521 553 767 N
+ AH EY ZH e n/a 4 527 554 767 N
+ AH EY ZH s n/a 4 528 553 767 N
+ AH F AA e n/a 4 455 677 752 N
+ AH F AA i n/a 4 453 677 752 N
+ AH F AA s n/a 4 455 677 752 N
+ AH F AE e n/a 4 455 677 752 N
+ AH F AE s n/a 4 455 677 752 N
+ AH F AH e n/a 4 455 677 752 N
+ AH F AH s n/a 4 455 677 752 N
+ AH F AO e n/a 4 455 677 752 N
+ AH F AO s n/a 4 455 677 752 N
+ AH F AW e n/a 4 455 677 752 N
+ AH F AW s n/a 4 455 677 752 N
+ AH F AY e n/a 4 455 677 752 N
+ AH F AY s n/a 4 455 677 752 N
+ AH F B b n/a 4 455 675 731 N
+ AH F B e n/a 4 455 675 738 N
+ AH F B i n/a 4 453 675 731 N
+ AH F B s n/a 4 455 675 731 N
+ AH F CH b n/a 4 458 564 776 N
+ AH F CH e n/a 4 458 564 776 N
+ AH F CH i n/a 4 458 587 779 N
+ AH F CH s n/a 4 458 564 776 N
+ AH F D b n/a 4 458 564 772 N
+ AH F D e n/a 4 458 564 775 N
+ AH F D i n/a 4 458 576 785 N
+ AH F D s n/a 4 458 564 772 N
+ AH F DH b n/a 4 459 680 717 N
+ AH F DH e n/a 4 459 680 738 N
+ AH F DH i n/a 4 459 680 717 N
+ AH F DH s n/a 4 459 680 717 N
+ AH F EH e n/a 4 455 677 752 N
+ AH F EH s n/a 4 455 677 752 N
+ AH F ER e n/a 4 455 677 752 N
+ AH F ER s n/a 4 455 677 752 N
+ AH F EY e n/a 4 455 677 752 N
+ AH F EY s n/a 4 455 677 752 N
+ AH F F b n/a 4 455 678 742 N
+ AH F F e n/a 4 455 678 745 N
+ AH F F i n/a 4 453 678 742 N
+ AH F F s n/a 4 455 678 742 N
+ AH F G b n/a 4 458 567 793 N
+ AH F G e n/a 4 458 568 791 N
+ AH F G i n/a 4 458 580 791 N
+ AH F G s n/a 4 458 568 791 N
+ AH F HH b n/a 4 454 677 753 N
+ AH F HH e n/a 4 455 677 753 N
+ AH F HH i n/a 4 453 677 753 N
+ AH F HH s n/a 4 455 677 753 N
+ AH F IH e n/a 4 455 677 751 N
+ AH F IH s n/a 4 455 677 751 N
+ AH F IY e n/a 4 455 677 750 N
+ AH F IY s n/a 4 455 677 750 N
+ AH F JH b n/a 4 458 564 772 N
+ AH F JH e n/a 4 458 564 775 N
+ AH F JH i n/a 4 458 586 783 N
+ AH F JH s n/a 4 458 564 772 N
+ AH F K b n/a 4 458 568 790 N
+ AH F K e n/a 4 458 568 790 N
+ AH F K i n/a 4 458 580 790 N
+ AH F K s n/a 4 458 568 790 N
+ AH F L b n/a 4 468 712 833 N
+ AH F L e n/a 4 468 712 833 N
+ AH F L i n/a 4 468 712 831 N
+ AH F L s n/a 4 468 712 833 N
+ AH F M b n/a 4 454 669 815 N
+ AH F M e n/a 4 455 669 821 N
+ AH F M i n/a 4 453 669 815 N
+ AH F M s n/a 4 455 669 815 N
+ AH F N b n/a 4 453 601 800 N
+ AH F N e n/a 4 453 601 800 N
+ AH F N i n/a 4 453 600 800 N
+ AH F N s n/a 4 453 601 800 N
+ AH F NG b n/a 4 454 601 816 N
+ AH F NG e n/a 4 455 601 821 N
+ AH F NG i n/a 4 454 600 816 N
+ AH F NG s n/a 4 455 601 816 N
+ AH F OW e n/a 4 455 677 752 N
+ AH F OW s n/a 4 455 677 752 N
+ AH F OY e n/a 4 455 677 752 N
+ AH F OY s n/a 4 455 677 752 N
+ AH F P b n/a 4 454 680 729 N
+ AH F P e n/a 4 455 680 734 N
+ AH F P i n/a 4 453 680 729 N
+ AH F P s n/a 4 455 680 730 N
+ AH F R b n/a 4 454 677 725 N
+ AH F R e n/a 4 455 677 725 N
+ AH F R i n/a 4 453 677 725 N
+ AH F R s n/a 4 455 677 725 N
+ AH F S b n/a 4 459 550 763 N
+ AH F S e n/a 4 459 554 763 N
+ AH F S i n/a 4 459 546 763 N
+ AH F S s n/a 4 459 546 763 N
+ AH F SH b n/a 4 459 550 764 N
+ AH F SH e n/a 4 459 554 764 N
+ AH F SH s n/a 4 459 546 764 N
+ AH F SIL e n/a 4 455 677 739 N
+ AH F SIL s n/a 4 455 677 740 N
+ AH F T b n/a 4 458 564 776 N
+ AH F T e n/a 4 458 564 776 N
+ AH F T i n/a 4 458 576 783 N
+ AH F T s n/a 4 458 564 776 N
+ AH F TH b n/a 4 459 677 743 N
+ AH F TH e n/a 4 459 677 743 N
+ AH F TH i n/a 4 459 677 743 N
+ AH F TH s n/a 4 459 677 743 N
+ AH F UH e n/a 4 455 677 751 N
+ AH F UH s n/a 4 455 677 751 N
+ AH F UW e n/a 4 455 677 751 N
+ AH F UW s n/a 4 455 677 751 N
+ AH F V b n/a 4 455 678 714 N
+ AH F V e n/a 4 455 678 738 N
+ AH F V i n/a 4 453 678 715 N
+ AH F V s n/a 4 455 678 714 N
+ AH F W b n/a 4 468 712 833 N
+ AH F W e n/a 4 468 712 833 N
+ AH F W s n/a 4 467 712 833 N
+ AH F Y b n/a 4 454 677 750 N
+ AH F Y e n/a 4 455 677 750 N
+ AH F Y i n/a 4 453 677 750 N
+ AH F Y s n/a 4 455 677 750 N
+ AH F Z b n/a 4 459 550 767 N
+ AH F Z e n/a 4 459 554 767 N
+ AH F Z i n/a 4 459 548 767 N
+ AH F Z s n/a 4 459 546 767 N
+ AH F ZH e n/a 4 459 554 767 N
+ AH F ZH s n/a 4 459 546 767 N
+ AH G AA e n/a 4 489 671 752 N
+ AH G AA s n/a 4 489 663 752 N
+ AH G AE e n/a 4 489 671 752 N
+ AH G AE s n/a 4 489 663 752 N
+ AH G AH e n/a 4 489 671 752 N
+ AH G AH s n/a 4 489 663 752 N
+ AH G AO e n/a 4 489 671 752 N
+ AH G AO s n/a 4 489 663 752 N
+ AH G AW e n/a 4 489 671 752 N
+ AH G AW s n/a 4 489 663 752 N
+ AH G AY e n/a 4 489 671 752 N
+ AH G AY s n/a 4 489 663 752 N
+ AH G B b n/a 4 481 646 726 N
+ AH G B e n/a 4 504 646 738 N
+ AH G B i n/a 4 478 642 733 N
+ AH G B s n/a 4 481 646 726 N
+ AH G CH b n/a 4 475 560 776 N
+ AH G CH e n/a 4 500 566 776 N
+ AH G CH i n/a 4 478 590 771 N
+ AH G CH s n/a 4 475 560 776 N
+ AH G D b n/a 4 493 560 772 N
+ AH G D e n/a 4 501 566 775 N
+ AH G D i n/a 4 493 560 773 N
+ AH G D s n/a 4 493 560 772 N
+ AH G DH b n/a 4 483 656 717 N
+ AH G DH e n/a 4 504 655 738 N
+ AH G DH s n/a 4 483 656 717 N
+ AH G EH e n/a 4 489 671 752 N
+ AH G EH s n/a 4 489 663 752 N
+ AH G ER e n/a 4 489 671 752 N
+ AH G ER i n/a 4 489 658 752 N
+ AH G ER s n/a 4 489 663 752 N
+ AH G EY e n/a 4 489 671 752 N
+ AH G EY s n/a 4 489 663 752 N
+ AH G F b n/a 4 481 658 742 N
+ AH G F e n/a 4 504 671 745 N
+ AH G F i n/a 4 479 658 742 N
+ AH G F s n/a 4 481 662 742 N
+ AH G G b n/a 4 475 567 792 N
+ AH G G e n/a 4 502 569 793 N
+ AH G G i n/a 4 477 591 792 N
+ AH G G s n/a 4 475 569 793 N
+ AH G HH b n/a 4 474 658 752 N
+ AH G HH e n/a 4 474 671 752 N
+ AH G HH i n/a 4 479 658 752 N
+ AH G HH s n/a 4 474 664 753 N
+ AH G IH e n/a 4 489 671 751 N
+ AH G IH s n/a 4 489 663 751 N
+ AH G IY e n/a 4 489 671 750 N
+ AH G IY s n/a 4 489 663 750 N
+ AH G JH b n/a 4 475 560 772 N
+ AH G JH e n/a 4 501 566 775 N
+ AH G JH i n/a 4 477 590 771 N
+ AH G JH s n/a 4 475 560 772 N
+ AH G K b n/a 4 475 569 790 N
+ AH G K e n/a 4 502 569 790 N
+ AH G K i n/a 4 479 591 789 N
+ AH G K s n/a 4 475 569 790 N
+ AH G L b n/a 4 497 694 835 N
+ AH G L e n/a 4 497 701 835 N
+ AH G L i n/a 4 497 711 826 N
+ AH G L s n/a 4 497 694 835 N
+ AH G M b n/a 4 481 670 818 N
+ AH G M e n/a 4 505 670 821 N
+ AH G M i n/a 4 477 670 817 N
+ AH G M s n/a 4 481 670 818 N
+ AH G N b n/a 4 489 603 805 N
+ AH G N e n/a 4 501 603 805 N
+ AH G N i n/a 4 489 603 805 N
+ AH G N s n/a 4 489 603 805 N
+ AH G NG b n/a 4 474 605 816 N
+ AH G NG e n/a 4 474 605 821 N
+ AH G NG i n/a 4 477 605 816 N
+ AH G NG s n/a 4 474 605 816 N
+ AH G OW e n/a 4 489 671 752 N
+ AH G OW s n/a 4 489 663 752 N
+ AH G OY e n/a 4 489 671 752 N
+ AH G OY s n/a 4 489 663 752 N
+ AH G P b n/a 4 482 655 729 N
+ AH G P e n/a 4 506 671 734 N
+ AH G P i n/a 4 478 658 729 N
+ AH G P s n/a 4 482 662 730 N
+ AH G R b n/a 4 499 658 725 N
+ AH G R e n/a 4 499 671 725 N
+ AH G R i n/a 4 499 658 725 N
+ AH G R s n/a 4 499 670 725 N
+ AH G S b n/a 4 473 539 760 N
+ AH G S e n/a 4 503 554 763 N
+ AH G S i n/a 4 478 539 757 N
+ AH G S s n/a 4 474 540 756 N
+ AH G SH b n/a 4 473 539 754 N
+ AH G SH e n/a 4 473 554 764 N
+ AH G SH i n/a 4 479 539 754 N
+ AH G SH s n/a 4 474 540 754 N
+ AH G SIL e n/a 4 474 672 739 N
+ AH G SIL s n/a 4 473 663 740 N
+ AH G T b n/a 4 493 560 776 N
+ AH G T e n/a 4 501 566 776 N
+ AH G T i n/a 4 493 560 770 N
+ AH G T s n/a 4 493 560 776 N
+ AH G TH b n/a 4 473 658 743 N
+ AH G TH e n/a 4 504 671 743 N
+ AH G TH i n/a 4 479 658 743 N
+ AH G TH s n/a 4 474 662 743 N
+ AH G UH e n/a 4 489 671 751 N
+ AH G UH s n/a 4 489 663 751 N
+ AH G UW e n/a 4 489 671 751 N
+ AH G UW s n/a 4 489 663 751 N
+ AH G V b n/a 4 481 643 721 N
+ AH G V e n/a 4 504 643 738 N
+ AH G V i n/a 4 477 640 719 N
+ AH G V s n/a 4 481 643 721 N
+ AH G W b n/a 4 497 695 840 N
+ AH G W e n/a 4 497 701 840 N
+ AH G W i n/a 4 497 711 839 N
+ AH G W s n/a 4 497 695 840 N
+ AH G Y b n/a 4 489 658 750 N
+ AH G Y e n/a 4 489 671 750 N
+ AH G Y s n/a 4 489 663 750 N
+ AH G Z b n/a 4 482 538 767 N
+ AH G Z e n/a 4 503 554 767 N
+ AH G Z i n/a 4 476 538 767 N
+ AH G Z s n/a 4 482 538 767 N
+ AH G ZH e n/a 4 483 554 767 N
+ AH G ZH s n/a 4 483 538 767 N
+ AH HH AA e n/a 4 417 671 752 N
+ AH HH AA i n/a 4 417 658 752 N
+ AH HH AA s n/a 4 417 663 752 N
+ AH HH AE e n/a 4 417 671 752 N
+ AH HH AE s n/a 4 417 663 752 N
+ AH HH AH e n/a 4 417 671 752 N
+ AH HH AH i n/a 4 417 658 752 N
+ AH HH AH s n/a 4 417 663 752 N
+ AH HH AO e n/a 4 417 671 752 N
+ AH HH AO s n/a 4 417 663 752 N
+ AH HH AW e n/a 4 417 671 752 N
+ AH HH AW s n/a 4 417 663 752 N
+ AH HH AY e n/a 4 417 671 752 N
+ AH HH AY s n/a 4 417 663 752 N
+ AH HH B b n/a 4 443 646 726 N
+ AH HH B e n/a 4 452 646 738 N
+ AH HH B i n/a 4 442 646 726 N
+ AH HH B s n/a 4 443 646 726 N
+ AH HH CH b n/a 4 417 560 776 N
+ AH HH CH e n/a 4 417 560 776 N
+ AH HH CH i n/a 4 417 586 771 N
+ AH HH CH s n/a 4 417 562 776 N
+ AH HH D b n/a 4 417 560 772 N
+ AH HH D e n/a 4 417 560 775 N
+ AH HH D i n/a 4 417 560 773 N
+ AH HH D s n/a 4 417 562 772 N
+ AH HH DH b n/a 4 415 656 717 N
+ AH HH DH e n/a 4 415 655 738 N
+ AH HH DH s n/a 4 415 656 717 N
+ AH HH EH e n/a 4 417 671 752 N
+ AH HH EH i n/a 4 417 658 752 N
+ AH HH EH s n/a 4 417 663 752 N
+ AH HH ER e n/a 4 417 671 752 N
+ AH HH ER s n/a 4 417 663 752 N
+ AH HH EY e n/a 4 417 671 752 N
+ AH HH EY s n/a 4 417 663 752 N
+ AH HH F b n/a 4 443 658 742 N
+ AH HH F e n/a 4 452 671 745 N
+ AH HH F i n/a 4 442 658 742 N
+ AH HH F s n/a 4 443 662 742 N
+ AH HH G b n/a 4 417 567 792 N
+ AH HH G e n/a 4 417 568 791 N
+ AH HH G i n/a 4 417 581 791 N
+ AH HH G s n/a 4 417 568 791 N
+ AH HH HH b n/a 4 417 658 752 N
+ AH HH HH e n/a 4 417 671 752 N
+ AH HH HH i n/a 4 417 658 752 N
+ AH HH HH s n/a 4 417 664 753 N
+ AH HH IH e n/a 4 417 671 751 N
+ AH HH IH s n/a 4 417 663 751 N
+ AH HH IY e n/a 4 417 671 750 N
+ AH HH IY s n/a 4 417 663 750 N
+ AH HH JH b n/a 4 417 560 772 N
+ AH HH JH e n/a 4 417 560 775 N
+ AH HH JH i n/a 4 417 586 771 N
+ AH HH JH s n/a 4 417 562 772 N
+ AH HH K b n/a 4 417 568 788 N
+ AH HH K e n/a 4 417 568 790 N
+ AH HH K i n/a 4 417 581 788 N
+ AH HH K s n/a 4 417 568 788 N
+ AH HH L b n/a 4 462 694 835 N
+ AH HH L e n/a 4 463 701 835 N
+ AH HH L i n/a 4 462 703 829 N
+ AH HH L s n/a 4 462 694 835 N
+ AH HH M b n/a 4 442 669 815 N
+ AH HH M e n/a 4 452 669 821 N
+ AH HH M i n/a 4 442 669 813 N
+ AH HH M s n/a 4 442 669 815 N
+ AH HH N b n/a 4 417 601 796 N
+ AH HH N e n/a 4 417 601 796 N
+ AH HH N i n/a 4 417 599 794 N
+ AH HH N s n/a 4 417 601 796 N
+ AH HH NG b n/a 4 417 600 816 N
+ AH HH NG e n/a 4 417 600 821 N
+ AH HH NG i n/a 4 417 600 816 N
+ AH HH NG s n/a 4 417 600 816 N
+ AH HH OW e n/a 4 417 671 752 N
+ AH HH OW s n/a 4 417 663 752 N
+ AH HH OY e n/a 4 417 671 752 N
+ AH HH OY s n/a 4 417 663 752 N
+ AH HH P b n/a 4 442 655 729 N
+ AH HH P e n/a 4 452 671 734 N
+ AH HH P i n/a 4 442 658 729 N
+ AH HH P s n/a 4 443 662 730 N
+ AH HH R b n/a 4 417 658 725 N
+ AH HH R e n/a 4 417 671 725 N
+ AH HH R i n/a 4 417 658 725 N
+ AH HH R s n/a 4 417 669 725 N
+ AH HH S b n/a 4 417 550 760 N
+ AH HH S e n/a 4 417 554 763 N
+ AH HH S i n/a 4 417 550 756 N
+ AH HH S s n/a 4 417 550 756 N
+ AH HH SH b n/a 4 417 550 754 N
+ AH HH SH e n/a 4 417 554 764 N
+ AH HH SH i n/a 4 417 550 754 N
+ AH HH SH s n/a 4 417 550 754 N
+ AH HH SIL e n/a 4 417 672 739 N
+ AH HH SIL s n/a 4 417 663 740 N
+ AH HH T b n/a 4 417 560 776 N
+ AH HH T e n/a 4 417 560 776 N
+ AH HH T i n/a 4 417 560 771 N
+ AH HH T s n/a 4 417 562 776 N
+ AH HH TH b n/a 4 417 658 743 N
+ AH HH TH e n/a 4 417 671 743 N
+ AH HH TH i n/a 4 417 658 743 N
+ AH HH TH s n/a 4 417 662 743 N
+ AH HH UH e n/a 4 417 671 751 N
+ AH HH UH s n/a 4 417 663 751 N
+ AH HH UW e n/a 4 417 671 751 N
+ AH HH UW s n/a 4 417 663 751 N
+ AH HH V b n/a 4 443 643 714 N
+ AH HH V e n/a 4 452 643 738 N
+ AH HH V i n/a 4 443 644 715 N
+ AH HH V s n/a 4 443 643 714 N
+ AH HH W b n/a 4 462 696 840 N
+ AH HH W e n/a 4 463 701 840 N
+ AH HH W i n/a 4 461 704 841 N
+ AH HH W s n/a 4 462 696 840 N
+ AH HH Y b n/a 4 417 658 750 N
+ AH HH Y e n/a 4 417 671 750 N
+ AH HH Y i n/a 4 417 658 750 N
+ AH HH Y s n/a 4 417 663 750 N
+ AH HH Z b n/a 4 415 550 767 N
+ AH HH Z e n/a 4 415 554 767 N
+ AH HH Z i n/a 4 415 552 767 N
+ AH HH Z s n/a 4 415 552 767 N
+ AH HH ZH e n/a 4 416 554 767 N
+ AH HH ZH i n/a 4 416 552 767 N
+ AH HH ZH s n/a 4 416 552 767 N
+ AH IH AA s n/a 4 512 663 752 N
+ AH IH AE s n/a 4 512 663 752 N
+ AH IH AH s n/a 4 512 663 752 N
+ AH IH AO s n/a 4 512 663 752 N
+ AH IH AW s n/a 4 512 663 752 N
+ AH IH AY s n/a 4 512 663 752 N
+ AH IH B b n/a 4 512 646 726 N
+ AH IH B s n/a 4 512 646 726 N
+ AH IH CH b n/a 4 512 562 776 N
+ AH IH CH s n/a 4 512 562 776 N
+ AH IH D b n/a 4 512 562 772 N
+ AH IH D s n/a 4 512 562 772 N
+ AH IH DH b n/a 4 514 657 717 N
+ AH IH DH s n/a 4 514 657 717 N
+ AH IH EH s n/a 4 512 663 752 N
+ AH IH ER s n/a 4 512 663 752 N
+ AH IH EY s n/a 4 512 663 752 N
+ AH IH F b n/a 4 512 658 742 N
+ AH IH F s n/a 4 512 662 742 N
+ AH IH G b n/a 4 512 567 792 N
+ AH IH G s n/a 4 512 568 791 N
+ AH IH HH b n/a 4 511 658 752 N
+ AH IH HH s n/a 4 512 664 753 N
+ AH IH IH s n/a 4 512 663 751 N
+ AH IH IY s n/a 4 512 663 750 N
+ AH IH JH b n/a 4 512 562 772 N
+ AH IH JH s n/a 4 512 562 772 N
+ AH IH K b n/a 4 512 568 787 N
+ AH IH K s n/a 4 512 568 787 N
+ AH IH L b n/a 4 519 707 836 N
+ AH IH L i n/a 4 519 707 828 N
+ AH IH L s n/a 4 519 707 836 N
+ AH IH M b n/a 4 512 669 818 N
+ AH IH M s n/a 4 512 669 818 N
+ AH IH N b n/a 4 511 596 800 N
+ AH IH N i n/a 4 512 596 799 N
+ AH IH N s n/a 4 512 596 799 N
+ AH IH NG b n/a 4 511 605 816 N
+ AH IH NG s n/a 4 512 605 816 N
+ AH IH OW s n/a 4 512 663 752 N
+ AH IH OY s n/a 4 512 663 752 N
+ AH IH P b n/a 4 512 655 729 N
+ AH IH P s n/a 4 512 663 730 N
+ AH IH R b n/a 4 511 658 725 N
+ AH IH R s n/a 4 512 669 725 N
+ AH IH S b n/a 4 512 536 760 N
+ AH IH S s n/a 4 512 540 756 N
+ AH IH SH b n/a 4 511 536 754 N
+ AH IH SH s n/a 4 512 540 754 N
+ AH IH SIL s n/a 4 512 663 740 N
+ AH IH T b n/a 4 512 562 776 N
+ AH IH T s n/a 4 512 562 776 N
+ AH IH TH b n/a 4 514 658 743 N
+ AH IH TH s n/a 4 514 662 743 N
+ AH IH UH s n/a 4 512 663 751 N
+ AH IH UW s n/a 4 512 663 751 N
+ AH IH V b n/a 4 511 644 714 N
+ AH IH V s n/a 4 512 644 714 N
+ AH IH W b n/a 4 519 707 840 N
+ AH IH W s n/a 4 519 707 840 N
+ AH IH Y b n/a 4 511 658 750 N
+ AH IH Y s n/a 4 512 663 750 N
+ AH IH Z b n/a 4 512 536 767 N
+ AH IH Z s n/a 4 512 536 767 N
+ AH IH ZH s n/a 4 512 536 767 N
+ AH IY AA e n/a 4 527 671 752 N
+ AH IY AA s n/a 4 527 663 752 N
+ AH IY AE e n/a 4 527 671 752 N
+ AH IY AE s n/a 4 527 663 752 N
+ AH IY AH e n/a 4 527 671 752 N
+ AH IY AH i n/a 4 527 658 752 N
+ AH IY AH s n/a 4 527 663 752 N
+ AH IY AO e n/a 4 527 671 752 N
+ AH IY AO s n/a 4 527 663 752 N
+ AH IY AW e n/a 4 527 671 752 N
+ AH IY AW s n/a 4 527 663 752 N
+ AH IY AY e n/a 4 527 671 752 N
+ AH IY AY s n/a 4 527 663 752 N
+ AH IY B b n/a 4 531 647 726 N
+ AH IY B e n/a 4 531 647 738 N
+ AH IY B i n/a 4 531 647 726 N
+ AH IY B s n/a 4 531 647 726 N
+ AH IY CH b n/a 4 523 563 776 N
+ AH IY CH e n/a 4 523 563 776 N
+ AH IY CH i n/a 4 521 586 771 N
+ AH IY CH s n/a 4 523 563 776 N
+ AH IY D b n/a 4 523 563 772 N
+ AH IY D e n/a 4 523 563 775 N
+ AH IY D i n/a 4 522 563 773 N
+ AH IY D s n/a 4 523 563 772 N
+ AH IY DH b n/a 4 529 657 717 N
+ AH IY DH e n/a 4 527 655 738 N
+ AH IY DH s n/a 4 527 657 717 N
+ AH IY EH e n/a 4 527 671 752 N
+ AH IY EH i n/a 4 527 658 752 N
+ AH IY EH s n/a 4 527 663 752 N
+ AH IY ER e n/a 4 527 671 752 N
+ AH IY ER s n/a 4 527 663 752 N
+ AH IY EY e n/a 4 527 671 752 N
+ AH IY EY s n/a 4 527 663 752 N
+ AH IY F b n/a 4 531 658 743 N
+ AH IY F e n/a 4 531 671 745 N
+ AH IY F i n/a 4 531 658 743 N
+ AH IY F s n/a 4 531 662 743 N
+ AH IY G b n/a 4 523 567 792 N
+ AH IY G e n/a 4 523 567 791 N
+ AH IY G i n/a 4 522 582 791 N
+ AH IY G s n/a 4 523 567 791 N
+ AH IY HH b n/a 4 530 658 752 N
+ AH IY HH e n/a 4 527 671 752 N
+ AH IY HH i n/a 4 530 658 752 N
+ AH IY HH s n/a 4 530 664 753 N
+ AH IY IH e n/a 4 527 671 751 N
+ AH IY IH s n/a 4 527 663 751 N
+ AH IY IY e n/a 4 527 671 750 N
+ AH IY IY s n/a 4 527 663 750 N
+ AH IY JH b n/a 4 523 563 772 N
+ AH IY JH e n/a 4 523 563 775 N
+ AH IY JH i n/a 4 522 586 771 N
+ AH IY JH s n/a 4 523 563 772 N
+ AH IY K b n/a 4 523 567 788 N
+ AH IY K e n/a 4 523 567 790 N
+ AH IY K i n/a 4 521 580 788 N
+ AH IY K s n/a 4 523 567 788 N
+ AH IY L b n/a 4 532 701 838 N
+ AH IY L e n/a 4 532 701 837 N
+ AH IY L i n/a 4 532 701 838 N
+ AH IY L s n/a 4 532 701 838 N
+ AH IY M b n/a 4 531 667 818 N
+ AH IY M e n/a 4 531 667 820 N
+ AH IY M i n/a 4 531 667 818 N
+ AH IY M s n/a 4 531 667 818 N
+ AH IY N b n/a 4 520 603 805 N
+ AH IY N e n/a 4 520 603 805 N
+ AH IY N i n/a 4 525 602 804 N
+ AH IY N s n/a 4 520 603 805 N
+ AH IY NG b n/a 4 529 605 816 N
+ AH IY NG e n/a 4 527 605 820 N
+ AH IY NG i n/a 4 529 605 816 N
+ AH IY NG s n/a 4 529 605 816 N
+ AH IY OW e n/a 4 527 671 752 N
+ AH IY OW s n/a 4 527 663 752 N
+ AH IY OY e n/a 4 527 671 752 N
+ AH IY OY s n/a 4 527 663 752 N
+ AH IY P b n/a 4 531 658 730 N
+ AH IY P e n/a 4 531 671 734 N
+ AH IY P i n/a 4 531 658 730 N
+ AH IY P s n/a 4 531 662 730 N
+ AH IY R b n/a 4 531 658 725 N
+ AH IY R e n/a 4 531 671 725 N
+ AH IY R i n/a 4 531 658 725 N
+ AH IY R s n/a 4 531 667 725 N
+ AH IY S b n/a 4 521 549 765 N
+ AH IY S e n/a 4 521 554 765 N
+ AH IY S i n/a 4 521 549 765 N
+ AH IY S s n/a 4 521 549 765 N
+ AH IY SH b n/a 4 530 549 764 N
+ AH IY SH e n/a 4 527 554 764 N
+ AH IY SH i n/a 4 530 549 764 N
+ AH IY SH s n/a 4 530 549 764 N
+ AH IY SIL e n/a 4 527 672 739 N
+ AH IY SIL s n/a 4 530 663 740 N
+ AH IY T b n/a 4 523 563 776 N
+ AH IY T e n/a 4 523 563 776 N
+ AH IY T i n/a 4 521 563 770 N
+ AH IY T s n/a 4 523 563 776 N
+ AH IY TH b n/a 4 530 658 743 N
+ AH IY TH e n/a 4 527 671 743 N
+ AH IY TH i n/a 4 530 658 743 N
+ AH IY TH s n/a 4 530 662 743 N
+ AH IY UH e n/a 4 527 671 751 N
+ AH IY UH s n/a 4 527 663 751 N
+ AH IY UW e n/a 4 527 671 751 N
+ AH IY UW s n/a 4 527 663 751 N
+ AH IY V b n/a 4 531 645 722 N
+ AH IY V e n/a 4 531 645 738 N
+ AH IY V i n/a 4 531 645 722 N
+ AH IY V s n/a 4 531 645 722 N
+ AH IY W b n/a 4 532 701 840 N
+ AH IY W e n/a 4 532 701 840 N
+ AH IY W i n/a 4 532 701 839 N
+ AH IY W s n/a 4 532 701 840 N
+ AH IY Y b n/a 4 529 658 750 N
+ AH IY Y e n/a 4 527 671 750 N
+ AH IY Y s n/a 4 527 663 750 N
+ AH IY Z b n/a 4 521 550 767 N
+ AH IY Z e n/a 4 521 554 767 N
+ AH IY Z i n/a 4 521 553 767 N
+ AH IY Z s n/a 4 521 553 767 N
+ AH IY ZH e n/a 4 527 554 767 N
+ AH IY ZH i n/a 4 527 553 767 N
+ AH IY ZH s n/a 4 527 553 767 N
+ AH JH AA e n/a 4 494 671 752 N
+ AH JH AA s n/a 4 494 663 752 N
+ AH JH AE e n/a 4 494 671 752 N
+ AH JH AE s n/a 4 494 663 752 N
+ AH JH AH e n/a 4 494 671 752 N
+ AH JH AH s n/a 4 494 663 752 N
+ AH JH AO e n/a 4 494 671 752 N
+ AH JH AO s n/a 4 494 663 752 N
+ AH JH AW e n/a 4 494 671 752 N
+ AH JH AW s n/a 4 494 663 752 N
+ AH JH AY e n/a 4 494 671 752 N
+ AH JH AY s n/a 4 494 663 752 N
+ AH JH B b n/a 4 481 646 726 N
+ AH JH B e n/a 4 504 646 738 N
+ AH JH B i n/a 4 478 646 726 N
+ AH JH B s n/a 4 481 646 726 N
+ AH JH CH b n/a 4 475 559 776 N
+ AH JH CH e n/a 4 500 566 776 N
+ AH JH CH s n/a 4 475 559 776 N
+ AH JH D b n/a 4 490 559 772 N
+ AH JH D e n/a 4 501 566 775 N
+ AH JH D i n/a 4 494 558 773 N
+ AH JH D s n/a 4 494 559 772 N
+ AH JH DH b n/a 4 483 657 717 N
+ AH JH DH e n/a 4 504 655 738 N
+ AH JH DH s n/a 4 483 657 717 N
+ AH JH EH e n/a 4 494 671 752 N
+ AH JH EH s n/a 4 494 663 752 N
+ AH JH ER e n/a 4 494 671 752 N
+ AH JH ER s n/a 4 494 663 752 N
+ AH JH EY e n/a 4 494 671 752 N
+ AH JH EY s n/a 4 494 663 752 N
+ AH JH F b n/a 4 481 658 742 N
+ AH JH F e n/a 4 504 671 745 N
+ AH JH F i n/a 4 479 658 742 N
+ AH JH F s n/a 4 481 662 742 N
+ AH JH G b n/a 4 475 567 792 N
+ AH JH G e n/a 4 502 569 791 N
+ AH JH G i n/a 4 477 581 791 N
+ AH JH G s n/a 4 475 569 791 N
+ AH JH HH b n/a 4 474 658 752 N
+ AH JH HH e n/a 4 474 671 752 N
+ AH JH HH i n/a 4 479 658 752 N
+ AH JH HH s n/a 4 474 664 753 N
+ AH JH IH e n/a 4 494 671 751 N
+ AH JH IH s n/a 4 494 663 751 N
+ AH JH IY e n/a 4 494 671 750 N
+ AH JH IY s n/a 4 494 663 750 N
+ AH JH JH b n/a 4 475 559 772 N
+ AH JH JH e n/a 4 501 566 775 N
+ AH JH JH i n/a 4 477 591 771 N
+ AH JH JH s n/a 4 475 559 772 N
+ AH JH K b n/a 4 475 569 788 N
+ AH JH K e n/a 4 502 569 790 N
+ AH JH K i n/a 4 478 579 788 N
+ AH JH K s n/a 4 475 569 788 N
+ AH JH L b n/a 4 498 694 835 N
+ AH JH L e n/a 4 498 701 835 N
+ AH JH L i n/a 4 498 702 825 N
+ AH JH L s n/a 4 498 694 835 N
+ AH JH M b n/a 4 481 666 818 N
+ AH JH M e n/a 4 505 666 821 N
+ AH JH M i n/a 4 477 665 817 N
+ AH JH M s n/a 4 481 666 818 N
+ AH JH N b n/a 4 490 618 803 N
+ AH JH N e n/a 4 501 618 803 N
+ AH JH N i n/a 4 494 617 803 N
+ AH JH N s n/a 4 494 618 803 N
+ AH JH NG b n/a 4 474 605 816 N
+ AH JH NG e n/a 4 474 605 821 N
+ AH JH NG i n/a 4 477 605 816 N
+ AH JH NG s n/a 4 474 605 816 N
+ AH JH OW e n/a 4 494 671 752 N
+ AH JH OW s n/a 4 494 663 752 N
+ AH JH OY e n/a 4 494 671 752 N
+ AH JH OY s n/a 4 494 663 752 N
+ AH JH P b n/a 4 482 655 730 N
+ AH JH P e n/a 4 506 671 734 N
+ AH JH P i n/a 4 478 658 730 N
+ AH JH P s n/a 4 482 662 730 N
+ AH JH R b n/a 4 499 658 725 N
+ AH JH R e n/a 4 499 671 725 N
+ AH JH R i n/a 4 499 658 725 N
+ AH JH R s n/a 4 499 667 725 N
+ AH JH S b n/a 4 473 539 760 N
+ AH JH S e n/a 4 503 554 763 N
+ AH JH S i n/a 4 479 539 760 N
+ AH JH S s n/a 4 474 540 760 N
+ AH JH SH b n/a 4 473 539 754 N
+ AH JH SH e n/a 4 473 554 764 N
+ AH JH SH s n/a 4 474 540 754 N
+ AH JH SIL e n/a 4 474 672 739 N
+ AH JH SIL s n/a 4 473 663 740 N
+ AH JH T b n/a 4 490 559 776 N
+ AH JH T e n/a 4 501 566 776 N
+ AH JH T i n/a 4 494 559 770 N
+ AH JH T s n/a 4 494 559 776 N
+ AH JH TH b n/a 4 473 658 743 N
+ AH JH TH e n/a 4 504 671 743 N
+ AH JH TH i n/a 4 479 658 743 N
+ AH JH TH s n/a 4 474 662 743 N
+ AH JH UH e n/a 4 494 671 751 N
+ AH JH UH s n/a 4 494 663 751 N
+ AH JH UW e n/a 4 494 671 751 N
+ AH JH UW s n/a 4 494 663 751 N
+ AH JH V b n/a 4 481 643 722 N
+ AH JH V e n/a 4 504 643 738 N
+ AH JH V i n/a 4 477 644 722 N
+ AH JH V s n/a 4 481 643 721 N
+ AH JH W b n/a 4 498 696 840 N
+ AH JH W e n/a 4 498 701 840 N
+ AH JH W i n/a 4 498 702 839 N
+ AH JH W s n/a 4 498 696 840 N
+ AH JH Y b n/a 4 490 658 750 N
+ AH JH Y e n/a 4 494 671 750 N
+ AH JH Y s n/a 4 494 663 750 N
+ AH JH Z b n/a 4 482 535 768 N
+ AH JH Z e n/a 4 503 554 768 N
+ AH JH Z i n/a 4 476 535 768 N
+ AH JH Z s n/a 4 482 535 768 N
+ AH JH ZH e n/a 4 483 554 768 N
+ AH JH ZH s n/a 4 483 535 768 N
+ AH K AA e n/a 4 420 671 747 N
+ AH K AA i n/a 4 420 659 747 N
+ AH K AA s n/a 4 420 663 747 N
+ AH K AE e n/a 4 420 671 747 N
+ AH K AE s n/a 4 420 663 747 N
+ AH K AH e n/a 4 420 671 749 N
+ AH K AH s n/a 4 420 663 749 N
+ AH K AO e n/a 4 420 671 746 N
+ AH K AO s n/a 4 420 663 746 N
+ AH K AW e n/a 4 420 671 747 N
+ AH K AW s n/a 4 420 663 747 N
+ AH K AY e n/a 4 420 671 747 N
+ AH K AY i n/a 4 420 659 747 N
+ AH K AY s n/a 4 420 663 747 N
+ AH K B b n/a 4 446 646 726 N
+ AH K B e n/a 4 452 646 736 N
+ AH K B i n/a 4 439 646 727 N
+ AH K B s n/a 4 446 646 726 N
+ AH K CH b n/a 4 422 560 776 N
+ AH K CH e n/a 4 422 566 777 N
+ AH K CH i n/a 4 422 590 771 N
+ AH K CH s n/a 4 422 560 776 N
+ AH K D b n/a 4 422 560 772 N
+ AH K D e n/a 4 422 566 775 N
+ AH K D i n/a 4 422 560 773 N
+ AH K D s n/a 4 422 560 772 N
+ AH K DH b n/a 4 420 656 717 N
+ AH K DH e n/a 4 420 655 738 N
+ AH K DH i n/a 4 420 656 717 N
+ AH K DH s n/a 4 420 656 717 N
+ AH K EH e n/a 4 420 671 747 N
+ AH K EH i n/a 4 420 659 747 N
+ AH K EH s n/a 4 420 663 747 N
+ AH K ER e n/a 4 420 671 746 N
+ AH K ER s n/a 4 420 663 746 N
+ AH K EY e n/a 4 420 671 747 N
+ AH K EY i n/a 4 420 659 747 N
+ AH K EY s n/a 4 420 663 747 N
+ AH K F b n/a 4 446 658 742 N
+ AH K F e n/a 4 452 671 745 N
+ AH K F i n/a 4 440 659 742 N
+ AH K F s n/a 4 446 662 742 N
+ AH K G b n/a 4 422 567 792 N
+ AH K G e n/a 4 422 569 793 N
+ AH K G i n/a 4 422 579 792 N
+ AH K G s n/a 4 422 569 793 N
+ AH K HH b n/a 4 420 658 747 N
+ AH K HH e n/a 4 420 671 747 N
+ AH K HH i n/a 4 420 659 747 N
+ AH K HH s n/a 4 420 664 747 N
+ AH K IH e n/a 4 420 671 749 N
+ AH K IH i n/a 4 420 659 749 N
+ AH K IH s n/a 4 420 663 749 N
+ AH K IY e n/a 4 420 671 750 N
+ AH K IY i n/a 4 420 659 750 N
+ AH K IY s n/a 4 420 663 750 N
+ AH K JH b n/a 4 422 560 772 N
+ AH K JH e n/a 4 422 566 774 N
+ AH K JH i n/a 4 422 590 771 N
+ AH K JH s n/a 4 422 560 772 N
+ AH K K b n/a 4 422 569 788 N
+ AH K K e n/a 4 422 569 790 N
+ AH K K i n/a 4 422 581 788 N
+ AH K K s n/a 4 422 569 788 N
+ AH K L b n/a 4 465 694 835 N
+ AH K L e n/a 4 465 698 835 N
+ AH K L i n/a 4 465 710 824 N
+ AH K L s n/a 4 465 694 835 N
+ AH K M b n/a 4 446 661 815 N
+ AH K M e n/a 4 452 661 821 N
+ AH K M i n/a 4 439 661 814 N
+ AH K M s n/a 4 446 661 815 N
+ AH K N b n/a 4 438 619 806 N
+ AH K N e n/a 4 438 619 806 N
+ AH K N i n/a 4 438 619 806 N
+ AH K N s n/a 4 438 619 806 N
+ AH K NG b n/a 4 438 619 816 N
+ AH K NG e n/a 4 438 619 821 N
+ AH K NG i n/a 4 438 619 816 N
+ AH K NG s n/a 4 438 619 816 N
+ AH K OW e n/a 4 420 671 746 N
+ AH K OW s n/a 4 420 663 746 N
+ AH K OY e n/a 4 420 671 746 N
+ AH K OY s n/a 4 420 663 746 N
+ AH K P b n/a 4 446 655 729 N
+ AH K P e n/a 4 452 671 734 N
+ AH K P i n/a 4 439 659 729 N
+ AH K P s n/a 4 446 662 730 N
+ AH K R b n/a 4 420 658 725 N
+ AH K R e n/a 4 420 671 725 N
+ AH K R i n/a 4 420 659 725 N
+ AH K R s n/a 4 420 670 725 N
+ AH K S b n/a 4 420 539 760 N
+ AH K S e n/a 4 420 554 762 N
+ AH K S i n/a 4 420 539 757 N
+ AH K S s n/a 4 420 540 756 N
+ AH K SH b n/a 4 420 539 754 N
+ AH K SH e n/a 4 420 554 764 N
+ AH K SH i n/a 4 420 539 754 N
+ AH K SH s n/a 4 420 540 754 N
+ AH K SIL e n/a 4 420 672 739 N
+ AH K SIL s n/a 4 420 663 740 N
+ AH K T b n/a 4 422 560 776 N
+ AH K T e n/a 4 422 566 777 N
+ AH K T i n/a 4 422 560 771 N
+ AH K T s n/a 4 422 560 776 N
+ AH K TH b n/a 4 420 658 743 N
+ AH K TH e n/a 4 420 671 743 N
+ AH K TH i n/a 4 420 659 743 N
+ AH K TH s n/a 4 420 662 743 N
+ AH K UH e n/a 4 420 671 751 N
+ AH K UH s n/a 4 420 663 751 N
+ AH K UW e n/a 4 420 671 751 N
+ AH K UW s n/a 4 420 663 751 N
+ AH K V b n/a 4 446 643 721 N
+ AH K V e n/a 4 452 643 738 N
+ AH K V i n/a 4 440 640 719 N
+ AH K V s n/a 4 446 643 721 N
+ AH K W b n/a 4 465 695 840 N
+ AH K W e n/a 4 465 697 840 N
+ AH K W i n/a 4 465 710 839 N
+ AH K W s n/a 4 465 695 840 N
+ AH K Y b n/a 4 420 658 750 N
+ AH K Y e n/a 4 420 671 750 N
+ AH K Y i n/a 4 420 659 750 N
+ AH K Y s n/a 4 420 663 750 N
+ AH K Z b n/a 4 420 534 767 N
+ AH K Z e n/a 4 420 554 767 N
+ AH K Z i n/a 4 420 534 767 N
+ AH K Z s n/a 4 420 534 767 N
+ AH K ZH e n/a 4 420 554 767 N
+ AH K ZH s n/a 4 420 534 767 N
+ AH L AA e n/a 4 386 687 752 N
+ AH L AA i n/a 4 390 674 752 N
+ AH L AA s n/a 4 387 674 752 N
+ AH L AE e n/a 4 386 687 752 N
+ AH L AE s n/a 4 387 674 752 N
+ AH L AH e n/a 4 386 687 752 N
+ AH L AH s n/a 4 387 674 752 N
+ AH L AO e n/a 4 386 687 752 N
+ AH L AO s n/a 4 387 674 752 N
+ AH L AW e n/a 4 386 687 752 N
+ AH L AW s n/a 4 387 674 752 N
+ AH L AY e n/a 4 386 687 752 N
+ AH L AY s n/a 4 387 674 752 N
+ AH L B b n/a 4 370 674 731 N
+ AH L B e n/a 4 370 687 738 N
+ AH L B i n/a 4 370 675 731 N
+ AH L B s n/a 4 370 674 731 N
+ AH L CH b n/a 4 380 568 776 N
+ AH L CH e n/a 4 380 568 776 N
+ AH L CH i n/a 4 380 586 784 N
+ AH L CH s n/a 4 380 568 776 N
+ AH L D b n/a 4 381 568 772 N
+ AH L D e n/a 4 381 568 775 N
+ AH L D i n/a 4 383 588 786 N
+ AH L D s n/a 4 381 568 772 N
+ AH L DH b n/a 4 388 675 717 N
+ AH L DH e n/a 4 388 687 738 N
+ AH L DH i n/a 4 386 685 717 N
+ AH L DH s n/a 4 388 675 717 N
+ AH L EH e n/a 4 386 687 752 N
+ AH L EH i n/a 4 390 674 752 N
+ AH L EH s n/a 4 387 674 752 N
+ AH L ER e n/a 4 386 687 752 N
+ AH L ER i n/a 4 390 674 752 N
+ AH L ER s n/a 4 387 674 752 N
+ AH L EY e n/a 4 386 687 752 N
+ AH L EY s n/a 4 387 674 752 N
+ AH L F b n/a 4 370 674 742 N
+ AH L F e n/a 4 370 687 745 N
+ AH L F i n/a 4 370 674 742 N
+ AH L F s n/a 4 370 674 742 N
+ AH L G b n/a 4 382 568 793 N
+ AH L G e n/a 4 382 568 791 N
+ AH L G i n/a 4 382 586 791 N
+ AH L G s n/a 4 382 568 791 N
+ AH L HH b n/a 4 387 674 752 N
+ AH L HH e n/a 4 386 687 752 N
+ AH L HH i n/a 4 390 674 752 N
+ AH L HH s n/a 4 387 674 753 N
+ AH L IH e n/a 4 386 687 751 N
+ AH L IH i n/a 4 390 674 751 N
+ AH L IH s n/a 4 387 674 751 N
+ AH L IY e n/a 4 386 687 750 N
+ AH L IY i n/a 4 390 674 750 N
+ AH L IY s n/a 4 387 674 750 N
+ AH L JH b n/a 4 381 568 772 N
+ AH L JH e n/a 4 381 568 775 N
+ AH L JH i n/a 4 381 586 784 N
+ AH L JH s n/a 4 381 568 772 N
+ AH L K b n/a 4 382 568 787 N
+ AH L K e n/a 4 382 568 787 N
+ AH L K i n/a 4 382 587 787 N
+ AH L K s n/a 4 382 568 787 N
+ AH L L b n/a 4 403 706 836 N
+ AH L L e n/a 4 403 706 836 N
+ AH L L i n/a 4 403 706 828 N
+ AH L L s n/a 4 403 706 836 N
+ AH L M b n/a 4 370 676 823 N
+ AH L M e n/a 4 370 687 823 N
+ AH L M i n/a 4 370 676 823 N
+ AH L M s n/a 4 370 676 823 N
+ AH L N b n/a 4 387 607 796 N
+ AH L N e n/a 4 387 607 796 N
+ AH L N i n/a 4 386 607 796 N
+ AH L N s n/a 4 387 607 796 N
+ AH L NG b n/a 4 387 604 823 N
+ AH L NG e n/a 4 386 604 823 N
+ AH L NG i n/a 4 390 604 823 N
+ AH L NG s n/a 4 387 604 823 N
+ AH L OW e n/a 4 386 687 752 N
+ AH L OW s n/a 4 387 674 752 N
+ AH L OY e n/a 4 386 687 752 N
+ AH L OY s n/a 4 387 674 752 N
+ AH L P b n/a 4 370 674 731 N
+ AH L P e n/a 4 370 687 734 N
+ AH L P i n/a 4 370 674 731 N
+ AH L P s n/a 4 370 674 731 N
+ AH L R b n/a 4 387 674 725 N
+ AH L R e n/a 4 386 687 725 N
+ AH L R i n/a 4 390 674 725 N
+ AH L R s n/a 4 387 674 725 N
+ AH L S b n/a 4 382 554 759 N
+ AH L S e n/a 4 382 554 763 N
+ AH L S i n/a 4 380 554 759 N
+ AH L S s n/a 4 382 554 759 N
+ AH L SH b n/a 4 387 554 760 N
+ AH L SH e n/a 4 386 554 764 N
+ AH L SH i n/a 4 390 554 760 N
+ AH L SH s n/a 4 387 554 760 N
+ AH L SIL e n/a 4 386 686 739 N
+ AH L SIL s n/a 4 387 674 740 N
+ AH L T b n/a 4 381 568 776 N
+ AH L T e n/a 4 380 568 776 N
+ AH L T i n/a 4 381 586 784 N
+ AH L T s n/a 4 381 568 776 N
+ AH L TH b n/a 4 387 674 743 N
+ AH L TH e n/a 4 386 687 743 N
+ AH L TH i n/a 4 386 674 743 N
+ AH L TH s n/a 4 387 674 743 N
+ AH L UH e n/a 4 386 687 751 N
+ AH L UH s n/a 4 387 674 751 N
+ AH L UW e n/a 4 386 687 751 N
+ AH L UW s n/a 4 387 674 751 N
+ AH L V b n/a 4 370 674 713 N
+ AH L V e n/a 4 370 687 738 N
+ AH L V i n/a 4 367 688 716 N
+ AH L V s n/a 4 370 674 713 N
+ AH L W b n/a 4 403 706 841 N
+ AH L W e n/a 4 403 706 841 N
+ AH L W i n/a 4 403 706 841 N
+ AH L W s n/a 4 403 706 841 N
+ AH L Y b n/a 4 387 674 750 N
+ AH L Y e n/a 4 386 687 750 N
+ AH L Y s n/a 4 387 674 750 N
+ AH L Z b n/a 4 382 554 769 N
+ AH L Z e n/a 4 382 554 769 N
+ AH L Z i n/a 4 380 554 769 N
+ AH L Z s n/a 4 382 554 769 N
+ AH L ZH e n/a 4 388 554 769 N
+ AH L ZH i n/a 4 390 554 769 N
+ AH L ZH s n/a 4 388 554 769 N
+ AH M AA e n/a 4 369 686 752 N
+ AH M AA s n/a 4 368 677 752 N
+ AH M AE e n/a 4 369 686 752 N
+ AH M AE i n/a 4 368 677 752 N
+ AH M AE s n/a 4 368 677 752 N
+ AH M AH e n/a 4 369 686 752 N
+ AH M AH s n/a 4 368 677 752 N
+ AH M AO e n/a 4 369 686 752 N
+ AH M AO s n/a 4 368 677 752 N
+ AH M AW e n/a 4 369 686 752 N
+ AH M AW s n/a 4 368 677 752 N
+ AH M AY e n/a 4 369 686 752 N
+ AH M AY s n/a 4 368 677 752 N
+ AH M B b n/a 4 372 675 731 N
+ AH M B e n/a 4 372 686 738 N
+ AH M B i n/a 4 372 675 731 N
+ AH M B s n/a 4 372 675 731 N
+ AH M CH b n/a 4 376 562 776 N
+ AH M CH e n/a 4 376 561 776 N
+ AH M CH i n/a 4 375 589 779 N
+ AH M CH s n/a 4 376 562 776 N
+ AH M D b n/a 4 374 562 772 N
+ AH M D e n/a 4 377 561 774 N
+ AH M D i n/a 4 377 578 786 N
+ AH M D s n/a 4 376 562 772 N
+ AH M DH b n/a 4 369 680 717 N
+ AH M DH e n/a 4 369 686 738 N
+ AH M DH i n/a 4 367 685 717 N
+ AH M DH s n/a 4 369 680 717 N
+ AH M EH e n/a 4 369 686 752 N
+ AH M EH i n/a 4 368 677 752 N
+ AH M EH s n/a 4 368 677 752 N
+ AH M ER e n/a 4 369 686 752 N
+ AH M ER i n/a 4 368 677 752 N
+ AH M ER s n/a 4 368 677 752 N
+ AH M EY e n/a 4 369 686 752 N
+ AH M EY i n/a 4 368 677 752 N
+ AH M EY s n/a 4 368 677 752 N
+ AH M F b n/a 4 372 678 742 N
+ AH M F e n/a 4 372 686 745 N
+ AH M F i n/a 4 372 678 741 N
+ AH M F s n/a 4 372 678 742 N
+ AH M G b n/a 4 366 567 792 N
+ AH M G e n/a 4 366 568 791 N
+ AH M G i n/a 4 366 582 791 N
+ AH M G s n/a 4 366 568 791 N
+ AH M HH b n/a 4 368 677 752 N
+ AH M HH e n/a 4 369 686 752 N
+ AH M HH i n/a 4 368 677 752 N
+ AH M HH s n/a 4 368 677 753 N
+ AH M IH e n/a 4 369 686 751 N
+ AH M IH s n/a 4 368 677 751 N
+ AH M IY e n/a 4 369 686 750 N
+ AH M IY i n/a 4 368 677 750 N
+ AH M IY s n/a 4 368 677 750 N
+ AH M JH b n/a 4 376 562 772 N
+ AH M JH e n/a 4 376 561 775 N
+ AH M JH i n/a 4 376 586 783 N
+ AH M JH s n/a 4 376 562 772 N
+ AH M K b n/a 4 366 568 788 N
+ AH M K e n/a 4 366 568 790 N
+ AH M K i n/a 4 366 582 788 N
+ AH M K s n/a 4 366 568 788 N
+ AH M L b n/a 4 403 706 828 N
+ AH M L e n/a 4 403 706 828 N
+ AH M L i n/a 4 403 706 828 N
+ AH M L s n/a 4 403 706 828 N
+ AH M M b n/a 4 372 669 817 N
+ AH M M e n/a 4 372 669 821 N
+ AH M M i n/a 4 372 669 817 N
+ AH M M s n/a 4 372 669 817 N
+ AH M N b n/a 4 374 597 800 N
+ AH M N e n/a 4 377 597 799 N
+ AH M N i n/a 4 377 595 799 N
+ AH M N s n/a 4 377 597 799 N
+ AH M NG b n/a 4 369 604 816 N
+ AH M NG e n/a 4 369 604 821 N
+ AH M NG i n/a 4 369 604 816 N
+ AH M NG s n/a 4 369 604 816 N
+ AH M OW e n/a 4 369 686 752 N
+ AH M OW s n/a 4 368 677 752 N
+ AH M OY e n/a 4 369 686 752 N
+ AH M OY s n/a 4 368 677 752 N
+ AH M P b n/a 4 372 680 729 N
+ AH M P e n/a 4 372 686 734 N
+ AH M P i n/a 4 372 680 729 N
+ AH M P s n/a 4 372 680 730 N
+ AH M R b n/a 4 368 677 725 N
+ AH M R e n/a 4 369 686 725 N
+ AH M R i n/a 4 368 677 725 N
+ AH M R s n/a 4 368 677 725 N
+ AH M S b n/a 4 365 542 760 N
+ AH M S e n/a 4 365 554 763 N
+ AH M S i n/a 4 365 543 760 N
+ AH M S s n/a 4 365 543 759 N
+ AH M SH b n/a 4 376 540 754 N
+ AH M SH e n/a 4 376 554 764 N
+ AH M SH i n/a 4 376 540 754 N
+ AH M SH s n/a 4 376 540 754 N
+ AH M SIL e n/a 4 369 686 739 N
+ AH M SIL s n/a 4 368 677 740 N
+ AH M T b n/a 4 374 562 776 N
+ AH M T e n/a 4 377 561 776 N
+ AH M T i n/a 4 376 578 783 N
+ AH M T s n/a 4 376 562 776 N
+ AH M TH b n/a 4 366 677 743 N
+ AH M TH e n/a 4 366 686 743 N
+ AH M TH i n/a 4 366 677 741 N
+ AH M TH s n/a 4 366 677 743 N
+ AH M UH e n/a 4 369 686 751 N
+ AH M UH s n/a 4 368 677 751 N
+ AH M UW e n/a 4 369 686 751 N
+ AH M UW s n/a 4 368 677 751 N
+ AH M V b n/a 4 372 678 714 N
+ AH M V e n/a 4 372 686 738 N
+ AH M V i n/a 4 372 688 716 N
+ AH M V s n/a 4 372 678 714 N
+ AH M W b n/a 4 403 706 828 N
+ AH M W e n/a 4 403 706 828 N
+ AH M W i n/a 4 403 706 828 N
+ AH M W s n/a 4 403 706 828 N
+ AH M Y b n/a 4 376 677 750 N
+ AH M Y e n/a 4 376 686 750 N
+ AH M Y i n/a 4 376 677 750 N
+ AH M Y s n/a 4 376 677 750 N
+ AH M Z b n/a 4 368 543 766 N
+ AH M Z e n/a 4 369 554 766 N
+ AH M Z i n/a 4 368 543 766 N
+ AH M Z s n/a 4 368 543 766 N
+ AH M ZH e n/a 4 376 554 766 N
+ AH M ZH i n/a 4 376 540 766 N
+ AH M ZH s n/a 4 376 540 766 N
+ AH N AA e n/a 4 509 629 752 N
+ AH N AA i n/a 4 509 654 752 N
+ AH N AA s n/a 4 509 663 752 N
+ AH N AE e n/a 4 509 624 752 N
+ AH N AE s n/a 4 509 663 752 N
+ AH N AH e n/a 4 509 624 752 N
+ AH N AH i n/a 4 509 654 752 N
+ AH N AH s n/a 4 509 663 752 N
+ AH N AO e n/a 4 509 629 752 N
+ AH N AO s n/a 4 509 663 752 N
+ AH N AW e n/a 4 509 624 752 N
+ AH N AW s n/a 4 509 663 752 N
+ AH N AY e n/a 4 509 629 752 N
+ AH N AY i n/a 4 509 654 752 N
+ AH N AY s n/a 4 509 663 752 N
+ AH N B b n/a 4 516 646 726 N
+ AH N B e n/a 4 515 634 738 N
+ AH N B i n/a 4 515 646 726 N
+ AH N B s n/a 4 515 646 726 N
+ AH N CH b n/a 4 507 561 776 N
+ AH N CH e n/a 4 507 561 776 N
+ AH N CH i n/a 4 507 584 771 N
+ AH N CH s n/a 4 507 561 776 N
+ AH N D b n/a 4 507 561 772 N
+ AH N D e n/a 4 507 561 775 N
+ AH N D i n/a 4 507 561 773 N
+ AH N D s n/a 4 507 561 772 N
+ AH N DH b n/a 4 516 656 717 N
+ AH N DH e n/a 4 515 624 738 N
+ AH N DH i n/a 4 517 656 717 N
+ AH N DH s n/a 4 515 656 717 N
+ AH N EH e n/a 4 509 624 752 N
+ AH N EH s n/a 4 509 663 752 N
+ AH N ER e n/a 4 509 629 752 N
+ AH N ER s n/a 4 509 663 752 N
+ AH N EY e n/a 4 509 624 752 N
+ AH N EY s n/a 4 509 663 752 N
+ AH N F b n/a 4 516 655 743 N
+ AH N F e n/a 4 515 634 745 N
+ AH N F i n/a 4 517 654 741 N
+ AH N F s n/a 4 515 662 743 N
+ AH N G b n/a 4 510 573 792 N
+ AH N G e n/a 4 510 574 791 N
+ AH N G i n/a 4 510 582 791 N
+ AH N G s n/a 4 510 574 791 N
+ AH N HH b n/a 4 509 655 752 N
+ AH N HH e n/a 4 509 629 752 N
+ AH N HH i n/a 4 509 654 752 N
+ AH N HH s n/a 4 509 664 753 N
+ AH N IH e n/a 4 509 624 751 N
+ AH N IH i n/a 4 509 654 751 N
+ AH N IH s n/a 4 509 663 751 N
+ AH N IY e n/a 4 509 624 750 N
+ AH N IY i n/a 4 509 654 750 N
+ AH N IY s n/a 4 509 663 750 N
+ AH N JH b n/a 4 507 561 772 N
+ AH N JH e n/a 4 507 561 775 N
+ AH N JH i n/a 4 507 578 772 N
+ AH N JH s n/a 4 507 561 772 N
+ AH N K b n/a 4 510 574 788 N
+ AH N K e n/a 4 510 574 790 N
+ AH N K i n/a 4 510 579 788 N
+ AH N K s n/a 4 510 574 788 N
+ AH N L b n/a 4 518 693 835 N
+ AH N L e n/a 4 518 701 835 N
+ AH N L i n/a 4 519 705 827 N
+ AH N L s n/a 4 518 693 835 N
+ AH N M b n/a 4 516 670 817 N
+ AH N M e n/a 4 515 634 821 N
+ AH N M i n/a 4 515 670 817 N
+ AH N M s n/a 4 515 670 817 N
+ AH N N b n/a 4 513 611 807 N
+ AH N N e n/a 4 509 611 807 N
+ AH N N i n/a 4 509 609 807 N
+ AH N N s n/a 4 509 611 807 N
+ AH N NG b n/a 4 513 609 816 N
+ AH N NG e n/a 4 509 609 821 N
+ AH N NG i n/a 4 509 609 816 N
+ AH N NG s n/a 4 509 611 816 N
+ AH N OW e n/a 4 509 629 752 N
+ AH N OW i n/a 4 509 654 752 N
+ AH N OW s n/a 4 509 663 752 N
+ AH N OY e n/a 4 509 629 752 N
+ AH N OY s n/a 4 509 663 752 N
+ AH N P b n/a 4 516 655 729 N
+ AH N P e n/a 4 515 634 734 N
+ AH N P i n/a 4 515 655 728 N
+ AH N P s n/a 4 515 662 728 N
+ AH N R b n/a 4 509 655 725 N
+ AH N R e n/a 4 509 639 725 N
+ AH N R i n/a 4 509 654 725 N
+ AH N R s n/a 4 509 670 725 N
+ AH N S b n/a 4 509 550 758 N
+ AH N S e n/a 4 509 554 763 N
+ AH N S i n/a 4 508 551 758 N
+ AH N S s n/a 4 509 551 758 N
+ AH N SH b n/a 4 509 550 758 N
+ AH N SH e n/a 4 509 554 764 N
+ AH N SH i n/a 4 507 551 758 N
+ AH N SH s n/a 4 509 551 758 N
+ AH N SIL e n/a 4 509 624 739 N
+ AH N SIL s n/a 4 509 663 740 N
+ AH N T b n/a 4 507 561 776 N
+ AH N T e n/a 4 507 561 776 N
+ AH N T i n/a 4 507 561 770 N
+ AH N T s n/a 4 507 561 776 N
+ AH N TH b n/a 4 516 655 743 N
+ AH N TH e n/a 4 515 624 743 N
+ AH N TH i n/a 4 517 654 741 N
+ AH N TH s n/a 4 515 662 743 N
+ AH N UH e n/a 4 509 629 751 N
+ AH N UH s n/a 4 509 663 751 N
+ AH N UW e n/a 4 509 629 751 N
+ AH N UW s n/a 4 509 663 751 N
+ AH N V b n/a 4 516 641 720 N
+ AH N V e n/a 4 515 634 738 N
+ AH N V i n/a 4 515 643 722 N
+ AH N V s n/a 4 515 641 722 N
+ AH N W b n/a 4 518 696 840 N
+ AH N W e n/a 4 518 701 840 N
+ AH N W i n/a 4 518 705 839 N
+ AH N W s n/a 4 518 696 840 N
+ AH N Y b n/a 4 509 655 750 N
+ AH N Y e n/a 4 509 624 750 N
+ AH N Y i n/a 4 509 654 750 N
+ AH N Y s n/a 4 509 663 750 N
+ AH N Z b n/a 4 509 550 767 N
+ AH N Z e n/a 4 509 554 767 N
+ AH N Z i n/a 4 509 551 767 N
+ AH N Z s n/a 4 509 551 767 N
+ AH N ZH e n/a 4 509 554 767 N
+ AH N ZH s n/a 4 509 551 767 N
+ AH NG AA e n/a 4 514 671 752 N
+ AH NG AA s n/a 4 514 663 752 N
+ AH NG AE e n/a 4 514 671 752 N
+ AH NG AE s n/a 4 514 663 752 N
+ AH NG AH e n/a 4 514 671 752 N
+ AH NG AH s n/a 4 514 663 752 N
+ AH NG AO e n/a 4 514 671 752 N
+ AH NG AO s n/a 4 514 663 752 N
+ AH NG AW e n/a 4 514 671 752 N
+ AH NG AW s n/a 4 514 663 752 N
+ AH NG AY e n/a 4 514 671 752 N
+ AH NG AY s n/a 4 514 663 752 N
+ AH NG B b n/a 4 514 647 726 N
+ AH NG B e n/a 4 514 647 738 N
+ AH NG B i n/a 4 514 647 727 N
+ AH NG B s n/a 4 514 647 726 N
+ AH NG CH b n/a 4 514 562 776 N
+ AH NG CH e n/a 4 514 561 776 N
+ AH NG CH s n/a 4 514 562 776 N
+ AH NG D b n/a 4 507 562 772 N
+ AH NG D e n/a 4 507 561 775 N
+ AH NG D s n/a 4 507 562 772 N
+ AH NG DH b n/a 4 514 656 717 N
+ AH NG DH e n/a 4 514 655 738 N
+ AH NG DH s n/a 4 514 656 717 N
+ AH NG EH e n/a 4 514 671 752 N
+ AH NG EH s n/a 4 514 663 752 N
+ AH NG ER e n/a 4 514 671 752 N
+ AH NG ER s n/a 4 514 663 752 N
+ AH NG EY e n/a 4 514 671 752 N
+ AH NG EY s n/a 4 514 663 752 N
+ AH NG F b n/a 4 514 655 742 N
+ AH NG F e n/a 4 514 671 745 N
+ AH NG F s n/a 4 514 662 742 N
+ AH NG G b n/a 4 514 567 792 N
+ AH NG G e n/a 4 514 569 793 N
+ AH NG G s n/a 4 514 569 792 N
+ AH NG HH b n/a 4 514 655 752 N
+ AH NG HH e n/a 4 514 671 752 N
+ AH NG HH s n/a 4 514 664 753 N
+ AH NG IH e n/a 4 514 671 751 N
+ AH NG IH s n/a 4 514 663 751 N
+ AH NG IY e n/a 4 514 671 750 N
+ AH NG IY s n/a 4 514 663 750 N
+ AH NG JH b n/a 4 514 562 772 N
+ AH NG JH e n/a 4 514 561 775 N
+ AH NG JH s n/a 4 514 562 772 N
+ AH NG K b n/a 4 514 569 788 N
+ AH NG K e n/a 4 514 569 790 N
+ AH NG K s n/a 4 514 569 788 N
+ AH NG L b n/a 4 518 694 835 N
+ AH NG L e n/a 4 518 701 835 N
+ AH NG L i n/a 4 519 711 829 N
+ AH NG L s n/a 4 518 694 835 N
+ AH NG M b n/a 4 514 670 817 N
+ AH NG M e n/a 4 514 670 821 N
+ AH NG M i n/a 4 514 670 817 N
+ AH NG M s n/a 4 514 670 817 N
+ AH NG N b n/a 4 513 597 805 N
+ AH NG N e n/a 4 509 597 805 N
+ AH NG N i n/a 4 509 595 805 N
+ AH NG N s n/a 4 509 597 805 N
+ AH NG NG b n/a 4 514 605 816 N
+ AH NG NG e n/a 4 514 605 821 N
+ AH NG NG s n/a 4 514 605 816 N
+ AH NG OW e n/a 4 514 671 752 N
+ AH NG OW s n/a 4 514 663 752 N
+ AH NG OY e n/a 4 514 671 752 N
+ AH NG OY s n/a 4 514 663 752 N
+ AH NG P b n/a 4 514 655 729 N
+ AH NG P e n/a 4 514 671 734 N
+ AH NG P i n/a 4 514 655 729 N
+ AH NG P s n/a 4 514 662 730 N
+ AH NG R b n/a 4 514 655 725 N
+ AH NG R e n/a 4 514 671 725 N
+ AH NG R s n/a 4 514 670 725 N
+ AH NG S b n/a 4 509 550 760 N
+ AH NG S e n/a 4 509 554 763 N
+ AH NG S i n/a 4 508 551 760 N
+ AH NG S s n/a 4 509 551 759 N
+ AH NG SH b n/a 4 514 550 754 N
+ AH NG SH e n/a 4 514 554 764 N
+ AH NG SH s n/a 4 514 551 754 N
+ AH NG SIL e n/a 4 514 672 739 N
+ AH NG SIL s n/a 4 514 663 740 N
+ AH NG T b n/a 4 507 562 776 N
+ AH NG T e n/a 4 507 561 776 N
+ AH NG T i n/a 4 507 562 770 N
+ AH NG T s n/a 4 507 562 776 N
+ AH NG TH b n/a 4 514 655 743 N
+ AH NG TH e n/a 4 514 671 743 N
+ AH NG TH s n/a 4 514 662 743 N
+ AH NG UH e n/a 4 514 671 751 N
+ AH NG UH s n/a 4 514 663 751 N
+ AH NG UW e n/a 4 514 671 751 N
+ AH NG UW s n/a 4 514 663 751 N
+ AH NG V b n/a 4 514 641 720 N
+ AH NG V e n/a 4 514 641 738 N
+ AH NG V s n/a 4 514 641 721 N
+ AH NG W b n/a 4 518 696 840 N
+ AH NG W e n/a 4 518 701 840 N
+ AH NG W s n/a 4 518 696 840 N
+ AH NG Y b n/a 4 514 655 750 N
+ AH NG Y e n/a 4 514 671 750 N
+ AH NG Y s n/a 4 514 663 750 N
+ AH NG Z b n/a 4 509 550 767 N
+ AH NG Z e n/a 4 509 554 767 N
+ AH NG Z s n/a 4 509 551 767 N
+ AH NG ZH e n/a 4 514 554 767 N
+ AH NG ZH s n/a 4 514 551 767 N
+ AH OW AA e n/a 4 386 687 752 N
+ AH OW AA s n/a 4 388 677 752 N
+ AH OW AE e n/a 4 386 687 752 N
+ AH OW AE s n/a 4 388 677 752 N
+ AH OW AH e n/a 4 386 687 752 N
+ AH OW AH s n/a 4 388 677 752 N
+ AH OW AO e n/a 4 386 687 752 N
+ AH OW AO s n/a 4 388 677 752 N
+ AH OW AW e n/a 4 386 687 752 N
+ AH OW AW s n/a 4 388 677 752 N
+ AH OW AY e n/a 4 386 687 752 N
+ AH OW AY s n/a 4 388 677 752 N
+ AH OW B b n/a 4 370 674 731 N
+ AH OW B e n/a 4 370 687 738 N
+ AH OW B i n/a 4 370 675 731 N
+ AH OW B s n/a 4 370 674 731 N
+ AH OW CH b n/a 4 384 568 776 N
+ AH OW CH e n/a 4 384 568 776 N
+ AH OW CH s n/a 4 384 568 776 N
+ AH OW D b n/a 4 384 568 772 N
+ AH OW D e n/a 4 384 568 775 N
+ AH OW D s n/a 4 384 568 772 N
+ AH OW DH b n/a 4 388 680 717 N
+ AH OW DH e n/a 4 388 687 738 N
+ AH OW DH s n/a 4 388 680 717 N
+ AH OW EH e n/a 4 386 687 752 N
+ AH OW EH s n/a 4 388 677 752 N
+ AH OW ER e n/a 4 386 687 752 N
+ AH OW ER s n/a 4 388 677 752 N
+ AH OW EY e n/a 4 386 687 752 N
+ AH OW EY s n/a 4 388 677 752 N
+ AH OW F b n/a 4 370 678 742 N
+ AH OW F e n/a 4 370 687 745 N
+ AH OW F i n/a 4 370 678 742 N
+ AH OW F s n/a 4 370 678 742 N
+ AH OW G b n/a 4 384 568 793 N
+ AH OW G e n/a 4 384 568 791 N
+ AH OW G i n/a 4 384 586 791 N
+ AH OW G s n/a 4 384 568 791 N
+ AH OW HH b n/a 4 388 677 752 N
+ AH OW HH e n/a 4 386 687 752 N
+ AH OW HH s n/a 4 388 677 753 N
+ AH OW IH e n/a 4 386 687 751 N
+ AH OW IH s n/a 4 388 677 751 N
+ AH OW IY e n/a 4 386 687 750 N
+ AH OW IY s n/a 4 388 677 750 N
+ AH OW JH b n/a 4 384 568 772 N
+ AH OW JH e n/a 4 384 568 775 N
+ AH OW JH i n/a 4 384 586 779 N
+ AH OW JH s n/a 4 384 568 772 N
+ AH OW K b n/a 4 384 568 787 N
+ AH OW K e n/a 4 384 568 787 N
+ AH OW K i n/a 4 384 587 787 N
+ AH OW K s n/a 4 384 568 787 N
+ AH OW L b n/a 4 403 707 836 N
+ AH OW L e n/a 4 403 707 836 N
+ AH OW L i n/a 4 403 707 828 N
+ AH OW L s n/a 4 403 707 836 N
+ AH OW M b n/a 4 370 678 823 N
+ AH OW M e n/a 4 370 687 823 N
+ AH OW M i n/a 4 370 678 823 N
+ AH OW M s n/a 4 370 678 823 N
+ AH OW N b n/a 4 387 596 800 N
+ AH OW N e n/a 4 387 596 799 N
+ AH OW N i n/a 4 386 596 799 N
+ AH OW N s n/a 4 387 596 799 N
+ AH OW NG b n/a 4 387 604 823 N
+ AH OW NG e n/a 4 386 604 823 N
+ AH OW NG s n/a 4 387 604 823 N
+ AH OW OW e n/a 4 386 687 752 N
+ AH OW OW s n/a 4 388 677 752 N
+ AH OW OY e n/a 4 386 687 752 N
+ AH OW OY s n/a 4 388 677 752 N
+ AH OW P b n/a 4 370 680 729 N
+ AH OW P e n/a 4 370 687 734 N
+ AH OW P i n/a 4 370 680 729 N
+ AH OW P s n/a 4 370 680 730 N
+ AH OW R b n/a 4 388 677 725 N
+ AH OW R e n/a 4 386 687 725 N
+ AH OW R s n/a 4 388 677 725 N
+ AH OW S b n/a 4 384 542 760 N
+ AH OW S e n/a 4 384 555 763 N
+ AH OW S i n/a 4 384 540 756 N
+ AH OW S s n/a 4 384 540 756 N
+ AH OW SH b n/a 4 388 542 754 N
+ AH OW SH e n/a 4 386 555 764 N
+ AH OW SH i n/a 4 390 540 754 N
+ AH OW SH s n/a 4 388 540 754 N
+ AH OW SIL e n/a 4 386 687 739 N
+ AH OW SIL s n/a 4 388 677 740 N
+ AH OW T b n/a 4 384 568 776 N
+ AH OW T e n/a 4 384 568 776 N
+ AH OW T i n/a 4 384 586 779 N
+ AH OW T s n/a 4 384 568 776 N
+ AH OW TH b n/a 4 388 677 743 N
+ AH OW TH e n/a 4 386 687 743 N
+ AH OW TH s n/a 4 388 677 743 N
+ AH OW UH e n/a 4 386 687 751 N
+ AH OW UH s n/a 4 388 677 751 N
+ AH OW UW e n/a 4 386 687 751 N
+ AH OW UW s n/a 4 388 677 751 N
+ AH OW V b n/a 4 370 678 713 N
+ AH OW V e n/a 4 370 687 738 N
+ AH OW V i n/a 4 370 688 715 N
+ AH OW V s n/a 4 370 678 713 N
+ AH OW W b n/a 4 403 706 841 N
+ AH OW W e n/a 4 403 706 841 N
+ AH OW W i n/a 4 403 707 841 N
+ AH OW W s n/a 4 403 706 841 N
+ AH OW Y b n/a 4 388 677 750 N
+ AH OW Y e n/a 4 386 687 750 N
+ AH OW Y s n/a 4 388 677 750 N
+ AH OW Z b n/a 4 385 542 767 N
+ AH OW Z e n/a 4 385 555 767 N
+ AH OW Z i n/a 4 385 540 767 N
+ AH OW Z s n/a 4 385 540 767 N
+ AH OW ZH e n/a 4 388 555 767 N
+ AH OW ZH s n/a 4 388 540 767 N
+ AH OY AA e n/a 4 527 671 752 N
+ AH OY AA s n/a 4 528 663 752 N
+ AH OY AE e n/a 4 527 671 752 N
+ AH OY AE s n/a 4 528 663 752 N
+ AH OY AH e n/a 4 527 671 752 N
+ AH OY AH s n/a 4 528 663 752 N
+ AH OY AO e n/a 4 527 671 752 N
+ AH OY AO s n/a 4 528 663 752 N
+ AH OY AW e n/a 4 527 671 752 N
+ AH OY AW s n/a 4 528 663 752 N
+ AH OY AY e n/a 4 527 671 752 N
+ AH OY AY s n/a 4 528 663 752 N
+ AH OY B b n/a 4 530 647 726 N
+ AH OY B e n/a 4 530 647 738 N
+ AH OY B i n/a 4 530 647 726 N
+ AH OY B s n/a 4 530 647 726 N
+ AH OY CH b n/a 4 524 563 776 N
+ AH OY CH e n/a 4 524 563 776 N
+ AH OY CH s n/a 4 524 563 776 N
+ AH OY D b n/a 4 524 563 772 N
+ AH OY D e n/a 4 524 563 775 N
+ AH OY D s n/a 4 524 563 772 N
+ AH OY DH b n/a 4 528 656 717 N
+ AH OY DH e n/a 4 527 655 738 N
+ AH OY DH s n/a 4 528 656 717 N
+ AH OY EH e n/a 4 527 671 752 N
+ AH OY EH s n/a 4 528 663 752 N
+ AH OY ER e n/a 4 527 671 752 N
+ AH OY ER s n/a 4 528 663 752 N
+ AH OY EY e n/a 4 527 671 752 N
+ AH OY EY s n/a 4 528 663 752 N
+ AH OY F b n/a 4 530 658 743 N
+ AH OY F e n/a 4 530 671 745 N
+ AH OY F s n/a 4 530 662 743 N
+ AH OY G b n/a 4 524 567 792 N
+ AH OY G e n/a 4 524 567 791 N
+ AH OY G s n/a 4 524 567 791 N
+ AH OY HH b n/a 4 530 658 752 N
+ AH OY HH e n/a 4 527 671 752 N
+ AH OY HH s n/a 4 530 664 753 N
+ AH OY IH e n/a 4 527 671 751 N
+ AH OY IH s n/a 4 528 663 751 N
+ AH OY IY e n/a 4 527 671 750 N
+ AH OY IY s n/a 4 528 663 750 N
+ AH OY JH b n/a 4 524 563 772 N
+ AH OY JH e n/a 4 524 563 775 N
+ AH OY JH i n/a 4 524 586 771 N
+ AH OY JH s n/a 4 524 563 772 N
+ AH OY K b n/a 4 524 567 788 N
+ AH OY K e n/a 4 524 567 790 N
+ AH OY K i n/a 4 524 580 788 N
+ AH OY K s n/a 4 524 567 788 N
+ AH OY L b n/a 4 528 701 838 N
+ AH OY L e n/a 4 527 701 838 N
+ AH OY L i n/a 4 528 701 838 N
+ AH OY L s n/a 4 528 701 838 N
+ AH OY M b n/a 4 530 667 818 N
+ AH OY M e n/a 4 530 667 821 N
+ AH OY M i n/a 4 530 667 818 N
+ AH OY M s n/a 4 530 667 818 N
+ AH OY N b n/a 4 520 603 805 N
+ AH OY N e n/a 4 520 603 805 N
+ AH OY N i n/a 4 526 602 804 N
+ AH OY N s n/a 4 520 603 805 N
+ AH OY NG b n/a 4 528 605 816 N
+ AH OY NG e n/a 4 527 605 821 N
+ AH OY NG s n/a 4 528 605 816 N
+ AH OY OW e n/a 4 527 671 752 N
+ AH OY OW s n/a 4 528 663 752 N
+ AH OY OY e n/a 4 527 671 752 N
+ AH OY OY s n/a 4 528 663 752 N
+ AH OY P b n/a 4 530 658 730 N
+ AH OY P e n/a 4 530 671 734 N
+ AH OY P s n/a 4 530 662 730 N
+ AH OY R b n/a 4 528 658 725 N
+ AH OY R e n/a 4 527 671 725 N
+ AH OY R s n/a 4 528 667 725 N
+ AH OY S b n/a 4 524 549 765 N
+ AH OY S e n/a 4 524 554 765 N
+ AH OY S i n/a 4 524 549 765 N
+ AH OY S s n/a 4 524 549 765 N
+ AH OY SH b n/a 4 530 549 764 N
+ AH OY SH e n/a 4 527 554 764 N
+ AH OY SH s n/a 4 530 549 764 N
+ AH OY SIL e n/a 4 527 672 739 N
+ AH OY SIL s n/a 4 530 663 740 N
+ AH OY T b n/a 4 524 563 776 N
+ AH OY T e n/a 4 524 563 776 N
+ AH OY T s n/a 4 524 563 776 N
+ AH OY TH b n/a 4 530 658 743 N
+ AH OY TH e n/a 4 527 671 743 N
+ AH OY TH s n/a 4 530 662 743 N
+ AH OY UH e n/a 4 527 671 751 N
+ AH OY UH s n/a 4 528 663 751 N
+ AH OY UW e n/a 4 527 671 751 N
+ AH OY UW s n/a 4 528 663 751 N
+ AH OY V b n/a 4 530 645 722 N
+ AH OY V e n/a 4 530 645 738 N
+ AH OY V s n/a 4 530 645 722 N
+ AH OY W b n/a 4 528 701 840 N
+ AH OY W e n/a 4 527 701 840 N
+ AH OY W s n/a 4 528 701 840 N
+ AH OY Y b n/a 4 528 658 750 N
+ AH OY Y e n/a 4 527 671 750 N
+ AH OY Y s n/a 4 528 663 750 N
+ AH OY Z b n/a 4 521 550 767 N
+ AH OY Z e n/a 4 521 554 767 N
+ AH OY Z i n/a 4 521 553 767 N
+ AH OY Z s n/a 4 521 553 767 N
+ AH OY ZH e n/a 4 527 554 767 N
+ AH OY ZH s n/a 4 528 553 767 N
+ AH P AA e n/a 4 458 677 747 N
+ AH P AA s n/a 4 458 677 747 N
+ AH P AE e n/a 4 458 677 747 N
+ AH P AE s n/a 4 458 677 747 N
+ AH P AH e n/a 4 458 677 749 N
+ AH P AH s n/a 4 458 677 749 N
+ AH P AO e n/a 4 458 677 746 N
+ AH P AO i n/a 4 458 677 746 N
+ AH P AO s n/a 4 458 677 746 N
+ AH P AW e n/a 4 458 677 747 N
+ AH P AW s n/a 4 458 677 747 N
+ AH P AY e n/a 4 458 677 747 N
+ AH P AY s n/a 4 458 677 747 N
+ AH P B b n/a 4 455 680 733 N
+ AH P B e n/a 4 455 680 736 N
+ AH P B i n/a 4 454 679 733 N
+ AH P B s n/a 4 455 680 733 N
+ AH P CH b n/a 4 458 559 776 N
+ AH P CH e n/a 4 458 566 777 N
+ AH P CH i n/a 4 458 590 779 N
+ AH P CH s n/a 4 458 559 776 N
+ AH P D b n/a 4 458 559 772 N
+ AH P D e n/a 4 458 566 775 N
+ AH P D i n/a 4 458 576 785 N
+ AH P D s n/a 4 458 559 772 N
+ AH P DH b n/a 4 459 680 717 N
+ AH P DH e n/a 4 459 680 738 N
+ AH P DH i n/a 4 459 680 717 N
+ AH P DH s n/a 4 459 680 717 N
+ AH P EH e n/a 4 458 677 747 N
+ AH P EH s n/a 4 458 677 747 N
+ AH P ER e n/a 4 458 677 746 N
+ AH P ER s n/a 4 458 677 746 N
+ AH P EY e n/a 4 458 677 747 N
+ AH P EY i n/a 4 458 677 747 N
+ AH P EY s n/a 4 458 677 747 N
+ AH P F b n/a 4 455 678 742 N
+ AH P F e n/a 4 455 678 745 N
+ AH P F i n/a 4 454 678 742 N
+ AH P F s n/a 4 455 678 742 N
+ AH P G b n/a 4 458 567 792 N
+ AH P G e n/a 4 458 568 791 N
+ AH P G i n/a 4 458 582 791 N
+ AH P G s n/a 4 458 568 791 N
+ AH P HH b n/a 4 458 677 747 N
+ AH P HH e n/a 4 458 677 747 N
+ AH P HH i n/a 4 458 677 747 N
+ AH P HH s n/a 4 458 677 747 N
+ AH P IH e n/a 4 458 677 749 N
+ AH P IH s n/a 4 458 677 749 N
+ AH P IY e n/a 4 458 677 750 N
+ AH P IY s n/a 4 458 677 750 N
+ AH P JH b n/a 4 458 559 772 N
+ AH P JH e n/a 4 458 566 774 N
+ AH P JH i n/a 4 458 590 783 N
+ AH P JH s n/a 4 458 559 772 N
+ AH P K b n/a 4 458 568 788 N
+ AH P K e n/a 4 458 568 790 N
+ AH P K i n/a 4 458 582 788 N
+ AH P K s n/a 4 458 568 788 N
+ AH P L b n/a 4 465 711 833 N
+ AH P L e n/a 4 465 711 833 N
+ AH P L i n/a 4 467 712 831 N
+ AH P L s n/a 4 465 711 833 N
+ AH P M b n/a 4 454 669 815 N
+ AH P M e n/a 4 455 669 821 N
+ AH P M i n/a 4 454 669 813 N
+ AH P M s n/a 4 455 669 815 N
+ AH P N b n/a 4 458 614 798 N
+ AH P N e n/a 4 458 614 797 N
+ AH P N i n/a 4 458 614 798 N
+ AH P N s n/a 4 458 614 798 N
+ AH P NG b n/a 4 458 616 816 N
+ AH P NG e n/a 4 458 616 821 N
+ AH P NG i n/a 4 458 616 816 N
+ AH P NG s n/a 4 458 616 816 N
+ AH P OW e n/a 4 458 677 746 N
+ AH P OW s n/a 4 458 677 746 N
+ AH P OY e n/a 4 458 677 746 N
+ AH P OY s n/a 4 458 677 746 N
+ AH P P b n/a 4 454 680 729 N
+ AH P P e n/a 4 455 680 734 N
+ AH P P i n/a 4 454 680 729 N
+ AH P P s n/a 4 455 680 730 N
+ AH P R b n/a 4 458 677 725 N
+ AH P R e n/a 4 458 677 725 N
+ AH P R i n/a 4 458 677 725 N
+ AH P R s n/a 4 458 677 725 N
+ AH P S b n/a 4 458 550 760 N
+ AH P S e n/a 4 458 554 762 N
+ AH P S i n/a 4 459 546 756 N
+ AH P S s n/a 4 458 546 756 N
+ AH P SH b n/a 4 458 550 754 N
+ AH P SH e n/a 4 458 554 764 N
+ AH P SH i n/a 4 459 546 754 N
+ AH P SH s n/a 4 458 546 754 N
+ AH P SIL e n/a 4 458 677 739 N
+ AH P SIL s n/a 4 458 677 740 N
+ AH P T b n/a 4 458 559 776 N
+ AH P T e n/a 4 458 566 777 N
+ AH P T i n/a 4 458 576 783 N
+ AH P T s n/a 4 458 559 776 N
+ AH P TH b n/a 4 458 677 743 N
+ AH P TH e n/a 4 458 677 743 N
+ AH P TH i n/a 4 459 677 743 N
+ AH P TH s n/a 4 458 677 743 N
+ AH P UH e n/a 4 458 677 751 N
+ AH P UH s n/a 4 458 677 751 N
+ AH P UW e n/a 4 458 677 751 N
+ AH P UW s n/a 4 458 677 751 N
+ AH P V b n/a 4 455 678 714 N
+ AH P V e n/a 4 455 678 738 N
+ AH P V i n/a 4 454 678 715 N
+ AH P V s n/a 4 455 678 714 N
+ AH P W b n/a 4 465 712 833 N
+ AH P W e n/a 4 465 711 833 N
+ AH P W i n/a 4 467 712 831 N
+ AH P W s n/a 4 465 712 833 N
+ AH P Y b n/a 4 458 677 750 N
+ AH P Y e n/a 4 458 677 750 N
+ AH P Y s n/a 4 458 677 750 N
+ AH P Z b n/a 4 459 550 767 N
+ AH P Z e n/a 4 459 554 767 N
+ AH P Z i n/a 4 459 548 767 N
+ AH P Z s n/a 4 459 546 767 N
+ AH P ZH e n/a 4 459 554 767 N
+ AH P ZH s n/a 4 459 546 767 N
+ AH R AA e n/a 4 394 687 752 N
+ AH R AA i n/a 4 394 677 752 N
+ AH R AA s n/a 4 395 677 752 N
+ AH R AE e n/a 4 394 687 752 N
+ AH R AE s n/a 4 395 677 752 N
+ AH R AH e n/a 4 394 687 752 N
+ AH R AH s n/a 4 395 677 752 N
+ AH R AO e n/a 4 394 687 752 N
+ AH R AO i n/a 4 394 677 752 N
+ AH R AO s n/a 4 395 677 752 N
+ AH R AW e n/a 4 394 687 752 N
+ AH R AW s n/a 4 395 677 752 N
+ AH R AY e n/a 4 394 687 752 N
+ AH R AY s n/a 4 395 677 752 N
+ AH R B b n/a 4 398 689 732 N
+ AH R B e n/a 4 398 689 738 N
+ AH R B i n/a 4 399 689 732 N
+ AH R B s n/a 4 398 689 732 N
+ AH R CH b n/a 4 396 571 778 N
+ AH R CH e n/a 4 391 571 778 N
+ AH R CH i n/a 4 391 571 778 N
+ AH R CH s n/a 4 391 571 778 N
+ AH R D b n/a 4 396 571 778 N
+ AH R D e n/a 4 391 571 778 N
+ AH R D i n/a 4 391 571 778 N
+ AH R D s n/a 4 391 571 778 N
+ AH R DH b n/a 4 394 680 717 N
+ AH R DH e n/a 4 394 687 738 N
+ AH R DH i n/a 4 394 685 717 N
+ AH R DH s n/a 4 394 680 717 N
+ AH R EH e n/a 4 394 687 752 N
+ AH R EH s n/a 4 395 677 752 N
+ AH R ER e n/a 4 394 687 752 N
+ AH R ER i n/a 4 394 677 752 N
+ AH R ER s n/a 4 395 677 752 N
+ AH R EY e n/a 4 394 687 752 N
+ AH R EY s n/a 4 395 677 752 N
+ AH R F b n/a 4 398 691 744 N
+ AH R F e n/a 4 398 691 744 N
+ AH R F i n/a 4 400 691 744 N
+ AH R F s n/a 4 398 691 744 N
+ AH R G b n/a 4 396 571 793 N
+ AH R G e n/a 4 396 571 791 N
+ AH R G i n/a 4 395 569 791 N
+ AH R G s n/a 4 396 571 791 N
+ AH R HH b n/a 4 394 677 752 N
+ AH R HH e n/a 4 394 687 752 N
+ AH R HH i n/a 4 395 677 752 N
+ AH R HH s n/a 4 395 677 753 N
+ AH R IH e n/a 4 394 687 751 N
+ AH R IH i n/a 4 394 677 751 N
+ AH R IH s n/a 4 395 677 751 N
+ AH R IY e n/a 4 394 687 750 N
+ AH R IY i n/a 4 394 677 750 N
+ AH R IY s n/a 4 395 677 750 N
+ AH R JH b n/a 4 396 571 778 N
+ AH R JH e n/a 4 391 571 778 N
+ AH R JH i n/a 4 391 571 778 N
+ AH R JH s n/a 4 391 571 778 N
+ AH R K b n/a 4 396 570 787 N
+ AH R K e n/a 4 396 570 787 N
+ AH R K i n/a 4 395 570 787 N
+ AH R K s n/a 4 396 570 787 N
+ AH R L b n/a 4 402 708 836 N
+ AH R L e n/a 4 402 708 836 N
+ AH R L i n/a 4 402 708 830 N
+ AH R L s n/a 4 402 708 836 N
+ AH R M b n/a 4 398 692 822 N
+ AH R M e n/a 4 398 692 822 N
+ AH R M i n/a 4 401 692 822 N
+ AH R M s n/a 4 398 692 822 N
+ AH R N b n/a 4 393 598 801 N
+ AH R N e n/a 4 396 598 801 N
+ AH R N i n/a 4 397 598 801 N
+ AH R N s n/a 4 396 598 801 N
+ AH R NG b n/a 4 393 604 823 N
+ AH R NG e n/a 4 394 604 823 N
+ AH R NG i n/a 4 394 604 823 N
+ AH R NG s n/a 4 395 604 823 N
+ AH R OW e n/a 4 394 687 752 N
+ AH R OW i n/a 4 394 677 752 N
+ AH R OW s n/a 4 395 677 752 N
+ AH R OY e n/a 4 394 687 752 N
+ AH R OY s n/a 4 395 677 752 N
+ AH R P b n/a 4 398 689 730 N
+ AH R P e n/a 4 398 689 734 N
+ AH R P i n/a 4 400 691 730 N
+ AH R P s n/a 4 398 689 730 N
+ AH R R b n/a 4 394 677 725 N
+ AH R R e n/a 4 394 687 725 N
+ AH R R i n/a 4 394 677 725 N
+ AH R R s n/a 4 395 677 725 N
+ AH R S b n/a 4 394 542 755 N
+ AH R S e n/a 4 392 554 763 N
+ AH R S i n/a 4 392 541 755 N
+ AH R S s n/a 4 392 541 755 N
+ AH R SH b n/a 4 394 542 754 N
+ AH R SH e n/a 4 394 554 764 N
+ AH R SH i n/a 4 395 542 754 N
+ AH R SH s n/a 4 395 542 754 N
+ AH R SIL e n/a 4 394 687 739 N
+ AH R SIL s n/a 4 395 677 740 N
+ AH R T b n/a 4 396 571 778 N
+ AH R T e n/a 4 391 571 778 N
+ AH R T i n/a 4 391 571 778 N
+ AH R T s n/a 4 391 571 778 N
+ AH R TH b n/a 4 394 677 745 N
+ AH R TH e n/a 4 394 687 743 N
+ AH R TH i n/a 4 395 677 745 N
+ AH R TH s n/a 4 395 677 745 N
+ AH R UH e n/a 4 394 687 751 N
+ AH R UH s n/a 4 395 677 751 N
+ AH R UW e n/a 4 394 687 751 N
+ AH R UW s n/a 4 395 677 751 N
+ AH R V b n/a 4 398 690 718 N
+ AH R V e n/a 4 398 690 738 N
+ AH R V i n/a 4 400 691 718 N
+ AH R V s n/a 4 398 690 718 N
+ AH R W b n/a 4 402 708 841 N
+ AH R W e n/a 4 402 708 841 N
+ AH R W i n/a 4 402 708 841 N
+ AH R W s n/a 4 402 708 841 N
+ AH R Y b n/a 4 394 677 750 N
+ AH R Y e n/a 4 394 687 750 N
+ AH R Y i n/a 4 394 677 750 N
+ AH R Y s n/a 4 395 677 750 N
+ AH R Z b n/a 4 394 542 769 N
+ AH R Z e n/a 4 392 554 769 N
+ AH R Z i n/a 4 392 541 769 N
+ AH R Z s n/a 4 392 541 769 N
+ AH R ZH e n/a 4 394 554 769 N
+ AH R ZH i n/a 4 394 542 769 N
+ AH R ZH s n/a 4 394 542 769 N
+ AH S AA e n/a 4 435 629 752 N
+ AH S AA s n/a 4 425 651 752 N
+ AH S AE e n/a 4 435 624 752 N
+ AH S AE s n/a 4 425 651 752 N
+ AH S AH e n/a 4 435 624 752 N
+ AH S AH s n/a 4 425 651 752 N
+ AH S AO e n/a 4 435 629 752 N
+ AH S AO s n/a 4 425 651 752 N
+ AH S AW e n/a 4 435 624 752 N
+ AH S AW s n/a 4 425 651 752 N
+ AH S AY e n/a 4 435 629 752 N
+ AH S AY s n/a 4 425 651 752 N
+ AH S B b n/a 4 449 650 726 N
+ AH S B e n/a 4 452 634 738 N
+ AH S B i n/a 4 448 653 727 N
+ AH S B s n/a 4 449 650 726 N
+ AH S CH b n/a 4 424 564 776 N
+ AH S CH e n/a 4 435 564 776 N
+ AH S CH i n/a 4 419 585 780 N
+ AH S CH s n/a 4 424 564 776 N
+ AH S D b n/a 4 410 564 772 N
+ AH S D e n/a 4 435 564 775 N
+ AH S D i n/a 4 412 585 786 N
+ AH S D s n/a 4 410 564 772 N
+ AH S DH b n/a 4 421 653 717 N
+ AH S DH e n/a 4 435 624 738 N
+ AH S DH i n/a 4 419 653 717 N
+ AH S DH s n/a 4 421 651 717 N
+ AH S EH e n/a 4 435 624 752 N
+ AH S EH s n/a 4 425 651 752 N
+ AH S ER e n/a 4 435 629 752 N
+ AH S ER s n/a 4 425 651 752 N
+ AH S EY e n/a 4 435 624 752 N
+ AH S EY s n/a 4 425 651 752 N
+ AH S F b n/a 4 449 652 743 N
+ AH S F e n/a 4 452 634 745 N
+ AH S F i n/a 4 448 651 742 N
+ AH S F s n/a 4 449 652 743 N
+ AH S G b n/a 4 426 574 793 N
+ AH S G e n/a 4 435 574 791 N
+ AH S G i n/a 4 426 580 791 N
+ AH S G s n/a 4 426 574 791 N
+ AH S HH b n/a 4 425 651 753 N
+ AH S HH e n/a 4 435 629 753 N
+ AH S HH i n/a 4 419 651 753 N
+ AH S HH s n/a 4 425 651 753 N
+ AH S IH e n/a 4 435 624 751 N
+ AH S IH s n/a 4 425 651 751 N
+ AH S IY e n/a 4 435 624 750 N
+ AH S IY s n/a 4 425 651 750 N
+ AH S JH b n/a 4 424 564 772 N
+ AH S JH e n/a 4 435 564 775 N
+ AH S JH i n/a 4 416 577 783 N
+ AH S JH s n/a 4 424 564 772 N
+ AH S K b n/a 4 426 574 790 N
+ AH S K e n/a 4 435 574 790 N
+ AH S K i n/a 4 426 580 790 N
+ AH S K s n/a 4 426 574 790 N
+ AH S L b n/a 4 464 694 835 N
+ AH S L e n/a 4 464 701 835 N
+ AH S L i n/a 4 464 697 834 N
+ AH S L s n/a 4 464 694 835 N
+ AH S M b n/a 4 441 661 815 N
+ AH S M e n/a 4 441 634 821 N
+ AH S M i n/a 4 441 660 813 N
+ AH S M s n/a 4 441 661 815 N
+ AH S N b n/a 4 414 615 809 N
+ AH S N e n/a 4 437 615 809 N
+ AH S N i n/a 4 411 608 810 N
+ AH S N s n/a 4 414 615 809 N
+ AH S NG b n/a 4 427 616 816 N
+ AH S NG e n/a 4 435 616 821 N
+ AH S NG i n/a 4 427 608 816 N
+ AH S NG s n/a 4 427 616 816 N
+ AH S OW e n/a 4 435 629 752 N
+ AH S OW i n/a 4 416 651 752 N
+ AH S OW s n/a 4 425 651 752 N
+ AH S OY e n/a 4 435 629 752 N
+ AH S OY s n/a 4 425 651 752 N
+ AH S P b n/a 4 448 653 729 N
+ AH S P e n/a 4 452 634 734 N
+ AH S P i n/a 4 447 650 728 N
+ AH S P s n/a 4 448 652 728 N
+ AH S R b n/a 4 425 649 724 N
+ AH S R e n/a 4 435 639 725 N
+ AH S R i n/a 4 416 649 724 N
+ AH S R s n/a 4 425 649 724 N
+ AH S S b n/a 4 412 547 763 N
+ AH S S e n/a 4 436 554 763 N
+ AH S S i n/a 4 407 545 762 N
+ AH S S s n/a 4 406 545 762 N
+ AH S SH b n/a 4 424 548 764 N
+ AH S SH e n/a 4 436 554 764 N
+ AH S SH i n/a 4 419 545 762 N
+ AH S SH s n/a 4 424 545 762 N
+ AH S SIL e n/a 4 435 624 739 N
+ AH S SIL s n/a 4 425 651 740 N
+ AH S T b n/a 4 410 564 776 N
+ AH S T e n/a 4 435 564 776 N
+ AH S T i n/a 4 410 577 783 N
+ AH S T s n/a 4 410 564 776 N
+ AH S TH b n/a 4 425 652 743 N
+ AH S TH e n/a 4 435 624 743 N
+ AH S TH i n/a 4 419 651 743 N
+ AH S TH s n/a 4 425 652 743 N
+ AH S UH e n/a 4 435 629 751 N
+ AH S UH i n/a 4 416 651 751 N
+ AH S UH s n/a 4 425 651 751 N
+ AH S UW e n/a 4 435 629 751 N
+ AH S UW s n/a 4 425 651 751 N
+ AH S V b n/a 4 449 648 723 N
+ AH S V e n/a 4 452 634 738 N
+ AH S V i n/a 4 449 649 723 N
+ AH S V s n/a 4 449 649 723 N
+ AH S W b n/a 4 464 696 840 N
+ AH S W e n/a 4 464 701 840 N
+ AH S W i n/a 4 464 697 839 N
+ AH S W s n/a 4 464 696 840 N
+ AH S Y b n/a 4 424 649 750 N
+ AH S Y e n/a 4 435 624 750 N
+ AH S Y i n/a 4 416 649 750 N
+ AH S Y s n/a 4 424 649 750 N
+ AH S Z b n/a 4 412 544 768 N
+ AH S Z e n/a 4 436 554 768 N
+ AH S Z i n/a 4 407 544 768 N
+ AH S Z s n/a 4 407 544 768 N
+ AH S ZH e n/a 4 436 554 768 N
+ AH S ZH s n/a 4 421 544 768 N
+ AH SH AA e n/a 4 435 671 752 N
+ AH SH AA s n/a 4 434 663 752 N
+ AH SH AE e n/a 4 435 671 752 N
+ AH SH AE s n/a 4 434 663 752 N
+ AH SH AH e n/a 4 435 671 752 N
+ AH SH AH i n/a 4 435 658 752 N
+ AH SH AH s n/a 4 434 663 752 N
+ AH SH AO e n/a 4 435 671 752 N
+ AH SH AO s n/a 4 434 663 752 N
+ AH SH AW e n/a 4 435 671 752 N
+ AH SH AW s n/a 4 434 663 752 N
+ AH SH AY e n/a 4 435 671 752 N
+ AH SH AY s n/a 4 434 663 752 N
+ AH SH B b n/a 4 444 650 726 N
+ AH SH B e n/a 4 452 650 738 N
+ AH SH B i n/a 4 444 653 726 N
+ AH SH B s n/a 4 444 650 726 N
+ AH SH CH b n/a 4 434 564 776 N
+ AH SH CH e n/a 4 435 564 776 N
+ AH SH CH i n/a 4 435 586 779 N
+ AH SH CH s n/a 4 434 564 776 N
+ AH SH D b n/a 4 434 564 772 N
+ AH SH D e n/a 4 435 564 775 N
+ AH SH D i n/a 4 435 584 786 N
+ AH SH D s n/a 4 434 564 772 N
+ AH SH DH b n/a 4 435 656 717 N
+ AH SH DH e n/a 4 435 655 738 N
+ AH SH DH s n/a 4 435 656 717 N
+ AH SH EH e n/a 4 435 671 752 N
+ AH SH EH s n/a 4 434 663 752 N
+ AH SH ER e n/a 4 435 671 752 N
+ AH SH ER s n/a 4 434 663 752 N
+ AH SH EY e n/a 4 435 671 752 N
+ AH SH EY s n/a 4 434 663 752 N
+ AH SH F b n/a 4 444 658 742 N
+ AH SH F e n/a 4 452 671 745 N
+ AH SH F i n/a 4 444 658 742 N
+ AH SH F s n/a 4 444 662 742 N
+ AH SH G b n/a 4 434 567 793 N
+ AH SH G e n/a 4 435 569 791 N
+ AH SH G i n/a 4 435 580 791 N
+ AH SH G s n/a 4 434 569 791 N
+ AH SH HH b n/a 4 434 658 753 N
+ AH SH HH e n/a 4 435 671 753 N
+ AH SH HH i n/a 4 435 658 753 N
+ AH SH HH s n/a 4 434 664 753 N
+ AH SH IH e n/a 4 435 671 751 N
+ AH SH IH s n/a 4 434 663 751 N
+ AH SH IY e n/a 4 435 671 750 N
+ AH SH IY s n/a 4 434 663 750 N
+ AH SH JH b n/a 4 434 564 772 N
+ AH SH JH e n/a 4 435 564 775 N
+ AH SH JH s n/a 4 434 564 772 N
+ AH SH K b n/a 4 434 569 790 N
+ AH SH K e n/a 4 435 569 790 N
+ AH SH K i n/a 4 435 580 790 N
+ AH SH K s n/a 4 434 569 790 N
+ AH SH L b n/a 4 464 694 835 N
+ AH SH L e n/a 4 463 701 835 N
+ AH SH L i n/a 4 464 699 834 N
+ AH SH L s n/a 4 464 694 835 N
+ AH SH M b n/a 4 439 665 815 N
+ AH SH M e n/a 4 440 665 821 N
+ AH SH M i n/a 4 440 665 815 N
+ AH SH M s n/a 4 439 665 815 N
+ AH SH N b n/a 4 437 618 803 N
+ AH SH N e n/a 4 437 618 803 N
+ AH SH N i n/a 4 437 618 803 N
+ AH SH N s n/a 4 437 618 803 N
+ AH SH NG b n/a 4 436 601 816 N
+ AH SH NG e n/a 4 435 601 821 N
+ AH SH NG i n/a 4 435 600 816 N
+ AH SH NG s n/a 4 435 601 816 N
+ AH SH OW e n/a 4 435 671 752 N
+ AH SH OW s n/a 4 434 663 752 N
+ AH SH OY e n/a 4 435 671 752 N
+ AH SH OY s n/a 4 434 663 752 N
+ AH SH P b n/a 4 444 655 730 N
+ AH SH P e n/a 4 452 671 734 N
+ AH SH P i n/a 4 444 658 730 N
+ AH SH P s n/a 4 444 662 730 N
+ AH SH R b n/a 4 434 658 725 N
+ AH SH R e n/a 4 435 671 725 N
+ AH SH R i n/a 4 435 658 725 N
+ AH SH R s n/a 4 434 667 725 N
+ AH SH S b n/a 4 436 547 763 N
+ AH SH S e n/a 4 436 554 763 N
+ AH SH S i n/a 4 436 546 763 N
+ AH SH S s n/a 4 436 546 763 N
+ AH SH SH b n/a 4 436 548 764 N
+ AH SH SH e n/a 4 436 554 764 N
+ AH SH SH i n/a 4 436 546 764 N
+ AH SH SH s n/a 4 436 546 764 N
+ AH SH SIL e n/a 4 435 672 739 N
+ AH SH SIL s n/a 4 434 663 740 N
+ AH SH T b n/a 4 434 564 776 N
+ AH SH T e n/a 4 435 564 776 N
+ AH SH T i n/a 4 435 581 786 N
+ AH SH T s n/a 4 434 564 776 N
+ AH SH TH b n/a 4 434 658 743 N
+ AH SH TH e n/a 4 435 671 743 N
+ AH SH TH i n/a 4 435 658 743 N
+ AH SH TH s n/a 4 434 662 743 N
+ AH SH UH e n/a 4 435 671 751 N
+ AH SH UH s n/a 4 434 663 751 N
+ AH SH UW e n/a 4 435 671 751 N
+ AH SH UW s n/a 4 434 663 751 N
+ AH SH V b n/a 4 444 648 723 N
+ AH SH V e n/a 4 452 648 738 N
+ AH SH V i n/a 4 444 648 723 N
+ AH SH V s n/a 4 444 648 723 N
+ AH SH W b n/a 4 464 696 840 N
+ AH SH W e n/a 4 463 701 840 N
+ AH SH W i n/a 4 464 698 839 N
+ AH SH W s n/a 4 464 696 840 N
+ AH SH Y b n/a 4 434 658 750 N
+ AH SH Y e n/a 4 435 671 750 N
+ AH SH Y s n/a 4 434 663 750 N
+ AH SH Z b n/a 4 436 544 768 N
+ AH SH Z e n/a 4 436 554 768 N
+ AH SH Z i n/a 4 436 544 768 N
+ AH SH Z s n/a 4 436 544 768 N
+ AH SH ZH e n/a 4 436 554 768 N
+ AH SH ZH s n/a 4 436 544 768 N
+ AH SIL AA s n/a 4 470 683 752 N
+ AH SIL AE s n/a 4 470 683 752 N
+ AH SIL AH s n/a 4 470 683 752 N
+ AH SIL AO s n/a 4 470 683 752 N
+ AH SIL AW s n/a 4 470 683 752 N
+ AH SIL AY s n/a 4 470 683 752 N
+ AH SIL B b n/a 4 472 684 727 N
+ AH SIL B s n/a 4 472 684 727 N
+ AH SIL CH b n/a 4 470 560 776 N
+ AH SIL CH s n/a 4 470 562 776 N
+ AH SIL D b n/a 4 470 560 772 N
+ AH SIL D s n/a 4 470 562 772 N
+ AH SIL DH b n/a 4 471 685 717 N
+ AH SIL DH s n/a 4 471 685 717 N
+ AH SIL EH s n/a 4 470 683 752 N
+ AH SIL ER s n/a 4 470 683 752 N
+ AH SIL EY s n/a 4 470 683 752 N
+ AH SIL F b n/a 4 472 684 742 N
+ AH SIL F s n/a 4 472 684 742 N
+ AH SIL G b n/a 4 470 567 792 N
+ AH SIL G s n/a 4 470 569 791 N
+ AH SIL HH b n/a 4 470 683 752 N
+ AH SIL HH s n/a 4 470 683 753 N
+ AH SIL IH s n/a 4 470 683 751 N
+ AH SIL IY s n/a 4 470 683 750 N
+ AH SIL JH b n/a 4 470 560 772 N
+ AH SIL JH s n/a 4 470 562 772 N
+ AH SIL K b n/a 4 470 569 788 N
+ AH SIL K s n/a 4 470 569 788 N
+ AH SIL L b n/a 4 472 693 836 N
+ AH SIL L s n/a 4 472 693 836 N
+ AH SIL M b n/a 4 471 668 815 N
+ AH SIL M s n/a 4 472 669 815 N
+ AH SIL N b n/a 4 469 601 802 N
+ AH SIL N s n/a 4 469 601 802 N
+ AH SIL NG b n/a 4 470 600 816 N
+ AH SIL NG s n/a 4 470 600 816 N
+ AH SIL OW s n/a 4 470 683 752 N
+ AH SIL OY s n/a 4 470 683 752 N
+ AH SIL P b n/a 4 471 682 729 N
+ AH SIL P s n/a 4 471 684 730 N
+ AH SIL R b n/a 4 470 683 725 N
+ AH SIL R s n/a 4 470 683 725 N
+ AH SIL S b n/a 4 470 550 760 N
+ AH SIL S s n/a 4 470 547 757 N
+ AH SIL SH b n/a 4 470 550 754 N
+ AH SIL SH s n/a 4 470 547 754 N
+ AH SIL SIL s n/a 4 470 683 740 N
+ AH SIL T b n/a 4 470 560 776 N
+ AH SIL T s n/a 4 470 562 776 N
+ AH SIL TH b n/a 4 470 685 743 N
+ AH SIL TH s n/a 4 470 685 743 N
+ AH SIL UH s n/a 4 470 683 751 N
+ AH SIL UW s n/a 4 470 683 751 N
+ AH SIL V b n/a 4 472 681 715 N
+ AH SIL V s n/a 4 472 684 715 N
+ AH SIL W b n/a 4 472 693 841 N
+ AH SIL W s n/a 4 472 693 841 N
+ AH SIL Y b n/a 4 470 683 750 N
+ AH SIL Y s n/a 4 470 683 750 N
+ AH SIL Z b n/a 4 472 550 767 N
+ AH SIL Z s n/a 4 472 544 767 N
+ AH SIL ZH s n/a 4 472 544 767 N
+ AH T AA e n/a 4 432 623 747 N
+ AH T AA i n/a 4 416 659 747 N
+ AH T AA s n/a 4 425 663 747 N
+ AH T AE e n/a 4 432 621 747 N
+ AH T AE s n/a 4 425 663 747 N
+ AH T AH e n/a 4 433 623 748 N
+ AH T AH s n/a 4 425 663 749 N
+ AH T AO e n/a 4 432 623 746 N
+ AH T AO s n/a 4 425 663 746 N
+ AH T AW e n/a 4 432 621 747 N
+ AH T AW i n/a 4 416 659 747 N
+ AH T AW s n/a 4 425 663 747 N
+ AH T AY e n/a 4 432 623 747 N
+ AH T AY i n/a 4 416 659 747 N
+ AH T AY s n/a 4 425 663 747 N
+ AH T B b n/a 4 443 646 726 N
+ AH T B e n/a 4 451 636 736 N
+ AH T B i n/a 4 445 646 726 N
+ AH T B s n/a 4 443 646 726 N
+ AH T CH b n/a 4 424 559 776 N
+ AH T CH e n/a 4 429 566 777 N
+ AH T CH i n/a 4 418 585 771 N
+ AH T CH s n/a 4 424 559 776 N
+ AH T D b n/a 4 424 559 772 N
+ AH T D e n/a 4 429 566 774 N
+ AH T D i n/a 4 423 558 773 N
+ AH T D s n/a 4 424 559 772 N
+ AH T DH b n/a 4 421 656 717 N
+ AH T DH e n/a 4 428 638 737 N
+ AH T DH i n/a 4 415 656 717 N
+ AH T DH s n/a 4 421 656 717 N
+ AH T EH e n/a 4 432 621 747 N
+ AH T EH i n/a 4 416 659 747 N
+ AH T EH s n/a 4 425 663 747 N
+ AH T ER e n/a 4 433 621 746 N
+ AH T ER s n/a 4 425 663 746 N
+ AH T EY e n/a 4 432 621 747 N
+ AH T EY s n/a 4 425 663 747 N
+ AH T F b n/a 4 443 658 743 N
+ AH T F e n/a 4 452 637 745 N
+ AH T F i n/a 4 442 659 742 N
+ AH T F s n/a 4 443 662 743 N
+ AH T G b n/a 4 427 573 792 N
+ AH T G e n/a 4 430 572 793 N
+ AH T G i n/a 4 426 579 792 N
+ AH T G s n/a 4 427 574 793 N
+ AH T HH b n/a 4 425 658 747 N
+ AH T HH e n/a 4 432 621 747 N
+ AH T HH i n/a 4 418 659 747 N
+ AH T HH s n/a 4 425 664 747 N
+ AH T IH e n/a 4 433 623 749 N
+ AH T IH s n/a 4 425 663 749 N
+ AH T IY e n/a 4 432 622 750 N
+ AH T IY s n/a 4 425 663 750 N
+ AH T JH b n/a 4 424 559 772 N
+ AH T JH e n/a 4 429 566 774 N
+ AH T JH i n/a 4 416 577 772 N
+ AH T JH s n/a 4 424 559 772 N
+ AH T K b n/a 4 427 574 788 N
+ AH T K e n/a 4 430 572 790 N
+ AH T K i n/a 4 427 582 788 N
+ AH T K s n/a 4 427 574 788 N
+ AH T L b n/a 4 462 694 835 N
+ AH T L e n/a 4 463 698 834 N
+ AH T L i n/a 4 461 703 826 N
+ AH T L s n/a 4 462 694 835 N
+ AH T M b n/a 4 442 665 818 N
+ AH T M e n/a 4 452 635 820 N
+ AH T M i n/a 4 445 666 818 N
+ AH T M s n/a 4 442 665 818 N
+ AH T N b n/a 4 413 615 808 N
+ AH T N e n/a 4 428 613 809 N
+ AH T N i n/a 4 408 612 811 N
+ AH T N s n/a 4 408 614 808 N
+ AH T NG b n/a 4 413 616 818 N
+ AH T NG e n/a 4 432 613 820 N
+ AH T NG i n/a 4 412 616 817 N
+ AH T NG s n/a 4 413 616 818 N
+ AH T OW e n/a 4 432 623 746 N
+ AH T OW s n/a 4 425 663 746 N
+ AH T OY e n/a 4 432 623 746 N
+ AH T OY s n/a 4 425 663 746 N
+ AH T P b n/a 4 442 655 729 N
+ AH T P e n/a 4 451 636 734 N
+ AH T P i n/a 4 443 659 728 N
+ AH T P s n/a 4 443 662 728 N
+ AH T R b n/a 4 425 658 725 N
+ AH T R e n/a 4 433 635 725 N
+ AH T R i n/a 4 416 659 725 N
+ AH T R s n/a 4 425 667 725 N
+ AH T S b n/a 4 425 550 757 N
+ AH T S e n/a 4 428 556 762 N
+ AH T S i n/a 4 423 546 756 N
+ AH T S s n/a 4 425 546 756 N
+ AH T SH b n/a 4 424 550 757 N
+ AH T SH e n/a 4 431 556 764 N
+ AH T SH i n/a 4 418 546 756 N
+ AH T SH s n/a 4 424 546 756 N
+ AH T SIL e n/a 4 431 627 740 N
+ AH T SIL s n/a 4 425 663 740 N
+ AH T T b n/a 4 424 559 776 N
+ AH T T e n/a 4 429 566 777 N
+ AH T T i n/a 4 423 559 770 N
+ AH T T s n/a 4 424 559 776 N
+ AH T TH b n/a 4 425 658 743 N
+ AH T TH e n/a 4 428 638 743 N
+ AH T TH i n/a 4 418 659 743 N
+ AH T TH s n/a 4 425 662 743 N
+ AH T UH e n/a 4 432 623 751 N
+ AH T UH s n/a 4 425 663 751 N
+ AH T UW e n/a 4 432 623 751 N
+ AH T UW s n/a 4 425 663 751 N
+ AH T V b n/a 4 443 644 721 N
+ AH T V e n/a 4 452 638 737 N
+ AH T V i n/a 4 445 644 722 N
+ AH T V s n/a 4 443 644 721 N
+ AH T W b n/a 4 462 696 840 N
+ AH T W e n/a 4 463 698 839 N
+ AH T W i n/a 4 461 702 839 N
+ AH T W s n/a 4 462 696 840 N
+ AH T Y b n/a 4 424 658 750 N
+ AH T Y e n/a 4 430 622 750 N
+ AH T Y i n/a 4 416 659 750 N
+ AH T Y s n/a 4 424 663 750 N
+ AH T Z b n/a 4 425 550 767 N
+ AH T Z e n/a 4 428 556 767 N
+ AH T Z i n/a 4 423 544 767 N
+ AH T Z s n/a 4 425 544 767 N
+ AH T ZH e n/a 4 432 556 767 N
+ AH T ZH i n/a 4 416 544 767 N
+ AH T ZH s n/a 4 421 544 767 N
+ AH TH AA e n/a 4 435 629 747 N
+ AH TH AA s n/a 4 425 663 747 N
+ AH TH AE e n/a 4 435 630 751 N
+ AH TH AE s n/a 4 425 663 751 N
+ AH TH AH e n/a 4 435 630 751 N
+ AH TH AH i n/a 4 416 658 751 N
+ AH TH AH s n/a 4 425 663 751 N
+ AH TH AO e n/a 4 435 629 746 N
+ AH TH AO s n/a 4 425 663 746 N
+ AH TH AW e n/a 4 435 630 751 N
+ AH TH AW s n/a 4 425 663 751 N
+ AH TH AY e n/a 4 435 629 747 N
+ AH TH AY s n/a 4 425 663 747 N
+ AH TH B b n/a 4 445 650 726 N
+ AH TH B e n/a 4 452 631 735 N
+ AH TH B i n/a 4 445 653 726 N
+ AH TH B s n/a 4 445 650 726 N
+ AH TH CH b n/a 4 424 565 776 N
+ AH TH CH e n/a 4 435 565 777 N
+ AH TH CH s n/a 4 424 565 776 N
+ AH TH D b n/a 4 413 565 772 N
+ AH TH D e n/a 4 435 565 775 N
+ AH TH D i n/a 4 410 583 785 N
+ AH TH D s n/a 4 413 565 772 N
+ AH TH DH b n/a 4 421 656 717 N
+ AH TH DH e n/a 4 435 624 738 N
+ AH TH DH s n/a 4 421 656 717 N
+ AH TH EH e n/a 4 435 630 751 N
+ AH TH EH s n/a 4 425 663 751 N
+ AH TH ER e n/a 4 435 629 746 N
+ AH TH ER s n/a 4 425 663 746 N
+ AH TH EY e n/a 4 435 630 750 N
+ AH TH EY s n/a 4 425 663 750 N
+ AH TH F b n/a 4 443 658 743 N
+ AH TH F e n/a 4 452 631 745 N
+ AH TH F s n/a 4 443 662 743 N
+ AH TH G b n/a 4 426 575 793 N
+ AH TH G e n/a 4 435 575 791 N
+ AH TH G i n/a 4 426 582 791 N
+ AH TH G s n/a 4 426 575 791 N
+ AH TH HH b n/a 4 425 658 753 N
+ AH TH HH e n/a 4 435 628 753 N
+ AH TH HH s n/a 4 425 664 753 N
+ AH TH IH e n/a 4 435 630 750 N
+ AH TH IH s n/a 4 425 663 750 N
+ AH TH IY e n/a 4 435 630 750 N
+ AH TH IY s n/a 4 425 663 750 N
+ AH TH JH b n/a 4 424 565 772 N
+ AH TH JH e n/a 4 435 565 775 N
+ AH TH JH i n/a 4 416 583 785 N
+ AH TH JH s n/a 4 424 565 772 N
+ AH TH K b n/a 4 426 575 790 N
+ AH TH K e n/a 4 435 575 790 N
+ AH TH K i n/a 4 426 582 790 N
+ AH TH K s n/a 4 426 575 790 N
+ AH TH L b n/a 4 462 694 835 N
+ AH TH L e n/a 4 463 694 835 N
+ AH TH L i n/a 4 462 703 826 N
+ AH TH L s n/a 4 462 694 835 N
+ AH TH M b n/a 4 441 673 815 N
+ AH TH M e n/a 4 441 633 821 N
+ AH TH M i n/a 4 441 671 814 N
+ AH TH M s n/a 4 441 673 815 N
+ AH TH N b n/a 4 413 601 798 N
+ AH TH N e n/a 4 437 601 797 N
+ AH TH N i n/a 4 412 600 798 N
+ AH TH N s n/a 4 413 601 798 N
+ AH TH NG b n/a 4 427 601 816 N
+ AH TH NG e n/a 4 435 601 821 N
+ AH TH NG i n/a 4 427 600 816 N
+ AH TH NG s n/a 4 427 601 816 N
+ AH TH OW e n/a 4 435 629 746 N
+ AH TH OW s n/a 4 425 663 746 N
+ AH TH OY e n/a 4 435 629 746 N
+ AH TH OY s n/a 4 425 663 746 N
+ AH TH P b n/a 4 442 655 729 N
+ AH TH P e n/a 4 452 632 734 N
+ AH TH P i n/a 4 443 658 728 N
+ AH TH P s n/a 4 443 662 728 N
+ AH TH R b n/a 4 425 658 724 N
+ AH TH R e n/a 4 435 639 724 N
+ AH TH R s n/a 4 425 667 724 N
+ AH TH S b n/a 4 413 550 763 N
+ AH TH S e n/a 4 436 556 762 N
+ AH TH S i n/a 4 406 545 762 N
+ AH TH S s n/a 4 406 546 762 N
+ AH TH SH b n/a 4 424 550 764 N
+ AH TH SH e n/a 4 436 556 764 N
+ AH TH SH s n/a 4 424 546 762 N
+ AH TH SIL e n/a 4 435 624 739 N
+ AH TH SIL s n/a 4 425 663 740 N
+ AH TH T b n/a 4 413 565 776 N
+ AH TH T e n/a 4 435 565 777 N
+ AH TH T i n/a 4 410 583 785 N
+ AH TH T s n/a 4 413 565 776 N
+ AH TH TH b n/a 4 425 658 743 N
+ AH TH TH e n/a 4 435 627 743 N
+ AH TH TH s n/a 4 425 662 743 N
+ AH TH UH e n/a 4 435 629 750 N
+ AH TH UH s n/a 4 425 663 750 N
+ AH TH UW e n/a 4 435 629 750 N
+ AH TH UW s n/a 4 425 663 750 N
+ AH TH V b n/a 4 445 648 723 N
+ AH TH V e n/a 4 452 634 738 N
+ AH TH V s n/a 4 445 649 723 N
+ AH TH W b n/a 4 462 696 842 N
+ AH TH W e n/a 4 463 695 842 N
+ AH TH W i n/a 4 462 702 842 N
+ AH TH W s n/a 4 462 696 842 N
+ AH TH Y b n/a 4 424 658 750 N
+ AH TH Y e n/a 4 435 630 750 N
+ AH TH Y s n/a 4 424 663 750 N
+ AH TH Z b n/a 4 413 550 767 N
+ AH TH Z e n/a 4 436 556 767 N
+ AH TH Z i n/a 4 406 544 767 N
+ AH TH Z s n/a 4 406 544 767 N
+ AH TH ZH e n/a 4 436 556 767 N
+ AH TH ZH s n/a 4 421 544 767 N
+ AH UH AA s n/a 4 388 677 752 N
+ AH UH AE s n/a 4 388 677 752 N
+ AH UH AH s n/a 4 388 677 752 N
+ AH UH AO s n/a 4 388 677 752 N
+ AH UH AW s n/a 4 388 677 752 N
+ AH UH AY s n/a 4 388 677 752 N
+ AH UH B b n/a 4 372 674 731 N
+ AH UH B s n/a 4 372 674 731 N
+ AH UH CH b n/a 4 380 568 776 N
+ AH UH CH s n/a 4 380 568 776 N
+ AH UH D b n/a 4 381 568 772 N
+ AH UH D s n/a 4 381 568 772 N
+ AH UH DH b n/a 4 388 680 717 N
+ AH UH DH s n/a 4 388 680 717 N
+ AH UH EH s n/a 4 388 677 752 N
+ AH UH ER s n/a 4 388 677 752 N
+ AH UH EY s n/a 4 388 677 752 N
+ AH UH F b n/a 4 372 678 742 N
+ AH UH F s n/a 4 372 678 742 N
+ AH UH G b n/a 4 382 568 793 N
+ AH UH G s n/a 4 382 568 791 N
+ AH UH HH b n/a 4 388 677 752 N
+ AH UH HH s n/a 4 388 677 753 N
+ AH UH IH s n/a 4 388 677 751 N
+ AH UH IY s n/a 4 388 677 750 N
+ AH UH JH b n/a 4 381 568 772 N
+ AH UH JH s n/a 4 381 568 772 N
+ AH UH K b n/a 4 382 568 787 N
+ AH UH K s n/a 4 382 568 787 N
+ AH UH L b n/a 4 403 707 836 N
+ AH UH L s n/a 4 403 707 836 N
+ AH UH M b n/a 4 372 678 823 N
+ AH UH M s n/a 4 372 678 823 N
+ AH UH N b n/a 4 388 596 800 N
+ AH UH N s n/a 4 388 596 799 N
+ AH UH NG b n/a 4 388 604 823 N
+ AH UH NG s n/a 4 388 604 823 N
+ AH UH OW s n/a 4 388 677 752 N
+ AH UH OY s n/a 4 388 677 752 N
+ AH UH P b n/a 4 372 680 729 N
+ AH UH P s n/a 4 372 680 730 N
+ AH UH R b n/a 4 388 677 725 N
+ AH UH R s n/a 4 388 677 725 N
+ AH UH S b n/a 4 382 542 760 N
+ AH UH S s n/a 4 382 540 756 N
+ AH UH SH b n/a 4 388 542 754 N
+ AH UH SH s n/a 4 388 540 754 N
+ AH UH SIL s n/a 4 388 677 740 N
+ AH UH T b n/a 4 381 568 776 N
+ AH UH T s n/a 4 381 568 776 N
+ AH UH TH b n/a 4 388 677 743 N
+ AH UH TH s n/a 4 388 677 743 N
+ AH UH UH s n/a 4 388 677 751 N
+ AH UH UW s n/a 4 388 677 751 N
+ AH UH V b n/a 4 372 678 714 N
+ AH UH V s n/a 4 372 678 714 N
+ AH UH W b n/a 4 403 706 841 N
+ AH UH W s n/a 4 403 706 841 N
+ AH UH Y b n/a 4 388 677 750 N
+ AH UH Y s n/a 4 388 677 750 N
+ AH UH Z b n/a 4 382 542 767 N
+ AH UH Z s n/a 4 382 540 767 N
+ AH UH ZH s n/a 4 388 540 767 N
+ AH UW AA e n/a 4 386 687 752 N
+ AH UW AA s n/a 4 388 677 752 N
+ AH UW AE e n/a 4 386 687 752 N
+ AH UW AE s n/a 4 388 677 752 N
+ AH UW AH e n/a 4 386 687 752 N
+ AH UW AH s n/a 4 388 677 752 N
+ AH UW AO e n/a 4 386 687 752 N
+ AH UW AO s n/a 4 388 677 752 N
+ AH UW AW e n/a 4 386 687 752 N
+ AH UW AW s n/a 4 388 677 752 N
+ AH UW AY e n/a 4 386 687 752 N
+ AH UW AY s n/a 4 388 677 752 N
+ AH UW B b n/a 4 371 674 731 N
+ AH UW B e n/a 4 371 687 738 N
+ AH UW B i n/a 4 371 675 731 N
+ AH UW B s n/a 4 371 674 731 N
+ AH UW CH b n/a 4 384 568 776 N
+ AH UW CH e n/a 4 384 568 776 N
+ AH UW CH s n/a 4 384 568 776 N
+ AH UW D b n/a 4 384 568 772 N
+ AH UW D e n/a 4 384 568 775 N
+ AH UW D i n/a 4 384 588 782 N
+ AH UW D s n/a 4 384 568 772 N
+ AH UW DH b n/a 4 388 680 717 N
+ AH UW DH e n/a 4 388 687 738 N
+ AH UW DH s n/a 4 388 680 717 N
+ AH UW EH e n/a 4 386 687 752 N
+ AH UW EH s n/a 4 388 677 752 N
+ AH UW ER e n/a 4 386 687 752 N
+ AH UW ER s n/a 4 388 677 752 N
+ AH UW EY e n/a 4 386 687 752 N
+ AH UW EY s n/a 4 388 677 752 N
+ AH UW F b n/a 4 371 678 742 N
+ AH UW F e n/a 4 371 687 745 N
+ AH UW F s n/a 4 371 678 742 N
+ AH UW G b n/a 4 384 568 793 N
+ AH UW G e n/a 4 384 568 791 N
+ AH UW G s n/a 4 384 568 791 N
+ AH UW HH b n/a 4 388 677 752 N
+ AH UW HH e n/a 4 386 687 752 N
+ AH UW HH i n/a 4 390 677 752 N
+ AH UW HH s n/a 4 388 677 753 N
+ AH UW IH e n/a 4 386 687 751 N
+ AH UW IH s n/a 4 388 677 751 N
+ AH UW IY e n/a 4 386 687 750 N
+ AH UW IY s n/a 4 388 677 750 N
+ AH UW JH b n/a 4 384 568 772 N
+ AH UW JH e n/a 4 384 568 775 N
+ AH UW JH i n/a 4 384 586 779 N
+ AH UW JH s n/a 4 384 568 772 N
+ AH UW K b n/a 4 384 568 787 N
+ AH UW K e n/a 4 384 568 787 N
+ AH UW K s n/a 4 384 568 787 N
+ AH UW L b n/a 4 404 707 836 N
+ AH UW L e n/a 4 404 707 836 N
+ AH UW L i n/a 4 404 707 829 N
+ AH UW L s n/a 4 404 707 836 N
+ AH UW M b n/a 4 371 678 823 N
+ AH UW M e n/a 4 371 687 823 N
+ AH UW M i n/a 4 371 678 823 N
+ AH UW M s n/a 4 371 678 823 N
+ AH UW N b n/a 4 388 596 800 N
+ AH UW N e n/a 4 388 596 799 N
+ AH UW N i n/a 4 386 596 799 N
+ AH UW N s n/a 4 388 596 799 N
+ AH UW NG b n/a 4 388 604 823 N
+ AH UW NG e n/a 4 386 604 823 N
+ AH UW NG s n/a 4 388 604 823 N
+ AH UW OW e n/a 4 386 687 752 N
+ AH UW OW s n/a 4 388 677 752 N
+ AH UW OY e n/a 4 386 687 752 N
+ AH UW OY s n/a 4 388 677 752 N
+ AH UW P b n/a 4 371 680 729 N
+ AH UW P e n/a 4 371 687 734 N
+ AH UW P s n/a 4 371 680 730 N
+ AH UW R b n/a 4 388 677 725 N
+ AH UW R e n/a 4 386 687 725 N
+ AH UW R i n/a 4 390 677 725 N
+ AH UW R s n/a 4 388 677 725 N
+ AH UW S b n/a 4 384 542 760 N
+ AH UW S e n/a 4 384 555 763 N
+ AH UW S i n/a 4 384 540 756 N
+ AH UW S s n/a 4 384 540 756 N
+ AH UW SH b n/a 4 388 542 754 N
+ AH UW SH e n/a 4 386 555 764 N
+ AH UW SH s n/a 4 388 540 754 N
+ AH UW SIL e n/a 4 386 687 739 N
+ AH UW SIL s n/a 4 388 677 740 N
+ AH UW T b n/a 4 384 568 776 N
+ AH UW T e n/a 4 384 568 776 N
+ AH UW T i n/a 4 384 586 779 N
+ AH UW T s n/a 4 384 568 776 N
+ AH UW TH b n/a 4 388 677 743 N
+ AH UW TH e n/a 4 386 687 743 N
+ AH UW TH i n/a 4 386 677 743 N
+ AH UW TH s n/a 4 388 677 743 N
+ AH UW UH e n/a 4 386 687 751 N
+ AH UW UH s n/a 4 388 677 751 N
+ AH UW UW e n/a 4 386 687 751 N
+ AH UW UW s n/a 4 388 677 751 N
+ AH UW V b n/a 4 371 678 714 N
+ AH UW V e n/a 4 371 687 738 N
+ AH UW V i n/a 4 371 688 715 N
+ AH UW V s n/a 4 371 678 714 N
+ AH UW W b n/a 4 404 706 841 N
+ AH UW W e n/a 4 404 706 841 N
+ AH UW W s n/a 4 404 706 841 N
+ AH UW Y b n/a 4 388 677 750 N
+ AH UW Y e n/a 4 386 687 750 N
+ AH UW Y s n/a 4 388 677 750 N
+ AH UW Z b n/a 4 385 542 767 N
+ AH UW Z e n/a 4 385 555 767 N
+ AH UW Z i n/a 4 385 540 767 N
+ AH UW Z s n/a 4 385 540 767 N
+ AH UW ZH e n/a 4 388 555 767 N
+ AH UW ZH s n/a 4 388 540 767 N
+ AH V AA e n/a 4 456 687 752 N
+ AH V AA s n/a 4 457 677 752 N
+ AH V AE e n/a 4 456 687 752 N
+ AH V AE s n/a 4 457 677 752 N
+ AH V AH e n/a 4 456 687 752 N
+ AH V AH s n/a 4 457 677 752 N
+ AH V AO e n/a 4 456 687 752 N
+ AH V AO s n/a 4 457 677 752 N
+ AH V AW e n/a 4 456 687 752 N
+ AH V AW s n/a 4 457 677 752 N
+ AH V AY e n/a 4 456 687 752 N
+ AH V AY s n/a 4 457 677 752 N
+ AH V B b n/a 4 457 675 731 N
+ AH V B e n/a 4 457 687 738 N
+ AH V B i n/a 4 457 675 731 N
+ AH V B s n/a 4 457 675 731 N
+ AH V CH b n/a 4 456 564 776 N
+ AH V CH e n/a 4 456 564 776 N
+ AH V CH i n/a 4 460 587 783 N
+ AH V CH s n/a 4 456 564 776 N
+ AH V D b n/a 4 456 564 772 N
+ AH V D e n/a 4 456 564 775 N
+ AH V D i n/a 4 460 576 785 N
+ AH V D s n/a 4 456 564 772 N
+ AH V DH b n/a 4 457 680 717 N
+ AH V DH e n/a 4 457 687 738 N
+ AH V DH s n/a 4 456 680 717 N
+ AH V EH e n/a 4 456 687 752 N
+ AH V EH s n/a 4 457 677 752 N
+ AH V ER e n/a 4 456 687 752 N
+ AH V ER s n/a 4 457 677 752 N
+ AH V EY e n/a 4 456 687 752 N
+ AH V EY s n/a 4 457 677 752 N
+ AH V F b n/a 4 457 678 742 N
+ AH V F e n/a 4 457 687 745 N
+ AH V F i n/a 4 457 678 742 N
+ AH V F s n/a 4 457 678 742 N
+ AH V G b n/a 4 456 567 793 N
+ AH V G e n/a 4 456 568 791 N
+ AH V G i n/a 4 460 580 791 N
+ AH V G s n/a 4 457 568 791 N
+ AH V HH b n/a 4 456 677 753 N
+ AH V HH e n/a 4 456 687 753 N
+ AH V HH i n/a 4 460 677 753 N
+ AH V HH s n/a 4 457 677 753 N
+ AH V IH e n/a 4 456 687 751 N
+ AH V IH s n/a 4 457 677 751 N
+ AH V IY e n/a 4 456 687 750 N
+ AH V IY s n/a 4 457 677 750 N
+ AH V JH b n/a 4 456 564 772 N
+ AH V JH e n/a 4 456 564 775 N
+ AH V JH i n/a 4 460 586 783 N
+ AH V JH s n/a 4 456 564 772 N
+ AH V K b n/a 4 456 568 790 N
+ AH V K e n/a 4 456 568 790 N
+ AH V K i n/a 4 460 580 790 N
+ AH V K s n/a 4 457 568 790 N
+ AH V L b n/a 4 466 704 833 N
+ AH V L e n/a 4 466 704 833 N
+ AH V L i n/a 4 466 704 833 N
+ AH V L s n/a 4 466 704 833 N
+ AH V M b n/a 4 457 669 819 N
+ AH V M e n/a 4 457 669 821 N
+ AH V M i n/a 4 457 669 817 N
+ AH V M s n/a 4 457 669 819 N
+ AH V N b n/a 4 456 592 798 N
+ AH V N e n/a 4 456 592 797 N
+ AH V N i n/a 4 460 592 798 N
+ AH V N s n/a 4 456 592 798 N
+ AH V NG b n/a 4 456 604 816 N
+ AH V NG e n/a 4 456 604 821 N
+ AH V NG i n/a 4 460 604 816 N
+ AH V NG s n/a 4 457 604 816 N
+ AH V OW e n/a 4 456 687 752 N
+ AH V OW s n/a 4 457 677 752 N
+ AH V OY e n/a 4 456 687 752 N
+ AH V OY s n/a 4 457 677 752 N
+ AH V P b n/a 4 457 680 729 N
+ AH V P e n/a 4 457 687 734 N
+ AH V P s n/a 4 457 680 730 N
+ AH V R b n/a 4 456 677 725 N
+ AH V R e n/a 4 456 687 725 N
+ AH V R i n/a 4 460 677 725 N
+ AH V R s n/a 4 457 677 725 N
+ AH V S b n/a 4 457 536 760 N
+ AH V S e n/a 4 457 554 763 N
+ AH V S i n/a 4 460 538 756 N
+ AH V S s n/a 4 456 540 756 N
+ AH V SH b n/a 4 457 536 754 N
+ AH V SH e n/a 4 457 554 764 N
+ AH V SH i n/a 4 460 538 754 N
+ AH V SH s n/a 4 456 540 754 N
+ AH V SIL e n/a 4 456 687 739 N
+ AH V SIL s n/a 4 457 677 740 N
+ AH V T b n/a 4 456 564 776 N
+ AH V T e n/a 4 456 564 776 N
+ AH V T i n/a 4 460 576 783 N
+ AH V T s n/a 4 456 564 776 N
+ AH V TH b n/a 4 457 677 743 N
+ AH V TH e n/a 4 457 687 743 N
+ AH V TH i n/a 4 460 677 743 N
+ AH V TH s n/a 4 456 677 743 N
+ AH V UH e n/a 4 456 687 751 N
+ AH V UH s n/a 4 457 677 751 N
+ AH V UW e n/a 4 456 687 751 N
+ AH V UW s n/a 4 457 677 751 N
+ AH V V b n/a 4 457 678 714 N
+ AH V V e n/a 4 457 687 738 N
+ AH V V i n/a 4 457 688 715 N
+ AH V V s n/a 4 457 678 714 N
+ AH V W b n/a 4 466 704 833 N
+ AH V W e n/a 4 466 704 833 N
+ AH V W i n/a 4 466 704 833 N
+ AH V W s n/a 4 466 704 833 N
+ AH V Y b n/a 4 456 677 750 N
+ AH V Y e n/a 4 456 687 750 N
+ AH V Y s n/a 4 456 677 750 N
+ AH V Z b n/a 4 457 536 767 N
+ AH V Z e n/a 4 457 554 767 N
+ AH V Z i n/a 4 460 538 767 N
+ AH V Z s n/a 4 456 538 767 N
+ AH V ZH e n/a 4 457 554 767 N
+ AH V ZH i n/a 4 460 538 767 N
+ AH V ZH s n/a 4 456 538 767 N
+ AH W AA e n/a 4 390 687 752 N
+ AH W AA i n/a 4 390 674 752 N
+ AH W AA s n/a 4 390 674 752 N
+ AH W AE e n/a 4 390 687 752 N
+ AH W AE i n/a 4 390 674 752 N
+ AH W AE s n/a 4 390 674 752 N
+ AH W AH e n/a 4 390 687 752 N
+ AH W AH s n/a 4 390 674 752 N
+ AH W AO e n/a 4 390 687 752 N
+ AH W AO s n/a 4 390 674 752 N
+ AH W AW e n/a 4 390 687 752 N
+ AH W AW s n/a 4 390 674 752 N
+ AH W AY e n/a 4 390 687 752 N
+ AH W AY s n/a 4 390 674 752 N
+ AH W B b n/a 4 388 674 731 N
+ AH W B e n/a 4 386 687 738 N
+ AH W B i n/a 4 386 675 731 N
+ AH W B s n/a 4 388 674 731 N
+ AH W CH b n/a 4 390 568 776 N
+ AH W CH e n/a 4 390 568 776 N
+ AH W CH s n/a 4 390 568 776 N
+ AH W D b n/a 4 388 568 772 N
+ AH W D e n/a 4 388 568 775 N
+ AH W D i n/a 4 386 586 782 N
+ AH W D s n/a 4 388 568 772 N
+ AH W DH b n/a 4 390 675 717 N
+ AH W DH e n/a 4 390 687 738 N
+ AH W DH i n/a 4 390 685 717 N
+ AH W DH s n/a 4 390 675 717 N
+ AH W EH e n/a 4 390 687 752 N
+ AH W EH s n/a 4 390 674 752 N
+ AH W ER e n/a 4 390 687 752 N
+ AH W ER s n/a 4 390 674 752 N
+ AH W EY e n/a 4 390 687 752 N
+ AH W EY s n/a 4 390 674 752 N
+ AH W F b n/a 4 390 674 742 N
+ AH W F e n/a 4 390 687 745 N
+ AH W F i n/a 4 390 674 742 N
+ AH W F s n/a 4 390 674 742 N
+ AH W G b n/a 4 388 568 793 N
+ AH W G e n/a 4 386 568 791 N
+ AH W G i n/a 4 386 586 791 N
+ AH W G s n/a 4 388 568 791 N
+ AH W HH b n/a 4 390 674 752 N
+ AH W HH e n/a 4 390 687 752 N
+ AH W HH i n/a 4 390 674 752 N
+ AH W HH s n/a 4 390 674 753 N
+ AH W IH e n/a 4 390 687 751 N
+ AH W IH s n/a 4 390 674 751 N
+ AH W IY e n/a 4 390 687 750 N
+ AH W IY s n/a 4 390 674 750 N
+ AH W JH b n/a 4 388 568 772 N
+ AH W JH e n/a 4 386 568 775 N
+ AH W JH i n/a 4 386 586 779 N
+ AH W JH s n/a 4 388 568 772 N
+ AH W K b n/a 4 390 568 787 N
+ AH W K e n/a 4 390 568 787 N
+ AH W K i n/a 4 390 587 787 N
+ AH W K s n/a 4 390 568 787 N
+ AH W L b n/a 4 404 707 829 N
+ AH W L e n/a 4 404 707 829 N
+ AH W L i n/a 4 404 707 829 N
+ AH W L s n/a 4 404 707 829 N
+ AH W M b n/a 4 390 676 823 N
+ AH W M e n/a 4 390 687 823 N
+ AH W M i n/a 4 390 676 823 N
+ AH W M s n/a 4 390 676 823 N
+ AH W N b n/a 4 390 607 796 N
+ AH W N e n/a 4 390 607 796 N
+ AH W N i n/a 4 390 606 795 N
+ AH W N s n/a 4 390 607 796 N
+ AH W NG b n/a 4 390 604 823 N
+ AH W NG e n/a 4 390 604 823 N
+ AH W NG i n/a 4 390 604 823 N
+ AH W NG s n/a 4 390 604 823 N
+ AH W OW e n/a 4 390 687 752 N
+ AH W OW s n/a 4 390 674 752 N
+ AH W OY e n/a 4 390 687 752 N
+ AH W OY s n/a 4 390 674 752 N
+ AH W P b n/a 4 390 674 731 N
+ AH W P e n/a 4 390 687 734 N
+ AH W P i n/a 4 390 674 731 N
+ AH W P s n/a 4 390 674 731 N
+ AH W R b n/a 4 390 674 725 N
+ AH W R e n/a 4 390 687 725 N
+ AH W R s n/a 4 390 674 725 N
+ AH W S b n/a 4 384 555 759 N
+ AH W S e n/a 4 384 555 763 N
+ AH W S i n/a 4 384 555 756 N
+ AH W S s n/a 4 384 555 756 N
+ AH W SH b n/a 4 390 555 754 N
+ AH W SH e n/a 4 390 555 764 N
+ AH W SH i n/a 4 390 555 754 N
+ AH W SH s n/a 4 390 555 754 N
+ AH W SIL e n/a 4 390 687 739 N
+ AH W SIL s n/a 4 390 674 740 N
+ AH W T b n/a 4 389 568 776 N
+ AH W T e n/a 4 389 568 776 N
+ AH W T i n/a 4 389 587 781 N
+ AH W T s n/a 4 389 568 776 N
+ AH W TH b n/a 4 390 674 743 N
+ AH W TH e n/a 4 390 687 743 N
+ AH W TH i n/a 4 390 674 743 N
+ AH W TH s n/a 4 390 674 743 N
+ AH W UH e n/a 4 390 687 751 N
+ AH W UH s n/a 4 390 674 751 N
+ AH W UW e n/a 4 390 687 751 N
+ AH W UW s n/a 4 390 674 751 N
+ AH W V b n/a 4 390 674 713 N
+ AH W V e n/a 4 390 687 738 N
+ AH W V s n/a 4 390 674 713 N
+ AH W W b n/a 4 404 707 829 N
+ AH W W e n/a 4 404 707 829 N
+ AH W W s n/a 4 404 707 829 N
+ AH W Y b n/a 4 390 674 750 N
+ AH W Y e n/a 4 390 687 750 N
+ AH W Y s n/a 4 390 674 750 N
+ AH W Z b n/a 4 385 555 769 N
+ AH W Z e n/a 4 385 555 769 N
+ AH W Z i n/a 4 385 555 769 N
+ AH W Z s n/a 4 385 555 769 N
+ AH W ZH e n/a 4 390 555 769 N
+ AH W ZH s n/a 4 390 555 769 N
+ AH Y AA e n/a 4 527 671 752 N
+ AH Y AA s n/a 4 527 663 752 N
+ AH Y AE e n/a 4 527 671 752 N
+ AH Y AE s n/a 4 527 663 752 N
+ AH Y AH e n/a 4 527 671 752 N
+ AH Y AH s n/a 4 527 663 752 N
+ AH Y AO e n/a 4 527 671 752 N
+ AH Y AO s n/a 4 527 663 752 N
+ AH Y AW e n/a 4 527 671 752 N
+ AH Y AW s n/a 4 527 663 752 N
+ AH Y AY e n/a 4 527 671 752 N
+ AH Y AY s n/a 4 527 663 752 N
+ AH Y B b n/a 4 530 647 726 N
+ AH Y B e n/a 4 530 647 738 N
+ AH Y B i n/a 4 530 647 726 N
+ AH Y B s n/a 4 530 647 726 N
+ AH Y CH b n/a 4 523 563 776 N
+ AH Y CH e n/a 4 523 563 776 N
+ AH Y CH i n/a 4 523 586 771 N
+ AH Y CH s n/a 4 523 563 776 N
+ AH Y D b n/a 4 523 563 772 N
+ AH Y D e n/a 4 523 563 775 N
+ AH Y D i n/a 4 522 563 773 N
+ AH Y D s n/a 4 523 563 772 N
+ AH Y DH b n/a 4 529 657 717 N
+ AH Y DH e n/a 4 527 655 738 N
+ AH Y DH i n/a 4 527 657 717 N
+ AH Y DH s n/a 4 527 657 717 N
+ AH Y EH e n/a 4 527 671 752 N
+ AH Y EH i n/a 4 527 658 752 N
+ AH Y EH s n/a 4 527 663 752 N
+ AH Y ER e n/a 4 527 671 752 N
+ AH Y ER s n/a 4 527 663 752 N
+ AH Y EY e n/a 4 527 671 752 N
+ AH Y EY i n/a 4 527 658 752 N
+ AH Y EY s n/a 4 527 663 752 N
+ AH Y F b n/a 4 530 658 743 N
+ AH Y F e n/a 4 530 671 745 N
+ AH Y F i n/a 4 530 658 743 N
+ AH Y F s n/a 4 530 662 743 N
+ AH Y G b n/a 4 523 567 792 N
+ AH Y G e n/a 4 523 567 791 N
+ AH Y G i n/a 4 522 581 791 N
+ AH Y G s n/a 4 523 567 791 N
+ AH Y HH b n/a 4 530 658 752 N
+ AH Y HH e n/a 4 527 671 752 N
+ AH Y HH i n/a 4 530 658 752 N
+ AH Y HH s n/a 4 530 664 753 N
+ AH Y IH e n/a 4 527 671 751 N
+ AH Y IH s n/a 4 527 663 751 N
+ AH Y IY e n/a 4 527 671 750 N
+ AH Y IY s n/a 4 527 663 750 N
+ AH Y JH b n/a 4 523 563 772 N
+ AH Y JH e n/a 4 523 563 775 N
+ AH Y JH s n/a 4 523 563 772 N
+ AH Y K b n/a 4 523 567 788 N
+ AH Y K e n/a 4 523 567 790 N
+ AH Y K i n/a 4 523 580 788 N
+ AH Y K s n/a 4 523 567 788 N
+ AH Y L b n/a 4 533 700 837 N
+ AH Y L e n/a 4 533 700 837 N
+ AH Y L i n/a 4 533 700 837 N
+ AH Y L s n/a 4 533 700 837 N
+ AH Y M b n/a 4 530 667 818 N
+ AH Y M e n/a 4 530 667 820 N
+ AH Y M i n/a 4 530 667 818 N
+ AH Y M s n/a 4 530 667 818 N
+ AH Y N b n/a 4 520 620 805 N
+ AH Y N e n/a 4 520 620 805 N
+ AH Y N i n/a 4 525 620 804 N
+ AH Y N s n/a 4 520 620 805 N
+ AH Y NG b n/a 4 529 605 816 N
+ AH Y NG e n/a 4 527 605 820 N
+ AH Y NG i n/a 4 529 605 816 N
+ AH Y NG s n/a 4 529 605 816 N
+ AH Y OW e n/a 4 527 671 752 N
+ AH Y OW s n/a 4 527 663 752 N
+ AH Y OY e n/a 4 527 671 752 N
+ AH Y OY s n/a 4 527 663 752 N
+ AH Y P b n/a 4 530 658 730 N
+ AH Y P e n/a 4 530 671 734 N
+ AH Y P i n/a 4 530 658 730 N
+ AH Y P s n/a 4 530 662 730 N
+ AH Y R b n/a 4 530 658 725 N
+ AH Y R e n/a 4 530 671 725 N
+ AH Y R i n/a 4 530 658 725 N
+ AH Y R s n/a 4 530 667 725 N
+ AH Y S b n/a 4 521 549 765 N
+ AH Y S e n/a 4 521 554 765 N
+ AH Y S i n/a 4 521 549 765 N
+ AH Y S s n/a 4 521 549 765 N
+ AH Y SH b n/a 4 530 549 764 N
+ AH Y SH e n/a 4 527 554 764 N
+ AH Y SH i n/a 4 530 549 764 N
+ AH Y SH s n/a 4 530 549 764 N
+ AH Y SIL e n/a 4 527 672 739 N
+ AH Y SIL s n/a 4 530 663 740 N
+ AH Y T b n/a 4 523 563 776 N
+ AH Y T e n/a 4 523 563 776 N
+ AH Y T i n/a 4 523 563 770 N
+ AH Y T s n/a 4 523 563 776 N
+ AH Y TH b n/a 4 530 658 743 N
+ AH Y TH e n/a 4 527 671 743 N
+ AH Y TH s n/a 4 530 662 743 N
+ AH Y UH e n/a 4 527 671 751 N
+ AH Y UH s n/a 4 527 663 751 N
+ AH Y UW e n/a 4 527 671 751 N
+ AH Y UW s n/a 4 527 663 751 N
+ AH Y V b n/a 4 530 645 722 N
+ AH Y V e n/a 4 530 645 738 N
+ AH Y V i n/a 4 530 645 722 N
+ AH Y V s n/a 4 530 645 722 N
+ AH Y W b n/a 4 532 701 840 N
+ AH Y W e n/a 4 532 701 840 N
+ AH Y W i n/a 4 533 701 839 N
+ AH Y W s n/a 4 532 701 840 N
+ AH Y Y b n/a 4 529 658 750 N
+ AH Y Y e n/a 4 527 671 750 N
+ AH Y Y i n/a 4 527 658 750 N
+ AH Y Y s n/a 4 527 663 750 N
+ AH Y Z b n/a 4 521 550 768 N
+ AH Y Z e n/a 4 521 554 768 N
+ AH Y Z i n/a 4 521 553 768 N
+ AH Y Z s n/a 4 521 553 768 N
+ AH Y ZH e n/a 4 527 554 768 N
+ AH Y ZH s n/a 4 527 553 768 N
+ AH Z AA e n/a 4 435 629 752 N
+ AH Z AA s n/a 4 425 651 752 N
+ AH Z AE e n/a 4 435 624 752 N
+ AH Z AE s n/a 4 425 651 752 N
+ AH Z AH e n/a 4 435 624 752 N
+ AH Z AH s n/a 4 425 651 752 N
+ AH Z AO e n/a 4 435 629 752 N
+ AH Z AO s n/a 4 425 651 752 N
+ AH Z AW e n/a 4 435 624 752 N
+ AH Z AW s n/a 4 425 651 752 N
+ AH Z AY e n/a 4 435 629 752 N
+ AH Z AY s n/a 4 425 651 752 N
+ AH Z B b n/a 4 450 650 726 N
+ AH Z B e n/a 4 452 634 738 N
+ AH Z B i n/a 4 450 652 727 N
+ AH Z B s n/a 4 450 650 726 N
+ AH Z CH b n/a 4 424 564 776 N
+ AH Z CH e n/a 4 435 564 776 N
+ AH Z CH i n/a 4 418 584 783 N
+ AH Z CH s n/a 4 424 564 776 N
+ AH Z D b n/a 4 410 564 772 N
+ AH Z D e n/a 4 435 564 775 N
+ AH Z D i n/a 4 406 583 785 N
+ AH Z D s n/a 4 406 564 772 N
+ AH Z DH b n/a 4 421 653 717 N
+ AH Z DH e n/a 4 435 624 738 N
+ AH Z DH s n/a 4 421 651 717 N
+ AH Z EH e n/a 4 435 624 752 N
+ AH Z EH s n/a 4 425 651 752 N
+ AH Z ER e n/a 4 435 629 752 N
+ AH Z ER s n/a 4 425 651 752 N
+ AH Z EY e n/a 4 435 624 752 N
+ AH Z EY s n/a 4 425 651 752 N
+ AH Z F b n/a 4 450 652 743 N
+ AH Z F e n/a 4 452 634 745 N
+ AH Z F i n/a 4 450 652 742 N
+ AH Z F s n/a 4 450 652 743 N
+ AH Z G b n/a 4 424 574 793 N
+ AH Z G e n/a 4 435 574 793 N
+ AH Z G i n/a 4 424 580 793 N
+ AH Z G s n/a 4 424 574 793 N
+ AH Z HH b n/a 4 425 651 753 N
+ AH Z HH e n/a 4 435 629 753 N
+ AH Z HH i n/a 4 418 651 753 N
+ AH Z HH s n/a 4 425 651 753 N
+ AH Z IH e n/a 4 435 624 751 N
+ AH Z IH s n/a 4 425 651 751 N
+ AH Z IY e n/a 4 435 624 750 N
+ AH Z IY s n/a 4 425 651 750 N
+ AH Z JH b n/a 4 424 564 772 N
+ AH Z JH e n/a 4 435 564 775 N
+ AH Z JH i n/a 4 415 577 783 N
+ AH Z JH s n/a 4 424 564 772 N
+ AH Z K b n/a 4 424 574 790 N
+ AH Z K e n/a 4 435 574 790 N
+ AH Z K i n/a 4 424 580 790 N
+ AH Z K s n/a 4 424 574 790 N
+ AH Z L b n/a 4 462 694 835 N
+ AH Z L e n/a 4 463 701 835 N
+ AH Z L i n/a 4 462 697 835 N
+ AH Z L s n/a 4 462 694 835 N
+ AH Z M b n/a 4 450 666 819 N
+ AH Z M e n/a 4 452 634 821 N
+ AH Z M i n/a 4 450 666 819 N
+ AH Z M s n/a 4 450 666 819 N
+ AH Z N b n/a 4 414 615 809 N
+ AH Z N e n/a 4 434 615 809 N
+ AH Z N i n/a 4 409 613 812 N
+ AH Z N s n/a 4 409 615 809 N
+ AH Z NG b n/a 4 425 616 816 N
+ AH Z NG e n/a 4 434 616 821 N
+ AH Z NG i n/a 4 425 613 816 N
+ AH Z NG s n/a 4 425 616 816 N
+ AH Z OW e n/a 4 435 629 752 N
+ AH Z OW s n/a 4 425 651 752 N
+ AH Z OY e n/a 4 435 629 752 N
+ AH Z OY s n/a 4 425 651 752 N
+ AH Z P b n/a 4 450 653 729 N
+ AH Z P e n/a 4 452 634 734 N
+ AH Z P i n/a 4 450 650 728 N
+ AH Z P s n/a 4 450 652 728 N
+ AH Z R b n/a 4 425 649 724 N
+ AH Z R e n/a 4 435 639 725 N
+ AH Z R i n/a 4 416 649 724 N
+ AH Z R s n/a 4 425 649 724 N
+ AH Z S b n/a 4 412 547 763 N
+ AH Z S e n/a 4 436 554 763 N
+ AH Z S i n/a 4 406 545 762 N
+ AH Z S s n/a 4 406 545 762 N
+ AH Z SH b n/a 4 424 548 764 N
+ AH Z SH e n/a 4 436 554 764 N
+ AH Z SH s n/a 4 424 545 762 N
+ AH Z SIL e n/a 4 435 624 740 N
+ AH Z SIL s n/a 4 425 651 740 N
+ AH Z T b n/a 4 410 564 776 N
+ AH Z T e n/a 4 435 564 776 N
+ AH Z T i n/a 4 406 577 783 N
+ AH Z T s n/a 4 406 564 776 N
+ AH Z TH b n/a 4 425 652 743 N
+ AH Z TH e n/a 4 435 624 743 N
+ AH Z TH i n/a 4 418 652 743 N
+ AH Z TH s n/a 4 425 652 743 N
+ AH Z UH e n/a 4 435 629 751 N
+ AH Z UH s n/a 4 425 651 751 N
+ AH Z UW e n/a 4 435 629 751 N
+ AH Z UW s n/a 4 425 651 751 N
+ AH Z V b n/a 4 450 648 723 N
+ AH Z V e n/a 4 452 634 738 N
+ AH Z V i n/a 4 450 649 723 N
+ AH Z V s n/a 4 450 649 723 N
+ AH Z W b n/a 4 462 696 840 N
+ AH Z W e n/a 4 463 701 840 N
+ AH Z W i n/a 4 462 697 839 N
+ AH Z W s n/a 4 462 696 840 N
+ AH Z Y b n/a 4 424 649 750 N
+ AH Z Y e n/a 4 435 624 750 N
+ AH Z Y s n/a 4 424 649 750 N
+ AH Z Z b n/a 4 412 544 768 N
+ AH Z Z e n/a 4 436 554 768 N
+ AH Z Z i n/a 4 406 544 768 N
+ AH Z Z s n/a 4 406 544 768 N
+ AH Z ZH e n/a 4 436 554 768 N
+ AH Z ZH s n/a 4 421 544 768 N
+ AH ZH AA e n/a 4 435 671 752 N
+ AH ZH AA s n/a 4 434 663 752 N
+ AH ZH AE e n/a 4 435 671 752 N
+ AH ZH AE s n/a 4 434 663 752 N
+ AH ZH AH e n/a 4 435 671 752 N
+ AH ZH AH s n/a 4 434 663 752 N
+ AH ZH AO e n/a 4 435 671 752 N
+ AH ZH AO s n/a 4 434 663 752 N
+ AH ZH AW e n/a 4 435 671 752 N
+ AH ZH AW s n/a 4 434 663 752 N
+ AH ZH AY e n/a 4 435 671 752 N
+ AH ZH AY s n/a 4 434 663 752 N
+ AH ZH B b n/a 4 444 650 726 N
+ AH ZH B e n/a 4 452 650 738 N
+ AH ZH B i n/a 4 444 652 726 N
+ AH ZH B s n/a 4 444 650 726 N
+ AH ZH CH b n/a 4 434 564 776 N
+ AH ZH CH e n/a 4 435 564 776 N
+ AH ZH CH s n/a 4 434 564 776 N
+ AH ZH D b n/a 4 434 564 772 N
+ AH ZH D e n/a 4 435 564 775 N
+ AH ZH D i n/a 4 435 583 785 N
+ AH ZH D s n/a 4 434 564 772 N
+ AH ZH DH b n/a 4 435 656 717 N
+ AH ZH DH e n/a 4 435 655 738 N
+ AH ZH DH s n/a 4 435 656 717 N
+ AH ZH EH e n/a 4 435 671 752 N
+ AH ZH EH s n/a 4 434 663 752 N
+ AH ZH ER e n/a 4 435 671 752 N
+ AH ZH ER s n/a 4 434 663 752 N
+ AH ZH EY e n/a 4 435 671 752 N
+ AH ZH EY s n/a 4 434 663 752 N
+ AH ZH F b n/a 4 444 658 742 N
+ AH ZH F e n/a 4 452 671 745 N
+ AH ZH F i n/a 4 444 658 742 N
+ AH ZH F s n/a 4 444 662 742 N
+ AH ZH G b n/a 4 434 567 793 N
+ AH ZH G e n/a 4 435 569 791 N
+ AH ZH G s n/a 4 434 569 791 N
+ AH ZH HH b n/a 4 434 658 753 N
+ AH ZH HH e n/a 4 435 671 753 N
+ AH ZH HH i n/a 4 435 658 753 N
+ AH ZH HH s n/a 4 434 664 753 N
+ AH ZH IH e n/a 4 435 671 751 N
+ AH ZH IH s n/a 4 434 663 751 N
+ AH ZH IY e n/a 4 435 671 750 N
+ AH ZH IY s n/a 4 434 663 750 N
+ AH ZH JH b n/a 4 434 564 772 N
+ AH ZH JH e n/a 4 435 564 775 N
+ AH ZH JH s n/a 4 434 564 772 N
+ AH ZH K b n/a 4 434 569 790 N
+ AH ZH K e n/a 4 435 569 790 N
+ AH ZH K i n/a 4 435 580 790 N
+ AH ZH K s n/a 4 434 569 790 N
+ AH ZH L b n/a 4 462 694 835 N
+ AH ZH L e n/a 4 463 701 835 N
+ AH ZH L i n/a 4 462 699 834 N
+ AH ZH L s n/a 4 462 694 835 N
+ AH ZH M b n/a 4 444 665 819 N
+ AH ZH M e n/a 4 452 665 821 N
+ AH ZH M i n/a 4 444 665 817 N
+ AH ZH M s n/a 4 444 665 819 N
+ AH ZH N b n/a 4 434 618 803 N
+ AH ZH N e n/a 4 434 617 803 N
+ AH ZH N i n/a 4 434 617 803 N
+ AH ZH N s n/a 4 434 617 803 N
+ AH ZH NG b n/a 4 434 605 816 N
+ AH ZH NG e n/a 4 434 605 821 N
+ AH ZH NG s n/a 4 434 605 816 N
+ AH ZH OW e n/a 4 435 671 752 N
+ AH ZH OW s n/a 4 434 663 752 N
+ AH ZH OY e n/a 4 435 671 752 N
+ AH ZH OY s n/a 4 434 663 752 N
+ AH ZH P b n/a 4 444 655 730 N
+ AH ZH P e n/a 4 452 671 734 N
+ AH ZH P s n/a 4 444 662 730 N
+ AH ZH R b n/a 4 434 658 725 N
+ AH ZH R e n/a 4 435 671 725 N
+ AH ZH R s n/a 4 434 667 725 N
+ AH ZH S b n/a 4 436 547 760 N
+ AH ZH S e n/a 4 436 554 763 N
+ AH ZH S i n/a 4 436 546 760 N
+ AH ZH S s n/a 4 436 546 760 N
+ AH ZH SH b n/a 4 436 548 754 N
+ AH ZH SH e n/a 4 436 554 764 N
+ AH ZH SH s n/a 4 436 546 754 N
+ AH ZH SIL e n/a 4 435 672 739 N
+ AH ZH SIL s n/a 4 434 663 740 N
+ AH ZH T b n/a 4 434 564 776 N
+ AH ZH T e n/a 4 435 564 776 N
+ AH ZH T s n/a 4 434 564 776 N
+ AH ZH TH b n/a 4 434 658 743 N
+ AH ZH TH e n/a 4 435 671 743 N
+ AH ZH TH s n/a 4 434 662 743 N
+ AH ZH UH e n/a 4 435 671 751 N
+ AH ZH UH s n/a 4 434 663 751 N
+ AH ZH UW e n/a 4 435 671 751 N
+ AH ZH UW s n/a 4 434 663 751 N
+ AH ZH V b n/a 4 444 648 723 N
+ AH ZH V e n/a 4 452 648 738 N
+ AH ZH V s n/a 4 444 648 723 N
+ AH ZH W b n/a 4 462 696 840 N
+ AH ZH W e n/a 4 463 701 840 N
+ AH ZH W i n/a 4 462 699 839 N
+ AH ZH W s n/a 4 462 696 840 N
+ AH ZH Y b n/a 4 434 658 750 N
+ AH ZH Y e n/a 4 435 671 750 N
+ AH ZH Y s n/a 4 434 663 750 N
+ AH ZH Z b n/a 4 436 544 768 N
+ AH ZH Z e n/a 4 436 554 768 N
+ AH ZH Z i n/a 4 436 544 768 N
+ AH ZH Z s n/a 4 436 544 768 N
+ AH ZH ZH e n/a 4 436 554 768 N
+ AH ZH ZH s n/a 4 436 544 768 N
+ AO AA AA s n/a 5 847 898 918 N
+ AO AA AE s n/a 5 847 881 918 N
+ AO AA AH s n/a 5 847 881 918 N
+ AO AA AO s n/a 5 847 898 918 N
+ AO AA AW s n/a 5 847 881 918 N
+ AO AA AY s n/a 5 847 898 918 N
+ AO AA B b n/a 5 847 887 922 N
+ AO AA B s n/a 5 847 887 922 N
+ AO AA CH b n/a 5 847 881 919 N
+ AO AA CH s n/a 5 847 881 919 N
+ AO AA D b n/a 5 847 881 914 N
+ AO AA D s n/a 5 847 881 914 N
+ AO AA DH s n/a 5 847 881 920 N
+ AO AA EH b n/a 5 847 881 918 N
+ AO AA EH s n/a 5 847 881 918 N
+ AO AA ER s n/a 5 876 912 936 N
+ AO AA EY s n/a 5 847 881 918 N
+ AO AA F b n/a 5 847 887 922 N
+ AO AA F s n/a 5 847 887 922 N
+ AO AA G b n/a 5 847 881 920 N
+ AO AA G i n/a 5 848 881 920 N
+ AO AA G s n/a 5 847 881 920 N
+ AO AA HH s n/a 5 847 881 919 N
+ AO AA IH s n/a 5 847 881 916 N
+ AO AA IY b n/a 5 847 881 916 N
+ AO AA IY s n/a 5 847 881 916 N
+ AO AA JH b n/a 5 847 881 920 N
+ AO AA JH s n/a 5 847 881 920 N
+ AO AA K b n/a 5 847 886 919 N
+ AO AA K s n/a 5 847 886 919 N
+ AO AA L b n/a 5 847 898 929 N
+ AO AA L s n/a 5 847 898 928 N
+ AO AA M b n/a 5 847 890 926 N
+ AO AA M s n/a 5 847 894 926 N
+ AO AA N b n/a 5 847 890 924 N
+ AO AA N s n/a 5 847 894 924 N
+ AO AA NG b n/a 5 847 894 926 N
+ AO AA NG s n/a 5 847 894 926 N
+ AO AA OW s n/a 5 847 898 918 N
+ AO AA OY s n/a 5 847 898 918 N
+ AO AA P b n/a 5 847 887 922 N
+ AO AA P s n/a 5 847 887 922 N
+ AO AA R b n/a 5 876 912 936 N
+ AO AA R i n/a 5 876 907 934 N
+ AO AA R s n/a 5 876 912 936 N
+ AO AA S b n/a 5 847 881 921 N
+ AO AA S s n/a 5 847 881 921 N
+ AO AA SH b n/a 5 847 881 919 N
+ AO AA SH s n/a 5 847 881 919 N
+ AO AA SIL s n/a 5 847 881 918 N
+ AO AA T b n/a 5 847 886 914 N
+ AO AA T s n/a 5 847 886 914 N
+ AO AA TH b n/a 5 847 881 921 N
+ AO AA TH s n/a 5 847 881 921 N
+ AO AA UH s n/a 5 847 898 916 N
+ AO AA UW s n/a 5 847 898 916 N
+ AO AA V s n/a 5 847 887 922 N
+ AO AA W s n/a 5 847 898 928 N
+ AO AA Y s n/a 5 847 881 916 N
+ AO AA Z b n/a 5 847 881 915 N
+ AO AA Z s n/a 5 847 881 915 N
+ AO AA ZH s n/a 5 847 881 920 N
+ AO AE AA s n/a 5 857 899 918 N
+ AO AE AE s n/a 5 857 881 918 N
+ AO AE AH s n/a 5 857 881 918 N
+ AO AE AO s n/a 5 857 899 918 N
+ AO AE AW s n/a 5 857 881 918 N
+ AO AE AY s n/a 5 857 899 918 N
+ AO AE B b n/a 5 855 887 922 N
+ AO AE B s n/a 5 857 887 922 N
+ AO AE CH b n/a 5 855 881 919 N
+ AO AE CH s n/a 5 857 881 919 N
+ AO AE D b n/a 5 855 881 914 N
+ AO AE D s n/a 5 857 881 914 N
+ AO AE DH s n/a 5 857 881 920 N
+ AO AE EH b n/a 5 855 881 918 N
+ AO AE EH s n/a 5 857 881 918 N
+ AO AE ER s n/a 5 871 911 936 N
+ AO AE EY s n/a 5 857 881 918 N
+ AO AE F b n/a 5 855 887 922 N
+ AO AE F s n/a 5 857 887 922 N
+ AO AE G b n/a 5 855 881 920 N
+ AO AE G s n/a 5 857 881 920 N
+ AO AE HH s n/a 5 857 881 919 N
+ AO AE IH s n/a 5 857 881 916 N
+ AO AE IY b n/a 5 855 881 916 N
+ AO AE IY s n/a 5 857 881 916 N
+ AO AE JH b n/a 5 855 881 920 N
+ AO AE JH s n/a 5 857 881 920 N
+ AO AE K b n/a 5 855 886 919 N
+ AO AE K s n/a 5 857 886 919 N
+ AO AE L b n/a 5 855 897 929 N
+ AO AE L i n/a 5 857 899 928 N
+ AO AE L s n/a 5 857 899 928 N
+ AO AE M b n/a 5 855 890 926 N
+ AO AE M s n/a 5 857 894 926 N
+ AO AE N b n/a 5 855 890 924 N
+ AO AE N s n/a 5 857 894 924 N
+ AO AE NG b n/a 5 855 894 926 N
+ AO AE NG s n/a 5 857 894 926 N
+ AO AE OW s n/a 5 857 899 918 N
+ AO AE OY s n/a 5 857 899 918 N
+ AO AE P b n/a 5 855 887 922 N
+ AO AE P s n/a 5 857 887 922 N
+ AO AE R b n/a 5 869 911 936 N
+ AO AE R s n/a 5 871 911 936 N
+ AO AE S b n/a 5 855 881 921 N
+ AO AE S s n/a 5 857 881 921 N
+ AO AE SH b n/a 5 855 881 919 N
+ AO AE SH s n/a 5 857 881 919 N
+ AO AE SIL s n/a 5 857 881 918 N
+ AO AE T b n/a 5 855 886 914 N
+ AO AE T i n/a 5 857 886 914 N
+ AO AE T s n/a 5 857 886 914 N
+ AO AE TH b n/a 5 855 881 921 N
+ AO AE TH s n/a 5 857 881 921 N
+ AO AE UH s n/a 5 857 899 916 N
+ AO AE UW s n/a 5 857 899 916 N
+ AO AE V s n/a 5 857 887 922 N
+ AO AE W s n/a 5 857 899 928 N
+ AO AE Y s n/a 5 857 881 916 N
+ AO AE Z b n/a 5 855 881 915 N
+ AO AE Z s n/a 5 857 881 915 N
+ AO AE ZH s n/a 5 857 881 920 N
+ AO AH AA s n/a 5 857 899 918 N
+ AO AH AE s n/a 5 857 881 918 N
+ AO AH AH s n/a 5 857 881 918 N
+ AO AH AO s n/a 5 857 899 918 N
+ AO AH AW s n/a 5 857 881 918 N
+ AO AH AY s n/a 5 857 899 918 N
+ AO AH B b n/a 5 852 887 922 N
+ AO AH B s n/a 5 857 887 922 N
+ AO AH CH b n/a 5 852 881 919 N
+ AO AH CH s n/a 5 857 881 919 N
+ AO AH D b n/a 5 852 881 914 N
+ AO AH D s n/a 5 857 881 914 N
+ AO AH DH s n/a 5 857 881 920 N
+ AO AH EH b n/a 5 852 881 918 N
+ AO AH EH s n/a 5 857 881 918 N
+ AO AH ER s n/a 5 869 911 936 N
+ AO AH EY s n/a 5 857 881 918 N
+ AO AH F b n/a 5 852 887 922 N
+ AO AH F s n/a 5 857 887 922 N
+ AO AH G b n/a 5 852 881 920 N
+ AO AH G s n/a 5 857 881 920 N
+ AO AH HH s n/a 5 857 881 919 N
+ AO AH IH s n/a 5 857 881 916 N
+ AO AH IY b n/a 5 852 881 916 N
+ AO AH IY s n/a 5 857 881 916 N
+ AO AH JH b n/a 5 852 881 920 N
+ AO AH JH s n/a 5 857 881 920 N
+ AO AH K b n/a 5 852 886 919 N
+ AO AH K s n/a 5 857 886 919 N
+ AO AH L b n/a 5 852 897 929 N
+ AO AH L s n/a 5 857 899 928 N
+ AO AH M b n/a 5 852 890 926 N
+ AO AH M s n/a 5 857 894 926 N
+ AO AH N b n/a 5 852 890 924 N
+ AO AH N s n/a 5 857 894 924 N
+ AO AH NG b n/a 5 852 894 926 N
+ AO AH NG s n/a 5 857 894 926 N
+ AO AH OW s n/a 5 857 899 918 N
+ AO AH OY s n/a 5 857 899 918 N
+ AO AH P b n/a 5 852 887 922 N
+ AO AH P i n/a 5 857 887 922 N
+ AO AH P s n/a 5 857 887 922 N
+ AO AH R b n/a 5 869 911 936 N
+ AO AH R i n/a 5 869 907 935 N
+ AO AH R s n/a 5 869 911 936 N
+ AO AH S b n/a 5 852 881 921 N
+ AO AH S s n/a 5 857 881 921 N
+ AO AH SH b n/a 5 852 881 919 N
+ AO AH SH s n/a 5 857 881 919 N
+ AO AH SIL s n/a 5 857 881 918 N
+ AO AH T b n/a 5 852 886 914 N
+ AO AH T s n/a 5 857 886 914 N
+ AO AH TH b n/a 5 852 881 921 N
+ AO AH TH s n/a 5 857 881 921 N
+ AO AH UH s n/a 5 857 899 916 N
+ AO AH UW s n/a 5 857 899 916 N
+ AO AH V s n/a 5 857 887 922 N
+ AO AH W s n/a 5 857 899 928 N
+ AO AH Y s n/a 5 857 881 916 N
+ AO AH Z b n/a 5 852 881 915 N
+ AO AH Z s n/a 5 857 881 915 N
+ AO AH ZH s n/a 5 857 881 920 N
+ AO AO AA s n/a 5 847 898 918 N
+ AO AO AE s n/a 5 847 881 918 N
+ AO AO AH s n/a 5 847 881 918 N
+ AO AO AO s n/a 5 847 898 918 N
+ AO AO AW s n/a 5 847 881 918 N
+ AO AO AY s n/a 5 847 898 918 N
+ AO AO B b n/a 5 847 887 922 N
+ AO AO B s n/a 5 847 887 922 N
+ AO AO CH b n/a 5 847 881 919 N
+ AO AO CH s n/a 5 847 881 919 N
+ AO AO D b n/a 5 847 881 914 N
+ AO AO D s n/a 5 847 881 914 N
+ AO AO DH s n/a 5 847 881 920 N
+ AO AO EH b n/a 5 847 881 918 N
+ AO AO EH s n/a 5 847 881 918 N
+ AO AO ER s n/a 5 876 913 936 N
+ AO AO EY s n/a 5 847 881 918 N
+ AO AO F b n/a 5 847 887 922 N
+ AO AO F s n/a 5 847 887 922 N
+ AO AO G b n/a 5 847 881 920 N
+ AO AO G s n/a 5 847 881 920 N
+ AO AO HH s n/a 5 847 881 919 N
+ AO AO IH s n/a 5 847 881 916 N
+ AO AO IY b n/a 5 847 881 916 N
+ AO AO IY s n/a 5 847 881 916 N
+ AO AO JH b n/a 5 847 881 920 N
+ AO AO JH s n/a 5 847 881 920 N
+ AO AO K b n/a 5 847 886 919 N
+ AO AO K s n/a 5 847 886 919 N
+ AO AO L b n/a 5 847 898 929 N
+ AO AO L s n/a 5 847 898 928 N
+ AO AO M b n/a 5 847 890 926 N
+ AO AO M s n/a 5 847 894 926 N
+ AO AO N b n/a 5 847 890 924 N
+ AO AO N s n/a 5 847 894 924 N
+ AO AO NG b n/a 5 847 894 926 N
+ AO AO NG s n/a 5 847 894 926 N
+ AO AO OW s n/a 5 847 898 918 N
+ AO AO OY s n/a 5 847 898 918 N
+ AO AO P b n/a 5 847 887 922 N
+ AO AO P s n/a 5 847 887 922 N
+ AO AO R b n/a 5 876 913 936 N
+ AO AO R s n/a 5 876 913 936 N
+ AO AO S b n/a 5 847 881 921 N
+ AO AO S s n/a 5 847 881 921 N
+ AO AO SH b n/a 5 847 881 919 N
+ AO AO SH s n/a 5 847 881 919 N
+ AO AO SIL s n/a 5 847 881 918 N
+ AO AO T b n/a 5 847 886 914 N
+ AO AO T s n/a 5 847 886 914 N
+ AO AO TH b n/a 5 847 881 921 N
+ AO AO TH s n/a 5 847 881 921 N
+ AO AO UH s n/a 5 847 898 916 N
+ AO AO UW s n/a 5 847 898 916 N
+ AO AO V s n/a 5 847 887 922 N
+ AO AO W s n/a 5 847 898 928 N
+ AO AO Y s n/a 5 847 881 916 N
+ AO AO Z b n/a 5 847 881 915 N
+ AO AO Z s n/a 5 847 881 915 N
+ AO AO ZH s n/a 5 847 881 920 N
+ AO AW AA s n/a 5 847 898 918 N
+ AO AW AE s n/a 5 847 881 918 N
+ AO AW AH s n/a 5 847 881 918 N
+ AO AW AO s n/a 5 847 898 918 N
+ AO AW AW s n/a 5 847 881 918 N
+ AO AW AY s n/a 5 847 898 918 N
+ AO AW B b n/a 5 847 887 922 N
+ AO AW B s n/a 5 847 887 922 N
+ AO AW CH b n/a 5 847 881 919 N
+ AO AW CH s n/a 5 847 881 919 N
+ AO AW D b n/a 5 847 881 917 N
+ AO AW D s n/a 5 847 881 917 N
+ AO AW DH s n/a 5 847 881 920 N
+ AO AW EH b n/a 5 847 881 918 N
+ AO AW EH s n/a 5 847 881 918 N
+ AO AW ER s n/a 5 876 912 936 N
+ AO AW EY s n/a 5 847 881 918 N
+ AO AW F b n/a 5 847 887 922 N
+ AO AW F s n/a 5 847 887 922 N
+ AO AW G b n/a 5 847 881 920 N
+ AO AW G s n/a 5 847 881 920 N
+ AO AW HH s n/a 5 847 881 919 N
+ AO AW IH s n/a 5 847 881 916 N
+ AO AW IY b n/a 5 847 881 916 N
+ AO AW IY s n/a 5 847 881 916 N
+ AO AW JH b n/a 5 847 881 920 N
+ AO AW JH s n/a 5 847 881 920 N
+ AO AW K b n/a 5 847 886 919 N
+ AO AW K s n/a 5 847 886 919 N
+ AO AW L b n/a 5 847 898 929 N
+ AO AW L i n/a 5 848 898 928 N
+ AO AW L s n/a 5 847 898 928 N
+ AO AW M b n/a 5 847 893 926 N
+ AO AW M s n/a 5 847 893 926 N
+ AO AW N b n/a 5 847 893 925 N
+ AO AW N s n/a 5 847 893 925 N
+ AO AW NG b n/a 5 847 893 926 N
+ AO AW NG s n/a 5 847 893 926 N
+ AO AW OW s n/a 5 847 898 918 N
+ AO AW OY s n/a 5 847 898 918 N
+ AO AW P b n/a 5 847 887 922 N
+ AO AW P s n/a 5 847 887 922 N
+ AO AW R b n/a 5 876 912 936 N
+ AO AW R s n/a 5 876 912 936 N
+ AO AW S b n/a 5 847 881 921 N
+ AO AW S s n/a 5 847 881 921 N
+ AO AW SH b n/a 5 847 881 919 N
+ AO AW SH s n/a 5 847 881 919 N
+ AO AW SIL s n/a 5 847 881 918 N
+ AO AW T b n/a 5 847 886 917 N
+ AO AW T s n/a 5 847 886 917 N
+ AO AW TH b n/a 5 847 881 921 N
+ AO AW TH s n/a 5 847 881 921 N
+ AO AW UH s n/a 5 847 898 916 N
+ AO AW UW s n/a 5 847 898 916 N
+ AO AW V s n/a 5 847 887 922 N
+ AO AW W s n/a 5 847 898 928 N
+ AO AW Y s n/a 5 847 881 916 N
+ AO AW Z b n/a 5 847 881 915 N
+ AO AW Z s n/a 5 847 881 915 N
+ AO AW ZH s n/a 5 847 881 920 N
+ AO AY AA s n/a 5 857 899 918 N
+ AO AY AE s n/a 5 857 881 918 N
+ AO AY AH s n/a 5 857 881 918 N
+ AO AY AO s n/a 5 857 899 918 N
+ AO AY AW s n/a 5 857 881 918 N
+ AO AY AY s n/a 5 857 899 918 N
+ AO AY B b n/a 5 855 887 922 N
+ AO AY B s n/a 5 857 887 922 N
+ AO AY CH b n/a 5 855 881 919 N
+ AO AY CH s n/a 5 857 881 919 N
+ AO AY D b n/a 5 855 881 914 N
+ AO AY D s n/a 5 857 881 914 N
+ AO AY DH s n/a 5 857 881 920 N
+ AO AY EH b n/a 5 855 881 918 N
+ AO AY EH s n/a 5 857 881 918 N
+ AO AY ER s n/a 5 871 911 936 N
+ AO AY EY s n/a 5 857 881 918 N
+ AO AY F b n/a 5 855 887 922 N
+ AO AY F s n/a 5 857 887 922 N
+ AO AY G b n/a 5 855 881 920 N
+ AO AY G s n/a 5 857 881 920 N
+ AO AY HH s n/a 5 857 881 919 N
+ AO AY IH s n/a 5 857 881 916 N
+ AO AY IY b n/a 5 855 881 916 N
+ AO AY IY s n/a 5 857 881 916 N
+ AO AY JH b n/a 5 855 881 920 N
+ AO AY JH s n/a 5 857 881 920 N
+ AO AY K b n/a 5 855 886 919 N
+ AO AY K s n/a 5 857 886 919 N
+ AO AY L b n/a 5 855 897 930 N
+ AO AY L s n/a 5 857 899 928 N
+ AO AY M b n/a 5 855 890 926 N
+ AO AY M s n/a 5 857 894 926 N
+ AO AY N b n/a 5 855 890 924 N
+ AO AY N i n/a 5 857 894 924 N
+ AO AY N s n/a 5 857 894 924 N
+ AO AY NG b n/a 5 855 894 926 N
+ AO AY NG s n/a 5 857 894 926 N
+ AO AY OW s n/a 5 857 899 918 N
+ AO AY OY s n/a 5 857 899 918 N
+ AO AY P b n/a 5 855 887 922 N
+ AO AY P s n/a 5 857 887 922 N
+ AO AY R b n/a 5 869 911 936 N
+ AO AY R i n/a 5 871 907 934 N
+ AO AY R s n/a 5 871 911 936 N
+ AO AY S b n/a 5 855 881 921 N
+ AO AY S i n/a 5 857 881 921 N
+ AO AY S s n/a 5 857 881 921 N
+ AO AY SH b n/a 5 855 881 919 N
+ AO AY SH s n/a 5 857 881 919 N
+ AO AY SIL s n/a 5 857 881 918 N
+ AO AY T b n/a 5 855 886 914 N
+ AO AY T i n/a 5 857 886 914 N
+ AO AY T s n/a 5 857 886 914 N
+ AO AY TH b n/a 5 855 881 921 N
+ AO AY TH s n/a 5 857 881 921 N
+ AO AY UH s n/a 5 857 899 916 N
+ AO AY UW s n/a 5 857 899 916 N
+ AO AY V s n/a 5 857 887 922 N
+ AO AY W s n/a 5 857 899 928 N
+ AO AY Y s n/a 5 857 881 916 N
+ AO AY Z b n/a 5 855 881 915 N
+ AO AY Z s n/a 5 857 881 915 N
+ AO AY ZH s n/a 5 857 881 920 N
+ AO B AA e n/a 5 847 900 918 N
+ AO B AA s n/a 5 847 900 918 N
+ AO B AE e n/a 5 847 881 918 N
+ AO B AE s n/a 5 847 881 918 N
+ AO B AH e n/a 5 847 881 918 N
+ AO B AH i n/a 5 848 881 918 N
+ AO B AH s n/a 5 847 881 918 N
+ AO B AO e n/a 5 847 900 918 N
+ AO B AO s n/a 5 847 900 918 N
+ AO B AW e n/a 5 847 881 918 N
+ AO B AW s n/a 5 847 881 918 N
+ AO B AY e n/a 5 847 900 918 N
+ AO B AY s n/a 5 847 900 918 N
+ AO B B b n/a 5 859 887 922 N
+ AO B B e n/a 5 847 887 922 N
+ AO B B i n/a 5 848 887 922 N
+ AO B B s n/a 5 847 887 922 N
+ AO B CH b n/a 5 859 881 919 N
+ AO B CH e n/a 5 847 881 919 N
+ AO B CH i n/a 5 848 881 919 N
+ AO B CH s n/a 5 847 881 919 N
+ AO B D b n/a 5 859 881 914 N
+ AO B D e n/a 5 847 881 914 N
+ AO B D i n/a 5 848 881 914 N
+ AO B D s n/a 5 847 881 914 N
+ AO B DH e n/a 5 847 881 920 N
+ AO B DH s n/a 5 847 881 920 N
+ AO B EH b n/a 5 859 881 918 N
+ AO B EH e n/a 5 847 881 918 N
+ AO B EH s n/a 5 847 881 918 N
+ AO B ER e n/a 5 875 905 932 N
+ AO B ER i n/a 5 875 905 932 N
+ AO B ER s n/a 5 875 905 932 N
+ AO B EY e n/a 5 847 881 918 N
+ AO B EY s n/a 5 847 881 918 N
+ AO B F b n/a 5 859 887 922 N
+ AO B F e n/a 5 847 887 922 N
+ AO B F i n/a 5 848 887 922 N
+ AO B F s n/a 5 847 887 922 N
+ AO B G b n/a 5 859 881 920 N
+ AO B G e n/a 5 847 881 920 N
+ AO B G i n/a 5 848 881 920 N
+ AO B G s n/a 5 847 881 920 N
+ AO B HH e n/a 5 847 881 919 N
+ AO B HH s n/a 5 847 881 919 N
+ AO B IH e n/a 5 847 881 916 N
+ AO B IH s n/a 5 847 881 916 N
+ AO B IY b n/a 5 859 881 916 N
+ AO B IY e n/a 5 847 881 916 N
+ AO B IY s n/a 5 847 881 916 N
+ AO B JH b n/a 5 859 881 920 N
+ AO B JH e n/a 5 847 881 920 N
+ AO B JH i n/a 5 848 881 920 N
+ AO B JH s n/a 5 847 881 920 N
+ AO B K b n/a 5 859 886 919 N
+ AO B K e n/a 5 847 886 919 N
+ AO B K i n/a 5 848 886 919 N
+ AO B K s n/a 5 847 886 919 N
+ AO B L b n/a 5 859 900 929 N
+ AO B L e n/a 5 847 900 928 N
+ AO B L i n/a 5 848 900 928 N
+ AO B L s n/a 5 847 900 928 N
+ AO B M b n/a 5 859 890 926 N
+ AO B M e n/a 5 847 894 926 N
+ AO B M i n/a 5 848 894 926 N
+ AO B M s n/a 5 847 894 926 N
+ AO B N b n/a 5 859 890 924 N
+ AO B N e n/a 5 847 894 923 N
+ AO B N i n/a 5 848 894 923 N
+ AO B N s n/a 5 847 894 923 N
+ AO B NG b n/a 5 859 894 926 N
+ AO B NG e n/a 5 847 894 926 N
+ AO B NG i n/a 5 848 894 926 N
+ AO B NG s n/a 5 847 894 926 N
+ AO B OW e n/a 5 847 900 918 N
+ AO B OW s n/a 5 847 900 918 N
+ AO B OY e n/a 5 847 900 918 N
+ AO B OY s n/a 5 847 900 918 N
+ AO B P b n/a 5 859 887 922 N
+ AO B P e n/a 5 847 887 922 N
+ AO B P i n/a 5 848 887 922 N
+ AO B P s n/a 5 847 887 922 N
+ AO B R b n/a 5 875 905 932 N
+ AO B R e n/a 5 875 905 932 N
+ AO B R i n/a 5 875 905 932 N
+ AO B R s n/a 5 875 905 932 N
+ AO B S b n/a 5 859 881 921 N
+ AO B S e n/a 5 847 881 921 N
+ AO B S i n/a 5 848 881 921 N
+ AO B S s n/a 5 847 881 921 N
+ AO B SH b n/a 5 859 881 919 N
+ AO B SH e n/a 5 847 881 919 N
+ AO B SH i n/a 5 848 881 919 N
+ AO B SH s n/a 5 847 881 919 N
+ AO B SIL e n/a 5 847 881 918 N
+ AO B SIL s n/a 5 847 881 918 N
+ AO B T b n/a 5 859 886 914 N
+ AO B T e n/a 5 847 886 914 N
+ AO B T i n/a 5 848 886 914 N
+ AO B T s n/a 5 847 886 914 N
+ AO B TH b n/a 5 859 881 921 N
+ AO B TH e n/a 5 847 881 921 N
+ AO B TH i n/a 5 848 881 921 N
+ AO B TH s n/a 5 847 881 921 N
+ AO B UH e n/a 5 847 900 916 N
+ AO B UH s n/a 5 847 900 916 N
+ AO B UW e n/a 5 847 900 916 N
+ AO B UW s n/a 5 847 900 916 N
+ AO B V e n/a 5 847 887 922 N
+ AO B V i n/a 5 848 887 922 N
+ AO B V s n/a 5 847 887 922 N
+ AO B W e n/a 5 847 900 928 N
+ AO B W s n/a 5 847 900 928 N
+ AO B Y e n/a 5 847 881 916 N
+ AO B Y i n/a 5 848 881 916 N
+ AO B Y s n/a 5 847 881 916 N
+ AO B Z b n/a 5 859 881 915 N
+ AO B Z e n/a 5 847 881 915 N
+ AO B Z i n/a 5 848 881 915 N
+ AO B Z s n/a 5 847 881 915 N
+ AO B ZH e n/a 5 847 881 920 N
+ AO B ZH s n/a 5 847 881 920 N
+ AO CH AA e n/a 5 858 899 918 N
+ AO CH AA s n/a 5 858 899 918 N
+ AO CH AE e n/a 5 858 881 918 N
+ AO CH AE s n/a 5 858 881 918 N
+ AO CH AH e n/a 5 858 881 918 N
+ AO CH AH s n/a 5 858 881 918 N
+ AO CH AO e n/a 5 858 899 918 N
+ AO CH AO s n/a 5 858 899 918 N
+ AO CH AW e n/a 5 858 881 918 N
+ AO CH AW s n/a 5 858 881 918 N
+ AO CH AY e n/a 5 858 899 918 N
+ AO CH AY s n/a 5 858 899 918 N
+ AO CH B b n/a 5 854 887 922 N
+ AO CH B e n/a 5 858 887 922 N
+ AO CH B s n/a 5 858 887 922 N
+ AO CH CH b n/a 5 853 881 919 N
+ AO CH CH e n/a 5 858 881 919 N
+ AO CH CH i n/a 5 858 881 919 N
+ AO CH CH s n/a 5 858 881 919 N
+ AO CH D b n/a 5 853 881 914 N
+ AO CH D e n/a 5 858 881 914 N
+ AO CH D i n/a 5 858 881 914 N
+ AO CH D s n/a 5 858 881 914 N
+ AO CH DH e n/a 5 858 881 920 N
+ AO CH DH s n/a 5 858 881 920 N
+ AO CH EH b n/a 5 853 881 918 N
+ AO CH EH e n/a 5 858 881 918 N
+ AO CH EH s n/a 5 858 881 918 N
+ AO CH ER e n/a 5 870 911 936 N
+ AO CH ER s n/a 5 870 911 936 N
+ AO CH EY e n/a 5 858 881 918 N
+ AO CH EY s n/a 5 858 881 918 N
+ AO CH F b n/a 5 854 887 922 N
+ AO CH F e n/a 5 858 887 922 N
+ AO CH F i n/a 5 858 887 922 N
+ AO CH F s n/a 5 858 887 922 N
+ AO CH G b n/a 5 853 881 920 N
+ AO CH G e n/a 5 858 881 920 N
+ AO CH G s n/a 5 858 881 920 N
+ AO CH HH e n/a 5 858 881 919 N
+ AO CH HH s n/a 5 858 881 919 N
+ AO CH IH e n/a 5 858 881 916 N
+ AO CH IH i n/a 5 858 881 916 N
+ AO CH IH s n/a 5 858 881 916 N
+ AO CH IY b n/a 5 853 881 916 N
+ AO CH IY e n/a 5 858 881 916 N
+ AO CH IY s n/a 5 858 881 916 N
+ AO CH JH b n/a 5 853 881 920 N
+ AO CH JH e n/a 5 858 881 920 N
+ AO CH JH s n/a 5 858 881 920 N
+ AO CH K b n/a 5 853 886 919 N
+ AO CH K e n/a 5 858 886 919 N
+ AO CH K i n/a 5 858 886 919 N
+ AO CH K s n/a 5 858 886 919 N
+ AO CH L b n/a 5 853 897 929 N
+ AO CH L e n/a 5 858 899 928 N
+ AO CH L i n/a 5 858 899 928 N
+ AO CH L s n/a 5 858 899 928 N
+ AO CH M b n/a 5 851 890 926 N
+ AO CH M e n/a 5 858 894 926 N
+ AO CH M i n/a 5 858 894 926 N
+ AO CH M s n/a 5 858 894 926 N
+ AO CH N b n/a 5 851 890 924 N
+ AO CH N e n/a 5 858 894 923 N
+ AO CH N i n/a 5 858 894 923 N
+ AO CH N s n/a 5 858 894 923 N
+ AO CH NG b n/a 5 851 894 926 N
+ AO CH NG e n/a 5 858 894 926 N
+ AO CH NG i n/a 5 858 894 926 N
+ AO CH NG s n/a 5 858 894 926 N
+ AO CH OW e n/a 5 858 899 918 N
+ AO CH OW s n/a 5 858 899 918 N
+ AO CH OY e n/a 5 858 899 918 N
+ AO CH OY s n/a 5 858 899 918 N
+ AO CH P b n/a 5 854 887 922 N
+ AO CH P e n/a 5 858 887 922 N
+ AO CH P s n/a 5 858 887 922 N
+ AO CH R b n/a 5 869 911 936 N
+ AO CH R e n/a 5 870 911 936 N
+ AO CH R i n/a 5 870 909 934 N
+ AO CH R s n/a 5 870 911 936 N
+ AO CH S b n/a 5 853 881 921 N
+ AO CH S e n/a 5 858 881 921 N
+ AO CH S i n/a 5 858 881 921 N
+ AO CH S s n/a 5 858 881 921 N
+ AO CH SH b n/a 5 853 881 919 N
+ AO CH SH e n/a 5 858 881 919 N
+ AO CH SH s n/a 5 858 881 919 N
+ AO CH SIL e n/a 5 858 881 918 N
+ AO CH SIL s n/a 5 858 881 918 N
+ AO CH T b n/a 5 853 886 914 N
+ AO CH T e n/a 5 858 886 914 N
+ AO CH T i n/a 5 858 886 914 N
+ AO CH T s n/a 5 858 886 914 N
+ AO CH TH b n/a 5 853 881 921 N
+ AO CH TH e n/a 5 858 881 921 N
+ AO CH TH s n/a 5 858 881 921 N
+ AO CH UH e n/a 5 858 899 916 N
+ AO CH UH s n/a 5 858 899 916 N
+ AO CH UW e n/a 5 858 899 916 N
+ AO CH UW s n/a 5 858 899 916 N
+ AO CH V e n/a 5 858 887 922 N
+ AO CH V i n/a 5 858 887 922 N
+ AO CH V s n/a 5 858 887 922 N
+ AO CH W e n/a 5 858 899 928 N
+ AO CH W s n/a 5 858 899 928 N
+ AO CH Y e n/a 5 858 881 916 N
+ AO CH Y s n/a 5 858 881 916 N
+ AO CH Z b n/a 5 853 881 915 N
+ AO CH Z e n/a 5 858 881 915 N
+ AO CH Z s n/a 5 858 881 915 N
+ AO CH ZH e n/a 5 858 881 920 N
+ AO CH ZH s n/a 5 858 881 920 N
+ AO D AA e n/a 5 857 896 918 N
+ AO D AA s n/a 5 857 896 918 N
+ AO D AE e n/a 5 857 884 918 N
+ AO D AE s n/a 5 856 884 918 N
+ AO D AH e n/a 5 857 884 918 N
+ AO D AH s n/a 5 856 884 918 N
+ AO D AO e n/a 5 857 896 918 N
+ AO D AO s n/a 5 857 896 918 N
+ AO D AW e n/a 5 857 884 918 N
+ AO D AW s n/a 5 856 884 918 N
+ AO D AY e n/a 5 857 896 918 N
+ AO D AY s n/a 5 857 896 918 N
+ AO D B b n/a 5 854 887 922 N
+ AO D B e n/a 5 857 887 922 N
+ AO D B i n/a 5 857 887 922 N
+ AO D B s n/a 5 856 887 922 N
+ AO D CH b n/a 5 853 884 919 N
+ AO D CH e n/a 5 857 884 919 N
+ AO D CH s n/a 5 856 884 919 N
+ AO D D b n/a 5 853 885 914 N
+ AO D D e n/a 5 857 885 914 N
+ AO D D i n/a 5 857 885 914 N
+ AO D D s n/a 5 856 885 914 N
+ AO D DH e n/a 5 857 884 920 N
+ AO D DH s n/a 5 856 884 920 N
+ AO D EH b n/a 5 853 884 918 N
+ AO D EH e n/a 5 857 884 918 N
+ AO D EH i n/a 5 857 884 918 N
+ AO D EH s n/a 5 856 884 918 N
+ AO D ER e n/a 5 866 911 936 N
+ AO D ER s n/a 5 866 911 936 N
+ AO D EY e n/a 5 857 884 918 N
+ AO D EY s n/a 5 856 884 918 N
+ AO D F b n/a 5 854 887 922 N
+ AO D F e n/a 5 857 887 922 N
+ AO D F i n/a 5 857 887 922 N
+ AO D F s n/a 5 856 887 922 N
+ AO D G b n/a 5 853 884 920 N
+ AO D G e n/a 5 857 884 920 N
+ AO D G i n/a 5 857 884 920 N
+ AO D G s n/a 5 856 884 920 N
+ AO D HH e n/a 5 857 884 919 N
+ AO D HH s n/a 5 856 884 919 N
+ AO D IH e n/a 5 857 884 916 N
+ AO D IH i n/a 5 857 884 916 N
+ AO D IH s n/a 5 856 884 916 N
+ AO D IY b n/a 5 853 884 916 N
+ AO D IY e n/a 5 857 884 916 N
+ AO D IY s n/a 5 856 884 916 N
+ AO D JH b n/a 5 853 884 920 N
+ AO D JH e n/a 5 857 884 920 N
+ AO D JH i n/a 5 857 884 920 N
+ AO D JH s n/a 5 856 884 920 N
+ AO D K b n/a 5 853 886 919 N
+ AO D K e n/a 5 857 886 919 N
+ AO D K i n/a 5 857 886 919 N
+ AO D K s n/a 5 856 886 919 N
+ AO D L b n/a 5 853 897 929 N
+ AO D L e n/a 5 857 896 927 N
+ AO D L i n/a 5 857 896 927 N
+ AO D L s n/a 5 857 896 927 N
+ AO D M b n/a 5 851 890 926 N
+ AO D M e n/a 5 857 894 926 N
+ AO D M i n/a 5 857 894 926 N
+ AO D M s n/a 5 856 894 926 N
+ AO D N b n/a 5 851 890 924 N
+ AO D N e n/a 5 857 894 923 N
+ AO D N i n/a 5 857 894 923 N
+ AO D N s n/a 5 856 894 923 N
+ AO D NG b n/a 5 851 894 926 N
+ AO D NG e n/a 5 857 894 926 N
+ AO D NG i n/a 5 857 894 926 N
+ AO D NG s n/a 5 856 894 926 N
+ AO D OW e n/a 5 857 896 918 N
+ AO D OW s n/a 5 857 896 918 N
+ AO D OY e n/a 5 857 896 918 N
+ AO D OY s n/a 5 857 896 918 N
+ AO D P b n/a 5 854 887 922 N
+ AO D P e n/a 5 857 887 922 N
+ AO D P s n/a 5 856 887 922 N
+ AO D R b n/a 5 866 911 936 N
+ AO D R e n/a 5 866 911 936 N
+ AO D R i n/a 5 864 908 935 N
+ AO D R s n/a 5 866 911 936 N
+ AO D S b n/a 5 853 885 921 N
+ AO D S e n/a 5 857 885 921 N
+ AO D S i n/a 5 857 885 921 N
+ AO D S s n/a 5 856 885 921 N
+ AO D SH b n/a 5 853 884 919 N
+ AO D SH e n/a 5 857 884 919 N
+ AO D SH i n/a 5 857 884 919 N
+ AO D SH s n/a 5 856 884 919 N
+ AO D SIL e n/a 5 857 884 918 N
+ AO D SIL s n/a 5 856 884 918 N
+ AO D T b n/a 5 853 885 914 N
+ AO D T e n/a 5 857 885 914 N
+ AO D T i n/a 5 857 885 914 N
+ AO D T s n/a 5 856 885 914 N
+ AO D TH b n/a 5 853 884 921 N
+ AO D TH e n/a 5 857 884 921 N
+ AO D TH i n/a 5 857 884 921 N
+ AO D TH s n/a 5 856 884 921 N
+ AO D UH e n/a 5 857 896 916 N
+ AO D UH s n/a 5 857 896 916 N
+ AO D UW e n/a 5 857 896 916 N
+ AO D UW s n/a 5 857 896 916 N
+ AO D V e n/a 5 857 887 922 N
+ AO D V i n/a 5 857 887 922 N
+ AO D V s n/a 5 856 887 922 N
+ AO D W e n/a 5 857 896 927 N
+ AO D W s n/a 5 857 896 927 N
+ AO D Y e n/a 5 857 884 916 N
+ AO D Y s n/a 5 856 884 916 N
+ AO D Z b n/a 5 853 885 915 N
+ AO D Z e n/a 5 857 885 915 N
+ AO D Z i n/a 5 857 885 915 N
+ AO D Z s n/a 5 856 885 915 N
+ AO D ZH e n/a 5 857 884 920 N
+ AO D ZH s n/a 5 856 884 920 N
+ AO DH AA s n/a 5 856 899 918 N
+ AO DH AE s n/a 5 856 881 918 N
+ AO DH AH s n/a 5 856 881 918 N
+ AO DH AO s n/a 5 856 899 918 N
+ AO DH AW s n/a 5 856 881 918 N
+ AO DH AY s n/a 5 856 899 918 N
+ AO DH B b n/a 5 851 887 922 N
+ AO DH B s n/a 5 856 887 922 N
+ AO DH CH b n/a 5 851 881 919 N
+ AO DH CH s n/a 5 856 881 919 N
+ AO DH D b n/a 5 851 881 914 N
+ AO DH D s n/a 5 856 881 914 N
+ AO DH DH s n/a 5 856 881 920 N
+ AO DH EH b n/a 5 851 881 918 N
+ AO DH EH s n/a 5 856 881 918 N
+ AO DH ER s n/a 5 866 911 936 N
+ AO DH EY s n/a 5 856 881 918 N
+ AO DH F b n/a 5 851 887 922 N
+ AO DH F s n/a 5 856 887 922 N
+ AO DH G b n/a 5 851 881 920 N
+ AO DH G s n/a 5 856 881 920 N
+ AO DH HH s n/a 5 856 881 919 N
+ AO DH IH s n/a 5 856 881 916 N
+ AO DH IY b n/a 5 851 881 916 N
+ AO DH IY s n/a 5 856 881 916 N
+ AO DH JH b n/a 5 851 881 920 N
+ AO DH JH s n/a 5 856 881 920 N
+ AO DH K b n/a 5 851 886 919 N
+ AO DH K s n/a 5 856 886 919 N
+ AO DH L b n/a 5 851 897 929 N
+ AO DH L i n/a 5 856 899 928 N
+ AO DH L s n/a 5 856 899 928 N
+ AO DH M b n/a 5 851 890 926 N
+ AO DH M s n/a 5 856 894 926 N
+ AO DH N b n/a 5 851 890 924 N
+ AO DH N s n/a 5 856 894 923 N
+ AO DH NG b n/a 5 851 894 926 N
+ AO DH NG s n/a 5 856 894 926 N
+ AO DH OW s n/a 5 856 899 918 N
+ AO DH OY s n/a 5 856 899 918 N
+ AO DH P b n/a 5 851 887 922 N
+ AO DH P s n/a 5 856 887 922 N
+ AO DH R b n/a 5 866 911 936 N
+ AO DH R s n/a 5 866 911 936 N
+ AO DH S b n/a 5 851 881 921 N
+ AO DH S s n/a 5 856 881 921 N
+ AO DH SH b n/a 5 851 881 919 N
+ AO DH SH s n/a 5 856 881 919 N
+ AO DH SIL s n/a 5 856 881 918 N
+ AO DH T b n/a 5 851 885 914 N
+ AO DH T s n/a 5 856 885 914 N
+ AO DH TH b n/a 5 851 881 921 N
+ AO DH TH s n/a 5 856 881 921 N
+ AO DH UH s n/a 5 856 899 916 N
+ AO DH UW s n/a 5 856 899 916 N
+ AO DH V s n/a 5 856 887 922 N
+ AO DH W s n/a 5 856 899 928 N
+ AO DH Y s n/a 5 856 881 916 N
+ AO DH Z b n/a 5 851 881 915 N
+ AO DH Z s n/a 5 856 881 915 N
+ AO DH ZH s n/a 5 856 881 920 N
+ AO EH AA s n/a 5 857 899 918 N
+ AO EH AE s n/a 5 857 881 918 N
+ AO EH AH s n/a 5 857 881 918 N
+ AO EH AO s n/a 5 857 899 918 N
+ AO EH AW s n/a 5 857 881 918 N
+ AO EH AY s n/a 5 857 899 918 N
+ AO EH B b n/a 5 852 887 922 N
+ AO EH B s n/a 5 857 887 922 N
+ AO EH CH b n/a 5 852 881 919 N
+ AO EH CH s n/a 5 857 881 919 N
+ AO EH D b n/a 5 852 881 914 N
+ AO EH D s n/a 5 857 881 914 N
+ AO EH DH s n/a 5 857 881 920 N
+ AO EH EH b n/a 5 852 881 918 N
+ AO EH EH s n/a 5 857 881 918 N
+ AO EH ER s n/a 5 869 911 936 N
+ AO EH EY s n/a 5 857 881 918 N
+ AO EH F b n/a 5 852 887 922 N
+ AO EH F s n/a 5 857 887 922 N
+ AO EH G b n/a 5 852 881 920 N
+ AO EH G s n/a 5 857 881 920 N
+ AO EH HH s n/a 5 857 881 919 N
+ AO EH IH s n/a 5 857 881 916 N
+ AO EH IY b n/a 5 852 881 916 N
+ AO EH IY s n/a 5 857 881 916 N
+ AO EH JH b n/a 5 852 881 920 N
+ AO EH JH s n/a 5 857 881 920 N
+ AO EH K b n/a 5 852 886 919 N
+ AO EH K s n/a 5 857 886 919 N
+ AO EH L b n/a 5 852 897 929 N
+ AO EH L s n/a 5 857 899 928 N
+ AO EH M b n/a 5 852 890 926 N
+ AO EH M s n/a 5 857 894 926 N
+ AO EH N b n/a 5 852 890 924 N
+ AO EH N s n/a 5 857 894 924 N
+ AO EH NG b n/a 5 852 894 926 N
+ AO EH NG s n/a 5 857 894 926 N
+ AO EH OW s n/a 5 857 899 918 N
+ AO EH OY s n/a 5 857 899 918 N
+ AO EH P b n/a 5 852 887 922 N
+ AO EH P s n/a 5 857 887 922 N
+ AO EH R b n/a 5 869 911 936 N
+ AO EH R s n/a 5 869 911 936 N
+ AO EH S b n/a 5 852 881 921 N
+ AO EH S s n/a 5 857 881 921 N
+ AO EH SH b n/a 5 852 881 919 N
+ AO EH SH s n/a 5 857 881 919 N
+ AO EH SIL s n/a 5 857 881 918 N
+ AO EH T b n/a 5 852 886 914 N
+ AO EH T s n/a 5 857 886 914 N
+ AO EH TH b n/a 5 852 881 921 N
+ AO EH TH s n/a 5 857 881 921 N
+ AO EH UH s n/a 5 857 899 916 N
+ AO EH UW s n/a 5 857 899 916 N
+ AO EH V s n/a 5 857 887 922 N
+ AO EH W s n/a 5 857 899 928 N
+ AO EH Y s n/a 5 857 881 916 N
+ AO EH Z b n/a 5 852 881 915 N
+ AO EH Z s n/a 5 857 881 915 N
+ AO EH ZH s n/a 5 857 881 920 N
+ AO ER AA e n/a 5 849 898 918 N
+ AO ER AA s n/a 5 849 898 918 N
+ AO ER AE e n/a 5 849 881 918 N
+ AO ER AE s n/a 5 849 881 918 N
+ AO ER AH e n/a 5 849 881 918 N
+ AO ER AH s n/a 5 849 881 918 N
+ AO ER AO e n/a 5 849 898 918 N
+ AO ER AO s n/a 5 849 898 918 N
+ AO ER AW e n/a 5 849 881 918 N
+ AO ER AW s n/a 5 849 881 918 N
+ AO ER AY e n/a 5 849 898 918 N
+ AO ER AY s n/a 5 849 898 918 N
+ AO ER B b n/a 5 850 887 922 N
+ AO ER B e n/a 5 849 887 922 N
+ AO ER B i n/a 5 849 887 922 N
+ AO ER B s n/a 5 849 887 922 N
+ AO ER CH b n/a 5 850 881 919 N
+ AO ER CH e n/a 5 849 881 919 N
+ AO ER CH s n/a 5 849 881 919 N
+ AO ER D b n/a 5 850 881 914 N
+ AO ER D e n/a 5 849 881 914 N
+ AO ER D i n/a 5 849 881 914 N
+ AO ER D s n/a 5 849 881 914 N
+ AO ER DH e n/a 5 849 881 920 N
+ AO ER DH s n/a 5 849 881 920 N
+ AO ER EH b n/a 5 850 881 918 N
+ AO ER EH e n/a 5 849 881 918 N
+ AO ER EH s n/a 5 849 881 918 N
+ AO ER ER e n/a 5 876 911 936 N
+ AO ER ER s n/a 5 876 911 936 N
+ AO ER EY e n/a 5 849 881 918 N
+ AO ER EY s n/a 5 849 881 918 N
+ AO ER F b n/a 5 850 887 922 N
+ AO ER F e n/a 5 849 887 922 N
+ AO ER F i n/a 5 849 887 922 N
+ AO ER F s n/a 5 849 887 922 N
+ AO ER G b n/a 5 850 881 920 N
+ AO ER G e n/a 5 849 881 920 N
+ AO ER G i n/a 5 849 881 920 N
+ AO ER G s n/a 5 849 881 920 N
+ AO ER HH e n/a 5 849 881 919 N
+ AO ER HH s n/a 5 849 881 919 N
+ AO ER IH e n/a 5 849 881 916 N
+ AO ER IH i n/a 5 849 881 916 N
+ AO ER IH s n/a 5 849 881 916 N
+ AO ER IY b n/a 5 850 881 916 N
+ AO ER IY e n/a 5 849 881 916 N
+ AO ER IY s n/a 5 849 881 916 N
+ AO ER JH b n/a 5 850 881 920 N
+ AO ER JH e n/a 5 849 881 920 N
+ AO ER JH s n/a 5 849 881 920 N
+ AO ER K b n/a 5 850 886 919 N
+ AO ER K e n/a 5 849 886 919 N
+ AO ER K i n/a 5 849 886 919 N
+ AO ER K s n/a 5 849 886 919 N
+ AO ER L b n/a 5 850 898 929 N
+ AO ER L e n/a 5 849 898 928 N
+ AO ER L i n/a 5 849 898 928 N
+ AO ER L s n/a 5 849 898 928 N
+ AO ER M b n/a 5 850 890 926 N
+ AO ER M e n/a 5 849 894 926 N
+ AO ER M s n/a 5 849 894 926 N
+ AO ER N b n/a 5 850 890 924 N
+ AO ER N e n/a 5 849 894 924 N
+ AO ER N i n/a 5 849 894 924 N
+ AO ER N s n/a 5 849 894 924 N
+ AO ER NG b n/a 5 850 894 926 N
+ AO ER NG e n/a 5 849 894 926 N
+ AO ER NG i n/a 5 849 894 926 N
+ AO ER NG s n/a 5 849 894 926 N
+ AO ER OW e n/a 5 849 898 918 N
+ AO ER OW s n/a 5 849 898 918 N
+ AO ER OY e n/a 5 849 898 918 N
+ AO ER OY s n/a 5 849 898 918 N
+ AO ER P b n/a 5 850 887 922 N
+ AO ER P e n/a 5 849 887 922 N
+ AO ER P i n/a 5 849 887 922 N
+ AO ER P s n/a 5 849 887 922 N
+ AO ER R b n/a 5 876 911 936 N
+ AO ER R e n/a 5 876 911 936 N
+ AO ER R i n/a 5 876 907 934 N
+ AO ER R s n/a 5 876 911 936 N
+ AO ER S b n/a 5 850 881 921 N
+ AO ER S e n/a 5 849 881 921 N
+ AO ER S s n/a 5 849 881 921 N
+ AO ER SH b n/a 5 850 881 921 N
+ AO ER SH e n/a 5 849 881 921 N
+ AO ER SH s n/a 5 849 881 921 N
+ AO ER SIL e n/a 5 849 881 918 N
+ AO ER SIL s n/a 5 849 881 918 N
+ AO ER T b n/a 5 850 886 914 N
+ AO ER T e n/a 5 849 886 914 N
+ AO ER T i n/a 5 849 886 914 N
+ AO ER T s n/a 5 849 886 914 N
+ AO ER TH b n/a 5 850 881 921 N
+ AO ER TH e n/a 5 849 881 921 N
+ AO ER TH s n/a 5 849 881 921 N
+ AO ER UH e n/a 5 849 898 916 N
+ AO ER UH s n/a 5 849 898 916 N
+ AO ER UW e n/a 5 849 898 916 N
+ AO ER UW s n/a 5 849 898 916 N
+ AO ER V e n/a 5 849 887 922 N
+ AO ER V i n/a 5 849 887 922 N
+ AO ER V s n/a 5 849 887 922 N
+ AO ER W e n/a 5 849 898 928 N
+ AO ER W s n/a 5 849 898 928 N
+ AO ER Y e n/a 5 849 881 916 N
+ AO ER Y s n/a 5 849 881 916 N
+ AO ER Z b n/a 5 850 881 915 N
+ AO ER Z e n/a 5 849 881 915 N
+ AO ER Z s n/a 5 849 881 915 N
+ AO ER ZH e n/a 5 849 881 920 N
+ AO ER ZH s n/a 5 849 881 920 N
+ AO EY AA s n/a 5 857 899 918 N
+ AO EY AE s n/a 5 857 881 918 N
+ AO EY AH s n/a 5 857 881 918 N
+ AO EY AO s n/a 5 857 899 918 N
+ AO EY AW s n/a 5 857 881 918 N
+ AO EY AY s n/a 5 857 899 918 N
+ AO EY B b n/a 5 855 887 922 N
+ AO EY B s n/a 5 857 887 922 N
+ AO EY CH b n/a 5 855 881 919 N
+ AO EY CH s n/a 5 857 881 919 N
+ AO EY D b n/a 5 855 881 914 N
+ AO EY D s n/a 5 857 881 914 N
+ AO EY DH s n/a 5 857 881 920 N
+ AO EY EH b n/a 5 855 881 918 N
+ AO EY EH s n/a 5 857 881 918 N
+ AO EY ER s n/a 5 871 911 936 N
+ AO EY EY s n/a 5 857 881 918 N
+ AO EY F b n/a 5 855 887 922 N
+ AO EY F i n/a 5 857 887 922 N
+ AO EY F s n/a 5 857 887 922 N
+ AO EY G b n/a 5 855 881 920 N
+ AO EY G s n/a 5 857 881 920 N
+ AO EY HH s n/a 5 857 881 919 N
+ AO EY IH s n/a 5 857 881 916 N
+ AO EY IY b n/a 5 855 881 916 N
+ AO EY IY s n/a 5 857 881 916 N
+ AO EY JH b n/a 5 855 881 920 N
+ AO EY JH s n/a 5 857 881 920 N
+ AO EY K b n/a 5 855 886 919 N
+ AO EY K s n/a 5 857 886 919 N
+ AO EY L b n/a 5 855 897 930 N
+ AO EY L i n/a 5 857 899 928 N
+ AO EY L s n/a 5 857 899 928 N
+ AO EY M b n/a 5 855 890 926 N
+ AO EY M s n/a 5 857 894 926 N
+ AO EY N b n/a 5 855 890 924 N
+ AO EY N i n/a 5 857 894 924 N
+ AO EY N s n/a 5 857 894 924 N
+ AO EY NG b n/a 5 855 894 926 N
+ AO EY NG s n/a 5 857 894 926 N
+ AO EY OW s n/a 5 857 899 918 N
+ AO EY OY s n/a 5 857 899 918 N
+ AO EY P b n/a 5 855 887 922 N
+ AO EY P s n/a 5 857 887 922 N
+ AO EY R b n/a 5 869 911 936 N
+ AO EY R i n/a 5 871 907 935 N
+ AO EY R s n/a 5 871 911 936 N
+ AO EY S b n/a 5 855 881 921 N
+ AO EY S s n/a 5 857 881 921 N
+ AO EY SH b n/a 5 855 881 919 N
+ AO EY SH s n/a 5 857 881 919 N
+ AO EY SIL s n/a 5 857 881 918 N
+ AO EY T b n/a 5 855 886 914 N
+ AO EY T i n/a 5 857 886 914 N
+ AO EY T s n/a 5 857 886 914 N
+ AO EY TH b n/a 5 855 881 921 N
+ AO EY TH s n/a 5 857 881 921 N
+ AO EY UH s n/a 5 857 899 916 N
+ AO EY UW s n/a 5 857 899 916 N
+ AO EY V s n/a 5 857 887 922 N
+ AO EY W s n/a 5 857 899 928 N
+ AO EY Y s n/a 5 857 881 916 N
+ AO EY Z b n/a 5 855 881 915 N
+ AO EY Z s n/a 5 857 881 915 N
+ AO EY ZH s n/a 5 857 881 920 N
+ AO F AA e n/a 5 847 900 918 N
+ AO F AA s n/a 5 847 900 918 N
+ AO F AE e n/a 5 847 881 918 N
+ AO F AE s n/a 5 847 881 918 N
+ AO F AH e n/a 5 847 881 918 N
+ AO F AH s n/a 5 847 881 918 N
+ AO F AO e n/a 5 847 900 918 N
+ AO F AO s n/a 5 847 900 918 N
+ AO F AW e n/a 5 847 881 918 N
+ AO F AW s n/a 5 847 881 918 N
+ AO F AY e n/a 5 847 900 918 N
+ AO F AY s n/a 5 847 900 918 N
+ AO F B b n/a 5 859 887 922 N
+ AO F B e n/a 5 847 887 922 N
+ AO F B i n/a 5 848 887 922 N
+ AO F B s n/a 5 847 887 922 N
+ AO F CH b n/a 5 859 881 919 N
+ AO F CH e n/a 5 847 881 919 N
+ AO F CH i n/a 5 848 881 919 N
+ AO F CH s n/a 5 847 881 919 N
+ AO F D b n/a 5 859 881 914 N
+ AO F D e n/a 5 847 881 914 N
+ AO F D i n/a 5 848 881 914 N
+ AO F D s n/a 5 847 881 914 N
+ AO F DH e n/a 5 847 881 920 N
+ AO F DH s n/a 5 847 881 920 N
+ AO F EH b n/a 5 859 881 918 N
+ AO F EH e n/a 5 847 881 918 N
+ AO F EH s n/a 5 847 881 918 N
+ AO F ER e n/a 5 878 905 932 N
+ AO F ER i n/a 5 877 905 932 N
+ AO F ER s n/a 5 878 905 932 N
+ AO F EY e n/a 5 847 881 918 N
+ AO F EY s n/a 5 847 881 918 N
+ AO F F b n/a 5 859 887 922 N
+ AO F F e n/a 5 847 887 922 N
+ AO F F s n/a 5 847 887 922 N
+ AO F G b n/a 5 859 881 920 N
+ AO F G e n/a 5 847 881 920 N
+ AO F G i n/a 5 848 881 920 N
+ AO F G s n/a 5 847 881 920 N
+ AO F HH e n/a 5 847 881 919 N
+ AO F HH s n/a 5 847 881 919 N
+ AO F IH e n/a 5 847 881 916 N
+ AO F IH s n/a 5 847 881 916 N
+ AO F IY b n/a 5 859 881 916 N
+ AO F IY e n/a 5 847 881 916 N
+ AO F IY s n/a 5 847 881 916 N
+ AO F JH b n/a 5 859 881 920 N
+ AO F JH e n/a 5 847 881 920 N
+ AO F JH i n/a 5 848 881 920 N
+ AO F JH s n/a 5 847 881 920 N
+ AO F K b n/a 5 859 886 919 N
+ AO F K e n/a 5 847 886 919 N
+ AO F K i n/a 5 848 886 919 N
+ AO F K s n/a 5 847 886 919 N
+ AO F L b n/a 5 859 900 929 N
+ AO F L e n/a 5 847 900 928 N
+ AO F L i n/a 5 848 900 928 N
+ AO F L s n/a 5 847 900 928 N
+ AO F M b n/a 5 859 890 926 N
+ AO F M e n/a 5 847 894 926 N
+ AO F M s n/a 5 847 894 926 N
+ AO F N b n/a 5 859 890 924 N
+ AO F N e n/a 5 847 894 923 N
+ AO F N i n/a 5 848 894 923 N
+ AO F N s n/a 5 847 894 923 N
+ AO F NG b n/a 5 859 894 926 N
+ AO F NG e n/a 5 847 894 926 N
+ AO F NG i n/a 5 848 894 926 N
+ AO F NG s n/a 5 847 894 926 N
+ AO F OW e n/a 5 847 900 918 N
+ AO F OW s n/a 5 847 900 918 N
+ AO F OY e n/a 5 847 900 918 N
+ AO F OY s n/a 5 847 900 918 N
+ AO F P b n/a 5 859 887 922 N
+ AO F P e n/a 5 847 887 922 N
+ AO F P i n/a 5 848 887 922 N
+ AO F P s n/a 5 847 887 922 N
+ AO F R b n/a 5 878 905 932 N
+ AO F R e n/a 5 878 905 932 N
+ AO F R i n/a 5 877 905 932 N
+ AO F R s n/a 5 878 905 932 N
+ AO F S b n/a 5 859 881 921 N
+ AO F S e n/a 5 847 881 921 N
+ AO F S i n/a 5 848 881 921 N
+ AO F S s n/a 5 847 881 921 N
+ AO F SH b n/a 5 859 881 919 N
+ AO F SH e n/a 5 847 881 919 N
+ AO F SH s n/a 5 847 881 919 N
+ AO F SIL e n/a 5 847 881 918 N
+ AO F SIL s n/a 5 847 881 918 N
+ AO F T b n/a 5 859 886 914 N
+ AO F T e n/a 5 847 886 914 N
+ AO F T i n/a 5 848 886 914 N
+ AO F T s n/a 5 847 886 914 N
+ AO F TH b n/a 5 859 881 921 N
+ AO F TH e n/a 5 847 881 921 N
+ AO F TH i n/a 5 848 881 921 N
+ AO F TH s n/a 5 847 881 921 N
+ AO F UH e n/a 5 847 900 916 N
+ AO F UH s n/a 5 847 900 916 N
+ AO F UW e n/a 5 847 900 916 N
+ AO F UW s n/a 5 847 900 916 N
+ AO F V e n/a 5 847 887 922 N
+ AO F V i n/a 5 848 887 922 N
+ AO F V s n/a 5 847 887 922 N
+ AO F W e n/a 5 847 900 928 N
+ AO F W s n/a 5 847 900 928 N
+ AO F Y e n/a 5 847 881 916 N
+ AO F Y s n/a 5 847 881 916 N
+ AO F Z b n/a 5 859 881 915 N
+ AO F Z e n/a 5 847 881 915 N
+ AO F Z i n/a 5 848 881 915 N
+ AO F Z s n/a 5 847 881 915 N
+ AO F ZH e n/a 5 847 881 920 N
+ AO F ZH s n/a 5 847 881 920 N
+ AO G AA e n/a 5 858 896 918 N
+ AO G AA s n/a 5 858 896 918 N
+ AO G AE e n/a 5 858 881 918 N
+ AO G AE s n/a 5 858 881 918 N
+ AO G AH e n/a 5 858 881 918 N
+ AO G AH i n/a 5 858 881 918 N
+ AO G AH s n/a 5 858 881 918 N
+ AO G AO e n/a 5 858 896 918 N
+ AO G AO s n/a 5 858 896 918 N
+ AO G AW e n/a 5 858 881 918 N
+ AO G AW s n/a 5 858 881 918 N
+ AO G AY e n/a 5 858 896 918 N
+ AO G AY s n/a 5 858 896 918 N
+ AO G B b n/a 5 854 887 922 N
+ AO G B e n/a 5 858 887 922 N
+ AO G B i n/a 5 858 887 922 N
+ AO G B s n/a 5 858 887 922 N
+ AO G CH b n/a 5 853 881 919 N
+ AO G CH e n/a 5 858 881 919 N
+ AO G CH i n/a 5 858 881 919 N
+ AO G CH s n/a 5 858 881 919 N
+ AO G D b n/a 5 853 881 914 N
+ AO G D e n/a 5 858 881 914 N
+ AO G D i n/a 5 858 881 914 N
+ AO G D s n/a 5 858 881 914 N
+ AO G DH e n/a 5 858 881 920 N
+ AO G DH s n/a 5 858 881 920 N
+ AO G EH b n/a 5 853 881 918 N
+ AO G EH e n/a 5 858 881 918 N
+ AO G EH s n/a 5 858 881 918 N
+ AO G ER e n/a 5 869 911 936 N
+ AO G ER s n/a 5 869 911 936 N
+ AO G EY e n/a 5 858 881 918 N
+ AO G EY s n/a 5 858 881 918 N
+ AO G F b n/a 5 854 887 922 N
+ AO G F e n/a 5 858 887 922 N
+ AO G F i n/a 5 858 887 922 N
+ AO G F s n/a 5 858 887 922 N
+ AO G G b n/a 5 853 881 920 N
+ AO G G e n/a 5 858 881 920 N
+ AO G G i n/a 5 858 881 920 N
+ AO G G s n/a 5 858 881 920 N
+ AO G HH e n/a 5 858 881 919 N
+ AO G HH s n/a 5 858 881 919 N
+ AO G IH e n/a 5 858 881 916 N
+ AO G IH s n/a 5 858 881 916 N
+ AO G IY b n/a 5 853 881 916 N
+ AO G IY e n/a 5 858 881 916 N
+ AO G IY i n/a 5 858 881 916 N
+ AO G IY s n/a 5 858 881 916 N
+ AO G JH b n/a 5 853 881 920 N
+ AO G JH e n/a 5 858 881 920 N
+ AO G JH s n/a 5 858 881 920 N
+ AO G K b n/a 5 853 886 919 N
+ AO G K e n/a 5 858 886 919 N
+ AO G K i n/a 5 858 886 919 N
+ AO G K s n/a 5 858 886 919 N
+ AO G L b n/a 5 853 897 929 N
+ AO G L e n/a 5 858 896 928 N
+ AO G L i n/a 5 858 896 928 N
+ AO G L s n/a 5 858 896 928 N
+ AO G M b n/a 5 851 890 926 N
+ AO G M e n/a 5 858 894 926 N
+ AO G M i n/a 5 858 894 926 N
+ AO G M s n/a 5 858 894 926 N
+ AO G N b n/a 5 851 890 924 N
+ AO G N e n/a 5 858 894 923 N
+ AO G N i n/a 5 858 894 923 N
+ AO G N s n/a 5 858 894 923 N
+ AO G NG b n/a 5 851 894 926 N
+ AO G NG e n/a 5 858 894 926 N
+ AO G NG i n/a 5 858 894 926 N
+ AO G NG s n/a 5 858 894 926 N
+ AO G OW e n/a 5 858 896 918 N
+ AO G OW s n/a 5 858 896 918 N
+ AO G OY e n/a 5 858 896 918 N
+ AO G OY s n/a 5 858 896 918 N
+ AO G P b n/a 5 854 887 922 N
+ AO G P e n/a 5 858 887 922 N
+ AO G P s n/a 5 858 887 922 N
+ AO G R b n/a 5 869 911 936 N
+ AO G R e n/a 5 869 911 936 N
+ AO G R i n/a 5 869 905 935 N
+ AO G R s n/a 5 869 911 936 N
+ AO G S b n/a 5 853 881 921 N
+ AO G S e n/a 5 858 881 921 N
+ AO G S i n/a 5 858 881 921 N
+ AO G S s n/a 5 858 881 921 N
+ AO G SH b n/a 5 853 881 919 N
+ AO G SH e n/a 5 858 881 919 N
+ AO G SH i n/a 5 858 881 919 N
+ AO G SH s n/a 5 858 881 919 N
+ AO G SIL e n/a 5 858 881 918 N
+ AO G SIL s n/a 5 858 881 918 N
+ AO G T b n/a 5 853 886 914 N
+ AO G T e n/a 5 858 886 914 N
+ AO G T i n/a 5 858 886 914 N
+ AO G T s n/a 5 858 886 914 N
+ AO G TH b n/a 5 853 881 921 N
+ AO G TH e n/a 5 858 881 921 N
+ AO G TH i n/a 5 858 881 921 N
+ AO G TH s n/a 5 858 881 921 N
+ AO G UH e n/a 5 858 896 916 N
+ AO G UH s n/a 5 858 896 916 N
+ AO G UW e n/a 5 858 896 916 N
+ AO G UW s n/a 5 858 896 916 N
+ AO G V e n/a 5 858 887 922 N
+ AO G V s n/a 5 858 887 922 N
+ AO G W e n/a 5 858 896 928 N
+ AO G W s n/a 5 858 896 928 N
+ AO G Y e n/a 5 858 881 916 N
+ AO G Y s n/a 5 858 881 916 N
+ AO G Z b n/a 5 853 881 915 N
+ AO G Z e n/a 5 858 881 915 N
+ AO G Z i n/a 5 858 881 915 N
+ AO G Z s n/a 5 858 881 915 N
+ AO G ZH e n/a 5 858 881 920 N
+ AO G ZH s n/a 5 858 881 920 N
+ AO HH AA e n/a 5 861 899 918 N
+ AO HH AA s n/a 5 861 899 918 N
+ AO HH AE e n/a 5 861 881 918 N
+ AO HH AE s n/a 5 861 881 918 N
+ AO HH AH e n/a 5 861 881 918 N
+ AO HH AH s n/a 5 861 881 918 N
+ AO HH AO e n/a 5 861 899 918 N
+ AO HH AO s n/a 5 861 899 918 N
+ AO HH AW e n/a 5 861 881 918 N
+ AO HH AW s n/a 5 861 881 918 N
+ AO HH AY e n/a 5 861 899 918 N
+ AO HH AY s n/a 5 861 899 918 N
+ AO HH B b n/a 5 852 887 922 N
+ AO HH B e n/a 5 861 887 922 N
+ AO HH B i n/a 5 861 887 922 N
+ AO HH B s n/a 5 861 887 922 N
+ AO HH CH b n/a 5 852 881 919 N
+ AO HH CH e n/a 5 861 881 919 N
+ AO HH CH i n/a 5 861 881 919 N
+ AO HH CH s n/a 5 861 881 919 N
+ AO HH D b n/a 5 852 881 914 N
+ AO HH D e n/a 5 861 881 914 N
+ AO HH D i n/a 5 861 881 914 N
+ AO HH D s n/a 5 861 881 914 N
+ AO HH DH e n/a 5 861 881 920 N
+ AO HH DH s n/a 5 861 881 920 N
+ AO HH EH b n/a 5 852 881 918 N
+ AO HH EH e n/a 5 861 881 918 N
+ AO HH EH s n/a 5 861 881 918 N
+ AO HH ER e n/a 5 878 913 936 N
+ AO HH ER s n/a 5 878 912 936 N
+ AO HH EY e n/a 5 861 881 918 N
+ AO HH EY s n/a 5 861 881 918 N
+ AO HH F b n/a 5 852 887 922 N
+ AO HH F e n/a 5 861 887 922 N
+ AO HH F i n/a 5 861 887 922 N
+ AO HH F s n/a 5 861 887 922 N
+ AO HH G b n/a 5 852 881 920 N
+ AO HH G e n/a 5 861 881 920 N
+ AO HH G i n/a 5 861 881 920 N
+ AO HH G s n/a 5 861 881 920 N
+ AO HH HH e n/a 5 861 881 919 N
+ AO HH HH s n/a 5 861 881 919 N
+ AO HH IH e n/a 5 861 881 916 N
+ AO HH IH i n/a 5 861 881 916 N
+ AO HH IH s n/a 5 861 881 916 N
+ AO HH IY b n/a 5 852 881 916 N
+ AO HH IY e n/a 5 861 881 916 N
+ AO HH IY s n/a 5 861 881 916 N
+ AO HH JH b n/a 5 852 881 920 N
+ AO HH JH e n/a 5 861 881 920 N
+ AO HH JH i n/a 5 861 881 920 N
+ AO HH JH s n/a 5 861 881 920 N
+ AO HH K b n/a 5 852 886 919 N
+ AO HH K e n/a 5 861 886 919 N
+ AO HH K i n/a 5 861 886 919 N
+ AO HH K s n/a 5 861 886 919 N
+ AO HH L b n/a 5 852 897 929 N
+ AO HH L e n/a 5 861 899 928 N
+ AO HH L i n/a 5 861 899 928 N
+ AO HH L s n/a 5 861 899 928 N
+ AO HH M b n/a 5 852 890 926 N
+ AO HH M e n/a 5 861 894 926 N
+ AO HH M i n/a 5 861 894 926 N
+ AO HH M s n/a 5 861 894 926 N
+ AO HH N b n/a 5 852 890 924 N
+ AO HH N e n/a 5 861 894 923 N
+ AO HH N i n/a 5 861 894 923 N
+ AO HH N s n/a 5 861 894 923 N
+ AO HH NG b n/a 5 852 894 926 N
+ AO HH NG e n/a 5 861 894 926 N
+ AO HH NG i n/a 5 861 894 926 N
+ AO HH NG s n/a 5 861 894 926 N
+ AO HH OW e n/a 5 861 899 918 N
+ AO HH OW s n/a 5 861 899 918 N
+ AO HH OY e n/a 5 861 899 918 N
+ AO HH OY s n/a 5 861 899 918 N
+ AO HH P b n/a 5 852 887 922 N
+ AO HH P e n/a 5 861 887 922 N
+ AO HH P i n/a 5 861 887 922 N
+ AO HH P s n/a 5 861 887 922 N
+ AO HH R b n/a 5 878 912 936 N
+ AO HH R e n/a 5 878 913 936 N
+ AO HH R i n/a 5 879 912 936 N
+ AO HH R s n/a 5 878 912 936 N
+ AO HH S b n/a 5 852 881 921 N
+ AO HH S e n/a 5 861 881 921 N
+ AO HH S i n/a 5 861 881 921 N
+ AO HH S s n/a 5 861 881 921 N
+ AO HH SH b n/a 5 852 881 919 N
+ AO HH SH e n/a 5 861 881 919 N
+ AO HH SH i n/a 5 861 881 919 N
+ AO HH SH s n/a 5 861 881 919 N
+ AO HH SIL e n/a 5 861 881 918 N
+ AO HH SIL s n/a 5 861 881 918 N
+ AO HH T b n/a 5 852 886 914 N
+ AO HH T e n/a 5 861 886 914 N
+ AO HH T i n/a 5 861 886 914 N
+ AO HH T s n/a 5 861 886 914 N
+ AO HH TH b n/a 5 852 881 921 N
+ AO HH TH e n/a 5 861 881 921 N
+ AO HH TH i n/a 5 861 881 921 N
+ AO HH TH s n/a 5 861 881 921 N
+ AO HH UH e n/a 5 861 899 916 N
+ AO HH UH s n/a 5 861 899 916 N
+ AO HH UW e n/a 5 861 899 916 N
+ AO HH UW s n/a 5 861 899 916 N
+ AO HH V e n/a 5 861 887 922 N
+ AO HH V i n/a 5 861 887 922 N
+ AO HH V s n/a 5 861 887 922 N
+ AO HH W e n/a 5 861 899 928 N
+ AO HH W s n/a 5 861 899 928 N
+ AO HH Y e n/a 5 861 881 916 N
+ AO HH Y s n/a 5 861 881 916 N
+ AO HH Z b n/a 5 852 881 915 N
+ AO HH Z e n/a 5 861 881 915 N
+ AO HH Z i n/a 5 861 881 915 N
+ AO HH Z s n/a 5 861 881 915 N
+ AO HH ZH e n/a 5 861 881 920 N
+ AO HH ZH s n/a 5 861 881 920 N
+ AO IH AA s n/a 5 857 899 918 N
+ AO IH AE s n/a 5 857 881 918 N
+ AO IH AH s n/a 5 857 881 918 N
+ AO IH AO s n/a 5 857 899 918 N
+ AO IH AW s n/a 5 857 881 918 N
+ AO IH AY s n/a 5 857 899 918 N
+ AO IH B b n/a 5 852 887 922 N
+ AO IH B s n/a 5 857 887 922 N
+ AO IH CH b n/a 5 852 881 919 N
+ AO IH CH s n/a 5 857 881 919 N
+ AO IH D b n/a 5 852 881 914 N
+ AO IH D s n/a 5 857 881 914 N
+ AO IH DH s n/a 5 857 881 920 N
+ AO IH EH b n/a 5 852 881 918 N
+ AO IH EH s n/a 5 857 881 918 N
+ AO IH ER s n/a 5 869 911 936 N
+ AO IH EY s n/a 5 857 881 918 N
+ AO IH F b n/a 5 852 887 922 N
+ AO IH F s n/a 5 857 887 922 N
+ AO IH G b n/a 5 852 881 920 N
+ AO IH G s n/a 5 857 881 920 N
+ AO IH HH s n/a 5 857 881 919 N
+ AO IH IH s n/a 5 857 881 916 N
+ AO IH IY b n/a 5 852 881 916 N
+ AO IH IY s n/a 5 857 881 916 N
+ AO IH JH b n/a 5 852 881 920 N
+ AO IH JH s n/a 5 857 881 920 N
+ AO IH K b n/a 5 852 886 919 N
+ AO IH K s n/a 5 857 886 919 N
+ AO IH L b n/a 5 852 897 929 N
+ AO IH L i n/a 5 857 899 928 N
+ AO IH L s n/a 5 857 899 928 N
+ AO IH M b n/a 5 852 890 926 N
+ AO IH M s n/a 5 857 894 926 N
+ AO IH N b n/a 5 852 890 924 N
+ AO IH N i n/a 5 857 894 924 N
+ AO IH N s n/a 5 857 894 924 N
+ AO IH NG b n/a 5 852 894 926 N
+ AO IH NG s n/a 5 857 894 926 N
+ AO IH OW s n/a 5 857 899 918 N
+ AO IH OY s n/a 5 857 899 918 N
+ AO IH P b n/a 5 852 887 922 N
+ AO IH P s n/a 5 857 887 922 N
+ AO IH R b n/a 5 869 911 936 N
+ AO IH R s n/a 5 869 911 936 N
+ AO IH S b n/a 5 852 881 921 N
+ AO IH S s n/a 5 857 881 921 N
+ AO IH SH b n/a 5 852 881 919 N
+ AO IH SH s n/a 5 857 881 919 N
+ AO IH SIL s n/a 5 857 881 918 N
+ AO IH T b n/a 5 852 886 914 N
+ AO IH T i n/a 5 857 886 914 N
+ AO IH T s n/a 5 857 886 914 N
+ AO IH TH b n/a 5 852 881 921 N
+ AO IH TH s n/a 5 857 881 921 N
+ AO IH UH s n/a 5 857 899 916 N
+ AO IH UW s n/a 5 857 899 916 N
+ AO IH V s n/a 5 857 887 922 N
+ AO IH W s n/a 5 857 899 928 N
+ AO IH Y s n/a 5 857 881 916 N
+ AO IH Z b n/a 5 852 881 915 N
+ AO IH Z s n/a 5 857 881 915 N
+ AO IH ZH s n/a 5 857 881 920 N
+ AO IY AA s n/a 5 857 899 918 N
+ AO IY AE s n/a 5 857 881 918 N
+ AO IY AH s n/a 5 857 881 918 N
+ AO IY AO s n/a 5 857 899 918 N
+ AO IY AW s n/a 5 857 881 918 N
+ AO IY AY s n/a 5 857 899 918 N
+ AO IY B b n/a 5 855 887 922 N
+ AO IY B s n/a 5 857 887 922 N
+ AO IY CH b n/a 5 855 881 919 N
+ AO IY CH s n/a 5 857 881 919 N
+ AO IY D b n/a 5 855 881 914 N
+ AO IY D s n/a 5 857 881 914 N
+ AO IY DH s n/a 5 857 881 920 N
+ AO IY EH b n/a 5 855 881 918 N
+ AO IY EH s n/a 5 857 881 918 N
+ AO IY ER s n/a 5 871 911 936 N
+ AO IY EY s n/a 5 857 881 918 N
+ AO IY F b n/a 5 855 887 922 N
+ AO IY F i n/a 5 857 887 922 N
+ AO IY F s n/a 5 857 887 922 N
+ AO IY G b n/a 5 855 881 920 N
+ AO IY G i n/a 5 857 881 920 N
+ AO IY G s n/a 5 857 881 920 N
+ AO IY HH s n/a 5 857 881 919 N
+ AO IY IH s n/a 5 857 881 916 N
+ AO IY IY b n/a 5 855 881 916 N
+ AO IY IY s n/a 5 857 881 916 N
+ AO IY JH b n/a 5 855 881 920 N
+ AO IY JH s n/a 5 857 881 920 N
+ AO IY K b n/a 5 855 886 919 N
+ AO IY K i n/a 5 857 886 919 N
+ AO IY K s n/a 5 857 886 919 N
+ AO IY L b n/a 5 855 897 930 N
+ AO IY L i n/a 5 857 899 928 N
+ AO IY L s n/a 5 857 899 928 N
+ AO IY M b n/a 5 855 890 926 N
+ AO IY M s n/a 5 857 894 926 N
+ AO IY N b n/a 5 855 890 924 N
+ AO IY N i n/a 5 857 894 924 N
+ AO IY N s n/a 5 857 894 924 N
+ AO IY NG b n/a 5 855 894 926 N
+ AO IY NG i n/a 5 857 894 926 N
+ AO IY NG s n/a 5 857 894 926 N
+ AO IY OW s n/a 5 857 899 918 N
+ AO IY OY s n/a 5 857 899 918 N
+ AO IY P b n/a 5 855 887 922 N
+ AO IY P i n/a 5 857 887 922 N
+ AO IY P s n/a 5 857 887 922 N
+ AO IY R b n/a 5 869 911 936 N
+ AO IY R i n/a 5 871 907 935 N
+ AO IY R s n/a 5 871 911 936 N
+ AO IY S b n/a 5 855 881 921 N
+ AO IY S i n/a 5 857 881 921 N
+ AO IY S s n/a 5 857 881 921 N
+ AO IY SH b n/a 5 855 881 919 N
+ AO IY SH s n/a 5 857 881 919 N
+ AO IY SIL s n/a 5 857 881 918 N
+ AO IY T b n/a 5 855 886 914 N
+ AO IY T i n/a 5 857 886 914 N
+ AO IY T s n/a 5 857 886 914 N
+ AO IY TH b n/a 5 855 881 921 N
+ AO IY TH i n/a 5 857 881 921 N
+ AO IY TH s n/a 5 857 881 921 N
+ AO IY UH s n/a 5 857 899 916 N
+ AO IY UW s n/a 5 857 899 916 N
+ AO IY V s n/a 5 857 887 922 N
+ AO IY W s n/a 5 857 899 928 N
+ AO IY Y s n/a 5 857 881 916 N
+ AO IY Z b n/a 5 855 881 915 N
+ AO IY Z s n/a 5 857 881 915 N
+ AO IY ZH s n/a 5 857 881 920 N
+ AO JH AA e n/a 5 858 899 918 N
+ AO JH AA s n/a 5 858 899 918 N
+ AO JH AE e n/a 5 858 881 918 N
+ AO JH AE i n/a 5 858 881 918 N
+ AO JH AE s n/a 5 858 881 918 N
+ AO JH AH e n/a 5 858 881 918 N
+ AO JH AH s n/a 5 858 881 918 N
+ AO JH AO e n/a 5 858 899 918 N
+ AO JH AO s n/a 5 858 899 918 N
+ AO JH AW e n/a 5 858 881 918 N
+ AO JH AW s n/a 5 858 881 918 N
+ AO JH AY e n/a 5 858 899 918 N
+ AO JH AY s n/a 5 858 899 918 N
+ AO JH B b n/a 5 854 887 922 N
+ AO JH B e n/a 5 858 887 922 N
+ AO JH B i n/a 5 858 887 922 N
+ AO JH B s n/a 5 858 887 922 N
+ AO JH CH b n/a 5 853 881 919 N
+ AO JH CH e n/a 5 858 881 919 N
+ AO JH CH i n/a 5 858 881 919 N
+ AO JH CH s n/a 5 858 881 919 N
+ AO JH D b n/a 5 853 881 914 N
+ AO JH D e n/a 5 858 881 914 N
+ AO JH D i n/a 5 858 881 914 N
+ AO JH D s n/a 5 858 881 914 N
+ AO JH DH e n/a 5 858 881 920 N
+ AO JH DH s n/a 5 858 881 920 N
+ AO JH EH b n/a 5 853 881 918 N
+ AO JH EH e n/a 5 858 881 918 N
+ AO JH EH s n/a 5 858 881 918 N
+ AO JH ER e n/a 5 870 911 936 N
+ AO JH ER s n/a 5 870 911 936 N
+ AO JH EY e n/a 5 858 881 918 N
+ AO JH EY s n/a 5 858 881 918 N
+ AO JH F b n/a 5 854 887 922 N
+ AO JH F e n/a 5 858 887 922 N
+ AO JH F i n/a 5 858 887 922 N
+ AO JH F s n/a 5 858 887 922 N
+ AO JH G b n/a 5 853 881 920 N
+ AO JH G e n/a 5 858 881 920 N
+ AO JH G i n/a 5 858 881 920 N
+ AO JH G s n/a 5 858 881 920 N
+ AO JH HH e n/a 5 858 881 919 N
+ AO JH HH s n/a 5 858 881 919 N
+ AO JH IH e n/a 5 858 881 916 N
+ AO JH IH i n/a 5 858 881 916 N
+ AO JH IH s n/a 5 858 881 916 N
+ AO JH IY b n/a 5 853 881 916 N
+ AO JH IY e n/a 5 858 881 916 N
+ AO JH IY s n/a 5 858 881 916 N
+ AO JH JH b n/a 5 853 881 920 N
+ AO JH JH e n/a 5 858 881 920 N
+ AO JH JH s n/a 5 858 881 920 N
+ AO JH K b n/a 5 853 886 919 N
+ AO JH K e n/a 5 858 886 919 N
+ AO JH K s n/a 5 858 886 919 N
+ AO JH L b n/a 5 853 897 929 N
+ AO JH L e n/a 5 858 899 928 N
+ AO JH L i n/a 5 858 899 928 N
+ AO JH L s n/a 5 858 899 928 N
+ AO JH M b n/a 5 851 890 926 N
+ AO JH M e n/a 5 858 894 926 N
+ AO JH M i n/a 5 858 894 926 N
+ AO JH M s n/a 5 858 894 926 N
+ AO JH N b n/a 5 851 890 924 N
+ AO JH N e n/a 5 858 894 923 N
+ AO JH N i n/a 5 858 894 923 N
+ AO JH N s n/a 5 858 894 923 N
+ AO JH NG b n/a 5 851 894 926 N
+ AO JH NG e n/a 5 858 894 926 N
+ AO JH NG i n/a 5 858 894 926 N
+ AO JH NG s n/a 5 858 894 926 N
+ AO JH OW e n/a 5 858 899 918 N
+ AO JH OW s n/a 5 858 899 918 N
+ AO JH OY e n/a 5 858 899 918 N
+ AO JH OY s n/a 5 858 899 918 N
+ AO JH P b n/a 5 854 887 922 N
+ AO JH P e n/a 5 858 887 922 N
+ AO JH P s n/a 5 858 887 922 N
+ AO JH R b n/a 5 870 911 936 N
+ AO JH R e n/a 5 870 911 936 N
+ AO JH R i n/a 5 871 907 934 N
+ AO JH R s n/a 5 870 911 936 N
+ AO JH S b n/a 5 853 881 921 N
+ AO JH S e n/a 5 858 881 921 N
+ AO JH S i n/a 5 858 881 921 N
+ AO JH S s n/a 5 858 881 921 N
+ AO JH SH b n/a 5 853 881 919 N
+ AO JH SH e n/a 5 858 881 919 N
+ AO JH SH s n/a 5 858 881 919 N
+ AO JH SIL e n/a 5 858 881 918 N
+ AO JH SIL s n/a 5 858 881 918 N
+ AO JH T b n/a 5 853 886 914 N
+ AO JH T e n/a 5 858 886 914 N
+ AO JH T s n/a 5 858 886 914 N
+ AO JH TH b n/a 5 853 881 921 N
+ AO JH TH e n/a 5 858 881 921 N
+ AO JH TH s n/a 5 858 881 921 N
+ AO JH UH e n/a 5 858 899 916 N
+ AO JH UH s n/a 5 858 899 916 N
+ AO JH UW e n/a 5 858 899 916 N
+ AO JH UW s n/a 5 858 899 916 N
+ AO JH V e n/a 5 858 887 922 N
+ AO JH V s n/a 5 858 887 922 N
+ AO JH W e n/a 5 858 899 928 N
+ AO JH W s n/a 5 858 899 928 N
+ AO JH Y e n/a 5 858 881 916 N
+ AO JH Y s n/a 5 858 881 916 N
+ AO JH Z b n/a 5 853 881 915 N
+ AO JH Z e n/a 5 858 881 915 N
+ AO JH Z i n/a 5 858 881 915 N
+ AO JH Z s n/a 5 858 881 915 N
+ AO JH ZH e n/a 5 858 881 920 N
+ AO JH ZH s n/a 5 858 881 920 N
+ AO K AA e n/a 5 862 899 918 N
+ AO K AA s n/a 5 862 899 918 N
+ AO K AE e n/a 5 862 881 918 N
+ AO K AE s n/a 5 862 881 918 N
+ AO K AH e n/a 5 862 881 918 N
+ AO K AH s n/a 5 862 881 918 N
+ AO K AO e n/a 5 862 899 918 N
+ AO K AO s n/a 5 862 899 918 N
+ AO K AW e n/a 5 862 881 918 N
+ AO K AW s n/a 5 862 881 918 N
+ AO K AY e n/a 5 862 899 918 N
+ AO K AY s n/a 5 862 899 918 N
+ AO K B b n/a 5 854 887 922 N
+ AO K B e n/a 5 862 887 922 N
+ AO K B i n/a 5 862 887 922 N
+ AO K B s n/a 5 862 887 922 N
+ AO K CH b n/a 5 853 881 919 N
+ AO K CH e n/a 5 862 881 919 N
+ AO K CH i n/a 5 862 881 919 N
+ AO K CH s n/a 5 862 881 919 N
+ AO K D b n/a 5 853 881 914 N
+ AO K D e n/a 5 862 881 914 N
+ AO K D i n/a 5 862 881 914 N
+ AO K D s n/a 5 862 881 914 N
+ AO K DH e n/a 5 862 881 920 N
+ AO K DH s n/a 5 862 881 920 N
+ AO K EH b n/a 5 853 881 918 N
+ AO K EH e n/a 5 862 881 918 N
+ AO K EH s n/a 5 862 881 918 N
+ AO K ER e n/a 5 878 911 936 N
+ AO K ER s n/a 5 878 911 936 N
+ AO K EY e n/a 5 862 881 918 N
+ AO K EY s n/a 5 862 881 918 N
+ AO K F b n/a 5 854 887 922 N
+ AO K F e n/a 5 862 887 922 N
+ AO K F i n/a 5 862 887 922 N
+ AO K F s n/a 5 862 887 922 N
+ AO K G b n/a 5 853 881 920 N
+ AO K G e n/a 5 862 881 920 N
+ AO K G i n/a 5 862 881 920 N
+ AO K G s n/a 5 862 881 920 N
+ AO K HH e n/a 5 862 881 919 N
+ AO K HH s n/a 5 862 881 919 N
+ AO K IH e n/a 5 862 881 916 N
+ AO K IH i n/a 5 862 881 916 N
+ AO K IH s n/a 5 862 881 916 N
+ AO K IY b n/a 5 853 881 916 N
+ AO K IY e n/a 5 862 881 916 N
+ AO K IY i n/a 5 862 881 916 N
+ AO K IY s n/a 5 862 881 916 N
+ AO K JH b n/a 5 853 881 920 N
+ AO K JH e n/a 5 862 881 920 N
+ AO K JH s n/a 5 862 881 920 N
+ AO K K b n/a 5 853 886 919 N
+ AO K K e n/a 5 862 886 919 N
+ AO K K i n/a 5 862 886 919 N
+ AO K K s n/a 5 862 886 919 N
+ AO K L b n/a 5 853 897 929 N
+ AO K L e n/a 5 862 899 928 N
+ AO K L i n/a 5 862 899 928 N
+ AO K L s n/a 5 862 899 928 N
+ AO K M b n/a 5 851 890 926 N
+ AO K M e n/a 5 862 894 926 N
+ AO K M i n/a 5 862 894 926 N
+ AO K M s n/a 5 862 894 926 N
+ AO K N b n/a 5 851 890 924 N
+ AO K N e n/a 5 862 894 923 N
+ AO K N i n/a 5 862 894 923 N
+ AO K N s n/a 5 862 894 923 N
+ AO K NG b n/a 5 851 894 926 N
+ AO K NG e n/a 5 862 894 926 N
+ AO K NG i n/a 5 862 894 926 N
+ AO K NG s n/a 5 862 894 926 N
+ AO K OW e n/a 5 862 899 918 N
+ AO K OW s n/a 5 862 899 918 N
+ AO K OY e n/a 5 862 899 918 N
+ AO K OY s n/a 5 862 899 918 N
+ AO K P b n/a 5 854 887 922 N
+ AO K P e n/a 5 862 887 922 N
+ AO K P i n/a 5 862 887 922 N
+ AO K P s n/a 5 862 887 922 N
+ AO K R b n/a 5 878 911 936 N
+ AO K R e n/a 5 878 911 936 N
+ AO K R i n/a 5 880 906 933 N
+ AO K R s n/a 5 878 911 936 N
+ AO K S b n/a 5 853 881 921 N
+ AO K S e n/a 5 862 881 921 N
+ AO K S i n/a 5 862 881 921 N
+ AO K S s n/a 5 862 881 921 N
+ AO K SH b n/a 5 853 881 919 N
+ AO K SH e n/a 5 862 881 919 N
+ AO K SH i n/a 5 862 881 919 N
+ AO K SH s n/a 5 862 881 919 N
+ AO K SIL e n/a 5 862 881 918 N
+ AO K SIL s n/a 5 862 881 918 N
+ AO K T b n/a 5 853 886 914 N
+ AO K T e n/a 5 862 886 914 N
+ AO K T i n/a 5 862 886 914 N
+ AO K T s n/a 5 862 886 914 N
+ AO K TH b n/a 5 853 881 921 N
+ AO K TH e n/a 5 862 881 921 N
+ AO K TH i n/a 5 862 881 921 N
+ AO K TH s n/a 5 862 881 921 N
+ AO K UH e n/a 5 862 899 916 N
+ AO K UH s n/a 5 862 899 916 N
+ AO K UW e n/a 5 862 899 916 N
+ AO K UW s n/a 5 862 899 916 N
+ AO K V e n/a 5 862 887 922 N
+ AO K V i n/a 5 862 887 922 N
+ AO K V s n/a 5 862 887 922 N
+ AO K W e n/a 5 862 899 928 N
+ AO K W i n/a 5 862 899 928 N
+ AO K W s n/a 5 862 899 928 N
+ AO K Y e n/a 5 862 881 916 N
+ AO K Y s n/a 5 862 881 916 N
+ AO K Z b n/a 5 853 881 915 N
+ AO K Z e n/a 5 862 881 915 N
+ AO K Z i n/a 5 862 881 915 N
+ AO K Z s n/a 5 862 881 915 N
+ AO K ZH e n/a 5 862 881 920 N
+ AO K ZH s n/a 5 862 881 920 N
+ AO L AA e n/a 5 843 898 918 N
+ AO L AA s n/a 5 843 898 918 N
+ AO L AE e n/a 5 843 882 918 N
+ AO L AE s n/a 5 843 882 918 N
+ AO L AH e n/a 5 843 882 918 N
+ AO L AH s n/a 5 843 882 918 N
+ AO L AO e n/a 5 843 898 918 N
+ AO L AO s n/a 5 843 898 918 N
+ AO L AW e n/a 5 843 882 918 N
+ AO L AW s n/a 5 843 882 918 N
+ AO L AY e n/a 5 843 898 918 N
+ AO L AY s n/a 5 843 898 918 N
+ AO L B b n/a 5 847 883 922 N
+ AO L B e n/a 5 843 882 922 N
+ AO L B i n/a 5 843 883 922 N
+ AO L B s n/a 5 843 883 922 N
+ AO L CH b n/a 5 847 883 919 N
+ AO L CH e n/a 5 843 882 919 N
+ AO L CH i n/a 5 843 883 919 N
+ AO L CH s n/a 5 843 883 919 N
+ AO L D b n/a 5 847 883 914 N
+ AO L D e n/a 5 843 882 914 N
+ AO L D i n/a 5 843 883 914 N
+ AO L D s n/a 5 843 883 914 N
+ AO L DH e n/a 5 843 882 920 N
+ AO L DH i n/a 5 843 882 920 N
+ AO L DH s n/a 5 843 882 920 N
+ AO L EH b n/a 5 847 882 918 N
+ AO L EH e n/a 5 843 882 918 N
+ AO L EH i n/a 5 843 882 918 N
+ AO L EH s n/a 5 843 882 918 N
+ AO L ER e n/a 5 874 913 936 N
+ AO L ER i n/a 5 874 910 935 N
+ AO L ER s n/a 5 874 912 936 N
+ AO L EY e n/a 5 843 882 918 N
+ AO L EY s n/a 5 843 882 918 N
+ AO L F b n/a 5 847 883 922 N
+ AO L F e n/a 5 843 882 922 N
+ AO L F i n/a 5 843 883 922 N
+ AO L F s n/a 5 843 883 922 N
+ AO L G b n/a 5 847 883 920 N
+ AO L G e n/a 5 843 882 920 N
+ AO L G i n/a 5 843 883 920 N
+ AO L G s n/a 5 843 883 920 N
+ AO L HH e n/a 5 843 882 919 N
+ AO L HH i n/a 5 843 882 919 N
+ AO L HH s n/a 5 843 882 919 N
+ AO L IH e n/a 5 843 882 916 N
+ AO L IH i n/a 5 843 882 916 N
+ AO L IH s n/a 5 843 882 916 N
+ AO L IY b n/a 5 847 882 916 N
+ AO L IY e n/a 5 843 882 916 N
+ AO L IY i n/a 5 843 882 916 N
+ AO L IY s n/a 5 843 882 916 N
+ AO L JH b n/a 5 847 881 920 N
+ AO L JH e n/a 5 843 882 920 N
+ AO L JH i n/a 5 843 881 920 N
+ AO L JH s n/a 5 843 881 920 N
+ AO L K b n/a 5 847 883 919 N
+ AO L K e n/a 5 843 882 919 N
+ AO L K i n/a 5 843 883 919 N
+ AO L K s n/a 5 843 883 919 N
+ AO L L b n/a 5 847 898 929 N
+ AO L L e n/a 5 843 898 928 N
+ AO L L i n/a 5 843 898 928 N
+ AO L L s n/a 5 843 898 928 N
+ AO L M b n/a 5 847 890 926 N
+ AO L M e n/a 5 845 895 926 N
+ AO L M i n/a 5 845 895 926 N
+ AO L M s n/a 5 845 895 926 N
+ AO L N b n/a 5 847 890 924 N
+ AO L N e n/a 5 845 895 923 N
+ AO L N i n/a 5 845 895 923 N
+ AO L N s n/a 5 845 895 923 N
+ AO L NG b n/a 5 847 895 926 N
+ AO L NG e n/a 5 845 895 926 N
+ AO L NG i n/a 5 845 895 926 N
+ AO L NG s n/a 5 845 895 926 N
+ AO L OW e n/a 5 843 898 918 N
+ AO L OW s n/a 5 843 898 918 N
+ AO L OY e n/a 5 843 898 918 N
+ AO L OY s n/a 5 843 898 918 N
+ AO L P b n/a 5 847 883 922 N
+ AO L P e n/a 5 843 882 922 N
+ AO L P i n/a 5 843 883 922 N
+ AO L P s n/a 5 843 883 922 N
+ AO L R b n/a 5 876 912 936 N
+ AO L R e n/a 5 874 913 936 N
+ AO L R i n/a 5 874 910 935 N
+ AO L R s n/a 5 874 912 936 N
+ AO L S b n/a 5 847 883 921 N
+ AO L S e n/a 5 843 882 921 N
+ AO L S i n/a 5 843 883 921 N
+ AO L S s n/a 5 843 883 921 N
+ AO L SH b n/a 5 847 883 919 N
+ AO L SH e n/a 5 843 882 919 N
+ AO L SH i n/a 5 843 883 919 N
+ AO L SH s n/a 5 843 883 919 N
+ AO L SIL e n/a 5 843 882 918 N
+ AO L SIL s n/a 5 843 882 918 N
+ AO L T b n/a 5 847 883 914 N
+ AO L T e n/a 5 843 882 914 N
+ AO L T i n/a 5 843 883 914 N
+ AO L T s n/a 5 843 883 914 N
+ AO L TH b n/a 5 847 883 921 N
+ AO L TH e n/a 5 843 882 921 N
+ AO L TH i n/a 5 843 883 921 N
+ AO L TH s n/a 5 843 883 921 N
+ AO L UH e n/a 5 843 898 916 N
+ AO L UH s n/a 5 843 898 916 N
+ AO L UW e n/a 5 843 898 916 N
+ AO L UW s n/a 5 843 898 916 N
+ AO L V e n/a 5 843 882 922 N
+ AO L V i n/a 5 843 882 922 N
+ AO L V s n/a 5 843 882 922 N
+ AO L W e n/a 5 843 898 928 N
+ AO L W s n/a 5 843 898 928 N
+ AO L Y e n/a 5 843 882 916 N
+ AO L Y i n/a 5 843 881 916 N
+ AO L Y s n/a 5 843 881 916 N
+ AO L Z b n/a 5 847 882 915 N
+ AO L Z e n/a 5 843 882 915 N
+ AO L Z i n/a 5 843 882 915 N
+ AO L Z s n/a 5 843 882 915 N
+ AO L ZH e n/a 5 843 882 920 N
+ AO L ZH s n/a 5 843 881 920 N
+ AO M AA e n/a 5 847 901 918 N
+ AO M AA s n/a 5 847 901 918 N
+ AO M AE e n/a 5 847 882 918 N
+ AO M AE s n/a 5 847 882 918 N
+ AO M AH e n/a 5 847 882 918 N
+ AO M AH s n/a 5 847 882 918 N
+ AO M AO e n/a 5 847 901 918 N
+ AO M AO s n/a 5 847 901 918 N
+ AO M AW e n/a 5 847 882 918 N
+ AO M AW s n/a 5 847 882 918 N
+ AO M AY e n/a 5 847 901 918 N
+ AO M AY s n/a 5 847 901 918 N
+ AO M B b n/a 5 859 887 922 N
+ AO M B e n/a 5 847 887 922 N
+ AO M B i n/a 5 844 887 922 N
+ AO M B s n/a 5 847 887 922 N
+ AO M CH b n/a 5 859 883 919 N
+ AO M CH e n/a 5 847 882 919 N
+ AO M CH i n/a 5 844 883 919 N
+ AO M CH s n/a 5 847 883 919 N
+ AO M D b n/a 5 859 883 914 N
+ AO M D e n/a 5 847 882 914 N
+ AO M D i n/a 5 844 883 914 N
+ AO M D s n/a 5 847 883 914 N
+ AO M DH e n/a 5 847 882 920 N
+ AO M DH i n/a 5 844 882 920 N
+ AO M DH s n/a 5 847 882 920 N
+ AO M EH b n/a 5 859 882 918 N
+ AO M EH e n/a 5 847 882 918 N
+ AO M EH s n/a 5 847 882 918 N
+ AO M ER e n/a 5 876 905 932 N
+ AO M ER i n/a 5 872 903 931 N
+ AO M ER s n/a 5 876 905 932 N
+ AO M EY e n/a 5 847 882 918 N
+ AO M EY s n/a 5 847 882 918 N
+ AO M F b n/a 5 859 887 922 N
+ AO M F e n/a 5 847 887 922 N
+ AO M F i n/a 5 844 887 922 N
+ AO M F s n/a 5 847 887 922 N
+ AO M G b n/a 5 859 883 920 N
+ AO M G e n/a 5 847 882 920 N
+ AO M G i n/a 5 844 883 920 N
+ AO M G s n/a 5 847 883 920 N
+ AO M HH e n/a 5 847 882 919 N
+ AO M HH s n/a 5 847 882 919 N
+ AO M IH e n/a 5 847 882 916 N
+ AO M IH s n/a 5 847 882 916 N
+ AO M IY b n/a 5 859 882 916 N
+ AO M IY e n/a 5 847 882 916 N
+ AO M IY i n/a 5 844 882 916 N
+ AO M IY s n/a 5 847 882 916 N
+ AO M JH b n/a 5 859 883 920 N
+ AO M JH e n/a 5 847 882 920 N
+ AO M JH i n/a 5 844 883 920 N
+ AO M JH s n/a 5 847 883 920 N
+ AO M K b n/a 5 859 886 919 N
+ AO M K e n/a 5 847 886 919 N
+ AO M K i n/a 5 844 886 919 N
+ AO M K s n/a 5 847 886 919 N
+ AO M L b n/a 5 859 901 929 N
+ AO M L e n/a 5 847 901 929 N
+ AO M L i n/a 5 844 901 929 N
+ AO M L s n/a 5 847 901 929 N
+ AO M M b n/a 5 859 890 926 N
+ AO M M e n/a 5 847 894 926 N
+ AO M M i n/a 5 845 894 926 N
+ AO M M s n/a 5 847 894 926 N
+ AO M N b n/a 5 859 890 924 N
+ AO M N e n/a 5 847 894 923 N
+ AO M N i n/a 5 845 894 923 N
+ AO M N s n/a 5 847 894 923 N
+ AO M NG b n/a 5 859 894 926 N
+ AO M NG e n/a 5 847 894 926 N
+ AO M NG i n/a 5 845 894 926 N
+ AO M NG s n/a 5 847 894 926 N
+ AO M OW e n/a 5 847 901 918 N
+ AO M OW s n/a 5 847 901 918 N
+ AO M OY e n/a 5 847 901 918 N
+ AO M OY s n/a 5 847 901 918 N
+ AO M P b n/a 5 859 887 922 N
+ AO M P e n/a 5 847 887 922 N
+ AO M P s n/a 5 847 887 922 N
+ AO M R b n/a 5 876 905 932 N
+ AO M R e n/a 5 876 905 932 N
+ AO M R i n/a 5 872 903 931 N
+ AO M R s n/a 5 876 905 932 N
+ AO M S b n/a 5 859 883 921 N
+ AO M S e n/a 5 847 882 921 N
+ AO M S i n/a 5 844 883 921 N
+ AO M S s n/a 5 847 883 921 N
+ AO M SH b n/a 5 859 883 919 N
+ AO M SH e n/a 5 847 882 919 N
+ AO M SH i n/a 5 844 883 919 N
+ AO M SH s n/a 5 847 883 919 N
+ AO M SIL e n/a 5 847 882 918 N
+ AO M SIL s n/a 5 847 882 918 N
+ AO M T b n/a 5 859 886 914 N
+ AO M T e n/a 5 847 886 914 N
+ AO M T i n/a 5 844 886 914 N
+ AO M T s n/a 5 847 886 914 N
+ AO M TH b n/a 5 859 883 921 N
+ AO M TH e n/a 5 847 882 921 N
+ AO M TH i n/a 5 844 883 921 N
+ AO M TH s n/a 5 847 883 921 N
+ AO M UH e n/a 5 847 901 916 N
+ AO M UH s n/a 5 847 901 916 N
+ AO M UW e n/a 5 847 901 916 N
+ AO M UW s n/a 5 847 901 916 N
+ AO M V e n/a 5 847 887 922 N
+ AO M V i n/a 5 844 887 922 N
+ AO M V s n/a 5 847 887 922 N
+ AO M W e n/a 5 847 901 929 N
+ AO M W s n/a 5 847 901 929 N
+ AO M Y e n/a 5 847 882 916 N
+ AO M Y s n/a 5 847 882 916 N
+ AO M Z b n/a 5 859 882 915 N
+ AO M Z e n/a 5 847 882 915 N
+ AO M Z i n/a 5 844 882 915 N
+ AO M Z s n/a 5 847 882 915 N
+ AO M ZH e n/a 5 847 882 920 N
+ AO M ZH s n/a 5 847 882 920 N
+ AO N AA e n/a 5 858 899 918 N
+ AO N AA s n/a 5 858 899 918 N
+ AO N AE e n/a 5 858 884 918 N
+ AO N AE s n/a 5 858 884 918 N
+ AO N AH e n/a 5 858 884 918 N
+ AO N AH s n/a 5 858 884 918 N
+ AO N AO e n/a 5 858 899 918 N
+ AO N AO s n/a 5 858 899 918 N
+ AO N AW e n/a 5 858 884 918 N
+ AO N AW s n/a 5 858 884 918 N
+ AO N AY e n/a 5 858 899 918 N
+ AO N AY s n/a 5 858 899 918 N
+ AO N B b n/a 5 852 887 922 N
+ AO N B e n/a 5 858 887 922 N
+ AO N B i n/a 5 858 887 922 N
+ AO N B s n/a 5 858 887 922 N
+ AO N CH b n/a 5 852 884 919 N
+ AO N CH e n/a 5 858 884 919 N
+ AO N CH i n/a 5 858 884 919 N
+ AO N CH s n/a 5 858 884 919 N
+ AO N D b n/a 5 852 885 914 N
+ AO N D e n/a 5 858 885 914 N
+ AO N D i n/a 5 858 885 914 N
+ AO N D s n/a 5 858 885 914 N
+ AO N DH e n/a 5 858 884 920 N
+ AO N DH s n/a 5 858 884 920 N
+ AO N EH b n/a 5 852 884 918 N
+ AO N EH e n/a 5 858 884 918 N
+ AO N EH s n/a 5 858 884 918 N
+ AO N ER e n/a 5 866 911 936 N
+ AO N ER i n/a 5 865 907 935 N
+ AO N ER s n/a 5 866 911 936 N
+ AO N EY e n/a 5 858 884 918 N
+ AO N EY s n/a 5 858 884 918 N
+ AO N F b n/a 5 852 887 922 N
+ AO N F e n/a 5 858 887 922 N
+ AO N F i n/a 5 858 887 922 N
+ AO N F s n/a 5 858 887 922 N
+ AO N G b n/a 5 852 884 920 N
+ AO N G e n/a 5 858 884 920 N
+ AO N G i n/a 5 858 884 920 N
+ AO N G s n/a 5 858 884 920 N
+ AO N HH e n/a 5 858 884 919 N
+ AO N HH i n/a 5 858 884 919 N
+ AO N HH s n/a 5 858 884 919 N
+ AO N IH e n/a 5 858 884 916 N
+ AO N IH i n/a 5 858 884 916 N
+ AO N IH s n/a 5 858 884 916 N
+ AO N IY b n/a 5 852 884 916 N
+ AO N IY e n/a 5 858 884 916 N
+ AO N IY s n/a 5 858 884 916 N
+ AO N JH b n/a 5 852 884 920 N
+ AO N JH e n/a 5 858 884 920 N
+ AO N JH s n/a 5 858 884 920 N
+ AO N K b n/a 5 852 886 919 N
+ AO N K e n/a 5 858 886 919 N
+ AO N K i n/a 5 858 886 919 N
+ AO N K s n/a 5 858 886 919 N
+ AO N L b n/a 5 852 897 929 N
+ AO N L e n/a 5 858 899 928 N
+ AO N L i n/a 5 858 899 928 N
+ AO N L s n/a 5 858 899 928 N
+ AO N M b n/a 5 852 890 926 N
+ AO N M e n/a 5 858 894 926 N
+ AO N M i n/a 5 858 894 926 N
+ AO N M s n/a 5 858 894 926 N
+ AO N N b n/a 5 852 890 924 N
+ AO N N e n/a 5 858 894 923 N
+ AO N N i n/a 5 858 894 923 N
+ AO N N s n/a 5 858 894 923 N
+ AO N NG b n/a 5 852 894 926 N
+ AO N NG e n/a 5 858 894 926 N
+ AO N NG i n/a 5 858 894 926 N
+ AO N NG s n/a 5 858 894 926 N
+ AO N OW e n/a 5 858 899 918 N
+ AO N OW s n/a 5 858 899 918 N
+ AO N OY e n/a 5 858 899 918 N
+ AO N OY s n/a 5 858 899 918 N
+ AO N P b n/a 5 852 887 922 N
+ AO N P e n/a 5 858 887 922 N
+ AO N P i n/a 5 858 887 922 N
+ AO N P s n/a 5 858 887 922 N
+ AO N R b n/a 5 866 911 936 N
+ AO N R e n/a 5 866 911 936 N
+ AO N R i n/a 5 865 907 935 N
+ AO N R s n/a 5 866 911 936 N
+ AO N S b n/a 5 852 885 921 N
+ AO N S e n/a 5 858 885 921 N
+ AO N S i n/a 5 858 885 921 N
+ AO N S s n/a 5 858 885 921 N
+ AO N SH b n/a 5 852 884 919 N
+ AO N SH e n/a 5 858 884 919 N
+ AO N SH i n/a 5 858 884 919 N
+ AO N SH s n/a 5 858 884 919 N
+ AO N SIL e n/a 5 858 884 918 N
+ AO N SIL s n/a 5 858 884 918 N
+ AO N T b n/a 5 852 885 914 N
+ AO N T e n/a 5 858 885 914 N
+ AO N T i n/a 5 858 885 914 N
+ AO N T s n/a 5 858 885 914 N
+ AO N TH b n/a 5 852 884 921 N
+ AO N TH e n/a 5 858 884 921 N
+ AO N TH i n/a 5 858 884 921 N
+ AO N TH s n/a 5 858 884 921 N
+ AO N UH e n/a 5 858 899 916 N
+ AO N UH s n/a 5 858 899 916 N
+ AO N UW e n/a 5 858 899 916 N
+ AO N UW s n/a 5 858 899 916 N
+ AO N V e n/a 5 858 887 922 N
+ AO N V i n/a 5 858 887 922 N
+ AO N V s n/a 5 858 887 922 N
+ AO N W e n/a 5 858 899 928 N
+ AO N W s n/a 5 858 899 928 N
+ AO N Y e n/a 5 858 884 916 N
+ AO N Y s n/a 5 858 884 916 N
+ AO N Z b n/a 5 852 885 915 N
+ AO N Z e n/a 5 858 885 915 N
+ AO N Z i n/a 5 858 885 915 N
+ AO N Z s n/a 5 858 885 915 N
+ AO N ZH e n/a 5 858 884 920 N
+ AO N ZH i n/a 5 858 884 920 N
+ AO N ZH s n/a 5 858 884 920 N
+ AO NG AA s n/a 5 858 899 918 N
+ AO NG AE s n/a 5 858 881 918 N
+ AO NG AH s n/a 5 858 881 918 N
+ AO NG AO s n/a 5 858 899 918 N
+ AO NG AW s n/a 5 858 881 918 N
+ AO NG AY s n/a 5 858 899 918 N
+ AO NG B b n/a 5 852 887 922 N
+ AO NG B s n/a 5 858 887 922 N
+ AO NG CH b n/a 5 852 881 919 N
+ AO NG CH s n/a 5 858 881 919 N
+ AO NG D b n/a 5 852 881 914 N
+ AO NG D s n/a 5 858 881 914 N
+ AO NG DH s n/a 5 858 881 920 N
+ AO NG EH b n/a 5 852 881 918 N
+ AO NG EH s n/a 5 858 881 918 N
+ AO NG ER s n/a 5 869 911 936 N
+ AO NG EY s n/a 5 858 881 918 N
+ AO NG F b n/a 5 852 887 922 N
+ AO NG F s n/a 5 858 887 922 N
+ AO NG G b n/a 5 852 881 920 N
+ AO NG G s n/a 5 858 881 920 N
+ AO NG HH s n/a 5 858 881 919 N
+ AO NG IH s n/a 5 858 881 916 N
+ AO NG IY b n/a 5 852 881 916 N
+ AO NG IY s n/a 5 858 881 916 N
+ AO NG JH b n/a 5 852 881 920 N
+ AO NG JH s n/a 5 858 881 920 N
+ AO NG K b n/a 5 852 886 919 N
+ AO NG K s n/a 5 858 886 919 N
+ AO NG L b n/a 5 852 897 929 N
+ AO NG L s n/a 5 858 899 929 N
+ AO NG M b n/a 5 852 890 926 N
+ AO NG M s n/a 5 858 894 926 N
+ AO NG N b n/a 5 852 890 924 N
+ AO NG N i n/a 5 858 894 923 N
+ AO NG N s n/a 5 858 894 923 N
+ AO NG NG b n/a 5 852 894 926 N
+ AO NG NG s n/a 5 858 894 926 N
+ AO NG OW s n/a 5 858 899 918 N
+ AO NG OY s n/a 5 858 899 918 N
+ AO NG P b n/a 5 852 887 922 N
+ AO NG P s n/a 5 858 887 922 N
+ AO NG R b n/a 5 869 911 936 N
+ AO NG R s n/a 5 869 911 936 N
+ AO NG S b n/a 5 852 881 921 N
+ AO NG S s n/a 5 858 881 921 N
+ AO NG SH b n/a 5 852 881 919 N
+ AO NG SH s n/a 5 858 881 919 N
+ AO NG SIL s n/a 5 858 881 918 N
+ AO NG T b n/a 5 852 886 914 N
+ AO NG T s n/a 5 858 886 914 N
+ AO NG TH b n/a 5 852 881 921 N
+ AO NG TH s n/a 5 858 881 921 N
+ AO NG UH s n/a 5 858 899 916 N
+ AO NG UW s n/a 5 858 899 916 N
+ AO NG V s n/a 5 858 887 922 N
+ AO NG W s n/a 5 858 899 929 N
+ AO NG Y s n/a 5 858 881 916 N
+ AO NG Z b n/a 5 852 881 915 N
+ AO NG Z s n/a 5 858 881 915 N
+ AO NG ZH s n/a 5 858 881 920 N
+ AO OW AA s n/a 5 847 898 918 N
+ AO OW AE s n/a 5 847 881 918 N
+ AO OW AH s n/a 5 847 881 918 N
+ AO OW AO s n/a 5 847 898 918 N
+ AO OW AW s n/a 5 847 881 918 N
+ AO OW AY s n/a 5 847 898 918 N
+ AO OW B b n/a 5 847 887 922 N
+ AO OW B s n/a 5 847 887 922 N
+ AO OW CH b n/a 5 847 881 919 N
+ AO OW CH s n/a 5 847 881 919 N
+ AO OW D b n/a 5 847 881 917 N
+ AO OW D s n/a 5 847 881 917 N
+ AO OW DH s n/a 5 847 881 920 N
+ AO OW EH b n/a 5 847 881 918 N
+ AO OW EH s n/a 5 847 881 918 N
+ AO OW ER s n/a 5 876 913 936 N
+ AO OW EY s n/a 5 847 881 918 N
+ AO OW F b n/a 5 847 887 922 N
+ AO OW F s n/a 5 847 887 922 N
+ AO OW G b n/a 5 847 881 920 N
+ AO OW G s n/a 5 847 881 920 N
+ AO OW HH s n/a 5 847 881 919 N
+ AO OW IH s n/a 5 847 881 916 N
+ AO OW IY b n/a 5 847 881 916 N
+ AO OW IY s n/a 5 847 881 916 N
+ AO OW JH b n/a 5 847 881 920 N
+ AO OW JH s n/a 5 847 881 920 N
+ AO OW K b n/a 5 847 886 919 N
+ AO OW K s n/a 5 847 886 919 N
+ AO OW L b n/a 5 847 898 929 N
+ AO OW L i n/a 5 848 898 928 N
+ AO OW L s n/a 5 847 898 928 N
+ AO OW M b n/a 5 847 893 926 N
+ AO OW M s n/a 5 847 893 926 N
+ AO OW N b n/a 5 847 893 925 N
+ AO OW N s n/a 5 847 893 925 N
+ AO OW NG b n/a 5 847 893 926 N
+ AO OW NG s n/a 5 847 893 926 N
+ AO OW OW s n/a 5 847 898 918 N
+ AO OW OY s n/a 5 847 898 918 N
+ AO OW P b n/a 5 847 887 922 N
+ AO OW P i n/a 5 848 887 922 N
+ AO OW P s n/a 5 847 887 922 N
+ AO OW R b n/a 5 876 913 936 N
+ AO OW R i n/a 5 876 907 934 N
+ AO OW R s n/a 5 876 913 936 N
+ AO OW S b n/a 5 847 881 921 N
+ AO OW S i n/a 5 848 881 921 N
+ AO OW S s n/a 5 847 881 921 N
+ AO OW SH b n/a 5 847 881 919 N
+ AO OW SH s n/a 5 847 881 919 N
+ AO OW SIL s n/a 5 847 881 918 N
+ AO OW T b n/a 5 847 886 917 N
+ AO OW T i n/a 5 848 886 917 N
+ AO OW T s n/a 5 847 886 917 N
+ AO OW TH b n/a 5 847 881 921 N
+ AO OW TH s n/a 5 847 881 921 N
+ AO OW UH s n/a 5 847 898 916 N
+ AO OW UW s n/a 5 847 898 916 N
+ AO OW V s n/a 5 847 887 922 N
+ AO OW W s n/a 5 847 898 928 N
+ AO OW Y s n/a 5 847 881 916 N
+ AO OW Z b n/a 5 847 881 915 N
+ AO OW Z s n/a 5 847 881 915 N
+ AO OW ZH s n/a 5 847 881 920 N
+ AO OY AA s n/a 5 857 899 918 N
+ AO OY AE s n/a 5 857 881 918 N
+ AO OY AH s n/a 5 857 881 918 N
+ AO OY AO s n/a 5 857 899 918 N
+ AO OY AW s n/a 5 857 881 918 N
+ AO OY AY s n/a 5 857 899 918 N
+ AO OY B b n/a 5 855 887 922 N
+ AO OY B s n/a 5 857 887 922 N
+ AO OY CH b n/a 5 855 881 919 N
+ AO OY CH s n/a 5 857 881 919 N
+ AO OY D b n/a 5 855 881 914 N
+ AO OY D s n/a 5 857 881 914 N
+ AO OY DH s n/a 5 857 881 920 N
+ AO OY EH b n/a 5 855 881 918 N
+ AO OY EH s n/a 5 857 881 918 N
+ AO OY ER s n/a 5 871 911 936 N
+ AO OY EY s n/a 5 857 881 918 N
+ AO OY F b n/a 5 855 887 922 N
+ AO OY F s n/a 5 857 887 922 N
+ AO OY G b n/a 5 855 881 920 N
+ AO OY G s n/a 5 857 881 920 N
+ AO OY HH s n/a 5 857 881 919 N
+ AO OY IH s n/a 5 857 881 916 N
+ AO OY IY b n/a 5 855 881 916 N
+ AO OY IY s n/a 5 857 881 916 N
+ AO OY JH b n/a 5 855 881 920 N
+ AO OY JH s n/a 5 857 881 920 N
+ AO OY K b n/a 5 855 886 919 N
+ AO OY K s n/a 5 857 886 919 N
+ AO OY L b n/a 5 855 897 930 N
+ AO OY L s n/a 5 857 899 928 N
+ AO OY M b n/a 5 855 890 926 N
+ AO OY M s n/a 5 857 894 926 N
+ AO OY N b n/a 5 855 890 924 N
+ AO OY N s n/a 5 857 894 924 N
+ AO OY NG b n/a 5 855 894 926 N
+ AO OY NG s n/a 5 857 894 926 N
+ AO OY OW s n/a 5 857 899 918 N
+ AO OY OY s n/a 5 857 899 918 N
+ AO OY P b n/a 5 855 887 922 N
+ AO OY P s n/a 5 857 887 922 N
+ AO OY R b n/a 5 869 911 936 N
+ AO OY R s n/a 5 871 911 936 N
+ AO OY S b n/a 5 855 881 921 N
+ AO OY S s n/a 5 857 881 921 N
+ AO OY SH b n/a 5 855 881 919 N
+ AO OY SH s n/a 5 857 881 919 N
+ AO OY SIL s n/a 5 857 881 918 N
+ AO OY T b n/a 5 855 886 914 N
+ AO OY T s n/a 5 857 886 914 N
+ AO OY TH b n/a 5 855 881 921 N
+ AO OY TH s n/a 5 857 881 921 N
+ AO OY UH s n/a 5 857 899 916 N
+ AO OY UW s n/a 5 857 899 916 N
+ AO OY V s n/a 5 857 887 922 N
+ AO OY W s n/a 5 857 899 928 N
+ AO OY Y s n/a 5 857 881 916 N
+ AO OY Z b n/a 5 855 881 915 N
+ AO OY Z s n/a 5 857 881 915 N
+ AO OY ZH s n/a 5 857 881 920 N
+ AO P AA e n/a 5 861 900 918 N
+ AO P AA i n/a 5 861 900 918 N
+ AO P AA s n/a 5 861 900 918 N
+ AO P AE e n/a 5 861 881 918 N
+ AO P AE s n/a 5 861 881 918 N
+ AO P AH e n/a 5 861 881 918 N
+ AO P AH s n/a 5 861 881 918 N
+ AO P AO e n/a 5 861 900 918 N
+ AO P AO s n/a 5 861 900 918 N
+ AO P AW e n/a 5 861 881 918 N
+ AO P AW s n/a 5 861 881 918 N
+ AO P AY e n/a 5 861 900 918 N
+ AO P AY s n/a 5 861 900 918 N
+ AO P B b n/a 5 859 887 922 N
+ AO P B e n/a 5 861 887 922 N
+ AO P B s n/a 5 861 887 922 N
+ AO P CH b n/a 5 859 881 919 N
+ AO P CH e n/a 5 861 881 919 N
+ AO P CH s n/a 5 861 881 919 N
+ AO P D b n/a 5 859 881 914 N
+ AO P D e n/a 5 861 881 914 N
+ AO P D i n/a 5 861 881 914 N
+ AO P D s n/a 5 861 881 914 N
+ AO P DH e n/a 5 861 881 920 N
+ AO P DH s n/a 5 861 881 920 N
+ AO P EH b n/a 5 859 881 918 N
+ AO P EH e n/a 5 861 881 918 N
+ AO P EH s n/a 5 861 881 918 N
+ AO P ER e n/a 5 878 906 932 N
+ AO P ER i n/a 5 879 906 933 N
+ AO P ER s n/a 5 878 906 932 N
+ AO P EY e n/a 5 861 881 918 N
+ AO P EY s n/a 5 861 881 918 N
+ AO P F b n/a 5 859 887 922 N
+ AO P F e n/a 5 861 887 922 N
+ AO P F i n/a 5 861 887 922 N
+ AO P F s n/a 5 861 887 922 N
+ AO P G b n/a 5 859 881 920 N
+ AO P G e n/a 5 861 881 920 N
+ AO P G i n/a 5 861 881 920 N
+ AO P G s n/a 5 861 881 920 N
+ AO P HH e n/a 5 861 881 919 N
+ AO P HH s n/a 5 861 881 919 N
+ AO P IH e n/a 5 861 881 916 N
+ AO P IH i n/a 5 861 881 916 N
+ AO P IH s n/a 5 861 881 916 N
+ AO P IY b n/a 5 859 881 916 N
+ AO P IY e n/a 5 861 881 916 N
+ AO P IY s n/a 5 861 881 916 N
+ AO P JH b n/a 5 859 881 920 N
+ AO P JH e n/a 5 861 881 920 N
+ AO P JH i n/a 5 861 881 920 N
+ AO P JH s n/a 5 861 881 920 N
+ AO P K b n/a 5 859 886 919 N
+ AO P K e n/a 5 861 886 919 N
+ AO P K i n/a 5 861 886 919 N
+ AO P K s n/a 5 861 886 919 N
+ AO P L b n/a 5 859 900 929 N
+ AO P L e n/a 5 861 900 928 N
+ AO P L i n/a 5 861 900 928 N
+ AO P L s n/a 5 861 900 928 N
+ AO P M b n/a 5 859 890 926 N
+ AO P M e n/a 5 861 894 926 N
+ AO P M i n/a 5 861 894 926 N
+ AO P M s n/a 5 861 894 926 N
+ AO P N b n/a 5 859 890 924 N
+ AO P N e n/a 5 861 894 923 N
+ AO P N i n/a 5 861 894 923 N
+ AO P N s n/a 5 861 894 923 N
+ AO P NG b n/a 5 859 894 926 N
+ AO P NG e n/a 5 861 894 926 N
+ AO P NG i n/a 5 861 894 926 N
+ AO P NG s n/a 5 861 894 926 N
+ AO P OW e n/a 5 861 900 918 N
+ AO P OW s n/a 5 861 900 918 N
+ AO P OY e n/a 5 861 900 918 N
+ AO P OY s n/a 5 861 900 918 N
+ AO P P b n/a 5 859 887 922 N
+ AO P P e n/a 5 861 887 922 N
+ AO P P i n/a 5 861 887 922 N
+ AO P P s n/a 5 861 887 922 N
+ AO P R b n/a 5 878 906 932 N
+ AO P R e n/a 5 878 906 932 N
+ AO P R i n/a 5 879 906 933 N
+ AO P R s n/a 5 878 906 932 N
+ AO P S b n/a 5 859 881 921 N
+ AO P S e n/a 5 861 881 921 N
+ AO P S i n/a 5 861 881 921 N
+ AO P S s n/a 5 861 881 921 N
+ AO P SH b n/a 5 859 881 919 N
+ AO P SH e n/a 5 861 881 919 N
+ AO P SH i n/a 5 861 881 919 N
+ AO P SH s n/a 5 861 881 919 N
+ AO P SIL e n/a 5 861 881 918 N
+ AO P SIL s n/a 5 861 881 918 N
+ AO P T b n/a 5 859 886 914 N
+ AO P T e n/a 5 861 886 914 N
+ AO P T i n/a 5 861 886 914 N
+ AO P T s n/a 5 861 886 914 N
+ AO P TH b n/a 5 859 881 921 N
+ AO P TH e n/a 5 861 881 921 N
+ AO P TH s n/a 5 861 881 921 N
+ AO P UH e n/a 5 861 900 916 N
+ AO P UH s n/a 5 861 900 916 N
+ AO P UW e n/a 5 861 900 916 N
+ AO P UW s n/a 5 861 900 916 N
+ AO P V e n/a 5 861 887 922 N
+ AO P V s n/a 5 861 887 922 N
+ AO P W e n/a 5 861 900 928 N
+ AO P W s n/a 5 861 900 928 N
+ AO P Y e n/a 5 861 881 916 N
+ AO P Y i n/a 5 861 881 916 N
+ AO P Y s n/a 5 861 881 916 N
+ AO P Z b n/a 5 859 881 915 N
+ AO P Z e n/a 5 861 881 915 N
+ AO P Z i n/a 5 861 881 915 N
+ AO P Z s n/a 5 861 881 915 N
+ AO P ZH e n/a 5 861 881 920 N
+ AO P ZH s n/a 5 861 881 920 N
+ AO R AA e n/a 5 849 898 918 N
+ AO R AA s n/a 5 849 898 918 N
+ AO R AE e n/a 5 849 889 918 N
+ AO R AE s n/a 5 849 889 918 N
+ AO R AH e n/a 5 849 889 918 N
+ AO R AH i n/a 5 849 889 918 N
+ AO R AH s n/a 5 849 889 918 N
+ AO R AO e n/a 5 849 898 918 N
+ AO R AO s n/a 5 849 898 918 N
+ AO R AW e n/a 5 849 889 918 N
+ AO R AW s n/a 5 849 889 918 N
+ AO R AY e n/a 5 849 898 918 N
+ AO R AY s n/a 5 849 898 918 N
+ AO R B b n/a 5 850 889 922 N
+ AO R B e n/a 5 849 889 922 N
+ AO R B i n/a 5 849 889 922 N
+ AO R B s n/a 5 849 889 922 N
+ AO R CH b n/a 5 850 889 919 N
+ AO R CH e n/a 5 849 889 919 N
+ AO R CH i n/a 5 849 888 919 N
+ AO R CH s n/a 5 849 889 919 N
+ AO R D b n/a 5 850 889 914 N
+ AO R D e n/a 5 849 889 914 N
+ AO R D i n/a 5 849 889 914 N
+ AO R D s n/a 5 849 889 914 N
+ AO R DH e n/a 5 849 889 920 N
+ AO R DH s n/a 5 849 889 920 N
+ AO R EH b n/a 5 850 889 918 N
+ AO R EH e n/a 5 849 889 918 N
+ AO R EH s n/a 5 849 889 918 N
+ AO R ER e n/a 5 876 911 936 N
+ AO R ER i n/a 5 876 907 934 N
+ AO R ER s n/a 5 876 911 936 N
+ AO R EY e n/a 5 849 889 918 N
+ AO R EY s n/a 5 849 889 918 N
+ AO R F b n/a 5 850 889 922 N
+ AO R F e n/a 5 849 889 922 N
+ AO R F i n/a 5 849 888 922 N
+ AO R F s n/a 5 849 889 922 N
+ AO R G b n/a 5 850 889 920 N
+ AO R G e n/a 5 849 889 920 N
+ AO R G i n/a 5 849 889 920 N
+ AO R G s n/a 5 849 889 920 N
+ AO R HH e n/a 5 849 889 919 N
+ AO R HH i n/a 5 849 888 919 N
+ AO R HH s n/a 5 849 889 919 N
+ AO R IH e n/a 5 849 889 916 N
+ AO R IH i n/a 5 849 889 916 N
+ AO R IH s n/a 5 849 889 916 N
+ AO R IY b n/a 5 850 889 916 N
+ AO R IY e n/a 5 849 889 916 N
+ AO R IY i n/a 5 849 889 916 N
+ AO R IY s n/a 5 849 889 916 N
+ AO R JH b n/a 5 850 889 920 N
+ AO R JH e n/a 5 849 889 920 N
+ AO R JH i n/a 5 849 889 920 N
+ AO R JH s n/a 5 849 889 920 N
+ AO R K b n/a 5 850 889 919 N
+ AO R K e n/a 5 849 889 919 N
+ AO R K i n/a 5 849 888 919 N
+ AO R K s n/a 5 849 889 919 N
+ AO R L b n/a 5 850 898 929 N
+ AO R L e n/a 5 849 898 928 N
+ AO R L i n/a 5 849 898 928 N
+ AO R L s n/a 5 849 898 928 N
+ AO R M b n/a 5 850 890 926 N
+ AO R M e n/a 5 849 894 926 N
+ AO R M i n/a 5 849 894 926 N
+ AO R M s n/a 5 849 894 926 N
+ AO R N b n/a 5 850 890 924 N
+ AO R N e n/a 5 849 894 923 N
+ AO R N i n/a 5 849 894 923 N
+ AO R N s n/a 5 849 894 923 N
+ AO R NG b n/a 5 850 894 926 N
+ AO R NG e n/a 5 849 894 926 N
+ AO R NG i n/a 5 849 894 926 N
+ AO R NG s n/a 5 849 894 926 N
+ AO R OW e n/a 5 849 898 918 N
+ AO R OW s n/a 5 849 898 918 N
+ AO R OY e n/a 5 849 898 918 N
+ AO R OY s n/a 5 849 898 918 N
+ AO R P b n/a 5 850 889 922 N
+ AO R P e n/a 5 849 889 922 N
+ AO R P i n/a 5 849 888 922 N
+ AO R P s n/a 5 849 889 922 N
+ AO R R b n/a 5 876 911 936 N
+ AO R R e n/a 5 876 911 936 N
+ AO R R i n/a 5 876 907 934 N
+ AO R R s n/a 5 876 911 936 N
+ AO R S b n/a 5 850 889 921 N
+ AO R S e n/a 5 849 889 921 N
+ AO R S i n/a 5 849 888 921 N
+ AO R S s n/a 5 849 889 921 N
+ AO R SH b n/a 5 850 889 921 N
+ AO R SH e n/a 5 849 889 921 N
+ AO R SH i n/a 5 849 888 921 N
+ AO R SH s n/a 5 849 889 921 N
+ AO R SIL e n/a 5 849 889 918 N
+ AO R SIL s n/a 5 849 889 918 N
+ AO R T b n/a 5 850 889 914 N
+ AO R T e n/a 5 849 889 914 N
+ AO R T i n/a 5 849 888 914 N
+ AO R T s n/a 5 849 889 914 N
+ AO R TH b n/a 5 850 889 921 N
+ AO R TH e n/a 5 849 889 921 N
+ AO R TH i n/a 5 849 888 921 N
+ AO R TH s n/a 5 849 889 921 N
+ AO R UH e n/a 5 849 898 916 N
+ AO R UH s n/a 5 849 898 916 N
+ AO R UW e n/a 5 849 898 916 N
+ AO R UW s n/a 5 849 898 916 N
+ AO R V e n/a 5 849 889 922 N
+ AO R V i n/a 5 849 889 922 N
+ AO R V s n/a 5 849 889 922 N
+ AO R W e n/a 5 849 898 928 N
+ AO R W s n/a 5 849 898 928 N
+ AO R Y e n/a 5 849 889 916 N
+ AO R Y s n/a 5 849 889 916 N
+ AO R Z b n/a 5 850 889 915 N
+ AO R Z e n/a 5 849 889 915 N
+ AO R Z i n/a 5 849 889 915 N
+ AO R Z s n/a 5 849 889 915 N
+ AO R ZH e n/a 5 849 889 920 N
+ AO R ZH s n/a 5 849 889 920 N
+ AO S AA e n/a 5 856 897 918 N
+ AO S AA s n/a 5 856 897 918 N
+ AO S AE e n/a 5 856 884 918 N
+ AO S AE s n/a 5 856 884 918 N
+ AO S AH e n/a 5 856 884 918 N
+ AO S AH s n/a 5 856 884 918 N
+ AO S AO e n/a 5 856 897 918 N
+ AO S AO s n/a 5 856 897 918 N
+ AO S AW e n/a 5 856 884 918 N
+ AO S AW s n/a 5 856 884 918 N
+ AO S AY e n/a 5 856 897 918 N
+ AO S AY s n/a 5 856 897 918 N
+ AO S B b n/a 5 851 887 922 N
+ AO S B e n/a 5 856 887 922 N
+ AO S B i n/a 5 856 887 922 N
+ AO S B s n/a 5 856 887 922 N
+ AO S CH b n/a 5 851 884 919 N
+ AO S CH e n/a 5 856 884 919 N
+ AO S CH i n/a 5 856 884 919 N
+ AO S CH s n/a 5 856 884 919 N
+ AO S D b n/a 5 851 885 914 N
+ AO S D e n/a 5 856 885 914 N
+ AO S D i n/a 5 856 885 914 N
+ AO S D s n/a 5 856 885 914 N
+ AO S DH e n/a 5 856 884 920 N
+ AO S DH s n/a 5 856 884 920 N
+ AO S EH b n/a 5 851 884 918 N
+ AO S EH e n/a 5 856 884 918 N
+ AO S EH s n/a 5 856 884 918 N
+ AO S ER e n/a 5 866 911 936 N
+ AO S ER s n/a 5 866 911 936 N
+ AO S EY e n/a 5 856 884 918 N
+ AO S EY s n/a 5 856 884 918 N
+ AO S F b n/a 5 851 887 922 N
+ AO S F e n/a 5 856 887 922 N
+ AO S F i n/a 5 856 887 922 N
+ AO S F s n/a 5 856 887 922 N
+ AO S G b n/a 5 851 884 920 N
+ AO S G e n/a 5 856 884 920 N
+ AO S G i n/a 5 856 884 920 N
+ AO S G s n/a 5 856 884 920 N
+ AO S HH e n/a 5 856 884 919 N
+ AO S HH i n/a 5 856 884 919 N
+ AO S HH s n/a 5 856 884 919 N
+ AO S IH e n/a 5 856 884 916 N
+ AO S IH i n/a 5 856 884 916 N
+ AO S IH s n/a 5 856 884 916 N
+ AO S IY b n/a 5 851 884 916 N
+ AO S IY e n/a 5 856 884 916 N
+ AO S IY i n/a 5 856 884 916 N
+ AO S IY s n/a 5 856 884 916 N
+ AO S JH b n/a 5 851 884 920 N
+ AO S JH e n/a 5 856 884 920 N
+ AO S JH s n/a 5 856 884 920 N
+ AO S K b n/a 5 851 886 919 N
+ AO S K e n/a 5 856 886 919 N
+ AO S K i n/a 5 856 886 919 N
+ AO S K s n/a 5 856 886 919 N
+ AO S L b n/a 5 851 897 929 N
+ AO S L e n/a 5 856 897 928 N
+ AO S L i n/a 5 856 897 928 N
+ AO S L s n/a 5 856 897 928 N
+ AO S M b n/a 5 851 890 926 N
+ AO S M e n/a 5 856 894 926 N
+ AO S M i n/a 5 856 894 926 N
+ AO S M s n/a 5 856 894 926 N
+ AO S N b n/a 5 851 890 924 N
+ AO S N e n/a 5 856 894 923 N
+ AO S N i n/a 5 856 894 923 N
+ AO S N s n/a 5 856 894 923 N
+ AO S NG b n/a 5 851 894 926 N
+ AO S NG e n/a 5 856 894 926 N
+ AO S NG i n/a 5 856 894 926 N
+ AO S NG s n/a 5 856 894 926 N
+ AO S OW e n/a 5 856 897 918 N
+ AO S OW s n/a 5 856 897 918 N
+ AO S OY e n/a 5 856 897 918 N
+ AO S OY s n/a 5 856 897 918 N
+ AO S P b n/a 5 851 887 922 N
+ AO S P e n/a 5 856 887 922 N
+ AO S P i n/a 5 856 887 922 N
+ AO S P s n/a 5 856 887 922 N
+ AO S R b n/a 5 866 911 936 N
+ AO S R e n/a 5 866 911 936 N
+ AO S R i n/a 5 867 909 934 N
+ AO S R s n/a 5 866 911 936 N
+ AO S S b n/a 5 851 885 921 N
+ AO S S e n/a 5 856 885 921 N
+ AO S S i n/a 5 856 885 921 N
+ AO S S s n/a 5 856 885 921 N
+ AO S SH b n/a 5 851 884 919 N
+ AO S SH e n/a 5 856 884 919 N
+ AO S SH i n/a 5 856 884 919 N
+ AO S SH s n/a 5 856 884 919 N
+ AO S SIL e n/a 5 856 884 918 N
+ AO S SIL s n/a 5 856 884 918 N
+ AO S T b n/a 5 851 885 914 N
+ AO S T e n/a 5 856 885 914 N
+ AO S T i n/a 5 856 885 914 N
+ AO S T s n/a 5 856 885 914 N
+ AO S TH b n/a 5 851 884 921 N
+ AO S TH e n/a 5 856 884 921 N
+ AO S TH s n/a 5 856 884 921 N
+ AO S UH e n/a 5 856 897 916 N
+ AO S UH s n/a 5 856 897 916 N
+ AO S UW e n/a 5 856 897 916 N
+ AO S UW s n/a 5 856 897 916 N
+ AO S V e n/a 5 856 887 922 N
+ AO S V i n/a 5 856 887 922 N
+ AO S V s n/a 5 856 887 922 N
+ AO S W e n/a 5 856 897 928 N
+ AO S W i n/a 5 856 897 928 N
+ AO S W s n/a 5 856 897 928 N
+ AO S Y e n/a 5 856 884 916 N
+ AO S Y i n/a 5 856 884 916 N
+ AO S Y s n/a 5 856 884 916 N
+ AO S Z b n/a 5 851 885 915 N
+ AO S Z e n/a 5 856 885 915 N
+ AO S Z i n/a 5 856 885 915 N
+ AO S Z s n/a 5 856 885 915 N
+ AO S ZH e n/a 5 856 884 920 N
+ AO S ZH s n/a 5 856 884 920 N
+ AO SH AA e n/a 5 856 899 918 N
+ AO SH AA s n/a 5 856 899 918 N
+ AO SH AE e n/a 5 856 881 918 N
+ AO SH AE s n/a 5 856 881 918 N
+ AO SH AH e n/a 5 856 881 918 N
+ AO SH AH s n/a 5 856 881 918 N
+ AO SH AO e n/a 5 856 899 918 N
+ AO SH AO s n/a 5 856 899 918 N
+ AO SH AW e n/a 5 856 881 918 N
+ AO SH AW s n/a 5 856 881 918 N
+ AO SH AY e n/a 5 856 899 918 N
+ AO SH AY s n/a 5 856 899 918 N
+ AO SH B b n/a 5 851 887 922 N
+ AO SH B e n/a 5 856 887 922 N
+ AO SH B i n/a 5 856 887 922 N
+ AO SH B s n/a 5 856 887 922 N
+ AO SH CH b n/a 5 851 881 919 N
+ AO SH CH e n/a 5 856 881 919 N
+ AO SH CH s n/a 5 856 881 919 N
+ AO SH D b n/a 5 851 881 914 N
+ AO SH D e n/a 5 856 881 914 N
+ AO SH D i n/a 5 856 881 914 N
+ AO SH D s n/a 5 856 881 914 N
+ AO SH DH e n/a 5 856 881 920 N
+ AO SH DH s n/a 5 856 881 920 N
+ AO SH EH b n/a 5 851 881 918 N
+ AO SH EH e n/a 5 856 881 918 N
+ AO SH EH s n/a 5 856 881 918 N
+ AO SH ER e n/a 5 870 911 936 N
+ AO SH ER s n/a 5 870 911 936 N
+ AO SH EY e n/a 5 856 881 918 N
+ AO SH EY s n/a 5 856 881 918 N
+ AO SH F b n/a 5 851 887 922 N
+ AO SH F e n/a 5 856 887 922 N
+ AO SH F i n/a 5 856 887 922 N
+ AO SH F s n/a 5 856 887 922 N
+ AO SH G b n/a 5 851 881 920 N
+ AO SH G e n/a 5 856 881 920 N
+ AO SH G i n/a 5 856 881 920 N
+ AO SH G s n/a 5 856 881 920 N
+ AO SH HH e n/a 5 856 881 919 N
+ AO SH HH s n/a 5 856 881 919 N
+ AO SH IH e n/a 5 856 881 916 N
+ AO SH IH s n/a 5 856 881 916 N
+ AO SH IY b n/a 5 851 881 916 N
+ AO SH IY e n/a 5 856 881 916 N
+ AO SH IY s n/a 5 856 881 916 N
+ AO SH JH b n/a 5 851 881 920 N
+ AO SH JH e n/a 5 856 881 920 N
+ AO SH JH s n/a 5 856 881 920 N
+ AO SH K b n/a 5 851 886 919 N
+ AO SH K e n/a 5 856 886 919 N
+ AO SH K i n/a 5 856 886 919 N
+ AO SH K s n/a 5 856 886 919 N
+ AO SH L b n/a 5 851 897 929 N
+ AO SH L e n/a 5 856 899 928 N
+ AO SH L i n/a 5 856 899 928 N
+ AO SH L s n/a 5 856 899 928 N
+ AO SH M b n/a 5 851 890 926 N
+ AO SH M e n/a 5 856 894 926 N
+ AO SH M i n/a 5 856 894 926 N
+ AO SH M s n/a 5 856 894 926 N
+ AO SH N b n/a 5 851 890 924 N
+ AO SH N e n/a 5 856 894 923 N
+ AO SH N i n/a 5 856 894 923 N
+ AO SH N s n/a 5 856 894 923 N
+ AO SH NG b n/a 5 851 894 926 N
+ AO SH NG e n/a 5 856 894 926 N
+ AO SH NG i n/a 5 856 894 926 N
+ AO SH NG s n/a 5 856 894 926 N
+ AO SH OW e n/a 5 856 899 918 N
+ AO SH OW s n/a 5 856 899 918 N
+ AO SH OY e n/a 5 856 899 918 N
+ AO SH OY s n/a 5 856 899 918 N
+ AO SH P b n/a 5 851 887 922 N
+ AO SH P e n/a 5 856 887 922 N
+ AO SH P s n/a 5 856 887 922 N
+ AO SH R b n/a 5 869 911 936 N
+ AO SH R e n/a 5 870 911 936 N
+ AO SH R i n/a 5 870 909 934 N
+ AO SH R s n/a 5 870 911 936 N
+ AO SH S b n/a 5 851 881 921 N
+ AO SH S e n/a 5 856 881 921 N
+ AO SH S i n/a 5 856 881 921 N
+ AO SH S s n/a 5 856 881 921 N
+ AO SH SH b n/a 5 851 881 919 N
+ AO SH SH e n/a 5 856 881 919 N
+ AO SH SH i n/a 5 856 881 919 N
+ AO SH SH s n/a 5 856 881 919 N
+ AO SH SIL e n/a 5 856 881 918 N
+ AO SH SIL s n/a 5 856 881 918 N
+ AO SH T b n/a 5 851 886 914 N
+ AO SH T e n/a 5 856 886 914 N
+ AO SH T i n/a 5 856 886 914 N
+ AO SH T s n/a 5 856 886 914 N
+ AO SH TH b n/a 5 851 881 921 N
+ AO SH TH e n/a 5 856 881 921 N
+ AO SH TH s n/a 5 856 881 921 N
+ AO SH UH e n/a 5 856 899 916 N
+ AO SH UH s n/a 5 856 899 916 N
+ AO SH UW e n/a 5 856 899 916 N
+ AO SH UW s n/a 5 856 899 916 N
+ AO SH V e n/a 5 856 887 922 N
+ AO SH V i n/a 5 856 887 922 N
+ AO SH V s n/a 5 856 887 922 N
+ AO SH W e n/a 5 856 899 928 N
+ AO SH W s n/a 5 856 899 928 N
+ AO SH Y e n/a 5 856 881 916 N
+ AO SH Y s n/a 5 856 881 916 N
+ AO SH Z b n/a 5 851 881 915 N
+ AO SH Z e n/a 5 856 881 915 N
+ AO SH Z i n/a 5 856 881 915 N
+ AO SH Z s n/a 5 856 881 915 N
+ AO SH ZH e n/a 5 856 881 920 N
+ AO SH ZH s n/a 5 856 881 920 N
+ AO SIL AA s n/a 5 861 902 918 N
+ AO SIL AE s n/a 5 861 881 918 N
+ AO SIL AH s n/a 5 861 881 918 N
+ AO SIL AO s n/a 5 861 902 918 N
+ AO SIL AW s n/a 5 861 881 918 N
+ AO SIL AY s n/a 5 861 902 918 N
+ AO SIL B b n/a 5 860 887 922 N
+ AO SIL B s n/a 5 861 887 922 N
+ AO SIL CH b n/a 5 860 881 919 N
+ AO SIL CH s n/a 5 861 881 919 N
+ AO SIL D b n/a 5 860 881 914 N
+ AO SIL D s n/a 5 861 881 914 N
+ AO SIL DH s n/a 5 861 881 920 N
+ AO SIL EH b n/a 5 860 881 918 N
+ AO SIL EH s n/a 5 861 881 918 N
+ AO SIL ER s n/a 5 878 913 936 N
+ AO SIL EY s n/a 5 861 881 918 N
+ AO SIL F b n/a 5 860 887 922 N
+ AO SIL F s n/a 5 861 887 922 N
+ AO SIL G b n/a 5 860 881 920 N
+ AO SIL G s n/a 5 861 881 920 N
+ AO SIL HH s n/a 5 861 881 919 N
+ AO SIL IH s n/a 5 861 881 916 N
+ AO SIL IY b n/a 5 860 881 916 N
+ AO SIL IY s n/a 5 861 881 916 N
+ AO SIL JH b n/a 5 860 881 920 N
+ AO SIL JH s n/a 5 861 881 920 N
+ AO SIL K b n/a 5 860 886 919 N
+ AO SIL K s n/a 5 861 886 919 N
+ AO SIL L b n/a 5 860 902 930 N
+ AO SIL L s n/a 5 861 902 928 N
+ AO SIL M b n/a 5 860 890 926 N
+ AO SIL M s n/a 5 861 894 926 N
+ AO SIL N b n/a 5 860 890 924 N
+ AO SIL N s n/a 5 861 894 923 N
+ AO SIL NG b n/a 5 860 894 926 N
+ AO SIL NG s n/a 5 861 894 926 N
+ AO SIL OW s n/a 5 861 902 918 N
+ AO SIL OY s n/a 5 861 902 918 N
+ AO SIL P b n/a 5 860 887 922 N
+ AO SIL P s n/a 5 861 887 922 N
+ AO SIL R b n/a 5 878 913 936 N
+ AO SIL R s n/a 5 878 913 936 N
+ AO SIL S b n/a 5 860 881 921 N
+ AO SIL S s n/a 5 861 881 921 N
+ AO SIL SH b n/a 5 860 881 919 N
+ AO SIL SH s n/a 5 861 881 919 N
+ AO SIL SIL s n/a 5 861 881 918 N
+ AO SIL T b n/a 5 860 886 914 N
+ AO SIL T s n/a 5 861 886 914 N
+ AO SIL TH b n/a 5 860 881 921 N
+ AO SIL TH s n/a 5 861 881 921 N
+ AO SIL UH s n/a 5 861 902 916 N
+ AO SIL UW s n/a 5 861 902 916 N
+ AO SIL V s n/a 5 861 887 922 N
+ AO SIL W s n/a 5 861 902 928 N
+ AO SIL Y s n/a 5 861 881 916 N
+ AO SIL Z b n/a 5 860 881 915 N
+ AO SIL Z s n/a 5 861 881 915 N
+ AO SIL ZH s n/a 5 861 881 920 N
+ AO T AA e n/a 5 863 899 918 N
+ AO T AA s n/a 5 863 899 918 N
+ AO T AE e n/a 5 863 884 918 N
+ AO T AE s n/a 5 863 884 918 N
+ AO T AH e n/a 5 863 884 918 N
+ AO T AH i n/a 5 863 884 918 N
+ AO T AH s n/a 5 863 884 918 N
+ AO T AO e n/a 5 863 899 918 N
+ AO T AO s n/a 5 863 899 918 N
+ AO T AW e n/a 5 863 884 918 N
+ AO T AW s n/a 5 863 884 918 N
+ AO T AY e n/a 5 863 899 918 N
+ AO T AY s n/a 5 863 899 918 N
+ AO T B b n/a 5 854 887 922 N
+ AO T B e n/a 5 863 887 922 N
+ AO T B i n/a 5 863 887 922 N
+ AO T B s n/a 5 863 887 922 N
+ AO T CH b n/a 5 853 884 919 N
+ AO T CH e n/a 5 863 884 919 N
+ AO T CH i n/a 5 863 884 919 N
+ AO T CH s n/a 5 863 884 919 N
+ AO T D b n/a 5 853 885 914 N
+ AO T D e n/a 5 863 885 914 N
+ AO T D i n/a 5 863 885 914 N
+ AO T D s n/a 5 863 885 914 N
+ AO T DH e n/a 5 863 884 920 N
+ AO T DH s n/a 5 863 884 920 N
+ AO T EH b n/a 5 853 884 918 N
+ AO T EH e n/a 5 863 884 918 N
+ AO T EH s n/a 5 863 884 918 N
+ AO T ER e n/a 5 866 911 936 N
+ AO T ER s n/a 5 866 911 936 N
+ AO T EY e n/a 5 863 884 918 N
+ AO T EY s n/a 5 863 884 918 N
+ AO T F b n/a 5 854 887 922 N
+ AO T F e n/a 5 863 887 922 N
+ AO T F i n/a 5 863 887 922 N
+ AO T F s n/a 5 863 887 922 N
+ AO T G b n/a 5 853 884 920 N
+ AO T G e n/a 5 863 884 920 N
+ AO T G s n/a 5 863 884 920 N
+ AO T HH e n/a 5 863 884 919 N
+ AO T HH s n/a 5 863 884 919 N
+ AO T IH e n/a 5 863 884 916 N
+ AO T IH s n/a 5 863 884 916 N
+ AO T IY b n/a 5 853 884 916 N
+ AO T IY e n/a 5 863 884 916 N
+ AO T IY i n/a 5 863 884 916 N
+ AO T IY s n/a 5 863 884 916 N
+ AO T JH b n/a 5 853 884 920 N
+ AO T JH e n/a 5 863 884 920 N
+ AO T JH s n/a 5 863 884 920 N
+ AO T K b n/a 5 853 886 919 N
+ AO T K e n/a 5 863 886 919 N
+ AO T K i n/a 5 863 886 919 N
+ AO T K s n/a 5 863 886 919 N
+ AO T L b n/a 5 853 897 929 N
+ AO T L e n/a 5 863 899 928 N
+ AO T L i n/a 5 863 899 928 N
+ AO T L s n/a 5 863 899 928 N
+ AO T M b n/a 5 851 890 926 N
+ AO T M e n/a 5 863 894 926 N
+ AO T M i n/a 5 863 894 926 N
+ AO T M s n/a 5 863 894 926 N
+ AO T N b n/a 5 851 890 924 N
+ AO T N e n/a 5 863 894 923 N
+ AO T N i n/a 5 863 894 923 N
+ AO T N s n/a 5 863 894 923 N
+ AO T NG b n/a 5 851 894 926 N
+ AO T NG e n/a 5 863 894 926 N
+ AO T NG i n/a 5 863 894 926 N
+ AO T NG s n/a 5 863 894 926 N
+ AO T OW e n/a 5 863 899 918 N
+ AO T OW s n/a 5 863 899 918 N
+ AO T OY e n/a 5 863 899 918 N
+ AO T OY s n/a 5 863 899 918 N
+ AO T P b n/a 5 854 887 922 N
+ AO T P e n/a 5 863 887 922 N
+ AO T P i n/a 5 863 887 922 N
+ AO T P s n/a 5 863 887 922 N
+ AO T R b n/a 5 866 911 936 N
+ AO T R e n/a 5 866 911 936 N
+ AO T R i n/a 5 868 909 934 N
+ AO T R s n/a 5 866 911 936 N
+ AO T S b n/a 5 853 885 921 N
+ AO T S e n/a 5 863 885 921 N
+ AO T S i n/a 5 863 885 921 N
+ AO T S s n/a 5 863 885 921 N
+ AO T SH b n/a 5 853 884 919 N
+ AO T SH e n/a 5 863 884 919 N
+ AO T SH i n/a 5 863 884 919 N
+ AO T SH s n/a 5 863 884 919 N
+ AO T SIL e n/a 5 863 884 918 N
+ AO T SIL s n/a 5 863 884 918 N
+ AO T T b n/a 5 853 885 914 N
+ AO T T e n/a 5 863 885 914 N
+ AO T T i n/a 5 863 885 914 N
+ AO T T s n/a 5 863 885 914 N
+ AO T TH b n/a 5 853 884 921 N
+ AO T TH e n/a 5 863 884 921 N
+ AO T TH s n/a 5 863 884 921 N
+ AO T UH e n/a 5 863 899 916 N
+ AO T UH s n/a 5 863 899 916 N
+ AO T UW e n/a 5 863 899 916 N
+ AO T UW s n/a 5 863 899 916 N
+ AO T V e n/a 5 863 887 922 N
+ AO T V i n/a 5 863 887 922 N
+ AO T V s n/a 5 863 887 922 N
+ AO T W e n/a 5 863 899 928 N
+ AO T W s n/a 5 863 899 928 N
+ AO T Y e n/a 5 863 884 916 N
+ AO T Y s n/a 5 863 884 916 N
+ AO T Z b n/a 5 853 885 915 N
+ AO T Z e n/a 5 863 885 915 N
+ AO T Z i n/a 5 863 885 915 N
+ AO T Z s n/a 5 863 885 915 N
+ AO T ZH e n/a 5 863 884 920 N
+ AO T ZH s n/a 5 863 884 920 N
+ AO TH AA e n/a 5 856 899 918 N
+ AO TH AA s n/a 5 856 899 918 N
+ AO TH AE e n/a 5 856 881 918 N
+ AO TH AE s n/a 5 856 881 918 N
+ AO TH AH e n/a 5 856 881 918 N
+ AO TH AH s n/a 5 856 881 918 N
+ AO TH AO e n/a 5 856 899 918 N
+ AO TH AO s n/a 5 856 899 918 N
+ AO TH AW e n/a 5 856 881 918 N
+ AO TH AW i n/a 5 856 881 918 N
+ AO TH AW s n/a 5 856 881 918 N
+ AO TH AY e n/a 5 856 899 918 N
+ AO TH AY s n/a 5 856 899 918 N
+ AO TH B b n/a 5 851 887 922 N
+ AO TH B e n/a 5 856 887 922 N
+ AO TH B s n/a 5 856 887 922 N
+ AO TH CH b n/a 5 851 881 919 N
+ AO TH CH e n/a 5 856 881 919 N
+ AO TH CH s n/a 5 856 881 919 N
+ AO TH D b n/a 5 851 881 914 N
+ AO TH D e n/a 5 856 881 914 N
+ AO TH D i n/a 5 856 881 914 N
+ AO TH D s n/a 5 856 881 914 N
+ AO TH DH e n/a 5 856 881 920 N
+ AO TH DH s n/a 5 856 881 920 N
+ AO TH EH b n/a 5 851 881 918 N
+ AO TH EH e n/a 5 856 881 918 N
+ AO TH EH s n/a 5 856 881 918 N
+ AO TH ER e n/a 5 866 911 936 N
+ AO TH ER s n/a 5 866 911 936 N
+ AO TH EY e n/a 5 856 881 918 N
+ AO TH EY s n/a 5 856 881 918 N
+ AO TH F b n/a 5 851 887 922 N
+ AO TH F e n/a 5 856 887 922 N
+ AO TH F s n/a 5 856 887 922 N
+ AO TH G b n/a 5 851 881 920 N
+ AO TH G e n/a 5 856 881 920 N
+ AO TH G i n/a 5 856 881 920 N
+ AO TH G s n/a 5 856 881 920 N
+ AO TH HH e n/a 5 856 881 919 N
+ AO TH HH s n/a 5 856 881 919 N
+ AO TH IH e n/a 5 856 881 916 N
+ AO TH IH i n/a 5 856 881 916 N
+ AO TH IH s n/a 5 856 881 916 N
+ AO TH IY b n/a 5 851 881 916 N
+ AO TH IY e n/a 5 856 881 916 N
+ AO TH IY s n/a 5 856 881 916 N
+ AO TH JH b n/a 5 851 881 920 N
+ AO TH JH e n/a 5 856 881 920 N
+ AO TH JH s n/a 5 856 881 920 N
+ AO TH K b n/a 5 851 886 919 N
+ AO TH K e n/a 5 856 886 919 N
+ AO TH K s n/a 5 856 886 919 N
+ AO TH L b n/a 5 851 897 929 N
+ AO TH L e n/a 5 856 899 928 N
+ AO TH L i n/a 5 856 899 928 N
+ AO TH L s n/a 5 856 899 928 N
+ AO TH M b n/a 5 851 890 926 N
+ AO TH M e n/a 5 856 894 926 N
+ AO TH M s n/a 5 856 894 926 N
+ AO TH N b n/a 5 851 890 924 N
+ AO TH N e n/a 5 856 894 923 N
+ AO TH N s n/a 5 856 894 923 N
+ AO TH NG b n/a 5 851 894 926 N
+ AO TH NG e n/a 5 856 894 926 N
+ AO TH NG i n/a 5 856 894 926 N
+ AO TH NG s n/a 5 856 894 926 N
+ AO TH OW e n/a 5 856 899 918 N
+ AO TH OW s n/a 5 856 899 918 N
+ AO TH OY e n/a 5 856 899 918 N
+ AO TH OY s n/a 5 856 899 918 N
+ AO TH P b n/a 5 851 887 922 N
+ AO TH P e n/a 5 856 887 922 N
+ AO TH P s n/a 5 856 887 922 N
+ AO TH R b n/a 5 866 911 936 N
+ AO TH R e n/a 5 866 911 936 N
+ AO TH R i n/a 5 867 907 934 N
+ AO TH R s n/a 5 866 911 936 N
+ AO TH S b n/a 5 851 881 921 N
+ AO TH S e n/a 5 856 881 921 N
+ AO TH S s n/a 5 856 881 921 N
+ AO TH SH b n/a 5 851 881 919 N
+ AO TH SH e n/a 5 856 881 919 N
+ AO TH SH s n/a 5 856 881 919 N
+ AO TH SIL e n/a 5 856 881 918 N
+ AO TH SIL s n/a 5 856 881 918 N
+ AO TH T b n/a 5 851 885 914 N
+ AO TH T e n/a 5 856 885 914 N
+ AO TH T i n/a 5 856 885 914 N
+ AO TH T s n/a 5 856 885 914 N
+ AO TH TH b n/a 5 851 881 921 N
+ AO TH TH e n/a 5 856 881 921 N
+ AO TH TH s n/a 5 856 881 921 N
+ AO TH UH e n/a 5 856 899 916 N
+ AO TH UH s n/a 5 856 899 916 N
+ AO TH UW e n/a 5 856 899 916 N
+ AO TH UW s n/a 5 856 899 916 N
+ AO TH V e n/a 5 856 887 922 N
+ AO TH V s n/a 5 856 887 922 N
+ AO TH W e n/a 5 856 899 928 N
+ AO TH W s n/a 5 856 899 928 N
+ AO TH Y e n/a 5 856 881 916 N
+ AO TH Y s n/a 5 856 881 916 N
+ AO TH Z b n/a 5 851 881 915 N
+ AO TH Z e n/a 5 856 881 915 N
+ AO TH Z i n/a 5 856 881 915 N
+ AO TH Z s n/a 5 856 881 915 N
+ AO TH ZH e n/a 5 856 881 920 N
+ AO TH ZH s n/a 5 856 881 920 N
+ AO UH AA s n/a 5 847 898 918 N
+ AO UH AE s n/a 5 847 881 918 N
+ AO UH AH s n/a 5 847 881 918 N
+ AO UH AO s n/a 5 847 898 918 N
+ AO UH AW s n/a 5 847 881 918 N
+ AO UH AY s n/a 5 847 898 918 N
+ AO UH B b n/a 5 847 887 922 N
+ AO UH B s n/a 5 847 887 922 N
+ AO UH CH b n/a 5 847 881 919 N
+ AO UH CH s n/a 5 847 881 919 N
+ AO UH D b n/a 5 847 881 914 N
+ AO UH D s n/a 5 847 881 914 N
+ AO UH DH s n/a 5 847 881 920 N
+ AO UH EH b n/a 5 847 881 918 N
+ AO UH EH s n/a 5 847 881 918 N
+ AO UH ER s n/a 5 876 913 936 N
+ AO UH EY s n/a 5 847 881 918 N
+ AO UH F b n/a 5 847 887 922 N
+ AO UH F s n/a 5 847 887 922 N
+ AO UH G b n/a 5 847 881 920 N
+ AO UH G s n/a 5 847 881 920 N
+ AO UH HH s n/a 5 847 881 919 N
+ AO UH IH s n/a 5 847 881 916 N
+ AO UH IY b n/a 5 847 881 916 N
+ AO UH IY s n/a 5 847 881 916 N
+ AO UH JH b n/a 5 847 881 920 N
+ AO UH JH s n/a 5 847 881 920 N
+ AO UH K b n/a 5 847 886 919 N
+ AO UH K s n/a 5 847 886 919 N
+ AO UH L b n/a 5 847 898 929 N
+ AO UH L s n/a 5 847 898 928 N
+ AO UH M b n/a 5 847 890 926 N
+ AO UH M s n/a 5 847 894 926 N
+ AO UH N b n/a 5 847 890 924 N
+ AO UH N s n/a 5 847 894 924 N
+ AO UH NG b n/a 5 847 894 926 N
+ AO UH NG s n/a 5 847 894 926 N
+ AO UH OW s n/a 5 847 898 918 N
+ AO UH OY s n/a 5 847 898 918 N
+ AO UH P b n/a 5 847 887 922 N
+ AO UH P s n/a 5 847 887 922 N
+ AO UH R b n/a 5 876 913 936 N
+ AO UH R s n/a 5 876 913 936 N
+ AO UH S b n/a 5 847 881 921 N
+ AO UH S s n/a 5 847 881 921 N
+ AO UH SH b n/a 5 847 881 919 N
+ AO UH SH s n/a 5 847 881 919 N
+ AO UH SIL s n/a 5 847 881 918 N
+ AO UH T b n/a 5 847 886 914 N
+ AO UH T s n/a 5 847 886 914 N
+ AO UH TH b n/a 5 847 881 921 N
+ AO UH TH s n/a 5 847 881 921 N
+ AO UH UH s n/a 5 847 898 916 N
+ AO UH UW s n/a 5 847 898 916 N
+ AO UH V s n/a 5 847 887 922 N
+ AO UH W s n/a 5 847 898 928 N
+ AO UH Y s n/a 5 847 881 916 N
+ AO UH Z b n/a 5 847 881 915 N
+ AO UH Z s n/a 5 847 881 915 N
+ AO UH ZH s n/a 5 847 881 920 N
+ AO UW AA s n/a 5 847 898 918 N
+ AO UW AE s n/a 5 847 881 918 N
+ AO UW AH s n/a 5 847 881 918 N
+ AO UW AO s n/a 5 847 898 918 N
+ AO UW AW s n/a 5 847 881 918 N
+ AO UW AY s n/a 5 847 898 918 N
+ AO UW B b n/a 5 847 887 922 N
+ AO UW B s n/a 5 847 887 922 N
+ AO UW CH b n/a 5 847 881 919 N
+ AO UW CH s n/a 5 847 881 919 N
+ AO UW D b n/a 5 847 881 917 N
+ AO UW D s n/a 5 847 881 917 N
+ AO UW DH s n/a 5 847 881 920 N
+ AO UW EH b n/a 5 847 881 918 N
+ AO UW EH s n/a 5 847 881 918 N
+ AO UW ER s n/a 5 876 913 936 N
+ AO UW EY s n/a 5 847 881 918 N
+ AO UW F b n/a 5 847 887 922 N
+ AO UW F i n/a 5 848 887 922 N
+ AO UW F s n/a 5 847 887 922 N
+ AO UW G b n/a 5 847 881 920 N
+ AO UW G s n/a 5 847 881 920 N
+ AO UW HH s n/a 5 847 881 919 N
+ AO UW IH s n/a 5 847 881 916 N
+ AO UW IY b n/a 5 847 881 916 N
+ AO UW IY s n/a 5 847 881 916 N
+ AO UW JH b n/a 5 847 881 920 N
+ AO UW JH s n/a 5 847 881 920 N
+ AO UW K b n/a 5 847 886 919 N
+ AO UW K s n/a 5 847 886 919 N
+ AO UW L b n/a 5 847 898 929 N
+ AO UW L i n/a 5 848 898 928 N
+ AO UW L s n/a 5 847 898 928 N
+ AO UW M b n/a 5 847 893 926 N
+ AO UW M s n/a 5 847 893 926 N
+ AO UW N b n/a 5 847 893 925 N
+ AO UW N i n/a 5 848 893 925 N
+ AO UW N s n/a 5 847 893 925 N
+ AO UW NG b n/a 5 847 893 926 N
+ AO UW NG i n/a 5 848 890 926 N
+ AO UW NG s n/a 5 847 893 926 N
+ AO UW OW s n/a 5 847 898 918 N
+ AO UW OY s n/a 5 847 898 918 N
+ AO UW P b n/a 5 847 887 922 N
+ AO UW P s n/a 5 847 887 922 N
+ AO UW R b n/a 5 876 913 936 N
+ AO UW R i n/a 5 876 907 934 N
+ AO UW R s n/a 5 876 913 936 N
+ AO UW S b n/a 5 847 881 921 N
+ AO UW S s n/a 5 847 881 921 N
+ AO UW SH b n/a 5 847 881 919 N
+ AO UW SH s n/a 5 847 881 919 N
+ AO UW SIL s n/a 5 847 881 918 N
+ AO UW T b n/a 5 847 886 917 N
+ AO UW T s n/a 5 847 886 917 N
+ AO UW TH b n/a 5 847 881 921 N
+ AO UW TH s n/a 5 847 881 921 N
+ AO UW UH s n/a 5 847 898 916 N
+ AO UW UW s n/a 5 847 898 916 N
+ AO UW V s n/a 5 847 887 922 N
+ AO UW W s n/a 5 847 898 928 N
+ AO UW Y s n/a 5 847 881 916 N
+ AO UW Z b n/a 5 847 881 915 N
+ AO UW Z s n/a 5 847 881 915 N
+ AO UW ZH s n/a 5 847 881 920 N
+ AO V AA e n/a 5 847 900 918 N
+ AO V AA s n/a 5 847 900 918 N
+ AO V AE e n/a 5 847 881 918 N
+ AO V AE s n/a 5 847 881 918 N
+ AO V AH e n/a 5 847 881 918 N
+ AO V AH s n/a 5 847 881 918 N
+ AO V AO e n/a 5 847 900 918 N
+ AO V AO s n/a 5 847 900 918 N
+ AO V AW e n/a 5 847 881 918 N
+ AO V AW s n/a 5 847 881 918 N
+ AO V AY e n/a 5 847 900 918 N
+ AO V AY s n/a 5 847 900 918 N
+ AO V B b n/a 5 859 887 922 N
+ AO V B e n/a 5 847 887 922 N
+ AO V B i n/a 5 848 887 922 N
+ AO V B s n/a 5 847 887 922 N
+ AO V CH b n/a 5 859 881 919 N
+ AO V CH e n/a 5 847 881 919 N
+ AO V CH s n/a 5 847 881 919 N
+ AO V D b n/a 5 859 881 914 N
+ AO V D e n/a 5 847 881 914 N
+ AO V D s n/a 5 847 881 914 N
+ AO V DH e n/a 5 847 881 920 N
+ AO V DH s n/a 5 847 881 920 N
+ AO V EH b n/a 5 859 881 918 N
+ AO V EH e n/a 5 847 881 918 N
+ AO V EH s n/a 5 847 881 918 N
+ AO V ER e n/a 5 876 905 932 N
+ AO V ER s n/a 5 876 905 932 N
+ AO V EY e n/a 5 847 881 918 N
+ AO V EY s n/a 5 847 881 918 N
+ AO V F b n/a 5 859 887 922 N
+ AO V F e n/a 5 847 887 922 N
+ AO V F i n/a 5 848 887 922 N
+ AO V F s n/a 5 847 887 922 N
+ AO V G b n/a 5 859 881 920 N
+ AO V G e n/a 5 847 881 920 N
+ AO V G i n/a 5 848 881 920 N
+ AO V G s n/a 5 847 881 920 N
+ AO V HH e n/a 5 847 881 919 N
+ AO V HH s n/a 5 847 881 919 N
+ AO V IH e n/a 5 847 881 916 N
+ AO V IH s n/a 5 847 881 916 N
+ AO V IY b n/a 5 859 881 916 N
+ AO V IY e n/a 5 847 881 916 N
+ AO V IY s n/a 5 847 881 916 N
+ AO V JH b n/a 5 859 881 920 N
+ AO V JH e n/a 5 847 881 920 N
+ AO V JH s n/a 5 847 881 920 N
+ AO V K b n/a 5 859 886 919 N
+ AO V K e n/a 5 847 886 919 N
+ AO V K i n/a 5 848 886 919 N
+ AO V K s n/a 5 847 886 919 N
+ AO V L b n/a 5 859 900 929 N
+ AO V L e n/a 5 847 900 928 N
+ AO V L i n/a 5 848 900 928 N
+ AO V L s n/a 5 847 900 928 N
+ AO V M b n/a 5 859 890 926 N
+ AO V M e n/a 5 847 894 926 N
+ AO V M s n/a 5 847 894 926 N
+ AO V N b n/a 5 859 890 924 N
+ AO V N e n/a 5 847 894 923 N
+ AO V N i n/a 5 848 894 923 N
+ AO V N s n/a 5 847 894 923 N
+ AO V NG b n/a 5 859 894 926 N
+ AO V NG e n/a 5 847 894 926 N
+ AO V NG i n/a 5 848 894 926 N
+ AO V NG s n/a 5 847 894 926 N
+ AO V OW e n/a 5 847 900 918 N
+ AO V OW s n/a 5 847 900 918 N
+ AO V OY e n/a 5 847 900 918 N
+ AO V OY s n/a 5 847 900 918 N
+ AO V P b n/a 5 859 887 922 N
+ AO V P e n/a 5 847 887 922 N
+ AO V P s n/a 5 847 887 922 N
+ AO V R b n/a 5 876 905 932 N
+ AO V R e n/a 5 876 905 932 N
+ AO V R i n/a 5 875 903 932 N
+ AO V R s n/a 5 876 905 932 N
+ AO V S b n/a 5 859 881 921 N
+ AO V S e n/a 5 847 881 921 N
+ AO V S i n/a 5 848 881 921 N
+ AO V S s n/a 5 847 881 921 N
+ AO V SH b n/a 5 859 881 919 N
+ AO V SH e n/a 5 847 881 919 N
+ AO V SH s n/a 5 847 881 919 N
+ AO V SIL e n/a 5 847 881 918 N
+ AO V SIL s n/a 5 847 881 918 N
+ AO V T b n/a 5 859 886 914 N
+ AO V T e n/a 5 847 886 914 N
+ AO V T i n/a 5 848 886 914 N
+ AO V T s n/a 5 847 886 914 N
+ AO V TH b n/a 5 859 881 921 N
+ AO V TH e n/a 5 847 881 921 N
+ AO V TH s n/a 5 847 881 921 N
+ AO V UH e n/a 5 847 900 916 N
+ AO V UH s n/a 5 847 900 916 N
+ AO V UW e n/a 5 847 900 916 N
+ AO V UW s n/a 5 847 900 916 N
+ AO V V e n/a 5 847 887 922 N
+ AO V V s n/a 5 847 887 922 N
+ AO V W e n/a 5 847 900 928 N
+ AO V W s n/a 5 847 900 928 N
+ AO V Y e n/a 5 847 881 916 N
+ AO V Y s n/a 5 847 881 916 N
+ AO V Z b n/a 5 859 881 915 N
+ AO V Z e n/a 5 847 881 915 N
+ AO V Z s n/a 5 847 881 915 N
+ AO V ZH e n/a 5 847 881 920 N
+ AO V ZH s n/a 5 847 881 920 N
+ AO W AA e n/a 5 843 900 918 N
+ AO W AA s n/a 5 843 900 918 N
+ AO W AE e n/a 5 846 892 918 N
+ AO W AE s n/a 5 846 892 918 N
+ AO W AH e n/a 5 846 892 918 N
+ AO W AH i n/a 5 846 892 918 N
+ AO W AH s n/a 5 846 892 918 N
+ AO W AO e n/a 5 843 900 918 N
+ AO W AO s n/a 5 843 900 918 N
+ AO W AW e n/a 5 846 892 918 N
+ AO W AW s n/a 5 846 892 918 N
+ AO W AY e n/a 5 843 900 918 N
+ AO W AY s n/a 5 843 900 918 N
+ AO W B b n/a 5 846 892 922 N
+ AO W B e n/a 5 846 892 922 N
+ AO W B i n/a 5 846 892 922 N
+ AO W B s n/a 5 846 892 922 N
+ AO W CH b n/a 5 846 891 919 N
+ AO W CH e n/a 5 846 891 919 N
+ AO W CH i n/a 5 846 891 919 N
+ AO W CH s n/a 5 846 891 919 N
+ AO W D b n/a 5 846 892 917 N
+ AO W D e n/a 5 846 892 917 N
+ AO W D i n/a 5 846 892 917 N
+ AO W D s n/a 5 846 892 917 N
+ AO W DH e n/a 5 846 892 920 N
+ AO W DH s n/a 5 846 892 920 N
+ AO W EH b n/a 5 846 892 918 N
+ AO W EH e n/a 5 846 892 918 N
+ AO W EH i n/a 5 846 892 918 N
+ AO W EH s n/a 5 846 892 918 N
+ AO W ER e n/a 5 873 904 932 N
+ AO W ER s n/a 5 873 904 932 N
+ AO W EY e n/a 5 846 892 918 N
+ AO W EY s n/a 5 846 892 918 N
+ AO W F b n/a 5 846 892 922 N
+ AO W F e n/a 5 846 892 922 N
+ AO W F s n/a 5 846 892 922 N
+ AO W G b n/a 5 846 892 920 N
+ AO W G e n/a 5 846 892 920 N
+ AO W G i n/a 5 846 892 920 N
+ AO W G s n/a 5 846 892 920 N
+ AO W HH e n/a 5 846 892 919 N
+ AO W HH i n/a 5 846 892 919 N
+ AO W HH s n/a 5 846 892 919 N
+ AO W IH e n/a 5 846 892 916 N
+ AO W IH s n/a 5 846 892 916 N
+ AO W IY b n/a 5 846 892 916 N
+ AO W IY e n/a 5 846 892 916 N
+ AO W IY s n/a 5 846 892 916 N
+ AO W JH b n/a 5 846 891 920 N
+ AO W JH e n/a 5 846 891 920 N
+ AO W JH s n/a 5 846 891 920 N
+ AO W K b n/a 5 846 892 919 N
+ AO W K e n/a 5 846 892 919 N
+ AO W K i n/a 5 846 892 919 N
+ AO W K s n/a 5 846 892 919 N
+ AO W L b n/a 5 843 900 929 N
+ AO W L e n/a 5 843 900 928 N
+ AO W L i n/a 5 843 900 928 N
+ AO W L s n/a 5 843 900 928 N
+ AO W M b n/a 5 846 893 926 N
+ AO W M e n/a 5 846 893 926 N
+ AO W M i n/a 5 846 890 926 N
+ AO W M s n/a 5 846 893 926 N
+ AO W N b n/a 5 846 893 925 N
+ AO W N e n/a 5 846 893 925 N
+ AO W N i n/a 5 846 893 925 N
+ AO W N s n/a 5 846 893 925 N
+ AO W NG b n/a 5 846 893 926 N
+ AO W NG e n/a 5 846 893 926 N
+ AO W NG i n/a 5 846 890 926 N
+ AO W NG s n/a 5 846 893 926 N
+ AO W OW e n/a 5 843 900 918 N
+ AO W OW s n/a 5 843 900 918 N
+ AO W OY e n/a 5 843 900 918 N
+ AO W OY s n/a 5 843 900 918 N
+ AO W P b n/a 5 846 892 922 N
+ AO W P e n/a 5 846 892 922 N
+ AO W P i n/a 5 846 892 922 N
+ AO W P s n/a 5 846 892 922 N
+ AO W R b n/a 5 873 904 932 N
+ AO W R e n/a 5 873 904 932 N
+ AO W R i n/a 5 873 904 931 N
+ AO W R s n/a 5 873 904 932 N
+ AO W S b n/a 5 846 892 921 N
+ AO W S e n/a 5 846 892 921 N
+ AO W S i n/a 5 846 892 921 N
+ AO W S s n/a 5 846 892 921 N
+ AO W SH b n/a 5 846 891 919 N
+ AO W SH e n/a 5 846 891 919 N
+ AO W SH i n/a 5 846 891 919 N
+ AO W SH s n/a 5 846 891 919 N
+ AO W SIL e n/a 5 846 892 918 N
+ AO W SIL s n/a 5 846 892 918 N
+ AO W T b n/a 5 846 891 917 N
+ AO W T e n/a 5 846 891 917 N
+ AO W T i n/a 5 846 891 917 N
+ AO W T s n/a 5 846 891 917 N
+ AO W TH b n/a 5 846 892 921 N
+ AO W TH e n/a 5 846 892 921 N
+ AO W TH i n/a 5 846 892 921 N
+ AO W TH s n/a 5 846 892 921 N
+ AO W UH e n/a 5 843 900 916 N
+ AO W UH s n/a 5 843 900 916 N
+ AO W UW e n/a 5 843 900 916 N
+ AO W UW s n/a 5 843 900 916 N
+ AO W V e n/a 5 846 892 922 N
+ AO W V s n/a 5 846 892 922 N
+ AO W W e n/a 5 843 900 928 N
+ AO W W s n/a 5 843 900 928 N
+ AO W Y e n/a 5 846 891 916 N
+ AO W Y s n/a 5 846 891 916 N
+ AO W Z b n/a 5 846 892 915 N
+ AO W Z e n/a 5 846 892 915 N
+ AO W Z i n/a 5 846 892 915 N
+ AO W Z s n/a 5 846 892 915 N
+ AO W ZH e n/a 5 846 891 920 N
+ AO W ZH s n/a 5 846 891 920 N
+ AO Y AA e n/a 5 857 899 918 N
+ AO Y AA s n/a 5 857 899 918 N
+ AO Y AE e n/a 5 857 881 918 N
+ AO Y AE s n/a 5 857 881 918 N
+ AO Y AH e n/a 5 857 881 918 N
+ AO Y AH i n/a 5 857 881 918 N
+ AO Y AH s n/a 5 857 881 918 N
+ AO Y AO e n/a 5 857 899 918 N
+ AO Y AO s n/a 5 857 899 918 N
+ AO Y AW e n/a 5 857 881 918 N
+ AO Y AW s n/a 5 857 881 918 N
+ AO Y AY e n/a 5 857 899 918 N
+ AO Y AY s n/a 5 857 899 918 N
+ AO Y B b n/a 5 852 887 922 N
+ AO Y B e n/a 5 857 887 922 N
+ AO Y B s n/a 5 857 887 922 N
+ AO Y CH b n/a 5 852 881 919 N
+ AO Y CH e n/a 5 857 881 919 N
+ AO Y CH i n/a 5 857 881 919 N
+ AO Y CH s n/a 5 857 881 919 N
+ AO Y D b n/a 5 852 881 914 N
+ AO Y D e n/a 5 857 881 914 N
+ AO Y D s n/a 5 857 881 914 N
+ AO Y DH e n/a 5 857 881 920 N
+ AO Y DH s n/a 5 857 881 920 N
+ AO Y EH b n/a 5 852 881 918 N
+ AO Y EH e n/a 5 857 881 918 N
+ AO Y EH s n/a 5 857 881 918 N
+ AO Y ER e n/a 5 871 911 936 N
+ AO Y ER s n/a 5 871 911 936 N
+ AO Y EY e n/a 5 857 881 918 N
+ AO Y EY s n/a 5 857 881 918 N
+ AO Y F b n/a 5 852 887 922 N
+ AO Y F e n/a 5 857 887 922 N
+ AO Y F i n/a 5 857 887 922 N
+ AO Y F s n/a 5 857 887 922 N
+ AO Y G b n/a 5 852 881 920 N
+ AO Y G e n/a 5 857 881 920 N
+ AO Y G s n/a 5 857 881 920 N
+ AO Y HH e n/a 5 857 881 919 N
+ AO Y HH s n/a 5 857 881 919 N
+ AO Y IH e n/a 5 857 881 916 N
+ AO Y IH i n/a 5 857 881 916 N
+ AO Y IH s n/a 5 857 881 916 N
+ AO Y IY b n/a 5 852 881 916 N
+ AO Y IY e n/a 5 857 881 916 N
+ AO Y IY s n/a 5 857 881 916 N
+ AO Y JH b n/a 5 852 881 920 N
+ AO Y JH e n/a 5 857 881 920 N
+ AO Y JH i n/a 5 857 881 920 N
+ AO Y JH s n/a 5 857 881 920 N
+ AO Y K b n/a 5 852 886 919 N
+ AO Y K e n/a 5 857 886 919 N
+ AO Y K i n/a 5 857 886 919 N
+ AO Y K s n/a 5 857 886 919 N
+ AO Y L b n/a 5 852 897 930 N
+ AO Y L e n/a 5 857 899 928 N
+ AO Y L i n/a 5 857 899 928 N
+ AO Y L s n/a 5 857 899 928 N
+ AO Y M b n/a 5 852 890 926 N
+ AO Y M e n/a 5 857 894 926 N
+ AO Y M s n/a 5 857 894 926 N
+ AO Y N b n/a 5 852 890 924 N
+ AO Y N e n/a 5 857 894 923 N
+ AO Y N i n/a 5 857 894 923 N
+ AO Y N s n/a 5 857 894 923 N
+ AO Y NG b n/a 5 852 894 926 N
+ AO Y NG e n/a 5 857 894 926 N
+ AO Y NG i n/a 5 857 894 926 N
+ AO Y NG s n/a 5 857 894 926 N
+ AO Y OW e n/a 5 857 899 918 N
+ AO Y OW s n/a 5 857 899 918 N
+ AO Y OY e n/a 5 857 899 918 N
+ AO Y OY s n/a 5 857 899 918 N
+ AO Y P b n/a 5 852 887 922 N
+ AO Y P e n/a 5 857 887 922 N
+ AO Y P i n/a 5 857 887 922 N
+ AO Y P s n/a 5 857 887 922 N
+ AO Y R b n/a 5 871 911 936 N
+ AO Y R e n/a 5 871 911 936 N
+ AO Y R i n/a 5 871 907 935 N
+ AO Y R s n/a 5 871 911 936 N
+ AO Y S b n/a 5 852 881 921 N
+ AO Y S e n/a 5 857 881 921 N
+ AO Y S i n/a 5 857 881 921 N
+ AO Y S s n/a 5 857 881 921 N
+ AO Y SH b n/a 5 852 881 919 N
+ AO Y SH e n/a 5 857 881 919 N
+ AO Y SH s n/a 5 857 881 919 N
+ AO Y SIL e n/a 5 857 881 918 N
+ AO Y SIL s n/a 5 857 881 918 N
+ AO Y T b n/a 5 852 886 914 N
+ AO Y T e n/a 5 857 886 914 N
+ AO Y T i n/a 5 857 886 914 N
+ AO Y T s n/a 5 857 886 914 N
+ AO Y TH b n/a 5 852 881 921 N
+ AO Y TH e n/a 5 857 881 921 N
+ AO Y TH s n/a 5 857 881 921 N
+ AO Y UH e n/a 5 857 899 916 N
+ AO Y UH s n/a 5 857 899 916 N
+ AO Y UW e n/a 5 857 899 916 N
+ AO Y UW s n/a 5 857 899 916 N
+ AO Y V e n/a 5 857 887 922 N
+ AO Y V i n/a 5 857 887 922 N
+ AO Y V s n/a 5 857 887 922 N
+ AO Y W e n/a 5 857 899 928 N
+ AO Y W s n/a 5 857 899 928 N
+ AO Y Y e n/a 5 857 881 916 N
+ AO Y Y s n/a 5 857 881 916 N
+ AO Y Z b n/a 5 852 881 915 N
+ AO Y Z e n/a 5 857 881 915 N
+ AO Y Z i n/a 5 857 881 915 N
+ AO Y Z s n/a 5 857 881 915 N
+ AO Y ZH e n/a 5 857 881 920 N
+ AO Y ZH s n/a 5 857 881 920 N
+ AO Z AA s n/a 5 856 897 918 N
+ AO Z AE s n/a 5 856 884 918 N
+ AO Z AH s n/a 5 856 884 918 N
+ AO Z AO s n/a 5 856 897 918 N
+ AO Z AW s n/a 5 856 884 918 N
+ AO Z AY s n/a 5 856 897 918 N
+ AO Z B b n/a 5 851 887 922 N
+ AO Z B s n/a 5 856 887 922 N
+ AO Z CH b n/a 5 851 884 919 N
+ AO Z CH s n/a 5 856 884 919 N
+ AO Z D b n/a 5 851 885 914 N
+ AO Z D s n/a 5 856 885 914 N
+ AO Z DH s n/a 5 856 884 920 N
+ AO Z EH b n/a 5 851 884 918 N
+ AO Z EH s n/a 5 856 884 918 N
+ AO Z ER s n/a 5 866 911 936 N
+ AO Z EY s n/a 5 856 884 918 N
+ AO Z F b n/a 5 851 887 922 N
+ AO Z F i n/a 5 856 887 922 N
+ AO Z F s n/a 5 856 887 922 N
+ AO Z G b n/a 5 851 884 920 N
+ AO Z G i n/a 5 856 884 920 N
+ AO Z G s n/a 5 856 884 920 N
+ AO Z HH s n/a 5 856 884 919 N
+ AO Z IH s n/a 5 856 884 916 N
+ AO Z IY b n/a 5 851 884 916 N
+ AO Z IY s n/a 5 856 884 916 N
+ AO Z JH b n/a 5 851 884 920 N
+ AO Z JH s n/a 5 856 884 920 N
+ AO Z K b n/a 5 851 886 919 N
+ AO Z K s n/a 5 856 886 919 N
+ AO Z L b n/a 5 851 897 929 N
+ AO Z L i n/a 5 856 897 928 N
+ AO Z L s n/a 5 856 897 928 N
+ AO Z M b n/a 5 851 890 926 N
+ AO Z M i n/a 5 856 894 926 N
+ AO Z M s n/a 5 856 894 926 N
+ AO Z N b n/a 5 851 890 924 N
+ AO Z N i n/a 5 856 894 923 N
+ AO Z N s n/a 5 856 894 923 N
+ AO Z NG b n/a 5 851 894 926 N
+ AO Z NG i n/a 5 856 894 926 N
+ AO Z NG s n/a 5 856 894 926 N
+ AO Z OW s n/a 5 856 897 918 N
+ AO Z OY s n/a 5 856 897 918 N
+ AO Z P b n/a 5 851 887 922 N
+ AO Z P s n/a 5 856 887 922 N
+ AO Z R b n/a 5 866 911 936 N
+ AO Z R i n/a 5 864 907 935 N
+ AO Z R s n/a 5 866 911 936 N
+ AO Z S b n/a 5 851 885 921 N
+ AO Z S i n/a 5 856 885 921 N
+ AO Z S s n/a 5 856 885 921 N
+ AO Z SH b n/a 5 851 884 919 N
+ AO Z SH s n/a 5 856 884 919 N
+ AO Z SIL s n/a 5 856 884 918 N
+ AO Z T b n/a 5 851 885 914 N
+ AO Z T i n/a 5 856 885 914 N
+ AO Z T s n/a 5 856 885 914 N
+ AO Z TH b n/a 5 851 884 921 N
+ AO Z TH s n/a 5 856 884 921 N
+ AO Z UH s n/a 5 856 897 916 N
+ AO Z UW s n/a 5 856 897 916 N
+ AO Z V i n/a 5 856 887 922 N
+ AO Z V s n/a 5 856 887 922 N
+ AO Z W s n/a 5 856 897 928 N
+ AO Z Y s n/a 5 856 884 916 N
+ AO Z Z b n/a 5 851 885 915 N
+ AO Z Z s n/a 5 856 885 915 N
+ AO Z ZH s n/a 5 856 884 920 N
+ AO ZH AA e n/a 5 856 899 918 N
+ AO ZH AA s n/a 5 856 899 918 N
+ AO ZH AE e n/a 5 856 881 918 N
+ AO ZH AE s n/a 5 856 881 918 N
+ AO ZH AH e n/a 5 856 881 918 N
+ AO ZH AH s n/a 5 856 881 918 N
+ AO ZH AO e n/a 5 856 899 918 N
+ AO ZH AO s n/a 5 856 899 918 N
+ AO ZH AW e n/a 5 856 881 918 N
+ AO ZH AW s n/a 5 856 881 918 N
+ AO ZH AY e n/a 5 856 899 918 N
+ AO ZH AY s n/a 5 856 899 918 N
+ AO ZH B b n/a 5 851 887 922 N
+ AO ZH B e n/a 5 856 887 922 N
+ AO ZH B s n/a 5 856 887 922 N
+ AO ZH CH b n/a 5 851 881 919 N
+ AO ZH CH e n/a 5 856 881 919 N
+ AO ZH CH s n/a 5 856 881 919 N
+ AO ZH D b n/a 5 851 881 914 N
+ AO ZH D e n/a 5 856 881 914 N
+ AO ZH D s n/a 5 856 881 914 N
+ AO ZH DH e n/a 5 856 881 920 N
+ AO ZH DH s n/a 5 856 881 920 N
+ AO ZH EH b n/a 5 851 881 918 N
+ AO ZH EH e n/a 5 856 881 918 N
+ AO ZH EH s n/a 5 856 881 918 N
+ AO ZH ER e n/a 5 870 911 936 N
+ AO ZH ER s n/a 5 870 911 936 N
+ AO ZH EY e n/a 5 856 881 918 N
+ AO ZH EY s n/a 5 856 881 918 N
+ AO ZH F b n/a 5 851 887 922 N
+ AO ZH F e n/a 5 856 887 922 N
+ AO ZH F s n/a 5 856 887 922 N
+ AO ZH G b n/a 5 851 881 920 N
+ AO ZH G e n/a 5 856 881 920 N
+ AO ZH G s n/a 5 856 881 920 N
+ AO ZH HH e n/a 5 856 881 919 N
+ AO ZH HH s n/a 5 856 881 919 N
+ AO ZH IH e n/a 5 856 881 916 N
+ AO ZH IH s n/a 5 856 881 916 N
+ AO ZH IY b n/a 5 851 881 916 N
+ AO ZH IY e n/a 5 856 881 916 N
+ AO ZH IY s n/a 5 856 881 916 N
+ AO ZH JH b n/a 5 851 881 920 N
+ AO ZH JH e n/a 5 856 881 920 N
+ AO ZH JH s n/a 5 856 881 920 N
+ AO ZH K b n/a 5 851 886 919 N
+ AO ZH K e n/a 5 856 886 919 N
+ AO ZH K s n/a 5 856 886 919 N
+ AO ZH L b n/a 5 851 897 929 N
+ AO ZH L e n/a 5 856 899 928 N
+ AO ZH L s n/a 5 856 899 928 N
+ AO ZH M b n/a 5 851 890 926 N
+ AO ZH M e n/a 5 856 894 926 N
+ AO ZH M s n/a 5 856 894 926 N
+ AO ZH N b n/a 5 851 890 924 N
+ AO ZH N e n/a 5 856 894 923 N
+ AO ZH N i n/a 5 856 894 923 N
+ AO ZH N s n/a 5 856 894 923 N
+ AO ZH NG b n/a 5 851 894 926 N
+ AO ZH NG e n/a 5 856 894 926 N
+ AO ZH NG i n/a 5 856 894 926 N
+ AO ZH NG s n/a 5 856 894 926 N
+ AO ZH OW e n/a 5 856 899 918 N
+ AO ZH OW s n/a 5 856 899 918 N
+ AO ZH OY e n/a 5 856 899 918 N
+ AO ZH OY s n/a 5 856 899 918 N
+ AO ZH P b n/a 5 851 887 922 N
+ AO ZH P e n/a 5 856 887 922 N
+ AO ZH P s n/a 5 856 887 922 N
+ AO ZH R b n/a 5 870 911 936 N
+ AO ZH R e n/a 5 870 911 936 N
+ AO ZH R i n/a 5 871 907 935 N
+ AO ZH R s n/a 5 870 911 936 N
+ AO ZH S b n/a 5 851 881 921 N
+ AO ZH S e n/a 5 856 881 921 N
+ AO ZH S s n/a 5 856 881 921 N
+ AO ZH SH b n/a 5 851 881 919 N
+ AO ZH SH e n/a 5 856 881 919 N
+ AO ZH SH s n/a 5 856 881 919 N
+ AO ZH SIL e n/a 5 856 881 918 N
+ AO ZH SIL s n/a 5 856 881 918 N
+ AO ZH T b n/a 5 851 886 914 N
+ AO ZH T e n/a 5 856 886 914 N
+ AO ZH T s n/a 5 856 886 914 N
+ AO ZH TH b n/a 5 851 881 921 N
+ AO ZH TH e n/a 5 856 881 921 N
+ AO ZH TH s n/a 5 856 881 921 N
+ AO ZH UH e n/a 5 856 899 916 N
+ AO ZH UH s n/a 5 856 899 916 N
+ AO ZH UW e n/a 5 856 899 916 N
+ AO ZH UW s n/a 5 856 899 916 N
+ AO ZH V e n/a 5 856 887 922 N
+ AO ZH V s n/a 5 856 887 922 N
+ AO ZH W e n/a 5 856 899 928 N
+ AO ZH W s n/a 5 856 899 928 N
+ AO ZH Y e n/a 5 856 881 916 N
+ AO ZH Y s n/a 5 856 881 916 N
+ AO ZH Z b n/a 5 851 881 915 N
+ AO ZH Z e n/a 5 856 881 915 N
+ AO ZH Z i n/a 5 856 881 915 N
+ AO ZH Z s n/a 5 856 881 915 N
+ AO ZH ZH e n/a 5 856 881 920 N
+ AO ZH ZH s n/a 5 856 881 920 N
+ AW AA AA s n/a 6 941 959 980 N
+ AW AA AE s n/a 6 941 959 979 N
+ AW AA AH b n/a 6 942 959 979 N
+ AW AA AH s n/a 6 941 959 979 N
+ AW AA AO s n/a 6 941 959 980 N
+ AW AA AW s n/a 6 941 959 980 N
+ AW AA AY s n/a 6 941 959 979 N
+ AW AA B b n/a 6 942 959 970 N
+ AW AA B s n/a 6 941 959 970 N
+ AW AA CH b n/a 6 942 959 971 N
+ AW AA CH s n/a 6 941 959 971 N
+ AW AA D b n/a 6 942 963 975 N
+ AW AA D s n/a 6 941 963 975 N
+ AW AA DH s n/a 6 941 963 970 N
+ AW AA EH s n/a 6 941 959 979 N
+ AW AA ER b n/a 6 942 959 981 N
+ AW AA ER s n/a 6 941 959 981 N
+ AW AA EY s n/a 6 941 959 979 N
+ AW AA F b n/a 6 942 959 970 N
+ AW AA F s n/a 6 941 959 970 N
+ AW AA G b n/a 6 942 959 970 N
+ AW AA G s n/a 6 941 959 970 N
+ AW AA HH s n/a 6 941 959 970 N
+ AW AA IH b n/a 6 942 959 979 N
+ AW AA IH s n/a 6 941 959 979 N
+ AW AA IY b n/a 6 942 959 979 N
+ AW AA IY s n/a 6 941 959 979 N
+ AW AA JH s n/a 6 941 959 971 N
+ AW AA K b n/a 6 942 959 970 N
+ AW AA K s n/a 6 941 959 970 N
+ AW AA L b n/a 6 942 959 980 N
+ AW AA L s n/a 6 941 959 980 N
+ AW AA M b n/a 6 942 969 982 N
+ AW AA M s n/a 6 941 969 982 N
+ AW AA N b n/a 6 942 966 982 N
+ AW AA N s n/a 6 941 966 982 N
+ AW AA NG b n/a 6 942 969 982 N
+ AW AA NG s n/a 6 941 969 982 N
+ AW AA OW s n/a 6 941 959 980 N
+ AW AA OY s n/a 6 941 959 979 N
+ AW AA P b n/a 6 942 959 970 N
+ AW AA P s n/a 6 941 959 970 N
+ AW AA R b n/a 6 942 959 981 N
+ AW AA R s n/a 6 941 959 981 N
+ AW AA S b n/a 6 942 963 971 N
+ AW AA S s n/a 6 941 963 971 N
+ AW AA SH b n/a 6 942 959 971 N
+ AW AA SH s n/a 6 941 959 971 N
+ AW AA SIL s n/a 6 941 959 976 N
+ AW AA T b n/a 6 942 963 974 N
+ AW AA T s n/a 6 941 963 974 N
+ AW AA TH b n/a 6 942 963 970 N
+ AW AA TH s n/a 6 941 963 970 N
+ AW AA UH s n/a 6 941 959 980 N
+ AW AA UW b n/a 6 942 959 980 N
+ AW AA UW s n/a 6 941 959 980 N
+ AW AA V s n/a 6 941 959 970 N
+ AW AA W s n/a 6 941 959 980 N
+ AW AA Y b n/a 6 942 959 977 N
+ AW AA Y s n/a 6 941 959 977 N
+ AW AA Z b n/a 6 942 963 972 N
+ AW AA Z s n/a 6 941 963 972 N
+ AW AA ZH s n/a 6 941 959 972 N
+ AW AE AA s n/a 6 945 959 980 N
+ AW AE AE s n/a 6 945 959 979 N
+ AW AE AH b n/a 6 945 959 979 N
+ AW AE AH s n/a 6 945 959 979 N
+ AW AE AO s n/a 6 945 959 980 N
+ AW AE AW s n/a 6 945 959 980 N
+ AW AE AY s n/a 6 945 959 979 N
+ AW AE B b n/a 6 945 959 970 N
+ AW AE B s n/a 6 945 959 970 N
+ AW AE CH b n/a 6 945 959 971 N
+ AW AE CH i n/a 6 945 959 971 N
+ AW AE CH s n/a 6 945 959 971 N
+ AW AE D b n/a 6 945 964 975 N
+ AW AE D i n/a 6 945 964 975 N
+ AW AE D s n/a 6 945 964 975 N
+ AW AE DH s n/a 6 945 965 970 N
+ AW AE EH s n/a 6 945 959 979 N
+ AW AE ER b n/a 6 945 959 981 N
+ AW AE ER s n/a 6 945 959 981 N
+ AW AE EY s n/a 6 945 959 979 N
+ AW AE F b n/a 6 945 959 970 N
+ AW AE F s n/a 6 945 959 970 N
+ AW AE G b n/a 6 945 959 970 N
+ AW AE G s n/a 6 945 959 970 N
+ AW AE HH s n/a 6 945 959 970 N
+ AW AE IH b n/a 6 945 959 979 N
+ AW AE IH s n/a 6 945 959 979 N
+ AW AE IY b n/a 6 945 959 979 N
+ AW AE IY s n/a 6 945 959 979 N
+ AW AE JH s n/a 6 945 959 971 N
+ AW AE K b n/a 6 945 959 970 N
+ AW AE K s n/a 6 945 959 970 N
+ AW AE L b n/a 6 945 959 980 N
+ AW AE L s n/a 6 945 959 980 N
+ AW AE M b n/a 6 947 969 982 N
+ AW AE M s n/a 6 947 969 982 N
+ AW AE N b n/a 6 947 966 982 N
+ AW AE N s n/a 6 947 966 982 N
+ AW AE NG b n/a 6 947 969 982 N
+ AW AE NG s n/a 6 947 969 982 N
+ AW AE OW s n/a 6 945 959 980 N
+ AW AE OY s n/a 6 945 959 979 N
+ AW AE P b n/a 6 945 959 970 N
+ AW AE P s n/a 6 945 959 970 N
+ AW AE R b n/a 6 945 959 981 N
+ AW AE R s n/a 6 945 959 981 N
+ AW AE S b n/a 6 945 965 971 N
+ AW AE S s n/a 6 945 965 971 N
+ AW AE SH b n/a 6 945 959 971 N
+ AW AE SH s n/a 6 945 959 971 N
+ AW AE SIL s n/a 6 945 959 976 N
+ AW AE T b n/a 6 945 964 974 N
+ AW AE T s n/a 6 945 964 974 N
+ AW AE TH b n/a 6 945 965 970 N
+ AW AE TH s n/a 6 945 965 970 N
+ AW AE UH s n/a 6 945 959 980 N
+ AW AE UW b n/a 6 945 959 980 N
+ AW AE UW s n/a 6 945 959 980 N
+ AW AE V s n/a 6 945 959 970 N
+ AW AE W s n/a 6 945 959 980 N
+ AW AE Y b n/a 6 945 959 977 N
+ AW AE Y s n/a 6 945 959 977 N
+ AW AE Z b n/a 6 945 965 972 N
+ AW AE Z s n/a 6 945 965 972 N
+ AW AE ZH s n/a 6 945 959 972 N
+ AW AH AA e n/a 6 946 959 980 N
+ AW AH AA s n/a 6 946 959 980 N
+ AW AH AE e n/a 6 946 959 979 N
+ AW AH AE s n/a 6 946 959 979 N
+ AW AH AH b n/a 6 946 959 979 N
+ AW AH AH e n/a 6 946 959 979 N
+ AW AH AH s n/a 6 946 959 979 N
+ AW AH AO e n/a 6 946 959 980 N
+ AW AH AO s n/a 6 946 959 980 N
+ AW AH AW e n/a 6 946 959 980 N
+ AW AH AW s n/a 6 946 959 980 N
+ AW AH AY e n/a 6 946 959 979 N
+ AW AH AY s n/a 6 946 959 979 N
+ AW AH B b n/a 6 946 959 970 N
+ AW AH B e n/a 6 946 959 970 N
+ AW AH B s n/a 6 946 959 970 N
+ AW AH CH b n/a 6 946 959 971 N
+ AW AH CH e n/a 6 946 959 971 N
+ AW AH CH s n/a 6 946 959 971 N
+ AW AH D b n/a 6 946 964 975 N
+ AW AH D e n/a 6 946 964 975 N
+ AW AH D s n/a 6 946 964 975 N
+ AW AH DH e n/a 6 946 965 970 N
+ AW AH DH s n/a 6 946 965 970 N
+ AW AH EH e n/a 6 946 959 979 N
+ AW AH EH s n/a 6 946 959 979 N
+ AW AH ER b n/a 6 946 959 981 N
+ AW AH ER e n/a 6 946 959 981 N
+ AW AH ER s n/a 6 946 959 981 N
+ AW AH EY e n/a 6 946 959 979 N
+ AW AH EY s n/a 6 946 959 979 N
+ AW AH F b n/a 6 946 959 970 N
+ AW AH F e n/a 6 946 959 970 N
+ AW AH F s n/a 6 946 959 970 N
+ AW AH G b n/a 6 946 959 970 N
+ AW AH G e n/a 6 946 959 970 N
+ AW AH G s n/a 6 946 959 970 N
+ AW AH HH e n/a 6 946 959 970 N
+ AW AH HH s n/a 6 946 959 970 N
+ AW AH IH b n/a 6 946 959 979 N
+ AW AH IH e n/a 6 946 959 979 N
+ AW AH IH s n/a 6 946 959 979 N
+ AW AH IY b n/a 6 946 959 979 N
+ AW AH IY e n/a 6 946 959 979 N
+ AW AH IY s n/a 6 946 959 979 N
+ AW AH JH e n/a 6 946 959 971 N
+ AW AH JH s n/a 6 946 959 971 N
+ AW AH K b n/a 6 946 959 970 N
+ AW AH K e n/a 6 946 959 970 N
+ AW AH K s n/a 6 946 959 970 N
+ AW AH L b n/a 6 946 959 980 N
+ AW AH L e n/a 6 946 959 980 N
+ AW AH L s n/a 6 946 959 980 N
+ AW AH M b n/a 6 947 969 982 N
+ AW AH M e n/a 6 947 969 983 N
+ AW AH M s n/a 6 947 969 982 N
+ AW AH N b n/a 6 947 966 982 N
+ AW AH N e n/a 6 947 966 983 N
+ AW AH N s n/a 6 947 966 982 N
+ AW AH NG b n/a 6 947 969 982 N
+ AW AH NG e n/a 6 947 969 983 N
+ AW AH NG s n/a 6 947 969 982 N
+ AW AH OW e n/a 6 946 959 980 N
+ AW AH OW s n/a 6 946 959 980 N
+ AW AH OY e n/a 6 946 959 979 N
+ AW AH OY s n/a 6 946 959 979 N
+ AW AH P b n/a 6 946 959 970 N
+ AW AH P e n/a 6 946 959 970 N
+ AW AH P s n/a 6 946 959 970 N
+ AW AH R b n/a 6 946 959 981 N
+ AW AH R e n/a 6 946 959 981 N
+ AW AH R s n/a 6 946 959 981 N
+ AW AH S b n/a 6 946 965 971 N
+ AW AH S e n/a 6 946 965 971 N
+ AW AH S s n/a 6 946 965 971 N
+ AW AH SH b n/a 6 946 959 971 N
+ AW AH SH e n/a 6 946 959 971 N
+ AW AH SH s n/a 6 946 959 971 N
+ AW AH SIL e n/a 6 946 959 976 N
+ AW AH SIL s n/a 6 946 959 976 N
+ AW AH T b n/a 6 946 964 974 N
+ AW AH T e n/a 6 946 964 974 N
+ AW AH T s n/a 6 946 964 974 N
+ AW AH TH b n/a 6 946 965 970 N
+ AW AH TH e n/a 6 946 965 970 N
+ AW AH TH s n/a 6 946 965 970 N
+ AW AH UH e n/a 6 946 959 980 N
+ AW AH UH s n/a 6 946 959 980 N
+ AW AH UW b n/a 6 946 959 980 N
+ AW AH UW e n/a 6 946 959 980 N
+ AW AH UW s n/a 6 946 959 980 N
+ AW AH V e n/a 6 946 959 970 N
+ AW AH V s n/a 6 946 959 970 N
+ AW AH W e n/a 6 946 959 980 N
+ AW AH W s n/a 6 946 959 980 N
+ AW AH Y b n/a 6 946 959 977 N
+ AW AH Y e n/a 6 946 959 977 N
+ AW AH Y s n/a 6 946 959 977 N
+ AW AH Z b n/a 6 946 965 972 N
+ AW AH Z e n/a 6 946 965 972 N
+ AW AH Z s n/a 6 946 965 972 N
+ AW AH ZH e n/a 6 946 959 972 N
+ AW AH ZH s n/a 6 946 959 972 N
+ AW AO AA s n/a 6 942 959 980 N
+ AW AO AE s n/a 6 942 959 979 N
+ AW AO AH b n/a 6 942 959 979 N
+ AW AO AH s n/a 6 942 959 979 N
+ AW AO AO s n/a 6 942 959 980 N
+ AW AO AW s n/a 6 942 959 980 N
+ AW AO AY s n/a 6 942 959 979 N
+ AW AO B b n/a 6 942 959 970 N
+ AW AO B s n/a 6 942 959 970 N
+ AW AO CH b n/a 6 942 959 971 N
+ AW AO CH s n/a 6 942 959 971 N
+ AW AO D b n/a 6 942 963 975 N
+ AW AO D s n/a 6 942 963 975 N
+ AW AO DH s n/a 6 942 963 970 N
+ AW AO EH s n/a 6 942 959 979 N
+ AW AO ER b n/a 6 942 959 981 N
+ AW AO ER s n/a 6 942 959 981 N
+ AW AO EY s n/a 6 942 959 979 N
+ AW AO F b n/a 6 942 959 970 N
+ AW AO F s n/a 6 942 959 970 N
+ AW AO G b n/a 6 942 959 970 N
+ AW AO G s n/a 6 942 959 970 N
+ AW AO HH s n/a 6 942 959 970 N
+ AW AO IH b n/a 6 942 959 979 N
+ AW AO IH s n/a 6 942 959 979 N
+ AW AO IY b n/a 6 942 959 979 N
+ AW AO IY s n/a 6 942 959 979 N
+ AW AO JH s n/a 6 942 959 971 N
+ AW AO K b n/a 6 942 959 970 N
+ AW AO K s n/a 6 942 959 970 N
+ AW AO L b n/a 6 942 959 980 N
+ AW AO L s n/a 6 942 959 980 N
+ AW AO M b n/a 6 942 969 982 N
+ AW AO M s n/a 6 942 969 982 N
+ AW AO N b n/a 6 942 966 982 N
+ AW AO N s n/a 6 942 966 982 N
+ AW AO NG b n/a 6 942 969 982 N
+ AW AO NG s n/a 6 942 969 982 N
+ AW AO OW s n/a 6 942 959 980 N
+ AW AO OY s n/a 6 942 959 979 N
+ AW AO P b n/a 6 942 959 970 N
+ AW AO P s n/a 6 942 959 970 N
+ AW AO R b n/a 6 942 959 981 N
+ AW AO R s n/a 6 942 959 981 N
+ AW AO S b n/a 6 942 963 971 N
+ AW AO S s n/a 6 942 963 971 N
+ AW AO SH b n/a 6 942 959 971 N
+ AW AO SH s n/a 6 942 959 971 N
+ AW AO SIL s n/a 6 942 959 976 N
+ AW AO T b n/a 6 942 963 974 N
+ AW AO T i n/a 6 942 963 974 N
+ AW AO T s n/a 6 942 963 974 N
+ AW AO TH b n/a 6 942 963 970 N
+ AW AO TH s n/a 6 942 963 970 N
+ AW AO UH s n/a 6 942 959 980 N
+ AW AO UW b n/a 6 942 959 980 N
+ AW AO UW s n/a 6 942 959 980 N
+ AW AO V s n/a 6 942 959 970 N
+ AW AO W s n/a 6 942 959 980 N
+ AW AO Y b n/a 6 942 959 977 N
+ AW AO Y s n/a 6 942 959 977 N
+ AW AO Z b n/a 6 942 963 972 N
+ AW AO Z s n/a 6 942 963 972 N
+ AW AO ZH s n/a 6 942 959 972 N
+ AW AW AA s n/a 6 937 959 980 N
+ AW AW AE s n/a 6 937 959 979 N
+ AW AW AH b n/a 6 937 959 979 N
+ AW AW AH s n/a 6 937 959 979 N
+ AW AW AO s n/a 6 937 959 980 N
+ AW AW AW s n/a 6 937 959 980 N
+ AW AW AY s n/a 6 937 959 979 N
+ AW AW B b n/a 6 937 959 970 N
+ AW AW B s n/a 6 937 959 970 N
+ AW AW CH b n/a 6 937 959 971 N
+ AW AW CH s n/a 6 937 959 971 N
+ AW AW D b n/a 6 937 963 975 N
+ AW AW D s n/a 6 937 963 975 N
+ AW AW DH s n/a 6 937 963 970 N
+ AW AW EH s n/a 6 937 959 979 N
+ AW AW ER b n/a 6 937 959 981 N
+ AW AW ER s n/a 6 937 959 981 N
+ AW AW EY s n/a 6 937 959 979 N
+ AW AW F b n/a 6 937 959 970 N
+ AW AW F s n/a 6 937 959 970 N
+ AW AW G b n/a 6 937 959 970 N
+ AW AW G s n/a 6 937 959 970 N
+ AW AW HH s n/a 6 937 959 970 N
+ AW AW IH b n/a 6 937 959 979 N
+ AW AW IH s n/a 6 937 959 979 N
+ AW AW IY b n/a 6 937 959 979 N
+ AW AW IY s n/a 6 937 959 979 N
+ AW AW JH s n/a 6 937 959 971 N
+ AW AW K b n/a 6 937 959 970 N
+ AW AW K s n/a 6 937 959 970 N
+ AW AW L b n/a 6 937 959 980 N
+ AW AW L s n/a 6 937 959 980 N
+ AW AW M b n/a 6 937 969 982 N
+ AW AW M s n/a 6 937 969 982 N
+ AW AW N b n/a 6 937 966 982 N
+ AW AW N s n/a 6 937 966 982 N
+ AW AW NG b n/a 6 937 969 982 N
+ AW AW NG s n/a 6 937 969 982 N
+ AW AW OW s n/a 6 937 959 980 N
+ AW AW OY s n/a 6 937 959 979 N
+ AW AW P b n/a 6 937 959 970 N
+ AW AW P s n/a 6 937 959 970 N
+ AW AW R b n/a 6 937 959 981 N
+ AW AW R s n/a 6 937 959 981 N
+ AW AW S b n/a 6 937 963 971 N
+ AW AW S s n/a 6 937 963 971 N
+ AW AW SH b n/a 6 937 959 971 N
+ AW AW SH s n/a 6 937 959 971 N
+ AW AW SIL s n/a 6 937 959 976 N
+ AW AW T b n/a 6 937 963 974 N
+ AW AW T s n/a 6 937 963 974 N
+ AW AW TH b n/a 6 937 963 970 N
+ AW AW TH s n/a 6 937 963 970 N
+ AW AW UH s n/a 6 937 959 980 N
+ AW AW UW b n/a 6 937 959 980 N
+ AW AW UW s n/a 6 937 959 980 N
+ AW AW V s n/a 6 937 959 970 N
+ AW AW W s n/a 6 937 959 980 N
+ AW AW Y b n/a 6 937 959 977 N
+ AW AW Y s n/a 6 937 959 977 N
+ AW AW Z b n/a 6 937 963 972 N
+ AW AW Z s n/a 6 937 963 972 N
+ AW AW ZH s n/a 6 937 959 972 N
+ AW AY AA s n/a 6 945 959 980 N
+ AW AY AE s n/a 6 945 959 979 N
+ AW AY AH b n/a 6 945 959 979 N
+ AW AY AH s n/a 6 945 959 979 N
+ AW AY AO s n/a 6 945 959 980 N
+ AW AY AW s n/a 6 945 959 980 N
+ AW AY AY s n/a 6 945 959 979 N
+ AW AY B b n/a 6 945 959 970 N
+ AW AY B s n/a 6 945 959 970 N
+ AW AY CH b n/a 6 945 959 971 N
+ AW AY CH s n/a 6 945 959 971 N
+ AW AY D b n/a 6 945 964 975 N
+ AW AY D s n/a 6 945 964 975 N
+ AW AY DH s n/a 6 945 965 970 N
+ AW AY EH s n/a 6 945 959 979 N
+ AW AY ER b n/a 6 945 959 981 N
+ AW AY ER s n/a 6 945 959 981 N
+ AW AY EY s n/a 6 945 959 979 N
+ AW AY F b n/a 6 945 959 970 N
+ AW AY F s n/a 6 945 959 970 N
+ AW AY G b n/a 6 945 959 970 N
+ AW AY G s n/a 6 945 959 970 N
+ AW AY HH s n/a 6 945 959 970 N
+ AW AY IH b n/a 6 945 959 979 N
+ AW AY IH s n/a 6 945 959 979 N
+ AW AY IY b n/a 6 945 959 979 N
+ AW AY IY s n/a 6 945 959 979 N
+ AW AY JH s n/a 6 945 959 971 N
+ AW AY K b n/a 6 945 959 970 N
+ AW AY K s n/a 6 945 959 970 N
+ AW AY L b n/a 6 945 959 980 N
+ AW AY L s n/a 6 945 959 980 N
+ AW AY M b n/a 6 947 969 982 N
+ AW AY M s n/a 6 947 969 982 N
+ AW AY N b n/a 6 947 966 982 N
+ AW AY N s n/a 6 947 966 982 N
+ AW AY NG b n/a 6 947 969 982 N
+ AW AY NG s n/a 6 947 969 982 N
+ AW AY OW s n/a 6 945 959 980 N
+ AW AY OY s n/a 6 945 959 979 N
+ AW AY P b n/a 6 945 959 970 N
+ AW AY P s n/a 6 945 959 970 N
+ AW AY R b n/a 6 945 959 981 N
+ AW AY R s n/a 6 945 959 981 N
+ AW AY S b n/a 6 945 965 971 N
+ AW AY S s n/a 6 945 965 971 N
+ AW AY SH b n/a 6 945 959 971 N
+ AW AY SH s n/a 6 945 959 971 N
+ AW AY SIL s n/a 6 945 959 976 N
+ AW AY T b n/a 6 945 964 974 N
+ AW AY T i n/a 6 945 964 974 N
+ AW AY T s n/a 6 945 964 974 N
+ AW AY TH b n/a 6 945 965 970 N
+ AW AY TH s n/a 6 945 965 970 N
+ AW AY UH s n/a 6 945 959 980 N
+ AW AY UW b n/a 6 945 959 980 N
+ AW AY UW s n/a 6 945 959 980 N
+ AW AY V s n/a 6 945 959 970 N
+ AW AY W s n/a 6 945 959 980 N
+ AW AY Y b n/a 6 945 959 977 N
+ AW AY Y s n/a 6 945 959 977 N
+ AW AY Z b n/a 6 945 965 972 N
+ AW AY Z s n/a 6 945 965 972 N
+ AW AY ZH s n/a 6 945 959 972 N
+ AW B AA e n/a 6 952 959 980 N
+ AW B AA s n/a 6 952 959 980 N
+ AW B AE e n/a 6 952 959 979 N
+ AW B AE s n/a 6 952 959 979 N
+ AW B AH b n/a 6 952 959 979 N
+ AW B AH e n/a 6 952 959 979 N
+ AW B AH i n/a 6 952 959 979 N
+ AW B AH s n/a 6 952 959 979 N
+ AW B AO e n/a 6 952 959 980 N
+ AW B AO s n/a 6 952 959 980 N
+ AW B AW e n/a 6 952 959 980 N
+ AW B AW s n/a 6 952 959 980 N
+ AW B AY e n/a 6 952 959 979 N
+ AW B AY s n/a 6 952 959 979 N
+ AW B B b n/a 6 952 959 970 N
+ AW B B e n/a 6 952 959 970 N
+ AW B B i n/a 6 952 959 970 N
+ AW B B s n/a 6 952 959 970 N
+ AW B CH b n/a 6 952 959 971 N
+ AW B CH e n/a 6 952 959 971 N
+ AW B CH i n/a 6 952 959 971 N
+ AW B CH s n/a 6 952 959 971 N
+ AW B D b n/a 6 952 963 973 N
+ AW B D e n/a 6 952 963 973 N
+ AW B D i n/a 6 952 963 973 N
+ AW B D s n/a 6 952 963 973 N
+ AW B DH e n/a 6 952 963 970 N
+ AW B DH s n/a 6 952 963 970 N
+ AW B EH e n/a 6 952 959 979 N
+ AW B EH s n/a 6 952 959 979 N
+ AW B ER b n/a 6 952 959 981 N
+ AW B ER e n/a 6 952 959 981 N
+ AW B ER i n/a 6 952 959 981 N
+ AW B ER s n/a 6 952 959 981 N
+ AW B EY e n/a 6 952 959 979 N
+ AW B EY s n/a 6 952 959 979 N
+ AW B F b n/a 6 952 959 970 N
+ AW B F e n/a 6 952 959 970 N
+ AW B F i n/a 6 952 959 970 N
+ AW B F s n/a 6 952 959 970 N
+ AW B G b n/a 6 952 959 970 N
+ AW B G e n/a 6 952 959 970 N
+ AW B G i n/a 6 952 959 970 N
+ AW B G s n/a 6 952 959 970 N
+ AW B HH e n/a 6 952 959 970 N
+ AW B HH i n/a 6 952 959 970 N
+ AW B HH s n/a 6 952 959 970 N
+ AW B IH b n/a 6 952 959 979 N
+ AW B IH e n/a 6 952 959 979 N
+ AW B IH i n/a 6 952 959 979 N
+ AW B IH s n/a 6 952 959 979 N
+ AW B IY b n/a 6 952 959 979 N
+ AW B IY e n/a 6 952 959 979 N
+ AW B IY s n/a 6 952 959 979 N
+ AW B JH e n/a 6 952 959 971 N
+ AW B JH s n/a 6 952 959 971 N
+ AW B K b n/a 6 950 959 970 N
+ AW B K e n/a 6 950 959 970 N
+ AW B K i n/a 6 950 959 970 N
+ AW B K s n/a 6 950 959 970 N
+ AW B L b n/a 6 952 959 980 N
+ AW B L e n/a 6 952 959 980 N
+ AW B L i n/a 6 952 959 980 N
+ AW B L s n/a 6 952 959 980 N
+ AW B M b n/a 6 953 969 982 N
+ AW B M e n/a 6 953 969 983 N
+ AW B M i n/a 6 953 969 982 N
+ AW B M s n/a 6 953 969 982 N
+ AW B N b n/a 6 953 966 982 N
+ AW B N e n/a 6 953 966 983 N
+ AW B N i n/a 6 953 966 982 N
+ AW B N s n/a 6 953 966 982 N
+ AW B NG b n/a 6 953 969 982 N
+ AW B NG e n/a 6 953 969 983 N
+ AW B NG s n/a 6 953 969 982 N
+ AW B OW e n/a 6 952 959 980 N
+ AW B OW s n/a 6 952 959 980 N
+ AW B OY e n/a 6 952 959 979 N
+ AW B OY s n/a 6 952 959 979 N
+ AW B P b n/a 6 950 959 970 N
+ AW B P e n/a 6 950 959 970 N
+ AW B P s n/a 6 950 959 970 N
+ AW B R b n/a 6 952 959 981 N
+ AW B R e n/a 6 952 959 981 N
+ AW B R i n/a 6 952 959 981 N
+ AW B R s n/a 6 952 959 981 N
+ AW B S b n/a 6 952 963 971 N
+ AW B S e n/a 6 952 963 971 N
+ AW B S i n/a 6 952 963 971 N
+ AW B S s n/a 6 952 963 971 N
+ AW B SH b n/a 6 952 959 971 N
+ AW B SH e n/a 6 952 959 971 N
+ AW B SH i n/a 6 952 959 971 N
+ AW B SH s n/a 6 952 959 971 N
+ AW B SIL e n/a 6 952 959 976 N
+ AW B SIL s n/a 6 952 959 976 N
+ AW B T b n/a 6 950 962 973 N
+ AW B T e n/a 6 950 962 973 N
+ AW B T i n/a 6 950 962 973 N
+ AW B T s n/a 6 950 962 973 N
+ AW B TH b n/a 6 952 963 970 N
+ AW B TH e n/a 6 952 963 970 N
+ AW B TH i n/a 6 952 963 970 N
+ AW B TH s n/a 6 952 963 970 N
+ AW B UH e n/a 6 952 959 980 N
+ AW B UH s n/a 6 952 959 980 N
+ AW B UW b n/a 6 952 959 980 N
+ AW B UW e n/a 6 952 959 980 N
+ AW B UW s n/a 6 952 959 980 N
+ AW B V e n/a 6 952 959 970 N
+ AW B V s n/a 6 952 959 970 N
+ AW B W e n/a 6 952 959 980 N
+ AW B W i n/a 6 952 959 980 N
+ AW B W s n/a 6 952 959 980 N
+ AW B Y b n/a 6 952 959 977 N
+ AW B Y e n/a 6 952 959 977 N
+ AW B Y s n/a 6 952 959 977 N
+ AW B Z b n/a 6 952 963 972 N
+ AW B Z e n/a 6 952 963 972 N
+ AW B Z i n/a 6 952 963 972 N
+ AW B Z s n/a 6 952 963 972 N
+ AW B ZH e n/a 6 952 959 972 N
+ AW B ZH s n/a 6 952 959 972 N
+ AW CH AA e n/a 6 937 959 980 N
+ AW CH AA s n/a 6 937 959 980 N
+ AW CH AE e n/a 6 937 959 979 N
+ AW CH AE s n/a 6 937 959 979 N
+ AW CH AH b n/a 6 937 959 979 N
+ AW CH AH e n/a 6 937 959 979 N
+ AW CH AH i n/a 6 937 959 979 N
+ AW CH AH s n/a 6 937 959 979 N
+ AW CH AO e n/a 6 937 959 980 N
+ AW CH AO s n/a 6 937 959 980 N
+ AW CH AW e n/a 6 937 959 980 N
+ AW CH AW s n/a 6 937 959 980 N
+ AW CH AY e n/a 6 937 959 979 N
+ AW CH AY s n/a 6 937 959 979 N
+ AW CH B b n/a 6 937 959 970 N
+ AW CH B e n/a 6 937 959 970 N
+ AW CH B i n/a 6 937 959 970 N
+ AW CH B s n/a 6 937 959 970 N
+ AW CH CH b n/a 6 937 959 971 N
+ AW CH CH e n/a 6 937 959 971 N
+ AW CH CH i n/a 6 937 959 971 N
+ AW CH CH s n/a 6 937 959 971 N
+ AW CH D b n/a 6 948 964 975 N
+ AW CH D e n/a 6 948 964 975 N
+ AW CH D i n/a 6 948 964 975 N
+ AW CH D s n/a 6 948 964 975 N
+ AW CH DH e n/a 6 937 965 970 N
+ AW CH DH s n/a 6 937 965 970 N
+ AW CH EH e n/a 6 937 959 979 N
+ AW CH EH s n/a 6 937 959 979 N
+ AW CH ER b n/a 6 937 959 981 N
+ AW CH ER e n/a 6 937 959 981 N
+ AW CH ER s n/a 6 937 959 981 N
+ AW CH EY e n/a 6 937 959 979 N
+ AW CH EY s n/a 6 937 959 979 N
+ AW CH F b n/a 6 937 959 970 N
+ AW CH F e n/a 6 937 959 970 N
+ AW CH F s n/a 6 937 959 970 N
+ AW CH G b n/a 6 937 959 970 N
+ AW CH G e n/a 6 937 959 970 N
+ AW CH G s n/a 6 937 959 970 N
+ AW CH HH e n/a 6 937 959 970 N
+ AW CH HH s n/a 6 937 959 970 N
+ AW CH IH b n/a 6 937 959 979 N
+ AW CH IH e n/a 6 937 959 979 N
+ AW CH IH s n/a 6 937 959 979 N
+ AW CH IY b n/a 6 937 959 979 N
+ AW CH IY e n/a 6 937 959 979 N
+ AW CH IY i n/a 6 937 959 979 N
+ AW CH IY s n/a 6 937 959 979 N
+ AW CH JH e n/a 6 937 959 971 N
+ AW CH JH s n/a 6 937 959 971 N
+ AW CH K b n/a 6 937 959 970 N
+ AW CH K e n/a 6 937 959 970 N
+ AW CH K s n/a 6 937 959 970 N
+ AW CH L b n/a 6 937 959 980 N
+ AW CH L e n/a 6 937 959 980 N
+ AW CH L s n/a 6 937 959 980 N
+ AW CH M b n/a 6 937 969 982 N
+ AW CH M e n/a 6 937 969 983 N
+ AW CH M i n/a 6 937 969 982 N
+ AW CH M s n/a 6 937 969 982 N
+ AW CH N b n/a 6 947 966 982 N
+ AW CH N e n/a 6 947 966 983 N
+ AW CH N i n/a 6 947 966 982 N
+ AW CH N s n/a 6 947 966 982 N
+ AW CH NG b n/a 6 937 969 982 N
+ AW CH NG e n/a 6 937 969 983 N
+ AW CH NG s n/a 6 937 969 982 N
+ AW CH OW e n/a 6 937 959 980 N
+ AW CH OW s n/a 6 937 959 980 N
+ AW CH OY e n/a 6 937 959 979 N
+ AW CH OY s n/a 6 937 959 979 N
+ AW CH P b n/a 6 937 959 970 N
+ AW CH P e n/a 6 937 959 970 N
+ AW CH P s n/a 6 937 959 970 N
+ AW CH R b n/a 6 937 959 981 N
+ AW CH R e n/a 6 937 959 981 N
+ AW CH R s n/a 6 937 959 981 N
+ AW CH S b n/a 6 937 965 971 N
+ AW CH S e n/a 6 937 965 971 N
+ AW CH S i n/a 6 937 965 971 N
+ AW CH S s n/a 6 937 965 971 N
+ AW CH SH b n/a 6 937 959 971 N
+ AW CH SH e n/a 6 937 959 971 N
+ AW CH SH s n/a 6 937 959 971 N
+ AW CH SIL e n/a 6 937 959 976 N
+ AW CH SIL s n/a 6 937 959 976 N
+ AW CH T b n/a 6 945 964 974 N
+ AW CH T e n/a 6 945 964 974 N
+ AW CH T i n/a 6 945 964 974 N
+ AW CH T s n/a 6 945 964 974 N
+ AW CH TH b n/a 6 937 965 970 N
+ AW CH TH e n/a 6 937 965 970 N
+ AW CH TH s n/a 6 937 965 970 N
+ AW CH UH e n/a 6 937 959 980 N
+ AW CH UH s n/a 6 937 959 980 N
+ AW CH UW b n/a 6 937 959 980 N
+ AW CH UW e n/a 6 937 959 980 N
+ AW CH UW s n/a 6 937 959 980 N
+ AW CH V e n/a 6 937 959 970 N
+ AW CH V s n/a 6 937 959 970 N
+ AW CH W e n/a 6 937 959 980 N
+ AW CH W s n/a 6 937 959 980 N
+ AW CH Y b n/a 6 937 959 977 N
+ AW CH Y e n/a 6 937 959 977 N
+ AW CH Y s n/a 6 937 959 977 N
+ AW CH Z b n/a 6 937 965 972 N
+ AW CH Z e n/a 6 937 965 972 N
+ AW CH Z i n/a 6 937 965 972 N
+ AW CH Z s n/a 6 937 965 972 N
+ AW CH ZH e n/a 6 937 959 972 N
+ AW CH ZH s n/a 6 937 959 972 N
+ AW D AA e n/a 6 957 959 980 N
+ AW D AA s n/a 6 957 959 980 N
+ AW D AE e n/a 6 957 959 979 N
+ AW D AE s n/a 6 957 959 979 N
+ AW D AH b n/a 6 957 959 979 N
+ AW D AH e n/a 6 957 959 979 N
+ AW D AH i n/a 6 957 959 979 N
+ AW D AH s n/a 6 957 959 979 N
+ AW D AO e n/a 6 957 959 980 N
+ AW D AO s n/a 6 957 959 980 N
+ AW D AW e n/a 6 957 959 980 N
+ AW D AW s n/a 6 957 959 980 N
+ AW D AY e n/a 6 957 959 979 N
+ AW D AY s n/a 6 957 959 979 N
+ AW D B b n/a 6 957 959 970 N
+ AW D B e n/a 6 957 959 970 N
+ AW D B i n/a 6 957 959 970 N
+ AW D B s n/a 6 957 959 970 N
+ AW D CH b n/a 6 957 959 971 N
+ AW D CH e n/a 6 957 959 971 N
+ AW D CH i n/a 6 957 959 971 N
+ AW D CH s n/a 6 957 959 971 N
+ AW D D b n/a 6 957 964 975 N
+ AW D D e n/a 6 957 964 975 N
+ AW D D i n/a 6 957 964 975 N
+ AW D D s n/a 6 957 964 975 N
+ AW D DH e n/a 6 957 965 970 N
+ AW D DH s n/a 6 957 965 970 N
+ AW D EH e n/a 6 957 959 979 N
+ AW D EH s n/a 6 957 959 979 N
+ AW D ER b n/a 6 957 959 981 N
+ AW D ER e n/a 6 957 959 981 N
+ AW D ER i n/a 6 957 959 981 N
+ AW D ER s n/a 6 957 959 981 N
+ AW D EY e n/a 6 957 959 979 N
+ AW D EY i n/a 6 957 959 979 N
+ AW D EY s n/a 6 957 959 979 N
+ AW D F b n/a 6 957 959 970 N
+ AW D F e n/a 6 957 959 970 N
+ AW D F i n/a 6 957 959 970 N
+ AW D F s n/a 6 957 959 970 N
+ AW D G b n/a 6 957 959 970 N
+ AW D G e n/a 6 957 959 970 N
+ AW D G i n/a 6 957 959 970 N
+ AW D G s n/a 6 957 959 970 N
+ AW D HH e n/a 6 957 959 970 N
+ AW D HH s n/a 6 957 959 970 N
+ AW D IH b n/a 6 957 959 979 N
+ AW D IH e n/a 6 957 959 979 N
+ AW D IH i n/a 6 957 959 979 N
+ AW D IH s n/a 6 957 959 979 N
+ AW D IY b n/a 6 957 959 979 N
+ AW D IY e n/a 6 957 959 979 N
+ AW D IY i n/a 6 957 959 979 N
+ AW D IY s n/a 6 957 959 979 N
+ AW D JH e n/a 6 957 959 971 N
+ AW D JH s n/a 6 957 959 971 N
+ AW D K b n/a 6 957 959 970 N
+ AW D K e n/a 6 957 959 970 N
+ AW D K i n/a 6 957 959 970 N
+ AW D K s n/a 6 957 959 970 N
+ AW D L b n/a 6 957 959 980 N
+ AW D L e n/a 6 957 959 980 N
+ AW D L i n/a 6 957 959 980 N
+ AW D L s n/a 6 957 959 980 N
+ AW D M b n/a 6 958 969 982 N
+ AW D M e n/a 6 958 969 983 N
+ AW D M i n/a 6 958 969 982 N
+ AW D M s n/a 6 958 969 982 N
+ AW D N b n/a 6 958 968 982 N
+ AW D N e n/a 6 958 968 983 N
+ AW D N i n/a 6 958 968 982 N
+ AW D N s n/a 6 958 968 982 N
+ AW D NG b n/a 6 958 969 982 N
+ AW D NG e n/a 6 958 969 983 N
+ AW D NG s n/a 6 958 969 982 N
+ AW D OW e n/a 6 957 959 980 N
+ AW D OW s n/a 6 957 959 980 N
+ AW D OY e n/a 6 957 959 979 N
+ AW D OY s n/a 6 957 959 979 N
+ AW D P b n/a 6 957 959 970 N
+ AW D P e n/a 6 957 959 970 N
+ AW D P s n/a 6 957 959 970 N
+ AW D R b n/a 6 957 959 981 N
+ AW D R e n/a 6 957 959 981 N
+ AW D R i n/a 6 957 959 981 N
+ AW D R s n/a 6 957 959 981 N
+ AW D S b n/a 6 957 965 971 N
+ AW D S e n/a 6 957 965 971 N
+ AW D S i n/a 6 957 965 971 N
+ AW D S s n/a 6 957 965 971 N
+ AW D SH b n/a 6 957 959 971 N
+ AW D SH e n/a 6 957 959 971 N
+ AW D SH s n/a 6 957 959 971 N
+ AW D SIL e n/a 6 957 959 976 N
+ AW D SIL s n/a 6 957 959 976 N
+ AW D T b n/a 6 957 964 974 N
+ AW D T e n/a 6 957 964 974 N
+ AW D T i n/a 6 957 964 974 N
+ AW D T s n/a 6 957 964 974 N
+ AW D TH b n/a 6 957 965 970 N
+ AW D TH e n/a 6 957 965 970 N
+ AW D TH i n/a 6 957 965 970 N
+ AW D TH s n/a 6 957 965 970 N
+ AW D UH e n/a 6 957 959 980 N
+ AW D UH s n/a 6 957 959 980 N
+ AW D UW b n/a 6 957 959 980 N
+ AW D UW e n/a 6 957 959 980 N
+ AW D UW s n/a 6 957 959 980 N
+ AW D V e n/a 6 957 959 970 N
+ AW D V s n/a 6 957 959 970 N
+ AW D W e n/a 6 957 959 980 N
+ AW D W i n/a 6 957 959 980 N
+ AW D W s n/a 6 957 959 980 N
+ AW D Y b n/a 6 957 959 977 N
+ AW D Y e n/a 6 957 959 977 N
+ AW D Y s n/a 6 957 959 977 N
+ AW D Z b n/a 6 957 965 972 N
+ AW D Z e n/a 6 957 965 972 N
+ AW D Z i n/a 6 957 965 972 N
+ AW D Z s n/a 6 957 965 972 N
+ AW D ZH e n/a 6 957 959 972 N
+ AW D ZH s n/a 6 957 959 972 N
+ AW DH AA e n/a 6 951 959 980 N
+ AW DH AA s n/a 6 951 959 980 N
+ AW DH AE e n/a 6 951 959 979 N
+ AW DH AE s n/a 6 951 959 979 N
+ AW DH AH b n/a 6 951 959 979 N
+ AW DH AH e n/a 6 951 959 979 N
+ AW DH AH s n/a 6 951 959 979 N
+ AW DH AO e n/a 6 951 959 980 N
+ AW DH AO s n/a 6 951 959 980 N
+ AW DH AW e n/a 6 951 959 980 N
+ AW DH AW s n/a 6 951 959 980 N
+ AW DH AY e n/a 6 951 959 979 N
+ AW DH AY s n/a 6 951 959 979 N
+ AW DH B b n/a 6 951 959 970 N
+ AW DH B e n/a 6 951 959 970 N
+ AW DH B s n/a 6 951 959 970 N
+ AW DH CH b n/a 6 951 959 971 N
+ AW DH CH e n/a 6 951 959 971 N
+ AW DH CH s n/a 6 951 959 971 N
+ AW DH D b n/a 6 951 964 975 N
+ AW DH D e n/a 6 951 964 975 N
+ AW DH D s n/a 6 951 964 975 N
+ AW DH DH e n/a 6 951 965 970 N
+ AW DH DH s n/a 6 951 965 970 N
+ AW DH EH e n/a 6 951 959 979 N
+ AW DH EH s n/a 6 951 959 979 N
+ AW DH ER b n/a 6 951 959 981 N
+ AW DH ER e n/a 6 951 959 981 N
+ AW DH ER s n/a 6 951 959 981 N
+ AW DH EY e n/a 6 951 959 979 N
+ AW DH EY s n/a 6 951 959 979 N
+ AW DH F b n/a 6 951 959 970 N
+ AW DH F e n/a 6 951 959 970 N
+ AW DH F s n/a 6 951 959 970 N
+ AW DH G b n/a 6 951 959 970 N
+ AW DH G e n/a 6 951 959 970 N
+ AW DH G s n/a 6 951 959 970 N
+ AW DH HH e n/a 6 951 959 970 N
+ AW DH HH s n/a 6 951 959 970 N
+ AW DH IH b n/a 6 951 959 979 N
+ AW DH IH e n/a 6 951 959 979 N
+ AW DH IH s n/a 6 951 959 979 N
+ AW DH IY b n/a 6 951 959 979 N
+ AW DH IY e n/a 6 951 959 979 N
+ AW DH IY s n/a 6 951 959 979 N
+ AW DH JH e n/a 6 951 959 971 N
+ AW DH JH s n/a 6 951 959 971 N
+ AW DH K b n/a 6 951 959 970 N
+ AW DH K e n/a 6 951 959 970 N
+ AW DH K s n/a 6 951 959 970 N
+ AW DH L b n/a 6 951 959 980 N
+ AW DH L e n/a 6 951 959 980 N
+ AW DH L i n/a 6 951 959 980 N
+ AW DH L s n/a 6 951 959 980 N
+ AW DH M b n/a 6 953 969 982 N
+ AW DH M e n/a 6 953 969 983 N
+ AW DH M s n/a 6 953 969 982 N
+ AW DH N b n/a 6 953 966 982 N
+ AW DH N e n/a 6 953 966 983 N
+ AW DH N s n/a 6 953 966 982 N
+ AW DH NG b n/a 6 953 969 982 N
+ AW DH NG e n/a 6 953 969 983 N
+ AW DH NG s n/a 6 953 969 982 N
+ AW DH OW e n/a 6 951 959 980 N
+ AW DH OW s n/a 6 951 959 980 N
+ AW DH OY e n/a 6 951 959 979 N
+ AW DH OY s n/a 6 951 959 979 N
+ AW DH P b n/a 6 951 959 970 N
+ AW DH P e n/a 6 951 959 970 N
+ AW DH P s n/a 6 951 959 970 N
+ AW DH R b n/a 6 951 959 981 N
+ AW DH R e n/a 6 951 959 981 N
+ AW DH R i n/a 6 951 959 981 N
+ AW DH R s n/a 6 951 959 981 N
+ AW DH S b n/a 6 951 965 971 N
+ AW DH S e n/a 6 951 965 971 N
+ AW DH S s n/a 6 951 965 971 N
+ AW DH SH b n/a 6 951 959 971 N
+ AW DH SH e n/a 6 951 959 971 N
+ AW DH SH s n/a 6 951 959 971 N
+ AW DH SIL e n/a 6 951 959 976 N
+ AW DH SIL s n/a 6 951 959 976 N
+ AW DH T b n/a 6 951 964 974 N
+ AW DH T e n/a 6 951 964 974 N
+ AW DH T i n/a 6 951 964 974 N
+ AW DH T s n/a 6 951 964 974 N
+ AW DH TH b n/a 6 951 965 970 N
+ AW DH TH e n/a 6 951 965 970 N
+ AW DH TH s n/a 6 951 965 970 N
+ AW DH UH e n/a 6 951 959 980 N
+ AW DH UH s n/a 6 951 959 980 N
+ AW DH UW b n/a 6 951 959 980 N
+ AW DH UW e n/a 6 951 959 980 N
+ AW DH UW s n/a 6 951 959 980 N
+ AW DH V e n/a 6 951 959 970 N
+ AW DH V s n/a 6 951 959 970 N
+ AW DH W e n/a 6 951 959 980 N
+ AW DH W s n/a 6 951 959 980 N
+ AW DH Y b n/a 6 951 959 977 N
+ AW DH Y e n/a 6 951 959 977 N
+ AW DH Y s n/a 6 951 959 977 N
+ AW DH Z b n/a 6 951 965 972 N
+ AW DH Z e n/a 6 951 965 972 N
+ AW DH Z i n/a 6 951 965 972 N
+ AW DH Z s n/a 6 951 965 972 N
+ AW DH ZH e n/a 6 951 959 972 N
+ AW DH ZH s n/a 6 951 959 972 N
+ AW EH AA s n/a 6 945 959 980 N
+ AW EH AE s n/a 6 945 959 979 N
+ AW EH AH b n/a 6 945 959 979 N
+ AW EH AH s n/a 6 945 959 979 N
+ AW EH AO s n/a 6 945 959 980 N
+ AW EH AW s n/a 6 945 959 980 N
+ AW EH AY s n/a 6 945 959 979 N
+ AW EH B b n/a 6 945 959 970 N
+ AW EH B s n/a 6 945 959 970 N
+ AW EH CH b n/a 6 945 959 971 N
+ AW EH CH s n/a 6 945 959 971 N
+ AW EH D b n/a 6 945 964 975 N
+ AW EH D s n/a 6 945 964 975 N
+ AW EH DH s n/a 6 945 965 970 N
+ AW EH EH s n/a 6 945 959 979 N
+ AW EH ER b n/a 6 945 959 981 N
+ AW EH ER s n/a 6 945 959 981 N
+ AW EH EY s n/a 6 945 959 979 N
+ AW EH F b n/a 6 945 959 970 N
+ AW EH F s n/a 6 945 959 970 N
+ AW EH G b n/a 6 945 959 970 N
+ AW EH G s n/a 6 945 959 970 N
+ AW EH HH s n/a 6 945 959 970 N
+ AW EH IH b n/a 6 945 959 979 N
+ AW EH IH s n/a 6 945 959 979 N
+ AW EH IY b n/a 6 945 959 979 N
+ AW EH IY s n/a 6 945 959 979 N
+ AW EH JH s n/a 6 945 959 971 N
+ AW EH K b n/a 6 945 959 970 N
+ AW EH K s n/a 6 945 959 970 N
+ AW EH L b n/a 6 945 959 980 N
+ AW EH L s n/a 6 945 959 980 N
+ AW EH M b n/a 6 947 969 982 N
+ AW EH M s n/a 6 947 969 982 N
+ AW EH N b n/a 6 947 966 982 N
+ AW EH N s n/a 6 947 966 982 N
+ AW EH NG b n/a 6 947 969 982 N
+ AW EH NG s n/a 6 947 969 982 N
+ AW EH OW s n/a 6 945 959 980 N
+ AW EH OY s n/a 6 945 959 979 N
+ AW EH P b n/a 6 945 959 970 N
+ AW EH P s n/a 6 945 959 970 N
+ AW EH R b n/a 6 945 959 981 N
+ AW EH R s n/a 6 945 959 981 N
+ AW EH S b n/a 6 945 965 971 N
+ AW EH S s n/a 6 945 965 971 N
+ AW EH SH b n/a 6 945 959 971 N
+ AW EH SH s n/a 6 945 959 971 N
+ AW EH SIL s n/a 6 945 959 976 N
+ AW EH T b n/a 6 945 964 974 N
+ AW EH T s n/a 6 945 964 974 N
+ AW EH TH b n/a 6 945 965 970 N
+ AW EH TH s n/a 6 945 965 970 N
+ AW EH UH s n/a 6 945 959 980 N
+ AW EH UW b n/a 6 945 959 980 N
+ AW EH UW s n/a 6 945 959 980 N
+ AW EH V s n/a 6 945 959 970 N
+ AW EH W s n/a 6 945 959 980 N
+ AW EH Y b n/a 6 945 959 977 N
+ AW EH Y s n/a 6 945 959 977 N
+ AW EH Z b n/a 6 945 965 972 N
+ AW EH Z s n/a 6 945 965 972 N
+ AW EH ZH s n/a 6 945 959 972 N
+ AW ER AA e n/a 6 943 959 980 N
+ AW ER AA s n/a 6 943 959 980 N
+ AW ER AE e n/a 6 943 959 979 N
+ AW ER AE s n/a 6 943 959 979 N
+ AW ER AH b n/a 6 943 959 979 N
+ AW ER AH e n/a 6 943 959 979 N
+ AW ER AH s n/a 6 943 959 979 N
+ AW ER AO e n/a 6 943 959 980 N
+ AW ER AO s n/a 6 943 959 980 N
+ AW ER AW e n/a 6 943 959 980 N
+ AW ER AW s n/a 6 943 959 980 N
+ AW ER AY e n/a 6 943 959 979 N
+ AW ER AY s n/a 6 943 959 979 N
+ AW ER B b n/a 6 943 959 970 N
+ AW ER B e n/a 6 943 959 970 N
+ AW ER B s n/a 6 943 959 970 N
+ AW ER CH b n/a 6 943 959 971 N
+ AW ER CH e n/a 6 943 959 971 N
+ AW ER CH s n/a 6 943 959 971 N
+ AW ER D b n/a 6 943 963 975 N
+ AW ER D e n/a 6 943 963 975 N
+ AW ER D i n/a 6 943 963 975 N
+ AW ER D s n/a 6 943 963 975 N
+ AW ER DH e n/a 6 943 963 970 N
+ AW ER DH s n/a 6 943 963 970 N
+ AW ER EH e n/a 6 943 959 979 N
+ AW ER EH s n/a 6 943 959 979 N
+ AW ER ER b n/a 6 943 959 981 N
+ AW ER ER e n/a 6 943 959 981 N
+ AW ER ER i n/a 6 943 959 981 N
+ AW ER ER s n/a 6 943 959 981 N
+ AW ER EY e n/a 6 943 959 979 N
+ AW ER EY s n/a 6 943 959 979 N
+ AW ER F b n/a 6 943 959 970 N
+ AW ER F e n/a 6 943 959 970 N
+ AW ER F s n/a 6 943 959 970 N
+ AW ER G b n/a 6 943 959 970 N
+ AW ER G e n/a 6 943 959 970 N
+ AW ER G s n/a 6 943 959 970 N
+ AW ER HH e n/a 6 943 959 970 N
+ AW ER HH s n/a 6 943 959 970 N
+ AW ER IH b n/a 6 943 959 979 N
+ AW ER IH e n/a 6 943 959 979 N
+ AW ER IH s n/a 6 943 959 979 N
+ AW ER IY b n/a 6 943 959 979 N
+ AW ER IY e n/a 6 943 959 979 N
+ AW ER IY i n/a 6 943 959 979 N
+ AW ER IY s n/a 6 943 959 979 N
+ AW ER JH e n/a 6 943 959 971 N
+ AW ER JH s n/a 6 943 959 971 N
+ AW ER K b n/a 6 943 959 970 N
+ AW ER K e n/a 6 943 959 970 N
+ AW ER K s n/a 6 943 959 970 N
+ AW ER L b n/a 6 943 959 980 N
+ AW ER L e n/a 6 943 959 980 N
+ AW ER L s n/a 6 943 959 980 N
+ AW ER M b n/a 6 944 969 982 N
+ AW ER M e n/a 6 944 969 983 N
+ AW ER M s n/a 6 944 969 982 N
+ AW ER N b n/a 6 944 966 982 N
+ AW ER N e n/a 6 944 966 983 N
+ AW ER N i n/a 6 944 966 982 N
+ AW ER N s n/a 6 944 966 982 N
+ AW ER NG b n/a 6 944 969 982 N
+ AW ER NG e n/a 6 944 969 983 N
+ AW ER NG s n/a 6 944 969 982 N
+ AW ER OW e n/a 6 943 959 980 N
+ AW ER OW s n/a 6 943 959 980 N
+ AW ER OY e n/a 6 943 959 979 N
+ AW ER OY s n/a 6 943 959 979 N
+ AW ER P b n/a 6 943 959 970 N
+ AW ER P e n/a 6 943 959 970 N
+ AW ER P s n/a 6 943 959 970 N
+ AW ER R b n/a 6 943 959 981 N
+ AW ER R e n/a 6 943 959 981 N
+ AW ER R s n/a 6 943 959 981 N
+ AW ER S b n/a 6 943 963 971 N
+ AW ER S e n/a 6 943 963 971 N
+ AW ER S i n/a 6 943 963 971 N
+ AW ER S s n/a 6 943 963 971 N
+ AW ER SH b n/a 6 943 959 971 N
+ AW ER SH e n/a 6 943 959 971 N
+ AW ER SH s n/a 6 943 959 971 N
+ AW ER SIL e n/a 6 943 959 976 N
+ AW ER SIL s n/a 6 943 959 976 N
+ AW ER T b n/a 6 943 963 974 N
+ AW ER T e n/a 6 943 963 974 N
+ AW ER T s n/a 6 943 963 974 N
+ AW ER TH b n/a 6 943 963 970 N
+ AW ER TH e n/a 6 943 963 970 N
+ AW ER TH s n/a 6 943 963 970 N
+ AW ER UH e n/a 6 943 959 980 N
+ AW ER UH s n/a 6 943 959 980 N
+ AW ER UW b n/a 6 943 959 980 N
+ AW ER UW e n/a 6 943 959 980 N
+ AW ER UW s n/a 6 943 959 980 N
+ AW ER V e n/a 6 943 959 970 N
+ AW ER V s n/a 6 943 959 970 N
+ AW ER W e n/a 6 943 959 980 N
+ AW ER W s n/a 6 943 959 980 N
+ AW ER Y b n/a 6 943 959 977 N
+ AW ER Y e n/a 6 943 959 977 N
+ AW ER Y s n/a 6 943 959 977 N
+ AW ER Z b n/a 6 943 963 972 N
+ AW ER Z e n/a 6 943 963 972 N
+ AW ER Z i n/a 6 943 963 972 N
+ AW ER Z s n/a 6 943 963 972 N
+ AW ER ZH e n/a 6 943 959 972 N
+ AW ER ZH s n/a 6 943 959 972 N
+ AW EY AA s n/a 6 945 959 980 N
+ AW EY AE s n/a 6 945 959 979 N
+ AW EY AH b n/a 6 945 959 979 N
+ AW EY AH s n/a 6 945 959 979 N
+ AW EY AO s n/a 6 945 959 980 N
+ AW EY AW s n/a 6 945 959 980 N
+ AW EY AY s n/a 6 945 959 979 N
+ AW EY B b n/a 6 945 959 970 N
+ AW EY B i n/a 6 945 959 970 N
+ AW EY B s n/a 6 945 959 970 N
+ AW EY CH b n/a 6 945 959 971 N
+ AW EY CH s n/a 6 945 959 971 N
+ AW EY D b n/a 6 945 964 975 N
+ AW EY D s n/a 6 945 964 975 N
+ AW EY DH s n/a 6 945 965 970 N
+ AW EY EH s n/a 6 945 959 979 N
+ AW EY ER b n/a 6 945 959 981 N
+ AW EY ER s n/a 6 945 959 981 N
+ AW EY EY s n/a 6 945 959 979 N
+ AW EY F b n/a 6 945 959 970 N
+ AW EY F s n/a 6 945 959 970 N
+ AW EY G b n/a 6 945 959 970 N
+ AW EY G s n/a 6 945 959 970 N
+ AW EY HH s n/a 6 945 959 970 N
+ AW EY IH b n/a 6 945 959 979 N
+ AW EY IH s n/a 6 945 959 979 N
+ AW EY IY b n/a 6 945 959 979 N
+ AW EY IY s n/a 6 945 959 979 N
+ AW EY JH s n/a 6 945 959 971 N
+ AW EY K b n/a 6 945 959 970 N
+ AW EY K s n/a 6 945 959 970 N
+ AW EY L b n/a 6 945 959 980 N
+ AW EY L s n/a 6 945 959 980 N
+ AW EY M b n/a 6 947 969 982 N
+ AW EY M s n/a 6 947 969 982 N
+ AW EY N b n/a 6 947 966 982 N
+ AW EY N s n/a 6 947 966 982 N
+ AW EY NG b n/a 6 947 969 982 N
+ AW EY NG s n/a 6 947 969 982 N
+ AW EY OW s n/a 6 945 959 980 N
+ AW EY OY s n/a 6 945 959 979 N
+ AW EY P b n/a 6 945 959 970 N
+ AW EY P s n/a 6 945 959 970 N
+ AW EY R b n/a 6 945 959 981 N
+ AW EY R s n/a 6 945 959 981 N
+ AW EY S b n/a 6 945 965 971 N
+ AW EY S s n/a 6 945 965 971 N
+ AW EY SH b n/a 6 945 959 971 N
+ AW EY SH s n/a 6 945 959 971 N
+ AW EY SIL s n/a 6 945 959 976 N
+ AW EY T b n/a 6 945 964 974 N
+ AW EY T i n/a 6 945 964 974 N
+ AW EY T s n/a 6 945 964 974 N
+ AW EY TH b n/a 6 945 965 970 N
+ AW EY TH s n/a 6 945 965 970 N
+ AW EY UH s n/a 6 945 959 980 N
+ AW EY UW b n/a 6 945 959 980 N
+ AW EY UW s n/a 6 945 959 980 N
+ AW EY V s n/a 6 945 959 970 N
+ AW EY W s n/a 6 945 959 980 N
+ AW EY Y b n/a 6 945 959 977 N
+ AW EY Y s n/a 6 945 959 977 N
+ AW EY Z b n/a 6 945 965 972 N
+ AW EY Z s n/a 6 945 965 972 N
+ AW EY ZH s n/a 6 945 959 972 N
+ AW F AA e n/a 6 937 959 980 N
+ AW F AA s n/a 6 937 959 980 N
+ AW F AE e n/a 6 937 959 979 N
+ AW F AE s n/a 6 937 959 979 N
+ AW F AH b n/a 6 937 959 979 N
+ AW F AH e n/a 6 937 959 979 N
+ AW F AH i n/a 6 937 959 979 N
+ AW F AH s n/a 6 937 959 979 N
+ AW F AO e n/a 6 937 959 980 N
+ AW F AO s n/a 6 937 959 980 N
+ AW F AW e n/a 6 937 959 980 N
+ AW F AW s n/a 6 937 959 980 N
+ AW F AY e n/a 6 937 959 979 N
+ AW F AY s n/a 6 937 959 979 N
+ AW F B b n/a 6 937 959 970 N
+ AW F B e n/a 6 937 959 970 N
+ AW F B i n/a 6 937 959 970 N
+ AW F B s n/a 6 937 959 970 N
+ AW F CH b n/a 6 937 959 971 N
+ AW F CH e n/a 6 937 959 971 N
+ AW F CH i n/a 6 937 959 971 N
+ AW F CH s n/a 6 937 959 971 N
+ AW F D b n/a 6 952 963 975 N
+ AW F D e n/a 6 952 963 975 N
+ AW F D s n/a 6 952 963 975 N
+ AW F DH e n/a 6 937 963 970 N
+ AW F DH s n/a 6 937 963 970 N
+ AW F EH e n/a 6 937 959 979 N
+ AW F EH s n/a 6 937 959 979 N
+ AW F ER b n/a 6 937 959 981 N
+ AW F ER e n/a 6 937 959 981 N
+ AW F ER i n/a 6 937 959 981 N
+ AW F ER s n/a 6 937 959 981 N
+ AW F EY e n/a 6 937 959 979 N
+ AW F EY s n/a 6 937 959 979 N
+ AW F F b n/a 6 937 959 970 N
+ AW F F e n/a 6 937 959 970 N
+ AW F F s n/a 6 937 959 970 N
+ AW F G b n/a 6 937 959 970 N
+ AW F G e n/a 6 937 959 970 N
+ AW F G i n/a 6 937 959 970 N
+ AW F G s n/a 6 937 959 970 N
+ AW F HH e n/a 6 937 959 970 N
+ AW F HH s n/a 6 937 959 970 N
+ AW F IH b n/a 6 937 959 979 N
+ AW F IH e n/a 6 937 959 979 N
+ AW F IH s n/a 6 937 959 979 N
+ AW F IY b n/a 6 937 959 979 N
+ AW F IY e n/a 6 937 959 979 N
+ AW F IY s n/a 6 937 959 979 N
+ AW F JH e n/a 6 937 959 971 N
+ AW F JH s n/a 6 937 959 971 N
+ AW F K b n/a 6 937 959 970 N
+ AW F K e n/a 6 937 959 970 N
+ AW F K i n/a 6 937 959 970 N
+ AW F K s n/a 6 937 959 970 N
+ AW F L b n/a 6 937 959 980 N
+ AW F L e n/a 6 937 959 980 N
+ AW F L i n/a 6 937 959 980 N
+ AW F L s n/a 6 937 959 980 N
+ AW F M b n/a 6 937 969 982 N
+ AW F M e n/a 6 937 969 983 N
+ AW F M s n/a 6 937 969 982 N
+ AW F N b n/a 6 953 966 982 N
+ AW F N e n/a 6 953 966 983 N
+ AW F N i n/a 6 953 966 982 N
+ AW F N s n/a 6 953 966 982 N
+ AW F NG b n/a 6 937 969 982 N
+ AW F NG e n/a 6 937 969 983 N
+ AW F NG s n/a 6 937 969 982 N
+ AW F OW e n/a 6 937 959 980 N
+ AW F OW s n/a 6 937 959 980 N
+ AW F OY e n/a 6 937 959 979 N
+ AW F OY s n/a 6 937 959 979 N
+ AW F P b n/a 6 937 959 970 N
+ AW F P e n/a 6 937 959 970 N
+ AW F P s n/a 6 937 959 970 N
+ AW F R b n/a 6 937 959 981 N
+ AW F R e n/a 6 937 959 981 N
+ AW F R s n/a 6 937 959 981 N
+ AW F S b n/a 6 937 963 971 N
+ AW F S e n/a 6 937 963 971 N
+ AW F S i n/a 6 937 963 971 N
+ AW F S s n/a 6 937 963 971 N
+ AW F SH b n/a 6 937 959 971 N
+ AW F SH e n/a 6 937 959 971 N
+ AW F SH i n/a 6 937 959 971 N
+ AW F SH s n/a 6 937 959 971 N
+ AW F SIL e n/a 6 937 959 976 N
+ AW F SIL s n/a 6 937 959 976 N
+ AW F T b n/a 6 952 963 974 N
+ AW F T e n/a 6 952 963 974 N
+ AW F T i n/a 6 952 963 974 N
+ AW F T s n/a 6 952 963 974 N
+ AW F TH b n/a 6 937 963 970 N
+ AW F TH e n/a 6 937 963 970 N
+ AW F TH s n/a 6 937 963 970 N
+ AW F UH e n/a 6 937 959 980 N
+ AW F UH s n/a 6 937 959 980 N
+ AW F UW b n/a 6 937 959 980 N
+ AW F UW e n/a 6 937 959 980 N
+ AW F UW s n/a 6 937 959 980 N
+ AW F V e n/a 6 937 959 970 N
+ AW F V i n/a 6 937 959 970 N
+ AW F V s n/a 6 937 959 970 N
+ AW F W e n/a 6 937 959 980 N
+ AW F W s n/a 6 937 959 980 N
+ AW F Y b n/a 6 937 959 977 N
+ AW F Y e n/a 6 937 959 977 N
+ AW F Y s n/a 6 937 959 977 N
+ AW F Z b n/a 6 937 963 972 N
+ AW F Z e n/a 6 937 963 972 N
+ AW F Z s n/a 6 937 963 972 N
+ AW F ZH e n/a 6 937 959 972 N
+ AW F ZH s n/a 6 937 959 972 N
+ AW G AA e n/a 6 957 959 980 N
+ AW G AA s n/a 6 957 959 980 N
+ AW G AE e n/a 6 957 959 979 N
+ AW G AE s n/a 6 957 959 979 N
+ AW G AH b n/a 6 957 959 979 N
+ AW G AH e n/a 6 957 959 979 N
+ AW G AH i n/a 6 957 959 979 N
+ AW G AH s n/a 6 957 959 979 N
+ AW G AO e n/a 6 957 959 980 N
+ AW G AO s n/a 6 957 959 980 N
+ AW G AW e n/a 6 957 959 980 N
+ AW G AW s n/a 6 957 959 980 N
+ AW G AY e n/a 6 957 959 979 N
+ AW G AY s n/a 6 957 959 979 N
+ AW G B b n/a 6 957 959 970 N
+ AW G B e n/a 6 957 959 970 N
+ AW G B i n/a 6 957 959 970 N
+ AW G B s n/a 6 957 959 970 N
+ AW G CH b n/a 6 957 959 971 N
+ AW G CH e n/a 6 957 959 971 N
+ AW G CH i n/a 6 957 959 971 N
+ AW G CH s n/a 6 957 959 971 N
+ AW G D b n/a 6 957 964 975 N
+ AW G D e n/a 6 957 964 975 N
+ AW G D i n/a 6 957 964 975 N
+ AW G D s n/a 6 957 964 975 N
+ AW G DH e n/a 6 957 965 970 N
+ AW G DH s n/a 6 957 965 970 N
+ AW G EH e n/a 6 957 959 979 N
+ AW G EH s n/a 6 957 959 979 N
+ AW G ER b n/a 6 957 959 981 N
+ AW G ER e n/a 6 957 959 981 N
+ AW G ER i n/a 6 957 959 981 N
+ AW G ER s n/a 6 957 959 981 N
+ AW G EY e n/a 6 957 959 979 N
+ AW G EY s n/a 6 957 959 979 N
+ AW G F b n/a 6 957 959 970 N
+ AW G F e n/a 6 957 959 970 N
+ AW G F s n/a 6 957 959 970 N
+ AW G G b n/a 6 957 959 970 N
+ AW G G e n/a 6 957 959 970 N
+ AW G G s n/a 6 957 959 970 N
+ AW G HH e n/a 6 957 959 970 N
+ AW G HH s n/a 6 957 959 970 N
+ AW G IH b n/a 6 957 959 979 N
+ AW G IH e n/a 6 957 959 979 N
+ AW G IH i n/a 6 957 959 979 N
+ AW G IH s n/a 6 957 959 979 N
+ AW G IY b n/a 6 957 959 979 N
+ AW G IY e n/a 6 957 959 979 N
+ AW G IY s n/a 6 957 959 979 N
+ AW G JH e n/a 6 957 959 971 N
+ AW G JH i n/a 6 957 959 971 N
+ AW G JH s n/a 6 957 959 971 N
+ AW G K b n/a 6 957 959 970 N
+ AW G K e n/a 6 957 959 970 N
+ AW G K i n/a 6 957 959 970 N
+ AW G K s n/a 6 957 959 970 N
+ AW G L b n/a 6 957 959 980 N
+ AW G L e n/a 6 957 959 980 N
+ AW G L s n/a 6 957 959 980 N
+ AW G M b n/a 6 958 969 983 N
+ AW G M e n/a 6 958 969 983 N
+ AW G M i n/a 6 958 969 983 N
+ AW G M s n/a 6 958 969 983 N
+ AW G N b n/a 6 958 968 983 N
+ AW G N e n/a 6 958 968 983 N
+ AW G N i n/a 6 958 968 983 N
+ AW G N s n/a 6 958 968 983 N
+ AW G NG b n/a 6 958 969 983 N
+ AW G NG e n/a 6 958 969 983 N
+ AW G NG s n/a 6 958 969 983 N
+ AW G OW e n/a 6 957 959 980 N
+ AW G OW s n/a 6 957 959 980 N
+ AW G OY e n/a 6 957 959 979 N
+ AW G OY s n/a 6 957 959 979 N
+ AW G P b n/a 6 957 959 970 N
+ AW G P e n/a 6 957 959 970 N
+ AW G P s n/a 6 957 959 970 N
+ AW G R b n/a 6 957 959 981 N
+ AW G R e n/a 6 957 959 981 N
+ AW G R s n/a 6 957 959 981 N
+ AW G S b n/a 6 957 965 971 N
+ AW G S e n/a 6 957 965 971 N
+ AW G S i n/a 6 957 965 971 N
+ AW G S s n/a 6 957 965 971 N
+ AW G SH b n/a 6 957 959 971 N
+ AW G SH e n/a 6 957 959 971 N
+ AW G SH s n/a 6 957 959 971 N
+ AW G SIL e n/a 6 957 959 976 N
+ AW G SIL s n/a 6 957 959 976 N
+ AW G T b n/a 6 957 964 974 N
+ AW G T e n/a 6 957 964 974 N
+ AW G T i n/a 6 957 964 974 N
+ AW G T s n/a 6 957 964 974 N
+ AW G TH b n/a 6 957 965 970 N
+ AW G TH e n/a 6 957 965 970 N
+ AW G TH i n/a 6 957 965 970 N
+ AW G TH s n/a 6 957 965 970 N
+ AW G UH e n/a 6 957 959 980 N
+ AW G UH s n/a 6 957 959 980 N
+ AW G UW b n/a 6 957 959 980 N
+ AW G UW e n/a 6 957 959 980 N
+ AW G UW s n/a 6 957 959 980 N
+ AW G V e n/a 6 957 959 970 N
+ AW G V s n/a 6 957 959 970 N
+ AW G W e n/a 6 957 959 980 N
+ AW G W s n/a 6 957 959 980 N
+ AW G Y b n/a 6 957 959 977 N
+ AW G Y e n/a 6 957 959 977 N
+ AW G Y s n/a 6 957 959 977 N
+ AW G Z b n/a 6 957 965 972 N
+ AW G Z e n/a 6 957 965 972 N
+ AW G Z i n/a 6 957 965 972 N
+ AW G Z s n/a 6 957 965 972 N
+ AW G ZH e n/a 6 957 959 972 N
+ AW G ZH s n/a 6 957 959 972 N
+ AW HH AA e n/a 6 939 961 980 N
+ AW HH AA i n/a 6 940 961 978 N
+ AW HH AA s n/a 6 939 961 980 N
+ AW HH AE e n/a 6 939 961 979 N
+ AW HH AE s n/a 6 939 961 979 N
+ AW HH AH b n/a 6 939 961 979 N
+ AW HH AH e n/a 6 939 961 979 N
+ AW HH AH i n/a 6 939 961 978 N
+ AW HH AH s n/a 6 939 961 979 N
+ AW HH AO e n/a 6 939 961 980 N
+ AW HH AO i n/a 6 940 961 978 N
+ AW HH AO s n/a 6 939 961 980 N
+ AW HH AW e n/a 6 939 961 980 N
+ AW HH AW s n/a 6 939 961 980 N
+ AW HH AY e n/a 6 939 961 979 N
+ AW HH AY s n/a 6 939 961 979 N
+ AW HH B b n/a 6 939 960 970 N
+ AW HH B e n/a 6 939 960 970 N
+ AW HH B i n/a 6 939 960 970 N
+ AW HH B s n/a 6 939 960 970 N
+ AW HH CH b n/a 6 939 960 971 N
+ AW HH CH e n/a 6 939 960 971 N
+ AW HH CH i n/a 6 939 960 971 N
+ AW HH CH s n/a 6 939 960 971 N
+ AW HH D b n/a 6 948 960 975 N
+ AW HH D e n/a 6 948 960 975 N
+ AW HH D i n/a 6 948 960 975 N
+ AW HH D s n/a 6 948 960 975 N
+ AW HH DH e n/a 6 939 960 970 N
+ AW HH DH s n/a 6 939 960 970 N
+ AW HH EH e n/a 6 939 961 979 N
+ AW HH EH i n/a 6 939 961 978 N
+ AW HH EH s n/a 6 939 961 979 N
+ AW HH ER b n/a 6 939 961 981 N
+ AW HH ER e n/a 6 939 961 981 N
+ AW HH ER i n/a 6 940 961 981 N
+ AW HH ER s n/a 6 939 961 981 N
+ AW HH EY e n/a 6 939 961 979 N
+ AW HH EY s n/a 6 939 961 979 N
+ AW HH F b n/a 6 939 960 970 N
+ AW HH F e n/a 6 939 960 970 N
+ AW HH F s n/a 6 939 960 970 N
+ AW HH G b n/a 6 939 960 970 N
+ AW HH G e n/a 6 939 960 970 N
+ AW HH G i n/a 6 939 960 970 N
+ AW HH G s n/a 6 939 960 970 N
+ AW HH HH e n/a 6 939 960 970 N
+ AW HH HH s n/a 6 939 960 970 N
+ AW HH IH b n/a 6 939 961 978 N
+ AW HH IH e n/a 6 939 961 978 N
+ AW HH IH i n/a 6 939 961 978 N
+ AW HH IH s n/a 6 939 961 978 N
+ AW HH IY b n/a 6 939 961 978 N
+ AW HH IY e n/a 6 939 961 978 N
+ AW HH IY i n/a 6 939 961 978 N
+ AW HH IY s n/a 6 939 961 978 N
+ AW HH JH e n/a 6 939 960 971 N
+ AW HH JH i n/a 6 939 960 971 N
+ AW HH JH s n/a 6 939 960 971 N
+ AW HH K b n/a 6 939 960 970 N
+ AW HH K e n/a 6 939 960 970 N
+ AW HH K i n/a 6 939 960 970 N
+ AW HH K s n/a 6 939 960 970 N
+ AW HH L b n/a 6 939 961 980 N
+ AW HH L e n/a 6 939 961 980 N
+ AW HH L i n/a 6 940 961 978 N
+ AW HH L s n/a 6 939 961 980 N
+ AW HH M b n/a 6 939 969 982 N
+ AW HH M e n/a 6 939 969 983 N
+ AW HH M i n/a 6 939 969 982 N
+ AW HH M s n/a 6 939 969 982 N
+ AW HH N b n/a 6 947 966 982 N
+ AW HH N e n/a 6 947 966 983 N
+ AW HH N i n/a 6 947 966 982 N
+ AW HH N s n/a 6 947 966 982 N
+ AW HH NG b n/a 6 939 969 982 N
+ AW HH NG e n/a 6 939 969 983 N
+ AW HH NG s n/a 6 939 969 982 N
+ AW HH OW e n/a 6 939 961 980 N
+ AW HH OW s n/a 6 939 961 980 N
+ AW HH OY e n/a 6 939 961 979 N
+ AW HH OY s n/a 6 939 961 979 N
+ AW HH P b n/a 6 939 960 970 N
+ AW HH P e n/a 6 939 960 970 N
+ AW HH P i n/a 6 939 960 970 N
+ AW HH P s n/a 6 939 960 970 N
+ AW HH R b n/a 6 939 961 981 N
+ AW HH R e n/a 6 939 961 981 N
+ AW HH R i n/a 6 940 961 981 N
+ AW HH R s n/a 6 939 961 981 N
+ AW HH S b n/a 6 940 960 971 N
+ AW HH S e n/a 6 940 960 971 N
+ AW HH S i n/a 6 940 960 971 N
+ AW HH S s n/a 6 940 960 971 N
+ AW HH SH b n/a 6 939 960 971 N
+ AW HH SH e n/a 6 939 960 971 N
+ AW HH SH i n/a 6 939 960 971 N
+ AW HH SH s n/a 6 939 960 971 N
+ AW HH SIL e n/a 6 940 960 976 N
+ AW HH SIL s n/a 6 940 960 976 N
+ AW HH T b n/a 6 948 963 974 N
+ AW HH T e n/a 6 948 963 974 N
+ AW HH T i n/a 6 948 963 974 N
+ AW HH T s n/a 6 948 963 974 N
+ AW HH TH b n/a 6 939 960 970 N
+ AW HH TH e n/a 6 939 960 970 N
+ AW HH TH s n/a 6 939 960 970 N
+ AW HH UH e n/a 6 939 961 980 N
+ AW HH UH s n/a 6 939 961 980 N
+ AW HH UW b n/a 6 939 961 980 N
+ AW HH UW e n/a 6 939 961 980 N
+ AW HH UW s n/a 6 939 961 980 N
+ AW HH V e n/a 6 939 960 970 N
+ AW HH V i n/a 6 939 960 970 N
+ AW HH V s n/a 6 939 960 970 N
+ AW HH W e n/a 6 939 961 980 N
+ AW HH W s n/a 6 939 961 980 N
+ AW HH Y b n/a 6 939 960 977 N
+ AW HH Y e n/a 6 939 960 977 N
+ AW HH Y s n/a 6 939 960 977 N
+ AW HH Z b n/a 6 940 960 972 N
+ AW HH Z e n/a 6 940 960 972 N
+ AW HH Z i n/a 6 940 960 972 N
+ AW HH Z s n/a 6 940 960 972 N
+ AW HH ZH e n/a 6 939 960 972 N
+ AW HH ZH s n/a 6 939 960 972 N
+ AW IH AA s n/a 6 946 959 980 N
+ AW IH AE s n/a 6 946 959 979 N
+ AW IH AH b n/a 6 946 959 979 N
+ AW IH AH s n/a 6 946 959 979 N
+ AW IH AO s n/a 6 946 959 980 N
+ AW IH AW s n/a 6 946 959 980 N
+ AW IH AY s n/a 6 946 959 979 N
+ AW IH B b n/a 6 946 959 970 N
+ AW IH B s n/a 6 946 959 970 N
+ AW IH CH b n/a 6 946 959 971 N
+ AW IH CH s n/a 6 946 959 971 N
+ AW IH D b n/a 6 946 964 975 N
+ AW IH D s n/a 6 946 964 975 N
+ AW IH DH s n/a 6 946 965 970 N
+ AW IH EH s n/a 6 946 959 979 N
+ AW IH ER b n/a 6 946 959 981 N
+ AW IH ER s n/a 6 946 959 981 N
+ AW IH EY s n/a 6 946 959 979 N
+ AW IH F b n/a 6 946 959 970 N
+ AW IH F s n/a 6 946 959 970 N
+ AW IH G b n/a 6 946 959 970 N
+ AW IH G s n/a 6 946 959 970 N
+ AW IH HH s n/a 6 946 959 970 N
+ AW IH IH b n/a 6 946 959 979 N
+ AW IH IH s n/a 6 946 959 979 N
+ AW IH IY b n/a 6 946 959 979 N
+ AW IH IY s n/a 6 946 959 979 N
+ AW IH JH s n/a 6 946 959 971 N
+ AW IH K b n/a 6 946 959 970 N
+ AW IH K s n/a 6 946 959 970 N
+ AW IH L b n/a 6 946 959 980 N
+ AW IH L s n/a 6 946 959 980 N
+ AW IH M b n/a 6 947 969 982 N
+ AW IH M s n/a 6 947 969 982 N
+ AW IH N b n/a 6 947 966 982 N
+ AW IH N s n/a 6 947 966 982 N
+ AW IH NG b n/a 6 947 969 982 N
+ AW IH NG s n/a 6 947 969 982 N
+ AW IH OW s n/a 6 946 959 980 N
+ AW IH OY s n/a 6 946 959 979 N
+ AW IH P b n/a 6 946 959 970 N
+ AW IH P s n/a 6 946 959 970 N
+ AW IH R b n/a 6 946 959 981 N
+ AW IH R s n/a 6 946 959 981 N
+ AW IH S b n/a 6 946 965 971 N
+ AW IH S s n/a 6 946 965 971 N
+ AW IH SH b n/a 6 946 959 971 N
+ AW IH SH s n/a 6 946 959 971 N
+ AW IH SIL s n/a 6 946 959 976 N
+ AW IH T b n/a 6 946 964 974 N
+ AW IH T s n/a 6 946 964 974 N
+ AW IH TH b n/a 6 946 965 970 N
+ AW IH TH s n/a 6 946 965 970 N
+ AW IH UH s n/a 6 946 959 980 N
+ AW IH UW b n/a 6 946 959 980 N
+ AW IH UW s n/a 6 946 959 980 N
+ AW IH V s n/a 6 946 959 970 N
+ AW IH W s n/a 6 946 959 980 N
+ AW IH Y b n/a 6 946 959 977 N
+ AW IH Y s n/a 6 946 959 977 N
+ AW IH Z b n/a 6 946 965 972 N
+ AW IH Z s n/a 6 946 965 972 N
+ AW IH ZH s n/a 6 946 959 972 N
+ AW IY AA e n/a 6 945 959 980 N
+ AW IY AA s n/a 6 945 959 980 N
+ AW IY AE e n/a 6 945 959 979 N
+ AW IY AE s n/a 6 945 959 979 N
+ AW IY AH b n/a 6 945 959 979 N
+ AW IY AH e n/a 6 945 959 979 N
+ AW IY AH s n/a 6 945 959 979 N
+ AW IY AO e n/a 6 945 959 980 N
+ AW IY AO s n/a 6 945 959 980 N
+ AW IY AW e n/a 6 945 959 980 N
+ AW IY AW s n/a 6 945 959 980 N
+ AW IY AY e n/a 6 945 959 979 N
+ AW IY AY s n/a 6 945 959 979 N
+ AW IY B b n/a 6 945 959 970 N
+ AW IY B e n/a 6 945 959 970 N
+ AW IY B s n/a 6 945 959 970 N
+ AW IY CH b n/a 6 945 959 971 N
+ AW IY CH e n/a 6 945 959 971 N
+ AW IY CH s n/a 6 945 959 971 N
+ AW IY D b n/a 6 945 964 975 N
+ AW IY D e n/a 6 945 964 975 N
+ AW IY D s n/a 6 945 964 975 N
+ AW IY DH e n/a 6 945 965 970 N
+ AW IY DH s n/a 6 945 965 970 N
+ AW IY EH e n/a 6 945 959 979 N
+ AW IY EH s n/a 6 945 959 979 N
+ AW IY ER b n/a 6 945 959 981 N
+ AW IY ER e n/a 6 945 959 981 N
+ AW IY ER i n/a 6 945 959 981 N
+ AW IY ER s n/a 6 945 959 981 N
+ AW IY EY e n/a 6 945 959 979 N
+ AW IY EY s n/a 6 945 959 979 N
+ AW IY F b n/a 6 945 959 970 N
+ AW IY F e n/a 6 945 959 970 N
+ AW IY F s n/a 6 945 959 970 N
+ AW IY G b n/a 6 945 959 970 N
+ AW IY G e n/a 6 945 959 970 N
+ AW IY G i n/a 6 945 959 970 N
+ AW IY G s n/a 6 945 959 970 N
+ AW IY HH e n/a 6 945 959 970 N
+ AW IY HH s n/a 6 945 959 970 N
+ AW IY IH b n/a 6 945 959 979 N
+ AW IY IH e n/a 6 945 959 979 N
+ AW IY IH s n/a 6 945 959 979 N
+ AW IY IY b n/a 6 945 959 979 N
+ AW IY IY e n/a 6 945 959 979 N
+ AW IY IY s n/a 6 945 959 979 N
+ AW IY JH e n/a 6 945 959 971 N
+ AW IY JH s n/a 6 945 959 971 N
+ AW IY K b n/a 6 945 959 970 N
+ AW IY K e n/a 6 945 959 970 N
+ AW IY K s n/a 6 945 959 970 N
+ AW IY L b n/a 6 945 959 980 N
+ AW IY L e n/a 6 945 959 980 N
+ AW IY L s n/a 6 945 959 980 N
+ AW IY M b n/a 6 947 969 982 N
+ AW IY M e n/a 6 947 969 983 N
+ AW IY M s n/a 6 947 969 982 N
+ AW IY N b n/a 6 947 966 982 N
+ AW IY N e n/a 6 947 966 983 N
+ AW IY N s n/a 6 947 966 982 N
+ AW IY NG b n/a 6 947 969 982 N
+ AW IY NG e n/a 6 947 969 983 N
+ AW IY NG s n/a 6 947 969 982 N
+ AW IY OW e n/a 6 945 959 980 N
+ AW IY OW s n/a 6 945 959 980 N
+ AW IY OY e n/a 6 945 959 979 N
+ AW IY OY s n/a 6 945 959 979 N
+ AW IY P b n/a 6 945 959 970 N
+ AW IY P e n/a 6 945 959 970 N
+ AW IY P s n/a 6 945 959 970 N
+ AW IY R b n/a 6 945 959 981 N
+ AW IY R e n/a 6 945 959 981 N
+ AW IY R s n/a 6 945 959 981 N
+ AW IY S b n/a 6 945 965 971 N
+ AW IY S e n/a 6 945 965 971 N
+ AW IY S i n/a 6 945 965 971 N
+ AW IY S s n/a 6 945 965 971 N
+ AW IY SH b n/a 6 945 959 971 N
+ AW IY SH e n/a 6 945 959 971 N
+ AW IY SH s n/a 6 945 959 971 N
+ AW IY SIL e n/a 6 945 959 976 N
+ AW IY SIL s n/a 6 945 959 976 N
+ AW IY T b n/a 6 945 964 974 N
+ AW IY T e n/a 6 945 964 974 N
+ AW IY T i n/a 6 945 964 974 N
+ AW IY T s n/a 6 945 964 974 N
+ AW IY TH b n/a 6 945 965 970 N
+ AW IY TH e n/a 6 945 965 970 N
+ AW IY TH s n/a 6 945 965 970 N
+ AW IY UH e n/a 6 945 959 980 N
+ AW IY UH s n/a 6 945 959 980 N
+ AW IY UW b n/a 6 945 959 980 N
+ AW IY UW e n/a 6 945 959 980 N
+ AW IY UW s n/a 6 945 959 980 N
+ AW IY V e n/a 6 945 959 970 N
+ AW IY V s n/a 6 945 959 970 N
+ AW IY W e n/a 6 945 959 980 N
+ AW IY W s n/a 6 945 959 980 N
+ AW IY Y b n/a 6 945 959 977 N
+ AW IY Y e n/a 6 945 959 977 N
+ AW IY Y s n/a 6 945 959 977 N
+ AW IY Z b n/a 6 945 965 972 N
+ AW IY Z e n/a 6 945 965 972 N
+ AW IY Z s n/a 6 945 965 972 N
+ AW IY ZH e n/a 6 945 959 972 N
+ AW IY ZH s n/a 6 945 959 972 N
+ AW JH AA e n/a 6 947 959 980 N
+ AW JH AA s n/a 6 947 959 980 N
+ AW JH AE e n/a 6 947 959 979 N
+ AW JH AE s n/a 6 947 959 979 N
+ AW JH AH b n/a 6 947 959 979 N
+ AW JH AH e n/a 6 947 959 979 N
+ AW JH AH s n/a 6 947 959 979 N
+ AW JH AO e n/a 6 947 959 980 N
+ AW JH AO s n/a 6 947 959 980 N
+ AW JH AW e n/a 6 947 959 980 N
+ AW JH AW s n/a 6 947 959 980 N
+ AW JH AY e n/a 6 947 959 979 N
+ AW JH AY s n/a 6 947 959 979 N
+ AW JH B b n/a 6 948 959 970 N
+ AW JH B e n/a 6 948 959 970 N
+ AW JH B s n/a 6 948 959 970 N
+ AW JH CH b n/a 6 945 959 971 N
+ AW JH CH e n/a 6 945 959 971 N
+ AW JH CH s n/a 6 945 959 971 N
+ AW JH D b n/a 6 948 964 975 N
+ AW JH D e n/a 6 948 964 975 N
+ AW JH D s n/a 6 948 964 975 N
+ AW JH DH e n/a 6 947 965 970 N
+ AW JH DH s n/a 6 947 965 970 N
+ AW JH EH e n/a 6 947 959 979 N
+ AW JH EH s n/a 6 947 959 979 N
+ AW JH ER b n/a 6 947 959 981 N
+ AW JH ER e n/a 6 947 959 981 N
+ AW JH ER i n/a 6 948 959 981 N
+ AW JH ER s n/a 6 947 959 981 N
+ AW JH EY e n/a 6 947 959 979 N
+ AW JH EY s n/a 6 947 959 979 N
+ AW JH F b n/a 6 945 959 970 N
+ AW JH F e n/a 6 945 959 970 N
+ AW JH F s n/a 6 945 959 970 N
+ AW JH G b n/a 6 948 959 970 N
+ AW JH G e n/a 6 948 959 970 N
+ AW JH G s n/a 6 948 959 970 N
+ AW JH HH e n/a 6 945 959 970 N
+ AW JH HH s n/a 6 945 959 970 N
+ AW JH IH b n/a 6 947 959 979 N
+ AW JH IH e n/a 6 947 959 979 N
+ AW JH IH i n/a 6 948 959 979 N
+ AW JH IH s n/a 6 947 959 979 N
+ AW JH IY b n/a 6 947 959 979 N
+ AW JH IY e n/a 6 947 959 979 N
+ AW JH IY s n/a 6 947 959 979 N
+ AW JH JH e n/a 6 948 959 971 N
+ AW JH JH s n/a 6 948 959 971 N
+ AW JH K b n/a 6 945 959 970 N
+ AW JH K e n/a 6 945 959 970 N
+ AW JH K i n/a 6 945 959 970 N
+ AW JH K s n/a 6 945 959 970 N
+ AW JH L b n/a 6 947 959 980 N
+ AW JH L e n/a 6 947 959 980 N
+ AW JH L i n/a 6 948 959 980 N
+ AW JH L s n/a 6 947 959 980 N
+ AW JH M b n/a 6 947 969 982 N
+ AW JH M e n/a 6 947 969 983 N
+ AW JH M s n/a 6 947 969 982 N
+ AW JH N b n/a 6 947 966 982 N
+ AW JH N e n/a 6 947 966 983 N
+ AW JH N i n/a 6 947 966 982 N
+ AW JH N s n/a 6 947 966 982 N
+ AW JH NG b n/a 6 947 969 982 N
+ AW JH NG e n/a 6 947 969 983 N
+ AW JH NG s n/a 6 947 969 982 N
+ AW JH OW e n/a 6 947 959 980 N
+ AW JH OW s n/a 6 947 959 980 N
+ AW JH OY e n/a 6 947 959 979 N
+ AW JH OY s n/a 6 947 959 979 N
+ AW JH P b n/a 6 945 959 970 N
+ AW JH P e n/a 6 945 959 970 N
+ AW JH P s n/a 6 945 959 970 N
+ AW JH R b n/a 6 947 959 981 N
+ AW JH R e n/a 6 947 959 981 N
+ AW JH R s n/a 6 947 959 981 N
+ AW JH S b n/a 6 945 965 971 N
+ AW JH S e n/a 6 945 965 971 N
+ AW JH S i n/a 6 945 965 971 N
+ AW JH S s n/a 6 945 965 971 N
+ AW JH SH b n/a 6 945 959 971 N
+ AW JH SH e n/a 6 945 959 971 N
+ AW JH SH s n/a 6 945 959 971 N
+ AW JH SIL e n/a 6 945 959 976 N
+ AW JH SIL s n/a 6 945 959 976 N
+ AW JH T b n/a 6 945 964 974 N
+ AW JH T e n/a 6 945 964 974 N
+ AW JH T s n/a 6 945 964 974 N
+ AW JH TH b n/a 6 945 965 970 N
+ AW JH TH e n/a 6 945 965 970 N
+ AW JH TH s n/a 6 945 965 970 N
+ AW JH UH e n/a 6 947 959 980 N
+ AW JH UH s n/a 6 947 959 980 N
+ AW JH UW b n/a 6 947 959 980 N
+ AW JH UW e n/a 6 947 959 980 N
+ AW JH UW s n/a 6 947 959 980 N
+ AW JH V e n/a 6 947 959 970 N
+ AW JH V s n/a 6 947 959 970 N
+ AW JH W e n/a 6 947 959 980 N
+ AW JH W s n/a 6 947 959 980 N
+ AW JH Y b n/a 6 947 959 977 N
+ AW JH Y e n/a 6 947 959 977 N
+ AW JH Y s n/a 6 947 959 977 N
+ AW JH Z b n/a 6 947 965 972 N
+ AW JH Z e n/a 6 947 965 972 N
+ AW JH Z s n/a 6 947 965 972 N
+ AW JH ZH e n/a 6 947 959 972 N
+ AW JH ZH s n/a 6 947 959 972 N
+ AW K AA e n/a 6 937 959 980 N
+ AW K AA i n/a 6 937 959 980 N
+ AW K AA s n/a 6 937 959 980 N
+ AW K AE e n/a 6 937 959 979 N
+ AW K AE s n/a 6 937 959 979 N
+ AW K AH b n/a 6 937 959 979 N
+ AW K AH e n/a 6 937 959 979 N
+ AW K AH i n/a 6 937 959 979 N
+ AW K AH s n/a 6 937 959 979 N
+ AW K AO e n/a 6 937 959 980 N
+ AW K AO s n/a 6 937 959 980 N
+ AW K AW e n/a 6 937 959 980 N
+ AW K AW s n/a 6 937 959 980 N
+ AW K AY e n/a 6 937 959 979 N
+ AW K AY i n/a 6 937 959 979 N
+ AW K AY s n/a 6 937 959 979 N
+ AW K B b n/a 6 937 959 970 N
+ AW K B e n/a 6 937 959 970 N
+ AW K B i n/a 6 937 959 970 N
+ AW K B s n/a 6 937 959 970 N
+ AW K CH b n/a 6 937 959 971 N
+ AW K CH e n/a 6 937 959 971 N
+ AW K CH i n/a 6 937 959 971 N
+ AW K CH s n/a 6 937 959 971 N
+ AW K D b n/a 6 949 964 975 N
+ AW K D e n/a 6 949 964 975 N
+ AW K D i n/a 6 949 964 975 N
+ AW K D s n/a 6 949 964 975 N
+ AW K DH e n/a 6 937 965 970 N
+ AW K DH s n/a 6 937 965 970 N
+ AW K EH e n/a 6 937 959 979 N
+ AW K EH s n/a 6 937 959 979 N
+ AW K ER b n/a 6 937 959 981 N
+ AW K ER e n/a 6 937 959 981 N
+ AW K ER i n/a 6 937 959 981 N
+ AW K ER s n/a 6 937 959 981 N
+ AW K EY e n/a 6 937 959 979 N
+ AW K EY s n/a 6 937 959 979 N
+ AW K F b n/a 6 937 959 970 N
+ AW K F e n/a 6 937 959 970 N
+ AW K F i n/a 6 937 959 970 N
+ AW K F s n/a 6 937 959 970 N
+ AW K G b n/a 6 937 959 970 N
+ AW K G e n/a 6 937 959 970 N
+ AW K G i n/a 6 937 959 970 N
+ AW K G s n/a 6 937 959 970 N
+ AW K HH e n/a 6 937 959 970 N
+ AW K HH i n/a 6 937 959 970 N
+ AW K HH s n/a 6 937 959 970 N
+ AW K IH b n/a 6 937 959 979 N
+ AW K IH e n/a 6 937 959 979 N
+ AW K IH i n/a 6 937 959 979 N
+ AW K IH s n/a 6 937 959 979 N
+ AW K IY b n/a 6 937 959 979 N
+ AW K IY e n/a 6 937 959 979 N
+ AW K IY i n/a 6 937 959 979 N
+ AW K IY s n/a 6 937 959 979 N
+ AW K JH e n/a 6 937 959 971 N
+ AW K JH i n/a 6 937 959 971 N
+ AW K JH s n/a 6 937 959 971 N
+ AW K K b n/a 6 937 959 970 N
+ AW K K e n/a 6 937 959 970 N
+ AW K K i n/a 6 937 959 970 N
+ AW K K s n/a 6 937 959 970 N
+ AW K L b n/a 6 937 959 980 N
+ AW K L e n/a 6 937 959 980 N
+ AW K L i n/a 6 937 959 980 N
+ AW K L s n/a 6 937 959 980 N
+ AW K M b n/a 6 937 969 983 N
+ AW K M e n/a 6 937 969 983 N
+ AW K M i n/a 6 937 969 983 N
+ AW K M s n/a 6 937 969 983 N
+ AW K N b n/a 6 949 968 983 N
+ AW K N e n/a 6 949 968 983 N
+ AW K N i n/a 6 949 967 983 N
+ AW K N s n/a 6 949 968 983 N
+ AW K NG b n/a 6 937 969 983 N
+ AW K NG e n/a 6 937 969 983 N
+ AW K NG s n/a 6 937 969 983 N
+ AW K OW e n/a 6 937 959 980 N
+ AW K OW s n/a 6 937 959 980 N
+ AW K OY e n/a 6 937 959 979 N
+ AW K OY s n/a 6 937 959 979 N
+ AW K P b n/a 6 937 959 970 N
+ AW K P e n/a 6 937 959 970 N
+ AW K P i n/a 6 937 959 970 N
+ AW K P s n/a 6 937 959 970 N
+ AW K R b n/a 6 937 959 981 N
+ AW K R e n/a 6 937 959 981 N
+ AW K R i n/a 6 937 959 981 N
+ AW K R s n/a 6 937 959 981 N
+ AW K S b n/a 6 937 965 971 N
+ AW K S e n/a 6 937 965 971 N
+ AW K S i n/a 6 937 965 971 N
+ AW K S s n/a 6 937 965 971 N
+ AW K SH b n/a 6 937 959 971 N
+ AW K SH e n/a 6 937 959 971 N
+ AW K SH i n/a 6 937 959 971 N
+ AW K SH s n/a 6 937 959 971 N
+ AW K SIL e n/a 6 937 959 976 N
+ AW K SIL s n/a 6 937 959 976 N
+ AW K T b n/a 6 945 964 974 N
+ AW K T e n/a 6 945 964 974 N
+ AW K T i n/a 6 945 964 974 N
+ AW K T s n/a 6 945 964 974 N
+ AW K TH b n/a 6 937 965 970 N
+ AW K TH e n/a 6 937 965 970 N
+ AW K TH i n/a 6 937 965 970 N
+ AW K TH s n/a 6 937 965 970 N
+ AW K UH e n/a 6 937 959 980 N
+ AW K UH s n/a 6 937 959 980 N
+ AW K UW b n/a 6 937 959 980 N
+ AW K UW e n/a 6 937 959 980 N
+ AW K UW s n/a 6 937 959 980 N
+ AW K V e n/a 6 937 959 970 N
+ AW K V s n/a 6 937 959 970 N
+ AW K W e n/a 6 937 959 980 N
+ AW K W s n/a 6 937 959 980 N
+ AW K Y b n/a 6 937 959 977 N
+ AW K Y e n/a 6 937 959 977 N
+ AW K Y i n/a 6 937 959 979 N
+ AW K Y s n/a 6 937 959 977 N
+ AW K Z b n/a 6 937 965 972 N
+ AW K Z e n/a 6 937 965 972 N
+ AW K Z i n/a 6 937 965 972 N
+ AW K Z s n/a 6 937 965 972 N
+ AW K ZH e n/a 6 937 959 972 N
+ AW K ZH s n/a 6 937 959 972 N
+ AW L AA e n/a 6 941 959 980 N
+ AW L AA i n/a 6 941 959 980 N
+ AW L AA s n/a 6 941 959 980 N
+ AW L AE e n/a 6 941 959 979 N
+ AW L AE s n/a 6 941 959 979 N
+ AW L AH b n/a 6 942 959 979 N
+ AW L AH e n/a 6 941 959 979 N
+ AW L AH i n/a 6 941 959 979 N
+ AW L AH s n/a 6 941 959 979 N
+ AW L AO e n/a 6 941 959 980 N
+ AW L AO s n/a 6 941 959 980 N
+ AW L AW e n/a 6 941 959 980 N
+ AW L AW s n/a 6 941 959 980 N
+ AW L AY e n/a 6 941 959 979 N
+ AW L AY s n/a 6 941 959 979 N
+ AW L B b n/a 6 942 959 970 N
+ AW L B e n/a 6 941 959 970 N
+ AW L B i n/a 6 941 959 970 N
+ AW L B s n/a 6 941 959 970 N
+ AW L CH b n/a 6 942 959 971 N
+ AW L CH e n/a 6 941 959 971 N
+ AW L CH i n/a 6 941 959 971 N
+ AW L CH s n/a 6 941 959 971 N
+ AW L D b n/a 6 942 963 975 N
+ AW L D e n/a 6 941 963 975 N
+ AW L D i n/a 6 941 963 975 N
+ AW L D s n/a 6 941 963 975 N
+ AW L DH e n/a 6 941 963 970 N
+ AW L DH s n/a 6 941 963 970 N
+ AW L EH e n/a 6 941 959 979 N
+ AW L EH i n/a 6 941 959 979 N
+ AW L EH s n/a 6 941 959 979 N
+ AW L ER b n/a 6 942 959 981 N
+ AW L ER e n/a 6 941 959 981 N
+ AW L ER i n/a 6 941 959 981 N
+ AW L ER s n/a 6 941 959 981 N
+ AW L EY e n/a 6 941 959 979 N
+ AW L EY s n/a 6 941 959 979 N
+ AW L F b n/a 6 942 959 970 N
+ AW L F e n/a 6 941 959 970 N
+ AW L F i n/a 6 941 959 970 N
+ AW L F s n/a 6 941 959 970 N
+ AW L G b n/a 6 942 959 970 N
+ AW L G e n/a 6 941 959 970 N
+ AW L G i n/a 6 941 959 970 N
+ AW L G s n/a 6 941 959 970 N
+ AW L HH e n/a 6 941 959 970 N
+ AW L HH i n/a 6 941 959 970 N
+ AW L HH s n/a 6 941 959 970 N
+ AW L IH b n/a 6 942 959 979 N
+ AW L IH e n/a 6 941 959 979 N
+ AW L IH i n/a 6 941 959 979 N
+ AW L IH s n/a 6 941 959 979 N
+ AW L IY b n/a 6 942 959 979 N
+ AW L IY e n/a 6 941 959 979 N
+ AW L IY i n/a 6 941 959 979 N
+ AW L IY s n/a 6 941 959 979 N
+ AW L JH e n/a 6 941 959 971 N
+ AW L JH i n/a 6 941 959 971 N
+ AW L JH s n/a 6 941 959 971 N
+ AW L K b n/a 6 942 959 970 N
+ AW L K e n/a 6 941 959 970 N
+ AW L K i n/a 6 941 959 970 N
+ AW L K s n/a 6 941 959 970 N
+ AW L L b n/a 6 942 959 980 N
+ AW L L e n/a 6 941 959 980 N
+ AW L L s n/a 6 941 959 980 N
+ AW L M b n/a 6 942 969 982 N
+ AW L M e n/a 6 941 969 983 N
+ AW L M i n/a 6 941 969 982 N
+ AW L M s n/a 6 941 969 982 N
+ AW L N b n/a 6 942 966 982 N
+ AW L N e n/a 6 941 966 983 N
+ AW L N i n/a 6 941 966 982 N
+ AW L N s n/a 6 941 966 982 N
+ AW L NG b n/a 6 942 969 982 N
+ AW L NG e n/a 6 941 969 983 N
+ AW L NG i n/a 6 941 969 982 N
+ AW L NG s n/a 6 941 969 982 N
+ AW L OW e n/a 6 941 959 980 N
+ AW L OW s n/a 6 941 959 980 N
+ AW L OY e n/a 6 941 959 979 N
+ AW L OY s n/a 6 941 959 979 N
+ AW L P b n/a 6 942 959 970 N
+ AW L P e n/a 6 941 959 970 N
+ AW L P i n/a 6 941 959 970 N
+ AW L P s n/a 6 941 959 970 N
+ AW L R b n/a 6 942 959 981 N
+ AW L R e n/a 6 941 959 981 N
+ AW L R i n/a 6 941 959 981 N
+ AW L R s n/a 6 941 959 981 N
+ AW L S b n/a 6 942 963 971 N
+ AW L S e n/a 6 941 963 971 N
+ AW L S i n/a 6 941 963 971 N
+ AW L S s n/a 6 941 963 971 N
+ AW L SH b n/a 6 942 959 971 N
+ AW L SH e n/a 6 941 959 971 N
+ AW L SH i n/a 6 941 959 971 N
+ AW L SH s n/a 6 941 959 971 N
+ AW L SIL e n/a 6 941 959 976 N
+ AW L SIL s n/a 6 941 959 976 N
+ AW L T b n/a 6 942 963 974 N
+ AW L T e n/a 6 941 963 974 N
+ AW L T i n/a 6 941 963 974 N
+ AW L T s n/a 6 941 963 974 N
+ AW L TH b n/a 6 942 963 970 N
+ AW L TH e n/a 6 941 963 970 N
+ AW L TH i n/a 6 941 963 970 N
+ AW L TH s n/a 6 941 963 970 N
+ AW L UH e n/a 6 941 959 980 N
+ AW L UH s n/a 6 941 959 980 N
+ AW L UW b n/a 6 942 959 980 N
+ AW L UW e n/a 6 941 959 980 N
+ AW L UW i n/a 6 941 959 980 N
+ AW L UW s n/a 6 941 959 980 N
+ AW L V e n/a 6 941 959 970 N
+ AW L V i n/a 6 941 959 970 N
+ AW L V s n/a 6 941 959 970 N
+ AW L W e n/a 6 941 959 980 N
+ AW L W s n/a 6 941 959 980 N
+ AW L Y b n/a 6 942 959 977 N
+ AW L Y e n/a 6 941 959 977 N
+ AW L Y s n/a 6 941 959 977 N
+ AW L Z b n/a 6 942 963 972 N
+ AW L Z e n/a 6 941 963 972 N
+ AW L Z i n/a 6 941 963 972 N
+ AW L Z s n/a 6 941 963 972 N
+ AW L ZH e n/a 6 941 959 972 N
+ AW L ZH s n/a 6 941 959 972 N
+ AW M AA e n/a 6 956 969 980 N
+ AW M AA s n/a 6 956 969 980 N
+ AW M AE e n/a 6 956 969 979 N
+ AW M AE s n/a 6 956 969 979 N
+ AW M AH b n/a 6 956 969 979 N
+ AW M AH e n/a 6 956 969 979 N
+ AW M AH i n/a 6 956 969 979 N
+ AW M AH s n/a 6 956 969 979 N
+ AW M AO e n/a 6 956 969 980 N
+ AW M AO s n/a 6 956 969 980 N
+ AW M AW e n/a 6 956 969 980 N
+ AW M AW s n/a 6 956 969 980 N
+ AW M AY e n/a 6 956 969 979 N
+ AW M AY s n/a 6 956 969 979 N
+ AW M B b n/a 6 956 969 970 N
+ AW M B e n/a 6 956 969 970 N
+ AW M B s n/a 6 956 969 970 N
+ AW M CH b n/a 6 956 969 971 N
+ AW M CH e n/a 6 956 969 971 N
+ AW M CH i n/a 6 956 969 971 N
+ AW M CH s n/a 6 956 969 971 N
+ AW M D b n/a 6 956 963 975 N
+ AW M D e n/a 6 956 963 975 N
+ AW M D i n/a 6 956 963 975 N
+ AW M D s n/a 6 956 963 975 N
+ AW M DH e n/a 6 956 969 970 N
+ AW M DH i n/a 6 956 969 970 N
+ AW M DH s n/a 6 956 969 970 N
+ AW M EH e n/a 6 956 969 979 N
+ AW M EH s n/a 6 956 969 979 N
+ AW M ER b n/a 6 956 969 981 N
+ AW M ER e n/a 6 956 969 981 N
+ AW M ER i n/a 6 956 969 981 N
+ AW M ER s n/a 6 956 969 981 N
+ AW M EY e n/a 6 956 969 979 N
+ AW M EY s n/a 6 956 969 979 N
+ AW M F b n/a 6 956 969 970 N
+ AW M F e n/a 6 956 969 970 N
+ AW M F s n/a 6 956 969 970 N
+ AW M G b n/a 6 956 969 970 N
+ AW M G e n/a 6 956 969 970 N
+ AW M G s n/a 6 956 969 970 N
+ AW M HH e n/a 6 956 969 970 N
+ AW M HH s n/a 6 956 969 970 N
+ AW M IH b n/a 6 956 969 979 N
+ AW M IH e n/a 6 956 969 979 N
+ AW M IH i n/a 6 956 969 979 N
+ AW M IH s n/a 6 956 969 979 N
+ AW M IY b n/a 6 956 969 979 N
+ AW M IY e n/a 6 956 969 979 N
+ AW M IY i n/a 6 956 969 979 N
+ AW M IY s n/a 6 956 969 979 N
+ AW M JH e n/a 6 956 969 971 N
+ AW M JH s n/a 6 956 969 971 N
+ AW M K b n/a 6 956 969 970 N
+ AW M K e n/a 6 956 969 970 N
+ AW M K s n/a 6 956 969 970 N
+ AW M L b n/a 6 956 969 980 N
+ AW M L e n/a 6 956 969 980 N
+ AW M L i n/a 6 956 969 980 N
+ AW M L s n/a 6 956 969 980 N
+ AW M M b n/a 6 956 969 983 N
+ AW M M e n/a 6 956 969 983 N
+ AW M M i n/a 6 956 969 983 N
+ AW M M s n/a 6 956 969 983 N
+ AW M N b n/a 6 956 966 983 N
+ AW M N e n/a 6 956 966 983 N
+ AW M N i n/a 6 956 966 983 N
+ AW M N s n/a 6 956 966 983 N
+ AW M NG b n/a 6 956 969 983 N
+ AW M NG e n/a 6 956 969 983 N
+ AW M NG i n/a 6 956 969 983 N
+ AW M NG s n/a 6 956 969 983 N
+ AW M OW e n/a 6 956 969 980 N
+ AW M OW s n/a 6 956 969 980 N
+ AW M OY e n/a 6 956 969 979 N
+ AW M OY s n/a 6 956 969 979 N
+ AW M P b n/a 6 956 969 970 N
+ AW M P e n/a 6 956 969 970 N
+ AW M P s n/a 6 956 969 970 N
+ AW M R b n/a 6 956 969 981 N
+ AW M R e n/a 6 956 969 981 N
+ AW M R i n/a 6 956 969 981 N
+ AW M R s n/a 6 956 969 981 N
+ AW M S b n/a 6 956 969 971 N
+ AW M S e n/a 6 956 969 971 N
+ AW M S i n/a 6 956 969 971 N
+ AW M S s n/a 6 956 969 971 N
+ AW M SH b n/a 6 956 969 971 N
+ AW M SH e n/a 6 956 969 971 N
+ AW M SH s n/a 6 956 969 971 N
+ AW M SIL e n/a 6 956 969 976 N
+ AW M SIL s n/a 6 956 969 976 N
+ AW M T b n/a 6 956 963 974 N
+ AW M T e n/a 6 956 963 974 N
+ AW M T i n/a 6 956 963 974 N
+ AW M T s n/a 6 956 963 974 N
+ AW M TH b n/a 6 956 969 970 N
+ AW M TH e n/a 6 956 969 970 N
+ AW M TH i n/a 6 956 969 970 N
+ AW M TH s n/a 6 956 969 970 N
+ AW M UH e n/a 6 956 969 980 N
+ AW M UH s n/a 6 956 969 980 N
+ AW M UW b n/a 6 956 969 980 N
+ AW M UW e n/a 6 956 969 980 N
+ AW M UW s n/a 6 956 969 980 N
+ AW M V e n/a 6 956 969 970 N
+ AW M V s n/a 6 956 969 970 N
+ AW M W e n/a 6 956 969 980 N
+ AW M W i n/a 6 956 969 980 N
+ AW M W s n/a 6 956 969 980 N
+ AW M Y b n/a 6 956 969 977 N
+ AW M Y e n/a 6 956 969 977 N
+ AW M Y s n/a 6 956 969 977 N
+ AW M Z b n/a 6 956 969 972 N
+ AW M Z e n/a 6 956 969 972 N
+ AW M Z i n/a 6 956 969 972 N
+ AW M Z s n/a 6 956 969 972 N
+ AW M ZH e n/a 6 956 969 972 N
+ AW M ZH s n/a 6 956 969 972 N
+ AW N AA e n/a 6 954 969 980 N
+ AW N AA i n/a 6 954 969 980 N
+ AW N AA s n/a 6 954 969 980 N
+ AW N AE e n/a 6 954 969 979 N
+ AW N AE s n/a 6 954 969 979 N
+ AW N AH b n/a 6 955 969 979 N
+ AW N AH e n/a 6 954 969 979 N
+ AW N AH i n/a 6 954 969 979 N
+ AW N AH s n/a 6 954 969 979 N
+ AW N AO e n/a 6 954 969 980 N
+ AW N AO s n/a 6 954 969 980 N
+ AW N AW e n/a 6 954 969 980 N
+ AW N AW s n/a 6 954 969 980 N
+ AW N AY e n/a 6 954 969 979 N
+ AW N AY s n/a 6 954 969 979 N
+ AW N B b n/a 6 955 969 970 N
+ AW N B e n/a 6 954 969 970 N
+ AW N B s n/a 6 954 969 970 N
+ AW N CH b n/a 6 955 969 971 N
+ AW N CH e n/a 6 954 969 971 N
+ AW N CH s n/a 6 954 969 971 N
+ AW N D b n/a 6 955 964 975 N
+ AW N D e n/a 6 954 964 975 N
+ AW N D s n/a 6 954 964 975 N
+ AW N DH e n/a 6 954 969 970 N
+ AW N DH s n/a 6 954 969 970 N
+ AW N EH e n/a 6 954 969 979 N
+ AW N EH i n/a 6 954 969 979 N
+ AW N EH s n/a 6 954 969 979 N
+ AW N ER b n/a 6 955 969 981 N
+ AW N ER e n/a 6 954 969 981 N
+ AW N ER i n/a 6 954 969 981 N
+ AW N ER s n/a 6 954 969 981 N
+ AW N EY e n/a 6 954 969 979 N
+ AW N EY s n/a 6 954 969 979 N
+ AW N F b n/a 6 955 969 970 N
+ AW N F e n/a 6 954 969 970 N
+ AW N F s n/a 6 954 969 970 N
+ AW N G b n/a 6 955 969 970 N
+ AW N G e n/a 6 954 969 970 N
+ AW N G s n/a 6 954 969 970 N
+ AW N HH e n/a 6 954 969 970 N
+ AW N HH s n/a 6 954 969 970 N
+ AW N IH b n/a 6 955 969 979 N
+ AW N IH e n/a 6 954 969 979 N
+ AW N IH i n/a 6 954 969 979 N
+ AW N IH s n/a 6 954 969 979 N
+ AW N IY b n/a 6 955 969 979 N
+ AW N IY e n/a 6 954 969 979 N
+ AW N IY i n/a 6 954 969 979 N
+ AW N IY s n/a 6 954 969 979 N
+ AW N JH e n/a 6 954 969 971 N
+ AW N JH s n/a 6 954 969 971 N
+ AW N K b n/a 6 955 969 970 N
+ AW N K e n/a 6 954 969 970 N
+ AW N K i n/a 6 954 969 970 N
+ AW N K s n/a 6 954 969 970 N
+ AW N L b n/a 6 955 969 980 N
+ AW N L e n/a 6 954 969 980 N
+ AW N L i n/a 6 954 969 980 N
+ AW N L s n/a 6 954 969 980 N
+ AW N M b n/a 6 955 969 983 N
+ AW N M e n/a 6 954 969 983 N
+ AW N M i n/a 6 954 969 983 N
+ AW N M s n/a 6 954 969 983 N
+ AW N N b n/a 6 955 968 983 N
+ AW N N e n/a 6 954 968 983 N
+ AW N N i n/a 6 954 968 983 N
+ AW N N s n/a 6 954 968 983 N
+ AW N NG b n/a 6 955 969 983 N
+ AW N NG e n/a 6 954 969 983 N
+ AW N NG s n/a 6 954 969 983 N
+ AW N OW e n/a 6 954 969 980 N
+ AW N OW i n/a 6 954 969 980 N
+ AW N OW s n/a 6 954 969 980 N
+ AW N OY e n/a 6 954 969 979 N
+ AW N OY s n/a 6 954 969 979 N
+ AW N P b n/a 6 955 969 970 N
+ AW N P e n/a 6 954 969 970 N
+ AW N P s n/a 6 954 969 970 N
+ AW N R b n/a 6 955 969 981 N
+ AW N R e n/a 6 954 969 981 N
+ AW N R i n/a 6 954 969 981 N
+ AW N R s n/a 6 954 969 981 N
+ AW N S b n/a 6 955 969 971 N
+ AW N S e n/a 6 954 969 971 N
+ AW N S i n/a 6 954 969 971 N
+ AW N S s n/a 6 954 969 971 N
+ AW N SH b n/a 6 955 969 971 N
+ AW N SH e n/a 6 954 969 971 N
+ AW N SH s n/a 6 954 969 971 N
+ AW N SIL e n/a 6 954 969 976 N
+ AW N SIL s n/a 6 954 969 976 N
+ AW N T b n/a 6 955 964 974 N
+ AW N T e n/a 6 954 964 974 N
+ AW N T i n/a 6 954 964 974 N
+ AW N T s n/a 6 954 964 974 N
+ AW N TH b n/a 6 955 969 970 N
+ AW N TH e n/a 6 954 969 970 N
+ AW N TH s n/a 6 954 969 970 N
+ AW N UH e n/a 6 954 969 980 N
+ AW N UH s n/a 6 954 969 980 N
+ AW N UW b n/a 6 955 969 980 N
+ AW N UW e n/a 6 954 969 980 N
+ AW N UW s n/a 6 954 969 980 N
+ AW N V e n/a 6 954 969 970 N
+ AW N V s n/a 6 954 969 970 N
+ AW N W e n/a 6 954 969 980 N
+ AW N W s n/a 6 954 969 980 N
+ AW N Y b n/a 6 955 969 977 N
+ AW N Y e n/a 6 954 969 977 N
+ AW N Y s n/a 6 954 969 977 N
+ AW N Z b n/a 6 955 969 972 N
+ AW N Z e n/a 6 954 969 972 N
+ AW N Z i n/a 6 954 969 972 N
+ AW N Z s n/a 6 954 969 972 N
+ AW N ZH e n/a 6 954 969 972 N
+ AW N ZH s n/a 6 954 969 972 N
+ AW NG AA s n/a 6 954 969 980 N
+ AW NG AE s n/a 6 954 969 979 N
+ AW NG AH b n/a 6 955 969 979 N
+ AW NG AH s n/a 6 954 969 979 N
+ AW NG AO s n/a 6 954 969 980 N
+ AW NG AW s n/a 6 954 969 980 N
+ AW NG AY s n/a 6 954 969 979 N
+ AW NG B b n/a 6 955 969 970 N
+ AW NG B s n/a 6 954 969 970 N
+ AW NG CH b n/a 6 955 969 971 N
+ AW NG CH s n/a 6 954 969 971 N
+ AW NG D b n/a 6 955 964 975 N
+ AW NG D s n/a 6 954 964 975 N
+ AW NG DH s n/a 6 954 969 970 N
+ AW NG EH s n/a 6 954 969 979 N
+ AW NG ER b n/a 6 955 969 981 N
+ AW NG ER s n/a 6 954 969 981 N
+ AW NG EY s n/a 6 954 969 979 N
+ AW NG F b n/a 6 955 969 970 N
+ AW NG F s n/a 6 954 969 970 N
+ AW NG G b n/a 6 955 969 970 N
+ AW NG G s n/a 6 954 969 970 N
+ AW NG HH s n/a 6 954 969 970 N
+ AW NG IH b n/a 6 955 969 979 N
+ AW NG IH s n/a 6 954 969 979 N
+ AW NG IY b n/a 6 955 969 979 N
+ AW NG IY s n/a 6 954 969 979 N
+ AW NG JH s n/a 6 954 969 971 N
+ AW NG K b n/a 6 955 969 970 N
+ AW NG K s n/a 6 954 969 970 N
+ AW NG L b n/a 6 955 969 980 N
+ AW NG L s n/a 6 954 969 980 N
+ AW NG M b n/a 6 955 969 983 N
+ AW NG M s n/a 6 954 969 983 N
+ AW NG N b n/a 6 955 968 983 N
+ AW NG N s n/a 6 954 968 983 N
+ AW NG NG b n/a 6 955 969 983 N
+ AW NG NG s n/a 6 954 969 983 N
+ AW NG OW s n/a 6 954 969 980 N
+ AW NG OY s n/a 6 954 969 979 N
+ AW NG P b n/a 6 955 969 970 N
+ AW NG P s n/a 6 954 969 970 N
+ AW NG R b n/a 6 955 969 981 N
+ AW NG R s n/a 6 954 969 981 N
+ AW NG S b n/a 6 955 969 971 N
+ AW NG S s n/a 6 954 969 971 N
+ AW NG SH b n/a 6 955 969 971 N
+ AW NG SH s n/a 6 954 969 971 N
+ AW NG SIL s n/a 6 954 969 976 N
+ AW NG T b n/a 6 955 964 974 N
+ AW NG T i n/a 6 954 964 974 N
+ AW NG T s n/a 6 954 964 974 N
+ AW NG TH b n/a 6 955 969 970 N
+ AW NG TH s n/a 6 954 969 970 N
+ AW NG UH s n/a 6 954 969 980 N
+ AW NG UW b n/a 6 955 969 980 N
+ AW NG UW s n/a 6 954 969 980 N
+ AW NG V s n/a 6 954 969 970 N
+ AW NG W s n/a 6 954 969 980 N
+ AW NG Y b n/a 6 955 969 977 N
+ AW NG Y s n/a 6 954 969 977 N
+ AW NG Z b n/a 6 955 969 972 N
+ AW NG Z s n/a 6 954 969 972 N
+ AW NG ZH s n/a 6 954 969 972 N
+ AW OW AA e n/a 6 942 959 980 N
+ AW OW AA s n/a 6 942 959 980 N
+ AW OW AE e n/a 6 942 959 979 N
+ AW OW AE s n/a 6 942 959 979 N
+ AW OW AH b n/a 6 942 959 979 N
+ AW OW AH e n/a 6 942 959 979 N
+ AW OW AH s n/a 6 942 959 979 N
+ AW OW AO e n/a 6 942 959 980 N
+ AW OW AO s n/a 6 942 959 980 N
+ AW OW AW e n/a 6 942 959 980 N
+ AW OW AW s n/a 6 942 959 980 N
+ AW OW AY e n/a 6 942 959 979 N
+ AW OW AY s n/a 6 942 959 979 N
+ AW OW B b n/a 6 942 959 970 N
+ AW OW B e n/a 6 942 959 970 N
+ AW OW B s n/a 6 942 959 970 N
+ AW OW CH b n/a 6 942 959 971 N
+ AW OW CH e n/a 6 942 959 971 N
+ AW OW CH s n/a 6 942 959 971 N
+ AW OW D b n/a 6 942 963 975 N
+ AW OW D e n/a 6 942 963 975 N
+ AW OW D s n/a 6 942 963 975 N
+ AW OW DH e n/a 6 942 963 970 N
+ AW OW DH s n/a 6 942 963 970 N
+ AW OW EH e n/a 6 942 959 979 N
+ AW OW EH s n/a 6 942 959 979 N
+ AW OW ER b n/a 6 942 959 981 N
+ AW OW ER e n/a 6 942 959 981 N
+ AW OW ER s n/a 6 942 959 981 N
+ AW OW EY e n/a 6 942 959 979 N
+ AW OW EY s n/a 6 942 959 979 N
+ AW OW F b n/a 6 942 959 970 N
+ AW OW F e n/a 6 942 959 970 N
+ AW OW F s n/a 6 942 959 970 N
+ AW OW G b n/a 6 942 959 970 N
+ AW OW G e n/a 6 942 959 970 N
+ AW OW G s n/a 6 942 959 970 N
+ AW OW HH e n/a 6 942 959 970 N
+ AW OW HH s n/a 6 942 959 970 N
+ AW OW IH b n/a 6 942 959 979 N
+ AW OW IH e n/a 6 942 959 979 N
+ AW OW IH s n/a 6 942 959 979 N
+ AW OW IY b n/a 6 942 959 979 N
+ AW OW IY e n/a 6 942 959 979 N
+ AW OW IY s n/a 6 942 959 979 N
+ AW OW JH e n/a 6 942 959 971 N
+ AW OW JH s n/a 6 942 959 971 N
+ AW OW K b n/a 6 942 959 970 N
+ AW OW K e n/a 6 942 959 970 N
+ AW OW K s n/a 6 942 959 970 N
+ AW OW L b n/a 6 942 959 980 N
+ AW OW L e n/a 6 942 959 980 N
+ AW OW L s n/a 6 942 959 980 N
+ AW OW M b n/a 6 942 969 982 N
+ AW OW M e n/a 6 942 969 983 N
+ AW OW M s n/a 6 942 969 982 N
+ AW OW N b n/a 6 942 966 982 N
+ AW OW N e n/a 6 942 966 983 N
+ AW OW N s n/a 6 942 966 982 N
+ AW OW NG b n/a 6 942 969 982 N
+ AW OW NG e n/a 6 942 969 983 N
+ AW OW NG s n/a 6 942 969 982 N
+ AW OW OW e n/a 6 942 959 980 N
+ AW OW OW s n/a 6 942 959 980 N
+ AW OW OY e n/a 6 942 959 979 N
+ AW OW OY s n/a 6 942 959 979 N
+ AW OW P b n/a 6 942 959 970 N
+ AW OW P e n/a 6 942 959 970 N
+ AW OW P s n/a 6 942 959 970 N
+ AW OW R b n/a 6 942 959 981 N
+ AW OW R e n/a 6 942 959 981 N
+ AW OW R s n/a 6 942 959 981 N
+ AW OW S b n/a 6 942 963 971 N
+ AW OW S e n/a 6 942 963 971 N
+ AW OW S s n/a 6 942 963 971 N
+ AW OW SH b n/a 6 942 959 971 N
+ AW OW SH e n/a 6 942 959 971 N
+ AW OW SH s n/a 6 942 959 971 N
+ AW OW SIL e n/a 6 942 959 976 N
+ AW OW SIL s n/a 6 942 959 976 N
+ AW OW T b n/a 6 942 963 974 N
+ AW OW T e n/a 6 942 963 974 N
+ AW OW T i n/a 6 942 963 974 N
+ AW OW T s n/a 6 942 963 974 N
+ AW OW TH b n/a 6 942 963 970 N
+ AW OW TH e n/a 6 942 963 970 N
+ AW OW TH s n/a 6 942 963 970 N
+ AW OW UH e n/a 6 942 959 980 N
+ AW OW UH s n/a 6 942 959 980 N
+ AW OW UW b n/a 6 942 959 980 N
+ AW OW UW e n/a 6 942 959 980 N
+ AW OW UW s n/a 6 942 959 980 N
+ AW OW V e n/a 6 942 959 970 N
+ AW OW V s n/a 6 942 959 970 N
+ AW OW W e n/a 6 942 959 980 N
+ AW OW W s n/a 6 942 959 980 N
+ AW OW Y b n/a 6 942 959 977 N
+ AW OW Y e n/a 6 942 959 977 N
+ AW OW Y s n/a 6 942 959 977 N
+ AW OW Z b n/a 6 942 963 972 N
+ AW OW Z e n/a 6 942 963 972 N
+ AW OW Z s n/a 6 942 963 972 N
+ AW OW ZH e n/a 6 942 959 972 N
+ AW OW ZH s n/a 6 942 959 972 N
+ AW OY AA s n/a 6 945 959 980 N
+ AW OY AE s n/a 6 945 959 979 N
+ AW OY AH b n/a 6 945 959 979 N
+ AW OY AH s n/a 6 945 959 979 N
+ AW OY AO s n/a 6 945 959 980 N
+ AW OY AW s n/a 6 945 959 980 N
+ AW OY AY s n/a 6 945 959 979 N
+ AW OY B b n/a 6 945 959 970 N
+ AW OY B s n/a 6 945 959 970 N
+ AW OY CH b n/a 6 945 959 971 N
+ AW OY CH s n/a 6 945 959 971 N
+ AW OY D b n/a 6 945 964 975 N
+ AW OY D s n/a 6 945 964 975 N
+ AW OY DH s n/a 6 945 965 970 N
+ AW OY EH s n/a 6 945 959 979 N
+ AW OY ER b n/a 6 945 959 981 N
+ AW OY ER s n/a 6 945 959 981 N
+ AW OY EY s n/a 6 945 959 979 N
+ AW OY F b n/a 6 945 959 970 N
+ AW OY F s n/a 6 945 959 970 N
+ AW OY G b n/a 6 945 959 970 N
+ AW OY G s n/a 6 945 959 970 N
+ AW OY HH s n/a 6 945 959 970 N
+ AW OY IH b n/a 6 945 959 979 N
+ AW OY IH s n/a 6 945 959 979 N
+ AW OY IY b n/a 6 945 959 979 N
+ AW OY IY s n/a 6 945 959 979 N
+ AW OY JH s n/a 6 945 959 971 N
+ AW OY K b n/a 6 945 959 970 N
+ AW OY K s n/a 6 945 959 970 N
+ AW OY L b n/a 6 945 959 980 N
+ AW OY L s n/a 6 945 959 980 N
+ AW OY M b n/a 6 947 969 982 N
+ AW OY M s n/a 6 947 969 982 N
+ AW OY N b n/a 6 947 966 982 N
+ AW OY N s n/a 6 947 966 982 N
+ AW OY NG b n/a 6 947 969 982 N
+ AW OY NG s n/a 6 947 969 982 N
+ AW OY OW s n/a 6 945 959 980 N
+ AW OY OY s n/a 6 945 959 979 N
+ AW OY P b n/a 6 945 959 970 N
+ AW OY P s n/a 6 945 959 970 N
+ AW OY R b n/a 6 945 959 981 N
+ AW OY R s n/a 6 945 959 981 N
+ AW OY S b n/a 6 945 965 971 N
+ AW OY S s n/a 6 945 965 971 N
+ AW OY SH b n/a 6 945 959 971 N
+ AW OY SH s n/a 6 945 959 971 N
+ AW OY SIL s n/a 6 945 959 976 N
+ AW OY T b n/a 6 945 964 974 N
+ AW OY T s n/a 6 945 964 974 N
+ AW OY TH b n/a 6 945 965 970 N
+ AW OY TH s n/a 6 945 965 970 N
+ AW OY UH s n/a 6 945 959 980 N
+ AW OY UW b n/a 6 945 959 980 N
+ AW OY UW s n/a 6 945 959 980 N
+ AW OY V s n/a 6 945 959 970 N
+ AW OY W s n/a 6 945 959 980 N
+ AW OY Y b n/a 6 945 959 977 N
+ AW OY Y s n/a 6 945 959 977 N
+ AW OY Z b n/a 6 945 965 972 N
+ AW OY Z s n/a 6 945 965 972 N
+ AW OY ZH s n/a 6 945 959 972 N
+ AW P AA e n/a 6 938 959 980 N
+ AW P AA s n/a 6 938 959 980 N
+ AW P AE e n/a 6 938 959 979 N
+ AW P AE s n/a 6 938 959 979 N
+ AW P AH b n/a 6 938 959 979 N
+ AW P AH e n/a 6 938 959 979 N
+ AW P AH i n/a 6 938 959 979 N
+ AW P AH s n/a 6 938 959 979 N
+ AW P AO e n/a 6 938 959 980 N
+ AW P AO s n/a 6 938 959 980 N
+ AW P AW e n/a 6 938 959 980 N
+ AW P AW s n/a 6 938 959 980 N
+ AW P AY e n/a 6 938 959 979 N
+ AW P AY s n/a 6 938 959 979 N
+ AW P B b n/a 6 938 959 970 N
+ AW P B e n/a 6 938 959 970 N
+ AW P B s n/a 6 938 959 970 N
+ AW P CH b n/a 6 938 959 971 N
+ AW P CH e n/a 6 938 959 971 N
+ AW P CH i n/a 6 938 959 971 N
+ AW P CH s n/a 6 938 959 971 N
+ AW P D b n/a 6 948 963 975 N
+ AW P D e n/a 6 948 963 975 N
+ AW P D i n/a 6 948 963 975 N
+ AW P D s n/a 6 948 963 975 N
+ AW P DH e n/a 6 939 963 970 N
+ AW P DH s n/a 6 939 963 970 N
+ AW P EH e n/a 6 938 959 979 N
+ AW P EH s n/a 6 938 959 979 N
+ AW P ER b n/a 6 938 959 981 N
+ AW P ER e n/a 6 938 959 981 N
+ AW P ER i n/a 6 938 959 981 N
+ AW P ER s n/a 6 938 959 981 N
+ AW P EY e n/a 6 938 959 979 N
+ AW P EY s n/a 6 938 959 979 N
+ AW P F b n/a 6 938 959 970 N
+ AW P F e n/a 6 938 959 970 N
+ AW P F i n/a 6 938 959 970 N
+ AW P F s n/a 6 938 959 970 N
+ AW P G b n/a 6 938 959 970 N
+ AW P G e n/a 6 938 959 970 N
+ AW P G s n/a 6 938 959 970 N
+ AW P HH e n/a 6 938 959 970 N
+ AW P HH s n/a 6 938 959 970 N
+ AW P IH b n/a 6 938 959 979 N
+ AW P IH e n/a 6 938 959 979 N
+ AW P IH i n/a 6 938 959 979 N
+ AW P IH s n/a 6 938 959 979 N
+ AW P IY b n/a 6 938 959 979 N
+ AW P IY e n/a 6 938 959 979 N
+ AW P IY i n/a 6 938 959 979 N
+ AW P IY s n/a 6 938 959 979 N
+ AW P JH e n/a 6 938 959 971 N
+ AW P JH s n/a 6 938 959 971 N
+ AW P K b n/a 6 938 959 970 N
+ AW P K e n/a 6 938 959 970 N
+ AW P K s n/a 6 938 959 970 N
+ AW P L b n/a 6 938 959 980 N
+ AW P L e n/a 6 938 959 980 N
+ AW P L i n/a 6 938 959 980 N
+ AW P L s n/a 6 938 959 980 N
+ AW P M b n/a 6 938 969 982 N
+ AW P M e n/a 6 938 969 983 N
+ AW P M s n/a 6 938 969 982 N
+ AW P N b n/a 6 947 966 982 N
+ AW P N e n/a 6 947 966 983 N
+ AW P N i n/a 6 947 966 982 N
+ AW P N s n/a 6 947 966 982 N
+ AW P NG b n/a 6 938 969 982 N
+ AW P NG e n/a 6 938 969 983 N
+ AW P NG s n/a 6 938 969 982 N
+ AW P OW e n/a 6 938 959 980 N
+ AW P OW s n/a 6 938 959 980 N
+ AW P OY e n/a 6 938 959 979 N
+ AW P OY s n/a 6 938 959 979 N
+ AW P P b n/a 6 938 959 970 N
+ AW P P e n/a 6 938 959 970 N
+ AW P P s n/a 6 938 959 970 N
+ AW P R b n/a 6 938 959 981 N
+ AW P R e n/a 6 938 959 981 N
+ AW P R i n/a 6 938 959 981 N
+ AW P R s n/a 6 938 959 981 N
+ AW P S b n/a 6 940 963 971 N
+ AW P S e n/a 6 940 963 971 N
+ AW P S i n/a 6 940 963 971 N
+ AW P S s n/a 6 940 963 971 N
+ AW P SH b n/a 6 938 959 971 N
+ AW P SH e n/a 6 938 959 971 N
+ AW P SH i n/a 6 938 959 971 N
+ AW P SH s n/a 6 938 959 971 N
+ AW P SIL e n/a 6 938 959 976 N
+ AW P SIL s n/a 6 938 959 976 N
+ AW P T b n/a 6 946 963 974 N
+ AW P T e n/a 6 946 963 974 N
+ AW P T i n/a 6 946 963 974 N
+ AW P T s n/a 6 946 963 974 N
+ AW P TH b n/a 6 939 963 970 N
+ AW P TH e n/a 6 939 963 970 N
+ AW P TH s n/a 6 939 963 970 N
+ AW P UH e n/a 6 938 959 980 N
+ AW P UH s n/a 6 938 959 980 N
+ AW P UW b n/a 6 938 959 980 N
+ AW P UW e n/a 6 938 959 980 N
+ AW P UW s n/a 6 938 959 980 N
+ AW P V e n/a 6 938 959 970 N
+ AW P V s n/a 6 938 959 970 N
+ AW P W e n/a 6 938 959 980 N
+ AW P W i n/a 6 938 959 980 N
+ AW P W s n/a 6 938 959 980 N
+ AW P Y b n/a 6 938 959 977 N
+ AW P Y e n/a 6 938 959 977 N
+ AW P Y s n/a 6 938 959 977 N
+ AW P Z b n/a 6 940 963 972 N
+ AW P Z e n/a 6 940 963 972 N
+ AW P Z i n/a 6 940 963 972 N
+ AW P Z s n/a 6 940 963 972 N
+ AW P ZH e n/a 6 938 959 972 N
+ AW P ZH s n/a 6 938 959 972 N
+ AW R AA e n/a 6 943 959 980 N
+ AW R AA s n/a 6 943 959 980 N
+ AW R AE e n/a 6 943 959 979 N
+ AW R AE i n/a 6 943 959 979 N
+ AW R AE s n/a 6 943 959 979 N
+ AW R AH b n/a 6 943 959 979 N
+ AW R AH e n/a 6 943 959 979 N
+ AW R AH i n/a 6 943 959 979 N
+ AW R AH s n/a 6 943 959 979 N
+ AW R AO e n/a 6 943 959 980 N
+ AW R AO s n/a 6 943 959 980 N
+ AW R AW e n/a 6 943 959 980 N
+ AW R AW s n/a 6 943 959 980 N
+ AW R AY e n/a 6 943 959 979 N
+ AW R AY s n/a 6 943 959 979 N
+ AW R B b n/a 6 943 959 970 N
+ AW R B e n/a 6 943 959 970 N
+ AW R B i n/a 6 943 959 970 N
+ AW R B s n/a 6 943 959 970 N
+ AW R CH b n/a 6 943 959 971 N
+ AW R CH e n/a 6 943 959 971 N
+ AW R CH i n/a 6 943 959 971 N
+ AW R CH s n/a 6 943 959 971 N
+ AW R D b n/a 6 943 963 975 N
+ AW R D e n/a 6 943 963 975 N
+ AW R D i n/a 6 943 963 975 N
+ AW R D s n/a 6 943 963 975 N
+ AW R DH e n/a 6 943 963 970 N
+ AW R DH i n/a 6 943 963 970 N
+ AW R DH s n/a 6 943 963 970 N
+ AW R EH e n/a 6 943 959 979 N
+ AW R EH s n/a 6 943 959 979 N
+ AW R ER b n/a 6 943 959 981 N
+ AW R ER e n/a 6 943 959 981 N
+ AW R ER i n/a 6 943 959 981 N
+ AW R ER s n/a 6 943 959 981 N
+ AW R EY e n/a 6 943 959 979 N
+ AW R EY s n/a 6 943 959 979 N
+ AW R F b n/a 6 943 959 970 N
+ AW R F e n/a 6 943 959 970 N
+ AW R F i n/a 6 943 959 970 N
+ AW R F s n/a 6 943 959 970 N
+ AW R G b n/a 6 943 959 970 N
+ AW R G e n/a 6 943 959 970 N
+ AW R G i n/a 6 943 959 970 N
+ AW R G s n/a 6 943 959 970 N
+ AW R HH e n/a 6 943 959 970 N
+ AW R HH s n/a 6 943 959 970 N
+ AW R IH b n/a 6 943 959 979 N
+ AW R IH e n/a 6 943 959 979 N
+ AW R IH i n/a 6 943 959 979 N
+ AW R IH s n/a 6 943 959 979 N
+ AW R IY b n/a 6 943 959 979 N
+ AW R IY e n/a 6 943 959 979 N
+ AW R IY s n/a 6 943 959 979 N
+ AW R JH e n/a 6 943 959 971 N
+ AW R JH s n/a 6 943 959 971 N
+ AW R K b n/a 6 943 959 970 N
+ AW R K e n/a 6 943 959 970 N
+ AW R K i n/a 6 943 959 970 N
+ AW R K s n/a 6 943 959 970 N
+ AW R L b n/a 6 943 959 980 N
+ AW R L e n/a 6 943 959 980 N
+ AW R L i n/a 6 943 959 980 N
+ AW R L s n/a 6 943 959 980 N
+ AW R M b n/a 6 944 969 982 N
+ AW R M e n/a 6 944 969 983 N
+ AW R M i n/a 6 944 969 982 N
+ AW R M s n/a 6 944 969 982 N
+ AW R N b n/a 6 944 966 982 N
+ AW R N e n/a 6 944 966 983 N
+ AW R N i n/a 6 944 966 982 N
+ AW R N s n/a 6 944 966 982 N
+ AW R NG b n/a 6 944 969 982 N
+ AW R NG e n/a 6 944 969 983 N
+ AW R NG i n/a 6 944 969 982 N
+ AW R NG s n/a 6 944 969 982 N
+ AW R OW e n/a 6 943 959 980 N
+ AW R OW i n/a 6 943 959 980 N
+ AW R OW s n/a 6 943 959 980 N
+ AW R OY e n/a 6 943 959 979 N
+ AW R OY s n/a 6 943 959 979 N
+ AW R P b n/a 6 943 959 970 N
+ AW R P e n/a 6 943 959 970 N
+ AW R P s n/a 6 943 959 970 N
+ AW R R b n/a 6 943 959 981 N
+ AW R R e n/a 6 943 959 981 N
+ AW R R i n/a 6 943 959 981 N
+ AW R R s n/a 6 943 959 981 N
+ AW R S b n/a 6 943 963 971 N
+ AW R S e n/a 6 943 963 971 N
+ AW R S i n/a 6 943 963 971 N
+ AW R S s n/a 6 943 963 971 N
+ AW R SH b n/a 6 943 959 971 N
+ AW R SH e n/a 6 943 959 971 N
+ AW R SH i n/a 6 943 959 971 N
+ AW R SH s n/a 6 943 959 971 N
+ AW R SIL e n/a 6 943 959 976 N
+ AW R SIL s n/a 6 943 959 976 N
+ AW R T b n/a 6 943 963 974 N
+ AW R T e n/a 6 943 963 974 N
+ AW R T i n/a 6 943 963 974 N
+ AW R T s n/a 6 943 963 974 N
+ AW R TH b n/a 6 943 963 970 N
+ AW R TH e n/a 6 943 963 970 N
+ AW R TH i n/a 6 943 963 970 N
+ AW R TH s n/a 6 943 963 970 N
+ AW R UH e n/a 6 943 959 980 N
+ AW R UH s n/a 6 943 959 980 N
+ AW R UW b n/a 6 943 959 980 N
+ AW R UW e n/a 6 943 959 980 N
+ AW R UW s n/a 6 943 959 980 N
+ AW R V e n/a 6 943 959 970 N
+ AW R V s n/a 6 943 959 970 N
+ AW R W e n/a 6 943 959 980 N
+ AW R W i n/a 6 943 959 980 N
+ AW R W s n/a 6 943 959 980 N
+ AW R Y b n/a 6 943 959 977 N
+ AW R Y e n/a 6 943 959 977 N
+ AW R Y i n/a 6 943 959 979 N
+ AW R Y s n/a 6 943 959 977 N
+ AW R Z b n/a 6 943 963 972 N
+ AW R Z e n/a 6 943 963 972 N
+ AW R Z i n/a 6 943 963 972 N
+ AW R Z s n/a 6 943 963 972 N
+ AW R ZH e n/a 6 943 959 972 N
+ AW R ZH s n/a 6 943 959 972 N
+ AW S AA e n/a 6 951 959 980 N
+ AW S AA s n/a 6 951 959 980 N
+ AW S AE e n/a 6 951 959 979 N
+ AW S AE s n/a 6 951 959 979 N
+ AW S AH b n/a 6 951 959 979 N
+ AW S AH e n/a 6 951 959 979 N
+ AW S AH s n/a 6 951 959 979 N
+ AW S AO e n/a 6 951 959 980 N
+ AW S AO s n/a 6 951 959 980 N
+ AW S AW e n/a 6 951 959 980 N
+ AW S AW s n/a 6 951 959 980 N
+ AW S AY e n/a 6 951 959 979 N
+ AW S AY s n/a 6 951 959 979 N
+ AW S B b n/a 6 951 959 970 N
+ AW S B e n/a 6 951 959 970 N
+ AW S B s n/a 6 951 959 970 N
+ AW S CH b n/a 6 951 959 971 N
+ AW S CH e n/a 6 951 959 971 N
+ AW S CH i n/a 6 951 959 971 N
+ AW S CH s n/a 6 951 959 971 N
+ AW S D b n/a 6 951 964 975 N
+ AW S D e n/a 6 951 964 975 N
+ AW S D i n/a 6 951 964 975 N
+ AW S D s n/a 6 951 964 975 N
+ AW S DH e n/a 6 951 965 970 N
+ AW S DH s n/a 6 951 965 970 N
+ AW S EH e n/a 6 951 959 979 N
+ AW S EH s n/a 6 951 959 979 N
+ AW S ER b n/a 6 951 959 981 N
+ AW S ER e n/a 6 951 959 981 N
+ AW S ER i n/a 6 951 959 981 N
+ AW S ER s n/a 6 951 959 981 N
+ AW S EY e n/a 6 951 959 979 N
+ AW S EY s n/a 6 951 959 979 N
+ AW S F b n/a 6 951 959 970 N
+ AW S F e n/a 6 951 959 970 N
+ AW S F s n/a 6 951 959 970 N
+ AW S G b n/a 6 951 959 970 N
+ AW S G e n/a 6 951 959 970 N
+ AW S G s n/a 6 951 959 970 N
+ AW S HH e n/a 6 951 959 970 N
+ AW S HH s n/a 6 951 959 970 N
+ AW S IH b n/a 6 951 959 979 N
+ AW S IH e n/a 6 951 959 979 N
+ AW S IH i n/a 6 951 959 979 N
+ AW S IH s n/a 6 951 959 979 N
+ AW S IY b n/a 6 951 959 979 N
+ AW S IY e n/a 6 951 959 979 N
+ AW S IY i n/a 6 951 959 979 N
+ AW S IY s n/a 6 951 959 979 N
+ AW S JH e n/a 6 951 959 971 N
+ AW S JH s n/a 6 951 959 971 N
+ AW S K b n/a 6 951 959 970 N
+ AW S K e n/a 6 951 959 970 N
+ AW S K i n/a 6 951 959 970 N
+ AW S K s n/a 6 951 959 970 N
+ AW S L b n/a 6 951 959 980 N
+ AW S L e n/a 6 951 959 980 N
+ AW S L i n/a 6 951 959 980 N
+ AW S L s n/a 6 951 959 980 N
+ AW S M b n/a 6 953 969 982 N
+ AW S M e n/a 6 953 969 983 N
+ AW S M s n/a 6 953 969 982 N
+ AW S N b n/a 6 953 966 982 N
+ AW S N e n/a 6 953 966 983 N
+ AW S N i n/a 6 953 966 982 N
+ AW S N s n/a 6 953 966 982 N
+ AW S NG b n/a 6 953 969 982 N
+ AW S NG e n/a 6 953 969 983 N
+ AW S NG s n/a 6 953 969 982 N
+ AW S OW e n/a 6 951 959 980 N
+ AW S OW s n/a 6 951 959 980 N
+ AW S OY e n/a 6 951 959 979 N
+ AW S OY s n/a 6 951 959 979 N
+ AW S P b n/a 6 951 959 970 N
+ AW S P e n/a 6 951 959 970 N
+ AW S P s n/a 6 951 959 970 N
+ AW S R b n/a 6 951 959 981 N
+ AW S R e n/a 6 951 959 981 N
+ AW S R i n/a 6 951 959 981 N
+ AW S R s n/a 6 951 959 981 N
+ AW S S b n/a 6 951 965 971 N
+ AW S S e n/a 6 951 965 971 N
+ AW S S i n/a 6 951 965 971 N
+ AW S S s n/a 6 951 965 971 N
+ AW S SH b n/a 6 951 959 971 N
+ AW S SH e n/a 6 951 959 971 N
+ AW S SH s n/a 6 951 959 971 N
+ AW S SIL e n/a 6 951 959 976 N
+ AW S SIL s n/a 6 951 959 976 N
+ AW S T b n/a 6 951 964 974 N
+ AW S T e n/a 6 951 964 974 N
+ AW S T i n/a 6 951 964 974 N
+ AW S T s n/a 6 951 964 974 N
+ AW S TH b n/a 6 951 965 970 N
+ AW S TH e n/a 6 951 965 970 N
+ AW S TH i n/a 6 951 965 970 N
+ AW S TH s n/a 6 951 965 970 N
+ AW S UH e n/a 6 951 959 980 N
+ AW S UH s n/a 6 951 959 980 N
+ AW S UW b n/a 6 951 959 980 N
+ AW S UW e n/a 6 951 959 980 N
+ AW S UW s n/a 6 951 959 980 N
+ AW S V e n/a 6 951 959 970 N
+ AW S V s n/a 6 951 959 970 N
+ AW S W e n/a 6 951 959 980 N
+ AW S W s n/a 6 951 959 980 N
+ AW S Y b n/a 6 951 959 977 N
+ AW S Y e n/a 6 951 959 977 N
+ AW S Y i n/a 6 951 959 979 N
+ AW S Y s n/a 6 951 959 977 N
+ AW S Z b n/a 6 951 965 972 N
+ AW S Z e n/a 6 951 965 972 N
+ AW S Z s n/a 6 951 965 972 N
+ AW S ZH e n/a 6 951 959 972 N
+ AW S ZH s n/a 6 951 959 972 N
+ AW SH AA e n/a 6 937 959 980 N
+ AW SH AA s n/a 6 937 959 980 N
+ AW SH AE e n/a 6 937 959 979 N
+ AW SH AE s n/a 6 937 959 979 N
+ AW SH AH b n/a 6 937 959 979 N
+ AW SH AH e n/a 6 937 959 979 N
+ AW SH AH i n/a 6 937 959 979 N
+ AW SH AH s n/a 6 937 959 979 N
+ AW SH AO e n/a 6 937 959 980 N
+ AW SH AO s n/a 6 937 959 980 N
+ AW SH AW e n/a 6 937 959 980 N
+ AW SH AW s n/a 6 937 959 980 N
+ AW SH AY e n/a 6 937 959 979 N
+ AW SH AY s n/a 6 937 959 979 N
+ AW SH B b n/a 6 937 959 970 N
+ AW SH B e n/a 6 937 959 970 N
+ AW SH B i n/a 6 937 959 970 N
+ AW SH B s n/a 6 937 959 970 N
+ AW SH CH b n/a 6 937 959 971 N
+ AW SH CH e n/a 6 937 959 971 N
+ AW SH CH s n/a 6 937 959 971 N
+ AW SH D b n/a 6 951 964 975 N
+ AW SH D e n/a 6 951 964 975 N
+ AW SH D s n/a 6 951 964 975 N
+ AW SH DH e n/a 6 937 965 970 N
+ AW SH DH s n/a 6 937 965 970 N
+ AW SH EH e n/a 6 937 959 979 N
+ AW SH EH s n/a 6 937 959 979 N
+ AW SH ER b n/a 6 937 959 981 N
+ AW SH ER e n/a 6 937 959 981 N
+ AW SH ER i n/a 6 937 959 981 N
+ AW SH ER s n/a 6 937 959 981 N
+ AW SH EY e n/a 6 937 959 979 N
+ AW SH EY s n/a 6 937 959 979 N
+ AW SH F b n/a 6 937 959 970 N
+ AW SH F e n/a 6 937 959 970 N
+ AW SH F i n/a 6 937 959 970 N
+ AW SH F s n/a 6 937 959 970 N
+ AW SH G b n/a 6 937 959 970 N
+ AW SH G e n/a 6 937 959 970 N
+ AW SH G i n/a 6 937 959 970 N
+ AW SH G s n/a 6 937 959 970 N
+ AW SH HH e n/a 6 937 959 970 N
+ AW SH HH s n/a 6 937 959 970 N
+ AW SH IH b n/a 6 937 959 979 N
+ AW SH IH e n/a 6 937 959 979 N
+ AW SH IH s n/a 6 937 959 979 N
+ AW SH IY b n/a 6 937 959 979 N
+ AW SH IY e n/a 6 937 959 979 N
+ AW SH IY s n/a 6 937 959 979 N
+ AW SH JH e n/a 6 937 959 971 N
+ AW SH JH s n/a 6 937 959 971 N
+ AW SH K b n/a 6 937 959 970 N
+ AW SH K e n/a 6 937 959 970 N
+ AW SH K s n/a 6 937 959 970 N
+ AW SH L b n/a 6 937 959 980 N
+ AW SH L e n/a 6 937 959 980 N
+ AW SH L i n/a 6 937 959 980 N
+ AW SH L s n/a 6 937 959 980 N
+ AW SH M b n/a 6 937 969 982 N
+ AW SH M e n/a 6 937 969 983 N
+ AW SH M i n/a 6 937 969 982 N
+ AW SH M s n/a 6 937 969 982 N
+ AW SH N b n/a 6 953 966 982 N
+ AW SH N e n/a 6 953 966 983 N
+ AW SH N i n/a 6 953 966 982 N
+ AW SH N s n/a 6 953 966 982 N
+ AW SH NG b n/a 6 937 969 982 N
+ AW SH NG e n/a 6 937 969 983 N
+ AW SH NG s n/a 6 937 969 982 N
+ AW SH OW e n/a 6 937 959 980 N
+ AW SH OW s n/a 6 937 959 980 N
+ AW SH OY e n/a 6 937 959 979 N
+ AW SH OY s n/a 6 937 959 979 N
+ AW SH P b n/a 6 937 959 970 N
+ AW SH P e n/a 6 937 959 970 N
+ AW SH P i n/a 6 937 959 970 N
+ AW SH P s n/a 6 937 959 970 N
+ AW SH R b n/a 6 937 959 981 N
+ AW SH R e n/a 6 937 959 981 N
+ AW SH R i n/a 6 937 959 981 N
+ AW SH R s n/a 6 937 959 981 N
+ AW SH S b n/a 6 937 965 971 N
+ AW SH S e n/a 6 937 965 971 N
+ AW SH S s n/a 6 937 965 971 N
+ AW SH SH b n/a 6 937 959 971 N
+ AW SH SH e n/a 6 937 959 971 N
+ AW SH SH s n/a 6 937 959 971 N
+ AW SH SIL e n/a 6 937 959 976 N
+ AW SH SIL s n/a 6 937 959 976 N
+ AW SH T b n/a 6 951 964 974 N
+ AW SH T e n/a 6 951 964 974 N
+ AW SH T i n/a 6 951 964 974 N
+ AW SH T s n/a 6 951 964 974 N
+ AW SH TH b n/a 6 937 965 970 N
+ AW SH TH e n/a 6 937 965 970 N
+ AW SH TH s n/a 6 937 965 970 N
+ AW SH UH e n/a 6 937 959 980 N
+ AW SH UH s n/a 6 937 959 980 N
+ AW SH UW b n/a 6 937 959 980 N
+ AW SH UW e n/a 6 937 959 980 N
+ AW SH UW s n/a 6 937 959 980 N
+ AW SH V e n/a 6 937 959 970 N
+ AW SH V s n/a 6 937 959 970 N
+ AW SH W e n/a 6 937 959 980 N
+ AW SH W i n/a 6 937 959 980 N
+ AW SH W s n/a 6 937 959 980 N
+ AW SH Y b n/a 6 937 959 977 N
+ AW SH Y e n/a 6 937 959 977 N
+ AW SH Y i n/a 6 937 959 979 N
+ AW SH Y s n/a 6 937 959 977 N
+ AW SH Z b n/a 6 937 965 972 N
+ AW SH Z e n/a 6 937 965 972 N
+ AW SH Z s n/a 6 937 965 972 N
+ AW SH ZH e n/a 6 937 959 972 N
+ AW SH ZH s n/a 6 937 959 972 N
+ AW SIL AA s n/a 6 937 959 980 N
+ AW SIL AE s n/a 6 937 959 979 N
+ AW SIL AH b n/a 6 937 959 979 N
+ AW SIL AH s n/a 6 937 959 979 N
+ AW SIL AO s n/a 6 937 959 980 N
+ AW SIL AW s n/a 6 937 959 980 N
+ AW SIL AY s n/a 6 937 959 979 N
+ AW SIL B b n/a 6 937 959 970 N
+ AW SIL B s n/a 6 937 959 970 N
+ AW SIL CH b n/a 6 937 959 971 N
+ AW SIL CH s n/a 6 937 959 971 N
+ AW SIL D b n/a 6 946 965 975 N
+ AW SIL D s n/a 6 946 965 975 N
+ AW SIL DH s n/a 6 937 965 970 N
+ AW SIL EH s n/a 6 937 959 979 N
+ AW SIL ER b n/a 6 937 959 981 N
+ AW SIL ER s n/a 6 937 959 981 N
+ AW SIL EY s n/a 6 937 959 979 N
+ AW SIL F b n/a 6 937 959 970 N
+ AW SIL F s n/a 6 937 959 970 N
+ AW SIL G b n/a 6 937 959 970 N
+ AW SIL G s n/a 6 937 959 970 N
+ AW SIL HH s n/a 6 937 959 970 N
+ AW SIL IH b n/a 6 937 959 979 N
+ AW SIL IH s n/a 6 937 959 979 N
+ AW SIL IY b n/a 6 937 959 979 N
+ AW SIL IY s n/a 6 937 959 979 N
+ AW SIL JH s n/a 6 937 959 971 N
+ AW SIL K b n/a 6 937 959 970 N
+ AW SIL K s n/a 6 937 959 970 N
+ AW SIL L b n/a 6 937 959 980 N
+ AW SIL L s n/a 6 937 959 980 N
+ AW SIL M b n/a 6 937 969 982 N
+ AW SIL M s n/a 6 937 969 982 N
+ AW SIL N b n/a 6 947 966 982 N
+ AW SIL N s n/a 6 947 966 982 N
+ AW SIL NG b n/a 6 937 969 982 N
+ AW SIL NG s n/a 6 937 969 982 N
+ AW SIL OW s n/a 6 937 959 980 N
+ AW SIL OY s n/a 6 937 959 979 N
+ AW SIL P b n/a 6 937 959 970 N
+ AW SIL P s n/a 6 937 959 970 N
+ AW SIL R b n/a 6 937 959 981 N
+ AW SIL R s n/a 6 937 959 981 N
+ AW SIL S b n/a 6 937 965 971 N
+ AW SIL S s n/a 6 937 965 971 N
+ AW SIL SH b n/a 6 937 959 971 N
+ AW SIL SH s n/a 6 937 959 971 N
+ AW SIL SIL s n/a 6 937 959 976 N
+ AW SIL T b n/a 6 946 965 974 N
+ AW SIL T s n/a 6 946 965 974 N
+ AW SIL TH b n/a 6 937 965 970 N
+ AW SIL TH s n/a 6 937 965 970 N
+ AW SIL UH s n/a 6 937 959 980 N
+ AW SIL UW b n/a 6 937 959 980 N
+ AW SIL UW s n/a 6 937 959 980 N
+ AW SIL V s n/a 6 937 959 970 N
+ AW SIL W s n/a 6 937 959 980 N
+ AW SIL Y b n/a 6 937 959 977 N
+ AW SIL Y s n/a 6 937 959 977 N
+ AW SIL Z b n/a 6 937 965 972 N
+ AW SIL Z s n/a 6 937 965 972 N
+ AW SIL ZH s n/a 6 937 959 972 N
+ AW T AA e n/a 6 947 959 980 N
+ AW T AA s n/a 6 947 959 980 N
+ AW T AE e n/a 6 947 959 979 N
+ AW T AE s n/a 6 947 959 979 N
+ AW T AH b n/a 6 947 959 979 N
+ AW T AH e n/a 6 947 959 979 N
+ AW T AH i n/a 6 948 959 979 N
+ AW T AH s n/a 6 947 959 979 N
+ AW T AO e n/a 6 947 959 980 N
+ AW T AO s n/a 6 947 959 980 N
+ AW T AW e n/a 6 947 959 980 N
+ AW T AW s n/a 6 947 959 980 N
+ AW T AY e n/a 6 947 959 979 N
+ AW T AY s n/a 6 947 959 979 N
+ AW T B b n/a 6 948 959 970 N
+ AW T B e n/a 6 948 959 970 N
+ AW T B i n/a 6 948 959 970 N
+ AW T B s n/a 6 948 959 970 N
+ AW T CH b n/a 6 945 959 971 N
+ AW T CH e n/a 6 945 959 971 N
+ AW T CH s n/a 6 945 959 971 N
+ AW T D b n/a 6 948 964 975 N
+ AW T D e n/a 6 948 964 975 N
+ AW T D i n/a 6 948 964 975 N
+ AW T D s n/a 6 948 964 975 N
+ AW T DH e n/a 6 947 965 970 N
+ AW T DH s n/a 6 947 965 970 N
+ AW T EH e n/a 6 947 959 979 N
+ AW T EH s n/a 6 947 959 979 N
+ AW T ER b n/a 6 947 959 981 N
+ AW T ER e n/a 6 947 959 981 N
+ AW T ER i n/a 6 948 959 981 N
+ AW T ER s n/a 6 947 959 981 N
+ AW T EY e n/a 6 947 959 979 N
+ AW T EY s n/a 6 947 959 979 N
+ AW T F b n/a 6 945 959 970 N
+ AW T F e n/a 6 945 959 970 N
+ AW T F i n/a 6 945 959 970 N
+ AW T F s n/a 6 945 959 970 N
+ AW T G b n/a 6 948 959 970 N
+ AW T G e n/a 6 948 959 970 N
+ AW T G s n/a 6 948 959 970 N
+ AW T HH e n/a 6 945 959 970 N
+ AW T HH s n/a 6 945 959 970 N
+ AW T IH b n/a 6 947 959 979 N
+ AW T IH e n/a 6 947 959 979 N
+ AW T IH s n/a 6 947 959 979 N
+ AW T IY b n/a 6 947 959 979 N
+ AW T IY e n/a 6 947 959 979 N
+ AW T IY s n/a 6 947 959 979 N
+ AW T JH e n/a 6 948 959 971 N
+ AW T JH s n/a 6 948 959 971 N
+ AW T K b n/a 6 945 959 970 N
+ AW T K e n/a 6 945 959 970 N
+ AW T K i n/a 6 945 959 970 N
+ AW T K s n/a 6 945 959 970 N
+ AW T L b n/a 6 947 959 980 N
+ AW T L e n/a 6 947 959 980 N
+ AW T L i n/a 6 948 959 980 N
+ AW T L s n/a 6 947 959 980 N
+ AW T M b n/a 6 947 969 982 N
+ AW T M e n/a 6 947 969 983 N
+ AW T M s n/a 6 947 969 982 N
+ AW T N b n/a 6 947 966 982 N
+ AW T N e n/a 6 947 966 983 N
+ AW T N i n/a 6 947 966 982 N
+ AW T N s n/a 6 947 966 982 N
+ AW T NG b n/a 6 947 969 982 N
+ AW T NG e n/a 6 947 969 983 N
+ AW T NG s n/a 6 947 969 982 N
+ AW T OW e n/a 6 947 959 980 N
+ AW T OW s n/a 6 947 959 980 N
+ AW T OY e n/a 6 947 959 979 N
+ AW T OY s n/a 6 947 959 979 N
+ AW T P b n/a 6 945 959 970 N
+ AW T P e n/a 6 945 959 970 N
+ AW T P s n/a 6 945 959 970 N
+ AW T R b n/a 6 947 959 981 N
+ AW T R e n/a 6 947 959 981 N
+ AW T R i n/a 6 948 959 981 N
+ AW T R s n/a 6 947 959 981 N
+ AW T S b n/a 6 945 965 971 N
+ AW T S e n/a 6 945 965 971 N
+ AW T S i n/a 6 945 965 971 N
+ AW T S s n/a 6 945 965 971 N
+ AW T SH b n/a 6 945 959 971 N
+ AW T SH e n/a 6 945 959 971 N
+ AW T SH i n/a 6 945 959 971 N
+ AW T SH s n/a 6 945 959 971 N
+ AW T SIL e n/a 6 945 959 976 N
+ AW T SIL s n/a 6 945 959 976 N
+ AW T T b n/a 6 945 964 974 N
+ AW T T e n/a 6 945 964 974 N
+ AW T T i n/a 6 945 964 974 N
+ AW T T s n/a 6 945 964 974 N
+ AW T TH b n/a 6 945 965 970 N
+ AW T TH e n/a 6 945 965 970 N
+ AW T TH s n/a 6 945 965 970 N
+ AW T UH e n/a 6 947 959 980 N
+ AW T UH s n/a 6 947 959 980 N
+ AW T UW b n/a 6 947 959 980 N
+ AW T UW e n/a 6 947 959 980 N
+ AW T UW s n/a 6 947 959 980 N
+ AW T V e n/a 6 947 959 970 N
+ AW T V s n/a 6 947 959 970 N
+ AW T W e n/a 6 947 959 980 N
+ AW T W s n/a 6 947 959 980 N
+ AW T Y b n/a 6 947 959 977 N
+ AW T Y e n/a 6 947 959 977 N
+ AW T Y s n/a 6 947 959 977 N
+ AW T Z b n/a 6 947 965 972 N
+ AW T Z e n/a 6 947 965 972 N
+ AW T Z i n/a 6 948 965 972 N
+ AW T Z s n/a 6 947 965 972 N
+ AW T ZH e n/a 6 947 959 972 N
+ AW T ZH s n/a 6 947 959 972 N
+ AW TH AA e n/a 6 951 959 980 N
+ AW TH AA s n/a 6 951 959 980 N
+ AW TH AE e n/a 6 951 959 979 N
+ AW TH AE s n/a 6 951 959 979 N
+ AW TH AH b n/a 6 951 959 979 N
+ AW TH AH e n/a 6 951 959 979 N
+ AW TH AH s n/a 6 951 959 979 N
+ AW TH AO e n/a 6 951 959 980 N
+ AW TH AO s n/a 6 951 959 980 N
+ AW TH AW e n/a 6 951 959 980 N
+ AW TH AW s n/a 6 951 959 980 N
+ AW TH AY e n/a 6 951 959 979 N
+ AW TH AY s n/a 6 951 959 979 N
+ AW TH B b n/a 6 951 959 970 N
+ AW TH B e n/a 6 951 959 970 N
+ AW TH B s n/a 6 951 959 970 N
+ AW TH CH b n/a 6 951 959 971 N
+ AW TH CH e n/a 6 951 959 971 N
+ AW TH CH s n/a 6 951 959 971 N
+ AW TH D b n/a 6 951 964 975 N
+ AW TH D e n/a 6 951 964 975 N
+ AW TH D s n/a 6 951 964 975 N
+ AW TH DH e n/a 6 951 965 970 N
+ AW TH DH s n/a 6 951 965 970 N
+ AW TH EH e n/a 6 951 959 979 N
+ AW TH EH s n/a 6 951 959 979 N
+ AW TH ER b n/a 6 951 959 981 N
+ AW TH ER e n/a 6 951 959 981 N
+ AW TH ER i n/a 6 951 959 981 N
+ AW TH ER s n/a 6 951 959 981 N
+ AW TH EY e n/a 6 951 959 979 N
+ AW TH EY s n/a 6 951 959 979 N
+ AW TH F b n/a 6 951 959 970 N
+ AW TH F e n/a 6 951 959 970 N
+ AW TH F s n/a 6 951 959 970 N
+ AW TH G b n/a 6 951 959 970 N
+ AW TH G e n/a 6 951 959 970 N
+ AW TH G s n/a 6 951 959 970 N
+ AW TH HH e n/a 6 951 959 970 N
+ AW TH HH s n/a 6 951 959 970 N
+ AW TH IH b n/a 6 951 959 979 N
+ AW TH IH e n/a 6 951 959 979 N
+ AW TH IH s n/a 6 951 959 979 N
+ AW TH IY b n/a 6 951 959 979 N
+ AW TH IY e n/a 6 951 959 979 N
+ AW TH IY s n/a 6 951 959 979 N
+ AW TH JH e n/a 6 951 959 971 N
+ AW TH JH s n/a 6 951 959 971 N
+ AW TH K b n/a 6 951 959 970 N
+ AW TH K e n/a 6 951 959 970 N
+ AW TH K s n/a 6 951 959 970 N
+ AW TH L b n/a 6 951 959 980 N
+ AW TH L e n/a 6 951 959 980 N
+ AW TH L s n/a 6 951 959 980 N
+ AW TH M b n/a 6 953 969 982 N
+ AW TH M e n/a 6 953 969 983 N
+ AW TH M i n/a 6 953 969 982 N
+ AW TH M s n/a 6 953 969 982 N
+ AW TH N b n/a 6 953 966 982 N
+ AW TH N e n/a 6 953 966 983 N
+ AW TH N s n/a 6 953 966 982 N
+ AW TH NG b n/a 6 953 969 982 N
+ AW TH NG e n/a 6 953 969 983 N
+ AW TH NG s n/a 6 953 969 982 N
+ AW TH OW e n/a 6 951 959 980 N
+ AW TH OW s n/a 6 951 959 980 N
+ AW TH OY e n/a 6 951 959 979 N
+ AW TH OY s n/a 6 951 959 979 N
+ AW TH P b n/a 6 951 959 970 N
+ AW TH P e n/a 6 951 959 970 N
+ AW TH P i n/a 6 951 959 970 N
+ AW TH P s n/a 6 951 959 970 N
+ AW TH R b n/a 6 951 959 981 N
+ AW TH R e n/a 6 951 959 981 N
+ AW TH R s n/a 6 951 959 981 N
+ AW TH S b n/a 6 951 965 971 N
+ AW TH S e n/a 6 951 965 971 N
+ AW TH S s n/a 6 951 965 971 N
+ AW TH SH b n/a 6 951 959 971 N
+ AW TH SH e n/a 6 951 959 971 N
+ AW TH SH s n/a 6 951 959 971 N
+ AW TH SIL e n/a 6 951 959 976 N
+ AW TH SIL s n/a 6 951 959 976 N
+ AW TH T b n/a 6 951 964 974 N
+ AW TH T e n/a 6 951 964 974 N
+ AW TH T i n/a 6 951 964 974 N
+ AW TH T s n/a 6 951 964 974 N
+ AW TH TH b n/a 6 951 965 970 N
+ AW TH TH e n/a 6 951 965 970 N
+ AW TH TH s n/a 6 951 965 970 N
+ AW TH UH e n/a 6 951 959 980 N
+ AW TH UH s n/a 6 951 959 980 N
+ AW TH UW b n/a 6 951 959 980 N
+ AW TH UW e n/a 6 951 959 980 N
+ AW TH UW s n/a 6 951 959 980 N
+ AW TH V e n/a 6 951 959 970 N
+ AW TH V s n/a 6 951 959 970 N
+ AW TH W e n/a 6 951 959 980 N
+ AW TH W s n/a 6 951 959 980 N
+ AW TH Y b n/a 6 951 959 977 N
+ AW TH Y e n/a 6 951 959 977 N
+ AW TH Y s n/a 6 951 959 977 N
+ AW TH Z b n/a 6 951 965 972 N
+ AW TH Z e n/a 6 951 965 972 N
+ AW TH Z i n/a 6 951 965 972 N
+ AW TH Z s n/a 6 951 965 972 N
+ AW TH ZH e n/a 6 951 959 972 N
+ AW TH ZH s n/a 6 951 959 972 N
+ AW UH AA s n/a 6 942 959 980 N
+ AW UH AE s n/a 6 942 959 979 N
+ AW UH AH b n/a 6 942 959 979 N
+ AW UH AH s n/a 6 942 959 979 N
+ AW UH AO s n/a 6 942 959 980 N
+ AW UH AW s n/a 6 942 959 980 N
+ AW UH AY s n/a 6 942 959 979 N
+ AW UH B b n/a 6 942 959 970 N
+ AW UH B s n/a 6 942 959 970 N
+ AW UH CH b n/a 6 942 959 971 N
+ AW UH CH s n/a 6 942 959 971 N
+ AW UH D b n/a 6 942 963 975 N
+ AW UH D s n/a 6 942 963 975 N
+ AW UH DH s n/a 6 942 963 970 N
+ AW UH EH s n/a 6 942 959 979 N
+ AW UH ER b n/a 6 942 959 981 N
+ AW UH ER s n/a 6 942 959 981 N
+ AW UH EY s n/a 6 942 959 979 N
+ AW UH F b n/a 6 942 959 970 N
+ AW UH F s n/a 6 942 959 970 N
+ AW UH G b n/a 6 942 959 970 N
+ AW UH G s n/a 6 942 959 970 N
+ AW UH HH s n/a 6 942 959 970 N
+ AW UH IH b n/a 6 942 959 979 N
+ AW UH IH s n/a 6 942 959 979 N
+ AW UH IY b n/a 6 942 959 979 N
+ AW UH IY s n/a 6 942 959 979 N
+ AW UH JH s n/a 6 942 959 971 N
+ AW UH K b n/a 6 942 959 970 N
+ AW UH K s n/a 6 942 959 970 N
+ AW UH L b n/a 6 942 959 980 N
+ AW UH L s n/a 6 942 959 980 N
+ AW UH M b n/a 6 942 969 982 N
+ AW UH M s n/a 6 942 969 982 N
+ AW UH N b n/a 6 942 966 982 N
+ AW UH N s n/a 6 942 966 982 N
+ AW UH NG b n/a 6 942 969 982 N
+ AW UH NG s n/a 6 942 969 982 N
+ AW UH OW s n/a 6 942 959 980 N
+ AW UH OY s n/a 6 942 959 979 N
+ AW UH P b n/a 6 942 959 970 N
+ AW UH P s n/a 6 942 959 970 N
+ AW UH R b n/a 6 942 959 981 N
+ AW UH R s n/a 6 942 959 981 N
+ AW UH S b n/a 6 942 963 971 N
+ AW UH S s n/a 6 942 963 971 N
+ AW UH SH b n/a 6 942 959 971 N
+ AW UH SH s n/a 6 942 959 971 N
+ AW UH SIL s n/a 6 942 959 976 N
+ AW UH T b n/a 6 942 963 974 N
+ AW UH T s n/a 6 942 963 974 N
+ AW UH TH b n/a 6 942 963 970 N
+ AW UH TH s n/a 6 942 963 970 N
+ AW UH UH s n/a 6 942 959 980 N
+ AW UH UW b n/a 6 942 959 980 N
+ AW UH UW s n/a 6 942 959 980 N
+ AW UH V s n/a 6 942 959 970 N
+ AW UH W s n/a 6 942 959 980 N
+ AW UH Y b n/a 6 942 959 977 N
+ AW UH Y s n/a 6 942 959 977 N
+ AW UH Z b n/a 6 942 963 972 N
+ AW UH Z s n/a 6 942 963 972 N
+ AW UH ZH s n/a 6 942 959 972 N
+ AW UW AA e n/a 6 942 959 980 N
+ AW UW AA s n/a 6 942 959 980 N
+ AW UW AE e n/a 6 942 959 979 N
+ AW UW AE s n/a 6 942 959 979 N
+ AW UW AH b n/a 6 942 959 979 N
+ AW UW AH e n/a 6 942 959 979 N
+ AW UW AH s n/a 6 942 959 979 N
+ AW UW AO e n/a 6 942 959 980 N
+ AW UW AO s n/a 6 942 959 980 N
+ AW UW AW e n/a 6 942 959 980 N
+ AW UW AW s n/a 6 942 959 980 N
+ AW UW AY e n/a 6 942 959 979 N
+ AW UW AY s n/a 6 942 959 979 N
+ AW UW B b n/a 6 942 959 970 N
+ AW UW B e n/a 6 942 959 970 N
+ AW UW B s n/a 6 942 959 970 N
+ AW UW CH b n/a 6 942 959 971 N
+ AW UW CH e n/a 6 942 959 971 N
+ AW UW CH s n/a 6 942 959 971 N
+ AW UW D b n/a 6 942 963 975 N
+ AW UW D e n/a 6 942 963 975 N
+ AW UW D s n/a 6 942 963 975 N
+ AW UW DH e n/a 6 942 963 970 N
+ AW UW DH s n/a 6 942 963 970 N
+ AW UW EH e n/a 6 942 959 979 N
+ AW UW EH s n/a 6 942 959 979 N
+ AW UW ER b n/a 6 942 959 981 N
+ AW UW ER e n/a 6 942 959 981 N
+ AW UW ER s n/a 6 942 959 981 N
+ AW UW EY e n/a 6 942 959 979 N
+ AW UW EY s n/a 6 942 959 979 N
+ AW UW F b n/a 6 942 959 970 N
+ AW UW F e n/a 6 942 959 970 N
+ AW UW F s n/a 6 942 959 970 N
+ AW UW G b n/a 6 942 959 970 N
+ AW UW G e n/a 6 942 959 970 N
+ AW UW G s n/a 6 942 959 970 N
+ AW UW HH e n/a 6 942 959 970 N
+ AW UW HH s n/a 6 942 959 970 N
+ AW UW IH b n/a 6 942 959 979 N
+ AW UW IH e n/a 6 942 959 979 N
+ AW UW IH s n/a 6 942 959 979 N
+ AW UW IY b n/a 6 942 959 979 N
+ AW UW IY e n/a 6 942 959 979 N
+ AW UW IY s n/a 6 942 959 979 N
+ AW UW JH e n/a 6 942 959 971 N
+ AW UW JH s n/a 6 942 959 971 N
+ AW UW K b n/a 6 942 959 970 N
+ AW UW K e n/a 6 942 959 970 N
+ AW UW K s n/a 6 942 959 970 N
+ AW UW L b n/a 6 942 959 980 N
+ AW UW L e n/a 6 942 959 980 N
+ AW UW L s n/a 6 942 959 980 N
+ AW UW M b n/a 6 942 969 982 N
+ AW UW M e n/a 6 942 969 983 N
+ AW UW M s n/a 6 942 969 982 N
+ AW UW N b n/a 6 942 966 982 N
+ AW UW N e n/a 6 942 966 983 N
+ AW UW N s n/a 6 942 966 982 N
+ AW UW NG b n/a 6 942 969 982 N
+ AW UW NG e n/a 6 942 969 983 N
+ AW UW NG s n/a 6 942 969 982 N
+ AW UW OW e n/a 6 942 959 980 N
+ AW UW OW s n/a 6 942 959 980 N
+ AW UW OY e n/a 6 942 959 979 N
+ AW UW OY s n/a 6 942 959 979 N
+ AW UW P b n/a 6 942 959 970 N
+ AW UW P e n/a 6 942 959 970 N
+ AW UW P s n/a 6 942 959 970 N
+ AW UW R b n/a 6 942 959 981 N
+ AW UW R e n/a 6 942 959 981 N
+ AW UW R s n/a 6 942 959 981 N
+ AW UW S b n/a 6 942 963 971 N
+ AW UW S e n/a 6 942 963 971 N
+ AW UW S s n/a 6 942 963 971 N
+ AW UW SH b n/a 6 942 959 971 N
+ AW UW SH e n/a 6 942 959 971 N
+ AW UW SH s n/a 6 942 959 971 N
+ AW UW SIL e n/a 6 942 959 976 N
+ AW UW SIL s n/a 6 942 959 976 N
+ AW UW T b n/a 6 942 963 974 N
+ AW UW T e n/a 6 942 963 974 N
+ AW UW T i n/a 6 942 963 974 N
+ AW UW T s n/a 6 942 963 974 N
+ AW UW TH b n/a 6 942 963 970 N
+ AW UW TH e n/a 6 942 963 970 N
+ AW UW TH s n/a 6 942 963 970 N
+ AW UW UH e n/a 6 942 959 980 N
+ AW UW UH s n/a 6 942 959 980 N
+ AW UW UW b n/a 6 942 959 980 N
+ AW UW UW e n/a 6 942 959 980 N
+ AW UW UW s n/a 6 942 959 980 N
+ AW UW V e n/a 6 942 959 970 N
+ AW UW V s n/a 6 942 959 970 N
+ AW UW W e n/a 6 942 959 980 N
+ AW UW W s n/a 6 942 959 980 N
+ AW UW Y b n/a 6 942 959 977 N
+ AW UW Y e n/a 6 942 959 977 N
+ AW UW Y s n/a 6 942 959 977 N
+ AW UW Z b n/a 6 942 963 972 N
+ AW UW Z e n/a 6 942 963 972 N
+ AW UW Z s n/a 6 942 963 972 N
+ AW UW ZH e n/a 6 942 959 972 N
+ AW UW ZH s n/a 6 942 959 972 N
+ AW V AA e n/a 6 952 959 980 N
+ AW V AA s n/a 6 952 959 980 N
+ AW V AE e n/a 6 952 959 979 N
+ AW V AE s n/a 6 952 959 979 N
+ AW V AH b n/a 6 952 959 979 N
+ AW V AH e n/a 6 952 959 979 N
+ AW V AH i n/a 6 952 959 979 N
+ AW V AH s n/a 6 952 959 979 N
+ AW V AO e n/a 6 952 959 980 N
+ AW V AO s n/a 6 952 959 980 N
+ AW V AW e n/a 6 952 959 980 N
+ AW V AW s n/a 6 952 959 980 N
+ AW V AY e n/a 6 952 959 979 N
+ AW V AY s n/a 6 952 959 979 N
+ AW V B b n/a 6 952 959 970 N
+ AW V B e n/a 6 952 959 970 N
+ AW V B s n/a 6 952 959 970 N
+ AW V CH b n/a 6 952 959 971 N
+ AW V CH e n/a 6 952 959 971 N
+ AW V CH i n/a 6 952 959 971 N
+ AW V CH s n/a 6 952 959 971 N
+ AW V D b n/a 6 952 963 975 N
+ AW V D e n/a 6 952 963 975 N
+ AW V D i n/a 6 952 963 975 N
+ AW V D s n/a 6 952 963 975 N
+ AW V DH e n/a 6 952 963 970 N
+ AW V DH s n/a 6 952 963 970 N
+ AW V EH e n/a 6 952 959 979 N
+ AW V EH s n/a 6 952 959 979 N
+ AW V ER b n/a 6 952 959 981 N
+ AW V ER e n/a 6 952 959 981 N
+ AW V ER i n/a 6 952 959 981 N
+ AW V ER s n/a 6 952 959 981 N
+ AW V EY e n/a 6 952 959 979 N
+ AW V EY s n/a 6 952 959 979 N
+ AW V F b n/a 6 952 959 970 N
+ AW V F e n/a 6 952 959 970 N
+ AW V F s n/a 6 952 959 970 N
+ AW V G b n/a 6 952 959 970 N
+ AW V G e n/a 6 952 959 970 N
+ AW V G s n/a 6 952 959 970 N
+ AW V HH e n/a 6 952 959 970 N
+ AW V HH s n/a 6 952 959 970 N
+ AW V IH b n/a 6 952 959 979 N
+ AW V IH e n/a 6 952 959 979 N
+ AW V IH i n/a 6 952 959 979 N
+ AW V IH s n/a 6 952 959 979 N
+ AW V IY b n/a 6 952 959 979 N
+ AW V IY e n/a 6 952 959 979 N
+ AW V IY s n/a 6 952 959 979 N
+ AW V JH e n/a 6 952 959 971 N
+ AW V JH s n/a 6 952 959 971 N
+ AW V K b n/a 6 952 959 970 N
+ AW V K e n/a 6 952 959 970 N
+ AW V K i n/a 6 952 959 970 N
+ AW V K s n/a 6 952 959 970 N
+ AW V L b n/a 6 952 959 980 N
+ AW V L e n/a 6 952 959 980 N
+ AW V L i n/a 6 952 959 980 N
+ AW V L s n/a 6 952 959 980 N
+ AW V M b n/a 6 953 969 982 N
+ AW V M e n/a 6 953 969 983 N
+ AW V M s n/a 6 953 969 982 N
+ AW V N b n/a 6 953 966 982 N
+ AW V N e n/a 6 953 966 983 N
+ AW V N s n/a 6 953 966 982 N
+ AW V NG b n/a 6 953 969 982 N
+ AW V NG e n/a 6 953 969 983 N
+ AW V NG s n/a 6 953 969 982 N
+ AW V OW e n/a 6 952 959 980 N
+ AW V OW s n/a 6 952 959 980 N
+ AW V OY e n/a 6 952 959 979 N
+ AW V OY s n/a 6 952 959 979 N
+ AW V P b n/a 6 952 959 970 N
+ AW V P e n/a 6 952 959 970 N
+ AW V P i n/a 6 952 959 970 N
+ AW V P s n/a 6 952 959 970 N
+ AW V R b n/a 6 952 959 981 N
+ AW V R e n/a 6 952 959 981 N
+ AW V R i n/a 6 952 959 981 N
+ AW V R s n/a 6 952 959 981 N
+ AW V S b n/a 6 952 963 971 N
+ AW V S e n/a 6 952 963 971 N
+ AW V S i n/a 6 952 963 971 N
+ AW V S s n/a 6 952 963 971 N
+ AW V SH b n/a 6 952 959 971 N
+ AW V SH e n/a 6 952 959 971 N
+ AW V SH s n/a 6 952 959 971 N
+ AW V SIL e n/a 6 952 959 976 N
+ AW V SIL s n/a 6 952 959 976 N
+ AW V T b n/a 6 952 963 974 N
+ AW V T e n/a 6 952 963 974 N
+ AW V T i n/a 6 952 963 974 N
+ AW V T s n/a 6 952 963 974 N
+ AW V TH b n/a 6 952 963 970 N
+ AW V TH e n/a 6 952 963 970 N
+ AW V TH s n/a 6 952 963 970 N
+ AW V UH e n/a 6 952 959 980 N
+ AW V UH s n/a 6 952 959 980 N
+ AW V UW b n/a 6 952 959 980 N
+ AW V UW e n/a 6 952 959 980 N
+ AW V UW s n/a 6 952 959 980 N
+ AW V V e n/a 6 952 959 970 N
+ AW V V s n/a 6 952 959 970 N
+ AW V W e n/a 6 952 959 980 N
+ AW V W s n/a 6 952 959 980 N
+ AW V Y b n/a 6 952 959 977 N
+ AW V Y e n/a 6 952 959 977 N
+ AW V Y s n/a 6 952 959 977 N
+ AW V Z b n/a 6 952 963 972 N
+ AW V Z e n/a 6 952 963 972 N
+ AW V Z i n/a 6 952 963 972 N
+ AW V Z s n/a 6 952 963 972 N
+ AW V ZH e n/a 6 952 959 972 N
+ AW V ZH s n/a 6 952 959 972 N
+ AW W AA e n/a 6 942 959 980 N
+ AW W AA s n/a 6 942 959 980 N
+ AW W AE e n/a 6 942 959 979 N
+ AW W AE s n/a 6 942 959 979 N
+ AW W AH b n/a 6 942 959 979 N
+ AW W AH e n/a 6 942 959 979 N
+ AW W AH s n/a 6 942 959 979 N
+ AW W AO e n/a 6 942 959 980 N
+ AW W AO s n/a 6 942 959 980 N
+ AW W AW e n/a 6 942 959 980 N
+ AW W AW s n/a 6 942 959 980 N
+ AW W AY e n/a 6 942 959 979 N
+ AW W AY s n/a 6 942 959 979 N
+ AW W B b n/a 6 942 959 970 N
+ AW W B e n/a 6 942 959 970 N
+ AW W B s n/a 6 942 959 970 N
+ AW W CH b n/a 6 942 959 971 N
+ AW W CH e n/a 6 942 959 971 N
+ AW W CH s n/a 6 942 959 971 N
+ AW W D b n/a 6 942 963 975 N
+ AW W D e n/a 6 942 963 975 N
+ AW W D i n/a 6 942 963 975 N
+ AW W D s n/a 6 942 963 975 N
+ AW W DH e n/a 6 942 963 970 N
+ AW W DH s n/a 6 942 963 970 N
+ AW W EH e n/a 6 942 959 979 N
+ AW W EH s n/a 6 942 959 979 N
+ AW W ER b n/a 6 942 959 981 N
+ AW W ER e n/a 6 942 959 981 N
+ AW W ER s n/a 6 942 959 981 N
+ AW W EY e n/a 6 942 959 979 N
+ AW W EY s n/a 6 942 959 979 N
+ AW W F b n/a 6 942 959 970 N
+ AW W F e n/a 6 942 959 970 N
+ AW W F s n/a 6 942 959 970 N
+ AW W G b n/a 6 942 959 970 N
+ AW W G e n/a 6 942 959 970 N
+ AW W G i n/a 6 942 959 970 N
+ AW W G s n/a 6 942 959 970 N
+ AW W HH e n/a 6 942 959 970 N
+ AW W HH s n/a 6 942 959 970 N
+ AW W IH b n/a 6 942 959 979 N
+ AW W IH e n/a 6 942 959 979 N
+ AW W IH i n/a 6 942 959 979 N
+ AW W IH s n/a 6 942 959 979 N
+ AW W IY b n/a 6 942 959 979 N
+ AW W IY e n/a 6 942 959 979 N
+ AW W IY i n/a 6 942 959 979 N
+ AW W IY s n/a 6 942 959 979 N
+ AW W JH e n/a 6 942 959 971 N
+ AW W JH s n/a 6 942 959 971 N
+ AW W K b n/a 6 942 959 970 N
+ AW W K e n/a 6 942 959 970 N
+ AW W K s n/a 6 942 959 970 N
+ AW W L b n/a 6 942 959 980 N
+ AW W L e n/a 6 942 959 980 N
+ AW W L i n/a 6 942 959 980 N
+ AW W L s n/a 6 942 959 980 N
+ AW W M b n/a 6 942 969 982 N
+ AW W M e n/a 6 942 969 983 N
+ AW W M s n/a 6 942 969 982 N
+ AW W N b n/a 6 942 966 982 N
+ AW W N e n/a 6 942 966 983 N
+ AW W N i n/a 6 942 966 982 N
+ AW W N s n/a 6 942 966 982 N
+ AW W NG b n/a 6 942 969 982 N
+ AW W NG e n/a 6 942 969 983 N
+ AW W NG s n/a 6 942 969 982 N
+ AW W OW e n/a 6 942 959 980 N
+ AW W OW s n/a 6 942 959 980 N
+ AW W OY e n/a 6 942 959 979 N
+ AW W OY s n/a 6 942 959 979 N
+ AW W P b n/a 6 942 959 970 N
+ AW W P e n/a 6 942 959 970 N
+ AW W P s n/a 6 942 959 970 N
+ AW W R b n/a 6 942 959 981 N
+ AW W R e n/a 6 942 959 981 N
+ AW W R s n/a 6 942 959 981 N
+ AW W S b n/a 6 942 963 971 N
+ AW W S e n/a 6 942 963 971 N
+ AW W S s n/a 6 942 963 971 N
+ AW W SH b n/a 6 942 959 971 N
+ AW W SH e n/a 6 942 959 971 N
+ AW W SH s n/a 6 942 959 971 N
+ AW W SIL e n/a 6 942 959 976 N
+ AW W SIL s n/a 6 942 959 976 N
+ AW W T b n/a 6 942 963 974 N
+ AW W T e n/a 6 942 963 974 N
+ AW W T i n/a 6 942 963 974 N
+ AW W T s n/a 6 942 963 974 N
+ AW W TH b n/a 6 942 963 970 N
+ AW W TH e n/a 6 942 963 970 N
+ AW W TH s n/a 6 942 963 970 N
+ AW W UH e n/a 6 942 959 980 N
+ AW W UH s n/a 6 942 959 980 N
+ AW W UW b n/a 6 942 959 980 N
+ AW W UW e n/a 6 942 959 980 N
+ AW W UW s n/a 6 942 959 980 N
+ AW W V e n/a 6 942 959 970 N
+ AW W V s n/a 6 942 959 970 N
+ AW W W e n/a 6 942 959 980 N
+ AW W W s n/a 6 942 959 980 N
+ AW W Y b n/a 6 942 959 977 N
+ AW W Y e n/a 6 942 959 977 N
+ AW W Y s n/a 6 942 959 977 N
+ AW W Z b n/a 6 942 963 972 N
+ AW W Z e n/a 6 942 963 972 N
+ AW W Z i n/a 6 942 963 972 N
+ AW W Z s n/a 6 942 963 972 N
+ AW W ZH e n/a 6 942 959 972 N
+ AW W ZH s n/a 6 942 959 972 N
+ AW Y AA e n/a 6 945 959 980 N
+ AW Y AA s n/a 6 945 959 980 N
+ AW Y AE e n/a 6 945 959 979 N
+ AW Y AE s n/a 6 945 959 979 N
+ AW Y AH b n/a 6 945 959 979 N
+ AW Y AH e n/a 6 945 959 979 N
+ AW Y AH s n/a 6 945 959 979 N
+ AW Y AO e n/a 6 945 959 980 N
+ AW Y AO s n/a 6 945 959 980 N
+ AW Y AW e n/a 6 945 959 980 N
+ AW Y AW s n/a 6 945 959 980 N
+ AW Y AY e n/a 6 945 959 979 N
+ AW Y AY s n/a 6 945 959 979 N
+ AW Y B b n/a 6 945 959 970 N
+ AW Y B e n/a 6 945 959 970 N
+ AW Y B i n/a 6 945 959 970 N
+ AW Y B s n/a 6 945 959 970 N
+ AW Y CH b n/a 6 945 959 971 N
+ AW Y CH e n/a 6 945 959 971 N
+ AW Y CH s n/a 6 945 959 971 N
+ AW Y D b n/a 6 945 964 975 N
+ AW Y D e n/a 6 945 964 975 N
+ AW Y D i n/a 6 945 964 975 N
+ AW Y D s n/a 6 945 964 975 N
+ AW Y DH e n/a 6 945 965 970 N
+ AW Y DH s n/a 6 945 965 970 N
+ AW Y EH e n/a 6 945 959 979 N
+ AW Y EH s n/a 6 945 959 979 N
+ AW Y ER b n/a 6 945 959 981 N
+ AW Y ER e n/a 6 945 959 981 N
+ AW Y ER i n/a 6 945 959 981 N
+ AW Y ER s n/a 6 945 959 981 N
+ AW Y EY e n/a 6 945 959 979 N
+ AW Y EY s n/a 6 945 959 979 N
+ AW Y F b n/a 6 945 959 970 N
+ AW Y F e n/a 6 945 959 970 N
+ AW Y F s n/a 6 945 959 970 N
+ AW Y G b n/a 6 945 959 970 N
+ AW Y G e n/a 6 945 959 970 N
+ AW Y G s n/a 6 945 959 970 N
+ AW Y HH e n/a 6 945 959 970 N
+ AW Y HH i n/a 6 945 959 970 N
+ AW Y HH s n/a 6 945 959 970 N
+ AW Y IH b n/a 6 945 959 979 N
+ AW Y IH e n/a 6 945 959 979 N
+ AW Y IH s n/a 6 945 959 979 N
+ AW Y IY b n/a 6 945 959 979 N
+ AW Y IY e n/a 6 945 959 979 N
+ AW Y IY s n/a 6 945 959 979 N
+ AW Y JH e n/a 6 945 959 971 N
+ AW Y JH s n/a 6 945 959 971 N
+ AW Y K b n/a 6 945 959 970 N
+ AW Y K e n/a 6 945 959 970 N
+ AW Y K i n/a 6 945 959 970 N
+ AW Y K s n/a 6 945 959 970 N
+ AW Y L b n/a 6 945 959 980 N
+ AW Y L e n/a 6 945 959 980 N
+ AW Y L i n/a 6 945 959 980 N
+ AW Y L s n/a 6 945 959 980 N
+ AW Y M b n/a 6 947 969 982 N
+ AW Y M e n/a 6 947 969 983 N
+ AW Y M s n/a 6 947 969 982 N
+ AW Y N b n/a 6 947 966 982 N
+ AW Y N e n/a 6 947 966 983 N
+ AW Y N i n/a 6 947 966 982 N
+ AW Y N s n/a 6 947 966 982 N
+ AW Y NG b n/a 6 947 969 982 N
+ AW Y NG e n/a 6 947 969 983 N
+ AW Y NG s n/a 6 947 969 982 N
+ AW Y OW e n/a 6 945 959 980 N
+ AW Y OW s n/a 6 945 959 980 N
+ AW Y OY e n/a 6 945 959 979 N
+ AW Y OY s n/a 6 945 959 979 N
+ AW Y P b n/a 6 945 959 970 N
+ AW Y P e n/a 6 945 959 970 N
+ AW Y P s n/a 6 945 959 970 N
+ AW Y R b n/a 6 945 959 981 N
+ AW Y R e n/a 6 945 959 981 N
+ AW Y R i n/a 6 945 959 981 N
+ AW Y R s n/a 6 945 959 981 N
+ AW Y S b n/a 6 945 965 971 N
+ AW Y S e n/a 6 945 965 971 N
+ AW Y S i n/a 6 945 965 971 N
+ AW Y S s n/a 6 945 965 971 N
+ AW Y SH b n/a 6 945 959 971 N
+ AW Y SH e n/a 6 945 959 971 N
+ AW Y SH s n/a 6 945 959 971 N
+ AW Y SIL e n/a 6 945 959 976 N
+ AW Y SIL s n/a 6 945 959 976 N
+ AW Y T b n/a 6 945 964 974 N
+ AW Y T e n/a 6 945 964 974 N
+ AW Y T i n/a 6 945 964 974 N
+ AW Y T s n/a 6 945 964 974 N
+ AW Y TH b n/a 6 945 965 970 N
+ AW Y TH e n/a 6 945 965 970 N
+ AW Y TH i n/a 6 945 965 970 N
+ AW Y TH s n/a 6 945 965 970 N
+ AW Y UH e n/a 6 945 959 980 N
+ AW Y UH s n/a 6 945 959 980 N
+ AW Y UW b n/a 6 945 959 980 N
+ AW Y UW e n/a 6 945 959 980 N
+ AW Y UW s n/a 6 945 959 980 N
+ AW Y V e n/a 6 945 959 970 N
+ AW Y V s n/a 6 945 959 970 N
+ AW Y W e n/a 6 945 959 980 N
+ AW Y W s n/a 6 945 959 980 N
+ AW Y Y b n/a 6 945 959 977 N
+ AW Y Y e n/a 6 945 959 977 N
+ AW Y Y s n/a 6 945 959 977 N
+ AW Y Z b n/a 6 945 965 972 N
+ AW Y Z e n/a 6 945 965 972 N
+ AW Y Z s n/a 6 945 965 972 N
+ AW Y ZH e n/a 6 945 959 972 N
+ AW Y ZH s n/a 6 945 959 972 N
+ AW Z AA e n/a 6 951 959 980 N
+ AW Z AA s n/a 6 951 959 980 N
+ AW Z AE e n/a 6 951 959 979 N
+ AW Z AE s n/a 6 951 959 979 N
+ AW Z AH b n/a 6 951 959 979 N
+ AW Z AH e n/a 6 951 959 979 N
+ AW Z AH s n/a 6 951 959 979 N
+ AW Z AO e n/a 6 951 959 980 N
+ AW Z AO s n/a 6 951 959 980 N
+ AW Z AW e n/a 6 951 959 980 N
+ AW Z AW s n/a 6 951 959 980 N
+ AW Z AY e n/a 6 951 959 979 N
+ AW Z AY s n/a 6 951 959 979 N
+ AW Z B b n/a 6 951 959 970 N
+ AW Z B e n/a 6 951 959 970 N
+ AW Z B s n/a 6 951 959 970 N
+ AW Z CH b n/a 6 951 959 971 N
+ AW Z CH e n/a 6 951 959 971 N
+ AW Z CH s n/a 6 951 959 971 N
+ AW Z D b n/a 6 951 964 975 N
+ AW Z D e n/a 6 951 964 975 N
+ AW Z D s n/a 6 951 964 975 N
+ AW Z DH e n/a 6 951 965 970 N
+ AW Z DH s n/a 6 951 965 970 N
+ AW Z EH e n/a 6 951 959 979 N
+ AW Z EH s n/a 6 951 959 979 N
+ AW Z ER b n/a 6 951 959 981 N
+ AW Z ER e n/a 6 951 959 981 N
+ AW Z ER s n/a 6 951 959 981 N
+ AW Z EY e n/a 6 951 959 979 N
+ AW Z EY s n/a 6 951 959 979 N
+ AW Z F b n/a 6 951 959 970 N
+ AW Z F e n/a 6 951 959 970 N
+ AW Z F s n/a 6 951 959 970 N
+ AW Z G b n/a 6 951 959 970 N
+ AW Z G e n/a 6 951 959 970 N
+ AW Z G s n/a 6 951 959 970 N
+ AW Z HH e n/a 6 951 959 970 N
+ AW Z HH i n/a 6 951 959 970 N
+ AW Z HH s n/a 6 951 959 970 N
+ AW Z IH b n/a 6 951 959 979 N
+ AW Z IH e n/a 6 951 959 979 N
+ AW Z IH s n/a 6 951 959 979 N
+ AW Z IY b n/a 6 951 959 979 N
+ AW Z IY e n/a 6 951 959 979 N
+ AW Z IY s n/a 6 951 959 979 N
+ AW Z JH e n/a 6 951 959 971 N
+ AW Z JH s n/a 6 951 959 971 N
+ AW Z K b n/a 6 951 959 970 N
+ AW Z K e n/a 6 951 959 970 N
+ AW Z K s n/a 6 951 959 970 N
+ AW Z L b n/a 6 951 959 980 N
+ AW Z L e n/a 6 951 959 980 N
+ AW Z L s n/a 6 951 959 980 N
+ AW Z M b n/a 6 953 969 982 N
+ AW Z M e n/a 6 953 969 983 N
+ AW Z M s n/a 6 953 969 982 N
+ AW Z N b n/a 6 953 968 982 N
+ AW Z N e n/a 6 953 968 983 N
+ AW Z N i n/a 6 953 968 982 N
+ AW Z N s n/a 6 953 968 982 N
+ AW Z NG b n/a 6 953 969 982 N
+ AW Z NG e n/a 6 953 969 983 N
+ AW Z NG s n/a 6 953 969 982 N
+ AW Z OW e n/a 6 951 959 980 N
+ AW Z OW s n/a 6 951 959 980 N
+ AW Z OY e n/a 6 951 959 979 N
+ AW Z OY s n/a 6 951 959 979 N
+ AW Z P b n/a 6 951 959 970 N
+ AW Z P e n/a 6 951 959 970 N
+ AW Z P s n/a 6 951 959 970 N
+ AW Z R b n/a 6 951 959 981 N
+ AW Z R e n/a 6 951 959 981 N
+ AW Z R i n/a 6 951 959 981 N
+ AW Z R s n/a 6 951 959 981 N
+ AW Z S b n/a 6 951 965 971 N
+ AW Z S e n/a 6 951 965 971 N
+ AW Z S s n/a 6 951 965 971 N
+ AW Z SH b n/a 6 951 959 971 N
+ AW Z SH e n/a 6 951 959 971 N
+ AW Z SH s n/a 6 951 959 971 N
+ AW Z SIL e n/a 6 951 959 976 N
+ AW Z SIL s n/a 6 951 959 976 N
+ AW Z T b n/a 6 951 964 974 N
+ AW Z T e n/a 6 951 964 974 N
+ AW Z T i n/a 6 951 964 974 N
+ AW Z T s n/a 6 951 964 974 N
+ AW Z TH b n/a 6 951 965 970 N
+ AW Z TH e n/a 6 951 965 970 N
+ AW Z TH s n/a 6 951 965 970 N
+ AW Z UH e n/a 6 951 959 980 N
+ AW Z UH s n/a 6 951 959 980 N
+ AW Z UW b n/a 6 951 959 980 N
+ AW Z UW e n/a 6 951 959 980 N
+ AW Z UW s n/a 6 951 959 980 N
+ AW Z V e n/a 6 951 959 970 N
+ AW Z V s n/a 6 951 959 970 N
+ AW Z W e n/a 6 951 959 980 N
+ AW Z W s n/a 6 951 959 980 N
+ AW Z Y b n/a 6 951 959 977 N
+ AW Z Y e n/a 6 951 959 977 N
+ AW Z Y s n/a 6 951 959 977 N
+ AW Z Z b n/a 6 951 965 972 N
+ AW Z Z e n/a 6 951 965 972 N
+ AW Z Z s n/a 6 951 965 972 N
+ AW Z ZH e n/a 6 951 959 972 N
+ AW Z ZH s n/a 6 951 959 972 N
+ AW ZH AA e n/a 6 951 959 980 N
+ AW ZH AA s n/a 6 951 959 980 N
+ AW ZH AE e n/a 6 951 959 979 N
+ AW ZH AE s n/a 6 951 959 979 N
+ AW ZH AH b n/a 6 951 959 979 N
+ AW ZH AH e n/a 6 951 959 979 N
+ AW ZH AH s n/a 6 951 959 979 N
+ AW ZH AO e n/a 6 951 959 980 N
+ AW ZH AO s n/a 6 951 959 980 N
+ AW ZH AW e n/a 6 951 959 980 N
+ AW ZH AW s n/a 6 951 959 980 N
+ AW ZH AY e n/a 6 951 959 979 N
+ AW ZH AY s n/a 6 951 959 979 N
+ AW ZH B b n/a 6 951 959 970 N
+ AW ZH B e n/a 6 951 959 970 N
+ AW ZH B s n/a 6 951 959 970 N
+ AW ZH CH b n/a 6 951 959 971 N
+ AW ZH CH e n/a 6 951 959 971 N
+ AW ZH CH s n/a 6 951 959 971 N
+ AW ZH D b n/a 6 951 964 975 N
+ AW ZH D e n/a 6 951 964 975 N
+ AW ZH D s n/a 6 951 964 975 N
+ AW ZH DH e n/a 6 951 965 970 N
+ AW ZH DH s n/a 6 951 965 970 N
+ AW ZH EH e n/a 6 951 959 979 N
+ AW ZH EH s n/a 6 951 959 979 N
+ AW ZH ER b n/a 6 951 959 981 N
+ AW ZH ER e n/a 6 951 959 981 N
+ AW ZH ER s n/a 6 951 959 981 N
+ AW ZH EY e n/a 6 951 959 979 N
+ AW ZH EY s n/a 6 951 959 979 N
+ AW ZH F b n/a 6 951 959 970 N
+ AW ZH F e n/a 6 951 959 970 N
+ AW ZH F s n/a 6 951 959 970 N
+ AW ZH G b n/a 6 951 959 970 N
+ AW ZH G e n/a 6 951 959 970 N
+ AW ZH G i n/a 6 951 959 970 N
+ AW ZH G s n/a 6 951 959 970 N
+ AW ZH HH e n/a 6 951 959 970 N
+ AW ZH HH s n/a 6 951 959 970 N
+ AW ZH IH b n/a 6 951 959 979 N
+ AW ZH IH e n/a 6 951 959 979 N
+ AW ZH IH s n/a 6 951 959 979 N
+ AW ZH IY b n/a 6 951 959 979 N
+ AW ZH IY e n/a 6 951 959 979 N
+ AW ZH IY s n/a 6 951 959 979 N
+ AW ZH JH e n/a 6 951 959 971 N
+ AW ZH JH s n/a 6 951 959 971 N
+ AW ZH K b n/a 6 951 959 970 N
+ AW ZH K e n/a 6 951 959 970 N
+ AW ZH K s n/a 6 951 959 970 N
+ AW ZH L b n/a 6 951 959 980 N
+ AW ZH L e n/a 6 951 959 980 N
+ AW ZH L s n/a 6 951 959 980 N
+ AW ZH M b n/a 6 953 969 982 N
+ AW ZH M e n/a 6 953 969 983 N
+ AW ZH M s n/a 6 953 969 982 N
+ AW ZH N b n/a 6 953 966 982 N
+ AW ZH N e n/a 6 953 966 983 N
+ AW ZH N s n/a 6 953 966 982 N
+ AW ZH NG b n/a 6 953 969 982 N
+ AW ZH NG e n/a 6 953 969 983 N
+ AW ZH NG s n/a 6 953 969 982 N
+ AW ZH OW e n/a 6 951 959 980 N
+ AW ZH OW s n/a 6 951 959 980 N
+ AW ZH OY e n/a 6 951 959 979 N
+ AW ZH OY s n/a 6 951 959 979 N
+ AW ZH P b n/a 6 951 959 970 N
+ AW ZH P e n/a 6 951 959 970 N
+ AW ZH P i n/a 6 951 959 970 N
+ AW ZH P s n/a 6 951 959 970 N
+ AW ZH R b n/a 6 951 959 981 N
+ AW ZH R e n/a 6 951 959 981 N
+ AW ZH R s n/a 6 951 959 981 N
+ AW ZH S b n/a 6 951 965 971 N
+ AW ZH S e n/a 6 951 965 971 N
+ AW ZH S s n/a 6 951 965 971 N
+ AW ZH SH b n/a 6 951 959 971 N
+ AW ZH SH e n/a 6 951 959 971 N
+ AW ZH SH s n/a 6 951 959 971 N
+ AW ZH SIL e n/a 6 951 959 976 N
+ AW ZH SIL s n/a 6 951 959 976 N
+ AW ZH T b n/a 6 951 964 974 N
+ AW ZH T e n/a 6 951 964 974 N
+ AW ZH T s n/a 6 951 964 974 N
+ AW ZH TH b n/a 6 951 965 970 N
+ AW ZH TH e n/a 6 951 965 970 N
+ AW ZH TH s n/a 6 951 965 970 N
+ AW ZH UH e n/a 6 951 959 980 N
+ AW ZH UH s n/a 6 951 959 980 N
+ AW ZH UW b n/a 6 951 959 980 N
+ AW ZH UW e n/a 6 951 959 980 N
+ AW ZH UW s n/a 6 951 959 980 N
+ AW ZH V e n/a 6 951 959 970 N
+ AW ZH V s n/a 6 951 959 970 N
+ AW ZH W e n/a 6 951 959 980 N
+ AW ZH W s n/a 6 951 959 980 N
+ AW ZH Y b n/a 6 951 959 977 N
+ AW ZH Y e n/a 6 951 959 977 N
+ AW ZH Y s n/a 6 951 959 977 N
+ AW ZH Z b n/a 6 951 965 972 N
+ AW ZH Z e n/a 6 951 965 972 N
+ AW ZH Z s n/a 6 951 965 972 N
+ AW ZH ZH e n/a 6 951 959 972 N
+ AW ZH ZH s n/a 6 951 959 972 N
+ AY AA AA b n/a 7 1016 1046 1092 N
+ AY AA AA e n/a 7 1016 1051 1092 N
+ AY AA AA s n/a 7 1016 1053 1092 N
+ AY AA AE b n/a 7 1015 1040 1103 N
+ AY AA AE e n/a 7 1015 1040 1103 N
+ AY AA AE s n/a 7 1016 1040 1103 N
+ AY AA AH b n/a 7 1017 1040 1101 N
+ AY AA AH e n/a 7 1017 1040 1101 N
+ AY AA AH i n/a 7 1017 1040 1100 N
+ AY AA AH s n/a 7 1016 1040 1101 N
+ AY AA AO e n/a 7 1016 1051 1092 N
+ AY AA AO s n/a 7 1016 1053 1092 N
+ AY AA AW e n/a 7 1016 1051 1103 N
+ AY AA AW s n/a 7 1016 1053 1103 N
+ AY AA AY b n/a 7 1015 1040 1092 N
+ AY AA AY e n/a 7 1015 1040 1092 N
+ AY AA AY s n/a 7 1016 1040 1092 N
+ AY AA B b n/a 7 1016 1036 1070 N
+ AY AA B e n/a 7 1016 1036 1070 N
+ AY AA B s n/a 7 1016 1036 1070 N
+ AY AA CH e n/a 7 1016 1061 1075 N
+ AY AA CH s n/a 7 1016 1061 1075 N
+ AY AA D b n/a 7 1016 1033 1067 N
+ AY AA D e n/a 7 1016 1033 1067 N
+ AY AA D s n/a 7 1016 1033 1067 N
+ AY AA DH b n/a 7 1016 1031 1069 N
+ AY AA DH e n/a 7 1016 1031 1069 N
+ AY AA DH s n/a 7 1016 1031 1069 N
+ AY AA EH b n/a 7 1015 1040 1103 N
+ AY AA EH e n/a 7 1015 1040 1103 N
+ AY AA EH s n/a 7 1016 1040 1103 N
+ AY AA ER b n/a 7 1017 1046 1094 N
+ AY AA ER e n/a 7 1017 1051 1094 N
+ AY AA ER s n/a 7 1016 1053 1094 N
+ AY AA EY b n/a 7 1015 1040 1103 N
+ AY AA EY e n/a 7 1015 1040 1103 N
+ AY AA EY s n/a 7 1016 1040 1103 N
+ AY AA F b n/a 7 1023 1061 1084 N
+ AY AA F e n/a 7 1023 1061 1084 N
+ AY AA F s n/a 7 1023 1061 1084 N
+ AY AA G b n/a 7 1016 1033 1077 N
+ AY AA G e n/a 7 1016 1033 1077 N
+ AY AA G s n/a 7 1016 1033 1077 N
+ AY AA HH b n/a 7 1015 1064 1072 N
+ AY AA HH e n/a 7 1015 1064 1072 N
+ AY AA HH s n/a 7 1016 1064 1072 N
+ AY AA IH b n/a 7 1017 1040 1103 N
+ AY AA IH e n/a 7 1017 1040 1103 N
+ AY AA IH s n/a 7 1016 1040 1103 N
+ AY AA IY b n/a 7 1015 1040 1102 N
+ AY AA IY e n/a 7 1015 1040 1102 N
+ AY AA IY s n/a 7 1016 1040 1102 N
+ AY AA JH b n/a 7 1016 1033 1067 N
+ AY AA JH e n/a 7 1016 1033 1067 N
+ AY AA JH s n/a 7 1016 1033 1067 N
+ AY AA K b n/a 7 1005 1061 1077 N
+ AY AA K e n/a 7 1005 1061 1077 N
+ AY AA K s n/a 7 1005 1061 1077 N
+ AY AA L b n/a 7 1016 1046 1089 N
+ AY AA L e n/a 7 1016 1051 1087 N
+ AY AA L i n/a 7 1016 1045 1090 N
+ AY AA L s n/a 7 1016 1053 1087 N
+ AY AA M b n/a 7 1017 1036 1098 N
+ AY AA M e n/a 7 1017 1036 1098 N
+ AY AA M s n/a 7 1017 1036 1098 N
+ AY AA N b n/a 7 1017 1043 1096 N
+ AY AA N e n/a 7 1017 1043 1096 N
+ AY AA N i n/a 7 1017 1037 1095 N
+ AY AA N s n/a 7 1017 1043 1096 N
+ AY AA NG e n/a 7 1017 1040 1096 N
+ AY AA NG s n/a 7 1017 1040 1096 N
+ AY AA OW b n/a 7 1016 1046 1092 N
+ AY AA OW e n/a 7 1016 1051 1092 N
+ AY AA OW s n/a 7 1016 1053 1092 N
+ AY AA OY e n/a 7 1015 1040 1092 N
+ AY AA OY s n/a 7 1016 1040 1092 N
+ AY AA P b n/a 7 1005 1061 1076 N
+ AY AA P e n/a 7 1005 1061 1076 N
+ AY AA P s n/a 7 1005 1061 1076 N
+ AY AA R b n/a 7 1016 1046 1093 N
+ AY AA R e n/a 7 1016 1051 1093 N
+ AY AA R s n/a 7 1016 1053 1093 N
+ AY AA S b n/a 7 1023 1061 1083 N
+ AY AA S e n/a 7 1023 1061 1084 N
+ AY AA S s n/a 7 1023 1061 1084 N
+ AY AA SH b n/a 7 1023 1061 1084 N
+ AY AA SH e n/a 7 1023 1061 1084 N
+ AY AA SH s n/a 7 1023 1061 1084 N
+ AY AA SIL e n/a 7 1015 1031 1086 N
+ AY AA SIL s n/a 7 1015 1065 1086 N
+ AY AA T b n/a 7 1005 1061 1075 N
+ AY AA T e n/a 7 1005 1061 1075 N
+ AY AA T s n/a 7 1005 1061 1075 N
+ AY AA TH b n/a 7 1023 1061 1084 N
+ AY AA TH e n/a 7 1023 1061 1084 N
+ AY AA TH s n/a 7 1023 1061 1084 N
+ AY AA UH b n/a 7 1016 1046 1093 N
+ AY AA UH e n/a 7 1016 1051 1093 N
+ AY AA UH s n/a 7 1016 1053 1093 N
+ AY AA UW b n/a 7 1016 1046 1092 N
+ AY AA UW e n/a 7 1016 1051 1092 N
+ AY AA UW s n/a 7 1016 1053 1092 N
+ AY AA V b n/a 7 1015 1036 1070 N
+ AY AA V e n/a 7 1015 1036 1069 N
+ AY AA V s n/a 7 1016 1036 1069 N
+ AY AA W b n/a 7 1016 1046 1087 N
+ AY AA W e n/a 7 1016 1051 1087 N
+ AY AA W s n/a 7 1016 1053 1088 N
+ AY AA Y b n/a 7 1015 1031 1102 N
+ AY AA Y e n/a 7 1015 1031 1102 N
+ AY AA Y s n/a 7 1016 1031 1102 N
+ AY AA Z b n/a 7 1016 1031 1074 N
+ AY AA Z e n/a 7 1016 1031 1073 N
+ AY AA Z s n/a 7 1016 1031 1073 N
+ AY AA ZH e n/a 7 1015 1031 1067 N
+ AY AA ZH s n/a 7 1016 1031 1067 N
+ AY AE AA b n/a 7 987 1046 1092 N
+ AY AE AA s n/a 7 987 1053 1092 N
+ AY AE AE b n/a 7 987 1040 1103 N
+ AY AE AE s n/a 7 987 1040 1103 N
+ AY AE AH b n/a 7 987 1040 1101 N
+ AY AE AH s n/a 7 987 1040 1101 N
+ AY AE AO s n/a 7 987 1053 1092 N
+ AY AE AW s n/a 7 987 1053 1103 N
+ AY AE AY b n/a 7 987 1040 1092 N
+ AY AE AY s n/a 7 987 1040 1092 N
+ AY AE B b n/a 7 987 1036 1070 N
+ AY AE B s n/a 7 987 1036 1070 N
+ AY AE CH s n/a 7 987 1061 1075 N
+ AY AE D b n/a 7 987 1035 1067 N
+ AY AE D s n/a 7 987 1035 1067 N
+ AY AE DH b n/a 7 989 1031 1069 N
+ AY AE DH s n/a 7 987 1031 1069 N
+ AY AE EH b n/a 7 987 1040 1103 N
+ AY AE EH s n/a 7 987 1040 1103 N
+ AY AE ER b n/a 7 987 1046 1094 N
+ AY AE ER s n/a 7 987 1053 1094 N
+ AY AE EY b n/a 7 987 1040 1103 N
+ AY AE EY s n/a 7 987 1040 1103 N
+ AY AE F b n/a 7 987 1061 1084 N
+ AY AE F s n/a 7 987 1061 1084 N
+ AY AE G b n/a 7 987 1035 1077 N
+ AY AE G s n/a 7 987 1035 1077 N
+ AY AE HH b n/a 7 987 1064 1072 N
+ AY AE HH s n/a 7 987 1064 1072 N
+ AY AE IH b n/a 7 987 1040 1103 N
+ AY AE IH s n/a 7 987 1040 1103 N
+ AY AE IY b n/a 7 987 1040 1102 N
+ AY AE IY s n/a 7 987 1040 1102 N
+ AY AE JH b n/a 7 987 1035 1067 N
+ AY AE JH s n/a 7 987 1035 1067 N
+ AY AE K b n/a 7 987 1061 1077 N
+ AY AE K s n/a 7 987 1061 1077 N
+ AY AE L b n/a 7 987 1046 1089 N
+ AY AE L s n/a 7 987 1053 1087 N
+ AY AE M b n/a 7 987 1036 1098 N
+ AY AE M s n/a 7 987 1036 1098 N
+ AY AE N b n/a 7 987 1043 1096 N
+ AY AE N s n/a 7 987 1043 1096 N
+ AY AE NG s n/a 7 987 1040 1096 N
+ AY AE OW b n/a 7 987 1046 1092 N
+ AY AE OW s n/a 7 987 1053 1092 N
+ AY AE OY s n/a 7 987 1040 1092 N
+ AY AE P b n/a 7 987 1061 1076 N
+ AY AE P s n/a 7 987 1061 1076 N
+ AY AE R b n/a 7 987 1046 1093 N
+ AY AE R s n/a 7 987 1053 1093 N
+ AY AE S b n/a 7 987 1061 1083 N
+ AY AE S s n/a 7 987 1061 1084 N
+ AY AE SH b n/a 7 987 1061 1084 N
+ AY AE SH s n/a 7 987 1061 1084 N
+ AY AE SIL s n/a 7 987 1065 1086 N
+ AY AE T b n/a 7 987 1061 1075 N
+ AY AE T s n/a 7 987 1061 1075 N
+ AY AE TH b n/a 7 987 1061 1084 N
+ AY AE TH s n/a 7 987 1061 1084 N
+ AY AE UH b n/a 7 987 1046 1093 N
+ AY AE UH s n/a 7 987 1053 1093 N
+ AY AE UW b n/a 7 987 1046 1092 N
+ AY AE UW s n/a 7 987 1053 1092 N
+ AY AE V b n/a 7 989 1036 1070 N
+ AY AE V s n/a 7 987 1036 1069 N
+ AY AE W b n/a 7 987 1046 1087 N
+ AY AE W s n/a 7 987 1053 1088 N
+ AY AE Y b n/a 7 987 1031 1102 N
+ AY AE Y s n/a 7 987 1031 1102 N
+ AY AE Z b n/a 7 990 1031 1074 N
+ AY AE Z s n/a 7 987 1031 1073 N
+ AY AE ZH s n/a 7 987 1031 1067 N
+ AY AH AA b n/a 7 986 1046 1092 N
+ AY AH AA e n/a 7 990 1051 1092 N
+ AY AH AA s n/a 7 986 1053 1092 N
+ AY AH AE b n/a 7 986 1040 1103 N
+ AY AH AE e n/a 7 990 1040 1103 N
+ AY AH AE s n/a 7 986 1040 1103 N
+ AY AH AH b n/a 7 986 1040 1101 N
+ AY AH AH e n/a 7 990 1040 1101 N
+ AY AH AH s n/a 7 986 1040 1101 N
+ AY AH AO e n/a 7 990 1051 1092 N
+ AY AH AO s n/a 7 986 1053 1092 N
+ AY AH AW e n/a 7 990 1051 1103 N
+ AY AH AW s n/a 7 986 1053 1103 N
+ AY AH AY b n/a 7 986 1040 1092 N
+ AY AH AY e n/a 7 990 1040 1092 N
+ AY AH AY s n/a 7 986 1040 1092 N
+ AY AH B b n/a 7 986 1036 1070 N
+ AY AH B e n/a 7 990 1036 1070 N
+ AY AH B s n/a 7 986 1036 1070 N
+ AY AH CH e n/a 7 990 1061 1075 N
+ AY AH CH s n/a 7 986 1061 1075 N
+ AY AH D b n/a 7 986 1035 1067 N
+ AY AH D e n/a 7 990 1035 1067 N
+ AY AH D s n/a 7 986 1035 1067 N
+ AY AH DH b n/a 7 989 1031 1069 N
+ AY AH DH e n/a 7 990 1031 1069 N
+ AY AH DH s n/a 7 986 1031 1069 N
+ AY AH EH b n/a 7 986 1040 1103 N
+ AY AH EH e n/a 7 990 1040 1103 N
+ AY AH EH s n/a 7 986 1040 1103 N
+ AY AH ER b n/a 7 986 1046 1094 N
+ AY AH ER e n/a 7 990 1051 1094 N
+ AY AH ER s n/a 7 986 1053 1094 N
+ AY AH EY b n/a 7 986 1040 1103 N
+ AY AH EY e n/a 7 990 1040 1103 N
+ AY AH EY s n/a 7 986 1040 1103 N
+ AY AH F b n/a 7 986 1061 1084 N
+ AY AH F e n/a 7 990 1061 1084 N
+ AY AH F s n/a 7 986 1061 1084 N
+ AY AH G b n/a 7 986 1035 1077 N
+ AY AH G e n/a 7 990 1035 1077 N
+ AY AH G s n/a 7 986 1035 1077 N
+ AY AH HH b n/a 7 986 1064 1072 N
+ AY AH HH e n/a 7 990 1064 1072 N
+ AY AH HH s n/a 7 986 1064 1072 N
+ AY AH IH b n/a 7 986 1040 1103 N
+ AY AH IH e n/a 7 990 1040 1103 N
+ AY AH IH s n/a 7 986 1040 1103 N
+ AY AH IY b n/a 7 986 1040 1102 N
+ AY AH IY e n/a 7 990 1040 1102 N
+ AY AH IY s n/a 7 986 1040 1102 N
+ AY AH JH b n/a 7 986 1035 1067 N
+ AY AH JH e n/a 7 990 1035 1067 N
+ AY AH JH s n/a 7 986 1035 1067 N
+ AY AH K b n/a 7 986 1061 1077 N
+ AY AH K e n/a 7 990 1061 1077 N
+ AY AH K s n/a 7 986 1061 1077 N
+ AY AH L b n/a 7 986 1046 1089 N
+ AY AH L e n/a 7 990 1051 1087 N
+ AY AH L s n/a 7 986 1053 1087 N
+ AY AH M b n/a 7 986 1036 1098 N
+ AY AH M e n/a 7 990 1036 1098 N
+ AY AH M s n/a 7 986 1036 1098 N
+ AY AH N b n/a 7 986 1043 1096 N
+ AY AH N e n/a 7 990 1043 1096 N
+ AY AH N i n/a 7 989 1037 1095 N
+ AY AH N s n/a 7 986 1043 1096 N
+ AY AH NG e n/a 7 990 1040 1096 N
+ AY AH NG s n/a 7 986 1040 1096 N
+ AY AH OW b n/a 7 986 1046 1092 N
+ AY AH OW e n/a 7 990 1051 1092 N
+ AY AH OW s n/a 7 986 1053 1092 N
+ AY AH OY e n/a 7 990 1040 1092 N
+ AY AH OY s n/a 7 986 1040 1092 N
+ AY AH P b n/a 7 986 1061 1076 N
+ AY AH P e n/a 7 990 1061 1076 N
+ AY AH P s n/a 7 986 1061 1076 N
+ AY AH R b n/a 7 986 1046 1093 N
+ AY AH R e n/a 7 990 1051 1093 N
+ AY AH R s n/a 7 986 1053 1093 N
+ AY AH S b n/a 7 986 1061 1083 N
+ AY AH S e n/a 7 990 1061 1084 N
+ AY AH S s n/a 7 986 1061 1084 N
+ AY AH SH b n/a 7 986 1061 1084 N
+ AY AH SH e n/a 7 990 1061 1084 N
+ AY AH SH s n/a 7 986 1061 1084 N
+ AY AH SIL e n/a 7 990 1031 1086 N
+ AY AH SIL s n/a 7 987 1065 1086 N
+ AY AH T b n/a 7 986 1061 1075 N
+ AY AH T e n/a 7 990 1061 1075 N
+ AY AH T s n/a 7 986 1061 1075 N
+ AY AH TH b n/a 7 986 1061 1084 N
+ AY AH TH e n/a 7 990 1061 1084 N
+ AY AH TH s n/a 7 986 1061 1084 N
+ AY AH UH b n/a 7 986 1046 1093 N
+ AY AH UH e n/a 7 990 1051 1093 N
+ AY AH UH s n/a 7 986 1053 1093 N
+ AY AH UW b n/a 7 986 1046 1092 N
+ AY AH UW e n/a 7 990 1051 1092 N
+ AY AH UW s n/a 7 986 1053 1092 N
+ AY AH V b n/a 7 989 1036 1070 N
+ AY AH V e n/a 7 990 1036 1069 N
+ AY AH V i n/a 7 989 1031 1069 N
+ AY AH V s n/a 7 986 1036 1069 N
+ AY AH W b n/a 7 986 1046 1087 N
+ AY AH W e n/a 7 990 1051 1087 N
+ AY AH W s n/a 7 986 1053 1088 N
+ AY AH Y b n/a 7 986 1031 1102 N
+ AY AH Y e n/a 7 990 1031 1102 N
+ AY AH Y s n/a 7 986 1031 1102 N
+ AY AH Z b n/a 7 990 1031 1074 N
+ AY AH Z e n/a 7 990 1031 1073 N
+ AY AH Z s n/a 7 986 1031 1073 N
+ AY AH ZH e n/a 7 990 1031 1067 N
+ AY AH ZH s n/a 7 986 1031 1067 N
+ AY AO AA b n/a 7 1016 1046 1092 N
+ AY AO AA s n/a 7 1016 1053 1092 N
+ AY AO AE b n/a 7 1015 1040 1103 N
+ AY AO AE s n/a 7 1016 1040 1103 N
+ AY AO AH b n/a 7 1017 1040 1101 N
+ AY AO AH s n/a 7 1016 1040 1101 N
+ AY AO AO s n/a 7 1016 1053 1092 N
+ AY AO AW s n/a 7 1016 1053 1103 N
+ AY AO AY b n/a 7 1015 1040 1092 N
+ AY AO AY s n/a 7 1016 1040 1092 N
+ AY AO B b n/a 7 1016 1036 1070 N
+ AY AO B s n/a 7 1016 1036 1070 N
+ AY AO CH s n/a 7 1016 1061 1075 N
+ AY AO D b n/a 7 1016 1033 1067 N
+ AY AO D s n/a 7 1016 1033 1067 N
+ AY AO DH b n/a 7 1016 1031 1069 N
+ AY AO DH s n/a 7 1016 1031 1069 N
+ AY AO EH b n/a 7 1015 1040 1103 N
+ AY AO EH s n/a 7 1016 1040 1103 N
+ AY AO ER b n/a 7 1017 1046 1094 N
+ AY AO ER s n/a 7 1016 1053 1094 N
+ AY AO EY b n/a 7 1015 1040 1103 N
+ AY AO EY s n/a 7 1016 1040 1103 N
+ AY AO F b n/a 7 1023 1061 1084 N
+ AY AO F s n/a 7 1023 1061 1084 N
+ AY AO G b n/a 7 1016 1033 1077 N
+ AY AO G s n/a 7 1016 1033 1077 N
+ AY AO HH b n/a 7 1015 1064 1072 N
+ AY AO HH s n/a 7 1016 1064 1072 N
+ AY AO IH b n/a 7 1017 1040 1103 N
+ AY AO IH s n/a 7 1016 1040 1103 N
+ AY AO IY b n/a 7 1015 1040 1102 N
+ AY AO IY s n/a 7 1016 1040 1102 N
+ AY AO JH b n/a 7 1016 1033 1067 N
+ AY AO JH s n/a 7 1016 1033 1067 N
+ AY AO K b n/a 7 1005 1061 1077 N
+ AY AO K s n/a 7 1005 1061 1077 N
+ AY AO L b n/a 7 1016 1046 1089 N
+ AY AO L s n/a 7 1016 1053 1087 N
+ AY AO M b n/a 7 1017 1036 1098 N
+ AY AO M s n/a 7 1017 1036 1098 N
+ AY AO N b n/a 7 1017 1043 1096 N
+ AY AO N s n/a 7 1017 1043 1096 N
+ AY AO NG s n/a 7 1017 1040 1096 N
+ AY AO OW b n/a 7 1016 1046 1092 N
+ AY AO OW s n/a 7 1016 1053 1092 N
+ AY AO OY s n/a 7 1016 1040 1092 N
+ AY AO P b n/a 7 1005 1061 1076 N
+ AY AO P s n/a 7 1005 1061 1076 N
+ AY AO R b n/a 7 1016 1046 1093 N
+ AY AO R s n/a 7 1016 1053 1093 N
+ AY AO S b n/a 7 1023 1061 1083 N
+ AY AO S s n/a 7 1023 1061 1084 N
+ AY AO SH b n/a 7 1023 1061 1084 N
+ AY AO SH s n/a 7 1023 1061 1084 N
+ AY AO SIL s n/a 7 1015 1065 1086 N
+ AY AO T b n/a 7 1005 1061 1075 N
+ AY AO T s n/a 7 1005 1061 1075 N
+ AY AO TH b n/a 7 1023 1061 1084 N
+ AY AO TH s n/a 7 1023 1061 1084 N
+ AY AO UH b n/a 7 1016 1046 1093 N
+ AY AO UH s n/a 7 1016 1053 1093 N
+ AY AO UW b n/a 7 1016 1046 1092 N
+ AY AO UW s n/a 7 1016 1053 1092 N
+ AY AO V b n/a 7 1015 1036 1070 N
+ AY AO V s n/a 7 1016 1036 1069 N
+ AY AO W b n/a 7 1016 1046 1087 N
+ AY AO W s n/a 7 1016 1053 1088 N
+ AY AO Y b n/a 7 1015 1031 1102 N
+ AY AO Y s n/a 7 1016 1031 1102 N
+ AY AO Z b n/a 7 1016 1031 1074 N
+ AY AO Z s n/a 7 1016 1031 1073 N
+ AY AO ZH s n/a 7 1016 1031 1067 N
+ AY AW AA b n/a 7 1023 1046 1092 N
+ AY AW AA e n/a 7 1023 1051 1092 N
+ AY AW AA s n/a 7 1023 1053 1092 N
+ AY AW AE b n/a 7 1023 1040 1103 N
+ AY AW AE e n/a 7 1023 1040 1103 N
+ AY AW AE s n/a 7 1023 1040 1103 N
+ AY AW AH b n/a 7 1023 1040 1101 N
+ AY AW AH e n/a 7 1023 1040 1101 N
+ AY AW AH s n/a 7 1023 1040 1101 N
+ AY AW AO e n/a 7 1023 1051 1092 N
+ AY AW AO s n/a 7 1023 1053 1092 N
+ AY AW AW e n/a 7 1023 1051 1103 N
+ AY AW AW s n/a 7 1023 1053 1103 N
+ AY AW AY b n/a 7 1023 1040 1092 N
+ AY AW AY e n/a 7 1023 1040 1092 N
+ AY AW AY s n/a 7 1023 1040 1092 N
+ AY AW B b n/a 7 1023 1036 1070 N
+ AY AW B e n/a 7 1023 1036 1070 N
+ AY AW B s n/a 7 1023 1036 1070 N
+ AY AW CH e n/a 7 1023 1061 1075 N
+ AY AW CH s n/a 7 1023 1061 1075 N
+ AY AW D b n/a 7 1023 1033 1067 N
+ AY AW D e n/a 7 1023 1033 1067 N
+ AY AW D s n/a 7 1023 1033 1067 N
+ AY AW DH b n/a 7 1023 1031 1069 N
+ AY AW DH e n/a 7 1023 1031 1069 N
+ AY AW DH s n/a 7 1023 1031 1069 N
+ AY AW EH b n/a 7 1023 1040 1103 N
+ AY AW EH e n/a 7 1023 1040 1103 N
+ AY AW EH s n/a 7 1023 1040 1103 N
+ AY AW ER b n/a 7 1023 1046 1094 N
+ AY AW ER e n/a 7 1023 1051 1094 N
+ AY AW ER s n/a 7 1023 1053 1094 N
+ AY AW EY b n/a 7 1023 1040 1103 N
+ AY AW EY e n/a 7 1023 1040 1103 N
+ AY AW EY s n/a 7 1023 1040 1103 N
+ AY AW F b n/a 7 1023 1061 1084 N
+ AY AW F e n/a 7 1023 1061 1084 N
+ AY AW F s n/a 7 1023 1061 1084 N
+ AY AW G b n/a 7 1023 1033 1077 N
+ AY AW G e n/a 7 1023 1033 1077 N
+ AY AW G s n/a 7 1023 1033 1077 N
+ AY AW HH b n/a 7 1023 1064 1072 N
+ AY AW HH e n/a 7 1023 1064 1072 N
+ AY AW HH s n/a 7 1023 1064 1072 N
+ AY AW IH b n/a 7 1023 1040 1103 N
+ AY AW IH e n/a 7 1023 1040 1103 N
+ AY AW IH s n/a 7 1023 1040 1103 N
+ AY AW IY b n/a 7 1023 1040 1102 N
+ AY AW IY e n/a 7 1023 1040 1102 N
+ AY AW IY s n/a 7 1023 1040 1102 N
+ AY AW JH b n/a 7 1023 1033 1067 N
+ AY AW JH e n/a 7 1023 1033 1067 N
+ AY AW JH s n/a 7 1023 1033 1067 N
+ AY AW K b n/a 7 1005 1061 1077 N
+ AY AW K e n/a 7 1005 1061 1077 N
+ AY AW K s n/a 7 1005 1061 1077 N
+ AY AW L b n/a 7 1023 1046 1091 N
+ AY AW L e n/a 7 1023 1051 1087 N
+ AY AW L s n/a 7 1023 1053 1087 N
+ AY AW M b n/a 7 1023 1036 1098 N
+ AY AW M e n/a 7 1023 1036 1098 N
+ AY AW M s n/a 7 1023 1036 1098 N
+ AY AW N b n/a 7 1023 1043 1096 N
+ AY AW N e n/a 7 1023 1043 1096 N
+ AY AW N s n/a 7 1023 1043 1096 N
+ AY AW NG e n/a 7 1023 1040 1096 N
+ AY AW NG s n/a 7 1023 1040 1096 N
+ AY AW OW b n/a 7 1023 1046 1092 N
+ AY AW OW e n/a 7 1023 1051 1092 N
+ AY AW OW s n/a 7 1023 1053 1092 N
+ AY AW OY e n/a 7 1023 1040 1092 N
+ AY AW OY s n/a 7 1023 1040 1092 N
+ AY AW P b n/a 7 1005 1061 1076 N
+ AY AW P e n/a 7 1005 1061 1076 N
+ AY AW P s n/a 7 1005 1061 1076 N
+ AY AW R b n/a 7 1023 1046 1093 N
+ AY AW R e n/a 7 1023 1051 1093 N
+ AY AW R s n/a 7 1023 1053 1093 N
+ AY AW S b n/a 7 1023 1061 1083 N
+ AY AW S e n/a 7 1023 1061 1084 N
+ AY AW S s n/a 7 1023 1061 1084 N
+ AY AW SH b n/a 7 1023 1061 1084 N
+ AY AW SH e n/a 7 1023 1061 1084 N
+ AY AW SH s n/a 7 1023 1061 1084 N
+ AY AW SIL e n/a 7 1023 1031 1086 N
+ AY AW SIL s n/a 7 1023 1065 1086 N
+ AY AW T b n/a 7 1005 1061 1075 N
+ AY AW T e n/a 7 1005 1061 1075 N
+ AY AW T s n/a 7 1005 1061 1075 N
+ AY AW TH b n/a 7 1023 1061 1084 N
+ AY AW TH e n/a 7 1023 1061 1084 N
+ AY AW TH s n/a 7 1023 1061 1084 N
+ AY AW UH b n/a 7 1023 1046 1093 N
+ AY AW UH e n/a 7 1023 1051 1093 N
+ AY AW UH s n/a 7 1023 1053 1093 N
+ AY AW UW b n/a 7 1023 1046 1092 N
+ AY AW UW e n/a 7 1023 1051 1092 N
+ AY AW UW s n/a 7 1023 1053 1092 N
+ AY AW V b n/a 7 1023 1036 1070 N
+ AY AW V e n/a 7 1023 1036 1069 N
+ AY AW V s n/a 7 1023 1036 1069 N
+ AY AW W b n/a 7 1023 1046 1087 N
+ AY AW W e n/a 7 1023 1051 1087 N
+ AY AW W s n/a 7 1023 1053 1088 N
+ AY AW Y b n/a 7 1023 1031 1102 N
+ AY AW Y e n/a 7 1023 1031 1102 N
+ AY AW Y s n/a 7 1023 1031 1102 N
+ AY AW Z b n/a 7 1023 1031 1074 N
+ AY AW Z e n/a 7 1023 1031 1073 N
+ AY AW Z s n/a 7 1023 1031 1073 N
+ AY AW ZH e n/a 7 1023 1031 1067 N
+ AY AW ZH s n/a 7 1023 1031 1067 N
+ AY AY AA b n/a 7 987 1046 1092 N
+ AY AY AA e n/a 7 990 1051 1092 N
+ AY AY AA s n/a 7 987 1053 1092 N
+ AY AY AE b n/a 7 987 1040 1103 N
+ AY AY AE e n/a 7 990 1040 1103 N
+ AY AY AE s n/a 7 987 1040 1103 N
+ AY AY AH b n/a 7 987 1040 1101 N
+ AY AY AH e n/a 7 990 1040 1101 N
+ AY AY AH s n/a 7 987 1040 1101 N
+ AY AY AO e n/a 7 990 1051 1092 N
+ AY AY AO s n/a 7 987 1053 1092 N
+ AY AY AW e n/a 7 990 1051 1103 N
+ AY AY AW s n/a 7 987 1053 1103 N
+ AY AY AY b n/a 7 987 1040 1092 N
+ AY AY AY e n/a 7 990 1040 1092 N
+ AY AY AY s n/a 7 987 1040 1092 N
+ AY AY B b n/a 7 987 1036 1070 N
+ AY AY B e n/a 7 990 1036 1070 N
+ AY AY B s n/a 7 987 1036 1070 N
+ AY AY CH e n/a 7 990 1061 1075 N
+ AY AY CH s n/a 7 987 1061 1075 N
+ AY AY D b n/a 7 987 1035 1067 N
+ AY AY D e n/a 7 990 1035 1067 N
+ AY AY D s n/a 7 987 1035 1067 N
+ AY AY DH b n/a 7 989 1031 1069 N
+ AY AY DH e n/a 7 990 1031 1069 N
+ AY AY DH s n/a 7 987 1031 1069 N
+ AY AY EH b n/a 7 987 1040 1103 N
+ AY AY EH e n/a 7 990 1040 1103 N
+ AY AY EH s n/a 7 987 1040 1103 N
+ AY AY ER b n/a 7 987 1046 1094 N
+ AY AY ER e n/a 7 990 1051 1094 N
+ AY AY ER s n/a 7 987 1053 1094 N
+ AY AY EY b n/a 7 987 1040 1103 N
+ AY AY EY e n/a 7 990 1040 1103 N
+ AY AY EY s n/a 7 987 1040 1103 N
+ AY AY F b n/a 7 987 1061 1084 N
+ AY AY F e n/a 7 990 1061 1084 N
+ AY AY F s n/a 7 987 1061 1084 N
+ AY AY G b n/a 7 987 1035 1077 N
+ AY AY G e n/a 7 990 1035 1077 N
+ AY AY G s n/a 7 987 1035 1077 N
+ AY AY HH b n/a 7 987 1064 1072 N
+ AY AY HH e n/a 7 990 1064 1072 N
+ AY AY HH s n/a 7 987 1064 1072 N
+ AY AY IH b n/a 7 987 1040 1103 N
+ AY AY IH e n/a 7 990 1040 1103 N
+ AY AY IH s n/a 7 987 1040 1103 N
+ AY AY IY b n/a 7 987 1040 1102 N
+ AY AY IY e n/a 7 990 1040 1102 N
+ AY AY IY s n/a 7 987 1040 1102 N
+ AY AY JH b n/a 7 987 1035 1067 N
+ AY AY JH e n/a 7 990 1035 1067 N
+ AY AY JH i n/a 7 989 1031 1067 N
+ AY AY JH s n/a 7 987 1035 1067 N
+ AY AY K b n/a 7 987 1061 1077 N
+ AY AY K e n/a 7 990 1061 1077 N
+ AY AY K s n/a 7 987 1061 1077 N
+ AY AY L b n/a 7 987 1046 1089 N
+ AY AY L e n/a 7 990 1051 1087 N
+ AY AY L s n/a 7 987 1053 1087 N
+ AY AY M b n/a 7 987 1036 1098 N
+ AY AY M e n/a 7 990 1036 1098 N
+ AY AY M s n/a 7 987 1036 1098 N
+ AY AY N b n/a 7 987 1043 1096 N
+ AY AY N e n/a 7 990 1043 1096 N
+ AY AY N s n/a 7 987 1043 1096 N
+ AY AY NG e n/a 7 990 1040 1096 N
+ AY AY NG s n/a 7 987 1040 1096 N
+ AY AY OW b n/a 7 987 1046 1092 N
+ AY AY OW e n/a 7 990 1051 1092 N
+ AY AY OW s n/a 7 987 1053 1092 N
+ AY AY OY e n/a 7 990 1040 1092 N
+ AY AY OY s n/a 7 987 1040 1092 N
+ AY AY P b n/a 7 987 1061 1076 N
+ AY AY P e n/a 7 990 1061 1076 N
+ AY AY P s n/a 7 987 1061 1076 N
+ AY AY R b n/a 7 987 1046 1093 N
+ AY AY R e n/a 7 990 1051 1093 N
+ AY AY R s n/a 7 987 1053 1093 N
+ AY AY S b n/a 7 987 1061 1083 N
+ AY AY S e n/a 7 990 1061 1084 N
+ AY AY S s n/a 7 987 1061 1084 N
+ AY AY SH b n/a 7 987 1061 1084 N
+ AY AY SH e n/a 7 990 1061 1084 N
+ AY AY SH s n/a 7 987 1061 1084 N
+ AY AY SIL e n/a 7 990 1031 1086 N
+ AY AY SIL s n/a 7 987 1065 1086 N
+ AY AY T b n/a 7 987 1061 1075 N
+ AY AY T e n/a 7 990 1061 1075 N
+ AY AY T s n/a 7 987 1061 1075 N
+ AY AY TH b n/a 7 987 1061 1084 N
+ AY AY TH e n/a 7 990 1061 1084 N
+ AY AY TH s n/a 7 987 1061 1084 N
+ AY AY UH b n/a 7 987 1046 1093 N
+ AY AY UH e n/a 7 990 1051 1093 N
+ AY AY UH s n/a 7 987 1053 1093 N
+ AY AY UW b n/a 7 987 1046 1092 N
+ AY AY UW e n/a 7 990 1051 1092 N
+ AY AY UW s n/a 7 987 1053 1092 N
+ AY AY V b n/a 7 989 1036 1070 N
+ AY AY V e n/a 7 990 1036 1069 N
+ AY AY V s n/a 7 987 1036 1069 N
+ AY AY W b n/a 7 987 1046 1087 N
+ AY AY W e n/a 7 990 1051 1087 N
+ AY AY W s n/a 7 987 1053 1088 N
+ AY AY Y b n/a 7 987 1031 1102 N
+ AY AY Y e n/a 7 990 1031 1102 N
+ AY AY Y s n/a 7 987 1031 1102 N
+ AY AY Z b n/a 7 990 1031 1074 N
+ AY AY Z e n/a 7 990 1031 1073 N
+ AY AY Z s n/a 7 987 1031 1073 N
+ AY AY ZH e n/a 7 990 1031 1067 N
+ AY AY ZH s n/a 7 987 1031 1067 N
+ AY B AA b n/a 7 1010 1046 1092 N
+ AY B AA e n/a 7 1010 1051 1092 N
+ AY B AA i n/a 7 1012 1049 1092 N
+ AY B AA s n/a 7 1010 1053 1092 N
+ AY B AE b n/a 7 1010 1041 1103 N
+ AY B AE e n/a 7 1010 1041 1103 N
+ AY B AE i n/a 7 1012 1042 1103 N
+ AY B AE s n/a 7 1010 1041 1103 N
+ AY B AH b n/a 7 1010 1041 1101 N
+ AY B AH e n/a 7 1010 1041 1101 N
+ AY B AH i n/a 7 1012 1042 1101 N
+ AY B AH s n/a 7 1010 1041 1101 N
+ AY B AO e n/a 7 1010 1051 1092 N
+ AY B AO i n/a 7 1012 1049 1092 N
+ AY B AO s n/a 7 1010 1053 1092 N
+ AY B AW e n/a 7 1010 1051 1103 N
+ AY B AW i n/a 7 1012 1049 1103 N
+ AY B AW s n/a 7 1010 1053 1103 N
+ AY B AY b n/a 7 1010 1041 1092 N
+ AY B AY e n/a 7 1010 1041 1092 N
+ AY B AY s n/a 7 1010 1041 1092 N
+ AY B B b n/a 7 1010 1033 1070 N
+ AY B B e n/a 7 1010 1033 1070 N
+ AY B B i n/a 7 1012 1029 1070 N
+ AY B B s n/a 7 1010 1033 1070 N
+ AY B CH e n/a 7 1010 1057 1075 N
+ AY B CH s n/a 7 1010 1061 1075 N
+ AY B D b n/a 7 1010 1033 1067 N
+ AY B D e n/a 7 1010 1033 1067 N
+ AY B D i n/a 7 1012 1029 1068 N
+ AY B D s n/a 7 1010 1033 1067 N
+ AY B DH b n/a 7 1010 1034 1071 N
+ AY B DH e n/a 7 1010 1034 1071 N
+ AY B DH s n/a 7 1010 1034 1071 N
+ AY B EH b n/a 7 1010 1041 1103 N
+ AY B EH e n/a 7 1010 1041 1103 N
+ AY B EH i n/a 7 1012 1042 1103 N
+ AY B EH s n/a 7 1010 1041 1103 N
+ AY B ER b n/a 7 1010 1046 1094 N
+ AY B ER e n/a 7 1010 1051 1094 N
+ AY B ER i n/a 7 1012 1049 1094 N
+ AY B ER s n/a 7 1010 1053 1094 N
+ AY B EY b n/a 7 1010 1041 1103 N
+ AY B EY e n/a 7 1010 1041 1103 N
+ AY B EY s n/a 7 1010 1041 1103 N
+ AY B F b n/a 7 1010 1057 1084 N
+ AY B F e n/a 7 1010 1057 1084 N
+ AY B F i n/a 7 1012 1057 1084 N
+ AY B F s n/a 7 1010 1061 1084 N
+ AY B G b n/a 7 1010 1033 1077 N
+ AY B G e n/a 7 1010 1033 1077 N
+ AY B G i n/a 7 1012 1028 1077 N
+ AY B G s n/a 7 1010 1033 1077 N
+ AY B HH b n/a 7 1010 1057 1072 N
+ AY B HH e n/a 7 1010 1057 1072 N
+ AY B HH s n/a 7 1010 1064 1072 N
+ AY B IH b n/a 7 1010 1041 1103 N
+ AY B IH e n/a 7 1010 1041 1103 N
+ AY B IH i n/a 7 1012 1042 1097 N
+ AY B IH s n/a 7 1010 1041 1103 N
+ AY B IY b n/a 7 1010 1041 1102 N
+ AY B IY e n/a 7 1010 1041 1102 N
+ AY B IY i n/a 7 1012 1042 1095 N
+ AY B IY s n/a 7 1010 1041 1102 N
+ AY B JH b n/a 7 1010 1033 1067 N
+ AY B JH e n/a 7 1010 1033 1067 N
+ AY B JH i n/a 7 1012 1028 1067 N
+ AY B JH s n/a 7 1010 1033 1067 N
+ AY B K b n/a 7 1005 1057 1077 N
+ AY B K e n/a 7 1005 1057 1077 N
+ AY B K i n/a 7 1005 1057 1077 N
+ AY B K s n/a 7 1005 1061 1077 N
+ AY B L b n/a 7 1010 1046 1091 N
+ AY B L e n/a 7 1010 1051 1087 N
+ AY B L i n/a 7 1012 1045 1089 N
+ AY B L s n/a 7 1010 1053 1087 N
+ AY B M b n/a 7 1010 1029 1098 N
+ AY B M e n/a 7 1010 1029 1098 N
+ AY B M i n/a 7 1014 1039 1099 N
+ AY B M s n/a 7 1010 1029 1098 N
+ AY B N b n/a 7 1010 1043 1096 N
+ AY B N e n/a 7 1010 1043 1096 N
+ AY B N i n/a 7 1014 1037 1095 N
+ AY B N s n/a 7 1010 1043 1096 N
+ AY B NG e n/a 7 1010 1041 1096 N
+ AY B NG s n/a 7 1010 1041 1096 N
+ AY B OW b n/a 7 1010 1046 1092 N
+ AY B OW e n/a 7 1010 1051 1092 N
+ AY B OW i n/a 7 1012 1049 1092 N
+ AY B OW s n/a 7 1010 1053 1092 N
+ AY B OY e n/a 7 1010 1041 1092 N
+ AY B OY s n/a 7 1010 1041 1092 N
+ AY B P b n/a 7 1005 1057 1076 N
+ AY B P e n/a 7 1005 1057 1076 N
+ AY B P i n/a 7 1005 1057 1075 N
+ AY B P s n/a 7 1005 1061 1076 N
+ AY B R b n/a 7 1010 1046 1093 N
+ AY B R e n/a 7 1010 1051 1093 N
+ AY B R i n/a 7 1012 1049 1094 N
+ AY B R s n/a 7 1010 1053 1093 N
+ AY B S b n/a 7 1010 1057 1083 N
+ AY B S e n/a 7 1010 1057 1084 N
+ AY B S i n/a 7 1012 1057 1084 N
+ AY B S s n/a 7 1010 1061 1084 N
+ AY B SH b n/a 7 1010 1057 1084 N
+ AY B SH e n/a 7 1010 1057 1084 N
+ AY B SH i n/a 7 1012 1057 1084 N
+ AY B SH s n/a 7 1010 1061 1084 N
+ AY B SIL e n/a 7 1011 1030 1086 N
+ AY B SIL s n/a 7 1011 1065 1086 N
+ AY B T b n/a 7 1005 1057 1075 N
+ AY B T e n/a 7 1005 1057 1075 N
+ AY B T i n/a 7 1005 1057 1078 N
+ AY B T s n/a 7 1005 1061 1075 N
+ AY B TH b n/a 7 1010 1057 1084 N
+ AY B TH e n/a 7 1010 1057 1084 N
+ AY B TH s n/a 7 1010 1061 1084 N
+ AY B UH b n/a 7 1010 1046 1093 N
+ AY B UH e n/a 7 1010 1051 1093 N
+ AY B UH s n/a 7 1010 1053 1093 N
+ AY B UW b n/a 7 1010 1046 1092 N
+ AY B UW e n/a 7 1010 1051 1092 N
+ AY B UW i n/a 7 1012 1049 1092 N
+ AY B UW s n/a 7 1010 1053 1092 N
+ AY B V b n/a 7 1010 1029 1070 N
+ AY B V e n/a 7 1010 1029 1069 N
+ AY B V i n/a 7 1011 1029 1069 N
+ AY B V s n/a 7 1010 1029 1069 N
+ AY B W b n/a 7 1010 1046 1088 N
+ AY B W e n/a 7 1010 1051 1088 N
+ AY B W i n/a 7 1012 1045 1089 N
+ AY B W s n/a 7 1010 1053 1088 N
+ AY B Y b n/a 7 1010 1028 1102 N
+ AY B Y e n/a 7 1010 1028 1102 N
+ AY B Y i n/a 7 1012 1028 1095 N
+ AY B Y s n/a 7 1010 1028 1102 N
+ AY B Z b n/a 7 1010 1029 1074 N
+ AY B Z e n/a 7 1010 1029 1073 N
+ AY B Z i n/a 7 1011 1029 1073 N
+ AY B Z s n/a 7 1010 1029 1073 N
+ AY B ZH e n/a 7 1010 1028 1067 N
+ AY B ZH s n/a 7 1010 1028 1067 N
+ AY CH AA b n/a 7 995 1046 1092 N
+ AY CH AA e n/a 7 995 1051 1092 N
+ AY CH AA s n/a 7 988 1053 1092 N
+ AY CH AE b n/a 7 995 1040 1103 N
+ AY CH AE e n/a 7 995 1040 1103 N
+ AY CH AE s n/a 7 988 1040 1103 N
+ AY CH AH b n/a 7 995 1040 1101 N
+ AY CH AH e n/a 7 995 1040 1101 N
+ AY CH AH i n/a 7 995 1040 1100 N
+ AY CH AH s n/a 7 988 1040 1101 N
+ AY CH AO e n/a 7 995 1051 1092 N
+ AY CH AO s n/a 7 988 1053 1092 N
+ AY CH AW e n/a 7 995 1051 1103 N
+ AY CH AW s n/a 7 988 1053 1103 N
+ AY CH AY b n/a 7 995 1040 1092 N
+ AY CH AY e n/a 7 995 1040 1092 N
+ AY CH AY s n/a 7 988 1040 1092 N
+ AY CH B b n/a 7 995 1036 1070 N
+ AY CH B e n/a 7 995 1036 1070 N
+ AY CH B s n/a 7 988 1036 1070 N
+ AY CH CH e n/a 7 995 1061 1075 N
+ AY CH CH s n/a 7 988 1061 1075 N
+ AY CH D b n/a 7 995 1035 1067 N
+ AY CH D e n/a 7 995 1035 1067 N
+ AY CH D i n/a 7 995 1031 1068 N
+ AY CH D s n/a 7 988 1035 1067 N
+ AY CH DH b n/a 7 995 1031 1069 N
+ AY CH DH e n/a 7 995 1031 1069 N
+ AY CH DH s n/a 7 988 1031 1069 N
+ AY CH EH b n/a 7 995 1040 1103 N
+ AY CH EH e n/a 7 995 1040 1103 N
+ AY CH EH i n/a 7 995 1040 1103 N
+ AY CH EH s n/a 7 988 1040 1103 N
+ AY CH ER b n/a 7 995 1046 1094 N
+ AY CH ER e n/a 7 995 1051 1094 N
+ AY CH ER s n/a 7 988 1053 1094 N
+ AY CH EY b n/a 7 995 1040 1103 N
+ AY CH EY e n/a 7 995 1040 1103 N
+ AY CH EY i n/a 7 995 1040 1103 N
+ AY CH EY s n/a 7 988 1040 1103 N
+ AY CH F b n/a 7 995 1061 1084 N
+ AY CH F e n/a 7 995 1061 1084 N
+ AY CH F s n/a 7 988 1061 1084 N
+ AY CH G b n/a 7 995 1035 1077 N
+ AY CH G e n/a 7 995 1035 1077 N
+ AY CH G s n/a 7 988 1035 1077 N
+ AY CH HH b n/a 7 995 1064 1072 N
+ AY CH HH e n/a 7 995 1064 1072 N
+ AY CH HH s n/a 7 988 1064 1072 N
+ AY CH IH b n/a 7 995 1040 1103 N
+ AY CH IH e n/a 7 995 1040 1103 N
+ AY CH IH s n/a 7 988 1040 1103 N
+ AY CH IY b n/a 7 995 1040 1102 N
+ AY CH IY e n/a 7 995 1040 1102 N
+ AY CH IY s n/a 7 988 1040 1102 N
+ AY CH JH b n/a 7 995 1035 1067 N
+ AY CH JH e n/a 7 995 1035 1067 N
+ AY CH JH s n/a 7 988 1035 1067 N
+ AY CH K b n/a 7 995 1061 1077 N
+ AY CH K e n/a 7 995 1061 1077 N
+ AY CH K i n/a 7 995 1061 1077 N
+ AY CH K s n/a 7 988 1061 1077 N
+ AY CH L b n/a 7 995 1046 1091 N
+ AY CH L e n/a 7 995 1051 1087 N
+ AY CH L i n/a 7 995 1045 1090 N
+ AY CH L s n/a 7 988 1053 1087 N
+ AY CH M b n/a 7 999 1036 1098 N
+ AY CH M e n/a 7 999 1036 1098 N
+ AY CH M i n/a 7 997 1039 1099 N
+ AY CH M s n/a 7 999 1036 1098 N
+ AY CH N b n/a 7 999 1043 1096 N
+ AY CH N e n/a 7 999 1043 1096 N
+ AY CH N i n/a 7 999 1039 1095 N
+ AY CH N s n/a 7 999 1043 1096 N
+ AY CH NG e n/a 7 999 1040 1096 N
+ AY CH NG s n/a 7 999 1040 1096 N
+ AY CH OW b n/a 7 995 1046 1092 N
+ AY CH OW e n/a 7 995 1051 1092 N
+ AY CH OW s n/a 7 988 1053 1092 N
+ AY CH OY e n/a 7 995 1040 1092 N
+ AY CH OY s n/a 7 988 1040 1092 N
+ AY CH P b n/a 7 995 1061 1076 N
+ AY CH P e n/a 7 995 1061 1076 N
+ AY CH P s n/a 7 988 1061 1076 N
+ AY CH R b n/a 7 995 1046 1093 N
+ AY CH R e n/a 7 995 1051 1093 N
+ AY CH R i n/a 7 995 1050 1094 N
+ AY CH R s n/a 7 988 1053 1093 N
+ AY CH S b n/a 7 995 1061 1083 N
+ AY CH S e n/a 7 995 1061 1084 N
+ AY CH S i n/a 7 995 1061 1083 N
+ AY CH S s n/a 7 988 1061 1084 N
+ AY CH SH b n/a 7 995 1061 1084 N
+ AY CH SH e n/a 7 995 1061 1084 N
+ AY CH SH s n/a 7 988 1061 1084 N
+ AY CH SIL e n/a 7 995 1031 1086 N
+ AY CH SIL s n/a 7 988 1065 1085 N
+ AY CH T b n/a 7 995 1061 1075 N
+ AY CH T e n/a 7 995 1061 1075 N
+ AY CH T i n/a 7 995 1061 1078 N
+ AY CH T s n/a 7 988 1061 1075 N
+ AY CH TH b n/a 7 995 1061 1084 N
+ AY CH TH e n/a 7 995 1061 1084 N
+ AY CH TH s n/a 7 988 1061 1084 N
+ AY CH UH b n/a 7 995 1046 1093 N
+ AY CH UH e n/a 7 995 1051 1093 N
+ AY CH UH s n/a 7 988 1053 1093 N
+ AY CH UW b n/a 7 995 1046 1092 N
+ AY CH UW e n/a 7 995 1051 1092 N
+ AY CH UW s n/a 7 988 1053 1092 N
+ AY CH V b n/a 7 995 1036 1070 N
+ AY CH V e n/a 7 995 1036 1069 N
+ AY CH V i n/a 7 995 1031 1069 N
+ AY CH V s n/a 7 988 1036 1069 N
+ AY CH W b n/a 7 995 1046 1087 N
+ AY CH W e n/a 7 995 1051 1087 N
+ AY CH W s n/a 7 988 1053 1088 N
+ AY CH Y b n/a 7 995 1031 1102 N
+ AY CH Y e n/a 7 995 1031 1102 N
+ AY CH Y s n/a 7 988 1031 1102 N
+ AY CH Z b n/a 7 995 1031 1074 N
+ AY CH Z e n/a 7 995 1031 1073 N
+ AY CH Z i n/a 7 995 1031 1073 N
+ AY CH Z s n/a 7 988 1031 1073 N
+ AY CH ZH e n/a 7 995 1031 1067 N
+ AY CH ZH s n/a 7 988 1031 1067 N
+ AY D AA b n/a 7 986 1046 1092 N
+ AY D AA e n/a 7 990 1051 1092 N
+ AY D AA i n/a 7 989 1050 1092 N
+ AY D AA s n/a 7 986 1053 1092 N
+ AY D AE b n/a 7 986 1040 1103 N
+ AY D AE e n/a 7 990 1040 1103 N
+ AY D AE i n/a 7 989 1040 1103 N
+ AY D AE s n/a 7 986 1040 1103 N
+ AY D AH b n/a 7 986 1040 1101 N
+ AY D AH e n/a 7 990 1040 1101 N
+ AY D AH i n/a 7 989 1040 1101 N
+ AY D AH s n/a 7 986 1040 1101 N
+ AY D AO e n/a 7 990 1051 1092 N
+ AY D AO s n/a 7 986 1053 1092 N
+ AY D AW e n/a 7 990 1051 1103 N
+ AY D AW s n/a 7 986 1053 1103 N
+ AY D AY b n/a 7 986 1040 1092 N
+ AY D AY e n/a 7 990 1040 1092 N
+ AY D AY s n/a 7 986 1040 1092 N
+ AY D B b n/a 7 986 1036 1070 N
+ AY D B e n/a 7 990 1036 1070 N
+ AY D B i n/a 7 990 1031 1070 N
+ AY D B s n/a 7 986 1036 1070 N
+ AY D CH e n/a 7 990 1061 1075 N
+ AY D CH i n/a 7 989 1061 1075 N
+ AY D CH s n/a 7 986 1061 1075 N
+ AY D D b n/a 7 986 1035 1067 N
+ AY D D e n/a 7 990 1035 1067 N
+ AY D D i n/a 7 990 1031 1068 N
+ AY D D s n/a 7 986 1035 1067 N
+ AY D DH b n/a 7 989 1031 1069 N
+ AY D DH e n/a 7 990 1031 1069 N
+ AY D DH i n/a 7 989 1031 1069 N
+ AY D DH s n/a 7 986 1031 1069 N
+ AY D EH b n/a 7 986 1040 1103 N
+ AY D EH e n/a 7 990 1040 1103 N
+ AY D EH i n/a 7 989 1040 1103 N
+ AY D EH s n/a 7 986 1040 1103 N
+ AY D ER b n/a 7 986 1046 1094 N
+ AY D ER e n/a 7 990 1051 1094 N
+ AY D ER i n/a 7 989 1050 1094 N
+ AY D ER s n/a 7 986 1053 1094 N
+ AY D EY b n/a 7 986 1040 1103 N
+ AY D EY e n/a 7 990 1040 1103 N
+ AY D EY i n/a 7 989 1040 1103 N
+ AY D EY s n/a 7 986 1040 1103 N
+ AY D F b n/a 7 986 1061 1084 N
+ AY D F e n/a 7 990 1061 1084 N
+ AY D F i n/a 7 989 1061 1082 N
+ AY D F s n/a 7 986 1061 1084 N
+ AY D G b n/a 7 986 1035 1077 N
+ AY D G e n/a 7 990 1035 1077 N
+ AY D G i n/a 7 990 1031 1077 N
+ AY D G s n/a 7 986 1035 1077 N
+ AY D HH b n/a 7 986 1064 1072 N
+ AY D HH e n/a 7 990 1064 1072 N
+ AY D HH i n/a 7 989 1066 1072 N
+ AY D HH s n/a 7 986 1064 1072 N
+ AY D IH b n/a 7 986 1040 1103 N
+ AY D IH e n/a 7 990 1040 1103 N
+ AY D IH i n/a 7 989 1040 1097 N
+ AY D IH s n/a 7 986 1040 1103 N
+ AY D IY b n/a 7 986 1040 1102 N
+ AY D IY e n/a 7 990 1040 1102 N
+ AY D IY i n/a 7 989 1040 1095 N
+ AY D IY s n/a 7 986 1040 1102 N
+ AY D JH b n/a 7 986 1035 1067 N
+ AY D JH e n/a 7 990 1035 1067 N
+ AY D JH i n/a 7 989 1031 1067 N
+ AY D JH s n/a 7 986 1035 1067 N
+ AY D K b n/a 7 986 1061 1077 N
+ AY D K e n/a 7 990 1061 1077 N
+ AY D K i n/a 7 989 1061 1077 N
+ AY D K s n/a 7 986 1061 1077 N
+ AY D L b n/a 7 986 1046 1091 N
+ AY D L e n/a 7 990 1051 1087 N
+ AY D L i n/a 7 989 1045 1090 N
+ AY D L s n/a 7 986 1053 1087 N
+ AY D M b n/a 7 986 1036 1098 N
+ AY D M e n/a 7 990 1036 1098 N
+ AY D M i n/a 7 989 1039 1099 N
+ AY D M s n/a 7 986 1036 1098 N
+ AY D N b n/a 7 986 1043 1096 N
+ AY D N e n/a 7 990 1043 1096 N
+ AY D N i n/a 7 989 1044 1095 N
+ AY D N s n/a 7 986 1043 1096 N
+ AY D NG e n/a 7 990 1040 1096 N
+ AY D NG s n/a 7 986 1040 1096 N
+ AY D OW b n/a 7 986 1046 1092 N
+ AY D OW e n/a 7 990 1051 1092 N
+ AY D OW i n/a 7 989 1050 1092 N
+ AY D OW s n/a 7 986 1053 1092 N
+ AY D OY e n/a 7 990 1040 1092 N
+ AY D OY s n/a 7 986 1040 1092 N
+ AY D P b n/a 7 986 1061 1076 N
+ AY D P e n/a 7 990 1061 1076 N
+ AY D P i n/a 7 989 1061 1075 N
+ AY D P s n/a 7 986 1061 1076 N
+ AY D R b n/a 7 986 1046 1093 N
+ AY D R e n/a 7 990 1051 1093 N
+ AY D R i n/a 7 989 1050 1094 N
+ AY D R s n/a 7 986 1053 1093 N
+ AY D S b n/a 7 986 1061 1083 N
+ AY D S e n/a 7 990 1061 1084 N
+ AY D S i n/a 7 989 1061 1083 N
+ AY D S s n/a 7 986 1061 1084 N
+ AY D SH b n/a 7 986 1061 1084 N
+ AY D SH e n/a 7 990 1061 1084 N
+ AY D SH s n/a 7 986 1061 1084 N
+ AY D SIL e n/a 7 990 1031 1086 N
+ AY D SIL s n/a 7 986 1065 1086 N
+ AY D T b n/a 7 986 1061 1075 N
+ AY D T e n/a 7 990 1061 1075 N
+ AY D T i n/a 7 989 1061 1078 N
+ AY D T s n/a 7 986 1061 1075 N
+ AY D TH b n/a 7 986 1061 1084 N
+ AY D TH e n/a 7 990 1061 1084 N
+ AY D TH s n/a 7 986 1061 1084 N
+ AY D UH b n/a 7 986 1046 1093 N
+ AY D UH e n/a 7 990 1051 1093 N
+ AY D UH s n/a 7 986 1053 1093 N
+ AY D UW b n/a 7 986 1046 1092 N
+ AY D UW e n/a 7 990 1051 1092 N
+ AY D UW i n/a 7 989 1050 1092 N
+ AY D UW s n/a 7 986 1053 1092 N
+ AY D V b n/a 7 989 1036 1070 N
+ AY D V e n/a 7 990 1036 1069 N
+ AY D V i n/a 7 989 1031 1069 N
+ AY D V s n/a 7 986 1036 1069 N
+ AY D W b n/a 7 986 1046 1087 N
+ AY D W e n/a 7 990 1051 1087 N
+ AY D W s n/a 7 986 1053 1088 N
+ AY D Y b n/a 7 986 1031 1102 N
+ AY D Y e n/a 7 990 1031 1102 N
+ AY D Y s n/a 7 986 1031 1102 N
+ AY D Z b n/a 7 990 1031 1074 N
+ AY D Z e n/a 7 990 1031 1073 N
+ AY D Z i n/a 7 989 1031 1073 N
+ AY D Z s n/a 7 986 1031 1073 N
+ AY D ZH e n/a 7 990 1031 1067 N
+ AY D ZH s n/a 7 986 1031 1067 N
+ AY DH AA b n/a 7 993 1046 1092 N
+ AY DH AA e n/a 7 993 1051 1092 N
+ AY DH AA s n/a 7 994 1053 1092 N
+ AY DH AE b n/a 7 993 1040 1103 N
+ AY DH AE e n/a 7 993 1040 1103 N
+ AY DH AE s n/a 7 994 1040 1103 N
+ AY DH AH b n/a 7 993 1040 1101 N
+ AY DH AH e n/a 7 993 1040 1101 N
+ AY DH AH s n/a 7 994 1040 1101 N
+ AY DH AO e n/a 7 993 1051 1092 N
+ AY DH AO s n/a 7 994 1053 1092 N
+ AY DH AW e n/a 7 993 1051 1103 N
+ AY DH AW s n/a 7 994 1053 1103 N
+ AY DH AY b n/a 7 993 1040 1092 N
+ AY DH AY e n/a 7 993 1040 1092 N
+ AY DH AY s n/a 7 994 1040 1092 N
+ AY DH B b n/a 7 994 1036 1070 N
+ AY DH B e n/a 7 994 1036 1070 N
+ AY DH B s n/a 7 994 1036 1070 N
+ AY DH CH e n/a 7 991 1061 1075 N
+ AY DH CH s n/a 7 991 1061 1075 N
+ AY DH D b n/a 7 994 1035 1067 N
+ AY DH D e n/a 7 994 1035 1067 N
+ AY DH D s n/a 7 994 1035 1067 N
+ AY DH DH b n/a 7 993 1031 1069 N
+ AY DH DH e n/a 7 993 1031 1069 N
+ AY DH DH s n/a 7 994 1031 1069 N
+ AY DH EH b n/a 7 993 1040 1103 N
+ AY DH EH e n/a 7 993 1040 1103 N
+ AY DH EH s n/a 7 994 1040 1103 N
+ AY DH ER b n/a 7 993 1046 1094 N
+ AY DH ER e n/a 7 993 1051 1094 N
+ AY DH ER s n/a 7 994 1053 1094 N
+ AY DH EY b n/a 7 993 1040 1103 N
+ AY DH EY e n/a 7 993 1040 1103 N
+ AY DH EY s n/a 7 994 1040 1103 N
+ AY DH F b n/a 7 991 1061 1084 N
+ AY DH F e n/a 7 991 1061 1084 N
+ AY DH F s n/a 7 991 1061 1084 N
+ AY DH G b n/a 7 994 1035 1077 N
+ AY DH G e n/a 7 994 1035 1077 N
+ AY DH G s n/a 7 994 1035 1077 N
+ AY DH HH b n/a 7 991 1064 1072 N
+ AY DH HH e n/a 7 991 1064 1072 N
+ AY DH HH s n/a 7 991 1064 1072 N
+ AY DH IH b n/a 7 993 1040 1103 N
+ AY DH IH e n/a 7 993 1040 1103 N
+ AY DH IH s n/a 7 994 1040 1103 N
+ AY DH IY b n/a 7 993 1040 1102 N
+ AY DH IY e n/a 7 993 1040 1102 N
+ AY DH IY s n/a 7 994 1040 1102 N
+ AY DH JH b n/a 7 994 1035 1067 N
+ AY DH JH e n/a 7 994 1035 1067 N
+ AY DH JH s n/a 7 994 1035 1067 N
+ AY DH K b n/a 7 991 1061 1077 N
+ AY DH K e n/a 7 991 1061 1077 N
+ AY DH K s n/a 7 991 1061 1077 N
+ AY DH L b n/a 7 993 1046 1089 N
+ AY DH L e n/a 7 993 1051 1087 N
+ AY DH L i n/a 7 993 1045 1090 N
+ AY DH L s n/a 7 994 1053 1087 N
+ AY DH M b n/a 7 992 1036 1098 N
+ AY DH M e n/a 7 992 1036 1098 N
+ AY DH M s n/a 7 994 1036 1098 N
+ AY DH N b n/a 7 992 1043 1096 N
+ AY DH N e n/a 7 992 1043 1096 N
+ AY DH N i n/a 7 992 1037 1095 N
+ AY DH N s n/a 7 994 1043 1096 N
+ AY DH NG e n/a 7 992 1040 1096 N
+ AY DH NG s n/a 7 994 1040 1096 N
+ AY DH OW b n/a 7 993 1046 1092 N
+ AY DH OW e n/a 7 993 1051 1092 N
+ AY DH OW s n/a 7 994 1053 1092 N
+ AY DH OY e n/a 7 993 1040 1092 N
+ AY DH OY s n/a 7 994 1040 1092 N
+ AY DH P b n/a 7 991 1061 1076 N
+ AY DH P e n/a 7 991 1061 1076 N
+ AY DH P s n/a 7 991 1061 1076 N
+ AY DH R b n/a 7 993 1046 1093 N
+ AY DH R e n/a 7 993 1051 1093 N
+ AY DH R s n/a 7 994 1053 1093 N
+ AY DH S b n/a 7 991 1061 1083 N
+ AY DH S e n/a 7 991 1061 1084 N
+ AY DH S s n/a 7 991 1061 1084 N
+ AY DH SH b n/a 7 991 1061 1084 N
+ AY DH SH e n/a 7 991 1061 1084 N
+ AY DH SH s n/a 7 991 1061 1084 N
+ AY DH SIL e n/a 7 993 1031 1086 N
+ AY DH SIL s n/a 7 994 1065 1086 N
+ AY DH T b n/a 7 991 1061 1075 N
+ AY DH T e n/a 7 991 1061 1075 N
+ AY DH T s n/a 7 991 1061 1075 N
+ AY DH TH b n/a 7 991 1061 1084 N
+ AY DH TH e n/a 7 991 1061 1084 N
+ AY DH TH s n/a 7 991 1061 1084 N
+ AY DH UH b n/a 7 993 1046 1093 N
+ AY DH UH e n/a 7 993 1051 1093 N
+ AY DH UH s n/a 7 994 1053 1093 N
+ AY DH UW b n/a 7 993 1046 1092 N
+ AY DH UW e n/a 7 993 1051 1092 N
+ AY DH UW s n/a 7 994 1053 1092 N
+ AY DH V b n/a 7 994 1036 1070 N
+ AY DH V e n/a 7 994 1036 1069 N
+ AY DH V s n/a 7 994 1036 1069 N
+ AY DH W b n/a 7 993 1046 1087 N
+ AY DH W e n/a 7 993 1051 1087 N
+ AY DH W s n/a 7 994 1053 1088 N
+ AY DH Y b n/a 7 993 1031 1102 N
+ AY DH Y e n/a 7 993 1031 1102 N
+ AY DH Y s n/a 7 994 1031 1102 N
+ AY DH Z b n/a 7 993 1031 1074 N
+ AY DH Z e n/a 7 993 1031 1073 N
+ AY DH Z i n/a 7 993 1031 1073 N
+ AY DH Z s n/a 7 994 1031 1073 N
+ AY DH ZH e n/a 7 993 1031 1067 N
+ AY DH ZH s n/a 7 994 1031 1067 N
+ AY EH AA b n/a 7 986 1046 1092 N
+ AY EH AA s n/a 7 986 1053 1092 N
+ AY EH AE b n/a 7 986 1040 1103 N
+ AY EH AE s n/a 7 986 1040 1103 N
+ AY EH AH b n/a 7 986 1040 1101 N
+ AY EH AH s n/a 7 986 1040 1101 N
+ AY EH AO s n/a 7 986 1053 1092 N
+ AY EH AW s n/a 7 986 1053 1103 N
+ AY EH AY b n/a 7 986 1040 1092 N
+ AY EH AY s n/a 7 986 1040 1092 N
+ AY EH B b n/a 7 986 1036 1070 N
+ AY EH B s n/a 7 986 1036 1070 N
+ AY EH CH s n/a 7 986 1061 1075 N
+ AY EH D b n/a 7 986 1035 1067 N
+ AY EH D s n/a 7 986 1035 1067 N
+ AY EH DH b n/a 7 989 1031 1069 N
+ AY EH DH s n/a 7 986 1031 1069 N
+ AY EH EH b n/a 7 986 1040 1103 N
+ AY EH EH s n/a 7 986 1040 1103 N
+ AY EH ER b n/a 7 986 1046 1094 N
+ AY EH ER s n/a 7 986 1053 1094 N
+ AY EH EY b n/a 7 986 1040 1103 N
+ AY EH EY s n/a 7 986 1040 1103 N
+ AY EH F b n/a 7 986 1061 1084 N
+ AY EH F s n/a 7 986 1061 1084 N
+ AY EH G b n/a 7 986 1035 1077 N
+ AY EH G s n/a 7 986 1035 1077 N
+ AY EH HH b n/a 7 986 1064 1072 N
+ AY EH HH s n/a 7 986 1064 1072 N
+ AY EH IH b n/a 7 986 1040 1103 N
+ AY EH IH s n/a 7 986 1040 1103 N
+ AY EH IY b n/a 7 986 1040 1102 N
+ AY EH IY s n/a 7 986 1040 1102 N
+ AY EH JH b n/a 7 986 1035 1067 N
+ AY EH JH s n/a 7 986 1035 1067 N
+ AY EH K b n/a 7 986 1061 1077 N
+ AY EH K s n/a 7 986 1061 1077 N
+ AY EH L b n/a 7 986 1046 1089 N
+ AY EH L s n/a 7 986 1053 1087 N
+ AY EH M b n/a 7 986 1036 1098 N
+ AY EH M s n/a 7 986 1036 1098 N
+ AY EH N b n/a 7 986 1043 1096 N
+ AY EH N s n/a 7 986 1043 1096 N
+ AY EH NG s n/a 7 986 1040 1096 N
+ AY EH OW b n/a 7 986 1046 1092 N
+ AY EH OW s n/a 7 986 1053 1092 N
+ AY EH OY s n/a 7 986 1040 1092 N
+ AY EH P b n/a 7 986 1061 1076 N
+ AY EH P s n/a 7 986 1061 1076 N
+ AY EH R b n/a 7 986 1046 1093 N
+ AY EH R s n/a 7 986 1053 1093 N
+ AY EH S b n/a 7 986 1061 1083 N
+ AY EH S s n/a 7 986 1061 1084 N
+ AY EH SH b n/a 7 986 1061 1084 N
+ AY EH SH s n/a 7 986 1061 1084 N
+ AY EH SIL s n/a 7 987 1065 1086 N
+ AY EH T b n/a 7 986 1061 1075 N
+ AY EH T i n/a 7 989 1061 1078 N
+ AY EH T s n/a 7 986 1061 1075 N
+ AY EH TH b n/a 7 986 1061 1084 N
+ AY EH TH s n/a 7 986 1061 1084 N
+ AY EH UH b n/a 7 986 1046 1093 N
+ AY EH UH s n/a 7 986 1053 1093 N
+ AY EH UW b n/a 7 986 1046 1092 N
+ AY EH UW s n/a 7 986 1053 1092 N
+ AY EH V b n/a 7 989 1036 1070 N
+ AY EH V s n/a 7 986 1036 1069 N
+ AY EH W b n/a 7 986 1046 1087 N
+ AY EH W s n/a 7 986 1053 1088 N
+ AY EH Y b n/a 7 986 1031 1102 N
+ AY EH Y s n/a 7 986 1031 1102 N
+ AY EH Z b n/a 7 990 1031 1074 N
+ AY EH Z s n/a 7 986 1031 1073 N
+ AY EH ZH s n/a 7 986 1031 1067 N
+ AY ER AA b n/a 7 1026 1046 1092 N
+ AY ER AA e n/a 7 1025 1051 1092 N
+ AY ER AA i n/a 7 1025 1050 1092 N
+ AY ER AA s n/a 7 1026 1053 1092 N
+ AY ER AE b n/a 7 1026 1040 1103 N
+ AY ER AE e n/a 7 1025 1040 1103 N
+ AY ER AE s n/a 7 1026 1040 1103 N
+ AY ER AH b n/a 7 1026 1040 1101 N
+ AY ER AH e n/a 7 1025 1040 1101 N
+ AY ER AH i n/a 7 1025 1040 1100 N
+ AY ER AH s n/a 7 1026 1040 1101 N
+ AY ER AO e n/a 7 1025 1051 1092 N
+ AY ER AO s n/a 7 1026 1053 1092 N
+ AY ER AW e n/a 7 1025 1051 1103 N
+ AY ER AW s n/a 7 1026 1053 1103 N
+ AY ER AY b n/a 7 1026 1040 1092 N
+ AY ER AY e n/a 7 1025 1040 1092 N
+ AY ER AY s n/a 7 1026 1040 1092 N
+ AY ER B b n/a 7 1026 1036 1070 N
+ AY ER B e n/a 7 1025 1036 1070 N
+ AY ER B s n/a 7 1026 1036 1070 N
+ AY ER CH e n/a 7 1025 1061 1075 N
+ AY ER CH s n/a 7 1026 1061 1075 N
+ AY ER D b n/a 7 1026 1033 1067 N
+ AY ER D e n/a 7 1025 1033 1067 N
+ AY ER D i n/a 7 1025 1032 1068 N
+ AY ER D s n/a 7 1026 1033 1067 N
+ AY ER DH b n/a 7 1027 1032 1069 N
+ AY ER DH e n/a 7 1025 1032 1069 N
+ AY ER DH s n/a 7 1027 1032 1069 N
+ AY ER EH b n/a 7 1026 1040 1103 N
+ AY ER EH e n/a 7 1025 1040 1103 N
+ AY ER EH s n/a 7 1026 1040 1103 N
+ AY ER ER b n/a 7 1026 1046 1094 N
+ AY ER ER e n/a 7 1025 1051 1094 N
+ AY ER ER s n/a 7 1026 1053 1094 N
+ AY ER EY b n/a 7 1026 1040 1103 N
+ AY ER EY e n/a 7 1025 1040 1103 N
+ AY ER EY s n/a 7 1026 1040 1103 N
+ AY ER F b n/a 7 1026 1061 1084 N
+ AY ER F e n/a 7 1025 1061 1084 N
+ AY ER F i n/a 7 1024 1060 1083 N
+ AY ER F s n/a 7 1026 1061 1084 N
+ AY ER G b n/a 7 1026 1033 1077 N
+ AY ER G e n/a 7 1025 1033 1077 N
+ AY ER G s n/a 7 1026 1033 1077 N
+ AY ER HH b n/a 7 1026 1064 1072 N
+ AY ER HH e n/a 7 1025 1064 1072 N
+ AY ER HH s n/a 7 1026 1064 1072 N
+ AY ER IH b n/a 7 1026 1040 1103 N
+ AY ER IH e n/a 7 1025 1040 1103 N
+ AY ER IH s n/a 7 1026 1040 1103 N
+ AY ER IY b n/a 7 1026 1040 1102 N
+ AY ER IY e n/a 7 1025 1040 1102 N
+ AY ER IY i n/a 7 1025 1040 1095 N
+ AY ER IY s n/a 7 1026 1040 1102 N
+ AY ER JH b n/a 7 1026 1033 1067 N
+ AY ER JH e n/a 7 1025 1033 1067 N
+ AY ER JH s n/a 7 1026 1033 1067 N
+ AY ER K b n/a 7 1026 1061 1077 N
+ AY ER K e n/a 7 1025 1061 1077 N
+ AY ER K i n/a 7 1024 1060 1077 N
+ AY ER K s n/a 7 1026 1061 1077 N
+ AY ER L b n/a 7 1026 1046 1089 N
+ AY ER L e n/a 7 1025 1051 1087 N
+ AY ER L s n/a 7 1026 1053 1087 N
+ AY ER M b n/a 7 1026 1036 1098 N
+ AY ER M e n/a 7 1025 1036 1098 N
+ AY ER M s n/a 7 1026 1036 1098 N
+ AY ER N b n/a 7 1026 1043 1096 N
+ AY ER N e n/a 7 1025 1043 1096 N
+ AY ER N i n/a 7 1025 1037 1095 N
+ AY ER N s n/a 7 1026 1043 1096 N
+ AY ER NG e n/a 7 1025 1040 1096 N
+ AY ER NG s n/a 7 1026 1040 1096 N
+ AY ER OW b n/a 7 1026 1046 1092 N
+ AY ER OW e n/a 7 1025 1051 1092 N
+ AY ER OW s n/a 7 1026 1053 1092 N
+ AY ER OY e n/a 7 1025 1040 1092 N
+ AY ER OY s n/a 7 1026 1040 1092 N
+ AY ER P b n/a 7 1026 1061 1076 N
+ AY ER P e n/a 7 1025 1061 1076 N
+ AY ER P s n/a 7 1026 1061 1076 N
+ AY ER R b n/a 7 1026 1046 1093 N
+ AY ER R e n/a 7 1025 1051 1093 N
+ AY ER R i n/a 7 1025 1050 1094 N
+ AY ER R s n/a 7 1026 1053 1093 N
+ AY ER S b n/a 7 1026 1061 1083 N
+ AY ER S e n/a 7 1025 1061 1084 N
+ AY ER S i n/a 7 1024 1060 1083 N
+ AY ER S s n/a 7 1026 1061 1084 N
+ AY ER SH b n/a 7 1026 1061 1084 N
+ AY ER SH e n/a 7 1025 1061 1084 N
+ AY ER SH s n/a 7 1026 1061 1084 N
+ AY ER SIL e n/a 7 1025 1032 1086 N
+ AY ER SIL s n/a 7 1026 1065 1086 N
+ AY ER T b n/a 7 1026 1061 1075 N
+ AY ER T e n/a 7 1025 1061 1075 N
+ AY ER T i n/a 7 1024 1060 1079 N
+ AY ER T s n/a 7 1026 1061 1075 N
+ AY ER TH b n/a 7 1026 1061 1084 N
+ AY ER TH e n/a 7 1025 1061 1084 N
+ AY ER TH s n/a 7 1026 1061 1084 N
+ AY ER UH b n/a 7 1026 1046 1093 N
+ AY ER UH e n/a 7 1025 1051 1093 N
+ AY ER UH s n/a 7 1026 1053 1093 N
+ AY ER UW b n/a 7 1026 1046 1092 N
+ AY ER UW e n/a 7 1025 1051 1092 N
+ AY ER UW s n/a 7 1026 1053 1092 N
+ AY ER V b n/a 7 1027 1036 1070 N
+ AY ER V e n/a 7 1025 1036 1069 N
+ AY ER V i n/a 7 1025 1032 1069 N
+ AY ER V s n/a 7 1027 1036 1069 N
+ AY ER W b n/a 7 1026 1046 1087 N
+ AY ER W e n/a 7 1025 1051 1087 N
+ AY ER W s n/a 7 1026 1053 1088 N
+ AY ER Y b n/a 7 1026 1032 1102 N
+ AY ER Y e n/a 7 1025 1032 1102 N
+ AY ER Y s n/a 7 1026 1032 1102 N
+ AY ER Z b n/a 7 1027 1032 1074 N
+ AY ER Z e n/a 7 1025 1032 1073 N
+ AY ER Z i n/a 7 1025 1032 1073 N
+ AY ER Z s n/a 7 1027 1032 1073 N
+ AY ER ZH e n/a 7 1025 1032 1067 N
+ AY ER ZH s n/a 7 1027 1032 1067 N
+ AY EY AA b n/a 7 987 1046 1092 N
+ AY EY AA e n/a 7 990 1051 1092 N
+ AY EY AA s n/a 7 987 1053 1092 N
+ AY EY AE b n/a 7 987 1040 1103 N
+ AY EY AE e n/a 7 990 1040 1103 N
+ AY EY AE s n/a 7 987 1040 1103 N
+ AY EY AH b n/a 7 987 1040 1101 N
+ AY EY AH e n/a 7 990 1040 1101 N
+ AY EY AH s n/a 7 987 1040 1101 N
+ AY EY AO e n/a 7 990 1051 1092 N
+ AY EY AO s n/a 7 987 1053 1092 N
+ AY EY AW e n/a 7 990 1051 1103 N
+ AY EY AW s n/a 7 987 1053 1103 N
+ AY EY AY b n/a 7 987 1040 1092 N
+ AY EY AY e n/a 7 990 1040 1092 N
+ AY EY AY s n/a 7 987 1040 1092 N
+ AY EY B b n/a 7 987 1036 1070 N
+ AY EY B e n/a 7 990 1036 1070 N
+ AY EY B s n/a 7 987 1036 1070 N
+ AY EY CH e n/a 7 990 1061 1075 N
+ AY EY CH s n/a 7 987 1061 1075 N
+ AY EY D b n/a 7 987 1035 1067 N
+ AY EY D e n/a 7 990 1035 1067 N
+ AY EY D s n/a 7 987 1035 1067 N
+ AY EY DH b n/a 7 989 1031 1069 N
+ AY EY DH e n/a 7 990 1031 1069 N
+ AY EY DH s n/a 7 987 1031 1069 N
+ AY EY EH b n/a 7 987 1040 1103 N
+ AY EY EH e n/a 7 990 1040 1103 N
+ AY EY EH s n/a 7 987 1040 1103 N
+ AY EY ER b n/a 7 987 1046 1094 N
+ AY EY ER e n/a 7 990 1051 1094 N
+ AY EY ER s n/a 7 987 1053 1094 N
+ AY EY EY b n/a 7 987 1040 1103 N
+ AY EY EY e n/a 7 990 1040 1103 N
+ AY EY EY s n/a 7 987 1040 1103 N
+ AY EY F b n/a 7 987 1061 1084 N
+ AY EY F e n/a 7 990 1061 1084 N
+ AY EY F s n/a 7 987 1061 1084 N
+ AY EY G b n/a 7 987 1035 1077 N
+ AY EY G e n/a 7 990 1035 1077 N
+ AY EY G s n/a 7 987 1035 1077 N
+ AY EY HH b n/a 7 987 1064 1072 N
+ AY EY HH e n/a 7 990 1064 1072 N
+ AY EY HH s n/a 7 987 1064 1072 N
+ AY EY IH b n/a 7 987 1040 1103 N
+ AY EY IH e n/a 7 990 1040 1103 N
+ AY EY IH s n/a 7 987 1040 1103 N
+ AY EY IY b n/a 7 987 1040 1102 N
+ AY EY IY e n/a 7 990 1040 1102 N
+ AY EY IY s n/a 7 987 1040 1102 N
+ AY EY JH b n/a 7 987 1035 1067 N
+ AY EY JH e n/a 7 990 1035 1067 N
+ AY EY JH s n/a 7 987 1035 1067 N
+ AY EY K b n/a 7 987 1061 1077 N
+ AY EY K e n/a 7 990 1061 1077 N
+ AY EY K s n/a 7 987 1061 1077 N
+ AY EY L b n/a 7 987 1046 1089 N
+ AY EY L e n/a 7 990 1051 1087 N
+ AY EY L s n/a 7 987 1053 1087 N
+ AY EY M b n/a 7 987 1036 1098 N
+ AY EY M e n/a 7 990 1036 1098 N
+ AY EY M s n/a 7 987 1036 1098 N
+ AY EY N b n/a 7 987 1043 1096 N
+ AY EY N e n/a 7 990 1043 1096 N
+ AY EY N s n/a 7 987 1043 1096 N
+ AY EY NG e n/a 7 990 1040 1096 N
+ AY EY NG s n/a 7 987 1040 1096 N
+ AY EY OW b n/a 7 987 1046 1092 N
+ AY EY OW e n/a 7 990 1051 1092 N
+ AY EY OW s n/a 7 987 1053 1092 N
+ AY EY OY e n/a 7 990 1040 1092 N
+ AY EY OY s n/a 7 987 1040 1092 N
+ AY EY P b n/a 7 987 1061 1076 N
+ AY EY P e n/a 7 990 1061 1076 N
+ AY EY P s n/a 7 987 1061 1076 N
+ AY EY R b n/a 7 987 1046 1093 N
+ AY EY R e n/a 7 990 1051 1093 N
+ AY EY R s n/a 7 987 1053 1093 N
+ AY EY S b n/a 7 987 1061 1083 N
+ AY EY S e n/a 7 990 1061 1084 N
+ AY EY S s n/a 7 987 1061 1084 N
+ AY EY SH b n/a 7 987 1061 1084 N
+ AY EY SH e n/a 7 990 1061 1084 N
+ AY EY SH s n/a 7 987 1061 1084 N
+ AY EY SIL e n/a 7 990 1031 1086 N
+ AY EY SIL s n/a 7 987 1065 1086 N
+ AY EY T b n/a 7 987 1061 1075 N
+ AY EY T e n/a 7 990 1061 1075 N
+ AY EY T s n/a 7 987 1061 1075 N
+ AY EY TH b n/a 7 987 1061 1084 N
+ AY EY TH e n/a 7 990 1061 1084 N
+ AY EY TH s n/a 7 987 1061 1084 N
+ AY EY UH b n/a 7 987 1046 1093 N
+ AY EY UH e n/a 7 990 1051 1093 N
+ AY EY UH s n/a 7 987 1053 1093 N
+ AY EY UW b n/a 7 987 1046 1092 N
+ AY EY UW e n/a 7 990 1051 1092 N
+ AY EY UW s n/a 7 987 1053 1092 N
+ AY EY V b n/a 7 989 1036 1070 N
+ AY EY V e n/a 7 990 1036 1069 N
+ AY EY V s n/a 7 987 1036 1069 N
+ AY EY W b n/a 7 987 1046 1087 N
+ AY EY W e n/a 7 990 1051 1087 N
+ AY EY W s n/a 7 987 1053 1088 N
+ AY EY Y b n/a 7 987 1031 1102 N
+ AY EY Y e n/a 7 990 1031 1102 N
+ AY EY Y s n/a 7 987 1031 1102 N
+ AY EY Z b n/a 7 990 1031 1074 N
+ AY EY Z e n/a 7 990 1031 1073 N
+ AY EY Z s n/a 7 987 1031 1073 N
+ AY EY ZH e n/a 7 990 1031 1067 N
+ AY EY ZH s n/a 7 987 1031 1067 N
+ AY F AA b n/a 7 1012 1046 1092 N
+ AY F AA e n/a 7 1012 1051 1092 N
+ AY F AA s n/a 7 1013 1053 1092 N
+ AY F AE b n/a 7 1012 1041 1103 N
+ AY F AE e n/a 7 1012 1041 1103 N
+ AY F AE i n/a 7 1012 1042 1103 N
+ AY F AE s n/a 7 1013 1041 1103 N
+ AY F AH b n/a 7 1012 1041 1101 N
+ AY F AH e n/a 7 1012 1041 1101 N
+ AY F AH i n/a 7 1012 1042 1101 N
+ AY F AH s n/a 7 1013 1041 1101 N
+ AY F AO e n/a 7 1012 1051 1092 N
+ AY F AO s n/a 7 1013 1053 1092 N
+ AY F AW e n/a 7 1012 1051 1103 N
+ AY F AW s n/a 7 1013 1053 1103 N
+ AY F AY b n/a 7 1012 1041 1092 N
+ AY F AY e n/a 7 1012 1041 1092 N
+ AY F AY s n/a 7 1013 1041 1092 N
+ AY F B b n/a 7 1012 1033 1070 N
+ AY F B e n/a 7 1012 1033 1070 N
+ AY F B i n/a 7 1012 1029 1070 N
+ AY F B s n/a 7 1013 1033 1070 N
+ AY F CH e n/a 7 1012 1057 1075 N
+ AY F CH s n/a 7 1013 1061 1075 N
+ AY F D b n/a 7 1013 1033 1067 N
+ AY F D e n/a 7 1013 1033 1067 N
+ AY F D i n/a 7 1013 1029 1068 N
+ AY F D s n/a 7 1013 1033 1067 N
+ AY F DH b n/a 7 1011 1034 1069 N
+ AY F DH e n/a 7 1011 1034 1069 N
+ AY F DH s n/a 7 1011 1034 1069 N
+ AY F EH b n/a 7 1012 1041 1103 N
+ AY F EH e n/a 7 1012 1041 1103 N
+ AY F EH i n/a 7 1012 1042 1103 N
+ AY F EH s n/a 7 1013 1041 1103 N
+ AY F ER b n/a 7 1012 1046 1094 N
+ AY F ER e n/a 7 1012 1051 1094 N
+ AY F ER i n/a 7 1012 1049 1094 N
+ AY F ER s n/a 7 1013 1053 1094 N
+ AY F EY b n/a 7 1012 1041 1103 N
+ AY F EY e n/a 7 1012 1041 1103 N
+ AY F EY s n/a 7 1013 1041 1103 N
+ AY F F b n/a 7 1012 1057 1084 N
+ AY F F e n/a 7 1012 1057 1084 N
+ AY F F i n/a 7 1012 1057 1083 N
+ AY F F s n/a 7 1013 1061 1084 N
+ AY F G b n/a 7 1012 1033 1077 N
+ AY F G e n/a 7 1012 1033 1077 N
+ AY F G i n/a 7 1012 1028 1077 N
+ AY F G s n/a 7 1013 1033 1077 N
+ AY F HH b n/a 7 1011 1057 1072 N
+ AY F HH e n/a 7 1011 1057 1072 N
+ AY F HH s n/a 7 1011 1064 1072 N
+ AY F IH b n/a 7 1012 1041 1103 N
+ AY F IH e n/a 7 1012 1041 1103 N
+ AY F IH i n/a 7 1012 1042 1097 N
+ AY F IH s n/a 7 1013 1041 1103 N
+ AY F IY b n/a 7 1012 1041 1102 N
+ AY F IY e n/a 7 1012 1041 1102 N
+ AY F IY s n/a 7 1013 1041 1102 N
+ AY F JH b n/a 7 1012 1033 1067 N
+ AY F JH e n/a 7 1012 1033 1067 N
+ AY F JH s n/a 7 1013 1033 1067 N
+ AY F K b n/a 7 1005 1057 1077 N
+ AY F K e n/a 7 1005 1057 1077 N
+ AY F K i n/a 7 1005 1057 1077 N
+ AY F K s n/a 7 1005 1061 1077 N
+ AY F L b n/a 7 1012 1046 1089 N
+ AY F L e n/a 7 1012 1051 1087 N
+ AY F L i n/a 7 1012 1045 1090 N
+ AY F L s n/a 7 1013 1053 1087 N
+ AY F M b n/a 7 1014 1029 1098 N
+ AY F M e n/a 7 1014 1029 1098 N
+ AY F M i n/a 7 1014 1037 1099 N
+ AY F M s n/a 7 1014 1029 1098 N
+ AY F N b n/a 7 1014 1043 1096 N
+ AY F N e n/a 7 1014 1043 1096 N
+ AY F N i n/a 7 1014 1037 1095 N
+ AY F N s n/a 7 1014 1043 1096 N
+ AY F NG e n/a 7 1014 1041 1096 N
+ AY F NG i n/a 7 1014 1037 1095 N
+ AY F NG s n/a 7 1014 1041 1096 N
+ AY F OW b n/a 7 1012 1046 1092 N
+ AY F OW e n/a 7 1012 1051 1092 N
+ AY F OW i n/a 7 1012 1049 1092 N
+ AY F OW s n/a 7 1013 1053 1092 N
+ AY F OY e n/a 7 1012 1041 1092 N
+ AY F OY s n/a 7 1013 1041 1092 N
+ AY F P b n/a 7 1005 1057 1076 N
+ AY F P e n/a 7 1005 1057 1076 N
+ AY F P i n/a 7 1005 1057 1075 N
+ AY F P s n/a 7 1005 1061 1076 N
+ AY F R b n/a 7 1012 1046 1093 N
+ AY F R e n/a 7 1012 1051 1093 N
+ AY F R i n/a 7 1012 1049 1094 N
+ AY F R s n/a 7 1013 1053 1093 N
+ AY F S b n/a 7 1013 1057 1083 N
+ AY F S e n/a 7 1013 1057 1084 N
+ AY F S i n/a 7 1013 1057 1083 N
+ AY F S s n/a 7 1013 1061 1084 N
+ AY F SH b n/a 7 1012 1057 1084 N
+ AY F SH e n/a 7 1012 1057 1084 N
+ AY F SH s n/a 7 1013 1061 1084 N
+ AY F SIL e n/a 7 1011 1030 1086 N
+ AY F SIL s n/a 7 1011 1065 1085 N
+ AY F T b n/a 7 1005 1057 1075 N
+ AY F T e n/a 7 1005 1057 1075 N
+ AY F T i n/a 7 1005 1057 1078 N
+ AY F T s n/a 7 1005 1061 1075 N
+ AY F TH b n/a 7 1013 1057 1084 N
+ AY F TH e n/a 7 1013 1057 1084 N
+ AY F TH i n/a 7 1013 1057 1083 N
+ AY F TH s n/a 7 1013 1061 1084 N
+ AY F UH b n/a 7 1012 1046 1093 N
+ AY F UH e n/a 7 1012 1051 1093 N
+ AY F UH s n/a 7 1013 1053 1093 N
+ AY F UW b n/a 7 1012 1046 1092 N
+ AY F UW e n/a 7 1012 1051 1092 N
+ AY F UW s n/a 7 1013 1053 1092 N
+ AY F V b n/a 7 1011 1029 1070 N
+ AY F V e n/a 7 1011 1029 1069 N
+ AY F V i n/a 7 1011 1029 1069 N
+ AY F V s n/a 7 1011 1029 1069 N
+ AY F W b n/a 7 1012 1046 1087 N
+ AY F W e n/a 7 1012 1051 1087 N
+ AY F W s n/a 7 1013 1053 1088 N
+ AY F Y b n/a 7 1012 1028 1102 N
+ AY F Y e n/a 7 1012 1028 1102 N
+ AY F Y s n/a 7 1013 1028 1102 N
+ AY F Z b n/a 7 1011 1029 1074 N
+ AY F Z e n/a 7 1011 1029 1073 N
+ AY F Z i n/a 7 1011 1029 1073 N
+ AY F Z s n/a 7 1011 1029 1073 N
+ AY F ZH e n/a 7 1011 1028 1067 N
+ AY F ZH s n/a 7 1011 1028 1067 N
+ AY G AA b n/a 7 987 1046 1092 N
+ AY G AA e n/a 7 990 1051 1092 N
+ AY G AA i n/a 7 989 1050 1092 N
+ AY G AA s n/a 7 987 1053 1092 N
+ AY G AE b n/a 7 987 1040 1103 N
+ AY G AE e n/a 7 990 1040 1103 N
+ AY G AE s n/a 7 987 1040 1103 N
+ AY G AH b n/a 7 987 1040 1101 N
+ AY G AH e n/a 7 990 1040 1101 N
+ AY G AH i n/a 7 989 1040 1101 N
+ AY G AH s n/a 7 987 1040 1101 N
+ AY G AO e n/a 7 990 1051 1092 N
+ AY G AO s n/a 7 987 1053 1092 N
+ AY G AW e n/a 7 990 1051 1103 N
+ AY G AW s n/a 7 987 1053 1103 N
+ AY G AY b n/a 7 987 1040 1092 N
+ AY G AY e n/a 7 990 1040 1092 N
+ AY G AY s n/a 7 987 1040 1092 N
+ AY G B b n/a 7 987 1036 1070 N
+ AY G B e n/a 7 990 1036 1070 N
+ AY G B i n/a 7 990 1031 1070 N
+ AY G B s n/a 7 987 1036 1070 N
+ AY G CH e n/a 7 990 1061 1075 N
+ AY G CH s n/a 7 987 1061 1075 N
+ AY G D b n/a 7 987 1035 1067 N
+ AY G D e n/a 7 990 1035 1067 N
+ AY G D i n/a 7 990 1031 1068 N
+ AY G D s n/a 7 987 1035 1067 N
+ AY G DH b n/a 7 989 1031 1069 N
+ AY G DH e n/a 7 990 1031 1069 N
+ AY G DH s n/a 7 987 1031 1069 N
+ AY G EH b n/a 7 987 1040 1103 N
+ AY G EH e n/a 7 990 1040 1103 N
+ AY G EH i n/a 7 989 1040 1103 N
+ AY G EH s n/a 7 987 1040 1103 N
+ AY G ER b n/a 7 987 1046 1094 N
+ AY G ER e n/a 7 990 1051 1094 N
+ AY G ER i n/a 7 989 1050 1094 N
+ AY G ER s n/a 7 987 1053 1094 N
+ AY G EY b n/a 7 987 1040 1103 N
+ AY G EY e n/a 7 990 1040 1103 N
+ AY G EY s n/a 7 987 1040 1103 N
+ AY G F b n/a 7 987 1061 1084 N
+ AY G F e n/a 7 990 1061 1084 N
+ AY G F s n/a 7 987 1061 1084 N
+ AY G G b n/a 7 987 1035 1077 N
+ AY G G e n/a 7 990 1035 1077 N
+ AY G G i n/a 7 990 1031 1077 N
+ AY G G s n/a 7 987 1035 1077 N
+ AY G HH b n/a 7 987 1064 1072 N
+ AY G HH e n/a 7 990 1064 1072 N
+ AY G HH s n/a 7 987 1064 1072 N
+ AY G IH b n/a 7 987 1040 1103 N
+ AY G IH e n/a 7 990 1040 1103 N
+ AY G IH s n/a 7 987 1040 1103 N
+ AY G IY b n/a 7 987 1040 1102 N
+ AY G IY e n/a 7 990 1040 1102 N
+ AY G IY s n/a 7 987 1040 1102 N
+ AY G JH b n/a 7 987 1035 1067 N
+ AY G JH e n/a 7 990 1035 1067 N
+ AY G JH s n/a 7 987 1035 1067 N
+ AY G K b n/a 7 987 1061 1077 N
+ AY G K e n/a 7 990 1061 1077 N
+ AY G K i n/a 7 989 1061 1077 N
+ AY G K s n/a 7 987 1061 1077 N
+ AY G L b n/a 7 987 1046 1091 N
+ AY G L e n/a 7 990 1051 1087 N
+ AY G L i n/a 7 989 1045 1089 N
+ AY G L s n/a 7 987 1053 1087 N
+ AY G M b n/a 7 987 1036 1098 N
+ AY G M e n/a 7 990 1036 1098 N
+ AY G M i n/a 7 989 1039 1099 N
+ AY G M s n/a 7 987 1036 1098 N
+ AY G N b n/a 7 987 1043 1096 N
+ AY G N e n/a 7 990 1043 1096 N
+ AY G N i n/a 7 989 1037 1095 N
+ AY G N s n/a 7 987 1043 1096 N
+ AY G NG e n/a 7 990 1040 1096 N
+ AY G NG s n/a 7 987 1040 1096 N
+ AY G OW b n/a 7 987 1046 1092 N
+ AY G OW e n/a 7 990 1051 1092 N
+ AY G OW i n/a 7 989 1050 1092 N
+ AY G OW s n/a 7 987 1053 1092 N
+ AY G OY e n/a 7 990 1040 1092 N
+ AY G OY s n/a 7 987 1040 1092 N
+ AY G P b n/a 7 987 1061 1076 N
+ AY G P e n/a 7 990 1061 1076 N
+ AY G P s n/a 7 987 1061 1076 N
+ AY G R b n/a 7 987 1046 1093 N
+ AY G R e n/a 7 990 1051 1093 N
+ AY G R i n/a 7 989 1050 1094 N
+ AY G R s n/a 7 987 1053 1093 N
+ AY G S b n/a 7 987 1061 1083 N
+ AY G S e n/a 7 990 1061 1084 N
+ AY G S i n/a 7 989 1061 1083 N
+ AY G S s n/a 7 987 1061 1084 N
+ AY G SH b n/a 7 987 1061 1084 N
+ AY G SH e n/a 7 990 1061 1084 N
+ AY G SH i n/a 7 989 1061 1083 N
+ AY G SH s n/a 7 987 1061 1084 N
+ AY G SIL e n/a 7 990 1031 1086 N
+ AY G SIL s n/a 7 987 1065 1086 N
+ AY G T b n/a 7 987 1061 1075 N
+ AY G T e n/a 7 990 1061 1075 N
+ AY G T i n/a 7 989 1061 1078 N
+ AY G T s n/a 7 987 1061 1075 N
+ AY G TH b n/a 7 987 1061 1084 N
+ AY G TH e n/a 7 990 1061 1084 N
+ AY G TH s n/a 7 987 1061 1084 N
+ AY G UH b n/a 7 987 1046 1093 N
+ AY G UH e n/a 7 990 1051 1093 N
+ AY G UH s n/a 7 987 1053 1093 N
+ AY G UW b n/a 7 987 1046 1092 N
+ AY G UW e n/a 7 990 1051 1092 N
+ AY G UW s n/a 7 987 1053 1092 N
+ AY G V b n/a 7 989 1036 1070 N
+ AY G V e n/a 7 990 1036 1069 N
+ AY G V i n/a 7 989 1031 1069 N
+ AY G V s n/a 7 987 1036 1069 N
+ AY G W b n/a 7 987 1046 1087 N
+ AY G W e n/a 7 990 1051 1087 N
+ AY G W s n/a 7 987 1053 1088 N
+ AY G Y b n/a 7 987 1031 1102 N
+ AY G Y e n/a 7 990 1031 1102 N
+ AY G Y s n/a 7 987 1031 1102 N
+ AY G Z b n/a 7 990 1031 1074 N
+ AY G Z e n/a 7 990 1031 1073 N
+ AY G Z i n/a 7 989 1031 1073 N
+ AY G Z s n/a 7 987 1031 1073 N
+ AY G ZH e n/a 7 990 1031 1067 N
+ AY G ZH s n/a 7 987 1031 1067 N
+ AY HH AA b n/a 7 1000 1046 1092 N
+ AY HH AA e n/a 7 996 1051 1092 N
+ AY HH AA i n/a 7 1000 1050 1092 N
+ AY HH AA s n/a 7 1000 1053 1092 N
+ AY HH AE b n/a 7 1000 1040 1103 N
+ AY HH AE e n/a 7 996 1040 1103 N
+ AY HH AE i n/a 7 1000 1040 1103 N
+ AY HH AE s n/a 7 1000 1040 1103 N
+ AY HH AH b n/a 7 1000 1040 1101 N
+ AY HH AH e n/a 7 996 1040 1101 N
+ AY HH AH i n/a 7 1000 1040 1100 N
+ AY HH AH s n/a 7 1000 1040 1101 N
+ AY HH AO e n/a 7 996 1051 1092 N
+ AY HH AO s n/a 7 1000 1053 1092 N
+ AY HH AW e n/a 7 996 1051 1103 N
+ AY HH AW s n/a 7 1000 1053 1103 N
+ AY HH AY b n/a 7 1000 1040 1092 N
+ AY HH AY e n/a 7 996 1040 1092 N
+ AY HH AY s n/a 7 1000 1040 1092 N
+ AY HH B b n/a 7 1000 1036 1070 N
+ AY HH B e n/a 7 996 1036 1070 N
+ AY HH B i n/a 7 1000 1031 1070 N
+ AY HH B s n/a 7 1000 1036 1070 N
+ AY HH CH e n/a 7 996 1061 1075 N
+ AY HH CH i n/a 7 1001 1061 1075 N
+ AY HH CH s n/a 7 1001 1061 1075 N
+ AY HH D b n/a 7 1000 1035 1067 N
+ AY HH D e n/a 7 996 1035 1067 N
+ AY HH D i n/a 7 1000 1031 1068 N
+ AY HH D s n/a 7 1000 1035 1067 N
+ AY HH DH b n/a 7 1000 1031 1069 N
+ AY HH DH e n/a 7 996 1031 1069 N
+ AY HH DH i n/a 7 1000 1031 1069 N
+ AY HH DH s n/a 7 1000 1031 1069 N
+ AY HH EH b n/a 7 1000 1040 1103 N
+ AY HH EH e n/a 7 996 1040 1103 N
+ AY HH EH i n/a 7 1000 1040 1103 N
+ AY HH EH s n/a 7 1000 1040 1103 N
+ AY HH ER b n/a 7 1000 1046 1094 N
+ AY HH ER e n/a 7 996 1051 1094 N
+ AY HH ER i n/a 7 1000 1050 1094 N
+ AY HH ER s n/a 7 1000 1053 1094 N
+ AY HH EY b n/a 7 1000 1040 1103 N
+ AY HH EY e n/a 7 996 1040 1103 N
+ AY HH EY i n/a 7 1000 1040 1103 N
+ AY HH EY s n/a 7 1000 1040 1103 N
+ AY HH F b n/a 7 1001 1061 1084 N
+ AY HH F e n/a 7 996 1061 1084 N
+ AY HH F i n/a 7 1001 1061 1083 N
+ AY HH F s n/a 7 1001 1061 1084 N
+ AY HH G b n/a 7 1000 1035 1077 N
+ AY HH G e n/a 7 996 1035 1077 N
+ AY HH G i n/a 7 1000 1031 1077 N
+ AY HH G s n/a 7 1000 1035 1077 N
+ AY HH HH b n/a 7 1001 1064 1072 N
+ AY HH HH e n/a 7 996 1064 1072 N
+ AY HH HH i n/a 7 1001 1066 1072 N
+ AY HH HH s n/a 7 1001 1064 1072 N
+ AY HH IH b n/a 7 1000 1040 1103 N
+ AY HH IH e n/a 7 996 1040 1103 N
+ AY HH IH i n/a 7 1000 1040 1097 N
+ AY HH IH s n/a 7 1000 1040 1103 N
+ AY HH IY b n/a 7 1000 1040 1102 N
+ AY HH IY e n/a 7 996 1040 1102 N
+ AY HH IY i n/a 7 1000 1040 1095 N
+ AY HH IY s n/a 7 1000 1040 1102 N
+ AY HH JH b n/a 7 1000 1035 1067 N
+ AY HH JH e n/a 7 996 1035 1067 N
+ AY HH JH i n/a 7 1000 1031 1067 N
+ AY HH JH s n/a 7 1000 1035 1067 N
+ AY HH K b n/a 7 1001 1061 1077 N
+ AY HH K e n/a 7 996 1061 1077 N
+ AY HH K i n/a 7 1001 1061 1077 N
+ AY HH K s n/a 7 1001 1061 1077 N
+ AY HH L b n/a 7 1000 1046 1089 N
+ AY HH L e n/a 7 996 1051 1087 N
+ AY HH L i n/a 7 1000 1046 1087 N
+ AY HH L s n/a 7 1000 1053 1087 N
+ AY HH M b n/a 7 1000 1036 1098 N
+ AY HH M e n/a 7 1000 1036 1098 N
+ AY HH M i n/a 7 996 1039 1099 N
+ AY HH M s n/a 7 1000 1036 1098 N
+ AY HH N b n/a 7 996 1043 1096 N
+ AY HH N e n/a 7 996 1043 1096 N
+ AY HH N i n/a 7 996 1039 1095 N
+ AY HH N s n/a 7 996 1043 1096 N
+ AY HH NG e n/a 7 996 1040 1096 N
+ AY HH NG i n/a 7 996 1039 1095 N
+ AY HH NG s n/a 7 996 1040 1096 N
+ AY HH OW b n/a 7 1000 1046 1092 N
+ AY HH OW e n/a 7 996 1051 1092 N
+ AY HH OW i n/a 7 1000 1050 1092 N
+ AY HH OW s n/a 7 1000 1053 1092 N
+ AY HH OY e n/a 7 996 1040 1092 N
+ AY HH OY i n/a 7 1000 1040 1092 N
+ AY HH OY s n/a 7 1000 1040 1092 N
+ AY HH P b n/a 7 1001 1061 1076 N
+ AY HH P e n/a 7 996 1061 1076 N
+ AY HH P i n/a 7 1001 1061 1076 N
+ AY HH P s n/a 7 1001 1061 1076 N
+ AY HH R b n/a 7 1000 1046 1093 N
+ AY HH R e n/a 7 996 1051 1093 N
+ AY HH R i n/a 7 1000 1050 1094 N
+ AY HH R s n/a 7 1000 1053 1093 N
+ AY HH S b n/a 7 1001 1061 1083 N
+ AY HH S e n/a 7 996 1061 1084 N
+ AY HH S i n/a 7 1001 1061 1083 N
+ AY HH S s n/a 7 1001 1061 1084 N
+ AY HH SH b n/a 7 1001 1061 1084 N
+ AY HH SH e n/a 7 996 1061 1084 N
+ AY HH SH s n/a 7 1001 1061 1084 N
+ AY HH SIL e n/a 7 996 1031 1086 N
+ AY HH SIL s n/a 7 1001 1065 1085 N
+ AY HH T b n/a 7 1001 1061 1075 N
+ AY HH T e n/a 7 996 1061 1075 N
+ AY HH T i n/a 7 1001 1061 1079 N
+ AY HH T s n/a 7 1001 1061 1075 N
+ AY HH TH b n/a 7 1001 1061 1084 N
+ AY HH TH e n/a 7 996 1061 1084 N
+ AY HH TH i n/a 7 1001 1061 1083 N
+ AY HH TH s n/a 7 1001 1061 1084 N
+ AY HH UH b n/a 7 1000 1046 1093 N
+ AY HH UH e n/a 7 996 1051 1093 N
+ AY HH UH s n/a 7 1000 1053 1093 N
+ AY HH UW b n/a 7 1000 1046 1092 N
+ AY HH UW e n/a 7 996 1051 1092 N
+ AY HH UW s n/a 7 1000 1053 1092 N
+ AY HH V b n/a 7 1000 1036 1070 N
+ AY HH V e n/a 7 996 1036 1069 N
+ AY HH V i n/a 7 1000 1031 1069 N
+ AY HH V s n/a 7 1000 1036 1069 N
+ AY HH W b n/a 7 1000 1046 1087 N
+ AY HH W e n/a 7 996 1051 1087 N
+ AY HH W i n/a 7 1000 1046 1087 N
+ AY HH W s n/a 7 1000 1053 1088 N
+ AY HH Y b n/a 7 1000 1031 1102 N
+ AY HH Y e n/a 7 996 1031 1102 N
+ AY HH Y i n/a 7 1000 1031 1095 N
+ AY HH Y s n/a 7 1000 1031 1102 N
+ AY HH Z b n/a 7 1000 1031 1074 N
+ AY HH Z e n/a 7 996 1031 1073 N
+ AY HH Z i n/a 7 1000 1031 1073 N
+ AY HH Z s n/a 7 1000 1031 1073 N
+ AY HH ZH e n/a 7 996 1031 1067 N
+ AY HH ZH s n/a 7 1000 1031 1067 N
+ AY IH AA b n/a 7 986 1046 1092 N
+ AY IH AA s n/a 7 986 1053 1092 N
+ AY IH AE b n/a 7 986 1040 1103 N
+ AY IH AE s n/a 7 986 1040 1103 N
+ AY IH AH b n/a 7 986 1040 1101 N
+ AY IH AH s n/a 7 986 1040 1101 N
+ AY IH AO s n/a 7 986 1053 1092 N
+ AY IH AW s n/a 7 986 1053 1103 N
+ AY IH AY b n/a 7 986 1040 1092 N
+ AY IH AY s n/a 7 986 1040 1092 N
+ AY IH B b n/a 7 986 1036 1070 N
+ AY IH B s n/a 7 986 1036 1070 N
+ AY IH CH s n/a 7 986 1061 1075 N
+ AY IH D b n/a 7 986 1035 1067 N
+ AY IH D s n/a 7 986 1035 1067 N
+ AY IH DH b n/a 7 989 1031 1069 N
+ AY IH DH s n/a 7 986 1031 1069 N
+ AY IH EH b n/a 7 986 1040 1103 N
+ AY IH EH s n/a 7 986 1040 1103 N
+ AY IH ER b n/a 7 986 1046 1094 N
+ AY IH ER s n/a 7 986 1053 1094 N
+ AY IH EY b n/a 7 986 1040 1103 N
+ AY IH EY s n/a 7 986 1040 1103 N
+ AY IH F b n/a 7 986 1061 1084 N
+ AY IH F s n/a 7 986 1061 1084 N
+ AY IH G b n/a 7 986 1035 1077 N
+ AY IH G s n/a 7 986 1035 1077 N
+ AY IH HH b n/a 7 986 1064 1072 N
+ AY IH HH s n/a 7 986 1064 1072 N
+ AY IH IH b n/a 7 986 1040 1103 N
+ AY IH IH s n/a 7 986 1040 1103 N
+ AY IH IY b n/a 7 986 1040 1102 N
+ AY IH IY s n/a 7 986 1040 1102 N
+ AY IH JH b n/a 7 986 1035 1067 N
+ AY IH JH s n/a 7 986 1035 1067 N
+ AY IH K b n/a 7 986 1061 1077 N
+ AY IH K s n/a 7 986 1061 1077 N
+ AY IH L b n/a 7 986 1046 1089 N
+ AY IH L s n/a 7 986 1053 1087 N
+ AY IH M b n/a 7 986 1036 1098 N
+ AY IH M s n/a 7 986 1036 1098 N
+ AY IH N b n/a 7 986 1043 1096 N
+ AY IH N s n/a 7 986 1043 1096 N
+ AY IH NG s n/a 7 986 1040 1096 N
+ AY IH OW b n/a 7 986 1046 1092 N
+ AY IH OW s n/a 7 986 1053 1092 N
+ AY IH OY s n/a 7 986 1040 1092 N
+ AY IH P b n/a 7 986 1061 1076 N
+ AY IH P s n/a 7 986 1061 1076 N
+ AY IH R b n/a 7 986 1046 1093 N
+ AY IH R s n/a 7 986 1053 1093 N
+ AY IH S b n/a 7 986 1061 1083 N
+ AY IH S s n/a 7 986 1061 1084 N
+ AY IH SH b n/a 7 986 1061 1084 N
+ AY IH SH s n/a 7 986 1061 1084 N
+ AY IH SIL s n/a 7 987 1065 1086 N
+ AY IH T b n/a 7 986 1061 1075 N
+ AY IH T s n/a 7 986 1061 1075 N
+ AY IH TH b n/a 7 986 1061 1084 N
+ AY IH TH s n/a 7 986 1061 1084 N
+ AY IH UH b n/a 7 986 1046 1093 N
+ AY IH UH s n/a 7 986 1053 1093 N
+ AY IH UW b n/a 7 986 1046 1092 N
+ AY IH UW s n/a 7 986 1053 1092 N
+ AY IH V b n/a 7 989 1036 1070 N
+ AY IH V s n/a 7 986 1036 1069 N
+ AY IH W b n/a 7 986 1046 1087 N
+ AY IH W s n/a 7 986 1053 1088 N
+ AY IH Y b n/a 7 986 1031 1102 N
+ AY IH Y s n/a 7 986 1031 1102 N
+ AY IH Z b n/a 7 990 1031 1074 N
+ AY IH Z s n/a 7 986 1031 1073 N
+ AY IH ZH s n/a 7 986 1031 1067 N
+ AY IY AA b n/a 7 987 1046 1092 N
+ AY IY AA e n/a 7 990 1051 1092 N
+ AY IY AA s n/a 7 987 1053 1092 N
+ AY IY AE b n/a 7 987 1040 1103 N
+ AY IY AE e n/a 7 990 1040 1103 N
+ AY IY AE s n/a 7 987 1040 1103 N
+ AY IY AH b n/a 7 987 1040 1101 N
+ AY IY AH e n/a 7 990 1040 1101 N
+ AY IY AH i n/a 7 989 1040 1100 N
+ AY IY AH s n/a 7 987 1040 1101 N
+ AY IY AO e n/a 7 990 1051 1092 N
+ AY IY AO s n/a 7 987 1053 1092 N
+ AY IY AW e n/a 7 990 1051 1103 N
+ AY IY AW s n/a 7 987 1053 1103 N
+ AY IY AY b n/a 7 987 1040 1092 N
+ AY IY AY e n/a 7 990 1040 1092 N
+ AY IY AY s n/a 7 987 1040 1092 N
+ AY IY B b n/a 7 987 1036 1070 N
+ AY IY B e n/a 7 990 1036 1070 N
+ AY IY B s n/a 7 987 1036 1070 N
+ AY IY CH e n/a 7 990 1061 1075 N
+ AY IY CH s n/a 7 987 1061 1075 N
+ AY IY D b n/a 7 987 1035 1067 N
+ AY IY D e n/a 7 990 1035 1067 N
+ AY IY D s n/a 7 987 1035 1067 N
+ AY IY DH b n/a 7 989 1031 1069 N
+ AY IY DH e n/a 7 990 1031 1069 N
+ AY IY DH s n/a 7 987 1031 1069 N
+ AY IY EH b n/a 7 987 1040 1103 N
+ AY IY EH e n/a 7 990 1040 1103 N
+ AY IY EH i n/a 7 989 1040 1103 N
+ AY IY EH s n/a 7 987 1040 1103 N
+ AY IY ER b n/a 7 987 1046 1094 N
+ AY IY ER e n/a 7 990 1051 1094 N
+ AY IY ER s n/a 7 987 1053 1094 N
+ AY IY EY b n/a 7 987 1040 1103 N
+ AY IY EY e n/a 7 990 1040 1103 N
+ AY IY EY i n/a 7 989 1040 1103 N
+ AY IY EY s n/a 7 987 1040 1103 N
+ AY IY F b n/a 7 987 1061 1084 N
+ AY IY F e n/a 7 990 1061 1084 N
+ AY IY F s n/a 7 987 1061 1084 N
+ AY IY G b n/a 7 987 1035 1077 N
+ AY IY G e n/a 7 990 1035 1077 N
+ AY IY G s n/a 7 987 1035 1077 N
+ AY IY HH b n/a 7 987 1064 1072 N
+ AY IY HH e n/a 7 990 1064 1072 N
+ AY IY HH s n/a 7 987 1064 1072 N
+ AY IY IH b n/a 7 987 1040 1103 N
+ AY IY IH e n/a 7 990 1040 1103 N
+ AY IY IH s n/a 7 987 1040 1103 N
+ AY IY IY b n/a 7 987 1040 1102 N
+ AY IY IY e n/a 7 990 1040 1102 N
+ AY IY IY i n/a 7 989 1040 1095 N
+ AY IY IY s n/a 7 987 1040 1102 N
+ AY IY JH b n/a 7 987 1035 1067 N
+ AY IY JH e n/a 7 990 1035 1067 N
+ AY IY JH s n/a 7 987 1035 1067 N
+ AY IY K b n/a 7 987 1061 1077 N
+ AY IY K e n/a 7 990 1061 1077 N
+ AY IY K s n/a 7 987 1061 1077 N
+ AY IY L b n/a 7 987 1046 1089 N
+ AY IY L e n/a 7 990 1051 1087 N
+ AY IY L s n/a 7 987 1053 1087 N
+ AY IY M b n/a 7 987 1036 1098 N
+ AY IY M e n/a 7 990 1036 1098 N
+ AY IY M s n/a 7 987 1036 1098 N
+ AY IY N b n/a 7 987 1043 1096 N
+ AY IY N e n/a 7 990 1043 1096 N
+ AY IY N s n/a 7 987 1043 1096 N
+ AY IY NG e n/a 7 990 1040 1096 N
+ AY IY NG s n/a 7 987 1040 1096 N
+ AY IY OW b n/a 7 987 1046 1092 N
+ AY IY OW e n/a 7 990 1051 1092 N
+ AY IY OW s n/a 7 987 1053 1092 N
+ AY IY OY e n/a 7 990 1040 1092 N
+ AY IY OY s n/a 7 987 1040 1092 N
+ AY IY P b n/a 7 987 1061 1076 N
+ AY IY P e n/a 7 990 1061 1076 N
+ AY IY P s n/a 7 987 1061 1076 N
+ AY IY R b n/a 7 987 1046 1093 N
+ AY IY R e n/a 7 990 1051 1093 N
+ AY IY R s n/a 7 987 1053 1093 N
+ AY IY S b n/a 7 987 1061 1083 N
+ AY IY S e n/a 7 990 1061 1084 N
+ AY IY S i n/a 7 989 1061 1083 N
+ AY IY S s n/a 7 987 1061 1084 N
+ AY IY SH b n/a 7 987 1061 1084 N
+ AY IY SH e n/a 7 990 1061 1084 N
+ AY IY SH s n/a 7 987 1061 1084 N
+ AY IY SIL e n/a 7 990 1031 1086 N
+ AY IY SIL s n/a 7 987 1065 1086 N
+ AY IY T b n/a 7 987 1061 1075 N
+ AY IY T e n/a 7 990 1061 1075 N
+ AY IY T i n/a 7 989 1061 1078 N
+ AY IY T s n/a 7 987 1061 1075 N
+ AY IY TH b n/a 7 987 1061 1084 N
+ AY IY TH e n/a 7 990 1061 1084 N
+ AY IY TH s n/a 7 987 1061 1084 N
+ AY IY UH b n/a 7 987 1046 1093 N
+ AY IY UH e n/a 7 990 1051 1093 N
+ AY IY UH s n/a 7 987 1053 1093 N
+ AY IY UW b n/a 7 987 1046 1092 N
+ AY IY UW e n/a 7 990 1051 1092 N
+ AY IY UW s n/a 7 987 1053 1092 N
+ AY IY V b n/a 7 989 1036 1070 N
+ AY IY V e n/a 7 990 1036 1069 N
+ AY IY V s n/a 7 987 1036 1069 N
+ AY IY W b n/a 7 987 1046 1087 N
+ AY IY W e n/a 7 990 1051 1087 N
+ AY IY W s n/a 7 987 1053 1088 N
+ AY IY Y b n/a 7 987 1031 1102 N
+ AY IY Y e n/a 7 990 1031 1102 N
+ AY IY Y s n/a 7 987 1031 1102 N
+ AY IY Z b n/a 7 990 1031 1074 N
+ AY IY Z e n/a 7 990 1031 1073 N
+ AY IY Z i n/a 7 989 1031 1073 N
+ AY IY Z s n/a 7 987 1031 1073 N
+ AY IY ZH e n/a 7 990 1031 1067 N
+ AY IY ZH s n/a 7 987 1031 1067 N
+ AY JH AA b n/a 7 987 1046 1092 N
+ AY JH AA e n/a 7 990 1051 1092 N
+ AY JH AA s n/a 7 987 1053 1092 N
+ AY JH AE b n/a 7 987 1040 1103 N
+ AY JH AE e n/a 7 990 1040 1103 N
+ AY JH AE s n/a 7 987 1040 1103 N
+ AY JH AH b n/a 7 987 1040 1101 N
+ AY JH AH e n/a 7 990 1040 1101 N
+ AY JH AH i n/a 7 989 1040 1100 N
+ AY JH AH s n/a 7 987 1040 1101 N
+ AY JH AO e n/a 7 990 1051 1092 N
+ AY JH AO s n/a 7 987 1053 1092 N
+ AY JH AW e n/a 7 990 1051 1103 N
+ AY JH AW s n/a 7 987 1053 1103 N
+ AY JH AY b n/a 7 987 1040 1092 N
+ AY JH AY e n/a 7 990 1040 1092 N
+ AY JH AY s n/a 7 987 1040 1092 N
+ AY JH B b n/a 7 987 1036 1070 N
+ AY JH B e n/a 7 990 1036 1070 N
+ AY JH B i n/a 7 990 1031 1070 N
+ AY JH B s n/a 7 987 1036 1070 N
+ AY JH CH e n/a 7 990 1061 1075 N
+ AY JH CH s n/a 7 987 1061 1075 N
+ AY JH D b n/a 7 987 1035 1067 N
+ AY JH D e n/a 7 990 1035 1067 N
+ AY JH D s n/a 7 987 1035 1067 N
+ AY JH DH b n/a 7 989 1031 1069 N
+ AY JH DH e n/a 7 990 1031 1069 N
+ AY JH DH i n/a 7 989 1031 1069 N
+ AY JH DH s n/a 7 987 1031 1069 N
+ AY JH EH b n/a 7 987 1040 1103 N
+ AY JH EH e n/a 7 990 1040 1103 N
+ AY JH EH s n/a 7 987 1040 1103 N
+ AY JH ER b n/a 7 987 1046 1094 N
+ AY JH ER e n/a 7 990 1051 1094 N
+ AY JH ER s n/a 7 987 1053 1094 N
+ AY JH EY b n/a 7 987 1040 1103 N
+ AY JH EY e n/a 7 990 1040 1103 N
+ AY JH EY s n/a 7 987 1040 1103 N
+ AY JH F b n/a 7 987 1061 1084 N
+ AY JH F e n/a 7 990 1061 1084 N
+ AY JH F s n/a 7 987 1061 1084 N
+ AY JH G b n/a 7 987 1035 1077 N
+ AY JH G e n/a 7 990 1035 1077 N
+ AY JH G i n/a 7 990 1031 1077 N
+ AY JH G s n/a 7 987 1035 1077 N
+ AY JH HH b n/a 7 987 1064 1072 N
+ AY JH HH e n/a 7 990 1064 1072 N
+ AY JH HH s n/a 7 987 1064 1072 N
+ AY JH IH b n/a 7 987 1040 1103 N
+ AY JH IH e n/a 7 990 1040 1103 N
+ AY JH IH s n/a 7 987 1040 1103 N
+ AY JH IY b n/a 7 987 1040 1102 N
+ AY JH IY e n/a 7 990 1040 1102 N
+ AY JH IY s n/a 7 987 1040 1102 N
+ AY JH JH b n/a 7 987 1035 1067 N
+ AY JH JH e n/a 7 990 1035 1067 N
+ AY JH JH s n/a 7 987 1035 1067 N
+ AY JH K b n/a 7 987 1061 1077 N
+ AY JH K e n/a 7 990 1061 1077 N
+ AY JH K s n/a 7 987 1061 1077 N
+ AY JH L b n/a 7 987 1046 1091 N
+ AY JH L e n/a 7 990 1051 1087 N
+ AY JH L i n/a 7 989 1045 1090 N
+ AY JH L s n/a 7 987 1053 1087 N
+ AY JH M b n/a 7 987 1036 1098 N
+ AY JH M e n/a 7 990 1036 1098 N
+ AY JH M s n/a 7 987 1036 1098 N
+ AY JH N b n/a 7 987 1043 1096 N
+ AY JH N e n/a 7 990 1043 1096 N
+ AY JH N i n/a 7 989 1037 1095 N
+ AY JH N s n/a 7 987 1043 1096 N
+ AY JH NG e n/a 7 990 1040 1096 N
+ AY JH NG s n/a 7 987 1040 1096 N
+ AY JH OW b n/a 7 987 1046 1092 N
+ AY JH OW e n/a 7 990 1051 1092 N
+ AY JH OW s n/a 7 987 1053 1092 N
+ AY JH OY e n/a 7 990 1040 1092 N
+ AY JH OY s n/a 7 987 1040 1092 N
+ AY JH P b n/a 7 987 1061 1076 N
+ AY JH P e n/a 7 990 1061 1076 N
+ AY JH P i n/a 7 989 1061 1075 N
+ AY JH P s n/a 7 987 1061 1076 N
+ AY JH R b n/a 7 987 1046 1093 N
+ AY JH R e n/a 7 990 1051 1093 N
+ AY JH R i n/a 7 989 1050 1094 N
+ AY JH R s n/a 7 987 1053 1093 N
+ AY JH S b n/a 7 987 1061 1083 N
+ AY JH S e n/a 7 990 1061 1084 N
+ AY JH S s n/a 7 987 1061 1084 N
+ AY JH SH b n/a 7 987 1061 1084 N
+ AY JH SH e n/a 7 990 1061 1084 N
+ AY JH SH s n/a 7 987 1061 1084 N
+ AY JH SIL e n/a 7 990 1031 1086 N
+ AY JH SIL s n/a 7 987 1065 1086 N
+ AY JH T b n/a 7 987 1061 1075 N
+ AY JH T e n/a 7 990 1061 1075 N
+ AY JH T i n/a 7 989 1061 1078 N
+ AY JH T s n/a 7 987 1061 1075 N
+ AY JH TH b n/a 7 987 1061 1084 N
+ AY JH TH e n/a 7 990 1061 1084 N
+ AY JH TH s n/a 7 987 1061 1084 N
+ AY JH UH b n/a 7 987 1046 1093 N
+ AY JH UH e n/a 7 990 1051 1093 N
+ AY JH UH s n/a 7 987 1053 1093 N
+ AY JH UW b n/a 7 987 1046 1092 N
+ AY JH UW e n/a 7 990 1051 1092 N
+ AY JH UW s n/a 7 987 1053 1092 N
+ AY JH V b n/a 7 989 1036 1070 N
+ AY JH V e n/a 7 990 1036 1069 N
+ AY JH V i n/a 7 989 1031 1069 N
+ AY JH V s n/a 7 987 1036 1069 N
+ AY JH W b n/a 7 987 1046 1087 N
+ AY JH W e n/a 7 990 1051 1087 N
+ AY JH W s n/a 7 987 1053 1088 N
+ AY JH Y b n/a 7 987 1031 1102 N
+ AY JH Y e n/a 7 990 1031 1102 N
+ AY JH Y s n/a 7 987 1031 1102 N
+ AY JH Z b n/a 7 990 1031 1074 N
+ AY JH Z e n/a 7 990 1031 1073 N
+ AY JH Z i n/a 7 989 1031 1073 N
+ AY JH Z s n/a 7 987 1031 1073 N
+ AY JH ZH e n/a 7 990 1031 1067 N
+ AY JH ZH s n/a 7 987 1031 1067 N
+ AY K AA b n/a 7 995 1046 1092 N
+ AY K AA e n/a 7 995 1051 1092 N
+ AY K AA s n/a 7 988 1053 1092 N
+ AY K AE b n/a 7 995 1040 1103 N
+ AY K AE e n/a 7 995 1040 1103 N
+ AY K AE i n/a 7 995 1040 1103 N
+ AY K AE s n/a 7 988 1040 1103 N
+ AY K AH b n/a 7 995 1040 1101 N
+ AY K AH e n/a 7 995 1040 1101 N
+ AY K AH i n/a 7 995 1040 1100 N
+ AY K AH s n/a 7 988 1040 1101 N
+ AY K AO e n/a 7 995 1051 1092 N
+ AY K AO s n/a 7 988 1053 1092 N
+ AY K AW e n/a 7 995 1051 1103 N
+ AY K AW s n/a 7 988 1053 1103 N
+ AY K AY b n/a 7 995 1040 1092 N
+ AY K AY e n/a 7 995 1040 1092 N
+ AY K AY s n/a 7 988 1040 1092 N
+ AY K B b n/a 7 995 1036 1070 N
+ AY K B e n/a 7 995 1036 1070 N
+ AY K B i n/a 7 995 1031 1070 N
+ AY K B s n/a 7 988 1036 1070 N
+ AY K CH e n/a 7 995 1061 1075 N
+ AY K CH i n/a 7 995 1061 1075 N
+ AY K CH s n/a 7 988 1061 1075 N
+ AY K D b n/a 7 995 1035 1067 N
+ AY K D e n/a 7 995 1035 1067 N
+ AY K D i n/a 7 995 1031 1068 N
+ AY K D s n/a 7 988 1035 1067 N
+ AY K DH b n/a 7 995 1031 1069 N
+ AY K DH e n/a 7 995 1031 1069 N
+ AY K DH s n/a 7 988 1031 1069 N
+ AY K EH b n/a 7 995 1040 1103 N
+ AY K EH e n/a 7 995 1040 1103 N
+ AY K EH i n/a 7 995 1040 1103 N
+ AY K EH s n/a 7 988 1040 1103 N
+ AY K ER b n/a 7 995 1046 1094 N
+ AY K ER e n/a 7 995 1051 1094 N
+ AY K ER i n/a 7 995 1050 1094 N
+ AY K ER s n/a 7 988 1053 1094 N
+ AY K EY b n/a 7 995 1040 1103 N
+ AY K EY e n/a 7 995 1040 1103 N
+ AY K EY s n/a 7 988 1040 1103 N
+ AY K F b n/a 7 995 1061 1084 N
+ AY K F e n/a 7 995 1061 1084 N
+ AY K F i n/a 7 995 1061 1083 N
+ AY K F s n/a 7 988 1061 1084 N
+ AY K G b n/a 7 995 1035 1077 N
+ AY K G e n/a 7 995 1035 1077 N
+ AY K G i n/a 7 995 1031 1077 N
+ AY K G s n/a 7 988 1035 1077 N
+ AY K HH b n/a 7 995 1064 1072 N
+ AY K HH e n/a 7 995 1064 1072 N
+ AY K HH i n/a 7 995 1066 1072 N
+ AY K HH s n/a 7 988 1064 1072 N
+ AY K IH b n/a 7 995 1040 1103 N
+ AY K IH e n/a 7 995 1040 1103 N
+ AY K IH i n/a 7 995 1040 1097 N
+ AY K IH s n/a 7 988 1040 1103 N
+ AY K IY b n/a 7 995 1040 1102 N
+ AY K IY e n/a 7 995 1040 1102 N
+ AY K IY i n/a 7 995 1040 1095 N
+ AY K IY s n/a 7 988 1040 1102 N
+ AY K JH b n/a 7 995 1035 1067 N
+ AY K JH e n/a 7 995 1035 1067 N
+ AY K JH s n/a 7 988 1035 1067 N
+ AY K K b n/a 7 995 1061 1077 N
+ AY K K e n/a 7 995 1061 1077 N
+ AY K K i n/a 7 995 1061 1077 N
+ AY K K s n/a 7 988 1061 1077 N
+ AY K L b n/a 7 995 1046 1091 N
+ AY K L e n/a 7 995 1051 1087 N
+ AY K L i n/a 7 995 1045 1089 N
+ AY K L s n/a 7 988 1053 1087 N
+ AY K M b n/a 7 999 1036 1098 N
+ AY K M e n/a 7 999 1036 1098 N
+ AY K M i n/a 7 997 1039 1099 N
+ AY K M s n/a 7 999 1036 1098 N
+ AY K N b n/a 7 999 1043 1096 N
+ AY K N e n/a 7 999 1043 1096 N
+ AY K N i n/a 7 999 1039 1095 N
+ AY K N s n/a 7 999 1043 1096 N
+ AY K NG e n/a 7 999 1040 1096 N
+ AY K NG s n/a 7 999 1040 1096 N
+ AY K OW b n/a 7 995 1046 1092 N
+ AY K OW e n/a 7 995 1051 1092 N
+ AY K OW i n/a 7 995 1050 1092 N
+ AY K OW s n/a 7 988 1053 1092 N
+ AY K OY e n/a 7 995 1040 1092 N
+ AY K OY s n/a 7 988 1040 1092 N
+ AY K P b n/a 7 995 1061 1076 N
+ AY K P e n/a 7 995 1061 1076 N
+ AY K P i n/a 7 995 1061 1075 N
+ AY K P s n/a 7 988 1061 1076 N
+ AY K R b n/a 7 995 1046 1093 N
+ AY K R e n/a 7 995 1051 1093 N
+ AY K R i n/a 7 995 1050 1094 N
+ AY K R s n/a 7 988 1053 1093 N
+ AY K S b n/a 7 995 1061 1083 N
+ AY K S e n/a 7 995 1061 1084 N
+ AY K S i n/a 7 995 1061 1083 N
+ AY K S s n/a 7 988 1061 1084 N
+ AY K SH b n/a 7 995 1061 1084 N
+ AY K SH e n/a 7 995 1061 1084 N
+ AY K SH s n/a 7 988 1061 1084 N
+ AY K SIL e n/a 7 995 1031 1086 N
+ AY K SIL s n/a 7 988 1065 1085 N
+ AY K T b n/a 7 995 1061 1075 N
+ AY K T e n/a 7 995 1061 1075 N
+ AY K T i n/a 7 995 1061 1078 N
+ AY K T s n/a 7 988 1061 1075 N
+ AY K TH b n/a 7 995 1061 1084 N
+ AY K TH e n/a 7 995 1061 1084 N
+ AY K TH s n/a 7 988 1061 1084 N
+ AY K UH b n/a 7 995 1046 1093 N
+ AY K UH e n/a 7 995 1051 1093 N
+ AY K UH s n/a 7 988 1053 1093 N
+ AY K UW b n/a 7 995 1046 1092 N
+ AY K UW e n/a 7 995 1051 1092 N
+ AY K UW i n/a 7 995 1050 1092 N
+ AY K UW s n/a 7 988 1053 1092 N
+ AY K V b n/a 7 995 1036 1070 N
+ AY K V e n/a 7 995 1036 1069 N
+ AY K V i n/a 7 995 1031 1069 N
+ AY K V s n/a 7 988 1036 1069 N
+ AY K W b n/a 7 995 1046 1087 N
+ AY K W e n/a 7 995 1051 1087 N
+ AY K W i n/a 7 995 1045 1089 N
+ AY K W s n/a 7 988 1053 1088 N
+ AY K Y b n/a 7 995 1031 1102 N
+ AY K Y e n/a 7 995 1031 1102 N
+ AY K Y i n/a 7 995 1031 1095 N
+ AY K Y s n/a 7 988 1031 1102 N
+ AY K Z b n/a 7 995 1031 1074 N
+ AY K Z e n/a 7 995 1031 1073 N
+ AY K Z i n/a 7 995 1031 1073 N
+ AY K Z s n/a 7 988 1031 1073 N
+ AY K ZH e n/a 7 995 1031 1067 N
+ AY K ZH s n/a 7 988 1031 1067 N
+ AY L AA b n/a 7 1016 1046 1092 N
+ AY L AA e n/a 7 1016 1051 1092 N
+ AY L AA i n/a 7 1016 1050 1092 N
+ AY L AA s n/a 7 1016 1053 1092 N
+ AY L AE b n/a 7 1015 1041 1103 N
+ AY L AE e n/a 7 1015 1041 1103 N
+ AY L AE i n/a 7 1015 1042 1103 N
+ AY L AE s n/a 7 1016 1041 1103 N
+ AY L AH b n/a 7 1018 1041 1101 N
+ AY L AH e n/a 7 1018 1041 1101 N
+ AY L AH i n/a 7 1018 1042 1100 N
+ AY L AH s n/a 7 1016 1041 1101 N
+ AY L AO e n/a 7 1016 1051 1092 N
+ AY L AO s n/a 7 1016 1053 1092 N
+ AY L AW e n/a 7 1016 1051 1103 N
+ AY L AW s n/a 7 1016 1053 1103 N
+ AY L AY b n/a 7 1015 1041 1092 N
+ AY L AY e n/a 7 1015 1041 1092 N
+ AY L AY s n/a 7 1016 1041 1092 N
+ AY L B b n/a 7 1016 1036 1070 N
+ AY L B e n/a 7 1016 1036 1070 N
+ AY L B i n/a 7 1016 1029 1070 N
+ AY L B s n/a 7 1016 1036 1070 N
+ AY L CH e n/a 7 1016 1058 1075 N
+ AY L CH i n/a 7 1016 1058 1075 N
+ AY L CH s n/a 7 1016 1061 1075 N
+ AY L D b n/a 7 1016 1033 1067 N
+ AY L D e n/a 7 1016 1033 1067 N
+ AY L D i n/a 7 1016 1030 1068 N
+ AY L D s n/a 7 1016 1033 1067 N
+ AY L DH b n/a 7 1016 1030 1069 N
+ AY L DH e n/a 7 1016 1030 1069 N
+ AY L DH i n/a 7 1016 1030 1069 N
+ AY L DH s n/a 7 1016 1030 1069 N
+ AY L EH b n/a 7 1015 1041 1103 N
+ AY L EH e n/a 7 1015 1041 1103 N
+ AY L EH i n/a 7 1015 1042 1103 N
+ AY L EH s n/a 7 1016 1041 1103 N
+ AY L ER b n/a 7 1018 1046 1094 N
+ AY L ER e n/a 7 1018 1051 1094 N
+ AY L ER i n/a 7 1018 1050 1094 N
+ AY L ER s n/a 7 1016 1053 1094 N
+ AY L EY b n/a 7 1015 1041 1103 N
+ AY L EY e n/a 7 1015 1041 1103 N
+ AY L EY s n/a 7 1016 1041 1103 N
+ AY L F b n/a 7 1022 1058 1084 N
+ AY L F e n/a 7 1022 1058 1084 N
+ AY L F i n/a 7 1022 1058 1082 N
+ AY L F s n/a 7 1022 1061 1084 N
+ AY L G b n/a 7 1016 1033 1077 N
+ AY L G e n/a 7 1016 1033 1077 N
+ AY L G i n/a 7 1016 1030 1077 N
+ AY L G s n/a 7 1016 1033 1077 N
+ AY L HH b n/a 7 1015 1058 1072 N
+ AY L HH e n/a 7 1015 1058 1072 N
+ AY L HH s n/a 7 1016 1064 1072 N
+ AY L IH b n/a 7 1018 1041 1103 N
+ AY L IH e n/a 7 1018 1041 1103 N
+ AY L IH i n/a 7 1018 1042 1097 N
+ AY L IH s n/a 7 1016 1041 1103 N
+ AY L IY b n/a 7 1015 1041 1102 N
+ AY L IY e n/a 7 1015 1041 1102 N
+ AY L IY s n/a 7 1016 1041 1102 N
+ AY L JH b n/a 7 1016 1033 1067 N
+ AY L JH e n/a 7 1016 1033 1067 N
+ AY L JH i n/a 7 1016 1030 1067 N
+ AY L JH s n/a 7 1016 1033 1067 N
+ AY L K b n/a 7 1009 1056 1077 N
+ AY L K e n/a 7 1009 1056 1077 N
+ AY L K i n/a 7 1009 1055 1077 N
+ AY L K s n/a 7 1009 1061 1077 N
+ AY L L b n/a 7 1016 1046 1089 N
+ AY L L e n/a 7 1016 1051 1087 N
+ AY L L i n/a 7 1016 1045 1090 N
+ AY L L s n/a 7 1016 1053 1087 N
+ AY L M b n/a 7 1018 1036 1098 N
+ AY L M e n/a 7 1018 1036 1098 N
+ AY L M i n/a 7 1018 1039 1099 N
+ AY L M s n/a 7 1018 1036 1098 N
+ AY L N b n/a 7 1018 1043 1096 N
+ AY L N e n/a 7 1018 1043 1096 N
+ AY L N i n/a 7 1018 1037 1095 N
+ AY L N s n/a 7 1018 1043 1096 N
+ AY L NG e n/a 7 1018 1041 1096 N
+ AY L NG i n/a 7 1018 1039 1095 N
+ AY L NG s n/a 7 1018 1041 1096 N
+ AY L OW b n/a 7 1016 1046 1092 N
+ AY L OW e n/a 7 1016 1051 1092 N
+ AY L OW i n/a 7 1016 1050 1092 N
+ AY L OW s n/a 7 1016 1053 1092 N
+ AY L OY e n/a 7 1015 1041 1092 N
+ AY L OY s n/a 7 1016 1041 1092 N
+ AY L P b n/a 7 1009 1058 1076 N
+ AY L P e n/a 7 1007 1058 1076 N
+ AY L P i n/a 7 1009 1058 1075 N
+ AY L P s n/a 7 1009 1061 1076 N
+ AY L R b n/a 7 1016 1046 1093 N
+ AY L R e n/a 7 1016 1051 1093 N
+ AY L R i n/a 7 1016 1050 1094 N
+ AY L R s n/a 7 1016 1053 1093 N
+ AY L S b n/a 7 1022 1056 1083 N
+ AY L S e n/a 7 1022 1056 1084 N
+ AY L S i n/a 7 1021 1056 1083 N
+ AY L S s n/a 7 1022 1061 1084 N
+ AY L SH b n/a 7 1022 1058 1084 N
+ AY L SH e n/a 7 1022 1058 1084 N
+ AY L SH i n/a 7 1021 1058 1083 N
+ AY L SH s n/a 7 1022 1061 1084 N
+ AY L SIL e n/a 7 1015 1030 1086 N
+ AY L SIL s n/a 7 1015 1065 1086 N
+ AY L T b n/a 7 1009 1056 1075 N
+ AY L T e n/a 7 1007 1056 1075 N
+ AY L T i n/a 7 1009 1056 1078 N
+ AY L T s n/a 7 1009 1061 1075 N
+ AY L TH b n/a 7 1022 1058 1084 N
+ AY L TH e n/a 7 1022 1058 1084 N
+ AY L TH i n/a 7 1021 1058 1082 N
+ AY L TH s n/a 7 1022 1061 1084 N
+ AY L UH b n/a 7 1016 1046 1093 N
+ AY L UH e n/a 7 1016 1051 1093 N
+ AY L UH s n/a 7 1016 1053 1093 N
+ AY L UW b n/a 7 1016 1046 1092 N
+ AY L UW e n/a 7 1016 1051 1092 N
+ AY L UW s n/a 7 1016 1053 1092 N
+ AY L V b n/a 7 1015 1036 1070 N
+ AY L V e n/a 7 1015 1036 1069 N
+ AY L V i n/a 7 1015 1030 1069 N
+ AY L V s n/a 7 1016 1036 1069 N
+ AY L W b n/a 7 1016 1046 1087 N
+ AY L W e n/a 7 1016 1051 1087 N
+ AY L W i n/a 7 1016 1045 1090 N
+ AY L W s n/a 7 1016 1053 1088 N
+ AY L Y b n/a 7 1015 1030 1102 N
+ AY L Y e n/a 7 1015 1030 1102 N
+ AY L Y s n/a 7 1016 1030 1102 N
+ AY L Z b n/a 7 1016 1030 1074 N
+ AY L Z e n/a 7 1016 1030 1073 N
+ AY L Z i n/a 7 1016 1030 1073 N
+ AY L Z s n/a 7 1016 1030 1073 N
+ AY L ZH e n/a 7 1015 1030 1067 N
+ AY L ZH s n/a 7 1016 1030 1067 N
+ AY M AA b n/a 7 1006 1047 1092 N
+ AY M AA e n/a 7 1006 1051 1092 N
+ AY M AA i n/a 7 1017 1049 1092 N
+ AY M AA s n/a 7 1007 1053 1092 N
+ AY M AE b n/a 7 1006 1041 1103 N
+ AY M AE e n/a 7 1006 1041 1103 N
+ AY M AE i n/a 7 1017 1042 1103 N
+ AY M AE s n/a 7 1007 1041 1103 N
+ AY M AH b n/a 7 1006 1041 1101 N
+ AY M AH e n/a 7 1006 1041 1101 N
+ AY M AH i n/a 7 1017 1042 1101 N
+ AY M AH s n/a 7 1007 1041 1101 N
+ AY M AO e n/a 7 1006 1051 1092 N
+ AY M AO i n/a 7 1017 1049 1092 N
+ AY M AO s n/a 7 1007 1053 1092 N
+ AY M AW e n/a 7 1006 1051 1103 N
+ AY M AW s n/a 7 1007 1053 1103 N
+ AY M AY b n/a 7 1006 1041 1092 N
+ AY M AY e n/a 7 1006 1041 1092 N
+ AY M AY s n/a 7 1007 1041 1092 N
+ AY M B b n/a 7 1007 1033 1070 N
+ AY M B e n/a 7 1006 1033 1070 N
+ AY M B i n/a 7 1017 1028 1070 N
+ AY M B s n/a 7 1007 1033 1070 N
+ AY M CH e n/a 7 1006 1059 1075 N
+ AY M CH s n/a 7 1007 1064 1075 N
+ AY M D b n/a 7 1007 1033 1067 N
+ AY M D e n/a 7 1006 1033 1067 N
+ AY M D i n/a 7 1017 1028 1068 N
+ AY M D s n/a 7 1007 1033 1067 N
+ AY M DH b n/a 7 1007 1034 1071 N
+ AY M DH e n/a 7 1006 1034 1071 N
+ AY M DH i n/a 7 1017 1028 1071 N
+ AY M DH s n/a 7 1007 1034 1071 N
+ AY M EH b n/a 7 1006 1041 1103 N
+ AY M EH e n/a 7 1006 1041 1103 N
+ AY M EH i n/a 7 1017 1042 1103 N
+ AY M EH s n/a 7 1007 1041 1103 N
+ AY M ER b n/a 7 1006 1047 1094 N
+ AY M ER e n/a 7 1006 1051 1094 N
+ AY M ER i n/a 7 1017 1049 1094 N
+ AY M ER s n/a 7 1007 1053 1094 N
+ AY M EY b n/a 7 1006 1041 1103 N
+ AY M EY e n/a 7 1006 1041 1103 N
+ AY M EY s n/a 7 1007 1041 1103 N
+ AY M F b n/a 7 1007 1059 1084 N
+ AY M F e n/a 7 1006 1059 1084 N
+ AY M F i n/a 7 1021 1059 1084 N
+ AY M F s n/a 7 1007 1064 1084 N
+ AY M G b n/a 7 1007 1033 1077 N
+ AY M G e n/a 7 1006 1033 1077 N
+ AY M G i n/a 7 1017 1028 1077 N
+ AY M G s n/a 7 1007 1033 1077 N
+ AY M HH b n/a 7 1007 1059 1072 N
+ AY M HH e n/a 7 1006 1059 1072 N
+ AY M HH i n/a 7 1017 1059 1072 N
+ AY M HH s n/a 7 1007 1064 1072 N
+ AY M IH b n/a 7 1006 1041 1103 N
+ AY M IH e n/a 7 1006 1041 1103 N
+ AY M IH i n/a 7 1017 1042 1097 N
+ AY M IH s n/a 7 1007 1041 1103 N
+ AY M IY b n/a 7 1006 1041 1102 N
+ AY M IY e n/a 7 1006 1041 1102 N
+ AY M IY i n/a 7 1017 1042 1095 N
+ AY M IY s n/a 7 1007 1041 1102 N
+ AY M JH b n/a 7 1007 1033 1067 N
+ AY M JH e n/a 7 1006 1033 1067 N
+ AY M JH s n/a 7 1007 1033 1067 N
+ AY M K b n/a 7 1007 1059 1077 N
+ AY M K e n/a 7 1006 1059 1077 N
+ AY M K i n/a 7 1006 1059 1077 N
+ AY M K s n/a 7 1007 1064 1077 N
+ AY M L b n/a 7 1006 1048 1089 N
+ AY M L e n/a 7 1006 1051 1087 N
+ AY M L i n/a 7 1017 1047 1090 N
+ AY M L s n/a 7 1007 1053 1087 N
+ AY M M b n/a 7 1007 1028 1098 N
+ AY M M e n/a 7 1006 1028 1098 N
+ AY M M i n/a 7 1017 1039 1099 N
+ AY M M s n/a 7 1007 1028 1098 N
+ AY M N b n/a 7 1007 1043 1096 N
+ AY M N e n/a 7 1006 1043 1096 N
+ AY M N i n/a 7 1017 1037 1095 N
+ AY M N s n/a 7 1007 1043 1096 N
+ AY M NG e n/a 7 1006 1041 1096 N
+ AY M NG i n/a 7 1017 1039 1095 N
+ AY M NG s n/a 7 1007 1041 1096 N
+ AY M OW b n/a 7 1006 1047 1092 N
+ AY M OW e n/a 7 1006 1051 1092 N
+ AY M OW i n/a 7 1017 1049 1092 N
+ AY M OW s n/a 7 1007 1053 1092 N
+ AY M OY e n/a 7 1006 1041 1092 N
+ AY M OY s n/a 7 1007 1041 1092 N
+ AY M P b n/a 7 1007 1059 1076 N
+ AY M P e n/a 7 1006 1059 1076 N
+ AY M P i n/a 7 1006 1059 1075 N
+ AY M P s n/a 7 1007 1064 1076 N
+ AY M R b n/a 7 1006 1048 1093 N
+ AY M R e n/a 7 1006 1051 1093 N
+ AY M R i n/a 7 1017 1049 1094 N
+ AY M R s n/a 7 1007 1053 1093 N
+ AY M S b n/a 7 1007 1059 1083 N
+ AY M S e n/a 7 1006 1059 1084 N
+ AY M S i n/a 7 1021 1059 1084 N
+ AY M S s n/a 7 1007 1064 1084 N
+ AY M SH b n/a 7 1007 1059 1084 N
+ AY M SH e n/a 7 1006 1059 1084 N
+ AY M SH i n/a 7 1021 1059 1084 N
+ AY M SH s n/a 7 1007 1064 1084 N
+ AY M SIL e n/a 7 1007 1028 1085 N
+ AY M SIL s n/a 7 1007 1065 1086 N
+ AY M T b n/a 7 1007 1059 1081 N
+ AY M T e n/a 7 1006 1059 1081 N
+ AY M T i n/a 7 1006 1059 1081 N
+ AY M T s n/a 7 1007 1064 1081 N
+ AY M TH b n/a 7 1007 1059 1084 N
+ AY M TH e n/a 7 1006 1059 1084 N
+ AY M TH i n/a 7 1021 1059 1084 N
+ AY M TH s n/a 7 1007 1064 1084 N
+ AY M UH b n/a 7 1006 1047 1093 N
+ AY M UH e n/a 7 1006 1051 1093 N
+ AY M UH s n/a 7 1007 1053 1093 N
+ AY M UW b n/a 7 1006 1047 1092 N
+ AY M UW e n/a 7 1006 1051 1092 N
+ AY M UW s n/a 7 1007 1053 1092 N
+ AY M V b n/a 7 1007 1028 1070 N
+ AY M V e n/a 7 1006 1028 1069 N
+ AY M V s n/a 7 1007 1028 1069 N
+ AY M W b n/a 7 1006 1048 1088 N
+ AY M W e n/a 7 1006 1051 1088 N
+ AY M W s n/a 7 1007 1053 1088 N
+ AY M Y b n/a 7 1006 1028 1102 N
+ AY M Y e n/a 7 1006 1028 1102 N
+ AY M Y s n/a 7 1007 1028 1102 N
+ AY M Z b n/a 7 1007 1028 1074 N
+ AY M Z e n/a 7 1006 1028 1073 N
+ AY M Z i n/a 7 1017 1028 1073 N
+ AY M Z s n/a 7 1007 1028 1073 N
+ AY M ZH e n/a 7 1006 1028 1067 N
+ AY M ZH s n/a 7 1007 1028 1067 N
+ AY N AA b n/a 7 986 1046 1092 N
+ AY N AA e n/a 7 990 1051 1092 N
+ AY N AA i n/a 7 984 1050 1092 N
+ AY N AA s n/a 7 986 1053 1092 N
+ AY N AE b n/a 7 986 1040 1103 N
+ AY N AE e n/a 7 990 1040 1103 N
+ AY N AE i n/a 7 984 1040 1103 N
+ AY N AE s n/a 7 986 1040 1103 N
+ AY N AH b n/a 7 986 1040 1101 N
+ AY N AH e n/a 7 990 1040 1101 N
+ AY N AH i n/a 7 984 1040 1101 N
+ AY N AH s n/a 7 986 1040 1101 N
+ AY N AO e n/a 7 990 1051 1092 N
+ AY N AO s n/a 7 986 1053 1092 N
+ AY N AW e n/a 7 990 1051 1103 N
+ AY N AW s n/a 7 986 1053 1103 N
+ AY N AY b n/a 7 986 1040 1092 N
+ AY N AY e n/a 7 990 1040 1092 N
+ AY N AY s n/a 7 986 1040 1092 N
+ AY N B b n/a 7 986 1036 1070 N
+ AY N B e n/a 7 990 1036 1070 N
+ AY N B i n/a 7 984 1031 1070 N
+ AY N B s n/a 7 986 1036 1070 N
+ AY N CH e n/a 7 990 1064 1075 N
+ AY N CH i n/a 7 984 1066 1075 N
+ AY N CH s n/a 7 986 1064 1075 N
+ AY N D b n/a 7 986 1035 1067 N
+ AY N D e n/a 7 990 1035 1067 N
+ AY N D i n/a 7 984 1031 1068 N
+ AY N D s n/a 7 986 1035 1067 N
+ AY N DH b n/a 7 989 1031 1069 N
+ AY N DH e n/a 7 990 1031 1069 N
+ AY N DH i n/a 7 984 1031 1069 N
+ AY N DH s n/a 7 986 1031 1069 N
+ AY N EH b n/a 7 986 1040 1103 N
+ AY N EH e n/a 7 990 1040 1103 N
+ AY N EH i n/a 7 984 1040 1103 N
+ AY N EH s n/a 7 986 1040 1103 N
+ AY N ER b n/a 7 986 1046 1094 N
+ AY N ER e n/a 7 990 1051 1094 N
+ AY N ER i n/a 7 984 1050 1094 N
+ AY N ER s n/a 7 986 1053 1094 N
+ AY N EY b n/a 7 986 1040 1103 N
+ AY N EY e n/a 7 990 1040 1103 N
+ AY N EY i n/a 7 984 1040 1103 N
+ AY N EY s n/a 7 986 1040 1103 N
+ AY N F b n/a 7 986 1064 1084 N
+ AY N F e n/a 7 990 1064 1084 N
+ AY N F i n/a 7 984 1066 1082 N
+ AY N F s n/a 7 986 1064 1084 N
+ AY N G b n/a 7 986 1035 1077 N
+ AY N G e n/a 7 990 1035 1077 N
+ AY N G i n/a 7 984 1031 1077 N
+ AY N G s n/a 7 986 1035 1077 N
+ AY N HH b n/a 7 986 1064 1072 N
+ AY N HH e n/a 7 990 1064 1072 N
+ AY N HH i n/a 7 984 1066 1072 N
+ AY N HH s n/a 7 986 1064 1072 N
+ AY N IH b n/a 7 986 1040 1103 N
+ AY N IH e n/a 7 990 1040 1103 N
+ AY N IH i n/a 7 984 1040 1097 N
+ AY N IH s n/a 7 986 1040 1103 N
+ AY N IY b n/a 7 986 1040 1102 N
+ AY N IY e n/a 7 990 1040 1102 N
+ AY N IY i n/a 7 984 1040 1096 N
+ AY N IY s n/a 7 986 1040 1102 N
+ AY N JH b n/a 7 986 1035 1067 N
+ AY N JH e n/a 7 990 1035 1067 N
+ AY N JH i n/a 7 984 1031 1067 N
+ AY N JH s n/a 7 986 1035 1067 N
+ AY N K b n/a 7 986 1064 1077 N
+ AY N K e n/a 7 990 1064 1077 N
+ AY N K i n/a 7 984 1066 1077 N
+ AY N K s n/a 7 986 1064 1077 N
+ AY N L b n/a 7 986 1046 1089 N
+ AY N L e n/a 7 990 1051 1087 N
+ AY N L i n/a 7 984 1045 1090 N
+ AY N L s n/a 7 986 1053 1087 N
+ AY N M b n/a 7 986 1036 1098 N
+ AY N M e n/a 7 990 1036 1098 N
+ AY N M i n/a 7 984 1039 1099 N
+ AY N M s n/a 7 986 1036 1098 N
+ AY N N b n/a 7 986 1043 1096 N
+ AY N N e n/a 7 990 1043 1096 N
+ AY N N i n/a 7 984 1044 1096 N
+ AY N N s n/a 7 986 1043 1096 N
+ AY N NG e n/a 7 990 1040 1096 N
+ AY N NG s n/a 7 986 1040 1096 N
+ AY N OW b n/a 7 986 1046 1092 N
+ AY N OW e n/a 7 990 1051 1092 N
+ AY N OW i n/a 7 984 1050 1092 N
+ AY N OW s n/a 7 986 1053 1092 N
+ AY N OY e n/a 7 990 1040 1092 N
+ AY N OY s n/a 7 986 1040 1092 N
+ AY N P b n/a 7 986 1064 1076 N
+ AY N P e n/a 7 990 1064 1076 N
+ AY N P i n/a 7 984 1066 1075 N
+ AY N P s n/a 7 986 1064 1076 N
+ AY N R b n/a 7 986 1046 1093 N
+ AY N R e n/a 7 990 1051 1093 N
+ AY N R i n/a 7 984 1050 1094 N
+ AY N R s n/a 7 986 1053 1093 N
+ AY N S b n/a 7 986 1064 1083 N
+ AY N S e n/a 7 990 1064 1084 N
+ AY N S i n/a 7 984 1066 1083 N
+ AY N S s n/a 7 986 1064 1084 N
+ AY N SH b n/a 7 986 1064 1084 N
+ AY N SH e n/a 7 990 1064 1084 N
+ AY N SH s n/a 7 986 1064 1084 N
+ AY N SIL e n/a 7 990 1031 1086 N
+ AY N SIL s n/a 7 986 1065 1086 N
+ AY N T b n/a 7 986 1064 1081 N
+ AY N T e n/a 7 990 1064 1081 N
+ AY N T i n/a 7 984 1066 1080 N
+ AY N T s n/a 7 986 1064 1081 N
+ AY N TH b n/a 7 986 1064 1084 N
+ AY N TH e n/a 7 990 1064 1084 N
+ AY N TH s n/a 7 986 1064 1084 N
+ AY N UH b n/a 7 986 1046 1093 N
+ AY N UH e n/a 7 990 1051 1093 N
+ AY N UH s n/a 7 986 1053 1093 N
+ AY N UW b n/a 7 986 1046 1092 N
+ AY N UW e n/a 7 990 1051 1092 N
+ AY N UW s n/a 7 986 1053 1092 N
+ AY N V b n/a 7 989 1036 1070 N
+ AY N V e n/a 7 990 1036 1069 N
+ AY N V i n/a 7 984 1031 1069 N
+ AY N V s n/a 7 986 1036 1069 N
+ AY N W b n/a 7 986 1046 1087 N
+ AY N W e n/a 7 990 1051 1087 N
+ AY N W s n/a 7 986 1053 1088 N
+ AY N Y b n/a 7 986 1031 1102 N
+ AY N Y e n/a 7 990 1031 1102 N
+ AY N Y i n/a 7 984 1031 1096 N
+ AY N Y s n/a 7 986 1031 1102 N
+ AY N Z b n/a 7 990 1031 1074 N
+ AY N Z e n/a 7 990 1031 1073 N
+ AY N Z i n/a 7 984 1031 1073 N
+ AY N Z s n/a 7 986 1031 1073 N
+ AY N ZH e n/a 7 990 1031 1067 N
+ AY N ZH s n/a 7 986 1031 1067 N
+ AY NG AA b n/a 7 987 1046 1092 N
+ AY NG AA s n/a 7 987 1053 1092 N
+ AY NG AE b n/a 7 987 1040 1103 N
+ AY NG AE s n/a 7 987 1040 1103 N
+ AY NG AH b n/a 7 987 1040 1101 N
+ AY NG AH s n/a 7 987 1040 1101 N
+ AY NG AO s n/a 7 987 1053 1092 N
+ AY NG AW s n/a 7 987 1053 1103 N
+ AY NG AY b n/a 7 987 1040 1092 N
+ AY NG AY s n/a 7 987 1040 1092 N
+ AY NG B b n/a 7 987 1036 1070 N
+ AY NG B s n/a 7 987 1036 1070 N
+ AY NG CH s n/a 7 987 1064 1075 N
+ AY NG D b n/a 7 987 1035 1067 N
+ AY NG D s n/a 7 987 1035 1067 N
+ AY NG DH b n/a 7 989 1031 1069 N
+ AY NG DH s n/a 7 987 1031 1069 N
+ AY NG EH b n/a 7 987 1040 1103 N
+ AY NG EH s n/a 7 987 1040 1103 N
+ AY NG ER b n/a 7 987 1046 1094 N
+ AY NG ER s n/a 7 987 1053 1094 N
+ AY NG EY b n/a 7 987 1040 1103 N
+ AY NG EY s n/a 7 987 1040 1103 N
+ AY NG F b n/a 7 987 1064 1084 N
+ AY NG F s n/a 7 987 1064 1084 N
+ AY NG G b n/a 7 987 1035 1077 N
+ AY NG G s n/a 7 987 1035 1077 N
+ AY NG HH b n/a 7 987 1064 1072 N
+ AY NG HH s n/a 7 987 1064 1072 N
+ AY NG IH b n/a 7 987 1040 1103 N
+ AY NG IH s n/a 7 987 1040 1103 N
+ AY NG IY b n/a 7 987 1040 1102 N
+ AY NG IY s n/a 7 987 1040 1102 N
+ AY NG JH b n/a 7 987 1035 1067 N
+ AY NG JH s n/a 7 987 1035 1067 N
+ AY NG K b n/a 7 987 1064 1077 N
+ AY NG K s n/a 7 987 1064 1077 N
+ AY NG L b n/a 7 987 1046 1089 N
+ AY NG L i n/a 7 984 1045 1090 N
+ AY NG L s n/a 7 987 1053 1087 N
+ AY NG M b n/a 7 987 1036 1098 N
+ AY NG M s n/a 7 987 1036 1098 N
+ AY NG N b n/a 7 987 1043 1096 N
+ AY NG N s n/a 7 987 1043 1096 N
+ AY NG NG s n/a 7 987 1040 1096 N
+ AY NG OW b n/a 7 987 1046 1092 N
+ AY NG OW s n/a 7 987 1053 1092 N
+ AY NG OY s n/a 7 987 1040 1092 N
+ AY NG P b n/a 7 987 1064 1076 N
+ AY NG P s n/a 7 987 1064 1076 N
+ AY NG R b n/a 7 987 1046 1093 N
+ AY NG R s n/a 7 987 1053 1093 N
+ AY NG S b n/a 7 987 1064 1083 N
+ AY NG S s n/a 7 987 1064 1084 N
+ AY NG SH b n/a 7 987 1064 1084 N
+ AY NG SH s n/a 7 987 1064 1084 N
+ AY NG SIL s n/a 7 987 1065 1086 N
+ AY NG T b n/a 7 987 1064 1081 N
+ AY NG T s n/a 7 987 1064 1081 N
+ AY NG TH b n/a 7 987 1064 1084 N
+ AY NG TH s n/a 7 987 1064 1084 N
+ AY NG UH b n/a 7 987 1046 1093 N
+ AY NG UH s n/a 7 987 1053 1093 N
+ AY NG UW b n/a 7 987 1046 1092 N
+ AY NG UW s n/a 7 987 1053 1092 N
+ AY NG V b n/a 7 989 1036 1070 N
+ AY NG V s n/a 7 987 1036 1069 N
+ AY NG W b n/a 7 987 1046 1087 N
+ AY NG W s n/a 7 987 1053 1088 N
+ AY NG Y b n/a 7 987 1031 1102 N
+ AY NG Y s n/a 7 987 1031 1102 N
+ AY NG Z b n/a 7 990 1031 1074 N
+ AY NG Z s n/a 7 987 1031 1073 N
+ AY NG ZH s n/a 7 987 1031 1067 N
+ AY OW AA b n/a 7 1023 1046 1092 N
+ AY OW AA e n/a 7 1023 1051 1092 N
+ AY OW AA s n/a 7 1023 1053 1092 N
+ AY OW AE b n/a 7 1023 1040 1103 N
+ AY OW AE e n/a 7 1023 1040 1103 N
+ AY OW AE s n/a 7 1023 1040 1103 N
+ AY OW AH b n/a 7 1023 1040 1101 N
+ AY OW AH e n/a 7 1023 1040 1101 N
+ AY OW AH i n/a 7 1023 1040 1100 N
+ AY OW AH s n/a 7 1023 1040 1101 N
+ AY OW AO e n/a 7 1023 1051 1092 N
+ AY OW AO s n/a 7 1023 1053 1092 N
+ AY OW AW e n/a 7 1023 1051 1103 N
+ AY OW AW s n/a 7 1023 1053 1103 N
+ AY OW AY b n/a 7 1023 1040 1092 N
+ AY OW AY e n/a 7 1023 1040 1092 N
+ AY OW AY s n/a 7 1023 1040 1092 N
+ AY OW B b n/a 7 1023 1036 1070 N
+ AY OW B e n/a 7 1023 1036 1070 N
+ AY OW B s n/a 7 1023 1036 1070 N
+ AY OW CH e n/a 7 1023 1061 1075 N
+ AY OW CH s n/a 7 1023 1061 1075 N
+ AY OW D b n/a 7 1023 1033 1067 N
+ AY OW D e n/a 7 1023 1033 1067 N
+ AY OW D i n/a 7 1023 1031 1068 N
+ AY OW D s n/a 7 1023 1033 1067 N
+ AY OW DH b n/a 7 1023 1031 1069 N
+ AY OW DH e n/a 7 1023 1031 1069 N
+ AY OW DH s n/a 7 1023 1031 1069 N
+ AY OW EH b n/a 7 1023 1040 1103 N
+ AY OW EH e n/a 7 1023 1040 1103 N
+ AY OW EH s n/a 7 1023 1040 1103 N
+ AY OW ER b n/a 7 1023 1046 1094 N
+ AY OW ER e n/a 7 1023 1051 1094 N
+ AY OW ER i n/a 7 1023 1050 1094 N
+ AY OW ER s n/a 7 1023 1053 1094 N
+ AY OW EY b n/a 7 1023 1040 1103 N
+ AY OW EY e n/a 7 1023 1040 1103 N
+ AY OW EY i n/a 7 1023 1040 1103 N
+ AY OW EY s n/a 7 1023 1040 1103 N
+ AY OW F b n/a 7 1023 1061 1084 N
+ AY OW F e n/a 7 1023 1061 1084 N
+ AY OW F s n/a 7 1023 1061 1084 N
+ AY OW G b n/a 7 1023 1033 1077 N
+ AY OW G e n/a 7 1023 1033 1077 N
+ AY OW G s n/a 7 1023 1033 1077 N
+ AY OW HH b n/a 7 1023 1064 1072 N
+ AY OW HH e n/a 7 1023 1064 1072 N
+ AY OW HH s n/a 7 1023 1064 1072 N
+ AY OW IH b n/a 7 1023 1040 1103 N
+ AY OW IH e n/a 7 1023 1040 1103 N
+ AY OW IH s n/a 7 1023 1040 1103 N
+ AY OW IY b n/a 7 1023 1040 1102 N
+ AY OW IY e n/a 7 1023 1040 1102 N
+ AY OW IY s n/a 7 1023 1040 1102 N
+ AY OW JH b n/a 7 1023 1033 1067 N
+ AY OW JH e n/a 7 1023 1033 1067 N
+ AY OW JH s n/a 7 1023 1033 1067 N
+ AY OW K b n/a 7 1005 1061 1077 N
+ AY OW K e n/a 7 1005 1061 1077 N
+ AY OW K i n/a 7 1005 1061 1077 N
+ AY OW K s n/a 7 1005 1061 1077 N
+ AY OW L b n/a 7 1023 1046 1091 N
+ AY OW L e n/a 7 1023 1051 1087 N
+ AY OW L s n/a 7 1023 1053 1087 N
+ AY OW M b n/a 7 1023 1036 1098 N
+ AY OW M e n/a 7 1023 1036 1098 N
+ AY OW M s n/a 7 1023 1036 1098 N
+ AY OW N b n/a 7 1023 1043 1096 N
+ AY OW N e n/a 7 1023 1043 1096 N
+ AY OW N s n/a 7 1023 1043 1096 N
+ AY OW NG e n/a 7 1023 1040 1096 N
+ AY OW NG s n/a 7 1023 1040 1096 N
+ AY OW OW b n/a 7 1023 1046 1092 N
+ AY OW OW e n/a 7 1023 1051 1092 N
+ AY OW OW s n/a 7 1023 1053 1092 N
+ AY OW OY e n/a 7 1023 1040 1092 N
+ AY OW OY s n/a 7 1023 1040 1092 N
+ AY OW P b n/a 7 1005 1061 1076 N
+ AY OW P e n/a 7 1005 1061 1076 N
+ AY OW P s n/a 7 1005 1061 1076 N
+ AY OW R b n/a 7 1023 1046 1093 N
+ AY OW R e n/a 7 1023 1051 1093 N
+ AY OW R s n/a 7 1023 1053 1093 N
+ AY OW S b n/a 7 1023 1061 1083 N
+ AY OW S e n/a 7 1023 1061 1084 N
+ AY OW S i n/a 7 1023 1061 1083 N
+ AY OW S s n/a 7 1023 1061 1084 N
+ AY OW SH b n/a 7 1023 1061 1084 N
+ AY OW SH e n/a 7 1023 1061 1084 N
+ AY OW SH s n/a 7 1023 1061 1084 N
+ AY OW SIL e n/a 7 1023 1031 1086 N
+ AY OW SIL s n/a 7 1023 1065 1086 N
+ AY OW T b n/a 7 1005 1061 1075 N
+ AY OW T e n/a 7 1005 1061 1075 N
+ AY OW T s n/a 7 1005 1061 1075 N
+ AY OW TH b n/a 7 1023 1061 1084 N
+ AY OW TH e n/a 7 1023 1061 1084 N
+ AY OW TH s n/a 7 1023 1061 1084 N
+ AY OW UH b n/a 7 1023 1046 1093 N
+ AY OW UH e n/a 7 1023 1051 1093 N
+ AY OW UH s n/a 7 1023 1053 1093 N
+ AY OW UW b n/a 7 1023 1046 1092 N
+ AY OW UW e n/a 7 1023 1051 1092 N
+ AY OW UW s n/a 7 1023 1053 1092 N
+ AY OW V b n/a 7 1023 1036 1070 N
+ AY OW V e n/a 7 1023 1036 1069 N
+ AY OW V s n/a 7 1023 1036 1069 N
+ AY OW W b n/a 7 1023 1046 1087 N
+ AY OW W e n/a 7 1023 1051 1087 N
+ AY OW W s n/a 7 1023 1053 1088 N
+ AY OW Y b n/a 7 1023 1031 1102 N
+ AY OW Y e n/a 7 1023 1031 1102 N
+ AY OW Y s n/a 7 1023 1031 1102 N
+ AY OW Z b n/a 7 1023 1031 1074 N
+ AY OW Z e n/a 7 1023 1031 1073 N
+ AY OW Z i n/a 7 1023 1031 1073 N
+ AY OW Z s n/a 7 1023 1031 1073 N
+ AY OW ZH e n/a 7 1023 1031 1067 N
+ AY OW ZH s n/a 7 1023 1031 1067 N
+ AY OY AA b n/a 7 987 1046 1092 N
+ AY OY AA s n/a 7 987 1053 1092 N
+ AY OY AE b n/a 7 987 1040 1103 N
+ AY OY AE s n/a 7 987 1040 1103 N
+ AY OY AH b n/a 7 987 1040 1101 N
+ AY OY AH s n/a 7 987 1040 1101 N
+ AY OY AO s n/a 7 987 1053 1092 N
+ AY OY AW s n/a 7 987 1053 1103 N
+ AY OY AY b n/a 7 987 1040 1092 N
+ AY OY AY s n/a 7 987 1040 1092 N
+ AY OY B b n/a 7 987 1036 1070 N
+ AY OY B s n/a 7 987 1036 1070 N
+ AY OY CH s n/a 7 987 1061 1075 N
+ AY OY D b n/a 7 987 1035 1067 N
+ AY OY D s n/a 7 987 1035 1067 N
+ AY OY DH b n/a 7 989 1031 1069 N
+ AY OY DH s n/a 7 987 1031 1069 N
+ AY OY EH b n/a 7 987 1040 1103 N
+ AY OY EH s n/a 7 987 1040 1103 N
+ AY OY ER b n/a 7 987 1046 1094 N
+ AY OY ER s n/a 7 987 1053 1094 N
+ AY OY EY b n/a 7 987 1040 1103 N
+ AY OY EY s n/a 7 987 1040 1103 N
+ AY OY F b n/a 7 987 1061 1084 N
+ AY OY F s n/a 7 987 1061 1084 N
+ AY OY G b n/a 7 987 1035 1077 N
+ AY OY G s n/a 7 987 1035 1077 N
+ AY OY HH b n/a 7 987 1064 1072 N
+ AY OY HH s n/a 7 987 1064 1072 N
+ AY OY IH b n/a 7 987 1040 1103 N
+ AY OY IH s n/a 7 987 1040 1103 N
+ AY OY IY b n/a 7 987 1040 1102 N
+ AY OY IY s n/a 7 987 1040 1102 N
+ AY OY JH b n/a 7 987 1035 1067 N
+ AY OY JH s n/a 7 987 1035 1067 N
+ AY OY K b n/a 7 987 1061 1077 N
+ AY OY K s n/a 7 987 1061 1077 N
+ AY OY L b n/a 7 987 1046 1089 N
+ AY OY L s n/a 7 987 1053 1087 N
+ AY OY M b n/a 7 987 1036 1098 N
+ AY OY M s n/a 7 987 1036 1098 N
+ AY OY N b n/a 7 987 1043 1096 N
+ AY OY N s n/a 7 987 1043 1096 N
+ AY OY NG s n/a 7 987 1040 1096 N
+ AY OY OW b n/a 7 987 1046 1092 N
+ AY OY OW s n/a 7 987 1053 1092 N
+ AY OY OY s n/a 7 987 1040 1092 N
+ AY OY P b n/a 7 987 1061 1076 N
+ AY OY P s n/a 7 987 1061 1076 N
+ AY OY R b n/a 7 987 1046 1093 N
+ AY OY R s n/a 7 987 1053 1093 N
+ AY OY S b n/a 7 987 1061 1083 N
+ AY OY S s n/a 7 987 1061 1084 N
+ AY OY SH b n/a 7 987 1061 1084 N
+ AY OY SH s n/a 7 987 1061 1084 N
+ AY OY SIL s n/a 7 987 1065 1086 N
+ AY OY T b n/a 7 987 1061 1075 N
+ AY OY T s n/a 7 987 1061 1075 N
+ AY OY TH b n/a 7 987 1061 1084 N
+ AY OY TH s n/a 7 987 1061 1084 N
+ AY OY UH b n/a 7 987 1046 1093 N
+ AY OY UH s n/a 7 987 1053 1093 N
+ AY OY UW b n/a 7 987 1046 1092 N
+ AY OY UW s n/a 7 987 1053 1092 N
+ AY OY V b n/a 7 989 1036 1070 N
+ AY OY V s n/a 7 987 1036 1069 N
+ AY OY W b n/a 7 987 1046 1087 N
+ AY OY W s n/a 7 987 1053 1088 N
+ AY OY Y b n/a 7 987 1031 1102 N
+ AY OY Y s n/a 7 987 1031 1102 N
+ AY OY Z b n/a 7 990 1031 1074 N
+ AY OY Z s n/a 7 987 1031 1073 N
+ AY OY ZH s n/a 7 987 1031 1067 N
+ AY P AA b n/a 7 1013 1046 1092 N
+ AY P AA e n/a 7 1013 1051 1092 N
+ AY P AA i n/a 7 1013 1049 1092 N
+ AY P AA s n/a 7 1013 1053 1092 N
+ AY P AE b n/a 7 1013 1041 1103 N
+ AY P AE e n/a 7 1013 1041 1103 N
+ AY P AE s n/a 7 1013 1041 1103 N
+ AY P AH b n/a 7 1013 1041 1101 N
+ AY P AH e n/a 7 1013 1041 1101 N
+ AY P AH i n/a 7 1013 1042 1100 N
+ AY P AH s n/a 7 1013 1041 1101 N
+ AY P AO e n/a 7 1013 1051 1092 N
+ AY P AO s n/a 7 1013 1053 1092 N
+ AY P AW e n/a 7 1013 1051 1103 N
+ AY P AW s n/a 7 1013 1053 1103 N
+ AY P AY b n/a 7 1013 1041 1092 N
+ AY P AY e n/a 7 1013 1041 1092 N
+ AY P AY s n/a 7 1013 1041 1092 N
+ AY P B b n/a 7 1013 1033 1070 N
+ AY P B e n/a 7 1013 1033 1070 N
+ AY P B i n/a 7 1013 1029 1070 N
+ AY P B s n/a 7 1013 1033 1070 N
+ AY P CH e n/a 7 1013 1057 1075 N
+ AY P CH s n/a 7 1013 1061 1075 N
+ AY P D b n/a 7 1013 1033 1067 N
+ AY P D e n/a 7 1013 1033 1067 N
+ AY P D i n/a 7 1013 1029 1068 N
+ AY P D s n/a 7 1013 1033 1067 N
+ AY P DH b n/a 7 1011 1034 1071 N
+ AY P DH e n/a 7 1011 1034 1071 N
+ AY P DH i n/a 7 1011 1028 1071 N
+ AY P DH s n/a 7 1011 1034 1071 N
+ AY P EH b n/a 7 1013 1041 1103 N
+ AY P EH e n/a 7 1013 1041 1103 N
+ AY P EH i n/a 7 1013 1042 1103 N
+ AY P EH s n/a 7 1013 1041 1103 N
+ AY P ER b n/a 7 1013 1046 1094 N
+ AY P ER e n/a 7 1013 1051 1094 N
+ AY P ER i n/a 7 1013 1049 1094 N
+ AY P ER s n/a 7 1013 1053 1094 N
+ AY P EY b n/a 7 1013 1041 1103 N
+ AY P EY e n/a 7 1013 1041 1103 N
+ AY P EY i n/a 7 1013 1042 1103 N
+ AY P EY s n/a 7 1013 1041 1103 N
+ AY P F b n/a 7 1013 1057 1084 N
+ AY P F e n/a 7 1013 1057 1084 N
+ AY P F i n/a 7 1013 1057 1084 N
+ AY P F s n/a 7 1013 1061 1084 N
+ AY P G b n/a 7 1013 1033 1077 N
+ AY P G e n/a 7 1013 1033 1077 N
+ AY P G i n/a 7 1013 1028 1077 N
+ AY P G s n/a 7 1013 1033 1077 N
+ AY P HH b n/a 7 1011 1057 1072 N
+ AY P HH e n/a 7 1011 1057 1072 N
+ AY P HH s n/a 7 1011 1064 1072 N
+ AY P IH b n/a 7 1013 1041 1103 N
+ AY P IH e n/a 7 1013 1041 1103 N
+ AY P IH i n/a 7 1013 1042 1097 N
+ AY P IH s n/a 7 1013 1041 1103 N
+ AY P IY b n/a 7 1013 1041 1102 N
+ AY P IY e n/a 7 1013 1041 1102 N
+ AY P IY s n/a 7 1013 1041 1102 N
+ AY P JH b n/a 7 1013 1033 1067 N
+ AY P JH e n/a 7 1013 1033 1067 N
+ AY P JH i n/a 7 1013 1028 1067 N
+ AY P JH s n/a 7 1013 1033 1067 N
+ AY P K b n/a 7 1005 1057 1077 N
+ AY P K e n/a 7 1005 1057 1077 N
+ AY P K i n/a 7 1005 1057 1077 N
+ AY P K s n/a 7 1005 1061 1077 N
+ AY P L b n/a 7 1013 1046 1091 N
+ AY P L e n/a 7 1013 1051 1087 N
+ AY P L i n/a 7 1013 1045 1089 N
+ AY P L s n/a 7 1013 1053 1087 N
+ AY P M b n/a 7 1014 1029 1098 N
+ AY P M e n/a 7 1014 1029 1098 N
+ AY P M i n/a 7 1014 1039 1099 N
+ AY P M s n/a 7 1014 1029 1098 N
+ AY P N b n/a 7 1014 1043 1096 N
+ AY P N e n/a 7 1014 1043 1096 N
+ AY P N i n/a 7 1014 1039 1095 N
+ AY P N s n/a 7 1014 1043 1096 N
+ AY P NG e n/a 7 1014 1041 1096 N
+ AY P NG s n/a 7 1014 1041 1096 N
+ AY P OW b n/a 7 1013 1046 1092 N
+ AY P OW e n/a 7 1013 1051 1092 N
+ AY P OW i n/a 7 1013 1049 1092 N
+ AY P OW s n/a 7 1013 1053 1092 N
+ AY P OY e n/a 7 1013 1041 1092 N
+ AY P OY s n/a 7 1013 1041 1092 N
+ AY P P b n/a 7 1005 1057 1076 N
+ AY P P e n/a 7 1005 1057 1076 N
+ AY P P i n/a 7 1005 1057 1075 N
+ AY P P s n/a 7 1005 1061 1076 N
+ AY P R b n/a 7 1013 1046 1093 N
+ AY P R e n/a 7 1013 1051 1093 N
+ AY P R i n/a 7 1013 1049 1094 N
+ AY P R s n/a 7 1013 1053 1093 N
+ AY P S b n/a 7 1013 1057 1083 N
+ AY P S e n/a 7 1013 1057 1084 N
+ AY P S i n/a 7 1013 1057 1084 N
+ AY P S s n/a 7 1013 1061 1084 N
+ AY P SH b n/a 7 1013 1057 1084 N
+ AY P SH e n/a 7 1013 1057 1084 N
+ AY P SH s n/a 7 1013 1061 1084 N
+ AY P SIL e n/a 7 1011 1030 1086 N
+ AY P SIL s n/a 7 1011 1065 1085 N
+ AY P T b n/a 7 1005 1057 1075 N
+ AY P T e n/a 7 1005 1057 1075 N
+ AY P T i n/a 7 1005 1057 1078 N
+ AY P T s n/a 7 1005 1061 1075 N
+ AY P TH b n/a 7 1013 1057 1084 N
+ AY P TH e n/a 7 1013 1057 1084 N
+ AY P TH i n/a 7 1013 1057 1084 N
+ AY P TH s n/a 7 1013 1061 1084 N
+ AY P UH b n/a 7 1013 1046 1093 N
+ AY P UH e n/a 7 1013 1051 1093 N
+ AY P UH s n/a 7 1013 1053 1093 N
+ AY P UW b n/a 7 1013 1046 1092 N
+ AY P UW e n/a 7 1013 1051 1092 N
+ AY P UW s n/a 7 1013 1053 1092 N
+ AY P V b n/a 7 1011 1029 1070 N
+ AY P V e n/a 7 1011 1029 1069 N
+ AY P V i n/a 7 1011 1029 1069 N
+ AY P V s n/a 7 1011 1029 1069 N
+ AY P W b n/a 7 1013 1046 1088 N
+ AY P W e n/a 7 1013 1051 1088 N
+ AY P W i n/a 7 1013 1045 1089 N
+ AY P W s n/a 7 1013 1053 1088 N
+ AY P Y b n/a 7 1013 1028 1102 N
+ AY P Y e n/a 7 1013 1028 1102 N
+ AY P Y i n/a 7 1013 1028 1095 N
+ AY P Y s n/a 7 1013 1028 1102 N
+ AY P Z b n/a 7 1011 1029 1074 N
+ AY P Z e n/a 7 1011 1029 1073 N
+ AY P Z i n/a 7 1011 1029 1073 N
+ AY P Z s n/a 7 1011 1029 1073 N
+ AY P ZH e n/a 7 1011 1028 1067 N
+ AY P ZH s n/a 7 1011 1028 1067 N
+ AY R AA b n/a 7 1026 1046 1092 N
+ AY R AA e n/a 7 1025 1051 1092 N
+ AY R AA i n/a 7 1025 1050 1092 N
+ AY R AA s n/a 7 1026 1053 1092 N
+ AY R AE b n/a 7 1026 1041 1103 N
+ AY R AE e n/a 7 1025 1041 1103 N
+ AY R AE i n/a 7 1025 1041 1103 N
+ AY R AE s n/a 7 1026 1041 1103 N
+ AY R AH b n/a 7 1026 1041 1101 N
+ AY R AH e n/a 7 1025 1041 1101 N
+ AY R AH i n/a 7 1025 1041 1100 N
+ AY R AH s n/a 7 1026 1041 1101 N
+ AY R AO e n/a 7 1025 1051 1092 N
+ AY R AO i n/a 7 1025 1050 1092 N
+ AY R AO s n/a 7 1026 1053 1092 N
+ AY R AW e n/a 7 1025 1051 1103 N
+ AY R AW i n/a 7 1025 1050 1103 N
+ AY R AW s n/a 7 1026 1053 1103 N
+ AY R AY b n/a 7 1026 1041 1092 N
+ AY R AY e n/a 7 1025 1041 1092 N
+ AY R AY s n/a 7 1026 1041 1092 N
+ AY R B b n/a 7 1026 1036 1070 N
+ AY R B e n/a 7 1025 1036 1070 N
+ AY R B i n/a 7 1025 1032 1070 N
+ AY R B s n/a 7 1026 1036 1070 N
+ AY R CH e n/a 7 1025 1061 1075 N
+ AY R CH i n/a 7 1024 1060 1075 N
+ AY R CH s n/a 7 1026 1061 1075 N
+ AY R D b n/a 7 1026 1033 1067 N
+ AY R D e n/a 7 1025 1033 1067 N
+ AY R D i n/a 7 1025 1032 1068 N
+ AY R D s n/a 7 1026 1033 1067 N
+ AY R DH b n/a 7 1026 1032 1069 N
+ AY R DH e n/a 7 1025 1032 1069 N
+ AY R DH i n/a 7 1025 1032 1069 N
+ AY R DH s n/a 7 1026 1032 1069 N
+ AY R EH b n/a 7 1026 1041 1103 N
+ AY R EH e n/a 7 1025 1041 1103 N
+ AY R EH i n/a 7 1025 1041 1103 N
+ AY R EH s n/a 7 1026 1041 1103 N
+ AY R ER b n/a 7 1026 1046 1094 N
+ AY R ER e n/a 7 1025 1051 1094 N
+ AY R ER i n/a 7 1025 1050 1094 N
+ AY R ER s n/a 7 1026 1053 1094 N
+ AY R EY b n/a 7 1026 1041 1103 N
+ AY R EY e n/a 7 1025 1041 1103 N
+ AY R EY s n/a 7 1026 1041 1103 N
+ AY R F b n/a 7 1026 1061 1084 N
+ AY R F e n/a 7 1025 1061 1084 N
+ AY R F i n/a 7 1024 1060 1083 N
+ AY R F s n/a 7 1026 1061 1084 N
+ AY R G b n/a 7 1026 1033 1077 N
+ AY R G e n/a 7 1025 1033 1077 N
+ AY R G i n/a 7 1025 1032 1077 N
+ AY R G s n/a 7 1026 1033 1077 N
+ AY R HH b n/a 7 1026 1064 1072 N
+ AY R HH e n/a 7 1025 1064 1072 N
+ AY R HH i n/a 7 1024 1060 1072 N
+ AY R HH s n/a 7 1026 1064 1072 N
+ AY R IH b n/a 7 1026 1041 1103 N
+ AY R IH e n/a 7 1025 1041 1103 N
+ AY R IH i n/a 7 1025 1042 1097 N
+ AY R IH s n/a 7 1026 1041 1103 N
+ AY R IY b n/a 7 1026 1041 1102 N
+ AY R IY e n/a 7 1025 1041 1102 N
+ AY R IY i n/a 7 1025 1042 1095 N
+ AY R IY s n/a 7 1026 1041 1102 N
+ AY R JH b n/a 7 1026 1033 1067 N
+ AY R JH e n/a 7 1025 1033 1067 N
+ AY R JH i n/a 7 1025 1032 1067 N
+ AY R JH s n/a 7 1026 1033 1067 N
+ AY R K b n/a 7 1026 1061 1077 N
+ AY R K e n/a 7 1025 1061 1077 N
+ AY R K i n/a 7 1024 1060 1077 N
+ AY R K s n/a 7 1026 1061 1077 N
+ AY R L b n/a 7 1026 1046 1089 N
+ AY R L e n/a 7 1025 1051 1087 N
+ AY R L i n/a 7 1025 1045 1090 N
+ AY R L s n/a 7 1026 1053 1087 N
+ AY R M b n/a 7 1026 1036 1098 N
+ AY R M e n/a 7 1025 1036 1098 N
+ AY R M i n/a 7 1025 1039 1099 N
+ AY R M s n/a 7 1026 1036 1098 N
+ AY R N b n/a 7 1026 1043 1096 N
+ AY R N e n/a 7 1025 1043 1096 N
+ AY R N i n/a 7 1025 1037 1095 N
+ AY R N s n/a 7 1026 1043 1096 N
+ AY R NG e n/a 7 1025 1041 1096 N
+ AY R NG i n/a 7 1025 1039 1095 N
+ AY R NG s n/a 7 1026 1041 1096 N
+ AY R OW b n/a 7 1026 1046 1092 N
+ AY R OW e n/a 7 1025 1051 1092 N
+ AY R OW i n/a 7 1025 1050 1092 N
+ AY R OW s n/a 7 1026 1053 1092 N
+ AY R OY e n/a 7 1025 1041 1092 N
+ AY R OY s n/a 7 1026 1041 1092 N
+ AY R P b n/a 7 1026 1061 1076 N
+ AY R P e n/a 7 1025 1061 1076 N
+ AY R P i n/a 7 1024 1060 1075 N
+ AY R P s n/a 7 1026 1061 1076 N
+ AY R R b n/a 7 1026 1046 1093 N
+ AY R R e n/a 7 1025 1051 1093 N
+ AY R R i n/a 7 1025 1050 1094 N
+ AY R R s n/a 7 1026 1053 1093 N
+ AY R S b n/a 7 1026 1061 1083 N
+ AY R S e n/a 7 1025 1061 1084 N
+ AY R S i n/a 7 1024 1060 1083 N
+ AY R S s n/a 7 1026 1061 1084 N
+ AY R SH b n/a 7 1026 1061 1084 N
+ AY R SH e n/a 7 1025 1061 1084 N
+ AY R SH i n/a 7 1024 1060 1083 N
+ AY R SH s n/a 7 1026 1061 1084 N
+ AY R SIL e n/a 7 1025 1032 1086 N
+ AY R SIL s n/a 7 1026 1065 1086 N
+ AY R T b n/a 7 1026 1061 1075 N
+ AY R T e n/a 7 1025 1061 1075 N
+ AY R T i n/a 7 1024 1060 1079 N
+ AY R T s n/a 7 1026 1061 1075 N
+ AY R TH b n/a 7 1026 1061 1084 N
+ AY R TH e n/a 7 1025 1061 1084 N
+ AY R TH i n/a 7 1024 1060 1083 N
+ AY R TH s n/a 7 1026 1061 1084 N
+ AY R UH b n/a 7 1026 1046 1093 N
+ AY R UH e n/a 7 1025 1051 1093 N
+ AY R UH s n/a 7 1026 1053 1093 N
+ AY R UW b n/a 7 1026 1046 1092 N
+ AY R UW e n/a 7 1025 1051 1092 N
+ AY R UW i n/a 7 1025 1050 1092 N
+ AY R UW s n/a 7 1026 1053 1092 N
+ AY R V b n/a 7 1026 1036 1070 N
+ AY R V e n/a 7 1025 1036 1069 N
+ AY R V i n/a 7 1025 1032 1069 N
+ AY R V s n/a 7 1026 1036 1069 N
+ AY R W b n/a 7 1026 1046 1087 N
+ AY R W e n/a 7 1025 1051 1087 N
+ AY R W i n/a 7 1025 1045 1090 N
+ AY R W s n/a 7 1026 1053 1088 N
+ AY R Y b n/a 7 1026 1032 1102 N
+ AY R Y e n/a 7 1025 1032 1102 N
+ AY R Y i n/a 7 1025 1032 1095 N
+ AY R Y s n/a 7 1026 1032 1102 N
+ AY R Z b n/a 7 1027 1032 1074 N
+ AY R Z e n/a 7 1025 1032 1073 N
+ AY R Z i n/a 7 1025 1032 1073 N
+ AY R Z s n/a 7 1027 1032 1073 N
+ AY R ZH e n/a 7 1025 1032 1067 N
+ AY R ZH s n/a 7 1026 1032 1067 N
+ AY S AA b n/a 7 993 1046 1092 N
+ AY S AA e n/a 7 993 1051 1092 N
+ AY S AA i n/a 7 993 1050 1092 N
+ AY S AA s n/a 7 994 1053 1092 N
+ AY S AE b n/a 7 993 1040 1103 N
+ AY S AE e n/a 7 993 1040 1103 N
+ AY S AE i n/a 7 993 1040 1103 N
+ AY S AE s n/a 7 994 1040 1103 N
+ AY S AH b n/a 7 992 1040 1101 N
+ AY S AH e n/a 7 992 1040 1101 N
+ AY S AH i n/a 7 992 1040 1100 N
+ AY S AH s n/a 7 994 1040 1101 N
+ AY S AO e n/a 7 993 1051 1092 N
+ AY S AO s n/a 7 994 1053 1092 N
+ AY S AW e n/a 7 993 1051 1103 N
+ AY S AW s n/a 7 994 1053 1103 N
+ AY S AY b n/a 7 993 1040 1092 N
+ AY S AY e n/a 7 993 1040 1092 N
+ AY S AY s n/a 7 994 1040 1092 N
+ AY S B b n/a 7 994 1036 1070 N
+ AY S B e n/a 7 994 1036 1070 N
+ AY S B i n/a 7 993 1031 1070 N
+ AY S B s n/a 7 994 1036 1070 N
+ AY S CH e n/a 7 991 1061 1075 N
+ AY S CH s n/a 7 991 1061 1075 N
+ AY S D b n/a 7 994 1035 1067 N
+ AY S D e n/a 7 994 1035 1067 N
+ AY S D i n/a 7 993 1031 1068 N
+ AY S D s n/a 7 994 1035 1067 N
+ AY S DH b n/a 7 993 1031 1069 N
+ AY S DH e n/a 7 993 1031 1069 N
+ AY S DH i n/a 7 993 1031 1069 N
+ AY S DH s n/a 7 994 1031 1069 N
+ AY S EH b n/a 7 992 1040 1103 N
+ AY S EH e n/a 7 992 1040 1103 N
+ AY S EH i n/a 7 992 1040 1103 N
+ AY S EH s n/a 7 994 1040 1103 N
+ AY S ER b n/a 7 993 1046 1094 N
+ AY S ER e n/a 7 993 1051 1094 N
+ AY S ER i n/a 7 993 1050 1094 N
+ AY S ER s n/a 7 994 1053 1094 N
+ AY S EY b n/a 7 993 1040 1103 N
+ AY S EY e n/a 7 993 1040 1103 N
+ AY S EY s n/a 7 994 1040 1103 N
+ AY S F b n/a 7 991 1061 1084 N
+ AY S F e n/a 7 991 1061 1084 N
+ AY S F i n/a 7 991 1061 1083 N
+ AY S F s n/a 7 991 1061 1084 N
+ AY S G b n/a 7 994 1035 1077 N
+ AY S G e n/a 7 994 1035 1077 N
+ AY S G i n/a 7 993 1031 1077 N
+ AY S G s n/a 7 994 1035 1077 N
+ AY S HH b n/a 7 991 1064 1072 N
+ AY S HH e n/a 7 991 1064 1072 N
+ AY S HH i n/a 7 991 1066 1072 N
+ AY S HH s n/a 7 991 1064 1072 N
+ AY S IH b n/a 7 992 1040 1103 N
+ AY S IH e n/a 7 992 1040 1103 N
+ AY S IH i n/a 7 992 1040 1097 N
+ AY S IH s n/a 7 994 1040 1103 N
+ AY S IY b n/a 7 993 1040 1102 N
+ AY S IY e n/a 7 993 1040 1102 N
+ AY S IY i n/a 7 993 1040 1095 N
+ AY S IY s n/a 7 994 1040 1102 N
+ AY S JH b n/a 7 994 1035 1067 N
+ AY S JH e n/a 7 994 1035 1067 N
+ AY S JH i n/a 7 993 1031 1068 N
+ AY S JH s n/a 7 994 1035 1067 N
+ AY S K b n/a 7 991 1061 1077 N
+ AY S K e n/a 7 991 1061 1077 N
+ AY S K i n/a 7 991 1061 1077 N
+ AY S K s n/a 7 991 1061 1077 N
+ AY S L b n/a 7 993 1046 1089 N
+ AY S L e n/a 7 993 1051 1087 N
+ AY S L i n/a 7 993 1045 1089 N
+ AY S L s n/a 7 994 1053 1087 N
+ AY S M b n/a 7 992 1036 1098 N
+ AY S M e n/a 7 992 1036 1098 N
+ AY S M i n/a 7 992 1039 1099 N
+ AY S M s n/a 7 994 1036 1098 N
+ AY S N b n/a 7 992 1043 1096 N
+ AY S N e n/a 7 992 1043 1096 N
+ AY S N i n/a 7 992 1039 1095 N
+ AY S N s n/a 7 994 1043 1096 N
+ AY S NG e n/a 7 992 1040 1096 N
+ AY S NG s n/a 7 994 1040 1096 N
+ AY S OW b n/a 7 993 1046 1092 N
+ AY S OW e n/a 7 993 1051 1092 N
+ AY S OW s n/a 7 994 1053 1092 N
+ AY S OY e n/a 7 993 1040 1092 N
+ AY S OY s n/a 7 994 1040 1092 N
+ AY S P b n/a 7 991 1061 1076 N
+ AY S P e n/a 7 991 1061 1076 N
+ AY S P i n/a 7 991 1061 1075 N
+ AY S P s n/a 7 991 1061 1076 N
+ AY S R b n/a 7 993 1046 1093 N
+ AY S R e n/a 7 993 1051 1093 N
+ AY S R i n/a 7 993 1050 1094 N
+ AY S R s n/a 7 994 1053 1093 N
+ AY S S b n/a 7 991 1061 1083 N
+ AY S S e n/a 7 991 1061 1084 N
+ AY S S i n/a 7 991 1061 1083 N
+ AY S S s n/a 7 991 1061 1084 N
+ AY S SH b n/a 7 991 1061 1084 N
+ AY S SH e n/a 7 991 1061 1084 N
+ AY S SH s n/a 7 991 1061 1084 N
+ AY S SIL e n/a 7 993 1031 1086 N
+ AY S SIL s n/a 7 994 1065 1085 N
+ AY S T b n/a 7 991 1061 1075 N
+ AY S T e n/a 7 991 1061 1075 N
+ AY S T i n/a 7 991 1061 1078 N
+ AY S T s n/a 7 991 1061 1075 N
+ AY S TH b n/a 7 991 1061 1084 N
+ AY S TH e n/a 7 991 1061 1084 N
+ AY S TH i n/a 7 991 1061 1083 N
+ AY S TH s n/a 7 991 1061 1084 N
+ AY S UH b n/a 7 992 1046 1093 N
+ AY S UH e n/a 7 992 1051 1093 N
+ AY S UH s n/a 7 994 1053 1093 N
+ AY S UW b n/a 7 993 1046 1092 N
+ AY S UW e n/a 7 993 1051 1092 N
+ AY S UW s n/a 7 994 1053 1092 N
+ AY S V b n/a 7 994 1036 1070 N
+ AY S V e n/a 7 994 1036 1069 N
+ AY S V i n/a 7 993 1031 1069 N
+ AY S V s n/a 7 994 1036 1069 N
+ AY S W b n/a 7 993 1046 1087 N
+ AY S W e n/a 7 993 1051 1087 N
+ AY S W i n/a 7 993 1045 1089 N
+ AY S W s n/a 7 994 1053 1088 N
+ AY S Y b n/a 7 993 1031 1102 N
+ AY S Y e n/a 7 993 1031 1102 N
+ AY S Y s n/a 7 994 1031 1102 N
+ AY S Z b n/a 7 993 1031 1074 N
+ AY S Z e n/a 7 993 1031 1073 N
+ AY S Z i n/a 7 993 1031 1073 N
+ AY S Z s n/a 7 994 1031 1073 N
+ AY S ZH e n/a 7 993 1031 1067 N
+ AY S ZH s n/a 7 994 1031 1067 N
+ AY SH AA b n/a 7 995 1046 1092 N
+ AY SH AA e n/a 7 995 1051 1092 N
+ AY SH AA s n/a 7 988 1053 1092 N
+ AY SH AE b n/a 7 995 1040 1103 N
+ AY SH AE e n/a 7 995 1040 1103 N
+ AY SH AE s n/a 7 988 1040 1103 N
+ AY SH AH b n/a 7 995 1040 1101 N
+ AY SH AH e n/a 7 995 1040 1101 N
+ AY SH AH i n/a 7 995 1040 1100 N
+ AY SH AH s n/a 7 988 1040 1101 N
+ AY SH AO e n/a 7 995 1051 1092 N
+ AY SH AO s n/a 7 988 1053 1092 N
+ AY SH AW e n/a 7 995 1051 1103 N
+ AY SH AW s n/a 7 988 1053 1103 N
+ AY SH AY b n/a 7 995 1040 1092 N
+ AY SH AY e n/a 7 995 1040 1092 N
+ AY SH AY s n/a 7 988 1040 1092 N
+ AY SH B b n/a 7 995 1036 1070 N
+ AY SH B e n/a 7 995 1036 1070 N
+ AY SH B i n/a 7 995 1031 1070 N
+ AY SH B s n/a 7 988 1036 1070 N
+ AY SH CH e n/a 7 995 1061 1075 N
+ AY SH CH s n/a 7 988 1061 1075 N
+ AY SH D b n/a 7 995 1035 1067 N
+ AY SH D e n/a 7 995 1035 1067 N
+ AY SH D i n/a 7 995 1031 1068 N
+ AY SH D s n/a 7 988 1035 1067 N
+ AY SH DH b n/a 7 995 1031 1069 N
+ AY SH DH e n/a 7 995 1031 1069 N
+ AY SH DH s n/a 7 988 1031 1069 N
+ AY SH EH b n/a 7 995 1040 1103 N
+ AY SH EH e n/a 7 995 1040 1103 N
+ AY SH EH i n/a 7 995 1040 1103 N
+ AY SH EH s n/a 7 988 1040 1103 N
+ AY SH ER b n/a 7 995 1046 1094 N
+ AY SH ER e n/a 7 995 1051 1094 N
+ AY SH ER i n/a 7 995 1050 1094 N
+ AY SH ER s n/a 7 988 1053 1094 N
+ AY SH EY b n/a 7 995 1040 1103 N
+ AY SH EY e n/a 7 995 1040 1103 N
+ AY SH EY s n/a 7 988 1040 1103 N
+ AY SH F b n/a 7 995 1061 1084 N
+ AY SH F e n/a 7 995 1061 1084 N
+ AY SH F s n/a 7 988 1061 1084 N
+ AY SH G b n/a 7 995 1035 1077 N
+ AY SH G e n/a 7 995 1035 1077 N
+ AY SH G s n/a 7 988 1035 1077 N
+ AY SH HH b n/a 7 995 1064 1072 N
+ AY SH HH e n/a 7 995 1064 1072 N
+ AY SH HH s n/a 7 988 1064 1072 N
+ AY SH IH b n/a 7 995 1040 1103 N
+ AY SH IH e n/a 7 995 1040 1103 N
+ AY SH IH i n/a 7 995 1040 1097 N
+ AY SH IH s n/a 7 988 1040 1103 N
+ AY SH IY b n/a 7 995 1040 1102 N
+ AY SH IY e n/a 7 995 1040 1102 N
+ AY SH IY s n/a 7 988 1040 1102 N
+ AY SH JH b n/a 7 995 1035 1067 N
+ AY SH JH e n/a 7 995 1035 1067 N
+ AY SH JH i n/a 7 995 1031 1068 N
+ AY SH JH s n/a 7 988 1035 1067 N
+ AY SH K b n/a 7 995 1061 1077 N
+ AY SH K e n/a 7 995 1061 1077 N
+ AY SH K i n/a 7 995 1061 1077 N
+ AY SH K s n/a 7 988 1061 1077 N
+ AY SH L b n/a 7 995 1046 1089 N
+ AY SH L e n/a 7 995 1051 1087 N
+ AY SH L i n/a 7 995 1045 1089 N
+ AY SH L s n/a 7 988 1053 1087 N
+ AY SH M b n/a 7 995 1036 1098 N
+ AY SH M e n/a 7 995 1036 1098 N
+ AY SH M i n/a 7 995 1039 1099 N
+ AY SH M s n/a 7 995 1036 1098 N
+ AY SH N b n/a 7 995 1043 1096 N
+ AY SH N e n/a 7 995 1043 1096 N
+ AY SH N i n/a 7 995 1039 1095 N
+ AY SH N s n/a 7 995 1043 1096 N
+ AY SH NG e n/a 7 995 1040 1096 N
+ AY SH NG s n/a 7 995 1040 1096 N
+ AY SH OW b n/a 7 995 1046 1092 N
+ AY SH OW e n/a 7 995 1051 1092 N
+ AY SH OW s n/a 7 988 1053 1092 N
+ AY SH OY e n/a 7 995 1040 1092 N
+ AY SH OY s n/a 7 988 1040 1092 N
+ AY SH P b n/a 7 995 1061 1076 N
+ AY SH P e n/a 7 995 1061 1076 N
+ AY SH P i n/a 7 995 1061 1075 N
+ AY SH P s n/a 7 988 1061 1076 N
+ AY SH R b n/a 7 995 1046 1093 N
+ AY SH R e n/a 7 995 1051 1093 N
+ AY SH R i n/a 7 995 1050 1094 N
+ AY SH R s n/a 7 988 1053 1093 N
+ AY SH S b n/a 7 995 1061 1083 N
+ AY SH S e n/a 7 995 1061 1084 N
+ AY SH S i n/a 7 995 1061 1083 N
+ AY SH S s n/a 7 988 1061 1084 N
+ AY SH SH b n/a 7 995 1061 1084 N
+ AY SH SH e n/a 7 995 1061 1084 N
+ AY SH SH s n/a 7 988 1061 1084 N
+ AY SH SIL e n/a 7 995 1031 1086 N
+ AY SH SIL s n/a 7 988 1065 1085 N
+ AY SH T b n/a 7 995 1061 1075 N
+ AY SH T e n/a 7 995 1061 1075 N
+ AY SH T i n/a 7 995 1061 1078 N
+ AY SH T s n/a 7 988 1061 1075 N
+ AY SH TH b n/a 7 995 1061 1084 N
+ AY SH TH e n/a 7 995 1061 1084 N
+ AY SH TH s n/a 7 988 1061 1084 N
+ AY SH UH b n/a 7 995 1046 1093 N
+ AY SH UH e n/a 7 995 1051 1093 N
+ AY SH UH s n/a 7 988 1053 1093 N
+ AY SH UW b n/a 7 995 1046 1092 N
+ AY SH UW e n/a 7 995 1051 1092 N
+ AY SH UW s n/a 7 988 1053 1092 N
+ AY SH V b n/a 7 995 1036 1070 N
+ AY SH V e n/a 7 995 1036 1069 N
+ AY SH V i n/a 7 995 1031 1069 N
+ AY SH V s n/a 7 988 1036 1069 N
+ AY SH W b n/a 7 995 1046 1087 N
+ AY SH W e n/a 7 995 1051 1087 N
+ AY SH W s n/a 7 988 1053 1088 N
+ AY SH Y b n/a 7 995 1031 1102 N
+ AY SH Y e n/a 7 995 1031 1102 N
+ AY SH Y s n/a 7 988 1031 1102 N
+ AY SH Z b n/a 7 995 1031 1074 N
+ AY SH Z e n/a 7 995 1031 1073 N
+ AY SH Z i n/a 7 995 1031 1073 N
+ AY SH Z s n/a 7 988 1031 1073 N
+ AY SH ZH e n/a 7 995 1031 1067 N
+ AY SH ZH s n/a 7 988 1031 1067 N
+ AY SIL AA b n/a 7 1004 1046 1092 N
+ AY SIL AA s n/a 7 1004 1053 1092 N
+ AY SIL AE b n/a 7 1004 1040 1103 N
+ AY SIL AE s n/a 7 1004 1040 1103 N
+ AY SIL AH b n/a 7 1004 1040 1101 N
+ AY SIL AH s n/a 7 1004 1040 1101 N
+ AY SIL AO s n/a 7 1004 1053 1092 N
+ AY SIL AW s n/a 7 1004 1053 1103 N
+ AY SIL AY b n/a 7 1004 1040 1092 N
+ AY SIL AY s n/a 7 1004 1040 1092 N
+ AY SIL B b n/a 7 1004 1036 1070 N
+ AY SIL B s n/a 7 1002 1036 1070 N
+ AY SIL CH s n/a 7 1002 1062 1075 N
+ AY SIL D b n/a 7 1004 1035 1067 N
+ AY SIL D s n/a 7 1002 1035 1067 N
+ AY SIL DH b n/a 7 1004 1031 1069 N
+ AY SIL DH s n/a 7 1002 1031 1069 N
+ AY SIL EH b n/a 7 1004 1040 1103 N
+ AY SIL EH s n/a 7 1004 1040 1103 N
+ AY SIL ER b n/a 7 1004 1046 1094 N
+ AY SIL ER s n/a 7 1004 1053 1094 N
+ AY SIL EY b n/a 7 1004 1040 1103 N
+ AY SIL EY s n/a 7 1004 1040 1103 N
+ AY SIL F b n/a 7 1004 1063 1084 N
+ AY SIL F s n/a 7 1002 1062 1084 N
+ AY SIL G b n/a 7 1004 1035 1077 N
+ AY SIL G s n/a 7 1002 1035 1077 N
+ AY SIL HH b n/a 7 1004 1063 1072 N
+ AY SIL HH s n/a 7 1002 1063 1072 N
+ AY SIL IH b n/a 7 1004 1040 1103 N
+ AY SIL IH s n/a 7 1004 1040 1103 N
+ AY SIL IY b n/a 7 1004 1040 1102 N
+ AY SIL IY s n/a 7 1004 1040 1102 N
+ AY SIL JH b n/a 7 1004 1035 1067 N
+ AY SIL JH s n/a 7 1002 1035 1067 N
+ AY SIL K b n/a 7 1004 1062 1077 N
+ AY SIL K s n/a 7 1002 1062 1077 N
+ AY SIL L b n/a 7 1004 1046 1091 N
+ AY SIL L s n/a 7 1002 1052 1087 N
+ AY SIL M b n/a 7 1004 1036 1098 N
+ AY SIL M s n/a 7 1002 1036 1098 N
+ AY SIL N b n/a 7 1004 1043 1096 N
+ AY SIL N s n/a 7 1002 1043 1096 N
+ AY SIL NG s n/a 7 1002 1040 1096 N
+ AY SIL OW b n/a 7 1004 1046 1092 N
+ AY SIL OW s n/a 7 1004 1053 1092 N
+ AY SIL OY s n/a 7 1004 1040 1092 N
+ AY SIL P b n/a 7 1004 1063 1076 N
+ AY SIL P s n/a 7 1002 1062 1076 N
+ AY SIL R b n/a 7 1004 1046 1093 N
+ AY SIL R s n/a 7 1002 1052 1093 N
+ AY SIL S b n/a 7 1004 1063 1083 N
+ AY SIL S s n/a 7 1002 1062 1084 N
+ AY SIL SH b n/a 7 1004 1062 1084 N
+ AY SIL SH s n/a 7 1002 1062 1084 N
+ AY SIL SIL s n/a 7 1004 1063 1085 N
+ AY SIL T b n/a 7 1004 1063 1075 N
+ AY SIL T s n/a 7 1002 1062 1075 N
+ AY SIL TH b n/a 7 1004 1063 1084 N
+ AY SIL TH s n/a 7 1002 1062 1084 N
+ AY SIL UH b n/a 7 1004 1046 1093 N
+ AY SIL UH s n/a 7 1004 1053 1093 N
+ AY SIL UW b n/a 7 1004 1046 1092 N
+ AY SIL UW s n/a 7 1004 1053 1092 N
+ AY SIL V b n/a 7 1004 1036 1070 N
+ AY SIL V s n/a 7 1002 1036 1069 N
+ AY SIL W b n/a 7 1004 1046 1087 N
+ AY SIL W s n/a 7 1002 1052 1088 N
+ AY SIL Y b n/a 7 1004 1031 1102 N
+ AY SIL Y s n/a 7 1002 1031 1102 N
+ AY SIL Z b n/a 7 1003 1031 1074 N
+ AY SIL Z s n/a 7 1002 1031 1073 N
+ AY SIL ZH s n/a 7 1002 1031 1067 N
+ AY T AA b n/a 7 998 1046 1092 N
+ AY T AA e n/a 7 999 1051 1092 N
+ AY T AA i n/a 7 999 1050 1092 N
+ AY T AA s n/a 7 986 1053 1092 N
+ AY T AE b n/a 7 998 1040 1103 N
+ AY T AE e n/a 7 999 1040 1103 N
+ AY T AE s n/a 7 986 1040 1103 N
+ AY T AH b n/a 7 998 1040 1101 N
+ AY T AH e n/a 7 999 1040 1101 N
+ AY T AH i n/a 7 999 1040 1100 N
+ AY T AH s n/a 7 986 1040 1101 N
+ AY T AO e n/a 7 999 1051 1092 N
+ AY T AO i n/a 7 999 1050 1092 N
+ AY T AO s n/a 7 986 1053 1092 N
+ AY T AW e n/a 7 999 1051 1103 N
+ AY T AW s n/a 7 986 1053 1103 N
+ AY T AY b n/a 7 998 1040 1092 N
+ AY T AY e n/a 7 999 1040 1092 N
+ AY T AY s n/a 7 986 1040 1092 N
+ AY T B b n/a 7 998 1036 1070 N
+ AY T B e n/a 7 999 1036 1070 N
+ AY T B i n/a 7 999 1031 1070 N
+ AY T B s n/a 7 985 1036 1070 N
+ AY T CH e n/a 7 999 1061 1075 N
+ AY T CH i n/a 7 1001 1061 1075 N
+ AY T CH s n/a 7 985 1061 1075 N
+ AY T D b n/a 7 998 1035 1067 N
+ AY T D e n/a 7 999 1035 1067 N
+ AY T D i n/a 7 999 1031 1068 N
+ AY T D s n/a 7 985 1035 1067 N
+ AY T DH b n/a 7 998 1031 1069 N
+ AY T DH e n/a 7 999 1031 1069 N
+ AY T DH i n/a 7 999 1031 1069 N
+ AY T DH s n/a 7 985 1031 1069 N
+ AY T EH b n/a 7 998 1040 1103 N
+ AY T EH e n/a 7 999 1040 1103 N
+ AY T EH i n/a 7 999 1040 1103 N
+ AY T EH s n/a 7 986 1040 1103 N
+ AY T ER b n/a 7 998 1046 1094 N
+ AY T ER e n/a 7 999 1051 1094 N
+ AY T ER i n/a 7 1001 1050 1094 N
+ AY T ER s n/a 7 986 1053 1094 N
+ AY T EY b n/a 7 998 1040 1103 N
+ AY T EY e n/a 7 999 1040 1103 N
+ AY T EY s n/a 7 986 1040 1103 N
+ AY T F b n/a 7 998 1061 1084 N
+ AY T F e n/a 7 999 1061 1084 N
+ AY T F i n/a 7 1001 1061 1083 N
+ AY T F s n/a 7 985 1061 1084 N
+ AY T G b n/a 7 998 1035 1077 N
+ AY T G e n/a 7 999 1035 1077 N
+ AY T G i n/a 7 999 1031 1077 N
+ AY T G s n/a 7 985 1035 1077 N
+ AY T HH b n/a 7 998 1064 1072 N
+ AY T HH e n/a 7 999 1064 1072 N
+ AY T HH s n/a 7 985 1064 1072 N
+ AY T IH b n/a 7 998 1040 1103 N
+ AY T IH e n/a 7 999 1040 1103 N
+ AY T IH i n/a 7 999 1040 1097 N
+ AY T IH s n/a 7 986 1040 1103 N
+ AY T IY b n/a 7 998 1040 1102 N
+ AY T IY e n/a 7 999 1040 1102 N
+ AY T IY i n/a 7 999 1040 1095 N
+ AY T IY s n/a 7 986 1040 1102 N
+ AY T JH b n/a 7 998 1035 1067 N
+ AY T JH e n/a 7 999 1035 1067 N
+ AY T JH i n/a 7 999 1031 1067 N
+ AY T JH s n/a 7 985 1035 1067 N
+ AY T K b n/a 7 998 1061 1077 N
+ AY T K e n/a 7 999 1061 1077 N
+ AY T K i n/a 7 1001 1061 1077 N
+ AY T K s n/a 7 985 1061 1077 N
+ AY T L b n/a 7 998 1046 1091 N
+ AY T L e n/a 7 999 1051 1087 N
+ AY T L i n/a 7 998 1045 1090 N
+ AY T L s n/a 7 985 1053 1087 N
+ AY T M b n/a 7 998 1036 1098 N
+ AY T M e n/a 7 999 1036 1098 N
+ AY T M i n/a 7 997 1038 1099 N
+ AY T M s n/a 7 998 1036 1098 N
+ AY T N b n/a 7 998 1043 1096 N
+ AY T N e n/a 7 999 1043 1096 N
+ AY T N i n/a 7 999 1043 1095 N
+ AY T N s n/a 7 998 1043 1096 N
+ AY T NG e n/a 7 999 1040 1096 N
+ AY T NG i n/a 7 999 1040 1095 N
+ AY T NG s n/a 7 998 1040 1096 N
+ AY T OW b n/a 7 998 1046 1092 N
+ AY T OW e n/a 7 999 1051 1092 N
+ AY T OW i n/a 7 999 1050 1092 N
+ AY T OW s n/a 7 986 1053 1092 N
+ AY T OY e n/a 7 999 1040 1092 N
+ AY T OY s n/a 7 986 1040 1092 N
+ AY T P b n/a 7 998 1061 1076 N
+ AY T P e n/a 7 999 1061 1076 N
+ AY T P i n/a 7 1001 1061 1075 N
+ AY T P s n/a 7 985 1061 1076 N
+ AY T R b n/a 7 998 1046 1093 N
+ AY T R e n/a 7 999 1051 1093 N
+ AY T R i n/a 7 1001 1050 1094 N
+ AY T R s n/a 7 985 1053 1093 N
+ AY T S b n/a 7 998 1061 1083 N
+ AY T S e n/a 7 999 1061 1084 N
+ AY T S i n/a 7 1001 1061 1083 N
+ AY T S s n/a 7 985 1061 1084 N
+ AY T SH b n/a 7 998 1061 1084 N
+ AY T SH e n/a 7 999 1061 1084 N
+ AY T SH s n/a 7 985 1061 1084 N
+ AY T SIL e n/a 7 999 1031 1086 N
+ AY T SIL s n/a 7 986 1065 1085 N
+ AY T T b n/a 7 998 1061 1075 N
+ AY T T e n/a 7 999 1061 1075 N
+ AY T T i n/a 7 1001 1061 1078 N
+ AY T T s n/a 7 985 1061 1075 N
+ AY T TH b n/a 7 998 1061 1084 N
+ AY T TH e n/a 7 999 1061 1084 N
+ AY T TH i n/a 7 1001 1061 1083 N
+ AY T TH s n/a 7 985 1061 1084 N
+ AY T UH b n/a 7 998 1046 1093 N
+ AY T UH e n/a 7 999 1051 1093 N
+ AY T UH s n/a 7 986 1053 1093 N
+ AY T UW b n/a 7 998 1046 1092 N
+ AY T UW e n/a 7 999 1051 1092 N
+ AY T UW s n/a 7 986 1053 1092 N
+ AY T V b n/a 7 998 1036 1070 N
+ AY T V e n/a 7 999 1036 1069 N
+ AY T V i n/a 7 999 1031 1069 N
+ AY T V s n/a 7 985 1036 1069 N
+ AY T W b n/a 7 998 1046 1087 N
+ AY T W e n/a 7 999 1051 1087 N
+ AY T W i n/a 7 999 1045 1090 N
+ AY T W s n/a 7 985 1053 1088 N
+ AY T Y b n/a 7 998 1031 1102 N
+ AY T Y e n/a 7 999 1031 1102 N
+ AY T Y i n/a 7 999 1031 1095 N
+ AY T Y s n/a 7 985 1031 1102 N
+ AY T Z b n/a 7 998 1031 1074 N
+ AY T Z e n/a 7 999 1031 1073 N
+ AY T Z i n/a 7 999 1031 1073 N
+ AY T Z s n/a 7 985 1031 1073 N
+ AY T ZH e n/a 7 999 1031 1067 N
+ AY T ZH s n/a 7 985 1031 1067 N
+ AY TH AA b n/a 7 993 1046 1092 N
+ AY TH AA e n/a 7 993 1051 1092 N
+ AY TH AA i n/a 7 993 1050 1092 N
+ AY TH AA s n/a 7 986 1053 1092 N
+ AY TH AE b n/a 7 993 1040 1103 N
+ AY TH AE e n/a 7 993 1040 1103 N
+ AY TH AE s n/a 7 986 1040 1103 N
+ AY TH AH b n/a 7 992 1040 1101 N
+ AY TH AH e n/a 7 992 1040 1101 N
+ AY TH AH i n/a 7 992 1040 1100 N
+ AY TH AH s n/a 7 986 1040 1101 N
+ AY TH AO e n/a 7 993 1051 1092 N
+ AY TH AO s n/a 7 986 1053 1092 N
+ AY TH AW e n/a 7 993 1051 1103 N
+ AY TH AW s n/a 7 986 1053 1103 N
+ AY TH AY b n/a 7 993 1040 1092 N
+ AY TH AY e n/a 7 993 1040 1092 N
+ AY TH AY s n/a 7 986 1040 1092 N
+ AY TH B b n/a 7 994 1036 1070 N
+ AY TH B e n/a 7 994 1036 1070 N
+ AY TH B s n/a 7 985 1036 1070 N
+ AY TH CH e n/a 7 991 1061 1075 N
+ AY TH CH s n/a 7 985 1061 1075 N
+ AY TH D b n/a 7 994 1035 1067 N
+ AY TH D e n/a 7 994 1035 1067 N
+ AY TH D s n/a 7 985 1035 1067 N
+ AY TH DH b n/a 7 993 1031 1069 N
+ AY TH DH e n/a 7 993 1031 1069 N
+ AY TH DH s n/a 7 985 1031 1069 N
+ AY TH EH b n/a 7 992 1040 1103 N
+ AY TH EH e n/a 7 992 1040 1103 N
+ AY TH EH s n/a 7 986 1040 1103 N
+ AY TH ER b n/a 7 993 1046 1094 N
+ AY TH ER e n/a 7 993 1051 1094 N
+ AY TH ER s n/a 7 986 1053 1094 N
+ AY TH EY b n/a 7 993 1040 1103 N
+ AY TH EY e n/a 7 993 1040 1103 N
+ AY TH EY s n/a 7 986 1040 1103 N
+ AY TH F b n/a 7 991 1061 1084 N
+ AY TH F e n/a 7 991 1061 1084 N
+ AY TH F s n/a 7 985 1061 1084 N
+ AY TH G b n/a 7 994 1035 1077 N
+ AY TH G e n/a 7 994 1035 1077 N
+ AY TH G i n/a 7 993 1031 1077 N
+ AY TH G s n/a 7 985 1035 1077 N
+ AY TH HH b n/a 7 991 1064 1072 N
+ AY TH HH e n/a 7 991 1064 1072 N
+ AY TH HH s n/a 7 985 1064 1072 N
+ AY TH IH b n/a 7 992 1040 1103 N
+ AY TH IH e n/a 7 992 1040 1103 N
+ AY TH IH s n/a 7 986 1040 1103 N
+ AY TH IY b n/a 7 993 1040 1102 N
+ AY TH IY e n/a 7 993 1040 1102 N
+ AY TH IY s n/a 7 986 1040 1102 N
+ AY TH JH b n/a 7 994 1035 1067 N
+ AY TH JH e n/a 7 994 1035 1067 N
+ AY TH JH s n/a 7 985 1035 1067 N
+ AY TH K b n/a 7 991 1061 1077 N
+ AY TH K e n/a 7 991 1061 1077 N
+ AY TH K i n/a 7 991 1061 1077 N
+ AY TH K s n/a 7 985 1061 1077 N
+ AY TH L b n/a 7 993 1046 1089 N
+ AY TH L e n/a 7 993 1051 1087 N
+ AY TH L i n/a 7 993 1045 1090 N
+ AY TH L s n/a 7 985 1053 1087 N
+ AY TH M b n/a 7 992 1036 1098 N
+ AY TH M e n/a 7 992 1036 1098 N
+ AY TH M i n/a 7 992 1039 1099 N
+ AY TH M s n/a 7 994 1036 1098 N
+ AY TH N b n/a 7 992 1043 1096 N
+ AY TH N e n/a 7 992 1043 1096 N
+ AY TH N i n/a 7 992 1039 1095 N
+ AY TH N s n/a 7 994 1043 1096 N
+ AY TH NG e n/a 7 992 1040 1096 N
+ AY TH NG s n/a 7 994 1040 1096 N
+ AY TH OW b n/a 7 993 1046 1092 N
+ AY TH OW e n/a 7 993 1051 1092 N
+ AY TH OW i n/a 7 993 1050 1092 N
+ AY TH OW s n/a 7 986 1053 1092 N
+ AY TH OY e n/a 7 993 1040 1092 N
+ AY TH OY s n/a 7 986 1040 1092 N
+ AY TH P b n/a 7 991 1061 1076 N
+ AY TH P e n/a 7 991 1061 1076 N
+ AY TH P s n/a 7 985 1061 1076 N
+ AY TH R b n/a 7 993 1046 1093 N
+ AY TH R e n/a 7 993 1051 1093 N
+ AY TH R i n/a 7 993 1050 1094 N
+ AY TH R s n/a 7 985 1053 1093 N
+ AY TH S b n/a 7 991 1061 1083 N
+ AY TH S e n/a 7 991 1061 1084 N
+ AY TH S i n/a 7 991 1061 1083 N
+ AY TH S s n/a 7 985 1061 1084 N
+ AY TH SH b n/a 7 991 1061 1084 N
+ AY TH SH e n/a 7 991 1061 1084 N
+ AY TH SH s n/a 7 985 1061 1084 N
+ AY TH SIL e n/a 7 993 1031 1086 N
+ AY TH SIL s n/a 7 986 1065 1085 N
+ AY TH T b n/a 7 991 1061 1075 N
+ AY TH T e n/a 7 991 1061 1075 N
+ AY TH T i n/a 7 991 1061 1078 N
+ AY TH T s n/a 7 985 1061 1075 N
+ AY TH TH b n/a 7 991 1061 1084 N
+ AY TH TH e n/a 7 991 1061 1084 N
+ AY TH TH s n/a 7 985 1061 1084 N
+ AY TH UH b n/a 7 992 1046 1093 N
+ AY TH UH e n/a 7 992 1051 1093 N
+ AY TH UH s n/a 7 986 1053 1093 N
+ AY TH UW b n/a 7 993 1046 1092 N
+ AY TH UW e n/a 7 993 1051 1092 N
+ AY TH UW s n/a 7 986 1053 1092 N
+ AY TH V b n/a 7 994 1036 1070 N
+ AY TH V e n/a 7 994 1036 1069 N
+ AY TH V s n/a 7 985 1036 1069 N
+ AY TH W b n/a 7 993 1046 1087 N
+ AY TH W e n/a 7 993 1051 1087 N
+ AY TH W s n/a 7 985 1053 1088 N
+ AY TH Y b n/a 7 993 1031 1102 N
+ AY TH Y e n/a 7 993 1031 1102 N
+ AY TH Y s n/a 7 985 1031 1102 N
+ AY TH Z b n/a 7 993 1031 1074 N
+ AY TH Z e n/a 7 993 1031 1073 N
+ AY TH Z i n/a 7 993 1031 1073 N
+ AY TH Z s n/a 7 985 1031 1073 N
+ AY TH ZH e n/a 7 993 1031 1067 N
+ AY TH ZH s n/a 7 985 1031 1067 N
+ AY UH AA b n/a 7 1016 1046 1092 N
+ AY UH AA s n/a 7 1016 1053 1092 N
+ AY UH AE b n/a 7 1015 1040 1103 N
+ AY UH AE s n/a 7 1016 1040 1103 N
+ AY UH AH b n/a 7 1017 1040 1101 N
+ AY UH AH s n/a 7 1016 1040 1101 N
+ AY UH AO s n/a 7 1016 1053 1092 N
+ AY UH AW s n/a 7 1016 1053 1103 N
+ AY UH AY b n/a 7 1015 1040 1092 N
+ AY UH AY s n/a 7 1016 1040 1092 N
+ AY UH B b n/a 7 1016 1036 1070 N
+ AY UH B s n/a 7 1016 1036 1070 N
+ AY UH CH s n/a 7 1016 1061 1075 N
+ AY UH D b n/a 7 1016 1033 1067 N
+ AY UH D s n/a 7 1016 1033 1067 N
+ AY UH DH b n/a 7 1016 1031 1069 N
+ AY UH DH s n/a 7 1016 1031 1069 N
+ AY UH EH b n/a 7 1015 1040 1103 N
+ AY UH EH s n/a 7 1016 1040 1103 N
+ AY UH ER b n/a 7 1017 1046 1094 N
+ AY UH ER s n/a 7 1016 1053 1094 N
+ AY UH EY b n/a 7 1015 1040 1103 N
+ AY UH EY s n/a 7 1016 1040 1103 N
+ AY UH F b n/a 7 1023 1061 1084 N
+ AY UH F s n/a 7 1023 1061 1084 N
+ AY UH G b n/a 7 1016 1033 1077 N
+ AY UH G s n/a 7 1016 1033 1077 N
+ AY UH HH b n/a 7 1015 1064 1072 N
+ AY UH HH s n/a 7 1016 1064 1072 N
+ AY UH IH b n/a 7 1017 1040 1103 N
+ AY UH IH s n/a 7 1016 1040 1103 N
+ AY UH IY b n/a 7 1015 1040 1102 N
+ AY UH IY s n/a 7 1016 1040 1102 N
+ AY UH JH b n/a 7 1016 1033 1067 N
+ AY UH JH s n/a 7 1016 1033 1067 N
+ AY UH K b n/a 7 1005 1061 1077 N
+ AY UH K s n/a 7 1005 1061 1077 N
+ AY UH L b n/a 7 1016 1046 1089 N
+ AY UH L s n/a 7 1016 1053 1087 N
+ AY UH M b n/a 7 1017 1036 1098 N
+ AY UH M s n/a 7 1017 1036 1098 N
+ AY UH N b n/a 7 1017 1043 1096 N
+ AY UH N s n/a 7 1017 1043 1096 N
+ AY UH NG s n/a 7 1017 1040 1096 N
+ AY UH OW b n/a 7 1016 1046 1092 N
+ AY UH OW s n/a 7 1016 1053 1092 N
+ AY UH OY s n/a 7 1016 1040 1092 N
+ AY UH P b n/a 7 1005 1061 1076 N
+ AY UH P s n/a 7 1005 1061 1076 N
+ AY UH R b n/a 7 1016 1046 1093 N
+ AY UH R s n/a 7 1016 1053 1093 N
+ AY UH S b n/a 7 1023 1061 1083 N
+ AY UH S s n/a 7 1023 1061 1084 N
+ AY UH SH b n/a 7 1023 1061 1084 N
+ AY UH SH s n/a 7 1023 1061 1084 N
+ AY UH SIL s n/a 7 1015 1065 1086 N
+ AY UH T b n/a 7 1005 1061 1075 N
+ AY UH T s n/a 7 1005 1061 1075 N
+ AY UH TH b n/a 7 1023 1061 1084 N
+ AY UH TH s n/a 7 1023 1061 1084 N
+ AY UH UH b n/a 7 1016 1046 1093 N
+ AY UH UH s n/a 7 1016 1053 1093 N
+ AY UH UW b n/a 7 1016 1046 1092 N
+ AY UH UW s n/a 7 1016 1053 1092 N
+ AY UH V b n/a 7 1015 1036 1070 N
+ AY UH V s n/a 7 1016 1036 1069 N
+ AY UH W b n/a 7 1016 1046 1087 N
+ AY UH W s n/a 7 1016 1053 1088 N
+ AY UH Y b n/a 7 1015 1031 1102 N
+ AY UH Y s n/a 7 1016 1031 1102 N
+ AY UH Z b n/a 7 1016 1031 1074 N
+ AY UH Z s n/a 7 1016 1031 1073 N
+ AY UH ZH s n/a 7 1016 1031 1067 N
+ AY UW AA b n/a 7 1023 1046 1092 N
+ AY UW AA e n/a 7 1023 1051 1092 N
+ AY UW AA s n/a 7 1023 1053 1092 N
+ AY UW AE b n/a 7 1023 1040 1103 N
+ AY UW AE e n/a 7 1023 1040 1103 N
+ AY UW AE s n/a 7 1023 1040 1103 N
+ AY UW AH b n/a 7 1023 1040 1101 N
+ AY UW AH e n/a 7 1023 1040 1101 N
+ AY UW AH s n/a 7 1023 1040 1101 N
+ AY UW AO e n/a 7 1023 1051 1092 N
+ AY UW AO s n/a 7 1023 1053 1092 N
+ AY UW AW e n/a 7 1023 1051 1103 N
+ AY UW AW s n/a 7 1023 1053 1103 N
+ AY UW AY b n/a 7 1023 1040 1092 N
+ AY UW AY e n/a 7 1023 1040 1092 N
+ AY UW AY s n/a 7 1023 1040 1092 N
+ AY UW B b n/a 7 1023 1036 1070 N
+ AY UW B e n/a 7 1023 1036 1070 N
+ AY UW B s n/a 7 1023 1036 1070 N
+ AY UW CH e n/a 7 1023 1061 1075 N
+ AY UW CH s n/a 7 1023 1061 1075 N
+ AY UW D b n/a 7 1023 1033 1067 N
+ AY UW D e n/a 7 1023 1033 1067 N
+ AY UW D i n/a 7 1023 1031 1068 N
+ AY UW D s n/a 7 1023 1033 1067 N
+ AY UW DH b n/a 7 1023 1031 1069 N
+ AY UW DH e n/a 7 1023 1031 1069 N
+ AY UW DH s n/a 7 1023 1031 1069 N
+ AY UW EH b n/a 7 1023 1040 1103 N
+ AY UW EH e n/a 7 1023 1040 1103 N
+ AY UW EH s n/a 7 1023 1040 1103 N
+ AY UW ER b n/a 7 1023 1046 1094 N
+ AY UW ER e n/a 7 1023 1051 1094 N
+ AY UW ER s n/a 7 1023 1053 1094 N
+ AY UW EY b n/a 7 1023 1040 1103 N
+ AY UW EY e n/a 7 1023 1040 1103 N
+ AY UW EY s n/a 7 1023 1040 1103 N
+ AY UW F b n/a 7 1023 1061 1084 N
+ AY UW F e n/a 7 1023 1061 1084 N
+ AY UW F s n/a 7 1023 1061 1084 N
+ AY UW G b n/a 7 1023 1033 1077 N
+ AY UW G e n/a 7 1023 1033 1077 N
+ AY UW G s n/a 7 1023 1033 1077 N
+ AY UW HH b n/a 7 1023 1064 1072 N
+ AY UW HH e n/a 7 1023 1064 1072 N
+ AY UW HH s n/a 7 1023 1064 1072 N
+ AY UW IH b n/a 7 1023 1040 1103 N
+ AY UW IH e n/a 7 1023 1040 1103 N
+ AY UW IH s n/a 7 1023 1040 1103 N
+ AY UW IY b n/a 7 1023 1040 1102 N
+ AY UW IY e n/a 7 1023 1040 1102 N
+ AY UW IY s n/a 7 1023 1040 1102 N
+ AY UW JH b n/a 7 1023 1033 1067 N
+ AY UW JH e n/a 7 1023 1033 1067 N
+ AY UW JH s n/a 7 1023 1033 1067 N
+ AY UW K b n/a 7 1005 1061 1077 N
+ AY UW K e n/a 7 1005 1061 1077 N
+ AY UW K s n/a 7 1005 1061 1077 N
+ AY UW L b n/a 7 1023 1046 1091 N
+ AY UW L e n/a 7 1023 1051 1087 N
+ AY UW L s n/a 7 1023 1053 1087 N
+ AY UW M b n/a 7 1023 1036 1098 N
+ AY UW M e n/a 7 1023 1036 1098 N
+ AY UW M i n/a 7 1023 1039 1099 N
+ AY UW M s n/a 7 1023 1036 1098 N
+ AY UW N b n/a 7 1023 1043 1096 N
+ AY UW N e n/a 7 1023 1043 1096 N
+ AY UW N i n/a 7 1023 1037 1095 N
+ AY UW N s n/a 7 1023 1043 1096 N
+ AY UW NG e n/a 7 1023 1040 1096 N
+ AY UW NG s n/a 7 1023 1040 1096 N
+ AY UW OW b n/a 7 1023 1046 1092 N
+ AY UW OW e n/a 7 1023 1051 1092 N
+ AY UW OW s n/a 7 1023 1053 1092 N
+ AY UW OY e n/a 7 1023 1040 1092 N
+ AY UW OY s n/a 7 1023 1040 1092 N
+ AY UW P b n/a 7 1005 1061 1076 N
+ AY UW P e n/a 7 1005 1061 1076 N
+ AY UW P s n/a 7 1005 1061 1076 N
+ AY UW R b n/a 7 1023 1046 1093 N
+ AY UW R e n/a 7 1023 1051 1093 N
+ AY UW R i n/a 7 1023 1050 1094 N
+ AY UW R s n/a 7 1023 1053 1093 N
+ AY UW S b n/a 7 1023 1061 1083 N
+ AY UW S e n/a 7 1023 1061 1084 N
+ AY UW S s n/a 7 1023 1061 1084 N
+ AY UW SH b n/a 7 1023 1061 1084 N
+ AY UW SH e n/a 7 1023 1061 1084 N
+ AY UW SH s n/a 7 1023 1061 1084 N
+ AY UW SIL e n/a 7 1023 1031 1086 N
+ AY UW SIL s n/a 7 1023 1065 1086 N
+ AY UW T b n/a 7 1005 1061 1075 N
+ AY UW T e n/a 7 1005 1061 1075 N
+ AY UW T i n/a 7 1005 1061 1079 N
+ AY UW T s n/a 7 1005 1061 1075 N
+ AY UW TH b n/a 7 1023 1061 1084 N
+ AY UW TH e n/a 7 1023 1061 1084 N
+ AY UW TH s n/a 7 1023 1061 1084 N
+ AY UW UH b n/a 7 1023 1046 1093 N
+ AY UW UH e n/a 7 1023 1051 1093 N
+ AY UW UH s n/a 7 1023 1053 1093 N
+ AY UW UW b n/a 7 1023 1046 1092 N
+ AY UW UW e n/a 7 1023 1051 1092 N
+ AY UW UW s n/a 7 1023 1053 1092 N
+ AY UW V b n/a 7 1023 1036 1070 N
+ AY UW V e n/a 7 1023 1036 1069 N
+ AY UW V s n/a 7 1023 1036 1069 N
+ AY UW W b n/a 7 1023 1046 1087 N
+ AY UW W e n/a 7 1023 1051 1087 N
+ AY UW W s n/a 7 1023 1053 1088 N
+ AY UW Y b n/a 7 1023 1031 1102 N
+ AY UW Y e n/a 7 1023 1031 1102 N
+ AY UW Y s n/a 7 1023 1031 1102 N
+ AY UW Z b n/a 7 1023 1031 1074 N
+ AY UW Z e n/a 7 1023 1031 1073 N
+ AY UW Z i n/a 7 1023 1031 1073 N
+ AY UW Z s n/a 7 1023 1031 1073 N
+ AY UW ZH e n/a 7 1023 1031 1067 N
+ AY UW ZH s n/a 7 1023 1031 1067 N
+ AY V AA b n/a 7 1012 1046 1092 N
+ AY V AA e n/a 7 1012 1051 1092 N
+ AY V AA i n/a 7 1012 1049 1092 N
+ AY V AA s n/a 7 1012 1053 1092 N
+ AY V AE b n/a 7 1012 1041 1103 N
+ AY V AE e n/a 7 1012 1041 1103 N
+ AY V AE i n/a 7 1012 1042 1103 N
+ AY V AE s n/a 7 1012 1041 1103 N
+ AY V AH b n/a 7 1012 1041 1101 N
+ AY V AH e n/a 7 1012 1041 1101 N
+ AY V AH i n/a 7 1012 1042 1101 N
+ AY V AH s n/a 7 1012 1041 1101 N
+ AY V AO e n/a 7 1012 1051 1092 N
+ AY V AO s n/a 7 1012 1053 1092 N
+ AY V AW e n/a 7 1012 1051 1103 N
+ AY V AW s n/a 7 1012 1053 1103 N
+ AY V AY b n/a 7 1012 1041 1092 N
+ AY V AY e n/a 7 1012 1041 1092 N
+ AY V AY s n/a 7 1012 1041 1092 N
+ AY V B b n/a 7 1012 1033 1070 N
+ AY V B e n/a 7 1012 1033 1070 N
+ AY V B i n/a 7 1012 1029 1070 N
+ AY V B s n/a 7 1012 1033 1070 N
+ AY V CH e n/a 7 1012 1057 1075 N
+ AY V CH i n/a 7 1012 1057 1075 N
+ AY V CH s n/a 7 1012 1061 1075 N
+ AY V D b n/a 7 1012 1033 1067 N
+ AY V D e n/a 7 1012 1033 1067 N
+ AY V D i n/a 7 1012 1029 1068 N
+ AY V D s n/a 7 1012 1033 1067 N
+ AY V DH b n/a 7 1011 1034 1069 N
+ AY V DH e n/a 7 1011 1034 1069 N
+ AY V DH s n/a 7 1011 1034 1069 N
+ AY V EH b n/a 7 1012 1041 1103 N
+ AY V EH e n/a 7 1012 1041 1103 N
+ AY V EH s n/a 7 1012 1041 1103 N
+ AY V ER b n/a 7 1012 1046 1094 N
+ AY V ER e n/a 7 1012 1051 1094 N
+ AY V ER i n/a 7 1012 1049 1094 N
+ AY V ER s n/a 7 1012 1053 1094 N
+ AY V EY b n/a 7 1012 1041 1103 N
+ AY V EY e n/a 7 1012 1041 1103 N
+ AY V EY i n/a 7 1012 1042 1103 N
+ AY V EY s n/a 7 1012 1041 1103 N
+ AY V F b n/a 7 1012 1057 1084 N
+ AY V F e n/a 7 1012 1057 1084 N
+ AY V F s n/a 7 1012 1061 1084 N
+ AY V G b n/a 7 1012 1033 1077 N
+ AY V G e n/a 7 1012 1033 1077 N
+ AY V G i n/a 7 1012 1028 1077 N
+ AY V G s n/a 7 1012 1033 1077 N
+ AY V HH b n/a 7 1011 1057 1072 N
+ AY V HH e n/a 7 1011 1057 1072 N
+ AY V HH s n/a 7 1011 1064 1072 N
+ AY V IH b n/a 7 1012 1041 1103 N
+ AY V IH e n/a 7 1012 1041 1103 N
+ AY V IH i n/a 7 1012 1042 1097 N
+ AY V IH s n/a 7 1012 1041 1103 N
+ AY V IY b n/a 7 1012 1041 1102 N
+ AY V IY e n/a 7 1012 1041 1102 N
+ AY V IY i n/a 7 1012 1042 1095 N
+ AY V IY s n/a 7 1012 1041 1102 N
+ AY V JH b n/a 7 1012 1033 1067 N
+ AY V JH e n/a 7 1012 1033 1067 N
+ AY V JH s n/a 7 1012 1033 1067 N
+ AY V K b n/a 7 1005 1057 1077 N
+ AY V K e n/a 7 1005 1057 1077 N
+ AY V K i n/a 7 1005 1057 1077 N
+ AY V K s n/a 7 1005 1061 1077 N
+ AY V L b n/a 7 1012 1046 1089 N
+ AY V L e n/a 7 1012 1051 1087 N
+ AY V L i n/a 7 1012 1045 1090 N
+ AY V L s n/a 7 1012 1053 1087 N
+ AY V M b n/a 7 1014 1029 1098 N
+ AY V M e n/a 7 1014 1029 1098 N
+ AY V M i n/a 7 1014 1037 1099 N
+ AY V M s n/a 7 1014 1029 1098 N
+ AY V N b n/a 7 1014 1043 1096 N
+ AY V N e n/a 7 1014 1043 1096 N
+ AY V N i n/a 7 1014 1037 1095 N
+ AY V N s n/a 7 1014 1043 1096 N
+ AY V NG e n/a 7 1014 1041 1096 N
+ AY V NG s n/a 7 1014 1041 1096 N
+ AY V OW b n/a 7 1012 1046 1092 N
+ AY V OW e n/a 7 1012 1051 1092 N
+ AY V OW i n/a 7 1012 1049 1092 N
+ AY V OW s n/a 7 1012 1053 1092 N
+ AY V OY e n/a 7 1012 1041 1092 N
+ AY V OY s n/a 7 1012 1041 1092 N
+ AY V P b n/a 7 1005 1057 1076 N
+ AY V P e n/a 7 1005 1057 1076 N
+ AY V P i n/a 7 1005 1057 1075 N
+ AY V P s n/a 7 1005 1061 1076 N
+ AY V R b n/a 7 1012 1046 1093 N
+ AY V R e n/a 7 1012 1051 1093 N
+ AY V R i n/a 7 1012 1049 1094 N
+ AY V R s n/a 7 1012 1053 1093 N
+ AY V S b n/a 7 1012 1057 1083 N
+ AY V S e n/a 7 1012 1057 1084 N
+ AY V S i n/a 7 1012 1057 1083 N
+ AY V S s n/a 7 1012 1061 1084 N
+ AY V SH b n/a 7 1012 1057 1084 N
+ AY V SH e n/a 7 1012 1057 1084 N
+ AY V SH i n/a 7 1012 1057 1083 N
+ AY V SH s n/a 7 1012 1061 1084 N
+ AY V SIL e n/a 7 1011 1030 1086 N
+ AY V SIL s n/a 7 1011 1065 1086 N
+ AY V T b n/a 7 1005 1057 1075 N
+ AY V T e n/a 7 1005 1057 1075 N
+ AY V T i n/a 7 1005 1057 1078 N
+ AY V T s n/a 7 1005 1061 1075 N
+ AY V TH b n/a 7 1012 1057 1084 N
+ AY V TH e n/a 7 1012 1057 1084 N
+ AY V TH s n/a 7 1012 1061 1084 N
+ AY V UH b n/a 7 1012 1046 1093 N
+ AY V UH e n/a 7 1012 1051 1093 N
+ AY V UH s n/a 7 1012 1053 1093 N
+ AY V UW b n/a 7 1012 1046 1092 N
+ AY V UW e n/a 7 1012 1051 1092 N
+ AY V UW s n/a 7 1012 1053 1092 N
+ AY V V b n/a 7 1011 1029 1070 N
+ AY V V e n/a 7 1011 1029 1069 N
+ AY V V i n/a 7 1011 1029 1069 N
+ AY V V s n/a 7 1011 1029 1069 N
+ AY V W b n/a 7 1012 1046 1087 N
+ AY V W e n/a 7 1012 1051 1087 N
+ AY V W s n/a 7 1012 1053 1088 N
+ AY V Y b n/a 7 1012 1028 1102 N
+ AY V Y e n/a 7 1012 1028 1102 N
+ AY V Y s n/a 7 1012 1028 1102 N
+ AY V Z b n/a 7 1011 1029 1074 N
+ AY V Z e n/a 7 1011 1029 1073 N
+ AY V Z i n/a 7 1011 1029 1073 N
+ AY V Z s n/a 7 1011 1029 1073 N
+ AY V ZH e n/a 7 1011 1028 1067 N
+ AY V ZH s n/a 7 1011 1028 1067 N
+ AY W AA b n/a 7 1020 1048 1092 N
+ AY W AA e n/a 7 1020 1051 1092 N
+ AY W AA i n/a 7 1020 1049 1092 N
+ AY W AA s n/a 7 1020 1053 1092 N
+ AY W AE b n/a 7 1019 1041 1103 N
+ AY W AE e n/a 7 1019 1041 1103 N
+ AY W AE s n/a 7 1019 1041 1103 N
+ AY W AH b n/a 7 1019 1041 1101 N
+ AY W AH e n/a 7 1019 1041 1101 N
+ AY W AH i n/a 7 1019 1041 1100 N
+ AY W AH s n/a 7 1019 1041 1101 N
+ AY W AO e n/a 7 1020 1051 1092 N
+ AY W AO s n/a 7 1020 1053 1092 N
+ AY W AW e n/a 7 1020 1051 1103 N
+ AY W AW i n/a 7 1020 1049 1103 N
+ AY W AW s n/a 7 1020 1053 1103 N
+ AY W AY b n/a 7 1019 1041 1092 N
+ AY W AY e n/a 7 1019 1041 1092 N
+ AY W AY i n/a 7 1019 1041 1092 N
+ AY W AY s n/a 7 1019 1041 1092 N
+ AY W B b n/a 7 1019 1033 1070 N
+ AY W B e n/a 7 1019 1033 1070 N
+ AY W B i n/a 7 1019 1029 1070 N
+ AY W B s n/a 7 1019 1033 1070 N
+ AY W CH e n/a 7 1019 1057 1075 N
+ AY W CH i n/a 7 1019 1057 1075 N
+ AY W CH s n/a 7 1019 1061 1075 N
+ AY W D b n/a 7 1019 1033 1067 N
+ AY W D e n/a 7 1019 1033 1067 N
+ AY W D i n/a 7 1019 1030 1068 N
+ AY W D s n/a 7 1019 1033 1067 N
+ AY W DH b n/a 7 1019 1034 1069 N
+ AY W DH e n/a 7 1019 1034 1069 N
+ AY W DH i n/a 7 1019 1028 1069 N
+ AY W DH s n/a 7 1019 1034 1069 N
+ AY W EH b n/a 7 1019 1041 1103 N
+ AY W EH e n/a 7 1019 1041 1103 N
+ AY W EH i n/a 7 1019 1041 1103 N
+ AY W EH s n/a 7 1019 1041 1103 N
+ AY W ER b n/a 7 1020 1048 1094 N
+ AY W ER e n/a 7 1020 1051 1094 N
+ AY W ER i n/a 7 1020 1049 1094 N
+ AY W ER s n/a 7 1020 1053 1094 N
+ AY W EY b n/a 7 1019 1041 1103 N
+ AY W EY e n/a 7 1019 1041 1103 N
+ AY W EY s n/a 7 1019 1041 1103 N
+ AY W F b n/a 7 1022 1057 1084 N
+ AY W F e n/a 7 1022 1057 1084 N
+ AY W F i n/a 7 1021 1057 1082 N
+ AY W F s n/a 7 1022 1061 1084 N
+ AY W G b n/a 7 1019 1033 1077 N
+ AY W G e n/a 7 1019 1033 1077 N
+ AY W G i n/a 7 1019 1028 1077 N
+ AY W G s n/a 7 1019 1033 1077 N
+ AY W HH b n/a 7 1019 1057 1072 N
+ AY W HH e n/a 7 1019 1057 1072 N
+ AY W HH i n/a 7 1019 1057 1072 N
+ AY W HH s n/a 7 1019 1064 1072 N
+ AY W IH b n/a 7 1019 1041 1103 N
+ AY W IH e n/a 7 1019 1041 1103 N
+ AY W IH i n/a 7 1019 1042 1097 N
+ AY W IH s n/a 7 1019 1041 1103 N
+ AY W IY b n/a 7 1019 1041 1102 N
+ AY W IY e n/a 7 1019 1041 1102 N
+ AY W IY i n/a 7 1019 1042 1095 N
+ AY W IY s n/a 7 1019 1041 1102 N
+ AY W JH b n/a 7 1019 1033 1067 N
+ AY W JH e n/a 7 1019 1033 1067 N
+ AY W JH s n/a 7 1019 1033 1067 N
+ AY W K b n/a 7 1009 1057 1077 N
+ AY W K e n/a 7 1009 1057 1077 N
+ AY W K i n/a 7 1008 1057 1077 N
+ AY W K s n/a 7 1009 1061 1077 N
+ AY W L b n/a 7 1019 1048 1091 N
+ AY W L e n/a 7 1019 1051 1087 N
+ AY W L i n/a 7 1020 1048 1091 N
+ AY W L s n/a 7 1019 1053 1087 N
+ AY W M b n/a 7 1019 1029 1098 N
+ AY W M e n/a 7 1019 1029 1098 N
+ AY W M i n/a 7 1019 1039 1099 N
+ AY W M s n/a 7 1019 1029 1098 N
+ AY W N b n/a 7 1019 1043 1096 N
+ AY W N e n/a 7 1019 1043 1096 N
+ AY W N i n/a 7 1019 1037 1095 N
+ AY W N s n/a 7 1019 1043 1096 N
+ AY W NG e n/a 7 1019 1041 1096 N
+ AY W NG i n/a 7 1019 1039 1095 N
+ AY W NG s n/a 7 1019 1041 1096 N
+ AY W OW b n/a 7 1020 1048 1092 N
+ AY W OW e n/a 7 1020 1051 1092 N
+ AY W OW i n/a 7 1020 1049 1092 N
+ AY W OW s n/a 7 1020 1053 1092 N
+ AY W OY e n/a 7 1019 1041 1092 N
+ AY W OY s n/a 7 1019 1041 1092 N
+ AY W P b n/a 7 1009 1056 1076 N
+ AY W P e n/a 7 1009 1056 1076 N
+ AY W P i n/a 7 1008 1054 1075 N
+ AY W P s n/a 7 1009 1061 1076 N
+ AY W R b n/a 7 1020 1048 1093 N
+ AY W R e n/a 7 1020 1051 1093 N
+ AY W R i n/a 7 1020 1049 1094 N
+ AY W R s n/a 7 1020 1053 1093 N
+ AY W S b n/a 7 1022 1057 1083 N
+ AY W S e n/a 7 1022 1057 1084 N
+ AY W S i n/a 7 1021 1057 1083 N
+ AY W S s n/a 7 1022 1061 1084 N
+ AY W SH b n/a 7 1022 1057 1084 N
+ AY W SH e n/a 7 1022 1057 1084 N
+ AY W SH i n/a 7 1021 1057 1083 N
+ AY W SH s n/a 7 1022 1061 1084 N
+ AY W SIL e n/a 7 1019 1030 1086 N
+ AY W SIL s n/a 7 1019 1065 1086 N
+ AY W T b n/a 7 1009 1056 1075 N
+ AY W T e n/a 7 1009 1056 1075 N
+ AY W T i n/a 7 1008 1054 1079 N
+ AY W T s n/a 7 1009 1061 1075 N
+ AY W TH b n/a 7 1022 1057 1084 N
+ AY W TH e n/a 7 1022 1057 1084 N
+ AY W TH s n/a 7 1022 1061 1084 N
+ AY W UH b n/a 7 1020 1048 1093 N
+ AY W UH e n/a 7 1020 1051 1093 N
+ AY W UH s n/a 7 1020 1053 1093 N
+ AY W UW b n/a 7 1020 1048 1092 N
+ AY W UW e n/a 7 1020 1051 1092 N
+ AY W UW s n/a 7 1020 1053 1092 N
+ AY W V b n/a 7 1019 1029 1070 N
+ AY W V e n/a 7 1019 1029 1069 N
+ AY W V i n/a 7 1019 1029 1069 N
+ AY W V s n/a 7 1019 1029 1069 N
+ AY W W b n/a 7 1019 1048 1087 N
+ AY W W e n/a 7 1019 1051 1087 N
+ AY W W i n/a 7 1020 1048 1091 N
+ AY W W s n/a 7 1019 1053 1088 N
+ AY W Y b n/a 7 1019 1028 1102 N
+ AY W Y e n/a 7 1019 1028 1102 N
+ AY W Y i n/a 7 1019 1028 1095 N
+ AY W Y s n/a 7 1019 1028 1102 N
+ AY W Z b n/a 7 1019 1030 1074 N
+ AY W Z e n/a 7 1019 1030 1073 N
+ AY W Z i n/a 7 1019 1030 1073 N
+ AY W Z s n/a 7 1019 1030 1073 N
+ AY W ZH e n/a 7 1019 1028 1067 N
+ AY W ZH s n/a 7 1019 1028 1067 N
+ AY Y AA b n/a 7 987 1046 1092 N
+ AY Y AA e n/a 7 990 1051 1092 N
+ AY Y AA s n/a 7 987 1053 1092 N
+ AY Y AE b n/a 7 987 1041 1103 N
+ AY Y AE e n/a 7 990 1041 1103 N
+ AY Y AE s n/a 7 987 1041 1103 N
+ AY Y AH b n/a 7 987 1041 1101 N
+ AY Y AH e n/a 7 990 1041 1101 N
+ AY Y AH s n/a 7 987 1041 1101 N
+ AY Y AO e n/a 7 990 1051 1092 N
+ AY Y AO s n/a 7 987 1053 1092 N
+ AY Y AW e n/a 7 990 1051 1103 N
+ AY Y AW s n/a 7 987 1053 1103 N
+ AY Y AY b n/a 7 987 1041 1092 N
+ AY Y AY e n/a 7 990 1041 1092 N
+ AY Y AY s n/a 7 987 1041 1092 N
+ AY Y B b n/a 7 987 1036 1070 N
+ AY Y B e n/a 7 990 1036 1070 N
+ AY Y B s n/a 7 987 1036 1070 N
+ AY Y CH e n/a 7 990 1061 1075 N
+ AY Y CH s n/a 7 987 1061 1075 N
+ AY Y D b n/a 7 987 1035 1067 N
+ AY Y D e n/a 7 990 1035 1067 N
+ AY Y D s n/a 7 987 1035 1067 N
+ AY Y DH b n/a 7 989 1030 1069 N
+ AY Y DH e n/a 7 990 1030 1069 N
+ AY Y DH s n/a 7 987 1030 1069 N
+ AY Y EH b n/a 7 987 1041 1103 N
+ AY Y EH e n/a 7 990 1041 1103 N
+ AY Y EH s n/a 7 987 1041 1103 N
+ AY Y ER b n/a 7 987 1046 1094 N
+ AY Y ER e n/a 7 990 1051 1094 N
+ AY Y ER s n/a 7 987 1053 1094 N
+ AY Y EY b n/a 7 987 1041 1103 N
+ AY Y EY e n/a 7 990 1041 1103 N
+ AY Y EY s n/a 7 987 1041 1103 N
+ AY Y F b n/a 7 987 1061 1084 N
+ AY Y F e n/a 7 990 1061 1084 N
+ AY Y F s n/a 7 987 1061 1084 N
+ AY Y G b n/a 7 987 1035 1077 N
+ AY Y G e n/a 7 990 1035 1077 N
+ AY Y G s n/a 7 987 1035 1077 N
+ AY Y HH b n/a 7 987 1064 1072 N
+ AY Y HH e n/a 7 990 1064 1072 N
+ AY Y HH s n/a 7 987 1064 1072 N
+ AY Y IH b n/a 7 987 1041 1103 N
+ AY Y IH e n/a 7 990 1041 1103 N
+ AY Y IH s n/a 7 987 1041 1103 N
+ AY Y IY b n/a 7 987 1041 1102 N
+ AY Y IY e n/a 7 990 1041 1102 N
+ AY Y IY s n/a 7 987 1041 1102 N
+ AY Y JH b n/a 7 987 1035 1067 N
+ AY Y JH e n/a 7 990 1035 1067 N
+ AY Y JH s n/a 7 987 1035 1067 N
+ AY Y K b n/a 7 987 1061 1077 N
+ AY Y K e n/a 7 990 1061 1077 N
+ AY Y K i n/a 7 989 1061 1077 N
+ AY Y K s n/a 7 987 1061 1077 N
+ AY Y L b n/a 7 987 1046 1089 N
+ AY Y L e n/a 7 990 1051 1087 N
+ AY Y L s n/a 7 987 1053 1087 N
+ AY Y M b n/a 7 987 1036 1098 N
+ AY Y M e n/a 7 990 1036 1098 N
+ AY Y M i n/a 7 989 1039 1099 N
+ AY Y M s n/a 7 987 1036 1098 N
+ AY Y N b n/a 7 987 1043 1096 N
+ AY Y N e n/a 7 990 1043 1096 N
+ AY Y N s n/a 7 987 1043 1096 N
+ AY Y NG e n/a 7 990 1041 1096 N
+ AY Y NG s n/a 7 987 1041 1096 N
+ AY Y OW b n/a 7 987 1046 1092 N
+ AY Y OW e n/a 7 990 1051 1092 N
+ AY Y OW s n/a 7 987 1053 1092 N
+ AY Y OY e n/a 7 990 1041 1092 N
+ AY Y OY s n/a 7 987 1041 1092 N
+ AY Y P b n/a 7 987 1061 1076 N
+ AY Y P e n/a 7 990 1061 1076 N
+ AY Y P s n/a 7 987 1061 1076 N
+ AY Y R b n/a 7 987 1046 1093 N
+ AY Y R e n/a 7 990 1051 1093 N
+ AY Y R s n/a 7 987 1053 1093 N
+ AY Y S b n/a 7 987 1061 1083 N
+ AY Y S e n/a 7 990 1061 1084 N
+ AY Y S s n/a 7 987 1061 1084 N
+ AY Y SH b n/a 7 987 1061 1084 N
+ AY Y SH e n/a 7 990 1061 1084 N
+ AY Y SH s n/a 7 987 1061 1084 N
+ AY Y SIL e n/a 7 990 1030 1086 N
+ AY Y SIL s n/a 7 987 1065 1086 N
+ AY Y T b n/a 7 987 1061 1075 N
+ AY Y T e n/a 7 990 1061 1075 N
+ AY Y T s n/a 7 987 1061 1075 N
+ AY Y TH b n/a 7 987 1061 1084 N
+ AY Y TH e n/a 7 990 1061 1084 N
+ AY Y TH s n/a 7 987 1061 1084 N
+ AY Y UH b n/a 7 987 1046 1093 N
+ AY Y UH e n/a 7 990 1051 1093 N
+ AY Y UH s n/a 7 987 1053 1093 N
+ AY Y UW b n/a 7 987 1046 1092 N
+ AY Y UW e n/a 7 990 1051 1092 N
+ AY Y UW s n/a 7 987 1053 1092 N
+ AY Y V b n/a 7 989 1036 1070 N
+ AY Y V e n/a 7 990 1036 1069 N
+ AY Y V s n/a 7 987 1036 1069 N
+ AY Y W b n/a 7 987 1046 1087 N
+ AY Y W e n/a 7 990 1051 1087 N
+ AY Y W s n/a 7 987 1053 1088 N
+ AY Y Y b n/a 7 987 1030 1102 N
+ AY Y Y e n/a 7 990 1030 1102 N
+ AY Y Y s n/a 7 987 1030 1102 N
+ AY Y Z b n/a 7 990 1030 1074 N
+ AY Y Z e n/a 7 990 1030 1073 N
+ AY Y Z s n/a 7 987 1030 1073 N
+ AY Y ZH e n/a 7 990 1030 1067 N
+ AY Y ZH s n/a 7 987 1030 1067 N
+ AY Z AA b n/a 7 993 1046 1092 N
+ AY Z AA e n/a 7 993 1051 1092 N
+ AY Z AA s n/a 7 994 1053 1092 N
+ AY Z AE b n/a 7 993 1040 1103 N
+ AY Z AE e n/a 7 993 1040 1103 N
+ AY Z AE i n/a 7 993 1040 1103 N
+ AY Z AE s n/a 7 994 1040 1103 N
+ AY Z AH b n/a 7 993 1040 1101 N
+ AY Z AH e n/a 7 993 1040 1101 N
+ AY Z AH i n/a 7 993 1040 1100 N
+ AY Z AH s n/a 7 994 1040 1101 N
+ AY Z AO e n/a 7 993 1051 1092 N
+ AY Z AO s n/a 7 994 1053 1092 N
+ AY Z AW e n/a 7 993 1051 1103 N
+ AY Z AW s n/a 7 994 1053 1103 N
+ AY Z AY b n/a 7 993 1040 1092 N
+ AY Z AY e n/a 7 993 1040 1092 N
+ AY Z AY s n/a 7 994 1040 1092 N
+ AY Z B b n/a 7 994 1036 1070 N
+ AY Z B e n/a 7 994 1036 1070 N
+ AY Z B i n/a 7 993 1031 1070 N
+ AY Z B s n/a 7 994 1036 1070 N
+ AY Z CH e n/a 7 991 1061 1075 N
+ AY Z CH i n/a 7 991 1061 1075 N
+ AY Z CH s n/a 7 991 1061 1075 N
+ AY Z D b n/a 7 994 1035 1067 N
+ AY Z D e n/a 7 994 1035 1067 N
+ AY Z D i n/a 7 993 1031 1068 N
+ AY Z D s n/a 7 994 1035 1067 N
+ AY Z DH b n/a 7 993 1031 1069 N
+ AY Z DH e n/a 7 993 1031 1069 N
+ AY Z DH s n/a 7 994 1031 1069 N
+ AY Z EH b n/a 7 993 1040 1103 N
+ AY Z EH e n/a 7 993 1040 1103 N
+ AY Z EH i n/a 7 993 1040 1103 N
+ AY Z EH s n/a 7 994 1040 1103 N
+ AY Z ER b n/a 7 993 1046 1094 N
+ AY Z ER e n/a 7 993 1051 1094 N
+ AY Z ER i n/a 7 993 1050 1094 N
+ AY Z ER s n/a 7 994 1053 1094 N
+ AY Z EY b n/a 7 993 1040 1103 N
+ AY Z EY e n/a 7 993 1040 1103 N
+ AY Z EY s n/a 7 994 1040 1103 N
+ AY Z F b n/a 7 991 1061 1084 N
+ AY Z F e n/a 7 991 1061 1084 N
+ AY Z F s n/a 7 991 1061 1084 N
+ AY Z G b n/a 7 994 1035 1077 N
+ AY Z G e n/a 7 994 1035 1077 N
+ AY Z G i n/a 7 993 1031 1077 N
+ AY Z G s n/a 7 994 1035 1077 N
+ AY Z HH b n/a 7 991 1064 1072 N
+ AY Z HH e n/a 7 991 1064 1072 N
+ AY Z HH s n/a 7 991 1064 1072 N
+ AY Z IH b n/a 7 993 1040 1103 N
+ AY Z IH e n/a 7 993 1040 1103 N
+ AY Z IH i n/a 7 993 1040 1097 N
+ AY Z IH s n/a 7 994 1040 1103 N
+ AY Z IY b n/a 7 993 1040 1102 N
+ AY Z IY e n/a 7 993 1040 1102 N
+ AY Z IY s n/a 7 994 1040 1102 N
+ AY Z JH b n/a 7 994 1035 1067 N
+ AY Z JH e n/a 7 994 1035 1067 N
+ AY Z JH s n/a 7 994 1035 1067 N
+ AY Z K b n/a 7 991 1061 1077 N
+ AY Z K e n/a 7 991 1061 1077 N
+ AY Z K i n/a 7 991 1061 1077 N
+ AY Z K s n/a 7 991 1061 1077 N
+ AY Z L b n/a 7 993 1046 1089 N
+ AY Z L e n/a 7 993 1051 1087 N
+ AY Z L i n/a 7 993 1045 1090 N
+ AY Z L s n/a 7 994 1053 1087 N
+ AY Z M b n/a 7 992 1036 1098 N
+ AY Z M e n/a 7 992 1036 1098 N
+ AY Z M i n/a 7 992 1039 1099 N
+ AY Z M s n/a 7 994 1036 1098 N
+ AY Z N b n/a 7 992 1043 1096 N
+ AY Z N e n/a 7 992 1043 1096 N
+ AY Z N i n/a 7 992 1037 1095 N
+ AY Z N s n/a 7 994 1043 1096 N
+ AY Z NG e n/a 7 992 1040 1096 N
+ AY Z NG s n/a 7 994 1040 1096 N
+ AY Z OW b n/a 7 993 1046 1092 N
+ AY Z OW e n/a 7 993 1051 1092 N
+ AY Z OW s n/a 7 994 1053 1092 N
+ AY Z OY e n/a 7 993 1040 1092 N
+ AY Z OY s n/a 7 994 1040 1092 N
+ AY Z P b n/a 7 991 1061 1076 N
+ AY Z P e n/a 7 991 1061 1076 N
+ AY Z P s n/a 7 991 1061 1076 N
+ AY Z R b n/a 7 993 1046 1093 N
+ AY Z R e n/a 7 993 1051 1093 N
+ AY Z R i n/a 7 993 1050 1094 N
+ AY Z R s n/a 7 994 1053 1093 N
+ AY Z S b n/a 7 991 1061 1083 N
+ AY Z S e n/a 7 991 1061 1084 N
+ AY Z S i n/a 7 991 1061 1083 N
+ AY Z S s n/a 7 991 1061 1084 N
+ AY Z SH b n/a 7 991 1061 1084 N
+ AY Z SH e n/a 7 991 1061 1084 N
+ AY Z SH s n/a 7 991 1061 1084 N
+ AY Z SIL e n/a 7 993 1031 1086 N
+ AY Z SIL s n/a 7 994 1065 1086 N
+ AY Z T b n/a 7 991 1061 1075 N
+ AY Z T e n/a 7 991 1061 1075 N
+ AY Z T i n/a 7 991 1061 1078 N
+ AY Z T s n/a 7 991 1061 1075 N
+ AY Z TH b n/a 7 991 1061 1084 N
+ AY Z TH e n/a 7 991 1061 1084 N
+ AY Z TH s n/a 7 991 1061 1084 N
+ AY Z UH b n/a 7 993 1046 1093 N
+ AY Z UH e n/a 7 993 1051 1093 N
+ AY Z UH s n/a 7 994 1053 1093 N
+ AY Z UW b n/a 7 993 1046 1092 N
+ AY Z UW e n/a 7 993 1051 1092 N
+ AY Z UW s n/a 7 994 1053 1092 N
+ AY Z V b n/a 7 994 1036 1070 N
+ AY Z V e n/a 7 994 1036 1069 N
+ AY Z V i n/a 7 993 1031 1069 N
+ AY Z V s n/a 7 994 1036 1069 N
+ AY Z W b n/a 7 993 1046 1087 N
+ AY Z W e n/a 7 993 1051 1087 N
+ AY Z W s n/a 7 994 1053 1088 N
+ AY Z Y b n/a 7 993 1031 1102 N
+ AY Z Y e n/a 7 993 1031 1102 N
+ AY Z Y s n/a 7 994 1031 1102 N
+ AY Z Z b n/a 7 993 1031 1074 N
+ AY Z Z e n/a 7 993 1031 1073 N
+ AY Z Z i n/a 7 993 1031 1073 N
+ AY Z Z s n/a 7 994 1031 1073 N
+ AY Z ZH e n/a 7 993 1031 1067 N
+ AY Z ZH s n/a 7 994 1031 1067 N
+ AY ZH AA b n/a 7 995 1046 1092 N
+ AY ZH AA s n/a 7 995 1053 1092 N
+ AY ZH AE b n/a 7 995 1040 1103 N
+ AY ZH AE s n/a 7 995 1040 1103 N
+ AY ZH AH b n/a 7 995 1040 1101 N
+ AY ZH AH s n/a 7 995 1040 1101 N
+ AY ZH AO s n/a 7 995 1053 1092 N
+ AY ZH AW s n/a 7 995 1053 1103 N
+ AY ZH AY b n/a 7 995 1040 1092 N
+ AY ZH AY s n/a 7 995 1040 1092 N
+ AY ZH B b n/a 7 995 1036 1070 N
+ AY ZH B s n/a 7 995 1036 1070 N
+ AY ZH CH s n/a 7 995 1061 1075 N
+ AY ZH D b n/a 7 995 1035 1067 N
+ AY ZH D s n/a 7 995 1035 1067 N
+ AY ZH DH b n/a 7 995 1031 1069 N
+ AY ZH DH s n/a 7 995 1031 1069 N
+ AY ZH EH b n/a 7 995 1040 1103 N
+ AY ZH EH s n/a 7 995 1040 1103 N
+ AY ZH ER b n/a 7 995 1046 1094 N
+ AY ZH ER s n/a 7 995 1053 1094 N
+ AY ZH EY b n/a 7 995 1040 1103 N
+ AY ZH EY s n/a 7 995 1040 1103 N
+ AY ZH F b n/a 7 995 1061 1084 N
+ AY ZH F s n/a 7 995 1061 1084 N
+ AY ZH G b n/a 7 995 1035 1077 N
+ AY ZH G s n/a 7 995 1035 1077 N
+ AY ZH HH b n/a 7 995 1064 1072 N
+ AY ZH HH s n/a 7 995 1064 1072 N
+ AY ZH IH b n/a 7 995 1040 1103 N
+ AY ZH IH s n/a 7 995 1040 1103 N
+ AY ZH IY b n/a 7 995 1040 1102 N
+ AY ZH IY s n/a 7 995 1040 1102 N
+ AY ZH JH b n/a 7 995 1035 1067 N
+ AY ZH JH s n/a 7 995 1035 1067 N
+ AY ZH K b n/a 7 995 1061 1077 N
+ AY ZH K s n/a 7 995 1061 1077 N
+ AY ZH L b n/a 7 995 1046 1089 N
+ AY ZH L s n/a 7 995 1053 1087 N
+ AY ZH M b n/a 7 995 1036 1098 N
+ AY ZH M s n/a 7 995 1036 1098 N
+ AY ZH N b n/a 7 995 1043 1096 N
+ AY ZH N s n/a 7 995 1043 1096 N
+ AY ZH NG s n/a 7 995 1040 1096 N
+ AY ZH OW b n/a 7 995 1046 1092 N
+ AY ZH OW s n/a 7 995 1053 1092 N
+ AY ZH OY s n/a 7 995 1040 1092 N
+ AY ZH P b n/a 7 995 1061 1076 N
+ AY ZH P s n/a 7 995 1061 1076 N
+ AY ZH R b n/a 7 995 1046 1093 N
+ AY ZH R i n/a 7 995 1050 1094 N
+ AY ZH R s n/a 7 995 1053 1093 N
+ AY ZH S b n/a 7 995 1061 1083 N
+ AY ZH S s n/a 7 995 1061 1084 N
+ AY ZH SH b n/a 7 995 1061 1084 N
+ AY ZH SH s n/a 7 995 1061 1084 N
+ AY ZH SIL s n/a 7 995 1065 1086 N
+ AY ZH T b n/a 7 995 1061 1075 N
+ AY ZH T s n/a 7 995 1061 1075 N
+ AY ZH TH b n/a 7 995 1061 1084 N
+ AY ZH TH s n/a 7 995 1061 1084 N
+ AY ZH UH b n/a 7 995 1046 1093 N
+ AY ZH UH s n/a 7 995 1053 1093 N
+ AY ZH UW b n/a 7 995 1046 1092 N
+ AY ZH UW s n/a 7 995 1053 1092 N
+ AY ZH V b n/a 7 995 1036 1070 N
+ AY ZH V s n/a 7 995 1036 1069 N
+ AY ZH W b n/a 7 995 1046 1087 N
+ AY ZH W s n/a 7 995 1053 1088 N
+ AY ZH Y b n/a 7 995 1031 1102 N
+ AY ZH Y s n/a 7 995 1031 1102 N
+ AY ZH Z b n/a 7 995 1031 1074 N
+ AY ZH Z s n/a 7 995 1031 1073 N
+ AY ZH ZH s n/a 7 995 1031 1067 N
+ B AA AA b n/a 8 1114 1154 1181 N
+ B AA AA e n/a 8 1114 1153 1181 N
+ B AA AA i n/a 8 1114 1153 1181 N
+ B AA AE b n/a 8 1114 1149 1174 N
+ B AA AE e n/a 8 1114 1149 1174 N
+ B AA AE i n/a 8 1114 1149 1174 N
+ B AA AH b n/a 8 1116 1150 1176 N
+ B AA AH e n/a 8 1114 1139 1162 N
+ B AA AH i n/a 8 1114 1139 1162 N
+ B AA AO b n/a 8 1114 1151 1168 N
+ B AA AO e n/a 8 1114 1151 1168 N
+ B AA AO i n/a 8 1114 1151 1168 N
+ B AA AW b n/a 8 1114 1153 1182 N
+ B AA AW e n/a 8 1114 1153 1182 N
+ B AA AY b n/a 8 1114 1154 1180 N
+ B AA AY e n/a 8 1114 1153 1180 N
+ B AA B e n/a 8 1114 1140 1170 N
+ B AA CH e n/a 8 1114 1140 1170 N
+ B AA CH i n/a 8 1114 1140 1170 N
+ B AA D b n/a 8 1114 1149 1170 N
+ B AA D e n/a 8 1114 1140 1170 N
+ B AA D i n/a 8 1114 1140 1170 N
+ B AA DH e n/a 8 1114 1140 1170 N
+ B AA EH b n/a 8 1114 1149 1173 N
+ B AA EH e n/a 8 1114 1139 1163 N
+ B AA EH i n/a 8 1114 1139 1163 N
+ B AA ER b n/a 8 1117 1142 1179 N
+ B AA ER e n/a 8 1114 1141 1172 N
+ B AA ER i n/a 8 1114 1141 1172 N
+ B AA EY b n/a 8 1114 1149 1173 N
+ B AA EY e n/a 8 1114 1149 1163 N
+ B AA EY i n/a 8 1114 1149 1163 N
+ B AA F e n/a 8 1114 1140 1169 N
+ B AA F i n/a 8 1114 1139 1169 N
+ B AA G e n/a 8 1114 1140 1170 N
+ B AA G i n/a 8 1114 1140 1170 N
+ B AA HH e n/a 8 1114 1140 1169 N
+ B AA IH b n/a 8 1117 1156 1183 N
+ B AA IH e n/a 8 1114 1156 1183 N
+ B AA IH i n/a 8 1114 1156 1183 N
+ B AA IY b n/a 8 1114 1158 1187 N
+ B AA IY e n/a 8 1114 1158 1187 N
+ B AA IY i n/a 8 1114 1158 1187 N
+ B AA JH e n/a 8 1114 1140 1170 N
+ B AA JH i n/a 8 1114 1140 1170 N
+ B AA K e n/a 8 1114 1140 1169 N
+ B AA K i n/a 8 1114 1140 1169 N
+ B AA L b n/a 8 1114 1139 1165 N
+ B AA L e n/a 8 1114 1139 1164 N
+ B AA L i n/a 8 1114 1139 1164 N
+ B AA M b n/a 8 1114 1149 1170 N
+ B AA M e n/a 8 1114 1140 1170 N
+ B AA M i n/a 8 1114 1140 1170 N
+ B AA N b n/a 8 1114 1149 1170 N
+ B AA N e n/a 8 1114 1140 1170 N
+ B AA N i n/a 8 1114 1140 1170 N
+ B AA NG e n/a 8 1114 1140 1170 N
+ B AA OW b n/a 8 1114 1152 1178 N
+ B AA OW e n/a 8 1114 1152 1162 N
+ B AA OW i n/a 8 1114 1152 1162 N
+ B AA OY b n/a 8 1114 1151 1168 N
+ B AA OY e n/a 8 1114 1151 1168 N
+ B AA P b n/a 8 1114 1149 1169 N
+ B AA P e n/a 8 1114 1140 1169 N
+ B AA R b n/a 8 1114 1142 1171 N
+ B AA R e n/a 8 1114 1141 1171 N
+ B AA R i n/a 8 1114 1141 1171 N
+ B AA S e n/a 8 1114 1140 1170 N
+ B AA S i n/a 8 1114 1140 1170 N
+ B AA SH e n/a 8 1114 1140 1170 N
+ B AA SH i n/a 8 1114 1140 1170 N
+ B AA SIL e n/a 8 1114 1140 1169 N
+ B AA T b n/a 8 1114 1149 1169 N
+ B AA T e n/a 8 1114 1140 1169 N
+ B AA T i n/a 8 1114 1140 1169 N
+ B AA TH e n/a 8 1114 1140 1169 N
+ B AA UH b n/a 8 1114 1157 1185 N
+ B AA UH e n/a 8 1114 1157 1185 N
+ B AA UH i n/a 8 1114 1157 1185 N
+ B AA UW b n/a 8 1114 1157 1185 N
+ B AA UW e n/a 8 1114 1157 1185 N
+ B AA UW i n/a 8 1114 1157 1185 N
+ B AA V e n/a 8 1114 1140 1170 N
+ B AA V i n/a 8 1114 1139 1170 N
+ B AA W b n/a 8 1114 1139 1165 N
+ B AA W e n/a 8 1114 1139 1164 N
+ B AA W i n/a 8 1114 1139 1164 N
+ B AA Y b n/a 8 1114 1158 1187 N
+ B AA Y e n/a 8 1114 1158 1187 N
+ B AA Y i n/a 8 1114 1158 1187 N
+ B AA Z b n/a 8 1114 1149 1170 N
+ B AA Z e n/a 8 1114 1140 1170 N
+ B AA Z i n/a 8 1114 1140 1170 N
+ B AA ZH e n/a 8 1114 1140 1170 N
+ B AE AA b n/a 8 1115 1154 1181 N
+ B AE AA e n/a 8 1115 1153 1181 N
+ B AE AA i n/a 8 1115 1153 1181 N
+ B AE AE b n/a 8 1115 1149 1174 N
+ B AE AE e n/a 8 1115 1149 1174 N
+ B AE AE i n/a 8 1115 1149 1174 N
+ B AE AH b n/a 8 1116 1150 1176 N
+ B AE AH e n/a 8 1115 1139 1163 N
+ B AE AH i n/a 8 1115 1139 1163 N
+ B AE AO b n/a 8 1115 1151 1168 N
+ B AE AO e n/a 8 1115 1151 1168 N
+ B AE AO i n/a 8 1115 1151 1168 N
+ B AE AW b n/a 8 1115 1153 1182 N
+ B AE AW e n/a 8 1115 1153 1182 N
+ B AE AW i n/a 8 1115 1153 1182 N
+ B AE AY b n/a 8 1115 1154 1180 N
+ B AE AY e n/a 8 1115 1153 1180 N
+ B AE AY i n/a 8 1115 1153 1180 N
+ B AE B e n/a 8 1115 1140 1170 N
+ B AE CH e n/a 8 1115 1140 1170 N
+ B AE CH i n/a 8 1115 1140 1170 N
+ B AE D b n/a 8 1115 1149 1170 N
+ B AE D e n/a 8 1115 1140 1170 N
+ B AE D i n/a 8 1115 1140 1170 N
+ B AE DH e n/a 8 1115 1140 1170 N
+ B AE EH b n/a 8 1115 1149 1173 N
+ B AE EH e n/a 8 1115 1139 1163 N
+ B AE EH i n/a 8 1115 1139 1163 N
+ B AE ER b n/a 8 1117 1142 1179 N
+ B AE ER e n/a 8 1115 1141 1172 N
+ B AE ER i n/a 8 1115 1141 1172 N
+ B AE EY b n/a 8 1115 1149 1173 N
+ B AE EY e n/a 8 1115 1149 1163 N
+ B AE EY i n/a 8 1115 1149 1163 N
+ B AE F e n/a 8 1115 1140 1169 N
+ B AE G e n/a 8 1115 1140 1170 N
+ B AE HH e n/a 8 1115 1140 1169 N
+ B AE HH i n/a 8 1115 1140 1169 N
+ B AE IH b n/a 8 1117 1156 1183 N
+ B AE IH e n/a 8 1115 1156 1183 N
+ B AE IH i n/a 8 1115 1156 1183 N
+ B AE IY b n/a 8 1115 1158 1187 N
+ B AE IY e n/a 8 1115 1158 1187 N
+ B AE IY i n/a 8 1115 1158 1187 N
+ B AE JH e n/a 8 1115 1140 1170 N
+ B AE JH i n/a 8 1115 1140 1170 N
+ B AE K e n/a 8 1115 1140 1169 N
+ B AE K i n/a 8 1115 1140 1169 N
+ B AE L b n/a 8 1115 1139 1165 N
+ B AE L e n/a 8 1115 1139 1164 N
+ B AE L i n/a 8 1115 1139 1164 N
+ B AE M b n/a 8 1115 1149 1170 N
+ B AE M e n/a 8 1115 1140 1170 N
+ B AE M i n/a 8 1115 1140 1170 N
+ B AE N b n/a 8 1115 1149 1170 N
+ B AE N e n/a 8 1115 1140 1170 N
+ B AE N i n/a 8 1115 1140 1170 N
+ B AE NG e n/a 8 1115 1140 1170 N
+ B AE OW b n/a 8 1115 1152 1178 N
+ B AE OW e n/a 8 1115 1152 1162 N
+ B AE OW i n/a 8 1115 1152 1162 N
+ B AE OY b n/a 8 1115 1151 1168 N
+ B AE OY e n/a 8 1115 1151 1168 N
+ B AE OY i n/a 8 1115 1151 1168 N
+ B AE P b n/a 8 1115 1149 1169 N
+ B AE P e n/a 8 1115 1140 1169 N
+ B AE P i n/a 8 1115 1140 1169 N
+ B AE R b n/a 8 1115 1142 1171 N
+ B AE R e n/a 8 1115 1141 1171 N
+ B AE R i n/a 8 1115 1141 1171 N
+ B AE S e n/a 8 1115 1140 1170 N
+ B AE S i n/a 8 1115 1140 1170 N
+ B AE SH e n/a 8 1115 1140 1170 N
+ B AE SH i n/a 8 1115 1140 1170 N
+ B AE SIL e n/a 8 1115 1140 1169 N
+ B AE T b n/a 8 1115 1149 1169 N
+ B AE T e n/a 8 1115 1140 1169 N
+ B AE T i n/a 8 1115 1140 1169 N
+ B AE TH e n/a 8 1115 1140 1169 N
+ B AE UH b n/a 8 1115 1157 1185 N
+ B AE UH e n/a 8 1115 1157 1185 N
+ B AE UH i n/a 8 1115 1157 1185 N
+ B AE UW b n/a 8 1115 1157 1185 N
+ B AE UW e n/a 8 1115 1157 1185 N
+ B AE UW i n/a 8 1115 1157 1185 N
+ B AE V e n/a 8 1115 1140 1170 N
+ B AE V i n/a 8 1115 1140 1170 N
+ B AE W b n/a 8 1115 1139 1165 N
+ B AE W e n/a 8 1115 1139 1164 N
+ B AE Y b n/a 8 1115 1158 1187 N
+ B AE Y e n/a 8 1115 1158 1187 N
+ B AE Y i n/a 8 1115 1158 1187 N
+ B AE Z b n/a 8 1115 1149 1170 N
+ B AE Z e n/a 8 1115 1140 1170 N
+ B AE Z i n/a 8 1115 1140 1170 N
+ B AE ZH e n/a 8 1115 1140 1170 N
+ B AH AA b n/a 8 1107 1152 1181 N
+ B AH AA e n/a 8 1112 1152 1181 N
+ B AH AA i n/a 8 1112 1152 1181 N
+ B AH AE b n/a 8 1105 1149 1174 N
+ B AH AE e n/a 8 1112 1149 1174 N
+ B AH AE i n/a 8 1112 1149 1174 N
+ B AH AH b n/a 8 1105 1150 1176 N
+ B AH AH e n/a 8 1109 1136 1167 N
+ B AH AH i n/a 8 1109 1136 1167 N
+ B AH AO b n/a 8 1107 1151 1168 N
+ B AH AO e n/a 8 1112 1151 1168 N
+ B AH AO i n/a 8 1112 1151 1168 N
+ B AH AW b n/a 8 1105 1153 1182 N
+ B AH AW e n/a 8 1112 1153 1182 N
+ B AH AW i n/a 8 1112 1153 1182 N
+ B AH AY b n/a 8 1107 1152 1180 N
+ B AH AY e n/a 8 1112 1152 1180 N
+ B AH AY i n/a 8 1112 1152 1180 N
+ B AH B e n/a 8 1111 1140 1170 N
+ B AH CH e n/a 8 1111 1140 1170 N
+ B AH CH i n/a 8 1111 1140 1170 N
+ B AH D b n/a 8 1105 1149 1170 N
+ B AH D e n/a 8 1111 1140 1170 N
+ B AH D i n/a 8 1111 1140 1170 N
+ B AH DH e n/a 8 1111 1140 1170 N
+ B AH EH b n/a 8 1105 1149 1173 N
+ B AH EH e n/a 8 1110 1138 1163 N
+ B AH EH i n/a 8 1110 1138 1163 N
+ B AH ER b n/a 8 1107 1142 1179 N
+ B AH ER e n/a 8 1109 1141 1172 N
+ B AH ER i n/a 8 1109 1141 1172 N
+ B AH EY b n/a 8 1105 1149 1173 N
+ B AH EY e n/a 8 1110 1149 1163 N
+ B AH EY i n/a 8 1110 1149 1163 N
+ B AH F e n/a 8 1111 1140 1169 N
+ B AH F i n/a 8 1111 1140 1169 N
+ B AH G e n/a 8 1111 1140 1170 N
+ B AH G i n/a 8 1111 1140 1170 N
+ B AH HH e n/a 8 1111 1140 1169 N
+ B AH HH i n/a 8 1111 1140 1169 N
+ B AH IH b n/a 8 1105 1156 1183 N
+ B AH IH e n/a 8 1112 1156 1183 N
+ B AH IH i n/a 8 1112 1156 1183 N
+ B AH IY b n/a 8 1104 1158 1187 N
+ B AH IY e n/a 8 1112 1158 1187 N
+ B AH IY i n/a 8 1112 1158 1187 N
+ B AH JH e n/a 8 1111 1140 1170 N
+ B AH JH i n/a 8 1111 1140 1170 N
+ B AH K e n/a 8 1111 1140 1169 N
+ B AH K i n/a 8 1111 1140 1169 N
+ B AH L b n/a 8 1107 1137 1165 N
+ B AH L e n/a 8 1109 1136 1164 N
+ B AH L i n/a 8 1109 1136 1164 N
+ B AH M b n/a 8 1105 1149 1170 N
+ B AH M e n/a 8 1111 1140 1170 N
+ B AH M i n/a 8 1111 1140 1170 N
+ B AH N b n/a 8 1105 1149 1170 N
+ B AH N e n/a 8 1111 1140 1170 N
+ B AH N i n/a 8 1111 1140 1170 N
+ B AH NG e n/a 8 1111 1140 1170 N
+ B AH OW b n/a 8 1107 1152 1178 N
+ B AH OW e n/a 8 1110 1152 1162 N
+ B AH OW i n/a 8 1110 1152 1162 N
+ B AH OY b n/a 8 1107 1151 1168 N
+ B AH OY e n/a 8 1112 1151 1168 N
+ B AH OY i n/a 8 1112 1151 1168 N
+ B AH P b n/a 8 1105 1149 1169 N
+ B AH P e n/a 8 1111 1140 1169 N
+ B AH P i n/a 8 1111 1140 1169 N
+ B AH R b n/a 8 1107 1142 1171 N
+ B AH R e n/a 8 1110 1141 1171 N
+ B AH R i n/a 8 1110 1141 1171 N
+ B AH S e n/a 8 1111 1140 1170 N
+ B AH S i n/a 8 1111 1140 1170 N
+ B AH SH e n/a 8 1111 1140 1170 N
+ B AH SIL e n/a 8 1111 1140 1169 N
+ B AH T b n/a 8 1105 1149 1169 N
+ B AH T e n/a 8 1111 1140 1169 N
+ B AH T i n/a 8 1111 1140 1169 N
+ B AH TH e n/a 8 1111 1140 1169 N
+ B AH TH i n/a 8 1111 1140 1169 N
+ B AH UH b n/a 8 1107 1157 1185 N
+ B AH UH e n/a 8 1112 1157 1185 N
+ B AH UH i n/a 8 1112 1157 1185 N
+ B AH UW b n/a 8 1107 1157 1185 N
+ B AH UW e n/a 8 1112 1157 1185 N
+ B AH UW i n/a 8 1112 1157 1185 N
+ B AH V e n/a 8 1111 1140 1170 N
+ B AH V i n/a 8 1111 1140 1170 N
+ B AH W b n/a 8 1107 1137 1165 N
+ B AH W e n/a 8 1109 1136 1164 N
+ B AH W i n/a 8 1109 1136 1164 N
+ B AH Y b n/a 8 1105 1158 1187 N
+ B AH Y e n/a 8 1112 1158 1187 N
+ B AH Y i n/a 8 1112 1158 1187 N
+ B AH Z b n/a 8 1105 1149 1170 N
+ B AH Z e n/a 8 1111 1140 1170 N
+ B AH Z i n/a 8 1111 1140 1170 N
+ B AH ZH e n/a 8 1111 1140 1170 N
+ B AO AA b n/a 8 1114 1154 1181 N
+ B AO AA e n/a 8 1114 1153 1181 N
+ B AO AE b n/a 8 1114 1149 1174 N
+ B AO AE e n/a 8 1114 1149 1174 N
+ B AO AE i n/a 8 1114 1149 1174 N
+ B AO AH b n/a 8 1116 1150 1176 N
+ B AO AH e n/a 8 1114 1139 1162 N
+ B AO AH i n/a 8 1114 1139 1162 N
+ B AO AO b n/a 8 1114 1151 1168 N
+ B AO AO e n/a 8 1114 1151 1168 N
+ B AO AO i n/a 8 1114 1151 1168 N
+ B AO AW b n/a 8 1114 1153 1182 N
+ B AO AW e n/a 8 1114 1153 1182 N
+ B AO AY b n/a 8 1114 1154 1180 N
+ B AO AY e n/a 8 1114 1153 1180 N
+ B AO AY i n/a 8 1114 1153 1180 N
+ B AO B e n/a 8 1114 1140 1170 N
+ B AO CH e n/a 8 1114 1140 1170 N
+ B AO D b n/a 8 1114 1149 1170 N
+ B AO D e n/a 8 1114 1140 1170 N
+ B AO D i n/a 8 1114 1140 1170 N
+ B AO DH e n/a 8 1114 1140 1170 N
+ B AO EH b n/a 8 1114 1149 1173 N
+ B AO EH e n/a 8 1114 1139 1163 N
+ B AO EH i n/a 8 1114 1139 1163 N
+ B AO ER b n/a 8 1117 1142 1179 N
+ B AO ER e n/a 8 1114 1141 1172 N
+ B AO ER i n/a 8 1114 1141 1172 N
+ B AO EY b n/a 8 1114 1149 1173 N
+ B AO EY e n/a 8 1114 1149 1163 N
+ B AO EY i n/a 8 1114 1149 1163 N
+ B AO F e n/a 8 1114 1140 1169 N
+ B AO G e n/a 8 1114 1140 1170 N
+ B AO HH e n/a 8 1114 1140 1169 N
+ B AO IH b n/a 8 1117 1156 1183 N
+ B AO IH e n/a 8 1114 1156 1183 N
+ B AO IH i n/a 8 1114 1156 1183 N
+ B AO IY b n/a 8 1114 1158 1187 N
+ B AO IY e n/a 8 1114 1158 1187 N
+ B AO JH e n/a 8 1114 1140 1170 N
+ B AO K e n/a 8 1114 1140 1169 N
+ B AO K i n/a 8 1114 1140 1169 N
+ B AO L b n/a 8 1114 1139 1165 N
+ B AO L e n/a 8 1114 1139 1164 N
+ B AO L i n/a 8 1114 1139 1164 N
+ B AO M b n/a 8 1114 1149 1170 N
+ B AO M e n/a 8 1114 1140 1170 N
+ B AO N b n/a 8 1114 1149 1170 N
+ B AO N e n/a 8 1114 1140 1170 N
+ B AO NG e n/a 8 1114 1140 1170 N
+ B AO OW b n/a 8 1114 1152 1178 N
+ B AO OW e n/a 8 1114 1152 1162 N
+ B AO OW i n/a 8 1114 1152 1162 N
+ B AO OY b n/a 8 1114 1151 1168 N
+ B AO OY e n/a 8 1114 1151 1168 N
+ B AO P b n/a 8 1114 1149 1169 N
+ B AO P e n/a 8 1114 1140 1169 N
+ B AO R b n/a 8 1114 1142 1171 N
+ B AO R e n/a 8 1114 1141 1171 N
+ B AO R i n/a 8 1114 1141 1171 N
+ B AO S e n/a 8 1114 1140 1170 N
+ B AO SH e n/a 8 1114 1140 1170 N
+ B AO SIL e n/a 8 1114 1140 1169 N
+ B AO T b n/a 8 1114 1149 1169 N
+ B AO T e n/a 8 1114 1140 1169 N
+ B AO TH e n/a 8 1114 1140 1169 N
+ B AO UH b n/a 8 1114 1157 1185 N
+ B AO UH e n/a 8 1114 1157 1185 N
+ B AO UH i n/a 8 1114 1157 1185 N
+ B AO UW b n/a 8 1114 1157 1185 N
+ B AO UW e n/a 8 1114 1157 1185 N
+ B AO V e n/a 8 1114 1140 1170 N
+ B AO W b n/a 8 1114 1139 1165 N
+ B AO W e n/a 8 1114 1139 1164 N
+ B AO W i n/a 8 1114 1139 1164 N
+ B AO Y b n/a 8 1114 1158 1187 N
+ B AO Y e n/a 8 1114 1158 1187 N
+ B AO Y i n/a 8 1114 1158 1187 N
+ B AO Z b n/a 8 1114 1149 1170 N
+ B AO Z e n/a 8 1114 1140 1170 N
+ B AO Z i n/a 8 1114 1140 1170 N
+ B AO ZH e n/a 8 1114 1140 1170 N
+ B AW AA b n/a 8 1114 1152 1181 N
+ B AW AA e n/a 8 1114 1152 1181 N
+ B AW AA i n/a 8 1114 1152 1181 N
+ B AW AE b n/a 8 1114 1149 1174 N
+ B AW AE e n/a 8 1114 1149 1174 N
+ B AW AE i n/a 8 1114 1149 1174 N
+ B AW AH b n/a 8 1116 1150 1176 N
+ B AW AH e n/a 8 1114 1139 1162 N
+ B AW AH i n/a 8 1114 1139 1162 N
+ B AW AO b n/a 8 1114 1151 1168 N
+ B AW AO e n/a 8 1114 1151 1168 N
+ B AW AW b n/a 8 1114 1153 1182 N
+ B AW AW e n/a 8 1114 1153 1182 N
+ B AW AY b n/a 8 1114 1152 1180 N
+ B AW AY e n/a 8 1114 1152 1180 N
+ B AW AY i n/a 8 1114 1152 1180 N
+ B AW B e n/a 8 1114 1140 1170 N
+ B AW CH e n/a 8 1114 1140 1170 N
+ B AW D b n/a 8 1114 1149 1170 N
+ B AW D e n/a 8 1114 1140 1170 N
+ B AW DH e n/a 8 1114 1140 1170 N
+ B AW EH b n/a 8 1114 1149 1173 N
+ B AW EH e n/a 8 1114 1139 1163 N
+ B AW EH i n/a 8 1114 1139 1163 N
+ B AW ER b n/a 8 1117 1142 1179 N
+ B AW ER e n/a 8 1114 1141 1172 N
+ B AW ER i n/a 8 1114 1141 1172 N
+ B AW EY b n/a 8 1114 1149 1173 N
+ B AW EY e n/a 8 1114 1149 1163 N
+ B AW F e n/a 8 1114 1140 1169 N
+ B AW G e n/a 8 1114 1140 1170 N
+ B AW HH e n/a 8 1114 1140 1169 N
+ B AW HH i n/a 8 1114 1140 1169 N
+ B AW IH b n/a 8 1117 1156 1183 N
+ B AW IH e n/a 8 1114 1156 1183 N
+ B AW IH i n/a 8 1114 1156 1183 N
+ B AW IY b n/a 8 1114 1158 1187 N
+ B AW IY e n/a 8 1114 1158 1187 N
+ B AW IY i n/a 8 1114 1158 1187 N
+ B AW JH e n/a 8 1114 1140 1170 N
+ B AW K e n/a 8 1114 1140 1169 N
+ B AW L b n/a 8 1114 1139 1165 N
+ B AW L e n/a 8 1114 1139 1164 N
+ B AW L i n/a 8 1114 1139 1164 N
+ B AW M b n/a 8 1114 1149 1170 N
+ B AW M e n/a 8 1114 1140 1170 N
+ B AW M i n/a 8 1114 1140 1170 N
+ B AW N b n/a 8 1114 1149 1170 N
+ B AW N e n/a 8 1114 1140 1170 N
+ B AW N i n/a 8 1114 1140 1170 N
+ B AW NG e n/a 8 1114 1140 1170 N
+ B AW OW b n/a 8 1114 1152 1178 N
+ B AW OW e n/a 8 1114 1152 1162 N
+ B AW OY b n/a 8 1114 1151 1168 N
+ B AW OY e n/a 8 1114 1151 1168 N
+ B AW OY i n/a 8 1114 1151 1168 N
+ B AW P b n/a 8 1114 1149 1169 N
+ B AW P e n/a 8 1114 1140 1169 N
+ B AW R b n/a 8 1114 1142 1171 N
+ B AW R e n/a 8 1114 1141 1171 N
+ B AW R i n/a 8 1114 1141 1171 N
+ B AW S e n/a 8 1114 1140 1170 N
+ B AW SH e n/a 8 1114 1140 1170 N
+ B AW SH i n/a 8 1114 1140 1170 N
+ B AW SIL e n/a 8 1114 1140 1169 N
+ B AW T b n/a 8 1114 1149 1169 N
+ B AW T e n/a 8 1114 1140 1169 N
+ B AW TH e n/a 8 1114 1140 1169 N
+ B AW UH b n/a 8 1114 1157 1185 N
+ B AW UH e n/a 8 1114 1157 1185 N
+ B AW UW b n/a 8 1114 1157 1185 N
+ B AW UW e n/a 8 1114 1157 1185 N
+ B AW V e n/a 8 1114 1140 1170 N
+ B AW W b n/a 8 1114 1139 1165 N
+ B AW W e n/a 8 1114 1139 1164 N
+ B AW Y b n/a 8 1114 1158 1187 N
+ B AW Y e n/a 8 1114 1158 1187 N
+ B AW Z b n/a 8 1114 1149 1170 N
+ B AW Z e n/a 8 1114 1140 1170 N
+ B AW Z i n/a 8 1114 1140 1170 N
+ B AW ZH e n/a 8 1114 1140 1170 N
+ B AY AA b n/a 8 1121 1152 1181 N
+ B AY AA e n/a 8 1121 1152 1180 N
+ B AY AA i n/a 8 1118 1152 1180 N
+ B AY AE b n/a 8 1121 1149 1174 N
+ B AY AE e n/a 8 1121 1149 1174 N
+ B AY AE i n/a 8 1118 1149 1174 N
+ B AY AH b n/a 8 1121 1150 1176 N
+ B AY AH e n/a 8 1121 1136 1167 N
+ B AY AH i n/a 8 1118 1136 1167 N
+ B AY AO b n/a 8 1121 1151 1168 N
+ B AY AO e n/a 8 1121 1151 1168 N
+ B AY AO i n/a 8 1118 1151 1168 N
+ B AY AW b n/a 8 1121 1153 1182 N
+ B AY AW e n/a 8 1121 1153 1182 N
+ B AY AW i n/a 8 1118 1153 1182 N
+ B AY AY b n/a 8 1121 1152 1180 N
+ B AY AY e n/a 8 1121 1152 1180 N
+ B AY AY i n/a 8 1118 1152 1180 N
+ B AY B e n/a 8 1121 1140 1170 N
+ B AY CH e n/a 8 1121 1140 1170 N
+ B AY D b n/a 8 1121 1149 1170 N
+ B AY D e n/a 8 1121 1140 1170 N
+ B AY D i n/a 8 1118 1140 1170 N
+ B AY DH e n/a 8 1121 1140 1170 N
+ B AY EH b n/a 8 1121 1149 1173 N
+ B AY EH e n/a 8 1121 1138 1163 N
+ B AY EH i n/a 8 1118 1138 1163 N
+ B AY ER b n/a 8 1121 1142 1179 N
+ B AY ER e n/a 8 1121 1141 1172 N
+ B AY ER i n/a 8 1118 1141 1172 N
+ B AY EY b n/a 8 1121 1149 1173 N
+ B AY EY e n/a 8 1121 1149 1163 N
+ B AY EY i n/a 8 1118 1149 1163 N
+ B AY F e n/a 8 1121 1140 1169 N
+ B AY F i n/a 8 1118 1140 1169 N
+ B AY G e n/a 8 1121 1140 1170 N
+ B AY HH e n/a 8 1121 1140 1169 N
+ B AY IH b n/a 8 1121 1156 1183 N
+ B AY IH e n/a 8 1121 1156 1183 N
+ B AY IH i n/a 8 1118 1156 1183 N
+ B AY IY b n/a 8 1121 1158 1187 N
+ B AY IY e n/a 8 1121 1158 1187 N
+ B AY IY i n/a 8 1118 1158 1187 N
+ B AY JH e n/a 8 1121 1140 1170 N
+ B AY K e n/a 8 1121 1140 1169 N
+ B AY L b n/a 8 1121 1137 1165 N
+ B AY L e n/a 8 1121 1136 1164 N
+ B AY L i n/a 8 1118 1136 1164 N
+ B AY M b n/a 8 1121 1149 1170 N
+ B AY M e n/a 8 1121 1140 1170 N
+ B AY M i n/a 8 1118 1140 1170 N
+ B AY N b n/a 8 1121 1149 1170 N
+ B AY N e n/a 8 1121 1140 1170 N
+ B AY N i n/a 8 1118 1140 1170 N
+ B AY NG e n/a 8 1121 1140 1170 N
+ B AY OW b n/a 8 1121 1152 1178 N
+ B AY OW e n/a 8 1121 1152 1162 N
+ B AY OW i n/a 8 1118 1152 1162 N
+ B AY OY b n/a 8 1121 1151 1168 N
+ B AY OY e n/a 8 1121 1151 1168 N
+ B AY OY i n/a 8 1118 1151 1168 N
+ B AY P b n/a 8 1121 1149 1169 N
+ B AY P e n/a 8 1121 1140 1169 N
+ B AY R b n/a 8 1121 1142 1171 N
+ B AY R e n/a 8 1121 1141 1171 N
+ B AY R i n/a 8 1118 1141 1171 N
+ B AY S e n/a 8 1121 1140 1170 N
+ B AY SH e n/a 8 1121 1140 1170 N
+ B AY SIL e n/a 8 1121 1140 1169 N
+ B AY T b n/a 8 1121 1149 1169 N
+ B AY T e n/a 8 1121 1140 1169 N
+ B AY TH e n/a 8 1121 1140 1169 N
+ B AY UH b n/a 8 1121 1157 1185 N
+ B AY UH e n/a 8 1121 1157 1185 N
+ B AY UW b n/a 8 1121 1157 1185 N
+ B AY UW e n/a 8 1121 1157 1185 N
+ B AY UW i n/a 8 1118 1157 1185 N
+ B AY V e n/a 8 1121 1140 1170 N
+ B AY W b n/a 8 1121 1137 1165 N
+ B AY W e n/a 8 1121 1136 1164 N
+ B AY Y b n/a 8 1121 1158 1187 N
+ B AY Y e n/a 8 1121 1158 1187 N
+ B AY Y i n/a 8 1118 1158 1187 N
+ B AY Z b n/a 8 1121 1149 1170 N
+ B AY Z e n/a 8 1121 1140 1170 N
+ B AY Z i n/a 8 1118 1140 1170 N
+ B AY ZH e n/a 8 1121 1140 1170 N
+ B B AA b n/a 8 1128 1152 1181 N
+ B B AE b n/a 8 1128 1149 1174 N
+ B B AH b n/a 8 1123 1150 1175 N
+ B B AO b n/a 8 1128 1151 1168 N
+ B B AW b n/a 8 1128 1153 1182 N
+ B B AY b n/a 8 1128 1152 1180 N
+ B B D b n/a 8 1128 1149 1170 N
+ B B EH b n/a 8 1128 1149 1173 N
+ B B ER b n/a 8 1128 1143 1179 N
+ B B EY b n/a 8 1128 1149 1173 N
+ B B IH b n/a 8 1132 1155 1183 N
+ B B IY b n/a 8 1132 1158 1187 N
+ B B L b n/a 8 1128 1137 1165 N
+ B B M b n/a 8 1128 1149 1170 N
+ B B N b n/a 8 1128 1149 1170 N
+ B B OW b n/a 8 1128 1152 1178 N
+ B B OY b n/a 8 1128 1151 1168 N
+ B B P b n/a 8 1128 1149 1169 N
+ B B R b n/a 8 1128 1143 1171 N
+ B B T b n/a 8 1128 1149 1169 N
+ B B UH b n/a 8 1131 1157 1185 N
+ B B UW b n/a 8 1131 1157 1185 N
+ B B W b n/a 8 1128 1137 1165 N
+ B B Y b n/a 8 1132 1158 1187 N
+ B B Z b n/a 8 1128 1149 1170 N
+ B CH AA b n/a 8 1125 1144 1181 N
+ B CH AA e n/a 8 1125 1144 1181 N
+ B CH AA i n/a 8 1125 1144 1181 N
+ B CH AE b n/a 8 1125 1146 1174 N
+ B CH AE e n/a 8 1125 1146 1174 N
+ B CH AE i n/a 8 1125 1146 1174 N
+ B CH AH b n/a 8 1123 1147 1176 N
+ B CH AH e n/a 8 1123 1147 1162 N
+ B CH AO b n/a 8 1125 1147 1168 N
+ B CH AO e n/a 8 1125 1147 1168 N
+ B CH AO i n/a 8 1125 1147 1168 N
+ B CH AW b n/a 8 1125 1146 1182 N
+ B CH AW e n/a 8 1125 1146 1182 N
+ B CH AY b n/a 8 1125 1144 1180 N
+ B CH AY e n/a 8 1125 1144 1180 N
+ B CH B e n/a 8 1125 1146 1170 N
+ B CH CH e n/a 8 1125 1146 1170 N
+ B CH D b n/a 8 1125 1146 1170 N
+ B CH D e n/a 8 1125 1146 1170 N
+ B CH DH e n/a 8 1125 1146 1170 N
+ B CH EH b n/a 8 1125 1146 1173 N
+ B CH EH e n/a 8 1125 1146 1163 N
+ B CH EH i n/a 8 1125 1146 1163 N
+ B CH ER b n/a 8 1125 1148 1179 N
+ B CH ER e n/a 8 1125 1148 1172 N
+ B CH ER i n/a 8 1125 1148 1172 N
+ B CH EY b n/a 8 1125 1146 1173 N
+ B CH EY e n/a 8 1125 1146 1163 N
+ B CH F e n/a 8 1125 1146 1169 N
+ B CH G e n/a 8 1125 1146 1170 N
+ B CH HH e n/a 8 1125 1146 1169 N
+ B CH IH b n/a 8 1125 1160 1184 N
+ B CH IH e n/a 8 1125 1160 1184 N
+ B CH IH i n/a 8 1125 1160 1184 N
+ B CH IY b n/a 8 1125 1161 1186 N
+ B CH IY e n/a 8 1125 1161 1186 N
+ B CH IY i n/a 8 1125 1161 1186 N
+ B CH JH e n/a 8 1125 1146 1170 N
+ B CH K e n/a 8 1125 1146 1169 N
+ B CH L b n/a 8 1125 1147 1165 N
+ B CH L e n/a 8 1125 1147 1164 N
+ B CH L i n/a 8 1125 1147 1164 N
+ B CH M b n/a 8 1125 1146 1170 N
+ B CH M e n/a 8 1125 1146 1170 N
+ B CH N b n/a 8 1125 1146 1170 N
+ B CH N e n/a 8 1125 1146 1170 N
+ B CH NG e n/a 8 1125 1146 1170 N
+ B CH OW b n/a 8 1125 1147 1178 N
+ B CH OW e n/a 8 1125 1147 1162 N
+ B CH OW i n/a 8 1125 1147 1162 N
+ B CH OY b n/a 8 1125 1147 1168 N
+ B CH OY e n/a 8 1125 1147 1168 N
+ B CH P b n/a 8 1125 1146 1169 N
+ B CH P e n/a 8 1125 1146 1169 N
+ B CH R b n/a 8 1125 1148 1171 N
+ B CH R e n/a 8 1125 1148 1171 N
+ B CH S e n/a 8 1125 1146 1170 N
+ B CH SH e n/a 8 1125 1146 1170 N
+ B CH SIL e n/a 8 1125 1146 1169 N
+ B CH T b n/a 8 1125 1146 1169 N
+ B CH T e n/a 8 1125 1146 1169 N
+ B CH TH e n/a 8 1125 1146 1169 N
+ B CH UH b n/a 8 1125 1160 1185 N
+ B CH UH e n/a 8 1125 1160 1185 N
+ B CH UH i n/a 8 1125 1160 1185 N
+ B CH UW b n/a 8 1125 1160 1185 N
+ B CH UW e n/a 8 1125 1160 1185 N
+ B CH V e n/a 8 1125 1146 1170 N
+ B CH W b n/a 8 1125 1147 1165 N
+ B CH W e n/a 8 1125 1147 1164 N
+ B CH Y b n/a 8 1125 1161 1186 N
+ B CH Y e n/a 8 1125 1161 1186 N
+ B CH Z b n/a 8 1125 1146 1170 N
+ B CH Z e n/a 8 1125 1146 1170 N
+ B CH ZH e n/a 8 1125 1146 1170 N
+ B D AA b n/a 8 1128 1154 1181 N
+ B D AA e n/a 8 1128 1154 1181 N
+ B D AA i n/a 8 1128 1154 1181 N
+ B D AE b n/a 8 1128 1149 1174 N
+ B D AE e n/a 8 1128 1149 1174 N
+ B D AE i n/a 8 1128 1149 1174 N
+ B D AH b n/a 8 1123 1150 1175 N
+ B D AH e n/a 8 1123 1137 1162 N
+ B D AH i n/a 8 1122 1137 1162 N
+ B D AO b n/a 8 1128 1151 1168 N
+ B D AO e n/a 8 1128 1151 1168 N
+ B D AO i n/a 8 1128 1151 1168 N
+ B D AW b n/a 8 1128 1153 1182 N
+ B D AW e n/a 8 1128 1153 1182 N
+ B D AW i n/a 8 1128 1153 1182 N
+ B D AY b n/a 8 1128 1154 1180 N
+ B D AY e n/a 8 1128 1154 1180 N
+ B D AY i n/a 8 1128 1154 1180 N
+ B D B e n/a 8 1128 1140 1170 N
+ B D CH e n/a 8 1128 1140 1170 N
+ B D D b n/a 8 1128 1149 1170 N
+ B D D e n/a 8 1128 1140 1170 N
+ B D DH e n/a 8 1128 1140 1170 N
+ B D EH b n/a 8 1128 1149 1173 N
+ B D EH e n/a 8 1128 1137 1163 N
+ B D EH i n/a 8 1128 1137 1163 N
+ B D ER b n/a 8 1128 1142 1179 N
+ B D ER e n/a 8 1128 1141 1172 N
+ B D ER i n/a 8 1128 1141 1172 N
+ B D EY b n/a 8 1128 1149 1173 N
+ B D EY e n/a 8 1128 1149 1163 N
+ B D EY i n/a 8 1128 1149 1163 N
+ B D F e n/a 8 1128 1140 1169 N
+ B D G e n/a 8 1128 1140 1170 N
+ B D HH e n/a 8 1128 1140 1169 N
+ B D IH b n/a 8 1132 1155 1183 N
+ B D IH e n/a 8 1132 1155 1183 N
+ B D IH i n/a 8 1132 1155 1183 N
+ B D IY b n/a 8 1132 1159 1187 N
+ B D IY e n/a 8 1132 1159 1187 N
+ B D IY i n/a 8 1132 1159 1187 N
+ B D JH e n/a 8 1128 1140 1170 N
+ B D K e n/a 8 1128 1140 1169 N
+ B D L b n/a 8 1128 1137 1165 N
+ B D L e n/a 8 1128 1137 1164 N
+ B D L i n/a 8 1128 1137 1164 N
+ B D M b n/a 8 1128 1149 1170 N
+ B D M e n/a 8 1128 1140 1170 N
+ B D N b n/a 8 1128 1149 1170 N
+ B D N e n/a 8 1128 1140 1170 N
+ B D NG e n/a 8 1128 1140 1170 N
+ B D OW b n/a 8 1128 1152 1178 N
+ B D OW e n/a 8 1128 1152 1162 N
+ B D OW i n/a 8 1128 1152 1162 N
+ B D OY b n/a 8 1128 1151 1168 N
+ B D OY e n/a 8 1128 1151 1168 N
+ B D P b n/a 8 1128 1149 1169 N
+ B D P e n/a 8 1128 1140 1169 N
+ B D R b n/a 8 1128 1142 1171 N
+ B D R e n/a 8 1128 1141 1171 N
+ B D R i n/a 8 1128 1141 1171 N
+ B D S e n/a 8 1128 1140 1170 N
+ B D SH e n/a 8 1128 1140 1170 N
+ B D SIL e n/a 8 1128 1140 1169 N
+ B D T b n/a 8 1128 1149 1169 N
+ B D T e n/a 8 1128 1140 1169 N
+ B D TH e n/a 8 1128 1140 1169 N
+ B D UH b n/a 8 1131 1157 1185 N
+ B D UH e n/a 8 1131 1157 1185 N
+ B D UH i n/a 8 1131 1157 1185 N
+ B D UW b n/a 8 1131 1157 1185 N
+ B D UW e n/a 8 1131 1157 1185 N
+ B D V e n/a 8 1128 1140 1170 N
+ B D W b n/a 8 1128 1137 1165 N
+ B D W e n/a 8 1128 1137 1164 N
+ B D W i n/a 8 1128 1137 1164 N
+ B D Y b n/a 8 1132 1159 1187 N
+ B D Y e n/a 8 1132 1159 1187 N
+ B D Z b n/a 8 1128 1149 1170 N
+ B D Z e n/a 8 1128 1140 1170 N
+ B D Z i n/a 8 1128 1140 1170 N
+ B D ZH e n/a 8 1128 1140 1170 N
+ B DH AA b n/a 8 1125 1152 1181 N
+ B DH AE b n/a 8 1125 1149 1174 N
+ B DH AH b n/a 8 1123 1150 1176 N
+ B DH AO b n/a 8 1125 1151 1168 N
+ B DH AW b n/a 8 1125 1153 1182 N
+ B DH AY b n/a 8 1125 1152 1180 N
+ B DH D b n/a 8 1125 1149 1170 N
+ B DH EH b n/a 8 1125 1149 1173 N
+ B DH ER b n/a 8 1125 1142 1179 N
+ B DH EY b n/a 8 1125 1149 1173 N
+ B DH IH b n/a 8 1125 1155 1183 N
+ B DH IY b n/a 8 1125 1159 1186 N
+ B DH L b n/a 8 1125 1137 1165 N
+ B DH M b n/a 8 1125 1149 1170 N
+ B DH N b n/a 8 1125 1149 1170 N
+ B DH OW b n/a 8 1125 1152 1178 N
+ B DH OY b n/a 8 1125 1151 1168 N
+ B DH P b n/a 8 1125 1149 1169 N
+ B DH R b n/a 8 1125 1142 1171 N
+ B DH T b n/a 8 1125 1149 1169 N
+ B DH UH b n/a 8 1125 1157 1185 N
+ B DH UW b n/a 8 1125 1157 1185 N
+ B DH W b n/a 8 1125 1137 1165 N
+ B DH Y b n/a 8 1125 1159 1187 N
+ B DH Z b n/a 8 1125 1149 1170 N
+ B EH AA b n/a 8 1107 1152 1181 N
+ B EH AA e n/a 8 1112 1152 1181 N
+ B EH AA i n/a 8 1112 1152 1181 N
+ B EH AE b n/a 8 1105 1149 1174 N
+ B EH AE e n/a 8 1112 1149 1174 N
+ B EH AE i n/a 8 1112 1149 1174 N
+ B EH AH b n/a 8 1105 1150 1176 N
+ B EH AH e n/a 8 1111 1136 1167 N
+ B EH AH i n/a 8 1111 1136 1167 N
+ B EH AO b n/a 8 1107 1151 1168 N
+ B EH AO e n/a 8 1112 1151 1168 N
+ B EH AO i n/a 8 1112 1151 1168 N
+ B EH AW b n/a 8 1105 1153 1182 N
+ B EH AW e n/a 8 1112 1153 1182 N
+ B EH AW i n/a 8 1112 1153 1182 N
+ B EH AY b n/a 8 1107 1152 1180 N
+ B EH AY e n/a 8 1112 1152 1180 N
+ B EH AY i n/a 8 1112 1152 1180 N
+ B EH B e n/a 8 1111 1140 1170 N
+ B EH CH e n/a 8 1111 1140 1170 N
+ B EH D b n/a 8 1105 1149 1170 N
+ B EH D e n/a 8 1111 1140 1170 N
+ B EH D i n/a 8 1111 1140 1170 N
+ B EH DH e n/a 8 1111 1140 1170 N
+ B EH EH b n/a 8 1105 1149 1173 N
+ B EH EH e n/a 8 1111 1138 1163 N
+ B EH EH i n/a 8 1111 1138 1163 N
+ B EH ER b n/a 8 1107 1142 1179 N
+ B EH ER e n/a 8 1111 1141 1172 N
+ B EH ER i n/a 8 1111 1141 1172 N
+ B EH EY b n/a 8 1105 1149 1173 N
+ B EH EY e n/a 8 1111 1149 1163 N
+ B EH EY i n/a 8 1111 1149 1163 N
+ B EH F e n/a 8 1111 1140 1169 N
+ B EH G e n/a 8 1111 1140 1170 N
+ B EH HH e n/a 8 1111 1140 1169 N
+ B EH HH i n/a 8 1111 1140 1169 N
+ B EH IH b n/a 8 1105 1156 1183 N
+ B EH IH e n/a 8 1112 1156 1183 N
+ B EH IH i n/a 8 1112 1156 1183 N
+ B EH IY b n/a 8 1104 1158 1187 N
+ B EH IY e n/a 8 1112 1158 1187 N
+ B EH IY i n/a 8 1112 1158 1187 N
+ B EH JH e n/a 8 1111 1140 1170 N
+ B EH K e n/a 8 1111 1140 1169 N
+ B EH K i n/a 8 1111 1140 1169 N
+ B EH L b n/a 8 1107 1137 1165 N
+ B EH L e n/a 8 1111 1136 1164 N
+ B EH L i n/a 8 1111 1136 1164 N
+ B EH M b n/a 8 1105 1149 1170 N
+ B EH M e n/a 8 1111 1140 1170 N
+ B EH M i n/a 8 1111 1140 1170 N
+ B EH N b n/a 8 1105 1149 1170 N
+ B EH N e n/a 8 1111 1140 1170 N
+ B EH N i n/a 8 1111 1140 1170 N
+ B EH NG e n/a 8 1111 1140 1170 N
+ B EH OW b n/a 8 1107 1152 1178 N
+ B EH OW e n/a 8 1111 1152 1162 N
+ B EH OW i n/a 8 1111 1152 1162 N
+ B EH OY b n/a 8 1107 1151 1168 N
+ B EH OY e n/a 8 1112 1151 1168 N
+ B EH OY i n/a 8 1112 1151 1168 N
+ B EH P b n/a 8 1105 1149 1169 N
+ B EH P e n/a 8 1111 1140 1169 N
+ B EH P i n/a 8 1111 1140 1169 N
+ B EH R b n/a 8 1107 1142 1171 N
+ B EH R e n/a 8 1111 1141 1171 N
+ B EH R i n/a 8 1111 1141 1171 N
+ B EH S e n/a 8 1111 1140 1170 N
+ B EH S i n/a 8 1111 1140 1170 N
+ B EH SH e n/a 8 1111 1140 1170 N
+ B EH SIL e n/a 8 1111 1140 1169 N
+ B EH T b n/a 8 1105 1149 1169 N
+ B EH T e n/a 8 1111 1140 1169 N
+ B EH T i n/a 8 1111 1140 1169 N
+ B EH TH e n/a 8 1111 1140 1169 N
+ B EH UH b n/a 8 1107 1157 1185 N
+ B EH UH e n/a 8 1112 1157 1185 N
+ B EH UH i n/a 8 1112 1157 1185 N
+ B EH UW b n/a 8 1107 1157 1185 N
+ B EH UW e n/a 8 1112 1157 1185 N
+ B EH UW i n/a 8 1112 1157 1185 N
+ B EH V e n/a 8 1111 1140 1170 N
+ B EH W b n/a 8 1107 1137 1165 N
+ B EH W e n/a 8 1111 1136 1164 N
+ B EH Y b n/a 8 1105 1158 1187 N
+ B EH Y e n/a 8 1112 1158 1187 N
+ B EH Y i n/a 8 1112 1158 1187 N
+ B EH Z b n/a 8 1105 1149 1170 N
+ B EH Z e n/a 8 1111 1140 1170 N
+ B EH Z i n/a 8 1111 1140 1170 N
+ B EH ZH e n/a 8 1111 1140 1170 N
+ B ER AA b n/a 8 1108 1152 1181 N
+ B ER AA e n/a 8 1113 1152 1181 N
+ B ER AA i n/a 8 1113 1152 1181 N
+ B ER AE b n/a 8 1108 1149 1174 N
+ B ER AE e n/a 8 1113 1149 1174 N
+ B ER AE i n/a 8 1113 1149 1174 N
+ B ER AH b n/a 8 1116 1150 1176 N
+ B ER AH e n/a 8 1113 1136 1163 N
+ B ER AH i n/a 8 1113 1136 1163 N
+ B ER AO b n/a 8 1108 1151 1168 N
+ B ER AO e n/a 8 1113 1151 1168 N
+ B ER AO i n/a 8 1113 1151 1168 N
+ B ER AW b n/a 8 1108 1153 1182 N
+ B ER AW e n/a 8 1113 1153 1182 N
+ B ER AW i n/a 8 1113 1153 1182 N
+ B ER AY b n/a 8 1108 1152 1180 N
+ B ER AY e n/a 8 1113 1152 1180 N
+ B ER AY i n/a 8 1113 1152 1180 N
+ B ER B e n/a 8 1113 1140 1170 N
+ B ER CH e n/a 8 1113 1140 1170 N
+ B ER D b n/a 8 1108 1149 1170 N
+ B ER D e n/a 8 1113 1140 1170 N
+ B ER D i n/a 8 1113 1140 1170 N
+ B ER DH e n/a 8 1113 1140 1170 N
+ B ER EH b n/a 8 1108 1149 1173 N
+ B ER EH e n/a 8 1113 1138 1163 N
+ B ER EH i n/a 8 1113 1138 1163 N
+ B ER ER b n/a 8 1117 1142 1179 N
+ B ER ER e n/a 8 1113 1141 1172 N
+ B ER ER i n/a 8 1113 1141 1172 N
+ B ER EY b n/a 8 1108 1149 1173 N
+ B ER EY e n/a 8 1113 1149 1163 N
+ B ER EY i n/a 8 1113 1149 1163 N
+ B ER F e n/a 8 1113 1140 1169 N
+ B ER G e n/a 8 1113 1140 1170 N
+ B ER HH e n/a 8 1113 1140 1169 N
+ B ER IH b n/a 8 1117 1156 1183 N
+ B ER IH e n/a 8 1113 1156 1183 N
+ B ER IH i n/a 8 1113 1156 1183 N
+ B ER IY b n/a 8 1108 1158 1187 N
+ B ER IY e n/a 8 1113 1158 1187 N
+ B ER IY i n/a 8 1113 1158 1187 N
+ B ER JH e n/a 8 1113 1140 1170 N
+ B ER K e n/a 8 1113 1140 1169 N
+ B ER L b n/a 8 1108 1137 1165 N
+ B ER L e n/a 8 1113 1136 1164 N
+ B ER L i n/a 8 1113 1136 1164 N
+ B ER M b n/a 8 1108 1149 1170 N
+ B ER M e n/a 8 1113 1140 1170 N
+ B ER N b n/a 8 1108 1149 1170 N
+ B ER N e n/a 8 1113 1140 1170 N
+ B ER NG e n/a 8 1113 1140 1170 N
+ B ER OW b n/a 8 1108 1152 1178 N
+ B ER OW e n/a 8 1113 1152 1162 N
+ B ER OW i n/a 8 1113 1152 1162 N
+ B ER OY b n/a 8 1108 1151 1168 N
+ B ER OY e n/a 8 1113 1151 1168 N
+ B ER OY i n/a 8 1113 1151 1168 N
+ B ER P b n/a 8 1108 1149 1169 N
+ B ER P e n/a 8 1113 1140 1169 N
+ B ER R b n/a 8 1108 1142 1171 N
+ B ER R e n/a 8 1113 1141 1171 N
+ B ER R i n/a 8 1113 1141 1171 N
+ B ER S e n/a 8 1113 1140 1170 N
+ B ER S i n/a 8 1113 1140 1170 N
+ B ER SH e n/a 8 1113 1140 1170 N
+ B ER SIL e n/a 8 1113 1140 1169 N
+ B ER T b n/a 8 1108 1149 1169 N
+ B ER T e n/a 8 1113 1140 1169 N
+ B ER TH e n/a 8 1113 1140 1169 N
+ B ER UH b n/a 8 1108 1157 1185 N
+ B ER UH e n/a 8 1113 1157 1185 N
+ B ER UH i n/a 8 1113 1157 1185 N
+ B ER UW b n/a 8 1108 1157 1185 N
+ B ER UW e n/a 8 1113 1157 1185 N
+ B ER UW i n/a 8 1113 1157 1185 N
+ B ER V e n/a 8 1113 1140 1170 N
+ B ER V i n/a 8 1113 1140 1170 N
+ B ER W b n/a 8 1108 1137 1165 N
+ B ER W e n/a 8 1113 1136 1164 N
+ B ER Y b n/a 8 1108 1158 1187 N
+ B ER Y e n/a 8 1113 1158 1187 N
+ B ER Y i n/a 8 1113 1158 1187 N
+ B ER Z b n/a 8 1108 1149 1170 N
+ B ER Z e n/a 8 1113 1140 1170 N
+ B ER Z i n/a 8 1113 1140 1170 N
+ B ER ZH e n/a 8 1113 1140 1170 N
+ B EY AA b n/a 8 1120 1154 1181 N
+ B EY AA e n/a 8 1120 1153 1180 N
+ B EY AA i n/a 8 1120 1153 1180 N
+ B EY AE b n/a 8 1120 1149 1174 N
+ B EY AE e n/a 8 1120 1149 1174 N
+ B EY AE i n/a 8 1120 1149 1174 N
+ B EY AH b n/a 8 1116 1150 1176 N
+ B EY AH e n/a 8 1120 1135 1167 N
+ B EY AH i n/a 8 1118 1135 1166 N
+ B EY AO b n/a 8 1120 1151 1168 N
+ B EY AO e n/a 8 1120 1151 1168 N
+ B EY AO i n/a 8 1120 1151 1168 N
+ B EY AW b n/a 8 1120 1153 1182 N
+ B EY AW e n/a 8 1120 1153 1182 N
+ B EY AW i n/a 8 1120 1153 1182 N
+ B EY AY b n/a 8 1120 1154 1180 N
+ B EY AY e n/a 8 1120 1153 1180 N
+ B EY B e n/a 8 1120 1140 1170 N
+ B EY CH e n/a 8 1120 1140 1170 N
+ B EY D b n/a 8 1120 1149 1170 N
+ B EY D e n/a 8 1120 1140 1170 N
+ B EY DH e n/a 8 1120 1140 1170 N
+ B EY EH b n/a 8 1120 1149 1173 N
+ B EY EH e n/a 8 1120 1135 1163 N
+ B EY EH i n/a 8 1118 1135 1163 N
+ B EY ER b n/a 8 1117 1142 1179 N
+ B EY ER e n/a 8 1120 1141 1172 N
+ B EY ER i n/a 8 1118 1141 1172 N
+ B EY EY b n/a 8 1120 1149 1173 N
+ B EY EY e n/a 8 1120 1149 1163 N
+ B EY EY i n/a 8 1120 1149 1163 N
+ B EY F e n/a 8 1120 1140 1169 N
+ B EY G e n/a 8 1120 1140 1170 N
+ B EY HH e n/a 8 1120 1140 1169 N
+ B EY HH i n/a 8 1118 1140 1169 N
+ B EY IH b n/a 8 1120 1156 1183 N
+ B EY IH e n/a 8 1120 1156 1183 N
+ B EY IH i n/a 8 1118 1156 1183 N
+ B EY IY b n/a 8 1119 1158 1187 N
+ B EY IY e n/a 8 1119 1158 1187 N
+ B EY IY i n/a 8 1119 1158 1187 N
+ B EY JH e n/a 8 1120 1140 1170 N
+ B EY K e n/a 8 1120 1140 1169 N
+ B EY L b n/a 8 1120 1135 1165 N
+ B EY L e n/a 8 1120 1135 1164 N
+ B EY L i n/a 8 1118 1135 1164 N
+ B EY M b n/a 8 1120 1149 1170 N
+ B EY M e n/a 8 1120 1140 1170 N
+ B EY N b n/a 8 1120 1149 1170 N
+ B EY N e n/a 8 1120 1140 1170 N
+ B EY NG e n/a 8 1120 1140 1170 N
+ B EY OW b n/a 8 1120 1152 1178 N
+ B EY OW e n/a 8 1120 1152 1162 N
+ B EY OW i n/a 8 1120 1152 1162 N
+ B EY OY b n/a 8 1120 1151 1168 N
+ B EY OY e n/a 8 1120 1151 1168 N
+ B EY OY i n/a 8 1120 1151 1168 N
+ B EY P b n/a 8 1120 1149 1169 N
+ B EY P e n/a 8 1120 1140 1169 N
+ B EY R b n/a 8 1120 1142 1171 N
+ B EY R e n/a 8 1120 1141 1171 N
+ B EY R i n/a 8 1118 1141 1171 N
+ B EY S e n/a 8 1120 1140 1170 N
+ B EY SH e n/a 8 1120 1140 1170 N
+ B EY SIL e n/a 8 1120 1140 1169 N
+ B EY T b n/a 8 1120 1149 1169 N
+ B EY T e n/a 8 1120 1140 1169 N
+ B EY TH e n/a 8 1120 1140 1169 N
+ B EY UH b n/a 8 1120 1157 1185 N
+ B EY UH e n/a 8 1120 1157 1185 N
+ B EY UH i n/a 8 1118 1157 1185 N
+ B EY UW b n/a 8 1119 1157 1185 N
+ B EY UW e n/a 8 1119 1157 1185 N
+ B EY V e n/a 8 1120 1140 1170 N
+ B EY W b n/a 8 1120 1135 1165 N
+ B EY W e n/a 8 1120 1135 1164 N
+ B EY W i n/a 8 1118 1135 1164 N
+ B EY Y b n/a 8 1120 1158 1187 N
+ B EY Y e n/a 8 1120 1158 1187 N
+ B EY Y i n/a 8 1118 1158 1187 N
+ B EY Z b n/a 8 1120 1149 1170 N
+ B EY Z e n/a 8 1120 1140 1170 N
+ B EY Z i n/a 8 1118 1140 1170 N
+ B EY ZH e n/a 8 1120 1140 1170 N
+ B F AA b n/a 8 1124 1144 1181 N
+ B F AE b n/a 8 1125 1146 1174 N
+ B F AE i n/a 8 1125 1146 1174 N
+ B F AH b n/a 8 1123 1147 1176 N
+ B F AO b n/a 8 1124 1147 1168 N
+ B F AO i n/a 8 1124 1147 1168 N
+ B F AW b n/a 8 1125 1146 1182 N
+ B F AW i n/a 8 1125 1146 1182 N
+ B F AY b n/a 8 1124 1144 1180 N
+ B F D b n/a 8 1125 1146 1170 N
+ B F EH b n/a 8 1125 1146 1173 N
+ B F ER b n/a 8 1124 1148 1179 N
+ B F ER i n/a 8 1124 1148 1172 N
+ B F EY b n/a 8 1125 1146 1173 N
+ B F IH b n/a 8 1125 1160 1184 N
+ B F IY b n/a 8 1125 1161 1186 N
+ B F IY i n/a 8 1125 1161 1186 N
+ B F L b n/a 8 1124 1147 1165 N
+ B F L i n/a 8 1124 1147 1164 N
+ B F M b n/a 8 1125 1146 1170 N
+ B F N b n/a 8 1125 1146 1170 N
+ B F OW b n/a 8 1124 1147 1178 N
+ B F OW i n/a 8 1124 1147 1162 N
+ B F OY b n/a 8 1124 1147 1168 N
+ B F P b n/a 8 1125 1146 1169 N
+ B F R b n/a 8 1124 1148 1171 N
+ B F R i n/a 8 1124 1148 1171 N
+ B F T b n/a 8 1125 1146 1169 N
+ B F UH b n/a 8 1124 1160 1185 N
+ B F UW b n/a 8 1124 1160 1185 N
+ B F W b n/a 8 1124 1147 1165 N
+ B F Y b n/a 8 1125 1161 1186 N
+ B F Y i n/a 8 1125 1161 1186 N
+ B F Z b n/a 8 1125 1146 1170 N
+ B G AA b n/a 8 1128 1152 1181 N
+ B G AE b n/a 8 1128 1149 1174 N
+ B G AH b n/a 8 1123 1150 1175 N
+ B G AO b n/a 8 1128 1151 1168 N
+ B G AO i n/a 8 1128 1151 1168 N
+ B G AW b n/a 8 1128 1153 1182 N
+ B G AW i n/a 8 1128 1153 1182 N
+ B G AY b n/a 8 1128 1152 1180 N
+ B G D b n/a 8 1128 1149 1170 N
+ B G EH b n/a 8 1128 1149 1173 N
+ B G EH i n/a 8 1128 1138 1163 N
+ B G ER b n/a 8 1128 1142 1179 N
+ B G ER i n/a 8 1128 1141 1172 N
+ B G EY b n/a 8 1128 1149 1173 N
+ B G EY i n/a 8 1128 1149 1163 N
+ B G IH b n/a 8 1132 1155 1183 N
+ B G IH i n/a 8 1132 1155 1183 N
+ B G IY b n/a 8 1132 1158 1187 N
+ B G IY i n/a 8 1132 1158 1187 N
+ B G L b n/a 8 1128 1137 1165 N
+ B G M b n/a 8 1128 1149 1170 N
+ B G N b n/a 8 1128 1149 1170 N
+ B G OW b n/a 8 1128 1152 1178 N
+ B G OW i n/a 8 1128 1152 1162 N
+ B G OY b n/a 8 1128 1151 1168 N
+ B G P b n/a 8 1128 1149 1169 N
+ B G R b n/a 8 1128 1142 1171 N
+ B G R i n/a 8 1128 1141 1171 N
+ B G T b n/a 8 1128 1149 1169 N
+ B G UH b n/a 8 1131 1157 1185 N
+ B G UH i n/a 8 1131 1157 1185 N
+ B G UW b n/a 8 1131 1157 1185 N
+ B G W b n/a 8 1128 1137 1165 N
+ B G Y b n/a 8 1132 1158 1187 N
+ B G Z b n/a 8 1128 1149 1170 N
+ B G Z i n/a 8 1128 1140 1170 N
+ B HH AA b n/a 8 1125 1144 1181 N
+ B HH AE b n/a 8 1125 1146 1174 N
+ B HH AH b n/a 8 1123 1147 1176 N
+ B HH AO b n/a 8 1125 1147 1168 N
+ B HH AW b n/a 8 1125 1146 1182 N
+ B HH AY b n/a 8 1125 1144 1180 N
+ B HH D b n/a 8 1125 1146 1170 N
+ B HH EH b n/a 8 1125 1146 1173 N
+ B HH ER b n/a 8 1125 1148 1179 N
+ B HH EY b n/a 8 1125 1146 1173 N
+ B HH IH b n/a 8 1125 1160 1184 N
+ B HH IY b n/a 8 1125 1161 1186 N
+ B HH L b n/a 8 1125 1147 1165 N
+ B HH M b n/a 8 1125 1146 1170 N
+ B HH N b n/a 8 1125 1146 1170 N
+ B HH OW b n/a 8 1125 1147 1178 N
+ B HH OY b n/a 8 1125 1147 1168 N
+ B HH P b n/a 8 1125 1146 1169 N
+ B HH R b n/a 8 1125 1148 1171 N
+ B HH T b n/a 8 1125 1146 1169 N
+ B HH UH b n/a 8 1125 1160 1185 N
+ B HH UW b n/a 8 1125 1160 1185 N
+ B HH W b n/a 8 1125 1147 1165 N
+ B HH Y b n/a 8 1125 1161 1186 N
+ B HH Z b n/a 8 1125 1146 1170 N
+ B HH Z i n/a 8 1125 1146 1170 N
+ B IH AA b n/a 8 1107 1152 1181 N
+ B IH AA e n/a 8 1112 1152 1181 N
+ B IH AA i n/a 8 1112 1152 1181 N
+ B IH AE b n/a 8 1105 1149 1174 N
+ B IH AE e n/a 8 1112 1149 1174 N
+ B IH AE i n/a 8 1112 1149 1174 N
+ B IH AH b n/a 8 1105 1150 1176 N
+ B IH AH e n/a 8 1111 1138 1165 N
+ B IH AH i n/a 8 1111 1138 1165 N
+ B IH AO b n/a 8 1107 1151 1168 N
+ B IH AO e n/a 8 1112 1151 1168 N
+ B IH AO i n/a 8 1112 1151 1168 N
+ B IH AW b n/a 8 1105 1153 1182 N
+ B IH AW e n/a 8 1112 1153 1182 N
+ B IH AW i n/a 8 1112 1153 1182 N
+ B IH AY b n/a 8 1107 1152 1180 N
+ B IH AY e n/a 8 1112 1152 1180 N
+ B IH B e n/a 8 1111 1140 1170 N
+ B IH CH e n/a 8 1111 1140 1170 N
+ B IH D b n/a 8 1105 1149 1170 N
+ B IH D e n/a 8 1111 1140 1170 N
+ B IH D i n/a 8 1111 1140 1170 N
+ B IH DH e n/a 8 1111 1140 1170 N
+ B IH EH b n/a 8 1105 1149 1173 N
+ B IH EH e n/a 8 1111 1138 1163 N
+ B IH EH i n/a 8 1111 1138 1163 N
+ B IH ER b n/a 8 1107 1142 1179 N
+ B IH ER e n/a 8 1111 1141 1172 N
+ B IH ER i n/a 8 1111 1141 1172 N
+ B IH EY b n/a 8 1105 1149 1173 N
+ B IH EY e n/a 8 1111 1149 1163 N
+ B IH EY i n/a 8 1111 1149 1163 N
+ B IH F e n/a 8 1111 1140 1169 N
+ B IH G e n/a 8 1111 1140 1170 N
+ B IH G i n/a 8 1111 1140 1170 N
+ B IH HH e n/a 8 1111 1140 1169 N
+ B IH IH b n/a 8 1104 1156 1183 N
+ B IH IH e n/a 8 1111 1156 1183 N
+ B IH IH i n/a 8 1111 1156 1183 N
+ B IH IY b n/a 8 1104 1158 1187 N
+ B IH IY e n/a 8 1111 1158 1187 N
+ B IH IY i n/a 8 1111 1158 1187 N
+ B IH JH e n/a 8 1111 1140 1170 N
+ B IH JH i n/a 8 1111 1140 1170 N
+ B IH K e n/a 8 1111 1140 1169 N
+ B IH K i n/a 8 1111 1140 1169 N
+ B IH L b n/a 8 1107 1137 1165 N
+ B IH L e n/a 8 1111 1136 1164 N
+ B IH L i n/a 8 1111 1136 1164 N
+ B IH M b n/a 8 1105 1149 1170 N
+ B IH M e n/a 8 1111 1140 1170 N
+ B IH M i n/a 8 1111 1140 1170 N
+ B IH N b n/a 8 1105 1149 1170 N
+ B IH N e n/a 8 1111 1140 1170 N
+ B IH N i n/a 8 1111 1140 1170 N
+ B IH NG e n/a 8 1111 1140 1170 N
+ B IH OW b n/a 8 1107 1152 1178 N
+ B IH OW e n/a 8 1111 1152 1162 N
+ B IH OW i n/a 8 1111 1152 1162 N
+ B IH OY b n/a 8 1107 1151 1168 N
+ B IH OY e n/a 8 1112 1151 1168 N
+ B IH OY i n/a 8 1112 1151 1168 N
+ B IH P b n/a 8 1105 1149 1169 N
+ B IH P e n/a 8 1111 1140 1169 N
+ B IH R b n/a 8 1107 1142 1171 N
+ B IH R e n/a 8 1111 1141 1171 N
+ B IH R i n/a 8 1111 1141 1171 N
+ B IH S e n/a 8 1111 1140 1170 N
+ B IH S i n/a 8 1111 1140 1170 N
+ B IH SH e n/a 8 1111 1140 1170 N
+ B IH SH i n/a 8 1111 1140 1170 N
+ B IH SIL e n/a 8 1111 1140 1169 N
+ B IH T b n/a 8 1105 1149 1169 N
+ B IH T e n/a 8 1111 1140 1169 N
+ B IH TH e n/a 8 1111 1140 1169 N
+ B IH UH b n/a 8 1107 1157 1185 N
+ B IH UH e n/a 8 1111 1157 1185 N
+ B IH UH i n/a 8 1111 1157 1185 N
+ B IH UW b n/a 8 1107 1157 1185 N
+ B IH UW e n/a 8 1111 1157 1185 N
+ B IH UW i n/a 8 1111 1157 1185 N
+ B IH V e n/a 8 1111 1140 1170 N
+ B IH W b n/a 8 1107 1137 1165 N
+ B IH W e n/a 8 1111 1136 1164 N
+ B IH W i n/a 8 1111 1136 1164 N
+ B IH Y b n/a 8 1105 1158 1187 N
+ B IH Y e n/a 8 1111 1158 1187 N
+ B IH Y i n/a 8 1111 1158 1187 N
+ B IH Z b n/a 8 1105 1149 1170 N
+ B IH Z e n/a 8 1111 1140 1170 N
+ B IH Z i n/a 8 1111 1140 1170 N
+ B IH ZH e n/a 8 1111 1140 1170 N
+ B IY AA b n/a 8 1120 1154 1181 N
+ B IY AA e n/a 8 1120 1153 1180 N
+ B IY AA i n/a 8 1120 1153 1180 N
+ B IY AE b n/a 8 1120 1149 1174 N
+ B IY AE e n/a 8 1120 1149 1174 N
+ B IY AE i n/a 8 1120 1149 1174 N
+ B IY AH b n/a 8 1116 1150 1176 N
+ B IY AH e n/a 8 1120 1138 1168 N
+ B IY AH i n/a 8 1120 1138 1168 N
+ B IY AO b n/a 8 1120 1151 1168 N
+ B IY AO e n/a 8 1120 1151 1168 N
+ B IY AO i n/a 8 1120 1151 1168 N
+ B IY AW b n/a 8 1120 1153 1182 N
+ B IY AW e n/a 8 1120 1153 1182 N
+ B IY AW i n/a 8 1120 1153 1182 N
+ B IY AY b n/a 8 1120 1154 1180 N
+ B IY AY e n/a 8 1120 1153 1180 N
+ B IY AY i n/a 8 1120 1153 1180 N
+ B IY B e n/a 8 1120 1140 1170 N
+ B IY CH e n/a 8 1120 1140 1170 N
+ B IY D b n/a 8 1120 1149 1170 N
+ B IY D e n/a 8 1120 1140 1170 N
+ B IY D i n/a 8 1120 1140 1170 N
+ B IY DH e n/a 8 1120 1140 1170 N
+ B IY EH b n/a 8 1120 1149 1173 N
+ B IY EH e n/a 8 1120 1138 1163 N
+ B IY EH i n/a 8 1120 1138 1163 N
+ B IY ER b n/a 8 1117 1142 1179 N
+ B IY ER e n/a 8 1120 1141 1172 N
+ B IY ER i n/a 8 1120 1141 1172 N
+ B IY EY b n/a 8 1120 1149 1173 N
+ B IY EY e n/a 8 1120 1149 1163 N
+ B IY EY i n/a 8 1120 1149 1163 N
+ B IY F e n/a 8 1120 1140 1169 N
+ B IY G e n/a 8 1120 1140 1170 N
+ B IY HH e n/a 8 1120 1140 1169 N
+ B IY HH i n/a 8 1120 1140 1169 N
+ B IY IH b n/a 8 1120 1156 1183 N
+ B IY IH e n/a 8 1120 1156 1183 N
+ B IY IH i n/a 8 1120 1156 1183 N
+ B IY IY b n/a 8 1120 1158 1187 N
+ B IY IY e n/a 8 1120 1158 1187 N
+ B IY IY i n/a 8 1120 1158 1187 N
+ B IY JH e n/a 8 1120 1140 1170 N
+ B IY K e n/a 8 1120 1140 1169 N
+ B IY K i n/a 8 1120 1140 1169 N
+ B IY L b n/a 8 1120 1137 1165 N
+ B IY L e n/a 8 1120 1136 1164 N
+ B IY L i n/a 8 1120 1136 1164 N
+ B IY M b n/a 8 1120 1149 1170 N
+ B IY M e n/a 8 1120 1140 1170 N
+ B IY M i n/a 8 1120 1140 1170 N
+ B IY N b n/a 8 1120 1149 1170 N
+ B IY N e n/a 8 1120 1140 1170 N
+ B IY N i n/a 8 1120 1140 1170 N
+ B IY NG e n/a 8 1120 1140 1170 N
+ B IY OW b n/a 8 1120 1152 1178 N
+ B IY OW e n/a 8 1120 1152 1162 N
+ B IY OW i n/a 8 1120 1152 1162 N
+ B IY OY b n/a 8 1120 1151 1168 N
+ B IY OY e n/a 8 1120 1151 1168 N
+ B IY OY i n/a 8 1120 1151 1168 N
+ B IY P b n/a 8 1120 1149 1169 N
+ B IY P e n/a 8 1120 1140 1169 N
+ B IY R b n/a 8 1120 1142 1171 N
+ B IY R e n/a 8 1120 1141 1171 N
+ B IY R i n/a 8 1120 1141 1171 N
+ B IY S e n/a 8 1120 1140 1170 N
+ B IY SH e n/a 8 1120 1140 1170 N
+ B IY SIL e n/a 8 1120 1140 1169 N
+ B IY T b n/a 8 1120 1149 1169 N
+ B IY T e n/a 8 1120 1140 1169 N
+ B IY TH e n/a 8 1120 1140 1169 N
+ B IY UH b n/a 8 1120 1157 1185 N
+ B IY UH e n/a 8 1120 1157 1185 N
+ B IY UH i n/a 8 1120 1157 1185 N
+ B IY UW b n/a 8 1120 1157 1185 N
+ B IY UW e n/a 8 1120 1157 1185 N
+ B IY UW i n/a 8 1120 1157 1185 N
+ B IY V e n/a 8 1120 1140 1170 N
+ B IY W b n/a 8 1120 1137 1165 N
+ B IY W e n/a 8 1120 1136 1164 N
+ B IY Y b n/a 8 1120 1158 1187 N
+ B IY Y e n/a 8 1120 1158 1187 N
+ B IY Y i n/a 8 1120 1158 1187 N
+ B IY Z b n/a 8 1120 1149 1170 N
+ B IY Z e n/a 8 1120 1140 1170 N
+ B IY Z i n/a 8 1120 1140 1170 N
+ B IY ZH e n/a 8 1120 1140 1170 N
+ B JH AA b n/a 8 1125 1152 1181 N
+ B JH AE b n/a 8 1125 1149 1174 N
+ B JH AH b n/a 8 1123 1150 1176 N
+ B JH AO b n/a 8 1125 1151 1168 N
+ B JH AO i n/a 8 1125 1151 1168 N
+ B JH AW b n/a 8 1125 1153 1182 N
+ B JH AY b n/a 8 1125 1152 1180 N
+ B JH D b n/a 8 1125 1149 1170 N
+ B JH EH b n/a 8 1125 1149 1173 N
+ B JH ER b n/a 8 1125 1142 1179 N
+ B JH ER i n/a 8 1125 1141 1172 N
+ B JH EY b n/a 8 1125 1149 1173 N
+ B JH IH b n/a 8 1125 1155 1183 N
+ B JH IY b n/a 8 1125 1158 1187 N
+ B JH IY i n/a 8 1125 1158 1187 N
+ B JH L b n/a 8 1125 1137 1165 N
+ B JH M b n/a 8 1125 1149 1170 N
+ B JH N b n/a 8 1125 1149 1170 N
+ B JH OW b n/a 8 1125 1152 1178 N
+ B JH OY b n/a 8 1125 1151 1168 N
+ B JH P b n/a 8 1125 1149 1169 N
+ B JH R b n/a 8 1125 1142 1171 N
+ B JH R i n/a 8 1125 1141 1171 N
+ B JH T b n/a 8 1125 1149 1169 N
+ B JH UH b n/a 8 1125 1157 1185 N
+ B JH UW b n/a 8 1125 1157 1185 N
+ B JH W b n/a 8 1125 1137 1165 N
+ B JH Y b n/a 8 1125 1158 1187 N
+ B JH Z b n/a 8 1125 1149 1170 N
+ B K AA b n/a 8 1127 1144 1181 N
+ B K AA i n/a 8 1127 1144 1181 N
+ B K AE b n/a 8 1127 1146 1174 N
+ B K AE i n/a 8 1127 1146 1174 N
+ B K AH b n/a 8 1123 1147 1176 N
+ B K AH i n/a 8 1123 1147 1162 N
+ B K AO b n/a 8 1127 1147 1168 N
+ B K AO i n/a 8 1127 1147 1168 N
+ B K AW b n/a 8 1127 1146 1182 N
+ B K AW i n/a 8 1127 1146 1182 N
+ B K AY b n/a 8 1127 1144 1180 N
+ B K AY i n/a 8 1127 1144 1180 N
+ B K D b n/a 8 1127 1146 1170 N
+ B K EH b n/a 8 1127 1146 1173 N
+ B K EH i n/a 8 1127 1146 1163 N
+ B K ER b n/a 8 1127 1148 1179 N
+ B K ER i n/a 8 1127 1148 1172 N
+ B K EY b n/a 8 1127 1146 1173 N
+ B K EY i n/a 8 1127 1146 1163 N
+ B K IH b n/a 8 1127 1160 1184 N
+ B K IH i n/a 8 1127 1160 1184 N
+ B K IY b n/a 8 1127 1161 1186 N
+ B K IY i n/a 8 1127 1161 1186 N
+ B K L b n/a 8 1127 1147 1165 N
+ B K L i n/a 8 1127 1147 1164 N
+ B K M b n/a 8 1127 1146 1170 N
+ B K N b n/a 8 1127 1146 1170 N
+ B K OW b n/a 8 1127 1147 1178 N
+ B K OW i n/a 8 1127 1147 1162 N
+ B K OY b n/a 8 1127 1147 1168 N
+ B K P b n/a 8 1127 1146 1169 N
+ B K R b n/a 8 1127 1148 1171 N
+ B K R i n/a 8 1127 1148 1171 N
+ B K T b n/a 8 1127 1146 1169 N
+ B K UH b n/a 8 1127 1160 1185 N
+ B K UH i n/a 8 1127 1160 1185 N
+ B K UW b n/a 8 1127 1160 1185 N
+ B K UW i n/a 8 1127 1160 1185 N
+ B K W b n/a 8 1127 1147 1165 N
+ B K Y b n/a 8 1127 1161 1186 N
+ B K Z b n/a 8 1127 1146 1170 N
+ B K Z i n/a 8 1127 1146 1170 N
+ B L AA b n/a 8 1106 1152 1181 N
+ B L AA e n/a 8 1112 1152 1181 N
+ B L AA i n/a 8 1112 1152 1181 N
+ B L AE b n/a 8 1106 1149 1174 N
+ B L AE e n/a 8 1112 1149 1174 N
+ B L AE i n/a 8 1112 1149 1174 N
+ B L AH b n/a 8 1116 1150 1176 N
+ B L AH e n/a 8 1110 1138 1162 N
+ B L AH i n/a 8 1110 1138 1162 N
+ B L AO b n/a 8 1106 1151 1168 N
+ B L AO e n/a 8 1112 1151 1168 N
+ B L AO i n/a 8 1112 1151 1168 N
+ B L AW b n/a 8 1106 1153 1182 N
+ B L AW e n/a 8 1112 1153 1182 N
+ B L AW i n/a 8 1112 1153 1182 N
+ B L AY b n/a 8 1106 1152 1180 N
+ B L AY e n/a 8 1112 1152 1180 N
+ B L AY i n/a 8 1112 1152 1180 N
+ B L B e n/a 8 1110 1140 1170 N
+ B L CH e n/a 8 1110 1140 1170 N
+ B L D b n/a 8 1106 1149 1170 N
+ B L D e n/a 8 1110 1140 1170 N
+ B L DH e n/a 8 1110 1140 1170 N
+ B L EH b n/a 8 1106 1149 1173 N
+ B L EH e n/a 8 1110 1138 1163 N
+ B L EH i n/a 8 1110 1138 1163 N
+ B L ER b n/a 8 1117 1142 1179 N
+ B L ER e n/a 8 1110 1141 1172 N
+ B L ER i n/a 8 1110 1141 1172 N
+ B L EY b n/a 8 1106 1149 1173 N
+ B L EY e n/a 8 1110 1149 1163 N
+ B L EY i n/a 8 1110 1149 1163 N
+ B L F e n/a 8 1110 1140 1169 N
+ B L F i n/a 8 1110 1140 1169 N
+ B L G e n/a 8 1110 1140 1170 N
+ B L HH e n/a 8 1110 1140 1169 N
+ B L IH b n/a 8 1117 1156 1183 N
+ B L IH e n/a 8 1110 1156 1183 N
+ B L IH i n/a 8 1110 1156 1183 N
+ B L IY b n/a 8 1106 1159 1187 N
+ B L IY e n/a 8 1110 1159 1187 N
+ B L IY i n/a 8 1110 1159 1187 N
+ B L JH e n/a 8 1110 1140 1170 N
+ B L K e n/a 8 1110 1140 1169 N
+ B L L b n/a 8 1106 1137 1165 N
+ B L L e n/a 8 1110 1138 1164 N
+ B L L i n/a 8 1110 1138 1164 N
+ B L M b n/a 8 1106 1149 1170 N
+ B L M e n/a 8 1110 1140 1170 N
+ B L N b n/a 8 1106 1149 1170 N
+ B L N e n/a 8 1110 1140 1170 N
+ B L NG e n/a 8 1110 1140 1170 N
+ B L OW b n/a 8 1106 1152 1178 N
+ B L OW e n/a 8 1110 1152 1162 N
+ B L OW i n/a 8 1110 1152 1162 N
+ B L OY b n/a 8 1106 1151 1168 N
+ B L OY e n/a 8 1112 1151 1168 N
+ B L OY i n/a 8 1112 1151 1168 N
+ B L P b n/a 8 1106 1149 1169 N
+ B L P e n/a 8 1110 1140 1169 N
+ B L R b n/a 8 1106 1142 1171 N
+ B L R e n/a 8 1110 1141 1171 N
+ B L R i n/a 8 1110 1141 1171 N
+ B L S e n/a 8 1110 1140 1170 N
+ B L S i n/a 8 1110 1140 1170 N
+ B L SH e n/a 8 1110 1140 1170 N
+ B L SIL e n/a 8 1110 1140 1169 N
+ B L T b n/a 8 1106 1149 1169 N
+ B L T e n/a 8 1110 1140 1169 N
+ B L TH e n/a 8 1110 1140 1169 N
+ B L UH b n/a 8 1106 1157 1185 N
+ B L UH e n/a 8 1110 1157 1185 N
+ B L UH i n/a 8 1110 1157 1185 N
+ B L UW b n/a 8 1106 1157 1185 N
+ B L UW e n/a 8 1110 1157 1185 N
+ B L UW i n/a 8 1110 1157 1185 N
+ B L V e n/a 8 1110 1140 1170 N
+ B L V i n/a 8 1110 1140 1170 N
+ B L W b n/a 8 1106 1137 1165 N
+ B L W e n/a 8 1110 1138 1164 N
+ B L W i n/a 8 1110 1138 1164 N
+ B L Y b n/a 8 1106 1159 1187 N
+ B L Y e n/a 8 1110 1159 1187 N
+ B L Y i n/a 8 1110 1159 1187 N
+ B L Z b n/a 8 1106 1149 1170 N
+ B L Z e n/a 8 1110 1140 1170 N
+ B L Z i n/a 8 1110 1140 1170 N
+ B L ZH e n/a 8 1110 1140 1170 N
+ B M AA b n/a 8 1130 1154 1181 N
+ B M AA e n/a 8 1130 1154 1181 N
+ B M AA i n/a 8 1130 1154 1181 N
+ B M AE b n/a 8 1130 1149 1174 N
+ B M AE e n/a 8 1130 1149 1174 N
+ B M AE i n/a 8 1130 1149 1174 N
+ B M AH b n/a 8 1123 1150 1176 N
+ B M AH e n/a 8 1123 1138 1162 N
+ B M AH i n/a 8 1129 1138 1162 N
+ B M AO b n/a 8 1130 1151 1168 N
+ B M AO e n/a 8 1130 1151 1168 N
+ B M AO i n/a 8 1130 1151 1168 N
+ B M AW b n/a 8 1130 1153 1182 N
+ B M AW e n/a 8 1130 1153 1182 N
+ B M AW i n/a 8 1130 1153 1182 N
+ B M AY b n/a 8 1130 1154 1180 N
+ B M AY e n/a 8 1130 1154 1180 N
+ B M AY i n/a 8 1130 1154 1180 N
+ B M B e n/a 8 1130 1140 1170 N
+ B M CH e n/a 8 1130 1140 1170 N
+ B M D b n/a 8 1130 1149 1170 N
+ B M D e n/a 8 1130 1140 1170 N
+ B M D i n/a 8 1130 1140 1170 N
+ B M DH e n/a 8 1130 1140 1170 N
+ B M EH b n/a 8 1130 1149 1173 N
+ B M EH e n/a 8 1130 1138 1163 N
+ B M EH i n/a 8 1130 1138 1163 N
+ B M ER b n/a 8 1124 1143 1179 N
+ B M ER e n/a 8 1124 1143 1172 N
+ B M ER i n/a 8 1129 1143 1172 N
+ B M EY b n/a 8 1130 1149 1173 N
+ B M EY e n/a 8 1130 1149 1163 N
+ B M EY i n/a 8 1130 1149 1163 N
+ B M F e n/a 8 1130 1140 1169 N
+ B M G e n/a 8 1130 1140 1170 N
+ B M HH e n/a 8 1130 1140 1169 N
+ B M IH b n/a 8 1131 1156 1183 N
+ B M IH e n/a 8 1131 1156 1183 N
+ B M IH i n/a 8 1131 1156 1183 N
+ B M IY b n/a 8 1131 1158 1187 N
+ B M IY e n/a 8 1131 1158 1187 N
+ B M IY i n/a 8 1131 1158 1187 N
+ B M JH e n/a 8 1130 1140 1170 N
+ B M K e n/a 8 1130 1140 1169 N
+ B M K i n/a 8 1130 1140 1169 N
+ B M L b n/a 8 1130 1137 1165 N
+ B M L e n/a 8 1130 1138 1164 N
+ B M L i n/a 8 1129 1138 1164 N
+ B M M b n/a 8 1130 1149 1170 N
+ B M M e n/a 8 1130 1140 1170 N
+ B M N b n/a 8 1130 1149 1170 N
+ B M N e n/a 8 1130 1140 1170 N
+ B M NG e n/a 8 1130 1140 1170 N
+ B M OW b n/a 8 1130 1152 1178 N
+ B M OW e n/a 8 1130 1152 1162 N
+ B M OW i n/a 8 1130 1152 1162 N
+ B M OY b n/a 8 1130 1151 1168 N
+ B M OY e n/a 8 1130 1151 1168 N
+ B M OY i n/a 8 1130 1151 1168 N
+ B M P b n/a 8 1130 1149 1169 N
+ B M P e n/a 8 1130 1140 1169 N
+ B M R b n/a 8 1130 1143 1171 N
+ B M R e n/a 8 1130 1143 1171 N
+ B M R i n/a 8 1129 1143 1171 N
+ B M S e n/a 8 1130 1140 1170 N
+ B M S i n/a 8 1130 1140 1170 N
+ B M SH e n/a 8 1130 1140 1170 N
+ B M SIL e n/a 8 1130 1140 1169 N
+ B M T b n/a 8 1130 1149 1169 N
+ B M T e n/a 8 1130 1140 1169 N
+ B M TH e n/a 8 1130 1140 1169 N
+ B M UH b n/a 8 1131 1157 1185 N
+ B M UH e n/a 8 1131 1157 1185 N
+ B M UH i n/a 8 1131 1157 1185 N
+ B M UW b n/a 8 1131 1157 1185 N
+ B M UW e n/a 8 1131 1157 1185 N
+ B M UW i n/a 8 1131 1157 1185 N
+ B M V e n/a 8 1130 1140 1170 N
+ B M W b n/a 8 1130 1137 1165 N
+ B M W e n/a 8 1130 1138 1164 N
+ B M W i n/a 8 1130 1138 1164 N
+ B M Y b n/a 8 1131 1158 1187 N
+ B M Y e n/a 8 1131 1158 1187 N
+ B M Y i n/a 8 1131 1158 1187 N
+ B M Z b n/a 8 1130 1149 1170 N
+ B M Z e n/a 8 1130 1140 1170 N
+ B M Z i n/a 8 1130 1140 1170 N
+ B M ZH e n/a 8 1130 1140 1170 N
+ B N AA b n/a 8 1130 1154 1181 N
+ B N AA e n/a 8 1130 1154 1181 N
+ B N AA i n/a 8 1130 1154 1181 N
+ B N AE b n/a 8 1130 1149 1174 N
+ B N AE e n/a 8 1130 1149 1174 N
+ B N AE i n/a 8 1130 1149 1174 N
+ B N AH b n/a 8 1123 1150 1176 N
+ B N AH e n/a 8 1123 1138 1162 N
+ B N AH i n/a 8 1129 1138 1162 N
+ B N AO b n/a 8 1130 1151 1168 N
+ B N AO e n/a 8 1130 1151 1168 N
+ B N AO i n/a 8 1130 1151 1168 N
+ B N AW b n/a 8 1130 1153 1182 N
+ B N AW e n/a 8 1130 1153 1182 N
+ B N AW i n/a 8 1130 1153 1182 N
+ B N AY b n/a 8 1130 1154 1180 N
+ B N AY e n/a 8 1130 1154 1180 N
+ B N AY i n/a 8 1130 1154 1180 N
+ B N B e n/a 8 1130 1140 1170 N
+ B N CH e n/a 8 1130 1140 1170 N
+ B N D b n/a 8 1130 1149 1170 N
+ B N D e n/a 8 1130 1140 1170 N
+ B N DH e n/a 8 1130 1140 1170 N
+ B N EH b n/a 8 1130 1149 1173 N
+ B N EH e n/a 8 1130 1138 1163 N
+ B N EH i n/a 8 1130 1138 1163 N
+ B N ER b n/a 8 1124 1142 1179 N
+ B N ER e n/a 8 1124 1141 1172 N
+ B N ER i n/a 8 1129 1141 1172 N
+ B N EY b n/a 8 1130 1149 1173 N
+ B N EY e n/a 8 1130 1149 1163 N
+ B N EY i n/a 8 1130 1149 1163 N
+ B N F e n/a 8 1130 1140 1169 N
+ B N G e n/a 8 1130 1140 1170 N
+ B N HH e n/a 8 1130 1140 1169 N
+ B N IH b n/a 8 1131 1156 1183 N
+ B N IH e n/a 8 1131 1156 1183 N
+ B N IH i n/a 8 1131 1156 1183 N
+ B N IY b n/a 8 1131 1159 1187 N
+ B N IY e n/a 8 1131 1159 1187 N
+ B N IY i n/a 8 1131 1159 1187 N
+ B N JH e n/a 8 1130 1140 1170 N
+ B N K e n/a 8 1130 1140 1169 N
+ B N L b n/a 8 1130 1137 1165 N
+ B N L e n/a 8 1130 1138 1164 N
+ B N L i n/a 8 1129 1138 1164 N
+ B N M b n/a 8 1130 1149 1170 N
+ B N M e n/a 8 1130 1140 1170 N
+ B N N b n/a 8 1130 1149 1170 N
+ B N N e n/a 8 1130 1140 1170 N
+ B N NG e n/a 8 1130 1140 1170 N
+ B N OW b n/a 8 1130 1152 1178 N
+ B N OW e n/a 8 1130 1152 1162 N
+ B N OW i n/a 8 1130 1152 1162 N
+ B N OY b n/a 8 1130 1151 1168 N
+ B N OY e n/a 8 1130 1151 1168 N
+ B N OY i n/a 8 1130 1151 1168 N
+ B N P b n/a 8 1130 1149 1169 N
+ B N P e n/a 8 1130 1140 1169 N
+ B N R b n/a 8 1130 1142 1171 N
+ B N R e n/a 8 1130 1141 1171 N
+ B N R i n/a 8 1129 1141 1171 N
+ B N S e n/a 8 1130 1140 1170 N
+ B N SH e n/a 8 1130 1140 1170 N
+ B N SIL e n/a 8 1130 1140 1169 N
+ B N T b n/a 8 1130 1149 1169 N
+ B N T e n/a 8 1130 1140 1169 N
+ B N TH e n/a 8 1130 1140 1169 N
+ B N UH b n/a 8 1131 1157 1185 N
+ B N UH e n/a 8 1131 1157 1185 N
+ B N UH i n/a 8 1131 1157 1185 N
+ B N UW b n/a 8 1131 1157 1185 N
+ B N UW e n/a 8 1131 1157 1185 N
+ B N UW i n/a 8 1131 1157 1185 N
+ B N V e n/a 8 1130 1140 1170 N
+ B N W b n/a 8 1130 1137 1165 N
+ B N W e n/a 8 1130 1138 1164 N
+ B N Y b n/a 8 1131 1159 1187 N
+ B N Y e n/a 8 1131 1159 1187 N
+ B N Y i n/a 8 1131 1159 1187 N
+ B N Z b n/a 8 1130 1149 1170 N
+ B N Z e n/a 8 1130 1140 1170 N
+ B N ZH e n/a 8 1130 1140 1170 N
+ B NG AA b n/a 8 1130 1154 1181 N
+ B NG AE b n/a 8 1130 1149 1174 N
+ B NG AE i n/a 8 1130 1149 1174 N
+ B NG AH b n/a 8 1123 1150 1176 N
+ B NG AH i n/a 8 1129 1138 1162 N
+ B NG AO b n/a 8 1130 1151 1168 N
+ B NG AO i n/a 8 1130 1151 1168 N
+ B NG AW b n/a 8 1130 1153 1182 N
+ B NG AY b n/a 8 1130 1154 1180 N
+ B NG AY i n/a 8 1130 1154 1180 N
+ B NG D b n/a 8 1130 1149 1170 N
+ B NG EH b n/a 8 1130 1149 1173 N
+ B NG EH i n/a 8 1130 1138 1163 N
+ B NG ER b n/a 8 1124 1142 1179 N
+ B NG ER i n/a 8 1129 1141 1172 N
+ B NG EY b n/a 8 1130 1149 1173 N
+ B NG IH b n/a 8 1131 1156 1183 N
+ B NG IH i n/a 8 1131 1156 1183 N
+ B NG IY b n/a 8 1131 1158 1187 N
+ B NG IY i n/a 8 1131 1158 1187 N
+ B NG L b n/a 8 1130 1137 1165 N
+ B NG L i n/a 8 1129 1138 1164 N
+ B NG M b n/a 8 1130 1149 1170 N
+ B NG N b n/a 8 1130 1149 1170 N
+ B NG OW b n/a 8 1130 1152 1178 N
+ B NG OW i n/a 8 1130 1152 1162 N
+ B NG OY b n/a 8 1130 1151 1168 N
+ B NG P b n/a 8 1130 1149 1169 N
+ B NG R b n/a 8 1130 1142 1171 N
+ B NG R i n/a 8 1129 1141 1171 N
+ B NG T b n/a 8 1130 1149 1169 N
+ B NG UH b n/a 8 1131 1157 1185 N
+ B NG UH i n/a 8 1131 1157 1185 N
+ B NG UW b n/a 8 1131 1157 1185 N
+ B NG W b n/a 8 1130 1137 1165 N
+ B NG Y b n/a 8 1131 1158 1187 N
+ B NG Y i n/a 8 1131 1158 1187 N
+ B NG Z b n/a 8 1130 1149 1170 N
+ B OW AA b n/a 8 1106 1152 1181 N
+ B OW AA e n/a 8 1112 1152 1181 N
+ B OW AA i n/a 8 1112 1152 1181 N
+ B OW AE b n/a 8 1106 1149 1174 N
+ B OW AE e n/a 8 1112 1149 1174 N
+ B OW AE i n/a 8 1112 1149 1174 N
+ B OW AH b n/a 8 1116 1150 1176 N
+ B OW AH e n/a 8 1109 1136 1162 N
+ B OW AH i n/a 8 1109 1136 1162 N
+ B OW AO b n/a 8 1106 1151 1168 N
+ B OW AO e n/a 8 1112 1151 1168 N
+ B OW AO i n/a 8 1112 1151 1168 N
+ B OW AW b n/a 8 1106 1153 1182 N
+ B OW AW e n/a 8 1112 1153 1182 N
+ B OW AW i n/a 8 1112 1153 1182 N
+ B OW AY b n/a 8 1106 1152 1180 N
+ B OW AY e n/a 8 1112 1152 1180 N
+ B OW AY i n/a 8 1112 1152 1180 N
+ B OW B e n/a 8 1110 1140 1170 N
+ B OW CH e n/a 8 1110 1140 1170 N
+ B OW D b n/a 8 1106 1149 1170 N
+ B OW D e n/a 8 1110 1140 1170 N
+ B OW D i n/a 8 1110 1140 1170 N
+ B OW DH e n/a 8 1110 1140 1170 N
+ B OW EH b n/a 8 1106 1149 1173 N
+ B OW EH e n/a 8 1110 1138 1163 N
+ B OW EH i n/a 8 1110 1138 1163 N
+ B OW ER b n/a 8 1117 1142 1179 N
+ B OW ER e n/a 8 1109 1141 1172 N
+ B OW ER i n/a 8 1109 1141 1172 N
+ B OW EY b n/a 8 1106 1149 1173 N
+ B OW EY e n/a 8 1110 1149 1163 N
+ B OW EY i n/a 8 1110 1149 1163 N
+ B OW F e n/a 8 1110 1140 1169 N
+ B OW G e n/a 8 1110 1140 1170 N
+ B OW HH e n/a 8 1110 1140 1169 N
+ B OW IH b n/a 8 1117 1156 1183 N
+ B OW IH e n/a 8 1109 1156 1183 N
+ B OW IH i n/a 8 1109 1156 1183 N
+ B OW IY b n/a 8 1106 1158 1187 N
+ B OW IY e n/a 8 1110 1158 1187 N
+ B OW IY i n/a 8 1110 1158 1187 N
+ B OW JH e n/a 8 1110 1140 1170 N
+ B OW K e n/a 8 1110 1140 1169 N
+ B OW K i n/a 8 1110 1140 1169 N
+ B OW L b n/a 8 1106 1137 1165 N
+ B OW L e n/a 8 1110 1136 1164 N
+ B OW L i n/a 8 1110 1136 1164 N
+ B OW M b n/a 8 1106 1149 1170 N
+ B OW M e n/a 8 1110 1140 1170 N
+ B OW N b n/a 8 1106 1149 1170 N
+ B OW N e n/a 8 1110 1140 1170 N
+ B OW N i n/a 8 1110 1140 1170 N
+ B OW NG e n/a 8 1110 1140 1170 N
+ B OW OW b n/a 8 1106 1152 1178 N
+ B OW OW e n/a 8 1110 1152 1162 N
+ B OW OW i n/a 8 1110 1152 1162 N
+ B OW OY b n/a 8 1106 1151 1168 N
+ B OW OY e n/a 8 1112 1151 1168 N
+ B OW OY i n/a 8 1112 1151 1168 N
+ B OW P b n/a 8 1106 1149 1169 N
+ B OW P e n/a 8 1110 1140 1169 N
+ B OW R b n/a 8 1106 1142 1171 N
+ B OW R e n/a 8 1110 1141 1171 N
+ B OW R i n/a 8 1110 1141 1171 N
+ B OW S e n/a 8 1110 1140 1170 N
+ B OW SH e n/a 8 1110 1140 1170 N
+ B OW SIL e n/a 8 1110 1140 1169 N
+ B OW T b n/a 8 1106 1149 1169 N
+ B OW T e n/a 8 1110 1140 1169 N
+ B OW T i n/a 8 1110 1140 1169 N
+ B OW TH e n/a 8 1110 1140 1169 N
+ B OW UH b n/a 8 1106 1157 1185 N
+ B OW UH e n/a 8 1110 1157 1185 N
+ B OW UH i n/a 8 1110 1157 1185 N
+ B OW UW b n/a 8 1106 1157 1185 N
+ B OW UW e n/a 8 1110 1157 1185 N
+ B OW UW i n/a 8 1110 1157 1185 N
+ B OW V e n/a 8 1110 1140 1170 N
+ B OW W b n/a 8 1106 1137 1165 N
+ B OW W e n/a 8 1110 1136 1164 N
+ B OW W i n/a 8 1110 1136 1164 N
+ B OW Y b n/a 8 1106 1158 1187 N
+ B OW Y e n/a 8 1110 1158 1187 N
+ B OW Y i n/a 8 1110 1158 1187 N
+ B OW Z b n/a 8 1106 1149 1170 N
+ B OW Z e n/a 8 1110 1140 1170 N
+ B OW Z i n/a 8 1110 1140 1170 N
+ B OW ZH e n/a 8 1110 1140 1170 N
+ B OY AA b n/a 8 1121 1152 1181 N
+ B OY AE b n/a 8 1121 1149 1174 N
+ B OY AH b n/a 8 1121 1150 1176 N
+ B OY AH i n/a 8 1118 1136 1167 N
+ B OY AO b n/a 8 1121 1151 1168 N
+ B OY AW b n/a 8 1121 1153 1182 N
+ B OY AY b n/a 8 1121 1152 1180 N
+ B OY D b n/a 8 1121 1149 1170 N
+ B OY EH b n/a 8 1121 1149 1173 N
+ B OY ER b n/a 8 1121 1142 1179 N
+ B OY ER i n/a 8 1118 1141 1172 N
+ B OY EY b n/a 8 1121 1149 1173 N
+ B OY IH b n/a 8 1121 1156 1183 N
+ B OY IH i n/a 8 1118 1156 1183 N
+ B OY IY b n/a 8 1121 1158 1187 N
+ B OY IY i n/a 8 1118 1158 1187 N
+ B OY L b n/a 8 1121 1137 1165 N
+ B OY L i n/a 8 1118 1136 1164 N
+ B OY M b n/a 8 1121 1149 1170 N
+ B OY N b n/a 8 1121 1149 1170 N
+ B OY N i n/a 8 1118 1140 1170 N
+ B OY OW b n/a 8 1121 1152 1178 N
+ B OY OY b n/a 8 1121 1151 1168 N
+ B OY P b n/a 8 1121 1149 1169 N
+ B OY R b n/a 8 1121 1142 1171 N
+ B OY T b n/a 8 1121 1149 1169 N
+ B OY UH b n/a 8 1121 1157 1185 N
+ B OY UW b n/a 8 1121 1157 1185 N
+ B OY W b n/a 8 1121 1137 1165 N
+ B OY Y b n/a 8 1121 1158 1187 N
+ B OY Z b n/a 8 1121 1149 1170 N
+ B P AA b n/a 8 1127 1144 1181 N
+ B P AA i n/a 8 1127 1144 1181 N
+ B P AE b n/a 8 1127 1146 1174 N
+ B P AE i n/a 8 1127 1146 1174 N
+ B P AH b n/a 8 1123 1147 1176 N
+ B P AH i n/a 8 1123 1147 1162 N
+ B P AO b n/a 8 1127 1147 1168 N
+ B P AO i n/a 8 1127 1147 1168 N
+ B P AW b n/a 8 1127 1146 1182 N
+ B P AW i n/a 8 1127 1146 1182 N
+ B P AY b n/a 8 1127 1144 1180 N
+ B P D b n/a 8 1127 1146 1170 N
+ B P EH b n/a 8 1127 1146 1173 N
+ B P ER b n/a 8 1127 1148 1179 N
+ B P ER i n/a 8 1127 1148 1172 N
+ B P EY b n/a 8 1127 1146 1173 N
+ B P IH b n/a 8 1127 1160 1184 N
+ B P IH i n/a 8 1127 1160 1184 N
+ B P IY b n/a 8 1127 1161 1186 N
+ B P IY i n/a 8 1127 1161 1186 N
+ B P L b n/a 8 1127 1147 1165 N
+ B P L i n/a 8 1127 1147 1164 N
+ B P M b n/a 8 1127 1146 1170 N
+ B P N b n/a 8 1127 1146 1170 N
+ B P OW b n/a 8 1127 1147 1178 N
+ B P OW i n/a 8 1127 1147 1162 N
+ B P OY b n/a 8 1127 1147 1168 N
+ B P OY i n/a 8 1127 1147 1168 N
+ B P P b n/a 8 1127 1146 1169 N
+ B P R b n/a 8 1127 1148 1171 N
+ B P R i n/a 8 1127 1148 1171 N
+ B P T b n/a 8 1127 1146 1169 N
+ B P UH b n/a 8 1127 1160 1185 N
+ B P UH i n/a 8 1127 1160 1185 N
+ B P UW b n/a 8 1127 1160 1185 N
+ B P W b n/a 8 1127 1147 1165 N
+ B P Y b n/a 8 1127 1161 1186 N
+ B P Z b n/a 8 1127 1146 1170 N
+ B P Z i n/a 8 1127 1146 1170 N
+ B R AA b n/a 8 1108 1152 1181 N
+ B R AA e n/a 8 1113 1152 1181 N
+ B R AA i n/a 8 1113 1152 1181 N
+ B R AE b n/a 8 1108 1149 1174 N
+ B R AE e n/a 8 1113 1149 1174 N
+ B R AE i n/a 8 1113 1149 1174 N
+ B R AH b n/a 8 1116 1150 1176 N
+ B R AH e n/a 8 1113 1138 1163 N
+ B R AH i n/a 8 1113 1138 1163 N
+ B R AO b n/a 8 1108 1151 1168 N
+ B R AO e n/a 8 1113 1151 1168 N
+ B R AO i n/a 8 1113 1151 1168 N
+ B R AW b n/a 8 1108 1153 1182 N
+ B R AW e n/a 8 1113 1153 1182 N
+ B R AW i n/a 8 1113 1153 1182 N
+ B R AY b n/a 8 1108 1152 1180 N
+ B R AY e n/a 8 1113 1152 1180 N
+ B R AY i n/a 8 1113 1152 1180 N
+ B R B e n/a 8 1113 1140 1170 N
+ B R CH e n/a 8 1113 1140 1170 N
+ B R D b n/a 8 1108 1149 1170 N
+ B R D e n/a 8 1113 1140 1170 N
+ B R D i n/a 8 1113 1140 1170 N
+ B R DH e n/a 8 1113 1140 1170 N
+ B R EH b n/a 8 1108 1149 1173 N
+ B R EH e n/a 8 1113 1138 1163 N
+ B R EH i n/a 8 1113 1138 1163 N
+ B R ER b n/a 8 1117 1142 1179 N
+ B R ER e n/a 8 1113 1141 1172 N
+ B R ER i n/a 8 1113 1141 1172 N
+ B R EY b n/a 8 1108 1149 1173 N
+ B R EY e n/a 8 1113 1149 1163 N
+ B R EY i n/a 8 1113 1149 1163 N
+ B R F e n/a 8 1113 1140 1169 N
+ B R G e n/a 8 1113 1140 1170 N
+ B R HH e n/a 8 1113 1140 1169 N
+ B R IH b n/a 8 1117 1156 1183 N
+ B R IH e n/a 8 1113 1156 1183 N
+ B R IH i n/a 8 1113 1156 1183 N
+ B R IY b n/a 8 1108 1158 1187 N
+ B R IY e n/a 8 1113 1158 1187 N
+ B R IY i n/a 8 1113 1158 1187 N
+ B R JH e n/a 8 1113 1140 1170 N
+ B R JH i n/a 8 1113 1140 1170 N
+ B R K e n/a 8 1113 1140 1169 N
+ B R L b n/a 8 1108 1137 1165 N
+ B R L e n/a 8 1113 1138 1164 N
+ B R L i n/a 8 1113 1138 1164 N
+ B R M b n/a 8 1108 1149 1170 N
+ B R M e n/a 8 1113 1140 1170 N
+ B R M i n/a 8 1113 1140 1170 N
+ B R N b n/a 8 1108 1149 1170 N
+ B R N e n/a 8 1113 1140 1170 N
+ B R N i n/a 8 1113 1140 1170 N
+ B R NG e n/a 8 1113 1140 1170 N
+ B R OW b n/a 8 1108 1152 1178 N
+ B R OW e n/a 8 1113 1152 1162 N
+ B R OW i n/a 8 1113 1152 1162 N
+ B R OY b n/a 8 1108 1151 1168 N
+ B R OY e n/a 8 1113 1151 1168 N
+ B R OY i n/a 8 1113 1151 1168 N
+ B R P b n/a 8 1108 1149 1169 N
+ B R P e n/a 8 1113 1140 1169 N
+ B R R b n/a 8 1108 1142 1171 N
+ B R R e n/a 8 1113 1141 1171 N
+ B R R i n/a 8 1113 1141 1171 N
+ B R S e n/a 8 1113 1140 1170 N
+ B R SH e n/a 8 1113 1140 1170 N
+ B R SIL e n/a 8 1113 1140 1169 N
+ B R T b n/a 8 1108 1149 1169 N
+ B R T e n/a 8 1113 1140 1169 N
+ B R TH e n/a 8 1113 1140 1169 N
+ B R UH b n/a 8 1108 1157 1185 N
+ B R UH e n/a 8 1113 1157 1185 N
+ B R UH i n/a 8 1113 1157 1185 N
+ B R UW b n/a 8 1108 1157 1185 N
+ B R UW e n/a 8 1113 1157 1185 N
+ B R UW i n/a 8 1113 1157 1185 N
+ B R V e n/a 8 1113 1140 1170 N
+ B R W b n/a 8 1108 1137 1165 N
+ B R W e n/a 8 1113 1138 1164 N
+ B R Y b n/a 8 1108 1158 1187 N
+ B R Y e n/a 8 1113 1158 1187 N
+ B R Y i n/a 8 1113 1158 1187 N
+ B R Z b n/a 8 1108 1149 1170 N
+ B R Z e n/a 8 1113 1140 1170 N
+ B R Z i n/a 8 1113 1140 1170 N
+ B R ZH e n/a 8 1113 1140 1170 N
+ B S AA b n/a 8 1125 1144 1181 N
+ B S AA e n/a 8 1125 1144 1181 N
+ B S AA i n/a 8 1125 1144 1181 N
+ B S AE b n/a 8 1125 1146 1174 N
+ B S AE e n/a 8 1125 1146 1174 N
+ B S AE i n/a 8 1125 1146 1174 N
+ B S AH b n/a 8 1123 1147 1176 N
+ B S AH e n/a 8 1123 1147 1163 N
+ B S AH i n/a 8 1123 1147 1163 N
+ B S AO b n/a 8 1125 1147 1168 N
+ B S AO e n/a 8 1125 1147 1168 N
+ B S AO i n/a 8 1125 1147 1168 N
+ B S AW b n/a 8 1125 1146 1182 N
+ B S AW e n/a 8 1125 1146 1182 N
+ B S AW i n/a 8 1125 1146 1182 N
+ B S AY b n/a 8 1125 1144 1180 N
+ B S AY e n/a 8 1125 1144 1180 N
+ B S AY i n/a 8 1125 1144 1180 N
+ B S B e n/a 8 1125 1146 1170 N
+ B S CH e n/a 8 1125 1146 1170 N
+ B S D b n/a 8 1125 1146 1170 N
+ B S D e n/a 8 1125 1146 1170 N
+ B S DH e n/a 8 1125 1146 1170 N
+ B S EH b n/a 8 1125 1146 1173 N
+ B S EH e n/a 8 1125 1146 1163 N
+ B S EH i n/a 8 1125 1146 1163 N
+ B S ER b n/a 8 1125 1148 1179 N
+ B S ER e n/a 8 1125 1148 1172 N
+ B S ER i n/a 8 1125 1148 1172 N
+ B S EY b n/a 8 1125 1146 1173 N
+ B S EY e n/a 8 1125 1146 1163 N
+ B S F e n/a 8 1125 1146 1169 N
+ B S G e n/a 8 1125 1146 1170 N
+ B S HH e n/a 8 1125 1146 1169 N
+ B S IH b n/a 8 1125 1160 1184 N
+ B S IH e n/a 8 1125 1160 1184 N
+ B S IH i n/a 8 1125 1160 1184 N
+ B S IY b n/a 8 1125 1161 1186 N
+ B S IY e n/a 8 1125 1161 1186 N
+ B S IY i n/a 8 1125 1161 1186 N
+ B S JH e n/a 8 1125 1146 1170 N
+ B S K e n/a 8 1125 1146 1169 N
+ B S L b n/a 8 1125 1147 1165 N
+ B S L e n/a 8 1125 1147 1164 N
+ B S L i n/a 8 1125 1147 1164 N
+ B S M b n/a 8 1125 1146 1170 N
+ B S M e n/a 8 1125 1146 1170 N
+ B S N b n/a 8 1125 1146 1170 N
+ B S N e n/a 8 1125 1146 1170 N
+ B S NG e n/a 8 1125 1146 1170 N
+ B S OW b n/a 8 1125 1147 1178 N
+ B S OW e n/a 8 1125 1147 1162 N
+ B S OW i n/a 8 1125 1147 1162 N
+ B S OY b n/a 8 1125 1147 1168 N
+ B S OY e n/a 8 1125 1147 1168 N
+ B S OY i n/a 8 1125 1147 1168 N
+ B S P b n/a 8 1125 1146 1169 N
+ B S P e n/a 8 1125 1146 1169 N
+ B S R b n/a 8 1125 1148 1171 N
+ B S R e n/a 8 1125 1148 1171 N
+ B S R i n/a 8 1125 1148 1171 N
+ B S S e n/a 8 1125 1146 1170 N
+ B S SH e n/a 8 1125 1146 1170 N
+ B S SIL e n/a 8 1125 1146 1169 N
+ B S T b n/a 8 1125 1146 1169 N
+ B S T e n/a 8 1125 1146 1169 N
+ B S TH e n/a 8 1125 1146 1169 N
+ B S UH b n/a 8 1125 1160 1185 N
+ B S UH e n/a 8 1125 1160 1185 N
+ B S UH i n/a 8 1125 1160 1185 N
+ B S UW b n/a 8 1125 1160 1185 N
+ B S UW e n/a 8 1125 1160 1185 N
+ B S UW i n/a 8 1125 1160 1185 N
+ B S V e n/a 8 1125 1146 1170 N
+ B S W b n/a 8 1125 1147 1165 N
+ B S W e n/a 8 1125 1147 1164 N
+ B S Y b n/a 8 1125 1161 1186 N
+ B S Y e n/a 8 1125 1161 1186 N
+ B S Z b n/a 8 1125 1146 1170 N
+ B S Z e n/a 8 1125 1146 1170 N
+ B S ZH e n/a 8 1125 1146 1170 N
+ B SH AA b n/a 8 1125 1144 1181 N
+ B SH AA i n/a 8 1125 1144 1181 N
+ B SH AE b n/a 8 1125 1146 1174 N
+ B SH AE i n/a 8 1125 1146 1174 N
+ B SH AH b n/a 8 1123 1147 1176 N
+ B SH AH i n/a 8 1123 1147 1162 N
+ B SH AO b n/a 8 1125 1147 1168 N
+ B SH AO i n/a 8 1125 1147 1168 N
+ B SH AW b n/a 8 1125 1146 1182 N
+ B SH AW i n/a 8 1125 1146 1182 N
+ B SH AY b n/a 8 1125 1144 1180 N
+ B SH AY i n/a 8 1125 1144 1180 N
+ B SH D b n/a 8 1125 1146 1170 N
+ B SH EH b n/a 8 1125 1146 1173 N
+ B SH EH i n/a 8 1125 1146 1163 N
+ B SH ER b n/a 8 1125 1148 1179 N
+ B SH ER i n/a 8 1125 1148 1172 N
+ B SH EY b n/a 8 1125 1146 1173 N
+ B SH EY i n/a 8 1125 1146 1163 N
+ B SH IH b n/a 8 1125 1160 1184 N
+ B SH IY b n/a 8 1125 1161 1186 N
+ B SH IY i n/a 8 1125 1161 1186 N
+ B SH L b n/a 8 1125 1147 1165 N
+ B SH M b n/a 8 1125 1146 1170 N
+ B SH N b n/a 8 1125 1146 1170 N
+ B SH OW b n/a 8 1125 1147 1178 N
+ B SH OW i n/a 8 1125 1147 1162 N
+ B SH OY b n/a 8 1125 1147 1168 N
+ B SH P b n/a 8 1125 1146 1169 N
+ B SH R b n/a 8 1125 1148 1171 N
+ B SH R i n/a 8 1125 1148 1171 N
+ B SH T b n/a 8 1125 1146 1169 N
+ B SH UH b n/a 8 1125 1160 1185 N
+ B SH UW b n/a 8 1125 1160 1185 N
+ B SH W b n/a 8 1125 1147 1165 N
+ B SH Y b n/a 8 1125 1161 1186 N
+ B SH Z b n/a 8 1125 1146 1170 N
+ B SIL AA b n/a 8 1133 1144 1181 N
+ B SIL AE b n/a 8 1134 1146 1174 N
+ B SIL AH b n/a 8 1133 1145 1177 N
+ B SIL AO b n/a 8 1133 1147 1168 N
+ B SIL AW b n/a 8 1134 1146 1182 N
+ B SIL AY b n/a 8 1133 1144 1180 N
+ B SIL D b n/a 8 1134 1146 1170 N
+ B SIL EH b n/a 8 1134 1146 1173 N
+ B SIL ER b n/a 8 1134 1148 1179 N
+ B SIL EY b n/a 8 1134 1146 1173 N
+ B SIL IH b n/a 8 1134 1160 1184 N
+ B SIL IY b n/a 8 1134 1161 1186 N
+ B SIL L b n/a 8 1134 1147 1165 N
+ B SIL M b n/a 8 1134 1146 1170 N
+ B SIL N b n/a 8 1134 1146 1170 N
+ B SIL OW b n/a 8 1133 1147 1178 N
+ B SIL OY b n/a 8 1133 1147 1168 N
+ B SIL P b n/a 8 1134 1146 1169 N
+ B SIL R b n/a 8 1134 1148 1171 N
+ B SIL T b n/a 8 1134 1146 1169 N
+ B SIL UH b n/a 8 1134 1160 1185 N
+ B SIL UW b n/a 8 1134 1160 1185 N
+ B SIL W b n/a 8 1134 1147 1165 N
+ B SIL Y b n/a 8 1134 1161 1186 N
+ B SIL Z b n/a 8 1134 1146 1170 N
+ B T AA b n/a 8 1127 1144 1181 N
+ B T AA i n/a 8 1127 1144 1181 N
+ B T AE b n/a 8 1127 1146 1174 N
+ B T AE i n/a 8 1127 1146 1174 N
+ B T AH b n/a 8 1123 1147 1176 N
+ B T AH i n/a 8 1123 1147 1162 N
+ B T AO b n/a 8 1127 1147 1168 N
+ B T AO i n/a 8 1127 1147 1168 N
+ B T AW b n/a 8 1127 1146 1182 N
+ B T AW i n/a 8 1127 1146 1182 N
+ B T AY b n/a 8 1127 1144 1180 N
+ B T AY i n/a 8 1127 1144 1180 N
+ B T D b n/a 8 1127 1146 1170 N
+ B T D i n/a 8 1127 1146 1170 N
+ B T EH b n/a 8 1127 1146 1173 N
+ B T EH i n/a 8 1127 1146 1163 N
+ B T ER b n/a 8 1127 1148 1179 N
+ B T ER i n/a 8 1127 1148 1172 N
+ B T EY b n/a 8 1127 1146 1173 N
+ B T EY i n/a 8 1127 1146 1163 N
+ B T IH b n/a 8 1127 1160 1184 N
+ B T IH i n/a 8 1127 1160 1184 N
+ B T IY b n/a 8 1126 1161 1186 N
+ B T IY i n/a 8 1126 1161 1186 N
+ B T L b n/a 8 1127 1147 1165 N
+ B T L i n/a 8 1127 1147 1164 N
+ B T M b n/a 8 1127 1146 1170 N
+ B T N b n/a 8 1127 1146 1170 N
+ B T OW b n/a 8 1127 1147 1178 N
+ B T OW i n/a 8 1127 1147 1162 N
+ B T OY b n/a 8 1127 1147 1168 N
+ B T OY i n/a 8 1127 1147 1168 N
+ B T P b n/a 8 1127 1146 1169 N
+ B T R b n/a 8 1127 1148 1171 N
+ B T R i n/a 8 1127 1148 1171 N
+ B T T b n/a 8 1127 1146 1169 N
+ B T UH b n/a 8 1127 1160 1185 N
+ B T UH i n/a 8 1127 1160 1185 N
+ B T UW b n/a 8 1126 1160 1185 N
+ B T W b n/a 8 1127 1147 1165 N
+ B T Y b n/a 8 1127 1161 1186 N
+ B T Y i n/a 8 1127 1161 1186 N
+ B T Z b n/a 8 1127 1146 1170 N
+ B TH AA b n/a 8 1125 1144 1181 N
+ B TH AA i n/a 8 1125 1144 1181 N
+ B TH AE b n/a 8 1125 1146 1174 N
+ B TH AH b n/a 8 1123 1147 1176 N
+ B TH AH i n/a 8 1123 1147 1162 N
+ B TH AO b n/a 8 1125 1147 1168 N
+ B TH AO i n/a 8 1125 1147 1168 N
+ B TH AW b n/a 8 1125 1146 1182 N
+ B TH AW i n/a 8 1125 1146 1182 N
+ B TH AY b n/a 8 1125 1144 1180 N
+ B TH D b n/a 8 1125 1146 1170 N
+ B TH EH b n/a 8 1125 1146 1173 N
+ B TH EH i n/a 8 1125 1146 1163 N
+ B TH ER b n/a 8 1125 1148 1179 N
+ B TH ER i n/a 8 1125 1148 1172 N
+ B TH EY b n/a 8 1125 1146 1173 N
+ B TH IH b n/a 8 1125 1160 1184 N
+ B TH IH i n/a 8 1125 1160 1184 N
+ B TH IY b n/a 8 1125 1161 1186 N
+ B TH IY i n/a 8 1125 1161 1186 N
+ B TH L b n/a 8 1125 1147 1165 N
+ B TH L i n/a 8 1125 1147 1164 N
+ B TH M b n/a 8 1125 1146 1170 N
+ B TH N b n/a 8 1125 1146 1170 N
+ B TH OW b n/a 8 1125 1147 1178 N
+ B TH OW i n/a 8 1125 1147 1162 N
+ B TH OY b n/a 8 1125 1147 1168 N
+ B TH P b n/a 8 1125 1146 1169 N
+ B TH R b n/a 8 1125 1148 1171 N
+ B TH R i n/a 8 1125 1148 1171 N
+ B TH T b n/a 8 1125 1146 1169 N
+ B TH UH b n/a 8 1125 1160 1185 N
+ B TH UW b n/a 8 1125 1160 1185 N
+ B TH W b n/a 8 1125 1147 1165 N
+ B TH Y b n/a 8 1125 1161 1186 N
+ B TH Z b n/a 8 1125 1146 1170 N
+ B UH AA b n/a 8 1106 1152 1181 N
+ B UH AE b n/a 8 1106 1149 1174 N
+ B UH AH b n/a 8 1106 1150 1176 N
+ B UH AH i n/a 8 1109 1138 1165 N
+ B UH AO b n/a 8 1106 1151 1168 N
+ B UH AW b n/a 8 1106 1153 1182 N
+ B UH AY b n/a 8 1106 1152 1180 N
+ B UH D b n/a 8 1106 1149 1170 N
+ B UH EH b n/a 8 1106 1149 1173 N
+ B UH ER b n/a 8 1106 1142 1179 N
+ B UH ER i n/a 8 1109 1141 1172 N
+ B UH EY b n/a 8 1106 1149 1173 N
+ B UH IH b n/a 8 1106 1156 1183 N
+ B UH IH i n/a 8 1109 1156 1183 N
+ B UH IY b n/a 8 1106 1158 1187 N
+ B UH K i n/a 8 1110 1140 1169 N
+ B UH L b n/a 8 1106 1137 1165 N
+ B UH L i n/a 8 1110 1136 1164 N
+ B UH M b n/a 8 1106 1149 1170 N
+ B UH N b n/a 8 1106 1149 1170 N
+ B UH OW b n/a 8 1106 1152 1178 N
+ B UH OY b n/a 8 1106 1151 1168 N
+ B UH P b n/a 8 1106 1149 1169 N
+ B UH R b n/a 8 1106 1142 1171 N
+ B UH SH i n/a 8 1110 1140 1170 N
+ B UH T b n/a 8 1106 1149 1169 N
+ B UH UH b n/a 8 1106 1157 1185 N
+ B UH UW b n/a 8 1106 1157 1185 N
+ B UH W b n/a 8 1106 1137 1165 N
+ B UH Y b n/a 8 1106 1158 1187 N
+ B UH Z b n/a 8 1106 1149 1170 N
+ B UW AA b n/a 8 1106 1154 1181 N
+ B UW AA e n/a 8 1112 1153 1181 N
+ B UW AA i n/a 8 1112 1153 1181 N
+ B UW AE b n/a 8 1106 1149 1174 N
+ B UW AE e n/a 8 1112 1149 1174 N
+ B UW AE i n/a 8 1112 1149 1174 N
+ B UW AH b n/a 8 1116 1150 1176 N
+ B UW AH e n/a 8 1110 1138 1162 N
+ B UW AH i n/a 8 1110 1138 1162 N
+ B UW AO b n/a 8 1106 1151 1168 N
+ B UW AO e n/a 8 1112 1151 1168 N
+ B UW AO i n/a 8 1112 1151 1168 N
+ B UW AW b n/a 8 1106 1153 1182 N
+ B UW AW e n/a 8 1112 1153 1182 N
+ B UW AW i n/a 8 1112 1153 1182 N
+ B UW AY b n/a 8 1106 1154 1180 N
+ B UW AY e n/a 8 1112 1153 1180 N
+ B UW AY i n/a 8 1112 1153 1180 N
+ B UW B e n/a 8 1110 1140 1170 N
+ B UW CH e n/a 8 1110 1140 1170 N
+ B UW CH i n/a 8 1110 1140 1170 N
+ B UW D b n/a 8 1106 1149 1170 N
+ B UW D e n/a 8 1110 1140 1170 N
+ B UW D i n/a 8 1110 1140 1170 N
+ B UW DH e n/a 8 1110 1140 1170 N
+ B UW EH b n/a 8 1106 1149 1173 N
+ B UW EH e n/a 8 1110 1138 1163 N
+ B UW EH i n/a 8 1110 1138 1163 N
+ B UW ER b n/a 8 1117 1142 1179 N
+ B UW ER e n/a 8 1110 1141 1172 N
+ B UW ER i n/a 8 1110 1141 1172 N
+ B UW EY b n/a 8 1106 1149 1173 N
+ B UW EY e n/a 8 1110 1149 1163 N
+ B UW EY i n/a 8 1110 1149 1163 N
+ B UW F e n/a 8 1110 1140 1169 N
+ B UW G e n/a 8 1110 1140 1170 N
+ B UW HH e n/a 8 1110 1140 1169 N
+ B UW IH b n/a 8 1117 1156 1183 N
+ B UW IH e n/a 8 1110 1156 1183 N
+ B UW IH i n/a 8 1110 1156 1183 N
+ B UW IY b n/a 8 1106 1158 1187 N
+ B UW IY e n/a 8 1110 1158 1187 N
+ B UW IY i n/a 8 1110 1158 1187 N
+ B UW JH e n/a 8 1110 1140 1170 N
+ B UW JH i n/a 8 1110 1140 1170 N
+ B UW K e n/a 8 1110 1140 1169 N
+ B UW K i n/a 8 1110 1140 1169 N
+ B UW L b n/a 8 1106 1137 1165 N
+ B UW L e n/a 8 1110 1136 1164 N
+ B UW L i n/a 8 1110 1136 1164 N
+ B UW M b n/a 8 1106 1149 1170 N
+ B UW M e n/a 8 1110 1140 1170 N
+ B UW N b n/a 8 1106 1149 1170 N
+ B UW N e n/a 8 1110 1140 1170 N
+ B UW N i n/a 8 1110 1140 1170 N
+ B UW NG e n/a 8 1110 1140 1170 N
+ B UW OW b n/a 8 1106 1152 1178 N
+ B UW OW e n/a 8 1110 1152 1162 N
+ B UW OW i n/a 8 1110 1152 1162 N
+ B UW OY b n/a 8 1106 1151 1168 N
+ B UW OY e n/a 8 1112 1151 1168 N
+ B UW OY i n/a 8 1112 1151 1168 N
+ B UW P b n/a 8 1106 1149 1169 N
+ B UW P e n/a 8 1110 1140 1169 N
+ B UW R b n/a 8 1106 1142 1171 N
+ B UW R e n/a 8 1110 1141 1171 N
+ B UW R i n/a 8 1110 1141 1171 N
+ B UW S e n/a 8 1110 1140 1170 N
+ B UW SH e n/a 8 1110 1140 1170 N
+ B UW SIL e n/a 8 1110 1140 1169 N
+ B UW T b n/a 8 1106 1149 1169 N
+ B UW T e n/a 8 1110 1140 1169 N
+ B UW TH e n/a 8 1110 1140 1169 N
+ B UW UH b n/a 8 1106 1157 1185 N
+ B UW UH e n/a 8 1110 1157 1185 N
+ B UW UH i n/a 8 1110 1157 1185 N
+ B UW UW b n/a 8 1106 1157 1185 N
+ B UW UW e n/a 8 1110 1157 1185 N
+ B UW UW i n/a 8 1110 1157 1185 N
+ B UW V e n/a 8 1110 1140 1170 N
+ B UW W b n/a 8 1106 1137 1165 N
+ B UW W e n/a 8 1110 1136 1164 N
+ B UW W i n/a 8 1110 1136 1164 N
+ B UW Y b n/a 8 1106 1158 1187 N
+ B UW Y e n/a 8 1110 1158 1187 N
+ B UW Y i n/a 8 1110 1158 1187 N
+ B UW Z b n/a 8 1106 1149 1170 N
+ B UW Z e n/a 8 1110 1140 1170 N
+ B UW Z i n/a 8 1110 1140 1170 N
+ B UW ZH e n/a 8 1110 1140 1170 N
+ B V AA b n/a 8 1124 1152 1181 N
+ B V AE b n/a 8 1124 1149 1174 N
+ B V AE i n/a 8 1124 1149 1174 N
+ B V AH b n/a 8 1122 1150 1175 N
+ B V AO b n/a 8 1124 1151 1168 N
+ B V AO i n/a 8 1124 1151 1168 N
+ B V AW b n/a 8 1124 1153 1182 N
+ B V AY b n/a 8 1124 1152 1180 N
+ B V AY i n/a 8 1124 1152 1180 N
+ B V D b n/a 8 1124 1149 1170 N
+ B V EH b n/a 8 1124 1149 1173 N
+ B V EH i n/a 8 1124 1138 1163 N
+ B V ER b n/a 8 1124 1142 1179 N
+ B V EY b n/a 8 1124 1149 1173 N
+ B V IH b n/a 8 1124 1155 1183 N
+ B V IH i n/a 8 1124 1155 1183 N
+ B V IY b n/a 8 1124 1159 1186 N
+ B V IY i n/a 8 1124 1159 1187 N
+ B V L b n/a 8 1124 1137 1165 N
+ B V M b n/a 8 1124 1149 1170 N
+ B V N b n/a 8 1124 1149 1170 N
+ B V OW b n/a 8 1124 1152 1178 N
+ B V OY b n/a 8 1124 1151 1168 N
+ B V P b n/a 8 1124 1149 1169 N
+ B V R b n/a 8 1124 1142 1171 N
+ B V T b n/a 8 1124 1149 1169 N
+ B V UH b n/a 8 1124 1157 1185 N
+ B V UW b n/a 8 1124 1157 1185 N
+ B V W b n/a 8 1124 1137 1165 N
+ B V Y b n/a 8 1124 1159 1187 N
+ B V Z b n/a 8 1124 1149 1170 N
+ B W AA b n/a 8 1106 1152 1181 N
+ B W AA e n/a 8 1112 1152 1181 N
+ B W AE b n/a 8 1106 1149 1174 N
+ B W AE e n/a 8 1112 1149 1174 N
+ B W AH b n/a 8 1116 1150 1176 N
+ B W AH e n/a 8 1110 1138 1162 N
+ B W AO b n/a 8 1106 1151 1168 N
+ B W AO e n/a 8 1112 1151 1168 N
+ B W AW b n/a 8 1106 1153 1182 N
+ B W AW e n/a 8 1112 1153 1182 N
+ B W AY b n/a 8 1106 1152 1180 N
+ B W AY e n/a 8 1112 1152 1180 N
+ B W B e n/a 8 1110 1140 1170 N
+ B W CH e n/a 8 1110 1140 1170 N
+ B W D b n/a 8 1106 1149 1170 N
+ B W D e n/a 8 1110 1140 1170 N
+ B W DH e n/a 8 1110 1140 1170 N
+ B W EH b n/a 8 1106 1149 1173 N
+ B W EH e n/a 8 1110 1138 1163 N
+ B W ER b n/a 8 1117 1142 1179 N
+ B W ER e n/a 8 1110 1141 1172 N
+ B W EY b n/a 8 1106 1149 1173 N
+ B W EY e n/a 8 1110 1149 1163 N
+ B W F e n/a 8 1110 1140 1169 N
+ B W G e n/a 8 1110 1140 1170 N
+ B W HH e n/a 8 1110 1140 1169 N
+ B W IH b n/a 8 1117 1156 1183 N
+ B W IH e n/a 8 1110 1156 1183 N
+ B W IY b n/a 8 1106 1159 1187 N
+ B W IY e n/a 8 1110 1159 1187 N
+ B W IY i n/a 8 1110 1159 1187 N
+ B W JH e n/a 8 1110 1140 1170 N
+ B W K e n/a 8 1110 1140 1169 N
+ B W L b n/a 8 1106 1137 1165 N
+ B W L e n/a 8 1110 1138 1164 N
+ B W M b n/a 8 1106 1149 1170 N
+ B W M e n/a 8 1110 1140 1170 N
+ B W N b n/a 8 1106 1149 1170 N
+ B W N e n/a 8 1110 1140 1170 N
+ B W NG e n/a 8 1110 1140 1170 N
+ B W OW b n/a 8 1106 1152 1178 N
+ B W OW e n/a 8 1110 1152 1162 N
+ B W OY b n/a 8 1106 1151 1168 N
+ B W OY e n/a 8 1112 1151 1168 N
+ B W P b n/a 8 1106 1149 1169 N
+ B W P e n/a 8 1110 1140 1169 N
+ B W R b n/a 8 1106 1142 1171 N
+ B W R e n/a 8 1110 1141 1171 N
+ B W S e n/a 8 1110 1140 1170 N
+ B W SH e n/a 8 1110 1140 1170 N
+ B W SIL e n/a 8 1110 1140 1169 N
+ B W T b n/a 8 1106 1149 1169 N
+ B W T e n/a 8 1110 1140 1169 N
+ B W TH e n/a 8 1110 1140 1169 N
+ B W UH b n/a 8 1106 1157 1185 N
+ B W UH e n/a 8 1110 1157 1185 N
+ B W UW b n/a 8 1106 1157 1185 N
+ B W UW e n/a 8 1110 1157 1185 N
+ B W V e n/a 8 1110 1140 1170 N
+ B W W b n/a 8 1106 1137 1165 N
+ B W W e n/a 8 1110 1138 1164 N
+ B W Y b n/a 8 1106 1159 1187 N
+ B W Y e n/a 8 1110 1159 1187 N
+ B W Z b n/a 8 1106 1149 1170 N
+ B W Z e n/a 8 1110 1140 1170 N
+ B W ZH e n/a 8 1110 1140 1170 N
+ B Y AA b n/a 8 1120 1152 1181 N
+ B Y AE b n/a 8 1120 1149 1174 N
+ B Y AH b n/a 8 1116 1150 1176 N
+ B Y AO b n/a 8 1120 1151 1168 N
+ B Y AW b n/a 8 1120 1153 1182 N
+ B Y AY b n/a 8 1120 1152 1180 N
+ B Y D b n/a 8 1120 1149 1170 N
+ B Y EH b n/a 8 1120 1149 1173 N
+ B Y ER b n/a 8 1117 1142 1179 N
+ B Y EY b n/a 8 1120 1149 1173 N
+ B Y IH b n/a 8 1120 1156 1183 N
+ B Y IY b n/a 8 1120 1158 1187 N
+ B Y L b n/a 8 1120 1137 1165 N
+ B Y M b n/a 8 1120 1149 1170 N
+ B Y N b n/a 8 1120 1149 1170 N
+ B Y OW b n/a 8 1120 1152 1178 N
+ B Y OY b n/a 8 1120 1151 1168 N
+ B Y P b n/a 8 1120 1149 1169 N
+ B Y R b n/a 8 1120 1142 1171 N
+ B Y T b n/a 8 1120 1149 1169 N
+ B Y UH b n/a 8 1120 1157 1185 N
+ B Y UW b n/a 8 1120 1157 1185 N
+ B Y W b n/a 8 1120 1137 1165 N
+ B Y Y b n/a 8 1120 1158 1187 N
+ B Y Z b n/a 8 1120 1149 1170 N
+ B Z AA b n/a 8 1125 1152 1181 N
+ B Z AA i n/a 8 1125 1152 1181 N
+ B Z AE b n/a 8 1125 1149 1174 N
+ B Z AE i n/a 8 1125 1149 1174 N
+ B Z AH b n/a 8 1123 1150 1176 N
+ B Z AH i n/a 8 1122 1137 1163 N
+ B Z AO b n/a 8 1125 1151 1168 N
+ B Z AO i n/a 8 1125 1151 1168 N
+ B Z AW b n/a 8 1125 1153 1182 N
+ B Z AY b n/a 8 1125 1152 1180 N
+ B Z AY i n/a 8 1125 1152 1180 N
+ B Z D b n/a 8 1125 1149 1170 N
+ B Z EH b n/a 8 1125 1149 1173 N
+ B Z EH i n/a 8 1125 1137 1163 N
+ B Z ER b n/a 8 1125 1142 1179 N
+ B Z ER i n/a 8 1125 1141 1172 N
+ B Z EY b n/a 8 1125 1149 1173 N
+ B Z EY i n/a 8 1125 1149 1163 N
+ B Z IH b n/a 8 1125 1155 1183 N
+ B Z IH i n/a 8 1125 1155 1183 N
+ B Z IY b n/a 8 1125 1159 1186 N
+ B Z IY i n/a 8 1125 1159 1187 N
+ B Z L b n/a 8 1125 1137 1165 N
+ B Z L i n/a 8 1125 1137 1164 N
+ B Z M b n/a 8 1125 1149 1170 N
+ B Z N b n/a 8 1125 1149 1170 N
+ B Z OW b n/a 8 1125 1152 1178 N
+ B Z OW i n/a 8 1125 1152 1162 N
+ B Z OY b n/a 8 1125 1151 1168 N
+ B Z OY i n/a 8 1125 1151 1168 N
+ B Z P b n/a 8 1125 1149 1169 N
+ B Z R b n/a 8 1125 1142 1171 N
+ B Z R i n/a 8 1125 1141 1171 N
+ B Z T b n/a 8 1125 1149 1169 N
+ B Z UH b n/a 8 1125 1157 1185 N
+ B Z UH i n/a 8 1125 1157 1185 N
+ B Z UW b n/a 8 1125 1157 1185 N
+ B Z UW i n/a 8 1125 1157 1185 N
+ B Z W b n/a 8 1125 1137 1165 N
+ B Z W i n/a 8 1125 1137 1164 N
+ B Z Y b n/a 8 1125 1159 1187 N
+ B Z Z b n/a 8 1125 1149 1170 N
+ B ZH AA b n/a 8 1125 1152 1181 N
+ B ZH AE b n/a 8 1125 1149 1174 N
+ B ZH AH b n/a 8 1123 1150 1176 N
+ B ZH AO b n/a 8 1125 1151 1168 N
+ B ZH AW b n/a 8 1125 1153 1182 N
+ B ZH AY b n/a 8 1125 1152 1180 N
+ B ZH D b n/a 8 1125 1149 1170 N
+ B ZH EH b n/a 8 1125 1149 1173 N
+ B ZH ER b n/a 8 1125 1142 1179 N
+ B ZH EY b n/a 8 1125 1149 1173 N
+ B ZH IH b n/a 8 1125 1155 1183 N
+ B ZH IY b n/a 8 1125 1159 1186 N
+ B ZH L b n/a 8 1125 1137 1165 N
+ B ZH M b n/a 8 1125 1149 1170 N
+ B ZH N b n/a 8 1125 1149 1170 N
+ B ZH OW b n/a 8 1125 1152 1178 N
+ B ZH OY b n/a 8 1125 1151 1168 N
+ B ZH P b n/a 8 1125 1149 1169 N
+ B ZH R b n/a 8 1125 1142 1171 N
+ B ZH T b n/a 8 1125 1149 1169 N
+ B ZH UH b n/a 8 1125 1157 1185 N
+ B ZH UW b n/a 8 1125 1157 1185 N
+ B ZH W b n/a 8 1125 1137 1165 N
+ B ZH Y b n/a 8 1125 1159 1187 N
+ B ZH Z b n/a 8 1125 1149 1170 N
+ CH AA AA b n/a 9 1191 1203 1223 N
+ CH AA AA e n/a 9 1188 1203 1222 N
+ CH AA AA i n/a 9 1188 1203 1222 N
+ CH AA AA s n/a 9 1188 1203 1222 N
+ CH AA AE b n/a 9 1191 1198 1218 N
+ CH AA AE e n/a 9 1188 1200 1221 N
+ CH AA AE s n/a 9 1188 1200 1220 N
+ CH AA AH b n/a 9 1191 1198 1217 N
+ CH AA AH e n/a 9 1188 1200 1221 N
+ CH AA AH i n/a 9 1188 1200 1220 N
+ CH AA AH s n/a 9 1188 1200 1220 N
+ CH AA AO b n/a 9 1191 1203 1223 N
+ CH AA AO e n/a 9 1188 1203 1222 N
+ CH AA AO i n/a 9 1188 1203 1222 N
+ CH AA AO s n/a 9 1188 1203 1222 N
+ CH AA AW b n/a 9 1191 1198 1218 N
+ CH AA AW e n/a 9 1188 1200 1221 N
+ CH AA AW s n/a 9 1188 1200 1220 N
+ CH AA AY b n/a 9 1191 1203 1223 N
+ CH AA AY e n/a 9 1188 1203 1222 N
+ CH AA AY i n/a 9 1188 1203 1222 N
+ CH AA AY s n/a 9 1188 1203 1222 N
+ CH AA B e n/a 9 1188 1205 1211 N
+ CH AA B s n/a 9 1188 1205 1211 N
+ CH AA CH e n/a 9 1188 1204 1214 N
+ CH AA CH s n/a 9 1188 1204 1214 N
+ CH AA D e n/a 9 1188 1206 1215 N
+ CH AA D i n/a 9 1188 1206 1215 N
+ CH AA D s n/a 9 1188 1206 1215 N
+ CH AA DH e n/a 9 1188 1206 1215 N
+ CH AA DH s n/a 9 1188 1206 1215 N
+ CH AA EH b n/a 9 1191 1198 1218 N
+ CH AA EH e n/a 9 1188 1200 1221 N
+ CH AA EH i n/a 9 1188 1200 1220 N
+ CH AA EH s n/a 9 1188 1200 1220 N
+ CH AA ER b n/a 9 1191 1202 1224 N
+ CH AA ER e n/a 9 1188 1202 1224 N
+ CH AA ER i n/a 9 1188 1202 1224 N
+ CH AA ER s n/a 9 1188 1202 1224 N
+ CH AA EY b n/a 9 1191 1198 1218 N
+ CH AA EY e n/a 9 1188 1199 1221 N
+ CH AA EY i n/a 9 1188 1199 1220 N
+ CH AA EY s n/a 9 1188 1199 1220 N
+ CH AA F e n/a 9 1188 1205 1208 N
+ CH AA F i n/a 9 1188 1205 1208 N
+ CH AA F s n/a 9 1188 1205 1208 N
+ CH AA G e n/a 9 1188 1205 1211 N
+ CH AA G i n/a 9 1188 1205 1211 N
+ CH AA G s n/a 9 1188 1205 1211 N
+ CH AA HH e n/a 9 1188 1204 1213 N
+ CH AA HH i n/a 9 1188 1204 1213 N
+ CH AA HH s n/a 9 1188 1204 1213 N
+ CH AA IH b n/a 9 1191 1198 1220 N
+ CH AA IH e n/a 9 1188 1200 1221 N
+ CH AA IH i n/a 9 1188 1200 1220 N
+ CH AA IH s n/a 9 1188 1200 1220 N
+ CH AA IY b n/a 9 1191 1198 1219 N
+ CH AA IY e n/a 9 1188 1199 1219 N
+ CH AA IY i n/a 9 1188 1199 1219 N
+ CH AA IY s n/a 9 1188 1199 1219 N
+ CH AA JH e n/a 9 1188 1204 1214 N
+ CH AA JH s n/a 9 1188 1204 1214 N
+ CH AA K e n/a 9 1188 1205 1211 N
+ CH AA K i n/a 9 1188 1205 1211 N
+ CH AA K s n/a 9 1188 1205 1211 N
+ CH AA L b n/a 9 1191 1204 1212 N
+ CH AA L e n/a 9 1188 1204 1212 N
+ CH AA L i n/a 9 1188 1204 1212 N
+ CH AA L s n/a 9 1188 1204 1212 N
+ CH AA M e n/a 9 1188 1205 1212 N
+ CH AA M i n/a 9 1188 1205 1212 N
+ CH AA M s n/a 9 1188 1205 1212 N
+ CH AA N e n/a 9 1188 1206 1215 N
+ CH AA N i n/a 9 1188 1206 1215 N
+ CH AA N s n/a 9 1188 1206 1215 N
+ CH AA NG e n/a 9 1188 1205 1208 N
+ CH AA NG s n/a 9 1188 1205 1208 N
+ CH AA OW b n/a 9 1191 1202 1222 N
+ CH AA OW e n/a 9 1188 1202 1222 N
+ CH AA OW i n/a 9 1188 1202 1222 N
+ CH AA OW s n/a 9 1188 1202 1222 N
+ CH AA OY b n/a 9 1191 1203 1223 N
+ CH AA OY e n/a 9 1188 1203 1222 N
+ CH AA OY s n/a 9 1188 1203 1222 N
+ CH AA P e n/a 9 1188 1205 1211 N
+ CH AA P i n/a 9 1188 1205 1211 N
+ CH AA P s n/a 9 1188 1205 1211 N
+ CH AA R b n/a 9 1191 1205 1209 N
+ CH AA R e n/a 9 1188 1205 1209 N
+ CH AA R s n/a 9 1188 1205 1209 N
+ CH AA S e n/a 9 1188 1206 1214 N
+ CH AA S s n/a 9 1188 1206 1214 N
+ CH AA SH e n/a 9 1188 1204 1214 N
+ CH AA SH s n/a 9 1188 1204 1214 N
+ CH AA SIL e n/a 9 1188 1204 1210 N
+ CH AA SIL s n/a 9 1188 1204 1210 N
+ CH AA T e n/a 9 1188 1206 1216 N
+ CH AA T i n/a 9 1188 1206 1216 N
+ CH AA T s n/a 9 1188 1206 1216 N
+ CH AA TH e n/a 9 1188 1206 1215 N
+ CH AA TH s n/a 9 1188 1206 1215 N
+ CH AA UH b n/a 9 1191 1202 1224 N
+ CH AA UH e n/a 9 1188 1202 1224 N
+ CH AA UH i n/a 9 1188 1202 1224 N
+ CH AA UH s n/a 9 1188 1202 1224 N
+ CH AA UW b n/a 9 1191 1202 1225 N
+ CH AA UW e n/a 9 1188 1202 1225 N
+ CH AA UW i n/a 9 1188 1202 1225 N
+ CH AA UW s n/a 9 1188 1202 1225 N
+ CH AA V e n/a 9 1188 1205 1208 N
+ CH AA V s n/a 9 1188 1205 1208 N
+ CH AA W b n/a 9 1191 1205 1209 N
+ CH AA W e n/a 9 1188 1205 1209 N
+ CH AA W i n/a 9 1188 1205 1209 N
+ CH AA W s n/a 9 1188 1205 1209 N
+ CH AA Y b n/a 9 1191 1204 1213 N
+ CH AA Y e n/a 9 1188 1204 1213 N
+ CH AA Y s n/a 9 1188 1204 1213 N
+ CH AA Z e n/a 9 1188 1206 1215 N
+ CH AA Z s n/a 9 1188 1206 1215 N
+ CH AA ZH e n/a 9 1188 1204 1214 N
+ CH AA ZH s n/a 9 1188 1204 1214 N
+ CH AE AA b n/a 9 1191 1203 1223 N
+ CH AE AA e n/a 9 1188 1203 1222 N
+ CH AE AA i n/a 9 1188 1203 1222 N
+ CH AE AA s n/a 9 1188 1203 1222 N
+ CH AE AE b n/a 9 1191 1198 1218 N
+ CH AE AE e n/a 9 1188 1200 1221 N
+ CH AE AE s n/a 9 1188 1200 1220 N
+ CH AE AH b n/a 9 1191 1198 1217 N
+ CH AE AH e n/a 9 1188 1200 1221 N
+ CH AE AH i n/a 9 1188 1200 1220 N
+ CH AE AH s n/a 9 1188 1200 1220 N
+ CH AE AO b n/a 9 1191 1203 1223 N
+ CH AE AO e n/a 9 1188 1203 1222 N
+ CH AE AO i n/a 9 1188 1203 1222 N
+ CH AE AO s n/a 9 1188 1203 1222 N
+ CH AE AW b n/a 9 1191 1198 1218 N
+ CH AE AW e n/a 9 1188 1200 1221 N
+ CH AE AW s n/a 9 1188 1200 1220 N
+ CH AE AY b n/a 9 1191 1203 1223 N
+ CH AE AY e n/a 9 1188 1203 1222 N
+ CH AE AY i n/a 9 1188 1203 1222 N
+ CH AE AY s n/a 9 1188 1203 1222 N
+ CH AE B e n/a 9 1188 1205 1211 N
+ CH AE B i n/a 9 1188 1205 1211 N
+ CH AE B s n/a 9 1188 1205 1211 N
+ CH AE CH e n/a 9 1188 1204 1214 N
+ CH AE CH s n/a 9 1188 1204 1214 N
+ CH AE D e n/a 9 1188 1206 1215 N
+ CH AE D i n/a 9 1188 1206 1215 N
+ CH AE D s n/a 9 1188 1206 1215 N
+ CH AE DH e n/a 9 1188 1206 1215 N
+ CH AE DH s n/a 9 1188 1206 1215 N
+ CH AE EH b n/a 9 1191 1198 1218 N
+ CH AE EH e n/a 9 1188 1200 1221 N
+ CH AE EH i n/a 9 1188 1200 1220 N
+ CH AE EH s n/a 9 1188 1200 1220 N
+ CH AE ER b n/a 9 1191 1202 1224 N
+ CH AE ER e n/a 9 1188 1202 1224 N
+ CH AE ER i n/a 9 1188 1202 1224 N
+ CH AE ER s n/a 9 1188 1202 1224 N
+ CH AE EY b n/a 9 1191 1198 1218 N
+ CH AE EY e n/a 9 1188 1199 1221 N
+ CH AE EY i n/a 9 1188 1199 1220 N
+ CH AE EY s n/a 9 1188 1199 1220 N
+ CH AE F e n/a 9 1188 1205 1208 N
+ CH AE F i n/a 9 1188 1205 1208 N
+ CH AE F s n/a 9 1188 1205 1208 N
+ CH AE G e n/a 9 1188 1205 1211 N
+ CH AE G s n/a 9 1188 1205 1211 N
+ CH AE HH e n/a 9 1188 1204 1213 N
+ CH AE HH s n/a 9 1188 1204 1213 N
+ CH AE IH b n/a 9 1191 1198 1220 N
+ CH AE IH e n/a 9 1188 1200 1221 N
+ CH AE IH i n/a 9 1188 1200 1220 N
+ CH AE IH s n/a 9 1188 1200 1220 N
+ CH AE IY b n/a 9 1191 1198 1219 N
+ CH AE IY e n/a 9 1188 1199 1219 N
+ CH AE IY i n/a 9 1188 1199 1219 N
+ CH AE IY s n/a 9 1188 1199 1219 N
+ CH AE JH e n/a 9 1188 1204 1214 N
+ CH AE JH s n/a 9 1188 1204 1214 N
+ CH AE K e n/a 9 1188 1205 1211 N
+ CH AE K i n/a 9 1188 1205 1211 N
+ CH AE K s n/a 9 1188 1205 1211 N
+ CH AE L b n/a 9 1191 1204 1212 N
+ CH AE L e n/a 9 1188 1204 1212 N
+ CH AE L i n/a 9 1188 1204 1212 N
+ CH AE L s n/a 9 1188 1204 1212 N
+ CH AE M e n/a 9 1188 1205 1212 N
+ CH AE M i n/a 9 1188 1205 1212 N
+ CH AE M s n/a 9 1188 1205 1212 N
+ CH AE N e n/a 9 1188 1206 1215 N
+ CH AE N s n/a 9 1188 1206 1215 N
+ CH AE NG e n/a 9 1188 1205 1208 N
+ CH AE NG s n/a 9 1188 1205 1208 N
+ CH AE OW b n/a 9 1191 1202 1222 N
+ CH AE OW e n/a 9 1188 1202 1222 N
+ CH AE OW i n/a 9 1188 1202 1222 N
+ CH AE OW s n/a 9 1188 1202 1222 N
+ CH AE OY b n/a 9 1191 1203 1223 N
+ CH AE OY e n/a 9 1188 1203 1222 N
+ CH AE OY s n/a 9 1188 1203 1222 N
+ CH AE P e n/a 9 1188 1205 1211 N
+ CH AE P s n/a 9 1188 1205 1211 N
+ CH AE R b n/a 9 1191 1205 1209 N
+ CH AE R e n/a 9 1188 1205 1209 N
+ CH AE R i n/a 9 1188 1205 1208 N
+ CH AE R s n/a 9 1188 1205 1209 N
+ CH AE S e n/a 9 1188 1206 1214 N
+ CH AE S i n/a 9 1188 1206 1214 N
+ CH AE S s n/a 9 1188 1206 1214 N
+ CH AE SH e n/a 9 1188 1204 1214 N
+ CH AE SH s n/a 9 1188 1204 1214 N
+ CH AE SIL e n/a 9 1188 1204 1210 N
+ CH AE SIL s n/a 9 1188 1204 1210 N
+ CH AE T e n/a 9 1188 1206 1216 N
+ CH AE T i n/a 9 1188 1206 1216 N
+ CH AE T s n/a 9 1188 1206 1216 N
+ CH AE TH e n/a 9 1188 1206 1215 N
+ CH AE TH s n/a 9 1188 1206 1215 N
+ CH AE UH b n/a 9 1191 1202 1224 N
+ CH AE UH e n/a 9 1188 1202 1224 N
+ CH AE UH i n/a 9 1188 1202 1224 N
+ CH AE UH s n/a 9 1188 1202 1224 N
+ CH AE UW b n/a 9 1191 1202 1225 N
+ CH AE UW e n/a 9 1188 1202 1225 N
+ CH AE UW i n/a 9 1188 1202 1225 N
+ CH AE UW s n/a 9 1188 1202 1225 N
+ CH AE V e n/a 9 1188 1205 1208 N
+ CH AE V s n/a 9 1188 1205 1208 N
+ CH AE W b n/a 9 1191 1205 1209 N
+ CH AE W e n/a 9 1188 1205 1209 N
+ CH AE W i n/a 9 1188 1205 1209 N
+ CH AE W s n/a 9 1188 1205 1209 N
+ CH AE Y b n/a 9 1191 1204 1213 N
+ CH AE Y e n/a 9 1188 1204 1213 N
+ CH AE Y i n/a 9 1188 1204 1213 N
+ CH AE Y s n/a 9 1188 1204 1213 N
+ CH AE Z e n/a 9 1188 1206 1215 N
+ CH AE Z i n/a 9 1188 1206 1215 N
+ CH AE Z s n/a 9 1188 1206 1215 N
+ CH AE ZH e n/a 9 1188 1204 1214 N
+ CH AE ZH s n/a 9 1188 1204 1214 N
+ CH AH AA b n/a 9 1193 1203 1223 N
+ CH AH AA e n/a 9 1189 1203 1222 N
+ CH AH AA i n/a 9 1189 1203 1222 N
+ CH AH AA s n/a 9 1189 1203 1222 N
+ CH AH AE b n/a 9 1193 1198 1218 N
+ CH AH AE e n/a 9 1189 1200 1221 N
+ CH AH AE i n/a 9 1189 1200 1220 N
+ CH AH AE s n/a 9 1189 1200 1220 N
+ CH AH AH b n/a 9 1193 1198 1217 N
+ CH AH AH e n/a 9 1189 1200 1221 N
+ CH AH AH i n/a 9 1189 1200 1220 N
+ CH AH AH s n/a 9 1189 1200 1220 N
+ CH AH AO b n/a 9 1193 1203 1223 N
+ CH AH AO e n/a 9 1189 1203 1222 N
+ CH AH AO i n/a 9 1189 1203 1222 N
+ CH AH AO s n/a 9 1189 1203 1222 N
+ CH AH AW b n/a 9 1193 1198 1218 N
+ CH AH AW e n/a 9 1189 1200 1221 N
+ CH AH AW i n/a 9 1189 1200 1220 N
+ CH AH AW s n/a 9 1189 1200 1220 N
+ CH AH AY b n/a 9 1193 1203 1223 N
+ CH AH AY e n/a 9 1189 1203 1222 N
+ CH AH AY s n/a 9 1189 1203 1222 N
+ CH AH B e n/a 9 1189 1205 1211 N
+ CH AH B i n/a 9 1189 1205 1211 N
+ CH AH B s n/a 9 1189 1205 1211 N
+ CH AH CH e n/a 9 1189 1204 1214 N
+ CH AH CH s n/a 9 1189 1204 1214 N
+ CH AH D e n/a 9 1189 1206 1215 N
+ CH AH D i n/a 9 1189 1206 1215 N
+ CH AH D s n/a 9 1189 1206 1215 N
+ CH AH DH e n/a 9 1189 1206 1215 N
+ CH AH DH s n/a 9 1189 1206 1215 N
+ CH AH EH b n/a 9 1193 1198 1218 N
+ CH AH EH e n/a 9 1189 1200 1221 N
+ CH AH EH i n/a 9 1189 1200 1220 N
+ CH AH EH s n/a 9 1189 1200 1220 N
+ CH AH ER b n/a 9 1193 1202 1224 N
+ CH AH ER e n/a 9 1189 1202 1224 N
+ CH AH ER i n/a 9 1189 1202 1224 N
+ CH AH ER s n/a 9 1189 1202 1224 N
+ CH AH EY b n/a 9 1193 1198 1218 N
+ CH AH EY e n/a 9 1189 1199 1221 N
+ CH AH EY i n/a 9 1189 1199 1220 N
+ CH AH EY s n/a 9 1189 1199 1220 N
+ CH AH F e n/a 9 1189 1205 1208 N
+ CH AH F i n/a 9 1189 1205 1208 N
+ CH AH F s n/a 9 1189 1205 1208 N
+ CH AH G e n/a 9 1189 1205 1211 N
+ CH AH G s n/a 9 1189 1205 1211 N
+ CH AH HH e n/a 9 1189 1204 1213 N
+ CH AH HH s n/a 9 1189 1204 1213 N
+ CH AH IH b n/a 9 1193 1198 1220 N
+ CH AH IH e n/a 9 1189 1200 1221 N
+ CH AH IH i n/a 9 1189 1200 1220 N
+ CH AH IH s n/a 9 1189 1200 1220 N
+ CH AH IY b n/a 9 1193 1198 1219 N
+ CH AH IY e n/a 9 1189 1199 1219 N
+ CH AH IY i n/a 9 1189 1199 1219 N
+ CH AH IY s n/a 9 1189 1199 1219 N
+ CH AH JH e n/a 9 1189 1204 1214 N
+ CH AH JH s n/a 9 1189 1204 1214 N
+ CH AH K e n/a 9 1189 1205 1211 N
+ CH AH K i n/a 9 1189 1205 1211 N
+ CH AH K s n/a 9 1189 1205 1211 N
+ CH AH L b n/a 9 1193 1204 1212 N
+ CH AH L e n/a 9 1189 1204 1212 N
+ CH AH L i n/a 9 1189 1204 1212 N
+ CH AH L s n/a 9 1189 1204 1212 N
+ CH AH M e n/a 9 1189 1205 1212 N
+ CH AH M i n/a 9 1189 1205 1212 N
+ CH AH M s n/a 9 1189 1205 1212 N
+ CH AH N e n/a 9 1189 1206 1215 N
+ CH AH N i n/a 9 1189 1206 1215 N
+ CH AH N s n/a 9 1189 1206 1215 N
+ CH AH NG e n/a 9 1189 1205 1208 N
+ CH AH NG s n/a 9 1189 1205 1208 N
+ CH AH OW b n/a 9 1193 1202 1222 N
+ CH AH OW e n/a 9 1189 1202 1222 N
+ CH AH OW i n/a 9 1189 1202 1222 N
+ CH AH OW s n/a 9 1189 1202 1222 N
+ CH AH OY b n/a 9 1193 1203 1223 N
+ CH AH OY e n/a 9 1189 1203 1222 N
+ CH AH OY s n/a 9 1189 1203 1222 N
+ CH AH P e n/a 9 1189 1205 1211 N
+ CH AH P i n/a 9 1189 1205 1211 N
+ CH AH P s n/a 9 1189 1205 1211 N
+ CH AH R b n/a 9 1193 1205 1209 N
+ CH AH R e n/a 9 1189 1205 1209 N
+ CH AH R s n/a 9 1189 1205 1209 N
+ CH AH S e n/a 9 1189 1206 1214 N
+ CH AH S i n/a 9 1189 1206 1214 N
+ CH AH S s n/a 9 1189 1206 1214 N
+ CH AH SH e n/a 9 1189 1204 1214 N
+ CH AH SH s n/a 9 1189 1204 1214 N
+ CH AH SIL e n/a 9 1188 1204 1210 N
+ CH AH SIL s n/a 9 1188 1204 1210 N
+ CH AH T e n/a 9 1189 1206 1216 N
+ CH AH T i n/a 9 1189 1206 1216 N
+ CH AH T s n/a 9 1189 1206 1216 N
+ CH AH TH e n/a 9 1189 1206 1215 N
+ CH AH TH s n/a 9 1189 1206 1215 N
+ CH AH UH b n/a 9 1193 1202 1224 N
+ CH AH UH e n/a 9 1189 1202 1224 N
+ CH AH UH i n/a 9 1189 1202 1224 N
+ CH AH UH s n/a 9 1189 1202 1224 N
+ CH AH UW b n/a 9 1193 1202 1225 N
+ CH AH UW e n/a 9 1189 1202 1225 N
+ CH AH UW i n/a 9 1189 1202 1225 N
+ CH AH UW s n/a 9 1189 1202 1225 N
+ CH AH V e n/a 9 1189 1205 1208 N
+ CH AH V s n/a 9 1189 1205 1208 N
+ CH AH W b n/a 9 1193 1205 1209 N
+ CH AH W e n/a 9 1189 1205 1209 N
+ CH AH W s n/a 9 1189 1205 1209 N
+ CH AH Y b n/a 9 1193 1204 1213 N
+ CH AH Y e n/a 9 1189 1204 1213 N
+ CH AH Y s n/a 9 1189 1204 1213 N
+ CH AH Z e n/a 9 1189 1206 1215 N
+ CH AH Z s n/a 9 1189 1206 1215 N
+ CH AH ZH e n/a 9 1189 1204 1214 N
+ CH AH ZH s n/a 9 1189 1204 1214 N
+ CH AO AA b n/a 9 1191 1203 1223 N
+ CH AO AA e n/a 9 1188 1203 1222 N
+ CH AO AA s n/a 9 1188 1203 1222 N
+ CH AO AE b n/a 9 1191 1198 1218 N
+ CH AO AE e n/a 9 1188 1200 1221 N
+ CH AO AE s n/a 9 1188 1200 1220 N
+ CH AO AH b n/a 9 1191 1198 1217 N
+ CH AO AH e n/a 9 1188 1200 1221 N
+ CH AO AH i n/a 9 1188 1200 1220 N
+ CH AO AH s n/a 9 1188 1200 1220 N
+ CH AO AO b n/a 9 1191 1203 1223 N
+ CH AO AO e n/a 9 1188 1203 1222 N
+ CH AO AO s n/a 9 1188 1203 1222 N
+ CH AO AW b n/a 9 1191 1198 1218 N
+ CH AO AW e n/a 9 1188 1200 1221 N
+ CH AO AW s n/a 9 1188 1200 1220 N
+ CH AO AY b n/a 9 1191 1203 1223 N
+ CH AO AY e n/a 9 1188 1203 1222 N
+ CH AO AY s n/a 9 1188 1203 1222 N
+ CH AO B e n/a 9 1188 1205 1211 N
+ CH AO B s n/a 9 1188 1205 1211 N
+ CH AO CH e n/a 9 1188 1204 1214 N
+ CH AO CH s n/a 9 1188 1204 1214 N
+ CH AO D e n/a 9 1188 1206 1215 N
+ CH AO D s n/a 9 1188 1206 1215 N
+ CH AO DH e n/a 9 1188 1206 1215 N
+ CH AO DH s n/a 9 1188 1206 1215 N
+ CH AO EH b n/a 9 1191 1198 1218 N
+ CH AO EH e n/a 9 1188 1200 1221 N
+ CH AO EH i n/a 9 1188 1200 1220 N
+ CH AO EH s n/a 9 1188 1200 1220 N
+ CH AO ER b n/a 9 1191 1202 1224 N
+ CH AO ER e n/a 9 1188 1202 1224 N
+ CH AO ER i n/a 9 1188 1202 1224 N
+ CH AO ER s n/a 9 1188 1202 1224 N
+ CH AO EY b n/a 9 1191 1198 1218 N
+ CH AO EY e n/a 9 1188 1199 1221 N
+ CH AO EY s n/a 9 1188 1199 1220 N
+ CH AO F e n/a 9 1188 1205 1208 N
+ CH AO F s n/a 9 1188 1205 1208 N
+ CH AO G e n/a 9 1188 1205 1211 N
+ CH AO G s n/a 9 1188 1205 1211 N
+ CH AO HH e n/a 9 1188 1204 1213 N
+ CH AO HH s n/a 9 1188 1204 1213 N
+ CH AO IH b n/a 9 1191 1198 1220 N
+ CH AO IH e n/a 9 1188 1200 1221 N
+ CH AO IH i n/a 9 1188 1200 1220 N
+ CH AO IH s n/a 9 1188 1200 1220 N
+ CH AO IY b n/a 9 1191 1198 1219 N
+ CH AO IY e n/a 9 1188 1199 1219 N
+ CH AO IY i n/a 9 1188 1199 1219 N
+ CH AO IY s n/a 9 1188 1199 1219 N
+ CH AO JH e n/a 9 1188 1204 1214 N
+ CH AO JH s n/a 9 1188 1204 1214 N
+ CH AO K e n/a 9 1188 1205 1211 N
+ CH AO K s n/a 9 1188 1205 1211 N
+ CH AO L b n/a 9 1191 1204 1212 N
+ CH AO L e n/a 9 1188 1204 1212 N
+ CH AO L i n/a 9 1188 1204 1212 N
+ CH AO L s n/a 9 1188 1204 1212 N
+ CH AO M e n/a 9 1188 1205 1212 N
+ CH AO M s n/a 9 1188 1205 1212 N
+ CH AO N e n/a 9 1188 1206 1215 N
+ CH AO N i n/a 9 1188 1206 1215 N
+ CH AO N s n/a 9 1188 1206 1215 N
+ CH AO NG e n/a 9 1188 1205 1208 N
+ CH AO NG s n/a 9 1188 1205 1208 N
+ CH AO OW b n/a 9 1191 1202 1222 N
+ CH AO OW e n/a 9 1188 1202 1222 N
+ CH AO OW s n/a 9 1188 1202 1222 N
+ CH AO OY b n/a 9 1191 1203 1223 N
+ CH AO OY e n/a 9 1188 1203 1222 N
+ CH AO OY s n/a 9 1188 1203 1222 N
+ CH AO P e n/a 9 1188 1205 1211 N
+ CH AO P s n/a 9 1188 1205 1211 N
+ CH AO R b n/a 9 1191 1205 1209 N
+ CH AO R e n/a 9 1188 1205 1209 N
+ CH AO R s n/a 9 1188 1205 1209 N
+ CH AO S e n/a 9 1188 1206 1214 N
+ CH AO S s n/a 9 1188 1206 1214 N
+ CH AO SH e n/a 9 1188 1204 1214 N
+ CH AO SH s n/a 9 1188 1204 1214 N
+ CH AO SIL e n/a 9 1188 1204 1210 N
+ CH AO SIL s n/a 9 1188 1204 1210 N
+ CH AO T e n/a 9 1188 1206 1216 N
+ CH AO T i n/a 9 1188 1206 1216 N
+ CH AO T s n/a 9 1188 1206 1216 N
+ CH AO TH e n/a 9 1188 1206 1215 N
+ CH AO TH s n/a 9 1188 1206 1215 N
+ CH AO UH b n/a 9 1191 1202 1224 N
+ CH AO UH e n/a 9 1188 1202 1224 N
+ CH AO UH s n/a 9 1188 1202 1224 N
+ CH AO UW b n/a 9 1191 1202 1225 N
+ CH AO UW e n/a 9 1188 1202 1225 N
+ CH AO UW s n/a 9 1188 1202 1225 N
+ CH AO V e n/a 9 1188 1205 1208 N
+ CH AO V s n/a 9 1188 1205 1208 N
+ CH AO W b n/a 9 1191 1205 1209 N
+ CH AO W e n/a 9 1188 1205 1209 N
+ CH AO W s n/a 9 1188 1205 1209 N
+ CH AO Y b n/a 9 1191 1204 1213 N
+ CH AO Y e n/a 9 1188 1204 1213 N
+ CH AO Y s n/a 9 1188 1204 1213 N
+ CH AO Z e n/a 9 1188 1206 1215 N
+ CH AO Z s n/a 9 1188 1206 1215 N
+ CH AO ZH e n/a 9 1188 1204 1214 N
+ CH AO ZH s n/a 9 1188 1204 1214 N
+ CH AW AA b n/a 9 1193 1203 1223 N
+ CH AW AA e n/a 9 1190 1203 1222 N
+ CH AW AA i n/a 9 1190 1203 1222 N
+ CH AW AA s n/a 9 1190 1203 1222 N
+ CH AW AE b n/a 9 1193 1198 1218 N
+ CH AW AE e n/a 9 1190 1200 1221 N
+ CH AW AE s n/a 9 1190 1200 1220 N
+ CH AW AH b n/a 9 1193 1198 1217 N
+ CH AW AH e n/a 9 1190 1200 1221 N
+ CH AW AH i n/a 9 1190 1200 1220 N
+ CH AW AH s n/a 9 1190 1200 1220 N
+ CH AW AO b n/a 9 1193 1203 1223 N
+ CH AW AO e n/a 9 1190 1203 1222 N
+ CH AW AO i n/a 9 1190 1203 1222 N
+ CH AW AO s n/a 9 1190 1203 1222 N
+ CH AW AW b n/a 9 1193 1198 1218 N
+ CH AW AW e n/a 9 1190 1200 1221 N
+ CH AW AW s n/a 9 1190 1200 1220 N
+ CH AW AY b n/a 9 1193 1203 1223 N
+ CH AW AY e n/a 9 1190 1203 1222 N
+ CH AW AY i n/a 9 1190 1203 1222 N
+ CH AW AY s n/a 9 1190 1203 1222 N
+ CH AW B e n/a 9 1190 1205 1211 N
+ CH AW B i n/a 9 1190 1205 1211 N
+ CH AW B s n/a 9 1190 1205 1211 N
+ CH AW CH e n/a 9 1190 1204 1214 N
+ CH AW CH s n/a 9 1190 1204 1214 N
+ CH AW D e n/a 9 1190 1206 1215 N
+ CH AW D s n/a 9 1190 1206 1215 N
+ CH AW DH e n/a 9 1190 1206 1215 N
+ CH AW DH s n/a 9 1190 1206 1215 N
+ CH AW EH b n/a 9 1193 1198 1218 N
+ CH AW EH e n/a 9 1190 1200 1221 N
+ CH AW EH i n/a 9 1190 1200 1220 N
+ CH AW EH s n/a 9 1190 1200 1220 N
+ CH AW ER b n/a 9 1193 1202 1224 N
+ CH AW ER e n/a 9 1190 1202 1224 N
+ CH AW ER i n/a 9 1190 1202 1224 N
+ CH AW ER s n/a 9 1190 1202 1224 N
+ CH AW EY b n/a 9 1193 1198 1218 N
+ CH AW EY e n/a 9 1190 1199 1221 N
+ CH AW EY s n/a 9 1190 1199 1220 N
+ CH AW F e n/a 9 1190 1205 1208 N
+ CH AW F s n/a 9 1190 1205 1208 N
+ CH AW G e n/a 9 1190 1205 1211 N
+ CH AW G s n/a 9 1190 1205 1211 N
+ CH AW HH e n/a 9 1190 1204 1213 N
+ CH AW HH s n/a 9 1190 1204 1213 N
+ CH AW IH b n/a 9 1193 1198 1220 N
+ CH AW IH e n/a 9 1190 1200 1221 N
+ CH AW IH i n/a 9 1190 1200 1220 N
+ CH AW IH s n/a 9 1190 1200 1220 N
+ CH AW IY b n/a 9 1193 1198 1219 N
+ CH AW IY e n/a 9 1190 1199 1219 N
+ CH AW IY i n/a 9 1190 1199 1219 N
+ CH AW IY s n/a 9 1190 1199 1219 N
+ CH AW JH e n/a 9 1190 1204 1214 N
+ CH AW JH s n/a 9 1190 1204 1214 N
+ CH AW K e n/a 9 1190 1205 1211 N
+ CH AW K s n/a 9 1190 1205 1211 N
+ CH AW L b n/a 9 1193 1204 1212 N
+ CH AW L e n/a 9 1190 1204 1212 N
+ CH AW L s n/a 9 1190 1204 1212 N
+ CH AW M e n/a 9 1190 1205 1212 N
+ CH AW M s n/a 9 1190 1205 1212 N
+ CH AW N e n/a 9 1190 1206 1215 N
+ CH AW N s n/a 9 1190 1206 1215 N
+ CH AW NG e n/a 9 1190 1205 1208 N
+ CH AW NG s n/a 9 1190 1205 1208 N
+ CH AW OW b n/a 9 1193 1202 1222 N
+ CH AW OW e n/a 9 1190 1202 1222 N
+ CH AW OW i n/a 9 1190 1202 1222 N
+ CH AW OW s n/a 9 1190 1202 1222 N
+ CH AW OY b n/a 9 1193 1203 1223 N
+ CH AW OY e n/a 9 1190 1203 1222 N
+ CH AW OY s n/a 9 1190 1203 1222 N
+ CH AW P e n/a 9 1190 1205 1211 N
+ CH AW P s n/a 9 1190 1205 1211 N
+ CH AW R b n/a 9 1193 1205 1209 N
+ CH AW R e n/a 9 1190 1205 1209 N
+ CH AW R s n/a 9 1190 1205 1209 N
+ CH AW S e n/a 9 1190 1206 1214 N
+ CH AW S s n/a 9 1190 1206 1214 N
+ CH AW SH e n/a 9 1190 1204 1214 N
+ CH AW SH s n/a 9 1190 1204 1214 N
+ CH AW SIL e n/a 9 1190 1204 1210 N
+ CH AW SIL s n/a 9 1190 1204 1210 N
+ CH AW T e n/a 9 1190 1206 1216 N
+ CH AW T i n/a 9 1190 1206 1216 N
+ CH AW T s n/a 9 1190 1206 1216 N
+ CH AW TH e n/a 9 1190 1206 1215 N
+ CH AW TH s n/a 9 1190 1206 1215 N
+ CH AW UH b n/a 9 1193 1202 1224 N
+ CH AW UH e n/a 9 1190 1202 1224 N
+ CH AW UH i n/a 9 1190 1202 1224 N
+ CH AW UH s n/a 9 1190 1202 1224 N
+ CH AW UW b n/a 9 1193 1202 1225 N
+ CH AW UW e n/a 9 1190 1202 1225 N
+ CH AW UW i n/a 9 1190 1202 1225 N
+ CH AW UW s n/a 9 1190 1202 1225 N
+ CH AW V e n/a 9 1190 1205 1208 N
+ CH AW V s n/a 9 1190 1205 1208 N
+ CH AW W b n/a 9 1193 1205 1209 N
+ CH AW W e n/a 9 1190 1205 1209 N
+ CH AW W s n/a 9 1190 1205 1209 N
+ CH AW Y b n/a 9 1193 1204 1213 N
+ CH AW Y e n/a 9 1190 1204 1213 N
+ CH AW Y s n/a 9 1190 1204 1213 N
+ CH AW Z e n/a 9 1190 1206 1215 N
+ CH AW Z s n/a 9 1190 1206 1215 N
+ CH AW ZH e n/a 9 1190 1204 1214 N
+ CH AW ZH s n/a 9 1190 1204 1214 N
+ CH AY AA b n/a 9 1193 1203 1223 N
+ CH AY AA e n/a 9 1192 1203 1222 N
+ CH AY AA s n/a 9 1193 1203 1222 N
+ CH AY AE b n/a 9 1193 1198 1218 N
+ CH AY AE e n/a 9 1192 1200 1217 N
+ CH AY AE i n/a 9 1193 1200 1220 N
+ CH AY AE s n/a 9 1193 1200 1220 N
+ CH AY AH b n/a 9 1193 1198 1217 N
+ CH AY AH e n/a 9 1192 1200 1217 N
+ CH AY AH i n/a 9 1193 1200 1220 N
+ CH AY AH s n/a 9 1193 1200 1220 N
+ CH AY AO b n/a 9 1193 1203 1223 N
+ CH AY AO e n/a 9 1192 1203 1222 N
+ CH AY AO s n/a 9 1193 1203 1222 N
+ CH AY AW b n/a 9 1193 1198 1218 N
+ CH AY AW e n/a 9 1192 1200 1217 N
+ CH AY AW s n/a 9 1193 1200 1220 N
+ CH AY AY b n/a 9 1193 1203 1223 N
+ CH AY AY e n/a 9 1192 1203 1222 N
+ CH AY AY s n/a 9 1193 1203 1222 N
+ CH AY B e n/a 9 1192 1205 1211 N
+ CH AY B s n/a 9 1193 1205 1211 N
+ CH AY CH e n/a 9 1192 1204 1214 N
+ CH AY CH s n/a 9 1193 1204 1214 N
+ CH AY D e n/a 9 1192 1206 1215 N
+ CH AY D s n/a 9 1193 1206 1215 N
+ CH AY DH e n/a 9 1192 1206 1215 N
+ CH AY DH s n/a 9 1193 1206 1215 N
+ CH AY EH b n/a 9 1193 1198 1218 N
+ CH AY EH e n/a 9 1192 1200 1218 N
+ CH AY EH s n/a 9 1193 1200 1220 N
+ CH AY ER b n/a 9 1193 1202 1224 N
+ CH AY ER e n/a 9 1192 1202 1224 N
+ CH AY ER i n/a 9 1193 1202 1224 N
+ CH AY ER s n/a 9 1193 1202 1224 N
+ CH AY EY b n/a 9 1193 1198 1218 N
+ CH AY EY e n/a 9 1192 1199 1218 N
+ CH AY EY i n/a 9 1193 1199 1220 N
+ CH AY EY s n/a 9 1193 1199 1220 N
+ CH AY F e n/a 9 1192 1205 1208 N
+ CH AY F s n/a 9 1193 1205 1208 N
+ CH AY G e n/a 9 1192 1205 1211 N
+ CH AY G s n/a 9 1193 1205 1211 N
+ CH AY HH e n/a 9 1192 1204 1213 N
+ CH AY HH s n/a 9 1193 1204 1213 N
+ CH AY IH b n/a 9 1193 1198 1220 N
+ CH AY IH e n/a 9 1192 1200 1221 N
+ CH AY IH i n/a 9 1193 1200 1220 N
+ CH AY IH s n/a 9 1193 1200 1220 N
+ CH AY IY b n/a 9 1193 1198 1219 N
+ CH AY IY e n/a 9 1192 1199 1219 N
+ CH AY IY s n/a 9 1193 1199 1219 N
+ CH AY JH e n/a 9 1192 1204 1214 N
+ CH AY JH s n/a 9 1193 1204 1214 N
+ CH AY K e n/a 9 1192 1205 1211 N
+ CH AY K s n/a 9 1193 1205 1211 N
+ CH AY L b n/a 9 1193 1204 1212 N
+ CH AY L e n/a 9 1192 1204 1212 N
+ CH AY L s n/a 9 1193 1204 1212 N
+ CH AY M e n/a 9 1192 1205 1212 N
+ CH AY M s n/a 9 1193 1205 1212 N
+ CH AY N e n/a 9 1192 1206 1215 N
+ CH AY N s n/a 9 1193 1206 1215 N
+ CH AY NG e n/a 9 1192 1205 1208 N
+ CH AY NG s n/a 9 1193 1205 1208 N
+ CH AY OW b n/a 9 1193 1202 1222 N
+ CH AY OW e n/a 9 1192 1202 1222 N
+ CH AY OW i n/a 9 1193 1202 1222 N
+ CH AY OW s n/a 9 1193 1202 1222 N
+ CH AY OY b n/a 9 1193 1203 1223 N
+ CH AY OY e n/a 9 1192 1203 1222 N
+ CH AY OY s n/a 9 1193 1203 1222 N
+ CH AY P e n/a 9 1192 1205 1211 N
+ CH AY P s n/a 9 1193 1205 1211 N
+ CH AY R b n/a 9 1193 1205 1209 N
+ CH AY R e n/a 9 1192 1205 1209 N
+ CH AY R i n/a 9 1193 1205 1208 N
+ CH AY R s n/a 9 1193 1205 1209 N
+ CH AY S e n/a 9 1192 1206 1214 N
+ CH AY S s n/a 9 1193 1206 1214 N
+ CH AY SH e n/a 9 1192 1204 1214 N
+ CH AY SH s n/a 9 1193 1204 1214 N
+ CH AY SIL e n/a 9 1193 1204 1210 N
+ CH AY SIL s n/a 9 1193 1204 1210 N
+ CH AY T e n/a 9 1192 1206 1216 N
+ CH AY T s n/a 9 1193 1206 1216 N
+ CH AY TH e n/a 9 1192 1206 1215 N
+ CH AY TH s n/a 9 1193 1206 1215 N
+ CH AY UH b n/a 9 1193 1202 1224 N
+ CH AY UH e n/a 9 1192 1202 1224 N
+ CH AY UH s n/a 9 1193 1202 1224 N
+ CH AY UW b n/a 9 1193 1202 1225 N
+ CH AY UW e n/a 9 1192 1202 1225 N
+ CH AY UW s n/a 9 1193 1202 1225 N
+ CH AY V e n/a 9 1192 1205 1208 N
+ CH AY V s n/a 9 1193 1205 1208 N
+ CH AY W b n/a 9 1193 1205 1209 N
+ CH AY W e n/a 9 1192 1205 1209 N
+ CH AY W i n/a 9 1193 1205 1209 N
+ CH AY W s n/a 9 1193 1205 1209 N
+ CH AY Y b n/a 9 1193 1204 1213 N
+ CH AY Y e n/a 9 1192 1204 1213 N
+ CH AY Y s n/a 9 1193 1204 1213 N
+ CH AY Z e n/a 9 1192 1206 1215 N
+ CH AY Z s n/a 9 1193 1206 1215 N
+ CH AY ZH e n/a 9 1192 1204 1214 N
+ CH AY ZH s n/a 9 1193 1204 1214 N
+ CH B AA b n/a 9 1195 1203 1223 N
+ CH B AA s n/a 9 1195 1203 1222 N
+ CH B AE b n/a 9 1195 1198 1218 N
+ CH B AE i n/a 9 1196 1198 1220 N
+ CH B AE s n/a 9 1195 1198 1220 N
+ CH B AH b n/a 9 1195 1198 1217 N
+ CH B AH s n/a 9 1195 1198 1220 N
+ CH B AO b n/a 9 1195 1203 1223 N
+ CH B AO s n/a 9 1195 1203 1222 N
+ CH B AW b n/a 9 1195 1198 1218 N
+ CH B AW s n/a 9 1195 1198 1220 N
+ CH B AY b n/a 9 1195 1203 1223 N
+ CH B AY s n/a 9 1195 1203 1222 N
+ CH B B s n/a 9 1195 1205 1211 N
+ CH B CH s n/a 9 1195 1204 1214 N
+ CH B D s n/a 9 1195 1206 1215 N
+ CH B DH s n/a 9 1195 1206 1215 N
+ CH B EH b n/a 9 1195 1198 1218 N
+ CH B EH i n/a 9 1196 1198 1220 N
+ CH B EH s n/a 9 1195 1198 1220 N
+ CH B ER b n/a 9 1195 1202 1224 N
+ CH B ER s n/a 9 1195 1202 1224 N
+ CH B EY b n/a 9 1195 1198 1218 N
+ CH B EY s n/a 9 1195 1198 1220 N
+ CH B F s n/a 9 1195 1205 1208 N
+ CH B G s n/a 9 1195 1205 1211 N
+ CH B HH s n/a 9 1195 1204 1213 N
+ CH B IH b n/a 9 1195 1198 1220 N
+ CH B IH i n/a 9 1196 1198 1220 N
+ CH B IH s n/a 9 1195 1198 1220 N
+ CH B IY b n/a 9 1195 1198 1219 N
+ CH B IY s n/a 9 1195 1198 1219 N
+ CH B JH s n/a 9 1195 1204 1214 N
+ CH B K s n/a 9 1195 1205 1211 N
+ CH B L b n/a 9 1195 1204 1212 N
+ CH B L s n/a 9 1195 1204 1212 N
+ CH B M s n/a 9 1195 1205 1212 N
+ CH B N s n/a 9 1195 1206 1215 N
+ CH B NG s n/a 9 1195 1205 1208 N
+ CH B OW b n/a 9 1195 1202 1222 N
+ CH B OW s n/a 9 1195 1202 1222 N
+ CH B OY b n/a 9 1195 1203 1223 N
+ CH B OY s n/a 9 1195 1203 1222 N
+ CH B P s n/a 9 1195 1205 1211 N
+ CH B R b n/a 9 1195 1205 1209 N
+ CH B R s n/a 9 1195 1205 1209 N
+ CH B S s n/a 9 1195 1206 1214 N
+ CH B SH s n/a 9 1195 1204 1214 N
+ CH B SIL s n/a 9 1195 1204 1210 N
+ CH B T s n/a 9 1195 1206 1216 N
+ CH B TH s n/a 9 1195 1206 1215 N
+ CH B UH b n/a 9 1195 1202 1224 N
+ CH B UH s n/a 9 1195 1202 1224 N
+ CH B UW b n/a 9 1195 1202 1225 N
+ CH B UW s n/a 9 1195 1202 1225 N
+ CH B V s n/a 9 1195 1205 1208 N
+ CH B W b n/a 9 1195 1205 1209 N
+ CH B W s n/a 9 1195 1205 1209 N
+ CH B Y b n/a 9 1195 1204 1213 N
+ CH B Y s n/a 9 1195 1204 1213 N
+ CH B Z s n/a 9 1195 1206 1215 N
+ CH B ZH s n/a 9 1195 1204 1214 N
+ CH CH AA b n/a 9 1194 1203 1223 N
+ CH CH AA s n/a 9 1194 1203 1222 N
+ CH CH AE b n/a 9 1194 1198 1218 N
+ CH CH AE s n/a 9 1194 1198 1220 N
+ CH CH AH b n/a 9 1194 1198 1217 N
+ CH CH AH s n/a 9 1194 1198 1220 N
+ CH CH AO b n/a 9 1194 1203 1223 N
+ CH CH AO s n/a 9 1194 1203 1222 N
+ CH CH AW b n/a 9 1194 1198 1218 N
+ CH CH AW s n/a 9 1194 1198 1220 N
+ CH CH AY b n/a 9 1194 1203 1223 N
+ CH CH AY s n/a 9 1194 1203 1222 N
+ CH CH B s n/a 9 1194 1205 1211 N
+ CH CH CH s n/a 9 1194 1204 1214 N
+ CH CH D s n/a 9 1194 1206 1215 N
+ CH CH DH s n/a 9 1194 1206 1215 N
+ CH CH EH b n/a 9 1194 1198 1218 N
+ CH CH EH s n/a 9 1194 1198 1220 N
+ CH CH ER b n/a 9 1194 1202 1224 N
+ CH CH ER s n/a 9 1194 1202 1224 N
+ CH CH EY b n/a 9 1194 1198 1218 N
+ CH CH EY s n/a 9 1194 1198 1220 N
+ CH CH F s n/a 9 1194 1205 1208 N
+ CH CH G s n/a 9 1194 1205 1211 N
+ CH CH HH s n/a 9 1194 1204 1213 N
+ CH CH IH b n/a 9 1194 1198 1220 N
+ CH CH IH s n/a 9 1194 1198 1220 N
+ CH CH IY b n/a 9 1194 1198 1219 N
+ CH CH IY s n/a 9 1194 1198 1219 N
+ CH CH JH s n/a 9 1194 1204 1214 N
+ CH CH K s n/a 9 1194 1205 1211 N
+ CH CH L b n/a 9 1194 1204 1212 N
+ CH CH L s n/a 9 1194 1204 1212 N
+ CH CH M s n/a 9 1194 1205 1212 N
+ CH CH N s n/a 9 1194 1206 1215 N
+ CH CH NG s n/a 9 1194 1205 1208 N
+ CH CH OW b n/a 9 1194 1202 1222 N
+ CH CH OW s n/a 9 1194 1202 1222 N
+ CH CH OY b n/a 9 1194 1203 1223 N
+ CH CH OY s n/a 9 1194 1203 1222 N
+ CH CH P s n/a 9 1194 1205 1211 N
+ CH CH R b n/a 9 1194 1205 1209 N
+ CH CH R s n/a 9 1194 1205 1209 N
+ CH CH S s n/a 9 1194 1206 1214 N
+ CH CH SH s n/a 9 1194 1204 1214 N
+ CH CH SIL s n/a 9 1194 1204 1210 N
+ CH CH T s n/a 9 1194 1206 1216 N
+ CH CH TH s n/a 9 1194 1206 1215 N
+ CH CH UH b n/a 9 1194 1202 1224 N
+ CH CH UH s n/a 9 1194 1202 1224 N
+ CH CH UW b n/a 9 1194 1202 1225 N
+ CH CH UW s n/a 9 1194 1202 1225 N
+ CH CH V s n/a 9 1194 1205 1208 N
+ CH CH W b n/a 9 1194 1205 1209 N
+ CH CH W s n/a 9 1194 1205 1209 N
+ CH CH Y b n/a 9 1194 1204 1213 N
+ CH CH Y s n/a 9 1194 1204 1213 N
+ CH CH Z s n/a 9 1194 1206 1215 N
+ CH CH ZH s n/a 9 1194 1204 1214 N
+ CH D AA b n/a 9 1195 1203 1223 N
+ CH D AA s n/a 9 1195 1203 1222 N
+ CH D AE b n/a 9 1195 1198 1218 N
+ CH D AE i n/a 9 1196 1198 1220 N
+ CH D AE s n/a 9 1195 1198 1220 N
+ CH D AH b n/a 9 1195 1198 1217 N
+ CH D AH i n/a 9 1196 1198 1220 N
+ CH D AH s n/a 9 1195 1198 1220 N
+ CH D AO b n/a 9 1195 1203 1223 N
+ CH D AO i n/a 9 1196 1203 1222 N
+ CH D AO s n/a 9 1195 1203 1222 N
+ CH D AW b n/a 9 1195 1198 1218 N
+ CH D AW s n/a 9 1195 1198 1220 N
+ CH D AY b n/a 9 1195 1203 1223 N
+ CH D AY i n/a 9 1196 1203 1222 N
+ CH D AY s n/a 9 1195 1203 1222 N
+ CH D B s n/a 9 1195 1205 1211 N
+ CH D CH s n/a 9 1195 1204 1214 N
+ CH D D s n/a 9 1195 1206 1215 N
+ CH D DH s n/a 9 1195 1206 1215 N
+ CH D EH b n/a 9 1195 1198 1218 N
+ CH D EH i n/a 9 1196 1198 1220 N
+ CH D EH s n/a 9 1195 1198 1220 N
+ CH D ER b n/a 9 1195 1202 1224 N
+ CH D ER s n/a 9 1195 1202 1224 N
+ CH D EY b n/a 9 1195 1198 1218 N
+ CH D EY i n/a 9 1196 1198 1220 N
+ CH D EY s n/a 9 1195 1198 1220 N
+ CH D F s n/a 9 1195 1205 1208 N
+ CH D G s n/a 9 1195 1205 1211 N
+ CH D HH s n/a 9 1195 1204 1213 N
+ CH D IH b n/a 9 1195 1198 1220 N
+ CH D IH i n/a 9 1196 1198 1220 N
+ CH D IH s n/a 9 1195 1198 1220 N
+ CH D IY b n/a 9 1195 1198 1219 N
+ CH D IY i n/a 9 1196 1198 1219 N
+ CH D IY s n/a 9 1195 1198 1219 N
+ CH D JH s n/a 9 1195 1204 1214 N
+ CH D K s n/a 9 1195 1205 1211 N
+ CH D L b n/a 9 1195 1204 1212 N
+ CH D L s n/a 9 1195 1204 1212 N
+ CH D M s n/a 9 1195 1205 1212 N
+ CH D N s n/a 9 1195 1206 1215 N
+ CH D NG s n/a 9 1195 1205 1208 N
+ CH D OW b n/a 9 1195 1202 1222 N
+ CH D OW s n/a 9 1195 1202 1222 N
+ CH D OY b n/a 9 1195 1203 1223 N
+ CH D OY s n/a 9 1195 1203 1222 N
+ CH D P s n/a 9 1195 1205 1211 N
+ CH D R b n/a 9 1195 1205 1209 N
+ CH D R s n/a 9 1195 1205 1209 N
+ CH D S s n/a 9 1195 1206 1214 N
+ CH D SH s n/a 9 1195 1204 1214 N
+ CH D SIL s n/a 9 1195 1204 1210 N
+ CH D T s n/a 9 1195 1206 1216 N
+ CH D TH s n/a 9 1195 1206 1215 N
+ CH D UH b n/a 9 1195 1202 1224 N
+ CH D UH s n/a 9 1195 1202 1224 N
+ CH D UW b n/a 9 1195 1202 1225 N
+ CH D UW s n/a 9 1195 1202 1225 N
+ CH D V s n/a 9 1195 1205 1208 N
+ CH D W b n/a 9 1195 1205 1209 N
+ CH D W s n/a 9 1195 1205 1209 N
+ CH D Y b n/a 9 1195 1204 1213 N
+ CH D Y s n/a 9 1195 1204 1213 N
+ CH D Z s n/a 9 1195 1206 1215 N
+ CH D ZH s n/a 9 1195 1204 1214 N
+ CH DH AA b n/a 9 1194 1203 1223 N
+ CH DH AA s n/a 9 1194 1203 1222 N
+ CH DH AE b n/a 9 1194 1198 1218 N
+ CH DH AE s n/a 9 1194 1198 1220 N
+ CH DH AH b n/a 9 1194 1198 1217 N
+ CH DH AH s n/a 9 1194 1198 1220 N
+ CH DH AO b n/a 9 1194 1203 1223 N
+ CH DH AO s n/a 9 1194 1203 1222 N
+ CH DH AW b n/a 9 1194 1198 1218 N
+ CH DH AW s n/a 9 1194 1198 1220 N
+ CH DH AY b n/a 9 1194 1203 1223 N
+ CH DH AY s n/a 9 1194 1203 1222 N
+ CH DH B s n/a 9 1194 1205 1211 N
+ CH DH CH s n/a 9 1194 1204 1214 N
+ CH DH D s n/a 9 1194 1206 1215 N
+ CH DH DH s n/a 9 1194 1206 1215 N
+ CH DH EH b n/a 9 1194 1198 1218 N
+ CH DH EH s n/a 9 1194 1198 1220 N
+ CH DH ER b n/a 9 1194 1202 1224 N
+ CH DH ER s n/a 9 1194 1202 1224 N
+ CH DH EY b n/a 9 1194 1198 1218 N
+ CH DH EY s n/a 9 1194 1198 1220 N
+ CH DH F s n/a 9 1194 1205 1208 N
+ CH DH G s n/a 9 1194 1205 1211 N
+ CH DH HH s n/a 9 1194 1204 1213 N
+ CH DH IH b n/a 9 1194 1198 1220 N
+ CH DH IH s n/a 9 1194 1198 1220 N
+ CH DH IY b n/a 9 1194 1198 1219 N
+ CH DH IY s n/a 9 1194 1198 1219 N
+ CH DH JH s n/a 9 1194 1204 1214 N
+ CH DH K s n/a 9 1194 1205 1211 N
+ CH DH L b n/a 9 1194 1204 1212 N
+ CH DH L s n/a 9 1194 1204 1212 N
+ CH DH M s n/a 9 1194 1205 1212 N
+ CH DH N s n/a 9 1194 1206 1215 N
+ CH DH NG s n/a 9 1194 1205 1208 N
+ CH DH OW b n/a 9 1194 1202 1222 N
+ CH DH OW s n/a 9 1194 1202 1222 N
+ CH DH OY b n/a 9 1194 1203 1223 N
+ CH DH OY s n/a 9 1194 1203 1222 N
+ CH DH P s n/a 9 1194 1205 1211 N
+ CH DH R b n/a 9 1194 1205 1209 N
+ CH DH R s n/a 9 1194 1205 1209 N
+ CH DH S s n/a 9 1194 1206 1214 N
+ CH DH SH s n/a 9 1194 1204 1214 N
+ CH DH SIL s n/a 9 1194 1204 1210 N
+ CH DH T s n/a 9 1194 1206 1216 N
+ CH DH TH s n/a 9 1194 1206 1215 N
+ CH DH UH b n/a 9 1194 1202 1224 N
+ CH DH UH s n/a 9 1194 1202 1224 N
+ CH DH UW b n/a 9 1194 1202 1225 N
+ CH DH UW s n/a 9 1194 1202 1225 N
+ CH DH V s n/a 9 1194 1205 1208 N
+ CH DH W b n/a 9 1194 1205 1209 N
+ CH DH W s n/a 9 1194 1205 1209 N
+ CH DH Y b n/a 9 1194 1204 1213 N
+ CH DH Y s n/a 9 1194 1204 1213 N
+ CH DH Z s n/a 9 1194 1206 1215 N
+ CH DH ZH s n/a 9 1194 1204 1214 N
+ CH EH AA b n/a 9 1193 1203 1223 N
+ CH EH AA e n/a 9 1189 1203 1222 N
+ CH EH AA i n/a 9 1189 1203 1222 N
+ CH EH AA s n/a 9 1189 1203 1222 N
+ CH EH AE b n/a 9 1193 1198 1218 N
+ CH EH AE e n/a 9 1189 1200 1221 N
+ CH EH AE s n/a 9 1189 1200 1220 N
+ CH EH AH b n/a 9 1193 1198 1217 N
+ CH EH AH e n/a 9 1189 1200 1221 N
+ CH EH AH i n/a 9 1189 1200 1220 N
+ CH EH AH s n/a 9 1189 1200 1220 N
+ CH EH AO b n/a 9 1193 1203 1223 N
+ CH EH AO e n/a 9 1189 1203 1222 N
+ CH EH AO s n/a 9 1189 1203 1222 N
+ CH EH AW b n/a 9 1193 1198 1218 N
+ CH EH AW e n/a 9 1189 1200 1221 N
+ CH EH AW s n/a 9 1189 1200 1220 N
+ CH EH AY b n/a 9 1193 1203 1223 N
+ CH EH AY e n/a 9 1189 1203 1222 N
+ CH EH AY i n/a 9 1189 1203 1222 N
+ CH EH AY s n/a 9 1189 1203 1222 N
+ CH EH B e n/a 9 1189 1205 1211 N
+ CH EH B i n/a 9 1189 1205 1211 N
+ CH EH B s n/a 9 1189 1205 1211 N
+ CH EH CH e n/a 9 1189 1204 1214 N
+ CH EH CH s n/a 9 1189 1204 1214 N
+ CH EH D e n/a 9 1189 1206 1215 N
+ CH EH D i n/a 9 1189 1206 1215 N
+ CH EH D s n/a 9 1189 1206 1215 N
+ CH EH DH e n/a 9 1189 1206 1215 N
+ CH EH DH s n/a 9 1189 1206 1215 N
+ CH EH EH b n/a 9 1193 1198 1218 N
+ CH EH EH e n/a 9 1189 1200 1221 N
+ CH EH EH i n/a 9 1189 1200 1220 N
+ CH EH EH s n/a 9 1189 1200 1220 N
+ CH EH ER b n/a 9 1193 1202 1224 N
+ CH EH ER e n/a 9 1189 1202 1224 N
+ CH EH ER i n/a 9 1189 1202 1224 N
+ CH EH ER s n/a 9 1189 1202 1224 N
+ CH EH EY b n/a 9 1193 1198 1218 N
+ CH EH EY e n/a 9 1189 1199 1221 N
+ CH EH EY i n/a 9 1189 1199 1220 N
+ CH EH EY s n/a 9 1189 1199 1220 N
+ CH EH F e n/a 9 1189 1205 1208 N
+ CH EH F s n/a 9 1189 1205 1208 N
+ CH EH G e n/a 9 1189 1205 1211 N
+ CH EH G s n/a 9 1189 1205 1211 N
+ CH EH HH e n/a 9 1189 1204 1213 N
+ CH EH HH s n/a 9 1189 1204 1213 N
+ CH EH IH b n/a 9 1193 1198 1220 N
+ CH EH IH e n/a 9 1189 1200 1221 N
+ CH EH IH i n/a 9 1189 1200 1220 N
+ CH EH IH s n/a 9 1189 1200 1220 N
+ CH EH IY b n/a 9 1193 1198 1219 N
+ CH EH IY e n/a 9 1189 1199 1219 N
+ CH EH IY i n/a 9 1189 1199 1219 N
+ CH EH IY s n/a 9 1189 1199 1219 N
+ CH EH JH e n/a 9 1189 1204 1214 N
+ CH EH JH s n/a 9 1189 1204 1214 N
+ CH EH K e n/a 9 1189 1205 1211 N
+ CH EH K i n/a 9 1189 1205 1211 N
+ CH EH K s n/a 9 1189 1205 1211 N
+ CH EH L b n/a 9 1193 1204 1212 N
+ CH EH L e n/a 9 1189 1204 1212 N
+ CH EH L i n/a 9 1189 1204 1212 N
+ CH EH L s n/a 9 1189 1204 1212 N
+ CH EH M e n/a 9 1189 1205 1212 N
+ CH EH M i n/a 9 1189 1205 1212 N
+ CH EH M s n/a 9 1189 1205 1212 N
+ CH EH N e n/a 9 1189 1206 1215 N
+ CH EH N i n/a 9 1189 1206 1215 N
+ CH EH N s n/a 9 1189 1206 1215 N
+ CH EH NG e n/a 9 1189 1205 1208 N
+ CH EH NG s n/a 9 1189 1205 1208 N
+ CH EH OW b n/a 9 1193 1202 1222 N
+ CH EH OW e n/a 9 1189 1202 1222 N
+ CH EH OW i n/a 9 1189 1202 1222 N
+ CH EH OW s n/a 9 1189 1202 1222 N
+ CH EH OY b n/a 9 1193 1203 1223 N
+ CH EH OY e n/a 9 1189 1203 1222 N
+ CH EH OY s n/a 9 1189 1203 1222 N
+ CH EH P e n/a 9 1189 1205 1211 N
+ CH EH P s n/a 9 1189 1205 1211 N
+ CH EH R b n/a 9 1193 1205 1209 N
+ CH EH R e n/a 9 1189 1205 1209 N
+ CH EH R s n/a 9 1189 1205 1209 N
+ CH EH S e n/a 9 1189 1206 1214 N
+ CH EH S s n/a 9 1189 1206 1214 N
+ CH EH SH e n/a 9 1189 1204 1214 N
+ CH EH SH s n/a 9 1189 1204 1214 N
+ CH EH SIL e n/a 9 1188 1204 1210 N
+ CH EH SIL s n/a 9 1188 1204 1210 N
+ CH EH T e n/a 9 1189 1206 1216 N
+ CH EH T i n/a 9 1189 1206 1216 N
+ CH EH T s n/a 9 1189 1206 1216 N
+ CH EH TH e n/a 9 1189 1206 1215 N
+ CH EH TH s n/a 9 1189 1206 1215 N
+ CH EH UH b n/a 9 1193 1202 1224 N
+ CH EH UH e n/a 9 1189 1202 1224 N
+ CH EH UH s n/a 9 1189 1202 1224 N
+ CH EH UW b n/a 9 1193 1202 1225 N
+ CH EH UW e n/a 9 1189 1202 1225 N
+ CH EH UW i n/a 9 1189 1202 1225 N
+ CH EH UW s n/a 9 1189 1202 1225 N
+ CH EH V e n/a 9 1189 1205 1208 N
+ CH EH V s n/a 9 1189 1205 1208 N
+ CH EH W b n/a 9 1193 1205 1209 N
+ CH EH W e n/a 9 1189 1205 1209 N
+ CH EH W i n/a 9 1189 1205 1209 N
+ CH EH W s n/a 9 1189 1205 1209 N
+ CH EH Y b n/a 9 1193 1204 1213 N
+ CH EH Y e n/a 9 1189 1204 1213 N
+ CH EH Y s n/a 9 1189 1204 1213 N
+ CH EH Z e n/a 9 1189 1206 1215 N
+ CH EH Z s n/a 9 1189 1206 1215 N
+ CH EH ZH e n/a 9 1189 1204 1214 N
+ CH EH ZH s n/a 9 1189 1204 1214 N
+ CH ER AA b n/a 9 1190 1203 1223 N
+ CH ER AA e n/a 9 1190 1203 1222 N
+ CH ER AA i n/a 9 1190 1203 1222 N
+ CH ER AA s n/a 9 1190 1203 1222 N
+ CH ER AE b n/a 9 1190 1198 1218 N
+ CH ER AE e n/a 9 1190 1200 1221 N
+ CH ER AE i n/a 9 1190 1200 1220 N
+ CH ER AE s n/a 9 1190 1200 1220 N
+ CH ER AH b n/a 9 1190 1198 1217 N
+ CH ER AH e n/a 9 1190 1200 1221 N
+ CH ER AH i n/a 9 1190 1200 1220 N
+ CH ER AH s n/a 9 1190 1200 1220 N
+ CH ER AO b n/a 9 1190 1203 1223 N
+ CH ER AO e n/a 9 1190 1203 1222 N
+ CH ER AO s n/a 9 1190 1203 1222 N
+ CH ER AW b n/a 9 1190 1198 1218 N
+ CH ER AW e n/a 9 1190 1200 1221 N
+ CH ER AW s n/a 9 1190 1200 1220 N
+ CH ER AY b n/a 9 1190 1203 1223 N
+ CH ER AY e n/a 9 1190 1203 1222 N
+ CH ER AY s n/a 9 1190 1203 1222 N
+ CH ER B e n/a 9 1190 1205 1211 N
+ CH ER B i n/a 9 1190 1205 1211 N
+ CH ER B s n/a 9 1190 1205 1211 N
+ CH ER CH e n/a 9 1190 1204 1214 N
+ CH ER CH s n/a 9 1190 1204 1214 N
+ CH ER D e n/a 9 1190 1206 1215 N
+ CH ER D i n/a 9 1190 1206 1215 N
+ CH ER D s n/a 9 1190 1206 1215 N
+ CH ER DH e n/a 9 1190 1206 1215 N
+ CH ER DH s n/a 9 1190 1206 1215 N
+ CH ER EH b n/a 9 1190 1198 1218 N
+ CH ER EH e n/a 9 1190 1200 1221 N
+ CH ER EH i n/a 9 1190 1200 1220 N
+ CH ER EH s n/a 9 1190 1200 1220 N
+ CH ER ER b n/a 9 1190 1202 1224 N
+ CH ER ER e n/a 9 1190 1202 1224 N
+ CH ER ER i n/a 9 1190 1202 1224 N
+ CH ER ER s n/a 9 1190 1202 1224 N
+ CH ER EY b n/a 9 1190 1198 1218 N
+ CH ER EY e n/a 9 1190 1200 1221 N
+ CH ER EY i n/a 9 1190 1200 1220 N
+ CH ER EY s n/a 9 1190 1200 1220 N
+ CH ER F e n/a 9 1190 1205 1208 N
+ CH ER F i n/a 9 1190 1205 1208 N
+ CH ER F s n/a 9 1190 1205 1208 N
+ CH ER G e n/a 9 1190 1205 1211 N
+ CH ER G i n/a 9 1190 1205 1211 N
+ CH ER G s n/a 9 1190 1205 1211 N
+ CH ER HH e n/a 9 1190 1204 1213 N
+ CH ER HH i n/a 9 1190 1204 1213 N
+ CH ER HH s n/a 9 1190 1204 1213 N
+ CH ER IH b n/a 9 1190 1198 1220 N
+ CH ER IH e n/a 9 1190 1200 1221 N
+ CH ER IH i n/a 9 1190 1200 1220 N
+ CH ER IH s n/a 9 1190 1200 1220 N
+ CH ER IY b n/a 9 1190 1198 1219 N
+ CH ER IY e n/a 9 1190 1200 1219 N
+ CH ER IY i n/a 9 1190 1200 1219 N
+ CH ER IY s n/a 9 1190 1200 1219 N
+ CH ER JH e n/a 9 1190 1204 1214 N
+ CH ER JH s n/a 9 1190 1204 1214 N
+ CH ER K e n/a 9 1190 1205 1211 N
+ CH ER K i n/a 9 1190 1205 1211 N
+ CH ER K s n/a 9 1190 1205 1211 N
+ CH ER L b n/a 9 1190 1204 1212 N
+ CH ER L e n/a 9 1190 1204 1212 N
+ CH ER L i n/a 9 1190 1204 1212 N
+ CH ER L s n/a 9 1190 1204 1212 N
+ CH ER M e n/a 9 1190 1205 1212 N
+ CH ER M i n/a 9 1190 1205 1212 N
+ CH ER M s n/a 9 1190 1205 1212 N
+ CH ER N e n/a 9 1190 1206 1215 N
+ CH ER N i n/a 9 1190 1206 1215 N
+ CH ER N s n/a 9 1190 1206 1215 N
+ CH ER NG e n/a 9 1190 1205 1208 N
+ CH ER NG s n/a 9 1190 1205 1208 N
+ CH ER OW b n/a 9 1190 1202 1222 N
+ CH ER OW e n/a 9 1190 1202 1222 N
+ CH ER OW i n/a 9 1190 1202 1222 N
+ CH ER OW s n/a 9 1190 1202 1222 N
+ CH ER OY b n/a 9 1190 1203 1223 N
+ CH ER OY e n/a 9 1190 1203 1222 N
+ CH ER OY s n/a 9 1190 1203 1222 N
+ CH ER P e n/a 9 1190 1205 1211 N
+ CH ER P s n/a 9 1190 1205 1211 N
+ CH ER R b n/a 9 1190 1205 1209 N
+ CH ER R e n/a 9 1190 1205 1209 N
+ CH ER R s n/a 9 1190 1205 1209 N
+ CH ER S e n/a 9 1190 1206 1214 N
+ CH ER S s n/a 9 1190 1206 1214 N
+ CH ER SH e n/a 9 1190 1204 1214 N
+ CH ER SH s n/a 9 1190 1204 1214 N
+ CH ER SIL e n/a 9 1190 1204 1210 N
+ CH ER SIL s n/a 9 1190 1204 1210 N
+ CH ER T e n/a 9 1190 1206 1216 N
+ CH ER T i n/a 9 1190 1206 1216 N
+ CH ER T s n/a 9 1190 1206 1216 N
+ CH ER TH e n/a 9 1190 1206 1215 N
+ CH ER TH s n/a 9 1190 1206 1215 N
+ CH ER UH b n/a 9 1190 1202 1224 N
+ CH ER UH e n/a 9 1190 1202 1224 N
+ CH ER UH i n/a 9 1190 1202 1224 N
+ CH ER UH s n/a 9 1190 1202 1224 N
+ CH ER UW b n/a 9 1190 1202 1225 N
+ CH ER UW e n/a 9 1190 1202 1225 N
+ CH ER UW i n/a 9 1190 1202 1225 N
+ CH ER UW s n/a 9 1190 1202 1225 N
+ CH ER V e n/a 9 1190 1205 1208 N
+ CH ER V s n/a 9 1190 1205 1208 N
+ CH ER W b n/a 9 1190 1205 1209 N
+ CH ER W e n/a 9 1190 1205 1209 N
+ CH ER W i n/a 9 1190 1205 1209 N
+ CH ER W s n/a 9 1190 1205 1209 N
+ CH ER Y b n/a 9 1190 1204 1213 N
+ CH ER Y e n/a 9 1190 1204 1213 N
+ CH ER Y i n/a 9 1190 1204 1213 N
+ CH ER Y s n/a 9 1190 1204 1213 N
+ CH ER Z e n/a 9 1190 1206 1215 N
+ CH ER Z s n/a 9 1190 1206 1215 N
+ CH ER ZH e n/a 9 1190 1204 1214 N
+ CH ER ZH s n/a 9 1190 1204 1214 N
+ CH EY AA b n/a 9 1191 1203 1223 N
+ CH EY AA e n/a 9 1191 1203 1222 N
+ CH EY AA s n/a 9 1191 1203 1222 N
+ CH EY AE b n/a 9 1191 1198 1218 N
+ CH EY AE e n/a 9 1191 1200 1217 N
+ CH EY AE s n/a 9 1191 1200 1220 N
+ CH EY AH b n/a 9 1191 1198 1217 N
+ CH EY AH e n/a 9 1191 1200 1217 N
+ CH EY AH i n/a 9 1191 1200 1220 N
+ CH EY AH s n/a 9 1191 1200 1220 N
+ CH EY AO b n/a 9 1191 1203 1223 N
+ CH EY AO e n/a 9 1191 1203 1222 N
+ CH EY AO s n/a 9 1191 1203 1222 N
+ CH EY AW b n/a 9 1191 1198 1218 N
+ CH EY AW e n/a 9 1191 1200 1217 N
+ CH EY AW s n/a 9 1191 1200 1220 N
+ CH EY AY b n/a 9 1191 1203 1223 N
+ CH EY AY e n/a 9 1191 1203 1222 N
+ CH EY AY i n/a 9 1191 1203 1222 N
+ CH EY AY s n/a 9 1191 1203 1222 N
+ CH EY B e n/a 9 1191 1205 1211 N
+ CH EY B i n/a 9 1191 1205 1211 N
+ CH EY B s n/a 9 1191 1205 1211 N
+ CH EY CH e n/a 9 1191 1204 1214 N
+ CH EY CH s n/a 9 1191 1204 1214 N
+ CH EY D e n/a 9 1191 1206 1215 N
+ CH EY D i n/a 9 1191 1206 1215 N
+ CH EY D s n/a 9 1191 1206 1215 N
+ CH EY DH e n/a 9 1191 1206 1215 N
+ CH EY DH s n/a 9 1191 1206 1215 N
+ CH EY EH b n/a 9 1191 1198 1218 N
+ CH EY EH e n/a 9 1191 1200 1218 N
+ CH EY EH i n/a 9 1191 1200 1220 N
+ CH EY EH s n/a 9 1191 1200 1220 N
+ CH EY ER b n/a 9 1191 1202 1224 N
+ CH EY ER e n/a 9 1191 1202 1224 N
+ CH EY ER i n/a 9 1191 1202 1224 N
+ CH EY ER s n/a 9 1191 1202 1224 N
+ CH EY EY b n/a 9 1191 1198 1218 N
+ CH EY EY e n/a 9 1191 1199 1218 N
+ CH EY EY i n/a 9 1191 1199 1220 N
+ CH EY EY s n/a 9 1191 1199 1220 N
+ CH EY F e n/a 9 1191 1205 1208 N
+ CH EY F s n/a 9 1191 1205 1208 N
+ CH EY G e n/a 9 1191 1205 1211 N
+ CH EY G s n/a 9 1191 1205 1211 N
+ CH EY HH e n/a 9 1191 1204 1213 N
+ CH EY HH s n/a 9 1191 1204 1213 N
+ CH EY IH b n/a 9 1191 1198 1220 N
+ CH EY IH e n/a 9 1191 1200 1221 N
+ CH EY IH i n/a 9 1191 1200 1220 N
+ CH EY IH s n/a 9 1191 1200 1220 N
+ CH EY IY b n/a 9 1191 1198 1219 N
+ CH EY IY e n/a 9 1191 1199 1219 N
+ CH EY IY s n/a 9 1191 1199 1219 N
+ CH EY JH e n/a 9 1191 1204 1214 N
+ CH EY JH i n/a 9 1191 1204 1214 N
+ CH EY JH s n/a 9 1191 1204 1214 N
+ CH EY K e n/a 9 1191 1205 1211 N
+ CH EY K i n/a 9 1191 1205 1211 N
+ CH EY K s n/a 9 1191 1205 1211 N
+ CH EY L b n/a 9 1191 1204 1212 N
+ CH EY L e n/a 9 1191 1204 1212 N
+ CH EY L s n/a 9 1191 1204 1212 N
+ CH EY M e n/a 9 1191 1205 1212 N
+ CH EY M s n/a 9 1191 1205 1212 N
+ CH EY N e n/a 9 1191 1206 1215 N
+ CH EY N s n/a 9 1191 1206 1215 N
+ CH EY NG e n/a 9 1191 1205 1208 N
+ CH EY NG s n/a 9 1191 1205 1208 N
+ CH EY OW b n/a 9 1191 1202 1222 N
+ CH EY OW e n/a 9 1191 1202 1222 N
+ CH EY OW s n/a 9 1191 1202 1222 N
+ CH EY OY b n/a 9 1191 1203 1223 N
+ CH EY OY e n/a 9 1191 1203 1222 N
+ CH EY OY s n/a 9 1191 1203 1222 N
+ CH EY P e n/a 9 1191 1205 1211 N
+ CH EY P s n/a 9 1191 1205 1211 N
+ CH EY R b n/a 9 1191 1205 1209 N
+ CH EY R e n/a 9 1191 1205 1209 N
+ CH EY R s n/a 9 1191 1205 1209 N
+ CH EY S e n/a 9 1191 1206 1214 N
+ CH EY S i n/a 9 1191 1206 1214 N
+ CH EY S s n/a 9 1191 1206 1214 N
+ CH EY SH e n/a 9 1191 1204 1214 N
+ CH EY SH s n/a 9 1191 1204 1214 N
+ CH EY SIL e n/a 9 1191 1204 1210 N
+ CH EY SIL s n/a 9 1191 1204 1210 N
+ CH EY T e n/a 9 1191 1206 1216 N
+ CH EY T s n/a 9 1191 1206 1216 N
+ CH EY TH e n/a 9 1191 1206 1215 N
+ CH EY TH s n/a 9 1191 1206 1215 N
+ CH EY UH b n/a 9 1191 1202 1224 N
+ CH EY UH e n/a 9 1191 1202 1224 N
+ CH EY UH s n/a 9 1191 1202 1224 N
+ CH EY UW b n/a 9 1191 1202 1225 N
+ CH EY UW e n/a 9 1191 1202 1225 N
+ CH EY UW s n/a 9 1191 1202 1225 N
+ CH EY V e n/a 9 1191 1205 1208 N
+ CH EY V s n/a 9 1191 1205 1208 N
+ CH EY W b n/a 9 1191 1205 1209 N
+ CH EY W e n/a 9 1191 1205 1209 N
+ CH EY W s n/a 9 1191 1205 1209 N
+ CH EY Y b n/a 9 1191 1204 1213 N
+ CH EY Y e n/a 9 1191 1204 1213 N
+ CH EY Y s n/a 9 1191 1204 1213 N
+ CH EY Z e n/a 9 1191 1206 1215 N
+ CH EY Z s n/a 9 1191 1206 1215 N
+ CH EY ZH e n/a 9 1191 1204 1214 N
+ CH EY ZH s n/a 9 1191 1204 1214 N
+ CH F AA b n/a 9 1194 1203 1223 N
+ CH F AA s n/a 9 1194 1203 1222 N
+ CH F AE b n/a 9 1194 1198 1218 N
+ CH F AE s n/a 9 1194 1198 1220 N
+ CH F AH b n/a 9 1194 1198 1217 N
+ CH F AH i n/a 9 1194 1198 1221 N
+ CH F AH s n/a 9 1194 1198 1220 N
+ CH F AO b n/a 9 1194 1203 1223 N
+ CH F AO s n/a 9 1194 1203 1222 N
+ CH F AW b n/a 9 1194 1198 1218 N
+ CH F AW s n/a 9 1194 1198 1220 N
+ CH F AY b n/a 9 1194 1203 1223 N
+ CH F AY s n/a 9 1194 1203 1222 N
+ CH F B s n/a 9 1194 1205 1211 N
+ CH F CH s n/a 9 1194 1204 1214 N
+ CH F D s n/a 9 1194 1206 1215 N
+ CH F DH s n/a 9 1194 1206 1215 N
+ CH F EH b n/a 9 1194 1198 1218 N
+ CH F EH s n/a 9 1194 1198 1220 N
+ CH F ER b n/a 9 1194 1202 1224 N
+ CH F ER s n/a 9 1194 1202 1224 N
+ CH F EY b n/a 9 1194 1198 1218 N
+ CH F EY i n/a 9 1194 1198 1221 N
+ CH F EY s n/a 9 1194 1198 1220 N
+ CH F F s n/a 9 1194 1205 1208 N
+ CH F G s n/a 9 1194 1205 1211 N
+ CH F HH s n/a 9 1194 1204 1213 N
+ CH F IH b n/a 9 1194 1198 1220 N
+ CH F IH s n/a 9 1194 1198 1220 N
+ CH F IY b n/a 9 1194 1198 1219 N
+ CH F IY s n/a 9 1194 1198 1219 N
+ CH F JH s n/a 9 1194 1204 1214 N
+ CH F K s n/a 9 1194 1205 1211 N
+ CH F L b n/a 9 1194 1204 1212 N
+ CH F L s n/a 9 1194 1204 1212 N
+ CH F M s n/a 9 1194 1205 1212 N
+ CH F N s n/a 9 1194 1206 1215 N
+ CH F NG s n/a 9 1194 1205 1208 N
+ CH F OW b n/a 9 1194 1202 1222 N
+ CH F OW s n/a 9 1194 1202 1222 N
+ CH F OY b n/a 9 1194 1203 1223 N
+ CH F OY s n/a 9 1194 1203 1222 N
+ CH F P s n/a 9 1194 1205 1211 N
+ CH F R b n/a 9 1194 1205 1209 N
+ CH F R s n/a 9 1194 1205 1209 N
+ CH F S s n/a 9 1194 1206 1214 N
+ CH F SH s n/a 9 1194 1204 1214 N
+ CH F SIL s n/a 9 1194 1204 1210 N
+ CH F T s n/a 9 1194 1206 1216 N
+ CH F TH s n/a 9 1194 1206 1215 N
+ CH F UH b n/a 9 1194 1202 1224 N
+ CH F UH s n/a 9 1194 1202 1224 N
+ CH F UW b n/a 9 1194 1202 1225 N
+ CH F UW s n/a 9 1194 1202 1225 N
+ CH F V s n/a 9 1194 1205 1208 N
+ CH F W b n/a 9 1194 1205 1209 N
+ CH F W s n/a 9 1194 1205 1209 N
+ CH F Y b n/a 9 1194 1204 1213 N
+ CH F Y s n/a 9 1194 1204 1213 N
+ CH F Z s n/a 9 1194 1206 1215 N
+ CH F ZH s n/a 9 1194 1204 1214 N
+ CH G AA b n/a 9 1195 1203 1223 N
+ CH G AA s n/a 9 1195 1203 1222 N
+ CH G AE b n/a 9 1195 1198 1218 N
+ CH G AE s n/a 9 1195 1198 1220 N
+ CH G AH b n/a 9 1195 1198 1217 N
+ CH G AH s n/a 9 1195 1198 1220 N
+ CH G AO b n/a 9 1195 1203 1223 N
+ CH G AO s n/a 9 1195 1203 1222 N
+ CH G AW b n/a 9 1195 1198 1218 N
+ CH G AW s n/a 9 1195 1198 1220 N
+ CH G AY b n/a 9 1195 1203 1223 N
+ CH G AY s n/a 9 1195 1203 1222 N
+ CH G B s n/a 9 1195 1206 1211 N
+ CH G CH s n/a 9 1195 1206 1214 N
+ CH G D s n/a 9 1195 1206 1215 N
+ CH G DH s n/a 9 1195 1206 1215 N
+ CH G EH b n/a 9 1195 1198 1218 N
+ CH G EH s n/a 9 1195 1198 1220 N
+ CH G ER b n/a 9 1195 1202 1224 N
+ CH G ER s n/a 9 1195 1202 1224 N
+ CH G EY b n/a 9 1195 1198 1218 N
+ CH G EY s n/a 9 1195 1198 1220 N
+ CH G F s n/a 9 1195 1206 1208 N
+ CH G G s n/a 9 1195 1206 1211 N
+ CH G HH s n/a 9 1195 1206 1213 N
+ CH G IH b n/a 9 1195 1198 1220 N
+ CH G IH s n/a 9 1195 1198 1220 N
+ CH G IY b n/a 9 1195 1198 1219 N
+ CH G IY s n/a 9 1195 1198 1219 N
+ CH G JH s n/a 9 1195 1206 1214 N
+ CH G K s n/a 9 1195 1206 1211 N
+ CH G L b n/a 9 1195 1206 1212 N
+ CH G L s n/a 9 1195 1206 1212 N
+ CH G M s n/a 9 1195 1206 1212 N
+ CH G N s n/a 9 1195 1206 1215 N
+ CH G NG s n/a 9 1195 1206 1208 N
+ CH G OW b n/a 9 1195 1202 1222 N
+ CH G OW s n/a 9 1195 1202 1222 N
+ CH G OY b n/a 9 1195 1203 1223 N
+ CH G OY s n/a 9 1195 1203 1222 N
+ CH G P s n/a 9 1195 1206 1211 N
+ CH G R b n/a 9 1195 1206 1209 N
+ CH G R s n/a 9 1195 1206 1209 N
+ CH G S s n/a 9 1195 1206 1214 N
+ CH G SH s n/a 9 1195 1206 1214 N
+ CH G SIL s n/a 9 1195 1204 1210 N
+ CH G T s n/a 9 1195 1206 1216 N
+ CH G TH s n/a 9 1195 1206 1215 N
+ CH G UH b n/a 9 1195 1202 1224 N
+ CH G UH s n/a 9 1195 1202 1224 N
+ CH G UW b n/a 9 1195 1202 1225 N
+ CH G UW s n/a 9 1195 1202 1225 N
+ CH G V s n/a 9 1195 1206 1208 N
+ CH G W b n/a 9 1195 1206 1209 N
+ CH G W s n/a 9 1195 1206 1209 N
+ CH G Y b n/a 9 1195 1206 1213 N
+ CH G Y s n/a 9 1195 1206 1213 N
+ CH G Z s n/a 9 1195 1206 1215 N
+ CH G ZH s n/a 9 1195 1206 1214 N
+ CH HH AA b n/a 9 1195 1203 1223 N
+ CH HH AA s n/a 9 1195 1203 1222 N
+ CH HH AE b n/a 9 1195 1198 1218 N
+ CH HH AE s n/a 9 1195 1198 1220 N
+ CH HH AH b n/a 9 1195 1198 1217 N
+ CH HH AH s n/a 9 1195 1198 1220 N
+ CH HH AO b n/a 9 1195 1203 1223 N
+ CH HH AO s n/a 9 1195 1203 1222 N
+ CH HH AW b n/a 9 1195 1198 1218 N
+ CH HH AW s n/a 9 1195 1198 1220 N
+ CH HH AY b n/a 9 1195 1203 1223 N
+ CH HH AY s n/a 9 1195 1203 1222 N
+ CH HH B s n/a 9 1195 1205 1211 N
+ CH HH CH s n/a 9 1195 1204 1214 N
+ CH HH D s n/a 9 1195 1206 1215 N
+ CH HH DH s n/a 9 1195 1206 1215 N
+ CH HH EH b n/a 9 1195 1198 1218 N
+ CH HH EH s n/a 9 1195 1198 1220 N
+ CH HH ER b n/a 9 1195 1202 1224 N
+ CH HH ER s n/a 9 1195 1202 1224 N
+ CH HH EY b n/a 9 1195 1198 1218 N
+ CH HH EY s n/a 9 1195 1198 1220 N
+ CH HH F s n/a 9 1195 1205 1208 N
+ CH HH G s n/a 9 1195 1205 1211 N
+ CH HH HH s n/a 9 1195 1204 1213 N
+ CH HH IH b n/a 9 1195 1198 1220 N
+ CH HH IH s n/a 9 1195 1198 1220 N
+ CH HH IY b n/a 9 1195 1198 1219 N
+ CH HH IY i n/a 9 1196 1198 1219 N
+ CH HH IY s n/a 9 1195 1198 1219 N
+ CH HH JH s n/a 9 1195 1204 1214 N
+ CH HH K s n/a 9 1195 1205 1211 N
+ CH HH L b n/a 9 1195 1204 1212 N
+ CH HH L s n/a 9 1195 1204 1212 N
+ CH HH M s n/a 9 1195 1205 1212 N
+ CH HH N s n/a 9 1195 1206 1215 N
+ CH HH NG s n/a 9 1195 1205 1208 N
+ CH HH OW b n/a 9 1195 1202 1222 N
+ CH HH OW s n/a 9 1195 1202 1222 N
+ CH HH OY b n/a 9 1195 1203 1223 N
+ CH HH OY s n/a 9 1195 1203 1222 N
+ CH HH P s n/a 9 1195 1205 1211 N
+ CH HH R b n/a 9 1195 1205 1209 N
+ CH HH R s n/a 9 1195 1205 1209 N
+ CH HH S s n/a 9 1195 1206 1214 N
+ CH HH SH s n/a 9 1195 1204 1214 N
+ CH HH SIL s n/a 9 1195 1204 1210 N
+ CH HH T s n/a 9 1195 1206 1216 N
+ CH HH TH s n/a 9 1195 1206 1215 N
+ CH HH UH b n/a 9 1195 1202 1224 N
+ CH HH UH s n/a 9 1195 1202 1224 N
+ CH HH UW b n/a 9 1195 1202 1225 N
+ CH HH UW s n/a 9 1195 1202 1225 N
+ CH HH V s n/a 9 1195 1205 1208 N
+ CH HH W b n/a 9 1195 1205 1209 N
+ CH HH W s n/a 9 1195 1205 1209 N
+ CH HH Y b n/a 9 1195 1204 1213 N
+ CH HH Y s n/a 9 1195 1204 1213 N
+ CH HH Z s n/a 9 1195 1206 1215 N
+ CH HH ZH s n/a 9 1195 1204 1214 N
+ CH IH AA b n/a 9 1193 1203 1223 N
+ CH IH AA e n/a 9 1192 1203 1222 N
+ CH IH AA i n/a 9 1193 1203 1222 N
+ CH IH AA s n/a 9 1193 1203 1222 N
+ CH IH AE b n/a 9 1193 1198 1218 N
+ CH IH AE e n/a 9 1192 1199 1221 N
+ CH IH AE i n/a 9 1193 1199 1220 N
+ CH IH AE s n/a 9 1193 1199 1220 N
+ CH IH AH b n/a 9 1193 1198 1217 N
+ CH IH AH e n/a 9 1192 1199 1221 N
+ CH IH AH i n/a 9 1193 1199 1220 N
+ CH IH AH s n/a 9 1193 1199 1220 N
+ CH IH AO b n/a 9 1193 1203 1223 N
+ CH IH AO e n/a 9 1192 1203 1222 N
+ CH IH AO s n/a 9 1193 1203 1222 N
+ CH IH AW b n/a 9 1193 1198 1218 N
+ CH IH AW e n/a 9 1192 1199 1221 N
+ CH IH AW s n/a 9 1193 1199 1220 N
+ CH IH AY b n/a 9 1193 1203 1223 N
+ CH IH AY e n/a 9 1192 1203 1222 N
+ CH IH AY i n/a 9 1193 1203 1222 N
+ CH IH AY s n/a 9 1193 1203 1222 N
+ CH IH B e n/a 9 1192 1199 1211 N
+ CH IH B i n/a 9 1193 1199 1211 N
+ CH IH B s n/a 9 1193 1199 1211 N
+ CH IH CH e n/a 9 1192 1199 1214 N
+ CH IH CH s n/a 9 1193 1199 1214 N
+ CH IH D e n/a 9 1192 1207 1215 N
+ CH IH D i n/a 9 1193 1207 1215 N
+ CH IH D s n/a 9 1193 1207 1215 N
+ CH IH DH e n/a 9 1192 1207 1215 N
+ CH IH DH s n/a 9 1193 1207 1215 N
+ CH IH EH b n/a 9 1193 1198 1218 N
+ CH IH EH e n/a 9 1192 1199 1221 N
+ CH IH EH i n/a 9 1193 1199 1220 N
+ CH IH EH s n/a 9 1193 1199 1220 N
+ CH IH ER b n/a 9 1193 1202 1224 N
+ CH IH ER e n/a 9 1192 1202 1224 N
+ CH IH ER i n/a 9 1193 1202 1224 N
+ CH IH ER s n/a 9 1193 1202 1224 N
+ CH IH EY b n/a 9 1193 1198 1218 N
+ CH IH EY e n/a 9 1192 1199 1221 N
+ CH IH EY s n/a 9 1193 1199 1220 N
+ CH IH F e n/a 9 1192 1199 1208 N
+ CH IH F i n/a 9 1193 1199 1208 N
+ CH IH F s n/a 9 1193 1199 1208 N
+ CH IH G e n/a 9 1192 1199 1211 N
+ CH IH G s n/a 9 1193 1199 1211 N
+ CH IH HH e n/a 9 1192 1199 1213 N
+ CH IH HH i n/a 9 1193 1199 1213 N
+ CH IH HH s n/a 9 1193 1199 1213 N
+ CH IH IH b n/a 9 1193 1198 1220 N
+ CH IH IH e n/a 9 1192 1199 1221 N
+ CH IH IH i n/a 9 1193 1199 1220 N
+ CH IH IH s n/a 9 1193 1199 1220 N
+ CH IH IY b n/a 9 1193 1198 1219 N
+ CH IH IY e n/a 9 1192 1199 1219 N
+ CH IH IY i n/a 9 1193 1199 1219 N
+ CH IH IY s n/a 9 1193 1199 1219 N
+ CH IH JH e n/a 9 1192 1199 1214 N
+ CH IH JH s n/a 9 1193 1199 1214 N
+ CH IH K e n/a 9 1192 1199 1211 N
+ CH IH K i n/a 9 1193 1199 1211 N
+ CH IH K s n/a 9 1193 1199 1211 N
+ CH IH L b n/a 9 1193 1203 1212 N
+ CH IH L e n/a 9 1192 1203 1212 N
+ CH IH L i n/a 9 1193 1203 1212 N
+ CH IH L s n/a 9 1193 1203 1212 N
+ CH IH M e n/a 9 1192 1199 1212 N
+ CH IH M i n/a 9 1193 1199 1212 N
+ CH IH M s n/a 9 1193 1199 1212 N
+ CH IH N e n/a 9 1192 1207 1215 N
+ CH IH N i n/a 9 1193 1207 1215 N
+ CH IH N s n/a 9 1193 1207 1215 N
+ CH IH NG e n/a 9 1192 1199 1208 N
+ CH IH NG s n/a 9 1193 1199 1208 N
+ CH IH OW b n/a 9 1193 1202 1222 N
+ CH IH OW e n/a 9 1192 1202 1222 N
+ CH IH OW i n/a 9 1193 1202 1222 N
+ CH IH OW s n/a 9 1193 1202 1222 N
+ CH IH OY b n/a 9 1193 1203 1223 N
+ CH IH OY e n/a 9 1192 1203 1222 N
+ CH IH OY s n/a 9 1193 1203 1222 N
+ CH IH P e n/a 9 1192 1199 1211 N
+ CH IH P i n/a 9 1193 1199 1211 N
+ CH IH P s n/a 9 1193 1199 1211 N
+ CH IH R b n/a 9 1193 1203 1209 N
+ CH IH R e n/a 9 1192 1203 1209 N
+ CH IH R s n/a 9 1193 1203 1209 N
+ CH IH S e n/a 9 1192 1207 1214 N
+ CH IH S i n/a 9 1193 1207 1214 N
+ CH IH S s n/a 9 1193 1207 1214 N
+ CH IH SH e n/a 9 1192 1199 1214 N
+ CH IH SH s n/a 9 1193 1199 1214 N
+ CH IH SIL e n/a 9 1193 1204 1210 N
+ CH IH SIL s n/a 9 1193 1204 1210 N
+ CH IH T e n/a 9 1192 1207 1216 N
+ CH IH T i n/a 9 1193 1207 1216 N
+ CH IH T s n/a 9 1193 1207 1216 N
+ CH IH TH e n/a 9 1192 1207 1215 N
+ CH IH TH i n/a 9 1193 1207 1215 N
+ CH IH TH s n/a 9 1193 1207 1215 N
+ CH IH UH b n/a 9 1193 1202 1224 N
+ CH IH UH e n/a 9 1192 1202 1224 N
+ CH IH UH i n/a 9 1193 1202 1224 N
+ CH IH UH s n/a 9 1193 1202 1224 N
+ CH IH UW b n/a 9 1193 1202 1225 N
+ CH IH UW e n/a 9 1192 1202 1225 N
+ CH IH UW i n/a 9 1193 1202 1225 N
+ CH IH UW s n/a 9 1193 1202 1225 N
+ CH IH V e n/a 9 1192 1199 1208 N
+ CH IH V s n/a 9 1193 1199 1208 N
+ CH IH W b n/a 9 1193 1203 1209 N
+ CH IH W e n/a 9 1192 1203 1209 N
+ CH IH W i n/a 9 1193 1203 1209 N
+ CH IH W s n/a 9 1193 1203 1209 N
+ CH IH Y b n/a 9 1193 1198 1213 N
+ CH IH Y e n/a 9 1192 1199 1213 N
+ CH IH Y s n/a 9 1193 1199 1213 N
+ CH IH Z e n/a 9 1192 1207 1215 N
+ CH IH Z s n/a 9 1193 1207 1215 N
+ CH IH ZH e n/a 9 1192 1199 1214 N
+ CH IH ZH s n/a 9 1193 1199 1214 N
+ CH IY AA b n/a 9 1191 1203 1223 N
+ CH IY AA e n/a 9 1191 1203 1222 N
+ CH IY AA i n/a 9 1191 1203 1222 N
+ CH IY AA s n/a 9 1191 1203 1222 N
+ CH IY AE b n/a 9 1191 1198 1218 N
+ CH IY AE e n/a 9 1191 1199 1217 N
+ CH IY AE s n/a 9 1191 1199 1220 N
+ CH IY AH b n/a 9 1191 1198 1217 N
+ CH IY AH e n/a 9 1191 1199 1217 N
+ CH IY AH i n/a 9 1191 1199 1220 N
+ CH IY AH s n/a 9 1191 1199 1220 N
+ CH IY AO b n/a 9 1191 1203 1223 N
+ CH IY AO e n/a 9 1191 1203 1222 N
+ CH IY AO i n/a 9 1191 1203 1222 N
+ CH IY AO s n/a 9 1191 1203 1222 N
+ CH IY AW b n/a 9 1191 1198 1218 N
+ CH IY AW e n/a 9 1191 1199 1217 N
+ CH IY AW i n/a 9 1191 1199 1220 N
+ CH IY AW s n/a 9 1191 1199 1220 N
+ CH IY AY b n/a 9 1191 1203 1223 N
+ CH IY AY e n/a 9 1191 1203 1222 N
+ CH IY AY s n/a 9 1191 1203 1222 N
+ CH IY B e n/a 9 1191 1199 1211 N
+ CH IY B i n/a 9 1191 1199 1211 N
+ CH IY B s n/a 9 1191 1199 1211 N
+ CH IY CH e n/a 9 1191 1199 1214 N
+ CH IY CH s n/a 9 1191 1199 1214 N
+ CH IY D e n/a 9 1191 1207 1215 N
+ CH IY D i n/a 9 1191 1207 1215 N
+ CH IY D s n/a 9 1191 1207 1215 N
+ CH IY DH e n/a 9 1191 1207 1215 N
+ CH IY DH s n/a 9 1191 1207 1215 N
+ CH IY EH b n/a 9 1191 1198 1218 N
+ CH IY EH e n/a 9 1191 1199 1218 N
+ CH IY EH i n/a 9 1191 1199 1220 N
+ CH IY EH s n/a 9 1191 1199 1220 N
+ CH IY ER b n/a 9 1191 1202 1224 N
+ CH IY ER e n/a 9 1191 1202 1224 N
+ CH IY ER i n/a 9 1191 1202 1224 N
+ CH IY ER s n/a 9 1191 1202 1224 N
+ CH IY EY b n/a 9 1191 1198 1218 N
+ CH IY EY e n/a 9 1191 1199 1218 N
+ CH IY EY i n/a 9 1191 1199 1220 N
+ CH IY EY s n/a 9 1191 1199 1220 N
+ CH IY F e n/a 9 1191 1199 1208 N
+ CH IY F i n/a 9 1191 1199 1208 N
+ CH IY F s n/a 9 1191 1199 1208 N
+ CH IY G e n/a 9 1191 1199 1211 N
+ CH IY G s n/a 9 1191 1199 1211 N
+ CH IY HH e n/a 9 1191 1199 1213 N
+ CH IY HH i n/a 9 1191 1199 1213 N
+ CH IY HH s n/a 9 1191 1199 1213 N
+ CH IY IH b n/a 9 1191 1198 1220 N
+ CH IY IH e n/a 9 1191 1199 1221 N
+ CH IY IH i n/a 9 1191 1199 1220 N
+ CH IY IH s n/a 9 1191 1199 1220 N
+ CH IY IY b n/a 9 1191 1198 1219 N
+ CH IY IY e n/a 9 1191 1199 1219 N
+ CH IY IY i n/a 9 1191 1199 1219 N
+ CH IY IY s n/a 9 1191 1199 1219 N
+ CH IY JH e n/a 9 1191 1199 1214 N
+ CH IY JH s n/a 9 1191 1199 1214 N
+ CH IY K e n/a 9 1191 1199 1211 N
+ CH IY K i n/a 9 1191 1199 1211 N
+ CH IY K s n/a 9 1191 1199 1211 N
+ CH IY L b n/a 9 1191 1203 1212 N
+ CH IY L e n/a 9 1191 1203 1212 N
+ CH IY L i n/a 9 1191 1203 1212 N
+ CH IY L s n/a 9 1191 1203 1212 N
+ CH IY M e n/a 9 1191 1199 1212 N
+ CH IY M i n/a 9 1191 1199 1212 N
+ CH IY M s n/a 9 1191 1199 1212 N
+ CH IY N e n/a 9 1191 1207 1215 N
+ CH IY N i n/a 9 1191 1207 1215 N
+ CH IY N s n/a 9 1191 1207 1215 N
+ CH IY NG e n/a 9 1191 1199 1208 N
+ CH IY NG s n/a 9 1191 1199 1208 N
+ CH IY OW b n/a 9 1191 1202 1222 N
+ CH IY OW e n/a 9 1191 1202 1222 N
+ CH IY OW i n/a 9 1191 1202 1222 N
+ CH IY OW s n/a 9 1191 1202 1222 N
+ CH IY OY b n/a 9 1191 1203 1223 N
+ CH IY OY e n/a 9 1191 1203 1222 N
+ CH IY OY s n/a 9 1191 1203 1222 N
+ CH IY P e n/a 9 1191 1199 1211 N
+ CH IY P s n/a 9 1191 1199 1211 N
+ CH IY R b n/a 9 1191 1203 1209 N
+ CH IY R e n/a 9 1191 1203 1209 N
+ CH IY R i n/a 9 1191 1203 1208 N
+ CH IY R s n/a 9 1191 1203 1209 N
+ CH IY S e n/a 9 1191 1207 1214 N
+ CH IY S i n/a 9 1191 1207 1214 N
+ CH IY S s n/a 9 1191 1207 1214 N
+ CH IY SH e n/a 9 1191 1199 1214 N
+ CH IY SH s n/a 9 1191 1199 1214 N
+ CH IY SIL e n/a 9 1191 1204 1210 N
+ CH IY SIL s n/a 9 1191 1204 1210 N
+ CH IY T e n/a 9 1191 1207 1216 N
+ CH IY T i n/a 9 1191 1207 1216 N
+ CH IY T s n/a 9 1191 1207 1216 N
+ CH IY TH e n/a 9 1191 1207 1215 N
+ CH IY TH s n/a 9 1191 1207 1215 N
+ CH IY UH b n/a 9 1191 1202 1224 N
+ CH IY UH e n/a 9 1191 1202 1224 N
+ CH IY UH s n/a 9 1191 1202 1224 N
+ CH IY UW b n/a 9 1191 1202 1225 N
+ CH IY UW e n/a 9 1191 1202 1225 N
+ CH IY UW i n/a 9 1191 1202 1225 N
+ CH IY UW s n/a 9 1191 1202 1225 N
+ CH IY V e n/a 9 1191 1199 1208 N
+ CH IY V s n/a 9 1191 1199 1208 N
+ CH IY W b n/a 9 1191 1203 1209 N
+ CH IY W e n/a 9 1191 1203 1209 N
+ CH IY W i n/a 9 1191 1203 1209 N
+ CH IY W s n/a 9 1191 1203 1209 N
+ CH IY Y b n/a 9 1191 1198 1213 N
+ CH IY Y e n/a 9 1191 1199 1213 N
+ CH IY Y s n/a 9 1191 1199 1213 N
+ CH IY Z e n/a 9 1191 1207 1215 N
+ CH IY Z i n/a 9 1191 1207 1215 N
+ CH IY Z s n/a 9 1191 1207 1215 N
+ CH IY ZH e n/a 9 1191 1199 1214 N
+ CH IY ZH s n/a 9 1191 1199 1214 N
+ CH JH AA b n/a 9 1194 1203 1223 N
+ CH JH AA s n/a 9 1194 1203 1222 N
+ CH JH AE b n/a 9 1194 1198 1218 N
+ CH JH AE s n/a 9 1194 1198 1220 N
+ CH JH AH b n/a 9 1194 1198 1217 N
+ CH JH AH s n/a 9 1194 1198 1220 N
+ CH JH AO b n/a 9 1194 1203 1223 N
+ CH JH AO s n/a 9 1194 1203 1222 N
+ CH JH AW b n/a 9 1194 1198 1218 N
+ CH JH AW s n/a 9 1194 1198 1220 N
+ CH JH AY b n/a 9 1194 1203 1223 N
+ CH JH AY s n/a 9 1194 1203 1222 N
+ CH JH B s n/a 9 1194 1205 1211 N
+ CH JH CH s n/a 9 1194 1204 1214 N
+ CH JH D s n/a 9 1194 1206 1215 N
+ CH JH DH s n/a 9 1194 1206 1215 N
+ CH JH EH b n/a 9 1194 1198 1218 N
+ CH JH EH s n/a 9 1194 1198 1220 N
+ CH JH ER b n/a 9 1194 1202 1224 N
+ CH JH ER s n/a 9 1194 1202 1224 N
+ CH JH EY b n/a 9 1194 1198 1218 N
+ CH JH EY s n/a 9 1194 1198 1220 N
+ CH JH F s n/a 9 1194 1205 1208 N
+ CH JH G s n/a 9 1194 1205 1211 N
+ CH JH HH s n/a 9 1194 1204 1213 N
+ CH JH IH b n/a 9 1194 1198 1220 N
+ CH JH IH s n/a 9 1194 1198 1220 N
+ CH JH IY b n/a 9 1194 1198 1219 N
+ CH JH IY s n/a 9 1194 1198 1219 N
+ CH JH JH s n/a 9 1194 1204 1214 N
+ CH JH K s n/a 9 1194 1205 1211 N
+ CH JH L b n/a 9 1194 1204 1212 N
+ CH JH L s n/a 9 1194 1204 1212 N
+ CH JH M s n/a 9 1194 1205 1212 N
+ CH JH N s n/a 9 1194 1206 1215 N
+ CH JH NG s n/a 9 1194 1205 1208 N
+ CH JH OW b n/a 9 1194 1202 1222 N
+ CH JH OW s n/a 9 1194 1202 1222 N
+ CH JH OY b n/a 9 1194 1203 1223 N
+ CH JH OY s n/a 9 1194 1203 1222 N
+ CH JH P s n/a 9 1194 1205 1211 N
+ CH JH R b n/a 9 1194 1205 1209 N
+ CH JH R s n/a 9 1194 1205 1209 N
+ CH JH S s n/a 9 1194 1206 1214 N
+ CH JH SH s n/a 9 1194 1204 1214 N
+ CH JH SIL s n/a 9 1194 1204 1210 N
+ CH JH T s n/a 9 1194 1206 1216 N
+ CH JH TH s n/a 9 1194 1206 1215 N
+ CH JH UH b n/a 9 1194 1202 1224 N
+ CH JH UH s n/a 9 1194 1202 1224 N
+ CH JH UW b n/a 9 1194 1202 1225 N
+ CH JH UW s n/a 9 1194 1202 1225 N
+ CH JH V s n/a 9 1194 1205 1208 N
+ CH JH W b n/a 9 1194 1205 1209 N
+ CH JH W s n/a 9 1194 1205 1209 N
+ CH JH Y b n/a 9 1194 1204 1213 N
+ CH JH Y s n/a 9 1194 1204 1213 N
+ CH JH Z s n/a 9 1194 1206 1215 N
+ CH JH ZH s n/a 9 1194 1204 1214 N
+ CH K AA b n/a 9 1195 1201 1223 N
+ CH K AA s n/a 9 1195 1201 1222 N
+ CH K AE b n/a 9 1195 1198 1218 N
+ CH K AE s n/a 9 1195 1198 1220 N
+ CH K AH b n/a 9 1195 1198 1217 N
+ CH K AH i n/a 9 1196 1198 1220 N
+ CH K AH s n/a 9 1195 1198 1220 N
+ CH K AO b n/a 9 1195 1201 1223 N
+ CH K AO s n/a 9 1195 1201 1222 N
+ CH K AW b n/a 9 1195 1198 1218 N
+ CH K AW s n/a 9 1195 1198 1220 N
+ CH K AY b n/a 9 1195 1201 1223 N
+ CH K AY s n/a 9 1195 1201 1222 N
+ CH K B s n/a 9 1195 1206 1211 N
+ CH K CH s n/a 9 1195 1206 1214 N
+ CH K D s n/a 9 1195 1206 1215 N
+ CH K DH s n/a 9 1195 1206 1215 N
+ CH K EH b n/a 9 1195 1198 1218 N
+ CH K EH i n/a 9 1196 1198 1220 N
+ CH K EH s n/a 9 1195 1198 1220 N
+ CH K ER b n/a 9 1195 1201 1224 N
+ CH K ER i n/a 9 1196 1201 1224 N
+ CH K ER s n/a 9 1195 1201 1224 N
+ CH K EY b n/a 9 1195 1198 1218 N
+ CH K EY i n/a 9 1196 1198 1220 N
+ CH K EY s n/a 9 1195 1198 1220 N
+ CH K F s n/a 9 1195 1206 1208 N
+ CH K G s n/a 9 1195 1206 1211 N
+ CH K HH s n/a 9 1195 1206 1213 N
+ CH K IH b n/a 9 1195 1198 1220 N
+ CH K IH s n/a 9 1195 1198 1220 N
+ CH K IY b n/a 9 1195 1198 1219 N
+ CH K IY i n/a 9 1196 1198 1219 N
+ CH K IY s n/a 9 1195 1198 1219 N
+ CH K JH s n/a 9 1195 1206 1214 N
+ CH K K s n/a 9 1195 1206 1211 N
+ CH K L b n/a 9 1195 1206 1212 N
+ CH K L i n/a 9 1196 1206 1212 N
+ CH K L s n/a 9 1195 1206 1212 N
+ CH K M s n/a 9 1195 1206 1212 N
+ CH K N s n/a 9 1195 1206 1215 N
+ CH K NG s n/a 9 1195 1206 1208 N
+ CH K OW b n/a 9 1195 1201 1222 N
+ CH K OW i n/a 9 1196 1201 1222 N
+ CH K OW s n/a 9 1195 1201 1222 N
+ CH K OY b n/a 9 1195 1201 1223 N
+ CH K OY s n/a 9 1195 1201 1222 N
+ CH K P s n/a 9 1195 1206 1211 N
+ CH K R b n/a 9 1195 1206 1209 N
+ CH K R i n/a 9 1196 1206 1208 N
+ CH K R s n/a 9 1195 1206 1209 N
+ CH K S s n/a 9 1195 1206 1214 N
+ CH K SH s n/a 9 1195 1206 1214 N
+ CH K SIL s n/a 9 1195 1204 1210 N
+ CH K T s n/a 9 1195 1206 1216 N
+ CH K TH s n/a 9 1195 1206 1215 N
+ CH K UH b n/a 9 1195 1201 1224 N
+ CH K UH s n/a 9 1195 1201 1224 N
+ CH K UW b n/a 9 1195 1201 1225 N
+ CH K UW i n/a 9 1196 1201 1225 N
+ CH K UW s n/a 9 1195 1201 1225 N
+ CH K V s n/a 9 1195 1206 1208 N
+ CH K W b n/a 9 1195 1206 1209 N
+ CH K W i n/a 9 1196 1206 1209 N
+ CH K W s n/a 9 1195 1206 1209 N
+ CH K Y b n/a 9 1195 1206 1213 N
+ CH K Y s n/a 9 1195 1206 1213 N
+ CH K Z s n/a 9 1195 1206 1215 N
+ CH K ZH s n/a 9 1195 1206 1214 N
+ CH L AA b n/a 9 1191 1203 1223 N
+ CH L AA e n/a 9 1188 1203 1222 N
+ CH L AA i n/a 9 1188 1203 1222 N
+ CH L AA s n/a 9 1188 1203 1222 N
+ CH L AE b n/a 9 1191 1198 1218 N
+ CH L AE e n/a 9 1188 1200 1221 N
+ CH L AE i n/a 9 1188 1200 1220 N
+ CH L AE s n/a 9 1188 1200 1220 N
+ CH L AH b n/a 9 1191 1198 1217 N
+ CH L AH e n/a 9 1188 1200 1221 N
+ CH L AH i n/a 9 1188 1200 1220 N
+ CH L AH s n/a 9 1188 1200 1220 N
+ CH L AO b n/a 9 1191 1203 1223 N
+ CH L AO e n/a 9 1188 1203 1222 N
+ CH L AO s n/a 9 1188 1203 1222 N
+ CH L AW b n/a 9 1191 1198 1218 N
+ CH L AW e n/a 9 1188 1200 1221 N
+ CH L AW i n/a 9 1188 1200 1220 N
+ CH L AW s n/a 9 1188 1200 1220 N
+ CH L AY b n/a 9 1191 1203 1223 N
+ CH L AY e n/a 9 1188 1203 1222 N
+ CH L AY i n/a 9 1188 1203 1222 N
+ CH L AY s n/a 9 1188 1203 1222 N
+ CH L B e n/a 9 1188 1205 1211 N
+ CH L B s n/a 9 1188 1205 1211 N
+ CH L CH e n/a 9 1188 1204 1214 N
+ CH L CH s n/a 9 1188 1204 1214 N
+ CH L D e n/a 9 1188 1206 1215 N
+ CH L D s n/a 9 1188 1206 1215 N
+ CH L DH e n/a 9 1188 1206 1215 N
+ CH L DH s n/a 9 1188 1206 1215 N
+ CH L EH b n/a 9 1191 1198 1218 N
+ CH L EH e n/a 9 1188 1200 1221 N
+ CH L EH i n/a 9 1188 1200 1220 N
+ CH L EH s n/a 9 1188 1200 1220 N
+ CH L ER b n/a 9 1191 1201 1224 N
+ CH L ER e n/a 9 1188 1201 1224 N
+ CH L ER i n/a 9 1188 1201 1224 N
+ CH L ER s n/a 9 1188 1201 1224 N
+ CH L EY b n/a 9 1191 1198 1218 N
+ CH L EY e n/a 9 1188 1200 1221 N
+ CH L EY i n/a 9 1188 1200 1220 N
+ CH L EY s n/a 9 1188 1200 1220 N
+ CH L F e n/a 9 1188 1205 1208 N
+ CH L F s n/a 9 1188 1205 1208 N
+ CH L G e n/a 9 1188 1205 1211 N
+ CH L G s n/a 9 1188 1205 1211 N
+ CH L HH e n/a 9 1188 1204 1213 N
+ CH L HH s n/a 9 1188 1204 1213 N
+ CH L IH b n/a 9 1191 1198 1220 N
+ CH L IH e n/a 9 1188 1200 1221 N
+ CH L IH i n/a 9 1188 1200 1220 N
+ CH L IH s n/a 9 1188 1200 1220 N
+ CH L IY b n/a 9 1191 1198 1219 N
+ CH L IY e n/a 9 1188 1200 1219 N
+ CH L IY i n/a 9 1188 1200 1219 N
+ CH L IY s n/a 9 1188 1200 1219 N
+ CH L JH e n/a 9 1188 1204 1214 N
+ CH L JH s n/a 9 1188 1204 1214 N
+ CH L K e n/a 9 1188 1205 1211 N
+ CH L K s n/a 9 1188 1205 1211 N
+ CH L L b n/a 9 1191 1204 1212 N
+ CH L L e n/a 9 1188 1204 1212 N
+ CH L L s n/a 9 1188 1204 1212 N
+ CH L M e n/a 9 1188 1205 1212 N
+ CH L M s n/a 9 1188 1205 1212 N
+ CH L N e n/a 9 1188 1206 1215 N
+ CH L N s n/a 9 1188 1206 1215 N
+ CH L NG e n/a 9 1188 1205 1208 N
+ CH L NG s n/a 9 1188 1205 1208 N
+ CH L OW b n/a 9 1191 1201 1222 N
+ CH L OW e n/a 9 1188 1201 1222 N
+ CH L OW i n/a 9 1188 1201 1222 N
+ CH L OW s n/a 9 1188 1201 1222 N
+ CH L OY b n/a 9 1191 1203 1223 N
+ CH L OY e n/a 9 1188 1203 1222 N
+ CH L OY s n/a 9 1188 1203 1222 N
+ CH L P e n/a 9 1188 1205 1211 N
+ CH L P s n/a 9 1188 1205 1211 N
+ CH L R b n/a 9 1191 1205 1209 N
+ CH L R e n/a 9 1188 1205 1209 N
+ CH L R i n/a 9 1188 1205 1208 N
+ CH L R s n/a 9 1188 1205 1209 N
+ CH L S e n/a 9 1188 1206 1214 N
+ CH L S s n/a 9 1188 1206 1214 N
+ CH L SH e n/a 9 1188 1204 1214 N
+ CH L SH s n/a 9 1188 1204 1214 N
+ CH L SIL e n/a 9 1188 1204 1210 N
+ CH L SIL s n/a 9 1188 1204 1210 N
+ CH L T e n/a 9 1188 1206 1216 N
+ CH L T i n/a 9 1188 1206 1216 N
+ CH L T s n/a 9 1188 1206 1216 N
+ CH L TH e n/a 9 1188 1206 1215 N
+ CH L TH s n/a 9 1188 1206 1215 N
+ CH L UH b n/a 9 1191 1201 1224 N
+ CH L UH e n/a 9 1188 1201 1224 N
+ CH L UH s n/a 9 1188 1201 1224 N
+ CH L UW b n/a 9 1191 1201 1225 N
+ CH L UW e n/a 9 1188 1201 1225 N
+ CH L UW i n/a 9 1188 1201 1225 N
+ CH L UW s n/a 9 1188 1201 1225 N
+ CH L V e n/a 9 1188 1205 1208 N
+ CH L V s n/a 9 1188 1205 1208 N
+ CH L W b n/a 9 1191 1205 1209 N
+ CH L W e n/a 9 1188 1205 1209 N
+ CH L W i n/a 9 1188 1205 1209 N
+ CH L W s n/a 9 1188 1205 1209 N
+ CH L Y b n/a 9 1191 1204 1213 N
+ CH L Y e n/a 9 1188 1204 1213 N
+ CH L Y i n/a 9 1188 1204 1213 N
+ CH L Y s n/a 9 1188 1204 1213 N
+ CH L Z e n/a 9 1188 1206 1215 N
+ CH L Z s n/a 9 1188 1206 1215 N
+ CH L ZH e n/a 9 1188 1204 1214 N
+ CH L ZH s n/a 9 1188 1204 1214 N
+ CH M AA b n/a 9 1197 1203 1223 N
+ CH M AA e n/a 9 1197 1203 1222 N
+ CH M AA i n/a 9 1197 1203 1222 N
+ CH M AA s n/a 9 1197 1203 1222 N
+ CH M AE b n/a 9 1197 1198 1218 N
+ CH M AE e n/a 9 1197 1198 1221 N
+ CH M AE i n/a 9 1197 1198 1220 N
+ CH M AE s n/a 9 1197 1198 1220 N
+ CH M AH b n/a 9 1197 1198 1217 N
+ CH M AH e n/a 9 1197 1198 1221 N
+ CH M AH i n/a 9 1197 1198 1220 N
+ CH M AH s n/a 9 1197 1198 1220 N
+ CH M AO b n/a 9 1197 1203 1223 N
+ CH M AO e n/a 9 1197 1203 1222 N
+ CH M AO s n/a 9 1197 1203 1222 N
+ CH M AW b n/a 9 1197 1198 1218 N
+ CH M AW e n/a 9 1197 1198 1221 N
+ CH M AW s n/a 9 1197 1198 1220 N
+ CH M AY b n/a 9 1197 1203 1223 N
+ CH M AY e n/a 9 1197 1203 1222 N
+ CH M AY s n/a 9 1197 1203 1222 N
+ CH M B e n/a 9 1197 1205 1211 N
+ CH M B s n/a 9 1197 1205 1211 N
+ CH M CH e n/a 9 1197 1204 1214 N
+ CH M CH s n/a 9 1197 1204 1214 N
+ CH M D e n/a 9 1197 1206 1215 N
+ CH M D s n/a 9 1197 1206 1215 N
+ CH M DH e n/a 9 1197 1206 1215 N
+ CH M DH s n/a 9 1197 1206 1215 N
+ CH M EH b n/a 9 1197 1198 1218 N
+ CH M EH e n/a 9 1197 1198 1221 N
+ CH M EH i n/a 9 1197 1198 1220 N
+ CH M EH s n/a 9 1197 1198 1220 N
+ CH M ER b n/a 9 1197 1202 1224 N
+ CH M ER e n/a 9 1197 1202 1224 N
+ CH M ER i n/a 9 1197 1202 1224 N
+ CH M ER s n/a 9 1197 1202 1224 N
+ CH M EY b n/a 9 1197 1198 1218 N
+ CH M EY e n/a 9 1197 1198 1221 N
+ CH M EY s n/a 9 1197 1198 1220 N
+ CH M F e n/a 9 1197 1205 1208 N
+ CH M F s n/a 9 1197 1205 1208 N
+ CH M G e n/a 9 1197 1205 1211 N
+ CH M G s n/a 9 1197 1205 1211 N
+ CH M HH e n/a 9 1197 1204 1213 N
+ CH M HH s n/a 9 1197 1204 1213 N
+ CH M IH b n/a 9 1197 1198 1220 N
+ CH M IH e n/a 9 1197 1198 1221 N
+ CH M IH i n/a 9 1197 1198 1220 N
+ CH M IH s n/a 9 1197 1198 1220 N
+ CH M IY b n/a 9 1197 1198 1219 N
+ CH M IY e n/a 9 1197 1198 1219 N
+ CH M IY i n/a 9 1197 1198 1219 N
+ CH M IY s n/a 9 1197 1198 1219 N
+ CH M JH e n/a 9 1197 1204 1214 N
+ CH M JH s n/a 9 1197 1204 1214 N
+ CH M K e n/a 9 1197 1205 1211 N
+ CH M K s n/a 9 1197 1205 1211 N
+ CH M L b n/a 9 1197 1204 1212 N
+ CH M L e n/a 9 1197 1204 1212 N
+ CH M L s n/a 9 1197 1204 1212 N
+ CH M M e n/a 9 1197 1205 1212 N
+ CH M M s n/a 9 1197 1205 1212 N
+ CH M N e n/a 9 1197 1206 1215 N
+ CH M N s n/a 9 1197 1206 1215 N
+ CH M NG e n/a 9 1197 1205 1208 N
+ CH M NG s n/a 9 1197 1205 1208 N
+ CH M OW b n/a 9 1197 1202 1222 N
+ CH M OW e n/a 9 1197 1202 1222 N
+ CH M OW s n/a 9 1197 1202 1222 N
+ CH M OY b n/a 9 1197 1203 1223 N
+ CH M OY e n/a 9 1197 1203 1222 N
+ CH M OY s n/a 9 1197 1203 1222 N
+ CH M P e n/a 9 1197 1205 1211 N
+ CH M P s n/a 9 1197 1205 1211 N
+ CH M R b n/a 9 1197 1205 1209 N
+ CH M R e n/a 9 1197 1205 1209 N
+ CH M R s n/a 9 1197 1205 1209 N
+ CH M S e n/a 9 1197 1206 1214 N
+ CH M S s n/a 9 1197 1206 1214 N
+ CH M SH e n/a 9 1197 1204 1214 N
+ CH M SH s n/a 9 1197 1204 1214 N
+ CH M SIL e n/a 9 1197 1204 1210 N
+ CH M SIL s n/a 9 1197 1204 1210 N
+ CH M T e n/a 9 1197 1206 1216 N
+ CH M T s n/a 9 1197 1206 1216 N
+ CH M TH e n/a 9 1197 1206 1215 N
+ CH M TH s n/a 9 1197 1206 1215 N
+ CH M UH b n/a 9 1197 1202 1224 N
+ CH M UH e n/a 9 1197 1202 1224 N
+ CH M UH i n/a 9 1197 1202 1224 N
+ CH M UH s n/a 9 1197 1202 1224 N
+ CH M UW b n/a 9 1197 1202 1225 N
+ CH M UW e n/a 9 1197 1202 1225 N
+ CH M UW s n/a 9 1197 1202 1225 N
+ CH M V e n/a 9 1197 1205 1208 N
+ CH M V s n/a 9 1197 1205 1208 N
+ CH M W b n/a 9 1197 1205 1209 N
+ CH M W e n/a 9 1197 1205 1209 N
+ CH M W s n/a 9 1197 1205 1209 N
+ CH M Y b n/a 9 1197 1204 1213 N
+ CH M Y e n/a 9 1197 1204 1213 N
+ CH M Y s n/a 9 1197 1204 1213 N
+ CH M Z e n/a 9 1197 1206 1215 N
+ CH M Z s n/a 9 1197 1206 1215 N
+ CH M ZH e n/a 9 1197 1204 1214 N
+ CH M ZH s n/a 9 1197 1204 1214 N
+ CH N AA b n/a 9 1197 1203 1223 N
+ CH N AA e n/a 9 1197 1203 1222 N
+ CH N AA i n/a 9 1197 1203 1222 N
+ CH N AA s n/a 9 1197 1203 1222 N
+ CH N AE b n/a 9 1197 1198 1218 N
+ CH N AE e n/a 9 1197 1198 1221 N
+ CH N AE i n/a 9 1197 1198 1220 N
+ CH N AE s n/a 9 1197 1198 1220 N
+ CH N AH b n/a 9 1197 1198 1217 N
+ CH N AH e n/a 9 1197 1198 1221 N
+ CH N AH i n/a 9 1197 1198 1220 N
+ CH N AH s n/a 9 1197 1198 1220 N
+ CH N AO b n/a 9 1197 1203 1223 N
+ CH N AO e n/a 9 1197 1203 1222 N
+ CH N AO i n/a 9 1197 1203 1222 N
+ CH N AO s n/a 9 1197 1203 1222 N
+ CH N AW b n/a 9 1197 1198 1218 N
+ CH N AW e n/a 9 1197 1198 1221 N
+ CH N AW i n/a 9 1197 1198 1220 N
+ CH N AW s n/a 9 1197 1198 1220 N
+ CH N AY b n/a 9 1197 1203 1223 N
+ CH N AY e n/a 9 1197 1203 1222 N
+ CH N AY i n/a 9 1197 1203 1222 N
+ CH N AY s n/a 9 1197 1203 1222 N
+ CH N B e n/a 9 1197 1205 1211 N
+ CH N B i n/a 9 1197 1205 1211 N
+ CH N B s n/a 9 1197 1205 1211 N
+ CH N CH e n/a 9 1197 1204 1214 N
+ CH N CH s n/a 9 1197 1204 1214 N
+ CH N D e n/a 9 1197 1206 1215 N
+ CH N D i n/a 9 1197 1206 1215 N
+ CH N D s n/a 9 1197 1206 1215 N
+ CH N DH e n/a 9 1197 1206 1215 N
+ CH N DH s n/a 9 1197 1206 1215 N
+ CH N EH b n/a 9 1197 1198 1218 N
+ CH N EH e n/a 9 1197 1198 1221 N
+ CH N EH i n/a 9 1197 1198 1220 N
+ CH N EH s n/a 9 1197 1198 1220 N
+ CH N ER b n/a 9 1197 1202 1224 N
+ CH N ER e n/a 9 1197 1202 1224 N
+ CH N ER i n/a 9 1197 1202 1224 N
+ CH N ER s n/a 9 1197 1202 1224 N
+ CH N EY b n/a 9 1197 1198 1218 N
+ CH N EY e n/a 9 1197 1198 1221 N
+ CH N EY i n/a 9 1197 1198 1220 N
+ CH N EY s n/a 9 1197 1198 1220 N
+ CH N F e n/a 9 1197 1205 1208 N
+ CH N F i n/a 9 1197 1205 1208 N
+ CH N F s n/a 9 1197 1205 1208 N
+ CH N G e n/a 9 1197 1205 1211 N
+ CH N G s n/a 9 1197 1205 1211 N
+ CH N HH e n/a 9 1197 1204 1213 N
+ CH N HH s n/a 9 1197 1204 1213 N
+ CH N IH b n/a 9 1197 1198 1220 N
+ CH N IH e n/a 9 1197 1198 1221 N
+ CH N IH i n/a 9 1197 1198 1220 N
+ CH N IH s n/a 9 1197 1198 1220 N
+ CH N IY b n/a 9 1197 1198 1219 N
+ CH N IY e n/a 9 1197 1198 1219 N
+ CH N IY i n/a 9 1197 1198 1219 N
+ CH N IY s n/a 9 1197 1198 1219 N
+ CH N JH e n/a 9 1197 1204 1214 N
+ CH N JH s n/a 9 1197 1204 1214 N
+ CH N K e n/a 9 1197 1205 1211 N
+ CH N K i n/a 9 1197 1205 1211 N
+ CH N K s n/a 9 1197 1205 1211 N
+ CH N L b n/a 9 1197 1204 1212 N
+ CH N L e n/a 9 1197 1204 1212 N
+ CH N L i n/a 9 1197 1204 1212 N
+ CH N L s n/a 9 1197 1204 1212 N
+ CH N M e n/a 9 1197 1205 1212 N
+ CH N M i n/a 9 1197 1205 1212 N
+ CH N M s n/a 9 1197 1205 1212 N
+ CH N N e n/a 9 1197 1206 1215 N
+ CH N N i n/a 9 1197 1206 1215 N
+ CH N N s n/a 9 1197 1206 1215 N
+ CH N NG e n/a 9 1197 1205 1208 N
+ CH N NG s n/a 9 1197 1205 1208 N
+ CH N OW b n/a 9 1197 1202 1222 N
+ CH N OW e n/a 9 1197 1202 1222 N
+ CH N OW i n/a 9 1197 1202 1222 N
+ CH N OW s n/a 9 1197 1202 1222 N
+ CH N OY b n/a 9 1197 1203 1223 N
+ CH N OY e n/a 9 1197 1203 1222 N
+ CH N OY i n/a 9 1197 1203 1222 N
+ CH N OY s n/a 9 1197 1203 1222 N
+ CH N P e n/a 9 1197 1205 1211 N
+ CH N P i n/a 9 1197 1205 1211 N
+ CH N P s n/a 9 1197 1205 1211 N
+ CH N R b n/a 9 1197 1205 1209 N
+ CH N R e n/a 9 1197 1205 1209 N
+ CH N R i n/a 9 1197 1205 1208 N
+ CH N R s n/a 9 1197 1205 1209 N
+ CH N S e n/a 9 1197 1206 1214 N
+ CH N S s n/a 9 1197 1206 1214 N
+ CH N SH e n/a 9 1197 1204 1214 N
+ CH N SH s n/a 9 1197 1204 1214 N
+ CH N SIL e n/a 9 1197 1204 1210 N
+ CH N SIL s n/a 9 1197 1204 1210 N
+ CH N T e n/a 9 1197 1206 1216 N
+ CH N T i n/a 9 1197 1206 1216 N
+ CH N T s n/a 9 1197 1206 1216 N
+ CH N TH e n/a 9 1197 1206 1215 N
+ CH N TH s n/a 9 1197 1206 1215 N
+ CH N UH b n/a 9 1197 1202 1224 N
+ CH N UH e n/a 9 1197 1202 1224 N
+ CH N UH i n/a 9 1197 1202 1224 N
+ CH N UH s n/a 9 1197 1202 1224 N
+ CH N UW b n/a 9 1197 1202 1225 N
+ CH N UW e n/a 9 1197 1202 1225 N
+ CH N UW i n/a 9 1197 1202 1225 N
+ CH N UW s n/a 9 1197 1202 1225 N
+ CH N V e n/a 9 1197 1205 1208 N
+ CH N V s n/a 9 1197 1205 1208 N
+ CH N W b n/a 9 1197 1205 1209 N
+ CH N W e n/a 9 1197 1205 1209 N
+ CH N W i n/a 9 1197 1205 1209 N
+ CH N W s n/a 9 1197 1205 1209 N
+ CH N Y b n/a 9 1197 1204 1213 N
+ CH N Y e n/a 9 1197 1204 1213 N
+ CH N Y i n/a 9 1197 1204 1213 N
+ CH N Y s n/a 9 1197 1204 1213 N
+ CH N Z e n/a 9 1197 1206 1215 N
+ CH N Z s n/a 9 1197 1206 1215 N
+ CH N ZH e n/a 9 1197 1204 1214 N
+ CH N ZH s n/a 9 1197 1204 1214 N
+ CH NG AA b n/a 9 1197 1203 1223 N
+ CH NG AA s n/a 9 1197 1203 1222 N
+ CH NG AE b n/a 9 1197 1198 1218 N
+ CH NG AE s n/a 9 1197 1198 1220 N
+ CH NG AH b n/a 9 1197 1198 1217 N
+ CH NG AH s n/a 9 1197 1198 1220 N
+ CH NG AO b n/a 9 1197 1203 1223 N
+ CH NG AO s n/a 9 1197 1203 1222 N
+ CH NG AW b n/a 9 1197 1198 1218 N
+ CH NG AW s n/a 9 1197 1198 1220 N
+ CH NG AY b n/a 9 1197 1203 1223 N
+ CH NG AY s n/a 9 1197 1203 1222 N
+ CH NG B s n/a 9 1197 1206 1211 N
+ CH NG CH s n/a 9 1197 1206 1214 N
+ CH NG D s n/a 9 1197 1206 1215 N
+ CH NG DH s n/a 9 1197 1206 1215 N
+ CH NG EH b n/a 9 1197 1198 1218 N
+ CH NG EH i n/a 9 1197 1198 1220 N
+ CH NG EH s n/a 9 1197 1198 1220 N
+ CH NG ER b n/a 9 1197 1202 1224 N
+ CH NG ER s n/a 9 1197 1202 1224 N
+ CH NG EY b n/a 9 1197 1198 1218 N
+ CH NG EY i n/a 9 1197 1198 1220 N
+ CH NG EY s n/a 9 1197 1198 1220 N
+ CH NG F s n/a 9 1197 1206 1208 N
+ CH NG G s n/a 9 1197 1206 1211 N
+ CH NG HH s n/a 9 1197 1206 1213 N
+ CH NG IH b n/a 9 1197 1198 1220 N
+ CH NG IH s n/a 9 1197 1198 1220 N
+ CH NG IY b n/a 9 1197 1198 1219 N
+ CH NG IY s n/a 9 1197 1198 1219 N
+ CH NG JH s n/a 9 1197 1206 1214 N
+ CH NG K s n/a 9 1197 1206 1211 N
+ CH NG L b n/a 9 1197 1206 1212 N
+ CH NG L s n/a 9 1197 1206 1212 N
+ CH NG M s n/a 9 1197 1206 1212 N
+ CH NG N s n/a 9 1197 1206 1215 N
+ CH NG NG s n/a 9 1197 1206 1208 N
+ CH NG OW b n/a 9 1197 1202 1222 N
+ CH NG OW s n/a 9 1197 1202 1222 N
+ CH NG OY b n/a 9 1197 1203 1223 N
+ CH NG OY s n/a 9 1197 1203 1222 N
+ CH NG P s n/a 9 1197 1206 1211 N
+ CH NG R b n/a 9 1197 1206 1209 N
+ CH NG R s n/a 9 1197 1206 1209 N
+ CH NG S s n/a 9 1197 1206 1214 N
+ CH NG SH s n/a 9 1197 1206 1214 N
+ CH NG SIL s n/a 9 1197 1204 1210 N
+ CH NG T s n/a 9 1197 1206 1216 N
+ CH NG TH s n/a 9 1197 1206 1215 N
+ CH NG UH b n/a 9 1197 1202 1224 N
+ CH NG UH i n/a 9 1197 1202 1224 N
+ CH NG UH s n/a 9 1197 1202 1224 N
+ CH NG UW b n/a 9 1197 1202 1225 N
+ CH NG UW s n/a 9 1197 1202 1225 N
+ CH NG V s n/a 9 1197 1206 1208 N
+ CH NG W b n/a 9 1197 1206 1209 N
+ CH NG W i n/a 9 1197 1206 1209 N
+ CH NG W s n/a 9 1197 1206 1209 N
+ CH NG Y b n/a 9 1197 1206 1213 N
+ CH NG Y s n/a 9 1197 1206 1213 N
+ CH NG Z s n/a 9 1197 1206 1215 N
+ CH NG ZH s n/a 9 1197 1206 1214 N
+ CH OW AA b n/a 9 1193 1203 1223 N
+ CH OW AA e n/a 9 1190 1203 1222 N
+ CH OW AA i n/a 9 1190 1203 1222 N
+ CH OW AA s n/a 9 1190 1203 1222 N
+ CH OW AE b n/a 9 1193 1198 1218 N
+ CH OW AE e n/a 9 1190 1200 1221 N
+ CH OW AE s n/a 9 1190 1200 1220 N
+ CH OW AH b n/a 9 1193 1198 1217 N
+ CH OW AH e n/a 9 1190 1200 1221 N
+ CH OW AH i n/a 9 1190 1200 1220 N
+ CH OW AH s n/a 9 1190 1200 1220 N
+ CH OW AO b n/a 9 1193 1203 1223 N
+ CH OW AO e n/a 9 1190 1203 1222 N
+ CH OW AO s n/a 9 1190 1203 1222 N
+ CH OW AW b n/a 9 1193 1198 1218 N
+ CH OW AW e n/a 9 1190 1200 1221 N
+ CH OW AW i n/a 9 1190 1200 1220 N
+ CH OW AW s n/a 9 1190 1200 1220 N
+ CH OW AY b n/a 9 1193 1203 1223 N
+ CH OW AY e n/a 9 1190 1203 1222 N
+ CH OW AY i n/a 9 1190 1203 1222 N
+ CH OW AY s n/a 9 1190 1203 1222 N
+ CH OW B e n/a 9 1190 1205 1211 N
+ CH OW B i n/a 9 1190 1205 1211 N
+ CH OW B s n/a 9 1190 1205 1211 N
+ CH OW CH e n/a 9 1190 1204 1214 N
+ CH OW CH s n/a 9 1190 1204 1214 N
+ CH OW D e n/a 9 1190 1206 1215 N
+ CH OW D s n/a 9 1190 1206 1215 N
+ CH OW DH e n/a 9 1190 1206 1215 N
+ CH OW DH s n/a 9 1190 1206 1215 N
+ CH OW EH b n/a 9 1193 1198 1218 N
+ CH OW EH e n/a 9 1190 1200 1221 N
+ CH OW EH i n/a 9 1190 1200 1220 N
+ CH OW EH s n/a 9 1190 1200 1220 N
+ CH OW ER b n/a 9 1193 1202 1224 N
+ CH OW ER e n/a 9 1190 1202 1224 N
+ CH OW ER i n/a 9 1190 1202 1224 N
+ CH OW ER s n/a 9 1190 1202 1224 N
+ CH OW EY b n/a 9 1193 1198 1218 N
+ CH OW EY e n/a 9 1190 1199 1221 N
+ CH OW EY s n/a 9 1190 1199 1220 N
+ CH OW F e n/a 9 1190 1205 1208 N
+ CH OW F i n/a 9 1190 1205 1208 N
+ CH OW F s n/a 9 1190 1205 1208 N
+ CH OW G e n/a 9 1190 1205 1211 N
+ CH OW G s n/a 9 1190 1205 1211 N
+ CH OW HH e n/a 9 1190 1204 1213 N
+ CH OW HH i n/a 9 1190 1204 1213 N
+ CH OW HH s n/a 9 1190 1204 1213 N
+ CH OW IH b n/a 9 1193 1198 1220 N
+ CH OW IH e n/a 9 1190 1200 1221 N
+ CH OW IH i n/a 9 1190 1200 1220 N
+ CH OW IH s n/a 9 1190 1200 1220 N
+ CH OW IY b n/a 9 1193 1198 1219 N
+ CH OW IY e n/a 9 1190 1199 1219 N
+ CH OW IY i n/a 9 1190 1199 1219 N
+ CH OW IY s n/a 9 1190 1199 1219 N
+ CH OW JH e n/a 9 1190 1204 1214 N
+ CH OW JH s n/a 9 1190 1204 1214 N
+ CH OW K e n/a 9 1190 1205 1211 N
+ CH OW K s n/a 9 1190 1205 1211 N
+ CH OW L b n/a 9 1193 1204 1212 N
+ CH OW L e n/a 9 1190 1204 1212 N
+ CH OW L s n/a 9 1190 1204 1212 N
+ CH OW M e n/a 9 1190 1205 1212 N
+ CH OW M i n/a 9 1190 1205 1212 N
+ CH OW M s n/a 9 1190 1205 1212 N
+ CH OW N e n/a 9 1190 1206 1215 N
+ CH OW N s n/a 9 1190 1206 1215 N
+ CH OW NG e n/a 9 1190 1205 1208 N
+ CH OW NG s n/a 9 1190 1205 1208 N
+ CH OW OW b n/a 9 1193 1202 1222 N
+ CH OW OW e n/a 9 1190 1202 1222 N
+ CH OW OW i n/a 9 1190 1202 1222 N
+ CH OW OW s n/a 9 1190 1202 1222 N
+ CH OW OY b n/a 9 1193 1203 1223 N
+ CH OW OY e n/a 9 1190 1203 1222 N
+ CH OW OY s n/a 9 1190 1203 1222 N
+ CH OW P e n/a 9 1190 1205 1211 N
+ CH OW P s n/a 9 1190 1205 1211 N
+ CH OW R b n/a 9 1193 1205 1209 N
+ CH OW R e n/a 9 1190 1205 1209 N
+ CH OW R s n/a 9 1190 1205 1209 N
+ CH OW S e n/a 9 1190 1206 1214 N
+ CH OW S i n/a 9 1190 1206 1214 N
+ CH OW S s n/a 9 1190 1206 1214 N
+ CH OW SH e n/a 9 1190 1204 1214 N
+ CH OW SH s n/a 9 1190 1204 1214 N
+ CH OW SIL e n/a 9 1190 1204 1210 N
+ CH OW SIL s n/a 9 1190 1204 1210 N
+ CH OW T e n/a 9 1190 1206 1216 N
+ CH OW T i n/a 9 1190 1206 1216 N
+ CH OW T s n/a 9 1190 1206 1216 N
+ CH OW TH e n/a 9 1190 1206 1215 N
+ CH OW TH s n/a 9 1190 1206 1215 N
+ CH OW UH b n/a 9 1193 1202 1224 N
+ CH OW UH e n/a 9 1190 1202 1224 N
+ CH OW UH s n/a 9 1190 1202 1224 N
+ CH OW UW b n/a 9 1193 1202 1225 N
+ CH OW UW e n/a 9 1190 1202 1225 N
+ CH OW UW i n/a 9 1190 1202 1225 N
+ CH OW UW s n/a 9 1190 1202 1225 N
+ CH OW V e n/a 9 1190 1205 1208 N
+ CH OW V s n/a 9 1190 1205 1208 N
+ CH OW W b n/a 9 1193 1205 1209 N
+ CH OW W e n/a 9 1190 1205 1209 N
+ CH OW W s n/a 9 1190 1205 1209 N
+ CH OW Y b n/a 9 1193 1204 1213 N
+ CH OW Y e n/a 9 1190 1204 1213 N
+ CH OW Y s n/a 9 1190 1204 1213 N
+ CH OW Z e n/a 9 1190 1206 1215 N
+ CH OW Z s n/a 9 1190 1206 1215 N
+ CH OW ZH e n/a 9 1190 1204 1214 N
+ CH OW ZH s n/a 9 1190 1204 1214 N
+ CH OY AA b n/a 9 1193 1203 1223 N
+ CH OY AA e n/a 9 1192 1203 1222 N
+ CH OY AA s n/a 9 1193 1203 1222 N
+ CH OY AE b n/a 9 1193 1198 1218 N
+ CH OY AE e n/a 9 1192 1200 1217 N
+ CH OY AE i n/a 9 1193 1200 1220 N
+ CH OY AE s n/a 9 1193 1200 1220 N
+ CH OY AH b n/a 9 1193 1198 1217 N
+ CH OY AH e n/a 9 1192 1200 1217 N
+ CH OY AH i n/a 9 1193 1200 1220 N
+ CH OY AH s n/a 9 1193 1200 1220 N
+ CH OY AO b n/a 9 1193 1203 1223 N
+ CH OY AO e n/a 9 1192 1203 1222 N
+ CH OY AO s n/a 9 1193 1203 1222 N
+ CH OY AW b n/a 9 1193 1198 1218 N
+ CH OY AW e n/a 9 1192 1200 1217 N
+ CH OY AW s n/a 9 1193 1200 1220 N
+ CH OY AY b n/a 9 1193 1203 1223 N
+ CH OY AY e n/a 9 1192 1203 1222 N
+ CH OY AY s n/a 9 1193 1203 1222 N
+ CH OY B e n/a 9 1192 1205 1211 N
+ CH OY B s n/a 9 1193 1205 1211 N
+ CH OY CH e n/a 9 1192 1204 1214 N
+ CH OY CH s n/a 9 1193 1204 1214 N
+ CH OY D e n/a 9 1192 1206 1215 N
+ CH OY D s n/a 9 1193 1206 1215 N
+ CH OY DH e n/a 9 1192 1206 1215 N
+ CH OY DH s n/a 9 1193 1206 1215 N
+ CH OY EH b n/a 9 1193 1198 1218 N
+ CH OY EH e n/a 9 1192 1200 1218 N
+ CH OY EH i n/a 9 1193 1200 1220 N
+ CH OY EH s n/a 9 1193 1200 1220 N
+ CH OY ER b n/a 9 1193 1202 1224 N
+ CH OY ER e n/a 9 1192 1202 1224 N
+ CH OY ER i n/a 9 1193 1202 1224 N
+ CH OY ER s n/a 9 1193 1202 1224 N
+ CH OY EY b n/a 9 1193 1198 1218 N
+ CH OY EY e n/a 9 1192 1199 1218 N
+ CH OY EY s n/a 9 1193 1199 1220 N
+ CH OY F e n/a 9 1192 1205 1208 N
+ CH OY F s n/a 9 1193 1205 1208 N
+ CH OY G e n/a 9 1192 1205 1211 N
+ CH OY G s n/a 9 1193 1205 1211 N
+ CH OY HH e n/a 9 1192 1204 1213 N
+ CH OY HH s n/a 9 1193 1204 1213 N
+ CH OY IH b n/a 9 1193 1198 1220 N
+ CH OY IH e n/a 9 1192 1200 1221 N
+ CH OY IH i n/a 9 1193 1200 1220 N
+ CH OY IH s n/a 9 1193 1200 1220 N
+ CH OY IY b n/a 9 1193 1198 1219 N
+ CH OY IY e n/a 9 1192 1199 1219 N
+ CH OY IY i n/a 9 1193 1199 1219 N
+ CH OY IY s n/a 9 1193 1199 1219 N
+ CH OY JH e n/a 9 1192 1204 1214 N
+ CH OY JH s n/a 9 1193 1204 1214 N
+ CH OY K e n/a 9 1192 1205 1211 N
+ CH OY K s n/a 9 1193 1205 1211 N
+ CH OY L b n/a 9 1193 1204 1212 N
+ CH OY L e n/a 9 1192 1204 1212 N
+ CH OY L i n/a 9 1193 1204 1212 N
+ CH OY L s n/a 9 1193 1204 1212 N
+ CH OY M e n/a 9 1192 1205 1212 N
+ CH OY M i n/a 9 1193 1205 1212 N
+ CH OY M s n/a 9 1193 1205 1212 N
+ CH OY N e n/a 9 1192 1206 1215 N
+ CH OY N s n/a 9 1193 1206 1215 N
+ CH OY NG e n/a 9 1192 1205 1208 N
+ CH OY NG s n/a 9 1193 1205 1208 N
+ CH OY OW b n/a 9 1193 1202 1222 N
+ CH OY OW e n/a 9 1192 1202 1222 N
+ CH OY OW s n/a 9 1193 1202 1222 N
+ CH OY OY b n/a 9 1193 1203 1223 N
+ CH OY OY e n/a 9 1192 1203 1222 N
+ CH OY OY s n/a 9 1193 1203 1222 N
+ CH OY P e n/a 9 1192 1205 1211 N
+ CH OY P s n/a 9 1193 1205 1211 N
+ CH OY R b n/a 9 1193 1205 1209 N
+ CH OY R e n/a 9 1192 1205 1209 N
+ CH OY R s n/a 9 1193 1205 1209 N
+ CH OY S e n/a 9 1192 1206 1214 N
+ CH OY S s n/a 9 1193 1206 1214 N
+ CH OY SH e n/a 9 1192 1204 1214 N
+ CH OY SH s n/a 9 1193 1204 1214 N
+ CH OY SIL e n/a 9 1193 1204 1210 N
+ CH OY SIL s n/a 9 1193 1204 1210 N
+ CH OY T e n/a 9 1192 1206 1216 N
+ CH OY T s n/a 9 1193 1206 1216 N
+ CH OY TH e n/a 9 1192 1206 1215 N
+ CH OY TH s n/a 9 1193 1206 1215 N
+ CH OY UH b n/a 9 1193 1202 1224 N
+ CH OY UH e n/a 9 1192 1202 1224 N
+ CH OY UH s n/a 9 1193 1202 1224 N
+ CH OY UW b n/a 9 1193 1202 1225 N
+ CH OY UW e n/a 9 1192 1202 1225 N
+ CH OY UW s n/a 9 1193 1202 1225 N
+ CH OY V e n/a 9 1192 1205 1208 N
+ CH OY V s n/a 9 1193 1205 1208 N
+ CH OY W b n/a 9 1193 1205 1209 N
+ CH OY W e n/a 9 1192 1205 1209 N
+ CH OY W s n/a 9 1193 1205 1209 N
+ CH OY Y b n/a 9 1193 1204 1213 N
+ CH OY Y e n/a 9 1192 1204 1213 N
+ CH OY Y s n/a 9 1193 1204 1213 N
+ CH OY Z e n/a 9 1192 1206 1215 N
+ CH OY Z i n/a 9 1193 1206 1215 N
+ CH OY Z s n/a 9 1193 1206 1215 N
+ CH OY ZH e n/a 9 1192 1204 1214 N
+ CH OY ZH s n/a 9 1193 1204 1214 N
+ CH P AA b n/a 9 1195 1201 1223 N
+ CH P AA i n/a 9 1196 1201 1222 N
+ CH P AA s n/a 9 1195 1201 1222 N
+ CH P AE b n/a 9 1195 1198 1218 N
+ CH P AE s n/a 9 1195 1198 1220 N
+ CH P AH b n/a 9 1195 1198 1217 N
+ CH P AH i n/a 9 1196 1198 1220 N
+ CH P AH s n/a 9 1195 1198 1220 N
+ CH P AO b n/a 9 1195 1201 1223 N
+ CH P AO s n/a 9 1195 1201 1222 N
+ CH P AW b n/a 9 1195 1198 1218 N
+ CH P AW s n/a 9 1195 1198 1220 N
+ CH P AY b n/a 9 1195 1201 1223 N
+ CH P AY i n/a 9 1196 1201 1222 N
+ CH P AY s n/a 9 1195 1201 1222 N
+ CH P B s n/a 9 1195 1205 1211 N
+ CH P CH s n/a 9 1195 1204 1214 N
+ CH P D s n/a 9 1195 1206 1215 N
+ CH P DH s n/a 9 1195 1206 1215 N
+ CH P EH b n/a 9 1195 1198 1218 N
+ CH P EH s n/a 9 1195 1198 1220 N
+ CH P ER b n/a 9 1195 1201 1224 N
+ CH P ER i n/a 9 1196 1201 1224 N
+ CH P ER s n/a 9 1195 1201 1224 N
+ CH P EY b n/a 9 1195 1198 1218 N
+ CH P EY s n/a 9 1195 1198 1220 N
+ CH P F s n/a 9 1195 1205 1208 N
+ CH P G s n/a 9 1195 1205 1211 N
+ CH P HH i n/a 9 1196 1204 1213 N
+ CH P HH s n/a 9 1195 1204 1213 N
+ CH P IH b n/a 9 1195 1198 1220 N
+ CH P IH i n/a 9 1196 1198 1220 N
+ CH P IH s n/a 9 1195 1198 1220 N
+ CH P IY b n/a 9 1195 1198 1219 N
+ CH P IY s n/a 9 1195 1198 1219 N
+ CH P JH s n/a 9 1195 1204 1214 N
+ CH P K s n/a 9 1195 1205 1211 N
+ CH P L b n/a 9 1195 1204 1212 N
+ CH P L s n/a 9 1195 1204 1212 N
+ CH P M s n/a 9 1195 1205 1212 N
+ CH P N s n/a 9 1195 1206 1215 N
+ CH P NG s n/a 9 1195 1205 1208 N
+ CH P OW b n/a 9 1195 1201 1222 N
+ CH P OW s n/a 9 1195 1201 1222 N
+ CH P OY b n/a 9 1195 1201 1223 N
+ CH P OY s n/a 9 1195 1201 1222 N
+ CH P P s n/a 9 1195 1205 1211 N
+ CH P R b n/a 9 1195 1205 1209 N
+ CH P R s n/a 9 1195 1205 1209 N
+ CH P S s n/a 9 1195 1206 1214 N
+ CH P SH s n/a 9 1195 1204 1214 N
+ CH P SIL s n/a 9 1195 1204 1210 N
+ CH P T s n/a 9 1195 1206 1216 N
+ CH P TH s n/a 9 1195 1206 1215 N
+ CH P UH b n/a 9 1195 1201 1224 N
+ CH P UH s n/a 9 1195 1201 1224 N
+ CH P UW b n/a 9 1195 1201 1225 N
+ CH P UW i n/a 9 1196 1201 1225 N
+ CH P UW s n/a 9 1195 1201 1225 N
+ CH P V s n/a 9 1195 1205 1208 N
+ CH P W b n/a 9 1195 1205 1209 N
+ CH P W i n/a 9 1196 1205 1209 N
+ CH P W s n/a 9 1195 1205 1209 N
+ CH P Y b n/a 9 1195 1204 1213 N
+ CH P Y s n/a 9 1195 1204 1213 N
+ CH P Z s n/a 9 1195 1206 1215 N
+ CH P ZH s n/a 9 1195 1204 1214 N
+ CH R AA b n/a 9 1190 1203 1223 N
+ CH R AA e n/a 9 1190 1203 1222 N
+ CH R AA s n/a 9 1190 1203 1222 N
+ CH R AE b n/a 9 1190 1198 1218 N
+ CH R AE e n/a 9 1190 1200 1221 N
+ CH R AE i n/a 9 1190 1200 1220 N
+ CH R AE s n/a 9 1190 1200 1220 N
+ CH R AH b n/a 9 1190 1198 1217 N
+ CH R AH e n/a 9 1190 1200 1221 N
+ CH R AH i n/a 9 1190 1200 1220 N
+ CH R AH s n/a 9 1190 1200 1220 N
+ CH R AO b n/a 9 1190 1203 1223 N
+ CH R AO e n/a 9 1190 1203 1222 N
+ CH R AO s n/a 9 1190 1203 1222 N
+ CH R AW b n/a 9 1190 1198 1218 N
+ CH R AW e n/a 9 1190 1200 1221 N
+ CH R AW i n/a 9 1190 1200 1220 N
+ CH R AW s n/a 9 1190 1200 1220 N
+ CH R AY b n/a 9 1190 1203 1223 N
+ CH R AY e n/a 9 1190 1203 1222 N
+ CH R AY i n/a 9 1190 1203 1222 N
+ CH R AY s n/a 9 1190 1203 1222 N
+ CH R B e n/a 9 1190 1205 1211 N
+ CH R B i n/a 9 1190 1205 1211 N
+ CH R B s n/a 9 1190 1205 1211 N
+ CH R CH e n/a 9 1190 1204 1214 N
+ CH R CH s n/a 9 1190 1204 1214 N
+ CH R D e n/a 9 1190 1206 1215 N
+ CH R D i n/a 9 1190 1206 1215 N
+ CH R D s n/a 9 1190 1206 1215 N
+ CH R DH e n/a 9 1190 1206 1215 N
+ CH R DH s n/a 9 1190 1206 1215 N
+ CH R EH b n/a 9 1190 1198 1218 N
+ CH R EH e n/a 9 1190 1200 1221 N
+ CH R EH i n/a 9 1190 1200 1220 N
+ CH R EH s n/a 9 1190 1200 1220 N
+ CH R ER b n/a 9 1190 1202 1224 N
+ CH R ER e n/a 9 1190 1202 1224 N
+ CH R ER i n/a 9 1190 1202 1224 N
+ CH R ER s n/a 9 1190 1202 1224 N
+ CH R EY b n/a 9 1190 1198 1218 N
+ CH R EY e n/a 9 1190 1200 1221 N
+ CH R EY s n/a 9 1190 1200 1220 N
+ CH R F e n/a 9 1190 1205 1208 N
+ CH R F s n/a 9 1190 1205 1208 N
+ CH R G e n/a 9 1190 1205 1211 N
+ CH R G s n/a 9 1190 1205 1211 N
+ CH R HH e n/a 9 1190 1204 1213 N
+ CH R HH s n/a 9 1190 1204 1213 N
+ CH R IH b n/a 9 1190 1198 1220 N
+ CH R IH e n/a 9 1190 1200 1221 N
+ CH R IH i n/a 9 1190 1200 1220 N
+ CH R IH s n/a 9 1190 1200 1220 N
+ CH R IY b n/a 9 1190 1198 1219 N
+ CH R IY e n/a 9 1190 1200 1219 N
+ CH R IY i n/a 9 1190 1200 1219 N
+ CH R IY s n/a 9 1190 1200 1219 N
+ CH R JH e n/a 9 1190 1204 1214 N
+ CH R JH s n/a 9 1190 1204 1214 N
+ CH R K e n/a 9 1190 1205 1211 N
+ CH R K i n/a 9 1190 1205 1211 N
+ CH R K s n/a 9 1190 1205 1211 N
+ CH R L b n/a 9 1190 1204 1212 N
+ CH R L e n/a 9 1190 1204 1212 N
+ CH R L i n/a 9 1190 1204 1212 N
+ CH R L s n/a 9 1190 1204 1212 N
+ CH R M e n/a 9 1190 1205 1212 N
+ CH R M i n/a 9 1190 1205 1212 N
+ CH R M s n/a 9 1190 1205 1212 N
+ CH R N e n/a 9 1190 1206 1215 N
+ CH R N i n/a 9 1190 1206 1215 N
+ CH R N s n/a 9 1190 1206 1215 N
+ CH R NG e n/a 9 1190 1205 1208 N
+ CH R NG s n/a 9 1190 1205 1208 N
+ CH R OW b n/a 9 1190 1202 1222 N
+ CH R OW e n/a 9 1190 1202 1222 N
+ CH R OW i n/a 9 1190 1202 1222 N
+ CH R OW s n/a 9 1190 1202 1222 N
+ CH R OY b n/a 9 1190 1203 1223 N
+ CH R OY e n/a 9 1190 1203 1222 N
+ CH R OY s n/a 9 1190 1203 1222 N
+ CH R P e n/a 9 1190 1205 1211 N
+ CH R P i n/a 9 1190 1205 1211 N
+ CH R P s n/a 9 1190 1205 1211 N
+ CH R R b n/a 9 1190 1205 1209 N
+ CH R R e n/a 9 1190 1205 1209 N
+ CH R R i n/a 9 1190 1205 1208 N
+ CH R R s n/a 9 1190 1205 1209 N
+ CH R S e n/a 9 1190 1206 1214 N
+ CH R S i n/a 9 1190 1206 1214 N
+ CH R S s n/a 9 1190 1206 1214 N
+ CH R SH e n/a 9 1190 1204 1214 N
+ CH R SH s n/a 9 1190 1204 1214 N
+ CH R SIL e n/a 9 1190 1204 1210 N
+ CH R SIL s n/a 9 1190 1204 1210 N
+ CH R T e n/a 9 1190 1206 1216 N
+ CH R T i n/a 9 1190 1206 1216 N
+ CH R T s n/a 9 1190 1206 1216 N
+ CH R TH e n/a 9 1190 1206 1215 N
+ CH R TH s n/a 9 1190 1206 1215 N
+ CH R UH b n/a 9 1190 1202 1224 N
+ CH R UH e n/a 9 1190 1202 1224 N
+ CH R UH s n/a 9 1190 1202 1224 N
+ CH R UW b n/a 9 1190 1202 1225 N
+ CH R UW e n/a 9 1190 1202 1225 N
+ CH R UW i n/a 9 1190 1202 1225 N
+ CH R UW s n/a 9 1190 1202 1225 N
+ CH R V e n/a 9 1190 1205 1208 N
+ CH R V s n/a 9 1190 1205 1208 N
+ CH R W b n/a 9 1190 1205 1209 N
+ CH R W e n/a 9 1190 1205 1209 N
+ CH R W i n/a 9 1190 1205 1209 N
+ CH R W s n/a 9 1190 1205 1209 N
+ CH R Y b n/a 9 1190 1204 1213 N
+ CH R Y e n/a 9 1190 1204 1213 N
+ CH R Y s n/a 9 1190 1204 1213 N
+ CH R Z e n/a 9 1190 1206 1215 N
+ CH R Z s n/a 9 1190 1206 1215 N
+ CH R ZH e n/a 9 1190 1204 1214 N
+ CH R ZH s n/a 9 1190 1204 1214 N
+ CH S AA b n/a 9 1194 1203 1223 N
+ CH S AA e n/a 9 1194 1203 1222 N
+ CH S AA i n/a 9 1194 1203 1222 N
+ CH S AA s n/a 9 1194 1203 1222 N
+ CH S AE b n/a 9 1194 1198 1218 N
+ CH S AE e n/a 9 1194 1200 1221 N
+ CH S AE i n/a 9 1194 1200 1221 N
+ CH S AE s n/a 9 1194 1200 1220 N
+ CH S AH b n/a 9 1194 1198 1217 N
+ CH S AH e n/a 9 1194 1200 1221 N
+ CH S AH i n/a 9 1194 1200 1221 N
+ CH S AH s n/a 9 1194 1200 1220 N
+ CH S AO b n/a 9 1194 1203 1223 N
+ CH S AO e n/a 9 1194 1203 1222 N
+ CH S AO i n/a 9 1194 1203 1222 N
+ CH S AO s n/a 9 1194 1203 1222 N
+ CH S AW b n/a 9 1194 1198 1218 N
+ CH S AW e n/a 9 1194 1200 1221 N
+ CH S AW s n/a 9 1194 1200 1220 N
+ CH S AY b n/a 9 1194 1203 1223 N
+ CH S AY e n/a 9 1194 1203 1222 N
+ CH S AY i n/a 9 1194 1203 1222 N
+ CH S AY s n/a 9 1194 1203 1222 N
+ CH S B e n/a 9 1194 1205 1211 N
+ CH S B i n/a 9 1194 1205 1211 N
+ CH S B s n/a 9 1194 1205 1211 N
+ CH S CH e n/a 9 1194 1204 1214 N
+ CH S CH s n/a 9 1194 1204 1214 N
+ CH S D e n/a 9 1194 1206 1215 N
+ CH S D s n/a 9 1194 1206 1215 N
+ CH S DH e n/a 9 1194 1206 1215 N
+ CH S DH s n/a 9 1194 1206 1215 N
+ CH S EH b n/a 9 1194 1198 1218 N
+ CH S EH e n/a 9 1194 1200 1221 N
+ CH S EH i n/a 9 1194 1200 1221 N
+ CH S EH s n/a 9 1194 1200 1220 N
+ CH S ER b n/a 9 1194 1202 1224 N
+ CH S ER e n/a 9 1194 1202 1224 N
+ CH S ER i n/a 9 1194 1202 1224 N
+ CH S ER s n/a 9 1194 1202 1224 N
+ CH S EY b n/a 9 1194 1198 1218 N
+ CH S EY e n/a 9 1194 1200 1221 N
+ CH S EY i n/a 9 1194 1200 1221 N
+ CH S EY s n/a 9 1194 1200 1220 N
+ CH S F e n/a 9 1194 1205 1208 N
+ CH S F s n/a 9 1194 1205 1208 N
+ CH S G e n/a 9 1194 1205 1211 N
+ CH S G s n/a 9 1194 1205 1211 N
+ CH S HH e n/a 9 1194 1204 1213 N
+ CH S HH s n/a 9 1194 1204 1213 N
+ CH S IH b n/a 9 1194 1198 1220 N
+ CH S IH e n/a 9 1194 1200 1221 N
+ CH S IH i n/a 9 1194 1200 1221 N
+ CH S IH s n/a 9 1194 1200 1220 N
+ CH S IY b n/a 9 1194 1198 1219 N
+ CH S IY e n/a 9 1194 1200 1219 N
+ CH S IY i n/a 9 1194 1200 1219 N
+ CH S IY s n/a 9 1194 1200 1219 N
+ CH S JH e n/a 9 1194 1204 1214 N
+ CH S JH s n/a 9 1194 1204 1214 N
+ CH S K e n/a 9 1194 1205 1211 N
+ CH S K s n/a 9 1194 1205 1211 N
+ CH S L b n/a 9 1194 1204 1212 N
+ CH S L e n/a 9 1194 1204 1212 N
+ CH S L i n/a 9 1194 1204 1212 N
+ CH S L s n/a 9 1194 1204 1212 N
+ CH S M e n/a 9 1194 1205 1212 N
+ CH S M s n/a 9 1194 1205 1212 N
+ CH S N e n/a 9 1194 1206 1215 N
+ CH S N s n/a 9 1194 1206 1215 N
+ CH S NG e n/a 9 1194 1205 1208 N
+ CH S NG s n/a 9 1194 1205 1208 N
+ CH S OW b n/a 9 1194 1202 1222 N
+ CH S OW e n/a 9 1194 1202 1222 N
+ CH S OW i n/a 9 1194 1202 1222 N
+ CH S OW s n/a 9 1194 1202 1222 N
+ CH S OY b n/a 9 1194 1203 1223 N
+ CH S OY e n/a 9 1194 1203 1222 N
+ CH S OY s n/a 9 1194 1203 1222 N
+ CH S P e n/a 9 1194 1205 1211 N
+ CH S P s n/a 9 1194 1205 1211 N
+ CH S R b n/a 9 1194 1205 1209 N
+ CH S R e n/a 9 1194 1205 1209 N
+ CH S R s n/a 9 1194 1205 1209 N
+ CH S S e n/a 9 1194 1206 1214 N
+ CH S S s n/a 9 1194 1206 1214 N
+ CH S SH e n/a 9 1194 1204 1214 N
+ CH S SH s n/a 9 1194 1204 1214 N
+ CH S SIL e n/a 9 1194 1204 1210 N
+ CH S SIL s n/a 9 1194 1204 1210 N
+ CH S T e n/a 9 1194 1206 1216 N
+ CH S T s n/a 9 1194 1206 1216 N
+ CH S TH e n/a 9 1194 1206 1215 N
+ CH S TH s n/a 9 1194 1206 1215 N
+ CH S UH b n/a 9 1194 1202 1224 N
+ CH S UH e n/a 9 1194 1202 1224 N
+ CH S UH i n/a 9 1194 1202 1224 N
+ CH S UH s n/a 9 1194 1202 1224 N
+ CH S UW b n/a 9 1194 1202 1225 N
+ CH S UW e n/a 9 1194 1202 1225 N
+ CH S UW i n/a 9 1194 1202 1225 N
+ CH S UW s n/a 9 1194 1202 1225 N
+ CH S V e n/a 9 1194 1205 1208 N
+ CH S V s n/a 9 1194 1205 1208 N
+ CH S W b n/a 9 1194 1205 1209 N
+ CH S W e n/a 9 1194 1205 1209 N
+ CH S W i n/a 9 1194 1205 1209 N
+ CH S W s n/a 9 1194 1205 1209 N
+ CH S Y b n/a 9 1194 1204 1213 N
+ CH S Y e n/a 9 1194 1204 1213 N
+ CH S Y s n/a 9 1194 1204 1213 N
+ CH S Z e n/a 9 1194 1206 1215 N
+ CH S Z s n/a 9 1194 1206 1215 N
+ CH S ZH e n/a 9 1194 1204 1214 N
+ CH S ZH s n/a 9 1194 1204 1214 N
+ CH SH AA b n/a 9 1194 1203 1223 N
+ CH SH AA e n/a 9 1194 1203 1222 N
+ CH SH AA s n/a 9 1194 1203 1222 N
+ CH SH AE b n/a 9 1194 1198 1218 N
+ CH SH AE e n/a 9 1194 1200 1221 N
+ CH SH AE s n/a 9 1194 1200 1220 N
+ CH SH AH b n/a 9 1194 1198 1217 N
+ CH SH AH e n/a 9 1194 1200 1221 N
+ CH SH AH s n/a 9 1194 1200 1220 N
+ CH SH AO b n/a 9 1194 1203 1223 N
+ CH SH AO e n/a 9 1194 1203 1222 N
+ CH SH AO s n/a 9 1194 1203 1222 N
+ CH SH AW b n/a 9 1194 1198 1218 N
+ CH SH AW e n/a 9 1194 1200 1221 N
+ CH SH AW s n/a 9 1194 1200 1220 N
+ CH SH AY b n/a 9 1194 1203 1223 N
+ CH SH AY e n/a 9 1194 1203 1222 N
+ CH SH AY s n/a 9 1194 1203 1222 N
+ CH SH B e n/a 9 1194 1205 1211 N
+ CH SH B s n/a 9 1194 1205 1211 N
+ CH SH CH e n/a 9 1194 1204 1214 N
+ CH SH CH s n/a 9 1194 1204 1214 N
+ CH SH D e n/a 9 1194 1206 1215 N
+ CH SH D s n/a 9 1194 1206 1215 N
+ CH SH DH e n/a 9 1194 1206 1215 N
+ CH SH DH s n/a 9 1194 1206 1215 N
+ CH SH EH b n/a 9 1194 1198 1218 N
+ CH SH EH e n/a 9 1194 1200 1221 N
+ CH SH EH i n/a 9 1194 1200 1221 N
+ CH SH EH s n/a 9 1194 1200 1220 N
+ CH SH ER b n/a 9 1194 1202 1224 N
+ CH SH ER e n/a 9 1194 1202 1224 N
+ CH SH ER i n/a 9 1194 1202 1224 N
+ CH SH ER s n/a 9 1194 1202 1224 N
+ CH SH EY b n/a 9 1194 1198 1218 N
+ CH SH EY e n/a 9 1194 1200 1221 N
+ CH SH EY s n/a 9 1194 1200 1220 N
+ CH SH F e n/a 9 1194 1205 1208 N
+ CH SH F s n/a 9 1194 1205 1208 N
+ CH SH G e n/a 9 1194 1205 1211 N
+ CH SH G s n/a 9 1194 1205 1211 N
+ CH SH HH e n/a 9 1194 1204 1213 N
+ CH SH HH s n/a 9 1194 1204 1213 N
+ CH SH IH b n/a 9 1194 1198 1220 N
+ CH SH IH e n/a 9 1194 1200 1221 N
+ CH SH IH i n/a 9 1194 1200 1221 N
+ CH SH IH s n/a 9 1194 1200 1220 N
+ CH SH IY b n/a 9 1194 1198 1219 N
+ CH SH IY e n/a 9 1194 1200 1219 N
+ CH SH IY i n/a 9 1194 1200 1219 N
+ CH SH IY s n/a 9 1194 1200 1219 N
+ CH SH JH e n/a 9 1194 1204 1214 N
+ CH SH JH s n/a 9 1194 1204 1214 N
+ CH SH K e n/a 9 1194 1205 1211 N
+ CH SH K s n/a 9 1194 1205 1211 N
+ CH SH L b n/a 9 1194 1204 1212 N
+ CH SH L e n/a 9 1194 1204 1212 N
+ CH SH L s n/a 9 1194 1204 1212 N
+ CH SH M e n/a 9 1194 1205 1212 N
+ CH SH M s n/a 9 1194 1205 1212 N
+ CH SH N e n/a 9 1194 1206 1215 N
+ CH SH N s n/a 9 1194 1206 1215 N
+ CH SH NG e n/a 9 1194 1205 1208 N
+ CH SH NG s n/a 9 1194 1205 1208 N
+ CH SH OW b n/a 9 1194 1202 1222 N
+ CH SH OW e n/a 9 1194 1202 1222 N
+ CH SH OW s n/a 9 1194 1202 1222 N
+ CH SH OY b n/a 9 1194 1203 1223 N
+ CH SH OY e n/a 9 1194 1203 1222 N
+ CH SH OY s n/a 9 1194 1203 1222 N
+ CH SH P e n/a 9 1194 1205 1211 N
+ CH SH P s n/a 9 1194 1205 1211 N
+ CH SH R b n/a 9 1194 1205 1209 N
+ CH SH R e n/a 9 1194 1205 1209 N
+ CH SH R s n/a 9 1194 1205 1209 N
+ CH SH S e n/a 9 1194 1206 1214 N
+ CH SH S s n/a 9 1194 1206 1214 N
+ CH SH SH e n/a 9 1194 1204 1214 N
+ CH SH SH s n/a 9 1194 1204 1214 N
+ CH SH SIL e n/a 9 1194 1204 1210 N
+ CH SH SIL s n/a 9 1194 1204 1210 N
+ CH SH T e n/a 9 1194 1206 1216 N
+ CH SH T s n/a 9 1194 1206 1216 N
+ CH SH TH e n/a 9 1194 1206 1215 N
+ CH SH TH s n/a 9 1194 1206 1215 N
+ CH SH UH b n/a 9 1194 1202 1224 N
+ CH SH UH e n/a 9 1194 1202 1224 N
+ CH SH UH s n/a 9 1194 1202 1224 N
+ CH SH UW b n/a 9 1194 1202 1225 N
+ CH SH UW e n/a 9 1194 1202 1225 N
+ CH SH UW s n/a 9 1194 1202 1225 N
+ CH SH V e n/a 9 1194 1205 1208 N
+ CH SH V s n/a 9 1194 1205 1208 N
+ CH SH W b n/a 9 1194 1205 1209 N
+ CH SH W e n/a 9 1194 1205 1209 N
+ CH SH W s n/a 9 1194 1205 1209 N
+ CH SH Y b n/a 9 1194 1204 1213 N
+ CH SH Y e n/a 9 1194 1204 1213 N
+ CH SH Y s n/a 9 1194 1204 1213 N
+ CH SH Z e n/a 9 1194 1206 1215 N
+ CH SH Z s n/a 9 1194 1206 1215 N
+ CH SH ZH e n/a 9 1194 1204 1214 N
+ CH SH ZH s n/a 9 1194 1204 1214 N
+ CH SIL AA b n/a 9 1195 1203 1223 N
+ CH SIL AA s n/a 9 1195 1203 1222 N
+ CH SIL AE b n/a 9 1195 1198 1218 N
+ CH SIL AE s n/a 9 1195 1198 1220 N
+ CH SIL AH b n/a 9 1195 1198 1217 N
+ CH SIL AH s n/a 9 1195 1198 1220 N
+ CH SIL AO b n/a 9 1195 1203 1223 N
+ CH SIL AO s n/a 9 1195 1203 1222 N
+ CH SIL AW b n/a 9 1195 1198 1218 N
+ CH SIL AW s n/a 9 1195 1198 1220 N
+ CH SIL AY b n/a 9 1195 1203 1223 N
+ CH SIL AY s n/a 9 1195 1203 1222 N
+ CH SIL B s n/a 9 1195 1205 1211 N
+ CH SIL CH s n/a 9 1195 1204 1214 N
+ CH SIL D s n/a 9 1195 1206 1215 N
+ CH SIL DH s n/a 9 1195 1206 1215 N
+ CH SIL EH b n/a 9 1195 1198 1218 N
+ CH SIL EH s n/a 9 1195 1198 1220 N
+ CH SIL ER b n/a 9 1195 1202 1224 N
+ CH SIL ER s n/a 9 1195 1202 1224 N
+ CH SIL EY b n/a 9 1195 1198 1218 N
+ CH SIL EY s n/a 9 1195 1198 1220 N
+ CH SIL F s n/a 9 1195 1205 1208 N
+ CH SIL G s n/a 9 1195 1205 1211 N
+ CH SIL HH s n/a 9 1195 1204 1213 N
+ CH SIL IH b n/a 9 1195 1198 1220 N
+ CH SIL IH s n/a 9 1195 1198 1220 N
+ CH SIL IY b n/a 9 1195 1198 1219 N
+ CH SIL IY s n/a 9 1195 1198 1219 N
+ CH SIL JH s n/a 9 1195 1204 1214 N
+ CH SIL K s n/a 9 1195 1205 1211 N
+ CH SIL L b n/a 9 1195 1204 1212 N
+ CH SIL L s n/a 9 1195 1204 1212 N
+ CH SIL M s n/a 9 1195 1205 1212 N
+ CH SIL N s n/a 9 1195 1206 1215 N
+ CH SIL NG s n/a 9 1195 1205 1208 N
+ CH SIL OW b n/a 9 1195 1202 1222 N
+ CH SIL OW s n/a 9 1195 1202 1222 N
+ CH SIL OY b n/a 9 1195 1203 1223 N
+ CH SIL OY s n/a 9 1195 1203 1222 N
+ CH SIL P s n/a 9 1195 1205 1211 N
+ CH SIL R b n/a 9 1195 1205 1209 N
+ CH SIL R s n/a 9 1195 1205 1209 N
+ CH SIL S s n/a 9 1195 1206 1214 N
+ CH SIL SH s n/a 9 1195 1204 1214 N
+ CH SIL SIL s n/a 9 1195 1204 1210 N
+ CH SIL T s n/a 9 1195 1206 1216 N
+ CH SIL TH s n/a 9 1195 1206 1215 N
+ CH SIL UH b n/a 9 1195 1202 1224 N
+ CH SIL UH s n/a 9 1195 1202 1224 N
+ CH SIL UW b n/a 9 1195 1202 1225 N
+ CH SIL UW s n/a 9 1195 1202 1225 N
+ CH SIL V s n/a 9 1195 1205 1208 N
+ CH SIL W b n/a 9 1195 1205 1209 N
+ CH SIL W s n/a 9 1195 1205 1209 N
+ CH SIL Y b n/a 9 1195 1204 1213 N
+ CH SIL Y s n/a 9 1195 1204 1213 N
+ CH SIL Z s n/a 9 1195 1206 1215 N
+ CH SIL ZH s n/a 9 1195 1204 1214 N
+ CH T AA b n/a 9 1195 1201 1223 N
+ CH T AA e n/a 9 1195 1201 1222 N
+ CH T AA i n/a 9 1196 1201 1222 N
+ CH T AA s n/a 9 1195 1201 1222 N
+ CH T AE b n/a 9 1195 1198 1218 N
+ CH T AE e n/a 9 1195 1198 1221 N
+ CH T AE i n/a 9 1196 1198 1220 N
+ CH T AE s n/a 9 1195 1198 1220 N
+ CH T AH b n/a 9 1195 1198 1217 N
+ CH T AH e n/a 9 1195 1198 1221 N
+ CH T AH i n/a 9 1196 1198 1220 N
+ CH T AH s n/a 9 1195 1198 1220 N
+ CH T AO b n/a 9 1195 1201 1223 N
+ CH T AO e n/a 9 1195 1201 1222 N
+ CH T AO s n/a 9 1195 1201 1222 N
+ CH T AW b n/a 9 1195 1198 1218 N
+ CH T AW e n/a 9 1195 1198 1221 N
+ CH T AW s n/a 9 1195 1198 1220 N
+ CH T AY b n/a 9 1195 1201 1223 N
+ CH T AY e n/a 9 1195 1201 1222 N
+ CH T AY s n/a 9 1195 1201 1222 N
+ CH T B e n/a 9 1195 1205 1211 N
+ CH T B s n/a 9 1195 1205 1211 N
+ CH T CH e n/a 9 1195 1204 1214 N
+ CH T CH s n/a 9 1195 1204 1214 N
+ CH T D e n/a 9 1195 1206 1215 N
+ CH T D s n/a 9 1195 1206 1215 N
+ CH T DH e n/a 9 1195 1206 1215 N
+ CH T DH s n/a 9 1195 1206 1215 N
+ CH T EH b n/a 9 1195 1198 1218 N
+ CH T EH e n/a 9 1195 1198 1221 N
+ CH T EH i n/a 9 1196 1198 1220 N
+ CH T EH s n/a 9 1195 1198 1220 N
+ CH T ER b n/a 9 1195 1201 1224 N
+ CH T ER e n/a 9 1195 1201 1224 N
+ CH T ER i n/a 9 1196 1201 1224 N
+ CH T ER s n/a 9 1195 1201 1224 N
+ CH T EY b n/a 9 1195 1198 1218 N
+ CH T EY e n/a 9 1195 1198 1221 N
+ CH T EY i n/a 9 1196 1198 1220 N
+ CH T EY s n/a 9 1195 1198 1220 N
+ CH T F e n/a 9 1195 1205 1208 N
+ CH T F s n/a 9 1195 1205 1208 N
+ CH T G e n/a 9 1195 1205 1211 N
+ CH T G s n/a 9 1195 1205 1211 N
+ CH T HH e n/a 9 1195 1204 1213 N
+ CH T HH s n/a 9 1195 1204 1213 N
+ CH T IH b n/a 9 1195 1198 1220 N
+ CH T IH e n/a 9 1195 1198 1221 N
+ CH T IH i n/a 9 1196 1198 1220 N
+ CH T IH s n/a 9 1195 1198 1220 N
+ CH T IY b n/a 9 1195 1198 1219 N
+ CH T IY e n/a 9 1195 1198 1219 N
+ CH T IY i n/a 9 1196 1198 1219 N
+ CH T IY s n/a 9 1195 1198 1219 N
+ CH T JH e n/a 9 1195 1204 1214 N
+ CH T JH s n/a 9 1195 1204 1214 N
+ CH T K e n/a 9 1195 1205 1211 N
+ CH T K s n/a 9 1195 1205 1211 N
+ CH T L b n/a 9 1195 1204 1212 N
+ CH T L e n/a 9 1195 1204 1212 N
+ CH T L s n/a 9 1195 1204 1212 N
+ CH T M e n/a 9 1195 1205 1212 N
+ CH T M s n/a 9 1195 1205 1212 N
+ CH T N e n/a 9 1195 1206 1215 N
+ CH T N s n/a 9 1195 1206 1215 N
+ CH T NG e n/a 9 1195 1205 1208 N
+ CH T NG s n/a 9 1195 1205 1208 N
+ CH T OW b n/a 9 1195 1201 1222 N
+ CH T OW e n/a 9 1195 1201 1222 N
+ CH T OW s n/a 9 1195 1201 1222 N
+ CH T OY b n/a 9 1195 1201 1223 N
+ CH T OY e n/a 9 1195 1201 1222 N
+ CH T OY s n/a 9 1195 1201 1222 N
+ CH T P e n/a 9 1195 1205 1211 N
+ CH T P s n/a 9 1195 1205 1211 N
+ CH T R b n/a 9 1195 1205 1209 N
+ CH T R e n/a 9 1195 1205 1209 N
+ CH T R s n/a 9 1195 1205 1209 N
+ CH T S e n/a 9 1195 1206 1214 N
+ CH T S s n/a 9 1195 1206 1214 N
+ CH T SH e n/a 9 1195 1204 1214 N
+ CH T SH s n/a 9 1195 1204 1214 N
+ CH T SIL e n/a 9 1195 1204 1210 N
+ CH T SIL s n/a 9 1195 1204 1210 N
+ CH T T e n/a 9 1195 1206 1216 N
+ CH T T i n/a 9 1196 1206 1216 N
+ CH T T s n/a 9 1195 1206 1216 N
+ CH T TH e n/a 9 1195 1206 1215 N
+ CH T TH s n/a 9 1195 1206 1215 N
+ CH T UH b n/a 9 1195 1201 1224 N
+ CH T UH e n/a 9 1195 1201 1224 N
+ CH T UH s n/a 9 1195 1201 1224 N
+ CH T UW b n/a 9 1195 1201 1225 N
+ CH T UW e n/a 9 1195 1201 1225 N
+ CH T UW s n/a 9 1195 1201 1225 N
+ CH T V e n/a 9 1195 1205 1208 N
+ CH T V s n/a 9 1195 1205 1208 N
+ CH T W b n/a 9 1195 1205 1209 N
+ CH T W e n/a 9 1195 1205 1209 N
+ CH T W s n/a 9 1195 1205 1209 N
+ CH T Y b n/a 9 1195 1204 1213 N
+ CH T Y e n/a 9 1195 1204 1213 N
+ CH T Y s n/a 9 1195 1204 1213 N
+ CH T Z e n/a 9 1195 1206 1215 N
+ CH T Z s n/a 9 1195 1206 1215 N
+ CH T ZH e n/a 9 1195 1204 1214 N
+ CH T ZH s n/a 9 1195 1204 1214 N
+ CH TH AA b n/a 9 1194 1203 1223 N
+ CH TH AA s n/a 9 1194 1203 1222 N
+ CH TH AE b n/a 9 1194 1198 1218 N
+ CH TH AE s n/a 9 1194 1198 1220 N
+ CH TH AH b n/a 9 1194 1198 1217 N
+ CH TH AH s n/a 9 1194 1198 1220 N
+ CH TH AO b n/a 9 1194 1203 1223 N
+ CH TH AO s n/a 9 1194 1203 1222 N
+ CH TH AW b n/a 9 1194 1198 1218 N
+ CH TH AW s n/a 9 1194 1198 1220 N
+ CH TH AY b n/a 9 1194 1203 1223 N
+ CH TH AY i n/a 9 1194 1203 1222 N
+ CH TH AY s n/a 9 1194 1203 1222 N
+ CH TH B s n/a 9 1194 1205 1211 N
+ CH TH CH s n/a 9 1194 1204 1214 N
+ CH TH D s n/a 9 1194 1206 1215 N
+ CH TH DH s n/a 9 1194 1206 1215 N
+ CH TH EH b n/a 9 1194 1198 1218 N
+ CH TH EH s n/a 9 1194 1198 1220 N
+ CH TH ER b n/a 9 1194 1202 1224 N
+ CH TH ER s n/a 9 1194 1202 1224 N
+ CH TH EY b n/a 9 1194 1198 1218 N
+ CH TH EY s n/a 9 1194 1198 1220 N
+ CH TH F s n/a 9 1194 1205 1208 N
+ CH TH G s n/a 9 1194 1205 1211 N
+ CH TH HH s n/a 9 1194 1204 1213 N
+ CH TH IH b n/a 9 1194 1198 1220 N
+ CH TH IH s n/a 9 1194 1198 1220 N
+ CH TH IY b n/a 9 1194 1198 1219 N
+ CH TH IY s n/a 9 1194 1198 1219 N
+ CH TH JH s n/a 9 1194 1204 1214 N
+ CH TH K s n/a 9 1194 1205 1211 N
+ CH TH L b n/a 9 1194 1204 1212 N
+ CH TH L s n/a 9 1194 1204 1212 N
+ CH TH M s n/a 9 1194 1205 1212 N
+ CH TH N s n/a 9 1194 1206 1215 N
+ CH TH NG s n/a 9 1194 1205 1208 N
+ CH TH OW b n/a 9 1194 1202 1222 N
+ CH TH OW s n/a 9 1194 1202 1222 N
+ CH TH OY b n/a 9 1194 1203 1223 N
+ CH TH OY s n/a 9 1194 1203 1222 N
+ CH TH P s n/a 9 1194 1205 1211 N
+ CH TH R b n/a 9 1194 1205 1209 N
+ CH TH R s n/a 9 1194 1205 1209 N
+ CH TH S s n/a 9 1194 1206 1214 N
+ CH TH SH s n/a 9 1194 1204 1214 N
+ CH TH SIL s n/a 9 1194 1204 1210 N
+ CH TH T s n/a 9 1194 1206 1216 N
+ CH TH TH s n/a 9 1194 1206 1215 N
+ CH TH UH b n/a 9 1194 1202 1224 N
+ CH TH UH s n/a 9 1194 1202 1224 N
+ CH TH UW b n/a 9 1194 1202 1225 N
+ CH TH UW s n/a 9 1194 1202 1225 N
+ CH TH V s n/a 9 1194 1205 1208 N
+ CH TH W b n/a 9 1194 1205 1209 N
+ CH TH W s n/a 9 1194 1205 1209 N
+ CH TH Y b n/a 9 1194 1204 1213 N
+ CH TH Y s n/a 9 1194 1204 1213 N
+ CH TH Z s n/a 9 1194 1206 1215 N
+ CH TH ZH s n/a 9 1194 1204 1214 N
+ CH UH AA b n/a 9 1193 1203 1223 N
+ CH UH AA e n/a 9 1192 1203 1222 N
+ CH UH AA s n/a 9 1193 1203 1222 N
+ CH UH AE b n/a 9 1193 1198 1218 N
+ CH UH AE e n/a 9 1192 1199 1221 N
+ CH UH AE s n/a 9 1193 1199 1220 N
+ CH UH AH b n/a 9 1193 1198 1217 N
+ CH UH AH e n/a 9 1192 1199 1221 N
+ CH UH AH s n/a 9 1193 1199 1220 N
+ CH UH AO b n/a 9 1193 1203 1223 N
+ CH UH AO e n/a 9 1192 1203 1222 N
+ CH UH AO s n/a 9 1193 1203 1222 N
+ CH UH AW b n/a 9 1193 1198 1218 N
+ CH UH AW e n/a 9 1192 1199 1221 N
+ CH UH AW s n/a 9 1193 1199 1220 N
+ CH UH AY b n/a 9 1193 1203 1223 N
+ CH UH AY e n/a 9 1192 1203 1222 N
+ CH UH AY s n/a 9 1193 1203 1222 N
+ CH UH B e n/a 9 1192 1199 1211 N
+ CH UH B s n/a 9 1193 1199 1211 N
+ CH UH CH e n/a 9 1192 1199 1214 N
+ CH UH CH s n/a 9 1193 1199 1214 N
+ CH UH D e n/a 9 1192 1207 1215 N
+ CH UH D s n/a 9 1193 1207 1215 N
+ CH UH DH e n/a 9 1192 1207 1215 N
+ CH UH DH s n/a 9 1193 1207 1215 N
+ CH UH EH b n/a 9 1193 1198 1218 N
+ CH UH EH e n/a 9 1192 1199 1221 N
+ CH UH EH s n/a 9 1193 1199 1220 N
+ CH UH ER b n/a 9 1193 1202 1224 N
+ CH UH ER e n/a 9 1192 1202 1224 N
+ CH UH ER i n/a 9 1193 1202 1224 N
+ CH UH ER s n/a 9 1193 1202 1224 N
+ CH UH EY b n/a 9 1193 1198 1218 N
+ CH UH EY e n/a 9 1192 1199 1221 N
+ CH UH EY s n/a 9 1193 1199 1220 N
+ CH UH F e n/a 9 1192 1199 1208 N
+ CH UH F s n/a 9 1193 1199 1208 N
+ CH UH G e n/a 9 1192 1199 1211 N
+ CH UH G s n/a 9 1193 1199 1211 N
+ CH UH HH e n/a 9 1192 1199 1213 N
+ CH UH HH s n/a 9 1193 1199 1213 N
+ CH UH IH b n/a 9 1193 1198 1220 N
+ CH UH IH e n/a 9 1192 1199 1221 N
+ CH UH IH s n/a 9 1193 1199 1220 N
+ CH UH IY b n/a 9 1193 1198 1219 N
+ CH UH IY e n/a 9 1192 1199 1219 N
+ CH UH IY s n/a 9 1193 1199 1219 N
+ CH UH JH e n/a 9 1192 1199 1214 N
+ CH UH JH s n/a 9 1193 1199 1214 N
+ CH UH K e n/a 9 1192 1199 1211 N
+ CH UH K i n/a 9 1193 1199 1211 N
+ CH UH K s n/a 9 1193 1199 1211 N
+ CH UH L b n/a 9 1193 1203 1212 N
+ CH UH L e n/a 9 1192 1203 1212 N
+ CH UH L s n/a 9 1193 1203 1212 N
+ CH UH M e n/a 9 1192 1199 1212 N
+ CH UH M s n/a 9 1193 1199 1212 N
+ CH UH N e n/a 9 1192 1207 1215 N
+ CH UH N s n/a 9 1193 1207 1215 N
+ CH UH NG e n/a 9 1192 1199 1208 N
+ CH UH NG s n/a 9 1193 1199 1208 N
+ CH UH OW b n/a 9 1193 1202 1222 N
+ CH UH OW e n/a 9 1192 1202 1222 N
+ CH UH OW s n/a 9 1193 1202 1222 N
+ CH UH OY b n/a 9 1193 1203 1223 N
+ CH UH OY e n/a 9 1192 1203 1222 N
+ CH UH OY s n/a 9 1193 1203 1222 N
+ CH UH P e n/a 9 1192 1199 1211 N
+ CH UH P s n/a 9 1193 1199 1211 N
+ CH UH R b n/a 9 1193 1203 1209 N
+ CH UH R e n/a 9 1192 1203 1209 N
+ CH UH R s n/a 9 1193 1203 1209 N
+ CH UH S e n/a 9 1192 1207 1214 N
+ CH UH S s n/a 9 1193 1207 1214 N
+ CH UH SH e n/a 9 1192 1199 1214 N
+ CH UH SH s n/a 9 1193 1199 1214 N
+ CH UH SIL e n/a 9 1193 1204 1210 N
+ CH UH SIL s n/a 9 1193 1204 1210 N
+ CH UH T e n/a 9 1192 1207 1216 N
+ CH UH T s n/a 9 1193 1207 1216 N
+ CH UH TH e n/a 9 1192 1207 1215 N
+ CH UH TH s n/a 9 1193 1207 1215 N
+ CH UH UH b n/a 9 1193 1202 1224 N
+ CH UH UH e n/a 9 1192 1202 1224 N
+ CH UH UH s n/a 9 1193 1202 1224 N
+ CH UH UW b n/a 9 1193 1202 1225 N
+ CH UH UW e n/a 9 1192 1202 1225 N
+ CH UH UW s n/a 9 1193 1202 1225 N
+ CH UH V e n/a 9 1192 1199 1208 N
+ CH UH V s n/a 9 1193 1199 1208 N
+ CH UH W b n/a 9 1193 1203 1209 N
+ CH UH W e n/a 9 1192 1203 1209 N
+ CH UH W s n/a 9 1193 1203 1209 N
+ CH UH Y b n/a 9 1193 1198 1213 N
+ CH UH Y e n/a 9 1192 1199 1213 N
+ CH UH Y s n/a 9 1193 1199 1213 N
+ CH UH Z e n/a 9 1192 1207 1215 N
+ CH UH Z s n/a 9 1193 1207 1215 N
+ CH UH ZH e n/a 9 1192 1199 1214 N
+ CH UH ZH s n/a 9 1193 1199 1214 N
+ CH UW AA b n/a 9 1191 1203 1223 N
+ CH UW AA e n/a 9 1191 1203 1222 N
+ CH UW AA i n/a 9 1191 1203 1222 N
+ CH UW AA s n/a 9 1191 1203 1222 N
+ CH UW AE b n/a 9 1191 1198 1218 N
+ CH UW AE e n/a 9 1191 1199 1221 N
+ CH UW AE s n/a 9 1191 1199 1220 N
+ CH UW AH b n/a 9 1191 1198 1217 N
+ CH UW AH e n/a 9 1191 1199 1221 N
+ CH UW AH i n/a 9 1191 1199 1220 N
+ CH UW AH s n/a 9 1191 1199 1220 N
+ CH UW AO b n/a 9 1191 1203 1223 N
+ CH UW AO e n/a 9 1191 1203 1222 N
+ CH UW AO i n/a 9 1191 1203 1222 N
+ CH UW AO s n/a 9 1191 1203 1222 N
+ CH UW AW b n/a 9 1191 1198 1218 N
+ CH UW AW e n/a 9 1191 1199 1221 N
+ CH UW AW s n/a 9 1191 1199 1220 N
+ CH UW AY b n/a 9 1191 1203 1223 N
+ CH UW AY e n/a 9 1191 1203 1222 N
+ CH UW AY s n/a 9 1191 1203 1222 N
+ CH UW B e n/a 9 1191 1199 1211 N
+ CH UW B s n/a 9 1191 1199 1211 N
+ CH UW CH e n/a 9 1191 1199 1214 N
+ CH UW CH s n/a 9 1191 1199 1214 N
+ CH UW D e n/a 9 1191 1207 1215 N
+ CH UW D s n/a 9 1191 1207 1215 N
+ CH UW DH e n/a 9 1191 1207 1215 N
+ CH UW DH s n/a 9 1191 1207 1215 N
+ CH UW EH b n/a 9 1191 1198 1218 N
+ CH UW EH e n/a 9 1191 1199 1221 N
+ CH UW EH i n/a 9 1191 1199 1220 N
+ CH UW EH s n/a 9 1191 1199 1220 N
+ CH UW ER b n/a 9 1191 1202 1224 N
+ CH UW ER e n/a 9 1191 1202 1224 N
+ CH UW ER i n/a 9 1191 1202 1224 N
+ CH UW ER s n/a 9 1191 1202 1224 N
+ CH UW EY b n/a 9 1191 1198 1218 N
+ CH UW EY e n/a 9 1191 1199 1221 N
+ CH UW EY s n/a 9 1191 1199 1220 N
+ CH UW F e n/a 9 1191 1199 1208 N
+ CH UW F s n/a 9 1191 1199 1208 N
+ CH UW G e n/a 9 1191 1199 1211 N
+ CH UW G s n/a 9 1191 1199 1211 N
+ CH UW HH e n/a 9 1191 1199 1213 N
+ CH UW HH s n/a 9 1191 1199 1213 N
+ CH UW IH b n/a 9 1191 1198 1220 N
+ CH UW IH e n/a 9 1191 1199 1221 N
+ CH UW IH i n/a 9 1191 1199 1220 N
+ CH UW IH s n/a 9 1191 1199 1220 N
+ CH UW IY b n/a 9 1191 1198 1219 N
+ CH UW IY e n/a 9 1191 1199 1219 N
+ CH UW IY i n/a 9 1191 1199 1219 N
+ CH UW IY s n/a 9 1191 1199 1219 N
+ CH UW JH e n/a 9 1191 1199 1214 N
+ CH UW JH s n/a 9 1191 1199 1214 N
+ CH UW K e n/a 9 1191 1199 1211 N
+ CH UW K s n/a 9 1191 1199 1211 N
+ CH UW L b n/a 9 1191 1203 1212 N
+ CH UW L e n/a 9 1191 1203 1212 N
+ CH UW L s n/a 9 1191 1203 1212 N
+ CH UW M e n/a 9 1191 1199 1212 N
+ CH UW M i n/a 9 1191 1199 1212 N
+ CH UW M s n/a 9 1191 1199 1212 N
+ CH UW N e n/a 9 1191 1207 1215 N
+ CH UW N s n/a 9 1191 1207 1215 N
+ CH UW NG e n/a 9 1191 1199 1208 N
+ CH UW NG s n/a 9 1191 1199 1208 N
+ CH UW OW b n/a 9 1191 1202 1222 N
+ CH UW OW e n/a 9 1191 1202 1222 N
+ CH UW OW i n/a 9 1191 1202 1222 N
+ CH UW OW s n/a 9 1191 1202 1222 N
+ CH UW OY b n/a 9 1191 1203 1223 N
+ CH UW OY e n/a 9 1191 1203 1222 N
+ CH UW OY s n/a 9 1191 1203 1222 N
+ CH UW P e n/a 9 1191 1199 1211 N
+ CH UW P s n/a 9 1191 1199 1211 N
+ CH UW R b n/a 9 1191 1203 1209 N
+ CH UW R e n/a 9 1191 1203 1209 N
+ CH UW R s n/a 9 1191 1203 1209 N
+ CH UW S e n/a 9 1191 1207 1214 N
+ CH UW S s n/a 9 1191 1207 1214 N
+ CH UW SH e n/a 9 1191 1199 1214 N
+ CH UW SH s n/a 9 1191 1199 1214 N
+ CH UW SIL e n/a 9 1191 1204 1210 N
+ CH UW SIL s n/a 9 1191 1204 1210 N
+ CH UW T e n/a 9 1191 1207 1216 N
+ CH UW T i n/a 9 1191 1207 1216 N
+ CH UW T s n/a 9 1191 1207 1216 N
+ CH UW TH e n/a 9 1191 1207 1215 N
+ CH UW TH s n/a 9 1191 1207 1215 N
+ CH UW UH b n/a 9 1191 1202 1224 N
+ CH UW UH e n/a 9 1191 1202 1224 N
+ CH UW UH s n/a 9 1191 1202 1224 N
+ CH UW UW b n/a 9 1191 1202 1225 N
+ CH UW UW e n/a 9 1191 1202 1225 N
+ CH UW UW i n/a 9 1191 1202 1225 N
+ CH UW UW s n/a 9 1191 1202 1225 N
+ CH UW V e n/a 9 1191 1199 1208 N
+ CH UW V s n/a 9 1191 1199 1208 N
+ CH UW W b n/a 9 1191 1203 1209 N
+ CH UW W e n/a 9 1191 1203 1209 N
+ CH UW W s n/a 9 1191 1203 1209 N
+ CH UW Y b n/a 9 1191 1198 1213 N
+ CH UW Y e n/a 9 1191 1199 1213 N
+ CH UW Y s n/a 9 1191 1199 1213 N
+ CH UW Z e n/a 9 1191 1207 1215 N
+ CH UW Z s n/a 9 1191 1207 1215 N
+ CH UW ZH e n/a 9 1191 1199 1214 N
+ CH UW ZH s n/a 9 1191 1199 1214 N
+ CH V AA b n/a 9 1194 1203 1223 N
+ CH V AA s n/a 9 1194 1203 1222 N
+ CH V AE b n/a 9 1194 1198 1218 N
+ CH V AE i n/a 9 1194 1198 1221 N
+ CH V AE s n/a 9 1194 1198 1220 N
+ CH V AH b n/a 9 1194 1198 1217 N
+ CH V AH s n/a 9 1194 1198 1220 N
+ CH V AO b n/a 9 1194 1203 1223 N
+ CH V AO s n/a 9 1194 1203 1222 N
+ CH V AW b n/a 9 1194 1198 1218 N
+ CH V AW s n/a 9 1194 1198 1220 N
+ CH V AY b n/a 9 1194 1203 1223 N
+ CH V AY s n/a 9 1194 1203 1222 N
+ CH V B s n/a 9 1194 1205 1211 N
+ CH V CH s n/a 9 1194 1204 1214 N
+ CH V D s n/a 9 1194 1206 1215 N
+ CH V DH s n/a 9 1194 1206 1215 N
+ CH V EH b n/a 9 1194 1198 1218 N
+ CH V EH i n/a 9 1194 1198 1221 N
+ CH V EH s n/a 9 1194 1198 1220 N
+ CH V ER b n/a 9 1194 1202 1224 N
+ CH V ER s n/a 9 1194 1202 1224 N
+ CH V EY b n/a 9 1194 1198 1218 N
+ CH V EY s n/a 9 1194 1198 1220 N
+ CH V F s n/a 9 1194 1205 1208 N
+ CH V G s n/a 9 1194 1205 1211 N
+ CH V HH s n/a 9 1194 1204 1213 N
+ CH V IH b n/a 9 1194 1198 1220 N
+ CH V IH i n/a 9 1194 1198 1221 N
+ CH V IH s n/a 9 1194 1198 1220 N
+ CH V IY b n/a 9 1194 1198 1219 N
+ CH V IY s n/a 9 1194 1198 1219 N
+ CH V JH s n/a 9 1194 1204 1214 N
+ CH V K s n/a 9 1194 1205 1211 N
+ CH V L b n/a 9 1194 1204 1212 N
+ CH V L s n/a 9 1194 1204 1212 N
+ CH V M s n/a 9 1194 1205 1212 N
+ CH V N s n/a 9 1194 1206 1215 N
+ CH V NG s n/a 9 1194 1205 1208 N
+ CH V OW b n/a 9 1194 1202 1222 N
+ CH V OW s n/a 9 1194 1202 1222 N
+ CH V OY b n/a 9 1194 1203 1223 N
+ CH V OY s n/a 9 1194 1203 1222 N
+ CH V P s n/a 9 1194 1205 1211 N
+ CH V R b n/a 9 1194 1205 1209 N
+ CH V R s n/a 9 1194 1205 1209 N
+ CH V S s n/a 9 1194 1206 1214 N
+ CH V SH s n/a 9 1194 1204 1214 N
+ CH V SIL s n/a 9 1194 1204 1210 N
+ CH V T s n/a 9 1194 1206 1216 N
+ CH V TH s n/a 9 1194 1206 1215 N
+ CH V UH b n/a 9 1194 1202 1224 N
+ CH V UH i n/a 9 1194 1202 1224 N
+ CH V UH s n/a 9 1194 1202 1224 N
+ CH V UW b n/a 9 1194 1202 1225 N
+ CH V UW s n/a 9 1194 1202 1225 N
+ CH V V s n/a 9 1194 1205 1208 N
+ CH V W b n/a 9 1194 1205 1209 N
+ CH V W s n/a 9 1194 1205 1209 N
+ CH V Y b n/a 9 1194 1204 1213 N
+ CH V Y s n/a 9 1194 1204 1213 N
+ CH V Z s n/a 9 1194 1206 1215 N
+ CH V ZH s n/a 9 1194 1204 1214 N
+ CH W AA b n/a 9 1191 1203 1223 N
+ CH W AA s n/a 9 1188 1203 1222 N
+ CH W AE b n/a 9 1191 1198 1218 N
+ CH W AE s n/a 9 1188 1200 1220 N
+ CH W AH b n/a 9 1191 1198 1217 N
+ CH W AH s n/a 9 1188 1200 1220 N
+ CH W AO b n/a 9 1191 1203 1223 N
+ CH W AO s n/a 9 1188 1203 1222 N
+ CH W AW b n/a 9 1191 1198 1218 N
+ CH W AW s n/a 9 1188 1200 1220 N
+ CH W AY b n/a 9 1191 1203 1223 N
+ CH W AY s n/a 9 1188 1203 1222 N
+ CH W B s n/a 9 1188 1205 1211 N
+ CH W CH s n/a 9 1188 1204 1214 N
+ CH W D s n/a 9 1188 1206 1215 N
+ CH W DH s n/a 9 1188 1206 1215 N
+ CH W EH b n/a 9 1191 1198 1218 N
+ CH W EH s n/a 9 1188 1200 1220 N
+ CH W ER b n/a 9 1191 1201 1224 N
+ CH W ER s n/a 9 1188 1201 1224 N
+ CH W EY b n/a 9 1191 1198 1218 N
+ CH W EY s n/a 9 1188 1200 1220 N
+ CH W F s n/a 9 1188 1205 1208 N
+ CH W G s n/a 9 1188 1205 1211 N
+ CH W HH s n/a 9 1188 1204 1213 N
+ CH W IH b n/a 9 1191 1198 1220 N
+ CH W IH s n/a 9 1188 1200 1220 N
+ CH W IY b n/a 9 1191 1198 1219 N
+ CH W IY s n/a 9 1188 1200 1219 N
+ CH W JH s n/a 9 1188 1204 1214 N
+ CH W K s n/a 9 1188 1205 1211 N
+ CH W L b n/a 9 1191 1204 1212 N
+ CH W L s n/a 9 1188 1204 1212 N
+ CH W M s n/a 9 1188 1205 1212 N
+ CH W N s n/a 9 1188 1206 1215 N
+ CH W NG s n/a 9 1188 1205 1208 N
+ CH W OW b n/a 9 1191 1201 1222 N
+ CH W OW s n/a 9 1188 1201 1222 N
+ CH W OY b n/a 9 1191 1203 1223 N
+ CH W OY s n/a 9 1188 1203 1222 N
+ CH W P s n/a 9 1188 1205 1211 N
+ CH W R b n/a 9 1191 1205 1209 N
+ CH W R s n/a 9 1188 1205 1209 N
+ CH W S s n/a 9 1188 1206 1214 N
+ CH W SH s n/a 9 1188 1204 1214 N
+ CH W SIL s n/a 9 1188 1204 1210 N
+ CH W T s n/a 9 1188 1206 1216 N
+ CH W TH s n/a 9 1188 1206 1215 N
+ CH W UH b n/a 9 1191 1201 1224 N
+ CH W UH s n/a 9 1188 1201 1224 N
+ CH W UW b n/a 9 1191 1201 1225 N
+ CH W UW s n/a 9 1188 1201 1225 N
+ CH W V s n/a 9 1188 1205 1208 N
+ CH W W b n/a 9 1191 1205 1209 N
+ CH W W s n/a 9 1188 1205 1209 N
+ CH W Y b n/a 9 1191 1204 1213 N
+ CH W Y s n/a 9 1188 1204 1213 N
+ CH W Z s n/a 9 1188 1206 1215 N
+ CH W ZH s n/a 9 1188 1204 1214 N
+ CH Y AA b n/a 9 1191 1203 1223 N
+ CH Y AA s n/a 9 1191 1203 1222 N
+ CH Y AE b n/a 9 1191 1198 1218 N
+ CH Y AE s n/a 9 1191 1199 1220 N
+ CH Y AH b n/a 9 1191 1198 1217 N
+ CH Y AH s n/a 9 1191 1199 1220 N
+ CH Y AO b n/a 9 1191 1203 1223 N
+ CH Y AO s n/a 9 1191 1203 1222 N
+ CH Y AW b n/a 9 1191 1198 1218 N
+ CH Y AW s n/a 9 1191 1199 1220 N
+ CH Y AY b n/a 9 1191 1203 1223 N
+ CH Y AY s n/a 9 1191 1203 1222 N
+ CH Y B s n/a 9 1191 1199 1211 N
+ CH Y CH s n/a 9 1191 1199 1214 N
+ CH Y D s n/a 9 1191 1207 1215 N
+ CH Y DH s n/a 9 1191 1207 1215 N
+ CH Y EH b n/a 9 1191 1198 1218 N
+ CH Y EH s n/a 9 1191 1199 1220 N
+ CH Y ER b n/a 9 1191 1202 1224 N
+ CH Y ER s n/a 9 1191 1202 1224 N
+ CH Y EY b n/a 9 1191 1198 1218 N
+ CH Y EY s n/a 9 1191 1199 1220 N
+ CH Y F s n/a 9 1191 1199 1208 N
+ CH Y G s n/a 9 1191 1199 1211 N
+ CH Y HH s n/a 9 1191 1199 1213 N
+ CH Y IH b n/a 9 1191 1198 1220 N
+ CH Y IH s n/a 9 1191 1199 1220 N
+ CH Y IY b n/a 9 1191 1198 1219 N
+ CH Y IY s n/a 9 1191 1199 1219 N
+ CH Y JH s n/a 9 1191 1199 1214 N
+ CH Y K s n/a 9 1191 1199 1211 N
+ CH Y L b n/a 9 1191 1203 1212 N
+ CH Y L s n/a 9 1191 1203 1212 N
+ CH Y M s n/a 9 1191 1199 1212 N
+ CH Y N s n/a 9 1191 1207 1215 N
+ CH Y NG s n/a 9 1191 1199 1208 N
+ CH Y OW b n/a 9 1191 1202 1222 N
+ CH Y OW s n/a 9 1191 1202 1222 N
+ CH Y OY b n/a 9 1191 1203 1223 N
+ CH Y OY s n/a 9 1191 1203 1222 N
+ CH Y P s n/a 9 1191 1199 1211 N
+ CH Y R b n/a 9 1191 1203 1209 N
+ CH Y R s n/a 9 1191 1203 1209 N
+ CH Y S s n/a 9 1191 1207 1214 N
+ CH Y SH s n/a 9 1191 1199 1214 N
+ CH Y SIL s n/a 9 1191 1204 1210 N
+ CH Y T s n/a 9 1191 1207 1216 N
+ CH Y TH s n/a 9 1191 1207 1215 N
+ CH Y UH b n/a 9 1191 1202 1224 N
+ CH Y UH s n/a 9 1191 1202 1224 N
+ CH Y UW b n/a 9 1191 1202 1225 N
+ CH Y UW s n/a 9 1191 1202 1225 N
+ CH Y V s n/a 9 1191 1199 1208 N
+ CH Y W b n/a 9 1191 1203 1209 N
+ CH Y W s n/a 9 1191 1203 1209 N
+ CH Y Y b n/a 9 1191 1198 1213 N
+ CH Y Y s n/a 9 1191 1199 1213 N
+ CH Y Z s n/a 9 1191 1207 1215 N
+ CH Y ZH s n/a 9 1191 1199 1214 N
+ CH Z AA b n/a 9 1194 1203 1223 N
+ CH Z AA s n/a 9 1194 1203 1222 N
+ CH Z AE b n/a 9 1194 1198 1218 N
+ CH Z AE s n/a 9 1194 1200 1220 N
+ CH Z AH b n/a 9 1194 1198 1217 N
+ CH Z AH s n/a 9 1194 1200 1220 N
+ CH Z AO b n/a 9 1194 1203 1223 N
+ CH Z AO s n/a 9 1194 1203 1222 N
+ CH Z AW b n/a 9 1194 1198 1218 N
+ CH Z AW s n/a 9 1194 1200 1220 N
+ CH Z AY b n/a 9 1194 1203 1223 N
+ CH Z AY s n/a 9 1194 1203 1222 N
+ CH Z B s n/a 9 1194 1205 1211 N
+ CH Z CH s n/a 9 1194 1204 1214 N
+ CH Z D s n/a 9 1194 1206 1215 N
+ CH Z DH s n/a 9 1194 1206 1215 N
+ CH Z EH b n/a 9 1194 1198 1218 N
+ CH Z EH s n/a 9 1194 1200 1220 N
+ CH Z ER b n/a 9 1194 1202 1224 N
+ CH Z ER s n/a 9 1194 1202 1224 N
+ CH Z EY b n/a 9 1194 1198 1218 N
+ CH Z EY s n/a 9 1194 1200 1220 N
+ CH Z F s n/a 9 1194 1205 1208 N
+ CH Z G s n/a 9 1194 1205 1211 N
+ CH Z HH s n/a 9 1194 1204 1213 N
+ CH Z IH b n/a 9 1194 1198 1220 N
+ CH Z IH i n/a 9 1194 1200 1221 N
+ CH Z IH s n/a 9 1194 1200 1220 N
+ CH Z IY b n/a 9 1194 1198 1219 N
+ CH Z IY s n/a 9 1194 1200 1219 N
+ CH Z JH s n/a 9 1194 1204 1214 N
+ CH Z K s n/a 9 1194 1205 1211 N
+ CH Z L b n/a 9 1194 1204 1212 N
+ CH Z L s n/a 9 1194 1204 1212 N
+ CH Z M s n/a 9 1194 1205 1212 N
+ CH Z N s n/a 9 1194 1206 1215 N
+ CH Z NG s n/a 9 1194 1205 1208 N
+ CH Z OW b n/a 9 1194 1202 1222 N
+ CH Z OW s n/a 9 1194 1202 1222 N
+ CH Z OY b n/a 9 1194 1203 1223 N
+ CH Z OY s n/a 9 1194 1203 1222 N
+ CH Z P s n/a 9 1194 1205 1211 N
+ CH Z R b n/a 9 1194 1205 1209 N
+ CH Z R s n/a 9 1194 1205 1209 N
+ CH Z S s n/a 9 1194 1206 1214 N
+ CH Z SH s n/a 9 1194 1204 1214 N
+ CH Z SIL s n/a 9 1194 1204 1210 N
+ CH Z T s n/a 9 1194 1206 1216 N
+ CH Z TH s n/a 9 1194 1206 1215 N
+ CH Z UH b n/a 9 1194 1202 1224 N
+ CH Z UH s n/a 9 1194 1202 1224 N
+ CH Z UW b n/a 9 1194 1202 1225 N
+ CH Z UW s n/a 9 1194 1202 1225 N
+ CH Z V s n/a 9 1194 1205 1208 N
+ CH Z W b n/a 9 1194 1205 1209 N
+ CH Z W s n/a 9 1194 1205 1209 N
+ CH Z Y b n/a 9 1194 1204 1213 N
+ CH Z Y s n/a 9 1194 1204 1213 N
+ CH Z Z s n/a 9 1194 1206 1215 N
+ CH Z ZH s n/a 9 1194 1204 1214 N
+ CH ZH AA b n/a 9 1194 1203 1223 N
+ CH ZH AA s n/a 9 1194 1203 1222 N
+ CH ZH AE b n/a 9 1194 1198 1218 N
+ CH ZH AE s n/a 9 1194 1200 1220 N
+ CH ZH AH b n/a 9 1194 1198 1217 N
+ CH ZH AH i n/a 9 1194 1200 1221 N
+ CH ZH AH s n/a 9 1194 1200 1220 N
+ CH ZH AO b n/a 9 1194 1203 1223 N
+ CH ZH AO s n/a 9 1194 1203 1222 N
+ CH ZH AW b n/a 9 1194 1198 1218 N
+ CH ZH AW s n/a 9 1194 1200 1220 N
+ CH ZH AY b n/a 9 1194 1203 1223 N
+ CH ZH AY s n/a 9 1194 1203 1222 N
+ CH ZH B s n/a 9 1194 1205 1211 N
+ CH ZH CH s n/a 9 1194 1204 1214 N
+ CH ZH D s n/a 9 1194 1206 1215 N
+ CH ZH DH s n/a 9 1194 1206 1215 N
+ CH ZH EH b n/a 9 1194 1198 1218 N
+ CH ZH EH s n/a 9 1194 1200 1220 N
+ CH ZH ER b n/a 9 1194 1202 1224 N
+ CH ZH ER s n/a 9 1194 1202 1224 N
+ CH ZH EY b n/a 9 1194 1198 1218 N
+ CH ZH EY s n/a 9 1194 1200 1220 N
+ CH ZH F s n/a 9 1194 1205 1208 N
+ CH ZH G s n/a 9 1194 1205 1211 N
+ CH ZH HH s n/a 9 1194 1204 1213 N
+ CH ZH IH b n/a 9 1194 1198 1220 N
+ CH ZH IH s n/a 9 1194 1200 1220 N
+ CH ZH IY b n/a 9 1194 1198 1219 N
+ CH ZH IY s n/a 9 1194 1200 1219 N
+ CH ZH JH s n/a 9 1194 1204 1214 N
+ CH ZH K s n/a 9 1194 1205 1211 N
+ CH ZH L b n/a 9 1194 1204 1212 N
+ CH ZH L s n/a 9 1194 1204 1212 N
+ CH ZH M s n/a 9 1194 1205 1212 N
+ CH ZH N s n/a 9 1194 1206 1215 N
+ CH ZH NG s n/a 9 1194 1205 1208 N
+ CH ZH OW b n/a 9 1194 1202 1222 N
+ CH ZH OW s n/a 9 1194 1202 1222 N
+ CH ZH OY b n/a 9 1194 1203 1223 N
+ CH ZH OY s n/a 9 1194 1203 1222 N
+ CH ZH P s n/a 9 1194 1205 1211 N
+ CH ZH R b n/a 9 1194 1205 1209 N
+ CH ZH R s n/a 9 1194 1205 1209 N
+ CH ZH S s n/a 9 1194 1206 1214 N
+ CH ZH SH s n/a 9 1194 1204 1214 N
+ CH ZH SIL s n/a 9 1194 1204 1210 N
+ CH ZH T s n/a 9 1194 1206 1216 N
+ CH ZH TH s n/a 9 1194 1206 1215 N
+ CH ZH UH b n/a 9 1194 1202 1224 N
+ CH ZH UH s n/a 9 1194 1202 1224 N
+ CH ZH UW b n/a 9 1194 1202 1225 N
+ CH ZH UW s n/a 9 1194 1202 1225 N
+ CH ZH V s n/a 9 1194 1205 1208 N
+ CH ZH W b n/a 9 1194 1205 1209 N
+ CH ZH W s n/a 9 1194 1205 1209 N
+ CH ZH Y b n/a 9 1194 1204 1213 N
+ CH ZH Y s n/a 9 1194 1204 1213 N
+ CH ZH Z s n/a 9 1194 1206 1215 N
+ CH ZH ZH s n/a 9 1194 1204 1214 N
+ D AA AA b n/a 10 1247 1340 1348 N
+ D AA AA e n/a 10 1247 1325 1415 N
+ D AA AA i n/a 10 1246 1325 1356 N
+ D AA AA s n/a 10 1247 1325 1356 N
+ D AA AE b n/a 10 1247 1340 1343 N
+ D AA AE e n/a 10 1247 1325 1406 N
+ D AA AE i n/a 10 1246 1325 1354 N
+ D AA AE s n/a 10 1247 1325 1354 N
+ D AA AH b n/a 10 1247 1340 1346 N
+ D AA AH e n/a 10 1247 1325 1407 N
+ D AA AH i n/a 10 1246 1325 1355 N
+ D AA AH s n/a 10 1247 1325 1355 N
+ D AA AO b n/a 10 1247 1340 1345 N
+ D AA AO e n/a 10 1247 1325 1415 N
+ D AA AO i n/a 10 1246 1325 1356 N
+ D AA AO s n/a 10 1247 1325 1356 N
+ D AA AW b n/a 10 1247 1340 1344 N
+ D AA AW e n/a 10 1247 1325 1416 N
+ D AA AW s n/a 10 1247 1325 1354 N
+ D AA AY b n/a 10 1247 1340 1349 N
+ D AA AY e n/a 10 1247 1323 1411 N
+ D AA AY i n/a 10 1247 1323 1356 N
+ D AA AY s n/a 10 1247 1323 1356 N
+ D AA B b n/a 10 1247 1318 1395 N
+ D AA B e n/a 10 1247 1318 1395 N
+ D AA B i n/a 10 1247 1318 1395 N
+ D AA B s n/a 10 1247 1318 1395 N
+ D AA CH e n/a 10 1247 1318 1374 N
+ D AA CH i n/a 10 1247 1318 1374 N
+ D AA CH s n/a 10 1247 1318 1374 N
+ D AA D b n/a 10 1247 1318 1395 N
+ D AA D e n/a 10 1247 1318 1395 N
+ D AA D i n/a 10 1247 1318 1395 N
+ D AA D s n/a 10 1247 1318 1395 N
+ D AA DH e n/a 10 1247 1318 1376 N
+ D AA DH s n/a 10 1247 1318 1376 N
+ D AA EH b n/a 10 1247 1340 1343 N
+ D AA EH e n/a 10 1247 1325 1405 N
+ D AA EH i n/a 10 1246 1325 1354 N
+ D AA EH s n/a 10 1247 1325 1354 N
+ D AA ER b n/a 10 1247 1340 1350 N
+ D AA ER e n/a 10 1247 1325 1415 N
+ D AA ER i n/a 10 1246 1325 1357 N
+ D AA ER s n/a 10 1247 1325 1357 N
+ D AA EY b n/a 10 1247 1340 1343 N
+ D AA EY e n/a 10 1247 1323 1405 N
+ D AA EY i n/a 10 1247 1323 1354 N
+ D AA EY s n/a 10 1247 1323 1354 N
+ D AA F b n/a 10 1247 1319 1377 N
+ D AA F e n/a 10 1247 1319 1377 N
+ D AA F i n/a 10 1247 1319 1377 N
+ D AA F s n/a 10 1247 1319 1377 N
+ D AA G b n/a 10 1247 1318 1395 N
+ D AA G e n/a 10 1247 1318 1395 N
+ D AA G i n/a 10 1247 1318 1395 N
+ D AA G s n/a 10 1247 1318 1395 N
+ D AA HH b n/a 10 1247 1340 1388 N
+ D AA HH e n/a 10 1247 1334 1388 N
+ D AA HH i n/a 10 1247 1334 1388 N
+ D AA HH s n/a 10 1247 1334 1388 N
+ D AA IH b n/a 10 1247 1340 1366 N
+ D AA IH e n/a 10 1247 1325 1410 N
+ D AA IH i n/a 10 1246 1325 1370 N
+ D AA IH s n/a 10 1247 1325 1366 N
+ D AA IY b n/a 10 1246 1340 1367 N
+ D AA IY e n/a 10 1246 1323 1410 N
+ D AA IY i n/a 10 1246 1323 1370 N
+ D AA IY s n/a 10 1246 1323 1367 N
+ D AA JH e n/a 10 1247 1318 1374 N
+ D AA JH s n/a 10 1247 1318 1374 N
+ D AA K e n/a 10 1247 1318 1380 N
+ D AA K i n/a 10 1247 1318 1380 N
+ D AA K s n/a 10 1247 1318 1380 N
+ D AA L b n/a 10 1247 1340 1345 N
+ D AA L e n/a 10 1247 1333 1400 N
+ D AA L i n/a 10 1247 1333 1353 N
+ D AA L s n/a 10 1247 1333 1353 N
+ D AA M b n/a 10 1247 1318 1396 N
+ D AA M e n/a 10 1247 1318 1396 N
+ D AA M i n/a 10 1247 1318 1396 N
+ D AA M s n/a 10 1247 1318 1396 N
+ D AA N b n/a 10 1247 1318 1396 N
+ D AA N e n/a 10 1247 1318 1396 N
+ D AA N i n/a 10 1247 1318 1396 N
+ D AA N s n/a 10 1247 1318 1396 N
+ D AA NG e n/a 10 1247 1318 1396 N
+ D AA NG s n/a 10 1247 1318 1396 N
+ D AA OW b n/a 10 1247 1340 1348 N
+ D AA OW e n/a 10 1247 1325 1415 N
+ D AA OW i n/a 10 1246 1325 1356 N
+ D AA OW s n/a 10 1247 1325 1356 N
+ D AA OY b n/a 10 1247 1340 1345 N
+ D AA OY e n/a 10 1247 1323 1411 N
+ D AA OY i n/a 10 1247 1323 1356 N
+ D AA OY s n/a 10 1247 1323 1356 N
+ D AA P e n/a 10 1247 1318 1375 N
+ D AA P s n/a 10 1247 1318 1375 N
+ D AA R b n/a 10 1247 1340 1360 N
+ D AA R e n/a 10 1247 1332 1401 N
+ D AA R i n/a 10 1247 1333 1361 N
+ D AA R s n/a 10 1247 1332 1361 N
+ D AA S b n/a 10 1247 1319 1382 N
+ D AA S e n/a 10 1247 1319 1382 N
+ D AA S i n/a 10 1247 1319 1382 N
+ D AA S s n/a 10 1247 1319 1382 N
+ D AA SH e n/a 10 1247 1319 1383 N
+ D AA SH i n/a 10 1247 1319 1383 N
+ D AA SH s n/a 10 1247 1319 1383 N
+ D AA SIL e n/a 10 1247 1340 1418 N
+ D AA SIL s n/a 10 1247 1340 1418 N
+ D AA T e n/a 10 1247 1318 1374 N
+ D AA T i n/a 10 1247 1318 1374 N
+ D AA T s n/a 10 1247 1318 1374 N
+ D AA TH e n/a 10 1247 1319 1380 N
+ D AA TH s n/a 10 1247 1319 1380 N
+ D AA UH b n/a 10 1247 1340 1366 N
+ D AA UH e n/a 10 1247 1325 1410 N
+ D AA UH i n/a 10 1246 1325 1366 N
+ D AA UH s n/a 10 1247 1325 1366 N
+ D AA UW b n/a 10 1247 1340 1366 N
+ D AA UW e n/a 10 1247 1325 1410 N
+ D AA UW i n/a 10 1246 1325 1366 N
+ D AA UW s n/a 10 1247 1325 1366 N
+ D AA V b n/a 10 1247 1318 1380 N
+ D AA V e n/a 10 1247 1318 1380 N
+ D AA V i n/a 10 1247 1318 1380 N
+ D AA V s n/a 10 1247 1318 1380 N
+ D AA W b n/a 10 1247 1340 1345 N
+ D AA W e n/a 10 1247 1332 1401 N
+ D AA W i n/a 10 1247 1332 1353 N
+ D AA W s n/a 10 1247 1332 1353 N
+ D AA Y b n/a 10 1247 1318 1383 N
+ D AA Y e n/a 10 1247 1318 1383 N
+ D AA Y i n/a 10 1247 1318 1383 N
+ D AA Y s n/a 10 1247 1318 1383 N
+ D AA Z b n/a 10 1247 1318 1382 N
+ D AA Z e n/a 10 1247 1318 1382 N
+ D AA Z i n/a 10 1247 1318 1382 N
+ D AA Z s n/a 10 1247 1318 1382 N
+ D AA ZH e n/a 10 1247 1318 1383 N
+ D AA ZH s n/a 10 1247 1318 1383 N
+ D AE AA b n/a 10 1249 1340 1348 N
+ D AE AA e n/a 10 1249 1324 1415 N
+ D AE AA i n/a 10 1249 1324 1356 N
+ D AE AA s n/a 10 1249 1324 1356 N
+ D AE AE b n/a 10 1249 1340 1343 N
+ D AE AE e n/a 10 1249 1324 1406 N
+ D AE AE i n/a 10 1249 1324 1354 N
+ D AE AE s n/a 10 1249 1324 1354 N
+ D AE AH b n/a 10 1249 1340 1346 N
+ D AE AH e n/a 10 1249 1324 1407 N
+ D AE AH i n/a 10 1249 1324 1355 N
+ D AE AH s n/a 10 1249 1324 1355 N
+ D AE AO b n/a 10 1249 1340 1345 N
+ D AE AO e n/a 10 1249 1324 1415 N
+ D AE AO i n/a 10 1249 1324 1356 N
+ D AE AO s n/a 10 1249 1324 1356 N
+ D AE AW b n/a 10 1249 1340 1344 N
+ D AE AW e n/a 10 1249 1324 1416 N
+ D AE AW i n/a 10 1249 1324 1354 N
+ D AE AW s n/a 10 1249 1324 1354 N
+ D AE AY b n/a 10 1249 1340 1349 N
+ D AE AY e n/a 10 1249 1324 1411 N
+ D AE AY i n/a 10 1249 1324 1356 N
+ D AE AY s n/a 10 1249 1324 1356 N
+ D AE B b n/a 10 1250 1313 1394 N
+ D AE B e n/a 10 1250 1313 1394 N
+ D AE B i n/a 10 1250 1313 1394 N
+ D AE B s n/a 10 1250 1313 1394 N
+ D AE CH e n/a 10 1250 1311 1373 N
+ D AE CH i n/a 10 1250 1311 1373 N
+ D AE CH s n/a 10 1250 1311 1373 N
+ D AE D b n/a 10 1250 1313 1394 N
+ D AE D e n/a 10 1250 1313 1394 N
+ D AE D s n/a 10 1250 1313 1394 N
+ D AE DH e n/a 10 1251 1311 1376 N
+ D AE DH s n/a 10 1251 1311 1376 N
+ D AE EH b n/a 10 1249 1340 1343 N
+ D AE EH e n/a 10 1249 1324 1405 N
+ D AE EH i n/a 10 1249 1324 1354 N
+ D AE EH s n/a 10 1249 1324 1354 N
+ D AE ER b n/a 10 1249 1340 1350 N
+ D AE ER e n/a 10 1249 1324 1415 N
+ D AE ER i n/a 10 1249 1324 1357 N
+ D AE ER s n/a 10 1249 1324 1357 N
+ D AE EY b n/a 10 1249 1340 1343 N
+ D AE EY e n/a 10 1249 1324 1405 N
+ D AE EY i n/a 10 1249 1324 1354 N
+ D AE EY s n/a 10 1249 1324 1354 N
+ D AE F b n/a 10 1252 1319 1377 N
+ D AE F e n/a 10 1252 1319 1377 N
+ D AE F i n/a 10 1252 1319 1377 N
+ D AE F s n/a 10 1252 1319 1377 N
+ D AE G b n/a 10 1250 1313 1395 N
+ D AE G e n/a 10 1250 1313 1395 N
+ D AE G s n/a 10 1250 1313 1395 N
+ D AE HH b n/a 10 1252 1340 1388 N
+ D AE HH e n/a 10 1252 1334 1388 N
+ D AE HH i n/a 10 1252 1334 1388 N
+ D AE HH s n/a 10 1252 1334 1388 N
+ D AE IH b n/a 10 1249 1340 1367 N
+ D AE IH e n/a 10 1249 1324 1410 N
+ D AE IH i n/a 10 1249 1324 1370 N
+ D AE IH s n/a 10 1249 1324 1367 N
+ D AE IY b n/a 10 1249 1340 1367 N
+ D AE IY e n/a 10 1249 1324 1410 N
+ D AE IY i n/a 10 1249 1324 1370 N
+ D AE IY s n/a 10 1249 1324 1367 N
+ D AE JH e n/a 10 1250 1311 1373 N
+ D AE JH i n/a 10 1250 1311 1373 N
+ D AE JH s n/a 10 1250 1311 1373 N
+ D AE K e n/a 10 1250 1311 1380 N
+ D AE K i n/a 10 1250 1311 1380 N
+ D AE K s n/a 10 1250 1311 1380 N
+ D AE L b n/a 10 1248 1340 1345 N
+ D AE L e n/a 10 1248 1333 1400 N
+ D AE L i n/a 10 1248 1333 1353 N
+ D AE L s n/a 10 1248 1333 1353 N
+ D AE M b n/a 10 1250 1313 1396 N
+ D AE M e n/a 10 1250 1313 1396 N
+ D AE M i n/a 10 1250 1313 1396 N
+ D AE M s n/a 10 1250 1313 1396 N
+ D AE N b n/a 10 1250 1313 1396 N
+ D AE N e n/a 10 1250 1313 1396 N
+ D AE N i n/a 10 1250 1313 1396 N
+ D AE N s n/a 10 1250 1313 1396 N
+ D AE NG e n/a 10 1250 1313 1396 N
+ D AE NG s n/a 10 1250 1313 1396 N
+ D AE OW b n/a 10 1249 1340 1348 N
+ D AE OW e n/a 10 1249 1324 1415 N
+ D AE OW i n/a 10 1249 1324 1356 N
+ D AE OW s n/a 10 1249 1324 1356 N
+ D AE OY b n/a 10 1249 1340 1345 N
+ D AE OY e n/a 10 1249 1324 1411 N
+ D AE OY s n/a 10 1249 1324 1356 N
+ D AE P e n/a 10 1250 1311 1375 N
+ D AE P i n/a 10 1250 1311 1375 N
+ D AE P s n/a 10 1250 1311 1375 N
+ D AE R b n/a 10 1248 1340 1360 N
+ D AE R e n/a 10 1248 1332 1401 N
+ D AE R i n/a 10 1248 1333 1361 N
+ D AE R s n/a 10 1248 1332 1361 N
+ D AE S b n/a 10 1252 1319 1382 N
+ D AE S e n/a 10 1252 1319 1382 N
+ D AE S i n/a 10 1252 1319 1382 N
+ D AE S s n/a 10 1252 1319 1382 N
+ D AE SH e n/a 10 1252 1319 1383 N
+ D AE SH i n/a 10 1252 1319 1383 N
+ D AE SH s n/a 10 1252 1319 1383 N
+ D AE SIL e n/a 10 1252 1338 1419 N
+ D AE SIL s n/a 10 1252 1340 1419 N
+ D AE T e n/a 10 1250 1311 1373 N
+ D AE T i n/a 10 1250 1311 1373 N
+ D AE T s n/a 10 1250 1311 1373 N
+ D AE TH e n/a 10 1251 1319 1380 N
+ D AE TH s n/a 10 1251 1319 1380 N
+ D AE UH b n/a 10 1249 1340 1367 N
+ D AE UH e n/a 10 1249 1324 1410 N
+ D AE UH i n/a 10 1249 1324 1367 N
+ D AE UH s n/a 10 1249 1324 1367 N
+ D AE UW b n/a 10 1249 1340 1367 N
+ D AE UW e n/a 10 1249 1324 1410 N
+ D AE UW i n/a 10 1249 1324 1367 N
+ D AE UW s n/a 10 1249 1324 1367 N
+ D AE V b n/a 10 1252 1311 1380 N
+ D AE V e n/a 10 1252 1311 1380 N
+ D AE V i n/a 10 1252 1311 1380 N
+ D AE V s n/a 10 1252 1311 1380 N
+ D AE W b n/a 10 1248 1340 1345 N
+ D AE W e n/a 10 1248 1332 1401 N
+ D AE W i n/a 10 1248 1332 1353 N
+ D AE W s n/a 10 1248 1332 1353 N
+ D AE Y b n/a 10 1250 1311 1383 N
+ D AE Y e n/a 10 1250 1311 1383 N
+ D AE Y i n/a 10 1250 1311 1383 N
+ D AE Y s n/a 10 1250 1311 1383 N
+ D AE Z b n/a 10 1252 1311 1382 N
+ D AE Z e n/a 10 1252 1311 1382 N
+ D AE Z i n/a 10 1252 1311 1382 N
+ D AE Z s n/a 10 1252 1311 1382 N
+ D AE ZH e n/a 10 1252 1311 1383 N
+ D AE ZH s n/a 10 1252 1311 1383 N
+ D AH AA b n/a 10 1244 1335 1347 N
+ D AH AA e n/a 10 1229 1321 1415 N
+ D AH AA i n/a 10 1231 1321 1356 N
+ D AH AA s n/a 10 1229 1321 1356 N
+ D AH AE b n/a 10 1244 1335 1343 N
+ D AH AE e n/a 10 1229 1321 1406 N
+ D AH AE i n/a 10 1231 1321 1354 N
+ D AH AE s n/a 10 1229 1321 1354 N
+ D AH AH b n/a 10 1244 1335 1346 N
+ D AH AH e n/a 10 1229 1321 1407 N
+ D AH AH i n/a 10 1233 1322 1355 N
+ D AH AH s n/a 10 1229 1321 1355 N
+ D AH AO b n/a 10 1244 1335 1345 N
+ D AH AO e n/a 10 1229 1321 1415 N
+ D AH AO i n/a 10 1231 1321 1356 N
+ D AH AO s n/a 10 1229 1321 1356 N
+ D AH AW b n/a 10 1244 1335 1344 N
+ D AH AW e n/a 10 1229 1321 1416 N
+ D AH AW i n/a 10 1231 1321 1354 N
+ D AH AW s n/a 10 1229 1321 1354 N
+ D AH AY b n/a 10 1244 1335 1349 N
+ D AH AY e n/a 10 1229 1321 1411 N
+ D AH AY i n/a 10 1231 1321 1356 N
+ D AH AY s n/a 10 1229 1321 1356 N
+ D AH B b n/a 10 1244 1312 1395 N
+ D AH B e n/a 10 1226 1312 1395 N
+ D AH B i n/a 10 1226 1312 1395 N
+ D AH B s n/a 10 1226 1312 1395 N
+ D AH CH e n/a 10 1228 1314 1374 N
+ D AH CH s n/a 10 1228 1314 1374 N
+ D AH D b n/a 10 1244 1312 1395 N
+ D AH D e n/a 10 1226 1312 1395 N
+ D AH D s n/a 10 1226 1312 1395 N
+ D AH DH e n/a 10 1227 1316 1376 N
+ D AH DH s n/a 10 1227 1316 1376 N
+ D AH EH b n/a 10 1244 1335 1343 N
+ D AH EH e n/a 10 1229 1321 1405 N
+ D AH EH i n/a 10 1231 1321 1354 N
+ D AH EH s n/a 10 1229 1321 1354 N
+ D AH ER b n/a 10 1244 1335 1350 N
+ D AH ER e n/a 10 1229 1320 1415 N
+ D AH ER i n/a 10 1233 1320 1357 N
+ D AH ER s n/a 10 1229 1320 1357 N
+ D AH EY b n/a 10 1244 1335 1343 N
+ D AH EY e n/a 10 1229 1321 1405 N
+ D AH EY i n/a 10 1231 1321 1354 N
+ D AH EY s n/a 10 1229 1321 1354 N
+ D AH F b n/a 10 1244 1319 1377 N
+ D AH F e n/a 10 1228 1319 1377 N
+ D AH F i n/a 10 1228 1319 1377 N
+ D AH F s n/a 10 1228 1319 1377 N
+ D AH G b n/a 10 1244 1311 1395 N
+ D AH G e n/a 10 1228 1311 1395 N
+ D AH G i n/a 10 1228 1311 1395 N
+ D AH G s n/a 10 1228 1311 1395 N
+ D AH HH b n/a 10 1244 1335 1388 N
+ D AH HH e n/a 10 1228 1334 1388 N
+ D AH HH i n/a 10 1228 1334 1388 N
+ D AH HH s n/a 10 1228 1334 1388 N
+ D AH IH b n/a 10 1244 1336 1365 N
+ D AH IH e n/a 10 1229 1326 1410 N
+ D AH IH i n/a 10 1231 1326 1372 N
+ D AH IH s n/a 10 1229 1326 1365 N
+ D AH IY b n/a 10 1244 1336 1367 N
+ D AH IY e n/a 10 1229 1328 1410 N
+ D AH IY i n/a 10 1233 1328 1369 N
+ D AH IY s n/a 10 1229 1328 1367 N
+ D AH JH e n/a 10 1228 1314 1374 N
+ D AH JH s n/a 10 1228 1314 1374 N
+ D AH K e n/a 10 1228 1315 1380 N
+ D AH K i n/a 10 1228 1315 1380 N
+ D AH K s n/a 10 1228 1315 1380 N
+ D AH L b n/a 10 1244 1336 1345 N
+ D AH L e n/a 10 1228 1333 1400 N
+ D AH L i n/a 10 1228 1333 1353 N
+ D AH L s n/a 10 1228 1333 1353 N
+ D AH M b n/a 10 1244 1312 1396 N
+ D AH M e n/a 10 1226 1312 1396 N
+ D AH M i n/a 10 1226 1312 1396 N
+ D AH M s n/a 10 1226 1312 1396 N
+ D AH N b n/a 10 1244 1312 1396 N
+ D AH N e n/a 10 1226 1312 1396 N
+ D AH N i n/a 10 1226 1312 1396 N
+ D AH N s n/a 10 1226 1312 1396 N
+ D AH NG e n/a 10 1228 1312 1396 N
+ D AH NG s n/a 10 1228 1312 1396 N
+ D AH OW b n/a 10 1244 1335 1346 N
+ D AH OW e n/a 10 1229 1321 1415 N
+ D AH OW i n/a 10 1231 1321 1356 N
+ D AH OW s n/a 10 1229 1321 1356 N
+ D AH OY b n/a 10 1244 1335 1345 N
+ D AH OY e n/a 10 1229 1321 1411 N
+ D AH OY i n/a 10 1231 1321 1356 N
+ D AH OY s n/a 10 1229 1321 1356 N
+ D AH P e n/a 10 1227 1314 1375 N
+ D AH P i n/a 10 1227 1314 1375 N
+ D AH P s n/a 10 1227 1314 1375 N
+ D AH R b n/a 10 1244 1336 1360 N
+ D AH R e n/a 10 1228 1332 1401 N
+ D AH R i n/a 10 1228 1333 1360 N
+ D AH R s n/a 10 1228 1332 1360 N
+ D AH S b n/a 10 1244 1319 1382 N
+ D AH S e n/a 10 1227 1319 1382 N
+ D AH S i n/a 10 1227 1319 1382 N
+ D AH S s n/a 10 1227 1319 1382 N
+ D AH SH e n/a 10 1228 1319 1383 N
+ D AH SH i n/a 10 1228 1319 1383 N
+ D AH SH s n/a 10 1228 1319 1383 N
+ D AH SIL e n/a 10 1230 1339 1419 N
+ D AH SIL s n/a 10 1230 1335 1419 N
+ D AH T e n/a 10 1227 1314 1374 N
+ D AH T i n/a 10 1227 1314 1374 N
+ D AH T s n/a 10 1227 1314 1374 N
+ D AH TH e n/a 10 1227 1319 1380 N
+ D AH TH i n/a 10 1227 1319 1380 N
+ D AH TH s n/a 10 1227 1319 1380 N
+ D AH UH b n/a 10 1244 1336 1363 N
+ D AH UH e n/a 10 1229 1326 1410 N
+ D AH UH i n/a 10 1231 1326 1363 N
+ D AH UH s n/a 10 1229 1326 1363 N
+ D AH UW b n/a 10 1244 1336 1363 N
+ D AH UW e n/a 10 1229 1326 1410 N
+ D AH UW i n/a 10 1231 1326 1363 N
+ D AH UW s n/a 10 1229 1326 1363 N
+ D AH V b n/a 10 1244 1316 1380 N
+ D AH V e n/a 10 1228 1316 1380 N
+ D AH V i n/a 10 1228 1316 1380 N
+ D AH V s n/a 10 1228 1316 1380 N
+ D AH W b n/a 10 1244 1336 1345 N
+ D AH W e n/a 10 1228 1332 1401 N
+ D AH W i n/a 10 1228 1332 1353 N
+ D AH W s n/a 10 1228 1332 1353 N
+ D AH Y b n/a 10 1244 1315 1383 N
+ D AH Y e n/a 10 1228 1315 1383 N
+ D AH Y i n/a 10 1228 1315 1383 N
+ D AH Y s n/a 10 1228 1315 1383 N
+ D AH Z b n/a 10 1244 1316 1382 N
+ D AH Z e n/a 10 1227 1316 1382 N
+ D AH Z i n/a 10 1227 1316 1382 N
+ D AH Z s n/a 10 1227 1316 1382 N
+ D AH ZH e n/a 10 1228 1316 1383 N
+ D AH ZH s n/a 10 1228 1316 1383 N
+ D AO AA b n/a 10 1247 1340 1348 N
+ D AO AA e n/a 10 1247 1325 1415 N
+ D AO AA i n/a 10 1246 1325 1356 N
+ D AO AA s n/a 10 1247 1325 1356 N
+ D AO AE b n/a 10 1247 1340 1343 N
+ D AO AE e n/a 10 1247 1325 1406 N
+ D AO AE i n/a 10 1246 1325 1354 N
+ D AO AE s n/a 10 1247 1325 1354 N
+ D AO AH b n/a 10 1247 1340 1346 N
+ D AO AH e n/a 10 1247 1325 1407 N
+ D AO AH i n/a 10 1246 1325 1355 N
+ D AO AH s n/a 10 1247 1325 1355 N
+ D AO AO b n/a 10 1247 1340 1345 N
+ D AO AO e n/a 10 1247 1325 1415 N
+ D AO AO s n/a 10 1247 1325 1356 N
+ D AO AW b n/a 10 1247 1340 1344 N
+ D AO AW e n/a 10 1247 1325 1416 N
+ D AO AW i n/a 10 1246 1325 1354 N
+ D AO AW s n/a 10 1247 1325 1354 N
+ D AO AY b n/a 10 1247 1340 1349 N
+ D AO AY e n/a 10 1247 1323 1411 N
+ D AO AY i n/a 10 1247 1323 1356 N
+ D AO AY s n/a 10 1247 1323 1356 N
+ D AO B b n/a 10 1247 1318 1395 N
+ D AO B e n/a 10 1247 1318 1395 N
+ D AO B i n/a 10 1247 1318 1395 N
+ D AO B s n/a 10 1247 1318 1395 N
+ D AO CH e n/a 10 1247 1318 1374 N
+ D AO CH s n/a 10 1247 1318 1374 N
+ D AO D b n/a 10 1247 1318 1395 N
+ D AO D e n/a 10 1247 1318 1395 N
+ D AO D s n/a 10 1247 1318 1395 N
+ D AO DH e n/a 10 1247 1318 1376 N
+ D AO DH s n/a 10 1247 1318 1376 N
+ D AO EH b n/a 10 1247 1340 1343 N
+ D AO EH e n/a 10 1247 1325 1405 N
+ D AO EH i n/a 10 1246 1325 1354 N
+ D AO EH s n/a 10 1247 1325 1354 N
+ D AO ER b n/a 10 1247 1340 1350 N
+ D AO ER e n/a 10 1247 1325 1415 N
+ D AO ER i n/a 10 1246 1325 1357 N
+ D AO ER s n/a 10 1247 1325 1357 N
+ D AO EY b n/a 10 1247 1340 1343 N
+ D AO EY e n/a 10 1247 1323 1405 N
+ D AO EY i n/a 10 1247 1323 1354 N
+ D AO EY s n/a 10 1247 1323 1354 N
+ D AO F b n/a 10 1247 1319 1377 N
+ D AO F e n/a 10 1247 1319 1377 N
+ D AO F i n/a 10 1247 1319 1377 N
+ D AO F s n/a 10 1247 1319 1377 N
+ D AO G b n/a 10 1247 1318 1395 N
+ D AO G e n/a 10 1247 1318 1395 N
+ D AO G s n/a 10 1247 1318 1395 N
+ D AO HH b n/a 10 1247 1340 1388 N
+ D AO HH e n/a 10 1247 1334 1388 N
+ D AO HH i n/a 10 1247 1334 1388 N
+ D AO HH s n/a 10 1247 1334 1388 N
+ D AO IH b n/a 10 1247 1340 1366 N
+ D AO IH e n/a 10 1247 1325 1410 N
+ D AO IH i n/a 10 1246 1325 1370 N
+ D AO IH s n/a 10 1247 1325 1366 N
+ D AO IY b n/a 10 1246 1340 1367 N
+ D AO IY e n/a 10 1246 1323 1410 N
+ D AO IY i n/a 10 1246 1323 1370 N
+ D AO IY s n/a 10 1246 1323 1367 N
+ D AO JH e n/a 10 1247 1318 1374 N
+ D AO JH s n/a 10 1247 1318 1374 N
+ D AO K e n/a 10 1247 1318 1380 N
+ D AO K i n/a 10 1247 1318 1380 N
+ D AO K s n/a 10 1247 1318 1380 N
+ D AO L b n/a 10 1247 1340 1345 N
+ D AO L e n/a 10 1247 1333 1400 N
+ D AO L i n/a 10 1247 1333 1353 N
+ D AO L s n/a 10 1247 1333 1353 N
+ D AO M b n/a 10 1247 1318 1396 N
+ D AO M e n/a 10 1247 1318 1396 N
+ D AO M i n/a 10 1247 1318 1396 N
+ D AO M s n/a 10 1247 1318 1396 N
+ D AO N b n/a 10 1247 1318 1396 N
+ D AO N e n/a 10 1247 1318 1396 N
+ D AO N i n/a 10 1247 1318 1396 N
+ D AO N s n/a 10 1247 1318 1396 N
+ D AO NG e n/a 10 1247 1318 1396 N
+ D AO NG s n/a 10 1247 1318 1396 N
+ D AO OW b n/a 10 1247 1340 1348 N
+ D AO OW e n/a 10 1247 1325 1415 N
+ D AO OW i n/a 10 1246 1325 1356 N
+ D AO OW s n/a 10 1247 1325 1356 N
+ D AO OY b n/a 10 1247 1340 1345 N
+ D AO OY e n/a 10 1247 1323 1411 N
+ D AO OY s n/a 10 1247 1323 1356 N
+ D AO P e n/a 10 1247 1318 1375 N
+ D AO P i n/a 10 1247 1318 1375 N
+ D AO P s n/a 10 1247 1318 1375 N
+ D AO R b n/a 10 1247 1340 1360 N
+ D AO R e n/a 10 1247 1332 1401 N
+ D AO R i n/a 10 1247 1333 1361 N
+ D AO R s n/a 10 1247 1332 1361 N
+ D AO S b n/a 10 1247 1319 1382 N
+ D AO S e n/a 10 1247 1319 1382 N
+ D AO S i n/a 10 1247 1319 1382 N
+ D AO S s n/a 10 1247 1319 1382 N
+ D AO SH e n/a 10 1247 1319 1383 N
+ D AO SH i n/a 10 1247 1319 1383 N
+ D AO SH s n/a 10 1247 1319 1383 N
+ D AO SIL e n/a 10 1247 1340 1418 N
+ D AO SIL s n/a 10 1247 1340 1418 N
+ D AO T e n/a 10 1247 1318 1374 N
+ D AO T i n/a 10 1247 1318 1374 N
+ D AO T s n/a 10 1247 1318 1374 N
+ D AO TH e n/a 10 1247 1319 1380 N
+ D AO TH s n/a 10 1247 1319 1380 N
+ D AO UH b n/a 10 1247 1340 1366 N
+ D AO UH e n/a 10 1247 1325 1410 N
+ D AO UH s n/a 10 1247 1325 1366 N
+ D AO UW b n/a 10 1247 1340 1366 N
+ D AO UW e n/a 10 1247 1325 1410 N
+ D AO UW i n/a 10 1246 1325 1366 N
+ D AO UW s n/a 10 1247 1325 1366 N
+ D AO V b n/a 10 1247 1318 1380 N
+ D AO V e n/a 10 1247 1318 1380 N
+ D AO V i n/a 10 1247 1318 1380 N
+ D AO V s n/a 10 1247 1318 1380 N
+ D AO W b n/a 10 1247 1340 1345 N
+ D AO W e n/a 10 1247 1332 1401 N
+ D AO W i n/a 10 1247 1332 1353 N
+ D AO W s n/a 10 1247 1332 1353 N
+ D AO Y b n/a 10 1247 1318 1383 N
+ D AO Y e n/a 10 1247 1318 1383 N
+ D AO Y s n/a 10 1247 1318 1383 N
+ D AO Z b n/a 10 1247 1318 1382 N
+ D AO Z e n/a 10 1247 1318 1382 N
+ D AO Z i n/a 10 1247 1318 1382 N
+ D AO Z s n/a 10 1247 1318 1382 N
+ D AO ZH e n/a 10 1247 1318 1383 N
+ D AO ZH s n/a 10 1247 1318 1383 N
+ D AW AA b n/a 10 1247 1340 1347 N
+ D AW AA e n/a 10 1246 1325 1415 N
+ D AW AA s n/a 10 1246 1325 1356 N
+ D AW AE b n/a 10 1247 1340 1343 N
+ D AW AE e n/a 10 1246 1325 1406 N
+ D AW AE i n/a 10 1246 1325 1354 N
+ D AW AE s n/a 10 1246 1325 1354 N
+ D AW AH b n/a 10 1247 1340 1346 N
+ D AW AH e n/a 10 1246 1325 1407 N
+ D AW AH i n/a 10 1246 1325 1355 N
+ D AW AH s n/a 10 1246 1325 1355 N
+ D AW AO b n/a 10 1247 1340 1345 N
+ D AW AO e n/a 10 1246 1325 1415 N
+ D AW AO i n/a 10 1246 1325 1356 N
+ D AW AO s n/a 10 1246 1325 1356 N
+ D AW AW b n/a 10 1247 1340 1344 N
+ D AW AW e n/a 10 1246 1325 1416 N
+ D AW AW s n/a 10 1246 1325 1354 N
+ D AW AY b n/a 10 1247 1340 1349 N
+ D AW AY e n/a 10 1247 1323 1411 N
+ D AW AY s n/a 10 1247 1323 1356 N
+ D AW B b n/a 10 1247 1318 1394 N
+ D AW B e n/a 10 1247 1318 1394 N
+ D AW B i n/a 10 1247 1318 1394 N
+ D AW B s n/a 10 1247 1318 1394 N
+ D AW CH e n/a 10 1247 1318 1374 N
+ D AW CH s n/a 10 1247 1318 1374 N
+ D AW D b n/a 10 1247 1318 1394 N
+ D AW D e n/a 10 1247 1318 1394 N
+ D AW D s n/a 10 1247 1318 1394 N
+ D AW DH e n/a 10 1247 1318 1376 N
+ D AW DH s n/a 10 1247 1318 1376 N
+ D AW EH b n/a 10 1247 1340 1343 N
+ D AW EH e n/a 10 1246 1325 1405 N
+ D AW EH i n/a 10 1246 1325 1354 N
+ D AW EH s n/a 10 1246 1325 1354 N
+ D AW ER b n/a 10 1247 1340 1350 N
+ D AW ER e n/a 10 1246 1325 1415 N
+ D AW ER i n/a 10 1246 1325 1357 N
+ D AW ER s n/a 10 1246 1325 1357 N
+ D AW EY b n/a 10 1247 1340 1343 N
+ D AW EY e n/a 10 1247 1323 1405 N
+ D AW EY s n/a 10 1247 1323 1354 N
+ D AW F b n/a 10 1247 1319 1377 N
+ D AW F e n/a 10 1247 1319 1377 N
+ D AW F i n/a 10 1247 1319 1377 N
+ D AW F s n/a 10 1247 1319 1377 N
+ D AW G b n/a 10 1247 1318 1395 N
+ D AW G e n/a 10 1247 1318 1395 N
+ D AW G s n/a 10 1247 1318 1395 N
+ D AW HH b n/a 10 1247 1340 1388 N
+ D AW HH e n/a 10 1247 1334 1388 N
+ D AW HH s n/a 10 1247 1334 1388 N
+ D AW IH b n/a 10 1247 1340 1366 N
+ D AW IH e n/a 10 1246 1325 1410 N
+ D AW IH i n/a 10 1246 1325 1370 N
+ D AW IH s n/a 10 1246 1325 1366 N
+ D AW IY b n/a 10 1246 1340 1367 N
+ D AW IY e n/a 10 1246 1323 1410 N
+ D AW IY i n/a 10 1246 1323 1370 N
+ D AW IY s n/a 10 1246 1323 1367 N
+ D AW JH e n/a 10 1247 1318 1374 N
+ D AW JH s n/a 10 1247 1318 1374 N
+ D AW K e n/a 10 1247 1318 1380 N
+ D AW K i n/a 10 1247 1318 1380 N
+ D AW K s n/a 10 1247 1318 1380 N
+ D AW L b n/a 10 1247 1340 1345 N
+ D AW L e n/a 10 1247 1333 1400 N
+ D AW L i n/a 10 1247 1333 1353 N
+ D AW L s n/a 10 1247 1333 1353 N
+ D AW M b n/a 10 1247 1318 1396 N
+ D AW M e n/a 10 1247 1318 1396 N
+ D AW M i n/a 10 1247 1318 1396 N
+ D AW M s n/a 10 1247 1318 1396 N
+ D AW N b n/a 10 1247 1318 1396 N
+ D AW N e n/a 10 1247 1318 1396 N
+ D AW N i n/a 10 1247 1318 1396 N
+ D AW N s n/a 10 1247 1318 1396 N
+ D AW NG e n/a 10 1247 1318 1396 N
+ D AW NG s n/a 10 1247 1318 1396 N
+ D AW OW b n/a 10 1247 1340 1346 N
+ D AW OW e n/a 10 1246 1325 1415 N
+ D AW OW i n/a 10 1246 1325 1356 N
+ D AW OW s n/a 10 1246 1325 1356 N
+ D AW OY b n/a 10 1247 1340 1345 N
+ D AW OY e n/a 10 1247 1323 1411 N
+ D AW OY s n/a 10 1247 1323 1356 N
+ D AW P e n/a 10 1247 1318 1375 N
+ D AW P s n/a 10 1247 1318 1375 N
+ D AW R b n/a 10 1247 1340 1360 N
+ D AW R e n/a 10 1247 1332 1401 N
+ D AW R i n/a 10 1247 1333 1361 N
+ D AW R s n/a 10 1247 1332 1361 N
+ D AW S b n/a 10 1247 1319 1382 N
+ D AW S e n/a 10 1247 1319 1382 N
+ D AW S i n/a 10 1247 1319 1382 N
+ D AW S s n/a 10 1247 1319 1382 N
+ D AW SH e n/a 10 1247 1319 1383 N
+ D AW SH s n/a 10 1247 1319 1383 N
+ D AW SIL e n/a 10 1247 1341 1418 N
+ D AW SIL s n/a 10 1247 1340 1418 N
+ D AW T e n/a 10 1247 1318 1374 N
+ D AW T i n/a 10 1247 1318 1374 N
+ D AW T s n/a 10 1247 1318 1374 N
+ D AW TH e n/a 10 1247 1319 1380 N
+ D AW TH s n/a 10 1247 1319 1380 N
+ D AW UH b n/a 10 1247 1340 1366 N
+ D AW UH e n/a 10 1246 1325 1410 N
+ D AW UH s n/a 10 1246 1325 1366 N
+ D AW UW b n/a 10 1247 1340 1366 N
+ D AW UW e n/a 10 1246 1325 1410 N
+ D AW UW i n/a 10 1246 1325 1366 N
+ D AW UW s n/a 10 1246 1325 1366 N
+ D AW V b n/a 10 1247 1318 1380 N
+ D AW V e n/a 10 1247 1318 1380 N
+ D AW V s n/a 10 1247 1318 1380 N
+ D AW W b n/a 10 1247 1340 1345 N
+ D AW W e n/a 10 1247 1332 1401 N
+ D AW W s n/a 10 1247 1332 1353 N
+ D AW Y b n/a 10 1247 1318 1383 N
+ D AW Y e n/a 10 1247 1318 1383 N
+ D AW Y s n/a 10 1247 1318 1383 N
+ D AW Z b n/a 10 1247 1318 1382 N
+ D AW Z e n/a 10 1247 1318 1382 N
+ D AW Z i n/a 10 1247 1318 1382 N
+ D AW Z s n/a 10 1247 1318 1382 N
+ D AW ZH e n/a 10 1247 1318 1383 N
+ D AW ZH s n/a 10 1247 1318 1383 N
+ D AY AA b n/a 10 1255 1340 1347 N
+ D AY AA e n/a 10 1253 1322 1415 N
+ D AY AA i n/a 10 1255 1322 1356 N
+ D AY AA s n/a 10 1255 1322 1356 N
+ D AY AE b n/a 10 1255 1340 1343 N
+ D AY AE e n/a 10 1253 1322 1406 N
+ D AY AE i n/a 10 1255 1322 1354 N
+ D AY AE s n/a 10 1255 1322 1354 N
+ D AY AH b n/a 10 1255 1340 1346 N
+ D AY AH e n/a 10 1253 1322 1407 N
+ D AY AH i n/a 10 1253 1322 1355 N
+ D AY AH s n/a 10 1255 1322 1355 N
+ D AY AO b n/a 10 1255 1340 1345 N
+ D AY AO e n/a 10 1253 1322 1415 N
+ D AY AO s n/a 10 1255 1322 1356 N
+ D AY AW b n/a 10 1255 1340 1344 N
+ D AY AW e n/a 10 1253 1322 1416 N
+ D AY AW i n/a 10 1255 1322 1354 N
+ D AY AW s n/a 10 1255 1322 1354 N
+ D AY AY b n/a 10 1255 1340 1349 N
+ D AY AY e n/a 10 1253 1322 1411 N
+ D AY AY i n/a 10 1255 1322 1356 N
+ D AY AY s n/a 10 1255 1322 1356 N
+ D AY B b n/a 10 1254 1311 1395 N
+ D AY B e n/a 10 1254 1311 1395 N
+ D AY B i n/a 10 1254 1311 1395 N
+ D AY B s n/a 10 1254 1311 1395 N
+ D AY CH e n/a 10 1254 1311 1373 N
+ D AY CH s n/a 10 1254 1311 1373 N
+ D AY D b n/a 10 1254 1311 1395 N
+ D AY D e n/a 10 1254 1311 1395 N
+ D AY D i n/a 10 1254 1311 1395 N
+ D AY D s n/a 10 1254 1311 1395 N
+ D AY DH e n/a 10 1254 1311 1376 N
+ D AY DH s n/a 10 1254 1311 1376 N
+ D AY EH b n/a 10 1255 1340 1343 N
+ D AY EH e n/a 10 1253 1322 1405 N
+ D AY EH i n/a 10 1255 1322 1354 N
+ D AY EH s n/a 10 1255 1322 1354 N
+ D AY ER b n/a 10 1255 1340 1350 N
+ D AY ER e n/a 10 1253 1322 1415 N
+ D AY ER i n/a 10 1253 1322 1357 N
+ D AY ER s n/a 10 1255 1322 1357 N
+ D AY EY b n/a 10 1255 1340 1343 N
+ D AY EY e n/a 10 1253 1322 1405 N
+ D AY EY i n/a 10 1255 1322 1354 N
+ D AY EY s n/a 10 1255 1322 1354 N
+ D AY F b n/a 10 1254 1319 1377 N
+ D AY F e n/a 10 1254 1319 1377 N
+ D AY F s n/a 10 1254 1319 1377 N
+ D AY G b n/a 10 1254 1311 1395 N
+ D AY G e n/a 10 1254 1311 1395 N
+ D AY G i n/a 10 1254 1311 1395 N
+ D AY G s n/a 10 1254 1311 1395 N
+ D AY HH b n/a 10 1253 1340 1388 N
+ D AY HH e n/a 10 1253 1334 1388 N
+ D AY HH i n/a 10 1253 1334 1388 N
+ D AY HH s n/a 10 1253 1334 1388 N
+ D AY IH b n/a 10 1255 1340 1367 N
+ D AY IH e n/a 10 1253 1328 1410 N
+ D AY IH i n/a 10 1253 1328 1370 N
+ D AY IH s n/a 10 1255 1328 1367 N
+ D AY IY b n/a 10 1255 1340 1367 N
+ D AY IY e n/a 10 1253 1327 1410 N
+ D AY IY i n/a 10 1255 1327 1367 N
+ D AY IY s n/a 10 1255 1327 1367 N
+ D AY JH e n/a 10 1254 1311 1373 N
+ D AY JH s n/a 10 1254 1311 1373 N
+ D AY K e n/a 10 1254 1311 1380 N
+ D AY K i n/a 10 1254 1311 1380 N
+ D AY K s n/a 10 1254 1311 1380 N
+ D AY L b n/a 10 1253 1340 1345 N
+ D AY L e n/a 10 1253 1333 1400 N
+ D AY L i n/a 10 1253 1333 1353 N
+ D AY L s n/a 10 1253 1333 1353 N
+ D AY M b n/a 10 1254 1311 1396 N
+ D AY M e n/a 10 1254 1311 1396 N
+ D AY M i n/a 10 1254 1311 1396 N
+ D AY M s n/a 10 1254 1311 1396 N
+ D AY N b n/a 10 1254 1311 1396 N
+ D AY N e n/a 10 1254 1311 1396 N
+ D AY N i n/a 10 1254 1311 1396 N
+ D AY N s n/a 10 1254 1311 1396 N
+ D AY NG e n/a 10 1254 1311 1396 N
+ D AY NG s n/a 10 1254 1311 1396 N
+ D AY OW b n/a 10 1255 1340 1346 N
+ D AY OW e n/a 10 1253 1322 1415 N
+ D AY OW i n/a 10 1255 1322 1356 N
+ D AY OW s n/a 10 1255 1322 1356 N
+ D AY OY b n/a 10 1255 1340 1345 N
+ D AY OY e n/a 10 1253 1322 1411 N
+ D AY OY s n/a 10 1255 1322 1356 N
+ D AY P e n/a 10 1254 1311 1375 N
+ D AY P i n/a 10 1254 1311 1375 N
+ D AY P s n/a 10 1254 1311 1375 N
+ D AY R b n/a 10 1254 1340 1360 N
+ D AY R e n/a 10 1254 1332 1401 N
+ D AY R i n/a 10 1254 1333 1361 N
+ D AY R s n/a 10 1254 1332 1361 N
+ D AY S b n/a 10 1254 1319 1382 N
+ D AY S e n/a 10 1254 1319 1382 N
+ D AY S i n/a 10 1254 1319 1382 N
+ D AY S s n/a 10 1254 1319 1382 N
+ D AY SH e n/a 10 1254 1319 1383 N
+ D AY SH i n/a 10 1254 1319 1383 N
+ D AY SH s n/a 10 1254 1319 1383 N
+ D AY SIL e n/a 10 1254 1340 1418 N
+ D AY SIL s n/a 10 1254 1340 1418 N
+ D AY T e n/a 10 1254 1311 1373 N
+ D AY T i n/a 10 1254 1311 1373 N
+ D AY T s n/a 10 1254 1311 1373 N
+ D AY TH e n/a 10 1254 1319 1380 N
+ D AY TH s n/a 10 1254 1319 1380 N
+ D AY UH b n/a 10 1255 1340 1367 N
+ D AY UH e n/a 10 1253 1328 1410 N
+ D AY UH s n/a 10 1255 1328 1367 N
+ D AY UW b n/a 10 1255 1340 1367 N
+ D AY UW e n/a 10 1253 1328 1410 N
+ D AY UW s n/a 10 1255 1328 1367 N
+ D AY V b n/a 10 1254 1311 1380 N
+ D AY V e n/a 10 1254 1311 1380 N
+ D AY V i n/a 10 1254 1311 1380 N
+ D AY V s n/a 10 1254 1311 1380 N
+ D AY W b n/a 10 1253 1340 1345 N
+ D AY W e n/a 10 1253 1332 1401 N
+ D AY W i n/a 10 1253 1332 1353 N
+ D AY W s n/a 10 1253 1332 1353 N
+ D AY Y b n/a 10 1254 1311 1383 N
+ D AY Y e n/a 10 1254 1311 1383 N
+ D AY Y s n/a 10 1254 1311 1383 N
+ D AY Z b n/a 10 1254 1311 1382 N
+ D AY Z e n/a 10 1254 1311 1382 N
+ D AY Z i n/a 10 1254 1311 1382 N
+ D AY Z s n/a 10 1254 1311 1382 N
+ D AY ZH e n/a 10 1254 1311 1383 N
+ D AY ZH s n/a 10 1254 1311 1383 N
+ D B AA b n/a 10 1270 1297 1347 N
+ D B AA e n/a 10 1270 1297 1415 N
+ D B AA i n/a 10 1270 1297 1347 N
+ D B AA s n/a 10 1270 1297 1347 N
+ D B AE b n/a 10 1270 1297 1342 N
+ D B AE e n/a 10 1270 1297 1405 N
+ D B AE i n/a 10 1270 1297 1342 N
+ D B AE s n/a 10 1270 1297 1342 N
+ D B AH b n/a 10 1270 1297 1347 N
+ D B AH e n/a 10 1270 1297 1414 N
+ D B AH i n/a 10 1270 1297 1351 N
+ D B AH s n/a 10 1270 1297 1347 N
+ D B AO b n/a 10 1270 1297 1345 N
+ D B AO e n/a 10 1270 1297 1415 N
+ D B AO s n/a 10 1270 1297 1345 N
+ D B AW b n/a 10 1270 1297 1344 N
+ D B AW e n/a 10 1270 1297 1416 N
+ D B AW s n/a 10 1270 1297 1344 N
+ D B AY b n/a 10 1270 1297 1349 N
+ D B AY e n/a 10 1270 1297 1411 N
+ D B AY s n/a 10 1270 1297 1349 N
+ D B B b n/a 10 1270 1287 1399 N
+ D B B e n/a 10 1270 1287 1399 N
+ D B B s n/a 10 1270 1287 1399 N
+ D B CH e n/a 10 1270 1286 1385 N
+ D B CH s n/a 10 1270 1286 1385 N
+ D B D b n/a 10 1270 1287 1399 N
+ D B D e n/a 10 1270 1287 1399 N
+ D B D s n/a 10 1270 1287 1399 N
+ D B DH e n/a 10 1270 1287 1399 N
+ D B DH s n/a 10 1270 1287 1399 N
+ D B EH b n/a 10 1270 1297 1342 N
+ D B EH e n/a 10 1270 1297 1405 N
+ D B EH i n/a 10 1270 1297 1342 N
+ D B EH s n/a 10 1270 1297 1342 N
+ D B ER b n/a 10 1270 1297 1350 N
+ D B ER e n/a 10 1270 1297 1415 N
+ D B ER i n/a 10 1270 1297 1357 N
+ D B ER s n/a 10 1270 1297 1357 N
+ D B EY b n/a 10 1270 1297 1342 N
+ D B EY e n/a 10 1270 1297 1405 N
+ D B EY i n/a 10 1270 1297 1342 N
+ D B EY s n/a 10 1270 1297 1342 N
+ D B F b n/a 10 1270 1286 1379 N
+ D B F e n/a 10 1270 1286 1379 N
+ D B F s n/a 10 1270 1286 1379 N
+ D B G b n/a 10 1270 1287 1399 N
+ D B G e n/a 10 1270 1287 1399 N
+ D B G s n/a 10 1270 1287 1399 N
+ D B HH b n/a 10 1270 1286 1389 N
+ D B HH e n/a 10 1270 1286 1389 N
+ D B HH s n/a 10 1270 1286 1389 N
+ D B IH b n/a 10 1270 1298 1364 N
+ D B IH e n/a 10 1270 1298 1408 N
+ D B IH i n/a 10 1270 1298 1370 N
+ D B IH s n/a 10 1270 1298 1364 N
+ D B IY b n/a 10 1270 1298 1363 N
+ D B IY e n/a 10 1270 1298 1408 N
+ D B IY i n/a 10 1270 1298 1370 N
+ D B IY s n/a 10 1270 1298 1363 N
+ D B JH e n/a 10 1270 1287 1399 N
+ D B JH s n/a 10 1270 1287 1399 N
+ D B K e n/a 10 1270 1286 1379 N
+ D B K s n/a 10 1270 1286 1379 N
+ D B L b n/a 10 1270 1286 1345 N
+ D B L e n/a 10 1270 1286 1400 N
+ D B L s n/a 10 1270 1286 1345 N
+ D B M b n/a 10 1270 1287 1399 N
+ D B M e n/a 10 1270 1287 1399 N
+ D B M s n/a 10 1270 1287 1399 N
+ D B N b n/a 10 1270 1287 1399 N
+ D B N e n/a 10 1270 1287 1399 N
+ D B N i n/a 10 1270 1287 1399 N
+ D B N s n/a 10 1270 1287 1399 N
+ D B NG e n/a 10 1270 1287 1399 N
+ D B NG s n/a 10 1270 1287 1399 N
+ D B OW b n/a 10 1270 1297 1346 N
+ D B OW e n/a 10 1270 1297 1415 N
+ D B OW i n/a 10 1270 1297 1349 N
+ D B OW s n/a 10 1270 1297 1346 N
+ D B OY b n/a 10 1270 1297 1345 N
+ D B OY e n/a 10 1270 1297 1411 N
+ D B OY s n/a 10 1270 1297 1345 N
+ D B P e n/a 10 1270 1286 1379 N
+ D B P s n/a 10 1270 1286 1379 N
+ D B R b n/a 10 1270 1286 1360 N
+ D B R e n/a 10 1270 1286 1401 N
+ D B R i n/a 10 1270 1286 1361 N
+ D B R s n/a 10 1270 1286 1361 N
+ D B S b n/a 10 1270 1287 1385 N
+ D B S e n/a 10 1270 1287 1385 N
+ D B S s n/a 10 1270 1287 1385 N
+ D B SH e n/a 10 1270 1286 1385 N
+ D B SH s n/a 10 1270 1286 1385 N
+ D B SIL e n/a 10 1270 1286 1421 N
+ D B SIL s n/a 10 1270 1286 1421 N
+ D B T e n/a 10 1270 1287 1379 N
+ D B T s n/a 10 1270 1287 1379 N
+ D B TH e n/a 10 1270 1287 1379 N
+ D B TH s n/a 10 1270 1287 1379 N
+ D B UH b n/a 10 1270 1298 1363 N
+ D B UH e n/a 10 1270 1298 1408 N
+ D B UH i n/a 10 1270 1298 1363 N
+ D B UH s n/a 10 1270 1298 1363 N
+ D B UW b n/a 10 1270 1298 1363 N
+ D B UW e n/a 10 1270 1298 1408 N
+ D B UW i n/a 10 1270 1298 1363 N
+ D B UW s n/a 10 1270 1298 1363 N
+ D B V b n/a 10 1270 1287 1399 N
+ D B V e n/a 10 1270 1287 1399 N
+ D B V s n/a 10 1270 1287 1399 N
+ D B W b n/a 10 1270 1286 1345 N
+ D B W e n/a 10 1270 1286 1400 N
+ D B W i n/a 10 1270 1286 1350 N
+ D B W s n/a 10 1270 1286 1345 N
+ D B Y b n/a 10 1270 1287 1399 N
+ D B Y e n/a 10 1270 1287 1399 N
+ D B Y s n/a 10 1270 1287 1399 N
+ D B Z b n/a 10 1270 1287 1399 N
+ D B Z e n/a 10 1270 1287 1399 N
+ D B Z s n/a 10 1270 1287 1399 N
+ D B ZH e n/a 10 1270 1287 1399 N
+ D B ZH s n/a 10 1270 1287 1399 N
+ D CH AA b n/a 10 1273 1297 1347 N
+ D CH AA e n/a 10 1272 1297 1415 N
+ D CH AA s n/a 10 1272 1297 1347 N
+ D CH AE b n/a 10 1273 1297 1342 N
+ D CH AE e n/a 10 1272 1297 1405 N
+ D CH AE s n/a 10 1272 1297 1342 N
+ D CH AH b n/a 10 1273 1297 1347 N
+ D CH AH e n/a 10 1272 1297 1414 N
+ D CH AH s n/a 10 1272 1297 1347 N
+ D CH AO b n/a 10 1273 1297 1345 N
+ D CH AO e n/a 10 1272 1297 1415 N
+ D CH AO i n/a 10 1272 1297 1345 N
+ D CH AO s n/a 10 1272 1297 1345 N
+ D CH AW b n/a 10 1273 1297 1344 N
+ D CH AW e n/a 10 1272 1297 1416 N
+ D CH AW i n/a 10 1272 1297 1344 N
+ D CH AW s n/a 10 1272 1297 1344 N
+ D CH AY b n/a 10 1273 1297 1349 N
+ D CH AY e n/a 10 1272 1297 1411 N
+ D CH AY i n/a 10 1272 1297 1349 N
+ D CH AY s n/a 10 1272 1297 1349 N
+ D CH B b n/a 10 1273 1287 1399 N
+ D CH B e n/a 10 1272 1287 1399 N
+ D CH B s n/a 10 1272 1287 1399 N
+ D CH CH e n/a 10 1272 1287 1385 N
+ D CH CH s n/a 10 1272 1287 1385 N
+ D CH D b n/a 10 1273 1287 1399 N
+ D CH D e n/a 10 1272 1287 1399 N
+ D CH D s n/a 10 1272 1287 1399 N
+ D CH DH e n/a 10 1272 1287 1399 N
+ D CH DH s n/a 10 1272 1287 1399 N
+ D CH EH b n/a 10 1273 1297 1342 N
+ D CH EH e n/a 10 1272 1297 1405 N
+ D CH EH i n/a 10 1272 1297 1342 N
+ D CH EH s n/a 10 1272 1297 1342 N
+ D CH ER b n/a 10 1273 1297 1350 N
+ D CH ER e n/a 10 1272 1297 1415 N
+ D CH ER s n/a 10 1272 1297 1357 N
+ D CH EY b n/a 10 1273 1297 1342 N
+ D CH EY e n/a 10 1272 1297 1405 N
+ D CH EY s n/a 10 1272 1297 1342 N
+ D CH F b n/a 10 1273 1287 1379 N
+ D CH F e n/a 10 1272 1287 1379 N
+ D CH F s n/a 10 1272 1287 1379 N
+ D CH G b n/a 10 1273 1287 1399 N
+ D CH G e n/a 10 1272 1287 1399 N
+ D CH G s n/a 10 1272 1287 1399 N
+ D CH HH b n/a 10 1273 1287 1389 N
+ D CH HH e n/a 10 1272 1287 1389 N
+ D CH HH s n/a 10 1272 1287 1389 N
+ D CH IH b n/a 10 1273 1298 1364 N
+ D CH IH e n/a 10 1272 1298 1408 N
+ D CH IH s n/a 10 1272 1298 1364 N
+ D CH IY b n/a 10 1273 1298 1363 N
+ D CH IY e n/a 10 1272 1298 1408 N
+ D CH IY i n/a 10 1272 1298 1370 N
+ D CH IY s n/a 10 1272 1298 1363 N
+ D CH JH e n/a 10 1272 1287 1399 N
+ D CH JH s n/a 10 1272 1287 1399 N
+ D CH K e n/a 10 1272 1287 1379 N
+ D CH K s n/a 10 1272 1287 1379 N
+ D CH L b n/a 10 1272 1286 1345 N
+ D CH L e n/a 10 1272 1286 1400 N
+ D CH L s n/a 10 1272 1286 1345 N
+ D CH M b n/a 10 1273 1287 1399 N
+ D CH M e n/a 10 1272 1287 1399 N
+ D CH M s n/a 10 1272 1287 1399 N
+ D CH N b n/a 10 1273 1287 1399 N
+ D CH N e n/a 10 1272 1287 1399 N
+ D CH N s n/a 10 1272 1287 1399 N
+ D CH NG e n/a 10 1272 1287 1399 N
+ D CH NG s n/a 10 1272 1287 1399 N
+ D CH OW b n/a 10 1273 1297 1347 N
+ D CH OW e n/a 10 1272 1297 1415 N
+ D CH OW s n/a 10 1272 1297 1347 N
+ D CH OY b n/a 10 1273 1297 1345 N
+ D CH OY e n/a 10 1272 1297 1411 N
+ D CH OY s n/a 10 1272 1297 1345 N
+ D CH P e n/a 10 1272 1287 1379 N
+ D CH P s n/a 10 1272 1287 1379 N
+ D CH R b n/a 10 1272 1286 1360 N
+ D CH R e n/a 10 1272 1286 1401 N
+ D CH R i n/a 10 1272 1286 1361 N
+ D CH R s n/a 10 1272 1286 1361 N
+ D CH S b n/a 10 1273 1287 1385 N
+ D CH S e n/a 10 1272 1287 1385 N
+ D CH S s n/a 10 1272 1287 1385 N
+ D CH SH e n/a 10 1272 1287 1385 N
+ D CH SH s n/a 10 1272 1287 1385 N
+ D CH SIL e n/a 10 1272 1287 1421 N
+ D CH SIL s n/a 10 1272 1287 1421 N
+ D CH T e n/a 10 1272 1287 1379 N
+ D CH T s n/a 10 1272 1287 1379 N
+ D CH TH e n/a 10 1272 1287 1379 N
+ D CH TH s n/a 10 1272 1287 1379 N
+ D CH UH b n/a 10 1273 1298 1363 N
+ D CH UH e n/a 10 1272 1298 1408 N
+ D CH UH s n/a 10 1272 1298 1363 N
+ D CH UW b n/a 10 1273 1298 1363 N
+ D CH UW e n/a 10 1272 1298 1408 N
+ D CH UW i n/a 10 1272 1298 1363 N
+ D CH UW s n/a 10 1272 1298 1363 N
+ D CH V b n/a 10 1273 1287 1399 N
+ D CH V e n/a 10 1272 1287 1399 N
+ D CH V s n/a 10 1272 1287 1399 N
+ D CH W b n/a 10 1272 1286 1345 N
+ D CH W e n/a 10 1272 1286 1400 N
+ D CH W s n/a 10 1272 1286 1345 N
+ D CH Y b n/a 10 1273 1287 1399 N
+ D CH Y e n/a 10 1272 1287 1399 N
+ D CH Y s n/a 10 1272 1287 1399 N
+ D CH Z b n/a 10 1273 1287 1399 N
+ D CH Z e n/a 10 1272 1287 1399 N
+ D CH Z s n/a 10 1272 1287 1399 N
+ D CH ZH e n/a 10 1272 1287 1399 N
+ D CH ZH s n/a 10 1272 1287 1399 N
+ D D AA b n/a 10 1269 1299 1349 N
+ D D AA s n/a 10 1269 1299 1349 N
+ D D AE b n/a 10 1269 1298 1342 N
+ D D AE i n/a 10 1269 1298 1342 N
+ D D AE s n/a 10 1269 1298 1342 N
+ D D AH b n/a 10 1269 1299 1348 N
+ D D AH s n/a 10 1269 1299 1348 N
+ D D AO b n/a 10 1269 1299 1345 N
+ D D AO s n/a 10 1269 1299 1345 N
+ D D AW b n/a 10 1269 1299 1344 N
+ D D AW i n/a 10 1269 1299 1344 N
+ D D AW s n/a 10 1269 1299 1344 N
+ D D AY b n/a 10 1269 1299 1349 N
+ D D AY i n/a 10 1269 1299 1349 N
+ D D AY s n/a 10 1269 1299 1349 N
+ D D B b n/a 10 1269 1287 1390 N
+ D D B s n/a 10 1269 1287 1390 N
+ D D CH s n/a 10 1269 1287 1385 N
+ D D D b n/a 10 1269 1287 1390 N
+ D D D s n/a 10 1269 1287 1390 N
+ D D DH s n/a 10 1269 1287 1393 N
+ D D EH b n/a 10 1269 1298 1342 N
+ D D EH s n/a 10 1269 1298 1342 N
+ D D ER b n/a 10 1269 1299 1350 N
+ D D ER s n/a 10 1269 1299 1358 N
+ D D EY b n/a 10 1269 1298 1342 N
+ D D EY i n/a 10 1269 1298 1342 N
+ D D EY s n/a 10 1269 1298 1342 N
+ D D F b n/a 10 1269 1287 1381 N
+ D D F s n/a 10 1269 1287 1381 N
+ D D G b n/a 10 1269 1287 1390 N
+ D D G s n/a 10 1269 1287 1390 N
+ D D HH b n/a 10 1269 1287 1387 N
+ D D HH s n/a 10 1269 1287 1387 N
+ D D IH b n/a 10 1269 1298 1364 N
+ D D IH s n/a 10 1269 1298 1364 N
+ D D IY b n/a 10 1269 1298 1363 N
+ D D IY s n/a 10 1269 1298 1363 N
+ D D JH s n/a 10 1269 1287 1391 N
+ D D K s n/a 10 1269 1287 1381 N
+ D D L b n/a 10 1269 1286 1345 N
+ D D L s n/a 10 1269 1286 1345 N
+ D D M b n/a 10 1269 1287 1402 N
+ D D M s n/a 10 1269 1287 1402 N
+ D D N b n/a 10 1269 1287 1402 N
+ D D N s n/a 10 1269 1287 1402 N
+ D D NG s n/a 10 1269 1287 1402 N
+ D D OW b n/a 10 1269 1299 1346 N
+ D D OW i n/a 10 1269 1299 1349 N
+ D D OW s n/a 10 1269 1299 1346 N
+ D D OY b n/a 10 1269 1299 1345 N
+ D D OY s n/a 10 1269 1299 1345 N
+ D D P s n/a 10 1269 1287 1381 N
+ D D R b n/a 10 1269 1286 1360 N
+ D D R i n/a 10 1269 1286 1361 N
+ D D R s n/a 10 1269 1286 1361 N
+ D D S b n/a 10 1269 1287 1385 N
+ D D S s n/a 10 1269 1287 1385 N
+ D D SH s n/a 10 1269 1287 1385 N
+ D D SIL s n/a 10 1269 1287 1422 N
+ D D T s n/a 10 1269 1287 1381 N
+ D D TH s n/a 10 1269 1287 1381 N
+ D D UH b n/a 10 1269 1298 1363 N
+ D D UH s n/a 10 1269 1298 1363 N
+ D D UW b n/a 10 1269 1298 1363 N
+ D D UW s n/a 10 1269 1298 1363 N
+ D D V b n/a 10 1269 1287 1390 N
+ D D V s n/a 10 1269 1287 1390 N
+ D D W b n/a 10 1269 1286 1345 N
+ D D W s n/a 10 1269 1286 1345 N
+ D D Y b n/a 10 1269 1287 1391 N
+ D D Y s n/a 10 1269 1287 1391 N
+ D D Z b n/a 10 1269 1287 1390 N
+ D D Z s n/a 10 1269 1287 1390 N
+ D D ZH s n/a 10 1269 1287 1391 N
+ D DH AA b n/a 10 1273 1297 1347 N
+ D DH AA e n/a 10 1272 1297 1415 N
+ D DH AA s n/a 10 1272 1297 1347 N
+ D DH AE b n/a 10 1273 1297 1342 N
+ D DH AE e n/a 10 1272 1297 1405 N
+ D DH AE s n/a 10 1272 1297 1342 N
+ D DH AH b n/a 10 1273 1297 1347 N
+ D DH AH e n/a 10 1272 1297 1414 N
+ D DH AH s n/a 10 1272 1297 1347 N
+ D DH AO b n/a 10 1273 1297 1345 N
+ D DH AO e n/a 10 1272 1297 1415 N
+ D DH AO s n/a 10 1272 1297 1345 N
+ D DH AW b n/a 10 1273 1297 1344 N
+ D DH AW e n/a 10 1272 1297 1416 N
+ D DH AW s n/a 10 1272 1297 1344 N
+ D DH AY b n/a 10 1273 1297 1349 N
+ D DH AY e n/a 10 1272 1297 1411 N
+ D DH AY s n/a 10 1272 1297 1349 N
+ D DH B b n/a 10 1273 1287 1399 N
+ D DH B e n/a 10 1272 1287 1399 N
+ D DH B s n/a 10 1272 1287 1399 N
+ D DH CH e n/a 10 1272 1287 1385 N
+ D DH CH s n/a 10 1272 1287 1385 N
+ D DH D b n/a 10 1273 1287 1399 N
+ D DH D e n/a 10 1272 1287 1399 N
+ D DH D s n/a 10 1272 1287 1399 N
+ D DH DH e n/a 10 1272 1287 1399 N
+ D DH DH s n/a 10 1272 1287 1399 N
+ D DH EH b n/a 10 1273 1297 1342 N
+ D DH EH e n/a 10 1272 1297 1405 N
+ D DH EH s n/a 10 1272 1297 1342 N
+ D DH ER b n/a 10 1273 1297 1350 N
+ D DH ER e n/a 10 1272 1297 1415 N
+ D DH ER s n/a 10 1272 1297 1357 N
+ D DH EY b n/a 10 1273 1297 1342 N
+ D DH EY e n/a 10 1272 1297 1405 N
+ D DH EY s n/a 10 1272 1297 1342 N
+ D DH F b n/a 10 1273 1287 1379 N
+ D DH F e n/a 10 1272 1287 1379 N
+ D DH F s n/a 10 1272 1287 1379 N
+ D DH G b n/a 10 1273 1287 1399 N
+ D DH G e n/a 10 1272 1287 1399 N
+ D DH G s n/a 10 1272 1287 1399 N
+ D DH HH b n/a 10 1273 1287 1389 N
+ D DH HH e n/a 10 1272 1287 1389 N
+ D DH HH s n/a 10 1272 1287 1389 N
+ D DH IH b n/a 10 1273 1297 1364 N
+ D DH IH e n/a 10 1272 1297 1408 N
+ D DH IH s n/a 10 1272 1297 1364 N
+ D DH IY b n/a 10 1273 1297 1363 N
+ D DH IY e n/a 10 1272 1297 1408 N
+ D DH IY s n/a 10 1272 1297 1363 N
+ D DH JH e n/a 10 1272 1287 1399 N
+ D DH JH s n/a 10 1272 1287 1399 N
+ D DH K e n/a 10 1272 1287 1379 N
+ D DH K s n/a 10 1272 1287 1379 N
+ D DH L b n/a 10 1272 1286 1345 N
+ D DH L e n/a 10 1272 1286 1400 N
+ D DH L s n/a 10 1272 1286 1345 N
+ D DH M b n/a 10 1273 1287 1399 N
+ D DH M e n/a 10 1272 1287 1399 N
+ D DH M s n/a 10 1272 1287 1399 N
+ D DH N b n/a 10 1273 1287 1399 N
+ D DH N e n/a 10 1272 1287 1399 N
+ D DH N s n/a 10 1272 1287 1399 N
+ D DH NG e n/a 10 1272 1287 1399 N
+ D DH NG s n/a 10 1272 1287 1399 N
+ D DH OW b n/a 10 1273 1297 1346 N
+ D DH OW e n/a 10 1272 1297 1415 N
+ D DH OW s n/a 10 1272 1297 1346 N
+ D DH OY b n/a 10 1273 1297 1345 N
+ D DH OY e n/a 10 1272 1297 1411 N
+ D DH OY s n/a 10 1272 1297 1345 N
+ D DH P e n/a 10 1272 1287 1379 N
+ D DH P s n/a 10 1272 1287 1379 N
+ D DH R b n/a 10 1272 1286 1360 N
+ D DH R e n/a 10 1272 1286 1401 N
+ D DH R i n/a 10 1272 1286 1361 N
+ D DH R s n/a 10 1272 1286 1361 N
+ D DH S b n/a 10 1273 1287 1385 N
+ D DH S e n/a 10 1272 1287 1385 N
+ D DH S s n/a 10 1272 1287 1385 N
+ D DH SH e n/a 10 1272 1287 1385 N
+ D DH SH s n/a 10 1272 1287 1385 N
+ D DH SIL e n/a 10 1272 1287 1421 N
+ D DH SIL s n/a 10 1272 1287 1421 N
+ D DH T e n/a 10 1272 1287 1379 N
+ D DH T s n/a 10 1272 1287 1379 N
+ D DH TH e n/a 10 1272 1287 1379 N
+ D DH TH s n/a 10 1272 1287 1379 N
+ D DH UH b n/a 10 1273 1297 1363 N
+ D DH UH e n/a 10 1272 1297 1408 N
+ D DH UH s n/a 10 1272 1297 1363 N
+ D DH UW b n/a 10 1273 1297 1363 N
+ D DH UW e n/a 10 1272 1297 1408 N
+ D DH UW s n/a 10 1272 1297 1363 N
+ D DH V b n/a 10 1273 1287 1399 N
+ D DH V e n/a 10 1272 1287 1399 N
+ D DH V s n/a 10 1272 1287 1399 N
+ D DH W b n/a 10 1272 1286 1345 N
+ D DH W e n/a 10 1272 1286 1400 N
+ D DH W s n/a 10 1272 1286 1345 N
+ D DH Y b n/a 10 1273 1287 1399 N
+ D DH Y e n/a 10 1272 1287 1399 N
+ D DH Y s n/a 10 1272 1287 1399 N
+ D DH Z b n/a 10 1273 1287 1399 N
+ D DH Z e n/a 10 1272 1287 1399 N
+ D DH Z s n/a 10 1272 1287 1399 N
+ D DH ZH e n/a 10 1272 1287 1399 N
+ D DH ZH s n/a 10 1272 1287 1399 N
+ D EH AA b n/a 10 1249 1335 1347 N
+ D EH AA e n/a 10 1249 1322 1415 N
+ D EH AA i n/a 10 1249 1322 1356 N
+ D EH AA s n/a 10 1249 1322 1356 N
+ D EH AE b n/a 10 1249 1335 1343 N
+ D EH AE e n/a 10 1249 1322 1406 N
+ D EH AE i n/a 10 1249 1322 1354 N
+ D EH AE s n/a 10 1249 1322 1354 N
+ D EH AH b n/a 10 1249 1335 1346 N
+ D EH AH e n/a 10 1249 1322 1407 N
+ D EH AH i n/a 10 1249 1322 1355 N
+ D EH AH s n/a 10 1249 1322 1355 N
+ D EH AO b n/a 10 1249 1335 1345 N
+ D EH AO e n/a 10 1249 1322 1415 N
+ D EH AO i n/a 10 1249 1322 1356 N
+ D EH AO s n/a 10 1249 1322 1356 N
+ D EH AW b n/a 10 1249 1335 1344 N
+ D EH AW e n/a 10 1249 1322 1416 N
+ D EH AW i n/a 10 1249 1322 1354 N
+ D EH AW s n/a 10 1249 1322 1354 N
+ D EH AY b n/a 10 1249 1335 1349 N
+ D EH AY e n/a 10 1249 1322 1411 N
+ D EH AY i n/a 10 1249 1322 1356 N
+ D EH AY s n/a 10 1249 1322 1356 N
+ D EH B b n/a 10 1250 1313 1394 N
+ D EH B e n/a 10 1250 1313 1394 N
+ D EH B i n/a 10 1250 1313 1394 N
+ D EH B s n/a 10 1250 1313 1394 N
+ D EH CH e n/a 10 1250 1316 1373 N
+ D EH CH i n/a 10 1250 1316 1373 N
+ D EH CH s n/a 10 1250 1316 1373 N
+ D EH D b n/a 10 1250 1313 1394 N
+ D EH D e n/a 10 1250 1313 1394 N
+ D EH D i n/a 10 1250 1313 1394 N
+ D EH D s n/a 10 1250 1313 1394 N
+ D EH DH e n/a 10 1251 1316 1376 N
+ D EH DH s n/a 10 1251 1316 1376 N
+ D EH EH b n/a 10 1249 1335 1343 N
+ D EH EH e n/a 10 1249 1322 1405 N
+ D EH EH i n/a 10 1249 1322 1354 N
+ D EH EH s n/a 10 1249 1322 1354 N
+ D EH ER b n/a 10 1249 1335 1350 N
+ D EH ER e n/a 10 1249 1322 1415 N
+ D EH ER i n/a 10 1249 1322 1357 N
+ D EH ER s n/a 10 1249 1322 1357 N
+ D EH EY b n/a 10 1249 1335 1343 N
+ D EH EY e n/a 10 1249 1322 1405 N
+ D EH EY i n/a 10 1249 1322 1354 N
+ D EH EY s n/a 10 1249 1322 1354 N
+ D EH F b n/a 10 1252 1319 1377 N
+ D EH F e n/a 10 1252 1319 1377 N
+ D EH F i n/a 10 1252 1319 1377 N
+ D EH F s n/a 10 1252 1319 1377 N
+ D EH G b n/a 10 1250 1311 1395 N
+ D EH G e n/a 10 1250 1311 1395 N
+ D EH G i n/a 10 1250 1311 1395 N
+ D EH G s n/a 10 1250 1311 1395 N
+ D EH HH b n/a 10 1252 1335 1388 N
+ D EH HH e n/a 10 1252 1334 1388 N
+ D EH HH i n/a 10 1252 1334 1388 N
+ D EH HH s n/a 10 1252 1334 1388 N
+ D EH IH b n/a 10 1249 1336 1366 N
+ D EH IH e n/a 10 1249 1328 1410 N
+ D EH IH i n/a 10 1249 1328 1370 N
+ D EH IH s n/a 10 1249 1328 1366 N
+ D EH IY b n/a 10 1248 1336 1367 N
+ D EH IY e n/a 10 1248 1328 1410 N
+ D EH IY i n/a 10 1248 1328 1369 N
+ D EH IY s n/a 10 1248 1328 1367 N
+ D EH JH e n/a 10 1250 1316 1373 N
+ D EH JH s n/a 10 1250 1316 1373 N
+ D EH K e n/a 10 1250 1316 1380 N
+ D EH K i n/a 10 1250 1316 1380 N
+ D EH K s n/a 10 1250 1316 1380 N
+ D EH L b n/a 10 1248 1336 1345 N
+ D EH L e n/a 10 1248 1333 1400 N
+ D EH L i n/a 10 1248 1333 1353 N
+ D EH L s n/a 10 1248 1333 1353 N
+ D EH M b n/a 10 1250 1312 1396 N
+ D EH M e n/a 10 1250 1312 1396 N
+ D EH M i n/a 10 1250 1312 1396 N
+ D EH M s n/a 10 1250 1312 1396 N
+ D EH N b n/a 10 1250 1312 1396 N
+ D EH N e n/a 10 1250 1312 1396 N
+ D EH N i n/a 10 1250 1312 1396 N
+ D EH N s n/a 10 1250 1312 1396 N
+ D EH NG e n/a 10 1250 1312 1396 N
+ D EH NG s n/a 10 1250 1312 1396 N
+ D EH OW b n/a 10 1249 1335 1346 N
+ D EH OW e n/a 10 1249 1322 1415 N
+ D EH OW i n/a 10 1249 1322 1356 N
+ D EH OW s n/a 10 1249 1322 1356 N
+ D EH OY b n/a 10 1249 1335 1345 N
+ D EH OY e n/a 10 1249 1322 1411 N
+ D EH OY s n/a 10 1249 1322 1356 N
+ D EH P e n/a 10 1250 1316 1375 N
+ D EH P i n/a 10 1250 1316 1375 N
+ D EH P s n/a 10 1250 1316 1375 N
+ D EH R b n/a 10 1248 1336 1360 N
+ D EH R e n/a 10 1248 1332 1401 N
+ D EH R i n/a 10 1248 1333 1361 N
+ D EH R s n/a 10 1248 1332 1361 N
+ D EH S b n/a 10 1252 1319 1382 N
+ D EH S e n/a 10 1252 1319 1382 N
+ D EH S i n/a 10 1252 1319 1382 N
+ D EH S s n/a 10 1252 1319 1382 N
+ D EH SH e n/a 10 1252 1319 1383 N
+ D EH SH i n/a 10 1252 1319 1383 N
+ D EH SH s n/a 10 1252 1319 1383 N
+ D EH SIL e n/a 10 1252 1338 1419 N
+ D EH SIL s n/a 10 1252 1335 1419 N
+ D EH T e n/a 10 1250 1316 1373 N
+ D EH T i n/a 10 1250 1316 1373 N
+ D EH T s n/a 10 1250 1316 1373 N
+ D EH TH e n/a 10 1251 1319 1380 N
+ D EH TH i n/a 10 1251 1319 1380 N
+ D EH TH s n/a 10 1251 1319 1380 N
+ D EH UH b n/a 10 1249 1336 1363 N
+ D EH UH e n/a 10 1249 1328 1410 N
+ D EH UH s n/a 10 1249 1328 1363 N
+ D EH UW b n/a 10 1248 1336 1363 N
+ D EH UW e n/a 10 1248 1328 1410 N
+ D EH UW i n/a 10 1248 1328 1363 N
+ D EH UW s n/a 10 1248 1328 1363 N
+ D EH V b n/a 10 1252 1316 1380 N
+ D EH V e n/a 10 1252 1316 1380 N
+ D EH V i n/a 10 1252 1316 1380 N
+ D EH V s n/a 10 1252 1316 1380 N
+ D EH W b n/a 10 1248 1336 1345 N
+ D EH W e n/a 10 1248 1332 1401 N
+ D EH W i n/a 10 1248 1332 1353 N
+ D EH W s n/a 10 1248 1332 1353 N
+ D EH Y b n/a 10 1250 1316 1383 N
+ D EH Y e n/a 10 1250 1316 1383 N
+ D EH Y i n/a 10 1250 1316 1383 N
+ D EH Y s n/a 10 1250 1316 1383 N
+ D EH Z b n/a 10 1252 1316 1382 N
+ D EH Z e n/a 10 1252 1316 1382 N
+ D EH Z i n/a 10 1252 1316 1382 N
+ D EH Z s n/a 10 1252 1316 1382 N
+ D EH ZH e n/a 10 1252 1316 1383 N
+ D EH ZH s n/a 10 1252 1316 1383 N
+ D ER AA b n/a 10 1240 1335 1347 N
+ D ER AA e n/a 10 1238 1320 1415 N
+ D ER AA i n/a 10 1238 1320 1356 N
+ D ER AA s n/a 10 1238 1320 1356 N
+ D ER AE b n/a 10 1240 1335 1343 N
+ D ER AE e n/a 10 1238 1320 1406 N
+ D ER AE i n/a 10 1238 1320 1354 N
+ D ER AE s n/a 10 1238 1320 1354 N
+ D ER AH b n/a 10 1240 1336 1346 N
+ D ER AH e n/a 10 1238 1320 1407 N
+ D ER AH i n/a 10 1238 1320 1355 N
+ D ER AH s n/a 10 1238 1320 1355 N
+ D ER AO b n/a 10 1240 1335 1345 N
+ D ER AO e n/a 10 1238 1320 1415 N
+ D ER AO i n/a 10 1238 1320 1356 N
+ D ER AO s n/a 10 1238 1320 1356 N
+ D ER AW b n/a 10 1240 1335 1344 N
+ D ER AW e n/a 10 1238 1320 1416 N
+ D ER AW i n/a 10 1238 1320 1354 N
+ D ER AW s n/a 10 1238 1320 1354 N
+ D ER AY b n/a 10 1240 1335 1349 N
+ D ER AY e n/a 10 1238 1320 1411 N
+ D ER AY i n/a 10 1238 1320 1356 N
+ D ER AY s n/a 10 1238 1320 1356 N
+ D ER B b n/a 10 1240 1317 1395 N
+ D ER B e n/a 10 1235 1317 1395 N
+ D ER B i n/a 10 1235 1317 1395 N
+ D ER B s n/a 10 1235 1317 1395 N
+ D ER CH e n/a 10 1239 1317 1374 N
+ D ER CH s n/a 10 1239 1317 1374 N
+ D ER D b n/a 10 1235 1317 1395 N
+ D ER D e n/a 10 1235 1317 1395 N
+ D ER D i n/a 10 1235 1317 1395 N
+ D ER D s n/a 10 1235 1317 1395 N
+ D ER DH e n/a 10 1236 1316 1376 N
+ D ER DH s n/a 10 1236 1316 1376 N
+ D ER EH b n/a 10 1240 1336 1343 N
+ D ER EH e n/a 10 1238 1320 1405 N
+ D ER EH i n/a 10 1238 1320 1354 N
+ D ER EH s n/a 10 1238 1320 1354 N
+ D ER ER b n/a 10 1240 1336 1350 N
+ D ER ER e n/a 10 1237 1320 1415 N
+ D ER ER i n/a 10 1237 1320 1357 N
+ D ER ER s n/a 10 1237 1320 1357 N
+ D ER EY b n/a 10 1240 1336 1343 N
+ D ER EY e n/a 10 1238 1320 1405 N
+ D ER EY i n/a 10 1238 1320 1354 N
+ D ER EY s n/a 10 1238 1320 1354 N
+ D ER F b n/a 10 1239 1319 1377 N
+ D ER F e n/a 10 1239 1319 1377 N
+ D ER F i n/a 10 1239 1319 1377 N
+ D ER F s n/a 10 1239 1319 1377 N
+ D ER G b n/a 10 1240 1317 1395 N
+ D ER G e n/a 10 1235 1317 1395 N
+ D ER G s n/a 10 1235 1317 1395 N
+ D ER HH b n/a 10 1239 1336 1388 N
+ D ER HH e n/a 10 1238 1334 1388 N
+ D ER HH i n/a 10 1238 1334 1388 N
+ D ER HH s n/a 10 1238 1334 1388 N
+ D ER IH b n/a 10 1240 1336 1366 N
+ D ER IH e n/a 10 1238 1329 1410 N
+ D ER IH i n/a 10 1238 1326 1372 N
+ D ER IH s n/a 10 1238 1329 1366 N
+ D ER IY b n/a 10 1240 1336 1367 N
+ D ER IY e n/a 10 1238 1329 1410 N
+ D ER IY i n/a 10 1238 1329 1370 N
+ D ER IY s n/a 10 1238 1329 1367 N
+ D ER JH e n/a 10 1235 1317 1374 N
+ D ER JH s n/a 10 1235 1317 1374 N
+ D ER K e n/a 10 1239 1317 1380 N
+ D ER K i n/a 10 1239 1317 1380 N
+ D ER K s n/a 10 1239 1317 1380 N
+ D ER L b n/a 10 1240 1336 1345 N
+ D ER L e n/a 10 1235 1333 1400 N
+ D ER L i n/a 10 1235 1333 1353 N
+ D ER L s n/a 10 1235 1333 1353 N
+ D ER M b n/a 10 1240 1317 1396 N
+ D ER M e n/a 10 1235 1317 1396 N
+ D ER M i n/a 10 1235 1317 1396 N
+ D ER M s n/a 10 1235 1317 1396 N
+ D ER N b n/a 10 1235 1317 1396 N
+ D ER N e n/a 10 1235 1317 1396 N
+ D ER N i n/a 10 1235 1317 1396 N
+ D ER N s n/a 10 1235 1317 1396 N
+ D ER NG e n/a 10 1235 1317 1396 N
+ D ER NG s n/a 10 1235 1317 1396 N
+ D ER OW b n/a 10 1240 1336 1346 N
+ D ER OW e n/a 10 1238 1320 1415 N
+ D ER OW i n/a 10 1238 1320 1356 N
+ D ER OW s n/a 10 1238 1320 1356 N
+ D ER OY b n/a 10 1240 1335 1345 N
+ D ER OY e n/a 10 1238 1320 1411 N
+ D ER OY s n/a 10 1238 1320 1356 N
+ D ER P e n/a 10 1239 1317 1375 N
+ D ER P i n/a 10 1239 1317 1375 N
+ D ER P s n/a 10 1239 1317 1375 N
+ D ER R b n/a 10 1240 1336 1360 N
+ D ER R e n/a 10 1235 1332 1401 N
+ D ER R i n/a 10 1235 1333 1360 N
+ D ER R s n/a 10 1235 1332 1360 N
+ D ER S b n/a 10 1235 1319 1382 N
+ D ER S e n/a 10 1235 1319 1382 N
+ D ER S i n/a 10 1236 1319 1382 N
+ D ER S s n/a 10 1235 1319 1382 N
+ D ER SH e n/a 10 1239 1319 1383 N
+ D ER SH i n/a 10 1239 1319 1383 N
+ D ER SH s n/a 10 1239 1319 1383 N
+ D ER SIL e n/a 10 1239 1341 1418 N
+ D ER SIL s n/a 10 1239 1336 1418 N
+ D ER T e n/a 10 1235 1317 1374 N
+ D ER T i n/a 10 1235 1317 1374 N
+ D ER T s n/a 10 1235 1317 1374 N
+ D ER TH e n/a 10 1236 1319 1380 N
+ D ER TH s n/a 10 1236 1319 1380 N
+ D ER UH b n/a 10 1240 1336 1363 N
+ D ER UH e n/a 10 1238 1329 1410 N
+ D ER UH i n/a 10 1238 1326 1363 N
+ D ER UH s n/a 10 1238 1329 1363 N
+ D ER UW b n/a 10 1240 1336 1363 N
+ D ER UW e n/a 10 1238 1329 1410 N
+ D ER UW i n/a 10 1238 1326 1363 N
+ D ER UW s n/a 10 1238 1329 1363 N
+ D ER V b n/a 10 1240 1317 1380 N
+ D ER V e n/a 10 1235 1317 1380 N
+ D ER V s n/a 10 1235 1317 1380 N
+ D ER W b n/a 10 1240 1336 1345 N
+ D ER W e n/a 10 1235 1332 1401 N
+ D ER W i n/a 10 1235 1332 1353 N
+ D ER W s n/a 10 1235 1332 1353 N
+ D ER Y b n/a 10 1240 1317 1383 N
+ D ER Y e n/a 10 1235 1317 1383 N
+ D ER Y i n/a 10 1235 1317 1383 N
+ D ER Y s n/a 10 1235 1317 1383 N
+ D ER Z b n/a 10 1235 1317 1382 N
+ D ER Z e n/a 10 1235 1317 1382 N
+ D ER Z i n/a 10 1236 1317 1382 N
+ D ER Z s n/a 10 1235 1317 1382 N
+ D ER ZH e n/a 10 1235 1317 1383 N
+ D ER ZH s n/a 10 1235 1317 1383 N
+ D EY AA b n/a 10 1243 1337 1348 N
+ D EY AA e n/a 10 1242 1330 1415 N
+ D EY AA i n/a 10 1242 1330 1356 N
+ D EY AA s n/a 10 1242 1330 1356 N
+ D EY AE b n/a 10 1243 1337 1343 N
+ D EY AE e n/a 10 1242 1330 1406 N
+ D EY AE i n/a 10 1242 1330 1354 N
+ D EY AE s n/a 10 1242 1330 1354 N
+ D EY AH b n/a 10 1243 1337 1346 N
+ D EY AH e n/a 10 1242 1330 1407 N
+ D EY AH i n/a 10 1242 1330 1355 N
+ D EY AH s n/a 10 1242 1330 1355 N
+ D EY AO b n/a 10 1243 1337 1345 N
+ D EY AO e n/a 10 1242 1330 1415 N
+ D EY AO i n/a 10 1242 1330 1356 N
+ D EY AO s n/a 10 1242 1330 1356 N
+ D EY AW b n/a 10 1243 1337 1344 N
+ D EY AW e n/a 10 1242 1330 1416 N
+ D EY AW s n/a 10 1242 1330 1354 N
+ D EY AY b n/a 10 1243 1337 1349 N
+ D EY AY e n/a 10 1242 1330 1411 N
+ D EY AY i n/a 10 1242 1330 1356 N
+ D EY AY s n/a 10 1242 1330 1356 N
+ D EY B b n/a 10 1243 1315 1395 N
+ D EY B e n/a 10 1241 1315 1395 N
+ D EY B s n/a 10 1241 1315 1395 N
+ D EY CH e n/a 10 1241 1315 1374 N
+ D EY CH s n/a 10 1241 1315 1374 N
+ D EY D b n/a 10 1243 1315 1395 N
+ D EY D e n/a 10 1241 1315 1395 N
+ D EY D s n/a 10 1241 1315 1395 N
+ D EY DH e n/a 10 1241 1315 1376 N
+ D EY DH s n/a 10 1241 1315 1376 N
+ D EY EH b n/a 10 1243 1337 1343 N
+ D EY EH e n/a 10 1242 1330 1405 N
+ D EY EH i n/a 10 1242 1330 1354 N
+ D EY EH s n/a 10 1242 1330 1354 N
+ D EY ER b n/a 10 1243 1337 1350 N
+ D EY ER e n/a 10 1242 1330 1415 N
+ D EY ER i n/a 10 1242 1330 1357 N
+ D EY ER s n/a 10 1242 1330 1357 N
+ D EY EY b n/a 10 1243 1337 1343 N
+ D EY EY e n/a 10 1242 1330 1405 N
+ D EY EY i n/a 10 1242 1330 1354 N
+ D EY EY s n/a 10 1242 1330 1354 N
+ D EY F b n/a 10 1243 1319 1377 N
+ D EY F e n/a 10 1241 1319 1377 N
+ D EY F i n/a 10 1241 1319 1377 N
+ D EY F s n/a 10 1241 1319 1377 N
+ D EY G b n/a 10 1243 1315 1395 N
+ D EY G e n/a 10 1241 1315 1395 N
+ D EY G i n/a 10 1241 1315 1395 N
+ D EY G s n/a 10 1241 1315 1395 N
+ D EY HH b n/a 10 1243 1337 1388 N
+ D EY HH e n/a 10 1241 1334 1388 N
+ D EY HH s n/a 10 1241 1334 1388 N
+ D EY IH b n/a 10 1243 1337 1366 N
+ D EY IH e n/a 10 1242 1331 1410 N
+ D EY IH i n/a 10 1242 1331 1368 N
+ D EY IH s n/a 10 1242 1331 1366 N
+ D EY IY b n/a 10 1243 1337 1367 N
+ D EY IY e n/a 10 1242 1331 1410 N
+ D EY IY i n/a 10 1242 1331 1368 N
+ D EY IY s n/a 10 1242 1331 1367 N
+ D EY JH e n/a 10 1241 1315 1374 N
+ D EY JH s n/a 10 1241 1315 1374 N
+ D EY K e n/a 10 1241 1315 1380 N
+ D EY K i n/a 10 1241 1315 1380 N
+ D EY K s n/a 10 1241 1315 1380 N
+ D EY L b n/a 10 1243 1337 1345 N
+ D EY L e n/a 10 1241 1333 1400 N
+ D EY L i n/a 10 1241 1333 1353 N
+ D EY L s n/a 10 1241 1333 1353 N
+ D EY M b n/a 10 1243 1315 1396 N
+ D EY M e n/a 10 1241 1315 1396 N
+ D EY M i n/a 10 1241 1315 1396 N
+ D EY M s n/a 10 1241 1315 1396 N
+ D EY N b n/a 10 1243 1315 1396 N
+ D EY N e n/a 10 1241 1315 1396 N
+ D EY N s n/a 10 1241 1315 1396 N
+ D EY NG e n/a 10 1241 1315 1396 N
+ D EY NG s n/a 10 1241 1315 1396 N
+ D EY OW b n/a 10 1243 1337 1348 N
+ D EY OW e n/a 10 1242 1330 1415 N
+ D EY OW i n/a 10 1242 1330 1356 N
+ D EY OW s n/a 10 1242 1330 1356 N
+ D EY OY b n/a 10 1243 1337 1345 N
+ D EY OY e n/a 10 1242 1330 1411 N
+ D EY OY i n/a 10 1242 1330 1356 N
+ D EY OY s n/a 10 1242 1330 1356 N
+ D EY P e n/a 10 1241 1315 1375 N
+ D EY P i n/a 10 1241 1315 1375 N
+ D EY P s n/a 10 1241 1315 1375 N
+ D EY R b n/a 10 1243 1337 1360 N
+ D EY R e n/a 10 1241 1332 1401 N
+ D EY R i n/a 10 1241 1333 1361 N
+ D EY R s n/a 10 1241 1332 1361 N
+ D EY S b n/a 10 1243 1319 1382 N
+ D EY S e n/a 10 1241 1319 1382 N
+ D EY S i n/a 10 1241 1319 1382 N
+ D EY S s n/a 10 1241 1319 1382 N
+ D EY SH e n/a 10 1241 1319 1383 N
+ D EY SH s n/a 10 1241 1319 1383 N
+ D EY SIL e n/a 10 1243 1341 1420 N
+ D EY SIL s n/a 10 1243 1337 1420 N
+ D EY T e n/a 10 1241 1315 1374 N
+ D EY T i n/a 10 1241 1315 1374 N
+ D EY T s n/a 10 1241 1315 1374 N
+ D EY TH e n/a 10 1241 1319 1380 N
+ D EY TH s n/a 10 1241 1319 1380 N
+ D EY UH b n/a 10 1243 1337 1363 N
+ D EY UH e n/a 10 1242 1331 1410 N
+ D EY UH s n/a 10 1242 1331 1363 N
+ D EY UW b n/a 10 1243 1337 1363 N
+ D EY UW e n/a 10 1242 1331 1410 N
+ D EY UW i n/a 10 1242 1331 1363 N
+ D EY UW s n/a 10 1242 1331 1363 N
+ D EY V b n/a 10 1243 1315 1380 N
+ D EY V e n/a 10 1241 1315 1380 N
+ D EY V s n/a 10 1241 1315 1380 N
+ D EY W b n/a 10 1243 1337 1345 N
+ D EY W e n/a 10 1241 1332 1401 N
+ D EY W i n/a 10 1241 1332 1353 N
+ D EY W s n/a 10 1241 1332 1353 N
+ D EY Y b n/a 10 1243 1315 1383 N
+ D EY Y e n/a 10 1241 1315 1383 N
+ D EY Y i n/a 10 1241 1315 1383 N
+ D EY Y s n/a 10 1241 1315 1383 N
+ D EY Z b n/a 10 1243 1315 1382 N
+ D EY Z e n/a 10 1241 1315 1382 N
+ D EY Z i n/a 10 1241 1315 1382 N
+ D EY Z s n/a 10 1241 1315 1382 N
+ D EY ZH e n/a 10 1241 1315 1383 N
+ D EY ZH s n/a 10 1241 1315 1383 N
+ D F AA b n/a 10 1273 1297 1347 N
+ D F AA e n/a 10 1274 1297 1415 N
+ D F AA s n/a 10 1274 1297 1347 N
+ D F AE b n/a 10 1273 1297 1342 N
+ D F AE e n/a 10 1274 1297 1405 N
+ D F AE i n/a 10 1274 1297 1342 N
+ D F AE s n/a 10 1274 1297 1342 N
+ D F AH b n/a 10 1273 1297 1347 N
+ D F AH e n/a 10 1274 1297 1414 N
+ D F AH i n/a 10 1274 1297 1350 N
+ D F AH s n/a 10 1274 1297 1347 N
+ D F AO b n/a 10 1273 1297 1345 N
+ D F AO e n/a 10 1274 1297 1415 N
+ D F AO i n/a 10 1274 1297 1345 N
+ D F AO s n/a 10 1274 1297 1345 N
+ D F AW b n/a 10 1273 1297 1344 N
+ D F AW e n/a 10 1274 1297 1416 N
+ D F AW s n/a 10 1274 1297 1344 N
+ D F AY b n/a 10 1273 1297 1349 N
+ D F AY e n/a 10 1274 1297 1411 N
+ D F AY s n/a 10 1274 1297 1349 N
+ D F B b n/a 10 1273 1287 1399 N
+ D F B e n/a 10 1274 1287 1399 N
+ D F B s n/a 10 1274 1287 1399 N
+ D F CH e n/a 10 1272 1286 1385 N
+ D F CH s n/a 10 1272 1286 1385 N
+ D F D b n/a 10 1273 1287 1399 N
+ D F D e n/a 10 1274 1287 1399 N
+ D F D s n/a 10 1274 1287 1399 N
+ D F DH e n/a 10 1274 1287 1399 N
+ D F DH s n/a 10 1274 1287 1399 N
+ D F EH b n/a 10 1273 1297 1342 N
+ D F EH e n/a 10 1274 1297 1405 N
+ D F EH i n/a 10 1274 1297 1342 N
+ D F EH s n/a 10 1274 1297 1342 N
+ D F ER b n/a 10 1273 1297 1350 N
+ D F ER e n/a 10 1274 1297 1415 N
+ D F ER i n/a 10 1274 1297 1357 N
+ D F ER s n/a 10 1274 1297 1357 N
+ D F EY b n/a 10 1273 1297 1342 N
+ D F EY e n/a 10 1274 1297 1405 N
+ D F EY i n/a 10 1274 1297 1342 N
+ D F EY s n/a 10 1274 1297 1342 N
+ D F F b n/a 10 1273 1286 1379 N
+ D F F e n/a 10 1272 1286 1379 N
+ D F F s n/a 10 1272 1286 1379 N
+ D F G b n/a 10 1273 1287 1399 N
+ D F G e n/a 10 1274 1287 1399 N
+ D F G s n/a 10 1274 1287 1399 N
+ D F HH b n/a 10 1273 1286 1389 N
+ D F HH e n/a 10 1272 1286 1389 N
+ D F HH s n/a 10 1272 1286 1389 N
+ D F IH b n/a 10 1273 1297 1364 N
+ D F IH e n/a 10 1274 1297 1408 N
+ D F IH i n/a 10 1274 1297 1370 N
+ D F IH s n/a 10 1274 1297 1364 N
+ D F IY b n/a 10 1273 1297 1363 N
+ D F IY e n/a 10 1274 1297 1408 N
+ D F IY i n/a 10 1274 1297 1370 N
+ D F IY s n/a 10 1274 1297 1363 N
+ D F JH e n/a 10 1274 1287 1399 N
+ D F JH s n/a 10 1274 1287 1399 N
+ D F K e n/a 10 1272 1286 1379 N
+ D F K s n/a 10 1272 1286 1379 N
+ D F L b n/a 10 1273 1286 1345 N
+ D F L e n/a 10 1274 1286 1400 N
+ D F L s n/a 10 1274 1286 1345 N
+ D F M b n/a 10 1273 1287 1399 N
+ D F M e n/a 10 1274 1287 1399 N
+ D F M i n/a 10 1274 1287 1399 N
+ D F M s n/a 10 1274 1287 1399 N
+ D F N b n/a 10 1273 1287 1399 N
+ D F N e n/a 10 1274 1287 1399 N
+ D F N s n/a 10 1274 1287 1399 N
+ D F NG e n/a 10 1274 1287 1399 N
+ D F NG s n/a 10 1274 1287 1399 N
+ D F OW b n/a 10 1273 1297 1347 N
+ D F OW e n/a 10 1274 1297 1415 N
+ D F OW s n/a 10 1274 1297 1347 N
+ D F OY b n/a 10 1273 1297 1345 N
+ D F OY e n/a 10 1274 1297 1411 N
+ D F OY s n/a 10 1274 1297 1345 N
+ D F P e n/a 10 1272 1286 1379 N
+ D F P s n/a 10 1272 1286 1379 N
+ D F R b n/a 10 1273 1286 1360 N
+ D F R e n/a 10 1274 1286 1401 N
+ D F R s n/a 10 1274 1286 1361 N
+ D F S b n/a 10 1273 1287 1385 N
+ D F S e n/a 10 1272 1287 1385 N
+ D F S s n/a 10 1272 1287 1385 N
+ D F SH e n/a 10 1272 1286 1385 N
+ D F SH s n/a 10 1272 1286 1385 N
+ D F SIL e n/a 10 1272 1286 1421 N
+ D F SIL s n/a 10 1272 1286 1421 N
+ D F T e n/a 10 1272 1287 1379 N
+ D F T s n/a 10 1272 1287 1379 N
+ D F TH e n/a 10 1272 1287 1379 N
+ D F TH s n/a 10 1272 1287 1379 N
+ D F UH b n/a 10 1273 1297 1363 N
+ D F UH e n/a 10 1274 1297 1408 N
+ D F UH s n/a 10 1274 1297 1363 N
+ D F UW b n/a 10 1273 1297 1363 N
+ D F UW e n/a 10 1274 1297 1408 N
+ D F UW i n/a 10 1274 1297 1363 N
+ D F UW s n/a 10 1274 1297 1363 N
+ D F V b n/a 10 1273 1287 1399 N
+ D F V e n/a 10 1274 1287 1399 N
+ D F V s n/a 10 1274 1287 1399 N
+ D F W b n/a 10 1273 1286 1345 N
+ D F W e n/a 10 1274 1286 1400 N
+ D F W s n/a 10 1274 1286 1345 N
+ D F Y b n/a 10 1273 1287 1399 N
+ D F Y e n/a 10 1274 1287 1399 N
+ D F Y s n/a 10 1274 1287 1399 N
+ D F Z b n/a 10 1273 1287 1399 N
+ D F Z e n/a 10 1274 1287 1399 N
+ D F Z s n/a 10 1274 1287 1399 N
+ D F ZH e n/a 10 1274 1287 1399 N
+ D F ZH s n/a 10 1274 1287 1399 N
+ D G AA b n/a 10 1270 1297 1347 N
+ D G AA e n/a 10 1270 1297 1415 N
+ D G AA i n/a 10 1270 1297 1347 N
+ D G AA s n/a 10 1270 1297 1347 N
+ D G AE b n/a 10 1270 1297 1342 N
+ D G AE e n/a 10 1270 1297 1405 N
+ D G AE i n/a 10 1270 1297 1342 N
+ D G AE s n/a 10 1270 1297 1342 N
+ D G AH b n/a 10 1270 1297 1347 N
+ D G AH e n/a 10 1270 1297 1414 N
+ D G AH i n/a 10 1270 1297 1351 N
+ D G AH s n/a 10 1270 1297 1347 N
+ D G AO b n/a 10 1270 1297 1345 N
+ D G AO e n/a 10 1270 1297 1415 N
+ D G AO i n/a 10 1270 1297 1345 N
+ D G AO s n/a 10 1270 1297 1345 N
+ D G AW b n/a 10 1270 1297 1344 N
+ D G AW e n/a 10 1270 1297 1416 N
+ D G AW s n/a 10 1270 1297 1344 N
+ D G AY b n/a 10 1270 1297 1349 N
+ D G AY e n/a 10 1270 1297 1411 N
+ D G AY s n/a 10 1270 1297 1349 N
+ D G B b n/a 10 1270 1287 1399 N
+ D G B e n/a 10 1270 1287 1399 N
+ D G B i n/a 10 1270 1287 1399 N
+ D G B s n/a 10 1270 1287 1399 N
+ D G CH e n/a 10 1270 1287 1385 N
+ D G CH s n/a 10 1270 1287 1385 N
+ D G D b n/a 10 1270 1287 1399 N
+ D G D e n/a 10 1270 1287 1399 N
+ D G D s n/a 10 1270 1287 1399 N
+ D G DH e n/a 10 1270 1287 1399 N
+ D G DH s n/a 10 1270 1287 1399 N
+ D G EH b n/a 10 1270 1297 1342 N
+ D G EH e n/a 10 1270 1297 1405 N
+ D G EH s n/a 10 1270 1297 1342 N
+ D G ER b n/a 10 1270 1297 1350 N
+ D G ER e n/a 10 1270 1297 1415 N
+ D G ER i n/a 10 1270 1297 1357 N
+ D G ER s n/a 10 1270 1297 1357 N
+ D G EY b n/a 10 1270 1297 1342 N
+ D G EY e n/a 10 1270 1297 1405 N
+ D G EY i n/a 10 1270 1297 1342 N
+ D G EY s n/a 10 1270 1297 1342 N
+ D G F b n/a 10 1270 1287 1379 N
+ D G F e n/a 10 1270 1287 1379 N
+ D G F s n/a 10 1270 1287 1379 N
+ D G G b n/a 10 1270 1287 1399 N
+ D G G e n/a 10 1270 1287 1399 N
+ D G G s n/a 10 1270 1287 1399 N
+ D G HH b n/a 10 1270 1287 1389 N
+ D G HH e n/a 10 1270 1287 1389 N
+ D G HH s n/a 10 1270 1287 1389 N
+ D G IH b n/a 10 1270 1298 1364 N
+ D G IH e n/a 10 1270 1298 1408 N
+ D G IH i n/a 10 1270 1298 1370 N
+ D G IH s n/a 10 1270 1298 1364 N
+ D G IY b n/a 10 1270 1298 1363 N
+ D G IY e n/a 10 1270 1298 1408 N
+ D G IY i n/a 10 1270 1298 1370 N
+ D G IY s n/a 10 1270 1298 1363 N
+ D G JH e n/a 10 1270 1287 1399 N
+ D G JH s n/a 10 1270 1287 1399 N
+ D G K e n/a 10 1270 1287 1379 N
+ D G K s n/a 10 1270 1287 1379 N
+ D G L b n/a 10 1270 1286 1345 N
+ D G L e n/a 10 1270 1286 1400 N
+ D G L s n/a 10 1270 1286 1345 N
+ D G M b n/a 10 1270 1287 1399 N
+ D G M e n/a 10 1270 1287 1399 N
+ D G M s n/a 10 1270 1287 1399 N
+ D G N b n/a 10 1270 1287 1399 N
+ D G N e n/a 10 1270 1287 1399 N
+ D G N i n/a 10 1270 1287 1399 N
+ D G N s n/a 10 1270 1287 1399 N
+ D G NG e n/a 10 1270 1287 1399 N
+ D G NG s n/a 10 1270 1287 1399 N
+ D G OW b n/a 10 1270 1297 1346 N
+ D G OW e n/a 10 1270 1297 1415 N
+ D G OW s n/a 10 1270 1297 1346 N
+ D G OY b n/a 10 1270 1297 1345 N
+ D G OY e n/a 10 1270 1297 1411 N
+ D G OY s n/a 10 1270 1297 1345 N
+ D G P e n/a 10 1270 1287 1379 N
+ D G P s n/a 10 1270 1287 1379 N
+ D G R b n/a 10 1270 1286 1360 N
+ D G R e n/a 10 1270 1286 1401 N
+ D G R i n/a 10 1270 1286 1361 N
+ D G R s n/a 10 1270 1286 1361 N
+ D G S b n/a 10 1270 1287 1385 N
+ D G S e n/a 10 1270 1287 1385 N
+ D G S s n/a 10 1270 1287 1385 N
+ D G SH e n/a 10 1270 1287 1385 N
+ D G SH s n/a 10 1270 1287 1385 N
+ D G SIL e n/a 10 1270 1287 1421 N
+ D G SIL s n/a 10 1270 1287 1421 N
+ D G T e n/a 10 1270 1287 1379 N
+ D G T s n/a 10 1270 1287 1379 N
+ D G TH e n/a 10 1270 1287 1379 N
+ D G TH s n/a 10 1270 1287 1379 N
+ D G UH b n/a 10 1270 1298 1363 N
+ D G UH e n/a 10 1270 1298 1408 N
+ D G UH s n/a 10 1270 1298 1363 N
+ D G UW b n/a 10 1270 1298 1363 N
+ D G UW e n/a 10 1270 1298 1408 N
+ D G UW s n/a 10 1270 1298 1363 N
+ D G V b n/a 10 1270 1287 1399 N
+ D G V e n/a 10 1270 1287 1399 N
+ D G V s n/a 10 1270 1287 1399 N
+ D G W b n/a 10 1270 1286 1345 N
+ D G W e n/a 10 1270 1286 1400 N
+ D G W s n/a 10 1270 1286 1345 N
+ D G Y b n/a 10 1270 1287 1399 N
+ D G Y e n/a 10 1270 1287 1399 N
+ D G Y s n/a 10 1270 1287 1399 N
+ D G Z b n/a 10 1270 1287 1399 N
+ D G Z e n/a 10 1270 1287 1399 N
+ D G Z i n/a 10 1270 1287 1399 N
+ D G Z s n/a 10 1270 1287 1399 N
+ D G ZH e n/a 10 1270 1287 1399 N
+ D G ZH s n/a 10 1270 1287 1399 N
+ D HH AA b n/a 10 1271 1299 1347 N
+ D HH AA s n/a 10 1271 1299 1347 N
+ D HH AE b n/a 10 1271 1298 1342 N
+ D HH AE s n/a 10 1271 1298 1342 N
+ D HH AH b n/a 10 1271 1299 1347 N
+ D HH AH s n/a 10 1271 1299 1347 N
+ D HH AO b n/a 10 1271 1299 1345 N
+ D HH AO s n/a 10 1271 1299 1345 N
+ D HH AW b n/a 10 1271 1299 1344 N
+ D HH AW s n/a 10 1271 1299 1344 N
+ D HH AY b n/a 10 1271 1299 1349 N
+ D HH AY s n/a 10 1271 1299 1349 N
+ D HH B b n/a 10 1271 1287 1399 N
+ D HH B s n/a 10 1271 1287 1399 N
+ D HH CH s n/a 10 1271 1287 1385 N
+ D HH D b n/a 10 1271 1287 1399 N
+ D HH D s n/a 10 1271 1287 1399 N
+ D HH DH s n/a 10 1271 1287 1399 N
+ D HH EH b n/a 10 1271 1298 1342 N
+ D HH EH s n/a 10 1271 1298 1342 N
+ D HH ER b n/a 10 1271 1299 1350 N
+ D HH ER s n/a 10 1271 1299 1357 N
+ D HH EY b n/a 10 1271 1298 1342 N
+ D HH EY s n/a 10 1271 1298 1342 N
+ D HH F b n/a 10 1271 1287 1379 N
+ D HH F s n/a 10 1271 1287 1379 N
+ D HH G b n/a 10 1271 1287 1399 N
+ D HH G s n/a 10 1271 1287 1399 N
+ D HH HH b n/a 10 1271 1287 1389 N
+ D HH HH s n/a 10 1271 1287 1389 N
+ D HH IH b n/a 10 1271 1298 1364 N
+ D HH IH s n/a 10 1271 1298 1364 N
+ D HH IY b n/a 10 1271 1298 1363 N
+ D HH IY i n/a 10 1271 1298 1370 N
+ D HH IY s n/a 10 1271 1298 1363 N
+ D HH JH s n/a 10 1271 1287 1399 N
+ D HH K s n/a 10 1271 1287 1379 N
+ D HH L b n/a 10 1271 1286 1345 N
+ D HH L s n/a 10 1271 1286 1345 N
+ D HH M b n/a 10 1271 1287 1399 N
+ D HH M s n/a 10 1271 1287 1399 N
+ D HH N b n/a 10 1271 1287 1399 N
+ D HH N s n/a 10 1271 1287 1399 N
+ D HH NG s n/a 10 1271 1287 1399 N
+ D HH OW b n/a 10 1271 1299 1347 N
+ D HH OW s n/a 10 1271 1299 1347 N
+ D HH OY b n/a 10 1271 1299 1345 N
+ D HH OY s n/a 10 1271 1299 1345 N
+ D HH P s n/a 10 1271 1287 1379 N
+ D HH R b n/a 10 1271 1286 1360 N
+ D HH R s n/a 10 1271 1286 1361 N
+ D HH S b n/a 10 1271 1287 1385 N
+ D HH S s n/a 10 1271 1287 1385 N
+ D HH SH s n/a 10 1271 1287 1385 N
+ D HH SIL s n/a 10 1271 1287 1421 N
+ D HH T s n/a 10 1271 1287 1379 N
+ D HH TH s n/a 10 1271 1287 1379 N
+ D HH UH b n/a 10 1271 1298 1363 N
+ D HH UH s n/a 10 1271 1298 1363 N
+ D HH UW b n/a 10 1271 1298 1363 N
+ D HH UW s n/a 10 1271 1298 1363 N
+ D HH V b n/a 10 1271 1287 1399 N
+ D HH V s n/a 10 1271 1287 1399 N
+ D HH W b n/a 10 1271 1286 1345 N
+ D HH W s n/a 10 1271 1286 1345 N
+ D HH Y b n/a 10 1271 1287 1399 N
+ D HH Y s n/a 10 1271 1287 1399 N
+ D HH Z b n/a 10 1271 1287 1399 N
+ D HH Z s n/a 10 1271 1287 1399 N
+ D HH ZH s n/a 10 1271 1287 1399 N
+ D IH AA b n/a 10 1244 1335 1347 N
+ D IH AA e n/a 10 1229 1321 1415 N
+ D IH AA i n/a 10 1233 1321 1356 N
+ D IH AA s n/a 10 1229 1321 1356 N
+ D IH AE b n/a 10 1244 1335 1343 N
+ D IH AE e n/a 10 1229 1321 1406 N
+ D IH AE i n/a 10 1233 1321 1354 N
+ D IH AE s n/a 10 1229 1321 1354 N
+ D IH AH b n/a 10 1244 1335 1347 N
+ D IH AH e n/a 10 1229 1321 1407 N
+ D IH AH i n/a 10 1233 1322 1352 N
+ D IH AH s n/a 10 1229 1321 1352 N
+ D IH AO b n/a 10 1244 1335 1345 N
+ D IH AO e n/a 10 1229 1321 1415 N
+ D IH AO i n/a 10 1233 1321 1356 N
+ D IH AO s n/a 10 1229 1321 1356 N
+ D IH AW b n/a 10 1244 1335 1344 N
+ D IH AW e n/a 10 1229 1321 1416 N
+ D IH AW i n/a 10 1231 1321 1354 N
+ D IH AW s n/a 10 1229 1321 1354 N
+ D IH AY b n/a 10 1244 1335 1349 N
+ D IH AY e n/a 10 1229 1321 1411 N
+ D IH AY i n/a 10 1233 1321 1356 N
+ D IH AY s n/a 10 1229 1321 1356 N
+ D IH B b n/a 10 1244 1312 1395 N
+ D IH B e n/a 10 1226 1312 1395 N
+ D IH B i n/a 10 1226 1312 1395 N
+ D IH B s n/a 10 1226 1312 1395 N
+ D IH CH e n/a 10 1228 1314 1374 N
+ D IH CH s n/a 10 1228 1314 1374 N
+ D IH D b n/a 10 1244 1312 1395 N
+ D IH D e n/a 10 1226 1312 1395 N
+ D IH D i n/a 10 1226 1312 1395 N
+ D IH D s n/a 10 1226 1312 1395 N
+ D IH DH e n/a 10 1227 1316 1376 N
+ D IH DH s n/a 10 1227 1316 1376 N
+ D IH EH b n/a 10 1244 1335 1343 N
+ D IH EH e n/a 10 1229 1321 1405 N
+ D IH EH i n/a 10 1233 1321 1354 N
+ D IH EH s n/a 10 1229 1321 1354 N
+ D IH ER b n/a 10 1244 1335 1350 N
+ D IH ER e n/a 10 1229 1320 1415 N
+ D IH ER i n/a 10 1234 1320 1357 N
+ D IH ER s n/a 10 1229 1320 1357 N
+ D IH EY b n/a 10 1244 1335 1343 N
+ D IH EY e n/a 10 1229 1321 1405 N
+ D IH EY i n/a 10 1233 1321 1354 N
+ D IH EY s n/a 10 1229 1321 1354 N
+ D IH F b n/a 10 1244 1319 1377 N
+ D IH F e n/a 10 1228 1319 1377 N
+ D IH F i n/a 10 1228 1319 1377 N
+ D IH F s n/a 10 1228 1319 1377 N
+ D IH G b n/a 10 1244 1311 1395 N
+ D IH G e n/a 10 1228 1311 1395 N
+ D IH G i n/a 10 1228 1311 1395 N
+ D IH G s n/a 10 1228 1311 1395 N
+ D IH HH b n/a 10 1244 1335 1388 N
+ D IH HH e n/a 10 1228 1334 1388 N
+ D IH HH i n/a 10 1228 1334 1388 N
+ D IH HH s n/a 10 1228 1334 1388 N
+ D IH IH b n/a 10 1244 1336 1365 N
+ D IH IH e n/a 10 1229 1326 1410 N
+ D IH IH i n/a 10 1233 1326 1372 N
+ D IH IH s n/a 10 1229 1326 1365 N
+ D IH IY b n/a 10 1244 1336 1367 N
+ D IH IY e n/a 10 1229 1328 1410 N
+ D IH IY i n/a 10 1233 1328 1368 N
+ D IH IY s n/a 10 1229 1328 1367 N
+ D IH JH e n/a 10 1228 1314 1374 N
+ D IH JH i n/a 10 1228 1314 1374 N
+ D IH JH s n/a 10 1228 1314 1374 N
+ D IH K e n/a 10 1228 1315 1380 N
+ D IH K i n/a 10 1228 1315 1380 N
+ D IH K s n/a 10 1228 1315 1380 N
+ D IH L b n/a 10 1244 1336 1345 N
+ D IH L e n/a 10 1228 1333 1400 N
+ D IH L i n/a 10 1228 1333 1353 N
+ D IH L s n/a 10 1228 1333 1353 N
+ D IH M b n/a 10 1244 1312 1396 N
+ D IH M e n/a 10 1226 1312 1396 N
+ D IH M i n/a 10 1226 1312 1396 N
+ D IH M s n/a 10 1226 1312 1396 N
+ D IH N b n/a 10 1244 1312 1396 N
+ D IH N e n/a 10 1226 1312 1396 N
+ D IH N i n/a 10 1226 1312 1396 N
+ D IH N s n/a 10 1226 1312 1396 N
+ D IH NG e n/a 10 1228 1312 1396 N
+ D IH NG s n/a 10 1228 1312 1396 N
+ D IH OW b n/a 10 1244 1335 1346 N
+ D IH OW e n/a 10 1229 1321 1415 N
+ D IH OW i n/a 10 1231 1321 1356 N
+ D IH OW s n/a 10 1229 1321 1356 N
+ D IH OY b n/a 10 1244 1335 1345 N
+ D IH OY e n/a 10 1229 1321 1411 N
+ D IH OY s n/a 10 1229 1321 1356 N
+ D IH P e n/a 10 1227 1314 1375 N
+ D IH P i n/a 10 1227 1314 1375 N
+ D IH P s n/a 10 1227 1314 1375 N
+ D IH R b n/a 10 1244 1336 1360 N
+ D IH R e n/a 10 1228 1332 1401 N
+ D IH R i n/a 10 1228 1333 1360 N
+ D IH R s n/a 10 1228 1332 1360 N
+ D IH S b n/a 10 1244 1319 1382 N
+ D IH S e n/a 10 1227 1319 1382 N
+ D IH S i n/a 10 1227 1319 1382 N
+ D IH S s n/a 10 1227 1319 1382 N
+ D IH SH e n/a 10 1228 1319 1383 N
+ D IH SH i n/a 10 1228 1319 1383 N
+ D IH SH s n/a 10 1228 1319 1383 N
+ D IH SIL e n/a 10 1230 1339 1419 N
+ D IH SIL s n/a 10 1230 1335 1419 N
+ D IH T e n/a 10 1227 1314 1374 N
+ D IH T i n/a 10 1227 1314 1374 N
+ D IH T s n/a 10 1227 1314 1374 N
+ D IH TH e n/a 10 1227 1319 1380 N
+ D IH TH i n/a 10 1227 1319 1380 N
+ D IH TH s n/a 10 1227 1319 1380 N
+ D IH UH b n/a 10 1244 1336 1363 N
+ D IH UH e n/a 10 1229 1326 1410 N
+ D IH UH i n/a 10 1233 1326 1363 N
+ D IH UH s n/a 10 1229 1326 1363 N
+ D IH UW b n/a 10 1244 1336 1363 N
+ D IH UW e n/a 10 1229 1326 1410 N
+ D IH UW i n/a 10 1231 1326 1363 N
+ D IH UW s n/a 10 1229 1326 1363 N
+ D IH V b n/a 10 1244 1316 1380 N
+ D IH V e n/a 10 1228 1316 1380 N
+ D IH V s n/a 10 1228 1316 1380 N
+ D IH W b n/a 10 1244 1336 1345 N
+ D IH W e n/a 10 1228 1332 1401 N
+ D IH W i n/a 10 1228 1332 1353 N
+ D IH W s n/a 10 1228 1332 1353 N
+ D IH Y b n/a 10 1244 1315 1383 N
+ D IH Y e n/a 10 1228 1315 1383 N
+ D IH Y i n/a 10 1228 1315 1383 N
+ D IH Y s n/a 10 1228 1315 1383 N
+ D IH Z b n/a 10 1244 1316 1382 N
+ D IH Z e n/a 10 1227 1316 1382 N
+ D IH Z i n/a 10 1227 1316 1382 N
+ D IH Z s n/a 10 1227 1316 1382 N
+ D IH ZH e n/a 10 1228 1316 1383 N
+ D IH ZH s n/a 10 1228 1316 1383 N
+ D IY AA b n/a 10 1243 1337 1348 N
+ D IY AA e n/a 10 1242 1330 1415 N
+ D IY AA i n/a 10 1242 1330 1356 N
+ D IY AA s n/a 10 1242 1330 1356 N
+ D IY AE b n/a 10 1243 1337 1343 N
+ D IY AE e n/a 10 1242 1330 1406 N
+ D IY AE i n/a 10 1242 1330 1354 N
+ D IY AE s n/a 10 1242 1330 1354 N
+ D IY AH b n/a 10 1243 1337 1348 N
+ D IY AH e n/a 10 1242 1330 1407 N
+ D IY AH i n/a 10 1242 1330 1354 N
+ D IY AH s n/a 10 1242 1330 1354 N
+ D IY AO b n/a 10 1243 1337 1345 N
+ D IY AO e n/a 10 1242 1330 1415 N
+ D IY AO i n/a 10 1242 1330 1356 N
+ D IY AO s n/a 10 1242 1330 1356 N
+ D IY AW b n/a 10 1243 1337 1344 N
+ D IY AW e n/a 10 1242 1330 1416 N
+ D IY AW i n/a 10 1242 1330 1354 N
+ D IY AW s n/a 10 1242 1330 1354 N
+ D IY AY b n/a 10 1243 1337 1349 N
+ D IY AY e n/a 10 1242 1330 1411 N
+ D IY AY i n/a 10 1242 1330 1356 N
+ D IY AY s n/a 10 1242 1330 1356 N
+ D IY B b n/a 10 1243 1315 1395 N
+ D IY B e n/a 10 1241 1315 1395 N
+ D IY B i n/a 10 1241 1315 1395 N
+ D IY B s n/a 10 1241 1315 1395 N
+ D IY CH e n/a 10 1241 1315 1374 N
+ D IY CH s n/a 10 1241 1315 1374 N
+ D IY D b n/a 10 1243 1315 1395 N
+ D IY D e n/a 10 1241 1315 1395 N
+ D IY D s n/a 10 1241 1315 1395 N
+ D IY DH e n/a 10 1241 1315 1376 N
+ D IY DH s n/a 10 1241 1315 1376 N
+ D IY EH b n/a 10 1243 1337 1343 N
+ D IY EH e n/a 10 1242 1330 1405 N
+ D IY EH i n/a 10 1242 1330 1354 N
+ D IY EH s n/a 10 1242 1330 1354 N
+ D IY ER b n/a 10 1243 1337 1350 N
+ D IY ER e n/a 10 1242 1330 1415 N
+ D IY ER i n/a 10 1242 1330 1357 N
+ D IY ER s n/a 10 1242 1330 1357 N
+ D IY EY b n/a 10 1243 1337 1343 N
+ D IY EY e n/a 10 1242 1330 1405 N
+ D IY EY i n/a 10 1242 1330 1354 N
+ D IY EY s n/a 10 1242 1330 1354 N
+ D IY F b n/a 10 1243 1319 1377 N
+ D IY F e n/a 10 1241 1319 1377 N
+ D IY F i n/a 10 1241 1319 1377 N
+ D IY F s n/a 10 1241 1319 1377 N
+ D IY G b n/a 10 1243 1315 1395 N
+ D IY G e n/a 10 1241 1315 1395 N
+ D IY G s n/a 10 1241 1315 1395 N
+ D IY HH b n/a 10 1243 1337 1388 N
+ D IY HH e n/a 10 1241 1334 1388 N
+ D IY HH i n/a 10 1241 1334 1388 N
+ D IY HH s n/a 10 1241 1334 1388 N
+ D IY IH b n/a 10 1243 1337 1365 N
+ D IY IH e n/a 10 1242 1331 1410 N
+ D IY IH i n/a 10 1242 1331 1368 N
+ D IY IH s n/a 10 1242 1331 1365 N
+ D IY IY b n/a 10 1243 1337 1367 N
+ D IY IY e n/a 10 1242 1331 1410 N
+ D IY IY i n/a 10 1242 1331 1368 N
+ D IY IY s n/a 10 1242 1331 1367 N
+ D IY JH e n/a 10 1241 1315 1374 N
+ D IY JH s n/a 10 1241 1315 1374 N
+ D IY K e n/a 10 1241 1315 1380 N
+ D IY K s n/a 10 1241 1315 1380 N
+ D IY L b n/a 10 1243 1337 1345 N
+ D IY L e n/a 10 1241 1333 1400 N
+ D IY L i n/a 10 1241 1333 1353 N
+ D IY L s n/a 10 1241 1333 1353 N
+ D IY M b n/a 10 1243 1315 1396 N
+ D IY M e n/a 10 1241 1315 1396 N
+ D IY M i n/a 10 1241 1315 1396 N
+ D IY M s n/a 10 1241 1315 1396 N
+ D IY N b n/a 10 1243 1315 1396 N
+ D IY N e n/a 10 1241 1315 1396 N
+ D IY N i n/a 10 1241 1315 1396 N
+ D IY N s n/a 10 1241 1315 1396 N
+ D IY NG e n/a 10 1241 1315 1396 N
+ D IY NG s n/a 10 1241 1315 1396 N
+ D IY OW b n/a 10 1243 1337 1348 N
+ D IY OW e n/a 10 1242 1330 1415 N
+ D IY OW i n/a 10 1242 1330 1356 N
+ D IY OW s n/a 10 1242 1330 1356 N
+ D IY OY b n/a 10 1243 1337 1345 N
+ D IY OY e n/a 10 1242 1330 1411 N
+ D IY OY i n/a 10 1242 1330 1356 N
+ D IY OY s n/a 10 1242 1330 1356 N
+ D IY P e n/a 10 1241 1315 1375 N
+ D IY P i n/a 10 1241 1315 1375 N
+ D IY P s n/a 10 1241 1315 1375 N
+ D IY R b n/a 10 1243 1337 1360 N
+ D IY R e n/a 10 1241 1332 1401 N
+ D IY R i n/a 10 1241 1333 1361 N
+ D IY R s n/a 10 1241 1332 1361 N
+ D IY S b n/a 10 1243 1319 1382 N
+ D IY S e n/a 10 1241 1319 1382 N
+ D IY S i n/a 10 1241 1319 1382 N
+ D IY S s n/a 10 1241 1319 1382 N
+ D IY SH e n/a 10 1241 1319 1383 N
+ D IY SH i n/a 10 1241 1319 1383 N
+ D IY SH s n/a 10 1241 1319 1383 N
+ D IY SIL e n/a 10 1243 1341 1420 N
+ D IY SIL s n/a 10 1243 1337 1420 N
+ D IY T e n/a 10 1241 1315 1374 N
+ D IY T i n/a 10 1241 1315 1374 N
+ D IY T s n/a 10 1241 1315 1374 N
+ D IY TH e n/a 10 1241 1319 1380 N
+ D IY TH s n/a 10 1241 1319 1380 N
+ D IY UH b n/a 10 1243 1337 1363 N
+ D IY UH e n/a 10 1242 1331 1410 N
+ D IY UH i n/a 10 1242 1331 1363 N
+ D IY UH s n/a 10 1242 1331 1363 N
+ D IY UW b n/a 10 1243 1337 1363 N
+ D IY UW e n/a 10 1242 1331 1410 N
+ D IY UW i n/a 10 1242 1331 1363 N
+ D IY UW s n/a 10 1242 1331 1363 N
+ D IY V b n/a 10 1243 1315 1380 N
+ D IY V e n/a 10 1241 1315 1380 N
+ D IY V s n/a 10 1241 1315 1380 N
+ D IY W b n/a 10 1243 1337 1345 N
+ D IY W e n/a 10 1241 1332 1401 N
+ D IY W i n/a 10 1241 1332 1353 N
+ D IY W s n/a 10 1241 1332 1353 N
+ D IY Y b n/a 10 1243 1315 1383 N
+ D IY Y e n/a 10 1241 1315 1383 N
+ D IY Y i n/a 10 1241 1315 1383 N
+ D IY Y s n/a 10 1241 1315 1383 N
+ D IY Z b n/a 10 1243 1315 1382 N
+ D IY Z e n/a 10 1241 1315 1382 N
+ D IY Z i n/a 10 1241 1315 1382 N
+ D IY Z s n/a 10 1241 1315 1382 N
+ D IY ZH e n/a 10 1241 1315 1383 N
+ D IY ZH s n/a 10 1241 1315 1383 N
+ D JH AA b n/a 10 1273 1297 1347 N
+ D JH AA e n/a 10 1272 1297 1415 N
+ D JH AA s n/a 10 1272 1297 1347 N
+ D JH AE b n/a 10 1273 1297 1342 N
+ D JH AE e n/a 10 1272 1297 1405 N
+ D JH AE s n/a 10 1272 1297 1342 N
+ D JH AH b n/a 10 1273 1297 1347 N
+ D JH AH e n/a 10 1272 1297 1414 N
+ D JH AH i n/a 10 1272 1297 1351 N
+ D JH AH s n/a 10 1272 1297 1347 N
+ D JH AO b n/a 10 1273 1297 1345 N
+ D JH AO e n/a 10 1272 1297 1415 N
+ D JH AO s n/a 10 1272 1297 1345 N
+ D JH AW b n/a 10 1273 1297 1344 N
+ D JH AW e n/a 10 1272 1297 1416 N
+ D JH AW s n/a 10 1272 1297 1344 N
+ D JH AY b n/a 10 1273 1297 1349 N
+ D JH AY e n/a 10 1272 1297 1411 N
+ D JH AY s n/a 10 1272 1297 1349 N
+ D JH B b n/a 10 1273 1287 1399 N
+ D JH B e n/a 10 1272 1287 1399 N
+ D JH B s n/a 10 1272 1287 1399 N
+ D JH CH e n/a 10 1272 1287 1385 N
+ D JH CH s n/a 10 1272 1287 1385 N
+ D JH D b n/a 10 1273 1287 1399 N
+ D JH D e n/a 10 1272 1287 1399 N
+ D JH D s n/a 10 1272 1287 1399 N
+ D JH DH e n/a 10 1272 1287 1399 N
+ D JH DH s n/a 10 1272 1287 1399 N
+ D JH EH b n/a 10 1273 1297 1342 N
+ D JH EH e n/a 10 1272 1297 1405 N
+ D JH EH s n/a 10 1272 1297 1342 N
+ D JH ER b n/a 10 1273 1297 1350 N
+ D JH ER e n/a 10 1272 1297 1415 N
+ D JH ER s n/a 10 1272 1297 1357 N
+ D JH EY b n/a 10 1273 1297 1342 N
+ D JH EY e n/a 10 1272 1297 1405 N
+ D JH EY s n/a 10 1272 1297 1342 N
+ D JH F b n/a 10 1273 1287 1379 N
+ D JH F e n/a 10 1272 1287 1379 N
+ D JH F s n/a 10 1272 1287 1379 N
+ D JH G b n/a 10 1273 1287 1399 N
+ D JH G e n/a 10 1272 1287 1399 N
+ D JH G s n/a 10 1272 1287 1399 N
+ D JH HH b n/a 10 1273 1287 1389 N
+ D JH HH e n/a 10 1272 1287 1389 N
+ D JH HH s n/a 10 1272 1287 1389 N
+ D JH IH b n/a 10 1273 1298 1364 N
+ D JH IH e n/a 10 1272 1298 1408 N
+ D JH IH s n/a 10 1272 1298 1364 N
+ D JH IY b n/a 10 1273 1298 1363 N
+ D JH IY e n/a 10 1272 1298 1408 N
+ D JH IY s n/a 10 1272 1298 1363 N
+ D JH JH e n/a 10 1272 1287 1399 N
+ D JH JH s n/a 10 1272 1287 1399 N
+ D JH K e n/a 10 1272 1287 1379 N
+ D JH K s n/a 10 1272 1287 1379 N
+ D JH L b n/a 10 1272 1286 1345 N
+ D JH L e n/a 10 1272 1286 1400 N
+ D JH L s n/a 10 1272 1286 1345 N
+ D JH M b n/a 10 1273 1287 1399 N
+ D JH M e n/a 10 1272 1287 1399 N
+ D JH M s n/a 10 1272 1287 1399 N
+ D JH N b n/a 10 1273 1287 1399 N
+ D JH N e n/a 10 1272 1287 1399 N
+ D JH N s n/a 10 1272 1287 1399 N
+ D JH NG e n/a 10 1272 1287 1399 N
+ D JH NG s n/a 10 1272 1287 1399 N
+ D JH OW b n/a 10 1273 1297 1346 N
+ D JH OW e n/a 10 1272 1297 1415 N
+ D JH OW s n/a 10 1272 1297 1346 N
+ D JH OY b n/a 10 1273 1297 1345 N
+ D JH OY e n/a 10 1272 1297 1411 N
+ D JH OY s n/a 10 1272 1297 1345 N
+ D JH P e n/a 10 1272 1287 1379 N
+ D JH P s n/a 10 1272 1287 1379 N
+ D JH R b n/a 10 1272 1286 1360 N
+ D JH R e n/a 10 1272 1286 1401 N
+ D JH R s n/a 10 1272 1286 1361 N
+ D JH S b n/a 10 1273 1287 1385 N
+ D JH S e n/a 10 1272 1287 1385 N
+ D JH S s n/a 10 1272 1287 1385 N
+ D JH SH e n/a 10 1272 1287 1385 N
+ D JH SH s n/a 10 1272 1287 1385 N
+ D JH SIL e n/a 10 1272 1287 1421 N
+ D JH SIL s n/a 10 1272 1287 1421 N
+ D JH T e n/a 10 1272 1287 1379 N
+ D JH T s n/a 10 1272 1287 1379 N
+ D JH TH e n/a 10 1272 1287 1379 N
+ D JH TH s n/a 10 1272 1287 1379 N
+ D JH UH b n/a 10 1273 1298 1363 N
+ D JH UH e n/a 10 1272 1298 1408 N
+ D JH UH s n/a 10 1272 1298 1363 N
+ D JH UW b n/a 10 1273 1298 1363 N
+ D JH UW e n/a 10 1272 1298 1408 N
+ D JH UW s n/a 10 1272 1298 1363 N
+ D JH V b n/a 10 1273 1287 1399 N
+ D JH V e n/a 10 1272 1287 1399 N
+ D JH V s n/a 10 1272 1287 1399 N
+ D JH W b n/a 10 1272 1286 1345 N
+ D JH W e n/a 10 1272 1286 1400 N
+ D JH W s n/a 10 1272 1286 1345 N
+ D JH Y b n/a 10 1273 1287 1399 N
+ D JH Y e n/a 10 1272 1287 1399 N
+ D JH Y s n/a 10 1272 1287 1399 N
+ D JH Z b n/a 10 1273 1287 1399 N
+ D JH Z e n/a 10 1272 1287 1399 N
+ D JH Z s n/a 10 1272 1287 1399 N
+ D JH ZH e n/a 10 1272 1287 1399 N
+ D JH ZH s n/a 10 1272 1287 1399 N
+ D K AA b n/a 10 1270 1297 1347 N
+ D K AA e n/a 10 1270 1297 1415 N
+ D K AA i n/a 10 1270 1297 1347 N
+ D K AA s n/a 10 1270 1297 1347 N
+ D K AE b n/a 10 1270 1297 1342 N
+ D K AE e n/a 10 1270 1297 1405 N
+ D K AE i n/a 10 1270 1297 1342 N
+ D K AE s n/a 10 1270 1297 1342 N
+ D K AH b n/a 10 1270 1297 1347 N
+ D K AH e n/a 10 1270 1297 1414 N
+ D K AH i n/a 10 1270 1297 1350 N
+ D K AH s n/a 10 1270 1297 1347 N
+ D K AO b n/a 10 1270 1297 1345 N
+ D K AO e n/a 10 1270 1297 1415 N
+ D K AO i n/a 10 1270 1297 1345 N
+ D K AO s n/a 10 1270 1297 1345 N
+ D K AW b n/a 10 1270 1297 1344 N
+ D K AW e n/a 10 1270 1297 1416 N
+ D K AW i n/a 10 1270 1297 1344 N
+ D K AW s n/a 10 1270 1297 1344 N
+ D K AY b n/a 10 1270 1297 1349 N
+ D K AY e n/a 10 1270 1297 1411 N
+ D K AY i n/a 10 1270 1297 1349 N
+ D K AY s n/a 10 1270 1297 1349 N
+ D K B b n/a 10 1270 1287 1399 N
+ D K B e n/a 10 1270 1287 1399 N
+ D K B s n/a 10 1270 1287 1399 N
+ D K CH e n/a 10 1270 1287 1385 N
+ D K CH s n/a 10 1270 1287 1385 N
+ D K D b n/a 10 1270 1287 1399 N
+ D K D e n/a 10 1270 1287 1399 N
+ D K D s n/a 10 1270 1287 1399 N
+ D K DH e n/a 10 1270 1287 1399 N
+ D K DH s n/a 10 1270 1287 1399 N
+ D K EH b n/a 10 1270 1297 1342 N
+ D K EH e n/a 10 1270 1297 1405 N
+ D K EH i n/a 10 1270 1297 1342 N
+ D K EH s n/a 10 1270 1297 1342 N
+ D K ER b n/a 10 1270 1297 1350 N
+ D K ER e n/a 10 1270 1297 1415 N
+ D K ER i n/a 10 1270 1297 1357 N
+ D K ER s n/a 10 1270 1297 1357 N
+ D K EY b n/a 10 1270 1297 1342 N
+ D K EY e n/a 10 1270 1297 1405 N
+ D K EY i n/a 10 1270 1297 1342 N
+ D K EY s n/a 10 1270 1297 1342 N
+ D K F b n/a 10 1270 1287 1379 N
+ D K F e n/a 10 1270 1287 1379 N
+ D K F s n/a 10 1270 1287 1379 N
+ D K G b n/a 10 1270 1287 1399 N
+ D K G e n/a 10 1270 1287 1399 N
+ D K G s n/a 10 1270 1287 1399 N
+ D K HH b n/a 10 1270 1287 1389 N
+ D K HH e n/a 10 1270 1287 1389 N
+ D K HH s n/a 10 1270 1287 1389 N
+ D K IH b n/a 10 1270 1298 1364 N
+ D K IH e n/a 10 1270 1298 1408 N
+ D K IH i n/a 10 1270 1298 1370 N
+ D K IH s n/a 10 1270 1298 1364 N
+ D K IY b n/a 10 1270 1298 1363 N
+ D K IY e n/a 10 1270 1298 1408 N
+ D K IY i n/a 10 1270 1298 1370 N
+ D K IY s n/a 10 1270 1298 1363 N
+ D K JH e n/a 10 1270 1287 1399 N
+ D K JH s n/a 10 1270 1287 1399 N
+ D K K e n/a 10 1270 1287 1379 N
+ D K K s n/a 10 1270 1287 1379 N
+ D K L b n/a 10 1270 1286 1345 N
+ D K L e n/a 10 1270 1286 1400 N
+ D K L s n/a 10 1270 1286 1345 N
+ D K M b n/a 10 1270 1287 1399 N
+ D K M e n/a 10 1270 1287 1399 N
+ D K M s n/a 10 1270 1287 1399 N
+ D K N b n/a 10 1270 1287 1399 N
+ D K N e n/a 10 1270 1287 1399 N
+ D K N s n/a 10 1270 1287 1399 N
+ D K NG e n/a 10 1270 1287 1399 N
+ D K NG s n/a 10 1270 1287 1399 N
+ D K OW b n/a 10 1270 1297 1347 N
+ D K OW e n/a 10 1270 1297 1415 N
+ D K OW i n/a 10 1270 1297 1349 N
+ D K OW s n/a 10 1270 1297 1347 N
+ D K OY b n/a 10 1270 1297 1345 N
+ D K OY e n/a 10 1270 1297 1411 N
+ D K OY s n/a 10 1270 1297 1345 N
+ D K P e n/a 10 1270 1287 1379 N
+ D K P s n/a 10 1270 1287 1379 N
+ D K R b n/a 10 1270 1286 1360 N
+ D K R e n/a 10 1270 1286 1401 N
+ D K R i n/a 10 1270 1286 1361 N
+ D K R s n/a 10 1270 1286 1361 N
+ D K S b n/a 10 1270 1287 1385 N
+ D K S e n/a 10 1270 1287 1385 N
+ D K S s n/a 10 1270 1287 1385 N
+ D K SH e n/a 10 1270 1287 1385 N
+ D K SH s n/a 10 1270 1287 1385 N
+ D K SIL e n/a 10 1270 1287 1421 N
+ D K SIL s n/a 10 1270 1287 1421 N
+ D K T e n/a 10 1270 1287 1379 N
+ D K T s n/a 10 1270 1287 1379 N
+ D K TH e n/a 10 1270 1287 1379 N
+ D K TH s n/a 10 1270 1287 1379 N
+ D K UH b n/a 10 1270 1298 1363 N
+ D K UH e n/a 10 1270 1298 1408 N
+ D K UH s n/a 10 1270 1298 1363 N
+ D K UW b n/a 10 1270 1298 1363 N
+ D K UW e n/a 10 1270 1298 1408 N
+ D K UW i n/a 10 1270 1298 1363 N
+ D K UW s n/a 10 1270 1298 1363 N
+ D K V b n/a 10 1270 1287 1399 N
+ D K V e n/a 10 1270 1287 1399 N
+ D K V s n/a 10 1270 1287 1399 N
+ D K W b n/a 10 1270 1286 1345 N
+ D K W e n/a 10 1270 1286 1400 N
+ D K W s n/a 10 1270 1286 1345 N
+ D K Y b n/a 10 1270 1287 1399 N
+ D K Y e n/a 10 1270 1287 1399 N
+ D K Y s n/a 10 1270 1287 1399 N
+ D K Z b n/a 10 1270 1287 1399 N
+ D K Z e n/a 10 1270 1287 1399 N
+ D K Z s n/a 10 1270 1287 1399 N
+ D K ZH e n/a 10 1270 1287 1399 N
+ D K ZH s n/a 10 1270 1287 1399 N
+ D L AA b n/a 10 1276 1308 1347 N
+ D L AA e n/a 10 1275 1307 1413 N
+ D L AA i n/a 10 1275 1307 1356 N
+ D L AA s n/a 10 1275 1307 1356 N
+ D L AE b n/a 10 1276 1308 1343 N
+ D L AE e n/a 10 1275 1307 1407 N
+ D L AE i n/a 10 1275 1307 1354 N
+ D L AE s n/a 10 1275 1307 1354 N
+ D L AH b n/a 10 1276 1308 1346 N
+ D L AH e n/a 10 1275 1307 1413 N
+ D L AH i n/a 10 1275 1307 1353 N
+ D L AH s n/a 10 1275 1307 1353 N
+ D L AO b n/a 10 1276 1308 1345 N
+ D L AO e n/a 10 1275 1307 1413 N
+ D L AO i n/a 10 1275 1307 1356 N
+ D L AO s n/a 10 1275 1307 1356 N
+ D L AW b n/a 10 1276 1308 1344 N
+ D L AW e n/a 10 1275 1307 1413 N
+ D L AW i n/a 10 1275 1307 1354 N
+ D L AW s n/a 10 1275 1307 1354 N
+ D L AY b n/a 10 1276 1308 1349 N
+ D L AY e n/a 10 1275 1307 1411 N
+ D L AY i n/a 10 1275 1307 1356 N
+ D L AY s n/a 10 1275 1307 1356 N
+ D L B b n/a 10 1276 1284 1398 N
+ D L B e n/a 10 1277 1284 1398 N
+ D L B i n/a 10 1277 1284 1398 N
+ D L B s n/a 10 1277 1284 1398 N
+ D L CH e n/a 10 1277 1283 1383 N
+ D L CH i n/a 10 1277 1283 1383 N
+ D L CH s n/a 10 1277 1283 1383 N
+ D L D b n/a 10 1276 1284 1398 N
+ D L D e n/a 10 1276 1284 1398 N
+ D L D s n/a 10 1276 1284 1398 N
+ D L DH e n/a 10 1276 1284 1398 N
+ D L DH s n/a 10 1276 1284 1398 N
+ D L EH b n/a 10 1276 1308 1343 N
+ D L EH e n/a 10 1275 1307 1405 N
+ D L EH i n/a 10 1275 1307 1354 N
+ D L EH s n/a 10 1275 1307 1354 N
+ D L ER b n/a 10 1276 1308 1350 N
+ D L ER e n/a 10 1275 1307 1413 N
+ D L ER i n/a 10 1275 1307 1359 N
+ D L ER s n/a 10 1275 1307 1359 N
+ D L EY b n/a 10 1276 1308 1343 N
+ D L EY e n/a 10 1275 1307 1405 N
+ D L EY i n/a 10 1275 1307 1354 N
+ D L EY s n/a 10 1275 1307 1354 N
+ D L F b n/a 10 1276 1283 1379 N
+ D L F e n/a 10 1277 1283 1379 N
+ D L F i n/a 10 1277 1283 1379 N
+ D L F s n/a 10 1277 1283 1379 N
+ D L G b n/a 10 1276 1283 1398 N
+ D L G e n/a 10 1277 1283 1398 N
+ D L G i n/a 10 1277 1283 1398 N
+ D L G s n/a 10 1277 1283 1398 N
+ D L HH b n/a 10 1276 1285 1386 N
+ D L HH e n/a 10 1277 1285 1386 N
+ D L HH i n/a 10 1277 1285 1386 N
+ D L HH s n/a 10 1277 1285 1386 N
+ D L IH b n/a 10 1276 1308 1366 N
+ D L IH e n/a 10 1275 1307 1414 N
+ D L IH i n/a 10 1275 1307 1362 N
+ D L IH s n/a 10 1275 1307 1366 N
+ D L IY b n/a 10 1276 1308 1367 N
+ D L IY e n/a 10 1275 1307 1411 N
+ D L IY i n/a 10 1275 1307 1370 N
+ D L IY s n/a 10 1275 1307 1367 N
+ D L JH e n/a 10 1276 1283 1398 N
+ D L JH s n/a 10 1276 1283 1398 N
+ D L K e n/a 10 1277 1283 1379 N
+ D L K i n/a 10 1277 1283 1379 N
+ D L K s n/a 10 1277 1283 1379 N
+ D L L b n/a 10 1276 1283 1345 N
+ D L L e n/a 10 1277 1283 1400 N
+ D L L i n/a 10 1277 1283 1353 N
+ D L L s n/a 10 1277 1283 1353 N
+ D L M b n/a 10 1276 1284 1398 N
+ D L M e n/a 10 1277 1284 1398 N
+ D L M i n/a 10 1277 1284 1398 N
+ D L M s n/a 10 1277 1284 1398 N
+ D L N b n/a 10 1276 1284 1398 N
+ D L N e n/a 10 1276 1284 1398 N
+ D L N i n/a 10 1276 1284 1398 N
+ D L N s n/a 10 1276 1284 1398 N
+ D L NG e n/a 10 1277 1283 1398 N
+ D L NG s n/a 10 1277 1283 1398 N
+ D L OW b n/a 10 1276 1308 1346 N
+ D L OW e n/a 10 1275 1307 1413 N
+ D L OW i n/a 10 1275 1307 1356 N
+ D L OW s n/a 10 1275 1307 1356 N
+ D L OY b n/a 10 1276 1308 1345 N
+ D L OY e n/a 10 1275 1307 1411 N
+ D L OY s n/a 10 1275 1307 1356 N
+ D L P e n/a 10 1277 1284 1379 N
+ D L P i n/a 10 1277 1284 1379 N
+ D L P s n/a 10 1277 1284 1379 N
+ D L R b n/a 10 1276 1283 1360 N
+ D L R e n/a 10 1277 1283 1401 N
+ D L R i n/a 10 1277 1283 1361 N
+ D L R s n/a 10 1277 1283 1361 N
+ D L S b n/a 10 1276 1284 1382 N
+ D L S e n/a 10 1277 1284 1382 N
+ D L S i n/a 10 1277 1284 1382 N
+ D L S s n/a 10 1277 1284 1382 N
+ D L SH e n/a 10 1277 1283 1383 N
+ D L SH i n/a 10 1277 1283 1383 N
+ D L SH s n/a 10 1277 1283 1383 N
+ D L SIL e n/a 10 1277 1285 1423 N
+ D L SIL s n/a 10 1277 1285 1423 N
+ D L T e n/a 10 1276 1284 1379 N
+ D L T i n/a 10 1276 1284 1379 N
+ D L T s n/a 10 1276 1284 1379 N
+ D L TH e n/a 10 1276 1284 1379 N
+ D L TH i n/a 10 1276 1284 1379 N
+ D L TH s n/a 10 1276 1284 1379 N
+ D L UH b n/a 10 1276 1308 1363 N
+ D L UH e n/a 10 1275 1307 1414 N
+ D L UH i n/a 10 1275 1307 1362 N
+ D L UH s n/a 10 1275 1307 1363 N
+ D L UW b n/a 10 1276 1308 1363 N
+ D L UW e n/a 10 1275 1307 1414 N
+ D L UW i n/a 10 1275 1307 1361 N
+ D L UW s n/a 10 1275 1307 1363 N
+ D L V b n/a 10 1276 1283 1397 N
+ D L V e n/a 10 1277 1283 1397 N
+ D L V i n/a 10 1277 1283 1397 N
+ D L V s n/a 10 1277 1283 1397 N
+ D L W b n/a 10 1276 1283 1345 N
+ D L W e n/a 10 1277 1283 1401 N
+ D L W i n/a 10 1277 1283 1353 N
+ D L W s n/a 10 1277 1283 1353 N
+ D L Y b n/a 10 1276 1283 1397 N
+ D L Y e n/a 10 1276 1283 1397 N
+ D L Y i n/a 10 1276 1283 1397 N
+ D L Y s n/a 10 1276 1283 1397 N
+ D L Z b n/a 10 1276 1284 1397 N
+ D L Z e n/a 10 1277 1284 1397 N
+ D L Z i n/a 10 1277 1284 1397 N
+ D L Z s n/a 10 1277 1284 1397 N
+ D L ZH e n/a 10 1276 1283 1397 N
+ D L ZH s n/a 10 1276 1283 1397 N
+ D M AA b n/a 10 1259 1303 1347 N
+ D M AA e n/a 10 1258 1303 1415 N
+ D M AA i n/a 10 1259 1304 1347 N
+ D M AA s n/a 10 1259 1303 1347 N
+ D M AE b n/a 10 1259 1303 1343 N
+ D M AE e n/a 10 1257 1303 1405 N
+ D M AE i n/a 10 1259 1303 1343 N
+ D M AE s n/a 10 1259 1303 1343 N
+ D M AH b n/a 10 1259 1303 1347 N
+ D M AH e n/a 10 1257 1303 1414 N
+ D M AH i n/a 10 1260 1304 1351 N
+ D M AH s n/a 10 1259 1303 1347 N
+ D M AO b n/a 10 1259 1303 1345 N
+ D M AO e n/a 10 1258 1303 1415 N
+ D M AO s n/a 10 1259 1303 1345 N
+ D M AW b n/a 10 1259 1303 1344 N
+ D M AW e n/a 10 1257 1303 1416 N
+ D M AW i n/a 10 1259 1303 1344 N
+ D M AW s n/a 10 1259 1303 1344 N
+ D M AY b n/a 10 1259 1303 1349 N
+ D M AY e n/a 10 1258 1303 1411 N
+ D M AY i n/a 10 1259 1304 1349 N
+ D M AY s n/a 10 1259 1303 1349 N
+ D M B b n/a 10 1266 1290 1399 N
+ D M B e n/a 10 1266 1290 1399 N
+ D M B i n/a 10 1266 1290 1399 N
+ D M B s n/a 10 1266 1290 1399 N
+ D M CH e n/a 10 1261 1281 1385 N
+ D M CH s n/a 10 1261 1281 1385 N
+ D M D b n/a 10 1267 1291 1399 N
+ D M D e n/a 10 1267 1291 1399 N
+ D M D s n/a 10 1267 1291 1399 N
+ D M DH e n/a 10 1265 1289 1399 N
+ D M DH s n/a 10 1265 1289 1399 N
+ D M EH b n/a 10 1259 1303 1343 N
+ D M EH e n/a 10 1257 1303 1405 N
+ D M EH i n/a 10 1259 1303 1343 N
+ D M EH s n/a 10 1259 1303 1343 N
+ D M ER b n/a 10 1259 1306 1350 N
+ D M ER e n/a 10 1258 1306 1415 N
+ D M ER i n/a 10 1260 1306 1357 N
+ D M ER s n/a 10 1259 1306 1357 N
+ D M EY b n/a 10 1259 1303 1343 N
+ D M EY e n/a 10 1257 1303 1405 N
+ D M EY i n/a 10 1259 1303 1343 N
+ D M EY s n/a 10 1259 1303 1343 N
+ D M F b n/a 10 1261 1278 1377 N
+ D M F e n/a 10 1261 1278 1377 N
+ D M F s n/a 10 1261 1278 1377 N
+ D M G b n/a 10 1267 1291 1399 N
+ D M G e n/a 10 1267 1291 1399 N
+ D M G s n/a 10 1267 1291 1399 N
+ D M HH b n/a 10 1259 1279 1389 N
+ D M HH e n/a 10 1257 1279 1389 N
+ D M HH s n/a 10 1259 1279 1389 N
+ D M IH b n/a 10 1259 1305 1366 N
+ D M IH e n/a 10 1257 1305 1408 N
+ D M IH i n/a 10 1260 1305 1371 N
+ D M IH s n/a 10 1259 1305 1366 N
+ D M IY b n/a 10 1259 1305 1367 N
+ D M IY e n/a 10 1257 1305 1408 N
+ D M IY i n/a 10 1259 1305 1370 N
+ D M IY s n/a 10 1259 1305 1367 N
+ D M JH e n/a 10 1266 1290 1399 N
+ D M JH s n/a 10 1266 1290 1399 N
+ D M K e n/a 10 1262 1280 1379 N
+ D M K s n/a 10 1262 1280 1379 N
+ D M L b n/a 10 1262 1294 1345 N
+ D M L e n/a 10 1268 1294 1400 N
+ D M L s n/a 10 1262 1294 1345 N
+ D M M b n/a 10 1265 1294 1399 N
+ D M M e n/a 10 1265 1296 1399 N
+ D M M s n/a 10 1265 1294 1399 N
+ D M N b n/a 10 1265 1294 1399 N
+ D M N e n/a 10 1265 1296 1399 N
+ D M N s n/a 10 1265 1294 1399 N
+ D M NG e n/a 10 1265 1296 1399 N
+ D M NG s n/a 10 1265 1294 1399 N
+ D M OW b n/a 10 1259 1303 1346 N
+ D M OW e n/a 10 1258 1303 1415 N
+ D M OW s n/a 10 1259 1303 1346 N
+ D M OY b n/a 10 1259 1303 1345 N
+ D M OY e n/a 10 1258 1303 1411 N
+ D M OY s n/a 10 1259 1303 1345 N
+ D M P e n/a 10 1262 1280 1379 N
+ D M P s n/a 10 1262 1280 1379 N
+ D M R b n/a 10 1261 1296 1360 N
+ D M R e n/a 10 1268 1294 1401 N
+ D M R i n/a 10 1261 1296 1361 N
+ D M R s n/a 10 1261 1296 1361 N
+ D M S b n/a 10 1261 1278 1385 N
+ D M S e n/a 10 1261 1278 1385 N
+ D M S s n/a 10 1261 1278 1385 N
+ D M SH e n/a 10 1261 1278 1385 N
+ D M SH s n/a 10 1261 1278 1385 N
+ D M SIL e n/a 10 1263 1288 1421 N
+ D M SIL s n/a 10 1263 1288 1421 N
+ D M T e n/a 10 1262 1281 1378 N
+ D M T s n/a 10 1262 1281 1378 N
+ D M TH e n/a 10 1261 1278 1377 N
+ D M TH s n/a 10 1261 1278 1377 N
+ D M UH b n/a 10 1259 1305 1366 N
+ D M UH e n/a 10 1258 1305 1408 N
+ D M UH i n/a 10 1259 1305 1366 N
+ D M UH s n/a 10 1259 1305 1366 N
+ D M UW b n/a 10 1259 1305 1366 N
+ D M UW e n/a 10 1258 1305 1408 N
+ D M UW i n/a 10 1259 1305 1366 N
+ D M UW s n/a 10 1259 1305 1366 N
+ D M V b n/a 10 1267 1291 1399 N
+ D M V e n/a 10 1267 1291 1399 N
+ D M V i n/a 10 1267 1291 1399 N
+ D M V s n/a 10 1267 1291 1399 N
+ D M W b n/a 10 1262 1294 1345 N
+ D M W e n/a 10 1268 1296 1400 N
+ D M W s n/a 10 1262 1294 1345 N
+ D M Y b n/a 10 1266 1290 1399 N
+ D M Y e n/a 10 1266 1290 1399 N
+ D M Y s n/a 10 1266 1290 1399 N
+ D M Z b n/a 10 1266 1290 1399 N
+ D M Z e n/a 10 1266 1290 1399 N
+ D M Z i n/a 10 1266 1290 1399 N
+ D M Z s n/a 10 1266 1290 1399 N
+ D M ZH e n/a 10 1266 1291 1399 N
+ D M ZH s n/a 10 1266 1291 1399 N
+ D N AA b n/a 10 1259 1304 1349 N
+ D N AA e n/a 10 1258 1302 1412 N
+ D N AA i n/a 10 1259 1304 1349 N
+ D N AA s n/a 10 1259 1304 1349 N
+ D N AE b n/a 10 1259 1303 1343 N
+ D N AE e n/a 10 1256 1301 1406 N
+ D N AE i n/a 10 1259 1303 1343 N
+ D N AE s n/a 10 1259 1303 1343 N
+ D N AH b n/a 10 1259 1303 1347 N
+ D N AH e n/a 10 1256 1301 1417 N
+ D N AH i n/a 10 1260 1304 1351 N
+ D N AH s n/a 10 1259 1303 1347 N
+ D N AO b n/a 10 1259 1304 1345 N
+ D N AO e n/a 10 1258 1302 1412 N
+ D N AO i n/a 10 1259 1304 1345 N
+ D N AO s n/a 10 1259 1304 1345 N
+ D N AW b n/a 10 1259 1303 1344 N
+ D N AW e n/a 10 1256 1301 1416 N
+ D N AW i n/a 10 1259 1303 1344 N
+ D N AW s n/a 10 1259 1303 1344 N
+ D N AY b n/a 10 1259 1304 1349 N
+ D N AY e n/a 10 1258 1302 1411 N
+ D N AY i n/a 10 1259 1304 1349 N
+ D N AY s n/a 10 1259 1304 1349 N
+ D N B b n/a 10 1267 1291 1390 N
+ D N B e n/a 10 1267 1291 1390 N
+ D N B i n/a 10 1267 1291 1390 N
+ D N B s n/a 10 1267 1291 1390 N
+ D N CH e n/a 10 1261 1281 1385 N
+ D N CH i n/a 10 1261 1281 1385 N
+ D N CH s n/a 10 1261 1281 1385 N
+ D N D b n/a 10 1267 1291 1390 N
+ D N D e n/a 10 1267 1291 1390 N
+ D N D s n/a 10 1267 1291 1390 N
+ D N DH e n/a 10 1265 1289 1393 N
+ D N DH i n/a 10 1265 1289 1393 N
+ D N DH s n/a 10 1265 1289 1393 N
+ D N EH b n/a 10 1259 1303 1343 N
+ D N EH e n/a 10 1256 1301 1405 N
+ D N EH i n/a 10 1259 1303 1343 N
+ D N EH s n/a 10 1259 1303 1343 N
+ D N ER b n/a 10 1259 1306 1350 N
+ D N ER e n/a 10 1258 1302 1415 N
+ D N ER i n/a 10 1260 1306 1358 N
+ D N ER s n/a 10 1259 1306 1358 N
+ D N EY b n/a 10 1259 1303 1343 N
+ D N EY e n/a 10 1256 1300 1405 N
+ D N EY i n/a 10 1259 1303 1343 N
+ D N EY s n/a 10 1259 1303 1343 N
+ D N F b n/a 10 1261 1278 1377 N
+ D N F e n/a 10 1261 1278 1377 N
+ D N F i n/a 10 1261 1278 1377 N
+ D N F s n/a 10 1261 1278 1377 N
+ D N G b n/a 10 1267 1291 1390 N
+ D N G e n/a 10 1267 1291 1390 N
+ D N G i n/a 10 1267 1291 1390 N
+ D N G s n/a 10 1267 1291 1390 N
+ D N HH b n/a 10 1259 1279 1387 N
+ D N HH e n/a 10 1257 1279 1387 N
+ D N HH i n/a 10 1259 1279 1387 N
+ D N HH s n/a 10 1259 1279 1387 N
+ D N IH b n/a 10 1259 1305 1366 N
+ D N IH e n/a 10 1256 1300 1409 N
+ D N IH i n/a 10 1260 1305 1372 N
+ D N IH s n/a 10 1259 1305 1366 N
+ D N IY b n/a 10 1259 1305 1367 N
+ D N IY e n/a 10 1257 1300 1410 N
+ D N IY i n/a 10 1259 1305 1371 N
+ D N IY s n/a 10 1259 1305 1367 N
+ D N JH e n/a 10 1266 1290 1391 N
+ D N JH s n/a 10 1266 1290 1391 N
+ D N K e n/a 10 1262 1280 1381 N
+ D N K i n/a 10 1262 1280 1381 N
+ D N K s n/a 10 1262 1280 1381 N
+ D N L b n/a 10 1262 1294 1345 N
+ D N L e n/a 10 1268 1294 1403 N
+ D N L i n/a 10 1262 1294 1350 N
+ D N L s n/a 10 1262 1294 1345 N
+ D N M b n/a 10 1265 1293 1402 N
+ D N M e n/a 10 1264 1293 1402 N
+ D N M i n/a 10 1265 1293 1402 N
+ D N M s n/a 10 1265 1293 1402 N
+ D N N b n/a 10 1264 1293 1402 N
+ D N N e n/a 10 1264 1293 1402 N
+ D N N i n/a 10 1264 1293 1402 N
+ D N N s n/a 10 1264 1293 1402 N
+ D N NG e n/a 10 1264 1293 1402 N
+ D N NG s n/a 10 1265 1293 1402 N
+ D N OW b n/a 10 1259 1304 1346 N
+ D N OW e n/a 10 1258 1302 1412 N
+ D N OW i n/a 10 1259 1304 1349 N
+ D N OW s n/a 10 1259 1304 1346 N
+ D N OY b n/a 10 1259 1304 1345 N
+ D N OY e n/a 10 1258 1302 1411 N
+ D N OY i n/a 10 1259 1304 1345 N
+ D N OY s n/a 10 1259 1304 1345 N
+ D N P e n/a 10 1262 1280 1381 N
+ D N P i n/a 10 1262 1280 1381 N
+ D N P s n/a 10 1262 1280 1381 N
+ D N R b n/a 10 1261 1296 1360 N
+ D N R e n/a 10 1268 1294 1404 N
+ D N R i n/a 10 1261 1296 1361 N
+ D N R s n/a 10 1261 1296 1361 N
+ D N S b n/a 10 1261 1278 1384 N
+ D N S e n/a 10 1261 1278 1384 N
+ D N S i n/a 10 1261 1278 1384 N
+ D N S s n/a 10 1261 1278 1384 N
+ D N SH e n/a 10 1261 1278 1385 N
+ D N SH i n/a 10 1261 1278 1385 N
+ D N SH s n/a 10 1261 1278 1385 N
+ D N SIL e n/a 10 1263 1288 1422 N
+ D N SIL s n/a 10 1263 1288 1422 N
+ D N T e n/a 10 1262 1281 1378 N
+ D N T i n/a 10 1262 1281 1378 N
+ D N T s n/a 10 1262 1281 1378 N
+ D N TH e n/a 10 1261 1278 1377 N
+ D N TH i n/a 10 1261 1278 1377 N
+ D N TH s n/a 10 1261 1278 1377 N
+ D N UH b n/a 10 1259 1305 1365 N
+ D N UH e n/a 10 1258 1302 1409 N
+ D N UH i n/a 10 1259 1305 1365 N
+ D N UH s n/a 10 1259 1305 1365 N
+ D N UW b n/a 10 1259 1305 1365 N
+ D N UW e n/a 10 1258 1302 1409 N
+ D N UW i n/a 10 1259 1305 1365 N
+ D N UW s n/a 10 1259 1305 1365 N
+ D N V b n/a 10 1267 1291 1390 N
+ D N V e n/a 10 1267 1291 1390 N
+ D N V i n/a 10 1267 1291 1391 N
+ D N V s n/a 10 1267 1291 1390 N
+ D N W b n/a 10 1262 1294 1345 N
+ D N W e n/a 10 1268 1294 1403 N
+ D N W i n/a 10 1262 1294 1350 N
+ D N W s n/a 10 1262 1294 1345 N
+ D N Y b n/a 10 1266 1290 1391 N
+ D N Y e n/a 10 1266 1290 1391 N
+ D N Y i n/a 10 1266 1290 1391 N
+ D N Y s n/a 10 1266 1290 1391 N
+ D N Z b n/a 10 1266 1290 1390 N
+ D N Z e n/a 10 1266 1290 1390 N
+ D N Z i n/a 10 1266 1290 1392 N
+ D N Z s n/a 10 1266 1290 1390 N
+ D N ZH e n/a 10 1266 1291 1391 N
+ D N ZH s n/a 10 1266 1291 1391 N
+ D NG AA b n/a 10 1259 1303 1347 N
+ D NG AA e n/a 10 1258 1303 1415 N
+ D NG AA i n/a 10 1259 1304 1347 N
+ D NG AA s n/a 10 1259 1303 1347 N
+ D NG AE b n/a 10 1259 1303 1343 N
+ D NG AE e n/a 10 1257 1303 1405 N
+ D NG AE s n/a 10 1259 1303 1343 N
+ D NG AH b n/a 10 1259 1303 1347 N
+ D NG AH e n/a 10 1257 1303 1414 N
+ D NG AH i n/a 10 1260 1304 1351 N
+ D NG AH s n/a 10 1259 1303 1347 N
+ D NG AO b n/a 10 1259 1303 1345 N
+ D NG AO e n/a 10 1258 1303 1415 N
+ D NG AO i n/a 10 1259 1304 1345 N
+ D NG AO s n/a 10 1259 1303 1345 N
+ D NG AW b n/a 10 1259 1303 1344 N
+ D NG AW e n/a 10 1257 1303 1416 N
+ D NG AW i n/a 10 1259 1303 1344 N
+ D NG AW s n/a 10 1259 1303 1344 N
+ D NG AY b n/a 10 1259 1303 1349 N
+ D NG AY e n/a 10 1258 1303 1411 N
+ D NG AY s n/a 10 1259 1303 1349 N
+ D NG B b n/a 10 1266 1290 1399 N
+ D NG B e n/a 10 1266 1290 1399 N
+ D NG B s n/a 10 1266 1290 1399 N
+ D NG CH e n/a 10 1261 1281 1385 N
+ D NG CH s n/a 10 1261 1281 1385 N
+ D NG D b n/a 10 1267 1291 1399 N
+ D NG D e n/a 10 1267 1291 1399 N
+ D NG D s n/a 10 1267 1291 1399 N
+ D NG DH e n/a 10 1265 1289 1399 N
+ D NG DH s n/a 10 1265 1289 1399 N
+ D NG EH b n/a 10 1259 1303 1343 N
+ D NG EH e n/a 10 1257 1303 1405 N
+ D NG EH i n/a 10 1259 1303 1343 N
+ D NG EH s n/a 10 1259 1303 1343 N
+ D NG ER b n/a 10 1259 1306 1350 N
+ D NG ER e n/a 10 1258 1306 1415 N
+ D NG ER s n/a 10 1259 1306 1357 N
+ D NG EY b n/a 10 1259 1303 1343 N
+ D NG EY e n/a 10 1257 1303 1405 N
+ D NG EY i n/a 10 1259 1303 1343 N
+ D NG EY s n/a 10 1259 1303 1343 N
+ D NG F b n/a 10 1261 1278 1377 N
+ D NG F e n/a 10 1261 1278 1377 N
+ D NG F s n/a 10 1261 1278 1377 N
+ D NG G b n/a 10 1267 1291 1399 N
+ D NG G e n/a 10 1267 1291 1399 N
+ D NG G s n/a 10 1267 1291 1399 N
+ D NG HH b n/a 10 1259 1279 1389 N
+ D NG HH e n/a 10 1257 1279 1389 N
+ D NG HH s n/a 10 1259 1279 1389 N
+ D NG IH b n/a 10 1259 1305 1366 N
+ D NG IH e n/a 10 1257 1305 1408 N
+ D NG IH i n/a 10 1260 1305 1372 N
+ D NG IH s n/a 10 1259 1305 1366 N
+ D NG IY b n/a 10 1259 1305 1367 N
+ D NG IY e n/a 10 1257 1305 1408 N
+ D NG IY i n/a 10 1259 1305 1370 N
+ D NG IY s n/a 10 1259 1305 1367 N
+ D NG JH e n/a 10 1266 1290 1399 N
+ D NG JH s n/a 10 1266 1290 1399 N
+ D NG K e n/a 10 1262 1280 1379 N
+ D NG K s n/a 10 1262 1280 1379 N
+ D NG L b n/a 10 1262 1294 1345 N
+ D NG L e n/a 10 1268 1294 1400 N
+ D NG L s n/a 10 1262 1294 1345 N
+ D NG M b n/a 10 1265 1294 1399 N
+ D NG M e n/a 10 1265 1296 1399 N
+ D NG M s n/a 10 1265 1294 1399 N
+ D NG N b n/a 10 1265 1294 1399 N
+ D NG N e n/a 10 1265 1296 1399 N
+ D NG N s n/a 10 1265 1294 1399 N
+ D NG NG e n/a 10 1265 1296 1399 N
+ D NG NG s n/a 10 1265 1294 1399 N
+ D NG OW b n/a 10 1259 1303 1346 N
+ D NG OW e n/a 10 1258 1303 1415 N
+ D NG OW s n/a 10 1259 1303 1346 N
+ D NG OY b n/a 10 1259 1303 1345 N
+ D NG OY e n/a 10 1258 1303 1411 N
+ D NG OY s n/a 10 1259 1303 1345 N
+ D NG P e n/a 10 1262 1280 1379 N
+ D NG P s n/a 10 1262 1280 1379 N
+ D NG R b n/a 10 1261 1296 1360 N
+ D NG R e n/a 10 1268 1294 1401 N
+ D NG R s n/a 10 1261 1296 1361 N
+ D NG S b n/a 10 1261 1278 1385 N
+ D NG S e n/a 10 1261 1278 1385 N
+ D NG S s n/a 10 1261 1278 1385 N
+ D NG SH e n/a 10 1261 1278 1385 N
+ D NG SH s n/a 10 1261 1278 1385 N
+ D NG SIL e n/a 10 1263 1288 1421 N
+ D NG SIL s n/a 10 1263 1288 1421 N
+ D NG T e n/a 10 1262 1281 1378 N
+ D NG T s n/a 10 1262 1281 1378 N
+ D NG TH e n/a 10 1261 1278 1377 N
+ D NG TH s n/a 10 1261 1278 1377 N
+ D NG UH b n/a 10 1259 1305 1366 N
+ D NG UH e n/a 10 1258 1305 1408 N
+ D NG UH s n/a 10 1259 1305 1366 N
+ D NG UW b n/a 10 1259 1305 1366 N
+ D NG UW e n/a 10 1258 1305 1408 N
+ D NG UW i n/a 10 1259 1305 1366 N
+ D NG UW s n/a 10 1259 1305 1366 N
+ D NG V b n/a 10 1267 1291 1399 N
+ D NG V e n/a 10 1267 1291 1399 N
+ D NG V s n/a 10 1267 1291 1399 N
+ D NG W b n/a 10 1262 1294 1345 N
+ D NG W e n/a 10 1268 1296 1400 N
+ D NG W s n/a 10 1262 1294 1345 N
+ D NG Y b n/a 10 1266 1290 1399 N
+ D NG Y e n/a 10 1266 1290 1399 N
+ D NG Y s n/a 10 1266 1290 1399 N
+ D NG Z b n/a 10 1266 1290 1399 N
+ D NG Z e n/a 10 1266 1290 1399 N
+ D NG Z s n/a 10 1266 1290 1399 N
+ D NG ZH e n/a 10 1266 1291 1399 N
+ D NG ZH s n/a 10 1266 1291 1399 N
+ D OW AA b n/a 10 1245 1335 1347 N
+ D OW AA e n/a 10 1232 1320 1415 N
+ D OW AA i n/a 10 1232 1320 1356 N
+ D OW AA s n/a 10 1232 1320 1356 N
+ D OW AE b n/a 10 1245 1335 1343 N
+ D OW AE e n/a 10 1232 1320 1406 N
+ D OW AE i n/a 10 1232 1320 1354 N
+ D OW AE s n/a 10 1232 1320 1354 N
+ D OW AH b n/a 10 1245 1336 1346 N
+ D OW AH e n/a 10 1232 1320 1407 N
+ D OW AH i n/a 10 1232 1320 1355 N
+ D OW AH s n/a 10 1232 1320 1355 N
+ D OW AO b n/a 10 1245 1335 1345 N
+ D OW AO e n/a 10 1232 1320 1415 N
+ D OW AO i n/a 10 1232 1320 1356 N
+ D OW AO s n/a 10 1232 1320 1356 N
+ D OW AW b n/a 10 1245 1335 1344 N
+ D OW AW e n/a 10 1232 1320 1416 N
+ D OW AW i n/a 10 1232 1320 1354 N
+ D OW AW s n/a 10 1232 1320 1354 N
+ D OW AY b n/a 10 1245 1335 1349 N
+ D OW AY e n/a 10 1232 1320 1411 N
+ D OW AY i n/a 10 1232 1320 1356 N
+ D OW AY s n/a 10 1232 1320 1356 N
+ D OW B b n/a 10 1245 1318 1394 N
+ D OW B e n/a 10 1232 1318 1394 N
+ D OW B i n/a 10 1232 1318 1394 N
+ D OW B s n/a 10 1232 1318 1394 N
+ D OW CH e n/a 10 1232 1318 1374 N
+ D OW CH s n/a 10 1232 1318 1374 N
+ D OW D b n/a 10 1245 1318 1394 N
+ D OW D e n/a 10 1232 1318 1394 N
+ D OW D s n/a 10 1232 1318 1394 N
+ D OW DH e n/a 10 1232 1318 1376 N
+ D OW DH s n/a 10 1232 1318 1376 N
+ D OW EH b n/a 10 1245 1336 1343 N
+ D OW EH e n/a 10 1232 1320 1405 N
+ D OW EH i n/a 10 1232 1320 1354 N
+ D OW EH s n/a 10 1232 1320 1354 N
+ D OW ER b n/a 10 1245 1336 1350 N
+ D OW ER e n/a 10 1232 1320 1415 N
+ D OW ER i n/a 10 1232 1320 1357 N
+ D OW ER s n/a 10 1232 1320 1357 N
+ D OW EY b n/a 10 1245 1336 1343 N
+ D OW EY e n/a 10 1232 1320 1405 N
+ D OW EY i n/a 10 1232 1320 1354 N
+ D OW EY s n/a 10 1232 1320 1354 N
+ D OW F b n/a 10 1245 1319 1377 N
+ D OW F e n/a 10 1232 1319 1377 N
+ D OW F s n/a 10 1232 1319 1377 N
+ D OW G b n/a 10 1245 1318 1395 N
+ D OW G e n/a 10 1232 1318 1395 N
+ D OW G s n/a 10 1232 1318 1395 N
+ D OW HH b n/a 10 1245 1336 1388 N
+ D OW HH e n/a 10 1232 1334 1388 N
+ D OW HH i n/a 10 1232 1334 1388 N
+ D OW HH s n/a 10 1232 1334 1388 N
+ D OW IH b n/a 10 1245 1336 1366 N
+ D OW IH e n/a 10 1232 1329 1410 N
+ D OW IH i n/a 10 1232 1329 1370 N
+ D OW IH s n/a 10 1232 1329 1366 N
+ D OW IY b n/a 10 1245 1336 1367 N
+ D OW IY e n/a 10 1232 1329 1410 N
+ D OW IY i n/a 10 1232 1329 1370 N
+ D OW IY s n/a 10 1232 1329 1367 N
+ D OW JH e n/a 10 1232 1318 1374 N
+ D OW JH s n/a 10 1232 1318 1374 N
+ D OW K e n/a 10 1232 1318 1380 N
+ D OW K i n/a 10 1232 1318 1380 N
+ D OW K s n/a 10 1232 1318 1380 N
+ D OW L b n/a 10 1245 1336 1345 N
+ D OW L e n/a 10 1232 1333 1400 N
+ D OW L i n/a 10 1232 1333 1353 N
+ D OW L s n/a 10 1232 1333 1353 N
+ D OW M b n/a 10 1245 1318 1396 N
+ D OW M e n/a 10 1232 1318 1396 N
+ D OW M i n/a 10 1232 1318 1396 N
+ D OW M s n/a 10 1232 1318 1396 N
+ D OW N b n/a 10 1245 1318 1396 N
+ D OW N e n/a 10 1232 1318 1396 N
+ D OW N i n/a 10 1232 1318 1396 N
+ D OW N s n/a 10 1232 1318 1396 N
+ D OW NG e n/a 10 1232 1318 1396 N
+ D OW NG s n/a 10 1232 1318 1396 N
+ D OW OW b n/a 10 1245 1336 1346 N
+ D OW OW e n/a 10 1232 1320 1415 N
+ D OW OW i n/a 10 1232 1320 1356 N
+ D OW OW s n/a 10 1232 1320 1356 N
+ D OW OY b n/a 10 1245 1335 1345 N
+ D OW OY e n/a 10 1232 1320 1411 N
+ D OW OY i n/a 10 1232 1320 1356 N
+ D OW OY s n/a 10 1232 1320 1356 N
+ D OW P e n/a 10 1232 1318 1375 N
+ D OW P s n/a 10 1232 1318 1375 N
+ D OW R b n/a 10 1245 1336 1360 N
+ D OW R e n/a 10 1232 1332 1401 N
+ D OW R i n/a 10 1232 1333 1361 N
+ D OW R s n/a 10 1232 1332 1361 N
+ D OW S b n/a 10 1245 1319 1382 N
+ D OW S e n/a 10 1232 1319 1382 N
+ D OW S i n/a 10 1232 1319 1382 N
+ D OW S s n/a 10 1232 1319 1382 N
+ D OW SH e n/a 10 1232 1319 1383 N
+ D OW SH i n/a 10 1232 1319 1383 N
+ D OW SH s n/a 10 1232 1319 1383 N
+ D OW SIL e n/a 10 1232 1341 1418 N
+ D OW SIL s n/a 10 1232 1336 1418 N
+ D OW T e n/a 10 1232 1318 1374 N
+ D OW T s n/a 10 1232 1318 1374 N
+ D OW TH e n/a 10 1232 1319 1380 N
+ D OW TH s n/a 10 1232 1319 1380 N
+ D OW UH b n/a 10 1245 1336 1363 N
+ D OW UH e n/a 10 1232 1329 1410 N
+ D OW UH s n/a 10 1232 1329 1363 N
+ D OW UW b n/a 10 1245 1336 1363 N
+ D OW UW e n/a 10 1232 1329 1410 N
+ D OW UW i n/a 10 1232 1329 1363 N
+ D OW UW s n/a 10 1232 1329 1363 N
+ D OW V b n/a 10 1245 1318 1380 N
+ D OW V e n/a 10 1232 1318 1380 N
+ D OW V s n/a 10 1232 1318 1380 N
+ D OW W b n/a 10 1245 1336 1345 N
+ D OW W e n/a 10 1232 1332 1401 N
+ D OW W i n/a 10 1232 1332 1353 N
+ D OW W s n/a 10 1232 1332 1353 N
+ D OW Y b n/a 10 1245 1318 1383 N
+ D OW Y e n/a 10 1232 1318 1383 N
+ D OW Y i n/a 10 1232 1318 1383 N
+ D OW Y s n/a 10 1232 1318 1383 N
+ D OW Z b n/a 10 1245 1318 1382 N
+ D OW Z e n/a 10 1232 1318 1382 N
+ D OW Z i n/a 10 1232 1318 1382 N
+ D OW Z s n/a 10 1232 1318 1382 N
+ D OW ZH e n/a 10 1232 1318 1383 N
+ D OW ZH s n/a 10 1232 1318 1383 N
+ D OY AA b n/a 10 1255 1340 1347 N
+ D OY AA e n/a 10 1254 1322 1415 N
+ D OY AA s n/a 10 1255 1322 1356 N
+ D OY AE b n/a 10 1255 1340 1343 N
+ D OY AE e n/a 10 1254 1322 1406 N
+ D OY AE s n/a 10 1255 1322 1354 N
+ D OY AH b n/a 10 1255 1340 1346 N
+ D OY AH e n/a 10 1254 1322 1407 N
+ D OY AH i n/a 10 1254 1322 1355 N
+ D OY AH s n/a 10 1255 1322 1355 N
+ D OY AO b n/a 10 1255 1340 1345 N
+ D OY AO e n/a 10 1254 1322 1415 N
+ D OY AO s n/a 10 1255 1322 1356 N
+ D OY AW b n/a 10 1255 1340 1344 N
+ D OY AW e n/a 10 1254 1322 1416 N
+ D OY AW s n/a 10 1255 1322 1354 N
+ D OY AY b n/a 10 1255 1340 1349 N
+ D OY AY e n/a 10 1254 1322 1411 N
+ D OY AY i n/a 10 1255 1322 1356 N
+ D OY AY s n/a 10 1255 1322 1356 N
+ D OY B b n/a 10 1254 1311 1395 N
+ D OY B e n/a 10 1254 1311 1395 N
+ D OY B s n/a 10 1254 1311 1395 N
+ D OY CH e n/a 10 1254 1311 1373 N
+ D OY CH s n/a 10 1254 1311 1373 N
+ D OY D b n/a 10 1254 1311 1395 N
+ D OY D e n/a 10 1254 1311 1395 N
+ D OY D s n/a 10 1254 1311 1395 N
+ D OY DH e n/a 10 1254 1311 1376 N
+ D OY DH s n/a 10 1254 1311 1376 N
+ D OY EH b n/a 10 1255 1340 1343 N
+ D OY EH e n/a 10 1254 1322 1405 N
+ D OY EH s n/a 10 1255 1322 1354 N
+ D OY ER b n/a 10 1255 1340 1350 N
+ D OY ER e n/a 10 1254 1322 1415 N
+ D OY ER i n/a 10 1254 1322 1357 N
+ D OY ER s n/a 10 1255 1322 1357 N
+ D OY EY b n/a 10 1255 1340 1343 N
+ D OY EY e n/a 10 1254 1322 1405 N
+ D OY EY s n/a 10 1255 1322 1354 N
+ D OY F b n/a 10 1254 1319 1377 N
+ D OY F e n/a 10 1254 1319 1377 N
+ D OY F s n/a 10 1254 1319 1377 N
+ D OY G b n/a 10 1254 1311 1395 N
+ D OY G e n/a 10 1254 1311 1395 N
+ D OY G s n/a 10 1254 1311 1395 N
+ D OY HH b n/a 10 1253 1340 1388 N
+ D OY HH e n/a 10 1253 1334 1388 N
+ D OY HH s n/a 10 1253 1334 1388 N
+ D OY IH b n/a 10 1255 1340 1367 N
+ D OY IH e n/a 10 1254 1328 1410 N
+ D OY IH i n/a 10 1254 1328 1370 N
+ D OY IH s n/a 10 1255 1328 1367 N
+ D OY IY b n/a 10 1255 1340 1367 N
+ D OY IY e n/a 10 1254 1327 1410 N
+ D OY IY i n/a 10 1255 1327 1367 N
+ D OY IY s n/a 10 1255 1327 1367 N
+ D OY JH e n/a 10 1254 1311 1373 N
+ D OY JH s n/a 10 1254 1311 1373 N
+ D OY K e n/a 10 1254 1311 1380 N
+ D OY K s n/a 10 1254 1311 1380 N
+ D OY L b n/a 10 1253 1340 1345 N
+ D OY L e n/a 10 1253 1333 1400 N
+ D OY L s n/a 10 1253 1333 1353 N
+ D OY M b n/a 10 1254 1311 1396 N
+ D OY M e n/a 10 1254 1311 1396 N
+ D OY M s n/a 10 1254 1311 1396 N
+ D OY N b n/a 10 1254 1311 1396 N
+ D OY N e n/a 10 1254 1311 1396 N
+ D OY N s n/a 10 1254 1311 1396 N
+ D OY NG e n/a 10 1254 1311 1396 N
+ D OY NG s n/a 10 1254 1311 1396 N
+ D OY OW b n/a 10 1255 1340 1346 N
+ D OY OW e n/a 10 1254 1322 1415 N
+ D OY OW i n/a 10 1255 1322 1356 N
+ D OY OW s n/a 10 1255 1322 1356 N
+ D OY OY b n/a 10 1255 1340 1345 N
+ D OY OY e n/a 10 1254 1322 1411 N
+ D OY OY s n/a 10 1255 1322 1356 N
+ D OY P e n/a 10 1254 1311 1375 N
+ D OY P s n/a 10 1254 1311 1375 N
+ D OY R b n/a 10 1254 1340 1360 N
+ D OY R e n/a 10 1254 1332 1401 N
+ D OY R s n/a 10 1254 1332 1361 N
+ D OY S b n/a 10 1254 1319 1382 N
+ D OY S e n/a 10 1254 1319 1382 N
+ D OY S i n/a 10 1254 1319 1382 N
+ D OY S s n/a 10 1254 1319 1382 N
+ D OY SH e n/a 10 1254 1319 1383 N
+ D OY SH s n/a 10 1254 1319 1383 N
+ D OY SIL e n/a 10 1254 1340 1418 N
+ D OY SIL s n/a 10 1254 1340 1418 N
+ D OY T e n/a 10 1254 1311 1373 N
+ D OY T s n/a 10 1254 1311 1373 N
+ D OY TH e n/a 10 1254 1319 1380 N
+ D OY TH s n/a 10 1254 1319 1380 N
+ D OY UH b n/a 10 1255 1340 1367 N
+ D OY UH e n/a 10 1254 1328 1410 N
+ D OY UH s n/a 10 1255 1328 1367 N
+ D OY UW b n/a 10 1255 1340 1367 N
+ D OY UW e n/a 10 1254 1328 1410 N
+ D OY UW s n/a 10 1255 1328 1367 N
+ D OY V b n/a 10 1254 1311 1380 N
+ D OY V e n/a 10 1254 1311 1380 N
+ D OY V s n/a 10 1254 1311 1380 N
+ D OY W b n/a 10 1253 1340 1345 N
+ D OY W e n/a 10 1253 1332 1401 N
+ D OY W s n/a 10 1253 1332 1353 N
+ D OY Y b n/a 10 1254 1311 1383 N
+ D OY Y e n/a 10 1254 1311 1383 N
+ D OY Y s n/a 10 1254 1311 1383 N
+ D OY Z b n/a 10 1254 1311 1382 N
+ D OY Z e n/a 10 1254 1311 1382 N
+ D OY Z i n/a 10 1254 1311 1382 N
+ D OY Z s n/a 10 1254 1311 1382 N
+ D OY ZH e n/a 10 1254 1311 1383 N
+ D OY ZH s n/a 10 1254 1311 1383 N
+ D P AA b n/a 10 1270 1297 1347 N
+ D P AA e n/a 10 1270 1297 1415 N
+ D P AA i n/a 10 1270 1297 1347 N
+ D P AA s n/a 10 1270 1297 1347 N
+ D P AE b n/a 10 1270 1297 1342 N
+ D P AE e n/a 10 1270 1297 1405 N
+ D P AE i n/a 10 1270 1297 1342 N
+ D P AE s n/a 10 1270 1297 1342 N
+ D P AH b n/a 10 1270 1297 1347 N
+ D P AH e n/a 10 1270 1297 1414 N
+ D P AH i n/a 10 1270 1297 1350 N
+ D P AH s n/a 10 1270 1297 1347 N
+ D P AO b n/a 10 1270 1297 1345 N
+ D P AO e n/a 10 1270 1297 1415 N
+ D P AO i n/a 10 1270 1297 1345 N
+ D P AO s n/a 10 1270 1297 1345 N
+ D P AW b n/a 10 1270 1297 1344 N
+ D P AW e n/a 10 1270 1297 1416 N
+ D P AW i n/a 10 1270 1297 1344 N
+ D P AW s n/a 10 1270 1297 1344 N
+ D P AY b n/a 10 1270 1297 1349 N
+ D P AY e n/a 10 1270 1297 1411 N
+ D P AY i n/a 10 1270 1297 1349 N
+ D P AY s n/a 10 1270 1297 1349 N
+ D P B b n/a 10 1270 1287 1399 N
+ D P B e n/a 10 1270 1287 1399 N
+ D P B s n/a 10 1270 1287 1399 N
+ D P CH e n/a 10 1270 1286 1385 N
+ D P CH s n/a 10 1270 1286 1385 N
+ D P D b n/a 10 1270 1287 1399 N
+ D P D e n/a 10 1270 1287 1399 N
+ D P D s n/a 10 1270 1287 1399 N
+ D P DH e n/a 10 1270 1287 1399 N
+ D P DH s n/a 10 1270 1287 1399 N
+ D P EH b n/a 10 1270 1297 1342 N
+ D P EH e n/a 10 1270 1297 1405 N
+ D P EH i n/a 10 1270 1297 1342 N
+ D P EH s n/a 10 1270 1297 1342 N
+ D P ER b n/a 10 1270 1297 1350 N
+ D P ER e n/a 10 1270 1297 1415 N
+ D P ER i n/a 10 1270 1297 1357 N
+ D P ER s n/a 10 1270 1297 1357 N
+ D P EY b n/a 10 1270 1297 1342 N
+ D P EY e n/a 10 1270 1297 1405 N
+ D P EY i n/a 10 1270 1297 1342 N
+ D P EY s n/a 10 1270 1297 1342 N
+ D P F b n/a 10 1270 1286 1379 N
+ D P F e n/a 10 1270 1286 1379 N
+ D P F i n/a 10 1270 1286 1379 N
+ D P F s n/a 10 1270 1286 1379 N
+ D P G b n/a 10 1270 1287 1399 N
+ D P G e n/a 10 1270 1287 1399 N
+ D P G s n/a 10 1270 1287 1399 N
+ D P HH b n/a 10 1270 1286 1389 N
+ D P HH e n/a 10 1270 1286 1389 N
+ D P HH s n/a 10 1270 1286 1389 N
+ D P IH b n/a 10 1270 1298 1364 N
+ D P IH e n/a 10 1270 1298 1408 N
+ D P IH i n/a 10 1270 1298 1370 N
+ D P IH s n/a 10 1270 1298 1364 N
+ D P IY b n/a 10 1270 1298 1363 N
+ D P IY e n/a 10 1270 1298 1408 N
+ D P IY i n/a 10 1270 1298 1370 N
+ D P IY s n/a 10 1270 1298 1363 N
+ D P JH e n/a 10 1270 1287 1399 N
+ D P JH s n/a 10 1270 1287 1399 N
+ D P K e n/a 10 1270 1286 1379 N
+ D P K s n/a 10 1270 1286 1379 N
+ D P L b n/a 10 1270 1286 1345 N
+ D P L e n/a 10 1270 1286 1400 N
+ D P L s n/a 10 1270 1286 1345 N
+ D P M b n/a 10 1270 1287 1399 N
+ D P M e n/a 10 1270 1287 1399 N
+ D P M s n/a 10 1270 1287 1399 N
+ D P N b n/a 10 1270 1287 1399 N
+ D P N e n/a 10 1270 1287 1399 N
+ D P N s n/a 10 1270 1287 1399 N
+ D P NG e n/a 10 1270 1287 1399 N
+ D P NG s n/a 10 1270 1287 1399 N
+ D P OW b n/a 10 1270 1297 1347 N
+ D P OW e n/a 10 1270 1297 1415 N
+ D P OW s n/a 10 1270 1297 1347 N
+ D P OY b n/a 10 1270 1297 1345 N
+ D P OY e n/a 10 1270 1297 1411 N
+ D P OY s n/a 10 1270 1297 1345 N
+ D P P e n/a 10 1270 1286 1379 N
+ D P P s n/a 10 1270 1286 1379 N
+ D P R b n/a 10 1270 1286 1360 N
+ D P R e n/a 10 1270 1286 1401 N
+ D P R i n/a 10 1270 1286 1361 N
+ D P R s n/a 10 1270 1286 1361 N
+ D P S b n/a 10 1270 1287 1385 N
+ D P S e n/a 10 1270 1287 1385 N
+ D P S s n/a 10 1270 1287 1385 N
+ D P SH e n/a 10 1270 1286 1385 N
+ D P SH s n/a 10 1270 1286 1385 N
+ D P SIL e n/a 10 1270 1286 1421 N
+ D P SIL s n/a 10 1270 1286 1421 N
+ D P T e n/a 10 1270 1287 1379 N
+ D P T s n/a 10 1270 1287 1379 N
+ D P TH e n/a 10 1270 1287 1379 N
+ D P TH s n/a 10 1270 1287 1379 N
+ D P UH b n/a 10 1270 1298 1363 N
+ D P UH e n/a 10 1270 1298 1408 N
+ D P UH s n/a 10 1270 1298 1363 N
+ D P UW b n/a 10 1270 1298 1363 N
+ D P UW e n/a 10 1270 1298 1408 N
+ D P UW i n/a 10 1270 1298 1363 N
+ D P UW s n/a 10 1270 1298 1363 N
+ D P V b n/a 10 1270 1287 1399 N
+ D P V e n/a 10 1270 1287 1399 N
+ D P V s n/a 10 1270 1287 1399 N
+ D P W b n/a 10 1270 1286 1345 N
+ D P W e n/a 10 1270 1286 1400 N
+ D P W s n/a 10 1270 1286 1345 N
+ D P Y b n/a 10 1270 1287 1399 N
+ D P Y e n/a 10 1270 1287 1399 N
+ D P Y s n/a 10 1270 1287 1399 N
+ D P Z b n/a 10 1270 1287 1399 N
+ D P Z e n/a 10 1270 1287 1399 N
+ D P Z s n/a 10 1270 1287 1399 N
+ D P ZH e n/a 10 1270 1287 1399 N
+ D P ZH s n/a 10 1270 1287 1399 N
+ D R AA b n/a 10 1240 1309 1347 N
+ D R AA e n/a 10 1238 1310 1415 N
+ D R AA i n/a 10 1238 1309 1356 N
+ D R AA s n/a 10 1238 1310 1356 N
+ D R AE b n/a 10 1240 1309 1343 N
+ D R AE e n/a 10 1238 1310 1406 N
+ D R AE i n/a 10 1238 1309 1354 N
+ D R AE s n/a 10 1238 1310 1354 N
+ D R AH b n/a 10 1240 1309 1346 N
+ D R AH e n/a 10 1238 1310 1417 N
+ D R AH i n/a 10 1238 1310 1352 N
+ D R AH s n/a 10 1238 1310 1352 N
+ D R AO b n/a 10 1240 1309 1345 N
+ D R AO e n/a 10 1238 1310 1415 N
+ D R AO i n/a 10 1238 1309 1356 N
+ D R AO s n/a 10 1238 1310 1356 N
+ D R AW b n/a 10 1240 1309 1344 N
+ D R AW e n/a 10 1238 1310 1416 N
+ D R AW i n/a 10 1238 1309 1354 N
+ D R AW s n/a 10 1238 1310 1354 N
+ D R AY b n/a 10 1240 1309 1349 N
+ D R AY e n/a 10 1238 1310 1411 N
+ D R AY i n/a 10 1238 1309 1356 N
+ D R AY s n/a 10 1238 1310 1356 N
+ D R B b n/a 10 1240 1292 1397 N
+ D R B e n/a 10 1235 1292 1397 N
+ D R B i n/a 10 1235 1292 1397 N
+ D R B s n/a 10 1235 1292 1397 N
+ D R CH e n/a 10 1239 1282 1383 N
+ D R CH s n/a 10 1239 1282 1383 N
+ D R D b n/a 10 1235 1292 1397 N
+ D R D e n/a 10 1235 1292 1397 N
+ D R D s n/a 10 1235 1292 1397 N
+ D R DH e n/a 10 1236 1292 1397 N
+ D R DH s n/a 10 1236 1292 1397 N
+ D R EH b n/a 10 1240 1309 1343 N
+ D R EH e n/a 10 1238 1310 1405 N
+ D R EH i n/a 10 1238 1309 1354 N
+ D R EH s n/a 10 1238 1310 1354 N
+ D R ER b n/a 10 1240 1309 1350 N
+ D R ER e n/a 10 1237 1310 1415 N
+ D R ER i n/a 10 1237 1310 1357 N
+ D R ER s n/a 10 1237 1310 1357 N
+ D R EY b n/a 10 1240 1309 1343 N
+ D R EY e n/a 10 1238 1310 1405 N
+ D R EY i n/a 10 1238 1309 1354 N
+ D R EY s n/a 10 1238 1310 1354 N
+ D R F b n/a 10 1239 1282 1380 N
+ D R F e n/a 10 1239 1282 1380 N
+ D R F i n/a 10 1239 1282 1380 N
+ D R F s n/a 10 1239 1282 1380 N
+ D R G b n/a 10 1240 1292 1397 N
+ D R G e n/a 10 1235 1292 1397 N
+ D R G i n/a 10 1235 1292 1397 N
+ D R G s n/a 10 1235 1292 1397 N
+ D R HH b n/a 10 1239 1282 1388 N
+ D R HH e n/a 10 1238 1282 1388 N
+ D R HH i n/a 10 1238 1282 1388 N
+ D R HH s n/a 10 1238 1282 1388 N
+ D R IH b n/a 10 1240 1309 1366 N
+ D R IH e n/a 10 1238 1310 1410 N
+ D R IH i n/a 10 1237 1310 1370 N
+ D R IH s n/a 10 1238 1310 1366 N
+ D R IY b n/a 10 1240 1309 1367 N
+ D R IY e n/a 10 1238 1310 1410 N
+ D R IY i n/a 10 1237 1310 1370 N
+ D R IY s n/a 10 1238 1310 1367 N
+ D R JH e n/a 10 1235 1292 1397 N
+ D R JH s n/a 10 1235 1292 1397 N
+ D R K e n/a 10 1239 1282 1380 N
+ D R K i n/a 10 1239 1282 1380 N
+ D R K s n/a 10 1239 1282 1380 N
+ D R L b n/a 10 1240 1295 1345 N
+ D R L e n/a 10 1235 1295 1400 N
+ D R L i n/a 10 1235 1295 1353 N
+ D R L s n/a 10 1235 1295 1353 N
+ D R M b n/a 10 1240 1295 1397 N
+ D R M e n/a 10 1235 1295 1397 N
+ D R M i n/a 10 1235 1295 1397 N
+ D R M s n/a 10 1235 1295 1397 N
+ D R N b n/a 10 1235 1295 1397 N
+ D R N e n/a 10 1235 1295 1397 N
+ D R N i n/a 10 1235 1295 1397 N
+ D R N s n/a 10 1235 1295 1397 N
+ D R NG e n/a 10 1235 1295 1397 N
+ D R NG i n/a 10 1235 1295 1397 N
+ D R NG s n/a 10 1235 1295 1397 N
+ D R OW b n/a 10 1240 1309 1346 N
+ D R OW e n/a 10 1238 1310 1415 N
+ D R OW i n/a 10 1238 1309 1356 N
+ D R OW s n/a 10 1238 1310 1356 N
+ D R OY b n/a 10 1240 1309 1345 N
+ D R OY e n/a 10 1238 1310 1411 N
+ D R OY i n/a 10 1238 1309 1356 N
+ D R OY s n/a 10 1238 1310 1356 N
+ D R P e n/a 10 1239 1282 1380 N
+ D R P i n/a 10 1239 1282 1380 N
+ D R P s n/a 10 1239 1282 1380 N
+ D R R b n/a 10 1240 1295 1360 N
+ D R R e n/a 10 1235 1295 1401 N
+ D R R i n/a 10 1235 1295 1361 N
+ D R R s n/a 10 1235 1295 1361 N
+ D R S b n/a 10 1235 1282 1382 N
+ D R S e n/a 10 1235 1282 1382 N
+ D R S i n/a 10 1236 1282 1382 N
+ D R S s n/a 10 1235 1282 1382 N
+ D R SH e n/a 10 1239 1282 1383 N
+ D R SH i n/a 10 1239 1282 1383 N
+ D R SH s n/a 10 1239 1282 1383 N
+ D R SIL e n/a 10 1239 1282 1418 N
+ D R SIL s n/a 10 1239 1282 1418 N
+ D R T e n/a 10 1235 1282 1380 N
+ D R T i n/a 10 1235 1282 1380 N
+ D R T s n/a 10 1235 1282 1380 N
+ D R TH e n/a 10 1236 1282 1380 N
+ D R TH s n/a 10 1236 1282 1380 N
+ D R UH b n/a 10 1240 1309 1363 N
+ D R UH e n/a 10 1238 1310 1410 N
+ D R UH i n/a 10 1237 1310 1363 N
+ D R UH s n/a 10 1238 1310 1363 N
+ D R UW b n/a 10 1240 1309 1363 N
+ D R UW e n/a 10 1238 1310 1410 N
+ D R UW i n/a 10 1237 1310 1363 N
+ D R UW s n/a 10 1238 1310 1363 N
+ D R V b n/a 10 1240 1292 1397 N
+ D R V e n/a 10 1235 1292 1397 N
+ D R V i n/a 10 1236 1292 1397 N
+ D R V s n/a 10 1235 1292 1397 N
+ D R W b n/a 10 1240 1295 1345 N
+ D R W e n/a 10 1235 1295 1401 N
+ D R W i n/a 10 1235 1295 1353 N
+ D R W s n/a 10 1235 1295 1353 N
+ D R Y b n/a 10 1240 1292 1397 N
+ D R Y e n/a 10 1235 1292 1397 N
+ D R Y i n/a 10 1235 1292 1397 N
+ D R Y s n/a 10 1235 1292 1397 N
+ D R Z b n/a 10 1235 1292 1397 N
+ D R Z e n/a 10 1235 1292 1397 N
+ D R Z i n/a 10 1236 1292 1397 N
+ D R Z s n/a 10 1235 1292 1397 N
+ D R ZH e n/a 10 1235 1292 1397 N
+ D R ZH s n/a 10 1235 1292 1397 N
+ D S AA b n/a 10 1273 1297 1347 N
+ D S AA e n/a 10 1272 1297 1415 N
+ D S AA i n/a 10 1272 1297 1347 N
+ D S AA s n/a 10 1272 1297 1347 N
+ D S AE b n/a 10 1273 1297 1342 N
+ D S AE e n/a 10 1272 1297 1405 N
+ D S AE i n/a 10 1272 1297 1342 N
+ D S AE s n/a 10 1272 1297 1342 N
+ D S AH b n/a 10 1273 1297 1347 N
+ D S AH e n/a 10 1272 1297 1414 N
+ D S AH i n/a 10 1272 1297 1350 N
+ D S AH s n/a 10 1272 1297 1347 N
+ D S AO b n/a 10 1273 1297 1345 N
+ D S AO e n/a 10 1272 1297 1415 N
+ D S AO i n/a 10 1272 1297 1345 N
+ D S AO s n/a 10 1272 1297 1345 N
+ D S AW b n/a 10 1273 1297 1344 N
+ D S AW e n/a 10 1272 1297 1416 N
+ D S AW i n/a 10 1272 1297 1344 N
+ D S AW s n/a 10 1272 1297 1344 N
+ D S AY b n/a 10 1273 1297 1349 N
+ D S AY e n/a 10 1272 1297 1411 N
+ D S AY i n/a 10 1272 1297 1349 N
+ D S AY s n/a 10 1272 1297 1349 N
+ D S B b n/a 10 1273 1287 1399 N
+ D S B e n/a 10 1272 1287 1399 N
+ D S B s n/a 10 1272 1287 1399 N
+ D S CH e n/a 10 1272 1287 1385 N
+ D S CH s n/a 10 1272 1287 1385 N
+ D S D b n/a 10 1273 1287 1399 N
+ D S D e n/a 10 1272 1287 1399 N
+ D S D s n/a 10 1272 1287 1399 N
+ D S DH e n/a 10 1272 1287 1399 N
+ D S DH s n/a 10 1272 1287 1399 N
+ D S EH b n/a 10 1273 1297 1342 N
+ D S EH e n/a 10 1272 1297 1405 N
+ D S EH i n/a 10 1272 1297 1342 N
+ D S EH s n/a 10 1272 1297 1342 N
+ D S ER b n/a 10 1273 1297 1350 N
+ D S ER e n/a 10 1272 1297 1415 N
+ D S ER i n/a 10 1272 1297 1357 N
+ D S ER s n/a 10 1272 1297 1357 N
+ D S EY b n/a 10 1273 1297 1342 N
+ D S EY e n/a 10 1272 1297 1405 N
+ D S EY i n/a 10 1272 1297 1342 N
+ D S EY s n/a 10 1272 1297 1342 N
+ D S F b n/a 10 1273 1287 1379 N
+ D S F e n/a 10 1272 1287 1379 N
+ D S F s n/a 10 1272 1287 1379 N
+ D S G b n/a 10 1273 1287 1399 N
+ D S G e n/a 10 1272 1287 1399 N
+ D S G s n/a 10 1272 1287 1399 N
+ D S HH b n/a 10 1273 1287 1389 N
+ D S HH e n/a 10 1272 1287 1389 N
+ D S HH s n/a 10 1272 1287 1389 N
+ D S IH b n/a 10 1273 1297 1364 N
+ D S IH e n/a 10 1272 1297 1408 N
+ D S IH i n/a 10 1272 1297 1370 N
+ D S IH s n/a 10 1272 1297 1364 N
+ D S IY b n/a 10 1273 1297 1363 N
+ D S IY e n/a 10 1272 1297 1408 N
+ D S IY i n/a 10 1272 1297 1370 N
+ D S IY s n/a 10 1272 1297 1363 N
+ D S JH e n/a 10 1272 1287 1399 N
+ D S JH s n/a 10 1272 1287 1399 N
+ D S K e n/a 10 1272 1287 1379 N
+ D S K s n/a 10 1272 1287 1379 N
+ D S L b n/a 10 1272 1286 1345 N
+ D S L e n/a 10 1272 1286 1400 N
+ D S L s n/a 10 1272 1286 1345 N
+ D S M b n/a 10 1273 1287 1399 N
+ D S M e n/a 10 1272 1287 1399 N
+ D S M s n/a 10 1272 1287 1399 N
+ D S N b n/a 10 1273 1287 1399 N
+ D S N e n/a 10 1272 1287 1399 N
+ D S N s n/a 10 1272 1287 1399 N
+ D S NG e n/a 10 1272 1287 1399 N
+ D S NG s n/a 10 1272 1287 1399 N
+ D S OW b n/a 10 1273 1297 1347 N
+ D S OW e n/a 10 1272 1297 1415 N
+ D S OW s n/a 10 1272 1297 1347 N
+ D S OY b n/a 10 1273 1297 1345 N
+ D S OY e n/a 10 1272 1297 1411 N
+ D S OY s n/a 10 1272 1297 1345 N
+ D S P e n/a 10 1272 1287 1379 N
+ D S P s n/a 10 1272 1287 1379 N
+ D S R b n/a 10 1272 1286 1360 N
+ D S R e n/a 10 1272 1286 1401 N
+ D S R i n/a 10 1272 1286 1361 N
+ D S R s n/a 10 1272 1286 1361 N
+ D S S b n/a 10 1273 1287 1385 N
+ D S S e n/a 10 1272 1287 1385 N
+ D S S s n/a 10 1272 1287 1385 N
+ D S SH e n/a 10 1272 1287 1385 N
+ D S SH s n/a 10 1272 1287 1385 N
+ D S SIL e n/a 10 1272 1287 1421 N
+ D S SIL s n/a 10 1272 1287 1421 N
+ D S T e n/a 10 1272 1287 1379 N
+ D S T s n/a 10 1272 1287 1379 N
+ D S TH e n/a 10 1272 1287 1379 N
+ D S TH s n/a 10 1272 1287 1379 N
+ D S UH b n/a 10 1273 1297 1363 N
+ D S UH e n/a 10 1272 1297 1408 N
+ D S UH s n/a 10 1272 1297 1363 N
+ D S UW b n/a 10 1273 1297 1363 N
+ D S UW e n/a 10 1272 1297 1408 N
+ D S UW i n/a 10 1272 1297 1363 N
+ D S UW s n/a 10 1272 1297 1363 N
+ D S V b n/a 10 1273 1287 1399 N
+ D S V e n/a 10 1272 1287 1399 N
+ D S V s n/a 10 1272 1287 1399 N
+ D S W b n/a 10 1272 1286 1345 N
+ D S W e n/a 10 1272 1286 1400 N
+ D S W s n/a 10 1272 1286 1345 N
+ D S Y b n/a 10 1273 1287 1399 N
+ D S Y e n/a 10 1272 1287 1399 N
+ D S Y s n/a 10 1272 1287 1399 N
+ D S Z b n/a 10 1273 1287 1399 N
+ D S Z e n/a 10 1272 1287 1399 N
+ D S Z i n/a 10 1272 1287 1399 N
+ D S Z s n/a 10 1272 1287 1399 N
+ D S ZH e n/a 10 1272 1287 1399 N
+ D S ZH s n/a 10 1272 1287 1399 N
+ D SH AA b n/a 10 1273 1297 1347 N
+ D SH AA e n/a 10 1272 1297 1415 N
+ D SH AA i n/a 10 1272 1297 1347 N
+ D SH AA s n/a 10 1272 1297 1347 N
+ D SH AE b n/a 10 1273 1297 1342 N
+ D SH AE e n/a 10 1272 1297 1405 N
+ D SH AE i n/a 10 1272 1297 1342 N
+ D SH AE s n/a 10 1272 1297 1342 N
+ D SH AH b n/a 10 1273 1297 1347 N
+ D SH AH e n/a 10 1272 1297 1414 N
+ D SH AH s n/a 10 1272 1297 1347 N
+ D SH AO b n/a 10 1273 1297 1345 N
+ D SH AO e n/a 10 1272 1297 1415 N
+ D SH AO s n/a 10 1272 1297 1345 N
+ D SH AW b n/a 10 1273 1297 1344 N
+ D SH AW e n/a 10 1272 1297 1416 N
+ D SH AW i n/a 10 1272 1297 1344 N
+ D SH AW s n/a 10 1272 1297 1344 N
+ D SH AY b n/a 10 1273 1297 1349 N
+ D SH AY e n/a 10 1272 1297 1411 N
+ D SH AY s n/a 10 1272 1297 1349 N
+ D SH B b n/a 10 1273 1287 1399 N
+ D SH B e n/a 10 1272 1287 1399 N
+ D SH B s n/a 10 1272 1287 1399 N
+ D SH CH e n/a 10 1272 1287 1385 N
+ D SH CH s n/a 10 1272 1287 1385 N
+ D SH D b n/a 10 1273 1287 1399 N
+ D SH D e n/a 10 1272 1287 1399 N
+ D SH D s n/a 10 1272 1287 1399 N
+ D SH DH e n/a 10 1272 1287 1399 N
+ D SH DH s n/a 10 1272 1287 1399 N
+ D SH EH b n/a 10 1273 1297 1342 N
+ D SH EH e n/a 10 1272 1297 1405 N
+ D SH EH s n/a 10 1272 1297 1342 N
+ D SH ER b n/a 10 1273 1297 1350 N
+ D SH ER e n/a 10 1272 1297 1415 N
+ D SH ER s n/a 10 1272 1297 1357 N
+ D SH EY b n/a 10 1273 1297 1342 N
+ D SH EY e n/a 10 1272 1297 1405 N
+ D SH EY s n/a 10 1272 1297 1342 N
+ D SH F b n/a 10 1273 1287 1379 N
+ D SH F e n/a 10 1272 1287 1379 N
+ D SH F s n/a 10 1272 1287 1379 N
+ D SH G b n/a 10 1273 1287 1399 N
+ D SH G e n/a 10 1272 1287 1399 N
+ D SH G s n/a 10 1272 1287 1399 N
+ D SH HH b n/a 10 1273 1287 1389 N
+ D SH HH e n/a 10 1272 1287 1389 N
+ D SH HH s n/a 10 1272 1287 1389 N
+ D SH IH b n/a 10 1273 1297 1364 N
+ D SH IH e n/a 10 1272 1297 1408 N
+ D SH IH s n/a 10 1272 1297 1364 N
+ D SH IY b n/a 10 1273 1297 1363 N
+ D SH IY e n/a 10 1272 1297 1408 N
+ D SH IY i n/a 10 1272 1297 1370 N
+ D SH IY s n/a 10 1272 1297 1363 N
+ D SH JH e n/a 10 1272 1287 1399 N
+ D SH JH s n/a 10 1272 1287 1399 N
+ D SH K e n/a 10 1272 1287 1379 N
+ D SH K s n/a 10 1272 1287 1379 N
+ D SH L b n/a 10 1272 1286 1345 N
+ D SH L e n/a 10 1272 1286 1400 N
+ D SH L s n/a 10 1272 1286 1345 N
+ D SH M b n/a 10 1273 1287 1399 N
+ D SH M e n/a 10 1272 1287 1399 N
+ D SH M s n/a 10 1272 1287 1399 N
+ D SH N b n/a 10 1273 1287 1399 N
+ D SH N e n/a 10 1272 1287 1399 N
+ D SH N s n/a 10 1272 1287 1399 N
+ D SH NG e n/a 10 1272 1287 1399 N
+ D SH NG s n/a 10 1272 1287 1399 N
+ D SH OW b n/a 10 1273 1297 1347 N
+ D SH OW e n/a 10 1272 1297 1415 N
+ D SH OW s n/a 10 1272 1297 1347 N
+ D SH OY b n/a 10 1273 1297 1345 N
+ D SH OY e n/a 10 1272 1297 1411 N
+ D SH OY s n/a 10 1272 1297 1345 N
+ D SH P e n/a 10 1272 1287 1379 N
+ D SH P s n/a 10 1272 1287 1379 N
+ D SH R b n/a 10 1272 1286 1360 N
+ D SH R e n/a 10 1272 1286 1401 N
+ D SH R s n/a 10 1272 1286 1361 N
+ D SH S b n/a 10 1273 1287 1385 N
+ D SH S e n/a 10 1272 1287 1385 N
+ D SH S s n/a 10 1272 1287 1385 N
+ D SH SH e n/a 10 1272 1287 1385 N
+ D SH SH s n/a 10 1272 1287 1385 N
+ D SH SIL e n/a 10 1272 1287 1421 N
+ D SH SIL s n/a 10 1272 1287 1421 N
+ D SH T e n/a 10 1272 1287 1379 N
+ D SH T s n/a 10 1272 1287 1379 N
+ D SH TH e n/a 10 1272 1287 1379 N
+ D SH TH s n/a 10 1272 1287 1379 N
+ D SH UH b n/a 10 1273 1297 1363 N
+ D SH UH e n/a 10 1272 1297 1408 N
+ D SH UH s n/a 10 1272 1297 1363 N
+ D SH UW b n/a 10 1273 1297 1363 N
+ D SH UW e n/a 10 1272 1297 1408 N
+ D SH UW s n/a 10 1272 1297 1363 N
+ D SH V b n/a 10 1273 1287 1399 N
+ D SH V e n/a 10 1272 1287 1399 N
+ D SH V s n/a 10 1272 1287 1399 N
+ D SH W b n/a 10 1272 1286 1345 N
+ D SH W e n/a 10 1272 1286 1400 N
+ D SH W s n/a 10 1272 1286 1345 N
+ D SH Y b n/a 10 1273 1287 1399 N
+ D SH Y e n/a 10 1272 1287 1399 N
+ D SH Y i n/a 10 1272 1287 1399 N
+ D SH Y s n/a 10 1272 1287 1399 N
+ D SH Z b n/a 10 1273 1287 1399 N
+ D SH Z e n/a 10 1272 1287 1399 N
+ D SH Z s n/a 10 1272 1287 1399 N
+ D SH ZH e n/a 10 1272 1287 1399 N
+ D SH ZH s n/a 10 1272 1287 1399 N
+ D SIL AA b n/a 10 1271 1299 1348 N
+ D SIL AA s n/a 10 1271 1299 1348 N
+ D SIL AE b n/a 10 1271 1298 1342 N
+ D SIL AE s n/a 10 1271 1298 1342 N
+ D SIL AH b n/a 10 1271 1299 1348 N
+ D SIL AH s n/a 10 1271 1299 1348 N
+ D SIL AO b n/a 10 1271 1299 1345 N
+ D SIL AO s n/a 10 1271 1299 1345 N
+ D SIL AW b n/a 10 1271 1299 1344 N
+ D SIL AW s n/a 10 1271 1299 1344 N
+ D SIL AY b n/a 10 1271 1299 1349 N
+ D SIL AY s n/a 10 1271 1299 1349 N
+ D SIL B b n/a 10 1271 1287 1399 N
+ D SIL B s n/a 10 1271 1287 1399 N
+ D SIL CH s n/a 10 1271 1287 1385 N
+ D SIL D b n/a 10 1271 1287 1399 N
+ D SIL D s n/a 10 1271 1287 1399 N
+ D SIL DH s n/a 10 1271 1287 1399 N
+ D SIL EH b n/a 10 1271 1298 1342 N
+ D SIL EH s n/a 10 1271 1298 1342 N
+ D SIL ER b n/a 10 1271 1299 1350 N
+ D SIL ER s n/a 10 1271 1299 1357 N
+ D SIL EY b n/a 10 1271 1298 1342 N
+ D SIL EY s n/a 10 1271 1298 1342 N
+ D SIL F b n/a 10 1271 1287 1379 N
+ D SIL F s n/a 10 1271 1287 1379 N
+ D SIL G b n/a 10 1271 1287 1399 N
+ D SIL G s n/a 10 1271 1287 1399 N
+ D SIL HH b n/a 10 1271 1287 1389 N
+ D SIL HH s n/a 10 1271 1287 1389 N
+ D SIL IH b n/a 10 1271 1298 1364 N
+ D SIL IH s n/a 10 1271 1298 1364 N
+ D SIL IY b n/a 10 1271 1298 1363 N
+ D SIL IY s n/a 10 1271 1298 1363 N
+ D SIL JH s n/a 10 1271 1287 1399 N
+ D SIL K s n/a 10 1271 1287 1379 N
+ D SIL L b n/a 10 1271 1286 1345 N
+ D SIL L s n/a 10 1271 1286 1345 N
+ D SIL M b n/a 10 1271 1287 1399 N
+ D SIL M s n/a 10 1271 1287 1399 N
+ D SIL N b n/a 10 1271 1287 1399 N
+ D SIL N s n/a 10 1271 1287 1399 N
+ D SIL NG s n/a 10 1271 1287 1399 N
+ D SIL OW b n/a 10 1271 1299 1348 N
+ D SIL OW s n/a 10 1271 1299 1348 N
+ D SIL OY b n/a 10 1271 1299 1345 N
+ D SIL OY s n/a 10 1271 1299 1345 N
+ D SIL P s n/a 10 1271 1287 1379 N
+ D SIL R b n/a 10 1271 1286 1360 N
+ D SIL R s n/a 10 1271 1286 1361 N
+ D SIL S b n/a 10 1271 1287 1385 N
+ D SIL S s n/a 10 1271 1287 1385 N
+ D SIL SH s n/a 10 1271 1287 1385 N
+ D SIL SIL s n/a 10 1271 1287 1421 N
+ D SIL T s n/a 10 1271 1287 1379 N
+ D SIL TH s n/a 10 1271 1287 1379 N
+ D SIL UH b n/a 10 1271 1298 1363 N
+ D SIL UH s n/a 10 1271 1298 1363 N
+ D SIL UW b n/a 10 1271 1298 1363 N
+ D SIL UW s n/a 10 1271 1298 1363 N
+ D SIL V b n/a 10 1271 1287 1399 N
+ D SIL V s n/a 10 1271 1287 1399 N
+ D SIL W b n/a 10 1271 1286 1345 N
+ D SIL W s n/a 10 1271 1286 1345 N
+ D SIL Y b n/a 10 1271 1287 1399 N
+ D SIL Y s n/a 10 1271 1287 1399 N
+ D SIL Z b n/a 10 1271 1287 1399 N
+ D SIL Z s n/a 10 1271 1287 1399 N
+ D SIL ZH s n/a 10 1271 1287 1399 N
+ D T AA b n/a 10 1270 1299 1349 N
+ D T AA i n/a 10 1270 1299 1349 N
+ D T AA s n/a 10 1270 1299 1349 N
+ D T AE b n/a 10 1270 1298 1342 N
+ D T AE s n/a 10 1270 1298 1342 N
+ D T AH b n/a 10 1270 1299 1348 N
+ D T AH i n/a 10 1270 1299 1350 N
+ D T AH s n/a 10 1270 1299 1348 N
+ D T AO b n/a 10 1270 1299 1345 N
+ D T AO i n/a 10 1270 1299 1345 N
+ D T AO s n/a 10 1270 1299 1345 N
+ D T AW b n/a 10 1270 1299 1344 N
+ D T AW i n/a 10 1270 1299 1344 N
+ D T AW s n/a 10 1270 1299 1344 N
+ D T AY b n/a 10 1270 1299 1349 N
+ D T AY i n/a 10 1270 1299 1349 N
+ D T AY s n/a 10 1270 1299 1349 N
+ D T B b n/a 10 1270 1287 1390 N
+ D T B s n/a 10 1270 1287 1390 N
+ D T CH s n/a 10 1270 1287 1385 N
+ D T D b n/a 10 1270 1287 1390 N
+ D T D s n/a 10 1270 1287 1390 N
+ D T DH s n/a 10 1270 1287 1393 N
+ D T EH b n/a 10 1270 1298 1342 N
+ D T EH i n/a 10 1270 1298 1342 N
+ D T EH s n/a 10 1270 1298 1342 N
+ D T ER b n/a 10 1270 1299 1350 N
+ D T ER s n/a 10 1270 1299 1358 N
+ D T EY b n/a 10 1270 1298 1342 N
+ D T EY i n/a 10 1270 1298 1342 N
+ D T EY s n/a 10 1270 1298 1342 N
+ D T F b n/a 10 1270 1287 1381 N
+ D T F s n/a 10 1270 1287 1381 N
+ D T G b n/a 10 1270 1287 1390 N
+ D T G s n/a 10 1270 1287 1390 N
+ D T HH b n/a 10 1270 1287 1387 N
+ D T HH s n/a 10 1270 1287 1387 N
+ D T IH b n/a 10 1270 1298 1364 N
+ D T IH i n/a 10 1270 1298 1370 N
+ D T IH s n/a 10 1270 1298 1364 N
+ D T IY b n/a 10 1270 1298 1363 N
+ D T IY s n/a 10 1270 1298 1363 N
+ D T JH s n/a 10 1270 1287 1391 N
+ D T K s n/a 10 1270 1287 1381 N
+ D T L b n/a 10 1270 1286 1345 N
+ D T L s n/a 10 1270 1286 1345 N
+ D T M b n/a 10 1270 1287 1402 N
+ D T M s n/a 10 1270 1287 1402 N
+ D T N b n/a 10 1270 1287 1402 N
+ D T N s n/a 10 1270 1287 1402 N
+ D T NG s n/a 10 1270 1287 1402 N
+ D T OW b n/a 10 1270 1299 1348 N
+ D T OW s n/a 10 1270 1299 1348 N
+ D T OY b n/a 10 1270 1299 1345 N
+ D T OY i n/a 10 1270 1299 1345 N
+ D T OY s n/a 10 1270 1299 1345 N
+ D T P s n/a 10 1270 1287 1381 N
+ D T R b n/a 10 1270 1286 1360 N
+ D T R i n/a 10 1270 1286 1361 N
+ D T R s n/a 10 1270 1286 1361 N
+ D T S b n/a 10 1270 1287 1385 N
+ D T S s n/a 10 1270 1287 1385 N
+ D T SH s n/a 10 1270 1287 1385 N
+ D T SIL s n/a 10 1270 1287 1422 N
+ D T T s n/a 10 1270 1287 1381 N
+ D T TH s n/a 10 1270 1287 1381 N
+ D T UH b n/a 10 1270 1298 1363 N
+ D T UH s n/a 10 1270 1298 1363 N
+ D T UW b n/a 10 1270 1298 1363 N
+ D T UW i n/a 10 1270 1298 1363 N
+ D T UW s n/a 10 1270 1298 1363 N
+ D T V b n/a 10 1270 1287 1390 N
+ D T V s n/a 10 1270 1287 1390 N
+ D T W b n/a 10 1270 1286 1345 N
+ D T W s n/a 10 1270 1286 1345 N
+ D T Y b n/a 10 1270 1287 1391 N
+ D T Y s n/a 10 1270 1287 1391 N
+ D T Z b n/a 10 1270 1287 1390 N
+ D T Z s n/a 10 1270 1287 1390 N
+ D T ZH s n/a 10 1270 1287 1391 N
+ D TH AA b n/a 10 1273 1297 1347 N
+ D TH AA e n/a 10 1272 1297 1415 N
+ D TH AA s n/a 10 1272 1297 1347 N
+ D TH AE b n/a 10 1273 1297 1342 N
+ D TH AE e n/a 10 1272 1297 1405 N
+ D TH AE s n/a 10 1272 1297 1342 N
+ D TH AH b n/a 10 1273 1297 1347 N
+ D TH AH e n/a 10 1272 1297 1414 N
+ D TH AH i n/a 10 1272 1297 1350 N
+ D TH AH s n/a 10 1272 1297 1347 N
+ D TH AO b n/a 10 1273 1297 1345 N
+ D TH AO e n/a 10 1272 1297 1415 N
+ D TH AO s n/a 10 1272 1297 1345 N
+ D TH AW b n/a 10 1273 1297 1344 N
+ D TH AW e n/a 10 1272 1297 1416 N
+ D TH AW i n/a 10 1272 1297 1344 N
+ D TH AW s n/a 10 1272 1297 1344 N
+ D TH AY b n/a 10 1273 1297 1349 N
+ D TH AY e n/a 10 1272 1297 1411 N
+ D TH AY i n/a 10 1272 1297 1349 N
+ D TH AY s n/a 10 1272 1297 1349 N
+ D TH B b n/a 10 1273 1287 1399 N
+ D TH B e n/a 10 1272 1287 1399 N
+ D TH B s n/a 10 1272 1287 1399 N
+ D TH CH e n/a 10 1272 1287 1385 N
+ D TH CH s n/a 10 1272 1287 1385 N
+ D TH D b n/a 10 1273 1287 1399 N
+ D TH D e n/a 10 1272 1287 1399 N
+ D TH D s n/a 10 1272 1287 1399 N
+ D TH DH e n/a 10 1272 1287 1399 N
+ D TH DH s n/a 10 1272 1287 1399 N
+ D TH EH b n/a 10 1273 1297 1342 N
+ D TH EH e n/a 10 1272 1297 1405 N
+ D TH EH s n/a 10 1272 1297 1342 N
+ D TH ER b n/a 10 1273 1297 1350 N
+ D TH ER e n/a 10 1272 1297 1415 N
+ D TH ER i n/a 10 1272 1297 1357 N
+ D TH ER s n/a 10 1272 1297 1357 N
+ D TH EY b n/a 10 1273 1297 1342 N
+ D TH EY e n/a 10 1272 1297 1405 N
+ D TH EY i n/a 10 1272 1297 1342 N
+ D TH EY s n/a 10 1272 1297 1342 N
+ D TH F b n/a 10 1273 1287 1379 N
+ D TH F e n/a 10 1272 1287 1379 N
+ D TH F s n/a 10 1272 1287 1379 N
+ D TH G b n/a 10 1273 1287 1399 N
+ D TH G e n/a 10 1272 1287 1399 N
+ D TH G s n/a 10 1272 1287 1399 N
+ D TH HH b n/a 10 1273 1287 1389 N
+ D TH HH e n/a 10 1272 1287 1389 N
+ D TH HH s n/a 10 1272 1287 1389 N
+ D TH IH b n/a 10 1273 1297 1364 N
+ D TH IH e n/a 10 1272 1297 1408 N
+ D TH IH s n/a 10 1272 1297 1364 N
+ D TH IY b n/a 10 1273 1297 1363 N
+ D TH IY e n/a 10 1272 1297 1408 N
+ D TH IY s n/a 10 1272 1297 1363 N
+ D TH JH e n/a 10 1272 1287 1399 N
+ D TH JH s n/a 10 1272 1287 1399 N
+ D TH K e n/a 10 1272 1287 1379 N
+ D TH K s n/a 10 1272 1287 1379 N
+ D TH L b n/a 10 1272 1286 1345 N
+ D TH L e n/a 10 1272 1286 1400 N
+ D TH L s n/a 10 1272 1286 1345 N
+ D TH M b n/a 10 1273 1287 1399 N
+ D TH M e n/a 10 1272 1287 1399 N
+ D TH M s n/a 10 1272 1287 1399 N
+ D TH N b n/a 10 1273 1287 1399 N
+ D TH N e n/a 10 1272 1287 1399 N
+ D TH N s n/a 10 1272 1287 1399 N
+ D TH NG e n/a 10 1272 1287 1399 N
+ D TH NG s n/a 10 1272 1287 1399 N
+ D TH OW b n/a 10 1273 1297 1347 N
+ D TH OW e n/a 10 1272 1297 1415 N
+ D TH OW s n/a 10 1272 1297 1347 N
+ D TH OY b n/a 10 1273 1297 1345 N
+ D TH OY e n/a 10 1272 1297 1411 N
+ D TH OY s n/a 10 1272 1297 1345 N
+ D TH P e n/a 10 1272 1287 1379 N
+ D TH P s n/a 10 1272 1287 1379 N
+ D TH R b n/a 10 1272 1286 1360 N
+ D TH R e n/a 10 1272 1286 1401 N
+ D TH R i n/a 10 1272 1286 1361 N
+ D TH R s n/a 10 1272 1286 1361 N
+ D TH S b n/a 10 1273 1287 1385 N
+ D TH S e n/a 10 1272 1287 1385 N
+ D TH S s n/a 10 1272 1287 1385 N
+ D TH SH e n/a 10 1272 1287 1385 N
+ D TH SH s n/a 10 1272 1287 1385 N
+ D TH SIL e n/a 10 1272 1287 1421 N
+ D TH SIL s n/a 10 1272 1287 1421 N
+ D TH T e n/a 10 1272 1287 1379 N
+ D TH T s n/a 10 1272 1287 1379 N
+ D TH TH e n/a 10 1272 1287 1379 N
+ D TH TH s n/a 10 1272 1287 1379 N
+ D TH UH b n/a 10 1273 1297 1363 N
+ D TH UH e n/a 10 1272 1297 1408 N
+ D TH UH s n/a 10 1272 1297 1363 N
+ D TH UW b n/a 10 1273 1297 1363 N
+ D TH UW e n/a 10 1272 1297 1408 N
+ D TH UW s n/a 10 1272 1297 1363 N
+ D TH V b n/a 10 1273 1287 1399 N
+ D TH V e n/a 10 1272 1287 1399 N
+ D TH V s n/a 10 1272 1287 1399 N
+ D TH W b n/a 10 1272 1286 1345 N
+ D TH W e n/a 10 1272 1286 1400 N
+ D TH W s n/a 10 1272 1286 1345 N
+ D TH Y b n/a 10 1273 1287 1399 N
+ D TH Y e n/a 10 1272 1287 1399 N
+ D TH Y s n/a 10 1272 1287 1399 N
+ D TH Z b n/a 10 1273 1287 1399 N
+ D TH Z e n/a 10 1272 1287 1399 N
+ D TH Z s n/a 10 1272 1287 1399 N
+ D TH ZH e n/a 10 1272 1287 1399 N
+ D TH ZH s n/a 10 1272 1287 1399 N
+ D UH AA b n/a 10 1245 1335 1347 N
+ D UH AA e n/a 10 1234 1320 1415 N
+ D UH AA s n/a 10 1234 1320 1356 N
+ D UH AE b n/a 10 1245 1335 1343 N
+ D UH AE e n/a 10 1234 1320 1406 N
+ D UH AE s n/a 10 1234 1320 1354 N
+ D UH AH b n/a 10 1245 1336 1347 N
+ D UH AH e n/a 10 1234 1320 1407 N
+ D UH AH i n/a 10 1233 1320 1352 N
+ D UH AH s n/a 10 1234 1320 1352 N
+ D UH AO b n/a 10 1245 1335 1345 N
+ D UH AO e n/a 10 1234 1320 1415 N
+ D UH AO i n/a 10 1233 1320 1356 N
+ D UH AO s n/a 10 1234 1320 1356 N
+ D UH AW b n/a 10 1245 1335 1344 N
+ D UH AW e n/a 10 1234 1320 1416 N
+ D UH AW s n/a 10 1234 1320 1354 N
+ D UH AY b n/a 10 1245 1335 1349 N
+ D UH AY e n/a 10 1234 1320 1411 N
+ D UH AY i n/a 10 1233 1320 1356 N
+ D UH AY s n/a 10 1234 1320 1356 N
+ D UH B b n/a 10 1245 1312 1394 N
+ D UH B e n/a 10 1226 1312 1394 N
+ D UH B i n/a 10 1226 1312 1394 N
+ D UH B s n/a 10 1226 1312 1394 N
+ D UH CH e n/a 10 1228 1314 1374 N
+ D UH CH i n/a 10 1228 1314 1374 N
+ D UH CH s n/a 10 1228 1314 1374 N
+ D UH D b n/a 10 1245 1312 1394 N
+ D UH D e n/a 10 1226 1312 1394 N
+ D UH D s n/a 10 1226 1312 1394 N
+ D UH DH e n/a 10 1227 1314 1376 N
+ D UH DH s n/a 10 1227 1314 1376 N
+ D UH EH b n/a 10 1245 1336 1343 N
+ D UH EH e n/a 10 1234 1320 1405 N
+ D UH EH i n/a 10 1233 1320 1354 N
+ D UH EH s n/a 10 1234 1320 1354 N
+ D UH ER b n/a 10 1245 1336 1350 N
+ D UH ER e n/a 10 1234 1320 1415 N
+ D UH ER i n/a 10 1233 1320 1357 N
+ D UH ER s n/a 10 1234 1320 1357 N
+ D UH EY b n/a 10 1245 1336 1343 N
+ D UH EY e n/a 10 1234 1320 1405 N
+ D UH EY i n/a 10 1233 1320 1354 N
+ D UH EY s n/a 10 1234 1320 1354 N
+ D UH F b n/a 10 1245 1319 1377 N
+ D UH F e n/a 10 1228 1319 1377 N
+ D UH F i n/a 10 1228 1319 1377 N
+ D UH F s n/a 10 1228 1319 1377 N
+ D UH G b n/a 10 1245 1311 1395 N
+ D UH G e n/a 10 1226 1311 1395 N
+ D UH G i n/a 10 1226 1311 1395 N
+ D UH G s n/a 10 1226 1311 1395 N
+ D UH HH b n/a 10 1245 1336 1388 N
+ D UH HH e n/a 10 1234 1334 1388 N
+ D UH HH i n/a 10 1233 1334 1388 N
+ D UH HH s n/a 10 1234 1334 1388 N
+ D UH IH b n/a 10 1245 1336 1366 N
+ D UH IH e n/a 10 1234 1329 1410 N
+ D UH IH i n/a 10 1233 1329 1370 N
+ D UH IH s n/a 10 1234 1329 1366 N
+ D UH IY b n/a 10 1245 1336 1367 N
+ D UH IY e n/a 10 1234 1329 1410 N
+ D UH IY i n/a 10 1233 1329 1369 N
+ D UH IY s n/a 10 1234 1329 1367 N
+ D UH JH e n/a 10 1226 1314 1374 N
+ D UH JH s n/a 10 1226 1314 1374 N
+ D UH K e n/a 10 1228 1315 1380 N
+ D UH K i n/a 10 1228 1315 1380 N
+ D UH K s n/a 10 1228 1315 1380 N
+ D UH L b n/a 10 1245 1336 1345 N
+ D UH L e n/a 10 1228 1333 1400 N
+ D UH L i n/a 10 1228 1333 1353 N
+ D UH L s n/a 10 1228 1333 1353 N
+ D UH M b n/a 10 1245 1312 1396 N
+ D UH M e n/a 10 1226 1312 1396 N
+ D UH M i n/a 10 1226 1312 1396 N
+ D UH M s n/a 10 1226 1312 1396 N
+ D UH N b n/a 10 1245 1312 1396 N
+ D UH N e n/a 10 1226 1312 1396 N
+ D UH N i n/a 10 1226 1312 1396 N
+ D UH N s n/a 10 1226 1312 1396 N
+ D UH NG e n/a 10 1226 1312 1396 N
+ D UH NG s n/a 10 1226 1312 1396 N
+ D UH OW b n/a 10 1245 1336 1346 N
+ D UH OW e n/a 10 1234 1320 1415 N
+ D UH OW s n/a 10 1234 1320 1356 N
+ D UH OY b n/a 10 1245 1335 1345 N
+ D UH OY e n/a 10 1234 1320 1411 N
+ D UH OY s n/a 10 1234 1320 1356 N
+ D UH P e n/a 10 1228 1314 1375 N
+ D UH P i n/a 10 1228 1314 1375 N
+ D UH P s n/a 10 1228 1314 1375 N
+ D UH R b n/a 10 1245 1336 1360 N
+ D UH R e n/a 10 1228 1332 1401 N
+ D UH R i n/a 10 1228 1333 1361 N
+ D UH R s n/a 10 1228 1332 1361 N
+ D UH S b n/a 10 1245 1319 1382 N
+ D UH S e n/a 10 1228 1319 1382 N
+ D UH S i n/a 10 1228 1319 1382 N
+ D UH S s n/a 10 1228 1319 1382 N
+ D UH SH e n/a 10 1228 1319 1383 N
+ D UH SH i n/a 10 1228 1319 1383 N
+ D UH SH s n/a 10 1228 1319 1383 N
+ D UH SIL e n/a 10 1228 1339 1419 N
+ D UH SIL s n/a 10 1228 1336 1419 N
+ D UH T e n/a 10 1228 1314 1374 N
+ D UH T i n/a 10 1228 1314 1374 N
+ D UH T s n/a 10 1228 1314 1374 N
+ D UH TH e n/a 10 1228 1319 1380 N
+ D UH TH s n/a 10 1228 1319 1380 N
+ D UH UH b n/a 10 1245 1336 1363 N
+ D UH UH e n/a 10 1234 1329 1410 N
+ D UH UH s n/a 10 1234 1329 1363 N
+ D UH UW b n/a 10 1245 1336 1363 N
+ D UH UW e n/a 10 1234 1329 1410 N
+ D UH UW s n/a 10 1234 1329 1363 N
+ D UH V b n/a 10 1245 1314 1380 N
+ D UH V e n/a 10 1227 1314 1380 N
+ D UH V i n/a 10 1227 1314 1380 N
+ D UH V s n/a 10 1227 1314 1380 N
+ D UH W b n/a 10 1245 1336 1345 N
+ D UH W e n/a 10 1228 1332 1401 N
+ D UH W i n/a 10 1228 1332 1353 N
+ D UH W s n/a 10 1228 1332 1353 N
+ D UH Y b n/a 10 1245 1315 1383 N
+ D UH Y e n/a 10 1228 1315 1383 N
+ D UH Y i n/a 10 1228 1315 1383 N
+ D UH Y s n/a 10 1228 1315 1383 N
+ D UH Z b n/a 10 1245 1314 1382 N
+ D UH Z e n/a 10 1227 1314 1382 N
+ D UH Z i n/a 10 1227 1314 1382 N
+ D UH Z s n/a 10 1227 1314 1382 N
+ D UH ZH e n/a 10 1227 1314 1383 N
+ D UH ZH i n/a 10 1227 1314 1383 N
+ D UH ZH s n/a 10 1227 1314 1383 N
+ D UW AA b n/a 10 1245 1337 1348 N
+ D UW AA e n/a 10 1234 1320 1415 N
+ D UW AA i n/a 10 1234 1320 1356 N
+ D UW AA s n/a 10 1234 1320 1356 N
+ D UW AE b n/a 10 1245 1337 1343 N
+ D UW AE e n/a 10 1234 1320 1406 N
+ D UW AE i n/a 10 1234 1320 1354 N
+ D UW AE s n/a 10 1234 1320 1354 N
+ D UW AH b n/a 10 1245 1337 1348 N
+ D UW AH e n/a 10 1234 1320 1407 N
+ D UW AH i n/a 10 1234 1320 1352 N
+ D UW AH s n/a 10 1234 1320 1352 N
+ D UW AO b n/a 10 1245 1337 1345 N
+ D UW AO e n/a 10 1234 1320 1415 N
+ D UW AO i n/a 10 1234 1320 1356 N
+ D UW AO s n/a 10 1234 1320 1356 N
+ D UW AW b n/a 10 1245 1337 1344 N
+ D UW AW e n/a 10 1234 1320 1416 N
+ D UW AW s n/a 10 1234 1320 1354 N
+ D UW AY b n/a 10 1245 1337 1349 N
+ D UW AY e n/a 10 1234 1320 1411 N
+ D UW AY i n/a 10 1234 1320 1356 N
+ D UW AY s n/a 10 1234 1320 1356 N
+ D UW B b n/a 10 1245 1314 1394 N
+ D UW B e n/a 10 1226 1314 1394 N
+ D UW B s n/a 10 1226 1314 1394 N
+ D UW CH e n/a 10 1228 1314 1374 N
+ D UW CH s n/a 10 1228 1314 1374 N
+ D UW D b n/a 10 1245 1314 1394 N
+ D UW D e n/a 10 1226 1314 1394 N
+ D UW D s n/a 10 1226 1314 1394 N
+ D UW DH e n/a 10 1227 1314 1376 N
+ D UW DH s n/a 10 1227 1314 1376 N
+ D UW EH b n/a 10 1245 1337 1343 N
+ D UW EH e n/a 10 1234 1320 1405 N
+ D UW EH i n/a 10 1234 1320 1354 N
+ D UW EH s n/a 10 1234 1320 1354 N
+ D UW ER b n/a 10 1245 1337 1350 N
+ D UW ER e n/a 10 1234 1320 1415 N
+ D UW ER i n/a 10 1234 1320 1357 N
+ D UW ER s n/a 10 1234 1320 1357 N
+ D UW EY b n/a 10 1245 1337 1343 N
+ D UW EY e n/a 10 1234 1320 1405 N
+ D UW EY i n/a 10 1234 1320 1354 N
+ D UW EY s n/a 10 1234 1320 1354 N
+ D UW F b n/a 10 1245 1319 1377 N
+ D UW F e n/a 10 1228 1319 1377 N
+ D UW F s n/a 10 1228 1319 1377 N
+ D UW G b n/a 10 1245 1315 1395 N
+ D UW G e n/a 10 1226 1315 1395 N
+ D UW G s n/a 10 1226 1315 1395 N
+ D UW HH b n/a 10 1245 1337 1388 N
+ D UW HH e n/a 10 1234 1334 1388 N
+ D UW HH i n/a 10 1234 1334 1388 N
+ D UW HH s n/a 10 1234 1334 1388 N
+ D UW IH b n/a 10 1245 1337 1366 N
+ D UW IH e n/a 10 1234 1331 1410 N
+ D UW IH i n/a 10 1234 1331 1370 N
+ D UW IH s n/a 10 1234 1331 1366 N
+ D UW IY b n/a 10 1245 1337 1367 N
+ D UW IY e n/a 10 1234 1331 1410 N
+ D UW IY i n/a 10 1234 1331 1370 N
+ D UW IY s n/a 10 1234 1331 1367 N
+ D UW JH e n/a 10 1226 1314 1374 N
+ D UW JH s n/a 10 1226 1314 1374 N
+ D UW K e n/a 10 1228 1315 1380 N
+ D UW K i n/a 10 1228 1315 1380 N
+ D UW K s n/a 10 1228 1315 1380 N
+ D UW L b n/a 10 1245 1337 1345 N
+ D UW L e n/a 10 1228 1333 1400 N
+ D UW L i n/a 10 1228 1333 1353 N
+ D UW L s n/a 10 1228 1333 1353 N
+ D UW M b n/a 10 1245 1314 1396 N
+ D UW M e n/a 10 1226 1314 1396 N
+ D UW M i n/a 10 1226 1314 1396 N
+ D UW M s n/a 10 1226 1314 1396 N
+ D UW N b n/a 10 1245 1314 1396 N
+ D UW N e n/a 10 1226 1314 1396 N
+ D UW N i n/a 10 1226 1314 1396 N
+ D UW N s n/a 10 1226 1314 1396 N
+ D UW NG e n/a 10 1226 1315 1396 N
+ D UW NG s n/a 10 1226 1315 1396 N
+ D UW OW b n/a 10 1245 1337 1348 N
+ D UW OW e n/a 10 1234 1320 1415 N
+ D UW OW i n/a 10 1234 1320 1356 N
+ D UW OW s n/a 10 1234 1320 1356 N
+ D UW OY b n/a 10 1245 1337 1345 N
+ D UW OY e n/a 10 1234 1320 1411 N
+ D UW OY i n/a 10 1234 1320 1356 N
+ D UW OY s n/a 10 1234 1320 1356 N
+ D UW P e n/a 10 1228 1314 1375 N
+ D UW P s n/a 10 1228 1314 1375 N
+ D UW R b n/a 10 1245 1337 1360 N
+ D UW R e n/a 10 1228 1332 1401 N
+ D UW R i n/a 10 1228 1333 1361 N
+ D UW R s n/a 10 1228 1332 1361 N
+ D UW S b n/a 10 1245 1319 1382 N
+ D UW S e n/a 10 1228 1319 1382 N
+ D UW S i n/a 10 1228 1319 1382 N
+ D UW S s n/a 10 1228 1319 1382 N
+ D UW SH e n/a 10 1228 1319 1383 N
+ D UW SH s n/a 10 1228 1319 1383 N
+ D UW SIL e n/a 10 1228 1339 1420 N
+ D UW SIL s n/a 10 1228 1337 1420 N
+ D UW T e n/a 10 1228 1314 1374 N
+ D UW T i n/a 10 1228 1314 1374 N
+ D UW T s n/a 10 1228 1314 1374 N
+ D UW TH e n/a 10 1228 1319 1380 N
+ D UW TH s n/a 10 1228 1319 1380 N
+ D UW UH b n/a 10 1245 1337 1363 N
+ D UW UH e n/a 10 1234 1331 1410 N
+ D UW UH s n/a 10 1234 1331 1363 N
+ D UW UW b n/a 10 1245 1337 1363 N
+ D UW UW e n/a 10 1234 1331 1410 N
+ D UW UW i n/a 10 1234 1331 1363 N
+ D UW UW s n/a 10 1234 1331 1363 N
+ D UW V b n/a 10 1245 1314 1380 N
+ D UW V e n/a 10 1227 1314 1380 N
+ D UW V i n/a 10 1227 1314 1380 N
+ D UW V s n/a 10 1227 1314 1380 N
+ D UW W b n/a 10 1245 1337 1345 N
+ D UW W e n/a 10 1228 1332 1401 N
+ D UW W i n/a 10 1228 1332 1353 N
+ D UW W s n/a 10 1228 1332 1353 N
+ D UW Y b n/a 10 1245 1315 1383 N
+ D UW Y e n/a 10 1228 1315 1383 N
+ D UW Y i n/a 10 1228 1315 1383 N
+ D UW Y s n/a 10 1228 1315 1383 N
+ D UW Z b n/a 10 1245 1314 1382 N
+ D UW Z e n/a 10 1227 1314 1382 N
+ D UW Z i n/a 10 1227 1314 1382 N
+ D UW Z s n/a 10 1227 1314 1382 N
+ D UW ZH e n/a 10 1227 1314 1383 N
+ D UW ZH s n/a 10 1227 1314 1383 N
+ D V AA b n/a 10 1274 1297 1347 N
+ D V AA e n/a 10 1274 1297 1415 N
+ D V AA s n/a 10 1274 1297 1347 N
+ D V AE b n/a 10 1274 1297 1342 N
+ D V AE e n/a 10 1274 1297 1405 N
+ D V AE s n/a 10 1274 1297 1342 N
+ D V AH b n/a 10 1274 1297 1347 N
+ D V AH e n/a 10 1274 1297 1414 N
+ D V AH i n/a 10 1274 1297 1351 N
+ D V AH s n/a 10 1274 1297 1347 N
+ D V AO b n/a 10 1274 1297 1345 N
+ D V AO e n/a 10 1274 1297 1415 N
+ D V AO s n/a 10 1274 1297 1345 N
+ D V AW b n/a 10 1274 1297 1344 N
+ D V AW e n/a 10 1274 1297 1416 N
+ D V AW s n/a 10 1274 1297 1344 N
+ D V AY b n/a 10 1274 1297 1349 N
+ D V AY e n/a 10 1274 1297 1411 N
+ D V AY s n/a 10 1274 1297 1349 N
+ D V B b n/a 10 1274 1287 1399 N
+ D V B e n/a 10 1274 1287 1399 N
+ D V B s n/a 10 1274 1287 1399 N
+ D V CH e n/a 10 1272 1286 1385 N
+ D V CH s n/a 10 1272 1286 1385 N
+ D V D b n/a 10 1274 1287 1399 N
+ D V D e n/a 10 1274 1287 1399 N
+ D V D s n/a 10 1274 1287 1399 N
+ D V DH e n/a 10 1274 1287 1399 N
+ D V DH s n/a 10 1274 1287 1399 N
+ D V EH b n/a 10 1274 1297 1342 N
+ D V EH e n/a 10 1274 1297 1405 N
+ D V EH i n/a 10 1274 1297 1342 N
+ D V EH s n/a 10 1274 1297 1342 N
+ D V ER b n/a 10 1274 1297 1350 N
+ D V ER e n/a 10 1274 1297 1415 N
+ D V ER s n/a 10 1274 1297 1357 N
+ D V EY b n/a 10 1274 1297 1342 N
+ D V EY e n/a 10 1274 1297 1405 N
+ D V EY i n/a 10 1274 1297 1342 N
+ D V EY s n/a 10 1274 1297 1342 N
+ D V F b n/a 10 1274 1286 1379 N
+ D V F e n/a 10 1272 1286 1379 N
+ D V F s n/a 10 1272 1286 1379 N
+ D V G b n/a 10 1274 1287 1399 N
+ D V G e n/a 10 1274 1287 1399 N
+ D V G s n/a 10 1274 1287 1399 N
+ D V HH b n/a 10 1274 1286 1389 N
+ D V HH e n/a 10 1272 1286 1389 N
+ D V HH s n/a 10 1272 1286 1389 N
+ D V IH b n/a 10 1274 1297 1364 N
+ D V IH e n/a 10 1274 1297 1408 N
+ D V IH s n/a 10 1274 1297 1364 N
+ D V IY b n/a 10 1274 1297 1363 N
+ D V IY e n/a 10 1274 1297 1408 N
+ D V IY i n/a 10 1274 1297 1370 N
+ D V IY s n/a 10 1274 1297 1363 N
+ D V JH e n/a 10 1274 1287 1399 N
+ D V JH s n/a 10 1274 1287 1399 N
+ D V K e n/a 10 1272 1286 1379 N
+ D V K s n/a 10 1272 1286 1379 N
+ D V L b n/a 10 1274 1286 1345 N
+ D V L e n/a 10 1274 1286 1400 N
+ D V L i n/a 10 1274 1286 1350 N
+ D V L s n/a 10 1274 1286 1345 N
+ D V M b n/a 10 1274 1287 1399 N
+ D V M e n/a 10 1274 1287 1399 N
+ D V M s n/a 10 1274 1287 1399 N
+ D V N b n/a 10 1274 1287 1399 N
+ D V N e n/a 10 1274 1287 1399 N
+ D V N i n/a 10 1274 1287 1399 N
+ D V N s n/a 10 1274 1287 1399 N
+ D V NG e n/a 10 1274 1287 1399 N
+ D V NG s n/a 10 1274 1287 1399 N
+ D V OW b n/a 10 1274 1297 1346 N
+ D V OW e n/a 10 1274 1297 1415 N
+ D V OW s n/a 10 1274 1297 1346 N
+ D V OY b n/a 10 1274 1297 1345 N
+ D V OY e n/a 10 1274 1297 1411 N
+ D V OY s n/a 10 1274 1297 1345 N
+ D V P e n/a 10 1272 1286 1379 N
+ D V P s n/a 10 1272 1286 1379 N
+ D V R b n/a 10 1274 1286 1360 N
+ D V R e n/a 10 1274 1286 1401 N
+ D V R s n/a 10 1274 1286 1361 N
+ D V S b n/a 10 1274 1287 1385 N
+ D V S e n/a 10 1272 1287 1385 N
+ D V S i n/a 10 1272 1287 1385 N
+ D V S s n/a 10 1272 1287 1385 N
+ D V SH e n/a 10 1272 1286 1385 N
+ D V SH s n/a 10 1272 1286 1385 N
+ D V SIL e n/a 10 1272 1286 1421 N
+ D V SIL s n/a 10 1272 1286 1421 N
+ D V T e n/a 10 1272 1287 1379 N
+ D V T s n/a 10 1272 1287 1379 N
+ D V TH e n/a 10 1272 1287 1379 N
+ D V TH s n/a 10 1272 1287 1379 N
+ D V UH b n/a 10 1274 1297 1363 N
+ D V UH e n/a 10 1274 1297 1408 N
+ D V UH s n/a 10 1274 1297 1363 N
+ D V UW b n/a 10 1274 1297 1363 N
+ D V UW e n/a 10 1274 1297 1408 N
+ D V UW s n/a 10 1274 1297 1363 N
+ D V V b n/a 10 1274 1287 1399 N
+ D V V e n/a 10 1274 1287 1399 N
+ D V V s n/a 10 1274 1287 1399 N
+ D V W b n/a 10 1274 1286 1345 N
+ D V W e n/a 10 1274 1286 1400 N
+ D V W s n/a 10 1274 1286 1345 N
+ D V Y b n/a 10 1274 1287 1399 N
+ D V Y e n/a 10 1274 1287 1399 N
+ D V Y s n/a 10 1274 1287 1399 N
+ D V Z b n/a 10 1274 1287 1399 N
+ D V Z e n/a 10 1274 1287 1399 N
+ D V Z s n/a 10 1274 1287 1399 N
+ D V ZH e n/a 10 1274 1287 1399 N
+ D V ZH s n/a 10 1274 1287 1399 N
+ D W AA b n/a 10 1276 1308 1347 N
+ D W AA s n/a 10 1275 1307 1356 N
+ D W AE b n/a 10 1276 1308 1343 N
+ D W AE s n/a 10 1275 1307 1354 N
+ D W AH b n/a 10 1276 1308 1346 N
+ D W AH s n/a 10 1275 1307 1353 N
+ D W AO b n/a 10 1276 1308 1345 N
+ D W AO s n/a 10 1275 1307 1356 N
+ D W AW b n/a 10 1276 1308 1344 N
+ D W AW s n/a 10 1275 1307 1354 N
+ D W AY b n/a 10 1276 1308 1349 N
+ D W AY s n/a 10 1275 1307 1356 N
+ D W B b n/a 10 1276 1284 1398 N
+ D W B s n/a 10 1277 1284 1398 N
+ D W CH s n/a 10 1277 1283 1383 N
+ D W D b n/a 10 1276 1284 1398 N
+ D W D s n/a 10 1276 1284 1398 N
+ D W DH s n/a 10 1276 1284 1398 N
+ D W EH b n/a 10 1276 1308 1343 N
+ D W EH s n/a 10 1275 1307 1354 N
+ D W ER b n/a 10 1276 1308 1350 N
+ D W ER s n/a 10 1275 1307 1359 N
+ D W EY b n/a 10 1276 1308 1343 N
+ D W EY s n/a 10 1275 1307 1354 N
+ D W F b n/a 10 1276 1283 1379 N
+ D W F s n/a 10 1277 1283 1379 N
+ D W G b n/a 10 1276 1283 1398 N
+ D W G s n/a 10 1277 1283 1398 N
+ D W HH b n/a 10 1276 1285 1386 N
+ D W HH s n/a 10 1277 1285 1386 N
+ D W IH b n/a 10 1276 1308 1366 N
+ D W IH s n/a 10 1275 1307 1366 N
+ D W IY b n/a 10 1276 1308 1367 N
+ D W IY s n/a 10 1275 1307 1367 N
+ D W JH s n/a 10 1276 1283 1398 N
+ D W K s n/a 10 1277 1283 1379 N
+ D W L b n/a 10 1276 1283 1345 N
+ D W L s n/a 10 1277 1283 1353 N
+ D W M b n/a 10 1276 1284 1398 N
+ D W M s n/a 10 1277 1284 1398 N
+ D W N b n/a 10 1276 1284 1398 N
+ D W N s n/a 10 1276 1284 1398 N
+ D W NG s n/a 10 1277 1283 1398 N
+ D W OW b n/a 10 1276 1308 1346 N
+ D W OW s n/a 10 1275 1307 1356 N
+ D W OY b n/a 10 1276 1308 1345 N
+ D W OY s n/a 10 1275 1307 1356 N
+ D W P s n/a 10 1277 1284 1379 N
+ D W R b n/a 10 1276 1283 1360 N
+ D W R s n/a 10 1277 1283 1361 N
+ D W S b n/a 10 1276 1284 1382 N
+ D W S i n/a 10 1277 1284 1382 N
+ D W S s n/a 10 1277 1284 1382 N
+ D W SH s n/a 10 1277 1283 1383 N
+ D W SIL s n/a 10 1277 1285 1423 N
+ D W T s n/a 10 1276 1284 1379 N
+ D W TH s n/a 10 1276 1284 1379 N
+ D W UH b n/a 10 1276 1308 1363 N
+ D W UH s n/a 10 1275 1307 1363 N
+ D W UW b n/a 10 1276 1308 1363 N
+ D W UW s n/a 10 1275 1307 1363 N
+ D W V b n/a 10 1276 1283 1397 N
+ D W V s n/a 10 1277 1283 1397 N
+ D W W b n/a 10 1276 1283 1345 N
+ D W W s n/a 10 1277 1283 1353 N
+ D W Y b n/a 10 1276 1283 1397 N
+ D W Y s n/a 10 1276 1283 1397 N
+ D W Z b n/a 10 1276 1284 1397 N
+ D W Z s n/a 10 1277 1284 1397 N
+ D W ZH s n/a 10 1276 1283 1397 N
+ D Y AA b n/a 10 1276 1308 1347 N
+ D Y AA s n/a 10 1275 1307 1356 N
+ D Y AE b n/a 10 1276 1308 1343 N
+ D Y AE s n/a 10 1275 1307 1354 N
+ D Y AH b n/a 10 1276 1308 1347 N
+ D Y AH s n/a 10 1275 1307 1354 N
+ D Y AO b n/a 10 1276 1308 1345 N
+ D Y AO s n/a 10 1275 1307 1356 N
+ D Y AW b n/a 10 1276 1308 1344 N
+ D Y AW s n/a 10 1275 1307 1354 N
+ D Y AY b n/a 10 1276 1308 1349 N
+ D Y AY s n/a 10 1275 1307 1356 N
+ D Y B b n/a 10 1276 1282 1398 N
+ D Y B s n/a 10 1277 1282 1398 N
+ D Y CH s n/a 10 1277 1282 1383 N
+ D Y D b n/a 10 1276 1282 1398 N
+ D Y D s n/a 10 1276 1282 1398 N
+ D Y DH s n/a 10 1276 1282 1398 N
+ D Y EH b n/a 10 1276 1308 1343 N
+ D Y EH s n/a 10 1275 1307 1354 N
+ D Y ER b n/a 10 1276 1308 1350 N
+ D Y ER s n/a 10 1275 1307 1357 N
+ D Y EY b n/a 10 1276 1308 1343 N
+ D Y EY s n/a 10 1275 1307 1354 N
+ D Y F b n/a 10 1276 1282 1379 N
+ D Y F s n/a 10 1277 1282 1379 N
+ D Y G b n/a 10 1276 1282 1398 N
+ D Y G s n/a 10 1277 1282 1398 N
+ D Y HH b n/a 10 1276 1282 1386 N
+ D Y HH s n/a 10 1277 1282 1386 N
+ D Y IH b n/a 10 1276 1308 1365 N
+ D Y IH s n/a 10 1275 1307 1365 N
+ D Y IY b n/a 10 1276 1308 1367 N
+ D Y IY s n/a 10 1275 1307 1367 N
+ D Y JH s n/a 10 1276 1282 1398 N
+ D Y K s n/a 10 1277 1282 1379 N
+ D Y L b n/a 10 1276 1282 1345 N
+ D Y L s n/a 10 1277 1282 1353 N
+ D Y M b n/a 10 1276 1282 1398 N
+ D Y M s n/a 10 1277 1282 1398 N
+ D Y N b n/a 10 1276 1282 1398 N
+ D Y N s n/a 10 1276 1282 1398 N
+ D Y NG s n/a 10 1277 1282 1398 N
+ D Y OW b n/a 10 1276 1308 1346 N
+ D Y OW s n/a 10 1275 1307 1356 N
+ D Y OY b n/a 10 1276 1308 1345 N
+ D Y OY s n/a 10 1275 1307 1356 N
+ D Y P s n/a 10 1277 1282 1379 N
+ D Y R b n/a 10 1276 1282 1360 N
+ D Y R s n/a 10 1277 1282 1361 N
+ D Y S b n/a 10 1276 1282 1382 N
+ D Y S s n/a 10 1277 1282 1382 N
+ D Y SH s n/a 10 1277 1282 1383 N
+ D Y SIL s n/a 10 1277 1282 1419 N
+ D Y T s n/a 10 1276 1282 1379 N
+ D Y TH s n/a 10 1276 1282 1379 N
+ D Y UH b n/a 10 1276 1308 1363 N
+ D Y UH s n/a 10 1275 1307 1363 N
+ D Y UW b n/a 10 1276 1308 1363 N
+ D Y UW i n/a 10 1275 1307 1363 N
+ D Y UW s n/a 10 1275 1307 1363 N
+ D Y V b n/a 10 1276 1282 1397 N
+ D Y V s n/a 10 1277 1282 1397 N
+ D Y W b n/a 10 1276 1282 1345 N
+ D Y W s n/a 10 1277 1282 1353 N
+ D Y Y b n/a 10 1276 1282 1397 N
+ D Y Y s n/a 10 1276 1282 1397 N
+ D Y Z b n/a 10 1276 1282 1397 N
+ D Y Z s n/a 10 1277 1282 1397 N
+ D Y ZH s n/a 10 1276 1282 1397 N
+ D Z AA b n/a 10 1273 1297 1347 N
+ D Z AA e n/a 10 1272 1297 1415 N
+ D Z AA i n/a 10 1272 1297 1347 N
+ D Z AA s n/a 10 1272 1297 1347 N
+ D Z AE b n/a 10 1273 1297 1342 N
+ D Z AE e n/a 10 1272 1297 1405 N
+ D Z AE i n/a 10 1272 1297 1342 N
+ D Z AE s n/a 10 1272 1297 1342 N
+ D Z AH b n/a 10 1273 1297 1347 N
+ D Z AH e n/a 10 1272 1297 1414 N
+ D Z AH i n/a 10 1272 1297 1351 N
+ D Z AH s n/a 10 1272 1297 1347 N
+ D Z AO b n/a 10 1273 1297 1345 N
+ D Z AO e n/a 10 1272 1297 1415 N
+ D Z AO i n/a 10 1272 1297 1345 N
+ D Z AO s n/a 10 1272 1297 1345 N
+ D Z AW b n/a 10 1273 1297 1344 N
+ D Z AW e n/a 10 1272 1297 1416 N
+ D Z AW i n/a 10 1272 1297 1344 N
+ D Z AW s n/a 10 1272 1297 1344 N
+ D Z AY b n/a 10 1273 1297 1349 N
+ D Z AY e n/a 10 1272 1297 1411 N
+ D Z AY i n/a 10 1272 1297 1349 N
+ D Z AY s n/a 10 1272 1297 1349 N
+ D Z B b n/a 10 1273 1287 1399 N
+ D Z B e n/a 10 1272 1287 1399 N
+ D Z B s n/a 10 1272 1287 1399 N
+ D Z CH e n/a 10 1272 1287 1385 N
+ D Z CH s n/a 10 1272 1287 1385 N
+ D Z D b n/a 10 1273 1287 1399 N
+ D Z D e n/a 10 1272 1287 1399 N
+ D Z D s n/a 10 1272 1287 1399 N
+ D Z DH e n/a 10 1272 1287 1399 N
+ D Z DH s n/a 10 1272 1287 1399 N
+ D Z EH b n/a 10 1273 1297 1342 N
+ D Z EH e n/a 10 1272 1297 1405 N
+ D Z EH i n/a 10 1272 1297 1342 N
+ D Z EH s n/a 10 1272 1297 1342 N
+ D Z ER b n/a 10 1273 1297 1350 N
+ D Z ER e n/a 10 1272 1297 1415 N
+ D Z ER s n/a 10 1272 1297 1357 N
+ D Z EY b n/a 10 1273 1297 1342 N
+ D Z EY e n/a 10 1272 1297 1405 N
+ D Z EY i n/a 10 1272 1297 1342 N
+ D Z EY s n/a 10 1272 1297 1342 N
+ D Z F b n/a 10 1273 1287 1379 N
+ D Z F e n/a 10 1272 1287 1379 N
+ D Z F i n/a 10 1272 1287 1379 N
+ D Z F s n/a 10 1272 1287 1379 N
+ D Z G b n/a 10 1273 1287 1399 N
+ D Z G e n/a 10 1272 1287 1399 N
+ D Z G s n/a 10 1272 1287 1399 N
+ D Z HH b n/a 10 1273 1287 1389 N
+ D Z HH e n/a 10 1272 1287 1389 N
+ D Z HH s n/a 10 1272 1287 1389 N
+ D Z IH b n/a 10 1273 1297 1364 N
+ D Z IH e n/a 10 1272 1297 1408 N
+ D Z IH i n/a 10 1272 1297 1370 N
+ D Z IH s n/a 10 1272 1297 1364 N
+ D Z IY b n/a 10 1273 1297 1363 N
+ D Z IY e n/a 10 1272 1297 1408 N
+ D Z IY i n/a 10 1272 1297 1370 N
+ D Z IY s n/a 10 1272 1297 1363 N
+ D Z JH e n/a 10 1272 1287 1399 N
+ D Z JH s n/a 10 1272 1287 1399 N
+ D Z K e n/a 10 1272 1287 1379 N
+ D Z K s n/a 10 1272 1287 1379 N
+ D Z L b n/a 10 1272 1286 1345 N
+ D Z L e n/a 10 1272 1286 1400 N
+ D Z L i n/a 10 1272 1286 1350 N
+ D Z L s n/a 10 1272 1286 1345 N
+ D Z M b n/a 10 1273 1287 1399 N
+ D Z M e n/a 10 1272 1287 1399 N
+ D Z M s n/a 10 1272 1287 1399 N
+ D Z N b n/a 10 1273 1287 1399 N
+ D Z N e n/a 10 1272 1287 1399 N
+ D Z N i n/a 10 1272 1287 1399 N
+ D Z N s n/a 10 1272 1287 1399 N
+ D Z NG e n/a 10 1272 1287 1399 N
+ D Z NG s n/a 10 1272 1287 1399 N
+ D Z OW b n/a 10 1273 1297 1346 N
+ D Z OW e n/a 10 1272 1297 1415 N
+ D Z OW s n/a 10 1272 1297 1346 N
+ D Z OY b n/a 10 1273 1297 1345 N
+ D Z OY e n/a 10 1272 1297 1411 N
+ D Z OY s n/a 10 1272 1297 1345 N
+ D Z P e n/a 10 1272 1287 1379 N
+ D Z P s n/a 10 1272 1287 1379 N
+ D Z R b n/a 10 1272 1286 1360 N
+ D Z R e n/a 10 1272 1286 1401 N
+ D Z R i n/a 10 1272 1286 1361 N
+ D Z R s n/a 10 1272 1286 1361 N
+ D Z S b n/a 10 1273 1287 1385 N
+ D Z S e n/a 10 1272 1287 1385 N
+ D Z S s n/a 10 1272 1287 1385 N
+ D Z SH e n/a 10 1272 1287 1385 N
+ D Z SH s n/a 10 1272 1287 1385 N
+ D Z SIL e n/a 10 1272 1287 1421 N
+ D Z SIL s n/a 10 1272 1287 1421 N
+ D Z T e n/a 10 1272 1287 1379 N
+ D Z T s n/a 10 1272 1287 1379 N
+ D Z TH e n/a 10 1272 1287 1379 N
+ D Z TH s n/a 10 1272 1287 1379 N
+ D Z UH b n/a 10 1273 1297 1363 N
+ D Z UH e n/a 10 1272 1297 1408 N
+ D Z UH s n/a 10 1272 1297 1363 N
+ D Z UW b n/a 10 1273 1297 1363 N
+ D Z UW e n/a 10 1272 1297 1408 N
+ D Z UW i n/a 10 1272 1297 1363 N
+ D Z UW s n/a 10 1272 1297 1363 N
+ D Z V b n/a 10 1273 1287 1399 N
+ D Z V e n/a 10 1272 1287 1399 N
+ D Z V i n/a 10 1272 1287 1399 N
+ D Z V s n/a 10 1272 1287 1399 N
+ D Z W b n/a 10 1272 1286 1345 N
+ D Z W e n/a 10 1272 1286 1400 N
+ D Z W s n/a 10 1272 1286 1345 N
+ D Z Y b n/a 10 1273 1287 1399 N
+ D Z Y e n/a 10 1272 1287 1399 N
+ D Z Y s n/a 10 1272 1287 1399 N
+ D Z Z b n/a 10 1273 1287 1399 N
+ D Z Z e n/a 10 1272 1287 1399 N
+ D Z Z i n/a 10 1272 1287 1399 N
+ D Z Z s n/a 10 1272 1287 1399 N
+ D Z ZH e n/a 10 1272 1287 1399 N
+ D Z ZH s n/a 10 1272 1287 1399 N
+ D ZH AA b n/a 10 1273 1297 1347 N
+ D ZH AA e n/a 10 1272 1297 1415 N
+ D ZH AA s n/a 10 1272 1297 1347 N
+ D ZH AE b n/a 10 1273 1297 1342 N
+ D ZH AE e n/a 10 1272 1297 1405 N
+ D ZH AE s n/a 10 1272 1297 1342 N
+ D ZH AH b n/a 10 1273 1297 1347 N
+ D ZH AH e n/a 10 1272 1297 1414 N
+ D ZH AH i n/a 10 1272 1297 1351 N
+ D ZH AH s n/a 10 1272 1297 1347 N
+ D ZH AO b n/a 10 1273 1297 1345 N
+ D ZH AO e n/a 10 1272 1297 1415 N
+ D ZH AO s n/a 10 1272 1297 1345 N
+ D ZH AW b n/a 10 1273 1297 1344 N
+ D ZH AW e n/a 10 1272 1297 1416 N
+ D ZH AW s n/a 10 1272 1297 1344 N
+ D ZH AY b n/a 10 1273 1297 1349 N
+ D ZH AY e n/a 10 1272 1297 1411 N
+ D ZH AY s n/a 10 1272 1297 1349 N
+ D ZH B b n/a 10 1273 1287 1399 N
+ D ZH B e n/a 10 1272 1287 1399 N
+ D ZH B s n/a 10 1272 1287 1399 N
+ D ZH CH e n/a 10 1272 1287 1385 N
+ D ZH CH s n/a 10 1272 1287 1385 N
+ D ZH D b n/a 10 1273 1287 1399 N
+ D ZH D e n/a 10 1272 1287 1399 N
+ D ZH D s n/a 10 1272 1287 1399 N
+ D ZH DH e n/a 10 1272 1287 1399 N
+ D ZH DH s n/a 10 1272 1287 1399 N
+ D ZH EH b n/a 10 1273 1297 1342 N
+ D ZH EH e n/a 10 1272 1297 1405 N
+ D ZH EH s n/a 10 1272 1297 1342 N
+ D ZH ER b n/a 10 1273 1297 1350 N
+ D ZH ER e n/a 10 1272 1297 1415 N
+ D ZH ER s n/a 10 1272 1297 1357 N
+ D ZH EY b n/a 10 1273 1297 1342 N
+ D ZH EY e n/a 10 1272 1297 1405 N
+ D ZH EY s n/a 10 1272 1297 1342 N
+ D ZH F b n/a 10 1273 1287 1379 N
+ D ZH F e n/a 10 1272 1287 1379 N
+ D ZH F s n/a 10 1272 1287 1379 N
+ D ZH G b n/a 10 1273 1287 1399 N
+ D ZH G e n/a 10 1272 1287 1399 N
+ D ZH G s n/a 10 1272 1287 1399 N
+ D ZH HH b n/a 10 1273 1287 1389 N
+ D ZH HH e n/a 10 1272 1287 1389 N
+ D ZH HH s n/a 10 1272 1287 1389 N
+ D ZH IH b n/a 10 1273 1297 1364 N
+ D ZH IH e n/a 10 1272 1297 1408 N
+ D ZH IH s n/a 10 1272 1297 1364 N
+ D ZH IY b n/a 10 1273 1297 1363 N
+ D ZH IY e n/a 10 1272 1297 1408 N
+ D ZH IY s n/a 10 1272 1297 1363 N
+ D ZH JH e n/a 10 1272 1287 1399 N
+ D ZH JH s n/a 10 1272 1287 1399 N
+ D ZH K e n/a 10 1272 1287 1379 N
+ D ZH K s n/a 10 1272 1287 1379 N
+ D ZH L b n/a 10 1272 1286 1345 N
+ D ZH L e n/a 10 1272 1286 1400 N
+ D ZH L s n/a 10 1272 1286 1345 N
+ D ZH M b n/a 10 1273 1287 1399 N
+ D ZH M e n/a 10 1272 1287 1399 N
+ D ZH M s n/a 10 1272 1287 1399 N
+ D ZH N b n/a 10 1273 1287 1399 N
+ D ZH N e n/a 10 1272 1287 1399 N
+ D ZH N s n/a 10 1272 1287 1399 N
+ D ZH NG e n/a 10 1272 1287 1399 N
+ D ZH NG s n/a 10 1272 1287 1399 N
+ D ZH OW b n/a 10 1273 1297 1346 N
+ D ZH OW e n/a 10 1272 1297 1415 N
+ D ZH OW s n/a 10 1272 1297 1346 N
+ D ZH OY b n/a 10 1273 1297 1345 N
+ D ZH OY e n/a 10 1272 1297 1411 N
+ D ZH OY s n/a 10 1272 1297 1345 N
+ D ZH P e n/a 10 1272 1287 1379 N
+ D ZH P s n/a 10 1272 1287 1379 N
+ D ZH R b n/a 10 1272 1286 1360 N
+ D ZH R e n/a 10 1272 1286 1401 N
+ D ZH R s n/a 10 1272 1286 1361 N
+ D ZH S b n/a 10 1273 1287 1385 N
+ D ZH S e n/a 10 1272 1287 1385 N
+ D ZH S s n/a 10 1272 1287 1385 N
+ D ZH SH e n/a 10 1272 1287 1385 N
+ D ZH SH s n/a 10 1272 1287 1385 N
+ D ZH SIL e n/a 10 1272 1287 1421 N
+ D ZH SIL s n/a 10 1272 1287 1421 N
+ D ZH T e n/a 10 1272 1287 1379 N
+ D ZH T s n/a 10 1272 1287 1379 N
+ D ZH TH e n/a 10 1272 1287 1379 N
+ D ZH TH s n/a 10 1272 1287 1379 N
+ D ZH UH b n/a 10 1273 1297 1363 N
+ D ZH UH e n/a 10 1272 1297 1408 N
+ D ZH UH s n/a 10 1272 1297 1363 N
+ D ZH UW b n/a 10 1273 1297 1363 N
+ D ZH UW e n/a 10 1272 1297 1408 N
+ D ZH UW s n/a 10 1272 1297 1363 N
+ D ZH V b n/a 10 1273 1287 1399 N
+ D ZH V e n/a 10 1272 1287 1399 N
+ D ZH V s n/a 10 1272 1287 1399 N
+ D ZH W b n/a 10 1272 1286 1345 N
+ D ZH W e n/a 10 1272 1286 1400 N
+ D ZH W s n/a 10 1272 1286 1345 N
+ D ZH Y b n/a 10 1273 1287 1399 N
+ D ZH Y e n/a 10 1272 1287 1399 N
+ D ZH Y s n/a 10 1272 1287 1399 N
+ D ZH Z b n/a 10 1273 1287 1399 N
+ D ZH Z e n/a 10 1272 1287 1399 N
+ D ZH Z s n/a 10 1272 1287 1399 N
+ D ZH ZH e n/a 10 1272 1287 1399 N
+ D ZH ZH s n/a 10 1272 1287 1399 N
+ DH AA AA e n/a 11 1436 1476 1503 N
+ DH AA AA i n/a 11 1435 1476 1503 N
+ DH AA AE b n/a 11 1436 1476 1516 N
+ DH AA AE e n/a 11 1436 1476 1516 N
+ DH AA AH b n/a 11 1436 1472 1503 N
+ DH AA AH e n/a 11 1436 1472 1503 N
+ DH AA AH i n/a 11 1435 1472 1503 N
+ DH AA AO e n/a 11 1436 1476 1503 N
+ DH AA AW b n/a 11 1436 1476 1516 N
+ DH AA AW e n/a 11 1436 1476 1516 N
+ DH AA AY b n/a 11 1436 1476 1503 N
+ DH AA AY e n/a 11 1436 1476 1503 N
+ DH AA B e n/a 11 1436 1478 1508 N
+ DH AA CH e n/a 11 1436 1478 1508 N
+ DH AA D e n/a 11 1436 1478 1508 N
+ DH AA D i n/a 11 1435 1478 1508 N
+ DH AA DH e n/a 11 1436 1478 1508 N
+ DH AA EH b n/a 11 1436 1475 1511 N
+ DH AA EH e n/a 11 1436 1475 1511 N
+ DH AA ER b n/a 11 1438 1482 1519 N
+ DH AA ER e n/a 11 1438 1482 1519 N
+ DH AA ER i n/a 11 1438 1482 1519 N
+ DH AA EY b n/a 11 1436 1475 1513 N
+ DH AA EY e n/a 11 1436 1475 1513 N
+ DH AA F e n/a 11 1436 1478 1508 N
+ DH AA G e n/a 11 1436 1478 1508 N
+ DH AA HH e n/a 11 1436 1478 1508 N
+ DH AA IH b n/a 11 1436 1472 1505 N
+ DH AA IH e n/a 11 1436 1472 1505 N
+ DH AA IY b n/a 11 1436 1479 1490 N
+ DH AA IY e n/a 11 1436 1479 1490 N
+ DH AA IY i n/a 11 1436 1479 1490 N
+ DH AA JH e n/a 11 1436 1478 1508 N
+ DH AA K e n/a 11 1436 1478 1508 N
+ DH AA L e n/a 11 1436 1478 1508 N
+ DH AA M e n/a 11 1436 1478 1508 N
+ DH AA N e n/a 11 1436 1478 1508 N
+ DH AA NG e n/a 11 1436 1478 1508 N
+ DH AA OW b n/a 11 1436 1476 1503 N
+ DH AA OW e n/a 11 1436 1476 1503 N
+ DH AA OY e n/a 11 1436 1476 1503 N
+ DH AA P e n/a 11 1436 1478 1508 N
+ DH AA R e n/a 11 1436 1478 1508 N
+ DH AA S e n/a 11 1436 1478 1508 N
+ DH AA SH e n/a 11 1436 1478 1508 N
+ DH AA SIL e n/a 11 1436 1478 1508 N
+ DH AA T e n/a 11 1436 1478 1508 N
+ DH AA TH e n/a 11 1436 1478 1508 N
+ DH AA UH e n/a 11 1436 1476 1505 N
+ DH AA UW e n/a 11 1436 1476 1505 N
+ DH AA V e n/a 11 1436 1478 1508 N
+ DH AA W e n/a 11 1436 1478 1508 N
+ DH AA Y b n/a 11 1436 1479 1490 N
+ DH AA Y e n/a 11 1436 1479 1490 N
+ DH AA Z e n/a 11 1436 1478 1508 N
+ DH AA Z i n/a 11 1435 1478 1508 N
+ DH AA ZH e n/a 11 1436 1478 1508 N
+ DH AE AE b n/a 11 1436 1476 1516 N
+ DH AE AH b n/a 11 1436 1472 1503 N
+ DH AE AH i n/a 11 1435 1472 1503 N
+ DH AE AW b n/a 11 1436 1476 1516 N
+ DH AE AY b n/a 11 1436 1476 1503 N
+ DH AE AY i n/a 11 1436 1476 1503 N
+ DH AE EH b n/a 11 1436 1475 1511 N
+ DH AE ER b n/a 11 1439 1483 1519 N
+ DH AE ER i n/a 11 1439 1483 1519 N
+ DH AE EY b n/a 11 1436 1475 1513 N
+ DH AE IH b n/a 11 1436 1472 1505 N
+ DH AE IY b n/a 11 1436 1479 1490 N
+ DH AE IY i n/a 11 1436 1479 1490 N
+ DH AE OW b n/a 11 1436 1476 1503 N
+ DH AE OY i n/a 11 1436 1476 1503 N
+ DH AE Y b n/a 11 1436 1479 1490 N
+ DH AE Z i n/a 11 1435 1478 1508 N
+ DH AH AA e n/a 11 1447 1476 1503 N
+ DH AH AA i n/a 11 1447 1476 1503 N
+ DH AH AE b n/a 11 1447 1476 1516 N
+ DH AH AE e n/a 11 1447 1476 1516 N
+ DH AH AH b n/a 11 1448 1473 1502 N
+ DH AH AH e n/a 11 1448 1473 1502 N
+ DH AH AH i n/a 11 1448 1473 1502 N
+ DH AH AO e n/a 11 1447 1476 1503 N
+ DH AH AW b n/a 11 1447 1476 1516 N
+ DH AH AW e n/a 11 1447 1476 1516 N
+ DH AH AY b n/a 11 1447 1476 1503 N
+ DH AH AY e n/a 11 1447 1476 1503 N
+ DH AH B e n/a 11 1444 1478 1508 N
+ DH AH CH e n/a 11 1444 1478 1508 N
+ DH AH D e n/a 11 1444 1478 1508 N
+ DH AH DH e n/a 11 1444 1478 1508 N
+ DH AH EH b n/a 11 1447 1475 1511 N
+ DH AH EH e n/a 11 1447 1475 1511 N
+ DH AH ER b n/a 11 1438 1482 1519 N
+ DH AH ER e n/a 11 1438 1482 1519 N
+ DH AH ER i n/a 11 1438 1482 1519 N
+ DH AH EY b n/a 11 1447 1475 1513 N
+ DH AH EY e n/a 11 1447 1475 1513 N
+ DH AH F e n/a 11 1444 1478 1508 N
+ DH AH G e n/a 11 1444 1478 1508 N
+ DH AH HH e n/a 11 1444 1478 1508 N
+ DH AH IH b n/a 11 1448 1473 1505 N
+ DH AH IH e n/a 11 1448 1474 1505 N
+ DH AH IH i n/a 11 1448 1474 1505 N
+ DH AH IY b n/a 11 1448 1479 1490 N
+ DH AH IY e n/a 11 1448 1479 1490 N
+ DH AH IY i n/a 11 1448 1479 1490 N
+ DH AH JH e n/a 11 1444 1478 1508 N
+ DH AH K e n/a 11 1444 1478 1508 N
+ DH AH L e n/a 11 1444 1478 1508 N
+ DH AH M e n/a 11 1444 1478 1508 N
+ DH AH N e n/a 11 1444 1478 1508 N
+ DH AH NG e n/a 11 1444 1478 1508 N
+ DH AH OW b n/a 11 1447 1476 1503 N
+ DH AH OW e n/a 11 1447 1476 1503 N
+ DH AH OY e n/a 11 1447 1476 1503 N
+ DH AH P e n/a 11 1444 1478 1508 N
+ DH AH R e n/a 11 1444 1478 1508 N
+ DH AH S e n/a 11 1444 1478 1508 N
+ DH AH SH e n/a 11 1444 1478 1508 N
+ DH AH SIL e n/a 11 1444 1478 1508 N
+ DH AH T e n/a 11 1444 1478 1508 N
+ DH AH TH e n/a 11 1444 1478 1508 N
+ DH AH UH e n/a 11 1448 1476 1505 N
+ DH AH UW e n/a 11 1448 1476 1505 N
+ DH AH V e n/a 11 1444 1478 1508 N
+ DH AH W e n/a 11 1444 1478 1508 N
+ DH AH Y b n/a 11 1444 1479 1490 N
+ DH AH Y e n/a 11 1444 1479 1490 N
+ DH AH Z e n/a 11 1444 1478 1508 N
+ DH AH ZH e n/a 11 1444 1478 1508 N
+ DH AO AA e n/a 11 1435 1476 1503 N
+ DH AO AE b n/a 11 1435 1476 1516 N
+ DH AO AE e n/a 11 1435 1476 1516 N
+ DH AO AH b n/a 11 1435 1472 1503 N
+ DH AO AH e n/a 11 1435 1472 1503 N
+ DH AO AO e n/a 11 1435 1476 1503 N
+ DH AO AW b n/a 11 1435 1476 1516 N
+ DH AO AW e n/a 11 1435 1476 1516 N
+ DH AO AY b n/a 11 1435 1476 1503 N
+ DH AO AY e n/a 11 1435 1476 1503 N
+ DH AO B e n/a 11 1435 1478 1508 N
+ DH AO CH e n/a 11 1435 1478 1508 N
+ DH AO D e n/a 11 1435 1478 1508 N
+ DH AO DH e n/a 11 1435 1478 1508 N
+ DH AO EH b n/a 11 1435 1475 1511 N
+ DH AO EH e n/a 11 1435 1475 1511 N
+ DH AO ER b n/a 11 1438 1482 1519 N
+ DH AO ER e n/a 11 1438 1482 1519 N
+ DH AO ER i n/a 11 1438 1482 1519 N
+ DH AO EY b n/a 11 1435 1475 1513 N
+ DH AO EY e n/a 11 1435 1475 1513 N
+ DH AO F e n/a 11 1435 1478 1508 N
+ DH AO G e n/a 11 1435 1478 1508 N
+ DH AO HH e n/a 11 1435 1478 1508 N
+ DH AO IH b n/a 11 1435 1472 1505 N
+ DH AO IH e n/a 11 1435 1472 1505 N
+ DH AO IY b n/a 11 1435 1479 1490 N
+ DH AO IY e n/a 11 1435 1479 1490 N
+ DH AO JH e n/a 11 1435 1478 1508 N
+ DH AO K e n/a 11 1435 1478 1508 N
+ DH AO L e n/a 11 1435 1478 1508 N
+ DH AO M e n/a 11 1435 1478 1508 N
+ DH AO N e n/a 11 1435 1478 1508 N
+ DH AO NG e n/a 11 1435 1478 1508 N
+ DH AO OW b n/a 11 1435 1476 1503 N
+ DH AO OW e n/a 11 1435 1476 1503 N
+ DH AO OY e n/a 11 1435 1476 1503 N
+ DH AO P e n/a 11 1435 1478 1508 N
+ DH AO R e n/a 11 1435 1478 1508 N
+ DH AO S e n/a 11 1435 1478 1508 N
+ DH AO SH e n/a 11 1435 1478 1508 N
+ DH AO SIL e n/a 11 1435 1478 1508 N
+ DH AO T e n/a 11 1435 1478 1508 N
+ DH AO TH e n/a 11 1435 1478 1508 N
+ DH AO UH e n/a 11 1435 1476 1505 N
+ DH AO UW e n/a 11 1435 1476 1505 N
+ DH AO V e n/a 11 1435 1478 1508 N
+ DH AO W e n/a 11 1435 1478 1508 N
+ DH AO Y b n/a 11 1435 1479 1490 N
+ DH AO Y e n/a 11 1435 1479 1490 N
+ DH AO Z e n/a 11 1435 1478 1508 N
+ DH AO ZH e n/a 11 1435 1478 1508 N
+ DH AW AE b n/a 11 1440 1476 1516 N
+ DH AW AH b n/a 11 1440 1472 1503 N
+ DH AW AW b n/a 11 1440 1476 1516 N
+ DH AW AY b n/a 11 1440 1476 1503 N
+ DH AW D i n/a 11 1440 1478 1508 N
+ DH AW EH b n/a 11 1440 1475 1511 N
+ DH AW ER b n/a 11 1438 1482 1520 N
+ DH AW ER i n/a 11 1438 1482 1520 N
+ DH AW EY b n/a 11 1440 1475 1513 N
+ DH AW IH b n/a 11 1440 1472 1505 N
+ DH AW IH i n/a 11 1440 1472 1505 N
+ DH AW IY b n/a 11 1440 1479 1490 N
+ DH AW IY i n/a 11 1440 1479 1490 N
+ DH AW OW b n/a 11 1440 1476 1503 N
+ DH AW Y b n/a 11 1440 1479 1490 N
+ DH AW Z i n/a 11 1440 1478 1508 N
+ DH AY AA e n/a 11 1449 1474 1504 N
+ DH AY AE b n/a 11 1450 1474 1516 N
+ DH AY AE e n/a 11 1450 1474 1516 N
+ DH AY AH b n/a 11 1449 1474 1504 N
+ DH AY AH e n/a 11 1449 1474 1504 N
+ DH AY AH i n/a 11 1449 1474 1504 N
+ DH AY AO e n/a 11 1449 1474 1504 N
+ DH AY AW b n/a 11 1450 1474 1516 N
+ DH AY AW e n/a 11 1450 1474 1516 N
+ DH AY AY b n/a 11 1449 1474 1504 N
+ DH AY AY e n/a 11 1449 1474 1504 N
+ DH AY B e n/a 11 1450 1478 1508 N
+ DH AY CH e n/a 11 1450 1478 1508 N
+ DH AY D e n/a 11 1450 1478 1508 N
+ DH AY DH e n/a 11 1450 1478 1508 N
+ DH AY EH b n/a 11 1450 1474 1511 N
+ DH AY EH e n/a 11 1450 1474 1511 N
+ DH AY ER b n/a 11 1449 1483 1520 N
+ DH AY ER e n/a 11 1449 1483 1520 N
+ DH AY ER i n/a 11 1449 1483 1520 N
+ DH AY EY b n/a 11 1450 1474 1513 N
+ DH AY EY e n/a 11 1450 1474 1513 N
+ DH AY F e n/a 11 1450 1478 1508 N
+ DH AY G e n/a 11 1450 1478 1508 N
+ DH AY HH e n/a 11 1450 1478 1508 N
+ DH AY IH b n/a 11 1449 1474 1505 N
+ DH AY IH e n/a 11 1449 1474 1505 N
+ DH AY IH i n/a 11 1449 1474 1505 N
+ DH AY IY b n/a 11 1449 1479 1490 N
+ DH AY IY e n/a 11 1449 1479 1490 N
+ DH AY JH e n/a 11 1450 1478 1508 N
+ DH AY K e n/a 11 1450 1478 1508 N
+ DH AY L e n/a 11 1449 1478 1508 N
+ DH AY M e n/a 11 1450 1478 1508 N
+ DH AY N e n/a 11 1450 1478 1508 N
+ DH AY NG e n/a 11 1450 1478 1508 N
+ DH AY OW b n/a 11 1449 1474 1504 N
+ DH AY OW e n/a 11 1449 1474 1504 N
+ DH AY OY e n/a 11 1449 1474 1504 N
+ DH AY P e n/a 11 1450 1478 1508 N
+ DH AY R e n/a 11 1449 1478 1508 N
+ DH AY S e n/a 11 1450 1478 1508 N
+ DH AY SH e n/a 11 1450 1478 1508 N
+ DH AY SIL e n/a 11 1450 1478 1508 N
+ DH AY T e n/a 11 1450 1478 1508 N
+ DH AY TH e n/a 11 1450 1478 1508 N
+ DH AY UH e n/a 11 1449 1474 1505 N
+ DH AY UW e n/a 11 1449 1474 1505 N
+ DH AY V e n/a 11 1450 1478 1508 N
+ DH AY W e n/a 11 1449 1478 1508 N
+ DH AY Y b n/a 11 1449 1479 1490 N
+ DH AY Y e n/a 11 1449 1479 1490 N
+ DH AY Z e n/a 11 1450 1478 1508 N
+ DH AY Z i n/a 11 1450 1478 1508 N
+ DH AY ZH e n/a 11 1450 1478 1508 N
+ DH B AE b n/a 11 1428 1469 1518 N
+ DH B AH b n/a 11 1429 1468 1501 N
+ DH B AW b n/a 11 1428 1469 1518 N
+ DH B AY b n/a 11 1428 1469 1500 N
+ DH B EH b n/a 11 1428 1470 1511 N
+ DH B ER b n/a 11 1429 1468 1519 N
+ DH B EY b n/a 11 1428 1470 1513 N
+ DH B IH b n/a 11 1428 1468 1505 N
+ DH B IY b n/a 11 1428 1456 1489 N
+ DH B OW b n/a 11 1428 1468 1500 N
+ DH B Y b n/a 11 1428 1470 1489 N
+ DH CH AE b n/a 11 1426 1464 1515 N
+ DH CH AH b n/a 11 1426 1459 1495 N
+ DH CH AW b n/a 11 1426 1464 1515 N
+ DH CH AY b n/a 11 1426 1464 1500 N
+ DH CH EH b n/a 11 1426 1462 1512 N
+ DH CH ER b n/a 11 1426 1459 1519 N
+ DH CH EY b n/a 11 1426 1462 1513 N
+ DH CH IH b n/a 11 1426 1460 1506 N
+ DH CH IY b n/a 11 1426 1456 1488 N
+ DH CH OW b n/a 11 1426 1459 1500 N
+ DH CH Y b n/a 11 1426 1462 1488 N
+ DH D AE b n/a 11 1428 1470 1518 N
+ DH D AH b n/a 11 1429 1468 1499 N
+ DH D AH i n/a 11 1429 1468 1499 N
+ DH D AW b n/a 11 1428 1470 1518 N
+ DH D AY b n/a 11 1428 1470 1500 N
+ DH D EH b n/a 11 1428 1470 1510 N
+ DH D ER b n/a 11 1429 1468 1519 N
+ DH D ER i n/a 11 1429 1468 1519 N
+ DH D EY b n/a 11 1428 1470 1510 N
+ DH D IH b n/a 11 1428 1468 1507 N
+ DH D IY b n/a 11 1428 1457 1489 N
+ DH D OW b n/a 11 1428 1468 1500 N
+ DH D Y b n/a 11 1428 1470 1489 N
+ DH DH AE b n/a 11 1429 1469 1515 N
+ DH DH AH b n/a 11 1429 1471 1495 N
+ DH DH AW b n/a 11 1429 1469 1515 N
+ DH DH AY b n/a 11 1429 1471 1497 N
+ DH DH EH b n/a 11 1429 1469 1511 N
+ DH DH ER b n/a 11 1429 1471 1519 N
+ DH DH EY b n/a 11 1429 1469 1513 N
+ DH DH IH b n/a 11 1429 1471 1505 N
+ DH DH IY b n/a 11 1429 1457 1490 N
+ DH DH OW b n/a 11 1429 1471 1497 N
+ DH DH Y b n/a 11 1429 1469 1490 N
+ DH EH AE b n/a 11 1450 1476 1516 N
+ DH EH AH b n/a 11 1449 1473 1502 N
+ DH EH AH i n/a 11 1449 1473 1502 N
+ DH EH AW b n/a 11 1450 1476 1516 N
+ DH EH AY b n/a 11 1449 1476 1503 N
+ DH EH EH b n/a 11 1450 1475 1511 N
+ DH EH ER b n/a 11 1439 1483 1519 N
+ DH EH ER i n/a 11 1439 1483 1519 N
+ DH EH EY b n/a 11 1450 1475 1513 N
+ DH EH IH b n/a 11 1449 1473 1505 N
+ DH EH IY b n/a 11 1449 1479 1490 N
+ DH EH IY i n/a 11 1449 1479 1490 N
+ DH EH OW b n/a 11 1449 1476 1503 N
+ DH EH R i n/a 11 1449 1478 1508 N
+ DH EH S i n/a 11 1450 1478 1508 N
+ DH EH Y b n/a 11 1449 1479 1490 N
+ DH ER AE b n/a 11 1445 1476 1516 N
+ DH ER AH b n/a 11 1442 1473 1502 N
+ DH ER AH i n/a 11 1443 1473 1503 N
+ DH ER AW b n/a 11 1445 1476 1516 N
+ DH ER AY b n/a 11 1445 1476 1503 N
+ DH ER EH b n/a 11 1445 1475 1511 N
+ DH ER ER b n/a 11 1439 1483 1519 N
+ DH ER ER i n/a 11 1439 1483 1519 N
+ DH ER EY b n/a 11 1445 1475 1513 N
+ DH ER IH b n/a 11 1442 1474 1505 N
+ DH ER IH i n/a 11 1443 1474 1505 N
+ DH ER IY b n/a 11 1445 1479 1490 N
+ DH ER IY i n/a 11 1443 1479 1490 N
+ DH ER OW b n/a 11 1445 1476 1503 N
+ DH ER Y b n/a 11 1444 1479 1490 N
+ DH ER Z i n/a 11 1444 1478 1508 N
+ DH EY AA e n/a 11 1430 1477 1504 N
+ DH EY AE b n/a 11 1430 1477 1516 N
+ DH EY AE e n/a 11 1430 1477 1516 N
+ DH EY AH b n/a 11 1430 1477 1504 N
+ DH EY AH e n/a 11 1430 1477 1504 N
+ DH EY AH i n/a 11 1430 1477 1504 N
+ DH EY AO e n/a 11 1430 1477 1504 N
+ DH EY AW b n/a 11 1430 1477 1516 N
+ DH EY AW e n/a 11 1430 1477 1516 N
+ DH EY AY b n/a 11 1430 1477 1504 N
+ DH EY AY e n/a 11 1430 1477 1504 N
+ DH EY B e n/a 11 1430 1478 1508 N
+ DH EY CH e n/a 11 1430 1478 1508 N
+ DH EY D e n/a 11 1430 1478 1508 N
+ DH EY D i n/a 11 1430 1478 1508 N
+ DH EY DH e n/a 11 1430 1478 1508 N
+ DH EY EH b n/a 11 1430 1477 1511 N
+ DH EY EH e n/a 11 1430 1477 1511 N
+ DH EY ER b n/a 11 1450 1483 1520 N
+ DH EY ER e n/a 11 1450 1483 1520 N
+ DH EY ER i n/a 11 1450 1483 1520 N
+ DH EY EY b n/a 11 1430 1477 1513 N
+ DH EY EY e n/a 11 1430 1477 1513 N
+ DH EY F e n/a 11 1430 1478 1508 N
+ DH EY G e n/a 11 1430 1478 1508 N
+ DH EY HH e n/a 11 1430 1478 1508 N
+ DH EY IH b n/a 11 1430 1477 1505 N
+ DH EY IH e n/a 11 1430 1477 1505 N
+ DH EY IH i n/a 11 1430 1477 1505 N
+ DH EY IY b n/a 11 1430 1479 1490 N
+ DH EY IY e n/a 11 1430 1479 1490 N
+ DH EY JH e n/a 11 1430 1478 1508 N
+ DH EY K e n/a 11 1430 1478 1508 N
+ DH EY L e n/a 11 1430 1478 1508 N
+ DH EY M e n/a 11 1430 1478 1508 N
+ DH EY N e n/a 11 1430 1478 1508 N
+ DH EY NG e n/a 11 1430 1478 1508 N
+ DH EY OW b n/a 11 1430 1477 1504 N
+ DH EY OW e n/a 11 1430 1477 1504 N
+ DH EY OY e n/a 11 1430 1477 1504 N
+ DH EY P e n/a 11 1430 1478 1508 N
+ DH EY R e n/a 11 1430 1478 1508 N
+ DH EY S e n/a 11 1430 1478 1508 N
+ DH EY SH e n/a 11 1430 1478 1508 N
+ DH EY SIL e n/a 11 1430 1478 1508 N
+ DH EY T e n/a 11 1430 1478 1508 N
+ DH EY TH e n/a 11 1430 1478 1508 N
+ DH EY UH e n/a 11 1430 1477 1505 N
+ DH EY UW e n/a 11 1430 1477 1505 N
+ DH EY V e n/a 11 1430 1478 1508 N
+ DH EY W e n/a 11 1430 1478 1508 N
+ DH EY W i n/a 11 1430 1478 1508 N
+ DH EY Y b n/a 11 1430 1479 1490 N
+ DH EY Y e n/a 11 1430 1479 1490 N
+ DH EY Z e n/a 11 1430 1478 1508 N
+ DH EY Z i n/a 11 1430 1478 1508 N
+ DH EY ZH e n/a 11 1430 1478 1508 N
+ DH F AE b n/a 11 1441 1464 1515 N
+ DH F AH b n/a 11 1441 1459 1495 N
+ DH F AW b n/a 11 1441 1464 1515 N
+ DH F AY b n/a 11 1441 1464 1500 N
+ DH F AY i n/a 11 1441 1464 1500 N
+ DH F EH b n/a 11 1441 1462 1512 N
+ DH F EH i n/a 11 1441 1462 1512 N
+ DH F ER b n/a 11 1439 1459 1519 N
+ DH F ER i n/a 11 1439 1459 1519 N
+ DH F EY b n/a 11 1441 1462 1513 N
+ DH F IH b n/a 11 1441 1460 1506 N
+ DH F IH i n/a 11 1441 1460 1506 N
+ DH F IY b n/a 11 1441 1456 1488 N
+ DH F OW b n/a 11 1441 1459 1500 N
+ DH F Y b n/a 11 1441 1462 1488 N
+ DH G AE b n/a 11 1428 1469 1518 N
+ DH G AH b n/a 11 1429 1468 1501 N
+ DH G AW b n/a 11 1428 1469 1518 N
+ DH G AY b n/a 11 1428 1469 1500 N
+ DH G EH b n/a 11 1428 1470 1511 N
+ DH G ER b n/a 11 1429 1468 1519 N
+ DH G EY b n/a 11 1428 1470 1513 N
+ DH G IH b n/a 11 1428 1468 1505 N
+ DH G IY b n/a 11 1428 1456 1489 N
+ DH G OW b n/a 11 1428 1468 1500 N
+ DH G Y b n/a 11 1428 1470 1489 N
+ DH HH AE b n/a 11 1426 1464 1515 N
+ DH HH AH b n/a 11 1426 1459 1495 N
+ DH HH AW b n/a 11 1426 1464 1515 N
+ DH HH AY b n/a 11 1426 1464 1500 N
+ DH HH EH b n/a 11 1426 1462 1512 N
+ DH HH ER b n/a 11 1426 1459 1519 N
+ DH HH EY b n/a 11 1426 1462 1513 N
+ DH HH IH b n/a 11 1426 1460 1506 N
+ DH HH IY b n/a 11 1426 1456 1488 N
+ DH HH OW b n/a 11 1426 1459 1500 N
+ DH HH Y b n/a 11 1426 1462 1488 N
+ DH IH AA e n/a 11 1447 1476 1503 N
+ DH IH AE b n/a 11 1446 1476 1516 N
+ DH IH AE e n/a 11 1447 1476 1516 N
+ DH IH AH b n/a 11 1446 1474 1502 N
+ DH IH AH e n/a 11 1447 1473 1502 N
+ DH IH AH i n/a 11 1447 1473 1502 N
+ DH IH AO e n/a 11 1447 1476 1503 N
+ DH IH AO i n/a 11 1447 1476 1503 N
+ DH IH AW b n/a 11 1446 1476 1516 N
+ DH IH AW e n/a 11 1447 1476 1516 N
+ DH IH AW i n/a 11 1447 1476 1516 N
+ DH IH AY b n/a 11 1446 1476 1503 N
+ DH IH AY e n/a 11 1447 1476 1503 N
+ DH IH B e n/a 11 1444 1478 1508 N
+ DH IH CH e n/a 11 1444 1478 1508 N
+ DH IH D e n/a 11 1444 1478 1508 N
+ DH IH D i n/a 11 1444 1478 1508 N
+ DH IH DH e n/a 11 1444 1478 1508 N
+ DH IH EH b n/a 11 1446 1475 1511 N
+ DH IH EH e n/a 11 1447 1475 1511 N
+ DH IH ER b n/a 11 1439 1483 1520 N
+ DH IH ER e n/a 11 1439 1483 1520 N
+ DH IH ER i n/a 11 1439 1483 1520 N
+ DH IH EY b n/a 11 1446 1475 1513 N
+ DH IH EY e n/a 11 1447 1475 1513 N
+ DH IH F e n/a 11 1444 1478 1508 N
+ DH IH G e n/a 11 1444 1478 1508 N
+ DH IH HH e n/a 11 1444 1478 1508 N
+ DH IH IH b n/a 11 1446 1474 1505 N
+ DH IH IH e n/a 11 1447 1474 1505 N
+ DH IH IH i n/a 11 1447 1474 1505 N
+ DH IH IY b n/a 11 1446 1479 1490 N
+ DH IH IY e n/a 11 1447 1479 1490 N
+ DH IH IY i n/a 11 1447 1479 1490 N
+ DH IH JH e n/a 11 1444 1478 1508 N
+ DH IH K e n/a 11 1444 1478 1508 N
+ DH IH L e n/a 11 1444 1478 1508 N
+ DH IH M e n/a 11 1444 1478 1508 N
+ DH IH M i n/a 11 1444 1478 1508 N
+ DH IH N e n/a 11 1444 1478 1508 N
+ DH IH NG e n/a 11 1444 1478 1508 N
+ DH IH OW b n/a 11 1446 1476 1503 N
+ DH IH OW e n/a 11 1447 1476 1503 N
+ DH IH OY e n/a 11 1447 1476 1503 N
+ DH IH P e n/a 11 1444 1478 1508 N
+ DH IH R e n/a 11 1444 1478 1508 N
+ DH IH S e n/a 11 1444 1478 1508 N
+ DH IH SH e n/a 11 1444 1478 1508 N
+ DH IH SIL e n/a 11 1444 1478 1508 N
+ DH IH T e n/a 11 1444 1478 1508 N
+ DH IH TH e n/a 11 1444 1478 1508 N
+ DH IH UH e n/a 11 1447 1476 1505 N
+ DH IH UW e n/a 11 1447 1476 1505 N
+ DH IH V e n/a 11 1444 1478 1508 N
+ DH IH W e n/a 11 1444 1478 1508 N
+ DH IH Y b n/a 11 1444 1479 1490 N
+ DH IH Y e n/a 11 1444 1479 1490 N
+ DH IH Z e n/a 11 1444 1478 1508 N
+ DH IH Z i n/a 11 1444 1478 1508 N
+ DH IH ZH e n/a 11 1444 1478 1508 N
+ DH IY AA e n/a 11 1430 1477 1504 N
+ DH IY AE b n/a 11 1430 1477 1516 N
+ DH IY AE e n/a 11 1430 1477 1516 N
+ DH IY AH b n/a 11 1430 1477 1504 N
+ DH IY AH e n/a 11 1430 1477 1504 N
+ DH IY AH i n/a 11 1430 1477 1504 N
+ DH IY AO e n/a 11 1430 1477 1504 N
+ DH IY AW b n/a 11 1430 1477 1516 N
+ DH IY AW e n/a 11 1430 1477 1516 N
+ DH IY AY b n/a 11 1430 1477 1504 N
+ DH IY AY e n/a 11 1430 1477 1504 N
+ DH IY B e n/a 11 1430 1478 1508 N
+ DH IY CH e n/a 11 1430 1478 1508 N
+ DH IY D e n/a 11 1430 1478 1508 N
+ DH IY D i n/a 11 1430 1478 1508 N
+ DH IY DH e n/a 11 1430 1478 1508 N
+ DH IY EH b n/a 11 1430 1477 1511 N
+ DH IY EH e n/a 11 1430 1477 1511 N
+ DH IY ER b n/a 11 1450 1483 1520 N
+ DH IY ER e n/a 11 1450 1483 1520 N
+ DH IY ER i n/a 11 1450 1483 1520 N
+ DH IY EY b n/a 11 1430 1477 1513 N
+ DH IY EY e n/a 11 1430 1477 1513 N
+ DH IY F e n/a 11 1430 1478 1508 N
+ DH IY G e n/a 11 1430 1478 1508 N
+ DH IY HH e n/a 11 1430 1478 1508 N
+ DH IY IH b n/a 11 1430 1477 1505 N
+ DH IY IH e n/a 11 1430 1477 1505 N
+ DH IY IH i n/a 11 1430 1477 1505 N
+ DH IY IY b n/a 11 1430 1479 1490 N
+ DH IY IY e n/a 11 1430 1479 1490 N
+ DH IY IY i n/a 11 1430 1479 1490 N
+ DH IY JH e n/a 11 1430 1478 1508 N
+ DH IY K e n/a 11 1430 1478 1508 N
+ DH IY L e n/a 11 1430 1478 1508 N
+ DH IY M e n/a 11 1430 1478 1508 N
+ DH IY N e n/a 11 1430 1478 1508 N
+ DH IY NG e n/a 11 1430 1478 1508 N
+ DH IY OW b n/a 11 1430 1477 1504 N
+ DH IY OW e n/a 11 1430 1477 1504 N
+ DH IY OY e n/a 11 1430 1477 1504 N
+ DH IY P e n/a 11 1430 1478 1508 N
+ DH IY R e n/a 11 1430 1478 1508 N
+ DH IY S e n/a 11 1430 1478 1508 N
+ DH IY SH e n/a 11 1430 1478 1508 N
+ DH IY SIL e n/a 11 1430 1478 1508 N
+ DH IY T e n/a 11 1430 1478 1508 N
+ DH IY TH e n/a 11 1430 1478 1508 N
+ DH IY UH e n/a 11 1430 1477 1505 N
+ DH IY UW e n/a 11 1430 1477 1505 N
+ DH IY V e n/a 11 1430 1478 1508 N
+ DH IY W e n/a 11 1430 1478 1508 N
+ DH IY Y b n/a 11 1430 1479 1490 N
+ DH IY Y e n/a 11 1430 1479 1490 N
+ DH IY Z e n/a 11 1430 1478 1508 N
+ DH IY Z i n/a 11 1430 1478 1508 N
+ DH IY ZH e n/a 11 1430 1478 1508 N
+ DH JH AE b n/a 11 1426 1464 1515 N
+ DH JH AH b n/a 11 1426 1459 1496 N
+ DH JH AW b n/a 11 1426 1464 1515 N
+ DH JH AY b n/a 11 1426 1464 1497 N
+ DH JH EH b n/a 11 1426 1462 1511 N
+ DH JH ER b n/a 11 1426 1459 1519 N
+ DH JH EY b n/a 11 1426 1462 1513 N
+ DH JH IH b n/a 11 1426 1460 1505 N
+ DH JH IY b n/a 11 1426 1456 1490 N
+ DH JH OW b n/a 11 1426 1459 1497 N
+ DH JH Y b n/a 11 1426 1462 1490 N
+ DH K AE b n/a 11 1425 1464 1515 N
+ DH K AH b n/a 11 1425 1459 1495 N
+ DH K AW b n/a 11 1425 1464 1515 N
+ DH K AY b n/a 11 1425 1464 1500 N
+ DH K EH b n/a 11 1425 1462 1512 N
+ DH K ER b n/a 11 1425 1459 1519 N
+ DH K ER i n/a 11 1425 1459 1519 N
+ DH K EY b n/a 11 1425 1462 1513 N
+ DH K IH b n/a 11 1425 1460 1506 N
+ DH K IY b n/a 11 1425 1456 1488 N
+ DH K OW b n/a 11 1425 1459 1500 N
+ DH K Y b n/a 11 1425 1462 1488 N
+ DH L AE b n/a 11 1436 1481 1517 N
+ DH L AH b n/a 11 1436 1480 1494 N
+ DH L AH i n/a 11 1436 1480 1494 N
+ DH L AW b n/a 11 1436 1481 1517 N
+ DH L AY b n/a 11 1436 1480 1494 N
+ DH L AY i n/a 11 1436 1480 1494 N
+ DH L EH b n/a 11 1436 1481 1511 N
+ DH L ER b n/a 11 1439 1483 1519 N
+ DH L EY b n/a 11 1436 1481 1513 N
+ DH L IH b n/a 11 1436 1481 1494 N
+ DH L IY b n/a 11 1436 1481 1490 N
+ DH L OW b n/a 11 1436 1480 1494 N
+ DH L OW i n/a 11 1436 1480 1494 N
+ DH L UW i n/a 11 1436 1480 1494 N
+ DH L Y b n/a 11 1436 1481 1490 N
+ DH M AE b n/a 11 1432 1486 1517 N
+ DH M AH b n/a 11 1433 1485 1492 N
+ DH M AW b n/a 11 1432 1486 1517 N
+ DH M AY b n/a 11 1432 1486 1492 N
+ DH M EH b n/a 11 1432 1486 1509 N
+ DH M ER b n/a 11 1433 1485 1519 N
+ DH M EY b n/a 11 1432 1486 1513 N
+ DH M IH b n/a 11 1432 1487 1493 N
+ DH M IY b n/a 11 1431 1484 1491 N
+ DH M OW b n/a 11 1432 1485 1492 N
+ DH M Y b n/a 11 1432 1484 1491 N
+ DH N AA e n/a 11 1432 1486 1492 N
+ DH N AE b n/a 11 1432 1486 1517 N
+ DH N AE e n/a 11 1432 1486 1517 N
+ DH N AH b n/a 11 1433 1485 1492 N
+ DH N AH e n/a 11 1433 1485 1492 N
+ DH N AH i n/a 11 1433 1485 1492 N
+ DH N AO e n/a 11 1432 1486 1492 N
+ DH N AW b n/a 11 1432 1486 1517 N
+ DH N AW e n/a 11 1432 1486 1517 N
+ DH N AY b n/a 11 1432 1486 1492 N
+ DH N AY e n/a 11 1432 1486 1492 N
+ DH N AY i n/a 11 1432 1486 1492 N
+ DH N B e n/a 11 1432 1486 1492 N
+ DH N CH e n/a 11 1432 1486 1492 N
+ DH N D e n/a 11 1432 1486 1492 N
+ DH N DH e n/a 11 1432 1486 1492 N
+ DH N EH b n/a 11 1432 1486 1509 N
+ DH N EH e n/a 11 1432 1486 1509 N
+ DH N ER b n/a 11 1433 1485 1519 N
+ DH N ER e n/a 11 1433 1485 1519 N
+ DH N ER i n/a 11 1433 1485 1519 N
+ DH N EY b n/a 11 1432 1486 1509 N
+ DH N EY e n/a 11 1432 1486 1509 N
+ DH N F e n/a 11 1432 1486 1492 N
+ DH N G e n/a 11 1432 1486 1492 N
+ DH N HH e n/a 11 1432 1486 1492 N
+ DH N IH b n/a 11 1432 1487 1493 N
+ DH N IH e n/a 11 1432 1487 1493 N
+ DH N IY b n/a 11 1431 1484 1491 N
+ DH N IY e n/a 11 1431 1484 1491 N
+ DH N IY i n/a 11 1431 1484 1491 N
+ DH N JH e n/a 11 1432 1486 1492 N
+ DH N K e n/a 11 1432 1486 1492 N
+ DH N L e n/a 11 1432 1485 1492 N
+ DH N M e n/a 11 1432 1486 1492 N
+ DH N N e n/a 11 1432 1486 1492 N
+ DH N NG e n/a 11 1432 1486 1492 N
+ DH N OW b n/a 11 1432 1485 1492 N
+ DH N OW e n/a 11 1432 1485 1492 N
+ DH N OY e n/a 11 1432 1486 1492 N
+ DH N P e n/a 11 1432 1486 1492 N
+ DH N R e n/a 11 1432 1485 1492 N
+ DH N S e n/a 11 1432 1486 1492 N
+ DH N SH e n/a 11 1432 1486 1492 N
+ DH N SIL e n/a 11 1432 1486 1492 N
+ DH N T e n/a 11 1432 1486 1492 N
+ DH N TH e n/a 11 1432 1486 1492 N
+ DH N UH e n/a 11 1432 1485 1493 N
+ DH N UW e n/a 11 1431 1485 1493 N
+ DH N V e n/a 11 1432 1486 1492 N
+ DH N W e n/a 11 1432 1485 1492 N
+ DH N Y b n/a 11 1432 1484 1491 N
+ DH N Y e n/a 11 1432 1484 1491 N
+ DH N Z e n/a 11 1432 1486 1492 N
+ DH N Z i n/a 11 1432 1486 1492 N
+ DH N ZH e n/a 11 1432 1486 1492 N
+ DH NG AE b n/a 11 1432 1486 1517 N
+ DH NG AH b n/a 11 1434 1487 1493 N
+ DH NG AW b n/a 11 1432 1486 1517 N
+ DH NG AY b n/a 11 1432 1486 1492 N
+ DH NG EH b n/a 11 1432 1486 1509 N
+ DH NG ER b n/a 11 1434 1487 1519 N
+ DH NG EY b n/a 11 1432 1486 1513 N
+ DH NG IH b n/a 11 1434 1487 1493 N
+ DH NG IY b n/a 11 1431 1484 1491 N
+ DH NG OW b n/a 11 1432 1485 1492 N
+ DH NG Y b n/a 11 1432 1484 1491 N
+ DH OW AA e n/a 11 1440 1476 1503 N
+ DH OW AE b n/a 11 1440 1476 1516 N
+ DH OW AE e n/a 11 1440 1476 1516 N
+ DH OW AH b n/a 11 1440 1472 1503 N
+ DH OW AH e n/a 11 1440 1472 1503 N
+ DH OW AO e n/a 11 1440 1476 1503 N
+ DH OW AW b n/a 11 1440 1476 1516 N
+ DH OW AW e n/a 11 1440 1476 1516 N
+ DH OW AY b n/a 11 1440 1476 1503 N
+ DH OW AY e n/a 11 1440 1476 1503 N
+ DH OW B e n/a 11 1440 1478 1508 N
+ DH OW CH e n/a 11 1440 1478 1508 N
+ DH OW D e n/a 11 1440 1478 1508 N
+ DH OW D i n/a 11 1440 1478 1508 N
+ DH OW DH e n/a 11 1440 1478 1508 N
+ DH OW EH b n/a 11 1440 1475 1511 N
+ DH OW EH e n/a 11 1440 1475 1511 N
+ DH OW ER b n/a 11 1439 1483 1520 N
+ DH OW ER e n/a 11 1439 1483 1520 N
+ DH OW ER i n/a 11 1439 1483 1520 N
+ DH OW EY b n/a 11 1440 1475 1513 N
+ DH OW EY e n/a 11 1440 1475 1513 N
+ DH OW F e n/a 11 1440 1478 1508 N
+ DH OW G e n/a 11 1440 1478 1508 N
+ DH OW HH e n/a 11 1440 1478 1508 N
+ DH OW IH b n/a 11 1440 1472 1505 N
+ DH OW IH e n/a 11 1440 1472 1505 N
+ DH OW IH i n/a 11 1440 1472 1505 N
+ DH OW IY b n/a 11 1440 1479 1490 N
+ DH OW IY e n/a 11 1440 1479 1490 N
+ DH OW IY i n/a 11 1440 1479 1490 N
+ DH OW JH e n/a 11 1440 1478 1508 N
+ DH OW K e n/a 11 1440 1478 1508 N
+ DH OW L e n/a 11 1440 1478 1508 N
+ DH OW M e n/a 11 1440 1478 1508 N
+ DH OW N e n/a 11 1440 1478 1508 N
+ DH OW NG e n/a 11 1440 1478 1508 N
+ DH OW OW b n/a 11 1440 1476 1503 N
+ DH OW OW e n/a 11 1440 1476 1503 N
+ DH OW OY e n/a 11 1440 1476 1503 N
+ DH OW P e n/a 11 1440 1478 1508 N
+ DH OW R e n/a 11 1440 1478 1508 N
+ DH OW S e n/a 11 1440 1478 1508 N
+ DH OW S i n/a 11 1440 1478 1508 N
+ DH OW SH e n/a 11 1440 1478 1508 N
+ DH OW SIL e n/a 11 1440 1478 1508 N
+ DH OW T e n/a 11 1440 1478 1508 N
+ DH OW TH e n/a 11 1440 1478 1508 N
+ DH OW UH e n/a 11 1440 1476 1505 N
+ DH OW UW e n/a 11 1440 1476 1505 N
+ DH OW V e n/a 11 1440 1478 1508 N
+ DH OW W e n/a 11 1440 1478 1508 N
+ DH OW Y b n/a 11 1440 1479 1490 N
+ DH OW Y e n/a 11 1440 1479 1490 N
+ DH OW Y i n/a 11 1440 1479 1490 N
+ DH OW Z e n/a 11 1440 1478 1508 N
+ DH OW Z i n/a 11 1440 1478 1508 N
+ DH OW ZH e n/a 11 1440 1478 1508 N
+ DH OY AE b n/a 11 1450 1474 1516 N
+ DH OY AH b n/a 11 1450 1474 1504 N
+ DH OY AW b n/a 11 1450 1474 1516 N
+ DH OY AY b n/a 11 1449 1474 1504 N
+ DH OY EH b n/a 11 1450 1474 1511 N
+ DH OY ER b n/a 11 1450 1483 1520 N
+ DH OY ER i n/a 11 1450 1483 1520 N
+ DH OY EY b n/a 11 1450 1474 1513 N
+ DH OY IH b n/a 11 1450 1474 1505 N
+ DH OY IY b n/a 11 1449 1479 1490 N
+ DH OY OW b n/a 11 1449 1474 1504 N
+ DH OY Y b n/a 11 1449 1479 1490 N
+ DH P AE b n/a 11 1425 1464 1515 N
+ DH P AH b n/a 11 1425 1459 1495 N
+ DH P AW b n/a 11 1425 1464 1515 N
+ DH P AY b n/a 11 1425 1464 1500 N
+ DH P EH b n/a 11 1425 1462 1512 N
+ DH P ER b n/a 11 1425 1459 1519 N
+ DH P EY b n/a 11 1425 1462 1513 N
+ DH P IH b n/a 11 1425 1460 1506 N
+ DH P IY b n/a 11 1425 1456 1488 N
+ DH P OW b n/a 11 1425 1459 1500 N
+ DH P Y b n/a 11 1425 1462 1488 N
+ DH R AA e n/a 11 1445 1476 1503 N
+ DH R AE b n/a 11 1445 1476 1516 N
+ DH R AE e n/a 11 1445 1476 1516 N
+ DH R AH b n/a 11 1443 1473 1502 N
+ DH R AH e n/a 11 1443 1473 1502 N
+ DH R AH i n/a 11 1443 1473 1503 N
+ DH R AO e n/a 11 1445 1476 1503 N
+ DH R AW b n/a 11 1445 1476 1516 N
+ DH R AW e n/a 11 1445 1476 1516 N
+ DH R AY b n/a 11 1445 1476 1503 N
+ DH R AY e n/a 11 1445 1476 1503 N
+ DH R B e n/a 11 1444 1478 1508 N
+ DH R CH e n/a 11 1444 1478 1508 N
+ DH R D e n/a 11 1444 1478 1508 N
+ DH R DH e n/a 11 1444 1478 1508 N
+ DH R EH b n/a 11 1445 1475 1511 N
+ DH R EH e n/a 11 1445 1475 1511 N
+ DH R ER b n/a 11 1439 1483 1519 N
+ DH R ER e n/a 11 1439 1483 1519 N
+ DH R ER i n/a 11 1439 1483 1519 N
+ DH R EY b n/a 11 1445 1475 1513 N
+ DH R EY e n/a 11 1445 1475 1513 N
+ DH R F e n/a 11 1444 1478 1508 N
+ DH R G e n/a 11 1444 1478 1508 N
+ DH R HH e n/a 11 1444 1478 1508 N
+ DH R IH b n/a 11 1445 1474 1505 N
+ DH R IH e n/a 11 1445 1474 1505 N
+ DH R IH i n/a 11 1445 1474 1505 N
+ DH R IY b n/a 11 1445 1479 1490 N
+ DH R IY e n/a 11 1445 1479 1490 N
+ DH R IY i n/a 11 1443 1479 1490 N
+ DH R JH e n/a 11 1444 1478 1508 N
+ DH R K e n/a 11 1444 1478 1508 N
+ DH R L e n/a 11 1444 1478 1508 N
+ DH R M e n/a 11 1444 1478 1508 N
+ DH R N e n/a 11 1444 1478 1508 N
+ DH R NG e n/a 11 1444 1478 1508 N
+ DH R OW b n/a 11 1445 1476 1503 N
+ DH R OW e n/a 11 1445 1476 1503 N
+ DH R OY e n/a 11 1445 1476 1503 N
+ DH R P e n/a 11 1444 1478 1508 N
+ DH R R e n/a 11 1444 1478 1508 N
+ DH R S e n/a 11 1444 1478 1508 N
+ DH R SH e n/a 11 1444 1478 1508 N
+ DH R SIL e n/a 11 1444 1478 1508 N
+ DH R T e n/a 11 1444 1478 1508 N
+ DH R TH e n/a 11 1444 1478 1508 N
+ DH R UH e n/a 11 1445 1476 1505 N
+ DH R UW e n/a 11 1445 1476 1505 N
+ DH R V e n/a 11 1444 1478 1508 N
+ DH R W e n/a 11 1444 1478 1508 N
+ DH R Y b n/a 11 1444 1479 1490 N
+ DH R Y e n/a 11 1444 1479 1490 N
+ DH R Z e n/a 11 1444 1478 1508 N
+ DH R ZH e n/a 11 1444 1478 1508 N
+ DH S AE b n/a 11 1427 1464 1515 N
+ DH S AH b n/a 11 1427 1461 1495 N
+ DH S AW b n/a 11 1427 1464 1515 N
+ DH S AY b n/a 11 1427 1464 1500 N
+ DH S EH b n/a 11 1427 1462 1512 N
+ DH S ER b n/a 11 1427 1461 1519 N
+ DH S ER i n/a 11 1427 1461 1519 N
+ DH S EY b n/a 11 1427 1462 1513 N
+ DH S IH b n/a 11 1427 1461 1506 N
+ DH S IY b n/a 11 1427 1456 1488 N
+ DH S OW b n/a 11 1427 1461 1500 N
+ DH S Y b n/a 11 1427 1462 1488 N
+ DH SH AE b n/a 11 1427 1464 1515 N
+ DH SH AH b n/a 11 1427 1461 1495 N
+ DH SH AW b n/a 11 1427 1464 1515 N
+ DH SH AY b n/a 11 1427 1464 1500 N
+ DH SH EH b n/a 11 1427 1462 1512 N
+ DH SH ER b n/a 11 1427 1461 1519 N
+ DH SH EY b n/a 11 1427 1462 1513 N
+ DH SH IH b n/a 11 1427 1461 1506 N
+ DH SH IY b n/a 11 1427 1456 1488 N
+ DH SH OW b n/a 11 1427 1461 1500 N
+ DH SH Y b n/a 11 1427 1462 1488 N
+ DH SIL AE b n/a 11 1452 1467 1515 N
+ DH SIL AH b n/a 11 1451 1465 1501 N
+ DH SIL AW b n/a 11 1452 1467 1515 N
+ DH SIL AY b n/a 11 1451 1465 1500 N
+ DH SIL EH b n/a 11 1452 1466 1512 N
+ DH SIL ER b n/a 11 1451 1465 1519 N
+ DH SIL EY b n/a 11 1452 1466 1514 N
+ DH SIL IH b n/a 11 1453 1466 1507 N
+ DH SIL IY b n/a 11 1453 1458 1489 N
+ DH SIL OW b n/a 11 1451 1465 1500 N
+ DH SIL Y b n/a 11 1453 1466 1489 N
+ DH T AA e n/a 11 1425 1464 1500 N
+ DH T AE b n/a 11 1425 1464 1515 N
+ DH T AE e n/a 11 1425 1464 1515 N
+ DH T AH b n/a 11 1424 1459 1495 N
+ DH T AH e n/a 11 1424 1459 1495 N
+ DH T AO e n/a 11 1425 1464 1500 N
+ DH T AW b n/a 11 1425 1464 1515 N
+ DH T AW e n/a 11 1425 1464 1515 N
+ DH T AY b n/a 11 1425 1464 1500 N
+ DH T AY e n/a 11 1425 1464 1500 N
+ DH T AY i n/a 11 1425 1464 1500 N
+ DH T B e n/a 11 1425 1464 1501 N
+ DH T CH e n/a 11 1425 1464 1501 N
+ DH T D e n/a 11 1425 1464 1501 N
+ DH T DH e n/a 11 1425 1464 1501 N
+ DH T EH b n/a 11 1425 1463 1512 N
+ DH T EH e n/a 11 1425 1463 1512 N
+ DH T ER b n/a 11 1424 1459 1519 N
+ DH T ER e n/a 11 1424 1459 1519 N
+ DH T EY b n/a 11 1425 1463 1514 N
+ DH T EY e n/a 11 1425 1463 1514 N
+ DH T F e n/a 11 1425 1464 1501 N
+ DH T G e n/a 11 1425 1464 1501 N
+ DH T HH e n/a 11 1425 1464 1501 N
+ DH T IH b n/a 11 1425 1460 1506 N
+ DH T IH e n/a 11 1425 1460 1506 N
+ DH T IY b n/a 11 1425 1456 1488 N
+ DH T IY e n/a 11 1425 1456 1488 N
+ DH T IY i n/a 11 1425 1456 1488 N
+ DH T JH e n/a 11 1425 1464 1501 N
+ DH T K e n/a 11 1425 1464 1501 N
+ DH T L e n/a 11 1425 1464 1500 N
+ DH T M e n/a 11 1425 1464 1501 N
+ DH T N e n/a 11 1425 1464 1501 N
+ DH T NG e n/a 11 1425 1464 1501 N
+ DH T OW b n/a 11 1425 1464 1500 N
+ DH T OW e n/a 11 1425 1464 1500 N
+ DH T OY e n/a 11 1425 1464 1500 N
+ DH T P e n/a 11 1425 1464 1501 N
+ DH T R e n/a 11 1425 1464 1500 N
+ DH T S e n/a 11 1425 1464 1501 N
+ DH T SH e n/a 11 1425 1464 1501 N
+ DH T SIL e n/a 11 1425 1464 1501 N
+ DH T T e n/a 11 1425 1464 1501 N
+ DH T TH e n/a 11 1425 1464 1501 N
+ DH T UH e n/a 11 1425 1464 1506 N
+ DH T UW e n/a 11 1425 1456 1506 N
+ DH T V e n/a 11 1425 1464 1501 N
+ DH T W e n/a 11 1425 1464 1500 N
+ DH T Y b n/a 11 1425 1463 1488 N
+ DH T Y e n/a 11 1425 1463 1488 N
+ DH T Z e n/a 11 1425 1464 1501 N
+ DH T ZH e n/a 11 1425 1464 1501 N
+ DH TH AE b n/a 11 1425 1464 1515 N
+ DH TH AH b n/a 11 1424 1459 1495 N
+ DH TH AW b n/a 11 1425 1464 1515 N
+ DH TH AY b n/a 11 1425 1464 1500 N
+ DH TH EH b n/a 11 1425 1462 1512 N
+ DH TH ER b n/a 11 1424 1459 1519 N
+ DH TH EY b n/a 11 1425 1462 1513 N
+ DH TH IH b n/a 11 1425 1460 1506 N
+ DH TH IY b n/a 11 1425 1456 1488 N
+ DH TH OW b n/a 11 1425 1459 1500 N
+ DH TH Y b n/a 11 1425 1462 1488 N
+ DH UH AE b n/a 11 1440 1476 1516 N
+ DH UH AH b n/a 11 1440 1473 1502 N
+ DH UH AW b n/a 11 1440 1476 1516 N
+ DH UH AY b n/a 11 1440 1476 1503 N
+ DH UH EH b n/a 11 1440 1475 1511 N
+ DH UH ER b n/a 11 1439 1483 1519 N
+ DH UH ER i n/a 11 1439 1483 1519 N
+ DH UH EY b n/a 11 1440 1475 1513 N
+ DH UH IH b n/a 11 1440 1473 1505 N
+ DH UH IY b n/a 11 1440 1479 1490 N
+ DH UH OW b n/a 11 1440 1476 1503 N
+ DH UH Y b n/a 11 1440 1479 1490 N
+ DH UW AA e n/a 11 1437 1476 1503 N
+ DH UW AE b n/a 11 1437 1476 1516 N
+ DH UW AE e n/a 11 1437 1476 1516 N
+ DH UW AH b n/a 11 1437 1473 1502 N
+ DH UW AH e n/a 11 1437 1473 1502 N
+ DH UW AH i n/a 11 1437 1473 1502 N
+ DH UW AO e n/a 11 1437 1476 1503 N
+ DH UW AW b n/a 11 1437 1476 1516 N
+ DH UW AW e n/a 11 1437 1476 1516 N
+ DH UW AY b n/a 11 1437 1476 1503 N
+ DH UW AY e n/a 11 1437 1476 1503 N
+ DH UW B e n/a 11 1437 1478 1508 N
+ DH UW CH e n/a 11 1437 1478 1508 N
+ DH UW D e n/a 11 1437 1478 1508 N
+ DH UW D i n/a 11 1437 1478 1508 N
+ DH UW DH e n/a 11 1437 1478 1508 N
+ DH UW EH b n/a 11 1437 1475 1511 N
+ DH UW EH e n/a 11 1437 1475 1511 N
+ DH UW ER b n/a 11 1439 1483 1520 N
+ DH UW ER e n/a 11 1439 1483 1520 N
+ DH UW ER i n/a 11 1439 1483 1520 N
+ DH UW EY b n/a 11 1437 1475 1513 N
+ DH UW EY e n/a 11 1437 1475 1513 N
+ DH UW F e n/a 11 1437 1478 1508 N
+ DH UW G e n/a 11 1437 1478 1508 N
+ DH UW HH e n/a 11 1437 1478 1508 N
+ DH UW IH b n/a 11 1437 1473 1505 N
+ DH UW IH e n/a 11 1437 1474 1505 N
+ DH UW IH i n/a 11 1437 1474 1505 N
+ DH UW IY b n/a 11 1437 1479 1490 N
+ DH UW IY e n/a 11 1437 1479 1490 N
+ DH UW IY i n/a 11 1437 1479 1490 N
+ DH UW JH e n/a 11 1437 1478 1508 N
+ DH UW K e n/a 11 1437 1478 1508 N
+ DH UW L e n/a 11 1437 1478 1508 N
+ DH UW L i n/a 11 1437 1478 1508 N
+ DH UW M e n/a 11 1437 1478 1508 N
+ DH UW N e n/a 11 1437 1478 1508 N
+ DH UW N i n/a 11 1437 1478 1508 N
+ DH UW NG e n/a 11 1437 1478 1508 N
+ DH UW OW b n/a 11 1437 1476 1503 N
+ DH UW OW e n/a 11 1437 1476 1503 N
+ DH UW OY e n/a 11 1437 1476 1503 N
+ DH UW P e n/a 11 1437 1478 1508 N
+ DH UW R e n/a 11 1437 1478 1508 N
+ DH UW S e n/a 11 1437 1478 1508 N
+ DH UW S i n/a 11 1437 1478 1508 N
+ DH UW SH e n/a 11 1437 1478 1508 N
+ DH UW SIL e n/a 11 1437 1478 1508 N
+ DH UW T e n/a 11 1437 1478 1508 N
+ DH UW TH e n/a 11 1437 1478 1508 N
+ DH UW UH e n/a 11 1437 1476 1505 N
+ DH UW UW e n/a 11 1437 1476 1505 N
+ DH UW V e n/a 11 1437 1478 1508 N
+ DH UW W e n/a 11 1437 1478 1508 N
+ DH UW Y b n/a 11 1437 1479 1490 N
+ DH UW Y e n/a 11 1437 1479 1490 N
+ DH UW Z e n/a 11 1437 1478 1508 N
+ DH UW Z i n/a 11 1437 1478 1508 N
+ DH UW ZH e n/a 11 1437 1478 1508 N
+ DH V AE b n/a 11 1454 1469 1515 N
+ DH V AH b n/a 11 1454 1471 1498 N
+ DH V AW b n/a 11 1454 1469 1515 N
+ DH V AY b n/a 11 1454 1471 1497 N
+ DH V EH b n/a 11 1454 1469 1511 N
+ DH V ER b n/a 11 1454 1471 1519 N
+ DH V EY b n/a 11 1455 1469 1513 N
+ DH V IH b n/a 11 1455 1471 1505 N
+ DH V IY b n/a 11 1455 1457 1490 N
+ DH V OW b n/a 11 1454 1471 1497 N
+ DH V Y b n/a 11 1455 1469 1490 N
+ DH W AE b n/a 11 1435 1481 1517 N
+ DH W AH b n/a 11 1435 1480 1494 N
+ DH W AW b n/a 11 1435 1481 1517 N
+ DH W AY b n/a 11 1435 1480 1494 N
+ DH W EH b n/a 11 1435 1481 1511 N
+ DH W ER b n/a 11 1439 1483 1519 N
+ DH W EY b n/a 11 1435 1481 1513 N
+ DH W IH b n/a 11 1435 1481 1494 N
+ DH W IY b n/a 11 1435 1481 1490 N
+ DH W OW b n/a 11 1435 1480 1494 N
+ DH W Y b n/a 11 1435 1481 1490 N
+ DH Y AE b n/a 11 1450 1477 1516 N
+ DH Y AH b n/a 11 1449 1477 1504 N
+ DH Y AW b n/a 11 1450 1477 1516 N
+ DH Y AY b n/a 11 1449 1477 1504 N
+ DH Y EH b n/a 11 1450 1477 1511 N
+ DH Y ER b n/a 11 1449 1483 1519 N
+ DH Y EY b n/a 11 1450 1477 1513 N
+ DH Y IH b n/a 11 1449 1477 1505 N
+ DH Y IY b n/a 11 1449 1479 1490 N
+ DH Y OW b n/a 11 1449 1477 1504 N
+ DH Y Y b n/a 11 1449 1479 1490 N
+ DH Z AE b n/a 11 1426 1464 1515 N
+ DH Z AH b n/a 11 1426 1461 1496 N
+ DH Z AW b n/a 11 1426 1464 1515 N
+ DH Z AY b n/a 11 1426 1464 1497 N
+ DH Z EH b n/a 11 1426 1462 1511 N
+ DH Z ER b n/a 11 1426 1461 1519 N
+ DH Z EY b n/a 11 1426 1462 1513 N
+ DH Z IH b n/a 11 1426 1461 1506 N
+ DH Z IY b n/a 11 1426 1456 1488 N
+ DH Z IY i n/a 11 1426 1456 1488 N
+ DH Z OW b n/a 11 1426 1461 1497 N
+ DH Z Y b n/a 11 1426 1462 1488 N
+ DH ZH AE b n/a 11 1426 1464 1515 N
+ DH ZH AH b n/a 11 1426 1461 1496 N
+ DH ZH AW b n/a 11 1426 1464 1515 N
+ DH ZH AY b n/a 11 1426 1464 1497 N
+ DH ZH EH b n/a 11 1426 1462 1511 N
+ DH ZH ER b n/a 11 1426 1461 1519 N
+ DH ZH EY b n/a 11 1426 1462 1513 N
+ DH ZH IH b n/a 11 1426 1461 1506 N
+ DH ZH IY b n/a 11 1426 1456 1488 N
+ DH ZH OW b n/a 11 1426 1461 1497 N
+ DH ZH Y b n/a 11 1426 1462 1488 N
+ EH AA AA s n/a 12 1573 1625 1686 N
+ EH AA AE s n/a 12 1573 1625 1656 N
+ EH AA AH b n/a 12 1573 1625 1656 N
+ EH AA AH s n/a 12 1573 1625 1656 N
+ EH AA AO s n/a 12 1573 1625 1686 N
+ EH AA AW s n/a 12 1573 1625 1656 N
+ EH AA AY s n/a 12 1573 1625 1686 N
+ EH AA B b n/a 12 1573 1625 1671 N
+ EH AA B s n/a 12 1573 1625 1671 N
+ EH AA CH b n/a 12 1573 1624 1651 N
+ EH AA CH s n/a 12 1573 1624 1651 N
+ EH AA D b n/a 12 1573 1628 1656 N
+ EH AA D s n/a 12 1573 1628 1656 N
+ EH AA DH b n/a 12 1573 1625 1669 N
+ EH AA DH s n/a 12 1573 1625 1670 N
+ EH AA EH b n/a 12 1573 1625 1656 N
+ EH AA EH s n/a 12 1573 1625 1656 N
+ EH AA ER b n/a 12 1573 1645 1686 N
+ EH AA ER s n/a 12 1573 1645 1686 N
+ EH AA EY s n/a 12 1573 1625 1656 N
+ EH AA F b n/a 12 1573 1624 1660 N
+ EH AA F s n/a 12 1573 1624 1660 N
+ EH AA G b n/a 12 1573 1628 1659 N
+ EH AA G s n/a 12 1573 1628 1659 N
+ EH AA HH b n/a 12 1573 1624 1651 N
+ EH AA HH s n/a 12 1573 1624 1651 N
+ EH AA IH b n/a 12 1573 1625 1656 N
+ EH AA IH s n/a 12 1573 1625 1656 N
+ EH AA IY b n/a 12 1573 1625 1656 N
+ EH AA IY s n/a 12 1573 1625 1656 N
+ EH AA JH b n/a 12 1573 1625 1656 N
+ EH AA JH s n/a 12 1573 1625 1656 N
+ EH AA K b n/a 12 1573 1622 1658 N
+ EH AA K s n/a 12 1573 1622 1658 N
+ EH AA L b n/a 12 1573 1638 1690 N
+ EH AA L i n/a 12 1574 1638 1690 N
+ EH AA L s n/a 12 1573 1638 1690 N
+ EH AA M b n/a 12 1573 1627 1673 N
+ EH AA M i n/a 12 1576 1627 1673 N
+ EH AA M s n/a 12 1573 1627 1673 N
+ EH AA N b n/a 12 1573 1627 1677 N
+ EH AA N i n/a 12 1575 1627 1676 N
+ EH AA N s n/a 12 1573 1627 1677 N
+ EH AA NG b n/a 12 1573 1627 1677 N
+ EH AA NG s n/a 12 1573 1627 1677 N
+ EH AA OW s n/a 12 1573 1625 1686 N
+ EH AA OY s n/a 12 1573 1625 1686 N
+ EH AA P b n/a 12 1573 1624 1672 N
+ EH AA P s n/a 12 1573 1624 1672 N
+ EH AA R b n/a 12 1573 1645 1686 N
+ EH AA R s n/a 12 1573 1645 1686 N
+ EH AA S b n/a 12 1573 1624 1662 N
+ EH AA S i n/a 12 1576 1624 1662 N
+ EH AA S s n/a 12 1573 1624 1662 N
+ EH AA SH b n/a 12 1573 1624 1665 N
+ EH AA SH s n/a 12 1573 1624 1665 N
+ EH AA SIL s n/a 12 1573 1624 1651 N
+ EH AA T b n/a 12 1573 1624 1651 N
+ EH AA T i n/a 12 1576 1624 1651 N
+ EH AA T s n/a 12 1573 1624 1651 N
+ EH AA TH b n/a 12 1573 1624 1660 N
+ EH AA TH s n/a 12 1573 1624 1660 N
+ EH AA UH s n/a 12 1573 1625 1686 N
+ EH AA UW s n/a 12 1573 1625 1686 N
+ EH AA V b n/a 12 1573 1625 1675 N
+ EH AA V i n/a 12 1576 1625 1671 N
+ EH AA V s n/a 12 1573 1625 1675 N
+ EH AA W s n/a 12 1573 1638 1690 N
+ EH AA Y s n/a 12 1573 1638 1656 N
+ EH AA Z b n/a 12 1573 1625 1669 N
+ EH AA Z i n/a 12 1576 1625 1670 N
+ EH AA Z s n/a 12 1573 1625 1670 N
+ EH AA ZH s n/a 12 1573 1625 1670 N
+ EH AE AA s n/a 12 1522 1583 1685 N
+ EH AE AE s n/a 12 1522 1583 1656 N
+ EH AE AH b n/a 12 1522 1602 1656 N
+ EH AE AH s n/a 12 1522 1583 1656 N
+ EH AE AO s n/a 12 1522 1583 1685 N
+ EH AE AW s n/a 12 1522 1583 1656 N
+ EH AE AY s n/a 12 1522 1583 1685 N
+ EH AE B b n/a 12 1522 1592 1671 N
+ EH AE B s n/a 12 1522 1592 1671 N
+ EH AE CH b n/a 12 1522 1599 1651 N
+ EH AE CH s n/a 12 1522 1584 1651 N
+ EH AE D b n/a 12 1522 1619 1656 N
+ EH AE D s n/a 12 1522 1618 1656 N
+ EH AE DH b n/a 12 1522 1595 1667 N
+ EH AE DH s n/a 12 1522 1585 1667 N
+ EH AE EH b n/a 12 1522 1602 1656 N
+ EH AE EH s n/a 12 1522 1583 1656 N
+ EH AE ER b n/a 12 1522 1645 1685 N
+ EH AE ER s n/a 12 1522 1645 1685 N
+ EH AE EY s n/a 12 1522 1583 1656 N
+ EH AE F b n/a 12 1522 1583 1660 N
+ EH AE F s n/a 12 1522 1583 1660 N
+ EH AE G b n/a 12 1522 1608 1659 N
+ EH AE G s n/a 12 1522 1608 1659 N
+ EH AE HH b n/a 12 1522 1599 1651 N
+ EH AE HH s n/a 12 1522 1583 1651 N
+ EH AE IH b n/a 12 1522 1602 1656 N
+ EH AE IH s n/a 12 1522 1583 1656 N
+ EH AE IY b n/a 12 1522 1602 1656 N
+ EH AE IY s n/a 12 1522 1583 1656 N
+ EH AE JH b n/a 12 1522 1602 1656 N
+ EH AE JH s n/a 12 1522 1584 1656 N
+ EH AE K b n/a 12 1522 1606 1657 N
+ EH AE K s n/a 12 1522 1606 1657 N
+ EH AE L b n/a 12 1522 1638 1690 N
+ EH AE L i n/a 12 1531 1638 1690 N
+ EH AE L s n/a 12 1522 1638 1690 N
+ EH AE M b n/a 12 1522 1592 1673 N
+ EH AE M i n/a 12 1533 1592 1673 N
+ EH AE M s n/a 12 1522 1592 1673 N
+ EH AE N b n/a 12 1522 1614 1677 N
+ EH AE N i n/a 12 1533 1610 1678 N
+ EH AE N s n/a 12 1522 1614 1677 N
+ EH AE NG b n/a 12 1522 1608 1677 N
+ EH AE NG s n/a 12 1522 1608 1677 N
+ EH AE OW s n/a 12 1522 1583 1685 N
+ EH AE OY s n/a 12 1522 1583 1685 N
+ EH AE P b n/a 12 1522 1583 1672 N
+ EH AE P s n/a 12 1522 1583 1672 N
+ EH AE R b n/a 12 1522 1645 1685 N
+ EH AE R s n/a 12 1522 1645 1685 N
+ EH AE S b n/a 12 1522 1599 1662 N
+ EH AE S s n/a 12 1522 1583 1662 N
+ EH AE SH b n/a 12 1522 1599 1665 N
+ EH AE SH s n/a 12 1522 1583 1665 N
+ EH AE SIL s n/a 12 1522 1583 1651 N
+ EH AE T b n/a 12 1522 1599 1651 N
+ EH AE T s n/a 12 1522 1584 1651 N
+ EH AE TH b n/a 12 1522 1599 1660 N
+ EH AE TH s n/a 12 1522 1585 1660 N
+ EH AE UH s n/a 12 1522 1583 1685 N
+ EH AE UW s n/a 12 1522 1583 1685 N
+ EH AE V b n/a 12 1522 1593 1675 N
+ EH AE V s n/a 12 1522 1593 1675 N
+ EH AE W s n/a 12 1522 1592 1690 N
+ EH AE Y s n/a 12 1522 1583 1656 N
+ EH AE Z b n/a 12 1521 1595 1669 N
+ EH AE Z i n/a 12 1531 1583 1670 N
+ EH AE Z s n/a 12 1521 1583 1670 N
+ EH AE ZH s n/a 12 1521 1583 1670 N
+ EH AH AA s n/a 12 1522 1583 1685 N
+ EH AH AE s n/a 12 1522 1583 1656 N
+ EH AH AH b n/a 12 1522 1602 1656 N
+ EH AH AH s n/a 12 1522 1583 1656 N
+ EH AH AO s n/a 12 1522 1583 1685 N
+ EH AH AW s n/a 12 1522 1583 1656 N
+ EH AH AY s n/a 12 1522 1583 1685 N
+ EH AH B b n/a 12 1522 1591 1671 N
+ EH AH B s n/a 12 1522 1591 1671 N
+ EH AH CH b n/a 12 1522 1599 1651 N
+ EH AH CH i n/a 12 1531 1584 1651 N
+ EH AH CH s n/a 12 1522 1584 1651 N
+ EH AH D b n/a 12 1522 1619 1656 N
+ EH AH D i n/a 12 1531 1618 1656 N
+ EH AH D s n/a 12 1522 1618 1656 N
+ EH AH DH b n/a 12 1522 1595 1667 N
+ EH AH DH s n/a 12 1522 1585 1667 N
+ EH AH EH b n/a 12 1522 1602 1656 N
+ EH AH EH s n/a 12 1522 1583 1656 N
+ EH AH ER b n/a 12 1522 1645 1685 N
+ EH AH ER s n/a 12 1522 1645 1685 N
+ EH AH EY s n/a 12 1522 1583 1656 N
+ EH AH F b n/a 12 1522 1583 1660 N
+ EH AH F s n/a 12 1522 1583 1660 N
+ EH AH G b n/a 12 1522 1608 1659 N
+ EH AH G s n/a 12 1522 1608 1659 N
+ EH AH HH b n/a 12 1522 1599 1651 N
+ EH AH HH s n/a 12 1522 1583 1651 N
+ EH AH IH b n/a 12 1522 1602 1656 N
+ EH AH IH s n/a 12 1522 1583 1656 N
+ EH AH IY b n/a 12 1522 1602 1656 N
+ EH AH IY s n/a 12 1522 1583 1656 N
+ EH AH JH b n/a 12 1522 1602 1656 N
+ EH AH JH s n/a 12 1522 1584 1656 N
+ EH AH K b n/a 12 1522 1606 1657 N
+ EH AH K s n/a 12 1522 1606 1657 N
+ EH AH L b n/a 12 1522 1638 1690 N
+ EH AH L i n/a 12 1531 1638 1690 N
+ EH AH L s n/a 12 1522 1638 1690 N
+ EH AH M b n/a 12 1522 1591 1673 N
+ EH AH M s n/a 12 1522 1591 1673 N
+ EH AH N b n/a 12 1522 1615 1677 N
+ EH AH N s n/a 12 1522 1615 1677 N
+ EH AH NG b n/a 12 1522 1608 1677 N
+ EH AH NG s n/a 12 1522 1608 1677 N
+ EH AH OW s n/a 12 1522 1583 1685 N
+ EH AH OY s n/a 12 1522 1583 1685 N
+ EH AH P b n/a 12 1522 1583 1672 N
+ EH AH P s n/a 12 1522 1583 1672 N
+ EH AH R b n/a 12 1522 1645 1685 N
+ EH AH R s n/a 12 1522 1645 1685 N
+ EH AH S b n/a 12 1522 1599 1662 N
+ EH AH S i n/a 12 1531 1583 1662 N
+ EH AH S s n/a 12 1522 1583 1662 N
+ EH AH SH b n/a 12 1522 1599 1665 N
+ EH AH SH s n/a 12 1522 1583 1665 N
+ EH AH SIL s n/a 12 1522 1583 1651 N
+ EH AH T b n/a 12 1522 1599 1651 N
+ EH AH T i n/a 12 1531 1584 1651 N
+ EH AH T s n/a 12 1522 1584 1651 N
+ EH AH TH b n/a 12 1522 1599 1660 N
+ EH AH TH s n/a 12 1522 1585 1660 N
+ EH AH UH s n/a 12 1522 1583 1685 N
+ EH AH UW s n/a 12 1522 1583 1685 N
+ EH AH V b n/a 12 1522 1593 1675 N
+ EH AH V i n/a 12 1531 1590 1671 N
+ EH AH V s n/a 12 1522 1593 1675 N
+ EH AH W s n/a 12 1522 1591 1690 N
+ EH AH Y s n/a 12 1522 1583 1656 N
+ EH AH Z b n/a 12 1521 1595 1669 N
+ EH AH Z s n/a 12 1521 1583 1670 N
+ EH AH ZH s n/a 12 1521 1583 1670 N
+ EH AO AA s n/a 12 1573 1625 1684 N
+ EH AO AE s n/a 12 1573 1625 1656 N
+ EH AO AH b n/a 12 1573 1625 1656 N
+ EH AO AH s n/a 12 1573 1625 1656 N
+ EH AO AO s n/a 12 1573 1625 1684 N
+ EH AO AW s n/a 12 1573 1625 1656 N
+ EH AO AY s n/a 12 1573 1625 1684 N
+ EH AO B b n/a 12 1573 1625 1671 N
+ EH AO B s n/a 12 1573 1625 1671 N
+ EH AO CH b n/a 12 1573 1624 1651 N
+ EH AO CH s n/a 12 1573 1624 1651 N
+ EH AO D b n/a 12 1573 1628 1656 N
+ EH AO D s n/a 12 1573 1628 1656 N
+ EH AO DH b n/a 12 1573 1625 1669 N
+ EH AO DH s n/a 12 1573 1625 1670 N
+ EH AO EH b n/a 12 1573 1625 1656 N
+ EH AO EH s n/a 12 1573 1625 1656 N
+ EH AO ER b n/a 12 1573 1650 1684 N
+ EH AO ER s n/a 12 1573 1650 1684 N
+ EH AO EY s n/a 12 1573 1625 1656 N
+ EH AO F b n/a 12 1573 1624 1660 N
+ EH AO F s n/a 12 1573 1624 1660 N
+ EH AO G b n/a 12 1573 1628 1659 N
+ EH AO G s n/a 12 1573 1628 1659 N
+ EH AO HH b n/a 12 1573 1624 1651 N
+ EH AO HH s n/a 12 1573 1624 1651 N
+ EH AO IH b n/a 12 1573 1625 1656 N
+ EH AO IH s n/a 12 1573 1625 1656 N
+ EH AO IY b n/a 12 1573 1625 1656 N
+ EH AO IY s n/a 12 1573 1625 1656 N
+ EH AO JH b n/a 12 1573 1625 1656 N
+ EH AO JH s n/a 12 1573 1625 1656 N
+ EH AO K b n/a 12 1573 1622 1658 N
+ EH AO K s n/a 12 1573 1622 1658 N
+ EH AO L b n/a 12 1573 1638 1690 N
+ EH AO L s n/a 12 1573 1638 1690 N
+ EH AO M b n/a 12 1573 1627 1673 N
+ EH AO M s n/a 12 1573 1627 1673 N
+ EH AO N b n/a 12 1573 1627 1677 N
+ EH AO N i n/a 12 1575 1627 1676 N
+ EH AO N s n/a 12 1573 1627 1677 N
+ EH AO NG b n/a 12 1573 1627 1677 N
+ EH AO NG s n/a 12 1573 1627 1677 N
+ EH AO OW s n/a 12 1573 1625 1684 N
+ EH AO OY s n/a 12 1573 1625 1684 N
+ EH AO P b n/a 12 1573 1624 1672 N
+ EH AO P s n/a 12 1573 1624 1672 N
+ EH AO R b n/a 12 1573 1650 1684 N
+ EH AO R i n/a 12 1574 1650 1684 N
+ EH AO R s n/a 12 1573 1650 1684 N
+ EH AO S b n/a 12 1573 1624 1662 N
+ EH AO S s n/a 12 1573 1624 1662 N
+ EH AO SH b n/a 12 1573 1624 1665 N
+ EH AO SH s n/a 12 1573 1624 1665 N
+ EH AO SIL s n/a 12 1573 1624 1651 N
+ EH AO T b n/a 12 1573 1624 1651 N
+ EH AO T s n/a 12 1573 1624 1651 N
+ EH AO TH b n/a 12 1573 1624 1660 N
+ EH AO TH s n/a 12 1573 1624 1660 N
+ EH AO UH s n/a 12 1573 1625 1684 N
+ EH AO UW s n/a 12 1573 1625 1684 N
+ EH AO V b n/a 12 1573 1625 1675 N
+ EH AO V s n/a 12 1573 1625 1675 N
+ EH AO W s n/a 12 1573 1638 1690 N
+ EH AO Y s n/a 12 1573 1638 1656 N
+ EH AO Z b n/a 12 1573 1625 1669 N
+ EH AO Z s n/a 12 1573 1625 1670 N
+ EH AO ZH s n/a 12 1573 1625 1670 N
+ EH AW AA s n/a 12 1578 1621 1685 N
+ EH AW AE s n/a 12 1578 1621 1656 N
+ EH AW AH b n/a 12 1578 1621 1656 N
+ EH AW AH s n/a 12 1578 1621 1656 N
+ EH AW AO s n/a 12 1578 1621 1685 N
+ EH AW AW s n/a 12 1578 1621 1656 N
+ EH AW AY s n/a 12 1578 1621 1685 N
+ EH AW B b n/a 12 1578 1625 1671 N
+ EH AW B s n/a 12 1578 1625 1671 N
+ EH AW CH b n/a 12 1578 1621 1651 N
+ EH AW CH s n/a 12 1578 1621 1651 N
+ EH AW D b n/a 12 1578 1628 1656 N
+ EH AW D s n/a 12 1578 1628 1656 N
+ EH AW DH b n/a 12 1578 1621 1667 N
+ EH AW DH s n/a 12 1578 1621 1667 N
+ EH AW EH b n/a 12 1578 1621 1656 N
+ EH AW EH s n/a 12 1578 1621 1656 N
+ EH AW ER b n/a 12 1582 1645 1685 N
+ EH AW ER s n/a 12 1582 1645 1685 N
+ EH AW EY s n/a 12 1578 1621 1656 N
+ EH AW F b n/a 12 1578 1624 1660 N
+ EH AW F s n/a 12 1578 1624 1660 N
+ EH AW G b n/a 12 1578 1628 1659 N
+ EH AW G s n/a 12 1578 1628 1659 N
+ EH AW HH b n/a 12 1578 1621 1651 N
+ EH AW HH s n/a 12 1578 1621 1651 N
+ EH AW IH b n/a 12 1578 1621 1656 N
+ EH AW IH s n/a 12 1578 1621 1656 N
+ EH AW IY b n/a 12 1578 1621 1656 N
+ EH AW IY s n/a 12 1578 1621 1656 N
+ EH AW JH b n/a 12 1578 1621 1656 N
+ EH AW JH s n/a 12 1578 1621 1656 N
+ EH AW K b n/a 12 1578 1623 1658 N
+ EH AW K s n/a 12 1578 1623 1658 N
+ EH AW L b n/a 12 1578 1638 1690 N
+ EH AW L i n/a 12 1578 1638 1690 N
+ EH AW L s n/a 12 1578 1638 1690 N
+ EH AW M b n/a 12 1582 1627 1673 N
+ EH AW M s n/a 12 1582 1627 1673 N
+ EH AW N b n/a 12 1582 1627 1677 N
+ EH AW N s n/a 12 1582 1627 1677 N
+ EH AW NG b n/a 12 1582 1627 1677 N
+ EH AW NG s n/a 12 1582 1627 1677 N
+ EH AW OW s n/a 12 1578 1621 1685 N
+ EH AW OY s n/a 12 1578 1621 1685 N
+ EH AW P b n/a 12 1578 1624 1672 N
+ EH AW P s n/a 12 1578 1624 1672 N
+ EH AW R b n/a 12 1582 1645 1685 N
+ EH AW R s n/a 12 1582 1645 1685 N
+ EH AW S b n/a 12 1578 1623 1662 N
+ EH AW S s n/a 12 1578 1623 1662 N
+ EH AW SH b n/a 12 1578 1623 1665 N
+ EH AW SH s n/a 12 1578 1623 1665 N
+ EH AW SIL s n/a 12 1578 1621 1651 N
+ EH AW T b n/a 12 1578 1621 1651 N
+ EH AW T s n/a 12 1578 1621 1651 N
+ EH AW TH b n/a 12 1578 1621 1660 N
+ EH AW TH i n/a 12 1578 1621 1660 N
+ EH AW TH s n/a 12 1578 1621 1660 N
+ EH AW UH s n/a 12 1578 1621 1685 N
+ EH AW UW s n/a 12 1578 1621 1685 N
+ EH AW V b n/a 12 1578 1625 1675 N
+ EH AW V i n/a 12 1578 1625 1671 N
+ EH AW V s n/a 12 1578 1625 1675 N
+ EH AW W s n/a 12 1578 1638 1690 N
+ EH AW Y s n/a 12 1578 1638 1656 N
+ EH AW Z b n/a 12 1578 1621 1669 N
+ EH AW Z s n/a 12 1578 1621 1670 N
+ EH AW ZH s n/a 12 1578 1621 1670 N
+ EH AY AA s n/a 12 1531 1583 1686 N
+ EH AY AE s n/a 12 1531 1583 1656 N
+ EH AY AH b n/a 12 1531 1602 1656 N
+ EH AY AH s n/a 12 1531 1583 1656 N
+ EH AY AO s n/a 12 1531 1583 1686 N
+ EH AY AW s n/a 12 1531 1583 1656 N
+ EH AY AY s n/a 12 1531 1583 1686 N
+ EH AY B b n/a 12 1531 1591 1671 N
+ EH AY B s n/a 12 1531 1591 1671 N
+ EH AY CH b n/a 12 1531 1599 1651 N
+ EH AY CH s n/a 12 1531 1584 1651 N
+ EH AY D b n/a 12 1531 1619 1656 N
+ EH AY D s n/a 12 1531 1618 1656 N
+ EH AY DH b n/a 12 1531 1595 1669 N
+ EH AY DH s n/a 12 1531 1585 1670 N
+ EH AY EH b n/a 12 1531 1602 1656 N
+ EH AY EH s n/a 12 1531 1583 1656 N
+ EH AY ER b n/a 12 1533 1645 1686 N
+ EH AY ER s n/a 12 1533 1645 1686 N
+ EH AY EY s n/a 12 1531 1583 1656 N
+ EH AY F b n/a 12 1531 1583 1660 N
+ EH AY F i n/a 12 1531 1583 1660 N
+ EH AY F s n/a 12 1531 1583 1660 N
+ EH AY G b n/a 12 1531 1608 1659 N
+ EH AY G s n/a 12 1531 1608 1659 N
+ EH AY HH b n/a 12 1531 1599 1651 N
+ EH AY HH s n/a 12 1531 1583 1651 N
+ EH AY IH b n/a 12 1531 1602 1656 N
+ EH AY IH s n/a 12 1531 1583 1656 N
+ EH AY IY b n/a 12 1531 1602 1656 N
+ EH AY IY s n/a 12 1531 1583 1656 N
+ EH AY JH b n/a 12 1531 1602 1656 N
+ EH AY JH s n/a 12 1531 1584 1656 N
+ EH AY K b n/a 12 1531 1606 1657 N
+ EH AY K i n/a 12 1531 1605 1657 N
+ EH AY K s n/a 12 1531 1606 1657 N
+ EH AY L b n/a 12 1531 1638 1690 N
+ EH AY L i n/a 12 1531 1638 1690 N
+ EH AY L s n/a 12 1531 1638 1690 N
+ EH AY M b n/a 12 1533 1591 1674 N
+ EH AY M i n/a 12 1533 1589 1674 N
+ EH AY M s n/a 12 1533 1591 1674 N
+ EH AY N b n/a 12 1533 1615 1677 N
+ EH AY N i n/a 12 1533 1609 1678 N
+ EH AY N s n/a 12 1533 1615 1677 N
+ EH AY NG b n/a 12 1533 1608 1677 N
+ EH AY NG s n/a 12 1533 1608 1677 N
+ EH AY OW s n/a 12 1531 1583 1686 N
+ EH AY OY s n/a 12 1531 1583 1686 N
+ EH AY P b n/a 12 1531 1583 1672 N
+ EH AY P s n/a 12 1531 1583 1672 N
+ EH AY R b n/a 12 1533 1645 1686 N
+ EH AY R i n/a 12 1540 1645 1686 N
+ EH AY R s n/a 12 1533 1645 1686 N
+ EH AY S b n/a 12 1531 1599 1662 N
+ EH AY S i n/a 12 1531 1583 1662 N
+ EH AY S s n/a 12 1531 1583 1662 N
+ EH AY SH b n/a 12 1531 1599 1665 N
+ EH AY SH i n/a 12 1531 1583 1665 N
+ EH AY SH s n/a 12 1531 1583 1665 N
+ EH AY SIL s n/a 12 1531 1583 1651 N
+ EH AY T b n/a 12 1531 1599 1651 N
+ EH AY T i n/a 12 1531 1584 1651 N
+ EH AY T s n/a 12 1531 1584 1651 N
+ EH AY TH b n/a 12 1531 1599 1660 N
+ EH AY TH i n/a 12 1531 1585 1660 N
+ EH AY TH s n/a 12 1531 1585 1660 N
+ EH AY UH s n/a 12 1531 1583 1686 N
+ EH AY UW s n/a 12 1531 1583 1686 N
+ EH AY V b n/a 12 1531 1593 1675 N
+ EH AY V i n/a 12 1531 1590 1671 N
+ EH AY V s n/a 12 1531 1593 1675 N
+ EH AY W s n/a 12 1531 1591 1690 N
+ EH AY Y s n/a 12 1531 1583 1656 N
+ EH AY Z b n/a 12 1531 1595 1669 N
+ EH AY Z i n/a 12 1531 1583 1670 N
+ EH AY Z s n/a 12 1531 1583 1670 N
+ EH AY ZH s n/a 12 1531 1583 1670 N
+ EH B AA s n/a 12 1522 1602 1685 N
+ EH B AE s n/a 12 1522 1602 1654 N
+ EH B AH b n/a 12 1522 1602 1654 N
+ EH B AH s n/a 12 1522 1602 1654 N
+ EH B AO s n/a 12 1522 1602 1685 N
+ EH B AW s n/a 12 1522 1602 1654 N
+ EH B AY s n/a 12 1522 1602 1685 N
+ EH B B b n/a 12 1522 1591 1671 N
+ EH B B i n/a 12 1534 1590 1671 N
+ EH B B s n/a 12 1522 1591 1671 N
+ EH B CH b n/a 12 1522 1599 1652 N
+ EH B CH i n/a 12 1534 1598 1652 N
+ EH B CH s n/a 12 1522 1598 1652 N
+ EH B D b n/a 12 1522 1618 1654 N
+ EH B D i n/a 12 1534 1618 1654 N
+ EH B D s n/a 12 1522 1618 1654 N
+ EH B DH b n/a 12 1522 1595 1668 N
+ EH B DH i n/a 12 1534 1602 1668 N
+ EH B DH s n/a 12 1522 1595 1668 N
+ EH B EH b n/a 12 1522 1602 1654 N
+ EH B EH s n/a 12 1522 1602 1654 N
+ EH B ER b n/a 12 1523 1646 1685 N
+ EH B ER s n/a 12 1523 1646 1685 N
+ EH B EY s n/a 12 1522 1602 1654 N
+ EH B F b n/a 12 1522 1583 1660 N
+ EH B F i n/a 12 1534 1583 1660 N
+ EH B F s n/a 12 1522 1583 1660 N
+ EH B G b n/a 12 1522 1608 1659 N
+ EH B G i n/a 12 1534 1608 1659 N
+ EH B G s n/a 12 1522 1608 1659 N
+ EH B HH b n/a 12 1522 1599 1652 N
+ EH B HH i n/a 12 1534 1598 1652 N
+ EH B HH s n/a 12 1522 1598 1652 N
+ EH B IH b n/a 12 1522 1602 1654 N
+ EH B IH i n/a 12 1534 1602 1654 N
+ EH B IH s n/a 12 1522 1602 1654 N
+ EH B IY b n/a 12 1522 1602 1654 N
+ EH B IY i n/a 12 1534 1602 1654 N
+ EH B IY s n/a 12 1522 1602 1654 N
+ EH B JH b n/a 12 1522 1602 1656 N
+ EH B JH i n/a 12 1534 1602 1656 N
+ EH B JH s n/a 12 1522 1602 1656 N
+ EH B K b n/a 12 1522 1606 1657 N
+ EH B K i n/a 12 1534 1605 1657 N
+ EH B K s n/a 12 1522 1606 1657 N
+ EH B L b n/a 12 1522 1642 1691 N
+ EH B L i n/a 12 1535 1642 1691 N
+ EH B L s n/a 12 1522 1642 1691 N
+ EH B M b n/a 12 1523 1591 1673 N
+ EH B M i n/a 12 1534 1589 1673 N
+ EH B M s n/a 12 1523 1591 1673 N
+ EH B N b n/a 12 1523 1615 1677 N
+ EH B N i n/a 12 1534 1611 1676 N
+ EH B N s n/a 12 1523 1615 1677 N
+ EH B NG b n/a 12 1523 1608 1677 N
+ EH B NG i n/a 12 1534 1608 1677 N
+ EH B NG s n/a 12 1523 1608 1677 N
+ EH B OW s n/a 12 1522 1602 1685 N
+ EH B OY s n/a 12 1522 1602 1685 N
+ EH B P b n/a 12 1522 1583 1672 N
+ EH B P i n/a 12 1534 1583 1672 N
+ EH B P s n/a 12 1522 1583 1672 N
+ EH B R b n/a 12 1523 1646 1685 N
+ EH B R i n/a 12 1539 1646 1685 N
+ EH B R s n/a 12 1523 1646 1685 N
+ EH B S b n/a 12 1522 1599 1663 N
+ EH B S i n/a 12 1534 1598 1663 N
+ EH B S s n/a 12 1522 1598 1663 N
+ EH B SH b n/a 12 1522 1599 1665 N
+ EH B SH i n/a 12 1534 1598 1665 N
+ EH B SH s n/a 12 1522 1598 1665 N
+ EH B SIL s n/a 12 1522 1598 1652 N
+ EH B T b n/a 12 1522 1599 1652 N
+ EH B T i n/a 12 1534 1598 1652 N
+ EH B T s n/a 12 1522 1598 1652 N
+ EH B TH b n/a 12 1522 1599 1661 N
+ EH B TH i n/a 12 1534 1598 1661 N
+ EH B TH s n/a 12 1522 1598 1661 N
+ EH B UH s n/a 12 1522 1602 1685 N
+ EH B UW s n/a 12 1522 1602 1685 N
+ EH B V b n/a 12 1522 1593 1675 N
+ EH B V i n/a 12 1534 1590 1671 N
+ EH B V s n/a 12 1522 1593 1675 N
+ EH B W s n/a 12 1522 1591 1691 N
+ EH B Y s n/a 12 1522 1602 1654 N
+ EH B Z b n/a 12 1521 1595 1669 N
+ EH B Z i n/a 12 1534 1602 1670 N
+ EH B Z s n/a 12 1521 1595 1670 N
+ EH B ZH s n/a 12 1521 1595 1670 N
+ EH CH AA s n/a 12 1522 1602 1685 N
+ EH CH AE s n/a 12 1522 1602 1654 N
+ EH CH AH b n/a 12 1522 1602 1654 N
+ EH CH AH s n/a 12 1522 1602 1654 N
+ EH CH AO s n/a 12 1522 1602 1685 N
+ EH CH AW s n/a 12 1522 1602 1654 N
+ EH CH AY s n/a 12 1522 1602 1685 N
+ EH CH B b n/a 12 1522 1591 1671 N
+ EH CH B i n/a 12 1551 1590 1671 N
+ EH CH B s n/a 12 1522 1591 1671 N
+ EH CH CH b n/a 12 1522 1599 1651 N
+ EH CH CH i n/a 12 1552 1599 1651 N
+ EH CH CH s n/a 12 1522 1599 1651 N
+ EH CH D b n/a 12 1522 1619 1654 N
+ EH CH D i n/a 12 1552 1619 1654 N
+ EH CH D s n/a 12 1522 1619 1654 N
+ EH CH DH b n/a 12 1522 1595 1667 N
+ EH CH DH s n/a 12 1522 1595 1667 N
+ EH CH EH b n/a 12 1522 1602 1654 N
+ EH CH EH s n/a 12 1522 1602 1654 N
+ EH CH ER b n/a 12 1523 1645 1685 N
+ EH CH ER s n/a 12 1523 1645 1685 N
+ EH CH EY s n/a 12 1522 1602 1654 N
+ EH CH F b n/a 12 1522 1583 1660 N
+ EH CH F i n/a 12 1552 1583 1660 N
+ EH CH F s n/a 12 1522 1583 1660 N
+ EH CH G b n/a 12 1522 1608 1659 N
+ EH CH G i n/a 12 1553 1603 1659 N
+ EH CH G s n/a 12 1522 1608 1659 N
+ EH CH HH b n/a 12 1522 1599 1651 N
+ EH CH HH i n/a 12 1552 1599 1651 N
+ EH CH HH s n/a 12 1522 1599 1651 N
+ EH CH IH b n/a 12 1522 1602 1654 N
+ EH CH IH s n/a 12 1522 1602 1654 N
+ EH CH IY b n/a 12 1522 1602 1654 N
+ EH CH IY s n/a 12 1522 1602 1654 N
+ EH CH JH b n/a 12 1522 1602 1656 N
+ EH CH JH s n/a 12 1522 1602 1656 N
+ EH CH K b n/a 12 1522 1606 1657 N
+ EH CH K i n/a 12 1553 1603 1657 N
+ EH CH K s n/a 12 1522 1606 1657 N
+ EH CH L b n/a 12 1522 1638 1690 N
+ EH CH L i n/a 12 1556 1639 1690 N
+ EH CH L s n/a 12 1522 1638 1690 N
+ EH CH M b n/a 12 1523 1591 1673 N
+ EH CH M i n/a 12 1554 1589 1673 N
+ EH CH M s n/a 12 1523 1591 1673 N
+ EH CH N b n/a 12 1523 1615 1677 N
+ EH CH N i n/a 12 1554 1616 1679 N
+ EH CH N s n/a 12 1523 1615 1677 N
+ EH CH NG b n/a 12 1523 1608 1677 N
+ EH CH NG i n/a 12 1554 1603 1681 N
+ EH CH NG s n/a 12 1523 1608 1677 N
+ EH CH OW s n/a 12 1522 1602 1685 N
+ EH CH OY s n/a 12 1522 1602 1685 N
+ EH CH P b n/a 12 1522 1583 1672 N
+ EH CH P i n/a 12 1552 1583 1672 N
+ EH CH P s n/a 12 1522 1583 1672 N
+ EH CH R b n/a 12 1523 1645 1685 N
+ EH CH R i n/a 12 1558 1645 1685 N
+ EH CH R s n/a 12 1523 1645 1685 N
+ EH CH S b n/a 12 1522 1599 1662 N
+ EH CH S i n/a 12 1553 1599 1662 N
+ EH CH S s n/a 12 1522 1599 1662 N
+ EH CH SH b n/a 12 1522 1597 1665 N
+ EH CH SH i n/a 12 1552 1597 1665 N
+ EH CH SH s n/a 12 1522 1597 1665 N
+ EH CH SIL s n/a 12 1522 1599 1651 N
+ EH CH T b n/a 12 1522 1599 1651 N
+ EH CH T i n/a 12 1552 1599 1651 N
+ EH CH T s n/a 12 1522 1599 1651 N
+ EH CH TH b n/a 12 1522 1599 1660 N
+ EH CH TH s n/a 12 1522 1599 1660 N
+ EH CH UH s n/a 12 1522 1602 1685 N
+ EH CH UW s n/a 12 1522 1602 1685 N
+ EH CH V b n/a 12 1522 1593 1675 N
+ EH CH V i n/a 12 1552 1590 1671 N
+ EH CH V s n/a 12 1522 1593 1675 N
+ EH CH W s n/a 12 1522 1591 1690 N
+ EH CH Y s n/a 12 1522 1602 1654 N
+ EH CH Z b n/a 12 1521 1595 1669 N
+ EH CH Z i n/a 12 1553 1602 1670 N
+ EH CH Z s n/a 12 1521 1595 1670 N
+ EH CH ZH s n/a 12 1521 1595 1670 N
+ EH D AA e n/a 12 1522 1586 1686 N
+ EH D AA s n/a 12 1522 1586 1686 N
+ EH D AE e n/a 12 1522 1586 1654 N
+ EH D AE s n/a 12 1522 1586 1654 N
+ EH D AH b n/a 12 1522 1602 1654 N
+ EH D AH e n/a 12 1522 1586 1654 N
+ EH D AH s n/a 12 1522 1586 1654 N
+ EH D AO e n/a 12 1522 1586 1686 N
+ EH D AO s n/a 12 1522 1586 1686 N
+ EH D AW e n/a 12 1522 1586 1654 N
+ EH D AW s n/a 12 1522 1586 1654 N
+ EH D AY e n/a 12 1522 1586 1686 N
+ EH D AY i n/a 12 1537 1586 1686 N
+ EH D AY s n/a 12 1522 1586 1686 N
+ EH D B b n/a 12 1522 1591 1671 N
+ EH D B e n/a 12 1522 1591 1671 N
+ EH D B i n/a 12 1537 1589 1671 N
+ EH D B s n/a 12 1522 1591 1671 N
+ EH D CH b n/a 12 1522 1599 1652 N
+ EH D CH e n/a 12 1522 1586 1652 N
+ EH D CH i n/a 12 1537 1586 1652 N
+ EH D CH s n/a 12 1522 1586 1652 N
+ EH D D b n/a 12 1522 1619 1654 N
+ EH D D e n/a 12 1522 1619 1654 N
+ EH D D i n/a 12 1537 1618 1654 N
+ EH D D s n/a 12 1522 1619 1654 N
+ EH D DH b n/a 12 1522 1595 1668 N
+ EH D DH e n/a 12 1522 1586 1668 N
+ EH D DH i n/a 12 1537 1586 1668 N
+ EH D DH s n/a 12 1522 1586 1668 N
+ EH D EH b n/a 12 1522 1602 1654 N
+ EH D EH e n/a 12 1522 1586 1654 N
+ EH D EH s n/a 12 1522 1586 1654 N
+ EH D ER b n/a 12 1523 1645 1686 N
+ EH D ER e n/a 12 1523 1645 1686 N
+ EH D ER i n/a 12 1541 1645 1686 N
+ EH D ER s n/a 12 1523 1645 1686 N
+ EH D EY e n/a 12 1522 1586 1654 N
+ EH D EY s n/a 12 1522 1586 1654 N
+ EH D F b n/a 12 1522 1587 1660 N
+ EH D F e n/a 12 1522 1587 1660 N
+ EH D F i n/a 12 1537 1587 1660 N
+ EH D F s n/a 12 1522 1587 1660 N
+ EH D G b n/a 12 1522 1608 1659 N
+ EH D G e n/a 12 1522 1608 1659 N
+ EH D G i n/a 12 1537 1608 1659 N
+ EH D G s n/a 12 1522 1608 1659 N
+ EH D HH b n/a 12 1522 1599 1652 N
+ EH D HH e n/a 12 1522 1586 1652 N
+ EH D HH i n/a 12 1537 1586 1652 N
+ EH D HH s n/a 12 1522 1586 1652 N
+ EH D IH b n/a 12 1522 1602 1654 N
+ EH D IH e n/a 12 1522 1586 1654 N
+ EH D IH s n/a 12 1522 1586 1654 N
+ EH D IY b n/a 12 1522 1602 1654 N
+ EH D IY e n/a 12 1522 1586 1654 N
+ EH D IY s n/a 12 1522 1586 1654 N
+ EH D JH b n/a 12 1522 1602 1656 N
+ EH D JH e n/a 12 1522 1586 1656 N
+ EH D JH i n/a 12 1537 1586 1656 N
+ EH D JH s n/a 12 1522 1586 1656 N
+ EH D K b n/a 12 1522 1606 1657 N
+ EH D K e n/a 12 1522 1606 1657 N
+ EH D K i n/a 12 1537 1605 1657 N
+ EH D K s n/a 12 1522 1606 1657 N
+ EH D L b n/a 12 1522 1638 1690 N
+ EH D L e n/a 12 1522 1638 1690 N
+ EH D L i n/a 12 1537 1638 1690 N
+ EH D L s n/a 12 1522 1638 1690 N
+ EH D M b n/a 12 1523 1591 1673 N
+ EH D M e n/a 12 1523 1591 1673 N
+ EH D M i n/a 12 1537 1589 1673 N
+ EH D M s n/a 12 1523 1591 1673 N
+ EH D N b n/a 12 1523 1615 1677 N
+ EH D N e n/a 12 1523 1615 1677 N
+ EH D N i n/a 12 1537 1612 1679 N
+ EH D N s n/a 12 1523 1615 1677 N
+ EH D NG b n/a 12 1523 1608 1677 N
+ EH D NG e n/a 12 1523 1608 1677 N
+ EH D NG i n/a 12 1537 1608 1679 N
+ EH D NG s n/a 12 1523 1608 1677 N
+ EH D OW e n/a 12 1522 1586 1686 N
+ EH D OW s n/a 12 1522 1586 1686 N
+ EH D OY e n/a 12 1522 1586 1686 N
+ EH D OY s n/a 12 1522 1586 1686 N
+ EH D P b n/a 12 1522 1587 1672 N
+ EH D P e n/a 12 1522 1587 1672 N
+ EH D P i n/a 12 1537 1587 1672 N
+ EH D P s n/a 12 1522 1587 1672 N
+ EH D R b n/a 12 1523 1645 1686 N
+ EH D R e n/a 12 1523 1645 1686 N
+ EH D R i n/a 12 1540 1645 1686 N
+ EH D R s n/a 12 1523 1645 1686 N
+ EH D S b n/a 12 1522 1599 1663 N
+ EH D S e n/a 12 1522 1587 1663 N
+ EH D S i n/a 12 1537 1587 1663 N
+ EH D S s n/a 12 1522 1587 1663 N
+ EH D SH b n/a 12 1522 1599 1665 N
+ EH D SH e n/a 12 1522 1587 1665 N
+ EH D SH i n/a 12 1537 1587 1665 N
+ EH D SH s n/a 12 1522 1587 1665 N
+ EH D SIL e n/a 12 1522 1586 1652 N
+ EH D SIL s n/a 12 1522 1586 1652 N
+ EH D T b n/a 12 1522 1599 1652 N
+ EH D T e n/a 12 1522 1586 1652 N
+ EH D T i n/a 12 1537 1586 1652 N
+ EH D T s n/a 12 1522 1586 1652 N
+ EH D TH b n/a 12 1522 1599 1661 N
+ EH D TH e n/a 12 1522 1586 1661 N
+ EH D TH i n/a 12 1537 1586 1661 N
+ EH D TH s n/a 12 1522 1586 1661 N
+ EH D UH e n/a 12 1522 1586 1686 N
+ EH D UH s n/a 12 1522 1586 1686 N
+ EH D UW e n/a 12 1522 1586 1686 N
+ EH D UW i n/a 12 1537 1586 1686 N
+ EH D UW s n/a 12 1522 1586 1686 N
+ EH D V b n/a 12 1522 1593 1675 N
+ EH D V e n/a 12 1522 1593 1675 N
+ EH D V i n/a 12 1537 1589 1673 N
+ EH D V s n/a 12 1522 1593 1675 N
+ EH D W e n/a 12 1522 1591 1690 N
+ EH D W i n/a 12 1537 1589 1690 N
+ EH D W s n/a 12 1522 1591 1690 N
+ EH D Y e n/a 12 1522 1586 1654 N
+ EH D Y i n/a 12 1537 1586 1654 N
+ EH D Y s n/a 12 1522 1586 1654 N
+ EH D Z b n/a 12 1521 1595 1669 N
+ EH D Z e n/a 12 1521 1587 1670 N
+ EH D Z i n/a 12 1537 1587 1670 N
+ EH D Z s n/a 12 1521 1587 1670 N
+ EH D ZH e n/a 12 1521 1587 1670 N
+ EH D ZH i n/a 12 1537 1587 1670 N
+ EH D ZH s n/a 12 1521 1587 1670 N
+ EH DH AA i n/a 12 1536 1586 1683 N
+ EH DH AA s n/a 12 1524 1586 1683 N
+ EH DH AE s n/a 12 1524 1586 1654 N
+ EH DH AH b n/a 12 1524 1602 1654 N
+ EH DH AH s n/a 12 1524 1586 1654 N
+ EH DH AO s n/a 12 1524 1586 1683 N
+ EH DH AW s n/a 12 1524 1586 1654 N
+ EH DH AY s n/a 12 1524 1586 1683 N
+ EH DH B b n/a 12 1524 1587 1671 N
+ EH DH B s n/a 12 1524 1587 1671 N
+ EH DH CH b n/a 12 1524 1599 1652 N
+ EH DH CH s n/a 12 1524 1586 1652 N
+ EH DH D b n/a 12 1524 1619 1654 N
+ EH DH D s n/a 12 1524 1618 1654 N
+ EH DH DH b n/a 12 1524 1595 1667 N
+ EH DH DH s n/a 12 1524 1586 1667 N
+ EH DH EH b n/a 12 1524 1602 1654 N
+ EH DH EH s n/a 12 1524 1586 1654 N
+ EH DH ER b n/a 12 1524 1644 1683 N
+ EH DH ER s n/a 12 1524 1644 1683 N
+ EH DH EY s n/a 12 1524 1586 1654 N
+ EH DH F b n/a 12 1524 1587 1660 N
+ EH DH F s n/a 12 1524 1587 1660 N
+ EH DH G b n/a 12 1524 1608 1659 N
+ EH DH G s n/a 12 1524 1608 1659 N
+ EH DH HH b n/a 12 1524 1599 1652 N
+ EH DH HH s n/a 12 1524 1586 1652 N
+ EH DH IH b n/a 12 1524 1602 1654 N
+ EH DH IH s n/a 12 1524 1586 1654 N
+ EH DH IY b n/a 12 1524 1602 1654 N
+ EH DH IY s n/a 12 1524 1586 1654 N
+ EH DH JH b n/a 12 1524 1602 1656 N
+ EH DH JH s n/a 12 1524 1586 1656 N
+ EH DH K b n/a 12 1524 1606 1657 N
+ EH DH K s n/a 12 1524 1606 1657 N
+ EH DH L b n/a 12 1524 1642 1691 N
+ EH DH L s n/a 12 1524 1642 1691 N
+ EH DH M b n/a 12 1524 1588 1674 N
+ EH DH M i n/a 12 1536 1588 1674 N
+ EH DH M s n/a 12 1524 1588 1674 N
+ EH DH N b n/a 12 1524 1615 1677 N
+ EH DH N i n/a 12 1536 1610 1681 N
+ EH DH N s n/a 12 1524 1615 1677 N
+ EH DH NG b n/a 12 1524 1608 1677 N
+ EH DH NG s n/a 12 1524 1608 1677 N
+ EH DH OW s n/a 12 1524 1586 1683 N
+ EH DH OY s n/a 12 1524 1586 1683 N
+ EH DH P b n/a 12 1524 1587 1672 N
+ EH DH P s n/a 12 1524 1587 1672 N
+ EH DH R b n/a 12 1524 1644 1683 N
+ EH DH R i n/a 12 1541 1644 1683 N
+ EH DH R s n/a 12 1524 1644 1683 N
+ EH DH S b n/a 12 1524 1599 1662 N
+ EH DH S s n/a 12 1524 1587 1662 N
+ EH DH SH b n/a 12 1524 1599 1665 N
+ EH DH SH s n/a 12 1524 1587 1665 N
+ EH DH SIL s n/a 12 1524 1586 1652 N
+ EH DH T b n/a 12 1524 1599 1652 N
+ EH DH T s n/a 12 1524 1586 1652 N
+ EH DH TH b n/a 12 1524 1599 1660 N
+ EH DH TH s n/a 12 1524 1586 1660 N
+ EH DH UH s n/a 12 1524 1586 1683 N
+ EH DH UW s n/a 12 1524 1586 1683 N
+ EH DH V b n/a 12 1524 1593 1675 N
+ EH DH V s n/a 12 1524 1593 1675 N
+ EH DH W s n/a 12 1524 1587 1691 N
+ EH DH Y s n/a 12 1524 1586 1654 N
+ EH DH Z b n/a 12 1521 1595 1669 N
+ EH DH Z s n/a 12 1521 1587 1670 N
+ EH DH ZH s n/a 12 1521 1587 1670 N
+ EH EH AA s n/a 12 1522 1583 1685 N
+ EH EH AE s n/a 12 1522 1583 1656 N
+ EH EH AH b n/a 12 1522 1602 1656 N
+ EH EH AH s n/a 12 1522 1583 1656 N
+ EH EH AO s n/a 12 1522 1583 1685 N
+ EH EH AW s n/a 12 1522 1583 1656 N
+ EH EH AY s n/a 12 1522 1583 1685 N
+ EH EH B b n/a 12 1522 1591 1671 N
+ EH EH B s n/a 12 1522 1591 1671 N
+ EH EH CH b n/a 12 1522 1599 1651 N
+ EH EH CH s n/a 12 1522 1584 1651 N
+ EH EH D b n/a 12 1522 1619 1656 N
+ EH EH D s n/a 12 1522 1618 1656 N
+ EH EH DH b n/a 12 1522 1595 1667 N
+ EH EH DH s n/a 12 1522 1585 1667 N
+ EH EH EH b n/a 12 1522 1602 1656 N
+ EH EH EH s n/a 12 1522 1583 1656 N
+ EH EH ER b n/a 12 1522 1645 1685 N
+ EH EH ER s n/a 12 1522 1645 1685 N
+ EH EH EY s n/a 12 1522 1583 1656 N
+ EH EH F b n/a 12 1522 1583 1660 N
+ EH EH F s n/a 12 1522 1583 1660 N
+ EH EH G b n/a 12 1522 1608 1659 N
+ EH EH G i n/a 12 1531 1608 1659 N
+ EH EH G s n/a 12 1522 1608 1659 N
+ EH EH HH b n/a 12 1522 1599 1651 N
+ EH EH HH s n/a 12 1522 1583 1651 N
+ EH EH IH b n/a 12 1522 1602 1656 N
+ EH EH IH s n/a 12 1522 1583 1656 N
+ EH EH IY b n/a 12 1522 1602 1656 N
+ EH EH IY s n/a 12 1522 1583 1656 N
+ EH EH JH b n/a 12 1522 1602 1656 N
+ EH EH JH s n/a 12 1522 1584 1656 N
+ EH EH K b n/a 12 1522 1606 1657 N
+ EH EH K s n/a 12 1522 1606 1657 N
+ EH EH L b n/a 12 1522 1638 1690 N
+ EH EH L s n/a 12 1522 1638 1690 N
+ EH EH M b n/a 12 1522 1591 1673 N
+ EH EH M s n/a 12 1522 1591 1673 N
+ EH EH N b n/a 12 1522 1615 1677 N
+ EH EH N i n/a 12 1532 1610 1678 N
+ EH EH N s n/a 12 1522 1615 1677 N
+ EH EH NG b n/a 12 1522 1608 1677 N
+ EH EH NG s n/a 12 1522 1608 1677 N
+ EH EH OW s n/a 12 1522 1583 1685 N
+ EH EH OY s n/a 12 1522 1583 1685 N
+ EH EH P b n/a 12 1522 1583 1672 N
+ EH EH P s n/a 12 1522 1583 1672 N
+ EH EH R b n/a 12 1522 1645 1685 N
+ EH EH R s n/a 12 1522 1645 1685 N
+ EH EH S b n/a 12 1522 1599 1662 N
+ EH EH S s n/a 12 1522 1583 1662 N
+ EH EH SH b n/a 12 1522 1599 1665 N
+ EH EH SH s n/a 12 1522 1583 1665 N
+ EH EH SIL s n/a 12 1522 1583 1651 N
+ EH EH T b n/a 12 1522 1599 1651 N
+ EH EH T s n/a 12 1522 1584 1651 N
+ EH EH TH b n/a 12 1522 1599 1660 N
+ EH EH TH s n/a 12 1522 1585 1660 N
+ EH EH UH s n/a 12 1522 1583 1685 N
+ EH EH UW s n/a 12 1522 1583 1685 N
+ EH EH V b n/a 12 1522 1593 1675 N
+ EH EH V s n/a 12 1522 1593 1675 N
+ EH EH W s n/a 12 1522 1591 1690 N
+ EH EH Y s n/a 12 1522 1583 1656 N
+ EH EH Z b n/a 12 1521 1595 1669 N
+ EH EH Z s n/a 12 1521 1583 1670 N
+ EH EH ZH s n/a 12 1521 1583 1670 N
+ EH ER AA s n/a 12 1572 1630 1684 N
+ EH ER AE s n/a 12 1572 1630 1656 N
+ EH ER AH b n/a 12 1572 1630 1656 N
+ EH ER AH s n/a 12 1572 1630 1656 N
+ EH ER AO s n/a 12 1572 1630 1684 N
+ EH ER AW s n/a 12 1572 1630 1656 N
+ EH ER AY s n/a 12 1572 1630 1684 N
+ EH ER B b n/a 12 1572 1633 1671 N
+ EH ER B i n/a 12 1562 1633 1671 N
+ EH ER B s n/a 12 1572 1633 1671 N
+ EH ER CH b n/a 12 1572 1636 1651 N
+ EH ER CH s n/a 12 1572 1636 1651 N
+ EH ER D b n/a 12 1572 1630 1656 N
+ EH ER D i n/a 12 1565 1630 1656 N
+ EH ER D s n/a 12 1572 1630 1656 N
+ EH ER DH b n/a 12 1572 1634 1669 N
+ EH ER DH s n/a 12 1572 1634 1670 N
+ EH ER EH b n/a 12 1572 1630 1656 N
+ EH ER EH s n/a 12 1572 1630 1656 N
+ EH ER ER b n/a 12 1572 1650 1684 N
+ EH ER ER s n/a 12 1572 1650 1684 N
+ EH ER EY s n/a 12 1572 1630 1656 N
+ EH ER F b n/a 12 1572 1636 1660 N
+ EH ER F i n/a 12 1562 1637 1660 N
+ EH ER F s n/a 12 1572 1636 1660 N
+ EH ER G b n/a 12 1572 1631 1659 N
+ EH ER G i n/a 12 1561 1629 1659 N
+ EH ER G s n/a 12 1572 1631 1659 N
+ EH ER HH b n/a 12 1572 1636 1651 N
+ EH ER HH s n/a 12 1572 1636 1651 N
+ EH ER IH b n/a 12 1572 1630 1656 N
+ EH ER IH s n/a 12 1572 1630 1656 N
+ EH ER IY b n/a 12 1572 1630 1656 N
+ EH ER IY s n/a 12 1572 1630 1656 N
+ EH ER JH b n/a 12 1572 1630 1656 N
+ EH ER JH i n/a 12 1561 1629 1656 N
+ EH ER JH s n/a 12 1572 1630 1656 N
+ EH ER K b n/a 12 1572 1636 1658 N
+ EH ER K i n/a 12 1561 1636 1658 N
+ EH ER K s n/a 12 1572 1636 1658 N
+ EH ER L b n/a 12 1572 1638 1690 N
+ EH ER L i n/a 12 1562 1638 1690 N
+ EH ER L s n/a 12 1572 1638 1690 N
+ EH ER M b n/a 12 1572 1633 1673 N
+ EH ER M i n/a 12 1562 1633 1673 N
+ EH ER M s n/a 12 1572 1633 1673 N
+ EH ER N b n/a 12 1572 1631 1677 N
+ EH ER N i n/a 12 1565 1632 1676 N
+ EH ER N s n/a 12 1572 1631 1677 N
+ EH ER NG b n/a 12 1572 1631 1677 N
+ EH ER NG s n/a 12 1572 1631 1677 N
+ EH ER OW s n/a 12 1572 1630 1684 N
+ EH ER OY s n/a 12 1572 1630 1684 N
+ EH ER P b n/a 12 1572 1637 1672 N
+ EH ER P s n/a 12 1572 1637 1672 N
+ EH ER R b n/a 12 1572 1650 1684 N
+ EH ER R i n/a 12 1563 1650 1684 N
+ EH ER R s n/a 12 1572 1650 1684 N
+ EH ER S b n/a 12 1572 1635 1662 N
+ EH ER S i n/a 12 1564 1635 1662 N
+ EH ER S s n/a 12 1572 1635 1662 N
+ EH ER SH b n/a 12 1572 1636 1665 N
+ EH ER SH i n/a 12 1561 1636 1665 N
+ EH ER SH s n/a 12 1572 1636 1665 N
+ EH ER SIL s n/a 12 1572 1636 1651 N
+ EH ER T b n/a 12 1572 1635 1651 N
+ EH ER T i n/a 12 1564 1635 1651 N
+ EH ER T s n/a 12 1572 1635 1651 N
+ EH ER TH b n/a 12 1572 1635 1660 N
+ EH ER TH s n/a 12 1572 1635 1660 N
+ EH ER UH s n/a 12 1572 1630 1684 N
+ EH ER UW s n/a 12 1572 1630 1684 N
+ EH ER V b n/a 12 1572 1633 1675 N
+ EH ER V i n/a 12 1562 1633 1671 N
+ EH ER V s n/a 12 1572 1633 1675 N
+ EH ER W s n/a 12 1572 1638 1690 N
+ EH ER Y s n/a 12 1572 1638 1656 N
+ EH ER Z b n/a 12 1572 1634 1669 N
+ EH ER Z i n/a 12 1564 1634 1670 N
+ EH ER Z s n/a 12 1572 1634 1670 N
+ EH ER ZH s n/a 12 1572 1630 1670 N
+ EH EY AA s n/a 12 1531 1583 1685 N
+ EH EY AE s n/a 12 1531 1583 1656 N
+ EH EY AH b n/a 12 1531 1602 1656 N
+ EH EY AH s n/a 12 1531 1583 1656 N
+ EH EY AO s n/a 12 1531 1583 1685 N
+ EH EY AW s n/a 12 1531 1583 1656 N
+ EH EY AY s n/a 12 1531 1583 1685 N
+ EH EY B b n/a 12 1531 1592 1671 N
+ EH EY B s n/a 12 1531 1592 1671 N
+ EH EY CH b n/a 12 1531 1599 1651 N
+ EH EY CH s n/a 12 1531 1584 1651 N
+ EH EY D b n/a 12 1531 1619 1656 N
+ EH EY D s n/a 12 1531 1618 1656 N
+ EH EY DH b n/a 12 1531 1595 1667 N
+ EH EY DH s n/a 12 1531 1585 1667 N
+ EH EY EH b n/a 12 1531 1602 1656 N
+ EH EY EH s n/a 12 1531 1583 1656 N
+ EH EY ER b n/a 12 1533 1645 1685 N
+ EH EY ER s n/a 12 1533 1645 1685 N
+ EH EY EY s n/a 12 1531 1583 1656 N
+ EH EY F b n/a 12 1531 1583 1660 N
+ EH EY F i n/a 12 1531 1583 1660 N
+ EH EY F s n/a 12 1531 1583 1660 N
+ EH EY G b n/a 12 1531 1608 1659 N
+ EH EY G s n/a 12 1531 1608 1659 N
+ EH EY HH b n/a 12 1531 1599 1651 N
+ EH EY HH s n/a 12 1531 1583 1651 N
+ EH EY IH b n/a 12 1531 1602 1656 N
+ EH EY IH s n/a 12 1531 1583 1656 N
+ EH EY IY b n/a 12 1531 1602 1656 N
+ EH EY IY s n/a 12 1531 1583 1656 N
+ EH EY JH b n/a 12 1531 1602 1656 N
+ EH EY JH s n/a 12 1531 1584 1656 N
+ EH EY K b n/a 12 1531 1606 1657 N
+ EH EY K s n/a 12 1531 1606 1657 N
+ EH EY L b n/a 12 1531 1638 1690 N
+ EH EY L i n/a 12 1531 1638 1690 N
+ EH EY L s n/a 12 1531 1638 1690 N
+ EH EY M b n/a 12 1532 1592 1674 N
+ EH EY M i n/a 12 1532 1592 1674 N
+ EH EY M s n/a 12 1532 1592 1674 N
+ EH EY N b n/a 12 1532 1614 1677 N
+ EH EY N i n/a 12 1532 1610 1678 N
+ EH EY N s n/a 12 1532 1614 1677 N
+ EH EY NG b n/a 12 1532 1608 1677 N
+ EH EY NG s n/a 12 1532 1608 1677 N
+ EH EY OW s n/a 12 1531 1583 1685 N
+ EH EY OY s n/a 12 1531 1583 1685 N
+ EH EY P b n/a 12 1531 1583 1672 N
+ EH EY P s n/a 12 1531 1583 1672 N
+ EH EY R b n/a 12 1533 1645 1685 N
+ EH EY R i n/a 12 1540 1645 1685 N
+ EH EY R s n/a 12 1533 1645 1685 N
+ EH EY S b n/a 12 1531 1599 1662 N
+ EH EY S i n/a 12 1531 1583 1662 N
+ EH EY S s n/a 12 1531 1583 1662 N
+ EH EY SH b n/a 12 1531 1599 1665 N
+ EH EY SH s n/a 12 1531 1583 1665 N
+ EH EY SIL s n/a 12 1531 1583 1651 N
+ EH EY T b n/a 12 1531 1599 1651 N
+ EH EY T i n/a 12 1531 1584 1651 N
+ EH EY T s n/a 12 1531 1584 1651 N
+ EH EY TH b n/a 12 1531 1599 1660 N
+ EH EY TH s n/a 12 1531 1585 1660 N
+ EH EY UH s n/a 12 1531 1583 1685 N
+ EH EY UW s n/a 12 1531 1583 1685 N
+ EH EY V b n/a 12 1531 1593 1675 N
+ EH EY V s n/a 12 1531 1593 1675 N
+ EH EY W s n/a 12 1531 1592 1690 N
+ EH EY Y s n/a 12 1531 1583 1656 N
+ EH EY Z b n/a 12 1531 1595 1669 N
+ EH EY Z i n/a 12 1531 1583 1670 N
+ EH EY Z s n/a 12 1531 1583 1670 N
+ EH EY ZH s n/a 12 1531 1583 1670 N
+ EH F AA s n/a 12 1552 1602 1685 N
+ EH F AE i n/a 12 1552 1602 1654 N
+ EH F AE s n/a 12 1552 1602 1654 N
+ EH F AH b n/a 12 1552 1602 1654 N
+ EH F AH s n/a 12 1552 1602 1654 N
+ EH F AO s n/a 12 1552 1602 1685 N
+ EH F AW s n/a 12 1552 1602 1654 N
+ EH F AY s n/a 12 1552 1602 1685 N
+ EH F B b n/a 12 1545 1591 1671 N
+ EH F B i n/a 12 1542 1590 1671 N
+ EH F B s n/a 12 1545 1591 1671 N
+ EH F CH b n/a 12 1545 1597 1651 N
+ EH F CH i n/a 12 1542 1597 1651 N
+ EH F CH s n/a 12 1545 1597 1651 N
+ EH F D b n/a 12 1545 1619 1654 N
+ EH F D i n/a 12 1542 1619 1654 N
+ EH F D s n/a 12 1545 1619 1654 N
+ EH F DH b n/a 12 1545 1595 1668 N
+ EH F DH i n/a 12 1542 1602 1668 N
+ EH F DH s n/a 12 1545 1595 1668 N
+ EH F EH b n/a 12 1552 1602 1654 N
+ EH F EH s n/a 12 1552 1602 1654 N
+ EH F ER b n/a 12 1557 1646 1685 N
+ EH F ER s n/a 12 1557 1646 1685 N
+ EH F EY i n/a 12 1552 1602 1654 N
+ EH F EY s n/a 12 1552 1602 1654 N
+ EH F F b n/a 12 1545 1583 1660 N
+ EH F F i n/a 12 1542 1583 1660 N
+ EH F F s n/a 12 1545 1583 1660 N
+ EH F G b n/a 12 1545 1603 1659 N
+ EH F G i n/a 12 1542 1603 1659 N
+ EH F G s n/a 12 1545 1603 1659 N
+ EH F HH b n/a 12 1545 1596 1651 N
+ EH F HH i n/a 12 1542 1596 1651 N
+ EH F HH s n/a 12 1545 1596 1651 N
+ EH F IH b n/a 12 1552 1602 1654 N
+ EH F IH s n/a 12 1552 1602 1654 N
+ EH F IY b n/a 12 1552 1602 1654 N
+ EH F IY s n/a 12 1552 1602 1654 N
+ EH F JH b n/a 12 1545 1602 1656 N
+ EH F JH s n/a 12 1545 1602 1656 N
+ EH F K b n/a 12 1545 1603 1657 N
+ EH F K i n/a 12 1542 1603 1657 N
+ EH F K s n/a 12 1545 1603 1657 N
+ EH F L b n/a 12 1550 1641 1691 N
+ EH F L i n/a 12 1550 1641 1691 N
+ EH F L s n/a 12 1550 1641 1691 N
+ EH F M b n/a 12 1545 1591 1673 N
+ EH F M i n/a 12 1542 1590 1673 N
+ EH F M s n/a 12 1545 1591 1673 N
+ EH F N b n/a 12 1545 1615 1677 N
+ EH F N i n/a 12 1542 1613 1680 N
+ EH F N s n/a 12 1545 1615 1677 N
+ EH F NG b n/a 12 1545 1603 1677 N
+ EH F NG i n/a 12 1542 1603 1681 N
+ EH F NG s n/a 12 1545 1603 1677 N
+ EH F OW s n/a 12 1552 1602 1685 N
+ EH F OY s n/a 12 1552 1602 1685 N
+ EH F P b n/a 12 1545 1583 1672 N
+ EH F P s n/a 12 1545 1583 1672 N
+ EH F R b n/a 12 1557 1646 1685 N
+ EH F R i n/a 12 1557 1646 1685 N
+ EH F R s n/a 12 1557 1646 1685 N
+ EH F S b n/a 12 1545 1596 1662 N
+ EH F S i n/a 12 1542 1596 1662 N
+ EH F S s n/a 12 1545 1596 1662 N
+ EH F SH b n/a 12 1545 1597 1665 N
+ EH F SH i n/a 12 1542 1597 1665 N
+ EH F SH s n/a 12 1545 1597 1665 N
+ EH F SIL s n/a 12 1545 1596 1651 N
+ EH F T b n/a 12 1545 1596 1651 N
+ EH F T i n/a 12 1542 1596 1651 N
+ EH F T s n/a 12 1545 1596 1651 N
+ EH F TH b n/a 12 1545 1596 1660 N
+ EH F TH i n/a 12 1542 1596 1660 N
+ EH F TH s n/a 12 1545 1596 1660 N
+ EH F UH s n/a 12 1552 1602 1685 N
+ EH F UW s n/a 12 1552 1602 1685 N
+ EH F V b n/a 12 1545 1593 1675 N
+ EH F V i n/a 12 1542 1590 1671 N
+ EH F V s n/a 12 1545 1593 1675 N
+ EH F W i n/a 12 1547 1590 1691 N
+ EH F W s n/a 12 1547 1591 1691 N
+ EH F Y s n/a 12 1556 1602 1654 N
+ EH F Z b n/a 12 1545 1595 1669 N
+ EH F Z i n/a 12 1542 1602 1670 N
+ EH F Z s n/a 12 1545 1595 1670 N
+ EH F ZH s n/a 12 1545 1595 1670 N
+ EH G AA s n/a 12 1522 1583 1686 N
+ EH G AE s n/a 12 1522 1583 1654 N
+ EH G AH b n/a 12 1522 1602 1654 N
+ EH G AH i n/a 12 1528 1583 1654 N
+ EH G AH s n/a 12 1522 1583 1654 N
+ EH G AO s n/a 12 1522 1583 1686 N
+ EH G AW s n/a 12 1522 1583 1654 N
+ EH G AY s n/a 12 1522 1583 1686 N
+ EH G B b n/a 12 1522 1591 1671 N
+ EH G B i n/a 12 1528 1590 1671 N
+ EH G B s n/a 12 1522 1591 1671 N
+ EH G CH b n/a 12 1522 1599 1651 N
+ EH G CH i n/a 12 1528 1584 1651 N
+ EH G CH s n/a 12 1522 1584 1651 N
+ EH G D b n/a 12 1522 1619 1654 N
+ EH G D i n/a 12 1528 1618 1654 N
+ EH G D s n/a 12 1522 1619 1654 N
+ EH G DH b n/a 12 1522 1595 1668 N
+ EH G DH i n/a 12 1528 1585 1668 N
+ EH G DH s n/a 12 1522 1585 1668 N
+ EH G EH b n/a 12 1522 1602 1654 N
+ EH G EH i n/a 12 1528 1583 1654 N
+ EH G EH s n/a 12 1522 1583 1654 N
+ EH G ER b n/a 12 1523 1645 1686 N
+ EH G ER s n/a 12 1523 1645 1686 N
+ EH G EY s n/a 12 1522 1583 1654 N
+ EH G F b n/a 12 1522 1583 1660 N
+ EH G F i n/a 12 1528 1583 1660 N
+ EH G F s n/a 12 1522 1583 1660 N
+ EH G G b n/a 12 1522 1608 1659 N
+ EH G G i n/a 12 1528 1608 1659 N
+ EH G G s n/a 12 1522 1608 1659 N
+ EH G HH b n/a 12 1522 1599 1651 N
+ EH G HH i n/a 12 1528 1583 1651 N
+ EH G HH s n/a 12 1522 1583 1651 N
+ EH G IH b n/a 12 1522 1602 1654 N
+ EH G IH s n/a 12 1522 1583 1654 N
+ EH G IY b n/a 12 1522 1602 1654 N
+ EH G IY i n/a 12 1528 1583 1654 N
+ EH G IY s n/a 12 1522 1583 1654 N
+ EH G JH b n/a 12 1522 1602 1656 N
+ EH G JH s n/a 12 1522 1584 1656 N
+ EH G K b n/a 12 1522 1606 1657 N
+ EH G K i n/a 12 1528 1605 1657 N
+ EH G K s n/a 12 1522 1606 1657 N
+ EH G L b n/a 12 1522 1638 1690 N
+ EH G L i n/a 12 1528 1638 1690 N
+ EH G L s n/a 12 1522 1638 1690 N
+ EH G M b n/a 12 1523 1591 1673 N
+ EH G M i n/a 12 1529 1589 1673 N
+ EH G M s n/a 12 1523 1591 1673 N
+ EH G N b n/a 12 1523 1614 1677 N
+ EH G N i n/a 12 1529 1614 1678 N
+ EH G N s n/a 12 1523 1614 1677 N
+ EH G NG b n/a 12 1523 1608 1677 N
+ EH G NG i n/a 12 1529 1608 1678 N
+ EH G NG s n/a 12 1523 1608 1677 N
+ EH G OW s n/a 12 1522 1583 1686 N
+ EH G OY s n/a 12 1522 1583 1686 N
+ EH G P b n/a 12 1522 1584 1672 N
+ EH G P i n/a 12 1528 1584 1672 N
+ EH G P s n/a 12 1522 1584 1672 N
+ EH G R b n/a 12 1523 1645 1686 N
+ EH G R i n/a 12 1540 1645 1686 N
+ EH G R s n/a 12 1523 1645 1686 N
+ EH G S b n/a 12 1522 1599 1663 N
+ EH G S i n/a 12 1528 1583 1663 N
+ EH G S s n/a 12 1522 1583 1663 N
+ EH G SH b n/a 12 1522 1599 1665 N
+ EH G SH i n/a 12 1528 1583 1665 N
+ EH G SH s n/a 12 1522 1583 1665 N
+ EH G SIL s n/a 12 1522 1583 1651 N
+ EH G T b n/a 12 1522 1599 1651 N
+ EH G T i n/a 12 1528 1584 1651 N
+ EH G T s n/a 12 1522 1584 1651 N
+ EH G TH b n/a 12 1522 1599 1661 N
+ EH G TH s n/a 12 1522 1585 1661 N
+ EH G UH s n/a 12 1522 1583 1686 N
+ EH G UW s n/a 12 1522 1583 1686 N
+ EH G V b n/a 12 1522 1593 1675 N
+ EH G V i n/a 12 1528 1590 1671 N
+ EH G V s n/a 12 1522 1593 1675 N
+ EH G W s n/a 12 1522 1591 1690 N
+ EH G Y s n/a 12 1522 1583 1654 N
+ EH G Z b n/a 12 1521 1595 1669 N
+ EH G Z i n/a 12 1528 1583 1670 N
+ EH G Z s n/a 12 1521 1583 1670 N
+ EH G ZH s n/a 12 1521 1583 1670 N
+ EH HH AA e n/a 12 1522 1602 1686 N
+ EH HH AA s n/a 12 1522 1602 1686 N
+ EH HH AE e n/a 12 1522 1602 1654 N
+ EH HH AE s n/a 12 1522 1602 1654 N
+ EH HH AH b n/a 12 1522 1602 1654 N
+ EH HH AH e n/a 12 1522 1602 1654 N
+ EH HH AH s n/a 12 1522 1602 1654 N
+ EH HH AO e n/a 12 1522 1602 1686 N
+ EH HH AO s n/a 12 1522 1602 1686 N
+ EH HH AW e n/a 12 1522 1602 1654 N
+ EH HH AW s n/a 12 1522 1602 1654 N
+ EH HH AY e n/a 12 1522 1602 1686 N
+ EH HH AY s n/a 12 1522 1602 1686 N
+ EH HH B b n/a 12 1522 1591 1671 N
+ EH HH B e n/a 12 1522 1591 1671 N
+ EH HH B i n/a 12 1551 1590 1671 N
+ EH HH B s n/a 12 1522 1591 1671 N
+ EH HH CH b n/a 12 1522 1599 1651 N
+ EH HH CH e n/a 12 1522 1599 1651 N
+ EH HH CH s n/a 12 1522 1599 1651 N
+ EH HH D b n/a 12 1522 1620 1654 N
+ EH HH D e n/a 12 1522 1620 1654 N
+ EH HH D i n/a 12 1551 1620 1654 N
+ EH HH D s n/a 12 1522 1620 1654 N
+ EH HH DH b n/a 12 1522 1595 1667 N
+ EH HH DH e n/a 12 1522 1595 1667 N
+ EH HH DH i n/a 12 1551 1602 1668 N
+ EH HH DH s n/a 12 1522 1595 1667 N
+ EH HH EH b n/a 12 1522 1602 1654 N
+ EH HH EH e n/a 12 1522 1602 1654 N
+ EH HH EH s n/a 12 1522 1602 1654 N
+ EH HH ER b n/a 12 1523 1645 1686 N
+ EH HH ER e n/a 12 1523 1645 1686 N
+ EH HH ER s n/a 12 1523 1645 1686 N
+ EH HH EY e n/a 12 1522 1602 1654 N
+ EH HH EY s n/a 12 1522 1602 1654 N
+ EH HH F b n/a 12 1522 1583 1660 N
+ EH HH F e n/a 12 1522 1583 1660 N
+ EH HH F i n/a 12 1551 1583 1660 N
+ EH HH F s n/a 12 1522 1583 1660 N
+ EH HH G b n/a 12 1522 1608 1659 N
+ EH HH G e n/a 12 1522 1608 1659 N
+ EH HH G i n/a 12 1551 1604 1659 N
+ EH HH G s n/a 12 1522 1608 1659 N
+ EH HH HH b n/a 12 1522 1599 1651 N
+ EH HH HH e n/a 12 1522 1599 1651 N
+ EH HH HH i n/a 12 1551 1599 1651 N
+ EH HH HH s n/a 12 1522 1599 1651 N
+ EH HH IH b n/a 12 1522 1602 1654 N
+ EH HH IH e n/a 12 1522 1602 1654 N
+ EH HH IH s n/a 12 1522 1602 1654 N
+ EH HH IY b n/a 12 1522 1602 1654 N
+ EH HH IY e n/a 12 1522 1602 1654 N
+ EH HH IY i n/a 12 1556 1602 1654 N
+ EH HH IY s n/a 12 1522 1602 1654 N
+ EH HH JH b n/a 12 1522 1602 1656 N
+ EH HH JH e n/a 12 1522 1602 1656 N
+ EH HH JH i n/a 12 1551 1602 1656 N
+ EH HH JH s n/a 12 1522 1602 1656 N
+ EH HH K b n/a 12 1522 1606 1657 N
+ EH HH K e n/a 12 1522 1606 1657 N
+ EH HH K i n/a 12 1551 1604 1657 N
+ EH HH K s n/a 12 1522 1606 1657 N
+ EH HH L b n/a 12 1522 1640 1689 N
+ EH HH L e n/a 12 1522 1640 1689 N
+ EH HH L i n/a 12 1555 1640 1689 N
+ EH HH L s n/a 12 1522 1640 1689 N
+ EH HH M b n/a 12 1523 1591 1673 N
+ EH HH M e n/a 12 1523 1591 1673 N
+ EH HH M i n/a 12 1551 1589 1673 N
+ EH HH M s n/a 12 1523 1591 1673 N
+ EH HH N b n/a 12 1523 1615 1677 N
+ EH HH N e n/a 12 1523 1615 1677 N
+ EH HH N i n/a 12 1551 1616 1681 N
+ EH HH N s n/a 12 1523 1615 1677 N
+ EH HH NG b n/a 12 1523 1608 1677 N
+ EH HH NG e n/a 12 1523 1608 1677 N
+ EH HH NG i n/a 12 1551 1604 1681 N
+ EH HH NG s n/a 12 1523 1608 1677 N
+ EH HH OW e n/a 12 1522 1602 1686 N
+ EH HH OW s n/a 12 1522 1602 1686 N
+ EH HH OY e n/a 12 1522 1602 1686 N
+ EH HH OY s n/a 12 1522 1602 1686 N
+ EH HH P b n/a 12 1522 1583 1672 N
+ EH HH P e n/a 12 1522 1583 1672 N
+ EH HH P i n/a 12 1551 1583 1672 N
+ EH HH P s n/a 12 1522 1583 1672 N
+ EH HH R b n/a 12 1523 1645 1686 N
+ EH HH R e n/a 12 1523 1645 1686 N
+ EH HH R i n/a 12 1560 1645 1686 N
+ EH HH R s n/a 12 1523 1645 1686 N
+ EH HH S b n/a 12 1522 1599 1662 N
+ EH HH S e n/a 12 1522 1599 1662 N
+ EH HH S i n/a 12 1551 1599 1662 N
+ EH HH S s n/a 12 1522 1599 1662 N
+ EH HH SH b n/a 12 1522 1597 1665 N
+ EH HH SH e n/a 12 1522 1597 1665 N
+ EH HH SH i n/a 12 1551 1597 1665 N
+ EH HH SH s n/a 12 1522 1597 1665 N
+ EH HH SIL e n/a 12 1522 1599 1651 N
+ EH HH SIL s n/a 12 1522 1599 1651 N
+ EH HH T b n/a 12 1522 1599 1651 N
+ EH HH T e n/a 12 1522 1599 1651 N
+ EH HH T i n/a 12 1551 1599 1651 N
+ EH HH T s n/a 12 1522 1599 1651 N
+ EH HH TH b n/a 12 1522 1599 1660 N
+ EH HH TH e n/a 12 1522 1599 1660 N
+ EH HH TH i n/a 12 1551 1599 1660 N
+ EH HH TH s n/a 12 1522 1599 1660 N
+ EH HH UH e n/a 12 1522 1602 1686 N
+ EH HH UH s n/a 12 1522 1602 1686 N
+ EH HH UW e n/a 12 1522 1602 1686 N
+ EH HH UW s n/a 12 1522 1602 1686 N
+ EH HH V b n/a 12 1522 1593 1675 N
+ EH HH V e n/a 12 1522 1593 1675 N
+ EH HH V i n/a 12 1551 1593 1671 N
+ EH HH V s n/a 12 1522 1593 1675 N
+ EH HH W e n/a 12 1522 1591 1689 N
+ EH HH W i n/a 12 1555 1590 1689 N
+ EH HH W s n/a 12 1522 1591 1689 N
+ EH HH Y e n/a 12 1522 1602 1654 N
+ EH HH Y s n/a 12 1522 1602 1654 N
+ EH HH Z b n/a 12 1521 1595 1669 N
+ EH HH Z e n/a 12 1521 1595 1670 N
+ EH HH Z i n/a 12 1551 1602 1670 N
+ EH HH Z s n/a 12 1521 1595 1670 N
+ EH HH ZH e n/a 12 1521 1595 1670 N
+ EH HH ZH s n/a 12 1521 1595 1670 N
+ EH IH AA s n/a 12 1522 1583 1685 N
+ EH IH AE s n/a 12 1522 1583 1656 N
+ EH IH AH b n/a 12 1522 1602 1656 N
+ EH IH AH s n/a 12 1522 1583 1656 N
+ EH IH AO s n/a 12 1522 1583 1685 N
+ EH IH AW s n/a 12 1522 1583 1656 N
+ EH IH AY s n/a 12 1522 1583 1685 N
+ EH IH B b n/a 12 1522 1591 1671 N
+ EH IH B s n/a 12 1522 1591 1671 N
+ EH IH CH b n/a 12 1522 1599 1651 N
+ EH IH CH s n/a 12 1522 1584 1651 N
+ EH IH D b n/a 12 1522 1619 1656 N
+ EH IH D s n/a 12 1522 1618 1656 N
+ EH IH DH b n/a 12 1522 1595 1667 N
+ EH IH DH s n/a 12 1522 1585 1667 N
+ EH IH EH b n/a 12 1522 1602 1656 N
+ EH IH EH s n/a 12 1522 1583 1656 N
+ EH IH ER b n/a 12 1522 1645 1685 N
+ EH IH ER s n/a 12 1522 1645 1685 N
+ EH IH EY s n/a 12 1522 1583 1656 N
+ EH IH F b n/a 12 1522 1583 1660 N
+ EH IH F s n/a 12 1522 1583 1660 N
+ EH IH G b n/a 12 1522 1608 1659 N
+ EH IH G s n/a 12 1522 1608 1659 N
+ EH IH HH b n/a 12 1522 1599 1651 N
+ EH IH HH s n/a 12 1522 1583 1651 N
+ EH IH IH b n/a 12 1522 1602 1656 N
+ EH IH IH s n/a 12 1522 1583 1656 N
+ EH IH IY b n/a 12 1522 1602 1656 N
+ EH IH IY s n/a 12 1522 1583 1656 N
+ EH IH JH b n/a 12 1522 1602 1656 N
+ EH IH JH s n/a 12 1522 1584 1656 N
+ EH IH K b n/a 12 1522 1606 1657 N
+ EH IH K s n/a 12 1522 1606 1657 N
+ EH IH L b n/a 12 1522 1638 1690 N
+ EH IH L s n/a 12 1522 1638 1690 N
+ EH IH M b n/a 12 1522 1591 1673 N
+ EH IH M s n/a 12 1522 1591 1673 N
+ EH IH N b n/a 12 1522 1615 1677 N
+ EH IH N s n/a 12 1522 1615 1677 N
+ EH IH NG b n/a 12 1522 1608 1677 N
+ EH IH NG s n/a 12 1522 1608 1677 N
+ EH IH OW s n/a 12 1522 1583 1685 N
+ EH IH OY s n/a 12 1522 1583 1685 N
+ EH IH P b n/a 12 1522 1583 1672 N
+ EH IH P s n/a 12 1522 1583 1672 N
+ EH IH R b n/a 12 1522 1645 1685 N
+ EH IH R i n/a 12 1540 1645 1685 N
+ EH IH R s n/a 12 1522 1645 1685 N
+ EH IH S b n/a 12 1522 1599 1662 N
+ EH IH S s n/a 12 1522 1583 1662 N
+ EH IH SH b n/a 12 1522 1599 1665 N
+ EH IH SH s n/a 12 1522 1583 1665 N
+ EH IH SIL s n/a 12 1522 1583 1651 N
+ EH IH T b n/a 12 1522 1599 1651 N
+ EH IH T s n/a 12 1522 1584 1651 N
+ EH IH TH b n/a 12 1522 1599 1660 N
+ EH IH TH s n/a 12 1522 1585 1660 N
+ EH IH UH s n/a 12 1522 1583 1685 N
+ EH IH UW s n/a 12 1522 1583 1685 N
+ EH IH V b n/a 12 1522 1593 1675 N
+ EH IH V s n/a 12 1522 1593 1675 N
+ EH IH W s n/a 12 1522 1591 1690 N
+ EH IH Y s n/a 12 1522 1583 1656 N
+ EH IH Z b n/a 12 1521 1595 1669 N
+ EH IH Z s n/a 12 1521 1583 1670 N
+ EH IH ZH s n/a 12 1521 1583 1670 N
+ EH IY AA e n/a 12 1531 1583 1685 N
+ EH IY AA s n/a 12 1531 1583 1685 N
+ EH IY AE e n/a 12 1531 1583 1656 N
+ EH IY AE s n/a 12 1531 1583 1656 N
+ EH IY AH b n/a 12 1531 1602 1656 N
+ EH IY AH e n/a 12 1531 1583 1656 N
+ EH IY AH s n/a 12 1531 1583 1656 N
+ EH IY AO e n/a 12 1531 1583 1685 N
+ EH IY AO s n/a 12 1531 1583 1685 N
+ EH IY AW e n/a 12 1531 1583 1656 N
+ EH IY AW s n/a 12 1531 1583 1656 N
+ EH IY AY e n/a 12 1531 1583 1685 N
+ EH IY AY s n/a 12 1531 1583 1685 N
+ EH IY B b n/a 12 1531 1592 1671 N
+ EH IY B e n/a 12 1531 1592 1671 N
+ EH IY B s n/a 12 1531 1592 1671 N
+ EH IY CH b n/a 12 1531 1599 1651 N
+ EH IY CH e n/a 12 1531 1584 1651 N
+ EH IY CH s n/a 12 1531 1584 1651 N
+ EH IY D b n/a 12 1531 1619 1656 N
+ EH IY D e n/a 12 1531 1618 1656 N
+ EH IY D i n/a 12 1531 1618 1656 N
+ EH IY D s n/a 12 1531 1618 1656 N
+ EH IY DH b n/a 12 1531 1595 1667 N
+ EH IY DH e n/a 12 1531 1585 1666 N
+ EH IY DH s n/a 12 1531 1585 1667 N
+ EH IY EH b n/a 12 1531 1602 1656 N
+ EH IY EH e n/a 12 1531 1583 1656 N
+ EH IY EH s n/a 12 1531 1583 1656 N
+ EH IY ER b n/a 12 1533 1645 1685 N
+ EH IY ER e n/a 12 1533 1645 1685 N
+ EH IY ER s n/a 12 1533 1645 1685 N
+ EH IY EY e n/a 12 1531 1583 1656 N
+ EH IY EY s n/a 12 1531 1583 1656 N
+ EH IY F b n/a 12 1531 1583 1660 N
+ EH IY F e n/a 12 1531 1583 1660 N
+ EH IY F i n/a 12 1531 1583 1660 N
+ EH IY F s n/a 12 1531 1583 1660 N
+ EH IY G b n/a 12 1531 1608 1659 N
+ EH IY G e n/a 12 1531 1608 1659 N
+ EH IY G i n/a 12 1531 1608 1659 N
+ EH IY G s n/a 12 1531 1608 1659 N
+ EH IY HH b n/a 12 1531 1599 1651 N
+ EH IY HH e n/a 12 1531 1583 1651 N
+ EH IY HH s n/a 12 1531 1583 1651 N
+ EH IY IH b n/a 12 1531 1602 1656 N
+ EH IY IH e n/a 12 1531 1583 1656 N
+ EH IY IH s n/a 12 1531 1583 1656 N
+ EH IY IY b n/a 12 1531 1602 1656 N
+ EH IY IY e n/a 12 1531 1583 1656 N
+ EH IY IY s n/a 12 1531 1583 1656 N
+ EH IY JH b n/a 12 1531 1602 1656 N
+ EH IY JH e n/a 12 1531 1584 1656 N
+ EH IY JH i n/a 12 1531 1584 1656 N
+ EH IY JH s n/a 12 1531 1584 1656 N
+ EH IY K b n/a 12 1531 1606 1657 N
+ EH IY K e n/a 12 1531 1606 1657 N
+ EH IY K i n/a 12 1531 1605 1657 N
+ EH IY K s n/a 12 1531 1606 1657 N
+ EH IY L b n/a 12 1531 1638 1690 N
+ EH IY L e n/a 12 1531 1638 1690 N
+ EH IY L i n/a 12 1531 1638 1690 N
+ EH IY L s n/a 12 1531 1638 1690 N
+ EH IY M b n/a 12 1532 1592 1674 N
+ EH IY M e n/a 12 1532 1592 1674 N
+ EH IY M i n/a 12 1532 1592 1674 N
+ EH IY M s n/a 12 1532 1592 1674 N
+ EH IY N b n/a 12 1532 1614 1677 N
+ EH IY N e n/a 12 1532 1614 1677 N
+ EH IY N i n/a 12 1532 1610 1678 N
+ EH IY N s n/a 12 1532 1614 1677 N
+ EH IY NG b n/a 12 1532 1608 1677 N
+ EH IY NG e n/a 12 1532 1608 1677 N
+ EH IY NG i n/a 12 1532 1608 1678 N
+ EH IY NG s n/a 12 1532 1608 1677 N
+ EH IY OW e n/a 12 1531 1583 1685 N
+ EH IY OW s n/a 12 1531 1583 1685 N
+ EH IY OY e n/a 12 1531 1583 1685 N
+ EH IY OY s n/a 12 1531 1583 1685 N
+ EH IY P b n/a 12 1531 1583 1672 N
+ EH IY P e n/a 12 1531 1583 1672 N
+ EH IY P s n/a 12 1531 1583 1672 N
+ EH IY R b n/a 12 1533 1645 1685 N
+ EH IY R e n/a 12 1533 1645 1685 N
+ EH IY R i n/a 12 1540 1645 1685 N
+ EH IY R s n/a 12 1533 1645 1685 N
+ EH IY S b n/a 12 1531 1599 1662 N
+ EH IY S e n/a 12 1531 1583 1662 N
+ EH IY S i n/a 12 1531 1583 1662 N
+ EH IY S s n/a 12 1531 1583 1662 N
+ EH IY SH b n/a 12 1531 1599 1665 N
+ EH IY SH e n/a 12 1531 1583 1665 N
+ EH IY SH s n/a 12 1531 1583 1665 N
+ EH IY SIL e n/a 12 1531 1583 1651 N
+ EH IY SIL s n/a 12 1531 1583 1651 N
+ EH IY T b n/a 12 1531 1599 1651 N
+ EH IY T e n/a 12 1531 1584 1651 N
+ EH IY T i n/a 12 1531 1584 1651 N
+ EH IY T s n/a 12 1531 1584 1651 N
+ EH IY TH b n/a 12 1531 1599 1660 N
+ EH IY TH e n/a 12 1531 1585 1660 N
+ EH IY TH i n/a 12 1531 1585 1660 N
+ EH IY TH s n/a 12 1531 1585 1660 N
+ EH IY UH e n/a 12 1531 1583 1685 N
+ EH IY UH s n/a 12 1531 1583 1685 N
+ EH IY UW e n/a 12 1531 1583 1685 N
+ EH IY UW s n/a 12 1531 1583 1685 N
+ EH IY V b n/a 12 1531 1593 1675 N
+ EH IY V e n/a 12 1531 1593 1675 N
+ EH IY V i n/a 12 1531 1590 1671 N
+ EH IY V s n/a 12 1531 1593 1675 N
+ EH IY W e n/a 12 1531 1592 1690 N
+ EH IY W s n/a 12 1531 1592 1690 N
+ EH IY Y e n/a 12 1531 1583 1656 N
+ EH IY Y s n/a 12 1531 1583 1656 N
+ EH IY Z b n/a 12 1531 1595 1669 N
+ EH IY Z e n/a 12 1531 1583 1670 N
+ EH IY Z s n/a 12 1531 1583 1670 N
+ EH IY ZH e n/a 12 1531 1583 1670 N
+ EH IY ZH s n/a 12 1531 1583 1670 N
+ EH JH AA s n/a 12 1522 1583 1685 N
+ EH JH AE s n/a 12 1522 1583 1654 N
+ EH JH AH b n/a 12 1522 1602 1654 N
+ EH JH AH s n/a 12 1522 1583 1654 N
+ EH JH AO s n/a 12 1522 1583 1685 N
+ EH JH AW s n/a 12 1522 1583 1654 N
+ EH JH AY s n/a 12 1522 1583 1685 N
+ EH JH B b n/a 12 1522 1591 1671 N
+ EH JH B i n/a 12 1530 1590 1671 N
+ EH JH B s n/a 12 1522 1591 1671 N
+ EH JH CH b n/a 12 1522 1599 1651 N
+ EH JH CH s n/a 12 1522 1584 1651 N
+ EH JH D b n/a 12 1522 1619 1654 N
+ EH JH D i n/a 12 1530 1618 1654 N
+ EH JH D s n/a 12 1522 1618 1654 N
+ EH JH DH b n/a 12 1522 1595 1667 N
+ EH JH DH s n/a 12 1522 1585 1667 N
+ EH JH EH b n/a 12 1522 1602 1654 N
+ EH JH EH s n/a 12 1522 1583 1654 N
+ EH JH ER b n/a 12 1523 1645 1685 N
+ EH JH ER s n/a 12 1523 1645 1685 N
+ EH JH EY s n/a 12 1522 1583 1654 N
+ EH JH F b n/a 12 1522 1583 1660 N
+ EH JH F i n/a 12 1530 1583 1660 N
+ EH JH F s n/a 12 1522 1583 1660 N
+ EH JH G b n/a 12 1522 1608 1659 N
+ EH JH G i n/a 12 1530 1608 1659 N
+ EH JH G s n/a 12 1522 1608 1659 N
+ EH JH HH b n/a 12 1522 1599 1651 N
+ EH JH HH i n/a 12 1530 1583 1651 N
+ EH JH HH s n/a 12 1522 1583 1651 N
+ EH JH IH b n/a 12 1522 1602 1654 N
+ EH JH IH s n/a 12 1522 1583 1654 N
+ EH JH IY b n/a 12 1522 1602 1654 N
+ EH JH IY s n/a 12 1522 1583 1654 N
+ EH JH JH b n/a 12 1522 1602 1656 N
+ EH JH JH i n/a 12 1530 1584 1656 N
+ EH JH JH s n/a 12 1522 1584 1656 N
+ EH JH K b n/a 12 1522 1606 1657 N
+ EH JH K i n/a 12 1530 1605 1657 N
+ EH JH K s n/a 12 1522 1606 1657 N
+ EH JH L b n/a 12 1522 1638 1690 N
+ EH JH L i n/a 12 1530 1638 1690 N
+ EH JH L s n/a 12 1522 1638 1690 N
+ EH JH M b n/a 12 1523 1591 1673 N
+ EH JH M i n/a 12 1530 1589 1673 N
+ EH JH M s n/a 12 1523 1591 1673 N
+ EH JH N b n/a 12 1523 1615 1677 N
+ EH JH N i n/a 12 1530 1612 1679 N
+ EH JH N s n/a 12 1523 1615 1677 N
+ EH JH NG b n/a 12 1523 1608 1677 N
+ EH JH NG i n/a 12 1530 1608 1681 N
+ EH JH NG s n/a 12 1523 1608 1677 N
+ EH JH OW s n/a 12 1522 1583 1685 N
+ EH JH OY s n/a 12 1522 1583 1685 N
+ EH JH P b n/a 12 1522 1583 1672 N
+ EH JH P i n/a 12 1530 1583 1672 N
+ EH JH P s n/a 12 1522 1583 1672 N
+ EH JH R b n/a 12 1523 1645 1685 N
+ EH JH R i n/a 12 1539 1645 1685 N
+ EH JH R s n/a 12 1523 1645 1685 N
+ EH JH S b n/a 12 1522 1599 1662 N
+ EH JH S i n/a 12 1530 1583 1662 N
+ EH JH S s n/a 12 1522 1583 1662 N
+ EH JH SH b n/a 12 1522 1599 1665 N
+ EH JH SH i n/a 12 1530 1583 1665 N
+ EH JH SH s n/a 12 1522 1583 1665 N
+ EH JH SIL s n/a 12 1522 1583 1651 N
+ EH JH T b n/a 12 1522 1599 1651 N
+ EH JH T i n/a 12 1530 1584 1651 N
+ EH JH T s n/a 12 1522 1584 1651 N
+ EH JH TH b n/a 12 1522 1599 1660 N
+ EH JH TH i n/a 12 1530 1585 1660 N
+ EH JH TH s n/a 12 1522 1585 1660 N
+ EH JH UH s n/a 12 1522 1583 1685 N
+ EH JH UW s n/a 12 1522 1583 1685 N
+ EH JH V b n/a 12 1522 1593 1675 N
+ EH JH V i n/a 12 1530 1590 1671 N
+ EH JH V s n/a 12 1522 1593 1675 N
+ EH JH W s n/a 12 1522 1591 1690 N
+ EH JH Y s n/a 12 1522 1583 1654 N
+ EH JH Z b n/a 12 1521 1595 1669 N
+ EH JH Z i n/a 12 1530 1583 1670 N
+ EH JH Z s n/a 12 1521 1583 1670 N
+ EH JH ZH i n/a 12 1530 1583 1670 N
+ EH JH ZH s n/a 12 1521 1583 1670 N
+ EH K AA e n/a 12 1522 1602 1688 N
+ EH K AA s n/a 12 1522 1602 1688 N
+ EH K AE e n/a 12 1522 1602 1654 N
+ EH K AE s n/a 12 1522 1602 1654 N
+ EH K AH b n/a 12 1522 1602 1654 N
+ EH K AH e n/a 12 1522 1602 1654 N
+ EH K AH s n/a 12 1522 1602 1654 N
+ EH K AO e n/a 12 1522 1602 1688 N
+ EH K AO s n/a 12 1522 1602 1688 N
+ EH K AW e n/a 12 1522 1602 1654 N
+ EH K AW s n/a 12 1522 1602 1654 N
+ EH K AY e n/a 12 1522 1602 1688 N
+ EH K AY s n/a 12 1522 1602 1688 N
+ EH K B b n/a 12 1522 1591 1671 N
+ EH K B e n/a 12 1522 1591 1671 N
+ EH K B i n/a 12 1552 1591 1671 N
+ EH K B s n/a 12 1522 1591 1671 N
+ EH K CH b n/a 12 1522 1599 1651 N
+ EH K CH e n/a 12 1522 1599 1651 N
+ EH K CH i n/a 12 1552 1599 1651 N
+ EH K CH s n/a 12 1522 1599 1651 N
+ EH K D b n/a 12 1522 1619 1654 N
+ EH K D e n/a 12 1522 1619 1654 N
+ EH K D i n/a 12 1552 1619 1654 N
+ EH K D s n/a 12 1522 1619 1654 N
+ EH K DH b n/a 12 1522 1595 1667 N
+ EH K DH e n/a 12 1522 1595 1667 N
+ EH K DH s n/a 12 1522 1595 1667 N
+ EH K EH b n/a 12 1522 1602 1654 N
+ EH K EH e n/a 12 1522 1602 1654 N
+ EH K EH s n/a 12 1522 1602 1654 N
+ EH K ER b n/a 12 1523 1649 1688 N
+ EH K ER e n/a 12 1523 1649 1688 N
+ EH K ER s n/a 12 1523 1649 1688 N
+ EH K EY e n/a 12 1522 1602 1654 N
+ EH K EY s n/a 12 1522 1602 1654 N
+ EH K F b n/a 12 1522 1583 1660 N
+ EH K F e n/a 12 1522 1583 1660 N
+ EH K F i n/a 12 1552 1583 1660 N
+ EH K F s n/a 12 1522 1583 1660 N
+ EH K G b n/a 12 1522 1608 1659 N
+ EH K G e n/a 12 1522 1608 1659 N
+ EH K G i n/a 12 1553 1604 1659 N
+ EH K G s n/a 12 1522 1608 1659 N
+ EH K HH b n/a 12 1522 1599 1651 N
+ EH K HH e n/a 12 1522 1599 1651 N
+ EH K HH i n/a 12 1552 1599 1651 N
+ EH K HH s n/a 12 1522 1599 1651 N
+ EH K IH b n/a 12 1522 1602 1654 N
+ EH K IH e n/a 12 1522 1602 1654 N
+ EH K IH s n/a 12 1522 1602 1654 N
+ EH K IY b n/a 12 1522 1602 1654 N
+ EH K IY e n/a 12 1522 1602 1654 N
+ EH K IY s n/a 12 1522 1602 1654 N
+ EH K JH b n/a 12 1522 1602 1656 N
+ EH K JH e n/a 12 1522 1602 1656 N
+ EH K JH i n/a 12 1552 1602 1656 N
+ EH K JH s n/a 12 1522 1602 1656 N
+ EH K K b n/a 12 1522 1606 1657 N
+ EH K K e n/a 12 1522 1606 1657 N
+ EH K K i n/a 12 1553 1604 1657 N
+ EH K K s n/a 12 1522 1606 1657 N
+ EH K L b n/a 12 1522 1638 1690 N
+ EH K L e n/a 12 1522 1638 1690 N
+ EH K L i n/a 12 1556 1639 1690 N
+ EH K L s n/a 12 1522 1638 1690 N
+ EH K M b n/a 12 1523 1591 1673 N
+ EH K M e n/a 12 1523 1591 1673 N
+ EH K M i n/a 12 1554 1591 1673 N
+ EH K M s n/a 12 1523 1591 1673 N
+ EH K N b n/a 12 1523 1615 1677 N
+ EH K N e n/a 12 1523 1615 1677 N
+ EH K N i n/a 12 1554 1616 1678 N
+ EH K N s n/a 12 1523 1615 1677 N
+ EH K NG b n/a 12 1523 1608 1677 N
+ EH K NG e n/a 12 1523 1608 1677 N
+ EH K NG i n/a 12 1554 1604 1678 N
+ EH K NG s n/a 12 1523 1608 1677 N
+ EH K OW e n/a 12 1522 1602 1688 N
+ EH K OW s n/a 12 1522 1602 1688 N
+ EH K OY e n/a 12 1522 1602 1688 N
+ EH K OY s n/a 12 1522 1602 1688 N
+ EH K P b n/a 12 1522 1584 1672 N
+ EH K P e n/a 12 1522 1584 1672 N
+ EH K P i n/a 12 1552 1584 1672 N
+ EH K P s n/a 12 1522 1584 1672 N
+ EH K R b n/a 12 1523 1649 1688 N
+ EH K R e n/a 12 1523 1649 1688 N
+ EH K R i n/a 12 1559 1649 1688 N
+ EH K R s n/a 12 1523 1649 1688 N
+ EH K S b n/a 12 1522 1599 1662 N
+ EH K S e n/a 12 1522 1599 1662 N
+ EH K S i n/a 12 1553 1599 1662 N
+ EH K S s n/a 12 1522 1599 1662 N
+ EH K SH b n/a 12 1522 1597 1665 N
+ EH K SH e n/a 12 1522 1597 1665 N
+ EH K SH i n/a 12 1552 1597 1665 N
+ EH K SH s n/a 12 1522 1597 1665 N
+ EH K SIL e n/a 12 1522 1599 1651 N
+ EH K SIL s n/a 12 1522 1599 1651 N
+ EH K T b n/a 12 1522 1599 1651 N
+ EH K T e n/a 12 1522 1599 1651 N
+ EH K T i n/a 12 1552 1599 1651 N
+ EH K T s n/a 12 1522 1599 1651 N
+ EH K TH b n/a 12 1522 1599 1660 N
+ EH K TH e n/a 12 1522 1599 1660 N
+ EH K TH i n/a 12 1552 1599 1660 N
+ EH K TH s n/a 12 1522 1599 1660 N
+ EH K UH e n/a 12 1522 1602 1688 N
+ EH K UH s n/a 12 1522 1602 1688 N
+ EH K UW e n/a 12 1522 1602 1688 N
+ EH K UW s n/a 12 1522 1602 1688 N
+ EH K V b n/a 12 1522 1593 1675 N
+ EH K V e n/a 12 1522 1593 1675 N
+ EH K V i n/a 12 1552 1590 1671 N
+ EH K V s n/a 12 1522 1593 1675 N
+ EH K W e n/a 12 1522 1591 1690 N
+ EH K W s n/a 12 1522 1591 1690 N
+ EH K Y e n/a 12 1522 1602 1654 N
+ EH K Y s n/a 12 1522 1602 1654 N
+ EH K Z b n/a 12 1521 1595 1669 N
+ EH K Z e n/a 12 1521 1595 1670 N
+ EH K Z i n/a 12 1553 1602 1670 N
+ EH K Z s n/a 12 1521 1595 1670 N
+ EH K ZH e n/a 12 1521 1595 1670 N
+ EH K ZH s n/a 12 1521 1595 1670 N
+ EH L AA e n/a 12 1573 1621 1686 N
+ EH L AA s n/a 12 1573 1621 1686 N
+ EH L AE e n/a 12 1573 1621 1656 N
+ EH L AE i n/a 12 1575 1621 1656 N
+ EH L AE s n/a 12 1573 1621 1656 N
+ EH L AH b n/a 12 1573 1621 1656 N
+ EH L AH e n/a 12 1573 1621 1656 N
+ EH L AH s n/a 12 1573 1621 1656 N
+ EH L AO e n/a 12 1573 1621 1686 N
+ EH L AO s n/a 12 1573 1621 1686 N
+ EH L AW e n/a 12 1573 1621 1656 N
+ EH L AW s n/a 12 1573 1621 1656 N
+ EH L AY e n/a 12 1573 1621 1686 N
+ EH L AY s n/a 12 1573 1621 1686 N
+ EH L B b n/a 12 1573 1625 1671 N
+ EH L B e n/a 12 1573 1625 1671 N
+ EH L B i n/a 12 1576 1625 1671 N
+ EH L B s n/a 12 1573 1625 1671 N
+ EH L CH b n/a 12 1573 1621 1653 N
+ EH L CH e n/a 12 1573 1621 1653 N
+ EH L CH i n/a 12 1575 1621 1653 N
+ EH L CH s n/a 12 1573 1621 1653 N
+ EH L D b n/a 12 1573 1628 1656 N
+ EH L D e n/a 12 1573 1628 1656 N
+ EH L D i n/a 12 1575 1628 1656 N
+ EH L D s n/a 12 1573 1628 1656 N
+ EH L DH b n/a 12 1573 1621 1669 N
+ EH L DH e n/a 12 1573 1621 1670 N
+ EH L DH i n/a 12 1576 1621 1670 N
+ EH L DH s n/a 12 1573 1621 1670 N
+ EH L EH b n/a 12 1573 1621 1656 N
+ EH L EH e n/a 12 1573 1621 1656 N
+ EH L EH s n/a 12 1573 1621 1656 N
+ EH L ER b n/a 12 1573 1647 1686 N
+ EH L ER e n/a 12 1573 1647 1686 N
+ EH L ER s n/a 12 1573 1647 1686 N
+ EH L EY e n/a 12 1573 1621 1656 N
+ EH L EY s n/a 12 1573 1621 1656 N
+ EH L F b n/a 12 1573 1624 1660 N
+ EH L F e n/a 12 1573 1624 1660 N
+ EH L F i n/a 12 1576 1624 1660 N
+ EH L F s n/a 12 1573 1624 1660 N
+ EH L G b n/a 12 1573 1628 1659 N
+ EH L G e n/a 12 1573 1628 1659 N
+ EH L G i n/a 12 1575 1628 1659 N
+ EH L G s n/a 12 1573 1628 1659 N
+ EH L HH b n/a 12 1573 1621 1653 N
+ EH L HH e n/a 12 1573 1621 1653 N
+ EH L HH i n/a 12 1575 1621 1653 N
+ EH L HH s n/a 12 1573 1621 1653 N
+ EH L IH b n/a 12 1573 1621 1656 N
+ EH L IH e n/a 12 1573 1621 1656 N
+ EH L IH s n/a 12 1573 1621 1656 N
+ EH L IY b n/a 12 1573 1621 1656 N
+ EH L IY e n/a 12 1573 1621 1656 N
+ EH L IY i n/a 12 1575 1621 1656 N
+ EH L IY s n/a 12 1573 1621 1656 N
+ EH L JH b n/a 12 1573 1621 1656 N
+ EH L JH e n/a 12 1573 1621 1656 N
+ EH L JH i n/a 12 1575 1621 1656 N
+ EH L JH s n/a 12 1573 1621 1656 N
+ EH L K b n/a 12 1573 1622 1658 N
+ EH L K e n/a 12 1573 1622 1658 N
+ EH L K i n/a 12 1577 1622 1658 N
+ EH L K s n/a 12 1573 1622 1658 N
+ EH L L b n/a 12 1573 1643 1692 N
+ EH L L e n/a 12 1573 1643 1692 N
+ EH L L i n/a 12 1574 1643 1692 N
+ EH L L s n/a 12 1573 1643 1692 N
+ EH L M b n/a 12 1573 1627 1673 N
+ EH L M e n/a 12 1573 1627 1673 N
+ EH L M i n/a 12 1576 1627 1673 N
+ EH L M s n/a 12 1573 1627 1673 N
+ EH L N b n/a 12 1573 1627 1682 N
+ EH L N e n/a 12 1573 1627 1682 N
+ EH L N i n/a 12 1575 1627 1682 N
+ EH L N s n/a 12 1573 1627 1682 N
+ EH L NG b n/a 12 1573 1627 1682 N
+ EH L NG e n/a 12 1573 1627 1682 N
+ EH L NG i n/a 12 1575 1627 1682 N
+ EH L NG s n/a 12 1573 1627 1682 N
+ EH L OW e n/a 12 1573 1621 1686 N
+ EH L OW i n/a 12 1574 1621 1686 N
+ EH L OW s n/a 12 1573 1621 1686 N
+ EH L OY e n/a 12 1573 1621 1686 N
+ EH L OY s n/a 12 1573 1621 1686 N
+ EH L P b n/a 12 1573 1624 1672 N
+ EH L P e n/a 12 1573 1624 1672 N
+ EH L P i n/a 12 1576 1624 1672 N
+ EH L P s n/a 12 1573 1624 1672 N
+ EH L R b n/a 12 1573 1647 1686 N
+ EH L R e n/a 12 1573 1647 1686 N
+ EH L R i n/a 12 1574 1647 1686 N
+ EH L R s n/a 12 1573 1647 1686 N
+ EH L S b n/a 12 1573 1624 1664 N
+ EH L S e n/a 12 1573 1624 1664 N
+ EH L S i n/a 12 1576 1624 1664 N
+ EH L S s n/a 12 1573 1624 1664 N
+ EH L SH b n/a 12 1573 1624 1664 N
+ EH L SH e n/a 12 1573 1624 1664 N
+ EH L SH i n/a 12 1576 1624 1664 N
+ EH L SH s n/a 12 1573 1624 1664 N
+ EH L SIL e n/a 12 1573 1621 1653 N
+ EH L SIL s n/a 12 1573 1621 1653 N
+ EH L T b n/a 12 1573 1621 1653 N
+ EH L T e n/a 12 1573 1621 1653 N
+ EH L T i n/a 12 1576 1621 1653 N
+ EH L T s n/a 12 1573 1621 1653 N
+ EH L TH b n/a 12 1573 1624 1661 N
+ EH L TH e n/a 12 1573 1624 1661 N
+ EH L TH i n/a 12 1576 1624 1661 N
+ EH L TH s n/a 12 1573 1624 1661 N
+ EH L UH e n/a 12 1573 1621 1686 N
+ EH L UH s n/a 12 1573 1621 1686 N
+ EH L UW e n/a 12 1573 1621 1686 N
+ EH L UW s n/a 12 1573 1621 1686 N
+ EH L V b n/a 12 1573 1625 1675 N
+ EH L V e n/a 12 1573 1625 1675 N
+ EH L V i n/a 12 1576 1625 1671 N
+ EH L V s n/a 12 1573 1625 1675 N
+ EH L W e n/a 12 1573 1643 1692 N
+ EH L W i n/a 12 1576 1643 1692 N
+ EH L W s n/a 12 1573 1643 1692 N
+ EH L Y e n/a 12 1573 1643 1656 N
+ EH L Y i n/a 12 1575 1643 1656 N
+ EH L Y s n/a 12 1573 1643 1656 N
+ EH L Z b n/a 12 1573 1621 1669 N
+ EH L Z e n/a 12 1573 1621 1670 N
+ EH L Z i n/a 12 1576 1621 1670 N
+ EH L Z s n/a 12 1573 1621 1670 N
+ EH L ZH e n/a 12 1573 1621 1670 N
+ EH L ZH i n/a 12 1576 1621 1666 N
+ EH L ZH s n/a 12 1573 1621 1670 N
+ EH M AA e n/a 12 1571 1602 1686 N
+ EH M AA s n/a 12 1571 1602 1686 N
+ EH M AE e n/a 12 1571 1602 1654 N
+ EH M AE s n/a 12 1571 1602 1654 N
+ EH M AH b n/a 12 1571 1602 1654 N
+ EH M AH e n/a 12 1571 1602 1654 N
+ EH M AH i n/a 12 1566 1602 1654 N
+ EH M AH s n/a 12 1571 1602 1654 N
+ EH M AO e n/a 12 1571 1602 1686 N
+ EH M AO s n/a 12 1571 1602 1686 N
+ EH M AW e n/a 12 1571 1602 1654 N
+ EH M AW s n/a 12 1571 1602 1654 N
+ EH M AY e n/a 12 1571 1602 1686 N
+ EH M AY s n/a 12 1571 1602 1686 N
+ EH M B b n/a 12 1571 1590 1671 N
+ EH M B e n/a 12 1571 1590 1671 N
+ EH M B i n/a 12 1567 1590 1671 N
+ EH M B s n/a 12 1571 1590 1671 N
+ EH M CH b n/a 12 1571 1600 1652 N
+ EH M CH e n/a 12 1571 1600 1652 N
+ EH M CH i n/a 12 1566 1600 1652 N
+ EH M CH s n/a 12 1571 1600 1652 N
+ EH M D b n/a 12 1571 1619 1654 N
+ EH M D e n/a 12 1571 1619 1654 N
+ EH M D i n/a 12 1567 1619 1654 N
+ EH M D s n/a 12 1571 1619 1654 N
+ EH M DH b n/a 12 1571 1595 1667 N
+ EH M DH e n/a 12 1571 1595 1666 N
+ EH M DH i n/a 12 1567 1602 1668 N
+ EH M DH s n/a 12 1571 1595 1667 N
+ EH M EH b n/a 12 1571 1602 1654 N
+ EH M EH e n/a 12 1571 1602 1654 N
+ EH M EH s n/a 12 1571 1602 1654 N
+ EH M ER b n/a 12 1571 1647 1686 N
+ EH M ER e n/a 12 1571 1647 1686 N
+ EH M ER s n/a 12 1571 1647 1686 N
+ EH M EY e n/a 12 1571 1602 1654 N
+ EH M EY i n/a 12 1566 1602 1654 N
+ EH M EY s n/a 12 1571 1602 1654 N
+ EH M F b n/a 12 1571 1583 1660 N
+ EH M F e n/a 12 1571 1583 1660 N
+ EH M F i n/a 12 1566 1583 1660 N
+ EH M F s n/a 12 1571 1583 1660 N
+ EH M G b n/a 12 1571 1608 1659 N
+ EH M G e n/a 12 1571 1608 1659 N
+ EH M G i n/a 12 1566 1608 1659 N
+ EH M G s n/a 12 1571 1608 1659 N
+ EH M HH b n/a 12 1571 1600 1652 N
+ EH M HH e n/a 12 1571 1600 1652 N
+ EH M HH i n/a 12 1566 1600 1652 N
+ EH M HH s n/a 12 1571 1600 1652 N
+ EH M IH b n/a 12 1571 1602 1654 N
+ EH M IH e n/a 12 1571 1602 1654 N
+ EH M IH s n/a 12 1571 1602 1654 N
+ EH M IY b n/a 12 1571 1602 1654 N
+ EH M IY e n/a 12 1571 1602 1654 N
+ EH M IY s n/a 12 1571 1602 1654 N
+ EH M JH b n/a 12 1571 1602 1656 N
+ EH M JH e n/a 12 1571 1602 1656 N
+ EH M JH i n/a 12 1566 1602 1656 N
+ EH M JH s n/a 12 1571 1602 1656 N
+ EH M K b n/a 12 1571 1606 1657 N
+ EH M K e n/a 12 1571 1606 1657 N
+ EH M K i n/a 12 1567 1607 1657 N
+ EH M K s n/a 12 1571 1606 1657 N
+ EH M L b n/a 12 1571 1642 1691 N
+ EH M L e n/a 12 1571 1642 1691 N
+ EH M L i n/a 12 1567 1642 1691 N
+ EH M L s n/a 12 1571 1642 1691 N
+ EH M M b n/a 12 1571 1590 1673 N
+ EH M M e n/a 12 1571 1590 1673 N
+ EH M M i n/a 12 1567 1590 1673 N
+ EH M M s n/a 12 1571 1590 1673 N
+ EH M N b n/a 12 1571 1615 1677 N
+ EH M N e n/a 12 1571 1615 1677 N
+ EH M N i n/a 12 1566 1609 1676 N
+ EH M N s n/a 12 1571 1615 1677 N
+ EH M NG b n/a 12 1571 1608 1677 N
+ EH M NG e n/a 12 1571 1608 1677 N
+ EH M NG i n/a 12 1566 1608 1677 N
+ EH M NG s n/a 12 1571 1608 1677 N
+ EH M OW e n/a 12 1571 1602 1686 N
+ EH M OW i n/a 12 1567 1602 1686 N
+ EH M OW s n/a 12 1571 1602 1686 N
+ EH M OY e n/a 12 1571 1602 1686 N
+ EH M OY s n/a 12 1571 1602 1686 N
+ EH M P b n/a 12 1571 1583 1672 N
+ EH M P e n/a 12 1571 1583 1672 N
+ EH M P s n/a 12 1571 1583 1672 N
+ EH M R b n/a 12 1571 1647 1686 N
+ EH M R e n/a 12 1571 1647 1686 N
+ EH M R i n/a 12 1568 1647 1686 N
+ EH M R s n/a 12 1571 1647 1686 N
+ EH M S b n/a 12 1571 1600 1662 N
+ EH M S e n/a 12 1571 1600 1662 N
+ EH M S i n/a 12 1567 1600 1662 N
+ EH M S s n/a 12 1571 1600 1662 N
+ EH M SH b n/a 12 1571 1600 1665 N
+ EH M SH e n/a 12 1571 1600 1665 N
+ EH M SH i n/a 12 1566 1600 1665 N
+ EH M SH s n/a 12 1571 1600 1665 N
+ EH M SIL e n/a 12 1571 1600 1652 N
+ EH M SIL s n/a 12 1571 1600 1652 N
+ EH M T b n/a 12 1571 1600 1652 N
+ EH M T e n/a 12 1571 1600 1652 N
+ EH M T i n/a 12 1567 1600 1652 N
+ EH M T s n/a 12 1571 1600 1652 N
+ EH M TH b n/a 12 1571 1600 1660 N
+ EH M TH e n/a 12 1571 1600 1660 N
+ EH M TH i n/a 12 1567 1600 1660 N
+ EH M TH s n/a 12 1571 1600 1660 N
+ EH M UH e n/a 12 1571 1602 1686 N
+ EH M UH s n/a 12 1571 1602 1686 N
+ EH M UW e n/a 12 1571 1602 1686 N
+ EH M UW s n/a 12 1571 1602 1686 N
+ EH M V b n/a 12 1571 1593 1675 N
+ EH M V e n/a 12 1571 1593 1675 N
+ EH M V i n/a 12 1566 1590 1671 N
+ EH M V s n/a 12 1571 1593 1675 N
+ EH M W e n/a 12 1571 1590 1691 N
+ EH M W s n/a 12 1571 1590 1691 N
+ EH M Y e n/a 12 1571 1602 1654 N
+ EH M Y s n/a 12 1571 1602 1654 N
+ EH M Z b n/a 12 1571 1595 1669 N
+ EH M Z e n/a 12 1571 1595 1670 N
+ EH M Z i n/a 12 1567 1602 1667 N
+ EH M Z s n/a 12 1571 1595 1670 N
+ EH M ZH e n/a 12 1571 1595 1670 N
+ EH M ZH i n/a 12 1566 1602 1666 N
+ EH M ZH s n/a 12 1571 1595 1670 N
+ EH N AA e n/a 12 1571 1586 1686 N
+ EH N AA s n/a 12 1571 1586 1686 N
+ EH N AE e n/a 12 1571 1586 1654 N
+ EH N AE s n/a 12 1571 1586 1654 N
+ EH N AH b n/a 12 1571 1602 1654 N
+ EH N AH e n/a 12 1571 1586 1654 N
+ EH N AH s n/a 12 1571 1586 1654 N
+ EH N AO e n/a 12 1571 1586 1686 N
+ EH N AO s n/a 12 1571 1586 1686 N
+ EH N AW e n/a 12 1571 1586 1654 N
+ EH N AW s n/a 12 1571 1586 1654 N
+ EH N AY e n/a 12 1571 1586 1686 N
+ EH N AY s n/a 12 1571 1586 1686 N
+ EH N B b n/a 12 1571 1591 1671 N
+ EH N B e n/a 12 1571 1591 1671 N
+ EH N B i n/a 12 1570 1591 1671 N
+ EH N B s n/a 12 1571 1591 1671 N
+ EH N CH b n/a 12 1571 1600 1652 N
+ EH N CH e n/a 12 1571 1586 1652 N
+ EH N CH i n/a 12 1569 1586 1652 N
+ EH N CH s n/a 12 1571 1586 1652 N
+ EH N D b n/a 12 1571 1619 1654 N
+ EH N D e n/a 12 1571 1618 1654 N
+ EH N D i n/a 12 1569 1618 1654 N
+ EH N D s n/a 12 1571 1618 1654 N
+ EH N DH b n/a 12 1571 1595 1667 N
+ EH N DH e n/a 12 1571 1586 1666 N
+ EH N DH i n/a 12 1569 1586 1668 N
+ EH N DH s n/a 12 1571 1586 1667 N
+ EH N EH b n/a 12 1571 1602 1654 N
+ EH N EH e n/a 12 1571 1586 1654 N
+ EH N EH s n/a 12 1571 1586 1654 N
+ EH N ER b n/a 12 1571 1647 1686 N
+ EH N ER e n/a 12 1571 1647 1686 N
+ EH N ER i n/a 12 1570 1647 1686 N
+ EH N ER s n/a 12 1571 1647 1686 N
+ EH N EY e n/a 12 1571 1586 1654 N
+ EH N EY s n/a 12 1571 1586 1654 N
+ EH N F b n/a 12 1571 1587 1660 N
+ EH N F e n/a 12 1571 1587 1660 N
+ EH N F i n/a 12 1570 1587 1660 N
+ EH N F s n/a 12 1571 1587 1660 N
+ EH N G b n/a 12 1571 1608 1659 N
+ EH N G e n/a 12 1571 1608 1659 N
+ EH N G i n/a 12 1569 1608 1659 N
+ EH N G s n/a 12 1571 1608 1659 N
+ EH N HH b n/a 12 1571 1600 1652 N
+ EH N HH e n/a 12 1571 1586 1652 N
+ EH N HH s n/a 12 1571 1586 1652 N
+ EH N IH b n/a 12 1571 1602 1654 N
+ EH N IH e n/a 12 1571 1586 1654 N
+ EH N IH s n/a 12 1571 1586 1654 N
+ EH N IY b n/a 12 1571 1602 1654 N
+ EH N IY e n/a 12 1571 1586 1654 N
+ EH N IY i n/a 12 1569 1586 1654 N
+ EH N IY s n/a 12 1571 1586 1654 N
+ EH N JH b n/a 12 1571 1602 1656 N
+ EH N JH e n/a 12 1571 1586 1656 N
+ EH N JH i n/a 12 1569 1586 1656 N
+ EH N JH s n/a 12 1571 1586 1656 N
+ EH N K b n/a 12 1571 1606 1657 N
+ EH N K e n/a 12 1571 1606 1657 N
+ EH N K i n/a 12 1569 1607 1657 N
+ EH N K s n/a 12 1571 1606 1657 N
+ EH N L b n/a 12 1571 1638 1690 N
+ EH N L e n/a 12 1571 1638 1690 N
+ EH N L i n/a 12 1569 1638 1690 N
+ EH N L s n/a 12 1571 1638 1690 N
+ EH N M b n/a 12 1571 1591 1673 N
+ EH N M e n/a 12 1571 1591 1673 N
+ EH N M i n/a 12 1570 1591 1673 N
+ EH N M s n/a 12 1571 1591 1673 N
+ EH N N b n/a 12 1571 1615 1677 N
+ EH N N e n/a 12 1571 1615 1677 N
+ EH N N i n/a 12 1569 1609 1679 N
+ EH N N s n/a 12 1571 1615 1677 N
+ EH N NG b n/a 12 1571 1608 1677 N
+ EH N NG e n/a 12 1571 1608 1677 N
+ EH N NG i n/a 12 1569 1608 1679 N
+ EH N NG s n/a 12 1571 1608 1677 N
+ EH N OW e n/a 12 1571 1586 1686 N
+ EH N OW s n/a 12 1571 1586 1686 N
+ EH N OY e n/a 12 1571 1586 1686 N
+ EH N OY s n/a 12 1571 1586 1686 N
+ EH N P b n/a 12 1571 1587 1672 N
+ EH N P e n/a 12 1571 1587 1672 N
+ EH N P i n/a 12 1570 1587 1672 N
+ EH N P s n/a 12 1571 1587 1672 N
+ EH N R b n/a 12 1571 1647 1686 N
+ EH N R e n/a 12 1571 1647 1686 N
+ EH N R i n/a 12 1570 1647 1686 N
+ EH N R s n/a 12 1571 1647 1686 N
+ EH N S b n/a 12 1571 1600 1662 N
+ EH N S e n/a 12 1571 1587 1662 N
+ EH N S i n/a 12 1569 1587 1662 N
+ EH N S s n/a 12 1571 1587 1662 N
+ EH N SH b n/a 12 1571 1600 1665 N
+ EH N SH e n/a 12 1571 1587 1665 N
+ EH N SH i n/a 12 1569 1587 1665 N
+ EH N SH s n/a 12 1571 1587 1665 N
+ EH N SIL e n/a 12 1571 1586 1652 N
+ EH N SIL s n/a 12 1571 1586 1652 N
+ EH N T b n/a 12 1571 1600 1652 N
+ EH N T e n/a 12 1571 1588 1652 N
+ EH N T i n/a 12 1569 1588 1652 N
+ EH N T s n/a 12 1571 1588 1652 N
+ EH N TH b n/a 12 1571 1600 1660 N
+ EH N TH e n/a 12 1571 1586 1660 N
+ EH N TH i n/a 12 1569 1586 1660 N
+ EH N TH s n/a 12 1571 1586 1660 N
+ EH N UH e n/a 12 1571 1586 1686 N
+ EH N UH s n/a 12 1571 1586 1686 N
+ EH N UW e n/a 12 1571 1586 1686 N
+ EH N UW s n/a 12 1571 1586 1686 N
+ EH N V b n/a 12 1571 1593 1675 N
+ EH N V e n/a 12 1571 1593 1675 N
+ EH N V i n/a 12 1569 1589 1675 N
+ EH N V s n/a 12 1571 1593 1675 N
+ EH N W e n/a 12 1571 1591 1690 N
+ EH N W i n/a 12 1570 1591 1690 N
+ EH N W s n/a 12 1571 1591 1690 N
+ EH N Y e n/a 12 1571 1586 1654 N
+ EH N Y s n/a 12 1571 1586 1654 N
+ EH N Z b n/a 12 1571 1595 1669 N
+ EH N Z e n/a 12 1571 1587 1670 N
+ EH N Z i n/a 12 1569 1587 1667 N
+ EH N Z s n/a 12 1571 1587 1670 N
+ EH N ZH e n/a 12 1571 1587 1670 N
+ EH N ZH i n/a 12 1569 1587 1666 N
+ EH N ZH s n/a 12 1571 1587 1670 N
+ EH NG AA s n/a 12 1571 1583 1686 N
+ EH NG AE s n/a 12 1571 1583 1654 N
+ EH NG AH b n/a 12 1571 1602 1654 N
+ EH NG AH s n/a 12 1571 1583 1654 N
+ EH NG AO s n/a 12 1571 1583 1686 N
+ EH NG AW s n/a 12 1571 1583 1654 N
+ EH NG AY s n/a 12 1571 1583 1686 N
+ EH NG B b n/a 12 1571 1591 1671 N
+ EH NG B s n/a 12 1571 1591 1671 N
+ EH NG CH b n/a 12 1571 1600 1651 N
+ EH NG CH s n/a 12 1571 1584 1651 N
+ EH NG D b n/a 12 1571 1619 1654 N
+ EH NG D s n/a 12 1571 1618 1654 N
+ EH NG DH b n/a 12 1571 1595 1667 N
+ EH NG DH s n/a 12 1571 1585 1667 N
+ EH NG EH b n/a 12 1571 1602 1654 N
+ EH NG EH s n/a 12 1571 1583 1654 N
+ EH NG ER b n/a 12 1571 1647 1686 N
+ EH NG ER s n/a 12 1571 1647 1686 N
+ EH NG EY s n/a 12 1571 1583 1654 N
+ EH NG F b n/a 12 1571 1583 1660 N
+ EH NG F s n/a 12 1571 1583 1660 N
+ EH NG G b n/a 12 1571 1608 1659 N
+ EH NG G s n/a 12 1571 1608 1659 N
+ EH NG HH b n/a 12 1571 1600 1651 N
+ EH NG HH s n/a 12 1571 1583 1651 N
+ EH NG IH b n/a 12 1571 1602 1654 N
+ EH NG IH s n/a 12 1571 1583 1654 N
+ EH NG IY b n/a 12 1571 1602 1654 N
+ EH NG IY s n/a 12 1571 1583 1654 N
+ EH NG JH b n/a 12 1571 1602 1656 N
+ EH NG JH i n/a 12 1566 1584 1656 N
+ EH NG JH s n/a 12 1571 1584 1656 N
+ EH NG K b n/a 12 1571 1606 1657 N
+ EH NG K s n/a 12 1571 1606 1657 N
+ EH NG L b n/a 12 1571 1638 1690 N
+ EH NG L s n/a 12 1571 1638 1690 N
+ EH NG M b n/a 12 1571 1591 1673 N
+ EH NG M s n/a 12 1571 1591 1673 N
+ EH NG N b n/a 12 1571 1615 1677 N
+ EH NG N s n/a 12 1571 1615 1677 N
+ EH NG NG b n/a 12 1571 1608 1677 N
+ EH NG NG s n/a 12 1571 1608 1677 N
+ EH NG OW s n/a 12 1571 1583 1686 N
+ EH NG OY s n/a 12 1571 1583 1686 N
+ EH NG P b n/a 12 1571 1584 1672 N
+ EH NG P s n/a 12 1571 1584 1672 N
+ EH NG R b n/a 12 1571 1647 1686 N
+ EH NG R s n/a 12 1571 1647 1686 N
+ EH NG S b n/a 12 1571 1600 1662 N
+ EH NG S s n/a 12 1571 1583 1662 N
+ EH NG SH b n/a 12 1571 1600 1665 N
+ EH NG SH s n/a 12 1571 1583 1665 N
+ EH NG SIL s n/a 12 1571 1583 1651 N
+ EH NG T b n/a 12 1571 1600 1651 N
+ EH NG T i n/a 12 1567 1584 1651 N
+ EH NG T s n/a 12 1571 1584 1651 N
+ EH NG TH b n/a 12 1571 1600 1660 N
+ EH NG TH s n/a 12 1571 1585 1660 N
+ EH NG UH s n/a 12 1571 1583 1686 N
+ EH NG UW s n/a 12 1571 1583 1686 N
+ EH NG V b n/a 12 1571 1593 1675 N
+ EH NG V s n/a 12 1571 1593 1675 N
+ EH NG W s n/a 12 1571 1591 1690 N
+ EH NG Y s n/a 12 1571 1583 1654 N
+ EH NG Z b n/a 12 1571 1595 1669 N
+ EH NG Z s n/a 12 1571 1583 1670 N
+ EH NG ZH s n/a 12 1571 1583 1670 N
+ EH OW AA s n/a 12 1578 1621 1684 N
+ EH OW AE s n/a 12 1582 1621 1656 N
+ EH OW AH b n/a 12 1582 1621 1656 N
+ EH OW AH s n/a 12 1582 1621 1656 N
+ EH OW AO s n/a 12 1578 1621 1684 N
+ EH OW AW s n/a 12 1582 1621 1656 N
+ EH OW AY s n/a 12 1578 1621 1684 N
+ EH OW B b n/a 12 1573 1625 1671 N
+ EH OW B s n/a 12 1573 1625 1671 N
+ EH OW CH b n/a 12 1573 1621 1651 N
+ EH OW CH i n/a 12 1575 1621 1651 N
+ EH OW CH s n/a 12 1573 1621 1651 N
+ EH OW D b n/a 12 1573 1628 1656 N
+ EH OW D i n/a 12 1575 1628 1656 N
+ EH OW D s n/a 12 1573 1628 1656 N
+ EH OW DH b n/a 12 1573 1621 1669 N
+ EH OW DH s n/a 12 1573 1621 1670 N
+ EH OW EH b n/a 12 1582 1621 1656 N
+ EH OW EH s n/a 12 1582 1621 1656 N
+ EH OW ER b n/a 12 1582 1650 1684 N
+ EH OW ER s n/a 12 1582 1650 1684 N
+ EH OW EY s n/a 12 1582 1621 1656 N
+ EH OW F b n/a 12 1573 1624 1660 N
+ EH OW F i n/a 12 1576 1624 1660 N
+ EH OW F s n/a 12 1573 1624 1660 N
+ EH OW G b n/a 12 1573 1628 1659 N
+ EH OW G s n/a 12 1573 1628 1659 N
+ EH OW HH b n/a 12 1573 1621 1651 N
+ EH OW HH s n/a 12 1573 1621 1651 N
+ EH OW IH b n/a 12 1582 1621 1656 N
+ EH OW IH s n/a 12 1582 1621 1656 N
+ EH OW IY b n/a 12 1582 1621 1656 N
+ EH OW IY s n/a 12 1582 1621 1656 N
+ EH OW JH b n/a 12 1573 1621 1656 N
+ EH OW JH i n/a 12 1575 1621 1656 N
+ EH OW JH s n/a 12 1573 1621 1656 N
+ EH OW K b n/a 12 1573 1623 1658 N
+ EH OW K i n/a 12 1577 1623 1658 N
+ EH OW K s n/a 12 1573 1623 1658 N
+ EH OW L b n/a 12 1578 1638 1690 N
+ EH OW L i n/a 12 1579 1638 1690 N
+ EH OW L s n/a 12 1578 1638 1690 N
+ EH OW M b n/a 12 1573 1627 1673 N
+ EH OW M s n/a 12 1573 1627 1673 N
+ EH OW N b n/a 12 1573 1627 1677 N
+ EH OW N i n/a 12 1575 1627 1676 N
+ EH OW N s n/a 12 1573 1627 1677 N
+ EH OW NG b n/a 12 1573 1627 1677 N
+ EH OW NG s n/a 12 1573 1627 1677 N
+ EH OW OW s n/a 12 1578 1621 1684 N
+ EH OW OY s n/a 12 1578 1621 1684 N
+ EH OW P b n/a 12 1573 1624 1672 N
+ EH OW P s n/a 12 1573 1624 1672 N
+ EH OW R b n/a 12 1582 1650 1684 N
+ EH OW R i n/a 12 1582 1650 1684 N
+ EH OW R s n/a 12 1582 1650 1684 N
+ EH OW S b n/a 12 1573 1623 1662 N
+ EH OW S i n/a 12 1576 1623 1662 N
+ EH OW S s n/a 12 1573 1623 1662 N
+ EH OW SH b n/a 12 1573 1623 1665 N
+ EH OW SH s n/a 12 1573 1623 1665 N
+ EH OW SIL s n/a 12 1573 1621 1651 N
+ EH OW T b n/a 12 1573 1621 1651 N
+ EH OW T i n/a 12 1576 1621 1651 N
+ EH OW T s n/a 12 1573 1621 1651 N
+ EH OW TH b n/a 12 1573 1621 1660 N
+ EH OW TH i n/a 12 1576 1621 1660 N
+ EH OW TH s n/a 12 1573 1621 1660 N
+ EH OW UH s n/a 12 1578 1621 1684 N
+ EH OW UW s n/a 12 1578 1621 1684 N
+ EH OW V b n/a 12 1573 1625 1675 N
+ EH OW V i n/a 12 1576 1625 1671 N
+ EH OW V s n/a 12 1573 1625 1675 N
+ EH OW W s n/a 12 1578 1638 1690 N
+ EH OW Y s n/a 12 1582 1638 1656 N
+ EH OW Z b n/a 12 1573 1621 1669 N
+ EH OW Z s n/a 12 1573 1621 1670 N
+ EH OW ZH s n/a 12 1573 1621 1670 N
+ EH OY AA s n/a 12 1531 1583 1684 N
+ EH OY AE s n/a 12 1531 1583 1656 N
+ EH OY AH b n/a 12 1531 1602 1656 N
+ EH OY AH s n/a 12 1531 1583 1656 N
+ EH OY AO s n/a 12 1531 1583 1684 N
+ EH OY AW s n/a 12 1531 1583 1656 N
+ EH OY AY s n/a 12 1531 1583 1684 N
+ EH OY B b n/a 12 1531 1591 1671 N
+ EH OY B s n/a 12 1531 1591 1671 N
+ EH OY CH b n/a 12 1531 1599 1651 N
+ EH OY CH s n/a 12 1531 1584 1651 N
+ EH OY D b n/a 12 1531 1619 1656 N
+ EH OY D s n/a 12 1531 1618 1656 N
+ EH OY DH b n/a 12 1531 1595 1669 N
+ EH OY DH s n/a 12 1531 1585 1670 N
+ EH OY EH b n/a 12 1531 1602 1656 N
+ EH OY EH s n/a 12 1531 1583 1656 N
+ EH OY ER b n/a 12 1533 1650 1684 N
+ EH OY ER s n/a 12 1533 1650 1684 N
+ EH OY EY s n/a 12 1531 1583 1656 N
+ EH OY F b n/a 12 1531 1583 1660 N
+ EH OY F i n/a 12 1531 1583 1660 N
+ EH OY F s n/a 12 1531 1583 1660 N
+ EH OY G b n/a 12 1531 1608 1659 N
+ EH OY G s n/a 12 1531 1608 1659 N
+ EH OY HH b n/a 12 1531 1599 1651 N
+ EH OY HH s n/a 12 1531 1583 1651 N
+ EH OY IH b n/a 12 1531 1602 1656 N
+ EH OY IH s n/a 12 1531 1583 1656 N
+ EH OY IY b n/a 12 1531 1602 1656 N
+ EH OY IY s n/a 12 1531 1583 1656 N
+ EH OY JH b n/a 12 1531 1602 1656 N
+ EH OY JH s n/a 12 1531 1584 1656 N
+ EH OY K b n/a 12 1531 1606 1657 N
+ EH OY K i n/a 12 1531 1605 1657 N
+ EH OY K s n/a 12 1531 1606 1657 N
+ EH OY L b n/a 12 1531 1638 1690 N
+ EH OY L s n/a 12 1531 1638 1690 N
+ EH OY M b n/a 12 1533 1591 1674 N
+ EH OY M s n/a 12 1533 1591 1674 N
+ EH OY N b n/a 12 1533 1615 1677 N
+ EH OY N s n/a 12 1533 1615 1677 N
+ EH OY NG b n/a 12 1533 1608 1677 N
+ EH OY NG s n/a 12 1533 1608 1677 N
+ EH OY OW s n/a 12 1531 1583 1684 N
+ EH OY OY s n/a 12 1531 1583 1684 N
+ EH OY P b n/a 12 1531 1583 1672 N
+ EH OY P s n/a 12 1531 1583 1672 N
+ EH OY R b n/a 12 1533 1650 1684 N
+ EH OY R s n/a 12 1533 1650 1684 N
+ EH OY S b n/a 12 1531 1599 1662 N
+ EH OY S s n/a 12 1531 1583 1662 N
+ EH OY SH b n/a 12 1531 1599 1665 N
+ EH OY SH s n/a 12 1531 1583 1665 N
+ EH OY SIL s n/a 12 1531 1583 1651 N
+ EH OY T b n/a 12 1531 1599 1651 N
+ EH OY T i n/a 12 1531 1584 1651 N
+ EH OY T s n/a 12 1531 1584 1651 N
+ EH OY TH b n/a 12 1531 1599 1660 N
+ EH OY TH s n/a 12 1531 1585 1660 N
+ EH OY UH s n/a 12 1531 1583 1684 N
+ EH OY UW s n/a 12 1531 1583 1684 N
+ EH OY V b n/a 12 1531 1593 1675 N
+ EH OY V i n/a 12 1531 1590 1671 N
+ EH OY V s n/a 12 1531 1593 1675 N
+ EH OY W s n/a 12 1531 1591 1690 N
+ EH OY Y s n/a 12 1531 1583 1656 N
+ EH OY Z b n/a 12 1531 1595 1669 N
+ EH OY Z s n/a 12 1531 1583 1670 N
+ EH OY ZH s n/a 12 1531 1583 1670 N
+ EH P AA i n/a 12 1552 1602 1688 N
+ EH P AA s n/a 12 1522 1602 1688 N
+ EH P AE s n/a 12 1522 1602 1654 N
+ EH P AH b n/a 12 1522 1602 1654 N
+ EH P AH i n/a 12 1544 1602 1654 N
+ EH P AH s n/a 12 1522 1602 1654 N
+ EH P AO s n/a 12 1522 1602 1688 N
+ EH P AW s n/a 12 1522 1602 1654 N
+ EH P AY s n/a 12 1522 1602 1688 N
+ EH P B b n/a 12 1522 1591 1671 N
+ EH P B i n/a 12 1544 1591 1671 N
+ EH P B s n/a 12 1522 1591 1671 N
+ EH P CH b n/a 12 1522 1599 1651 N
+ EH P CH i n/a 12 1544 1599 1651 N
+ EH P CH s n/a 12 1522 1599 1651 N
+ EH P D b n/a 12 1522 1619 1654 N
+ EH P D i n/a 12 1544 1619 1654 N
+ EH P D s n/a 12 1522 1619 1654 N
+ EH P DH b n/a 12 1522 1595 1667 N
+ EH P DH i n/a 12 1544 1602 1668 N
+ EH P DH s n/a 12 1522 1595 1667 N
+ EH P EH b n/a 12 1522 1602 1654 N
+ EH P EH s n/a 12 1522 1602 1654 N
+ EH P ER b n/a 12 1523 1649 1688 N
+ EH P ER i n/a 12 1559 1649 1688 N
+ EH P ER s n/a 12 1523 1649 1688 N
+ EH P EY s n/a 12 1522 1602 1654 N
+ EH P F b n/a 12 1522 1583 1660 N
+ EH P F i n/a 12 1544 1583 1660 N
+ EH P F s n/a 12 1522 1583 1660 N
+ EH P G b n/a 12 1522 1604 1659 N
+ EH P G i n/a 12 1544 1604 1659 N
+ EH P G s n/a 12 1522 1604 1659 N
+ EH P HH b n/a 12 1522 1599 1651 N
+ EH P HH i n/a 12 1543 1599 1651 N
+ EH P HH s n/a 12 1522 1599 1651 N
+ EH P IH b n/a 12 1522 1602 1654 N
+ EH P IH s n/a 12 1522 1602 1654 N
+ EH P IY b n/a 12 1522 1602 1654 N
+ EH P IY s n/a 12 1522 1602 1654 N
+ EH P JH b n/a 12 1522 1602 1656 N
+ EH P JH i n/a 12 1544 1602 1656 N
+ EH P JH s n/a 12 1522 1602 1656 N
+ EH P K b n/a 12 1522 1603 1657 N
+ EH P K i n/a 12 1543 1603 1657 N
+ EH P K s n/a 12 1522 1603 1657 N
+ EH P L b n/a 12 1522 1638 1690 N
+ EH P L i n/a 12 1556 1639 1689 N
+ EH P L s n/a 12 1522 1638 1690 N
+ EH P M b n/a 12 1523 1591 1673 N
+ EH P M i n/a 12 1544 1591 1673 N
+ EH P M s n/a 12 1523 1591 1673 N
+ EH P N b n/a 12 1523 1615 1677 N
+ EH P N i n/a 12 1544 1616 1681 N
+ EH P N s n/a 12 1523 1615 1677 N
+ EH P NG b n/a 12 1523 1604 1677 N
+ EH P NG i n/a 12 1544 1604 1681 N
+ EH P NG s n/a 12 1523 1604 1677 N
+ EH P OW s n/a 12 1522 1602 1688 N
+ EH P OY s n/a 12 1522 1602 1688 N
+ EH P P b n/a 12 1522 1583 1672 N
+ EH P P i n/a 12 1544 1583 1672 N
+ EH P P s n/a 12 1522 1583 1672 N
+ EH P R b n/a 12 1523 1649 1688 N
+ EH P R i n/a 12 1560 1649 1688 N
+ EH P R s n/a 12 1523 1649 1688 N
+ EH P S b n/a 12 1522 1599 1662 N
+ EH P S i n/a 12 1544 1599 1662 N
+ EH P S s n/a 12 1522 1599 1662 N
+ EH P SH b n/a 12 1522 1597 1665 N
+ EH P SH i n/a 12 1543 1597 1665 N
+ EH P SH s n/a 12 1522 1597 1665 N
+ EH P SIL s n/a 12 1522 1599 1651 N
+ EH P T b n/a 12 1522 1599 1651 N
+ EH P T i n/a 12 1544 1599 1651 N
+ EH P T s n/a 12 1522 1599 1651 N
+ EH P TH b n/a 12 1522 1599 1660 N
+ EH P TH i n/a 12 1543 1599 1660 N
+ EH P TH s n/a 12 1522 1599 1660 N
+ EH P UH s n/a 12 1522 1602 1688 N
+ EH P UW s n/a 12 1522 1602 1688 N
+ EH P V b n/a 12 1522 1593 1675 N
+ EH P V i n/a 12 1544 1590 1671 N
+ EH P V s n/a 12 1522 1593 1675 N
+ EH P W i n/a 12 1556 1591 1689 N
+ EH P W s n/a 12 1522 1591 1690 N
+ EH P Y s n/a 12 1522 1602 1654 N
+ EH P Z b n/a 12 1521 1595 1669 N
+ EH P Z i n/a 12 1544 1602 1670 N
+ EH P Z s n/a 12 1521 1595 1670 N
+ EH P ZH s n/a 12 1521 1595 1670 N
+ EH R AA e n/a 12 1572 1630 1684 N
+ EH R AA s n/a 12 1572 1630 1684 N
+ EH R AE e n/a 12 1572 1630 1656 N
+ EH R AE s n/a 12 1572 1630 1656 N
+ EH R AH b n/a 12 1572 1630 1656 N
+ EH R AH e n/a 12 1572 1630 1656 N
+ EH R AH s n/a 12 1572 1630 1656 N
+ EH R AO e n/a 12 1572 1630 1684 N
+ EH R AO s n/a 12 1572 1630 1684 N
+ EH R AW e n/a 12 1572 1630 1656 N
+ EH R AW s n/a 12 1572 1630 1656 N
+ EH R AY e n/a 12 1572 1630 1684 N
+ EH R AY s n/a 12 1572 1630 1684 N
+ EH R B b n/a 12 1572 1633 1671 N
+ EH R B e n/a 12 1572 1633 1671 N
+ EH R B i n/a 12 1562 1633 1671 N
+ EH R B s n/a 12 1572 1633 1671 N
+ EH R CH b n/a 12 1572 1636 1653 N
+ EH R CH e n/a 12 1572 1636 1653 N
+ EH R CH i n/a 12 1561 1636 1653 N
+ EH R CH s n/a 12 1572 1636 1653 N
+ EH R D b n/a 12 1572 1630 1656 N
+ EH R D e n/a 12 1572 1630 1656 N
+ EH R D i n/a 12 1565 1630 1656 N
+ EH R D s n/a 12 1572 1630 1656 N
+ EH R DH b n/a 12 1572 1634 1669 N
+ EH R DH e n/a 12 1572 1634 1670 N
+ EH R DH i n/a 12 1564 1634 1670 N
+ EH R DH s n/a 12 1572 1634 1670 N
+ EH R EH b n/a 12 1572 1630 1656 N
+ EH R EH e n/a 12 1572 1630 1656 N
+ EH R EH s n/a 12 1572 1630 1656 N
+ EH R ER b n/a 12 1572 1646 1684 N
+ EH R ER e n/a 12 1572 1646 1684 N
+ EH R ER s n/a 12 1572 1646 1684 N
+ EH R EY e n/a 12 1572 1630 1656 N
+ EH R EY i n/a 12 1561 1630 1656 N
+ EH R EY s n/a 12 1572 1630 1656 N
+ EH R F b n/a 12 1572 1636 1660 N
+ EH R F e n/a 12 1572 1636 1660 N
+ EH R F i n/a 12 1562 1637 1660 N
+ EH R F s n/a 12 1572 1636 1660 N
+ EH R G b n/a 12 1572 1631 1659 N
+ EH R G e n/a 12 1572 1631 1659 N
+ EH R G i n/a 12 1561 1629 1659 N
+ EH R G s n/a 12 1572 1631 1659 N
+ EH R HH b n/a 12 1572 1636 1653 N
+ EH R HH e n/a 12 1572 1636 1653 N
+ EH R HH i n/a 12 1561 1636 1653 N
+ EH R HH s n/a 12 1572 1636 1653 N
+ EH R IH b n/a 12 1572 1630 1656 N
+ EH R IH e n/a 12 1572 1630 1656 N
+ EH R IH s n/a 12 1572 1630 1656 N
+ EH R IY b n/a 12 1572 1630 1656 N
+ EH R IY e n/a 12 1572 1630 1656 N
+ EH R IY s n/a 12 1572 1630 1656 N
+ EH R JH b n/a 12 1572 1630 1656 N
+ EH R JH e n/a 12 1572 1630 1656 N
+ EH R JH i n/a 12 1561 1629 1656 N
+ EH R JH s n/a 12 1572 1630 1656 N
+ EH R K b n/a 12 1572 1636 1658 N
+ EH R K e n/a 12 1572 1636 1658 N
+ EH R K i n/a 12 1561 1636 1658 N
+ EH R K s n/a 12 1572 1636 1658 N
+ EH R L b n/a 12 1572 1643 1692 N
+ EH R L e n/a 12 1572 1643 1692 N
+ EH R L i n/a 12 1562 1643 1692 N
+ EH R L s n/a 12 1572 1643 1692 N
+ EH R M b n/a 12 1572 1633 1673 N
+ EH R M e n/a 12 1572 1633 1673 N
+ EH R M i n/a 12 1562 1633 1673 N
+ EH R M s n/a 12 1572 1633 1673 N
+ EH R N b n/a 12 1572 1631 1677 N
+ EH R N e n/a 12 1572 1631 1677 N
+ EH R N i n/a 12 1565 1632 1676 N
+ EH R N s n/a 12 1572 1631 1677 N
+ EH R NG b n/a 12 1572 1631 1677 N
+ EH R NG e n/a 12 1572 1631 1677 N
+ EH R NG i n/a 12 1561 1629 1677 N
+ EH R NG s n/a 12 1572 1631 1677 N
+ EH R OW e n/a 12 1572 1630 1684 N
+ EH R OW s n/a 12 1572 1630 1684 N
+ EH R OY e n/a 12 1572 1630 1684 N
+ EH R OY s n/a 12 1572 1630 1684 N
+ EH R P b n/a 12 1572 1637 1672 N
+ EH R P e n/a 12 1572 1637 1672 N
+ EH R P i n/a 12 1562 1637 1672 N
+ EH R P s n/a 12 1572 1637 1672 N
+ EH R R b n/a 12 1572 1646 1684 N
+ EH R R e n/a 12 1572 1646 1684 N
+ EH R R i n/a 12 1563 1646 1684 N
+ EH R R s n/a 12 1572 1646 1684 N
+ EH R S b n/a 12 1572 1635 1664 N
+ EH R S e n/a 12 1572 1635 1664 N
+ EH R S i n/a 12 1564 1635 1664 N
+ EH R S s n/a 12 1572 1635 1664 N
+ EH R SH b n/a 12 1572 1636 1665 N
+ EH R SH e n/a 12 1572 1636 1665 N
+ EH R SH i n/a 12 1561 1636 1665 N
+ EH R SH s n/a 12 1572 1636 1665 N
+ EH R SIL e n/a 12 1572 1636 1653 N
+ EH R SIL s n/a 12 1572 1636 1653 N
+ EH R T b n/a 12 1572 1635 1653 N
+ EH R T e n/a 12 1572 1635 1653 N
+ EH R T i n/a 12 1564 1635 1653 N
+ EH R T s n/a 12 1572 1635 1653 N
+ EH R TH b n/a 12 1572 1635 1661 N
+ EH R TH e n/a 12 1572 1635 1661 N
+ EH R TH i n/a 12 1564 1635 1661 N
+ EH R TH s n/a 12 1572 1635 1661 N
+ EH R UH e n/a 12 1572 1630 1684 N
+ EH R UH s n/a 12 1572 1630 1684 N
+ EH R UW e n/a 12 1572 1630 1684 N
+ EH R UW s n/a 12 1572 1630 1684 N
+ EH R V b n/a 12 1572 1633 1675 N
+ EH R V e n/a 12 1572 1633 1675 N
+ EH R V i n/a 12 1562 1633 1671 N
+ EH R V s n/a 12 1572 1633 1675 N
+ EH R W e n/a 12 1572 1643 1692 N
+ EH R W i n/a 12 1562 1643 1692 N
+ EH R W s n/a 12 1572 1643 1692 N
+ EH R Y e n/a 12 1572 1643 1656 N
+ EH R Y s n/a 12 1572 1643 1656 N
+ EH R Z b n/a 12 1572 1634 1669 N
+ EH R Z e n/a 12 1572 1634 1670 N
+ EH R Z i n/a 12 1564 1634 1670 N
+ EH R Z s n/a 12 1572 1634 1670 N
+ EH R ZH e n/a 12 1572 1630 1670 N
+ EH R ZH i n/a 12 1561 1630 1666 N
+ EH R ZH s n/a 12 1572 1630 1670 N
+ EH S AA e n/a 12 1552 1601 1683 N
+ EH S AA s n/a 12 1552 1601 1683 N
+ EH S AE e n/a 12 1552 1601 1655 N
+ EH S AE s n/a 12 1552 1601 1655 N
+ EH S AH b n/a 12 1552 1601 1655 N
+ EH S AH e n/a 12 1552 1601 1655 N
+ EH S AH s n/a 12 1552 1601 1655 N
+ EH S AO e n/a 12 1552 1601 1683 N
+ EH S AO s n/a 12 1552 1601 1683 N
+ EH S AW e n/a 12 1552 1601 1655 N
+ EH S AW s n/a 12 1552 1601 1655 N
+ EH S AY e n/a 12 1552 1601 1683 N
+ EH S AY s n/a 12 1552 1601 1683 N
+ EH S B b n/a 12 1546 1594 1671 N
+ EH S B e n/a 12 1546 1594 1671 N
+ EH S B i n/a 12 1546 1594 1671 N
+ EH S B s n/a 12 1546 1594 1671 N
+ EH S CH b n/a 12 1545 1597 1652 N
+ EH S CH e n/a 12 1545 1597 1652 N
+ EH S CH i n/a 12 1547 1597 1652 N
+ EH S CH s n/a 12 1545 1597 1652 N
+ EH S D b n/a 12 1546 1617 1655 N
+ EH S D e n/a 12 1546 1617 1655 N
+ EH S D i n/a 12 1546 1617 1655 N
+ EH S D s n/a 12 1546 1617 1655 N
+ EH S DH b n/a 12 1545 1595 1668 N
+ EH S DH e n/a 12 1545 1595 1668 N
+ EH S DH i n/a 12 1547 1601 1668 N
+ EH S DH s n/a 12 1545 1595 1668 N
+ EH S EH b n/a 12 1552 1601 1655 N
+ EH S EH e n/a 12 1552 1601 1655 N
+ EH S EH s n/a 12 1552 1601 1655 N
+ EH S ER b n/a 12 1557 1644 1683 N
+ EH S ER e n/a 12 1557 1644 1683 N
+ EH S ER i n/a 12 1557 1644 1683 N
+ EH S ER s n/a 12 1557 1644 1683 N
+ EH S EY e n/a 12 1552 1601 1655 N
+ EH S EY s n/a 12 1552 1601 1655 N
+ EH S F b n/a 12 1545 1594 1660 N
+ EH S F e n/a 12 1545 1594 1660 N
+ EH S F i n/a 12 1547 1594 1660 N
+ EH S F s n/a 12 1545 1594 1660 N
+ EH S G b n/a 12 1546 1604 1659 N
+ EH S G e n/a 12 1546 1604 1659 N
+ EH S G i n/a 12 1546 1603 1659 N
+ EH S G s n/a 12 1546 1604 1659 N
+ EH S HH b n/a 12 1545 1596 1652 N
+ EH S HH e n/a 12 1545 1596 1652 N
+ EH S HH i n/a 12 1547 1596 1652 N
+ EH S HH s n/a 12 1545 1596 1652 N
+ EH S IH b n/a 12 1552 1601 1655 N
+ EH S IH e n/a 12 1552 1601 1655 N
+ EH S IH s n/a 12 1552 1601 1655 N
+ EH S IY b n/a 12 1552 1601 1655 N
+ EH S IY e n/a 12 1552 1601 1655 N
+ EH S IY s n/a 12 1552 1601 1655 N
+ EH S JH b n/a 12 1545 1602 1655 N
+ EH S JH e n/a 12 1545 1602 1655 N
+ EH S JH i n/a 12 1547 1602 1655 N
+ EH S JH s n/a 12 1545 1602 1655 N
+ EH S K b n/a 12 1545 1604 1657 N
+ EH S K e n/a 12 1545 1604 1657 N
+ EH S K i n/a 12 1547 1603 1657 N
+ EH S K s n/a 12 1545 1604 1657 N
+ EH S L b n/a 12 1550 1641 1691 N
+ EH S L e n/a 12 1550 1641 1691 N
+ EH S L i n/a 12 1549 1641 1691 N
+ EH S L s n/a 12 1550 1641 1691 N
+ EH S M b n/a 12 1545 1594 1673 N
+ EH S M e n/a 12 1545 1594 1673 N
+ EH S M i n/a 12 1548 1594 1673 N
+ EH S M s n/a 12 1545 1594 1673 N
+ EH S N b n/a 12 1545 1615 1677 N
+ EH S N e n/a 12 1545 1615 1677 N
+ EH S N i n/a 12 1548 1613 1680 N
+ EH S N s n/a 12 1545 1615 1677 N
+ EH S NG b n/a 12 1545 1604 1677 N
+ EH S NG e n/a 12 1545 1604 1677 N
+ EH S NG i n/a 12 1548 1603 1680 N
+ EH S NG s n/a 12 1545 1604 1677 N
+ EH S OW e n/a 12 1552 1601 1683 N
+ EH S OW s n/a 12 1552 1601 1683 N
+ EH S OY e n/a 12 1552 1601 1683 N
+ EH S OY s n/a 12 1552 1601 1683 N
+ EH S P b n/a 12 1545 1594 1672 N
+ EH S P e n/a 12 1545 1594 1672 N
+ EH S P i n/a 12 1547 1594 1672 N
+ EH S P s n/a 12 1545 1594 1672 N
+ EH S R b n/a 12 1557 1644 1683 N
+ EH S R e n/a 12 1557 1644 1683 N
+ EH S R i n/a 12 1557 1644 1683 N
+ EH S R s n/a 12 1557 1644 1683 N
+ EH S S b n/a 12 1545 1596 1662 N
+ EH S S e n/a 12 1545 1596 1662 N
+ EH S S i n/a 12 1547 1596 1662 N
+ EH S S s n/a 12 1545 1596 1662 N
+ EH S SH b n/a 12 1545 1597 1665 N
+ EH S SH e n/a 12 1545 1597 1665 N
+ EH S SH i n/a 12 1547 1597 1665 N
+ EH S SH s n/a 12 1545 1597 1665 N
+ EH S SIL e n/a 12 1545 1596 1652 N
+ EH S SIL s n/a 12 1545 1596 1652 N
+ EH S T b n/a 12 1545 1596 1652 N
+ EH S T e n/a 12 1545 1596 1652 N
+ EH S T i n/a 12 1547 1596 1652 N
+ EH S T s n/a 12 1545 1596 1652 N
+ EH S TH b n/a 12 1545 1596 1660 N
+ EH S TH e n/a 12 1545 1596 1660 N
+ EH S TH i n/a 12 1547 1596 1660 N
+ EH S TH s n/a 12 1545 1596 1660 N
+ EH S UH e n/a 12 1552 1601 1683 N
+ EH S UH s n/a 12 1552 1601 1683 N
+ EH S UW e n/a 12 1552 1601 1683 N
+ EH S UW s n/a 12 1552 1601 1683 N
+ EH S V b n/a 12 1545 1594 1675 N
+ EH S V e n/a 12 1545 1594 1675 N
+ EH S V i n/a 12 1547 1594 1671 N
+ EH S V s n/a 12 1545 1594 1675 N
+ EH S W e n/a 12 1545 1594 1691 N
+ EH S W i n/a 12 1547 1594 1691 N
+ EH S W s n/a 12 1545 1594 1691 N
+ EH S Y e n/a 12 1556 1602 1655 N
+ EH S Y i n/a 12 1556 1602 1655 N
+ EH S Y s n/a 12 1556 1602 1655 N
+ EH S Z b n/a 12 1545 1595 1669 N
+ EH S Z e n/a 12 1545 1595 1670 N
+ EH S Z i n/a 12 1546 1601 1667 N
+ EH S Z s n/a 12 1545 1595 1670 N
+ EH S ZH e n/a 12 1545 1595 1670 N
+ EH S ZH s n/a 12 1545 1595 1670 N
+ EH SH AA e n/a 12 1552 1601 1685 N
+ EH SH AA s n/a 12 1552 1601 1685 N
+ EH SH AE e n/a 12 1552 1601 1655 N
+ EH SH AE s n/a 12 1552 1601 1655 N
+ EH SH AH b n/a 12 1552 1601 1655 N
+ EH SH AH e n/a 12 1552 1601 1655 N
+ EH SH AH s n/a 12 1552 1601 1655 N
+ EH SH AO e n/a 12 1552 1601 1685 N
+ EH SH AO s n/a 12 1552 1601 1685 N
+ EH SH AW e n/a 12 1552 1601 1655 N
+ EH SH AW s n/a 12 1552 1601 1655 N
+ EH SH AY e n/a 12 1552 1601 1685 N
+ EH SH AY s n/a 12 1552 1601 1685 N
+ EH SH B b n/a 12 1546 1594 1671 N
+ EH SH B e n/a 12 1546 1594 1671 N
+ EH SH B i n/a 12 1546 1594 1671 N
+ EH SH B s n/a 12 1546 1594 1671 N
+ EH SH CH b n/a 12 1545 1597 1651 N
+ EH SH CH e n/a 12 1545 1597 1651 N
+ EH SH CH i n/a 12 1547 1597 1651 N
+ EH SH CH s n/a 12 1545 1597 1651 N
+ EH SH D b n/a 12 1546 1619 1655 N
+ EH SH D e n/a 12 1546 1619 1655 N
+ EH SH D i n/a 12 1546 1619 1655 N
+ EH SH D s n/a 12 1546 1619 1655 N
+ EH SH DH b n/a 12 1545 1595 1668 N
+ EH SH DH e n/a 12 1545 1595 1668 N
+ EH SH DH s n/a 12 1545 1595 1668 N
+ EH SH EH b n/a 12 1552 1601 1655 N
+ EH SH EH e n/a 12 1552 1601 1655 N
+ EH SH EH s n/a 12 1552 1601 1655 N
+ EH SH ER b n/a 12 1558 1645 1685 N
+ EH SH ER e n/a 12 1558 1645 1685 N
+ EH SH ER s n/a 12 1558 1645 1685 N
+ EH SH EY e n/a 12 1552 1601 1655 N
+ EH SH EY s n/a 12 1552 1601 1655 N
+ EH SH F b n/a 12 1545 1594 1660 N
+ EH SH F e n/a 12 1545 1594 1660 N
+ EH SH F i n/a 12 1547 1594 1660 N
+ EH SH F s n/a 12 1545 1594 1660 N
+ EH SH G b n/a 12 1546 1608 1659 N
+ EH SH G e n/a 12 1546 1608 1659 N
+ EH SH G i n/a 12 1546 1604 1659 N
+ EH SH G s n/a 12 1546 1608 1659 N
+ EH SH HH b n/a 12 1545 1596 1651 N
+ EH SH HH e n/a 12 1545 1596 1651 N
+ EH SH HH i n/a 12 1547 1596 1651 N
+ EH SH HH s n/a 12 1545 1596 1651 N
+ EH SH IH b n/a 12 1552 1601 1655 N
+ EH SH IH e n/a 12 1552 1601 1655 N
+ EH SH IH s n/a 12 1552 1601 1655 N
+ EH SH IY b n/a 12 1552 1601 1655 N
+ EH SH IY e n/a 12 1552 1601 1655 N
+ EH SH IY s n/a 12 1552 1601 1655 N
+ EH SH JH b n/a 12 1545 1602 1655 N
+ EH SH JH e n/a 12 1545 1602 1655 N
+ EH SH JH s n/a 12 1545 1602 1655 N
+ EH SH K b n/a 12 1545 1606 1657 N
+ EH SH K e n/a 12 1545 1606 1657 N
+ EH SH K i n/a 12 1547 1604 1657 N
+ EH SH K s n/a 12 1545 1606 1657 N
+ EH SH L b n/a 12 1550 1642 1691 N
+ EH SH L e n/a 12 1550 1642 1691 N
+ EH SH L i n/a 12 1550 1642 1691 N
+ EH SH L s n/a 12 1550 1642 1691 N
+ EH SH M b n/a 12 1545 1594 1673 N
+ EH SH M e n/a 12 1545 1594 1673 N
+ EH SH M i n/a 12 1548 1594 1673 N
+ EH SH M s n/a 12 1545 1594 1673 N
+ EH SH N b n/a 12 1545 1615 1677 N
+ EH SH N e n/a 12 1545 1615 1677 N
+ EH SH N i n/a 12 1548 1612 1681 N
+ EH SH N s n/a 12 1545 1615 1677 N
+ EH SH NG b n/a 12 1545 1608 1677 N
+ EH SH NG e n/a 12 1545 1608 1677 N
+ EH SH NG i n/a 12 1548 1604 1681 N
+ EH SH NG s n/a 12 1545 1608 1677 N
+ EH SH OW e n/a 12 1552 1601 1685 N
+ EH SH OW s n/a 12 1552 1601 1685 N
+ EH SH OY e n/a 12 1552 1601 1685 N
+ EH SH OY s n/a 12 1552 1601 1685 N
+ EH SH P b n/a 12 1545 1594 1672 N
+ EH SH P e n/a 12 1545 1594 1672 N
+ EH SH P i n/a 12 1547 1594 1672 N
+ EH SH P s n/a 12 1545 1594 1672 N
+ EH SH R b n/a 12 1558 1645 1685 N
+ EH SH R e n/a 12 1558 1645 1685 N
+ EH SH R i n/a 12 1558 1645 1685 N
+ EH SH R s n/a 12 1558 1645 1685 N
+ EH SH S b n/a 12 1545 1596 1662 N
+ EH SH S e n/a 12 1545 1596 1662 N
+ EH SH S i n/a 12 1547 1596 1662 N
+ EH SH S s n/a 12 1545 1596 1662 N
+ EH SH SH b n/a 12 1545 1597 1665 N
+ EH SH SH e n/a 12 1545 1597 1665 N
+ EH SH SH i n/a 12 1547 1597 1665 N
+ EH SH SH s n/a 12 1545 1597 1665 N
+ EH SH SIL e n/a 12 1545 1596 1651 N
+ EH SH SIL s n/a 12 1545 1596 1651 N
+ EH SH T b n/a 12 1545 1596 1651 N
+ EH SH T e n/a 12 1545 1596 1651 N
+ EH SH T i n/a 12 1547 1596 1651 N
+ EH SH T s n/a 12 1545 1596 1651 N
+ EH SH TH b n/a 12 1545 1596 1660 N
+ EH SH TH e n/a 12 1545 1596 1660 N
+ EH SH TH i n/a 12 1547 1596 1660 N
+ EH SH TH s n/a 12 1545 1596 1660 N
+ EH SH UH e n/a 12 1552 1601 1685 N
+ EH SH UH s n/a 12 1552 1601 1685 N
+ EH SH UW e n/a 12 1552 1601 1685 N
+ EH SH UW s n/a 12 1552 1601 1685 N
+ EH SH V b n/a 12 1545 1594 1675 N
+ EH SH V e n/a 12 1545 1594 1675 N
+ EH SH V i n/a 12 1547 1594 1671 N
+ EH SH V s n/a 12 1545 1594 1675 N
+ EH SH W e n/a 12 1545 1594 1691 N
+ EH SH W i n/a 12 1547 1594 1691 N
+ EH SH W s n/a 12 1545 1594 1691 N
+ EH SH Y e n/a 12 1556 1602 1655 N
+ EH SH Y s n/a 12 1556 1602 1655 N
+ EH SH Z b n/a 12 1545 1595 1669 N
+ EH SH Z e n/a 12 1545 1595 1670 N
+ EH SH Z i n/a 12 1546 1601 1667 N
+ EH SH Z s n/a 12 1545 1595 1670 N
+ EH SH ZH e n/a 12 1545 1595 1670 N
+ EH SH ZH s n/a 12 1545 1595 1670 N
+ EH SIL AA s n/a 12 1525 1602 1686 N
+ EH SIL AE s n/a 12 1525 1602 1654 N
+ EH SIL AH b n/a 12 1525 1602 1654 N
+ EH SIL AH s n/a 12 1525 1602 1654 N
+ EH SIL AO s n/a 12 1525 1602 1686 N
+ EH SIL AW s n/a 12 1525 1602 1654 N
+ EH SIL AY s n/a 12 1525 1602 1686 N
+ EH SIL B b n/a 12 1525 1591 1671 N
+ EH SIL B s n/a 12 1525 1591 1671 N
+ EH SIL CH b n/a 12 1527 1599 1651 N
+ EH SIL CH s n/a 12 1527 1599 1651 N
+ EH SIL D b n/a 12 1525 1619 1654 N
+ EH SIL D s n/a 12 1525 1619 1654 N
+ EH SIL DH b n/a 12 1527 1595 1667 N
+ EH SIL DH s n/a 12 1527 1595 1667 N
+ EH SIL EH b n/a 12 1525 1602 1654 N
+ EH SIL EH s n/a 12 1525 1602 1654 N
+ EH SIL ER b n/a 12 1525 1645 1686 N
+ EH SIL ER s n/a 12 1525 1645 1686 N
+ EH SIL EY s n/a 12 1525 1602 1654 N
+ EH SIL F b n/a 12 1527 1583 1660 N
+ EH SIL F s n/a 12 1527 1583 1660 N
+ EH SIL G b n/a 12 1525 1608 1659 N
+ EH SIL G s n/a 12 1525 1608 1659 N
+ EH SIL HH b n/a 12 1527 1599 1651 N
+ EH SIL HH s n/a 12 1527 1599 1651 N
+ EH SIL IH b n/a 12 1525 1602 1654 N
+ EH SIL IH s n/a 12 1525 1602 1654 N
+ EH SIL IY b n/a 12 1525 1602 1654 N
+ EH SIL IY s n/a 12 1525 1602 1654 N
+ EH SIL JH b n/a 12 1525 1602 1656 N
+ EH SIL JH s n/a 12 1525 1602 1656 N
+ EH SIL K b n/a 12 1527 1606 1657 N
+ EH SIL K s n/a 12 1527 1606 1657 N
+ EH SIL L b n/a 12 1527 1638 1690 N
+ EH SIL L s n/a 12 1527 1638 1690 N
+ EH SIL M b n/a 12 1525 1591 1673 N
+ EH SIL M s n/a 12 1525 1591 1673 N
+ EH SIL N b n/a 12 1525 1615 1677 N
+ EH SIL N s n/a 12 1525 1615 1677 N
+ EH SIL NG b n/a 12 1525 1608 1677 N
+ EH SIL NG s n/a 12 1525 1608 1677 N
+ EH SIL OW s n/a 12 1525 1602 1686 N
+ EH SIL OY s n/a 12 1525 1602 1686 N
+ EH SIL P b n/a 12 1527 1583 1672 N
+ EH SIL P s n/a 12 1527 1583 1672 N
+ EH SIL R b n/a 12 1525 1645 1686 N
+ EH SIL R s n/a 12 1525 1645 1686 N
+ EH SIL S b n/a 12 1527 1599 1662 N
+ EH SIL S s n/a 12 1527 1599 1662 N
+ EH SIL SH b n/a 12 1527 1597 1665 N
+ EH SIL SH s n/a 12 1527 1597 1665 N
+ EH SIL SIL s n/a 12 1527 1599 1651 N
+ EH SIL T b n/a 12 1527 1599 1651 N
+ EH SIL T s n/a 12 1527 1599 1651 N
+ EH SIL TH b n/a 12 1527 1599 1660 N
+ EH SIL TH s n/a 12 1527 1599 1660 N
+ EH SIL UH s n/a 12 1525 1602 1686 N
+ EH SIL UW s n/a 12 1525 1602 1686 N
+ EH SIL V b n/a 12 1527 1593 1675 N
+ EH SIL V s n/a 12 1527 1593 1675 N
+ EH SIL W s n/a 12 1525 1591 1690 N
+ EH SIL Y s n/a 12 1525 1602 1654 N
+ EH SIL Z b n/a 12 1526 1595 1669 N
+ EH SIL Z s n/a 12 1526 1595 1670 N
+ EH SIL ZH s n/a 12 1527 1595 1670 N
+ EH T AA e n/a 12 1522 1602 1688 N
+ EH T AA s n/a 12 1522 1602 1688 N
+ EH T AE e n/a 12 1522 1602 1654 N
+ EH T AE s n/a 12 1522 1602 1654 N
+ EH T AH b n/a 12 1522 1602 1654 N
+ EH T AH e n/a 12 1522 1602 1654 N
+ EH T AH i n/a 12 1552 1602 1654 N
+ EH T AH s n/a 12 1522 1602 1654 N
+ EH T AO e n/a 12 1522 1602 1688 N
+ EH T AO s n/a 12 1522 1602 1688 N
+ EH T AW e n/a 12 1522 1602 1654 N
+ EH T AW s n/a 12 1522 1602 1654 N
+ EH T AY e n/a 12 1522 1602 1688 N
+ EH T AY s n/a 12 1522 1602 1688 N
+ EH T B b n/a 12 1522 1591 1671 N
+ EH T B e n/a 12 1522 1591 1671 N
+ EH T B i n/a 12 1551 1591 1671 N
+ EH T B s n/a 12 1522 1591 1671 N
+ EH T CH b n/a 12 1522 1599 1652 N
+ EH T CH e n/a 12 1522 1599 1652 N
+ EH T CH i n/a 12 1552 1599 1652 N
+ EH T CH s n/a 12 1522 1599 1652 N
+ EH T D b n/a 12 1522 1619 1654 N
+ EH T D e n/a 12 1522 1619 1654 N
+ EH T D i n/a 12 1552 1619 1654 N
+ EH T D s n/a 12 1522 1619 1654 N
+ EH T DH b n/a 12 1522 1595 1667 N
+ EH T DH e n/a 12 1522 1595 1667 N
+ EH T DH i n/a 12 1552 1602 1668 N
+ EH T DH s n/a 12 1522 1595 1667 N
+ EH T EH b n/a 12 1522 1602 1654 N
+ EH T EH e n/a 12 1522 1602 1654 N
+ EH T EH s n/a 12 1522 1602 1654 N
+ EH T ER b n/a 12 1523 1649 1688 N
+ EH T ER e n/a 12 1523 1649 1688 N
+ EH T ER i n/a 12 1559 1649 1688 N
+ EH T ER s n/a 12 1523 1649 1688 N
+ EH T EY e n/a 12 1522 1602 1654 N
+ EH T EY s n/a 12 1522 1602 1654 N
+ EH T F b n/a 12 1522 1587 1660 N
+ EH T F e n/a 12 1522 1587 1660 N
+ EH T F i n/a 12 1552 1587 1660 N
+ EH T F s n/a 12 1522 1587 1660 N
+ EH T G b n/a 12 1522 1608 1659 N
+ EH T G e n/a 12 1522 1608 1659 N
+ EH T G i n/a 12 1553 1604 1659 N
+ EH T G s n/a 12 1522 1608 1659 N
+ EH T HH b n/a 12 1522 1599 1652 N
+ EH T HH e n/a 12 1522 1599 1652 N
+ EH T HH i n/a 12 1552 1599 1652 N
+ EH T HH s n/a 12 1522 1599 1652 N
+ EH T IH b n/a 12 1522 1602 1654 N
+ EH T IH e n/a 12 1522 1602 1654 N
+ EH T IH s n/a 12 1522 1602 1654 N
+ EH T IY b n/a 12 1522 1602 1654 N
+ EH T IY e n/a 12 1522 1602 1654 N
+ EH T IY i n/a 12 1552 1602 1654 N
+ EH T IY s n/a 12 1522 1602 1654 N
+ EH T JH b n/a 12 1522 1602 1656 N
+ EH T JH e n/a 12 1522 1602 1656 N
+ EH T JH i n/a 12 1552 1602 1656 N
+ EH T JH s n/a 12 1522 1602 1656 N
+ EH T K b n/a 12 1522 1606 1657 N
+ EH T K e n/a 12 1522 1606 1657 N
+ EH T K i n/a 12 1553 1604 1657 N
+ EH T K s n/a 12 1522 1606 1657 N
+ EH T L b n/a 12 1522 1638 1690 N
+ EH T L e n/a 12 1522 1638 1690 N
+ EH T L i n/a 12 1556 1639 1689 N
+ EH T L s n/a 12 1522 1638 1690 N
+ EH T M b n/a 12 1523 1591 1673 N
+ EH T M e n/a 12 1523 1591 1673 N
+ EH T M i n/a 12 1554 1591 1673 N
+ EH T M s n/a 12 1523 1591 1673 N
+ EH T N b n/a 12 1523 1615 1677 N
+ EH T N e n/a 12 1523 1615 1677 N
+ EH T N i n/a 12 1554 1616 1681 N
+ EH T N s n/a 12 1523 1615 1677 N
+ EH T NG b n/a 12 1523 1608 1677 N
+ EH T NG e n/a 12 1523 1608 1677 N
+ EH T NG i n/a 12 1554 1604 1681 N
+ EH T NG s n/a 12 1523 1608 1677 N
+ EH T OW e n/a 12 1522 1602 1688 N
+ EH T OW s n/a 12 1522 1602 1688 N
+ EH T OY e n/a 12 1522 1602 1688 N
+ EH T OY s n/a 12 1522 1602 1688 N
+ EH T P b n/a 12 1522 1587 1672 N
+ EH T P e n/a 12 1522 1587 1672 N
+ EH T P i n/a 12 1552 1587 1672 N
+ EH T P s n/a 12 1522 1587 1672 N
+ EH T R b n/a 12 1523 1649 1688 N
+ EH T R e n/a 12 1523 1649 1688 N
+ EH T R i n/a 12 1559 1649 1688 N
+ EH T R s n/a 12 1523 1649 1688 N
+ EH T S b n/a 12 1522 1599 1662 N
+ EH T S e n/a 12 1522 1599 1662 N
+ EH T S i n/a 12 1553 1599 1662 N
+ EH T S s n/a 12 1522 1599 1662 N
+ EH T SH b n/a 12 1522 1597 1665 N
+ EH T SH e n/a 12 1522 1597 1665 N
+ EH T SH i n/a 12 1552 1597 1665 N
+ EH T SH s n/a 12 1522 1597 1665 N
+ EH T SIL e n/a 12 1522 1599 1652 N
+ EH T SIL s n/a 12 1522 1599 1652 N
+ EH T T b n/a 12 1522 1599 1652 N
+ EH T T e n/a 12 1522 1599 1652 N
+ EH T T i n/a 12 1552 1599 1652 N
+ EH T T s n/a 12 1522 1599 1652 N
+ EH T TH b n/a 12 1522 1599 1660 N
+ EH T TH e n/a 12 1522 1599 1660 N
+ EH T TH i n/a 12 1552 1599 1660 N
+ EH T TH s n/a 12 1522 1599 1660 N
+ EH T UH e n/a 12 1522 1602 1688 N
+ EH T UH s n/a 12 1522 1602 1688 N
+ EH T UW e n/a 12 1522 1602 1688 N
+ EH T UW s n/a 12 1522 1602 1688 N
+ EH T V b n/a 12 1522 1593 1675 N
+ EH T V e n/a 12 1522 1593 1675 N
+ EH T V i n/a 12 1552 1589 1675 N
+ EH T V s n/a 12 1522 1593 1675 N
+ EH T W e n/a 12 1522 1591 1690 N
+ EH T W i n/a 12 1556 1591 1689 N
+ EH T W s n/a 12 1522 1591 1690 N
+ EH T Y e n/a 12 1522 1602 1654 N
+ EH T Y s n/a 12 1522 1602 1654 N
+ EH T Z b n/a 12 1521 1595 1669 N
+ EH T Z e n/a 12 1521 1595 1670 N
+ EH T Z i n/a 12 1553 1602 1670 N
+ EH T Z s n/a 12 1521 1595 1670 N
+ EH T ZH e n/a 12 1521 1595 1670 N
+ EH T ZH i n/a 12 1552 1602 1670 N
+ EH T ZH s n/a 12 1521 1595 1670 N
+ EH TH AA s n/a 12 1552 1602 1683 N
+ EH TH AE s n/a 12 1552 1602 1654 N
+ EH TH AH b n/a 12 1552 1602 1654 N
+ EH TH AH s n/a 12 1552 1602 1654 N
+ EH TH AO s n/a 12 1552 1602 1683 N
+ EH TH AW s n/a 12 1552 1602 1654 N
+ EH TH AY s n/a 12 1552 1602 1683 N
+ EH TH B b n/a 12 1545 1587 1671 N
+ EH TH B i n/a 12 1542 1587 1671 N
+ EH TH B s n/a 12 1545 1587 1671 N
+ EH TH CH b n/a 12 1545 1597 1652 N
+ EH TH CH s n/a 12 1545 1597 1652 N
+ EH TH D b n/a 12 1545 1617 1654 N
+ EH TH D i n/a 12 1542 1617 1654 N
+ EH TH D s n/a 12 1545 1617 1654 N
+ EH TH DH b n/a 12 1545 1595 1668 N
+ EH TH DH s n/a 12 1545 1595 1668 N
+ EH TH EH b n/a 12 1552 1602 1654 N
+ EH TH EH s n/a 12 1552 1602 1654 N
+ EH TH ER b n/a 12 1557 1644 1683 N
+ EH TH ER s n/a 12 1557 1644 1683 N
+ EH TH EY s n/a 12 1552 1602 1654 N
+ EH TH F b n/a 12 1545 1587 1660 N
+ EH TH F i n/a 12 1542 1587 1660 N
+ EH TH F s n/a 12 1545 1587 1660 N
+ EH TH G b n/a 12 1545 1608 1659 N
+ EH TH G s n/a 12 1545 1608 1659 N
+ EH TH HH b n/a 12 1545 1596 1652 N
+ EH TH HH s n/a 12 1545 1596 1652 N
+ EH TH IH b n/a 12 1552 1602 1654 N
+ EH TH IH s n/a 12 1552 1602 1654 N
+ EH TH IY b n/a 12 1552 1602 1654 N
+ EH TH IY s n/a 12 1552 1602 1654 N
+ EH TH JH b n/a 12 1545 1602 1656 N
+ EH TH JH s n/a 12 1545 1602 1656 N
+ EH TH K b n/a 12 1545 1606 1657 N
+ EH TH K i n/a 12 1542 1604 1657 N
+ EH TH K s n/a 12 1545 1606 1657 N
+ EH TH L b n/a 12 1550 1641 1691 N
+ EH TH L i n/a 12 1550 1641 1691 N
+ EH TH L s n/a 12 1550 1641 1691 N
+ EH TH M b n/a 12 1545 1588 1674 N
+ EH TH M i n/a 12 1542 1588 1674 N
+ EH TH M s n/a 12 1545 1588 1674 N
+ EH TH N b n/a 12 1545 1615 1677 N
+ EH TH N i n/a 12 1542 1610 1681 N
+ EH TH N s n/a 12 1545 1615 1677 N
+ EH TH NG b n/a 12 1545 1608 1677 N
+ EH TH NG i n/a 12 1542 1604 1681 N
+ EH TH NG s n/a 12 1545 1608 1677 N
+ EH TH OW s n/a 12 1552 1602 1683 N
+ EH TH OY s n/a 12 1552 1602 1683 N
+ EH TH P b n/a 12 1545 1587 1672 N
+ EH TH P s n/a 12 1545 1587 1672 N
+ EH TH R b n/a 12 1557 1644 1683 N
+ EH TH R i n/a 12 1557 1644 1683 N
+ EH TH R s n/a 12 1557 1644 1683 N
+ EH TH S b n/a 12 1545 1596 1662 N
+ EH TH S i n/a 12 1542 1596 1662 N
+ EH TH S s n/a 12 1545 1596 1662 N
+ EH TH SH b n/a 12 1545 1597 1665 N
+ EH TH SH i n/a 12 1542 1597 1665 N
+ EH TH SH s n/a 12 1545 1597 1665 N
+ EH TH SIL s n/a 12 1545 1596 1652 N
+ EH TH T b n/a 12 1545 1596 1652 N
+ EH TH T i n/a 12 1542 1596 1652 N
+ EH TH T s n/a 12 1545 1596 1652 N
+ EH TH TH b n/a 12 1545 1596 1660 N
+ EH TH TH s n/a 12 1545 1596 1660 N
+ EH TH UH s n/a 12 1552 1602 1683 N
+ EH TH UW s n/a 12 1552 1602 1683 N
+ EH TH V b n/a 12 1545 1593 1675 N
+ EH TH V s n/a 12 1545 1593 1675 N
+ EH TH W s n/a 12 1547 1587 1691 N
+ EH TH Y s n/a 12 1556 1602 1654 N
+ EH TH Z b n/a 12 1545 1595 1669 N
+ EH TH Z i n/a 12 1542 1602 1670 N
+ EH TH Z s n/a 12 1545 1595 1670 N
+ EH TH ZH s n/a 12 1545 1595 1670 N
+ EH UH AA s n/a 12 1572 1621 1684 N
+ EH UH AE s n/a 12 1572 1621 1656 N
+ EH UH AH b n/a 12 1572 1621 1656 N
+ EH UH AH s n/a 12 1572 1621 1656 N
+ EH UH AO s n/a 12 1572 1621 1684 N
+ EH UH AW s n/a 12 1572 1621 1656 N
+ EH UH AY s n/a 12 1572 1621 1684 N
+ EH UH B b n/a 12 1572 1625 1671 N
+ EH UH B s n/a 12 1572 1625 1671 N
+ EH UH CH b n/a 12 1572 1621 1651 N
+ EH UH CH s n/a 12 1572 1621 1651 N
+ EH UH D b n/a 12 1572 1628 1656 N
+ EH UH D s n/a 12 1572 1628 1656 N
+ EH UH DH b n/a 12 1572 1621 1669 N
+ EH UH DH s n/a 12 1572 1621 1670 N
+ EH UH EH b n/a 12 1572 1621 1656 N
+ EH UH EH s n/a 12 1572 1621 1656 N
+ EH UH ER b n/a 12 1572 1650 1684 N
+ EH UH ER s n/a 12 1572 1650 1684 N
+ EH UH EY s n/a 12 1572 1621 1656 N
+ EH UH F b n/a 12 1572 1624 1660 N
+ EH UH F s n/a 12 1572 1624 1660 N
+ EH UH G b n/a 12 1572 1628 1659 N
+ EH UH G s n/a 12 1572 1628 1659 N
+ EH UH HH b n/a 12 1572 1621 1651 N
+ EH UH HH s n/a 12 1572 1621 1651 N
+ EH UH IH b n/a 12 1572 1621 1656 N
+ EH UH IH s n/a 12 1572 1621 1656 N
+ EH UH IY b n/a 12 1572 1621 1656 N
+ EH UH IY s n/a 12 1572 1621 1656 N
+ EH UH JH b n/a 12 1572 1621 1656 N
+ EH UH JH s n/a 12 1572 1621 1656 N
+ EH UH K b n/a 12 1572 1622 1658 N
+ EH UH K s n/a 12 1572 1622 1658 N
+ EH UH L b n/a 12 1572 1638 1690 N
+ EH UH L s n/a 12 1572 1638 1690 N
+ EH UH M b n/a 12 1572 1627 1673 N
+ EH UH M s n/a 12 1572 1627 1673 N
+ EH UH N b n/a 12 1572 1627 1677 N
+ EH UH N s n/a 12 1572 1627 1677 N
+ EH UH NG b n/a 12 1572 1627 1677 N
+ EH UH NG s n/a 12 1572 1627 1677 N
+ EH UH OW s n/a 12 1572 1621 1684 N
+ EH UH OY s n/a 12 1572 1621 1684 N
+ EH UH P b n/a 12 1572 1624 1672 N
+ EH UH P s n/a 12 1572 1624 1672 N
+ EH UH R b n/a 12 1572 1650 1684 N
+ EH UH R s n/a 12 1572 1650 1684 N
+ EH UH S b n/a 12 1572 1621 1662 N
+ EH UH S s n/a 12 1572 1621 1662 N
+ EH UH SH b n/a 12 1572 1621 1665 N
+ EH UH SH s n/a 12 1572 1621 1665 N
+ EH UH SIL s n/a 12 1572 1621 1651 N
+ EH UH T b n/a 12 1572 1621 1651 N
+ EH UH T s n/a 12 1572 1621 1651 N
+ EH UH TH b n/a 12 1572 1621 1660 N
+ EH UH TH s n/a 12 1572 1621 1660 N
+ EH UH UH s n/a 12 1572 1621 1684 N
+ EH UH UW s n/a 12 1572 1621 1684 N
+ EH UH V b n/a 12 1572 1625 1675 N
+ EH UH V s n/a 12 1572 1625 1675 N
+ EH UH W s n/a 12 1572 1638 1690 N
+ EH UH Y s n/a 12 1572 1638 1656 N
+ EH UH Z b n/a 12 1572 1621 1669 N
+ EH UH Z s n/a 12 1572 1621 1670 N
+ EH UH ZH s n/a 12 1572 1621 1670 N
+ EH UW AA e n/a 12 1579 1625 1684 N
+ EH UW AA s n/a 12 1579 1625 1684 N
+ EH UW AE e n/a 12 1582 1625 1656 N
+ EH UW AE s n/a 12 1582 1625 1656 N
+ EH UW AH b n/a 12 1582 1625 1656 N
+ EH UW AH e n/a 12 1582 1625 1656 N
+ EH UW AH s n/a 12 1582 1625 1656 N
+ EH UW AO e n/a 12 1579 1625 1684 N
+ EH UW AO s n/a 12 1579 1625 1684 N
+ EH UW AW e n/a 12 1582 1625 1656 N
+ EH UW AW s n/a 12 1582 1625 1656 N
+ EH UW AY e n/a 12 1579 1625 1684 N
+ EH UW AY s n/a 12 1579 1625 1684 N
+ EH UW B b n/a 12 1573 1625 1671 N
+ EH UW B e n/a 12 1573 1625 1671 N
+ EH UW B s n/a 12 1573 1625 1671 N
+ EH UW CH b n/a 12 1573 1624 1651 N
+ EH UW CH e n/a 12 1573 1624 1651 N
+ EH UW CH s n/a 12 1573 1624 1651 N
+ EH UW D b n/a 12 1573 1628 1656 N
+ EH UW D e n/a 12 1573 1628 1656 N
+ EH UW D i n/a 12 1575 1628 1656 N
+ EH UW D s n/a 12 1573 1628 1656 N
+ EH UW DH b n/a 12 1573 1625 1669 N
+ EH UW DH e n/a 12 1573 1625 1670 N
+ EH UW DH s n/a 12 1573 1625 1670 N
+ EH UW EH b n/a 12 1582 1625 1656 N
+ EH UW EH e n/a 12 1582 1625 1656 N
+ EH UW EH s n/a 12 1582 1625 1656 N
+ EH UW ER b n/a 12 1582 1650 1684 N
+ EH UW ER e n/a 12 1582 1650 1684 N
+ EH UW ER s n/a 12 1582 1650 1684 N
+ EH UW EY e n/a 12 1582 1625 1656 N
+ EH UW EY s n/a 12 1582 1625 1656 N
+ EH UW F b n/a 12 1573 1624 1660 N
+ EH UW F e n/a 12 1573 1624 1660 N
+ EH UW F s n/a 12 1573 1624 1660 N
+ EH UW G b n/a 12 1573 1628 1659 N
+ EH UW G e n/a 12 1573 1628 1659 N
+ EH UW G s n/a 12 1573 1628 1659 N
+ EH UW HH b n/a 12 1573 1624 1651 N
+ EH UW HH e n/a 12 1573 1624 1651 N
+ EH UW HH s n/a 12 1573 1624 1651 N
+ EH UW IH b n/a 12 1582 1625 1656 N
+ EH UW IH e n/a 12 1582 1625 1656 N
+ EH UW IH s n/a 12 1582 1625 1656 N
+ EH UW IY b n/a 12 1582 1625 1656 N
+ EH UW IY e n/a 12 1582 1625 1656 N
+ EH UW IY s n/a 12 1582 1625 1656 N
+ EH UW JH b n/a 12 1573 1625 1656 N
+ EH UW JH e n/a 12 1573 1625 1656 N
+ EH UW JH s n/a 12 1573 1625 1656 N
+ EH UW K b n/a 12 1573 1623 1658 N
+ EH UW K e n/a 12 1573 1623 1658 N
+ EH UW K i n/a 12 1577 1623 1658 N
+ EH UW K s n/a 12 1573 1623 1658 N
+ EH UW L b n/a 12 1579 1638 1690 N
+ EH UW L e n/a 12 1579 1638 1690 N
+ EH UW L i n/a 12 1579 1638 1690 N
+ EH UW L s n/a 12 1579 1638 1690 N
+ EH UW M b n/a 12 1573 1627 1673 N
+ EH UW M e n/a 12 1573 1627 1673 N
+ EH UW M i n/a 12 1576 1627 1673 N
+ EH UW M s n/a 12 1573 1627 1673 N
+ EH UW N b n/a 12 1573 1627 1677 N
+ EH UW N e n/a 12 1573 1627 1677 N
+ EH UW N i n/a 12 1575 1627 1676 N
+ EH UW N s n/a 12 1573 1627 1677 N
+ EH UW NG b n/a 12 1573 1627 1677 N
+ EH UW NG e n/a 12 1573 1627 1677 N
+ EH UW NG s n/a 12 1573 1627 1677 N
+ EH UW OW e n/a 12 1579 1625 1684 N
+ EH UW OW s n/a 12 1579 1625 1684 N
+ EH UW OY e n/a 12 1579 1625 1684 N
+ EH UW OY s n/a 12 1579 1625 1684 N
+ EH UW P b n/a 12 1573 1624 1672 N
+ EH UW P e n/a 12 1573 1624 1672 N
+ EH UW P s n/a 12 1573 1624 1672 N
+ EH UW R b n/a 12 1582 1650 1684 N
+ EH UW R e n/a 12 1582 1650 1684 N
+ EH UW R i n/a 12 1582 1650 1684 N
+ EH UW R s n/a 12 1582 1650 1684 N
+ EH UW S b n/a 12 1574 1624 1662 N
+ EH UW S e n/a 12 1574 1624 1662 N
+ EH UW S i n/a 12 1576 1624 1662 N
+ EH UW S s n/a 12 1574 1624 1662 N
+ EH UW SH b n/a 12 1574 1624 1665 N
+ EH UW SH e n/a 12 1574 1624 1665 N
+ EH UW SH s n/a 12 1574 1624 1665 N
+ EH UW SIL e n/a 12 1573 1624 1651 N
+ EH UW SIL s n/a 12 1573 1624 1651 N
+ EH UW T b n/a 12 1573 1624 1651 N
+ EH UW T e n/a 12 1573 1624 1651 N
+ EH UW T i n/a 12 1576 1624 1651 N
+ EH UW T s n/a 12 1573 1624 1651 N
+ EH UW TH b n/a 12 1573 1624 1660 N
+ EH UW TH e n/a 12 1573 1624 1660 N
+ EH UW TH s n/a 12 1573 1624 1660 N
+ EH UW UH e n/a 12 1579 1625 1684 N
+ EH UW UH s n/a 12 1579 1625 1684 N
+ EH UW UW e n/a 12 1579 1625 1684 N
+ EH UW UW s n/a 12 1579 1625 1684 N
+ EH UW V b n/a 12 1573 1625 1675 N
+ EH UW V e n/a 12 1573 1625 1675 N
+ EH UW V i n/a 12 1576 1625 1671 N
+ EH UW V s n/a 12 1573 1625 1675 N
+ EH UW W e n/a 12 1579 1638 1690 N
+ EH UW W s n/a 12 1579 1638 1690 N
+ EH UW Y e n/a 12 1582 1638 1656 N
+ EH UW Y s n/a 12 1582 1638 1656 N
+ EH UW Z b n/a 12 1574 1625 1669 N
+ EH UW Z e n/a 12 1574 1625 1670 N
+ EH UW Z i n/a 12 1576 1625 1670 N
+ EH UW Z s n/a 12 1574 1625 1670 N
+ EH UW ZH e n/a 12 1574 1625 1670 N
+ EH UW ZH s n/a 12 1574 1625 1670 N
+ EH V AA e n/a 12 1524 1602 1688 N
+ EH V AA s n/a 12 1524 1602 1688 N
+ EH V AE e n/a 12 1524 1602 1654 N
+ EH V AE s n/a 12 1524 1602 1654 N
+ EH V AH b n/a 12 1524 1602 1654 N
+ EH V AH e n/a 12 1524 1602 1654 N
+ EH V AH s n/a 12 1524 1602 1654 N
+ EH V AO e n/a 12 1524 1602 1688 N
+ EH V AO s n/a 12 1524 1602 1688 N
+ EH V AW e n/a 12 1524 1602 1654 N
+ EH V AW s n/a 12 1524 1602 1654 N
+ EH V AY e n/a 12 1524 1602 1688 N
+ EH V AY s n/a 12 1524 1602 1688 N
+ EH V B b n/a 12 1524 1591 1671 N
+ EH V B e n/a 12 1524 1591 1671 N
+ EH V B i n/a 12 1534 1590 1671 N
+ EH V B s n/a 12 1524 1591 1671 N
+ EH V CH b n/a 12 1524 1599 1651 N
+ EH V CH e n/a 12 1524 1597 1651 N
+ EH V CH i n/a 12 1534 1597 1651 N
+ EH V CH s n/a 12 1524 1597 1651 N
+ EH V D b n/a 12 1524 1619 1654 N
+ EH V D e n/a 12 1524 1619 1654 N
+ EH V D i n/a 12 1534 1619 1654 N
+ EH V D s n/a 12 1524 1619 1654 N
+ EH V DH b n/a 12 1524 1595 1667 N
+ EH V DH e n/a 12 1524 1595 1666 N
+ EH V DH s n/a 12 1524 1595 1667 N
+ EH V EH b n/a 12 1524 1602 1654 N
+ EH V EH e n/a 12 1524 1602 1654 N
+ EH V EH s n/a 12 1524 1602 1654 N
+ EH V ER b n/a 12 1524 1649 1688 N
+ EH V ER e n/a 12 1524 1649 1688 N
+ EH V ER s n/a 12 1524 1649 1688 N
+ EH V EY e n/a 12 1524 1602 1654 N
+ EH V EY s n/a 12 1524 1602 1654 N
+ EH V F b n/a 12 1524 1583 1660 N
+ EH V F e n/a 12 1524 1583 1660 N
+ EH V F i n/a 12 1534 1583 1660 N
+ EH V F s n/a 12 1524 1583 1660 N
+ EH V G b n/a 12 1524 1608 1659 N
+ EH V G e n/a 12 1524 1608 1659 N
+ EH V G i n/a 12 1534 1608 1659 N
+ EH V G s n/a 12 1524 1608 1659 N
+ EH V HH b n/a 12 1524 1599 1651 N
+ EH V HH e n/a 12 1524 1596 1651 N
+ EH V HH i n/a 12 1534 1596 1651 N
+ EH V HH s n/a 12 1524 1596 1651 N
+ EH V IH b n/a 12 1524 1602 1654 N
+ EH V IH e n/a 12 1524 1602 1654 N
+ EH V IH s n/a 12 1524 1602 1654 N
+ EH V IY b n/a 12 1524 1602 1654 N
+ EH V IY e n/a 12 1524 1602 1654 N
+ EH V IY s n/a 12 1524 1602 1654 N
+ EH V JH b n/a 12 1524 1602 1656 N
+ EH V JH e n/a 12 1524 1602 1656 N
+ EH V JH i n/a 12 1534 1602 1656 N
+ EH V JH s n/a 12 1524 1602 1656 N
+ EH V K b n/a 12 1524 1606 1657 N
+ EH V K e n/a 12 1524 1606 1657 N
+ EH V K i n/a 12 1534 1605 1657 N
+ EH V K s n/a 12 1524 1606 1657 N
+ EH V L b n/a 12 1524 1642 1691 N
+ EH V L e n/a 12 1524 1642 1691 N
+ EH V L i n/a 12 1535 1641 1691 N
+ EH V L s n/a 12 1524 1642 1691 N
+ EH V M b n/a 12 1524 1591 1673 N
+ EH V M e n/a 12 1524 1591 1673 N
+ EH V M i n/a 12 1534 1590 1673 N
+ EH V M s n/a 12 1524 1591 1673 N
+ EH V N b n/a 12 1524 1615 1677 N
+ EH V N e n/a 12 1524 1615 1677 N
+ EH V N i n/a 12 1534 1611 1676 N
+ EH V N s n/a 12 1524 1615 1677 N
+ EH V NG b n/a 12 1524 1608 1677 N
+ EH V NG e n/a 12 1524 1608 1677 N
+ EH V NG i n/a 12 1534 1608 1677 N
+ EH V NG s n/a 12 1524 1608 1677 N
+ EH V OW e n/a 12 1524 1602 1688 N
+ EH V OW s n/a 12 1524 1602 1688 N
+ EH V OY e n/a 12 1524 1602 1688 N
+ EH V OY s n/a 12 1524 1602 1688 N
+ EH V P b n/a 12 1524 1583 1672 N
+ EH V P e n/a 12 1524 1583 1672 N
+ EH V P s n/a 12 1524 1583 1672 N
+ EH V R b n/a 12 1524 1649 1688 N
+ EH V R e n/a 12 1524 1649 1688 N
+ EH V R i n/a 12 1539 1648 1687 N
+ EH V R s n/a 12 1524 1649 1688 N
+ EH V S b n/a 12 1524 1599 1662 N
+ EH V S e n/a 12 1524 1596 1662 N
+ EH V S i n/a 12 1535 1596 1662 N
+ EH V S s n/a 12 1524 1596 1662 N
+ EH V SH b n/a 12 1524 1599 1665 N
+ EH V SH e n/a 12 1524 1597 1665 N
+ EH V SH s n/a 12 1524 1597 1665 N
+ EH V SIL e n/a 12 1524 1596 1651 N
+ EH V SIL s n/a 12 1524 1596 1651 N
+ EH V T b n/a 12 1524 1599 1651 N
+ EH V T e n/a 12 1524 1596 1651 N
+ EH V T i n/a 12 1534 1596 1651 N
+ EH V T s n/a 12 1524 1596 1651 N
+ EH V TH b n/a 12 1524 1599 1660 N
+ EH V TH e n/a 12 1524 1596 1660 N
+ EH V TH i n/a 12 1534 1596 1660 N
+ EH V TH s n/a 12 1524 1596 1660 N
+ EH V UH e n/a 12 1524 1602 1688 N
+ EH V UH s n/a 12 1524 1602 1688 N
+ EH V UW e n/a 12 1524 1602 1688 N
+ EH V UW s n/a 12 1524 1602 1688 N
+ EH V V b n/a 12 1524 1593 1675 N
+ EH V V e n/a 12 1524 1593 1675 N
+ EH V V i n/a 12 1534 1590 1671 N
+ EH V V s n/a 12 1524 1593 1675 N
+ EH V W e n/a 12 1524 1591 1691 N
+ EH V W s n/a 12 1524 1591 1691 N
+ EH V Y e n/a 12 1524 1602 1654 N
+ EH V Y s n/a 12 1524 1602 1654 N
+ EH V Z b n/a 12 1521 1595 1669 N
+ EH V Z e n/a 12 1521 1595 1670 N
+ EH V Z i n/a 12 1535 1602 1670 N
+ EH V Z s n/a 12 1521 1595 1670 N
+ EH V ZH e n/a 12 1521 1595 1670 N
+ EH V ZH s n/a 12 1521 1595 1670 N
+ EH W AA e n/a 12 1578 1621 1684 N
+ EH W AA s n/a 12 1578 1621 1684 N
+ EH W AE e n/a 12 1582 1621 1656 N
+ EH W AE s n/a 12 1582 1621 1656 N
+ EH W AH b n/a 12 1582 1621 1656 N
+ EH W AH e n/a 12 1582 1621 1656 N
+ EH W AH i n/a 12 1582 1621 1656 N
+ EH W AH s n/a 12 1582 1621 1656 N
+ EH W AO e n/a 12 1578 1621 1684 N
+ EH W AO s n/a 12 1578 1621 1684 N
+ EH W AW e n/a 12 1582 1621 1656 N
+ EH W AW s n/a 12 1582 1621 1656 N
+ EH W AY e n/a 12 1578 1621 1684 N
+ EH W AY s n/a 12 1578 1621 1684 N
+ EH W B b n/a 12 1581 1625 1671 N
+ EH W B e n/a 12 1581 1625 1671 N
+ EH W B i n/a 12 1581 1625 1671 N
+ EH W B s n/a 12 1581 1625 1671 N
+ EH W CH b n/a 12 1580 1621 1653 N
+ EH W CH e n/a 12 1580 1621 1653 N
+ EH W CH i n/a 12 1580 1621 1653 N
+ EH W CH s n/a 12 1580 1621 1653 N
+ EH W D b n/a 12 1580 1628 1656 N
+ EH W D e n/a 12 1580 1628 1656 N
+ EH W D i n/a 12 1580 1628 1656 N
+ EH W D s n/a 12 1580 1628 1656 N
+ EH W DH b n/a 12 1581 1621 1669 N
+ EH W DH e n/a 12 1581 1621 1670 N
+ EH W DH i n/a 12 1581 1621 1670 N
+ EH W DH s n/a 12 1581 1621 1670 N
+ EH W EH b n/a 12 1582 1621 1656 N
+ EH W EH e n/a 12 1582 1621 1656 N
+ EH W EH s n/a 12 1582 1621 1656 N
+ EH W ER b n/a 12 1582 1650 1684 N
+ EH W ER e n/a 12 1582 1650 1684 N
+ EH W ER s n/a 12 1582 1650 1684 N
+ EH W EY e n/a 12 1582 1621 1656 N
+ EH W EY s n/a 12 1582 1621 1656 N
+ EH W F b n/a 12 1580 1624 1660 N
+ EH W F e n/a 12 1580 1624 1660 N
+ EH W F i n/a 12 1580 1624 1660 N
+ EH W F s n/a 12 1580 1624 1660 N
+ EH W G b n/a 12 1580 1628 1659 N
+ EH W G e n/a 12 1580 1628 1659 N
+ EH W G i n/a 12 1580 1628 1659 N
+ EH W G s n/a 12 1580 1628 1659 N
+ EH W HH b n/a 12 1580 1621 1653 N
+ EH W HH e n/a 12 1580 1621 1653 N
+ EH W HH i n/a 12 1580 1621 1653 N
+ EH W HH s n/a 12 1580 1621 1653 N
+ EH W IH b n/a 12 1582 1621 1656 N
+ EH W IH e n/a 12 1582 1621 1656 N
+ EH W IH s n/a 12 1582 1621 1656 N
+ EH W IY b n/a 12 1582 1621 1656 N
+ EH W IY e n/a 12 1582 1621 1656 N
+ EH W IY s n/a 12 1582 1621 1656 N
+ EH W JH b n/a 12 1580 1621 1656 N
+ EH W JH e n/a 12 1580 1621 1656 N
+ EH W JH i n/a 12 1580 1621 1656 N
+ EH W JH s n/a 12 1580 1621 1656 N
+ EH W K b n/a 12 1581 1622 1658 N
+ EH W K e n/a 12 1581 1622 1658 N
+ EH W K i n/a 12 1581 1622 1658 N
+ EH W K s n/a 12 1581 1622 1658 N
+ EH W L b n/a 12 1578 1643 1692 N
+ EH W L e n/a 12 1578 1643 1692 N
+ EH W L i n/a 12 1579 1643 1692 N
+ EH W L s n/a 12 1578 1643 1692 N
+ EH W M b n/a 12 1582 1626 1673 N
+ EH W M e n/a 12 1582 1626 1673 N
+ EH W M i n/a 12 1580 1626 1673 N
+ EH W M s n/a 12 1582 1626 1673 N
+ EH W N b n/a 12 1582 1626 1682 N
+ EH W N e n/a 12 1582 1626 1682 N
+ EH W N i n/a 12 1580 1626 1682 N
+ EH W N s n/a 12 1582 1626 1682 N
+ EH W NG b n/a 12 1582 1626 1682 N
+ EH W NG e n/a 12 1582 1626 1682 N
+ EH W NG i n/a 12 1580 1626 1682 N
+ EH W NG s n/a 12 1582 1626 1682 N
+ EH W OW e n/a 12 1578 1621 1684 N
+ EH W OW s n/a 12 1578 1621 1684 N
+ EH W OY e n/a 12 1578 1621 1684 N
+ EH W OY s n/a 12 1578 1621 1684 N
+ EH W P b n/a 12 1581 1624 1672 N
+ EH W P e n/a 12 1581 1624 1672 N
+ EH W P i n/a 12 1581 1624 1672 N
+ EH W P s n/a 12 1581 1624 1672 N
+ EH W R b n/a 12 1582 1650 1684 N
+ EH W R e n/a 12 1582 1650 1684 N
+ EH W R i n/a 12 1582 1650 1684 N
+ EH W R s n/a 12 1582 1650 1684 N
+ EH W S b n/a 12 1581 1623 1664 N
+ EH W S e n/a 12 1581 1623 1664 N
+ EH W S i n/a 12 1581 1623 1664 N
+ EH W S s n/a 12 1581 1623 1664 N
+ EH W SH b n/a 12 1581 1623 1665 N
+ EH W SH e n/a 12 1581 1623 1665 N
+ EH W SH i n/a 12 1581 1623 1665 N
+ EH W SH s n/a 12 1581 1623 1665 N
+ EH W SIL e n/a 12 1580 1621 1653 N
+ EH W SIL s n/a 12 1580 1621 1653 N
+ EH W T b n/a 12 1581 1621 1653 N
+ EH W T e n/a 12 1581 1621 1653 N
+ EH W T i n/a 12 1581 1621 1653 N
+ EH W T s n/a 12 1581 1621 1653 N
+ EH W TH b n/a 12 1581 1621 1661 N
+ EH W TH e n/a 12 1581 1621 1661 N
+ EH W TH i n/a 12 1581 1621 1661 N
+ EH W TH s n/a 12 1581 1621 1661 N
+ EH W UH e n/a 12 1578 1621 1684 N
+ EH W UH s n/a 12 1578 1621 1684 N
+ EH W UW e n/a 12 1578 1621 1684 N
+ EH W UW s n/a 12 1578 1621 1684 N
+ EH W V b n/a 12 1580 1625 1675 N
+ EH W V e n/a 12 1580 1625 1675 N
+ EH W V i n/a 12 1580 1625 1671 N
+ EH W V s n/a 12 1580 1625 1675 N
+ EH W W e n/a 12 1578 1643 1692 N
+ EH W W i n/a 12 1579 1643 1692 N
+ EH W W s n/a 12 1578 1643 1692 N
+ EH W Y e n/a 12 1582 1643 1656 N
+ EH W Y s n/a 12 1582 1643 1656 N
+ EH W Z b n/a 12 1580 1621 1669 N
+ EH W Z e n/a 12 1580 1621 1670 N
+ EH W Z i n/a 12 1580 1621 1670 N
+ EH W Z s n/a 12 1580 1621 1670 N
+ EH W ZH e n/a 12 1580 1621 1670 N
+ EH W ZH s n/a 12 1580 1621 1670 N
+ EH Y AA e n/a 12 1528 1583 1685 N
+ EH Y AA s n/a 12 1528 1583 1685 N
+ EH Y AE e n/a 12 1528 1583 1656 N
+ EH Y AE s n/a 12 1528 1583 1656 N
+ EH Y AH b n/a 12 1528 1602 1656 N
+ EH Y AH e n/a 12 1528 1583 1656 N
+ EH Y AH i n/a 12 1528 1583 1656 N
+ EH Y AH s n/a 12 1528 1583 1656 N
+ EH Y AO e n/a 12 1528 1583 1685 N
+ EH Y AO s n/a 12 1528 1583 1685 N
+ EH Y AW e n/a 12 1528 1583 1656 N
+ EH Y AW s n/a 12 1528 1583 1656 N
+ EH Y AY e n/a 12 1528 1583 1685 N
+ EH Y AY s n/a 12 1528 1583 1685 N
+ EH Y B b n/a 12 1528 1591 1671 N
+ EH Y B e n/a 12 1528 1591 1671 N
+ EH Y B s n/a 12 1528 1591 1671 N
+ EH Y CH b n/a 12 1528 1599 1651 N
+ EH Y CH e n/a 12 1528 1584 1651 N
+ EH Y CH s n/a 12 1528 1584 1651 N
+ EH Y D b n/a 12 1528 1619 1656 N
+ EH Y D e n/a 12 1528 1618 1656 N
+ EH Y D i n/a 12 1528 1618 1656 N
+ EH Y D s n/a 12 1528 1618 1656 N
+ EH Y DH b n/a 12 1528 1595 1667 N
+ EH Y DH e n/a 12 1528 1585 1666 N
+ EH Y DH s n/a 12 1528 1585 1667 N
+ EH Y EH b n/a 12 1528 1602 1656 N
+ EH Y EH e n/a 12 1528 1583 1656 N
+ EH Y EH s n/a 12 1528 1583 1656 N
+ EH Y ER b n/a 12 1528 1645 1685 N
+ EH Y ER e n/a 12 1528 1645 1685 N
+ EH Y ER s n/a 12 1528 1645 1685 N
+ EH Y EY e n/a 12 1528 1583 1656 N
+ EH Y EY i n/a 12 1528 1583 1656 N
+ EH Y EY s n/a 12 1528 1583 1656 N
+ EH Y F b n/a 12 1528 1583 1660 N
+ EH Y F e n/a 12 1528 1583 1660 N
+ EH Y F i n/a 12 1528 1583 1660 N
+ EH Y F s n/a 12 1528 1583 1660 N
+ EH Y G b n/a 12 1528 1608 1659 N
+ EH Y G e n/a 12 1528 1608 1659 N
+ EH Y G i n/a 12 1528 1608 1659 N
+ EH Y G s n/a 12 1528 1608 1659 N
+ EH Y HH b n/a 12 1528 1599 1651 N
+ EH Y HH e n/a 12 1528 1583 1651 N
+ EH Y HH i n/a 12 1528 1583 1651 N
+ EH Y HH s n/a 12 1528 1583 1651 N
+ EH Y IH b n/a 12 1528 1602 1656 N
+ EH Y IH e n/a 12 1528 1583 1656 N
+ EH Y IH i n/a 12 1528 1583 1656 N
+ EH Y IH s n/a 12 1528 1583 1656 N
+ EH Y IY b n/a 12 1528 1602 1656 N
+ EH Y IY e n/a 12 1528 1583 1656 N
+ EH Y IY s n/a 12 1528 1583 1656 N
+ EH Y JH b n/a 12 1528 1602 1656 N
+ EH Y JH e n/a 12 1528 1584 1656 N
+ EH Y JH s n/a 12 1528 1584 1656 N
+ EH Y K b n/a 12 1528 1606 1657 N
+ EH Y K e n/a 12 1528 1606 1657 N
+ EH Y K i n/a 12 1528 1605 1657 N
+ EH Y K s n/a 12 1528 1606 1657 N
+ EH Y L b n/a 12 1528 1638 1690 N
+ EH Y L e n/a 12 1528 1638 1690 N
+ EH Y L i n/a 12 1528 1638 1690 N
+ EH Y L s n/a 12 1528 1638 1690 N
+ EH Y M b n/a 12 1529 1591 1674 N
+ EH Y M e n/a 12 1529 1591 1674 N
+ EH Y M i n/a 12 1529 1589 1674 N
+ EH Y M s n/a 12 1529 1591 1674 N
+ EH Y N b n/a 12 1529 1615 1677 N
+ EH Y N e n/a 12 1529 1615 1677 N
+ EH Y N i n/a 12 1529 1610 1678 N
+ EH Y N s n/a 12 1529 1615 1677 N
+ EH Y NG b n/a 12 1529 1608 1677 N
+ EH Y NG e n/a 12 1529 1608 1677 N
+ EH Y NG s n/a 12 1529 1608 1677 N
+ EH Y OW e n/a 12 1528 1583 1685 N
+ EH Y OW s n/a 12 1528 1583 1685 N
+ EH Y OY e n/a 12 1528 1583 1685 N
+ EH Y OY s n/a 12 1528 1583 1685 N
+ EH Y P b n/a 12 1528 1583 1672 N
+ EH Y P e n/a 12 1528 1583 1672 N
+ EH Y P i n/a 12 1528 1583 1672 N
+ EH Y P s n/a 12 1528 1583 1672 N
+ EH Y R b n/a 12 1528 1645 1685 N
+ EH Y R e n/a 12 1528 1645 1685 N
+ EH Y R i n/a 12 1540 1645 1685 N
+ EH Y R s n/a 12 1528 1645 1685 N
+ EH Y S b n/a 12 1528 1599 1663 N
+ EH Y S e n/a 12 1528 1583 1663 N
+ EH Y S i n/a 12 1528 1583 1663 N
+ EH Y S s n/a 12 1528 1583 1663 N
+ EH Y SH b n/a 12 1528 1599 1665 N
+ EH Y SH e n/a 12 1528 1583 1665 N
+ EH Y SH i n/a 12 1528 1583 1665 N
+ EH Y SH s n/a 12 1528 1583 1665 N
+ EH Y SIL e n/a 12 1528 1583 1651 N
+ EH Y SIL s n/a 12 1528 1583 1651 N
+ EH Y T b n/a 12 1528 1599 1651 N
+ EH Y T e n/a 12 1528 1584 1651 N
+ EH Y T i n/a 12 1528 1584 1651 N
+ EH Y T s n/a 12 1528 1584 1651 N
+ EH Y TH b n/a 12 1528 1599 1660 N
+ EH Y TH e n/a 12 1528 1585 1660 N
+ EH Y TH s n/a 12 1528 1585 1660 N
+ EH Y UH e n/a 12 1528 1583 1685 N
+ EH Y UH s n/a 12 1528 1583 1685 N
+ EH Y UW e n/a 12 1528 1583 1685 N
+ EH Y UW i n/a 12 1528 1583 1685 N
+ EH Y UW s n/a 12 1528 1583 1685 N
+ EH Y V b n/a 12 1528 1593 1675 N
+ EH Y V e n/a 12 1528 1593 1675 N
+ EH Y V i n/a 12 1528 1590 1671 N
+ EH Y V s n/a 12 1528 1593 1675 N
+ EH Y W e n/a 12 1528 1591 1690 N
+ EH Y W i n/a 12 1528 1590 1690 N
+ EH Y W s n/a 12 1528 1591 1690 N
+ EH Y Y e n/a 12 1528 1583 1656 N
+ EH Y Y s n/a 12 1528 1583 1656 N
+ EH Y Z b n/a 12 1528 1595 1669 N
+ EH Y Z e n/a 12 1528 1583 1670 N
+ EH Y Z i n/a 12 1528 1583 1670 N
+ EH Y Z s n/a 12 1528 1583 1670 N
+ EH Y ZH e n/a 12 1528 1583 1670 N
+ EH Y ZH s n/a 12 1528 1583 1670 N
+ EH Z AA e n/a 12 1524 1586 1688 N
+ EH Z AA s n/a 12 1524 1586 1688 N
+ EH Z AE e n/a 12 1524 1586 1654 N
+ EH Z AE s n/a 12 1524 1586 1654 N
+ EH Z AH b n/a 12 1524 1602 1654 N
+ EH Z AH e n/a 12 1524 1586 1654 N
+ EH Z AH i n/a 12 1538 1586 1654 N
+ EH Z AH s n/a 12 1524 1586 1654 N
+ EH Z AO e n/a 12 1524 1586 1688 N
+ EH Z AO s n/a 12 1524 1586 1688 N
+ EH Z AW e n/a 12 1524 1586 1654 N
+ EH Z AW s n/a 12 1524 1586 1654 N
+ EH Z AY e n/a 12 1524 1586 1688 N
+ EH Z AY s n/a 12 1524 1586 1688 N
+ EH Z B b n/a 12 1524 1591 1671 N
+ EH Z B e n/a 12 1524 1591 1671 N
+ EH Z B i n/a 12 1538 1590 1671 N
+ EH Z B s n/a 12 1524 1591 1671 N
+ EH Z CH b n/a 12 1524 1599 1652 N
+ EH Z CH e n/a 12 1524 1586 1652 N
+ EH Z CH i n/a 12 1538 1586 1652 N
+ EH Z CH s n/a 12 1524 1586 1652 N
+ EH Z D b n/a 12 1524 1619 1654 N
+ EH Z D e n/a 12 1524 1618 1654 N
+ EH Z D i n/a 12 1538 1618 1654 N
+ EH Z D s n/a 12 1524 1618 1654 N
+ EH Z DH b n/a 12 1524 1595 1667 N
+ EH Z DH e n/a 12 1524 1586 1666 N
+ EH Z DH s n/a 12 1524 1586 1667 N
+ EH Z EH b n/a 12 1524 1602 1654 N
+ EH Z EH e n/a 12 1524 1586 1654 N
+ EH Z EH s n/a 12 1524 1586 1654 N
+ EH Z ER b n/a 12 1524 1649 1688 N
+ EH Z ER e n/a 12 1524 1649 1688 N
+ EH Z ER s n/a 12 1524 1649 1688 N
+ EH Z EY e n/a 12 1524 1586 1654 N
+ EH Z EY s n/a 12 1524 1586 1654 N
+ EH Z F b n/a 12 1524 1587 1660 N
+ EH Z F e n/a 12 1524 1587 1660 N
+ EH Z F i n/a 12 1538 1587 1660 N
+ EH Z F s n/a 12 1524 1587 1660 N
+ EH Z G b n/a 12 1524 1608 1659 N
+ EH Z G e n/a 12 1524 1608 1659 N
+ EH Z G i n/a 12 1538 1608 1659 N
+ EH Z G s n/a 12 1524 1608 1659 N
+ EH Z HH b n/a 12 1524 1599 1652 N
+ EH Z HH e n/a 12 1524 1586 1652 N
+ EH Z HH i n/a 12 1538 1586 1652 N
+ EH Z HH s n/a 12 1524 1586 1652 N
+ EH Z IH b n/a 12 1524 1602 1654 N
+ EH Z IH e n/a 12 1524 1586 1654 N
+ EH Z IH s n/a 12 1524 1586 1654 N
+ EH Z IY b n/a 12 1524 1602 1654 N
+ EH Z IY e n/a 12 1524 1586 1654 N
+ EH Z IY s n/a 12 1524 1586 1654 N
+ EH Z JH b n/a 12 1524 1602 1656 N
+ EH Z JH e n/a 12 1524 1586 1656 N
+ EH Z JH i n/a 12 1538 1586 1656 N
+ EH Z JH s n/a 12 1524 1586 1656 N
+ EH Z K b n/a 12 1524 1606 1657 N
+ EH Z K e n/a 12 1524 1606 1657 N
+ EH Z K i n/a 12 1538 1605 1657 N
+ EH Z K s n/a 12 1524 1606 1657 N
+ EH Z L b n/a 12 1524 1642 1691 N
+ EH Z L e n/a 12 1524 1642 1691 N
+ EH Z L i n/a 12 1538 1642 1691 N
+ EH Z L s n/a 12 1524 1642 1691 N
+ EH Z M b n/a 12 1524 1591 1673 N
+ EH Z M e n/a 12 1524 1591 1673 N
+ EH Z M i n/a 12 1538 1590 1673 N
+ EH Z M s n/a 12 1524 1591 1673 N
+ EH Z N b n/a 12 1524 1615 1677 N
+ EH Z N e n/a 12 1524 1615 1677 N
+ EH Z N i n/a 12 1538 1613 1680 N
+ EH Z N s n/a 12 1524 1615 1677 N
+ EH Z NG b n/a 12 1524 1608 1677 N
+ EH Z NG e n/a 12 1524 1608 1677 N
+ EH Z NG i n/a 12 1538 1608 1680 N
+ EH Z NG s n/a 12 1524 1608 1677 N
+ EH Z OW e n/a 12 1524 1586 1688 N
+ EH Z OW s n/a 12 1524 1586 1688 N
+ EH Z OY e n/a 12 1524 1586 1688 N
+ EH Z OY s n/a 12 1524 1586 1688 N
+ EH Z P b n/a 12 1524 1587 1672 N
+ EH Z P e n/a 12 1524 1587 1672 N
+ EH Z P i n/a 12 1538 1587 1672 N
+ EH Z P s n/a 12 1524 1587 1672 N
+ EH Z R b n/a 12 1524 1649 1688 N
+ EH Z R e n/a 12 1524 1649 1688 N
+ EH Z R i n/a 12 1541 1649 1688 N
+ EH Z R s n/a 12 1524 1649 1688 N
+ EH Z S b n/a 12 1524 1599 1662 N
+ EH Z S e n/a 12 1524 1587 1662 N
+ EH Z S i n/a 12 1538 1587 1662 N
+ EH Z S s n/a 12 1524 1587 1662 N
+ EH Z SH b n/a 12 1524 1599 1665 N
+ EH Z SH e n/a 12 1524 1587 1665 N
+ EH Z SH i n/a 12 1538 1587 1665 N
+ EH Z SH s n/a 12 1524 1587 1665 N
+ EH Z SIL e n/a 12 1524 1586 1652 N
+ EH Z SIL s n/a 12 1524 1586 1652 N
+ EH Z T b n/a 12 1524 1599 1652 N
+ EH Z T e n/a 12 1524 1586 1652 N
+ EH Z T i n/a 12 1538 1586 1652 N
+ EH Z T s n/a 12 1524 1586 1652 N
+ EH Z TH b n/a 12 1524 1599 1660 N
+ EH Z TH e n/a 12 1524 1586 1660 N
+ EH Z TH s n/a 12 1524 1586 1660 N
+ EH Z UH e n/a 12 1524 1586 1688 N
+ EH Z UH s n/a 12 1524 1586 1688 N
+ EH Z UW e n/a 12 1524 1586 1688 N
+ EH Z UW s n/a 12 1524 1586 1688 N
+ EH Z V b n/a 12 1524 1593 1675 N
+ EH Z V e n/a 12 1524 1593 1675 N
+ EH Z V i n/a 12 1538 1590 1671 N
+ EH Z V s n/a 12 1524 1593 1675 N
+ EH Z W e n/a 12 1524 1591 1691 N
+ EH Z W i n/a 12 1538 1590 1691 N
+ EH Z W s n/a 12 1524 1591 1691 N
+ EH Z Y e n/a 12 1524 1586 1654 N
+ EH Z Y i n/a 12 1538 1586 1654 N
+ EH Z Y s n/a 12 1524 1586 1654 N
+ EH Z Z b n/a 12 1521 1595 1669 N
+ EH Z Z e n/a 12 1521 1587 1670 N
+ EH Z Z s n/a 12 1521 1587 1670 N
+ EH Z ZH e n/a 12 1521 1587 1670 N
+ EH Z ZH s n/a 12 1521 1587 1670 N
+ EH ZH AA s n/a 12 1524 1583 1688 N
+ EH ZH AE s n/a 12 1524 1583 1654 N
+ EH ZH AH b n/a 12 1524 1602 1654 N
+ EH ZH AH s n/a 12 1524 1583 1654 N
+ EH ZH AO s n/a 12 1524 1583 1688 N
+ EH ZH AW s n/a 12 1524 1583 1654 N
+ EH ZH AY s n/a 12 1524 1583 1688 N
+ EH ZH B b n/a 12 1524 1591 1671 N
+ EH ZH B s n/a 12 1524 1591 1671 N
+ EH ZH CH b n/a 12 1524 1599 1651 N
+ EH ZH CH s n/a 12 1524 1584 1651 N
+ EH ZH D b n/a 12 1524 1619 1654 N
+ EH ZH D s n/a 12 1524 1618 1654 N
+ EH ZH DH b n/a 12 1524 1595 1667 N
+ EH ZH DH s n/a 12 1524 1585 1667 N
+ EH ZH EH b n/a 12 1524 1602 1654 N
+ EH ZH EH s n/a 12 1524 1583 1654 N
+ EH ZH ER b n/a 12 1524 1649 1688 N
+ EH ZH ER s n/a 12 1524 1649 1688 N
+ EH ZH EY s n/a 12 1524 1583 1654 N
+ EH ZH F b n/a 12 1524 1583 1660 N
+ EH ZH F s n/a 12 1524 1583 1660 N
+ EH ZH G b n/a 12 1524 1608 1659 N
+ EH ZH G s n/a 12 1524 1608 1659 N
+ EH ZH HH b n/a 12 1524 1599 1651 N
+ EH ZH HH s n/a 12 1524 1583 1651 N
+ EH ZH IH b n/a 12 1524 1602 1654 N
+ EH ZH IH s n/a 12 1524 1583 1654 N
+ EH ZH IY b n/a 12 1524 1602 1654 N
+ EH ZH IY s n/a 12 1524 1583 1654 N
+ EH ZH JH b n/a 12 1524 1602 1656 N
+ EH ZH JH s n/a 12 1524 1584 1656 N
+ EH ZH K b n/a 12 1524 1606 1657 N
+ EH ZH K s n/a 12 1524 1606 1657 N
+ EH ZH L b n/a 12 1524 1642 1691 N
+ EH ZH L i n/a 12 1528 1641 1691 N
+ EH ZH L s n/a 12 1524 1642 1691 N
+ EH ZH M b n/a 12 1524 1591 1673 N
+ EH ZH M s n/a 12 1524 1591 1673 N
+ EH ZH N b n/a 12 1524 1615 1677 N
+ EH ZH N i n/a 12 1529 1611 1678 N
+ EH ZH N s n/a 12 1524 1615 1677 N
+ EH ZH NG b n/a 12 1524 1608 1677 N
+ EH ZH NG i n/a 12 1529 1608 1678 N
+ EH ZH NG s n/a 12 1524 1608 1677 N
+ EH ZH OW s n/a 12 1524 1583 1688 N
+ EH ZH OY s n/a 12 1524 1583 1688 N
+ EH ZH P b n/a 12 1524 1583 1672 N
+ EH ZH P s n/a 12 1524 1583 1672 N
+ EH ZH R b n/a 12 1524 1649 1688 N
+ EH ZH R i n/a 12 1541 1649 1688 N
+ EH ZH R s n/a 12 1524 1649 1688 N
+ EH ZH S b n/a 12 1524 1599 1662 N
+ EH ZH S s n/a 12 1524 1583 1662 N
+ EH ZH SH b n/a 12 1524 1599 1665 N
+ EH ZH SH s n/a 12 1524 1583 1665 N
+ EH ZH SIL s n/a 12 1524 1583 1651 N
+ EH ZH T b n/a 12 1524 1599 1651 N
+ EH ZH T i n/a 12 1528 1584 1651 N
+ EH ZH T s n/a 12 1524 1584 1651 N
+ EH ZH TH b n/a 12 1524 1599 1660 N
+ EH ZH TH s n/a 12 1524 1585 1660 N
+ EH ZH UH s n/a 12 1524 1583 1688 N
+ EH ZH UW s n/a 12 1524 1583 1688 N
+ EH ZH V b n/a 12 1524 1593 1675 N
+ EH ZH V s n/a 12 1524 1593 1675 N
+ EH ZH W s n/a 12 1524 1591 1691 N
+ EH ZH Y s n/a 12 1524 1583 1654 N
+ EH ZH Z b n/a 12 1521 1595 1669 N
+ EH ZH Z s n/a 12 1521 1583 1670 N
+ EH ZH ZH s n/a 12 1521 1583 1670 N
+ ER AA AA b n/a 13 1743 1839 1888 N
+ ER AA AA e n/a 13 1742 1836 1887 N
+ ER AA AA i n/a 13 1742 1839 1888 N
+ ER AA AA s n/a 13 1742 1836 1888 N
+ ER AA AE b n/a 13 1743 1831 1850 N
+ ER AA AE e n/a 13 1742 1833 1851 N
+ ER AA AE s n/a 13 1742 1830 1848 N
+ ER AA AH b n/a 13 1743 1830 1848 N
+ ER AA AH e n/a 13 1742 1833 1852 N
+ ER AA AH i n/a 13 1742 1830 1847 N
+ ER AA AH s n/a 13 1742 1830 1848 N
+ ER AA AO b n/a 13 1743 1839 1888 N
+ ER AA AO e n/a 13 1742 1836 1886 N
+ ER AA AO s n/a 13 1742 1836 1886 N
+ ER AA AW b n/a 13 1743 1831 1850 N
+ ER AA AW e n/a 13 1742 1833 1852 N
+ ER AA AW s n/a 13 1742 1831 1848 N
+ ER AA AY b n/a 13 1743 1839 1888 N
+ ER AA AY e n/a 13 1742 1836 1887 N
+ ER AA AY s n/a 13 1742 1836 1888 N
+ ER AA B b n/a 13 1743 1787 1897 N
+ ER AA B e n/a 13 1742 1786 1897 N
+ ER AA B s n/a 13 1742 1786 1897 N
+ ER AA CH b n/a 13 1743 1770 1868 N
+ ER AA CH e n/a 13 1742 1770 1868 N
+ ER AA CH s n/a 13 1742 1773 1868 N
+ ER AA D b n/a 13 1743 1770 1866 N
+ ER AA D e n/a 13 1742 1770 1866 N
+ ER AA D s n/a 13 1742 1773 1866 N
+ ER AA DH b n/a 13 1743 1770 1872 N
+ ER AA DH e n/a 13 1742 1770 1872 N
+ ER AA DH s n/a 13 1742 1773 1874 N
+ ER AA EH b n/a 13 1743 1831 1849 N
+ ER AA EH e n/a 13 1742 1833 1851 N
+ ER AA EH s n/a 13 1742 1830 1849 N
+ ER AA ER b n/a 13 1743 1842 1890 N
+ ER AA ER e n/a 13 1742 1843 1890 N
+ ER AA ER s n/a 13 1742 1843 1890 N
+ ER AA EY b n/a 13 1743 1825 1858 N
+ ER AA EY e n/a 13 1742 1833 1851 N
+ ER AA EY i n/a 13 1742 1825 1857 N
+ ER AA EY s n/a 13 1742 1825 1854 N
+ ER AA F b n/a 13 1743 1787 1898 N
+ ER AA F e n/a 13 1742 1786 1898 N
+ ER AA F s n/a 13 1742 1786 1898 N
+ ER AA G b n/a 13 1743 1770 1871 N
+ ER AA G e n/a 13 1742 1770 1871 N
+ ER AA G s n/a 13 1742 1773 1871 N
+ ER AA HH b n/a 13 1743 1770 1859 N
+ ER AA HH e n/a 13 1742 1768 1859 N
+ ER AA HH s n/a 13 1742 1773 1859 N
+ ER AA IH b n/a 13 1743 1825 1858 N
+ ER AA IH e n/a 13 1742 1823 1853 N
+ ER AA IH i n/a 13 1742 1823 1856 N
+ ER AA IH s n/a 13 1742 1823 1854 N
+ ER AA IY b n/a 13 1743 1824 1855 N
+ ER AA IY e n/a 13 1742 1824 1853 N
+ ER AA IY i n/a 13 1742 1824 1855 N
+ ER AA IY s n/a 13 1742 1824 1854 N
+ ER AA JH b n/a 13 1743 1770 1866 N
+ ER AA JH e n/a 13 1742 1770 1866 N
+ ER AA JH s n/a 13 1742 1773 1866 N
+ ER AA K b n/a 13 1743 1770 1870 N
+ ER AA K e n/a 13 1742 1770 1870 N
+ ER AA K s n/a 13 1742 1773 1870 N
+ ER AA L b n/a 13 1743 1842 1884 N
+ ER AA L e n/a 13 1742 1840 1885 N
+ ER AA L i n/a 13 1742 1840 1885 N
+ ER AA L s n/a 13 1742 1840 1885 N
+ ER AA M b n/a 13 1743 1787 1891 N
+ ER AA M e n/a 13 1742 1786 1891 N
+ ER AA M i n/a 13 1742 1790 1892 N
+ ER AA M s n/a 13 1742 1786 1891 N
+ ER AA N b n/a 13 1743 1795 1862 N
+ ER AA N e n/a 13 1742 1792 1863 N
+ ER AA N i n/a 13 1742 1792 1862 N
+ ER AA N s n/a 13 1742 1792 1863 N
+ ER AA NG e n/a 13 1742 1769 1861 N
+ ER AA NG s n/a 13 1742 1773 1861 N
+ ER AA OW b n/a 13 1743 1839 1888 N
+ ER AA OW e n/a 13 1742 1836 1886 N
+ ER AA OW s n/a 13 1742 1836 1886 N
+ ER AA OY b n/a 13 1743 1839 1888 N
+ ER AA OY e n/a 13 1742 1836 1886 N
+ ER AA OY s n/a 13 1742 1836 1886 N
+ ER AA P b n/a 13 1743 1787 1896 N
+ ER AA P e n/a 13 1742 1786 1896 N
+ ER AA P s n/a 13 1742 1786 1896 N
+ ER AA R e n/a 13 1742 1843 1895 N
+ ER AA R s n/a 13 1742 1843 1895 N
+ ER AA S b n/a 13 1743 1770 1879 N
+ ER AA S e n/a 13 1742 1770 1879 N
+ ER AA S s n/a 13 1742 1773 1879 N
+ ER AA SH b n/a 13 1743 1770 1880 N
+ ER AA SH e n/a 13 1742 1770 1880 N
+ ER AA SH s n/a 13 1742 1773 1880 N
+ ER AA SIL e n/a 13 1742 1799 1900 N
+ ER AA SIL s n/a 13 1742 1799 1901 N
+ ER AA T b n/a 13 1743 1770 1868 N
+ ER AA T e n/a 13 1742 1770 1868 N
+ ER AA T i n/a 13 1742 1770 1867 N
+ ER AA T s n/a 13 1742 1773 1868 N
+ ER AA TH b n/a 13 1743 1770 1875 N
+ ER AA TH e n/a 13 1742 1770 1875 N
+ ER AA TH s n/a 13 1742 1773 1875 N
+ ER AA UH b n/a 13 1743 1842 1888 N
+ ER AA UH e n/a 13 1742 1840 1886 N
+ ER AA UH s n/a 13 1742 1840 1886 N
+ ER AA UW b n/a 13 1743 1839 1888 N
+ ER AA UW e n/a 13 1742 1836 1886 N
+ ER AA UW s n/a 13 1742 1836 1886 N
+ ER AA V b n/a 13 1743 1787 1889 N
+ ER AA V e n/a 13 1742 1786 1889 N
+ ER AA V s n/a 13 1742 1786 1889 N
+ ER AA W b n/a 13 1743 1845 1894 N
+ ER AA W e n/a 13 1742 1845 1894 N
+ ER AA W s n/a 13 1742 1845 1894 N
+ ER AA Y e n/a 13 1742 1823 1861 N
+ ER AA Y s n/a 13 1742 1823 1861 N
+ ER AA Z b n/a 13 1743 1770 1882 N
+ ER AA Z e n/a 13 1742 1770 1882 N
+ ER AA Z i n/a 13 1742 1770 1882 N
+ ER AA Z s n/a 13 1742 1773 1882 N
+ ER AA ZH e n/a 13 1742 1770 1882 N
+ ER AA ZH s n/a 13 1742 1773 1882 N
+ ER AE AA b n/a 13 1759 1839 1888 N
+ ER AE AA s n/a 13 1759 1836 1888 N
+ ER AE AE b n/a 13 1759 1831 1850 N
+ ER AE AE s n/a 13 1759 1830 1848 N
+ ER AE AH b n/a 13 1759 1829 1848 N
+ ER AE AH i n/a 13 1760 1829 1847 N
+ ER AE AH s n/a 13 1759 1830 1848 N
+ ER AE AO b n/a 13 1759 1839 1888 N
+ ER AE AO s n/a 13 1759 1836 1886 N
+ ER AE AW b n/a 13 1759 1831 1850 N
+ ER AE AW s n/a 13 1759 1831 1848 N
+ ER AE AY b n/a 13 1759 1839 1888 N
+ ER AE AY s n/a 13 1759 1836 1888 N
+ ER AE B b n/a 13 1759 1788 1897 N
+ ER AE B s n/a 13 1759 1786 1897 N
+ ER AE CH b n/a 13 1759 1770 1868 N
+ ER AE CH s n/a 13 1759 1773 1868 N
+ ER AE D b n/a 13 1762 1770 1866 N
+ ER AE D s n/a 13 1762 1773 1866 N
+ ER AE DH b n/a 13 1761 1770 1872 N
+ ER AE DH s n/a 13 1762 1773 1874 N
+ ER AE EH b n/a 13 1759 1831 1849 N
+ ER AE EH i n/a 13 1760 1831 1849 N
+ ER AE EH s n/a 13 1759 1830 1849 N
+ ER AE ER b n/a 13 1759 1842 1890 N
+ ER AE ER s n/a 13 1759 1843 1890 N
+ ER AE EY b n/a 13 1759 1825 1858 N
+ ER AE EY s n/a 13 1759 1825 1854 N
+ ER AE F b n/a 13 1759 1788 1898 N
+ ER AE F s n/a 13 1759 1786 1898 N
+ ER AE G b n/a 13 1759 1770 1871 N
+ ER AE G s n/a 13 1759 1773 1871 N
+ ER AE HH b n/a 13 1759 1770 1859 N
+ ER AE HH s n/a 13 1759 1773 1859 N
+ ER AE IH b n/a 13 1759 1825 1858 N
+ ER AE IH s n/a 13 1759 1823 1854 N
+ ER AE IY b n/a 13 1759 1824 1855 N
+ ER AE IY i n/a 13 1760 1824 1855 N
+ ER AE IY s n/a 13 1759 1824 1854 N
+ ER AE JH b n/a 13 1759 1770 1866 N
+ ER AE JH s n/a 13 1759 1773 1866 N
+ ER AE K b n/a 13 1759 1770 1870 N
+ ER AE K s n/a 13 1759 1773 1870 N
+ ER AE L b n/a 13 1759 1842 1884 N
+ ER AE L i n/a 13 1759 1840 1885 N
+ ER AE L s n/a 13 1759 1840 1885 N
+ ER AE M b n/a 13 1759 1788 1891 N
+ ER AE M i n/a 13 1759 1790 1892 N
+ ER AE M s n/a 13 1759 1786 1891 N
+ ER AE N b n/a 13 1762 1795 1862 N
+ ER AE N s n/a 13 1762 1792 1863 N
+ ER AE NG s n/a 13 1759 1773 1861 N
+ ER AE OW b n/a 13 1759 1839 1888 N
+ ER AE OW s n/a 13 1759 1836 1886 N
+ ER AE OY b n/a 13 1759 1839 1888 N
+ ER AE OY s n/a 13 1759 1836 1886 N
+ ER AE P b n/a 13 1759 1788 1896 N
+ ER AE P s n/a 13 1759 1786 1896 N
+ ER AE R s n/a 13 1759 1843 1895 N
+ ER AE S b n/a 13 1762 1784 1879 N
+ ER AE S s n/a 13 1762 1785 1879 N
+ ER AE SH b n/a 13 1759 1770 1880 N
+ ER AE SH s n/a 13 1759 1773 1880 N
+ ER AE SIL s n/a 13 1761 1799 1901 N
+ ER AE T b n/a 13 1762 1770 1868 N
+ ER AE T s n/a 13 1762 1773 1868 N
+ ER AE TH b n/a 13 1761 1770 1875 N
+ ER AE TH s n/a 13 1762 1773 1875 N
+ ER AE UH b n/a 13 1759 1842 1888 N
+ ER AE UH s n/a 13 1759 1840 1886 N
+ ER AE UW b n/a 13 1759 1839 1888 N
+ ER AE UW s n/a 13 1759 1836 1886 N
+ ER AE V b n/a 13 1759 1788 1889 N
+ ER AE V s n/a 13 1759 1786 1889 N
+ ER AE W b n/a 13 1759 1845 1893 N
+ ER AE W s n/a 13 1759 1845 1893 N
+ ER AE Y s n/a 13 1759 1823 1861 N
+ ER AE Z b n/a 13 1762 1766 1881 N
+ ER AE Z s n/a 13 1762 1766 1881 N
+ ER AE ZH s n/a 13 1759 1773 1881 N
+ ER AH AA b n/a 13 1759 1839 1888 N
+ ER AH AA e n/a 13 1760 1836 1887 N
+ ER AH AA s n/a 13 1759 1836 1888 N
+ ER AH AE b n/a 13 1759 1831 1850 N
+ ER AH AE e n/a 13 1760 1821 1851 N
+ ER AH AE s n/a 13 1759 1830 1848 N
+ ER AH AH b n/a 13 1759 1829 1848 N
+ ER AH AH e n/a 13 1760 1820 1852 N
+ ER AH AH i n/a 13 1760 1829 1847 N
+ ER AH AH s n/a 13 1759 1830 1848 N
+ ER AH AO b n/a 13 1759 1839 1888 N
+ ER AH AO e n/a 13 1760 1836 1886 N
+ ER AH AO i n/a 13 1759 1839 1888 N
+ ER AH AO s n/a 13 1759 1836 1886 N
+ ER AH AW b n/a 13 1759 1831 1850 N
+ ER AH AW e n/a 13 1760 1821 1852 N
+ ER AH AW s n/a 13 1759 1831 1848 N
+ ER AH AY b n/a 13 1759 1839 1888 N
+ ER AH AY e n/a 13 1760 1836 1887 N
+ ER AH AY s n/a 13 1759 1836 1888 N
+ ER AH B b n/a 13 1759 1788 1897 N
+ ER AH B e n/a 13 1760 1788 1897 N
+ ER AH B s n/a 13 1759 1786 1897 N
+ ER AH CH b n/a 13 1759 1768 1868 N
+ ER AH CH e n/a 13 1760 1770 1868 N
+ ER AH CH s n/a 13 1759 1773 1868 N
+ ER AH D b n/a 13 1762 1769 1866 N
+ ER AH D e n/a 13 1762 1770 1866 N
+ ER AH D s n/a 13 1762 1773 1866 N
+ ER AH DH b n/a 13 1761 1769 1872 N
+ ER AH DH e n/a 13 1762 1770 1872 N
+ ER AH DH s n/a 13 1762 1773 1874 N
+ ER AH EH b n/a 13 1759 1831 1849 N
+ ER AH EH e n/a 13 1760 1822 1851 N
+ ER AH EH s n/a 13 1759 1830 1849 N
+ ER AH ER b n/a 13 1759 1842 1890 N
+ ER AH ER e n/a 13 1760 1843 1890 N
+ ER AH ER s n/a 13 1759 1843 1890 N
+ ER AH EY b n/a 13 1759 1825 1858 N
+ ER AH EY e n/a 13 1760 1822 1851 N
+ ER AH EY s n/a 13 1759 1825 1854 N
+ ER AH F b n/a 13 1759 1788 1898 N
+ ER AH F e n/a 13 1760 1788 1898 N
+ ER AH F s n/a 13 1759 1786 1898 N
+ ER AH G b n/a 13 1759 1769 1871 N
+ ER AH G e n/a 13 1760 1770 1871 N
+ ER AH G s n/a 13 1759 1773 1871 N
+ ER AH HH b n/a 13 1759 1768 1859 N
+ ER AH HH e n/a 13 1760 1768 1859 N
+ ER AH HH s n/a 13 1759 1773 1859 N
+ ER AH IH b n/a 13 1759 1825 1858 N
+ ER AH IH e n/a 13 1760 1822 1853 N
+ ER AH IH s n/a 13 1759 1823 1854 N
+ ER AH IY b n/a 13 1759 1824 1855 N
+ ER AH IY e n/a 13 1760 1822 1853 N
+ ER AH IY i n/a 13 1760 1824 1855 N
+ ER AH IY s n/a 13 1759 1824 1854 N
+ ER AH JH b n/a 13 1759 1769 1866 N
+ ER AH JH e n/a 13 1760 1770 1866 N
+ ER AH JH s n/a 13 1759 1773 1866 N
+ ER AH K b n/a 13 1759 1768 1870 N
+ ER AH K e n/a 13 1760 1770 1870 N
+ ER AH K s n/a 13 1759 1773 1870 N
+ ER AH L b n/a 13 1759 1842 1884 N
+ ER AH L e n/a 13 1760 1840 1885 N
+ ER AH L s n/a 13 1759 1840 1885 N
+ ER AH M b n/a 13 1759 1788 1891 N
+ ER AH M e n/a 13 1760 1788 1891 N
+ ER AH M s n/a 13 1759 1786 1891 N
+ ER AH N b n/a 13 1762 1795 1862 N
+ ER AH N e n/a 13 1762 1792 1863 N
+ ER AH N s n/a 13 1762 1792 1863 N
+ ER AH NG e n/a 13 1760 1769 1861 N
+ ER AH NG s n/a 13 1759 1773 1861 N
+ ER AH OW b n/a 13 1759 1839 1888 N
+ ER AH OW e n/a 13 1760 1836 1886 N
+ ER AH OW s n/a 13 1759 1836 1886 N
+ ER AH OY b n/a 13 1759 1839 1888 N
+ ER AH OY e n/a 13 1760 1836 1886 N
+ ER AH OY s n/a 13 1759 1836 1886 N
+ ER AH P b n/a 13 1759 1788 1896 N
+ ER AH P e n/a 13 1760 1788 1896 N
+ ER AH P s n/a 13 1759 1786 1896 N
+ ER AH R e n/a 13 1760 1843 1895 N
+ ER AH R s n/a 13 1759 1843 1895 N
+ ER AH S b n/a 13 1762 1784 1879 N
+ ER AH S e n/a 13 1762 1784 1879 N
+ ER AH S s n/a 13 1762 1785 1879 N
+ ER AH SH b n/a 13 1759 1768 1880 N
+ ER AH SH e n/a 13 1760 1770 1880 N
+ ER AH SH s n/a 13 1759 1773 1880 N
+ ER AH SIL e n/a 13 1761 1796 1899 N
+ ER AH SIL s n/a 13 1761 1799 1901 N
+ ER AH T b n/a 13 1762 1768 1868 N
+ ER AH T e n/a 13 1762 1770 1868 N
+ ER AH T i n/a 13 1761 1768 1867 N
+ ER AH T s n/a 13 1762 1773 1868 N
+ ER AH TH b n/a 13 1761 1769 1875 N
+ ER AH TH e n/a 13 1762 1770 1875 N
+ ER AH TH s n/a 13 1762 1773 1875 N
+ ER AH UH b n/a 13 1759 1842 1888 N
+ ER AH UH e n/a 13 1760 1840 1886 N
+ ER AH UH s n/a 13 1759 1840 1886 N
+ ER AH UW b n/a 13 1759 1839 1888 N
+ ER AH UW e n/a 13 1760 1836 1886 N
+ ER AH UW s n/a 13 1759 1836 1886 N
+ ER AH V b n/a 13 1759 1788 1889 N
+ ER AH V e n/a 13 1760 1788 1889 N
+ ER AH V s n/a 13 1759 1786 1889 N
+ ER AH W b n/a 13 1759 1845 1893 N
+ ER AH W e n/a 13 1760 1845 1893 N
+ ER AH W s n/a 13 1759 1845 1893 N
+ ER AH Y e n/a 13 1760 1822 1861 N
+ ER AH Y s n/a 13 1759 1823 1861 N
+ ER AH Z b n/a 13 1762 1766 1881 N
+ ER AH Z e n/a 13 1762 1766 1881 N
+ ER AH Z i n/a 13 1762 1766 1881 N
+ ER AH Z s n/a 13 1762 1766 1881 N
+ ER AH ZH e n/a 13 1760 1770 1881 N
+ ER AH ZH s n/a 13 1759 1773 1881 N
+ ER AO AA b n/a 13 1743 1839 1888 N
+ ER AO AA e n/a 13 1742 1836 1887 N
+ ER AO AA s n/a 13 1742 1836 1888 N
+ ER AO AE b n/a 13 1743 1831 1850 N
+ ER AO AE e n/a 13 1742 1833 1851 N
+ ER AO AE s n/a 13 1742 1830 1848 N
+ ER AO AH b n/a 13 1743 1830 1848 N
+ ER AO AH e n/a 13 1742 1833 1852 N
+ ER AO AH s n/a 13 1742 1830 1848 N
+ ER AO AO b n/a 13 1743 1839 1888 N
+ ER AO AO e n/a 13 1742 1836 1886 N
+ ER AO AO s n/a 13 1742 1836 1886 N
+ ER AO AW b n/a 13 1743 1831 1850 N
+ ER AO AW e n/a 13 1742 1833 1852 N
+ ER AO AW s n/a 13 1742 1831 1848 N
+ ER AO AY b n/a 13 1743 1839 1888 N
+ ER AO AY e n/a 13 1742 1836 1887 N
+ ER AO AY s n/a 13 1742 1836 1888 N
+ ER AO B b n/a 13 1743 1787 1897 N
+ ER AO B e n/a 13 1742 1786 1897 N
+ ER AO B s n/a 13 1742 1786 1897 N
+ ER AO CH b n/a 13 1743 1770 1868 N
+ ER AO CH e n/a 13 1742 1770 1868 N
+ ER AO CH s n/a 13 1742 1773 1868 N
+ ER AO D b n/a 13 1743 1770 1866 N
+ ER AO D e n/a 13 1742 1770 1866 N
+ ER AO D s n/a 13 1742 1773 1866 N
+ ER AO DH b n/a 13 1743 1770 1874 N
+ ER AO DH e n/a 13 1742 1770 1874 N
+ ER AO DH s n/a 13 1742 1773 1874 N
+ ER AO EH b n/a 13 1743 1831 1849 N
+ ER AO EH e n/a 13 1742 1833 1851 N
+ ER AO EH s n/a 13 1742 1830 1849 N
+ ER AO ER b n/a 13 1743 1842 1890 N
+ ER AO ER e n/a 13 1742 1843 1890 N
+ ER AO ER s n/a 13 1742 1843 1890 N
+ ER AO EY b n/a 13 1743 1825 1858 N
+ ER AO EY e n/a 13 1742 1833 1851 N
+ ER AO EY s n/a 13 1742 1825 1854 N
+ ER AO F b n/a 13 1743 1787 1898 N
+ ER AO F e n/a 13 1742 1786 1898 N
+ ER AO F s n/a 13 1742 1786 1898 N
+ ER AO G b n/a 13 1743 1770 1871 N
+ ER AO G e n/a 13 1742 1770 1871 N
+ ER AO G s n/a 13 1742 1773 1871 N
+ ER AO HH b n/a 13 1743 1770 1859 N
+ ER AO HH e n/a 13 1742 1768 1859 N
+ ER AO HH s n/a 13 1742 1773 1859 N
+ ER AO IH b n/a 13 1743 1825 1858 N
+ ER AO IH e n/a 13 1742 1823 1853 N
+ ER AO IH s n/a 13 1742 1823 1854 N
+ ER AO IY b n/a 13 1743 1824 1855 N
+ ER AO IY e n/a 13 1742 1824 1853 N
+ ER AO IY s n/a 13 1742 1824 1854 N
+ ER AO JH b n/a 13 1743 1770 1866 N
+ ER AO JH e n/a 13 1742 1770 1866 N
+ ER AO JH s n/a 13 1742 1773 1866 N
+ ER AO K b n/a 13 1743 1770 1870 N
+ ER AO K e n/a 13 1742 1770 1870 N
+ ER AO K s n/a 13 1742 1773 1870 N
+ ER AO L b n/a 13 1743 1842 1884 N
+ ER AO L e n/a 13 1742 1840 1885 N
+ ER AO L s n/a 13 1742 1840 1885 N
+ ER AO M b n/a 13 1743 1787 1891 N
+ ER AO M e n/a 13 1742 1786 1891 N
+ ER AO M s n/a 13 1742 1786 1891 N
+ ER AO N b n/a 13 1743 1795 1862 N
+ ER AO N e n/a 13 1742 1792 1863 N
+ ER AO N s n/a 13 1742 1792 1863 N
+ ER AO NG e n/a 13 1742 1769 1861 N
+ ER AO NG s n/a 13 1742 1773 1861 N
+ ER AO OW b n/a 13 1743 1839 1888 N
+ ER AO OW e n/a 13 1742 1836 1886 N
+ ER AO OW s n/a 13 1742 1836 1886 N
+ ER AO OY b n/a 13 1743 1839 1888 N
+ ER AO OY e n/a 13 1742 1836 1886 N
+ ER AO OY s n/a 13 1742 1836 1886 N
+ ER AO P b n/a 13 1743 1787 1896 N
+ ER AO P e n/a 13 1742 1786 1896 N
+ ER AO P s n/a 13 1742 1786 1896 N
+ ER AO R e n/a 13 1742 1843 1895 N
+ ER AO R i n/a 13 1742 1843 1895 N
+ ER AO R s n/a 13 1742 1843 1895 N
+ ER AO S b n/a 13 1743 1770 1879 N
+ ER AO S e n/a 13 1742 1770 1879 N
+ ER AO S s n/a 13 1742 1773 1879 N
+ ER AO SH b n/a 13 1743 1770 1880 N
+ ER AO SH e n/a 13 1742 1770 1880 N
+ ER AO SH s n/a 13 1742 1773 1880 N
+ ER AO SIL e n/a 13 1742 1799 1900 N
+ ER AO SIL s n/a 13 1742 1799 1901 N
+ ER AO T b n/a 13 1743 1770 1868 N
+ ER AO T e n/a 13 1742 1770 1868 N
+ ER AO T s n/a 13 1742 1773 1868 N
+ ER AO TH b n/a 13 1743 1770 1875 N
+ ER AO TH e n/a 13 1742 1770 1875 N
+ ER AO TH s n/a 13 1742 1773 1875 N
+ ER AO UH b n/a 13 1743 1842 1888 N
+ ER AO UH e n/a 13 1742 1840 1886 N
+ ER AO UH s n/a 13 1742 1840 1886 N
+ ER AO UW b n/a 13 1743 1839 1888 N
+ ER AO UW e n/a 13 1742 1836 1886 N
+ ER AO UW s n/a 13 1742 1836 1886 N
+ ER AO V b n/a 13 1743 1787 1889 N
+ ER AO V e n/a 13 1742 1786 1889 N
+ ER AO V s n/a 13 1742 1786 1889 N
+ ER AO W b n/a 13 1743 1845 1894 N
+ ER AO W e n/a 13 1742 1845 1894 N
+ ER AO W s n/a 13 1742 1845 1894 N
+ ER AO Y e n/a 13 1742 1823 1861 N
+ ER AO Y s n/a 13 1742 1823 1861 N
+ ER AO Z b n/a 13 1743 1770 1882 N
+ ER AO Z e n/a 13 1742 1770 1882 N
+ ER AO Z s n/a 13 1742 1773 1882 N
+ ER AO ZH e n/a 13 1742 1770 1882 N
+ ER AO ZH s n/a 13 1742 1773 1882 N
+ ER AW AA b n/a 13 1746 1839 1888 N
+ ER AW AA e n/a 13 1746 1836 1887 N
+ ER AW AA s n/a 13 1746 1836 1888 N
+ ER AW AE b n/a 13 1746 1831 1850 N
+ ER AW AE e n/a 13 1746 1833 1851 N
+ ER AW AE s n/a 13 1746 1830 1848 N
+ ER AW AH b n/a 13 1746 1829 1848 N
+ ER AW AH e n/a 13 1746 1833 1852 N
+ ER AW AH i n/a 13 1746 1829 1847 N
+ ER AW AH s n/a 13 1746 1830 1848 N
+ ER AW AO b n/a 13 1746 1839 1888 N
+ ER AW AO e n/a 13 1746 1836 1886 N
+ ER AW AO s n/a 13 1746 1836 1886 N
+ ER AW AW b n/a 13 1746 1831 1850 N
+ ER AW AW e n/a 13 1746 1833 1852 N
+ ER AW AW s n/a 13 1746 1831 1848 N
+ ER AW AY b n/a 13 1746 1839 1888 N
+ ER AW AY e n/a 13 1746 1836 1887 N
+ ER AW AY s n/a 13 1746 1836 1888 N
+ ER AW B b n/a 13 1746 1787 1897 N
+ ER AW B e n/a 13 1746 1786 1897 N
+ ER AW B i n/a 13 1746 1790 1897 N
+ ER AW B s n/a 13 1746 1786 1897 N
+ ER AW CH b n/a 13 1746 1773 1868 N
+ ER AW CH e n/a 13 1746 1773 1868 N
+ ER AW CH s n/a 13 1746 1773 1868 N
+ ER AW D b n/a 13 1746 1774 1866 N
+ ER AW D e n/a 13 1746 1774 1866 N
+ ER AW D i n/a 13 1746 1774 1864 N
+ ER AW D s n/a 13 1746 1774 1866 N
+ ER AW DH b n/a 13 1746 1774 1872 N
+ ER AW DH e n/a 13 1746 1774 1872 N
+ ER AW DH s n/a 13 1746 1774 1874 N
+ ER AW EH b n/a 13 1746 1831 1849 N
+ ER AW EH e n/a 13 1746 1833 1851 N
+ ER AW EH i n/a 13 1746 1831 1849 N
+ ER AW EH s n/a 13 1746 1830 1849 N
+ ER AW ER b n/a 13 1746 1835 1890 N
+ ER AW ER e n/a 13 1746 1835 1890 N
+ ER AW ER s n/a 13 1746 1835 1890 N
+ ER AW EY b n/a 13 1746 1825 1858 N
+ ER AW EY e n/a 13 1746 1833 1851 N
+ ER AW EY s n/a 13 1746 1825 1854 N
+ ER AW F b n/a 13 1746 1787 1898 N
+ ER AW F e n/a 13 1746 1786 1898 N
+ ER AW F i n/a 13 1746 1793 1898 N
+ ER AW F s n/a 13 1746 1786 1898 N
+ ER AW G b n/a 13 1746 1773 1871 N
+ ER AW G e n/a 13 1746 1773 1871 N
+ ER AW G i n/a 13 1746 1773 1871 N
+ ER AW G s n/a 13 1746 1773 1871 N
+ ER AW HH b n/a 13 1746 1773 1859 N
+ ER AW HH e n/a 13 1746 1773 1859 N
+ ER AW HH i n/a 13 1746 1773 1859 N
+ ER AW HH s n/a 13 1746 1773 1859 N
+ ER AW IH b n/a 13 1746 1825 1858 N
+ ER AW IH e n/a 13 1746 1823 1853 N
+ ER AW IH i n/a 13 1746 1823 1856 N
+ ER AW IH s n/a 13 1746 1823 1854 N
+ ER AW IY b n/a 13 1746 1824 1855 N
+ ER AW IY e n/a 13 1746 1824 1853 N
+ ER AW IY i n/a 13 1746 1824 1855 N
+ ER AW IY s n/a 13 1746 1824 1854 N
+ ER AW JH b n/a 13 1746 1773 1866 N
+ ER AW JH e n/a 13 1746 1773 1866 N
+ ER AW JH i n/a 13 1746 1773 1864 N
+ ER AW JH s n/a 13 1746 1773 1866 N
+ ER AW K b n/a 13 1746 1773 1869 N
+ ER AW K e n/a 13 1746 1773 1870 N
+ ER AW K i n/a 13 1746 1773 1869 N
+ ER AW K s n/a 13 1746 1773 1869 N
+ ER AW L b n/a 13 1746 1837 1884 N
+ ER AW L e n/a 13 1746 1835 1885 N
+ ER AW L i n/a 13 1746 1834 1885 N
+ ER AW L s n/a 13 1746 1835 1885 N
+ ER AW M b n/a 13 1746 1787 1891 N
+ ER AW M e n/a 13 1746 1786 1891 N
+ ER AW M i n/a 13 1746 1790 1892 N
+ ER AW M s n/a 13 1746 1786 1891 N
+ ER AW N b n/a 13 1746 1795 1862 N
+ ER AW N e n/a 13 1746 1792 1863 N
+ ER AW N i n/a 13 1746 1792 1862 N
+ ER AW N s n/a 13 1746 1792 1863 N
+ ER AW NG e n/a 13 1746 1773 1861 N
+ ER AW NG s n/a 13 1746 1773 1861 N
+ ER AW OW b n/a 13 1746 1839 1888 N
+ ER AW OW e n/a 13 1746 1836 1886 N
+ ER AW OW i n/a 13 1746 1834 1888 N
+ ER AW OW s n/a 13 1746 1836 1886 N
+ ER AW OY b n/a 13 1746 1839 1888 N
+ ER AW OY e n/a 13 1746 1836 1886 N
+ ER AW OY s n/a 13 1746 1836 1886 N
+ ER AW P b n/a 13 1746 1787 1896 N
+ ER AW P e n/a 13 1746 1786 1896 N
+ ER AW P i n/a 13 1746 1793 1896 N
+ ER AW P s n/a 13 1746 1786 1896 N
+ ER AW R e n/a 13 1746 1835 1895 N
+ ER AW R i n/a 13 1746 1834 1895 N
+ ER AW R s n/a 13 1746 1835 1895 N
+ ER AW S b n/a 13 1746 1773 1879 N
+ ER AW S e n/a 13 1746 1773 1879 N
+ ER AW S i n/a 13 1746 1773 1879 N
+ ER AW S s n/a 13 1746 1773 1879 N
+ ER AW SH b n/a 13 1746 1773 1880 N
+ ER AW SH e n/a 13 1746 1773 1880 N
+ ER AW SH s n/a 13 1746 1773 1880 N
+ ER AW SIL e n/a 13 1746 1799 1900 N
+ ER AW SIL s n/a 13 1746 1799 1901 N
+ ER AW T b n/a 13 1746 1774 1868 N
+ ER AW T e n/a 13 1746 1774 1868 N
+ ER AW T i n/a 13 1746 1774 1867 N
+ ER AW T s n/a 13 1746 1774 1868 N
+ ER AW TH b n/a 13 1746 1773 1875 N
+ ER AW TH e n/a 13 1746 1773 1875 N
+ ER AW TH i n/a 13 1746 1773 1875 N
+ ER AW TH s n/a 13 1746 1773 1875 N
+ ER AW UH b n/a 13 1746 1836 1888 N
+ ER AW UH e n/a 13 1746 1835 1886 N
+ ER AW UH s n/a 13 1746 1835 1886 N
+ ER AW UW b n/a 13 1746 1839 1888 N
+ ER AW UW e n/a 13 1746 1836 1886 N
+ ER AW UW s n/a 13 1746 1836 1886 N
+ ER AW V b n/a 13 1746 1787 1889 N
+ ER AW V e n/a 13 1746 1786 1889 N
+ ER AW V s n/a 13 1746 1786 1889 N
+ ER AW W b n/a 13 1746 1845 1894 N
+ ER AW W e n/a 13 1746 1845 1894 N
+ ER AW W i n/a 13 1746 1845 1894 N
+ ER AW W s n/a 13 1746 1845 1894 N
+ ER AW Y e n/a 13 1746 1823 1861 N
+ ER AW Y s n/a 13 1746 1823 1861 N
+ ER AW Z b n/a 13 1746 1774 1882 N
+ ER AW Z e n/a 13 1746 1774 1882 N
+ ER AW Z i n/a 13 1746 1774 1882 N
+ ER AW Z s n/a 13 1746 1774 1882 N
+ ER AW ZH e n/a 13 1746 1774 1882 N
+ ER AW ZH s n/a 13 1746 1774 1882 N
+ ER AY AA b n/a 13 1698 1839 1888 N
+ ER AY AA e n/a 13 1696 1836 1887 N
+ ER AY AA i n/a 13 1696 1839 1888 N
+ ER AY AA s n/a 13 1696 1836 1888 N
+ ER AY AE b n/a 13 1698 1831 1850 N
+ ER AY AE e n/a 13 1696 1821 1851 N
+ ER AY AE s n/a 13 1696 1830 1848 N
+ ER AY AH b n/a 13 1698 1830 1848 N
+ ER AY AH e n/a 13 1696 1820 1852 N
+ ER AY AH i n/a 13 1696 1830 1847 N
+ ER AY AH s n/a 13 1696 1830 1848 N
+ ER AY AO b n/a 13 1698 1839 1888 N
+ ER AY AO e n/a 13 1696 1836 1886 N
+ ER AY AO s n/a 13 1696 1836 1886 N
+ ER AY AW b n/a 13 1698 1831 1850 N
+ ER AY AW e n/a 13 1696 1821 1852 N
+ ER AY AW s n/a 13 1696 1831 1848 N
+ ER AY AY b n/a 13 1698 1839 1888 N
+ ER AY AY e n/a 13 1696 1836 1887 N
+ ER AY AY i n/a 13 1696 1839 1888 N
+ ER AY AY s n/a 13 1696 1836 1888 N
+ ER AY B b n/a 13 1696 1788 1897 N
+ ER AY B e n/a 13 1696 1788 1897 N
+ ER AY B i n/a 13 1696 1790 1897 N
+ ER AY B s n/a 13 1696 1786 1897 N
+ ER AY CH b n/a 13 1696 1772 1868 N
+ ER AY CH e n/a 13 1696 1772 1868 N
+ ER AY CH s n/a 13 1696 1773 1868 N
+ ER AY D b n/a 13 1696 1772 1866 N
+ ER AY D e n/a 13 1696 1772 1866 N
+ ER AY D i n/a 13 1696 1772 1865 N
+ ER AY D s n/a 13 1696 1773 1866 N
+ ER AY DH b n/a 13 1696 1772 1872 N
+ ER AY DH e n/a 13 1696 1772 1872 N
+ ER AY DH s n/a 13 1696 1773 1874 N
+ ER AY EH b n/a 13 1698 1831 1849 N
+ ER AY EH e n/a 13 1696 1822 1851 N
+ ER AY EH i n/a 13 1696 1831 1849 N
+ ER AY EH s n/a 13 1696 1830 1849 N
+ ER AY ER b n/a 13 1698 1842 1890 N
+ ER AY ER e n/a 13 1696 1843 1890 N
+ ER AY ER i n/a 13 1696 1843 1890 N
+ ER AY ER s n/a 13 1696 1843 1890 N
+ ER AY EY b n/a 13 1698 1825 1858 N
+ ER AY EY e n/a 13 1696 1822 1851 N
+ ER AY EY s n/a 13 1696 1825 1854 N
+ ER AY F b n/a 13 1696 1788 1898 N
+ ER AY F e n/a 13 1696 1788 1898 N
+ ER AY F i n/a 13 1696 1790 1898 N
+ ER AY F s n/a 13 1696 1786 1898 N
+ ER AY G b n/a 13 1696 1772 1871 N
+ ER AY G e n/a 13 1696 1772 1871 N
+ ER AY G s n/a 13 1696 1773 1871 N
+ ER AY HH b n/a 13 1696 1772 1859 N
+ ER AY HH e n/a 13 1696 1768 1859 N
+ ER AY HH i n/a 13 1696 1772 1859 N
+ ER AY HH s n/a 13 1696 1773 1859 N
+ ER AY IH b n/a 13 1698 1825 1858 N
+ ER AY IH e n/a 13 1696 1822 1853 N
+ ER AY IH i n/a 13 1696 1823 1856 N
+ ER AY IH s n/a 13 1696 1823 1854 N
+ ER AY IY b n/a 13 1698 1824 1855 N
+ ER AY IY e n/a 13 1696 1822 1853 N
+ ER AY IY i n/a 13 1696 1824 1855 N
+ ER AY IY s n/a 13 1696 1824 1854 N
+ ER AY JH b n/a 13 1696 1772 1866 N
+ ER AY JH e n/a 13 1696 1772 1866 N
+ ER AY JH s n/a 13 1696 1773 1866 N
+ ER AY K b n/a 13 1696 1772 1870 N
+ ER AY K e n/a 13 1696 1772 1870 N
+ ER AY K i n/a 13 1696 1772 1870 N
+ ER AY K s n/a 13 1696 1773 1870 N
+ ER AY L b n/a 13 1696 1842 1884 N
+ ER AY L e n/a 13 1696 1840 1885 N
+ ER AY L i n/a 13 1696 1840 1885 N
+ ER AY L s n/a 13 1696 1840 1885 N
+ ER AY M b n/a 13 1696 1788 1891 N
+ ER AY M e n/a 13 1696 1788 1891 N
+ ER AY M i n/a 13 1696 1790 1892 N
+ ER AY M s n/a 13 1696 1786 1891 N
+ ER AY N b n/a 13 1696 1795 1862 N
+ ER AY N e n/a 13 1696 1792 1863 N
+ ER AY N i n/a 13 1696 1792 1862 N
+ ER AY N s n/a 13 1696 1792 1863 N
+ ER AY NG e n/a 13 1696 1769 1861 N
+ ER AY NG s n/a 13 1696 1773 1861 N
+ ER AY OW b n/a 13 1698 1839 1888 N
+ ER AY OW e n/a 13 1696 1836 1886 N
+ ER AY OW s n/a 13 1696 1836 1886 N
+ ER AY OY b n/a 13 1698 1839 1888 N
+ ER AY OY e n/a 13 1696 1836 1886 N
+ ER AY OY s n/a 13 1696 1836 1886 N
+ ER AY P b n/a 13 1696 1788 1896 N
+ ER AY P e n/a 13 1696 1788 1896 N
+ ER AY P i n/a 13 1696 1790 1896 N
+ ER AY P s n/a 13 1696 1786 1896 N
+ ER AY R e n/a 13 1696 1843 1895 N
+ ER AY R i n/a 13 1696 1843 1895 N
+ ER AY R s n/a 13 1696 1843 1895 N
+ ER AY S b n/a 13 1696 1784 1879 N
+ ER AY S e n/a 13 1696 1784 1879 N
+ ER AY S i n/a 13 1696 1783 1879 N
+ ER AY S s n/a 13 1696 1785 1879 N
+ ER AY SH b n/a 13 1696 1772 1880 N
+ ER AY SH e n/a 13 1696 1772 1880 N
+ ER AY SH i n/a 13 1696 1772 1880 N
+ ER AY SH s n/a 13 1696 1773 1880 N
+ ER AY SIL e n/a 13 1696 1797 1899 N
+ ER AY SIL s n/a 13 1696 1799 1901 N
+ ER AY T b n/a 13 1696 1772 1868 N
+ ER AY T e n/a 13 1696 1772 1868 N
+ ER AY T i n/a 13 1696 1772 1867 N
+ ER AY T s n/a 13 1696 1773 1868 N
+ ER AY TH b n/a 13 1696 1772 1875 N
+ ER AY TH e n/a 13 1696 1772 1875 N
+ ER AY TH s n/a 13 1696 1773 1875 N
+ ER AY UH b n/a 13 1698 1842 1888 N
+ ER AY UH e n/a 13 1696 1840 1886 N
+ ER AY UH s n/a 13 1696 1840 1886 N
+ ER AY UW b n/a 13 1698 1839 1888 N
+ ER AY UW e n/a 13 1696 1836 1886 N
+ ER AY UW s n/a 13 1696 1836 1886 N
+ ER AY V b n/a 13 1696 1788 1889 N
+ ER AY V e n/a 13 1696 1788 1889 N
+ ER AY V s n/a 13 1696 1786 1889 N
+ ER AY W b n/a 13 1696 1845 1893 N
+ ER AY W e n/a 13 1696 1845 1893 N
+ ER AY W i n/a 13 1696 1845 1893 N
+ ER AY W s n/a 13 1696 1845 1893 N
+ ER AY Y e n/a 13 1696 1822 1861 N
+ ER AY Y s n/a 13 1696 1823 1861 N
+ ER AY Z b n/a 13 1696 1766 1881 N
+ ER AY Z e n/a 13 1696 1766 1881 N
+ ER AY Z i n/a 13 1696 1766 1881 N
+ ER AY Z s n/a 13 1696 1766 1881 N
+ ER AY ZH e n/a 13 1696 1772 1881 N
+ ER AY ZH s n/a 13 1696 1773 1881 N
+ ER B AA b n/a 13 1759 1839 1888 N
+ ER B AA e n/a 13 1760 1838 1887 N
+ ER B AA i n/a 13 1759 1839 1888 N
+ ER B AA s n/a 13 1759 1838 1888 N
+ ER B AE b n/a 13 1759 1831 1850 N
+ ER B AE e n/a 13 1760 1833 1851 N
+ ER B AE i n/a 13 1760 1831 1850 N
+ ER B AE s n/a 13 1759 1831 1848 N
+ ER B AH b n/a 13 1759 1832 1848 N
+ ER B AH e n/a 13 1760 1833 1848 N
+ ER B AH i n/a 13 1760 1832 1847 N
+ ER B AH s n/a 13 1759 1832 1848 N
+ ER B AO b n/a 13 1759 1839 1888 N
+ ER B AO e n/a 13 1760 1838 1886 N
+ ER B AO i n/a 13 1759 1839 1888 N
+ ER B AO s n/a 13 1759 1838 1886 N
+ ER B AW b n/a 13 1759 1831 1850 N
+ ER B AW e n/a 13 1760 1833 1852 N
+ ER B AW i n/a 13 1760 1831 1850 N
+ ER B AW s n/a 13 1759 1831 1848 N
+ ER B AY b n/a 13 1759 1839 1888 N
+ ER B AY e n/a 13 1760 1838 1887 N
+ ER B AY i n/a 13 1759 1839 1888 N
+ ER B AY s n/a 13 1759 1838 1888 N
+ ER B B b n/a 13 1763 1805 1897 N
+ ER B B e n/a 13 1763 1805 1897 N
+ ER B B i n/a 13 1763 1804 1897 N
+ ER B B s n/a 13 1763 1805 1897 N
+ ER B CH b n/a 13 1763 1808 1868 N
+ ER B CH e n/a 13 1763 1808 1868 N
+ ER B CH i n/a 13 1763 1808 1867 N
+ ER B CH s n/a 13 1763 1808 1868 N
+ ER B D b n/a 13 1763 1810 1866 N
+ ER B D e n/a 13 1763 1815 1866 N
+ ER B D i n/a 13 1763 1810 1864 N
+ ER B D s n/a 13 1763 1810 1866 N
+ ER B DH b n/a 13 1763 1812 1872 N
+ ER B DH e n/a 13 1763 1819 1872 N
+ ER B DH i n/a 13 1763 1812 1872 N
+ ER B DH s n/a 13 1763 1812 1874 N
+ ER B EH b n/a 13 1759 1831 1849 N
+ ER B EH e n/a 13 1760 1833 1851 N
+ ER B EH i n/a 13 1760 1831 1849 N
+ ER B EH s n/a 13 1759 1831 1849 N
+ ER B ER b n/a 13 1759 1843 1890 N
+ ER B ER e n/a 13 1760 1843 1890 N
+ ER B ER i n/a 13 1759 1843 1890 N
+ ER B ER s n/a 13 1759 1843 1890 N
+ ER B EY b n/a 13 1759 1827 1858 N
+ ER B EY e n/a 13 1760 1833 1851 N
+ ER B EY i n/a 13 1760 1827 1857 N
+ ER B EY s n/a 13 1759 1827 1854 N
+ ER B F b n/a 13 1763 1805 1898 N
+ ER B F e n/a 13 1763 1805 1898 N
+ ER B F i n/a 13 1763 1805 1898 N
+ ER B F s n/a 13 1763 1805 1898 N
+ ER B G b n/a 13 1763 1810 1871 N
+ ER B G e n/a 13 1763 1810 1871 N
+ ER B G i n/a 13 1763 1810 1871 N
+ ER B G s n/a 13 1763 1810 1871 N
+ ER B HH b n/a 13 1763 1809 1859 N
+ ER B HH e n/a 13 1763 1809 1859 N
+ ER B HH i n/a 13 1763 1809 1859 N
+ ER B HH s n/a 13 1763 1809 1859 N
+ ER B IH b n/a 13 1759 1826 1858 N
+ ER B IH e n/a 13 1760 1826 1854 N
+ ER B IH i n/a 13 1760 1826 1856 N
+ ER B IH s n/a 13 1759 1826 1854 N
+ ER B IY b n/a 13 1759 1826 1855 N
+ ER B IY e n/a 13 1760 1826 1854 N
+ ER B IY i n/a 13 1760 1826 1855 N
+ ER B IY s n/a 13 1759 1826 1854 N
+ ER B JH b n/a 13 1763 1810 1866 N
+ ER B JH e n/a 13 1763 1810 1866 N
+ ER B JH i n/a 13 1763 1810 1864 N
+ ER B JH s n/a 13 1763 1810 1866 N
+ ER B K b n/a 13 1763 1809 1870 N
+ ER B K e n/a 13 1763 1809 1870 N
+ ER B K i n/a 13 1763 1809 1870 N
+ ER B K s n/a 13 1763 1809 1870 N
+ ER B L b n/a 13 1763 1842 1884 N
+ ER B L e n/a 13 1763 1841 1885 N
+ ER B L i n/a 13 1763 1841 1885 N
+ ER B L s n/a 13 1763 1841 1885 N
+ ER B M b n/a 13 1763 1805 1891 N
+ ER B M e n/a 13 1763 1805 1891 N
+ ER B M i n/a 13 1763 1804 1892 N
+ ER B M s n/a 13 1763 1805 1891 N
+ ER B N b n/a 13 1763 1807 1862 N
+ ER B N e n/a 13 1763 1815 1863 N
+ ER B N i n/a 13 1763 1807 1862 N
+ ER B N s n/a 13 1763 1807 1862 N
+ ER B NG e n/a 13 1763 1807 1861 N
+ ER B NG s n/a 13 1763 1807 1861 N
+ ER B OW b n/a 13 1759 1839 1888 N
+ ER B OW e n/a 13 1760 1838 1886 N
+ ER B OW i n/a 13 1759 1838 1888 N
+ ER B OW s n/a 13 1759 1838 1886 N
+ ER B OY b n/a 13 1759 1839 1888 N
+ ER B OY e n/a 13 1760 1838 1886 N
+ ER B OY i n/a 13 1759 1839 1888 N
+ ER B OY s n/a 13 1759 1838 1886 N
+ ER B P b n/a 13 1763 1805 1896 N
+ ER B P e n/a 13 1763 1805 1896 N
+ ER B P i n/a 13 1763 1805 1896 N
+ ER B P s n/a 13 1763 1805 1896 N
+ ER B R e n/a 13 1763 1843 1895 N
+ ER B R i n/a 13 1763 1843 1895 N
+ ER B R s n/a 13 1763 1843 1895 N
+ ER B S b n/a 13 1763 1806 1878 N
+ ER B S e n/a 13 1763 1817 1878 N
+ ER B S i n/a 13 1763 1806 1877 N
+ ER B S s n/a 13 1763 1806 1878 N
+ ER B SH b n/a 13 1763 1806 1880 N
+ ER B SH e n/a 13 1763 1806 1880 N
+ ER B SH i n/a 13 1763 1806 1877 N
+ ER B SH s n/a 13 1763 1806 1880 N
+ ER B SIL e n/a 13 1763 1813 1900 N
+ ER B SIL s n/a 13 1763 1813 1900 N
+ ER B T b n/a 13 1763 1808 1868 N
+ ER B T e n/a 13 1763 1815 1868 N
+ ER B T i n/a 13 1763 1808 1867 N
+ ER B T s n/a 13 1763 1808 1868 N
+ ER B TH b n/a 13 1763 1807 1875 N
+ ER B TH e n/a 13 1763 1819 1875 N
+ ER B TH i n/a 13 1763 1807 1875 N
+ ER B TH s n/a 13 1763 1807 1875 N
+ ER B UH b n/a 13 1759 1843 1888 N
+ ER B UH e n/a 13 1760 1843 1886 N
+ ER B UH s n/a 13 1759 1843 1886 N
+ ER B UW b n/a 13 1759 1839 1888 N
+ ER B UW e n/a 13 1760 1838 1886 N
+ ER B UW i n/a 13 1759 1839 1888 N
+ ER B UW s n/a 13 1759 1838 1886 N
+ ER B V b n/a 13 1763 1805 1889 N
+ ER B V e n/a 13 1763 1805 1889 N
+ ER B V i n/a 13 1763 1804 1889 N
+ ER B V s n/a 13 1763 1805 1889 N
+ ER B W b n/a 13 1763 1844 1894 N
+ ER B W e n/a 13 1763 1844 1894 N
+ ER B W i n/a 13 1763 1844 1894 N
+ ER B W s n/a 13 1763 1844 1894 N
+ ER B Y e n/a 13 1763 1828 1861 N
+ ER B Y i n/a 13 1763 1828 1861 N
+ ER B Y s n/a 13 1763 1828 1861 N
+ ER B Z b n/a 13 1763 1812 1882 N
+ ER B Z e n/a 13 1763 1817 1882 N
+ ER B Z i n/a 13 1763 1812 1882 N
+ ER B Z s n/a 13 1763 1812 1882 N
+ ER B ZH e n/a 13 1763 1812 1882 N
+ ER B ZH i n/a 13 1763 1812 1882 N
+ ER B ZH s n/a 13 1763 1812 1882 N
+ ER CH AA b n/a 13 1720 1839 1888 N
+ ER CH AA e n/a 13 1727 1836 1887 N
+ ER CH AA i n/a 13 1717 1839 1888 N
+ ER CH AA s n/a 13 1723 1836 1888 N
+ ER CH AE b n/a 13 1720 1831 1850 N
+ ER CH AE e n/a 13 1727 1821 1851 N
+ ER CH AE s n/a 13 1723 1829 1848 N
+ ER CH AH b n/a 13 1720 1829 1848 N
+ ER CH AH e n/a 13 1727 1820 1852 N
+ ER CH AH i n/a 13 1717 1829 1847 N
+ ER CH AH s n/a 13 1723 1829 1848 N
+ ER CH AO b n/a 13 1720 1839 1888 N
+ ER CH AO e n/a 13 1727 1836 1886 N
+ ER CH AO i n/a 13 1717 1839 1888 N
+ ER CH AO s n/a 13 1723 1836 1886 N
+ ER CH AW b n/a 13 1720 1831 1850 N
+ ER CH AW e n/a 13 1727 1821 1852 N
+ ER CH AW s n/a 13 1723 1831 1848 N
+ ER CH AY b n/a 13 1720 1839 1888 N
+ ER CH AY e n/a 13 1727 1836 1887 N
+ ER CH AY i n/a 13 1717 1839 1888 N
+ ER CH AY s n/a 13 1723 1836 1888 N
+ ER CH B b n/a 13 1726 1788 1897 N
+ ER CH B e n/a 13 1727 1788 1897 N
+ ER CH B i n/a 13 1726 1791 1897 N
+ ER CH B s n/a 13 1726 1786 1897 N
+ ER CH CH b n/a 13 1726 1768 1868 N
+ ER CH CH e n/a 13 1727 1771 1868 N
+ ER CH CH i n/a 13 1726 1768 1867 N
+ ER CH CH s n/a 13 1726 1773 1868 N
+ ER CH D b n/a 13 1727 1771 1866 N
+ ER CH D e n/a 13 1727 1771 1866 N
+ ER CH D i n/a 13 1727 1771 1865 N
+ ER CH D s n/a 13 1727 1773 1866 N
+ ER CH DH b n/a 13 1727 1771 1872 N
+ ER CH DH e n/a 13 1727 1771 1872 N
+ ER CH DH s n/a 13 1727 1773 1874 N
+ ER CH EH b n/a 13 1720 1831 1849 N
+ ER CH EH e n/a 13 1727 1822 1851 N
+ ER CH EH i n/a 13 1717 1831 1849 N
+ ER CH EH s n/a 13 1723 1829 1849 N
+ ER CH ER b n/a 13 1720 1842 1890 N
+ ER CH ER e n/a 13 1727 1843 1890 N
+ ER CH ER i n/a 13 1717 1843 1890 N
+ ER CH ER s n/a 13 1723 1843 1890 N
+ ER CH EY b n/a 13 1720 1825 1858 N
+ ER CH EY e n/a 13 1727 1822 1851 N
+ ER CH EY i n/a 13 1717 1825 1857 N
+ ER CH EY s n/a 13 1723 1825 1854 N
+ ER CH F b n/a 13 1726 1788 1898 N
+ ER CH F e n/a 13 1727 1788 1898 N
+ ER CH F i n/a 13 1726 1790 1898 N
+ ER CH F s n/a 13 1726 1786 1898 N
+ ER CH G b n/a 13 1726 1771 1871 N
+ ER CH G e n/a 13 1727 1771 1871 N
+ ER CH G s n/a 13 1726 1773 1871 N
+ ER CH HH b n/a 13 1726 1768 1859 N
+ ER CH HH e n/a 13 1727 1768 1859 N
+ ER CH HH i n/a 13 1726 1768 1859 N
+ ER CH HH s n/a 13 1726 1773 1859 N
+ ER CH IH b n/a 13 1720 1825 1858 N
+ ER CH IH e n/a 13 1727 1822 1853 N
+ ER CH IH i n/a 13 1717 1823 1856 N
+ ER CH IH s n/a 13 1723 1823 1854 N
+ ER CH IY b n/a 13 1720 1824 1855 N
+ ER CH IY e n/a 13 1727 1822 1853 N
+ ER CH IY i n/a 13 1717 1824 1855 N
+ ER CH IY s n/a 13 1723 1824 1854 N
+ ER CH JH b n/a 13 1726 1771 1866 N
+ ER CH JH e n/a 13 1727 1771 1866 N
+ ER CH JH s n/a 13 1726 1773 1866 N
+ ER CH K b n/a 13 1726 1768 1870 N
+ ER CH K e n/a 13 1727 1771 1870 N
+ ER CH K i n/a 13 1726 1768 1870 N
+ ER CH K s n/a 13 1726 1773 1870 N
+ ER CH L b n/a 13 1726 1842 1884 N
+ ER CH L e n/a 13 1727 1840 1885 N
+ ER CH L i n/a 13 1726 1840 1885 N
+ ER CH L s n/a 13 1726 1840 1885 N
+ ER CH M b n/a 13 1726 1788 1891 N
+ ER CH M e n/a 13 1727 1788 1891 N
+ ER CH M i n/a 13 1726 1791 1892 N
+ ER CH M s n/a 13 1726 1786 1891 N
+ ER CH N b n/a 13 1727 1795 1862 N
+ ER CH N e n/a 13 1727 1795 1863 N
+ ER CH N i n/a 13 1727 1795 1862 N
+ ER CH N s n/a 13 1727 1795 1863 N
+ ER CH NG e n/a 13 1727 1769 1861 N
+ ER CH NG s n/a 13 1726 1773 1861 N
+ ER CH OW b n/a 13 1720 1839 1888 N
+ ER CH OW e n/a 13 1727 1836 1886 N
+ ER CH OW i n/a 13 1717 1838 1888 N
+ ER CH OW s n/a 13 1723 1836 1886 N
+ ER CH OY b n/a 13 1720 1839 1888 N
+ ER CH OY e n/a 13 1727 1836 1886 N
+ ER CH OY s n/a 13 1723 1836 1886 N
+ ER CH P b n/a 13 1726 1788 1896 N
+ ER CH P e n/a 13 1727 1788 1896 N
+ ER CH P i n/a 13 1726 1790 1896 N
+ ER CH P s n/a 13 1726 1786 1896 N
+ ER CH R e n/a 13 1727 1843 1895 N
+ ER CH R s n/a 13 1726 1843 1895 N
+ ER CH S b n/a 13 1727 1784 1879 N
+ ER CH S e n/a 13 1727 1784 1879 N
+ ER CH S i n/a 13 1727 1784 1879 N
+ ER CH S s n/a 13 1727 1785 1879 N
+ ER CH SH b n/a 13 1726 1768 1880 N
+ ER CH SH e n/a 13 1727 1771 1880 N
+ ER CH SH i n/a 13 1726 1768 1880 N
+ ER CH SH s n/a 13 1726 1773 1880 N
+ ER CH SIL e n/a 13 1727 1796 1899 N
+ ER CH SIL s n/a 13 1726 1799 1901 N
+ ER CH T b n/a 13 1727 1768 1868 N
+ ER CH T e n/a 13 1727 1771 1868 N
+ ER CH T i n/a 13 1727 1768 1867 N
+ ER CH T s n/a 13 1727 1773 1868 N
+ ER CH TH b n/a 13 1727 1769 1875 N
+ ER CH TH e n/a 13 1727 1771 1875 N
+ ER CH TH s n/a 13 1727 1773 1875 N
+ ER CH UH b n/a 13 1720 1842 1888 N
+ ER CH UH e n/a 13 1727 1840 1886 N
+ ER CH UH s n/a 13 1723 1840 1886 N
+ ER CH UW b n/a 13 1720 1839 1888 N
+ ER CH UW e n/a 13 1727 1836 1886 N
+ ER CH UW i n/a 13 1717 1839 1888 N
+ ER CH UW s n/a 13 1723 1836 1886 N
+ ER CH V b n/a 13 1726 1788 1889 N
+ ER CH V e n/a 13 1727 1788 1889 N
+ ER CH V i n/a 13 1726 1791 1889 N
+ ER CH V s n/a 13 1726 1786 1889 N
+ ER CH W b n/a 13 1726 1846 1893 N
+ ER CH W e n/a 13 1727 1846 1893 N
+ ER CH W s n/a 13 1726 1846 1893 N
+ ER CH Y e n/a 13 1727 1822 1861 N
+ ER CH Y s n/a 13 1726 1823 1861 N
+ ER CH Z b n/a 13 1727 1765 1881 N
+ ER CH Z e n/a 13 1727 1765 1881 N
+ ER CH Z i n/a 13 1727 1765 1881 N
+ ER CH Z s n/a 13 1727 1765 1881 N
+ ER CH ZH e n/a 13 1727 1771 1881 N
+ ER CH ZH s n/a 13 1726 1773 1881 N
+ ER D AA b n/a 13 1720 1839 1888 N
+ ER D AA e n/a 13 1734 1836 1887 N
+ ER D AA i n/a 13 1719 1839 1888 N
+ ER D AA s n/a 13 1723 1836 1888 N
+ ER D AE b n/a 13 1720 1831 1850 N
+ ER D AE e n/a 13 1734 1821 1851 N
+ ER D AE i n/a 13 1719 1831 1850 N
+ ER D AE s n/a 13 1723 1831 1848 N
+ ER D AH b n/a 13 1720 1829 1848 N
+ ER D AH e n/a 13 1734 1820 1852 N
+ ER D AH i n/a 13 1718 1829 1847 N
+ ER D AH s n/a 13 1723 1829 1848 N
+ ER D AO b n/a 13 1720 1839 1888 N
+ ER D AO e n/a 13 1734 1836 1886 N
+ ER D AO i n/a 13 1719 1839 1888 N
+ ER D AO s n/a 13 1723 1836 1886 N
+ ER D AW b n/a 13 1720 1831 1850 N
+ ER D AW e n/a 13 1734 1821 1852 N
+ ER D AW s n/a 13 1723 1831 1848 N
+ ER D AY b n/a 13 1720 1839 1888 N
+ ER D AY e n/a 13 1734 1836 1887 N
+ ER D AY i n/a 13 1719 1839 1888 N
+ ER D AY s n/a 13 1723 1836 1888 N
+ ER D B b n/a 13 1710 1787 1897 N
+ ER D B e n/a 13 1709 1788 1897 N
+ ER D B i n/a 13 1709 1790 1897 N
+ ER D B s n/a 13 1710 1786 1897 N
+ ER D CH b n/a 13 1710 1779 1868 N
+ ER D CH e n/a 13 1709 1780 1868 N
+ ER D CH i n/a 13 1709 1779 1867 N
+ ER D CH s n/a 13 1710 1779 1868 N
+ ER D D b n/a 13 1709 1779 1866 N
+ ER D D e n/a 13 1709 1779 1866 N
+ ER D D i n/a 13 1709 1779 1865 N
+ ER D D s n/a 13 1710 1779 1866 N
+ ER D DH b n/a 13 1709 1775 1872 N
+ ER D DH e n/a 13 1709 1781 1872 N
+ ER D DH s n/a 13 1710 1781 1874 N
+ ER D EH b n/a 13 1720 1831 1849 N
+ ER D EH e n/a 13 1734 1822 1851 N
+ ER D EH i n/a 13 1719 1831 1849 N
+ ER D EH s n/a 13 1723 1831 1849 N
+ ER D ER b n/a 13 1720 1845 1890 N
+ ER D ER e n/a 13 1734 1845 1890 N
+ ER D ER i n/a 13 1718 1845 1890 N
+ ER D ER s n/a 13 1723 1845 1890 N
+ ER D EY b n/a 13 1720 1825 1858 N
+ ER D EY e n/a 13 1734 1822 1851 N
+ ER D EY i n/a 13 1719 1825 1857 N
+ ER D EY s n/a 13 1723 1825 1854 N
+ ER D F b n/a 13 1710 1787 1898 N
+ ER D F e n/a 13 1709 1788 1898 N
+ ER D F i n/a 13 1709 1790 1898 N
+ ER D F s n/a 13 1710 1786 1898 N
+ ER D G b n/a 13 1710 1778 1871 N
+ ER D G e n/a 13 1709 1778 1871 N
+ ER D G i n/a 13 1709 1778 1871 N
+ ER D G s n/a 13 1710 1778 1871 N
+ ER D HH b n/a 13 1710 1777 1859 N
+ ER D HH e n/a 13 1709 1777 1859 N
+ ER D HH i n/a 13 1709 1777 1859 N
+ ER D HH s n/a 13 1710 1777 1859 N
+ ER D IH b n/a 13 1720 1825 1858 N
+ ER D IH e n/a 13 1734 1822 1853 N
+ ER D IH i n/a 13 1718 1825 1856 N
+ ER D IH s n/a 13 1723 1823 1854 N
+ ER D IY b n/a 13 1720 1824 1855 N
+ ER D IY e n/a 13 1734 1822 1853 N
+ ER D IY i n/a 13 1718 1824 1855 N
+ ER D IY s n/a 13 1723 1824 1854 N
+ ER D JH b n/a 13 1710 1779 1866 N
+ ER D JH e n/a 13 1709 1780 1866 N
+ ER D JH i n/a 13 1709 1779 1866 N
+ ER D JH s n/a 13 1710 1779 1866 N
+ ER D K b n/a 13 1710 1778 1870 N
+ ER D K e n/a 13 1709 1778 1870 N
+ ER D K i n/a 13 1709 1778 1870 N
+ ER D K s n/a 13 1710 1778 1870 N
+ ER D L b n/a 13 1710 1842 1884 N
+ ER D L e n/a 13 1709 1840 1885 N
+ ER D L i n/a 13 1709 1840 1885 N
+ ER D L s n/a 13 1710 1840 1885 N
+ ER D M b n/a 13 1734 1787 1891 N
+ ER D M e n/a 13 1734 1788 1891 N
+ ER D M i n/a 13 1734 1790 1892 N
+ ER D M s n/a 13 1734 1786 1891 N
+ ER D N b n/a 13 1734 1795 1863 N
+ ER D N e n/a 13 1734 1792 1863 N
+ ER D N i n/a 13 1734 1792 1863 N
+ ER D N s n/a 13 1734 1792 1863 N
+ ER D NG e n/a 13 1734 1778 1861 N
+ ER D NG s n/a 13 1734 1778 1861 N
+ ER D OW b n/a 13 1720 1839 1888 N
+ ER D OW e n/a 13 1734 1836 1886 N
+ ER D OW i n/a 13 1719 1838 1888 N
+ ER D OW s n/a 13 1723 1836 1886 N
+ ER D OY b n/a 13 1720 1839 1888 N
+ ER D OY e n/a 13 1734 1836 1886 N
+ ER D OY i n/a 13 1719 1839 1888 N
+ ER D OY s n/a 13 1723 1836 1886 N
+ ER D P b n/a 13 1710 1787 1896 N
+ ER D P e n/a 13 1709 1788 1896 N
+ ER D P i n/a 13 1709 1790 1896 N
+ ER D P s n/a 13 1710 1786 1896 N
+ ER D R e n/a 13 1709 1846 1895 N
+ ER D R i n/a 13 1709 1846 1895 N
+ ER D R s n/a 13 1710 1846 1895 N
+ ER D S b n/a 13 1709 1784 1879 N
+ ER D S e n/a 13 1709 1784 1879 N
+ ER D S i n/a 13 1709 1783 1879 N
+ ER D S s n/a 13 1710 1785 1879 N
+ ER D SH b n/a 13 1710 1784 1880 N
+ ER D SH e n/a 13 1709 1784 1880 N
+ ER D SH i n/a 13 1709 1783 1880 N
+ ER D SH s n/a 13 1710 1785 1880 N
+ ER D SIL e n/a 13 1711 1796 1899 N
+ ER D SIL s n/a 13 1710 1799 1901 N
+ ER D T b n/a 13 1709 1779 1868 N
+ ER D T e n/a 13 1709 1780 1868 N
+ ER D T i n/a 13 1709 1779 1867 N
+ ER D T s n/a 13 1710 1779 1868 N
+ ER D TH b n/a 13 1709 1775 1875 N
+ ER D TH e n/a 13 1709 1781 1875 N
+ ER D TH i n/a 13 1709 1781 1875 N
+ ER D TH s n/a 13 1710 1781 1875 N
+ ER D UH b n/a 13 1720 1842 1888 N
+ ER D UH e n/a 13 1734 1840 1886 N
+ ER D UH s n/a 13 1723 1840 1886 N
+ ER D UW b n/a 13 1720 1839 1888 N
+ ER D UW e n/a 13 1734 1836 1886 N
+ ER D UW i n/a 13 1718 1839 1888 N
+ ER D UW s n/a 13 1723 1836 1886 N
+ ER D V b n/a 13 1710 1787 1889 N
+ ER D V e n/a 13 1709 1788 1889 N
+ ER D V i n/a 13 1709 1790 1889 N
+ ER D V s n/a 13 1710 1786 1889 N
+ ER D W b n/a 13 1710 1846 1893 N
+ ER D W e n/a 13 1709 1846 1893 N
+ ER D W i n/a 13 1709 1846 1893 N
+ ER D W s n/a 13 1710 1846 1893 N
+ ER D Y e n/a 13 1709 1822 1861 N
+ ER D Y i n/a 13 1709 1824 1861 N
+ ER D Y s n/a 13 1710 1823 1861 N
+ ER D Z b n/a 13 1709 1765 1881 N
+ ER D Z e n/a 13 1709 1765 1881 N
+ ER D Z i n/a 13 1709 1765 1881 N
+ ER D Z s n/a 13 1710 1765 1881 N
+ ER D ZH e n/a 13 1709 1780 1881 N
+ ER D ZH s n/a 13 1710 1779 1881 N
+ ER DH AA b n/a 13 1703 1839 1888 N
+ ER DH AA e n/a 13 1703 1836 1887 N
+ ER DH AA i n/a 13 1703 1839 1888 N
+ ER DH AA s n/a 13 1703 1836 1888 N
+ ER DH AE b n/a 13 1703 1831 1850 N
+ ER DH AE e n/a 13 1703 1821 1851 N
+ ER DH AE s n/a 13 1703 1830 1848 N
+ ER DH AH b n/a 13 1703 1829 1848 N
+ ER DH AH e n/a 13 1703 1820 1852 N
+ ER DH AH i n/a 13 1703 1829 1847 N
+ ER DH AH s n/a 13 1703 1830 1848 N
+ ER DH AO b n/a 13 1703 1839 1888 N
+ ER DH AO e n/a 13 1703 1836 1886 N
+ ER DH AO i n/a 13 1703 1839 1888 N
+ ER DH AO s n/a 13 1703 1836 1886 N
+ ER DH AW b n/a 13 1703 1831 1850 N
+ ER DH AW e n/a 13 1703 1821 1852 N
+ ER DH AW s n/a 13 1703 1831 1848 N
+ ER DH AY b n/a 13 1703 1839 1888 N
+ ER DH AY e n/a 13 1703 1836 1887 N
+ ER DH AY i n/a 13 1703 1839 1888 N
+ ER DH AY s n/a 13 1703 1836 1888 N
+ ER DH B b n/a 13 1705 1789 1897 N
+ ER DH B e n/a 13 1705 1789 1897 N
+ ER DH B i n/a 13 1705 1790 1897 N
+ ER DH B s n/a 13 1705 1789 1897 N
+ ER DH CH b n/a 13 1704 1780 1868 N
+ ER DH CH e n/a 13 1704 1780 1868 N
+ ER DH CH s n/a 13 1704 1780 1868 N
+ ER DH D b n/a 13 1704 1780 1866 N
+ ER DH D e n/a 13 1704 1780 1866 N
+ ER DH D i n/a 13 1704 1780 1864 N
+ ER DH D s n/a 13 1704 1780 1866 N
+ ER DH DH b n/a 13 1704 1775 1872 N
+ ER DH DH e n/a 13 1704 1781 1872 N
+ ER DH DH s n/a 13 1704 1781 1874 N
+ ER DH EH b n/a 13 1703 1831 1849 N
+ ER DH EH e n/a 13 1703 1822 1851 N
+ ER DH EH s n/a 13 1703 1830 1849 N
+ ER DH ER b n/a 13 1703 1846 1890 N
+ ER DH ER e n/a 13 1703 1846 1890 N
+ ER DH ER i n/a 13 1703 1846 1890 N
+ ER DH ER s n/a 13 1703 1846 1890 N
+ ER DH EY b n/a 13 1703 1825 1858 N
+ ER DH EY e n/a 13 1703 1822 1851 N
+ ER DH EY s n/a 13 1703 1825 1854 N
+ ER DH F b n/a 13 1705 1789 1898 N
+ ER DH F e n/a 13 1705 1789 1898 N
+ ER DH F i n/a 13 1705 1790 1898 N
+ ER DH F s n/a 13 1705 1789 1898 N
+ ER DH G b n/a 13 1705 1778 1871 N
+ ER DH G e n/a 13 1705 1778 1871 N
+ ER DH G i n/a 13 1705 1778 1871 N
+ ER DH G s n/a 13 1705 1778 1871 N
+ ER DH HH b n/a 13 1705 1777 1859 N
+ ER DH HH e n/a 13 1705 1777 1859 N
+ ER DH HH i n/a 13 1705 1777 1859 N
+ ER DH HH s n/a 13 1705 1777 1859 N
+ ER DH IH b n/a 13 1703 1825 1858 N
+ ER DH IH e n/a 13 1703 1822 1853 N
+ ER DH IH i n/a 13 1703 1825 1856 N
+ ER DH IH s n/a 13 1703 1823 1854 N
+ ER DH IY b n/a 13 1703 1824 1855 N
+ ER DH IY e n/a 13 1703 1822 1853 N
+ ER DH IY i n/a 13 1703 1824 1855 N
+ ER DH IY s n/a 13 1703 1824 1854 N
+ ER DH JH b n/a 13 1704 1780 1866 N
+ ER DH JH e n/a 13 1704 1780 1866 N
+ ER DH JH i n/a 13 1704 1780 1864 N
+ ER DH JH s n/a 13 1704 1780 1866 N
+ ER DH K b n/a 13 1705 1778 1870 N
+ ER DH K e n/a 13 1705 1778 1870 N
+ ER DH K i n/a 13 1705 1778 1870 N
+ ER DH K s n/a 13 1705 1778 1870 N
+ ER DH L b n/a 13 1703 1842 1884 N
+ ER DH L e n/a 13 1703 1840 1885 N
+ ER DH L i n/a 13 1703 1840 1885 N
+ ER DH L s n/a 13 1703 1840 1885 N
+ ER DH M b n/a 13 1705 1789 1891 N
+ ER DH M e n/a 13 1705 1789 1891 N
+ ER DH M i n/a 13 1705 1790 1892 N
+ ER DH M s n/a 13 1705 1789 1891 N
+ ER DH N b n/a 13 1704 1795 1862 N
+ ER DH N e n/a 13 1704 1792 1863 N
+ ER DH N i n/a 13 1704 1792 1862 N
+ ER DH N s n/a 13 1704 1792 1863 N
+ ER DH NG e n/a 13 1705 1778 1861 N
+ ER DH NG s n/a 13 1705 1778 1861 N
+ ER DH OW b n/a 13 1703 1839 1888 N
+ ER DH OW e n/a 13 1703 1836 1886 N
+ ER DH OW i n/a 13 1703 1838 1888 N
+ ER DH OW s n/a 13 1703 1836 1886 N
+ ER DH OY b n/a 13 1703 1839 1888 N
+ ER DH OY e n/a 13 1703 1836 1886 N
+ ER DH OY s n/a 13 1703 1836 1886 N
+ ER DH P b n/a 13 1705 1789 1896 N
+ ER DH P e n/a 13 1705 1789 1896 N
+ ER DH P i n/a 13 1705 1790 1896 N
+ ER DH P s n/a 13 1705 1789 1896 N
+ ER DH R e n/a 13 1703 1846 1895 N
+ ER DH R s n/a 13 1703 1846 1895 N
+ ER DH S b n/a 13 1704 1783 1879 N
+ ER DH S e n/a 13 1704 1783 1879 N
+ ER DH S i n/a 13 1704 1783 1879 N
+ ER DH S s n/a 13 1704 1785 1879 N
+ ER DH SH b n/a 13 1704 1783 1880 N
+ ER DH SH e n/a 13 1704 1783 1880 N
+ ER DH SH i n/a 13 1704 1783 1880 N
+ ER DH SH s n/a 13 1704 1785 1880 N
+ ER DH SIL e n/a 13 1706 1798 1899 N
+ ER DH SIL s n/a 13 1706 1798 1901 N
+ ER DH T b n/a 13 1704 1780 1868 N
+ ER DH T e n/a 13 1704 1780 1868 N
+ ER DH T i n/a 13 1704 1780 1867 N
+ ER DH T s n/a 13 1704 1780 1868 N
+ ER DH TH b n/a 13 1704 1775 1875 N
+ ER DH TH e n/a 13 1704 1781 1875 N
+ ER DH TH s n/a 13 1704 1781 1875 N
+ ER DH UH b n/a 13 1703 1842 1888 N
+ ER DH UH e n/a 13 1703 1840 1886 N
+ ER DH UH s n/a 13 1703 1840 1886 N
+ ER DH UW b n/a 13 1703 1839 1888 N
+ ER DH UW e n/a 13 1703 1836 1886 N
+ ER DH UW s n/a 13 1703 1836 1886 N
+ ER DH V b n/a 13 1705 1789 1889 N
+ ER DH V e n/a 13 1705 1789 1889 N
+ ER DH V i n/a 13 1705 1790 1889 N
+ ER DH V s n/a 13 1705 1789 1889 N
+ ER DH W b n/a 13 1703 1846 1893 N
+ ER DH W e n/a 13 1703 1846 1893 N
+ ER DH W i n/a 13 1703 1846 1893 N
+ ER DH W s n/a 13 1703 1846 1893 N
+ ER DH Y e n/a 13 1704 1822 1861 N
+ ER DH Y s n/a 13 1704 1823 1861 N
+ ER DH Z b n/a 13 1704 1764 1881 N
+ ER DH Z e n/a 13 1704 1764 1881 N
+ ER DH Z i n/a 13 1704 1764 1881 N
+ ER DH Z s n/a 13 1704 1764 1881 N
+ ER DH ZH e n/a 13 1704 1780 1881 N
+ ER DH ZH s n/a 13 1704 1780 1881 N
+ ER EH AA b n/a 13 1759 1839 1888 N
+ ER EH AA e n/a 13 1760 1836 1887 N
+ ER EH AA s n/a 13 1759 1836 1888 N
+ ER EH AE b n/a 13 1759 1831 1850 N
+ ER EH AE e n/a 13 1760 1821 1851 N
+ ER EH AE s n/a 13 1759 1830 1848 N
+ ER EH AH b n/a 13 1759 1829 1848 N
+ ER EH AH e n/a 13 1760 1820 1852 N
+ ER EH AH s n/a 13 1759 1830 1848 N
+ ER EH AO b n/a 13 1759 1839 1888 N
+ ER EH AO e n/a 13 1760 1836 1886 N
+ ER EH AO s n/a 13 1759 1836 1886 N
+ ER EH AW b n/a 13 1759 1831 1850 N
+ ER EH AW e n/a 13 1760 1821 1852 N
+ ER EH AW s n/a 13 1759 1831 1848 N
+ ER EH AY b n/a 13 1759 1839 1888 N
+ ER EH AY e n/a 13 1760 1836 1887 N
+ ER EH AY i n/a 13 1759 1839 1888 N
+ ER EH AY s n/a 13 1759 1836 1888 N
+ ER EH B b n/a 13 1759 1788 1897 N
+ ER EH B e n/a 13 1760 1788 1897 N
+ ER EH B i n/a 13 1759 1790 1897 N
+ ER EH B s n/a 13 1759 1786 1897 N
+ ER EH CH b n/a 13 1759 1768 1868 N
+ ER EH CH e n/a 13 1760 1770 1868 N
+ ER EH CH s n/a 13 1759 1773 1868 N
+ ER EH D b n/a 13 1762 1769 1866 N
+ ER EH D e n/a 13 1762 1770 1866 N
+ ER EH D s n/a 13 1762 1773 1866 N
+ ER EH DH b n/a 13 1761 1769 1872 N
+ ER EH DH e n/a 13 1762 1770 1872 N
+ ER EH DH s n/a 13 1762 1773 1874 N
+ ER EH EH b n/a 13 1759 1831 1849 N
+ ER EH EH e n/a 13 1760 1822 1851 N
+ ER EH EH s n/a 13 1759 1830 1849 N
+ ER EH ER b n/a 13 1759 1842 1890 N
+ ER EH ER e n/a 13 1760 1843 1890 N
+ ER EH ER s n/a 13 1759 1843 1890 N
+ ER EH EY b n/a 13 1759 1825 1858 N
+ ER EH EY e n/a 13 1760 1822 1851 N
+ ER EH EY s n/a 13 1759 1825 1854 N
+ ER EH F b n/a 13 1759 1788 1898 N
+ ER EH F e n/a 13 1760 1788 1898 N
+ ER EH F s n/a 13 1759 1786 1898 N
+ ER EH G b n/a 13 1759 1769 1871 N
+ ER EH G e n/a 13 1760 1770 1871 N
+ ER EH G s n/a 13 1759 1773 1871 N
+ ER EH HH b n/a 13 1759 1768 1859 N
+ ER EH HH e n/a 13 1760 1768 1859 N
+ ER EH HH s n/a 13 1759 1773 1859 N
+ ER EH IH b n/a 13 1759 1825 1858 N
+ ER EH IH e n/a 13 1760 1822 1853 N
+ ER EH IH s n/a 13 1759 1823 1854 N
+ ER EH IY b n/a 13 1759 1824 1855 N
+ ER EH IY e n/a 13 1760 1822 1853 N
+ ER EH IY s n/a 13 1759 1824 1854 N
+ ER EH JH b n/a 13 1759 1769 1866 N
+ ER EH JH e n/a 13 1760 1770 1866 N
+ ER EH JH s n/a 13 1759 1773 1866 N
+ ER EH K b n/a 13 1759 1768 1870 N
+ ER EH K e n/a 13 1760 1770 1870 N
+ ER EH K i n/a 13 1759 1768 1870 N
+ ER EH K s n/a 13 1759 1773 1870 N
+ ER EH L b n/a 13 1759 1842 1884 N
+ ER EH L e n/a 13 1760 1840 1885 N
+ ER EH L s n/a 13 1759 1840 1885 N
+ ER EH M b n/a 13 1759 1788 1891 N
+ ER EH M e n/a 13 1760 1788 1891 N
+ ER EH M s n/a 13 1759 1786 1891 N
+ ER EH N b n/a 13 1762 1795 1862 N
+ ER EH N e n/a 13 1762 1792 1863 N
+ ER EH N s n/a 13 1762 1792 1863 N
+ ER EH NG e n/a 13 1760 1769 1861 N
+ ER EH NG s n/a 13 1759 1773 1861 N
+ ER EH OW b n/a 13 1759 1839 1888 N
+ ER EH OW e n/a 13 1760 1836 1886 N
+ ER EH OW s n/a 13 1759 1836 1886 N
+ ER EH OY b n/a 13 1759 1839 1888 N
+ ER EH OY e n/a 13 1760 1836 1886 N
+ ER EH OY s n/a 13 1759 1836 1886 N
+ ER EH P b n/a 13 1759 1788 1896 N
+ ER EH P e n/a 13 1760 1788 1896 N
+ ER EH P s n/a 13 1759 1786 1896 N
+ ER EH R e n/a 13 1760 1843 1895 N
+ ER EH R s n/a 13 1759 1843 1895 N
+ ER EH S b n/a 13 1762 1784 1879 N
+ ER EH S e n/a 13 1762 1784 1879 N
+ ER EH S i n/a 13 1761 1783 1879 N
+ ER EH S s n/a 13 1762 1785 1879 N
+ ER EH SH b n/a 13 1759 1768 1880 N
+ ER EH SH e n/a 13 1760 1770 1880 N
+ ER EH SH i n/a 13 1759 1768 1880 N
+ ER EH SH s n/a 13 1759 1773 1880 N
+ ER EH SIL e n/a 13 1761 1796 1899 N
+ ER EH SIL s n/a 13 1761 1799 1901 N
+ ER EH T b n/a 13 1762 1768 1868 N
+ ER EH T e n/a 13 1762 1770 1868 N
+ ER EH T s n/a 13 1762 1773 1868 N
+ ER EH TH b n/a 13 1761 1769 1875 N
+ ER EH TH e n/a 13 1762 1770 1875 N
+ ER EH TH s n/a 13 1762 1773 1875 N
+ ER EH UH b n/a 13 1759 1842 1888 N
+ ER EH UH e n/a 13 1760 1840 1886 N
+ ER EH UH s n/a 13 1759 1840 1886 N
+ ER EH UW b n/a 13 1759 1839 1888 N
+ ER EH UW e n/a 13 1760 1836 1886 N
+ ER EH UW s n/a 13 1759 1836 1886 N
+ ER EH V b n/a 13 1759 1788 1889 N
+ ER EH V e n/a 13 1760 1788 1889 N
+ ER EH V s n/a 13 1759 1786 1889 N
+ ER EH W b n/a 13 1759 1845 1893 N
+ ER EH W e n/a 13 1760 1845 1893 N
+ ER EH W s n/a 13 1759 1845 1893 N
+ ER EH Y e n/a 13 1760 1822 1861 N
+ ER EH Y s n/a 13 1759 1823 1861 N
+ ER EH Z b n/a 13 1762 1766 1881 N
+ ER EH Z e n/a 13 1762 1766 1881 N
+ ER EH Z s n/a 13 1762 1766 1881 N
+ ER EH ZH e n/a 13 1760 1770 1881 N
+ ER EH ZH s n/a 13 1759 1773 1881 N
+ ER ER AA b n/a 13 1743 1839 1888 N
+ ER ER AA e n/a 13 1742 1836 1887 N
+ ER ER AA i n/a 13 1742 1839 1888 N
+ ER ER AA s n/a 13 1742 1836 1888 N
+ ER ER AE b n/a 13 1743 1831 1850 N
+ ER ER AE e n/a 13 1742 1833 1851 N
+ ER ER AE s n/a 13 1742 1830 1848 N
+ ER ER AH b n/a 13 1743 1830 1848 N
+ ER ER AH e n/a 13 1742 1833 1852 N
+ ER ER AH s n/a 13 1742 1830 1848 N
+ ER ER AO b n/a 13 1743 1839 1888 N
+ ER ER AO e n/a 13 1742 1836 1886 N
+ ER ER AO s n/a 13 1742 1836 1886 N
+ ER ER AW b n/a 13 1743 1831 1850 N
+ ER ER AW e n/a 13 1742 1833 1852 N
+ ER ER AW s n/a 13 1742 1831 1848 N
+ ER ER AY b n/a 13 1743 1839 1888 N
+ ER ER AY e n/a 13 1742 1836 1887 N
+ ER ER AY s n/a 13 1742 1836 1888 N
+ ER ER B b n/a 13 1743 1787 1897 N
+ ER ER B e n/a 13 1742 1786 1897 N
+ ER ER B i n/a 13 1742 1790 1897 N
+ ER ER B s n/a 13 1742 1786 1897 N
+ ER ER CH b n/a 13 1743 1768 1868 N
+ ER ER CH e n/a 13 1742 1770 1868 N
+ ER ER CH s n/a 13 1742 1773 1868 N
+ ER ER D b n/a 13 1743 1769 1866 N
+ ER ER D e n/a 13 1742 1770 1866 N
+ ER ER D i n/a 13 1742 1769 1864 N
+ ER ER D s n/a 13 1742 1773 1866 N
+ ER ER DH b n/a 13 1743 1769 1874 N
+ ER ER DH e n/a 13 1742 1770 1874 N
+ ER ER DH s n/a 13 1742 1773 1874 N
+ ER ER EH b n/a 13 1743 1831 1849 N
+ ER ER EH e n/a 13 1742 1833 1851 N
+ ER ER EH s n/a 13 1742 1830 1849 N
+ ER ER ER b n/a 13 1743 1842 1890 N
+ ER ER ER e n/a 13 1742 1843 1890 N
+ ER ER ER s n/a 13 1742 1843 1890 N
+ ER ER EY b n/a 13 1743 1825 1858 N
+ ER ER EY e n/a 13 1742 1833 1851 N
+ ER ER EY i n/a 13 1742 1825 1857 N
+ ER ER EY s n/a 13 1742 1825 1854 N
+ ER ER F b n/a 13 1743 1787 1898 N
+ ER ER F e n/a 13 1742 1786 1898 N
+ ER ER F s n/a 13 1742 1786 1898 N
+ ER ER G b n/a 13 1743 1769 1871 N
+ ER ER G e n/a 13 1742 1770 1871 N
+ ER ER G s n/a 13 1742 1773 1871 N
+ ER ER HH b n/a 13 1743 1768 1859 N
+ ER ER HH e n/a 13 1742 1768 1859 N
+ ER ER HH s n/a 13 1742 1773 1859 N
+ ER ER IH b n/a 13 1743 1825 1858 N
+ ER ER IH e n/a 13 1742 1823 1853 N
+ ER ER IH s n/a 13 1742 1823 1854 N
+ ER ER IY b n/a 13 1743 1824 1855 N
+ ER ER IY e n/a 13 1742 1824 1853 N
+ ER ER IY i n/a 13 1742 1824 1855 N
+ ER ER IY s n/a 13 1742 1824 1854 N
+ ER ER JH b n/a 13 1743 1769 1866 N
+ ER ER JH e n/a 13 1742 1770 1866 N
+ ER ER JH s n/a 13 1742 1773 1866 N
+ ER ER K b n/a 13 1743 1768 1870 N
+ ER ER K e n/a 13 1742 1770 1870 N
+ ER ER K s n/a 13 1742 1773 1870 N
+ ER ER L b n/a 13 1743 1842 1884 N
+ ER ER L e n/a 13 1742 1840 1885 N
+ ER ER L s n/a 13 1742 1840 1885 N
+ ER ER M b n/a 13 1743 1787 1891 N
+ ER ER M e n/a 13 1742 1786 1891 N
+ ER ER M s n/a 13 1742 1786 1891 N
+ ER ER N b n/a 13 1743 1795 1862 N
+ ER ER N e n/a 13 1742 1792 1863 N
+ ER ER N s n/a 13 1742 1792 1863 N
+ ER ER NG e n/a 13 1742 1769 1861 N
+ ER ER NG s n/a 13 1742 1773 1861 N
+ ER ER OW b n/a 13 1743 1839 1888 N
+ ER ER OW e n/a 13 1742 1836 1886 N
+ ER ER OW s n/a 13 1742 1836 1886 N
+ ER ER OY b n/a 13 1743 1839 1888 N
+ ER ER OY e n/a 13 1742 1836 1886 N
+ ER ER OY s n/a 13 1742 1836 1886 N
+ ER ER P b n/a 13 1743 1787 1896 N
+ ER ER P e n/a 13 1742 1786 1896 N
+ ER ER P s n/a 13 1742 1786 1896 N
+ ER ER R e n/a 13 1742 1843 1895 N
+ ER ER R s n/a 13 1742 1843 1895 N
+ ER ER S b n/a 13 1743 1768 1879 N
+ ER ER S e n/a 13 1742 1770 1879 N
+ ER ER S s n/a 13 1742 1773 1879 N
+ ER ER SH b n/a 13 1743 1768 1880 N
+ ER ER SH e n/a 13 1742 1770 1880 N
+ ER ER SH s n/a 13 1742 1773 1880 N
+ ER ER SIL e n/a 13 1742 1800 1900 N
+ ER ER SIL s n/a 13 1742 1799 1901 N
+ ER ER T b n/a 13 1743 1768 1868 N
+ ER ER T e n/a 13 1742 1770 1868 N
+ ER ER T i n/a 13 1742 1768 1867 N
+ ER ER T s n/a 13 1742 1773 1868 N
+ ER ER TH b n/a 13 1743 1769 1875 N
+ ER ER TH e n/a 13 1742 1770 1875 N
+ ER ER TH s n/a 13 1742 1773 1875 N
+ ER ER UH b n/a 13 1743 1842 1888 N
+ ER ER UH e n/a 13 1742 1840 1886 N
+ ER ER UH s n/a 13 1742 1840 1886 N
+ ER ER UW b n/a 13 1743 1839 1888 N
+ ER ER UW e n/a 13 1742 1836 1886 N
+ ER ER UW s n/a 13 1742 1836 1886 N
+ ER ER V b n/a 13 1743 1787 1889 N
+ ER ER V e n/a 13 1742 1786 1889 N
+ ER ER V s n/a 13 1742 1786 1889 N
+ ER ER W b n/a 13 1743 1845 1894 N
+ ER ER W e n/a 13 1742 1845 1894 N
+ ER ER W s n/a 13 1742 1845 1894 N
+ ER ER Y e n/a 13 1742 1823 1861 N
+ ER ER Y s n/a 13 1742 1823 1861 N
+ ER ER Z b n/a 13 1743 1769 1882 N
+ ER ER Z e n/a 13 1742 1770 1882 N
+ ER ER Z i n/a 13 1742 1769 1882 N
+ ER ER Z s n/a 13 1742 1773 1882 N
+ ER ER ZH e n/a 13 1742 1770 1882 N
+ ER ER ZH s n/a 13 1742 1773 1882 N
+ ER EY AA b n/a 13 1698 1839 1888 N
+ ER EY AA e n/a 13 1693 1836 1887 N
+ ER EY AA i n/a 13 1695 1839 1888 N
+ ER EY AA s n/a 13 1694 1836 1888 N
+ ER EY AE b n/a 13 1698 1831 1850 N
+ ER EY AE e n/a 13 1693 1821 1851 N
+ ER EY AE s n/a 13 1694 1830 1848 N
+ ER EY AH b n/a 13 1698 1829 1848 N
+ ER EY AH e n/a 13 1693 1820 1852 N
+ ER EY AH i n/a 13 1695 1829 1847 N
+ ER EY AH s n/a 13 1694 1830 1848 N
+ ER EY AO b n/a 13 1698 1839 1888 N
+ ER EY AO e n/a 13 1693 1836 1886 N
+ ER EY AO s n/a 13 1694 1836 1886 N
+ ER EY AW b n/a 13 1698 1831 1850 N
+ ER EY AW e n/a 13 1695 1821 1852 N
+ ER EY AW s n/a 13 1694 1831 1848 N
+ ER EY AY b n/a 13 1698 1839 1888 N
+ ER EY AY e n/a 13 1695 1836 1887 N
+ ER EY AY s n/a 13 1694 1836 1888 N
+ ER EY B b n/a 13 1695 1788 1897 N
+ ER EY B e n/a 13 1693 1788 1897 N
+ ER EY B s n/a 13 1694 1786 1897 N
+ ER EY CH b n/a 13 1695 1768 1868 N
+ ER EY CH e n/a 13 1693 1771 1868 N
+ ER EY CH s n/a 13 1694 1773 1868 N
+ ER EY D b n/a 13 1695 1769 1866 N
+ ER EY D e n/a 13 1693 1771 1866 N
+ ER EY D i n/a 13 1693 1769 1865 N
+ ER EY D s n/a 13 1694 1773 1866 N
+ ER EY DH b n/a 13 1693 1769 1872 N
+ ER EY DH e n/a 13 1693 1771 1872 N
+ ER EY DH s n/a 13 1693 1773 1874 N
+ ER EY EH b n/a 13 1698 1831 1849 N
+ ER EY EH e n/a 13 1693 1822 1851 N
+ ER EY EH i n/a 13 1695 1831 1849 N
+ ER EY EH s n/a 13 1694 1830 1849 N
+ ER EY ER b n/a 13 1698 1842 1890 N
+ ER EY ER e n/a 13 1693 1843 1890 N
+ ER EY ER s n/a 13 1694 1843 1890 N
+ ER EY EY b n/a 13 1698 1825 1858 N
+ ER EY EY e n/a 13 1695 1822 1851 N
+ ER EY EY s n/a 13 1694 1825 1854 N
+ ER EY F b n/a 13 1695 1788 1898 N
+ ER EY F e n/a 13 1693 1788 1898 N
+ ER EY F i n/a 13 1693 1790 1898 N
+ ER EY F s n/a 13 1694 1786 1898 N
+ ER EY G b n/a 13 1695 1769 1871 N
+ ER EY G e n/a 13 1693 1771 1871 N
+ ER EY G s n/a 13 1694 1773 1871 N
+ ER EY HH b n/a 13 1695 1768 1859 N
+ ER EY HH e n/a 13 1693 1768 1859 N
+ ER EY HH s n/a 13 1694 1773 1859 N
+ ER EY IH b n/a 13 1698 1825 1858 N
+ ER EY IH e n/a 13 1693 1822 1853 N
+ ER EY IH i n/a 13 1694 1823 1856 N
+ ER EY IH s n/a 13 1694 1823 1854 N
+ ER EY IY b n/a 13 1698 1824 1855 N
+ ER EY IY e n/a 13 1694 1822 1853 N
+ ER EY IY i n/a 13 1694 1824 1855 N
+ ER EY IY s n/a 13 1694 1824 1854 N
+ ER EY JH b n/a 13 1695 1769 1866 N
+ ER EY JH e n/a 13 1693 1771 1866 N
+ ER EY JH s n/a 13 1694 1773 1866 N
+ ER EY K b n/a 13 1695 1768 1870 N
+ ER EY K e n/a 13 1693 1771 1870 N
+ ER EY K s n/a 13 1694 1773 1870 N
+ ER EY L b n/a 13 1695 1842 1884 N
+ ER EY L e n/a 13 1693 1840 1885 N
+ ER EY L s n/a 13 1694 1840 1885 N
+ ER EY M b n/a 13 1695 1788 1891 N
+ ER EY M e n/a 13 1693 1788 1891 N
+ ER EY M s n/a 13 1694 1786 1891 N
+ ER EY N b n/a 13 1695 1795 1862 N
+ ER EY N e n/a 13 1693 1792 1863 N
+ ER EY N i n/a 13 1693 1792 1862 N
+ ER EY N s n/a 13 1694 1792 1863 N
+ ER EY NG e n/a 13 1693 1769 1861 N
+ ER EY NG s n/a 13 1694 1773 1861 N
+ ER EY OW b n/a 13 1698 1839 1888 N
+ ER EY OW e n/a 13 1695 1836 1886 N
+ ER EY OW s n/a 13 1694 1836 1886 N
+ ER EY OY b n/a 13 1698 1839 1888 N
+ ER EY OY e n/a 13 1695 1836 1886 N
+ ER EY OY s n/a 13 1694 1836 1886 N
+ ER EY P b n/a 13 1695 1788 1896 N
+ ER EY P e n/a 13 1693 1788 1896 N
+ ER EY P s n/a 13 1694 1786 1896 N
+ ER EY R e n/a 13 1693 1843 1895 N
+ ER EY R s n/a 13 1694 1843 1895 N
+ ER EY S b n/a 13 1695 1784 1879 N
+ ER EY S e n/a 13 1693 1784 1879 N
+ ER EY S i n/a 13 1693 1783 1879 N
+ ER EY S s n/a 13 1694 1785 1879 N
+ ER EY SH b n/a 13 1695 1768 1880 N
+ ER EY SH e n/a 13 1693 1771 1880 N
+ ER EY SH s n/a 13 1694 1773 1880 N
+ ER EY SIL e n/a 13 1693 1796 1899 N
+ ER EY SIL s n/a 13 1694 1799 1901 N
+ ER EY T b n/a 13 1695 1768 1868 N
+ ER EY T e n/a 13 1693 1771 1868 N
+ ER EY T i n/a 13 1693 1768 1867 N
+ ER EY T s n/a 13 1694 1773 1868 N
+ ER EY TH b n/a 13 1695 1769 1875 N
+ ER EY TH e n/a 13 1693 1771 1875 N
+ ER EY TH s n/a 13 1694 1773 1875 N
+ ER EY UH b n/a 13 1698 1842 1888 N
+ ER EY UH e n/a 13 1693 1840 1886 N
+ ER EY UH s n/a 13 1694 1840 1886 N
+ ER EY UW b n/a 13 1698 1839 1888 N
+ ER EY UW e n/a 13 1694 1836 1886 N
+ ER EY UW s n/a 13 1694 1836 1886 N
+ ER EY V b n/a 13 1693 1788 1889 N
+ ER EY V e n/a 13 1693 1788 1889 N
+ ER EY V i n/a 13 1693 1790 1889 N
+ ER EY V s n/a 13 1693 1786 1889 N
+ ER EY W b n/a 13 1695 1845 1893 N
+ ER EY W e n/a 13 1693 1845 1893 N
+ ER EY W s n/a 13 1694 1845 1893 N
+ ER EY Y e n/a 13 1693 1822 1861 N
+ ER EY Y s n/a 13 1694 1823 1861 N
+ ER EY Z b n/a 13 1693 1766 1881 N
+ ER EY Z e n/a 13 1693 1766 1881 N
+ ER EY Z i n/a 13 1693 1766 1881 N
+ ER EY Z s n/a 13 1693 1766 1881 N
+ ER EY ZH e n/a 13 1693 1771 1881 N
+ ER EY ZH s n/a 13 1693 1773 1881 N
+ ER F AA b n/a 13 1752 1839 1888 N
+ ER F AA e n/a 13 1749 1838 1887 N
+ ER F AA i n/a 13 1752 1839 1888 N
+ ER F AA s n/a 13 1752 1838 1888 N
+ ER F AE b n/a 13 1752 1831 1850 N
+ ER F AE e n/a 13 1749 1832 1851 N
+ ER F AE i n/a 13 1752 1831 1850 N
+ ER F AE s n/a 13 1752 1830 1848 N
+ ER F AH b n/a 13 1751 1832 1848 N
+ ER F AH e n/a 13 1749 1832 1848 N
+ ER F AH i n/a 13 1751 1832 1847 N
+ ER F AH s n/a 13 1751 1832 1848 N
+ ER F AO b n/a 13 1752 1839 1888 N
+ ER F AO e n/a 13 1749 1838 1886 N
+ ER F AO i n/a 13 1752 1839 1888 N
+ ER F AO s n/a 13 1752 1838 1886 N
+ ER F AW b n/a 13 1752 1831 1850 N
+ ER F AW e n/a 13 1749 1832 1852 N
+ ER F AW s n/a 13 1752 1831 1848 N
+ ER F AY b n/a 13 1752 1839 1888 N
+ ER F AY e n/a 13 1749 1838 1887 N
+ ER F AY i n/a 13 1752 1839 1888 N
+ ER F AY s n/a 13 1752 1838 1888 N
+ ER F B b n/a 13 1756 1805 1897 N
+ ER F B e n/a 13 1756 1805 1897 N
+ ER F B i n/a 13 1755 1804 1897 N
+ ER F B s n/a 13 1756 1805 1897 N
+ ER F CH b n/a 13 1757 1802 1868 N
+ ER F CH e n/a 13 1757 1802 1868 N
+ ER F CH i n/a 13 1754 1802 1867 N
+ ER F CH s n/a 13 1757 1802 1868 N
+ ER F D b n/a 13 1757 1808 1866 N
+ ER F D e n/a 13 1757 1815 1866 N
+ ER F D i n/a 13 1754 1808 1864 N
+ ER F D s n/a 13 1757 1808 1866 N
+ ER F DH b n/a 13 1758 1807 1873 N
+ ER F DH e n/a 13 1758 1818 1873 N
+ ER F DH i n/a 13 1753 1807 1876 N
+ ER F DH s n/a 13 1758 1807 1874 N
+ ER F EH b n/a 13 1752 1831 1849 N
+ ER F EH e n/a 13 1749 1832 1851 N
+ ER F EH i n/a 13 1752 1831 1849 N
+ ER F EH s n/a 13 1752 1830 1849 N
+ ER F ER b n/a 13 1751 1843 1890 N
+ ER F ER e n/a 13 1749 1843 1890 N
+ ER F ER i n/a 13 1751 1843 1890 N
+ ER F ER s n/a 13 1751 1843 1890 N
+ ER F EY b n/a 13 1752 1827 1858 N
+ ER F EY e n/a 13 1749 1832 1851 N
+ ER F EY i n/a 13 1752 1827 1857 N
+ ER F EY s n/a 13 1752 1827 1854 N
+ ER F F b n/a 13 1756 1805 1898 N
+ ER F F e n/a 13 1756 1805 1898 N
+ ER F F i n/a 13 1753 1805 1898 N
+ ER F F s n/a 13 1756 1805 1898 N
+ ER F G b n/a 13 1756 1802 1871 N
+ ER F G e n/a 13 1756 1802 1871 N
+ ER F G i n/a 13 1754 1802 1871 N
+ ER F G s n/a 13 1756 1802 1871 N
+ ER F HH b n/a 13 1757 1803 1860 N
+ ER F HH e n/a 13 1757 1803 1860 N
+ ER F HH s n/a 13 1757 1803 1860 N
+ ER F IH b n/a 13 1751 1827 1858 N
+ ER F IH e n/a 13 1749 1827 1854 N
+ ER F IH i n/a 13 1751 1826 1856 N
+ ER F IH s n/a 13 1751 1827 1854 N
+ ER F IY b n/a 13 1749 1827 1855 N
+ ER F IY e n/a 13 1749 1827 1854 N
+ ER F IY i n/a 13 1750 1826 1855 N
+ ER F IY s n/a 13 1749 1827 1854 N
+ ER F JH b n/a 13 1757 1802 1866 N
+ ER F JH e n/a 13 1757 1802 1866 N
+ ER F JH s n/a 13 1757 1802 1866 N
+ ER F K b n/a 13 1756 1802 1870 N
+ ER F K e n/a 13 1756 1802 1870 N
+ ER F K i n/a 13 1754 1802 1870 N
+ ER F K s n/a 13 1756 1802 1870 N
+ ER F L b n/a 13 1756 1842 1884 N
+ ER F L e n/a 13 1756 1841 1885 N
+ ER F L i n/a 13 1753 1842 1885 N
+ ER F L s n/a 13 1756 1842 1885 N
+ ER F M b n/a 13 1756 1805 1891 N
+ ER F M e n/a 13 1756 1805 1891 N
+ ER F M i n/a 13 1753 1804 1892 N
+ ER F M s n/a 13 1756 1805 1891 N
+ ER F N b n/a 13 1757 1807 1862 N
+ ER F N e n/a 13 1757 1815 1863 N
+ ER F N i n/a 13 1753 1807 1862 N
+ ER F N s n/a 13 1757 1807 1862 N
+ ER F NG e n/a 13 1756 1803 1861 N
+ ER F NG s n/a 13 1756 1803 1861 N
+ ER F OW b n/a 13 1752 1839 1888 N
+ ER F OW e n/a 13 1749 1838 1886 N
+ ER F OW i n/a 13 1752 1838 1888 N
+ ER F OW s n/a 13 1752 1838 1886 N
+ ER F OY b n/a 13 1752 1839 1888 N
+ ER F OY e n/a 13 1749 1838 1886 N
+ ER F OY s n/a 13 1752 1838 1886 N
+ ER F P b n/a 13 1756 1805 1896 N
+ ER F P e n/a 13 1756 1805 1896 N
+ ER F P s n/a 13 1756 1805 1896 N
+ ER F R e n/a 13 1756 1843 1895 N
+ ER F R i n/a 13 1753 1843 1895 N
+ ER F R s n/a 13 1756 1843 1895 N
+ ER F S b n/a 13 1757 1806 1878 N
+ ER F S e n/a 13 1757 1817 1878 N
+ ER F S i n/a 13 1753 1806 1877 N
+ ER F S s n/a 13 1757 1806 1878 N
+ ER F SH b n/a 13 1757 1803 1880 N
+ ER F SH e n/a 13 1757 1803 1880 N
+ ER F SH i n/a 13 1753 1803 1877 N
+ ER F SH s n/a 13 1757 1803 1880 N
+ ER F SIL e n/a 13 1750 1814 1901 N
+ ER F SIL s n/a 13 1752 1814 1901 N
+ ER F T b n/a 13 1757 1808 1868 N
+ ER F T e n/a 13 1757 1815 1868 N
+ ER F T i n/a 13 1754 1808 1867 N
+ ER F T s n/a 13 1757 1808 1868 N
+ ER F TH b n/a 13 1758 1807 1875 N
+ ER F TH e n/a 13 1758 1819 1875 N
+ ER F TH i n/a 13 1753 1807 1875 N
+ ER F TH s n/a 13 1758 1807 1875 N
+ ER F UH b n/a 13 1752 1843 1888 N
+ ER F UH e n/a 13 1749 1843 1886 N
+ ER F UH s n/a 13 1752 1843 1886 N
+ ER F UW b n/a 13 1752 1839 1888 N
+ ER F UW e n/a 13 1749 1838 1886 N
+ ER F UW i n/a 13 1752 1839 1888 N
+ ER F UW s n/a 13 1752 1838 1886 N
+ ER F V b n/a 13 1756 1805 1889 N
+ ER F V e n/a 13 1756 1805 1889 N
+ ER F V i n/a 13 1753 1804 1889 N
+ ER F V s n/a 13 1756 1805 1889 N
+ ER F W b n/a 13 1756 1844 1894 N
+ ER F W e n/a 13 1756 1844 1894 N
+ ER F W s n/a 13 1756 1844 1894 N
+ ER F Y e n/a 13 1757 1828 1861 N
+ ER F Y s n/a 13 1757 1828 1861 N
+ ER F Z b n/a 13 1757 1810 1882 N
+ ER F Z e n/a 13 1757 1817 1882 N
+ ER F Z i n/a 13 1753 1810 1882 N
+ ER F Z s n/a 13 1757 1810 1882 N
+ ER F ZH e n/a 13 1757 1803 1882 N
+ ER F ZH i n/a 13 1753 1803 1882 N
+ ER F ZH s n/a 13 1757 1803 1882 N
+ ER G AA b n/a 13 1720 1839 1888 N
+ ER G AA e n/a 13 1734 1836 1887 N
+ ER G AA i n/a 13 1721 1839 1888 N
+ ER G AA s n/a 13 1723 1836 1888 N
+ ER G AE b n/a 13 1720 1831 1850 N
+ ER G AE e n/a 13 1734 1821 1851 N
+ ER G AE i n/a 13 1721 1831 1850 N
+ ER G AE s n/a 13 1723 1831 1848 N
+ ER G AH b n/a 13 1720 1833 1848 N
+ ER G AH e n/a 13 1734 1820 1852 N
+ ER G AH i n/a 13 1721 1833 1847 N
+ ER G AH s n/a 13 1723 1833 1848 N
+ ER G AO b n/a 13 1720 1839 1888 N
+ ER G AO e n/a 13 1734 1836 1886 N
+ ER G AO i n/a 13 1721 1839 1888 N
+ ER G AO s n/a 13 1723 1836 1886 N
+ ER G AW b n/a 13 1720 1831 1850 N
+ ER G AW e n/a 13 1734 1821 1852 N
+ ER G AW s n/a 13 1723 1831 1848 N
+ ER G AY b n/a 13 1720 1839 1888 N
+ ER G AY e n/a 13 1734 1836 1887 N
+ ER G AY i n/a 13 1721 1839 1888 N
+ ER G AY s n/a 13 1723 1836 1888 N
+ ER G B b n/a 13 1734 1788 1897 N
+ ER G B e n/a 13 1734 1788 1897 N
+ ER G B i n/a 13 1734 1791 1897 N
+ ER G B s n/a 13 1734 1786 1897 N
+ ER G CH b n/a 13 1734 1768 1868 N
+ ER G CH e n/a 13 1734 1770 1868 N
+ ER G CH i n/a 13 1734 1768 1867 N
+ ER G CH s n/a 13 1734 1773 1868 N
+ ER G D b n/a 13 1734 1769 1866 N
+ ER G D e n/a 13 1734 1770 1866 N
+ ER G D i n/a 13 1734 1769 1864 N
+ ER G D s n/a 13 1734 1773 1866 N
+ ER G DH b n/a 13 1734 1769 1872 N
+ ER G DH e n/a 13 1734 1770 1872 N
+ ER G DH s n/a 13 1734 1773 1874 N
+ ER G EH b n/a 13 1720 1831 1849 N
+ ER G EH e n/a 13 1734 1822 1851 N
+ ER G EH i n/a 13 1721 1831 1849 N
+ ER G EH s n/a 13 1723 1831 1849 N
+ ER G ER b n/a 13 1720 1842 1890 N
+ ER G ER e n/a 13 1734 1843 1890 N
+ ER G ER i n/a 13 1721 1843 1890 N
+ ER G ER s n/a 13 1723 1843 1890 N
+ ER G EY b n/a 13 1720 1825 1858 N
+ ER G EY e n/a 13 1734 1822 1851 N
+ ER G EY i n/a 13 1721 1825 1857 N
+ ER G EY s n/a 13 1723 1825 1854 N
+ ER G F b n/a 13 1734 1788 1898 N
+ ER G F e n/a 13 1734 1788 1898 N
+ ER G F i n/a 13 1734 1790 1898 N
+ ER G F s n/a 13 1734 1786 1898 N
+ ER G G b n/a 13 1734 1769 1871 N
+ ER G G e n/a 13 1734 1770 1871 N
+ ER G G i n/a 13 1734 1769 1871 N
+ ER G G s n/a 13 1734 1773 1871 N
+ ER G HH b n/a 13 1734 1768 1859 N
+ ER G HH e n/a 13 1734 1768 1859 N
+ ER G HH i n/a 13 1734 1768 1859 N
+ ER G HH s n/a 13 1734 1773 1859 N
+ ER G IH b n/a 13 1720 1825 1858 N
+ ER G IH e n/a 13 1734 1822 1853 N
+ ER G IH i n/a 13 1721 1823 1856 N
+ ER G IH s n/a 13 1723 1823 1854 N
+ ER G IY b n/a 13 1720 1824 1855 N
+ ER G IY e n/a 13 1734 1822 1853 N
+ ER G IY i n/a 13 1721 1824 1855 N
+ ER G IY s n/a 13 1723 1824 1854 N
+ ER G JH b n/a 13 1734 1769 1866 N
+ ER G JH e n/a 13 1734 1770 1866 N
+ ER G JH i n/a 13 1734 1769 1864 N
+ ER G JH s n/a 13 1734 1773 1866 N
+ ER G K b n/a 13 1734 1768 1870 N
+ ER G K e n/a 13 1734 1770 1870 N
+ ER G K i n/a 13 1734 1768 1870 N
+ ER G K s n/a 13 1734 1773 1870 N
+ ER G L b n/a 13 1735 1837 1883 N
+ ER G L e n/a 13 1735 1835 1885 N
+ ER G L i n/a 13 1735 1837 1883 N
+ ER G L s n/a 13 1735 1835 1883 N
+ ER G M b n/a 13 1734 1788 1891 N
+ ER G M e n/a 13 1734 1788 1891 N
+ ER G M i n/a 13 1734 1791 1892 N
+ ER G M s n/a 13 1734 1786 1891 N
+ ER G N b n/a 13 1734 1795 1863 N
+ ER G N e n/a 13 1734 1792 1863 N
+ ER G N i n/a 13 1734 1792 1863 N
+ ER G N s n/a 13 1734 1792 1863 N
+ ER G NG e n/a 13 1734 1769 1861 N
+ ER G NG s n/a 13 1734 1773 1861 N
+ ER G OW b n/a 13 1720 1839 1888 N
+ ER G OW e n/a 13 1734 1836 1886 N
+ ER G OW i n/a 13 1721 1838 1888 N
+ ER G OW s n/a 13 1723 1836 1886 N
+ ER G OY b n/a 13 1720 1839 1888 N
+ ER G OY e n/a 13 1734 1836 1886 N
+ ER G OY s n/a 13 1723 1836 1886 N
+ ER G P b n/a 13 1734 1788 1896 N
+ ER G P e n/a 13 1734 1788 1896 N
+ ER G P i n/a 13 1734 1790 1896 N
+ ER G P s n/a 13 1734 1786 1896 N
+ ER G R e n/a 13 1735 1843 1895 N
+ ER G R s n/a 13 1735 1843 1895 N
+ ER G S b n/a 13 1734 1784 1879 N
+ ER G S e n/a 13 1734 1784 1879 N
+ ER G S i n/a 13 1734 1783 1879 N
+ ER G S s n/a 13 1734 1785 1879 N
+ ER G SH b n/a 13 1734 1768 1880 N
+ ER G SH e n/a 13 1734 1770 1880 N
+ ER G SH i n/a 13 1734 1768 1880 N
+ ER G SH s n/a 13 1734 1773 1880 N
+ ER G SIL e n/a 13 1734 1796 1899 N
+ ER G SIL s n/a 13 1734 1799 1901 N
+ ER G T b n/a 13 1734 1768 1868 N
+ ER G T e n/a 13 1734 1770 1868 N
+ ER G T i n/a 13 1734 1768 1867 N
+ ER G T s n/a 13 1734 1773 1868 N
+ ER G TH b n/a 13 1734 1769 1875 N
+ ER G TH e n/a 13 1734 1770 1875 N
+ ER G TH i n/a 13 1734 1769 1875 N
+ ER G TH s n/a 13 1734 1773 1875 N
+ ER G UH b n/a 13 1720 1836 1888 N
+ ER G UH e n/a 13 1734 1835 1886 N
+ ER G UH i n/a 13 1721 1836 1888 N
+ ER G UH s n/a 13 1723 1835 1886 N
+ ER G UW b n/a 13 1720 1839 1888 N
+ ER G UW e n/a 13 1734 1836 1886 N
+ ER G UW i n/a 13 1721 1839 1888 N
+ ER G UW s n/a 13 1723 1836 1886 N
+ ER G V b n/a 13 1734 1788 1889 N
+ ER G V e n/a 13 1734 1788 1889 N
+ ER G V i n/a 13 1734 1791 1889 N
+ ER G V s n/a 13 1734 1786 1889 N
+ ER G W b n/a 13 1734 1846 1893 N
+ ER G W e n/a 13 1734 1846 1893 N
+ ER G W i n/a 13 1734 1846 1893 N
+ ER G W s n/a 13 1734 1846 1893 N
+ ER G Y e n/a 13 1734 1822 1861 N
+ ER G Y s n/a 13 1734 1823 1861 N
+ ER G Z b n/a 13 1734 1765 1881 N
+ ER G Z e n/a 13 1734 1765 1881 N
+ ER G Z i n/a 13 1734 1765 1881 N
+ ER G Z s n/a 13 1734 1765 1881 N
+ ER G ZH e n/a 13 1734 1770 1881 N
+ ER G ZH s n/a 13 1734 1773 1881 N
+ ER HH AA b n/a 13 1732 1839 1888 N
+ ER HH AA e n/a 13 1732 1836 1887 N
+ ER HH AA i n/a 13 1731 1839 1888 N
+ ER HH AA s n/a 13 1732 1836 1888 N
+ ER HH AE b n/a 13 1732 1831 1850 N
+ ER HH AE e n/a 13 1732 1821 1851 N
+ ER HH AE i n/a 13 1731 1831 1850 N
+ ER HH AE s n/a 13 1732 1830 1848 N
+ ER HH AH b n/a 13 1732 1829 1848 N
+ ER HH AH e n/a 13 1732 1820 1852 N
+ ER HH AH i n/a 13 1731 1829 1847 N
+ ER HH AH s n/a 13 1732 1830 1848 N
+ ER HH AO b n/a 13 1732 1839 1888 N
+ ER HH AO e n/a 13 1732 1836 1886 N
+ ER HH AO i n/a 13 1731 1839 1888 N
+ ER HH AO s n/a 13 1732 1836 1886 N
+ ER HH AW b n/a 13 1732 1831 1850 N
+ ER HH AW e n/a 13 1732 1821 1852 N
+ ER HH AW s n/a 13 1732 1831 1848 N
+ ER HH AY b n/a 13 1732 1839 1888 N
+ ER HH AY e n/a 13 1732 1836 1887 N
+ ER HH AY i n/a 13 1731 1839 1888 N
+ ER HH AY s n/a 13 1732 1836 1888 N
+ ER HH B b n/a 13 1730 1787 1897 N
+ ER HH B e n/a 13 1730 1787 1897 N
+ ER HH B i n/a 13 1732 1790 1897 N
+ ER HH B s n/a 13 1730 1787 1897 N
+ ER HH CH b n/a 13 1730 1768 1868 N
+ ER HH CH e n/a 13 1730 1770 1868 N
+ ER HH CH i n/a 13 1732 1768 1867 N
+ ER HH CH s n/a 13 1730 1773 1868 N
+ ER HH D b n/a 13 1730 1769 1866 N
+ ER HH D e n/a 13 1730 1770 1866 N
+ ER HH D i n/a 13 1732 1769 1864 N
+ ER HH D s n/a 13 1730 1773 1866 N
+ ER HH DH b n/a 13 1730 1769 1872 N
+ ER HH DH e n/a 13 1730 1770 1872 N
+ ER HH DH s n/a 13 1730 1773 1874 N
+ ER HH EH b n/a 13 1732 1831 1849 N
+ ER HH EH e n/a 13 1732 1821 1851 N
+ ER HH EH i n/a 13 1731 1831 1849 N
+ ER HH EH s n/a 13 1732 1830 1849 N
+ ER HH ER b n/a 13 1732 1842 1890 N
+ ER HH ER e n/a 13 1732 1843 1890 N
+ ER HH ER s n/a 13 1732 1843 1890 N
+ ER HH EY b n/a 13 1732 1825 1858 N
+ ER HH EY e n/a 13 1732 1821 1851 N
+ ER HH EY i n/a 13 1731 1825 1857 N
+ ER HH EY s n/a 13 1732 1825 1854 N
+ ER HH F b n/a 13 1730 1787 1898 N
+ ER HH F e n/a 13 1730 1787 1898 N
+ ER HH F i n/a 13 1732 1790 1898 N
+ ER HH F s n/a 13 1730 1787 1898 N
+ ER HH G b n/a 13 1730 1769 1871 N
+ ER HH G e n/a 13 1730 1770 1871 N
+ ER HH G i n/a 13 1732 1769 1871 N
+ ER HH G s n/a 13 1730 1773 1871 N
+ ER HH HH b n/a 13 1730 1768 1859 N
+ ER HH HH e n/a 13 1730 1768 1859 N
+ ER HH HH s n/a 13 1730 1773 1859 N
+ ER HH IH b n/a 13 1732 1825 1858 N
+ ER HH IH e n/a 13 1732 1821 1853 N
+ ER HH IH i n/a 13 1731 1823 1853 N
+ ER HH IH s n/a 13 1732 1823 1854 N
+ ER HH IY b n/a 13 1732 1823 1855 N
+ ER HH IY e n/a 13 1732 1821 1853 N
+ ER HH IY i n/a 13 1732 1823 1855 N
+ ER HH IY s n/a 13 1732 1823 1854 N
+ ER HH JH b n/a 13 1730 1769 1866 N
+ ER HH JH e n/a 13 1730 1770 1866 N
+ ER HH JH s n/a 13 1730 1773 1866 N
+ ER HH K b n/a 13 1730 1768 1870 N
+ ER HH K e n/a 13 1730 1770 1870 N
+ ER HH K i n/a 13 1732 1768 1870 N
+ ER HH K s n/a 13 1730 1773 1870 N
+ ER HH L b n/a 13 1730 1842 1884 N
+ ER HH L e n/a 13 1730 1841 1885 N
+ ER HH L i n/a 13 1731 1842 1884 N
+ ER HH L s n/a 13 1730 1842 1885 N
+ ER HH M b n/a 13 1730 1787 1891 N
+ ER HH M e n/a 13 1730 1787 1891 N
+ ER HH M i n/a 13 1732 1790 1892 N
+ ER HH M s n/a 13 1730 1787 1891 N
+ ER HH N b n/a 13 1730 1795 1862 N
+ ER HH N e n/a 13 1730 1792 1863 N
+ ER HH N i n/a 13 1732 1792 1862 N
+ ER HH N s n/a 13 1730 1792 1863 N
+ ER HH NG e n/a 13 1730 1769 1861 N
+ ER HH NG s n/a 13 1730 1773 1861 N
+ ER HH OW b n/a 13 1732 1839 1888 N
+ ER HH OW e n/a 13 1732 1836 1886 N
+ ER HH OW i n/a 13 1731 1838 1888 N
+ ER HH OW s n/a 13 1732 1836 1886 N
+ ER HH OY b n/a 13 1732 1839 1888 N
+ ER HH OY e n/a 13 1732 1836 1886 N
+ ER HH OY s n/a 13 1732 1836 1886 N
+ ER HH P b n/a 13 1730 1787 1896 N
+ ER HH P e n/a 13 1730 1787 1896 N
+ ER HH P i n/a 13 1732 1790 1896 N
+ ER HH P s n/a 13 1730 1787 1896 N
+ ER HH R e n/a 13 1730 1843 1895 N
+ ER HH R i n/a 13 1731 1843 1895 N
+ ER HH R s n/a 13 1730 1843 1895 N
+ ER HH S b n/a 13 1730 1785 1878 N
+ ER HH S e n/a 13 1730 1785 1878 N
+ ER HH S i n/a 13 1730 1785 1878 N
+ ER HH S s n/a 13 1730 1785 1878 N
+ ER HH SH b n/a 13 1730 1768 1880 N
+ ER HH SH e n/a 13 1730 1770 1880 N
+ ER HH SH i n/a 13 1730 1768 1880 N
+ ER HH SH s n/a 13 1730 1773 1880 N
+ ER HH SIL e n/a 13 1733 1800 1900 N
+ ER HH SIL s n/a 13 1733 1800 1901 N
+ ER HH T b n/a 13 1730 1768 1868 N
+ ER HH T e n/a 13 1730 1770 1868 N
+ ER HH T i n/a 13 1732 1768 1867 N
+ ER HH T s n/a 13 1730 1773 1868 N
+ ER HH TH b n/a 13 1730 1769 1875 N
+ ER HH TH e n/a 13 1730 1770 1875 N
+ ER HH TH i n/a 13 1732 1769 1875 N
+ ER HH TH s n/a 13 1730 1773 1875 N
+ ER HH UH b n/a 13 1732 1842 1888 N
+ ER HH UH e n/a 13 1732 1841 1886 N
+ ER HH UH s n/a 13 1732 1842 1886 N
+ ER HH UW b n/a 13 1732 1839 1888 N
+ ER HH UW e n/a 13 1732 1836 1886 N
+ ER HH UW i n/a 13 1731 1839 1888 N
+ ER HH UW s n/a 13 1732 1836 1886 N
+ ER HH V b n/a 13 1730 1787 1889 N
+ ER HH V e n/a 13 1730 1787 1889 N
+ ER HH V i n/a 13 1732 1790 1889 N
+ ER HH V s n/a 13 1730 1787 1889 N
+ ER HH W b n/a 13 1730 1845 1893 N
+ ER HH W e n/a 13 1730 1845 1893 N
+ ER HH W i n/a 13 1731 1845 1893 N
+ ER HH W s n/a 13 1730 1845 1893 N
+ ER HH Y e n/a 13 1730 1821 1861 N
+ ER HH Y i n/a 13 1732 1823 1861 N
+ ER HH Y s n/a 13 1730 1823 1861 N
+ ER HH Z b n/a 13 1730 1767 1881 N
+ ER HH Z e n/a 13 1730 1767 1881 N
+ ER HH Z i n/a 13 1732 1767 1881 N
+ ER HH Z s n/a 13 1730 1767 1881 N
+ ER HH ZH e n/a 13 1730 1770 1881 N
+ ER HH ZH s n/a 13 1730 1773 1881 N
+ ER IH AA b n/a 13 1759 1839 1888 N
+ ER IH AA e n/a 13 1760 1836 1887 N
+ ER IH AA s n/a 13 1759 1836 1888 N
+ ER IH AE b n/a 13 1759 1831 1850 N
+ ER IH AE e n/a 13 1760 1821 1851 N
+ ER IH AE s n/a 13 1759 1830 1848 N
+ ER IH AH b n/a 13 1759 1829 1848 N
+ ER IH AH e n/a 13 1760 1820 1852 N
+ ER IH AH s n/a 13 1759 1830 1848 N
+ ER IH AO b n/a 13 1759 1839 1888 N
+ ER IH AO e n/a 13 1760 1836 1886 N
+ ER IH AO s n/a 13 1759 1836 1886 N
+ ER IH AW b n/a 13 1759 1831 1850 N
+ ER IH AW e n/a 13 1760 1821 1852 N
+ ER IH AW s n/a 13 1759 1831 1848 N
+ ER IH AY b n/a 13 1759 1839 1888 N
+ ER IH AY e n/a 13 1760 1836 1887 N
+ ER IH AY s n/a 13 1759 1836 1888 N
+ ER IH B b n/a 13 1759 1788 1897 N
+ ER IH B e n/a 13 1760 1788 1897 N
+ ER IH B s n/a 13 1759 1786 1897 N
+ ER IH CH b n/a 13 1759 1768 1868 N
+ ER IH CH e n/a 13 1760 1770 1868 N
+ ER IH CH s n/a 13 1759 1773 1868 N
+ ER IH D b n/a 13 1762 1769 1866 N
+ ER IH D e n/a 13 1762 1770 1866 N
+ ER IH D s n/a 13 1762 1773 1866 N
+ ER IH DH b n/a 13 1761 1769 1872 N
+ ER IH DH e n/a 13 1762 1770 1872 N
+ ER IH DH s n/a 13 1762 1773 1874 N
+ ER IH EH b n/a 13 1759 1831 1849 N
+ ER IH EH e n/a 13 1760 1822 1851 N
+ ER IH EH s n/a 13 1759 1830 1849 N
+ ER IH ER b n/a 13 1759 1842 1890 N
+ ER IH ER e n/a 13 1760 1843 1890 N
+ ER IH ER s n/a 13 1759 1843 1890 N
+ ER IH EY b n/a 13 1759 1825 1858 N
+ ER IH EY e n/a 13 1760 1822 1851 N
+ ER IH EY s n/a 13 1759 1825 1854 N
+ ER IH F b n/a 13 1759 1788 1898 N
+ ER IH F e n/a 13 1760 1788 1898 N
+ ER IH F s n/a 13 1759 1786 1898 N
+ ER IH G b n/a 13 1759 1769 1871 N
+ ER IH G e n/a 13 1760 1770 1871 N
+ ER IH G s n/a 13 1759 1773 1871 N
+ ER IH HH b n/a 13 1759 1768 1859 N
+ ER IH HH e n/a 13 1760 1768 1859 N
+ ER IH HH s n/a 13 1759 1773 1859 N
+ ER IH IH b n/a 13 1759 1825 1858 N
+ ER IH IH e n/a 13 1760 1822 1853 N
+ ER IH IH s n/a 13 1759 1823 1854 N
+ ER IH IY b n/a 13 1759 1824 1855 N
+ ER IH IY e n/a 13 1760 1822 1853 N
+ ER IH IY s n/a 13 1759 1824 1854 N
+ ER IH JH b n/a 13 1759 1769 1866 N
+ ER IH JH e n/a 13 1760 1770 1866 N
+ ER IH JH s n/a 13 1759 1773 1866 N
+ ER IH K b n/a 13 1759 1768 1870 N
+ ER IH K e n/a 13 1760 1770 1870 N
+ ER IH K s n/a 13 1759 1773 1870 N
+ ER IH L b n/a 13 1759 1842 1884 N
+ ER IH L e n/a 13 1760 1840 1885 N
+ ER IH L s n/a 13 1759 1840 1885 N
+ ER IH M b n/a 13 1759 1788 1891 N
+ ER IH M e n/a 13 1760 1788 1891 N
+ ER IH M s n/a 13 1759 1786 1891 N
+ ER IH N b n/a 13 1762 1795 1862 N
+ ER IH N e n/a 13 1762 1792 1863 N
+ ER IH N i n/a 13 1762 1792 1862 N
+ ER IH N s n/a 13 1762 1792 1863 N
+ ER IH NG e n/a 13 1760 1769 1861 N
+ ER IH NG s n/a 13 1759 1773 1861 N
+ ER IH OW b n/a 13 1759 1839 1888 N
+ ER IH OW e n/a 13 1760 1836 1886 N
+ ER IH OW s n/a 13 1759 1836 1886 N
+ ER IH OY b n/a 13 1759 1839 1888 N
+ ER IH OY e n/a 13 1760 1836 1886 N
+ ER IH OY s n/a 13 1759 1836 1886 N
+ ER IH P b n/a 13 1759 1788 1896 N
+ ER IH P e n/a 13 1760 1788 1896 N
+ ER IH P s n/a 13 1759 1786 1896 N
+ ER IH R e n/a 13 1760 1843 1895 N
+ ER IH R s n/a 13 1759 1843 1895 N
+ ER IH S b n/a 13 1762 1784 1879 N
+ ER IH S e n/a 13 1762 1784 1879 N
+ ER IH S s n/a 13 1762 1785 1879 N
+ ER IH SH b n/a 13 1759 1768 1880 N
+ ER IH SH e n/a 13 1760 1770 1880 N
+ ER IH SH s n/a 13 1759 1773 1880 N
+ ER IH SIL e n/a 13 1761 1796 1899 N
+ ER IH SIL s n/a 13 1761 1799 1901 N
+ ER IH T b n/a 13 1762 1768 1868 N
+ ER IH T e n/a 13 1762 1770 1868 N
+ ER IH T s n/a 13 1762 1773 1868 N
+ ER IH TH b n/a 13 1761 1769 1875 N
+ ER IH TH e n/a 13 1762 1770 1875 N
+ ER IH TH s n/a 13 1762 1773 1875 N
+ ER IH UH b n/a 13 1759 1842 1888 N
+ ER IH UH e n/a 13 1760 1840 1886 N
+ ER IH UH s n/a 13 1759 1840 1886 N
+ ER IH UW b n/a 13 1759 1839 1888 N
+ ER IH UW e n/a 13 1760 1836 1886 N
+ ER IH UW s n/a 13 1759 1836 1886 N
+ ER IH V b n/a 13 1759 1788 1889 N
+ ER IH V e n/a 13 1760 1788 1889 N
+ ER IH V s n/a 13 1759 1786 1889 N
+ ER IH W b n/a 13 1759 1845 1893 N
+ ER IH W e n/a 13 1760 1845 1893 N
+ ER IH W s n/a 13 1759 1845 1893 N
+ ER IH Y e n/a 13 1760 1822 1861 N
+ ER IH Y s n/a 13 1759 1823 1861 N
+ ER IH Z b n/a 13 1762 1766 1881 N
+ ER IH Z e n/a 13 1762 1766 1881 N
+ ER IH Z s n/a 13 1762 1766 1881 N
+ ER IH ZH e n/a 13 1760 1770 1881 N
+ ER IH ZH s n/a 13 1759 1773 1881 N
+ ER IY AA b n/a 13 1698 1839 1888 N
+ ER IY AA e n/a 13 1693 1836 1887 N
+ ER IY AA i n/a 13 1695 1839 1888 N
+ ER IY AA s n/a 13 1694 1836 1888 N
+ ER IY AE b n/a 13 1698 1831 1850 N
+ ER IY AE e n/a 13 1693 1821 1851 N
+ ER IY AE s n/a 13 1694 1830 1848 N
+ ER IY AH b n/a 13 1698 1829 1848 N
+ ER IY AH e n/a 13 1693 1820 1852 N
+ ER IY AH i n/a 13 1695 1829 1847 N
+ ER IY AH s n/a 13 1694 1830 1848 N
+ ER IY AO b n/a 13 1698 1839 1888 N
+ ER IY AO e n/a 13 1693 1836 1886 N
+ ER IY AO s n/a 13 1694 1836 1886 N
+ ER IY AW b n/a 13 1698 1831 1850 N
+ ER IY AW e n/a 13 1695 1821 1852 N
+ ER IY AW s n/a 13 1694 1831 1848 N
+ ER IY AY b n/a 13 1698 1839 1888 N
+ ER IY AY e n/a 13 1695 1836 1887 N
+ ER IY AY i n/a 13 1695 1839 1888 N
+ ER IY AY s n/a 13 1694 1836 1888 N
+ ER IY B b n/a 13 1695 1788 1897 N
+ ER IY B e n/a 13 1693 1788 1897 N
+ ER IY B s n/a 13 1694 1786 1897 N
+ ER IY CH b n/a 13 1695 1768 1868 N
+ ER IY CH e n/a 13 1693 1771 1868 N
+ ER IY CH s n/a 13 1694 1773 1868 N
+ ER IY D b n/a 13 1695 1769 1866 N
+ ER IY D e n/a 13 1693 1771 1866 N
+ ER IY D i n/a 13 1693 1769 1865 N
+ ER IY D s n/a 13 1694 1773 1866 N
+ ER IY DH b n/a 13 1693 1769 1872 N
+ ER IY DH e n/a 13 1693 1771 1872 N
+ ER IY DH s n/a 13 1693 1773 1874 N
+ ER IY EH b n/a 13 1698 1831 1849 N
+ ER IY EH e n/a 13 1693 1822 1851 N
+ ER IY EH i n/a 13 1695 1831 1849 N
+ ER IY EH s n/a 13 1694 1830 1849 N
+ ER IY ER b n/a 13 1698 1842 1890 N
+ ER IY ER e n/a 13 1693 1843 1890 N
+ ER IY ER s n/a 13 1694 1843 1890 N
+ ER IY EY b n/a 13 1698 1825 1858 N
+ ER IY EY e n/a 13 1695 1822 1851 N
+ ER IY EY i n/a 13 1695 1825 1857 N
+ ER IY EY s n/a 13 1694 1825 1854 N
+ ER IY F b n/a 13 1695 1788 1898 N
+ ER IY F e n/a 13 1693 1788 1898 N
+ ER IY F s n/a 13 1694 1786 1898 N
+ ER IY G b n/a 13 1695 1769 1871 N
+ ER IY G e n/a 13 1693 1771 1871 N
+ ER IY G i n/a 13 1693 1769 1871 N
+ ER IY G s n/a 13 1694 1773 1871 N
+ ER IY HH b n/a 13 1695 1768 1859 N
+ ER IY HH e n/a 13 1693 1768 1859 N
+ ER IY HH s n/a 13 1694 1773 1859 N
+ ER IY IH b n/a 13 1698 1825 1858 N
+ ER IY IH e n/a 13 1693 1822 1853 N
+ ER IY IH i n/a 13 1694 1823 1856 N
+ ER IY IH s n/a 13 1694 1823 1854 N
+ ER IY IY b n/a 13 1698 1824 1855 N
+ ER IY IY e n/a 13 1694 1822 1853 N
+ ER IY IY i n/a 13 1694 1824 1855 N
+ ER IY IY s n/a 13 1694 1824 1854 N
+ ER IY JH b n/a 13 1695 1769 1866 N
+ ER IY JH e n/a 13 1693 1771 1866 N
+ ER IY JH i n/a 13 1693 1769 1866 N
+ ER IY JH s n/a 13 1694 1773 1866 N
+ ER IY K b n/a 13 1695 1768 1870 N
+ ER IY K e n/a 13 1693 1771 1870 N
+ ER IY K s n/a 13 1694 1773 1870 N
+ ER IY L b n/a 13 1695 1842 1884 N
+ ER IY L e n/a 13 1693 1840 1885 N
+ ER IY L i n/a 13 1693 1840 1885 N
+ ER IY L s n/a 13 1694 1840 1885 N
+ ER IY M b n/a 13 1695 1788 1891 N
+ ER IY M e n/a 13 1693 1788 1891 N
+ ER IY M i n/a 13 1693 1790 1892 N
+ ER IY M s n/a 13 1694 1786 1891 N
+ ER IY N b n/a 13 1695 1795 1862 N
+ ER IY N e n/a 13 1693 1792 1863 N
+ ER IY N s n/a 13 1694 1792 1863 N
+ ER IY NG e n/a 13 1693 1769 1861 N
+ ER IY NG s n/a 13 1694 1773 1861 N
+ ER IY OW b n/a 13 1698 1839 1888 N
+ ER IY OW e n/a 13 1695 1836 1886 N
+ ER IY OW i n/a 13 1695 1838 1888 N
+ ER IY OW s n/a 13 1694 1836 1886 N
+ ER IY OY b n/a 13 1698 1839 1888 N
+ ER IY OY e n/a 13 1695 1836 1886 N
+ ER IY OY s n/a 13 1694 1836 1886 N
+ ER IY P b n/a 13 1695 1788 1896 N
+ ER IY P e n/a 13 1693 1788 1896 N
+ ER IY P s n/a 13 1694 1786 1896 N
+ ER IY R e n/a 13 1693 1843 1895 N
+ ER IY R s n/a 13 1694 1843 1895 N
+ ER IY S b n/a 13 1695 1784 1879 N
+ ER IY S e n/a 13 1693 1784 1879 N
+ ER IY S s n/a 13 1694 1785 1879 N
+ ER IY SH b n/a 13 1695 1768 1880 N
+ ER IY SH e n/a 13 1693 1771 1880 N
+ ER IY SH s n/a 13 1694 1773 1880 N
+ ER IY SIL e n/a 13 1693 1796 1899 N
+ ER IY SIL s n/a 13 1694 1799 1901 N
+ ER IY T b n/a 13 1695 1768 1868 N
+ ER IY T e n/a 13 1693 1771 1868 N
+ ER IY T s n/a 13 1694 1773 1868 N
+ ER IY TH b n/a 13 1695 1769 1875 N
+ ER IY TH e n/a 13 1693 1771 1875 N
+ ER IY TH s n/a 13 1694 1773 1875 N
+ ER IY UH b n/a 13 1698 1842 1888 N
+ ER IY UH e n/a 13 1693 1840 1886 N
+ ER IY UH s n/a 13 1694 1840 1886 N
+ ER IY UW b n/a 13 1698 1839 1888 N
+ ER IY UW e n/a 13 1694 1836 1886 N
+ ER IY UW i n/a 13 1694 1839 1888 N
+ ER IY UW s n/a 13 1694 1836 1886 N
+ ER IY V b n/a 13 1693 1788 1889 N
+ ER IY V e n/a 13 1693 1788 1889 N
+ ER IY V s n/a 13 1693 1786 1889 N
+ ER IY W b n/a 13 1695 1845 1893 N
+ ER IY W e n/a 13 1693 1845 1893 N
+ ER IY W s n/a 13 1694 1845 1893 N
+ ER IY Y e n/a 13 1693 1822 1861 N
+ ER IY Y s n/a 13 1694 1823 1861 N
+ ER IY Z b n/a 13 1693 1766 1881 N
+ ER IY Z e n/a 13 1693 1766 1881 N
+ ER IY Z i n/a 13 1693 1766 1881 N
+ ER IY Z s n/a 13 1693 1766 1881 N
+ ER IY ZH e n/a 13 1693 1771 1881 N
+ ER IY ZH s n/a 13 1693 1773 1881 N
+ ER JH AA b n/a 13 1720 1839 1888 N
+ ER JH AA e n/a 13 1728 1836 1887 N
+ ER JH AA i n/a 13 1719 1839 1888 N
+ ER JH AA s n/a 13 1723 1836 1888 N
+ ER JH AE b n/a 13 1720 1831 1850 N
+ ER JH AE e n/a 13 1728 1821 1851 N
+ ER JH AE i n/a 13 1719 1831 1850 N
+ ER JH AE s n/a 13 1723 1829 1848 N
+ ER JH AH b n/a 13 1720 1829 1848 N
+ ER JH AH e n/a 13 1728 1820 1852 N
+ ER JH AH i n/a 13 1719 1829 1847 N
+ ER JH AH s n/a 13 1723 1829 1848 N
+ ER JH AO b n/a 13 1720 1839 1888 N
+ ER JH AO e n/a 13 1728 1836 1886 N
+ ER JH AO i n/a 13 1719 1839 1888 N
+ ER JH AO s n/a 13 1723 1836 1886 N
+ ER JH AW b n/a 13 1720 1831 1850 N
+ ER JH AW e n/a 13 1728 1821 1852 N
+ ER JH AW s n/a 13 1723 1831 1848 N
+ ER JH AY b n/a 13 1720 1839 1888 N
+ ER JH AY e n/a 13 1728 1836 1887 N
+ ER JH AY i n/a 13 1719 1839 1888 N
+ ER JH AY s n/a 13 1723 1836 1888 N
+ ER JH B b n/a 13 1728 1788 1897 N
+ ER JH B e n/a 13 1728 1788 1897 N
+ ER JH B i n/a 13 1728 1791 1897 N
+ ER JH B s n/a 13 1728 1786 1897 N
+ ER JH CH b n/a 13 1728 1768 1868 N
+ ER JH CH e n/a 13 1728 1771 1868 N
+ ER JH CH s n/a 13 1728 1773 1868 N
+ ER JH D b n/a 13 1728 1771 1866 N
+ ER JH D e n/a 13 1728 1771 1866 N
+ ER JH D i n/a 13 1728 1771 1865 N
+ ER JH D s n/a 13 1728 1773 1866 N
+ ER JH DH b n/a 13 1728 1771 1872 N
+ ER JH DH e n/a 13 1728 1771 1872 N
+ ER JH DH s n/a 13 1728 1773 1874 N
+ ER JH EH b n/a 13 1720 1831 1849 N
+ ER JH EH e n/a 13 1728 1822 1851 N
+ ER JH EH i n/a 13 1719 1831 1849 N
+ ER JH EH s n/a 13 1723 1829 1849 N
+ ER JH ER b n/a 13 1720 1842 1890 N
+ ER JH ER e n/a 13 1728 1843 1890 N
+ ER JH ER i n/a 13 1719 1843 1890 N
+ ER JH ER s n/a 13 1723 1843 1890 N
+ ER JH EY b n/a 13 1720 1825 1858 N
+ ER JH EY e n/a 13 1728 1822 1851 N
+ ER JH EY i n/a 13 1719 1825 1857 N
+ ER JH EY s n/a 13 1723 1825 1854 N
+ ER JH F b n/a 13 1728 1788 1898 N
+ ER JH F e n/a 13 1728 1788 1898 N
+ ER JH F i n/a 13 1728 1790 1898 N
+ ER JH F s n/a 13 1728 1786 1898 N
+ ER JH G b n/a 13 1728 1771 1871 N
+ ER JH G e n/a 13 1728 1771 1871 N
+ ER JH G i n/a 13 1728 1771 1871 N
+ ER JH G s n/a 13 1728 1773 1871 N
+ ER JH HH b n/a 13 1728 1768 1859 N
+ ER JH HH e n/a 13 1728 1768 1859 N
+ ER JH HH i n/a 13 1728 1768 1859 N
+ ER JH HH s n/a 13 1728 1773 1859 N
+ ER JH IH b n/a 13 1720 1825 1858 N
+ ER JH IH e n/a 13 1728 1822 1853 N
+ ER JH IH i n/a 13 1719 1823 1856 N
+ ER JH IH s n/a 13 1723 1823 1854 N
+ ER JH IY b n/a 13 1720 1824 1855 N
+ ER JH IY e n/a 13 1728 1822 1853 N
+ ER JH IY i n/a 13 1719 1824 1855 N
+ ER JH IY s n/a 13 1723 1824 1854 N
+ ER JH JH b n/a 13 1728 1771 1866 N
+ ER JH JH e n/a 13 1728 1771 1866 N
+ ER JH JH i n/a 13 1728 1771 1866 N
+ ER JH JH s n/a 13 1728 1773 1866 N
+ ER JH K b n/a 13 1728 1768 1870 N
+ ER JH K e n/a 13 1728 1771 1870 N
+ ER JH K i n/a 13 1728 1768 1870 N
+ ER JH K s n/a 13 1728 1773 1870 N
+ ER JH L b n/a 13 1728 1842 1884 N
+ ER JH L e n/a 13 1728 1840 1885 N
+ ER JH L i n/a 13 1728 1840 1885 N
+ ER JH L s n/a 13 1728 1840 1885 N
+ ER JH M b n/a 13 1728 1788 1891 N
+ ER JH M e n/a 13 1728 1788 1891 N
+ ER JH M i n/a 13 1728 1791 1892 N
+ ER JH M s n/a 13 1728 1786 1891 N
+ ER JH N b n/a 13 1728 1795 1862 N
+ ER JH N e n/a 13 1728 1795 1863 N
+ ER JH N i n/a 13 1728 1795 1862 N
+ ER JH N s n/a 13 1728 1795 1863 N
+ ER JH NG e n/a 13 1728 1769 1861 N
+ ER JH NG s n/a 13 1728 1773 1861 N
+ ER JH OW b n/a 13 1720 1839 1888 N
+ ER JH OW e n/a 13 1728 1836 1886 N
+ ER JH OW i n/a 13 1719 1838 1888 N
+ ER JH OW s n/a 13 1723 1836 1886 N
+ ER JH OY b n/a 13 1720 1839 1888 N
+ ER JH OY e n/a 13 1728 1836 1886 N
+ ER JH OY s n/a 13 1723 1836 1886 N
+ ER JH P b n/a 13 1728 1788 1896 N
+ ER JH P e n/a 13 1728 1788 1896 N
+ ER JH P s n/a 13 1728 1786 1896 N
+ ER JH R e n/a 13 1728 1843 1895 N
+ ER JH R i n/a 13 1728 1843 1895 N
+ ER JH R s n/a 13 1728 1843 1895 N
+ ER JH S b n/a 13 1728 1784 1879 N
+ ER JH S e n/a 13 1728 1784 1879 N
+ ER JH S i n/a 13 1728 1783 1879 N
+ ER JH S s n/a 13 1728 1785 1879 N
+ ER JH SH b n/a 13 1728 1768 1880 N
+ ER JH SH e n/a 13 1728 1771 1880 N
+ ER JH SH s n/a 13 1728 1773 1880 N
+ ER JH SIL e n/a 13 1728 1796 1899 N
+ ER JH SIL s n/a 13 1728 1799 1901 N
+ ER JH T b n/a 13 1728 1768 1868 N
+ ER JH T e n/a 13 1728 1771 1868 N
+ ER JH T i n/a 13 1728 1768 1867 N
+ ER JH T s n/a 13 1728 1773 1868 N
+ ER JH TH b n/a 13 1728 1769 1875 N
+ ER JH TH e n/a 13 1728 1771 1875 N
+ ER JH TH s n/a 13 1728 1773 1875 N
+ ER JH UH b n/a 13 1720 1842 1888 N
+ ER JH UH e n/a 13 1728 1840 1886 N
+ ER JH UH s n/a 13 1723 1840 1886 N
+ ER JH UW b n/a 13 1720 1839 1888 N
+ ER JH UW e n/a 13 1728 1836 1886 N
+ ER JH UW i n/a 13 1719 1839 1888 N
+ ER JH UW s n/a 13 1723 1836 1886 N
+ ER JH V b n/a 13 1728 1788 1889 N
+ ER JH V e n/a 13 1728 1788 1889 N
+ ER JH V i n/a 13 1728 1791 1889 N
+ ER JH V s n/a 13 1728 1786 1889 N
+ ER JH W b n/a 13 1728 1846 1893 N
+ ER JH W e n/a 13 1728 1846 1893 N
+ ER JH W i n/a 13 1728 1846 1893 N
+ ER JH W s n/a 13 1728 1846 1893 N
+ ER JH Y e n/a 13 1728 1822 1861 N
+ ER JH Y s n/a 13 1728 1823 1861 N
+ ER JH Z b n/a 13 1728 1765 1881 N
+ ER JH Z e n/a 13 1728 1765 1881 N
+ ER JH Z i n/a 13 1728 1765 1881 N
+ ER JH Z s n/a 13 1728 1765 1881 N
+ ER JH ZH e n/a 13 1728 1771 1881 N
+ ER JH ZH s n/a 13 1728 1773 1881 N
+ ER K AA b n/a 13 1720 1839 1888 N
+ ER K AA e n/a 13 1725 1836 1887 N
+ ER K AA i n/a 13 1721 1839 1888 N
+ ER K AA s n/a 13 1723 1836 1888 N
+ ER K AE b n/a 13 1720 1831 1850 N
+ ER K AE e n/a 13 1725 1821 1851 N
+ ER K AE i n/a 13 1721 1831 1850 N
+ ER K AE s n/a 13 1723 1829 1848 N
+ ER K AH b n/a 13 1720 1833 1848 N
+ ER K AH e n/a 13 1725 1820 1852 N
+ ER K AH i n/a 13 1721 1833 1847 N
+ ER K AH s n/a 13 1723 1833 1848 N
+ ER K AO b n/a 13 1720 1839 1888 N
+ ER K AO e n/a 13 1725 1836 1886 N
+ ER K AO i n/a 13 1721 1839 1888 N
+ ER K AO s n/a 13 1723 1836 1886 N
+ ER K AW b n/a 13 1720 1831 1850 N
+ ER K AW e n/a 13 1725 1821 1852 N
+ ER K AW i n/a 13 1721 1831 1850 N
+ ER K AW s n/a 13 1723 1831 1848 N
+ ER K AY b n/a 13 1720 1839 1888 N
+ ER K AY e n/a 13 1725 1836 1887 N
+ ER K AY i n/a 13 1721 1839 1888 N
+ ER K AY s n/a 13 1723 1836 1888 N
+ ER K B b n/a 13 1725 1788 1897 N
+ ER K B e n/a 13 1725 1788 1897 N
+ ER K B i n/a 13 1725 1791 1897 N
+ ER K B s n/a 13 1725 1786 1897 N
+ ER K CH b n/a 13 1725 1768 1868 N
+ ER K CH e n/a 13 1725 1770 1868 N
+ ER K CH i n/a 13 1725 1768 1867 N
+ ER K CH s n/a 13 1725 1773 1868 N
+ ER K D b n/a 13 1725 1769 1866 N
+ ER K D e n/a 13 1725 1770 1866 N
+ ER K D i n/a 13 1725 1769 1864 N
+ ER K D s n/a 13 1725 1773 1866 N
+ ER K DH b n/a 13 1725 1769 1872 N
+ ER K DH e n/a 13 1725 1770 1872 N
+ ER K DH s n/a 13 1725 1773 1874 N
+ ER K EH b n/a 13 1720 1831 1849 N
+ ER K EH e n/a 13 1725 1822 1851 N
+ ER K EH i n/a 13 1721 1831 1849 N
+ ER K EH s n/a 13 1723 1829 1849 N
+ ER K ER b n/a 13 1720 1842 1890 N
+ ER K ER e n/a 13 1725 1843 1890 N
+ ER K ER i n/a 13 1721 1843 1890 N
+ ER K ER s n/a 13 1723 1843 1890 N
+ ER K EY b n/a 13 1720 1825 1858 N
+ ER K EY e n/a 13 1725 1822 1851 N
+ ER K EY i n/a 13 1721 1825 1857 N
+ ER K EY s n/a 13 1723 1825 1854 N
+ ER K F b n/a 13 1725 1788 1898 N
+ ER K F e n/a 13 1725 1788 1898 N
+ ER K F i n/a 13 1725 1790 1898 N
+ ER K F s n/a 13 1725 1786 1898 N
+ ER K G b n/a 13 1725 1769 1871 N
+ ER K G e n/a 13 1725 1770 1871 N
+ ER K G i n/a 13 1725 1769 1871 N
+ ER K G s n/a 13 1725 1773 1871 N
+ ER K HH b n/a 13 1725 1768 1859 N
+ ER K HH e n/a 13 1725 1768 1859 N
+ ER K HH i n/a 13 1725 1768 1859 N
+ ER K HH s n/a 13 1725 1773 1859 N
+ ER K IH b n/a 13 1720 1825 1858 N
+ ER K IH e n/a 13 1725 1822 1853 N
+ ER K IH i n/a 13 1721 1823 1856 N
+ ER K IH s n/a 13 1723 1823 1854 N
+ ER K IY b n/a 13 1720 1824 1855 N
+ ER K IY e n/a 13 1725 1822 1853 N
+ ER K IY i n/a 13 1721 1824 1855 N
+ ER K IY s n/a 13 1723 1824 1854 N
+ ER K JH b n/a 13 1725 1769 1866 N
+ ER K JH e n/a 13 1725 1770 1866 N
+ ER K JH i n/a 13 1725 1769 1864 N
+ ER K JH s n/a 13 1725 1773 1866 N
+ ER K K b n/a 13 1725 1768 1870 N
+ ER K K e n/a 13 1725 1770 1870 N
+ ER K K i n/a 13 1725 1768 1870 N
+ ER K K s n/a 13 1725 1773 1870 N
+ ER K L b n/a 13 1725 1837 1883 N
+ ER K L e n/a 13 1725 1835 1885 N
+ ER K L i n/a 13 1725 1837 1883 N
+ ER K L s n/a 13 1725 1835 1883 N
+ ER K M b n/a 13 1725 1788 1891 N
+ ER K M e n/a 13 1725 1788 1891 N
+ ER K M i n/a 13 1725 1795 1892 N
+ ER K M s n/a 13 1725 1786 1891 N
+ ER K N b n/a 13 1725 1795 1862 N
+ ER K N e n/a 13 1725 1795 1863 N
+ ER K N i n/a 13 1725 1795 1862 N
+ ER K N s n/a 13 1725 1795 1863 N
+ ER K NG e n/a 13 1725 1769 1861 N
+ ER K NG s n/a 13 1725 1773 1861 N
+ ER K OW b n/a 13 1720 1839 1888 N
+ ER K OW e n/a 13 1725 1836 1886 N
+ ER K OW i n/a 13 1721 1838 1888 N
+ ER K OW s n/a 13 1723 1836 1886 N
+ ER K OY b n/a 13 1720 1839 1888 N
+ ER K OY e n/a 13 1725 1836 1886 N
+ ER K OY s n/a 13 1723 1836 1886 N
+ ER K P b n/a 13 1725 1788 1896 N
+ ER K P e n/a 13 1725 1788 1896 N
+ ER K P i n/a 13 1725 1790 1896 N
+ ER K P s n/a 13 1725 1786 1896 N
+ ER K R e n/a 13 1725 1843 1895 N
+ ER K R i n/a 13 1725 1843 1895 N
+ ER K R s n/a 13 1725 1843 1895 N
+ ER K S b n/a 13 1725 1784 1879 N
+ ER K S e n/a 13 1725 1784 1879 N
+ ER K S i n/a 13 1725 1784 1879 N
+ ER K S s n/a 13 1725 1785 1879 N
+ ER K SH b n/a 13 1725 1768 1880 N
+ ER K SH e n/a 13 1725 1770 1880 N
+ ER K SH i n/a 13 1725 1768 1880 N
+ ER K SH s n/a 13 1725 1773 1880 N
+ ER K SIL e n/a 13 1725 1796 1899 N
+ ER K SIL s n/a 13 1725 1799 1901 N
+ ER K T b n/a 13 1725 1768 1868 N
+ ER K T e n/a 13 1725 1770 1868 N
+ ER K T i n/a 13 1725 1768 1867 N
+ ER K T s n/a 13 1725 1773 1868 N
+ ER K TH b n/a 13 1725 1769 1875 N
+ ER K TH e n/a 13 1725 1770 1875 N
+ ER K TH i n/a 13 1725 1769 1875 N
+ ER K TH s n/a 13 1725 1773 1875 N
+ ER K UH b n/a 13 1720 1836 1888 N
+ ER K UH e n/a 13 1725 1835 1886 N
+ ER K UH s n/a 13 1723 1835 1886 N
+ ER K UW b n/a 13 1720 1839 1888 N
+ ER K UW e n/a 13 1725 1836 1886 N
+ ER K UW i n/a 13 1721 1839 1888 N
+ ER K UW s n/a 13 1723 1836 1886 N
+ ER K V b n/a 13 1725 1788 1889 N
+ ER K V e n/a 13 1725 1788 1889 N
+ ER K V i n/a 13 1725 1791 1889 N
+ ER K V s n/a 13 1725 1786 1889 N
+ ER K W b n/a 13 1725 1846 1893 N
+ ER K W e n/a 13 1725 1846 1893 N
+ ER K W i n/a 13 1725 1846 1893 N
+ ER K W s n/a 13 1725 1846 1893 N
+ ER K Y e n/a 13 1725 1822 1861 N
+ ER K Y i n/a 13 1725 1823 1861 N
+ ER K Y s n/a 13 1725 1823 1861 N
+ ER K Z b n/a 13 1725 1765 1881 N
+ ER K Z e n/a 13 1725 1765 1881 N
+ ER K Z i n/a 13 1725 1765 1881 N
+ ER K Z s n/a 13 1725 1765 1881 N
+ ER K ZH e n/a 13 1725 1770 1881 N
+ ER K ZH i n/a 13 1725 1769 1881 N
+ ER K ZH s n/a 13 1725 1773 1881 N
+ ER L AA b n/a 13 1736 1839 1888 N
+ ER L AA e n/a 13 1737 1836 1887 N
+ ER L AA i n/a 13 1736 1839 1888 N
+ ER L AA s n/a 13 1736 1836 1888 N
+ ER L AE b n/a 13 1736 1831 1850 N
+ ER L AE e n/a 13 1737 1833 1851 N
+ ER L AE i n/a 13 1736 1831 1850 N
+ ER L AE s n/a 13 1736 1830 1848 N
+ ER L AH b n/a 13 1736 1830 1848 N
+ ER L AH e n/a 13 1737 1833 1852 N
+ ER L AH i n/a 13 1736 1830 1847 N
+ ER L AH s n/a 13 1736 1830 1848 N
+ ER L AO b n/a 13 1736 1839 1888 N
+ ER L AO e n/a 13 1737 1836 1886 N
+ ER L AO i n/a 13 1736 1839 1888 N
+ ER L AO s n/a 13 1736 1836 1886 N
+ ER L AW b n/a 13 1736 1831 1850 N
+ ER L AW e n/a 13 1736 1833 1852 N
+ ER L AW s n/a 13 1736 1831 1848 N
+ ER L AY b n/a 13 1736 1839 1888 N
+ ER L AY e n/a 13 1736 1836 1887 N
+ ER L AY i n/a 13 1736 1839 1888 N
+ ER L AY s n/a 13 1736 1836 1888 N
+ ER L B b n/a 13 1737 1789 1897 N
+ ER L B e n/a 13 1737 1789 1897 N
+ ER L B i n/a 13 1737 1790 1897 N
+ ER L B s n/a 13 1737 1789 1897 N
+ ER L CH b n/a 13 1737 1782 1868 N
+ ER L CH e n/a 13 1737 1782 1868 N
+ ER L CH i n/a 13 1737 1782 1867 N
+ ER L CH s n/a 13 1737 1782 1868 N
+ ER L D b n/a 13 1737 1782 1866 N
+ ER L D e n/a 13 1737 1782 1866 N
+ ER L D i n/a 13 1737 1782 1864 N
+ ER L D s n/a 13 1737 1782 1866 N
+ ER L DH b n/a 13 1737 1782 1872 N
+ ER L DH e n/a 13 1737 1782 1872 N
+ ER L DH s n/a 13 1737 1782 1874 N
+ ER L EH b n/a 13 1736 1831 1849 N
+ ER L EH e n/a 13 1737 1833 1851 N
+ ER L EH i n/a 13 1736 1831 1849 N
+ ER L EH s n/a 13 1736 1830 1849 N
+ ER L ER b n/a 13 1736 1842 1890 N
+ ER L ER e n/a 13 1737 1843 1890 N
+ ER L ER i n/a 13 1736 1843 1890 N
+ ER L ER s n/a 13 1736 1843 1890 N
+ ER L EY b n/a 13 1736 1825 1858 N
+ ER L EY e n/a 13 1736 1833 1851 N
+ ER L EY i n/a 13 1736 1825 1857 N
+ ER L EY s n/a 13 1736 1825 1854 N
+ ER L F b n/a 13 1737 1789 1898 N
+ ER L F e n/a 13 1737 1789 1898 N
+ ER L F i n/a 13 1737 1790 1898 N
+ ER L F s n/a 13 1737 1789 1898 N
+ ER L G b n/a 13 1737 1778 1871 N
+ ER L G e n/a 13 1737 1778 1871 N
+ ER L G i n/a 13 1737 1778 1871 N
+ ER L G s n/a 13 1737 1778 1871 N
+ ER L HH b n/a 13 1737 1777 1859 N
+ ER L HH e n/a 13 1737 1777 1859 N
+ ER L HH i n/a 13 1737 1777 1859 N
+ ER L HH s n/a 13 1737 1777 1859 N
+ ER L IH b n/a 13 1736 1825 1858 N
+ ER L IH e n/a 13 1737 1823 1853 N
+ ER L IH i n/a 13 1736 1823 1856 N
+ ER L IH s n/a 13 1736 1823 1854 N
+ ER L IY b n/a 13 1736 1824 1855 N
+ ER L IY e n/a 13 1736 1824 1853 N
+ ER L IY i n/a 13 1736 1824 1855 N
+ ER L IY s n/a 13 1736 1824 1854 N
+ ER L JH b n/a 13 1737 1782 1866 N
+ ER L JH e n/a 13 1737 1782 1866 N
+ ER L JH i n/a 13 1737 1782 1864 N
+ ER L JH s n/a 13 1737 1782 1866 N
+ ER L K b n/a 13 1737 1778 1870 N
+ ER L K e n/a 13 1737 1778 1870 N
+ ER L K i n/a 13 1737 1778 1870 N
+ ER L K s n/a 13 1737 1778 1870 N
+ ER L L b n/a 13 1737 1842 1884 N
+ ER L L e n/a 13 1737 1840 1885 N
+ ER L L i n/a 13 1737 1840 1885 N
+ ER L L s n/a 13 1737 1840 1885 N
+ ER L M b n/a 13 1737 1789 1891 N
+ ER L M e n/a 13 1737 1789 1891 N
+ ER L M i n/a 13 1737 1794 1892 N
+ ER L M s n/a 13 1737 1789 1891 N
+ ER L N b n/a 13 1737 1794 1862 N
+ ER L N e n/a 13 1737 1794 1863 N
+ ER L N i n/a 13 1737 1794 1862 N
+ ER L N s n/a 13 1737 1794 1863 N
+ ER L NG e n/a 13 1737 1778 1861 N
+ ER L NG s n/a 13 1737 1778 1861 N
+ ER L OW b n/a 13 1736 1839 1888 N
+ ER L OW e n/a 13 1736 1836 1886 N
+ ER L OW i n/a 13 1736 1838 1888 N
+ ER L OW s n/a 13 1736 1836 1886 N
+ ER L OY b n/a 13 1736 1839 1888 N
+ ER L OY e n/a 13 1736 1836 1886 N
+ ER L OY i n/a 13 1736 1839 1888 N
+ ER L OY s n/a 13 1736 1836 1886 N
+ ER L P b n/a 13 1737 1789 1896 N
+ ER L P e n/a 13 1737 1789 1896 N
+ ER L P i n/a 13 1737 1790 1896 N
+ ER L P s n/a 13 1737 1789 1896 N
+ ER L R e n/a 13 1737 1843 1895 N
+ ER L R i n/a 13 1737 1843 1895 N
+ ER L R s n/a 13 1737 1843 1895 N
+ ER L S b n/a 13 1737 1785 1879 N
+ ER L S e n/a 13 1737 1785 1879 N
+ ER L S i n/a 13 1737 1783 1879 N
+ ER L S s n/a 13 1737 1785 1879 N
+ ER L SH b n/a 13 1737 1785 1880 N
+ ER L SH e n/a 13 1737 1785 1880 N
+ ER L SH i n/a 13 1737 1783 1880 N
+ ER L SH s n/a 13 1737 1785 1880 N
+ ER L SIL e n/a 13 1737 1798 1900 N
+ ER L SIL s n/a 13 1737 1798 1901 N
+ ER L T b n/a 13 1737 1782 1868 N
+ ER L T e n/a 13 1737 1782 1868 N
+ ER L T i n/a 13 1737 1782 1867 N
+ ER L T s n/a 13 1737 1782 1868 N
+ ER L TH b n/a 13 1737 1782 1875 N
+ ER L TH e n/a 13 1737 1782 1875 N
+ ER L TH i n/a 13 1737 1782 1875 N
+ ER L TH s n/a 13 1737 1782 1875 N
+ ER L UH b n/a 13 1736 1842 1888 N
+ ER L UH e n/a 13 1737 1840 1886 N
+ ER L UH s n/a 13 1736 1840 1886 N
+ ER L UW b n/a 13 1736 1839 1888 N
+ ER L UW e n/a 13 1736 1836 1886 N
+ ER L UW i n/a 13 1736 1839 1888 N
+ ER L UW s n/a 13 1736 1836 1886 N
+ ER L V b n/a 13 1737 1789 1889 N
+ ER L V e n/a 13 1737 1789 1889 N
+ ER L V i n/a 13 1737 1790 1889 N
+ ER L V s n/a 13 1737 1789 1889 N
+ ER L W b n/a 13 1737 1845 1894 N
+ ER L W e n/a 13 1737 1845 1894 N
+ ER L W i n/a 13 1737 1845 1894 N
+ ER L W s n/a 13 1737 1845 1894 N
+ ER L Y e n/a 13 1737 1823 1861 N
+ ER L Y s n/a 13 1737 1823 1861 N
+ ER L Z b n/a 13 1737 1782 1881 N
+ ER L Z e n/a 13 1737 1782 1881 N
+ ER L Z i n/a 13 1737 1782 1881 N
+ ER L Z s n/a 13 1737 1782 1881 N
+ ER L ZH e n/a 13 1737 1782 1881 N
+ ER L ZH s n/a 13 1737 1782 1881 N
+ ER M AA b n/a 13 1745 1839 1888 N
+ ER M AA e n/a 13 1745 1838 1887 N
+ ER M AA i n/a 13 1745 1839 1888 N
+ ER M AA s n/a 13 1745 1838 1888 N
+ ER M AE b n/a 13 1745 1831 1850 N
+ ER M AE e n/a 13 1745 1833 1851 N
+ ER M AE i n/a 13 1745 1831 1850 N
+ ER M AE s n/a 13 1745 1830 1848 N
+ ER M AH b n/a 13 1745 1832 1848 N
+ ER M AH e n/a 13 1745 1833 1848 N
+ ER M AH i n/a 13 1745 1832 1847 N
+ ER M AH s n/a 13 1745 1832 1848 N
+ ER M AO b n/a 13 1745 1839 1888 N
+ ER M AO e n/a 13 1745 1838 1886 N
+ ER M AO i n/a 13 1745 1839 1888 N
+ ER M AO s n/a 13 1745 1838 1886 N
+ ER M AW b n/a 13 1745 1831 1850 N
+ ER M AW e n/a 13 1745 1833 1852 N
+ ER M AW i n/a 13 1745 1831 1850 N
+ ER M AW s n/a 13 1745 1831 1848 N
+ ER M AY b n/a 13 1745 1839 1888 N
+ ER M AY e n/a 13 1745 1838 1887 N
+ ER M AY i n/a 13 1745 1839 1888 N
+ ER M AY s n/a 13 1745 1838 1888 N
+ ER M B b n/a 13 1744 1805 1897 N
+ ER M B e n/a 13 1744 1805 1897 N
+ ER M B s n/a 13 1744 1805 1897 N
+ ER M CH b n/a 13 1744 1808 1868 N
+ ER M CH e n/a 13 1744 1808 1868 N
+ ER M CH i n/a 13 1744 1808 1867 N
+ ER M CH s n/a 13 1744 1808 1868 N
+ ER M D b n/a 13 1744 1810 1866 N
+ ER M D e n/a 13 1744 1815 1866 N
+ ER M D i n/a 13 1744 1810 1864 N
+ ER M D s n/a 13 1744 1810 1866 N
+ ER M DH b n/a 13 1744 1812 1872 N
+ ER M DH e n/a 13 1744 1819 1872 N
+ ER M DH s n/a 13 1744 1812 1874 N
+ ER M EH b n/a 13 1745 1831 1849 N
+ ER M EH e n/a 13 1745 1833 1851 N
+ ER M EH i n/a 13 1745 1831 1849 N
+ ER M EH s n/a 13 1745 1830 1849 N
+ ER M ER b n/a 13 1745 1843 1890 N
+ ER M ER e n/a 13 1745 1843 1890 N
+ ER M ER i n/a 13 1745 1843 1890 N
+ ER M ER s n/a 13 1745 1843 1890 N
+ ER M EY b n/a 13 1745 1827 1858 N
+ ER M EY e n/a 13 1745 1833 1851 N
+ ER M EY i n/a 13 1745 1827 1857 N
+ ER M EY s n/a 13 1745 1827 1854 N
+ ER M F b n/a 13 1744 1805 1898 N
+ ER M F e n/a 13 1744 1805 1898 N
+ ER M F i n/a 13 1744 1805 1898 N
+ ER M F s n/a 13 1744 1805 1898 N
+ ER M G b n/a 13 1744 1810 1871 N
+ ER M G e n/a 13 1744 1810 1871 N
+ ER M G i n/a 13 1744 1810 1871 N
+ ER M G s n/a 13 1744 1810 1871 N
+ ER M HH b n/a 13 1744 1809 1859 N
+ ER M HH e n/a 13 1744 1809 1859 N
+ ER M HH i n/a 13 1744 1809 1859 N
+ ER M HH s n/a 13 1744 1809 1859 N
+ ER M IH b n/a 13 1745 1826 1858 N
+ ER M IH e n/a 13 1745 1826 1854 N
+ ER M IH i n/a 13 1745 1826 1856 N
+ ER M IH s n/a 13 1745 1826 1854 N
+ ER M IY b n/a 13 1745 1826 1855 N
+ ER M IY e n/a 13 1745 1826 1854 N
+ ER M IY i n/a 13 1745 1826 1855 N
+ ER M IY s n/a 13 1745 1826 1854 N
+ ER M JH b n/a 13 1744 1810 1866 N
+ ER M JH e n/a 13 1744 1810 1866 N
+ ER M JH i n/a 13 1744 1810 1864 N
+ ER M JH s n/a 13 1744 1810 1866 N
+ ER M K b n/a 13 1744 1809 1870 N
+ ER M K e n/a 13 1744 1809 1870 N
+ ER M K i n/a 13 1744 1809 1870 N
+ ER M K s n/a 13 1744 1809 1870 N
+ ER M L b n/a 13 1744 1842 1884 N
+ ER M L e n/a 13 1744 1841 1885 N
+ ER M L i n/a 13 1744 1841 1885 N
+ ER M L s n/a 13 1744 1841 1885 N
+ ER M M b n/a 13 1744 1805 1891 N
+ ER M M e n/a 13 1744 1805 1891 N
+ ER M M i n/a 13 1744 1804 1892 N
+ ER M M s n/a 13 1744 1805 1891 N
+ ER M N b n/a 13 1744 1807 1862 N
+ ER M N e n/a 13 1744 1815 1863 N
+ ER M N i n/a 13 1744 1807 1862 N
+ ER M N s n/a 13 1744 1807 1862 N
+ ER M NG e n/a 13 1744 1807 1861 N
+ ER M NG s n/a 13 1744 1807 1861 N
+ ER M OW b n/a 13 1745 1839 1888 N
+ ER M OW e n/a 13 1745 1838 1886 N
+ ER M OW i n/a 13 1745 1838 1888 N
+ ER M OW s n/a 13 1745 1838 1886 N
+ ER M OY b n/a 13 1745 1839 1888 N
+ ER M OY e n/a 13 1745 1838 1886 N
+ ER M OY i n/a 13 1745 1839 1888 N
+ ER M OY s n/a 13 1745 1838 1886 N
+ ER M P b n/a 13 1744 1805 1896 N
+ ER M P e n/a 13 1744 1805 1896 N
+ ER M P s n/a 13 1744 1805 1896 N
+ ER M R e n/a 13 1744 1843 1895 N
+ ER M R i n/a 13 1744 1843 1895 N
+ ER M R s n/a 13 1744 1843 1895 N
+ ER M S b n/a 13 1744 1806 1878 N
+ ER M S e n/a 13 1744 1817 1878 N
+ ER M S i n/a 13 1744 1806 1877 N
+ ER M S s n/a 13 1744 1806 1878 N
+ ER M SH b n/a 13 1744 1806 1880 N
+ ER M SH e n/a 13 1744 1806 1880 N
+ ER M SH i n/a 13 1744 1806 1877 N
+ ER M SH s n/a 13 1744 1806 1880 N
+ ER M SIL e n/a 13 1744 1813 1900 N
+ ER M SIL s n/a 13 1744 1814 1900 N
+ ER M T b n/a 13 1744 1808 1868 N
+ ER M T e n/a 13 1744 1815 1868 N
+ ER M T i n/a 13 1744 1808 1867 N
+ ER M T s n/a 13 1744 1808 1868 N
+ ER M TH b n/a 13 1744 1807 1875 N
+ ER M TH e n/a 13 1744 1819 1875 N
+ ER M TH i n/a 13 1744 1807 1875 N
+ ER M TH s n/a 13 1744 1807 1875 N
+ ER M UH b n/a 13 1745 1843 1888 N
+ ER M UH e n/a 13 1745 1843 1886 N
+ ER M UH s n/a 13 1745 1843 1886 N
+ ER M UW b n/a 13 1745 1839 1888 N
+ ER M UW e n/a 13 1745 1838 1886 N
+ ER M UW i n/a 13 1745 1839 1888 N
+ ER M UW s n/a 13 1745 1838 1886 N
+ ER M V b n/a 13 1744 1805 1889 N
+ ER M V e n/a 13 1744 1805 1889 N
+ ER M V i n/a 13 1744 1804 1889 N
+ ER M V s n/a 13 1744 1805 1889 N
+ ER M W b n/a 13 1744 1844 1894 N
+ ER M W e n/a 13 1744 1844 1894 N
+ ER M W i n/a 13 1744 1844 1894 N
+ ER M W s n/a 13 1744 1844 1894 N
+ ER M Y e n/a 13 1744 1828 1861 N
+ ER M Y s n/a 13 1744 1828 1861 N
+ ER M Z b n/a 13 1744 1812 1882 N
+ ER M Z e n/a 13 1744 1817 1882 N
+ ER M Z i n/a 13 1744 1812 1882 N
+ ER M Z s n/a 13 1744 1812 1882 N
+ ER M ZH e n/a 13 1744 1811 1882 N
+ ER M ZH i n/a 13 1744 1811 1882 N
+ ER M ZH s n/a 13 1744 1811 1882 N
+ ER N AA b n/a 13 1698 1839 1888 N
+ ER N AA e n/a 13 1700 1836 1887 N
+ ER N AA i n/a 13 1697 1839 1888 N
+ ER N AA s n/a 13 1697 1836 1888 N
+ ER N AE b n/a 13 1698 1831 1850 N
+ ER N AE e n/a 13 1700 1821 1851 N
+ ER N AE i n/a 13 1697 1831 1850 N
+ ER N AE s n/a 13 1697 1830 1848 N
+ ER N AH b n/a 13 1698 1830 1848 N
+ ER N AH e n/a 13 1700 1820 1852 N
+ ER N AH i n/a 13 1697 1830 1847 N
+ ER N AH s n/a 13 1697 1830 1848 N
+ ER N AO b n/a 13 1698 1839 1888 N
+ ER N AO e n/a 13 1700 1836 1886 N
+ ER N AO i n/a 13 1697 1839 1888 N
+ ER N AO s n/a 13 1697 1836 1886 N
+ ER N AW b n/a 13 1698 1831 1850 N
+ ER N AW e n/a 13 1700 1821 1852 N
+ ER N AW i n/a 13 1697 1831 1850 N
+ ER N AW s n/a 13 1697 1831 1848 N
+ ER N AY b n/a 13 1698 1839 1888 N
+ ER N AY e n/a 13 1700 1836 1887 N
+ ER N AY i n/a 13 1697 1839 1888 N
+ ER N AY s n/a 13 1697 1836 1888 N
+ ER N B b n/a 13 1701 1787 1897 N
+ ER N B e n/a 13 1700 1788 1897 N
+ ER N B i n/a 13 1699 1791 1897 N
+ ER N B s n/a 13 1700 1786 1897 N
+ ER N CH b n/a 13 1701 1779 1868 N
+ ER N CH e n/a 13 1700 1780 1868 N
+ ER N CH i n/a 13 1700 1780 1867 N
+ ER N CH s n/a 13 1697 1780 1868 N
+ ER N D b n/a 13 1701 1779 1866 N
+ ER N D e n/a 13 1700 1779 1866 N
+ ER N D i n/a 13 1699 1779 1865 N
+ ER N D s n/a 13 1700 1779 1866 N
+ ER N DH b n/a 13 1701 1775 1872 N
+ ER N DH e n/a 13 1700 1781 1872 N
+ ER N DH s n/a 13 1697 1781 1874 N
+ ER N EH b n/a 13 1698 1831 1849 N
+ ER N EH e n/a 13 1700 1821 1851 N
+ ER N EH i n/a 13 1697 1831 1849 N
+ ER N EH s n/a 13 1697 1830 1849 N
+ ER N ER b n/a 13 1698 1845 1890 N
+ ER N ER e n/a 13 1700 1845 1890 N
+ ER N ER i n/a 13 1697 1845 1890 N
+ ER N ER s n/a 13 1697 1845 1890 N
+ ER N EY b n/a 13 1698 1825 1858 N
+ ER N EY e n/a 13 1700 1821 1851 N
+ ER N EY i n/a 13 1697 1825 1857 N
+ ER N EY s n/a 13 1697 1825 1854 N
+ ER N F b n/a 13 1701 1787 1898 N
+ ER N F e n/a 13 1700 1788 1898 N
+ ER N F i n/a 13 1700 1790 1898 N
+ ER N F s n/a 13 1697 1786 1898 N
+ ER N G b n/a 13 1701 1778 1871 N
+ ER N G e n/a 13 1700 1778 1871 N
+ ER N G i n/a 13 1699 1778 1871 N
+ ER N G s n/a 13 1700 1778 1871 N
+ ER N HH b n/a 13 1701 1777 1859 N
+ ER N HH e n/a 13 1700 1777 1859 N
+ ER N HH s n/a 13 1697 1777 1859 N
+ ER N IH b n/a 13 1698 1825 1858 N
+ ER N IH e n/a 13 1700 1821 1853 N
+ ER N IH i n/a 13 1697 1825 1856 N
+ ER N IH s n/a 13 1697 1823 1854 N
+ ER N IY b n/a 13 1698 1824 1855 N
+ ER N IY e n/a 13 1700 1821 1853 N
+ ER N IY i n/a 13 1697 1824 1855 N
+ ER N IY s n/a 13 1697 1824 1854 N
+ ER N JH b n/a 13 1701 1779 1866 N
+ ER N JH e n/a 13 1700 1780 1866 N
+ ER N JH i n/a 13 1700 1780 1866 N
+ ER N JH s n/a 13 1697 1780 1866 N
+ ER N K b n/a 13 1701 1778 1870 N
+ ER N K e n/a 13 1700 1778 1870 N
+ ER N K i n/a 13 1700 1778 1870 N
+ ER N K s n/a 13 1697 1778 1870 N
+ ER N L b n/a 13 1701 1842 1884 N
+ ER N L e n/a 13 1700 1840 1885 N
+ ER N L i n/a 13 1700 1840 1885 N
+ ER N L s n/a 13 1697 1840 1885 N
+ ER N M b n/a 13 1701 1787 1891 N
+ ER N M e n/a 13 1700 1788 1891 N
+ ER N M i n/a 13 1700 1791 1892 N
+ ER N M s n/a 13 1697 1786 1891 N
+ ER N N b n/a 13 1701 1795 1862 N
+ ER N N e n/a 13 1700 1792 1863 N
+ ER N N i n/a 13 1700 1792 1862 N
+ ER N N s n/a 13 1697 1792 1863 N
+ ER N NG e n/a 13 1700 1778 1861 N
+ ER N NG s n/a 13 1697 1778 1861 N
+ ER N OW b n/a 13 1698 1839 1888 N
+ ER N OW e n/a 13 1700 1836 1886 N
+ ER N OW i n/a 13 1697 1838 1888 N
+ ER N OW s n/a 13 1697 1836 1886 N
+ ER N OY b n/a 13 1698 1839 1888 N
+ ER N OY e n/a 13 1700 1836 1886 N
+ ER N OY s n/a 13 1697 1836 1886 N
+ ER N P b n/a 13 1701 1787 1896 N
+ ER N P e n/a 13 1700 1788 1896 N
+ ER N P i n/a 13 1700 1790 1896 N
+ ER N P s n/a 13 1697 1786 1896 N
+ ER N R e n/a 13 1700 1845 1895 N
+ ER N R i n/a 13 1700 1845 1895 N
+ ER N R s n/a 13 1697 1845 1895 N
+ ER N S b n/a 13 1701 1784 1879 N
+ ER N S e n/a 13 1700 1784 1879 N
+ ER N S i n/a 13 1700 1784 1879 N
+ ER N S s n/a 13 1697 1785 1879 N
+ ER N SH b n/a 13 1701 1784 1880 N
+ ER N SH e n/a 13 1700 1784 1880 N
+ ER N SH i n/a 13 1700 1784 1880 N
+ ER N SH s n/a 13 1697 1785 1880 N
+ ER N SIL e n/a 13 1700 1797 1899 N
+ ER N SIL s n/a 13 1697 1799 1901 N
+ ER N T b n/a 13 1701 1779 1868 N
+ ER N T e n/a 13 1700 1780 1868 N
+ ER N T i n/a 13 1700 1780 1867 N
+ ER N T s n/a 13 1697 1780 1868 N
+ ER N TH b n/a 13 1701 1775 1875 N
+ ER N TH e n/a 13 1700 1781 1875 N
+ ER N TH i n/a 13 1700 1781 1875 N
+ ER N TH s n/a 13 1697 1781 1875 N
+ ER N UH b n/a 13 1698 1842 1888 N
+ ER N UH e n/a 13 1700 1840 1886 N
+ ER N UH s n/a 13 1697 1840 1886 N
+ ER N UW b n/a 13 1698 1839 1888 N
+ ER N UW e n/a 13 1700 1836 1886 N
+ ER N UW s n/a 13 1697 1836 1886 N
+ ER N V b n/a 13 1701 1787 1889 N
+ ER N V e n/a 13 1700 1788 1889 N
+ ER N V i n/a 13 1700 1791 1889 N
+ ER N V s n/a 13 1697 1786 1889 N
+ ER N W b n/a 13 1701 1845 1893 N
+ ER N W e n/a 13 1700 1845 1893 N
+ ER N W i n/a 13 1700 1845 1893 N
+ ER N W s n/a 13 1697 1845 1893 N
+ ER N Y e n/a 13 1700 1822 1861 N
+ ER N Y s n/a 13 1697 1823 1861 N
+ ER N Z b n/a 13 1701 1767 1881 N
+ ER N Z e n/a 13 1700 1767 1881 N
+ ER N Z i n/a 13 1700 1767 1881 N
+ ER N Z s n/a 13 1697 1767 1881 N
+ ER N ZH e n/a 13 1700 1780 1881 N
+ ER N ZH s n/a 13 1697 1780 1881 N
+ ER NG AA b n/a 13 1698 1839 1888 N
+ ER NG AA e n/a 13 1699 1836 1887 N
+ ER NG AA s n/a 13 1697 1836 1888 N
+ ER NG AE b n/a 13 1698 1831 1850 N
+ ER NG AE e n/a 13 1699 1821 1851 N
+ ER NG AE s n/a 13 1697 1830 1848 N
+ ER NG AH b n/a 13 1698 1833 1848 N
+ ER NG AH e n/a 13 1699 1820 1852 N
+ ER NG AH s n/a 13 1697 1833 1848 N
+ ER NG AO b n/a 13 1698 1839 1888 N
+ ER NG AO e n/a 13 1699 1836 1886 N
+ ER NG AO s n/a 13 1697 1836 1886 N
+ ER NG AW b n/a 13 1698 1831 1850 N
+ ER NG AW e n/a 13 1699 1821 1852 N
+ ER NG AW i n/a 13 1697 1831 1850 N
+ ER NG AW s n/a 13 1697 1831 1848 N
+ ER NG AY b n/a 13 1698 1839 1888 N
+ ER NG AY e n/a 13 1699 1836 1887 N
+ ER NG AY s n/a 13 1697 1836 1888 N
+ ER NG B b n/a 13 1701 1788 1897 N
+ ER NG B e n/a 13 1700 1788 1897 N
+ ER NG B s n/a 13 1700 1786 1897 N
+ ER NG CH b n/a 13 1701 1768 1868 N
+ ER NG CH e n/a 13 1699 1770 1868 N
+ ER NG CH s n/a 13 1697 1773 1868 N
+ ER NG D b n/a 13 1701 1769 1866 N
+ ER NG D e n/a 13 1700 1770 1866 N
+ ER NG D s n/a 13 1700 1773 1866 N
+ ER NG DH b n/a 13 1701 1769 1872 N
+ ER NG DH e n/a 13 1699 1770 1872 N
+ ER NG DH s n/a 13 1697 1773 1874 N
+ ER NG EH b n/a 13 1698 1831 1849 N
+ ER NG EH e n/a 13 1699 1821 1851 N
+ ER NG EH s n/a 13 1697 1830 1849 N
+ ER NG ER b n/a 13 1698 1842 1890 N
+ ER NG ER e n/a 13 1699 1843 1890 N
+ ER NG ER i n/a 13 1697 1843 1890 N
+ ER NG ER s n/a 13 1697 1843 1890 N
+ ER NG EY b n/a 13 1698 1825 1858 N
+ ER NG EY e n/a 13 1699 1821 1851 N
+ ER NG EY s n/a 13 1697 1825 1854 N
+ ER NG F b n/a 13 1701 1788 1898 N
+ ER NG F e n/a 13 1699 1788 1898 N
+ ER NG F s n/a 13 1697 1786 1898 N
+ ER NG G b n/a 13 1701 1769 1871 N
+ ER NG G e n/a 13 1700 1770 1871 N
+ ER NG G s n/a 13 1700 1773 1871 N
+ ER NG HH b n/a 13 1701 1768 1859 N
+ ER NG HH e n/a 13 1699 1768 1859 N
+ ER NG HH s n/a 13 1697 1773 1859 N
+ ER NG IH b n/a 13 1698 1825 1858 N
+ ER NG IH e n/a 13 1699 1821 1853 N
+ ER NG IH s n/a 13 1697 1823 1854 N
+ ER NG IY b n/a 13 1698 1824 1855 N
+ ER NG IY e n/a 13 1699 1821 1853 N
+ ER NG IY i n/a 13 1697 1824 1855 N
+ ER NG IY s n/a 13 1697 1824 1854 N
+ ER NG JH b n/a 13 1701 1769 1866 N
+ ER NG JH e n/a 13 1699 1770 1866 N
+ ER NG JH s n/a 13 1697 1773 1866 N
+ ER NG K b n/a 13 1701 1768 1870 N
+ ER NG K e n/a 13 1699 1770 1870 N
+ ER NG K s n/a 13 1697 1773 1870 N
+ ER NG L b n/a 13 1701 1837 1883 N
+ ER NG L e n/a 13 1699 1835 1885 N
+ ER NG L s n/a 13 1697 1835 1883 N
+ ER NG M b n/a 13 1701 1788 1891 N
+ ER NG M e n/a 13 1699 1788 1891 N
+ ER NG M i n/a 13 1699 1791 1892 N
+ ER NG M s n/a 13 1697 1786 1891 N
+ ER NG N b n/a 13 1701 1795 1862 N
+ ER NG N e n/a 13 1699 1792 1863 N
+ ER NG N s n/a 13 1697 1792 1863 N
+ ER NG NG e n/a 13 1699 1769 1861 N
+ ER NG NG s n/a 13 1697 1773 1861 N
+ ER NG OW b n/a 13 1698 1839 1888 N
+ ER NG OW e n/a 13 1699 1836 1886 N
+ ER NG OW s n/a 13 1697 1836 1886 N
+ ER NG OY b n/a 13 1698 1839 1888 N
+ ER NG OY e n/a 13 1699 1836 1886 N
+ ER NG OY s n/a 13 1697 1836 1886 N
+ ER NG P b n/a 13 1701 1788 1896 N
+ ER NG P e n/a 13 1699 1788 1896 N
+ ER NG P s n/a 13 1697 1786 1896 N
+ ER NG R e n/a 13 1699 1843 1895 N
+ ER NG R s n/a 13 1697 1843 1895 N
+ ER NG S b n/a 13 1701 1784 1879 N
+ ER NG S e n/a 13 1699 1784 1879 N
+ ER NG S s n/a 13 1697 1785 1879 N
+ ER NG SH b n/a 13 1701 1768 1880 N
+ ER NG SH e n/a 13 1699 1770 1880 N
+ ER NG SH s n/a 13 1697 1773 1880 N
+ ER NG SIL e n/a 13 1699 1797 1899 N
+ ER NG SIL s n/a 13 1697 1799 1901 N
+ ER NG T b n/a 13 1701 1768 1868 N
+ ER NG T e n/a 13 1699 1770 1868 N
+ ER NG T s n/a 13 1697 1773 1868 N
+ ER NG TH b n/a 13 1701 1769 1875 N
+ ER NG TH e n/a 13 1699 1770 1875 N
+ ER NG TH s n/a 13 1697 1773 1875 N
+ ER NG UH b n/a 13 1698 1836 1888 N
+ ER NG UH e n/a 13 1699 1835 1886 N
+ ER NG UH s n/a 13 1697 1835 1886 N
+ ER NG UW b n/a 13 1698 1839 1888 N
+ ER NG UW e n/a 13 1699 1836 1886 N
+ ER NG UW s n/a 13 1697 1836 1886 N
+ ER NG V b n/a 13 1701 1788 1889 N
+ ER NG V e n/a 13 1699 1788 1889 N
+ ER NG V i n/a 13 1699 1791 1889 N
+ ER NG V s n/a 13 1697 1786 1889 N
+ ER NG W b n/a 13 1701 1845 1893 N
+ ER NG W e n/a 13 1699 1845 1893 N
+ ER NG W s n/a 13 1697 1845 1893 N
+ ER NG Y e n/a 13 1699 1822 1861 N
+ ER NG Y s n/a 13 1697 1823 1861 N
+ ER NG Z b n/a 13 1701 1767 1881 N
+ ER NG Z e n/a 13 1699 1767 1881 N
+ ER NG Z i n/a 13 1699 1767 1881 N
+ ER NG Z s n/a 13 1697 1767 1881 N
+ ER NG ZH e n/a 13 1699 1770 1881 N
+ ER NG ZH s n/a 13 1697 1773 1881 N
+ ER OW AA b n/a 13 1747 1839 1888 N
+ ER OW AA e n/a 13 1747 1836 1887 N
+ ER OW AA s n/a 13 1747 1836 1888 N
+ ER OW AE b n/a 13 1747 1831 1850 N
+ ER OW AE e n/a 13 1747 1833 1851 N
+ ER OW AE s n/a 13 1747 1830 1848 N
+ ER OW AH b n/a 13 1747 1830 1848 N
+ ER OW AH e n/a 13 1747 1833 1852 N
+ ER OW AH i n/a 13 1747 1830 1847 N
+ ER OW AH s n/a 13 1747 1830 1848 N
+ ER OW AO b n/a 13 1747 1839 1888 N
+ ER OW AO e n/a 13 1747 1836 1886 N
+ ER OW AO s n/a 13 1747 1836 1886 N
+ ER OW AW b n/a 13 1747 1831 1850 N
+ ER OW AW e n/a 13 1747 1833 1852 N
+ ER OW AW s n/a 13 1747 1831 1848 N
+ ER OW AY b n/a 13 1747 1839 1888 N
+ ER OW AY e n/a 13 1747 1836 1887 N
+ ER OW AY s n/a 13 1747 1836 1888 N
+ ER OW B b n/a 13 1747 1787 1897 N
+ ER OW B e n/a 13 1747 1786 1897 N
+ ER OW B i n/a 13 1747 1790 1897 N
+ ER OW B s n/a 13 1747 1786 1897 N
+ ER OW CH b n/a 13 1747 1773 1868 N
+ ER OW CH e n/a 13 1747 1773 1868 N
+ ER OW CH s n/a 13 1747 1773 1868 N
+ ER OW D b n/a 13 1747 1774 1866 N
+ ER OW D e n/a 13 1747 1774 1866 N
+ ER OW D i n/a 13 1747 1774 1864 N
+ ER OW D s n/a 13 1747 1774 1866 N
+ ER OW DH b n/a 13 1747 1774 1874 N
+ ER OW DH e n/a 13 1747 1774 1874 N
+ ER OW DH s n/a 13 1747 1774 1874 N
+ ER OW EH b n/a 13 1747 1831 1849 N
+ ER OW EH e n/a 13 1747 1833 1851 N
+ ER OW EH s n/a 13 1747 1830 1849 N
+ ER OW ER b n/a 13 1747 1835 1890 N
+ ER OW ER e n/a 13 1747 1835 1890 N
+ ER OW ER i n/a 13 1747 1834 1890 N
+ ER OW ER s n/a 13 1747 1835 1890 N
+ ER OW EY b n/a 13 1747 1825 1858 N
+ ER OW EY e n/a 13 1747 1833 1851 N
+ ER OW EY i n/a 13 1747 1825 1857 N
+ ER OW EY s n/a 13 1747 1825 1854 N
+ ER OW F b n/a 13 1747 1787 1898 N
+ ER OW F e n/a 13 1747 1786 1898 N
+ ER OW F i n/a 13 1747 1793 1898 N
+ ER OW F s n/a 13 1747 1786 1898 N
+ ER OW G b n/a 13 1747 1773 1871 N
+ ER OW G e n/a 13 1747 1773 1871 N
+ ER OW G s n/a 13 1747 1773 1871 N
+ ER OW HH b n/a 13 1747 1773 1859 N
+ ER OW HH e n/a 13 1747 1773 1859 N
+ ER OW HH i n/a 13 1747 1773 1859 N
+ ER OW HH s n/a 13 1747 1773 1859 N
+ ER OW IH b n/a 13 1747 1825 1858 N
+ ER OW IH e n/a 13 1747 1823 1853 N
+ ER OW IH i n/a 13 1747 1823 1856 N
+ ER OW IH s n/a 13 1747 1823 1854 N
+ ER OW IY b n/a 13 1747 1824 1855 N
+ ER OW IY e n/a 13 1747 1824 1853 N
+ ER OW IY i n/a 13 1747 1824 1855 N
+ ER OW IY s n/a 13 1747 1824 1854 N
+ ER OW JH b n/a 13 1747 1773 1866 N
+ ER OW JH e n/a 13 1747 1773 1866 N
+ ER OW JH s n/a 13 1747 1773 1866 N
+ ER OW K b n/a 13 1747 1773 1869 N
+ ER OW K e n/a 13 1747 1773 1870 N
+ ER OW K i n/a 13 1747 1773 1869 N
+ ER OW K s n/a 13 1747 1773 1869 N
+ ER OW L b n/a 13 1747 1837 1884 N
+ ER OW L e n/a 13 1747 1835 1885 N
+ ER OW L i n/a 13 1747 1834 1885 N
+ ER OW L s n/a 13 1747 1835 1885 N
+ ER OW M b n/a 13 1747 1787 1891 N
+ ER OW M e n/a 13 1747 1786 1891 N
+ ER OW M i n/a 13 1747 1790 1892 N
+ ER OW M s n/a 13 1747 1786 1891 N
+ ER OW N b n/a 13 1747 1795 1862 N
+ ER OW N e n/a 13 1747 1792 1863 N
+ ER OW N s n/a 13 1747 1792 1863 N
+ ER OW NG e n/a 13 1747 1773 1861 N
+ ER OW NG s n/a 13 1747 1773 1861 N
+ ER OW OW b n/a 13 1747 1839 1888 N
+ ER OW OW e n/a 13 1747 1836 1886 N
+ ER OW OW s n/a 13 1747 1836 1886 N
+ ER OW OY b n/a 13 1747 1839 1888 N
+ ER OW OY e n/a 13 1747 1836 1886 N
+ ER OW OY s n/a 13 1747 1836 1886 N
+ ER OW P b n/a 13 1747 1787 1896 N
+ ER OW P e n/a 13 1747 1786 1896 N
+ ER OW P s n/a 13 1747 1786 1896 N
+ ER OW R e n/a 13 1747 1835 1895 N
+ ER OW R s n/a 13 1747 1835 1895 N
+ ER OW S b n/a 13 1747 1773 1879 N
+ ER OW S e n/a 13 1747 1773 1879 N
+ ER OW S i n/a 13 1747 1773 1879 N
+ ER OW S s n/a 13 1747 1773 1879 N
+ ER OW SH b n/a 13 1747 1773 1880 N
+ ER OW SH e n/a 13 1747 1773 1880 N
+ ER OW SH i n/a 13 1747 1773 1880 N
+ ER OW SH s n/a 13 1747 1773 1880 N
+ ER OW SIL e n/a 13 1747 1799 1900 N
+ ER OW SIL s n/a 13 1747 1799 1901 N
+ ER OW T b n/a 13 1747 1774 1868 N
+ ER OW T e n/a 13 1747 1774 1868 N
+ ER OW T i n/a 13 1747 1774 1867 N
+ ER OW T s n/a 13 1747 1774 1868 N
+ ER OW TH b n/a 13 1747 1773 1875 N
+ ER OW TH e n/a 13 1747 1773 1875 N
+ ER OW TH i n/a 13 1747 1773 1875 N
+ ER OW TH s n/a 13 1747 1773 1875 N
+ ER OW UH b n/a 13 1747 1836 1888 N
+ ER OW UH e n/a 13 1747 1835 1886 N
+ ER OW UH s n/a 13 1747 1835 1886 N
+ ER OW UW b n/a 13 1747 1839 1888 N
+ ER OW UW e n/a 13 1747 1836 1886 N
+ ER OW UW s n/a 13 1747 1836 1886 N
+ ER OW V b n/a 13 1747 1787 1889 N
+ ER OW V e n/a 13 1747 1786 1889 N
+ ER OW V s n/a 13 1747 1786 1889 N
+ ER OW W b n/a 13 1747 1845 1894 N
+ ER OW W e n/a 13 1747 1845 1894 N
+ ER OW W i n/a 13 1747 1845 1894 N
+ ER OW W s n/a 13 1747 1845 1894 N
+ ER OW Y e n/a 13 1747 1823 1861 N
+ ER OW Y s n/a 13 1747 1823 1861 N
+ ER OW Z b n/a 13 1747 1774 1882 N
+ ER OW Z e n/a 13 1747 1774 1882 N
+ ER OW Z i n/a 13 1747 1774 1882 N
+ ER OW Z s n/a 13 1747 1774 1882 N
+ ER OW ZH e n/a 13 1747 1774 1882 N
+ ER OW ZH s n/a 13 1747 1774 1882 N
+ ER OY AA b n/a 13 1698 1839 1888 N
+ ER OY AA e n/a 13 1696 1836 1887 N
+ ER OY AA s n/a 13 1696 1836 1888 N
+ ER OY AE b n/a 13 1698 1831 1850 N
+ ER OY AE e n/a 13 1696 1821 1851 N
+ ER OY AE s n/a 13 1696 1830 1848 N
+ ER OY AH b n/a 13 1698 1830 1848 N
+ ER OY AH e n/a 13 1696 1820 1852 N
+ ER OY AH s n/a 13 1696 1830 1848 N
+ ER OY AO b n/a 13 1698 1839 1888 N
+ ER OY AO e n/a 13 1696 1836 1886 N
+ ER OY AO s n/a 13 1696 1836 1886 N
+ ER OY AW b n/a 13 1698 1831 1850 N
+ ER OY AW e n/a 13 1696 1821 1852 N
+ ER OY AW s n/a 13 1696 1831 1848 N
+ ER OY AY b n/a 13 1698 1839 1888 N
+ ER OY AY e n/a 13 1696 1836 1887 N
+ ER OY AY s n/a 13 1696 1836 1888 N
+ ER OY B b n/a 13 1696 1788 1897 N
+ ER OY B e n/a 13 1696 1788 1897 N
+ ER OY B i n/a 13 1696 1790 1897 N
+ ER OY B s n/a 13 1696 1786 1897 N
+ ER OY CH b n/a 13 1696 1772 1868 N
+ ER OY CH e n/a 13 1696 1772 1868 N
+ ER OY CH s n/a 13 1696 1773 1868 N
+ ER OY D b n/a 13 1696 1772 1866 N
+ ER OY D e n/a 13 1696 1772 1866 N
+ ER OY D i n/a 13 1696 1772 1865 N
+ ER OY D s n/a 13 1696 1773 1866 N
+ ER OY DH b n/a 13 1696 1772 1874 N
+ ER OY DH e n/a 13 1696 1772 1874 N
+ ER OY DH s n/a 13 1696 1773 1874 N
+ ER OY EH b n/a 13 1698 1831 1849 N
+ ER OY EH e n/a 13 1696 1822 1851 N
+ ER OY EH s n/a 13 1696 1830 1849 N
+ ER OY ER b n/a 13 1698 1842 1890 N
+ ER OY ER e n/a 13 1696 1843 1890 N
+ ER OY ER s n/a 13 1696 1843 1890 N
+ ER OY EY b n/a 13 1698 1825 1858 N
+ ER OY EY e n/a 13 1696 1822 1851 N
+ ER OY EY s n/a 13 1696 1825 1854 N
+ ER OY F b n/a 13 1696 1788 1898 N
+ ER OY F e n/a 13 1696 1788 1898 N
+ ER OY F s n/a 13 1696 1786 1898 N
+ ER OY G b n/a 13 1696 1772 1871 N
+ ER OY G e n/a 13 1696 1772 1871 N
+ ER OY G s n/a 13 1696 1773 1871 N
+ ER OY HH b n/a 13 1696 1772 1859 N
+ ER OY HH e n/a 13 1696 1768 1859 N
+ ER OY HH s n/a 13 1696 1773 1859 N
+ ER OY IH b n/a 13 1698 1825 1858 N
+ ER OY IH e n/a 13 1696 1822 1853 N
+ ER OY IH s n/a 13 1696 1823 1854 N
+ ER OY IY b n/a 13 1698 1824 1855 N
+ ER OY IY e n/a 13 1696 1822 1853 N
+ ER OY IY i n/a 13 1696 1824 1855 N
+ ER OY IY s n/a 13 1696 1824 1854 N
+ ER OY JH b n/a 13 1696 1772 1866 N
+ ER OY JH e n/a 13 1696 1772 1866 N
+ ER OY JH s n/a 13 1696 1773 1866 N
+ ER OY K b n/a 13 1696 1772 1870 N
+ ER OY K e n/a 13 1696 1772 1870 N
+ ER OY K s n/a 13 1696 1773 1870 N
+ ER OY L b n/a 13 1696 1842 1884 N
+ ER OY L e n/a 13 1696 1840 1885 N
+ ER OY L s n/a 13 1696 1840 1885 N
+ ER OY M b n/a 13 1696 1788 1891 N
+ ER OY M e n/a 13 1696 1788 1891 N
+ ER OY M i n/a 13 1696 1790 1892 N
+ ER OY M s n/a 13 1696 1786 1891 N
+ ER OY N b n/a 13 1696 1795 1862 N
+ ER OY N e n/a 13 1696 1792 1863 N
+ ER OY N s n/a 13 1696 1792 1863 N
+ ER OY NG e n/a 13 1696 1769 1861 N
+ ER OY NG s n/a 13 1696 1773 1861 N
+ ER OY OW b n/a 13 1698 1839 1888 N
+ ER OY OW e n/a 13 1696 1836 1886 N
+ ER OY OW s n/a 13 1696 1836 1886 N
+ ER OY OY b n/a 13 1698 1839 1888 N
+ ER OY OY e n/a 13 1696 1836 1886 N
+ ER OY OY s n/a 13 1696 1836 1886 N
+ ER OY P b n/a 13 1696 1788 1896 N
+ ER OY P e n/a 13 1696 1788 1896 N
+ ER OY P s n/a 13 1696 1786 1896 N
+ ER OY R e n/a 13 1696 1843 1895 N
+ ER OY R s n/a 13 1696 1843 1895 N
+ ER OY S b n/a 13 1696 1784 1879 N
+ ER OY S e n/a 13 1696 1784 1879 N
+ ER OY S s n/a 13 1696 1785 1879 N
+ ER OY SH b n/a 13 1696 1772 1880 N
+ ER OY SH e n/a 13 1696 1772 1880 N
+ ER OY SH s n/a 13 1696 1773 1880 N
+ ER OY SIL e n/a 13 1696 1797 1899 N
+ ER OY SIL s n/a 13 1696 1799 1901 N
+ ER OY T b n/a 13 1696 1772 1868 N
+ ER OY T e n/a 13 1696 1772 1868 N
+ ER OY T i n/a 13 1696 1772 1867 N
+ ER OY T s n/a 13 1696 1773 1868 N
+ ER OY TH b n/a 13 1696 1772 1875 N
+ ER OY TH e n/a 13 1696 1772 1875 N
+ ER OY TH s n/a 13 1696 1773 1875 N
+ ER OY UH b n/a 13 1698 1842 1888 N
+ ER OY UH e n/a 13 1696 1840 1886 N
+ ER OY UH s n/a 13 1696 1840 1886 N
+ ER OY UW b n/a 13 1698 1839 1888 N
+ ER OY UW e n/a 13 1696 1836 1886 N
+ ER OY UW s n/a 13 1696 1836 1886 N
+ ER OY V b n/a 13 1696 1788 1889 N
+ ER OY V e n/a 13 1696 1788 1889 N
+ ER OY V s n/a 13 1696 1786 1889 N
+ ER OY W b n/a 13 1696 1845 1893 N
+ ER OY W e n/a 13 1696 1845 1893 N
+ ER OY W i n/a 13 1696 1845 1893 N
+ ER OY W s n/a 13 1696 1845 1893 N
+ ER OY Y e n/a 13 1696 1822 1861 N
+ ER OY Y s n/a 13 1696 1823 1861 N
+ ER OY Z b n/a 13 1696 1766 1881 N
+ ER OY Z e n/a 13 1696 1766 1881 N
+ ER OY Z i n/a 13 1696 1766 1881 N
+ ER OY Z s n/a 13 1696 1766 1881 N
+ ER OY ZH e n/a 13 1696 1772 1881 N
+ ER OY ZH s n/a 13 1696 1773 1881 N
+ ER P AA b n/a 13 1752 1839 1888 N
+ ER P AA e n/a 13 1751 1838 1887 N
+ ER P AA i n/a 13 1752 1839 1888 N
+ ER P AA s n/a 13 1752 1838 1888 N
+ ER P AE b n/a 13 1752 1831 1850 N
+ ER P AE e n/a 13 1751 1833 1851 N
+ ER P AE i n/a 13 1752 1831 1850 N
+ ER P AE s n/a 13 1752 1829 1848 N
+ ER P AH b n/a 13 1751 1832 1848 N
+ ER P AH e n/a 13 1751 1833 1848 N
+ ER P AH i n/a 13 1751 1832 1847 N
+ ER P AH s n/a 13 1751 1832 1848 N
+ ER P AO b n/a 13 1752 1839 1888 N
+ ER P AO e n/a 13 1751 1838 1886 N
+ ER P AO i n/a 13 1752 1839 1888 N
+ ER P AO s n/a 13 1752 1838 1886 N
+ ER P AW b n/a 13 1752 1831 1850 N
+ ER P AW e n/a 13 1752 1833 1852 N
+ ER P AW i n/a 13 1752 1831 1850 N
+ ER P AW s n/a 13 1752 1831 1848 N
+ ER P AY b n/a 13 1752 1839 1888 N
+ ER P AY e n/a 13 1752 1838 1887 N
+ ER P AY i n/a 13 1752 1839 1888 N
+ ER P AY s n/a 13 1752 1838 1888 N
+ ER P B b n/a 13 1756 1805 1897 N
+ ER P B e n/a 13 1756 1805 1897 N
+ ER P B i n/a 13 1755 1804 1897 N
+ ER P B s n/a 13 1756 1805 1897 N
+ ER P CH b n/a 13 1757 1808 1868 N
+ ER P CH e n/a 13 1757 1808 1868 N
+ ER P CH i n/a 13 1755 1808 1868 N
+ ER P CH s n/a 13 1757 1808 1868 N
+ ER P D b n/a 13 1757 1815 1866 N
+ ER P D e n/a 13 1757 1815 1866 N
+ ER P D i n/a 13 1754 1815 1864 N
+ ER P D s n/a 13 1757 1815 1866 N
+ ER P DH b n/a 13 1758 1819 1872 N
+ ER P DH e n/a 13 1758 1819 1872 N
+ ER P DH s n/a 13 1758 1819 1874 N
+ ER P EH b n/a 13 1752 1831 1849 N
+ ER P EH e n/a 13 1751 1833 1851 N
+ ER P EH i n/a 13 1752 1831 1849 N
+ ER P EH s n/a 13 1752 1829 1849 N
+ ER P ER b n/a 13 1751 1843 1890 N
+ ER P ER e n/a 13 1751 1843 1890 N
+ ER P ER i n/a 13 1751 1843 1890 N
+ ER P ER s n/a 13 1751 1843 1890 N
+ ER P EY b n/a 13 1752 1827 1858 N
+ ER P EY e n/a 13 1752 1833 1851 N
+ ER P EY i n/a 13 1752 1827 1857 N
+ ER P EY s n/a 13 1752 1827 1854 N
+ ER P F b n/a 13 1756 1805 1898 N
+ ER P F e n/a 13 1756 1805 1898 N
+ ER P F i n/a 13 1755 1805 1898 N
+ ER P F s n/a 13 1756 1805 1898 N
+ ER P G b n/a 13 1757 1810 1871 N
+ ER P G e n/a 13 1757 1810 1871 N
+ ER P G i n/a 13 1755 1810 1871 N
+ ER P G s n/a 13 1757 1810 1871 N
+ ER P HH b n/a 13 1757 1809 1859 N
+ ER P HH e n/a 13 1757 1809 1859 N
+ ER P HH i n/a 13 1755 1809 1860 N
+ ER P HH s n/a 13 1757 1809 1859 N
+ ER P IH b n/a 13 1751 1826 1858 N
+ ER P IH e n/a 13 1751 1826 1854 N
+ ER P IH i n/a 13 1751 1826 1856 N
+ ER P IH s n/a 13 1751 1826 1854 N
+ ER P IY b n/a 13 1749 1826 1855 N
+ ER P IY e n/a 13 1752 1826 1854 N
+ ER P IY i n/a 13 1750 1826 1855 N
+ ER P IY s n/a 13 1749 1826 1854 N
+ ER P JH b n/a 13 1757 1810 1866 N
+ ER P JH e n/a 13 1757 1810 1866 N
+ ER P JH i n/a 13 1755 1810 1864 N
+ ER P JH s n/a 13 1757 1810 1866 N
+ ER P K b n/a 13 1757 1809 1870 N
+ ER P K e n/a 13 1757 1809 1870 N
+ ER P K i n/a 13 1755 1809 1870 N
+ ER P K s n/a 13 1757 1809 1870 N
+ ER P L b n/a 13 1756 1842 1884 N
+ ER P L e n/a 13 1756 1841 1884 N
+ ER P L i n/a 13 1755 1842 1884 N
+ ER P L s n/a 13 1756 1842 1884 N
+ ER P M b n/a 13 1756 1805 1891 N
+ ER P M e n/a 13 1756 1805 1891 N
+ ER P M i n/a 13 1755 1805 1892 N
+ ER P M s n/a 13 1756 1805 1891 N
+ ER P N b n/a 13 1757 1815 1862 N
+ ER P N e n/a 13 1757 1815 1863 N
+ ER P N i n/a 13 1754 1815 1862 N
+ ER P N s n/a 13 1757 1815 1862 N
+ ER P NG e n/a 13 1757 1807 1861 N
+ ER P NG s n/a 13 1757 1807 1861 N
+ ER P OW b n/a 13 1752 1839 1888 N
+ ER P OW e n/a 13 1752 1838 1886 N
+ ER P OW i n/a 13 1752 1838 1888 N
+ ER P OW s n/a 13 1752 1838 1886 N
+ ER P OY b n/a 13 1752 1839 1888 N
+ ER P OY e n/a 13 1752 1838 1886 N
+ ER P OY s n/a 13 1752 1838 1886 N
+ ER P P b n/a 13 1756 1805 1896 N
+ ER P P e n/a 13 1756 1805 1896 N
+ ER P P i n/a 13 1755 1805 1896 N
+ ER P P s n/a 13 1756 1805 1896 N
+ ER P R e n/a 13 1756 1843 1895 N
+ ER P R i n/a 13 1755 1843 1895 N
+ ER P R s n/a 13 1756 1843 1895 N
+ ER P S b n/a 13 1757 1817 1878 N
+ ER P S e n/a 13 1757 1817 1878 N
+ ER P S i n/a 13 1755 1817 1878 N
+ ER P S s n/a 13 1757 1817 1878 N
+ ER P SH b n/a 13 1757 1806 1880 N
+ ER P SH e n/a 13 1757 1806 1880 N
+ ER P SH i n/a 13 1755 1806 1880 N
+ ER P SH s n/a 13 1757 1806 1880 N
+ ER P SIL e n/a 13 1751 1813 1900 N
+ ER P SIL s n/a 13 1752 1814 1900 N
+ ER P T b n/a 13 1757 1815 1868 N
+ ER P T e n/a 13 1757 1815 1868 N
+ ER P T i n/a 13 1754 1815 1868 N
+ ER P T s n/a 13 1757 1815 1868 N
+ ER P TH b n/a 13 1758 1819 1875 N
+ ER P TH e n/a 13 1758 1819 1875 N
+ ER P TH i n/a 13 1755 1819 1875 N
+ ER P TH s n/a 13 1758 1819 1875 N
+ ER P UH b n/a 13 1752 1843 1888 N
+ ER P UH e n/a 13 1751 1843 1886 N
+ ER P UH s n/a 13 1752 1843 1886 N
+ ER P UW b n/a 13 1752 1839 1888 N
+ ER P UW e n/a 13 1752 1838 1886 N
+ ER P UW i n/a 13 1752 1839 1888 N
+ ER P UW s n/a 13 1752 1838 1886 N
+ ER P V b n/a 13 1756 1805 1889 N
+ ER P V e n/a 13 1756 1805 1889 N
+ ER P V i n/a 13 1755 1804 1889 N
+ ER P V s n/a 13 1756 1805 1889 N
+ ER P W b n/a 13 1756 1844 1894 N
+ ER P W e n/a 13 1756 1844 1894 N
+ ER P W i n/a 13 1755 1844 1894 N
+ ER P W s n/a 13 1756 1844 1894 N
+ ER P Y e n/a 13 1757 1828 1861 N
+ ER P Y i n/a 13 1755 1828 1861 N
+ ER P Y s n/a 13 1757 1828 1861 N
+ ER P Z b n/a 13 1757 1817 1882 N
+ ER P Z e n/a 13 1757 1817 1882 N
+ ER P Z i n/a 13 1754 1817 1882 N
+ ER P Z s n/a 13 1757 1817 1882 N
+ ER P ZH e n/a 13 1757 1810 1882 N
+ ER P ZH i n/a 13 1755 1810 1882 N
+ ER P ZH s n/a 13 1757 1810 1882 N
+ ER R AA b n/a 13 1743 1839 1888 N
+ ER R AA e n/a 13 1742 1836 1887 N
+ ER R AA s n/a 13 1742 1836 1888 N
+ ER R AE b n/a 13 1743 1831 1850 N
+ ER R AE e n/a 13 1742 1833 1851 N
+ ER R AE s n/a 13 1742 1830 1848 N
+ ER R AH b n/a 13 1743 1830 1848 N
+ ER R AH e n/a 13 1742 1833 1852 N
+ ER R AH i n/a 13 1742 1830 1847 N
+ ER R AH s n/a 13 1742 1830 1848 N
+ ER R AO b n/a 13 1743 1839 1888 N
+ ER R AO e n/a 13 1742 1836 1886 N
+ ER R AO s n/a 13 1742 1836 1886 N
+ ER R AW b n/a 13 1743 1831 1850 N
+ ER R AW e n/a 13 1742 1833 1852 N
+ ER R AW s n/a 13 1742 1831 1848 N
+ ER R AY b n/a 13 1743 1839 1888 N
+ ER R AY e n/a 13 1742 1836 1887 N
+ ER R AY i n/a 13 1742 1839 1888 N
+ ER R AY s n/a 13 1742 1836 1888 N
+ ER R B b n/a 13 1743 1787 1897 N
+ ER R B e n/a 13 1742 1786 1897 N
+ ER R B s n/a 13 1742 1786 1897 N
+ ER R CH b n/a 13 1743 1768 1868 N
+ ER R CH e n/a 13 1742 1770 1868 N
+ ER R CH s n/a 13 1742 1773 1868 N
+ ER R D b n/a 13 1743 1769 1866 N
+ ER R D e n/a 13 1742 1770 1866 N
+ ER R D i n/a 13 1742 1769 1864 N
+ ER R D s n/a 13 1742 1773 1866 N
+ ER R DH b n/a 13 1743 1769 1872 N
+ ER R DH e n/a 13 1742 1770 1872 N
+ ER R DH s n/a 13 1742 1773 1874 N
+ ER R EH b n/a 13 1743 1831 1849 N
+ ER R EH e n/a 13 1742 1833 1851 N
+ ER R EH i n/a 13 1742 1831 1849 N
+ ER R EH s n/a 13 1742 1830 1849 N
+ ER R ER b n/a 13 1743 1842 1890 N
+ ER R ER e n/a 13 1742 1843 1890 N
+ ER R ER s n/a 13 1742 1843 1890 N
+ ER R EY b n/a 13 1743 1825 1858 N
+ ER R EY e n/a 13 1742 1833 1851 N
+ ER R EY s n/a 13 1742 1825 1854 N
+ ER R F b n/a 13 1743 1787 1898 N
+ ER R F e n/a 13 1742 1786 1898 N
+ ER R F i n/a 13 1742 1790 1898 N
+ ER R F s n/a 13 1742 1786 1898 N
+ ER R G b n/a 13 1743 1769 1871 N
+ ER R G e n/a 13 1742 1770 1871 N
+ ER R G s n/a 13 1742 1773 1871 N
+ ER R HH b n/a 13 1743 1768 1859 N
+ ER R HH e n/a 13 1742 1768 1859 N
+ ER R HH s n/a 13 1742 1773 1859 N
+ ER R IH b n/a 13 1743 1825 1858 N
+ ER R IH e n/a 13 1742 1823 1853 N
+ ER R IH i n/a 13 1742 1823 1856 N
+ ER R IH s n/a 13 1742 1823 1854 N
+ ER R IY b n/a 13 1743 1824 1855 N
+ ER R IY e n/a 13 1742 1824 1853 N
+ ER R IY i n/a 13 1742 1824 1855 N
+ ER R IY s n/a 13 1742 1824 1854 N
+ ER R JH b n/a 13 1743 1769 1866 N
+ ER R JH e n/a 13 1742 1770 1866 N
+ ER R JH s n/a 13 1742 1773 1866 N
+ ER R K b n/a 13 1743 1768 1870 N
+ ER R K e n/a 13 1742 1770 1870 N
+ ER R K i n/a 13 1742 1768 1870 N
+ ER R K s n/a 13 1742 1773 1870 N
+ ER R L b n/a 13 1743 1842 1884 N
+ ER R L e n/a 13 1742 1840 1885 N
+ ER R L i n/a 13 1742 1840 1885 N
+ ER R L s n/a 13 1742 1840 1885 N
+ ER R M b n/a 13 1743 1787 1891 N
+ ER R M e n/a 13 1742 1786 1891 N
+ ER R M s n/a 13 1742 1786 1891 N
+ ER R N b n/a 13 1743 1795 1862 N
+ ER R N e n/a 13 1742 1792 1863 N
+ ER R N s n/a 13 1742 1792 1863 N
+ ER R NG e n/a 13 1742 1769 1861 N
+ ER R NG s n/a 13 1742 1773 1861 N
+ ER R OW b n/a 13 1743 1839 1888 N
+ ER R OW e n/a 13 1742 1836 1886 N
+ ER R OW s n/a 13 1742 1836 1886 N
+ ER R OY b n/a 13 1743 1839 1888 N
+ ER R OY e n/a 13 1742 1836 1886 N
+ ER R OY s n/a 13 1742 1836 1886 N
+ ER R P b n/a 13 1743 1787 1896 N
+ ER R P e n/a 13 1742 1786 1896 N
+ ER R P s n/a 13 1742 1786 1896 N
+ ER R R e n/a 13 1742 1843 1895 N
+ ER R R s n/a 13 1742 1843 1895 N
+ ER R S b n/a 13 1743 1768 1879 N
+ ER R S e n/a 13 1742 1770 1879 N
+ ER R S s n/a 13 1742 1773 1879 N
+ ER R SH b n/a 13 1743 1768 1880 N
+ ER R SH e n/a 13 1742 1770 1880 N
+ ER R SH s n/a 13 1742 1773 1880 N
+ ER R SIL e n/a 13 1742 1800 1900 N
+ ER R SIL s n/a 13 1742 1799 1901 N
+ ER R T b n/a 13 1743 1768 1868 N
+ ER R T e n/a 13 1742 1770 1868 N
+ ER R T s n/a 13 1742 1773 1868 N
+ ER R TH b n/a 13 1743 1769 1875 N
+ ER R TH e n/a 13 1742 1770 1875 N
+ ER R TH s n/a 13 1742 1773 1875 N
+ ER R UH b n/a 13 1743 1842 1888 N
+ ER R UH e n/a 13 1742 1840 1886 N
+ ER R UH s n/a 13 1742 1840 1886 N
+ ER R UW b n/a 13 1743 1839 1888 N
+ ER R UW e n/a 13 1742 1836 1886 N
+ ER R UW s n/a 13 1742 1836 1886 N
+ ER R V b n/a 13 1743 1787 1889 N
+ ER R V e n/a 13 1742 1786 1889 N
+ ER R V s n/a 13 1742 1786 1889 N
+ ER R W b n/a 13 1743 1845 1894 N
+ ER R W e n/a 13 1742 1845 1894 N
+ ER R W s n/a 13 1742 1845 1894 N
+ ER R Y e n/a 13 1742 1823 1861 N
+ ER R Y s n/a 13 1742 1823 1861 N
+ ER R Z b n/a 13 1743 1769 1882 N
+ ER R Z e n/a 13 1742 1770 1882 N
+ ER R Z i n/a 13 1742 1769 1882 N
+ ER R Z s n/a 13 1742 1773 1882 N
+ ER R ZH e n/a 13 1742 1770 1882 N
+ ER R ZH s n/a 13 1742 1773 1882 N
+ ER S AA b n/a 13 1720 1839 1888 N
+ ER S AA e n/a 13 1729 1836 1887 N
+ ER S AA i n/a 13 1716 1839 1888 N
+ ER S AA s n/a 13 1723 1836 1888 N
+ ER S AE b n/a 13 1720 1831 1850 N
+ ER S AE e n/a 13 1729 1821 1851 N
+ ER S AE i n/a 13 1716 1831 1850 N
+ ER S AE s n/a 13 1723 1830 1848 N
+ ER S AH b n/a 13 1720 1829 1848 N
+ ER S AH e n/a 13 1729 1820 1852 N
+ ER S AH i n/a 13 1716 1829 1847 N
+ ER S AH s n/a 13 1723 1830 1848 N
+ ER S AO b n/a 13 1720 1839 1888 N
+ ER S AO e n/a 13 1729 1836 1886 N
+ ER S AO i n/a 13 1716 1839 1888 N
+ ER S AO s n/a 13 1723 1836 1886 N
+ ER S AW b n/a 13 1720 1831 1850 N
+ ER S AW e n/a 13 1729 1821 1852 N
+ ER S AW i n/a 13 1716 1831 1850 N
+ ER S AW s n/a 13 1723 1831 1848 N
+ ER S AY b n/a 13 1720 1839 1888 N
+ ER S AY e n/a 13 1729 1836 1887 N
+ ER S AY i n/a 13 1716 1839 1888 N
+ ER S AY s n/a 13 1723 1836 1888 N
+ ER S B b n/a 13 1714 1787 1897 N
+ ER S B e n/a 13 1714 1788 1897 N
+ ER S B i n/a 13 1714 1791 1897 N
+ ER S B s n/a 13 1715 1786 1897 N
+ ER S CH b n/a 13 1713 1776 1868 N
+ ER S CH e n/a 13 1714 1776 1868 N
+ ER S CH i n/a 13 1713 1776 1867 N
+ ER S CH s n/a 13 1715 1776 1868 N
+ ER S D b n/a 13 1714 1776 1866 N
+ ER S D e n/a 13 1714 1776 1866 N
+ ER S D i n/a 13 1714 1776 1865 N
+ ER S D s n/a 13 1715 1776 1866 N
+ ER S DH b n/a 13 1713 1776 1872 N
+ ER S DH e n/a 13 1713 1781 1872 N
+ ER S DH s n/a 13 1715 1781 1874 N
+ ER S EH b n/a 13 1720 1831 1849 N
+ ER S EH e n/a 13 1729 1822 1851 N
+ ER S EH i n/a 13 1716 1831 1849 N
+ ER S EH s n/a 13 1723 1830 1849 N
+ ER S ER b n/a 13 1720 1846 1890 N
+ ER S ER e n/a 13 1729 1846 1890 N
+ ER S ER i n/a 13 1716 1846 1890 N
+ ER S ER s n/a 13 1723 1846 1890 N
+ ER S EY b n/a 13 1720 1825 1858 N
+ ER S EY e n/a 13 1729 1822 1851 N
+ ER S EY i n/a 13 1716 1825 1857 N
+ ER S EY s n/a 13 1723 1825 1854 N
+ ER S F b n/a 13 1713 1787 1898 N
+ ER S F e n/a 13 1713 1788 1898 N
+ ER S F i n/a 13 1713 1790 1898 N
+ ER S F s n/a 13 1715 1786 1898 N
+ ER S G b n/a 13 1714 1778 1871 N
+ ER S G e n/a 13 1714 1778 1871 N
+ ER S G i n/a 13 1714 1778 1871 N
+ ER S G s n/a 13 1715 1778 1871 N
+ ER S HH b n/a 13 1713 1777 1859 N
+ ER S HH e n/a 13 1713 1777 1859 N
+ ER S HH s n/a 13 1715 1777 1859 N
+ ER S IH b n/a 13 1720 1825 1858 N
+ ER S IH e n/a 13 1729 1822 1853 N
+ ER S IH i n/a 13 1716 1825 1856 N
+ ER S IH s n/a 13 1723 1823 1854 N
+ ER S IY b n/a 13 1720 1824 1855 N
+ ER S IY e n/a 13 1729 1822 1853 N
+ ER S IY i n/a 13 1716 1824 1855 N
+ ER S IY s n/a 13 1723 1824 1854 N
+ ER S JH b n/a 13 1713 1775 1866 N
+ ER S JH e n/a 13 1714 1775 1866 N
+ ER S JH i n/a 13 1713 1775 1866 N
+ ER S JH s n/a 13 1715 1775 1866 N
+ ER S K b n/a 13 1713 1778 1870 N
+ ER S K e n/a 13 1714 1778 1870 N
+ ER S K i n/a 13 1713 1778 1870 N
+ ER S K s n/a 13 1715 1778 1870 N
+ ER S L b n/a 13 1713 1842 1884 N
+ ER S L e n/a 13 1713 1840 1885 N
+ ER S L i n/a 13 1713 1840 1885 N
+ ER S L s n/a 13 1715 1840 1885 N
+ ER S M b n/a 13 1713 1787 1891 N
+ ER S M e n/a 13 1713 1788 1891 N
+ ER S M i n/a 13 1713 1791 1892 N
+ ER S M s n/a 13 1715 1786 1891 N
+ ER S N b n/a 13 1713 1795 1862 N
+ ER S N e n/a 13 1713 1795 1863 N
+ ER S N i n/a 13 1713 1795 1862 N
+ ER S N s n/a 13 1715 1795 1863 N
+ ER S NG e n/a 13 1713 1778 1861 N
+ ER S NG s n/a 13 1715 1778 1861 N
+ ER S OW b n/a 13 1720 1839 1888 N
+ ER S OW e n/a 13 1729 1836 1886 N
+ ER S OW i n/a 13 1716 1838 1888 N
+ ER S OW s n/a 13 1723 1836 1886 N
+ ER S OY b n/a 13 1720 1839 1888 N
+ ER S OY e n/a 13 1729 1836 1886 N
+ ER S OY s n/a 13 1723 1836 1886 N
+ ER S P b n/a 13 1713 1787 1896 N
+ ER S P e n/a 13 1714 1788 1896 N
+ ER S P i n/a 13 1713 1790 1896 N
+ ER S P s n/a 13 1715 1786 1896 N
+ ER S R e n/a 13 1713 1846 1895 N
+ ER S R i n/a 13 1713 1846 1895 N
+ ER S R s n/a 13 1715 1846 1895 N
+ ER S S b n/a 13 1714 1784 1879 N
+ ER S S e n/a 13 1714 1784 1879 N
+ ER S S i n/a 13 1714 1784 1879 N
+ ER S S s n/a 13 1715 1785 1879 N
+ ER S SH b n/a 13 1713 1784 1880 N
+ ER S SH e n/a 13 1713 1784 1880 N
+ ER S SH i n/a 13 1713 1784 1880 N
+ ER S SH s n/a 13 1715 1785 1880 N
+ ER S SIL e n/a 13 1712 1796 1899 N
+ ER S SIL s n/a 13 1715 1799 1901 N
+ ER S T b n/a 13 1713 1776 1868 N
+ ER S T e n/a 13 1714 1776 1868 N
+ ER S T i n/a 13 1713 1776 1867 N
+ ER S T s n/a 13 1715 1776 1868 N
+ ER S TH b n/a 13 1713 1776 1875 N
+ ER S TH e n/a 13 1713 1781 1875 N
+ ER S TH s n/a 13 1715 1781 1875 N
+ ER S UH b n/a 13 1720 1842 1888 N
+ ER S UH e n/a 13 1729 1840 1886 N
+ ER S UH s n/a 13 1723 1840 1886 N
+ ER S UW b n/a 13 1720 1839 1888 N
+ ER S UW e n/a 13 1729 1836 1886 N
+ ER S UW i n/a 13 1716 1839 1888 N
+ ER S UW s n/a 13 1723 1836 1886 N
+ ER S V b n/a 13 1713 1787 1889 N
+ ER S V e n/a 13 1713 1788 1889 N
+ ER S V i n/a 13 1713 1791 1889 N
+ ER S V s n/a 13 1715 1786 1889 N
+ ER S W b n/a 13 1713 1846 1893 N
+ ER S W e n/a 13 1713 1846 1893 N
+ ER S W s n/a 13 1715 1846 1893 N
+ ER S Y e n/a 13 1713 1822 1861 N
+ ER S Y s n/a 13 1715 1823 1861 N
+ ER S Z b n/a 13 1714 1765 1881 N
+ ER S Z e n/a 13 1714 1765 1881 N
+ ER S Z i n/a 13 1714 1765 1881 N
+ ER S Z s n/a 13 1715 1765 1881 N
+ ER S ZH e n/a 13 1713 1780 1881 N
+ ER S ZH s n/a 13 1715 1779 1881 N
+ ER SH AA b n/a 13 1720 1839 1888 N
+ ER SH AA e n/a 13 1727 1836 1887 N
+ ER SH AA i n/a 13 1716 1839 1888 N
+ ER SH AA s n/a 13 1723 1836 1888 N
+ ER SH AE b n/a 13 1720 1831 1850 N
+ ER SH AE e n/a 13 1727 1821 1851 N
+ ER SH AE i n/a 13 1716 1831 1850 N
+ ER SH AE s n/a 13 1723 1830 1848 N
+ ER SH AH b n/a 13 1720 1829 1848 N
+ ER SH AH e n/a 13 1727 1820 1852 N
+ ER SH AH i n/a 13 1717 1829 1847 N
+ ER SH AH s n/a 13 1723 1830 1848 N
+ ER SH AO b n/a 13 1720 1839 1888 N
+ ER SH AO e n/a 13 1727 1836 1886 N
+ ER SH AO s n/a 13 1723 1836 1886 N
+ ER SH AW b n/a 13 1720 1831 1850 N
+ ER SH AW e n/a 13 1727 1821 1852 N
+ ER SH AW s n/a 13 1723 1831 1848 N
+ ER SH AY b n/a 13 1720 1839 1888 N
+ ER SH AY e n/a 13 1727 1836 1887 N
+ ER SH AY i n/a 13 1716 1839 1888 N
+ ER SH AY s n/a 13 1723 1836 1888 N
+ ER SH B b n/a 13 1726 1788 1897 N
+ ER SH B e n/a 13 1727 1788 1897 N
+ ER SH B i n/a 13 1726 1790 1897 N
+ ER SH B s n/a 13 1726 1786 1897 N
+ ER SH CH b n/a 13 1726 1768 1868 N
+ ER SH CH e n/a 13 1727 1771 1868 N
+ ER SH CH s n/a 13 1726 1773 1868 N
+ ER SH D b n/a 13 1727 1771 1866 N
+ ER SH D e n/a 13 1727 1771 1866 N
+ ER SH D i n/a 13 1727 1771 1865 N
+ ER SH D s n/a 13 1727 1773 1866 N
+ ER SH DH b n/a 13 1727 1771 1872 N
+ ER SH DH e n/a 13 1727 1771 1872 N
+ ER SH DH s n/a 13 1727 1773 1874 N
+ ER SH EH b n/a 13 1720 1831 1849 N
+ ER SH EH e n/a 13 1727 1822 1851 N
+ ER SH EH i n/a 13 1716 1831 1849 N
+ ER SH EH s n/a 13 1723 1830 1849 N
+ ER SH ER b n/a 13 1720 1842 1890 N
+ ER SH ER e n/a 13 1727 1843 1890 N
+ ER SH ER i n/a 13 1717 1843 1890 N
+ ER SH ER s n/a 13 1723 1843 1890 N
+ ER SH EY b n/a 13 1720 1825 1858 N
+ ER SH EY e n/a 13 1727 1822 1851 N
+ ER SH EY i n/a 13 1716 1825 1857 N
+ ER SH EY s n/a 13 1723 1825 1854 N
+ ER SH F b n/a 13 1726 1788 1898 N
+ ER SH F e n/a 13 1727 1788 1898 N
+ ER SH F i n/a 13 1726 1790 1898 N
+ ER SH F s n/a 13 1726 1786 1898 N
+ ER SH G b n/a 13 1726 1771 1871 N
+ ER SH G e n/a 13 1727 1771 1871 N
+ ER SH G i n/a 13 1726 1771 1871 N
+ ER SH G s n/a 13 1726 1773 1871 N
+ ER SH HH b n/a 13 1726 1768 1859 N
+ ER SH HH e n/a 13 1727 1768 1859 N
+ ER SH HH s n/a 13 1726 1773 1859 N
+ ER SH IH b n/a 13 1720 1825 1858 N
+ ER SH IH e n/a 13 1727 1822 1853 N
+ ER SH IH i n/a 13 1717 1823 1856 N
+ ER SH IH s n/a 13 1723 1823 1854 N
+ ER SH IY b n/a 13 1720 1824 1855 N
+ ER SH IY e n/a 13 1727 1822 1853 N
+ ER SH IY i n/a 13 1717 1824 1855 N
+ ER SH IY s n/a 13 1723 1824 1854 N
+ ER SH JH b n/a 13 1726 1771 1866 N
+ ER SH JH e n/a 13 1727 1771 1866 N
+ ER SH JH s n/a 13 1726 1773 1866 N
+ ER SH K b n/a 13 1726 1768 1870 N
+ ER SH K e n/a 13 1727 1771 1870 N
+ ER SH K i n/a 13 1726 1768 1870 N
+ ER SH K s n/a 13 1726 1773 1870 N
+ ER SH L b n/a 13 1726 1842 1884 N
+ ER SH L e n/a 13 1727 1840 1885 N
+ ER SH L i n/a 13 1726 1840 1885 N
+ ER SH L s n/a 13 1726 1840 1885 N
+ ER SH M b n/a 13 1726 1788 1891 N
+ ER SH M e n/a 13 1727 1788 1891 N
+ ER SH M i n/a 13 1726 1790 1892 N
+ ER SH M s n/a 13 1726 1786 1891 N
+ ER SH N b n/a 13 1727 1795 1862 N
+ ER SH N e n/a 13 1727 1795 1863 N
+ ER SH N i n/a 13 1727 1795 1862 N
+ ER SH N s n/a 13 1727 1795 1863 N
+ ER SH NG e n/a 13 1727 1769 1861 N
+ ER SH NG s n/a 13 1726 1773 1861 N
+ ER SH OW b n/a 13 1720 1839 1888 N
+ ER SH OW e n/a 13 1727 1836 1886 N
+ ER SH OW s n/a 13 1723 1836 1886 N
+ ER SH OY b n/a 13 1720 1839 1888 N
+ ER SH OY e n/a 13 1727 1836 1886 N
+ ER SH OY s n/a 13 1723 1836 1886 N
+ ER SH P b n/a 13 1726 1788 1896 N
+ ER SH P e n/a 13 1727 1788 1896 N
+ ER SH P s n/a 13 1726 1786 1896 N
+ ER SH R e n/a 13 1727 1843 1895 N
+ ER SH R s n/a 13 1726 1843 1895 N
+ ER SH S b n/a 13 1727 1784 1879 N
+ ER SH S e n/a 13 1727 1784 1879 N
+ ER SH S i n/a 13 1727 1784 1879 N
+ ER SH S s n/a 13 1727 1785 1879 N
+ ER SH SH b n/a 13 1726 1768 1880 N
+ ER SH SH e n/a 13 1727 1771 1880 N
+ ER SH SH s n/a 13 1726 1773 1880 N
+ ER SH SIL e n/a 13 1727 1796 1899 N
+ ER SH SIL s n/a 13 1726 1799 1901 N
+ ER SH T b n/a 13 1727 1768 1868 N
+ ER SH T e n/a 13 1727 1771 1868 N
+ ER SH T i n/a 13 1727 1768 1867 N
+ ER SH T s n/a 13 1727 1773 1868 N
+ ER SH TH b n/a 13 1727 1769 1875 N
+ ER SH TH e n/a 13 1727 1771 1875 N
+ ER SH TH s n/a 13 1727 1773 1875 N
+ ER SH UH b n/a 13 1720 1842 1888 N
+ ER SH UH e n/a 13 1727 1840 1886 N
+ ER SH UH s n/a 13 1723 1840 1886 N
+ ER SH UW b n/a 13 1720 1839 1888 N
+ ER SH UW e n/a 13 1727 1836 1886 N
+ ER SH UW i n/a 13 1717 1839 1888 N
+ ER SH UW s n/a 13 1723 1836 1886 N
+ ER SH V b n/a 13 1726 1788 1889 N
+ ER SH V e n/a 13 1727 1788 1889 N
+ ER SH V i n/a 13 1726 1790 1889 N
+ ER SH V s n/a 13 1726 1786 1889 N
+ ER SH W b n/a 13 1726 1846 1893 N
+ ER SH W e n/a 13 1727 1846 1893 N
+ ER SH W i n/a 13 1726 1846 1893 N
+ ER SH W s n/a 13 1726 1846 1893 N
+ ER SH Y e n/a 13 1727 1822 1861 N
+ ER SH Y s n/a 13 1726 1823 1861 N
+ ER SH Z b n/a 13 1727 1765 1881 N
+ ER SH Z e n/a 13 1727 1765 1881 N
+ ER SH Z i n/a 13 1727 1765 1881 N
+ ER SH Z s n/a 13 1727 1765 1881 N
+ ER SH ZH e n/a 13 1727 1771 1881 N
+ ER SH ZH s n/a 13 1726 1773 1881 N
+ ER SIL AA b n/a 13 1720 1839 1888 N
+ ER SIL AA s n/a 13 1722 1836 1888 N
+ ER SIL AE b n/a 13 1720 1831 1850 N
+ ER SIL AE s n/a 13 1722 1830 1848 N
+ ER SIL AH b n/a 13 1720 1829 1848 N
+ ER SIL AH s n/a 13 1722 1830 1848 N
+ ER SIL AO b n/a 13 1720 1839 1888 N
+ ER SIL AO s n/a 13 1722 1836 1886 N
+ ER SIL AW b n/a 13 1720 1831 1850 N
+ ER SIL AW s n/a 13 1722 1831 1848 N
+ ER SIL AY b n/a 13 1720 1839 1888 N
+ ER SIL AY s n/a 13 1722 1836 1888 N
+ ER SIL B b n/a 13 1724 1788 1897 N
+ ER SIL B s n/a 13 1722 1786 1897 N
+ ER SIL CH b n/a 13 1724 1768 1868 N
+ ER SIL CH s n/a 13 1722 1773 1868 N
+ ER SIL D b n/a 13 1724 1769 1866 N
+ ER SIL D s n/a 13 1722 1773 1866 N
+ ER SIL DH b n/a 13 1724 1769 1872 N
+ ER SIL DH s n/a 13 1722 1773 1874 N
+ ER SIL EH b n/a 13 1720 1831 1849 N
+ ER SIL EH s n/a 13 1722 1830 1849 N
+ ER SIL ER b n/a 13 1720 1842 1890 N
+ ER SIL ER s n/a 13 1722 1843 1890 N
+ ER SIL EY b n/a 13 1720 1825 1858 N
+ ER SIL EY s n/a 13 1722 1825 1854 N
+ ER SIL F b n/a 13 1724 1788 1898 N
+ ER SIL F s n/a 13 1722 1786 1898 N
+ ER SIL G b n/a 13 1724 1769 1871 N
+ ER SIL G s n/a 13 1722 1773 1871 N
+ ER SIL HH b n/a 13 1724 1768 1859 N
+ ER SIL HH s n/a 13 1722 1773 1859 N
+ ER SIL IH b n/a 13 1720 1825 1858 N
+ ER SIL IH s n/a 13 1722 1823 1854 N
+ ER SIL IY b n/a 13 1720 1824 1855 N
+ ER SIL IY s n/a 13 1722 1824 1854 N
+ ER SIL JH b n/a 13 1724 1769 1866 N
+ ER SIL JH s n/a 13 1722 1773 1866 N
+ ER SIL K b n/a 13 1724 1768 1870 N
+ ER SIL K s n/a 13 1722 1773 1870 N
+ ER SIL L b n/a 13 1724 1842 1884 N
+ ER SIL L s n/a 13 1722 1840 1885 N
+ ER SIL M b n/a 13 1724 1788 1891 N
+ ER SIL M s n/a 13 1722 1786 1891 N
+ ER SIL N b n/a 13 1724 1795 1862 N
+ ER SIL N s n/a 13 1722 1792 1863 N
+ ER SIL NG s n/a 13 1722 1773 1861 N
+ ER SIL OW b n/a 13 1720 1839 1888 N
+ ER SIL OW s n/a 13 1722 1836 1886 N
+ ER SIL OY b n/a 13 1720 1839 1888 N
+ ER SIL OY s n/a 13 1722 1836 1886 N
+ ER SIL P b n/a 13 1724 1788 1896 N
+ ER SIL P s n/a 13 1722 1786 1896 N
+ ER SIL R s n/a 13 1722 1843 1895 N
+ ER SIL S b n/a 13 1724 1784 1879 N
+ ER SIL S s n/a 13 1722 1785 1879 N
+ ER SIL SH b n/a 13 1724 1768 1880 N
+ ER SIL SH s n/a 13 1722 1773 1880 N
+ ER SIL SIL s n/a 13 1722 1799 1901 N
+ ER SIL T b n/a 13 1724 1768 1868 N
+ ER SIL T s n/a 13 1722 1773 1868 N
+ ER SIL TH b n/a 13 1724 1769 1875 N
+ ER SIL TH s n/a 13 1722 1773 1875 N
+ ER SIL UH b n/a 13 1720 1842 1888 N
+ ER SIL UH s n/a 13 1722 1840 1886 N
+ ER SIL UW b n/a 13 1720 1839 1888 N
+ ER SIL UW s n/a 13 1722 1836 1886 N
+ ER SIL V b n/a 13 1724 1788 1889 N
+ ER SIL V s n/a 13 1722 1786 1889 N
+ ER SIL W b n/a 13 1724 1845 1893 N
+ ER SIL W s n/a 13 1722 1845 1893 N
+ ER SIL Y s n/a 13 1722 1823 1861 N
+ ER SIL Z b n/a 13 1724 1765 1881 N
+ ER SIL Z s n/a 13 1722 1765 1881 N
+ ER SIL ZH s n/a 13 1722 1773 1881 N
+ ER T AA b n/a 13 1720 1839 1888 N
+ ER T AA e n/a 13 1729 1836 1887 N
+ ER T AA i n/a 13 1716 1839 1888 N
+ ER T AA s n/a 13 1723 1836 1888 N
+ ER T AE b n/a 13 1720 1831 1850 N
+ ER T AE e n/a 13 1729 1821 1851 N
+ ER T AE i n/a 13 1716 1831 1850 N
+ ER T AE s n/a 13 1723 1829 1848 N
+ ER T AH b n/a 13 1720 1829 1848 N
+ ER T AH e n/a 13 1729 1820 1852 N
+ ER T AH i n/a 13 1717 1829 1847 N
+ ER T AH s n/a 13 1723 1829 1848 N
+ ER T AO b n/a 13 1720 1839 1888 N
+ ER T AO e n/a 13 1729 1836 1886 N
+ ER T AO i n/a 13 1716 1839 1888 N
+ ER T AO s n/a 13 1723 1836 1886 N
+ ER T AW b n/a 13 1720 1831 1850 N
+ ER T AW e n/a 13 1729 1821 1852 N
+ ER T AW i n/a 13 1716 1831 1850 N
+ ER T AW s n/a 13 1723 1831 1848 N
+ ER T AY b n/a 13 1720 1839 1888 N
+ ER T AY e n/a 13 1729 1836 1887 N
+ ER T AY i n/a 13 1716 1839 1888 N
+ ER T AY s n/a 13 1723 1836 1888 N
+ ER T B b n/a 13 1710 1787 1897 N
+ ER T B e n/a 13 1708 1788 1897 N
+ ER T B i n/a 13 1708 1790 1897 N
+ ER T B s n/a 13 1710 1786 1897 N
+ ER T CH b n/a 13 1710 1779 1868 N
+ ER T CH e n/a 13 1707 1780 1868 N
+ ER T CH i n/a 13 1708 1779 1867 N
+ ER T CH s n/a 13 1710 1779 1868 N
+ ER T D b n/a 13 1707 1779 1866 N
+ ER T D e n/a 13 1707 1779 1866 N
+ ER T D i n/a 13 1707 1779 1865 N
+ ER T D s n/a 13 1710 1779 1866 N
+ ER T DH b n/a 13 1707 1775 1872 N
+ ER T DH e n/a 13 1707 1781 1872 N
+ ER T DH s n/a 13 1710 1781 1874 N
+ ER T EH b n/a 13 1720 1831 1849 N
+ ER T EH e n/a 13 1729 1822 1851 N
+ ER T EH i n/a 13 1716 1831 1849 N
+ ER T EH s n/a 13 1723 1829 1849 N
+ ER T ER b n/a 13 1720 1845 1890 N
+ ER T ER e n/a 13 1729 1845 1890 N
+ ER T ER i n/a 13 1717 1845 1890 N
+ ER T ER s n/a 13 1723 1845 1890 N
+ ER T EY b n/a 13 1720 1825 1858 N
+ ER T EY e n/a 13 1729 1822 1851 N
+ ER T EY i n/a 13 1716 1825 1857 N
+ ER T EY s n/a 13 1723 1825 1854 N
+ ER T F b n/a 13 1710 1787 1898 N
+ ER T F e n/a 13 1708 1788 1898 N
+ ER T F i n/a 13 1708 1790 1898 N
+ ER T F s n/a 13 1710 1786 1898 N
+ ER T G b n/a 13 1710 1778 1871 N
+ ER T G e n/a 13 1708 1778 1871 N
+ ER T G i n/a 13 1708 1778 1871 N
+ ER T G s n/a 13 1710 1778 1871 N
+ ER T HH b n/a 13 1710 1777 1859 N
+ ER T HH e n/a 13 1708 1777 1859 N
+ ER T HH i n/a 13 1708 1777 1859 N
+ ER T HH s n/a 13 1710 1777 1859 N
+ ER T IH b n/a 13 1720 1825 1858 N
+ ER T IH e n/a 13 1729 1822 1853 N
+ ER T IH i n/a 13 1717 1825 1856 N
+ ER T IH s n/a 13 1723 1823 1854 N
+ ER T IY b n/a 13 1720 1824 1855 N
+ ER T IY e n/a 13 1729 1822 1853 N
+ ER T IY i n/a 13 1717 1824 1855 N
+ ER T IY s n/a 13 1723 1824 1854 N
+ ER T JH b n/a 13 1710 1779 1866 N
+ ER T JH e n/a 13 1707 1780 1866 N
+ ER T JH i n/a 13 1708 1779 1866 N
+ ER T JH s n/a 13 1710 1779 1866 N
+ ER T K b n/a 13 1710 1778 1870 N
+ ER T K e n/a 13 1708 1778 1870 N
+ ER T K i n/a 13 1708 1778 1870 N
+ ER T K s n/a 13 1710 1778 1870 N
+ ER T L b n/a 13 1710 1842 1884 N
+ ER T L e n/a 13 1708 1840 1885 N
+ ER T L i n/a 13 1708 1840 1885 N
+ ER T L s n/a 13 1710 1840 1885 N
+ ER T M b n/a 13 1729 1787 1891 N
+ ER T M e n/a 13 1729 1788 1891 N
+ ER T M i n/a 13 1726 1795 1892 N
+ ER T M s n/a 13 1729 1786 1891 N
+ ER T N b n/a 13 1729 1795 1862 N
+ ER T N e n/a 13 1729 1795 1863 N
+ ER T N i n/a 13 1726 1795 1862 N
+ ER T N s n/a 13 1729 1795 1863 N
+ ER T NG e n/a 13 1729 1778 1861 N
+ ER T NG s n/a 13 1729 1778 1861 N
+ ER T OW b n/a 13 1720 1839 1888 N
+ ER T OW e n/a 13 1729 1836 1886 N
+ ER T OW i n/a 13 1716 1838 1888 N
+ ER T OW s n/a 13 1723 1836 1886 N
+ ER T OY b n/a 13 1720 1839 1888 N
+ ER T OY e n/a 13 1729 1836 1886 N
+ ER T OY i n/a 13 1716 1839 1888 N
+ ER T OY s n/a 13 1723 1836 1886 N
+ ER T P b n/a 13 1710 1787 1896 N
+ ER T P e n/a 13 1708 1788 1896 N
+ ER T P i n/a 13 1708 1790 1896 N
+ ER T P s n/a 13 1710 1786 1896 N
+ ER T R e n/a 13 1708 1846 1895 N
+ ER T R i n/a 13 1708 1846 1895 N
+ ER T R s n/a 13 1710 1846 1895 N
+ ER T S b n/a 13 1707 1784 1879 N
+ ER T S e n/a 13 1707 1784 1879 N
+ ER T S i n/a 13 1707 1784 1879 N
+ ER T S s n/a 13 1710 1785 1879 N
+ ER T SH b n/a 13 1710 1784 1880 N
+ ER T SH e n/a 13 1707 1784 1880 N
+ ER T SH i n/a 13 1708 1784 1880 N
+ ER T SH s n/a 13 1710 1785 1880 N
+ ER T SIL e n/a 13 1711 1796 1899 N
+ ER T SIL s n/a 13 1710 1799 1901 N
+ ER T T b n/a 13 1707 1779 1868 N
+ ER T T e n/a 13 1707 1780 1868 N
+ ER T T i n/a 13 1707 1779 1867 N
+ ER T T s n/a 13 1710 1779 1868 N
+ ER T TH b n/a 13 1707 1775 1875 N
+ ER T TH e n/a 13 1707 1781 1875 N
+ ER T TH i n/a 13 1707 1781 1875 N
+ ER T TH s n/a 13 1710 1781 1875 N
+ ER T UH b n/a 13 1720 1842 1888 N
+ ER T UH e n/a 13 1729 1840 1886 N
+ ER T UH s n/a 13 1723 1840 1886 N
+ ER T UW b n/a 13 1720 1839 1888 N
+ ER T UW e n/a 13 1729 1836 1886 N
+ ER T UW i n/a 13 1717 1839 1888 N
+ ER T UW s n/a 13 1723 1836 1886 N
+ ER T V b n/a 13 1710 1787 1889 N
+ ER T V e n/a 13 1708 1788 1889 N
+ ER T V i n/a 13 1708 1790 1889 N
+ ER T V s n/a 13 1710 1786 1889 N
+ ER T W b n/a 13 1710 1846 1893 N
+ ER T W e n/a 13 1708 1846 1893 N
+ ER T W i n/a 13 1708 1846 1893 N
+ ER T W s n/a 13 1710 1846 1893 N
+ ER T Y e n/a 13 1707 1822 1861 N
+ ER T Y i n/a 13 1708 1824 1861 N
+ ER T Y s n/a 13 1710 1823 1861 N
+ ER T Z b n/a 13 1707 1765 1881 N
+ ER T Z e n/a 13 1707 1765 1881 N
+ ER T Z i n/a 13 1707 1765 1881 N
+ ER T Z s n/a 13 1710 1765 1881 N
+ ER T ZH e n/a 13 1707 1780 1881 N
+ ER T ZH i n/a 13 1708 1779 1881 N
+ ER T ZH s n/a 13 1710 1779 1881 N
+ ER TH AA b n/a 13 1702 1839 1888 N
+ ER TH AA e n/a 13 1702 1836 1887 N
+ ER TH AA i n/a 13 1702 1839 1888 N
+ ER TH AA s n/a 13 1702 1836 1888 N
+ ER TH AE b n/a 13 1702 1831 1850 N
+ ER TH AE e n/a 13 1702 1821 1851 N
+ ER TH AE i n/a 13 1702 1831 1850 N
+ ER TH AE s n/a 13 1702 1830 1848 N
+ ER TH AH b n/a 13 1702 1829 1848 N
+ ER TH AH e n/a 13 1702 1820 1852 N
+ ER TH AH i n/a 13 1702 1829 1847 N
+ ER TH AH s n/a 13 1702 1830 1848 N
+ ER TH AO b n/a 13 1702 1839 1888 N
+ ER TH AO e n/a 13 1702 1836 1886 N
+ ER TH AO s n/a 13 1702 1836 1886 N
+ ER TH AW b n/a 13 1702 1831 1850 N
+ ER TH AW e n/a 13 1702 1821 1852 N
+ ER TH AW s n/a 13 1702 1831 1848 N
+ ER TH AY b n/a 13 1702 1839 1888 N
+ ER TH AY e n/a 13 1702 1836 1887 N
+ ER TH AY i n/a 13 1702 1839 1888 N
+ ER TH AY s n/a 13 1702 1836 1888 N
+ ER TH B b n/a 13 1702 1789 1897 N
+ ER TH B e n/a 13 1702 1789 1897 N
+ ER TH B i n/a 13 1702 1790 1897 N
+ ER TH B s n/a 13 1702 1789 1897 N
+ ER TH CH b n/a 13 1702 1775 1868 N
+ ER TH CH e n/a 13 1702 1775 1868 N
+ ER TH CH s n/a 13 1702 1775 1868 N
+ ER TH D b n/a 13 1702 1775 1866 N
+ ER TH D e n/a 13 1702 1775 1866 N
+ ER TH D i n/a 13 1702 1775 1864 N
+ ER TH D s n/a 13 1702 1775 1866 N
+ ER TH DH b n/a 13 1702 1775 1872 N
+ ER TH DH e n/a 13 1702 1781 1872 N
+ ER TH DH s n/a 13 1702 1781 1874 N
+ ER TH EH b n/a 13 1702 1831 1849 N
+ ER TH EH e n/a 13 1702 1822 1851 N
+ ER TH EH i n/a 13 1702 1831 1849 N
+ ER TH EH s n/a 13 1702 1830 1849 N
+ ER TH ER b n/a 13 1702 1846 1890 N
+ ER TH ER e n/a 13 1702 1846 1890 N
+ ER TH ER i n/a 13 1702 1846 1890 N
+ ER TH ER s n/a 13 1702 1846 1890 N
+ ER TH EY b n/a 13 1702 1825 1858 N
+ ER TH EY e n/a 13 1702 1822 1851 N
+ ER TH EY s n/a 13 1702 1825 1854 N
+ ER TH F b n/a 13 1702 1789 1898 N
+ ER TH F e n/a 13 1702 1789 1898 N
+ ER TH F i n/a 13 1702 1790 1898 N
+ ER TH F s n/a 13 1702 1789 1898 N
+ ER TH G b n/a 13 1702 1778 1871 N
+ ER TH G e n/a 13 1702 1778 1871 N
+ ER TH G i n/a 13 1702 1778 1871 N
+ ER TH G s n/a 13 1702 1778 1871 N
+ ER TH HH b n/a 13 1702 1777 1859 N
+ ER TH HH e n/a 13 1702 1777 1859 N
+ ER TH HH s n/a 13 1702 1777 1859 N
+ ER TH IH b n/a 13 1702 1825 1858 N
+ ER TH IH e n/a 13 1702 1822 1853 N
+ ER TH IH i n/a 13 1702 1825 1856 N
+ ER TH IH s n/a 13 1702 1823 1854 N
+ ER TH IY b n/a 13 1702 1824 1855 N
+ ER TH IY e n/a 13 1702 1822 1853 N
+ ER TH IY i n/a 13 1702 1824 1855 N
+ ER TH IY s n/a 13 1702 1824 1854 N
+ ER TH JH b n/a 13 1702 1775 1866 N
+ ER TH JH e n/a 13 1702 1775 1866 N
+ ER TH JH i n/a 13 1702 1775 1864 N
+ ER TH JH s n/a 13 1702 1775 1866 N
+ ER TH K b n/a 13 1702 1778 1870 N
+ ER TH K e n/a 13 1702 1778 1870 N
+ ER TH K i n/a 13 1702 1778 1870 N
+ ER TH K s n/a 13 1702 1778 1870 N
+ ER TH L b n/a 13 1702 1842 1884 N
+ ER TH L e n/a 13 1702 1840 1885 N
+ ER TH L i n/a 13 1702 1840 1885 N
+ ER TH L s n/a 13 1702 1840 1885 N
+ ER TH M b n/a 13 1702 1789 1891 N
+ ER TH M e n/a 13 1702 1789 1891 N
+ ER TH M i n/a 13 1702 1790 1892 N
+ ER TH M s n/a 13 1702 1789 1891 N
+ ER TH N b n/a 13 1702 1795 1862 N
+ ER TH N e n/a 13 1702 1792 1863 N
+ ER TH N i n/a 13 1702 1792 1862 N
+ ER TH N s n/a 13 1702 1792 1863 N
+ ER TH NG e n/a 13 1702 1778 1861 N
+ ER TH NG s n/a 13 1702 1778 1861 N
+ ER TH OW b n/a 13 1702 1839 1888 N
+ ER TH OW e n/a 13 1702 1836 1886 N
+ ER TH OW i n/a 13 1702 1838 1888 N
+ ER TH OW s n/a 13 1702 1836 1886 N
+ ER TH OY b n/a 13 1702 1839 1888 N
+ ER TH OY e n/a 13 1702 1836 1886 N
+ ER TH OY s n/a 13 1702 1836 1886 N
+ ER TH P b n/a 13 1702 1789 1896 N
+ ER TH P e n/a 13 1702 1789 1896 N
+ ER TH P i n/a 13 1702 1790 1896 N
+ ER TH P s n/a 13 1702 1789 1896 N
+ ER TH R e n/a 13 1702 1846 1895 N
+ ER TH R s n/a 13 1702 1846 1895 N
+ ER TH S b n/a 13 1702 1784 1879 N
+ ER TH S e n/a 13 1702 1784 1879 N
+ ER TH S i n/a 13 1702 1784 1879 N
+ ER TH S s n/a 13 1702 1785 1879 N
+ ER TH SH b n/a 13 1702 1784 1880 N
+ ER TH SH e n/a 13 1702 1784 1880 N
+ ER TH SH i n/a 13 1702 1784 1880 N
+ ER TH SH s n/a 13 1702 1785 1880 N
+ ER TH SIL e n/a 13 1702 1798 1899 N
+ ER TH SIL s n/a 13 1702 1798 1901 N
+ ER TH T b n/a 13 1702 1776 1868 N
+ ER TH T e n/a 13 1702 1776 1868 N
+ ER TH T i n/a 13 1702 1776 1867 N
+ ER TH T s n/a 13 1702 1776 1868 N
+ ER TH TH b n/a 13 1702 1775 1875 N
+ ER TH TH e n/a 13 1702 1781 1875 N
+ ER TH TH s n/a 13 1702 1781 1875 N
+ ER TH UH b n/a 13 1702 1842 1888 N
+ ER TH UH e n/a 13 1702 1840 1886 N
+ ER TH UH s n/a 13 1702 1840 1886 N
+ ER TH UW b n/a 13 1702 1839 1888 N
+ ER TH UW e n/a 13 1702 1836 1886 N
+ ER TH UW i n/a 13 1702 1839 1888 N
+ ER TH UW s n/a 13 1702 1836 1886 N
+ ER TH V b n/a 13 1702 1789 1889 N
+ ER TH V e n/a 13 1702 1789 1889 N
+ ER TH V s n/a 13 1702 1789 1889 N
+ ER TH W b n/a 13 1702 1846 1893 N
+ ER TH W e n/a 13 1702 1846 1893 N
+ ER TH W s n/a 13 1702 1846 1893 N
+ ER TH Y e n/a 13 1702 1822 1861 N
+ ER TH Y s n/a 13 1702 1823 1861 N
+ ER TH Z b n/a 13 1702 1765 1881 N
+ ER TH Z e n/a 13 1702 1765 1881 N
+ ER TH Z i n/a 13 1702 1765 1881 N
+ ER TH Z s n/a 13 1702 1765 1881 N
+ ER TH ZH e n/a 13 1702 1780 1881 N
+ ER TH ZH s n/a 13 1702 1780 1881 N
+ ER UH AA b n/a 13 1743 1839 1888 N
+ ER UH AA s n/a 13 1742 1836 1888 N
+ ER UH AE b n/a 13 1743 1831 1850 N
+ ER UH AE s n/a 13 1742 1830 1848 N
+ ER UH AH b n/a 13 1743 1830 1848 N
+ ER UH AH s n/a 13 1742 1830 1848 N
+ ER UH AO b n/a 13 1743 1839 1888 N
+ ER UH AO s n/a 13 1742 1836 1886 N
+ ER UH AW b n/a 13 1743 1831 1850 N
+ ER UH AW s n/a 13 1742 1831 1848 N
+ ER UH AY b n/a 13 1743 1839 1888 N
+ ER UH AY s n/a 13 1742 1836 1888 N
+ ER UH B b n/a 13 1743 1787 1897 N
+ ER UH B s n/a 13 1742 1786 1897 N
+ ER UH CH b n/a 13 1743 1768 1868 N
+ ER UH CH s n/a 13 1742 1773 1868 N
+ ER UH D b n/a 13 1743 1769 1866 N
+ ER UH D s n/a 13 1742 1773 1866 N
+ ER UH DH b n/a 13 1743 1769 1874 N
+ ER UH DH s n/a 13 1742 1773 1874 N
+ ER UH EH b n/a 13 1743 1831 1849 N
+ ER UH EH s n/a 13 1742 1830 1849 N
+ ER UH ER b n/a 13 1743 1842 1890 N
+ ER UH ER s n/a 13 1742 1843 1890 N
+ ER UH EY b n/a 13 1743 1825 1858 N
+ ER UH EY s n/a 13 1742 1825 1854 N
+ ER UH F b n/a 13 1743 1787 1898 N
+ ER UH F s n/a 13 1742 1786 1898 N
+ ER UH G b n/a 13 1743 1769 1871 N
+ ER UH G s n/a 13 1742 1773 1871 N
+ ER UH HH b n/a 13 1743 1768 1859 N
+ ER UH HH s n/a 13 1742 1773 1859 N
+ ER UH IH b n/a 13 1743 1825 1858 N
+ ER UH IH s n/a 13 1742 1823 1854 N
+ ER UH IY b n/a 13 1743 1824 1855 N
+ ER UH IY s n/a 13 1742 1824 1854 N
+ ER UH JH b n/a 13 1743 1769 1866 N
+ ER UH JH s n/a 13 1742 1773 1866 N
+ ER UH K b n/a 13 1743 1768 1870 N
+ ER UH K s n/a 13 1742 1773 1870 N
+ ER UH L b n/a 13 1743 1842 1884 N
+ ER UH L s n/a 13 1742 1840 1885 N
+ ER UH M b n/a 13 1743 1787 1891 N
+ ER UH M s n/a 13 1742 1786 1891 N
+ ER UH N b n/a 13 1743 1795 1862 N
+ ER UH N s n/a 13 1742 1792 1863 N
+ ER UH NG s n/a 13 1742 1773 1861 N
+ ER UH OW b n/a 13 1743 1839 1888 N
+ ER UH OW s n/a 13 1742 1836 1886 N
+ ER UH OY b n/a 13 1743 1839 1888 N
+ ER UH OY s n/a 13 1742 1836 1886 N
+ ER UH P b n/a 13 1743 1787 1896 N
+ ER UH P s n/a 13 1742 1786 1896 N
+ ER UH R s n/a 13 1742 1843 1895 N
+ ER UH S b n/a 13 1743 1768 1879 N
+ ER UH S s n/a 13 1742 1773 1879 N
+ ER UH SH b n/a 13 1743 1768 1880 N
+ ER UH SH s n/a 13 1742 1773 1880 N
+ ER UH SIL s n/a 13 1742 1799 1901 N
+ ER UH T b n/a 13 1743 1768 1868 N
+ ER UH T s n/a 13 1742 1773 1868 N
+ ER UH TH b n/a 13 1743 1769 1875 N
+ ER UH TH s n/a 13 1742 1773 1875 N
+ ER UH UH b n/a 13 1743 1842 1888 N
+ ER UH UH s n/a 13 1742 1840 1886 N
+ ER UH UW b n/a 13 1743 1839 1888 N
+ ER UH UW s n/a 13 1742 1836 1886 N
+ ER UH V b n/a 13 1743 1787 1889 N
+ ER UH V s n/a 13 1742 1786 1889 N
+ ER UH W b n/a 13 1743 1845 1894 N
+ ER UH W s n/a 13 1742 1845 1894 N
+ ER UH Y s n/a 13 1742 1823 1861 N
+ ER UH Z b n/a 13 1743 1769 1882 N
+ ER UH Z s n/a 13 1742 1773 1882 N
+ ER UH ZH s n/a 13 1742 1773 1882 N
+ ER UW AA b n/a 13 1747 1839 1888 N
+ ER UW AA e n/a 13 1747 1836 1887 N
+ ER UW AA s n/a 13 1747 1836 1888 N
+ ER UW AE b n/a 13 1747 1831 1850 N
+ ER UW AE e n/a 13 1747 1833 1851 N
+ ER UW AE s n/a 13 1747 1830 1848 N
+ ER UW AH b n/a 13 1747 1830 1848 N
+ ER UW AH e n/a 13 1747 1833 1852 N
+ ER UW AH i n/a 13 1747 1830 1847 N
+ ER UW AH s n/a 13 1747 1830 1848 N
+ ER UW AO b n/a 13 1747 1839 1888 N
+ ER UW AO e n/a 13 1747 1836 1886 N
+ ER UW AO s n/a 13 1747 1836 1886 N
+ ER UW AW b n/a 13 1747 1831 1850 N
+ ER UW AW e n/a 13 1747 1833 1852 N
+ ER UW AW s n/a 13 1747 1831 1848 N
+ ER UW AY b n/a 13 1747 1839 1888 N
+ ER UW AY e n/a 13 1747 1836 1887 N
+ ER UW AY s n/a 13 1747 1836 1888 N
+ ER UW B b n/a 13 1747 1787 1897 N
+ ER UW B e n/a 13 1747 1786 1897 N
+ ER UW B s n/a 13 1747 1786 1897 N
+ ER UW CH b n/a 13 1747 1773 1868 N
+ ER UW CH e n/a 13 1747 1773 1868 N
+ ER UW CH s n/a 13 1747 1773 1868 N
+ ER UW D b n/a 13 1747 1774 1866 N
+ ER UW D e n/a 13 1747 1774 1866 N
+ ER UW D i n/a 13 1747 1774 1864 N
+ ER UW D s n/a 13 1747 1774 1866 N
+ ER UW DH b n/a 13 1747 1774 1874 N
+ ER UW DH e n/a 13 1747 1774 1874 N
+ ER UW DH s n/a 13 1747 1774 1874 N
+ ER UW EH b n/a 13 1747 1831 1849 N
+ ER UW EH e n/a 13 1747 1833 1851 N
+ ER UW EH s n/a 13 1747 1830 1849 N
+ ER UW ER b n/a 13 1747 1835 1890 N
+ ER UW ER e n/a 13 1747 1835 1890 N
+ ER UW ER s n/a 13 1747 1835 1890 N
+ ER UW EY b n/a 13 1747 1825 1858 N
+ ER UW EY e n/a 13 1747 1833 1851 N
+ ER UW EY s n/a 13 1747 1825 1854 N
+ ER UW F b n/a 13 1747 1787 1898 N
+ ER UW F e n/a 13 1747 1786 1898 N
+ ER UW F s n/a 13 1747 1786 1898 N
+ ER UW G b n/a 13 1747 1773 1871 N
+ ER UW G e n/a 13 1747 1773 1871 N
+ ER UW G s n/a 13 1747 1773 1871 N
+ ER UW HH b n/a 13 1747 1773 1859 N
+ ER UW HH e n/a 13 1747 1773 1859 N
+ ER UW HH s n/a 13 1747 1773 1859 N
+ ER UW IH b n/a 13 1747 1825 1858 N
+ ER UW IH e n/a 13 1747 1823 1853 N
+ ER UW IH i n/a 13 1747 1823 1856 N
+ ER UW IH s n/a 13 1747 1823 1854 N
+ ER UW IY b n/a 13 1747 1824 1855 N
+ ER UW IY e n/a 13 1747 1824 1853 N
+ ER UW IY i n/a 13 1747 1824 1855 N
+ ER UW IY s n/a 13 1747 1824 1854 N
+ ER UW JH b n/a 13 1747 1773 1866 N
+ ER UW JH e n/a 13 1747 1773 1866 N
+ ER UW JH s n/a 13 1747 1773 1866 N
+ ER UW K b n/a 13 1747 1773 1869 N
+ ER UW K e n/a 13 1747 1773 1870 N
+ ER UW K i n/a 13 1747 1773 1869 N
+ ER UW K s n/a 13 1747 1773 1869 N
+ ER UW L b n/a 13 1747 1837 1884 N
+ ER UW L e n/a 13 1747 1835 1885 N
+ ER UW L i n/a 13 1747 1834 1885 N
+ ER UW L s n/a 13 1747 1835 1885 N
+ ER UW M b n/a 13 1747 1787 1891 N
+ ER UW M e n/a 13 1747 1786 1891 N
+ ER UW M i n/a 13 1747 1790 1892 N
+ ER UW M s n/a 13 1747 1786 1891 N
+ ER UW N b n/a 13 1747 1795 1862 N
+ ER UW N e n/a 13 1747 1792 1863 N
+ ER UW N s n/a 13 1747 1792 1863 N
+ ER UW NG e n/a 13 1747 1773 1861 N
+ ER UW NG s n/a 13 1747 1773 1861 N
+ ER UW OW b n/a 13 1747 1839 1888 N
+ ER UW OW e n/a 13 1747 1836 1886 N
+ ER UW OW s n/a 13 1747 1836 1886 N
+ ER UW OY b n/a 13 1747 1839 1888 N
+ ER UW OY e n/a 13 1747 1836 1886 N
+ ER UW OY s n/a 13 1747 1836 1886 N
+ ER UW P b n/a 13 1747 1787 1896 N
+ ER UW P e n/a 13 1747 1786 1896 N
+ ER UW P s n/a 13 1747 1786 1896 N
+ ER UW R e n/a 13 1747 1835 1895 N
+ ER UW R s n/a 13 1747 1835 1895 N
+ ER UW S b n/a 13 1747 1773 1879 N
+ ER UW S e n/a 13 1747 1773 1879 N
+ ER UW S i n/a 13 1747 1773 1879 N
+ ER UW S s n/a 13 1747 1773 1879 N
+ ER UW SH b n/a 13 1747 1773 1880 N
+ ER UW SH e n/a 13 1747 1773 1880 N
+ ER UW SH i n/a 13 1747 1773 1880 N
+ ER UW SH s n/a 13 1747 1773 1880 N
+ ER UW SIL e n/a 13 1747 1799 1900 N
+ ER UW SIL s n/a 13 1747 1799 1901 N
+ ER UW T b n/a 13 1747 1774 1868 N
+ ER UW T e n/a 13 1747 1774 1868 N
+ ER UW T i n/a 13 1747 1774 1867 N
+ ER UW T s n/a 13 1747 1774 1868 N
+ ER UW TH b n/a 13 1747 1773 1875 N
+ ER UW TH e n/a 13 1747 1773 1875 N
+ ER UW TH s n/a 13 1747 1773 1875 N
+ ER UW UH b n/a 13 1747 1836 1888 N
+ ER UW UH e n/a 13 1747 1835 1886 N
+ ER UW UH s n/a 13 1747 1835 1886 N
+ ER UW UW b n/a 13 1747 1839 1888 N
+ ER UW UW e n/a 13 1747 1836 1886 N
+ ER UW UW s n/a 13 1747 1836 1886 N
+ ER UW V b n/a 13 1747 1787 1889 N
+ ER UW V e n/a 13 1747 1786 1889 N
+ ER UW V s n/a 13 1747 1786 1889 N
+ ER UW W b n/a 13 1747 1845 1894 N
+ ER UW W e n/a 13 1747 1845 1894 N
+ ER UW W s n/a 13 1747 1845 1894 N
+ ER UW Y e n/a 13 1747 1823 1861 N
+ ER UW Y s n/a 13 1747 1823 1861 N
+ ER UW Z b n/a 13 1747 1774 1882 N
+ ER UW Z e n/a 13 1747 1774 1882 N
+ ER UW Z i n/a 13 1747 1774 1882 N
+ ER UW Z s n/a 13 1747 1774 1882 N
+ ER UW ZH e n/a 13 1747 1774 1882 N
+ ER UW ZH s n/a 13 1747 1774 1882 N
+ ER V AA b n/a 13 1759 1839 1888 N
+ ER V AA e n/a 13 1760 1838 1887 N
+ ER V AA i n/a 13 1759 1839 1888 N
+ ER V AA s n/a 13 1759 1838 1888 N
+ ER V AE b n/a 13 1759 1831 1850 N
+ ER V AE e n/a 13 1760 1833 1851 N
+ ER V AE i n/a 13 1760 1831 1850 N
+ ER V AE s n/a 13 1759 1830 1848 N
+ ER V AH b n/a 13 1759 1832 1848 N
+ ER V AH e n/a 13 1760 1833 1848 N
+ ER V AH i n/a 13 1760 1832 1847 N
+ ER V AH s n/a 13 1759 1832 1848 N
+ ER V AO b n/a 13 1759 1839 1888 N
+ ER V AO e n/a 13 1760 1838 1886 N
+ ER V AO i n/a 13 1759 1839 1888 N
+ ER V AO s n/a 13 1759 1838 1886 N
+ ER V AW b n/a 13 1759 1831 1850 N
+ ER V AW e n/a 13 1760 1833 1852 N
+ ER V AW s n/a 13 1759 1831 1848 N
+ ER V AY b n/a 13 1759 1839 1888 N
+ ER V AY e n/a 13 1760 1838 1887 N
+ ER V AY i n/a 13 1759 1839 1888 N
+ ER V AY s n/a 13 1759 1838 1888 N
+ ER V B b n/a 13 1761 1805 1897 N
+ ER V B e n/a 13 1761 1805 1897 N
+ ER V B i n/a 13 1761 1804 1897 N
+ ER V B s n/a 13 1761 1805 1897 N
+ ER V CH b n/a 13 1761 1808 1868 N
+ ER V CH e n/a 13 1761 1808 1868 N
+ ER V CH i n/a 13 1761 1808 1867 N
+ ER V CH s n/a 13 1761 1808 1868 N
+ ER V D b n/a 13 1762 1808 1866 N
+ ER V D e n/a 13 1762 1815 1866 N
+ ER V D i n/a 13 1762 1808 1864 N
+ ER V D s n/a 13 1762 1808 1866 N
+ ER V DH b n/a 13 1761 1809 1874 N
+ ER V DH e n/a 13 1762 1819 1874 N
+ ER V DH i n/a 13 1762 1809 1876 N
+ ER V DH s n/a 13 1762 1809 1874 N
+ ER V EH b n/a 13 1759 1831 1849 N
+ ER V EH e n/a 13 1760 1833 1851 N
+ ER V EH i n/a 13 1760 1831 1849 N
+ ER V EH s n/a 13 1759 1830 1849 N
+ ER V ER b n/a 13 1759 1843 1890 N
+ ER V ER e n/a 13 1760 1843 1890 N
+ ER V ER i n/a 13 1759 1843 1890 N
+ ER V ER s n/a 13 1759 1843 1890 N
+ ER V EY b n/a 13 1759 1827 1858 N
+ ER V EY e n/a 13 1760 1833 1851 N
+ ER V EY i n/a 13 1760 1827 1857 N
+ ER V EY s n/a 13 1759 1827 1854 N
+ ER V F b n/a 13 1761 1805 1898 N
+ ER V F e n/a 13 1761 1805 1898 N
+ ER V F i n/a 13 1761 1805 1898 N
+ ER V F s n/a 13 1761 1805 1898 N
+ ER V G b n/a 13 1761 1809 1871 N
+ ER V G e n/a 13 1761 1809 1871 N
+ ER V G i n/a 13 1761 1809 1871 N
+ ER V G s n/a 13 1761 1809 1871 N
+ ER V HH b n/a 13 1761 1809 1860 N
+ ER V HH e n/a 13 1761 1809 1860 N
+ ER V HH i n/a 13 1761 1809 1860 N
+ ER V HH s n/a 13 1761 1809 1860 N
+ ER V IH b n/a 13 1759 1827 1858 N
+ ER V IH e n/a 13 1760 1826 1854 N
+ ER V IH i n/a 13 1760 1827 1856 N
+ ER V IH s n/a 13 1759 1827 1854 N
+ ER V IY b n/a 13 1759 1827 1855 N
+ ER V IY e n/a 13 1760 1826 1854 N
+ ER V IY i n/a 13 1760 1827 1855 N
+ ER V IY s n/a 13 1759 1827 1854 N
+ ER V JH b n/a 13 1761 1808 1866 N
+ ER V JH e n/a 13 1761 1808 1866 N
+ ER V JH i n/a 13 1761 1808 1864 N
+ ER V JH s n/a 13 1761 1808 1866 N
+ ER V K b n/a 13 1761 1809 1870 N
+ ER V K e n/a 13 1761 1809 1870 N
+ ER V K i n/a 13 1761 1809 1870 N
+ ER V K s n/a 13 1761 1809 1870 N
+ ER V L b n/a 13 1761 1842 1884 N
+ ER V L e n/a 13 1761 1841 1885 N
+ ER V L i n/a 13 1761 1841 1885 N
+ ER V L s n/a 13 1761 1841 1885 N
+ ER V M b n/a 13 1761 1805 1891 N
+ ER V M e n/a 13 1761 1805 1891 N
+ ER V M i n/a 13 1761 1805 1891 N
+ ER V M s n/a 13 1761 1805 1891 N
+ ER V N b n/a 13 1762 1809 1862 N
+ ER V N e n/a 13 1762 1815 1863 N
+ ER V N i n/a 13 1762 1809 1862 N
+ ER V N s n/a 13 1762 1809 1862 N
+ ER V NG e n/a 13 1761 1809 1861 N
+ ER V NG s n/a 13 1761 1809 1861 N
+ ER V OW b n/a 13 1759 1839 1888 N
+ ER V OW e n/a 13 1760 1838 1886 N
+ ER V OW i n/a 13 1759 1838 1888 N
+ ER V OW s n/a 13 1759 1838 1886 N
+ ER V OY b n/a 13 1759 1839 1888 N
+ ER V OY e n/a 13 1760 1838 1886 N
+ ER V OY i n/a 13 1759 1839 1888 N
+ ER V OY s n/a 13 1759 1838 1886 N
+ ER V P b n/a 13 1761 1805 1896 N
+ ER V P e n/a 13 1761 1805 1896 N
+ ER V P i n/a 13 1761 1805 1896 N
+ ER V P s n/a 13 1761 1805 1896 N
+ ER V R e n/a 13 1761 1843 1895 N
+ ER V R i n/a 13 1761 1843 1895 N
+ ER V R s n/a 13 1761 1843 1895 N
+ ER V S b n/a 13 1762 1806 1878 N
+ ER V S e n/a 13 1762 1817 1878 N
+ ER V S i n/a 13 1761 1806 1877 N
+ ER V S s n/a 13 1762 1806 1878 N
+ ER V SH b n/a 13 1761 1806 1880 N
+ ER V SH e n/a 13 1761 1806 1880 N
+ ER V SH i n/a 13 1761 1806 1877 N
+ ER V SH s n/a 13 1761 1806 1880 N
+ ER V SIL e n/a 13 1761 1813 1900 N
+ ER V SIL s n/a 13 1761 1813 1900 N
+ ER V T b n/a 13 1762 1808 1868 N
+ ER V T e n/a 13 1762 1815 1868 N
+ ER V T i n/a 13 1761 1808 1867 N
+ ER V T s n/a 13 1762 1808 1868 N
+ ER V TH b n/a 13 1761 1809 1875 N
+ ER V TH e n/a 13 1762 1819 1875 N
+ ER V TH i n/a 13 1762 1809 1875 N
+ ER V TH s n/a 13 1762 1809 1875 N
+ ER V UH b n/a 13 1759 1843 1888 N
+ ER V UH e n/a 13 1760 1843 1886 N
+ ER V UH s n/a 13 1759 1843 1886 N
+ ER V UW b n/a 13 1759 1839 1888 N
+ ER V UW e n/a 13 1760 1838 1886 N
+ ER V UW i n/a 13 1759 1839 1888 N
+ ER V UW s n/a 13 1759 1838 1886 N
+ ER V V b n/a 13 1761 1805 1889 N
+ ER V V e n/a 13 1761 1805 1889 N
+ ER V V i n/a 13 1761 1804 1889 N
+ ER V V s n/a 13 1761 1805 1889 N
+ ER V W b n/a 13 1761 1844 1894 N
+ ER V W e n/a 13 1761 1844 1894 N
+ ER V W i n/a 13 1761 1844 1894 N
+ ER V W s n/a 13 1761 1844 1894 N
+ ER V Y e n/a 13 1761 1828 1861 N
+ ER V Y i n/a 13 1761 1828 1861 N
+ ER V Y s n/a 13 1761 1828 1861 N
+ ER V Z b n/a 13 1762 1812 1882 N
+ ER V Z e n/a 13 1762 1817 1882 N
+ ER V Z i n/a 13 1762 1812 1882 N
+ ER V Z s n/a 13 1762 1812 1882 N
+ ER V ZH e n/a 13 1761 1806 1882 N
+ ER V ZH i n/a 13 1761 1806 1882 N
+ ER V ZH s n/a 13 1761 1806 1882 N
+ ER W AA b n/a 13 1748 1839 1888 N
+ ER W AA e n/a 13 1748 1838 1887 N
+ ER W AA i n/a 13 1748 1834 1888 N
+ ER W AA s n/a 13 1748 1838 1888 N
+ ER W AE b n/a 13 1741 1831 1850 N
+ ER W AE e n/a 13 1741 1833 1851 N
+ ER W AE i n/a 13 1741 1831 1850 N
+ ER W AE s n/a 13 1741 1830 1848 N
+ ER W AH b n/a 13 1741 1833 1848 N
+ ER W AH e n/a 13 1741 1833 1848 N
+ ER W AH i n/a 13 1741 1833 1847 N
+ ER W AH s n/a 13 1741 1833 1848 N
+ ER W AO b n/a 13 1748 1839 1888 N
+ ER W AO e n/a 13 1748 1838 1886 N
+ ER W AO i n/a 13 1748 1834 1888 N
+ ER W AO s n/a 13 1748 1838 1886 N
+ ER W AW b n/a 13 1741 1831 1850 N
+ ER W AW e n/a 13 1741 1833 1852 N
+ ER W AW s n/a 13 1741 1831 1848 N
+ ER W AY b n/a 13 1748 1839 1888 N
+ ER W AY e n/a 13 1748 1838 1887 N
+ ER W AY s n/a 13 1748 1838 1888 N
+ ER W B b n/a 13 1738 1805 1897 N
+ ER W B e n/a 13 1738 1805 1897 N
+ ER W B i n/a 13 1741 1804 1897 N
+ ER W B s n/a 13 1738 1805 1897 N
+ ER W CH b n/a 13 1739 1802 1868 N
+ ER W CH e n/a 13 1739 1802 1868 N
+ ER W CH i n/a 13 1741 1801 1867 N
+ ER W CH s n/a 13 1739 1802 1868 N
+ ER W D b n/a 13 1739 1811 1866 N
+ ER W D e n/a 13 1739 1816 1866 N
+ ER W D i n/a 13 1741 1811 1864 N
+ ER W D s n/a 13 1739 1811 1866 N
+ ER W DH b n/a 13 1739 1812 1874 N
+ ER W DH e n/a 13 1739 1819 1874 N
+ ER W DH i n/a 13 1741 1812 1874 N
+ ER W DH s n/a 13 1739 1812 1874 N
+ ER W EH b n/a 13 1741 1831 1849 N
+ ER W EH e n/a 13 1741 1833 1851 N
+ ER W EH i n/a 13 1741 1831 1849 N
+ ER W EH s n/a 13 1741 1830 1849 N
+ ER W ER b n/a 13 1748 1835 1890 N
+ ER W ER e n/a 13 1748 1835 1890 N
+ ER W ER s n/a 13 1748 1835 1890 N
+ ER W EY b n/a 13 1741 1827 1858 N
+ ER W EY e n/a 13 1741 1833 1851 N
+ ER W EY i n/a 13 1741 1827 1857 N
+ ER W EY s n/a 13 1741 1827 1854 N
+ ER W F b n/a 13 1738 1805 1898 N
+ ER W F e n/a 13 1738 1805 1898 N
+ ER W F i n/a 13 1740 1805 1898 N
+ ER W F s n/a 13 1738 1805 1898 N
+ ER W G b n/a 13 1738 1802 1871 N
+ ER W G e n/a 13 1738 1802 1871 N
+ ER W G i n/a 13 1740 1801 1871 N
+ ER W G s n/a 13 1738 1802 1871 N
+ ER W HH b n/a 13 1738 1803 1860 N
+ ER W HH e n/a 13 1738 1803 1860 N
+ ER W HH s n/a 13 1738 1803 1860 N
+ ER W IH b n/a 13 1741 1826 1858 N
+ ER W IH e n/a 13 1741 1826 1854 N
+ ER W IH i n/a 13 1741 1826 1856 N
+ ER W IH s n/a 13 1741 1826 1854 N
+ ER W IY b n/a 13 1741 1826 1855 N
+ ER W IY e n/a 13 1741 1826 1854 N
+ ER W IY i n/a 13 1741 1826 1855 N
+ ER W IY s n/a 13 1741 1826 1854 N
+ ER W JH b n/a 13 1739 1802 1866 N
+ ER W JH e n/a 13 1739 1802 1866 N
+ ER W JH s n/a 13 1739 1802 1866 N
+ ER W K b n/a 13 1738 1802 1869 N
+ ER W K e n/a 13 1738 1802 1870 N
+ ER W K i n/a 13 1740 1801 1869 N
+ ER W K s n/a 13 1738 1802 1869 N
+ ER W L b n/a 13 1748 1837 1883 N
+ ER W L e n/a 13 1748 1835 1885 N
+ ER W L i n/a 13 1748 1834 1883 N
+ ER W L s n/a 13 1748 1835 1883 N
+ ER W M b n/a 13 1738 1805 1891 N
+ ER W M e n/a 13 1738 1805 1891 N
+ ER W M i n/a 13 1740 1804 1892 N
+ ER W M s n/a 13 1738 1805 1891 N
+ ER W N b n/a 13 1739 1809 1862 N
+ ER W N e n/a 13 1739 1816 1863 N
+ ER W N i n/a 13 1741 1809 1862 N
+ ER W N s n/a 13 1739 1809 1862 N
+ ER W NG e n/a 13 1738 1803 1861 N
+ ER W NG s n/a 13 1738 1803 1861 N
+ ER W OW b n/a 13 1748 1839 1888 N
+ ER W OW e n/a 13 1748 1838 1886 N
+ ER W OW s n/a 13 1748 1838 1886 N
+ ER W OY b n/a 13 1748 1839 1888 N
+ ER W OY e n/a 13 1748 1838 1886 N
+ ER W OY s n/a 13 1748 1838 1886 N
+ ER W P b n/a 13 1738 1805 1896 N
+ ER W P e n/a 13 1738 1805 1896 N
+ ER W P i n/a 13 1740 1805 1896 N
+ ER W P s n/a 13 1738 1805 1896 N
+ ER W R e n/a 13 1748 1835 1895 N
+ ER W R i n/a 13 1748 1834 1895 N
+ ER W R s n/a 13 1748 1835 1895 N
+ ER W S b n/a 13 1739 1806 1878 N
+ ER W S e n/a 13 1739 1816 1878 N
+ ER W S i n/a 13 1741 1806 1877 N
+ ER W S s n/a 13 1739 1806 1878 N
+ ER W SH b n/a 13 1739 1803 1880 N
+ ER W SH e n/a 13 1739 1803 1880 N
+ ER W SH i n/a 13 1741 1803 1877 N
+ ER W SH s n/a 13 1739 1803 1880 N
+ ER W SIL e n/a 13 1741 1814 1901 N
+ ER W SIL s n/a 13 1741 1814 1901 N
+ ER W T b n/a 13 1739 1808 1868 N
+ ER W T e n/a 13 1739 1816 1868 N
+ ER W T i n/a 13 1741 1808 1867 N
+ ER W T s n/a 13 1739 1808 1868 N
+ ER W TH b n/a 13 1739 1809 1875 N
+ ER W TH e n/a 13 1739 1819 1875 N
+ ER W TH i n/a 13 1741 1809 1875 N
+ ER W TH s n/a 13 1739 1809 1875 N
+ ER W UH b n/a 13 1748 1836 1888 N
+ ER W UH e n/a 13 1748 1835 1886 N
+ ER W UH s n/a 13 1748 1835 1886 N
+ ER W UW b n/a 13 1748 1839 1888 N
+ ER W UW e n/a 13 1748 1838 1886 N
+ ER W UW s n/a 13 1748 1838 1886 N
+ ER W V b n/a 13 1738 1805 1889 N
+ ER W V e n/a 13 1738 1805 1889 N
+ ER W V i n/a 13 1740 1804 1889 N
+ ER W V s n/a 13 1738 1805 1889 N
+ ER W W b n/a 13 1748 1844 1894 N
+ ER W W e n/a 13 1748 1844 1894 N
+ ER W W s n/a 13 1748 1844 1894 N
+ ER W Y e n/a 13 1741 1828 1861 N
+ ER W Y s n/a 13 1741 1828 1861 N
+ ER W Z b n/a 13 1739 1811 1882 N
+ ER W Z e n/a 13 1739 1816 1882 N
+ ER W Z i n/a 13 1741 1811 1882 N
+ ER W Z s n/a 13 1739 1811 1882 N
+ ER W ZH e n/a 13 1739 1803 1882 N
+ ER W ZH s n/a 13 1739 1803 1882 N
+ ER Y AA b n/a 13 1698 1839 1888 N
+ ER Y AA e n/a 13 1693 1836 1887 N
+ ER Y AA i n/a 13 1695 1839 1888 N
+ ER Y AA s n/a 13 1694 1836 1888 N
+ ER Y AE b n/a 13 1698 1831 1850 N
+ ER Y AE e n/a 13 1693 1821 1851 N
+ ER Y AE i n/a 13 1695 1831 1850 N
+ ER Y AE s n/a 13 1694 1830 1848 N
+ ER Y AH b n/a 13 1698 1829 1848 N
+ ER Y AH e n/a 13 1693 1820 1852 N
+ ER Y AH i n/a 13 1695 1829 1847 N
+ ER Y AH s n/a 13 1694 1830 1848 N
+ ER Y AO b n/a 13 1698 1839 1888 N
+ ER Y AO e n/a 13 1693 1836 1886 N
+ ER Y AO i n/a 13 1695 1839 1888 N
+ ER Y AO s n/a 13 1694 1836 1886 N
+ ER Y AW b n/a 13 1698 1831 1850 N
+ ER Y AW e n/a 13 1695 1821 1852 N
+ ER Y AW s n/a 13 1694 1831 1848 N
+ ER Y AY b n/a 13 1698 1839 1888 N
+ ER Y AY e n/a 13 1695 1836 1887 N
+ ER Y AY i n/a 13 1695 1839 1888 N
+ ER Y AY s n/a 13 1694 1836 1888 N
+ ER Y B b n/a 13 1695 1788 1897 N
+ ER Y B e n/a 13 1693 1788 1897 N
+ ER Y B i n/a 13 1693 1790 1897 N
+ ER Y B s n/a 13 1694 1786 1897 N
+ ER Y CH b n/a 13 1695 1768 1868 N
+ ER Y CH e n/a 13 1693 1771 1868 N
+ ER Y CH i n/a 13 1693 1768 1867 N
+ ER Y CH s n/a 13 1694 1773 1868 N
+ ER Y D b n/a 13 1695 1771 1866 N
+ ER Y D e n/a 13 1693 1771 1866 N
+ ER Y D i n/a 13 1693 1771 1865 N
+ ER Y D s n/a 13 1694 1773 1866 N
+ ER Y DH b n/a 13 1693 1771 1872 N
+ ER Y DH e n/a 13 1693 1771 1872 N
+ ER Y DH s n/a 13 1693 1773 1874 N
+ ER Y EH b n/a 13 1698 1831 1849 N
+ ER Y EH e n/a 13 1693 1822 1851 N
+ ER Y EH i n/a 13 1695 1831 1849 N
+ ER Y EH s n/a 13 1694 1830 1849 N
+ ER Y ER b n/a 13 1698 1842 1890 N
+ ER Y ER e n/a 13 1693 1843 1890 N
+ ER Y ER s n/a 13 1694 1843 1890 N
+ ER Y EY b n/a 13 1698 1825 1858 N
+ ER Y EY e n/a 13 1695 1822 1851 N
+ ER Y EY i n/a 13 1695 1825 1857 N
+ ER Y EY s n/a 13 1694 1825 1854 N
+ ER Y F b n/a 13 1695 1788 1898 N
+ ER Y F e n/a 13 1693 1788 1898 N
+ ER Y F s n/a 13 1694 1786 1898 N
+ ER Y G b n/a 13 1695 1771 1871 N
+ ER Y G e n/a 13 1693 1771 1871 N
+ ER Y G i n/a 13 1693 1771 1871 N
+ ER Y G s n/a 13 1694 1773 1871 N
+ ER Y HH b n/a 13 1695 1768 1859 N
+ ER Y HH e n/a 13 1693 1768 1859 N
+ ER Y HH i n/a 13 1693 1768 1859 N
+ ER Y HH s n/a 13 1694 1773 1859 N
+ ER Y IH b n/a 13 1698 1825 1858 N
+ ER Y IH e n/a 13 1693 1822 1853 N
+ ER Y IH i n/a 13 1695 1823 1856 N
+ ER Y IH s n/a 13 1694 1823 1854 N
+ ER Y IY b n/a 13 1698 1824 1855 N
+ ER Y IY e n/a 13 1695 1822 1853 N
+ ER Y IY i n/a 13 1695 1824 1855 N
+ ER Y IY s n/a 13 1694 1824 1854 N
+ ER Y JH b n/a 13 1695 1771 1866 N
+ ER Y JH e n/a 13 1693 1771 1866 N
+ ER Y JH i n/a 13 1693 1771 1866 N
+ ER Y JH s n/a 13 1694 1773 1866 N
+ ER Y K b n/a 13 1695 1768 1870 N
+ ER Y K e n/a 13 1693 1771 1870 N
+ ER Y K i n/a 13 1693 1768 1870 N
+ ER Y K s n/a 13 1694 1773 1870 N
+ ER Y L b n/a 13 1695 1842 1884 N
+ ER Y L e n/a 13 1693 1840 1885 N
+ ER Y L i n/a 13 1693 1840 1885 N
+ ER Y L s n/a 13 1694 1840 1885 N
+ ER Y M b n/a 13 1695 1788 1891 N
+ ER Y M e n/a 13 1693 1788 1891 N
+ ER Y M i n/a 13 1693 1790 1892 N
+ ER Y M s n/a 13 1694 1786 1891 N
+ ER Y N b n/a 13 1695 1795 1862 N
+ ER Y N e n/a 13 1693 1795 1863 N
+ ER Y N i n/a 13 1693 1795 1862 N
+ ER Y N s n/a 13 1694 1795 1863 N
+ ER Y NG e n/a 13 1693 1769 1861 N
+ ER Y NG s n/a 13 1694 1773 1861 N
+ ER Y OW b n/a 13 1698 1839 1888 N
+ ER Y OW e n/a 13 1695 1836 1886 N
+ ER Y OW i n/a 13 1695 1838 1888 N
+ ER Y OW s n/a 13 1694 1836 1886 N
+ ER Y OY b n/a 13 1698 1839 1888 N
+ ER Y OY e n/a 13 1695 1836 1886 N
+ ER Y OY s n/a 13 1694 1836 1886 N
+ ER Y P b n/a 13 1695 1788 1896 N
+ ER Y P e n/a 13 1693 1788 1896 N
+ ER Y P i n/a 13 1693 1790 1896 N
+ ER Y P s n/a 13 1694 1786 1896 N
+ ER Y R e n/a 13 1693 1843 1895 N
+ ER Y R i n/a 13 1693 1843 1895 N
+ ER Y R s n/a 13 1694 1843 1895 N
+ ER Y S b n/a 13 1695 1784 1879 N
+ ER Y S e n/a 13 1693 1784 1879 N
+ ER Y S i n/a 13 1693 1783 1879 N
+ ER Y S s n/a 13 1694 1785 1879 N
+ ER Y SH b n/a 13 1695 1768 1880 N
+ ER Y SH e n/a 13 1693 1771 1880 N
+ ER Y SH s n/a 13 1694 1773 1880 N
+ ER Y SIL e n/a 13 1693 1796 1899 N
+ ER Y SIL s n/a 13 1694 1799 1901 N
+ ER Y T b n/a 13 1695 1768 1868 N
+ ER Y T e n/a 13 1693 1771 1868 N
+ ER Y T i n/a 13 1693 1768 1867 N
+ ER Y T s n/a 13 1694 1773 1868 N
+ ER Y TH b n/a 13 1695 1769 1875 N
+ ER Y TH e n/a 13 1693 1771 1875 N
+ ER Y TH s n/a 13 1694 1773 1875 N
+ ER Y UH b n/a 13 1698 1842 1888 N
+ ER Y UH e n/a 13 1693 1840 1886 N
+ ER Y UH i n/a 13 1695 1840 1888 N
+ ER Y UH s n/a 13 1694 1840 1886 N
+ ER Y UW b n/a 13 1698 1839 1888 N
+ ER Y UW e n/a 13 1695 1836 1886 N
+ ER Y UW s n/a 13 1694 1836 1886 N
+ ER Y V b n/a 13 1693 1788 1889 N
+ ER Y V e n/a 13 1693 1788 1889 N
+ ER Y V i n/a 13 1693 1790 1889 N
+ ER Y V s n/a 13 1693 1786 1889 N
+ ER Y W b n/a 13 1695 1845 1893 N
+ ER Y W e n/a 13 1693 1845 1893 N
+ ER Y W s n/a 13 1694 1845 1893 N
+ ER Y Y e n/a 13 1693 1822 1861 N
+ ER Y Y s n/a 13 1694 1823 1861 N
+ ER Y Z b n/a 13 1693 1766 1881 N
+ ER Y Z e n/a 13 1693 1766 1881 N
+ ER Y Z i n/a 13 1693 1766 1881 N
+ ER Y Z s n/a 13 1693 1766 1881 N
+ ER Y ZH e n/a 13 1693 1771 1881 N
+ ER Y ZH s n/a 13 1693 1773 1881 N
+ ER Z AA b n/a 13 1720 1839 1888 N
+ ER Z AA e n/a 13 1734 1836 1887 N
+ ER Z AA i n/a 13 1719 1839 1888 N
+ ER Z AA s n/a 13 1723 1836 1888 N
+ ER Z AE b n/a 13 1720 1831 1850 N
+ ER Z AE e n/a 13 1734 1821 1851 N
+ ER Z AE i n/a 13 1719 1831 1850 N
+ ER Z AE s n/a 13 1723 1830 1848 N
+ ER Z AH b n/a 13 1720 1829 1848 N
+ ER Z AH e n/a 13 1734 1820 1852 N
+ ER Z AH i n/a 13 1718 1829 1847 N
+ ER Z AH s n/a 13 1723 1830 1848 N
+ ER Z AO b n/a 13 1720 1839 1888 N
+ ER Z AO e n/a 13 1734 1836 1886 N
+ ER Z AO i n/a 13 1719 1839 1888 N
+ ER Z AO s n/a 13 1723 1836 1886 N
+ ER Z AW b n/a 13 1720 1831 1850 N
+ ER Z AW e n/a 13 1734 1821 1852 N
+ ER Z AW s n/a 13 1723 1831 1848 N
+ ER Z AY b n/a 13 1720 1839 1888 N
+ ER Z AY e n/a 13 1734 1836 1887 N
+ ER Z AY i n/a 13 1719 1839 1888 N
+ ER Z AY s n/a 13 1723 1836 1888 N
+ ER Z B b n/a 13 1715 1787 1897 N
+ ER Z B e n/a 13 1712 1788 1897 N
+ ER Z B i n/a 13 1712 1791 1897 N
+ ER Z B s n/a 13 1715 1786 1897 N
+ ER Z CH b n/a 13 1715 1779 1868 N
+ ER Z CH e n/a 13 1712 1780 1868 N
+ ER Z CH s n/a 13 1715 1779 1868 N
+ ER Z D b n/a 13 1715 1779 1866 N
+ ER Z D e n/a 13 1712 1779 1866 N
+ ER Z D i n/a 13 1712 1779 1865 N
+ ER Z D s n/a 13 1715 1779 1866 N
+ ER Z DH b n/a 13 1715 1775 1872 N
+ ER Z DH e n/a 13 1712 1781 1872 N
+ ER Z DH s n/a 13 1715 1781 1873 N
+ ER Z EH b n/a 13 1720 1831 1849 N
+ ER Z EH e n/a 13 1734 1822 1851 N
+ ER Z EH i n/a 13 1719 1831 1849 N
+ ER Z EH s n/a 13 1723 1830 1849 N
+ ER Z ER b n/a 13 1720 1846 1890 N
+ ER Z ER e n/a 13 1734 1846 1890 N
+ ER Z ER s n/a 13 1723 1846 1890 N
+ ER Z EY b n/a 13 1720 1825 1858 N
+ ER Z EY e n/a 13 1734 1822 1851 N
+ ER Z EY i n/a 13 1719 1825 1857 N
+ ER Z EY s n/a 13 1723 1825 1854 N
+ ER Z F b n/a 13 1715 1787 1898 N
+ ER Z F e n/a 13 1712 1788 1898 N
+ ER Z F i n/a 13 1712 1790 1898 N
+ ER Z F s n/a 13 1715 1786 1898 N
+ ER Z G b n/a 13 1715 1778 1871 N
+ ER Z G e n/a 13 1712 1778 1871 N
+ ER Z G s n/a 13 1715 1778 1871 N
+ ER Z HH b n/a 13 1715 1777 1859 N
+ ER Z HH e n/a 13 1712 1777 1859 N
+ ER Z HH s n/a 13 1715 1777 1859 N
+ ER Z IH b n/a 13 1720 1825 1858 N
+ ER Z IH e n/a 13 1734 1822 1853 N
+ ER Z IH i n/a 13 1718 1825 1856 N
+ ER Z IH s n/a 13 1723 1823 1854 N
+ ER Z IY b n/a 13 1720 1824 1855 N
+ ER Z IY e n/a 13 1734 1822 1853 N
+ ER Z IY i n/a 13 1718 1824 1855 N
+ ER Z IY s n/a 13 1723 1824 1854 N
+ ER Z JH b n/a 13 1715 1779 1866 N
+ ER Z JH e n/a 13 1712 1780 1866 N
+ ER Z JH s n/a 13 1715 1779 1866 N
+ ER Z K b n/a 13 1715 1778 1870 N
+ ER Z K e n/a 13 1712 1778 1870 N
+ ER Z K i n/a 13 1712 1778 1870 N
+ ER Z K s n/a 13 1715 1778 1870 N
+ ER Z L b n/a 13 1715 1842 1884 N
+ ER Z L e n/a 13 1712 1840 1885 N
+ ER Z L i n/a 13 1712 1840 1885 N
+ ER Z L s n/a 13 1715 1840 1885 N
+ ER Z M b n/a 13 1715 1787 1891 N
+ ER Z M e n/a 13 1712 1788 1891 N
+ ER Z M i n/a 13 1712 1791 1892 N
+ ER Z M s n/a 13 1715 1786 1891 N
+ ER Z N b n/a 13 1715 1795 1862 N
+ ER Z N e n/a 13 1712 1792 1863 N
+ ER Z N i n/a 13 1712 1792 1862 N
+ ER Z N s n/a 13 1715 1792 1863 N
+ ER Z NG e n/a 13 1712 1778 1861 N
+ ER Z NG s n/a 13 1715 1778 1861 N
+ ER Z OW b n/a 13 1720 1839 1888 N
+ ER Z OW e n/a 13 1734 1836 1886 N
+ ER Z OW i n/a 13 1719 1838 1888 N
+ ER Z OW s n/a 13 1723 1836 1886 N
+ ER Z OY b n/a 13 1720 1839 1888 N
+ ER Z OY e n/a 13 1734 1836 1886 N
+ ER Z OY s n/a 13 1723 1836 1886 N
+ ER Z P b n/a 13 1715 1787 1896 N
+ ER Z P e n/a 13 1712 1788 1896 N
+ ER Z P s n/a 13 1715 1786 1896 N
+ ER Z R e n/a 13 1712 1846 1895 N
+ ER Z R s n/a 13 1715 1846 1895 N
+ ER Z S b n/a 13 1715 1784 1879 N
+ ER Z S e n/a 13 1712 1784 1879 N
+ ER Z S i n/a 13 1712 1783 1879 N
+ ER Z S s n/a 13 1715 1785 1879 N
+ ER Z SH b n/a 13 1715 1784 1880 N
+ ER Z SH e n/a 13 1712 1784 1880 N
+ ER Z SH i n/a 13 1712 1783 1880 N
+ ER Z SH s n/a 13 1715 1785 1880 N
+ ER Z SIL e n/a 13 1712 1796 1899 N
+ ER Z SIL s n/a 13 1715 1799 1901 N
+ ER Z T b n/a 13 1715 1779 1868 N
+ ER Z T e n/a 13 1712 1780 1868 N
+ ER Z T i n/a 13 1712 1779 1867 N
+ ER Z T s n/a 13 1715 1779 1868 N
+ ER Z TH b n/a 13 1715 1775 1875 N
+ ER Z TH e n/a 13 1712 1781 1875 N
+ ER Z TH i n/a 13 1712 1781 1875 N
+ ER Z TH s n/a 13 1715 1781 1875 N
+ ER Z UH b n/a 13 1720 1842 1888 N
+ ER Z UH e n/a 13 1734 1840 1886 N
+ ER Z UH s n/a 13 1723 1840 1886 N
+ ER Z UW b n/a 13 1720 1839 1888 N
+ ER Z UW e n/a 13 1734 1836 1886 N
+ ER Z UW i n/a 13 1718 1839 1888 N
+ ER Z UW s n/a 13 1723 1836 1886 N
+ ER Z V b n/a 13 1715 1787 1889 N
+ ER Z V e n/a 13 1712 1788 1889 N
+ ER Z V i n/a 13 1712 1791 1889 N
+ ER Z V s n/a 13 1715 1786 1889 N
+ ER Z W b n/a 13 1715 1846 1893 N
+ ER Z W e n/a 13 1712 1846 1893 N
+ ER Z W i n/a 13 1712 1846 1893 N
+ ER Z W s n/a 13 1715 1846 1893 N
+ ER Z Y e n/a 13 1712 1822 1861 N
+ ER Z Y s n/a 13 1715 1823 1861 N
+ ER Z Z b n/a 13 1715 1765 1881 N
+ ER Z Z e n/a 13 1712 1765 1881 N
+ ER Z Z i n/a 13 1712 1765 1881 N
+ ER Z Z s n/a 13 1715 1765 1881 N
+ ER Z ZH e n/a 13 1712 1780 1881 N
+ ER Z ZH s n/a 13 1715 1779 1881 N
+ ER ZH AA b n/a 13 1720 1839 1888 N
+ ER ZH AA e n/a 13 1728 1836 1887 N
+ ER ZH AA i n/a 13 1719 1839 1888 N
+ ER ZH AA s n/a 13 1723 1836 1888 N
+ ER ZH AE b n/a 13 1720 1831 1850 N
+ ER ZH AE e n/a 13 1728 1821 1851 N
+ ER ZH AE i n/a 13 1719 1831 1850 N
+ ER ZH AE s n/a 13 1723 1830 1848 N
+ ER ZH AH b n/a 13 1720 1829 1848 N
+ ER ZH AH e n/a 13 1728 1820 1852 N
+ ER ZH AH i n/a 13 1719 1829 1847 N
+ ER ZH AH s n/a 13 1723 1830 1848 N
+ ER ZH AO b n/a 13 1720 1839 1888 N
+ ER ZH AO e n/a 13 1728 1836 1886 N
+ ER ZH AO s n/a 13 1723 1836 1886 N
+ ER ZH AW b n/a 13 1720 1831 1850 N
+ ER ZH AW e n/a 13 1728 1821 1852 N
+ ER ZH AW s n/a 13 1723 1831 1848 N
+ ER ZH AY b n/a 13 1720 1839 1888 N
+ ER ZH AY e n/a 13 1728 1836 1887 N
+ ER ZH AY i n/a 13 1719 1839 1888 N
+ ER ZH AY s n/a 13 1723 1836 1888 N
+ ER ZH B b n/a 13 1728 1788 1897 N
+ ER ZH B e n/a 13 1728 1788 1897 N
+ ER ZH B s n/a 13 1728 1786 1897 N
+ ER ZH CH b n/a 13 1728 1768 1868 N
+ ER ZH CH e n/a 13 1728 1771 1868 N
+ ER ZH CH s n/a 13 1728 1773 1868 N
+ ER ZH D b n/a 13 1728 1771 1866 N
+ ER ZH D e n/a 13 1728 1771 1866 N
+ ER ZH D i n/a 13 1728 1771 1865 N
+ ER ZH D s n/a 13 1728 1773 1866 N
+ ER ZH DH b n/a 13 1728 1771 1872 N
+ ER ZH DH e n/a 13 1728 1771 1872 N
+ ER ZH DH s n/a 13 1728 1773 1873 N
+ ER ZH EH b n/a 13 1720 1831 1849 N
+ ER ZH EH e n/a 13 1728 1822 1851 N
+ ER ZH EH s n/a 13 1723 1830 1849 N
+ ER ZH ER b n/a 13 1720 1842 1890 N
+ ER ZH ER e n/a 13 1728 1843 1890 N
+ ER ZH ER i n/a 13 1719 1843 1890 N
+ ER ZH ER s n/a 13 1723 1843 1890 N
+ ER ZH EY b n/a 13 1720 1825 1858 N
+ ER ZH EY e n/a 13 1728 1822 1851 N
+ ER ZH EY i n/a 13 1719 1825 1857 N
+ ER ZH EY s n/a 13 1723 1825 1854 N
+ ER ZH F b n/a 13 1728 1788 1898 N
+ ER ZH F e n/a 13 1728 1788 1898 N
+ ER ZH F s n/a 13 1728 1786 1898 N
+ ER ZH G b n/a 13 1728 1771 1871 N
+ ER ZH G e n/a 13 1728 1771 1871 N
+ ER ZH G s n/a 13 1728 1773 1871 N
+ ER ZH HH b n/a 13 1728 1768 1859 N
+ ER ZH HH e n/a 13 1728 1768 1859 N
+ ER ZH HH s n/a 13 1728 1773 1859 N
+ ER ZH IH b n/a 13 1720 1825 1858 N
+ ER ZH IH e n/a 13 1728 1822 1853 N
+ ER ZH IH i n/a 13 1719 1823 1856 N
+ ER ZH IH s n/a 13 1723 1823 1854 N
+ ER ZH IY b n/a 13 1720 1824 1855 N
+ ER ZH IY e n/a 13 1728 1822 1853 N
+ ER ZH IY i n/a 13 1719 1824 1855 N
+ ER ZH IY s n/a 13 1723 1824 1854 N
+ ER ZH JH b n/a 13 1728 1771 1866 N
+ ER ZH JH e n/a 13 1728 1771 1866 N
+ ER ZH JH s n/a 13 1728 1773 1866 N
+ ER ZH K b n/a 13 1728 1768 1870 N
+ ER ZH K e n/a 13 1728 1771 1870 N
+ ER ZH K s n/a 13 1728 1773 1870 N
+ ER ZH L b n/a 13 1728 1842 1884 N
+ ER ZH L e n/a 13 1728 1840 1885 N
+ ER ZH L i n/a 13 1728 1840 1885 N
+ ER ZH L s n/a 13 1728 1840 1885 N
+ ER ZH M b n/a 13 1728 1788 1891 N
+ ER ZH M e n/a 13 1728 1788 1891 N
+ ER ZH M i n/a 13 1728 1790 1892 N
+ ER ZH M s n/a 13 1728 1786 1891 N
+ ER ZH N b n/a 13 1728 1795 1862 N
+ ER ZH N e n/a 13 1728 1795 1863 N
+ ER ZH N s n/a 13 1728 1795 1863 N
+ ER ZH NG e n/a 13 1728 1769 1861 N
+ ER ZH NG s n/a 13 1728 1773 1861 N
+ ER ZH OW b n/a 13 1720 1839 1888 N
+ ER ZH OW e n/a 13 1728 1836 1886 N
+ ER ZH OW i n/a 13 1719 1838 1888 N
+ ER ZH OW s n/a 13 1723 1836 1886 N
+ ER ZH OY b n/a 13 1720 1839 1888 N
+ ER ZH OY e n/a 13 1728 1836 1886 N
+ ER ZH OY s n/a 13 1723 1836 1886 N
+ ER ZH P b n/a 13 1728 1788 1896 N
+ ER ZH P e n/a 13 1728 1788 1896 N
+ ER ZH P s n/a 13 1728 1786 1896 N
+ ER ZH R e n/a 13 1728 1843 1895 N
+ ER ZH R s n/a 13 1728 1843 1895 N
+ ER ZH S b n/a 13 1728 1784 1879 N
+ ER ZH S e n/a 13 1728 1784 1879 N
+ ER ZH S s n/a 13 1728 1785 1879 N
+ ER ZH SH b n/a 13 1728 1768 1880 N
+ ER ZH SH e n/a 13 1728 1771 1880 N
+ ER ZH SH s n/a 13 1728 1773 1880 N
+ ER ZH SIL e n/a 13 1728 1796 1899 N
+ ER ZH SIL s n/a 13 1728 1799 1901 N
+ ER ZH T b n/a 13 1728 1768 1868 N
+ ER ZH T e n/a 13 1728 1771 1868 N
+ ER ZH T i n/a 13 1728 1768 1867 N
+ ER ZH T s n/a 13 1728 1773 1868 N
+ ER ZH TH b n/a 13 1728 1769 1875 N
+ ER ZH TH e n/a 13 1728 1771 1875 N
+ ER ZH TH s n/a 13 1728 1773 1875 N
+ ER ZH UH b n/a 13 1720 1842 1888 N
+ ER ZH UH e n/a 13 1728 1840 1886 N
+ ER ZH UH s n/a 13 1723 1840 1886 N
+ ER ZH UW b n/a 13 1720 1839 1888 N
+ ER ZH UW e n/a 13 1728 1836 1886 N
+ ER ZH UW i n/a 13 1719 1839 1888 N
+ ER ZH UW s n/a 13 1723 1836 1886 N
+ ER ZH V b n/a 13 1728 1788 1889 N
+ ER ZH V e n/a 13 1728 1788 1889 N
+ ER ZH V i n/a 13 1728 1790 1889 N
+ ER ZH V s n/a 13 1728 1786 1889 N
+ ER ZH W b n/a 13 1728 1846 1893 N
+ ER ZH W e n/a 13 1728 1846 1893 N
+ ER ZH W s n/a 13 1728 1846 1893 N
+ ER ZH Y e n/a 13 1728 1822 1861 N
+ ER ZH Y i n/a 13 1728 1823 1861 N
+ ER ZH Y s n/a 13 1728 1823 1861 N
+ ER ZH Z b n/a 13 1728 1765 1881 N
+ ER ZH Z e n/a 13 1728 1765 1881 N
+ ER ZH Z i n/a 13 1728 1765 1881 N
+ ER ZH Z s n/a 13 1728 1765 1881 N
+ ER ZH ZH e n/a 13 1728 1771 1881 N
+ ER ZH ZH s n/a 13 1728 1773 1881 N
+ EY AA AA s n/a 14 1931 1976 2015 N
+ EY AA AE s n/a 14 1931 1971 2011 N
+ EY AA AH b n/a 14 1931 1971 2012 N
+ EY AA AH s n/a 14 1931 1971 2012 N
+ EY AA AO b n/a 14 1931 1976 2015 N
+ EY AA AO s n/a 14 1931 1976 2015 N
+ EY AA AW b n/a 14 1931 1976 2012 N
+ EY AA AW s n/a 14 1931 1976 2012 N
+ EY AA AY b n/a 14 1931 1971 2015 N
+ EY AA AY s n/a 14 1931 1971 2015 N
+ EY AA B b n/a 14 1930 1964 1994 N
+ EY AA B s n/a 14 1930 1964 1994 N
+ EY AA CH b n/a 14 1930 1949 1989 N
+ EY AA CH s n/a 14 1930 1949 1990 N
+ EY AA D b n/a 14 1930 1962 1991 N
+ EY AA D i n/a 14 1930 1962 1992 N
+ EY AA D s n/a 14 1930 1961 1992 N
+ EY AA DH b n/a 14 1930 1962 1998 N
+ EY AA DH s n/a 14 1930 1961 1998 N
+ EY AA EH b n/a 14 1931 1971 2011 N
+ EY AA EH s n/a 14 1931 1971 2011 N
+ EY AA ER b n/a 14 1931 1976 2016 N
+ EY AA ER s n/a 14 1931 1976 2016 N
+ EY AA EY s n/a 14 1931 1971 2011 N
+ EY AA F b n/a 14 1930 1949 2001 N
+ EY AA F s n/a 14 1930 1949 2001 N
+ EY AA G b n/a 14 1930 1952 1993 N
+ EY AA G s n/a 14 1930 1952 1993 N
+ EY AA HH b n/a 14 1930 1949 2004 N
+ EY AA HH s n/a 14 1930 1949 2004 N
+ EY AA IH s n/a 14 1931 1971 2011 N
+ EY AA IY b n/a 14 1931 1971 2011 N
+ EY AA IY s n/a 14 1931 1971 2011 N
+ EY AA JH b n/a 14 1930 1962 1991 N
+ EY AA JH s n/a 14 1930 1961 1991 N
+ EY AA K b n/a 14 1930 1952 1993 N
+ EY AA K s n/a 14 1930 1952 1993 N
+ EY AA L b n/a 14 1931 1976 2013 N
+ EY AA L s n/a 14 1931 1976 2013 N
+ EY AA M b n/a 14 1931 1979 2007 N
+ EY AA M s n/a 14 1931 1979 2007 N
+ EY AA N b n/a 14 1931 1979 2005 N
+ EY AA N s n/a 14 1931 1979 2006 N
+ EY AA NG b n/a 14 1931 1979 2005 N
+ EY AA NG s n/a 14 1931 1979 2006 N
+ EY AA OW b n/a 14 1931 1976 2015 N
+ EY AA OW s n/a 14 1931 1976 2015 N
+ EY AA OY s n/a 14 1931 1971 2015 N
+ EY AA P b n/a 14 1930 1949 1996 N
+ EY AA P s n/a 14 1930 1949 1996 N
+ EY AA R b n/a 14 1931 1976 2013 N
+ EY AA R s n/a 14 1931 1976 2013 N
+ EY AA S b n/a 14 1930 1949 2000 N
+ EY AA S i n/a 14 1930 1949 2000 N
+ EY AA S s n/a 14 1930 1949 2000 N
+ EY AA SH b n/a 14 1930 1949 2002 N
+ EY AA SH s n/a 14 1930 1949 2002 N
+ EY AA SIL s n/a 14 1934 1972 1997 N
+ EY AA T b n/a 14 1930 1949 1989 N
+ EY AA T i n/a 14 1930 1949 1990 N
+ EY AA T s n/a 14 1930 1949 1990 N
+ EY AA TH b n/a 14 1930 1949 2001 N
+ EY AA TH s n/a 14 1930 1949 2001 N
+ EY AA UH s n/a 14 1931 1976 2016 N
+ EY AA UW s n/a 14 1931 1976 2015 N
+ EY AA V b n/a 14 1930 1964 1995 N
+ EY AA V s n/a 14 1930 1964 1995 N
+ EY AA W b n/a 14 1931 1976 2013 N
+ EY AA W s n/a 14 1931 1976 2013 N
+ EY AA Y s n/a 14 1931 1972 2004 N
+ EY AA Z b n/a 14 1930 1962 2003 N
+ EY AA Z s n/a 14 1930 1962 2003 N
+ EY AA ZH b n/a 14 1930 1962 2003 N
+ EY AA ZH s n/a 14 1930 1961 2003 N
+ EY AE AA s n/a 14 1923 1976 2015 N
+ EY AE AE s n/a 14 1923 1971 2011 N
+ EY AE AH b n/a 14 1923 1971 2012 N
+ EY AE AH s n/a 14 1923 1971 2012 N
+ EY AE AO b n/a 14 1923 1976 2015 N
+ EY AE AO s n/a 14 1923 1976 2015 N
+ EY AE AW b n/a 14 1923 1976 2012 N
+ EY AE AW s n/a 14 1923 1976 2012 N
+ EY AE AY b n/a 14 1923 1971 2015 N
+ EY AE AY s n/a 14 1923 1971 2015 N
+ EY AE B b n/a 14 1923 1964 1994 N
+ EY AE B s n/a 14 1923 1964 1994 N
+ EY AE CH b n/a 14 1923 1955 1989 N
+ EY AE CH s n/a 14 1923 1956 1988 N
+ EY AE D b n/a 14 1923 1962 1991 N
+ EY AE D s n/a 14 1923 1961 1992 N
+ EY AE DH b n/a 14 1923 1962 1998 N
+ EY AE DH s n/a 14 1923 1961 1998 N
+ EY AE EH b n/a 14 1923 1971 2011 N
+ EY AE EH s n/a 14 1923 1971 2011 N
+ EY AE ER b n/a 14 1923 1976 2016 N
+ EY AE ER s n/a 14 1923 1976 2016 N
+ EY AE EY s n/a 14 1923 1971 2011 N
+ EY AE F b n/a 14 1923 1955 2001 N
+ EY AE F s n/a 14 1923 1956 2001 N
+ EY AE G b n/a 14 1923 1952 1993 N
+ EY AE G s n/a 14 1923 1952 1993 N
+ EY AE HH b n/a 14 1923 1955 2004 N
+ EY AE HH s n/a 14 1923 1956 2004 N
+ EY AE IH s n/a 14 1923 1971 2011 N
+ EY AE IY b n/a 14 1923 1971 2011 N
+ EY AE IY s n/a 14 1923 1971 2011 N
+ EY AE JH b n/a 14 1923 1962 1991 N
+ EY AE JH s n/a 14 1923 1961 1991 N
+ EY AE K b n/a 14 1923 1952 1993 N
+ EY AE K s n/a 14 1923 1952 1993 N
+ EY AE L b n/a 14 1923 1976 2013 N
+ EY AE L s n/a 14 1923 1976 2013 N
+ EY AE M b n/a 14 1923 1981 2007 N
+ EY AE M s n/a 14 1923 1981 2009 N
+ EY AE N b n/a 14 1923 1981 2005 N
+ EY AE N s n/a 14 1923 1981 2006 N
+ EY AE NG b n/a 14 1923 1981 2005 N
+ EY AE NG s n/a 14 1923 1981 2006 N
+ EY AE OW b n/a 14 1923 1976 2015 N
+ EY AE OW s n/a 14 1923 1976 2015 N
+ EY AE OY s n/a 14 1923 1971 2015 N
+ EY AE P b n/a 14 1923 1955 1996 N
+ EY AE P s n/a 14 1923 1956 1996 N
+ EY AE R b n/a 14 1923 1976 2013 N
+ EY AE R s n/a 14 1923 1976 2013 N
+ EY AE S b n/a 14 1922 1955 2000 N
+ EY AE S s n/a 14 1922 1956 2000 N
+ EY AE SH b n/a 14 1922 1955 2002 N
+ EY AE SH s n/a 14 1922 1956 2002 N
+ EY AE SIL s n/a 14 1923 1972 1997 N
+ EY AE T b n/a 14 1923 1955 1989 N
+ EY AE T i n/a 14 1923 1955 1990 N
+ EY AE T s n/a 14 1923 1956 1990 N
+ EY AE TH b n/a 14 1923 1955 2001 N
+ EY AE TH s n/a 14 1923 1956 2001 N
+ EY AE UH s n/a 14 1923 1976 2016 N
+ EY AE UW s n/a 14 1923 1976 2015 N
+ EY AE V b n/a 14 1923 1964 1995 N
+ EY AE V s n/a 14 1923 1964 1995 N
+ EY AE W b n/a 14 1923 1976 2013 N
+ EY AE W s n/a 14 1923 1976 2013 N
+ EY AE Y s n/a 14 1923 1972 2004 N
+ EY AE Z b n/a 14 1923 1962 2003 N
+ EY AE Z s n/a 14 1923 1962 2003 N
+ EY AE ZH b n/a 14 1923 1962 2003 N
+ EY AE ZH s n/a 14 1923 1961 2003 N
+ EY AH AA e n/a 14 1928 1976 2015 N
+ EY AH AA s n/a 14 1926 1976 2015 N
+ EY AH AE e n/a 14 1928 1971 2011 N
+ EY AH AE s n/a 14 1926 1971 2011 N
+ EY AH AH b n/a 14 1926 1971 2012 N
+ EY AH AH e n/a 14 1928 1971 2012 N
+ EY AH AH i n/a 14 1923 1971 2012 N
+ EY AH AH s n/a 14 1926 1971 2012 N
+ EY AH AO b n/a 14 1926 1976 2015 N
+ EY AH AO e n/a 14 1928 1976 2015 N
+ EY AH AO s n/a 14 1926 1976 2015 N
+ EY AH AW b n/a 14 1926 1976 2012 N
+ EY AH AW e n/a 14 1928 1976 2012 N
+ EY AH AW s n/a 14 1926 1976 2012 N
+ EY AH AY b n/a 14 1926 1971 2015 N
+ EY AH AY e n/a 14 1928 1971 2015 N
+ EY AH AY s n/a 14 1926 1971 2015 N
+ EY AH B b n/a 14 1926 1964 1994 N
+ EY AH B e n/a 14 1928 1964 1996 N
+ EY AH B s n/a 14 1926 1964 1994 N
+ EY AH CH b n/a 14 1926 1955 1989 N
+ EY AH CH e n/a 14 1928 1955 1988 N
+ EY AH CH s n/a 14 1926 1956 1988 N
+ EY AH D b n/a 14 1926 1962 1991 N
+ EY AH D e n/a 14 1928 1961 1990 N
+ EY AH D s n/a 14 1926 1961 1992 N
+ EY AH DH b n/a 14 1926 1962 1998 N
+ EY AH DH e n/a 14 1928 1961 1998 N
+ EY AH DH s n/a 14 1926 1961 1998 N
+ EY AH EH b n/a 14 1926 1971 2011 N
+ EY AH EH e n/a 14 1928 1971 2011 N
+ EY AH EH s n/a 14 1926 1971 2011 N
+ EY AH ER b n/a 14 1926 1976 2016 N
+ EY AH ER e n/a 14 1928 1976 2016 N
+ EY AH ER s n/a 14 1926 1976 2016 N
+ EY AH EY e n/a 14 1928 1971 2011 N
+ EY AH EY s n/a 14 1926 1971 2011 N
+ EY AH F b n/a 14 1926 1955 2001 N
+ EY AH F e n/a 14 1928 1955 2001 N
+ EY AH F s n/a 14 1926 1956 2001 N
+ EY AH G b n/a 14 1926 1952 1993 N
+ EY AH G e n/a 14 1928 1952 1993 N
+ EY AH G s n/a 14 1926 1952 1993 N
+ EY AH HH b n/a 14 1926 1955 2004 N
+ EY AH HH e n/a 14 1928 1955 2004 N
+ EY AH HH s n/a 14 1926 1956 2004 N
+ EY AH IH e n/a 14 1928 1971 2011 N
+ EY AH IH s n/a 14 1926 1971 2011 N
+ EY AH IY b n/a 14 1926 1971 2011 N
+ EY AH IY e n/a 14 1928 1971 2011 N
+ EY AH IY s n/a 14 1926 1971 2011 N
+ EY AH JH b n/a 14 1926 1962 1991 N
+ EY AH JH e n/a 14 1928 1961 1991 N
+ EY AH JH s n/a 14 1926 1961 1991 N
+ EY AH K b n/a 14 1926 1952 1993 N
+ EY AH K e n/a 14 1928 1952 1993 N
+ EY AH K s n/a 14 1926 1952 1993 N
+ EY AH L b n/a 14 1926 1976 2013 N
+ EY AH L e n/a 14 1928 1976 2013 N
+ EY AH L s n/a 14 1926 1976 2013 N
+ EY AH M b n/a 14 1926 1981 2007 N
+ EY AH M e n/a 14 1928 1981 2009 N
+ EY AH M s n/a 14 1926 1981 2009 N
+ EY AH N b n/a 14 1926 1981 2005 N
+ EY AH N e n/a 14 1928 1981 2006 N
+ EY AH N s n/a 14 1926 1981 2006 N
+ EY AH NG b n/a 14 1926 1981 2005 N
+ EY AH NG e n/a 14 1928 1981 2006 N
+ EY AH NG s n/a 14 1926 1981 2006 N
+ EY AH OW b n/a 14 1926 1976 2015 N
+ EY AH OW e n/a 14 1928 1976 2015 N
+ EY AH OW s n/a 14 1926 1976 2015 N
+ EY AH OY e n/a 14 1928 1971 2015 N
+ EY AH OY s n/a 14 1926 1971 2015 N
+ EY AH P b n/a 14 1926 1955 1996 N
+ EY AH P e n/a 14 1928 1955 1996 N
+ EY AH P s n/a 14 1926 1956 1996 N
+ EY AH R b n/a 14 1926 1976 2013 N
+ EY AH R e n/a 14 1928 1976 2013 N
+ EY AH R s n/a 14 1926 1976 2013 N
+ EY AH S b n/a 14 1926 1955 2000 N
+ EY AH S e n/a 14 1928 1955 2000 N
+ EY AH S i n/a 14 1922 1955 2000 N
+ EY AH S s n/a 14 1926 1956 2000 N
+ EY AH SH b n/a 14 1926 1955 2002 N
+ EY AH SH e n/a 14 1928 1955 2002 N
+ EY AH SH s n/a 14 1926 1956 2002 N
+ EY AH SIL e n/a 14 1928 1968 1997 N
+ EY AH SIL s n/a 14 1926 1972 1997 N
+ EY AH T b n/a 14 1926 1955 1989 N
+ EY AH T e n/a 14 1928 1955 1990 N
+ EY AH T i n/a 14 1923 1955 1990 N
+ EY AH T s n/a 14 1926 1956 1990 N
+ EY AH TH b n/a 14 1926 1955 2001 N
+ EY AH TH e n/a 14 1928 1955 2001 N
+ EY AH TH s n/a 14 1926 1956 2001 N
+ EY AH UH e n/a 14 1928 1976 2016 N
+ EY AH UH s n/a 14 1926 1976 2016 N
+ EY AH UW e n/a 14 1928 1976 2015 N
+ EY AH UW s n/a 14 1926 1976 2015 N
+ EY AH V b n/a 14 1926 1964 1995 N
+ EY AH V e n/a 14 1928 1964 1995 N
+ EY AH V i n/a 14 1923 1964 1995 N
+ EY AH V s n/a 14 1926 1964 1995 N
+ EY AH W b n/a 14 1926 1976 2013 N
+ EY AH W e n/a 14 1928 1976 2013 N
+ EY AH W s n/a 14 1926 1976 2013 N
+ EY AH Y e n/a 14 1928 1972 2004 N
+ EY AH Y s n/a 14 1926 1972 2004 N
+ EY AH Z b n/a 14 1926 1962 2003 N
+ EY AH Z e n/a 14 1928 1961 2003 N
+ EY AH Z s n/a 14 1926 1962 2003 N
+ EY AH ZH b n/a 14 1926 1962 2003 N
+ EY AH ZH e n/a 14 1928 1961 2003 N
+ EY AH ZH s n/a 14 1926 1961 2003 N
+ EY AO AA s n/a 14 1931 1976 2015 N
+ EY AO AE s n/a 14 1931 1971 2011 N
+ EY AO AH b n/a 14 1931 1971 2012 N
+ EY AO AH s n/a 14 1931 1971 2012 N
+ EY AO AO b n/a 14 1931 1976 2015 N
+ EY AO AO s n/a 14 1931 1976 2015 N
+ EY AO AW b n/a 14 1931 1976 2012 N
+ EY AO AW s n/a 14 1931 1976 2012 N
+ EY AO AY b n/a 14 1931 1971 2015 N
+ EY AO AY s n/a 14 1931 1971 2015 N
+ EY AO B b n/a 14 1930 1964 1994 N
+ EY AO B s n/a 14 1930 1964 1994 N
+ EY AO CH b n/a 14 1930 1949 1989 N
+ EY AO CH s n/a 14 1930 1949 1990 N
+ EY AO D b n/a 14 1930 1962 1991 N
+ EY AO D s n/a 14 1930 1961 1992 N
+ EY AO DH b n/a 14 1930 1962 1998 N
+ EY AO DH s n/a 14 1930 1961 1998 N
+ EY AO EH b n/a 14 1931 1971 2011 N
+ EY AO EH s n/a 14 1931 1971 2011 N
+ EY AO ER b n/a 14 1931 1976 2016 N
+ EY AO ER s n/a 14 1931 1976 2016 N
+ EY AO EY s n/a 14 1931 1971 2011 N
+ EY AO F b n/a 14 1930 1949 2001 N
+ EY AO F s n/a 14 1930 1949 2001 N
+ EY AO G b n/a 14 1930 1952 1993 N
+ EY AO G s n/a 14 1930 1952 1993 N
+ EY AO HH b n/a 14 1930 1949 2004 N
+ EY AO HH s n/a 14 1930 1949 2004 N
+ EY AO IH s n/a 14 1931 1971 2011 N
+ EY AO IY b n/a 14 1931 1971 2011 N
+ EY AO IY s n/a 14 1931 1971 2011 N
+ EY AO JH b n/a 14 1930 1962 1991 N
+ EY AO JH s n/a 14 1930 1961 1991 N
+ EY AO K b n/a 14 1930 1952 1993 N
+ EY AO K s n/a 14 1930 1952 1993 N
+ EY AO L b n/a 14 1931 1976 2013 N
+ EY AO L s n/a 14 1931 1976 2013 N
+ EY AO M b n/a 14 1931 1979 2007 N
+ EY AO M s n/a 14 1931 1979 2007 N
+ EY AO N b n/a 14 1931 1979 2005 N
+ EY AO N s n/a 14 1931 1979 2006 N
+ EY AO NG b n/a 14 1931 1979 2005 N
+ EY AO NG s n/a 14 1931 1979 2006 N
+ EY AO OW b n/a 14 1931 1976 2015 N
+ EY AO OW s n/a 14 1931 1976 2015 N
+ EY AO OY s n/a 14 1931 1971 2015 N
+ EY AO P b n/a 14 1930 1949 1996 N
+ EY AO P s n/a 14 1930 1949 1996 N
+ EY AO R b n/a 14 1931 1976 2013 N
+ EY AO R s n/a 14 1931 1976 2013 N
+ EY AO S b n/a 14 1930 1949 2000 N
+ EY AO S s n/a 14 1930 1949 2000 N
+ EY AO SH b n/a 14 1930 1949 2002 N
+ EY AO SH s n/a 14 1930 1949 2002 N
+ EY AO SIL s n/a 14 1934 1972 1997 N
+ EY AO T b n/a 14 1930 1949 1989 N
+ EY AO T s n/a 14 1930 1949 1990 N
+ EY AO TH b n/a 14 1930 1949 2001 N
+ EY AO TH s n/a 14 1930 1949 2001 N
+ EY AO UH s n/a 14 1931 1976 2016 N
+ EY AO UW s n/a 14 1931 1976 2015 N
+ EY AO V b n/a 14 1930 1964 1995 N
+ EY AO V s n/a 14 1930 1964 1995 N
+ EY AO W b n/a 14 1931 1976 2013 N
+ EY AO W s n/a 14 1931 1976 2013 N
+ EY AO Y s n/a 14 1931 1972 2004 N
+ EY AO Z b n/a 14 1930 1962 2003 N
+ EY AO Z s n/a 14 1930 1962 2003 N
+ EY AO ZH b n/a 14 1930 1962 2003 N
+ EY AO ZH s n/a 14 1930 1961 2003 N
+ EY AW AA e n/a 14 1934 1976 2015 N
+ EY AW AA s n/a 14 1932 1976 2015 N
+ EY AW AE e n/a 14 1934 1971 2011 N
+ EY AW AE s n/a 14 1932 1971 2011 N
+ EY AW AH b n/a 14 1932 1971 2012 N
+ EY AW AH e n/a 14 1933 1971 2012 N
+ EY AW AH s n/a 14 1932 1971 2012 N
+ EY AW AO b n/a 14 1932 1976 2015 N
+ EY AW AO e n/a 14 1934 1976 2015 N
+ EY AW AO s n/a 14 1932 1976 2015 N
+ EY AW AW b n/a 14 1932 1976 2012 N
+ EY AW AW e n/a 14 1933 1976 2012 N
+ EY AW AW s n/a 14 1932 1976 2012 N
+ EY AW AY b n/a 14 1932 1971 2015 N
+ EY AW AY e n/a 14 1933 1971 2015 N
+ EY AW AY s n/a 14 1932 1971 2015 N
+ EY AW B b n/a 14 1932 1964 1994 N
+ EY AW B e n/a 14 1933 1964 1996 N
+ EY AW B s n/a 14 1932 1964 1994 N
+ EY AW CH b n/a 14 1932 1944 1989 N
+ EY AW CH e n/a 14 1933 1944 1990 N
+ EY AW CH s n/a 14 1932 1944 1990 N
+ EY AW D b n/a 14 1932 1962 1991 N
+ EY AW D e n/a 14 1933 1961 1990 N
+ EY AW D s n/a 14 1932 1961 1992 N
+ EY AW DH b n/a 14 1932 1962 1998 N
+ EY AW DH e n/a 14 1933 1961 1998 N
+ EY AW DH s n/a 14 1932 1961 1998 N
+ EY AW EH b n/a 14 1932 1971 2011 N
+ EY AW EH e n/a 14 1933 1971 2011 N
+ EY AW EH s n/a 14 1932 1971 2011 N
+ EY AW ER b n/a 14 1932 1976 2016 N
+ EY AW ER e n/a 14 1933 1976 2016 N
+ EY AW ER s n/a 14 1932 1976 2016 N
+ EY AW EY e n/a 14 1934 1971 2011 N
+ EY AW EY s n/a 14 1932 1971 2011 N
+ EY AW F b n/a 14 1932 1944 2001 N
+ EY AW F e n/a 14 1933 1944 2001 N
+ EY AW F s n/a 14 1932 1944 2001 N
+ EY AW G b n/a 14 1932 1952 1993 N
+ EY AW G e n/a 14 1933 1952 1993 N
+ EY AW G s n/a 14 1932 1952 1993 N
+ EY AW HH b n/a 14 1932 1944 2004 N
+ EY AW HH e n/a 14 1933 1944 2004 N
+ EY AW HH s n/a 14 1932 1944 2004 N
+ EY AW IH e n/a 14 1933 1971 2011 N
+ EY AW IH s n/a 14 1932 1971 2011 N
+ EY AW IY b n/a 14 1932 1971 2011 N
+ EY AW IY e n/a 14 1934 1971 2011 N
+ EY AW IY s n/a 14 1932 1971 2011 N
+ EY AW JH b n/a 14 1932 1962 1991 N
+ EY AW JH e n/a 14 1933 1961 1991 N
+ EY AW JH s n/a 14 1932 1961 1991 N
+ EY AW K b n/a 14 1932 1952 1993 N
+ EY AW K e n/a 14 1933 1952 1993 N
+ EY AW K s n/a 14 1932 1952 1993 N
+ EY AW L b n/a 14 1932 1976 2013 N
+ EY AW L e n/a 14 1933 1976 2013 N
+ EY AW L s n/a 14 1932 1976 2013 N
+ EY AW M b n/a 14 1932 1979 2007 N
+ EY AW M e n/a 14 1933 1978 2009 N
+ EY AW M s n/a 14 1932 1979 2009 N
+ EY AW N b n/a 14 1932 1979 2005 N
+ EY AW N e n/a 14 1933 1978 2006 N
+ EY AW N s n/a 14 1932 1979 2006 N
+ EY AW NG b n/a 14 1932 1979 2005 N
+ EY AW NG e n/a 14 1933 1978 2006 N
+ EY AW NG s n/a 14 1932 1979 2006 N
+ EY AW OW b n/a 14 1932 1976 2015 N
+ EY AW OW e n/a 14 1933 1976 2015 N
+ EY AW OW s n/a 14 1932 1976 2015 N
+ EY AW OY e n/a 14 1933 1971 2015 N
+ EY AW OY s n/a 14 1932 1971 2015 N
+ EY AW P b n/a 14 1932 1944 1996 N
+ EY AW P e n/a 14 1933 1944 1996 N
+ EY AW P s n/a 14 1932 1944 1996 N
+ EY AW R b n/a 14 1932 1976 2013 N
+ EY AW R e n/a 14 1933 1976 2013 N
+ EY AW R s n/a 14 1932 1976 2013 N
+ EY AW S b n/a 14 1932 1944 2000 N
+ EY AW S e n/a 14 1933 1944 2000 N
+ EY AW S i n/a 14 1932 1949 2000 N
+ EY AW S s n/a 14 1932 1944 2000 N
+ EY AW SH b n/a 14 1932 1944 2002 N
+ EY AW SH e n/a 14 1933 1944 2002 N
+ EY AW SH s n/a 14 1932 1944 2002 N
+ EY AW SIL e n/a 14 1934 1969 1997 N
+ EY AW SIL s n/a 14 1934 1972 1997 N
+ EY AW T b n/a 14 1932 1944 1989 N
+ EY AW T e n/a 14 1933 1944 1990 N
+ EY AW T s n/a 14 1932 1944 1990 N
+ EY AW TH b n/a 14 1932 1944 2001 N
+ EY AW TH e n/a 14 1933 1944 2001 N
+ EY AW TH s n/a 14 1932 1944 2001 N
+ EY AW UH e n/a 14 1933 1976 2016 N
+ EY AW UH s n/a 14 1932 1976 2016 N
+ EY AW UW e n/a 14 1934 1976 2015 N
+ EY AW UW s n/a 14 1932 1976 2015 N
+ EY AW V b n/a 14 1932 1964 1995 N
+ EY AW V e n/a 14 1933 1964 1995 N
+ EY AW V s n/a 14 1932 1964 1995 N
+ EY AW W b n/a 14 1932 1976 2013 N
+ EY AW W e n/a 14 1933 1976 2013 N
+ EY AW W s n/a 14 1932 1976 2013 N
+ EY AW Y e n/a 14 1933 1972 2004 N
+ EY AW Y s n/a 14 1932 1972 2004 N
+ EY AW Z b n/a 14 1932 1962 2003 N
+ EY AW Z e n/a 14 1933 1961 2003 N
+ EY AW Z s n/a 14 1932 1962 2003 N
+ EY AW ZH b n/a 14 1932 1962 2003 N
+ EY AW ZH e n/a 14 1933 1961 2003 N
+ EY AW ZH s n/a 14 1932 1961 2003 N
+ EY AY AA e n/a 14 1928 1976 2015 N
+ EY AY AA s n/a 14 1926 1976 2015 N
+ EY AY AE e n/a 14 1928 1971 2011 N
+ EY AY AE s n/a 14 1926 1971 2011 N
+ EY AY AH b n/a 14 1926 1971 2012 N
+ EY AY AH e n/a 14 1928 1971 2012 N
+ EY AY AH s n/a 14 1926 1971 2012 N
+ EY AY AO b n/a 14 1926 1976 2015 N
+ EY AY AO e n/a 14 1928 1976 2015 N
+ EY AY AO s n/a 14 1926 1976 2015 N
+ EY AY AW b n/a 14 1926 1976 2012 N
+ EY AY AW e n/a 14 1928 1976 2012 N
+ EY AY AW s n/a 14 1926 1976 2012 N
+ EY AY AY b n/a 14 1926 1971 2015 N
+ EY AY AY e n/a 14 1928 1971 2015 N
+ EY AY AY s n/a 14 1926 1971 2015 N
+ EY AY B b n/a 14 1926 1964 1994 N
+ EY AY B e n/a 14 1928 1964 1996 N
+ EY AY B s n/a 14 1926 1964 1994 N
+ EY AY CH b n/a 14 1926 1955 1989 N
+ EY AY CH e n/a 14 1928 1955 1988 N
+ EY AY CH i n/a 14 1925 1955 1988 N
+ EY AY CH s n/a 14 1926 1956 1988 N
+ EY AY D b n/a 14 1926 1962 1991 N
+ EY AY D e n/a 14 1928 1961 1990 N
+ EY AY D i n/a 14 1925 1962 1992 N
+ EY AY D s n/a 14 1926 1961 1992 N
+ EY AY DH b n/a 14 1926 1962 1998 N
+ EY AY DH e n/a 14 1928 1961 1998 N
+ EY AY DH s n/a 14 1926 1961 1998 N
+ EY AY EH b n/a 14 1926 1971 2011 N
+ EY AY EH e n/a 14 1928 1971 2011 N
+ EY AY EH s n/a 14 1926 1971 2011 N
+ EY AY ER b n/a 14 1926 1976 2016 N
+ EY AY ER e n/a 14 1928 1976 2016 N
+ EY AY ER s n/a 14 1926 1976 2016 N
+ EY AY EY e n/a 14 1928 1971 2011 N
+ EY AY EY i n/a 14 1925 1971 2011 N
+ EY AY EY s n/a 14 1926 1971 2011 N
+ EY AY F b n/a 14 1926 1955 2001 N
+ EY AY F e n/a 14 1928 1955 2001 N
+ EY AY F s n/a 14 1926 1956 2001 N
+ EY AY G b n/a 14 1926 1952 1993 N
+ EY AY G e n/a 14 1928 1952 1993 N
+ EY AY G s n/a 14 1926 1952 1993 N
+ EY AY HH b n/a 14 1926 1955 2004 N
+ EY AY HH e n/a 14 1928 1955 2004 N
+ EY AY HH s n/a 14 1926 1956 2004 N
+ EY AY IH e n/a 14 1928 1971 2011 N
+ EY AY IH s n/a 14 1926 1971 2011 N
+ EY AY IY b n/a 14 1926 1971 2011 N
+ EY AY IY e n/a 14 1928 1971 2011 N
+ EY AY IY s n/a 14 1926 1971 2011 N
+ EY AY JH b n/a 14 1926 1962 1991 N
+ EY AY JH e n/a 14 1928 1961 1991 N
+ EY AY JH s n/a 14 1926 1961 1991 N
+ EY AY K b n/a 14 1926 1952 1993 N
+ EY AY K e n/a 14 1928 1952 1993 N
+ EY AY K s n/a 14 1926 1952 1993 N
+ EY AY L b n/a 14 1926 1976 2013 N
+ EY AY L e n/a 14 1928 1976 2013 N
+ EY AY L s n/a 14 1926 1976 2013 N
+ EY AY M b n/a 14 1926 1981 2007 N
+ EY AY M e n/a 14 1928 1981 2009 N
+ EY AY M s n/a 14 1926 1981 2007 N
+ EY AY N b n/a 14 1926 1981 2005 N
+ EY AY N e n/a 14 1928 1981 2006 N
+ EY AY N i n/a 14 1925 1981 2005 N
+ EY AY N s n/a 14 1926 1981 2006 N
+ EY AY NG b n/a 14 1926 1981 2005 N
+ EY AY NG e n/a 14 1928 1981 2006 N
+ EY AY NG s n/a 14 1926 1981 2006 N
+ EY AY OW b n/a 14 1926 1976 2015 N
+ EY AY OW e n/a 14 1928 1976 2015 N
+ EY AY OW s n/a 14 1926 1976 2015 N
+ EY AY OY e n/a 14 1928 1971 2015 N
+ EY AY OY s n/a 14 1926 1971 2015 N
+ EY AY P b n/a 14 1926 1955 1996 N
+ EY AY P e n/a 14 1928 1955 1996 N
+ EY AY P s n/a 14 1926 1956 1996 N
+ EY AY R b n/a 14 1926 1976 2013 N
+ EY AY R e n/a 14 1928 1976 2013 N
+ EY AY R s n/a 14 1926 1976 2013 N
+ EY AY S b n/a 14 1926 1955 2000 N
+ EY AY S e n/a 14 1928 1955 2000 N
+ EY AY S s n/a 14 1926 1956 2000 N
+ EY AY SH b n/a 14 1926 1955 2002 N
+ EY AY SH e n/a 14 1928 1955 2002 N
+ EY AY SH s n/a 14 1926 1956 2002 N
+ EY AY SIL e n/a 14 1928 1968 1997 N
+ EY AY SIL s n/a 14 1926 1972 1997 N
+ EY AY T b n/a 14 1926 1955 1989 N
+ EY AY T e n/a 14 1928 1955 1990 N
+ EY AY T i n/a 14 1925 1955 1990 N
+ EY AY T s n/a 14 1926 1956 1990 N
+ EY AY TH b n/a 14 1926 1955 2001 N
+ EY AY TH e n/a 14 1928 1955 2001 N
+ EY AY TH s n/a 14 1926 1956 2001 N
+ EY AY UH e n/a 14 1928 1976 2016 N
+ EY AY UH s n/a 14 1926 1976 2016 N
+ EY AY UW e n/a 14 1928 1976 2015 N
+ EY AY UW s n/a 14 1926 1976 2015 N
+ EY AY V b n/a 14 1926 1964 1995 N
+ EY AY V e n/a 14 1928 1964 1995 N
+ EY AY V s n/a 14 1926 1964 1995 N
+ EY AY W b n/a 14 1926 1976 2013 N
+ EY AY W e n/a 14 1928 1976 2013 N
+ EY AY W s n/a 14 1926 1976 2013 N
+ EY AY Y e n/a 14 1928 1972 2004 N
+ EY AY Y s n/a 14 1926 1972 2004 N
+ EY AY Z b n/a 14 1926 1962 2003 N
+ EY AY Z e n/a 14 1928 1961 2003 N
+ EY AY Z s n/a 14 1926 1962 2003 N
+ EY AY ZH b n/a 14 1926 1962 2003 N
+ EY AY ZH e n/a 14 1928 1961 2003 N
+ EY AY ZH s n/a 14 1926 1961 2003 N
+ EY B AA e n/a 14 1928 1976 2015 N
+ EY B AA i n/a 14 1921 1976 2015 N
+ EY B AA s n/a 14 1921 1976 2015 N
+ EY B AE e n/a 14 1928 1971 2011 N
+ EY B AE s n/a 14 1921 1971 2011 N
+ EY B AH b n/a 14 1921 1971 2012 N
+ EY B AH e n/a 14 1928 1971 2012 N
+ EY B AH i n/a 14 1921 1971 2012 N
+ EY B AH s n/a 14 1921 1971 2012 N
+ EY B AO b n/a 14 1921 1976 2015 N
+ EY B AO e n/a 14 1928 1976 2015 N
+ EY B AO s n/a 14 1921 1976 2015 N
+ EY B AW b n/a 14 1921 1976 2012 N
+ EY B AW e n/a 14 1928 1976 2012 N
+ EY B AW s n/a 14 1921 1976 2012 N
+ EY B AY b n/a 14 1921 1971 2015 N
+ EY B AY e n/a 14 1928 1971 2015 N
+ EY B AY s n/a 14 1921 1971 2015 N
+ EY B B b n/a 14 1921 1964 1995 N
+ EY B B e n/a 14 1928 1964 1995 N
+ EY B B i n/a 14 1921 1964 1995 N
+ EY B B s n/a 14 1921 1964 1995 N
+ EY B CH b n/a 14 1921 1958 1989 N
+ EY B CH e n/a 14 1928 1957 1988 N
+ EY B CH i n/a 14 1921 1957 1988 N
+ EY B CH s n/a 14 1921 1957 1988 N
+ EY B D b n/a 14 1921 1962 1991 N
+ EY B D e n/a 14 1928 1961 1990 N
+ EY B D i n/a 14 1921 1962 1992 N
+ EY B D s n/a 14 1921 1961 1992 N
+ EY B DH b n/a 14 1921 1962 1998 N
+ EY B DH e n/a 14 1928 1961 1998 N
+ EY B DH i n/a 14 1921 1962 1998 N
+ EY B DH s n/a 14 1921 1961 1998 N
+ EY B EH b n/a 14 1921 1971 2011 N
+ EY B EH e n/a 14 1928 1971 2011 N
+ EY B EH i n/a 14 1921 1971 2011 N
+ EY B EH s n/a 14 1921 1971 2011 N
+ EY B ER b n/a 14 1921 1976 2016 N
+ EY B ER e n/a 14 1928 1976 2016 N
+ EY B ER i n/a 14 1921 1976 2016 N
+ EY B ER s n/a 14 1921 1976 2016 N
+ EY B EY e n/a 14 1928 1971 2011 N
+ EY B EY s n/a 14 1921 1971 2011 N
+ EY B F b n/a 14 1921 1958 2001 N
+ EY B F e n/a 14 1928 1957 2001 N
+ EY B F s n/a 14 1921 1957 2001 N
+ EY B G b n/a 14 1921 1952 1993 N
+ EY B G e n/a 14 1928 1952 1993 N
+ EY B G i n/a 14 1921 1952 1993 N
+ EY B G s n/a 14 1921 1952 1993 N
+ EY B HH b n/a 14 1921 1958 2004 N
+ EY B HH e n/a 14 1928 1957 2004 N
+ EY B HH i n/a 14 1921 1957 2004 N
+ EY B HH s n/a 14 1921 1957 2004 N
+ EY B IH e n/a 14 1928 1971 2011 N
+ EY B IH i n/a 14 1921 1970 2010 N
+ EY B IH s n/a 14 1921 1971 2011 N
+ EY B IY b n/a 14 1921 1971 2011 N
+ EY B IY e n/a 14 1928 1971 2011 N
+ EY B IY i n/a 14 1921 1970 2010 N
+ EY B IY s n/a 14 1921 1971 2011 N
+ EY B JH b n/a 14 1921 1962 1991 N
+ EY B JH e n/a 14 1928 1961 1991 N
+ EY B JH i n/a 14 1921 1962 1991 N
+ EY B JH s n/a 14 1921 1961 1991 N
+ EY B K b n/a 14 1921 1952 1993 N
+ EY B K e n/a 14 1928 1952 1993 N
+ EY B K i n/a 14 1921 1952 1993 N
+ EY B K s n/a 14 1921 1952 1993 N
+ EY B L b n/a 14 1921 1976 2013 N
+ EY B L e n/a 14 1928 1976 2013 N
+ EY B L i n/a 14 1921 1976 2017 N
+ EY B L s n/a 14 1921 1976 2013 N
+ EY B M b n/a 14 1921 1981 2007 N
+ EY B M e n/a 14 1928 1981 2009 N
+ EY B M i n/a 14 1921 1981 2007 N
+ EY B M s n/a 14 1921 1981 2009 N
+ EY B N b n/a 14 1921 1981 2005 N
+ EY B N e n/a 14 1928 1981 2006 N
+ EY B N i n/a 14 1921 1981 2005 N
+ EY B N s n/a 14 1921 1981 2006 N
+ EY B NG b n/a 14 1921 1981 2005 N
+ EY B NG e n/a 14 1928 1981 2006 N
+ EY B NG i n/a 14 1921 1981 2005 N
+ EY B NG s n/a 14 1921 1981 2006 N
+ EY B OW b n/a 14 1921 1976 2015 N
+ EY B OW e n/a 14 1928 1976 2015 N
+ EY B OW s n/a 14 1921 1976 2015 N
+ EY B OY e n/a 14 1928 1971 2015 N
+ EY B OY s n/a 14 1921 1971 2015 N
+ EY B P b n/a 14 1921 1959 1996 N
+ EY B P e n/a 14 1928 1959 1996 N
+ EY B P i n/a 14 1921 1959 1996 N
+ EY B P s n/a 14 1921 1959 1996 N
+ EY B R b n/a 14 1921 1976 2013 N
+ EY B R e n/a 14 1928 1976 2013 N
+ EY B R i n/a 14 1921 1976 2016 N
+ EY B R s n/a 14 1921 1976 2013 N
+ EY B S b n/a 14 1921 1958 2000 N
+ EY B S e n/a 14 1928 1957 2000 N
+ EY B S i n/a 14 1921 1957 2000 N
+ EY B S s n/a 14 1921 1957 2000 N
+ EY B SH b n/a 14 1921 1960 2002 N
+ EY B SH e n/a 14 1928 1960 2002 N
+ EY B SH i n/a 14 1921 1960 2002 N
+ EY B SH s n/a 14 1921 1960 2002 N
+ EY B SIL e n/a 14 1929 1968 1997 N
+ EY B SIL s n/a 14 1921 1972 1997 N
+ EY B T b n/a 14 1921 1958 1989 N
+ EY B T e n/a 14 1928 1957 1990 N
+ EY B T i n/a 14 1921 1957 1990 N
+ EY B T s n/a 14 1921 1957 1990 N
+ EY B TH b n/a 14 1921 1958 2001 N
+ EY B TH e n/a 14 1928 1957 2001 N
+ EY B TH i n/a 14 1921 1957 2001 N
+ EY B TH s n/a 14 1921 1957 2001 N
+ EY B UH e n/a 14 1928 1976 2016 N
+ EY B UH s n/a 14 1921 1976 2016 N
+ EY B UW e n/a 14 1928 1976 2015 N
+ EY B UW i n/a 14 1921 1976 2015 N
+ EY B UW s n/a 14 1921 1976 2015 N
+ EY B V b n/a 14 1921 1964 1995 N
+ EY B V e n/a 14 1928 1964 1995 N
+ EY B V i n/a 14 1921 1964 1995 N
+ EY B V s n/a 14 1921 1964 1995 N
+ EY B W b n/a 14 1921 1976 2013 N
+ EY B W e n/a 14 1928 1976 2013 N
+ EY B W i n/a 14 1921 1976 2017 N
+ EY B W s n/a 14 1921 1976 2013 N
+ EY B Y e n/a 14 1928 1972 2004 N
+ EY B Y i n/a 14 1921 1970 2004 N
+ EY B Y s n/a 14 1921 1972 2004 N
+ EY B Z b n/a 14 1921 1962 2003 N
+ EY B Z e n/a 14 1928 1961 2003 N
+ EY B Z i n/a 14 1921 1962 2003 N
+ EY B Z s n/a 14 1921 1962 2003 N
+ EY B ZH b n/a 14 1921 1962 2003 N
+ EY B ZH e n/a 14 1928 1961 2003 N
+ EY B ZH i n/a 14 1921 1962 2003 N
+ EY B ZH s n/a 14 1921 1961 2003 N
+ EY CH AA e n/a 14 1928 1976 2015 N
+ EY CH AA s n/a 14 1910 1976 2015 N
+ EY CH AE e n/a 14 1928 1971 2011 N
+ EY CH AE s n/a 14 1910 1971 2011 N
+ EY CH AH b n/a 14 1910 1971 2012 N
+ EY CH AH e n/a 14 1928 1971 2012 N
+ EY CH AH i n/a 14 1904 1971 2012 N
+ EY CH AH s n/a 14 1910 1971 2012 N
+ EY CH AO b n/a 14 1910 1976 2015 N
+ EY CH AO e n/a 14 1928 1976 2015 N
+ EY CH AO s n/a 14 1910 1976 2015 N
+ EY CH AW b n/a 14 1910 1976 2012 N
+ EY CH AW e n/a 14 1928 1976 2012 N
+ EY CH AW s n/a 14 1910 1976 2012 N
+ EY CH AY b n/a 14 1910 1971 2015 N
+ EY CH AY e n/a 14 1928 1971 2015 N
+ EY CH AY s n/a 14 1910 1971 2015 N
+ EY CH B b n/a 14 1910 1964 1994 N
+ EY CH B e n/a 14 1928 1964 1996 N
+ EY CH B i n/a 14 1904 1964 1994 N
+ EY CH B s n/a 14 1910 1964 1994 N
+ EY CH CH b n/a 14 1910 1958 1989 N
+ EY CH CH e n/a 14 1928 1957 1988 N
+ EY CH CH s n/a 14 1910 1957 1988 N
+ EY CH D b n/a 14 1906 1962 1991 N
+ EY CH D e n/a 14 1928 1961 1990 N
+ EY CH D i n/a 14 1906 1962 1992 N
+ EY CH D s n/a 14 1906 1961 1992 N
+ EY CH DH b n/a 14 1910 1962 1998 N
+ EY CH DH e n/a 14 1928 1961 1998 N
+ EY CH DH s n/a 14 1910 1961 1998 N
+ EY CH EH b n/a 14 1910 1971 2011 N
+ EY CH EH e n/a 14 1928 1971 2011 N
+ EY CH EH s n/a 14 1910 1971 2011 N
+ EY CH ER b n/a 14 1910 1976 2016 N
+ EY CH ER e n/a 14 1928 1976 2016 N
+ EY CH ER s n/a 14 1910 1976 2016 N
+ EY CH EY e n/a 14 1928 1971 2011 N
+ EY CH EY s n/a 14 1910 1971 2011 N
+ EY CH F b n/a 14 1910 1958 2001 N
+ EY CH F e n/a 14 1928 1957 2001 N
+ EY CH F i n/a 14 1904 1957 2001 N
+ EY CH F s n/a 14 1910 1957 2001 N
+ EY CH G b n/a 14 1910 1952 1993 N
+ EY CH G e n/a 14 1928 1952 1993 N
+ EY CH G s n/a 14 1910 1952 1993 N
+ EY CH HH b n/a 14 1910 1958 2004 N
+ EY CH HH e n/a 14 1928 1957 2004 N
+ EY CH HH s n/a 14 1910 1957 2004 N
+ EY CH IH e n/a 14 1928 1971 2011 N
+ EY CH IH i n/a 14 1904 1970 2010 N
+ EY CH IH s n/a 14 1910 1971 2011 N
+ EY CH IY b n/a 14 1910 1971 2011 N
+ EY CH IY e n/a 14 1928 1971 2011 N
+ EY CH IY s n/a 14 1910 1971 2011 N
+ EY CH JH b n/a 14 1910 1962 1991 N
+ EY CH JH e n/a 14 1928 1961 1991 N
+ EY CH JH s n/a 14 1910 1961 1991 N
+ EY CH K b n/a 14 1910 1952 1993 N
+ EY CH K e n/a 14 1928 1952 1993 N
+ EY CH K i n/a 14 1904 1952 1993 N
+ EY CH K s n/a 14 1910 1952 1993 N
+ EY CH L b n/a 14 1910 1976 2013 N
+ EY CH L e n/a 14 1928 1976 2013 N
+ EY CH L i n/a 14 1905 1974 2017 N
+ EY CH L s n/a 14 1910 1976 2013 N
+ EY CH M b n/a 14 1910 1982 2007 N
+ EY CH M e n/a 14 1928 1982 2009 N
+ EY CH M i n/a 14 1911 1982 2007 N
+ EY CH M s n/a 14 1910 1982 2009 N
+ EY CH N b n/a 14 1910 1982 2005 N
+ EY CH N e n/a 14 1928 1982 2006 N
+ EY CH N i n/a 14 1911 1982 2005 N
+ EY CH N s n/a 14 1910 1982 2006 N
+ EY CH NG b n/a 14 1910 1982 2005 N
+ EY CH NG e n/a 14 1928 1982 2006 N
+ EY CH NG i n/a 14 1911 1982 2005 N
+ EY CH NG s n/a 14 1910 1982 2006 N
+ EY CH OW b n/a 14 1910 1976 2015 N
+ EY CH OW e n/a 14 1928 1976 2015 N
+ EY CH OW s n/a 14 1910 1976 2015 N
+ EY CH OY e n/a 14 1928 1971 2015 N
+ EY CH OY s n/a 14 1910 1971 2015 N
+ EY CH P b n/a 14 1910 1959 1996 N
+ EY CH P e n/a 14 1928 1959 1996 N
+ EY CH P s n/a 14 1910 1959 1996 N
+ EY CH R b n/a 14 1910 1976 2013 N
+ EY CH R e n/a 14 1928 1976 2013 N
+ EY CH R s n/a 14 1910 1976 2013 N
+ EY CH S b n/a 14 1906 1958 1999 N
+ EY CH S e n/a 14 1928 1957 1999 N
+ EY CH S i n/a 14 1904 1957 1999 N
+ EY CH S s n/a 14 1904 1957 1999 N
+ EY CH SH b n/a 14 1910 1960 2002 N
+ EY CH SH e n/a 14 1928 1960 2002 N
+ EY CH SH s n/a 14 1910 1960 2002 N
+ EY CH SIL e n/a 14 1928 1968 1997 N
+ EY CH SIL s n/a 14 1910 1972 1997 N
+ EY CH T b n/a 14 1906 1958 1989 N
+ EY CH T e n/a 14 1928 1957 1990 N
+ EY CH T i n/a 14 1906 1957 1990 N
+ EY CH T s n/a 14 1906 1957 1990 N
+ EY CH TH b n/a 14 1910 1958 2001 N
+ EY CH TH e n/a 14 1928 1957 2001 N
+ EY CH TH s n/a 14 1910 1957 2001 N
+ EY CH UH e n/a 14 1928 1976 2016 N
+ EY CH UH s n/a 14 1910 1976 2016 N
+ EY CH UW e n/a 14 1928 1976 2015 N
+ EY CH UW s n/a 14 1910 1976 2015 N
+ EY CH V b n/a 14 1910 1964 1995 N
+ EY CH V e n/a 14 1928 1964 1995 N
+ EY CH V i n/a 14 1904 1964 1995 N
+ EY CH V s n/a 14 1910 1964 1995 N
+ EY CH W b n/a 14 1910 1976 2013 N
+ EY CH W e n/a 14 1928 1976 2013 N
+ EY CH W s n/a 14 1910 1976 2013 N
+ EY CH Y e n/a 14 1928 1972 2004 N
+ EY CH Y i n/a 14 1905 1970 2004 N
+ EY CH Y s n/a 14 1910 1972 2004 N
+ EY CH Z b n/a 14 1906 1962 2003 N
+ EY CH Z e n/a 14 1928 1961 2003 N
+ EY CH Z i n/a 14 1906 1962 2003 N
+ EY CH Z s n/a 14 1906 1962 2003 N
+ EY CH ZH b n/a 14 1910 1962 2003 N
+ EY CH ZH e n/a 14 1928 1961 2003 N
+ EY CH ZH s n/a 14 1910 1961 2003 N
+ EY D AA e n/a 14 1928 1976 2015 N
+ EY D AA i n/a 14 1927 1976 2015 N
+ EY D AA s n/a 14 1926 1976 2015 N
+ EY D AE e n/a 14 1928 1971 2011 N
+ EY D AE s n/a 14 1926 1971 2011 N
+ EY D AH b n/a 14 1926 1971 2012 N
+ EY D AH e n/a 14 1928 1971 2012 N
+ EY D AH i n/a 14 1927 1971 2012 N
+ EY D AH s n/a 14 1926 1971 2012 N
+ EY D AO b n/a 14 1926 1976 2015 N
+ EY D AO e n/a 14 1928 1976 2015 N
+ EY D AO s n/a 14 1926 1976 2015 N
+ EY D AW b n/a 14 1926 1976 2012 N
+ EY D AW e n/a 14 1928 1976 2012 N
+ EY D AW s n/a 14 1926 1976 2012 N
+ EY D AY b n/a 14 1926 1971 2015 N
+ EY D AY e n/a 14 1928 1971 2015 N
+ EY D AY s n/a 14 1926 1971 2015 N
+ EY D B b n/a 14 1926 1964 1994 N
+ EY D B e n/a 14 1928 1964 1996 N
+ EY D B i n/a 14 1927 1964 1994 N
+ EY D B s n/a 14 1926 1964 1994 N
+ EY D CH b n/a 14 1926 1955 1989 N
+ EY D CH e n/a 14 1928 1956 1988 N
+ EY D CH i n/a 14 1927 1956 1988 N
+ EY D CH s n/a 14 1926 1955 1988 N
+ EY D D b n/a 14 1926 1962 1991 N
+ EY D D e n/a 14 1928 1961 1990 N
+ EY D D i n/a 14 1927 1962 1992 N
+ EY D D s n/a 14 1926 1961 1992 N
+ EY D DH b n/a 14 1926 1962 1998 N
+ EY D DH e n/a 14 1928 1961 1998 N
+ EY D DH i n/a 14 1927 1962 1998 N
+ EY D DH s n/a 14 1926 1961 1998 N
+ EY D EH b n/a 14 1926 1971 2011 N
+ EY D EH e n/a 14 1928 1971 2011 N
+ EY D EH s n/a 14 1926 1971 2011 N
+ EY D ER b n/a 14 1926 1976 2016 N
+ EY D ER e n/a 14 1928 1976 2016 N
+ EY D ER i n/a 14 1927 1976 2016 N
+ EY D ER s n/a 14 1926 1976 2016 N
+ EY D EY e n/a 14 1928 1971 2011 N
+ EY D EY s n/a 14 1926 1971 2011 N
+ EY D F b n/a 14 1926 1955 2001 N
+ EY D F e n/a 14 1928 1956 2001 N
+ EY D F i n/a 14 1927 1956 2001 N
+ EY D F s n/a 14 1926 1955 2001 N
+ EY D G b n/a 14 1926 1952 1993 N
+ EY D G e n/a 14 1928 1952 1993 N
+ EY D G i n/a 14 1927 1952 1993 N
+ EY D G s n/a 14 1926 1952 1993 N
+ EY D HH b n/a 14 1926 1955 2004 N
+ EY D HH e n/a 14 1928 1956 2004 N
+ EY D HH i n/a 14 1927 1956 2004 N
+ EY D HH s n/a 14 1926 1955 2004 N
+ EY D IH e n/a 14 1928 1971 2011 N
+ EY D IH i n/a 14 1927 1970 2010 N
+ EY D IH s n/a 14 1926 1971 2011 N
+ EY D IY b n/a 14 1926 1971 2011 N
+ EY D IY e n/a 14 1928 1971 2011 N
+ EY D IY s n/a 14 1926 1971 2011 N
+ EY D JH b n/a 14 1926 1962 1991 N
+ EY D JH e n/a 14 1928 1961 1991 N
+ EY D JH i n/a 14 1927 1962 1991 N
+ EY D JH s n/a 14 1926 1961 1991 N
+ EY D K b n/a 14 1926 1952 1993 N
+ EY D K e n/a 14 1928 1952 1993 N
+ EY D K i n/a 14 1927 1952 1993 N
+ EY D K s n/a 14 1926 1952 1993 N
+ EY D L b n/a 14 1926 1976 2013 N
+ EY D L e n/a 14 1928 1976 2013 N
+ EY D L i n/a 14 1927 1976 2017 N
+ EY D L s n/a 14 1926 1976 2013 N
+ EY D M b n/a 14 1926 1981 2007 N
+ EY D M e n/a 14 1928 1981 2009 N
+ EY D M i n/a 14 1927 1981 2007 N
+ EY D M s n/a 14 1926 1981 2009 N
+ EY D N b n/a 14 1926 1981 2005 N
+ EY D N e n/a 14 1928 1981 2006 N
+ EY D N i n/a 14 1927 1981 2005 N
+ EY D N s n/a 14 1926 1981 2006 N
+ EY D NG b n/a 14 1926 1981 2005 N
+ EY D NG e n/a 14 1928 1981 2006 N
+ EY D NG i n/a 14 1927 1981 2005 N
+ EY D NG s n/a 14 1926 1981 2006 N
+ EY D OW b n/a 14 1926 1976 2015 N
+ EY D OW e n/a 14 1928 1976 2015 N
+ EY D OW i n/a 14 1927 1976 2015 N
+ EY D OW s n/a 14 1926 1976 2015 N
+ EY D OY e n/a 14 1928 1971 2015 N
+ EY D OY s n/a 14 1926 1971 2015 N
+ EY D P b n/a 14 1926 1955 1996 N
+ EY D P e n/a 14 1928 1956 1996 N
+ EY D P i n/a 14 1927 1956 1996 N
+ EY D P s n/a 14 1926 1955 1996 N
+ EY D R b n/a 14 1926 1976 2013 N
+ EY D R e n/a 14 1928 1976 2013 N
+ EY D R i n/a 14 1927 1976 2016 N
+ EY D R s n/a 14 1926 1976 2013 N
+ EY D S b n/a 14 1926 1955 2000 N
+ EY D S e n/a 14 1928 1956 2000 N
+ EY D S i n/a 14 1928 1956 2000 N
+ EY D S s n/a 14 1926 1955 2000 N
+ EY D SH b n/a 14 1926 1955 2002 N
+ EY D SH e n/a 14 1928 1956 2002 N
+ EY D SH i n/a 14 1927 1956 2002 N
+ EY D SH s n/a 14 1926 1955 2002 N
+ EY D SIL e n/a 14 1929 1968 1997 N
+ EY D SIL s n/a 14 1926 1972 1997 N
+ EY D T b n/a 14 1926 1955 1989 N
+ EY D T e n/a 14 1928 1956 1990 N
+ EY D T i n/a 14 1927 1956 1990 N
+ EY D T s n/a 14 1926 1955 1990 N
+ EY D TH b n/a 14 1926 1955 2001 N
+ EY D TH e n/a 14 1928 1956 2001 N
+ EY D TH s n/a 14 1926 1955 2001 N
+ EY D UH e n/a 14 1928 1976 2016 N
+ EY D UH s n/a 14 1926 1976 2016 N
+ EY D UW e n/a 14 1928 1976 2015 N
+ EY D UW s n/a 14 1926 1976 2015 N
+ EY D V b n/a 14 1926 1964 1995 N
+ EY D V e n/a 14 1928 1964 1995 N
+ EY D V i n/a 14 1927 1964 1995 N
+ EY D V s n/a 14 1926 1964 1995 N
+ EY D W b n/a 14 1926 1976 2013 N
+ EY D W e n/a 14 1928 1976 2013 N
+ EY D W i n/a 14 1927 1976 2017 N
+ EY D W s n/a 14 1926 1976 2013 N
+ EY D Y e n/a 14 1928 1972 2004 N
+ EY D Y i n/a 14 1927 1970 2004 N
+ EY D Y s n/a 14 1926 1972 2004 N
+ EY D Z b n/a 14 1926 1962 2003 N
+ EY D Z e n/a 14 1928 1961 2003 N
+ EY D Z i n/a 14 1928 1962 2003 N
+ EY D Z s n/a 14 1926 1962 2003 N
+ EY D ZH b n/a 14 1926 1962 2003 N
+ EY D ZH e n/a 14 1928 1961 2003 N
+ EY D ZH i n/a 14 1927 1962 2003 N
+ EY D ZH s n/a 14 1926 1961 2003 N
+ EY DH AA e n/a 14 1920 1976 2015 N
+ EY DH AA s n/a 14 1920 1976 2015 N
+ EY DH AE e n/a 14 1920 1971 2011 N
+ EY DH AE s n/a 14 1920 1971 2011 N
+ EY DH AH b n/a 14 1920 1971 2012 N
+ EY DH AH e n/a 14 1920 1971 2012 N
+ EY DH AH s n/a 14 1920 1971 2012 N
+ EY DH AO b n/a 14 1920 1976 2015 N
+ EY DH AO e n/a 14 1920 1976 2015 N
+ EY DH AO s n/a 14 1920 1976 2015 N
+ EY DH AW b n/a 14 1920 1976 2012 N
+ EY DH AW e n/a 14 1920 1976 2012 N
+ EY DH AW s n/a 14 1920 1976 2012 N
+ EY DH AY b n/a 14 1920 1971 2015 N
+ EY DH AY e n/a 14 1920 1971 2015 N
+ EY DH AY s n/a 14 1920 1971 2015 N
+ EY DH B b n/a 14 1919 1964 1994 N
+ EY DH B e n/a 14 1919 1964 1996 N
+ EY DH B s n/a 14 1919 1964 1994 N
+ EY DH CH b n/a 14 1919 1950 1989 N
+ EY DH CH e n/a 14 1919 1950 1988 N
+ EY DH CH s n/a 14 1919 1950 1988 N
+ EY DH D b n/a 14 1919 1958 1991 N
+ EY DH D e n/a 14 1919 1957 1988 N
+ EY DH D i n/a 14 1919 1957 1992 N
+ EY DH D s n/a 14 1919 1957 1992 N
+ EY DH DH b n/a 14 1919 1955 1998 N
+ EY DH DH e n/a 14 1919 1956 1998 N
+ EY DH DH s n/a 14 1919 1955 1998 N
+ EY DH EH b n/a 14 1920 1971 2011 N
+ EY DH EH e n/a 14 1920 1971 2011 N
+ EY DH EH s n/a 14 1920 1971 2011 N
+ EY DH ER b n/a 14 1920 1976 2016 N
+ EY DH ER e n/a 14 1920 1976 2016 N
+ EY DH ER s n/a 14 1920 1976 2016 N
+ EY DH EY e n/a 14 1920 1971 2011 N
+ EY DH EY s n/a 14 1920 1971 2011 N
+ EY DH F b n/a 14 1919 1950 2001 N
+ EY DH F e n/a 14 1919 1950 2001 N
+ EY DH F s n/a 14 1919 1950 2001 N
+ EY DH G b n/a 14 1919 1953 1993 N
+ EY DH G e n/a 14 1919 1953 1993 N
+ EY DH G s n/a 14 1919 1953 1993 N
+ EY DH HH b n/a 14 1920 1946 2004 N
+ EY DH HH e n/a 14 1920 1946 2004 N
+ EY DH HH s n/a 14 1920 1946 2004 N
+ EY DH IH e n/a 14 1920 1971 2011 N
+ EY DH IH s n/a 14 1920 1971 2011 N
+ EY DH IY b n/a 14 1920 1971 2011 N
+ EY DH IY e n/a 14 1920 1971 2011 N
+ EY DH IY s n/a 14 1920 1971 2011 N
+ EY DH JH b n/a 14 1919 1955 1991 N
+ EY DH JH e n/a 14 1919 1956 1991 N
+ EY DH JH s n/a 14 1919 1955 1991 N
+ EY DH K b n/a 14 1919 1953 1993 N
+ EY DH K e n/a 14 1919 1953 1993 N
+ EY DH K s n/a 14 1919 1953 1993 N
+ EY DH L b n/a 14 1920 1973 2013 N
+ EY DH L e n/a 14 1920 1973 2013 N
+ EY DH L i n/a 14 1920 1973 2017 N
+ EY DH L s n/a 14 1920 1973 2013 N
+ EY DH M b n/a 14 1919 1978 2007 N
+ EY DH M e n/a 14 1919 1978 2009 N
+ EY DH M s n/a 14 1919 1978 2009 N
+ EY DH N b n/a 14 1919 1978 2005 N
+ EY DH N e n/a 14 1919 1978 2006 N
+ EY DH N s n/a 14 1919 1978 2006 N
+ EY DH NG b n/a 14 1919 1978 2005 N
+ EY DH NG e n/a 14 1919 1978 2006 N
+ EY DH NG s n/a 14 1919 1978 2006 N
+ EY DH OW b n/a 14 1920 1976 2015 N
+ EY DH OW e n/a 14 1920 1976 2015 N
+ EY DH OW s n/a 14 1920 1976 2015 N
+ EY DH OY e n/a 14 1920 1971 2015 N
+ EY DH OY s n/a 14 1920 1971 2015 N
+ EY DH P b n/a 14 1919 1950 1996 N
+ EY DH P e n/a 14 1919 1950 1996 N
+ EY DH P s n/a 14 1919 1950 1996 N
+ EY DH R b n/a 14 1920 1973 2014 N
+ EY DH R e n/a 14 1920 1973 2014 N
+ EY DH R s n/a 14 1920 1973 2014 N
+ EY DH S b n/a 14 1919 1950 2000 N
+ EY DH S e n/a 14 1919 1950 2000 N
+ EY DH S s n/a 14 1919 1950 2000 N
+ EY DH SH b n/a 14 1919 1950 2002 N
+ EY DH SH e n/a 14 1919 1950 2002 N
+ EY DH SH s n/a 14 1919 1950 2002 N
+ EY DH SIL e n/a 14 1920 1972 1998 N
+ EY DH SIL s n/a 14 1920 1972 1998 N
+ EY DH T b n/a 14 1919 1950 1989 N
+ EY DH T e n/a 14 1919 1950 1988 N
+ EY DH T s n/a 14 1919 1950 1988 N
+ EY DH TH b n/a 14 1919 1950 2001 N
+ EY DH TH e n/a 14 1919 1950 2001 N
+ EY DH TH s n/a 14 1919 1950 2001 N
+ EY DH UH e n/a 14 1920 1976 2016 N
+ EY DH UH s n/a 14 1920 1976 2016 N
+ EY DH UW e n/a 14 1920 1976 2015 N
+ EY DH UW s n/a 14 1920 1976 2015 N
+ EY DH V b n/a 14 1919 1964 1995 N
+ EY DH V e n/a 14 1919 1964 1995 N
+ EY DH V i n/a 14 1919 1964 1995 N
+ EY DH V s n/a 14 1919 1964 1995 N
+ EY DH W b n/a 14 1920 1973 2014 N
+ EY DH W e n/a 14 1920 1973 2014 N
+ EY DH W s n/a 14 1920 1973 2014 N
+ EY DH Y e n/a 14 1919 1972 2004 N
+ EY DH Y s n/a 14 1919 1972 2004 N
+ EY DH Z b n/a 14 1919 1955 2003 N
+ EY DH Z e n/a 14 1919 1956 2003 N
+ EY DH Z i n/a 14 1919 1956 2003 N
+ EY DH Z s n/a 14 1919 1955 2003 N
+ EY DH ZH b n/a 14 1919 1955 2003 N
+ EY DH ZH e n/a 14 1919 1956 2003 N
+ EY DH ZH s n/a 14 1919 1955 2003 N
+ EY EH AA e n/a 14 1928 1976 2015 N
+ EY EH AA s n/a 14 1926 1976 2015 N
+ EY EH AE e n/a 14 1928 1971 2011 N
+ EY EH AE s n/a 14 1926 1971 2011 N
+ EY EH AH b n/a 14 1926 1971 2012 N
+ EY EH AH e n/a 14 1928 1971 2012 N
+ EY EH AH i n/a 14 1923 1971 2012 N
+ EY EH AH s n/a 14 1926 1971 2012 N
+ EY EH AO b n/a 14 1926 1976 2015 N
+ EY EH AO e n/a 14 1928 1976 2015 N
+ EY EH AO s n/a 14 1926 1976 2015 N
+ EY EH AW b n/a 14 1926 1976 2012 N
+ EY EH AW e n/a 14 1928 1976 2012 N
+ EY EH AW s n/a 14 1926 1976 2012 N
+ EY EH AY b n/a 14 1926 1971 2015 N
+ EY EH AY e n/a 14 1928 1971 2015 N
+ EY EH AY s n/a 14 1926 1971 2015 N
+ EY EH B b n/a 14 1926 1964 1994 N
+ EY EH B e n/a 14 1928 1964 1996 N
+ EY EH B s n/a 14 1926 1964 1994 N
+ EY EH CH b n/a 14 1926 1955 1989 N
+ EY EH CH e n/a 14 1928 1955 1988 N
+ EY EH CH s n/a 14 1926 1956 1988 N
+ EY EH D b n/a 14 1926 1962 1991 N
+ EY EH D e n/a 14 1928 1961 1990 N
+ EY EH D s n/a 14 1926 1961 1992 N
+ EY EH DH b n/a 14 1926 1962 1998 N
+ EY EH DH e n/a 14 1928 1961 1998 N
+ EY EH DH s n/a 14 1926 1961 1998 N
+ EY EH EH b n/a 14 1926 1971 2011 N
+ EY EH EH e n/a 14 1928 1971 2011 N
+ EY EH EH s n/a 14 1926 1971 2011 N
+ EY EH ER b n/a 14 1926 1976 2016 N
+ EY EH ER e n/a 14 1928 1976 2016 N
+ EY EH ER s n/a 14 1926 1976 2016 N
+ EY EH EY e n/a 14 1928 1971 2011 N
+ EY EH EY s n/a 14 1926 1971 2011 N
+ EY EH F b n/a 14 1926 1955 2001 N
+ EY EH F e n/a 14 1928 1955 2001 N
+ EY EH F s n/a 14 1926 1956 2001 N
+ EY EH G b n/a 14 1926 1952 1993 N
+ EY EH G e n/a 14 1928 1952 1993 N
+ EY EH G s n/a 14 1926 1952 1993 N
+ EY EH HH b n/a 14 1926 1955 2004 N
+ EY EH HH e n/a 14 1928 1955 2004 N
+ EY EH HH s n/a 14 1926 1956 2004 N
+ EY EH IH e n/a 14 1928 1971 2011 N
+ EY EH IH s n/a 14 1926 1971 2011 N
+ EY EH IY b n/a 14 1926 1971 2011 N
+ EY EH IY e n/a 14 1928 1971 2011 N
+ EY EH IY s n/a 14 1926 1971 2011 N
+ EY EH JH b n/a 14 1926 1962 1991 N
+ EY EH JH e n/a 14 1928 1961 1991 N
+ EY EH JH s n/a 14 1926 1961 1991 N
+ EY EH K b n/a 14 1926 1952 1993 N
+ EY EH K e n/a 14 1928 1952 1993 N
+ EY EH K s n/a 14 1926 1952 1993 N
+ EY EH L b n/a 14 1926 1976 2013 N
+ EY EH L e n/a 14 1928 1976 2013 N
+ EY EH L s n/a 14 1926 1976 2013 N
+ EY EH M b n/a 14 1926 1981 2007 N
+ EY EH M e n/a 14 1928 1981 2009 N
+ EY EH M s n/a 14 1926 1981 2009 N
+ EY EH N b n/a 14 1926 1981 2005 N
+ EY EH N e n/a 14 1928 1981 2006 N
+ EY EH N s n/a 14 1926 1981 2006 N
+ EY EH NG b n/a 14 1926 1981 2005 N
+ EY EH NG e n/a 14 1928 1981 2006 N
+ EY EH NG s n/a 14 1926 1981 2006 N
+ EY EH OW b n/a 14 1926 1976 2015 N
+ EY EH OW e n/a 14 1928 1976 2015 N
+ EY EH OW s n/a 14 1926 1976 2015 N
+ EY EH OY e n/a 14 1928 1971 2015 N
+ EY EH OY s n/a 14 1926 1971 2015 N
+ EY EH P b n/a 14 1926 1955 1996 N
+ EY EH P e n/a 14 1928 1955 1996 N
+ EY EH P s n/a 14 1926 1956 1996 N
+ EY EH R b n/a 14 1926 1976 2013 N
+ EY EH R e n/a 14 1928 1976 2013 N
+ EY EH R s n/a 14 1926 1976 2013 N
+ EY EH S b n/a 14 1926 1955 2000 N
+ EY EH S e n/a 14 1928 1955 2000 N
+ EY EH S i n/a 14 1922 1955 2000 N
+ EY EH S s n/a 14 1926 1956 2000 N
+ EY EH SH b n/a 14 1926 1955 2002 N
+ EY EH SH e n/a 14 1928 1955 2002 N
+ EY EH SH s n/a 14 1926 1956 2002 N
+ EY EH SIL e n/a 14 1928 1968 1997 N
+ EY EH SIL s n/a 14 1926 1972 1997 N
+ EY EH T b n/a 14 1926 1955 1989 N
+ EY EH T e n/a 14 1928 1955 1990 N
+ EY EH T s n/a 14 1926 1956 1990 N
+ EY EH TH b n/a 14 1926 1955 2001 N
+ EY EH TH e n/a 14 1928 1955 2001 N
+ EY EH TH s n/a 14 1926 1956 2001 N
+ EY EH UH e n/a 14 1928 1976 2016 N
+ EY EH UH s n/a 14 1926 1976 2016 N
+ EY EH UW e n/a 14 1928 1976 2015 N
+ EY EH UW s n/a 14 1926 1976 2015 N
+ EY EH V b n/a 14 1926 1964 1995 N
+ EY EH V e n/a 14 1928 1964 1995 N
+ EY EH V i n/a 14 1923 1964 1995 N
+ EY EH V s n/a 14 1926 1964 1995 N
+ EY EH W b n/a 14 1926 1976 2013 N
+ EY EH W e n/a 14 1928 1976 2013 N
+ EY EH W s n/a 14 1926 1976 2013 N
+ EY EH Y e n/a 14 1928 1972 2004 N
+ EY EH Y s n/a 14 1926 1972 2004 N
+ EY EH Z b n/a 14 1926 1962 2003 N
+ EY EH Z e n/a 14 1928 1961 2003 N
+ EY EH Z s n/a 14 1926 1962 2003 N
+ EY EH ZH b n/a 14 1926 1962 2003 N
+ EY EH ZH e n/a 14 1928 1961 2003 N
+ EY EH ZH s n/a 14 1926 1961 2003 N
+ EY ER AA e n/a 14 1938 1976 2015 N
+ EY ER AA s n/a 14 1939 1976 2015 N
+ EY ER AE e n/a 14 1938 1971 2011 N
+ EY ER AE s n/a 14 1939 1971 2011 N
+ EY ER AH b n/a 14 1939 1971 2012 N
+ EY ER AH e n/a 14 1938 1971 2012 N
+ EY ER AH s n/a 14 1939 1971 2012 N
+ EY ER AO b n/a 14 1939 1976 2015 N
+ EY ER AO e n/a 14 1938 1976 2015 N
+ EY ER AO s n/a 14 1939 1976 2015 N
+ EY ER AW b n/a 14 1939 1976 2012 N
+ EY ER AW e n/a 14 1938 1976 2012 N
+ EY ER AW s n/a 14 1939 1976 2012 N
+ EY ER AY b n/a 14 1939 1971 2015 N
+ EY ER AY e n/a 14 1938 1971 2015 N
+ EY ER AY s n/a 14 1939 1971 2015 N
+ EY ER B b n/a 14 1939 1964 1994 N
+ EY ER B e n/a 14 1938 1964 1996 N
+ EY ER B i n/a 14 1935 1964 1994 N
+ EY ER B s n/a 14 1939 1964 1994 N
+ EY ER CH b n/a 14 1939 1947 1989 N
+ EY ER CH e n/a 14 1938 1947 1990 N
+ EY ER CH s n/a 14 1939 1947 1990 N
+ EY ER D b n/a 14 1939 1962 1991 N
+ EY ER D e n/a 14 1938 1961 1990 N
+ EY ER D i n/a 14 1935 1962 1992 N
+ EY ER D s n/a 14 1939 1961 1992 N
+ EY ER DH b n/a 14 1939 1962 1998 N
+ EY ER DH e n/a 14 1938 1961 1998 N
+ EY ER DH s n/a 14 1939 1961 1998 N
+ EY ER EH b n/a 14 1939 1971 2011 N
+ EY ER EH e n/a 14 1938 1971 2011 N
+ EY ER EH s n/a 14 1939 1971 2011 N
+ EY ER ER b n/a 14 1939 1976 2016 N
+ EY ER ER e n/a 14 1938 1976 2016 N
+ EY ER ER s n/a 14 1939 1976 2016 N
+ EY ER EY e n/a 14 1938 1971 2011 N
+ EY ER EY s n/a 14 1939 1971 2011 N
+ EY ER F b n/a 14 1939 1947 2001 N
+ EY ER F e n/a 14 1938 1947 2001 N
+ EY ER F i n/a 14 1936 1948 2001 N
+ EY ER F s n/a 14 1939 1947 2001 N
+ EY ER G b n/a 14 1939 1952 1993 N
+ EY ER G e n/a 14 1938 1952 1993 N
+ EY ER G i n/a 14 1936 1952 1993 N
+ EY ER G s n/a 14 1939 1952 1993 N
+ EY ER HH b n/a 14 1939 1947 2004 N
+ EY ER HH e n/a 14 1938 1947 2004 N
+ EY ER HH s n/a 14 1939 1947 2004 N
+ EY ER IH e n/a 14 1938 1971 2011 N
+ EY ER IH i n/a 14 1938 1970 2010 N
+ EY ER IH s n/a 14 1939 1971 2011 N
+ EY ER IY b n/a 14 1939 1971 2011 N
+ EY ER IY e n/a 14 1938 1971 2011 N
+ EY ER IY i n/a 14 1938 1970 2010 N
+ EY ER IY s n/a 14 1939 1971 2011 N
+ EY ER JH b n/a 14 1939 1962 1991 N
+ EY ER JH e n/a 14 1938 1961 1991 N
+ EY ER JH i n/a 14 1935 1962 1991 N
+ EY ER JH s n/a 14 1939 1961 1991 N
+ EY ER K b n/a 14 1939 1952 1993 N
+ EY ER K e n/a 14 1938 1952 1993 N
+ EY ER K i n/a 14 1936 1952 1993 N
+ EY ER K s n/a 14 1939 1952 1993 N
+ EY ER L b n/a 14 1939 1976 2013 N
+ EY ER L e n/a 14 1938 1976 2013 N
+ EY ER L i n/a 14 1938 1975 2017 N
+ EY ER L s n/a 14 1938 1976 2013 N
+ EY ER M b n/a 14 1939 1979 2007 N
+ EY ER M e n/a 14 1938 1979 2009 N
+ EY ER M i n/a 14 1937 1979 2007 N
+ EY ER M s n/a 14 1939 1979 2007 N
+ EY ER N b n/a 14 1939 1979 2005 N
+ EY ER N e n/a 14 1938 1979 2006 N
+ EY ER N i n/a 14 1937 1979 2005 N
+ EY ER N s n/a 14 1939 1979 2006 N
+ EY ER NG b n/a 14 1939 1979 2005 N
+ EY ER NG e n/a 14 1938 1979 2006 N
+ EY ER NG i n/a 14 1937 1979 2005 N
+ EY ER NG s n/a 14 1939 1979 2006 N
+ EY ER OW b n/a 14 1939 1976 2015 N
+ EY ER OW e n/a 14 1938 1976 2015 N
+ EY ER OW s n/a 14 1939 1976 2015 N
+ EY ER OY e n/a 14 1938 1971 2015 N
+ EY ER OY s n/a 14 1939 1971 2015 N
+ EY ER P b n/a 14 1939 1947 1996 N
+ EY ER P e n/a 14 1938 1947 1996 N
+ EY ER P s n/a 14 1939 1947 1996 N
+ EY ER R b n/a 14 1939 1976 2013 N
+ EY ER R e n/a 14 1938 1976 2013 N
+ EY ER R s n/a 14 1938 1976 2013 N
+ EY ER S b n/a 14 1939 1947 2000 N
+ EY ER S e n/a 14 1938 1947 2000 N
+ EY ER S i n/a 14 1936 1948 2000 N
+ EY ER S s n/a 14 1939 1947 2000 N
+ EY ER SH b n/a 14 1939 1948 2002 N
+ EY ER SH e n/a 14 1938 1948 2002 N
+ EY ER SH i n/a 14 1936 1948 2002 N
+ EY ER SH s n/a 14 1939 1948 2002 N
+ EY ER SIL e n/a 14 1938 1969 1997 N
+ EY ER SIL s n/a 14 1939 1972 1997 N
+ EY ER T b n/a 14 1939 1947 1989 N
+ EY ER T e n/a 14 1938 1947 1990 N
+ EY ER T i n/a 14 1936 1948 1990 N
+ EY ER T s n/a 14 1939 1947 1990 N
+ EY ER TH b n/a 14 1939 1947 2001 N
+ EY ER TH e n/a 14 1938 1947 2001 N
+ EY ER TH s n/a 14 1939 1947 2001 N
+ EY ER UH e n/a 14 1938 1976 2016 N
+ EY ER UH s n/a 14 1939 1976 2016 N
+ EY ER UW e n/a 14 1938 1976 2015 N
+ EY ER UW s n/a 14 1939 1976 2015 N
+ EY ER V b n/a 14 1939 1964 1995 N
+ EY ER V e n/a 14 1938 1964 1995 N
+ EY ER V i n/a 14 1935 1964 1995 N
+ EY ER V s n/a 14 1939 1964 1995 N
+ EY ER W b n/a 14 1939 1976 2013 N
+ EY ER W e n/a 14 1938 1976 2013 N
+ EY ER W s n/a 14 1939 1976 2013 N
+ EY ER Y e n/a 14 1938 1972 2004 N
+ EY ER Y s n/a 14 1939 1972 2004 N
+ EY ER Z b n/a 14 1939 1962 2003 N
+ EY ER Z e n/a 14 1938 1961 2003 N
+ EY ER Z i n/a 14 1935 1962 2003 N
+ EY ER Z s n/a 14 1939 1962 2003 N
+ EY ER ZH b n/a 14 1939 1962 2003 N
+ EY ER ZH e n/a 14 1938 1961 2003 N
+ EY ER ZH s n/a 14 1939 1961 2003 N
+ EY EY AA e n/a 14 1924 1976 2015 N
+ EY EY AA i n/a 14 1925 1974 2015 N
+ EY EY AA s n/a 14 1924 1976 2015 N
+ EY EY AE e n/a 14 1924 1971 2011 N
+ EY EY AE s n/a 14 1924 1971 2011 N
+ EY EY AH b n/a 14 1924 1971 2012 N
+ EY EY AH e n/a 14 1924 1971 2012 N
+ EY EY AH s n/a 14 1924 1971 2012 N
+ EY EY AO b n/a 14 1924 1976 2015 N
+ EY EY AO e n/a 14 1924 1976 2015 N
+ EY EY AO s n/a 14 1924 1976 2015 N
+ EY EY AW b n/a 14 1924 1976 2012 N
+ EY EY AW e n/a 14 1924 1976 2012 N
+ EY EY AW s n/a 14 1924 1976 2012 N
+ EY EY AY b n/a 14 1924 1971 2015 N
+ EY EY AY e n/a 14 1924 1971 2015 N
+ EY EY AY s n/a 14 1924 1971 2015 N
+ EY EY B b n/a 14 1924 1964 1994 N
+ EY EY B e n/a 14 1924 1964 1996 N
+ EY EY B s n/a 14 1924 1964 1994 N
+ EY EY CH b n/a 14 1924 1955 1989 N
+ EY EY CH e n/a 14 1924 1955 1988 N
+ EY EY CH s n/a 14 1924 1956 1988 N
+ EY EY D b n/a 14 1924 1962 1991 N
+ EY EY D e n/a 14 1924 1961 1990 N
+ EY EY D i n/a 14 1925 1962 1992 N
+ EY EY D s n/a 14 1924 1961 1992 N
+ EY EY DH b n/a 14 1924 1962 1998 N
+ EY EY DH e n/a 14 1924 1961 1998 N
+ EY EY DH s n/a 14 1924 1961 1998 N
+ EY EY EH b n/a 14 1924 1971 2011 N
+ EY EY EH e n/a 14 1924 1971 2011 N
+ EY EY EH i n/a 14 1925 1971 2011 N
+ EY EY EH s n/a 14 1924 1971 2011 N
+ EY EY ER b n/a 14 1924 1976 2016 N
+ EY EY ER e n/a 14 1924 1976 2016 N
+ EY EY ER s n/a 14 1924 1976 2016 N
+ EY EY EY e n/a 14 1924 1971 2011 N
+ EY EY EY s n/a 14 1924 1971 2011 N
+ EY EY F b n/a 14 1924 1955 2001 N
+ EY EY F e n/a 14 1924 1955 2001 N
+ EY EY F s n/a 14 1924 1956 2001 N
+ EY EY G b n/a 14 1924 1952 1993 N
+ EY EY G e n/a 14 1924 1952 1993 N
+ EY EY G s n/a 14 1924 1952 1993 N
+ EY EY HH b n/a 14 1924 1955 2004 N
+ EY EY HH e n/a 14 1924 1955 2004 N
+ EY EY HH s n/a 14 1924 1956 2004 N
+ EY EY IH e n/a 14 1924 1971 2011 N
+ EY EY IH s n/a 14 1924 1971 2011 N
+ EY EY IY b n/a 14 1924 1971 2011 N
+ EY EY IY e n/a 14 1924 1971 2011 N
+ EY EY IY s n/a 14 1924 1971 2011 N
+ EY EY JH b n/a 14 1924 1962 1991 N
+ EY EY JH e n/a 14 1924 1961 1991 N
+ EY EY JH s n/a 14 1924 1961 1991 N
+ EY EY K b n/a 14 1924 1952 1993 N
+ EY EY K e n/a 14 1924 1952 1993 N
+ EY EY K s n/a 14 1924 1952 1993 N
+ EY EY L b n/a 14 1924 1976 2013 N
+ EY EY L e n/a 14 1924 1976 2013 N
+ EY EY L s n/a 14 1924 1976 2013 N
+ EY EY M b n/a 14 1924 1981 2007 N
+ EY EY M e n/a 14 1924 1981 2009 N
+ EY EY M s n/a 14 1924 1981 2009 N
+ EY EY N b n/a 14 1924 1981 2005 N
+ EY EY N e n/a 14 1924 1981 2006 N
+ EY EY N s n/a 14 1924 1981 2006 N
+ EY EY NG b n/a 14 1924 1981 2005 N
+ EY EY NG e n/a 14 1924 1981 2006 N
+ EY EY NG i n/a 14 1925 1981 2005 N
+ EY EY NG s n/a 14 1924 1981 2006 N
+ EY EY OW b n/a 14 1924 1976 2015 N
+ EY EY OW e n/a 14 1924 1976 2015 N
+ EY EY OW s n/a 14 1924 1976 2015 N
+ EY EY OY e n/a 14 1924 1971 2015 N
+ EY EY OY s n/a 14 1924 1971 2015 N
+ EY EY P b n/a 14 1924 1955 1996 N
+ EY EY P e n/a 14 1924 1955 1996 N
+ EY EY P s n/a 14 1924 1956 1996 N
+ EY EY R b n/a 14 1924 1976 2013 N
+ EY EY R e n/a 14 1924 1976 2013 N
+ EY EY R s n/a 14 1924 1976 2013 N
+ EY EY S b n/a 14 1924 1955 2000 N
+ EY EY S e n/a 14 1924 1955 2000 N
+ EY EY S s n/a 14 1924 1956 2000 N
+ EY EY SH b n/a 14 1924 1955 2002 N
+ EY EY SH e n/a 14 1924 1955 2002 N
+ EY EY SH s n/a 14 1924 1956 2002 N
+ EY EY SIL e n/a 14 1924 1968 1997 N
+ EY EY SIL s n/a 14 1924 1972 1997 N
+ EY EY T b n/a 14 1924 1955 1989 N
+ EY EY T e n/a 14 1924 1955 1990 N
+ EY EY T s n/a 14 1924 1956 1990 N
+ EY EY TH b n/a 14 1924 1955 2001 N
+ EY EY TH e n/a 14 1924 1955 2001 N
+ EY EY TH s n/a 14 1924 1956 2001 N
+ EY EY UH e n/a 14 1924 1976 2016 N
+ EY EY UH s n/a 14 1924 1976 2016 N
+ EY EY UW e n/a 14 1924 1976 2015 N
+ EY EY UW s n/a 14 1924 1976 2015 N
+ EY EY V b n/a 14 1924 1964 1995 N
+ EY EY V e n/a 14 1924 1964 1995 N
+ EY EY V s n/a 14 1924 1964 1995 N
+ EY EY W b n/a 14 1924 1976 2013 N
+ EY EY W e n/a 14 1924 1976 2013 N
+ EY EY W s n/a 14 1924 1976 2013 N
+ EY EY Y e n/a 14 1924 1972 2004 N
+ EY EY Y s n/a 14 1924 1972 2004 N
+ EY EY Z b n/a 14 1924 1962 2003 N
+ EY EY Z e n/a 14 1924 1961 2003 N
+ EY EY Z s n/a 14 1924 1962 2003 N
+ EY EY ZH b n/a 14 1924 1962 2003 N
+ EY EY ZH e n/a 14 1924 1961 2003 N
+ EY EY ZH s n/a 14 1924 1961 2003 N
+ EY F AA e n/a 14 1916 1976 2015 N
+ EY F AA s n/a 14 1915 1976 2015 N
+ EY F AE e n/a 14 1916 1971 2011 N
+ EY F AE i n/a 14 1915 1971 2011 N
+ EY F AE s n/a 14 1915 1971 2011 N
+ EY F AH b n/a 14 1915 1971 2012 N
+ EY F AH e n/a 14 1916 1971 2012 N
+ EY F AH i n/a 14 1915 1971 2012 N
+ EY F AH s n/a 14 1915 1971 2012 N
+ EY F AO b n/a 14 1915 1976 2015 N
+ EY F AO e n/a 14 1916 1976 2015 N
+ EY F AO s n/a 14 1915 1976 2015 N
+ EY F AW b n/a 14 1915 1976 2012 N
+ EY F AW e n/a 14 1916 1976 2012 N
+ EY F AW s n/a 14 1915 1976 2012 N
+ EY F AY b n/a 14 1915 1971 2015 N
+ EY F AY e n/a 14 1916 1971 2015 N
+ EY F AY s n/a 14 1915 1971 2015 N
+ EY F B b n/a 14 1915 1964 1994 N
+ EY F B e n/a 14 1916 1964 1996 N
+ EY F B i n/a 14 1915 1964 1994 N
+ EY F B s n/a 14 1915 1964 1994 N
+ EY F CH b n/a 14 1915 1944 1989 N
+ EY F CH e n/a 14 1916 1944 1988 N
+ EY F CH s n/a 14 1915 1944 1988 N
+ EY F D b n/a 14 1915 1962 1991 N
+ EY F D e n/a 14 1916 1961 1990 N
+ EY F D i n/a 14 1915 1962 1992 N
+ EY F D s n/a 14 1915 1961 1992 N
+ EY F DH b n/a 14 1915 1962 1998 N
+ EY F DH e n/a 14 1916 1961 1998 N
+ EY F DH i n/a 14 1915 1962 1998 N
+ EY F DH s n/a 14 1915 1961 1998 N
+ EY F EH b n/a 14 1915 1971 2011 N
+ EY F EH e n/a 14 1916 1971 2011 N
+ EY F EH i n/a 14 1915 1971 2011 N
+ EY F EH s n/a 14 1915 1971 2011 N
+ EY F ER b n/a 14 1915 1976 2016 N
+ EY F ER e n/a 14 1916 1976 2016 N
+ EY F ER i n/a 14 1915 1975 2016 N
+ EY F ER s n/a 14 1915 1976 2016 N
+ EY F EY e n/a 14 1916 1971 2011 N
+ EY F EY s n/a 14 1915 1971 2011 N
+ EY F F b n/a 14 1915 1944 2001 N
+ EY F F e n/a 14 1916 1944 2001 N
+ EY F F s n/a 14 1915 1944 2001 N
+ EY F G b n/a 14 1915 1952 1993 N
+ EY F G e n/a 14 1916 1952 1993 N
+ EY F G i n/a 14 1915 1952 1993 N
+ EY F G s n/a 14 1915 1952 1993 N
+ EY F HH b n/a 14 1915 1944 2004 N
+ EY F HH e n/a 14 1916 1944 2004 N
+ EY F HH i n/a 14 1915 1944 2004 N
+ EY F HH s n/a 14 1915 1944 2004 N
+ EY F IH e n/a 14 1916 1971 2011 N
+ EY F IH i n/a 14 1915 1970 2010 N
+ EY F IH s n/a 14 1915 1971 2011 N
+ EY F IY b n/a 14 1915 1971 2011 N
+ EY F IY e n/a 14 1916 1971 2011 N
+ EY F IY s n/a 14 1915 1971 2011 N
+ EY F JH b n/a 14 1915 1962 1991 N
+ EY F JH e n/a 14 1916 1961 1991 N
+ EY F JH i n/a 14 1915 1962 1991 N
+ EY F JH s n/a 14 1915 1961 1991 N
+ EY F K b n/a 14 1915 1952 1993 N
+ EY F K e n/a 14 1916 1952 1993 N
+ EY F K i n/a 14 1915 1952 1993 N
+ EY F K s n/a 14 1915 1952 1993 N
+ EY F L b n/a 14 1915 1976 2013 N
+ EY F L e n/a 14 1916 1976 2013 N
+ EY F L i n/a 14 1915 1975 2017 N
+ EY F L s n/a 14 1915 1976 2013 N
+ EY F M b n/a 14 1918 1978 2007 N
+ EY F M e n/a 14 1918 1978 2009 N
+ EY F M i n/a 14 1918 1977 2007 N
+ EY F M s n/a 14 1918 1978 2007 N
+ EY F N b n/a 14 1918 1978 2005 N
+ EY F N e n/a 14 1918 1978 2006 N
+ EY F N i n/a 14 1918 1977 2005 N
+ EY F N s n/a 14 1918 1978 2006 N
+ EY F NG b n/a 14 1918 1978 2005 N
+ EY F NG e n/a 14 1918 1978 2006 N
+ EY F NG s n/a 14 1918 1978 2006 N
+ EY F OW b n/a 14 1915 1976 2015 N
+ EY F OW e n/a 14 1916 1976 2015 N
+ EY F OW s n/a 14 1915 1976 2015 N
+ EY F OY e n/a 14 1916 1971 2015 N
+ EY F OY s n/a 14 1915 1971 2015 N
+ EY F P b n/a 14 1915 1944 1996 N
+ EY F P e n/a 14 1916 1944 1996 N
+ EY F P s n/a 14 1915 1944 1996 N
+ EY F R b n/a 14 1915 1976 2013 N
+ EY F R e n/a 14 1916 1976 2013 N
+ EY F R i n/a 14 1915 1975 2016 N
+ EY F R s n/a 14 1915 1976 2013 N
+ EY F S b n/a 14 1915 1944 1999 N
+ EY F S e n/a 14 1916 1944 1999 N
+ EY F S i n/a 14 1915 1944 1999 N
+ EY F S s n/a 14 1915 1944 1999 N
+ EY F SH b n/a 14 1915 1944 2002 N
+ EY F SH e n/a 14 1916 1944 2002 N
+ EY F SH i n/a 14 1915 1944 2002 N
+ EY F SH s n/a 14 1915 1944 2002 N
+ EY F SIL e n/a 14 1917 1968 1997 N
+ EY F SIL s n/a 14 1915 1972 1997 N
+ EY F T b n/a 14 1915 1944 1989 N
+ EY F T e n/a 14 1916 1944 1990 N
+ EY F T i n/a 14 1915 1944 1990 N
+ EY F T s n/a 14 1915 1944 1990 N
+ EY F TH b n/a 14 1915 1944 2001 N
+ EY F TH e n/a 14 1916 1944 2001 N
+ EY F TH i n/a 14 1915 1944 2001 N
+ EY F TH s n/a 14 1915 1944 2001 N
+ EY F UH e n/a 14 1916 1976 2016 N
+ EY F UH s n/a 14 1915 1976 2016 N
+ EY F UW e n/a 14 1916 1976 2015 N
+ EY F UW s n/a 14 1915 1976 2015 N
+ EY F V b n/a 14 1915 1964 1994 N
+ EY F V e n/a 14 1916 1964 1994 N
+ EY F V i n/a 14 1915 1964 1994 N
+ EY F V s n/a 14 1915 1964 1994 N
+ EY F W b n/a 14 1915 1976 2013 N
+ EY F W e n/a 14 1916 1976 2013 N
+ EY F W s n/a 14 1915 1976 2013 N
+ EY F Y e n/a 14 1916 1972 2004 N
+ EY F Y i n/a 14 1915 1970 2004 N
+ EY F Y s n/a 14 1915 1972 2004 N
+ EY F Z b n/a 14 1915 1962 2003 N
+ EY F Z e n/a 14 1916 1961 2003 N
+ EY F Z i n/a 14 1915 1962 2003 N
+ EY F Z s n/a 14 1915 1962 2003 N
+ EY F ZH b n/a 14 1915 1962 2003 N
+ EY F ZH e n/a 14 1916 1961 2003 N
+ EY F ZH i n/a 14 1915 1962 2003 N
+ EY F ZH s n/a 14 1915 1961 2003 N
+ EY G AA e n/a 14 1928 1976 2015 N
+ EY G AA s n/a 14 1926 1976 2015 N
+ EY G AE e n/a 14 1928 1971 2011 N
+ EY G AE s n/a 14 1926 1971 2011 N
+ EY G AH b n/a 14 1926 1971 2012 N
+ EY G AH e n/a 14 1928 1971 2012 N
+ EY G AH i n/a 14 1922 1971 2012 N
+ EY G AH s n/a 14 1926 1971 2012 N
+ EY G AO b n/a 14 1926 1976 2015 N
+ EY G AO e n/a 14 1928 1976 2015 N
+ EY G AO i n/a 14 1922 1976 2015 N
+ EY G AO s n/a 14 1926 1976 2015 N
+ EY G AW b n/a 14 1926 1976 2012 N
+ EY G AW e n/a 14 1928 1976 2012 N
+ EY G AW s n/a 14 1926 1976 2012 N
+ EY G AY b n/a 14 1926 1971 2015 N
+ EY G AY e n/a 14 1928 1971 2015 N
+ EY G AY s n/a 14 1926 1971 2015 N
+ EY G B b n/a 14 1926 1963 1994 N
+ EY G B e n/a 14 1928 1961 1996 N
+ EY G B i n/a 14 1922 1963 1994 N
+ EY G B s n/a 14 1926 1963 1994 N
+ EY G CH b n/a 14 1926 1955 1989 N
+ EY G CH e n/a 14 1928 1955 1988 N
+ EY G CH s n/a 14 1926 1956 1988 N
+ EY G D b n/a 14 1926 1962 1991 N
+ EY G D e n/a 14 1928 1961 1990 N
+ EY G D i n/a 14 1922 1962 1992 N
+ EY G D s n/a 14 1926 1962 1992 N
+ EY G DH b n/a 14 1926 1962 1998 N
+ EY G DH e n/a 14 1928 1961 1998 N
+ EY G DH s n/a 14 1926 1962 1998 N
+ EY G EH b n/a 14 1926 1971 2011 N
+ EY G EH e n/a 14 1928 1971 2011 N
+ EY G EH s n/a 14 1926 1971 2011 N
+ EY G ER b n/a 14 1926 1976 2016 N
+ EY G ER e n/a 14 1928 1976 2016 N
+ EY G ER i n/a 14 1922 1976 2016 N
+ EY G ER s n/a 14 1926 1976 2016 N
+ EY G EY e n/a 14 1928 1971 2011 N
+ EY G EY s n/a 14 1926 1971 2011 N
+ EY G F b n/a 14 1926 1955 2001 N
+ EY G F e n/a 14 1928 1955 2001 N
+ EY G F s n/a 14 1926 1956 2001 N
+ EY G G b n/a 14 1926 1952 1993 N
+ EY G G e n/a 14 1928 1952 1993 N
+ EY G G i n/a 14 1922 1952 1993 N
+ EY G G s n/a 14 1926 1952 1993 N
+ EY G HH b n/a 14 1926 1955 2004 N
+ EY G HH e n/a 14 1928 1955 2004 N
+ EY G HH i n/a 14 1922 1955 2004 N
+ EY G HH s n/a 14 1926 1956 2004 N
+ EY G IH e n/a 14 1928 1971 2011 N
+ EY G IH s n/a 14 1926 1971 2011 N
+ EY G IY b n/a 14 1926 1971 2011 N
+ EY G IY e n/a 14 1928 1971 2011 N
+ EY G IY s n/a 14 1926 1971 2011 N
+ EY G JH b n/a 14 1926 1962 1991 N
+ EY G JH e n/a 14 1928 1961 1991 N
+ EY G JH i n/a 14 1922 1962 1991 N
+ EY G JH s n/a 14 1926 1962 1991 N
+ EY G K b n/a 14 1926 1952 1993 N
+ EY G K e n/a 14 1928 1952 1993 N
+ EY G K i n/a 14 1922 1952 1993 N
+ EY G K s n/a 14 1926 1952 1993 N
+ EY G L b n/a 14 1926 1976 2013 N
+ EY G L e n/a 14 1928 1976 2013 N
+ EY G L i n/a 14 1922 1976 2017 N
+ EY G L s n/a 14 1926 1976 2013 N
+ EY G M b n/a 14 1926 1981 2007 N
+ EY G M e n/a 14 1928 1981 2009 N
+ EY G M i n/a 14 1923 1981 2007 N
+ EY G M s n/a 14 1926 1981 2009 N
+ EY G N b n/a 14 1926 1981 2005 N
+ EY G N e n/a 14 1928 1981 2006 N
+ EY G N i n/a 14 1923 1981 2006 N
+ EY G N s n/a 14 1926 1981 2006 N
+ EY G NG b n/a 14 1926 1981 2005 N
+ EY G NG e n/a 14 1928 1981 2006 N
+ EY G NG s n/a 14 1926 1981 2006 N
+ EY G OW b n/a 14 1926 1976 2015 N
+ EY G OW e n/a 14 1928 1976 2015 N
+ EY G OW i n/a 14 1922 1976 2015 N
+ EY G OW s n/a 14 1926 1976 2015 N
+ EY G OY e n/a 14 1928 1971 2015 N
+ EY G OY s n/a 14 1926 1971 2015 N
+ EY G P b n/a 14 1926 1955 1996 N
+ EY G P e n/a 14 1928 1955 1996 N
+ EY G P i n/a 14 1922 1955 1996 N
+ EY G P s n/a 14 1926 1956 1996 N
+ EY G R b n/a 14 1926 1976 2013 N
+ EY G R e n/a 14 1928 1976 2013 N
+ EY G R i n/a 14 1922 1976 2016 N
+ EY G R s n/a 14 1926 1976 2013 N
+ EY G S b n/a 14 1926 1955 2000 N
+ EY G S e n/a 14 1928 1955 2000 N
+ EY G S i n/a 14 1922 1955 2000 N
+ EY G S s n/a 14 1926 1956 2000 N
+ EY G SH b n/a 14 1926 1955 2002 N
+ EY G SH e n/a 14 1928 1955 2002 N
+ EY G SH i n/a 14 1922 1955 2002 N
+ EY G SH s n/a 14 1926 1956 2002 N
+ EY G SIL e n/a 14 1928 1968 1997 N
+ EY G SIL s n/a 14 1926 1972 1997 N
+ EY G T b n/a 14 1926 1955 1989 N
+ EY G T e n/a 14 1928 1955 1990 N
+ EY G T i n/a 14 1922 1955 1990 N
+ EY G T s n/a 14 1926 1956 1990 N
+ EY G TH b n/a 14 1926 1955 2001 N
+ EY G TH e n/a 14 1928 1955 2001 N
+ EY G TH i n/a 14 1922 1955 2001 N
+ EY G TH s n/a 14 1926 1956 2001 N
+ EY G UH e n/a 14 1928 1976 2016 N
+ EY G UH s n/a 14 1926 1976 2016 N
+ EY G UW e n/a 14 1928 1976 2015 N
+ EY G UW s n/a 14 1926 1976 2015 N
+ EY G V b n/a 14 1926 1963 1995 N
+ EY G V e n/a 14 1928 1961 1995 N
+ EY G V i n/a 14 1922 1963 1995 N
+ EY G V s n/a 14 1926 1963 1995 N
+ EY G W b n/a 14 1926 1976 2013 N
+ EY G W e n/a 14 1928 1976 2013 N
+ EY G W s n/a 14 1926 1976 2013 N
+ EY G Y e n/a 14 1928 1972 2004 N
+ EY G Y s n/a 14 1926 1972 2004 N
+ EY G Z b n/a 14 1926 1962 2003 N
+ EY G Z e n/a 14 1928 1961 2003 N
+ EY G Z i n/a 14 1922 1962 2003 N
+ EY G Z s n/a 14 1926 1962 2003 N
+ EY G ZH b n/a 14 1926 1962 2003 N
+ EY G ZH e n/a 14 1928 1961 2003 N
+ EY G ZH s n/a 14 1926 1962 2003 N
+ EY HH AA e n/a 14 1928 1976 2015 N
+ EY HH AA s n/a 14 1907 1976 2015 N
+ EY HH AE e n/a 14 1928 1971 2011 N
+ EY HH AE s n/a 14 1907 1971 2011 N
+ EY HH AH b n/a 14 1907 1971 2012 N
+ EY HH AH e n/a 14 1928 1971 2012 N
+ EY HH AH i n/a 14 1908 1971 2012 N
+ EY HH AH s n/a 14 1907 1971 2012 N
+ EY HH AO b n/a 14 1907 1976 2015 N
+ EY HH AO e n/a 14 1928 1976 2015 N
+ EY HH AO s n/a 14 1907 1976 2015 N
+ EY HH AW b n/a 14 1907 1976 2012 N
+ EY HH AW e n/a 14 1928 1976 2012 N
+ EY HH AW s n/a 14 1907 1976 2012 N
+ EY HH AY b n/a 14 1907 1971 2015 N
+ EY HH AY e n/a 14 1928 1971 2015 N
+ EY HH AY s n/a 14 1907 1971 2015 N
+ EY HH B b n/a 14 1907 1964 1994 N
+ EY HH B e n/a 14 1928 1964 1996 N
+ EY HH B i n/a 14 1908 1964 1994 N
+ EY HH B s n/a 14 1907 1964 1994 N
+ EY HH CH b n/a 14 1907 1958 1989 N
+ EY HH CH e n/a 14 1928 1958 1988 N
+ EY HH CH s n/a 14 1907 1958 1988 N
+ EY HH D b n/a 14 1907 1962 1991 N
+ EY HH D e n/a 14 1928 1961 1989 N
+ EY HH D i n/a 14 1908 1962 1992 N
+ EY HH D s n/a 14 1907 1961 1992 N
+ EY HH DH b n/a 14 1907 1962 1998 N
+ EY HH DH e n/a 14 1928 1961 1998 N
+ EY HH DH i n/a 14 1908 1962 1998 N
+ EY HH DH s n/a 14 1907 1961 1998 N
+ EY HH EH b n/a 14 1907 1971 2011 N
+ EY HH EH e n/a 14 1928 1971 2011 N
+ EY HH EH s n/a 14 1907 1971 2011 N
+ EY HH ER b n/a 14 1907 1976 2016 N
+ EY HH ER e n/a 14 1928 1976 2016 N
+ EY HH ER i n/a 14 1908 1974 2016 N
+ EY HH ER s n/a 14 1907 1976 2016 N
+ EY HH EY e n/a 14 1928 1971 2011 N
+ EY HH EY i n/a 14 1908 1971 2011 N
+ EY HH EY s n/a 14 1907 1971 2011 N
+ EY HH F b n/a 14 1907 1958 2001 N
+ EY HH F e n/a 14 1928 1958 2001 N
+ EY HH F i n/a 14 1908 1958 2001 N
+ EY HH F s n/a 14 1907 1958 2001 N
+ EY HH G b n/a 14 1907 1952 1993 N
+ EY HH G e n/a 14 1928 1952 1993 N
+ EY HH G i n/a 14 1908 1952 1993 N
+ EY HH G s n/a 14 1907 1952 1993 N
+ EY HH HH b n/a 14 1907 1958 2004 N
+ EY HH HH e n/a 14 1928 1958 2004 N
+ EY HH HH i n/a 14 1908 1958 2004 N
+ EY HH HH s n/a 14 1907 1958 2004 N
+ EY HH IH e n/a 14 1928 1971 2011 N
+ EY HH IH i n/a 14 1908 1970 2010 N
+ EY HH IH s n/a 14 1907 1971 2011 N
+ EY HH IY b n/a 14 1907 1971 2011 N
+ EY HH IY e n/a 14 1928 1971 2011 N
+ EY HH IY s n/a 14 1907 1971 2011 N
+ EY HH JH b n/a 14 1907 1962 1991 N
+ EY HH JH e n/a 14 1928 1961 1991 N
+ EY HH JH i n/a 14 1908 1962 1991 N
+ EY HH JH s n/a 14 1907 1961 1991 N
+ EY HH K b n/a 14 1907 1952 1993 N
+ EY HH K e n/a 14 1928 1952 1993 N
+ EY HH K i n/a 14 1908 1952 1993 N
+ EY HH K s n/a 14 1907 1952 1993 N
+ EY HH L b n/a 14 1907 1976 2013 N
+ EY HH L e n/a 14 1928 1976 2013 N
+ EY HH L i n/a 14 1908 1974 2017 N
+ EY HH L s n/a 14 1907 1976 2013 N
+ EY HH M b n/a 14 1907 1981 2007 N
+ EY HH M e n/a 14 1928 1981 2009 N
+ EY HH M i n/a 14 1908 1982 2007 N
+ EY HH M s n/a 14 1907 1981 2009 N
+ EY HH N b n/a 14 1907 1981 2005 N
+ EY HH N e n/a 14 1928 1981 2006 N
+ EY HH N i n/a 14 1908 1982 2005 N
+ EY HH N s n/a 14 1907 1981 2006 N
+ EY HH NG b n/a 14 1907 1981 2005 N
+ EY HH NG e n/a 14 1928 1981 2006 N
+ EY HH NG s n/a 14 1907 1981 2006 N
+ EY HH OW b n/a 14 1907 1976 2015 N
+ EY HH OW e n/a 14 1928 1976 2015 N
+ EY HH OW i n/a 14 1908 1974 2015 N
+ EY HH OW s n/a 14 1907 1976 2015 N
+ EY HH OY e n/a 14 1928 1971 2015 N
+ EY HH OY s n/a 14 1907 1971 2015 N
+ EY HH P b n/a 14 1907 1959 1996 N
+ EY HH P e n/a 14 1928 1959 1996 N
+ EY HH P i n/a 14 1908 1959 1996 N
+ EY HH P s n/a 14 1907 1959 1996 N
+ EY HH R b n/a 14 1907 1976 2013 N
+ EY HH R e n/a 14 1928 1976 2013 N
+ EY HH R i n/a 14 1908 1974 2016 N
+ EY HH R s n/a 14 1907 1976 2013 N
+ EY HH S b n/a 14 1907 1958 2000 N
+ EY HH S e n/a 14 1928 1958 2000 N
+ EY HH S i n/a 14 1908 1958 2000 N
+ EY HH S s n/a 14 1907 1958 2000 N
+ EY HH SH b n/a 14 1907 1960 2002 N
+ EY HH SH e n/a 14 1928 1960 2002 N
+ EY HH SH i n/a 14 1908 1960 2002 N
+ EY HH SH s n/a 14 1907 1960 2002 N
+ EY HH SIL e n/a 14 1928 1968 1997 N
+ EY HH SIL s n/a 14 1907 1972 1997 N
+ EY HH T b n/a 14 1907 1958 1989 N
+ EY HH T e n/a 14 1928 1958 1989 N
+ EY HH T i n/a 14 1908 1958 1989 N
+ EY HH T s n/a 14 1907 1958 1989 N
+ EY HH TH b n/a 14 1907 1958 2001 N
+ EY HH TH e n/a 14 1928 1958 2001 N
+ EY HH TH i n/a 14 1908 1958 2001 N
+ EY HH TH s n/a 14 1907 1958 2001 N
+ EY HH UH e n/a 14 1928 1976 2016 N
+ EY HH UH s n/a 14 1907 1976 2016 N
+ EY HH UW e n/a 14 1928 1976 2015 N
+ EY HH UW i n/a 14 1908 1974 2015 N
+ EY HH UW s n/a 14 1907 1976 2015 N
+ EY HH V b n/a 14 1907 1964 1995 N
+ EY HH V e n/a 14 1928 1964 1995 N
+ EY HH V i n/a 14 1908 1964 1995 N
+ EY HH V s n/a 14 1907 1964 1995 N
+ EY HH W b n/a 14 1907 1976 2013 N
+ EY HH W e n/a 14 1928 1976 2013 N
+ EY HH W i n/a 14 1908 1974 2017 N
+ EY HH W s n/a 14 1907 1976 2013 N
+ EY HH Y e n/a 14 1928 1972 2004 N
+ EY HH Y s n/a 14 1907 1972 2004 N
+ EY HH Z b n/a 14 1907 1962 2003 N
+ EY HH Z e n/a 14 1928 1961 2003 N
+ EY HH Z i n/a 14 1908 1962 2003 N
+ EY HH Z s n/a 14 1907 1962 2003 N
+ EY HH ZH b n/a 14 1907 1962 2003 N
+ EY HH ZH e n/a 14 1928 1961 2003 N
+ EY HH ZH s n/a 14 1907 1961 2003 N
+ EY IH AA s n/a 14 1926 1976 2015 N
+ EY IH AE s n/a 14 1926 1971 2011 N
+ EY IH AH b n/a 14 1926 1971 2012 N
+ EY IH AH s n/a 14 1926 1971 2012 N
+ EY IH AO b n/a 14 1926 1976 2015 N
+ EY IH AO s n/a 14 1926 1976 2015 N
+ EY IH AW b n/a 14 1926 1976 2012 N
+ EY IH AW s n/a 14 1926 1976 2012 N
+ EY IH AY b n/a 14 1926 1971 2015 N
+ EY IH AY s n/a 14 1926 1971 2015 N
+ EY IH B b n/a 14 1926 1964 1994 N
+ EY IH B s n/a 14 1926 1964 1994 N
+ EY IH CH b n/a 14 1926 1955 1989 N
+ EY IH CH s n/a 14 1926 1956 1988 N
+ EY IH D b n/a 14 1926 1962 1991 N
+ EY IH D s n/a 14 1926 1961 1992 N
+ EY IH DH b n/a 14 1926 1962 1998 N
+ EY IH DH s n/a 14 1926 1961 1998 N
+ EY IH EH b n/a 14 1926 1971 2011 N
+ EY IH EH s n/a 14 1926 1971 2011 N
+ EY IH ER b n/a 14 1926 1976 2016 N
+ EY IH ER s n/a 14 1926 1976 2016 N
+ EY IH EY s n/a 14 1926 1971 2011 N
+ EY IH F b n/a 14 1926 1955 2001 N
+ EY IH F s n/a 14 1926 1956 2001 N
+ EY IH G b n/a 14 1926 1952 1993 N
+ EY IH G s n/a 14 1926 1952 1993 N
+ EY IH HH b n/a 14 1926 1955 2004 N
+ EY IH HH s n/a 14 1926 1956 2004 N
+ EY IH IH s n/a 14 1926 1971 2011 N
+ EY IH IY b n/a 14 1926 1971 2011 N
+ EY IH IY s n/a 14 1926 1971 2011 N
+ EY IH JH b n/a 14 1926 1962 1991 N
+ EY IH JH s n/a 14 1926 1961 1991 N
+ EY IH K b n/a 14 1926 1952 1993 N
+ EY IH K s n/a 14 1926 1952 1993 N
+ EY IH L b n/a 14 1926 1976 2013 N
+ EY IH L i n/a 14 1923 1974 2017 N
+ EY IH L s n/a 14 1926 1976 2013 N
+ EY IH M b n/a 14 1926 1981 2007 N
+ EY IH M s n/a 14 1926 1981 2009 N
+ EY IH N b n/a 14 1926 1981 2005 N
+ EY IH N s n/a 14 1926 1981 2006 N
+ EY IH NG b n/a 14 1926 1981 2005 N
+ EY IH NG s n/a 14 1926 1981 2006 N
+ EY IH OW b n/a 14 1926 1976 2015 N
+ EY IH OW s n/a 14 1926 1976 2015 N
+ EY IH OY s n/a 14 1926 1971 2015 N
+ EY IH P b n/a 14 1926 1955 1996 N
+ EY IH P s n/a 14 1926 1956 1996 N
+ EY IH R b n/a 14 1926 1976 2013 N
+ EY IH R s n/a 14 1926 1976 2013 N
+ EY IH S b n/a 14 1926 1955 2000 N
+ EY IH S s n/a 14 1926 1956 2000 N
+ EY IH SH b n/a 14 1926 1955 2002 N
+ EY IH SH s n/a 14 1926 1956 2002 N
+ EY IH SIL s n/a 14 1926 1972 1997 N
+ EY IH T b n/a 14 1926 1955 1989 N
+ EY IH T s n/a 14 1926 1956 1990 N
+ EY IH TH b n/a 14 1926 1955 2001 N
+ EY IH TH s n/a 14 1926 1956 2001 N
+ EY IH UH s n/a 14 1926 1976 2016 N
+ EY IH UW s n/a 14 1926 1976 2015 N
+ EY IH V b n/a 14 1926 1964 1995 N
+ EY IH V s n/a 14 1926 1964 1995 N
+ EY IH W b n/a 14 1926 1976 2013 N
+ EY IH W s n/a 14 1926 1976 2013 N
+ EY IH Y s n/a 14 1926 1972 2004 N
+ EY IH Z b n/a 14 1926 1962 2003 N
+ EY IH Z s n/a 14 1926 1962 2003 N
+ EY IH ZH b n/a 14 1926 1962 2003 N
+ EY IH ZH s n/a 14 1926 1961 2003 N
+ EY IY AA e n/a 14 1924 1976 2015 N
+ EY IY AA s n/a 14 1924 1976 2015 N
+ EY IY AE e n/a 14 1924 1971 2011 N
+ EY IY AE s n/a 14 1924 1971 2011 N
+ EY IY AH b n/a 14 1924 1971 2012 N
+ EY IY AH e n/a 14 1924 1971 2012 N
+ EY IY AH s n/a 14 1924 1971 2012 N
+ EY IY AO b n/a 14 1924 1976 2015 N
+ EY IY AO e n/a 14 1924 1976 2015 N
+ EY IY AO s n/a 14 1924 1976 2015 N
+ EY IY AW b n/a 14 1924 1976 2012 N
+ EY IY AW e n/a 14 1924 1976 2012 N
+ EY IY AW s n/a 14 1924 1976 2012 N
+ EY IY AY b n/a 14 1924 1971 2015 N
+ EY IY AY e n/a 14 1924 1971 2015 N
+ EY IY AY s n/a 14 1924 1971 2015 N
+ EY IY B b n/a 14 1924 1964 1994 N
+ EY IY B e n/a 14 1924 1964 1996 N
+ EY IY B i n/a 14 1925 1964 1994 N
+ EY IY B s n/a 14 1924 1964 1994 N
+ EY IY CH b n/a 14 1924 1955 1989 N
+ EY IY CH e n/a 14 1924 1955 1988 N
+ EY IY CH i n/a 14 1925 1955 1988 N
+ EY IY CH s n/a 14 1924 1956 1988 N
+ EY IY D b n/a 14 1924 1962 1991 N
+ EY IY D e n/a 14 1924 1961 1990 N
+ EY IY D i n/a 14 1925 1962 1992 N
+ EY IY D s n/a 14 1924 1961 1992 N
+ EY IY DH b n/a 14 1924 1962 1998 N
+ EY IY DH e n/a 14 1924 1961 1998 N
+ EY IY DH s n/a 14 1924 1961 1998 N
+ EY IY EH b n/a 14 1924 1971 2011 N
+ EY IY EH e n/a 14 1924 1971 2011 N
+ EY IY EH i n/a 14 1925 1971 2011 N
+ EY IY EH s n/a 14 1924 1971 2011 N
+ EY IY ER b n/a 14 1924 1976 2016 N
+ EY IY ER e n/a 14 1924 1976 2016 N
+ EY IY ER s n/a 14 1924 1976 2016 N
+ EY IY EY e n/a 14 1924 1971 2011 N
+ EY IY EY s n/a 14 1924 1971 2011 N
+ EY IY F b n/a 14 1924 1955 2001 N
+ EY IY F e n/a 14 1924 1955 2001 N
+ EY IY F s n/a 14 1924 1956 2001 N
+ EY IY G b n/a 14 1924 1952 1993 N
+ EY IY G e n/a 14 1924 1952 1993 N
+ EY IY G i n/a 14 1925 1952 1993 N
+ EY IY G s n/a 14 1924 1952 1993 N
+ EY IY HH b n/a 14 1924 1955 2004 N
+ EY IY HH e n/a 14 1924 1955 2004 N
+ EY IY HH s n/a 14 1924 1956 2004 N
+ EY IY IH e n/a 14 1924 1971 2011 N
+ EY IY IH i n/a 14 1925 1970 2010 N
+ EY IY IH s n/a 14 1924 1971 2011 N
+ EY IY IY b n/a 14 1924 1971 2011 N
+ EY IY IY e n/a 14 1924 1971 2011 N
+ EY IY IY s n/a 14 1924 1971 2011 N
+ EY IY JH b n/a 14 1924 1962 1991 N
+ EY IY JH e n/a 14 1924 1961 1991 N
+ EY IY JH i n/a 14 1925 1962 1991 N
+ EY IY JH s n/a 14 1924 1961 1991 N
+ EY IY K b n/a 14 1924 1952 1993 N
+ EY IY K e n/a 14 1924 1952 1993 N
+ EY IY K i n/a 14 1925 1952 1993 N
+ EY IY K s n/a 14 1924 1952 1993 N
+ EY IY L b n/a 14 1924 1976 2013 N
+ EY IY L e n/a 14 1924 1976 2013 N
+ EY IY L i n/a 14 1925 1974 2017 N
+ EY IY L s n/a 14 1924 1976 2013 N
+ EY IY M b n/a 14 1924 1981 2007 N
+ EY IY M e n/a 14 1924 1981 2009 N
+ EY IY M i n/a 14 1925 1981 2007 N
+ EY IY M s n/a 14 1924 1981 2009 N
+ EY IY N b n/a 14 1924 1981 2005 N
+ EY IY N e n/a 14 1924 1981 2006 N
+ EY IY N i n/a 14 1925 1981 2005 N
+ EY IY N s n/a 14 1924 1981 2006 N
+ EY IY NG b n/a 14 1924 1981 2005 N
+ EY IY NG e n/a 14 1924 1981 2006 N
+ EY IY NG s n/a 14 1924 1981 2006 N
+ EY IY OW b n/a 14 1924 1976 2015 N
+ EY IY OW e n/a 14 1924 1976 2015 N
+ EY IY OW s n/a 14 1924 1976 2015 N
+ EY IY OY e n/a 14 1924 1971 2015 N
+ EY IY OY s n/a 14 1924 1971 2015 N
+ EY IY P b n/a 14 1924 1955 1996 N
+ EY IY P e n/a 14 1924 1955 1996 N
+ EY IY P i n/a 14 1925 1955 1996 N
+ EY IY P s n/a 14 1924 1956 1996 N
+ EY IY R b n/a 14 1924 1976 2013 N
+ EY IY R e n/a 14 1924 1976 2013 N
+ EY IY R s n/a 14 1924 1976 2013 N
+ EY IY S b n/a 14 1924 1955 2000 N
+ EY IY S e n/a 14 1924 1955 2000 N
+ EY IY S i n/a 14 1925 1955 2000 N
+ EY IY S s n/a 14 1924 1956 2000 N
+ EY IY SH b n/a 14 1924 1955 2002 N
+ EY IY SH e n/a 14 1924 1955 2002 N
+ EY IY SH i n/a 14 1925 1955 2002 N
+ EY IY SH s n/a 14 1924 1956 2002 N
+ EY IY SIL e n/a 14 1924 1968 1997 N
+ EY IY SIL s n/a 14 1924 1972 1997 N
+ EY IY T b n/a 14 1924 1955 1989 N
+ EY IY T e n/a 14 1924 1955 1990 N
+ EY IY T i n/a 14 1925 1955 1990 N
+ EY IY T s n/a 14 1924 1956 1990 N
+ EY IY TH b n/a 14 1924 1955 2001 N
+ EY IY TH e n/a 14 1924 1955 2001 N
+ EY IY TH i n/a 14 1925 1955 2001 N
+ EY IY TH s n/a 14 1924 1956 2001 N
+ EY IY UH e n/a 14 1924 1976 2016 N
+ EY IY UH s n/a 14 1924 1976 2016 N
+ EY IY UW e n/a 14 1924 1976 2015 N
+ EY IY UW s n/a 14 1924 1976 2015 N
+ EY IY V b n/a 14 1924 1964 1995 N
+ EY IY V e n/a 14 1924 1964 1995 N
+ EY IY V i n/a 14 1925 1964 1995 N
+ EY IY V s n/a 14 1924 1964 1995 N
+ EY IY W b n/a 14 1924 1976 2013 N
+ EY IY W e n/a 14 1924 1976 2013 N
+ EY IY W s n/a 14 1924 1976 2013 N
+ EY IY Y e n/a 14 1924 1972 2004 N
+ EY IY Y s n/a 14 1924 1972 2004 N
+ EY IY Z b n/a 14 1924 1962 2003 N
+ EY IY Z e n/a 14 1924 1961 2003 N
+ EY IY Z i n/a 14 1925 1962 2003 N
+ EY IY Z s n/a 14 1924 1962 2003 N
+ EY IY ZH b n/a 14 1924 1962 2003 N
+ EY IY ZH e n/a 14 1924 1961 2003 N
+ EY IY ZH s n/a 14 1924 1961 2003 N
+ EY JH AA e n/a 14 1928 1976 2015 N
+ EY JH AA s n/a 14 1926 1976 2015 N
+ EY JH AE e n/a 14 1928 1971 2011 N
+ EY JH AE s n/a 14 1926 1971 2011 N
+ EY JH AH b n/a 14 1926 1971 2012 N
+ EY JH AH e n/a 14 1928 1971 2012 N
+ EY JH AH i n/a 14 1923 1971 2012 N
+ EY JH AH s n/a 14 1926 1971 2012 N
+ EY JH AO b n/a 14 1926 1976 2015 N
+ EY JH AO e n/a 14 1928 1976 2015 N
+ EY JH AO s n/a 14 1926 1976 2015 N
+ EY JH AW b n/a 14 1926 1976 2012 N
+ EY JH AW e n/a 14 1928 1976 2012 N
+ EY JH AW s n/a 14 1926 1976 2012 N
+ EY JH AY b n/a 14 1926 1971 2015 N
+ EY JH AY e n/a 14 1928 1971 2015 N
+ EY JH AY s n/a 14 1926 1971 2015 N
+ EY JH B b n/a 14 1926 1964 1994 N
+ EY JH B e n/a 14 1928 1964 1996 N
+ EY JH B i n/a 14 1923 1964 1994 N
+ EY JH B s n/a 14 1926 1964 1994 N
+ EY JH CH b n/a 14 1926 1955 1989 N
+ EY JH CH e n/a 14 1928 1955 1988 N
+ EY JH CH i n/a 14 1923 1955 1988 N
+ EY JH CH s n/a 14 1926 1956 1988 N
+ EY JH D b n/a 14 1926 1962 1991 N
+ EY JH D e n/a 14 1928 1961 1990 N
+ EY JH D i n/a 14 1923 1962 1992 N
+ EY JH D s n/a 14 1926 1961 1992 N
+ EY JH DH b n/a 14 1926 1962 1998 N
+ EY JH DH e n/a 14 1928 1961 1998 N
+ EY JH DH s n/a 14 1926 1961 1998 N
+ EY JH EH b n/a 14 1926 1971 2011 N
+ EY JH EH e n/a 14 1928 1971 2011 N
+ EY JH EH i n/a 14 1923 1971 2011 N
+ EY JH EH s n/a 14 1926 1971 2011 N
+ EY JH ER b n/a 14 1926 1976 2016 N
+ EY JH ER e n/a 14 1928 1976 2016 N
+ EY JH ER i n/a 14 1923 1974 2016 N
+ EY JH ER s n/a 14 1926 1976 2016 N
+ EY JH EY e n/a 14 1928 1971 2011 N
+ EY JH EY i n/a 14 1923 1971 2011 N
+ EY JH EY s n/a 14 1926 1971 2011 N
+ EY JH F b n/a 14 1926 1955 2001 N
+ EY JH F e n/a 14 1928 1955 2001 N
+ EY JH F i n/a 14 1923 1955 2001 N
+ EY JH F s n/a 14 1926 1956 2001 N
+ EY JH G b n/a 14 1926 1952 1993 N
+ EY JH G e n/a 14 1928 1952 1993 N
+ EY JH G i n/a 14 1923 1952 1993 N
+ EY JH G s n/a 14 1926 1952 1993 N
+ EY JH HH b n/a 14 1926 1955 2004 N
+ EY JH HH e n/a 14 1928 1955 2004 N
+ EY JH HH i n/a 14 1923 1955 2004 N
+ EY JH HH s n/a 14 1926 1956 2004 N
+ EY JH IH e n/a 14 1928 1971 2011 N
+ EY JH IH i n/a 14 1923 1970 2010 N
+ EY JH IH s n/a 14 1926 1971 2011 N
+ EY JH IY b n/a 14 1926 1971 2011 N
+ EY JH IY e n/a 14 1928 1971 2011 N
+ EY JH IY s n/a 14 1926 1971 2011 N
+ EY JH JH b n/a 14 1926 1962 1991 N
+ EY JH JH e n/a 14 1928 1961 1991 N
+ EY JH JH s n/a 14 1926 1961 1991 N
+ EY JH K b n/a 14 1926 1952 1993 N
+ EY JH K e n/a 14 1928 1952 1993 N
+ EY JH K i n/a 14 1923 1952 1993 N
+ EY JH K s n/a 14 1926 1952 1993 N
+ EY JH L b n/a 14 1926 1976 2013 N
+ EY JH L e n/a 14 1928 1976 2013 N
+ EY JH L i n/a 14 1923 1974 2017 N
+ EY JH L s n/a 14 1926 1976 2013 N
+ EY JH M b n/a 14 1926 1981 2007 N
+ EY JH M e n/a 14 1928 1981 2009 N
+ EY JH M i n/a 14 1923 1981 2007 N
+ EY JH M s n/a 14 1926 1981 2009 N
+ EY JH N b n/a 14 1926 1981 2005 N
+ EY JH N e n/a 14 1928 1981 2006 N
+ EY JH N i n/a 14 1923 1981 2005 N
+ EY JH N s n/a 14 1926 1981 2006 N
+ EY JH NG b n/a 14 1926 1981 2005 N
+ EY JH NG e n/a 14 1928 1981 2006 N
+ EY JH NG s n/a 14 1926 1981 2006 N
+ EY JH OW b n/a 14 1926 1976 2015 N
+ EY JH OW e n/a 14 1928 1976 2015 N
+ EY JH OW s n/a 14 1926 1976 2015 N
+ EY JH OY e n/a 14 1928 1971 2015 N
+ EY JH OY s n/a 14 1926 1971 2015 N
+ EY JH P b n/a 14 1926 1955 1996 N
+ EY JH P e n/a 14 1928 1955 1996 N
+ EY JH P i n/a 14 1923 1955 1996 N
+ EY JH P s n/a 14 1926 1956 1996 N
+ EY JH R b n/a 14 1926 1976 2013 N
+ EY JH R e n/a 14 1928 1976 2013 N
+ EY JH R i n/a 14 1923 1974 2016 N
+ EY JH R s n/a 14 1926 1976 2013 N
+ EY JH S b n/a 14 1926 1955 2000 N
+ EY JH S e n/a 14 1928 1955 2000 N
+ EY JH S i n/a 14 1922 1955 2000 N
+ EY JH S s n/a 14 1926 1956 2000 N
+ EY JH SH b n/a 14 1926 1955 2002 N
+ EY JH SH e n/a 14 1928 1955 2002 N
+ EY JH SH s n/a 14 1926 1956 2002 N
+ EY JH SIL e n/a 14 1928 1968 1997 N
+ EY JH SIL s n/a 14 1926 1972 1997 N
+ EY JH T b n/a 14 1926 1955 1989 N
+ EY JH T e n/a 14 1928 1955 1990 N
+ EY JH T s n/a 14 1926 1956 1990 N
+ EY JH TH b n/a 14 1926 1955 2001 N
+ EY JH TH e n/a 14 1928 1955 2001 N
+ EY JH TH s n/a 14 1926 1956 2001 N
+ EY JH UH e n/a 14 1928 1976 2016 N
+ EY JH UH s n/a 14 1926 1976 2016 N
+ EY JH UW e n/a 14 1928 1976 2015 N
+ EY JH UW s n/a 14 1926 1976 2015 N
+ EY JH V b n/a 14 1926 1964 1995 N
+ EY JH V e n/a 14 1928 1964 1995 N
+ EY JH V s n/a 14 1926 1964 1995 N
+ EY JH W b n/a 14 1926 1976 2013 N
+ EY JH W e n/a 14 1928 1976 2013 N
+ EY JH W i n/a 14 1923 1974 2017 N
+ EY JH W s n/a 14 1926 1976 2013 N
+ EY JH Y e n/a 14 1928 1972 2004 N
+ EY JH Y s n/a 14 1926 1972 2004 N
+ EY JH Z b n/a 14 1926 1962 2003 N
+ EY JH Z e n/a 14 1928 1961 2003 N
+ EY JH Z i n/a 14 1923 1962 2003 N
+ EY JH Z s n/a 14 1926 1962 2003 N
+ EY JH ZH b n/a 14 1926 1962 2003 N
+ EY JH ZH e n/a 14 1928 1961 2003 N
+ EY JH ZH s n/a 14 1926 1961 2003 N
+ EY K AA e n/a 14 1910 1976 2015 N
+ EY K AA i n/a 14 1902 1974 2015 N
+ EY K AA s n/a 14 1910 1976 2015 N
+ EY K AE e n/a 14 1910 1971 2011 N
+ EY K AE s n/a 14 1910 1971 2011 N
+ EY K AH b n/a 14 1910 1971 2012 N
+ EY K AH e n/a 14 1910 1971 2012 N
+ EY K AH i n/a 14 1902 1971 2012 N
+ EY K AH s n/a 14 1910 1971 2012 N
+ EY K AO b n/a 14 1910 1976 2015 N
+ EY K AO e n/a 14 1910 1976 2015 N
+ EY K AO s n/a 14 1910 1976 2015 N
+ EY K AW b n/a 14 1910 1976 2012 N
+ EY K AW e n/a 14 1910 1976 2012 N
+ EY K AW s n/a 14 1910 1976 2012 N
+ EY K AY b n/a 14 1910 1971 2015 N
+ EY K AY e n/a 14 1910 1971 2015 N
+ EY K AY s n/a 14 1910 1971 2015 N
+ EY K B b n/a 14 1910 1963 1994 N
+ EY K B e n/a 14 1910 1961 1996 N
+ EY K B i n/a 14 1902 1963 1994 N
+ EY K B s n/a 14 1910 1963 1994 N
+ EY K CH b n/a 14 1910 1959 1989 N
+ EY K CH e n/a 14 1910 1959 1988 N
+ EY K CH s n/a 14 1910 1959 1988 N
+ EY K D b n/a 14 1906 1962 1991 N
+ EY K D e n/a 14 1906 1961 1990 N
+ EY K D i n/a 14 1902 1962 1992 N
+ EY K D s n/a 14 1906 1962 1992 N
+ EY K DH b n/a 14 1910 1962 1998 N
+ EY K DH e n/a 14 1910 1961 1998 N
+ EY K DH i n/a 14 1902 1962 1998 N
+ EY K DH s n/a 14 1910 1962 1998 N
+ EY K EH b n/a 14 1910 1971 2011 N
+ EY K EH e n/a 14 1910 1971 2011 N
+ EY K EH i n/a 14 1902 1971 2011 N
+ EY K EH s n/a 14 1910 1971 2011 N
+ EY K ER b n/a 14 1910 1976 2016 N
+ EY K ER e n/a 14 1910 1976 2016 N
+ EY K ER i n/a 14 1902 1974 2016 N
+ EY K ER s n/a 14 1910 1976 2016 N
+ EY K EY e n/a 14 1910 1971 2011 N
+ EY K EY i n/a 14 1902 1971 2011 N
+ EY K EY s n/a 14 1910 1971 2011 N
+ EY K F b n/a 14 1910 1959 2001 N
+ EY K F e n/a 14 1910 1959 2001 N
+ EY K F i n/a 14 1902 1959 2001 N
+ EY K F s n/a 14 1910 1959 2001 N
+ EY K G b n/a 14 1910 1952 1993 N
+ EY K G e n/a 14 1910 1952 1993 N
+ EY K G i n/a 14 1902 1952 1993 N
+ EY K G s n/a 14 1910 1952 1993 N
+ EY K HH b n/a 14 1910 1959 2004 N
+ EY K HH e n/a 14 1910 1959 2004 N
+ EY K HH i n/a 14 1902 1959 2004 N
+ EY K HH s n/a 14 1910 1959 2004 N
+ EY K IH e n/a 14 1910 1971 2011 N
+ EY K IH i n/a 14 1902 1970 2010 N
+ EY K IH s n/a 14 1910 1971 2011 N
+ EY K IY b n/a 14 1910 1971 2011 N
+ EY K IY e n/a 14 1910 1971 2011 N
+ EY K IY i n/a 14 1902 1970 2010 N
+ EY K IY s n/a 14 1910 1971 2011 N
+ EY K JH b n/a 14 1910 1962 1991 N
+ EY K JH e n/a 14 1910 1961 1991 N
+ EY K JH i n/a 14 1902 1962 1991 N
+ EY K JH s n/a 14 1910 1962 1991 N
+ EY K K b n/a 14 1910 1952 1993 N
+ EY K K e n/a 14 1910 1952 1993 N
+ EY K K i n/a 14 1902 1952 1993 N
+ EY K K s n/a 14 1910 1952 1993 N
+ EY K L b n/a 14 1910 1976 2013 N
+ EY K L e n/a 14 1910 1976 2013 N
+ EY K L i n/a 14 1902 1974 2017 N
+ EY K L s n/a 14 1910 1976 2013 N
+ EY K M b n/a 14 1903 1980 2008 N
+ EY K M e n/a 14 1903 1980 2009 N
+ EY K M i n/a 14 1903 1980 2008 N
+ EY K M s n/a 14 1903 1980 2009 N
+ EY K N b n/a 14 1903 1980 2005 N
+ EY K N e n/a 14 1903 1980 2006 N
+ EY K N i n/a 14 1903 1980 2006 N
+ EY K N s n/a 14 1903 1980 2006 N
+ EY K NG b n/a 14 1903 1980 2005 N
+ EY K NG e n/a 14 1903 1980 2006 N
+ EY K NG s n/a 14 1903 1980 2006 N
+ EY K OW b n/a 14 1910 1976 2015 N
+ EY K OW e n/a 14 1910 1976 2015 N
+ EY K OW i n/a 14 1902 1974 2015 N
+ EY K OW s n/a 14 1910 1976 2015 N
+ EY K OY e n/a 14 1910 1971 2015 N
+ EY K OY s n/a 14 1910 1971 2015 N
+ EY K P b n/a 14 1910 1959 1996 N
+ EY K P e n/a 14 1910 1959 1996 N
+ EY K P i n/a 14 1902 1959 1996 N
+ EY K P s n/a 14 1910 1959 1996 N
+ EY K R b n/a 14 1910 1976 2013 N
+ EY K R e n/a 14 1910 1976 2013 N
+ EY K R i n/a 14 1902 1974 2016 N
+ EY K R s n/a 14 1910 1976 2013 N
+ EY K S b n/a 14 1906 1959 1999 N
+ EY K S e n/a 14 1904 1959 1999 N
+ EY K S i n/a 14 1902 1959 1999 N
+ EY K S s n/a 14 1904 1959 1999 N
+ EY K SH b n/a 14 1910 1960 2002 N
+ EY K SH e n/a 14 1910 1960 2002 N
+ EY K SH i n/a 14 1902 1960 2002 N
+ EY K SH s n/a 14 1910 1960 2002 N
+ EY K SIL e n/a 14 1910 1968 1997 N
+ EY K SIL s n/a 14 1910 1972 1997 N
+ EY K T b n/a 14 1906 1959 1989 N
+ EY K T e n/a 14 1906 1959 1990 N
+ EY K T i n/a 14 1902 1959 1990 N
+ EY K T s n/a 14 1906 1959 1990 N
+ EY K TH b n/a 14 1910 1959 2001 N
+ EY K TH e n/a 14 1910 1959 2001 N
+ EY K TH s n/a 14 1910 1959 2001 N
+ EY K UH e n/a 14 1910 1976 2016 N
+ EY K UH s n/a 14 1910 1976 2016 N
+ EY K UW e n/a 14 1910 1976 2015 N
+ EY K UW i n/a 14 1902 1974 2015 N
+ EY K UW s n/a 14 1910 1976 2015 N
+ EY K V b n/a 14 1910 1963 1995 N
+ EY K V e n/a 14 1910 1961 1995 N
+ EY K V i n/a 14 1902 1963 1995 N
+ EY K V s n/a 14 1910 1963 1995 N
+ EY K W b n/a 14 1910 1976 2013 N
+ EY K W e n/a 14 1910 1976 2013 N
+ EY K W i n/a 14 1902 1974 2017 N
+ EY K W s n/a 14 1910 1976 2013 N
+ EY K Y e n/a 14 1910 1972 2004 N
+ EY K Y i n/a 14 1902 1970 2004 N
+ EY K Y s n/a 14 1910 1972 2004 N
+ EY K Z b n/a 14 1906 1962 2003 N
+ EY K Z e n/a 14 1906 1961 2003 N
+ EY K Z i n/a 14 1902 1962 2003 N
+ EY K Z s n/a 14 1906 1962 2003 N
+ EY K ZH b n/a 14 1910 1962 2003 N
+ EY K ZH e n/a 14 1910 1961 2003 N
+ EY K ZH i n/a 14 1902 1962 2003 N
+ EY K ZH s n/a 14 1910 1962 2003 N
+ EY L AA e n/a 14 1931 1976 2015 N
+ EY L AA s n/a 14 1931 1976 2015 N
+ EY L AE e n/a 14 1931 1971 2011 N
+ EY L AE i n/a 14 1931 1971 2011 N
+ EY L AE s n/a 14 1931 1971 2011 N
+ EY L AH b n/a 14 1931 1971 2012 N
+ EY L AH e n/a 14 1931 1971 2012 N
+ EY L AH i n/a 14 1931 1971 2012 N
+ EY L AH s n/a 14 1931 1971 2012 N
+ EY L AO b n/a 14 1931 1976 2015 N
+ EY L AO e n/a 14 1931 1976 2015 N
+ EY L AO i n/a 14 1931 1975 2015 N
+ EY L AO s n/a 14 1931 1976 2015 N
+ EY L AW b n/a 14 1931 1976 2012 N
+ EY L AW e n/a 14 1931 1976 2012 N
+ EY L AW i n/a 14 1931 1975 2012 N
+ EY L AW s n/a 14 1931 1976 2012 N
+ EY L AY b n/a 14 1931 1971 2015 N
+ EY L AY e n/a 14 1931 1971 2015 N
+ EY L AY s n/a 14 1931 1971 2015 N
+ EY L B b n/a 14 1930 1967 1994 N
+ EY L B e n/a 14 1930 1967 1996 N
+ EY L B i n/a 14 1930 1967 1994 N
+ EY L B s n/a 14 1930 1967 1994 N
+ EY L CH b n/a 14 1930 1949 1989 N
+ EY L CH e n/a 14 1930 1949 1990 N
+ EY L CH i n/a 14 1930 1949 1990 N
+ EY L CH s n/a 14 1930 1949 1990 N
+ EY L D b n/a 14 1930 1967 1992 N
+ EY L D e n/a 14 1930 1967 1990 N
+ EY L D i n/a 14 1930 1967 1992 N
+ EY L D s n/a 14 1930 1967 1992 N
+ EY L DH b n/a 14 1930 1967 1998 N
+ EY L DH e n/a 14 1930 1967 1998 N
+ EY L DH i n/a 14 1930 1967 1998 N
+ EY L DH s n/a 14 1930 1967 1998 N
+ EY L EH b n/a 14 1931 1971 2011 N
+ EY L EH e n/a 14 1931 1971 2011 N
+ EY L EH i n/a 14 1931 1971 2011 N
+ EY L EH s n/a 14 1931 1971 2011 N
+ EY L ER b n/a 14 1931 1976 2016 N
+ EY L ER e n/a 14 1931 1976 2016 N
+ EY L ER i n/a 14 1931 1975 2016 N
+ EY L ER s n/a 14 1931 1976 2016 N
+ EY L EY e n/a 14 1931 1971 2011 N
+ EY L EY s n/a 14 1931 1971 2011 N
+ EY L F b n/a 14 1930 1949 2001 N
+ EY L F e n/a 14 1930 1949 2001 N
+ EY L F i n/a 14 1930 1949 2001 N
+ EY L F s n/a 14 1930 1949 2001 N
+ EY L G b n/a 14 1930 1953 1993 N
+ EY L G e n/a 14 1930 1953 1993 N
+ EY L G i n/a 14 1930 1953 1993 N
+ EY L G s n/a 14 1930 1953 1993 N
+ EY L HH b n/a 14 1930 1949 2004 N
+ EY L HH e n/a 14 1930 1949 2004 N
+ EY L HH i n/a 14 1930 1949 2004 N
+ EY L HH s n/a 14 1930 1949 2004 N
+ EY L IH e n/a 14 1931 1971 2011 N
+ EY L IH i n/a 14 1931 1970 2010 N
+ EY L IH s n/a 14 1931 1971 2011 N
+ EY L IY b n/a 14 1931 1971 2011 N
+ EY L IY e n/a 14 1931 1971 2011 N
+ EY L IY i n/a 14 1931 1970 2010 N
+ EY L IY s n/a 14 1931 1971 2011 N
+ EY L JH b n/a 14 1930 1967 1991 N
+ EY L JH e n/a 14 1930 1967 1991 N
+ EY L JH i n/a 14 1930 1967 1991 N
+ EY L JH s n/a 14 1930 1967 1991 N
+ EY L K b n/a 14 1930 1953 1993 N
+ EY L K e n/a 14 1930 1953 1993 N
+ EY L K i n/a 14 1930 1953 1993 N
+ EY L K s n/a 14 1930 1953 1993 N
+ EY L L b n/a 14 1931 1976 2013 N
+ EY L L e n/a 14 1931 1976 2013 N
+ EY L L i n/a 14 1931 1975 2017 N
+ EY L L s n/a 14 1931 1976 2013 N
+ EY L M b n/a 14 1931 1979 2007 N
+ EY L M e n/a 14 1931 1978 2009 N
+ EY L M i n/a 14 1931 1979 2007 N
+ EY L M s n/a 14 1931 1979 2007 N
+ EY L N b n/a 14 1931 1979 2005 N
+ EY L N e n/a 14 1931 1978 2006 N
+ EY L N i n/a 14 1931 1979 2005 N
+ EY L N s n/a 14 1931 1979 2006 N
+ EY L NG b n/a 14 1931 1979 2005 N
+ EY L NG e n/a 14 1931 1978 2006 N
+ EY L NG i n/a 14 1931 1979 2005 N
+ EY L NG s n/a 14 1931 1979 2006 N
+ EY L OW b n/a 14 1931 1976 2015 N
+ EY L OW e n/a 14 1931 1976 2015 N
+ EY L OW i n/a 14 1931 1975 2015 N
+ EY L OW s n/a 14 1931 1976 2015 N
+ EY L OY e n/a 14 1931 1971 2015 N
+ EY L OY s n/a 14 1931 1971 2015 N
+ EY L P b n/a 14 1930 1949 1996 N
+ EY L P e n/a 14 1930 1949 1996 N
+ EY L P i n/a 14 1930 1949 1996 N
+ EY L P s n/a 14 1930 1949 1996 N
+ EY L R b n/a 14 1931 1976 2013 N
+ EY L R e n/a 14 1931 1976 2013 N
+ EY L R i n/a 14 1931 1975 2016 N
+ EY L R s n/a 14 1931 1976 2013 N
+ EY L S b n/a 14 1930 1949 2000 N
+ EY L S e n/a 14 1930 1949 2000 N
+ EY L S i n/a 14 1930 1949 2000 N
+ EY L S s n/a 14 1930 1949 2000 N
+ EY L SH b n/a 14 1930 1949 2002 N
+ EY L SH e n/a 14 1930 1949 2002 N
+ EY L SH i n/a 14 1930 1949 2002 N
+ EY L SH s n/a 14 1930 1949 2002 N
+ EY L SIL e n/a 14 1934 1969 1997 N
+ EY L SIL s n/a 14 1934 1969 1997 N
+ EY L T b n/a 14 1930 1949 1989 N
+ EY L T e n/a 14 1930 1949 1990 N
+ EY L T i n/a 14 1930 1949 1990 N
+ EY L T s n/a 14 1930 1949 1990 N
+ EY L TH b n/a 14 1930 1949 2001 N
+ EY L TH e n/a 14 1930 1949 2001 N
+ EY L TH i n/a 14 1930 1949 2001 N
+ EY L TH s n/a 14 1930 1949 2001 N
+ EY L UH e n/a 14 1931 1976 2016 N
+ EY L UH s n/a 14 1931 1976 2016 N
+ EY L UW e n/a 14 1931 1976 2015 N
+ EY L UW s n/a 14 1931 1976 2015 N
+ EY L V b n/a 14 1930 1966 1995 N
+ EY L V e n/a 14 1930 1966 1995 N
+ EY L V i n/a 14 1930 1966 1995 N
+ EY L V s n/a 14 1930 1966 1995 N
+ EY L W b n/a 14 1931 1976 2013 N
+ EY L W e n/a 14 1931 1976 2013 N
+ EY L W i n/a 14 1931 1975 2017 N
+ EY L W s n/a 14 1931 1976 2013 N
+ EY L Y e n/a 14 1931 1972 2004 N
+ EY L Y i n/a 14 1931 1970 2004 N
+ EY L Y s n/a 14 1931 1972 2004 N
+ EY L Z b n/a 14 1930 1967 2003 N
+ EY L Z e n/a 14 1930 1967 2003 N
+ EY L Z i n/a 14 1930 1967 2003 N
+ EY L Z s n/a 14 1930 1967 2003 N
+ EY L ZH b n/a 14 1930 1967 2003 N
+ EY L ZH e n/a 14 1930 1967 2003 N
+ EY L ZH i n/a 14 1930 1967 2003 N
+ EY L ZH s n/a 14 1930 1967 2003 N
+ EY M AA e n/a 14 1943 1976 2015 N
+ EY M AA s n/a 14 1943 1976 2015 N
+ EY M AE e n/a 14 1943 1984 2011 N
+ EY M AE i n/a 14 1943 1984 2011 N
+ EY M AE s n/a 14 1943 1984 2011 N
+ EY M AH b n/a 14 1943 1985 2012 N
+ EY M AH e n/a 14 1943 1984 2012 N
+ EY M AH i n/a 14 1943 1984 2012 N
+ EY M AH s n/a 14 1943 1984 2012 N
+ EY M AO b n/a 14 1943 1976 2015 N
+ EY M AO e n/a 14 1943 1976 2015 N
+ EY M AO i n/a 14 1943 1975 2015 N
+ EY M AO s n/a 14 1943 1976 2015 N
+ EY M AW b n/a 14 1943 1976 2012 N
+ EY M AW e n/a 14 1943 1976 2012 N
+ EY M AW s n/a 14 1943 1976 2012 N
+ EY M AY b n/a 14 1943 1985 2015 N
+ EY M AY e n/a 14 1943 1984 2015 N
+ EY M AY s n/a 14 1943 1984 2015 N
+ EY M B b n/a 14 1943 1987 1996 N
+ EY M B e n/a 14 1943 1987 1996 N
+ EY M B i n/a 14 1943 1987 1996 N
+ EY M B s n/a 14 1943 1987 1996 N
+ EY M CH b n/a 14 1943 1985 1989 N
+ EY M CH e n/a 14 1943 1986 1988 N
+ EY M CH i n/a 14 1943 1986 1988 N
+ EY M CH s n/a 14 1943 1986 1988 N
+ EY M D b n/a 14 1943 1985 1992 N
+ EY M D e n/a 14 1943 1984 1990 N
+ EY M D i n/a 14 1943 1984 1992 N
+ EY M D s n/a 14 1943 1984 1992 N
+ EY M DH b n/a 14 1943 1985 1998 N
+ EY M DH e n/a 14 1943 1984 1998 N
+ EY M DH i n/a 14 1943 1984 1998 N
+ EY M DH s n/a 14 1943 1984 1998 N
+ EY M EH b n/a 14 1943 1985 2011 N
+ EY M EH e n/a 14 1943 1984 2011 N
+ EY M EH i n/a 14 1943 1984 2011 N
+ EY M EH s n/a 14 1943 1984 2011 N
+ EY M ER b n/a 14 1943 1976 2016 N
+ EY M ER e n/a 14 1943 1976 2016 N
+ EY M ER i n/a 14 1943 1975 2016 N
+ EY M ER s n/a 14 1943 1976 2016 N
+ EY M EY e n/a 14 1943 1984 2011 N
+ EY M EY s n/a 14 1943 1984 2011 N
+ EY M F b n/a 14 1943 1985 2001 N
+ EY M F e n/a 14 1943 1986 2001 N
+ EY M F i n/a 14 1943 1986 2001 N
+ EY M F s n/a 14 1943 1986 2001 N
+ EY M G b n/a 14 1942 1954 1993 N
+ EY M G e n/a 14 1942 1954 1993 N
+ EY M G i n/a 14 1942 1954 1993 N
+ EY M G s n/a 14 1942 1954 1993 N
+ EY M HH b n/a 14 1943 1985 2004 N
+ EY M HH e n/a 14 1943 1986 2004 N
+ EY M HH i n/a 14 1943 1986 2004 N
+ EY M HH s n/a 14 1943 1986 2004 N
+ EY M IH e n/a 14 1943 1984 2011 N
+ EY M IH i n/a 14 1943 1984 2010 N
+ EY M IH s n/a 14 1943 1984 2011 N
+ EY M IY b n/a 14 1943 1985 2011 N
+ EY M IY e n/a 14 1943 1984 2011 N
+ EY M IY i n/a 14 1943 1984 2010 N
+ EY M IY s n/a 14 1943 1984 2011 N
+ EY M JH b n/a 14 1943 1985 1991 N
+ EY M JH e n/a 14 1943 1984 1991 N
+ EY M JH i n/a 14 1943 1984 1991 N
+ EY M JH s n/a 14 1943 1984 1991 N
+ EY M K b n/a 14 1942 1954 1993 N
+ EY M K e n/a 14 1942 1954 1993 N
+ EY M K i n/a 14 1942 1954 1993 N
+ EY M K s n/a 14 1942 1954 1993 N
+ EY M L b n/a 14 1943 1976 2013 N
+ EY M L e n/a 14 1943 1976 2013 N
+ EY M L i n/a 14 1943 1975 2017 N
+ EY M L s n/a 14 1943 1976 2013 N
+ EY M M b n/a 14 1943 1983 2007 N
+ EY M M e n/a 14 1943 1983 2009 N
+ EY M M i n/a 14 1943 1983 2007 N
+ EY M M s n/a 14 1943 1983 2009 N
+ EY M N b n/a 14 1943 1983 2005 N
+ EY M N e n/a 14 1943 1983 2006 N
+ EY M N i n/a 14 1943 1983 2005 N
+ EY M N s n/a 14 1943 1983 2006 N
+ EY M NG b n/a 14 1942 1983 2005 N
+ EY M NG e n/a 14 1942 1983 2006 N
+ EY M NG i n/a 14 1942 1983 2005 N
+ EY M NG s n/a 14 1942 1983 2006 N
+ EY M OW b n/a 14 1943 1976 2015 N
+ EY M OW e n/a 14 1943 1976 2015 N
+ EY M OW i n/a 14 1943 1975 2015 N
+ EY M OW s n/a 14 1943 1976 2015 N
+ EY M OY e n/a 14 1943 1984 2015 N
+ EY M OY s n/a 14 1943 1984 2015 N
+ EY M P b n/a 14 1943 1987 1996 N
+ EY M P e n/a 14 1943 1987 1996 N
+ EY M P i n/a 14 1943 1987 1996 N
+ EY M P s n/a 14 1943 1987 1996 N
+ EY M R b n/a 14 1943 1976 2013 N
+ EY M R e n/a 14 1943 1976 2013 N
+ EY M R i n/a 14 1943 1975 2016 N
+ EY M R s n/a 14 1943 1976 2013 N
+ EY M S b n/a 14 1943 1985 2000 N
+ EY M S e n/a 14 1943 1986 2000 N
+ EY M S i n/a 14 1943 1986 2000 N
+ EY M S s n/a 14 1943 1986 2000 N
+ EY M SH b n/a 14 1942 1985 2002 N
+ EY M SH e n/a 14 1942 1986 2002 N
+ EY M SH i n/a 14 1942 1986 2002 N
+ EY M SH s n/a 14 1942 1986 2002 N
+ EY M SIL e n/a 14 1943 1984 1997 N
+ EY M SIL s n/a 14 1943 1984 1997 N
+ EY M T b n/a 14 1943 1985 1989 N
+ EY M T e n/a 14 1943 1986 1990 N
+ EY M T i n/a 14 1943 1986 1990 N
+ EY M T s n/a 14 1943 1986 1990 N
+ EY M TH b n/a 14 1943 1985 2001 N
+ EY M TH e n/a 14 1943 1986 2001 N
+ EY M TH i n/a 14 1943 1986 2001 N
+ EY M TH s n/a 14 1943 1986 2001 N
+ EY M UH e n/a 14 1943 1976 2016 N
+ EY M UH s n/a 14 1943 1976 2016 N
+ EY M UW e n/a 14 1943 1976 2015 N
+ EY M UW s n/a 14 1943 1976 2015 N
+ EY M V b n/a 14 1943 1985 1995 N
+ EY M V e n/a 14 1943 1984 1995 N
+ EY M V i n/a 14 1943 1984 1995 N
+ EY M V s n/a 14 1943 1984 1995 N
+ EY M W b n/a 14 1943 1976 2013 N
+ EY M W e n/a 14 1943 1976 2013 N
+ EY M W i n/a 14 1943 1975 2017 N
+ EY M W s n/a 14 1943 1976 2013 N
+ EY M Y e n/a 14 1942 1984 2004 N
+ EY M Y i n/a 14 1942 1984 2004 N
+ EY M Y s n/a 14 1942 1984 2004 N
+ EY M Z b n/a 14 1943 1985 2003 N
+ EY M Z e n/a 14 1943 1984 2003 N
+ EY M Z i n/a 14 1943 1984 2003 N
+ EY M Z s n/a 14 1943 1984 2003 N
+ EY M ZH b n/a 14 1942 1985 2003 N
+ EY M ZH e n/a 14 1942 1984 2003 N
+ EY M ZH i n/a 14 1942 1984 2003 N
+ EY M ZH s n/a 14 1942 1984 2003 N
+ EY N AA e n/a 14 1940 1976 2015 N
+ EY N AA s n/a 14 1941 1976 2015 N
+ EY N AE e n/a 14 1940 1984 2011 N
+ EY N AE i n/a 14 1940 1984 2011 N
+ EY N AE s n/a 14 1941 1984 2011 N
+ EY N AH b n/a 14 1941 1985 2012 N
+ EY N AH e n/a 14 1940 1984 2012 N
+ EY N AH i n/a 14 1940 1984 2012 N
+ EY N AH s n/a 14 1941 1984 2012 N
+ EY N AO b n/a 14 1941 1976 2015 N
+ EY N AO e n/a 14 1940 1976 2015 N
+ EY N AO s n/a 14 1941 1976 2015 N
+ EY N AW b n/a 14 1941 1976 2012 N
+ EY N AW e n/a 14 1940 1976 2012 N
+ EY N AW s n/a 14 1941 1976 2012 N
+ EY N AY b n/a 14 1941 1985 2015 N
+ EY N AY e n/a 14 1940 1984 2015 N
+ EY N AY s n/a 14 1941 1984 2015 N
+ EY N B b n/a 14 1941 1987 1994 N
+ EY N B e n/a 14 1940 1987 1996 N
+ EY N B i n/a 14 1940 1987 1994 N
+ EY N B s n/a 14 1941 1987 1994 N
+ EY N CH b n/a 14 1941 1985 1989 N
+ EY N CH e n/a 14 1940 1986 1988 N
+ EY N CH i n/a 14 1940 1986 1988 N
+ EY N CH s n/a 14 1941 1986 1988 N
+ EY N D b n/a 14 1941 1985 1992 N
+ EY N D e n/a 14 1940 1984 1990 N
+ EY N D i n/a 14 1940 1984 1992 N
+ EY N D s n/a 14 1941 1984 1992 N
+ EY N DH b n/a 14 1941 1985 1998 N
+ EY N DH e n/a 14 1940 1984 1998 N
+ EY N DH i n/a 14 1940 1984 1998 N
+ EY N DH s n/a 14 1941 1984 1998 N
+ EY N EH b n/a 14 1941 1985 2011 N
+ EY N EH e n/a 14 1940 1984 2011 N
+ EY N EH s n/a 14 1941 1984 2011 N
+ EY N ER b n/a 14 1941 1976 2016 N
+ EY N ER e n/a 14 1940 1976 2016 N
+ EY N ER i n/a 14 1940 1975 2016 N
+ EY N ER s n/a 14 1941 1976 2016 N
+ EY N EY e n/a 14 1940 1984 2011 N
+ EY N EY i n/a 14 1940 1984 2011 N
+ EY N EY s n/a 14 1941 1984 2011 N
+ EY N F b n/a 14 1941 1985 2001 N
+ EY N F e n/a 14 1940 1986 2001 N
+ EY N F i n/a 14 1940 1986 2001 N
+ EY N F s n/a 14 1941 1986 2001 N
+ EY N G b n/a 14 1941 1954 1993 N
+ EY N G e n/a 14 1940 1954 1993 N
+ EY N G i n/a 14 1940 1954 1993 N
+ EY N G s n/a 14 1941 1954 1993 N
+ EY N HH b n/a 14 1941 1985 2004 N
+ EY N HH e n/a 14 1940 1986 2004 N
+ EY N HH i n/a 14 1940 1986 2004 N
+ EY N HH s n/a 14 1941 1986 2004 N
+ EY N IH e n/a 14 1940 1984 2011 N
+ EY N IH i n/a 14 1940 1984 2010 N
+ EY N IH s n/a 14 1941 1984 2011 N
+ EY N IY b n/a 14 1941 1985 2011 N
+ EY N IY e n/a 14 1940 1984 2011 N
+ EY N IY s n/a 14 1941 1984 2011 N
+ EY N JH b n/a 14 1941 1985 1991 N
+ EY N JH e n/a 14 1940 1984 1991 N
+ EY N JH i n/a 14 1940 1984 1991 N
+ EY N JH s n/a 14 1941 1984 1991 N
+ EY N K b n/a 14 1941 1954 1993 N
+ EY N K e n/a 14 1940 1954 1993 N
+ EY N K i n/a 14 1940 1954 1993 N
+ EY N K s n/a 14 1941 1954 1993 N
+ EY N L b n/a 14 1941 1976 2013 N
+ EY N L e n/a 14 1940 1976 2013 N
+ EY N L i n/a 14 1940 1975 2017 N
+ EY N L s n/a 14 1941 1976 2013 N
+ EY N M b n/a 14 1941 1983 2007 N
+ EY N M e n/a 14 1940 1983 2009 N
+ EY N M i n/a 14 1940 1983 2007 N
+ EY N M s n/a 14 1941 1983 2009 N
+ EY N N b n/a 14 1941 1983 2005 N
+ EY N N e n/a 14 1940 1983 2006 N
+ EY N N i n/a 14 1940 1983 2005 N
+ EY N N s n/a 14 1941 1983 2006 N
+ EY N NG b n/a 14 1941 1983 2005 N
+ EY N NG e n/a 14 1940 1983 2006 N
+ EY N NG s n/a 14 1941 1983 2006 N
+ EY N OW b n/a 14 1941 1976 2015 N
+ EY N OW e n/a 14 1940 1976 2015 N
+ EY N OW i n/a 14 1940 1975 2015 N
+ EY N OW s n/a 14 1941 1976 2015 N
+ EY N OY e n/a 14 1940 1984 2015 N
+ EY N OY s n/a 14 1941 1984 2015 N
+ EY N P b n/a 14 1941 1987 1996 N
+ EY N P e n/a 14 1940 1987 1996 N
+ EY N P i n/a 14 1940 1987 1996 N
+ EY N P s n/a 14 1941 1987 1996 N
+ EY N R b n/a 14 1941 1976 2013 N
+ EY N R e n/a 14 1940 1976 2013 N
+ EY N R i n/a 14 1940 1975 2016 N
+ EY N R s n/a 14 1941 1976 2013 N
+ EY N S b n/a 14 1941 1985 2000 N
+ EY N S e n/a 14 1940 1986 2000 N
+ EY N S i n/a 14 1940 1986 2000 N
+ EY N S s n/a 14 1941 1986 2000 N
+ EY N SH b n/a 14 1941 1985 2002 N
+ EY N SH e n/a 14 1940 1986 2002 N
+ EY N SH i n/a 14 1940 1986 2002 N
+ EY N SH s n/a 14 1941 1986 2002 N
+ EY N SIL e n/a 14 1940 1984 1997 N
+ EY N SIL s n/a 14 1941 1984 1997 N
+ EY N T b n/a 14 1941 1985 1989 N
+ EY N T e n/a 14 1940 1986 1990 N
+ EY N T i n/a 14 1940 1986 1990 N
+ EY N T s n/a 14 1941 1986 1990 N
+ EY N TH b n/a 14 1941 1985 2001 N
+ EY N TH e n/a 14 1940 1986 2001 N
+ EY N TH i n/a 14 1940 1986 2001 N
+ EY N TH s n/a 14 1941 1986 2001 N
+ EY N UH e n/a 14 1940 1976 2016 N
+ EY N UH s n/a 14 1941 1976 2016 N
+ EY N UW e n/a 14 1940 1976 2015 N
+ EY N UW s n/a 14 1941 1976 2015 N
+ EY N V b n/a 14 1941 1985 1995 N
+ EY N V e n/a 14 1940 1984 1995 N
+ EY N V i n/a 14 1940 1984 1995 N
+ EY N V s n/a 14 1941 1984 1995 N
+ EY N W b n/a 14 1941 1976 2013 N
+ EY N W e n/a 14 1940 1976 2013 N
+ EY N W s n/a 14 1941 1976 2013 N
+ EY N Y e n/a 14 1940 1984 2004 N
+ EY N Y i n/a 14 1940 1984 2004 N
+ EY N Y s n/a 14 1941 1984 2004 N
+ EY N Z b n/a 14 1941 1985 2003 N
+ EY N Z e n/a 14 1940 1984 2003 N
+ EY N Z i n/a 14 1940 1984 2003 N
+ EY N Z s n/a 14 1941 1984 2003 N
+ EY N ZH b n/a 14 1941 1985 2003 N
+ EY N ZH e n/a 14 1940 1984 2003 N
+ EY N ZH i n/a 14 1940 1984 2003 N
+ EY N ZH s n/a 14 1941 1984 2003 N
+ EY NG AA e n/a 14 1940 1976 2015 N
+ EY NG AA s n/a 14 1941 1976 2015 N
+ EY NG AE e n/a 14 1940 1984 2011 N
+ EY NG AE s n/a 14 1941 1984 2011 N
+ EY NG AH b n/a 14 1941 1985 2012 N
+ EY NG AH e n/a 14 1940 1984 2012 N
+ EY NG AH s n/a 14 1941 1984 2012 N
+ EY NG AO b n/a 14 1941 1976 2015 N
+ EY NG AO e n/a 14 1940 1976 2015 N
+ EY NG AO s n/a 14 1941 1976 2015 N
+ EY NG AW b n/a 14 1941 1976 2012 N
+ EY NG AW e n/a 14 1940 1976 2012 N
+ EY NG AW s n/a 14 1941 1976 2012 N
+ EY NG AY b n/a 14 1941 1985 2015 N
+ EY NG AY e n/a 14 1940 1984 2015 N
+ EY NG AY s n/a 14 1941 1984 2015 N
+ EY NG B b n/a 14 1941 1987 1994 N
+ EY NG B e n/a 14 1940 1987 1996 N
+ EY NG B s n/a 14 1941 1987 1994 N
+ EY NG CH b n/a 14 1941 1985 1989 N
+ EY NG CH e n/a 14 1940 1986 1988 N
+ EY NG CH s n/a 14 1941 1986 1988 N
+ EY NG D b n/a 14 1941 1985 1992 N
+ EY NG D e n/a 14 1940 1984 1990 N
+ EY NG D s n/a 14 1941 1984 1992 N
+ EY NG DH b n/a 14 1941 1985 1998 N
+ EY NG DH e n/a 14 1940 1984 1998 N
+ EY NG DH s n/a 14 1941 1984 1998 N
+ EY NG EH b n/a 14 1941 1985 2011 N
+ EY NG EH e n/a 14 1940 1984 2011 N
+ EY NG EH s n/a 14 1941 1984 2011 N
+ EY NG ER b n/a 14 1941 1976 2016 N
+ EY NG ER e n/a 14 1940 1976 2016 N
+ EY NG ER s n/a 14 1941 1976 2016 N
+ EY NG EY e n/a 14 1940 1984 2011 N
+ EY NG EY s n/a 14 1941 1984 2011 N
+ EY NG F b n/a 14 1941 1985 2001 N
+ EY NG F e n/a 14 1940 1986 2001 N
+ EY NG F s n/a 14 1941 1986 2001 N
+ EY NG G b n/a 14 1941 1954 1993 N
+ EY NG G e n/a 14 1940 1954 1993 N
+ EY NG G s n/a 14 1941 1954 1993 N
+ EY NG HH b n/a 14 1941 1985 2004 N
+ EY NG HH e n/a 14 1940 1986 2004 N
+ EY NG HH s n/a 14 1941 1986 2004 N
+ EY NG IH e n/a 14 1940 1984 2011 N
+ EY NG IH s n/a 14 1941 1984 2011 N
+ EY NG IY b n/a 14 1941 1985 2011 N
+ EY NG IY e n/a 14 1940 1984 2011 N
+ EY NG IY s n/a 14 1941 1984 2011 N
+ EY NG JH b n/a 14 1941 1985 1991 N
+ EY NG JH e n/a 14 1940 1984 1991 N
+ EY NG JH s n/a 14 1941 1984 1991 N
+ EY NG K b n/a 14 1941 1954 1993 N
+ EY NG K e n/a 14 1940 1954 1993 N
+ EY NG K i n/a 14 1940 1954 1993 N
+ EY NG K s n/a 14 1941 1954 1993 N
+ EY NG L b n/a 14 1941 1976 2013 N
+ EY NG L e n/a 14 1940 1976 2013 N
+ EY NG L i n/a 14 1940 1975 2017 N
+ EY NG L s n/a 14 1941 1976 2013 N
+ EY NG M b n/a 14 1941 1980 2007 N
+ EY NG M e n/a 14 1940 1980 2009 N
+ EY NG M s n/a 14 1941 1980 2009 N
+ EY NG N b n/a 14 1941 1980 2005 N
+ EY NG N e n/a 14 1940 1980 2006 N
+ EY NG N s n/a 14 1941 1980 2006 N
+ EY NG NG b n/a 14 1941 1980 2005 N
+ EY NG NG e n/a 14 1940 1980 2006 N
+ EY NG NG s n/a 14 1941 1980 2006 N
+ EY NG OW b n/a 14 1941 1976 2015 N
+ EY NG OW e n/a 14 1940 1976 2015 N
+ EY NG OW s n/a 14 1941 1976 2015 N
+ EY NG OY e n/a 14 1940 1984 2015 N
+ EY NG OY s n/a 14 1941 1984 2015 N
+ EY NG P b n/a 14 1941 1987 1996 N
+ EY NG P e n/a 14 1940 1987 1996 N
+ EY NG P s n/a 14 1941 1987 1996 N
+ EY NG R b n/a 14 1941 1976 2013 N
+ EY NG R e n/a 14 1940 1976 2013 N
+ EY NG R s n/a 14 1941 1976 2013 N
+ EY NG S b n/a 14 1941 1985 2000 N
+ EY NG S e n/a 14 1940 1986 2000 N
+ EY NG S s n/a 14 1941 1986 2000 N
+ EY NG SH b n/a 14 1941 1985 2002 N
+ EY NG SH e n/a 14 1940 1986 2002 N
+ EY NG SH s n/a 14 1941 1986 2002 N
+ EY NG SIL e n/a 14 1940 1984 1997 N
+ EY NG SIL s n/a 14 1941 1984 1997 N
+ EY NG T b n/a 14 1941 1985 1989 N
+ EY NG T e n/a 14 1940 1986 1990 N
+ EY NG T i n/a 14 1940 1986 1990 N
+ EY NG T s n/a 14 1941 1986 1990 N
+ EY NG TH b n/a 14 1941 1985 2001 N
+ EY NG TH e n/a 14 1940 1986 2001 N
+ EY NG TH s n/a 14 1941 1986 2001 N
+ EY NG UH e n/a 14 1940 1976 2016 N
+ EY NG UH s n/a 14 1941 1976 2016 N
+ EY NG UW e n/a 14 1940 1976 2015 N
+ EY NG UW i n/a 14 1940 1975 2015 N
+ EY NG UW s n/a 14 1941 1976 2015 N
+ EY NG V b n/a 14 1941 1985 1995 N
+ EY NG V e n/a 14 1940 1984 1995 N
+ EY NG V s n/a 14 1941 1984 1995 N
+ EY NG W b n/a 14 1941 1976 2013 N
+ EY NG W e n/a 14 1940 1976 2013 N
+ EY NG W s n/a 14 1941 1976 2013 N
+ EY NG Y e n/a 14 1940 1984 2004 N
+ EY NG Y s n/a 14 1941 1984 2004 N
+ EY NG Z b n/a 14 1941 1985 2003 N
+ EY NG Z e n/a 14 1940 1984 2003 N
+ EY NG Z s n/a 14 1941 1984 2003 N
+ EY NG ZH b n/a 14 1941 1985 2003 N
+ EY NG ZH e n/a 14 1940 1984 2003 N
+ EY NG ZH s n/a 14 1941 1984 2003 N
+ EY OW AA e n/a 14 1934 1976 2015 N
+ EY OW AA s n/a 14 1932 1976 2015 N
+ EY OW AE e n/a 14 1934 1971 2011 N
+ EY OW AE s n/a 14 1932 1971 2011 N
+ EY OW AH b n/a 14 1932 1971 2012 N
+ EY OW AH e n/a 14 1933 1971 2012 N
+ EY OW AH i n/a 14 1932 1971 2012 N
+ EY OW AH s n/a 14 1932 1971 2012 N
+ EY OW AO b n/a 14 1932 1976 2015 N
+ EY OW AO e n/a 14 1934 1976 2015 N
+ EY OW AO s n/a 14 1932 1976 2015 N
+ EY OW AW b n/a 14 1932 1976 2012 N
+ EY OW AW e n/a 14 1933 1976 2012 N
+ EY OW AW s n/a 14 1932 1976 2012 N
+ EY OW AY b n/a 14 1932 1971 2015 N
+ EY OW AY e n/a 14 1933 1971 2015 N
+ EY OW AY s n/a 14 1932 1971 2015 N
+ EY OW B b n/a 14 1932 1964 1994 N
+ EY OW B e n/a 14 1933 1964 1996 N
+ EY OW B s n/a 14 1932 1964 1994 N
+ EY OW CH b n/a 14 1932 1944 1989 N
+ EY OW CH e n/a 14 1933 1944 1990 N
+ EY OW CH s n/a 14 1932 1944 1990 N
+ EY OW D b n/a 14 1932 1962 1991 N
+ EY OW D e n/a 14 1933 1961 1990 N
+ EY OW D i n/a 14 1932 1962 1992 N
+ EY OW D s n/a 14 1932 1961 1992 N
+ EY OW DH b n/a 14 1932 1962 1998 N
+ EY OW DH e n/a 14 1933 1961 1998 N
+ EY OW DH s n/a 14 1932 1961 1998 N
+ EY OW EH b n/a 14 1932 1971 2011 N
+ EY OW EH e n/a 14 1933 1971 2011 N
+ EY OW EH i n/a 14 1932 1971 2011 N
+ EY OW EH s n/a 14 1932 1971 2011 N
+ EY OW ER b n/a 14 1932 1976 2016 N
+ EY OW ER e n/a 14 1933 1976 2016 N
+ EY OW ER s n/a 14 1932 1976 2016 N
+ EY OW EY e n/a 14 1934 1971 2011 N
+ EY OW EY i n/a 14 1932 1971 2011 N
+ EY OW EY s n/a 14 1932 1971 2011 N
+ EY OW F b n/a 14 1932 1944 2001 N
+ EY OW F e n/a 14 1933 1944 2001 N
+ EY OW F s n/a 14 1932 1944 2001 N
+ EY OW G b n/a 14 1932 1952 1993 N
+ EY OW G e n/a 14 1933 1952 1993 N
+ EY OW G i n/a 14 1932 1952 1993 N
+ EY OW G s n/a 14 1932 1952 1993 N
+ EY OW HH b n/a 14 1932 1944 2004 N
+ EY OW HH e n/a 14 1933 1944 2004 N
+ EY OW HH s n/a 14 1932 1944 2004 N
+ EY OW IH e n/a 14 1933 1971 2011 N
+ EY OW IH s n/a 14 1932 1971 2011 N
+ EY OW IY b n/a 14 1932 1971 2011 N
+ EY OW IY e n/a 14 1934 1971 2011 N
+ EY OW IY s n/a 14 1932 1971 2011 N
+ EY OW JH b n/a 14 1932 1962 1991 N
+ EY OW JH e n/a 14 1933 1961 1991 N
+ EY OW JH i n/a 14 1932 1962 1991 N
+ EY OW JH s n/a 14 1932 1961 1991 N
+ EY OW K b n/a 14 1932 1952 1993 N
+ EY OW K e n/a 14 1933 1952 1993 N
+ EY OW K i n/a 14 1932 1952 1993 N
+ EY OW K s n/a 14 1932 1952 1993 N
+ EY OW L b n/a 14 1932 1976 2013 N
+ EY OW L e n/a 14 1933 1976 2013 N
+ EY OW L s n/a 14 1932 1976 2013 N
+ EY OW M b n/a 14 1932 1979 2007 N
+ EY OW M e n/a 14 1933 1978 2009 N
+ EY OW M i n/a 14 1932 1979 2007 N
+ EY OW M s n/a 14 1932 1979 2007 N
+ EY OW N b n/a 14 1932 1979 2005 N
+ EY OW N e n/a 14 1933 1978 2006 N
+ EY OW N i n/a 14 1932 1979 2005 N
+ EY OW N s n/a 14 1932 1979 2006 N
+ EY OW NG b n/a 14 1932 1979 2005 N
+ EY OW NG e n/a 14 1933 1978 2006 N
+ EY OW NG s n/a 14 1932 1979 2006 N
+ EY OW OW b n/a 14 1932 1976 2015 N
+ EY OW OW e n/a 14 1933 1976 2015 N
+ EY OW OW s n/a 14 1932 1976 2015 N
+ EY OW OY e n/a 14 1933 1971 2015 N
+ EY OW OY s n/a 14 1932 1971 2015 N
+ EY OW P b n/a 14 1932 1944 1996 N
+ EY OW P e n/a 14 1933 1944 1996 N
+ EY OW P s n/a 14 1932 1944 1996 N
+ EY OW R b n/a 14 1932 1976 2013 N
+ EY OW R e n/a 14 1933 1976 2013 N
+ EY OW R s n/a 14 1932 1976 2013 N
+ EY OW S b n/a 14 1932 1944 2000 N
+ EY OW S e n/a 14 1933 1944 2000 N
+ EY OW S i n/a 14 1932 1949 2000 N
+ EY OW S s n/a 14 1932 1944 2000 N
+ EY OW SH b n/a 14 1932 1944 2002 N
+ EY OW SH e n/a 14 1933 1944 2002 N
+ EY OW SH i n/a 14 1932 1949 2002 N
+ EY OW SH s n/a 14 1932 1944 2002 N
+ EY OW SIL e n/a 14 1934 1969 1997 N
+ EY OW SIL s n/a 14 1934 1972 1997 N
+ EY OW T b n/a 14 1932 1944 1989 N
+ EY OW T e n/a 14 1933 1944 1990 N
+ EY OW T i n/a 14 1932 1949 1990 N
+ EY OW T s n/a 14 1932 1944 1990 N
+ EY OW TH b n/a 14 1932 1944 2001 N
+ EY OW TH e n/a 14 1933 1944 2001 N
+ EY OW TH s n/a 14 1932 1944 2001 N
+ EY OW UH e n/a 14 1933 1976 2016 N
+ EY OW UH s n/a 14 1932 1976 2016 N
+ EY OW UW e n/a 14 1934 1976 2015 N
+ EY OW UW s n/a 14 1932 1976 2015 N
+ EY OW V b n/a 14 1932 1964 1995 N
+ EY OW V e n/a 14 1933 1964 1995 N
+ EY OW V s n/a 14 1932 1964 1995 N
+ EY OW W b n/a 14 1932 1976 2013 N
+ EY OW W e n/a 14 1933 1976 2013 N
+ EY OW W s n/a 14 1932 1976 2013 N
+ EY OW Y e n/a 14 1933 1972 2004 N
+ EY OW Y s n/a 14 1932 1972 2004 N
+ EY OW Z b n/a 14 1932 1962 2003 N
+ EY OW Z e n/a 14 1933 1961 2003 N
+ EY OW Z i n/a 14 1932 1962 2003 N
+ EY OW Z s n/a 14 1932 1962 2003 N
+ EY OW ZH b n/a 14 1932 1962 2003 N
+ EY OW ZH e n/a 14 1933 1961 2003 N
+ EY OW ZH i n/a 14 1932 1962 2003 N
+ EY OW ZH s n/a 14 1932 1961 2003 N
+ EY OY AA s n/a 14 1926 1976 2015 N
+ EY OY AE s n/a 14 1926 1971 2011 N
+ EY OY AH b n/a 14 1926 1971 2012 N
+ EY OY AH s n/a 14 1926 1971 2012 N
+ EY OY AO b n/a 14 1926 1976 2015 N
+ EY OY AO s n/a 14 1926 1976 2015 N
+ EY OY AW b n/a 14 1926 1976 2012 N
+ EY OY AW s n/a 14 1926 1976 2012 N
+ EY OY AY b n/a 14 1926 1971 2015 N
+ EY OY AY s n/a 14 1926 1971 2015 N
+ EY OY B b n/a 14 1926 1964 1994 N
+ EY OY B s n/a 14 1926 1964 1994 N
+ EY OY CH b n/a 14 1926 1955 1989 N
+ EY OY CH s n/a 14 1926 1956 1988 N
+ EY OY D b n/a 14 1926 1962 1991 N
+ EY OY D s n/a 14 1926 1961 1992 N
+ EY OY DH b n/a 14 1926 1962 1998 N
+ EY OY DH s n/a 14 1926 1961 1998 N
+ EY OY EH b n/a 14 1926 1971 2011 N
+ EY OY EH s n/a 14 1926 1971 2011 N
+ EY OY ER b n/a 14 1926 1976 2016 N
+ EY OY ER s n/a 14 1926 1976 2016 N
+ EY OY EY s n/a 14 1926 1971 2011 N
+ EY OY F b n/a 14 1926 1955 2001 N
+ EY OY F s n/a 14 1926 1956 2001 N
+ EY OY G b n/a 14 1926 1952 1993 N
+ EY OY G s n/a 14 1926 1952 1993 N
+ EY OY HH b n/a 14 1926 1955 2004 N
+ EY OY HH s n/a 14 1926 1956 2004 N
+ EY OY IH s n/a 14 1926 1971 2011 N
+ EY OY IY b n/a 14 1926 1971 2011 N
+ EY OY IY s n/a 14 1926 1971 2011 N
+ EY OY JH b n/a 14 1926 1962 1991 N
+ EY OY JH s n/a 14 1926 1961 1991 N
+ EY OY K b n/a 14 1926 1952 1993 N
+ EY OY K s n/a 14 1926 1952 1993 N
+ EY OY L b n/a 14 1926 1976 2013 N
+ EY OY L s n/a 14 1926 1976 2013 N
+ EY OY M b n/a 14 1926 1981 2007 N
+ EY OY M s n/a 14 1926 1981 2007 N
+ EY OY N b n/a 14 1926 1981 2005 N
+ EY OY N s n/a 14 1926 1981 2006 N
+ EY OY NG b n/a 14 1926 1981 2005 N
+ EY OY NG s n/a 14 1926 1981 2006 N
+ EY OY OW b n/a 14 1926 1976 2015 N
+ EY OY OW s n/a 14 1926 1976 2015 N
+ EY OY OY s n/a 14 1926 1971 2015 N
+ EY OY P b n/a 14 1926 1955 1996 N
+ EY OY P s n/a 14 1926 1956 1996 N
+ EY OY R b n/a 14 1926 1976 2013 N
+ EY OY R s n/a 14 1926 1976 2013 N
+ EY OY S b n/a 14 1926 1955 2000 N
+ EY OY S s n/a 14 1926 1956 2000 N
+ EY OY SH b n/a 14 1926 1955 2002 N
+ EY OY SH s n/a 14 1926 1956 2002 N
+ EY OY SIL s n/a 14 1926 1972 1997 N
+ EY OY T b n/a 14 1926 1955 1989 N
+ EY OY T s n/a 14 1926 1956 1990 N
+ EY OY TH b n/a 14 1926 1955 2001 N
+ EY OY TH s n/a 14 1926 1956 2001 N
+ EY OY UH s n/a 14 1926 1976 2016 N
+ EY OY UW s n/a 14 1926 1976 2015 N
+ EY OY V b n/a 14 1926 1964 1995 N
+ EY OY V s n/a 14 1926 1964 1995 N
+ EY OY W b n/a 14 1926 1976 2013 N
+ EY OY W s n/a 14 1926 1976 2013 N
+ EY OY Y s n/a 14 1926 1972 2004 N
+ EY OY Z b n/a 14 1926 1962 2003 N
+ EY OY Z s n/a 14 1926 1962 2003 N
+ EY OY ZH b n/a 14 1926 1962 2003 N
+ EY OY ZH s n/a 14 1926 1961 2003 N
+ EY P AA e n/a 14 1909 1976 2015 N
+ EY P AA s n/a 14 1910 1976 2015 N
+ EY P AE e n/a 14 1909 1971 2011 N
+ EY P AE s n/a 14 1910 1971 2011 N
+ EY P AH b n/a 14 1910 1971 2012 N
+ EY P AH e n/a 14 1909 1971 2012 N
+ EY P AH i n/a 14 1905 1971 2012 N
+ EY P AH s n/a 14 1910 1971 2012 N
+ EY P AO b n/a 14 1910 1976 2015 N
+ EY P AO e n/a 14 1909 1976 2015 N
+ EY P AO i n/a 14 1905 1974 2015 N
+ EY P AO s n/a 14 1910 1976 2015 N
+ EY P AW b n/a 14 1910 1976 2012 N
+ EY P AW e n/a 14 1909 1976 2012 N
+ EY P AW i n/a 14 1905 1974 2012 N
+ EY P AW s n/a 14 1910 1976 2012 N
+ EY P AY b n/a 14 1910 1971 2015 N
+ EY P AY e n/a 14 1909 1971 2015 N
+ EY P AY s n/a 14 1910 1971 2015 N
+ EY P B b n/a 14 1910 1964 1996 N
+ EY P B e n/a 14 1909 1964 1996 N
+ EY P B i n/a 14 1905 1964 1996 N
+ EY P B s n/a 14 1910 1964 1996 N
+ EY P CH b n/a 14 1910 1958 1989 N
+ EY P CH e n/a 14 1909 1957 1988 N
+ EY P CH i n/a 14 1905 1957 1988 N
+ EY P CH s n/a 14 1910 1957 1988 N
+ EY P D b n/a 14 1905 1962 1991 N
+ EY P D e n/a 14 1905 1961 1990 N
+ EY P D i n/a 14 1905 1962 1992 N
+ EY P D s n/a 14 1905 1961 1992 N
+ EY P DH b n/a 14 1910 1962 1998 N
+ EY P DH e n/a 14 1909 1961 1998 N
+ EY P DH s n/a 14 1910 1961 1998 N
+ EY P EH b n/a 14 1910 1971 2011 N
+ EY P EH e n/a 14 1909 1971 2011 N
+ EY P EH i n/a 14 1905 1971 2011 N
+ EY P EH s n/a 14 1910 1971 2011 N
+ EY P ER b n/a 14 1910 1976 2016 N
+ EY P ER e n/a 14 1909 1976 2016 N
+ EY P ER i n/a 14 1905 1974 2016 N
+ EY P ER s n/a 14 1910 1976 2016 N
+ EY P EY e n/a 14 1909 1971 2011 N
+ EY P EY s n/a 14 1910 1971 2011 N
+ EY P F b n/a 14 1910 1958 2001 N
+ EY P F e n/a 14 1909 1957 2001 N
+ EY P F s n/a 14 1910 1957 2001 N
+ EY P G b n/a 14 1910 1952 1993 N
+ EY P G e n/a 14 1909 1952 1993 N
+ EY P G i n/a 14 1904 1952 1993 N
+ EY P G s n/a 14 1910 1952 1993 N
+ EY P HH b n/a 14 1910 1958 2004 N
+ EY P HH e n/a 14 1909 1957 2004 N
+ EY P HH s n/a 14 1910 1957 2004 N
+ EY P IH e n/a 14 1909 1971 2011 N
+ EY P IH i n/a 14 1905 1970 2010 N
+ EY P IH s n/a 14 1910 1971 2011 N
+ EY P IY b n/a 14 1910 1971 2011 N
+ EY P IY e n/a 14 1909 1971 2011 N
+ EY P IY i n/a 14 1905 1970 2010 N
+ EY P IY s n/a 14 1910 1971 2011 N
+ EY P JH b n/a 14 1910 1962 1991 N
+ EY P JH e n/a 14 1909 1961 1991 N
+ EY P JH i n/a 14 1905 1962 1991 N
+ EY P JH s n/a 14 1910 1961 1991 N
+ EY P K b n/a 14 1910 1952 1993 N
+ EY P K e n/a 14 1909 1952 1993 N
+ EY P K i n/a 14 1904 1952 1993 N
+ EY P K s n/a 14 1910 1952 1993 N
+ EY P L b n/a 14 1910 1976 2013 N
+ EY P L e n/a 14 1909 1976 2013 N
+ EY P L i n/a 14 1905 1974 2017 N
+ EY P L s n/a 14 1910 1976 2013 N
+ EY P M b n/a 14 1909 1981 2008 N
+ EY P M e n/a 14 1909 1981 2009 N
+ EY P M i n/a 14 1909 1982 2008 N
+ EY P M s n/a 14 1909 1981 2009 N
+ EY P N b n/a 14 1909 1981 2005 N
+ EY P N e n/a 14 1909 1981 2006 N
+ EY P N i n/a 14 1909 1982 2005 N
+ EY P N s n/a 14 1909 1981 2006 N
+ EY P NG b n/a 14 1909 1981 2005 N
+ EY P NG e n/a 14 1909 1981 2006 N
+ EY P NG s n/a 14 1909 1981 2006 N
+ EY P OW b n/a 14 1910 1976 2015 N
+ EY P OW e n/a 14 1909 1976 2015 N
+ EY P OW i n/a 14 1905 1974 2015 N
+ EY P OW s n/a 14 1910 1976 2015 N
+ EY P OY e n/a 14 1909 1971 2015 N
+ EY P OY s n/a 14 1910 1971 2015 N
+ EY P P b n/a 14 1910 1959 1996 N
+ EY P P e n/a 14 1909 1959 1996 N
+ EY P P i n/a 14 1905 1959 1996 N
+ EY P P s n/a 14 1910 1959 1996 N
+ EY P R b n/a 14 1910 1976 2013 N
+ EY P R e n/a 14 1909 1976 2013 N
+ EY P R i n/a 14 1905 1974 2016 N
+ EY P R s n/a 14 1910 1976 2013 N
+ EY P S b n/a 14 1906 1958 1999 N
+ EY P S e n/a 14 1906 1957 1999 N
+ EY P S i n/a 14 1906 1957 1999 N
+ EY P S s n/a 14 1906 1957 1999 N
+ EY P SH b n/a 14 1910 1960 2002 N
+ EY P SH e n/a 14 1909 1960 2002 N
+ EY P SH i n/a 14 1905 1960 2002 N
+ EY P SH s n/a 14 1910 1960 2002 N
+ EY P SIL e n/a 14 1910 1968 1997 N
+ EY P SIL s n/a 14 1910 1972 1997 N
+ EY P T b n/a 14 1905 1958 1989 N
+ EY P T e n/a 14 1905 1957 1990 N
+ EY P T i n/a 14 1905 1957 1990 N
+ EY P T s n/a 14 1905 1957 1990 N
+ EY P TH b n/a 14 1910 1958 2001 N
+ EY P TH e n/a 14 1909 1957 2001 N
+ EY P TH i n/a 14 1905 1957 2001 N
+ EY P TH s n/a 14 1910 1957 2001 N
+ EY P UH e n/a 14 1909 1976 2016 N
+ EY P UH s n/a 14 1910 1976 2016 N
+ EY P UW e n/a 14 1909 1976 2015 N
+ EY P UW s n/a 14 1910 1976 2015 N
+ EY P V b n/a 14 1910 1964 1995 N
+ EY P V e n/a 14 1909 1964 1995 N
+ EY P V i n/a 14 1905 1964 1995 N
+ EY P V s n/a 14 1910 1964 1995 N
+ EY P W b n/a 14 1910 1976 2013 N
+ EY P W e n/a 14 1909 1976 2013 N
+ EY P W s n/a 14 1910 1976 2013 N
+ EY P Y e n/a 14 1909 1972 2004 N
+ EY P Y i n/a 14 1905 1970 2004 N
+ EY P Y s n/a 14 1910 1972 2004 N
+ EY P Z b n/a 14 1905 1962 2003 N
+ EY P Z e n/a 14 1905 1961 2003 N
+ EY P Z i n/a 14 1905 1962 2003 N
+ EY P Z s n/a 14 1905 1962 2003 N
+ EY P ZH b n/a 14 1910 1962 2003 N
+ EY P ZH e n/a 14 1909 1961 2003 N
+ EY P ZH i n/a 14 1905 1962 2003 N
+ EY P ZH s n/a 14 1910 1961 2003 N
+ EY R AA e n/a 14 1938 1976 2015 N
+ EY R AA i n/a 14 1938 1975 2015 N
+ EY R AA s n/a 14 1939 1976 2015 N
+ EY R AE e n/a 14 1938 1971 2011 N
+ EY R AE s n/a 14 1939 1971 2011 N
+ EY R AH b n/a 14 1939 1971 2012 N
+ EY R AH e n/a 14 1938 1971 2012 N
+ EY R AH i n/a 14 1938 1971 2012 N
+ EY R AH s n/a 14 1939 1971 2012 N
+ EY R AO b n/a 14 1939 1976 2015 N
+ EY R AO e n/a 14 1938 1976 2015 N
+ EY R AO i n/a 14 1938 1975 2015 N
+ EY R AO s n/a 14 1939 1976 2015 N
+ EY R AW b n/a 14 1939 1976 2012 N
+ EY R AW e n/a 14 1938 1976 2012 N
+ EY R AW s n/a 14 1939 1976 2012 N
+ EY R AY b n/a 14 1939 1971 2015 N
+ EY R AY e n/a 14 1938 1971 2015 N
+ EY R AY s n/a 14 1939 1971 2015 N
+ EY R B b n/a 14 1939 1965 1994 N
+ EY R B e n/a 14 1938 1965 1996 N
+ EY R B i n/a 14 1935 1965 1994 N
+ EY R B s n/a 14 1939 1965 1994 N
+ EY R CH b n/a 14 1939 1947 1988 N
+ EY R CH e n/a 14 1938 1947 1988 N
+ EY R CH i n/a 14 1936 1947 1988 N
+ EY R CH s n/a 14 1939 1947 1988 N
+ EY R D b n/a 14 1939 1965 1992 N
+ EY R D e n/a 14 1938 1965 1988 N
+ EY R D i n/a 14 1935 1965 1992 N
+ EY R D s n/a 14 1939 1965 1992 N
+ EY R DH b n/a 14 1939 1965 1998 N
+ EY R DH e n/a 14 1938 1965 1998 N
+ EY R DH i n/a 14 1935 1965 1998 N
+ EY R DH s n/a 14 1939 1965 1998 N
+ EY R EH b n/a 14 1939 1971 2011 N
+ EY R EH e n/a 14 1938 1971 2011 N
+ EY R EH s n/a 14 1939 1971 2011 N
+ EY R ER b n/a 14 1939 1976 2016 N
+ EY R ER e n/a 14 1938 1976 2016 N
+ EY R ER i n/a 14 1938 1975 2016 N
+ EY R ER s n/a 14 1939 1976 2016 N
+ EY R EY e n/a 14 1938 1971 2011 N
+ EY R EY s n/a 14 1939 1971 2011 N
+ EY R F b n/a 14 1939 1948 2001 N
+ EY R F e n/a 14 1938 1948 2001 N
+ EY R F i n/a 14 1936 1947 2001 N
+ EY R F s n/a 14 1939 1948 2001 N
+ EY R G b n/a 14 1939 1953 1993 N
+ EY R G e n/a 14 1938 1953 1993 N
+ EY R G i n/a 14 1936 1953 1993 N
+ EY R G s n/a 14 1939 1953 1993 N
+ EY R HH b n/a 14 1939 1948 2004 N
+ EY R HH e n/a 14 1938 1948 2004 N
+ EY R HH i n/a 14 1936 1947 2004 N
+ EY R HH s n/a 14 1939 1948 2004 N
+ EY R IH e n/a 14 1938 1971 2011 N
+ EY R IH i n/a 14 1938 1970 2010 N
+ EY R IH s n/a 14 1939 1971 2011 N
+ EY R IY b n/a 14 1939 1971 2011 N
+ EY R IY e n/a 14 1938 1971 2011 N
+ EY R IY i n/a 14 1938 1970 2010 N
+ EY R IY s n/a 14 1939 1971 2011 N
+ EY R JH b n/a 14 1939 1965 1991 N
+ EY R JH e n/a 14 1938 1965 1991 N
+ EY R JH i n/a 14 1935 1965 1991 N
+ EY R JH s n/a 14 1939 1965 1991 N
+ EY R K b n/a 14 1939 1953 1993 N
+ EY R K e n/a 14 1938 1953 1993 N
+ EY R K i n/a 14 1936 1953 1993 N
+ EY R K s n/a 14 1939 1953 1993 N
+ EY R L b n/a 14 1939 1976 2013 N
+ EY R L e n/a 14 1938 1976 2013 N
+ EY R L i n/a 14 1938 1975 2017 N
+ EY R L s n/a 14 1938 1976 2013 N
+ EY R M b n/a 14 1939 1979 2007 N
+ EY R M e n/a 14 1938 1979 2009 N
+ EY R M i n/a 14 1937 1979 2007 N
+ EY R M s n/a 14 1939 1979 2007 N
+ EY R N b n/a 14 1939 1979 2005 N
+ EY R N e n/a 14 1938 1979 2006 N
+ EY R N i n/a 14 1937 1979 2005 N
+ EY R N s n/a 14 1939 1979 2006 N
+ EY R NG b n/a 14 1939 1979 2005 N
+ EY R NG e n/a 14 1938 1979 2006 N
+ EY R NG i n/a 14 1937 1979 2005 N
+ EY R NG s n/a 14 1939 1979 2006 N
+ EY R OW b n/a 14 1939 1976 2015 N
+ EY R OW e n/a 14 1938 1976 2015 N
+ EY R OW i n/a 14 1938 1975 2015 N
+ EY R OW s n/a 14 1939 1976 2015 N
+ EY R OY e n/a 14 1938 1971 2015 N
+ EY R OY i n/a 14 1938 1971 2015 N
+ EY R OY s n/a 14 1939 1971 2015 N
+ EY R P b n/a 14 1939 1947 1996 N
+ EY R P e n/a 14 1938 1947 1996 N
+ EY R P i n/a 14 1936 1947 1996 N
+ EY R P s n/a 14 1939 1947 1996 N
+ EY R R b n/a 14 1939 1976 2013 N
+ EY R R e n/a 14 1938 1976 2013 N
+ EY R R i n/a 14 1938 1975 2016 N
+ EY R R s n/a 14 1938 1976 2013 N
+ EY R S b n/a 14 1939 1948 2000 N
+ EY R S e n/a 14 1938 1948 2000 N
+ EY R S i n/a 14 1936 1947 2000 N
+ EY R S s n/a 14 1939 1948 2000 N
+ EY R SH b n/a 14 1939 1948 2002 N
+ EY R SH e n/a 14 1938 1948 2002 N
+ EY R SH i n/a 14 1936 1948 2002 N
+ EY R SH s n/a 14 1939 1948 2002 N
+ EY R SIL e n/a 14 1938 1969 1997 N
+ EY R SIL s n/a 14 1939 1969 1997 N
+ EY R T b n/a 14 1939 1947 1988 N
+ EY R T e n/a 14 1938 1947 1988 N
+ EY R T i n/a 14 1936 1947 1988 N
+ EY R T s n/a 14 1939 1947 1988 N
+ EY R TH b n/a 14 1939 1948 2001 N
+ EY R TH e n/a 14 1938 1948 2001 N
+ EY R TH i n/a 14 1936 1947 2001 N
+ EY R TH s n/a 14 1939 1948 2001 N
+ EY R UH e n/a 14 1938 1976 2016 N
+ EY R UH s n/a 14 1939 1976 2016 N
+ EY R UW e n/a 14 1938 1976 2015 N
+ EY R UW s n/a 14 1939 1976 2015 N
+ EY R V b n/a 14 1939 1965 1995 N
+ EY R V e n/a 14 1938 1965 1995 N
+ EY R V i n/a 14 1935 1965 1995 N
+ EY R V s n/a 14 1939 1965 1995 N
+ EY R W b n/a 14 1939 1976 2013 N
+ EY R W e n/a 14 1938 1976 2013 N
+ EY R W i n/a 14 1938 1975 2017 N
+ EY R W s n/a 14 1939 1976 2013 N
+ EY R Y e n/a 14 1938 1972 2004 N
+ EY R Y i n/a 14 1938 1970 2004 N
+ EY R Y s n/a 14 1939 1972 2004 N
+ EY R Z b n/a 14 1939 1965 2003 N
+ EY R Z e n/a 14 1938 1965 2003 N
+ EY R Z i n/a 14 1935 1965 2003 N
+ EY R Z s n/a 14 1939 1965 2003 N
+ EY R ZH b n/a 14 1939 1965 2003 N
+ EY R ZH e n/a 14 1938 1965 2003 N
+ EY R ZH i n/a 14 1935 1965 2003 N
+ EY R ZH s n/a 14 1939 1965 2003 N
+ EY S AA e n/a 14 1916 1976 2015 N
+ EY S AA i n/a 14 1916 1975 2015 N
+ EY S AA s n/a 14 1916 1976 2015 N
+ EY S AE e n/a 14 1916 1971 2011 N
+ EY S AE s n/a 14 1916 1971 2011 N
+ EY S AH b n/a 14 1916 1971 2012 N
+ EY S AH e n/a 14 1916 1971 2012 N
+ EY S AH i n/a 14 1916 1971 2012 N
+ EY S AH s n/a 14 1916 1971 2012 N
+ EY S AO b n/a 14 1916 1976 2015 N
+ EY S AO e n/a 14 1916 1976 2015 N
+ EY S AO s n/a 14 1916 1976 2015 N
+ EY S AW b n/a 14 1916 1976 2012 N
+ EY S AW e n/a 14 1916 1976 2012 N
+ EY S AW s n/a 14 1916 1976 2012 N
+ EY S AY b n/a 14 1916 1971 2015 N
+ EY S AY e n/a 14 1916 1971 2015 N
+ EY S AY i n/a 14 1916 1971 2015 N
+ EY S AY s n/a 14 1916 1971 2015 N
+ EY S B b n/a 14 1913 1964 1994 N
+ EY S B e n/a 14 1916 1964 1996 N
+ EY S B i n/a 14 1913 1964 1994 N
+ EY S B s n/a 14 1913 1964 1994 N
+ EY S CH b n/a 14 1913 1944 1989 N
+ EY S CH e n/a 14 1916 1944 1988 N
+ EY S CH s n/a 14 1913 1944 1988 N
+ EY S D b n/a 14 1913 1962 1991 N
+ EY S D e n/a 14 1916 1961 1990 N
+ EY S D i n/a 14 1913 1962 1992 N
+ EY S D s n/a 14 1913 1961 1992 N
+ EY S DH b n/a 14 1913 1962 1998 N
+ EY S DH e n/a 14 1916 1961 1998 N
+ EY S DH s n/a 14 1913 1961 1998 N
+ EY S EH b n/a 14 1916 1971 2011 N
+ EY S EH e n/a 14 1916 1971 2011 N
+ EY S EH s n/a 14 1916 1971 2011 N
+ EY S ER b n/a 14 1916 1976 2016 N
+ EY S ER e n/a 14 1916 1976 2016 N
+ EY S ER i n/a 14 1916 1975 2016 N
+ EY S ER s n/a 14 1916 1976 2016 N
+ EY S EY e n/a 14 1916 1971 2011 N
+ EY S EY s n/a 14 1916 1971 2011 N
+ EY S F b n/a 14 1913 1944 2001 N
+ EY S F e n/a 14 1916 1944 2001 N
+ EY S F i n/a 14 1913 1944 2001 N
+ EY S F s n/a 14 1913 1944 2001 N
+ EY S G b n/a 14 1913 1952 1993 N
+ EY S G e n/a 14 1916 1952 1993 N
+ EY S G i n/a 14 1913 1952 1993 N
+ EY S G s n/a 14 1913 1952 1993 N
+ EY S HH b n/a 14 1913 1944 2004 N
+ EY S HH e n/a 14 1916 1944 2004 N
+ EY S HH s n/a 14 1913 1944 2004 N
+ EY S IH e n/a 14 1916 1971 2011 N
+ EY S IH i n/a 14 1916 1970 2010 N
+ EY S IH s n/a 14 1916 1971 2011 N
+ EY S IY b n/a 14 1916 1971 2011 N
+ EY S IY e n/a 14 1916 1971 2011 N
+ EY S IY i n/a 14 1916 1970 2010 N
+ EY S IY s n/a 14 1916 1971 2011 N
+ EY S JH b n/a 14 1913 1962 1991 N
+ EY S JH e n/a 14 1916 1961 1991 N
+ EY S JH i n/a 14 1913 1962 1991 N
+ EY S JH s n/a 14 1913 1961 1991 N
+ EY S K b n/a 14 1913 1952 1993 N
+ EY S K e n/a 14 1916 1952 1993 N
+ EY S K i n/a 14 1913 1952 1993 N
+ EY S K s n/a 14 1913 1952 1993 N
+ EY S L b n/a 14 1916 1976 2013 N
+ EY S L e n/a 14 1916 1976 2013 N
+ EY S L i n/a 14 1916 1975 2017 N
+ EY S L s n/a 14 1916 1976 2013 N
+ EY S M b n/a 14 1918 1978 2007 N
+ EY S M e n/a 14 1918 1978 2009 N
+ EY S M i n/a 14 1918 1977 2007 N
+ EY S M s n/a 14 1918 1978 2007 N
+ EY S N b n/a 14 1918 1978 2005 N
+ EY S N e n/a 14 1918 1978 2006 N
+ EY S N i n/a 14 1918 1977 2005 N
+ EY S N s n/a 14 1918 1978 2006 N
+ EY S NG b n/a 14 1918 1978 2005 N
+ EY S NG e n/a 14 1918 1978 2006 N
+ EY S NG i n/a 14 1918 1977 2005 N
+ EY S NG s n/a 14 1918 1978 2006 N
+ EY S OW b n/a 14 1916 1976 2015 N
+ EY S OW e n/a 14 1916 1976 2015 N
+ EY S OW i n/a 14 1916 1975 2015 N
+ EY S OW s n/a 14 1916 1976 2015 N
+ EY S OY e n/a 14 1916 1971 2015 N
+ EY S OY s n/a 14 1916 1971 2015 N
+ EY S P b n/a 14 1913 1944 1996 N
+ EY S P e n/a 14 1916 1944 1996 N
+ EY S P i n/a 14 1913 1944 1996 N
+ EY S P s n/a 14 1913 1944 1996 N
+ EY S R b n/a 14 1916 1976 2013 N
+ EY S R e n/a 14 1916 1976 2013 N
+ EY S R i n/a 14 1916 1975 2016 N
+ EY S R s n/a 14 1916 1976 2013 N
+ EY S S b n/a 14 1913 1944 1999 N
+ EY S S e n/a 14 1916 1944 1999 N
+ EY S S i n/a 14 1913 1944 1999 N
+ EY S S s n/a 14 1913 1944 1999 N
+ EY S SH b n/a 14 1913 1944 2002 N
+ EY S SH e n/a 14 1916 1944 2002 N
+ EY S SH i n/a 14 1913 1944 2002 N
+ EY S SH s n/a 14 1913 1944 2002 N
+ EY S SIL e n/a 14 1917 1968 1997 N
+ EY S SIL s n/a 14 1913 1972 1997 N
+ EY S T b n/a 14 1913 1944 1989 N
+ EY S T e n/a 14 1916 1944 1990 N
+ EY S T i n/a 14 1913 1944 1990 N
+ EY S T s n/a 14 1913 1944 1990 N
+ EY S TH b n/a 14 1913 1944 2001 N
+ EY S TH e n/a 14 1916 1944 2001 N
+ EY S TH i n/a 14 1913 1944 2001 N
+ EY S TH s n/a 14 1913 1944 2001 N
+ EY S UH e n/a 14 1916 1976 2016 N
+ EY S UH s n/a 14 1916 1976 2016 N
+ EY S UW e n/a 14 1916 1976 2015 N
+ EY S UW s n/a 14 1916 1976 2015 N
+ EY S V b n/a 14 1913 1964 1995 N
+ EY S V e n/a 14 1916 1964 1995 N
+ EY S V i n/a 14 1913 1964 1995 N
+ EY S V s n/a 14 1913 1964 1995 N
+ EY S W b n/a 14 1916 1976 2013 N
+ EY S W e n/a 14 1916 1976 2013 N
+ EY S W s n/a 14 1916 1976 2013 N
+ EY S Y e n/a 14 1916 1972 2004 N
+ EY S Y i n/a 14 1916 1970 2004 N
+ EY S Y s n/a 14 1916 1972 2004 N
+ EY S Z b n/a 14 1913 1962 2003 N
+ EY S Z e n/a 14 1916 1961 2003 N
+ EY S Z i n/a 14 1913 1962 2003 N
+ EY S Z s n/a 14 1913 1962 2003 N
+ EY S ZH b n/a 14 1913 1962 2003 N
+ EY S ZH e n/a 14 1916 1961 2003 N
+ EY S ZH s n/a 14 1913 1961 2003 N
+ EY SH AA e n/a 14 1916 1976 2015 N
+ EY SH AA s n/a 14 1914 1976 2015 N
+ EY SH AE e n/a 14 1916 1971 2011 N
+ EY SH AE s n/a 14 1914 1971 2011 N
+ EY SH AH b n/a 14 1914 1971 2012 N
+ EY SH AH e n/a 14 1916 1971 2012 N
+ EY SH AH s n/a 14 1914 1971 2012 N
+ EY SH AO b n/a 14 1914 1976 2015 N
+ EY SH AO e n/a 14 1916 1976 2015 N
+ EY SH AO s n/a 14 1914 1976 2015 N
+ EY SH AW b n/a 14 1914 1976 2012 N
+ EY SH AW e n/a 14 1916 1976 2012 N
+ EY SH AW s n/a 14 1914 1976 2012 N
+ EY SH AY b n/a 14 1914 1971 2015 N
+ EY SH AY e n/a 14 1916 1971 2015 N
+ EY SH AY s n/a 14 1914 1971 2015 N
+ EY SH B b n/a 14 1914 1964 1994 N
+ EY SH B e n/a 14 1916 1964 1996 N
+ EY SH B i n/a 14 1914 1964 1994 N
+ EY SH B s n/a 14 1914 1964 1994 N
+ EY SH CH b n/a 14 1914 1944 1989 N
+ EY SH CH e n/a 14 1916 1944 1988 N
+ EY SH CH i n/a 14 1914 1944 1988 N
+ EY SH CH s n/a 14 1914 1944 1988 N
+ EY SH D b n/a 14 1914 1962 1991 N
+ EY SH D e n/a 14 1916 1961 1990 N
+ EY SH D i n/a 14 1914 1962 1992 N
+ EY SH D s n/a 14 1914 1961 1992 N
+ EY SH DH b n/a 14 1914 1962 1998 N
+ EY SH DH e n/a 14 1916 1961 1998 N
+ EY SH DH s n/a 14 1914 1961 1998 N
+ EY SH EH b n/a 14 1914 1971 2011 N
+ EY SH EH e n/a 14 1916 1971 2011 N
+ EY SH EH i n/a 14 1914 1971 2011 N
+ EY SH EH s n/a 14 1914 1971 2011 N
+ EY SH ER b n/a 14 1914 1976 2016 N
+ EY SH ER e n/a 14 1916 1976 2016 N
+ EY SH ER i n/a 14 1914 1975 2016 N
+ EY SH ER s n/a 14 1914 1976 2016 N
+ EY SH EY e n/a 14 1916 1971 2011 N
+ EY SH EY s n/a 14 1914 1971 2011 N
+ EY SH F b n/a 14 1914 1944 2001 N
+ EY SH F e n/a 14 1916 1944 2001 N
+ EY SH F i n/a 14 1914 1944 2001 N
+ EY SH F s n/a 14 1914 1944 2001 N
+ EY SH G b n/a 14 1914 1952 1993 N
+ EY SH G e n/a 14 1916 1952 1993 N
+ EY SH G s n/a 14 1914 1952 1993 N
+ EY SH HH b n/a 14 1914 1944 2004 N
+ EY SH HH e n/a 14 1916 1944 2004 N
+ EY SH HH s n/a 14 1914 1944 2004 N
+ EY SH IH e n/a 14 1916 1971 2011 N
+ EY SH IH i n/a 14 1914 1970 2010 N
+ EY SH IH s n/a 14 1914 1971 2011 N
+ EY SH IY b n/a 14 1914 1971 2011 N
+ EY SH IY e n/a 14 1916 1971 2011 N
+ EY SH IY s n/a 14 1914 1971 2011 N
+ EY SH JH b n/a 14 1914 1962 1991 N
+ EY SH JH e n/a 14 1916 1961 1991 N
+ EY SH JH s n/a 14 1914 1961 1991 N
+ EY SH K b n/a 14 1914 1952 1993 N
+ EY SH K e n/a 14 1916 1952 1993 N
+ EY SH K i n/a 14 1914 1952 1993 N
+ EY SH K s n/a 14 1914 1952 1993 N
+ EY SH L b n/a 14 1914 1976 2013 N
+ EY SH L e n/a 14 1916 1976 2013 N
+ EY SH L i n/a 14 1914 1975 2017 N
+ EY SH L s n/a 14 1914 1976 2013 N
+ EY SH M b n/a 14 1918 1978 2007 N
+ EY SH M e n/a 14 1918 1978 2009 N
+ EY SH M i n/a 14 1918 1977 2007 N
+ EY SH M s n/a 14 1918 1978 2007 N
+ EY SH N b n/a 14 1918 1978 2005 N
+ EY SH N e n/a 14 1918 1978 2006 N
+ EY SH N i n/a 14 1918 1977 2005 N
+ EY SH N s n/a 14 1918 1978 2006 N
+ EY SH NG b n/a 14 1918 1978 2005 N
+ EY SH NG e n/a 14 1918 1978 2006 N
+ EY SH NG i n/a 14 1918 1977 2005 N
+ EY SH NG s n/a 14 1918 1978 2006 N
+ EY SH OW b n/a 14 1914 1976 2015 N
+ EY SH OW e n/a 14 1916 1976 2015 N
+ EY SH OW i n/a 14 1914 1975 2015 N
+ EY SH OW s n/a 14 1914 1976 2015 N
+ EY SH OY e n/a 14 1916 1971 2015 N
+ EY SH OY s n/a 14 1914 1971 2015 N
+ EY SH P b n/a 14 1914 1944 1996 N
+ EY SH P e n/a 14 1916 1944 1996 N
+ EY SH P i n/a 14 1914 1944 1996 N
+ EY SH P s n/a 14 1914 1944 1996 N
+ EY SH R b n/a 14 1914 1976 2013 N
+ EY SH R e n/a 14 1916 1976 2013 N
+ EY SH R i n/a 14 1914 1975 2016 N
+ EY SH R s n/a 14 1914 1976 2013 N
+ EY SH S b n/a 14 1914 1944 1999 N
+ EY SH S e n/a 14 1916 1944 1999 N
+ EY SH S i n/a 14 1914 1944 1999 N
+ EY SH S s n/a 14 1914 1944 1999 N
+ EY SH SH b n/a 14 1914 1944 2002 N
+ EY SH SH e n/a 14 1916 1944 2002 N
+ EY SH SH s n/a 14 1914 1944 2002 N
+ EY SH SIL e n/a 14 1917 1968 1997 N
+ EY SH SIL s n/a 14 1914 1972 1997 N
+ EY SH T b n/a 14 1914 1944 1989 N
+ EY SH T e n/a 14 1916 1944 1990 N
+ EY SH T i n/a 14 1914 1944 1990 N
+ EY SH T s n/a 14 1914 1944 1990 N
+ EY SH TH b n/a 14 1914 1944 2001 N
+ EY SH TH e n/a 14 1916 1944 2001 N
+ EY SH TH s n/a 14 1914 1944 2001 N
+ EY SH UH e n/a 14 1916 1976 2016 N
+ EY SH UH s n/a 14 1914 1976 2016 N
+ EY SH UW e n/a 14 1916 1976 2015 N
+ EY SH UW s n/a 14 1914 1976 2015 N
+ EY SH V b n/a 14 1914 1964 1995 N
+ EY SH V e n/a 14 1916 1964 1995 N
+ EY SH V i n/a 14 1914 1964 1995 N
+ EY SH V s n/a 14 1914 1964 1995 N
+ EY SH W b n/a 14 1914 1976 2013 N
+ EY SH W e n/a 14 1916 1976 2013 N
+ EY SH W s n/a 14 1914 1976 2013 N
+ EY SH Y e n/a 14 1916 1972 2004 N
+ EY SH Y s n/a 14 1914 1972 2004 N
+ EY SH Z b n/a 14 1914 1962 2003 N
+ EY SH Z e n/a 14 1916 1961 2003 N
+ EY SH Z i n/a 14 1914 1962 2003 N
+ EY SH Z s n/a 14 1914 1962 2003 N
+ EY SH ZH b n/a 14 1914 1962 2003 N
+ EY SH ZH e n/a 14 1916 1961 2003 N
+ EY SH ZH s n/a 14 1914 1961 2003 N
+ EY SIL AA s n/a 14 1907 1976 2015 N
+ EY SIL AE s n/a 14 1907 1971 2011 N
+ EY SIL AH b n/a 14 1907 1971 2012 N
+ EY SIL AH s n/a 14 1907 1971 2012 N
+ EY SIL AO b n/a 14 1907 1976 2015 N
+ EY SIL AO s n/a 14 1907 1976 2015 N
+ EY SIL AW b n/a 14 1907 1976 2012 N
+ EY SIL AW s n/a 14 1907 1976 2012 N
+ EY SIL AY b n/a 14 1907 1971 2015 N
+ EY SIL AY s n/a 14 1907 1971 2015 N
+ EY SIL B b n/a 14 1907 1964 1994 N
+ EY SIL B s n/a 14 1907 1964 1994 N
+ EY SIL CH b n/a 14 1907 1958 1989 N
+ EY SIL CH s n/a 14 1907 1959 1988 N
+ EY SIL D b n/a 14 1907 1962 1991 N
+ EY SIL D s n/a 14 1907 1961 1992 N
+ EY SIL DH b n/a 14 1907 1962 1998 N
+ EY SIL DH s n/a 14 1907 1961 1998 N
+ EY SIL EH b n/a 14 1907 1971 2011 N
+ EY SIL EH s n/a 14 1907 1971 2011 N
+ EY SIL ER b n/a 14 1907 1976 2016 N
+ EY SIL ER s n/a 14 1907 1976 2016 N
+ EY SIL EY s n/a 14 1907 1971 2011 N
+ EY SIL F b n/a 14 1907 1958 2001 N
+ EY SIL F s n/a 14 1907 1959 2001 N
+ EY SIL G b n/a 14 1907 1952 1993 N
+ EY SIL G s n/a 14 1907 1952 1993 N
+ EY SIL HH b n/a 14 1907 1958 2004 N
+ EY SIL HH s n/a 14 1907 1959 2004 N
+ EY SIL IH s n/a 14 1907 1971 2011 N
+ EY SIL IY b n/a 14 1907 1971 2011 N
+ EY SIL IY s n/a 14 1907 1971 2011 N
+ EY SIL JH b n/a 14 1907 1962 1991 N
+ EY SIL JH s n/a 14 1907 1961 1991 N
+ EY SIL K b n/a 14 1907 1952 1993 N
+ EY SIL K s n/a 14 1907 1952 1993 N
+ EY SIL L b n/a 14 1907 1976 2013 N
+ EY SIL L s n/a 14 1907 1976 2013 N
+ EY SIL M b n/a 14 1907 1981 2007 N
+ EY SIL M s n/a 14 1907 1981 2009 N
+ EY SIL N b n/a 14 1907 1981 2005 N
+ EY SIL N s n/a 14 1907 1981 2006 N
+ EY SIL NG b n/a 14 1907 1981 2005 N
+ EY SIL NG s n/a 14 1907 1981 2006 N
+ EY SIL OW b n/a 14 1907 1976 2015 N
+ EY SIL OW s n/a 14 1907 1976 2015 N
+ EY SIL OY s n/a 14 1907 1971 2015 N
+ EY SIL P b n/a 14 1907 1959 1996 N
+ EY SIL P s n/a 14 1907 1959 1996 N
+ EY SIL R b n/a 14 1907 1976 2013 N
+ EY SIL R s n/a 14 1907 1976 2013 N
+ EY SIL S b n/a 14 1907 1958 1999 N
+ EY SIL S s n/a 14 1907 1959 1999 N
+ EY SIL SH b n/a 14 1907 1960 2002 N
+ EY SIL SH s n/a 14 1907 1960 2002 N
+ EY SIL SIL s n/a 14 1907 1972 1997 N
+ EY SIL T b n/a 14 1907 1958 1989 N
+ EY SIL T s n/a 14 1907 1959 1990 N
+ EY SIL TH b n/a 14 1907 1958 2001 N
+ EY SIL TH s n/a 14 1907 1959 2001 N
+ EY SIL UH s n/a 14 1907 1976 2016 N
+ EY SIL UW s n/a 14 1907 1976 2015 N
+ EY SIL V b n/a 14 1907 1964 1995 N
+ EY SIL V s n/a 14 1907 1964 1995 N
+ EY SIL W b n/a 14 1907 1976 2013 N
+ EY SIL W s n/a 14 1907 1976 2013 N
+ EY SIL Y s n/a 14 1907 1972 2004 N
+ EY SIL Z b n/a 14 1907 1962 2003 N
+ EY SIL Z s n/a 14 1907 1962 2003 N
+ EY SIL ZH b n/a 14 1907 1962 2003 N
+ EY SIL ZH s n/a 14 1907 1961 2003 N
+ EY T AA e n/a 14 1910 1976 2015 N
+ EY T AA i n/a 14 1905 1974 2015 N
+ EY T AA s n/a 14 1907 1976 2015 N
+ EY T AE e n/a 14 1910 1971 2011 N
+ EY T AE i n/a 14 1905 1971 2011 N
+ EY T AE s n/a 14 1907 1971 2011 N
+ EY T AH b n/a 14 1907 1971 2012 N
+ EY T AH e n/a 14 1910 1971 2012 N
+ EY T AH i n/a 14 1905 1971 2012 N
+ EY T AH s n/a 14 1907 1971 2012 N
+ EY T AO b n/a 14 1907 1976 2015 N
+ EY T AO e n/a 14 1910 1976 2015 N
+ EY T AO s n/a 14 1907 1976 2015 N
+ EY T AW b n/a 14 1907 1976 2012 N
+ EY T AW e n/a 14 1910 1976 2012 N
+ EY T AW s n/a 14 1907 1976 2012 N
+ EY T AY b n/a 14 1907 1971 2015 N
+ EY T AY e n/a 14 1910 1971 2015 N
+ EY T AY s n/a 14 1907 1971 2015 N
+ EY T B b n/a 14 1907 1964 1994 N
+ EY T B e n/a 14 1910 1964 1996 N
+ EY T B i n/a 14 1905 1964 1994 N
+ EY T B s n/a 14 1907 1964 1994 N
+ EY T CH b n/a 14 1907 1958 1989 N
+ EY T CH e n/a 14 1910 1957 1988 N
+ EY T CH s n/a 14 1907 1957 1988 N
+ EY T D b n/a 14 1906 1962 1991 N
+ EY T D e n/a 14 1906 1961 1990 N
+ EY T D i n/a 14 1906 1962 1992 N
+ EY T D s n/a 14 1906 1961 1992 N
+ EY T DH b n/a 14 1907 1962 1998 N
+ EY T DH e n/a 14 1910 1961 1998 N
+ EY T DH s n/a 14 1907 1961 1998 N
+ EY T EH b n/a 14 1907 1971 2011 N
+ EY T EH e n/a 14 1910 1971 2011 N
+ EY T EH s n/a 14 1907 1971 2011 N
+ EY T ER b n/a 14 1907 1976 2016 N
+ EY T ER e n/a 14 1910 1976 2016 N
+ EY T ER i n/a 14 1905 1974 2016 N
+ EY T ER s n/a 14 1907 1976 2016 N
+ EY T EY e n/a 14 1910 1971 2011 N
+ EY T EY s n/a 14 1907 1971 2011 N
+ EY T F b n/a 14 1907 1958 2001 N
+ EY T F e n/a 14 1910 1957 2001 N
+ EY T F i n/a 14 1905 1957 2001 N
+ EY T F s n/a 14 1907 1957 2001 N
+ EY T G b n/a 14 1907 1951 1993 N
+ EY T G e n/a 14 1910 1951 1993 N
+ EY T G i n/a 14 1904 1951 1993 N
+ EY T G s n/a 14 1907 1952 1993 N
+ EY T HH b n/a 14 1907 1958 2004 N
+ EY T HH e n/a 14 1910 1957 2004 N
+ EY T HH i n/a 14 1905 1957 2004 N
+ EY T HH s n/a 14 1907 1957 2004 N
+ EY T IH e n/a 14 1910 1971 2011 N
+ EY T IH i n/a 14 1905 1970 2010 N
+ EY T IH s n/a 14 1907 1971 2011 N
+ EY T IY b n/a 14 1907 1971 2011 N
+ EY T IY e n/a 14 1910 1971 2011 N
+ EY T IY s n/a 14 1907 1971 2011 N
+ EY T JH b n/a 14 1907 1962 1991 N
+ EY T JH e n/a 14 1910 1961 1991 N
+ EY T JH i n/a 14 1904 1962 1991 N
+ EY T JH s n/a 14 1907 1961 1991 N
+ EY T K b n/a 14 1907 1951 1993 N
+ EY T K e n/a 14 1910 1951 1993 N
+ EY T K i n/a 14 1904 1951 1993 N
+ EY T K s n/a 14 1907 1952 1993 N
+ EY T L b n/a 14 1907 1976 2013 N
+ EY T L e n/a 14 1910 1976 2013 N
+ EY T L i n/a 14 1905 1974 2017 N
+ EY T L s n/a 14 1907 1976 2013 N
+ EY T M b n/a 14 1907 1981 2008 N
+ EY T M e n/a 14 1909 1981 2009 N
+ EY T M i n/a 14 1909 1982 2008 N
+ EY T M s n/a 14 1907 1981 2009 N
+ EY T N b n/a 14 1907 1981 2005 N
+ EY T N e n/a 14 1909 1981 2006 N
+ EY T N i n/a 14 1909 1982 2005 N
+ EY T N s n/a 14 1907 1981 2006 N
+ EY T NG b n/a 14 1907 1981 2005 N
+ EY T NG e n/a 14 1909 1981 2006 N
+ EY T NG i n/a 14 1909 1982 2005 N
+ EY T NG s n/a 14 1907 1981 2006 N
+ EY T OW b n/a 14 1907 1976 2015 N
+ EY T OW e n/a 14 1910 1976 2015 N
+ EY T OW i n/a 14 1905 1974 2015 N
+ EY T OW s n/a 14 1907 1976 2015 N
+ EY T OY e n/a 14 1910 1971 2015 N
+ EY T OY s n/a 14 1907 1971 2015 N
+ EY T P b n/a 14 1907 1959 1996 N
+ EY T P e n/a 14 1910 1959 1996 N
+ EY T P i n/a 14 1905 1959 1996 N
+ EY T P s n/a 14 1907 1959 1996 N
+ EY T R b n/a 14 1907 1976 2013 N
+ EY T R e n/a 14 1910 1976 2013 N
+ EY T R i n/a 14 1905 1974 2016 N
+ EY T R s n/a 14 1907 1976 2013 N
+ EY T S b n/a 14 1906 1958 1999 N
+ EY T S e n/a 14 1905 1957 1999 N
+ EY T S i n/a 14 1905 1957 1999 N
+ EY T S s n/a 14 1905 1957 1999 N
+ EY T SH b n/a 14 1907 1960 2002 N
+ EY T SH e n/a 14 1910 1960 2002 N
+ EY T SH i n/a 14 1905 1960 2002 N
+ EY T SH s n/a 14 1907 1960 2002 N
+ EY T SIL e n/a 14 1910 1968 1997 N
+ EY T SIL s n/a 14 1907 1972 1997 N
+ EY T T b n/a 14 1906 1958 1989 N
+ EY T T e n/a 14 1906 1957 1990 N
+ EY T T i n/a 14 1906 1957 1990 N
+ EY T T s n/a 14 1906 1957 1990 N
+ EY T TH b n/a 14 1907 1958 2001 N
+ EY T TH e n/a 14 1910 1957 2001 N
+ EY T TH s n/a 14 1907 1957 2001 N
+ EY T UH e n/a 14 1910 1976 2016 N
+ EY T UH s n/a 14 1907 1976 2016 N
+ EY T UW e n/a 14 1910 1976 2015 N
+ EY T UW s n/a 14 1907 1976 2015 N
+ EY T V b n/a 14 1907 1964 1995 N
+ EY T V e n/a 14 1910 1964 1995 N
+ EY T V i n/a 14 1905 1964 1995 N
+ EY T V s n/a 14 1907 1964 1995 N
+ EY T W b n/a 14 1907 1976 2013 N
+ EY T W e n/a 14 1910 1976 2013 N
+ EY T W s n/a 14 1907 1976 2013 N
+ EY T Y e n/a 14 1910 1972 2004 N
+ EY T Y i n/a 14 1905 1970 2004 N
+ EY T Y s n/a 14 1907 1972 2004 N
+ EY T Z b n/a 14 1906 1962 2003 N
+ EY T Z e n/a 14 1906 1961 2003 N
+ EY T Z i n/a 14 1906 1962 2003 N
+ EY T Z s n/a 14 1906 1962 2003 N
+ EY T ZH b n/a 14 1907 1962 2003 N
+ EY T ZH e n/a 14 1910 1961 2003 N
+ EY T ZH i n/a 14 1905 1962 2003 N
+ EY T ZH s n/a 14 1907 1961 2003 N
+ EY TH AA e n/a 14 1916 1976 2015 N
+ EY TH AA s n/a 14 1916 1976 2015 N
+ EY TH AE e n/a 14 1916 1971 2011 N
+ EY TH AE s n/a 14 1916 1971 2011 N
+ EY TH AH b n/a 14 1916 1971 2012 N
+ EY TH AH e n/a 14 1916 1971 2012 N
+ EY TH AH i n/a 14 1916 1971 2012 N
+ EY TH AH s n/a 14 1916 1971 2012 N
+ EY TH AO b n/a 14 1916 1976 2015 N
+ EY TH AO e n/a 14 1916 1976 2015 N
+ EY TH AO s n/a 14 1916 1976 2015 N
+ EY TH AW b n/a 14 1916 1976 2012 N
+ EY TH AW e n/a 14 1916 1976 2012 N
+ EY TH AW s n/a 14 1916 1976 2012 N
+ EY TH AY b n/a 14 1916 1971 2015 N
+ EY TH AY e n/a 14 1916 1971 2015 N
+ EY TH AY s n/a 14 1916 1971 2015 N
+ EY TH B b n/a 14 1913 1964 1994 N
+ EY TH B e n/a 14 1916 1964 1996 N
+ EY TH B i n/a 14 1913 1964 1994 N
+ EY TH B s n/a 14 1913 1964 1994 N
+ EY TH CH b n/a 14 1913 1950 1989 N
+ EY TH CH e n/a 14 1916 1950 1988 N
+ EY TH CH s n/a 14 1913 1950 1988 N
+ EY TH D b n/a 14 1913 1958 1991 N
+ EY TH D e n/a 14 1916 1958 1988 N
+ EY TH D i n/a 14 1913 1958 1992 N
+ EY TH D s n/a 14 1913 1959 1992 N
+ EY TH DH b n/a 14 1913 1958 1998 N
+ EY TH DH e n/a 14 1916 1958 1998 N
+ EY TH DH s n/a 14 1913 1959 1998 N
+ EY TH EH b n/a 14 1916 1971 2011 N
+ EY TH EH e n/a 14 1916 1971 2011 N
+ EY TH EH s n/a 14 1916 1971 2011 N
+ EY TH ER b n/a 14 1916 1976 2016 N
+ EY TH ER e n/a 14 1916 1976 2016 N
+ EY TH ER i n/a 14 1916 1975 2016 N
+ EY TH ER s n/a 14 1916 1976 2016 N
+ EY TH EY e n/a 14 1916 1971 2011 N
+ EY TH EY s n/a 14 1916 1971 2011 N
+ EY TH F b n/a 14 1913 1950 2001 N
+ EY TH F e n/a 14 1916 1950 2001 N
+ EY TH F s n/a 14 1913 1950 2001 N
+ EY TH G b n/a 14 1913 1952 1993 N
+ EY TH G e n/a 14 1916 1952 1993 N
+ EY TH G s n/a 14 1913 1952 1993 N
+ EY TH HH b n/a 14 1913 1946 2004 N
+ EY TH HH e n/a 14 1916 1946 2004 N
+ EY TH HH s n/a 14 1913 1946 2004 N
+ EY TH IH e n/a 14 1916 1971 2011 N
+ EY TH IH s n/a 14 1916 1971 2011 N
+ EY TH IY b n/a 14 1916 1971 2011 N
+ EY TH IY e n/a 14 1916 1971 2011 N
+ EY TH IY s n/a 14 1916 1971 2011 N
+ EY TH JH b n/a 14 1913 1958 1991 N
+ EY TH JH e n/a 14 1916 1958 1991 N
+ EY TH JH s n/a 14 1913 1959 1991 N
+ EY TH K b n/a 14 1913 1952 1993 N
+ EY TH K e n/a 14 1916 1952 1993 N
+ EY TH K i n/a 14 1913 1952 1993 N
+ EY TH K s n/a 14 1913 1952 1993 N
+ EY TH L b n/a 14 1916 1973 2013 N
+ EY TH L e n/a 14 1916 1973 2013 N
+ EY TH L i n/a 14 1916 1973 2017 N
+ EY TH L s n/a 14 1916 1973 2013 N
+ EY TH M b n/a 14 1918 1978 2007 N
+ EY TH M e n/a 14 1918 1978 2009 N
+ EY TH M i n/a 14 1918 1977 2007 N
+ EY TH M s n/a 14 1918 1978 2007 N
+ EY TH N b n/a 14 1918 1978 2005 N
+ EY TH N e n/a 14 1918 1978 2006 N
+ EY TH N i n/a 14 1918 1977 2005 N
+ EY TH N s n/a 14 1918 1978 2006 N
+ EY TH NG b n/a 14 1918 1978 2005 N
+ EY TH NG e n/a 14 1918 1978 2006 N
+ EY TH NG s n/a 14 1918 1978 2006 N
+ EY TH OW b n/a 14 1916 1976 2015 N
+ EY TH OW e n/a 14 1916 1976 2015 N
+ EY TH OW s n/a 14 1916 1976 2015 N
+ EY TH OY e n/a 14 1916 1971 2015 N
+ EY TH OY s n/a 14 1916 1971 2015 N
+ EY TH P b n/a 14 1913 1950 1996 N
+ EY TH P e n/a 14 1916 1950 1996 N
+ EY TH P s n/a 14 1913 1950 1996 N
+ EY TH R b n/a 14 1916 1973 2014 N
+ EY TH R e n/a 14 1916 1973 2014 N
+ EY TH R s n/a 14 1916 1973 2014 N
+ EY TH S b n/a 14 1913 1950 1999 N
+ EY TH S e n/a 14 1916 1950 1999 N
+ EY TH S s n/a 14 1913 1950 1999 N
+ EY TH SH b n/a 14 1913 1950 2002 N
+ EY TH SH e n/a 14 1916 1950 2002 N
+ EY TH SH i n/a 14 1913 1950 2002 N
+ EY TH SH s n/a 14 1913 1950 2002 N
+ EY TH SIL e n/a 14 1917 1972 1998 N
+ EY TH SIL s n/a 14 1913 1972 1998 N
+ EY TH T b n/a 14 1913 1950 1989 N
+ EY TH T e n/a 14 1916 1950 1988 N
+ EY TH T i n/a 14 1913 1950 1988 N
+ EY TH T s n/a 14 1913 1950 1988 N
+ EY TH TH b n/a 14 1913 1950 2001 N
+ EY TH TH e n/a 14 1916 1950 2001 N
+ EY TH TH s n/a 14 1913 1950 2001 N
+ EY TH UH e n/a 14 1916 1976 2016 N
+ EY TH UH s n/a 14 1916 1976 2016 N
+ EY TH UW e n/a 14 1916 1976 2015 N
+ EY TH UW s n/a 14 1916 1976 2015 N
+ EY TH V b n/a 14 1913 1964 1995 N
+ EY TH V e n/a 14 1916 1964 1995 N
+ EY TH V i n/a 14 1913 1964 1995 N
+ EY TH V s n/a 14 1913 1964 1995 N
+ EY TH W b n/a 14 1916 1973 2014 N
+ EY TH W e n/a 14 1916 1973 2014 N
+ EY TH W i n/a 14 1916 1973 2017 N
+ EY TH W s n/a 14 1916 1973 2014 N
+ EY TH Y e n/a 14 1916 1972 2004 N
+ EY TH Y s n/a 14 1916 1972 2004 N
+ EY TH Z b n/a 14 1913 1958 2003 N
+ EY TH Z e n/a 14 1916 1958 2003 N
+ EY TH Z i n/a 14 1913 1958 2003 N
+ EY TH Z s n/a 14 1913 1959 2003 N
+ EY TH ZH b n/a 14 1913 1960 2003 N
+ EY TH ZH e n/a 14 1916 1960 2003 N
+ EY TH ZH s n/a 14 1913 1960 2003 N
+ EY UH AA s n/a 14 1931 1976 2015 N
+ EY UH AE s n/a 14 1931 1971 2011 N
+ EY UH AH b n/a 14 1931 1971 2012 N
+ EY UH AH s n/a 14 1931 1971 2012 N
+ EY UH AO b n/a 14 1931 1976 2015 N
+ EY UH AO s n/a 14 1931 1976 2015 N
+ EY UH AW b n/a 14 1931 1976 2012 N
+ EY UH AW s n/a 14 1931 1976 2012 N
+ EY UH AY b n/a 14 1931 1971 2015 N
+ EY UH AY s n/a 14 1931 1971 2015 N
+ EY UH B b n/a 14 1930 1964 1994 N
+ EY UH B s n/a 14 1930 1964 1994 N
+ EY UH CH b n/a 14 1930 1949 1989 N
+ EY UH CH s n/a 14 1930 1949 1990 N
+ EY UH D b n/a 14 1930 1962 1991 N
+ EY UH D s n/a 14 1930 1961 1992 N
+ EY UH DH b n/a 14 1930 1962 1998 N
+ EY UH DH s n/a 14 1930 1961 1998 N
+ EY UH EH b n/a 14 1931 1971 2011 N
+ EY UH EH s n/a 14 1931 1971 2011 N
+ EY UH ER b n/a 14 1931 1976 2016 N
+ EY UH ER s n/a 14 1931 1976 2016 N
+ EY UH EY s n/a 14 1931 1971 2011 N
+ EY UH F b n/a 14 1930 1949 2001 N
+ EY UH F s n/a 14 1930 1949 2001 N
+ EY UH G b n/a 14 1930 1952 1993 N
+ EY UH G s n/a 14 1930 1952 1993 N
+ EY UH HH b n/a 14 1930 1949 2004 N
+ EY UH HH s n/a 14 1930 1949 2004 N
+ EY UH IH s n/a 14 1931 1971 2011 N
+ EY UH IY b n/a 14 1931 1971 2011 N
+ EY UH IY s n/a 14 1931 1971 2011 N
+ EY UH JH b n/a 14 1930 1962 1991 N
+ EY UH JH s n/a 14 1930 1961 1991 N
+ EY UH K b n/a 14 1930 1952 1993 N
+ EY UH K s n/a 14 1930 1952 1993 N
+ EY UH L b n/a 14 1931 1976 2013 N
+ EY UH L s n/a 14 1931 1976 2013 N
+ EY UH M b n/a 14 1931 1979 2007 N
+ EY UH M s n/a 14 1931 1979 2007 N
+ EY UH N b n/a 14 1931 1979 2005 N
+ EY UH N s n/a 14 1931 1979 2006 N
+ EY UH NG b n/a 14 1931 1979 2005 N
+ EY UH NG s n/a 14 1931 1979 2006 N
+ EY UH OW b n/a 14 1931 1976 2015 N
+ EY UH OW s n/a 14 1931 1976 2015 N
+ EY UH OY s n/a 14 1931 1971 2015 N
+ EY UH P b n/a 14 1930 1949 1996 N
+ EY UH P s n/a 14 1930 1949 1996 N
+ EY UH R b n/a 14 1931 1976 2013 N
+ EY UH R s n/a 14 1931 1976 2013 N
+ EY UH S b n/a 14 1930 1949 2000 N
+ EY UH S s n/a 14 1930 1949 2000 N
+ EY UH SH b n/a 14 1930 1949 2002 N
+ EY UH SH s n/a 14 1930 1949 2002 N
+ EY UH SIL s n/a 14 1934 1972 1997 N
+ EY UH T b n/a 14 1930 1949 1989 N
+ EY UH T s n/a 14 1930 1949 1990 N
+ EY UH TH b n/a 14 1930 1949 2001 N
+ EY UH TH s n/a 14 1930 1949 2001 N
+ EY UH UH s n/a 14 1931 1976 2016 N
+ EY UH UW s n/a 14 1931 1976 2015 N
+ EY UH V b n/a 14 1930 1964 1995 N
+ EY UH V s n/a 14 1930 1964 1995 N
+ EY UH W b n/a 14 1931 1976 2013 N
+ EY UH W s n/a 14 1931 1976 2013 N
+ EY UH Y s n/a 14 1931 1972 2004 N
+ EY UH Z b n/a 14 1930 1962 2003 N
+ EY UH Z s n/a 14 1930 1962 2003 N
+ EY UH ZH b n/a 14 1930 1962 2003 N
+ EY UH ZH s n/a 14 1930 1961 2003 N
+ EY UW AA e n/a 14 1934 1976 2015 N
+ EY UW AA s n/a 14 1932 1976 2015 N
+ EY UW AE e n/a 14 1934 1971 2011 N
+ EY UW AE s n/a 14 1932 1971 2011 N
+ EY UW AH b n/a 14 1932 1971 2012 N
+ EY UW AH e n/a 14 1933 1971 2012 N
+ EY UW AH s n/a 14 1932 1971 2012 N
+ EY UW AO b n/a 14 1932 1976 2015 N
+ EY UW AO e n/a 14 1934 1976 2015 N
+ EY UW AO s n/a 14 1932 1976 2015 N
+ EY UW AW b n/a 14 1932 1976 2012 N
+ EY UW AW e n/a 14 1933 1976 2012 N
+ EY UW AW s n/a 14 1932 1976 2012 N
+ EY UW AY b n/a 14 1932 1971 2015 N
+ EY UW AY e n/a 14 1933 1971 2015 N
+ EY UW AY s n/a 14 1932 1971 2015 N
+ EY UW B b n/a 14 1932 1964 1994 N
+ EY UW B e n/a 14 1933 1964 1996 N
+ EY UW B s n/a 14 1932 1964 1994 N
+ EY UW CH b n/a 14 1932 1944 1989 N
+ EY UW CH e n/a 14 1933 1944 1990 N
+ EY UW CH i n/a 14 1932 1949 1990 N
+ EY UW CH s n/a 14 1932 1944 1990 N
+ EY UW D b n/a 14 1932 1962 1991 N
+ EY UW D e n/a 14 1933 1961 1990 N
+ EY UW D i n/a 14 1932 1962 1992 N
+ EY UW D s n/a 14 1932 1961 1992 N
+ EY UW DH b n/a 14 1932 1962 1998 N
+ EY UW DH e n/a 14 1933 1961 1998 N
+ EY UW DH s n/a 14 1932 1961 1998 N
+ EY UW EH b n/a 14 1932 1971 2011 N
+ EY UW EH e n/a 14 1933 1971 2011 N
+ EY UW EH i n/a 14 1932 1971 2011 N
+ EY UW EH s n/a 14 1932 1971 2011 N
+ EY UW ER b n/a 14 1932 1976 2016 N
+ EY UW ER e n/a 14 1933 1976 2016 N
+ EY UW ER s n/a 14 1932 1976 2016 N
+ EY UW EY e n/a 14 1934 1971 2011 N
+ EY UW EY s n/a 14 1932 1971 2011 N
+ EY UW F b n/a 14 1932 1944 2001 N
+ EY UW F e n/a 14 1933 1944 2001 N
+ EY UW F s n/a 14 1932 1944 2001 N
+ EY UW G b n/a 14 1932 1952 1993 N
+ EY UW G e n/a 14 1933 1952 1993 N
+ EY UW G s n/a 14 1932 1952 1993 N
+ EY UW HH b n/a 14 1932 1944 2004 N
+ EY UW HH e n/a 14 1933 1944 2004 N
+ EY UW HH i n/a 14 1932 1949 2004 N
+ EY UW HH s n/a 14 1932 1944 2004 N
+ EY UW IH e n/a 14 1933 1971 2011 N
+ EY UW IH s n/a 14 1932 1971 2011 N
+ EY UW IY b n/a 14 1932 1971 2011 N
+ EY UW IY e n/a 14 1934 1971 2011 N
+ EY UW IY s n/a 14 1932 1971 2011 N
+ EY UW JH b n/a 14 1932 1962 1991 N
+ EY UW JH e n/a 14 1933 1961 1991 N
+ EY UW JH i n/a 14 1932 1962 1991 N
+ EY UW JH s n/a 14 1932 1961 1991 N
+ EY UW K b n/a 14 1932 1952 1993 N
+ EY UW K e n/a 14 1933 1952 1993 N
+ EY UW K s n/a 14 1932 1952 1993 N
+ EY UW L b n/a 14 1932 1976 2013 N
+ EY UW L e n/a 14 1933 1976 2013 N
+ EY UW L i n/a 14 1932 1975 2017 N
+ EY UW L s n/a 14 1932 1976 2013 N
+ EY UW M b n/a 14 1932 1979 2007 N
+ EY UW M e n/a 14 1933 1978 2009 N
+ EY UW M s n/a 14 1932 1979 2007 N
+ EY UW N b n/a 14 1932 1979 2005 N
+ EY UW N e n/a 14 1933 1978 2006 N
+ EY UW N i n/a 14 1932 1979 2005 N
+ EY UW N s n/a 14 1932 1979 2006 N
+ EY UW NG b n/a 14 1932 1979 2005 N
+ EY UW NG e n/a 14 1933 1978 2006 N
+ EY UW NG s n/a 14 1932 1979 2006 N
+ EY UW OW b n/a 14 1932 1976 2015 N
+ EY UW OW e n/a 14 1933 1976 2015 N
+ EY UW OW s n/a 14 1932 1976 2015 N
+ EY UW OY e n/a 14 1933 1971 2015 N
+ EY UW OY s n/a 14 1932 1971 2015 N
+ EY UW P b n/a 14 1932 1944 1996 N
+ EY UW P e n/a 14 1933 1944 1996 N
+ EY UW P s n/a 14 1932 1944 1996 N
+ EY UW R b n/a 14 1932 1976 2013 N
+ EY UW R e n/a 14 1933 1976 2013 N
+ EY UW R s n/a 14 1932 1976 2013 N
+ EY UW S b n/a 14 1932 1944 2000 N
+ EY UW S e n/a 14 1933 1944 2000 N
+ EY UW S s n/a 14 1932 1944 2000 N
+ EY UW SH b n/a 14 1932 1944 2002 N
+ EY UW SH e n/a 14 1933 1944 2002 N
+ EY UW SH i n/a 14 1932 1949 2002 N
+ EY UW SH s n/a 14 1932 1944 2002 N
+ EY UW SIL e n/a 14 1934 1969 1997 N
+ EY UW SIL s n/a 14 1934 1972 1997 N
+ EY UW T b n/a 14 1932 1944 1989 N
+ EY UW T e n/a 14 1933 1944 1990 N
+ EY UW T i n/a 14 1932 1949 1990 N
+ EY UW T s n/a 14 1932 1944 1990 N
+ EY UW TH b n/a 14 1932 1944 2001 N
+ EY UW TH e n/a 14 1933 1944 2001 N
+ EY UW TH s n/a 14 1932 1944 2001 N
+ EY UW UH e n/a 14 1933 1976 2016 N
+ EY UW UH s n/a 14 1932 1976 2016 N
+ EY UW UW e n/a 14 1934 1976 2015 N
+ EY UW UW s n/a 14 1932 1976 2015 N
+ EY UW V b n/a 14 1932 1964 1995 N
+ EY UW V e n/a 14 1933 1964 1995 N
+ EY UW V s n/a 14 1932 1964 1995 N
+ EY UW W b n/a 14 1932 1976 2013 N
+ EY UW W e n/a 14 1933 1976 2013 N
+ EY UW W s n/a 14 1932 1976 2013 N
+ EY UW Y e n/a 14 1933 1972 2004 N
+ EY UW Y s n/a 14 1932 1972 2004 N
+ EY UW Z b n/a 14 1932 1962 2003 N
+ EY UW Z e n/a 14 1933 1961 2003 N
+ EY UW Z i n/a 14 1932 1962 2003 N
+ EY UW Z s n/a 14 1932 1962 2003 N
+ EY UW ZH b n/a 14 1932 1962 2003 N
+ EY UW ZH e n/a 14 1933 1961 2003 N
+ EY UW ZH s n/a 14 1932 1961 2003 N
+ EY V AA e n/a 14 1916 1976 2015 N
+ EY V AA s n/a 14 1912 1976 2015 N
+ EY V AE e n/a 14 1916 1971 2011 N
+ EY V AE s n/a 14 1912 1971 2011 N
+ EY V AH b n/a 14 1912 1971 2012 N
+ EY V AH e n/a 14 1916 1971 2012 N
+ EY V AH i n/a 14 1912 1971 2012 N
+ EY V AH s n/a 14 1912 1971 2012 N
+ EY V AO b n/a 14 1912 1976 2015 N
+ EY V AO e n/a 14 1916 1976 2015 N
+ EY V AO s n/a 14 1912 1976 2015 N
+ EY V AW b n/a 14 1912 1976 2012 N
+ EY V AW e n/a 14 1916 1976 2012 N
+ EY V AW s n/a 14 1912 1976 2012 N
+ EY V AY b n/a 14 1912 1971 2015 N
+ EY V AY e n/a 14 1916 1971 2015 N
+ EY V AY s n/a 14 1912 1971 2015 N
+ EY V B b n/a 14 1912 1964 1994 N
+ EY V B e n/a 14 1916 1964 1996 N
+ EY V B i n/a 14 1912 1964 1994 N
+ EY V B s n/a 14 1912 1964 1994 N
+ EY V CH b n/a 14 1912 1944 1989 N
+ EY V CH e n/a 14 1916 1944 1988 N
+ EY V CH s n/a 14 1912 1944 1988 N
+ EY V D b n/a 14 1912 1962 1991 N
+ EY V D e n/a 14 1916 1961 1990 N
+ EY V D i n/a 14 1912 1962 1992 N
+ EY V D s n/a 14 1912 1961 1992 N
+ EY V DH b n/a 14 1912 1962 1998 N
+ EY V DH e n/a 14 1916 1961 1998 N
+ EY V DH s n/a 14 1912 1961 1998 N
+ EY V EH b n/a 14 1912 1971 2011 N
+ EY V EH e n/a 14 1916 1971 2011 N
+ EY V EH s n/a 14 1912 1971 2011 N
+ EY V ER b n/a 14 1912 1976 2016 N
+ EY V ER e n/a 14 1916 1976 2016 N
+ EY V ER i n/a 14 1912 1975 2016 N
+ EY V ER s n/a 14 1912 1976 2016 N
+ EY V EY e n/a 14 1916 1971 2011 N
+ EY V EY s n/a 14 1912 1971 2011 N
+ EY V F b n/a 14 1912 1944 2001 N
+ EY V F e n/a 14 1916 1944 2001 N
+ EY V F s n/a 14 1912 1944 2001 N
+ EY V G b n/a 14 1912 1952 1993 N
+ EY V G e n/a 14 1916 1952 1993 N
+ EY V G i n/a 14 1912 1952 1993 N
+ EY V G s n/a 14 1912 1952 1993 N
+ EY V HH b n/a 14 1912 1944 2004 N
+ EY V HH e n/a 14 1916 1944 2004 N
+ EY V HH i n/a 14 1912 1944 2004 N
+ EY V HH s n/a 14 1912 1944 2004 N
+ EY V IH e n/a 14 1916 1971 2011 N
+ EY V IH i n/a 14 1912 1970 2010 N
+ EY V IH s n/a 14 1912 1971 2011 N
+ EY V IY b n/a 14 1912 1971 2011 N
+ EY V IY e n/a 14 1916 1971 2011 N
+ EY V IY s n/a 14 1912 1971 2011 N
+ EY V JH b n/a 14 1912 1962 1991 N
+ EY V JH e n/a 14 1916 1961 1991 N
+ EY V JH s n/a 14 1912 1961 1991 N
+ EY V K b n/a 14 1912 1952 1993 N
+ EY V K e n/a 14 1916 1952 1993 N
+ EY V K i n/a 14 1912 1952 1993 N
+ EY V K s n/a 14 1912 1952 1993 N
+ EY V L b n/a 14 1912 1976 2013 N
+ EY V L e n/a 14 1916 1976 2013 N
+ EY V L i n/a 14 1912 1975 2017 N
+ EY V L s n/a 14 1912 1976 2013 N
+ EY V M b n/a 14 1918 1978 2007 N
+ EY V M e n/a 14 1918 1978 2009 N
+ EY V M s n/a 14 1918 1978 2009 N
+ EY V N b n/a 14 1918 1978 2005 N
+ EY V N e n/a 14 1918 1978 2006 N
+ EY V N i n/a 14 1918 1977 2005 N
+ EY V N s n/a 14 1918 1978 2006 N
+ EY V NG b n/a 14 1918 1978 2005 N
+ EY V NG e n/a 14 1918 1978 2006 N
+ EY V NG i n/a 14 1918 1977 2005 N
+ EY V NG s n/a 14 1918 1978 2006 N
+ EY V OW b n/a 14 1912 1976 2015 N
+ EY V OW e n/a 14 1916 1976 2015 N
+ EY V OW s n/a 14 1912 1976 2015 N
+ EY V OY e n/a 14 1916 1971 2015 N
+ EY V OY s n/a 14 1912 1971 2015 N
+ EY V P b n/a 14 1912 1944 1996 N
+ EY V P e n/a 14 1916 1944 1996 N
+ EY V P i n/a 14 1912 1944 1996 N
+ EY V P s n/a 14 1912 1944 1996 N
+ EY V R b n/a 14 1912 1976 2013 N
+ EY V R e n/a 14 1916 1976 2013 N
+ EY V R i n/a 14 1912 1975 2016 N
+ EY V R s n/a 14 1912 1976 2013 N
+ EY V S b n/a 14 1912 1944 2000 N
+ EY V S e n/a 14 1916 1944 2000 N
+ EY V S i n/a 14 1912 1944 2000 N
+ EY V S s n/a 14 1912 1944 2000 N
+ EY V SH b n/a 14 1912 1944 2002 N
+ EY V SH e n/a 14 1916 1944 2002 N
+ EY V SH i n/a 14 1912 1944 2002 N
+ EY V SH s n/a 14 1912 1944 2002 N
+ EY V SIL e n/a 14 1917 1968 1997 N
+ EY V SIL s n/a 14 1912 1972 1997 N
+ EY V T b n/a 14 1912 1944 1989 N
+ EY V T e n/a 14 1916 1944 1990 N
+ EY V T i n/a 14 1912 1944 1990 N
+ EY V T s n/a 14 1912 1944 1990 N
+ EY V TH b n/a 14 1912 1944 2001 N
+ EY V TH e n/a 14 1916 1944 2001 N
+ EY V TH s n/a 14 1912 1944 2001 N
+ EY V UH e n/a 14 1916 1976 2016 N
+ EY V UH s n/a 14 1912 1976 2016 N
+ EY V UW e n/a 14 1916 1976 2015 N
+ EY V UW s n/a 14 1912 1976 2015 N
+ EY V V b n/a 14 1912 1964 1994 N
+ EY V V e n/a 14 1916 1964 1994 N
+ EY V V i n/a 14 1912 1964 1994 N
+ EY V V s n/a 14 1912 1964 1994 N
+ EY V W b n/a 14 1912 1976 2013 N
+ EY V W e n/a 14 1916 1976 2013 N
+ EY V W s n/a 14 1912 1976 2013 N
+ EY V Y e n/a 14 1916 1972 2004 N
+ EY V Y i n/a 14 1912 1970 2004 N
+ EY V Y s n/a 14 1912 1972 2004 N
+ EY V Z b n/a 14 1912 1962 2003 N
+ EY V Z e n/a 14 1916 1961 2003 N
+ EY V Z i n/a 14 1912 1962 2003 N
+ EY V Z s n/a 14 1912 1962 2003 N
+ EY V ZH b n/a 14 1912 1962 2003 N
+ EY V ZH e n/a 14 1916 1961 2003 N
+ EY V ZH i n/a 14 1912 1962 2003 N
+ EY V ZH s n/a 14 1912 1961 2003 N
+ EY W AA e n/a 14 1934 1976 2015 N
+ EY W AA s n/a 14 1932 1976 2015 N
+ EY W AE e n/a 14 1934 1971 2011 N
+ EY W AE s n/a 14 1932 1971 2011 N
+ EY W AH b n/a 14 1932 1971 2012 N
+ EY W AH e n/a 14 1933 1971 2012 N
+ EY W AH i n/a 14 1932 1971 2012 N
+ EY W AH s n/a 14 1932 1971 2012 N
+ EY W AO b n/a 14 1932 1976 2015 N
+ EY W AO e n/a 14 1934 1976 2015 N
+ EY W AO s n/a 14 1932 1976 2015 N
+ EY W AW b n/a 14 1932 1976 2012 N
+ EY W AW e n/a 14 1933 1976 2012 N
+ EY W AW s n/a 14 1932 1976 2012 N
+ EY W AY b n/a 14 1932 1971 2015 N
+ EY W AY e n/a 14 1933 1971 2015 N
+ EY W AY s n/a 14 1932 1971 2015 N
+ EY W B b n/a 14 1932 1966 1994 N
+ EY W B e n/a 14 1933 1966 1996 N
+ EY W B i n/a 14 1932 1966 1994 N
+ EY W B s n/a 14 1932 1966 1994 N
+ EY W CH b n/a 14 1932 1945 1989 N
+ EY W CH e n/a 14 1933 1945 1990 N
+ EY W CH s n/a 14 1932 1945 1990 N
+ EY W D b n/a 14 1932 1967 1992 N
+ EY W D e n/a 14 1933 1967 1990 N
+ EY W D i n/a 14 1932 1967 1992 N
+ EY W D s n/a 14 1932 1967 1992 N
+ EY W DH b n/a 14 1932 1966 1998 N
+ EY W DH e n/a 14 1933 1966 1998 N
+ EY W DH i n/a 14 1932 1966 1998 N
+ EY W DH s n/a 14 1932 1966 1998 N
+ EY W EH b n/a 14 1932 1971 2011 N
+ EY W EH e n/a 14 1933 1971 2011 N
+ EY W EH s n/a 14 1932 1971 2011 N
+ EY W ER b n/a 14 1932 1976 2016 N
+ EY W ER e n/a 14 1933 1976 2016 N
+ EY W ER i n/a 14 1932 1975 2016 N
+ EY W ER s n/a 14 1932 1976 2016 N
+ EY W EY e n/a 14 1934 1971 2011 N
+ EY W EY s n/a 14 1932 1971 2011 N
+ EY W F b n/a 14 1932 1945 2001 N
+ EY W F e n/a 14 1933 1945 2001 N
+ EY W F i n/a 14 1932 1949 2001 N
+ EY W F s n/a 14 1932 1945 2001 N
+ EY W G b n/a 14 1932 1953 1993 N
+ EY W G e n/a 14 1933 1953 1993 N
+ EY W G i n/a 14 1932 1953 1993 N
+ EY W G s n/a 14 1932 1953 1993 N
+ EY W HH b n/a 14 1932 1945 2004 N
+ EY W HH e n/a 14 1933 1945 2004 N
+ EY W HH s n/a 14 1932 1945 2004 N
+ EY W IH e n/a 14 1933 1971 2011 N
+ EY W IH i n/a 14 1932 1970 2010 N
+ EY W IH s n/a 14 1932 1971 2011 N
+ EY W IY b n/a 14 1932 1971 2011 N
+ EY W IY e n/a 14 1934 1971 2011 N
+ EY W IY s n/a 14 1932 1971 2011 N
+ EY W JH b n/a 14 1932 1967 1991 N
+ EY W JH e n/a 14 1933 1967 1991 N
+ EY W JH i n/a 14 1932 1967 1991 N
+ EY W JH s n/a 14 1932 1967 1991 N
+ EY W K b n/a 14 1932 1953 1993 N
+ EY W K e n/a 14 1933 1953 1993 N
+ EY W K i n/a 14 1932 1953 1993 N
+ EY W K s n/a 14 1932 1953 1993 N
+ EY W L b n/a 14 1932 1976 2013 N
+ EY W L e n/a 14 1933 1976 2013 N
+ EY W L i n/a 14 1932 1975 2017 N
+ EY W L s n/a 14 1932 1976 2013 N
+ EY W M b n/a 14 1931 1979 2007 N
+ EY W M e n/a 14 1933 1978 2009 N
+ EY W M i n/a 14 1931 1979 2007 N
+ EY W M s n/a 14 1931 1979 2007 N
+ EY W N b n/a 14 1931 1979 2005 N
+ EY W N e n/a 14 1933 1978 2006 N
+ EY W N i n/a 14 1931 1979 2005 N
+ EY W N s n/a 14 1931 1979 2006 N
+ EY W NG b n/a 14 1931 1979 2005 N
+ EY W NG e n/a 14 1933 1978 2006 N
+ EY W NG i n/a 14 1931 1979 2005 N
+ EY W NG s n/a 14 1931 1979 2006 N
+ EY W OW b n/a 14 1932 1976 2015 N
+ EY W OW e n/a 14 1933 1976 2015 N
+ EY W OW i n/a 14 1932 1975 2015 N
+ EY W OW s n/a 14 1932 1976 2015 N
+ EY W OY e n/a 14 1933 1971 2015 N
+ EY W OY s n/a 14 1932 1971 2015 N
+ EY W P b n/a 14 1932 1945 1996 N
+ EY W P e n/a 14 1933 1945 1996 N
+ EY W P i n/a 14 1932 1949 1996 N
+ EY W P s n/a 14 1932 1945 1996 N
+ EY W R b n/a 14 1932 1976 2013 N
+ EY W R e n/a 14 1933 1976 2013 N
+ EY W R i n/a 14 1932 1975 2016 N
+ EY W R s n/a 14 1932 1976 2013 N
+ EY W S b n/a 14 1932 1945 2000 N
+ EY W S e n/a 14 1933 1945 2000 N
+ EY W S i n/a 14 1932 1949 2000 N
+ EY W S s n/a 14 1932 1945 2000 N
+ EY W SH b n/a 14 1932 1945 2002 N
+ EY W SH e n/a 14 1933 1945 2002 N
+ EY W SH i n/a 14 1932 1949 2002 N
+ EY W SH s n/a 14 1932 1945 2002 N
+ EY W SIL e n/a 14 1934 1969 1997 N
+ EY W SIL s n/a 14 1934 1969 1997 N
+ EY W T b n/a 14 1932 1945 1989 N
+ EY W T e n/a 14 1933 1945 1990 N
+ EY W T i n/a 14 1932 1947 1990 N
+ EY W T s n/a 14 1932 1945 1990 N
+ EY W TH b n/a 14 1932 1945 2001 N
+ EY W TH e n/a 14 1933 1945 2001 N
+ EY W TH s n/a 14 1932 1945 2001 N
+ EY W UH e n/a 14 1933 1976 2016 N
+ EY W UH s n/a 14 1932 1976 2016 N
+ EY W UW e n/a 14 1934 1976 2015 N
+ EY W UW s n/a 14 1932 1976 2015 N
+ EY W V b n/a 14 1932 1965 1995 N
+ EY W V e n/a 14 1933 1965 1995 N
+ EY W V i n/a 14 1932 1965 1995 N
+ EY W V s n/a 14 1932 1965 1995 N
+ EY W W b n/a 14 1932 1976 2013 N
+ EY W W e n/a 14 1933 1976 2013 N
+ EY W W i n/a 14 1932 1975 2017 N
+ EY W W s n/a 14 1932 1976 2013 N
+ EY W Y e n/a 14 1933 1972 2004 N
+ EY W Y i n/a 14 1932 1970 2004 N
+ EY W Y s n/a 14 1932 1972 2004 N
+ EY W Z b n/a 14 1932 1966 2003 N
+ EY W Z e n/a 14 1933 1966 2003 N
+ EY W Z i n/a 14 1932 1966 2003 N
+ EY W Z s n/a 14 1932 1966 2003 N
+ EY W ZH b n/a 14 1932 1967 2003 N
+ EY W ZH e n/a 14 1933 1967 2003 N
+ EY W ZH i n/a 14 1932 1967 2003 N
+ EY W ZH s n/a 14 1932 1967 2003 N
+ EY Y AA e n/a 14 1928 1976 2015 N
+ EY Y AA s n/a 14 1926 1976 2015 N
+ EY Y AE e n/a 14 1928 1971 2011 N
+ EY Y AE s n/a 14 1926 1971 2011 N
+ EY Y AH b n/a 14 1926 1971 2012 N
+ EY Y AH e n/a 14 1928 1971 2012 N
+ EY Y AH s n/a 14 1926 1971 2012 N
+ EY Y AO b n/a 14 1926 1976 2015 N
+ EY Y AO e n/a 14 1928 1976 2015 N
+ EY Y AO s n/a 14 1926 1976 2015 N
+ EY Y AW b n/a 14 1926 1976 2012 N
+ EY Y AW e n/a 14 1928 1976 2012 N
+ EY Y AW s n/a 14 1926 1976 2012 N
+ EY Y AY b n/a 14 1926 1971 2015 N
+ EY Y AY e n/a 14 1928 1971 2015 N
+ EY Y AY s n/a 14 1926 1971 2015 N
+ EY Y B b n/a 14 1926 1964 1994 N
+ EY Y B e n/a 14 1928 1964 1996 N
+ EY Y B s n/a 14 1926 1964 1994 N
+ EY Y CH b n/a 14 1926 1955 1989 N
+ EY Y CH e n/a 14 1928 1955 1988 N
+ EY Y CH s n/a 14 1926 1956 1988 N
+ EY Y D b n/a 14 1926 1962 1991 N
+ EY Y D e n/a 14 1928 1961 1990 N
+ EY Y D i n/a 14 1923 1962 1992 N
+ EY Y D s n/a 14 1926 1961 1992 N
+ EY Y DH b n/a 14 1926 1962 1998 N
+ EY Y DH e n/a 14 1928 1961 1998 N
+ EY Y DH s n/a 14 1926 1961 1998 N
+ EY Y EH b n/a 14 1926 1971 2011 N
+ EY Y EH e n/a 14 1928 1971 2011 N
+ EY Y EH s n/a 14 1926 1971 2011 N
+ EY Y ER b n/a 14 1926 1976 2016 N
+ EY Y ER e n/a 14 1928 1976 2016 N
+ EY Y ER s n/a 14 1926 1976 2016 N
+ EY Y EY e n/a 14 1928 1971 2011 N
+ EY Y EY s n/a 14 1926 1971 2011 N
+ EY Y F b n/a 14 1926 1955 2001 N
+ EY Y F e n/a 14 1928 1955 2001 N
+ EY Y F s n/a 14 1926 1956 2001 N
+ EY Y G b n/a 14 1926 1953 1993 N
+ EY Y G e n/a 14 1928 1953 1993 N
+ EY Y G i n/a 14 1923 1953 1993 N
+ EY Y G s n/a 14 1926 1953 1993 N
+ EY Y HH b n/a 14 1926 1955 2004 N
+ EY Y HH e n/a 14 1928 1955 2004 N
+ EY Y HH i n/a 14 1923 1955 2004 N
+ EY Y HH s n/a 14 1926 1956 2004 N
+ EY Y IH e n/a 14 1928 1971 2011 N
+ EY Y IH s n/a 14 1926 1971 2011 N
+ EY Y IY b n/a 14 1926 1971 2011 N
+ EY Y IY e n/a 14 1928 1971 2011 N
+ EY Y IY s n/a 14 1926 1971 2011 N
+ EY Y JH b n/a 14 1926 1962 1991 N
+ EY Y JH e n/a 14 1928 1961 1991 N
+ EY Y JH i n/a 14 1923 1962 1991 N
+ EY Y JH s n/a 14 1926 1961 1991 N
+ EY Y K b n/a 14 1926 1953 1993 N
+ EY Y K e n/a 14 1928 1953 1993 N
+ EY Y K i n/a 14 1923 1953 1993 N
+ EY Y K s n/a 14 1926 1953 1993 N
+ EY Y L b n/a 14 1926 1976 2013 N
+ EY Y L e n/a 14 1928 1976 2013 N
+ EY Y L i n/a 14 1923 1974 2017 N
+ EY Y L s n/a 14 1926 1976 2013 N
+ EY Y M b n/a 14 1926 1981 2007 N
+ EY Y M e n/a 14 1928 1981 2009 N
+ EY Y M i n/a 14 1923 1981 2007 N
+ EY Y M s n/a 14 1926 1981 2009 N
+ EY Y N b n/a 14 1926 1981 2005 N
+ EY Y N e n/a 14 1928 1981 2006 N
+ EY Y N i n/a 14 1923 1981 2005 N
+ EY Y N s n/a 14 1926 1981 2006 N
+ EY Y NG b n/a 14 1926 1981 2005 N
+ EY Y NG e n/a 14 1928 1981 2006 N
+ EY Y NG s n/a 14 1926 1981 2006 N
+ EY Y OW b n/a 14 1926 1976 2015 N
+ EY Y OW e n/a 14 1928 1976 2015 N
+ EY Y OW s n/a 14 1926 1976 2015 N
+ EY Y OY e n/a 14 1928 1971 2015 N
+ EY Y OY s n/a 14 1926 1971 2015 N
+ EY Y P b n/a 14 1926 1955 1996 N
+ EY Y P e n/a 14 1928 1955 1996 N
+ EY Y P i n/a 14 1923 1955 1996 N
+ EY Y P s n/a 14 1926 1956 1996 N
+ EY Y R b n/a 14 1926 1976 2013 N
+ EY Y R e n/a 14 1928 1976 2013 N
+ EY Y R s n/a 14 1926 1976 2013 N
+ EY Y S b n/a 14 1926 1955 2000 N
+ EY Y S e n/a 14 1928 1955 2000 N
+ EY Y S i n/a 14 1922 1955 2000 N
+ EY Y S s n/a 14 1926 1956 2000 N
+ EY Y SH b n/a 14 1926 1955 2002 N
+ EY Y SH e n/a 14 1928 1955 2002 N
+ EY Y SH s n/a 14 1926 1956 2002 N
+ EY Y SIL e n/a 14 1928 1968 1997 N
+ EY Y SIL s n/a 14 1926 1972 1997 N
+ EY Y T b n/a 14 1926 1955 1989 N
+ EY Y T e n/a 14 1928 1955 1990 N
+ EY Y T i n/a 14 1923 1955 1990 N
+ EY Y T s n/a 14 1926 1956 1990 N
+ EY Y TH b n/a 14 1926 1955 2001 N
+ EY Y TH e n/a 14 1928 1955 2001 N
+ EY Y TH s n/a 14 1926 1956 2001 N
+ EY Y UH e n/a 14 1928 1976 2016 N
+ EY Y UH s n/a 14 1926 1976 2016 N
+ EY Y UW e n/a 14 1928 1976 2015 N
+ EY Y UW s n/a 14 1926 1976 2015 N
+ EY Y V b n/a 14 1926 1964 1995 N
+ EY Y V e n/a 14 1928 1964 1995 N
+ EY Y V i n/a 14 1923 1964 1995 N
+ EY Y V s n/a 14 1926 1964 1995 N
+ EY Y W b n/a 14 1926 1976 2013 N
+ EY Y W e n/a 14 1928 1976 2013 N
+ EY Y W s n/a 14 1926 1976 2013 N
+ EY Y Y e n/a 14 1928 1972 2004 N
+ EY Y Y i n/a 14 1923 1970 2004 N
+ EY Y Y s n/a 14 1926 1972 2004 N
+ EY Y Z b n/a 14 1926 1962 2003 N
+ EY Y Z e n/a 14 1928 1961 2003 N
+ EY Y Z i n/a 14 1923 1962 2003 N
+ EY Y Z s n/a 14 1926 1962 2003 N
+ EY Y ZH b n/a 14 1926 1962 2003 N
+ EY Y ZH e n/a 14 1928 1961 2003 N
+ EY Y ZH s n/a 14 1926 1961 2003 N
+ EY Z AA e n/a 14 1916 1976 2015 N
+ EY Z AA i n/a 14 1916 1975 2015 N
+ EY Z AA s n/a 14 1916 1976 2015 N
+ EY Z AE e n/a 14 1916 1971 2011 N
+ EY Z AE s n/a 14 1916 1971 2011 N
+ EY Z AH b n/a 14 1916 1971 2012 N
+ EY Z AH e n/a 14 1916 1971 2012 N
+ EY Z AH i n/a 14 1916 1971 2012 N
+ EY Z AH s n/a 14 1916 1971 2012 N
+ EY Z AO b n/a 14 1916 1976 2015 N
+ EY Z AO e n/a 14 1916 1976 2015 N
+ EY Z AO s n/a 14 1916 1976 2015 N
+ EY Z AW b n/a 14 1916 1976 2012 N
+ EY Z AW e n/a 14 1916 1976 2012 N
+ EY Z AW s n/a 14 1916 1976 2012 N
+ EY Z AY b n/a 14 1916 1971 2015 N
+ EY Z AY e n/a 14 1916 1971 2015 N
+ EY Z AY s n/a 14 1916 1971 2015 N
+ EY Z B b n/a 14 1913 1964 1994 N
+ EY Z B e n/a 14 1916 1964 1996 N
+ EY Z B i n/a 14 1912 1964 1994 N
+ EY Z B s n/a 14 1913 1964 1994 N
+ EY Z CH b n/a 14 1913 1944 1989 N
+ EY Z CH e n/a 14 1916 1944 1988 N
+ EY Z CH s n/a 14 1913 1944 1988 N
+ EY Z D b n/a 14 1913 1962 1991 N
+ EY Z D e n/a 14 1916 1961 1990 N
+ EY Z D i n/a 14 1912 1962 1992 N
+ EY Z D s n/a 14 1913 1961 1992 N
+ EY Z DH b n/a 14 1913 1962 1998 N
+ EY Z DH e n/a 14 1916 1961 1998 N
+ EY Z DH s n/a 14 1913 1961 1998 N
+ EY Z EH b n/a 14 1916 1971 2011 N
+ EY Z EH e n/a 14 1916 1971 2011 N
+ EY Z EH i n/a 14 1916 1971 2011 N
+ EY Z EH s n/a 14 1916 1971 2011 N
+ EY Z ER b n/a 14 1916 1976 2016 N
+ EY Z ER e n/a 14 1916 1976 2016 N
+ EY Z ER i n/a 14 1916 1975 2016 N
+ EY Z ER s n/a 14 1916 1976 2016 N
+ EY Z EY e n/a 14 1916 1971 2011 N
+ EY Z EY s n/a 14 1916 1971 2011 N
+ EY Z F b n/a 14 1913 1944 2001 N
+ EY Z F e n/a 14 1916 1944 2001 N
+ EY Z F s n/a 14 1913 1944 2001 N
+ EY Z G b n/a 14 1913 1952 1993 N
+ EY Z G e n/a 14 1916 1952 1993 N
+ EY Z G i n/a 14 1912 1952 1993 N
+ EY Z G s n/a 14 1913 1952 1993 N
+ EY Z HH b n/a 14 1913 1944 2004 N
+ EY Z HH e n/a 14 1916 1944 2004 N
+ EY Z HH s n/a 14 1913 1944 2004 N
+ EY Z IH e n/a 14 1916 1971 2011 N
+ EY Z IH i n/a 14 1916 1970 2010 N
+ EY Z IH s n/a 14 1916 1971 2011 N
+ EY Z IY b n/a 14 1916 1971 2011 N
+ EY Z IY e n/a 14 1916 1971 2011 N
+ EY Z IY i n/a 14 1916 1970 2010 N
+ EY Z IY s n/a 14 1916 1971 2011 N
+ EY Z JH b n/a 14 1913 1962 1991 N
+ EY Z JH e n/a 14 1916 1961 1991 N
+ EY Z JH s n/a 14 1913 1961 1991 N
+ EY Z K b n/a 14 1913 1952 1993 N
+ EY Z K e n/a 14 1916 1952 1993 N
+ EY Z K i n/a 14 1912 1952 1993 N
+ EY Z K s n/a 14 1913 1952 1993 N
+ EY Z L b n/a 14 1916 1976 2013 N
+ EY Z L e n/a 14 1916 1976 2013 N
+ EY Z L i n/a 14 1916 1975 2017 N
+ EY Z L s n/a 14 1916 1976 2013 N
+ EY Z M b n/a 14 1918 1978 2007 N
+ EY Z M e n/a 14 1918 1978 2009 N
+ EY Z M i n/a 14 1918 1977 2007 N
+ EY Z M s n/a 14 1918 1978 2009 N
+ EY Z N b n/a 14 1918 1978 2005 N
+ EY Z N e n/a 14 1918 1978 2006 N
+ EY Z N i n/a 14 1918 1977 2005 N
+ EY Z N s n/a 14 1918 1978 2006 N
+ EY Z NG b n/a 14 1918 1978 2005 N
+ EY Z NG e n/a 14 1918 1978 2006 N
+ EY Z NG i n/a 14 1918 1977 2005 N
+ EY Z NG s n/a 14 1918 1978 2006 N
+ EY Z OW b n/a 14 1916 1976 2015 N
+ EY Z OW e n/a 14 1916 1976 2015 N
+ EY Z OW s n/a 14 1916 1976 2015 N
+ EY Z OY e n/a 14 1916 1971 2015 N
+ EY Z OY s n/a 14 1916 1971 2015 N
+ EY Z P b n/a 14 1913 1944 1996 N
+ EY Z P e n/a 14 1916 1944 1996 N
+ EY Z P i n/a 14 1912 1944 1996 N
+ EY Z P s n/a 14 1913 1944 1996 N
+ EY Z R b n/a 14 1916 1976 2013 N
+ EY Z R e n/a 14 1916 1976 2013 N
+ EY Z R i n/a 14 1916 1975 2016 N
+ EY Z R s n/a 14 1916 1976 2013 N
+ EY Z S b n/a 14 1913 1944 2000 N
+ EY Z S e n/a 14 1916 1944 2000 N
+ EY Z S i n/a 14 1912 1944 2000 N
+ EY Z S s n/a 14 1913 1944 2000 N
+ EY Z SH b n/a 14 1913 1944 2002 N
+ EY Z SH e n/a 14 1916 1944 2002 N
+ EY Z SH i n/a 14 1912 1944 2002 N
+ EY Z SH s n/a 14 1913 1944 2002 N
+ EY Z SIL e n/a 14 1917 1968 1997 N
+ EY Z SIL s n/a 14 1913 1972 1997 N
+ EY Z T b n/a 14 1913 1944 1989 N
+ EY Z T e n/a 14 1916 1944 1990 N
+ EY Z T i n/a 14 1912 1944 1990 N
+ EY Z T s n/a 14 1913 1944 1990 N
+ EY Z TH b n/a 14 1913 1944 2001 N
+ EY Z TH e n/a 14 1916 1944 2001 N
+ EY Z TH s n/a 14 1913 1944 2001 N
+ EY Z UH e n/a 14 1916 1976 2016 N
+ EY Z UH s n/a 14 1916 1976 2016 N
+ EY Z UW e n/a 14 1916 1976 2015 N
+ EY Z UW s n/a 14 1916 1976 2015 N
+ EY Z V b n/a 14 1913 1964 1995 N
+ EY Z V e n/a 14 1916 1964 1995 N
+ EY Z V i n/a 14 1912 1964 1995 N
+ EY Z V s n/a 14 1913 1964 1995 N
+ EY Z W b n/a 14 1916 1976 2013 N
+ EY Z W e n/a 14 1916 1976 2013 N
+ EY Z W s n/a 14 1916 1976 2013 N
+ EY Z Y e n/a 14 1916 1972 2004 N
+ EY Z Y s n/a 14 1916 1972 2004 N
+ EY Z Z b n/a 14 1913 1962 2003 N
+ EY Z Z e n/a 14 1916 1961 2003 N
+ EY Z Z i n/a 14 1912 1962 2003 N
+ EY Z Z s n/a 14 1913 1962 2003 N
+ EY Z ZH b n/a 14 1913 1962 2003 N
+ EY Z ZH e n/a 14 1916 1961 2003 N
+ EY Z ZH s n/a 14 1913 1961 2003 N
+ EY ZH AA e n/a 14 1916 1976 2015 N
+ EY ZH AA s n/a 14 1914 1976 2015 N
+ EY ZH AE e n/a 14 1916 1971 2011 N
+ EY ZH AE s n/a 14 1914 1971 2011 N
+ EY ZH AH b n/a 14 1914 1971 2012 N
+ EY ZH AH e n/a 14 1916 1971 2012 N
+ EY ZH AH s n/a 14 1914 1971 2012 N
+ EY ZH AO b n/a 14 1914 1976 2015 N
+ EY ZH AO e n/a 14 1916 1976 2015 N
+ EY ZH AO s n/a 14 1914 1976 2015 N
+ EY ZH AW b n/a 14 1914 1976 2012 N
+ EY ZH AW e n/a 14 1916 1976 2012 N
+ EY ZH AW s n/a 14 1914 1976 2012 N
+ EY ZH AY b n/a 14 1914 1971 2015 N
+ EY ZH AY e n/a 14 1916 1971 2015 N
+ EY ZH AY s n/a 14 1914 1971 2015 N
+ EY ZH B b n/a 14 1914 1964 1994 N
+ EY ZH B e n/a 14 1916 1964 1996 N
+ EY ZH B s n/a 14 1914 1964 1994 N
+ EY ZH CH b n/a 14 1914 1944 1989 N
+ EY ZH CH e n/a 14 1916 1944 1988 N
+ EY ZH CH s n/a 14 1914 1944 1988 N
+ EY ZH D b n/a 14 1914 1962 1991 N
+ EY ZH D e n/a 14 1916 1961 1990 N
+ EY ZH D s n/a 14 1914 1961 1992 N
+ EY ZH DH b n/a 14 1914 1962 1998 N
+ EY ZH DH e n/a 14 1916 1961 1998 N
+ EY ZH DH s n/a 14 1914 1961 1998 N
+ EY ZH EH b n/a 14 1914 1971 2011 N
+ EY ZH EH e n/a 14 1916 1971 2011 N
+ EY ZH EH s n/a 14 1914 1971 2011 N
+ EY ZH ER b n/a 14 1914 1976 2016 N
+ EY ZH ER e n/a 14 1916 1976 2016 N
+ EY ZH ER s n/a 14 1914 1976 2016 N
+ EY ZH EY e n/a 14 1916 1971 2011 N
+ EY ZH EY s n/a 14 1914 1971 2011 N
+ EY ZH F b n/a 14 1914 1944 2001 N
+ EY ZH F e n/a 14 1916 1944 2001 N
+ EY ZH F s n/a 14 1914 1944 2001 N
+ EY ZH G b n/a 14 1914 1952 1993 N
+ EY ZH G e n/a 14 1916 1952 1993 N
+ EY ZH G s n/a 14 1914 1952 1993 N
+ EY ZH HH b n/a 14 1914 1944 2004 N
+ EY ZH HH e n/a 14 1916 1944 2004 N
+ EY ZH HH s n/a 14 1914 1944 2004 N
+ EY ZH IH e n/a 14 1916 1971 2011 N
+ EY ZH IH s n/a 14 1914 1971 2011 N
+ EY ZH IY b n/a 14 1914 1971 2011 N
+ EY ZH IY e n/a 14 1916 1971 2011 N
+ EY ZH IY s n/a 14 1914 1971 2011 N
+ EY ZH JH b n/a 14 1914 1962 1991 N
+ EY ZH JH e n/a 14 1916 1961 1991 N
+ EY ZH JH s n/a 14 1914 1961 1991 N
+ EY ZH K b n/a 14 1914 1952 1993 N
+ EY ZH K e n/a 14 1916 1952 1993 N
+ EY ZH K i n/a 14 1914 1952 1993 N
+ EY ZH K s n/a 14 1914 1952 1993 N
+ EY ZH L b n/a 14 1914 1976 2013 N
+ EY ZH L e n/a 14 1916 1976 2013 N
+ EY ZH L s n/a 14 1914 1976 2013 N
+ EY ZH M b n/a 14 1918 1978 2007 N
+ EY ZH M e n/a 14 1918 1978 2009 N
+ EY ZH M s n/a 14 1918 1978 2009 N
+ EY ZH N b n/a 14 1918 1978 2005 N
+ EY ZH N e n/a 14 1918 1978 2006 N
+ EY ZH N s n/a 14 1918 1978 2006 N
+ EY ZH NG b n/a 14 1918 1978 2005 N
+ EY ZH NG e n/a 14 1918 1978 2006 N
+ EY ZH NG s n/a 14 1918 1978 2006 N
+ EY ZH OW b n/a 14 1914 1976 2015 N
+ EY ZH OW e n/a 14 1916 1976 2015 N
+ EY ZH OW s n/a 14 1914 1976 2015 N
+ EY ZH OY e n/a 14 1916 1971 2015 N
+ EY ZH OY s n/a 14 1914 1971 2015 N
+ EY ZH P b n/a 14 1914 1944 1996 N
+ EY ZH P e n/a 14 1916 1944 1996 N
+ EY ZH P s n/a 14 1914 1944 1996 N
+ EY ZH R b n/a 14 1914 1976 2013 N
+ EY ZH R e n/a 14 1916 1976 2013 N
+ EY ZH R s n/a 14 1914 1976 2013 N
+ EY ZH S b n/a 14 1914 1944 2000 N
+ EY ZH S e n/a 14 1916 1944 2000 N
+ EY ZH S s n/a 14 1914 1944 2000 N
+ EY ZH SH b n/a 14 1914 1944 2002 N
+ EY ZH SH e n/a 14 1916 1944 2002 N
+ EY ZH SH s n/a 14 1914 1944 2002 N
+ EY ZH SIL e n/a 14 1917 1968 1997 N
+ EY ZH SIL s n/a 14 1914 1972 1997 N
+ EY ZH T b n/a 14 1914 1944 1989 N
+ EY ZH T e n/a 14 1916 1944 1990 N
+ EY ZH T s n/a 14 1914 1944 1990 N
+ EY ZH TH b n/a 14 1914 1944 2001 N
+ EY ZH TH e n/a 14 1916 1944 2001 N
+ EY ZH TH s n/a 14 1914 1944 2001 N
+ EY ZH UH e n/a 14 1916 1976 2016 N
+ EY ZH UH s n/a 14 1914 1976 2016 N
+ EY ZH UW e n/a 14 1916 1976 2015 N
+ EY ZH UW s n/a 14 1914 1976 2015 N
+ EY ZH V b n/a 14 1914 1964 1995 N
+ EY ZH V e n/a 14 1916 1964 1995 N
+ EY ZH V s n/a 14 1914 1964 1995 N
+ EY ZH W b n/a 14 1914 1976 2013 N
+ EY ZH W e n/a 14 1916 1976 2013 N
+ EY ZH W s n/a 14 1914 1976 2013 N
+ EY ZH Y e n/a 14 1916 1972 2004 N
+ EY ZH Y s n/a 14 1914 1972 2004 N
+ EY ZH Z b n/a 14 1914 1962 2003 N
+ EY ZH Z e n/a 14 1916 1961 2003 N
+ EY ZH Z i n/a 14 1914 1962 2003 N
+ EY ZH Z s n/a 14 1914 1962 2003 N
+ EY ZH ZH b n/a 14 1914 1962 2003 N
+ EY ZH ZH e n/a 14 1916 1961 2003 N
+ EY ZH ZH s n/a 14 1914 1961 2003 N
+ F AA AA b n/a 15 2030 2056 2065 N
+ F AA AA e n/a 15 2030 2056 2065 N
+ F AA AA i n/a 15 2030 2056 2065 N
+ F AA AE b n/a 15 2030 2038 2079 N
+ F AA AE e n/a 15 2030 2038 2080 N
+ F AA AE i n/a 15 2030 2038 2079 N
+ F AA AH b n/a 15 2030 2038 2064 N
+ F AA AH e n/a 15 2030 2038 2069 N
+ F AA AH i n/a 15 2030 2038 2069 N
+ F AA AO b n/a 15 2030 2056 2067 N
+ F AA AO e n/a 15 2030 2056 2066 N
+ F AA AO i n/a 15 2030 2056 2067 N
+ F AA AW b n/a 15 2030 2038 2079 N
+ F AA AW e n/a 15 2030 2038 2079 N
+ F AA AY b n/a 15 2030 2056 2063 N
+ F AA AY e n/a 15 2030 2056 2064 N
+ F AA AY i n/a 15 2030 2056 2063 N
+ F AA B e n/a 15 2030 2038 2077 N
+ F AA B i n/a 15 2030 2038 2077 N
+ F AA CH e n/a 15 2030 2038 2078 N
+ F AA D b n/a 15 2030 2038 2075 N
+ F AA D e n/a 15 2030 2038 2075 N
+ F AA D i n/a 15 2030 2038 2075 N
+ F AA DH e n/a 15 2030 2038 2077 N
+ F AA DH i n/a 15 2030 2038 2077 N
+ F AA EH b n/a 15 2030 2038 2080 N
+ F AA EH e n/a 15 2030 2038 2080 N
+ F AA EH i n/a 15 2030 2038 2080 N
+ F AA ER b n/a 15 2030 2056 2072 N
+ F AA ER e n/a 15 2030 2056 2072 N
+ F AA ER i n/a 15 2030 2056 2071 N
+ F AA EY b n/a 15 2030 2038 2081 N
+ F AA EY e n/a 15 2030 2038 2081 N
+ F AA EY i n/a 15 2030 2038 2081 N
+ F AA F e n/a 15 2030 2038 2077 N
+ F AA G b n/a 15 2030 2038 2077 N
+ F AA G e n/a 15 2030 2038 2077 N
+ F AA G i n/a 15 2030 2038 2077 N
+ F AA HH e n/a 15 2030 2038 2075 N
+ F AA IH b n/a 15 2030 2038 2083 N
+ F AA IH e n/a 15 2030 2038 2083 N
+ F AA IH i n/a 15 2030 2038 2083 N
+ F AA IY b n/a 15 2030 2038 2082 N
+ F AA IY e n/a 15 2030 2038 2082 N
+ F AA IY i n/a 15 2030 2038 2082 N
+ F AA JH e n/a 15 2030 2038 2078 N
+ F AA K b n/a 15 2030 2038 2077 N
+ F AA K e n/a 15 2030 2038 2077 N
+ F AA K i n/a 15 2030 2038 2077 N
+ F AA L b n/a 15 2030 2056 2070 N
+ F AA L e n/a 15 2030 2056 2070 N
+ F AA L i n/a 15 2030 2056 2070 N
+ F AA M b n/a 15 2030 2038 2077 N
+ F AA M e n/a 15 2030 2038 2077 N
+ F AA M i n/a 15 2030 2038 2077 N
+ F AA N b n/a 15 2030 2038 2075 N
+ F AA N e n/a 15 2030 2038 2075 N
+ F AA N i n/a 15 2030 2038 2075 N
+ F AA NG e n/a 15 2030 2038 2077 N
+ F AA OW b n/a 15 2030 2056 2066 N
+ F AA OW e n/a 15 2030 2056 2066 N
+ F AA OW i n/a 15 2030 2056 2066 N
+ F AA OY b n/a 15 2030 2056 2067 N
+ F AA OY e n/a 15 2030 2056 2066 N
+ F AA OY i n/a 15 2030 2056 2067 N
+ F AA P b n/a 15 2030 2038 2077 N
+ F AA P e n/a 15 2030 2038 2077 N
+ F AA R b n/a 15 2030 2056 2074 N
+ F AA R e n/a 15 2030 2056 2074 N
+ F AA R i n/a 15 2030 2056 2074 N
+ F AA S b n/a 15 2030 2038 2077 N
+ F AA S e n/a 15 2030 2038 2077 N
+ F AA S i n/a 15 2030 2038 2077 N
+ F AA SH e n/a 15 2030 2038 2078 N
+ F AA SIL e n/a 15 2030 2039 2077 N
+ F AA T b n/a 15 2030 2038 2075 N
+ F AA T e n/a 15 2030 2038 2075 N
+ F AA T i n/a 15 2030 2038 2075 N
+ F AA TH b n/a 15 2030 2038 2077 N
+ F AA TH e n/a 15 2030 2038 2077 N
+ F AA TH i n/a 15 2030 2038 2077 N
+ F AA UH b n/a 15 2030 2056 2069 N
+ F AA UH e n/a 15 2030 2056 2069 N
+ F AA UW b n/a 15 2030 2056 2069 N
+ F AA UW e n/a 15 2030 2056 2069 N
+ F AA UW i n/a 15 2030 2056 2069 N
+ F AA V b n/a 15 2030 2038 2077 N
+ F AA V e n/a 15 2030 2038 2077 N
+ F AA W b n/a 15 2030 2056 2070 N
+ F AA W e n/a 15 2030 2056 2070 N
+ F AA W i n/a 15 2030 2056 2070 N
+ F AA Y b n/a 15 2030 2038 2078 N
+ F AA Y e n/a 15 2030 2038 2078 N
+ F AA Y i n/a 15 2030 2038 2078 N
+ F AA Z e n/a 15 2030 2038 2077 N
+ F AA ZH e n/a 15 2030 2038 2078 N
+ F AE AA b n/a 15 2029 2056 2065 N
+ F AE AA e n/a 15 2029 2056 2065 N
+ F AE AA i n/a 15 2029 2056 2065 N
+ F AE AE b n/a 15 2029 2038 2079 N
+ F AE AE e n/a 15 2029 2038 2080 N
+ F AE AE i n/a 15 2029 2038 2079 N
+ F AE AH b n/a 15 2029 2038 2064 N
+ F AE AH e n/a 15 2029 2038 2069 N
+ F AE AH i n/a 15 2029 2038 2069 N
+ F AE AO b n/a 15 2029 2056 2067 N
+ F AE AO e n/a 15 2029 2056 2066 N
+ F AE AW b n/a 15 2029 2038 2079 N
+ F AE AW e n/a 15 2029 2038 2079 N
+ F AE AW i n/a 15 2029 2038 2079 N
+ F AE AY b n/a 15 2029 2056 2063 N
+ F AE AY e n/a 15 2029 2056 2064 N
+ F AE AY i n/a 15 2029 2056 2063 N
+ F AE B e n/a 15 2029 2038 2077 N
+ F AE B i n/a 15 2029 2038 2077 N
+ F AE CH e n/a 15 2029 2038 2078 N
+ F AE D b n/a 15 2029 2037 2075 N
+ F AE D e n/a 15 2029 2037 2075 N
+ F AE D i n/a 15 2029 2037 2075 N
+ F AE DH e n/a 15 2029 2038 2077 N
+ F AE EH b n/a 15 2029 2038 2080 N
+ F AE EH e n/a 15 2029 2038 2080 N
+ F AE EH i n/a 15 2029 2038 2080 N
+ F AE ER b n/a 15 2029 2056 2072 N
+ F AE ER e n/a 15 2029 2056 2072 N
+ F AE ER i n/a 15 2029 2056 2071 N
+ F AE EY b n/a 15 2029 2038 2081 N
+ F AE EY e n/a 15 2029 2038 2081 N
+ F AE EY i n/a 15 2029 2038 2081 N
+ F AE F e n/a 15 2029 2038 2077 N
+ F AE G b n/a 15 2029 2038 2077 N
+ F AE G e n/a 15 2029 2038 2077 N
+ F AE G i n/a 15 2029 2038 2077 N
+ F AE HH e n/a 15 2029 2038 2075 N
+ F AE HH i n/a 15 2029 2038 2075 N
+ F AE IH b n/a 15 2029 2038 2083 N
+ F AE IH e n/a 15 2029 2038 2083 N
+ F AE IH i n/a 15 2029 2038 2083 N
+ F AE IY b n/a 15 2029 2038 2082 N
+ F AE IY e n/a 15 2029 2038 2082 N
+ F AE IY i n/a 15 2029 2038 2082 N
+ F AE JH e n/a 15 2029 2038 2078 N
+ F AE K b n/a 15 2029 2038 2077 N
+ F AE K e n/a 15 2029 2038 2077 N
+ F AE K i n/a 15 2029 2038 2077 N
+ F AE L b n/a 15 2029 2056 2070 N
+ F AE L e n/a 15 2029 2056 2070 N
+ F AE L i n/a 15 2029 2056 2070 N
+ F AE M b n/a 15 2029 2038 2077 N
+ F AE M e n/a 15 2029 2038 2077 N
+ F AE M i n/a 15 2029 2038 2077 N
+ F AE N b n/a 15 2029 2037 2075 N
+ F AE N e n/a 15 2029 2037 2075 N
+ F AE N i n/a 15 2029 2037 2075 N
+ F AE NG e n/a 15 2029 2038 2077 N
+ F AE OW b n/a 15 2029 2056 2066 N
+ F AE OW e n/a 15 2029 2056 2066 N
+ F AE OW i n/a 15 2029 2056 2066 N
+ F AE OY b n/a 15 2029 2056 2067 N
+ F AE OY e n/a 15 2029 2056 2066 N
+ F AE P b n/a 15 2029 2038 2077 N
+ F AE P e n/a 15 2029 2038 2077 N
+ F AE P i n/a 15 2029 2038 2077 N
+ F AE R b n/a 15 2029 2056 2074 N
+ F AE R e n/a 15 2029 2056 2074 N
+ F AE R i n/a 15 2029 2056 2074 N
+ F AE S b n/a 15 2029 2038 2077 N
+ F AE S e n/a 15 2029 2038 2077 N
+ F AE S i n/a 15 2029 2038 2077 N
+ F AE SH e n/a 15 2029 2038 2078 N
+ F AE SH i n/a 15 2029 2038 2078 N
+ F AE SIL e n/a 15 2029 2039 2077 N
+ F AE T b n/a 15 2029 2037 2075 N
+ F AE T e n/a 15 2029 2037 2075 N
+ F AE T i n/a 15 2029 2037 2075 N
+ F AE TH b n/a 15 2029 2038 2077 N
+ F AE TH e n/a 15 2029 2038 2077 N
+ F AE TH i n/a 15 2029 2038 2077 N
+ F AE UH b n/a 15 2029 2056 2069 N
+ F AE UH e n/a 15 2029 2056 2069 N
+ F AE UW b n/a 15 2029 2056 2069 N
+ F AE UW e n/a 15 2029 2056 2069 N
+ F AE UW i n/a 15 2029 2056 2069 N
+ F AE V b n/a 15 2029 2038 2077 N
+ F AE V e n/a 15 2029 2038 2077 N
+ F AE W b n/a 15 2029 2056 2070 N
+ F AE W e n/a 15 2029 2056 2070 N
+ F AE W i n/a 15 2029 2056 2070 N
+ F AE Y b n/a 15 2029 2038 2078 N
+ F AE Y e n/a 15 2029 2038 2078 N
+ F AE Y i n/a 15 2029 2038 2078 N
+ F AE Z e n/a 15 2029 2038 2077 N
+ F AE Z i n/a 15 2029 2038 2077 N
+ F AE ZH e n/a 15 2029 2038 2078 N
+ F AH AA b n/a 15 2031 2054 2065 N
+ F AH AA e n/a 15 2031 2054 2065 N
+ F AH AA i n/a 15 2031 2054 2065 N
+ F AH AE b n/a 15 2032 2044 2079 N
+ F AH AE e n/a 15 2031 2044 2080 N
+ F AH AE i n/a 15 2032 2044 2079 N
+ F AH AH b n/a 15 2032 2046 2064 N
+ F AH AH e n/a 15 2031 2046 2069 N
+ F AH AH i n/a 15 2031 2046 2068 N
+ F AH AO b n/a 15 2031 2055 2067 N
+ F AH AO e n/a 15 2031 2055 2066 N
+ F AH AO i n/a 15 2031 2055 2067 N
+ F AH AW b n/a 15 2032 2044 2079 N
+ F AH AW e n/a 15 2031 2044 2079 N
+ F AH AW i n/a 15 2032 2044 2079 N
+ F AH AY b n/a 15 2031 2054 2063 N
+ F AH AY e n/a 15 2031 2054 2064 N
+ F AH AY i n/a 15 2031 2054 2063 N
+ F AH B e n/a 15 2030 2038 2077 N
+ F AH B i n/a 15 2030 2038 2077 N
+ F AH CH e n/a 15 2030 2038 2078 N
+ F AH D b n/a 15 2030 2037 2075 N
+ F AH D e n/a 15 2030 2037 2075 N
+ F AH D i n/a 15 2030 2037 2075 N
+ F AH DH e n/a 15 2030 2038 2077 N
+ F AH DH i n/a 15 2030 2038 2077 N
+ F AH EH b n/a 15 2032 2044 2080 N
+ F AH EH e n/a 15 2031 2044 2080 N
+ F AH EH i n/a 15 2032 2044 2080 N
+ F AH ER b n/a 15 2032 2054 2071 N
+ F AH ER e n/a 15 2031 2057 2071 N
+ F AH ER i n/a 15 2031 2057 2071 N
+ F AH EY b n/a 15 2032 2044 2081 N
+ F AH EY e n/a 15 2031 2044 2081 N
+ F AH EY i n/a 15 2032 2044 2081 N
+ F AH F e n/a 15 2030 2038 2077 N
+ F AH G b n/a 15 2030 2038 2077 N
+ F AH G e n/a 15 2030 2038 2077 N
+ F AH HH e n/a 15 2030 2038 2075 N
+ F AH HH i n/a 15 2030 2038 2075 N
+ F AH IH b n/a 15 2032 2044 2083 N
+ F AH IH e n/a 15 2031 2044 2083 N
+ F AH IH i n/a 15 2031 2044 2083 N
+ F AH IY b n/a 15 2032 2044 2082 N
+ F AH IY e n/a 15 2031 2044 2082 N
+ F AH IY i n/a 15 2032 2044 2082 N
+ F AH JH e n/a 15 2030 2038 2078 N
+ F AH K b n/a 15 2030 2038 2077 N
+ F AH K e n/a 15 2030 2038 2077 N
+ F AH K i n/a 15 2030 2038 2077 N
+ F AH L b n/a 15 2031 2055 2070 N
+ F AH L e n/a 15 2031 2055 2070 N
+ F AH L i n/a 15 2031 2055 2070 N
+ F AH M b n/a 15 2030 2038 2077 N
+ F AH M e n/a 15 2030 2038 2077 N
+ F AH M i n/a 15 2030 2038 2077 N
+ F AH N b n/a 15 2030 2037 2075 N
+ F AH N e n/a 15 2030 2037 2075 N
+ F AH N i n/a 15 2030 2037 2075 N
+ F AH NG e n/a 15 2030 2038 2077 N
+ F AH OW b n/a 15 2031 2055 2066 N
+ F AH OW e n/a 15 2031 2055 2066 N
+ F AH OW i n/a 15 2031 2055 2066 N
+ F AH OY b n/a 15 2031 2055 2067 N
+ F AH OY e n/a 15 2031 2055 2066 N
+ F AH OY i n/a 15 2031 2055 2067 N
+ F AH P b n/a 15 2030 2038 2077 N
+ F AH P e n/a 15 2030 2038 2077 N
+ F AH R b n/a 15 2032 2055 2074 N
+ F AH R e n/a 15 2031 2057 2074 N
+ F AH R i n/a 15 2031 2057 2074 N
+ F AH S b n/a 15 2030 2038 2077 N
+ F AH S e n/a 15 2030 2038 2077 N
+ F AH S i n/a 15 2030 2038 2077 N
+ F AH SH e n/a 15 2030 2038 2078 N
+ F AH SH i n/a 15 2030 2038 2078 N
+ F AH SIL e n/a 15 2030 2039 2077 N
+ F AH T b n/a 15 2030 2037 2075 N
+ F AH T e n/a 15 2030 2037 2075 N
+ F AH T i n/a 15 2030 2037 2075 N
+ F AH TH b n/a 15 2030 2038 2077 N
+ F AH TH e n/a 15 2030 2038 2077 N
+ F AH TH i n/a 15 2030 2038 2077 N
+ F AH UH b n/a 15 2031 2055 2068 N
+ F AH UH e n/a 15 2031 2055 2068 N
+ F AH UH i n/a 15 2031 2055 2068 N
+ F AH UW b n/a 15 2031 2055 2068 N
+ F AH UW e n/a 15 2031 2055 2068 N
+ F AH UW i n/a 15 2031 2055 2068 N
+ F AH V b n/a 15 2030 2038 2077 N
+ F AH V e n/a 15 2030 2038 2077 N
+ F AH W b n/a 15 2031 2055 2070 N
+ F AH W e n/a 15 2031 2055 2070 N
+ F AH W i n/a 15 2031 2055 2070 N
+ F AH Y b n/a 15 2032 2044 2078 N
+ F AH Y e n/a 15 2031 2044 2078 N
+ F AH Y i n/a 15 2032 2044 2078 N
+ F AH Z e n/a 15 2030 2038 2077 N
+ F AH ZH e n/a 15 2030 2038 2078 N
+ F AO AA b n/a 15 2030 2056 2065 N
+ F AO AA e n/a 15 2030 2056 2065 N
+ F AO AA i n/a 15 2030 2056 2065 N
+ F AO AE b n/a 15 2030 2038 2079 N
+ F AO AE e n/a 15 2030 2038 2080 N
+ F AO AH b n/a 15 2030 2038 2064 N
+ F AO AH e n/a 15 2030 2038 2069 N
+ F AO AH i n/a 15 2030 2038 2069 N
+ F AO AO b n/a 15 2030 2056 2067 N
+ F AO AO e n/a 15 2030 2056 2066 N
+ F AO AO i n/a 15 2030 2056 2067 N
+ F AO AW b n/a 15 2030 2038 2079 N
+ F AO AW e n/a 15 2030 2038 2079 N
+ F AO AY b n/a 15 2030 2056 2063 N
+ F AO AY e n/a 15 2030 2056 2064 N
+ F AO B e n/a 15 2030 2038 2077 N
+ F AO B i n/a 15 2030 2038 2077 N
+ F AO CH e n/a 15 2030 2038 2078 N
+ F AO D b n/a 15 2030 2038 2075 N
+ F AO D e n/a 15 2030 2038 2075 N
+ F AO D i n/a 15 2030 2038 2075 N
+ F AO DH e n/a 15 2030 2038 2077 N
+ F AO EH b n/a 15 2030 2038 2080 N
+ F AO EH e n/a 15 2030 2038 2080 N
+ F AO EH i n/a 15 2030 2038 2080 N
+ F AO ER b n/a 15 2030 2056 2072 N
+ F AO ER e n/a 15 2030 2056 2072 N
+ F AO ER i n/a 15 2030 2056 2071 N
+ F AO EY b n/a 15 2030 2038 2081 N
+ F AO EY e n/a 15 2030 2038 2081 N
+ F AO F e n/a 15 2030 2038 2077 N
+ F AO G b n/a 15 2030 2038 2077 N
+ F AO G e n/a 15 2030 2038 2077 N
+ F AO HH e n/a 15 2030 2038 2075 N
+ F AO HH i n/a 15 2030 2038 2075 N
+ F AO IH b n/a 15 2030 2038 2083 N
+ F AO IH e n/a 15 2030 2038 2083 N
+ F AO IH i n/a 15 2030 2038 2083 N
+ F AO IY b n/a 15 2030 2038 2082 N
+ F AO IY e n/a 15 2030 2038 2082 N
+ F AO IY i n/a 15 2030 2038 2082 N
+ F AO JH e n/a 15 2030 2038 2078 N
+ F AO K b n/a 15 2030 2038 2077 N
+ F AO K e n/a 15 2030 2038 2077 N
+ F AO K i n/a 15 2030 2038 2077 N
+ F AO L b n/a 15 2030 2056 2070 N
+ F AO L e n/a 15 2030 2056 2070 N
+ F AO L i n/a 15 2030 2056 2070 N
+ F AO M b n/a 15 2030 2038 2077 N
+ F AO M e n/a 15 2030 2038 2077 N
+ F AO M i n/a 15 2030 2038 2077 N
+ F AO N b n/a 15 2030 2038 2075 N
+ F AO N e n/a 15 2030 2038 2075 N
+ F AO N i n/a 15 2030 2038 2075 N
+ F AO NG e n/a 15 2030 2038 2077 N
+ F AO OW b n/a 15 2030 2056 2066 N
+ F AO OW e n/a 15 2030 2056 2066 N
+ F AO OW i n/a 15 2030 2056 2066 N
+ F AO OY b n/a 15 2030 2056 2067 N
+ F AO OY e n/a 15 2030 2056 2066 N
+ F AO P b n/a 15 2030 2038 2077 N
+ F AO P e n/a 15 2030 2038 2077 N
+ F AO P i n/a 15 2030 2038 2077 N
+ F AO R b n/a 15 2030 2056 2074 N
+ F AO R e n/a 15 2030 2056 2074 N
+ F AO R i n/a 15 2030 2056 2074 N
+ F AO S b n/a 15 2030 2038 2077 N
+ F AO S e n/a 15 2030 2038 2077 N
+ F AO S i n/a 15 2030 2038 2077 N
+ F AO SH e n/a 15 2030 2038 2078 N
+ F AO SH i n/a 15 2030 2038 2078 N
+ F AO SIL e n/a 15 2030 2039 2077 N
+ F AO T b n/a 15 2030 2038 2075 N
+ F AO T e n/a 15 2030 2038 2075 N
+ F AO T i n/a 15 2030 2038 2075 N
+ F AO TH b n/a 15 2030 2038 2077 N
+ F AO TH e n/a 15 2030 2038 2077 N
+ F AO UH b n/a 15 2030 2056 2069 N
+ F AO UH e n/a 15 2030 2056 2069 N
+ F AO UW b n/a 15 2030 2056 2069 N
+ F AO UW e n/a 15 2030 2056 2069 N
+ F AO UW i n/a 15 2030 2056 2069 N
+ F AO V b n/a 15 2030 2038 2077 N
+ F AO V e n/a 15 2030 2038 2077 N
+ F AO W b n/a 15 2030 2056 2070 N
+ F AO W e n/a 15 2030 2056 2070 N
+ F AO W i n/a 15 2030 2056 2070 N
+ F AO Y b n/a 15 2030 2038 2078 N
+ F AO Y e n/a 15 2030 2038 2078 N
+ F AO Z e n/a 15 2030 2038 2077 N
+ F AO Z i n/a 15 2030 2038 2077 N
+ F AO ZH e n/a 15 2030 2038 2078 N
+ F AW AA b n/a 15 2030 2056 2065 N
+ F AW AA e n/a 15 2030 2056 2065 N
+ F AW AE b n/a 15 2030 2039 2079 N
+ F AW AE e n/a 15 2030 2039 2080 N
+ F AW AH b n/a 15 2030 2039 2064 N
+ F AW AH e n/a 15 2030 2039 2069 N
+ F AW AH i n/a 15 2030 2039 2069 N
+ F AW AO b n/a 15 2030 2056 2067 N
+ F AW AO e n/a 15 2030 2056 2066 N
+ F AW AW b n/a 15 2030 2039 2079 N
+ F AW AW e n/a 15 2030 2039 2079 N
+ F AW AY b n/a 15 2030 2056 2063 N
+ F AW AY e n/a 15 2030 2056 2064 N
+ F AW AY i n/a 15 2030 2056 2063 N
+ F AW B e n/a 15 2030 2039 2077 N
+ F AW CH e n/a 15 2030 2039 2078 N
+ F AW D b n/a 15 2030 2039 2075 N
+ F AW D e n/a 15 2030 2039 2075 N
+ F AW D i n/a 15 2030 2039 2075 N
+ F AW DH e n/a 15 2030 2039 2077 N
+ F AW EH b n/a 15 2030 2039 2080 N
+ F AW EH e n/a 15 2030 2039 2080 N
+ F AW ER b n/a 15 2030 2056 2072 N
+ F AW ER e n/a 15 2030 2056 2072 N
+ F AW ER i n/a 15 2030 2056 2071 N
+ F AW EY b n/a 15 2030 2039 2081 N
+ F AW EY e n/a 15 2030 2039 2081 N
+ F AW F e n/a 15 2030 2039 2077 N
+ F AW G b n/a 15 2030 2039 2077 N
+ F AW G e n/a 15 2030 2039 2077 N
+ F AW HH e n/a 15 2030 2039 2075 N
+ F AW HH i n/a 15 2030 2039 2075 N
+ F AW IH b n/a 15 2030 2039 2083 N
+ F AW IH e n/a 15 2030 2039 2083 N
+ F AW IH i n/a 15 2030 2039 2083 N
+ F AW IY b n/a 15 2030 2039 2082 N
+ F AW IY e n/a 15 2030 2039 2082 N
+ F AW JH e n/a 15 2030 2039 2078 N
+ F AW K b n/a 15 2030 2039 2077 N
+ F AW K e n/a 15 2030 2039 2077 N
+ F AW L b n/a 15 2030 2056 2070 N
+ F AW L e n/a 15 2030 2056 2070 N
+ F AW L i n/a 15 2030 2056 2070 N
+ F AW M b n/a 15 2030 2039 2077 N
+ F AW M e n/a 15 2030 2039 2077 N
+ F AW N b n/a 15 2030 2039 2075 N
+ F AW N e n/a 15 2030 2039 2075 N
+ F AW N i n/a 15 2030 2039 2075 N
+ F AW NG e n/a 15 2030 2039 2077 N
+ F AW OW b n/a 15 2030 2056 2066 N
+ F AW OW e n/a 15 2030 2056 2066 N
+ F AW OY b n/a 15 2030 2056 2067 N
+ F AW OY e n/a 15 2030 2056 2066 N
+ F AW P b n/a 15 2030 2039 2077 N
+ F AW P e n/a 15 2030 2039 2077 N
+ F AW R b n/a 15 2030 2056 2074 N
+ F AW R e n/a 15 2030 2056 2074 N
+ F AW S b n/a 15 2030 2039 2077 N
+ F AW S e n/a 15 2030 2039 2077 N
+ F AW S i n/a 15 2030 2039 2077 N
+ F AW SH e n/a 15 2030 2039 2078 N
+ F AW SIL e n/a 15 2030 2039 2077 N
+ F AW T b n/a 15 2030 2039 2075 N
+ F AW T e n/a 15 2030 2039 2075 N
+ F AW TH b n/a 15 2030 2039 2077 N
+ F AW TH e n/a 15 2030 2039 2077 N
+ F AW UH b n/a 15 2030 2056 2069 N
+ F AW UH e n/a 15 2030 2056 2069 N
+ F AW UW b n/a 15 2030 2056 2069 N
+ F AW UW e n/a 15 2030 2056 2069 N
+ F AW V b n/a 15 2030 2039 2077 N
+ F AW V e n/a 15 2030 2039 2077 N
+ F AW W b n/a 15 2030 2056 2070 N
+ F AW W e n/a 15 2030 2056 2070 N
+ F AW Y b n/a 15 2030 2039 2078 N
+ F AW Y e n/a 15 2030 2039 2078 N
+ F AW Z e n/a 15 2030 2039 2077 N
+ F AW ZH e n/a 15 2030 2039 2078 N
+ F AY AA b n/a 15 2026 2057 2065 N
+ F AY AA e n/a 15 2028 2057 2065 N
+ F AY AA i n/a 15 2026 2057 2065 N
+ F AY AE b n/a 15 2026 2047 2079 N
+ F AY AE e n/a 15 2028 2047 2080 N
+ F AY AE i n/a 15 2026 2047 2079 N
+ F AY AH b n/a 15 2026 2047 2064 N
+ F AY AH e n/a 15 2028 2047 2069 N
+ F AY AH i n/a 15 2026 2047 2069 N
+ F AY AO b n/a 15 2026 2057 2067 N
+ F AY AO e n/a 15 2028 2057 2066 N
+ F AY AO i n/a 15 2026 2057 2067 N
+ F AY AW b n/a 15 2026 2047 2079 N
+ F AY AW e n/a 15 2028 2047 2079 N
+ F AY AY b n/a 15 2026 2057 2063 N
+ F AY AY e n/a 15 2028 2057 2064 N
+ F AY AY i n/a 15 2026 2057 2063 N
+ F AY B e n/a 15 2028 2040 2077 N
+ F AY B i n/a 15 2026 2040 2077 N
+ F AY CH e n/a 15 2028 2040 2078 N
+ F AY CH i n/a 15 2026 2040 2078 N
+ F AY D b n/a 15 2026 2040 2075 N
+ F AY D e n/a 15 2028 2040 2075 N
+ F AY DH e n/a 15 2028 2040 2077 N
+ F AY EH b n/a 15 2026 2047 2080 N
+ F AY EH e n/a 15 2028 2047 2080 N
+ F AY EH i n/a 15 2026 2047 2080 N
+ F AY ER b n/a 15 2026 2057 2072 N
+ F AY ER e n/a 15 2028 2057 2072 N
+ F AY ER i n/a 15 2026 2057 2071 N
+ F AY EY b n/a 15 2026 2047 2081 N
+ F AY EY e n/a 15 2028 2047 2081 N
+ F AY EY i n/a 15 2026 2047 2081 N
+ F AY F e n/a 15 2028 2040 2077 N
+ F AY G b n/a 15 2026 2040 2077 N
+ F AY G e n/a 15 2028 2040 2077 N
+ F AY G i n/a 15 2026 2040 2077 N
+ F AY HH e n/a 15 2028 2040 2075 N
+ F AY HH i n/a 15 2026 2040 2075 N
+ F AY IH b n/a 15 2026 2047 2083 N
+ F AY IH e n/a 15 2028 2047 2083 N
+ F AY IH i n/a 15 2026 2047 2083 N
+ F AY IY b n/a 15 2026 2047 2082 N
+ F AY IY e n/a 15 2028 2047 2082 N
+ F AY IY i n/a 15 2026 2047 2082 N
+ F AY JH e n/a 15 2028 2040 2078 N
+ F AY K b n/a 15 2026 2040 2077 N
+ F AY K e n/a 15 2028 2040 2077 N
+ F AY K i n/a 15 2026 2040 2077 N
+ F AY L b n/a 15 2026 2057 2070 N
+ F AY L e n/a 15 2028 2057 2070 N
+ F AY L i n/a 15 2026 2057 2070 N
+ F AY M b n/a 15 2026 2040 2077 N
+ F AY M e n/a 15 2028 2040 2077 N
+ F AY N b n/a 15 2026 2040 2075 N
+ F AY N e n/a 15 2028 2040 2075 N
+ F AY NG e n/a 15 2028 2040 2077 N
+ F AY OW b n/a 15 2026 2057 2066 N
+ F AY OW e n/a 15 2028 2057 2066 N
+ F AY OW i n/a 15 2026 2057 2066 N
+ F AY OY b n/a 15 2026 2057 2067 N
+ F AY OY e n/a 15 2028 2057 2066 N
+ F AY OY i n/a 15 2026 2057 2067 N
+ F AY P b n/a 15 2026 2040 2077 N
+ F AY P e n/a 15 2028 2040 2077 N
+ F AY P i n/a 15 2026 2040 2077 N
+ F AY R b n/a 15 2026 2057 2074 N
+ F AY R e n/a 15 2028 2057 2074 N
+ F AY R i n/a 15 2026 2057 2074 N
+ F AY S b n/a 15 2026 2040 2077 N
+ F AY S e n/a 15 2028 2040 2077 N
+ F AY S i n/a 15 2026 2040 2077 N
+ F AY SH e n/a 15 2028 2040 2078 N
+ F AY SH i n/a 15 2026 2040 2078 N
+ F AY SIL e n/a 15 2028 2040 2077 N
+ F AY T b n/a 15 2026 2040 2075 N
+ F AY T e n/a 15 2028 2040 2075 N
+ F AY T i n/a 15 2026 2040 2075 N
+ F AY TH b n/a 15 2026 2040 2077 N
+ F AY TH e n/a 15 2028 2040 2077 N
+ F AY TH i n/a 15 2026 2040 2077 N
+ F AY UH b n/a 15 2026 2057 2069 N
+ F AY UH e n/a 15 2028 2057 2069 N
+ F AY UW b n/a 15 2026 2057 2069 N
+ F AY UW e n/a 15 2028 2057 2069 N
+ F AY UW i n/a 15 2026 2057 2069 N
+ F AY V b n/a 15 2026 2040 2077 N
+ F AY V e n/a 15 2028 2040 2077 N
+ F AY W b n/a 15 2026 2057 2070 N
+ F AY W e n/a 15 2028 2057 2070 N
+ F AY W i n/a 15 2026 2057 2070 N
+ F AY Y b n/a 15 2026 2047 2078 N
+ F AY Y e n/a 15 2028 2047 2078 N
+ F AY Y i n/a 15 2026 2047 2078 N
+ F AY Z e n/a 15 2028 2040 2077 N
+ F AY ZH e n/a 15 2028 2040 2078 N
+ F B AA b n/a 15 2019 2051 2065 N
+ F B AE b n/a 15 2019 2041 2079 N
+ F B AE i n/a 15 2019 2042 2079 N
+ F B AH b n/a 15 2019 2042 2064 N
+ F B AH i n/a 15 2019 2042 2068 N
+ F B AO b n/a 15 2019 2051 2067 N
+ F B AO i n/a 15 2019 2051 2067 N
+ F B AW b n/a 15 2019 2041 2079 N
+ F B AY b n/a 15 2019 2051 2063 N
+ F B D b n/a 15 2019 2037 2075 N
+ F B EH b n/a 15 2019 2041 2080 N
+ F B ER b n/a 15 2019 2052 2072 N
+ F B ER i n/a 15 2019 2052 2071 N
+ F B EY b n/a 15 2019 2041 2081 N
+ F B G b n/a 15 2019 2038 2077 N
+ F B IH b n/a 15 2019 2041 2083 N
+ F B IY b n/a 15 2019 2041 2082 N
+ F B K b n/a 15 2019 2038 2077 N
+ F B L b n/a 15 2019 2051 2070 N
+ F B L i n/a 15 2019 2051 2070 N
+ F B M b n/a 15 2019 2038 2077 N
+ F B N b n/a 15 2019 2037 2075 N
+ F B OW b n/a 15 2019 2051 2066 N
+ F B OY b n/a 15 2019 2051 2067 N
+ F B P b n/a 15 2019 2038 2077 N
+ F B R b n/a 15 2019 2052 2074 N
+ F B S b n/a 15 2019 2038 2077 N
+ F B T b n/a 15 2019 2037 2075 N
+ F B TH b n/a 15 2019 2038 2077 N
+ F B UH b n/a 15 2019 2051 2068 N
+ F B UW b n/a 15 2019 2051 2068 N
+ F B V b n/a 15 2019 2038 2077 N
+ F B W b n/a 15 2019 2051 2070 N
+ F B Y b n/a 15 2019 2041 2078 N
+ F CH AA b n/a 15 2021 2051 2065 N
+ F CH AE b n/a 15 2021 2041 2079 N
+ F CH AH b n/a 15 2021 2042 2064 N
+ F CH AH i n/a 15 2021 2042 2068 N
+ F CH AO b n/a 15 2021 2051 2067 N
+ F CH AO i n/a 15 2021 2051 2067 N
+ F CH AW b n/a 15 2021 2041 2079 N
+ F CH AY b n/a 15 2021 2051 2063 N
+ F CH D b n/a 15 2021 2037 2075 N
+ F CH EH b n/a 15 2021 2041 2080 N
+ F CH ER b n/a 15 2021 2053 2072 N
+ F CH ER i n/a 15 2021 2053 2071 N
+ F CH EY b n/a 15 2021 2041 2081 N
+ F CH G b n/a 15 2021 2038 2077 N
+ F CH IH b n/a 15 2021 2041 2083 N
+ F CH IY b n/a 15 2021 2041 2082 N
+ F CH IY i n/a 15 2021 2042 2082 N
+ F CH K b n/a 15 2021 2038 2077 N
+ F CH L b n/a 15 2021 2051 2070 N
+ F CH M b n/a 15 2021 2038 2077 N
+ F CH N b n/a 15 2021 2037 2075 N
+ F CH OW b n/a 15 2021 2051 2066 N
+ F CH OY b n/a 15 2021 2051 2067 N
+ F CH P b n/a 15 2021 2038 2077 N
+ F CH R b n/a 15 2021 2052 2074 N
+ F CH R i n/a 15 2021 2052 2074 N
+ F CH S b n/a 15 2021 2038 2077 N
+ F CH T b n/a 15 2021 2037 2075 N
+ F CH TH b n/a 15 2021 2038 2077 N
+ F CH UH b n/a 15 2021 2051 2068 N
+ F CH UW b n/a 15 2021 2051 2068 N
+ F CH V b n/a 15 2021 2038 2077 N
+ F CH W b n/a 15 2021 2051 2070 N
+ F CH Y b n/a 15 2021 2041 2078 N
+ F D AA b n/a 15 2019 2051 2065 N
+ F D AA i n/a 15 2019 2051 2065 N
+ F D AE b n/a 15 2019 2041 2079 N
+ F D AE i n/a 15 2019 2042 2079 N
+ F D AH b n/a 15 2019 2042 2064 N
+ F D AH i n/a 15 2019 2042 2068 N
+ F D AO b n/a 15 2019 2051 2067 N
+ F D AO i n/a 15 2019 2051 2067 N
+ F D AW b n/a 15 2019 2041 2079 N
+ F D AY b n/a 15 2019 2051 2063 N
+ F D AY i n/a 15 2019 2051 2063 N
+ F D D b n/a 15 2019 2037 2075 N
+ F D EH b n/a 15 2019 2041 2080 N
+ F D EH i n/a 15 2019 2042 2080 N
+ F D ER b n/a 15 2019 2052 2072 N
+ F D ER i n/a 15 2019 2052 2071 N
+ F D EY b n/a 15 2019 2041 2081 N
+ F D EY i n/a 15 2019 2042 2081 N
+ F D G b n/a 15 2019 2038 2077 N
+ F D IH b n/a 15 2019 2041 2083 N
+ F D IH i n/a 15 2019 2042 2083 N
+ F D IY b n/a 15 2019 2041 2082 N
+ F D IY i n/a 15 2019 2042 2082 N
+ F D K b n/a 15 2019 2038 2077 N
+ F D L b n/a 15 2019 2051 2070 N
+ F D L i n/a 15 2019 2051 2070 N
+ F D M b n/a 15 2019 2038 2077 N
+ F D N b n/a 15 2019 2037 2075 N
+ F D OW b n/a 15 2019 2051 2066 N
+ F D OW i n/a 15 2019 2051 2066 N
+ F D OY b n/a 15 2019 2051 2067 N
+ F D P b n/a 15 2019 2038 2077 N
+ F D R b n/a 15 2019 2052 2074 N
+ F D R i n/a 15 2019 2052 2074 N
+ F D S b n/a 15 2019 2038 2077 N
+ F D S i n/a 15 2019 2038 2077 N
+ F D T b n/a 15 2019 2037 2075 N
+ F D TH b n/a 15 2019 2038 2077 N
+ F D UH b n/a 15 2019 2051 2068 N
+ F D UH i n/a 15 2019 2051 2068 N
+ F D UW b n/a 15 2019 2051 2068 N
+ F D V b n/a 15 2019 2038 2077 N
+ F D W b n/a 15 2019 2051 2070 N
+ F D Y b n/a 15 2019 2041 2078 N
+ F DH AA b n/a 15 2019 2051 2065 N
+ F DH AE b n/a 15 2019 2041 2079 N
+ F DH AH b n/a 15 2019 2042 2064 N
+ F DH AO b n/a 15 2019 2051 2067 N
+ F DH AW b n/a 15 2019 2041 2079 N
+ F DH AY b n/a 15 2019 2051 2063 N
+ F DH D b n/a 15 2019 2037 2075 N
+ F DH EH b n/a 15 2019 2041 2080 N
+ F DH ER b n/a 15 2019 2052 2072 N
+ F DH EY b n/a 15 2019 2041 2081 N
+ F DH G b n/a 15 2019 2038 2077 N
+ F DH IH b n/a 15 2019 2041 2083 N
+ F DH IY b n/a 15 2019 2041 2082 N
+ F DH K b n/a 15 2019 2038 2077 N
+ F DH L b n/a 15 2019 2051 2070 N
+ F DH M b n/a 15 2019 2038 2077 N
+ F DH N b n/a 15 2019 2037 2075 N
+ F DH OW b n/a 15 2019 2051 2066 N
+ F DH OY b n/a 15 2019 2051 2067 N
+ F DH P b n/a 15 2019 2038 2077 N
+ F DH R b n/a 15 2019 2052 2074 N
+ F DH S b n/a 15 2019 2038 2077 N
+ F DH T b n/a 15 2019 2037 2075 N
+ F DH TH b n/a 15 2019 2038 2077 N
+ F DH UH b n/a 15 2019 2051 2068 N
+ F DH UW b n/a 15 2019 2051 2068 N
+ F DH V b n/a 15 2019 2038 2077 N
+ F DH W b n/a 15 2019 2051 2070 N
+ F DH Y b n/a 15 2019 2041 2078 N
+ F EH AA b n/a 15 2029 2054 2065 N
+ F EH AA e n/a 15 2029 2054 2065 N
+ F EH AA i n/a 15 2029 2054 2065 N
+ F EH AE b n/a 15 2029 2044 2079 N
+ F EH AE e n/a 15 2029 2044 2080 N
+ F EH AH b n/a 15 2029 2046 2064 N
+ F EH AH e n/a 15 2029 2046 2069 N
+ F EH AH i n/a 15 2029 2046 2068 N
+ F EH AO b n/a 15 2029 2055 2067 N
+ F EH AO e n/a 15 2029 2055 2066 N
+ F EH AO i n/a 15 2029 2055 2067 N
+ F EH AW b n/a 15 2029 2044 2079 N
+ F EH AW e n/a 15 2029 2044 2079 N
+ F EH AW i n/a 15 2029 2044 2079 N
+ F EH AY b n/a 15 2029 2054 2063 N
+ F EH AY e n/a 15 2029 2054 2064 N
+ F EH AY i n/a 15 2029 2054 2063 N
+ F EH B e n/a 15 2029 2038 2077 N
+ F EH B i n/a 15 2029 2038 2077 N
+ F EH CH e n/a 15 2029 2038 2078 N
+ F EH D b n/a 15 2029 2037 2075 N
+ F EH D e n/a 15 2029 2037 2075 N
+ F EH D i n/a 15 2029 2037 2075 N
+ F EH DH e n/a 15 2029 2038 2077 N
+ F EH EH b n/a 15 2029 2044 2080 N
+ F EH EH e n/a 15 2029 2044 2080 N
+ F EH EH i n/a 15 2029 2044 2080 N
+ F EH ER b n/a 15 2029 2054 2071 N
+ F EH ER e n/a 15 2029 2057 2071 N
+ F EH ER i n/a 15 2029 2057 2071 N
+ F EH EY b n/a 15 2029 2044 2081 N
+ F EH EY e n/a 15 2029 2044 2081 N
+ F EH EY i n/a 15 2029 2044 2081 N
+ F EH F e n/a 15 2029 2038 2077 N
+ F EH G b n/a 15 2029 2038 2077 N
+ F EH G e n/a 15 2029 2038 2077 N
+ F EH G i n/a 15 2029 2038 2077 N
+ F EH HH e n/a 15 2029 2038 2075 N
+ F EH IH b n/a 15 2029 2044 2083 N
+ F EH IH e n/a 15 2029 2044 2083 N
+ F EH IH i n/a 15 2029 2044 2083 N
+ F EH IY b n/a 15 2029 2044 2082 N
+ F EH IY e n/a 15 2029 2044 2082 N
+ F EH IY i n/a 15 2029 2044 2082 N
+ F EH JH e n/a 15 2029 2038 2078 N
+ F EH K b n/a 15 2029 2038 2077 N
+ F EH K e n/a 15 2029 2038 2077 N
+ F EH K i n/a 15 2029 2038 2077 N
+ F EH L b n/a 15 2029 2055 2070 N
+ F EH L e n/a 15 2029 2055 2070 N
+ F EH L i n/a 15 2029 2055 2070 N
+ F EH M b n/a 15 2029 2038 2077 N
+ F EH M e n/a 15 2029 2038 2077 N
+ F EH N b n/a 15 2029 2037 2075 N
+ F EH N e n/a 15 2029 2037 2075 N
+ F EH N i n/a 15 2029 2037 2075 N
+ F EH NG e n/a 15 2029 2038 2077 N
+ F EH OW b n/a 15 2029 2055 2066 N
+ F EH OW e n/a 15 2029 2055 2066 N
+ F EH OW i n/a 15 2029 2055 2066 N
+ F EH OY b n/a 15 2029 2055 2067 N
+ F EH OY e n/a 15 2029 2055 2066 N
+ F EH OY i n/a 15 2029 2055 2067 N
+ F EH P b n/a 15 2029 2038 2077 N
+ F EH P e n/a 15 2029 2038 2077 N
+ F EH R b n/a 15 2029 2055 2074 N
+ F EH R e n/a 15 2029 2057 2074 N
+ F EH R i n/a 15 2029 2057 2074 N
+ F EH S b n/a 15 2029 2038 2077 N
+ F EH S e n/a 15 2029 2038 2077 N
+ F EH S i n/a 15 2029 2038 2077 N
+ F EH SH e n/a 15 2029 2038 2078 N
+ F EH SIL e n/a 15 2029 2039 2077 N
+ F EH T b n/a 15 2029 2037 2075 N
+ F EH T e n/a 15 2029 2037 2075 N
+ F EH T i n/a 15 2029 2037 2075 N
+ F EH TH b n/a 15 2029 2038 2077 N
+ F EH TH e n/a 15 2029 2038 2077 N
+ F EH TH i n/a 15 2029 2038 2077 N
+ F EH UH b n/a 15 2029 2055 2068 N
+ F EH UH e n/a 15 2029 2055 2068 N
+ F EH UH i n/a 15 2029 2055 2068 N
+ F EH UW b n/a 15 2029 2055 2068 N
+ F EH UW e n/a 15 2029 2055 2068 N
+ F EH UW i n/a 15 2029 2055 2068 N
+ F EH V b n/a 15 2029 2038 2077 N
+ F EH V e n/a 15 2029 2038 2077 N
+ F EH W b n/a 15 2029 2055 2070 N
+ F EH W e n/a 15 2029 2055 2070 N
+ F EH Y b n/a 15 2029 2044 2078 N
+ F EH Y e n/a 15 2029 2044 2078 N
+ F EH Y i n/a 15 2029 2044 2078 N
+ F EH Z e n/a 15 2029 2038 2077 N
+ F EH Z i n/a 15 2029 2038 2077 N
+ F EH ZH e n/a 15 2029 2038 2078 N
+ F ER AA b n/a 15 2033 2054 2065 N
+ F ER AA e n/a 15 2033 2054 2065 N
+ F ER AA i n/a 15 2033 2054 2065 N
+ F ER AE b n/a 15 2033 2044 2079 N
+ F ER AE e n/a 15 2033 2044 2080 N
+ F ER AE i n/a 15 2033 2046 2079 N
+ F ER AH b n/a 15 2033 2044 2064 N
+ F ER AH e n/a 15 2033 2044 2069 N
+ F ER AH i n/a 15 2033 2046 2068 N
+ F ER AO b n/a 15 2033 2055 2067 N
+ F ER AO e n/a 15 2033 2055 2066 N
+ F ER AO i n/a 15 2033 2055 2067 N
+ F ER AW b n/a 15 2033 2044 2079 N
+ F ER AW e n/a 15 2033 2044 2079 N
+ F ER AW i n/a 15 2033 2046 2079 N
+ F ER AY b n/a 15 2033 2054 2063 N
+ F ER AY e n/a 15 2033 2054 2064 N
+ F ER AY i n/a 15 2033 2054 2063 N
+ F ER B e n/a 15 2033 2039 2077 N
+ F ER B i n/a 15 2033 2039 2077 N
+ F ER CH e n/a 15 2033 2039 2078 N
+ F ER D b n/a 15 2033 2039 2075 N
+ F ER D e n/a 15 2033 2039 2075 N
+ F ER D i n/a 15 2033 2039 2075 N
+ F ER DH e n/a 15 2033 2039 2077 N
+ F ER EH b n/a 15 2033 2044 2080 N
+ F ER EH e n/a 15 2033 2044 2080 N
+ F ER EH i n/a 15 2033 2046 2080 N
+ F ER ER b n/a 15 2033 2057 2072 N
+ F ER ER e n/a 15 2033 2057 2072 N
+ F ER ER i n/a 15 2033 2057 2071 N
+ F ER EY b n/a 15 2033 2044 2081 N
+ F ER EY e n/a 15 2033 2044 2081 N
+ F ER EY i n/a 15 2033 2046 2081 N
+ F ER F e n/a 15 2033 2039 2077 N
+ F ER G b n/a 15 2033 2039 2077 N
+ F ER G e n/a 15 2033 2039 2077 N
+ F ER HH e n/a 15 2033 2039 2075 N
+ F ER IH b n/a 15 2033 2044 2083 N
+ F ER IH e n/a 15 2033 2044 2083 N
+ F ER IH i n/a 15 2033 2046 2083 N
+ F ER IY b n/a 15 2033 2044 2082 N
+ F ER IY e n/a 15 2033 2044 2082 N
+ F ER IY i n/a 15 2033 2046 2082 N
+ F ER JH e n/a 15 2033 2039 2078 N
+ F ER K b n/a 15 2033 2039 2077 N
+ F ER K e n/a 15 2033 2039 2077 N
+ F ER L b n/a 15 2033 2055 2070 N
+ F ER L e n/a 15 2033 2055 2070 N
+ F ER L i n/a 15 2033 2055 2070 N
+ F ER M b n/a 15 2033 2039 2077 N
+ F ER M e n/a 15 2033 2039 2077 N
+ F ER M i n/a 15 2033 2039 2077 N
+ F ER N b n/a 15 2033 2039 2075 N
+ F ER N e n/a 15 2033 2039 2075 N
+ F ER NG e n/a 15 2033 2039 2077 N
+ F ER OW b n/a 15 2033 2055 2066 N
+ F ER OW e n/a 15 2033 2055 2066 N
+ F ER OW i n/a 15 2033 2055 2066 N
+ F ER OY b n/a 15 2033 2055 2067 N
+ F ER OY e n/a 15 2033 2055 2066 N
+ F ER OY i n/a 15 2033 2055 2067 N
+ F ER P b n/a 15 2033 2039 2077 N
+ F ER P e n/a 15 2033 2039 2077 N
+ F ER R b n/a 15 2033 2057 2074 N
+ F ER R e n/a 15 2033 2057 2074 N
+ F ER R i n/a 15 2033 2057 2074 N
+ F ER S b n/a 15 2033 2039 2077 N
+ F ER S e n/a 15 2033 2039 2077 N
+ F ER S i n/a 15 2033 2039 2077 N
+ F ER SH e n/a 15 2033 2039 2078 N
+ F ER SIL e n/a 15 2033 2039 2077 N
+ F ER T b n/a 15 2033 2039 2075 N
+ F ER T e n/a 15 2033 2039 2075 N
+ F ER T i n/a 15 2033 2039 2075 N
+ F ER TH b n/a 15 2033 2039 2077 N
+ F ER TH e n/a 15 2033 2039 2077 N
+ F ER UH b n/a 15 2033 2055 2068 N
+ F ER UH e n/a 15 2033 2055 2068 N
+ F ER UH i n/a 15 2033 2055 2068 N
+ F ER UW b n/a 15 2033 2055 2068 N
+ F ER UW e n/a 15 2033 2055 2068 N
+ F ER UW i n/a 15 2033 2055 2068 N
+ F ER V b n/a 15 2033 2039 2077 N
+ F ER V e n/a 15 2033 2039 2077 N
+ F ER W b n/a 15 2033 2055 2070 N
+ F ER W e n/a 15 2033 2055 2070 N
+ F ER Y b n/a 15 2033 2044 2078 N
+ F ER Y e n/a 15 2033 2044 2078 N
+ F ER Y i n/a 15 2033 2046 2078 N
+ F ER Z e n/a 15 2033 2039 2077 N
+ F ER ZH e n/a 15 2033 2039 2078 N
+ F EY AA b n/a 15 2027 2054 2065 N
+ F EY AA e n/a 15 2027 2054 2065 N
+ F EY AA i n/a 15 2027 2054 2065 N
+ F EY AE b n/a 15 2027 2044 2079 N
+ F EY AE e n/a 15 2027 2044 2080 N
+ F EY AH b n/a 15 2027 2047 2064 N
+ F EY AH e n/a 15 2027 2047 2069 N
+ F EY AH i n/a 15 2027 2047 2068 N
+ F EY AO b n/a 15 2027 2055 2067 N
+ F EY AO e n/a 15 2027 2055 2066 N
+ F EY AO i n/a 15 2027 2055 2067 N
+ F EY AW b n/a 15 2027 2044 2079 N
+ F EY AW e n/a 15 2027 2044 2079 N
+ F EY AY b n/a 15 2027 2054 2063 N
+ F EY AY e n/a 15 2027 2054 2064 N
+ F EY AY i n/a 15 2027 2054 2063 N
+ F EY B e n/a 15 2027 2040 2077 N
+ F EY CH e n/a 15 2027 2040 2078 N
+ F EY D b n/a 15 2027 2040 2075 N
+ F EY D e n/a 15 2027 2040 2075 N
+ F EY DH e n/a 15 2027 2040 2077 N
+ F EY EH b n/a 15 2027 2044 2080 N
+ F EY EH e n/a 15 2027 2044 2080 N
+ F EY EH i n/a 15 2027 2044 2080 N
+ F EY ER b n/a 15 2027 2057 2072 N
+ F EY ER e n/a 15 2027 2057 2072 N
+ F EY ER i n/a 15 2027 2057 2071 N
+ F EY EY b n/a 15 2027 2044 2081 N
+ F EY EY e n/a 15 2027 2044 2081 N
+ F EY F e n/a 15 2027 2040 2077 N
+ F EY G b n/a 15 2027 2040 2077 N
+ F EY G e n/a 15 2027 2040 2077 N
+ F EY G i n/a 15 2027 2040 2077 N
+ F EY HH e n/a 15 2027 2040 2075 N
+ F EY HH i n/a 15 2027 2040 2075 N
+ F EY IH b n/a 15 2027 2044 2083 N
+ F EY IH e n/a 15 2027 2044 2083 N
+ F EY IH i n/a 15 2027 2044 2083 N
+ F EY IY b n/a 15 2027 2044 2082 N
+ F EY IY e n/a 15 2027 2044 2082 N
+ F EY IY i n/a 15 2027 2044 2082 N
+ F EY JH e n/a 15 2027 2040 2078 N
+ F EY K b n/a 15 2027 2040 2077 N
+ F EY K e n/a 15 2027 2040 2077 N
+ F EY K i n/a 15 2027 2040 2077 N
+ F EY L b n/a 15 2027 2055 2070 N
+ F EY L e n/a 15 2027 2055 2070 N
+ F EY L i n/a 15 2027 2055 2070 N
+ F EY M b n/a 15 2027 2040 2077 N
+ F EY M e n/a 15 2027 2040 2077 N
+ F EY M i n/a 15 2027 2040 2077 N
+ F EY N b n/a 15 2027 2040 2075 N
+ F EY N e n/a 15 2027 2040 2075 N
+ F EY NG e n/a 15 2027 2040 2077 N
+ F EY OW b n/a 15 2027 2055 2066 N
+ F EY OW e n/a 15 2027 2055 2066 N
+ F EY OW i n/a 15 2027 2055 2066 N
+ F EY OY b n/a 15 2027 2055 2067 N
+ F EY OY e n/a 15 2027 2055 2066 N
+ F EY P b n/a 15 2027 2040 2077 N
+ F EY P e n/a 15 2027 2040 2077 N
+ F EY R b n/a 15 2027 2057 2074 N
+ F EY R e n/a 15 2027 2057 2074 N
+ F EY R i n/a 15 2027 2057 2074 N
+ F EY S b n/a 15 2027 2040 2077 N
+ F EY S e n/a 15 2027 2040 2077 N
+ F EY S i n/a 15 2027 2040 2077 N
+ F EY SH e n/a 15 2027 2040 2078 N
+ F EY SIL e n/a 15 2027 2040 2077 N
+ F EY T b n/a 15 2027 2040 2075 N
+ F EY T e n/a 15 2027 2040 2075 N
+ F EY T i n/a 15 2027 2040 2075 N
+ F EY TH b n/a 15 2027 2040 2077 N
+ F EY TH e n/a 15 2027 2040 2077 N
+ F EY UH b n/a 15 2027 2055 2068 N
+ F EY UH e n/a 15 2027 2055 2068 N
+ F EY UW b n/a 15 2027 2055 2068 N
+ F EY UW e n/a 15 2027 2055 2068 N
+ F EY V b n/a 15 2027 2040 2077 N
+ F EY V e n/a 15 2027 2040 2077 N
+ F EY W b n/a 15 2027 2055 2070 N
+ F EY W e n/a 15 2027 2055 2070 N
+ F EY W i n/a 15 2027 2055 2070 N
+ F EY Y b n/a 15 2027 2044 2078 N
+ F EY Y e n/a 15 2027 2044 2078 N
+ F EY Z e n/a 15 2027 2040 2077 N
+ F EY ZH e n/a 15 2027 2040 2078 N
+ F F AA b n/a 15 2018 2051 2065 N
+ F F AE b n/a 15 2018 2041 2079 N
+ F F AH b n/a 15 2018 2042 2064 N
+ F F AO b n/a 15 2018 2051 2067 N
+ F F AW b n/a 15 2018 2041 2079 N
+ F F AY b n/a 15 2018 2051 2063 N
+ F F D b n/a 15 2018 2037 2075 N
+ F F EH b n/a 15 2018 2041 2080 N
+ F F ER b n/a 15 2018 2052 2072 N
+ F F ER i n/a 15 2018 2052 2071 N
+ F F EY b n/a 15 2018 2041 2081 N
+ F F G b n/a 15 2018 2038 2077 N
+ F F IH b n/a 15 2018 2041 2083 N
+ F F IH i n/a 15 2018 2042 2083 N
+ F F IY b n/a 15 2018 2041 2082 N
+ F F K b n/a 15 2018 2038 2077 N
+ F F L b n/a 15 2018 2051 2070 N
+ F F M b n/a 15 2018 2038 2077 N
+ F F N b n/a 15 2018 2037 2075 N
+ F F OW b n/a 15 2018 2051 2066 N
+ F F OY b n/a 15 2018 2051 2067 N
+ F F P b n/a 15 2018 2038 2077 N
+ F F R b n/a 15 2018 2052 2074 N
+ F F R i n/a 15 2018 2052 2074 N
+ F F S b n/a 15 2018 2038 2077 N
+ F F T b n/a 15 2018 2037 2075 N
+ F F TH b n/a 15 2018 2038 2077 N
+ F F UH b n/a 15 2018 2051 2068 N
+ F F UW b n/a 15 2018 2051 2068 N
+ F F V b n/a 15 2018 2038 2077 N
+ F F W b n/a 15 2018 2051 2070 N
+ F F Y b n/a 15 2018 2041 2078 N
+ F G AA b n/a 15 2019 2051 2065 N
+ F G AA e n/a 15 2019 2051 2065 N
+ F G AE b n/a 15 2019 2041 2079 N
+ F G AE e n/a 15 2019 2041 2080 N
+ F G AH b n/a 15 2019 2042 2064 N
+ F G AH e n/a 15 2019 2042 2069 N
+ F G AH i n/a 15 2019 2042 2068 N
+ F G AO b n/a 15 2019 2051 2067 N
+ F G AO e n/a 15 2019 2051 2066 N
+ F G AO i n/a 15 2019 2051 2067 N
+ F G AW b n/a 15 2019 2041 2079 N
+ F G AW e n/a 15 2019 2041 2079 N
+ F G AY b n/a 15 2019 2051 2063 N
+ F G AY e n/a 15 2019 2051 2064 N
+ F G AY i n/a 15 2019 2051 2063 N
+ F G B e n/a 15 2019 2038 2077 N
+ F G CH e n/a 15 2019 2038 2078 N
+ F G D b n/a 15 2019 2037 2075 N
+ F G D e n/a 15 2019 2037 2075 N
+ F G DH e n/a 15 2019 2038 2077 N
+ F G EH b n/a 15 2019 2041 2080 N
+ F G EH e n/a 15 2019 2041 2080 N
+ F G EH i n/a 15 2019 2042 2080 N
+ F G ER b n/a 15 2019 2052 2072 N
+ F G ER e n/a 15 2019 2052 2072 N
+ F G ER i n/a 15 2019 2052 2071 N
+ F G EY b n/a 15 2019 2041 2081 N
+ F G EY e n/a 15 2019 2041 2081 N
+ F G EY i n/a 15 2019 2042 2081 N
+ F G F e n/a 15 2019 2038 2077 N
+ F G G b n/a 15 2019 2038 2077 N
+ F G G e n/a 15 2019 2038 2077 N
+ F G HH e n/a 15 2019 2038 2075 N
+ F G IH b n/a 15 2019 2041 2083 N
+ F G IH e n/a 15 2019 2041 2083 N
+ F G IH i n/a 15 2019 2042 2083 N
+ F G IY b n/a 15 2019 2041 2082 N
+ F G IY e n/a 15 2019 2041 2082 N
+ F G IY i n/a 15 2019 2042 2082 N
+ F G JH e n/a 15 2019 2038 2078 N
+ F G K b n/a 15 2019 2038 2077 N
+ F G K e n/a 15 2019 2038 2077 N
+ F G L b n/a 15 2019 2051 2070 N
+ F G L e n/a 15 2019 2051 2070 N
+ F G L i n/a 15 2019 2051 2070 N
+ F G M b n/a 15 2019 2038 2077 N
+ F G M e n/a 15 2019 2038 2077 N
+ F G N b n/a 15 2019 2037 2075 N
+ F G N e n/a 15 2019 2037 2075 N
+ F G NG e n/a 15 2019 2038 2077 N
+ F G OW b n/a 15 2019 2051 2066 N
+ F G OW e n/a 15 2019 2051 2066 N
+ F G OY b n/a 15 2019 2051 2067 N
+ F G OY e n/a 15 2019 2051 2066 N
+ F G P b n/a 15 2019 2038 2077 N
+ F G P e n/a 15 2019 2038 2077 N
+ F G R b n/a 15 2019 2052 2074 N
+ F G R e n/a 15 2019 2052 2074 N
+ F G R i n/a 15 2019 2052 2074 N
+ F G S b n/a 15 2019 2038 2077 N
+ F G S e n/a 15 2019 2038 2077 N
+ F G SH e n/a 15 2019 2038 2078 N
+ F G SIL e n/a 15 2019 2039 2077 N
+ F G T b n/a 15 2019 2037 2075 N
+ F G T e n/a 15 2019 2037 2075 N
+ F G TH b n/a 15 2019 2038 2077 N
+ F G TH e n/a 15 2019 2038 2077 N
+ F G UH b n/a 15 2019 2051 2068 N
+ F G UH e n/a 15 2019 2051 2068 N
+ F G UH i n/a 15 2019 2051 2068 N
+ F G UW b n/a 15 2019 2051 2068 N
+ F G UW e n/a 15 2019 2051 2068 N
+ F G V b n/a 15 2019 2038 2077 N
+ F G V e n/a 15 2019 2038 2077 N
+ F G W b n/a 15 2019 2051 2070 N
+ F G W e n/a 15 2019 2051 2070 N
+ F G Y b n/a 15 2019 2041 2078 N
+ F G Y e n/a 15 2019 2041 2078 N
+ F G Z e n/a 15 2019 2038 2077 N
+ F G ZH e n/a 15 2019 2038 2078 N
+ F HH AA b n/a 15 2018 2051 2065 N
+ F HH AA e n/a 15 2018 2051 2065 N
+ F HH AE b n/a 15 2018 2041 2079 N
+ F HH AE e n/a 15 2018 2041 2080 N
+ F HH AH b n/a 15 2018 2042 2064 N
+ F HH AH e n/a 15 2018 2042 2069 N
+ F HH AO b n/a 15 2018 2051 2067 N
+ F HH AO e n/a 15 2018 2051 2066 N
+ F HH AW b n/a 15 2018 2041 2079 N
+ F HH AW e n/a 15 2018 2041 2079 N
+ F HH AY b n/a 15 2018 2051 2063 N
+ F HH AY e n/a 15 2018 2051 2064 N
+ F HH B e n/a 15 2018 2038 2077 N
+ F HH CH e n/a 15 2018 2038 2078 N
+ F HH D b n/a 15 2018 2037 2075 N
+ F HH D e n/a 15 2018 2037 2075 N
+ F HH DH e n/a 15 2018 2038 2077 N
+ F HH EH b n/a 15 2018 2041 2080 N
+ F HH EH e n/a 15 2018 2041 2080 N
+ F HH ER b n/a 15 2018 2052 2072 N
+ F HH ER e n/a 15 2018 2052 2072 N
+ F HH EY b n/a 15 2018 2041 2081 N
+ F HH EY e n/a 15 2018 2041 2081 N
+ F HH F e n/a 15 2018 2038 2077 N
+ F HH G b n/a 15 2018 2038 2077 N
+ F HH G e n/a 15 2018 2038 2077 N
+ F HH HH e n/a 15 2018 2038 2075 N
+ F HH IH b n/a 15 2018 2041 2083 N
+ F HH IH e n/a 15 2018 2041 2083 N
+ F HH IY b n/a 15 2018 2041 2082 N
+ F HH IY e n/a 15 2018 2041 2082 N
+ F HH JH e n/a 15 2018 2038 2078 N
+ F HH K b n/a 15 2018 2038 2077 N
+ F HH K e n/a 15 2018 2038 2077 N
+ F HH L b n/a 15 2018 2051 2070 N
+ F HH L e n/a 15 2018 2051 2070 N
+ F HH M b n/a 15 2018 2038 2077 N
+ F HH M e n/a 15 2018 2038 2077 N
+ F HH N b n/a 15 2018 2037 2075 N
+ F HH N e n/a 15 2018 2037 2075 N
+ F HH NG e n/a 15 2018 2038 2077 N
+ F HH OW b n/a 15 2018 2051 2066 N
+ F HH OW e n/a 15 2018 2051 2066 N
+ F HH OY b n/a 15 2018 2051 2067 N
+ F HH OY e n/a 15 2018 2051 2066 N
+ F HH P b n/a 15 2018 2038 2077 N
+ F HH P e n/a 15 2018 2038 2077 N
+ F HH R b n/a 15 2018 2052 2074 N
+ F HH R e n/a 15 2018 2052 2074 N
+ F HH S b n/a 15 2018 2038 2077 N
+ F HH S e n/a 15 2018 2038 2077 N
+ F HH SH e n/a 15 2018 2038 2078 N
+ F HH SIL e n/a 15 2018 2039 2077 N
+ F HH T b n/a 15 2018 2037 2075 N
+ F HH T e n/a 15 2018 2037 2075 N
+ F HH TH b n/a 15 2018 2038 2077 N
+ F HH TH e n/a 15 2018 2038 2077 N
+ F HH UH b n/a 15 2018 2051 2068 N
+ F HH UH e n/a 15 2018 2051 2068 N
+ F HH UW b n/a 15 2018 2051 2068 N
+ F HH UW e n/a 15 2018 2051 2068 N
+ F HH V b n/a 15 2018 2038 2077 N
+ F HH V e n/a 15 2018 2038 2077 N
+ F HH W b n/a 15 2018 2051 2070 N
+ F HH W e n/a 15 2018 2051 2070 N
+ F HH Y b n/a 15 2018 2041 2078 N
+ F HH Y e n/a 15 2018 2041 2078 N
+ F HH Z e n/a 15 2018 2038 2077 N
+ F HH ZH e n/a 15 2018 2038 2078 N
+ F IH AA b n/a 15 2024 2059 2065 N
+ F IH AA e n/a 15 2024 2059 2065 N
+ F IH AA i n/a 15 2024 2059 2065 N
+ F IH AE b n/a 15 2024 2048 2079 N
+ F IH AE e n/a 15 2024 2048 2080 N
+ F IH AE i n/a 15 2024 2048 2079 N
+ F IH AH b n/a 15 2025 2049 2064 N
+ F IH AH e n/a 15 2025 2049 2069 N
+ F IH AH i n/a 15 2025 2049 2069 N
+ F IH AO b n/a 15 2024 2059 2067 N
+ F IH AO e n/a 15 2024 2059 2066 N
+ F IH AO i n/a 15 2024 2059 2067 N
+ F IH AW b n/a 15 2025 2048 2079 N
+ F IH AW e n/a 15 2025 2048 2079 N
+ F IH AW i n/a 15 2025 2048 2079 N
+ F IH AY b n/a 15 2025 2058 2063 N
+ F IH AY e n/a 15 2025 2058 2063 N
+ F IH AY i n/a 15 2025 2058 2063 N
+ F IH B e n/a 15 2025 2049 2076 N
+ F IH B i n/a 15 2025 2049 2076 N
+ F IH CH e n/a 15 2025 2049 2078 N
+ F IH D b n/a 15 2025 2049 2076 N
+ F IH D e n/a 15 2025 2049 2076 N
+ F IH DH e n/a 15 2025 2049 2076 N
+ F IH DH i n/a 15 2025 2049 2076 N
+ F IH EH b n/a 15 2025 2048 2080 N
+ F IH EH e n/a 15 2025 2048 2080 N
+ F IH EH i n/a 15 2025 2048 2080 N
+ F IH ER b n/a 15 2025 2058 2071 N
+ F IH ER e n/a 15 2025 2058 2071 N
+ F IH ER i n/a 15 2025 2058 2071 N
+ F IH EY b n/a 15 2024 2048 2081 N
+ F IH EY e n/a 15 2024 2048 2081 N
+ F IH EY i n/a 15 2024 2048 2081 N
+ F IH F e n/a 15 2025 2049 2076 N
+ F IH G b n/a 15 2025 2049 2076 N
+ F IH G e n/a 15 2025 2049 2076 N
+ F IH HH e n/a 15 2025 2049 2078 N
+ F IH HH i n/a 15 2025 2049 2078 N
+ F IH IH b n/a 15 2025 2049 2083 N
+ F IH IH e n/a 15 2025 2049 2083 N
+ F IH IH i n/a 15 2025 2049 2083 N
+ F IH IY b n/a 15 2024 2048 2082 N
+ F IH IY e n/a 15 2024 2048 2082 N
+ F IH IY i n/a 15 2024 2048 2082 N
+ F IH JH e n/a 15 2025 2049 2078 N
+ F IH K b n/a 15 2025 2049 2076 N
+ F IH K e n/a 15 2025 2049 2076 N
+ F IH K i n/a 15 2025 2049 2076 N
+ F IH L b n/a 15 2025 2058 2070 N
+ F IH L e n/a 15 2025 2058 2070 N
+ F IH L i n/a 15 2025 2058 2070 N
+ F IH M b n/a 15 2025 2049 2076 N
+ F IH M e n/a 15 2025 2049 2076 N
+ F IH M i n/a 15 2025 2049 2076 N
+ F IH N b n/a 15 2025 2049 2076 N
+ F IH N e n/a 15 2025 2049 2076 N
+ F IH N i n/a 15 2025 2049 2076 N
+ F IH NG e n/a 15 2025 2049 2076 N
+ F IH OW b n/a 15 2025 2058 2066 N
+ F IH OW e n/a 15 2025 2058 2066 N
+ F IH OW i n/a 15 2025 2058 2066 N
+ F IH OY b n/a 15 2025 2058 2067 N
+ F IH OY e n/a 15 2025 2058 2066 N
+ F IH OY i n/a 15 2025 2058 2067 N
+ F IH P b n/a 15 2025 2049 2076 N
+ F IH P e n/a 15 2025 2049 2076 N
+ F IH P i n/a 15 2025 2049 2076 N
+ F IH R b n/a 15 2025 2058 2074 N
+ F IH R e n/a 15 2025 2058 2074 N
+ F IH R i n/a 15 2025 2058 2074 N
+ F IH S b n/a 15 2025 2049 2076 N
+ F IH S e n/a 15 2025 2049 2076 N
+ F IH S i n/a 15 2025 2049 2076 N
+ F IH SH e n/a 15 2025 2049 2078 N
+ F IH SH i n/a 15 2025 2049 2078 N
+ F IH SIL e n/a 15 2025 2048 2076 N
+ F IH T b n/a 15 2025 2049 2076 N
+ F IH T e n/a 15 2025 2049 2076 N
+ F IH T i n/a 15 2025 2049 2076 N
+ F IH TH b n/a 15 2025 2049 2076 N
+ F IH TH e n/a 15 2025 2049 2076 N
+ F IH TH i n/a 15 2025 2049 2076 N
+ F IH UH b n/a 15 2025 2058 2068 N
+ F IH UH e n/a 15 2025 2058 2068 N
+ F IH UW b n/a 15 2024 2059 2068 N
+ F IH UW e n/a 15 2024 2059 2068 N
+ F IH UW i n/a 15 2024 2059 2068 N
+ F IH V b n/a 15 2025 2049 2076 N
+ F IH V e n/a 15 2025 2049 2076 N
+ F IH W b n/a 15 2025 2058 2070 N
+ F IH W e n/a 15 2025 2058 2070 N
+ F IH W i n/a 15 2025 2058 2070 N
+ F IH Y b n/a 15 2025 2049 2078 N
+ F IH Y e n/a 15 2025 2049 2078 N
+ F IH Y i n/a 15 2025 2049 2078 N
+ F IH Z e n/a 15 2025 2049 2076 N
+ F IH ZH e n/a 15 2025 2049 2078 N
+ F IY AA b n/a 15 2027 2059 2065 N
+ F IY AA e n/a 15 2027 2059 2065 N
+ F IY AA i n/a 15 2027 2059 2065 N
+ F IY AE b n/a 15 2027 2048 2079 N
+ F IY AE e n/a 15 2027 2048 2080 N
+ F IY AE i n/a 15 2027 2048 2079 N
+ F IY AH b n/a 15 2027 2048 2064 N
+ F IY AH e n/a 15 2027 2048 2069 N
+ F IY AH i n/a 15 2027 2048 2069 N
+ F IY AO b n/a 15 2027 2059 2067 N
+ F IY AO e n/a 15 2027 2059 2066 N
+ F IY AO i n/a 15 2027 2059 2067 N
+ F IY AW b n/a 15 2027 2048 2079 N
+ F IY AW e n/a 15 2027 2048 2079 N
+ F IY AW i n/a 15 2027 2048 2079 N
+ F IY AY b n/a 15 2027 2059 2063 N
+ F IY AY e n/a 15 2027 2059 2063 N
+ F IY AY i n/a 15 2027 2059 2063 N
+ F IY B e n/a 15 2027 2048 2076 N
+ F IY CH e n/a 15 2027 2048 2078 N
+ F IY D b n/a 15 2027 2048 2076 N
+ F IY D e n/a 15 2027 2048 2076 N
+ F IY D i n/a 15 2027 2048 2076 N
+ F IY DH e n/a 15 2027 2048 2076 N
+ F IY EH b n/a 15 2027 2048 2080 N
+ F IY EH e n/a 15 2027 2048 2080 N
+ F IY EH i n/a 15 2027 2048 2080 N
+ F IY ER b n/a 15 2027 2059 2072 N
+ F IY ER e n/a 15 2027 2059 2072 N
+ F IY ER i n/a 15 2027 2059 2071 N
+ F IY EY b n/a 15 2027 2048 2081 N
+ F IY EY e n/a 15 2027 2048 2081 N
+ F IY EY i n/a 15 2027 2048 2081 N
+ F IY F e n/a 15 2027 2048 2076 N
+ F IY G b n/a 15 2027 2048 2076 N
+ F IY G e n/a 15 2027 2048 2076 N
+ F IY HH e n/a 15 2027 2048 2078 N
+ F IY HH i n/a 15 2027 2048 2078 N
+ F IY IH b n/a 15 2027 2048 2083 N
+ F IY IH e n/a 15 2027 2048 2083 N
+ F IY IH i n/a 15 2027 2048 2083 N
+ F IY IY b n/a 15 2027 2048 2082 N
+ F IY IY e n/a 15 2027 2048 2082 N
+ F IY IY i n/a 15 2027 2048 2082 N
+ F IY JH e n/a 15 2027 2048 2078 N
+ F IY K b n/a 15 2027 2048 2076 N
+ F IY K e n/a 15 2027 2048 2076 N
+ F IY K i n/a 15 2027 2048 2076 N
+ F IY L b n/a 15 2027 2059 2070 N
+ F IY L e n/a 15 2027 2059 2070 N
+ F IY L i n/a 15 2027 2059 2070 N
+ F IY M b n/a 15 2027 2048 2076 N
+ F IY M e n/a 15 2027 2048 2076 N
+ F IY N b n/a 15 2027 2048 2076 N
+ F IY N e n/a 15 2027 2048 2076 N
+ F IY N i n/a 15 2027 2048 2076 N
+ F IY NG e n/a 15 2027 2048 2076 N
+ F IY OW b n/a 15 2027 2059 2066 N
+ F IY OW e n/a 15 2027 2059 2066 N
+ F IY OW i n/a 15 2027 2059 2066 N
+ F IY OY b n/a 15 2027 2059 2067 N
+ F IY OY e n/a 15 2027 2059 2066 N
+ F IY P b n/a 15 2027 2048 2076 N
+ F IY P e n/a 15 2027 2048 2076 N
+ F IY R b n/a 15 2027 2059 2074 N
+ F IY R e n/a 15 2027 2059 2074 N
+ F IY R i n/a 15 2027 2059 2074 N
+ F IY S b n/a 15 2027 2048 2076 N
+ F IY S e n/a 15 2027 2048 2076 N
+ F IY S i n/a 15 2027 2048 2076 N
+ F IY SH e n/a 15 2027 2048 2078 N
+ F IY SIL e n/a 15 2027 2048 2076 N
+ F IY T b n/a 15 2027 2048 2076 N
+ F IY T e n/a 15 2027 2048 2076 N
+ F IY T i n/a 15 2027 2048 2076 N
+ F IY TH b n/a 15 2027 2048 2076 N
+ F IY TH e n/a 15 2027 2048 2076 N
+ F IY UH b n/a 15 2027 2059 2068 N
+ F IY UH e n/a 15 2027 2059 2068 N
+ F IY UH i n/a 15 2027 2059 2068 N
+ F IY UW b n/a 15 2027 2059 2068 N
+ F IY UW e n/a 15 2027 2059 2068 N
+ F IY UW i n/a 15 2027 2059 2068 N
+ F IY V b n/a 15 2027 2048 2076 N
+ F IY V e n/a 15 2027 2048 2076 N
+ F IY V i n/a 15 2027 2048 2076 N
+ F IY W b n/a 15 2027 2059 2070 N
+ F IY W e n/a 15 2027 2059 2070 N
+ F IY W i n/a 15 2027 2059 2070 N
+ F IY Y b n/a 15 2027 2048 2078 N
+ F IY Y e n/a 15 2027 2048 2078 N
+ F IY Y i n/a 15 2027 2048 2078 N
+ F IY Z e n/a 15 2027 2048 2076 N
+ F IY ZH e n/a 15 2027 2048 2078 N
+ F JH AA b n/a 15 2021 2051 2065 N
+ F JH AE b n/a 15 2021 2041 2079 N
+ F JH AH b n/a 15 2021 2042 2064 N
+ F JH AH i n/a 15 2021 2042 2068 N
+ F JH AO b n/a 15 2021 2051 2067 N
+ F JH AO i n/a 15 2021 2051 2067 N
+ F JH AW b n/a 15 2021 2041 2079 N
+ F JH AY b n/a 15 2021 2051 2063 N
+ F JH D b n/a 15 2021 2037 2075 N
+ F JH EH b n/a 15 2021 2041 2080 N
+ F JH EH i n/a 15 2021 2042 2080 N
+ F JH ER b n/a 15 2021 2053 2072 N
+ F JH EY b n/a 15 2021 2041 2081 N
+ F JH G b n/a 15 2021 2038 2077 N
+ F JH IH b n/a 15 2021 2041 2083 N
+ F JH IY b n/a 15 2021 2041 2082 N
+ F JH IY i n/a 15 2021 2042 2082 N
+ F JH K b n/a 15 2021 2038 2077 N
+ F JH L b n/a 15 2021 2051 2070 N
+ F JH M b n/a 15 2021 2038 2077 N
+ F JH N b n/a 15 2021 2037 2075 N
+ F JH OW b n/a 15 2021 2051 2066 N
+ F JH OY b n/a 15 2021 2051 2067 N
+ F JH P b n/a 15 2021 2038 2077 N
+ F JH R b n/a 15 2021 2052 2074 N
+ F JH S b n/a 15 2021 2038 2077 N
+ F JH T b n/a 15 2021 2037 2075 N
+ F JH TH b n/a 15 2021 2038 2077 N
+ F JH UH b n/a 15 2021 2051 2068 N
+ F JH UW b n/a 15 2021 2051 2068 N
+ F JH V b n/a 15 2021 2038 2077 N
+ F JH W b n/a 15 2021 2051 2070 N
+ F JH Y b n/a 15 2021 2041 2078 N
+ F K AA b n/a 15 2018 2051 2065 N
+ F K AA i n/a 15 2018 2051 2065 N
+ F K AE b n/a 15 2018 2041 2079 N
+ F K AE i n/a 15 2018 2042 2079 N
+ F K AH b n/a 15 2018 2042 2064 N
+ F K AH i n/a 15 2018 2042 2068 N
+ F K AO b n/a 15 2018 2051 2067 N
+ F K AO i n/a 15 2018 2051 2067 N
+ F K AW b n/a 15 2018 2041 2079 N
+ F K AY b n/a 15 2018 2051 2063 N
+ F K AY i n/a 15 2018 2051 2063 N
+ F K D b n/a 15 2018 2037 2075 N
+ F K EH b n/a 15 2018 2041 2080 N
+ F K EH i n/a 15 2018 2042 2080 N
+ F K ER b n/a 15 2018 2052 2072 N
+ F K ER i n/a 15 2018 2052 2071 N
+ F K EY b n/a 15 2018 2041 2081 N
+ F K EY i n/a 15 2018 2042 2081 N
+ F K G b n/a 15 2018 2038 2077 N
+ F K IH b n/a 15 2018 2041 2083 N
+ F K IH i n/a 15 2018 2042 2083 N
+ F K IY b n/a 15 2018 2041 2082 N
+ F K IY i n/a 15 2018 2042 2082 N
+ F K K b n/a 15 2018 2038 2077 N
+ F K L b n/a 15 2018 2051 2070 N
+ F K L i n/a 15 2018 2051 2070 N
+ F K M b n/a 15 2018 2038 2077 N
+ F K N b n/a 15 2018 2037 2075 N
+ F K OW b n/a 15 2018 2051 2066 N
+ F K OW i n/a 15 2018 2051 2066 N
+ F K OY b n/a 15 2018 2051 2067 N
+ F K P b n/a 15 2018 2038 2077 N
+ F K R b n/a 15 2018 2052 2074 N
+ F K R i n/a 15 2018 2052 2074 N
+ F K S b n/a 15 2018 2038 2077 N
+ F K S i n/a 15 2018 2038 2077 N
+ F K T b n/a 15 2018 2037 2075 N
+ F K TH b n/a 15 2018 2038 2077 N
+ F K UH b n/a 15 2018 2051 2068 N
+ F K UH i n/a 15 2018 2051 2068 N
+ F K UW b n/a 15 2018 2051 2068 N
+ F K V b n/a 15 2018 2038 2077 N
+ F K W b n/a 15 2018 2051 2070 N
+ F K Y b n/a 15 2018 2041 2078 N
+ F L AA b n/a 15 2034 2054 2065 N
+ F L AA e n/a 15 2035 2054 2065 N
+ F L AA i n/a 15 2034 2054 2065 N
+ F L AE b n/a 15 2034 2046 2079 N
+ F L AE e n/a 15 2035 2046 2080 N
+ F L AE i n/a 15 2034 2046 2079 N
+ F L AH b n/a 15 2034 2046 2064 N
+ F L AH e n/a 15 2035 2046 2069 N
+ F L AH i n/a 15 2034 2046 2068 N
+ F L AO b n/a 15 2034 2055 2067 N
+ F L AO e n/a 15 2035 2055 2066 N
+ F L AO i n/a 15 2034 2055 2067 N
+ F L AW b n/a 15 2034 2046 2079 N
+ F L AW e n/a 15 2035 2046 2079 N
+ F L AY b n/a 15 2034 2054 2063 N
+ F L AY e n/a 15 2035 2054 2064 N
+ F L AY i n/a 15 2034 2054 2063 N
+ F L B e n/a 15 2035 2039 2077 N
+ F L CH e n/a 15 2035 2039 2078 N
+ F L D b n/a 15 2034 2039 2075 N
+ F L D e n/a 15 2035 2039 2075 N
+ F L D i n/a 15 2034 2039 2075 N
+ F L DH e n/a 15 2035 2039 2077 N
+ F L EH b n/a 15 2034 2046 2080 N
+ F L EH e n/a 15 2035 2046 2080 N
+ F L EH i n/a 15 2034 2046 2080 N
+ F L ER b n/a 15 2034 2057 2072 N
+ F L ER e n/a 15 2035 2057 2072 N
+ F L ER i n/a 15 2034 2057 2071 N
+ F L EY b n/a 15 2034 2046 2081 N
+ F L EY e n/a 15 2035 2046 2081 N
+ F L EY i n/a 15 2034 2046 2081 N
+ F L F e n/a 15 2035 2039 2077 N
+ F L F i n/a 15 2034 2039 2077 N
+ F L G b n/a 15 2034 2039 2077 N
+ F L G e n/a 15 2035 2039 2077 N
+ F L G i n/a 15 2034 2039 2077 N
+ F L HH e n/a 15 2035 2039 2075 N
+ F L HH i n/a 15 2034 2039 2075 N
+ F L IH b n/a 15 2034 2046 2083 N
+ F L IH e n/a 15 2035 2046 2083 N
+ F L IH i n/a 15 2034 2046 2083 N
+ F L IY b n/a 15 2034 2046 2082 N
+ F L IY e n/a 15 2035 2046 2082 N
+ F L IY i n/a 15 2034 2046 2082 N
+ F L JH e n/a 15 2035 2039 2078 N
+ F L K b n/a 15 2034 2039 2077 N
+ F L K e n/a 15 2035 2039 2077 N
+ F L K i n/a 15 2034 2039 2077 N
+ F L L b n/a 15 2034 2055 2070 N
+ F L L e n/a 15 2035 2055 2070 N
+ F L L i n/a 15 2034 2055 2070 N
+ F L M b n/a 15 2034 2039 2077 N
+ F L M e n/a 15 2035 2039 2077 N
+ F L M i n/a 15 2034 2039 2077 N
+ F L N b n/a 15 2034 2039 2075 N
+ F L N e n/a 15 2035 2039 2075 N
+ F L NG e n/a 15 2035 2039 2077 N
+ F L OW b n/a 15 2034 2055 2066 N
+ F L OW e n/a 15 2035 2055 2066 N
+ F L OW i n/a 15 2034 2055 2066 N
+ F L OY b n/a 15 2034 2055 2067 N
+ F L OY e n/a 15 2035 2055 2066 N
+ F L OY i n/a 15 2034 2055 2067 N
+ F L P b n/a 15 2034 2039 2077 N
+ F L P e n/a 15 2035 2039 2077 N
+ F L P i n/a 15 2034 2039 2077 N
+ F L R b n/a 15 2034 2057 2074 N
+ F L R e n/a 15 2035 2057 2074 N
+ F L R i n/a 15 2034 2057 2074 N
+ F L S b n/a 15 2034 2039 2077 N
+ F L S e n/a 15 2035 2039 2077 N
+ F L S i n/a 15 2034 2039 2077 N
+ F L SH e n/a 15 2035 2039 2078 N
+ F L SIL e n/a 15 2035 2039 2077 N
+ F L T b n/a 15 2034 2039 2075 N
+ F L T e n/a 15 2035 2039 2075 N
+ F L T i n/a 15 2034 2039 2075 N
+ F L TH b n/a 15 2034 2039 2077 N
+ F L TH e n/a 15 2035 2039 2077 N
+ F L TH i n/a 15 2034 2039 2077 N
+ F L UH b n/a 15 2034 2055 2068 N
+ F L UH e n/a 15 2035 2055 2068 N
+ F L UH i n/a 15 2034 2055 2068 N
+ F L UW b n/a 15 2034 2055 2068 N
+ F L UW e n/a 15 2035 2055 2068 N
+ F L V b n/a 15 2034 2039 2077 N
+ F L V e n/a 15 2035 2039 2077 N
+ F L W b n/a 15 2034 2055 2070 N
+ F L W e n/a 15 2035 2055 2070 N
+ F L Y b n/a 15 2034 2046 2078 N
+ F L Y e n/a 15 2035 2046 2078 N
+ F L Y i n/a 15 2034 2046 2078 N
+ F L Z e n/a 15 2035 2039 2077 N
+ F L ZH e n/a 15 2035 2039 2078 N
+ F M AA b n/a 15 2023 2060 2065 N
+ F M AA e n/a 15 2023 2060 2065 N
+ F M AA i n/a 15 2023 2060 2065 N
+ F M AE b n/a 15 2023 2045 2079 N
+ F M AE e n/a 15 2023 2045 2080 N
+ F M AE i n/a 15 2023 2045 2079 N
+ F M AH b n/a 15 2023 2045 2064 N
+ F M AH e n/a 15 2023 2045 2069 N
+ F M AH i n/a 15 2023 2045 2069 N
+ F M AO b n/a 15 2023 2060 2067 N
+ F M AO e n/a 15 2023 2060 2066 N
+ F M AO i n/a 15 2023 2060 2067 N
+ F M AW b n/a 15 2023 2045 2079 N
+ F M AW e n/a 15 2023 2045 2079 N
+ F M AW i n/a 15 2023 2045 2079 N
+ F M AY b n/a 15 2023 2060 2063 N
+ F M AY e n/a 15 2023 2060 2064 N
+ F M AY i n/a 15 2023 2060 2063 N
+ F M B e n/a 15 2023 2038 2077 N
+ F M CH e n/a 15 2023 2038 2078 N
+ F M D b n/a 15 2023 2037 2075 N
+ F M D e n/a 15 2023 2037 2075 N
+ F M DH e n/a 15 2023 2038 2077 N
+ F M EH b n/a 15 2023 2045 2080 N
+ F M EH e n/a 15 2023 2045 2080 N
+ F M EH i n/a 15 2023 2045 2080 N
+ F M ER b n/a 15 2023 2060 2072 N
+ F M ER e n/a 15 2023 2060 2072 N
+ F M ER i n/a 15 2023 2060 2071 N
+ F M EY b n/a 15 2023 2045 2081 N
+ F M EY e n/a 15 2023 2045 2081 N
+ F M EY i n/a 15 2023 2045 2081 N
+ F M F e n/a 15 2023 2038 2077 N
+ F M G b n/a 15 2023 2038 2077 N
+ F M G e n/a 15 2023 2038 2077 N
+ F M HH e n/a 15 2023 2038 2075 N
+ F M IH b n/a 15 2023 2045 2083 N
+ F M IH e n/a 15 2023 2045 2083 N
+ F M IH i n/a 15 2023 2045 2083 N
+ F M IY b n/a 15 2023 2045 2082 N
+ F M IY e n/a 15 2023 2045 2082 N
+ F M IY i n/a 15 2023 2045 2082 N
+ F M JH e n/a 15 2023 2038 2078 N
+ F M K b n/a 15 2023 2038 2077 N
+ F M K e n/a 15 2023 2038 2077 N
+ F M L b n/a 15 2023 2060 2070 N
+ F M L e n/a 15 2023 2060 2070 N
+ F M L i n/a 15 2023 2060 2070 N
+ F M M b n/a 15 2023 2038 2077 N
+ F M M e n/a 15 2023 2038 2077 N
+ F M N b n/a 15 2023 2037 2075 N
+ F M N e n/a 15 2023 2037 2075 N
+ F M NG e n/a 15 2023 2038 2077 N
+ F M OW b n/a 15 2023 2060 2066 N
+ F M OW e n/a 15 2023 2060 2066 N
+ F M OW i n/a 15 2023 2060 2066 N
+ F M OY b n/a 15 2023 2060 2067 N
+ F M OY e n/a 15 2023 2060 2066 N
+ F M P b n/a 15 2023 2038 2077 N
+ F M P e n/a 15 2023 2038 2077 N
+ F M R b n/a 15 2023 2060 2074 N
+ F M R e n/a 15 2023 2060 2074 N
+ F M R i n/a 15 2023 2060 2074 N
+ F M S b n/a 15 2023 2038 2077 N
+ F M S e n/a 15 2023 2038 2077 N
+ F M S i n/a 15 2023 2038 2077 N
+ F M SH e n/a 15 2023 2038 2078 N
+ F M SIL e n/a 15 2023 2039 2077 N
+ F M T b n/a 15 2023 2037 2075 N
+ F M T e n/a 15 2023 2037 2075 N
+ F M T i n/a 15 2023 2037 2075 N
+ F M TH b n/a 15 2023 2038 2077 N
+ F M TH e n/a 15 2023 2038 2077 N
+ F M UH b n/a 15 2023 2060 2068 N
+ F M UH e n/a 15 2023 2060 2068 N
+ F M UH i n/a 15 2023 2060 2068 N
+ F M UW b n/a 15 2023 2060 2068 N
+ F M UW e n/a 15 2023 2060 2068 N
+ F M UW i n/a 15 2023 2060 2068 N
+ F M V b n/a 15 2023 2038 2077 N
+ F M V e n/a 15 2023 2038 2077 N
+ F M W b n/a 15 2023 2060 2070 N
+ F M W e n/a 15 2023 2060 2070 N
+ F M Y b n/a 15 2023 2045 2078 N
+ F M Y e n/a 15 2023 2045 2078 N
+ F M Z e n/a 15 2023 2038 2077 N
+ F M ZH e n/a 15 2023 2038 2078 N
+ F N AA b n/a 15 2023 2060 2065 N
+ F N AA e n/a 15 2023 2060 2065 N
+ F N AA i n/a 15 2023 2060 2065 N
+ F N AE b n/a 15 2023 2045 2079 N
+ F N AE e n/a 15 2023 2045 2080 N
+ F N AE i n/a 15 2023 2045 2079 N
+ F N AH b n/a 15 2023 2045 2064 N
+ F N AH e n/a 15 2023 2045 2069 N
+ F N AH i n/a 15 2023 2045 2069 N
+ F N AO b n/a 15 2023 2060 2067 N
+ F N AO e n/a 15 2023 2060 2066 N
+ F N AO i n/a 15 2023 2060 2067 N
+ F N AW b n/a 15 2023 2045 2079 N
+ F N AW e n/a 15 2023 2045 2079 N
+ F N AW i n/a 15 2023 2045 2079 N
+ F N AY b n/a 15 2023 2060 2063 N
+ F N AY e n/a 15 2023 2060 2064 N
+ F N AY i n/a 15 2023 2060 2063 N
+ F N B e n/a 15 2023 2038 2077 N
+ F N B i n/a 15 2023 2038 2077 N
+ F N CH e n/a 15 2023 2038 2078 N
+ F N D b n/a 15 2023 2037 2075 N
+ F N D e n/a 15 2023 2037 2075 N
+ F N DH e n/a 15 2023 2038 2077 N
+ F N EH b n/a 15 2023 2045 2080 N
+ F N EH e n/a 15 2023 2045 2080 N
+ F N EH i n/a 15 2023 2045 2080 N
+ F N ER b n/a 15 2023 2060 2072 N
+ F N ER e n/a 15 2023 2060 2072 N
+ F N ER i n/a 15 2023 2060 2071 N
+ F N EY b n/a 15 2023 2045 2081 N
+ F N EY e n/a 15 2023 2045 2081 N
+ F N EY i n/a 15 2023 2045 2081 N
+ F N F e n/a 15 2023 2038 2077 N
+ F N G b n/a 15 2023 2038 2077 N
+ F N G e n/a 15 2023 2038 2077 N
+ F N HH e n/a 15 2023 2038 2075 N
+ F N IH b n/a 15 2023 2045 2083 N
+ F N IH e n/a 15 2023 2045 2083 N
+ F N IH i n/a 15 2023 2045 2083 N
+ F N IY b n/a 15 2023 2045 2082 N
+ F N IY e n/a 15 2023 2045 2082 N
+ F N IY i n/a 15 2023 2045 2082 N
+ F N JH e n/a 15 2023 2038 2078 N
+ F N K b n/a 15 2023 2038 2077 N
+ F N K e n/a 15 2023 2038 2077 N
+ F N L b n/a 15 2023 2060 2070 N
+ F N L e n/a 15 2023 2060 2070 N
+ F N L i n/a 15 2023 2060 2070 N
+ F N M b n/a 15 2023 2038 2077 N
+ F N M e n/a 15 2023 2038 2077 N
+ F N M i n/a 15 2023 2038 2077 N
+ F N N b n/a 15 2023 2037 2075 N
+ F N N e n/a 15 2023 2037 2075 N
+ F N NG e n/a 15 2023 2038 2077 N
+ F N OW b n/a 15 2023 2060 2066 N
+ F N OW e n/a 15 2023 2060 2066 N
+ F N OW i n/a 15 2023 2060 2066 N
+ F N OY b n/a 15 2023 2060 2067 N
+ F N OY e n/a 15 2023 2060 2066 N
+ F N OY i n/a 15 2023 2060 2067 N
+ F N P b n/a 15 2023 2038 2077 N
+ F N P e n/a 15 2023 2038 2077 N
+ F N R b n/a 15 2023 2060 2074 N
+ F N R e n/a 15 2023 2060 2074 N
+ F N R i n/a 15 2023 2060 2074 N
+ F N S b n/a 15 2023 2038 2077 N
+ F N S e n/a 15 2023 2038 2077 N
+ F N SH e n/a 15 2023 2038 2078 N
+ F N SH i n/a 15 2023 2038 2078 N
+ F N SIL e n/a 15 2023 2039 2077 N
+ F N T b n/a 15 2023 2037 2075 N
+ F N T e n/a 15 2023 2037 2075 N
+ F N T i n/a 15 2023 2037 2075 N
+ F N TH b n/a 15 2023 2038 2077 N
+ F N TH e n/a 15 2023 2038 2077 N
+ F N UH b n/a 15 2023 2060 2068 N
+ F N UH e n/a 15 2023 2060 2068 N
+ F N UH i n/a 15 2023 2060 2068 N
+ F N UW b n/a 15 2023 2060 2068 N
+ F N UW e n/a 15 2023 2060 2068 N
+ F N UW i n/a 15 2023 2060 2068 N
+ F N V b n/a 15 2023 2038 2077 N
+ F N V e n/a 15 2023 2038 2077 N
+ F N W b n/a 15 2023 2060 2070 N
+ F N W e n/a 15 2023 2060 2070 N
+ F N Y b n/a 15 2023 2045 2078 N
+ F N Y e n/a 15 2023 2045 2078 N
+ F N Y i n/a 15 2023 2045 2078 N
+ F N Z e n/a 15 2023 2038 2077 N
+ F N ZH e n/a 15 2023 2038 2078 N
+ F NG AA b n/a 15 2023 2060 2065 N
+ F NG AE b n/a 15 2023 2045 2079 N
+ F NG AH b n/a 15 2023 2045 2064 N
+ F NG AH i n/a 15 2023 2045 2069 N
+ F NG AO b n/a 15 2023 2060 2067 N
+ F NG AW b n/a 15 2023 2045 2079 N
+ F NG AY b n/a 15 2023 2060 2063 N
+ F NG AY i n/a 15 2023 2060 2063 N
+ F NG D b n/a 15 2023 2037 2075 N
+ F NG EH b n/a 15 2023 2045 2080 N
+ F NG EH i n/a 15 2023 2045 2080 N
+ F NG ER b n/a 15 2023 2060 2072 N
+ F NG ER i n/a 15 2023 2060 2071 N
+ F NG EY b n/a 15 2023 2045 2081 N
+ F NG G b n/a 15 2023 2038 2077 N
+ F NG IH b n/a 15 2023 2045 2083 N
+ F NG IH i n/a 15 2023 2045 2083 N
+ F NG IY b n/a 15 2023 2045 2082 N
+ F NG IY i n/a 15 2023 2045 2082 N
+ F NG K b n/a 15 2023 2038 2077 N
+ F NG L b n/a 15 2023 2060 2070 N
+ F NG M b n/a 15 2023 2038 2077 N
+ F NG N b n/a 15 2023 2037 2075 N
+ F NG OW b n/a 15 2023 2060 2066 N
+ F NG OW i n/a 15 2023 2060 2066 N
+ F NG OY b n/a 15 2023 2060 2067 N
+ F NG P b n/a 15 2023 2038 2077 N
+ F NG R b n/a 15 2023 2060 2074 N
+ F NG S b n/a 15 2023 2038 2077 N
+ F NG T b n/a 15 2023 2037 2075 N
+ F NG TH b n/a 15 2023 2038 2077 N
+ F NG UH b n/a 15 2023 2060 2068 N
+ F NG UH i n/a 15 2023 2060 2068 N
+ F NG UW b n/a 15 2023 2060 2068 N
+ F NG V b n/a 15 2023 2038 2077 N
+ F NG W b n/a 15 2023 2060 2070 N
+ F NG Y b n/a 15 2023 2045 2078 N
+ F OW AA b n/a 15 2034 2054 2065 N
+ F OW AA e n/a 15 2035 2054 2065 N
+ F OW AA i n/a 15 2034 2054 2065 N
+ F OW AE b n/a 15 2034 2044 2079 N
+ F OW AE e n/a 15 2035 2044 2080 N
+ F OW AE i n/a 15 2034 2046 2079 N
+ F OW AH b n/a 15 2034 2044 2064 N
+ F OW AH e n/a 15 2035 2044 2069 N
+ F OW AH i n/a 15 2034 2046 2068 N
+ F OW AO b n/a 15 2034 2055 2067 N
+ F OW AO e n/a 15 2035 2055 2066 N
+ F OW AO i n/a 15 2034 2055 2067 N
+ F OW AW b n/a 15 2034 2044 2079 N
+ F OW AW e n/a 15 2035 2044 2079 N
+ F OW AW i n/a 15 2034 2046 2079 N
+ F OW AY b n/a 15 2034 2054 2063 N
+ F OW AY e n/a 15 2035 2054 2064 N
+ F OW AY i n/a 15 2034 2054 2063 N
+ F OW B e n/a 15 2035 2039 2077 N
+ F OW CH e n/a 15 2035 2039 2078 N
+ F OW D b n/a 15 2034 2039 2075 N
+ F OW D e n/a 15 2035 2039 2075 N
+ F OW D i n/a 15 2034 2039 2075 N
+ F OW DH e n/a 15 2035 2039 2077 N
+ F OW EH b n/a 15 2034 2044 2080 N
+ F OW EH e n/a 15 2035 2044 2080 N
+ F OW EH i n/a 15 2034 2046 2080 N
+ F OW ER b n/a 15 2034 2057 2072 N
+ F OW ER e n/a 15 2035 2057 2072 N
+ F OW ER i n/a 15 2034 2057 2071 N
+ F OW EY b n/a 15 2034 2044 2081 N
+ F OW EY e n/a 15 2035 2044 2081 N
+ F OW EY i n/a 15 2034 2046 2081 N
+ F OW F e n/a 15 2035 2039 2077 N
+ F OW G b n/a 15 2034 2039 2077 N
+ F OW G e n/a 15 2035 2039 2077 N
+ F OW HH e n/a 15 2035 2039 2075 N
+ F OW IH b n/a 15 2034 2044 2083 N
+ F OW IH e n/a 15 2035 2044 2083 N
+ F OW IH i n/a 15 2034 2046 2083 N
+ F OW IY b n/a 15 2034 2044 2082 N
+ F OW IY e n/a 15 2035 2044 2082 N
+ F OW IY i n/a 15 2034 2046 2082 N
+ F OW JH e n/a 15 2035 2039 2078 N
+ F OW K b n/a 15 2034 2039 2077 N
+ F OW K e n/a 15 2035 2039 2077 N
+ F OW K i n/a 15 2034 2039 2077 N
+ F OW L b n/a 15 2034 2055 2070 N
+ F OW L e n/a 15 2035 2055 2070 N
+ F OW L i n/a 15 2034 2055 2070 N
+ F OW M b n/a 15 2034 2039 2077 N
+ F OW M e n/a 15 2035 2039 2077 N
+ F OW N b n/a 15 2034 2039 2075 N
+ F OW N e n/a 15 2035 2039 2075 N
+ F OW N i n/a 15 2034 2039 2075 N
+ F OW NG e n/a 15 2035 2039 2077 N
+ F OW OW b n/a 15 2034 2055 2066 N
+ F OW OW e n/a 15 2035 2055 2066 N
+ F OW OW i n/a 15 2034 2055 2066 N
+ F OW OY b n/a 15 2034 2055 2067 N
+ F OW OY e n/a 15 2035 2055 2066 N
+ F OW P b n/a 15 2034 2039 2077 N
+ F OW P e n/a 15 2035 2039 2077 N
+ F OW R b n/a 15 2034 2057 2074 N
+ F OW R e n/a 15 2035 2057 2074 N
+ F OW R i n/a 15 2034 2057 2074 N
+ F OW S b n/a 15 2034 2039 2077 N
+ F OW S e n/a 15 2035 2039 2077 N
+ F OW S i n/a 15 2034 2039 2077 N
+ F OW SH e n/a 15 2035 2039 2078 N
+ F OW SIL e n/a 15 2035 2039 2077 N
+ F OW T b n/a 15 2034 2039 2075 N
+ F OW T e n/a 15 2035 2039 2075 N
+ F OW T i n/a 15 2034 2039 2075 N
+ F OW TH b n/a 15 2034 2039 2077 N
+ F OW TH e n/a 15 2035 2039 2077 N
+ F OW UH b n/a 15 2034 2055 2068 N
+ F OW UH e n/a 15 2035 2055 2068 N
+ F OW UH i n/a 15 2034 2055 2068 N
+ F OW UW b n/a 15 2034 2055 2068 N
+ F OW UW e n/a 15 2035 2055 2068 N
+ F OW UW i n/a 15 2034 2055 2068 N
+ F OW V b n/a 15 2034 2039 2077 N
+ F OW V e n/a 15 2035 2039 2077 N
+ F OW V i n/a 15 2034 2039 2077 N
+ F OW W b n/a 15 2034 2055 2070 N
+ F OW W e n/a 15 2035 2055 2070 N
+ F OW Y b n/a 15 2034 2044 2078 N
+ F OW Y e n/a 15 2035 2044 2078 N
+ F OW Y i n/a 15 2034 2046 2078 N
+ F OW Z e n/a 15 2035 2039 2077 N
+ F OW ZH e n/a 15 2035 2039 2078 N
+ F OY AA b n/a 15 2026 2057 2065 N
+ F OY AA e n/a 15 2028 2057 2065 N
+ F OY AE b n/a 15 2026 2047 2079 N
+ F OY AE e n/a 15 2028 2047 2080 N
+ F OY AH b n/a 15 2026 2047 2064 N
+ F OY AH e n/a 15 2028 2047 2069 N
+ F OY AH i n/a 15 2026 2047 2069 N
+ F OY AO b n/a 15 2026 2057 2067 N
+ F OY AO e n/a 15 2028 2057 2066 N
+ F OY AW b n/a 15 2026 2047 2079 N
+ F OY AW e n/a 15 2028 2047 2079 N
+ F OY AY b n/a 15 2026 2057 2063 N
+ F OY AY e n/a 15 2028 2057 2064 N
+ F OY B e n/a 15 2028 2040 2077 N
+ F OY CH e n/a 15 2028 2040 2078 N
+ F OY D b n/a 15 2026 2040 2075 N
+ F OY D e n/a 15 2028 2040 2075 N
+ F OY DH e n/a 15 2028 2040 2077 N
+ F OY EH b n/a 15 2026 2047 2080 N
+ F OY EH e n/a 15 2028 2047 2080 N
+ F OY ER b n/a 15 2026 2057 2072 N
+ F OY ER e n/a 15 2028 2057 2072 N
+ F OY ER i n/a 15 2026 2057 2071 N
+ F OY EY b n/a 15 2026 2047 2081 N
+ F OY EY e n/a 15 2028 2047 2081 N
+ F OY F e n/a 15 2028 2040 2077 N
+ F OY G b n/a 15 2026 2040 2077 N
+ F OY G e n/a 15 2028 2040 2077 N
+ F OY HH e n/a 15 2028 2040 2075 N
+ F OY IH b n/a 15 2026 2047 2083 N
+ F OY IH e n/a 15 2028 2047 2083 N
+ F OY IY b n/a 15 2026 2047 2082 N
+ F OY IY e n/a 15 2028 2047 2082 N
+ F OY JH e n/a 15 2028 2040 2078 N
+ F OY K b n/a 15 2026 2040 2077 N
+ F OY K e n/a 15 2028 2040 2077 N
+ F OY L b n/a 15 2026 2057 2070 N
+ F OY L e n/a 15 2028 2057 2070 N
+ F OY L i n/a 15 2026 2057 2070 N
+ F OY M b n/a 15 2026 2040 2077 N
+ F OY M e n/a 15 2028 2040 2077 N
+ F OY N b n/a 15 2026 2040 2075 N
+ F OY N e n/a 15 2028 2040 2075 N
+ F OY NG e n/a 15 2028 2040 2077 N
+ F OY OW b n/a 15 2026 2057 2066 N
+ F OY OW e n/a 15 2028 2057 2066 N
+ F OY OY b n/a 15 2026 2057 2067 N
+ F OY OY e n/a 15 2028 2057 2066 N
+ F OY P b n/a 15 2026 2040 2077 N
+ F OY P e n/a 15 2028 2040 2077 N
+ F OY R b n/a 15 2026 2057 2074 N
+ F OY R e n/a 15 2028 2057 2074 N
+ F OY R i n/a 15 2026 2057 2074 N
+ F OY S b n/a 15 2026 2040 2077 N
+ F OY S e n/a 15 2028 2040 2077 N
+ F OY SH e n/a 15 2028 2040 2078 N
+ F OY SIL e n/a 15 2028 2040 2077 N
+ F OY T b n/a 15 2026 2040 2075 N
+ F OY T e n/a 15 2028 2040 2075 N
+ F OY T i n/a 15 2026 2040 2075 N
+ F OY TH b n/a 15 2026 2040 2077 N
+ F OY TH e n/a 15 2028 2040 2077 N
+ F OY UH b n/a 15 2026 2057 2069 N
+ F OY UH e n/a 15 2028 2057 2069 N
+ F OY UW b n/a 15 2026 2057 2069 N
+ F OY UW e n/a 15 2028 2057 2069 N
+ F OY V b n/a 15 2026 2040 2077 N
+ F OY V e n/a 15 2028 2040 2077 N
+ F OY W b n/a 15 2026 2057 2070 N
+ F OY W e n/a 15 2028 2057 2070 N
+ F OY Y b n/a 15 2026 2047 2078 N
+ F OY Y e n/a 15 2028 2047 2078 N
+ F OY Y i n/a 15 2026 2047 2078 N
+ F OY Z e n/a 15 2028 2040 2077 N
+ F OY ZH e n/a 15 2028 2040 2078 N
+ F P AA b n/a 15 2018 2051 2065 N
+ F P AA e n/a 15 2018 2051 2065 N
+ F P AA i n/a 15 2018 2051 2065 N
+ F P AE b n/a 15 2018 2041 2079 N
+ F P AE e n/a 15 2018 2041 2080 N
+ F P AE i n/a 15 2018 2042 2079 N
+ F P AH b n/a 15 2018 2042 2064 N
+ F P AH e n/a 15 2018 2042 2069 N
+ F P AH i n/a 15 2018 2042 2068 N
+ F P AO b n/a 15 2018 2051 2067 N
+ F P AO e n/a 15 2018 2051 2066 N
+ F P AO i n/a 15 2018 2051 2067 N
+ F P AW b n/a 15 2018 2041 2079 N
+ F P AW e n/a 15 2018 2041 2079 N
+ F P AY b n/a 15 2018 2051 2063 N
+ F P AY e n/a 15 2018 2051 2064 N
+ F P AY i n/a 15 2018 2051 2063 N
+ F P B e n/a 15 2018 2038 2077 N
+ F P CH e n/a 15 2018 2038 2078 N
+ F P D b n/a 15 2018 2037 2075 N
+ F P D e n/a 15 2018 2037 2075 N
+ F P DH e n/a 15 2018 2038 2077 N
+ F P EH b n/a 15 2018 2041 2080 N
+ F P EH e n/a 15 2018 2041 2080 N
+ F P ER b n/a 15 2018 2052 2072 N
+ F P ER e n/a 15 2018 2052 2072 N
+ F P ER i n/a 15 2018 2052 2071 N
+ F P EY b n/a 15 2018 2041 2081 N
+ F P EY e n/a 15 2018 2041 2081 N
+ F P EY i n/a 15 2018 2042 2081 N
+ F P F e n/a 15 2018 2038 2077 N
+ F P G b n/a 15 2018 2038 2077 N
+ F P G e n/a 15 2018 2038 2077 N
+ F P HH e n/a 15 2018 2038 2075 N
+ F P IH b n/a 15 2018 2041 2083 N
+ F P IH e n/a 15 2018 2041 2083 N
+ F P IH i n/a 15 2018 2042 2083 N
+ F P IY b n/a 15 2018 2041 2082 N
+ F P IY e n/a 15 2018 2041 2082 N
+ F P IY i n/a 15 2018 2042 2082 N
+ F P JH e n/a 15 2018 2038 2078 N
+ F P K b n/a 15 2018 2038 2077 N
+ F P K e n/a 15 2018 2038 2077 N
+ F P L b n/a 15 2018 2051 2070 N
+ F P L e n/a 15 2018 2051 2070 N
+ F P L i n/a 15 2018 2051 2070 N
+ F P M b n/a 15 2018 2038 2077 N
+ F P M e n/a 15 2018 2038 2077 N
+ F P N b n/a 15 2018 2037 2075 N
+ F P N e n/a 15 2018 2037 2075 N
+ F P N i n/a 15 2018 2037 2075 N
+ F P NG e n/a 15 2018 2038 2077 N
+ F P OW b n/a 15 2018 2051 2066 N
+ F P OW e n/a 15 2018 2051 2066 N
+ F P OW i n/a 15 2018 2051 2066 N
+ F P OY b n/a 15 2018 2051 2067 N
+ F P OY e n/a 15 2018 2051 2066 N
+ F P P b n/a 15 2018 2038 2077 N
+ F P P e n/a 15 2018 2038 2077 N
+ F P R b n/a 15 2018 2052 2074 N
+ F P R e n/a 15 2018 2052 2074 N
+ F P R i n/a 15 2018 2052 2074 N
+ F P S b n/a 15 2018 2038 2077 N
+ F P S e n/a 15 2018 2038 2077 N
+ F P S i n/a 15 2018 2038 2077 N
+ F P SH e n/a 15 2018 2038 2078 N
+ F P SIL e n/a 15 2018 2039 2077 N
+ F P T b n/a 15 2018 2037 2075 N
+ F P T e n/a 15 2018 2037 2075 N
+ F P T i n/a 15 2018 2037 2075 N
+ F P TH b n/a 15 2018 2038 2077 N
+ F P TH e n/a 15 2018 2038 2077 N
+ F P UH b n/a 15 2018 2051 2068 N
+ F P UH e n/a 15 2018 2051 2068 N
+ F P UW b n/a 15 2018 2051 2068 N
+ F P UW e n/a 15 2018 2051 2068 N
+ F P V b n/a 15 2018 2038 2077 N
+ F P V e n/a 15 2018 2038 2077 N
+ F P W b n/a 15 2018 2051 2070 N
+ F P W e n/a 15 2018 2051 2070 N
+ F P Y b n/a 15 2018 2041 2078 N
+ F P Y e n/a 15 2018 2041 2078 N
+ F P Y i n/a 15 2018 2042 2078 N
+ F P Z e n/a 15 2018 2038 2077 N
+ F P ZH e n/a 15 2018 2038 2078 N
+ F R AA b n/a 15 2033 2054 2065 N
+ F R AA e n/a 15 2033 2054 2065 N
+ F R AA i n/a 15 2033 2054 2065 N
+ F R AE b n/a 15 2033 2044 2079 N
+ F R AE e n/a 15 2033 2044 2080 N
+ F R AE i n/a 15 2033 2046 2079 N
+ F R AH b n/a 15 2033 2044 2064 N
+ F R AH e n/a 15 2033 2044 2069 N
+ F R AH i n/a 15 2033 2046 2068 N
+ F R AO b n/a 15 2033 2055 2067 N
+ F R AO e n/a 15 2033 2055 2066 N
+ F R AO i n/a 15 2033 2055 2067 N
+ F R AW b n/a 15 2033 2044 2079 N
+ F R AW e n/a 15 2033 2044 2079 N
+ F R AY b n/a 15 2033 2054 2063 N
+ F R AY e n/a 15 2033 2054 2064 N
+ F R AY i n/a 15 2033 2054 2063 N
+ F R B e n/a 15 2033 2039 2077 N
+ F R CH e n/a 15 2033 2039 2078 N
+ F R D b n/a 15 2033 2039 2075 N
+ F R D e n/a 15 2033 2039 2075 N
+ F R DH e n/a 15 2033 2039 2077 N
+ F R EH b n/a 15 2033 2044 2080 N
+ F R EH e n/a 15 2033 2044 2080 N
+ F R EH i n/a 15 2033 2046 2080 N
+ F R ER b n/a 15 2033 2057 2072 N
+ F R ER e n/a 15 2033 2057 2072 N
+ F R ER i n/a 15 2033 2057 2071 N
+ F R EY b n/a 15 2033 2044 2081 N
+ F R EY e n/a 15 2033 2044 2081 N
+ F R EY i n/a 15 2033 2046 2081 N
+ F R F e n/a 15 2033 2039 2077 N
+ F R G b n/a 15 2033 2039 2077 N
+ F R G e n/a 15 2033 2039 2077 N
+ F R HH e n/a 15 2033 2039 2075 N
+ F R HH i n/a 15 2033 2039 2075 N
+ F R IH b n/a 15 2033 2044 2083 N
+ F R IH e n/a 15 2033 2044 2083 N
+ F R IH i n/a 15 2033 2046 2083 N
+ F R IY b n/a 15 2033 2044 2082 N
+ F R IY e n/a 15 2033 2044 2082 N
+ F R IY i n/a 15 2033 2046 2082 N
+ F R JH e n/a 15 2033 2039 2078 N
+ F R K b n/a 15 2033 2039 2077 N
+ F R K e n/a 15 2033 2039 2077 N
+ F R K i n/a 15 2033 2039 2077 N
+ F R L b n/a 15 2033 2055 2070 N
+ F R L e n/a 15 2033 2055 2070 N
+ F R L i n/a 15 2033 2055 2070 N
+ F R M b n/a 15 2033 2039 2077 N
+ F R M e n/a 15 2033 2039 2077 N
+ F R M i n/a 15 2033 2039 2077 N
+ F R N b n/a 15 2033 2039 2075 N
+ F R N e n/a 15 2033 2039 2075 N
+ F R N i n/a 15 2033 2039 2075 N
+ F R NG e n/a 15 2033 2039 2077 N
+ F R OW b n/a 15 2033 2055 2066 N
+ F R OW e n/a 15 2033 2055 2066 N
+ F R OW i n/a 15 2033 2055 2066 N
+ F R OY b n/a 15 2033 2055 2067 N
+ F R OY e n/a 15 2033 2055 2066 N
+ F R OY i n/a 15 2033 2055 2067 N
+ F R P b n/a 15 2033 2039 2077 N
+ F R P e n/a 15 2033 2039 2077 N
+ F R P i n/a 15 2033 2039 2077 N
+ F R R b n/a 15 2033 2057 2074 N
+ F R R e n/a 15 2033 2057 2074 N
+ F R R i n/a 15 2033 2057 2074 N
+ F R S b n/a 15 2033 2039 2077 N
+ F R S e n/a 15 2033 2039 2077 N
+ F R S i n/a 15 2033 2039 2077 N
+ F R SH e n/a 15 2033 2039 2078 N
+ F R SIL e n/a 15 2033 2039 2077 N
+ F R T b n/a 15 2033 2039 2075 N
+ F R T e n/a 15 2033 2039 2075 N
+ F R T i n/a 15 2033 2039 2075 N
+ F R TH b n/a 15 2033 2039 2077 N
+ F R TH e n/a 15 2033 2039 2077 N
+ F R UH b n/a 15 2033 2055 2068 N
+ F R UH e n/a 15 2033 2055 2068 N
+ F R UH i n/a 15 2033 2055 2068 N
+ F R UW b n/a 15 2033 2055 2068 N
+ F R UW e n/a 15 2033 2055 2068 N
+ F R V b n/a 15 2033 2039 2077 N
+ F R V e n/a 15 2033 2039 2077 N
+ F R W b n/a 15 2033 2055 2070 N
+ F R W e n/a 15 2033 2055 2070 N
+ F R W i n/a 15 2033 2055 2070 N
+ F R Y b n/a 15 2033 2044 2078 N
+ F R Y e n/a 15 2033 2044 2078 N
+ F R Y i n/a 15 2033 2046 2078 N
+ F R Z e n/a 15 2033 2039 2077 N
+ F R ZH e n/a 15 2033 2039 2078 N
+ F S AA b n/a 15 2020 2050 2065 N
+ F S AA e n/a 15 2020 2050 2065 N
+ F S AA i n/a 15 2020 2050 2065 N
+ F S AE b n/a 15 2020 2043 2079 N
+ F S AE e n/a 15 2020 2043 2080 N
+ F S AE i n/a 15 2020 2043 2079 N
+ F S AH b n/a 15 2020 2042 2064 N
+ F S AH e n/a 15 2020 2042 2069 N
+ F S AH i n/a 15 2020 2042 2068 N
+ F S AO b n/a 15 2020 2051 2067 N
+ F S AO e n/a 15 2020 2051 2067 N
+ F S AO i n/a 15 2020 2051 2067 N
+ F S AW b n/a 15 2020 2043 2079 N
+ F S AW e n/a 15 2020 2043 2079 N
+ F S AY b n/a 15 2020 2050 2063 N
+ F S AY e n/a 15 2020 2050 2064 N
+ F S AY i n/a 15 2020 2050 2063 N
+ F S B e n/a 15 2020 2038 2077 N
+ F S CH e n/a 15 2020 2038 2078 N
+ F S D b n/a 15 2020 2037 2075 N
+ F S D e n/a 15 2020 2037 2075 N
+ F S DH e n/a 15 2020 2038 2077 N
+ F S EH b n/a 15 2020 2043 2080 N
+ F S EH e n/a 15 2020 2043 2080 N
+ F S EH i n/a 15 2020 2043 2080 N
+ F S ER b n/a 15 2020 2053 2072 N
+ F S ER e n/a 15 2020 2053 2072 N
+ F S ER i n/a 15 2020 2053 2071 N
+ F S EY b n/a 15 2020 2043 2081 N
+ F S EY e n/a 15 2020 2043 2081 N
+ F S EY i n/a 15 2020 2043 2081 N
+ F S F e n/a 15 2020 2038 2077 N
+ F S G b n/a 15 2020 2038 2077 N
+ F S G e n/a 15 2020 2038 2077 N
+ F S HH e n/a 15 2020 2038 2075 N
+ F S IH b n/a 15 2020 2043 2083 N
+ F S IH e n/a 15 2020 2043 2082 N
+ F S IH i n/a 15 2020 2043 2082 N
+ F S IY b n/a 15 2020 2043 2082 N
+ F S IY e n/a 15 2020 2043 2082 N
+ F S IY i n/a 15 2020 2043 2082 N
+ F S JH e n/a 15 2020 2038 2078 N
+ F S K b n/a 15 2020 2038 2077 N
+ F S K e n/a 15 2020 2038 2077 N
+ F S L b n/a 15 2020 2051 2070 N
+ F S L e n/a 15 2020 2051 2070 N
+ F S L i n/a 15 2020 2051 2070 N
+ F S M b n/a 15 2020 2038 2077 N
+ F S M e n/a 15 2020 2038 2077 N
+ F S N b n/a 15 2020 2037 2075 N
+ F S N e n/a 15 2020 2037 2075 N
+ F S N i n/a 15 2020 2037 2075 N
+ F S NG e n/a 15 2020 2038 2077 N
+ F S OW b n/a 15 2020 2051 2066 N
+ F S OW e n/a 15 2020 2051 2066 N
+ F S OW i n/a 15 2020 2051 2066 N
+ F S OY b n/a 15 2020 2051 2067 N
+ F S OY e n/a 15 2020 2051 2067 N
+ F S P b n/a 15 2020 2038 2077 N
+ F S P e n/a 15 2020 2038 2077 N
+ F S R b n/a 15 2021 2053 2074 N
+ F S R e n/a 15 2021 2053 2074 N
+ F S R i n/a 15 2021 2053 2074 N
+ F S S b n/a 15 2020 2038 2077 N
+ F S S e n/a 15 2020 2038 2077 N
+ F S SH e n/a 15 2020 2038 2078 N
+ F S SIL e n/a 15 2020 2039 2077 N
+ F S T b n/a 15 2020 2037 2075 N
+ F S T e n/a 15 2020 2037 2075 N
+ F S TH b n/a 15 2020 2038 2077 N
+ F S TH e n/a 15 2020 2038 2077 N
+ F S UH b n/a 15 2020 2051 2068 N
+ F S UH e n/a 15 2020 2051 2068 N
+ F S UH i n/a 15 2020 2051 2068 N
+ F S UW b n/a 15 2020 2051 2068 N
+ F S UW e n/a 15 2020 2051 2068 N
+ F S UW i n/a 15 2020 2051 2068 N
+ F S V b n/a 15 2020 2038 2077 N
+ F S V e n/a 15 2020 2038 2077 N
+ F S W b n/a 15 2020 2051 2070 N
+ F S W e n/a 15 2020 2051 2070 N
+ F S Y b n/a 15 2020 2043 2078 N
+ F S Y e n/a 15 2020 2043 2078 N
+ F S Y i n/a 15 2020 2043 2078 N
+ F S Z e n/a 15 2020 2038 2077 N
+ F S ZH e n/a 15 2020 2038 2078 N
+ F SH AA b n/a 15 2021 2051 2065 N
+ F SH AE b n/a 15 2021 2041 2079 N
+ F SH AH b n/a 15 2021 2042 2064 N
+ F SH AH i n/a 15 2021 2042 2068 N
+ F SH AO b n/a 15 2021 2051 2067 N
+ F SH AW b n/a 15 2021 2041 2079 N
+ F SH AY b n/a 15 2021 2051 2063 N
+ F SH AY i n/a 15 2021 2051 2063 N
+ F SH D b n/a 15 2021 2037 2075 N
+ F SH EH b n/a 15 2021 2041 2080 N
+ F SH EH i n/a 15 2021 2042 2080 N
+ F SH ER b n/a 15 2021 2053 2072 N
+ F SH ER i n/a 15 2021 2053 2071 N
+ F SH EY b n/a 15 2021 2041 2081 N
+ F SH G b n/a 15 2021 2038 2077 N
+ F SH IH b n/a 15 2021 2041 2083 N
+ F SH IH i n/a 15 2021 2042 2082 N
+ F SH IY b n/a 15 2021 2041 2082 N
+ F SH IY i n/a 15 2021 2042 2082 N
+ F SH K b n/a 15 2021 2038 2077 N
+ F SH L b n/a 15 2021 2051 2070 N
+ F SH L i n/a 15 2021 2051 2070 N
+ F SH M b n/a 15 2021 2038 2077 N
+ F SH N b n/a 15 2021 2037 2075 N
+ F SH OW b n/a 15 2021 2051 2066 N
+ F SH OY b n/a 15 2021 2051 2067 N
+ F SH P b n/a 15 2021 2038 2077 N
+ F SH R b n/a 15 2021 2053 2074 N
+ F SH S b n/a 15 2021 2038 2077 N
+ F SH T b n/a 15 2021 2037 2075 N
+ F SH TH b n/a 15 2021 2038 2077 N
+ F SH UH b n/a 15 2021 2051 2068 N
+ F SH UW b n/a 15 2021 2051 2068 N
+ F SH V b n/a 15 2021 2038 2077 N
+ F SH W b n/a 15 2021 2051 2070 N
+ F SH Y b n/a 15 2021 2041 2078 N
+ F SIL AA b n/a 15 2022 2061 2065 N
+ F SIL AE b n/a 15 2022 2043 2079 N
+ F SIL AH b n/a 15 2022 2042 2064 N
+ F SIL AO b n/a 15 2022 2061 2067 N
+ F SIL AW b n/a 15 2022 2043 2079 N
+ F SIL AY b n/a 15 2022 2061 2063 N
+ F SIL D b n/a 15 2022 2037 2075 N
+ F SIL EH b n/a 15 2022 2043 2080 N
+ F SIL ER b n/a 15 2022 2062 2073 N
+ F SIL EY b n/a 15 2022 2043 2081 N
+ F SIL G b n/a 15 2022 2038 2077 N
+ F SIL IH b n/a 15 2022 2043 2083 N
+ F SIL IY b n/a 15 2022 2043 2082 N
+ F SIL K b n/a 15 2022 2038 2077 N
+ F SIL L b n/a 15 2022 2061 2070 N
+ F SIL M b n/a 15 2022 2038 2077 N
+ F SIL N b n/a 15 2022 2037 2075 N
+ F SIL OW b n/a 15 2022 2061 2066 N
+ F SIL OY b n/a 15 2022 2061 2067 N
+ F SIL P b n/a 15 2022 2038 2077 N
+ F SIL R b n/a 15 2022 2061 2074 N
+ F SIL S b n/a 15 2022 2038 2077 N
+ F SIL T b n/a 15 2022 2037 2075 N
+ F SIL TH b n/a 15 2022 2038 2077 N
+ F SIL UH b n/a 15 2022 2061 2068 N
+ F SIL UW b n/a 15 2022 2061 2068 N
+ F SIL V b n/a 15 2022 2038 2077 N
+ F SIL W b n/a 15 2022 2061 2070 N
+ F SIL Y b n/a 15 2022 2043 2078 N
+ F T AA b n/a 15 2018 2051 2065 N
+ F T AA e n/a 15 2018 2051 2065 N
+ F T AA i n/a 15 2018 2051 2065 N
+ F T AE b n/a 15 2018 2041 2079 N
+ F T AE e n/a 15 2018 2041 2080 N
+ F T AE i n/a 15 2018 2042 2079 N
+ F T AH b n/a 15 2018 2042 2064 N
+ F T AH e n/a 15 2018 2042 2069 N
+ F T AH i n/a 15 2018 2042 2068 N
+ F T AO b n/a 15 2018 2051 2067 N
+ F T AO e n/a 15 2018 2051 2066 N
+ F T AO i n/a 15 2018 2051 2067 N
+ F T AW b n/a 15 2018 2041 2079 N
+ F T AW e n/a 15 2018 2041 2079 N
+ F T AY b n/a 15 2018 2051 2063 N
+ F T AY e n/a 15 2018 2051 2064 N
+ F T AY i n/a 15 2018 2051 2063 N
+ F T B e n/a 15 2018 2038 2077 N
+ F T CH e n/a 15 2018 2038 2078 N
+ F T D b n/a 15 2018 2037 2075 N
+ F T D e n/a 15 2018 2037 2075 N
+ F T DH e n/a 15 2018 2038 2077 N
+ F T EH b n/a 15 2018 2041 2080 N
+ F T EH e n/a 15 2018 2041 2080 N
+ F T EH i n/a 15 2018 2042 2080 N
+ F T ER b n/a 15 2018 2052 2072 N
+ F T ER e n/a 15 2018 2052 2072 N
+ F T ER i n/a 15 2018 2052 2071 N
+ F T EY b n/a 15 2018 2041 2081 N
+ F T EY e n/a 15 2018 2041 2081 N
+ F T EY i n/a 15 2018 2042 2081 N
+ F T F e n/a 15 2018 2038 2077 N
+ F T G b n/a 15 2018 2038 2077 N
+ F T G e n/a 15 2018 2038 2077 N
+ F T HH e n/a 15 2018 2038 2075 N
+ F T IH b n/a 15 2018 2041 2083 N
+ F T IH e n/a 15 2018 2041 2083 N
+ F T IH i n/a 15 2018 2042 2083 N
+ F T IY b n/a 15 2018 2041 2082 N
+ F T IY e n/a 15 2018 2041 2082 N
+ F T IY i n/a 15 2018 2042 2082 N
+ F T JH e n/a 15 2018 2038 2078 N
+ F T K b n/a 15 2018 2038 2077 N
+ F T K e n/a 15 2018 2038 2077 N
+ F T L b n/a 15 2018 2051 2070 N
+ F T L e n/a 15 2018 2051 2070 N
+ F T L i n/a 15 2018 2051 2070 N
+ F T M b n/a 15 2018 2038 2077 N
+ F T M e n/a 15 2018 2038 2077 N
+ F T N b n/a 15 2018 2037 2075 N
+ F T N e n/a 15 2018 2037 2075 N
+ F T NG e n/a 15 2018 2038 2077 N
+ F T OW b n/a 15 2018 2051 2066 N
+ F T OW e n/a 15 2018 2051 2066 N
+ F T OW i n/a 15 2018 2051 2066 N
+ F T OY b n/a 15 2018 2051 2067 N
+ F T OY e n/a 15 2018 2051 2066 N
+ F T P b n/a 15 2018 2038 2077 N
+ F T P e n/a 15 2018 2038 2077 N
+ F T R b n/a 15 2018 2052 2074 N
+ F T R e n/a 15 2018 2052 2074 N
+ F T R i n/a 15 2018 2052 2074 N
+ F T S b n/a 15 2018 2038 2077 N
+ F T S e n/a 15 2018 2038 2077 N
+ F T SH e n/a 15 2018 2038 2078 N
+ F T SIL e n/a 15 2018 2039 2077 N
+ F T T b n/a 15 2018 2037 2075 N
+ F T T e n/a 15 2018 2037 2075 N
+ F T TH b n/a 15 2018 2038 2077 N
+ F T TH e n/a 15 2018 2038 2077 N
+ F T UH b n/a 15 2018 2051 2068 N
+ F T UH e n/a 15 2018 2051 2068 N
+ F T UH i n/a 15 2018 2051 2068 N
+ F T UW b n/a 15 2018 2051 2068 N
+ F T UW e n/a 15 2018 2051 2068 N
+ F T UW i n/a 15 2018 2051 2068 N
+ F T V b n/a 15 2018 2038 2077 N
+ F T V e n/a 15 2018 2038 2077 N
+ F T W b n/a 15 2018 2051 2070 N
+ F T W e n/a 15 2018 2051 2070 N
+ F T Y b n/a 15 2018 2041 2078 N
+ F T Y e n/a 15 2018 2041 2078 N
+ F T Y i n/a 15 2018 2042 2078 N
+ F T Z e n/a 15 2018 2038 2077 N
+ F T ZH e n/a 15 2018 2038 2078 N
+ F TH AA b n/a 15 2018 2051 2065 N
+ F TH AE b n/a 15 2018 2041 2079 N
+ F TH AH b n/a 15 2018 2042 2064 N
+ F TH AH i n/a 15 2018 2042 2068 N
+ F TH AO b n/a 15 2018 2051 2067 N
+ F TH AO i n/a 15 2018 2051 2067 N
+ F TH AW b n/a 15 2018 2041 2079 N
+ F TH AY b n/a 15 2018 2051 2063 N
+ F TH AY i n/a 15 2018 2051 2063 N
+ F TH D b n/a 15 2018 2037 2075 N
+ F TH EH b n/a 15 2018 2041 2080 N
+ F TH ER b n/a 15 2018 2052 2072 N
+ F TH EY b n/a 15 2018 2041 2081 N
+ F TH G b n/a 15 2018 2038 2077 N
+ F TH IH b n/a 15 2018 2041 2083 N
+ F TH IH i n/a 15 2018 2042 2083 N
+ F TH IY b n/a 15 2018 2041 2082 N
+ F TH IY i n/a 15 2018 2042 2082 N
+ F TH K b n/a 15 2018 2038 2077 N
+ F TH L b n/a 15 2018 2051 2070 N
+ F TH M b n/a 15 2018 2038 2077 N
+ F TH N b n/a 15 2018 2037 2075 N
+ F TH OW b n/a 15 2018 2051 2066 N
+ F TH OY b n/a 15 2018 2051 2067 N
+ F TH P b n/a 15 2018 2038 2077 N
+ F TH R b n/a 15 2018 2052 2074 N
+ F TH S b n/a 15 2018 2038 2077 N
+ F TH T b n/a 15 2018 2037 2075 N
+ F TH TH b n/a 15 2018 2038 2077 N
+ F TH UH b n/a 15 2018 2051 2068 N
+ F TH UH i n/a 15 2018 2051 2068 N
+ F TH UW b n/a 15 2018 2051 2068 N
+ F TH V b n/a 15 2018 2038 2077 N
+ F TH W b n/a 15 2018 2051 2070 N
+ F TH Y b n/a 15 2018 2041 2078 N
+ F UH AA b n/a 15 2036 2059 2065 N
+ F UH AA e n/a 15 2036 2059 2065 N
+ F UH AE b n/a 15 2036 2048 2079 N
+ F UH AE e n/a 15 2036 2048 2080 N
+ F UH AH b n/a 15 2036 2048 2064 N
+ F UH AH e n/a 15 2036 2048 2069 N
+ F UH AO b n/a 15 2036 2059 2067 N
+ F UH AO e n/a 15 2036 2059 2066 N
+ F UH AW b n/a 15 2036 2048 2079 N
+ F UH AW e n/a 15 2036 2048 2079 N
+ F UH AY b n/a 15 2036 2059 2063 N
+ F UH AY e n/a 15 2036 2059 2063 N
+ F UH B e n/a 15 2036 2048 2076 N
+ F UH B i n/a 15 2036 2048 2076 N
+ F UH CH e n/a 15 2036 2048 2078 N
+ F UH D b n/a 15 2036 2048 2076 N
+ F UH D e n/a 15 2036 2048 2076 N
+ F UH DH e n/a 15 2036 2048 2076 N
+ F UH EH b n/a 15 2036 2048 2080 N
+ F UH EH e n/a 15 2036 2048 2080 N
+ F UH ER b n/a 15 2036 2059 2071 N
+ F UH ER e n/a 15 2036 2059 2071 N
+ F UH ER i n/a 15 2036 2059 2071 N
+ F UH EY b n/a 15 2036 2048 2081 N
+ F UH EY e n/a 15 2036 2048 2081 N
+ F UH F e n/a 15 2036 2048 2076 N
+ F UH G b n/a 15 2036 2048 2076 N
+ F UH G e n/a 15 2036 2048 2076 N
+ F UH HH e n/a 15 2036 2048 2078 N
+ F UH IH b n/a 15 2036 2048 2083 N
+ F UH IH e n/a 15 2036 2048 2083 N
+ F UH IY b n/a 15 2036 2048 2082 N
+ F UH IY e n/a 15 2036 2048 2082 N
+ F UH JH e n/a 15 2036 2048 2078 N
+ F UH K b n/a 15 2036 2048 2076 N
+ F UH K e n/a 15 2036 2048 2076 N
+ F UH L b n/a 15 2036 2059 2070 N
+ F UH L e n/a 15 2036 2059 2070 N
+ F UH M b n/a 15 2036 2048 2076 N
+ F UH M e n/a 15 2036 2048 2076 N
+ F UH M i n/a 15 2036 2048 2076 N
+ F UH N b n/a 15 2036 2048 2076 N
+ F UH N e n/a 15 2036 2048 2076 N
+ F UH NG e n/a 15 2036 2048 2076 N
+ F UH OW b n/a 15 2036 2059 2066 N
+ F UH OW e n/a 15 2036 2059 2066 N
+ F UH OY b n/a 15 2036 2059 2067 N
+ F UH OY e n/a 15 2036 2059 2066 N
+ F UH P b n/a 15 2036 2048 2076 N
+ F UH P e n/a 15 2036 2048 2076 N
+ F UH P i n/a 15 2036 2048 2076 N
+ F UH R b n/a 15 2036 2059 2074 N
+ F UH R e n/a 15 2036 2059 2074 N
+ F UH S b n/a 15 2036 2048 2076 N
+ F UH S e n/a 15 2036 2048 2076 N
+ F UH S i n/a 15 2036 2048 2076 N
+ F UH SH e n/a 15 2036 2048 2078 N
+ F UH SIL e n/a 15 2036 2048 2076 N
+ F UH T b n/a 15 2036 2048 2076 N
+ F UH T e n/a 15 2036 2048 2076 N
+ F UH T i n/a 15 2036 2048 2076 N
+ F UH TH b n/a 15 2036 2048 2076 N
+ F UH TH e n/a 15 2036 2048 2076 N
+ F UH UH b n/a 15 2036 2059 2068 N
+ F UH UH e n/a 15 2036 2059 2068 N
+ F UH UW b n/a 15 2036 2059 2068 N
+ F UH UW e n/a 15 2036 2059 2068 N
+ F UH V b n/a 15 2036 2048 2076 N
+ F UH V e n/a 15 2036 2048 2076 N
+ F UH W b n/a 15 2036 2059 2070 N
+ F UH W e n/a 15 2036 2059 2070 N
+ F UH Y b n/a 15 2036 2048 2078 N
+ F UH Y e n/a 15 2036 2048 2078 N
+ F UH Z e n/a 15 2036 2048 2076 N
+ F UH ZH e n/a 15 2036 2048 2078 N
+ F UW AA b n/a 15 2036 2059 2065 N
+ F UW AA e n/a 15 2036 2059 2065 N
+ F UW AA i n/a 15 2036 2059 2065 N
+ F UW AE b n/a 15 2036 2048 2079 N
+ F UW AE e n/a 15 2036 2048 2080 N
+ F UW AE i n/a 15 2036 2048 2079 N
+ F UW AH b n/a 15 2036 2048 2064 N
+ F UW AH e n/a 15 2036 2048 2069 N
+ F UW AH i n/a 15 2036 2048 2069 N
+ F UW AO b n/a 15 2036 2059 2067 N
+ F UW AO e n/a 15 2036 2059 2066 N
+ F UW AO i n/a 15 2036 2059 2067 N
+ F UW AW b n/a 15 2036 2048 2079 N
+ F UW AW e n/a 15 2036 2048 2079 N
+ F UW AW i n/a 15 2036 2048 2079 N
+ F UW AY b n/a 15 2036 2059 2063 N
+ F UW AY e n/a 15 2036 2059 2063 N
+ F UW AY i n/a 15 2036 2059 2063 N
+ F UW B e n/a 15 2036 2048 2076 N
+ F UW CH e n/a 15 2036 2048 2078 N
+ F UW CH i n/a 15 2036 2048 2078 N
+ F UW D b n/a 15 2036 2048 2076 N
+ F UW D e n/a 15 2036 2048 2076 N
+ F UW DH e n/a 15 2036 2048 2076 N
+ F UW EH b n/a 15 2036 2048 2080 N
+ F UW EH e n/a 15 2036 2048 2080 N
+ F UW EH i n/a 15 2036 2048 2080 N
+ F UW ER b n/a 15 2036 2059 2072 N
+ F UW ER e n/a 15 2036 2059 2072 N
+ F UW ER i n/a 15 2036 2059 2071 N
+ F UW EY b n/a 15 2036 2048 2081 N
+ F UW EY e n/a 15 2036 2048 2081 N
+ F UW EY i n/a 15 2036 2048 2081 N
+ F UW F e n/a 15 2036 2048 2076 N
+ F UW G b n/a 15 2036 2048 2076 N
+ F UW G e n/a 15 2036 2048 2076 N
+ F UW HH e n/a 15 2036 2048 2078 N
+ F UW IH b n/a 15 2036 2048 2083 N
+ F UW IH e n/a 15 2036 2048 2083 N
+ F UW IH i n/a 15 2036 2048 2083 N
+ F UW IY b n/a 15 2036 2048 2082 N
+ F UW IY e n/a 15 2036 2048 2082 N
+ F UW IY i n/a 15 2036 2048 2082 N
+ F UW JH e n/a 15 2036 2048 2078 N
+ F UW K b n/a 15 2036 2048 2076 N
+ F UW K e n/a 15 2036 2048 2076 N
+ F UW L b n/a 15 2036 2059 2070 N
+ F UW L e n/a 15 2036 2059 2070 N
+ F UW L i n/a 15 2036 2059 2070 N
+ F UW M b n/a 15 2036 2048 2076 N
+ F UW M e n/a 15 2036 2048 2076 N
+ F UW N b n/a 15 2036 2048 2076 N
+ F UW N e n/a 15 2036 2048 2076 N
+ F UW N i n/a 15 2036 2048 2076 N
+ F UW NG e n/a 15 2036 2048 2076 N
+ F UW OW b n/a 15 2036 2059 2066 N
+ F UW OW e n/a 15 2036 2059 2066 N
+ F UW OW i n/a 15 2036 2059 2066 N
+ F UW OY b n/a 15 2036 2059 2067 N
+ F UW OY e n/a 15 2036 2059 2066 N
+ F UW P b n/a 15 2036 2048 2076 N
+ F UW P e n/a 15 2036 2048 2076 N
+ F UW R b n/a 15 2036 2059 2074 N
+ F UW R e n/a 15 2036 2059 2074 N
+ F UW R i n/a 15 2036 2059 2074 N
+ F UW S b n/a 15 2036 2048 2076 N
+ F UW S e n/a 15 2036 2048 2076 N
+ F UW S i n/a 15 2036 2048 2076 N
+ F UW SH e n/a 15 2036 2048 2078 N
+ F UW SIL e n/a 15 2036 2048 2076 N
+ F UW T b n/a 15 2036 2048 2076 N
+ F UW T e n/a 15 2036 2048 2076 N
+ F UW T i n/a 15 2036 2048 2076 N
+ F UW TH b n/a 15 2036 2048 2076 N
+ F UW TH e n/a 15 2036 2048 2076 N
+ F UW UH b n/a 15 2036 2059 2068 N
+ F UW UH e n/a 15 2036 2059 2068 N
+ F UW UW b n/a 15 2036 2059 2068 N
+ F UW UW e n/a 15 2036 2059 2068 N
+ F UW UW i n/a 15 2036 2059 2068 N
+ F UW V b n/a 15 2036 2048 2076 N
+ F UW V e n/a 15 2036 2048 2076 N
+ F UW W b n/a 15 2036 2059 2070 N
+ F UW W e n/a 15 2036 2059 2070 N
+ F UW Y b n/a 15 2036 2048 2078 N
+ F UW Y e n/a 15 2036 2048 2078 N
+ F UW Z e n/a 15 2036 2048 2076 N
+ F UW ZH e n/a 15 2036 2048 2078 N
+ F V AA b n/a 15 2019 2051 2065 N
+ F V AA e n/a 15 2019 2051 2065 N
+ F V AE b n/a 15 2019 2041 2079 N
+ F V AE e n/a 15 2019 2041 2080 N
+ F V AH b n/a 15 2019 2042 2064 N
+ F V AH e n/a 15 2019 2042 2069 N
+ F V AO b n/a 15 2019 2051 2067 N
+ F V AO e n/a 15 2019 2051 2066 N
+ F V AW b n/a 15 2019 2041 2079 N
+ F V AW e n/a 15 2019 2041 2079 N
+ F V AY b n/a 15 2019 2051 2063 N
+ F V AY e n/a 15 2019 2051 2064 N
+ F V B e n/a 15 2019 2038 2077 N
+ F V CH e n/a 15 2019 2038 2078 N
+ F V D b n/a 15 2019 2037 2075 N
+ F V D e n/a 15 2019 2037 2075 N
+ F V DH e n/a 15 2019 2038 2077 N
+ F V EH b n/a 15 2019 2041 2080 N
+ F V EH e n/a 15 2019 2041 2080 N
+ F V ER b n/a 15 2019 2052 2072 N
+ F V ER e n/a 15 2019 2052 2072 N
+ F V EY b n/a 15 2019 2041 2081 N
+ F V EY e n/a 15 2019 2041 2081 N
+ F V F e n/a 15 2019 2038 2077 N
+ F V G b n/a 15 2019 2038 2077 N
+ F V G e n/a 15 2019 2038 2077 N
+ F V HH e n/a 15 2019 2038 2075 N
+ F V IH b n/a 15 2019 2041 2083 N
+ F V IH e n/a 15 2019 2041 2083 N
+ F V IY b n/a 15 2019 2041 2082 N
+ F V IY e n/a 15 2019 2041 2082 N
+ F V IY i n/a 15 2019 2042 2082 N
+ F V JH e n/a 15 2019 2038 2078 N
+ F V K b n/a 15 2019 2038 2077 N
+ F V K e n/a 15 2019 2038 2077 N
+ F V L b n/a 15 2019 2051 2070 N
+ F V L e n/a 15 2019 2051 2070 N
+ F V M b n/a 15 2019 2038 2077 N
+ F V M e n/a 15 2019 2038 2077 N
+ F V N b n/a 15 2019 2037 2075 N
+ F V N e n/a 15 2019 2037 2075 N
+ F V NG e n/a 15 2019 2038 2077 N
+ F V OW b n/a 15 2019 2051 2066 N
+ F V OW e n/a 15 2019 2051 2066 N
+ F V OW i n/a 15 2019 2051 2066 N
+ F V OY b n/a 15 2019 2051 2067 N
+ F V OY e n/a 15 2019 2051 2066 N
+ F V P b n/a 15 2019 2038 2077 N
+ F V P e n/a 15 2019 2038 2077 N
+ F V R b n/a 15 2019 2052 2074 N
+ F V R e n/a 15 2019 2052 2074 N
+ F V S b n/a 15 2019 2038 2077 N
+ F V S e n/a 15 2019 2038 2077 N
+ F V SH e n/a 15 2019 2038 2078 N
+ F V SIL e n/a 15 2019 2039 2077 N
+ F V T b n/a 15 2019 2037 2075 N
+ F V T e n/a 15 2019 2037 2075 N
+ F V TH b n/a 15 2019 2038 2077 N
+ F V TH e n/a 15 2019 2038 2077 N
+ F V UH b n/a 15 2019 2051 2068 N
+ F V UH e n/a 15 2019 2051 2068 N
+ F V UW b n/a 15 2019 2051 2068 N
+ F V UW e n/a 15 2019 2051 2068 N
+ F V V b n/a 15 2019 2038 2077 N
+ F V V e n/a 15 2019 2038 2077 N
+ F V W b n/a 15 2019 2051 2070 N
+ F V W e n/a 15 2019 2051 2070 N
+ F V Y b n/a 15 2019 2041 2078 N
+ F V Y e n/a 15 2019 2041 2078 N
+ F V Z e n/a 15 2019 2038 2077 N
+ F V ZH e n/a 15 2019 2038 2078 N
+ F W AA b n/a 15 2034 2054 2065 N
+ F W AA e n/a 15 2035 2054 2065 N
+ F W AE b n/a 15 2034 2046 2079 N
+ F W AE e n/a 15 2035 2046 2080 N
+ F W AH b n/a 15 2034 2046 2064 N
+ F W AH e n/a 15 2035 2046 2069 N
+ F W AO b n/a 15 2034 2055 2067 N
+ F W AO e n/a 15 2035 2055 2066 N
+ F W AW b n/a 15 2034 2046 2079 N
+ F W AW e n/a 15 2035 2046 2079 N
+ F W AY b n/a 15 2034 2054 2063 N
+ F W AY e n/a 15 2035 2054 2064 N
+ F W B e n/a 15 2035 2039 2077 N
+ F W CH e n/a 15 2035 2039 2078 N
+ F W D b n/a 15 2034 2039 2075 N
+ F W D e n/a 15 2035 2039 2075 N
+ F W DH e n/a 15 2035 2039 2077 N
+ F W EH b n/a 15 2034 2046 2080 N
+ F W EH e n/a 15 2035 2046 2080 N
+ F W ER b n/a 15 2034 2057 2072 N
+ F W ER e n/a 15 2035 2057 2072 N
+ F W EY b n/a 15 2034 2046 2081 N
+ F W EY e n/a 15 2035 2046 2081 N
+ F W F e n/a 15 2035 2039 2077 N
+ F W G b n/a 15 2034 2039 2077 N
+ F W G e n/a 15 2035 2039 2077 N
+ F W HH e n/a 15 2035 2039 2075 N
+ F W IH b n/a 15 2034 2046 2083 N
+ F W IH e n/a 15 2035 2046 2083 N
+ F W IY b n/a 15 2034 2046 2082 N
+ F W IY e n/a 15 2035 2046 2082 N
+ F W JH e n/a 15 2035 2039 2078 N
+ F W K b n/a 15 2034 2039 2077 N
+ F W K e n/a 15 2035 2039 2077 N
+ F W L b n/a 15 2034 2055 2070 N
+ F W L e n/a 15 2035 2055 2070 N
+ F W M b n/a 15 2034 2039 2077 N
+ F W M e n/a 15 2035 2039 2077 N
+ F W N b n/a 15 2034 2039 2075 N
+ F W N e n/a 15 2035 2039 2075 N
+ F W NG e n/a 15 2035 2039 2077 N
+ F W OW b n/a 15 2034 2055 2066 N
+ F W OW e n/a 15 2035 2055 2066 N
+ F W OY b n/a 15 2034 2055 2067 N
+ F W OY e n/a 15 2035 2055 2066 N
+ F W P b n/a 15 2034 2039 2077 N
+ F W P e n/a 15 2035 2039 2077 N
+ F W P i n/a 15 2034 2039 2077 N
+ F W R b n/a 15 2034 2057 2074 N
+ F W R e n/a 15 2035 2057 2074 N
+ F W S b n/a 15 2034 2039 2077 N
+ F W S e n/a 15 2035 2039 2077 N
+ F W SH e n/a 15 2035 2039 2078 N
+ F W SIL e n/a 15 2035 2039 2077 N
+ F W T b n/a 15 2034 2039 2075 N
+ F W T e n/a 15 2035 2039 2075 N
+ F W TH b n/a 15 2034 2039 2077 N
+ F W TH e n/a 15 2035 2039 2077 N
+ F W UH b n/a 15 2034 2055 2068 N
+ F W UH e n/a 15 2035 2055 2068 N
+ F W UW b n/a 15 2034 2055 2068 N
+ F W UW e n/a 15 2035 2055 2068 N
+ F W V b n/a 15 2034 2039 2077 N
+ F W V e n/a 15 2035 2039 2077 N
+ F W W b n/a 15 2034 2055 2070 N
+ F W W e n/a 15 2035 2055 2070 N
+ F W Y b n/a 15 2034 2046 2078 N
+ F W Y e n/a 15 2035 2046 2078 N
+ F W Z e n/a 15 2035 2039 2077 N
+ F W ZH e n/a 15 2035 2039 2078 N
+ F Y AA b n/a 15 2024 2059 2065 N
+ F Y AE b n/a 15 2024 2048 2079 N
+ F Y AH b n/a 15 2025 2048 2064 N
+ F Y AO b n/a 15 2024 2059 2067 N
+ F Y AW b n/a 15 2025 2048 2079 N
+ F Y AY b n/a 15 2025 2059 2063 N
+ F Y D b n/a 15 2025 2048 2076 N
+ F Y EH b n/a 15 2025 2048 2080 N
+ F Y ER b n/a 15 2025 2059 2072 N
+ F Y EY b n/a 15 2024 2048 2081 N
+ F Y G b n/a 15 2025 2048 2076 N
+ F Y IH b n/a 15 2025 2048 2083 N
+ F Y IY b n/a 15 2024 2048 2082 N
+ F Y K b n/a 15 2025 2048 2076 N
+ F Y L b n/a 15 2025 2059 2070 N
+ F Y M b n/a 15 2025 2048 2076 N
+ F Y N b n/a 15 2025 2048 2076 N
+ F Y OW b n/a 15 2025 2059 2066 N
+ F Y OY b n/a 15 2025 2059 2067 N
+ F Y P b n/a 15 2025 2048 2076 N
+ F Y R b n/a 15 2025 2059 2074 N
+ F Y S b n/a 15 2025 2048 2076 N
+ F Y T b n/a 15 2025 2048 2076 N
+ F Y TH b n/a 15 2025 2048 2076 N
+ F Y UH b n/a 15 2025 2059 2068 N
+ F Y UW b n/a 15 2024 2059 2068 N
+ F Y V b n/a 15 2025 2048 2076 N
+ F Y W b n/a 15 2025 2059 2070 N
+ F Y Y b n/a 15 2025 2048 2078 N
+ F Z AA b n/a 15 2020 2050 2065 N
+ F Z AA e n/a 15 2020 2050 2065 N
+ F Z AE b n/a 15 2020 2043 2079 N
+ F Z AE e n/a 15 2020 2043 2080 N
+ F Z AH b n/a 15 2020 2042 2064 N
+ F Z AH e n/a 15 2020 2042 2069 N
+ F Z AH i n/a 15 2020 2042 2068 N
+ F Z AO b n/a 15 2020 2051 2067 N
+ F Z AO e n/a 15 2020 2051 2067 N
+ F Z AW b n/a 15 2020 2043 2079 N
+ F Z AW e n/a 15 2020 2043 2079 N
+ F Z AY b n/a 15 2020 2050 2063 N
+ F Z AY e n/a 15 2020 2050 2064 N
+ F Z B e n/a 15 2020 2038 2077 N
+ F Z CH e n/a 15 2020 2038 2078 N
+ F Z D b n/a 15 2020 2037 2075 N
+ F Z D e n/a 15 2020 2037 2075 N
+ F Z DH e n/a 15 2020 2038 2077 N
+ F Z EH b n/a 15 2020 2043 2080 N
+ F Z EH e n/a 15 2020 2043 2080 N
+ F Z EH i n/a 15 2020 2043 2080 N
+ F Z ER b n/a 15 2020 2053 2072 N
+ F Z ER e n/a 15 2020 2053 2072 N
+ F Z ER i n/a 15 2020 2053 2071 N
+ F Z EY b n/a 15 2020 2043 2081 N
+ F Z EY e n/a 15 2020 2043 2081 N
+ F Z F e n/a 15 2020 2038 2077 N
+ F Z G b n/a 15 2020 2038 2077 N
+ F Z G e n/a 15 2020 2038 2077 N
+ F Z HH e n/a 15 2020 2038 2075 N
+ F Z IH b n/a 15 2020 2043 2083 N
+ F Z IH e n/a 15 2020 2043 2082 N
+ F Z IY b n/a 15 2020 2043 2082 N
+ F Z IY e n/a 15 2020 2043 2082 N
+ F Z IY i n/a 15 2020 2043 2082 N
+ F Z JH e n/a 15 2020 2038 2078 N
+ F Z K b n/a 15 2020 2038 2077 N
+ F Z K e n/a 15 2020 2038 2077 N
+ F Z L b n/a 15 2020 2051 2070 N
+ F Z L e n/a 15 2020 2051 2070 N
+ F Z M b n/a 15 2020 2038 2077 N
+ F Z M e n/a 15 2020 2038 2077 N
+ F Z N b n/a 15 2020 2037 2075 N
+ F Z N e n/a 15 2020 2037 2075 N
+ F Z NG e n/a 15 2020 2038 2077 N
+ F Z OW b n/a 15 2020 2051 2066 N
+ F Z OW e n/a 15 2020 2051 2066 N
+ F Z OW i n/a 15 2020 2051 2066 N
+ F Z OY b n/a 15 2020 2051 2067 N
+ F Z OY e n/a 15 2020 2051 2067 N
+ F Z P b n/a 15 2020 2038 2077 N
+ F Z P e n/a 15 2020 2038 2077 N
+ F Z R b n/a 15 2021 2053 2074 N
+ F Z R e n/a 15 2021 2053 2074 N
+ F Z S b n/a 15 2020 2038 2077 N
+ F Z S e n/a 15 2020 2038 2077 N
+ F Z SH e n/a 15 2020 2038 2078 N
+ F Z SIL e n/a 15 2020 2039 2077 N
+ F Z T b n/a 15 2020 2037 2075 N
+ F Z T e n/a 15 2020 2037 2075 N
+ F Z TH b n/a 15 2020 2038 2077 N
+ F Z TH e n/a 15 2020 2038 2077 N
+ F Z UH b n/a 15 2020 2051 2068 N
+ F Z UH e n/a 15 2020 2051 2068 N
+ F Z UW b n/a 15 2020 2051 2068 N
+ F Z UW e n/a 15 2020 2051 2068 N
+ F Z V b n/a 15 2020 2038 2077 N
+ F Z V e n/a 15 2020 2038 2077 N
+ F Z W b n/a 15 2020 2051 2070 N
+ F Z W e n/a 15 2020 2051 2070 N
+ F Z Y b n/a 15 2020 2043 2078 N
+ F Z Y e n/a 15 2020 2043 2078 N
+ F Z Y i n/a 15 2020 2043 2078 N
+ F Z Z e n/a 15 2020 2038 2077 N
+ F Z ZH e n/a 15 2020 2038 2078 N
+ F ZH AA b n/a 15 2021 2051 2065 N
+ F ZH AE b n/a 15 2021 2041 2079 N
+ F ZH AH b n/a 15 2021 2042 2064 N
+ F ZH AO b n/a 15 2021 2051 2067 N
+ F ZH AW b n/a 15 2021 2041 2079 N
+ F ZH AY b n/a 15 2021 2051 2063 N
+ F ZH D b n/a 15 2021 2037 2075 N
+ F ZH EH b n/a 15 2021 2041 2080 N
+ F ZH ER b n/a 15 2021 2053 2072 N
+ F ZH EY b n/a 15 2021 2041 2081 N
+ F ZH G b n/a 15 2021 2038 2077 N
+ F ZH IH b n/a 15 2021 2041 2083 N
+ F ZH IY b n/a 15 2021 2041 2082 N
+ F ZH K b n/a 15 2021 2038 2077 N
+ F ZH L b n/a 15 2021 2051 2070 N
+ F ZH M b n/a 15 2021 2038 2077 N
+ F ZH N b n/a 15 2021 2037 2075 N
+ F ZH OW b n/a 15 2021 2051 2066 N
+ F ZH OY b n/a 15 2021 2051 2067 N
+ F ZH P b n/a 15 2021 2038 2077 N
+ F ZH R b n/a 15 2021 2053 2074 N
+ F ZH S b n/a 15 2021 2038 2077 N
+ F ZH T b n/a 15 2021 2037 2075 N
+ F ZH TH b n/a 15 2021 2038 2077 N
+ F ZH UH b n/a 15 2021 2051 2068 N
+ F ZH UW b n/a 15 2021 2051 2068 N
+ F ZH V b n/a 15 2021 2038 2077 N
+ F ZH W b n/a 15 2021 2051 2070 N
+ F ZH Y b n/a 15 2021 2041 2078 N
+ G AA AA b n/a 16 2095 2113 2140 N
+ G AA AA e n/a 16 2095 2113 2140 N
+ G AA AA i n/a 16 2095 2113 2140 N
+ G AA AA s n/a 16 2095 2113 2140 N
+ G AA AE b n/a 16 2095 2107 2125 N
+ G AA AE e n/a 16 2095 2107 2125 N
+ G AA AE i n/a 16 2095 2107 2125 N
+ G AA AE s n/a 16 2095 2107 2125 N
+ G AA AH b n/a 16 2095 2114 2139 N
+ G AA AH e n/a 16 2095 2110 2135 N
+ G AA AH i n/a 16 2095 2110 2135 N
+ G AA AH s n/a 16 2095 2110 2135 N
+ G AA AO b n/a 16 2095 2116 2138 N
+ G AA AO e n/a 16 2095 2116 2138 N
+ G AA AO i n/a 16 2095 2116 2140 N
+ G AA AO s n/a 16 2095 2116 2138 N
+ G AA AW b n/a 16 2095 2107 2125 N
+ G AA AW e n/a 16 2095 2107 2125 N
+ G AA AW s n/a 16 2095 2107 2125 N
+ G AA AY b n/a 16 2095 2114 2139 N
+ G AA AY e n/a 16 2095 2114 2139 N
+ G AA AY i n/a 16 2095 2114 2139 N
+ G AA AY s n/a 16 2095 2114 2139 N
+ G AA B b n/a 16 2095 2117 2128 N
+ G AA B e n/a 16 2095 2117 2128 N
+ G AA B i n/a 16 2095 2117 2128 N
+ G AA B s n/a 16 2095 2117 2128 N
+ G AA CH e n/a 16 2095 2120 2128 N
+ G AA CH s n/a 16 2095 2120 2128 N
+ G AA D b n/a 16 2095 2117 2128 N
+ G AA D e n/a 16 2095 2117 2128 N
+ G AA D i n/a 16 2095 2117 2128 N
+ G AA D s n/a 16 2095 2117 2128 N
+ G AA DH e n/a 16 2095 2120 2128 N
+ G AA DH s n/a 16 2095 2120 2128 N
+ G AA EH b n/a 16 2095 2107 2125 N
+ G AA EH e n/a 16 2095 2107 2125 N
+ G AA EH i n/a 16 2095 2107 2125 N
+ G AA EH s n/a 16 2095 2107 2125 N
+ G AA ER b n/a 16 2095 2116 2136 N
+ G AA ER e n/a 16 2095 2110 2136 N
+ G AA ER i n/a 16 2095 2110 2136 N
+ G AA ER s n/a 16 2095 2110 2136 N
+ G AA EY b n/a 16 2095 2107 2127 N
+ G AA EY e n/a 16 2095 2107 2127 N
+ G AA EY s n/a 16 2095 2107 2127 N
+ G AA F b n/a 16 2095 2120 2128 N
+ G AA F e n/a 16 2095 2120 2128 N
+ G AA F i n/a 16 2095 2120 2128 N
+ G AA F s n/a 16 2095 2120 2128 N
+ G AA G e n/a 16 2095 2117 2128 N
+ G AA G s n/a 16 2095 2117 2128 N
+ G AA HH e n/a 16 2095 2120 2128 N
+ G AA HH i n/a 16 2095 2120 2128 N
+ G AA HH s n/a 16 2095 2120 2128 N
+ G AA IH b n/a 16 2095 2109 2126 N
+ G AA IH e n/a 16 2095 2107 2126 N
+ G AA IH i n/a 16 2095 2107 2126 N
+ G AA IH s n/a 16 2095 2107 2126 N
+ G AA IY b n/a 16 2095 2109 2126 N
+ G AA IY e n/a 16 2095 2107 2126 N
+ G AA IY i n/a 16 2095 2107 2126 N
+ G AA IY s n/a 16 2095 2107 2126 N
+ G AA JH e n/a 16 2095 2117 2128 N
+ G AA JH i n/a 16 2095 2117 2128 N
+ G AA JH s n/a 16 2095 2117 2128 N
+ G AA K b n/a 16 2095 2120 2128 N
+ G AA K e n/a 16 2095 2120 2128 N
+ G AA K s n/a 16 2095 2120 2128 N
+ G AA L b n/a 16 2095 2123 2133 N
+ G AA L e n/a 16 2095 2124 2133 N
+ G AA L i n/a 16 2095 2124 2133 N
+ G AA L s n/a 16 2095 2124 2133 N
+ G AA M b n/a 16 2095 2117 2129 N
+ G AA M e n/a 16 2095 2117 2129 N
+ G AA M i n/a 16 2095 2117 2129 N
+ G AA M s n/a 16 2095 2117 2129 N
+ G AA N b n/a 16 2095 2117 2129 N
+ G AA N e n/a 16 2095 2117 2129 N
+ G AA N i n/a 16 2095 2117 2129 N
+ G AA N s n/a 16 2095 2117 2129 N
+ G AA NG e n/a 16 2095 2117 2129 N
+ G AA NG s n/a 16 2095 2117 2129 N
+ G AA OW b n/a 16 2095 2116 2138 N
+ G AA OW e n/a 16 2095 2116 2138 N
+ G AA OW i n/a 16 2095 2116 2140 N
+ G AA OW s n/a 16 2095 2116 2138 N
+ G AA OY b n/a 16 2095 2116 2138 N
+ G AA OY e n/a 16 2095 2116 2138 N
+ G AA OY s n/a 16 2095 2116 2138 N
+ G AA P b n/a 16 2095 2120 2128 N
+ G AA P e n/a 16 2095 2120 2128 N
+ G AA P s n/a 16 2095 2120 2128 N
+ G AA R b n/a 16 2095 2123 2132 N
+ G AA R e n/a 16 2095 2124 2132 N
+ G AA R i n/a 16 2095 2124 2132 N
+ G AA R s n/a 16 2095 2124 2132 N
+ G AA S b n/a 16 2095 2120 2131 N
+ G AA S e n/a 16 2095 2120 2131 N
+ G AA S i n/a 16 2095 2120 2131 N
+ G AA S s n/a 16 2095 2120 2131 N
+ G AA SH e n/a 16 2095 2120 2131 N
+ G AA SH s n/a 16 2095 2120 2131 N
+ G AA SIL e n/a 16 2095 2120 2128 N
+ G AA SIL s n/a 16 2095 2120 2128 N
+ G AA T b n/a 16 2095 2120 2128 N
+ G AA T e n/a 16 2095 2120 2128 N
+ G AA T i n/a 16 2095 2120 2128 N
+ G AA T s n/a 16 2095 2120 2128 N
+ G AA TH e n/a 16 2095 2120 2128 N
+ G AA TH s n/a 16 2095 2120 2128 N
+ G AA UH b n/a 16 2095 2116 2136 N
+ G AA UH e n/a 16 2095 2116 2136 N
+ G AA UH s n/a 16 2095 2116 2136 N
+ G AA UW b n/a 16 2095 2116 2138 N
+ G AA UW e n/a 16 2095 2116 2138 N
+ G AA UW i n/a 16 2095 2116 2140 N
+ G AA UW s n/a 16 2095 2116 2138 N
+ G AA V e n/a 16 2095 2120 2128 N
+ G AA V s n/a 16 2095 2120 2128 N
+ G AA W b n/a 16 2095 2117 2129 N
+ G AA W e n/a 16 2095 2117 2129 N
+ G AA W i n/a 16 2095 2117 2129 N
+ G AA W s n/a 16 2095 2117 2129 N
+ G AA Y b n/a 16 2095 2118 2130 N
+ G AA Y e n/a 16 2095 2118 2130 N
+ G AA Y s n/a 16 2095 2118 2130 N
+ G AA Z b n/a 16 2095 2120 2131 N
+ G AA Z e n/a 16 2095 2120 2131 N
+ G AA Z i n/a 16 2095 2120 2131 N
+ G AA Z s n/a 16 2095 2120 2131 N
+ G AA ZH e n/a 16 2095 2120 2131 N
+ G AA ZH s n/a 16 2095 2120 2131 N
+ G AE AA b n/a 16 2098 2113 2140 N
+ G AE AA e n/a 16 2098 2113 2140 N
+ G AE AA i n/a 16 2098 2113 2140 N
+ G AE AA s n/a 16 2098 2113 2140 N
+ G AE AE b n/a 16 2098 2107 2125 N
+ G AE AE e n/a 16 2098 2107 2125 N
+ G AE AE i n/a 16 2098 2107 2125 N
+ G AE AE s n/a 16 2098 2107 2125 N
+ G AE AH b n/a 16 2098 2114 2139 N
+ G AE AH e n/a 16 2098 2111 2135 N
+ G AE AH i n/a 16 2098 2111 2135 N
+ G AE AH s n/a 16 2098 2111 2135 N
+ G AE AO b n/a 16 2098 2113 2138 N
+ G AE AO e n/a 16 2098 2113 2138 N
+ G AE AO i n/a 16 2098 2113 2140 N
+ G AE AO s n/a 16 2098 2113 2138 N
+ G AE AW b n/a 16 2098 2107 2125 N
+ G AE AW e n/a 16 2098 2107 2125 N
+ G AE AW i n/a 16 2098 2107 2125 N
+ G AE AW s n/a 16 2098 2107 2125 N
+ G AE AY b n/a 16 2098 2114 2139 N
+ G AE AY e n/a 16 2098 2114 2139 N
+ G AE AY s n/a 16 2098 2114 2139 N
+ G AE B b n/a 16 2098 2119 2128 N
+ G AE B e n/a 16 2098 2119 2128 N
+ G AE B i n/a 16 2098 2119 2128 N
+ G AE B s n/a 16 2098 2119 2128 N
+ G AE CH e n/a 16 2098 2119 2128 N
+ G AE CH s n/a 16 2098 2119 2128 N
+ G AE D b n/a 16 2098 2119 2128 N
+ G AE D e n/a 16 2098 2119 2128 N
+ G AE D i n/a 16 2098 2119 2128 N
+ G AE D s n/a 16 2098 2119 2128 N
+ G AE DH e n/a 16 2098 2121 2128 N
+ G AE DH s n/a 16 2098 2121 2128 N
+ G AE EH b n/a 16 2098 2107 2125 N
+ G AE EH e n/a 16 2098 2107 2125 N
+ G AE EH i n/a 16 2098 2107 2125 N
+ G AE EH s n/a 16 2098 2107 2125 N
+ G AE ER b n/a 16 2098 2116 2136 N
+ G AE ER e n/a 16 2098 2111 2137 N
+ G AE ER i n/a 16 2098 2111 2137 N
+ G AE ER s n/a 16 2098 2111 2137 N
+ G AE EY b n/a 16 2098 2107 2127 N
+ G AE EY e n/a 16 2098 2107 2127 N
+ G AE EY i n/a 16 2098 2107 2127 N
+ G AE EY s n/a 16 2098 2107 2127 N
+ G AE F b n/a 16 2098 2121 2128 N
+ G AE F e n/a 16 2098 2121 2128 N
+ G AE F i n/a 16 2098 2121 2128 N
+ G AE F s n/a 16 2098 2121 2128 N
+ G AE G e n/a 16 2098 2119 2128 N
+ G AE G s n/a 16 2098 2119 2128 N
+ G AE HH e n/a 16 2098 2118 2128 N
+ G AE HH i n/a 16 2098 2118 2128 N
+ G AE HH s n/a 16 2098 2118 2128 N
+ G AE IH b n/a 16 2098 2109 2126 N
+ G AE IH e n/a 16 2098 2107 2126 N
+ G AE IH i n/a 16 2098 2107 2126 N
+ G AE IH s n/a 16 2098 2107 2126 N
+ G AE IY b n/a 16 2098 2109 2126 N
+ G AE IY e n/a 16 2098 2107 2126 N
+ G AE IY i n/a 16 2098 2107 2126 N
+ G AE IY s n/a 16 2098 2107 2126 N
+ G AE JH e n/a 16 2098 2119 2128 N
+ G AE JH s n/a 16 2098 2119 2128 N
+ G AE K b n/a 16 2098 2119 2128 N
+ G AE K e n/a 16 2098 2119 2128 N
+ G AE K i n/a 16 2098 2119 2128 N
+ G AE K s n/a 16 2098 2119 2128 N
+ G AE L b n/a 16 2098 2123 2133 N
+ G AE L e n/a 16 2098 2124 2133 N
+ G AE L i n/a 16 2098 2124 2133 N
+ G AE L s n/a 16 2098 2124 2133 N
+ G AE M b n/a 16 2098 2119 2129 N
+ G AE M e n/a 16 2098 2119 2129 N
+ G AE M i n/a 16 2098 2119 2129 N
+ G AE M s n/a 16 2098 2119 2129 N
+ G AE N b n/a 16 2098 2119 2129 N
+ G AE N e n/a 16 2098 2119 2129 N
+ G AE N i n/a 16 2098 2119 2129 N
+ G AE N s n/a 16 2098 2119 2129 N
+ G AE NG e n/a 16 2098 2119 2129 N
+ G AE NG s n/a 16 2098 2119 2129 N
+ G AE OW b n/a 16 2098 2113 2138 N
+ G AE OW e n/a 16 2098 2114 2138 N
+ G AE OW i n/a 16 2098 2114 2139 N
+ G AE OW s n/a 16 2098 2114 2138 N
+ G AE OY b n/a 16 2098 2113 2138 N
+ G AE OY e n/a 16 2098 2113 2138 N
+ G AE OY s n/a 16 2098 2113 2138 N
+ G AE P b n/a 16 2098 2119 2128 N
+ G AE P e n/a 16 2098 2119 2128 N
+ G AE P i n/a 16 2098 2119 2128 N
+ G AE P s n/a 16 2098 2119 2128 N
+ G AE R b n/a 16 2098 2123 2132 N
+ G AE R e n/a 16 2098 2124 2132 N
+ G AE R i n/a 16 2098 2124 2132 N
+ G AE R s n/a 16 2098 2124 2132 N
+ G AE S b n/a 16 2098 2121 2131 N
+ G AE S e n/a 16 2098 2121 2131 N
+ G AE S i n/a 16 2098 2121 2131 N
+ G AE S s n/a 16 2098 2121 2131 N
+ G AE SH e n/a 16 2098 2121 2131 N
+ G AE SH i n/a 16 2098 2121 2131 N
+ G AE SH s n/a 16 2098 2121 2131 N
+ G AE SIL e n/a 16 2098 2118 2128 N
+ G AE SIL s n/a 16 2098 2118 2128 N
+ G AE T b n/a 16 2098 2119 2128 N
+ G AE T e n/a 16 2098 2119 2128 N
+ G AE T i n/a 16 2098 2119 2128 N
+ G AE T s n/a 16 2098 2119 2128 N
+ G AE TH e n/a 16 2098 2121 2128 N
+ G AE TH i n/a 16 2098 2121 2128 N
+ G AE TH s n/a 16 2098 2121 2128 N
+ G AE UH b n/a 16 2098 2116 2136 N
+ G AE UH e n/a 16 2098 2116 2137 N
+ G AE UH i n/a 16 2098 2116 2137 N
+ G AE UH s n/a 16 2098 2116 2137 N
+ G AE UW b n/a 16 2098 2113 2138 N
+ G AE UW e n/a 16 2098 2114 2138 N
+ G AE UW i n/a 16 2098 2114 2140 N
+ G AE UW s n/a 16 2098 2114 2138 N
+ G AE V e n/a 16 2098 2121 2128 N
+ G AE V s n/a 16 2098 2121 2128 N
+ G AE W b n/a 16 2098 2117 2129 N
+ G AE W e n/a 16 2098 2117 2129 N
+ G AE W i n/a 16 2098 2117 2129 N
+ G AE W s n/a 16 2098 2117 2129 N
+ G AE Y b n/a 16 2098 2119 2130 N
+ G AE Y e n/a 16 2098 2119 2130 N
+ G AE Y i n/a 16 2098 2119 2130 N
+ G AE Y s n/a 16 2098 2119 2130 N
+ G AE Z b n/a 16 2098 2121 2131 N
+ G AE Z e n/a 16 2098 2121 2131 N
+ G AE Z i n/a 16 2098 2121 2131 N
+ G AE Z s n/a 16 2098 2121 2131 N
+ G AE ZH e n/a 16 2098 2121 2131 N
+ G AE ZH s n/a 16 2098 2121 2131 N
+ G AH AA b n/a 16 2096 2113 2140 N
+ G AH AA e n/a 16 2097 2113 2140 N
+ G AH AA i n/a 16 2097 2113 2140 N
+ G AH AA s n/a 16 2097 2113 2140 N
+ G AH AE b n/a 16 2105 2107 2125 N
+ G AH AE e n/a 16 2105 2107 2125 N
+ G AH AE i n/a 16 2105 2107 2125 N
+ G AH AE s n/a 16 2105 2107 2125 N
+ G AH AH b n/a 16 2104 2114 2139 N
+ G AH AH e n/a 16 2101 2110 2135 N
+ G AH AH i n/a 16 2101 2110 2135 N
+ G AH AH s n/a 16 2101 2110 2135 N
+ G AH AO b n/a 16 2096 2113 2138 N
+ G AH AO e n/a 16 2097 2113 2138 N
+ G AH AO i n/a 16 2097 2113 2140 N
+ G AH AO s n/a 16 2097 2113 2138 N
+ G AH AW b n/a 16 2105 2107 2125 N
+ G AH AW e n/a 16 2105 2107 2125 N
+ G AH AW i n/a 16 2105 2107 2125 N
+ G AH AW s n/a 16 2105 2107 2125 N
+ G AH AY b n/a 16 2096 2114 2139 N
+ G AH AY e n/a 16 2097 2114 2139 N
+ G AH AY i n/a 16 2097 2114 2139 N
+ G AH AY s n/a 16 2097 2114 2139 N
+ G AH B b n/a 16 2104 2119 2128 N
+ G AH B e n/a 16 2101 2119 2128 N
+ G AH B i n/a 16 2101 2119 2128 N
+ G AH B s n/a 16 2101 2119 2128 N
+ G AH CH e n/a 16 2101 2119 2128 N
+ G AH CH s n/a 16 2101 2119 2128 N
+ G AH D b n/a 16 2104 2119 2128 N
+ G AH D e n/a 16 2101 2119 2128 N
+ G AH D i n/a 16 2101 2119 2128 N
+ G AH D s n/a 16 2101 2119 2128 N
+ G AH DH e n/a 16 2101 2120 2128 N
+ G AH DH s n/a 16 2101 2120 2128 N
+ G AH EH b n/a 16 2105 2107 2125 N
+ G AH EH e n/a 16 2105 2107 2125 N
+ G AH EH i n/a 16 2105 2107 2125 N
+ G AH EH s n/a 16 2105 2107 2125 N
+ G AH ER b n/a 16 2096 2116 2136 N
+ G AH ER e n/a 16 2097 2110 2137 N
+ G AH ER i n/a 16 2097 2110 2137 N
+ G AH ER s n/a 16 2097 2110 2137 N
+ G AH EY b n/a 16 2105 2107 2127 N
+ G AH EY e n/a 16 2105 2107 2127 N
+ G AH EY i n/a 16 2105 2107 2127 N
+ G AH EY s n/a 16 2105 2107 2127 N
+ G AH F b n/a 16 2104 2120 2128 N
+ G AH F e n/a 16 2101 2120 2128 N
+ G AH F i n/a 16 2101 2120 2128 N
+ G AH F s n/a 16 2101 2120 2128 N
+ G AH G e n/a 16 2101 2119 2128 N
+ G AH G s n/a 16 2101 2119 2128 N
+ G AH HH e n/a 16 2101 2118 2128 N
+ G AH HH i n/a 16 2101 2118 2128 N
+ G AH HH s n/a 16 2101 2118 2128 N
+ G AH IH b n/a 16 2104 2109 2126 N
+ G AH IH e n/a 16 2101 2107 2126 N
+ G AH IH i n/a 16 2101 2107 2126 N
+ G AH IH s n/a 16 2101 2107 2126 N
+ G AH IY b n/a 16 2105 2109 2126 N
+ G AH IY e n/a 16 2105 2107 2126 N
+ G AH IY i n/a 16 2105 2107 2126 N
+ G AH IY s n/a 16 2105 2107 2126 N
+ G AH JH e n/a 16 2101 2119 2128 N
+ G AH JH s n/a 16 2101 2119 2128 N
+ G AH K b n/a 16 2104 2119 2128 N
+ G AH K e n/a 16 2101 2119 2128 N
+ G AH K s n/a 16 2101 2119 2128 N
+ G AH L b n/a 16 2096 2123 2133 N
+ G AH L e n/a 16 2096 2124 2133 N
+ G AH L i n/a 16 2096 2124 2133 N
+ G AH L s n/a 16 2096 2124 2133 N
+ G AH M b n/a 16 2104 2119 2129 N
+ G AH M e n/a 16 2102 2119 2129 N
+ G AH M i n/a 16 2102 2119 2129 N
+ G AH M s n/a 16 2102 2119 2129 N
+ G AH N b n/a 16 2104 2119 2129 N
+ G AH N e n/a 16 2102 2119 2129 N
+ G AH N i n/a 16 2102 2119 2129 N
+ G AH N s n/a 16 2102 2119 2129 N
+ G AH NG e n/a 16 2102 2119 2129 N
+ G AH NG s n/a 16 2102 2119 2129 N
+ G AH OW b n/a 16 2096 2113 2138 N
+ G AH OW e n/a 16 2097 2114 2138 N
+ G AH OW i n/a 16 2097 2114 2139 N
+ G AH OW s n/a 16 2097 2114 2138 N
+ G AH OY b n/a 16 2096 2113 2138 N
+ G AH OY e n/a 16 2097 2113 2138 N
+ G AH OY i n/a 16 2097 2113 2139 N
+ G AH OY s n/a 16 2097 2113 2138 N
+ G AH P b n/a 16 2104 2119 2128 N
+ G AH P e n/a 16 2101 2119 2128 N
+ G AH P s n/a 16 2101 2119 2128 N
+ G AH R b n/a 16 2096 2123 2132 N
+ G AH R e n/a 16 2096 2124 2132 N
+ G AH R i n/a 16 2096 2124 2132 N
+ G AH R s n/a 16 2096 2124 2132 N
+ G AH S b n/a 16 2104 2120 2131 N
+ G AH S e n/a 16 2101 2120 2131 N
+ G AH S i n/a 16 2101 2120 2131 N
+ G AH S s n/a 16 2101 2120 2131 N
+ G AH SH e n/a 16 2101 2120 2131 N
+ G AH SH i n/a 16 2101 2120 2131 N
+ G AH SH s n/a 16 2101 2120 2131 N
+ G AH SIL e n/a 16 2101 2118 2128 N
+ G AH SIL s n/a 16 2101 2118 2128 N
+ G AH T b n/a 16 2104 2119 2128 N
+ G AH T e n/a 16 2101 2119 2128 N
+ G AH T s n/a 16 2101 2119 2128 N
+ G AH TH e n/a 16 2101 2120 2128 N
+ G AH TH s n/a 16 2101 2120 2128 N
+ G AH UH b n/a 16 2096 2116 2136 N
+ G AH UH e n/a 16 2097 2116 2137 N
+ G AH UH i n/a 16 2097 2116 2137 N
+ G AH UH s n/a 16 2097 2116 2137 N
+ G AH UW b n/a 16 2096 2113 2138 N
+ G AH UW e n/a 16 2097 2114 2138 N
+ G AH UW i n/a 16 2097 2114 2140 N
+ G AH UW s n/a 16 2097 2114 2138 N
+ G AH V e n/a 16 2101 2120 2128 N
+ G AH V s n/a 16 2101 2120 2128 N
+ G AH W b n/a 16 2096 2117 2129 N
+ G AH W e n/a 16 2096 2117 2129 N
+ G AH W i n/a 16 2096 2117 2129 N
+ G AH W s n/a 16 2096 2117 2129 N
+ G AH Y b n/a 16 2105 2119 2130 N
+ G AH Y e n/a 16 2105 2119 2130 N
+ G AH Y i n/a 16 2105 2119 2130 N
+ G AH Y s n/a 16 2105 2119 2130 N
+ G AH Z b n/a 16 2104 2120 2131 N
+ G AH Z e n/a 16 2101 2120 2131 N
+ G AH Z i n/a 16 2101 2120 2131 N
+ G AH Z s n/a 16 2101 2120 2131 N
+ G AH ZH e n/a 16 2101 2120 2131 N
+ G AH ZH i n/a 16 2101 2120 2131 N
+ G AH ZH s n/a 16 2101 2120 2131 N
+ G AO AA b n/a 16 2095 2113 2140 N
+ G AO AA e n/a 16 2095 2113 2140 N
+ G AO AA s n/a 16 2095 2113 2140 N
+ G AO AE b n/a 16 2095 2107 2125 N
+ G AO AE e n/a 16 2095 2107 2125 N
+ G AO AE i n/a 16 2095 2107 2125 N
+ G AO AE s n/a 16 2095 2107 2125 N
+ G AO AH b n/a 16 2095 2114 2139 N
+ G AO AH e n/a 16 2095 2110 2135 N
+ G AO AH i n/a 16 2095 2110 2135 N
+ G AO AH s n/a 16 2095 2110 2135 N
+ G AO AO b n/a 16 2095 2116 2138 N
+ G AO AO e n/a 16 2095 2116 2138 N
+ G AO AO i n/a 16 2095 2116 2140 N
+ G AO AO s n/a 16 2095 2116 2138 N
+ G AO AW b n/a 16 2095 2107 2125 N
+ G AO AW e n/a 16 2095 2107 2125 N
+ G AO AW s n/a 16 2095 2107 2125 N
+ G AO AY b n/a 16 2095 2114 2139 N
+ G AO AY e n/a 16 2095 2114 2139 N
+ G AO AY s n/a 16 2095 2114 2139 N
+ G AO B b n/a 16 2095 2117 2128 N
+ G AO B e n/a 16 2095 2117 2128 N
+ G AO B i n/a 16 2095 2117 2128 N
+ G AO B s n/a 16 2095 2117 2128 N
+ G AO CH e n/a 16 2095 2120 2128 N
+ G AO CH s n/a 16 2095 2120 2128 N
+ G AO D b n/a 16 2095 2117 2128 N
+ G AO D e n/a 16 2095 2117 2128 N
+ G AO D i n/a 16 2095 2117 2128 N
+ G AO D s n/a 16 2095 2117 2128 N
+ G AO DH e n/a 16 2095 2120 2128 N
+ G AO DH s n/a 16 2095 2120 2128 N
+ G AO EH b n/a 16 2095 2107 2125 N
+ G AO EH e n/a 16 2095 2107 2125 N
+ G AO EH s n/a 16 2095 2107 2125 N
+ G AO ER b n/a 16 2095 2116 2136 N
+ G AO ER e n/a 16 2095 2110 2136 N
+ G AO ER i n/a 16 2095 2110 2136 N
+ G AO ER s n/a 16 2095 2110 2136 N
+ G AO EY b n/a 16 2095 2107 2127 N
+ G AO EY e n/a 16 2095 2107 2127 N
+ G AO EY s n/a 16 2095 2107 2127 N
+ G AO F b n/a 16 2095 2120 2128 N
+ G AO F e n/a 16 2095 2120 2128 N
+ G AO F i n/a 16 2095 2120 2128 N
+ G AO F s n/a 16 2095 2120 2128 N
+ G AO G e n/a 16 2095 2117 2128 N
+ G AO G s n/a 16 2095 2117 2128 N
+ G AO HH e n/a 16 2095 2120 2128 N
+ G AO HH i n/a 16 2095 2120 2128 N
+ G AO HH s n/a 16 2095 2120 2128 N
+ G AO IH b n/a 16 2095 2109 2126 N
+ G AO IH e n/a 16 2095 2107 2126 N
+ G AO IH i n/a 16 2095 2107 2126 N
+ G AO IH s n/a 16 2095 2107 2126 N
+ G AO IY b n/a 16 2095 2109 2126 N
+ G AO IY e n/a 16 2095 2107 2126 N
+ G AO IY i n/a 16 2095 2107 2126 N
+ G AO IY s n/a 16 2095 2107 2126 N
+ G AO JH e n/a 16 2095 2117 2128 N
+ G AO JH s n/a 16 2095 2117 2128 N
+ G AO K b n/a 16 2095 2120 2128 N
+ G AO K e n/a 16 2095 2120 2128 N
+ G AO K i n/a 16 2095 2120 2128 N
+ G AO K s n/a 16 2095 2120 2128 N
+ G AO L b n/a 16 2095 2123 2133 N
+ G AO L e n/a 16 2095 2124 2133 N
+ G AO L i n/a 16 2095 2124 2133 N
+ G AO L s n/a 16 2095 2124 2133 N
+ G AO M b n/a 16 2095 2117 2129 N
+ G AO M e n/a 16 2095 2117 2129 N
+ G AO M i n/a 16 2095 2117 2129 N
+ G AO M s n/a 16 2095 2117 2129 N
+ G AO N b n/a 16 2095 2117 2129 N
+ G AO N e n/a 16 2095 2117 2129 N
+ G AO N i n/a 16 2095 2117 2129 N
+ G AO N s n/a 16 2095 2117 2129 N
+ G AO NG e n/a 16 2095 2117 2129 N
+ G AO NG s n/a 16 2095 2117 2129 N
+ G AO OW b n/a 16 2095 2116 2138 N
+ G AO OW e n/a 16 2095 2116 2138 N
+ G AO OW i n/a 16 2095 2116 2140 N
+ G AO OW s n/a 16 2095 2116 2138 N
+ G AO OY b n/a 16 2095 2116 2138 N
+ G AO OY e n/a 16 2095 2116 2138 N
+ G AO OY s n/a 16 2095 2116 2138 N
+ G AO P b n/a 16 2095 2120 2128 N
+ G AO P e n/a 16 2095 2120 2128 N
+ G AO P s n/a 16 2095 2120 2128 N
+ G AO R b n/a 16 2095 2123 2132 N
+ G AO R e n/a 16 2095 2124 2132 N
+ G AO R i n/a 16 2095 2124 2132 N
+ G AO R s n/a 16 2095 2124 2132 N
+ G AO S b n/a 16 2095 2120 2131 N
+ G AO S e n/a 16 2095 2120 2131 N
+ G AO S i n/a 16 2095 2120 2131 N
+ G AO S s n/a 16 2095 2120 2131 N
+ G AO SH e n/a 16 2095 2120 2131 N
+ G AO SH s n/a 16 2095 2120 2131 N
+ G AO SIL e n/a 16 2095 2120 2128 N
+ G AO SIL s n/a 16 2095 2120 2128 N
+ G AO T b n/a 16 2095 2120 2128 N
+ G AO T e n/a 16 2095 2120 2128 N
+ G AO T i n/a 16 2095 2120 2128 N
+ G AO T s n/a 16 2095 2120 2128 N
+ G AO TH e n/a 16 2095 2120 2128 N
+ G AO TH s n/a 16 2095 2120 2128 N
+ G AO UH b n/a 16 2095 2116 2136 N
+ G AO UH e n/a 16 2095 2116 2136 N
+ G AO UH s n/a 16 2095 2116 2136 N
+ G AO UW b n/a 16 2095 2116 2138 N
+ G AO UW e n/a 16 2095 2116 2138 N
+ G AO UW s n/a 16 2095 2116 2138 N
+ G AO V e n/a 16 2095 2120 2128 N
+ G AO V s n/a 16 2095 2120 2128 N
+ G AO W b n/a 16 2095 2117 2129 N
+ G AO W e n/a 16 2095 2117 2129 N
+ G AO W i n/a 16 2095 2117 2129 N
+ G AO W s n/a 16 2095 2117 2129 N
+ G AO Y b n/a 16 2095 2118 2130 N
+ G AO Y e n/a 16 2095 2118 2130 N
+ G AO Y i n/a 16 2095 2118 2130 N
+ G AO Y s n/a 16 2095 2118 2130 N
+ G AO Z b n/a 16 2095 2120 2131 N
+ G AO Z e n/a 16 2095 2120 2131 N
+ G AO Z i n/a 16 2095 2120 2131 N
+ G AO Z s n/a 16 2095 2120 2131 N
+ G AO ZH e n/a 16 2095 2120 2131 N
+ G AO ZH s n/a 16 2095 2120 2131 N
+ G AW AA b n/a 16 2095 2113 2140 N
+ G AW AA e n/a 16 2095 2113 2140 N
+ G AW AA i n/a 16 2095 2113 2140 N
+ G AW AA s n/a 16 2095 2113 2140 N
+ G AW AE b n/a 16 2095 2107 2125 N
+ G AW AE e n/a 16 2095 2107 2125 N
+ G AW AE i n/a 16 2095 2107 2125 N
+ G AW AE s n/a 16 2095 2107 2125 N
+ G AW AH b n/a 16 2095 2114 2139 N
+ G AW AH e n/a 16 2095 2110 2134 N
+ G AW AH i n/a 16 2095 2110 2134 N
+ G AW AH s n/a 16 2095 2110 2134 N
+ G AW AO b n/a 16 2095 2116 2138 N
+ G AW AO e n/a 16 2095 2116 2138 N
+ G AW AO s n/a 16 2095 2116 2138 N
+ G AW AW b n/a 16 2095 2107 2125 N
+ G AW AW e n/a 16 2095 2107 2125 N
+ G AW AW s n/a 16 2095 2107 2125 N
+ G AW AY b n/a 16 2095 2114 2139 N
+ G AW AY e n/a 16 2095 2114 2139 N
+ G AW AY s n/a 16 2095 2114 2139 N
+ G AW B b n/a 16 2095 2117 2128 N
+ G AW B e n/a 16 2095 2117 2128 N
+ G AW B s n/a 16 2095 2117 2128 N
+ G AW CH e n/a 16 2095 2120 2128 N
+ G AW CH s n/a 16 2095 2120 2128 N
+ G AW D b n/a 16 2095 2117 2128 N
+ G AW D e n/a 16 2095 2117 2128 N
+ G AW D s n/a 16 2095 2117 2128 N
+ G AW DH e n/a 16 2095 2120 2128 N
+ G AW DH s n/a 16 2095 2120 2128 N
+ G AW EH b n/a 16 2095 2107 2125 N
+ G AW EH e n/a 16 2095 2107 2125 N
+ G AW EH s n/a 16 2095 2107 2125 N
+ G AW ER b n/a 16 2095 2116 2136 N
+ G AW ER e n/a 16 2095 2110 2136 N
+ G AW ER i n/a 16 2095 2110 2136 N
+ G AW ER s n/a 16 2095 2110 2136 N
+ G AW EY b n/a 16 2095 2107 2127 N
+ G AW EY e n/a 16 2095 2107 2127 N
+ G AW EY s n/a 16 2095 2107 2127 N
+ G AW F b n/a 16 2095 2120 2128 N
+ G AW F e n/a 16 2095 2120 2128 N
+ G AW F s n/a 16 2095 2120 2128 N
+ G AW G e n/a 16 2095 2117 2128 N
+ G AW G s n/a 16 2095 2117 2128 N
+ G AW HH e n/a 16 2095 2120 2128 N
+ G AW HH s n/a 16 2095 2120 2128 N
+ G AW IH b n/a 16 2095 2109 2126 N
+ G AW IH e n/a 16 2095 2107 2126 N
+ G AW IH i n/a 16 2095 2107 2126 N
+ G AW IH s n/a 16 2095 2107 2126 N
+ G AW IY b n/a 16 2095 2109 2126 N
+ G AW IY e n/a 16 2095 2107 2126 N
+ G AW IY s n/a 16 2095 2107 2126 N
+ G AW JH e n/a 16 2095 2117 2128 N
+ G AW JH s n/a 16 2095 2117 2128 N
+ G AW K b n/a 16 2095 2120 2128 N
+ G AW K e n/a 16 2095 2120 2128 N
+ G AW K s n/a 16 2095 2120 2128 N
+ G AW L b n/a 16 2095 2123 2133 N
+ G AW L e n/a 16 2095 2124 2133 N
+ G AW L i n/a 16 2095 2124 2133 N
+ G AW L s n/a 16 2095 2124 2133 N
+ G AW M b n/a 16 2095 2117 2129 N
+ G AW M e n/a 16 2095 2117 2129 N
+ G AW M s n/a 16 2095 2117 2129 N
+ G AW N b n/a 16 2095 2117 2129 N
+ G AW N e n/a 16 2095 2117 2129 N
+ G AW N s n/a 16 2095 2117 2129 N
+ G AW NG e n/a 16 2095 2117 2129 N
+ G AW NG s n/a 16 2095 2117 2129 N
+ G AW OW b n/a 16 2095 2116 2138 N
+ G AW OW e n/a 16 2095 2116 2138 N
+ G AW OW s n/a 16 2095 2116 2138 N
+ G AW OY b n/a 16 2095 2116 2138 N
+ G AW OY e n/a 16 2095 2116 2138 N
+ G AW OY s n/a 16 2095 2116 2138 N
+ G AW P b n/a 16 2095 2120 2128 N
+ G AW P e n/a 16 2095 2120 2128 N
+ G AW P s n/a 16 2095 2120 2128 N
+ G AW R b n/a 16 2095 2123 2132 N
+ G AW R e n/a 16 2095 2124 2132 N
+ G AW R s n/a 16 2095 2124 2132 N
+ G AW S b n/a 16 2095 2120 2131 N
+ G AW S e n/a 16 2095 2120 2131 N
+ G AW S i n/a 16 2095 2120 2131 N
+ G AW S s n/a 16 2095 2120 2131 N
+ G AW SH e n/a 16 2095 2120 2131 N
+ G AW SH s n/a 16 2095 2120 2131 N
+ G AW SIL e n/a 16 2095 2120 2128 N
+ G AW SIL s n/a 16 2095 2120 2128 N
+ G AW T b n/a 16 2095 2120 2128 N
+ G AW T e n/a 16 2095 2120 2128 N
+ G AW T s n/a 16 2095 2120 2128 N
+ G AW TH e n/a 16 2095 2120 2128 N
+ G AW TH s n/a 16 2095 2120 2128 N
+ G AW UH b n/a 16 2095 2116 2136 N
+ G AW UH e n/a 16 2095 2116 2136 N
+ G AW UH s n/a 16 2095 2116 2136 N
+ G AW UW b n/a 16 2095 2116 2138 N
+ G AW UW e n/a 16 2095 2116 2138 N
+ G AW UW i n/a 16 2095 2116 2140 N
+ G AW UW s n/a 16 2095 2116 2138 N
+ G AW V e n/a 16 2095 2120 2128 N
+ G AW V s n/a 16 2095 2120 2128 N
+ G AW W b n/a 16 2095 2117 2129 N
+ G AW W e n/a 16 2095 2117 2129 N
+ G AW W s n/a 16 2095 2117 2129 N
+ G AW Y b n/a 16 2095 2118 2130 N
+ G AW Y e n/a 16 2095 2118 2130 N
+ G AW Y s n/a 16 2095 2118 2130 N
+ G AW Z b n/a 16 2095 2120 2131 N
+ G AW Z e n/a 16 2095 2120 2131 N
+ G AW Z i n/a 16 2095 2120 2131 N
+ G AW Z s n/a 16 2095 2120 2131 N
+ G AW ZH e n/a 16 2095 2120 2131 N
+ G AW ZH s n/a 16 2095 2120 2131 N
+ G AY AA b n/a 16 2100 2114 2139 N
+ G AY AA e n/a 16 2100 2114 2139 N
+ G AY AA i n/a 16 2100 2114 2139 N
+ G AY AA s n/a 16 2100 2114 2139 N
+ G AY AE b n/a 16 2100 2107 2125 N
+ G AY AE e n/a 16 2100 2107 2125 N
+ G AY AE i n/a 16 2100 2107 2125 N
+ G AY AE s n/a 16 2100 2107 2125 N
+ G AY AH b n/a 16 2100 2114 2139 N
+ G AY AH e n/a 16 2100 2111 2135 N
+ G AY AH i n/a 16 2100 2111 2135 N
+ G AY AH s n/a 16 2100 2111 2135 N
+ G AY AO b n/a 16 2100 2114 2138 N
+ G AY AO e n/a 16 2100 2114 2138 N
+ G AY AO i n/a 16 2100 2114 2140 N
+ G AY AO s n/a 16 2100 2114 2138 N
+ G AY AW b n/a 16 2100 2107 2125 N
+ G AY AW e n/a 16 2100 2107 2125 N
+ G AY AW s n/a 16 2100 2107 2125 N
+ G AY AY b n/a 16 2100 2114 2139 N
+ G AY AY e n/a 16 2100 2114 2139 N
+ G AY AY i n/a 16 2100 2114 2139 N
+ G AY AY s n/a 16 2100 2114 2139 N
+ G AY B b n/a 16 2103 2119 2128 N
+ G AY B e n/a 16 2102 2119 2128 N
+ G AY B s n/a 16 2102 2119 2128 N
+ G AY CH e n/a 16 2102 2119 2128 N
+ G AY CH s n/a 16 2102 2119 2128 N
+ G AY D b n/a 16 2103 2119 2128 N
+ G AY D e n/a 16 2102 2119 2128 N
+ G AY D s n/a 16 2102 2119 2128 N
+ G AY DH e n/a 16 2102 2121 2128 N
+ G AY DH s n/a 16 2102 2121 2128 N
+ G AY EH b n/a 16 2100 2107 2125 N
+ G AY EH e n/a 16 2100 2107 2125 N
+ G AY EH i n/a 16 2100 2107 2125 N
+ G AY EH s n/a 16 2100 2107 2125 N
+ G AY ER b n/a 16 2100 2116 2136 N
+ G AY ER e n/a 16 2100 2111 2137 N
+ G AY ER i n/a 16 2100 2111 2137 N
+ G AY ER s n/a 16 2100 2111 2137 N
+ G AY EY b n/a 16 2100 2107 2127 N
+ G AY EY e n/a 16 2100 2107 2127 N
+ G AY EY i n/a 16 2100 2107 2127 N
+ G AY EY s n/a 16 2100 2107 2127 N
+ G AY F b n/a 16 2103 2121 2128 N
+ G AY F e n/a 16 2102 2121 2128 N
+ G AY F s n/a 16 2102 2121 2128 N
+ G AY G e n/a 16 2102 2119 2128 N
+ G AY G s n/a 16 2102 2119 2128 N
+ G AY HH e n/a 16 2102 2118 2128 N
+ G AY HH i n/a 16 2102 2118 2128 N
+ G AY HH s n/a 16 2102 2118 2128 N
+ G AY IH b n/a 16 2100 2109 2126 N
+ G AY IH e n/a 16 2100 2107 2126 N
+ G AY IH i n/a 16 2100 2107 2126 N
+ G AY IH s n/a 16 2100 2107 2126 N
+ G AY IY b n/a 16 2100 2109 2126 N
+ G AY IY e n/a 16 2100 2107 2126 N
+ G AY IY i n/a 16 2100 2107 2126 N
+ G AY IY s n/a 16 2100 2107 2126 N
+ G AY JH e n/a 16 2102 2119 2128 N
+ G AY JH s n/a 16 2102 2119 2128 N
+ G AY K b n/a 16 2103 2119 2128 N
+ G AY K e n/a 16 2102 2119 2128 N
+ G AY K s n/a 16 2102 2119 2128 N
+ G AY L b n/a 16 2102 2124 2133 N
+ G AY L e n/a 16 2102 2124 2133 N
+ G AY L i n/a 16 2102 2124 2133 N
+ G AY L s n/a 16 2102 2124 2133 N
+ G AY M b n/a 16 2103 2119 2129 N
+ G AY M e n/a 16 2102 2119 2129 N
+ G AY M s n/a 16 2102 2119 2129 N
+ G AY N b n/a 16 2103 2119 2129 N
+ G AY N e n/a 16 2102 2119 2129 N
+ G AY N i n/a 16 2102 2119 2129 N
+ G AY N s n/a 16 2102 2119 2129 N
+ G AY NG e n/a 16 2102 2119 2129 N
+ G AY NG s n/a 16 2102 2119 2129 N
+ G AY OW b n/a 16 2100 2114 2138 N
+ G AY OW e n/a 16 2100 2114 2138 N
+ G AY OW i n/a 16 2100 2114 2139 N
+ G AY OW s n/a 16 2100 2114 2138 N
+ G AY OY b n/a 16 2100 2114 2138 N
+ G AY OY e n/a 16 2100 2114 2138 N
+ G AY OY s n/a 16 2100 2114 2138 N
+ G AY P b n/a 16 2103 2119 2128 N
+ G AY P e n/a 16 2102 2119 2128 N
+ G AY P s n/a 16 2102 2119 2128 N
+ G AY R b n/a 16 2102 2124 2132 N
+ G AY R e n/a 16 2102 2124 2132 N
+ G AY R i n/a 16 2102 2124 2132 N
+ G AY R s n/a 16 2102 2124 2132 N
+ G AY S b n/a 16 2103 2121 2131 N
+ G AY S e n/a 16 2102 2121 2131 N
+ G AY S s n/a 16 2102 2121 2131 N
+ G AY SH e n/a 16 2102 2121 2131 N
+ G AY SH s n/a 16 2102 2121 2131 N
+ G AY SIL e n/a 16 2102 2118 2128 N
+ G AY SIL s n/a 16 2102 2118 2128 N
+ G AY T b n/a 16 2103 2119 2128 N
+ G AY T e n/a 16 2102 2119 2128 N
+ G AY T s n/a 16 2102 2119 2128 N
+ G AY TH e n/a 16 2102 2121 2128 N
+ G AY TH s n/a 16 2102 2121 2128 N
+ G AY UH b n/a 16 2100 2116 2136 N
+ G AY UH e n/a 16 2100 2116 2137 N
+ G AY UH i n/a 16 2100 2116 2137 N
+ G AY UH s n/a 16 2100 2116 2137 N
+ G AY UW b n/a 16 2100 2114 2138 N
+ G AY UW e n/a 16 2100 2114 2138 N
+ G AY UW s n/a 16 2100 2114 2138 N
+ G AY V e n/a 16 2102 2121 2128 N
+ G AY V s n/a 16 2102 2121 2128 N
+ G AY W b n/a 16 2102 2117 2129 N
+ G AY W e n/a 16 2102 2117 2129 N
+ G AY W i n/a 16 2102 2117 2129 N
+ G AY W s n/a 16 2102 2117 2129 N
+ G AY Y b n/a 16 2106 2119 2130 N
+ G AY Y e n/a 16 2105 2119 2130 N
+ G AY Y s n/a 16 2105 2119 2130 N
+ G AY Z b n/a 16 2103 2121 2131 N
+ G AY Z e n/a 16 2102 2121 2131 N
+ G AY Z s n/a 16 2102 2121 2131 N
+ G AY ZH e n/a 16 2102 2121 2131 N
+ G AY ZH s n/a 16 2102 2121 2131 N
+ G B AA b n/a 16 2085 2113 2140 N
+ G B AA i n/a 16 2085 2113 2140 N
+ G B AA s n/a 16 2085 2113 2140 N
+ G B AE b n/a 16 2087 2108 2125 N
+ G B AE s n/a 16 2087 2108 2125 N
+ G B AH b n/a 16 2087 2114 2139 N
+ G B AH s n/a 16 2087 2110 2135 N
+ G B AO b n/a 16 2085 2115 2138 N
+ G B AO s n/a 16 2085 2115 2138 N
+ G B AW b n/a 16 2085 2108 2125 N
+ G B AW s n/a 16 2085 2108 2125 N
+ G B AY b n/a 16 2087 2114 2139 N
+ G B AY s n/a 16 2087 2114 2139 N
+ G B B b n/a 16 2087 2117 2128 N
+ G B B s n/a 16 2087 2117 2128 N
+ G B CH s n/a 16 2087 2119 2128 N
+ G B D b n/a 16 2087 2117 2128 N
+ G B D s n/a 16 2087 2117 2128 N
+ G B DH s n/a 16 2087 2120 2128 N
+ G B EH b n/a 16 2087 2108 2125 N
+ G B EH s n/a 16 2087 2108 2125 N
+ G B ER b n/a 16 2085 2116 2136 N
+ G B ER s n/a 16 2085 2110 2136 N
+ G B EY b n/a 16 2087 2108 2127 N
+ G B EY s n/a 16 2087 2108 2127 N
+ G B F b n/a 16 2087 2120 2128 N
+ G B F s n/a 16 2087 2120 2128 N
+ G B G s n/a 16 2087 2117 2128 N
+ G B HH s n/a 16 2087 2118 2128 N
+ G B IH b n/a 16 2087 2109 2126 N
+ G B IH s n/a 16 2087 2109 2126 N
+ G B IY b n/a 16 2087 2109 2126 N
+ G B IY s n/a 16 2087 2109 2126 N
+ G B JH s n/a 16 2087 2117 2128 N
+ G B K b n/a 16 2087 2119 2128 N
+ G B K s n/a 16 2087 2119 2128 N
+ G B L b n/a 16 2084 2122 2133 N
+ G B L i n/a 16 2084 2124 2133 N
+ G B L s n/a 16 2084 2124 2133 N
+ G B M b n/a 16 2087 2117 2129 N
+ G B M s n/a 16 2087 2117 2129 N
+ G B N b n/a 16 2087 2117 2129 N
+ G B N s n/a 16 2087 2117 2129 N
+ G B NG s n/a 16 2087 2117 2129 N
+ G B OW b n/a 16 2085 2115 2138 N
+ G B OW s n/a 16 2085 2115 2138 N
+ G B OY b n/a 16 2087 2115 2138 N
+ G B OY s n/a 16 2087 2115 2138 N
+ G B P b n/a 16 2087 2119 2128 N
+ G B P s n/a 16 2087 2119 2128 N
+ G B R b n/a 16 2084 2122 2132 N
+ G B R i n/a 16 2084 2124 2132 N
+ G B R s n/a 16 2084 2124 2132 N
+ G B S b n/a 16 2087 2120 2131 N
+ G B S s n/a 16 2087 2120 2131 N
+ G B SH s n/a 16 2087 2120 2131 N
+ G B SIL s n/a 16 2087 2118 2128 N
+ G B T b n/a 16 2087 2119 2128 N
+ G B T s n/a 16 2087 2119 2128 N
+ G B TH s n/a 16 2087 2120 2128 N
+ G B UH b n/a 16 2085 2116 2136 N
+ G B UH i n/a 16 2085 2116 2136 N
+ G B UH s n/a 16 2085 2116 2136 N
+ G B UW b n/a 16 2085 2115 2138 N
+ G B UW i n/a 16 2085 2115 2140 N
+ G B UW s n/a 16 2085 2115 2138 N
+ G B V s n/a 16 2087 2120 2128 N
+ G B W b n/a 16 2084 2117 2129 N
+ G B W s n/a 16 2084 2117 2129 N
+ G B Y b n/a 16 2087 2118 2130 N
+ G B Y s n/a 16 2087 2118 2130 N
+ G B Z b n/a 16 2087 2120 2131 N
+ G B Z s n/a 16 2087 2120 2131 N
+ G B ZH s n/a 16 2087 2120 2131 N
+ G CH AA b n/a 16 2085 2113 2140 N
+ G CH AA i n/a 16 2085 2113 2140 N
+ G CH AA s n/a 16 2085 2113 2140 N
+ G CH AE b n/a 16 2087 2108 2125 N
+ G CH AE s n/a 16 2087 2108 2125 N
+ G CH AH b n/a 16 2087 2114 2139 N
+ G CH AH s n/a 16 2087 2110 2135 N
+ G CH AO b n/a 16 2085 2115 2138 N
+ G CH AO s n/a 16 2085 2115 2138 N
+ G CH AW b n/a 16 2085 2108 2125 N
+ G CH AW s n/a 16 2085 2108 2125 N
+ G CH AY b n/a 16 2087 2114 2139 N
+ G CH AY s n/a 16 2087 2114 2139 N
+ G CH B b n/a 16 2087 2117 2128 N
+ G CH B s n/a 16 2087 2117 2128 N
+ G CH CH s n/a 16 2087 2119 2128 N
+ G CH D b n/a 16 2087 2117 2128 N
+ G CH D s n/a 16 2087 2117 2128 N
+ G CH DH s n/a 16 2087 2120 2128 N
+ G CH EH b n/a 16 2087 2108 2125 N
+ G CH EH s n/a 16 2087 2108 2125 N
+ G CH ER b n/a 16 2085 2116 2136 N
+ G CH ER s n/a 16 2085 2110 2136 N
+ G CH EY b n/a 16 2087 2108 2127 N
+ G CH EY s n/a 16 2087 2108 2127 N
+ G CH F b n/a 16 2087 2120 2128 N
+ G CH F s n/a 16 2087 2120 2128 N
+ G CH G s n/a 16 2087 2117 2128 N
+ G CH HH s n/a 16 2087 2118 2128 N
+ G CH IH b n/a 16 2087 2109 2126 N
+ G CH IH s n/a 16 2087 2109 2126 N
+ G CH IY b n/a 16 2087 2109 2126 N
+ G CH IY s n/a 16 2087 2109 2126 N
+ G CH JH s n/a 16 2087 2117 2128 N
+ G CH K b n/a 16 2087 2119 2128 N
+ G CH K s n/a 16 2087 2119 2128 N
+ G CH L b n/a 16 2084 2122 2133 N
+ G CH L s n/a 16 2084 2124 2133 N
+ G CH M b n/a 16 2087 2117 2129 N
+ G CH M s n/a 16 2087 2117 2129 N
+ G CH N b n/a 16 2087 2117 2129 N
+ G CH N s n/a 16 2087 2117 2129 N
+ G CH NG s n/a 16 2087 2117 2129 N
+ G CH OW b n/a 16 2085 2115 2138 N
+ G CH OW i n/a 16 2085 2115 2140 N
+ G CH OW s n/a 16 2085 2115 2138 N
+ G CH OY b n/a 16 2087 2115 2138 N
+ G CH OY s n/a 16 2087 2115 2138 N
+ G CH P b n/a 16 2087 2119 2128 N
+ G CH P s n/a 16 2087 2119 2128 N
+ G CH R b n/a 16 2084 2122 2132 N
+ G CH R s n/a 16 2084 2124 2132 N
+ G CH S b n/a 16 2087 2120 2131 N
+ G CH S s n/a 16 2087 2120 2131 N
+ G CH SH s n/a 16 2087 2120 2131 N
+ G CH SIL s n/a 16 2087 2118 2128 N
+ G CH T b n/a 16 2087 2119 2128 N
+ G CH T s n/a 16 2087 2119 2128 N
+ G CH TH s n/a 16 2087 2120 2128 N
+ G CH UH b n/a 16 2085 2115 2136 N
+ G CH UH s n/a 16 2085 2115 2136 N
+ G CH UW b n/a 16 2085 2115 2138 N
+ G CH UW s n/a 16 2085 2115 2138 N
+ G CH V s n/a 16 2087 2120 2128 N
+ G CH W b n/a 16 2084 2117 2129 N
+ G CH W s n/a 16 2084 2117 2129 N
+ G CH Y b n/a 16 2087 2118 2130 N
+ G CH Y s n/a 16 2087 2118 2130 N
+ G CH Z b n/a 16 2087 2120 2131 N
+ G CH Z s n/a 16 2087 2120 2131 N
+ G CH ZH s n/a 16 2087 2120 2131 N
+ G D AA b n/a 16 2085 2113 2140 N
+ G D AA e n/a 16 2085 2113 2140 N
+ G D AA s n/a 16 2085 2113 2140 N
+ G D AE b n/a 16 2087 2108 2125 N
+ G D AE e n/a 16 2087 2108 2125 N
+ G D AE s n/a 16 2087 2108 2125 N
+ G D AH b n/a 16 2087 2114 2139 N
+ G D AH e n/a 16 2087 2110 2135 N
+ G D AH i n/a 16 2087 2110 2135 N
+ G D AH s n/a 16 2087 2110 2135 N
+ G D AO b n/a 16 2085 2115 2138 N
+ G D AO e n/a 16 2085 2115 2138 N
+ G D AO s n/a 16 2085 2115 2138 N
+ G D AW b n/a 16 2085 2108 2125 N
+ G D AW e n/a 16 2085 2108 2125 N
+ G D AW s n/a 16 2085 2108 2125 N
+ G D AY b n/a 16 2087 2114 2139 N
+ G D AY e n/a 16 2087 2114 2139 N
+ G D AY s n/a 16 2087 2114 2139 N
+ G D B b n/a 16 2087 2117 2128 N
+ G D B e n/a 16 2087 2117 2128 N
+ G D B s n/a 16 2087 2117 2128 N
+ G D CH e n/a 16 2087 2119 2128 N
+ G D CH s n/a 16 2087 2119 2128 N
+ G D D b n/a 16 2087 2117 2128 N
+ G D D e n/a 16 2087 2117 2128 N
+ G D D s n/a 16 2087 2117 2128 N
+ G D DH e n/a 16 2087 2120 2128 N
+ G D DH s n/a 16 2087 2120 2128 N
+ G D EH b n/a 16 2087 2108 2125 N
+ G D EH e n/a 16 2087 2108 2125 N
+ G D EH s n/a 16 2087 2108 2125 N
+ G D ER b n/a 16 2085 2116 2136 N
+ G D ER e n/a 16 2085 2110 2136 N
+ G D ER i n/a 16 2085 2110 2136 N
+ G D ER s n/a 16 2085 2110 2136 N
+ G D EY b n/a 16 2087 2108 2127 N
+ G D EY e n/a 16 2087 2108 2127 N
+ G D EY i n/a 16 2087 2108 2127 N
+ G D EY s n/a 16 2087 2108 2127 N
+ G D F b n/a 16 2087 2120 2128 N
+ G D F e n/a 16 2087 2120 2128 N
+ G D F s n/a 16 2087 2120 2128 N
+ G D G e n/a 16 2087 2117 2128 N
+ G D G s n/a 16 2087 2117 2128 N
+ G D HH e n/a 16 2087 2118 2128 N
+ G D HH s n/a 16 2087 2118 2128 N
+ G D IH b n/a 16 2087 2109 2126 N
+ G D IH e n/a 16 2087 2109 2126 N
+ G D IH i n/a 16 2087 2109 2126 N
+ G D IH s n/a 16 2087 2109 2126 N
+ G D IY b n/a 16 2087 2109 2126 N
+ G D IY e n/a 16 2087 2109 2126 N
+ G D IY s n/a 16 2087 2109 2126 N
+ G D JH e n/a 16 2087 2117 2128 N
+ G D JH s n/a 16 2087 2117 2128 N
+ G D K b n/a 16 2087 2119 2128 N
+ G D K e n/a 16 2087 2119 2128 N
+ G D K s n/a 16 2087 2119 2128 N
+ G D L b n/a 16 2084 2122 2133 N
+ G D L e n/a 16 2084 2124 2133 N
+ G D L i n/a 16 2084 2124 2133 N
+ G D L s n/a 16 2084 2124 2133 N
+ G D M b n/a 16 2087 2117 2129 N
+ G D M e n/a 16 2087 2117 2129 N
+ G D M s n/a 16 2087 2117 2129 N
+ G D N b n/a 16 2087 2117 2129 N
+ G D N e n/a 16 2087 2117 2129 N
+ G D N s n/a 16 2087 2117 2129 N
+ G D NG e n/a 16 2087 2117 2129 N
+ G D NG s n/a 16 2087 2117 2129 N
+ G D OW b n/a 16 2085 2115 2138 N
+ G D OW e n/a 16 2085 2115 2138 N
+ G D OW s n/a 16 2085 2115 2138 N
+ G D OY b n/a 16 2087 2115 2138 N
+ G D OY e n/a 16 2087 2115 2138 N
+ G D OY s n/a 16 2087 2115 2138 N
+ G D P b n/a 16 2087 2119 2128 N
+ G D P e n/a 16 2087 2119 2128 N
+ G D P s n/a 16 2087 2119 2128 N
+ G D R b n/a 16 2084 2122 2132 N
+ G D R e n/a 16 2084 2124 2132 N
+ G D R i n/a 16 2084 2124 2132 N
+ G D R s n/a 16 2084 2124 2132 N
+ G D S b n/a 16 2087 2120 2131 N
+ G D S e n/a 16 2087 2120 2131 N
+ G D S s n/a 16 2087 2120 2131 N
+ G D SH e n/a 16 2087 2120 2131 N
+ G D SH s n/a 16 2087 2120 2131 N
+ G D SIL e n/a 16 2087 2118 2128 N
+ G D SIL s n/a 16 2087 2118 2128 N
+ G D T b n/a 16 2087 2119 2128 N
+ G D T e n/a 16 2087 2119 2128 N
+ G D T s n/a 16 2087 2119 2128 N
+ G D TH e n/a 16 2087 2120 2128 N
+ G D TH s n/a 16 2087 2120 2128 N
+ G D UH b n/a 16 2085 2116 2136 N
+ G D UH e n/a 16 2085 2116 2136 N
+ G D UH i n/a 16 2085 2116 2136 N
+ G D UH s n/a 16 2085 2116 2136 N
+ G D UW b n/a 16 2085 2115 2138 N
+ G D UW e n/a 16 2085 2115 2138 N
+ G D UW s n/a 16 2085 2115 2138 N
+ G D V e n/a 16 2087 2120 2128 N
+ G D V s n/a 16 2087 2120 2128 N
+ G D W b n/a 16 2084 2117 2129 N
+ G D W e n/a 16 2084 2117 2129 N
+ G D W s n/a 16 2084 2117 2129 N
+ G D Y b n/a 16 2087 2118 2130 N
+ G D Y e n/a 16 2087 2118 2130 N
+ G D Y s n/a 16 2087 2118 2130 N
+ G D Z b n/a 16 2087 2120 2131 N
+ G D Z e n/a 16 2087 2120 2131 N
+ G D Z i n/a 16 2087 2120 2131 N
+ G D Z s n/a 16 2087 2120 2131 N
+ G D ZH e n/a 16 2087 2120 2131 N
+ G D ZH s n/a 16 2087 2120 2131 N
+ G DH AA b n/a 16 2085 2113 2140 N
+ G DH AA s n/a 16 2085 2113 2140 N
+ G DH AE b n/a 16 2088 2108 2125 N
+ G DH AE s n/a 16 2088 2108 2125 N
+ G DH AH b n/a 16 2088 2114 2139 N
+ G DH AH s n/a 16 2088 2110 2135 N
+ G DH AO b n/a 16 2085 2116 2138 N
+ G DH AO s n/a 16 2085 2116 2138 N
+ G DH AW b n/a 16 2085 2108 2125 N
+ G DH AW s n/a 16 2085 2108 2125 N
+ G DH AY b n/a 16 2088 2114 2139 N
+ G DH AY s n/a 16 2088 2114 2139 N
+ G DH B b n/a 16 2088 2117 2128 N
+ G DH B s n/a 16 2088 2117 2128 N
+ G DH CH s n/a 16 2088 2119 2128 N
+ G DH D b n/a 16 2088 2117 2128 N
+ G DH D s n/a 16 2088 2117 2128 N
+ G DH DH s n/a 16 2088 2120 2128 N
+ G DH EH b n/a 16 2088 2108 2125 N
+ G DH EH s n/a 16 2088 2108 2125 N
+ G DH ER b n/a 16 2085 2116 2136 N
+ G DH ER s n/a 16 2085 2110 2136 N
+ G DH EY b n/a 16 2088 2108 2127 N
+ G DH EY s n/a 16 2088 2108 2127 N
+ G DH F b n/a 16 2088 2120 2128 N
+ G DH F s n/a 16 2088 2120 2128 N
+ G DH G s n/a 16 2088 2117 2128 N
+ G DH HH s n/a 16 2088 2118 2128 N
+ G DH IH b n/a 16 2088 2109 2126 N
+ G DH IH s n/a 16 2088 2109 2126 N
+ G DH IY b n/a 16 2088 2109 2126 N
+ G DH IY s n/a 16 2088 2109 2126 N
+ G DH JH s n/a 16 2088 2117 2128 N
+ G DH K b n/a 16 2088 2119 2128 N
+ G DH K s n/a 16 2088 2119 2128 N
+ G DH L b n/a 16 2084 2122 2133 N
+ G DH L s n/a 16 2084 2124 2133 N
+ G DH M b n/a 16 2088 2117 2129 N
+ G DH M s n/a 16 2088 2117 2129 N
+ G DH N b n/a 16 2088 2117 2129 N
+ G DH N s n/a 16 2088 2117 2129 N
+ G DH NG s n/a 16 2088 2117 2129 N
+ G DH OW b n/a 16 2085 2116 2138 N
+ G DH OW s n/a 16 2085 2116 2138 N
+ G DH OY b n/a 16 2088 2116 2138 N
+ G DH OY s n/a 16 2088 2116 2138 N
+ G DH P b n/a 16 2088 2119 2128 N
+ G DH P s n/a 16 2088 2119 2128 N
+ G DH R b n/a 16 2084 2122 2132 N
+ G DH R s n/a 16 2084 2124 2132 N
+ G DH S b n/a 16 2088 2120 2131 N
+ G DH S s n/a 16 2088 2120 2131 N
+ G DH SH s n/a 16 2088 2120 2131 N
+ G DH SIL s n/a 16 2088 2118 2128 N
+ G DH T b n/a 16 2088 2119 2128 N
+ G DH T s n/a 16 2088 2119 2128 N
+ G DH TH s n/a 16 2088 2120 2128 N
+ G DH UH b n/a 16 2085 2116 2136 N
+ G DH UH s n/a 16 2085 2116 2136 N
+ G DH UW b n/a 16 2085 2116 2138 N
+ G DH UW s n/a 16 2085 2116 2138 N
+ G DH V s n/a 16 2088 2120 2128 N
+ G DH W b n/a 16 2084 2117 2129 N
+ G DH W s n/a 16 2084 2117 2129 N
+ G DH Y b n/a 16 2088 2118 2130 N
+ G DH Y s n/a 16 2088 2118 2130 N
+ G DH Z b n/a 16 2088 2120 2131 N
+ G DH Z s n/a 16 2088 2120 2131 N
+ G DH ZH s n/a 16 2088 2120 2131 N
+ G EH AA b n/a 16 2102 2113 2140 N
+ G EH AA e n/a 16 2102 2113 2140 N
+ G EH AA i n/a 16 2102 2113 2140 N
+ G EH AA s n/a 16 2102 2113 2140 N
+ G EH AE b n/a 16 2105 2107 2125 N
+ G EH AE e n/a 16 2105 2107 2125 N
+ G EH AE s n/a 16 2105 2107 2125 N
+ G EH AH b n/a 16 2104 2114 2139 N
+ G EH AH e n/a 16 2102 2111 2135 N
+ G EH AH i n/a 16 2102 2111 2135 N
+ G EH AH s n/a 16 2102 2111 2135 N
+ G EH AO b n/a 16 2102 2113 2138 N
+ G EH AO e n/a 16 2102 2113 2138 N
+ G EH AO i n/a 16 2102 2113 2140 N
+ G EH AO s n/a 16 2102 2113 2138 N
+ G EH AW b n/a 16 2105 2107 2125 N
+ G EH AW e n/a 16 2105 2107 2125 N
+ G EH AW s n/a 16 2105 2107 2125 N
+ G EH AY b n/a 16 2102 2114 2139 N
+ G EH AY e n/a 16 2102 2114 2139 N
+ G EH AY i n/a 16 2102 2114 2139 N
+ G EH AY s n/a 16 2102 2114 2139 N
+ G EH B b n/a 16 2098 2119 2128 N
+ G EH B e n/a 16 2098 2119 2128 N
+ G EH B i n/a 16 2098 2119 2128 N
+ G EH B s n/a 16 2098 2119 2128 N
+ G EH CH e n/a 16 2098 2119 2128 N
+ G EH CH s n/a 16 2098 2119 2128 N
+ G EH D b n/a 16 2098 2119 2128 N
+ G EH D e n/a 16 2098 2119 2128 N
+ G EH D i n/a 16 2098 2119 2128 N
+ G EH D s n/a 16 2098 2119 2128 N
+ G EH DH e n/a 16 2098 2121 2128 N
+ G EH DH s n/a 16 2098 2121 2128 N
+ G EH EH b n/a 16 2105 2107 2125 N
+ G EH EH e n/a 16 2105 2107 2125 N
+ G EH EH i n/a 16 2105 2107 2125 N
+ G EH EH s n/a 16 2105 2107 2125 N
+ G EH ER b n/a 16 2102 2116 2136 N
+ G EH ER e n/a 16 2102 2111 2137 N
+ G EH ER i n/a 16 2102 2111 2137 N
+ G EH ER s n/a 16 2102 2111 2137 N
+ G EH EY b n/a 16 2105 2107 2127 N
+ G EH EY e n/a 16 2105 2107 2127 N
+ G EH EY i n/a 16 2105 2107 2127 N
+ G EH EY s n/a 16 2105 2107 2127 N
+ G EH F b n/a 16 2098 2121 2128 N
+ G EH F e n/a 16 2098 2121 2128 N
+ G EH F i n/a 16 2098 2121 2128 N
+ G EH F s n/a 16 2098 2121 2128 N
+ G EH G e n/a 16 2098 2119 2128 N
+ G EH G i n/a 16 2098 2119 2128 N
+ G EH G s n/a 16 2098 2119 2128 N
+ G EH HH e n/a 16 2098 2118 2128 N
+ G EH HH i n/a 16 2098 2118 2128 N
+ G EH HH s n/a 16 2098 2118 2128 N
+ G EH IH b n/a 16 2104 2109 2126 N
+ G EH IH e n/a 16 2102 2107 2126 N
+ G EH IH i n/a 16 2102 2107 2126 N
+ G EH IH s n/a 16 2102 2107 2126 N
+ G EH IY b n/a 16 2105 2109 2126 N
+ G EH IY e n/a 16 2105 2107 2126 N
+ G EH IY i n/a 16 2105 2107 2126 N
+ G EH IY s n/a 16 2105 2107 2126 N
+ G EH JH e n/a 16 2098 2119 2128 N
+ G EH JH s n/a 16 2098 2119 2128 N
+ G EH K b n/a 16 2098 2119 2128 N
+ G EH K e n/a 16 2098 2119 2128 N
+ G EH K i n/a 16 2098 2119 2128 N
+ G EH K s n/a 16 2098 2119 2128 N
+ G EH L b n/a 16 2098 2123 2133 N
+ G EH L e n/a 16 2098 2124 2133 N
+ G EH L i n/a 16 2098 2124 2133 N
+ G EH L s n/a 16 2098 2124 2133 N
+ G EH M b n/a 16 2098 2119 2129 N
+ G EH M e n/a 16 2098 2119 2129 N
+ G EH M i n/a 16 2098 2119 2129 N
+ G EH M s n/a 16 2098 2119 2129 N
+ G EH N b n/a 16 2098 2119 2129 N
+ G EH N e n/a 16 2098 2119 2129 N
+ G EH N i n/a 16 2098 2119 2129 N
+ G EH N s n/a 16 2098 2119 2129 N
+ G EH NG e n/a 16 2098 2119 2129 N
+ G EH NG s n/a 16 2098 2119 2129 N
+ G EH OW b n/a 16 2102 2113 2138 N
+ G EH OW e n/a 16 2102 2114 2138 N
+ G EH OW i n/a 16 2102 2114 2139 N
+ G EH OW s n/a 16 2102 2114 2138 N
+ G EH OY b n/a 16 2102 2113 2138 N
+ G EH OY e n/a 16 2102 2113 2138 N
+ G EH OY s n/a 16 2102 2113 2138 N
+ G EH P b n/a 16 2098 2119 2128 N
+ G EH P e n/a 16 2098 2119 2128 N
+ G EH P i n/a 16 2098 2119 2128 N
+ G EH P s n/a 16 2098 2119 2128 N
+ G EH R b n/a 16 2098 2123 2132 N
+ G EH R e n/a 16 2098 2124 2132 N
+ G EH R i n/a 16 2098 2124 2132 N
+ G EH R s n/a 16 2098 2124 2132 N
+ G EH S b n/a 16 2098 2121 2131 N
+ G EH S e n/a 16 2098 2121 2131 N
+ G EH S i n/a 16 2098 2121 2131 N
+ G EH S s n/a 16 2098 2121 2131 N
+ G EH SH e n/a 16 2098 2121 2131 N
+ G EH SH i n/a 16 2098 2121 2131 N
+ G EH SH s n/a 16 2098 2121 2131 N
+ G EH SIL e n/a 16 2098 2118 2128 N
+ G EH SIL s n/a 16 2098 2118 2128 N
+ G EH T b n/a 16 2098 2119 2128 N
+ G EH T e n/a 16 2098 2119 2128 N
+ G EH T s n/a 16 2098 2119 2128 N
+ G EH TH e n/a 16 2098 2121 2128 N
+ G EH TH s n/a 16 2098 2121 2128 N
+ G EH UH b n/a 16 2102 2116 2136 N
+ G EH UH e n/a 16 2102 2116 2137 N
+ G EH UH i n/a 16 2102 2116 2137 N
+ G EH UH s n/a 16 2102 2116 2137 N
+ G EH UW b n/a 16 2102 2113 2138 N
+ G EH UW e n/a 16 2102 2114 2138 N
+ G EH UW i n/a 16 2102 2114 2140 N
+ G EH UW s n/a 16 2102 2114 2138 N
+ G EH V e n/a 16 2098 2121 2128 N
+ G EH V s n/a 16 2098 2121 2128 N
+ G EH W b n/a 16 2098 2117 2129 N
+ G EH W e n/a 16 2098 2117 2129 N
+ G EH W i n/a 16 2098 2117 2129 N
+ G EH W s n/a 16 2098 2117 2129 N
+ G EH Y b n/a 16 2098 2119 2130 N
+ G EH Y e n/a 16 2098 2119 2130 N
+ G EH Y i n/a 16 2098 2119 2130 N
+ G EH Y s n/a 16 2098 2119 2130 N
+ G EH Z b n/a 16 2098 2121 2131 N
+ G EH Z e n/a 16 2098 2121 2131 N
+ G EH Z i n/a 16 2098 2121 2131 N
+ G EH Z s n/a 16 2098 2121 2131 N
+ G EH ZH e n/a 16 2098 2121 2131 N
+ G EH ZH s n/a 16 2098 2121 2131 N
+ G ER AA b n/a 16 2094 2113 2140 N
+ G ER AA e n/a 16 2094 2113 2140 N
+ G ER AA i n/a 16 2094 2113 2140 N
+ G ER AA s n/a 16 2094 2113 2140 N
+ G ER AE b n/a 16 2093 2107 2125 N
+ G ER AE e n/a 16 2093 2107 2125 N
+ G ER AE i n/a 16 2093 2107 2125 N
+ G ER AE s n/a 16 2093 2107 2125 N
+ G ER AH b n/a 16 2093 2114 2139 N
+ G ER AH e n/a 16 2093 2110 2135 N
+ G ER AH i n/a 16 2093 2110 2135 N
+ G ER AH s n/a 16 2093 2110 2135 N
+ G ER AO b n/a 16 2094 2116 2138 N
+ G ER AO e n/a 16 2094 2116 2138 N
+ G ER AO i n/a 16 2094 2116 2140 N
+ G ER AO s n/a 16 2094 2116 2138 N
+ G ER AW b n/a 16 2093 2107 2125 N
+ G ER AW e n/a 16 2093 2107 2125 N
+ G ER AW i n/a 16 2093 2107 2125 N
+ G ER AW s n/a 16 2093 2107 2125 N
+ G ER AY b n/a 16 2094 2114 2139 N
+ G ER AY e n/a 16 2094 2114 2139 N
+ G ER AY i n/a 16 2094 2114 2139 N
+ G ER AY s n/a 16 2094 2114 2139 N
+ G ER B b n/a 16 2094 2117 2128 N
+ G ER B e n/a 16 2094 2117 2128 N
+ G ER B s n/a 16 2094 2117 2128 N
+ G ER CH e n/a 16 2094 2120 2128 N
+ G ER CH s n/a 16 2094 2120 2128 N
+ G ER D b n/a 16 2094 2117 2128 N
+ G ER D e n/a 16 2094 2117 2128 N
+ G ER D i n/a 16 2094 2117 2128 N
+ G ER D s n/a 16 2094 2117 2128 N
+ G ER DH e n/a 16 2094 2120 2128 N
+ G ER DH s n/a 16 2094 2120 2128 N
+ G ER EH b n/a 16 2093 2107 2125 N
+ G ER EH e n/a 16 2093 2107 2125 N
+ G ER EH i n/a 16 2093 2107 2125 N
+ G ER EH s n/a 16 2093 2107 2125 N
+ G ER ER b n/a 16 2094 2116 2136 N
+ G ER ER e n/a 16 2094 2110 2137 N
+ G ER ER i n/a 16 2094 2110 2137 N
+ G ER ER s n/a 16 2094 2110 2137 N
+ G ER EY b n/a 16 2093 2107 2127 N
+ G ER EY e n/a 16 2093 2107 2127 N
+ G ER EY i n/a 16 2093 2107 2127 N
+ G ER EY s n/a 16 2093 2107 2127 N
+ G ER F b n/a 16 2094 2120 2128 N
+ G ER F e n/a 16 2094 2120 2128 N
+ G ER F i n/a 16 2094 2120 2128 N
+ G ER F s n/a 16 2094 2120 2128 N
+ G ER G e n/a 16 2094 2117 2128 N
+ G ER G s n/a 16 2094 2117 2128 N
+ G ER HH e n/a 16 2094 2120 2128 N
+ G ER HH i n/a 16 2094 2120 2128 N
+ G ER HH s n/a 16 2094 2120 2128 N
+ G ER IH b n/a 16 2093 2109 2126 N
+ G ER IH e n/a 16 2093 2107 2126 N
+ G ER IH i n/a 16 2093 2107 2126 N
+ G ER IH s n/a 16 2093 2107 2126 N
+ G ER IY b n/a 16 2093 2109 2126 N
+ G ER IY e n/a 16 2093 2107 2126 N
+ G ER IY i n/a 16 2093 2107 2126 N
+ G ER IY s n/a 16 2093 2107 2126 N
+ G ER JH e n/a 16 2094 2117 2128 N
+ G ER JH s n/a 16 2094 2117 2128 N
+ G ER K b n/a 16 2094 2120 2128 N
+ G ER K e n/a 16 2094 2120 2128 N
+ G ER K i n/a 16 2094 2120 2128 N
+ G ER K s n/a 16 2094 2120 2128 N
+ G ER L b n/a 16 2094 2123 2133 N
+ G ER L e n/a 16 2094 2124 2133 N
+ G ER L i n/a 16 2094 2124 2133 N
+ G ER L s n/a 16 2094 2124 2133 N
+ G ER M b n/a 16 2094 2117 2129 N
+ G ER M e n/a 16 2094 2117 2129 N
+ G ER M i n/a 16 2094 2117 2129 N
+ G ER M s n/a 16 2094 2117 2129 N
+ G ER N b n/a 16 2094 2117 2129 N
+ G ER N e n/a 16 2094 2117 2129 N
+ G ER N i n/a 16 2094 2117 2129 N
+ G ER N s n/a 16 2094 2117 2129 N
+ G ER NG e n/a 16 2094 2117 2129 N
+ G ER NG s n/a 16 2094 2117 2129 N
+ G ER OW b n/a 16 2094 2116 2138 N
+ G ER OW e n/a 16 2094 2116 2138 N
+ G ER OW i n/a 16 2094 2116 2140 N
+ G ER OW s n/a 16 2094 2116 2138 N
+ G ER OY b n/a 16 2094 2116 2138 N
+ G ER OY e n/a 16 2094 2116 2138 N
+ G ER OY i n/a 16 2094 2116 2140 N
+ G ER OY s n/a 16 2094 2116 2138 N
+ G ER P b n/a 16 2094 2120 2128 N
+ G ER P e n/a 16 2094 2120 2128 N
+ G ER P s n/a 16 2094 2120 2128 N
+ G ER R b n/a 16 2094 2123 2132 N
+ G ER R e n/a 16 2094 2124 2132 N
+ G ER R i n/a 16 2094 2124 2132 N
+ G ER R s n/a 16 2094 2124 2132 N
+ G ER S b n/a 16 2094 2120 2131 N
+ G ER S e n/a 16 2094 2120 2131 N
+ G ER S i n/a 16 2094 2120 2131 N
+ G ER S s n/a 16 2094 2120 2131 N
+ G ER SH e n/a 16 2094 2120 2131 N
+ G ER SH i n/a 16 2094 2120 2131 N
+ G ER SH s n/a 16 2094 2120 2131 N
+ G ER SIL e n/a 16 2094 2120 2128 N
+ G ER SIL s n/a 16 2094 2120 2128 N
+ G ER T b n/a 16 2094 2120 2128 N
+ G ER T e n/a 16 2094 2120 2128 N
+ G ER T i n/a 16 2094 2120 2128 N
+ G ER T s n/a 16 2094 2120 2128 N
+ G ER TH e n/a 16 2094 2120 2128 N
+ G ER TH i n/a 16 2094 2120 2128 N
+ G ER TH s n/a 16 2094 2120 2128 N
+ G ER UH b n/a 16 2094 2116 2136 N
+ G ER UH e n/a 16 2094 2116 2137 N
+ G ER UH i n/a 16 2094 2116 2137 N
+ G ER UH s n/a 16 2094 2116 2137 N
+ G ER UW b n/a 16 2094 2116 2138 N
+ G ER UW e n/a 16 2094 2116 2138 N
+ G ER UW i n/a 16 2094 2116 2140 N
+ G ER UW s n/a 16 2094 2116 2138 N
+ G ER V e n/a 16 2094 2120 2128 N
+ G ER V s n/a 16 2094 2120 2128 N
+ G ER W b n/a 16 2094 2117 2129 N
+ G ER W e n/a 16 2094 2117 2129 N
+ G ER W i n/a 16 2094 2117 2129 N
+ G ER W s n/a 16 2094 2117 2129 N
+ G ER Y b n/a 16 2093 2118 2130 N
+ G ER Y e n/a 16 2093 2118 2130 N
+ G ER Y s n/a 16 2093 2118 2130 N
+ G ER Z b n/a 16 2094 2120 2131 N
+ G ER Z e n/a 16 2094 2120 2131 N
+ G ER Z i n/a 16 2094 2120 2131 N
+ G ER Z s n/a 16 2094 2120 2131 N
+ G ER ZH e n/a 16 2094 2120 2131 N
+ G ER ZH s n/a 16 2094 2120 2131 N
+ G EY AA b n/a 16 2103 2114 2139 N
+ G EY AA e n/a 16 2103 2114 2139 N
+ G EY AA i n/a 16 2103 2114 2139 N
+ G EY AA s n/a 16 2103 2114 2139 N
+ G EY AE b n/a 16 2106 2107 2125 N
+ G EY AE e n/a 16 2106 2107 2125 N
+ G EY AE s n/a 16 2106 2107 2125 N
+ G EY AH b n/a 16 2106 2114 2139 N
+ G EY AH e n/a 16 2105 2111 2135 N
+ G EY AH i n/a 16 2105 2111 2135 N
+ G EY AH s n/a 16 2105 2111 2135 N
+ G EY AO b n/a 16 2103 2114 2138 N
+ G EY AO e n/a 16 2103 2114 2138 N
+ G EY AO i n/a 16 2103 2114 2140 N
+ G EY AO s n/a 16 2103 2114 2138 N
+ G EY AW b n/a 16 2106 2107 2125 N
+ G EY AW e n/a 16 2106 2107 2125 N
+ G EY AW s n/a 16 2106 2107 2125 N
+ G EY AY b n/a 16 2103 2114 2139 N
+ G EY AY e n/a 16 2103 2114 2139 N
+ G EY AY s n/a 16 2103 2114 2139 N
+ G EY B b n/a 16 2103 2119 2128 N
+ G EY B e n/a 16 2103 2119 2128 N
+ G EY B i n/a 16 2103 2119 2128 N
+ G EY B s n/a 16 2103 2119 2128 N
+ G EY CH e n/a 16 2103 2119 2128 N
+ G EY CH s n/a 16 2103 2119 2128 N
+ G EY D b n/a 16 2103 2119 2128 N
+ G EY D e n/a 16 2103 2119 2128 N
+ G EY D i n/a 16 2103 2119 2128 N
+ G EY D s n/a 16 2103 2119 2128 N
+ G EY DH e n/a 16 2103 2121 2128 N
+ G EY DH s n/a 16 2103 2121 2128 N
+ G EY EH b n/a 16 2106 2107 2125 N
+ G EY EH e n/a 16 2105 2107 2125 N
+ G EY EH i n/a 16 2105 2107 2125 N
+ G EY EH s n/a 16 2105 2107 2125 N
+ G EY ER b n/a 16 2103 2116 2136 N
+ G EY ER e n/a 16 2103 2111 2137 N
+ G EY ER i n/a 16 2103 2111 2137 N
+ G EY ER s n/a 16 2103 2111 2137 N
+ G EY EY b n/a 16 2106 2107 2127 N
+ G EY EY e n/a 16 2106 2107 2127 N
+ G EY EY i n/a 16 2106 2107 2127 N
+ G EY EY s n/a 16 2106 2107 2127 N
+ G EY F b n/a 16 2103 2121 2128 N
+ G EY F e n/a 16 2103 2121 2128 N
+ G EY F s n/a 16 2103 2121 2128 N
+ G EY G e n/a 16 2103 2119 2128 N
+ G EY G s n/a 16 2103 2119 2128 N
+ G EY HH e n/a 16 2103 2118 2128 N
+ G EY HH i n/a 16 2103 2118 2128 N
+ G EY HH s n/a 16 2103 2118 2128 N
+ G EY IH b n/a 16 2106 2109 2126 N
+ G EY IH e n/a 16 2105 2107 2126 N
+ G EY IH i n/a 16 2105 2107 2126 N
+ G EY IH s n/a 16 2105 2107 2126 N
+ G EY IY b n/a 16 2106 2109 2126 N
+ G EY IY e n/a 16 2106 2107 2126 N
+ G EY IY i n/a 16 2106 2107 2126 N
+ G EY IY s n/a 16 2106 2107 2126 N
+ G EY JH e n/a 16 2103 2119 2128 N
+ G EY JH s n/a 16 2103 2119 2128 N
+ G EY K b n/a 16 2103 2119 2128 N
+ G EY K e n/a 16 2103 2119 2128 N
+ G EY K s n/a 16 2103 2119 2128 N
+ G EY L b n/a 16 2103 2124 2133 N
+ G EY L e n/a 16 2103 2124 2133 N
+ G EY L i n/a 16 2103 2124 2133 N
+ G EY L s n/a 16 2103 2124 2133 N
+ G EY M b n/a 16 2103 2119 2129 N
+ G EY M e n/a 16 2103 2119 2129 N
+ G EY M i n/a 16 2103 2119 2129 N
+ G EY M s n/a 16 2103 2119 2129 N
+ G EY N b n/a 16 2103 2119 2129 N
+ G EY N e n/a 16 2103 2119 2129 N
+ G EY N i n/a 16 2103 2119 2129 N
+ G EY N s n/a 16 2103 2119 2129 N
+ G EY NG e n/a 16 2103 2119 2129 N
+ G EY NG s n/a 16 2103 2119 2129 N
+ G EY OW b n/a 16 2103 2114 2138 N
+ G EY OW e n/a 16 2103 2114 2138 N
+ G EY OW i n/a 16 2103 2114 2139 N
+ G EY OW s n/a 16 2103 2114 2138 N
+ G EY OY b n/a 16 2103 2114 2138 N
+ G EY OY e n/a 16 2103 2114 2138 N
+ G EY OY s n/a 16 2103 2114 2138 N
+ G EY P b n/a 16 2103 2119 2128 N
+ G EY P e n/a 16 2103 2119 2128 N
+ G EY P s n/a 16 2103 2119 2128 N
+ G EY R b n/a 16 2103 2124 2132 N
+ G EY R e n/a 16 2103 2124 2132 N
+ G EY R i n/a 16 2103 2124 2132 N
+ G EY R s n/a 16 2103 2124 2132 N
+ G EY S b n/a 16 2103 2121 2131 N
+ G EY S e n/a 16 2103 2121 2131 N
+ G EY S s n/a 16 2103 2121 2131 N
+ G EY SH e n/a 16 2103 2121 2131 N
+ G EY SH s n/a 16 2103 2121 2131 N
+ G EY SIL e n/a 16 2103 2118 2128 N
+ G EY SIL s n/a 16 2103 2118 2128 N
+ G EY T b n/a 16 2103 2119 2128 N
+ G EY T e n/a 16 2103 2119 2128 N
+ G EY T s n/a 16 2103 2119 2128 N
+ G EY TH e n/a 16 2103 2121 2128 N
+ G EY TH s n/a 16 2103 2121 2128 N
+ G EY UH b n/a 16 2103 2116 2136 N
+ G EY UH e n/a 16 2103 2116 2137 N
+ G EY UH i n/a 16 2103 2116 2137 N
+ G EY UH s n/a 16 2103 2116 2137 N
+ G EY UW b n/a 16 2103 2114 2138 N
+ G EY UW e n/a 16 2103 2114 2138 N
+ G EY UW i n/a 16 2103 2114 2140 N
+ G EY UW s n/a 16 2103 2114 2138 N
+ G EY V e n/a 16 2103 2121 2128 N
+ G EY V s n/a 16 2103 2121 2128 N
+ G EY W b n/a 16 2103 2117 2129 N
+ G EY W e n/a 16 2103 2117 2129 N
+ G EY W i n/a 16 2103 2117 2129 N
+ G EY W s n/a 16 2103 2117 2129 N
+ G EY Y b n/a 16 2106 2119 2130 N
+ G EY Y e n/a 16 2105 2119 2130 N
+ G EY Y i n/a 16 2105 2119 2130 N
+ G EY Y s n/a 16 2105 2119 2130 N
+ G EY Z b n/a 16 2103 2121 2131 N
+ G EY Z e n/a 16 2103 2121 2131 N
+ G EY Z i n/a 16 2103 2121 2131 N
+ G EY Z s n/a 16 2103 2121 2131 N
+ G EY ZH e n/a 16 2103 2121 2131 N
+ G EY ZH s n/a 16 2103 2121 2131 N
+ G F AA b n/a 16 2085 2113 2140 N
+ G F AA e n/a 16 2085 2113 2140 N
+ G F AA i n/a 16 2085 2113 2140 N
+ G F AA s n/a 16 2085 2113 2140 N
+ G F AE b n/a 16 2088 2108 2125 N
+ G F AE e n/a 16 2088 2108 2125 N
+ G F AE i n/a 16 2088 2108 2125 N
+ G F AE s n/a 16 2088 2108 2125 N
+ G F AH b n/a 16 2088 2114 2139 N
+ G F AH e n/a 16 2088 2110 2135 N
+ G F AH i n/a 16 2088 2110 2135 N
+ G F AH s n/a 16 2088 2110 2135 N
+ G F AO b n/a 16 2085 2116 2138 N
+ G F AO e n/a 16 2085 2116 2138 N
+ G F AO s n/a 16 2085 2116 2138 N
+ G F AW b n/a 16 2085 2108 2125 N
+ G F AW e n/a 16 2085 2108 2125 N
+ G F AW s n/a 16 2085 2108 2125 N
+ G F AY b n/a 16 2088 2114 2139 N
+ G F AY e n/a 16 2088 2114 2139 N
+ G F AY s n/a 16 2088 2114 2139 N
+ G F B b n/a 16 2088 2117 2128 N
+ G F B e n/a 16 2088 2117 2128 N
+ G F B s n/a 16 2088 2117 2128 N
+ G F CH e n/a 16 2088 2119 2128 N
+ G F CH s n/a 16 2088 2119 2128 N
+ G F D b n/a 16 2088 2117 2128 N
+ G F D e n/a 16 2088 2117 2128 N
+ G F D s n/a 16 2088 2117 2128 N
+ G F DH e n/a 16 2088 2120 2128 N
+ G F DH s n/a 16 2088 2120 2128 N
+ G F EH b n/a 16 2088 2108 2125 N
+ G F EH e n/a 16 2088 2108 2125 N
+ G F EH s n/a 16 2088 2108 2125 N
+ G F ER b n/a 16 2085 2116 2136 N
+ G F ER e n/a 16 2085 2110 2136 N
+ G F ER i n/a 16 2085 2110 2136 N
+ G F ER s n/a 16 2085 2110 2136 N
+ G F EY b n/a 16 2088 2108 2127 N
+ G F EY e n/a 16 2088 2108 2127 N
+ G F EY s n/a 16 2088 2108 2127 N
+ G F F b n/a 16 2088 2120 2128 N
+ G F F e n/a 16 2088 2120 2128 N
+ G F F s n/a 16 2088 2120 2128 N
+ G F G e n/a 16 2088 2117 2128 N
+ G F G s n/a 16 2088 2117 2128 N
+ G F HH e n/a 16 2088 2118 2128 N
+ G F HH s n/a 16 2088 2118 2128 N
+ G F IH b n/a 16 2088 2109 2126 N
+ G F IH e n/a 16 2088 2109 2126 N
+ G F IH i n/a 16 2088 2109 2126 N
+ G F IH s n/a 16 2088 2109 2126 N
+ G F IY b n/a 16 2088 2109 2126 N
+ G F IY e n/a 16 2088 2109 2126 N
+ G F IY s n/a 16 2088 2109 2126 N
+ G F JH e n/a 16 2088 2117 2128 N
+ G F JH s n/a 16 2088 2117 2128 N
+ G F K b n/a 16 2088 2119 2128 N
+ G F K e n/a 16 2088 2119 2128 N
+ G F K s n/a 16 2088 2119 2128 N
+ G F L b n/a 16 2084 2122 2133 N
+ G F L e n/a 16 2084 2124 2133 N
+ G F L s n/a 16 2084 2124 2133 N
+ G F M b n/a 16 2088 2117 2129 N
+ G F M e n/a 16 2088 2117 2129 N
+ G F M s n/a 16 2088 2117 2129 N
+ G F N b n/a 16 2088 2117 2129 N
+ G F N e n/a 16 2088 2117 2129 N
+ G F N s n/a 16 2088 2117 2129 N
+ G F NG e n/a 16 2088 2117 2129 N
+ G F NG s n/a 16 2088 2117 2129 N
+ G F OW b n/a 16 2085 2116 2138 N
+ G F OW e n/a 16 2085 2116 2138 N
+ G F OW s n/a 16 2085 2116 2138 N
+ G F OY b n/a 16 2088 2116 2138 N
+ G F OY e n/a 16 2088 2116 2138 N
+ G F OY s n/a 16 2088 2116 2138 N
+ G F P b n/a 16 2088 2119 2128 N
+ G F P e n/a 16 2088 2119 2128 N
+ G F P s n/a 16 2088 2119 2128 N
+ G F R b n/a 16 2084 2122 2132 N
+ G F R e n/a 16 2084 2124 2132 N
+ G F R i n/a 16 2084 2124 2132 N
+ G F R s n/a 16 2084 2124 2132 N
+ G F S b n/a 16 2088 2120 2131 N
+ G F S e n/a 16 2088 2120 2131 N
+ G F S s n/a 16 2088 2120 2131 N
+ G F SH e n/a 16 2088 2120 2131 N
+ G F SH s n/a 16 2088 2120 2131 N
+ G F SIL e n/a 16 2088 2118 2128 N
+ G F SIL s n/a 16 2088 2118 2128 N
+ G F T b n/a 16 2088 2119 2128 N
+ G F T e n/a 16 2088 2119 2128 N
+ G F T s n/a 16 2088 2119 2128 N
+ G F TH e n/a 16 2088 2120 2128 N
+ G F TH s n/a 16 2088 2120 2128 N
+ G F UH b n/a 16 2085 2115 2136 N
+ G F UH e n/a 16 2085 2115 2136 N
+ G F UH s n/a 16 2085 2115 2136 N
+ G F UW b n/a 16 2085 2116 2138 N
+ G F UW e n/a 16 2085 2116 2138 N
+ G F UW s n/a 16 2085 2116 2138 N
+ G F V e n/a 16 2088 2120 2128 N
+ G F V s n/a 16 2088 2120 2128 N
+ G F W b n/a 16 2084 2117 2129 N
+ G F W e n/a 16 2084 2117 2129 N
+ G F W s n/a 16 2084 2117 2129 N
+ G F Y b n/a 16 2088 2118 2130 N
+ G F Y e n/a 16 2088 2118 2130 N
+ G F Y s n/a 16 2088 2118 2130 N
+ G F Z b n/a 16 2088 2120 2131 N
+ G F Z e n/a 16 2088 2120 2131 N
+ G F Z s n/a 16 2088 2120 2131 N
+ G F ZH e n/a 16 2088 2120 2131 N
+ G F ZH s n/a 16 2088 2120 2131 N
+ G G AA b n/a 16 2085 2113 2140 N
+ G G AA e n/a 16 2085 2110 2140 N
+ G G AA s n/a 16 2085 2110 2140 N
+ G G AE b n/a 16 2087 2108 2125 N
+ G G AE e n/a 16 2087 2108 2125 N
+ G G AE s n/a 16 2087 2108 2125 N
+ G G AH b n/a 16 2087 2114 2139 N
+ G G AH e n/a 16 2087 2110 2134 N
+ G G AH s n/a 16 2087 2110 2134 N
+ G G AO b n/a 16 2085 2115 2138 N
+ G G AO e n/a 16 2085 2110 2138 N
+ G G AO s n/a 16 2085 2110 2138 N
+ G G AW b n/a 16 2085 2108 2125 N
+ G G AW e n/a 16 2085 2108 2125 N
+ G G AW s n/a 16 2085 2108 2125 N
+ G G AY b n/a 16 2087 2114 2139 N
+ G G AY e n/a 16 2087 2110 2139 N
+ G G AY s n/a 16 2087 2110 2139 N
+ G G B b n/a 16 2087 2117 2128 N
+ G G B e n/a 16 2087 2117 2128 N
+ G G B s n/a 16 2087 2117 2128 N
+ G G CH e n/a 16 2087 2119 2128 N
+ G G CH s n/a 16 2087 2119 2128 N
+ G G D b n/a 16 2087 2117 2128 N
+ G G D e n/a 16 2087 2117 2128 N
+ G G D s n/a 16 2087 2117 2128 N
+ G G DH e n/a 16 2087 2120 2128 N
+ G G DH s n/a 16 2087 2120 2128 N
+ G G EH b n/a 16 2087 2108 2125 N
+ G G EH e n/a 16 2087 2108 2125 N
+ G G EH s n/a 16 2087 2108 2125 N
+ G G ER b n/a 16 2085 2116 2136 N
+ G G ER e n/a 16 2085 2110 2136 N
+ G G ER i n/a 16 2085 2110 2136 N
+ G G ER s n/a 16 2085 2110 2136 N
+ G G EY b n/a 16 2087 2108 2127 N
+ G G EY e n/a 16 2087 2108 2127 N
+ G G EY s n/a 16 2087 2108 2127 N
+ G G F b n/a 16 2087 2120 2128 N
+ G G F e n/a 16 2087 2120 2128 N
+ G G F s n/a 16 2087 2120 2128 N
+ G G G e n/a 16 2087 2117 2128 N
+ G G G s n/a 16 2087 2117 2128 N
+ G G HH e n/a 16 2087 2118 2128 N
+ G G HH s n/a 16 2087 2118 2128 N
+ G G IH b n/a 16 2087 2109 2126 N
+ G G IH e n/a 16 2087 2109 2126 N
+ G G IH s n/a 16 2087 2109 2126 N
+ G G IY b n/a 16 2087 2109 2126 N
+ G G IY e n/a 16 2087 2109 2126 N
+ G G IY s n/a 16 2087 2109 2126 N
+ G G JH e n/a 16 2087 2117 2128 N
+ G G JH s n/a 16 2087 2117 2128 N
+ G G K b n/a 16 2087 2119 2128 N
+ G G K e n/a 16 2087 2119 2128 N
+ G G K s n/a 16 2087 2119 2128 N
+ G G L b n/a 16 2084 2122 2133 N
+ G G L e n/a 16 2084 2124 2133 N
+ G G L s n/a 16 2084 2124 2133 N
+ G G M b n/a 16 2087 2117 2129 N
+ G G M e n/a 16 2087 2117 2129 N
+ G G M s n/a 16 2087 2117 2129 N
+ G G N b n/a 16 2087 2117 2129 N
+ G G N e n/a 16 2087 2117 2129 N
+ G G N s n/a 16 2087 2117 2129 N
+ G G NG e n/a 16 2087 2117 2129 N
+ G G NG s n/a 16 2087 2117 2129 N
+ G G OW b n/a 16 2085 2115 2138 N
+ G G OW e n/a 16 2085 2110 2138 N
+ G G OW s n/a 16 2085 2110 2138 N
+ G G OY b n/a 16 2087 2115 2138 N
+ G G OY e n/a 16 2087 2110 2138 N
+ G G OY s n/a 16 2087 2110 2138 N
+ G G P b n/a 16 2087 2119 2128 N
+ G G P e n/a 16 2087 2119 2128 N
+ G G P s n/a 16 2087 2119 2128 N
+ G G R b n/a 16 2084 2122 2132 N
+ G G R e n/a 16 2084 2124 2132 N
+ G G R s n/a 16 2084 2124 2132 N
+ G G S b n/a 16 2087 2120 2131 N
+ G G S e n/a 16 2087 2120 2131 N
+ G G S s n/a 16 2087 2120 2131 N
+ G G SH e n/a 16 2087 2120 2131 N
+ G G SH s n/a 16 2087 2120 2131 N
+ G G SIL e n/a 16 2087 2118 2128 N
+ G G SIL s n/a 16 2087 2118 2128 N
+ G G T b n/a 16 2087 2119 2128 N
+ G G T e n/a 16 2087 2119 2128 N
+ G G T s n/a 16 2087 2119 2128 N
+ G G TH e n/a 16 2087 2120 2128 N
+ G G TH s n/a 16 2087 2120 2128 N
+ G G UH b n/a 16 2085 2116 2136 N
+ G G UH e n/a 16 2085 2110 2136 N
+ G G UH s n/a 16 2085 2110 2136 N
+ G G UW b n/a 16 2085 2115 2138 N
+ G G UW e n/a 16 2085 2110 2138 N
+ G G UW s n/a 16 2085 2110 2138 N
+ G G V e n/a 16 2087 2120 2128 N
+ G G V s n/a 16 2087 2120 2128 N
+ G G W b n/a 16 2084 2117 2129 N
+ G G W e n/a 16 2084 2117 2129 N
+ G G W s n/a 16 2084 2117 2129 N
+ G G Y b n/a 16 2087 2118 2130 N
+ G G Y e n/a 16 2087 2118 2130 N
+ G G Y s n/a 16 2087 2118 2130 N
+ G G Z b n/a 16 2087 2120 2131 N
+ G G Z e n/a 16 2087 2120 2131 N
+ G G Z s n/a 16 2087 2120 2131 N
+ G G ZH e n/a 16 2087 2120 2131 N
+ G G ZH s n/a 16 2087 2120 2131 N
+ G HH AA b n/a 16 2085 2113 2140 N
+ G HH AA e n/a 16 2085 2113 2140 N
+ G HH AA s n/a 16 2085 2113 2140 N
+ G HH AE b n/a 16 2087 2108 2125 N
+ G HH AE e n/a 16 2087 2108 2125 N
+ G HH AE s n/a 16 2087 2108 2125 N
+ G HH AH b n/a 16 2087 2114 2139 N
+ G HH AH e n/a 16 2087 2110 2135 N
+ G HH AH s n/a 16 2087 2110 2135 N
+ G HH AO b n/a 16 2085 2115 2138 N
+ G HH AO e n/a 16 2085 2115 2138 N
+ G HH AO s n/a 16 2085 2115 2138 N
+ G HH AW b n/a 16 2085 2108 2125 N
+ G HH AW e n/a 16 2085 2108 2125 N
+ G HH AW s n/a 16 2085 2108 2125 N
+ G HH AY b n/a 16 2087 2114 2139 N
+ G HH AY e n/a 16 2087 2114 2139 N
+ G HH AY s n/a 16 2087 2114 2139 N
+ G HH B b n/a 16 2087 2117 2128 N
+ G HH B e n/a 16 2087 2117 2128 N
+ G HH B s n/a 16 2087 2117 2128 N
+ G HH CH e n/a 16 2087 2119 2128 N
+ G HH CH s n/a 16 2087 2119 2128 N
+ G HH D b n/a 16 2087 2117 2128 N
+ G HH D e n/a 16 2087 2117 2128 N
+ G HH D s n/a 16 2087 2117 2128 N
+ G HH DH e n/a 16 2087 2120 2128 N
+ G HH DH s n/a 16 2087 2120 2128 N
+ G HH EH b n/a 16 2087 2108 2125 N
+ G HH EH e n/a 16 2087 2108 2125 N
+ G HH EH s n/a 16 2087 2108 2125 N
+ G HH ER b n/a 16 2085 2116 2136 N
+ G HH ER e n/a 16 2085 2110 2136 N
+ G HH ER s n/a 16 2085 2110 2136 N
+ G HH EY b n/a 16 2087 2108 2127 N
+ G HH EY e n/a 16 2087 2108 2127 N
+ G HH EY s n/a 16 2087 2108 2127 N
+ G HH F b n/a 16 2087 2120 2128 N
+ G HH F e n/a 16 2087 2120 2128 N
+ G HH F s n/a 16 2087 2120 2128 N
+ G HH G e n/a 16 2087 2117 2128 N
+ G HH G s n/a 16 2087 2117 2128 N
+ G HH HH e n/a 16 2087 2118 2128 N
+ G HH HH s n/a 16 2087 2118 2128 N
+ G HH IH b n/a 16 2087 2109 2126 N
+ G HH IH e n/a 16 2087 2109 2126 N
+ G HH IH s n/a 16 2087 2109 2126 N
+ G HH IY b n/a 16 2087 2109 2126 N
+ G HH IY e n/a 16 2087 2109 2126 N
+ G HH IY s n/a 16 2087 2109 2126 N
+ G HH JH e n/a 16 2087 2117 2128 N
+ G HH JH s n/a 16 2087 2117 2128 N
+ G HH K b n/a 16 2087 2119 2128 N
+ G HH K e n/a 16 2087 2119 2128 N
+ G HH K s n/a 16 2087 2119 2128 N
+ G HH L b n/a 16 2084 2122 2133 N
+ G HH L e n/a 16 2084 2124 2133 N
+ G HH L s n/a 16 2084 2124 2133 N
+ G HH M b n/a 16 2087 2117 2129 N
+ G HH M e n/a 16 2087 2117 2129 N
+ G HH M s n/a 16 2087 2117 2129 N
+ G HH N b n/a 16 2087 2117 2129 N
+ G HH N e n/a 16 2087 2117 2129 N
+ G HH N s n/a 16 2087 2117 2129 N
+ G HH NG e n/a 16 2087 2117 2129 N
+ G HH NG s n/a 16 2087 2117 2129 N
+ G HH OW b n/a 16 2085 2115 2138 N
+ G HH OW e n/a 16 2085 2115 2138 N
+ G HH OW s n/a 16 2085 2115 2138 N
+ G HH OY b n/a 16 2087 2115 2138 N
+ G HH OY e n/a 16 2087 2115 2138 N
+ G HH OY s n/a 16 2087 2115 2138 N
+ G HH P b n/a 16 2087 2119 2128 N
+ G HH P e n/a 16 2087 2119 2128 N
+ G HH P s n/a 16 2087 2119 2128 N
+ G HH R b n/a 16 2084 2122 2132 N
+ G HH R e n/a 16 2084 2124 2132 N
+ G HH R s n/a 16 2084 2124 2132 N
+ G HH S b n/a 16 2087 2120 2131 N
+ G HH S e n/a 16 2087 2120 2131 N
+ G HH S s n/a 16 2087 2120 2131 N
+ G HH SH e n/a 16 2087 2120 2131 N
+ G HH SH s n/a 16 2087 2120 2131 N
+ G HH SIL e n/a 16 2087 2118 2128 N
+ G HH SIL s n/a 16 2087 2118 2128 N
+ G HH T b n/a 16 2087 2119 2128 N
+ G HH T e n/a 16 2087 2119 2128 N
+ G HH T s n/a 16 2087 2119 2128 N
+ G HH TH e n/a 16 2087 2120 2128 N
+ G HH TH s n/a 16 2087 2120 2128 N
+ G HH UH b n/a 16 2085 2115 2136 N
+ G HH UH e n/a 16 2085 2115 2136 N
+ G HH UH s n/a 16 2085 2115 2136 N
+ G HH UW b n/a 16 2085 2115 2138 N
+ G HH UW e n/a 16 2085 2115 2138 N
+ G HH UW s n/a 16 2085 2115 2138 N
+ G HH V e n/a 16 2087 2120 2128 N
+ G HH V s n/a 16 2087 2120 2128 N
+ G HH W b n/a 16 2084 2117 2129 N
+ G HH W e n/a 16 2084 2117 2129 N
+ G HH W s n/a 16 2084 2117 2129 N
+ G HH Y b n/a 16 2087 2118 2130 N
+ G HH Y e n/a 16 2087 2118 2130 N
+ G HH Y s n/a 16 2087 2118 2130 N
+ G HH Z b n/a 16 2087 2120 2131 N
+ G HH Z e n/a 16 2087 2120 2131 N
+ G HH Z s n/a 16 2087 2120 2131 N
+ G HH ZH e n/a 16 2087 2120 2131 N
+ G HH ZH s n/a 16 2087 2120 2131 N
+ G IH AA b n/a 16 2097 2113 2140 N
+ G IH AA e n/a 16 2097 2113 2140 N
+ G IH AA i n/a 16 2097 2113 2140 N
+ G IH AA s n/a 16 2097 2113 2140 N
+ G IH AE b n/a 16 2105 2107 2125 N
+ G IH AE e n/a 16 2105 2107 2125 N
+ G IH AE i n/a 16 2105 2107 2125 N
+ G IH AE s n/a 16 2105 2107 2125 N
+ G IH AH b n/a 16 2105 2114 2139 N
+ G IH AH e n/a 16 2105 2111 2135 N
+ G IH AH i n/a 16 2105 2111 2135 N
+ G IH AH s n/a 16 2105 2111 2135 N
+ G IH AO b n/a 16 2097 2113 2138 N
+ G IH AO e n/a 16 2097 2113 2138 N
+ G IH AO i n/a 16 2097 2113 2140 N
+ G IH AO s n/a 16 2097 2113 2138 N
+ G IH AW b n/a 16 2105 2107 2125 N
+ G IH AW e n/a 16 2105 2107 2125 N
+ G IH AW i n/a 16 2105 2107 2125 N
+ G IH AW s n/a 16 2105 2107 2125 N
+ G IH AY b n/a 16 2097 2114 2139 N
+ G IH AY e n/a 16 2097 2114 2139 N
+ G IH AY i n/a 16 2097 2114 2139 N
+ G IH AY s n/a 16 2097 2114 2139 N
+ G IH B b n/a 16 2099 2119 2128 N
+ G IH B e n/a 16 2099 2119 2128 N
+ G IH B i n/a 16 2099 2119 2128 N
+ G IH B s n/a 16 2099 2119 2128 N
+ G IH CH e n/a 16 2099 2119 2128 N
+ G IH CH s n/a 16 2099 2119 2128 N
+ G IH D b n/a 16 2099 2119 2128 N
+ G IH D e n/a 16 2099 2119 2128 N
+ G IH D i n/a 16 2099 2119 2128 N
+ G IH D s n/a 16 2099 2119 2128 N
+ G IH DH e n/a 16 2099 2121 2128 N
+ G IH DH s n/a 16 2099 2121 2128 N
+ G IH EH b n/a 16 2105 2107 2125 N
+ G IH EH e n/a 16 2105 2107 2125 N
+ G IH EH i n/a 16 2105 2107 2125 N
+ G IH EH s n/a 16 2105 2107 2125 N
+ G IH ER b n/a 16 2097 2116 2136 N
+ G IH ER e n/a 16 2097 2111 2137 N
+ G IH ER i n/a 16 2097 2111 2137 N
+ G IH ER s n/a 16 2097 2111 2137 N
+ G IH EY b n/a 16 2105 2107 2127 N
+ G IH EY e n/a 16 2105 2107 2127 N
+ G IH EY i n/a 16 2105 2107 2127 N
+ G IH EY s n/a 16 2105 2107 2127 N
+ G IH F b n/a 16 2099 2121 2128 N
+ G IH F e n/a 16 2099 2121 2128 N
+ G IH F i n/a 16 2099 2121 2128 N
+ G IH F s n/a 16 2099 2121 2128 N
+ G IH G e n/a 16 2099 2119 2128 N
+ G IH G s n/a 16 2099 2119 2128 N
+ G IH HH e n/a 16 2099 2118 2128 N
+ G IH HH i n/a 16 2099 2118 2128 N
+ G IH HH s n/a 16 2099 2118 2128 N
+ G IH IH b n/a 16 2105 2109 2126 N
+ G IH IH e n/a 16 2105 2107 2127 N
+ G IH IH i n/a 16 2105 2107 2127 N
+ G IH IH s n/a 16 2105 2107 2127 N
+ G IH IY b n/a 16 2105 2109 2126 N
+ G IH IY e n/a 16 2105 2107 2127 N
+ G IH IY i n/a 16 2105 2107 2127 N
+ G IH IY s n/a 16 2105 2107 2127 N
+ G IH JH e n/a 16 2099 2119 2128 N
+ G IH JH s n/a 16 2099 2119 2128 N
+ G IH K b n/a 16 2099 2119 2128 N
+ G IH K e n/a 16 2099 2119 2128 N
+ G IH K s n/a 16 2099 2119 2128 N
+ G IH L b n/a 16 2097 2123 2133 N
+ G IH L e n/a 16 2097 2124 2133 N
+ G IH L i n/a 16 2097 2124 2133 N
+ G IH L s n/a 16 2097 2124 2133 N
+ G IH M b n/a 16 2099 2119 2129 N
+ G IH M e n/a 16 2099 2119 2129 N
+ G IH M i n/a 16 2099 2119 2129 N
+ G IH M s n/a 16 2099 2119 2129 N
+ G IH N b n/a 16 2099 2119 2129 N
+ G IH N e n/a 16 2099 2119 2129 N
+ G IH N i n/a 16 2099 2119 2129 N
+ G IH N s n/a 16 2099 2119 2129 N
+ G IH NG e n/a 16 2099 2119 2129 N
+ G IH NG s n/a 16 2099 2119 2129 N
+ G IH OW b n/a 16 2097 2113 2138 N
+ G IH OW e n/a 16 2097 2114 2138 N
+ G IH OW i n/a 16 2097 2114 2139 N
+ G IH OW s n/a 16 2097 2114 2138 N
+ G IH OY b n/a 16 2097 2113 2138 N
+ G IH OY e n/a 16 2097 2113 2138 N
+ G IH OY i n/a 16 2097 2113 2139 N
+ G IH OY s n/a 16 2097 2113 2138 N
+ G IH P b n/a 16 2099 2119 2128 N
+ G IH P e n/a 16 2099 2119 2128 N
+ G IH P i n/a 16 2099 2119 2128 N
+ G IH P s n/a 16 2099 2119 2128 N
+ G IH R b n/a 16 2097 2123 2132 N
+ G IH R e n/a 16 2097 2124 2132 N
+ G IH R i n/a 16 2097 2124 2132 N
+ G IH R s n/a 16 2097 2124 2132 N
+ G IH S b n/a 16 2099 2121 2131 N
+ G IH S e n/a 16 2099 2121 2131 N
+ G IH S i n/a 16 2099 2121 2131 N
+ G IH S s n/a 16 2099 2121 2131 N
+ G IH SH e n/a 16 2099 2121 2131 N
+ G IH SH i n/a 16 2099 2121 2131 N
+ G IH SH s n/a 16 2099 2121 2131 N
+ G IH SIL e n/a 16 2099 2118 2128 N
+ G IH SIL s n/a 16 2099 2118 2128 N
+ G IH T b n/a 16 2099 2119 2128 N
+ G IH T e n/a 16 2099 2119 2128 N
+ G IH T i n/a 16 2099 2119 2128 N
+ G IH T s n/a 16 2099 2119 2128 N
+ G IH TH e n/a 16 2099 2121 2128 N
+ G IH TH s n/a 16 2099 2121 2128 N
+ G IH UH b n/a 16 2097 2116 2136 N
+ G IH UH e n/a 16 2097 2116 2137 N
+ G IH UH i n/a 16 2097 2116 2137 N
+ G IH UH s n/a 16 2097 2116 2137 N
+ G IH UW b n/a 16 2097 2113 2138 N
+ G IH UW e n/a 16 2097 2114 2138 N
+ G IH UW i n/a 16 2097 2114 2140 N
+ G IH UW s n/a 16 2097 2114 2138 N
+ G IH V e n/a 16 2099 2121 2128 N
+ G IH V i n/a 16 2099 2121 2128 N
+ G IH V s n/a 16 2099 2121 2128 N
+ G IH W b n/a 16 2097 2117 2129 N
+ G IH W e n/a 16 2097 2117 2129 N
+ G IH W i n/a 16 2097 2117 2129 N
+ G IH W s n/a 16 2097 2117 2129 N
+ G IH Y b n/a 16 2099 2119 2130 N
+ G IH Y e n/a 16 2099 2119 2130 N
+ G IH Y i n/a 16 2099 2119 2130 N
+ G IH Y s n/a 16 2099 2119 2130 N
+ G IH Z b n/a 16 2099 2121 2131 N
+ G IH Z e n/a 16 2099 2121 2131 N
+ G IH Z i n/a 16 2099 2121 2131 N
+ G IH Z s n/a 16 2099 2121 2131 N
+ G IH ZH e n/a 16 2099 2121 2131 N
+ G IH ZH s n/a 16 2099 2121 2131 N
+ G IY AA b n/a 16 2103 2114 2139 N
+ G IY AA e n/a 16 2103 2114 2139 N
+ G IY AA i n/a 16 2103 2114 2139 N
+ G IY AA s n/a 16 2103 2114 2139 N
+ G IY AE b n/a 16 2106 2107 2125 N
+ G IY AE e n/a 16 2106 2107 2125 N
+ G IY AE i n/a 16 2106 2107 2125 N
+ G IY AE s n/a 16 2106 2107 2125 N
+ G IY AH b n/a 16 2106 2114 2139 N
+ G IY AH e n/a 16 2105 2111 2134 N
+ G IY AH i n/a 16 2105 2111 2134 N
+ G IY AH s n/a 16 2105 2111 2134 N
+ G IY AO b n/a 16 2103 2114 2138 N
+ G IY AO e n/a 16 2103 2114 2138 N
+ G IY AO i n/a 16 2103 2114 2140 N
+ G IY AO s n/a 16 2103 2114 2138 N
+ G IY AW b n/a 16 2106 2107 2125 N
+ G IY AW e n/a 16 2106 2107 2125 N
+ G IY AW i n/a 16 2106 2107 2125 N
+ G IY AW s n/a 16 2106 2107 2125 N
+ G IY AY b n/a 16 2103 2114 2139 N
+ G IY AY e n/a 16 2103 2114 2139 N
+ G IY AY s n/a 16 2103 2114 2139 N
+ G IY B b n/a 16 2103 2119 2128 N
+ G IY B e n/a 16 2103 2119 2128 N
+ G IY B i n/a 16 2103 2119 2128 N
+ G IY B s n/a 16 2103 2119 2128 N
+ G IY CH e n/a 16 2103 2119 2128 N
+ G IY CH s n/a 16 2103 2119 2128 N
+ G IY D b n/a 16 2103 2119 2128 N
+ G IY D e n/a 16 2103 2119 2128 N
+ G IY D i n/a 16 2103 2119 2128 N
+ G IY D s n/a 16 2103 2119 2128 N
+ G IY DH e n/a 16 2103 2121 2128 N
+ G IY DH s n/a 16 2103 2121 2128 N
+ G IY EH b n/a 16 2106 2107 2125 N
+ G IY EH e n/a 16 2105 2107 2125 N
+ G IY EH i n/a 16 2105 2107 2125 N
+ G IY EH s n/a 16 2105 2107 2125 N
+ G IY ER b n/a 16 2103 2116 2136 N
+ G IY ER e n/a 16 2103 2111 2137 N
+ G IY ER i n/a 16 2103 2111 2137 N
+ G IY ER s n/a 16 2103 2111 2137 N
+ G IY EY b n/a 16 2106 2107 2127 N
+ G IY EY e n/a 16 2106 2107 2127 N
+ G IY EY i n/a 16 2106 2107 2127 N
+ G IY EY s n/a 16 2106 2107 2127 N
+ G IY F b n/a 16 2103 2121 2128 N
+ G IY F e n/a 16 2103 2121 2128 N
+ G IY F i n/a 16 2103 2121 2128 N
+ G IY F s n/a 16 2103 2121 2128 N
+ G IY G e n/a 16 2103 2119 2128 N
+ G IY G s n/a 16 2103 2119 2128 N
+ G IY HH e n/a 16 2103 2118 2128 N
+ G IY HH s n/a 16 2103 2118 2128 N
+ G IY IH b n/a 16 2106 2109 2126 N
+ G IY IH e n/a 16 2105 2107 2127 N
+ G IY IH i n/a 16 2105 2107 2127 N
+ G IY IH s n/a 16 2105 2107 2127 N
+ G IY IY b n/a 16 2106 2109 2126 N
+ G IY IY e n/a 16 2106 2107 2127 N
+ G IY IY i n/a 16 2106 2107 2127 N
+ G IY IY s n/a 16 2106 2107 2127 N
+ G IY JH e n/a 16 2103 2119 2128 N
+ G IY JH s n/a 16 2103 2119 2128 N
+ G IY K b n/a 16 2103 2119 2128 N
+ G IY K e n/a 16 2103 2119 2128 N
+ G IY K s n/a 16 2103 2119 2128 N
+ G IY L b n/a 16 2103 2124 2133 N
+ G IY L e n/a 16 2103 2124 2133 N
+ G IY L i n/a 16 2103 2124 2133 N
+ G IY L s n/a 16 2103 2124 2133 N
+ G IY M b n/a 16 2103 2119 2129 N
+ G IY M e n/a 16 2103 2119 2129 N
+ G IY M i n/a 16 2103 2119 2129 N
+ G IY M s n/a 16 2103 2119 2129 N
+ G IY N b n/a 16 2103 2119 2129 N
+ G IY N e n/a 16 2103 2119 2129 N
+ G IY N i n/a 16 2103 2119 2129 N
+ G IY N s n/a 16 2103 2119 2129 N
+ G IY NG e n/a 16 2103 2119 2129 N
+ G IY NG s n/a 16 2103 2119 2129 N
+ G IY OW b n/a 16 2103 2114 2138 N
+ G IY OW e n/a 16 2103 2114 2138 N
+ G IY OW i n/a 16 2103 2114 2139 N
+ G IY OW s n/a 16 2103 2114 2138 N
+ G IY OY b n/a 16 2103 2114 2138 N
+ G IY OY e n/a 16 2103 2114 2138 N
+ G IY OY s n/a 16 2103 2114 2138 N
+ G IY P b n/a 16 2103 2119 2128 N
+ G IY P e n/a 16 2103 2119 2128 N
+ G IY P s n/a 16 2103 2119 2128 N
+ G IY R b n/a 16 2103 2124 2132 N
+ G IY R e n/a 16 2103 2124 2132 N
+ G IY R i n/a 16 2103 2124 2132 N
+ G IY R s n/a 16 2103 2124 2132 N
+ G IY S b n/a 16 2103 2121 2131 N
+ G IY S e n/a 16 2103 2121 2131 N
+ G IY S s n/a 16 2103 2121 2131 N
+ G IY SH e n/a 16 2103 2121 2131 N
+ G IY SH s n/a 16 2103 2121 2131 N
+ G IY SIL e n/a 16 2103 2118 2128 N
+ G IY SIL s n/a 16 2103 2118 2128 N
+ G IY T b n/a 16 2103 2119 2128 N
+ G IY T e n/a 16 2103 2119 2128 N
+ G IY T s n/a 16 2103 2119 2128 N
+ G IY TH e n/a 16 2103 2121 2128 N
+ G IY TH s n/a 16 2103 2121 2128 N
+ G IY UH b n/a 16 2103 2116 2136 N
+ G IY UH e n/a 16 2103 2116 2137 N
+ G IY UH i n/a 16 2103 2116 2137 N
+ G IY UH s n/a 16 2103 2116 2137 N
+ G IY UW b n/a 16 2103 2114 2138 N
+ G IY UW e n/a 16 2103 2114 2138 N
+ G IY UW i n/a 16 2103 2114 2140 N
+ G IY UW s n/a 16 2103 2114 2138 N
+ G IY V e n/a 16 2103 2121 2128 N
+ G IY V s n/a 16 2103 2121 2128 N
+ G IY W b n/a 16 2103 2117 2129 N
+ G IY W e n/a 16 2103 2117 2129 N
+ G IY W i n/a 16 2103 2117 2129 N
+ G IY W s n/a 16 2103 2117 2129 N
+ G IY Y b n/a 16 2106 2119 2130 N
+ G IY Y e n/a 16 2105 2119 2130 N
+ G IY Y s n/a 16 2105 2119 2130 N
+ G IY Z b n/a 16 2103 2121 2131 N
+ G IY Z e n/a 16 2103 2121 2131 N
+ G IY Z i n/a 16 2103 2121 2131 N
+ G IY Z s n/a 16 2103 2121 2131 N
+ G IY ZH e n/a 16 2103 2121 2131 N
+ G IY ZH s n/a 16 2103 2121 2131 N
+ G JH AA b n/a 16 2085 2113 2140 N
+ G JH AA s n/a 16 2085 2113 2140 N
+ G JH AE b n/a 16 2087 2108 2125 N
+ G JH AE s n/a 16 2087 2108 2125 N
+ G JH AH b n/a 16 2087 2114 2139 N
+ G JH AH s n/a 16 2087 2110 2135 N
+ G JH AO b n/a 16 2085 2115 2138 N
+ G JH AO s n/a 16 2085 2115 2138 N
+ G JH AW b n/a 16 2085 2108 2125 N
+ G JH AW s n/a 16 2085 2108 2125 N
+ G JH AY b n/a 16 2087 2114 2139 N
+ G JH AY s n/a 16 2087 2114 2139 N
+ G JH B b n/a 16 2087 2117 2128 N
+ G JH B s n/a 16 2087 2117 2128 N
+ G JH CH s n/a 16 2087 2119 2128 N
+ G JH D b n/a 16 2087 2117 2128 N
+ G JH D s n/a 16 2087 2117 2128 N
+ G JH DH s n/a 16 2087 2120 2128 N
+ G JH EH b n/a 16 2087 2108 2125 N
+ G JH EH s n/a 16 2087 2108 2125 N
+ G JH ER b n/a 16 2085 2116 2136 N
+ G JH ER s n/a 16 2085 2110 2136 N
+ G JH EY b n/a 16 2087 2108 2127 N
+ G JH EY s n/a 16 2087 2108 2127 N
+ G JH F b n/a 16 2087 2120 2128 N
+ G JH F s n/a 16 2087 2120 2128 N
+ G JH G s n/a 16 2087 2117 2128 N
+ G JH HH s n/a 16 2087 2118 2128 N
+ G JH IH b n/a 16 2087 2109 2126 N
+ G JH IH s n/a 16 2087 2109 2126 N
+ G JH IY b n/a 16 2087 2109 2126 N
+ G JH IY s n/a 16 2087 2109 2126 N
+ G JH JH s n/a 16 2087 2117 2128 N
+ G JH K b n/a 16 2087 2119 2128 N
+ G JH K s n/a 16 2087 2119 2128 N
+ G JH L b n/a 16 2084 2122 2133 N
+ G JH L s n/a 16 2084 2124 2133 N
+ G JH M b n/a 16 2087 2117 2129 N
+ G JH M s n/a 16 2087 2117 2129 N
+ G JH N b n/a 16 2087 2117 2129 N
+ G JH N s n/a 16 2087 2117 2129 N
+ G JH NG s n/a 16 2087 2117 2129 N
+ G JH OW b n/a 16 2085 2115 2138 N
+ G JH OW s n/a 16 2085 2115 2138 N
+ G JH OY b n/a 16 2087 2115 2138 N
+ G JH OY s n/a 16 2087 2115 2138 N
+ G JH P b n/a 16 2087 2119 2128 N
+ G JH P s n/a 16 2087 2119 2128 N
+ G JH R b n/a 16 2084 2122 2132 N
+ G JH R i n/a 16 2084 2124 2132 N
+ G JH R s n/a 16 2084 2124 2132 N
+ G JH S b n/a 16 2087 2120 2131 N
+ G JH S s n/a 16 2087 2120 2131 N
+ G JH SH s n/a 16 2087 2120 2131 N
+ G JH SIL s n/a 16 2087 2118 2128 N
+ G JH T b n/a 16 2087 2119 2128 N
+ G JH T s n/a 16 2087 2119 2128 N
+ G JH TH s n/a 16 2087 2120 2128 N
+ G JH UH b n/a 16 2085 2116 2136 N
+ G JH UH s n/a 16 2085 2116 2136 N
+ G JH UW b n/a 16 2085 2115 2138 N
+ G JH UW s n/a 16 2085 2115 2138 N
+ G JH V s n/a 16 2087 2120 2128 N
+ G JH W b n/a 16 2084 2117 2129 N
+ G JH W s n/a 16 2084 2117 2129 N
+ G JH Y b n/a 16 2087 2118 2130 N
+ G JH Y s n/a 16 2087 2118 2130 N
+ G JH Z b n/a 16 2087 2120 2131 N
+ G JH Z s n/a 16 2087 2120 2131 N
+ G JH ZH s n/a 16 2087 2120 2131 N
+ G K AA b n/a 16 2085 2113 2140 N
+ G K AA e n/a 16 2085 2110 2140 N
+ G K AA i n/a 16 2085 2110 2140 N
+ G K AA s n/a 16 2085 2110 2140 N
+ G K AE b n/a 16 2087 2108 2125 N
+ G K AE e n/a 16 2087 2108 2125 N
+ G K AE i n/a 16 2087 2108 2125 N
+ G K AE s n/a 16 2087 2108 2125 N
+ G K AH b n/a 16 2087 2114 2139 N
+ G K AH e n/a 16 2087 2110 2134 N
+ G K AH i n/a 16 2087 2110 2134 N
+ G K AH s n/a 16 2087 2110 2134 N
+ G K AO b n/a 16 2085 2115 2138 N
+ G K AO e n/a 16 2085 2110 2138 N
+ G K AO s n/a 16 2085 2110 2138 N
+ G K AW b n/a 16 2085 2108 2125 N
+ G K AW e n/a 16 2085 2108 2125 N
+ G K AW i n/a 16 2085 2108 2125 N
+ G K AW s n/a 16 2085 2108 2125 N
+ G K AY b n/a 16 2087 2114 2139 N
+ G K AY e n/a 16 2087 2110 2139 N
+ G K AY s n/a 16 2087 2110 2139 N
+ G K B b n/a 16 2087 2117 2128 N
+ G K B e n/a 16 2087 2117 2128 N
+ G K B s n/a 16 2087 2117 2128 N
+ G K CH e n/a 16 2087 2119 2128 N
+ G K CH s n/a 16 2087 2119 2128 N
+ G K D b n/a 16 2087 2117 2128 N
+ G K D e n/a 16 2087 2117 2128 N
+ G K D s n/a 16 2087 2117 2128 N
+ G K DH e n/a 16 2087 2120 2128 N
+ G K DH s n/a 16 2087 2120 2128 N
+ G K EH b n/a 16 2087 2108 2125 N
+ G K EH e n/a 16 2087 2108 2125 N
+ G K EH s n/a 16 2087 2108 2125 N
+ G K ER b n/a 16 2085 2116 2136 N
+ G K ER e n/a 16 2085 2110 2136 N
+ G K ER s n/a 16 2085 2110 2136 N
+ G K EY b n/a 16 2087 2108 2127 N
+ G K EY e n/a 16 2087 2108 2127 N
+ G K EY i n/a 16 2087 2108 2127 N
+ G K EY s n/a 16 2087 2108 2127 N
+ G K F b n/a 16 2087 2120 2128 N
+ G K F e n/a 16 2087 2120 2128 N
+ G K F s n/a 16 2087 2120 2128 N
+ G K G e n/a 16 2087 2117 2128 N
+ G K G i n/a 16 2087 2117 2128 N
+ G K G s n/a 16 2087 2117 2128 N
+ G K HH e n/a 16 2087 2118 2128 N
+ G K HH s n/a 16 2087 2118 2128 N
+ G K IH b n/a 16 2087 2109 2126 N
+ G K IH e n/a 16 2087 2109 2126 N
+ G K IH i n/a 16 2087 2109 2126 N
+ G K IH s n/a 16 2087 2109 2126 N
+ G K IY b n/a 16 2087 2109 2126 N
+ G K IY e n/a 16 2087 2109 2126 N
+ G K IY s n/a 16 2087 2109 2126 N
+ G K JH e n/a 16 2087 2117 2128 N
+ G K JH s n/a 16 2087 2117 2128 N
+ G K K b n/a 16 2087 2119 2128 N
+ G K K e n/a 16 2087 2119 2128 N
+ G K K s n/a 16 2087 2119 2128 N
+ G K L b n/a 16 2084 2122 2133 N
+ G K L e n/a 16 2084 2124 2133 N
+ G K L i n/a 16 2084 2124 2133 N
+ G K L s n/a 16 2084 2124 2133 N
+ G K M b n/a 16 2087 2117 2129 N
+ G K M e n/a 16 2087 2117 2129 N
+ G K M s n/a 16 2087 2117 2129 N
+ G K N b n/a 16 2087 2117 2129 N
+ G K N e n/a 16 2087 2117 2129 N
+ G K N s n/a 16 2087 2117 2129 N
+ G K NG e n/a 16 2087 2117 2129 N
+ G K NG s n/a 16 2087 2117 2129 N
+ G K OW b n/a 16 2085 2115 2138 N
+ G K OW e n/a 16 2085 2110 2138 N
+ G K OW i n/a 16 2085 2110 2140 N
+ G K OW s n/a 16 2085 2110 2138 N
+ G K OY b n/a 16 2087 2115 2138 N
+ G K OY e n/a 16 2087 2110 2138 N
+ G K OY s n/a 16 2087 2110 2138 N
+ G K P b n/a 16 2087 2119 2128 N
+ G K P e n/a 16 2087 2119 2128 N
+ G K P s n/a 16 2087 2119 2128 N
+ G K R b n/a 16 2084 2122 2132 N
+ G K R e n/a 16 2084 2124 2132 N
+ G K R i n/a 16 2084 2124 2132 N
+ G K R s n/a 16 2084 2124 2132 N
+ G K S b n/a 16 2087 2120 2131 N
+ G K S e n/a 16 2087 2120 2131 N
+ G K S s n/a 16 2087 2120 2131 N
+ G K SH e n/a 16 2087 2120 2131 N
+ G K SH s n/a 16 2087 2120 2131 N
+ G K SIL e n/a 16 2087 2118 2128 N
+ G K SIL s n/a 16 2087 2118 2128 N
+ G K T b n/a 16 2087 2119 2128 N
+ G K T e n/a 16 2087 2119 2128 N
+ G K T s n/a 16 2087 2119 2128 N
+ G K TH e n/a 16 2087 2120 2128 N
+ G K TH s n/a 16 2087 2120 2128 N
+ G K UH b n/a 16 2085 2115 2136 N
+ G K UH e n/a 16 2085 2110 2136 N
+ G K UH i n/a 16 2085 2110 2136 N
+ G K UH s n/a 16 2085 2110 2136 N
+ G K UW b n/a 16 2085 2115 2138 N
+ G K UW e n/a 16 2085 2110 2138 N
+ G K UW s n/a 16 2085 2110 2138 N
+ G K V e n/a 16 2087 2120 2128 N
+ G K V s n/a 16 2087 2120 2128 N
+ G K W b n/a 16 2084 2117 2129 N
+ G K W e n/a 16 2084 2117 2129 N
+ G K W s n/a 16 2084 2117 2129 N
+ G K Y b n/a 16 2087 2118 2130 N
+ G K Y e n/a 16 2087 2118 2130 N
+ G K Y s n/a 16 2087 2118 2130 N
+ G K Z b n/a 16 2087 2120 2131 N
+ G K Z e n/a 16 2087 2120 2131 N
+ G K Z s n/a 16 2087 2120 2131 N
+ G K ZH e n/a 16 2087 2120 2131 N
+ G K ZH s n/a 16 2087 2120 2131 N
+ G L AA b n/a 16 2089 2113 2140 N
+ G L AA e n/a 16 2089 2113 2140 N
+ G L AA i n/a 16 2089 2113 2140 N
+ G L AA s n/a 16 2089 2113 2140 N
+ G L AE b n/a 16 2091 2107 2125 N
+ G L AE e n/a 16 2091 2107 2125 N
+ G L AE i n/a 16 2091 2107 2125 N
+ G L AE s n/a 16 2091 2107 2125 N
+ G L AH b n/a 16 2091 2114 2139 N
+ G L AH e n/a 16 2091 2110 2135 N
+ G L AH i n/a 16 2091 2110 2135 N
+ G L AH s n/a 16 2091 2110 2135 N
+ G L AO b n/a 16 2089 2116 2138 N
+ G L AO e n/a 16 2089 2116 2138 N
+ G L AO i n/a 16 2089 2116 2140 N
+ G L AO s n/a 16 2089 2116 2138 N
+ G L AW b n/a 16 2091 2107 2125 N
+ G L AW e n/a 16 2091 2107 2125 N
+ G L AW i n/a 16 2091 2107 2125 N
+ G L AW s n/a 16 2091 2107 2125 N
+ G L AY b n/a 16 2089 2114 2139 N
+ G L AY e n/a 16 2089 2114 2139 N
+ G L AY i n/a 16 2089 2114 2139 N
+ G L AY s n/a 16 2089 2114 2139 N
+ G L B b n/a 16 2089 2117 2128 N
+ G L B e n/a 16 2089 2117 2128 N
+ G L B s n/a 16 2089 2117 2128 N
+ G L CH e n/a 16 2089 2120 2128 N
+ G L CH s n/a 16 2089 2120 2128 N
+ G L D b n/a 16 2089 2117 2128 N
+ G L D e n/a 16 2089 2117 2128 N
+ G L D s n/a 16 2089 2117 2128 N
+ G L DH e n/a 16 2089 2120 2128 N
+ G L DH s n/a 16 2089 2120 2128 N
+ G L EH b n/a 16 2091 2107 2125 N
+ G L EH e n/a 16 2091 2107 2125 N
+ G L EH i n/a 16 2091 2107 2125 N
+ G L EH s n/a 16 2091 2107 2125 N
+ G L ER b n/a 16 2089 2116 2136 N
+ G L ER e n/a 16 2089 2110 2136 N
+ G L ER i n/a 16 2089 2110 2136 N
+ G L ER s n/a 16 2089 2110 2136 N
+ G L EY b n/a 16 2091 2107 2127 N
+ G L EY e n/a 16 2091 2107 2127 N
+ G L EY i n/a 16 2091 2107 2127 N
+ G L EY s n/a 16 2091 2107 2127 N
+ G L F b n/a 16 2089 2120 2128 N
+ G L F e n/a 16 2089 2120 2128 N
+ G L F s n/a 16 2089 2120 2128 N
+ G L G e n/a 16 2089 2117 2128 N
+ G L G s n/a 16 2089 2117 2128 N
+ G L HH e n/a 16 2089 2120 2128 N
+ G L HH s n/a 16 2089 2120 2128 N
+ G L IH b n/a 16 2091 2109 2126 N
+ G L IH e n/a 16 2091 2107 2126 N
+ G L IH i n/a 16 2091 2107 2126 N
+ G L IH s n/a 16 2091 2107 2126 N
+ G L IY b n/a 16 2091 2109 2126 N
+ G L IY e n/a 16 2091 2107 2126 N
+ G L IY i n/a 16 2091 2107 2126 N
+ G L IY s n/a 16 2091 2107 2126 N
+ G L JH e n/a 16 2089 2117 2128 N
+ G L JH s n/a 16 2089 2117 2128 N
+ G L K b n/a 16 2089 2120 2128 N
+ G L K e n/a 16 2089 2120 2128 N
+ G L K s n/a 16 2089 2120 2128 N
+ G L L b n/a 16 2089 2123 2133 N
+ G L L e n/a 16 2089 2124 2133 N
+ G L L i n/a 16 2089 2124 2133 N
+ G L L s n/a 16 2089 2124 2133 N
+ G L M b n/a 16 2089 2117 2129 N
+ G L M e n/a 16 2089 2117 2129 N
+ G L M i n/a 16 2089 2117 2129 N
+ G L M s n/a 16 2089 2117 2129 N
+ G L N b n/a 16 2089 2117 2129 N
+ G L N e n/a 16 2089 2117 2129 N
+ G L N s n/a 16 2089 2117 2129 N
+ G L NG e n/a 16 2089 2117 2129 N
+ G L NG s n/a 16 2089 2117 2129 N
+ G L OW b n/a 16 2089 2116 2138 N
+ G L OW e n/a 16 2089 2116 2138 N
+ G L OW i n/a 16 2089 2116 2140 N
+ G L OW s n/a 16 2089 2116 2138 N
+ G L OY b n/a 16 2089 2116 2138 N
+ G L OY e n/a 16 2089 2116 2138 N
+ G L OY s n/a 16 2089 2116 2138 N
+ G L P b n/a 16 2089 2120 2128 N
+ G L P e n/a 16 2089 2120 2128 N
+ G L P s n/a 16 2089 2120 2128 N
+ G L R b n/a 16 2089 2123 2132 N
+ G L R e n/a 16 2089 2124 2132 N
+ G L R i n/a 16 2089 2124 2132 N
+ G L R s n/a 16 2089 2124 2132 N
+ G L S b n/a 16 2089 2120 2131 N
+ G L S e n/a 16 2089 2120 2131 N
+ G L S s n/a 16 2089 2120 2131 N
+ G L SH e n/a 16 2089 2120 2131 N
+ G L SH s n/a 16 2089 2120 2131 N
+ G L SIL e n/a 16 2089 2120 2128 N
+ G L SIL s n/a 16 2089 2120 2128 N
+ G L T b n/a 16 2089 2120 2128 N
+ G L T e n/a 16 2089 2120 2128 N
+ G L T s n/a 16 2089 2120 2128 N
+ G L TH e n/a 16 2089 2120 2128 N
+ G L TH s n/a 16 2089 2120 2128 N
+ G L UH b n/a 16 2089 2116 2136 N
+ G L UH e n/a 16 2089 2116 2136 N
+ G L UH i n/a 16 2089 2116 2136 N
+ G L UH s n/a 16 2089 2116 2136 N
+ G L UW b n/a 16 2089 2116 2138 N
+ G L UW e n/a 16 2089 2116 2138 N
+ G L UW i n/a 16 2089 2116 2140 N
+ G L UW s n/a 16 2089 2116 2138 N
+ G L V e n/a 16 2089 2120 2128 N
+ G L V s n/a 16 2089 2120 2128 N
+ G L W b n/a 16 2089 2117 2129 N
+ G L W e n/a 16 2089 2117 2129 N
+ G L W i n/a 16 2089 2117 2129 N
+ G L W s n/a 16 2089 2117 2129 N
+ G L Y b n/a 16 2091 2118 2130 N
+ G L Y e n/a 16 2091 2118 2130 N
+ G L Y s n/a 16 2091 2118 2130 N
+ G L Z b n/a 16 2089 2120 2131 N
+ G L Z e n/a 16 2089 2120 2131 N
+ G L Z s n/a 16 2089 2120 2131 N
+ G L ZH e n/a 16 2089 2120 2131 N
+ G L ZH s n/a 16 2089 2120 2131 N
+ G M AA b n/a 16 2090 2113 2140 N
+ G M AA e n/a 16 2090 2113 2140 N
+ G M AA i n/a 16 2090 2113 2140 N
+ G M AA s n/a 16 2090 2113 2140 N
+ G M AE b n/a 16 2091 2108 2125 N
+ G M AE e n/a 16 2091 2108 2125 N
+ G M AE s n/a 16 2091 2108 2125 N
+ G M AH b n/a 16 2091 2114 2139 N
+ G M AH e n/a 16 2091 2112 2135 N
+ G M AH i n/a 16 2091 2112 2135 N
+ G M AH s n/a 16 2091 2112 2135 N
+ G M AO b n/a 16 2090 2116 2138 N
+ G M AO e n/a 16 2090 2116 2138 N
+ G M AO i n/a 16 2090 2116 2140 N
+ G M AO s n/a 16 2090 2116 2138 N
+ G M AW b n/a 16 2091 2108 2125 N
+ G M AW e n/a 16 2091 2108 2125 N
+ G M AW s n/a 16 2091 2108 2125 N
+ G M AY b n/a 16 2090 2114 2139 N
+ G M AY e n/a 16 2090 2114 2139 N
+ G M AY s n/a 16 2090 2114 2139 N
+ G M B b n/a 16 2090 2117 2128 N
+ G M B e n/a 16 2090 2117 2128 N
+ G M B s n/a 16 2090 2117 2128 N
+ G M CH e n/a 16 2090 2119 2128 N
+ G M CH s n/a 16 2090 2119 2128 N
+ G M D b n/a 16 2090 2117 2128 N
+ G M D e n/a 16 2090 2117 2128 N
+ G M D s n/a 16 2090 2117 2128 N
+ G M DH e n/a 16 2090 2120 2128 N
+ G M DH s n/a 16 2090 2120 2128 N
+ G M EH b n/a 16 2091 2108 2125 N
+ G M EH e n/a 16 2091 2108 2125 N
+ G M EH s n/a 16 2091 2108 2125 N
+ G M ER b n/a 16 2090 2116 2136 N
+ G M ER e n/a 16 2090 2112 2137 N
+ G M ER i n/a 16 2090 2112 2137 N
+ G M ER s n/a 16 2090 2112 2137 N
+ G M EY b n/a 16 2091 2107 2127 N
+ G M EY e n/a 16 2091 2107 2127 N
+ G M EY i n/a 16 2091 2107 2127 N
+ G M EY s n/a 16 2091 2107 2127 N
+ G M F b n/a 16 2090 2120 2128 N
+ G M F e n/a 16 2090 2120 2128 N
+ G M F s n/a 16 2090 2120 2128 N
+ G M G e n/a 16 2090 2117 2128 N
+ G M G s n/a 16 2090 2117 2128 N
+ G M HH e n/a 16 2090 2118 2128 N
+ G M HH s n/a 16 2090 2118 2128 N
+ G M IH b n/a 16 2091 2109 2126 N
+ G M IH e n/a 16 2091 2109 2126 N
+ G M IH s n/a 16 2091 2109 2126 N
+ G M IY b n/a 16 2091 2109 2126 N
+ G M IY e n/a 16 2091 2109 2126 N
+ G M IY i n/a 16 2091 2109 2126 N
+ G M IY s n/a 16 2091 2109 2126 N
+ G M JH e n/a 16 2090 2117 2128 N
+ G M JH s n/a 16 2090 2117 2128 N
+ G M K b n/a 16 2090 2119 2128 N
+ G M K e n/a 16 2090 2119 2128 N
+ G M K s n/a 16 2090 2119 2128 N
+ G M L b n/a 16 2090 2124 2133 N
+ G M L e n/a 16 2090 2124 2133 N
+ G M L s n/a 16 2090 2124 2133 N
+ G M M b n/a 16 2090 2117 2129 N
+ G M M e n/a 16 2090 2117 2129 N
+ G M M s n/a 16 2090 2117 2129 N
+ G M N b n/a 16 2090 2117 2129 N
+ G M N e n/a 16 2090 2117 2129 N
+ G M N s n/a 16 2090 2117 2129 N
+ G M NG e n/a 16 2090 2117 2129 N
+ G M NG s n/a 16 2090 2117 2129 N
+ G M OW b n/a 16 2090 2116 2138 N
+ G M OW e n/a 16 2090 2116 2138 N
+ G M OW s n/a 16 2090 2116 2138 N
+ G M OY b n/a 16 2090 2116 2138 N
+ G M OY e n/a 16 2090 2116 2138 N
+ G M OY s n/a 16 2090 2116 2138 N
+ G M P b n/a 16 2090 2119 2128 N
+ G M P e n/a 16 2090 2119 2128 N
+ G M P s n/a 16 2090 2119 2128 N
+ G M R b n/a 16 2090 2124 2132 N
+ G M R e n/a 16 2090 2124 2132 N
+ G M R i n/a 16 2090 2124 2132 N
+ G M R s n/a 16 2090 2124 2132 N
+ G M S b n/a 16 2090 2120 2131 N
+ G M S e n/a 16 2090 2120 2131 N
+ G M S s n/a 16 2090 2120 2131 N
+ G M SH e n/a 16 2090 2120 2131 N
+ G M SH s n/a 16 2090 2120 2131 N
+ G M SIL e n/a 16 2090 2118 2128 N
+ G M SIL s n/a 16 2090 2118 2128 N
+ G M T b n/a 16 2090 2119 2128 N
+ G M T e n/a 16 2090 2119 2128 N
+ G M T s n/a 16 2090 2119 2128 N
+ G M TH e n/a 16 2090 2120 2128 N
+ G M TH s n/a 16 2090 2120 2128 N
+ G M UH b n/a 16 2090 2116 2136 N
+ G M UH e n/a 16 2090 2116 2137 N
+ G M UH s n/a 16 2090 2116 2137 N
+ G M UW b n/a 16 2090 2116 2138 N
+ G M UW e n/a 16 2090 2116 2138 N
+ G M UW i n/a 16 2090 2116 2140 N
+ G M UW s n/a 16 2090 2116 2138 N
+ G M V e n/a 16 2090 2120 2128 N
+ G M V s n/a 16 2090 2120 2128 N
+ G M W b n/a 16 2090 2117 2129 N
+ G M W e n/a 16 2090 2117 2129 N
+ G M W i n/a 16 2090 2117 2129 N
+ G M W s n/a 16 2090 2117 2129 N
+ G M Y b n/a 16 2091 2118 2130 N
+ G M Y e n/a 16 2091 2118 2130 N
+ G M Y s n/a 16 2091 2118 2130 N
+ G M Z b n/a 16 2090 2120 2131 N
+ G M Z e n/a 16 2090 2120 2131 N
+ G M Z s n/a 16 2090 2120 2131 N
+ G M ZH e n/a 16 2090 2120 2131 N
+ G M ZH s n/a 16 2090 2120 2131 N
+ G N AA b n/a 16 2090 2113 2140 N
+ G N AA e n/a 16 2090 2113 2140 N
+ G N AA i n/a 16 2090 2113 2140 N
+ G N AA s n/a 16 2090 2113 2140 N
+ G N AE b n/a 16 2091 2108 2125 N
+ G N AE e n/a 16 2091 2108 2125 N
+ G N AE s n/a 16 2091 2108 2125 N
+ G N AH b n/a 16 2091 2114 2139 N
+ G N AH e n/a 16 2091 2112 2135 N
+ G N AH i n/a 16 2091 2112 2135 N
+ G N AH s n/a 16 2091 2112 2135 N
+ G N AO b n/a 16 2090 2116 2138 N
+ G N AO e n/a 16 2090 2116 2138 N
+ G N AO i n/a 16 2090 2116 2140 N
+ G N AO s n/a 16 2090 2116 2138 N
+ G N AW b n/a 16 2091 2108 2125 N
+ G N AW e n/a 16 2091 2108 2125 N
+ G N AW s n/a 16 2091 2108 2125 N
+ G N AY b n/a 16 2090 2114 2139 N
+ G N AY e n/a 16 2090 2114 2139 N
+ G N AY i n/a 16 2090 2114 2139 N
+ G N AY s n/a 16 2090 2114 2139 N
+ G N B b n/a 16 2090 2117 2128 N
+ G N B e n/a 16 2090 2117 2128 N
+ G N B s n/a 16 2090 2117 2128 N
+ G N CH e n/a 16 2090 2119 2128 N
+ G N CH s n/a 16 2090 2119 2128 N
+ G N D b n/a 16 2090 2117 2128 N
+ G N D e n/a 16 2090 2117 2128 N
+ G N D i n/a 16 2090 2117 2128 N
+ G N D s n/a 16 2090 2117 2128 N
+ G N DH e n/a 16 2090 2120 2128 N
+ G N DH s n/a 16 2090 2120 2128 N
+ G N EH b n/a 16 2091 2108 2125 N
+ G N EH e n/a 16 2091 2108 2125 N
+ G N EH i n/a 16 2091 2108 2125 N
+ G N EH s n/a 16 2091 2108 2125 N
+ G N ER b n/a 16 2090 2116 2136 N
+ G N ER e n/a 16 2090 2112 2137 N
+ G N ER i n/a 16 2090 2112 2137 N
+ G N ER s n/a 16 2090 2112 2137 N
+ G N EY b n/a 16 2091 2107 2127 N
+ G N EY e n/a 16 2091 2107 2127 N
+ G N EY i n/a 16 2091 2107 2127 N
+ G N EY s n/a 16 2091 2107 2127 N
+ G N F b n/a 16 2090 2120 2128 N
+ G N F e n/a 16 2090 2120 2128 N
+ G N F s n/a 16 2090 2120 2128 N
+ G N G e n/a 16 2090 2117 2128 N
+ G N G s n/a 16 2090 2117 2128 N
+ G N HH e n/a 16 2090 2118 2128 N
+ G N HH s n/a 16 2090 2118 2128 N
+ G N IH b n/a 16 2091 2109 2126 N
+ G N IH e n/a 16 2091 2109 2126 N
+ G N IH i n/a 16 2091 2109 2126 N
+ G N IH s n/a 16 2091 2109 2126 N
+ G N IY b n/a 16 2091 2109 2126 N
+ G N IY e n/a 16 2091 2109 2126 N
+ G N IY i n/a 16 2091 2109 2126 N
+ G N IY s n/a 16 2091 2109 2126 N
+ G N JH e n/a 16 2090 2117 2128 N
+ G N JH s n/a 16 2090 2117 2128 N
+ G N K b n/a 16 2090 2119 2128 N
+ G N K e n/a 16 2090 2119 2128 N
+ G N K s n/a 16 2090 2119 2128 N
+ G N L b n/a 16 2090 2124 2133 N
+ G N L e n/a 16 2090 2124 2133 N
+ G N L i n/a 16 2090 2124 2133 N
+ G N L s n/a 16 2090 2124 2133 N
+ G N M b n/a 16 2090 2117 2129 N
+ G N M e n/a 16 2090 2117 2129 N
+ G N M s n/a 16 2090 2117 2129 N
+ G N N b n/a 16 2090 2117 2129 N
+ G N N e n/a 16 2090 2117 2129 N
+ G N N s n/a 16 2090 2117 2129 N
+ G N NG e n/a 16 2090 2117 2129 N
+ G N NG s n/a 16 2090 2117 2129 N
+ G N OW b n/a 16 2090 2116 2138 N
+ G N OW e n/a 16 2090 2116 2138 N
+ G N OW i n/a 16 2090 2116 2140 N
+ G N OW s n/a 16 2090 2116 2138 N
+ G N OY b n/a 16 2090 2116 2138 N
+ G N OY e n/a 16 2090 2116 2138 N
+ G N OY s n/a 16 2090 2116 2138 N
+ G N P b n/a 16 2090 2119 2128 N
+ G N P e n/a 16 2090 2119 2128 N
+ G N P i n/a 16 2090 2119 2128 N
+ G N P s n/a 16 2090 2119 2128 N
+ G N R b n/a 16 2090 2124 2132 N
+ G N R e n/a 16 2090 2124 2132 N
+ G N R i n/a 16 2090 2124 2132 N
+ G N R s n/a 16 2090 2124 2132 N
+ G N S b n/a 16 2090 2120 2131 N
+ G N S e n/a 16 2090 2120 2131 N
+ G N S s n/a 16 2090 2120 2131 N
+ G N SH e n/a 16 2090 2120 2131 N
+ G N SH s n/a 16 2090 2120 2131 N
+ G N SIL e n/a 16 2090 2118 2128 N
+ G N SIL s n/a 16 2090 2118 2128 N
+ G N T b n/a 16 2090 2119 2128 N
+ G N T e n/a 16 2090 2119 2128 N
+ G N T i n/a 16 2090 2119 2128 N
+ G N T s n/a 16 2090 2119 2128 N
+ G N TH e n/a 16 2090 2120 2128 N
+ G N TH s n/a 16 2090 2120 2128 N
+ G N UH b n/a 16 2090 2116 2136 N
+ G N UH e n/a 16 2090 2116 2137 N
+ G N UH i n/a 16 2090 2116 2137 N
+ G N UH s n/a 16 2090 2116 2137 N
+ G N UW b n/a 16 2090 2116 2138 N
+ G N UW e n/a 16 2090 2116 2138 N
+ G N UW i n/a 16 2090 2116 2140 N
+ G N UW s n/a 16 2090 2116 2138 N
+ G N V e n/a 16 2090 2120 2128 N
+ G N V s n/a 16 2090 2120 2128 N
+ G N W b n/a 16 2090 2117 2129 N
+ G N W e n/a 16 2090 2117 2129 N
+ G N W i n/a 16 2090 2117 2129 N
+ G N W s n/a 16 2090 2117 2129 N
+ G N Y b n/a 16 2091 2118 2130 N
+ G N Y e n/a 16 2091 2118 2130 N
+ G N Y i n/a 16 2091 2118 2130 N
+ G N Y s n/a 16 2091 2118 2130 N
+ G N Z b n/a 16 2090 2120 2131 N
+ G N Z e n/a 16 2090 2120 2131 N
+ G N Z s n/a 16 2090 2120 2131 N
+ G N ZH e n/a 16 2090 2120 2131 N
+ G N ZH s n/a 16 2090 2120 2131 N
+ G NG AA b n/a 16 2090 2113 2140 N
+ G NG AA e n/a 16 2090 2112 2140 N
+ G NG AA i n/a 16 2092 2112 2140 N
+ G NG AA s n/a 16 2090 2112 2140 N
+ G NG AE b n/a 16 2091 2108 2125 N
+ G NG AE e n/a 16 2091 2108 2125 N
+ G NG AE i n/a 16 2092 2108 2125 N
+ G NG AE s n/a 16 2091 2108 2125 N
+ G NG AH b n/a 16 2091 2114 2139 N
+ G NG AH e n/a 16 2091 2112 2134 N
+ G NG AH i n/a 16 2092 2112 2134 N
+ G NG AH s n/a 16 2091 2112 2134 N
+ G NG AO b n/a 16 2090 2116 2138 N
+ G NG AO e n/a 16 2090 2112 2138 N
+ G NG AO i n/a 16 2092 2112 2140 N
+ G NG AO s n/a 16 2090 2112 2138 N
+ G NG AW b n/a 16 2091 2108 2125 N
+ G NG AW e n/a 16 2091 2108 2125 N
+ G NG AW s n/a 16 2091 2108 2125 N
+ G NG AY b n/a 16 2090 2114 2139 N
+ G NG AY e n/a 16 2090 2112 2139 N
+ G NG AY i n/a 16 2092 2112 2139 N
+ G NG AY s n/a 16 2090 2112 2139 N
+ G NG B b n/a 16 2090 2117 2128 N
+ G NG B e n/a 16 2090 2117 2128 N
+ G NG B i n/a 16 2092 2117 2128 N
+ G NG B s n/a 16 2090 2117 2128 N
+ G NG CH e n/a 16 2090 2119 2128 N
+ G NG CH s n/a 16 2090 2119 2128 N
+ G NG D b n/a 16 2090 2117 2128 N
+ G NG D e n/a 16 2090 2117 2128 N
+ G NG D s n/a 16 2090 2117 2128 N
+ G NG DH e n/a 16 2090 2120 2128 N
+ G NG DH s n/a 16 2090 2120 2128 N
+ G NG EH b n/a 16 2091 2108 2125 N
+ G NG EH e n/a 16 2091 2108 2125 N
+ G NG EH i n/a 16 2092 2108 2125 N
+ G NG EH s n/a 16 2091 2108 2125 N
+ G NG ER b n/a 16 2092 2116 2136 N
+ G NG ER e n/a 16 2092 2112 2137 N
+ G NG ER i n/a 16 2092 2112 2137 N
+ G NG ER s n/a 16 2092 2112 2137 N
+ G NG EY b n/a 16 2091 2107 2127 N
+ G NG EY e n/a 16 2091 2107 2127 N
+ G NG EY i n/a 16 2092 2107 2127 N
+ G NG EY s n/a 16 2091 2107 2127 N
+ G NG F b n/a 16 2090 2120 2128 N
+ G NG F e n/a 16 2090 2120 2128 N
+ G NG F i n/a 16 2092 2120 2128 N
+ G NG F s n/a 16 2090 2120 2128 N
+ G NG G e n/a 16 2090 2117 2128 N
+ G NG G s n/a 16 2090 2117 2128 N
+ G NG HH e n/a 16 2090 2118 2128 N
+ G NG HH s n/a 16 2090 2118 2128 N
+ G NG IH b n/a 16 2091 2109 2126 N
+ G NG IH e n/a 16 2091 2109 2126 N
+ G NG IH i n/a 16 2092 2109 2126 N
+ G NG IH s n/a 16 2091 2109 2126 N
+ G NG IY b n/a 16 2091 2109 2126 N
+ G NG IY e n/a 16 2091 2109 2126 N
+ G NG IY i n/a 16 2092 2109 2126 N
+ G NG IY s n/a 16 2091 2109 2126 N
+ G NG JH e n/a 16 2090 2117 2128 N
+ G NG JH s n/a 16 2090 2117 2128 N
+ G NG K b n/a 16 2090 2119 2128 N
+ G NG K e n/a 16 2090 2119 2128 N
+ G NG K i n/a 16 2092 2119 2128 N
+ G NG K s n/a 16 2090 2119 2128 N
+ G NG L b n/a 16 2090 2124 2133 N
+ G NG L e n/a 16 2090 2124 2133 N
+ G NG L i n/a 16 2092 2124 2133 N
+ G NG L s n/a 16 2090 2124 2133 N
+ G NG M b n/a 16 2090 2117 2129 N
+ G NG M e n/a 16 2090 2117 2129 N
+ G NG M i n/a 16 2092 2117 2129 N
+ G NG M s n/a 16 2090 2117 2129 N
+ G NG N b n/a 16 2090 2117 2129 N
+ G NG N e n/a 16 2090 2117 2129 N
+ G NG N i n/a 16 2092 2117 2129 N
+ G NG N s n/a 16 2090 2117 2129 N
+ G NG NG e n/a 16 2090 2117 2129 N
+ G NG NG s n/a 16 2090 2117 2129 N
+ G NG OW b n/a 16 2090 2116 2138 N
+ G NG OW e n/a 16 2090 2112 2138 N
+ G NG OW i n/a 16 2092 2112 2140 N
+ G NG OW s n/a 16 2090 2112 2138 N
+ G NG OY b n/a 16 2090 2116 2138 N
+ G NG OY e n/a 16 2090 2112 2138 N
+ G NG OY i n/a 16 2092 2112 2140 N
+ G NG OY s n/a 16 2090 2112 2138 N
+ G NG P b n/a 16 2090 2119 2128 N
+ G NG P e n/a 16 2090 2119 2128 N
+ G NG P s n/a 16 2090 2119 2128 N
+ G NG R b n/a 16 2090 2124 2132 N
+ G NG R e n/a 16 2090 2124 2132 N
+ G NG R i n/a 16 2092 2124 2132 N
+ G NG R s n/a 16 2090 2124 2132 N
+ G NG S b n/a 16 2090 2120 2131 N
+ G NG S e n/a 16 2090 2120 2131 N
+ G NG S i n/a 16 2092 2120 2131 N
+ G NG S s n/a 16 2090 2120 2131 N
+ G NG SH e n/a 16 2090 2120 2131 N
+ G NG SH s n/a 16 2090 2120 2131 N
+ G NG SIL e n/a 16 2090 2118 2128 N
+ G NG SIL s n/a 16 2090 2118 2128 N
+ G NG T b n/a 16 2090 2119 2128 N
+ G NG T e n/a 16 2090 2119 2128 N
+ G NG T s n/a 16 2090 2119 2128 N
+ G NG TH e n/a 16 2090 2120 2128 N
+ G NG TH s n/a 16 2090 2120 2128 N
+ G NG UH b n/a 16 2090 2116 2136 N
+ G NG UH e n/a 16 2090 2112 2137 N
+ G NG UH i n/a 16 2092 2112 2137 N
+ G NG UH s n/a 16 2090 2112 2137 N
+ G NG UW b n/a 16 2090 2116 2138 N
+ G NG UW e n/a 16 2090 2112 2138 N
+ G NG UW i n/a 16 2092 2112 2140 N
+ G NG UW s n/a 16 2090 2112 2138 N
+ G NG V e n/a 16 2090 2120 2128 N
+ G NG V s n/a 16 2090 2120 2128 N
+ G NG W b n/a 16 2090 2117 2129 N
+ G NG W e n/a 16 2090 2117 2129 N
+ G NG W i n/a 16 2092 2117 2129 N
+ G NG W s n/a 16 2090 2117 2129 N
+ G NG Y b n/a 16 2091 2118 2130 N
+ G NG Y e n/a 16 2091 2118 2130 N
+ G NG Y i n/a 16 2092 2118 2130 N
+ G NG Y s n/a 16 2091 2118 2130 N
+ G NG Z b n/a 16 2090 2120 2131 N
+ G NG Z e n/a 16 2090 2120 2131 N
+ G NG Z i n/a 16 2092 2120 2131 N
+ G NG Z s n/a 16 2090 2120 2131 N
+ G NG ZH e n/a 16 2090 2120 2131 N
+ G NG ZH i n/a 16 2092 2120 2131 N
+ G NG ZH s n/a 16 2090 2120 2131 N
+ G OW AA b n/a 16 2089 2113 2140 N
+ G OW AA e n/a 16 2089 2113 2140 N
+ G OW AA i n/a 16 2089 2113 2140 N
+ G OW AA s n/a 16 2089 2113 2140 N
+ G OW AE b n/a 16 2091 2107 2125 N
+ G OW AE e n/a 16 2091 2107 2125 N
+ G OW AE i n/a 16 2091 2107 2125 N
+ G OW AE s n/a 16 2091 2107 2125 N
+ G OW AH b n/a 16 2091 2114 2139 N
+ G OW AH e n/a 16 2091 2110 2134 N
+ G OW AH i n/a 16 2091 2110 2134 N
+ G OW AH s n/a 16 2091 2110 2134 N
+ G OW AO b n/a 16 2089 2116 2138 N
+ G OW AO e n/a 16 2089 2116 2138 N
+ G OW AO i n/a 16 2089 2116 2140 N
+ G OW AO s n/a 16 2089 2116 2138 N
+ G OW AW b n/a 16 2091 2107 2125 N
+ G OW AW e n/a 16 2091 2107 2125 N
+ G OW AW i n/a 16 2091 2107 2125 N
+ G OW AW s n/a 16 2091 2107 2125 N
+ G OW AY b n/a 16 2089 2114 2139 N
+ G OW AY e n/a 16 2089 2114 2139 N
+ G OW AY i n/a 16 2089 2114 2139 N
+ G OW AY s n/a 16 2089 2114 2139 N
+ G OW B b n/a 16 2089 2117 2128 N
+ G OW B e n/a 16 2089 2117 2128 N
+ G OW B s n/a 16 2089 2117 2128 N
+ G OW CH e n/a 16 2089 2120 2128 N
+ G OW CH s n/a 16 2089 2120 2128 N
+ G OW D b n/a 16 2089 2117 2128 N
+ G OW D e n/a 16 2089 2117 2128 N
+ G OW D s n/a 16 2089 2117 2128 N
+ G OW DH e n/a 16 2089 2120 2128 N
+ G OW DH s n/a 16 2089 2120 2128 N
+ G OW EH b n/a 16 2091 2107 2125 N
+ G OW EH e n/a 16 2091 2107 2125 N
+ G OW EH s n/a 16 2091 2107 2125 N
+ G OW ER b n/a 16 2089 2116 2136 N
+ G OW ER e n/a 16 2089 2110 2136 N
+ G OW ER i n/a 16 2089 2110 2136 N
+ G OW ER s n/a 16 2089 2110 2136 N
+ G OW EY b n/a 16 2091 2107 2127 N
+ G OW EY e n/a 16 2091 2107 2127 N
+ G OW EY i n/a 16 2091 2107 2127 N
+ G OW EY s n/a 16 2091 2107 2127 N
+ G OW F b n/a 16 2089 2120 2128 N
+ G OW F e n/a 16 2089 2120 2128 N
+ G OW F s n/a 16 2089 2120 2128 N
+ G OW G e n/a 16 2089 2117 2128 N
+ G OW G s n/a 16 2089 2117 2128 N
+ G OW HH e n/a 16 2089 2120 2128 N
+ G OW HH s n/a 16 2089 2120 2128 N
+ G OW IH b n/a 16 2091 2109 2126 N
+ G OW IH e n/a 16 2091 2107 2126 N
+ G OW IH i n/a 16 2091 2107 2126 N
+ G OW IH s n/a 16 2091 2107 2126 N
+ G OW IY b n/a 16 2091 2109 2126 N
+ G OW IY e n/a 16 2091 2107 2126 N
+ G OW IY i n/a 16 2091 2107 2126 N
+ G OW IY s n/a 16 2091 2107 2126 N
+ G OW JH e n/a 16 2089 2117 2128 N
+ G OW JH s n/a 16 2089 2117 2128 N
+ G OW K b n/a 16 2089 2120 2128 N
+ G OW K e n/a 16 2089 2120 2128 N
+ G OW K s n/a 16 2089 2120 2128 N
+ G OW L b n/a 16 2089 2123 2133 N
+ G OW L e n/a 16 2089 2124 2133 N
+ G OW L i n/a 16 2089 2124 2133 N
+ G OW L s n/a 16 2089 2124 2133 N
+ G OW M b n/a 16 2089 2117 2129 N
+ G OW M e n/a 16 2089 2117 2129 N
+ G OW M i n/a 16 2089 2117 2129 N
+ G OW M s n/a 16 2089 2117 2129 N
+ G OW N b n/a 16 2089 2117 2129 N
+ G OW N e n/a 16 2089 2117 2129 N
+ G OW N i n/a 16 2089 2117 2129 N
+ G OW N s n/a 16 2089 2117 2129 N
+ G OW NG e n/a 16 2089 2117 2129 N
+ G OW NG s n/a 16 2089 2117 2129 N
+ G OW OW b n/a 16 2089 2116 2138 N
+ G OW OW e n/a 16 2089 2116 2138 N
+ G OW OW i n/a 16 2089 2116 2140 N
+ G OW OW s n/a 16 2089 2116 2138 N
+ G OW OY b n/a 16 2089 2116 2138 N
+ G OW OY e n/a 16 2089 2116 2138 N
+ G OW OY s n/a 16 2089 2116 2138 N
+ G OW P b n/a 16 2089 2120 2128 N
+ G OW P e n/a 16 2089 2120 2128 N
+ G OW P s n/a 16 2089 2120 2128 N
+ G OW R b n/a 16 2089 2123 2132 N
+ G OW R e n/a 16 2089 2124 2132 N
+ G OW R i n/a 16 2089 2124 2132 N
+ G OW R s n/a 16 2089 2124 2132 N
+ G OW S b n/a 16 2089 2120 2131 N
+ G OW S e n/a 16 2089 2120 2131 N
+ G OW S i n/a 16 2089 2120 2131 N
+ G OW S s n/a 16 2089 2120 2131 N
+ G OW SH e n/a 16 2089 2120 2131 N
+ G OW SH s n/a 16 2089 2120 2131 N
+ G OW SIL e n/a 16 2089 2120 2128 N
+ G OW SIL s n/a 16 2089 2120 2128 N
+ G OW T b n/a 16 2089 2120 2128 N
+ G OW T e n/a 16 2089 2120 2128 N
+ G OW T s n/a 16 2089 2120 2128 N
+ G OW TH e n/a 16 2089 2120 2128 N
+ G OW TH s n/a 16 2089 2120 2128 N
+ G OW UH b n/a 16 2089 2116 2136 N
+ G OW UH e n/a 16 2089 2116 2136 N
+ G OW UH i n/a 16 2089 2116 2136 N
+ G OW UH s n/a 16 2089 2116 2136 N
+ G OW UW b n/a 16 2089 2116 2138 N
+ G OW UW e n/a 16 2089 2116 2138 N
+ G OW UW i n/a 16 2089 2116 2140 N
+ G OW UW s n/a 16 2089 2116 2138 N
+ G OW V e n/a 16 2089 2120 2128 N
+ G OW V s n/a 16 2089 2120 2128 N
+ G OW W b n/a 16 2089 2117 2129 N
+ G OW W e n/a 16 2089 2117 2129 N
+ G OW W i n/a 16 2089 2117 2129 N
+ G OW W s n/a 16 2089 2117 2129 N
+ G OW Y b n/a 16 2091 2118 2130 N
+ G OW Y e n/a 16 2091 2118 2130 N
+ G OW Y i n/a 16 2091 2118 2130 N
+ G OW Y s n/a 16 2091 2118 2130 N
+ G OW Z b n/a 16 2089 2120 2131 N
+ G OW Z e n/a 16 2089 2120 2131 N
+ G OW Z i n/a 16 2089 2120 2131 N
+ G OW Z s n/a 16 2089 2120 2131 N
+ G OW ZH e n/a 16 2089 2120 2131 N
+ G OW ZH s n/a 16 2089 2120 2131 N
+ G OY AA b n/a 16 2100 2114 2139 N
+ G OY AA e n/a 16 2100 2114 2139 N
+ G OY AA s n/a 16 2100 2114 2139 N
+ G OY AE b n/a 16 2100 2107 2125 N
+ G OY AE e n/a 16 2100 2107 2125 N
+ G OY AE s n/a 16 2100 2107 2125 N
+ G OY AH b n/a 16 2100 2114 2139 N
+ G OY AH e n/a 16 2100 2111 2135 N
+ G OY AH i n/a 16 2100 2111 2135 N
+ G OY AH s n/a 16 2100 2111 2135 N
+ G OY AO b n/a 16 2100 2114 2138 N
+ G OY AO e n/a 16 2100 2114 2138 N
+ G OY AO s n/a 16 2100 2114 2138 N
+ G OY AW b n/a 16 2100 2107 2125 N
+ G OY AW e n/a 16 2100 2107 2125 N
+ G OY AW s n/a 16 2100 2107 2125 N
+ G OY AY b n/a 16 2100 2114 2139 N
+ G OY AY e n/a 16 2100 2114 2139 N
+ G OY AY s n/a 16 2100 2114 2139 N
+ G OY B b n/a 16 2103 2119 2128 N
+ G OY B e n/a 16 2102 2119 2128 N
+ G OY B s n/a 16 2102 2119 2128 N
+ G OY CH e n/a 16 2102 2119 2128 N
+ G OY CH s n/a 16 2102 2119 2128 N
+ G OY D b n/a 16 2103 2119 2128 N
+ G OY D e n/a 16 2102 2119 2128 N
+ G OY D s n/a 16 2102 2119 2128 N
+ G OY DH e n/a 16 2102 2121 2128 N
+ G OY DH s n/a 16 2102 2121 2128 N
+ G OY EH b n/a 16 2100 2107 2125 N
+ G OY EH e n/a 16 2100 2107 2125 N
+ G OY EH i n/a 16 2100 2107 2125 N
+ G OY EH s n/a 16 2100 2107 2125 N
+ G OY ER b n/a 16 2100 2116 2136 N
+ G OY ER e n/a 16 2100 2111 2137 N
+ G OY ER i n/a 16 2100 2111 2137 N
+ G OY ER s n/a 16 2100 2111 2137 N
+ G OY EY b n/a 16 2100 2107 2127 N
+ G OY EY e n/a 16 2100 2107 2127 N
+ G OY EY s n/a 16 2100 2107 2127 N
+ G OY F b n/a 16 2103 2121 2128 N
+ G OY F e n/a 16 2102 2121 2128 N
+ G OY F s n/a 16 2102 2121 2128 N
+ G OY G e n/a 16 2102 2119 2128 N
+ G OY G s n/a 16 2102 2119 2128 N
+ G OY HH e n/a 16 2102 2118 2128 N
+ G OY HH s n/a 16 2102 2118 2128 N
+ G OY IH b n/a 16 2100 2109 2126 N
+ G OY IH e n/a 16 2100 2107 2126 N
+ G OY IH s n/a 16 2100 2107 2126 N
+ G OY IY b n/a 16 2100 2109 2126 N
+ G OY IY e n/a 16 2100 2107 2126 N
+ G OY IY s n/a 16 2100 2107 2126 N
+ G OY JH e n/a 16 2102 2119 2128 N
+ G OY JH s n/a 16 2102 2119 2128 N
+ G OY K b n/a 16 2103 2119 2128 N
+ G OY K e n/a 16 2102 2119 2128 N
+ G OY K s n/a 16 2102 2119 2128 N
+ G OY L b n/a 16 2102 2124 2133 N
+ G OY L e n/a 16 2102 2124 2133 N
+ G OY L s n/a 16 2102 2124 2133 N
+ G OY M b n/a 16 2103 2119 2129 N
+ G OY M e n/a 16 2102 2119 2129 N
+ G OY M s n/a 16 2102 2119 2129 N
+ G OY N b n/a 16 2103 2119 2129 N
+ G OY N e n/a 16 2102 2119 2129 N
+ G OY N s n/a 16 2102 2119 2129 N
+ G OY NG e n/a 16 2102 2119 2129 N
+ G OY NG s n/a 16 2102 2119 2129 N
+ G OY OW b n/a 16 2100 2114 2138 N
+ G OY OW e n/a 16 2100 2114 2138 N
+ G OY OW s n/a 16 2100 2114 2138 N
+ G OY OY b n/a 16 2100 2114 2138 N
+ G OY OY e n/a 16 2100 2114 2138 N
+ G OY OY s n/a 16 2100 2114 2138 N
+ G OY P b n/a 16 2103 2119 2128 N
+ G OY P e n/a 16 2102 2119 2128 N
+ G OY P s n/a 16 2102 2119 2128 N
+ G OY R b n/a 16 2102 2124 2132 N
+ G OY R e n/a 16 2102 2124 2132 N
+ G OY R s n/a 16 2102 2124 2132 N
+ G OY S b n/a 16 2103 2121 2131 N
+ G OY S e n/a 16 2102 2121 2131 N
+ G OY S s n/a 16 2102 2121 2131 N
+ G OY SH e n/a 16 2102 2121 2131 N
+ G OY SH s n/a 16 2102 2121 2131 N
+ G OY SIL e n/a 16 2102 2118 2128 N
+ G OY SIL s n/a 16 2102 2118 2128 N
+ G OY T b n/a 16 2103 2119 2128 N
+ G OY T e n/a 16 2102 2119 2128 N
+ G OY T i n/a 16 2102 2119 2128 N
+ G OY T s n/a 16 2102 2119 2128 N
+ G OY TH e n/a 16 2102 2121 2128 N
+ G OY TH s n/a 16 2102 2121 2128 N
+ G OY UH b n/a 16 2100 2116 2136 N
+ G OY UH e n/a 16 2100 2116 2137 N
+ G OY UH s n/a 16 2100 2116 2137 N
+ G OY UW b n/a 16 2100 2114 2138 N
+ G OY UW e n/a 16 2100 2114 2138 N
+ G OY UW s n/a 16 2100 2114 2138 N
+ G OY V e n/a 16 2102 2121 2128 N
+ G OY V s n/a 16 2102 2121 2128 N
+ G OY W b n/a 16 2102 2117 2129 N
+ G OY W e n/a 16 2102 2117 2129 N
+ G OY W s n/a 16 2102 2117 2129 N
+ G OY Y b n/a 16 2106 2119 2130 N
+ G OY Y e n/a 16 2105 2119 2130 N
+ G OY Y s n/a 16 2105 2119 2130 N
+ G OY Z b n/a 16 2103 2121 2131 N
+ G OY Z e n/a 16 2102 2121 2131 N
+ G OY Z s n/a 16 2102 2121 2131 N
+ G OY ZH e n/a 16 2102 2121 2131 N
+ G OY ZH s n/a 16 2102 2121 2131 N
+ G P AA b n/a 16 2085 2113 2140 N
+ G P AA i n/a 16 2085 2113 2140 N
+ G P AA s n/a 16 2085 2113 2140 N
+ G P AE b n/a 16 2087 2108 2125 N
+ G P AE i n/a 16 2087 2108 2125 N
+ G P AE s n/a 16 2087 2108 2125 N
+ G P AH b n/a 16 2087 2114 2139 N
+ G P AH i n/a 16 2087 2110 2135 N
+ G P AH s n/a 16 2087 2110 2135 N
+ G P AO b n/a 16 2085 2115 2138 N
+ G P AO s n/a 16 2085 2115 2138 N
+ G P AW b n/a 16 2085 2108 2125 N
+ G P AW s n/a 16 2085 2108 2125 N
+ G P AY b n/a 16 2087 2114 2139 N
+ G P AY s n/a 16 2087 2114 2139 N
+ G P B b n/a 16 2087 2117 2128 N
+ G P B s n/a 16 2087 2117 2128 N
+ G P CH s n/a 16 2087 2119 2128 N
+ G P D b n/a 16 2087 2117 2128 N
+ G P D s n/a 16 2087 2117 2128 N
+ G P DH s n/a 16 2087 2120 2128 N
+ G P EH b n/a 16 2087 2108 2125 N
+ G P EH s n/a 16 2087 2108 2125 N
+ G P ER b n/a 16 2085 2116 2136 N
+ G P ER i n/a 16 2085 2110 2136 N
+ G P ER s n/a 16 2085 2110 2136 N
+ G P EY b n/a 16 2087 2108 2127 N
+ G P EY s n/a 16 2087 2108 2127 N
+ G P F b n/a 16 2087 2120 2128 N
+ G P F s n/a 16 2087 2120 2128 N
+ G P G s n/a 16 2087 2117 2128 N
+ G P HH s n/a 16 2087 2118 2128 N
+ G P IH b n/a 16 2087 2109 2126 N
+ G P IH s n/a 16 2087 2109 2126 N
+ G P IY b n/a 16 2087 2109 2126 N
+ G P IY s n/a 16 2087 2109 2126 N
+ G P JH s n/a 16 2087 2117 2128 N
+ G P K b n/a 16 2087 2119 2128 N
+ G P K s n/a 16 2087 2119 2128 N
+ G P L b n/a 16 2084 2122 2133 N
+ G P L s n/a 16 2084 2124 2133 N
+ G P M b n/a 16 2087 2117 2129 N
+ G P M s n/a 16 2087 2117 2129 N
+ G P N b n/a 16 2087 2117 2129 N
+ G P N s n/a 16 2087 2117 2129 N
+ G P NG s n/a 16 2087 2117 2129 N
+ G P OW b n/a 16 2085 2115 2138 N
+ G P OW i n/a 16 2085 2115 2140 N
+ G P OW s n/a 16 2085 2115 2138 N
+ G P OY b n/a 16 2087 2115 2138 N
+ G P OY s n/a 16 2087 2115 2138 N
+ G P P b n/a 16 2087 2119 2128 N
+ G P P s n/a 16 2087 2119 2128 N
+ G P R b n/a 16 2084 2122 2132 N
+ G P R i n/a 16 2084 2124 2132 N
+ G P R s n/a 16 2084 2124 2132 N
+ G P S b n/a 16 2087 2120 2131 N
+ G P S s n/a 16 2087 2120 2131 N
+ G P SH s n/a 16 2087 2120 2131 N
+ G P SIL s n/a 16 2087 2118 2128 N
+ G P T b n/a 16 2087 2119 2128 N
+ G P T s n/a 16 2087 2119 2128 N
+ G P TH s n/a 16 2087 2120 2128 N
+ G P UH b n/a 16 2085 2115 2136 N
+ G P UH i n/a 16 2085 2115 2136 N
+ G P UH s n/a 16 2085 2115 2136 N
+ G P UW b n/a 16 2085 2115 2138 N
+ G P UW s n/a 16 2085 2115 2138 N
+ G P V s n/a 16 2087 2120 2128 N
+ G P W b n/a 16 2084 2117 2129 N
+ G P W s n/a 16 2084 2117 2129 N
+ G P Y b n/a 16 2087 2118 2130 N
+ G P Y s n/a 16 2087 2118 2130 N
+ G P Z b n/a 16 2087 2120 2131 N
+ G P Z s n/a 16 2087 2120 2131 N
+ G P ZH s n/a 16 2087 2120 2131 N
+ G R AA b n/a 16 2094 2113 2140 N
+ G R AA e n/a 16 2094 2113 2140 N
+ G R AA i n/a 16 2094 2113 2140 N
+ G R AA s n/a 16 2094 2113 2140 N
+ G R AE b n/a 16 2093 2107 2125 N
+ G R AE e n/a 16 2093 2107 2125 N
+ G R AE i n/a 16 2093 2107 2125 N
+ G R AE s n/a 16 2093 2107 2125 N
+ G R AH b n/a 16 2093 2114 2139 N
+ G R AH e n/a 16 2093 2110 2135 N
+ G R AH i n/a 16 2093 2110 2135 N
+ G R AH s n/a 16 2093 2110 2135 N
+ G R AO b n/a 16 2094 2116 2138 N
+ G R AO e n/a 16 2094 2116 2138 N
+ G R AO i n/a 16 2094 2116 2140 N
+ G R AO s n/a 16 2094 2116 2138 N
+ G R AW b n/a 16 2093 2107 2125 N
+ G R AW e n/a 16 2093 2107 2125 N
+ G R AW s n/a 16 2093 2107 2125 N
+ G R AY b n/a 16 2094 2114 2139 N
+ G R AY e n/a 16 2094 2114 2139 N
+ G R AY i n/a 16 2094 2114 2139 N
+ G R AY s n/a 16 2094 2114 2139 N
+ G R B b n/a 16 2094 2117 2128 N
+ G R B e n/a 16 2094 2117 2128 N
+ G R B s n/a 16 2094 2117 2128 N
+ G R CH e n/a 16 2094 2120 2128 N
+ G R CH s n/a 16 2094 2120 2128 N
+ G R D b n/a 16 2094 2117 2128 N
+ G R D e n/a 16 2094 2117 2128 N
+ G R D s n/a 16 2094 2117 2128 N
+ G R DH e n/a 16 2094 2120 2128 N
+ G R DH s n/a 16 2094 2120 2128 N
+ G R EH b n/a 16 2093 2107 2125 N
+ G R EH e n/a 16 2093 2107 2125 N
+ G R EH i n/a 16 2093 2107 2125 N
+ G R EH s n/a 16 2093 2107 2125 N
+ G R ER b n/a 16 2094 2116 2136 N
+ G R ER e n/a 16 2094 2110 2137 N
+ G R ER i n/a 16 2094 2110 2137 N
+ G R ER s n/a 16 2094 2110 2137 N
+ G R EY b n/a 16 2093 2107 2127 N
+ G R EY e n/a 16 2093 2107 2127 N
+ G R EY i n/a 16 2093 2107 2127 N
+ G R EY s n/a 16 2093 2107 2127 N
+ G R F b n/a 16 2094 2120 2128 N
+ G R F e n/a 16 2094 2120 2128 N
+ G R F s n/a 16 2094 2120 2128 N
+ G R G e n/a 16 2094 2117 2128 N
+ G R G s n/a 16 2094 2117 2128 N
+ G R HH e n/a 16 2094 2120 2128 N
+ G R HH i n/a 16 2094 2120 2128 N
+ G R HH s n/a 16 2094 2120 2128 N
+ G R IH b n/a 16 2093 2109 2126 N
+ G R IH e n/a 16 2093 2107 2126 N
+ G R IH i n/a 16 2093 2107 2126 N
+ G R IH s n/a 16 2093 2107 2126 N
+ G R IY b n/a 16 2093 2109 2126 N
+ G R IY e n/a 16 2093 2107 2126 N
+ G R IY i n/a 16 2093 2107 2126 N
+ G R IY s n/a 16 2093 2107 2126 N
+ G R JH e n/a 16 2094 2117 2128 N
+ G R JH s n/a 16 2094 2117 2128 N
+ G R K b n/a 16 2094 2120 2128 N
+ G R K e n/a 16 2094 2120 2128 N
+ G R K s n/a 16 2094 2120 2128 N
+ G R L b n/a 16 2094 2123 2133 N
+ G R L e n/a 16 2094 2124 2133 N
+ G R L i n/a 16 2094 2124 2133 N
+ G R L s n/a 16 2094 2124 2133 N
+ G R M b n/a 16 2094 2117 2129 N
+ G R M e n/a 16 2094 2117 2129 N
+ G R M i n/a 16 2094 2117 2129 N
+ G R M s n/a 16 2094 2117 2129 N
+ G R N b n/a 16 2094 2117 2129 N
+ G R N e n/a 16 2094 2117 2129 N
+ G R N i n/a 16 2094 2117 2129 N
+ G R N s n/a 16 2094 2117 2129 N
+ G R NG e n/a 16 2094 2117 2129 N
+ G R NG s n/a 16 2094 2117 2129 N
+ G R OW b n/a 16 2094 2116 2138 N
+ G R OW e n/a 16 2094 2116 2138 N
+ G R OW i n/a 16 2094 2116 2140 N
+ G R OW s n/a 16 2094 2116 2138 N
+ G R OY b n/a 16 2094 2116 2138 N
+ G R OY e n/a 16 2094 2116 2138 N
+ G R OY i n/a 16 2094 2116 2140 N
+ G R OY s n/a 16 2094 2116 2138 N
+ G R P b n/a 16 2094 2120 2128 N
+ G R P e n/a 16 2094 2120 2128 N
+ G R P s n/a 16 2094 2120 2128 N
+ G R R b n/a 16 2094 2123 2132 N
+ G R R e n/a 16 2094 2124 2132 N
+ G R R i n/a 16 2094 2124 2132 N
+ G R R s n/a 16 2094 2124 2132 N
+ G R S b n/a 16 2094 2120 2131 N
+ G R S e n/a 16 2094 2120 2131 N
+ G R S i n/a 16 2094 2120 2131 N
+ G R S s n/a 16 2094 2120 2131 N
+ G R SH e n/a 16 2094 2120 2131 N
+ G R SH s n/a 16 2094 2120 2131 N
+ G R SIL e n/a 16 2094 2120 2128 N
+ G R SIL s n/a 16 2094 2120 2128 N
+ G R T b n/a 16 2094 2120 2128 N
+ G R T e n/a 16 2094 2120 2128 N
+ G R T s n/a 16 2094 2120 2128 N
+ G R TH e n/a 16 2094 2120 2128 N
+ G R TH s n/a 16 2094 2120 2128 N
+ G R UH b n/a 16 2094 2116 2136 N
+ G R UH e n/a 16 2094 2116 2137 N
+ G R UH s n/a 16 2094 2116 2137 N
+ G R UW b n/a 16 2094 2116 2138 N
+ G R UW e n/a 16 2094 2116 2138 N
+ G R UW i n/a 16 2094 2116 2140 N
+ G R UW s n/a 16 2094 2116 2138 N
+ G R V e n/a 16 2094 2120 2128 N
+ G R V s n/a 16 2094 2120 2128 N
+ G R W b n/a 16 2094 2117 2129 N
+ G R W e n/a 16 2094 2117 2129 N
+ G R W i n/a 16 2094 2117 2129 N
+ G R W s n/a 16 2094 2117 2129 N
+ G R Y b n/a 16 2093 2118 2130 N
+ G R Y e n/a 16 2093 2118 2130 N
+ G R Y i n/a 16 2093 2118 2130 N
+ G R Y s n/a 16 2093 2118 2130 N
+ G R Z b n/a 16 2094 2120 2131 N
+ G R Z e n/a 16 2094 2120 2131 N
+ G R Z i n/a 16 2094 2120 2131 N
+ G R Z s n/a 16 2094 2120 2131 N
+ G R ZH e n/a 16 2094 2120 2131 N
+ G R ZH s n/a 16 2094 2120 2131 N
+ G S AA b n/a 16 2086 2113 2140 N
+ G S AA i n/a 16 2086 2113 2140 N
+ G S AA s n/a 16 2086 2113 2140 N
+ G S AE b n/a 16 2088 2108 2125 N
+ G S AE i n/a 16 2088 2108 2125 N
+ G S AE s n/a 16 2088 2108 2125 N
+ G S AH b n/a 16 2088 2114 2139 N
+ G S AH i n/a 16 2088 2110 2135 N
+ G S AH s n/a 16 2088 2110 2135 N
+ G S AO b n/a 16 2086 2115 2138 N
+ G S AO i n/a 16 2086 2115 2140 N
+ G S AO s n/a 16 2086 2115 2138 N
+ G S AW b n/a 16 2086 2108 2125 N
+ G S AW i n/a 16 2086 2108 2125 N
+ G S AW s n/a 16 2086 2108 2125 N
+ G S AY b n/a 16 2088 2114 2139 N
+ G S AY i n/a 16 2088 2114 2139 N
+ G S AY s n/a 16 2088 2114 2139 N
+ G S B b n/a 16 2088 2117 2128 N
+ G S B s n/a 16 2088 2117 2128 N
+ G S CH s n/a 16 2088 2119 2128 N
+ G S D b n/a 16 2088 2117 2128 N
+ G S D s n/a 16 2088 2117 2128 N
+ G S DH s n/a 16 2088 2120 2128 N
+ G S EH b n/a 16 2088 2108 2125 N
+ G S EH i n/a 16 2088 2108 2125 N
+ G S EH s n/a 16 2088 2108 2125 N
+ G S ER b n/a 16 2086 2116 2136 N
+ G S ER i n/a 16 2086 2110 2136 N
+ G S ER s n/a 16 2086 2110 2136 N
+ G S EY b n/a 16 2088 2108 2127 N
+ G S EY i n/a 16 2088 2108 2127 N
+ G S EY s n/a 16 2088 2108 2127 N
+ G S F b n/a 16 2088 2120 2128 N
+ G S F s n/a 16 2088 2120 2128 N
+ G S G s n/a 16 2088 2117 2128 N
+ G S HH s n/a 16 2088 2118 2128 N
+ G S IH b n/a 16 2088 2109 2126 N
+ G S IH i n/a 16 2088 2109 2126 N
+ G S IH s n/a 16 2088 2109 2126 N
+ G S IY b n/a 16 2088 2109 2126 N
+ G S IY i n/a 16 2088 2109 2126 N
+ G S IY s n/a 16 2088 2109 2126 N
+ G S JH s n/a 16 2088 2117 2128 N
+ G S K b n/a 16 2088 2119 2128 N
+ G S K s n/a 16 2088 2119 2128 N
+ G S L b n/a 16 2086 2122 2133 N
+ G S L i n/a 16 2086 2124 2133 N
+ G S L s n/a 16 2086 2124 2133 N
+ G S M b n/a 16 2088 2117 2129 N
+ G S M s n/a 16 2088 2117 2129 N
+ G S N b n/a 16 2088 2117 2129 N
+ G S N s n/a 16 2088 2117 2129 N
+ G S NG s n/a 16 2088 2117 2129 N
+ G S OW b n/a 16 2086 2115 2138 N
+ G S OW i n/a 16 2086 2115 2140 N
+ G S OW s n/a 16 2086 2115 2138 N
+ G S OY b n/a 16 2088 2115 2138 N
+ G S OY s n/a 16 2088 2115 2138 N
+ G S P b n/a 16 2088 2119 2128 N
+ G S P s n/a 16 2088 2119 2128 N
+ G S R b n/a 16 2086 2122 2132 N
+ G S R i n/a 16 2086 2124 2132 N
+ G S R s n/a 16 2086 2124 2132 N
+ G S S b n/a 16 2088 2120 2131 N
+ G S S s n/a 16 2088 2120 2131 N
+ G S SH s n/a 16 2088 2120 2131 N
+ G S SIL s n/a 16 2088 2118 2128 N
+ G S T b n/a 16 2088 2119 2128 N
+ G S T s n/a 16 2088 2119 2128 N
+ G S TH s n/a 16 2088 2120 2128 N
+ G S UH b n/a 16 2086 2115 2136 N
+ G S UH i n/a 16 2086 2115 2136 N
+ G S UH s n/a 16 2086 2115 2136 N
+ G S UW b n/a 16 2086 2115 2138 N
+ G S UW s n/a 16 2086 2115 2138 N
+ G S V s n/a 16 2088 2120 2128 N
+ G S W b n/a 16 2086 2117 2129 N
+ G S W s n/a 16 2086 2117 2129 N
+ G S Y b n/a 16 2088 2118 2130 N
+ G S Y s n/a 16 2088 2118 2130 N
+ G S Z b n/a 16 2088 2120 2131 N
+ G S Z s n/a 16 2088 2120 2131 N
+ G S ZH s n/a 16 2088 2120 2131 N
+ G SH AA b n/a 16 2086 2113 2140 N
+ G SH AA s n/a 16 2086 2113 2140 N
+ G SH AE b n/a 16 2088 2108 2125 N
+ G SH AE s n/a 16 2088 2108 2125 N
+ G SH AH b n/a 16 2088 2114 2139 N
+ G SH AH i n/a 16 2088 2110 2135 N
+ G SH AH s n/a 16 2088 2110 2135 N
+ G SH AO b n/a 16 2086 2115 2138 N
+ G SH AO s n/a 16 2086 2115 2138 N
+ G SH AW b n/a 16 2086 2108 2125 N
+ G SH AW s n/a 16 2086 2108 2125 N
+ G SH AY b n/a 16 2088 2114 2139 N
+ G SH AY s n/a 16 2088 2114 2139 N
+ G SH B b n/a 16 2088 2117 2128 N
+ G SH B s n/a 16 2088 2117 2128 N
+ G SH CH s n/a 16 2088 2119 2128 N
+ G SH D b n/a 16 2088 2117 2128 N
+ G SH D s n/a 16 2088 2117 2128 N
+ G SH DH s n/a 16 2088 2120 2128 N
+ G SH EH b n/a 16 2088 2108 2125 N
+ G SH EH s n/a 16 2088 2108 2125 N
+ G SH ER b n/a 16 2086 2116 2136 N
+ G SH ER i n/a 16 2086 2110 2136 N
+ G SH ER s n/a 16 2086 2110 2136 N
+ G SH EY b n/a 16 2088 2108 2127 N
+ G SH EY s n/a 16 2088 2108 2127 N
+ G SH F b n/a 16 2088 2120 2128 N
+ G SH F s n/a 16 2088 2120 2128 N
+ G SH G s n/a 16 2088 2117 2128 N
+ G SH HH s n/a 16 2088 2118 2128 N
+ G SH IH b n/a 16 2088 2109 2126 N
+ G SH IH s n/a 16 2088 2109 2126 N
+ G SH IY b n/a 16 2088 2109 2126 N
+ G SH IY s n/a 16 2088 2109 2126 N
+ G SH JH s n/a 16 2088 2117 2128 N
+ G SH K b n/a 16 2088 2119 2128 N
+ G SH K s n/a 16 2088 2119 2128 N
+ G SH L b n/a 16 2086 2122 2133 N
+ G SH L s n/a 16 2086 2124 2133 N
+ G SH M b n/a 16 2088 2117 2129 N
+ G SH M s n/a 16 2088 2117 2129 N
+ G SH N b n/a 16 2088 2117 2129 N
+ G SH N s n/a 16 2088 2117 2129 N
+ G SH NG s n/a 16 2088 2117 2129 N
+ G SH OW b n/a 16 2086 2115 2138 N
+ G SH OW s n/a 16 2086 2115 2138 N
+ G SH OY b n/a 16 2088 2115 2138 N
+ G SH OY s n/a 16 2088 2115 2138 N
+ G SH P b n/a 16 2088 2119 2128 N
+ G SH P s n/a 16 2088 2119 2128 N
+ G SH R b n/a 16 2086 2122 2132 N
+ G SH R s n/a 16 2086 2124 2132 N
+ G SH S b n/a 16 2088 2120 2131 N
+ G SH S s n/a 16 2088 2120 2131 N
+ G SH SH s n/a 16 2088 2120 2131 N
+ G SH SIL s n/a 16 2088 2118 2128 N
+ G SH T b n/a 16 2088 2119 2128 N
+ G SH T s n/a 16 2088 2119 2128 N
+ G SH TH s n/a 16 2088 2120 2128 N
+ G SH UH b n/a 16 2086 2115 2136 N
+ G SH UH s n/a 16 2086 2115 2136 N
+ G SH UW b n/a 16 2086 2115 2138 N
+ G SH UW s n/a 16 2086 2115 2138 N
+ G SH V s n/a 16 2088 2120 2128 N
+ G SH W b n/a 16 2086 2117 2129 N
+ G SH W s n/a 16 2086 2117 2129 N
+ G SH Y b n/a 16 2088 2118 2130 N
+ G SH Y s n/a 16 2088 2118 2130 N
+ G SH Z b n/a 16 2088 2120 2131 N
+ G SH Z s n/a 16 2088 2120 2131 N
+ G SH ZH s n/a 16 2088 2120 2131 N
+ G SIL AA b n/a 16 2085 2113 2140 N
+ G SIL AA s n/a 16 2085 2113 2140 N
+ G SIL AE b n/a 16 2087 2108 2125 N
+ G SIL AE s n/a 16 2087 2108 2125 N
+ G SIL AH b n/a 16 2087 2114 2139 N
+ G SIL AH s n/a 16 2087 2110 2135 N
+ G SIL AO b n/a 16 2085 2115 2138 N
+ G SIL AO s n/a 16 2085 2115 2138 N
+ G SIL AW b n/a 16 2085 2108 2125 N
+ G SIL AW s n/a 16 2085 2108 2125 N
+ G SIL AY b n/a 16 2087 2114 2139 N
+ G SIL AY s n/a 16 2087 2114 2139 N
+ G SIL B b n/a 16 2087 2117 2128 N
+ G SIL B s n/a 16 2087 2117 2128 N
+ G SIL CH s n/a 16 2087 2119 2128 N
+ G SIL D b n/a 16 2087 2117 2128 N
+ G SIL D s n/a 16 2087 2117 2128 N
+ G SIL DH s n/a 16 2087 2120 2128 N
+ G SIL EH b n/a 16 2087 2108 2125 N
+ G SIL EH s n/a 16 2087 2108 2125 N
+ G SIL ER b n/a 16 2085 2116 2136 N
+ G SIL ER s n/a 16 2085 2110 2136 N
+ G SIL EY b n/a 16 2087 2108 2127 N
+ G SIL EY s n/a 16 2087 2108 2127 N
+ G SIL F b n/a 16 2087 2120 2128 N
+ G SIL F s n/a 16 2087 2120 2128 N
+ G SIL G s n/a 16 2087 2117 2128 N
+ G SIL HH s n/a 16 2087 2118 2128 N
+ G SIL IH b n/a 16 2087 2109 2126 N
+ G SIL IH s n/a 16 2087 2109 2126 N
+ G SIL IY b n/a 16 2087 2109 2126 N
+ G SIL IY s n/a 16 2087 2109 2126 N
+ G SIL JH s n/a 16 2087 2117 2128 N
+ G SIL K b n/a 16 2087 2119 2128 N
+ G SIL K s n/a 16 2087 2119 2128 N
+ G SIL L b n/a 16 2084 2122 2133 N
+ G SIL L s n/a 16 2084 2124 2133 N
+ G SIL M b n/a 16 2087 2117 2129 N
+ G SIL M s n/a 16 2087 2117 2129 N
+ G SIL N b n/a 16 2087 2117 2129 N
+ G SIL N s n/a 16 2087 2117 2129 N
+ G SIL NG s n/a 16 2087 2117 2129 N
+ G SIL OW b n/a 16 2085 2115 2138 N
+ G SIL OW s n/a 16 2085 2115 2138 N
+ G SIL OY b n/a 16 2087 2115 2138 N
+ G SIL OY s n/a 16 2087 2115 2138 N
+ G SIL P b n/a 16 2087 2119 2128 N
+ G SIL P s n/a 16 2087 2119 2128 N
+ G SIL R b n/a 16 2084 2122 2132 N
+ G SIL R s n/a 16 2084 2124 2132 N
+ G SIL S b n/a 16 2087 2120 2131 N
+ G SIL S s n/a 16 2087 2120 2131 N
+ G SIL SH s n/a 16 2087 2120 2131 N
+ G SIL SIL s n/a 16 2087 2118 2128 N
+ G SIL T b n/a 16 2087 2119 2128 N
+ G SIL T s n/a 16 2087 2119 2128 N
+ G SIL TH s n/a 16 2087 2120 2128 N
+ G SIL UH b n/a 16 2085 2115 2136 N
+ G SIL UH s n/a 16 2085 2115 2136 N
+ G SIL UW b n/a 16 2085 2115 2138 N
+ G SIL UW s n/a 16 2085 2115 2138 N
+ G SIL V s n/a 16 2087 2120 2128 N
+ G SIL W b n/a 16 2084 2117 2129 N
+ G SIL W s n/a 16 2084 2117 2129 N
+ G SIL Y b n/a 16 2087 2118 2130 N
+ G SIL Y s n/a 16 2087 2118 2130 N
+ G SIL Z b n/a 16 2087 2120 2131 N
+ G SIL Z s n/a 16 2087 2120 2131 N
+ G SIL ZH s n/a 16 2087 2120 2131 N
+ G T AA b n/a 16 2085 2113 2140 N
+ G T AA i n/a 16 2085 2113 2140 N
+ G T AA s n/a 16 2085 2113 2140 N
+ G T AE b n/a 16 2087 2108 2125 N
+ G T AE s n/a 16 2087 2108 2125 N
+ G T AH b n/a 16 2087 2114 2139 N
+ G T AH i n/a 16 2087 2110 2135 N
+ G T AH s n/a 16 2087 2110 2135 N
+ G T AO b n/a 16 2085 2115 2138 N
+ G T AO i n/a 16 2085 2115 2140 N
+ G T AO s n/a 16 2085 2115 2138 N
+ G T AW b n/a 16 2085 2108 2125 N
+ G T AW i n/a 16 2085 2108 2125 N
+ G T AW s n/a 16 2085 2108 2125 N
+ G T AY b n/a 16 2087 2114 2139 N
+ G T AY i n/a 16 2087 2114 2139 N
+ G T AY s n/a 16 2087 2114 2139 N
+ G T B b n/a 16 2087 2117 2128 N
+ G T B s n/a 16 2087 2117 2128 N
+ G T CH s n/a 16 2087 2119 2128 N
+ G T D b n/a 16 2087 2117 2128 N
+ G T D s n/a 16 2087 2117 2128 N
+ G T DH s n/a 16 2087 2120 2128 N
+ G T EH b n/a 16 2087 2108 2125 N
+ G T EH i n/a 16 2087 2108 2125 N
+ G T EH s n/a 16 2087 2108 2125 N
+ G T ER b n/a 16 2085 2116 2136 N
+ G T ER i n/a 16 2085 2110 2136 N
+ G T ER s n/a 16 2085 2110 2136 N
+ G T EY b n/a 16 2087 2108 2127 N
+ G T EY i n/a 16 2087 2108 2127 N
+ G T EY s n/a 16 2087 2108 2127 N
+ G T F b n/a 16 2087 2120 2128 N
+ G T F s n/a 16 2087 2120 2128 N
+ G T G s n/a 16 2087 2117 2128 N
+ G T HH s n/a 16 2087 2118 2128 N
+ G T IH b n/a 16 2087 2109 2126 N
+ G T IH i n/a 16 2087 2109 2126 N
+ G T IH s n/a 16 2087 2109 2126 N
+ G T IY b n/a 16 2087 2109 2126 N
+ G T IY i n/a 16 2087 2109 2126 N
+ G T IY s n/a 16 2087 2109 2126 N
+ G T JH s n/a 16 2087 2117 2128 N
+ G T K b n/a 16 2087 2119 2128 N
+ G T K s n/a 16 2087 2119 2128 N
+ G T L b n/a 16 2084 2122 2133 N
+ G T L s n/a 16 2084 2124 2133 N
+ G T M b n/a 16 2087 2117 2129 N
+ G T M s n/a 16 2087 2117 2129 N
+ G T N b n/a 16 2087 2117 2129 N
+ G T N s n/a 16 2087 2117 2129 N
+ G T NG s n/a 16 2087 2117 2129 N
+ G T OW b n/a 16 2085 2115 2138 N
+ G T OW i n/a 16 2085 2115 2140 N
+ G T OW s n/a 16 2085 2115 2138 N
+ G T OY b n/a 16 2087 2115 2138 N
+ G T OY s n/a 16 2087 2115 2138 N
+ G T P b n/a 16 2087 2119 2128 N
+ G T P s n/a 16 2087 2119 2128 N
+ G T R b n/a 16 2084 2122 2132 N
+ G T R i n/a 16 2084 2124 2132 N
+ G T R s n/a 16 2084 2124 2132 N
+ G T S b n/a 16 2087 2120 2131 N
+ G T S s n/a 16 2087 2120 2131 N
+ G T SH s n/a 16 2087 2120 2131 N
+ G T SIL s n/a 16 2087 2118 2128 N
+ G T T b n/a 16 2087 2119 2128 N
+ G T T s n/a 16 2087 2119 2128 N
+ G T TH s n/a 16 2087 2120 2128 N
+ G T UH b n/a 16 2085 2115 2136 N
+ G T UH s n/a 16 2085 2115 2136 N
+ G T UW b n/a 16 2085 2115 2138 N
+ G T UW s n/a 16 2085 2115 2138 N
+ G T V i n/a 16 2087 2120 2128 N
+ G T V s n/a 16 2087 2120 2128 N
+ G T W b n/a 16 2084 2117 2129 N
+ G T W s n/a 16 2084 2117 2129 N
+ G T Y b n/a 16 2087 2118 2130 N
+ G T Y s n/a 16 2087 2118 2130 N
+ G T Z b n/a 16 2087 2120 2131 N
+ G T Z s n/a 16 2087 2120 2131 N
+ G T ZH s n/a 16 2087 2120 2131 N
+ G TH AA b n/a 16 2085 2113 2140 N
+ G TH AA s n/a 16 2085 2113 2140 N
+ G TH AE b n/a 16 2088 2108 2125 N
+ G TH AE s n/a 16 2088 2108 2125 N
+ G TH AH b n/a 16 2088 2114 2139 N
+ G TH AH s n/a 16 2088 2110 2135 N
+ G TH AO b n/a 16 2085 2116 2138 N
+ G TH AO s n/a 16 2085 2116 2138 N
+ G TH AW b n/a 16 2085 2108 2125 N
+ G TH AW i n/a 16 2085 2108 2125 N
+ G TH AW s n/a 16 2085 2108 2125 N
+ G TH AY b n/a 16 2088 2114 2139 N
+ G TH AY s n/a 16 2088 2114 2139 N
+ G TH B b n/a 16 2088 2117 2128 N
+ G TH B s n/a 16 2088 2117 2128 N
+ G TH CH s n/a 16 2088 2119 2128 N
+ G TH D b n/a 16 2088 2117 2128 N
+ G TH D s n/a 16 2088 2117 2128 N
+ G TH DH s n/a 16 2088 2120 2128 N
+ G TH EH b n/a 16 2088 2108 2125 N
+ G TH EH s n/a 16 2088 2108 2125 N
+ G TH ER b n/a 16 2085 2116 2136 N
+ G TH ER i n/a 16 2085 2110 2136 N
+ G TH ER s n/a 16 2085 2110 2136 N
+ G TH EY b n/a 16 2088 2108 2127 N
+ G TH EY i n/a 16 2088 2108 2127 N
+ G TH EY s n/a 16 2088 2108 2127 N
+ G TH F b n/a 16 2088 2120 2128 N
+ G TH F s n/a 16 2088 2120 2128 N
+ G TH G s n/a 16 2088 2117 2128 N
+ G TH HH s n/a 16 2088 2118 2128 N
+ G TH IH b n/a 16 2088 2109 2126 N
+ G TH IH i n/a 16 2088 2109 2126 N
+ G TH IH s n/a 16 2088 2109 2126 N
+ G TH IY b n/a 16 2088 2109 2126 N
+ G TH IY s n/a 16 2088 2109 2126 N
+ G TH JH s n/a 16 2088 2117 2128 N
+ G TH K b n/a 16 2088 2119 2128 N
+ G TH K s n/a 16 2088 2119 2128 N
+ G TH L b n/a 16 2084 2122 2133 N
+ G TH L s n/a 16 2084 2124 2133 N
+ G TH M b n/a 16 2088 2117 2129 N
+ G TH M s n/a 16 2088 2117 2129 N
+ G TH N b n/a 16 2088 2117 2129 N
+ G TH N s n/a 16 2088 2117 2129 N
+ G TH NG s n/a 16 2088 2117 2129 N
+ G TH OW b n/a 16 2085 2116 2138 N
+ G TH OW i n/a 16 2085 2116 2140 N
+ G TH OW s n/a 16 2085 2116 2138 N
+ G TH OY b n/a 16 2088 2116 2138 N
+ G TH OY s n/a 16 2088 2116 2138 N
+ G TH P b n/a 16 2088 2119 2128 N
+ G TH P s n/a 16 2088 2119 2128 N
+ G TH R b n/a 16 2084 2122 2132 N
+ G TH R s n/a 16 2084 2124 2132 N
+ G TH S b n/a 16 2088 2120 2131 N
+ G TH S s n/a 16 2088 2120 2131 N
+ G TH SH s n/a 16 2088 2120 2131 N
+ G TH SIL s n/a 16 2088 2118 2128 N
+ G TH T b n/a 16 2088 2119 2128 N
+ G TH T s n/a 16 2088 2119 2128 N
+ G TH TH s n/a 16 2088 2120 2128 N
+ G TH UH b n/a 16 2085 2115 2136 N
+ G TH UH s n/a 16 2085 2115 2136 N
+ G TH UW b n/a 16 2085 2116 2138 N
+ G TH UW s n/a 16 2085 2116 2138 N
+ G TH V s n/a 16 2088 2120 2128 N
+ G TH W b n/a 16 2084 2117 2129 N
+ G TH W s n/a 16 2084 2117 2129 N
+ G TH Y b n/a 16 2088 2118 2130 N
+ G TH Y s n/a 16 2088 2118 2130 N
+ G TH Z b n/a 16 2088 2120 2131 N
+ G TH Z s n/a 16 2088 2120 2131 N
+ G TH ZH s n/a 16 2088 2120 2131 N
+ G UH AA b n/a 16 2089 2113 2140 N
+ G UH AA e n/a 16 2089 2113 2140 N
+ G UH AA s n/a 16 2089 2113 2140 N
+ G UH AE b n/a 16 2091 2107 2125 N
+ G UH AE e n/a 16 2091 2107 2125 N
+ G UH AE s n/a 16 2091 2107 2125 N
+ G UH AH b n/a 16 2091 2114 2139 N
+ G UH AH e n/a 16 2091 2110 2135 N
+ G UH AH i n/a 16 2091 2110 2135 N
+ G UH AH s n/a 16 2091 2110 2135 N
+ G UH AO b n/a 16 2089 2116 2138 N
+ G UH AO e n/a 16 2089 2116 2138 N
+ G UH AO s n/a 16 2089 2116 2138 N
+ G UH AW b n/a 16 2091 2107 2125 N
+ G UH AW e n/a 16 2091 2107 2125 N
+ G UH AW s n/a 16 2091 2107 2125 N
+ G UH AY b n/a 16 2089 2114 2139 N
+ G UH AY e n/a 16 2089 2114 2139 N
+ G UH AY s n/a 16 2089 2114 2139 N
+ G UH B b n/a 16 2089 2119 2128 N
+ G UH B e n/a 16 2089 2119 2128 N
+ G UH B s n/a 16 2089 2119 2128 N
+ G UH CH e n/a 16 2089 2120 2128 N
+ G UH CH s n/a 16 2089 2120 2128 N
+ G UH D b n/a 16 2089 2119 2128 N
+ G UH D e n/a 16 2089 2119 2128 N
+ G UH D s n/a 16 2089 2119 2128 N
+ G UH DH e n/a 16 2089 2120 2128 N
+ G UH DH s n/a 16 2089 2120 2128 N
+ G UH EH b n/a 16 2091 2107 2125 N
+ G UH EH e n/a 16 2091 2107 2125 N
+ G UH EH s n/a 16 2091 2107 2125 N
+ G UH ER b n/a 16 2089 2116 2136 N
+ G UH ER e n/a 16 2089 2110 2137 N
+ G UH ER i n/a 16 2089 2110 2137 N
+ G UH ER s n/a 16 2089 2110 2137 N
+ G UH EY b n/a 16 2091 2107 2127 N
+ G UH EY e n/a 16 2091 2107 2127 N
+ G UH EY s n/a 16 2091 2107 2127 N
+ G UH F b n/a 16 2089 2120 2128 N
+ G UH F e n/a 16 2089 2120 2128 N
+ G UH F s n/a 16 2089 2120 2128 N
+ G UH G e n/a 16 2089 2119 2128 N
+ G UH G s n/a 16 2089 2119 2128 N
+ G UH HH e n/a 16 2089 2120 2128 N
+ G UH HH s n/a 16 2089 2120 2128 N
+ G UH IH b n/a 16 2091 2109 2126 N
+ G UH IH e n/a 16 2091 2107 2127 N
+ G UH IH s n/a 16 2091 2107 2127 N
+ G UH IY b n/a 16 2091 2109 2126 N
+ G UH IY e n/a 16 2091 2107 2127 N
+ G UH IY i n/a 16 2091 2107 2127 N
+ G UH IY s n/a 16 2091 2107 2127 N
+ G UH JH e n/a 16 2089 2119 2128 N
+ G UH JH s n/a 16 2089 2119 2128 N
+ G UH K b n/a 16 2089 2120 2128 N
+ G UH K e n/a 16 2089 2120 2128 N
+ G UH K s n/a 16 2089 2120 2128 N
+ G UH L b n/a 16 2089 2123 2133 N
+ G UH L e n/a 16 2089 2124 2133 N
+ G UH L s n/a 16 2089 2124 2133 N
+ G UH M b n/a 16 2089 2119 2129 N
+ G UH M e n/a 16 2089 2119 2129 N
+ G UH M s n/a 16 2089 2119 2129 N
+ G UH N b n/a 16 2089 2119 2129 N
+ G UH N e n/a 16 2089 2119 2129 N
+ G UH N s n/a 16 2089 2119 2129 N
+ G UH NG e n/a 16 2089 2119 2129 N
+ G UH NG s n/a 16 2089 2119 2129 N
+ G UH OW b n/a 16 2089 2116 2138 N
+ G UH OW e n/a 16 2089 2116 2138 N
+ G UH OW i n/a 16 2089 2116 2140 N
+ G UH OW s n/a 16 2089 2116 2138 N
+ G UH OY b n/a 16 2089 2116 2138 N
+ G UH OY e n/a 16 2089 2116 2138 N
+ G UH OY s n/a 16 2089 2116 2138 N
+ G UH P b n/a 16 2089 2120 2128 N
+ G UH P e n/a 16 2089 2120 2128 N
+ G UH P s n/a 16 2089 2120 2128 N
+ G UH R b n/a 16 2089 2123 2132 N
+ G UH R e n/a 16 2089 2124 2132 N
+ G UH R s n/a 16 2089 2124 2132 N
+ G UH S b n/a 16 2089 2120 2131 N
+ G UH S e n/a 16 2089 2120 2131 N
+ G UH S i n/a 16 2089 2120 2131 N
+ G UH S s n/a 16 2089 2120 2131 N
+ G UH SH e n/a 16 2089 2120 2131 N
+ G UH SH s n/a 16 2089 2120 2131 N
+ G UH SIL e n/a 16 2089 2120 2128 N
+ G UH SIL s n/a 16 2089 2120 2128 N
+ G UH T b n/a 16 2089 2120 2128 N
+ G UH T e n/a 16 2089 2120 2128 N
+ G UH T s n/a 16 2089 2120 2128 N
+ G UH TH e n/a 16 2089 2120 2128 N
+ G UH TH s n/a 16 2089 2120 2128 N
+ G UH UH b n/a 16 2089 2116 2136 N
+ G UH UH e n/a 16 2089 2116 2137 N
+ G UH UH s n/a 16 2089 2116 2137 N
+ G UH UW b n/a 16 2089 2116 2138 N
+ G UH UW e n/a 16 2089 2116 2138 N
+ G UH UW i n/a 16 2089 2116 2140 N
+ G UH UW s n/a 16 2089 2116 2138 N
+ G UH V e n/a 16 2089 2120 2128 N
+ G UH V s n/a 16 2089 2120 2128 N
+ G UH W b n/a 16 2089 2117 2129 N
+ G UH W e n/a 16 2089 2117 2129 N
+ G UH W s n/a 16 2089 2117 2129 N
+ G UH Y b n/a 16 2091 2118 2130 N
+ G UH Y e n/a 16 2091 2118 2130 N
+ G UH Y s n/a 16 2091 2118 2130 N
+ G UH Z b n/a 16 2089 2120 2131 N
+ G UH Z e n/a 16 2089 2120 2131 N
+ G UH Z s n/a 16 2089 2120 2131 N
+ G UH ZH e n/a 16 2089 2120 2131 N
+ G UH ZH s n/a 16 2089 2120 2131 N
+ G UW AA b n/a 16 2089 2113 2140 N
+ G UW AA e n/a 16 2089 2113 2140 N
+ G UW AA i n/a 16 2089 2113 2140 N
+ G UW AA s n/a 16 2089 2113 2140 N
+ G UW AE b n/a 16 2091 2107 2125 N
+ G UW AE e n/a 16 2091 2107 2125 N
+ G UW AE i n/a 16 2091 2107 2125 N
+ G UW AE s n/a 16 2091 2107 2125 N
+ G UW AH b n/a 16 2091 2114 2139 N
+ G UW AH e n/a 16 2091 2110 2134 N
+ G UW AH i n/a 16 2091 2110 2134 N
+ G UW AH s n/a 16 2091 2110 2134 N
+ G UW AO b n/a 16 2089 2116 2138 N
+ G UW AO e n/a 16 2089 2116 2138 N
+ G UW AO i n/a 16 2089 2116 2140 N
+ G UW AO s n/a 16 2089 2116 2138 N
+ G UW AW b n/a 16 2091 2107 2125 N
+ G UW AW e n/a 16 2091 2107 2125 N
+ G UW AW s n/a 16 2091 2107 2125 N
+ G UW AY b n/a 16 2089 2114 2139 N
+ G UW AY e n/a 16 2089 2114 2139 N
+ G UW AY i n/a 16 2089 2114 2139 N
+ G UW AY s n/a 16 2089 2114 2139 N
+ G UW B b n/a 16 2089 2119 2128 N
+ G UW B e n/a 16 2089 2119 2128 N
+ G UW B s n/a 16 2089 2119 2128 N
+ G UW CH e n/a 16 2089 2120 2128 N
+ G UW CH s n/a 16 2089 2120 2128 N
+ G UW D b n/a 16 2089 2119 2128 N
+ G UW D e n/a 16 2089 2119 2128 N
+ G UW D s n/a 16 2089 2119 2128 N
+ G UW DH e n/a 16 2089 2120 2128 N
+ G UW DH s n/a 16 2089 2120 2128 N
+ G UW EH b n/a 16 2091 2107 2125 N
+ G UW EH e n/a 16 2091 2107 2125 N
+ G UW EH i n/a 16 2091 2107 2125 N
+ G UW EH s n/a 16 2091 2107 2125 N
+ G UW ER b n/a 16 2089 2116 2136 N
+ G UW ER e n/a 16 2089 2110 2136 N
+ G UW ER i n/a 16 2089 2110 2136 N
+ G UW ER s n/a 16 2089 2110 2136 N
+ G UW EY b n/a 16 2091 2107 2127 N
+ G UW EY e n/a 16 2091 2107 2127 N
+ G UW EY i n/a 16 2091 2107 2127 N
+ G UW EY s n/a 16 2091 2107 2127 N
+ G UW F b n/a 16 2089 2120 2128 N
+ G UW F e n/a 16 2089 2120 2128 N
+ G UW F s n/a 16 2089 2120 2128 N
+ G UW G e n/a 16 2089 2119 2128 N
+ G UW G s n/a 16 2089 2119 2128 N
+ G UW HH e n/a 16 2089 2120 2128 N
+ G UW HH s n/a 16 2089 2120 2128 N
+ G UW IH b n/a 16 2091 2109 2126 N
+ G UW IH e n/a 16 2091 2107 2127 N
+ G UW IH i n/a 16 2091 2107 2127 N
+ G UW IH s n/a 16 2091 2107 2127 N
+ G UW IY b n/a 16 2091 2109 2126 N
+ G UW IY e n/a 16 2091 2107 2127 N
+ G UW IY i n/a 16 2091 2107 2127 N
+ G UW IY s n/a 16 2091 2107 2127 N
+ G UW JH e n/a 16 2089 2119 2128 N
+ G UW JH i n/a 16 2089 2119 2128 N
+ G UW JH s n/a 16 2089 2119 2128 N
+ G UW K b n/a 16 2089 2120 2128 N
+ G UW K e n/a 16 2089 2120 2128 N
+ G UW K i n/a 16 2089 2120 2128 N
+ G UW K s n/a 16 2089 2120 2128 N
+ G UW L b n/a 16 2089 2123 2133 N
+ G UW L e n/a 16 2089 2124 2133 N
+ G UW L i n/a 16 2089 2124 2133 N
+ G UW L s n/a 16 2089 2124 2133 N
+ G UW M b n/a 16 2089 2119 2129 N
+ G UW M e n/a 16 2089 2119 2129 N
+ G UW M i n/a 16 2089 2119 2129 N
+ G UW M s n/a 16 2089 2119 2129 N
+ G UW N b n/a 16 2089 2119 2129 N
+ G UW N e n/a 16 2089 2119 2129 N
+ G UW N i n/a 16 2089 2119 2129 N
+ G UW N s n/a 16 2089 2119 2129 N
+ G UW NG e n/a 16 2089 2119 2129 N
+ G UW NG s n/a 16 2089 2119 2129 N
+ G UW OW b n/a 16 2089 2116 2138 N
+ G UW OW e n/a 16 2089 2116 2138 N
+ G UW OW i n/a 16 2089 2116 2140 N
+ G UW OW s n/a 16 2089 2116 2138 N
+ G UW OY b n/a 16 2089 2116 2138 N
+ G UW OY e n/a 16 2089 2116 2138 N
+ G UW OY s n/a 16 2089 2116 2138 N
+ G UW P b n/a 16 2089 2120 2128 N
+ G UW P e n/a 16 2089 2120 2128 N
+ G UW P s n/a 16 2089 2120 2128 N
+ G UW R b n/a 16 2089 2123 2132 N
+ G UW R e n/a 16 2089 2124 2132 N
+ G UW R i n/a 16 2089 2124 2132 N
+ G UW R s n/a 16 2089 2124 2132 N
+ G UW S b n/a 16 2089 2120 2131 N
+ G UW S e n/a 16 2089 2120 2131 N
+ G UW S s n/a 16 2089 2120 2131 N
+ G UW SH e n/a 16 2089 2120 2131 N
+ G UW SH s n/a 16 2089 2120 2131 N
+ G UW SIL e n/a 16 2089 2120 2128 N
+ G UW SIL s n/a 16 2089 2120 2128 N
+ G UW T b n/a 16 2089 2120 2128 N
+ G UW T e n/a 16 2089 2120 2128 N
+ G UW T s n/a 16 2089 2120 2128 N
+ G UW TH e n/a 16 2089 2120 2128 N
+ G UW TH s n/a 16 2089 2120 2128 N
+ G UW UH b n/a 16 2089 2116 2136 N
+ G UW UH e n/a 16 2089 2116 2136 N
+ G UW UH i n/a 16 2089 2116 2136 N
+ G UW UH s n/a 16 2089 2116 2136 N
+ G UW UW b n/a 16 2089 2116 2138 N
+ G UW UW e n/a 16 2089 2116 2138 N
+ G UW UW i n/a 16 2089 2116 2140 N
+ G UW UW s n/a 16 2089 2116 2138 N
+ G UW V e n/a 16 2089 2120 2128 N
+ G UW V s n/a 16 2089 2120 2128 N
+ G UW W b n/a 16 2089 2117 2129 N
+ G UW W e n/a 16 2089 2117 2129 N
+ G UW W i n/a 16 2089 2117 2129 N
+ G UW W s n/a 16 2089 2117 2129 N
+ G UW Y b n/a 16 2091 2118 2130 N
+ G UW Y e n/a 16 2091 2118 2130 N
+ G UW Y i n/a 16 2091 2118 2130 N
+ G UW Y s n/a 16 2091 2118 2130 N
+ G UW Z b n/a 16 2089 2120 2131 N
+ G UW Z e n/a 16 2089 2120 2131 N
+ G UW Z i n/a 16 2089 2120 2131 N
+ G UW Z s n/a 16 2089 2120 2131 N
+ G UW ZH e n/a 16 2089 2120 2131 N
+ G UW ZH s n/a 16 2089 2120 2131 N
+ G V AA b n/a 16 2085 2113 2140 N
+ G V AA s n/a 16 2085 2113 2140 N
+ G V AE b n/a 16 2088 2108 2125 N
+ G V AE s n/a 16 2088 2108 2125 N
+ G V AH b n/a 16 2088 2114 2139 N
+ G V AH i n/a 16 2088 2110 2135 N
+ G V AH s n/a 16 2088 2110 2135 N
+ G V AO b n/a 16 2085 2116 2138 N
+ G V AO s n/a 16 2085 2116 2138 N
+ G V AW b n/a 16 2085 2108 2125 N
+ G V AW s n/a 16 2085 2108 2125 N
+ G V AY b n/a 16 2088 2114 2139 N
+ G V AY s n/a 16 2088 2114 2139 N
+ G V B b n/a 16 2088 2117 2128 N
+ G V B s n/a 16 2088 2117 2128 N
+ G V CH s n/a 16 2088 2119 2128 N
+ G V D b n/a 16 2088 2117 2128 N
+ G V D s n/a 16 2088 2117 2128 N
+ G V DH s n/a 16 2088 2120 2128 N
+ G V EH b n/a 16 2088 2108 2125 N
+ G V EH i n/a 16 2088 2108 2125 N
+ G V EH s n/a 16 2088 2108 2125 N
+ G V ER b n/a 16 2085 2116 2136 N
+ G V ER i n/a 16 2085 2110 2136 N
+ G V ER s n/a 16 2085 2110 2136 N
+ G V EY b n/a 16 2088 2108 2127 N
+ G V EY s n/a 16 2088 2108 2127 N
+ G V F b n/a 16 2088 2120 2128 N
+ G V F s n/a 16 2088 2120 2128 N
+ G V G s n/a 16 2088 2117 2128 N
+ G V HH s n/a 16 2088 2118 2128 N
+ G V IH b n/a 16 2088 2109 2126 N
+ G V IH s n/a 16 2088 2109 2126 N
+ G V IY b n/a 16 2088 2109 2126 N
+ G V IY s n/a 16 2088 2109 2126 N
+ G V JH s n/a 16 2088 2117 2128 N
+ G V K b n/a 16 2088 2119 2128 N
+ G V K s n/a 16 2088 2119 2128 N
+ G V L b n/a 16 2084 2122 2133 N
+ G V L s n/a 16 2084 2124 2133 N
+ G V M b n/a 16 2088 2117 2129 N
+ G V M s n/a 16 2088 2117 2129 N
+ G V N b n/a 16 2088 2117 2129 N
+ G V N s n/a 16 2088 2117 2129 N
+ G V NG s n/a 16 2088 2117 2129 N
+ G V OW b n/a 16 2085 2116 2138 N
+ G V OW s n/a 16 2085 2116 2138 N
+ G V OY b n/a 16 2088 2116 2138 N
+ G V OY s n/a 16 2088 2116 2138 N
+ G V P b n/a 16 2088 2119 2128 N
+ G V P s n/a 16 2088 2119 2128 N
+ G V R b n/a 16 2084 2122 2132 N
+ G V R i n/a 16 2084 2124 2132 N
+ G V R s n/a 16 2084 2124 2132 N
+ G V S b n/a 16 2088 2120 2131 N
+ G V S s n/a 16 2088 2120 2131 N
+ G V SH s n/a 16 2088 2120 2131 N
+ G V SIL s n/a 16 2088 2118 2128 N
+ G V T b n/a 16 2088 2119 2128 N
+ G V T s n/a 16 2088 2119 2128 N
+ G V TH s n/a 16 2088 2120 2128 N
+ G V UH b n/a 16 2085 2116 2136 N
+ G V UH s n/a 16 2085 2116 2136 N
+ G V UW b n/a 16 2085 2116 2138 N
+ G V UW s n/a 16 2085 2116 2138 N
+ G V V s n/a 16 2088 2120 2128 N
+ G V W b n/a 16 2084 2117 2129 N
+ G V W s n/a 16 2084 2117 2129 N
+ G V Y b n/a 16 2088 2118 2130 N
+ G V Y s n/a 16 2088 2118 2130 N
+ G V Z b n/a 16 2088 2120 2131 N
+ G V Z s n/a 16 2088 2120 2131 N
+ G V ZH s n/a 16 2088 2120 2131 N
+ G W AA b n/a 16 2089 2113 2140 N
+ G W AA s n/a 16 2089 2113 2140 N
+ G W AE b n/a 16 2091 2107 2125 N
+ G W AE s n/a 16 2091 2107 2125 N
+ G W AH b n/a 16 2091 2114 2139 N
+ G W AH s n/a 16 2091 2110 2135 N
+ G W AO b n/a 16 2089 2116 2138 N
+ G W AO s n/a 16 2089 2116 2138 N
+ G W AW b n/a 16 2091 2107 2125 N
+ G W AW s n/a 16 2091 2107 2125 N
+ G W AY b n/a 16 2089 2114 2139 N
+ G W AY s n/a 16 2089 2114 2139 N
+ G W B b n/a 16 2089 2117 2128 N
+ G W B s n/a 16 2089 2117 2128 N
+ G W CH s n/a 16 2089 2120 2128 N
+ G W D b n/a 16 2089 2117 2128 N
+ G W D s n/a 16 2089 2117 2128 N
+ G W DH s n/a 16 2089 2120 2128 N
+ G W EH b n/a 16 2091 2107 2125 N
+ G W EH s n/a 16 2091 2107 2125 N
+ G W ER b n/a 16 2089 2116 2136 N
+ G W ER s n/a 16 2089 2110 2136 N
+ G W EY b n/a 16 2091 2107 2127 N
+ G W EY s n/a 16 2091 2107 2127 N
+ G W F b n/a 16 2089 2120 2128 N
+ G W F s n/a 16 2089 2120 2128 N
+ G W G s n/a 16 2089 2117 2128 N
+ G W HH s n/a 16 2089 2120 2128 N
+ G W IH b n/a 16 2091 2109 2126 N
+ G W IH s n/a 16 2091 2107 2126 N
+ G W IY b n/a 16 2091 2109 2126 N
+ G W IY s n/a 16 2091 2107 2126 N
+ G W JH s n/a 16 2089 2117 2128 N
+ G W K b n/a 16 2089 2120 2128 N
+ G W K s n/a 16 2089 2120 2128 N
+ G W L b n/a 16 2089 2123 2133 N
+ G W L s n/a 16 2089 2124 2133 N
+ G W M b n/a 16 2089 2117 2129 N
+ G W M s n/a 16 2089 2117 2129 N
+ G W N b n/a 16 2089 2117 2129 N
+ G W N s n/a 16 2089 2117 2129 N
+ G W NG s n/a 16 2089 2117 2129 N
+ G W OW b n/a 16 2089 2116 2138 N
+ G W OW s n/a 16 2089 2116 2138 N
+ G W OY b n/a 16 2089 2116 2138 N
+ G W OY s n/a 16 2089 2116 2138 N
+ G W P b n/a 16 2089 2120 2128 N
+ G W P s n/a 16 2089 2120 2128 N
+ G W R b n/a 16 2089 2123 2132 N
+ G W R s n/a 16 2089 2124 2132 N
+ G W S b n/a 16 2089 2120 2131 N
+ G W S s n/a 16 2089 2120 2131 N
+ G W SH s n/a 16 2089 2120 2131 N
+ G W SIL s n/a 16 2089 2120 2128 N
+ G W T b n/a 16 2089 2120 2128 N
+ G W T s n/a 16 2089 2120 2128 N
+ G W TH s n/a 16 2089 2120 2128 N
+ G W UH b n/a 16 2089 2116 2136 N
+ G W UH s n/a 16 2089 2116 2136 N
+ G W UW b n/a 16 2089 2116 2138 N
+ G W UW s n/a 16 2089 2116 2138 N
+ G W V s n/a 16 2089 2120 2128 N
+ G W W b n/a 16 2089 2117 2129 N
+ G W W s n/a 16 2089 2117 2129 N
+ G W Y b n/a 16 2091 2118 2130 N
+ G W Y s n/a 16 2091 2118 2130 N
+ G W Z b n/a 16 2089 2120 2131 N
+ G W Z s n/a 16 2089 2120 2131 N
+ G W ZH s n/a 16 2089 2120 2131 N
+ G Y AA b n/a 16 2102 2114 2139 N
+ G Y AA s n/a 16 2102 2114 2139 N
+ G Y AE b n/a 16 2105 2107 2125 N
+ G Y AE s n/a 16 2105 2107 2125 N
+ G Y AH b n/a 16 2105 2114 2139 N
+ G Y AH s n/a 16 2105 2111 2135 N
+ G Y AO b n/a 16 2102 2114 2138 N
+ G Y AO s n/a 16 2102 2114 2138 N
+ G Y AW b n/a 16 2105 2107 2125 N
+ G Y AW s n/a 16 2105 2107 2125 N
+ G Y AY b n/a 16 2102 2114 2139 N
+ G Y AY s n/a 16 2102 2114 2139 N
+ G Y B b n/a 16 2099 2119 2128 N
+ G Y B s n/a 16 2099 2119 2128 N
+ G Y CH s n/a 16 2099 2119 2128 N
+ G Y D b n/a 16 2099 2119 2128 N
+ G Y D i n/a 16 2099 2119 2128 N
+ G Y D s n/a 16 2099 2119 2128 N
+ G Y DH s n/a 16 2099 2121 2128 N
+ G Y EH b n/a 16 2105 2107 2125 N
+ G Y EH s n/a 16 2105 2107 2125 N
+ G Y ER b n/a 16 2102 2116 2136 N
+ G Y ER s n/a 16 2102 2111 2137 N
+ G Y EY b n/a 16 2105 2107 2127 N
+ G Y EY s n/a 16 2105 2107 2127 N
+ G Y F b n/a 16 2099 2121 2128 N
+ G Y F s n/a 16 2099 2121 2128 N
+ G Y G s n/a 16 2099 2119 2128 N
+ G Y HH s n/a 16 2099 2118 2128 N
+ G Y IH b n/a 16 2105 2109 2126 N
+ G Y IH s n/a 16 2105 2107 2127 N
+ G Y IY b n/a 16 2105 2109 2126 N
+ G Y IY s n/a 16 2105 2107 2127 N
+ G Y JH s n/a 16 2099 2119 2128 N
+ G Y K b n/a 16 2099 2119 2128 N
+ G Y K s n/a 16 2099 2119 2128 N
+ G Y L b n/a 16 2099 2124 2133 N
+ G Y L s n/a 16 2099 2124 2133 N
+ G Y M b n/a 16 2099 2119 2129 N
+ G Y M s n/a 16 2099 2119 2129 N
+ G Y N b n/a 16 2099 2119 2129 N
+ G Y N s n/a 16 2099 2119 2129 N
+ G Y NG s n/a 16 2099 2119 2129 N
+ G Y OW b n/a 16 2102 2114 2138 N
+ G Y OW s n/a 16 2102 2114 2138 N
+ G Y OY b n/a 16 2102 2114 2138 N
+ G Y OY s n/a 16 2102 2114 2138 N
+ G Y P b n/a 16 2099 2119 2128 N
+ G Y P s n/a 16 2099 2119 2128 N
+ G Y R b n/a 16 2099 2124 2132 N
+ G Y R s n/a 16 2099 2124 2132 N
+ G Y S b n/a 16 2099 2121 2131 N
+ G Y S s n/a 16 2099 2121 2131 N
+ G Y SH s n/a 16 2099 2121 2131 N
+ G Y SIL s n/a 16 2099 2118 2128 N
+ G Y T b n/a 16 2099 2119 2128 N
+ G Y T s n/a 16 2099 2119 2128 N
+ G Y TH s n/a 16 2099 2121 2128 N
+ G Y UH b n/a 16 2102 2116 2136 N
+ G Y UH s n/a 16 2102 2116 2137 N
+ G Y UW b n/a 16 2102 2114 2138 N
+ G Y UW s n/a 16 2102 2114 2138 N
+ G Y V s n/a 16 2099 2121 2128 N
+ G Y W b n/a 16 2099 2117 2129 N
+ G Y W s n/a 16 2099 2117 2129 N
+ G Y Y b n/a 16 2099 2119 2130 N
+ G Y Y s n/a 16 2099 2119 2130 N
+ G Y Z b n/a 16 2099 2121 2131 N
+ G Y Z s n/a 16 2099 2121 2131 N
+ G Y ZH s n/a 16 2099 2121 2131 N
+ G Z AA b n/a 16 2086 2113 2140 N
+ G Z AA i n/a 16 2086 2113 2140 N
+ G Z AA s n/a 16 2086 2113 2140 N
+ G Z AE b n/a 16 2088 2108 2125 N
+ G Z AE s n/a 16 2088 2108 2125 N
+ G Z AH b n/a 16 2088 2114 2139 N
+ G Z AH i n/a 16 2088 2110 2135 N
+ G Z AH s n/a 16 2088 2110 2135 N
+ G Z AO b n/a 16 2086 2115 2138 N
+ G Z AO s n/a 16 2086 2115 2138 N
+ G Z AW b n/a 16 2086 2108 2125 N
+ G Z AW s n/a 16 2086 2108 2125 N
+ G Z AY b n/a 16 2088 2114 2139 N
+ G Z AY i n/a 16 2088 2114 2139 N
+ G Z AY s n/a 16 2088 2114 2139 N
+ G Z B b n/a 16 2088 2117 2128 N
+ G Z B s n/a 16 2088 2117 2128 N
+ G Z CH s n/a 16 2088 2119 2128 N
+ G Z D b n/a 16 2088 2117 2128 N
+ G Z D s n/a 16 2088 2117 2128 N
+ G Z DH s n/a 16 2088 2120 2128 N
+ G Z EH b n/a 16 2088 2108 2125 N
+ G Z EH s n/a 16 2088 2108 2125 N
+ G Z ER b n/a 16 2086 2116 2136 N
+ G Z ER i n/a 16 2086 2110 2136 N
+ G Z ER s n/a 16 2086 2110 2136 N
+ G Z EY b n/a 16 2088 2108 2127 N
+ G Z EY i n/a 16 2088 2108 2127 N
+ G Z EY s n/a 16 2088 2108 2127 N
+ G Z F b n/a 16 2088 2120 2128 N
+ G Z F s n/a 16 2088 2120 2128 N
+ G Z G s n/a 16 2088 2117 2128 N
+ G Z HH s n/a 16 2088 2118 2128 N
+ G Z IH b n/a 16 2088 2109 2126 N
+ G Z IH s n/a 16 2088 2109 2126 N
+ G Z IY b n/a 16 2088 2109 2126 N
+ G Z IY s n/a 16 2088 2109 2126 N
+ G Z JH s n/a 16 2088 2117 2128 N
+ G Z K b n/a 16 2088 2119 2128 N
+ G Z K s n/a 16 2088 2119 2128 N
+ G Z L b n/a 16 2086 2122 2133 N
+ G Z L s n/a 16 2086 2124 2133 N
+ G Z M b n/a 16 2088 2117 2129 N
+ G Z M s n/a 16 2088 2117 2129 N
+ G Z N b n/a 16 2088 2117 2129 N
+ G Z N s n/a 16 2088 2117 2129 N
+ G Z NG s n/a 16 2088 2117 2129 N
+ G Z OW b n/a 16 2086 2115 2138 N
+ G Z OW i n/a 16 2086 2115 2140 N
+ G Z OW s n/a 16 2086 2115 2138 N
+ G Z OY b n/a 16 2088 2115 2138 N
+ G Z OY s n/a 16 2088 2115 2138 N
+ G Z P b n/a 16 2088 2119 2128 N
+ G Z P s n/a 16 2088 2119 2128 N
+ G Z R b n/a 16 2086 2122 2132 N
+ G Z R i n/a 16 2086 2124 2132 N
+ G Z R s n/a 16 2086 2124 2132 N
+ G Z S b n/a 16 2088 2120 2131 N
+ G Z S s n/a 16 2088 2120 2131 N
+ G Z SH s n/a 16 2088 2120 2131 N
+ G Z SIL s n/a 16 2088 2118 2128 N
+ G Z T b n/a 16 2088 2119 2128 N
+ G Z T s n/a 16 2088 2119 2128 N
+ G Z TH s n/a 16 2088 2120 2128 N
+ G Z UH b n/a 16 2086 2116 2136 N
+ G Z UH s n/a 16 2086 2116 2136 N
+ G Z UW b n/a 16 2086 2115 2138 N
+ G Z UW s n/a 16 2086 2115 2138 N
+ G Z V s n/a 16 2088 2120 2128 N
+ G Z W b n/a 16 2086 2117 2129 N
+ G Z W s n/a 16 2086 2117 2129 N
+ G Z Y b n/a 16 2088 2118 2130 N
+ G Z Y s n/a 16 2088 2118 2130 N
+ G Z Z b n/a 16 2088 2120 2131 N
+ G Z Z s n/a 16 2088 2120 2131 N
+ G Z ZH s n/a 16 2088 2120 2131 N
+ G ZH AA b n/a 16 2086 2113 2140 N
+ G ZH AA s n/a 16 2086 2113 2140 N
+ G ZH AE b n/a 16 2088 2108 2125 N
+ G ZH AE s n/a 16 2088 2108 2125 N
+ G ZH AH b n/a 16 2088 2114 2139 N
+ G ZH AH s n/a 16 2088 2110 2135 N
+ G ZH AO b n/a 16 2086 2115 2138 N
+ G ZH AO s n/a 16 2086 2115 2138 N
+ G ZH AW b n/a 16 2086 2108 2125 N
+ G ZH AW s n/a 16 2086 2108 2125 N
+ G ZH AY b n/a 16 2088 2114 2139 N
+ G ZH AY s n/a 16 2088 2114 2139 N
+ G ZH B b n/a 16 2088 2117 2128 N
+ G ZH B s n/a 16 2088 2117 2128 N
+ G ZH CH s n/a 16 2088 2119 2128 N
+ G ZH D b n/a 16 2088 2117 2128 N
+ G ZH D s n/a 16 2088 2117 2128 N
+ G ZH DH s n/a 16 2088 2120 2128 N
+ G ZH EH b n/a 16 2088 2108 2125 N
+ G ZH EH s n/a 16 2088 2108 2125 N
+ G ZH ER b n/a 16 2086 2116 2136 N
+ G ZH ER s n/a 16 2086 2110 2136 N
+ G ZH EY b n/a 16 2088 2108 2127 N
+ G ZH EY s n/a 16 2088 2108 2127 N
+ G ZH F b n/a 16 2088 2120 2128 N
+ G ZH F s n/a 16 2088 2120 2128 N
+ G ZH G s n/a 16 2088 2117 2128 N
+ G ZH HH s n/a 16 2088 2118 2128 N
+ G ZH IH b n/a 16 2088 2109 2126 N
+ G ZH IH s n/a 16 2088 2109 2126 N
+ G ZH IY b n/a 16 2088 2109 2126 N
+ G ZH IY s n/a 16 2088 2109 2126 N
+ G ZH JH s n/a 16 2088 2117 2128 N
+ G ZH K b n/a 16 2088 2119 2128 N
+ G ZH K s n/a 16 2088 2119 2128 N
+ G ZH L b n/a 16 2086 2122 2133 N
+ G ZH L s n/a 16 2086 2124 2133 N
+ G ZH M b n/a 16 2088 2117 2129 N
+ G ZH M s n/a 16 2088 2117 2129 N
+ G ZH N b n/a 16 2088 2117 2129 N
+ G ZH N s n/a 16 2088 2117 2129 N
+ G ZH NG s n/a 16 2088 2117 2129 N
+ G ZH OW b n/a 16 2086 2115 2138 N
+ G ZH OW s n/a 16 2086 2115 2138 N
+ G ZH OY b n/a 16 2088 2115 2138 N
+ G ZH OY s n/a 16 2088 2115 2138 N
+ G ZH P b n/a 16 2088 2119 2128 N
+ G ZH P s n/a 16 2088 2119 2128 N
+ G ZH R b n/a 16 2086 2122 2132 N
+ G ZH R s n/a 16 2086 2124 2132 N
+ G ZH S b n/a 16 2088 2120 2131 N
+ G ZH S s n/a 16 2088 2120 2131 N
+ G ZH SH s n/a 16 2088 2120 2131 N
+ G ZH SIL s n/a 16 2088 2118 2128 N
+ G ZH T b n/a 16 2088 2119 2128 N
+ G ZH T s n/a 16 2088 2119 2128 N
+ G ZH TH s n/a 16 2088 2120 2128 N
+ G ZH UH b n/a 16 2086 2116 2136 N
+ G ZH UH s n/a 16 2086 2116 2136 N
+ G ZH UW b n/a 16 2086 2115 2138 N
+ G ZH UW s n/a 16 2086 2115 2138 N
+ G ZH V s n/a 16 2088 2120 2128 N
+ G ZH W b n/a 16 2086 2117 2129 N
+ G ZH W s n/a 16 2086 2117 2129 N
+ G ZH Y b n/a 16 2088 2118 2130 N
+ G ZH Y s n/a 16 2088 2118 2130 N
+ G ZH Z b n/a 16 2088 2120 2131 N
+ G ZH Z s n/a 16 2088 2120 2131 N
+ G ZH ZH s n/a 16 2088 2120 2131 N
+ HH AA AA b n/a 17 2181 2199 2254 N
+ HH AA AA i n/a 17 2181 2199 2254 N
+ HH AA AE b n/a 17 2174 2215 2263 N
+ HH AA AH b n/a 17 2174 2197 2253 N
+ HH AA AH i n/a 17 2174 2197 2253 N
+ HH AA AO b n/a 17 2181 2201 2256 N
+ HH AA AO i n/a 17 2181 2201 2256 N
+ HH AA AW b n/a 17 2174 2214 2268 N
+ HH AA AY b n/a 17 2181 2200 2255 N
+ HH AA B b n/a 17 2174 2215 2265 N
+ HH AA CH b n/a 17 2174 2215 2265 N
+ HH AA EH b n/a 17 2174 2215 2264 N
+ HH AA ER b n/a 17 2178 2211 2257 N
+ HH AA ER i n/a 17 2178 2211 2257 N
+ HH AA EY b n/a 17 2174 2215 2265 N
+ HH AA EY i n/a 17 2174 2215 2265 N
+ HH AA F b n/a 17 2174 2215 2265 N
+ HH AA G b n/a 17 2174 2215 2265 N
+ HH AA IH b n/a 17 2177 2233 2242 N
+ HH AA IH i n/a 17 2177 2233 2242 N
+ HH AA IY b n/a 17 2176 2227 2252 N
+ HH AA IY i n/a 17 2176 2227 2252 N
+ HH AA K i n/a 17 2174 2215 2265 N
+ HH AA L b n/a 17 2178 2197 2244 N
+ HH AA M b n/a 17 2174 2215 2265 N
+ HH AA M i n/a 17 2174 2215 2265 N
+ HH AA N b n/a 17 2174 2215 2265 N
+ HH AA OW b n/a 17 2181 2201 2256 N
+ HH AA OW i n/a 17 2181 2201 2256 N
+ HH AA OY b n/a 17 2181 2201 2256 N
+ HH AA P b n/a 17 2174 2215 2265 N
+ HH AA R b n/a 17 2178 2197 2254 N
+ HH AA T b n/a 17 2174 2215 2265 N
+ HH AA UH b n/a 17 2178 2205 2247 N
+ HH AA UH i n/a 17 2178 2205 2247 N
+ HH AA UW b n/a 17 2178 2205 2247 N
+ HH AA UW i n/a 17 2178 2205 2247 N
+ HH AA V b n/a 17 2174 2215 2265 N
+ HH AA W b n/a 17 2178 2207 2244 N
+ HH AA Y b n/a 17 2176 2227 2250 N
+ HH AE AA b n/a 17 2184 2199 2254 N
+ HH AE AE b n/a 17 2172 2215 2263 N
+ HH AE AE i n/a 17 2172 2215 2263 N
+ HH AE AH b n/a 17 2172 2197 2253 N
+ HH AE AH i n/a 17 2172 2197 2253 N
+ HH AE AO b n/a 17 2184 2201 2256 N
+ HH AE AW b n/a 17 2172 2214 2268 N
+ HH AE AW i n/a 17 2172 2214 2268 N
+ HH AE AY b n/a 17 2185 2200 2255 N
+ HH AE AY i n/a 17 2185 2197 2253 N
+ HH AE B b n/a 17 2172 2215 2265 N
+ HH AE CH b n/a 17 2172 2215 2265 N
+ HH AE EH b n/a 17 2172 2215 2264 N
+ HH AE ER b n/a 17 2183 2211 2257 N
+ HH AE ER i n/a 17 2185 2211 2257 N
+ HH AE EY b n/a 17 2172 2215 2265 N
+ HH AE EY i n/a 17 2172 2215 2265 N
+ HH AE F b n/a 17 2172 2215 2265 N
+ HH AE G b n/a 17 2172 2215 2265 N
+ HH AE IH b n/a 17 2173 2233 2242 N
+ HH AE IH i n/a 17 2173 2233 2242 N
+ HH AE IY b n/a 17 2173 2227 2251 N
+ HH AE IY i n/a 17 2173 2227 2251 N
+ HH AE L b n/a 17 2178 2197 2244 N
+ HH AE M b n/a 17 2172 2215 2265 N
+ HH AE N b n/a 17 2172 2215 2265 N
+ HH AE OW b n/a 17 2184 2201 2256 N
+ HH AE OW i n/a 17 2184 2201 2256 N
+ HH AE OY b n/a 17 2185 2201 2256 N
+ HH AE P b n/a 17 2172 2215 2265 N
+ HH AE R b n/a 17 2184 2197 2254 N
+ HH AE T b n/a 17 2172 2215 2265 N
+ HH AE UH b n/a 17 2183 2206 2247 N
+ HH AE UW b n/a 17 2183 2206 2246 N
+ HH AE V b n/a 17 2172 2215 2265 N
+ HH AE W b n/a 17 2178 2207 2244 N
+ HH AE Y b n/a 17 2173 2229 2250 N
+ HH AE Y i n/a 17 2173 2229 2250 N
+ HH AH AA b n/a 17 2180 2199 2254 N
+ HH AH AA e n/a 17 2180 2199 2254 N
+ HH AH AA i n/a 17 2181 2199 2254 N
+ HH AH AE b n/a 17 2166 2219 2261 N
+ HH AH AE e n/a 17 2166 2219 2261 N
+ HH AH AE i n/a 17 2166 2218 2261 N
+ HH AH AH b n/a 17 2167 2197 2253 N
+ HH AH AH e n/a 17 2166 2197 2253 N
+ HH AH AH i n/a 17 2166 2197 2253 N
+ HH AH AO b n/a 17 2181 2201 2256 N
+ HH AH AO e n/a 17 2181 2201 2256 N
+ HH AH AO i n/a 17 2181 2201 2256 N
+ HH AH AW b n/a 17 2167 2214 2268 N
+ HH AH AW e n/a 17 2167 2214 2268 N
+ HH AH AW i n/a 17 2167 2214 2268 N
+ HH AH AY b n/a 17 2180 2200 2255 N
+ HH AH AY e n/a 17 2180 2197 2253 N
+ HH AH AY i n/a 17 2180 2197 2253 N
+ HH AH B b n/a 17 2166 2217 2265 N
+ HH AH B e n/a 17 2166 2217 2265 N
+ HH AH CH b n/a 17 2166 2217 2265 N
+ HH AH CH e n/a 17 2166 2217 2265 N
+ HH AH D e n/a 17 2166 2217 2265 N
+ HH AH DH e n/a 17 2166 2217 2265 N
+ HH AH EH b n/a 17 2166 2217 2264 N
+ HH AH EH e n/a 17 2166 2217 2264 N
+ HH AH EH i n/a 17 2166 2217 2264 N
+ HH AH ER b n/a 17 2178 2211 2257 N
+ HH AH ER e n/a 17 2178 2211 2257 N
+ HH AH ER i n/a 17 2178 2211 2257 N
+ HH AH EY b n/a 17 2166 2217 2265 N
+ HH AH EY e n/a 17 2166 2217 2265 N
+ HH AH EY i n/a 17 2166 2217 2265 N
+ HH AH F b n/a 17 2166 2217 2265 N
+ HH AH F e n/a 17 2166 2217 2265 N
+ HH AH G b n/a 17 2166 2217 2265 N
+ HH AH G e n/a 17 2166 2217 2265 N
+ HH AH HH e n/a 17 2166 2217 2265 N
+ HH AH IH b n/a 17 2168 2233 2242 N
+ HH AH IH e n/a 17 2168 2233 2242 N
+ HH AH IH i n/a 17 2168 2233 2242 N
+ HH AH IY b n/a 17 2168 2227 2251 N
+ HH AH IY e n/a 17 2168 2227 2251 N
+ HH AH IY i n/a 17 2168 2227 2251 N
+ HH AH JH e n/a 17 2166 2217 2265 N
+ HH AH K e n/a 17 2166 2217 2265 N
+ HH AH L b n/a 17 2178 2197 2244 N
+ HH AH L e n/a 17 2178 2197 2244 N
+ HH AH M b n/a 17 2166 2217 2265 N
+ HH AH M e n/a 17 2166 2217 2265 N
+ HH AH N b n/a 17 2166 2217 2265 N
+ HH AH N e n/a 17 2166 2217 2265 N
+ HH AH NG e n/a 17 2166 2217 2265 N
+ HH AH OW b n/a 17 2181 2201 2256 N
+ HH AH OW e n/a 17 2181 2201 2256 N
+ HH AH OW i n/a 17 2181 2201 2256 N
+ HH AH OY b n/a 17 2181 2201 2256 N
+ HH AH OY e n/a 17 2181 2201 2256 N
+ HH AH OY i n/a 17 2181 2201 2256 N
+ HH AH P b n/a 17 2166 2217 2265 N
+ HH AH P e n/a 17 2166 2217 2265 N
+ HH AH R b n/a 17 2178 2197 2254 N
+ HH AH R e n/a 17 2178 2197 2254 N
+ HH AH S e n/a 17 2166 2217 2265 N
+ HH AH SH e n/a 17 2166 2217 2265 N
+ HH AH SIL e n/a 17 2166 2217 2265 N
+ HH AH T b n/a 17 2166 2217 2265 N
+ HH AH T e n/a 17 2166 2217 2265 N
+ HH AH TH e n/a 17 2166 2217 2265 N
+ HH AH UH b n/a 17 2178 2205 2247 N
+ HH AH UH e n/a 17 2178 2205 2247 N
+ HH AH UH i n/a 17 2178 2205 2247 N
+ HH AH UW b n/a 17 2181 2205 2246 N
+ HH AH UW e n/a 17 2181 2205 2246 N
+ HH AH UW i n/a 17 2181 2205 2246 N
+ HH AH V b n/a 17 2166 2217 2265 N
+ HH AH V e n/a 17 2166 2217 2265 N
+ HH AH W b n/a 17 2178 2207 2244 N
+ HH AH W e n/a 17 2178 2207 2244 N
+ HH AH Y b n/a 17 2168 2229 2250 N
+ HH AH Y e n/a 17 2168 2229 2250 N
+ HH AH Y i n/a 17 2168 2229 2250 N
+ HH AH Z e n/a 17 2166 2217 2265 N
+ HH AH ZH e n/a 17 2166 2217 2265 N
+ HH AO AA b n/a 17 2181 2199 2254 N
+ HH AO AE b n/a 17 2174 2215 2263 N
+ HH AO AH b n/a 17 2174 2197 2253 N
+ HH AO AH i n/a 17 2174 2197 2253 N
+ HH AO AO b n/a 17 2181 2201 2256 N
+ HH AO AO i n/a 17 2181 2201 2256 N
+ HH AO AW b n/a 17 2174 2214 2268 N
+ HH AO AY b n/a 17 2181 2200 2255 N
+ HH AO AY i n/a 17 2181 2197 2253 N
+ HH AO B b n/a 17 2174 2215 2265 N
+ HH AO CH b n/a 17 2174 2215 2265 N
+ HH AO EH b n/a 17 2174 2215 2264 N
+ HH AO EH i n/a 17 2174 2215 2264 N
+ HH AO ER b n/a 17 2178 2211 2257 N
+ HH AO EY b n/a 17 2174 2215 2265 N
+ HH AO F b n/a 17 2174 2215 2265 N
+ HH AO G b n/a 17 2174 2215 2265 N
+ HH AO IH b n/a 17 2177 2233 2242 N
+ HH AO IH i n/a 17 2177 2233 2242 N
+ HH AO IY b n/a 17 2176 2227 2252 N
+ HH AO L b n/a 17 2178 2197 2244 N
+ HH AO M b n/a 17 2174 2215 2265 N
+ HH AO N b n/a 17 2174 2215 2265 N
+ HH AO OW b n/a 17 2181 2201 2256 N
+ HH AO OY b n/a 17 2181 2201 2256 N
+ HH AO P b n/a 17 2174 2215 2265 N
+ HH AO R b n/a 17 2178 2197 2254 N
+ HH AO R i n/a 17 2178 2197 2254 N
+ HH AO T b n/a 17 2174 2215 2265 N
+ HH AO UH b n/a 17 2178 2205 2247 N
+ HH AO UW b n/a 17 2178 2205 2247 N
+ HH AO V b n/a 17 2174 2215 2265 N
+ HH AO W b n/a 17 2178 2207 2244 N
+ HH AO Y b n/a 17 2176 2227 2250 N
+ HH AW AA b n/a 17 2181 2199 2254 N
+ HH AW AA i n/a 17 2181 2199 2254 N
+ HH AW AE b n/a 17 2174 2215 2261 N
+ HH AW AH b n/a 17 2174 2197 2253 N
+ HH AW AH i n/a 17 2174 2197 2253 N
+ HH AW AO b n/a 17 2181 2201 2256 N
+ HH AW AO i n/a 17 2181 2201 2256 N
+ HH AW AW b n/a 17 2174 2214 2268 N
+ HH AW AW i n/a 17 2174 2214 2268 N
+ HH AW AY b n/a 17 2181 2200 2255 N
+ HH AW AY i n/a 17 2181 2197 2253 N
+ HH AW B b n/a 17 2174 2215 2265 N
+ HH AW CH b n/a 17 2174 2215 2265 N
+ HH AW EH b n/a 17 2174 2215 2264 N
+ HH AW ER b n/a 17 2178 2211 2257 N
+ HH AW ER i n/a 17 2178 2211 2257 N
+ HH AW EY b n/a 17 2174 2215 2265 N
+ HH AW F b n/a 17 2174 2215 2265 N
+ HH AW G b n/a 17 2174 2215 2265 N
+ HH AW IH b n/a 17 2177 2233 2242 N
+ HH AW IY b n/a 17 2176 2226 2252 N
+ HH AW L b n/a 17 2178 2197 2244 N
+ HH AW M b n/a 17 2174 2215 2265 N
+ HH AW N b n/a 17 2174 2215 2265 N
+ HH AW OW b n/a 17 2181 2201 2256 N
+ HH AW OY b n/a 17 2181 2201 2256 N
+ HH AW P b n/a 17 2174 2215 2265 N
+ HH AW R b n/a 17 2178 2197 2254 N
+ HH AW T b n/a 17 2174 2215 2265 N
+ HH AW UH b n/a 17 2178 2205 2247 N
+ HH AW UW b n/a 17 2178 2205 2247 N
+ HH AW V b n/a 17 2174 2215 2265 N
+ HH AW W b n/a 17 2178 2207 2244 N
+ HH AW Y b n/a 17 2176 2227 2250 N
+ HH AY AA b n/a 17 2182 2199 2254 N
+ HH AY AA e n/a 17 2182 2199 2254 N
+ HH AY AA i n/a 17 2185 2199 2254 N
+ HH AY AE b n/a 17 2169 2224 2259 N
+ HH AY AE e n/a 17 2169 2224 2259 N
+ HH AY AE i n/a 17 2169 2224 2259 N
+ HH AY AH b n/a 17 2169 2225 2261 N
+ HH AY AH e n/a 17 2169 2225 2261 N
+ HH AY AH i n/a 17 2169 2225 2261 N
+ HH AY AO b n/a 17 2182 2202 2256 N
+ HH AY AO e n/a 17 2182 2202 2256 N
+ HH AY AO i n/a 17 2185 2202 2256 N
+ HH AY AW b n/a 17 2169 2225 2268 N
+ HH AY AW e n/a 17 2169 2225 2268 N
+ HH AY AW i n/a 17 2169 2225 2268 N
+ HH AY AY b n/a 17 2182 2200 2255 N
+ HH AY AY e n/a 17 2182 2197 2253 N
+ HH AY AY i n/a 17 2185 2197 2253 N
+ HH AY B b n/a 17 2169 2224 2265 N
+ HH AY B e n/a 17 2168 2224 2265 N
+ HH AY CH b n/a 17 2169 2224 2265 N
+ HH AY CH e n/a 17 2168 2224 2265 N
+ HH AY D e n/a 17 2168 2224 2265 N
+ HH AY DH e n/a 17 2168 2224 2265 N
+ HH AY EH b n/a 17 2169 2224 2264 N
+ HH AY EH e n/a 17 2168 2224 2264 N
+ HH AY EH i n/a 17 2168 2224 2264 N
+ HH AY ER b n/a 17 2182 2212 2257 N
+ HH AY ER e n/a 17 2182 2212 2257 N
+ HH AY ER i n/a 17 2185 2212 2257 N
+ HH AY EY b n/a 17 2169 2224 2265 N
+ HH AY EY e n/a 17 2168 2224 2265 N
+ HH AY EY i n/a 17 2168 2224 2265 N
+ HH AY F b n/a 17 2169 2224 2265 N
+ HH AY F e n/a 17 2168 2224 2265 N
+ HH AY G b n/a 17 2169 2224 2265 N
+ HH AY G e n/a 17 2168 2224 2265 N
+ HH AY HH e n/a 17 2168 2224 2265 N
+ HH AY IH b n/a 17 2169 2234 2243 N
+ HH AY IH e n/a 17 2169 2234 2243 N
+ HH AY IY b n/a 17 2168 2227 2251 N
+ HH AY IY e n/a 17 2168 2227 2251 N
+ HH AY JH e n/a 17 2168 2224 2265 N
+ HH AY K e n/a 17 2168 2224 2265 N
+ HH AY L b n/a 17 2182 2197 2245 N
+ HH AY L e n/a 17 2182 2197 2245 N
+ HH AY M b n/a 17 2169 2224 2265 N
+ HH AY M e n/a 17 2168 2224 2265 N
+ HH AY N b n/a 17 2169 2224 2265 N
+ HH AY N e n/a 17 2168 2224 2265 N
+ HH AY NG e n/a 17 2168 2224 2265 N
+ HH AY OW b n/a 17 2182 2202 2256 N
+ HH AY OW e n/a 17 2182 2202 2256 N
+ HH AY OW i n/a 17 2184 2202 2256 N
+ HH AY OY b n/a 17 2182 2202 2256 N
+ HH AY OY e n/a 17 2182 2202 2256 N
+ HH AY P b n/a 17 2169 2224 2265 N
+ HH AY P e n/a 17 2168 2224 2265 N
+ HH AY R b n/a 17 2182 2197 2254 N
+ HH AY R e n/a 17 2182 2197 2254 N
+ HH AY S e n/a 17 2168 2224 2265 N
+ HH AY SH e n/a 17 2168 2224 2265 N
+ HH AY SIL e n/a 17 2168 2224 2265 N
+ HH AY T b n/a 17 2169 2224 2265 N
+ HH AY T e n/a 17 2168 2224 2265 N
+ HH AY TH e n/a 17 2168 2224 2265 N
+ HH AY UH b n/a 17 2182 2206 2247 N
+ HH AY UH e n/a 17 2182 2206 2247 N
+ HH AY UW b n/a 17 2182 2206 2246 N
+ HH AY UW e n/a 17 2182 2206 2246 N
+ HH AY V b n/a 17 2169 2224 2265 N
+ HH AY V e n/a 17 2168 2224 2265 N
+ HH AY W b n/a 17 2187 2208 2245 N
+ HH AY W e n/a 17 2187 2208 2245 N
+ HH AY Y b n/a 17 2168 2229 2250 N
+ HH AY Y e n/a 17 2168 2229 2250 N
+ HH AY Z e n/a 17 2168 2224 2265 N
+ HH AY ZH e n/a 17 2168 2224 2265 N
+ HH B AA b n/a 17 2146 2199 2254 N
+ HH B AA i n/a 17 2146 2199 2254 N
+ HH B AE b n/a 17 2153 2220 2262 N
+ HH B AH b n/a 17 2153 2198 2253 N
+ HH B AH i n/a 17 2153 2198 2253 N
+ HH B AO b n/a 17 2146 2201 2256 N
+ HH B AO i n/a 17 2146 2201 2256 N
+ HH B AW b n/a 17 2153 2214 2268 N
+ HH B AW i n/a 17 2153 2214 2268 N
+ HH B AY b n/a 17 2146 2200 2255 N
+ HH B B b n/a 17 2153 2220 2265 N
+ HH B CH b n/a 17 2153 2220 2265 N
+ HH B EH b n/a 17 2153 2220 2264 N
+ HH B ER b n/a 17 2151 2210 2258 N
+ HH B ER i n/a 17 2151 2210 2258 N
+ HH B EY b n/a 17 2153 2220 2265 N
+ HH B F b n/a 17 2153 2220 2265 N
+ HH B G b n/a 17 2153 2220 2265 N
+ HH B IH b n/a 17 2158 2239 2241 N
+ HH B IH i n/a 17 2158 2239 2241 N
+ HH B IY b n/a 17 2154 2228 2249 N
+ HH B L b n/a 17 2146 2198 2245 N
+ HH B M b n/a 17 2153 2220 2265 N
+ HH B N b n/a 17 2153 2220 2265 N
+ HH B OW b n/a 17 2146 2201 2256 N
+ HH B OW i n/a 17 2146 2201 2256 N
+ HH B OY b n/a 17 2146 2201 2256 N
+ HH B P b n/a 17 2153 2220 2265 N
+ HH B R b n/a 17 2146 2198 2254 N
+ HH B T b n/a 17 2153 2220 2265 N
+ HH B UH b n/a 17 2156 2206 2247 N
+ HH B UW b n/a 17 2156 2206 2247 N
+ HH B V b n/a 17 2153 2220 2265 N
+ HH B W b n/a 17 2148 2207 2245 N
+ HH B Y b n/a 17 2154 2229 2250 N
+ HH B Y i n/a 17 2154 2229 2250 N
+ HH CH AA b n/a 17 2146 2199 2254 N
+ HH CH AE b n/a 17 2149 2220 2262 N
+ HH CH AH b n/a 17 2149 2198 2253 N
+ HH CH AH i n/a 17 2149 2198 2253 N
+ HH CH AO b n/a 17 2146 2201 2256 N
+ HH CH AW b n/a 17 2149 2214 2268 N
+ HH CH AW i n/a 17 2149 2214 2268 N
+ HH CH AY b n/a 17 2146 2200 2255 N
+ HH CH AY i n/a 17 2146 2198 2253 N
+ HH CH B b n/a 17 2149 2220 2265 N
+ HH CH CH b n/a 17 2149 2220 2265 N
+ HH CH EH b n/a 17 2149 2220 2264 N
+ HH CH EH i n/a 17 2149 2220 2264 N
+ HH CH ER b n/a 17 2150 2209 2258 N
+ HH CH EY b n/a 17 2149 2220 2265 N
+ HH CH F b n/a 17 2149 2220 2265 N
+ HH CH G b n/a 17 2149 2220 2265 N
+ HH CH IH b n/a 17 2158 2238 2241 N
+ HH CH IH i n/a 17 2158 2238 2241 N
+ HH CH IY b n/a 17 2155 2230 2249 N
+ HH CH L b n/a 17 2146 2198 2245 N
+ HH CH M b n/a 17 2149 2220 2265 N
+ HH CH N b n/a 17 2149 2220 2265 N
+ HH CH OW b n/a 17 2146 2201 2256 N
+ HH CH OY b n/a 17 2146 2201 2256 N
+ HH CH P b n/a 17 2149 2220 2265 N
+ HH CH R b n/a 17 2146 2198 2254 N
+ HH CH T b n/a 17 2149 2220 2265 N
+ HH CH UH b n/a 17 2156 2206 2247 N
+ HH CH UW b n/a 17 2156 2206 2246 N
+ HH CH V b n/a 17 2149 2220 2265 N
+ HH CH W b n/a 17 2148 2207 2245 N
+ HH CH Y b n/a 17 2155 2230 2250 N
+ HH D AA b n/a 17 2147 2199 2254 N
+ HH D AA i n/a 17 2147 2199 2254 N
+ HH D AE b n/a 17 2152 2221 2262 N
+ HH D AE i n/a 17 2152 2221 2262 N
+ HH D AH b n/a 17 2153 2198 2253 N
+ HH D AH i n/a 17 2153 2198 2253 N
+ HH D AO b n/a 17 2147 2202 2256 N
+ HH D AO i n/a 17 2147 2202 2256 N
+ HH D AW b n/a 17 2153 2214 2268 N
+ HH D AW i n/a 17 2153 2214 2268 N
+ HH D AY b n/a 17 2147 2200 2255 N
+ HH D AY i n/a 17 2147 2198 2253 N
+ HH D B b n/a 17 2152 2217 2265 N
+ HH D CH b n/a 17 2152 2217 2265 N
+ HH D D i n/a 17 2152 2217 2265 N
+ HH D EH b n/a 17 2152 2217 2264 N
+ HH D EH i n/a 17 2152 2217 2264 N
+ HH D ER b n/a 17 2150 2209 2258 N
+ HH D ER i n/a 17 2150 2209 2258 N
+ HH D EY b n/a 17 2152 2217 2265 N
+ HH D EY i n/a 17 2152 2217 2265 N
+ HH D F b n/a 17 2152 2217 2265 N
+ HH D G b n/a 17 2152 2217 2265 N
+ HH D IH b n/a 17 2158 2238 2241 N
+ HH D IH i n/a 17 2158 2238 2241 N
+ HH D IY b n/a 17 2154 2228 2251 N
+ HH D IY i n/a 17 2154 2228 2251 N
+ HH D L b n/a 17 2147 2198 2245 N
+ HH D M b n/a 17 2152 2217 2265 N
+ HH D N b n/a 17 2152 2217 2265 N
+ HH D OW b n/a 17 2147 2202 2256 N
+ HH D OW i n/a 17 2147 2202 2256 N
+ HH D OY b n/a 17 2147 2202 2256 N
+ HH D P b n/a 17 2152 2217 2265 N
+ HH D R b n/a 17 2147 2198 2254 N
+ HH D T b n/a 17 2152 2217 2265 N
+ HH D UH b n/a 17 2156 2206 2247 N
+ HH D UH i n/a 17 2156 2206 2247 N
+ HH D UW b n/a 17 2156 2206 2246 N
+ HH D UW i n/a 17 2156 2206 2246 N
+ HH D V b n/a 17 2152 2217 2265 N
+ HH D W b n/a 17 2148 2207 2245 N
+ HH D W i n/a 17 2148 2207 2245 N
+ HH D Y b n/a 17 2154 2229 2250 N
+ HH D Y i n/a 17 2154 2229 2250 N
+ HH DH AA b n/a 17 2146 2199 2254 N
+ HH DH AE b n/a 17 2149 2220 2266 N
+ HH DH AH b n/a 17 2149 2198 2253 N
+ HH DH AO b n/a 17 2146 2202 2256 N
+ HH DH AW b n/a 17 2149 2214 2268 N
+ HH DH AY b n/a 17 2146 2200 2255 N
+ HH DH B b n/a 17 2149 2220 2265 N
+ HH DH CH b n/a 17 2149 2220 2265 N
+ HH DH EH b n/a 17 2149 2220 2264 N
+ HH DH ER b n/a 17 2150 2209 2258 N
+ HH DH EY b n/a 17 2149 2220 2265 N
+ HH DH F b n/a 17 2149 2220 2265 N
+ HH DH G b n/a 17 2149 2220 2265 N
+ HH DH IH b n/a 17 2158 2239 2241 N
+ HH DH IY b n/a 17 2159 2230 2249 N
+ HH DH L b n/a 17 2146 2198 2245 N
+ HH DH M b n/a 17 2149 2220 2265 N
+ HH DH N b n/a 17 2149 2220 2265 N
+ HH DH OW b n/a 17 2146 2202 2256 N
+ HH DH OY b n/a 17 2146 2202 2256 N
+ HH DH P b n/a 17 2149 2220 2265 N
+ HH DH R b n/a 17 2146 2198 2254 N
+ HH DH T b n/a 17 2149 2220 2265 N
+ HH DH UH b n/a 17 2156 2205 2247 N
+ HH DH UW b n/a 17 2156 2203 2246 N
+ HH DH V b n/a 17 2149 2220 2265 N
+ HH DH W b n/a 17 2148 2205 2245 N
+ HH DH Y b n/a 17 2159 2230 2250 N
+ HH EH AA b n/a 17 2182 2199 2254 N
+ HH EH AA e n/a 17 2182 2199 2254 N
+ HH EH AA i n/a 17 2185 2199 2254 N
+ HH EH AE b n/a 17 2166 2215 2261 N
+ HH EH AE e n/a 17 2166 2215 2261 N
+ HH EH AE i n/a 17 2166 2215 2261 N
+ HH EH AH b n/a 17 2167 2197 2253 N
+ HH EH AH e n/a 17 2166 2197 2253 N
+ HH EH AH i n/a 17 2166 2197 2253 N
+ HH EH AO b n/a 17 2182 2201 2256 N
+ HH EH AO e n/a 17 2182 2201 2256 N
+ HH EH AO i n/a 17 2185 2201 2256 N
+ HH EH AW b n/a 17 2167 2214 2268 N
+ HH EH AW e n/a 17 2167 2214 2268 N
+ HH EH AY b n/a 17 2182 2200 2255 N
+ HH EH AY e n/a 17 2182 2197 2253 N
+ HH EH AY i n/a 17 2185 2197 2253 N
+ HH EH B b n/a 17 2166 2215 2265 N
+ HH EH B e n/a 17 2166 2215 2265 N
+ HH EH CH b n/a 17 2166 2215 2265 N
+ HH EH CH e n/a 17 2166 2215 2265 N
+ HH EH D e n/a 17 2166 2215 2265 N
+ HH EH DH e n/a 17 2166 2215 2265 N
+ HH EH EH b n/a 17 2166 2215 2264 N
+ HH EH EH e n/a 17 2166 2215 2264 N
+ HH EH EH i n/a 17 2166 2215 2264 N
+ HH EH ER b n/a 17 2182 2211 2257 N
+ HH EH ER e n/a 17 2182 2211 2257 N
+ HH EH ER i n/a 17 2185 2211 2257 N
+ HH EH EY b n/a 17 2166 2215 2265 N
+ HH EH EY e n/a 17 2166 2215 2265 N
+ HH EH F b n/a 17 2166 2215 2265 N
+ HH EH F e n/a 17 2166 2215 2265 N
+ HH EH G b n/a 17 2166 2215 2265 N
+ HH EH G e n/a 17 2166 2215 2265 N
+ HH EH HH e n/a 17 2166 2215 2265 N
+ HH EH IH b n/a 17 2169 2233 2242 N
+ HH EH IH e n/a 17 2169 2233 2242 N
+ HH EH IH i n/a 17 2169 2233 2242 N
+ HH EH IY b n/a 17 2168 2227 2251 N
+ HH EH IY e n/a 17 2168 2227 2251 N
+ HH EH IY i n/a 17 2168 2227 2251 N
+ HH EH JH e n/a 17 2166 2215 2265 N
+ HH EH K e n/a 17 2166 2215 2265 N
+ HH EH L b n/a 17 2178 2197 2244 N
+ HH EH L e n/a 17 2178 2197 2244 N
+ HH EH L i n/a 17 2178 2197 2244 N
+ HH EH M b n/a 17 2166 2215 2265 N
+ HH EH M e n/a 17 2166 2215 2265 N
+ HH EH N b n/a 17 2166 2215 2265 N
+ HH EH N e n/a 17 2166 2215 2265 N
+ HH EH NG e n/a 17 2166 2215 2265 N
+ HH EH OW b n/a 17 2182 2201 2256 N
+ HH EH OW e n/a 17 2182 2201 2256 N
+ HH EH OW i n/a 17 2184 2201 2256 N
+ HH EH OY b n/a 17 2182 2201 2256 N
+ HH EH OY e n/a 17 2182 2201 2256 N
+ HH EH OY i n/a 17 2185 2201 2256 N
+ HH EH P b n/a 17 2166 2215 2265 N
+ HH EH P e n/a 17 2166 2215 2265 N
+ HH EH R b n/a 17 2182 2197 2254 N
+ HH EH R e n/a 17 2182 2197 2254 N
+ HH EH S e n/a 17 2166 2215 2265 N
+ HH EH SH e n/a 17 2166 2215 2265 N
+ HH EH SIL e n/a 17 2166 2215 2265 N
+ HH EH T b n/a 17 2166 2215 2265 N
+ HH EH T e n/a 17 2166 2215 2265 N
+ HH EH TH e n/a 17 2166 2215 2265 N
+ HH EH UH b n/a 17 2182 2205 2247 N
+ HH EH UH e n/a 17 2182 2205 2247 N
+ HH EH UH i n/a 17 2183 2205 2247 N
+ HH EH UW b n/a 17 2182 2205 2246 N
+ HH EH UW e n/a 17 2182 2205 2246 N
+ HH EH UW i n/a 17 2183 2205 2246 N
+ HH EH V b n/a 17 2166 2215 2265 N
+ HH EH V e n/a 17 2166 2215 2265 N
+ HH EH V i n/a 17 2166 2215 2265 N
+ HH EH W b n/a 17 2178 2207 2244 N
+ HH EH W e n/a 17 2178 2207 2244 N
+ HH EH Y b n/a 17 2168 2229 2250 N
+ HH EH Y e n/a 17 2168 2229 2250 N
+ HH EH Y i n/a 17 2168 2229 2250 N
+ HH EH Z e n/a 17 2166 2215 2265 N
+ HH EH ZH e n/a 17 2166 2215 2265 N
+ HH ER AA b n/a 17 2193 2199 2254 N
+ HH ER AA i n/a 17 2193 2199 2254 N
+ HH ER AE b n/a 17 2192 2218 2261 N
+ HH ER AE i n/a 17 2192 2218 2261 N
+ HH ER AH b n/a 17 2193 2198 2253 N
+ HH ER AH i n/a 17 2193 2198 2253 N
+ HH ER AO b n/a 17 2193 2202 2256 N
+ HH ER AO i n/a 17 2193 2202 2256 N
+ HH ER AW b n/a 17 2192 2214 2268 N
+ HH ER AW i n/a 17 2192 2214 2268 N
+ HH ER AY b n/a 17 2193 2200 2255 N
+ HH ER AY i n/a 17 2193 2198 2253 N
+ HH ER B b n/a 17 2192 2217 2265 N
+ HH ER CH b n/a 17 2192 2217 2265 N
+ HH ER EH b n/a 17 2192 2217 2264 N
+ HH ER EH i n/a 17 2192 2217 2264 N
+ HH ER ER b n/a 17 2194 2211 2257 N
+ HH ER ER i n/a 17 2194 2211 2257 N
+ HH ER EY b n/a 17 2192 2217 2265 N
+ HH ER EY i n/a 17 2192 2217 2265 N
+ HH ER F b n/a 17 2192 2217 2265 N
+ HH ER G b n/a 17 2192 2217 2265 N
+ HH ER IH b n/a 17 2196 2232 2242 N
+ HH ER IH i n/a 17 2196 2232 2242 N
+ HH ER IY b n/a 17 2195 2227 2251 N
+ HH ER IY i n/a 17 2195 2227 2251 N
+ HH ER L b n/a 17 2194 2198 2244 N
+ HH ER M b n/a 17 2192 2217 2265 N
+ HH ER N b n/a 17 2192 2217 2265 N
+ HH ER OW b n/a 17 2193 2202 2256 N
+ HH ER OW i n/a 17 2193 2202 2256 N
+ HH ER OY b n/a 17 2193 2202 2256 N
+ HH ER P b n/a 17 2192 2217 2265 N
+ HH ER R b n/a 17 2194 2198 2254 N
+ HH ER T b n/a 17 2192 2217 2265 N
+ HH ER UH b n/a 17 2194 2205 2247 N
+ HH ER UH i n/a 17 2194 2205 2247 N
+ HH ER UW b n/a 17 2194 2205 2247 N
+ HH ER V b n/a 17 2192 2217 2265 N
+ HH ER W b n/a 17 2194 2207 2244 N
+ HH ER W i n/a 17 2194 2207 2244 N
+ HH ER Y b n/a 17 2195 2227 2250 N
+ HH ER Y i n/a 17 2195 2227 2250 N
+ HH EY AA b n/a 17 2184 2199 2254 N
+ HH EY AA e n/a 17 2184 2199 2254 N
+ HH EY AA i n/a 17 2185 2199 2254 N
+ HH EY AE b n/a 17 2172 2223 2260 N
+ HH EY AE e n/a 17 2172 2223 2260 N
+ HH EY AE i n/a 17 2172 2223 2260 N
+ HH EY AH b n/a 17 2172 2225 2263 N
+ HH EY AH e n/a 17 2172 2225 2263 N
+ HH EY AH i n/a 17 2172 2225 2263 N
+ HH EY AO b n/a 17 2184 2202 2256 N
+ HH EY AO e n/a 17 2184 2202 2256 N
+ HH EY AO i n/a 17 2185 2202 2256 N
+ HH EY AW b n/a 17 2172 2225 2268 N
+ HH EY AW e n/a 17 2172 2225 2268 N
+ HH EY AW i n/a 17 2172 2225 2268 N
+ HH EY AY b n/a 17 2185 2200 2255 N
+ HH EY AY e n/a 17 2185 2197 2253 N
+ HH EY B b n/a 17 2172 2224 2265 N
+ HH EY B e n/a 17 2172 2224 2265 N
+ HH EY CH b n/a 17 2172 2224 2265 N
+ HH EY CH e n/a 17 2172 2224 2265 N
+ HH EY D e n/a 17 2172 2224 2265 N
+ HH EY DH e n/a 17 2172 2224 2265 N
+ HH EY EH b n/a 17 2172 2224 2264 N
+ HH EY EH e n/a 17 2172 2224 2264 N
+ HH EY EH i n/a 17 2172 2224 2264 N
+ HH EY ER b n/a 17 2183 2212 2257 N
+ HH EY ER e n/a 17 2183 2212 2257 N
+ HH EY ER i n/a 17 2185 2212 2257 N
+ HH EY EY b n/a 17 2172 2224 2265 N
+ HH EY EY e n/a 17 2172 2224 2265 N
+ HH EY F b n/a 17 2172 2224 2265 N
+ HH EY F e n/a 17 2172 2224 2265 N
+ HH EY G b n/a 17 2172 2224 2265 N
+ HH EY G e n/a 17 2172 2224 2265 N
+ HH EY HH e n/a 17 2172 2224 2265 N
+ HH EY IH b n/a 17 2173 2234 2243 N
+ HH EY IH e n/a 17 2173 2234 2243 N
+ HH EY IH i n/a 17 2173 2234 2243 N
+ HH EY IY b n/a 17 2173 2227 2251 N
+ HH EY IY e n/a 17 2173 2227 2251 N
+ HH EY IY i n/a 17 2173 2227 2251 N
+ HH EY JH e n/a 17 2172 2224 2265 N
+ HH EY K e n/a 17 2172 2224 2265 N
+ HH EY L b n/a 17 2184 2197 2245 N
+ HH EY L e n/a 17 2184 2197 2245 N
+ HH EY M b n/a 17 2172 2224 2265 N
+ HH EY M e n/a 17 2172 2224 2265 N
+ HH EY N b n/a 17 2172 2224 2265 N
+ HH EY N e n/a 17 2172 2224 2265 N
+ HH EY NG e n/a 17 2172 2224 2265 N
+ HH EY OW b n/a 17 2184 2202 2256 N
+ HH EY OW e n/a 17 2184 2202 2256 N
+ HH EY OW i n/a 17 2184 2202 2256 N
+ HH EY OY b n/a 17 2185 2202 2256 N
+ HH EY OY e n/a 17 2185 2202 2256 N
+ HH EY P b n/a 17 2172 2224 2265 N
+ HH EY P e n/a 17 2172 2224 2265 N
+ HH EY R b n/a 17 2184 2197 2254 N
+ HH EY R e n/a 17 2184 2197 2254 N
+ HH EY S e n/a 17 2172 2224 2265 N
+ HH EY SH e n/a 17 2172 2224 2265 N
+ HH EY SIL e n/a 17 2172 2224 2265 N
+ HH EY T b n/a 17 2172 2224 2265 N
+ HH EY T e n/a 17 2172 2224 2265 N
+ HH EY TH e n/a 17 2172 2224 2265 N
+ HH EY UH b n/a 17 2183 2206 2247 N
+ HH EY UH e n/a 17 2183 2206 2247 N
+ HH EY UW b n/a 17 2183 2206 2246 N
+ HH EY UW e n/a 17 2183 2206 2246 N
+ HH EY UW i n/a 17 2183 2206 2246 N
+ HH EY V b n/a 17 2172 2224 2265 N
+ HH EY V e n/a 17 2172 2224 2265 N
+ HH EY W b n/a 17 2187 2208 2245 N
+ HH EY W e n/a 17 2187 2208 2245 N
+ HH EY Y b n/a 17 2173 2229 2250 N
+ HH EY Y e n/a 17 2173 2229 2250 N
+ HH EY Y i n/a 17 2173 2229 2250 N
+ HH EY Z e n/a 17 2172 2224 2265 N
+ HH EY ZH e n/a 17 2172 2224 2265 N
+ HH F AA b n/a 17 2146 2199 2254 N
+ HH F AA i n/a 17 2146 2199 2254 N
+ HH F AE b n/a 17 2153 2220 2266 N
+ HH F AE i n/a 17 2153 2220 2266 N
+ HH F AH b n/a 17 2153 2198 2253 N
+ HH F AO b n/a 17 2146 2201 2256 N
+ HH F AO i n/a 17 2146 2201 2256 N
+ HH F AW b n/a 17 2153 2214 2268 N
+ HH F AW i n/a 17 2153 2214 2268 N
+ HH F AY b n/a 17 2146 2200 2255 N
+ HH F AY i n/a 17 2146 2198 2253 N
+ HH F B b n/a 17 2153 2220 2265 N
+ HH F CH b n/a 17 2153 2220 2265 N
+ HH F EH b n/a 17 2153 2220 2264 N
+ HH F EH i n/a 17 2153 2220 2264 N
+ HH F ER b n/a 17 2151 2210 2258 N
+ HH F EY b n/a 17 2153 2220 2265 N
+ HH F F b n/a 17 2153 2220 2265 N
+ HH F G b n/a 17 2153 2220 2265 N
+ HH F IH b n/a 17 2157 2239 2241 N
+ HH F IH i n/a 17 2157 2239 2241 N
+ HH F IY b n/a 17 2159 2230 2249 N
+ HH F L b n/a 17 2146 2198 2245 N
+ HH F M b n/a 17 2153 2220 2265 N
+ HH F N b n/a 17 2153 2220 2265 N
+ HH F OW b n/a 17 2146 2201 2256 N
+ HH F OW i n/a 17 2146 2201 2256 N
+ HH F OY b n/a 17 2146 2201 2256 N
+ HH F P b n/a 17 2153 2220 2265 N
+ HH F R b n/a 17 2146 2198 2254 N
+ HH F T b n/a 17 2153 2220 2265 N
+ HH F UH b n/a 17 2156 2205 2247 N
+ HH F UH i n/a 17 2156 2205 2247 N
+ HH F UW b n/a 17 2156 2205 2247 N
+ HH F V b n/a 17 2153 2220 2265 N
+ HH F W b n/a 17 2148 2205 2245 N
+ HH F Y b n/a 17 2159 2230 2250 N
+ HH G AA b n/a 17 2146 2199 2254 N
+ HH G AA i n/a 17 2146 2199 2254 N
+ HH G AE b n/a 17 2149 2220 2262 N
+ HH G AH b n/a 17 2149 2198 2253 N
+ HH G AH i n/a 17 2149 2198 2253 N
+ HH G AO b n/a 17 2146 2201 2256 N
+ HH G AO i n/a 17 2146 2201 2256 N
+ HH G AW b n/a 17 2149 2214 2268 N
+ HH G AW i n/a 17 2149 2214 2268 N
+ HH G AY b n/a 17 2146 2200 2255 N
+ HH G B b n/a 17 2149 2220 2265 N
+ HH G CH b n/a 17 2149 2220 2265 N
+ HH G EH b n/a 17 2149 2220 2264 N
+ HH G EH i n/a 17 2149 2220 2264 N
+ HH G ER b n/a 17 2151 2210 2258 N
+ HH G ER i n/a 17 2151 2210 2258 N
+ HH G EY b n/a 17 2149 2220 2265 N
+ HH G F b n/a 17 2149 2220 2265 N
+ HH G G b n/a 17 2149 2220 2265 N
+ HH G IH b n/a 17 2158 2239 2241 N
+ HH G IH i n/a 17 2158 2239 2241 N
+ HH G IY b n/a 17 2155 2228 2249 N
+ HH G L b n/a 17 2146 2198 2245 N
+ HH G M b n/a 17 2149 2220 2265 N
+ HH G N b n/a 17 2149 2220 2265 N
+ HH G OW b n/a 17 2146 2201 2256 N
+ HH G OY b n/a 17 2146 2201 2256 N
+ HH G P b n/a 17 2149 2220 2265 N
+ HH G R b n/a 17 2146 2198 2254 N
+ HH G T b n/a 17 2149 2220 2265 N
+ HH G UH b n/a 17 2156 2206 2247 N
+ HH G UW b n/a 17 2156 2206 2246 N
+ HH G UW i n/a 17 2156 2206 2246 N
+ HH G V b n/a 17 2149 2220 2265 N
+ HH G W b n/a 17 2148 2207 2245 N
+ HH G Y b n/a 17 2155 2229 2250 N
+ HH HH AA b n/a 17 2146 2199 2254 N
+ HH HH AE b n/a 17 2149 2220 2261 N
+ HH HH AH b n/a 17 2149 2198 2253 N
+ HH HH AO b n/a 17 2146 2201 2256 N
+ HH HH AW b n/a 17 2149 2214 2268 N
+ HH HH AY b n/a 17 2146 2200 2255 N
+ HH HH B b n/a 17 2149 2220 2265 N
+ HH HH CH b n/a 17 2149 2220 2265 N
+ HH HH EH b n/a 17 2149 2220 2264 N
+ HH HH ER b n/a 17 2151 2209 2258 N
+ HH HH EY b n/a 17 2149 2220 2265 N
+ HH HH F b n/a 17 2149 2220 2265 N
+ HH HH G b n/a 17 2149 2220 2265 N
+ HH HH IH b n/a 17 2158 2239 2241 N
+ HH HH IY b n/a 17 2159 2227 2249 N
+ HH HH L b n/a 17 2146 2198 2245 N
+ HH HH M b n/a 17 2149 2220 2265 N
+ HH HH N b n/a 17 2149 2220 2265 N
+ HH HH OW b n/a 17 2146 2201 2256 N
+ HH HH OY b n/a 17 2146 2201 2256 N
+ HH HH P b n/a 17 2149 2220 2265 N
+ HH HH R b n/a 17 2146 2198 2254 N
+ HH HH T b n/a 17 2149 2220 2265 N
+ HH HH UH b n/a 17 2156 2205 2247 N
+ HH HH UW b n/a 17 2156 2205 2246 N
+ HH HH V b n/a 17 2149 2220 2265 N
+ HH HH W b n/a 17 2148 2207 2245 N
+ HH HH Y b n/a 17 2159 2227 2250 N
+ HH IH AA b n/a 17 2182 2199 2254 N
+ HH IH AA e n/a 17 2182 2199 2254 N
+ HH IH AA i n/a 17 2185 2199 2254 N
+ HH IH AE b n/a 17 2166 2219 2261 N
+ HH IH AE e n/a 17 2169 2219 2261 N
+ HH IH AE i n/a 17 2169 2219 2261 N
+ HH IH AH b n/a 17 2167 2197 2253 N
+ HH IH AH e n/a 17 2166 2197 2253 N
+ HH IH AH i n/a 17 2166 2197 2253 N
+ HH IH AO b n/a 17 2182 2202 2256 N
+ HH IH AO e n/a 17 2182 2202 2256 N
+ HH IH AO i n/a 17 2185 2202 2256 N
+ HH IH AW b n/a 17 2167 2214 2268 N
+ HH IH AW e n/a 17 2169 2214 2268 N
+ HH IH AY b n/a 17 2182 2200 2255 N
+ HH IH AY e n/a 17 2182 2197 2253 N
+ HH IH AY i n/a 17 2185 2197 2253 N
+ HH IH B b n/a 17 2166 2217 2265 N
+ HH IH B e n/a 17 2168 2217 2265 N
+ HH IH CH b n/a 17 2166 2217 2265 N
+ HH IH CH e n/a 17 2168 2217 2265 N
+ HH IH D e n/a 17 2168 2217 2265 N
+ HH IH DH e n/a 17 2168 2217 2265 N
+ HH IH EH b n/a 17 2166 2217 2264 N
+ HH IH EH e n/a 17 2168 2217 2264 N
+ HH IH EH i n/a 17 2168 2217 2264 N
+ HH IH ER b n/a 17 2182 2211 2257 N
+ HH IH ER e n/a 17 2182 2211 2257 N
+ HH IH ER i n/a 17 2185 2211 2257 N
+ HH IH EY b n/a 17 2166 2217 2265 N
+ HH IH EY e n/a 17 2168 2217 2265 N
+ HH IH EY i n/a 17 2168 2217 2265 N
+ HH IH F b n/a 17 2166 2217 2265 N
+ HH IH F e n/a 17 2168 2217 2265 N
+ HH IH G b n/a 17 2166 2217 2265 N
+ HH IH G e n/a 17 2168 2217 2265 N
+ HH IH HH e n/a 17 2168 2217 2265 N
+ HH IH IH b n/a 17 2168 2234 2242 N
+ HH IH IH e n/a 17 2168 2234 2242 N
+ HH IH IH i n/a 17 2168 2234 2242 N
+ HH IH IY b n/a 17 2168 2229 2251 N
+ HH IH IY e n/a 17 2168 2229 2251 N
+ HH IH IY i n/a 17 2168 2229 2251 N
+ HH IH JH e n/a 17 2168 2217 2265 N
+ HH IH K e n/a 17 2168 2217 2265 N
+ HH IH L b n/a 17 2182 2197 2244 N
+ HH IH L e n/a 17 2182 2197 2244 N
+ HH IH M b n/a 17 2166 2217 2265 N
+ HH IH M e n/a 17 2168 2217 2265 N
+ HH IH N b n/a 17 2166 2217 2265 N
+ HH IH N e n/a 17 2168 2217 2265 N
+ HH IH NG e n/a 17 2168 2217 2265 N
+ HH IH OW b n/a 17 2182 2202 2256 N
+ HH IH OW e n/a 17 2182 2202 2256 N
+ HH IH OW i n/a 17 2184 2202 2256 N
+ HH IH OY b n/a 17 2182 2202 2256 N
+ HH IH OY e n/a 17 2182 2202 2256 N
+ HH IH P b n/a 17 2166 2217 2265 N
+ HH IH P e n/a 17 2168 2217 2265 N
+ HH IH R b n/a 17 2182 2197 2254 N
+ HH IH R e n/a 17 2182 2197 2254 N
+ HH IH S e n/a 17 2168 2217 2265 N
+ HH IH SH e n/a 17 2168 2217 2265 N
+ HH IH SIL e n/a 17 2168 2217 2265 N
+ HH IH T b n/a 17 2166 2217 2265 N
+ HH IH T e n/a 17 2168 2217 2265 N
+ HH IH TH e n/a 17 2168 2217 2265 N
+ HH IH UH b n/a 17 2182 2205 2247 N
+ HH IH UH e n/a 17 2182 2205 2247 N
+ HH IH UH i n/a 17 2183 2205 2247 N
+ HH IH UW b n/a 17 2182 2205 2246 N
+ HH IH UW e n/a 17 2182 2205 2246 N
+ HH IH UW i n/a 17 2183 2205 2246 N
+ HH IH V b n/a 17 2166 2217 2265 N
+ HH IH V e n/a 17 2168 2217 2265 N
+ HH IH W b n/a 17 2187 2207 2244 N
+ HH IH W e n/a 17 2187 2207 2244 N
+ HH IH W i n/a 17 2187 2207 2244 N
+ HH IH Y b n/a 17 2168 2229 2250 N
+ HH IH Y e n/a 17 2168 2229 2250 N
+ HH IH Y i n/a 17 2168 2229 2250 N
+ HH IH Z e n/a 17 2168 2217 2265 N
+ HH IH ZH e n/a 17 2168 2217 2265 N
+ HH IY AA b n/a 17 2184 2199 2254 N
+ HH IY AA e n/a 17 2184 2199 2254 N
+ HH IY AA i n/a 17 2185 2199 2254 N
+ HH IY AE b n/a 17 2170 2223 2260 N
+ HH IY AE e n/a 17 2170 2223 2260 N
+ HH IY AE i n/a 17 2170 2223 2259 N
+ HH IY AH b n/a 17 2171 2225 2263 N
+ HH IY AH e n/a 17 2171 2225 2263 N
+ HH IY AH i n/a 17 2171 2225 2263 N
+ HH IY AO b n/a 17 2184 2202 2256 N
+ HH IY AO e n/a 17 2184 2202 2256 N
+ HH IY AO i n/a 17 2185 2202 2256 N
+ HH IY AW b n/a 17 2171 2225 2268 N
+ HH IY AW e n/a 17 2171 2225 2268 N
+ HH IY AW i n/a 17 2171 2225 2268 N
+ HH IY AY b n/a 17 2185 2200 2255 N
+ HH IY AY e n/a 17 2185 2197 2253 N
+ HH IY AY i n/a 17 2185 2197 2253 N
+ HH IY B b n/a 17 2170 2224 2265 N
+ HH IY B e n/a 17 2170 2224 2265 N
+ HH IY CH b n/a 17 2170 2224 2265 N
+ HH IY CH e n/a 17 2170 2224 2265 N
+ HH IY D e n/a 17 2170 2224 2265 N
+ HH IY DH e n/a 17 2170 2224 2265 N
+ HH IY EH b n/a 17 2170 2224 2264 N
+ HH IY EH e n/a 17 2170 2224 2264 N
+ HH IY EH i n/a 17 2171 2224 2264 N
+ HH IY ER b n/a 17 2183 2212 2257 N
+ HH IY ER e n/a 17 2183 2212 2257 N
+ HH IY ER i n/a 17 2185 2212 2257 N
+ HH IY EY b n/a 17 2170 2224 2265 N
+ HH IY EY e n/a 17 2170 2224 2265 N
+ HH IY EY i n/a 17 2170 2224 2265 N
+ HH IY F b n/a 17 2170 2224 2265 N
+ HH IY F e n/a 17 2170 2224 2265 N
+ HH IY G b n/a 17 2170 2224 2265 N
+ HH IY G e n/a 17 2170 2224 2265 N
+ HH IY HH e n/a 17 2170 2224 2265 N
+ HH IY IH b n/a 17 2173 2234 2243 N
+ HH IY IH e n/a 17 2173 2234 2243 N
+ HH IY IH i n/a 17 2173 2234 2243 N
+ HH IY IY b n/a 17 2173 2229 2251 N
+ HH IY IY e n/a 17 2173 2229 2251 N
+ HH IY IY i n/a 17 2173 2229 2251 N
+ HH IY JH e n/a 17 2170 2224 2265 N
+ HH IY K e n/a 17 2170 2224 2265 N
+ HH IY L b n/a 17 2184 2197 2244 N
+ HH IY L e n/a 17 2184 2197 2244 N
+ HH IY M b n/a 17 2170 2224 2265 N
+ HH IY M e n/a 17 2170 2224 2265 N
+ HH IY N b n/a 17 2170 2224 2265 N
+ HH IY N e n/a 17 2170 2224 2265 N
+ HH IY NG e n/a 17 2170 2224 2265 N
+ HH IY OW b n/a 17 2184 2202 2256 N
+ HH IY OW e n/a 17 2184 2202 2256 N
+ HH IY OW i n/a 17 2184 2202 2256 N
+ HH IY OY b n/a 17 2185 2202 2256 N
+ HH IY OY e n/a 17 2185 2202 2256 N
+ HH IY P b n/a 17 2170 2224 2265 N
+ HH IY P e n/a 17 2170 2224 2265 N
+ HH IY R b n/a 17 2184 2197 2254 N
+ HH IY R e n/a 17 2184 2197 2254 N
+ HH IY S e n/a 17 2170 2224 2265 N
+ HH IY SH e n/a 17 2170 2224 2265 N
+ HH IY SIL e n/a 17 2170 2224 2265 N
+ HH IY T b n/a 17 2170 2224 2265 N
+ HH IY T e n/a 17 2170 2224 2265 N
+ HH IY TH e n/a 17 2170 2224 2265 N
+ HH IY UH b n/a 17 2183 2206 2247 N
+ HH IY UH e n/a 17 2183 2206 2247 N
+ HH IY UH i n/a 17 2183 2206 2247 N
+ HH IY UW b n/a 17 2183 2206 2246 N
+ HH IY UW e n/a 17 2183 2206 2246 N
+ HH IY UW i n/a 17 2183 2206 2246 N
+ HH IY V b n/a 17 2170 2224 2265 N
+ HH IY V e n/a 17 2170 2224 2265 N
+ HH IY W b n/a 17 2187 2208 2244 N
+ HH IY W e n/a 17 2187 2208 2244 N
+ HH IY W i n/a 17 2187 2208 2244 N
+ HH IY Y b n/a 17 2173 2229 2250 N
+ HH IY Y e n/a 17 2173 2229 2250 N
+ HH IY Y i n/a 17 2173 2229 2250 N
+ HH IY Z e n/a 17 2170 2224 2265 N
+ HH IY ZH e n/a 17 2170 2224 2265 N
+ HH JH AA b n/a 17 2146 2199 2254 N
+ HH JH AA i n/a 17 2146 2199 2254 N
+ HH JH AE b n/a 17 2149 2220 2262 N
+ HH JH AE i n/a 17 2149 2220 2262 N
+ HH JH AH b n/a 17 2149 2198 2253 N
+ HH JH AH i n/a 17 2149 2198 2253 N
+ HH JH AO b n/a 17 2146 2201 2256 N
+ HH JH AW b n/a 17 2149 2214 2268 N
+ HH JH AY b n/a 17 2146 2200 2255 N
+ HH JH B b n/a 17 2149 2220 2265 N
+ HH JH CH b n/a 17 2149 2220 2265 N
+ HH JH EH b n/a 17 2149 2220 2264 N
+ HH JH EH i n/a 17 2149 2220 2264 N
+ HH JH ER b n/a 17 2150 2209 2258 N
+ HH JH EY b n/a 17 2149 2220 2265 N
+ HH JH F b n/a 17 2149 2220 2265 N
+ HH JH G b n/a 17 2149 2220 2265 N
+ HH JH IH b n/a 17 2158 2238 2241 N
+ HH JH IH i n/a 17 2158 2238 2241 N
+ HH JH IY b n/a 17 2155 2230 2249 N
+ HH JH L b n/a 17 2146 2198 2245 N
+ HH JH M b n/a 17 2149 2220 2265 N
+ HH JH N b n/a 17 2149 2220 2265 N
+ HH JH OW b n/a 17 2146 2201 2256 N
+ HH JH OY b n/a 17 2146 2201 2256 N
+ HH JH P b n/a 17 2149 2220 2265 N
+ HH JH R b n/a 17 2146 2198 2254 N
+ HH JH T b n/a 17 2149 2220 2265 N
+ HH JH UH b n/a 17 2156 2206 2247 N
+ HH JH UW b n/a 17 2156 2206 2246 N
+ HH JH V b n/a 17 2149 2220 2265 N
+ HH JH W b n/a 17 2148 2207 2245 N
+ HH JH Y b n/a 17 2155 2230 2250 N
+ HH K AA b n/a 17 2146 2199 2254 N
+ HH K AA i n/a 17 2146 2199 2254 N
+ HH K AE b n/a 17 2149 2220 2262 N
+ HH K AE i n/a 17 2149 2220 2262 N
+ HH K AH b n/a 17 2149 2198 2253 N
+ HH K AH i n/a 17 2149 2198 2253 N
+ HH K AO b n/a 17 2146 2201 2256 N
+ HH K AO i n/a 17 2146 2201 2256 N
+ HH K AW b n/a 17 2149 2214 2268 N
+ HH K AW i n/a 17 2149 2214 2268 N
+ HH K AY b n/a 17 2146 2200 2255 N
+ HH K AY i n/a 17 2146 2198 2253 N
+ HH K B b n/a 17 2149 2220 2265 N
+ HH K CH b n/a 17 2149 2220 2265 N
+ HH K EH b n/a 17 2149 2220 2264 N
+ HH K EH i n/a 17 2149 2220 2264 N
+ HH K ER b n/a 17 2151 2210 2258 N
+ HH K ER i n/a 17 2151 2210 2258 N
+ HH K EY b n/a 17 2149 2220 2265 N
+ HH K EY i n/a 17 2149 2220 2265 N
+ HH K F b n/a 17 2149 2220 2265 N
+ HH K G b n/a 17 2149 2220 2265 N
+ HH K IH b n/a 17 2158 2237 2240 N
+ HH K IH i n/a 17 2158 2237 2240 N
+ HH K IY b n/a 17 2155 2228 2249 N
+ HH K IY i n/a 17 2155 2228 2249 N
+ HH K L b n/a 17 2146 2198 2245 N
+ HH K M b n/a 17 2149 2220 2265 N
+ HH K N b n/a 17 2149 2220 2265 N
+ HH K OW b n/a 17 2146 2201 2256 N
+ HH K OW i n/a 17 2146 2201 2256 N
+ HH K OY b n/a 17 2146 2201 2256 N
+ HH K P b n/a 17 2149 2220 2265 N
+ HH K R b n/a 17 2146 2198 2254 N
+ HH K T b n/a 17 2149 2220 2265 N
+ HH K UH b n/a 17 2156 2206 2247 N
+ HH K UH i n/a 17 2156 2206 2247 N
+ HH K UW b n/a 17 2156 2206 2246 N
+ HH K V b n/a 17 2149 2220 2265 N
+ HH K W b n/a 17 2148 2207 2245 N
+ HH K Y b n/a 17 2155 2228 2250 N
+ HH L AA b n/a 17 2181 2199 2254 N
+ HH L AA i n/a 17 2181 2199 2254 N
+ HH L AE b n/a 17 2174 2215 2261 N
+ HH L AE i n/a 17 2174 2215 2261 N
+ HH L AH b n/a 17 2174 2197 2253 N
+ HH L AH i n/a 17 2174 2197 2253 N
+ HH L AO b n/a 17 2181 2201 2256 N
+ HH L AO i n/a 17 2181 2201 2256 N
+ HH L AW b n/a 17 2174 2214 2268 N
+ HH L AW i n/a 17 2174 2214 2268 N
+ HH L AY b n/a 17 2181 2200 2255 N
+ HH L AY i n/a 17 2181 2197 2253 N
+ HH L B b n/a 17 2174 2215 2265 N
+ HH L CH b n/a 17 2174 2215 2265 N
+ HH L EH b n/a 17 2174 2215 2264 N
+ HH L EH i n/a 17 2174 2215 2264 N
+ HH L ER b n/a 17 2178 2211 2257 N
+ HH L ER i n/a 17 2178 2211 2257 N
+ HH L EY b n/a 17 2174 2215 2265 N
+ HH L EY i n/a 17 2174 2215 2265 N
+ HH L F b n/a 17 2174 2215 2265 N
+ HH L G b n/a 17 2174 2215 2265 N
+ HH L IH b n/a 17 2177 2233 2242 N
+ HH L IH i n/a 17 2177 2233 2242 N
+ HH L IY b n/a 17 2176 2226 2252 N
+ HH L IY i n/a 17 2176 2226 2252 N
+ HH L L b n/a 17 2178 2197 2244 N
+ HH L M b n/a 17 2174 2215 2265 N
+ HH L N b n/a 17 2174 2215 2265 N
+ HH L OW b n/a 17 2181 2201 2256 N
+ HH L OW i n/a 17 2181 2201 2256 N
+ HH L OY b n/a 17 2181 2201 2256 N
+ HH L OY i n/a 17 2181 2201 2256 N
+ HH L P b n/a 17 2174 2215 2265 N
+ HH L R b n/a 17 2178 2197 2254 N
+ HH L T b n/a 17 2174 2215 2265 N
+ HH L UH b n/a 17 2178 2205 2247 N
+ HH L UH i n/a 17 2178 2205 2247 N
+ HH L UW b n/a 17 2178 2205 2247 N
+ HH L UW i n/a 17 2178 2205 2247 N
+ HH L V b n/a 17 2174 2215 2265 N
+ HH L W b n/a 17 2178 2207 2244 N
+ HH L W i n/a 17 2178 2207 2244 N
+ HH L Y b n/a 17 2176 2227 2250 N
+ HH L Y i n/a 17 2176 2227 2250 N
+ HH M AA b n/a 17 2186 2199 2254 N
+ HH M AA i n/a 17 2186 2199 2254 N
+ HH M AE b n/a 17 2191 2219 2261 N
+ HH M AE i n/a 17 2191 2219 2261 N
+ HH M AH b n/a 17 2191 2197 2253 N
+ HH M AH i n/a 17 2191 2197 2253 N
+ HH M AO b n/a 17 2186 2201 2256 N
+ HH M AO i n/a 17 2186 2201 2256 N
+ HH M AW b n/a 17 2191 2214 2268 N
+ HH M AW i n/a 17 2191 2214 2268 N
+ HH M AY b n/a 17 2186 2200 2255 N
+ HH M AY i n/a 17 2186 2197 2253 N
+ HH M B b n/a 17 2191 2217 2265 N
+ HH M CH b n/a 17 2191 2217 2265 N
+ HH M EH b n/a 17 2191 2217 2264 N
+ HH M EH i n/a 17 2191 2217 2264 N
+ HH M ER b n/a 17 2191 2211 2257 N
+ HH M ER i n/a 17 2191 2211 2257 N
+ HH M EY b n/a 17 2191 2217 2265 N
+ HH M F b n/a 17 2191 2217 2265 N
+ HH M G b n/a 17 2191 2217 2265 N
+ HH M IH b n/a 17 2161 2236 2242 N
+ HH M IY b n/a 17 2163 2227 2252 N
+ HH M IY i n/a 17 2163 2227 2252 N
+ HH M L b n/a 17 2179 2197 2244 N
+ HH M M b n/a 17 2191 2217 2265 N
+ HH M N b n/a 17 2191 2217 2265 N
+ HH M OW b n/a 17 2186 2201 2256 N
+ HH M OW i n/a 17 2186 2201 2256 N
+ HH M OY b n/a 17 2186 2201 2256 N
+ HH M OY i n/a 17 2186 2201 2256 N
+ HH M P b n/a 17 2191 2217 2265 N
+ HH M R b n/a 17 2186 2197 2254 N
+ HH M T b n/a 17 2191 2217 2265 N
+ HH M UH b n/a 17 2160 2205 2247 N
+ HH M UH i n/a 17 2160 2205 2247 N
+ HH M UW b n/a 17 2160 2205 2247 N
+ HH M UW i n/a 17 2160 2205 2247 N
+ HH M V b n/a 17 2191 2217 2265 N
+ HH M W b n/a 17 2179 2207 2244 N
+ HH M W i n/a 17 2179 2207 2244 N
+ HH M Y b n/a 17 2163 2227 2250 N
+ HH M Z i n/a 17 2191 2217 2265 N
+ HH N AA b n/a 17 2186 2199 2254 N
+ HH N AA i n/a 17 2186 2199 2254 N
+ HH N AE b n/a 17 2188 2219 2261 N
+ HH N AE i n/a 17 2188 2219 2261 N
+ HH N AH b n/a 17 2191 2197 2253 N
+ HH N AH i n/a 17 2191 2197 2253 N
+ HH N AO b n/a 17 2186 2202 2256 N
+ HH N AO i n/a 17 2186 2202 2256 N
+ HH N AW b n/a 17 2191 2214 2268 N
+ HH N AW i n/a 17 2191 2214 2268 N
+ HH N AY b n/a 17 2186 2200 2255 N
+ HH N AY i n/a 17 2186 2197 2253 N
+ HH N B b n/a 17 2191 2217 2265 N
+ HH N CH b n/a 17 2191 2217 2265 N
+ HH N EH b n/a 17 2188 2217 2264 N
+ HH N EH i n/a 17 2188 2217 2264 N
+ HH N ER b n/a 17 2190 2212 2257 N
+ HH N ER i n/a 17 2190 2212 2257 N
+ HH N EY b n/a 17 2188 2217 2265 N
+ HH N EY i n/a 17 2188 2217 2265 N
+ HH N F b n/a 17 2191 2217 2265 N
+ HH N G b n/a 17 2191 2217 2265 N
+ HH N IH b n/a 17 2161 2236 2242 N
+ HH N IH i n/a 17 2161 2234 2242 N
+ HH N IY b n/a 17 2163 2227 2252 N
+ HH N IY i n/a 17 2163 2227 2252 N
+ HH N L b n/a 17 2179 2197 2244 N
+ HH N M b n/a 17 2191 2217 2265 N
+ HH N N b n/a 17 2191 2217 2265 N
+ HH N OW b n/a 17 2186 2202 2256 N
+ HH N OW i n/a 17 2186 2202 2256 N
+ HH N OY b n/a 17 2186 2202 2256 N
+ HH N OY i n/a 17 2186 2202 2256 N
+ HH N P b n/a 17 2191 2217 2265 N
+ HH N R b n/a 17 2186 2197 2254 N
+ HH N T b n/a 17 2191 2217 2265 N
+ HH N UH b n/a 17 2160 2206 2247 N
+ HH N UH i n/a 17 2160 2206 2247 N
+ HH N UW b n/a 17 2160 2206 2246 N
+ HH N UW i n/a 17 2160 2206 2246 N
+ HH N V b n/a 17 2191 2217 2265 N
+ HH N W b n/a 17 2179 2207 2244 N
+ HH N W i n/a 17 2179 2207 2244 N
+ HH N Y b n/a 17 2162 2227 2250 N
+ HH N Y i n/a 17 2162 2227 2250 N
+ HH NG AA b n/a 17 2186 2199 2254 N
+ HH NG AA e n/a 17 2186 2199 2254 N
+ HH NG AA i n/a 17 2186 2199 2254 N
+ HH NG AE b n/a 17 2189 2217 2261 N
+ HH NG AE e n/a 17 2189 2217 2261 N
+ HH NG AE i n/a 17 2189 2217 2261 N
+ HH NG AH b n/a 17 2191 2197 2253 N
+ HH NG AH e n/a 17 2191 2197 2253 N
+ HH NG AH i n/a 17 2191 2197 2253 N
+ HH NG AO b n/a 17 2186 2201 2256 N
+ HH NG AO e n/a 17 2186 2201 2256 N
+ HH NG AO i n/a 17 2186 2201 2256 N
+ HH NG AW b n/a 17 2189 2214 2268 N
+ HH NG AW e n/a 17 2189 2214 2268 N
+ HH NG AW i n/a 17 2189 2214 2268 N
+ HH NG AY b n/a 17 2186 2200 2255 N
+ HH NG AY e n/a 17 2186 2197 2253 N
+ HH NG AY i n/a 17 2186 2197 2253 N
+ HH NG B b n/a 17 2189 2217 2265 N
+ HH NG B e n/a 17 2189 2217 2265 N
+ HH NG CH b n/a 17 2189 2217 2265 N
+ HH NG CH e n/a 17 2189 2217 2265 N
+ HH NG D e n/a 17 2189 2217 2265 N
+ HH NG DH e n/a 17 2189 2217 2265 N
+ HH NG EH b n/a 17 2189 2217 2264 N
+ HH NG EH e n/a 17 2189 2217 2264 N
+ HH NG EH i n/a 17 2189 2217 2264 N
+ HH NG ER b n/a 17 2190 2212 2257 N
+ HH NG ER e n/a 17 2190 2212 2257 N
+ HH NG ER i n/a 17 2190 2212 2257 N
+ HH NG EY b n/a 17 2189 2217 2265 N
+ HH NG EY e n/a 17 2189 2217 2265 N
+ HH NG F b n/a 17 2189 2217 2265 N
+ HH NG F e n/a 17 2189 2217 2265 N
+ HH NG G b n/a 17 2189 2217 2265 N
+ HH NG G e n/a 17 2189 2217 2265 N
+ HH NG HH e n/a 17 2189 2217 2265 N
+ HH NG IH b n/a 17 2162 2235 2243 N
+ HH NG IH e n/a 17 2162 2235 2243 N
+ HH NG IH i n/a 17 2162 2236 2243 N
+ HH NG IY b n/a 17 2162 2227 2252 N
+ HH NG IY e n/a 17 2162 2227 2252 N
+ HH NG JH e n/a 17 2189 2217 2265 N
+ HH NG K e n/a 17 2189 2217 2265 N
+ HH NG L b n/a 17 2179 2197 2244 N
+ HH NG L e n/a 17 2179 2197 2244 N
+ HH NG M b n/a 17 2189 2217 2265 N
+ HH NG M e n/a 17 2189 2217 2265 N
+ HH NG N b n/a 17 2189 2217 2265 N
+ HH NG N e n/a 17 2189 2217 2265 N
+ HH NG NG e n/a 17 2189 2217 2265 N
+ HH NG OW b n/a 17 2186 2201 2256 N
+ HH NG OW e n/a 17 2186 2201 2256 N
+ HH NG OW i n/a 17 2186 2201 2256 N
+ HH NG OY b n/a 17 2186 2201 2256 N
+ HH NG OY e n/a 17 2186 2201 2256 N
+ HH NG P b n/a 17 2189 2217 2265 N
+ HH NG P e n/a 17 2189 2217 2265 N
+ HH NG R b n/a 17 2186 2197 2254 N
+ HH NG R e n/a 17 2186 2197 2254 N
+ HH NG S e n/a 17 2189 2217 2265 N
+ HH NG SH e n/a 17 2189 2217 2265 N
+ HH NG SIL e n/a 17 2189 2217 2265 N
+ HH NG T b n/a 17 2189 2217 2265 N
+ HH NG T e n/a 17 2189 2217 2265 N
+ HH NG TH e n/a 17 2189 2217 2265 N
+ HH NG UH b n/a 17 2160 2205 2247 N
+ HH NG UH e n/a 17 2160 2205 2247 N
+ HH NG UW b n/a 17 2160 2205 2246 N
+ HH NG UW e n/a 17 2160 2205 2246 N
+ HH NG V b n/a 17 2189 2217 2265 N
+ HH NG V e n/a 17 2189 2217 2265 N
+ HH NG W b n/a 17 2179 2207 2244 N
+ HH NG W e n/a 17 2179 2207 2244 N
+ HH NG W i n/a 17 2179 2207 2244 N
+ HH NG Y b n/a 17 2162 2227 2250 N
+ HH NG Y e n/a 17 2162 2227 2250 N
+ HH NG Y i n/a 17 2162 2227 2250 N
+ HH NG Z e n/a 17 2189 2217 2265 N
+ HH NG ZH e n/a 17 2189 2217 2265 N
+ HH OW AA b n/a 17 2181 2199 2254 N
+ HH OW AA i n/a 17 2181 2199 2254 N
+ HH OW AE b n/a 17 2174 2215 2261 N
+ HH OW AE i n/a 17 2174 2215 2261 N
+ HH OW AH b n/a 17 2174 2197 2253 N
+ HH OW AH i n/a 17 2174 2197 2253 N
+ HH OW AO b n/a 17 2181 2201 2256 N
+ HH OW AO i n/a 17 2181 2201 2256 N
+ HH OW AW b n/a 17 2174 2214 2268 N
+ HH OW AW i n/a 17 2174 2214 2268 N
+ HH OW AY b n/a 17 2181 2200 2255 N
+ HH OW AY i n/a 17 2181 2197 2253 N
+ HH OW B b n/a 17 2174 2215 2265 N
+ HH OW CH b n/a 17 2174 2215 2265 N
+ HH OW EH b n/a 17 2174 2215 2264 N
+ HH OW EH i n/a 17 2174 2215 2264 N
+ HH OW ER b n/a 17 2178 2211 2257 N
+ HH OW ER i n/a 17 2178 2211 2257 N
+ HH OW EY b n/a 17 2174 2215 2265 N
+ HH OW EY i n/a 17 2174 2215 2265 N
+ HH OW F b n/a 17 2174 2215 2265 N
+ HH OW G b n/a 17 2174 2215 2265 N
+ HH OW IH b n/a 17 2177 2233 2242 N
+ HH OW IH i n/a 17 2177 2232 2242 N
+ HH OW IY b n/a 17 2176 2226 2252 N
+ HH OW IY i n/a 17 2176 2226 2252 N
+ HH OW L b n/a 17 2178 2197 2244 N
+ HH OW M b n/a 17 2174 2215 2265 N
+ HH OW N b n/a 17 2174 2215 2265 N
+ HH OW OW b n/a 17 2181 2201 2256 N
+ HH OW OW i n/a 17 2181 2201 2256 N
+ HH OW OY b n/a 17 2181 2201 2256 N
+ HH OW P b n/a 17 2174 2215 2265 N
+ HH OW R b n/a 17 2178 2197 2254 N
+ HH OW T b n/a 17 2174 2215 2265 N
+ HH OW UH b n/a 17 2178 2205 2247 N
+ HH OW UH i n/a 17 2178 2205 2247 N
+ HH OW UW b n/a 17 2178 2205 2247 N
+ HH OW UW i n/a 17 2178 2205 2247 N
+ HH OW V b n/a 17 2174 2215 2265 N
+ HH OW W b n/a 17 2178 2207 2244 N
+ HH OW W i n/a 17 2178 2207 2244 N
+ HH OW Y b n/a 17 2176 2227 2250 N
+ HH OW Y i n/a 17 2176 2227 2250 N
+ HH OY AA b n/a 17 2182 2199 2254 N
+ HH OY AE b n/a 17 2169 2224 2259 N
+ HH OY AH b n/a 17 2169 2225 2261 N
+ HH OY AO b n/a 17 2182 2202 2256 N
+ HH OY AW b n/a 17 2169 2225 2268 N
+ HH OY AY b n/a 17 2182 2200 2255 N
+ HH OY B b n/a 17 2169 2224 2265 N
+ HH OY CH b n/a 17 2169 2224 2265 N
+ HH OY EH b n/a 17 2169 2224 2264 N
+ HH OY ER b n/a 17 2182 2212 2257 N
+ HH OY EY b n/a 17 2169 2224 2265 N
+ HH OY F b n/a 17 2169 2224 2265 N
+ HH OY G b n/a 17 2169 2224 2265 N
+ HH OY IH b n/a 17 2169 2234 2243 N
+ HH OY IH i n/a 17 2169 2234 2243 N
+ HH OY IY b n/a 17 2168 2227 2251 N
+ HH OY L b n/a 17 2182 2197 2245 N
+ HH OY M b n/a 17 2169 2224 2265 N
+ HH OY N b n/a 17 2169 2224 2265 N
+ HH OY OW b n/a 17 2182 2202 2256 N
+ HH OY OY b n/a 17 2182 2202 2256 N
+ HH OY P b n/a 17 2169 2224 2265 N
+ HH OY R b n/a 17 2182 2197 2254 N
+ HH OY T b n/a 17 2169 2224 2265 N
+ HH OY UH b n/a 17 2182 2206 2247 N
+ HH OY UH i n/a 17 2183 2206 2247 N
+ HH OY UW b n/a 17 2182 2206 2246 N
+ HH OY V b n/a 17 2169 2224 2265 N
+ HH OY W b n/a 17 2187 2208 2245 N
+ HH OY Y b n/a 17 2168 2229 2250 N
+ HH P AA b n/a 17 2146 2199 2254 N
+ HH P AA i n/a 17 2146 2199 2254 N
+ HH P AE b n/a 17 2153 2220 2262 N
+ HH P AE i n/a 17 2153 2220 2262 N
+ HH P AH b n/a 17 2153 2198 2253 N
+ HH P AO b n/a 17 2146 2201 2256 N
+ HH P AO i n/a 17 2146 2201 2256 N
+ HH P AW b n/a 17 2153 2214 2268 N
+ HH P AW i n/a 17 2153 2214 2268 N
+ HH P AY b n/a 17 2146 2200 2255 N
+ HH P AY i n/a 17 2146 2198 2253 N
+ HH P B b n/a 17 2153 2220 2265 N
+ HH P CH b n/a 17 2153 2220 2265 N
+ HH P EH b n/a 17 2153 2220 2264 N
+ HH P EH i n/a 17 2153 2220 2264 N
+ HH P ER b n/a 17 2151 2210 2258 N
+ HH P EY b n/a 17 2153 2220 2265 N
+ HH P F b n/a 17 2153 2220 2265 N
+ HH P G b n/a 17 2153 2220 2265 N
+ HH P IH b n/a 17 2158 2239 2241 N
+ HH P IH i n/a 17 2158 2239 2241 N
+ HH P IY b n/a 17 2154 2228 2249 N
+ HH P IY i n/a 17 2154 2228 2249 N
+ HH P L b n/a 17 2146 2198 2245 N
+ HH P M b n/a 17 2153 2220 2265 N
+ HH P N b n/a 17 2153 2220 2265 N
+ HH P OW b n/a 17 2146 2201 2256 N
+ HH P OW i n/a 17 2146 2201 2256 N
+ HH P OY b n/a 17 2146 2201 2256 N
+ HH P P b n/a 17 2153 2220 2265 N
+ HH P R b n/a 17 2146 2198 2254 N
+ HH P T b n/a 17 2153 2220 2265 N
+ HH P UH b n/a 17 2156 2206 2247 N
+ HH P UH i n/a 17 2156 2206 2247 N
+ HH P UW b n/a 17 2156 2206 2247 N
+ HH P V b n/a 17 2153 2220 2265 N
+ HH P W b n/a 17 2148 2207 2245 N
+ HH P Y b n/a 17 2154 2228 2250 N
+ HH R AA b n/a 17 2193 2199 2254 N
+ HH R AA e n/a 17 2193 2199 2254 N
+ HH R AA i n/a 17 2193 2199 2254 N
+ HH R AE b n/a 17 2192 2218 2261 N
+ HH R AE e n/a 17 2192 2218 2261 N
+ HH R AE i n/a 17 2192 2218 2261 N
+ HH R AH b n/a 17 2193 2198 2253 N
+ HH R AH e n/a 17 2193 2198 2253 N
+ HH R AH i n/a 17 2193 2198 2253 N
+ HH R AO b n/a 17 2193 2202 2256 N
+ HH R AO e n/a 17 2193 2202 2256 N
+ HH R AO i n/a 17 2193 2202 2256 N
+ HH R AW b n/a 17 2192 2214 2268 N
+ HH R AW e n/a 17 2192 2214 2268 N
+ HH R AW i n/a 17 2192 2214 2268 N
+ HH R AY b n/a 17 2193 2200 2255 N
+ HH R AY e n/a 17 2193 2198 2253 N
+ HH R AY i n/a 17 2193 2198 2253 N
+ HH R B b n/a 17 2192 2217 2265 N
+ HH R B e n/a 17 2192 2217 2265 N
+ HH R CH b n/a 17 2192 2217 2265 N
+ HH R CH e n/a 17 2192 2217 2265 N
+ HH R D e n/a 17 2192 2217 2265 N
+ HH R DH e n/a 17 2192 2217 2265 N
+ HH R EH b n/a 17 2192 2217 2264 N
+ HH R EH e n/a 17 2192 2217 2264 N
+ HH R EH i n/a 17 2192 2217 2264 N
+ HH R ER b n/a 17 2194 2211 2257 N
+ HH R ER e n/a 17 2194 2211 2257 N
+ HH R ER i n/a 17 2194 2211 2257 N
+ HH R EY b n/a 17 2192 2217 2265 N
+ HH R EY e n/a 17 2192 2217 2265 N
+ HH R EY i n/a 17 2192 2217 2265 N
+ HH R F b n/a 17 2192 2217 2265 N
+ HH R F e n/a 17 2192 2217 2265 N
+ HH R G b n/a 17 2192 2217 2265 N
+ HH R G e n/a 17 2192 2217 2265 N
+ HH R HH e n/a 17 2192 2217 2265 N
+ HH R IH b n/a 17 2196 2232 2242 N
+ HH R IH e n/a 17 2196 2232 2242 N
+ HH R IH i n/a 17 2196 2232 2242 N
+ HH R IY b n/a 17 2195 2227 2251 N
+ HH R IY e n/a 17 2195 2227 2251 N
+ HH R IY i n/a 17 2195 2227 2251 N
+ HH R JH e n/a 17 2192 2217 2265 N
+ HH R K e n/a 17 2192 2217 2265 N
+ HH R L b n/a 17 2194 2198 2244 N
+ HH R L e n/a 17 2194 2198 2244 N
+ HH R M b n/a 17 2192 2217 2265 N
+ HH R M e n/a 17 2192 2217 2265 N
+ HH R N b n/a 17 2192 2217 2265 N
+ HH R N e n/a 17 2192 2217 2265 N
+ HH R NG e n/a 17 2192 2217 2265 N
+ HH R OW b n/a 17 2193 2202 2256 N
+ HH R OW e n/a 17 2193 2202 2256 N
+ HH R OW i n/a 17 2193 2202 2256 N
+ HH R OY b n/a 17 2193 2202 2256 N
+ HH R OY e n/a 17 2193 2202 2256 N
+ HH R P b n/a 17 2192 2217 2265 N
+ HH R P e n/a 17 2192 2217 2265 N
+ HH R R b n/a 17 2194 2198 2254 N
+ HH R R e n/a 17 2194 2198 2254 N
+ HH R S e n/a 17 2192 2217 2265 N
+ HH R SH e n/a 17 2192 2217 2265 N
+ HH R SIL e n/a 17 2192 2217 2265 N
+ HH R T b n/a 17 2192 2217 2265 N
+ HH R T e n/a 17 2192 2217 2265 N
+ HH R TH e n/a 17 2192 2217 2265 N
+ HH R UH b n/a 17 2194 2205 2247 N
+ HH R UH e n/a 17 2194 2205 2247 N
+ HH R UH i n/a 17 2194 2205 2247 N
+ HH R UW b n/a 17 2194 2205 2247 N
+ HH R UW e n/a 17 2194 2205 2247 N
+ HH R UW i n/a 17 2194 2205 2247 N
+ HH R V b n/a 17 2192 2217 2265 N
+ HH R V e n/a 17 2192 2217 2265 N
+ HH R W b n/a 17 2194 2207 2244 N
+ HH R W e n/a 17 2194 2207 2244 N
+ HH R W i n/a 17 2194 2207 2244 N
+ HH R Y b n/a 17 2195 2227 2250 N
+ HH R Y e n/a 17 2195 2227 2250 N
+ HH R Y i n/a 17 2195 2227 2250 N
+ HH R Z e n/a 17 2192 2217 2265 N
+ HH R ZH e n/a 17 2192 2217 2265 N
+ HH S AA b n/a 17 2146 2199 2254 N
+ HH S AA i n/a 17 2146 2199 2254 N
+ HH S AE b n/a 17 2149 2220 2266 N
+ HH S AE i n/a 17 2149 2220 2266 N
+ HH S AH b n/a 17 2149 2198 2253 N
+ HH S AH i n/a 17 2149 2198 2253 N
+ HH S AO b n/a 17 2146 2202 2256 N
+ HH S AO i n/a 17 2146 2202 2256 N
+ HH S AW b n/a 17 2149 2213 2268 N
+ HH S AW i n/a 17 2149 2213 2268 N
+ HH S AY b n/a 17 2146 2200 2255 N
+ HH S AY i n/a 17 2146 2198 2253 N
+ HH S B b n/a 17 2149 2220 2265 N
+ HH S CH b n/a 17 2149 2220 2265 N
+ HH S EH b n/a 17 2149 2220 2264 N
+ HH S EH i n/a 17 2149 2220 2264 N
+ HH S ER b n/a 17 2150 2209 2258 N
+ HH S ER i n/a 17 2150 2209 2258 N
+ HH S EY b n/a 17 2149 2220 2265 N
+ HH S EY i n/a 17 2149 2220 2265 N
+ HH S F b n/a 17 2149 2220 2265 N
+ HH S G b n/a 17 2149 2220 2265 N
+ HH S IH b n/a 17 2159 2239 2241 N
+ HH S IY b n/a 17 2159 2230 2249 N
+ HH S IY i n/a 17 2159 2230 2249 N
+ HH S L b n/a 17 2146 2198 2245 N
+ HH S M b n/a 17 2149 2220 2265 N
+ HH S N b n/a 17 2149 2220 2265 N
+ HH S OW b n/a 17 2146 2202 2256 N
+ HH S OW i n/a 17 2146 2202 2256 N
+ HH S OY b n/a 17 2146 2202 2256 N
+ HH S P b n/a 17 2149 2220 2265 N
+ HH S R b n/a 17 2146 2198 2254 N
+ HH S T b n/a 17 2149 2220 2265 N
+ HH S UH b n/a 17 2156 2205 2247 N
+ HH S UH i n/a 17 2156 2205 2247 N
+ HH S UW b n/a 17 2156 2203 2246 N
+ HH S V b n/a 17 2149 2220 2265 N
+ HH S W b n/a 17 2148 2205 2245 N
+ HH S Y b n/a 17 2159 2230 2250 N
+ HH S Y i n/a 17 2159 2230 2250 N
+ HH SH AA b n/a 17 2146 2199 2254 N
+ HH SH AE b n/a 17 2149 2220 2266 N
+ HH SH AE i n/a 17 2149 2220 2266 N
+ HH SH AH b n/a 17 2149 2198 2253 N
+ HH SH AH i n/a 17 2149 2198 2253 N
+ HH SH AO b n/a 17 2146 2201 2256 N
+ HH SH AO i n/a 17 2146 2201 2256 N
+ HH SH AW b n/a 17 2149 2213 2268 N
+ HH SH AY b n/a 17 2146 2200 2255 N
+ HH SH B b n/a 17 2149 2220 2265 N
+ HH SH CH b n/a 17 2149 2220 2265 N
+ HH SH EH b n/a 17 2149 2220 2264 N
+ HH SH ER b n/a 17 2150 2209 2258 N
+ HH SH ER i n/a 17 2150 2209 2258 N
+ HH SH EY b n/a 17 2149 2220 2265 N
+ HH SH F b n/a 17 2149 2220 2265 N
+ HH SH G b n/a 17 2149 2220 2265 N
+ HH SH IH b n/a 17 2158 2239 2241 N
+ HH SH IY b n/a 17 2159 2230 2249 N
+ HH SH L b n/a 17 2146 2198 2245 N
+ HH SH M b n/a 17 2149 2220 2265 N
+ HH SH N b n/a 17 2149 2220 2265 N
+ HH SH OW b n/a 17 2146 2201 2256 N
+ HH SH OY b n/a 17 2146 2201 2256 N
+ HH SH P b n/a 17 2149 2220 2265 N
+ HH SH R b n/a 17 2146 2198 2254 N
+ HH SH T b n/a 17 2149 2220 2265 N
+ HH SH UH b n/a 17 2156 2205 2247 N
+ HH SH UW b n/a 17 2156 2205 2246 N
+ HH SH V b n/a 17 2149 2220 2265 N
+ HH SH W b n/a 17 2148 2205 2245 N
+ HH SH Y b n/a 17 2159 2230 2250 N
+ HH SIL AA b n/a 17 2142 2199 2254 N
+ HH SIL AE b n/a 17 2141 2222 2267 N
+ HH SIL AH b n/a 17 2142 2198 2253 N
+ HH SIL AO b n/a 17 2144 2201 2256 N
+ HH SIL AW b n/a 17 2142 2213 2268 N
+ HH SIL AY b n/a 17 2142 2200 2255 N
+ HH SIL B b n/a 17 2141 2222 2265 N
+ HH SIL CH b n/a 17 2141 2222 2265 N
+ HH SIL EH b n/a 17 2141 2222 2264 N
+ HH SIL ER b n/a 17 2143 2210 2258 N
+ HH SIL EY b n/a 17 2141 2222 2265 N
+ HH SIL F b n/a 17 2141 2222 2265 N
+ HH SIL G b n/a 17 2141 2222 2265 N
+ HH SIL IH b n/a 17 2164 2237 2240 N
+ HH SIL IY b n/a 17 2165 2231 2248 N
+ HH SIL L b n/a 17 2142 2198 2245 N
+ HH SIL M b n/a 17 2141 2222 2265 N
+ HH SIL N b n/a 17 2141 2222 2265 N
+ HH SIL OW b n/a 17 2144 2201 2256 N
+ HH SIL OY b n/a 17 2144 2201 2256 N
+ HH SIL P b n/a 17 2141 2222 2265 N
+ HH SIL R b n/a 17 2143 2198 2254 N
+ HH SIL T b n/a 17 2141 2222 2265 N
+ HH SIL UH b n/a 17 2145 2204 2247 N
+ HH SIL UW b n/a 17 2145 2204 2247 N
+ HH SIL V b n/a 17 2141 2222 2265 N
+ HH SIL W b n/a 17 2144 2207 2245 N
+ HH SIL Y b n/a 17 2164 2231 2250 N
+ HH T AA b n/a 17 2147 2199 2254 N
+ HH T AA e n/a 17 2147 2199 2254 N
+ HH T AA i n/a 17 2147 2199 2254 N
+ HH T AE b n/a 17 2152 2221 2262 N
+ HH T AE e n/a 17 2152 2221 2262 N
+ HH T AE i n/a 17 2152 2221 2262 N
+ HH T AH b n/a 17 2153 2198 2253 N
+ HH T AH e n/a 17 2153 2198 2253 N
+ HH T AH i n/a 17 2153 2198 2253 N
+ HH T AO b n/a 17 2147 2202 2256 N
+ HH T AO e n/a 17 2147 2202 2256 N
+ HH T AO i n/a 17 2147 2202 2256 N
+ HH T AW b n/a 17 2153 2214 2268 N
+ HH T AW e n/a 17 2153 2214 2268 N
+ HH T AW i n/a 17 2153 2214 2268 N
+ HH T AY b n/a 17 2147 2200 2255 N
+ HH T AY e n/a 17 2147 2198 2253 N
+ HH T AY i n/a 17 2147 2198 2253 N
+ HH T B b n/a 17 2152 2217 2265 N
+ HH T B e n/a 17 2152 2217 2265 N
+ HH T CH b n/a 17 2152 2217 2265 N
+ HH T CH e n/a 17 2152 2217 2265 N
+ HH T D e n/a 17 2152 2217 2265 N
+ HH T DH e n/a 17 2152 2217 2265 N
+ HH T EH b n/a 17 2152 2217 2264 N
+ HH T EH e n/a 17 2152 2217 2264 N
+ HH T EH i n/a 17 2152 2217 2264 N
+ HH T ER b n/a 17 2150 2209 2258 N
+ HH T ER e n/a 17 2150 2209 2258 N
+ HH T ER i n/a 17 2150 2209 2258 N
+ HH T EY b n/a 17 2152 2217 2265 N
+ HH T EY e n/a 17 2152 2217 2265 N
+ HH T EY i n/a 17 2152 2217 2265 N
+ HH T F b n/a 17 2152 2217 2265 N
+ HH T F e n/a 17 2152 2217 2265 N
+ HH T G b n/a 17 2152 2217 2265 N
+ HH T G e n/a 17 2152 2217 2265 N
+ HH T HH e n/a 17 2152 2217 2265 N
+ HH T IH b n/a 17 2158 2238 2241 N
+ HH T IH e n/a 17 2158 2238 2241 N
+ HH T IH i n/a 17 2158 2238 2241 N
+ HH T IY b n/a 17 2154 2228 2251 N
+ HH T IY e n/a 17 2154 2228 2251 N
+ HH T IY i n/a 17 2154 2228 2251 N
+ HH T JH e n/a 17 2152 2217 2265 N
+ HH T K e n/a 17 2152 2217 2265 N
+ HH T L b n/a 17 2147 2198 2245 N
+ HH T L e n/a 17 2147 2198 2245 N
+ HH T M b n/a 17 2152 2217 2265 N
+ HH T M e n/a 17 2152 2217 2265 N
+ HH T N b n/a 17 2152 2217 2265 N
+ HH T N e n/a 17 2152 2217 2265 N
+ HH T NG e n/a 17 2152 2217 2265 N
+ HH T OW b n/a 17 2147 2202 2256 N
+ HH T OW e n/a 17 2147 2202 2256 N
+ HH T OW i n/a 17 2147 2202 2256 N
+ HH T OY b n/a 17 2147 2202 2256 N
+ HH T OY e n/a 17 2147 2202 2256 N
+ HH T P b n/a 17 2152 2217 2265 N
+ HH T P e n/a 17 2152 2217 2265 N
+ HH T R b n/a 17 2147 2198 2254 N
+ HH T R e n/a 17 2147 2198 2254 N
+ HH T S e n/a 17 2152 2217 2265 N
+ HH T SH e n/a 17 2152 2217 2265 N
+ HH T SIL e n/a 17 2152 2217 2265 N
+ HH T T b n/a 17 2152 2217 2265 N
+ HH T T e n/a 17 2152 2217 2265 N
+ HH T TH e n/a 17 2152 2217 2265 N
+ HH T UH b n/a 17 2156 2206 2247 N
+ HH T UH e n/a 17 2156 2206 2247 N
+ HH T UH i n/a 17 2156 2206 2247 N
+ HH T UW b n/a 17 2156 2206 2246 N
+ HH T UW e n/a 17 2156 2206 2246 N
+ HH T V b n/a 17 2152 2217 2265 N
+ HH T V e n/a 17 2152 2217 2265 N
+ HH T W b n/a 17 2148 2207 2245 N
+ HH T W e n/a 17 2148 2207 2245 N
+ HH T W i n/a 17 2148 2207 2245 N
+ HH T Y b n/a 17 2154 2229 2250 N
+ HH T Y e n/a 17 2154 2229 2250 N
+ HH T Z e n/a 17 2152 2217 2265 N
+ HH T ZH e n/a 17 2152 2217 2265 N
+ HH TH AA b n/a 17 2146 2199 2254 N
+ HH TH AA i n/a 17 2146 2199 2254 N
+ HH TH AE b n/a 17 2149 2220 2266 N
+ HH TH AE i n/a 17 2149 2220 2266 N
+ HH TH AH b n/a 17 2149 2198 2253 N
+ HH TH AO b n/a 17 2146 2202 2256 N
+ HH TH AW b n/a 17 2149 2214 2268 N
+ HH TH AY b n/a 17 2146 2200 2255 N
+ HH TH B b n/a 17 2149 2220 2265 N
+ HH TH CH b n/a 17 2149 2220 2265 N
+ HH TH EH b n/a 17 2149 2220 2264 N
+ HH TH EH i n/a 17 2149 2220 2264 N
+ HH TH ER b n/a 17 2150 2209 2258 N
+ HH TH EY b n/a 17 2149 2220 2265 N
+ HH TH F b n/a 17 2149 2220 2265 N
+ HH TH G b n/a 17 2149 2220 2265 N
+ HH TH IH b n/a 17 2158 2239 2241 N
+ HH TH IH i n/a 17 2158 2239 2241 N
+ HH TH IY b n/a 17 2159 2230 2249 N
+ HH TH L b n/a 17 2146 2198 2245 N
+ HH TH M b n/a 17 2149 2220 2265 N
+ HH TH N b n/a 17 2149 2220 2265 N
+ HH TH OW b n/a 17 2146 2202 2256 N
+ HH TH OW i n/a 17 2146 2202 2256 N
+ HH TH OY b n/a 17 2146 2202 2256 N
+ HH TH P b n/a 17 2149 2220 2265 N
+ HH TH R b n/a 17 2146 2198 2254 N
+ HH TH T b n/a 17 2149 2220 2265 N
+ HH TH UH b n/a 17 2156 2205 2247 N
+ HH TH UW b n/a 17 2156 2203 2246 N
+ HH TH V b n/a 17 2149 2220 2265 N
+ HH TH W b n/a 17 2148 2205 2245 N
+ HH TH Y b n/a 17 2159 2230 2250 N
+ HH UH AA b n/a 17 2181 2199 2254 N
+ HH UH AA i n/a 17 2181 2199 2254 N
+ HH UH AE b n/a 17 2175 2216 2261 N
+ HH UH AH b n/a 17 2175 2197 2253 N
+ HH UH AO b n/a 17 2181 2201 2256 N
+ HH UH AW b n/a 17 2175 2214 2268 N
+ HH UH AY b n/a 17 2181 2200 2255 N
+ HH UH B b n/a 17 2175 2216 2265 N
+ HH UH CH b n/a 17 2175 2216 2265 N
+ HH UH EH b n/a 17 2175 2216 2264 N
+ HH UH ER b n/a 17 2178 2211 2257 N
+ HH UH EY b n/a 17 2175 2216 2265 N
+ HH UH F b n/a 17 2175 2216 2265 N
+ HH UH G b n/a 17 2175 2216 2265 N
+ HH UH IH b n/a 17 2177 2233 2242 N
+ HH UH IY b n/a 17 2176 2226 2252 N
+ HH UH L b n/a 17 2178 2197 2244 N
+ HH UH M b n/a 17 2175 2216 2265 N
+ HH UH N b n/a 17 2175 2216 2265 N
+ HH UH OW b n/a 17 2181 2201 2256 N
+ HH UH OY b n/a 17 2181 2201 2256 N
+ HH UH P b n/a 17 2175 2216 2265 N
+ HH UH R b n/a 17 2178 2197 2254 N
+ HH UH T b n/a 17 2175 2216 2265 N
+ HH UH UH b n/a 17 2178 2205 2247 N
+ HH UH UW b n/a 17 2178 2205 2247 N
+ HH UH V b n/a 17 2175 2216 2265 N
+ HH UH W b n/a 17 2178 2207 2244 N
+ HH UH Y b n/a 17 2176 2227 2250 N
+ HH UW AA b n/a 17 2181 2199 2254 N
+ HH UW AA e n/a 17 2181 2199 2254 N
+ HH UW AA i n/a 17 2181 2199 2254 N
+ HH UW AE b n/a 17 2175 2216 2263 N
+ HH UW AE e n/a 17 2175 2216 2263 N
+ HH UW AE i n/a 17 2175 2216 2263 N
+ HH UW AH b n/a 17 2175 2197 2253 N
+ HH UW AH e n/a 17 2175 2197 2253 N
+ HH UW AH i n/a 17 2175 2197 2253 N
+ HH UW AO b n/a 17 2181 2201 2256 N
+ HH UW AO e n/a 17 2181 2201 2256 N
+ HH UW AO i n/a 17 2181 2201 2256 N
+ HH UW AW b n/a 17 2175 2214 2268 N
+ HH UW AW e n/a 17 2175 2214 2268 N
+ HH UW AW i n/a 17 2175 2214 2268 N
+ HH UW AY b n/a 17 2181 2200 2255 N
+ HH UW AY e n/a 17 2181 2197 2253 N
+ HH UW AY i n/a 17 2181 2197 2253 N
+ HH UW B b n/a 17 2175 2216 2265 N
+ HH UW B e n/a 17 2175 2216 2265 N
+ HH UW CH b n/a 17 2175 2216 2265 N
+ HH UW CH e n/a 17 2175 2216 2265 N
+ HH UW D e n/a 17 2175 2216 2265 N
+ HH UW DH e n/a 17 2175 2216 2265 N
+ HH UW EH b n/a 17 2175 2216 2264 N
+ HH UW EH e n/a 17 2175 2216 2264 N
+ HH UW EH i n/a 17 2175 2216 2264 N
+ HH UW ER b n/a 17 2178 2211 2257 N
+ HH UW ER e n/a 17 2178 2211 2257 N
+ HH UW ER i n/a 17 2178 2211 2257 N
+ HH UW EY b n/a 17 2175 2216 2265 N
+ HH UW EY e n/a 17 2175 2216 2265 N
+ HH UW EY i n/a 17 2175 2216 2265 N
+ HH UW F b n/a 17 2175 2216 2265 N
+ HH UW F e n/a 17 2175 2216 2265 N
+ HH UW G b n/a 17 2175 2216 2265 N
+ HH UW G e n/a 17 2175 2216 2265 N
+ HH UW HH e n/a 17 2175 2216 2265 N
+ HH UW IH b n/a 17 2177 2233 2242 N
+ HH UW IH e n/a 17 2177 2233 2242 N
+ HH UW IH i n/a 17 2177 2233 2242 N
+ HH UW IY b n/a 17 2176 2227 2252 N
+ HH UW IY e n/a 17 2176 2227 2252 N
+ HH UW IY i n/a 17 2176 2227 2252 N
+ HH UW JH e n/a 17 2175 2216 2265 N
+ HH UW K e n/a 17 2175 2216 2265 N
+ HH UW L b n/a 17 2178 2197 2244 N
+ HH UW L e n/a 17 2178 2197 2244 N
+ HH UW M b n/a 17 2175 2216 2265 N
+ HH UW M e n/a 17 2175 2216 2265 N
+ HH UW N b n/a 17 2175 2216 2265 N
+ HH UW N e n/a 17 2175 2216 2265 N
+ HH UW NG e n/a 17 2175 2216 2265 N
+ HH UW OW b n/a 17 2181 2201 2256 N
+ HH UW OW e n/a 17 2181 2201 2256 N
+ HH UW OW i n/a 17 2181 2201 2256 N
+ HH UW OY b n/a 17 2181 2201 2256 N
+ HH UW OY e n/a 17 2181 2201 2256 N
+ HH UW P b n/a 17 2175 2216 2265 N
+ HH UW P e n/a 17 2175 2216 2265 N
+ HH UW R b n/a 17 2178 2197 2254 N
+ HH UW R e n/a 17 2178 2197 2254 N
+ HH UW S e n/a 17 2175 2216 2265 N
+ HH UW SH e n/a 17 2175 2216 2265 N
+ HH UW SIL e n/a 17 2175 2216 2265 N
+ HH UW T b n/a 17 2175 2216 2265 N
+ HH UW T e n/a 17 2175 2216 2265 N
+ HH UW TH e n/a 17 2175 2216 2265 N
+ HH UW UH b n/a 17 2178 2205 2247 N
+ HH UW UH e n/a 17 2178 2205 2247 N
+ HH UW UH i n/a 17 2178 2205 2247 N
+ HH UW UW b n/a 17 2178 2205 2247 N
+ HH UW UW e n/a 17 2178 2205 2247 N
+ HH UW UW i n/a 17 2178 2205 2247 N
+ HH UW V b n/a 17 2175 2216 2265 N
+ HH UW V e n/a 17 2175 2216 2265 N
+ HH UW W b n/a 17 2178 2207 2244 N
+ HH UW W e n/a 17 2178 2207 2244 N
+ HH UW W i n/a 17 2178 2207 2244 N
+ HH UW Y b n/a 17 2176 2227 2250 N
+ HH UW Y e n/a 17 2176 2227 2250 N
+ HH UW Z e n/a 17 2175 2216 2265 N
+ HH UW ZH e n/a 17 2175 2216 2265 N
+ HH V AA b n/a 17 2146 2199 2254 N
+ HH V AA i n/a 17 2146 2199 2254 N
+ HH V AE b n/a 17 2153 2220 2266 N
+ HH V AE i n/a 17 2153 2220 2266 N
+ HH V AH b n/a 17 2153 2198 2253 N
+ HH V AH i n/a 17 2153 2198 2253 N
+ HH V AO b n/a 17 2146 2201 2256 N
+ HH V AW b n/a 17 2153 2214 2268 N
+ HH V AW i n/a 17 2153 2214 2268 N
+ HH V AY b n/a 17 2146 2200 2255 N
+ HH V B b n/a 17 2153 2220 2265 N
+ HH V CH b n/a 17 2153 2220 2265 N
+ HH V EH b n/a 17 2153 2220 2264 N
+ HH V EH i n/a 17 2153 2220 2264 N
+ HH V ER b n/a 17 2151 2210 2258 N
+ HH V ER i n/a 17 2151 2210 2258 N
+ HH V EY b n/a 17 2153 2220 2265 N
+ HH V F b n/a 17 2153 2220 2265 N
+ HH V G b n/a 17 2153 2220 2265 N
+ HH V IH b n/a 17 2157 2239 2241 N
+ HH V IH i n/a 17 2157 2239 2241 N
+ HH V IY b n/a 17 2159 2230 2249 N
+ HH V L b n/a 17 2146 2198 2245 N
+ HH V M b n/a 17 2153 2220 2265 N
+ HH V N b n/a 17 2153 2220 2265 N
+ HH V OW b n/a 17 2146 2201 2256 N
+ HH V OW i n/a 17 2146 2201 2256 N
+ HH V OY b n/a 17 2146 2201 2256 N
+ HH V P b n/a 17 2153 2220 2265 N
+ HH V R b n/a 17 2146 2198 2254 N
+ HH V T b n/a 17 2153 2220 2265 N
+ HH V UH b n/a 17 2156 2205 2247 N
+ HH V UH i n/a 17 2156 2205 2247 N
+ HH V UW b n/a 17 2156 2205 2247 N
+ HH V V b n/a 17 2153 2220 2265 N
+ HH V W b n/a 17 2148 2205 2245 N
+ HH V Y b n/a 17 2159 2230 2250 N
+ HH W AA b n/a 17 2181 2199 2254 N
+ HH W AE b n/a 17 2174 2215 2261 N
+ HH W AH b n/a 17 2174 2197 2253 N
+ HH W AO b n/a 17 2181 2201 2256 N
+ HH W AW b n/a 17 2174 2214 2268 N
+ HH W AY b n/a 17 2181 2200 2255 N
+ HH W B b n/a 17 2174 2215 2265 N
+ HH W CH b n/a 17 2174 2215 2265 N
+ HH W EH b n/a 17 2174 2215 2264 N
+ HH W ER b n/a 17 2178 2211 2257 N
+ HH W EY b n/a 17 2174 2215 2265 N
+ HH W F b n/a 17 2174 2215 2265 N
+ HH W G b n/a 17 2174 2215 2265 N
+ HH W IH b n/a 17 2177 2233 2242 N
+ HH W IY b n/a 17 2176 2226 2252 N
+ HH W L b n/a 17 2178 2197 2244 N
+ HH W M b n/a 17 2174 2215 2265 N
+ HH W N b n/a 17 2174 2215 2265 N
+ HH W OW b n/a 17 2181 2201 2256 N
+ HH W OY b n/a 17 2181 2201 2256 N
+ HH W P b n/a 17 2174 2215 2265 N
+ HH W R b n/a 17 2178 2197 2254 N
+ HH W T b n/a 17 2174 2215 2265 N
+ HH W UH b n/a 17 2178 2205 2247 N
+ HH W UW b n/a 17 2178 2205 2247 N
+ HH W V b n/a 17 2174 2215 2265 N
+ HH W W b n/a 17 2178 2207 2244 N
+ HH W Y b n/a 17 2176 2227 2250 N
+ HH Y AA b n/a 17 2182 2199 2254 N
+ HH Y AE b n/a 17 2166 2223 2260 N
+ HH Y AH b n/a 17 2167 2225 2261 N
+ HH Y AO b n/a 17 2182 2202 2256 N
+ HH Y AW b n/a 17 2167 2225 2268 N
+ HH Y AY b n/a 17 2182 2200 2255 N
+ HH Y B b n/a 17 2166 2224 2265 N
+ HH Y CH b n/a 17 2166 2224 2265 N
+ HH Y EH b n/a 17 2166 2224 2264 N
+ HH Y ER b n/a 17 2182 2212 2257 N
+ HH Y EY b n/a 17 2166 2224 2265 N
+ HH Y F b n/a 17 2166 2224 2265 N
+ HH Y G b n/a 17 2166 2224 2265 N
+ HH Y IH b n/a 17 2169 2234 2243 N
+ HH Y IY b n/a 17 2168 2229 2251 N
+ HH Y L b n/a 17 2178 2197 2244 N
+ HH Y M b n/a 17 2166 2224 2265 N
+ HH Y N b n/a 17 2166 2224 2265 N
+ HH Y OW b n/a 17 2182 2202 2256 N
+ HH Y OY b n/a 17 2182 2202 2256 N
+ HH Y P b n/a 17 2166 2224 2265 N
+ HH Y R b n/a 17 2182 2197 2254 N
+ HH Y T b n/a 17 2166 2224 2265 N
+ HH Y UH b n/a 17 2182 2205 2247 N
+ HH Y UW b n/a 17 2182 2205 2246 N
+ HH Y V b n/a 17 2166 2224 2265 N
+ HH Y W b n/a 17 2178 2208 2244 N
+ HH Y Y b n/a 17 2168 2229 2250 N
+ HH Z AA b n/a 17 2146 2199 2254 N
+ HH Z AA i n/a 17 2146 2199 2254 N
+ HH Z AE b n/a 17 2149 2220 2266 N
+ HH Z AH b n/a 17 2149 2198 2253 N
+ HH Z AH i n/a 17 2149 2198 2253 N
+ HH Z AO b n/a 17 2146 2202 2256 N
+ HH Z AO i n/a 17 2146 2202 2256 N
+ HH Z AW b n/a 17 2149 2213 2268 N
+ HH Z AW i n/a 17 2149 2213 2268 N
+ HH Z AY b n/a 17 2146 2200 2255 N
+ HH Z AY i n/a 17 2146 2198 2253 N
+ HH Z B b n/a 17 2149 2220 2265 N
+ HH Z CH b n/a 17 2149 2220 2265 N
+ HH Z EH b n/a 17 2149 2220 2264 N
+ HH Z EH i n/a 17 2149 2220 2264 N
+ HH Z ER b n/a 17 2150 2209 2258 N
+ HH Z EY b n/a 17 2149 2220 2265 N
+ HH Z EY i n/a 17 2149 2220 2265 N
+ HH Z F b n/a 17 2149 2220 2265 N
+ HH Z G b n/a 17 2149 2220 2265 N
+ HH Z IH b n/a 17 2159 2239 2241 N
+ HH Z IH i n/a 17 2159 2239 2241 N
+ HH Z IY b n/a 17 2159 2230 2249 N
+ HH Z L b n/a 17 2146 2198 2245 N
+ HH Z M b n/a 17 2149 2220 2265 N
+ HH Z N b n/a 17 2149 2220 2265 N
+ HH Z OW b n/a 17 2146 2202 2256 N
+ HH Z OW i n/a 17 2146 2202 2256 N
+ HH Z OY b n/a 17 2146 2202 2256 N
+ HH Z P b n/a 17 2149 2220 2265 N
+ HH Z R b n/a 17 2146 2198 2254 N
+ HH Z T b n/a 17 2149 2220 2265 N
+ HH Z UH b n/a 17 2156 2205 2247 N
+ HH Z UW b n/a 17 2156 2203 2246 N
+ HH Z V b n/a 17 2149 2220 2265 N
+ HH Z W b n/a 17 2148 2205 2245 N
+ HH Z Y b n/a 17 2159 2230 2250 N
+ HH ZH AA b n/a 17 2146 2199 2254 N
+ HH ZH AE b n/a 17 2149 2220 2266 N
+ HH ZH AH b n/a 17 2149 2198 2253 N
+ HH ZH AO b n/a 17 2146 2201 2256 N
+ HH ZH AW b n/a 17 2149 2213 2268 N
+ HH ZH AY b n/a 17 2146 2200 2255 N
+ HH ZH B b n/a 17 2149 2220 2265 N
+ HH ZH CH b n/a 17 2149 2220 2265 N
+ HH ZH EH b n/a 17 2149 2220 2264 N
+ HH ZH ER b n/a 17 2150 2209 2258 N
+ HH ZH EY b n/a 17 2149 2220 2265 N
+ HH ZH F b n/a 17 2149 2220 2265 N
+ HH ZH G b n/a 17 2149 2220 2265 N
+ HH ZH IH b n/a 17 2158 2239 2241 N
+ HH ZH IY b n/a 17 2159 2230 2249 N
+ HH ZH L b n/a 17 2146 2198 2245 N
+ HH ZH M b n/a 17 2149 2220 2265 N
+ HH ZH N b n/a 17 2149 2220 2265 N
+ HH ZH OW b n/a 17 2146 2201 2256 N
+ HH ZH OY b n/a 17 2146 2201 2256 N
+ HH ZH P b n/a 17 2149 2220 2265 N
+ HH ZH R b n/a 17 2146 2198 2254 N
+ HH ZH T b n/a 17 2149 2220 2265 N
+ HH ZH UH b n/a 17 2156 2205 2247 N
+ HH ZH UW b n/a 17 2156 2205 2246 N
+ HH ZH V b n/a 17 2149 2220 2265 N
+ HH ZH W b n/a 17 2148 2205 2245 N
+ HH ZH Y b n/a 17 2159 2230 2250 N
+ IH AA B b n/a 18 2340 2431 2501 N
+ IH AA CH b n/a 18 2340 2431 2505 N
+ IH AA D b n/a 18 2340 2431 2500 N
+ IH AA F b n/a 18 2340 2431 2505 N
+ IH AA G b n/a 18 2335 2432 2526 N
+ IH AA JH b n/a 18 2340 2431 2503 N
+ IH AA JH i n/a 18 2340 2431 2503 N
+ IH AA K b n/a 18 2335 2432 2529 N
+ IH AA K i n/a 18 2335 2432 2529 N
+ IH AA L b n/a 18 2340 2426 2563 N
+ IH AA M b n/a 18 2340 2447 2558 N
+ IH AA N b n/a 18 2340 2447 2550 N
+ IH AA N i n/a 18 2335 2449 2550 N
+ IH AA NG b n/a 18 2335 2449 2567 N
+ IH AA NG i n/a 18 2335 2449 2567 N
+ IH AA P b n/a 18 2340 2431 2508 N
+ IH AA R b n/a 18 2340 2428 2574 N
+ IH AA R i n/a 18 2340 2428 2572 N
+ IH AA S b n/a 18 2340 2433 2530 N
+ IH AA S i n/a 18 2340 2433 2530 N
+ IH AA SH b n/a 18 2340 2433 2536 N
+ IH AA SH i n/a 18 2340 2433 2536 N
+ IH AA T b n/a 18 2340 2431 2498 N
+ IH AA T i n/a 18 2340 2431 2498 N
+ IH AA TH b n/a 18 2340 2431 2505 N
+ IH AA V b n/a 18 2340 2430 2501 N
+ IH AA W b n/a 18 2340 2426 2563 N
+ IH AA Y b n/a 18 2340 2428 2495 N
+ IH AA Z b n/a 18 2340 2430 2541 N
+ IH AA Z i n/a 18 2340 2430 2541 N
+ IH AA ZH b n/a 18 2340 2430 2541 N
+ IH AE B b n/a 18 2355 2398 2501 N
+ IH AE CH b n/a 18 2355 2387 2514 N
+ IH AE D b n/a 18 2355 2382 2521 N
+ IH AE F b n/a 18 2354 2398 2506 N
+ IH AE G b n/a 18 2355 2465 2526 N
+ IH AE JH b n/a 18 2355 2387 2522 N
+ IH AE K b n/a 18 2355 2465 2527 N
+ IH AE L b n/a 18 2354 2425 2562 N
+ IH AE M b n/a 18 2354 2477 2555 N
+ IH AE N b n/a 18 2354 2473 2547 N
+ IH AE NG b n/a 18 2354 2451 2571 N
+ IH AE P b n/a 18 2355 2397 2508 N
+ IH AE R b n/a 18 2354 2488 2574 N
+ IH AE S b n/a 18 2355 2411 2533 N
+ IH AE SH b n/a 18 2354 2387 2535 N
+ IH AE T b n/a 18 2355 2389 2514 N
+ IH AE TH b n/a 18 2354 2389 2506 N
+ IH AE V b n/a 18 2354 2401 2523 N
+ IH AE W b n/a 18 2354 2425 2562 N
+ IH AE Y b n/a 18 2354 2473 2495 N
+ IH AE Z b n/a 18 2354 2380 2540 N
+ IH AE ZH b n/a 18 2354 2387 2540 N
+ IH AH B b n/a 18 2355 2398 2501 N
+ IH AH CH b n/a 18 2355 2387 2514 N
+ IH AH D b n/a 18 2355 2382 2521 N
+ IH AH F b n/a 18 2354 2398 2506 N
+ IH AH G b n/a 18 2355 2465 2526 N
+ IH AH JH b n/a 18 2355 2387 2522 N
+ IH AH K b n/a 18 2355 2465 2527 N
+ IH AH L b n/a 18 2354 2425 2561 N
+ IH AH M b n/a 18 2354 2476 2555 N
+ IH AH N b n/a 18 2354 2472 2546 N
+ IH AH N i n/a 18 2350 2472 2546 N
+ IH AH NG b n/a 18 2354 2451 2564 N
+ IH AH NG i n/a 18 2348 2451 2564 N
+ IH AH P b n/a 18 2355 2397 2508 N
+ IH AH P i n/a 18 2350 2396 2508 N
+ IH AH R b n/a 18 2354 2488 2574 N
+ IH AH S b n/a 18 2355 2411 2533 N
+ IH AH SH b n/a 18 2354 2387 2535 N
+ IH AH T b n/a 18 2355 2388 2514 N
+ IH AH TH b n/a 18 2354 2387 2506 N
+ IH AH V b n/a 18 2354 2401 2524 N
+ IH AH W b n/a 18 2354 2425 2561 N
+ IH AH Y b n/a 18 2354 2472 2495 N
+ IH AH Z b n/a 18 2354 2379 2540 N
+ IH AH ZH b n/a 18 2354 2387 2540 N
+ IH AO B b n/a 18 2338 2431 2501 N
+ IH AO CH b n/a 18 2338 2431 2505 N
+ IH AO D b n/a 18 2338 2431 2500 N
+ IH AO F b n/a 18 2340 2431 2505 N
+ IH AO G b n/a 18 2335 2431 2526 N
+ IH AO JH b n/a 18 2338 2431 2503 N
+ IH AO K b n/a 18 2335 2432 2529 N
+ IH AO K i n/a 18 2335 2432 2529 N
+ IH AO L b n/a 18 2340 2426 2563 N
+ IH AO M b n/a 18 2340 2447 2558 N
+ IH AO N b n/a 18 2340 2447 2550 N
+ IH AO N i n/a 18 2335 2449 2550 N
+ IH AO NG b n/a 18 2335 2449 2567 N
+ IH AO NG i n/a 18 2335 2449 2567 N
+ IH AO P b n/a 18 2338 2431 2508 N
+ IH AO R b n/a 18 2340 2428 2574 N
+ IH AO S b n/a 18 2340 2433 2530 N
+ IH AO SH b n/a 18 2340 2433 2536 N
+ IH AO T b n/a 18 2338 2431 2498 N
+ IH AO T i n/a 18 2338 2431 2498 N
+ IH AO TH b n/a 18 2340 2431 2505 N
+ IH AO V b n/a 18 2340 2430 2501 N
+ IH AO W b n/a 18 2340 2426 2563 N
+ IH AO Y b n/a 18 2340 2428 2495 N
+ IH AO Z b n/a 18 2340 2430 2541 N
+ IH AO ZH b n/a 18 2340 2430 2541 N
+ IH AW B b n/a 18 2340 2431 2511 N
+ IH AW CH b n/a 18 2340 2431 2511 N
+ IH AW D b n/a 18 2340 2431 2511 N
+ IH AW F b n/a 18 2340 2431 2512 N
+ IH AW G b n/a 18 2335 2432 2526 N
+ IH AW JH b n/a 18 2340 2431 2511 N
+ IH AW JH i n/a 18 2340 2431 2511 N
+ IH AW K b n/a 18 2335 2432 2529 N
+ IH AW L b n/a 18 2340 2426 2563 N
+ IH AW M b n/a 18 2340 2447 2558 N
+ IH AW N b n/a 18 2340 2447 2550 N
+ IH AW N i n/a 18 2335 2449 2549 N
+ IH AW NG b n/a 18 2335 2449 2567 N
+ IH AW NG i n/a 18 2335 2449 2567 N
+ IH AW P b n/a 18 2340 2431 2511 N
+ IH AW R b n/a 18 2340 2428 2574 N
+ IH AW S b n/a 18 2340 2433 2530 N
+ IH AW S i n/a 18 2340 2433 2530 N
+ IH AW SH b n/a 18 2340 2433 2536 N
+ IH AW T b n/a 18 2340 2431 2511 N
+ IH AW T i n/a 18 2340 2431 2511 N
+ IH AW TH b n/a 18 2340 2431 2512 N
+ IH AW TH i n/a 18 2340 2431 2512 N
+ IH AW V b n/a 18 2340 2430 2513 N
+ IH AW W b n/a 18 2340 2426 2563 N
+ IH AW Y b n/a 18 2340 2428 2511 N
+ IH AW Z b n/a 18 2340 2430 2541 N
+ IH AW Z i n/a 18 2340 2430 2541 N
+ IH AW ZH b n/a 18 2340 2430 2541 N
+ IH AY B b n/a 18 2360 2398 2501 N
+ IH AY CH b n/a 18 2360 2387 2515 N
+ IH AY CH i n/a 18 2360 2387 2515 N
+ IH AY D b n/a 18 2360 2382 2521 N
+ IH AY D i n/a 18 2360 2382 2521 N
+ IH AY F b n/a 18 2360 2398 2506 N
+ IH AY G b n/a 18 2360 2467 2526 N
+ IH AY G i n/a 18 2360 2463 2526 N
+ IH AY JH b n/a 18 2360 2387 2522 N
+ IH AY JH i n/a 18 2360 2387 2522 N
+ IH AY K b n/a 18 2360 2468 2527 N
+ IH AY L b n/a 18 2360 2425 2562 N
+ IH AY L i n/a 18 2360 2422 2559 N
+ IH AY M b n/a 18 2362 2476 2555 N
+ IH AY M i n/a 18 2364 2476 2556 N
+ IH AY N b n/a 18 2362 2472 2546 N
+ IH AY N i n/a 18 2365 2472 2546 N
+ IH AY NG b n/a 18 2362 2456 2564 N
+ IH AY NG i n/a 18 2364 2456 2564 N
+ IH AY P b n/a 18 2360 2397 2508 N
+ IH AY R b n/a 18 2360 2492 2574 N
+ IH AY R i n/a 18 2360 2492 2572 N
+ IH AY S b n/a 18 2360 2411 2533 N
+ IH AY S i n/a 18 2360 2411 2533 N
+ IH AY SH b n/a 18 2360 2387 2535 N
+ IH AY T b n/a 18 2360 2389 2515 N
+ IH AY T i n/a 18 2360 2389 2515 N
+ IH AY TH b n/a 18 2360 2389 2506 N
+ IH AY TH i n/a 18 2360 2389 2504 N
+ IH AY V b n/a 18 2360 2401 2523 N
+ IH AY W b n/a 18 2360 2425 2562 N
+ IH AY Y b n/a 18 2360 2472 2495 N
+ IH AY Z b n/a 18 2360 2379 2540 N
+ IH AY ZH b n/a 18 2360 2387 2540 N
+ IH B AA e n/a 18 2273 2492 2575 N
+ IH B AA i n/a 18 2273 2491 2574 N
+ IH B AE e n/a 18 2273 2487 2497 N
+ IH B AH e n/a 18 2273 2487 2497 N
+ IH B AO e n/a 18 2273 2492 2575 N
+ IH B AO i n/a 18 2273 2491 2574 N
+ IH B AW e n/a 18 2273 2492 2497 N
+ IH B AY e n/a 18 2273 2487 2575 N
+ IH B B b n/a 18 2274 2406 2501 N
+ IH B B e n/a 18 2274 2404 2502 N
+ IH B B i n/a 18 2274 2406 2501 N
+ IH B CH b n/a 18 2274 2391 2515 N
+ IH B CH e n/a 18 2274 2405 2517 N
+ IH B CH i n/a 18 2274 2390 2517 N
+ IH B D b n/a 18 2281 2386 2521 N
+ IH B D e n/a 18 2281 2405 2521 N
+ IH B D i n/a 18 2281 2386 2521 N
+ IH B DH e n/a 18 2280 2404 2502 N
+ IH B DH i n/a 18 2281 2390 2502 N
+ IH B EH e n/a 18 2273 2487 2497 N
+ IH B ER e n/a 18 2273 2492 2575 N
+ IH B ER i n/a 18 2273 2491 2572 N
+ IH B EY e n/a 18 2273 2487 2497 N
+ IH B F b n/a 18 2276 2403 2499 N
+ IH B F e n/a 18 2276 2403 2499 N
+ IH B F i n/a 18 2276 2403 2499 N
+ IH B G b n/a 18 2271 2467 2526 N
+ IH B G e n/a 18 2271 2467 2526 N
+ IH B G i n/a 18 2270 2467 2526 N
+ IH B HH e n/a 18 2275 2404 2495 N
+ IH B HH i n/a 18 2275 2392 2495 N
+ IH B IH e n/a 18 2273 2487 2497 N
+ IH B IY e n/a 18 2273 2487 2496 N
+ IH B JH b n/a 18 2274 2391 2522 N
+ IH B JH e n/a 18 2274 2405 2522 N
+ IH B JH i n/a 18 2274 2390 2522 N
+ IH B K b n/a 18 2271 2469 2525 N
+ IH B K e n/a 18 2271 2469 2525 N
+ IH B K i n/a 18 2271 2470 2525 N
+ IH B L b n/a 18 2274 2424 2560 N
+ IH B L e n/a 18 2274 2424 2560 N
+ IH B L i n/a 18 2274 2424 2560 N
+ IH B M b n/a 18 2274 2474 2555 N
+ IH B M e n/a 18 2274 2475 2556 N
+ IH B M i n/a 18 2274 2475 2556 N
+ IH B N b n/a 18 2280 2485 2543 N
+ IH B N e n/a 18 2280 2486 2543 N
+ IH B N i n/a 18 2281 2481 2545 N
+ IH B NG b n/a 18 2272 2459 2569 N
+ IH B NG e n/a 18 2272 2459 2569 N
+ IH B NG i n/a 18 2272 2459 2569 N
+ IH B OW e n/a 18 2273 2492 2575 N
+ IH B OY e n/a 18 2273 2487 2575 N
+ IH B P b n/a 18 2274 2406 2508 N
+ IH B P e n/a 18 2274 2404 2508 N
+ IH B P i n/a 18 2274 2406 2508 N
+ IH B R b n/a 18 2275 2489 2574 N
+ IH B R e n/a 18 2275 2492 2575 N
+ IH B R i n/a 18 2275 2489 2572 N
+ IH B S b n/a 18 2280 2411 2534 N
+ IH B S e n/a 18 2280 2411 2534 N
+ IH B S i n/a 18 2280 2411 2534 N
+ IH B SH b n/a 18 2274 2391 2535 N
+ IH B SH e n/a 18 2274 2403 2535 N
+ IH B SH i n/a 18 2274 2390 2535 N
+ IH B SIL e n/a 18 2274 2406 2496 N
+ IH B T b n/a 18 2280 2391 2515 N
+ IH B T e n/a 18 2280 2405 2517 N
+ IH B T i n/a 18 2280 2390 2517 N
+ IH B TH b n/a 18 2280 2391 2506 N
+ IH B TH e n/a 18 2280 2403 2505 N
+ IH B TH i n/a 18 2280 2390 2504 N
+ IH B UH e n/a 18 2273 2492 2575 N
+ IH B UW e n/a 18 2273 2492 2575 N
+ IH B V b n/a 18 2275 2404 2524 N
+ IH B V e n/a 18 2275 2404 2524 N
+ IH B V i n/a 18 2276 2404 2524 N
+ IH B W b n/a 18 2275 2425 2560 N
+ IH B W e n/a 18 2275 2425 2560 N
+ IH B W i n/a 18 2275 2425 2560 N
+ IH B Y b n/a 18 2274 2487 2495 N
+ IH B Y e n/a 18 2274 2487 2495 N
+ IH B Y i n/a 18 2274 2481 2495 N
+ IH B Z b n/a 18 2280 2379 2540 N
+ IH B Z e n/a 18 2280 2379 2538 N
+ IH B Z i n/a 18 2281 2421 2538 N
+ IH B ZH b n/a 18 2274 2391 2540 N
+ IH B ZH e n/a 18 2274 2404 2539 N
+ IH B ZH i n/a 18 2274 2390 2539 N
+ IH CH B b n/a 18 2307 2398 2501 N
+ IH CH B i n/a 18 2296 2397 2501 N
+ IH CH CH b n/a 18 2307 2391 2515 N
+ IH CH CH i n/a 18 2296 2391 2517 N
+ IH CH D b n/a 18 2307 2382 2521 N
+ IH CH D i n/a 18 2296 2382 2521 N
+ IH CH F b n/a 18 2307 2398 2506 N
+ IH CH F i n/a 18 2296 2397 2504 N
+ IH CH G b n/a 18 2286 2465 2526 N
+ IH CH G i n/a 18 2286 2463 2526 N
+ IH CH HH i n/a 18 2296 2392 2494 N
+ IH CH JH b n/a 18 2307 2391 2522 N
+ IH CH K b n/a 18 2286 2465 2527 N
+ IH CH K i n/a 18 2286 2463 2527 N
+ IH CH L b n/a 18 2322 2425 2561 N
+ IH CH L i n/a 18 2315 2422 2559 N
+ IH CH M b n/a 18 2307 2474 2555 N
+ IH CH M i n/a 18 2306 2474 2556 N
+ IH CH N b n/a 18 2307 2485 2543 N
+ IH CH N i n/a 18 2306 2482 2545 N
+ IH CH NG b n/a 18 2288 2458 2569 N
+ IH CH NG i n/a 18 2287 2458 2569 N
+ IH CH P b n/a 18 2307 2397 2508 N
+ IH CH P i n/a 18 2296 2397 2508 N
+ IH CH R b n/a 18 2323 2488 2574 N
+ IH CH R i n/a 18 2323 2488 2573 N
+ IH CH S b n/a 18 2307 2416 2533 N
+ IH CH S i n/a 18 2296 2415 2533 N
+ IH CH SH b n/a 18 2307 2391 2535 N
+ IH CH SH i n/a 18 2296 2391 2535 N
+ IH CH T b n/a 18 2307 2391 2515 N
+ IH CH T i n/a 18 2296 2391 2516 N
+ IH CH TH b n/a 18 2307 2391 2506 N
+ IH CH TH i n/a 18 2296 2391 2504 N
+ IH CH V b n/a 18 2307 2402 2524 N
+ IH CH V i n/a 18 2296 2402 2524 N
+ IH CH W b n/a 18 2322 2425 2561 N
+ IH CH Y b n/a 18 2322 2487 2495 N
+ IH CH Y i n/a 18 2316 2482 2495 N
+ IH CH Z b n/a 18 2307 2379 2540 N
+ IH CH Z i n/a 18 2296 2418 2537 N
+ IH CH ZH b n/a 18 2307 2391 2540 N
+ IH D AA e n/a 18 2316 2492 2575 N
+ IH D AE e n/a 18 2316 2487 2497 N
+ IH D AH e n/a 18 2316 2487 2497 N
+ IH D AO e n/a 18 2316 2492 2575 N
+ IH D AW e n/a 18 2316 2492 2497 N
+ IH D AY e n/a 18 2316 2487 2575 N
+ IH D B b n/a 18 2313 2398 2501 N
+ IH D B e n/a 18 2300 2404 2502 N
+ IH D B i n/a 18 2300 2395 2501 N
+ IH D CH b n/a 18 2313 2375 2515 N
+ IH D CH e n/a 18 2293 2405 2517 N
+ IH D CH i n/a 18 2293 2375 2517 N
+ IH D D b n/a 18 2313 2376 2521 N
+ IH D D e n/a 18 2293 2405 2522 N
+ IH D D i n/a 18 2293 2376 2521 N
+ IH D DH e n/a 18 2293 2404 2502 N
+ IH D DH i n/a 18 2293 2379 2502 N
+ IH D EH e n/a 18 2316 2487 2497 N
+ IH D ER e n/a 18 2323 2492 2575 N
+ IH D EY e n/a 18 2316 2487 2497 N
+ IH D F b n/a 18 2313 2398 2506 N
+ IH D F e n/a 18 2300 2403 2505 N
+ IH D F i n/a 18 2300 2396 2504 N
+ IH D G b n/a 18 2272 2467 2526 N
+ IH D G e n/a 18 2269 2467 2525 N
+ IH D G i n/a 18 2269 2467 2526 N
+ IH D HH e n/a 18 2293 2399 2495 N
+ IH D HH i n/a 18 2293 2375 2495 N
+ IH D IH e n/a 18 2316 2487 2497 N
+ IH D IY e n/a 18 2316 2487 2496 N
+ IH D JH b n/a 18 2313 2375 2522 N
+ IH D JH e n/a 18 2293 2405 2522 N
+ IH D JH i n/a 18 2293 2375 2522 N
+ IH D K b n/a 18 2272 2465 2527 N
+ IH D K e n/a 18 2269 2465 2527 N
+ IH D K i n/a 18 2269 2463 2527 N
+ IH D L b n/a 18 2322 2425 2561 N
+ IH D L e n/a 18 2315 2422 2561 N
+ IH D L i n/a 18 2315 2422 2559 N
+ IH D M b n/a 18 2311 2474 2555 N
+ IH D M e n/a 18 2313 2475 2556 N
+ IH D M i n/a 18 2313 2475 2556 N
+ IH D N b n/a 18 2310 2482 2543 N
+ IH D N e n/a 18 2312 2486 2543 N
+ IH D N i n/a 18 2312 2483 2544 N
+ IH D NG b n/a 18 2272 2459 2569 N
+ IH D NG e n/a 18 2272 2459 2569 N
+ IH D NG i n/a 18 2272 2459 2569 N
+ IH D OW e n/a 18 2316 2492 2575 N
+ IH D OY e n/a 18 2316 2487 2575 N
+ IH D OY i n/a 18 2316 2483 2573 N
+ IH D P b n/a 18 2313 2397 2507 N
+ IH D P e n/a 18 2300 2404 2507 N
+ IH D P i n/a 18 2300 2395 2507 N
+ IH D R b n/a 18 2323 2489 2574 N
+ IH D R e n/a 18 2323 2492 2575 N
+ IH D R i n/a 18 2323 2489 2573 N
+ IH D S b n/a 18 2312 2410 2534 N
+ IH D S e n/a 18 2301 2410 2534 N
+ IH D S i n/a 18 2301 2410 2534 N
+ IH D SH b n/a 18 2312 2375 2535 N
+ IH D SH e n/a 18 2293 2403 2535 N
+ IH D SH i n/a 18 2293 2375 2535 N
+ IH D SIL e n/a 18 2293 2406 2496 N
+ IH D T b n/a 18 2313 2391 2515 N
+ IH D T e n/a 18 2293 2405 2517 N
+ IH D T i n/a 18 2293 2390 2517 N
+ IH D TH b n/a 18 2313 2376 2506 N
+ IH D TH e n/a 18 2293 2403 2505 N
+ IH D TH i n/a 18 2293 2376 2504 N
+ IH D UH e n/a 18 2316 2492 2575 N
+ IH D UW e n/a 18 2316 2492 2575 N
+ IH D V b n/a 18 2313 2402 2524 N
+ IH D V e n/a 18 2300 2404 2524 N
+ IH D V i n/a 18 2300 2402 2524 N
+ IH D W b n/a 18 2322 2425 2561 N
+ IH D W e n/a 18 2316 2422 2561 N
+ IH D W i n/a 18 2316 2422 2559 N
+ IH D Y b n/a 18 2322 2482 2495 N
+ IH D Y e n/a 18 2316 2487 2495 N
+ IH D Y i n/a 18 2316 2483 2495 N
+ IH D Z b n/a 18 2312 2379 2540 N
+ IH D Z e n/a 18 2301 2379 2537 N
+ IH D Z i n/a 18 2301 2417 2537 N
+ IH D ZH b n/a 18 2312 2379 2540 N
+ IH D ZH e n/a 18 2293 2404 2539 N
+ IH D ZH i n/a 18 2293 2379 2539 N
+ IH DH B b n/a 18 2291 2398 2501 N
+ IH DH CH b n/a 18 2291 2384 2514 N
+ IH DH D b n/a 18 2291 2382 2521 N
+ IH DH F b n/a 18 2291 2399 2506 N
+ IH DH G b n/a 18 2282 2465 2526 N
+ IH DH JH b n/a 18 2291 2384 2522 N
+ IH DH K b n/a 18 2282 2465 2527 N
+ IH DH L b n/a 18 2322 2425 2561 N
+ IH DH M b n/a 18 2311 2476 2554 N
+ IH DH N b n/a 18 2310 2485 2552 N
+ IH DH N i n/a 18 2313 2481 2552 N
+ IH DH NG b n/a 18 2282 2461 2566 N
+ IH DH NG i n/a 18 2282 2461 2566 N
+ IH DH P b n/a 18 2291 2397 2508 N
+ IH DH R b n/a 18 2323 2489 2574 N
+ IH DH S b n/a 18 2291 2415 2533 N
+ IH DH S i n/a 18 2291 2415 2533 N
+ IH DH SH b n/a 18 2291 2384 2535 N
+ IH DH T b n/a 18 2291 2382 2514 N
+ IH DH TH b n/a 18 2291 2382 2506 N
+ IH DH V b n/a 18 2291 2402 2524 N
+ IH DH W b n/a 18 2322 2425 2561 N
+ IH DH Y b n/a 18 2322 2487 2495 N
+ IH DH Z b n/a 18 2291 2379 2540 N
+ IH DH ZH b n/a 18 2291 2384 2540 N
+ IH EH B b n/a 18 2355 2398 2501 N
+ IH EH CH b n/a 18 2355 2387 2514 N
+ IH EH D b n/a 18 2355 2382 2521 N
+ IH EH D i n/a 18 2349 2382 2521 N
+ IH EH F b n/a 18 2354 2398 2506 N
+ IH EH G b n/a 18 2355 2465 2526 N
+ IH EH JH b n/a 18 2355 2387 2522 N
+ IH EH K b n/a 18 2355 2465 2527 N
+ IH EH L b n/a 18 2354 2425 2561 N
+ IH EH L i n/a 18 2350 2422 2559 N
+ IH EH M b n/a 18 2354 2476 2555 N
+ IH EH N b n/a 18 2354 2472 2546 N
+ IH EH N i n/a 18 2350 2472 2546 N
+ IH EH NG b n/a 18 2354 2451 2564 N
+ IH EH P b n/a 18 2355 2397 2508 N
+ IH EH R b n/a 18 2354 2488 2574 N
+ IH EH S b n/a 18 2355 2411 2533 N
+ IH EH SH b n/a 18 2354 2387 2535 N
+ IH EH T b n/a 18 2355 2389 2514 N
+ IH EH TH b n/a 18 2354 2389 2506 N
+ IH EH V b n/a 18 2354 2401 2524 N
+ IH EH W b n/a 18 2354 2425 2561 N
+ IH EH Y b n/a 18 2354 2472 2495 N
+ IH EH Z b n/a 18 2354 2379 2540 N
+ IH EH ZH b n/a 18 2354 2387 2540 N
+ IH ER B b n/a 18 2373 2443 2501 N
+ IH ER B i n/a 18 2371 2443 2501 N
+ IH ER CH b n/a 18 2373 2440 2511 N
+ IH ER CH i n/a 18 2368 2439 2510 N
+ IH ER D b n/a 18 2373 2440 2510 N
+ IH ER D i n/a 18 2368 2440 2510 N
+ IH ER DH i n/a 18 2369 2441 2513 N
+ IH ER ER i n/a 18 2368 2440 2572 N
+ IH ER F b n/a 18 2373 2443 2505 N
+ IH ER F i n/a 18 2371 2443 2505 N
+ IH ER G b n/a 18 2374 2445 2526 N
+ IH ER G i n/a 18 2372 2445 2526 N
+ IH ER HH i n/a 18 2368 2439 2510 N
+ IH ER JH b n/a 18 2373 2440 2510 N
+ IH ER JH i n/a 18 2368 2440 2510 N
+ IH ER K b n/a 18 2374 2445 2529 N
+ IH ER K i n/a 18 2372 2445 2529 N
+ IH ER L b n/a 18 2373 2427 2563 N
+ IH ER L i n/a 18 2370 2427 2563 N
+ IH ER M b n/a 18 2373 2453 2558 N
+ IH ER M i n/a 18 2371 2453 2558 N
+ IH ER N b n/a 18 2373 2453 2551 N
+ IH ER N i n/a 18 2369 2453 2551 N
+ IH ER NG b n/a 18 2373 2455 2568 N
+ IH ER NG i n/a 18 2367 2457 2568 N
+ IH ER P b n/a 18 2374 2444 2507 N
+ IH ER P i n/a 18 2371 2444 2507 N
+ IH ER R b n/a 18 2373 2428 2574 N
+ IH ER R i n/a 18 2370 2428 2572 N
+ IH ER S b n/a 18 2373 2441 2532 N
+ IH ER S i n/a 18 2369 2441 2532 N
+ IH ER SH b n/a 18 2373 2442 2536 N
+ IH ER SH i n/a 18 2368 2439 2536 N
+ IH ER T b n/a 18 2374 2440 2511 N
+ IH ER T i n/a 18 2368 2439 2510 N
+ IH ER TH b n/a 18 2373 2441 2512 N
+ IH ER TH i n/a 18 2369 2441 2512 N
+ IH ER V b n/a 18 2373 2443 2501 N
+ IH ER V i n/a 18 2371 2443 2501 N
+ IH ER W b n/a 18 2373 2427 2563 N
+ IH ER W i n/a 18 2371 2427 2563 N
+ IH ER Y b n/a 18 2373 2428 2510 N
+ IH ER Z b n/a 18 2373 2442 2541 N
+ IH ER Z i n/a 18 2369 2441 2541 N
+ IH ER ZH b n/a 18 2373 2442 2541 N
+ IH ER ZH i n/a 18 2369 2441 2541 N
+ IH EY B b n/a 18 2360 2398 2501 N
+ IH EY CH b n/a 18 2360 2387 2515 N
+ IH EY D b n/a 18 2358 2382 2521 N
+ IH EY F b n/a 18 2360 2398 2506 N
+ IH EY G b n/a 18 2360 2467 2526 N
+ IH EY G i n/a 18 2360 2463 2526 N
+ IH EY JH b n/a 18 2360 2387 2522 N
+ IH EY JH i n/a 18 2360 2387 2522 N
+ IH EY K b n/a 18 2360 2468 2527 N
+ IH EY K i n/a 18 2360 2463 2527 N
+ IH EY L b n/a 18 2360 2425 2562 N
+ IH EY L i n/a 18 2360 2422 2559 N
+ IH EY M b n/a 18 2363 2477 2555 N
+ IH EY N b n/a 18 2362 2473 2547 N
+ IH EY N i n/a 18 2365 2473 2547 N
+ IH EY NG b n/a 18 2362 2451 2571 N
+ IH EY NG i n/a 18 2365 2451 2571 N
+ IH EY P b n/a 18 2360 2397 2508 N
+ IH EY R b n/a 18 2360 2492 2574 N
+ IH EY R i n/a 18 2360 2492 2572 N
+ IH EY S b n/a 18 2360 2411 2533 N
+ IH EY S i n/a 18 2360 2411 2533 N
+ IH EY SH b n/a 18 2360 2387 2535 N
+ IH EY SH i n/a 18 2360 2387 2535 N
+ IH EY T b n/a 18 2358 2389 2515 N
+ IH EY TH b n/a 18 2360 2389 2506 N
+ IH EY V b n/a 18 2360 2401 2523 N
+ IH EY W b n/a 18 2360 2425 2562 N
+ IH EY Y b n/a 18 2360 2473 2495 N
+ IH EY Z b n/a 18 2360 2380 2540 N
+ IH EY Z i n/a 18 2360 2420 2537 N
+ IH EY ZH b n/a 18 2360 2387 2540 N
+ IH F B b n/a 18 2308 2398 2501 N
+ IH F B i n/a 18 2297 2396 2501 N
+ IH F CH b n/a 18 2308 2384 2514 N
+ IH F CH i n/a 18 2297 2384 2514 N
+ IH F D b n/a 18 2308 2382 2521 N
+ IH F D i n/a 18 2297 2382 2521 N
+ IH F F b n/a 18 2308 2399 2506 N
+ IH F F i n/a 18 2297 2399 2506 N
+ IH F G b n/a 18 2284 2465 2526 N
+ IH F G i n/a 18 2284 2464 2526 N
+ IH F JH b n/a 18 2308 2384 2522 N
+ IH F JH i n/a 18 2297 2384 2522 N
+ IH F K b n/a 18 2284 2465 2527 N
+ IH F K i n/a 18 2284 2464 2527 N
+ IH F L b n/a 18 2322 2424 2559 N
+ IH F L i n/a 18 2315 2424 2559 N
+ IH F M b n/a 18 2308 2476 2555 N
+ IH F M i n/a 18 2308 2476 2556 N
+ IH F N b n/a 18 2308 2485 2553 N
+ IH F N i n/a 18 2308 2484 2552 N
+ IH F NG b n/a 18 2282 2462 2565 N
+ IH F NG i n/a 18 2282 2462 2565 N
+ IH F P b n/a 18 2308 2397 2508 N
+ IH F P i n/a 18 2297 2396 2508 N
+ IH F R b n/a 18 2323 2489 2574 N
+ IH F R i n/a 18 2323 2489 2572 N
+ IH F S b n/a 18 2308 2411 2533 N
+ IH F S i n/a 18 2297 2411 2533 N
+ IH F SH b n/a 18 2308 2384 2535 N
+ IH F SH i n/a 18 2297 2384 2535 N
+ IH F T b n/a 18 2308 2382 2514 N
+ IH F T i n/a 18 2297 2382 2514 N
+ IH F TH b n/a 18 2308 2382 2506 N
+ IH F TH i n/a 18 2297 2382 2506 N
+ IH F V b n/a 18 2308 2402 2524 N
+ IH F W b n/a 18 2322 2424 2559 N
+ IH F Y b n/a 18 2322 2487 2495 N
+ IH F Z b n/a 18 2308 2379 2540 N
+ IH F Z i n/a 18 2297 2421 2538 N
+ IH F ZH b n/a 18 2308 2384 2540 N
+ IH F ZH i n/a 18 2297 2384 2539 N
+ IH G B b n/a 18 2314 2407 2501 N
+ IH G B i n/a 18 2314 2409 2501 N
+ IH G CH b n/a 18 2302 2389 2519 N
+ IH G CH i n/a 18 2302 2389 2519 N
+ IH G D b n/a 18 2314 2385 2520 N
+ IH G D i n/a 18 2314 2385 2520 N
+ IH G F b n/a 18 2302 2407 2506 N
+ IH G F i n/a 18 2302 2409 2504 N
+ IH G G b n/a 18 2327 2467 2526 N
+ IH G G i n/a 18 2327 2467 2526 N
+ IH G JH b n/a 18 2302 2389 2522 N
+ IH G JH i n/a 18 2302 2389 2522 N
+ IH G K b n/a 18 2327 2465 2527 N
+ IH G K i n/a 18 2327 2463 2527 N
+ IH G L b n/a 18 2324 2423 2561 N
+ IH G L i n/a 18 2324 2423 2562 N
+ IH G M b n/a 18 2302 2474 2555 N
+ IH G M i n/a 18 2302 2475 2556 N
+ IH G N b n/a 18 2302 2480 2543 N
+ IH G N i n/a 18 2302 2480 2547 N
+ IH G NG b n/a 18 2329 2458 2570 N
+ IH G NG i n/a 18 2329 2458 2570 N
+ IH G P b n/a 18 2302 2407 2508 N
+ IH G P i n/a 18 2302 2409 2508 N
+ IH G R b n/a 18 2323 2489 2574 N
+ IH G R i n/a 18 2323 2489 2572 N
+ IH G S b n/a 18 2305 2411 2534 N
+ IH G S i n/a 18 2305 2411 2534 N
+ IH G SH b n/a 18 2302 2389 2535 N
+ IH G SH i n/a 18 2302 2389 2535 N
+ IH G T b n/a 18 2302 2389 2518 N
+ IH G T i n/a 18 2302 2389 2518 N
+ IH G TH b n/a 18 2302 2389 2506 N
+ IH G TH i n/a 18 2302 2389 2504 N
+ IH G V b n/a 18 2303 2407 2523 N
+ IH G V i n/a 18 2303 2409 2523 N
+ IH G W b n/a 18 2324 2423 2561 N
+ IH G W i n/a 18 2324 2423 2562 N
+ IH G Y b n/a 18 2324 2480 2495 N
+ IH G Z b n/a 18 2305 2379 2540 N
+ IH G Z i n/a 18 2305 2417 2537 N
+ IH G ZH b n/a 18 2303 2389 2540 N
+ IH HH B b n/a 18 2304 2398 2501 N
+ IH HH B i n/a 18 2304 2396 2501 N
+ IH HH CH b n/a 18 2304 2387 2514 N
+ IH HH CH i n/a 18 2304 2387 2514 N
+ IH HH D b n/a 18 2302 2383 2521 N
+ IH HH D i n/a 18 2302 2383 2521 N
+ IH HH DH i n/a 18 2304 2387 2502 N
+ IH HH F b n/a 18 2304 2398 2506 N
+ IH HH F i n/a 18 2304 2398 2504 N
+ IH HH G b n/a 18 2285 2465 2526 N
+ IH HH G i n/a 18 2285 2463 2526 N
+ IH HH JH b n/a 18 2304 2387 2522 N
+ IH HH JH i n/a 18 2304 2387 2522 N
+ IH HH K b n/a 18 2285 2465 2527 N
+ IH HH K i n/a 18 2285 2463 2527 N
+ IH HH L b n/a 18 2322 2425 2561 N
+ IH HH L i n/a 18 2316 2423 2562 N
+ IH HH M b n/a 18 2304 2478 2555 N
+ IH HH M i n/a 18 2304 2478 2554 N
+ IH HH N b n/a 18 2304 2472 2546 N
+ IH HH N i n/a 18 2304 2472 2546 N
+ IH HH NG b n/a 18 2288 2451 2564 N
+ IH HH NG i n/a 18 2288 2451 2564 N
+ IH HH P b n/a 18 2304 2397 2508 N
+ IH HH P i n/a 18 2304 2396 2508 N
+ IH HH R b n/a 18 2323 2488 2574 N
+ IH HH R i n/a 18 2323 2488 2573 N
+ IH HH S b n/a 18 2305 2411 2533 N
+ IH HH S i n/a 18 2305 2411 2533 N
+ IH HH SH b n/a 18 2304 2387 2535 N
+ IH HH SH i n/a 18 2304 2387 2535 N
+ IH HH T b n/a 18 2302 2387 2514 N
+ IH HH T i n/a 18 2302 2387 2514 N
+ IH HH TH b n/a 18 2304 2387 2506 N
+ IH HH V b n/a 18 2304 2401 2524 N
+ IH HH V i n/a 18 2304 2401 2524 N
+ IH HH W b n/a 18 2322 2425 2561 N
+ IH HH Y b n/a 18 2322 2472 2495 N
+ IH HH Z b n/a 18 2305 2379 2540 N
+ IH HH Z i n/a 18 2305 2420 2542 N
+ IH HH ZH b n/a 18 2304 2387 2540 N
+ IH IH B b n/a 18 2355 2398 2501 N
+ IH IH CH b n/a 18 2355 2387 2514 N
+ IH IH D b n/a 18 2355 2382 2521 N
+ IH IH F b n/a 18 2354 2398 2506 N
+ IH IH G b n/a 18 2355 2465 2526 N
+ IH IH JH b n/a 18 2355 2387 2522 N
+ IH IH K b n/a 18 2355 2465 2527 N
+ IH IH L b n/a 18 2354 2425 2561 N
+ IH IH M b n/a 18 2354 2476 2555 N
+ IH IH N b n/a 18 2354 2472 2546 N
+ IH IH NG b n/a 18 2354 2451 2564 N
+ IH IH P b n/a 18 2355 2397 2508 N
+ IH IH R b n/a 18 2354 2488 2574 N
+ IH IH S b n/a 18 2355 2411 2533 N
+ IH IH SH b n/a 18 2354 2387 2535 N
+ IH IH T b n/a 18 2355 2388 2514 N
+ IH IH TH b n/a 18 2354 2387 2506 N
+ IH IH V b n/a 18 2354 2401 2524 N
+ IH IH W b n/a 18 2354 2425 2561 N
+ IH IH Y b n/a 18 2354 2472 2495 N
+ IH IH Z b n/a 18 2354 2379 2540 N
+ IH IH ZH b n/a 18 2354 2387 2540 N
+ IH IY AA e n/a 18 2358 2492 2575 N
+ IH IY AE e n/a 18 2358 2473 2497 N
+ IH IY AH e n/a 18 2358 2473 2497 N
+ IH IY AO e n/a 18 2358 2492 2575 N
+ IH IY AW e n/a 18 2358 2492 2497 N
+ IH IY AY e n/a 18 2358 2473 2575 N
+ IH IY B b n/a 18 2360 2398 2501 N
+ IH IY B e n/a 18 2360 2404 2502 N
+ IH IY CH b n/a 18 2360 2387 2515 N
+ IH IY CH e n/a 18 2360 2405 2515 N
+ IH IY CH i n/a 18 2360 2387 2515 N
+ IH IY D b n/a 18 2358 2382 2521 N
+ IH IY D e n/a 18 2358 2405 2521 N
+ IH IY D i n/a 18 2358 2382 2521 N
+ IH IY DH e n/a 18 2358 2404 2502 N
+ IH IY EH e n/a 18 2358 2473 2497 N
+ IH IY ER e n/a 18 2358 2492 2575 N
+ IH IY EY e n/a 18 2358 2473 2497 N
+ IH IY F b n/a 18 2358 2398 2506 N
+ IH IY F e n/a 18 2358 2404 2505 N
+ IH IY G b n/a 18 2360 2467 2526 N
+ IH IY G e n/a 18 2360 2467 2525 N
+ IH IY G i n/a 18 2360 2463 2526 N
+ IH IY HH e n/a 18 2358 2399 2494 N
+ IH IY IH e n/a 18 2358 2473 2497 N
+ IH IY IY e n/a 18 2358 2473 2496 N
+ IH IY JH b n/a 18 2360 2387 2522 N
+ IH IY JH e n/a 18 2360 2405 2522 N
+ IH IY JH i n/a 18 2360 2387 2522 N
+ IH IY K b n/a 18 2360 2468 2527 N
+ IH IY K e n/a 18 2360 2468 2527 N
+ IH IY K i n/a 18 2360 2463 2527 N
+ IH IY L b n/a 18 2358 2425 2562 N
+ IH IY L e n/a 18 2358 2422 2562 N
+ IH IY L i n/a 18 2358 2422 2559 N
+ IH IY M b n/a 18 2363 2477 2555 N
+ IH IY M e n/a 18 2363 2477 2556 N
+ IH IY M i n/a 18 2365 2477 2556 N
+ IH IY N b n/a 18 2361 2473 2547 N
+ IH IY N e n/a 18 2361 2473 2547 N
+ IH IY N i n/a 18 2365 2473 2547 N
+ IH IY NG b n/a 18 2362 2451 2570 N
+ IH IY NG e n/a 18 2362 2451 2570 N
+ IH IY NG i n/a 18 2365 2451 2571 N
+ IH IY OW e n/a 18 2358 2492 2575 N
+ IH IY OY e n/a 18 2358 2473 2575 N
+ IH IY P b n/a 18 2360 2397 2508 N
+ IH IY P e n/a 18 2360 2404 2507 N
+ IH IY R b n/a 18 2358 2492 2574 N
+ IH IY R e n/a 18 2358 2492 2575 N
+ IH IY R i n/a 18 2358 2492 2572 N
+ IH IY S b n/a 18 2358 2411 2533 N
+ IH IY S e n/a 18 2358 2411 2534 N
+ IH IY S i n/a 18 2358 2411 2533 N
+ IH IY SH b n/a 18 2358 2387 2535 N
+ IH IY SH e n/a 18 2358 2405 2535 N
+ IH IY SH i n/a 18 2358 2387 2535 N
+ IH IY SIL e n/a 18 2358 2406 2496 N
+ IH IY T b n/a 18 2358 2389 2515 N
+ IH IY T e n/a 18 2358 2405 2515 N
+ IH IY T i n/a 18 2358 2389 2515 N
+ IH IY TH b n/a 18 2358 2389 2506 N
+ IH IY TH e n/a 18 2358 2404 2505 N
+ IH IY TH i n/a 18 2358 2389 2504 N
+ IH IY UH e n/a 18 2358 2492 2575 N
+ IH IY UW e n/a 18 2358 2492 2575 N
+ IH IY V b n/a 18 2358 2401 2523 N
+ IH IY V e n/a 18 2358 2404 2523 N
+ IH IY V i n/a 18 2358 2401 2523 N
+ IH IY W b n/a 18 2358 2425 2562 N
+ IH IY W e n/a 18 2358 2422 2562 N
+ IH IY Y b n/a 18 2358 2473 2495 N
+ IH IY Y e n/a 18 2358 2473 2495 N
+ IH IY Z b n/a 18 2358 2380 2540 N
+ IH IY Z e n/a 18 2358 2380 2537 N
+ IH IY Z i n/a 18 2358 2420 2537 N
+ IH IY ZH b n/a 18 2358 2387 2540 N
+ IH IY ZH e n/a 18 2358 2404 2539 N
+ IH JH B b n/a 18 2307 2398 2501 N
+ IH JH B i n/a 18 2300 2397 2501 N
+ IH JH CH b n/a 18 2307 2391 2515 N
+ IH JH CH i n/a 18 2293 2391 2517 N
+ IH JH D b n/a 18 2307 2382 2521 N
+ IH JH D i n/a 18 2293 2382 2521 N
+ IH JH DH i n/a 18 2293 2391 2502 N
+ IH JH F b n/a 18 2307 2398 2506 N
+ IH JH F i n/a 18 2300 2397 2504 N
+ IH JH G b n/a 18 2286 2465 2526 N
+ IH JH G i n/a 18 2286 2463 2526 N
+ IH JH HH i n/a 18 2293 2392 2494 N
+ IH JH JH b n/a 18 2307 2391 2522 N
+ IH JH JH i n/a 18 2293 2391 2522 N
+ IH JH K b n/a 18 2286 2465 2527 N
+ IH JH K i n/a 18 2286 2463 2527 N
+ IH JH L b n/a 18 2322 2425 2561 N
+ IH JH L i n/a 18 2315 2422 2559 N
+ IH JH M b n/a 18 2307 2474 2555 N
+ IH JH M i n/a 18 2307 2474 2556 N
+ IH JH N b n/a 18 2307 2485 2543 N
+ IH JH N i n/a 18 2307 2482 2545 N
+ IH JH NG b n/a 18 2288 2459 2569 N
+ IH JH NG i n/a 18 2287 2459 2569 N
+ IH JH P b n/a 18 2307 2397 2508 N
+ IH JH P i n/a 18 2300 2397 2508 N
+ IH JH R b n/a 18 2323 2488 2574 N
+ IH JH R i n/a 18 2323 2488 2574 N
+ IH JH S b n/a 18 2307 2416 2533 N
+ IH JH S i n/a 18 2292 2416 2533 N
+ IH JH SH b n/a 18 2307 2391 2535 N
+ IH JH SH i n/a 18 2293 2391 2535 N
+ IH JH T b n/a 18 2307 2391 2515 N
+ IH JH T i n/a 18 2293 2391 2517 N
+ IH JH TH b n/a 18 2307 2391 2506 N
+ IH JH TH i n/a 18 2293 2391 2504 N
+ IH JH V b n/a 18 2307 2402 2524 N
+ IH JH W b n/a 18 2322 2425 2561 N
+ IH JH Y b n/a 18 2322 2487 2495 N
+ IH JH Z b n/a 18 2307 2379 2540 N
+ IH JH Z i n/a 18 2292 2418 2537 N
+ IH JH ZH b n/a 18 2307 2391 2540 N
+ IH K B b n/a 18 2309 2407 2501 N
+ IH K B i n/a 18 2309 2409 2501 N
+ IH K CH b n/a 18 2309 2387 2519 N
+ IH K CH i n/a 18 2309 2387 2519 N
+ IH K D b n/a 18 2309 2383 2521 N
+ IH K D i n/a 18 2309 2383 2521 N
+ IH K F b n/a 18 2309 2407 2506 N
+ IH K F i n/a 18 2309 2409 2504 N
+ IH K G b n/a 18 2329 2465 2526 N
+ IH K G i n/a 18 2329 2463 2526 N
+ IH K HH i n/a 18 2309 2392 2495 N
+ IH K JH b n/a 18 2309 2387 2522 N
+ IH K JH i n/a 18 2309 2387 2522 N
+ IH K K b n/a 18 2329 2465 2527 N
+ IH K K i n/a 18 2329 2463 2527 N
+ IH K L b n/a 18 2324 2423 2561 N
+ IH K L i n/a 18 2324 2423 2562 N
+ IH K M b n/a 18 2309 2474 2555 N
+ IH K M i n/a 18 2309 2474 2556 N
+ IH K N b n/a 18 2309 2479 2543 N
+ IH K N i n/a 18 2309 2480 2547 N
+ IH K NG b n/a 18 2329 2458 2570 N
+ IH K NG i n/a 18 2329 2458 2570 N
+ IH K P b n/a 18 2309 2407 2508 N
+ IH K P i n/a 18 2309 2409 2508 N
+ IH K R b n/a 18 2325 2488 2574 N
+ IH K R i n/a 18 2325 2488 2573 N
+ IH K S b n/a 18 2309 2411 2533 N
+ IH K S i n/a 18 2309 2411 2533 N
+ IH K SH b n/a 18 2309 2387 2535 N
+ IH K SH i n/a 18 2309 2387 2535 N
+ IH K T b n/a 18 2309 2387 2518 N
+ IH K T i n/a 18 2309 2387 2518 N
+ IH K TH b n/a 18 2309 2387 2506 N
+ IH K TH i n/a 18 2309 2387 2504 N
+ IH K V b n/a 18 2309 2407 2523 N
+ IH K V i n/a 18 2309 2409 2523 N
+ IH K W b n/a 18 2324 2423 2561 N
+ IH K W i n/a 18 2324 2423 2562 N
+ IH K Y b n/a 18 2325 2479 2495 N
+ IH K Y i n/a 18 2325 2479 2495 N
+ IH K Z b n/a 18 2309 2379 2540 N
+ IH K Z i n/a 18 2309 2417 2537 N
+ IH K ZH b n/a 18 2309 2387 2540 N
+ IH K ZH i n/a 18 2309 2387 2539 N
+ IH L AH i n/a 18 2331 2435 2497 N
+ IH L B b n/a 18 2333 2435 2501 N
+ IH L B i n/a 18 2331 2435 2501 N
+ IH L CH b n/a 18 2333 2431 2505 N
+ IH L CH i n/a 18 2331 2431 2505 N
+ IH L D b n/a 18 2333 2435 2500 N
+ IH L D i n/a 18 2331 2435 2500 N
+ IH L DH i n/a 18 2331 2430 2502 N
+ IH L F b n/a 18 2333 2436 2505 N
+ IH L F i n/a 18 2331 2435 2505 N
+ IH L G b n/a 18 2333 2432 2526 N
+ IH L G i n/a 18 2331 2432 2526 N
+ IH L HH i n/a 18 2331 2435 2494 N
+ IH L IY i n/a 18 2331 2435 2496 N
+ IH L JH b n/a 18 2333 2431 2503 N
+ IH L JH i n/a 18 2331 2431 2503 N
+ IH L K b n/a 18 2333 2432 2529 N
+ IH L K i n/a 18 2334 2432 2529 N
+ IH L L b n/a 18 2333 2426 2563 N
+ IH L L i n/a 18 2331 2426 2563 N
+ IH L M b n/a 18 2340 2447 2558 N
+ IH L M i n/a 18 2337 2448 2558 N
+ IH L N b n/a 18 2340 2447 2550 N
+ IH L N i n/a 18 2337 2448 2550 N
+ IH L NG b n/a 18 2336 2450 2567 N
+ IH L NG i n/a 18 2336 2450 2567 N
+ IH L OW i n/a 18 2331 2435 2572 N
+ IH L OY i n/a 18 2331 2435 2572 N
+ IH L P b n/a 18 2333 2435 2508 N
+ IH L P i n/a 18 2331 2435 2508 N
+ IH L R b n/a 18 2332 2428 2574 N
+ IH L R i n/a 18 2332 2428 2572 N
+ IH L S b n/a 18 2333 2436 2530 N
+ IH L S i n/a 18 2334 2436 2530 N
+ IH L SH b n/a 18 2333 2433 2536 N
+ IH L SH i n/a 18 2334 2433 2536 N
+ IH L T b n/a 18 2333 2435 2498 N
+ IH L T i n/a 18 2330 2434 2498 N
+ IH L TH b n/a 18 2333 2436 2505 N
+ IH L TH i n/a 18 2331 2435 2505 N
+ IH L V b n/a 18 2333 2430 2501 N
+ IH L V i n/a 18 2331 2429 2500 N
+ IH L W b n/a 18 2333 2426 2563 N
+ IH L W i n/a 18 2331 2426 2563 N
+ IH L Y b n/a 18 2333 2428 2495 N
+ IH L Y i n/a 18 2331 2428 2495 N
+ IH L Z b n/a 18 2333 2430 2541 N
+ IH L Z i n/a 18 2331 2430 2541 N
+ IH L ZH b n/a 18 2333 2430 2541 N
+ IH L ZH i n/a 18 2331 2430 2541 N
+ IH M AO i n/a 18 2352 2490 2574 N
+ IH M B b n/a 18 2350 2406 2501 N
+ IH M B i n/a 18 2351 2406 2501 N
+ IH M CH b n/a 18 2350 2394 2514 N
+ IH M CH i n/a 18 2351 2394 2514 N
+ IH M D b n/a 18 2349 2393 2520 N
+ IH M D i n/a 18 2351 2393 2520 N
+ IH M DH i n/a 18 2351 2393 2502 N
+ IH M EY i n/a 18 2352 2471 2497 N
+ IH M F b n/a 18 2357 2406 2499 N
+ IH M F i n/a 18 2351 2406 2499 N
+ IH M G b n/a 18 2351 2466 2526 N
+ IH M G i n/a 18 2351 2466 2526 N
+ IH M HH i n/a 18 2351 2393 2494 N
+ IH M JH b n/a 18 2350 2394 2522 N
+ IH M JH i n/a 18 2351 2394 2522 N
+ IH M K b n/a 18 2351 2466 2528 N
+ IH M K i n/a 18 2351 2466 2528 N
+ IH M L b n/a 18 2357 2425 2561 N
+ IH M L i n/a 18 2352 2425 2561 N
+ IH M M b n/a 18 2357 2476 2555 N
+ IH M M i n/a 18 2351 2476 2556 N
+ IH M N b n/a 18 2357 2472 2546 N
+ IH M N i n/a 18 2351 2471 2546 N
+ IH M NG b n/a 18 2357 2455 2564 N
+ IH M NG i n/a 18 2348 2454 2564 N
+ IH M P b n/a 18 2350 2406 2508 N
+ IH M P i n/a 18 2351 2406 2508 N
+ IH M R b n/a 18 2357 2490 2574 N
+ IH M R i n/a 18 2366 2490 2572 N
+ IH M S b n/a 18 2357 2414 2531 N
+ IH M S i n/a 18 2353 2414 2531 N
+ IH M SH b n/a 18 2357 2394 2535 N
+ IH M SH i n/a 18 2351 2394 2535 N
+ IH M T b n/a 18 2349 2393 2514 N
+ IH M T i n/a 18 2351 2393 2514 N
+ IH M TH b n/a 18 2357 2393 2506 N
+ IH M TH i n/a 18 2351 2393 2504 N
+ IH M UH i n/a 18 2352 2490 2572 N
+ IH M V b n/a 18 2357 2404 2524 N
+ IH M V i n/a 18 2351 2404 2524 N
+ IH M W b n/a 18 2357 2425 2561 N
+ IH M Y b n/a 18 2357 2472 2495 N
+ IH M Z b n/a 18 2357 2379 2540 N
+ IH M Z i n/a 18 2353 2421 2538 N
+ IH M ZH b n/a 18 2357 2394 2540 N
+ IH M ZH i n/a 18 2351 2394 2539 N
+ IH N AA e n/a 18 2356 2492 2575 N
+ IH N AE e n/a 18 2356 2472 2497 N
+ IH N AH e n/a 18 2356 2472 2497 N
+ IH N AO e n/a 18 2356 2492 2575 N
+ IH N AW e n/a 18 2356 2492 2497 N
+ IH N AY e n/a 18 2356 2472 2575 N
+ IH N B b n/a 18 2350 2398 2501 N
+ IH N B e n/a 18 2350 2404 2502 N
+ IH N B i n/a 18 2350 2396 2501 N
+ IH N CH b n/a 18 2350 2394 2514 N
+ IH N CH e n/a 18 2350 2394 2514 N
+ IH N CH i n/a 18 2350 2394 2514 N
+ IH N D b n/a 18 2349 2393 2521 N
+ IH N D e n/a 18 2349 2393 2522 N
+ IH N D i n/a 18 2349 2393 2521 N
+ IH N DH e n/a 18 2356 2393 2502 N
+ IH N DH i n/a 18 2350 2393 2502 N
+ IH N EH e n/a 18 2356 2472 2497 N
+ IH N ER e n/a 18 2356 2492 2575 N
+ IH N EY e n/a 18 2356 2472 2497 N
+ IH N F b n/a 18 2356 2398 2506 N
+ IH N F e n/a 18 2356 2404 2505 N
+ IH N F i n/a 18 2350 2398 2504 N
+ IH N G b n/a 18 2349 2466 2526 N
+ IH N G e n/a 18 2349 2466 2525 N
+ IH N G i n/a 18 2349 2466 2526 N
+ IH N HH e n/a 18 2356 2393 2494 N
+ IH N HH i n/a 18 2350 2393 2494 N
+ IH N IH e n/a 18 2356 2472 2497 N
+ IH N IY e n/a 18 2356 2472 2496 N
+ IH N JH b n/a 18 2350 2394 2522 N
+ IH N JH e n/a 18 2350 2394 2522 N
+ IH N JH i n/a 18 2350 2394 2522 N
+ IH N K b n/a 18 2349 2466 2528 N
+ IH N K e n/a 18 2349 2466 2528 N
+ IH N K i n/a 18 2349 2466 2528 N
+ IH N L b n/a 18 2356 2425 2561 N
+ IH N L e n/a 18 2356 2422 2561 N
+ IH N L i n/a 18 2350 2422 2559 N
+ IH N M b n/a 18 2356 2476 2555 N
+ IH N M e n/a 18 2356 2476 2556 N
+ IH N M i n/a 18 2350 2476 2556 N
+ IH N N b n/a 18 2356 2472 2546 N
+ IH N N e n/a 18 2356 2472 2546 N
+ IH N N i n/a 18 2350 2472 2546 N
+ IH N NG b n/a 18 2356 2455 2564 N
+ IH N NG e n/a 18 2356 2455 2564 N
+ IH N NG i n/a 18 2347 2455 2564 N
+ IH N OW e n/a 18 2356 2492 2575 N
+ IH N OY e n/a 18 2356 2472 2575 N
+ IH N P b n/a 18 2350 2397 2508 N
+ IH N P e n/a 18 2350 2404 2507 N
+ IH N P i n/a 18 2350 2396 2508 N
+ IH N R b n/a 18 2356 2490 2574 N
+ IH N R e n/a 18 2356 2492 2575 N
+ IH N R i n/a 18 2366 2490 2572 N
+ IH N S b n/a 18 2356 2413 2533 N
+ IH N S e n/a 18 2356 2413 2534 N
+ IH N S i n/a 18 2350 2413 2533 N
+ IH N SH b n/a 18 2356 2394 2535 N
+ IH N SH e n/a 18 2356 2394 2535 N
+ IH N SH i n/a 18 2350 2394 2535 N
+ IH N SIL e n/a 18 2356 2393 2496 N
+ IH N T b n/a 18 2350 2393 2514 N
+ IH N T e n/a 18 2350 2393 2514 N
+ IH N T i n/a 18 2350 2393 2514 N
+ IH N TH b n/a 18 2356 2393 2506 N
+ IH N TH e n/a 18 2356 2393 2505 N
+ IH N TH i n/a 18 2350 2393 2504 N
+ IH N UH e n/a 18 2356 2492 2575 N
+ IH N UW e n/a 18 2356 2492 2575 N
+ IH N V b n/a 18 2356 2401 2524 N
+ IH N V e n/a 18 2356 2404 2524 N
+ IH N V i n/a 18 2350 2401 2524 N
+ IH N W b n/a 18 2356 2425 2561 N
+ IH N W e n/a 18 2356 2422 2561 N
+ IH N W i n/a 18 2350 2422 2559 N
+ IH N Y b n/a 18 2356 2472 2495 N
+ IH N Y e n/a 18 2356 2472 2495 N
+ IH N Y i n/a 18 2350 2472 2495 N
+ IH N Z b n/a 18 2356 2379 2540 N
+ IH N Z e n/a 18 2356 2379 2537 N
+ IH N Z i n/a 18 2350 2421 2537 N
+ IH N ZH b n/a 18 2356 2394 2540 N
+ IH N ZH e n/a 18 2356 2394 2539 N
+ IH N ZH i n/a 18 2350 2394 2539 N
+ IH NG B b n/a 18 2363 2407 2501 N
+ IH NG CH b n/a 18 2363 2389 2518 N
+ IH NG D b n/a 18 2363 2389 2520 N
+ IH NG F b n/a 18 2363 2407 2506 N
+ IH NG G b n/a 18 2363 2466 2526 N
+ IH NG JH b n/a 18 2363 2389 2522 N
+ IH NG K b n/a 18 2363 2466 2528 N
+ IH NG L b n/a 18 2363 2423 2561 N
+ IH NG M b n/a 18 2363 2477 2555 N
+ IH NG N b n/a 18 2363 2473 2547 N
+ IH NG N i n/a 18 2350 2473 2547 N
+ IH NG NG b n/a 18 2363 2451 2570 N
+ IH NG NG i n/a 18 2346 2451 2571 N
+ IH NG P b n/a 18 2363 2407 2508 N
+ IH NG R b n/a 18 2363 2490 2574 N
+ IH NG S b n/a 18 2363 2414 2533 N
+ IH NG SH b n/a 18 2363 2389 2535 N
+ IH NG SH i n/a 18 2350 2389 2535 N
+ IH NG T b n/a 18 2363 2389 2518 N
+ IH NG T i n/a 18 2350 2389 2518 N
+ IH NG TH b n/a 18 2363 2389 2506 N
+ IH NG TH i n/a 18 2350 2389 2504 N
+ IH NG V b n/a 18 2363 2407 2523 N
+ IH NG W b n/a 18 2363 2423 2561 N
+ IH NG Y b n/a 18 2363 2473 2495 N
+ IH NG Z b n/a 18 2363 2380 2540 N
+ IH NG Z i n/a 18 2350 2421 2537 N
+ IH NG ZH b n/a 18 2363 2389 2540 N
+ IH OW B b n/a 18 2338 2431 2511 N
+ IH OW CH b n/a 18 2338 2431 2511 N
+ IH OW CH i n/a 18 2338 2431 2511 N
+ IH OW D b n/a 18 2338 2431 2511 N
+ IH OW D i n/a 18 2338 2431 2511 N
+ IH OW F b n/a 18 2339 2431 2512 N
+ IH OW G b n/a 18 2335 2431 2526 N
+ IH OW G i n/a 18 2335 2431 2526 N
+ IH OW HH i n/a 18 2338 2431 2511 N
+ IH OW JH b n/a 18 2338 2431 2511 N
+ IH OW JH i n/a 18 2338 2431 2511 N
+ IH OW K b n/a 18 2335 2432 2529 N
+ IH OW K i n/a 18 2335 2432 2529 N
+ IH OW L b n/a 18 2339 2426 2563 N
+ IH OW L i n/a 18 2338 2426 2563 N
+ IH OW M b n/a 18 2339 2447 2558 N
+ IH OW N b n/a 18 2340 2447 2550 N
+ IH OW N i n/a 18 2335 2449 2549 N
+ IH OW NG b n/a 18 2335 2449 2567 N
+ IH OW NG i n/a 18 2335 2449 2567 N
+ IH OW P b n/a 18 2338 2431 2511 N
+ IH OW R b n/a 18 2339 2428 2574 N
+ IH OW R i n/a 18 2339 2428 2572 N
+ IH OW S b n/a 18 2339 2433 2530 N
+ IH OW S i n/a 18 2338 2433 2530 N
+ IH OW SH b n/a 18 2339 2433 2536 N
+ IH OW SH i n/a 18 2338 2433 2536 N
+ IH OW T b n/a 18 2338 2431 2511 N
+ IH OW T i n/a 18 2338 2431 2511 N
+ IH OW TH b n/a 18 2339 2431 2512 N
+ IH OW TH i n/a 18 2338 2431 2512 N
+ IH OW V b n/a 18 2339 2430 2513 N
+ IH OW V i n/a 18 2338 2429 2513 N
+ IH OW W b n/a 18 2339 2426 2563 N
+ IH OW Y b n/a 18 2339 2428 2511 N
+ IH OW Z b n/a 18 2339 2430 2541 N
+ IH OW Z i n/a 18 2338 2430 2541 N
+ IH OW ZH b n/a 18 2339 2430 2541 N
+ IH OY B b n/a 18 2360 2398 2501 N
+ IH OY CH b n/a 18 2360 2388 2515 N
+ IH OY D b n/a 18 2360 2382 2521 N
+ IH OY F b n/a 18 2360 2398 2506 N
+ IH OY G b n/a 18 2360 2467 2526 N
+ IH OY JH b n/a 18 2360 2388 2522 N
+ IH OY JH i n/a 18 2360 2388 2522 N
+ IH OY K b n/a 18 2360 2468 2527 N
+ IH OY L b n/a 18 2360 2425 2562 N
+ IH OY M b n/a 18 2362 2476 2555 N
+ IH OY M i n/a 18 2364 2476 2556 N
+ IH OY N b n/a 18 2362 2472 2546 N
+ IH OY N i n/a 18 2365 2472 2546 N
+ IH OY NG b n/a 18 2362 2456 2564 N
+ IH OY NG i n/a 18 2364 2456 2564 N
+ IH OY P b n/a 18 2360 2397 2508 N
+ IH OY R b n/a 18 2360 2492 2574 N
+ IH OY S b n/a 18 2360 2411 2533 N
+ IH OY SH b n/a 18 2360 2388 2535 N
+ IH OY SH i n/a 18 2360 2388 2535 N
+ IH OY T b n/a 18 2360 2389 2515 N
+ IH OY T i n/a 18 2360 2389 2515 N
+ IH OY TH b n/a 18 2360 2389 2506 N
+ IH OY TH i n/a 18 2360 2389 2504 N
+ IH OY V b n/a 18 2360 2401 2523 N
+ IH OY W b n/a 18 2360 2425 2562 N
+ IH OY Y b n/a 18 2360 2472 2495 N
+ IH OY Z b n/a 18 2360 2379 2540 N
+ IH OY ZH b n/a 18 2360 2388 2540 N
+ IH P AA e n/a 18 2316 2493 2575 N
+ IH P AE e n/a 18 2316 2487 2497 N
+ IH P AH e n/a 18 2316 2487 2497 N
+ IH P AH i n/a 18 2316 2483 2497 N
+ IH P AO e n/a 18 2316 2493 2575 N
+ IH P AW e n/a 18 2316 2493 2497 N
+ IH P AY e n/a 18 2316 2487 2575 N
+ IH P B b n/a 18 2308 2406 2501 N
+ IH P B e n/a 18 2298 2404 2502 N
+ IH P B i n/a 18 2297 2406 2501 N
+ IH P CH b n/a 18 2308 2391 2515 N
+ IH P CH e n/a 18 2298 2405 2517 N
+ IH P CH i n/a 18 2297 2390 2517 N
+ IH P D b n/a 18 2308 2382 2521 N
+ IH P D e n/a 18 2298 2405 2521 N
+ IH P D i n/a 18 2297 2382 2521 N
+ IH P DH e n/a 18 2299 2404 2502 N
+ IH P EH e n/a 18 2316 2487 2497 N
+ IH P ER e n/a 18 2326 2493 2575 N
+ IH P ER i n/a 18 2325 2490 2573 N
+ IH P EY e n/a 18 2316 2487 2497 N
+ IH P F b n/a 18 2308 2406 2498 N
+ IH P F e n/a 18 2298 2404 2498 N
+ IH P F i n/a 18 2297 2406 2498 N
+ IH P G b n/a 18 2285 2465 2526 N
+ IH P G e n/a 18 2286 2469 2526 N
+ IH P G i n/a 18 2285 2463 2526 N
+ IH P HH e n/a 18 2298 2404 2494 N
+ IH P HH i n/a 18 2297 2392 2495 N
+ IH P IH e n/a 18 2316 2487 2497 N
+ IH P IY e n/a 18 2316 2487 2496 N
+ IH P JH b n/a 18 2308 2391 2522 N
+ IH P JH e n/a 18 2298 2405 2522 N
+ IH P JH i n/a 18 2297 2390 2522 N
+ IH P K b n/a 18 2285 2465 2527 N
+ IH P K e n/a 18 2286 2469 2527 N
+ IH P K i n/a 18 2285 2464 2527 N
+ IH P L b n/a 18 2322 2424 2559 N
+ IH P L e n/a 18 2315 2424 2559 N
+ IH P L i n/a 18 2315 2424 2559 N
+ IH P M b n/a 18 2308 2474 2555 N
+ IH P M e n/a 18 2308 2475 2556 N
+ IH P M i n/a 18 2306 2474 2556 N
+ IH P N b n/a 18 2308 2485 2543 N
+ IH P N e n/a 18 2308 2486 2543 N
+ IH P N i n/a 18 2306 2483 2545 N
+ IH P NG b n/a 18 2284 2459 2569 N
+ IH P NG e n/a 18 2284 2459 2569 N
+ IH P NG i n/a 18 2284 2459 2569 N
+ IH P OW e n/a 18 2316 2492 2575 N
+ IH P OY e n/a 18 2316 2487 2575 N
+ IH P P b n/a 18 2308 2406 2508 N
+ IH P P e n/a 18 2298 2404 2507 N
+ IH P P i n/a 18 2297 2406 2508 N
+ IH P R b n/a 18 2325 2488 2574 N
+ IH P R e n/a 18 2326 2493 2575 N
+ IH P R i n/a 18 2325 2488 2573 N
+ IH P S b n/a 18 2308 2411 2533 N
+ IH P S e n/a 18 2299 2411 2534 N
+ IH P S i n/a 18 2297 2411 2533 N
+ IH P SH b n/a 18 2308 2391 2535 N
+ IH P SH e n/a 18 2298 2405 2535 N
+ IH P SH i n/a 18 2297 2390 2535 N
+ IH P SIL e n/a 18 2298 2406 2496 N
+ IH P T b n/a 18 2308 2391 2515 N
+ IH P T e n/a 18 2298 2405 2516 N
+ IH P T i n/a 18 2297 2390 2516 N
+ IH P TH b n/a 18 2308 2391 2506 N
+ IH P TH e n/a 18 2299 2404 2505 N
+ IH P TH i n/a 18 2297 2390 2504 N
+ IH P UH e n/a 18 2316 2493 2575 N
+ IH P UW e n/a 18 2316 2492 2575 N
+ IH P V b n/a 18 2308 2404 2524 N
+ IH P V e n/a 18 2298 2404 2524 N
+ IH P V i n/a 18 2297 2404 2524 N
+ IH P W b n/a 18 2322 2424 2559 N
+ IH P W e n/a 18 2316 2424 2559 N
+ IH P Y b n/a 18 2322 2487 2495 N
+ IH P Y e n/a 18 2316 2487 2495 N
+ IH P Y i n/a 18 2316 2483 2495 N
+ IH P Z b n/a 18 2308 2379 2540 N
+ IH P Z e n/a 18 2299 2379 2538 N
+ IH P Z i n/a 18 2297 2421 2538 N
+ IH P ZH b n/a 18 2308 2391 2540 N
+ IH P ZH e n/a 18 2298 2404 2539 N
+ IH R AA e n/a 18 2373 2440 2575 N
+ IH R AE e n/a 18 2373 2440 2510 N
+ IH R AH e n/a 18 2373 2440 2510 N
+ IH R AH i n/a 18 2368 2440 2510 N
+ IH R AO e n/a 18 2373 2440 2575 N
+ IH R AW e n/a 18 2373 2440 2510 N
+ IH R AY e n/a 18 2373 2440 2575 N
+ IH R B b n/a 18 2373 2443 2501 N
+ IH R B e n/a 18 2373 2443 2502 N
+ IH R B i n/a 18 2371 2443 2501 N
+ IH R CH b n/a 18 2373 2440 2511 N
+ IH R CH e n/a 18 2373 2440 2511 N
+ IH R CH i n/a 18 2368 2439 2510 N
+ IH R D b n/a 18 2373 2440 2510 N
+ IH R D e n/a 18 2373 2440 2510 N
+ IH R D i n/a 18 2368 2440 2510 N
+ IH R DH e n/a 18 2373 2442 2513 N
+ IH R DH i n/a 18 2369 2441 2513 N
+ IH R EH e n/a 18 2373 2440 2510 N
+ IH R ER e n/a 18 2373 2440 2575 N
+ IH R EY e n/a 18 2373 2440 2510 N
+ IH R F b n/a 18 2373 2443 2505 N
+ IH R F e n/a 18 2373 2443 2505 N
+ IH R F i n/a 18 2371 2443 2505 N
+ IH R G b n/a 18 2374 2445 2526 N
+ IH R G e n/a 18 2374 2445 2526 N
+ IH R G i n/a 18 2372 2445 2526 N
+ IH R HH e n/a 18 2373 2440 2511 N
+ IH R HH i n/a 18 2368 2439 2510 N
+ IH R IH e n/a 18 2373 2440 2510 N
+ IH R IY e n/a 18 2373 2440 2510 N
+ IH R JH b n/a 18 2373 2440 2510 N
+ IH R JH e n/a 18 2373 2440 2510 N
+ IH R JH i n/a 18 2368 2440 2510 N
+ IH R K b n/a 18 2374 2445 2529 N
+ IH R K e n/a 18 2374 2445 2529 N
+ IH R K i n/a 18 2372 2445 2529 N
+ IH R L b n/a 18 2373 2427 2563 N
+ IH R L e n/a 18 2373 2427 2563 N
+ IH R L i n/a 18 2370 2427 2563 N
+ IH R M b n/a 18 2373 2452 2557 N
+ IH R M e n/a 18 2373 2452 2557 N
+ IH R M i n/a 18 2371 2452 2557 N
+ IH R N b n/a 18 2373 2453 2551 N
+ IH R N e n/a 18 2373 2453 2551 N
+ IH R N i n/a 18 2369 2453 2551 N
+ IH R NG b n/a 18 2373 2456 2568 N
+ IH R NG e n/a 18 2373 2456 2568 N
+ IH R NG i n/a 18 2367 2457 2568 N
+ IH R OW e n/a 18 2373 2440 2575 N
+ IH R OY e n/a 18 2373 2440 2575 N
+ IH R P b n/a 18 2374 2444 2507 N
+ IH R P e n/a 18 2374 2444 2507 N
+ IH R P i n/a 18 2371 2444 2507 N
+ IH R R b n/a 18 2373 2428 2574 N
+ IH R R e n/a 18 2373 2428 2575 N
+ IH R R i n/a 18 2370 2428 2572 N
+ IH R S b n/a 18 2374 2442 2532 N
+ IH R S e n/a 18 2374 2442 2532 N
+ IH R S i n/a 18 2369 2441 2532 N
+ IH R SH b n/a 18 2374 2442 2536 N
+ IH R SH e n/a 18 2374 2442 2536 N
+ IH R SH i n/a 18 2368 2439 2536 N
+ IH R SIL e n/a 18 2373 2440 2511 N
+ IH R T b n/a 18 2374 2440 2511 N
+ IH R T e n/a 18 2374 2440 2511 N
+ IH R T i n/a 18 2368 2439 2510 N
+ IH R TH b n/a 18 2373 2442 2512 N
+ IH R TH e n/a 18 2373 2442 2512 N
+ IH R TH i n/a 18 2369 2441 2512 N
+ IH R UH e n/a 18 2373 2440 2575 N
+ IH R UW e n/a 18 2373 2440 2575 N
+ IH R V b n/a 18 2373 2443 2501 N
+ IH R V e n/a 18 2373 2443 2501 N
+ IH R V i n/a 18 2371 2443 2501 N
+ IH R W b n/a 18 2373 2427 2563 N
+ IH R W e n/a 18 2373 2427 2563 N
+ IH R W i n/a 18 2371 2427 2563 N
+ IH R Y b n/a 18 2373 2428 2510 N
+ IH R Y e n/a 18 2373 2428 2510 N
+ IH R Y i n/a 18 2370 2428 2510 N
+ IH R Z b n/a 18 2374 2442 2541 N
+ IH R Z e n/a 18 2374 2442 2541 N
+ IH R Z i n/a 18 2369 2441 2541 N
+ IH R ZH b n/a 18 2374 2442 2541 N
+ IH R ZH e n/a 18 2374 2442 2541 N
+ IH R ZH i n/a 18 2369 2441 2541 N
+ IH S AA e n/a 18 2316 2493 2575 N
+ IH S AE e n/a 18 2316 2487 2497 N
+ IH S AE i n/a 18 2316 2487 2496 N
+ IH S AH e n/a 18 2316 2487 2497 N
+ IH S AH i n/a 18 2316 2487 2497 N
+ IH S AO e n/a 18 2316 2493 2575 N
+ IH S AW e n/a 18 2316 2493 2497 N
+ IH S AY e n/a 18 2316 2487 2575 N
+ IH S B b n/a 18 2322 2398 2501 N
+ IH S B e n/a 18 2318 2404 2502 N
+ IH S B i n/a 18 2318 2395 2501 N
+ IH S CH b n/a 18 2322 2381 2515 N
+ IH S CH e n/a 18 2317 2405 2517 N
+ IH S CH i n/a 18 2317 2381 2517 N
+ IH S D b n/a 18 2322 2381 2520 N
+ IH S D e n/a 18 2317 2405 2520 N
+ IH S D i n/a 18 2317 2381 2520 N
+ IH S DH e n/a 18 2319 2404 2502 N
+ IH S DH i n/a 18 2319 2381 2502 N
+ IH S EH e n/a 18 2316 2487 2497 N
+ IH S ER e n/a 18 2323 2493 2575 N
+ IH S EY e n/a 18 2316 2487 2497 N
+ IH S F b n/a 18 2322 2399 2506 N
+ IH S F e n/a 18 2319 2404 2505 N
+ IH S F i n/a 18 2319 2399 2504 N
+ IH S G b n/a 18 2289 2465 2526 N
+ IH S G e n/a 18 2289 2469 2526 N
+ IH S G i n/a 18 2289 2464 2526 N
+ IH S HH e n/a 18 2317 2399 2494 N
+ IH S HH i n/a 18 2317 2381 2494 N
+ IH S IH e n/a 18 2316 2487 2497 N
+ IH S IY e n/a 18 2316 2487 2496 N
+ IH S JH b n/a 18 2322 2381 2522 N
+ IH S JH e n/a 18 2317 2405 2522 N
+ IH S JH i n/a 18 2317 2381 2522 N
+ IH S K b n/a 18 2289 2465 2527 N
+ IH S K e n/a 18 2289 2469 2527 N
+ IH S K i n/a 18 2289 2464 2527 N
+ IH S L b n/a 18 2322 2425 2561 N
+ IH S L e n/a 18 2315 2422 2561 N
+ IH S L i n/a 18 2315 2422 2559 N
+ IH S M b n/a 18 2322 2475 2556 N
+ IH S M e n/a 18 2318 2475 2556 N
+ IH S M i n/a 18 2318 2475 2556 N
+ IH S N b n/a 18 2322 2485 2553 N
+ IH S N e n/a 18 2318 2486 2553 N
+ IH S N i n/a 18 2318 2486 2553 N
+ IH S NG b n/a 18 2290 2462 2566 N
+ IH S NG e n/a 18 2290 2462 2566 N
+ IH S NG i n/a 18 2290 2462 2566 N
+ IH S OW e n/a 18 2316 2492 2575 N
+ IH S OY e n/a 18 2316 2487 2575 N
+ IH S P b n/a 18 2322 2397 2508 N
+ IH S P e n/a 18 2317 2404 2507 N
+ IH S P i n/a 18 2317 2395 2508 N
+ IH S R b n/a 18 2323 2488 2574 N
+ IH S R e n/a 18 2323 2493 2575 N
+ IH S R i n/a 18 2323 2488 2573 N
+ IH S S b n/a 18 2321 2412 2533 N
+ IH S S e n/a 18 2319 2412 2534 N
+ IH S S i n/a 18 2319 2412 2533 N
+ IH S SH b n/a 18 2322 2384 2535 N
+ IH S SH e n/a 18 2317 2405 2535 N
+ IH S SH i n/a 18 2317 2384 2535 N
+ IH S SIL e n/a 18 2317 2406 2496 N
+ IH S T b n/a 18 2322 2381 2515 N
+ IH S T e n/a 18 2317 2405 2516 N
+ IH S T i n/a 18 2317 2381 2516 N
+ IH S TH b n/a 18 2322 2381 2506 N
+ IH S TH e n/a 18 2319 2404 2505 N
+ IH S TH i n/a 18 2319 2381 2504 N
+ IH S UH e n/a 18 2316 2493 2575 N
+ IH S UW e n/a 18 2316 2492 2575 N
+ IH S V b n/a 18 2322 2402 2524 N
+ IH S V e n/a 18 2319 2404 2524 N
+ IH S V i n/a 18 2319 2402 2524 N
+ IH S W b n/a 18 2322 2425 2561 N
+ IH S W e n/a 18 2316 2422 2561 N
+ IH S W i n/a 18 2316 2422 2559 N
+ IH S Y b n/a 18 2322 2487 2495 N
+ IH S Y e n/a 18 2316 2487 2495 N
+ IH S Y i n/a 18 2316 2487 2495 N
+ IH S Z b n/a 18 2321 2417 2537 N
+ IH S Z e n/a 18 2319 2417 2537 N
+ IH S Z i n/a 18 2319 2419 2537 N
+ IH S ZH b n/a 18 2322 2384 2539 N
+ IH S ZH e n/a 18 2317 2404 2539 N
+ IH S ZH i n/a 18 2317 2384 2539 N
+ IH SH AA e n/a 18 2316 2493 2575 N
+ IH SH AE e n/a 18 2316 2487 2497 N
+ IH SH AH e n/a 18 2316 2487 2497 N
+ IH SH AH i n/a 18 2316 2487 2497 N
+ IH SH AO e n/a 18 2316 2493 2575 N
+ IH SH AW e n/a 18 2316 2493 2497 N
+ IH SH AY e n/a 18 2316 2487 2575 N
+ IH SH B b n/a 18 2307 2398 2501 N
+ IH SH B e n/a 18 2300 2404 2502 N
+ IH SH B i n/a 18 2296 2398 2501 N
+ IH SH CH b n/a 18 2307 2384 2515 N
+ IH SH CH e n/a 18 2300 2405 2515 N
+ IH SH D b n/a 18 2307 2382 2520 N
+ IH SH D e n/a 18 2301 2405 2520 N
+ IH SH D i n/a 18 2296 2382 2520 N
+ IH SH DH e n/a 18 2301 2404 2502 N
+ IH SH EH e n/a 18 2316 2487 2497 N
+ IH SH ER e n/a 18 2323 2493 2575 N
+ IH SH EY e n/a 18 2316 2487 2497 N
+ IH SH F b n/a 18 2307 2399 2506 N
+ IH SH F e n/a 18 2300 2404 2505 N
+ IH SH F i n/a 18 2296 2399 2504 N
+ IH SH G b n/a 18 2286 2465 2526 N
+ IH SH G e n/a 18 2286 2469 2525 N
+ IH SH G i n/a 18 2286 2464 2526 N
+ IH SH HH e n/a 18 2300 2399 2494 N
+ IH SH HH i n/a 18 2296 2382 2494 N
+ IH SH IH e n/a 18 2316 2487 2497 N
+ IH SH IY e n/a 18 2316 2487 2496 N
+ IH SH JH b n/a 18 2307 2384 2522 N
+ IH SH JH e n/a 18 2300 2405 2522 N
+ IH SH K b n/a 18 2286 2465 2527 N
+ IH SH K e n/a 18 2286 2469 2527 N
+ IH SH K i n/a 18 2286 2464 2527 N
+ IH SH L b n/a 18 2322 2425 2561 N
+ IH SH L e n/a 18 2315 2422 2561 N
+ IH SH L i n/a 18 2315 2422 2559 N
+ IH SH M b n/a 18 2307 2474 2555 N
+ IH SH M e n/a 18 2307 2475 2556 N
+ IH SH M i n/a 18 2306 2474 2556 N
+ IH SH N b n/a 18 2307 2485 2553 N
+ IH SH N e n/a 18 2307 2486 2553 N
+ IH SH N i n/a 18 2306 2486 2553 N
+ IH SH NG b n/a 18 2287 2462 2566 N
+ IH SH NG e n/a 18 2287 2462 2566 N
+ IH SH NG i n/a 18 2287 2462 2566 N
+ IH SH OW e n/a 18 2316 2492 2575 N
+ IH SH OY e n/a 18 2316 2487 2575 N
+ IH SH P b n/a 18 2307 2397 2508 N
+ IH SH P e n/a 18 2300 2404 2508 N
+ IH SH P i n/a 18 2296 2397 2508 N
+ IH SH R b n/a 18 2323 2488 2574 N
+ IH SH R e n/a 18 2323 2493 2575 N
+ IH SH R i n/a 18 2323 2488 2573 N
+ IH SH S b n/a 18 2307 2411 2533 N
+ IH SH S e n/a 18 2301 2411 2534 N
+ IH SH S i n/a 18 2296 2411 2533 N
+ IH SH SH b n/a 18 2307 2384 2535 N
+ IH SH SH e n/a 18 2300 2405 2535 N
+ IH SH SH i n/a 18 2296 2384 2535 N
+ IH SH SIL e n/a 18 2300 2406 2496 N
+ IH SH T b n/a 18 2307 2382 2515 N
+ IH SH T e n/a 18 2301 2405 2515 N
+ IH SH T i n/a 18 2296 2382 2515 N
+ IH SH TH b n/a 18 2307 2382 2506 N
+ IH SH TH e n/a 18 2301 2404 2505 N
+ IH SH UH e n/a 18 2316 2493 2575 N
+ IH SH UH i n/a 18 2316 2490 2573 N
+ IH SH UW e n/a 18 2316 2492 2575 N
+ IH SH V b n/a 18 2307 2402 2524 N
+ IH SH V e n/a 18 2300 2404 2524 N
+ IH SH V i n/a 18 2296 2402 2524 N
+ IH SH W b n/a 18 2322 2425 2561 N
+ IH SH W e n/a 18 2316 2422 2561 N
+ IH SH W i n/a 18 2316 2422 2559 N
+ IH SH Y b n/a 18 2322 2487 2495 N
+ IH SH Y e n/a 18 2316 2487 2495 N
+ IH SH Y i n/a 18 2316 2487 2495 N
+ IH SH Z b n/a 18 2307 2418 2537 N
+ IH SH Z e n/a 18 2301 2418 2537 N
+ IH SH Z i n/a 18 2296 2418 2537 N
+ IH SH ZH b n/a 18 2307 2384 2539 N
+ IH SH ZH e n/a 18 2300 2404 2539 N
+ IH SIL B b n/a 18 2327 2407 2501 N
+ IH SIL CH b n/a 18 2327 2407 2519 N
+ IH SIL D b n/a 18 2327 2407 2521 N
+ IH SIL F b n/a 18 2327 2407 2506 N
+ IH SIL G b n/a 18 2327 2465 2526 N
+ IH SIL JH b n/a 18 2327 2407 2522 N
+ IH SIL K b n/a 18 2327 2465 2527 N
+ IH SIL L b n/a 18 2327 2425 2561 N
+ IH SIL M b n/a 18 2328 2474 2555 N
+ IH SIL N b n/a 18 2328 2479 2548 N
+ IH SIL NG b n/a 18 2328 2451 2564 N
+ IH SIL P b n/a 18 2327 2407 2508 N
+ IH SIL R b n/a 18 2327 2488 2574 N
+ IH SIL S b n/a 18 2327 2411 2533 N
+ IH SIL SH b n/a 18 2327 2408 2535 N
+ IH SIL T b n/a 18 2327 2407 2519 N
+ IH SIL TH b n/a 18 2327 2407 2506 N
+ IH SIL V b n/a 18 2327 2407 2524 N
+ IH SIL W b n/a 18 2327 2425 2561 N
+ IH SIL Y b n/a 18 2327 2479 2495 N
+ IH SIL Z b n/a 18 2327 2408 2540 N
+ IH SIL ZH b n/a 18 2327 2408 2540 N
+ IH T AA e n/a 18 2316 2493 2575 N
+ IH T AE e n/a 18 2316 2487 2497 N
+ IH T AH e n/a 18 2316 2487 2497 N
+ IH T AO e n/a 18 2316 2493 2575 N
+ IH T AW e n/a 18 2316 2493 2497 N
+ IH T AY e n/a 18 2316 2487 2575 N
+ IH T B b n/a 18 2313 2398 2501 N
+ IH T B e n/a 18 2298 2404 2502 N
+ IH T B i n/a 18 2294 2395 2501 N
+ IH T CH b n/a 18 2313 2375 2515 N
+ IH T CH e n/a 18 2298 2405 2517 N
+ IH T CH i n/a 18 2295 2375 2517 N
+ IH T D b n/a 18 2313 2377 2521 N
+ IH T D e n/a 18 2298 2405 2522 N
+ IH T D i n/a 18 2294 2377 2521 N
+ IH T DH e n/a 18 2299 2404 2502 N
+ IH T DH i n/a 18 2295 2378 2502 N
+ IH T EH e n/a 18 2316 2487 2497 N
+ IH T EH i n/a 18 2316 2483 2497 N
+ IH T ER e n/a 18 2326 2493 2575 N
+ IH T EY e n/a 18 2316 2487 2497 N
+ IH T F b n/a 18 2313 2398 2506 N
+ IH T F e n/a 18 2298 2404 2505 N
+ IH T F i n/a 18 2295 2398 2504 N
+ IH T G b n/a 18 2285 2465 2526 N
+ IH T G e n/a 18 2286 2469 2525 N
+ IH T G i n/a 18 2285 2463 2526 N
+ IH T HH e n/a 18 2298 2400 2494 N
+ IH T HH i n/a 18 2295 2375 2495 N
+ IH T IH e n/a 18 2316 2487 2497 N
+ IH T IY e n/a 18 2316 2487 2496 N
+ IH T JH b n/a 18 2313 2377 2522 N
+ IH T JH e n/a 18 2298 2405 2522 N
+ IH T JH i n/a 18 2295 2377 2522 N
+ IH T K b n/a 18 2285 2465 2527 N
+ IH T K e n/a 18 2286 2469 2527 N
+ IH T K i n/a 18 2285 2463 2527 N
+ IH T L b n/a 18 2322 2425 2561 N
+ IH T L e n/a 18 2315 2422 2561 N
+ IH T L i n/a 18 2315 2422 2559 N
+ IH T M b n/a 18 2311 2474 2555 N
+ IH T M e n/a 18 2306 2475 2556 N
+ IH T M i n/a 18 2306 2474 2556 N
+ IH T N b n/a 18 2311 2482 2543 N
+ IH T N e n/a 18 2306 2486 2543 N
+ IH T N i n/a 18 2306 2483 2545 N
+ IH T NG b n/a 18 2288 2459 2569 N
+ IH T NG e n/a 18 2288 2459 2569 N
+ IH T NG i n/a 18 2288 2459 2569 N
+ IH T OW e n/a 18 2316 2492 2575 N
+ IH T OY e n/a 18 2316 2487 2575 N
+ IH T P b n/a 18 2313 2397 2508 N
+ IH T P e n/a 18 2298 2404 2507 N
+ IH T P i n/a 18 2295 2396 2508 N
+ IH T R b n/a 18 2325 2488 2574 N
+ IH T R e n/a 18 2326 2493 2575 N
+ IH T R i n/a 18 2325 2488 2573 N
+ IH T S b n/a 18 2312 2411 2533 N
+ IH T S e n/a 18 2299 2410 2534 N
+ IH T S i n/a 18 2295 2411 2533 N
+ IH T SH b n/a 18 2312 2375 2535 N
+ IH T SH e n/a 18 2298 2405 2535 N
+ IH T SH i n/a 18 2295 2375 2535 N
+ IH T SIL e n/a 18 2298 2406 2496 N
+ IH T T b n/a 18 2313 2391 2515 N
+ IH T T e n/a 18 2298 2405 2517 N
+ IH T T i n/a 18 2295 2390 2517 N
+ IH T TH b n/a 18 2313 2377 2506 N
+ IH T TH e n/a 18 2299 2404 2505 N
+ IH T TH i n/a 18 2295 2377 2504 N
+ IH T UH e n/a 18 2316 2493 2575 N
+ IH T UW e n/a 18 2316 2492 2575 N
+ IH T V b n/a 18 2313 2401 2524 N
+ IH T V e n/a 18 2298 2404 2524 N
+ IH T V i n/a 18 2295 2401 2524 N
+ IH T W b n/a 18 2322 2425 2561 N
+ IH T W e n/a 18 2316 2422 2561 N
+ IH T W i n/a 18 2316 2422 2559 N
+ IH T Y b n/a 18 2322 2482 2495 N
+ IH T Y e n/a 18 2316 2487 2495 N
+ IH T Z b n/a 18 2312 2378 2540 N
+ IH T Z e n/a 18 2299 2378 2537 N
+ IH T Z i n/a 18 2295 2417 2537 N
+ IH T ZH b n/a 18 2312 2378 2540 N
+ IH T ZH e n/a 18 2298 2404 2539 N
+ IH T ZH i n/a 18 2295 2378 2539 N
+ IH TH B b n/a 18 2313 2398 2501 N
+ IH TH B i n/a 18 2294 2396 2501 N
+ IH TH CH b n/a 18 2313 2384 2514 N
+ IH TH CH i n/a 18 2295 2384 2514 N
+ IH TH D b n/a 18 2313 2382 2521 N
+ IH TH DH i n/a 18 2295 2382 2502 N
+ IH TH F b n/a 18 2313 2399 2506 N
+ IH TH G b n/a 18 2282 2465 2526 N
+ IH TH G i n/a 18 2282 2464 2526 N
+ IH TH JH b n/a 18 2313 2384 2522 N
+ IH TH JH i n/a 18 2295 2384 2522 N
+ IH TH K b n/a 18 2282 2465 2527 N
+ IH TH K i n/a 18 2282 2464 2527 N
+ IH TH L b n/a 18 2322 2425 2561 N
+ IH TH L i n/a 18 2315 2422 2559 N
+ IH TH M b n/a 18 2311 2476 2554 N
+ IH TH M i n/a 18 2313 2476 2556 N
+ IH TH N b n/a 18 2311 2485 2553 N
+ IH TH N i n/a 18 2313 2481 2552 N
+ IH TH NG b n/a 18 2282 2460 2565 N
+ IH TH NG i n/a 18 2282 2460 2565 N
+ IH TH P b n/a 18 2313 2397 2508 N
+ IH TH P i n/a 18 2295 2396 2508 N
+ IH TH R b n/a 18 2323 2489 2574 N
+ IH TH R i n/a 18 2323 2489 2573 N
+ IH TH S b n/a 18 2312 2411 2533 N
+ IH TH S i n/a 18 2295 2411 2533 N
+ IH TH SH b n/a 18 2312 2384 2535 N
+ IH TH T b n/a 18 2313 2382 2514 N
+ IH TH T i n/a 18 2295 2382 2514 N
+ IH TH TH b n/a 18 2313 2382 2506 N
+ IH TH V b n/a 18 2313 2402 2524 N
+ IH TH V i n/a 18 2295 2402 2524 N
+ IH TH W b n/a 18 2322 2425 2561 N
+ IH TH Y b n/a 18 2322 2487 2495 N
+ IH TH Z b n/a 18 2312 2379 2540 N
+ IH TH Z i n/a 18 2295 2421 2537 N
+ IH TH ZH b n/a 18 2312 2384 2540 N
+ IH UH B b n/a 18 2338 2431 2501 N
+ IH UH CH b n/a 18 2338 2431 2505 N
+ IH UH D b n/a 18 2338 2431 2500 N
+ IH UH F b n/a 18 2339 2431 2505 N
+ IH UH G b n/a 18 2335 2431 2526 N
+ IH UH JH b n/a 18 2338 2431 2503 N
+ IH UH K b n/a 18 2335 2432 2529 N
+ IH UH L b n/a 18 2339 2426 2563 N
+ IH UH M b n/a 18 2339 2447 2558 N
+ IH UH N b n/a 18 2339 2447 2550 N
+ IH UH NG b n/a 18 2335 2449 2567 N
+ IH UH P b n/a 18 2338 2431 2508 N
+ IH UH R b n/a 18 2339 2428 2574 N
+ IH UH S b n/a 18 2339 2433 2530 N
+ IH UH SH b n/a 18 2339 2433 2536 N
+ IH UH T b n/a 18 2338 2431 2498 N
+ IH UH T i n/a 18 2338 2431 2498 N
+ IH UH TH b n/a 18 2339 2431 2505 N
+ IH UH V b n/a 18 2339 2430 2501 N
+ IH UH W b n/a 18 2339 2426 2563 N
+ IH UH Y b n/a 18 2339 2428 2495 N
+ IH UH Z b n/a 18 2339 2430 2541 N
+ IH UH ZH b n/a 18 2339 2430 2541 N
+ IH UW AA e n/a 18 2338 2431 2575 N
+ IH UW AE e n/a 18 2338 2431 2511 N
+ IH UW AH e n/a 18 2338 2431 2511 N
+ IH UW AO e n/a 18 2338 2431 2575 N
+ IH UW AW e n/a 18 2338 2431 2511 N
+ IH UW AY e n/a 18 2338 2431 2575 N
+ IH UW B b n/a 18 2338 2431 2511 N
+ IH UW B e n/a 18 2338 2431 2511 N
+ IH UW CH b n/a 18 2338 2431 2511 N
+ IH UW CH e n/a 18 2338 2431 2511 N
+ IH UW D b n/a 18 2338 2431 2511 N
+ IH UW D e n/a 18 2338 2431 2511 N
+ IH UW D i n/a 18 2338 2431 2511 N
+ IH UW DH e n/a 18 2338 2430 2513 N
+ IH UW EH e n/a 18 2338 2431 2511 N
+ IH UW ER e n/a 18 2339 2431 2575 N
+ IH UW EY e n/a 18 2338 2431 2511 N
+ IH UW F b n/a 18 2339 2431 2512 N
+ IH UW F e n/a 18 2338 2431 2512 N
+ IH UW G b n/a 18 2335 2431 2526 N
+ IH UW G e n/a 18 2335 2431 2526 N
+ IH UW G i n/a 18 2335 2431 2526 N
+ IH UW HH e n/a 18 2338 2431 2511 N
+ IH UW IH e n/a 18 2338 2431 2511 N
+ IH UW IY e n/a 18 2338 2431 2511 N
+ IH UW JH b n/a 18 2338 2431 2511 N
+ IH UW JH e n/a 18 2338 2431 2511 N
+ IH UW JH i n/a 18 2338 2431 2511 N
+ IH UW K b n/a 18 2335 2432 2529 N
+ IH UW K e n/a 18 2335 2432 2529 N
+ IH UW K i n/a 18 2335 2432 2529 N
+ IH UW L b n/a 18 2339 2426 2563 N
+ IH UW L e n/a 18 2338 2426 2563 N
+ IH UW L i n/a 18 2338 2426 2563 N
+ IH UW M b n/a 18 2339 2447 2558 N
+ IH UW M e n/a 18 2338 2447 2558 N
+ IH UW M i n/a 18 2335 2449 2558 N
+ IH UW N b n/a 18 2339 2447 2550 N
+ IH UW N e n/a 18 2338 2447 2550 N
+ IH UW N i n/a 18 2335 2449 2550 N
+ IH UW NG b n/a 18 2335 2449 2567 N
+ IH UW NG e n/a 18 2335 2449 2567 N
+ IH UW NG i n/a 18 2335 2449 2567 N
+ IH UW OW e n/a 18 2338 2431 2575 N
+ IH UW OY e n/a 18 2338 2431 2575 N
+ IH UW P b n/a 18 2338 2431 2511 N
+ IH UW P e n/a 18 2338 2431 2511 N
+ IH UW R b n/a 18 2339 2428 2574 N
+ IH UW R e n/a 18 2339 2428 2575 N
+ IH UW R i n/a 18 2339 2428 2572 N
+ IH UW S b n/a 18 2339 2433 2530 N
+ IH UW S e n/a 18 2338 2433 2530 N
+ IH UW S i n/a 18 2338 2433 2530 N
+ IH UW SH b n/a 18 2339 2433 2536 N
+ IH UW SH e n/a 18 2338 2433 2536 N
+ IH UW SH i n/a 18 2338 2433 2536 N
+ IH UW SIL e n/a 18 2338 2431 2511 N
+ IH UW T b n/a 18 2338 2431 2511 N
+ IH UW T e n/a 18 2338 2431 2511 N
+ IH UW T i n/a 18 2338 2431 2511 N
+ IH UW TH b n/a 18 2339 2431 2512 N
+ IH UW TH e n/a 18 2338 2431 2512 N
+ IH UW UH e n/a 18 2338 2431 2575 N
+ IH UW UW e n/a 18 2338 2431 2575 N
+ IH UW V b n/a 18 2339 2430 2513 N
+ IH UW V e n/a 18 2338 2430 2513 N
+ IH UW W b n/a 18 2339 2426 2563 N
+ IH UW W e n/a 18 2338 2426 2563 N
+ IH UW Y b n/a 18 2339 2428 2511 N
+ IH UW Y e n/a 18 2338 2428 2511 N
+ IH UW Z b n/a 18 2339 2430 2541 N
+ IH UW Z e n/a 18 2338 2430 2541 N
+ IH UW Z i n/a 18 2338 2430 2541 N
+ IH UW ZH b n/a 18 2339 2430 2541 N
+ IH UW ZH e n/a 18 2338 2430 2541 N
+ IH V B b n/a 18 2279 2398 2501 N
+ IH V B i n/a 18 2278 2396 2501 N
+ IH V CH b n/a 18 2279 2384 2514 N
+ IH V CH i n/a 18 2278 2384 2514 N
+ IH V D b n/a 18 2279 2382 2521 N
+ IH V D i n/a 18 2278 2382 2521 N
+ IH V DH i n/a 18 2278 2382 2502 N
+ IH V F b n/a 18 2279 2399 2506 N
+ IH V F i n/a 18 2278 2399 2506 N
+ IH V G b n/a 18 2284 2465 2526 N
+ IH V G i n/a 18 2284 2464 2526 N
+ IH V HH i n/a 18 2278 2382 2494 N
+ IH V JH b n/a 18 2279 2384 2522 N
+ IH V JH i n/a 18 2278 2384 2522 N
+ IH V K b n/a 18 2284 2465 2527 N
+ IH V K i n/a 18 2284 2464 2527 N
+ IH V L b n/a 18 2279 2424 2560 N
+ IH V L i n/a 18 2278 2424 2560 N
+ IH V M b n/a 18 2279 2476 2555 N
+ IH V M i n/a 18 2277 2476 2556 N
+ IH V N b n/a 18 2279 2485 2552 N
+ IH V N i n/a 18 2277 2484 2552 N
+ IH V NG b n/a 18 2283 2461 2566 N
+ IH V NG i n/a 18 2283 2461 2566 N
+ IH V P b n/a 18 2279 2397 2508 N
+ IH V P i n/a 18 2278 2396 2508 N
+ IH V R b n/a 18 2279 2489 2574 N
+ IH V R i n/a 18 2279 2489 2572 N
+ IH V S b n/a 18 2277 2414 2533 N
+ IH V S i n/a 18 2277 2413 2533 N
+ IH V SH b n/a 18 2279 2384 2535 N
+ IH V SH i n/a 18 2278 2384 2535 N
+ IH V T b n/a 18 2277 2382 2514 N
+ IH V T i n/a 18 2277 2382 2514 N
+ IH V TH b n/a 18 2277 2382 2506 N
+ IH V TH i n/a 18 2277 2382 2506 N
+ IH V V b n/a 18 2279 2402 2524 N
+ IH V V i n/a 18 2278 2401 2524 N
+ IH V W b n/a 18 2279 2424 2560 N
+ IH V Y b n/a 18 2279 2487 2495 N
+ IH V Y i n/a 18 2278 2484 2495 N
+ IH V Z b n/a 18 2279 2379 2540 N
+ IH V Z i n/a 18 2278 2421 2538 N
+ IH V ZH b n/a 18 2279 2384 2540 N
+ IH V ZH i n/a 18 2278 2384 2539 N
+ IH W B b n/a 18 2338 2431 2511 N
+ IH W B i n/a 18 2338 2431 2511 N
+ IH W CH b n/a 18 2345 2438 2509 N
+ IH W CH i n/a 18 2345 2438 2509 N
+ IH W D b n/a 18 2338 2431 2511 N
+ IH W D i n/a 18 2338 2431 2511 N
+ IH W DH i n/a 18 2343 2437 2513 N
+ IH W F b n/a 18 2343 2431 2512 N
+ IH W F i n/a 18 2343 2431 2512 N
+ IH W G b n/a 18 2336 2431 2526 N
+ IH W G i n/a 18 2336 2431 2526 N
+ IH W HH i n/a 18 2343 2431 2511 N
+ IH W JH b n/a 18 2338 2438 2509 N
+ IH W JH i n/a 18 2338 2438 2509 N
+ IH W K b n/a 18 2344 2432 2529 N
+ IH W K i n/a 18 2344 2432 2529 N
+ IH W L b n/a 18 2342 2426 2563 N
+ IH W L i n/a 18 2342 2426 2563 N
+ IH W M b n/a 18 2341 2447 2558 N
+ IH W M i n/a 18 2341 2448 2558 N
+ IH W N b n/a 18 2341 2446 2550 N
+ IH W N i n/a 18 2341 2446 2550 N
+ IH W NG b n/a 18 2336 2449 2567 N
+ IH W NG i n/a 18 2336 2449 2567 N
+ IH W P b n/a 18 2343 2431 2511 N
+ IH W P i n/a 18 2343 2431 2511 N
+ IH W R b n/a 18 2339 2428 2574 N
+ IH W R i n/a 18 2339 2428 2572 N
+ IH W S b n/a 18 2344 2433 2531 N
+ IH W S i n/a 18 2344 2433 2531 N
+ IH W SH b n/a 18 2344 2433 2536 N
+ IH W SH i n/a 18 2344 2433 2536 N
+ IH W T b n/a 18 2344 2431 2511 N
+ IH W T i n/a 18 2344 2431 2511 N
+ IH W TH b n/a 18 2343 2437 2512 N
+ IH W TH i n/a 18 2343 2437 2512 N
+ IH W V b n/a 18 2339 2431 2513 N
+ IH W V i n/a 18 2338 2431 2513 N
+ IH W W b n/a 18 2342 2426 2563 N
+ IH W Y b n/a 18 2339 2428 2511 N
+ IH W Z b n/a 18 2339 2431 2541 N
+ IH W Z i n/a 18 2338 2431 2541 N
+ IH W ZH b n/a 18 2339 2431 2541 N
+ IH Y AA e n/a 18 2359 2492 2575 N
+ IH Y AE e n/a 18 2359 2472 2497 N
+ IH Y AH e n/a 18 2359 2472 2497 N
+ IH Y AO e n/a 18 2359 2492 2575 N
+ IH Y AW e n/a 18 2359 2492 2497 N
+ IH Y AY e n/a 18 2359 2472 2575 N
+ IH Y B b n/a 18 2360 2398 2501 N
+ IH Y B e n/a 18 2360 2404 2502 N
+ IH Y CH b n/a 18 2360 2387 2514 N
+ IH Y CH e n/a 18 2360 2405 2514 N
+ IH Y D b n/a 18 2359 2382 2521 N
+ IH Y D e n/a 18 2359 2405 2521 N
+ IH Y D i n/a 18 2359 2382 2521 N
+ IH Y DH e n/a 18 2359 2404 2502 N
+ IH Y EH e n/a 18 2359 2472 2497 N
+ IH Y ER e n/a 18 2359 2492 2575 N
+ IH Y EY e n/a 18 2359 2472 2497 N
+ IH Y F b n/a 18 2359 2398 2506 N
+ IH Y F e n/a 18 2359 2404 2505 N
+ IH Y F i n/a 18 2359 2398 2504 N
+ IH Y G b n/a 18 2360 2465 2526 N
+ IH Y G e n/a 18 2360 2467 2525 N
+ IH Y G i n/a 18 2360 2463 2526 N
+ IH Y HH e n/a 18 2359 2399 2494 N
+ IH Y IH e n/a 18 2359 2472 2497 N
+ IH Y IY e n/a 18 2359 2472 2496 N
+ IH Y JH b n/a 18 2360 2387 2522 N
+ IH Y JH e n/a 18 2360 2405 2522 N
+ IH Y JH i n/a 18 2360 2387 2522 N
+ IH Y K b n/a 18 2360 2465 2527 N
+ IH Y K e n/a 18 2360 2468 2527 N
+ IH Y L b n/a 18 2359 2425 2561 N
+ IH Y L e n/a 18 2359 2422 2561 N
+ IH Y L i n/a 18 2359 2422 2559 N
+ IH Y M b n/a 18 2363 2476 2555 N
+ IH Y M e n/a 18 2363 2476 2556 N
+ IH Y M i n/a 18 2365 2476 2556 N
+ IH Y N b n/a 18 2361 2472 2546 N
+ IH Y N e n/a 18 2361 2472 2546 N
+ IH Y N i n/a 18 2365 2472 2546 N
+ IH Y NG b n/a 18 2362 2451 2564 N
+ IH Y NG e n/a 18 2362 2451 2564 N
+ IH Y NG i n/a 18 2365 2451 2564 N
+ IH Y OW e n/a 18 2359 2492 2575 N
+ IH Y OY e n/a 18 2359 2472 2575 N
+ IH Y P b n/a 18 2360 2397 2508 N
+ IH Y P e n/a 18 2360 2404 2508 N
+ IH Y P i n/a 18 2360 2397 2508 N
+ IH Y R b n/a 18 2359 2492 2574 N
+ IH Y R e n/a 18 2359 2492 2575 N
+ IH Y R i n/a 18 2359 2492 2574 N
+ IH Y S b n/a 18 2359 2411 2533 N
+ IH Y S e n/a 18 2359 2411 2534 N
+ IH Y S i n/a 18 2359 2411 2533 N
+ IH Y SH b n/a 18 2359 2387 2535 N
+ IH Y SH e n/a 18 2359 2405 2535 N
+ IH Y SH i n/a 18 2359 2387 2535 N
+ IH Y SIL e n/a 18 2359 2406 2496 N
+ IH Y T b n/a 18 2359 2389 2514 N
+ IH Y T e n/a 18 2359 2405 2514 N
+ IH Y T i n/a 18 2359 2389 2514 N
+ IH Y TH b n/a 18 2359 2389 2506 N
+ IH Y TH e n/a 18 2359 2404 2505 N
+ IH Y UH e n/a 18 2359 2492 2575 N
+ IH Y UW e n/a 18 2359 2492 2575 N
+ IH Y V b n/a 18 2359 2401 2524 N
+ IH Y V e n/a 18 2359 2404 2524 N
+ IH Y V i n/a 18 2359 2401 2524 N
+ IH Y W b n/a 18 2359 2425 2561 N
+ IH Y W e n/a 18 2359 2422 2561 N
+ IH Y Y b n/a 18 2359 2472 2495 N
+ IH Y Y e n/a 18 2359 2472 2495 N
+ IH Y Z b n/a 18 2359 2379 2540 N
+ IH Y Z e n/a 18 2359 2379 2537 N
+ IH Y Z i n/a 18 2359 2418 2537 N
+ IH Y ZH b n/a 18 2359 2387 2540 N
+ IH Y ZH e n/a 18 2359 2404 2539 N
+ IH Z AA e n/a 18 2316 2492 2575 N
+ IH Z AE e n/a 18 2316 2487 2497 N
+ IH Z AH e n/a 18 2316 2487 2497 N
+ IH Z AO e n/a 18 2316 2492 2575 N
+ IH Z AW e n/a 18 2316 2492 2497 N
+ IH Z AY e n/a 18 2316 2487 2575 N
+ IH Z B b n/a 18 2322 2398 2501 N
+ IH Z B e n/a 18 2322 2404 2502 N
+ IH Z B i n/a 18 2320 2396 2501 N
+ IH Z CH b n/a 18 2320 2381 2515 N
+ IH Z CH e n/a 18 2320 2405 2517 N
+ IH Z CH i n/a 18 2320 2381 2517 N
+ IH Z D b n/a 18 2322 2381 2520 N
+ IH Z D e n/a 18 2322 2405 2520 N
+ IH Z D i n/a 18 2320 2381 2520 N
+ IH Z DH e n/a 18 2322 2404 2502 N
+ IH Z DH i n/a 18 2320 2381 2502 N
+ IH Z EH e n/a 18 2316 2487 2497 N
+ IH Z ER e n/a 18 2323 2492 2575 N
+ IH Z EY e n/a 18 2316 2487 2497 N
+ IH Z F b n/a 18 2320 2399 2506 N
+ IH Z F e n/a 18 2320 2404 2505 N
+ IH Z F i n/a 18 2320 2399 2504 N
+ IH Z G b n/a 18 2289 2465 2526 N
+ IH Z G e n/a 18 2289 2467 2526 N
+ IH Z G i n/a 18 2289 2464 2526 N
+ IH Z HH e n/a 18 2320 2399 2494 N
+ IH Z HH i n/a 18 2320 2381 2494 N
+ IH Z IH e n/a 18 2316 2487 2497 N
+ IH Z IY e n/a 18 2316 2487 2496 N
+ IH Z JH b n/a 18 2322 2381 2522 N
+ IH Z JH e n/a 18 2322 2405 2522 N
+ IH Z JH i n/a 18 2320 2381 2522 N
+ IH Z K b n/a 18 2289 2465 2527 N
+ IH Z K e n/a 18 2289 2469 2527 N
+ IH Z K i n/a 18 2289 2464 2527 N
+ IH Z L b n/a 18 2322 2425 2561 N
+ IH Z L e n/a 18 2315 2422 2561 N
+ IH Z L i n/a 18 2315 2422 2559 N
+ IH Z M b n/a 18 2322 2475 2556 N
+ IH Z M e n/a 18 2322 2475 2556 N
+ IH Z M i n/a 18 2320 2475 2556 N
+ IH Z N b n/a 18 2322 2485 2553 N
+ IH Z N e n/a 18 2322 2486 2553 N
+ IH Z N i n/a 18 2320 2482 2553 N
+ IH Z NG b n/a 18 2289 2460 2566 N
+ IH Z NG e n/a 18 2289 2460 2566 N
+ IH Z NG i n/a 18 2290 2462 2566 N
+ IH Z OW e n/a 18 2316 2492 2575 N
+ IH Z OY e n/a 18 2316 2487 2575 N
+ IH Z P b n/a 18 2320 2397 2508 N
+ IH Z P e n/a 18 2320 2404 2507 N
+ IH Z P i n/a 18 2320 2396 2508 N
+ IH Z R b n/a 18 2323 2489 2574 N
+ IH Z R e n/a 18 2323 2492 2575 N
+ IH Z R i n/a 18 2323 2489 2572 N
+ IH Z S b n/a 18 2320 2415 2533 N
+ IH Z S e n/a 18 2320 2415 2534 N
+ IH Z S i n/a 18 2320 2415 2533 N
+ IH Z SH b n/a 18 2320 2384 2535 N
+ IH Z SH e n/a 18 2320 2405 2535 N
+ IH Z SH i n/a 18 2320 2384 2535 N
+ IH Z SIL e n/a 18 2320 2406 2496 N
+ IH Z T b n/a 18 2320 2381 2515 N
+ IH Z T e n/a 18 2320 2405 2516 N
+ IH Z T i n/a 18 2320 2381 2516 N
+ IH Z TH b n/a 18 2320 2381 2506 N
+ IH Z TH e n/a 18 2320 2404 2505 N
+ IH Z TH i n/a 18 2320 2381 2504 N
+ IH Z UH e n/a 18 2316 2492 2575 N
+ IH Z UW e n/a 18 2316 2492 2575 N
+ IH Z V b n/a 18 2322 2402 2524 N
+ IH Z V e n/a 18 2322 2404 2524 N
+ IH Z V i n/a 18 2320 2402 2524 N
+ IH Z W b n/a 18 2322 2425 2561 N
+ IH Z W e n/a 18 2316 2422 2561 N
+ IH Z W i n/a 18 2316 2422 2559 N
+ IH Z Y b n/a 18 2322 2487 2495 N
+ IH Z Y e n/a 18 2316 2487 2495 N
+ IH Z Z b n/a 18 2322 2417 2537 N
+ IH Z Z e n/a 18 2322 2417 2537 N
+ IH Z Z i n/a 18 2320 2419 2537 N
+ IH Z ZH b n/a 18 2322 2384 2539 N
+ IH Z ZH e n/a 18 2322 2404 2539 N
+ IH ZH B b n/a 18 2292 2398 2501 N
+ IH ZH B i n/a 18 2292 2398 2501 N
+ IH ZH CH b n/a 18 2292 2384 2515 N
+ IH ZH D b n/a 18 2292 2382 2520 N
+ IH ZH F b n/a 18 2292 2399 2506 N
+ IH ZH G b n/a 18 2286 2465 2526 N
+ IH ZH JH b n/a 18 2292 2384 2522 N
+ IH ZH K b n/a 18 2286 2465 2527 N
+ IH ZH L b n/a 18 2322 2425 2561 N
+ IH ZH L i n/a 18 2315 2422 2559 N
+ IH ZH M b n/a 18 2307 2474 2555 N
+ IH ZH N b n/a 18 2307 2485 2553 N
+ IH ZH N i n/a 18 2307 2482 2553 N
+ IH ZH NG b n/a 18 2288 2461 2566 N
+ IH ZH NG i n/a 18 2288 2461 2566 N
+ IH ZH P b n/a 18 2292 2397 2508 N
+ IH ZH R b n/a 18 2323 2488 2574 N
+ IH ZH R i n/a 18 2323 2488 2574 N
+ IH ZH S b n/a 18 2292 2414 2533 N
+ IH ZH S i n/a 18 2292 2413 2533 N
+ IH ZH SH b n/a 18 2292 2384 2535 N
+ IH ZH T b n/a 18 2292 2382 2515 N
+ IH ZH TH b n/a 18 2292 2382 2506 N
+ IH ZH V b n/a 18 2292 2402 2524 N
+ IH ZH V i n/a 18 2292 2402 2524 N
+ IH ZH W b n/a 18 2322 2425 2561 N
+ IH ZH Y b n/a 18 2322 2487 2495 N
+ IH ZH Z b n/a 18 2292 2418 2537 N
+ IH ZH Z i n/a 18 2292 2418 2537 N
+ IH ZH ZH b n/a 18 2292 2384 2539 N
+ IY AA AA b n/a 19 2617 2706 2781 N
+ IY AA AA e n/a 19 2614 2706 2781 N
+ IY AA AA s n/a 19 2614 2706 2781 N
+ IY AA AE e n/a 19 2614 2707 2748 N
+ IY AA AE s n/a 19 2614 2707 2748 N
+ IY AA AH b n/a 19 2617 2706 2759 N
+ IY AA AH e n/a 19 2614 2706 2756 N
+ IY AA AH i n/a 19 2614 2706 2759 N
+ IY AA AH s n/a 19 2614 2706 2759 N
+ IY AA AO b n/a 19 2617 2706 2780 N
+ IY AA AO e n/a 19 2614 2706 2782 N
+ IY AA AO s n/a 19 2614 2706 2780 N
+ IY AA AW e n/a 19 2614 2707 2781 N
+ IY AA AW s n/a 19 2614 2707 2781 N
+ IY AA AY e n/a 19 2614 2706 2757 N
+ IY AA AY s n/a 19 2614 2706 2748 N
+ IY AA B b n/a 19 2617 2677 2718 N
+ IY AA B e n/a 19 2613 2687 2718 N
+ IY AA B s n/a 19 2610 2677 2718 N
+ IY AA CH b n/a 19 2617 2696 2724 N
+ IY AA CH e n/a 19 2613 2687 2724 N
+ IY AA CH i n/a 19 2609 2696 2724 N
+ IY AA CH s n/a 19 2609 2696 2724 N
+ IY AA D b n/a 19 2617 2677 2721 N
+ IY AA D e n/a 19 2613 2687 2725 N
+ IY AA D i n/a 19 2613 2677 2721 N
+ IY AA D s n/a 19 2613 2677 2721 N
+ IY AA DH b n/a 19 2617 2677 2731 N
+ IY AA DH e n/a 19 2613 2682 2719 N
+ IY AA DH s n/a 19 2613 2677 2731 N
+ IY AA EH b n/a 19 2617 2707 2750 N
+ IY AA EH e n/a 19 2614 2707 2750 N
+ IY AA EH s n/a 19 2614 2707 2750 N
+ IY AA ER b n/a 19 2617 2706 2761 N
+ IY AA ER e n/a 19 2614 2706 2783 N
+ IY AA ER s n/a 19 2614 2706 2761 N
+ IY AA EY b n/a 19 2617 2707 2749 N
+ IY AA EY e n/a 19 2614 2707 2749 N
+ IY AA EY s n/a 19 2614 2707 2749 N
+ IY AA F b n/a 19 2617 2696 2740 N
+ IY AA F e n/a 19 2613 2685 2740 N
+ IY AA F i n/a 19 2609 2696 2740 N
+ IY AA F s n/a 19 2609 2696 2740 N
+ IY AA G b n/a 19 2617 2677 2726 N
+ IY AA G e n/a 19 2612 2688 2727 N
+ IY AA G s n/a 19 2610 2677 2726 N
+ IY AA HH e n/a 19 2613 2686 2729 N
+ IY AA HH s n/a 19 2609 2696 2729 N
+ IY AA IH e n/a 19 2614 2707 2769 N
+ IY AA IH i n/a 19 2614 2707 2772 N
+ IY AA IH s n/a 19 2614 2707 2769 N
+ IY AA IY b n/a 19 2617 2707 2770 N
+ IY AA IY e n/a 19 2614 2707 2770 N
+ IY AA IY s n/a 19 2614 2707 2770 N
+ IY AA JH b n/a 19 2617 2677 2725 N
+ IY AA JH e n/a 19 2613 2687 2725 N
+ IY AA JH s n/a 19 2609 2677 2725 N
+ IY AA K b n/a 19 2617 2696 2726 N
+ IY AA K e n/a 19 2612 2688 2726 N
+ IY AA K s n/a 19 2610 2696 2726 N
+ IY AA L b n/a 19 2617 2710 2778 N
+ IY AA L e n/a 19 2613 2710 2774 N
+ IY AA L s n/a 19 2610 2710 2778 N
+ IY AA M b n/a 19 2617 2681 2763 N
+ IY AA M e n/a 19 2613 2686 2763 N
+ IY AA M i n/a 19 2613 2681 2766 N
+ IY AA M s n/a 19 2613 2681 2763 N
+ IY AA N b n/a 19 2617 2681 2762 N
+ IY AA N e n/a 19 2613 2686 2762 N
+ IY AA N i n/a 19 2613 2681 2765 N
+ IY AA N s n/a 19 2613 2681 2762 N
+ IY AA NG b n/a 19 2617 2681 2762 N
+ IY AA NG e n/a 19 2613 2686 2762 N
+ IY AA NG s n/a 19 2613 2681 2762 N
+ IY AA OW b n/a 19 2617 2706 2780 N
+ IY AA OW e n/a 19 2614 2706 2782 N
+ IY AA OW i n/a 19 2614 2706 2780 N
+ IY AA OW s n/a 19 2614 2706 2780 N
+ IY AA OY e n/a 19 2614 2706 2757 N
+ IY AA OY s n/a 19 2614 2706 2748 N
+ IY AA P b n/a 19 2617 2696 2715 N
+ IY AA P e n/a 19 2613 2687 2716 N
+ IY AA P s n/a 19 2610 2696 2715 N
+ IY AA R b n/a 19 2617 2710 2761 N
+ IY AA R e n/a 19 2613 2710 2775 N
+ IY AA R s n/a 19 2610 2710 2761 N
+ IY AA S b n/a 19 2617 2696 2736 N
+ IY AA S e n/a 19 2613 2685 2737 N
+ IY AA S i n/a 19 2609 2696 2736 N
+ IY AA S s n/a 19 2609 2696 2736 N
+ IY AA SH b n/a 19 2617 2696 2739 N
+ IY AA SH e n/a 19 2613 2685 2739 N
+ IY AA SH i n/a 19 2609 2696 2739 N
+ IY AA SH s n/a 19 2609 2696 2739 N
+ IY AA SIL e n/a 19 2615 2683 2747 N
+ IY AA SIL s n/a 19 2615 2677 2747 N
+ IY AA T b n/a 19 2617 2696 2724 N
+ IY AA T e n/a 19 2613 2687 2724 N
+ IY AA T i n/a 19 2609 2696 2724 N
+ IY AA T s n/a 19 2609 2696 2724 N
+ IY AA TH b n/a 19 2617 2696 2741 N
+ IY AA TH e n/a 19 2613 2685 2741 N
+ IY AA TH s n/a 19 2609 2696 2741 N
+ IY AA UH e n/a 19 2614 2707 2783 N
+ IY AA UH s n/a 19 2614 2707 2783 N
+ IY AA UW b n/a 19 2617 2707 2780 N
+ IY AA UW e n/a 19 2614 2707 2782 N
+ IY AA UW s n/a 19 2614 2707 2780 N
+ IY AA V b n/a 19 2617 2677 2731 N
+ IY AA V e n/a 19 2613 2682 2720 N
+ IY AA V i n/a 19 2609 2677 2731 N
+ IY AA V s n/a 19 2609 2677 2731 N
+ IY AA W b n/a 19 2617 2711 2775 N
+ IY AA W e n/a 19 2613 2710 2775 N
+ IY AA W s n/a 19 2610 2711 2775 N
+ IY AA Y e n/a 19 2614 2707 2771 N
+ IY AA Y s n/a 19 2614 2707 2771 N
+ IY AA Z b n/a 19 2617 2677 2734 N
+ IY AA Z e n/a 19 2613 2682 2733 N
+ IY AA Z i n/a 19 2613 2677 2733 N
+ IY AA Z s n/a 19 2613 2677 2733 N
+ IY AA ZH b n/a 19 2617 2677 2734 N
+ IY AA ZH e n/a 19 2613 2682 2733 N
+ IY AA ZH s n/a 19 2609 2677 2733 N
+ IY AE AA b n/a 19 2595 2698 2781 N
+ IY AE AA s n/a 19 2604 2698 2781 N
+ IY AE AE s n/a 19 2604 2654 2748 N
+ IY AE AH b n/a 19 2595 2660 2759 N
+ IY AE AH s n/a 19 2604 2660 2759 N
+ IY AE AO b n/a 19 2595 2698 2780 N
+ IY AE AO s n/a 19 2604 2698 2780 N
+ IY AE AW s n/a 19 2604 2698 2781 N
+ IY AE AY s n/a 19 2604 2654 2748 N
+ IY AE B b n/a 19 2595 2640 2718 N
+ IY AE B s n/a 19 2604 2640 2718 N
+ IY AE CH b n/a 19 2595 2632 2723 N
+ IY AE CH s n/a 19 2604 2632 2723 N
+ IY AE D b n/a 19 2595 2636 2721 N
+ IY AE D s n/a 19 2604 2636 2721 N
+ IY AE DH b n/a 19 2595 2629 2731 N
+ IY AE DH s n/a 19 2604 2652 2731 N
+ IY AE EH b n/a 19 2595 2654 2750 N
+ IY AE EH s n/a 19 2604 2654 2750 N
+ IY AE ER b n/a 19 2595 2698 2761 N
+ IY AE ER s n/a 19 2604 2698 2761 N
+ IY AE EY b n/a 19 2595 2654 2749 N
+ IY AE EY s n/a 19 2604 2654 2749 N
+ IY AE F b n/a 19 2595 2634 2740 N
+ IY AE F s n/a 19 2604 2634 2740 N
+ IY AE G b n/a 19 2595 2647 2726 N
+ IY AE G s n/a 19 2604 2647 2726 N
+ IY AE HH s n/a 19 2604 2634 2729 N
+ IY AE IH s n/a 19 2604 2654 2769 N
+ IY AE IY b n/a 19 2595 2654 2770 N
+ IY AE IY s n/a 19 2604 2654 2770 N
+ IY AE JH b n/a 19 2595 2636 2725 N
+ IY AE JH s n/a 19 2604 2636 2725 N
+ IY AE K b n/a 19 2595 2647 2726 N
+ IY AE K s n/a 19 2604 2647 2726 N
+ IY AE L b n/a 19 2595 2698 2778 N
+ IY AE L s n/a 19 2604 2698 2778 N
+ IY AE M b n/a 19 2595 2674 2763 N
+ IY AE M s n/a 19 2604 2674 2763 N
+ IY AE N b n/a 19 2595 2674 2762 N
+ IY AE N s n/a 19 2604 2674 2762 N
+ IY AE NG b n/a 19 2595 2674 2762 N
+ IY AE NG s n/a 19 2604 2674 2762 N
+ IY AE OW b n/a 19 2595 2698 2780 N
+ IY AE OW s n/a 19 2604 2698 2780 N
+ IY AE OY s n/a 19 2604 2654 2748 N
+ IY AE P b n/a 19 2595 2640 2715 N
+ IY AE P s n/a 19 2604 2640 2715 N
+ IY AE R b n/a 19 2595 2698 2761 N
+ IY AE R s n/a 19 2604 2698 2761 N
+ IY AE S b n/a 19 2595 2632 2736 N
+ IY AE S s n/a 19 2604 2632 2736 N
+ IY AE SH b n/a 19 2595 2634 2739 N
+ IY AE SH s n/a 19 2604 2634 2739 N
+ IY AE SIL s n/a 19 2604 2648 2745 N
+ IY AE T b n/a 19 2595 2632 2723 N
+ IY AE T s n/a 19 2604 2632 2723 N
+ IY AE TH b n/a 19 2595 2632 2741 N
+ IY AE TH s n/a 19 2604 2632 2741 N
+ IY AE UH s n/a 19 2604 2698 2783 N
+ IY AE UW b n/a 19 2595 2698 2780 N
+ IY AE UW s n/a 19 2604 2698 2780 N
+ IY AE V b n/a 19 2595 2629 2731 N
+ IY AE V s n/a 19 2604 2652 2731 N
+ IY AE W b n/a 19 2595 2713 2776 N
+ IY AE W s n/a 19 2604 2713 2776 N
+ IY AE Y s n/a 19 2604 2636 2771 N
+ IY AE Z b n/a 19 2595 2629 2734 N
+ IY AE Z s n/a 19 2604 2651 2733 N
+ IY AE ZH b n/a 19 2595 2629 2734 N
+ IY AE ZH s n/a 19 2604 2651 2733 N
+ IY AH AA b n/a 19 2594 2698 2781 N
+ IY AH AA e n/a 19 2599 2698 2781 N
+ IY AH AA s n/a 19 2604 2698 2781 N
+ IY AH AE e n/a 19 2599 2654 2748 N
+ IY AH AE s n/a 19 2604 2654 2748 N
+ IY AH AH b n/a 19 2594 2660 2759 N
+ IY AH AH e n/a 19 2599 2660 2756 N
+ IY AH AH i n/a 19 2604 2658 2759 N
+ IY AH AH s n/a 19 2604 2660 2759 N
+ IY AH AO b n/a 19 2594 2698 2780 N
+ IY AH AO e n/a 19 2599 2698 2782 N
+ IY AH AO s n/a 19 2604 2698 2780 N
+ IY AH AW e n/a 19 2599 2698 2781 N
+ IY AH AW s n/a 19 2604 2698 2781 N
+ IY AH AY e n/a 19 2599 2654 2757 N
+ IY AH AY s n/a 19 2604 2654 2748 N
+ IY AH B b n/a 19 2594 2640 2718 N
+ IY AH B e n/a 19 2599 2640 2718 N
+ IY AH B s n/a 19 2604 2640 2718 N
+ IY AH CH b n/a 19 2594 2632 2723 N
+ IY AH CH e n/a 19 2599 2643 2724 N
+ IY AH CH s n/a 19 2604 2632 2723 N
+ IY AH D b n/a 19 2594 2636 2721 N
+ IY AH D e n/a 19 2599 2643 2725 N
+ IY AH D s n/a 19 2604 2636 2721 N
+ IY AH DH b n/a 19 2594 2629 2731 N
+ IY AH DH e n/a 19 2599 2652 2720 N
+ IY AH DH s n/a 19 2604 2652 2731 N
+ IY AH EH b n/a 19 2594 2654 2750 N
+ IY AH EH e n/a 19 2599 2654 2750 N
+ IY AH EH s n/a 19 2604 2654 2750 N
+ IY AH ER b n/a 19 2594 2698 2761 N
+ IY AH ER e n/a 19 2599 2698 2783 N
+ IY AH ER s n/a 19 2604 2698 2761 N
+ IY AH EY b n/a 19 2594 2654 2749 N
+ IY AH EY e n/a 19 2599 2654 2749 N
+ IY AH EY s n/a 19 2604 2654 2749 N
+ IY AH F b n/a 19 2594 2634 2740 N
+ IY AH F e n/a 19 2599 2639 2740 N
+ IY AH F s n/a 19 2604 2634 2740 N
+ IY AH G b n/a 19 2594 2647 2726 N
+ IY AH G e n/a 19 2599 2647 2727 N
+ IY AH G s n/a 19 2604 2647 2726 N
+ IY AH HH e n/a 19 2599 2634 2729 N
+ IY AH HH s n/a 19 2604 2634 2729 N
+ IY AH IH e n/a 19 2599 2654 2769 N
+ IY AH IH s n/a 19 2604 2654 2769 N
+ IY AH IY b n/a 19 2594 2654 2770 N
+ IY AH IY e n/a 19 2599 2654 2770 N
+ IY AH IY s n/a 19 2604 2654 2770 N
+ IY AH JH b n/a 19 2594 2636 2725 N
+ IY AH JH e n/a 19 2599 2643 2725 N
+ IY AH JH s n/a 19 2604 2636 2725 N
+ IY AH K b n/a 19 2594 2647 2726 N
+ IY AH K e n/a 19 2599 2647 2726 N
+ IY AH K s n/a 19 2604 2647 2726 N
+ IY AH L b n/a 19 2594 2698 2778 N
+ IY AH L e n/a 19 2599 2713 2774 N
+ IY AH L s n/a 19 2604 2698 2778 N
+ IY AH M b n/a 19 2594 2674 2763 N
+ IY AH M e n/a 19 2599 2674 2763 N
+ IY AH M s n/a 19 2604 2674 2763 N
+ IY AH N b n/a 19 2594 2674 2762 N
+ IY AH N e n/a 19 2599 2674 2762 N
+ IY AH N i n/a 19 2604 2664 2765 N
+ IY AH N s n/a 19 2604 2674 2762 N
+ IY AH NG b n/a 19 2594 2674 2762 N
+ IY AH NG e n/a 19 2599 2674 2762 N
+ IY AH NG s n/a 19 2604 2674 2762 N
+ IY AH OW b n/a 19 2594 2698 2780 N
+ IY AH OW e n/a 19 2599 2698 2782 N
+ IY AH OW s n/a 19 2604 2698 2780 N
+ IY AH OY e n/a 19 2599 2654 2757 N
+ IY AH OY s n/a 19 2604 2654 2748 N
+ IY AH P b n/a 19 2594 2640 2715 N
+ IY AH P e n/a 19 2599 2640 2716 N
+ IY AH P s n/a 19 2604 2640 2715 N
+ IY AH R b n/a 19 2594 2698 2761 N
+ IY AH R e n/a 19 2599 2713 2776 N
+ IY AH R s n/a 19 2604 2698 2761 N
+ IY AH S b n/a 19 2594 2632 2736 N
+ IY AH S e n/a 19 2599 2639 2736 N
+ IY AH S s n/a 19 2604 2632 2736 N
+ IY AH SH b n/a 19 2594 2634 2739 N
+ IY AH SH e n/a 19 2599 2639 2739 N
+ IY AH SH s n/a 19 2604 2634 2739 N
+ IY AH SIL e n/a 19 2599 2648 2744 N
+ IY AH SIL s n/a 19 2604 2648 2745 N
+ IY AH T b n/a 19 2594 2632 2723 N
+ IY AH T e n/a 19 2599 2643 2724 N
+ IY AH T s n/a 19 2604 2632 2723 N
+ IY AH TH b n/a 19 2594 2632 2741 N
+ IY AH TH e n/a 19 2599 2639 2741 N
+ IY AH TH s n/a 19 2604 2632 2741 N
+ IY AH UH e n/a 19 2599 2698 2783 N
+ IY AH UH s n/a 19 2604 2698 2783 N
+ IY AH UW b n/a 19 2594 2698 2780 N
+ IY AH UW e n/a 19 2599 2698 2782 N
+ IY AH UW s n/a 19 2604 2698 2780 N
+ IY AH V b n/a 19 2594 2629 2731 N
+ IY AH V e n/a 19 2599 2652 2720 N
+ IY AH V s n/a 19 2604 2652 2731 N
+ IY AH W b n/a 19 2594 2713 2776 N
+ IY AH W e n/a 19 2599 2713 2776 N
+ IY AH W s n/a 19 2604 2713 2776 N
+ IY AH Y e n/a 19 2599 2643 2771 N
+ IY AH Y s n/a 19 2604 2636 2771 N
+ IY AH Z b n/a 19 2594 2629 2734 N
+ IY AH Z e n/a 19 2599 2653 2733 N
+ IY AH Z i n/a 19 2604 2651 2733 N
+ IY AH Z s n/a 19 2604 2651 2733 N
+ IY AH ZH b n/a 19 2594 2629 2734 N
+ IY AH ZH e n/a 19 2599 2652 2733 N
+ IY AH ZH s n/a 19 2604 2651 2733 N
+ IY AO AA b n/a 19 2617 2706 2781 N
+ IY AO AA e n/a 19 2614 2706 2781 N
+ IY AO AA s n/a 19 2614 2706 2781 N
+ IY AO AE e n/a 19 2614 2707 2748 N
+ IY AO AE s n/a 19 2614 2707 2748 N
+ IY AO AH b n/a 19 2617 2706 2759 N
+ IY AO AH e n/a 19 2614 2706 2756 N
+ IY AO AH i n/a 19 2614 2706 2759 N
+ IY AO AH s n/a 19 2614 2706 2759 N
+ IY AO AO b n/a 19 2617 2706 2780 N
+ IY AO AO e n/a 19 2614 2706 2782 N
+ IY AO AO s n/a 19 2614 2706 2780 N
+ IY AO AW e n/a 19 2614 2707 2781 N
+ IY AO AW s n/a 19 2614 2707 2781 N
+ IY AO AY e n/a 19 2614 2706 2757 N
+ IY AO AY s n/a 19 2614 2706 2748 N
+ IY AO B b n/a 19 2617 2677 2718 N
+ IY AO B e n/a 19 2613 2687 2718 N
+ IY AO B s n/a 19 2610 2677 2718 N
+ IY AO CH b n/a 19 2617 2696 2724 N
+ IY AO CH e n/a 19 2613 2687 2724 N
+ IY AO CH s n/a 19 2609 2696 2724 N
+ IY AO D b n/a 19 2617 2677 2721 N
+ IY AO D e n/a 19 2613 2687 2725 N
+ IY AO D s n/a 19 2613 2677 2721 N
+ IY AO DH b n/a 19 2617 2677 2731 N
+ IY AO DH e n/a 19 2613 2682 2719 N
+ IY AO DH s n/a 19 2613 2677 2732 N
+ IY AO EH b n/a 19 2617 2707 2750 N
+ IY AO EH e n/a 19 2614 2707 2750 N
+ IY AO EH s n/a 19 2614 2707 2750 N
+ IY AO ER b n/a 19 2617 2706 2761 N
+ IY AO ER e n/a 19 2614 2706 2783 N
+ IY AO ER i n/a 19 2614 2706 2761 N
+ IY AO ER s n/a 19 2614 2706 2761 N
+ IY AO EY b n/a 19 2617 2707 2749 N
+ IY AO EY e n/a 19 2614 2707 2749 N
+ IY AO EY s n/a 19 2614 2707 2749 N
+ IY AO F b n/a 19 2617 2696 2740 N
+ IY AO F e n/a 19 2613 2685 2740 N
+ IY AO F s n/a 19 2609 2696 2740 N
+ IY AO G b n/a 19 2617 2677 2726 N
+ IY AO G e n/a 19 2612 2688 2727 N
+ IY AO G s n/a 19 2610 2677 2726 N
+ IY AO HH e n/a 19 2613 2686 2729 N
+ IY AO HH s n/a 19 2609 2696 2729 N
+ IY AO IH e n/a 19 2614 2707 2769 N
+ IY AO IH s n/a 19 2614 2707 2769 N
+ IY AO IY b n/a 19 2617 2707 2770 N
+ IY AO IY e n/a 19 2614 2707 2770 N
+ IY AO IY s n/a 19 2614 2707 2770 N
+ IY AO JH b n/a 19 2617 2677 2725 N
+ IY AO JH e n/a 19 2613 2687 2725 N
+ IY AO JH s n/a 19 2609 2677 2725 N
+ IY AO K b n/a 19 2617 2696 2726 N
+ IY AO K e n/a 19 2612 2688 2726 N
+ IY AO K i n/a 19 2610 2696 2726 N
+ IY AO K s n/a 19 2610 2696 2726 N
+ IY AO L b n/a 19 2617 2710 2778 N
+ IY AO L e n/a 19 2613 2710 2774 N
+ IY AO L i n/a 19 2610 2710 2779 N
+ IY AO L s n/a 19 2610 2710 2778 N
+ IY AO M b n/a 19 2617 2681 2763 N
+ IY AO M e n/a 19 2613 2686 2763 N
+ IY AO M s n/a 19 2613 2681 2763 N
+ IY AO N b n/a 19 2617 2681 2762 N
+ IY AO N e n/a 19 2613 2686 2762 N
+ IY AO N i n/a 19 2613 2681 2765 N
+ IY AO N s n/a 19 2613 2681 2762 N
+ IY AO NG b n/a 19 2617 2681 2762 N
+ IY AO NG e n/a 19 2613 2686 2762 N
+ IY AO NG s n/a 19 2613 2681 2762 N
+ IY AO OW b n/a 19 2617 2706 2780 N
+ IY AO OW e n/a 19 2614 2706 2782 N
+ IY AO OW s n/a 19 2614 2706 2780 N
+ IY AO OY e n/a 19 2614 2706 2757 N
+ IY AO OY s n/a 19 2614 2706 2748 N
+ IY AO P b n/a 19 2617 2696 2715 N
+ IY AO P e n/a 19 2613 2687 2716 N
+ IY AO P s n/a 19 2610 2696 2715 N
+ IY AO R b n/a 19 2617 2710 2761 N
+ IY AO R e n/a 19 2613 2710 2775 N
+ IY AO R s n/a 19 2610 2710 2761 N
+ IY AO S b n/a 19 2617 2696 2736 N
+ IY AO S e n/a 19 2613 2685 2737 N
+ IY AO S s n/a 19 2609 2696 2736 N
+ IY AO SH b n/a 19 2617 2696 2739 N
+ IY AO SH e n/a 19 2613 2685 2739 N
+ IY AO SH s n/a 19 2609 2696 2739 N
+ IY AO SIL e n/a 19 2615 2684 2747 N
+ IY AO SIL s n/a 19 2615 2677 2747 N
+ IY AO T b n/a 19 2617 2696 2724 N
+ IY AO T e n/a 19 2613 2687 2724 N
+ IY AO T s n/a 19 2609 2696 2724 N
+ IY AO TH b n/a 19 2617 2696 2741 N
+ IY AO TH e n/a 19 2613 2685 2741 N
+ IY AO TH s n/a 19 2609 2696 2741 N
+ IY AO UH e n/a 19 2614 2707 2783 N
+ IY AO UH s n/a 19 2614 2707 2783 N
+ IY AO UW b n/a 19 2617 2707 2780 N
+ IY AO UW e n/a 19 2614 2707 2782 N
+ IY AO UW s n/a 19 2614 2707 2780 N
+ IY AO V b n/a 19 2617 2677 2731 N
+ IY AO V e n/a 19 2613 2682 2720 N
+ IY AO V s n/a 19 2609 2677 2732 N
+ IY AO W b n/a 19 2617 2712 2775 N
+ IY AO W e n/a 19 2613 2710 2775 N
+ IY AO W s n/a 19 2610 2712 2775 N
+ IY AO Y e n/a 19 2614 2707 2771 N
+ IY AO Y s n/a 19 2614 2707 2771 N
+ IY AO Z b n/a 19 2617 2677 2734 N
+ IY AO Z e n/a 19 2613 2682 2733 N
+ IY AO Z s n/a 19 2613 2677 2733 N
+ IY AO ZH b n/a 19 2617 2677 2734 N
+ IY AO ZH e n/a 19 2613 2682 2733 N
+ IY AO ZH s n/a 19 2609 2677 2733 N
+ IY AW AA b n/a 19 2617 2706 2781 N
+ IY AW AA e n/a 19 2614 2706 2781 N
+ IY AW AA s n/a 19 2614 2706 2781 N
+ IY AW AE e n/a 19 2614 2707 2748 N
+ IY AW AE i n/a 19 2614 2707 2752 N
+ IY AW AE s n/a 19 2614 2707 2748 N
+ IY AW AH b n/a 19 2617 2706 2759 N
+ IY AW AH e n/a 19 2614 2706 2756 N
+ IY AW AH s n/a 19 2614 2706 2759 N
+ IY AW AO b n/a 19 2617 2706 2780 N
+ IY AW AO e n/a 19 2614 2706 2782 N
+ IY AW AO s n/a 19 2614 2706 2780 N
+ IY AW AW e n/a 19 2614 2707 2781 N
+ IY AW AW s n/a 19 2614 2707 2781 N
+ IY AW AY e n/a 19 2614 2706 2757 N
+ IY AW AY s n/a 19 2614 2706 2748 N
+ IY AW B b n/a 19 2617 2677 2718 N
+ IY AW B e n/a 19 2613 2687 2718 N
+ IY AW B s n/a 19 2610 2677 2718 N
+ IY AW CH b n/a 19 2617 2696 2724 N
+ IY AW CH e n/a 19 2613 2687 2724 N
+ IY AW CH s n/a 19 2609 2696 2724 N
+ IY AW D b n/a 19 2617 2677 2721 N
+ IY AW D e n/a 19 2613 2687 2725 N
+ IY AW D i n/a 19 2613 2677 2721 N
+ IY AW D s n/a 19 2613 2677 2721 N
+ IY AW DH b n/a 19 2617 2677 2731 N
+ IY AW DH e n/a 19 2613 2682 2720 N
+ IY AW DH s n/a 19 2613 2677 2731 N
+ IY AW EH b n/a 19 2617 2707 2750 N
+ IY AW EH e n/a 19 2614 2707 2750 N
+ IY AW EH s n/a 19 2614 2707 2750 N
+ IY AW ER b n/a 19 2617 2706 2761 N
+ IY AW ER e n/a 19 2614 2706 2781 N
+ IY AW ER s n/a 19 2614 2706 2761 N
+ IY AW EY b n/a 19 2617 2707 2749 N
+ IY AW EY e n/a 19 2614 2707 2749 N
+ IY AW EY s n/a 19 2614 2707 2749 N
+ IY AW F b n/a 19 2617 2696 2740 N
+ IY AW F e n/a 19 2613 2685 2740 N
+ IY AW F s n/a 19 2609 2696 2740 N
+ IY AW G b n/a 19 2617 2677 2726 N
+ IY AW G e n/a 19 2612 2688 2727 N
+ IY AW G s n/a 19 2610 2677 2726 N
+ IY AW HH e n/a 19 2613 2686 2729 N
+ IY AW HH s n/a 19 2609 2696 2729 N
+ IY AW IH e n/a 19 2614 2707 2769 N
+ IY AW IH i n/a 19 2614 2707 2772 N
+ IY AW IH s n/a 19 2614 2707 2769 N
+ IY AW IY b n/a 19 2617 2707 2770 N
+ IY AW IY e n/a 19 2614 2707 2770 N
+ IY AW IY s n/a 19 2614 2707 2770 N
+ IY AW JH b n/a 19 2617 2677 2725 N
+ IY AW JH e n/a 19 2613 2687 2725 N
+ IY AW JH s n/a 19 2609 2677 2725 N
+ IY AW K b n/a 19 2617 2696 2726 N
+ IY AW K e n/a 19 2612 2688 2726 N
+ IY AW K i n/a 19 2610 2696 2726 N
+ IY AW K s n/a 19 2610 2696 2726 N
+ IY AW L b n/a 19 2617 2713 2778 N
+ IY AW L e n/a 19 2613 2713 2774 N
+ IY AW L s n/a 19 2610 2713 2778 N
+ IY AW M b n/a 19 2617 2681 2763 N
+ IY AW M e n/a 19 2613 2686 2763 N
+ IY AW M s n/a 19 2613 2681 2763 N
+ IY AW N b n/a 19 2617 2681 2762 N
+ IY AW N e n/a 19 2613 2686 2762 N
+ IY AW N s n/a 19 2613 2681 2762 N
+ IY AW NG b n/a 19 2617 2681 2762 N
+ IY AW NG e n/a 19 2613 2686 2762 N
+ IY AW NG s n/a 19 2613 2681 2762 N
+ IY AW OW b n/a 19 2617 2706 2780 N
+ IY AW OW e n/a 19 2614 2706 2782 N
+ IY AW OW s n/a 19 2614 2706 2780 N
+ IY AW OY e n/a 19 2614 2706 2757 N
+ IY AW OY s n/a 19 2614 2706 2748 N
+ IY AW P b n/a 19 2617 2696 2715 N
+ IY AW P e n/a 19 2613 2687 2716 N
+ IY AW P s n/a 19 2610 2696 2715 N
+ IY AW R b n/a 19 2617 2713 2761 N
+ IY AW R e n/a 19 2613 2713 2776 N
+ IY AW R s n/a 19 2610 2713 2761 N
+ IY AW S b n/a 19 2617 2696 2736 N
+ IY AW S e n/a 19 2613 2685 2736 N
+ IY AW S s n/a 19 2609 2696 2736 N
+ IY AW SH b n/a 19 2617 2696 2739 N
+ IY AW SH e n/a 19 2613 2685 2739 N
+ IY AW SH s n/a 19 2609 2696 2739 N
+ IY AW SIL e n/a 19 2615 2683 2747 N
+ IY AW SIL s n/a 19 2615 2677 2747 N
+ IY AW T b n/a 19 2617 2696 2724 N
+ IY AW T e n/a 19 2613 2687 2724 N
+ IY AW T i n/a 19 2609 2696 2724 N
+ IY AW T s n/a 19 2609 2696 2724 N
+ IY AW TH b n/a 19 2617 2696 2741 N
+ IY AW TH e n/a 19 2613 2685 2741 N
+ IY AW TH s n/a 19 2609 2696 2741 N
+ IY AW UH e n/a 19 2614 2707 2781 N
+ IY AW UH s n/a 19 2614 2707 2781 N
+ IY AW UW b n/a 19 2617 2707 2780 N
+ IY AW UW e n/a 19 2614 2707 2782 N
+ IY AW UW s n/a 19 2614 2707 2780 N
+ IY AW V b n/a 19 2617 2677 2731 N
+ IY AW V e n/a 19 2613 2682 2720 N
+ IY AW V s n/a 19 2609 2677 2731 N
+ IY AW W b n/a 19 2617 2713 2776 N
+ IY AW W e n/a 19 2613 2713 2776 N
+ IY AW W s n/a 19 2610 2713 2776 N
+ IY AW Y e n/a 19 2614 2707 2771 N
+ IY AW Y s n/a 19 2614 2707 2771 N
+ IY AW Z b n/a 19 2617 2677 2734 N
+ IY AW Z e n/a 19 2613 2682 2733 N
+ IY AW Z i n/a 19 2613 2677 2733 N
+ IY AW Z s n/a 19 2613 2677 2733 N
+ IY AW ZH b n/a 19 2617 2677 2734 N
+ IY AW ZH e n/a 19 2613 2682 2733 N
+ IY AW ZH s n/a 19 2609 2677 2733 N
+ IY AY AA b n/a 19 2594 2698 2781 N
+ IY AY AA e n/a 19 2599 2698 2781 N
+ IY AY AA s n/a 19 2604 2698 2781 N
+ IY AY AE e n/a 19 2599 2654 2748 N
+ IY AY AE s n/a 19 2604 2654 2748 N
+ IY AY AH b n/a 19 2594 2660 2759 N
+ IY AY AH e n/a 19 2599 2660 2756 N
+ IY AY AH s n/a 19 2604 2660 2759 N
+ IY AY AO b n/a 19 2594 2698 2780 N
+ IY AY AO e n/a 19 2599 2698 2782 N
+ IY AY AO s n/a 19 2604 2698 2780 N
+ IY AY AW e n/a 19 2599 2698 2781 N
+ IY AY AW s n/a 19 2604 2698 2781 N
+ IY AY AY e n/a 19 2599 2654 2757 N
+ IY AY AY s n/a 19 2604 2654 2748 N
+ IY AY B b n/a 19 2594 2640 2718 N
+ IY AY B e n/a 19 2599 2640 2718 N
+ IY AY B i n/a 19 2604 2640 2718 N
+ IY AY B s n/a 19 2604 2640 2718 N
+ IY AY CH b n/a 19 2594 2632 2723 N
+ IY AY CH e n/a 19 2599 2643 2724 N
+ IY AY CH i n/a 19 2604 2631 2723 N
+ IY AY CH s n/a 19 2604 2632 2723 N
+ IY AY D b n/a 19 2594 2636 2721 N
+ IY AY D e n/a 19 2599 2643 2725 N
+ IY AY D i n/a 19 2604 2636 2721 N
+ IY AY D s n/a 19 2604 2636 2721 N
+ IY AY DH b n/a 19 2594 2629 2731 N
+ IY AY DH e n/a 19 2599 2652 2719 N
+ IY AY DH s n/a 19 2604 2652 2731 N
+ IY AY EH b n/a 19 2594 2654 2750 N
+ IY AY EH e n/a 19 2599 2654 2750 N
+ IY AY EH s n/a 19 2604 2654 2750 N
+ IY AY ER b n/a 19 2594 2698 2761 N
+ IY AY ER e n/a 19 2599 2698 2783 N
+ IY AY ER s n/a 19 2604 2698 2761 N
+ IY AY EY b n/a 19 2594 2654 2749 N
+ IY AY EY e n/a 19 2599 2654 2749 N
+ IY AY EY s n/a 19 2604 2654 2749 N
+ IY AY F b n/a 19 2594 2634 2740 N
+ IY AY F e n/a 19 2599 2639 2740 N
+ IY AY F s n/a 19 2604 2634 2740 N
+ IY AY G b n/a 19 2594 2647 2726 N
+ IY AY G e n/a 19 2599 2647 2727 N
+ IY AY G s n/a 19 2604 2647 2726 N
+ IY AY HH e n/a 19 2599 2634 2729 N
+ IY AY HH s n/a 19 2604 2634 2729 N
+ IY AY IH e n/a 19 2599 2654 2769 N
+ IY AY IH s n/a 19 2604 2654 2769 N
+ IY AY IY b n/a 19 2594 2654 2770 N
+ IY AY IY e n/a 19 2599 2654 2770 N
+ IY AY IY s n/a 19 2604 2654 2770 N
+ IY AY JH b n/a 19 2594 2636 2725 N
+ IY AY JH e n/a 19 2599 2643 2725 N
+ IY AY JH s n/a 19 2604 2636 2725 N
+ IY AY K b n/a 19 2594 2647 2726 N
+ IY AY K e n/a 19 2599 2647 2726 N
+ IY AY K i n/a 19 2604 2647 2726 N
+ IY AY K s n/a 19 2604 2647 2726 N
+ IY AY L b n/a 19 2594 2698 2778 N
+ IY AY L e n/a 19 2599 2710 2774 N
+ IY AY L s n/a 19 2604 2698 2778 N
+ IY AY M b n/a 19 2594 2674 2763 N
+ IY AY M e n/a 19 2599 2674 2763 N
+ IY AY M i n/a 19 2604 2664 2766 N
+ IY AY M s n/a 19 2604 2674 2763 N
+ IY AY N b n/a 19 2594 2674 2762 N
+ IY AY N e n/a 19 2599 2674 2762 N
+ IY AY N i n/a 19 2604 2664 2765 N
+ IY AY N s n/a 19 2604 2674 2762 N
+ IY AY NG b n/a 19 2594 2674 2762 N
+ IY AY NG e n/a 19 2599 2674 2762 N
+ IY AY NG s n/a 19 2604 2674 2762 N
+ IY AY OW b n/a 19 2594 2698 2780 N
+ IY AY OW e n/a 19 2599 2698 2782 N
+ IY AY OW s n/a 19 2604 2698 2780 N
+ IY AY OY e n/a 19 2599 2654 2757 N
+ IY AY OY s n/a 19 2604 2654 2748 N
+ IY AY P b n/a 19 2594 2640 2715 N
+ IY AY P e n/a 19 2599 2640 2716 N
+ IY AY P s n/a 19 2604 2640 2715 N
+ IY AY R b n/a 19 2594 2698 2761 N
+ IY AY R e n/a 19 2599 2710 2775 N
+ IY AY R s n/a 19 2604 2698 2761 N
+ IY AY S b n/a 19 2594 2632 2736 N
+ IY AY S e n/a 19 2599 2639 2737 N
+ IY AY S i n/a 19 2604 2631 2736 N
+ IY AY S s n/a 19 2604 2632 2736 N
+ IY AY SH b n/a 19 2594 2634 2739 N
+ IY AY SH e n/a 19 2599 2639 2739 N
+ IY AY SH s n/a 19 2604 2634 2739 N
+ IY AY SIL e n/a 19 2599 2648 2744 N
+ IY AY SIL s n/a 19 2604 2648 2745 N
+ IY AY T b n/a 19 2594 2632 2723 N
+ IY AY T e n/a 19 2599 2643 2724 N
+ IY AY T i n/a 19 2604 2631 2723 N
+ IY AY T s n/a 19 2604 2632 2723 N
+ IY AY TH b n/a 19 2594 2632 2741 N
+ IY AY TH e n/a 19 2599 2639 2741 N
+ IY AY TH s n/a 19 2604 2632 2741 N
+ IY AY UH e n/a 19 2599 2698 2783 N
+ IY AY UH s n/a 19 2604 2698 2783 N
+ IY AY UW b n/a 19 2594 2698 2780 N
+ IY AY UW e n/a 19 2599 2698 2782 N
+ IY AY UW s n/a 19 2604 2698 2780 N
+ IY AY V b n/a 19 2594 2629 2731 N
+ IY AY V e n/a 19 2599 2652 2720 N
+ IY AY V i n/a 19 2604 2652 2731 N
+ IY AY V s n/a 19 2604 2652 2731 N
+ IY AY W b n/a 19 2594 2711 2775 N
+ IY AY W e n/a 19 2599 2710 2775 N
+ IY AY W s n/a 19 2604 2711 2775 N
+ IY AY Y e n/a 19 2599 2643 2771 N
+ IY AY Y s n/a 19 2604 2636 2771 N
+ IY AY Z b n/a 19 2594 2629 2734 N
+ IY AY Z e n/a 19 2599 2653 2733 N
+ IY AY Z i n/a 19 2604 2651 2733 N
+ IY AY Z s n/a 19 2604 2651 2733 N
+ IY AY ZH b n/a 19 2594 2629 2734 N
+ IY AY ZH e n/a 19 2599 2652 2733 N
+ IY AY ZH s n/a 19 2604 2651 2733 N
+ IY B AA b n/a 19 2608 2698 2781 N
+ IY B AA e n/a 19 2608 2698 2781 N
+ IY B AA i n/a 19 2608 2698 2781 N
+ IY B AA s n/a 19 2608 2698 2781 N
+ IY B AE e n/a 19 2608 2654 2748 N
+ IY B AE i n/a 19 2608 2658 2752 N
+ IY B AE s n/a 19 2608 2654 2748 N
+ IY B AH b n/a 19 2608 2660 2759 N
+ IY B AH e n/a 19 2608 2660 2754 N
+ IY B AH i n/a 19 2608 2659 2759 N
+ IY B AH s n/a 19 2608 2660 2759 N
+ IY B AO b n/a 19 2608 2698 2780 N
+ IY B AO e n/a 19 2608 2698 2782 N
+ IY B AO i n/a 19 2608 2698 2780 N
+ IY B AO s n/a 19 2608 2698 2780 N
+ IY B AW e n/a 19 2608 2698 2781 N
+ IY B AW s n/a 19 2608 2698 2781 N
+ IY B AY e n/a 19 2608 2654 2757 N
+ IY B AY i n/a 19 2608 2658 2752 N
+ IY B AY s n/a 19 2608 2654 2748 N
+ IY B B b n/a 19 2608 2640 2718 N
+ IY B B e n/a 19 2608 2640 2718 N
+ IY B B i n/a 19 2608 2640 2718 N
+ IY B B s n/a 19 2608 2640 2718 N
+ IY B CH b n/a 19 2608 2632 2723 N
+ IY B CH e n/a 19 2608 2643 2724 N
+ IY B CH i n/a 19 2608 2631 2723 N
+ IY B CH s n/a 19 2608 2632 2723 N
+ IY B D b n/a 19 2608 2636 2722 N
+ IY B D e n/a 19 2608 2643 2725 N
+ IY B D i n/a 19 2608 2636 2722 N
+ IY B D s n/a 19 2608 2636 2722 N
+ IY B DH b n/a 19 2608 2629 2731 N
+ IY B DH e n/a 19 2608 2652 2720 N
+ IY B DH s n/a 19 2608 2652 2731 N
+ IY B EH b n/a 19 2608 2654 2750 N
+ IY B EH e n/a 19 2608 2654 2750 N
+ IY B EH i n/a 19 2608 2658 2752 N
+ IY B EH s n/a 19 2608 2654 2750 N
+ IY B ER b n/a 19 2608 2698 2761 N
+ IY B ER e n/a 19 2608 2698 2783 N
+ IY B ER i n/a 19 2608 2697 2761 N
+ IY B ER s n/a 19 2608 2698 2761 N
+ IY B EY b n/a 19 2608 2654 2750 N
+ IY B EY e n/a 19 2608 2654 2750 N
+ IY B EY i n/a 19 2608 2658 2753 N
+ IY B EY s n/a 19 2608 2654 2750 N
+ IY B F b n/a 19 2608 2634 2740 N
+ IY B F e n/a 19 2608 2639 2740 N
+ IY B F i n/a 19 2608 2633 2740 N
+ IY B F s n/a 19 2608 2634 2740 N
+ IY B G b n/a 19 2607 2647 2726 N
+ IY B G e n/a 19 2607 2644 2727 N
+ IY B G i n/a 19 2607 2645 2726 N
+ IY B G s n/a 19 2607 2644 2726 N
+ IY B HH e n/a 19 2608 2634 2729 N
+ IY B HH i n/a 19 2608 2633 2729 N
+ IY B HH s n/a 19 2608 2634 2729 N
+ IY B IH e n/a 19 2608 2654 2768 N
+ IY B IH i n/a 19 2607 2657 2773 N
+ IY B IH s n/a 19 2608 2654 2768 N
+ IY B IY b n/a 19 2608 2654 2770 N
+ IY B IY e n/a 19 2608 2654 2770 N
+ IY B IY s n/a 19 2608 2654 2770 N
+ IY B JH b n/a 19 2608 2636 2725 N
+ IY B JH e n/a 19 2608 2643 2725 N
+ IY B JH i n/a 19 2608 2636 2725 N
+ IY B JH s n/a 19 2608 2636 2725 N
+ IY B K b n/a 19 2607 2647 2726 N
+ IY B K e n/a 19 2607 2644 2726 N
+ IY B K i n/a 19 2607 2645 2726 N
+ IY B K s n/a 19 2607 2644 2726 N
+ IY B L b n/a 19 2608 2698 2778 N
+ IY B L e n/a 19 2608 2713 2774 N
+ IY B L i n/a 19 2608 2699 2779 N
+ IY B L s n/a 19 2608 2698 2778 N
+ IY B M b n/a 19 2608 2674 2763 N
+ IY B M e n/a 19 2608 2674 2763 N
+ IY B M i n/a 19 2608 2664 2766 N
+ IY B M s n/a 19 2608 2674 2763 N
+ IY B N b n/a 19 2608 2674 2762 N
+ IY B N e n/a 19 2608 2674 2762 N
+ IY B N i n/a 19 2608 2664 2765 N
+ IY B N s n/a 19 2608 2674 2762 N
+ IY B NG b n/a 19 2607 2674 2762 N
+ IY B NG e n/a 19 2607 2674 2762 N
+ IY B NG i n/a 19 2607 2664 2765 N
+ IY B NG s n/a 19 2607 2674 2762 N
+ IY B OW b n/a 19 2608 2698 2780 N
+ IY B OW e n/a 19 2608 2698 2782 N
+ IY B OW i n/a 19 2608 2698 2780 N
+ IY B OW s n/a 19 2608 2698 2780 N
+ IY B OY e n/a 19 2608 2654 2757 N
+ IY B OY s n/a 19 2608 2654 2748 N
+ IY B P b n/a 19 2608 2640 2716 N
+ IY B P e n/a 19 2608 2640 2716 N
+ IY B P i n/a 19 2608 2640 2716 N
+ IY B P s n/a 19 2608 2640 2716 N
+ IY B R b n/a 19 2608 2698 2761 N
+ IY B R e n/a 19 2608 2713 2776 N
+ IY B R i n/a 19 2608 2697 2761 N
+ IY B R s n/a 19 2608 2698 2761 N
+ IY B S b n/a 19 2608 2632 2736 N
+ IY B S e n/a 19 2608 2639 2736 N
+ IY B S i n/a 19 2608 2631 2736 N
+ IY B S s n/a 19 2608 2632 2736 N
+ IY B SH b n/a 19 2608 2634 2739 N
+ IY B SH e n/a 19 2608 2639 2739 N
+ IY B SH i n/a 19 2608 2633 2739 N
+ IY B SH s n/a 19 2608 2634 2739 N
+ IY B SIL e n/a 19 2608 2649 2745 N
+ IY B SIL s n/a 19 2608 2649 2745 N
+ IY B T b n/a 19 2608 2632 2723 N
+ IY B T e n/a 19 2608 2643 2724 N
+ IY B T i n/a 19 2608 2631 2723 N
+ IY B T s n/a 19 2608 2632 2723 N
+ IY B TH b n/a 19 2608 2632 2741 N
+ IY B TH e n/a 19 2608 2639 2741 N
+ IY B TH i n/a 19 2608 2631 2741 N
+ IY B TH s n/a 19 2608 2632 2741 N
+ IY B UH e n/a 19 2608 2698 2783 N
+ IY B UH s n/a 19 2608 2698 2783 N
+ IY B UW b n/a 19 2608 2698 2780 N
+ IY B UW e n/a 19 2608 2698 2782 N
+ IY B UW s n/a 19 2608 2698 2780 N
+ IY B V b n/a 19 2608 2629 2731 N
+ IY B V e n/a 19 2608 2652 2720 N
+ IY B V i n/a 19 2608 2652 2731 N
+ IY B V s n/a 19 2608 2652 2731 N
+ IY B W b n/a 19 2608 2713 2776 N
+ IY B W e n/a 19 2608 2713 2776 N
+ IY B W i n/a 19 2608 2713 2776 N
+ IY B W s n/a 19 2608 2713 2776 N
+ IY B Y e n/a 19 2608 2643 2771 N
+ IY B Y i n/a 19 2608 2636 2771 N
+ IY B Y s n/a 19 2608 2636 2771 N
+ IY B Z b n/a 19 2608 2629 2734 N
+ IY B Z e n/a 19 2608 2653 2733 N
+ IY B Z i n/a 19 2608 2651 2733 N
+ IY B Z s n/a 19 2608 2651 2733 N
+ IY B ZH b n/a 19 2608 2629 2734 N
+ IY B ZH e n/a 19 2608 2652 2733 N
+ IY B ZH i n/a 19 2608 2651 2733 N
+ IY B ZH s n/a 19 2608 2651 2733 N
+ IY CH AA b n/a 19 2594 2698 2781 N
+ IY CH AA e n/a 19 2588 2698 2781 N
+ IY CH AA i n/a 19 2588 2699 2781 N
+ IY CH AA s n/a 19 2588 2698 2781 N
+ IY CH AE e n/a 19 2588 2654 2748 N
+ IY CH AE i n/a 19 2588 2659 2752 N
+ IY CH AE s n/a 19 2588 2654 2748 N
+ IY CH AH b n/a 19 2594 2660 2759 N
+ IY CH AH e n/a 19 2588 2660 2756 N
+ IY CH AH i n/a 19 2588 2658 2759 N
+ IY CH AH s n/a 19 2588 2660 2759 N
+ IY CH AO b n/a 19 2594 2698 2780 N
+ IY CH AO e n/a 19 2588 2698 2782 N
+ IY CH AO i n/a 19 2588 2699 2780 N
+ IY CH AO s n/a 19 2588 2698 2780 N
+ IY CH AW e n/a 19 2588 2698 2781 N
+ IY CH AW s n/a 19 2588 2698 2781 N
+ IY CH AY e n/a 19 2588 2654 2757 N
+ IY CH AY s n/a 19 2588 2654 2748 N
+ IY CH B b n/a 19 2594 2637 2718 N
+ IY CH B e n/a 19 2588 2637 2718 N
+ IY CH B i n/a 19 2588 2637 2718 N
+ IY CH B s n/a 19 2588 2637 2718 N
+ IY CH CH b n/a 19 2594 2632 2723 N
+ IY CH CH e n/a 19 2588 2643 2724 N
+ IY CH CH i n/a 19 2588 2631 2723 N
+ IY CH CH s n/a 19 2588 2632 2723 N
+ IY CH D b n/a 19 2594 2636 2722 N
+ IY CH D e n/a 19 2588 2643 2725 N
+ IY CH D i n/a 19 2588 2636 2722 N
+ IY CH D s n/a 19 2588 2636 2722 N
+ IY CH DH b n/a 19 2594 2629 2731 N
+ IY CH DH e n/a 19 2588 2652 2720 N
+ IY CH DH s n/a 19 2588 2652 2731 N
+ IY CH EH b n/a 19 2594 2654 2750 N
+ IY CH EH e n/a 19 2588 2654 2750 N
+ IY CH EH i n/a 19 2588 2658 2752 N
+ IY CH EH s n/a 19 2588 2654 2750 N
+ IY CH ER b n/a 19 2594 2698 2761 N
+ IY CH ER e n/a 19 2588 2698 2783 N
+ IY CH ER i n/a 19 2588 2697 2761 N
+ IY CH ER s n/a 19 2588 2698 2761 N
+ IY CH EY b n/a 19 2594 2654 2750 N
+ IY CH EY e n/a 19 2588 2654 2750 N
+ IY CH EY i n/a 19 2588 2659 2753 N
+ IY CH EY s n/a 19 2588 2654 2750 N
+ IY CH F b n/a 19 2594 2634 2740 N
+ IY CH F e n/a 19 2588 2638 2740 N
+ IY CH F i n/a 19 2588 2634 2740 N
+ IY CH F s n/a 19 2588 2634 2740 N
+ IY CH G b n/a 19 2594 2647 2726 N
+ IY CH G e n/a 19 2588 2644 2727 N
+ IY CH G i n/a 19 2588 2644 2726 N
+ IY CH G s n/a 19 2588 2644 2726 N
+ IY CH HH e n/a 19 2588 2634 2729 N
+ IY CH HH i n/a 19 2588 2633 2729 N
+ IY CH HH s n/a 19 2588 2634 2729 N
+ IY CH IH e n/a 19 2588 2654 2769 N
+ IY CH IH i n/a 19 2588 2656 2772 N
+ IY CH IH s n/a 19 2588 2654 2769 N
+ IY CH IY b n/a 19 2594 2654 2770 N
+ IY CH IY e n/a 19 2588 2654 2770 N
+ IY CH IY s n/a 19 2588 2654 2770 N
+ IY CH JH b n/a 19 2594 2636 2725 N
+ IY CH JH e n/a 19 2588 2643 2725 N
+ IY CH JH i n/a 19 2588 2636 2725 N
+ IY CH JH s n/a 19 2588 2636 2725 N
+ IY CH K b n/a 19 2594 2647 2726 N
+ IY CH K e n/a 19 2588 2644 2726 N
+ IY CH K i n/a 19 2588 2644 2726 N
+ IY CH K s n/a 19 2588 2644 2726 N
+ IY CH L b n/a 19 2594 2698 2778 N
+ IY CH L e n/a 19 2589 2708 2774 N
+ IY CH L i n/a 19 2589 2699 2779 N
+ IY CH L s n/a 19 2589 2698 2778 N
+ IY CH M b n/a 19 2594 2674 2763 N
+ IY CH M e n/a 19 2588 2674 2763 N
+ IY CH M i n/a 19 2585 2664 2766 N
+ IY CH M s n/a 19 2585 2674 2763 N
+ IY CH N b n/a 19 2594 2674 2762 N
+ IY CH N e n/a 19 2588 2674 2762 N
+ IY CH N i n/a 19 2585 2664 2765 N
+ IY CH N s n/a 19 2585 2674 2762 N
+ IY CH NG b n/a 19 2594 2674 2762 N
+ IY CH NG e n/a 19 2588 2674 2762 N
+ IY CH NG i n/a 19 2585 2664 2765 N
+ IY CH NG s n/a 19 2585 2674 2762 N
+ IY CH OW b n/a 19 2594 2698 2780 N
+ IY CH OW e n/a 19 2588 2698 2782 N
+ IY CH OW i n/a 19 2588 2699 2780 N
+ IY CH OW s n/a 19 2588 2698 2780 N
+ IY CH OY e n/a 19 2588 2654 2757 N
+ IY CH OY s n/a 19 2588 2654 2748 N
+ IY CH P b n/a 19 2594 2637 2715 N
+ IY CH P e n/a 19 2588 2637 2716 N
+ IY CH P i n/a 19 2588 2637 2715 N
+ IY CH P s n/a 19 2588 2637 2715 N
+ IY CH R b n/a 19 2594 2698 2761 N
+ IY CH R e n/a 19 2589 2708 2776 N
+ IY CH R s n/a 19 2589 2698 2761 N
+ IY CH S b n/a 19 2594 2632 2736 N
+ IY CH S e n/a 19 2588 2638 2736 N
+ IY CH S i n/a 19 2588 2631 2736 N
+ IY CH S s n/a 19 2588 2632 2736 N
+ IY CH SH b n/a 19 2594 2634 2739 N
+ IY CH SH e n/a 19 2588 2638 2739 N
+ IY CH SH s n/a 19 2588 2634 2739 N
+ IY CH SIL e n/a 19 2588 2648 2744 N
+ IY CH SIL s n/a 19 2588 2648 2744 N
+ IY CH T b n/a 19 2594 2632 2723 N
+ IY CH T e n/a 19 2588 2643 2724 N
+ IY CH T i n/a 19 2588 2631 2723 N
+ IY CH T s n/a 19 2588 2632 2723 N
+ IY CH TH b n/a 19 2594 2632 2741 N
+ IY CH TH e n/a 19 2588 2638 2741 N
+ IY CH TH i n/a 19 2588 2631 2741 N
+ IY CH TH s n/a 19 2588 2632 2741 N
+ IY CH UH e n/a 19 2588 2698 2783 N
+ IY CH UH s n/a 19 2588 2698 2783 N
+ IY CH UW b n/a 19 2594 2698 2780 N
+ IY CH UW e n/a 19 2588 2698 2782 N
+ IY CH UW i n/a 19 2588 2699 2780 N
+ IY CH UW s n/a 19 2588 2698 2780 N
+ IY CH V b n/a 19 2594 2629 2731 N
+ IY CH V e n/a 19 2588 2652 2720 N
+ IY CH V i n/a 19 2588 2652 2731 N
+ IY CH V s n/a 19 2588 2652 2731 N
+ IY CH W b n/a 19 2594 2708 2776 N
+ IY CH W e n/a 19 2589 2708 2776 N
+ IY CH W i n/a 19 2589 2708 2776 N
+ IY CH W s n/a 19 2589 2708 2776 N
+ IY CH Y e n/a 19 2588 2643 2771 N
+ IY CH Y s n/a 19 2588 2636 2771 N
+ IY CH Z b n/a 19 2594 2629 2734 N
+ IY CH Z e n/a 19 2588 2653 2733 N
+ IY CH Z i n/a 19 2588 2651 2733 N
+ IY CH Z s n/a 19 2588 2651 2733 N
+ IY CH ZH b n/a 19 2594 2629 2734 N
+ IY CH ZH e n/a 19 2588 2652 2733 N
+ IY CH ZH s n/a 19 2588 2651 2733 N
+ IY D AA b n/a 19 2594 2698 2781 N
+ IY D AA e n/a 19 2599 2698 2781 N
+ IY D AA i n/a 19 2605 2699 2781 N
+ IY D AA s n/a 19 2605 2698 2781 N
+ IY D AE e n/a 19 2599 2654 2748 N
+ IY D AE i n/a 19 2605 2658 2752 N
+ IY D AE s n/a 19 2605 2654 2748 N
+ IY D AH b n/a 19 2594 2660 2759 N
+ IY D AH e n/a 19 2599 2660 2754 N
+ IY D AH i n/a 19 2605 2658 2759 N
+ IY D AH s n/a 19 2605 2660 2759 N
+ IY D AO b n/a 19 2594 2698 2780 N
+ IY D AO e n/a 19 2599 2698 2782 N
+ IY D AO i n/a 19 2605 2699 2780 N
+ IY D AO s n/a 19 2605 2698 2780 N
+ IY D AW e n/a 19 2599 2698 2781 N
+ IY D AW s n/a 19 2605 2698 2781 N
+ IY D AY e n/a 19 2599 2654 2757 N
+ IY D AY i n/a 19 2605 2658 2752 N
+ IY D AY s n/a 19 2605 2654 2748 N
+ IY D B b n/a 19 2594 2640 2718 N
+ IY D B e n/a 19 2599 2640 2718 N
+ IY D B i n/a 19 2606 2640 2718 N
+ IY D B s n/a 19 2606 2640 2718 N
+ IY D CH b n/a 19 2594 2632 2723 N
+ IY D CH e n/a 19 2599 2643 2724 N
+ IY D CH i n/a 19 2606 2631 2723 N
+ IY D CH s n/a 19 2606 2632 2723 N
+ IY D D b n/a 19 2594 2636 2722 N
+ IY D D e n/a 19 2599 2643 2725 N
+ IY D D i n/a 19 2606 2636 2722 N
+ IY D D s n/a 19 2606 2636 2722 N
+ IY D DH b n/a 19 2594 2629 2731 N
+ IY D DH e n/a 19 2599 2651 2719 N
+ IY D DH s n/a 19 2603 2651 2731 N
+ IY D EH b n/a 19 2594 2654 2750 N
+ IY D EH e n/a 19 2599 2654 2750 N
+ IY D EH i n/a 19 2605 2658 2752 N
+ IY D EH s n/a 19 2605 2654 2750 N
+ IY D ER b n/a 19 2594 2698 2761 N
+ IY D ER e n/a 19 2599 2698 2783 N
+ IY D ER i n/a 19 2605 2697 2761 N
+ IY D ER s n/a 19 2605 2698 2761 N
+ IY D EY b n/a 19 2594 2654 2750 N
+ IY D EY e n/a 19 2599 2654 2750 N
+ IY D EY i n/a 19 2605 2658 2753 N
+ IY D EY s n/a 19 2605 2654 2750 N
+ IY D F b n/a 19 2594 2634 2740 N
+ IY D F e n/a 19 2599 2639 2740 N
+ IY D F i n/a 19 2606 2633 2740 N
+ IY D F s n/a 19 2606 2634 2740 N
+ IY D G b n/a 19 2594 2647 2726 N
+ IY D G e n/a 19 2599 2644 2727 N
+ IY D G i n/a 19 2606 2645 2726 N
+ IY D G s n/a 19 2606 2644 2726 N
+ IY D HH e n/a 19 2599 2634 2729 N
+ IY D HH i n/a 19 2606 2633 2729 N
+ IY D HH s n/a 19 2606 2634 2729 N
+ IY D IH e n/a 19 2599 2654 2769 N
+ IY D IH i n/a 19 2605 2656 2772 N
+ IY D IH s n/a 19 2605 2654 2769 N
+ IY D IY b n/a 19 2594 2654 2770 N
+ IY D IY e n/a 19 2599 2654 2770 N
+ IY D IY i n/a 19 2605 2656 2770 N
+ IY D IY s n/a 19 2605 2654 2770 N
+ IY D JH b n/a 19 2594 2636 2725 N
+ IY D JH e n/a 19 2599 2643 2725 N
+ IY D JH i n/a 19 2606 2636 2725 N
+ IY D JH s n/a 19 2606 2636 2725 N
+ IY D K b n/a 19 2594 2647 2726 N
+ IY D K e n/a 19 2599 2644 2726 N
+ IY D K i n/a 19 2606 2645 2726 N
+ IY D K s n/a 19 2606 2644 2726 N
+ IY D L b n/a 19 2594 2698 2778 N
+ IY D L e n/a 19 2599 2713 2774 N
+ IY D L i n/a 19 2606 2699 2779 N
+ IY D L s n/a 19 2606 2698 2778 N
+ IY D M b n/a 19 2594 2674 2763 N
+ IY D M e n/a 19 2599 2674 2763 N
+ IY D M i n/a 19 2606 2664 2766 N
+ IY D M s n/a 19 2606 2674 2763 N
+ IY D N b n/a 19 2594 2674 2762 N
+ IY D N e n/a 19 2599 2674 2762 N
+ IY D N i n/a 19 2606 2664 2765 N
+ IY D N s n/a 19 2606 2674 2762 N
+ IY D NG b n/a 19 2594 2674 2762 N
+ IY D NG e n/a 19 2599 2674 2762 N
+ IY D NG s n/a 19 2606 2674 2762 N
+ IY D OW b n/a 19 2594 2698 2780 N
+ IY D OW e n/a 19 2599 2698 2782 N
+ IY D OW i n/a 19 2605 2699 2780 N
+ IY D OW s n/a 19 2605 2698 2780 N
+ IY D OY e n/a 19 2599 2654 2757 N
+ IY D OY s n/a 19 2605 2654 2748 N
+ IY D P b n/a 19 2594 2640 2715 N
+ IY D P e n/a 19 2599 2640 2715 N
+ IY D P i n/a 19 2606 2640 2715 N
+ IY D P s n/a 19 2606 2640 2715 N
+ IY D R b n/a 19 2594 2698 2761 N
+ IY D R e n/a 19 2599 2713 2776 N
+ IY D R i n/a 19 2606 2697 2761 N
+ IY D R s n/a 19 2606 2698 2761 N
+ IY D S b n/a 19 2594 2632 2736 N
+ IY D S e n/a 19 2599 2639 2736 N
+ IY D S i n/a 19 2606 2631 2736 N
+ IY D S s n/a 19 2606 2632 2736 N
+ IY D SH b n/a 19 2594 2634 2739 N
+ IY D SH e n/a 19 2599 2639 2739 N
+ IY D SH i n/a 19 2606 2633 2739 N
+ IY D SH s n/a 19 2606 2634 2739 N
+ IY D SIL e n/a 19 2599 2648 2744 N
+ IY D SIL s n/a 19 2606 2648 2744 N
+ IY D T b n/a 19 2594 2632 2723 N
+ IY D T e n/a 19 2599 2643 2724 N
+ IY D T i n/a 19 2606 2631 2723 N
+ IY D T s n/a 19 2606 2632 2723 N
+ IY D TH b n/a 19 2594 2632 2741 N
+ IY D TH e n/a 19 2599 2639 2741 N
+ IY D TH i n/a 19 2606 2631 2741 N
+ IY D TH s n/a 19 2606 2632 2741 N
+ IY D UH e n/a 19 2599 2698 2783 N
+ IY D UH s n/a 19 2605 2698 2783 N
+ IY D UW b n/a 19 2594 2698 2780 N
+ IY D UW e n/a 19 2599 2698 2782 N
+ IY D UW i n/a 19 2605 2699 2780 N
+ IY D UW s n/a 19 2605 2698 2780 N
+ IY D V b n/a 19 2594 2629 2731 N
+ IY D V e n/a 19 2599 2652 2720 N
+ IY D V i n/a 19 2603 2652 2731 N
+ IY D V s n/a 19 2603 2652 2731 N
+ IY D W b n/a 19 2594 2713 2776 N
+ IY D W e n/a 19 2599 2713 2776 N
+ IY D W i n/a 19 2606 2713 2776 N
+ IY D W s n/a 19 2606 2713 2776 N
+ IY D Y e n/a 19 2599 2643 2771 N
+ IY D Y i n/a 19 2606 2636 2771 N
+ IY D Y s n/a 19 2606 2636 2771 N
+ IY D Z b n/a 19 2594 2629 2734 N
+ IY D Z e n/a 19 2599 2651 2733 N
+ IY D Z i n/a 19 2603 2651 2733 N
+ IY D Z s n/a 19 2603 2651 2733 N
+ IY D ZH b n/a 19 2594 2629 2734 N
+ IY D ZH e n/a 19 2599 2652 2733 N
+ IY D ZH i n/a 19 2603 2652 2733 N
+ IY D ZH s n/a 19 2603 2652 2733 N
+ IY DH AA b n/a 19 2601 2700 2781 N
+ IY DH AA e n/a 19 2600 2700 2781 N
+ IY DH AA s n/a 19 2601 2700 2781 N
+ IY DH AE e n/a 19 2600 2661 2751 N
+ IY DH AE s n/a 19 2601 2661 2751 N
+ IY DH AH b n/a 19 2601 2662 2759 N
+ IY DH AH e n/a 19 2600 2662 2755 N
+ IY DH AH i n/a 19 2601 2662 2759 N
+ IY DH AH s n/a 19 2601 2662 2759 N
+ IY DH AO b n/a 19 2601 2700 2780 N
+ IY DH AO e n/a 19 2600 2700 2782 N
+ IY DH AO s n/a 19 2601 2700 2780 N
+ IY DH AW e n/a 19 2600 2700 2781 N
+ IY DH AW s n/a 19 2601 2700 2781 N
+ IY DH AY e n/a 19 2600 2662 2755 N
+ IY DH AY s n/a 19 2601 2662 2751 N
+ IY DH B b n/a 19 2601 2641 2718 N
+ IY DH B e n/a 19 2597 2641 2718 N
+ IY DH B s n/a 19 2601 2641 2718 N
+ IY DH CH b n/a 19 2601 2632 2723 N
+ IY DH CH e n/a 19 2597 2643 2724 N
+ IY DH CH s n/a 19 2601 2632 2723 N
+ IY DH D b n/a 19 2601 2636 2721 N
+ IY DH D e n/a 19 2597 2643 2725 N
+ IY DH D s n/a 19 2601 2636 2721 N
+ IY DH DH b n/a 19 2601 2629 2731 N
+ IY DH DH e n/a 19 2597 2652 2720 N
+ IY DH DH s n/a 19 2601 2652 2731 N
+ IY DH EH b n/a 19 2601 2661 2750 N
+ IY DH EH e n/a 19 2600 2661 2750 N
+ IY DH EH s n/a 19 2601 2661 2750 N
+ IY DH ER b n/a 19 2601 2700 2761 N
+ IY DH ER e n/a 19 2600 2700 2783 N
+ IY DH ER i n/a 19 2601 2700 2761 N
+ IY DH ER s n/a 19 2601 2700 2761 N
+ IY DH EY b n/a 19 2601 2661 2749 N
+ IY DH EY e n/a 19 2600 2661 2749 N
+ IY DH EY s n/a 19 2601 2661 2749 N
+ IY DH F b n/a 19 2601 2633 2741 N
+ IY DH F e n/a 19 2597 2641 2741 N
+ IY DH F s n/a 19 2601 2633 2741 N
+ IY DH G b n/a 19 2601 2646 2726 N
+ IY DH G e n/a 19 2598 2646 2728 N
+ IY DH G s n/a 19 2601 2646 2726 N
+ IY DH HH e n/a 19 2597 2633 2729 N
+ IY DH HH s n/a 19 2601 2633 2729 N
+ IY DH IH e n/a 19 2600 2656 2768 N
+ IY DH IH s n/a 19 2601 2656 2768 N
+ IY DH IY b n/a 19 2601 2656 2770 N
+ IY DH IY e n/a 19 2600 2656 2770 N
+ IY DH IY s n/a 19 2601 2656 2770 N
+ IY DH JH b n/a 19 2601 2636 2725 N
+ IY DH JH e n/a 19 2597 2643 2725 N
+ IY DH JH s n/a 19 2601 2636 2725 N
+ IY DH K b n/a 19 2601 2646 2728 N
+ IY DH K e n/a 19 2598 2646 2728 N
+ IY DH K s n/a 19 2601 2646 2728 N
+ IY DH L b n/a 19 2601 2700 2778 N
+ IY DH L e n/a 19 2597 2710 2774 N
+ IY DH L i n/a 19 2601 2700 2779 N
+ IY DH L s n/a 19 2601 2700 2778 N
+ IY DH M b n/a 19 2601 2674 2762 N
+ IY DH M e n/a 19 2597 2674 2762 N
+ IY DH M s n/a 19 2601 2674 2762 N
+ IY DH N b n/a 19 2601 2674 2762 N
+ IY DH N e n/a 19 2597 2674 2762 N
+ IY DH N i n/a 19 2601 2664 2765 N
+ IY DH N s n/a 19 2601 2674 2762 N
+ IY DH NG b n/a 19 2601 2674 2762 N
+ IY DH NG e n/a 19 2598 2674 2762 N
+ IY DH NG s n/a 19 2601 2674 2762 N
+ IY DH OW b n/a 19 2601 2700 2780 N
+ IY DH OW e n/a 19 2600 2700 2782 N
+ IY DH OW s n/a 19 2601 2700 2780 N
+ IY DH OY e n/a 19 2600 2662 2755 N
+ IY DH OY s n/a 19 2601 2662 2751 N
+ IY DH P b n/a 19 2601 2641 2715 N
+ IY DH P e n/a 19 2597 2641 2717 N
+ IY DH P s n/a 19 2601 2641 2715 N
+ IY DH R b n/a 19 2601 2700 2761 N
+ IY DH R e n/a 19 2597 2710 2775 N
+ IY DH R s n/a 19 2601 2700 2761 N
+ IY DH S b n/a 19 2601 2632 2736 N
+ IY DH S e n/a 19 2597 2641 2739 N
+ IY DH S s n/a 19 2601 2632 2736 N
+ IY DH SH b n/a 19 2601 2633 2739 N
+ IY DH SH e n/a 19 2597 2641 2739 N
+ IY DH SH s n/a 19 2601 2633 2739 N
+ IY DH SIL e n/a 19 2599 2650 2743 N
+ IY DH SIL s n/a 19 2601 2650 2743 N
+ IY DH T b n/a 19 2601 2632 2723 N
+ IY DH T e n/a 19 2597 2643 2724 N
+ IY DH T s n/a 19 2601 2632 2723 N
+ IY DH TH b n/a 19 2601 2632 2741 N
+ IY DH TH e n/a 19 2597 2641 2741 N
+ IY DH TH s n/a 19 2601 2632 2741 N
+ IY DH UH e n/a 19 2600 2700 2783 N
+ IY DH UH s n/a 19 2601 2700 2783 N
+ IY DH UW b n/a 19 2601 2700 2780 N
+ IY DH UW e n/a 19 2600 2700 2782 N
+ IY DH UW s n/a 19 2601 2700 2780 N
+ IY DH V b n/a 19 2601 2629 2731 N
+ IY DH V e n/a 19 2597 2652 2720 N
+ IY DH V s n/a 19 2601 2652 2731 N
+ IY DH W b n/a 19 2601 2711 2776 N
+ IY DH W e n/a 19 2597 2710 2776 N
+ IY DH W s n/a 19 2601 2711 2776 N
+ IY DH Y e n/a 19 2600 2642 2771 N
+ IY DH Y i n/a 19 2601 2636 2771 N
+ IY DH Y s n/a 19 2601 2636 2771 N
+ IY DH Z b n/a 19 2601 2629 2734 N
+ IY DH Z e n/a 19 2597 2653 2734 N
+ IY DH Z i n/a 19 2601 2653 2734 N
+ IY DH Z s n/a 19 2601 2653 2734 N
+ IY DH ZH b n/a 19 2601 2629 2734 N
+ IY DH ZH e n/a 19 2597 2652 2734 N
+ IY DH ZH s n/a 19 2601 2652 2734 N
+ IY EH AA b n/a 19 2594 2698 2781 N
+ IY EH AA e n/a 19 2599 2698 2781 N
+ IY EH AA s n/a 19 2604 2698 2781 N
+ IY EH AE e n/a 19 2599 2654 2748 N
+ IY EH AE s n/a 19 2604 2654 2748 N
+ IY EH AH b n/a 19 2594 2660 2759 N
+ IY EH AH e n/a 19 2599 2660 2756 N
+ IY EH AH i n/a 19 2604 2658 2759 N
+ IY EH AH s n/a 19 2604 2660 2759 N
+ IY EH AO b n/a 19 2594 2698 2780 N
+ IY EH AO e n/a 19 2599 2698 2782 N
+ IY EH AO s n/a 19 2604 2698 2780 N
+ IY EH AW e n/a 19 2599 2698 2781 N
+ IY EH AW s n/a 19 2604 2698 2781 N
+ IY EH AY e n/a 19 2599 2654 2757 N
+ IY EH AY s n/a 19 2604 2654 2748 N
+ IY EH B b n/a 19 2594 2640 2718 N
+ IY EH B e n/a 19 2599 2640 2718 N
+ IY EH B s n/a 19 2604 2640 2718 N
+ IY EH CH b n/a 19 2594 2632 2723 N
+ IY EH CH e n/a 19 2599 2643 2724 N
+ IY EH CH s n/a 19 2604 2632 2723 N
+ IY EH D b n/a 19 2594 2636 2721 N
+ IY EH D e n/a 19 2599 2643 2725 N
+ IY EH D s n/a 19 2604 2636 2721 N
+ IY EH DH b n/a 19 2594 2629 2731 N
+ IY EH DH e n/a 19 2599 2652 2720 N
+ IY EH DH s n/a 19 2604 2652 2731 N
+ IY EH EH b n/a 19 2594 2654 2750 N
+ IY EH EH e n/a 19 2599 2654 2750 N
+ IY EH EH s n/a 19 2604 2654 2750 N
+ IY EH ER b n/a 19 2594 2698 2761 N
+ IY EH ER e n/a 19 2599 2698 2783 N
+ IY EH ER s n/a 19 2604 2698 2761 N
+ IY EH EY b n/a 19 2594 2654 2749 N
+ IY EH EY e n/a 19 2599 2654 2749 N
+ IY EH EY s n/a 19 2604 2654 2749 N
+ IY EH F b n/a 19 2594 2634 2740 N
+ IY EH F e n/a 19 2599 2639 2740 N
+ IY EH F s n/a 19 2604 2634 2740 N
+ IY EH G b n/a 19 2594 2647 2726 N
+ IY EH G e n/a 19 2599 2647 2727 N
+ IY EH G s n/a 19 2604 2647 2726 N
+ IY EH HH e n/a 19 2599 2634 2729 N
+ IY EH HH s n/a 19 2604 2634 2729 N
+ IY EH IH e n/a 19 2599 2654 2769 N
+ IY EH IH s n/a 19 2604 2654 2769 N
+ IY EH IY b n/a 19 2594 2654 2770 N
+ IY EH IY e n/a 19 2599 2654 2770 N
+ IY EH IY s n/a 19 2604 2654 2770 N
+ IY EH JH b n/a 19 2594 2636 2725 N
+ IY EH JH e n/a 19 2599 2643 2725 N
+ IY EH JH s n/a 19 2604 2636 2725 N
+ IY EH K b n/a 19 2594 2647 2726 N
+ IY EH K e n/a 19 2599 2647 2726 N
+ IY EH K s n/a 19 2604 2647 2726 N
+ IY EH L b n/a 19 2594 2698 2778 N
+ IY EH L e n/a 19 2599 2713 2774 N
+ IY EH L s n/a 19 2604 2698 2778 N
+ IY EH M b n/a 19 2594 2674 2763 N
+ IY EH M e n/a 19 2599 2674 2763 N
+ IY EH M s n/a 19 2604 2674 2763 N
+ IY EH N b n/a 19 2594 2674 2762 N
+ IY EH N e n/a 19 2599 2674 2762 N
+ IY EH N i n/a 19 2604 2664 2765 N
+ IY EH N s n/a 19 2604 2674 2762 N
+ IY EH NG b n/a 19 2594 2674 2762 N
+ IY EH NG e n/a 19 2599 2674 2762 N
+ IY EH NG s n/a 19 2604 2674 2762 N
+ IY EH OW b n/a 19 2594 2698 2780 N
+ IY EH OW e n/a 19 2599 2698 2782 N
+ IY EH OW i n/a 19 2604 2699 2780 N
+ IY EH OW s n/a 19 2604 2698 2780 N
+ IY EH OY e n/a 19 2599 2654 2757 N
+ IY EH OY s n/a 19 2604 2654 2748 N
+ IY EH P b n/a 19 2594 2640 2715 N
+ IY EH P e n/a 19 2599 2640 2716 N
+ IY EH P s n/a 19 2604 2640 2715 N
+ IY EH R b n/a 19 2594 2698 2761 N
+ IY EH R e n/a 19 2599 2713 2776 N
+ IY EH R s n/a 19 2604 2698 2761 N
+ IY EH S b n/a 19 2594 2632 2736 N
+ IY EH S e n/a 19 2599 2639 2736 N
+ IY EH S s n/a 19 2604 2632 2736 N
+ IY EH SH b n/a 19 2594 2634 2739 N
+ IY EH SH e n/a 19 2599 2639 2739 N
+ IY EH SH s n/a 19 2604 2634 2739 N
+ IY EH SIL e n/a 19 2599 2648 2744 N
+ IY EH SIL s n/a 19 2604 2648 2745 N
+ IY EH T b n/a 19 2594 2632 2723 N
+ IY EH T e n/a 19 2599 2643 2724 N
+ IY EH T s n/a 19 2604 2632 2723 N
+ IY EH TH b n/a 19 2594 2632 2741 N
+ IY EH TH e n/a 19 2599 2639 2741 N
+ IY EH TH s n/a 19 2604 2632 2741 N
+ IY EH UH e n/a 19 2599 2698 2783 N
+ IY EH UH s n/a 19 2604 2698 2783 N
+ IY EH UW b n/a 19 2594 2698 2780 N
+ IY EH UW e n/a 19 2599 2698 2782 N
+ IY EH UW s n/a 19 2604 2698 2780 N
+ IY EH V b n/a 19 2594 2629 2731 N
+ IY EH V e n/a 19 2599 2652 2720 N
+ IY EH V s n/a 19 2604 2652 2731 N
+ IY EH W b n/a 19 2594 2713 2776 N
+ IY EH W e n/a 19 2599 2713 2776 N
+ IY EH W s n/a 19 2604 2713 2776 N
+ IY EH Y e n/a 19 2599 2643 2771 N
+ IY EH Y s n/a 19 2604 2636 2771 N
+ IY EH Z b n/a 19 2594 2629 2734 N
+ IY EH Z e n/a 19 2599 2653 2733 N
+ IY EH Z s n/a 19 2604 2651 2733 N
+ IY EH ZH b n/a 19 2594 2629 2734 N
+ IY EH ZH e n/a 19 2599 2652 2733 N
+ IY EH ZH s n/a 19 2604 2651 2733 N
+ IY ER AA b n/a 19 2617 2704 2781 N
+ IY ER AA e n/a 19 2614 2704 2781 N
+ IY ER AA i n/a 19 2614 2705 2781 N
+ IY ER AA s n/a 19 2614 2704 2781 N
+ IY ER AE e n/a 19 2614 2704 2748 N
+ IY ER AE s n/a 19 2614 2704 2748 N
+ IY ER AH b n/a 19 2617 2704 2760 N
+ IY ER AH e n/a 19 2614 2704 2756 N
+ IY ER AH i n/a 19 2614 2703 2760 N
+ IY ER AH s n/a 19 2614 2704 2760 N
+ IY ER AO b n/a 19 2617 2704 2780 N
+ IY ER AO e n/a 19 2614 2704 2782 N
+ IY ER AO s n/a 19 2614 2704 2780 N
+ IY ER AW e n/a 19 2614 2704 2781 N
+ IY ER AW s n/a 19 2614 2704 2781 N
+ IY ER AY e n/a 19 2614 2704 2757 N
+ IY ER AY s n/a 19 2614 2704 2748 N
+ IY ER B b n/a 19 2617 2677 2718 N
+ IY ER B e n/a 19 2612 2694 2718 N
+ IY ER B i n/a 19 2610 2679 2718 N
+ IY ER B s n/a 19 2610 2677 2718 N
+ IY ER CH b n/a 19 2617 2692 2724 N
+ IY ER CH e n/a 19 2612 2693 2724 N
+ IY ER CH i n/a 19 2609 2693 2724 N
+ IY ER CH s n/a 19 2609 2693 2724 N
+ IY ER D b n/a 19 2617 2678 2721 N
+ IY ER D e n/a 19 2611 2693 2725 N
+ IY ER D i n/a 19 2612 2678 2721 N
+ IY ER D s n/a 19 2612 2678 2721 N
+ IY ER DH b n/a 19 2617 2678 2731 N
+ IY ER DH e n/a 19 2612 2682 2719 N
+ IY ER DH s n/a 19 2612 2678 2732 N
+ IY ER EH b n/a 19 2617 2704 2750 N
+ IY ER EH e n/a 19 2614 2704 2750 N
+ IY ER EH i n/a 19 2614 2705 2752 N
+ IY ER EH s n/a 19 2614 2704 2750 N
+ IY ER ER b n/a 19 2617 2704 2761 N
+ IY ER ER e n/a 19 2614 2704 2783 N
+ IY ER ER i n/a 19 2614 2703 2761 N
+ IY ER ER s n/a 19 2614 2704 2761 N
+ IY ER EY b n/a 19 2617 2704 2749 N
+ IY ER EY e n/a 19 2614 2704 2749 N
+ IY ER EY s n/a 19 2614 2704 2749 N
+ IY ER F b n/a 19 2617 2692 2740 N
+ IY ER F e n/a 19 2612 2692 2740 N
+ IY ER F i n/a 19 2609 2692 2740 N
+ IY ER F s n/a 19 2609 2692 2740 N
+ IY ER G b n/a 19 2617 2677 2726 N
+ IY ER G e n/a 19 2612 2695 2727 N
+ IY ER G i n/a 19 2610 2679 2726 N
+ IY ER G s n/a 19 2610 2677 2726 N
+ IY ER HH e n/a 19 2612 2692 2729 N
+ IY ER HH s n/a 19 2609 2692 2729 N
+ IY ER IH e n/a 19 2614 2704 2769 N
+ IY ER IH i n/a 19 2614 2705 2772 N
+ IY ER IH s n/a 19 2614 2704 2769 N
+ IY ER IY b n/a 19 2617 2704 2770 N
+ IY ER IY e n/a 19 2614 2704 2770 N
+ IY ER IY s n/a 19 2614 2704 2770 N
+ IY ER JH b n/a 19 2617 2677 2725 N
+ IY ER JH e n/a 19 2612 2693 2725 N
+ IY ER JH s n/a 19 2609 2677 2725 N
+ IY ER K b n/a 19 2617 2693 2728 N
+ IY ER K e n/a 19 2612 2695 2728 N
+ IY ER K i n/a 19 2610 2695 2728 N
+ IY ER K s n/a 19 2610 2693 2728 N
+ IY ER L b n/a 19 2617 2710 2778 N
+ IY ER L e n/a 19 2612 2712 2774 N
+ IY ER L i n/a 19 2610 2710 2778 N
+ IY ER L s n/a 19 2610 2710 2778 N
+ IY ER M b n/a 19 2617 2681 2763 N
+ IY ER M e n/a 19 2613 2692 2763 N
+ IY ER M i n/a 19 2613 2681 2764 N
+ IY ER M s n/a 19 2613 2681 2763 N
+ IY ER N b n/a 19 2617 2681 2762 N
+ IY ER N e n/a 19 2613 2692 2762 N
+ IY ER N i n/a 19 2613 2681 2765 N
+ IY ER N s n/a 19 2613 2681 2762 N
+ IY ER NG b n/a 19 2617 2681 2762 N
+ IY ER NG e n/a 19 2613 2692 2762 N
+ IY ER NG s n/a 19 2613 2681 2762 N
+ IY ER OW b n/a 19 2617 2704 2780 N
+ IY ER OW e n/a 19 2614 2704 2782 N
+ IY ER OW i n/a 19 2614 2705 2780 N
+ IY ER OW s n/a 19 2614 2704 2780 N
+ IY ER OY e n/a 19 2614 2704 2757 N
+ IY ER OY s n/a 19 2614 2704 2748 N
+ IY ER P b n/a 19 2617 2694 2717 N
+ IY ER P e n/a 19 2612 2694 2717 N
+ IY ER P i n/a 19 2610 2695 2717 N
+ IY ER P s n/a 19 2610 2694 2717 N
+ IY ER R b n/a 19 2617 2710 2761 N
+ IY ER R e n/a 19 2612 2712 2775 N
+ IY ER R i n/a 19 2610 2710 2761 N
+ IY ER R s n/a 19 2610 2710 2761 N
+ IY ER S b n/a 19 2617 2691 2738 N
+ IY ER S e n/a 19 2611 2691 2738 N
+ IY ER S i n/a 19 2609 2691 2738 N
+ IY ER S s n/a 19 2609 2691 2738 N
+ IY ER SH b n/a 19 2617 2691 2739 N
+ IY ER SH e n/a 19 2612 2691 2739 N
+ IY ER SH i n/a 19 2609 2691 2739 N
+ IY ER SH s n/a 19 2609 2691 2739 N
+ IY ER SIL e n/a 19 2615 2684 2747 N
+ IY ER SIL s n/a 19 2615 2677 2747 N
+ IY ER T b n/a 19 2617 2692 2724 N
+ IY ER T e n/a 19 2611 2693 2724 N
+ IY ER T i n/a 19 2609 2693 2724 N
+ IY ER T s n/a 19 2609 2693 2724 N
+ IY ER TH b n/a 19 2617 2691 2741 N
+ IY ER TH e n/a 19 2611 2691 2741 N
+ IY ER TH i n/a 19 2609 2691 2741 N
+ IY ER TH s n/a 19 2609 2691 2741 N
+ IY ER UH e n/a 19 2614 2704 2783 N
+ IY ER UH s n/a 19 2614 2704 2783 N
+ IY ER UW b n/a 19 2617 2704 2780 N
+ IY ER UW e n/a 19 2614 2704 2782 N
+ IY ER UW s n/a 19 2614 2704 2780 N
+ IY ER V b n/a 19 2617 2677 2731 N
+ IY ER V e n/a 19 2612 2682 2720 N
+ IY ER V i n/a 19 2609 2679 2732 N
+ IY ER V s n/a 19 2609 2677 2732 N
+ IY ER W b n/a 19 2617 2712 2775 N
+ IY ER W e n/a 19 2612 2712 2775 N
+ IY ER W i n/a 19 2610 2712 2775 N
+ IY ER W s n/a 19 2610 2712 2775 N
+ IY ER Y e n/a 19 2614 2704 2771 N
+ IY ER Y s n/a 19 2614 2704 2771 N
+ IY ER Z b n/a 19 2617 2678 2735 N
+ IY ER Z e n/a 19 2612 2682 2735 N
+ IY ER Z i n/a 19 2612 2678 2735 N
+ IY ER Z s n/a 19 2612 2678 2735 N
+ IY ER ZH b n/a 19 2617 2677 2735 N
+ IY ER ZH e n/a 19 2612 2682 2735 N
+ IY ER ZH s n/a 19 2609 2677 2735 N
+ IY EY AA b n/a 19 2595 2698 2781 N
+ IY EY AA e n/a 19 2599 2698 2781 N
+ IY EY AA i n/a 19 2604 2699 2781 N
+ IY EY AA s n/a 19 2604 2698 2781 N
+ IY EY AE e n/a 19 2599 2654 2748 N
+ IY EY AE s n/a 19 2604 2654 2748 N
+ IY EY AH b n/a 19 2595 2660 2759 N
+ IY EY AH e n/a 19 2599 2660 2756 N
+ IY EY AH i n/a 19 2604 2658 2759 N
+ IY EY AH s n/a 19 2604 2660 2759 N
+ IY EY AO b n/a 19 2595 2698 2780 N
+ IY EY AO e n/a 19 2599 2698 2782 N
+ IY EY AO s n/a 19 2604 2698 2780 N
+ IY EY AW e n/a 19 2599 2698 2781 N
+ IY EY AW s n/a 19 2604 2698 2781 N
+ IY EY AY e n/a 19 2599 2654 2757 N
+ IY EY AY s n/a 19 2604 2654 2748 N
+ IY EY B b n/a 19 2595 2640 2718 N
+ IY EY B e n/a 19 2599 2640 2718 N
+ IY EY B s n/a 19 2604 2640 2718 N
+ IY EY CH b n/a 19 2595 2632 2723 N
+ IY EY CH e n/a 19 2599 2643 2724 N
+ IY EY CH i n/a 19 2604 2631 2723 N
+ IY EY CH s n/a 19 2604 2632 2723 N
+ IY EY D b n/a 19 2595 2636 2721 N
+ IY EY D e n/a 19 2599 2643 2725 N
+ IY EY D i n/a 19 2604 2636 2721 N
+ IY EY D s n/a 19 2604 2636 2721 N
+ IY EY DH b n/a 19 2595 2629 2731 N
+ IY EY DH e n/a 19 2599 2652 2720 N
+ IY EY DH s n/a 19 2604 2652 2731 N
+ IY EY EH b n/a 19 2595 2654 2750 N
+ IY EY EH e n/a 19 2599 2654 2750 N
+ IY EY EH s n/a 19 2604 2654 2750 N
+ IY EY ER b n/a 19 2595 2698 2761 N
+ IY EY ER e n/a 19 2599 2698 2783 N
+ IY EY ER s n/a 19 2604 2698 2761 N
+ IY EY EY b n/a 19 2595 2654 2749 N
+ IY EY EY e n/a 19 2599 2654 2749 N
+ IY EY EY s n/a 19 2604 2654 2749 N
+ IY EY F b n/a 19 2595 2634 2740 N
+ IY EY F e n/a 19 2599 2639 2740 N
+ IY EY F s n/a 19 2604 2634 2740 N
+ IY EY G b n/a 19 2595 2647 2726 N
+ IY EY G e n/a 19 2599 2647 2727 N
+ IY EY G i n/a 19 2604 2647 2726 N
+ IY EY G s n/a 19 2604 2647 2726 N
+ IY EY HH e n/a 19 2599 2634 2729 N
+ IY EY HH s n/a 19 2604 2634 2729 N
+ IY EY IH e n/a 19 2599 2654 2769 N
+ IY EY IH i n/a 19 2604 2656 2772 N
+ IY EY IH s n/a 19 2604 2654 2769 N
+ IY EY IY b n/a 19 2595 2654 2770 N
+ IY EY IY e n/a 19 2599 2654 2770 N
+ IY EY IY s n/a 19 2604 2654 2770 N
+ IY EY JH b n/a 19 2595 2636 2725 N
+ IY EY JH e n/a 19 2599 2643 2725 N
+ IY EY JH s n/a 19 2604 2636 2725 N
+ IY EY K b n/a 19 2595 2647 2726 N
+ IY EY K e n/a 19 2599 2647 2726 N
+ IY EY K s n/a 19 2604 2647 2726 N
+ IY EY L b n/a 19 2595 2698 2778 N
+ IY EY L e n/a 19 2599 2713 2774 N
+ IY EY L s n/a 19 2604 2698 2778 N
+ IY EY M b n/a 19 2595 2674 2763 N
+ IY EY M e n/a 19 2599 2674 2763 N
+ IY EY M s n/a 19 2604 2674 2763 N
+ IY EY N b n/a 19 2595 2674 2762 N
+ IY EY N e n/a 19 2599 2674 2762 N
+ IY EY N i n/a 19 2604 2664 2765 N
+ IY EY N s n/a 19 2604 2674 2762 N
+ IY EY NG b n/a 19 2595 2674 2762 N
+ IY EY NG e n/a 19 2599 2674 2762 N
+ IY EY NG s n/a 19 2604 2674 2762 N
+ IY EY OW b n/a 19 2595 2698 2780 N
+ IY EY OW e n/a 19 2599 2698 2782 N
+ IY EY OW s n/a 19 2604 2698 2780 N
+ IY EY OY e n/a 19 2599 2654 2757 N
+ IY EY OY s n/a 19 2604 2654 2748 N
+ IY EY P b n/a 19 2595 2640 2715 N
+ IY EY P e n/a 19 2599 2640 2716 N
+ IY EY P s n/a 19 2604 2640 2715 N
+ IY EY R b n/a 19 2595 2698 2761 N
+ IY EY R e n/a 19 2599 2713 2776 N
+ IY EY R s n/a 19 2604 2698 2761 N
+ IY EY S b n/a 19 2595 2632 2736 N
+ IY EY S e n/a 19 2599 2639 2736 N
+ IY EY S s n/a 19 2604 2632 2736 N
+ IY EY SH b n/a 19 2595 2634 2739 N
+ IY EY SH e n/a 19 2599 2639 2739 N
+ IY EY SH s n/a 19 2604 2634 2739 N
+ IY EY SIL e n/a 19 2599 2648 2744 N
+ IY EY SIL s n/a 19 2604 2648 2745 N
+ IY EY T b n/a 19 2595 2632 2723 N
+ IY EY T e n/a 19 2599 2643 2724 N
+ IY EY T i n/a 19 2604 2631 2723 N
+ IY EY T s n/a 19 2604 2632 2723 N
+ IY EY TH b n/a 19 2595 2632 2741 N
+ IY EY TH e n/a 19 2599 2639 2741 N
+ IY EY TH s n/a 19 2604 2632 2741 N
+ IY EY UH e n/a 19 2599 2698 2783 N
+ IY EY UH s n/a 19 2604 2698 2783 N
+ IY EY UW b n/a 19 2595 2698 2780 N
+ IY EY UW e n/a 19 2599 2698 2782 N
+ IY EY UW s n/a 19 2604 2698 2780 N
+ IY EY V b n/a 19 2595 2629 2731 N
+ IY EY V e n/a 19 2599 2652 2720 N
+ IY EY V s n/a 19 2604 2652 2731 N
+ IY EY W b n/a 19 2595 2713 2776 N
+ IY EY W e n/a 19 2599 2713 2776 N
+ IY EY W s n/a 19 2604 2713 2776 N
+ IY EY Y e n/a 19 2599 2643 2771 N
+ IY EY Y s n/a 19 2604 2636 2771 N
+ IY EY Z b n/a 19 2595 2629 2734 N
+ IY EY Z e n/a 19 2599 2653 2733 N
+ IY EY Z i n/a 19 2604 2651 2733 N
+ IY EY Z s n/a 19 2604 2651 2733 N
+ IY EY ZH b n/a 19 2595 2629 2734 N
+ IY EY ZH e n/a 19 2599 2652 2733 N
+ IY EY ZH i n/a 19 2604 2651 2733 N
+ IY EY ZH s n/a 19 2604 2651 2733 N
+ IY F AA b n/a 19 2594 2698 2781 N
+ IY F AA e n/a 19 2580 2698 2781 N
+ IY F AA i n/a 19 2580 2699 2781 N
+ IY F AA s n/a 19 2580 2698 2781 N
+ IY F AE e n/a 19 2580 2654 2748 N
+ IY F AE i n/a 19 2580 2659 2752 N
+ IY F AE s n/a 19 2580 2654 2748 N
+ IY F AH b n/a 19 2594 2660 2759 N
+ IY F AH e n/a 19 2580 2660 2756 N
+ IY F AH i n/a 19 2580 2659 2759 N
+ IY F AH s n/a 19 2580 2660 2759 N
+ IY F AO b n/a 19 2594 2698 2780 N
+ IY F AO e n/a 19 2580 2698 2782 N
+ IY F AO i n/a 19 2580 2699 2780 N
+ IY F AO s n/a 19 2580 2698 2780 N
+ IY F AW e n/a 19 2580 2698 2781 N
+ IY F AW s n/a 19 2580 2698 2781 N
+ IY F AY e n/a 19 2580 2654 2757 N
+ IY F AY s n/a 19 2580 2654 2748 N
+ IY F B b n/a 19 2594 2637 2718 N
+ IY F B e n/a 19 2585 2637 2718 N
+ IY F B i n/a 19 2585 2637 2718 N
+ IY F B s n/a 19 2585 2637 2718 N
+ IY F CH b n/a 19 2594 2632 2723 N
+ IY F CH e n/a 19 2581 2643 2724 N
+ IY F CH i n/a 19 2581 2631 2723 N
+ IY F CH s n/a 19 2581 2632 2723 N
+ IY F D b n/a 19 2594 2636 2722 N
+ IY F D e n/a 19 2581 2643 2725 N
+ IY F D i n/a 19 2581 2636 2722 N
+ IY F D s n/a 19 2581 2636 2722 N
+ IY F DH b n/a 19 2594 2629 2731 N
+ IY F DH e n/a 19 2581 2652 2720 N
+ IY F DH s n/a 19 2581 2652 2731 N
+ IY F EH b n/a 19 2594 2654 2750 N
+ IY F EH e n/a 19 2580 2654 2750 N
+ IY F EH i n/a 19 2580 2659 2752 N
+ IY F EH s n/a 19 2580 2654 2750 N
+ IY F ER b n/a 19 2594 2698 2761 N
+ IY F ER e n/a 19 2580 2698 2783 N
+ IY F ER i n/a 19 2580 2697 2761 N
+ IY F ER s n/a 19 2580 2698 2761 N
+ IY F EY b n/a 19 2594 2654 2749 N
+ IY F EY e n/a 19 2580 2654 2749 N
+ IY F EY s n/a 19 2580 2654 2749 N
+ IY F F b n/a 19 2594 2634 2740 N
+ IY F F e n/a 19 2581 2638 2740 N
+ IY F F i n/a 19 2581 2634 2740 N
+ IY F F s n/a 19 2581 2634 2740 N
+ IY F G b n/a 19 2594 2647 2726 N
+ IY F G e n/a 19 2581 2644 2727 N
+ IY F G i n/a 19 2581 2644 2726 N
+ IY F G s n/a 19 2581 2644 2726 N
+ IY F HH e n/a 19 2581 2634 2729 N
+ IY F HH i n/a 19 2581 2633 2729 N
+ IY F HH s n/a 19 2581 2634 2729 N
+ IY F IH e n/a 19 2580 2654 2769 N
+ IY F IH i n/a 19 2580 2656 2772 N
+ IY F IH s n/a 19 2580 2654 2769 N
+ IY F IY b n/a 19 2594 2654 2770 N
+ IY F IY e n/a 19 2580 2654 2770 N
+ IY F IY s n/a 19 2580 2654 2770 N
+ IY F JH b n/a 19 2594 2636 2725 N
+ IY F JH e n/a 19 2581 2643 2725 N
+ IY F JH i n/a 19 2581 2636 2725 N
+ IY F JH s n/a 19 2581 2636 2725 N
+ IY F K b n/a 19 2594 2647 2726 N
+ IY F K e n/a 19 2581 2644 2726 N
+ IY F K i n/a 19 2581 2644 2726 N
+ IY F K s n/a 19 2581 2644 2726 N
+ IY F L b n/a 19 2594 2698 2778 N
+ IY F L e n/a 19 2580 2708 2774 N
+ IY F L i n/a 19 2580 2699 2779 N
+ IY F L s n/a 19 2580 2698 2778 N
+ IY F M b n/a 19 2594 2674 2763 N
+ IY F M e n/a 19 2585 2674 2763 N
+ IY F M i n/a 19 2585 2663 2766 N
+ IY F M s n/a 19 2585 2674 2763 N
+ IY F N b n/a 19 2594 2674 2762 N
+ IY F N e n/a 19 2581 2674 2762 N
+ IY F N i n/a 19 2581 2665 2765 N
+ IY F N s n/a 19 2581 2674 2762 N
+ IY F NG b n/a 19 2594 2674 2762 N
+ IY F NG e n/a 19 2581 2674 2762 N
+ IY F NG s n/a 19 2581 2674 2762 N
+ IY F OW b n/a 19 2594 2698 2780 N
+ IY F OW e n/a 19 2580 2698 2782 N
+ IY F OW i n/a 19 2580 2699 2780 N
+ IY F OW s n/a 19 2580 2698 2780 N
+ IY F OY e n/a 19 2580 2654 2757 N
+ IY F OY s n/a 19 2580 2654 2748 N
+ IY F P b n/a 19 2594 2637 2715 N
+ IY F P e n/a 19 2587 2637 2716 N
+ IY F P s n/a 19 2587 2637 2715 N
+ IY F R b n/a 19 2594 2698 2761 N
+ IY F R e n/a 19 2580 2708 2776 N
+ IY F R i n/a 19 2580 2697 2761 N
+ IY F R s n/a 19 2580 2698 2761 N
+ IY F S b n/a 19 2594 2632 2736 N
+ IY F S e n/a 19 2581 2638 2736 N
+ IY F S i n/a 19 2581 2631 2736 N
+ IY F S s n/a 19 2581 2632 2736 N
+ IY F SH b n/a 19 2594 2634 2739 N
+ IY F SH e n/a 19 2581 2638 2739 N
+ IY F SH i n/a 19 2581 2634 2739 N
+ IY F SH s n/a 19 2581 2634 2739 N
+ IY F SIL e n/a 19 2581 2648 2744 N
+ IY F SIL s n/a 19 2581 2648 2745 N
+ IY F T b n/a 19 2594 2632 2723 N
+ IY F T e n/a 19 2581 2643 2724 N
+ IY F T i n/a 19 2581 2631 2723 N
+ IY F T s n/a 19 2581 2632 2723 N
+ IY F TH b n/a 19 2594 2632 2741 N
+ IY F TH e n/a 19 2581 2638 2741 N
+ IY F TH i n/a 19 2581 2631 2741 N
+ IY F TH s n/a 19 2581 2632 2741 N
+ IY F UH e n/a 19 2580 2698 2783 N
+ IY F UH s n/a 19 2580 2698 2783 N
+ IY F UW b n/a 19 2594 2698 2780 N
+ IY F UW e n/a 19 2580 2698 2782 N
+ IY F UW i n/a 19 2580 2699 2780 N
+ IY F UW s n/a 19 2580 2698 2780 N
+ IY F V b n/a 19 2594 2629 2731 N
+ IY F V e n/a 19 2581 2652 2720 N
+ IY F V i n/a 19 2581 2652 2731 N
+ IY F V s n/a 19 2581 2652 2731 N
+ IY F W b n/a 19 2594 2708 2776 N
+ IY F W e n/a 19 2580 2708 2776 N
+ IY F W s n/a 19 2580 2708 2776 N
+ IY F Y e n/a 19 2580 2643 2771 N
+ IY F Y i n/a 19 2580 2636 2771 N
+ IY F Y s n/a 19 2580 2636 2771 N
+ IY F Z b n/a 19 2594 2629 2734 N
+ IY F Z e n/a 19 2581 2653 2733 N
+ IY F Z i n/a 19 2581 2651 2733 N
+ IY F Z s n/a 19 2581 2651 2733 N
+ IY F ZH b n/a 19 2594 2629 2734 N
+ IY F ZH e n/a 19 2581 2652 2733 N
+ IY F ZH i n/a 19 2581 2651 2733 N
+ IY F ZH s n/a 19 2581 2651 2733 N
+ IY G AA b n/a 19 2594 2698 2781 N
+ IY G AA e n/a 19 2599 2698 2781 N
+ IY G AA i n/a 19 2605 2699 2781 N
+ IY G AA s n/a 19 2605 2698 2781 N
+ IY G AE e n/a 19 2599 2654 2748 N
+ IY G AE s n/a 19 2605 2654 2748 N
+ IY G AH b n/a 19 2594 2660 2759 N
+ IY G AH e n/a 19 2599 2660 2754 N
+ IY G AH i n/a 19 2605 2658 2759 N
+ IY G AH s n/a 19 2605 2660 2759 N
+ IY G AO b n/a 19 2594 2698 2780 N
+ IY G AO e n/a 19 2599 2698 2782 N
+ IY G AO i n/a 19 2605 2699 2780 N
+ IY G AO s n/a 19 2605 2698 2780 N
+ IY G AW e n/a 19 2599 2698 2781 N
+ IY G AW s n/a 19 2605 2698 2781 N
+ IY G AY e n/a 19 2599 2654 2757 N
+ IY G AY s n/a 19 2605 2654 2748 N
+ IY G B b n/a 19 2594 2640 2718 N
+ IY G B e n/a 19 2599 2640 2718 N
+ IY G B i n/a 19 2605 2640 2718 N
+ IY G B s n/a 19 2605 2640 2718 N
+ IY G CH b n/a 19 2594 2632 2723 N
+ IY G CH e n/a 19 2599 2643 2724 N
+ IY G CH i n/a 19 2606 2631 2723 N
+ IY G CH s n/a 19 2606 2632 2723 N
+ IY G D b n/a 19 2594 2636 2722 N
+ IY G D e n/a 19 2599 2643 2725 N
+ IY G D i n/a 19 2605 2636 2722 N
+ IY G D s n/a 19 2605 2636 2722 N
+ IY G DH b n/a 19 2594 2629 2731 N
+ IY G DH e n/a 19 2599 2652 2720 N
+ IY G DH s n/a 19 2605 2652 2731 N
+ IY G EH b n/a 19 2594 2654 2750 N
+ IY G EH e n/a 19 2599 2654 2750 N
+ IY G EH i n/a 19 2605 2658 2752 N
+ IY G EH s n/a 19 2605 2654 2750 N
+ IY G ER b n/a 19 2594 2698 2761 N
+ IY G ER e n/a 19 2599 2698 2783 N
+ IY G ER i n/a 19 2605 2697 2761 N
+ IY G ER s n/a 19 2605 2698 2761 N
+ IY G EY b n/a 19 2594 2654 2750 N
+ IY G EY e n/a 19 2599 2654 2750 N
+ IY G EY s n/a 19 2605 2654 2750 N
+ IY G F b n/a 19 2594 2634 2740 N
+ IY G F e n/a 19 2599 2639 2740 N
+ IY G F i n/a 19 2606 2633 2740 N
+ IY G F s n/a 19 2606 2634 2740 N
+ IY G G b n/a 19 2594 2647 2726 N
+ IY G G e n/a 19 2599 2644 2727 N
+ IY G G i n/a 19 2605 2645 2726 N
+ IY G G s n/a 19 2605 2644 2726 N
+ IY G HH e n/a 19 2599 2634 2729 N
+ IY G HH i n/a 19 2606 2633 2729 N
+ IY G HH s n/a 19 2606 2634 2729 N
+ IY G IH e n/a 19 2599 2654 2768 N
+ IY G IH s n/a 19 2605 2654 2768 N
+ IY G IY b n/a 19 2594 2654 2770 N
+ IY G IY e n/a 19 2599 2654 2770 N
+ IY G IY s n/a 19 2605 2654 2770 N
+ IY G JH b n/a 19 2594 2636 2725 N
+ IY G JH e n/a 19 2599 2643 2725 N
+ IY G JH s n/a 19 2605 2636 2725 N
+ IY G K b n/a 19 2594 2647 2726 N
+ IY G K e n/a 19 2599 2644 2726 N
+ IY G K i n/a 19 2606 2645 2726 N
+ IY G K s n/a 19 2606 2644 2726 N
+ IY G L b n/a 19 2594 2698 2778 N
+ IY G L e n/a 19 2599 2713 2774 N
+ IY G L i n/a 19 2606 2699 2779 N
+ IY G L s n/a 19 2606 2698 2778 N
+ IY G M b n/a 19 2594 2674 2763 N
+ IY G M e n/a 19 2599 2674 2763 N
+ IY G M i n/a 19 2605 2664 2766 N
+ IY G M s n/a 19 2605 2674 2763 N
+ IY G N b n/a 19 2594 2674 2762 N
+ IY G N e n/a 19 2599 2674 2762 N
+ IY G N i n/a 19 2605 2664 2765 N
+ IY G N s n/a 19 2605 2674 2762 N
+ IY G NG b n/a 19 2594 2674 2762 N
+ IY G NG e n/a 19 2599 2674 2762 N
+ IY G NG s n/a 19 2605 2674 2762 N
+ IY G OW b n/a 19 2594 2698 2780 N
+ IY G OW e n/a 19 2599 2698 2782 N
+ IY G OW i n/a 19 2605 2699 2780 N
+ IY G OW s n/a 19 2605 2698 2780 N
+ IY G OY e n/a 19 2599 2654 2757 N
+ IY G OY s n/a 19 2605 2654 2748 N
+ IY G P b n/a 19 2594 2640 2716 N
+ IY G P e n/a 19 2599 2640 2716 N
+ IY G P i n/a 19 2606 2640 2716 N
+ IY G P s n/a 19 2606 2640 2716 N
+ IY G R b n/a 19 2594 2698 2761 N
+ IY G R e n/a 19 2599 2713 2776 N
+ IY G R i n/a 19 2606 2697 2761 N
+ IY G R s n/a 19 2606 2698 2761 N
+ IY G S b n/a 19 2594 2632 2736 N
+ IY G S e n/a 19 2599 2639 2736 N
+ IY G S i n/a 19 2606 2631 2736 N
+ IY G S s n/a 19 2606 2632 2736 N
+ IY G SH b n/a 19 2594 2634 2739 N
+ IY G SH e n/a 19 2599 2639 2739 N
+ IY G SH s n/a 19 2606 2634 2739 N
+ IY G SIL e n/a 19 2599 2649 2745 N
+ IY G SIL s n/a 19 2606 2649 2745 N
+ IY G T b n/a 19 2594 2632 2723 N
+ IY G T e n/a 19 2599 2643 2724 N
+ IY G T i n/a 19 2606 2631 2723 N
+ IY G T s n/a 19 2606 2632 2723 N
+ IY G TH b n/a 19 2594 2632 2741 N
+ IY G TH e n/a 19 2599 2639 2741 N
+ IY G TH i n/a 19 2606 2631 2741 N
+ IY G TH s n/a 19 2606 2632 2741 N
+ IY G UH e n/a 19 2599 2698 2783 N
+ IY G UH s n/a 19 2605 2698 2783 N
+ IY G UW b n/a 19 2594 2698 2780 N
+ IY G UW e n/a 19 2599 2698 2782 N
+ IY G UW i n/a 19 2605 2699 2780 N
+ IY G UW s n/a 19 2605 2698 2780 N
+ IY G V b n/a 19 2594 2629 2731 N
+ IY G V e n/a 19 2599 2652 2720 N
+ IY G V i n/a 19 2605 2652 2731 N
+ IY G V s n/a 19 2605 2652 2731 N
+ IY G W b n/a 19 2594 2713 2776 N
+ IY G W e n/a 19 2599 2713 2776 N
+ IY G W i n/a 19 2606 2713 2776 N
+ IY G W s n/a 19 2606 2713 2776 N
+ IY G Y e n/a 19 2599 2643 2771 N
+ IY G Y i n/a 19 2606 2636 2771 N
+ IY G Y s n/a 19 2606 2636 2771 N
+ IY G Z b n/a 19 2594 2629 2734 N
+ IY G Z e n/a 19 2599 2653 2733 N
+ IY G Z i n/a 19 2605 2651 2733 N
+ IY G Z s n/a 19 2605 2651 2733 N
+ IY G ZH b n/a 19 2594 2629 2734 N
+ IY G ZH e n/a 19 2599 2652 2733 N
+ IY G ZH s n/a 19 2605 2651 2733 N
+ IY HH AA b n/a 19 2594 2698 2781 N
+ IY HH AA e n/a 19 2590 2698 2781 N
+ IY HH AA s n/a 19 2590 2698 2781 N
+ IY HH AE e n/a 19 2590 2655 2751 N
+ IY HH AE s n/a 19 2590 2655 2751 N
+ IY HH AH b n/a 19 2594 2658 2759 N
+ IY HH AH e n/a 19 2590 2658 2756 N
+ IY HH AH i n/a 19 2590 2658 2759 N
+ IY HH AH s n/a 19 2590 2658 2759 N
+ IY HH AO b n/a 19 2594 2698 2780 N
+ IY HH AO e n/a 19 2590 2698 2782 N
+ IY HH AO i n/a 19 2590 2699 2780 N
+ IY HH AO s n/a 19 2590 2698 2780 N
+ IY HH AW e n/a 19 2590 2698 2781 N
+ IY HH AW s n/a 19 2590 2698 2781 N
+ IY HH AY e n/a 19 2590 2655 2757 N
+ IY HH AY s n/a 19 2590 2655 2751 N
+ IY HH B b n/a 19 2594 2637 2718 N
+ IY HH B e n/a 19 2591 2637 2718 N
+ IY HH B i n/a 19 2591 2637 2718 N
+ IY HH B s n/a 19 2591 2637 2718 N
+ IY HH CH b n/a 19 2594 2632 2723 N
+ IY HH CH e n/a 19 2591 2647 2724 N
+ IY HH CH i n/a 19 2591 2631 2723 N
+ IY HH CH s n/a 19 2591 2632 2723 N
+ IY HH D b n/a 19 2594 2636 2722 N
+ IY HH D e n/a 19 2591 2647 2725 N
+ IY HH D i n/a 19 2591 2636 2722 N
+ IY HH D s n/a 19 2591 2636 2722 N
+ IY HH DH b n/a 19 2594 2629 2731 N
+ IY HH DH e n/a 19 2591 2652 2720 N
+ IY HH DH i n/a 19 2591 2652 2731 N
+ IY HH DH s n/a 19 2591 2652 2731 N
+ IY HH EH b n/a 19 2594 2655 2750 N
+ IY HH EH e n/a 19 2590 2655 2750 N
+ IY HH EH s n/a 19 2590 2655 2750 N
+ IY HH ER b n/a 19 2594 2697 2761 N
+ IY HH ER e n/a 19 2590 2697 2783 N
+ IY HH ER i n/a 19 2590 2697 2761 N
+ IY HH ER s n/a 19 2590 2697 2761 N
+ IY HH EY b n/a 19 2594 2655 2749 N
+ IY HH EY e n/a 19 2590 2655 2749 N
+ IY HH EY s n/a 19 2590 2655 2749 N
+ IY HH F b n/a 19 2594 2634 2740 N
+ IY HH F e n/a 19 2591 2638 2740 N
+ IY HH F i n/a 19 2591 2634 2740 N
+ IY HH F s n/a 19 2591 2634 2740 N
+ IY HH G b n/a 19 2594 2647 2726 N
+ IY HH G e n/a 19 2591 2647 2727 N
+ IY HH G i n/a 19 2591 2647 2726 N
+ IY HH G s n/a 19 2591 2647 2726 N
+ IY HH HH e n/a 19 2590 2630 2730 N
+ IY HH HH s n/a 19 2590 2629 2730 N
+ IY HH IH e n/a 19 2590 2655 2767 N
+ IY HH IH i n/a 19 2590 2656 2772 N
+ IY HH IH s n/a 19 2590 2655 2767 N
+ IY HH IY b n/a 19 2594 2655 2770 N
+ IY HH IY e n/a 19 2590 2655 2770 N
+ IY HH IY s n/a 19 2590 2655 2770 N
+ IY HH JH b n/a 19 2594 2636 2725 N
+ IY HH JH e n/a 19 2591 2647 2725 N
+ IY HH JH i n/a 19 2591 2636 2725 N
+ IY HH JH s n/a 19 2591 2636 2725 N
+ IY HH K b n/a 19 2594 2647 2726 N
+ IY HH K e n/a 19 2591 2647 2726 N
+ IY HH K i n/a 19 2591 2647 2726 N
+ IY HH K s n/a 19 2591 2647 2726 N
+ IY HH L b n/a 19 2594 2698 2778 N
+ IY HH L e n/a 19 2592 2708 2774 N
+ IY HH L i n/a 19 2593 2699 2779 N
+ IY HH L s n/a 19 2592 2698 2778 N
+ IY HH M b n/a 19 2594 2673 2763 N
+ IY HH M e n/a 19 2590 2673 2763 N
+ IY HH M i n/a 19 2590 2664 2766 N
+ IY HH M s n/a 19 2590 2673 2763 N
+ IY HH N b n/a 19 2594 2674 2762 N
+ IY HH N e n/a 19 2590 2674 2762 N
+ IY HH N i n/a 19 2590 2664 2765 N
+ IY HH N s n/a 19 2590 2674 2762 N
+ IY HH NG b n/a 19 2594 2673 2762 N
+ IY HH NG e n/a 19 2591 2673 2762 N
+ IY HH NG i n/a 19 2591 2664 2765 N
+ IY HH NG s n/a 19 2591 2673 2762 N
+ IY HH OW b n/a 19 2594 2698 2780 N
+ IY HH OW e n/a 19 2590 2698 2782 N
+ IY HH OW i n/a 19 2590 2699 2780 N
+ IY HH OW s n/a 19 2590 2698 2780 N
+ IY HH OY e n/a 19 2590 2655 2757 N
+ IY HH OY s n/a 19 2590 2655 2751 N
+ IY HH P b n/a 19 2594 2637 2715 N
+ IY HH P e n/a 19 2591 2637 2716 N
+ IY HH P i n/a 19 2591 2637 2715 N
+ IY HH P s n/a 19 2591 2637 2715 N
+ IY HH R b n/a 19 2594 2697 2761 N
+ IY HH R e n/a 19 2592 2708 2777 N
+ IY HH R i n/a 19 2593 2697 2761 N
+ IY HH R s n/a 19 2592 2697 2761 N
+ IY HH S b n/a 19 2594 2632 2736 N
+ IY HH S e n/a 19 2591 2638 2737 N
+ IY HH S i n/a 19 2591 2631 2736 N
+ IY HH S s n/a 19 2591 2632 2736 N
+ IY HH SH b n/a 19 2594 2634 2739 N
+ IY HH SH e n/a 19 2591 2638 2739 N
+ IY HH SH i n/a 19 2591 2634 2739 N
+ IY HH SH s n/a 19 2591 2634 2739 N
+ IY HH SIL e n/a 19 2590 2649 2742 N
+ IY HH SIL s n/a 19 2590 2649 2742 N
+ IY HH T b n/a 19 2594 2632 2723 N
+ IY HH T e n/a 19 2591 2647 2724 N
+ IY HH T i n/a 19 2591 2631 2723 N
+ IY HH T s n/a 19 2591 2632 2723 N
+ IY HH TH b n/a 19 2594 2632 2741 N
+ IY HH TH e n/a 19 2591 2638 2741 N
+ IY HH TH i n/a 19 2591 2631 2741 N
+ IY HH TH s n/a 19 2591 2632 2741 N
+ IY HH UH e n/a 19 2590 2698 2783 N
+ IY HH UH s n/a 19 2590 2698 2783 N
+ IY HH UW b n/a 19 2594 2698 2780 N
+ IY HH UW e n/a 19 2590 2698 2782 N
+ IY HH UW s n/a 19 2590 2698 2780 N
+ IY HH V b n/a 19 2594 2629 2731 N
+ IY HH V e n/a 19 2591 2652 2720 N
+ IY HH V i n/a 19 2591 2652 2731 N
+ IY HH V s n/a 19 2591 2652 2731 N
+ IY HH W b n/a 19 2594 2708 2777 N
+ IY HH W e n/a 19 2592 2708 2777 N
+ IY HH W s n/a 19 2592 2708 2777 N
+ IY HH Y e n/a 19 2590 2643 2771 N
+ IY HH Y s n/a 19 2590 2636 2771 N
+ IY HH Z b n/a 19 2594 2629 2734 N
+ IY HH Z e n/a 19 2591 2653 2734 N
+ IY HH Z i n/a 19 2591 2653 2734 N
+ IY HH Z s n/a 19 2591 2653 2734 N
+ IY HH ZH b n/a 19 2594 2629 2734 N
+ IY HH ZH e n/a 19 2591 2652 2734 N
+ IY HH ZH i n/a 19 2591 2652 2734 N
+ IY HH ZH s n/a 19 2591 2652 2734 N
+ IY IH AA b n/a 19 2594 2698 2781 N
+ IY IH AA s n/a 19 2604 2698 2781 N
+ IY IH AE s n/a 19 2604 2654 2748 N
+ IY IH AH b n/a 19 2594 2660 2759 N
+ IY IH AH s n/a 19 2604 2660 2759 N
+ IY IH AO b n/a 19 2594 2698 2780 N
+ IY IH AO s n/a 19 2604 2698 2780 N
+ IY IH AW s n/a 19 2604 2698 2781 N
+ IY IH AY s n/a 19 2604 2654 2748 N
+ IY IH B b n/a 19 2594 2640 2718 N
+ IY IH B s n/a 19 2604 2640 2718 N
+ IY IH CH b n/a 19 2594 2632 2723 N
+ IY IH CH s n/a 19 2604 2632 2723 N
+ IY IH D b n/a 19 2594 2636 2721 N
+ IY IH D s n/a 19 2604 2636 2721 N
+ IY IH DH b n/a 19 2594 2629 2731 N
+ IY IH DH s n/a 19 2604 2652 2731 N
+ IY IH EH b n/a 19 2594 2654 2750 N
+ IY IH EH s n/a 19 2604 2654 2750 N
+ IY IH ER b n/a 19 2594 2698 2761 N
+ IY IH ER s n/a 19 2604 2698 2761 N
+ IY IH EY b n/a 19 2594 2654 2749 N
+ IY IH EY s n/a 19 2604 2654 2749 N
+ IY IH F b n/a 19 2594 2634 2740 N
+ IY IH F s n/a 19 2604 2634 2740 N
+ IY IH G b n/a 19 2594 2647 2726 N
+ IY IH G s n/a 19 2604 2647 2726 N
+ IY IH HH s n/a 19 2604 2634 2729 N
+ IY IH IH i n/a 19 2604 2656 2772 N
+ IY IH IH s n/a 19 2604 2654 2769 N
+ IY IH IY b n/a 19 2594 2654 2770 N
+ IY IH IY s n/a 19 2604 2654 2770 N
+ IY IH JH b n/a 19 2594 2636 2725 N
+ IY IH JH s n/a 19 2604 2636 2725 N
+ IY IH K b n/a 19 2594 2647 2726 N
+ IY IH K s n/a 19 2604 2647 2726 N
+ IY IH L b n/a 19 2594 2698 2778 N
+ IY IH L s n/a 19 2604 2698 2778 N
+ IY IH M b n/a 19 2594 2674 2763 N
+ IY IH M s n/a 19 2604 2674 2763 N
+ IY IH N b n/a 19 2594 2674 2762 N
+ IY IH N s n/a 19 2604 2674 2762 N
+ IY IH NG b n/a 19 2594 2674 2762 N
+ IY IH NG s n/a 19 2604 2674 2762 N
+ IY IH OW b n/a 19 2594 2698 2780 N
+ IY IH OW s n/a 19 2604 2698 2780 N
+ IY IH OY s n/a 19 2604 2654 2748 N
+ IY IH P b n/a 19 2594 2640 2715 N
+ IY IH P s n/a 19 2604 2640 2715 N
+ IY IH R b n/a 19 2594 2698 2761 N
+ IY IH R s n/a 19 2604 2698 2761 N
+ IY IH S b n/a 19 2594 2632 2736 N
+ IY IH S s n/a 19 2604 2632 2736 N
+ IY IH SH b n/a 19 2594 2634 2739 N
+ IY IH SH s n/a 19 2604 2634 2739 N
+ IY IH SIL s n/a 19 2604 2648 2745 N
+ IY IH T b n/a 19 2594 2632 2723 N
+ IY IH T s n/a 19 2604 2632 2723 N
+ IY IH TH b n/a 19 2594 2632 2741 N
+ IY IH TH s n/a 19 2604 2632 2741 N
+ IY IH UH s n/a 19 2604 2698 2783 N
+ IY IH UW b n/a 19 2594 2698 2780 N
+ IY IH UW s n/a 19 2604 2698 2780 N
+ IY IH V b n/a 19 2594 2629 2731 N
+ IY IH V s n/a 19 2604 2652 2731 N
+ IY IH W b n/a 19 2594 2713 2776 N
+ IY IH W s n/a 19 2604 2713 2776 N
+ IY IH Y s n/a 19 2604 2636 2771 N
+ IY IH Z b n/a 19 2594 2629 2734 N
+ IY IH Z s n/a 19 2604 2651 2733 N
+ IY IH ZH b n/a 19 2594 2629 2734 N
+ IY IH ZH s n/a 19 2604 2651 2733 N
+ IY IY AA b n/a 19 2595 2698 2781 N
+ IY IY AA e n/a 19 2599 2698 2781 N
+ IY IY AA s n/a 19 2604 2698 2781 N
+ IY IY AE e n/a 19 2599 2654 2748 N
+ IY IY AE s n/a 19 2604 2654 2748 N
+ IY IY AH b n/a 19 2595 2660 2759 N
+ IY IY AH e n/a 19 2599 2660 2756 N
+ IY IY AH i n/a 19 2604 2658 2759 N
+ IY IY AH s n/a 19 2604 2660 2759 N
+ IY IY AO b n/a 19 2595 2698 2780 N
+ IY IY AO e n/a 19 2599 2698 2782 N
+ IY IY AO s n/a 19 2604 2698 2780 N
+ IY IY AW e n/a 19 2599 2698 2781 N
+ IY IY AW s n/a 19 2604 2698 2781 N
+ IY IY AY e n/a 19 2599 2654 2757 N
+ IY IY AY s n/a 19 2604 2654 2748 N
+ IY IY B b n/a 19 2595 2640 2718 N
+ IY IY B e n/a 19 2599 2640 2718 N
+ IY IY B s n/a 19 2604 2640 2718 N
+ IY IY CH b n/a 19 2595 2632 2723 N
+ IY IY CH e n/a 19 2599 2643 2724 N
+ IY IY CH i n/a 19 2604 2631 2723 N
+ IY IY CH s n/a 19 2604 2632 2723 N
+ IY IY D b n/a 19 2595 2636 2721 N
+ IY IY D e n/a 19 2599 2643 2725 N
+ IY IY D i n/a 19 2604 2636 2721 N
+ IY IY D s n/a 19 2604 2636 2721 N
+ IY IY DH b n/a 19 2595 2629 2731 N
+ IY IY DH e n/a 19 2599 2652 2720 N
+ IY IY DH s n/a 19 2604 2652 2731 N
+ IY IY EH b n/a 19 2595 2654 2750 N
+ IY IY EH e n/a 19 2599 2654 2750 N
+ IY IY EH i n/a 19 2604 2658 2752 N
+ IY IY EH s n/a 19 2604 2654 2750 N
+ IY IY ER b n/a 19 2595 2698 2761 N
+ IY IY ER e n/a 19 2599 2698 2783 N
+ IY IY ER s n/a 19 2604 2698 2761 N
+ IY IY EY b n/a 19 2595 2654 2749 N
+ IY IY EY e n/a 19 2599 2654 2749 N
+ IY IY EY i n/a 19 2604 2659 2753 N
+ IY IY EY s n/a 19 2604 2654 2749 N
+ IY IY F b n/a 19 2595 2634 2740 N
+ IY IY F e n/a 19 2599 2639 2740 N
+ IY IY F s n/a 19 2604 2634 2740 N
+ IY IY G b n/a 19 2595 2647 2726 N
+ IY IY G e n/a 19 2599 2647 2727 N
+ IY IY G s n/a 19 2604 2647 2726 N
+ IY IY HH e n/a 19 2599 2634 2729 N
+ IY IY HH s n/a 19 2604 2634 2729 N
+ IY IY IH e n/a 19 2599 2654 2769 N
+ IY IY IH s n/a 19 2604 2654 2769 N
+ IY IY IY b n/a 19 2595 2654 2770 N
+ IY IY IY e n/a 19 2599 2654 2770 N
+ IY IY IY i n/a 19 2604 2656 2770 N
+ IY IY IY s n/a 19 2604 2654 2770 N
+ IY IY JH b n/a 19 2595 2636 2725 N
+ IY IY JH e n/a 19 2599 2643 2725 N
+ IY IY JH s n/a 19 2604 2636 2725 N
+ IY IY K b n/a 19 2595 2647 2726 N
+ IY IY K e n/a 19 2599 2647 2726 N
+ IY IY K s n/a 19 2604 2647 2726 N
+ IY IY L b n/a 19 2595 2698 2778 N
+ IY IY L e n/a 19 2599 2713 2774 N
+ IY IY L s n/a 19 2604 2698 2778 N
+ IY IY M b n/a 19 2595 2674 2763 N
+ IY IY M e n/a 19 2599 2674 2763 N
+ IY IY M s n/a 19 2604 2674 2763 N
+ IY IY N b n/a 19 2595 2674 2762 N
+ IY IY N e n/a 19 2599 2674 2762 N
+ IY IY N s n/a 19 2604 2674 2762 N
+ IY IY NG b n/a 19 2595 2674 2762 N
+ IY IY NG e n/a 19 2599 2674 2762 N
+ IY IY NG s n/a 19 2604 2674 2762 N
+ IY IY OW b n/a 19 2595 2698 2780 N
+ IY IY OW e n/a 19 2599 2698 2782 N
+ IY IY OW i n/a 19 2604 2699 2780 N
+ IY IY OW s n/a 19 2604 2698 2780 N
+ IY IY OY e n/a 19 2599 2654 2757 N
+ IY IY OY s n/a 19 2604 2654 2748 N
+ IY IY P b n/a 19 2595 2640 2715 N
+ IY IY P e n/a 19 2599 2640 2716 N
+ IY IY P i n/a 19 2604 2640 2715 N
+ IY IY P s n/a 19 2604 2640 2715 N
+ IY IY R b n/a 19 2595 2698 2761 N
+ IY IY R e n/a 19 2599 2713 2776 N
+ IY IY R s n/a 19 2604 2698 2761 N
+ IY IY S b n/a 19 2595 2632 2736 N
+ IY IY S e n/a 19 2599 2639 2736 N
+ IY IY S s n/a 19 2604 2632 2736 N
+ IY IY SH b n/a 19 2595 2634 2739 N
+ IY IY SH e n/a 19 2599 2639 2739 N
+ IY IY SH s n/a 19 2604 2634 2739 N
+ IY IY SIL e n/a 19 2599 2648 2744 N
+ IY IY SIL s n/a 19 2604 2648 2745 N
+ IY IY T b n/a 19 2595 2632 2723 N
+ IY IY T e n/a 19 2599 2643 2724 N
+ IY IY T i n/a 19 2604 2631 2723 N
+ IY IY T s n/a 19 2604 2632 2723 N
+ IY IY TH b n/a 19 2595 2632 2741 N
+ IY IY TH e n/a 19 2599 2639 2741 N
+ IY IY TH s n/a 19 2604 2632 2741 N
+ IY IY UH e n/a 19 2599 2698 2783 N
+ IY IY UH s n/a 19 2604 2698 2783 N
+ IY IY UW b n/a 19 2595 2698 2780 N
+ IY IY UW e n/a 19 2599 2698 2782 N
+ IY IY UW s n/a 19 2604 2698 2780 N
+ IY IY V b n/a 19 2595 2629 2731 N
+ IY IY V e n/a 19 2599 2652 2720 N
+ IY IY V s n/a 19 2604 2652 2731 N
+ IY IY W b n/a 19 2595 2713 2776 N
+ IY IY W e n/a 19 2599 2713 2776 N
+ IY IY W s n/a 19 2604 2713 2776 N
+ IY IY Y e n/a 19 2599 2643 2771 N
+ IY IY Y s n/a 19 2604 2636 2771 N
+ IY IY Z b n/a 19 2595 2629 2734 N
+ IY IY Z e n/a 19 2599 2653 2733 N
+ IY IY Z s n/a 19 2604 2651 2733 N
+ IY IY ZH b n/a 19 2595 2629 2734 N
+ IY IY ZH e n/a 19 2599 2652 2733 N
+ IY IY ZH s n/a 19 2604 2651 2733 N
+ IY JH AA b n/a 19 2594 2698 2781 N
+ IY JH AA e n/a 19 2604 2698 2781 N
+ IY JH AA i n/a 19 2604 2699 2781 N
+ IY JH AA s n/a 19 2604 2698 2781 N
+ IY JH AE e n/a 19 2604 2654 2748 N
+ IY JH AE i n/a 19 2604 2659 2752 N
+ IY JH AE s n/a 19 2604 2654 2748 N
+ IY JH AH b n/a 19 2594 2660 2759 N
+ IY JH AH e n/a 19 2604 2660 2756 N
+ IY JH AH i n/a 19 2604 2658 2759 N
+ IY JH AH s n/a 19 2604 2660 2759 N
+ IY JH AO b n/a 19 2594 2698 2780 N
+ IY JH AO e n/a 19 2604 2698 2782 N
+ IY JH AO s n/a 19 2604 2698 2780 N
+ IY JH AW e n/a 19 2604 2698 2781 N
+ IY JH AW s n/a 19 2604 2698 2781 N
+ IY JH AY e n/a 19 2604 2654 2757 N
+ IY JH AY s n/a 19 2604 2654 2748 N
+ IY JH B b n/a 19 2594 2640 2718 N
+ IY JH B e n/a 19 2604 2640 2718 N
+ IY JH B i n/a 19 2604 2640 2718 N
+ IY JH B s n/a 19 2604 2640 2718 N
+ IY JH CH b n/a 19 2594 2632 2723 N
+ IY JH CH e n/a 19 2604 2643 2724 N
+ IY JH CH s n/a 19 2604 2632 2723 N
+ IY JH D b n/a 19 2594 2636 2721 N
+ IY JH D e n/a 19 2604 2643 2725 N
+ IY JH D i n/a 19 2604 2636 2721 N
+ IY JH D s n/a 19 2604 2636 2721 N
+ IY JH DH b n/a 19 2594 2629 2731 N
+ IY JH DH e n/a 19 2604 2652 2720 N
+ IY JH DH s n/a 19 2604 2652 2731 N
+ IY JH EH b n/a 19 2594 2654 2750 N
+ IY JH EH e n/a 19 2604 2654 2750 N
+ IY JH EH i n/a 19 2604 2658 2752 N
+ IY JH EH s n/a 19 2604 2654 2750 N
+ IY JH ER b n/a 19 2594 2698 2761 N
+ IY JH ER e n/a 19 2604 2698 2783 N
+ IY JH ER i n/a 19 2604 2697 2761 N
+ IY JH ER s n/a 19 2604 2698 2761 N
+ IY JH EY b n/a 19 2594 2654 2750 N
+ IY JH EY e n/a 19 2604 2654 2750 N
+ IY JH EY i n/a 19 2604 2659 2753 N
+ IY JH EY s n/a 19 2604 2654 2750 N
+ IY JH F b n/a 19 2594 2634 2740 N
+ IY JH F e n/a 19 2604 2639 2740 N
+ IY JH F i n/a 19 2604 2633 2740 N
+ IY JH F s n/a 19 2604 2634 2740 N
+ IY JH G b n/a 19 2594 2647 2726 N
+ IY JH G e n/a 19 2604 2644 2727 N
+ IY JH G i n/a 19 2604 2644 2726 N
+ IY JH G s n/a 19 2604 2644 2726 N
+ IY JH HH e n/a 19 2604 2634 2729 N
+ IY JH HH i n/a 19 2604 2633 2729 N
+ IY JH HH s n/a 19 2604 2634 2729 N
+ IY JH IH e n/a 19 2604 2654 2769 N
+ IY JH IH i n/a 19 2604 2656 2772 N
+ IY JH IH s n/a 19 2604 2654 2769 N
+ IY JH IY b n/a 19 2594 2654 2770 N
+ IY JH IY e n/a 19 2604 2654 2770 N
+ IY JH IY i n/a 19 2604 2656 2770 N
+ IY JH IY s n/a 19 2604 2654 2770 N
+ IY JH JH b n/a 19 2594 2636 2725 N
+ IY JH JH e n/a 19 2604 2643 2725 N
+ IY JH JH i n/a 19 2604 2636 2725 N
+ IY JH JH s n/a 19 2604 2636 2725 N
+ IY JH K b n/a 19 2594 2647 2726 N
+ IY JH K e n/a 19 2604 2644 2726 N
+ IY JH K i n/a 19 2604 2644 2726 N
+ IY JH K s n/a 19 2604 2644 2726 N
+ IY JH L b n/a 19 2594 2698 2778 N
+ IY JH L e n/a 19 2604 2713 2774 N
+ IY JH L i n/a 19 2604 2699 2779 N
+ IY JH L s n/a 19 2604 2698 2778 N
+ IY JH M b n/a 19 2594 2674 2763 N
+ IY JH M e n/a 19 2604 2674 2763 N
+ IY JH M i n/a 19 2604 2664 2766 N
+ IY JH M s n/a 19 2604 2674 2763 N
+ IY JH N b n/a 19 2594 2674 2762 N
+ IY JH N e n/a 19 2604 2674 2762 N
+ IY JH N i n/a 19 2604 2664 2765 N
+ IY JH N s n/a 19 2604 2674 2762 N
+ IY JH NG b n/a 19 2594 2674 2762 N
+ IY JH NG e n/a 19 2604 2674 2762 N
+ IY JH NG s n/a 19 2604 2674 2762 N
+ IY JH OW b n/a 19 2594 2698 2780 N
+ IY JH OW e n/a 19 2604 2698 2782 N
+ IY JH OW i n/a 19 2604 2699 2780 N
+ IY JH OW s n/a 19 2604 2698 2780 N
+ IY JH OY e n/a 19 2604 2654 2757 N
+ IY JH OY i n/a 19 2604 2659 2752 N
+ IY JH OY s n/a 19 2604 2654 2748 N
+ IY JH P b n/a 19 2594 2640 2715 N
+ IY JH P e n/a 19 2604 2640 2716 N
+ IY JH P i n/a 19 2604 2640 2715 N
+ IY JH P s n/a 19 2604 2640 2715 N
+ IY JH R b n/a 19 2594 2698 2761 N
+ IY JH R e n/a 19 2604 2713 2776 N
+ IY JH R i n/a 19 2604 2697 2761 N
+ IY JH R s n/a 19 2604 2698 2761 N
+ IY JH S b n/a 19 2594 2632 2736 N
+ IY JH S e n/a 19 2604 2639 2736 N
+ IY JH S i n/a 19 2604 2631 2736 N
+ IY JH S s n/a 19 2604 2632 2736 N
+ IY JH SH b n/a 19 2594 2634 2739 N
+ IY JH SH e n/a 19 2604 2639 2739 N
+ IY JH SH i n/a 19 2604 2633 2739 N
+ IY JH SH s n/a 19 2604 2634 2739 N
+ IY JH SIL e n/a 19 2604 2648 2744 N
+ IY JH SIL s n/a 19 2604 2648 2744 N
+ IY JH T b n/a 19 2594 2632 2723 N
+ IY JH T e n/a 19 2604 2643 2724 N
+ IY JH T i n/a 19 2604 2631 2723 N
+ IY JH T s n/a 19 2604 2632 2723 N
+ IY JH TH b n/a 19 2594 2632 2741 N
+ IY JH TH e n/a 19 2604 2639 2741 N
+ IY JH TH i n/a 19 2604 2631 2741 N
+ IY JH TH s n/a 19 2604 2632 2741 N
+ IY JH UH e n/a 19 2604 2698 2783 N
+ IY JH UH s n/a 19 2604 2698 2783 N
+ IY JH UW b n/a 19 2594 2698 2780 N
+ IY JH UW e n/a 19 2604 2698 2782 N
+ IY JH UW i n/a 19 2604 2699 2780 N
+ IY JH UW s n/a 19 2604 2698 2780 N
+ IY JH V b n/a 19 2594 2629 2731 N
+ IY JH V e n/a 19 2604 2652 2720 N
+ IY JH V i n/a 19 2604 2652 2731 N
+ IY JH V s n/a 19 2604 2652 2731 N
+ IY JH W b n/a 19 2594 2713 2776 N
+ IY JH W e n/a 19 2604 2713 2776 N
+ IY JH W i n/a 19 2604 2713 2776 N
+ IY JH W s n/a 19 2604 2713 2776 N
+ IY JH Y e n/a 19 2604 2643 2771 N
+ IY JH Y i n/a 19 2604 2636 2771 N
+ IY JH Y s n/a 19 2604 2636 2771 N
+ IY JH Z b n/a 19 2594 2629 2734 N
+ IY JH Z e n/a 19 2604 2653 2733 N
+ IY JH Z i n/a 19 2604 2651 2733 N
+ IY JH Z s n/a 19 2604 2651 2733 N
+ IY JH ZH b n/a 19 2594 2629 2734 N
+ IY JH ZH e n/a 19 2604 2652 2733 N
+ IY JH ZH s n/a 19 2604 2651 2733 N
+ IY K AA b n/a 19 2594 2698 2781 N
+ IY K AA e n/a 19 2586 2698 2781 N
+ IY K AA i n/a 19 2586 2699 2781 N
+ IY K AA s n/a 19 2586 2698 2781 N
+ IY K AE e n/a 19 2586 2654 2748 N
+ IY K AE i n/a 19 2586 2659 2752 N
+ IY K AE s n/a 19 2586 2654 2748 N
+ IY K AH b n/a 19 2594 2660 2759 N
+ IY K AH e n/a 19 2586 2660 2756 N
+ IY K AH i n/a 19 2586 2658 2759 N
+ IY K AH s n/a 19 2586 2660 2759 N
+ IY K AO b n/a 19 2594 2698 2780 N
+ IY K AO e n/a 19 2586 2698 2782 N
+ IY K AO i n/a 19 2586 2699 2780 N
+ IY K AO s n/a 19 2586 2698 2780 N
+ IY K AW e n/a 19 2586 2698 2781 N
+ IY K AW i n/a 19 2586 2699 2781 N
+ IY K AW s n/a 19 2586 2698 2781 N
+ IY K AY e n/a 19 2586 2654 2757 N
+ IY K AY i n/a 19 2586 2659 2752 N
+ IY K AY s n/a 19 2586 2654 2748 N
+ IY K B b n/a 19 2594 2637 2718 N
+ IY K B e n/a 19 2586 2637 2718 N
+ IY K B i n/a 19 2586 2637 2718 N
+ IY K B s n/a 19 2586 2637 2718 N
+ IY K CH b n/a 19 2594 2632 2723 N
+ IY K CH e n/a 19 2586 2643 2724 N
+ IY K CH i n/a 19 2586 2632 2723 N
+ IY K CH s n/a 19 2586 2632 2723 N
+ IY K D b n/a 19 2594 2636 2722 N
+ IY K D e n/a 19 2586 2643 2725 N
+ IY K D i n/a 19 2586 2636 2722 N
+ IY K D s n/a 19 2586 2636 2722 N
+ IY K DH b n/a 19 2594 2629 2731 N
+ IY K DH e n/a 19 2586 2652 2720 N
+ IY K DH s n/a 19 2586 2652 2731 N
+ IY K EH b n/a 19 2594 2654 2750 N
+ IY K EH e n/a 19 2586 2654 2750 N
+ IY K EH i n/a 19 2586 2658 2752 N
+ IY K EH s n/a 19 2586 2654 2750 N
+ IY K ER b n/a 19 2594 2698 2761 N
+ IY K ER e n/a 19 2586 2698 2783 N
+ IY K ER i n/a 19 2586 2697 2761 N
+ IY K ER s n/a 19 2586 2698 2761 N
+ IY K EY b n/a 19 2594 2654 2750 N
+ IY K EY e n/a 19 2586 2654 2750 N
+ IY K EY s n/a 19 2586 2654 2750 N
+ IY K F b n/a 19 2594 2634 2740 N
+ IY K F e n/a 19 2586 2638 2740 N
+ IY K F i n/a 19 2586 2634 2740 N
+ IY K F s n/a 19 2586 2634 2740 N
+ IY K G b n/a 19 2594 2647 2726 N
+ IY K G e n/a 19 2586 2644 2727 N
+ IY K G i n/a 19 2586 2644 2726 N
+ IY K G s n/a 19 2586 2644 2726 N
+ IY K HH e n/a 19 2586 2634 2729 N
+ IY K HH i n/a 19 2586 2633 2729 N
+ IY K HH s n/a 19 2586 2634 2729 N
+ IY K IH e n/a 19 2586 2654 2769 N
+ IY K IH i n/a 19 2586 2656 2772 N
+ IY K IH s n/a 19 2586 2654 2769 N
+ IY K IY b n/a 19 2594 2654 2770 N
+ IY K IY e n/a 19 2586 2654 2770 N
+ IY K IY i n/a 19 2586 2656 2770 N
+ IY K IY s n/a 19 2586 2654 2770 N
+ IY K JH b n/a 19 2594 2636 2725 N
+ IY K JH e n/a 19 2586 2643 2725 N
+ IY K JH i n/a 19 2586 2636 2725 N
+ IY K JH s n/a 19 2586 2636 2725 N
+ IY K K b n/a 19 2594 2647 2726 N
+ IY K K e n/a 19 2586 2644 2726 N
+ IY K K i n/a 19 2586 2644 2726 N
+ IY K K s n/a 19 2586 2644 2726 N
+ IY K L b n/a 19 2594 2698 2778 N
+ IY K L e n/a 19 2586 2708 2774 N
+ IY K L i n/a 19 2586 2699 2779 N
+ IY K L s n/a 19 2586 2698 2778 N
+ IY K M b n/a 19 2594 2674 2763 N
+ IY K M e n/a 19 2585 2674 2763 N
+ IY K M i n/a 19 2584 2665 2766 N
+ IY K M s n/a 19 2585 2674 2763 N
+ IY K N b n/a 19 2594 2674 2762 N
+ IY K N e n/a 19 2585 2674 2762 N
+ IY K N i n/a 19 2584 2665 2765 N
+ IY K N s n/a 19 2585 2674 2762 N
+ IY K NG b n/a 19 2594 2674 2762 N
+ IY K NG e n/a 19 2585 2674 2762 N
+ IY K NG s n/a 19 2585 2674 2762 N
+ IY K OW b n/a 19 2594 2698 2780 N
+ IY K OW e n/a 19 2586 2698 2782 N
+ IY K OW i n/a 19 2586 2699 2780 N
+ IY K OW s n/a 19 2586 2698 2780 N
+ IY K OY e n/a 19 2586 2654 2757 N
+ IY K OY s n/a 19 2586 2654 2748 N
+ IY K P b n/a 19 2594 2637 2716 N
+ IY K P e n/a 19 2586 2637 2716 N
+ IY K P i n/a 19 2586 2637 2716 N
+ IY K P s n/a 19 2586 2637 2716 N
+ IY K R b n/a 19 2594 2698 2761 N
+ IY K R e n/a 19 2586 2708 2776 N
+ IY K R i n/a 19 2586 2697 2761 N
+ IY K R s n/a 19 2586 2698 2761 N
+ IY K S b n/a 19 2594 2632 2736 N
+ IY K S e n/a 19 2586 2638 2736 N
+ IY K S i n/a 19 2586 2632 2736 N
+ IY K S s n/a 19 2586 2632 2736 N
+ IY K SH b n/a 19 2594 2634 2739 N
+ IY K SH e n/a 19 2586 2638 2739 N
+ IY K SH i n/a 19 2586 2634 2739 N
+ IY K SH s n/a 19 2586 2634 2739 N
+ IY K SIL e n/a 19 2586 2648 2744 N
+ IY K SIL s n/a 19 2586 2648 2745 N
+ IY K T b n/a 19 2594 2632 2723 N
+ IY K T e n/a 19 2586 2643 2724 N
+ IY K T i n/a 19 2586 2632 2723 N
+ IY K T s n/a 19 2586 2632 2723 N
+ IY K TH b n/a 19 2594 2632 2741 N
+ IY K TH e n/a 19 2586 2638 2741 N
+ IY K TH i n/a 19 2586 2632 2741 N
+ IY K TH s n/a 19 2586 2632 2741 N
+ IY K UH e n/a 19 2586 2698 2783 N
+ IY K UH s n/a 19 2586 2698 2783 N
+ IY K UW b n/a 19 2594 2698 2780 N
+ IY K UW e n/a 19 2586 2698 2782 N
+ IY K UW i n/a 19 2586 2699 2780 N
+ IY K UW s n/a 19 2586 2698 2780 N
+ IY K V b n/a 19 2594 2629 2731 N
+ IY K V e n/a 19 2586 2652 2720 N
+ IY K V i n/a 19 2586 2652 2731 N
+ IY K V s n/a 19 2586 2652 2731 N
+ IY K W b n/a 19 2594 2708 2776 N
+ IY K W e n/a 19 2586 2708 2776 N
+ IY K W i n/a 19 2586 2708 2776 N
+ IY K W s n/a 19 2586 2708 2776 N
+ IY K Y e n/a 19 2586 2643 2771 N
+ IY K Y i n/a 19 2586 2636 2771 N
+ IY K Y s n/a 19 2586 2636 2771 N
+ IY K Z b n/a 19 2594 2629 2734 N
+ IY K Z e n/a 19 2586 2653 2733 N
+ IY K Z i n/a 19 2586 2651 2733 N
+ IY K Z s n/a 19 2586 2651 2733 N
+ IY K ZH b n/a 19 2594 2629 2734 N
+ IY K ZH e n/a 19 2586 2652 2733 N
+ IY K ZH s n/a 19 2586 2651 2733 N
+ IY L AA b n/a 19 2623 2706 2781 N
+ IY L AA e n/a 19 2623 2706 2781 N
+ IY L AA i n/a 19 2623 2706 2781 N
+ IY L AA s n/a 19 2623 2706 2781 N
+ IY L AE e n/a 19 2623 2707 2748 N
+ IY L AE i n/a 19 2623 2707 2752 N
+ IY L AE s n/a 19 2623 2707 2748 N
+ IY L AH b n/a 19 2623 2706 2759 N
+ IY L AH e n/a 19 2623 2706 2756 N
+ IY L AH i n/a 19 2623 2706 2759 N
+ IY L AH s n/a 19 2623 2706 2759 N
+ IY L AO b n/a 19 2625 2706 2780 N
+ IY L AO e n/a 19 2625 2706 2782 N
+ IY L AO i n/a 19 2625 2706 2780 N
+ IY L AO s n/a 19 2625 2706 2780 N
+ IY L AW e n/a 19 2623 2707 2781 N
+ IY L AW i n/a 19 2623 2707 2781 N
+ IY L AW s n/a 19 2623 2707 2781 N
+ IY L AY e n/a 19 2623 2706 2757 N
+ IY L AY i n/a 19 2623 2706 2752 N
+ IY L AY s n/a 19 2623 2706 2748 N
+ IY L B b n/a 19 2622 2677 2718 N
+ IY L B e n/a 19 2625 2687 2718 N
+ IY L B i n/a 19 2622 2677 2718 N
+ IY L B s n/a 19 2622 2677 2718 N
+ IY L CH b n/a 19 2622 2696 2723 N
+ IY L CH e n/a 19 2625 2687 2724 N
+ IY L CH i n/a 19 2622 2696 2723 N
+ IY L CH s n/a 19 2622 2696 2723 N
+ IY L D b n/a 19 2622 2677 2722 N
+ IY L D e n/a 19 2625 2687 2725 N
+ IY L D i n/a 19 2622 2677 2722 N
+ IY L D s n/a 19 2622 2677 2722 N
+ IY L DH b n/a 19 2622 2677 2731 N
+ IY L DH e n/a 19 2623 2682 2719 N
+ IY L DH i n/a 19 2622 2677 2731 N
+ IY L DH s n/a 19 2622 2677 2731 N
+ IY L EH b n/a 19 2623 2707 2750 N
+ IY L EH e n/a 19 2623 2707 2750 N
+ IY L EH i n/a 19 2623 2707 2752 N
+ IY L EH s n/a 19 2623 2707 2750 N
+ IY L ER b n/a 19 2625 2706 2761 N
+ IY L ER e n/a 19 2625 2706 2783 N
+ IY L ER i n/a 19 2625 2706 2761 N
+ IY L ER s n/a 19 2625 2706 2761 N
+ IY L EY b n/a 19 2623 2707 2749 N
+ IY L EY e n/a 19 2623 2707 2749 N
+ IY L EY i n/a 19 2623 2707 2753 N
+ IY L EY s n/a 19 2623 2707 2749 N
+ IY L F b n/a 19 2622 2696 2740 N
+ IY L F e n/a 19 2625 2685 2740 N
+ IY L F i n/a 19 2622 2696 2740 N
+ IY L F s n/a 19 2622 2696 2740 N
+ IY L G b n/a 19 2622 2677 2726 N
+ IY L G e n/a 19 2625 2688 2727 N
+ IY L G i n/a 19 2622 2677 2726 N
+ IY L G s n/a 19 2622 2677 2726 N
+ IY L HH e n/a 19 2625 2686 2729 N
+ IY L HH i n/a 19 2622 2696 2729 N
+ IY L HH s n/a 19 2622 2696 2729 N
+ IY L IH e n/a 19 2623 2707 2769 N
+ IY L IH i n/a 19 2623 2707 2772 N
+ IY L IH s n/a 19 2623 2707 2769 N
+ IY L IY b n/a 19 2623 2707 2770 N
+ IY L IY e n/a 19 2623 2707 2770 N
+ IY L IY s n/a 19 2623 2707 2770 N
+ IY L JH b n/a 19 2622 2677 2725 N
+ IY L JH e n/a 19 2625 2687 2725 N
+ IY L JH i n/a 19 2622 2677 2725 N
+ IY L JH s n/a 19 2622 2677 2725 N
+ IY L K b n/a 19 2622 2696 2726 N
+ IY L K e n/a 19 2625 2688 2728 N
+ IY L K i n/a 19 2622 2696 2726 N
+ IY L K s n/a 19 2622 2696 2726 N
+ IY L L b n/a 19 2622 2710 2778 N
+ IY L L e n/a 19 2625 2711 2774 N
+ IY L L i n/a 19 2622 2710 2779 N
+ IY L L s n/a 19 2622 2710 2778 N
+ IY L M b n/a 19 2622 2681 2763 N
+ IY L M e n/a 19 2625 2686 2763 N
+ IY L M i n/a 19 2622 2681 2766 N
+ IY L M s n/a 19 2622 2681 2763 N
+ IY L N b n/a 19 2622 2681 2762 N
+ IY L N e n/a 19 2625 2686 2762 N
+ IY L N i n/a 19 2622 2681 2765 N
+ IY L N s n/a 19 2622 2681 2762 N
+ IY L NG b n/a 19 2622 2681 2762 N
+ IY L NG e n/a 19 2625 2686 2762 N
+ IY L NG i n/a 19 2622 2681 2765 N
+ IY L NG s n/a 19 2622 2681 2762 N
+ IY L OW b n/a 19 2625 2706 2780 N
+ IY L OW e n/a 19 2625 2706 2782 N
+ IY L OW i n/a 19 2625 2706 2780 N
+ IY L OW s n/a 19 2625 2706 2780 N
+ IY L OY e n/a 19 2625 2706 2757 N
+ IY L OY i n/a 19 2625 2706 2752 N
+ IY L OY s n/a 19 2625 2706 2748 N
+ IY L P b n/a 19 2622 2696 2715 N
+ IY L P e n/a 19 2625 2687 2717 N
+ IY L P i n/a 19 2622 2696 2715 N
+ IY L P s n/a 19 2622 2696 2715 N
+ IY L R b n/a 19 2622 2710 2761 N
+ IY L R e n/a 19 2625 2711 2775 N
+ IY L R i n/a 19 2622 2710 2761 N
+ IY L R s n/a 19 2622 2710 2761 N
+ IY L S b n/a 19 2622 2696 2736 N
+ IY L S e n/a 19 2625 2685 2737 N
+ IY L S i n/a 19 2622 2696 2736 N
+ IY L S s n/a 19 2622 2696 2736 N
+ IY L SH b n/a 19 2622 2696 2739 N
+ IY L SH e n/a 19 2625 2685 2739 N
+ IY L SH i n/a 19 2622 2696 2739 N
+ IY L SH s n/a 19 2622 2696 2739 N
+ IY L SIL e n/a 19 2624 2683 2747 N
+ IY L SIL s n/a 19 2624 2677 2747 N
+ IY L T b n/a 19 2622 2696 2723 N
+ IY L T e n/a 19 2625 2687 2724 N
+ IY L T i n/a 19 2622 2696 2723 N
+ IY L T s n/a 19 2622 2696 2723 N
+ IY L TH b n/a 19 2622 2696 2741 N
+ IY L TH e n/a 19 2625 2685 2741 N
+ IY L TH i n/a 19 2622 2696 2741 N
+ IY L TH s n/a 19 2622 2696 2741 N
+ IY L UH e n/a 19 2625 2707 2783 N
+ IY L UH i n/a 19 2625 2707 2783 N
+ IY L UH s n/a 19 2625 2707 2783 N
+ IY L UW b n/a 19 2625 2707 2780 N
+ IY L UW e n/a 19 2625 2707 2782 N
+ IY L UW i n/a 19 2625 2707 2780 N
+ IY L UW s n/a 19 2625 2707 2780 N
+ IY L V b n/a 19 2622 2677 2731 N
+ IY L V e n/a 19 2623 2682 2720 N
+ IY L V i n/a 19 2622 2677 2731 N
+ IY L V s n/a 19 2622 2677 2731 N
+ IY L W b n/a 19 2622 2711 2775 N
+ IY L W e n/a 19 2625 2711 2775 N
+ IY L W i n/a 19 2622 2711 2775 N
+ IY L W s n/a 19 2622 2711 2775 N
+ IY L Y e n/a 19 2625 2707 2771 N
+ IY L Y i n/a 19 2622 2707 2771 N
+ IY L Y s n/a 19 2622 2707 2771 N
+ IY L Z b n/a 19 2622 2677 2734 N
+ IY L Z e n/a 19 2623 2682 2733 N
+ IY L Z i n/a 19 2622 2677 2733 N
+ IY L Z s n/a 19 2622 2677 2733 N
+ IY L ZH b n/a 19 2622 2677 2734 N
+ IY L ZH e n/a 19 2623 2682 2733 N
+ IY L ZH i n/a 19 2622 2677 2733 N
+ IY L ZH s n/a 19 2622 2677 2733 N
+ IY M AA b n/a 19 2616 2702 2781 N
+ IY M AA e n/a 19 2620 2702 2781 N
+ IY M AA i n/a 19 2620 2702 2781 N
+ IY M AA s n/a 19 2620 2702 2781 N
+ IY M AE e n/a 19 2620 2668 2748 N
+ IY M AE i n/a 19 2620 2668 2752 N
+ IY M AE s n/a 19 2620 2668 2748 N
+ IY M AH b n/a 19 2616 2667 2758 N
+ IY M AH e n/a 19 2620 2667 2756 N
+ IY M AH i n/a 19 2620 2667 2758 N
+ IY M AH s n/a 19 2620 2667 2758 N
+ IY M AO b n/a 19 2616 2702 2780 N
+ IY M AO e n/a 19 2620 2702 2782 N
+ IY M AO i n/a 19 2620 2702 2780 N
+ IY M AO s n/a 19 2620 2702 2780 N
+ IY M AW e n/a 19 2620 2702 2781 N
+ IY M AW i n/a 19 2620 2702 2781 N
+ IY M AW s n/a 19 2620 2702 2781 N
+ IY M AY e n/a 19 2620 2668 2757 N
+ IY M AY i n/a 19 2620 2668 2752 N
+ IY M AY s n/a 19 2620 2668 2748 N
+ IY M B b n/a 19 2616 2676 2718 N
+ IY M B e n/a 19 2620 2672 2718 N
+ IY M B i n/a 19 2620 2672 2718 N
+ IY M B s n/a 19 2620 2676 2718 N
+ IY M CH b n/a 19 2616 2676 2723 N
+ IY M CH e n/a 19 2620 2672 2723 N
+ IY M CH i n/a 19 2620 2672 2723 N
+ IY M CH s n/a 19 2620 2676 2723 N
+ IY M D b n/a 19 2616 2676 2722 N
+ IY M D e n/a 19 2620 2672 2725 N
+ IY M D i n/a 19 2620 2676 2722 N
+ IY M D s n/a 19 2620 2676 2722 N
+ IY M DH b n/a 19 2616 2676 2731 N
+ IY M DH e n/a 19 2620 2672 2720 N
+ IY M DH i n/a 19 2620 2672 2731 N
+ IY M DH s n/a 19 2620 2676 2731 N
+ IY M EH b n/a 19 2616 2667 2750 N
+ IY M EH e n/a 19 2620 2667 2750 N
+ IY M EH i n/a 19 2620 2667 2752 N
+ IY M EH s n/a 19 2620 2667 2750 N
+ IY M ER b n/a 19 2616 2702 2761 N
+ IY M ER e n/a 19 2620 2702 2783 N
+ IY M ER i n/a 19 2620 2702 2761 N
+ IY M ER s n/a 19 2620 2702 2761 N
+ IY M EY b n/a 19 2616 2667 2749 N
+ IY M EY e n/a 19 2620 2667 2749 N
+ IY M EY i n/a 19 2620 2667 2753 N
+ IY M EY s n/a 19 2620 2667 2749 N
+ IY M F b n/a 19 2616 2676 2740 N
+ IY M F e n/a 19 2620 2672 2740 N
+ IY M F i n/a 19 2620 2672 2740 N
+ IY M F s n/a 19 2620 2676 2740 N
+ IY M G b n/a 19 2616 2676 2726 N
+ IY M G e n/a 19 2620 2672 2727 N
+ IY M G i n/a 19 2620 2672 2726 N
+ IY M G s n/a 19 2620 2676 2726 N
+ IY M HH e n/a 19 2620 2672 2729 N
+ IY M HH i n/a 19 2620 2672 2729 N
+ IY M HH s n/a 19 2620 2676 2729 N
+ IY M IH e n/a 19 2620 2668 2769 N
+ IY M IH i n/a 19 2620 2668 2772 N
+ IY M IH s n/a 19 2620 2668 2769 N
+ IY M IY b n/a 19 2616 2668 2770 N
+ IY M IY e n/a 19 2620 2668 2770 N
+ IY M IY i n/a 19 2620 2668 2770 N
+ IY M IY s n/a 19 2620 2668 2770 N
+ IY M JH b n/a 19 2616 2676 2725 N
+ IY M JH e n/a 19 2620 2672 2725 N
+ IY M JH s n/a 19 2620 2676 2725 N
+ IY M K b n/a 19 2616 2676 2726 N
+ IY M K e n/a 19 2620 2672 2726 N
+ IY M K i n/a 19 2620 2672 2726 N
+ IY M K s n/a 19 2620 2676 2726 N
+ IY M L b n/a 19 2616 2702 2779 N
+ IY M L e n/a 19 2620 2714 2774 N
+ IY M L i n/a 19 2620 2702 2779 N
+ IY M L s n/a 19 2620 2702 2779 N
+ IY M M b n/a 19 2616 2676 2764 N
+ IY M M e n/a 19 2620 2672 2764 N
+ IY M M i n/a 19 2620 2666 2766 N
+ IY M M s n/a 19 2620 2676 2764 N
+ IY M N b n/a 19 2616 2676 2762 N
+ IY M N e n/a 19 2620 2672 2762 N
+ IY M N i n/a 19 2620 2666 2765 N
+ IY M N s n/a 19 2620 2676 2762 N
+ IY M NG b n/a 19 2616 2676 2762 N
+ IY M NG e n/a 19 2620 2672 2762 N
+ IY M NG i n/a 19 2620 2666 2765 N
+ IY M NG s n/a 19 2620 2676 2762 N
+ IY M OW b n/a 19 2616 2702 2780 N
+ IY M OW e n/a 19 2620 2702 2782 N
+ IY M OW i n/a 19 2620 2702 2780 N
+ IY M OW s n/a 19 2620 2702 2780 N
+ IY M OY e n/a 19 2620 2668 2757 N
+ IY M OY s n/a 19 2620 2668 2748 N
+ IY M P b n/a 19 2616 2676 2715 N
+ IY M P e n/a 19 2620 2672 2715 N
+ IY M P i n/a 19 2620 2672 2716 N
+ IY M P s n/a 19 2620 2676 2715 N
+ IY M R b n/a 19 2616 2702 2761 N
+ IY M R e n/a 19 2620 2714 2776 N
+ IY M R i n/a 19 2620 2702 2761 N
+ IY M R s n/a 19 2620 2702 2761 N
+ IY M S b n/a 19 2616 2676 2736 N
+ IY M S e n/a 19 2620 2672 2736 N
+ IY M S i n/a 19 2620 2672 2736 N
+ IY M S s n/a 19 2620 2676 2736 N
+ IY M SH b n/a 19 2616 2676 2739 N
+ IY M SH e n/a 19 2620 2672 2739 N
+ IY M SH i n/a 19 2620 2672 2739 N
+ IY M SH s n/a 19 2620 2676 2739 N
+ IY M SIL e n/a 19 2621 2669 2746 N
+ IY M SIL s n/a 19 2621 2669 2746 N
+ IY M T b n/a 19 2616 2676 2723 N
+ IY M T e n/a 19 2620 2672 2723 N
+ IY M T i n/a 19 2620 2676 2723 N
+ IY M T s n/a 19 2620 2676 2723 N
+ IY M TH b n/a 19 2616 2676 2741 N
+ IY M TH e n/a 19 2620 2672 2741 N
+ IY M TH i n/a 19 2620 2672 2741 N
+ IY M TH s n/a 19 2620 2676 2741 N
+ IY M UH e n/a 19 2620 2702 2783 N
+ IY M UH i n/a 19 2620 2702 2783 N
+ IY M UH s n/a 19 2620 2702 2783 N
+ IY M UW b n/a 19 2616 2702 2780 N
+ IY M UW e n/a 19 2620 2702 2782 N
+ IY M UW i n/a 19 2620 2702 2780 N
+ IY M UW s n/a 19 2620 2702 2780 N
+ IY M V b n/a 19 2616 2676 2731 N
+ IY M V e n/a 19 2620 2672 2720 N
+ IY M V i n/a 19 2620 2672 2731 N
+ IY M V s n/a 19 2620 2676 2731 N
+ IY M W b n/a 19 2616 2714 2776 N
+ IY M W e n/a 19 2620 2714 2776 N
+ IY M W i n/a 19 2620 2714 2776 N
+ IY M W s n/a 19 2620 2714 2776 N
+ IY M Y e n/a 19 2620 2672 2771 N
+ IY M Y i n/a 19 2620 2672 2771 N
+ IY M Y s n/a 19 2620 2676 2771 N
+ IY M Z b n/a 19 2616 2670 2733 N
+ IY M Z e n/a 19 2620 2672 2733 N
+ IY M Z i n/a 19 2620 2670 2733 N
+ IY M Z s n/a 19 2620 2670 2733 N
+ IY M ZH b n/a 19 2616 2676 2733 N
+ IY M ZH e n/a 19 2620 2672 2733 N
+ IY M ZH i n/a 19 2620 2672 2733 N
+ IY M ZH s n/a 19 2620 2676 2733 N
+ IY N AA b n/a 19 2616 2702 2781 N
+ IY N AA e n/a 19 2619 2702 2781 N
+ IY N AA i n/a 19 2618 2702 2781 N
+ IY N AA s n/a 19 2618 2702 2781 N
+ IY N AE e n/a 19 2619 2668 2748 N
+ IY N AE i n/a 19 2618 2667 2752 N
+ IY N AE s n/a 19 2618 2668 2748 N
+ IY N AH b n/a 19 2616 2667 2758 N
+ IY N AH e n/a 19 2619 2667 2754 N
+ IY N AH i n/a 19 2618 2667 2758 N
+ IY N AH s n/a 19 2618 2667 2758 N
+ IY N AO b n/a 19 2616 2702 2780 N
+ IY N AO e n/a 19 2619 2702 2782 N
+ IY N AO i n/a 19 2618 2702 2780 N
+ IY N AO s n/a 19 2618 2702 2780 N
+ IY N AW e n/a 19 2619 2702 2781 N
+ IY N AW i n/a 19 2618 2702 2781 N
+ IY N AW s n/a 19 2618 2702 2781 N
+ IY N AY e n/a 19 2619 2667 2757 N
+ IY N AY i n/a 19 2618 2667 2752 N
+ IY N AY s n/a 19 2618 2667 2748 N
+ IY N B b n/a 19 2616 2676 2718 N
+ IY N B e n/a 19 2619 2672 2718 N
+ IY N B i n/a 19 2618 2672 2718 N
+ IY N B s n/a 19 2618 2676 2718 N
+ IY N CH b n/a 19 2616 2676 2723 N
+ IY N CH e n/a 19 2619 2671 2723 N
+ IY N CH i n/a 19 2618 2671 2723 N
+ IY N CH s n/a 19 2618 2676 2723 N
+ IY N D b n/a 19 2616 2676 2722 N
+ IY N D e n/a 19 2619 2672 2725 N
+ IY N D i n/a 19 2618 2675 2722 N
+ IY N D s n/a 19 2618 2676 2722 N
+ IY N DH b n/a 19 2616 2676 2731 N
+ IY N DH e n/a 19 2619 2672 2719 N
+ IY N DH i n/a 19 2618 2672 2731 N
+ IY N DH s n/a 19 2618 2676 2731 N
+ IY N EH b n/a 19 2616 2667 2750 N
+ IY N EH e n/a 19 2619 2667 2750 N
+ IY N EH i n/a 19 2618 2667 2752 N
+ IY N EH s n/a 19 2618 2667 2750 N
+ IY N ER b n/a 19 2616 2702 2761 N
+ IY N ER e n/a 19 2619 2702 2783 N
+ IY N ER i n/a 19 2618 2702 2761 N
+ IY N ER s n/a 19 2618 2702 2761 N
+ IY N EY b n/a 19 2616 2668 2749 N
+ IY N EY e n/a 19 2619 2668 2749 N
+ IY N EY i n/a 19 2618 2667 2753 N
+ IY N EY s n/a 19 2618 2668 2749 N
+ IY N F b n/a 19 2616 2676 2740 N
+ IY N F e n/a 19 2619 2671 2740 N
+ IY N F i n/a 19 2619 2671 2740 N
+ IY N F s n/a 19 2619 2676 2740 N
+ IY N G b n/a 19 2616 2676 2726 N
+ IY N G e n/a 19 2619 2672 2727 N
+ IY N G i n/a 19 2618 2672 2726 N
+ IY N G s n/a 19 2618 2676 2726 N
+ IY N HH e n/a 19 2619 2672 2729 N
+ IY N HH i n/a 19 2618 2672 2729 N
+ IY N HH s n/a 19 2618 2676 2729 N
+ IY N IH e n/a 19 2619 2668 2769 N
+ IY N IH i n/a 19 2618 2667 2772 N
+ IY N IH s n/a 19 2618 2668 2769 N
+ IY N IY b n/a 19 2616 2668 2770 N
+ IY N IY e n/a 19 2619 2668 2770 N
+ IY N IY s n/a 19 2618 2668 2770 N
+ IY N JH b n/a 19 2616 2676 2725 N
+ IY N JH e n/a 19 2619 2672 2725 N
+ IY N JH i n/a 19 2618 2672 2725 N
+ IY N JH s n/a 19 2618 2676 2725 N
+ IY N K b n/a 19 2616 2676 2726 N
+ IY N K e n/a 19 2619 2671 2726 N
+ IY N K i n/a 19 2618 2671 2726 N
+ IY N K s n/a 19 2618 2676 2726 N
+ IY N L b n/a 19 2616 2702 2779 N
+ IY N L e n/a 19 2619 2714 2774 N
+ IY N L i n/a 19 2618 2702 2779 N
+ IY N L s n/a 19 2618 2702 2779 N
+ IY N M b n/a 19 2616 2676 2764 N
+ IY N M e n/a 19 2619 2672 2764 N
+ IY N M i n/a 19 2618 2666 2766 N
+ IY N M s n/a 19 2618 2676 2764 N
+ IY N N b n/a 19 2616 2676 2762 N
+ IY N N e n/a 19 2619 2672 2762 N
+ IY N N i n/a 19 2618 2666 2765 N
+ IY N N s n/a 19 2618 2676 2762 N
+ IY N NG b n/a 19 2616 2676 2762 N
+ IY N NG e n/a 19 2619 2672 2762 N
+ IY N NG i n/a 19 2618 2666 2765 N
+ IY N NG s n/a 19 2618 2676 2762 N
+ IY N OW b n/a 19 2616 2702 2780 N
+ IY N OW e n/a 19 2619 2702 2782 N
+ IY N OW i n/a 19 2618 2702 2780 N
+ IY N OW s n/a 19 2618 2702 2780 N
+ IY N OY e n/a 19 2619 2667 2757 N
+ IY N OY s n/a 19 2618 2667 2748 N
+ IY N P b n/a 19 2616 2676 2715 N
+ IY N P e n/a 19 2619 2671 2715 N
+ IY N P i n/a 19 2618 2671 2715 N
+ IY N P s n/a 19 2618 2676 2715 N
+ IY N R b n/a 19 2616 2702 2761 N
+ IY N R e n/a 19 2619 2714 2776 N
+ IY N R i n/a 19 2618 2702 2761 N
+ IY N R s n/a 19 2618 2702 2761 N
+ IY N S b n/a 19 2616 2676 2736 N
+ IY N S e n/a 19 2619 2671 2736 N
+ IY N S i n/a 19 2616 2671 2736 N
+ IY N S s n/a 19 2616 2676 2736 N
+ IY N SH b n/a 19 2616 2676 2739 N
+ IY N SH e n/a 19 2619 2671 2739 N
+ IY N SH i n/a 19 2616 2671 2739 N
+ IY N SH s n/a 19 2616 2676 2739 N
+ IY N SIL e n/a 19 2619 2669 2746 N
+ IY N SIL s n/a 19 2619 2669 2746 N
+ IY N T b n/a 19 2616 2676 2723 N
+ IY N T e n/a 19 2619 2671 2723 N
+ IY N T i n/a 19 2618 2676 2723 N
+ IY N T s n/a 19 2618 2676 2723 N
+ IY N TH b n/a 19 2616 2676 2741 N
+ IY N TH e n/a 19 2619 2671 2741 N
+ IY N TH i n/a 19 2619 2671 2741 N
+ IY N TH s n/a 19 2619 2676 2741 N
+ IY N UH e n/a 19 2619 2702 2783 N
+ IY N UH s n/a 19 2618 2702 2783 N
+ IY N UW b n/a 19 2616 2702 2780 N
+ IY N UW e n/a 19 2619 2702 2782 N
+ IY N UW i n/a 19 2618 2702 2780 N
+ IY N UW s n/a 19 2618 2702 2780 N
+ IY N V b n/a 19 2616 2676 2731 N
+ IY N V e n/a 19 2619 2672 2720 N
+ IY N V i n/a 19 2618 2672 2731 N
+ IY N V s n/a 19 2618 2676 2731 N
+ IY N W b n/a 19 2616 2714 2776 N
+ IY N W e n/a 19 2619 2714 2776 N
+ IY N W i n/a 19 2618 2714 2776 N
+ IY N W s n/a 19 2618 2714 2776 N
+ IY N Y e n/a 19 2619 2672 2771 N
+ IY N Y i n/a 19 2618 2672 2771 N
+ IY N Y s n/a 19 2618 2676 2771 N
+ IY N Z b n/a 19 2616 2670 2733 N
+ IY N Z e n/a 19 2619 2672 2733 N
+ IY N Z i n/a 19 2619 2670 2733 N
+ IY N Z s n/a 19 2619 2670 2733 N
+ IY N ZH b n/a 19 2616 2676 2733 N
+ IY N ZH e n/a 19 2619 2672 2733 N
+ IY N ZH i n/a 19 2618 2672 2733 N
+ IY N ZH s n/a 19 2618 2676 2733 N
+ IY NG AA b n/a 19 2616 2702 2781 N
+ IY NG AA e n/a 19 2619 2702 2781 N
+ IY NG AA s n/a 19 2618 2702 2781 N
+ IY NG AE e n/a 19 2619 2668 2748 N
+ IY NG AE s n/a 19 2618 2668 2748 N
+ IY NG AH b n/a 19 2616 2667 2758 N
+ IY NG AH e n/a 19 2619 2667 2756 N
+ IY NG AH s n/a 19 2618 2667 2758 N
+ IY NG AO b n/a 19 2616 2702 2780 N
+ IY NG AO e n/a 19 2619 2702 2782 N
+ IY NG AO s n/a 19 2618 2702 2780 N
+ IY NG AW e n/a 19 2619 2702 2781 N
+ IY NG AW s n/a 19 2618 2702 2781 N
+ IY NG AY e n/a 19 2619 2668 2757 N
+ IY NG AY s n/a 19 2618 2668 2748 N
+ IY NG B b n/a 19 2616 2676 2718 N
+ IY NG B e n/a 19 2619 2672 2718 N
+ IY NG B s n/a 19 2618 2676 2718 N
+ IY NG CH b n/a 19 2616 2676 2723 N
+ IY NG CH e n/a 19 2619 2672 2723 N
+ IY NG CH s n/a 19 2618 2676 2723 N
+ IY NG D b n/a 19 2616 2676 2722 N
+ IY NG D e n/a 19 2619 2672 2725 N
+ IY NG D s n/a 19 2618 2676 2722 N
+ IY NG DH b n/a 19 2616 2676 2731 N
+ IY NG DH e n/a 19 2619 2672 2720 N
+ IY NG DH s n/a 19 2618 2676 2731 N
+ IY NG EH b n/a 19 2616 2667 2750 N
+ IY NG EH e n/a 19 2619 2667 2750 N
+ IY NG EH s n/a 19 2618 2667 2750 N
+ IY NG ER b n/a 19 2616 2702 2761 N
+ IY NG ER e n/a 19 2619 2702 2783 N
+ IY NG ER s n/a 19 2618 2702 2761 N
+ IY NG EY b n/a 19 2616 2667 2749 N
+ IY NG EY e n/a 19 2619 2667 2749 N
+ IY NG EY s n/a 19 2618 2667 2749 N
+ IY NG F b n/a 19 2616 2676 2740 N
+ IY NG F e n/a 19 2619 2672 2740 N
+ IY NG F s n/a 19 2619 2676 2740 N
+ IY NG G b n/a 19 2616 2676 2726 N
+ IY NG G e n/a 19 2619 2672 2727 N
+ IY NG G s n/a 19 2618 2676 2726 N
+ IY NG HH e n/a 19 2619 2672 2729 N
+ IY NG HH s n/a 19 2618 2676 2729 N
+ IY NG IH e n/a 19 2619 2668 2769 N
+ IY NG IH s n/a 19 2618 2668 2769 N
+ IY NG IY b n/a 19 2616 2668 2770 N
+ IY NG IY e n/a 19 2619 2668 2770 N
+ IY NG IY s n/a 19 2618 2668 2770 N
+ IY NG JH b n/a 19 2616 2676 2725 N
+ IY NG JH e n/a 19 2619 2672 2725 N
+ IY NG JH s n/a 19 2618 2676 2725 N
+ IY NG K b n/a 19 2616 2676 2726 N
+ IY NG K e n/a 19 2619 2672 2726 N
+ IY NG K s n/a 19 2618 2676 2726 N
+ IY NG L b n/a 19 2616 2702 2779 N
+ IY NG L e n/a 19 2619 2714 2774 N
+ IY NG L s n/a 19 2618 2702 2779 N
+ IY NG M b n/a 19 2616 2676 2764 N
+ IY NG M e n/a 19 2619 2672 2764 N
+ IY NG M s n/a 19 2618 2676 2764 N
+ IY NG N b n/a 19 2616 2676 2762 N
+ IY NG N e n/a 19 2619 2672 2762 N
+ IY NG N i n/a 19 2618 2666 2765 N
+ IY NG N s n/a 19 2618 2676 2762 N
+ IY NG NG b n/a 19 2616 2676 2762 N
+ IY NG NG e n/a 19 2619 2672 2762 N
+ IY NG NG s n/a 19 2618 2676 2762 N
+ IY NG OW b n/a 19 2616 2702 2780 N
+ IY NG OW e n/a 19 2619 2702 2782 N
+ IY NG OW s n/a 19 2618 2702 2780 N
+ IY NG OY e n/a 19 2619 2668 2757 N
+ IY NG OY s n/a 19 2618 2668 2748 N
+ IY NG P b n/a 19 2616 2676 2716 N
+ IY NG P e n/a 19 2619 2672 2716 N
+ IY NG P s n/a 19 2618 2676 2716 N
+ IY NG R b n/a 19 2616 2702 2761 N
+ IY NG R e n/a 19 2619 2714 2776 N
+ IY NG R s n/a 19 2618 2702 2761 N
+ IY NG S b n/a 19 2616 2676 2736 N
+ IY NG S e n/a 19 2619 2672 2736 N
+ IY NG S s n/a 19 2616 2676 2736 N
+ IY NG SH b n/a 19 2616 2676 2739 N
+ IY NG SH e n/a 19 2619 2672 2739 N
+ IY NG SH s n/a 19 2616 2676 2739 N
+ IY NG SIL e n/a 19 2619 2669 2746 N
+ IY NG SIL s n/a 19 2619 2669 2746 N
+ IY NG T b n/a 19 2616 2676 2723 N
+ IY NG T e n/a 19 2619 2672 2723 N
+ IY NG T s n/a 19 2618 2676 2723 N
+ IY NG TH b n/a 19 2616 2676 2741 N
+ IY NG TH e n/a 19 2619 2672 2741 N
+ IY NG TH s n/a 19 2619 2676 2741 N
+ IY NG UH e n/a 19 2619 2702 2783 N
+ IY NG UH s n/a 19 2618 2702 2783 N
+ IY NG UW b n/a 19 2616 2702 2780 N
+ IY NG UW e n/a 19 2619 2702 2782 N
+ IY NG UW s n/a 19 2618 2702 2780 N
+ IY NG V b n/a 19 2616 2676 2731 N
+ IY NG V e n/a 19 2619 2672 2720 N
+ IY NG V s n/a 19 2618 2676 2731 N
+ IY NG W b n/a 19 2616 2714 2776 N
+ IY NG W e n/a 19 2619 2714 2776 N
+ IY NG W s n/a 19 2618 2714 2776 N
+ IY NG Y e n/a 19 2619 2672 2771 N
+ IY NG Y s n/a 19 2618 2676 2771 N
+ IY NG Z b n/a 19 2616 2670 2733 N
+ IY NG Z e n/a 19 2619 2672 2733 N
+ IY NG Z s n/a 19 2619 2670 2733 N
+ IY NG ZH b n/a 19 2616 2676 2733 N
+ IY NG ZH e n/a 19 2619 2672 2733 N
+ IY NG ZH s n/a 19 2618 2676 2733 N
+ IY OW AA b n/a 19 2617 2706 2781 N
+ IY OW AA e n/a 19 2614 2706 2781 N
+ IY OW AA i n/a 19 2614 2706 2781 N
+ IY OW AA s n/a 19 2614 2706 2781 N
+ IY OW AE e n/a 19 2614 2707 2748 N
+ IY OW AE s n/a 19 2614 2707 2748 N
+ IY OW AH b n/a 19 2617 2706 2759 N
+ IY OW AH e n/a 19 2614 2706 2756 N
+ IY OW AH i n/a 19 2614 2706 2759 N
+ IY OW AH s n/a 19 2614 2706 2759 N
+ IY OW AO b n/a 19 2617 2706 2780 N
+ IY OW AO e n/a 19 2614 2706 2782 N
+ IY OW AO i n/a 19 2614 2706 2780 N
+ IY OW AO s n/a 19 2614 2706 2780 N
+ IY OW AW e n/a 19 2614 2707 2781 N
+ IY OW AW s n/a 19 2614 2707 2781 N
+ IY OW AY e n/a 19 2614 2706 2757 N
+ IY OW AY s n/a 19 2614 2706 2748 N
+ IY OW B b n/a 19 2617 2677 2718 N
+ IY OW B e n/a 19 2613 2687 2718 N
+ IY OW B s n/a 19 2610 2677 2718 N
+ IY OW CH b n/a 19 2617 2696 2724 N
+ IY OW CH e n/a 19 2613 2687 2724 N
+ IY OW CH i n/a 19 2609 2696 2724 N
+ IY OW CH s n/a 19 2609 2696 2724 N
+ IY OW D b n/a 19 2617 2677 2721 N
+ IY OW D e n/a 19 2613 2687 2725 N
+ IY OW D s n/a 19 2613 2677 2721 N
+ IY OW DH b n/a 19 2617 2677 2731 N
+ IY OW DH e n/a 19 2613 2682 2719 N
+ IY OW DH s n/a 19 2613 2677 2732 N
+ IY OW EH b n/a 19 2617 2707 2750 N
+ IY OW EH e n/a 19 2614 2707 2750 N
+ IY OW EH i n/a 19 2614 2707 2752 N
+ IY OW EH s n/a 19 2614 2707 2750 N
+ IY OW ER b n/a 19 2617 2706 2761 N
+ IY OW ER e n/a 19 2614 2706 2781 N
+ IY OW ER i n/a 19 2614 2706 2761 N
+ IY OW ER s n/a 19 2614 2706 2761 N
+ IY OW EY b n/a 19 2617 2707 2749 N
+ IY OW EY e n/a 19 2614 2707 2749 N
+ IY OW EY s n/a 19 2614 2707 2749 N
+ IY OW F b n/a 19 2617 2696 2740 N
+ IY OW F e n/a 19 2613 2685 2740 N
+ IY OW F s n/a 19 2609 2696 2740 N
+ IY OW G b n/a 19 2617 2677 2726 N
+ IY OW G e n/a 19 2612 2688 2727 N
+ IY OW G s n/a 19 2610 2677 2726 N
+ IY OW HH e n/a 19 2613 2686 2729 N
+ IY OW HH s n/a 19 2609 2696 2729 N
+ IY OW IH e n/a 19 2614 2707 2769 N
+ IY OW IH s n/a 19 2614 2707 2769 N
+ IY OW IY b n/a 19 2617 2707 2770 N
+ IY OW IY e n/a 19 2614 2707 2770 N
+ IY OW IY s n/a 19 2614 2707 2770 N
+ IY OW JH b n/a 19 2617 2677 2725 N
+ IY OW JH e n/a 19 2613 2687 2725 N
+ IY OW JH i n/a 19 2609 2677 2725 N
+ IY OW JH s n/a 19 2609 2677 2725 N
+ IY OW K b n/a 19 2617 2696 2726 N
+ IY OW K e n/a 19 2612 2688 2726 N
+ IY OW K i n/a 19 2610 2696 2726 N
+ IY OW K s n/a 19 2610 2696 2726 N
+ IY OW L b n/a 19 2617 2710 2778 N
+ IY OW L e n/a 19 2613 2710 2774 N
+ IY OW L i n/a 19 2610 2710 2779 N
+ IY OW L s n/a 19 2610 2710 2778 N
+ IY OW M b n/a 19 2617 2681 2763 N
+ IY OW M e n/a 19 2613 2686 2763 N
+ IY OW M s n/a 19 2613 2681 2763 N
+ IY OW N b n/a 19 2617 2681 2762 N
+ IY OW N e n/a 19 2613 2686 2762 N
+ IY OW N i n/a 19 2613 2681 2765 N
+ IY OW N s n/a 19 2613 2681 2762 N
+ IY OW NG b n/a 19 2617 2681 2762 N
+ IY OW NG e n/a 19 2613 2686 2762 N
+ IY OW NG s n/a 19 2613 2681 2762 N
+ IY OW OW b n/a 19 2617 2706 2780 N
+ IY OW OW e n/a 19 2614 2706 2782 N
+ IY OW OW i n/a 19 2614 2706 2780 N
+ IY OW OW s n/a 19 2614 2706 2780 N
+ IY OW OY e n/a 19 2614 2706 2757 N
+ IY OW OY s n/a 19 2614 2706 2748 N
+ IY OW P b n/a 19 2617 2696 2715 N
+ IY OW P e n/a 19 2613 2687 2716 N
+ IY OW P s n/a 19 2610 2696 2715 N
+ IY OW R b n/a 19 2617 2710 2761 N
+ IY OW R e n/a 19 2613 2710 2775 N
+ IY OW R s n/a 19 2610 2710 2761 N
+ IY OW S b n/a 19 2617 2696 2736 N
+ IY OW S e n/a 19 2613 2685 2737 N
+ IY OW S s n/a 19 2609 2696 2736 N
+ IY OW SH b n/a 19 2617 2696 2739 N
+ IY OW SH e n/a 19 2613 2685 2739 N
+ IY OW SH i n/a 19 2609 2696 2739 N
+ IY OW SH s n/a 19 2609 2696 2739 N
+ IY OW SIL e n/a 19 2615 2683 2747 N
+ IY OW SIL s n/a 19 2615 2677 2747 N
+ IY OW T b n/a 19 2617 2696 2724 N
+ IY OW T e n/a 19 2613 2687 2724 N
+ IY OW T i n/a 19 2609 2696 2724 N
+ IY OW T s n/a 19 2609 2696 2724 N
+ IY OW TH b n/a 19 2617 2696 2741 N
+ IY OW TH e n/a 19 2613 2685 2741 N
+ IY OW TH s n/a 19 2609 2696 2741 N
+ IY OW UH e n/a 19 2614 2707 2781 N
+ IY OW UH s n/a 19 2614 2707 2781 N
+ IY OW UW b n/a 19 2617 2707 2780 N
+ IY OW UW e n/a 19 2614 2707 2782 N
+ IY OW UW s n/a 19 2614 2707 2780 N
+ IY OW V b n/a 19 2617 2677 2731 N
+ IY OW V e n/a 19 2613 2682 2720 N
+ IY OW V i n/a 19 2609 2677 2732 N
+ IY OW V s n/a 19 2609 2677 2732 N
+ IY OW W b n/a 19 2617 2712 2775 N
+ IY OW W e n/a 19 2613 2710 2775 N
+ IY OW W s n/a 19 2610 2712 2775 N
+ IY OW Y e n/a 19 2614 2707 2771 N
+ IY OW Y s n/a 19 2614 2707 2771 N
+ IY OW Z b n/a 19 2617 2677 2734 N
+ IY OW Z e n/a 19 2613 2682 2733 N
+ IY OW Z i n/a 19 2613 2677 2733 N
+ IY OW Z s n/a 19 2613 2677 2733 N
+ IY OW ZH b n/a 19 2617 2677 2734 N
+ IY OW ZH e n/a 19 2613 2682 2733 N
+ IY OW ZH s n/a 19 2609 2677 2733 N
+ IY OY AA b n/a 19 2594 2698 2781 N
+ IY OY AA e n/a 19 2599 2698 2781 N
+ IY OY AA s n/a 19 2604 2698 2781 N
+ IY OY AE e n/a 19 2599 2654 2748 N
+ IY OY AE s n/a 19 2604 2654 2748 N
+ IY OY AH b n/a 19 2594 2660 2759 N
+ IY OY AH e n/a 19 2599 2660 2756 N
+ IY OY AH i n/a 19 2604 2658 2759 N
+ IY OY AH s n/a 19 2604 2660 2759 N
+ IY OY AO b n/a 19 2594 2698 2780 N
+ IY OY AO e n/a 19 2599 2698 2782 N
+ IY OY AO s n/a 19 2604 2698 2780 N
+ IY OY AW e n/a 19 2599 2698 2781 N
+ IY OY AW s n/a 19 2604 2698 2781 N
+ IY OY AY e n/a 19 2599 2654 2757 N
+ IY OY AY s n/a 19 2604 2654 2748 N
+ IY OY B b n/a 19 2594 2640 2718 N
+ IY OY B e n/a 19 2599 2640 2718 N
+ IY OY B s n/a 19 2604 2640 2718 N
+ IY OY CH b n/a 19 2594 2632 2723 N
+ IY OY CH e n/a 19 2599 2643 2724 N
+ IY OY CH s n/a 19 2604 2632 2723 N
+ IY OY D b n/a 19 2594 2636 2721 N
+ IY OY D e n/a 19 2599 2643 2725 N
+ IY OY D s n/a 19 2604 2636 2721 N
+ IY OY DH b n/a 19 2594 2629 2731 N
+ IY OY DH e n/a 19 2599 2652 2719 N
+ IY OY DH s n/a 19 2604 2652 2732 N
+ IY OY EH b n/a 19 2594 2654 2750 N
+ IY OY EH e n/a 19 2599 2654 2750 N
+ IY OY EH s n/a 19 2604 2654 2750 N
+ IY OY ER b n/a 19 2594 2698 2761 N
+ IY OY ER e n/a 19 2599 2698 2783 N
+ IY OY ER s n/a 19 2604 2698 2761 N
+ IY OY EY b n/a 19 2594 2654 2749 N
+ IY OY EY e n/a 19 2599 2654 2749 N
+ IY OY EY s n/a 19 2604 2654 2749 N
+ IY OY F b n/a 19 2594 2634 2740 N
+ IY OY F e n/a 19 2599 2639 2740 N
+ IY OY F s n/a 19 2604 2634 2740 N
+ IY OY G b n/a 19 2594 2647 2726 N
+ IY OY G e n/a 19 2599 2647 2727 N
+ IY OY G s n/a 19 2604 2647 2726 N
+ IY OY HH e n/a 19 2599 2634 2729 N
+ IY OY HH s n/a 19 2604 2634 2729 N
+ IY OY IH e n/a 19 2599 2654 2769 N
+ IY OY IH s n/a 19 2604 2654 2769 N
+ IY OY IY b n/a 19 2594 2654 2770 N
+ IY OY IY e n/a 19 2599 2654 2770 N
+ IY OY IY s n/a 19 2604 2654 2770 N
+ IY OY JH b n/a 19 2594 2636 2725 N
+ IY OY JH e n/a 19 2599 2643 2725 N
+ IY OY JH s n/a 19 2604 2636 2725 N
+ IY OY K b n/a 19 2594 2647 2726 N
+ IY OY K e n/a 19 2599 2647 2726 N
+ IY OY K s n/a 19 2604 2647 2726 N
+ IY OY L b n/a 19 2594 2698 2778 N
+ IY OY L e n/a 19 2599 2710 2774 N
+ IY OY L s n/a 19 2604 2698 2778 N
+ IY OY M b n/a 19 2594 2674 2763 N
+ IY OY M e n/a 19 2599 2674 2763 N
+ IY OY M s n/a 19 2604 2674 2763 N
+ IY OY N b n/a 19 2594 2674 2762 N
+ IY OY N e n/a 19 2599 2674 2762 N
+ IY OY N s n/a 19 2604 2674 2762 N
+ IY OY NG b n/a 19 2594 2674 2762 N
+ IY OY NG e n/a 19 2599 2674 2762 N
+ IY OY NG s n/a 19 2604 2674 2762 N
+ IY OY OW b n/a 19 2594 2698 2780 N
+ IY OY OW e n/a 19 2599 2698 2782 N
+ IY OY OW s n/a 19 2604 2698 2780 N
+ IY OY OY e n/a 19 2599 2654 2757 N
+ IY OY OY s n/a 19 2604 2654 2748 N
+ IY OY P b n/a 19 2594 2640 2715 N
+ IY OY P e n/a 19 2599 2640 2716 N
+ IY OY P s n/a 19 2604 2640 2715 N
+ IY OY R b n/a 19 2594 2698 2761 N
+ IY OY R e n/a 19 2599 2710 2775 N
+ IY OY R s n/a 19 2604 2698 2761 N
+ IY OY S b n/a 19 2594 2632 2736 N
+ IY OY S e n/a 19 2599 2639 2737 N
+ IY OY S s n/a 19 2604 2632 2736 N
+ IY OY SH b n/a 19 2594 2634 2739 N
+ IY OY SH e n/a 19 2599 2639 2739 N
+ IY OY SH s n/a 19 2604 2634 2739 N
+ IY OY SIL e n/a 19 2599 2648 2744 N
+ IY OY SIL s n/a 19 2604 2648 2745 N
+ IY OY T b n/a 19 2594 2632 2723 N
+ IY OY T e n/a 19 2599 2643 2724 N
+ IY OY T s n/a 19 2604 2632 2723 N
+ IY OY TH b n/a 19 2594 2632 2741 N
+ IY OY TH e n/a 19 2599 2639 2741 N
+ IY OY TH s n/a 19 2604 2632 2741 N
+ IY OY UH e n/a 19 2599 2698 2783 N
+ IY OY UH s n/a 19 2604 2698 2783 N
+ IY OY UW b n/a 19 2594 2698 2780 N
+ IY OY UW e n/a 19 2599 2698 2782 N
+ IY OY UW s n/a 19 2604 2698 2780 N
+ IY OY V b n/a 19 2594 2629 2731 N
+ IY OY V e n/a 19 2599 2652 2720 N
+ IY OY V s n/a 19 2604 2652 2732 N
+ IY OY W b n/a 19 2594 2712 2775 N
+ IY OY W e n/a 19 2599 2710 2775 N
+ IY OY W s n/a 19 2604 2712 2775 N
+ IY OY Y e n/a 19 2599 2643 2771 N
+ IY OY Y s n/a 19 2604 2636 2771 N
+ IY OY Z b n/a 19 2594 2629 2734 N
+ IY OY Z e n/a 19 2599 2653 2733 N
+ IY OY Z i n/a 19 2604 2651 2733 N
+ IY OY Z s n/a 19 2604 2651 2733 N
+ IY OY ZH b n/a 19 2594 2629 2734 N
+ IY OY ZH e n/a 19 2599 2652 2733 N
+ IY OY ZH s n/a 19 2604 2651 2733 N
+ IY P AA b n/a 19 2594 2698 2781 N
+ IY P AA e n/a 19 2581 2698 2781 N
+ IY P AA i n/a 19 2579 2698 2781 N
+ IY P AA s n/a 19 2579 2698 2781 N
+ IY P AE e n/a 19 2581 2654 2748 N
+ IY P AE i n/a 19 2579 2659 2752 N
+ IY P AE s n/a 19 2579 2654 2748 N
+ IY P AH b n/a 19 2594 2660 2758 N
+ IY P AH e n/a 19 2581 2660 2756 N
+ IY P AH i n/a 19 2580 2659 2758 N
+ IY P AH s n/a 19 2580 2660 2758 N
+ IY P AO b n/a 19 2594 2698 2780 N
+ IY P AO e n/a 19 2581 2698 2782 N
+ IY P AO i n/a 19 2579 2698 2780 N
+ IY P AO s n/a 19 2579 2698 2780 N
+ IY P AW e n/a 19 2581 2698 2781 N
+ IY P AW s n/a 19 2579 2698 2781 N
+ IY P AY e n/a 19 2581 2654 2757 N
+ IY P AY i n/a 19 2579 2659 2752 N
+ IY P AY s n/a 19 2579 2654 2748 N
+ IY P B b n/a 19 2594 2637 2718 N
+ IY P B e n/a 19 2585 2637 2718 N
+ IY P B i n/a 19 2584 2637 2718 N
+ IY P B s n/a 19 2585 2637 2718 N
+ IY P CH b n/a 19 2594 2632 2723 N
+ IY P CH e n/a 19 2581 2643 2724 N
+ IY P CH i n/a 19 2581 2631 2723 N
+ IY P CH s n/a 19 2581 2632 2723 N
+ IY P D b n/a 19 2594 2636 2722 N
+ IY P D e n/a 19 2581 2643 2725 N
+ IY P D i n/a 19 2581 2636 2722 N
+ IY P D s n/a 19 2581 2636 2722 N
+ IY P DH b n/a 19 2594 2629 2731 N
+ IY P DH e n/a 19 2581 2652 2720 N
+ IY P DH s n/a 19 2580 2652 2731 N
+ IY P EH b n/a 19 2594 2654 2750 N
+ IY P EH e n/a 19 2581 2654 2750 N
+ IY P EH i n/a 19 2579 2658 2752 N
+ IY P EH s n/a 19 2579 2654 2750 N
+ IY P ER b n/a 19 2594 2698 2761 N
+ IY P ER e n/a 19 2581 2698 2783 N
+ IY P ER i n/a 19 2580 2697 2761 N
+ IY P ER s n/a 19 2580 2698 2761 N
+ IY P EY b n/a 19 2594 2654 2750 N
+ IY P EY e n/a 19 2581 2654 2750 N
+ IY P EY i n/a 19 2579 2659 2753 N
+ IY P EY s n/a 19 2579 2654 2750 N
+ IY P F b n/a 19 2594 2634 2740 N
+ IY P F e n/a 19 2581 2638 2740 N
+ IY P F i n/a 19 2579 2634 2740 N
+ IY P F s n/a 19 2579 2634 2740 N
+ IY P G b n/a 19 2594 2647 2726 N
+ IY P G e n/a 19 2581 2644 2727 N
+ IY P G i n/a 19 2581 2644 2726 N
+ IY P G s n/a 19 2581 2644 2726 N
+ IY P HH e n/a 19 2581 2634 2729 N
+ IY P HH i n/a 19 2579 2634 2729 N
+ IY P HH s n/a 19 2579 2634 2729 N
+ IY P IH e n/a 19 2581 2654 2769 N
+ IY P IH i n/a 19 2580 2657 2772 N
+ IY P IH s n/a 19 2580 2654 2769 N
+ IY P IY b n/a 19 2594 2654 2770 N
+ IY P IY e n/a 19 2581 2654 2770 N
+ IY P IY i n/a 19 2579 2657 2770 N
+ IY P IY s n/a 19 2579 2654 2770 N
+ IY P JH b n/a 19 2594 2636 2725 N
+ IY P JH e n/a 19 2581 2643 2725 N
+ IY P JH i n/a 19 2581 2636 2725 N
+ IY P JH s n/a 19 2581 2636 2725 N
+ IY P K b n/a 19 2594 2647 2726 N
+ IY P K e n/a 19 2581 2644 2726 N
+ IY P K i n/a 19 2581 2644 2726 N
+ IY P K s n/a 19 2581 2644 2726 N
+ IY P L b n/a 19 2594 2698 2778 N
+ IY P L e n/a 19 2581 2708 2774 N
+ IY P L i n/a 19 2579 2699 2779 N
+ IY P L s n/a 19 2579 2698 2778 N
+ IY P M b n/a 19 2594 2674 2763 N
+ IY P M e n/a 19 2585 2674 2763 N
+ IY P M i n/a 19 2584 2663 2766 N
+ IY P M s n/a 19 2585 2674 2763 N
+ IY P N b n/a 19 2594 2674 2762 N
+ IY P N e n/a 19 2581 2674 2762 N
+ IY P N i n/a 19 2580 2663 2765 N
+ IY P N s n/a 19 2580 2674 2762 N
+ IY P NG b n/a 19 2594 2674 2762 N
+ IY P NG e n/a 19 2581 2674 2762 N
+ IY P NG s n/a 19 2581 2674 2762 N
+ IY P OW b n/a 19 2594 2698 2780 N
+ IY P OW e n/a 19 2581 2698 2782 N
+ IY P OW i n/a 19 2579 2698 2780 N
+ IY P OW s n/a 19 2579 2698 2780 N
+ IY P OY e n/a 19 2581 2654 2757 N
+ IY P OY i n/a 19 2579 2659 2752 N
+ IY P OY s n/a 19 2579 2654 2748 N
+ IY P P b n/a 19 2594 2637 2715 N
+ IY P P e n/a 19 2587 2637 2715 N
+ IY P P i n/a 19 2587 2637 2716 N
+ IY P P s n/a 19 2587 2637 2715 N
+ IY P R b n/a 19 2594 2698 2761 N
+ IY P R e n/a 19 2581 2708 2776 N
+ IY P R i n/a 19 2580 2697 2761 N
+ IY P R s n/a 19 2580 2698 2761 N
+ IY P S b n/a 19 2594 2632 2736 N
+ IY P S e n/a 19 2581 2638 2736 N
+ IY P S i n/a 19 2579 2632 2736 N
+ IY P S s n/a 19 2579 2632 2736 N
+ IY P SH b n/a 19 2594 2634 2739 N
+ IY P SH e n/a 19 2581 2638 2739 N
+ IY P SH i n/a 19 2581 2634 2739 N
+ IY P SH s n/a 19 2581 2634 2739 N
+ IY P SIL e n/a 19 2581 2648 2744 N
+ IY P SIL s n/a 19 2579 2648 2745 N
+ IY P T b n/a 19 2594 2632 2723 N
+ IY P T e n/a 19 2581 2643 2724 N
+ IY P T i n/a 19 2579 2632 2723 N
+ IY P T s n/a 19 2579 2632 2723 N
+ IY P TH b n/a 19 2594 2632 2741 N
+ IY P TH e n/a 19 2581 2638 2741 N
+ IY P TH i n/a 19 2579 2632 2741 N
+ IY P TH s n/a 19 2579 2632 2741 N
+ IY P UH e n/a 19 2581 2698 2783 N
+ IY P UH s n/a 19 2579 2698 2783 N
+ IY P UW b n/a 19 2594 2698 2780 N
+ IY P UW e n/a 19 2581 2698 2782 N
+ IY P UW s n/a 19 2579 2698 2780 N
+ IY P V b n/a 19 2594 2629 2731 N
+ IY P V e n/a 19 2581 2652 2720 N
+ IY P V i n/a 19 2579 2652 2731 N
+ IY P V s n/a 19 2579 2652 2731 N
+ IY P W b n/a 19 2594 2708 2776 N
+ IY P W e n/a 19 2581 2708 2776 N
+ IY P W i n/a 19 2579 2708 2776 N
+ IY P W s n/a 19 2579 2708 2776 N
+ IY P Y e n/a 19 2581 2643 2771 N
+ IY P Y s n/a 19 2581 2636 2771 N
+ IY P Z b n/a 19 2594 2629 2734 N
+ IY P Z e n/a 19 2581 2653 2733 N
+ IY P Z i n/a 19 2580 2651 2733 N
+ IY P Z s n/a 19 2580 2651 2733 N
+ IY P ZH b n/a 19 2594 2629 2734 N
+ IY P ZH e n/a 19 2581 2652 2733 N
+ IY P ZH i n/a 19 2581 2651 2733 N
+ IY P ZH s n/a 19 2581 2651 2733 N
+ IY R AA b n/a 19 2617 2704 2781 N
+ IY R AA e n/a 19 2614 2704 2781 N
+ IY R AA i n/a 19 2614 2705 2781 N
+ IY R AA s n/a 19 2614 2704 2781 N
+ IY R AE e n/a 19 2614 2704 2748 N
+ IY R AE i n/a 19 2614 2705 2752 N
+ IY R AE s n/a 19 2614 2704 2748 N
+ IY R AH b n/a 19 2617 2704 2760 N
+ IY R AH e n/a 19 2614 2704 2756 N
+ IY R AH i n/a 19 2614 2703 2760 N
+ IY R AH s n/a 19 2614 2704 2760 N
+ IY R AO b n/a 19 2617 2704 2780 N
+ IY R AO e n/a 19 2614 2704 2782 N
+ IY R AO i n/a 19 2614 2705 2780 N
+ IY R AO s n/a 19 2614 2704 2780 N
+ IY R AW e n/a 19 2614 2704 2781 N
+ IY R AW i n/a 19 2614 2705 2781 N
+ IY R AW s n/a 19 2614 2704 2781 N
+ IY R AY e n/a 19 2614 2704 2757 N
+ IY R AY i n/a 19 2614 2705 2753 N
+ IY R AY s n/a 19 2614 2704 2748 N
+ IY R B b n/a 19 2617 2677 2718 N
+ IY R B e n/a 19 2612 2694 2718 N
+ IY R B i n/a 19 2610 2679 2718 N
+ IY R B s n/a 19 2610 2677 2718 N
+ IY R CH b n/a 19 2617 2692 2724 N
+ IY R CH e n/a 19 2612 2693 2724 N
+ IY R CH i n/a 19 2609 2693 2724 N
+ IY R CH s n/a 19 2609 2693 2724 N
+ IY R D b n/a 19 2617 2678 2721 N
+ IY R D e n/a 19 2611 2693 2725 N
+ IY R D i n/a 19 2611 2678 2721 N
+ IY R D s n/a 19 2611 2678 2721 N
+ IY R DH b n/a 19 2617 2678 2731 N
+ IY R DH e n/a 19 2612 2682 2719 N
+ IY R DH i n/a 19 2611 2678 2732 N
+ IY R DH s n/a 19 2611 2678 2732 N
+ IY R EH b n/a 19 2617 2704 2750 N
+ IY R EH e n/a 19 2614 2704 2750 N
+ IY R EH i n/a 19 2614 2705 2752 N
+ IY R EH s n/a 19 2614 2704 2750 N
+ IY R ER b n/a 19 2617 2704 2761 N
+ IY R ER e n/a 19 2614 2704 2783 N
+ IY R ER i n/a 19 2614 2703 2761 N
+ IY R ER s n/a 19 2614 2704 2761 N
+ IY R EY b n/a 19 2617 2704 2749 N
+ IY R EY e n/a 19 2614 2704 2749 N
+ IY R EY i n/a 19 2614 2705 2753 N
+ IY R EY s n/a 19 2614 2704 2749 N
+ IY R F b n/a 19 2617 2692 2740 N
+ IY R F e n/a 19 2612 2692 2740 N
+ IY R F i n/a 19 2609 2692 2740 N
+ IY R F s n/a 19 2609 2692 2740 N
+ IY R G b n/a 19 2617 2677 2726 N
+ IY R G e n/a 19 2612 2695 2727 N
+ IY R G i n/a 19 2610 2679 2726 N
+ IY R G s n/a 19 2610 2677 2726 N
+ IY R HH e n/a 19 2612 2692 2729 N
+ IY R HH i n/a 19 2609 2692 2729 N
+ IY R HH s n/a 19 2609 2692 2729 N
+ IY R IH e n/a 19 2614 2704 2769 N
+ IY R IH i n/a 19 2614 2705 2772 N
+ IY R IH s n/a 19 2614 2704 2769 N
+ IY R IY b n/a 19 2617 2704 2770 N
+ IY R IY e n/a 19 2614 2704 2770 N
+ IY R IY i n/a 19 2614 2705 2770 N
+ IY R IY s n/a 19 2614 2704 2770 N
+ IY R JH b n/a 19 2617 2677 2725 N
+ IY R JH e n/a 19 2612 2693 2725 N
+ IY R JH i n/a 19 2609 2680 2725 N
+ IY R JH s n/a 19 2609 2677 2725 N
+ IY R K b n/a 19 2617 2693 2728 N
+ IY R K e n/a 19 2612 2695 2728 N
+ IY R K i n/a 19 2610 2695 2728 N
+ IY R K s n/a 19 2610 2693 2728 N
+ IY R L b n/a 19 2617 2710 2778 N
+ IY R L e n/a 19 2612 2712 2774 N
+ IY R L i n/a 19 2610 2710 2778 N
+ IY R L s n/a 19 2610 2710 2778 N
+ IY R M b n/a 19 2617 2681 2763 N
+ IY R M e n/a 19 2613 2692 2763 N
+ IY R M i n/a 19 2613 2681 2764 N
+ IY R M s n/a 19 2613 2681 2763 N
+ IY R N b n/a 19 2617 2681 2762 N
+ IY R N e n/a 19 2613 2692 2762 N
+ IY R N i n/a 19 2613 2681 2765 N
+ IY R N s n/a 19 2613 2681 2762 N
+ IY R NG b n/a 19 2617 2681 2762 N
+ IY R NG e n/a 19 2613 2692 2762 N
+ IY R NG i n/a 19 2613 2681 2762 N
+ IY R NG s n/a 19 2613 2681 2762 N
+ IY R OW b n/a 19 2617 2704 2780 N
+ IY R OW e n/a 19 2614 2704 2782 N
+ IY R OW i n/a 19 2614 2705 2780 N
+ IY R OW s n/a 19 2614 2704 2780 N
+ IY R OY e n/a 19 2614 2704 2757 N
+ IY R OY i n/a 19 2614 2705 2753 N
+ IY R OY s n/a 19 2614 2704 2748 N
+ IY R P b n/a 19 2617 2694 2717 N
+ IY R P e n/a 19 2612 2694 2717 N
+ IY R P i n/a 19 2610 2695 2717 N
+ IY R P s n/a 19 2610 2694 2717 N
+ IY R R b n/a 19 2617 2710 2761 N
+ IY R R e n/a 19 2612 2712 2775 N
+ IY R R i n/a 19 2610 2710 2761 N
+ IY R R s n/a 19 2610 2710 2761 N
+ IY R S b n/a 19 2617 2691 2738 N
+ IY R S e n/a 19 2611 2691 2738 N
+ IY R S i n/a 19 2609 2691 2738 N
+ IY R S s n/a 19 2609 2691 2738 N
+ IY R SH b n/a 19 2617 2691 2739 N
+ IY R SH e n/a 19 2612 2691 2739 N
+ IY R SH i n/a 19 2609 2691 2739 N
+ IY R SH s n/a 19 2609 2691 2739 N
+ IY R SIL e n/a 19 2615 2684 2747 N
+ IY R SIL s n/a 19 2615 2677 2747 N
+ IY R T b n/a 19 2617 2692 2724 N
+ IY R T e n/a 19 2611 2693 2724 N
+ IY R T i n/a 19 2609 2693 2724 N
+ IY R T s n/a 19 2609 2693 2724 N
+ IY R TH b n/a 19 2617 2691 2741 N
+ IY R TH e n/a 19 2611 2691 2741 N
+ IY R TH i n/a 19 2609 2691 2741 N
+ IY R TH s n/a 19 2609 2691 2741 N
+ IY R UH e n/a 19 2614 2704 2783 N
+ IY R UH i n/a 19 2614 2705 2783 N
+ IY R UH s n/a 19 2614 2704 2783 N
+ IY R UW b n/a 19 2617 2704 2780 N
+ IY R UW e n/a 19 2614 2704 2782 N
+ IY R UW i n/a 19 2614 2705 2780 N
+ IY R UW s n/a 19 2614 2704 2780 N
+ IY R V b n/a 19 2617 2677 2731 N
+ IY R V e n/a 19 2612 2682 2720 N
+ IY R V i n/a 19 2609 2679 2732 N
+ IY R V s n/a 19 2609 2677 2732 N
+ IY R W b n/a 19 2617 2712 2775 N
+ IY R W e n/a 19 2612 2712 2775 N
+ IY R W i n/a 19 2610 2712 2775 N
+ IY R W s n/a 19 2610 2712 2775 N
+ IY R Y e n/a 19 2614 2704 2771 N
+ IY R Y i n/a 19 2614 2705 2771 N
+ IY R Y s n/a 19 2614 2704 2771 N
+ IY R Z b n/a 19 2617 2678 2735 N
+ IY R Z e n/a 19 2612 2682 2735 N
+ IY R Z i n/a 19 2611 2678 2735 N
+ IY R Z s n/a 19 2611 2678 2735 N
+ IY R ZH b n/a 19 2617 2677 2735 N
+ IY R ZH e n/a 19 2612 2682 2735 N
+ IY R ZH i n/a 19 2609 2679 2735 N
+ IY R ZH s n/a 19 2609 2677 2735 N
+ IY S AA b n/a 19 2594 2698 2781 N
+ IY S AA e n/a 19 2582 2698 2781 N
+ IY S AA i n/a 19 2582 2699 2781 N
+ IY S AA s n/a 19 2582 2698 2781 N
+ IY S AE e n/a 19 2582 2654 2748 N
+ IY S AE i n/a 19 2582 2659 2752 N
+ IY S AE s n/a 19 2582 2654 2748 N
+ IY S AH b n/a 19 2594 2660 2759 N
+ IY S AH e n/a 19 2582 2660 2756 N
+ IY S AH i n/a 19 2582 2659 2759 N
+ IY S AH s n/a 19 2582 2660 2759 N
+ IY S AO b n/a 19 2594 2698 2780 N
+ IY S AO e n/a 19 2582 2698 2782 N
+ IY S AO i n/a 19 2582 2699 2780 N
+ IY S AO s n/a 19 2582 2698 2780 N
+ IY S AW e n/a 19 2582 2698 2781 N
+ IY S AW i n/a 19 2582 2699 2781 N
+ IY S AW s n/a 19 2582 2698 2781 N
+ IY S AY e n/a 19 2582 2654 2757 N
+ IY S AY i n/a 19 2582 2659 2752 N
+ IY S AY s n/a 19 2582 2654 2748 N
+ IY S B b n/a 19 2594 2640 2718 N
+ IY S B e n/a 19 2582 2640 2718 N
+ IY S B i n/a 19 2582 2640 2718 N
+ IY S B s n/a 19 2582 2640 2718 N
+ IY S CH b n/a 19 2594 2632 2723 N
+ IY S CH e n/a 19 2582 2643 2724 N
+ IY S CH i n/a 19 2582 2631 2723 N
+ IY S CH s n/a 19 2582 2632 2723 N
+ IY S D b n/a 19 2594 2636 2722 N
+ IY S D e n/a 19 2582 2643 2725 N
+ IY S D i n/a 19 2582 2636 2722 N
+ IY S D s n/a 19 2582 2636 2722 N
+ IY S DH b n/a 19 2594 2629 2731 N
+ IY S DH e n/a 19 2582 2652 2720 N
+ IY S DH i n/a 19 2582 2652 2731 N
+ IY S DH s n/a 19 2582 2652 2731 N
+ IY S EH b n/a 19 2594 2654 2750 N
+ IY S EH e n/a 19 2582 2654 2750 N
+ IY S EH i n/a 19 2582 2659 2752 N
+ IY S EH s n/a 19 2582 2654 2750 N
+ IY S ER b n/a 19 2594 2698 2761 N
+ IY S ER e n/a 19 2582 2698 2783 N
+ IY S ER i n/a 19 2582 2697 2761 N
+ IY S ER s n/a 19 2582 2698 2761 N
+ IY S EY b n/a 19 2594 2654 2749 N
+ IY S EY e n/a 19 2582 2654 2749 N
+ IY S EY i n/a 19 2582 2659 2753 N
+ IY S EY s n/a 19 2582 2654 2749 N
+ IY S F b n/a 19 2594 2634 2740 N
+ IY S F e n/a 19 2582 2639 2740 N
+ IY S F i n/a 19 2582 2634 2740 N
+ IY S F s n/a 19 2582 2634 2740 N
+ IY S G b n/a 19 2594 2647 2726 N
+ IY S G e n/a 19 2582 2644 2727 N
+ IY S G i n/a 19 2582 2645 2726 N
+ IY S G s n/a 19 2582 2644 2726 N
+ IY S HH e n/a 19 2582 2634 2729 N
+ IY S HH i n/a 19 2582 2633 2729 N
+ IY S HH s n/a 19 2582 2634 2729 N
+ IY S IH e n/a 19 2582 2654 2769 N
+ IY S IH i n/a 19 2582 2657 2773 N
+ IY S IH s n/a 19 2582 2654 2769 N
+ IY S IY b n/a 19 2594 2654 2770 N
+ IY S IY e n/a 19 2582 2654 2770 N
+ IY S IY i n/a 19 2582 2657 2770 N
+ IY S IY s n/a 19 2582 2654 2770 N
+ IY S JH b n/a 19 2594 2636 2725 N
+ IY S JH e n/a 19 2582 2643 2725 N
+ IY S JH i n/a 19 2582 2636 2725 N
+ IY S JH s n/a 19 2582 2636 2725 N
+ IY S K b n/a 19 2594 2647 2726 N
+ IY S K e n/a 19 2582 2644 2726 N
+ IY S K i n/a 19 2582 2645 2726 N
+ IY S K s n/a 19 2582 2644 2726 N
+ IY S L b n/a 19 2594 2698 2778 N
+ IY S L e n/a 19 2582 2713 2774 N
+ IY S L i n/a 19 2582 2699 2779 N
+ IY S L s n/a 19 2582 2698 2778 N
+ IY S M b n/a 19 2594 2674 2763 N
+ IY S M e n/a 19 2583 2674 2763 N
+ IY S M i n/a 19 2583 2663 2766 N
+ IY S M s n/a 19 2583 2674 2763 N
+ IY S N b n/a 19 2594 2674 2762 N
+ IY S N e n/a 19 2583 2674 2762 N
+ IY S N i n/a 19 2583 2665 2765 N
+ IY S N s n/a 19 2583 2674 2762 N
+ IY S NG b n/a 19 2594 2674 2762 N
+ IY S NG e n/a 19 2583 2674 2762 N
+ IY S NG s n/a 19 2583 2674 2762 N
+ IY S OW b n/a 19 2594 2698 2780 N
+ IY S OW e n/a 19 2582 2698 2782 N
+ IY S OW i n/a 19 2582 2699 2780 N
+ IY S OW s n/a 19 2582 2698 2780 N
+ IY S OY e n/a 19 2582 2654 2757 N
+ IY S OY s n/a 19 2582 2654 2748 N
+ IY S P b n/a 19 2594 2640 2715 N
+ IY S P e n/a 19 2582 2640 2715 N
+ IY S P i n/a 19 2582 2640 2715 N
+ IY S P s n/a 19 2582 2640 2715 N
+ IY S R b n/a 19 2594 2698 2761 N
+ IY S R e n/a 19 2582 2713 2776 N
+ IY S R i n/a 19 2582 2697 2761 N
+ IY S R s n/a 19 2582 2698 2761 N
+ IY S S b n/a 19 2594 2632 2736 N
+ IY S S e n/a 19 2582 2639 2736 N
+ IY S S i n/a 19 2582 2631 2736 N
+ IY S S s n/a 19 2582 2632 2736 N
+ IY S SH b n/a 19 2594 2634 2739 N
+ IY S SH e n/a 19 2582 2639 2739 N
+ IY S SH i n/a 19 2582 2634 2739 N
+ IY S SH s n/a 19 2582 2634 2739 N
+ IY S SIL e n/a 19 2578 2648 2745 N
+ IY S SIL s n/a 19 2578 2648 2745 N
+ IY S T b n/a 19 2594 2632 2723 N
+ IY S T e n/a 19 2582 2643 2724 N
+ IY S T i n/a 19 2582 2631 2723 N
+ IY S T s n/a 19 2582 2632 2723 N
+ IY S TH b n/a 19 2594 2632 2741 N
+ IY S TH e n/a 19 2582 2639 2741 N
+ IY S TH i n/a 19 2582 2631 2741 N
+ IY S TH s n/a 19 2582 2632 2741 N
+ IY S UH e n/a 19 2582 2698 2783 N
+ IY S UH s n/a 19 2582 2698 2783 N
+ IY S UW b n/a 19 2594 2698 2780 N
+ IY S UW e n/a 19 2582 2698 2782 N
+ IY S UW i n/a 19 2582 2699 2780 N
+ IY S UW s n/a 19 2582 2698 2780 N
+ IY S V b n/a 19 2594 2629 2731 N
+ IY S V e n/a 19 2582 2652 2720 N
+ IY S V i n/a 19 2582 2652 2731 N
+ IY S V s n/a 19 2582 2652 2731 N
+ IY S W b n/a 19 2594 2713 2776 N
+ IY S W e n/a 19 2582 2713 2776 N
+ IY S W i n/a 19 2582 2713 2776 N
+ IY S W s n/a 19 2582 2713 2776 N
+ IY S Y e n/a 19 2582 2643 2771 N
+ IY S Y i n/a 19 2582 2636 2771 N
+ IY S Y s n/a 19 2582 2636 2771 N
+ IY S Z b n/a 19 2594 2629 2734 N
+ IY S Z e n/a 19 2582 2653 2733 N
+ IY S Z i n/a 19 2582 2651 2733 N
+ IY S Z s n/a 19 2582 2651 2733 N
+ IY S ZH b n/a 19 2594 2629 2734 N
+ IY S ZH e n/a 19 2582 2652 2733 N
+ IY S ZH i n/a 19 2582 2651 2733 N
+ IY S ZH s n/a 19 2582 2651 2733 N
+ IY SH AA b n/a 19 2594 2698 2781 N
+ IY SH AA e n/a 19 2588 2698 2781 N
+ IY SH AA i n/a 19 2588 2699 2781 N
+ IY SH AA s n/a 19 2588 2698 2781 N
+ IY SH AE e n/a 19 2588 2655 2751 N
+ IY SH AE i n/a 19 2588 2659 2752 N
+ IY SH AE s n/a 19 2588 2655 2751 N
+ IY SH AH b n/a 19 2594 2660 2759 N
+ IY SH AH e n/a 19 2588 2660 2756 N
+ IY SH AH i n/a 19 2588 2659 2759 N
+ IY SH AH s n/a 19 2588 2660 2759 N
+ IY SH AO b n/a 19 2594 2698 2780 N
+ IY SH AO e n/a 19 2588 2698 2782 N
+ IY SH AO i n/a 19 2588 2699 2780 N
+ IY SH AO s n/a 19 2588 2698 2780 N
+ IY SH AW e n/a 19 2588 2698 2781 N
+ IY SH AW s n/a 19 2588 2698 2781 N
+ IY SH AY e n/a 19 2588 2655 2757 N
+ IY SH AY i n/a 19 2588 2659 2752 N
+ IY SH AY s n/a 19 2588 2655 2751 N
+ IY SH B b n/a 19 2594 2637 2718 N
+ IY SH B e n/a 19 2588 2637 2718 N
+ IY SH B i n/a 19 2588 2637 2718 N
+ IY SH B s n/a 19 2588 2637 2718 N
+ IY SH CH b n/a 19 2594 2632 2723 N
+ IY SH CH e n/a 19 2588 2647 2724 N
+ IY SH CH s n/a 19 2588 2632 2723 N
+ IY SH D b n/a 19 2594 2636 2722 N
+ IY SH D e n/a 19 2588 2647 2725 N
+ IY SH D i n/a 19 2588 2636 2722 N
+ IY SH D s n/a 19 2588 2636 2722 N
+ IY SH DH b n/a 19 2594 2629 2731 N
+ IY SH DH e n/a 19 2588 2652 2720 N
+ IY SH DH i n/a 19 2588 2652 2731 N
+ IY SH DH s n/a 19 2588 2652 2731 N
+ IY SH EH b n/a 19 2594 2655 2750 N
+ IY SH EH e n/a 19 2588 2655 2750 N
+ IY SH EH i n/a 19 2588 2659 2752 N
+ IY SH EH s n/a 19 2588 2655 2750 N
+ IY SH ER b n/a 19 2594 2698 2761 N
+ IY SH ER e n/a 19 2588 2698 2783 N
+ IY SH ER i n/a 19 2588 2697 2761 N
+ IY SH ER s n/a 19 2588 2698 2761 N
+ IY SH EY b n/a 19 2594 2655 2749 N
+ IY SH EY e n/a 19 2588 2655 2749 N
+ IY SH EY i n/a 19 2588 2659 2753 N
+ IY SH EY s n/a 19 2588 2655 2749 N
+ IY SH F b n/a 19 2594 2635 2740 N
+ IY SH F e n/a 19 2588 2638 2740 N
+ IY SH F i n/a 19 2588 2635 2740 N
+ IY SH F s n/a 19 2588 2635 2740 N
+ IY SH G b n/a 19 2594 2647 2726 N
+ IY SH G e n/a 19 2588 2645 2727 N
+ IY SH G i n/a 19 2588 2645 2726 N
+ IY SH G s n/a 19 2588 2645 2726 N
+ IY SH HH e n/a 19 2588 2635 2730 N
+ IY SH HH i n/a 19 2588 2635 2730 N
+ IY SH HH s n/a 19 2588 2635 2730 N
+ IY SH IH e n/a 19 2588 2655 2767 N
+ IY SH IH s n/a 19 2588 2655 2767 N
+ IY SH IY b n/a 19 2594 2655 2770 N
+ IY SH IY e n/a 19 2588 2655 2770 N
+ IY SH IY i n/a 19 2588 2657 2770 N
+ IY SH IY s n/a 19 2588 2655 2770 N
+ IY SH JH b n/a 19 2594 2636 2725 N
+ IY SH JH e n/a 19 2588 2647 2725 N
+ IY SH JH i n/a 19 2588 2636 2725 N
+ IY SH JH s n/a 19 2588 2636 2725 N
+ IY SH K b n/a 19 2594 2647 2726 N
+ IY SH K e n/a 19 2588 2645 2726 N
+ IY SH K i n/a 19 2588 2645 2726 N
+ IY SH K s n/a 19 2588 2645 2726 N
+ IY SH L b n/a 19 2594 2698 2778 N
+ IY SH L e n/a 19 2589 2709 2774 N
+ IY SH L i n/a 19 2589 2699 2779 N
+ IY SH L s n/a 19 2589 2698 2778 N
+ IY SH M b n/a 19 2594 2673 2763 N
+ IY SH M e n/a 19 2588 2673 2763 N
+ IY SH M i n/a 19 2585 2664 2766 N
+ IY SH M s n/a 19 2585 2673 2763 N
+ IY SH N b n/a 19 2594 2674 2762 N
+ IY SH N e n/a 19 2588 2674 2762 N
+ IY SH N i n/a 19 2585 2664 2765 N
+ IY SH N s n/a 19 2585 2674 2762 N
+ IY SH NG b n/a 19 2594 2673 2762 N
+ IY SH NG e n/a 19 2588 2673 2762 N
+ IY SH NG i n/a 19 2585 2664 2765 N
+ IY SH NG s n/a 19 2585 2673 2762 N
+ IY SH OW b n/a 19 2594 2698 2780 N
+ IY SH OW e n/a 19 2588 2698 2782 N
+ IY SH OW i n/a 19 2588 2699 2780 N
+ IY SH OW s n/a 19 2588 2698 2780 N
+ IY SH OY e n/a 19 2588 2655 2757 N
+ IY SH OY s n/a 19 2588 2655 2751 N
+ IY SH P b n/a 19 2594 2637 2715 N
+ IY SH P e n/a 19 2588 2637 2716 N
+ IY SH P i n/a 19 2588 2637 2715 N
+ IY SH P s n/a 19 2588 2637 2715 N
+ IY SH R b n/a 19 2594 2698 2761 N
+ IY SH R e n/a 19 2589 2709 2777 N
+ IY SH R i n/a 19 2589 2697 2761 N
+ IY SH R s n/a 19 2589 2698 2761 N
+ IY SH S b n/a 19 2594 2632 2736 N
+ IY SH S e n/a 19 2588 2638 2737 N
+ IY SH S i n/a 19 2588 2631 2736 N
+ IY SH S s n/a 19 2588 2632 2736 N
+ IY SH SH b n/a 19 2594 2635 2739 N
+ IY SH SH e n/a 19 2588 2638 2739 N
+ IY SH SH i n/a 19 2588 2635 2739 N
+ IY SH SH s n/a 19 2588 2635 2739 N
+ IY SH SIL e n/a 19 2588 2649 2745 N
+ IY SH SIL s n/a 19 2588 2649 2745 N
+ IY SH T b n/a 19 2594 2632 2723 N
+ IY SH T e n/a 19 2588 2647 2724 N
+ IY SH T i n/a 19 2588 2631 2723 N
+ IY SH T s n/a 19 2588 2632 2723 N
+ IY SH TH b n/a 19 2594 2632 2741 N
+ IY SH TH e n/a 19 2588 2638 2741 N
+ IY SH TH i n/a 19 2588 2631 2741 N
+ IY SH TH s n/a 19 2588 2632 2741 N
+ IY SH UH e n/a 19 2588 2698 2783 N
+ IY SH UH s n/a 19 2588 2698 2783 N
+ IY SH UW b n/a 19 2594 2698 2780 N
+ IY SH UW e n/a 19 2588 2698 2782 N
+ IY SH UW i n/a 19 2588 2699 2780 N
+ IY SH UW s n/a 19 2588 2698 2780 N
+ IY SH V b n/a 19 2594 2629 2731 N
+ IY SH V e n/a 19 2588 2652 2720 N
+ IY SH V i n/a 19 2588 2652 2731 N
+ IY SH V s n/a 19 2588 2652 2731 N
+ IY SH W b n/a 19 2594 2709 2777 N
+ IY SH W e n/a 19 2589 2709 2777 N
+ IY SH W i n/a 19 2589 2709 2777 N
+ IY SH W s n/a 19 2589 2709 2777 N
+ IY SH Y e n/a 19 2588 2643 2771 N
+ IY SH Y i n/a 19 2588 2636 2771 N
+ IY SH Y s n/a 19 2588 2636 2771 N
+ IY SH Z b n/a 19 2594 2629 2734 N
+ IY SH Z e n/a 19 2588 2653 2733 N
+ IY SH Z i n/a 19 2588 2651 2733 N
+ IY SH Z s n/a 19 2588 2651 2733 N
+ IY SH ZH b n/a 19 2594 2629 2734 N
+ IY SH ZH e n/a 19 2588 2652 2733 N
+ IY SH ZH s n/a 19 2588 2651 2733 N
+ IY SIL AA b n/a 19 2596 2698 2781 N
+ IY SIL AA s n/a 19 2579 2698 2781 N
+ IY SIL AE s n/a 19 2579 2654 2748 N
+ IY SIL AH b n/a 19 2596 2660 2759 N
+ IY SIL AH s n/a 19 2580 2660 2759 N
+ IY SIL AO b n/a 19 2596 2698 2780 N
+ IY SIL AO s n/a 19 2579 2698 2780 N
+ IY SIL AW s n/a 19 2579 2698 2781 N
+ IY SIL AY s n/a 19 2579 2654 2748 N
+ IY SIL B b n/a 19 2596 2637 2718 N
+ IY SIL B s n/a 19 2585 2637 2718 N
+ IY SIL CH b n/a 19 2596 2632 2723 N
+ IY SIL CH s n/a 19 2581 2632 2723 N
+ IY SIL D b n/a 19 2596 2636 2722 N
+ IY SIL D s n/a 19 2581 2636 2722 N
+ IY SIL DH b n/a 19 2596 2629 2731 N
+ IY SIL DH s n/a 19 2580 2652 2731 N
+ IY SIL EH b n/a 19 2596 2654 2750 N
+ IY SIL EH s n/a 19 2579 2654 2750 N
+ IY SIL ER b n/a 19 2596 2698 2761 N
+ IY SIL ER s n/a 19 2580 2698 2761 N
+ IY SIL EY b n/a 19 2596 2654 2749 N
+ IY SIL EY s n/a 19 2579 2654 2749 N
+ IY SIL F b n/a 19 2596 2634 2740 N
+ IY SIL F s n/a 19 2579 2634 2740 N
+ IY SIL G b n/a 19 2596 2647 2726 N
+ IY SIL G s n/a 19 2581 2647 2726 N
+ IY SIL HH s n/a 19 2579 2634 2729 N
+ IY SIL IH s n/a 19 2580 2654 2769 N
+ IY SIL IY b n/a 19 2596 2654 2770 N
+ IY SIL IY s n/a 19 2579 2654 2770 N
+ IY SIL JH b n/a 19 2596 2636 2725 N
+ IY SIL JH s n/a 19 2581 2636 2725 N
+ IY SIL K b n/a 19 2596 2647 2726 N
+ IY SIL K s n/a 19 2581 2647 2726 N
+ IY SIL L b n/a 19 2596 2698 2778 N
+ IY SIL L s n/a 19 2579 2698 2778 N
+ IY SIL M b n/a 19 2596 2674 2763 N
+ IY SIL M s n/a 19 2585 2674 2763 N
+ IY SIL N b n/a 19 2596 2674 2762 N
+ IY SIL N s n/a 19 2580 2674 2762 N
+ IY SIL NG b n/a 19 2596 2674 2762 N
+ IY SIL NG s n/a 19 2581 2674 2762 N
+ IY SIL OW b n/a 19 2596 2698 2780 N
+ IY SIL OW s n/a 19 2579 2698 2780 N
+ IY SIL OY s n/a 19 2579 2654 2748 N
+ IY SIL P b n/a 19 2596 2637 2715 N
+ IY SIL P s n/a 19 2586 2637 2715 N
+ IY SIL R b n/a 19 2596 2698 2761 N
+ IY SIL R s n/a 19 2580 2698 2761 N
+ IY SIL S b n/a 19 2596 2632 2736 N
+ IY SIL S s n/a 19 2579 2632 2736 N
+ IY SIL SH b n/a 19 2596 2634 2739 N
+ IY SIL SH s n/a 19 2581 2634 2739 N
+ IY SIL SIL s n/a 19 2579 2648 2745 N
+ IY SIL T b n/a 19 2596 2632 2723 N
+ IY SIL T s n/a 19 2579 2632 2723 N
+ IY SIL TH b n/a 19 2596 2632 2741 N
+ IY SIL TH s n/a 19 2579 2632 2741 N
+ IY SIL UH s n/a 19 2579 2698 2783 N
+ IY SIL UW b n/a 19 2596 2698 2780 N
+ IY SIL UW s n/a 19 2579 2698 2780 N
+ IY SIL V b n/a 19 2596 2629 2731 N
+ IY SIL V s n/a 19 2579 2652 2731 N
+ IY SIL W b n/a 19 2596 2708 2776 N
+ IY SIL W s n/a 19 2579 2708 2776 N
+ IY SIL Y s n/a 19 2581 2636 2771 N
+ IY SIL Z b n/a 19 2596 2629 2734 N
+ IY SIL Z s n/a 19 2580 2651 2733 N
+ IY SIL ZH b n/a 19 2596 2629 2734 N
+ IY SIL ZH s n/a 19 2581 2651 2733 N
+ IY T AA b n/a 19 2594 2698 2781 N
+ IY T AA e n/a 19 2576 2698 2781 N
+ IY T AA i n/a 19 2577 2699 2781 N
+ IY T AA s n/a 19 2576 2698 2781 N
+ IY T AE e n/a 19 2576 2654 2748 N
+ IY T AE i n/a 19 2577 2659 2752 N
+ IY T AE s n/a 19 2576 2654 2748 N
+ IY T AH b n/a 19 2594 2660 2759 N
+ IY T AH e n/a 19 2576 2660 2756 N
+ IY T AH i n/a 19 2577 2658 2759 N
+ IY T AH s n/a 19 2576 2660 2759 N
+ IY T AO b n/a 19 2594 2698 2780 N
+ IY T AO e n/a 19 2576 2698 2782 N
+ IY T AO i n/a 19 2577 2699 2780 N
+ IY T AO s n/a 19 2576 2698 2780 N
+ IY T AW e n/a 19 2576 2698 2781 N
+ IY T AW s n/a 19 2576 2698 2781 N
+ IY T AY e n/a 19 2576 2654 2757 N
+ IY T AY i n/a 19 2577 2659 2752 N
+ IY T AY s n/a 19 2576 2654 2748 N
+ IY T B b n/a 19 2594 2640 2718 N
+ IY T B e n/a 19 2576 2640 2718 N
+ IY T B i n/a 19 2577 2640 2718 N
+ IY T B s n/a 19 2576 2640 2718 N
+ IY T CH b n/a 19 2594 2632 2723 N
+ IY T CH e n/a 19 2577 2643 2724 N
+ IY T CH i n/a 19 2577 2632 2723 N
+ IY T CH s n/a 19 2577 2632 2723 N
+ IY T D b n/a 19 2594 2636 2722 N
+ IY T D e n/a 19 2576 2643 2725 N
+ IY T D i n/a 19 2577 2636 2722 N
+ IY T D s n/a 19 2576 2636 2722 N
+ IY T DH b n/a 19 2594 2629 2731 N
+ IY T DH e n/a 19 2576 2651 2719 N
+ IY T DH i n/a 19 2577 2651 2731 N
+ IY T DH s n/a 19 2576 2651 2731 N
+ IY T EH b n/a 19 2594 2654 2750 N
+ IY T EH e n/a 19 2576 2654 2750 N
+ IY T EH i n/a 19 2577 2658 2752 N
+ IY T EH s n/a 19 2576 2654 2750 N
+ IY T ER b n/a 19 2594 2698 2761 N
+ IY T ER e n/a 19 2576 2698 2783 N
+ IY T ER i n/a 19 2577 2697 2761 N
+ IY T ER s n/a 19 2576 2698 2761 N
+ IY T EY b n/a 19 2594 2654 2750 N
+ IY T EY e n/a 19 2576 2654 2750 N
+ IY T EY i n/a 19 2577 2659 2753 N
+ IY T EY s n/a 19 2576 2654 2750 N
+ IY T F b n/a 19 2594 2634 2740 N
+ IY T F e n/a 19 2576 2639 2740 N
+ IY T F i n/a 19 2577 2634 2740 N
+ IY T F s n/a 19 2577 2634 2740 N
+ IY T G b n/a 19 2594 2647 2726 N
+ IY T G e n/a 19 2576 2644 2727 N
+ IY T G i n/a 19 2577 2644 2726 N
+ IY T G s n/a 19 2576 2644 2726 N
+ IY T HH e n/a 19 2576 2634 2729 N
+ IY T HH i n/a 19 2577 2633 2729 N
+ IY T HH s n/a 19 2577 2634 2729 N
+ IY T IH e n/a 19 2576 2654 2769 N
+ IY T IH i n/a 19 2577 2656 2772 N
+ IY T IH s n/a 19 2576 2654 2769 N
+ IY T IY b n/a 19 2594 2654 2770 N
+ IY T IY e n/a 19 2576 2654 2770 N
+ IY T IY i n/a 19 2577 2656 2770 N
+ IY T IY s n/a 19 2576 2654 2770 N
+ IY T JH b n/a 19 2594 2636 2725 N
+ IY T JH e n/a 19 2577 2643 2725 N
+ IY T JH i n/a 19 2577 2636 2725 N
+ IY T JH s n/a 19 2577 2636 2725 N
+ IY T K b n/a 19 2594 2647 2726 N
+ IY T K e n/a 19 2576 2644 2726 N
+ IY T K i n/a 19 2577 2644 2726 N
+ IY T K s n/a 19 2577 2644 2726 N
+ IY T L b n/a 19 2594 2698 2778 N
+ IY T L e n/a 19 2576 2713 2774 N
+ IY T L i n/a 19 2577 2699 2779 N
+ IY T L s n/a 19 2576 2698 2778 N
+ IY T M b n/a 19 2594 2674 2763 N
+ IY T M e n/a 19 2585 2674 2763 N
+ IY T M i n/a 19 2585 2665 2766 N
+ IY T M s n/a 19 2585 2674 2763 N
+ IY T N b n/a 19 2594 2674 2762 N
+ IY T N e n/a 19 2585 2674 2762 N
+ IY T N i n/a 19 2584 2665 2765 N
+ IY T N s n/a 19 2585 2674 2762 N
+ IY T NG b n/a 19 2594 2674 2762 N
+ IY T NG e n/a 19 2585 2674 2762 N
+ IY T NG i n/a 19 2585 2665 2765 N
+ IY T NG s n/a 19 2585 2674 2762 N
+ IY T OW b n/a 19 2594 2698 2780 N
+ IY T OW e n/a 19 2576 2698 2782 N
+ IY T OW i n/a 19 2577 2699 2780 N
+ IY T OW s n/a 19 2576 2698 2780 N
+ IY T OY e n/a 19 2576 2654 2757 N
+ IY T OY s n/a 19 2576 2654 2748 N
+ IY T P b n/a 19 2594 2640 2715 N
+ IY T P e n/a 19 2576 2640 2715 N
+ IY T P i n/a 19 2577 2640 2715 N
+ IY T P s n/a 19 2577 2640 2715 N
+ IY T R b n/a 19 2594 2698 2761 N
+ IY T R e n/a 19 2576 2713 2776 N
+ IY T R i n/a 19 2577 2697 2761 N
+ IY T R s n/a 19 2576 2698 2761 N
+ IY T S b n/a 19 2594 2632 2736 N
+ IY T S e n/a 19 2576 2639 2736 N
+ IY T S i n/a 19 2577 2632 2736 N
+ IY T S s n/a 19 2577 2632 2736 N
+ IY T SH b n/a 19 2594 2634 2739 N
+ IY T SH e n/a 19 2576 2639 2739 N
+ IY T SH i n/a 19 2577 2634 2739 N
+ IY T SH s n/a 19 2577 2634 2739 N
+ IY T SIL e n/a 19 2578 2648 2744 N
+ IY T SIL s n/a 19 2578 2648 2744 N
+ IY T T b n/a 19 2594 2632 2723 N
+ IY T T e n/a 19 2576 2643 2724 N
+ IY T T i n/a 19 2577 2632 2723 N
+ IY T T s n/a 19 2577 2632 2723 N
+ IY T TH b n/a 19 2594 2632 2741 N
+ IY T TH e n/a 19 2576 2639 2741 N
+ IY T TH i n/a 19 2577 2632 2741 N
+ IY T TH s n/a 19 2577 2632 2741 N
+ IY T UH e n/a 19 2576 2698 2783 N
+ IY T UH i n/a 19 2577 2699 2783 N
+ IY T UH s n/a 19 2576 2698 2783 N
+ IY T UW b n/a 19 2594 2698 2780 N
+ IY T UW e n/a 19 2576 2698 2782 N
+ IY T UW i n/a 19 2577 2699 2780 N
+ IY T UW s n/a 19 2576 2698 2780 N
+ IY T V b n/a 19 2594 2629 2731 N
+ IY T V e n/a 19 2576 2652 2720 N
+ IY T V i n/a 19 2577 2652 2731 N
+ IY T V s n/a 19 2576 2652 2731 N
+ IY T W b n/a 19 2594 2713 2776 N
+ IY T W e n/a 19 2576 2713 2776 N
+ IY T W i n/a 19 2577 2713 2776 N
+ IY T W s n/a 19 2576 2713 2776 N
+ IY T Y e n/a 19 2576 2643 2771 N
+ IY T Y i n/a 19 2577 2636 2771 N
+ IY T Y s n/a 19 2576 2636 2771 N
+ IY T Z b n/a 19 2594 2629 2734 N
+ IY T Z e n/a 19 2576 2651 2733 N
+ IY T Z i n/a 19 2576 2651 2733 N
+ IY T Z s n/a 19 2576 2651 2733 N
+ IY T ZH b n/a 19 2594 2629 2734 N
+ IY T ZH e n/a 19 2576 2652 2733 N
+ IY T ZH i n/a 19 2577 2652 2733 N
+ IY T ZH s n/a 19 2576 2652 2733 N
+ IY TH AA b n/a 19 2594 2700 2781 N
+ IY TH AA e n/a 19 2582 2700 2781 N
+ IY TH AA i n/a 19 2582 2700 2781 N
+ IY TH AA s n/a 19 2582 2700 2781 N
+ IY TH AE e n/a 19 2582 2656 2751 N
+ IY TH AE i n/a 19 2582 2661 2752 N
+ IY TH AE s n/a 19 2582 2656 2751 N
+ IY TH AH b n/a 19 2594 2662 2759 N
+ IY TH AH e n/a 19 2582 2661 2754 N
+ IY TH AH i n/a 19 2582 2662 2759 N
+ IY TH AH s n/a 19 2582 2662 2759 N
+ IY TH AO b n/a 19 2594 2700 2780 N
+ IY TH AO e n/a 19 2582 2700 2782 N
+ IY TH AO i n/a 19 2582 2700 2780 N
+ IY TH AO s n/a 19 2582 2700 2780 N
+ IY TH AW e n/a 19 2582 2700 2781 N
+ IY TH AW i n/a 19 2582 2700 2781 N
+ IY TH AW s n/a 19 2582 2700 2781 N
+ IY TH AY e n/a 19 2582 2656 2754 N
+ IY TH AY i n/a 19 2582 2662 2752 N
+ IY TH AY s n/a 19 2582 2656 2751 N
+ IY TH B b n/a 19 2594 2641 2718 N
+ IY TH B e n/a 19 2582 2641 2718 N
+ IY TH B i n/a 19 2582 2641 2718 N
+ IY TH B s n/a 19 2582 2641 2718 N
+ IY TH CH b n/a 19 2594 2632 2723 N
+ IY TH CH e n/a 19 2582 2643 2724 N
+ IY TH CH s n/a 19 2582 2632 2723 N
+ IY TH D b n/a 19 2594 2636 2722 N
+ IY TH D e n/a 19 2582 2643 2725 N
+ IY TH D i n/a 19 2582 2636 2722 N
+ IY TH D s n/a 19 2582 2636 2722 N
+ IY TH DH b n/a 19 2594 2629 2731 N
+ IY TH DH e n/a 19 2582 2652 2720 N
+ IY TH DH s n/a 19 2582 2652 2731 N
+ IY TH EH b n/a 19 2594 2656 2750 N
+ IY TH EH e n/a 19 2582 2656 2750 N
+ IY TH EH s n/a 19 2582 2656 2750 N
+ IY TH ER b n/a 19 2594 2700 2761 N
+ IY TH ER e n/a 19 2582 2700 2783 N
+ IY TH ER i n/a 19 2582 2700 2761 N
+ IY TH ER s n/a 19 2582 2700 2761 N
+ IY TH EY b n/a 19 2594 2656 2749 N
+ IY TH EY e n/a 19 2582 2656 2749 N
+ IY TH EY i n/a 19 2582 2661 2753 N
+ IY TH EY s n/a 19 2582 2656 2749 N
+ IY TH F b n/a 19 2594 2633 2740 N
+ IY TH F e n/a 19 2582 2641 2740 N
+ IY TH F i n/a 19 2582 2634 2740 N
+ IY TH F s n/a 19 2582 2633 2740 N
+ IY TH G b n/a 19 2594 2646 2726 N
+ IY TH G e n/a 19 2582 2646 2728 N
+ IY TH G s n/a 19 2582 2646 2726 N
+ IY TH HH e n/a 19 2582 2633 2729 N
+ IY TH HH s n/a 19 2582 2633 2729 N
+ IY TH IH e n/a 19 2582 2656 2769 N
+ IY TH IH i n/a 19 2582 2656 2772 N
+ IY TH IH s n/a 19 2582 2656 2769 N
+ IY TH IY b n/a 19 2594 2656 2770 N
+ IY TH IY e n/a 19 2582 2656 2770 N
+ IY TH IY s n/a 19 2582 2656 2770 N
+ IY TH JH b n/a 19 2594 2636 2725 N
+ IY TH JH e n/a 19 2582 2643 2725 N
+ IY TH JH i n/a 19 2582 2636 2725 N
+ IY TH JH s n/a 19 2582 2636 2725 N
+ IY TH K b n/a 19 2594 2646 2726 N
+ IY TH K e n/a 19 2582 2646 2726 N
+ IY TH K i n/a 19 2582 2646 2726 N
+ IY TH K s n/a 19 2582 2646 2726 N
+ IY TH L b n/a 19 2594 2700 2778 N
+ IY TH L e n/a 19 2582 2710 2774 N
+ IY TH L i n/a 19 2582 2700 2779 N
+ IY TH L s n/a 19 2582 2700 2778 N
+ IY TH M b n/a 19 2594 2674 2762 N
+ IY TH M e n/a 19 2583 2674 2762 N
+ IY TH M i n/a 19 2583 2663 2766 N
+ IY TH M s n/a 19 2583 2674 2762 N
+ IY TH N b n/a 19 2594 2674 2762 N
+ IY TH N e n/a 19 2583 2674 2762 N
+ IY TH N i n/a 19 2583 2665 2765 N
+ IY TH N s n/a 19 2583 2674 2762 N
+ IY TH NG b n/a 19 2594 2674 2762 N
+ IY TH NG e n/a 19 2583 2674 2762 N
+ IY TH NG s n/a 19 2583 2674 2762 N
+ IY TH OW b n/a 19 2594 2700 2780 N
+ IY TH OW e n/a 19 2582 2700 2782 N
+ IY TH OW i n/a 19 2582 2700 2780 N
+ IY TH OW s n/a 19 2582 2700 2780 N
+ IY TH OY e n/a 19 2582 2656 2754 N
+ IY TH OY s n/a 19 2582 2656 2751 N
+ IY TH P b n/a 19 2594 2641 2715 N
+ IY TH P e n/a 19 2582 2641 2717 N
+ IY TH P s n/a 19 2582 2641 2715 N
+ IY TH R b n/a 19 2594 2700 2761 N
+ IY TH R e n/a 19 2582 2710 2775 N
+ IY TH R i n/a 19 2582 2700 2761 N
+ IY TH R s n/a 19 2582 2700 2761 N
+ IY TH S b n/a 19 2594 2632 2736 N
+ IY TH S e n/a 19 2582 2641 2738 N
+ IY TH S i n/a 19 2582 2631 2736 N
+ IY TH S s n/a 19 2582 2632 2736 N
+ IY TH SH b n/a 19 2594 2633 2739 N
+ IY TH SH e n/a 19 2582 2641 2739 N
+ IY TH SH s n/a 19 2582 2633 2739 N
+ IY TH SIL e n/a 19 2578 2650 2742 N
+ IY TH SIL s n/a 19 2578 2650 2742 N
+ IY TH T b n/a 19 2594 2632 2723 N
+ IY TH T e n/a 19 2582 2643 2724 N
+ IY TH T i n/a 19 2582 2631 2723 N
+ IY TH T s n/a 19 2582 2632 2723 N
+ IY TH TH b n/a 19 2594 2632 2741 N
+ IY TH TH e n/a 19 2582 2641 2741 N
+ IY TH TH s n/a 19 2582 2632 2741 N
+ IY TH UH e n/a 19 2582 2700 2783 N
+ IY TH UH s n/a 19 2582 2700 2783 N
+ IY TH UW b n/a 19 2594 2700 2780 N
+ IY TH UW e n/a 19 2582 2700 2782 N
+ IY TH UW i n/a 19 2582 2700 2780 N
+ IY TH UW s n/a 19 2582 2700 2780 N
+ IY TH V b n/a 19 2594 2629 2731 N
+ IY TH V e n/a 19 2582 2652 2720 N
+ IY TH V i n/a 19 2582 2652 2731 N
+ IY TH V s n/a 19 2582 2652 2731 N
+ IY TH W b n/a 19 2594 2711 2776 N
+ IY TH W e n/a 19 2582 2710 2776 N
+ IY TH W s n/a 19 2582 2711 2776 N
+ IY TH Y e n/a 19 2582 2642 2771 N
+ IY TH Y i n/a 19 2582 2636 2771 N
+ IY TH Y s n/a 19 2582 2636 2771 N
+ IY TH Z b n/a 19 2594 2629 2734 N
+ IY TH Z e n/a 19 2582 2653 2734 N
+ IY TH Z i n/a 19 2582 2653 2734 N
+ IY TH Z s n/a 19 2582 2653 2734 N
+ IY TH ZH b n/a 19 2594 2629 2734 N
+ IY TH ZH e n/a 19 2582 2652 2734 N
+ IY TH ZH i n/a 19 2582 2652 2734 N
+ IY TH ZH s n/a 19 2582 2652 2734 N
+ IY UH AA b n/a 19 2617 2706 2781 N
+ IY UH AA s n/a 19 2614 2706 2781 N
+ IY UH AE s n/a 19 2614 2707 2748 N
+ IY UH AH b n/a 19 2617 2706 2759 N
+ IY UH AH s n/a 19 2614 2706 2759 N
+ IY UH AO b n/a 19 2617 2706 2780 N
+ IY UH AO s n/a 19 2614 2706 2780 N
+ IY UH AW s n/a 19 2614 2707 2781 N
+ IY UH AY s n/a 19 2614 2706 2748 N
+ IY UH B b n/a 19 2617 2677 2718 N
+ IY UH B s n/a 19 2610 2677 2718 N
+ IY UH CH b n/a 19 2617 2696 2724 N
+ IY UH CH s n/a 19 2609 2696 2724 N
+ IY UH D b n/a 19 2617 2677 2721 N
+ IY UH D s n/a 19 2612 2677 2721 N
+ IY UH DH b n/a 19 2617 2677 2731 N
+ IY UH DH s n/a 19 2612 2677 2732 N
+ IY UH EH b n/a 19 2617 2707 2750 N
+ IY UH EH s n/a 19 2614 2707 2750 N
+ IY UH ER b n/a 19 2617 2706 2761 N
+ IY UH ER s n/a 19 2614 2706 2761 N
+ IY UH EY b n/a 19 2617 2707 2749 N
+ IY UH EY s n/a 19 2614 2707 2749 N
+ IY UH F b n/a 19 2617 2696 2740 N
+ IY UH F s n/a 19 2609 2696 2740 N
+ IY UH G b n/a 19 2617 2677 2726 N
+ IY UH G s n/a 19 2610 2677 2726 N
+ IY UH HH s n/a 19 2609 2696 2729 N
+ IY UH IH s n/a 19 2614 2707 2769 N
+ IY UH IY b n/a 19 2617 2707 2770 N
+ IY UH IY s n/a 19 2614 2707 2770 N
+ IY UH JH b n/a 19 2617 2677 2725 N
+ IY UH JH s n/a 19 2609 2677 2725 N
+ IY UH K b n/a 19 2617 2696 2726 N
+ IY UH K s n/a 19 2610 2696 2726 N
+ IY UH L b n/a 19 2617 2710 2778 N
+ IY UH L s n/a 19 2610 2710 2778 N
+ IY UH M b n/a 19 2617 2681 2763 N
+ IY UH M s n/a 19 2613 2681 2763 N
+ IY UH N b n/a 19 2617 2681 2762 N
+ IY UH N s n/a 19 2613 2681 2762 N
+ IY UH NG b n/a 19 2617 2681 2762 N
+ IY UH NG s n/a 19 2613 2681 2762 N
+ IY UH OW b n/a 19 2617 2706 2780 N
+ IY UH OW s n/a 19 2614 2706 2780 N
+ IY UH OY s n/a 19 2614 2706 2748 N
+ IY UH P b n/a 19 2617 2696 2715 N
+ IY UH P s n/a 19 2610 2696 2715 N
+ IY UH R b n/a 19 2617 2710 2761 N
+ IY UH R s n/a 19 2610 2710 2761 N
+ IY UH S b n/a 19 2617 2696 2736 N
+ IY UH S s n/a 19 2609 2696 2736 N
+ IY UH SH b n/a 19 2617 2696 2739 N
+ IY UH SH s n/a 19 2609 2696 2739 N
+ IY UH SIL s n/a 19 2615 2677 2747 N
+ IY UH T b n/a 19 2617 2696 2724 N
+ IY UH T s n/a 19 2609 2696 2724 N
+ IY UH TH b n/a 19 2617 2696 2741 N
+ IY UH TH s n/a 19 2609 2696 2741 N
+ IY UH UH s n/a 19 2614 2707 2783 N
+ IY UH UW b n/a 19 2617 2707 2780 N
+ IY UH UW s n/a 19 2614 2707 2780 N
+ IY UH V b n/a 19 2617 2677 2731 N
+ IY UH V s n/a 19 2609 2677 2732 N
+ IY UH W b n/a 19 2617 2712 2775 N
+ IY UH W s n/a 19 2610 2712 2775 N
+ IY UH Y s n/a 19 2614 2707 2771 N
+ IY UH Z b n/a 19 2617 2677 2734 N
+ IY UH Z s n/a 19 2612 2677 2733 N
+ IY UH ZH b n/a 19 2617 2677 2734 N
+ IY UH ZH s n/a 19 2609 2677 2733 N
+ IY UW AA b n/a 19 2617 2706 2781 N
+ IY UW AA e n/a 19 2614 2706 2781 N
+ IY UW AA s n/a 19 2614 2706 2781 N
+ IY UW AE e n/a 19 2614 2707 2748 N
+ IY UW AE s n/a 19 2614 2707 2748 N
+ IY UW AH b n/a 19 2617 2706 2759 N
+ IY UW AH e n/a 19 2614 2706 2756 N
+ IY UW AH i n/a 19 2614 2706 2759 N
+ IY UW AH s n/a 19 2614 2706 2759 N
+ IY UW AO b n/a 19 2617 2706 2780 N
+ IY UW AO e n/a 19 2614 2706 2782 N
+ IY UW AO s n/a 19 2614 2706 2780 N
+ IY UW AW e n/a 19 2614 2707 2781 N
+ IY UW AW i n/a 19 2614 2707 2781 N
+ IY UW AW s n/a 19 2614 2707 2781 N
+ IY UW AY e n/a 19 2614 2706 2757 N
+ IY UW AY s n/a 19 2614 2706 2748 N
+ IY UW B b n/a 19 2617 2677 2718 N
+ IY UW B e n/a 19 2613 2687 2718 N
+ IY UW B s n/a 19 2610 2677 2718 N
+ IY UW CH b n/a 19 2617 2696 2724 N
+ IY UW CH e n/a 19 2613 2687 2724 N
+ IY UW CH i n/a 19 2609 2696 2724 N
+ IY UW CH s n/a 19 2609 2696 2724 N
+ IY UW D b n/a 19 2617 2677 2721 N
+ IY UW D e n/a 19 2613 2687 2725 N
+ IY UW D i n/a 19 2613 2677 2721 N
+ IY UW D s n/a 19 2613 2677 2721 N
+ IY UW DH b n/a 19 2617 2677 2731 N
+ IY UW DH e n/a 19 2613 2682 2719 N
+ IY UW DH s n/a 19 2613 2677 2732 N
+ IY UW EH b n/a 19 2617 2707 2750 N
+ IY UW EH e n/a 19 2614 2707 2750 N
+ IY UW EH s n/a 19 2614 2707 2750 N
+ IY UW ER b n/a 19 2617 2706 2761 N
+ IY UW ER e n/a 19 2614 2706 2781 N
+ IY UW ER s n/a 19 2614 2706 2761 N
+ IY UW EY b n/a 19 2617 2707 2749 N
+ IY UW EY e n/a 19 2614 2707 2749 N
+ IY UW EY s n/a 19 2614 2707 2749 N
+ IY UW F b n/a 19 2617 2696 2740 N
+ IY UW F e n/a 19 2613 2685 2740 N
+ IY UW F s n/a 19 2609 2696 2740 N
+ IY UW G b n/a 19 2617 2677 2726 N
+ IY UW G e n/a 19 2612 2688 2727 N
+ IY UW G i n/a 19 2610 2677 2726 N
+ IY UW G s n/a 19 2610 2677 2726 N
+ IY UW HH e n/a 19 2613 2686 2729 N
+ IY UW HH s n/a 19 2609 2696 2729 N
+ IY UW IH e n/a 19 2614 2707 2769 N
+ IY UW IH s n/a 19 2614 2707 2769 N
+ IY UW IY b n/a 19 2617 2707 2770 N
+ IY UW IY e n/a 19 2614 2707 2770 N
+ IY UW IY s n/a 19 2614 2707 2770 N
+ IY UW JH b n/a 19 2617 2677 2725 N
+ IY UW JH e n/a 19 2613 2687 2725 N
+ IY UW JH i n/a 19 2609 2677 2725 N
+ IY UW JH s n/a 19 2609 2677 2725 N
+ IY UW K b n/a 19 2617 2696 2726 N
+ IY UW K e n/a 19 2612 2688 2726 N
+ IY UW K i n/a 19 2610 2696 2726 N
+ IY UW K s n/a 19 2610 2696 2726 N
+ IY UW L b n/a 19 2617 2710 2778 N
+ IY UW L e n/a 19 2613 2710 2774 N
+ IY UW L s n/a 19 2610 2710 2778 N
+ IY UW M b n/a 19 2617 2681 2763 N
+ IY UW M e n/a 19 2613 2686 2763 N
+ IY UW M i n/a 19 2613 2681 2766 N
+ IY UW M s n/a 19 2613 2681 2763 N
+ IY UW N b n/a 19 2617 2681 2762 N
+ IY UW N e n/a 19 2613 2686 2762 N
+ IY UW N i n/a 19 2613 2681 2765 N
+ IY UW N s n/a 19 2613 2681 2762 N
+ IY UW NG b n/a 19 2617 2681 2762 N
+ IY UW NG e n/a 19 2613 2686 2762 N
+ IY UW NG s n/a 19 2613 2681 2762 N
+ IY UW OW b n/a 19 2617 2706 2780 N
+ IY UW OW e n/a 19 2614 2706 2782 N
+ IY UW OW s n/a 19 2614 2706 2780 N
+ IY UW OY e n/a 19 2614 2706 2757 N
+ IY UW OY s n/a 19 2614 2706 2748 N
+ IY UW P b n/a 19 2617 2696 2715 N
+ IY UW P e n/a 19 2613 2687 2716 N
+ IY UW P i n/a 19 2610 2696 2715 N
+ IY UW P s n/a 19 2610 2696 2715 N
+ IY UW R b n/a 19 2617 2710 2761 N
+ IY UW R e n/a 19 2613 2710 2775 N
+ IY UW R s n/a 19 2610 2710 2761 N
+ IY UW S b n/a 19 2617 2696 2736 N
+ IY UW S e n/a 19 2613 2685 2737 N
+ IY UW S i n/a 19 2609 2696 2736 N
+ IY UW S s n/a 19 2609 2696 2736 N
+ IY UW SH b n/a 19 2617 2696 2739 N
+ IY UW SH e n/a 19 2613 2685 2739 N
+ IY UW SH s n/a 19 2609 2696 2739 N
+ IY UW SIL e n/a 19 2615 2684 2747 N
+ IY UW SIL s n/a 19 2615 2677 2747 N
+ IY UW T b n/a 19 2617 2696 2724 N
+ IY UW T e n/a 19 2613 2687 2724 N
+ IY UW T i n/a 19 2609 2696 2724 N
+ IY UW T s n/a 19 2609 2696 2724 N
+ IY UW TH b n/a 19 2617 2696 2741 N
+ IY UW TH e n/a 19 2613 2685 2741 N
+ IY UW TH s n/a 19 2609 2696 2741 N
+ IY UW UH e n/a 19 2614 2707 2781 N
+ IY UW UH s n/a 19 2614 2707 2781 N
+ IY UW UW b n/a 19 2617 2707 2780 N
+ IY UW UW e n/a 19 2614 2707 2782 N
+ IY UW UW s n/a 19 2614 2707 2780 N
+ IY UW V b n/a 19 2617 2677 2731 N
+ IY UW V e n/a 19 2613 2682 2720 N
+ IY UW V i n/a 19 2609 2677 2732 N
+ IY UW V s n/a 19 2609 2677 2732 N
+ IY UW W b n/a 19 2617 2712 2775 N
+ IY UW W e n/a 19 2613 2710 2775 N
+ IY UW W s n/a 19 2610 2712 2775 N
+ IY UW Y e n/a 19 2614 2707 2771 N
+ IY UW Y s n/a 19 2614 2707 2771 N
+ IY UW Z b n/a 19 2617 2677 2734 N
+ IY UW Z e n/a 19 2613 2682 2733 N
+ IY UW Z i n/a 19 2613 2677 2733 N
+ IY UW Z s n/a 19 2613 2677 2733 N
+ IY UW ZH b n/a 19 2617 2677 2734 N
+ IY UW ZH e n/a 19 2613 2682 2733 N
+ IY UW ZH s n/a 19 2609 2677 2733 N
+ IY V AA b n/a 19 2594 2698 2781 N
+ IY V AA e n/a 19 2603 2698 2781 N
+ IY V AA i n/a 19 2603 2699 2781 N
+ IY V AA s n/a 19 2603 2698 2781 N
+ IY V AE e n/a 19 2603 2660 2748 N
+ IY V AE i n/a 19 2603 2659 2752 N
+ IY V AE s n/a 19 2603 2660 2748 N
+ IY V AH b n/a 19 2594 2660 2759 N
+ IY V AH e n/a 19 2603 2660 2756 N
+ IY V AH i n/a 19 2603 2659 2759 N
+ IY V AH s n/a 19 2603 2660 2759 N
+ IY V AO b n/a 19 2594 2698 2780 N
+ IY V AO e n/a 19 2603 2698 2782 N
+ IY V AO i n/a 19 2603 2699 2780 N
+ IY V AO s n/a 19 2603 2698 2780 N
+ IY V AW e n/a 19 2603 2698 2781 N
+ IY V AW s n/a 19 2603 2698 2781 N
+ IY V AY e n/a 19 2603 2660 2757 N
+ IY V AY s n/a 19 2603 2660 2748 N
+ IY V B b n/a 19 2594 2640 2718 N
+ IY V B e n/a 19 2603 2640 2718 N
+ IY V B i n/a 19 2603 2640 2718 N
+ IY V B s n/a 19 2603 2640 2718 N
+ IY V CH b n/a 19 2594 2632 2723 N
+ IY V CH e n/a 19 2603 2643 2724 N
+ IY V CH i n/a 19 2603 2631 2723 N
+ IY V CH s n/a 19 2603 2632 2723 N
+ IY V D b n/a 19 2594 2636 2721 N
+ IY V D e n/a 19 2603 2643 2725 N
+ IY V D i n/a 19 2603 2636 2721 N
+ IY V D s n/a 19 2603 2636 2721 N
+ IY V DH b n/a 19 2594 2629 2731 N
+ IY V DH e n/a 19 2603 2652 2720 N
+ IY V DH s n/a 19 2603 2652 2731 N
+ IY V EH b n/a 19 2594 2660 2750 N
+ IY V EH e n/a 19 2603 2660 2750 N
+ IY V EH i n/a 19 2603 2659 2752 N
+ IY V EH s n/a 19 2603 2660 2750 N
+ IY V ER b n/a 19 2594 2698 2761 N
+ IY V ER e n/a 19 2603 2698 2783 N
+ IY V ER i n/a 19 2603 2697 2761 N
+ IY V ER s n/a 19 2603 2698 2761 N
+ IY V EY b n/a 19 2594 2660 2749 N
+ IY V EY e n/a 19 2603 2660 2749 N
+ IY V EY i n/a 19 2603 2659 2753 N
+ IY V EY s n/a 19 2603 2660 2749 N
+ IY V F b n/a 19 2594 2634 2741 N
+ IY V F e n/a 19 2603 2639 2741 N
+ IY V F s n/a 19 2603 2634 2741 N
+ IY V G b n/a 19 2594 2647 2726 N
+ IY V G e n/a 19 2603 2644 2727 N
+ IY V G i n/a 19 2603 2644 2726 N
+ IY V G s n/a 19 2603 2644 2726 N
+ IY V HH e n/a 19 2603 2634 2729 N
+ IY V HH i n/a 19 2603 2633 2729 N
+ IY V HH s n/a 19 2603 2634 2729 N
+ IY V IH e n/a 19 2603 2654 2768 N
+ IY V IH i n/a 19 2603 2656 2772 N
+ IY V IH s n/a 19 2603 2654 2768 N
+ IY V IY b n/a 19 2594 2654 2770 N
+ IY V IY e n/a 19 2603 2654 2770 N
+ IY V IY i n/a 19 2603 2656 2770 N
+ IY V IY s n/a 19 2603 2654 2770 N
+ IY V JH b n/a 19 2594 2636 2725 N
+ IY V JH e n/a 19 2603 2643 2725 N
+ IY V JH i n/a 19 2603 2636 2725 N
+ IY V JH s n/a 19 2603 2636 2725 N
+ IY V K b n/a 19 2594 2647 2726 N
+ IY V K e n/a 19 2603 2644 2726 N
+ IY V K i n/a 19 2603 2644 2726 N
+ IY V K s n/a 19 2603 2644 2726 N
+ IY V L b n/a 19 2594 2698 2778 N
+ IY V L e n/a 19 2603 2713 2774 N
+ IY V L i n/a 19 2603 2699 2779 N
+ IY V L s n/a 19 2603 2698 2778 N
+ IY V M b n/a 19 2594 2674 2763 N
+ IY V M e n/a 19 2603 2674 2763 N
+ IY V M i n/a 19 2603 2663 2766 N
+ IY V M s n/a 19 2603 2674 2763 N
+ IY V N b n/a 19 2594 2674 2762 N
+ IY V N e n/a 19 2603 2674 2762 N
+ IY V N i n/a 19 2603 2664 2765 N
+ IY V N s n/a 19 2603 2674 2762 N
+ IY V NG b n/a 19 2594 2674 2762 N
+ IY V NG e n/a 19 2603 2674 2762 N
+ IY V NG s n/a 19 2603 2674 2762 N
+ IY V OW b n/a 19 2594 2698 2780 N
+ IY V OW e n/a 19 2603 2698 2782 N
+ IY V OW i n/a 19 2603 2699 2780 N
+ IY V OW s n/a 19 2603 2698 2780 N
+ IY V OY e n/a 19 2603 2660 2757 N
+ IY V OY s n/a 19 2603 2660 2748 N
+ IY V P b n/a 19 2594 2640 2715 N
+ IY V P e n/a 19 2603 2640 2716 N
+ IY V P i n/a 19 2603 2640 2715 N
+ IY V P s n/a 19 2603 2640 2715 N
+ IY V R b n/a 19 2594 2698 2761 N
+ IY V R e n/a 19 2603 2713 2776 N
+ IY V R i n/a 19 2603 2697 2761 N
+ IY V R s n/a 19 2603 2698 2761 N
+ IY V S b n/a 19 2594 2632 2736 N
+ IY V S e n/a 19 2603 2639 2736 N
+ IY V S i n/a 19 2603 2631 2736 N
+ IY V S s n/a 19 2603 2632 2736 N
+ IY V SH b n/a 19 2594 2634 2739 N
+ IY V SH e n/a 19 2603 2639 2739 N
+ IY V SH i n/a 19 2603 2633 2739 N
+ IY V SH s n/a 19 2603 2634 2739 N
+ IY V SIL e n/a 19 2603 2648 2744 N
+ IY V SIL s n/a 19 2603 2648 2745 N
+ IY V T b n/a 19 2594 2632 2723 N
+ IY V T e n/a 19 2603 2643 2724 N
+ IY V T i n/a 19 2603 2631 2723 N
+ IY V T s n/a 19 2603 2632 2723 N
+ IY V TH b n/a 19 2594 2632 2741 N
+ IY V TH e n/a 19 2603 2639 2741 N
+ IY V TH i n/a 19 2603 2631 2741 N
+ IY V TH s n/a 19 2603 2632 2741 N
+ IY V UH e n/a 19 2603 2698 2783 N
+ IY V UH s n/a 19 2603 2698 2783 N
+ IY V UW b n/a 19 2594 2698 2780 N
+ IY V UW e n/a 19 2603 2698 2782 N
+ IY V UW i n/a 19 2603 2699 2780 N
+ IY V UW s n/a 19 2603 2698 2780 N
+ IY V V b n/a 19 2594 2629 2731 N
+ IY V V e n/a 19 2603 2652 2720 N
+ IY V V i n/a 19 2603 2652 2731 N
+ IY V V s n/a 19 2603 2652 2731 N
+ IY V W b n/a 19 2594 2713 2776 N
+ IY V W e n/a 19 2603 2713 2776 N
+ IY V W i n/a 19 2603 2713 2776 N
+ IY V W s n/a 19 2603 2713 2776 N
+ IY V Y e n/a 19 2603 2643 2771 N
+ IY V Y i n/a 19 2603 2636 2771 N
+ IY V Y s n/a 19 2603 2636 2771 N
+ IY V Z b n/a 19 2594 2629 2734 N
+ IY V Z e n/a 19 2603 2653 2733 N
+ IY V Z i n/a 19 2603 2651 2733 N
+ IY V Z s n/a 19 2603 2651 2733 N
+ IY V ZH b n/a 19 2594 2629 2734 N
+ IY V ZH e n/a 19 2603 2652 2733 N
+ IY V ZH s n/a 19 2603 2651 2733 N
+ IY W AA b n/a 19 2628 2701 2781 N
+ IY W AA e n/a 19 2628 2701 2781 N
+ IY W AA i n/a 19 2628 2701 2781 N
+ IY W AA s n/a 19 2628 2701 2781 N
+ IY W AE e n/a 19 2628 2701 2748 N
+ IY W AE i n/a 19 2628 2701 2752 N
+ IY W AE s n/a 19 2628 2701 2748 N
+ IY W AH b n/a 19 2628 2701 2759 N
+ IY W AH e n/a 19 2628 2701 2756 N
+ IY W AH i n/a 19 2628 2701 2759 N
+ IY W AH s n/a 19 2628 2701 2759 N
+ IY W AO b n/a 19 2628 2701 2780 N
+ IY W AO e n/a 19 2628 2701 2782 N
+ IY W AO i n/a 19 2628 2701 2780 N
+ IY W AO s n/a 19 2628 2701 2780 N
+ IY W AW e n/a 19 2628 2701 2781 N
+ IY W AW s n/a 19 2628 2701 2781 N
+ IY W AY e n/a 19 2628 2701 2757 N
+ IY W AY s n/a 19 2628 2701 2748 N
+ IY W B b n/a 19 2627 2680 2718 N
+ IY W B e n/a 19 2627 2690 2718 N
+ IY W B i n/a 19 2628 2679 2718 N
+ IY W B s n/a 19 2627 2680 2718 N
+ IY W CH b n/a 19 2627 2696 2723 N
+ IY W CH e n/a 19 2627 2690 2724 N
+ IY W CH i n/a 19 2628 2696 2723 N
+ IY W CH s n/a 19 2627 2696 2723 N
+ IY W D b n/a 19 2627 2680 2721 N
+ IY W D e n/a 19 2627 2690 2725 N
+ IY W D i n/a 19 2628 2680 2721 N
+ IY W D s n/a 19 2627 2680 2721 N
+ IY W DH b n/a 19 2627 2680 2731 N
+ IY W DH e n/a 19 2627 2682 2719 N
+ IY W DH i n/a 19 2627 2680 2732 N
+ IY W DH s n/a 19 2627 2680 2732 N
+ IY W EH b n/a 19 2628 2701 2750 N
+ IY W EH e n/a 19 2628 2701 2750 N
+ IY W EH i n/a 19 2628 2701 2752 N
+ IY W EH s n/a 19 2628 2701 2750 N
+ IY W ER b n/a 19 2628 2701 2761 N
+ IY W ER e n/a 19 2628 2701 2781 N
+ IY W ER i n/a 19 2628 2701 2761 N
+ IY W ER s n/a 19 2628 2701 2761 N
+ IY W EY b n/a 19 2628 2701 2749 N
+ IY W EY e n/a 19 2628 2701 2749 N
+ IY W EY s n/a 19 2628 2701 2749 N
+ IY W F b n/a 19 2627 2696 2740 N
+ IY W F e n/a 19 2627 2690 2740 N
+ IY W F i n/a 19 2627 2696 2740 N
+ IY W F s n/a 19 2627 2696 2740 N
+ IY W G b n/a 19 2627 2680 2726 N
+ IY W G e n/a 19 2627 2690 2727 N
+ IY W G i n/a 19 2628 2679 2726 N
+ IY W G s n/a 19 2627 2680 2726 N
+ IY W HH e n/a 19 2628 2689 2729 N
+ IY W HH i n/a 19 2628 2696 2729 N
+ IY W HH s n/a 19 2628 2696 2729 N
+ IY W IH e n/a 19 2628 2701 2769 N
+ IY W IH i n/a 19 2628 2701 2772 N
+ IY W IH s n/a 19 2628 2701 2769 N
+ IY W IY b n/a 19 2628 2701 2770 N
+ IY W IY e n/a 19 2628 2701 2770 N
+ IY W IY i n/a 19 2628 2701 2770 N
+ IY W IY s n/a 19 2628 2701 2770 N
+ IY W JH b n/a 19 2627 2680 2725 N
+ IY W JH e n/a 19 2627 2690 2725 N
+ IY W JH i n/a 19 2628 2680 2725 N
+ IY W JH s n/a 19 2627 2680 2725 N
+ IY W K b n/a 19 2627 2696 2726 N
+ IY W K e n/a 19 2627 2690 2728 N
+ IY W K i n/a 19 2628 2696 2726 N
+ IY W K s n/a 19 2627 2696 2726 N
+ IY W L b n/a 19 2628 2710 2778 N
+ IY W L e n/a 19 2628 2712 2774 N
+ IY W L i n/a 19 2628 2710 2779 N
+ IY W L s n/a 19 2628 2710 2778 N
+ IY W M b n/a 19 2628 2681 2763 N
+ IY W M e n/a 19 2628 2689 2763 N
+ IY W M i n/a 19 2626 2681 2766 N
+ IY W M s n/a 19 2628 2681 2763 N
+ IY W N b n/a 19 2628 2681 2762 N
+ IY W N e n/a 19 2628 2689 2762 N
+ IY W N i n/a 19 2626 2681 2765 N
+ IY W N s n/a 19 2628 2681 2762 N
+ IY W NG b n/a 19 2628 2681 2762 N
+ IY W NG e n/a 19 2628 2689 2762 N
+ IY W NG i n/a 19 2626 2681 2765 N
+ IY W NG s n/a 19 2628 2681 2762 N
+ IY W OW b n/a 19 2628 2701 2780 N
+ IY W OW e n/a 19 2628 2701 2782 N
+ IY W OW s n/a 19 2628 2701 2780 N
+ IY W OY e n/a 19 2628 2701 2757 N
+ IY W OY s n/a 19 2628 2701 2748 N
+ IY W P b n/a 19 2627 2696 2715 N
+ IY W P e n/a 19 2627 2690 2717 N
+ IY W P i n/a 19 2628 2696 2715 N
+ IY W P s n/a 19 2627 2696 2715 N
+ IY W R b n/a 19 2628 2710 2761 N
+ IY W R e n/a 19 2628 2712 2775 N
+ IY W R i n/a 19 2628 2710 2761 N
+ IY W R s n/a 19 2628 2710 2761 N
+ IY W S b n/a 19 2627 2696 2736 N
+ IY W S e n/a 19 2627 2690 2737 N
+ IY W S i n/a 19 2626 2696 2736 N
+ IY W S s n/a 19 2627 2696 2736 N
+ IY W SH b n/a 19 2627 2696 2739 N
+ IY W SH e n/a 19 2627 2690 2739 N
+ IY W SH s n/a 19 2627 2696 2739 N
+ IY W SIL e n/a 19 2628 2680 2742 N
+ IY W SIL s n/a 19 2628 2680 2742 N
+ IY W T b n/a 19 2627 2696 2723 N
+ IY W T e n/a 19 2627 2690 2724 N
+ IY W T i n/a 19 2628 2696 2723 N
+ IY W T s n/a 19 2627 2696 2723 N
+ IY W TH b n/a 19 2627 2696 2741 N
+ IY W TH e n/a 19 2627 2690 2741 N
+ IY W TH i n/a 19 2627 2696 2741 N
+ IY W TH s n/a 19 2627 2696 2741 N
+ IY W UH e n/a 19 2628 2701 2781 N
+ IY W UH s n/a 19 2628 2701 2781 N
+ IY W UW b n/a 19 2628 2701 2780 N
+ IY W UW e n/a 19 2628 2701 2782 N
+ IY W UW s n/a 19 2628 2701 2780 N
+ IY W V b n/a 19 2627 2680 2731 N
+ IY W V e n/a 19 2627 2682 2720 N
+ IY W V i n/a 19 2627 2679 2732 N
+ IY W V s n/a 19 2627 2680 2732 N
+ IY W W b n/a 19 2627 2712 2775 N
+ IY W W e n/a 19 2627 2712 2775 N
+ IY W W i n/a 19 2627 2712 2775 N
+ IY W W s n/a 19 2627 2712 2775 N
+ IY W Y e n/a 19 2628 2701 2771 N
+ IY W Y i n/a 19 2628 2701 2771 N
+ IY W Y s n/a 19 2628 2701 2771 N
+ IY W Z b n/a 19 2627 2680 2735 N
+ IY W Z e n/a 19 2627 2682 2735 N
+ IY W Z i n/a 19 2626 2679 2735 N
+ IY W Z s n/a 19 2627 2680 2735 N
+ IY W ZH b n/a 19 2627 2680 2735 N
+ IY W ZH e n/a 19 2627 2682 2735 N
+ IY W ZH s n/a 19 2627 2680 2735 N
+ IY Y AA b n/a 19 2594 2698 2781 N
+ IY Y AA e n/a 19 2604 2698 2781 N
+ IY Y AA s n/a 19 2604 2698 2781 N
+ IY Y AE e n/a 19 2604 2654 2748 N
+ IY Y AE s n/a 19 2604 2654 2748 N
+ IY Y AH b n/a 19 2594 2660 2759 N
+ IY Y AH e n/a 19 2604 2660 2756 N
+ IY Y AH i n/a 19 2604 2658 2759 N
+ IY Y AH s n/a 19 2604 2660 2759 N
+ IY Y AO b n/a 19 2594 2698 2780 N
+ IY Y AO e n/a 19 2604 2698 2782 N
+ IY Y AO s n/a 19 2604 2698 2780 N
+ IY Y AW e n/a 19 2604 2698 2781 N
+ IY Y AW i n/a 19 2604 2699 2781 N
+ IY Y AW s n/a 19 2604 2698 2781 N
+ IY Y AY e n/a 19 2604 2654 2757 N
+ IY Y AY s n/a 19 2604 2654 2748 N
+ IY Y B b n/a 19 2594 2640 2718 N
+ IY Y B e n/a 19 2604 2640 2718 N
+ IY Y B s n/a 19 2604 2640 2718 N
+ IY Y CH b n/a 19 2594 2632 2723 N
+ IY Y CH e n/a 19 2604 2643 2724 N
+ IY Y CH i n/a 19 2604 2631 2723 N
+ IY Y CH s n/a 19 2604 2632 2723 N
+ IY Y D b n/a 19 2594 2636 2721 N
+ IY Y D e n/a 19 2604 2643 2725 N
+ IY Y D i n/a 19 2604 2636 2721 N
+ IY Y D s n/a 19 2604 2636 2721 N
+ IY Y DH b n/a 19 2594 2629 2731 N
+ IY Y DH e n/a 19 2604 2652 2720 N
+ IY Y DH s n/a 19 2604 2652 2731 N
+ IY Y EH b n/a 19 2594 2654 2750 N
+ IY Y EH e n/a 19 2604 2654 2750 N
+ IY Y EH s n/a 19 2604 2654 2750 N
+ IY Y ER b n/a 19 2594 2698 2761 N
+ IY Y ER e n/a 19 2604 2698 2783 N
+ IY Y ER s n/a 19 2604 2698 2761 N
+ IY Y EY b n/a 19 2594 2654 2749 N
+ IY Y EY e n/a 19 2604 2654 2749 N
+ IY Y EY i n/a 19 2604 2659 2753 N
+ IY Y EY s n/a 19 2604 2654 2749 N
+ IY Y F b n/a 19 2594 2634 2740 N
+ IY Y F e n/a 19 2604 2639 2740 N
+ IY Y F s n/a 19 2604 2634 2740 N
+ IY Y G b n/a 19 2594 2647 2726 N
+ IY Y G e n/a 19 2604 2647 2727 N
+ IY Y G i n/a 19 2604 2647 2726 N
+ IY Y G s n/a 19 2604 2647 2726 N
+ IY Y HH e n/a 19 2604 2634 2729 N
+ IY Y HH s n/a 19 2604 2634 2729 N
+ IY Y IH e n/a 19 2604 2654 2769 N
+ IY Y IH s n/a 19 2604 2654 2769 N
+ IY Y IY b n/a 19 2594 2654 2770 N
+ IY Y IY e n/a 19 2604 2654 2770 N
+ IY Y IY s n/a 19 2604 2654 2770 N
+ IY Y JH b n/a 19 2594 2636 2725 N
+ IY Y JH e n/a 19 2604 2643 2725 N
+ IY Y JH i n/a 19 2604 2636 2725 N
+ IY Y JH s n/a 19 2604 2636 2725 N
+ IY Y K b n/a 19 2594 2647 2726 N
+ IY Y K e n/a 19 2604 2647 2726 N
+ IY Y K i n/a 19 2604 2647 2726 N
+ IY Y K s n/a 19 2604 2647 2726 N
+ IY Y L b n/a 19 2594 2698 2778 N
+ IY Y L e n/a 19 2604 2713 2774 N
+ IY Y L i n/a 19 2604 2699 2779 N
+ IY Y L s n/a 19 2604 2698 2778 N
+ IY Y M b n/a 19 2594 2674 2763 N
+ IY Y M e n/a 19 2604 2674 2763 N
+ IY Y M i n/a 19 2604 2664 2766 N
+ IY Y M s n/a 19 2604 2674 2763 N
+ IY Y N b n/a 19 2594 2674 2762 N
+ IY Y N e n/a 19 2604 2674 2762 N
+ IY Y N s n/a 19 2604 2674 2762 N
+ IY Y NG b n/a 19 2594 2674 2762 N
+ IY Y NG e n/a 19 2604 2674 2762 N
+ IY Y NG s n/a 19 2604 2674 2762 N
+ IY Y OW b n/a 19 2594 2698 2780 N
+ IY Y OW e n/a 19 2604 2698 2782 N
+ IY Y OW i n/a 19 2604 2699 2780 N
+ IY Y OW s n/a 19 2604 2698 2780 N
+ IY Y OY e n/a 19 2604 2654 2757 N
+ IY Y OY s n/a 19 2604 2654 2748 N
+ IY Y P b n/a 19 2594 2640 2715 N
+ IY Y P e n/a 19 2604 2640 2716 N
+ IY Y P s n/a 19 2604 2640 2715 N
+ IY Y R b n/a 19 2594 2698 2761 N
+ IY Y R e n/a 19 2604 2713 2776 N
+ IY Y R i n/a 19 2604 2699 2761 N
+ IY Y R s n/a 19 2604 2698 2761 N
+ IY Y S b n/a 19 2594 2632 2736 N
+ IY Y S e n/a 19 2604 2639 2736 N
+ IY Y S i n/a 19 2604 2631 2736 N
+ IY Y S s n/a 19 2604 2632 2736 N
+ IY Y SH b n/a 19 2594 2634 2739 N
+ IY Y SH e n/a 19 2604 2639 2739 N
+ IY Y SH s n/a 19 2604 2634 2739 N
+ IY Y SIL e n/a 19 2604 2648 2744 N
+ IY Y SIL s n/a 19 2604 2648 2745 N
+ IY Y T b n/a 19 2594 2632 2723 N
+ IY Y T e n/a 19 2604 2643 2724 N
+ IY Y T i n/a 19 2604 2631 2723 N
+ IY Y T s n/a 19 2604 2632 2723 N
+ IY Y TH b n/a 19 2594 2632 2741 N
+ IY Y TH e n/a 19 2604 2639 2741 N
+ IY Y TH s n/a 19 2604 2632 2741 N
+ IY Y UH e n/a 19 2604 2698 2783 N
+ IY Y UH s n/a 19 2604 2698 2783 N
+ IY Y UW b n/a 19 2594 2698 2780 N
+ IY Y UW e n/a 19 2604 2698 2782 N
+ IY Y UW s n/a 19 2604 2698 2780 N
+ IY Y V b n/a 19 2594 2629 2731 N
+ IY Y V e n/a 19 2604 2652 2720 N
+ IY Y V i n/a 19 2604 2652 2731 N
+ IY Y V s n/a 19 2604 2652 2731 N
+ IY Y W b n/a 19 2594 2713 2776 N
+ IY Y W e n/a 19 2604 2713 2776 N
+ IY Y W s n/a 19 2604 2713 2776 N
+ IY Y Y e n/a 19 2604 2643 2771 N
+ IY Y Y s n/a 19 2604 2636 2771 N
+ IY Y Z b n/a 19 2594 2629 2734 N
+ IY Y Z e n/a 19 2604 2653 2733 N
+ IY Y Z i n/a 19 2604 2651 2733 N
+ IY Y Z s n/a 19 2604 2651 2733 N
+ IY Y ZH b n/a 19 2594 2629 2734 N
+ IY Y ZH e n/a 19 2604 2652 2733 N
+ IY Y ZH s n/a 19 2604 2651 2733 N
+ IY Z AA b n/a 19 2594 2698 2781 N
+ IY Z AA e n/a 19 2602 2698 2781 N
+ IY Z AA i n/a 19 2602 2699 2781 N
+ IY Z AA s n/a 19 2602 2698 2781 N
+ IY Z AE e n/a 19 2602 2660 2748 N
+ IY Z AE i n/a 19 2602 2659 2752 N
+ IY Z AE s n/a 19 2602 2660 2748 N
+ IY Z AH b n/a 19 2594 2660 2759 N
+ IY Z AH e n/a 19 2602 2660 2756 N
+ IY Z AH i n/a 19 2602 2659 2759 N
+ IY Z AH s n/a 19 2602 2660 2759 N
+ IY Z AO b n/a 19 2594 2698 2780 N
+ IY Z AO e n/a 19 2602 2698 2782 N
+ IY Z AO i n/a 19 2602 2699 2780 N
+ IY Z AO s n/a 19 2602 2698 2780 N
+ IY Z AW e n/a 19 2602 2698 2781 N
+ IY Z AW s n/a 19 2602 2698 2781 N
+ IY Z AY e n/a 19 2602 2660 2757 N
+ IY Z AY i n/a 19 2602 2659 2752 N
+ IY Z AY s n/a 19 2602 2660 2748 N
+ IY Z B b n/a 19 2594 2640 2718 N
+ IY Z B e n/a 19 2602 2640 2718 N
+ IY Z B i n/a 19 2602 2640 2718 N
+ IY Z B s n/a 19 2602 2640 2718 N
+ IY Z CH b n/a 19 2594 2632 2723 N
+ IY Z CH e n/a 19 2602 2643 2724 N
+ IY Z CH s n/a 19 2602 2632 2723 N
+ IY Z D b n/a 19 2594 2636 2721 N
+ IY Z D e n/a 19 2602 2643 2725 N
+ IY Z D i n/a 19 2602 2636 2721 N
+ IY Z D s n/a 19 2602 2636 2721 N
+ IY Z DH b n/a 19 2594 2629 2731 N
+ IY Z DH e n/a 19 2602 2652 2720 N
+ IY Z DH s n/a 19 2602 2652 2731 N
+ IY Z EH b n/a 19 2594 2660 2750 N
+ IY Z EH e n/a 19 2602 2660 2750 N
+ IY Z EH i n/a 19 2602 2659 2752 N
+ IY Z EH s n/a 19 2602 2660 2750 N
+ IY Z ER b n/a 19 2594 2698 2761 N
+ IY Z ER e n/a 19 2602 2698 2783 N
+ IY Z ER i n/a 19 2602 2697 2761 N
+ IY Z ER s n/a 19 2602 2698 2761 N
+ IY Z EY b n/a 19 2594 2660 2749 N
+ IY Z EY e n/a 19 2602 2660 2749 N
+ IY Z EY i n/a 19 2602 2659 2753 N
+ IY Z EY s n/a 19 2602 2660 2749 N
+ IY Z F b n/a 19 2594 2634 2741 N
+ IY Z F e n/a 19 2602 2639 2741 N
+ IY Z F s n/a 19 2602 2634 2741 N
+ IY Z G b n/a 19 2594 2647 2726 N
+ IY Z G e n/a 19 2602 2644 2727 N
+ IY Z G i n/a 19 2602 2644 2726 N
+ IY Z G s n/a 19 2602 2644 2726 N
+ IY Z HH e n/a 19 2602 2634 2729 N
+ IY Z HH s n/a 19 2602 2634 2729 N
+ IY Z IH e n/a 19 2602 2654 2768 N
+ IY Z IH i n/a 19 2602 2656 2773 N
+ IY Z IH s n/a 19 2602 2654 2768 N
+ IY Z IY b n/a 19 2594 2654 2770 N
+ IY Z IY e n/a 19 2602 2654 2770 N
+ IY Z IY i n/a 19 2602 2656 2770 N
+ IY Z IY s n/a 19 2602 2654 2770 N
+ IY Z JH b n/a 19 2594 2636 2725 N
+ IY Z JH e n/a 19 2602 2643 2725 N
+ IY Z JH i n/a 19 2602 2636 2725 N
+ IY Z JH s n/a 19 2602 2636 2725 N
+ IY Z K b n/a 19 2594 2647 2726 N
+ IY Z K e n/a 19 2602 2644 2726 N
+ IY Z K i n/a 19 2602 2644 2726 N
+ IY Z K s n/a 19 2602 2644 2726 N
+ IY Z L b n/a 19 2594 2698 2778 N
+ IY Z L e n/a 19 2602 2713 2774 N
+ IY Z L i n/a 19 2602 2699 2779 N
+ IY Z L s n/a 19 2602 2698 2778 N
+ IY Z M b n/a 19 2594 2674 2763 N
+ IY Z M e n/a 19 2602 2674 2763 N
+ IY Z M i n/a 19 2602 2663 2766 N
+ IY Z M s n/a 19 2602 2674 2763 N
+ IY Z N b n/a 19 2594 2674 2762 N
+ IY Z N e n/a 19 2602 2674 2762 N
+ IY Z N i n/a 19 2602 2664 2765 N
+ IY Z N s n/a 19 2602 2674 2762 N
+ IY Z NG b n/a 19 2594 2674 2762 N
+ IY Z NG e n/a 19 2602 2674 2762 N
+ IY Z NG i n/a 19 2602 2663 2765 N
+ IY Z NG s n/a 19 2602 2674 2762 N
+ IY Z OW b n/a 19 2594 2698 2780 N
+ IY Z OW e n/a 19 2602 2698 2782 N
+ IY Z OW i n/a 19 2602 2699 2780 N
+ IY Z OW s n/a 19 2602 2698 2780 N
+ IY Z OY e n/a 19 2602 2660 2757 N
+ IY Z OY s n/a 19 2602 2660 2748 N
+ IY Z P b n/a 19 2594 2640 2715 N
+ IY Z P e n/a 19 2602 2640 2715 N
+ IY Z P i n/a 19 2602 2640 2715 N
+ IY Z P s n/a 19 2602 2640 2715 N
+ IY Z R b n/a 19 2594 2698 2761 N
+ IY Z R e n/a 19 2602 2713 2776 N
+ IY Z R i n/a 19 2602 2697 2761 N
+ IY Z R s n/a 19 2602 2698 2761 N
+ IY Z S b n/a 19 2594 2632 2736 N
+ IY Z S e n/a 19 2602 2639 2736 N
+ IY Z S i n/a 19 2602 2631 2736 N
+ IY Z S s n/a 19 2602 2632 2736 N
+ IY Z SH b n/a 19 2594 2634 2739 N
+ IY Z SH e n/a 19 2602 2639 2739 N
+ IY Z SH s n/a 19 2602 2634 2739 N
+ IY Z SIL e n/a 19 2602 2648 2745 N
+ IY Z SIL s n/a 19 2602 2648 2745 N
+ IY Z T b n/a 19 2594 2632 2723 N
+ IY Z T e n/a 19 2602 2643 2724 N
+ IY Z T i n/a 19 2602 2631 2723 N
+ IY Z T s n/a 19 2602 2632 2723 N
+ IY Z TH b n/a 19 2594 2632 2741 N
+ IY Z TH e n/a 19 2602 2639 2741 N
+ IY Z TH i n/a 19 2602 2631 2741 N
+ IY Z TH s n/a 19 2602 2632 2741 N
+ IY Z UH e n/a 19 2602 2698 2783 N
+ IY Z UH s n/a 19 2602 2698 2783 N
+ IY Z UW b n/a 19 2594 2698 2780 N
+ IY Z UW e n/a 19 2602 2698 2782 N
+ IY Z UW i n/a 19 2602 2699 2780 N
+ IY Z UW s n/a 19 2602 2698 2780 N
+ IY Z V b n/a 19 2594 2629 2731 N
+ IY Z V e n/a 19 2602 2652 2720 N
+ IY Z V i n/a 19 2602 2652 2731 N
+ IY Z V s n/a 19 2602 2652 2731 N
+ IY Z W b n/a 19 2594 2713 2776 N
+ IY Z W e n/a 19 2602 2713 2776 N
+ IY Z W i n/a 19 2602 2713 2776 N
+ IY Z W s n/a 19 2602 2713 2776 N
+ IY Z Y e n/a 19 2602 2643 2771 N
+ IY Z Y s n/a 19 2602 2636 2771 N
+ IY Z Z b n/a 19 2594 2629 2734 N
+ IY Z Z e n/a 19 2602 2653 2733 N
+ IY Z Z i n/a 19 2602 2651 2733 N
+ IY Z Z s n/a 19 2602 2651 2733 N
+ IY Z ZH b n/a 19 2594 2629 2734 N
+ IY Z ZH e n/a 19 2602 2652 2733 N
+ IY Z ZH s n/a 19 2602 2651 2733 N
+ IY ZH AA b n/a 19 2594 2698 2781 N
+ IY ZH AA e n/a 19 2602 2698 2781 N
+ IY ZH AA i n/a 19 2602 2699 2781 N
+ IY ZH AA s n/a 19 2602 2698 2781 N
+ IY ZH AE e n/a 19 2602 2660 2751 N
+ IY ZH AE i n/a 19 2602 2659 2752 N
+ IY ZH AE s n/a 19 2602 2660 2751 N
+ IY ZH AH b n/a 19 2594 2660 2759 N
+ IY ZH AH e n/a 19 2602 2660 2756 N
+ IY ZH AH i n/a 19 2602 2659 2759 N
+ IY ZH AH s n/a 19 2602 2660 2759 N
+ IY ZH AO b n/a 19 2594 2698 2780 N
+ IY ZH AO e n/a 19 2602 2698 2782 N
+ IY ZH AO s n/a 19 2602 2698 2780 N
+ IY ZH AW e n/a 19 2602 2698 2781 N
+ IY ZH AW s n/a 19 2602 2698 2781 N
+ IY ZH AY e n/a 19 2602 2660 2757 N
+ IY ZH AY s n/a 19 2602 2660 2751 N
+ IY ZH B b n/a 19 2594 2640 2718 N
+ IY ZH B e n/a 19 2602 2640 2718 N
+ IY ZH B s n/a 19 2602 2640 2718 N
+ IY ZH CH b n/a 19 2594 2632 2723 N
+ IY ZH CH e n/a 19 2602 2647 2724 N
+ IY ZH CH s n/a 19 2602 2632 2723 N
+ IY ZH D b n/a 19 2594 2636 2721 N
+ IY ZH D e n/a 19 2602 2647 2725 N
+ IY ZH D s n/a 19 2602 2636 2721 N
+ IY ZH DH b n/a 19 2594 2629 2731 N
+ IY ZH DH e n/a 19 2602 2652 2720 N
+ IY ZH DH s n/a 19 2602 2652 2731 N
+ IY ZH EH b n/a 19 2594 2660 2750 N
+ IY ZH EH e n/a 19 2602 2660 2750 N
+ IY ZH EH i n/a 19 2602 2659 2752 N
+ IY ZH EH s n/a 19 2602 2660 2750 N
+ IY ZH ER b n/a 19 2594 2698 2761 N
+ IY ZH ER e n/a 19 2602 2698 2783 N
+ IY ZH ER s n/a 19 2602 2698 2761 N
+ IY ZH EY b n/a 19 2594 2660 2749 N
+ IY ZH EY e n/a 19 2602 2660 2749 N
+ IY ZH EY i n/a 19 2602 2659 2753 N
+ IY ZH EY s n/a 19 2602 2660 2749 N
+ IY ZH F b n/a 19 2594 2635 2741 N
+ IY ZH F e n/a 19 2602 2639 2741 N
+ IY ZH F s n/a 19 2602 2635 2741 N
+ IY ZH G b n/a 19 2594 2647 2726 N
+ IY ZH G e n/a 19 2602 2645 2727 N
+ IY ZH G s n/a 19 2602 2645 2726 N
+ IY ZH HH e n/a 19 2602 2635 2730 N
+ IY ZH HH s n/a 19 2602 2635 2730 N
+ IY ZH IH e n/a 19 2602 2655 2767 N
+ IY ZH IH s n/a 19 2602 2655 2767 N
+ IY ZH IY b n/a 19 2594 2655 2770 N
+ IY ZH IY e n/a 19 2602 2655 2770 N
+ IY ZH IY s n/a 19 2602 2655 2770 N
+ IY ZH JH b n/a 19 2594 2636 2725 N
+ IY ZH JH e n/a 19 2602 2647 2725 N
+ IY ZH JH i n/a 19 2602 2636 2725 N
+ IY ZH JH s n/a 19 2602 2636 2725 N
+ IY ZH K b n/a 19 2594 2647 2726 N
+ IY ZH K e n/a 19 2602 2645 2726 N
+ IY ZH K i n/a 19 2602 2645 2726 N
+ IY ZH K s n/a 19 2602 2645 2726 N
+ IY ZH L b n/a 19 2594 2698 2778 N
+ IY ZH L e n/a 19 2602 2713 2774 N
+ IY ZH L i n/a 19 2602 2699 2779 N
+ IY ZH L s n/a 19 2602 2698 2778 N
+ IY ZH M b n/a 19 2594 2673 2763 N
+ IY ZH M e n/a 19 2602 2673 2763 N
+ IY ZH M i n/a 19 2602 2664 2766 N
+ IY ZH M s n/a 19 2602 2673 2763 N
+ IY ZH N b n/a 19 2594 2674 2762 N
+ IY ZH N e n/a 19 2602 2674 2762 N
+ IY ZH N i n/a 19 2602 2664 2765 N
+ IY ZH N s n/a 19 2602 2674 2762 N
+ IY ZH NG b n/a 19 2594 2673 2762 N
+ IY ZH NG e n/a 19 2602 2673 2762 N
+ IY ZH NG s n/a 19 2602 2673 2762 N
+ IY ZH OW b n/a 19 2594 2698 2780 N
+ IY ZH OW e n/a 19 2602 2698 2782 N
+ IY ZH OW i n/a 19 2602 2699 2780 N
+ IY ZH OW s n/a 19 2602 2698 2780 N
+ IY ZH OY e n/a 19 2602 2660 2757 N
+ IY ZH OY s n/a 19 2602 2660 2751 N
+ IY ZH P b n/a 19 2594 2640 2715 N
+ IY ZH P e n/a 19 2602 2640 2716 N
+ IY ZH P s n/a 19 2602 2640 2715 N
+ IY ZH R b n/a 19 2594 2698 2761 N
+ IY ZH R e n/a 19 2602 2713 2777 N
+ IY ZH R s n/a 19 2602 2698 2761 N
+ IY ZH S b n/a 19 2594 2632 2736 N
+ IY ZH S e n/a 19 2602 2639 2737 N
+ IY ZH S s n/a 19 2602 2632 2736 N
+ IY ZH SH b n/a 19 2594 2635 2739 N
+ IY ZH SH e n/a 19 2602 2639 2739 N
+ IY ZH SH s n/a 19 2602 2635 2739 N
+ IY ZH SIL e n/a 19 2602 2649 2745 N
+ IY ZH SIL s n/a 19 2602 2649 2745 N
+ IY ZH T b n/a 19 2594 2632 2723 N
+ IY ZH T e n/a 19 2602 2647 2724 N
+ IY ZH T s n/a 19 2602 2632 2723 N
+ IY ZH TH b n/a 19 2594 2632 2741 N
+ IY ZH TH e n/a 19 2602 2639 2741 N
+ IY ZH TH s n/a 19 2602 2632 2741 N
+ IY ZH UH e n/a 19 2602 2698 2783 N
+ IY ZH UH s n/a 19 2602 2698 2783 N
+ IY ZH UW b n/a 19 2594 2698 2780 N
+ IY ZH UW e n/a 19 2602 2698 2782 N
+ IY ZH UW s n/a 19 2602 2698 2780 N
+ IY ZH V b n/a 19 2594 2629 2731 N
+ IY ZH V e n/a 19 2602 2652 2720 N
+ IY ZH V i n/a 19 2602 2652 2731 N
+ IY ZH V s n/a 19 2602 2652 2731 N
+ IY ZH W b n/a 19 2594 2713 2777 N
+ IY ZH W e n/a 19 2602 2713 2777 N
+ IY ZH W s n/a 19 2602 2713 2777 N
+ IY ZH Y e n/a 19 2602 2643 2771 N
+ IY ZH Y s n/a 19 2602 2636 2771 N
+ IY ZH Z b n/a 19 2594 2629 2734 N
+ IY ZH Z e n/a 19 2602 2653 2733 N
+ IY ZH Z i n/a 19 2602 2651 2733 N
+ IY ZH Z s n/a 19 2602 2651 2733 N
+ IY ZH ZH b n/a 19 2594 2629 2734 N
+ IY ZH ZH e n/a 19 2602 2652 2733 N
+ IY ZH ZH s n/a 19 2602 2651 2733 N
+ JH AA AA b n/a 20 2788 2795 2802 N
+ JH AA AA e n/a 20 2788 2795 2802 N
+ JH AA AA i n/a 20 2788 2795 2802 N
+ JH AA AA s n/a 20 2788 2795 2802 N
+ JH AA AE b n/a 20 2788 2798 2805 N
+ JH AA AE e n/a 20 2788 2798 2808 N
+ JH AA AE s n/a 20 2788 2798 2805 N
+ JH AA AH b n/a 20 2788 2798 2802 N
+ JH AA AH e n/a 20 2788 2798 2808 N
+ JH AA AH i n/a 20 2788 2798 2807 N
+ JH AA AH s n/a 20 2788 2798 2808 N
+ JH AA AO b n/a 20 2788 2795 2804 N
+ JH AA AO e n/a 20 2788 2795 2804 N
+ JH AA AO i n/a 20 2788 2795 2804 N
+ JH AA AO s n/a 20 2788 2795 2804 N
+ JH AA AW b n/a 20 2788 2798 2806 N
+ JH AA AW e n/a 20 2788 2798 2806 N
+ JH AA AW s n/a 20 2788 2798 2806 N
+ JH AA AY b n/a 20 2788 2795 2802 N
+ JH AA AY e n/a 20 2788 2795 2802 N
+ JH AA AY s n/a 20 2788 2795 2802 N
+ JH AA B e n/a 20 2788 2799 2812 N
+ JH AA B i n/a 20 2788 2799 2812 N
+ JH AA B s n/a 20 2788 2799 2812 N
+ JH AA CH e n/a 20 2788 2800 2811 N
+ JH AA CH s n/a 20 2788 2800 2811 N
+ JH AA D e n/a 20 2788 2800 2813 N
+ JH AA D i n/a 20 2788 2800 2813 N
+ JH AA D s n/a 20 2788 2800 2813 N
+ JH AA DH e n/a 20 2788 2800 2813 N
+ JH AA DH s n/a 20 2788 2800 2813 N
+ JH AA EH b n/a 20 2788 2798 2805 N
+ JH AA EH e n/a 20 2788 2798 2808 N
+ JH AA EH i n/a 20 2788 2798 2805 N
+ JH AA EH s n/a 20 2788 2798 2805 N
+ JH AA ER b n/a 20 2788 2795 2810 N
+ JH AA ER e n/a 20 2788 2795 2810 N
+ JH AA ER i n/a 20 2788 2795 2810 N
+ JH AA ER s n/a 20 2788 2795 2810 N
+ JH AA EY b n/a 20 2788 2797 2805 N
+ JH AA EY e n/a 20 2788 2797 2809 N
+ JH AA EY s n/a 20 2788 2797 2805 N
+ JH AA F b n/a 20 2788 2799 2812 N
+ JH AA F e n/a 20 2788 2799 2812 N
+ JH AA F s n/a 20 2788 2799 2812 N
+ JH AA G e n/a 20 2788 2799 2812 N
+ JH AA G s n/a 20 2788 2799 2812 N
+ JH AA HH e n/a 20 2788 2799 2812 N
+ JH AA HH i n/a 20 2788 2799 2812 N
+ JH AA HH s n/a 20 2788 2799 2812 N
+ JH AA IH b n/a 20 2788 2798 2803 N
+ JH AA IH e n/a 20 2788 2798 2807 N
+ JH AA IH i n/a 20 2788 2798 2807 N
+ JH AA IH s n/a 20 2788 2798 2807 N
+ JH AA IY b n/a 20 2788 2797 2809 N
+ JH AA IY e n/a 20 2788 2797 2809 N
+ JH AA IY i n/a 20 2788 2797 2809 N
+ JH AA IY s n/a 20 2788 2797 2809 N
+ JH AA JH e n/a 20 2788 2800 2811 N
+ JH AA JH s n/a 20 2788 2800 2811 N
+ JH AA K b n/a 20 2788 2799 2812 N
+ JH AA K e n/a 20 2788 2799 2812 N
+ JH AA K i n/a 20 2788 2799 2812 N
+ JH AA K s n/a 20 2788 2799 2812 N
+ JH AA L e n/a 20 2788 2799 2812 N
+ JH AA L i n/a 20 2788 2799 2812 N
+ JH AA L s n/a 20 2788 2799 2812 N
+ JH AA M e n/a 20 2788 2799 2812 N
+ JH AA M i n/a 20 2788 2799 2812 N
+ JH AA M s n/a 20 2788 2799 2812 N
+ JH AA N e n/a 20 2788 2800 2813 N
+ JH AA N i n/a 20 2788 2800 2813 N
+ JH AA N s n/a 20 2788 2800 2813 N
+ JH AA NG e n/a 20 2788 2799 2812 N
+ JH AA NG s n/a 20 2788 2799 2812 N
+ JH AA OW b n/a 20 2788 2795 2806 N
+ JH AA OW e n/a 20 2788 2795 2806 N
+ JH AA OW i n/a 20 2788 2795 2806 N
+ JH AA OW s n/a 20 2788 2795 2806 N
+ JH AA OY b n/a 20 2788 2795 2804 N
+ JH AA OY e n/a 20 2788 2795 2804 N
+ JH AA OY s n/a 20 2788 2795 2804 N
+ JH AA P b n/a 20 2788 2799 2812 N
+ JH AA P e n/a 20 2788 2799 2812 N
+ JH AA P i n/a 20 2788 2799 2812 N
+ JH AA P s n/a 20 2788 2799 2812 N
+ JH AA R e n/a 20 2788 2799 2812 N
+ JH AA R s n/a 20 2788 2799 2812 N
+ JH AA S b n/a 20 2788 2800 2813 N
+ JH AA S e n/a 20 2788 2800 2813 N
+ JH AA S i n/a 20 2788 2800 2813 N
+ JH AA S s n/a 20 2788 2800 2813 N
+ JH AA SH e n/a 20 2788 2800 2811 N
+ JH AA SH s n/a 20 2788 2800 2811 N
+ JH AA SIL e n/a 20 2788 2801 2811 N
+ JH AA SIL s n/a 20 2788 2801 2811 N
+ JH AA T e n/a 20 2788 2800 2813 N
+ JH AA T s n/a 20 2788 2800 2813 N
+ JH AA TH e n/a 20 2788 2800 2813 N
+ JH AA TH s n/a 20 2788 2800 2813 N
+ JH AA UH b n/a 20 2788 2795 2810 N
+ JH AA UH e n/a 20 2788 2795 2810 N
+ JH AA UH i n/a 20 2788 2795 2810 N
+ JH AA UH s n/a 20 2788 2795 2810 N
+ JH AA UW b n/a 20 2788 2795 2810 N
+ JH AA UW e n/a 20 2788 2795 2810 N
+ JH AA UW i n/a 20 2788 2795 2810 N
+ JH AA UW s n/a 20 2788 2795 2810 N
+ JH AA V e n/a 20 2788 2799 2812 N
+ JH AA V s n/a 20 2788 2799 2812 N
+ JH AA W b n/a 20 2788 2799 2812 N
+ JH AA W e n/a 20 2788 2799 2812 N
+ JH AA W s n/a 20 2788 2799 2812 N
+ JH AA Y b n/a 20 2788 2800 2812 N
+ JH AA Y e n/a 20 2788 2800 2812 N
+ JH AA Y s n/a 20 2788 2800 2812 N
+ JH AA Z b n/a 20 2788 2800 2813 N
+ JH AA Z e n/a 20 2788 2800 2813 N
+ JH AA Z s n/a 20 2788 2800 2813 N
+ JH AA ZH e n/a 20 2788 2800 2811 N
+ JH AA ZH s n/a 20 2788 2800 2811 N
+ JH AE AA b n/a 20 2789 2795 2802 N
+ JH AE AA e n/a 20 2789 2795 2802 N
+ JH AE AA s n/a 20 2789 2795 2802 N
+ JH AE AE b n/a 20 2789 2798 2805 N
+ JH AE AE e n/a 20 2789 2798 2808 N
+ JH AE AE i n/a 20 2789 2798 2805 N
+ JH AE AE s n/a 20 2789 2798 2805 N
+ JH AE AH b n/a 20 2789 2798 2802 N
+ JH AE AH e n/a 20 2789 2798 2808 N
+ JH AE AH i n/a 20 2789 2798 2807 N
+ JH AE AH s n/a 20 2789 2798 2808 N
+ JH AE AO b n/a 20 2789 2795 2804 N
+ JH AE AO e n/a 20 2789 2795 2804 N
+ JH AE AO s n/a 20 2789 2795 2804 N
+ JH AE AW b n/a 20 2789 2798 2806 N
+ JH AE AW e n/a 20 2789 2798 2806 N
+ JH AE AW s n/a 20 2789 2798 2806 N
+ JH AE AY b n/a 20 2789 2795 2802 N
+ JH AE AY e n/a 20 2789 2795 2802 N
+ JH AE AY s n/a 20 2789 2795 2802 N
+ JH AE B e n/a 20 2789 2799 2812 N
+ JH AE B s n/a 20 2789 2799 2812 N
+ JH AE CH e n/a 20 2789 2800 2811 N
+ JH AE CH s n/a 20 2789 2800 2811 N
+ JH AE D e n/a 20 2789 2800 2813 N
+ JH AE D i n/a 20 2789 2800 2813 N
+ JH AE D s n/a 20 2789 2800 2813 N
+ JH AE DH e n/a 20 2789 2800 2813 N
+ JH AE DH s n/a 20 2789 2800 2813 N
+ JH AE EH b n/a 20 2789 2798 2805 N
+ JH AE EH e n/a 20 2789 2798 2808 N
+ JH AE EH i n/a 20 2789 2798 2805 N
+ JH AE EH s n/a 20 2789 2798 2805 N
+ JH AE ER b n/a 20 2789 2795 2810 N
+ JH AE ER e n/a 20 2789 2795 2810 N
+ JH AE ER i n/a 20 2789 2795 2810 N
+ JH AE ER s n/a 20 2789 2795 2810 N
+ JH AE EY b n/a 20 2789 2797 2805 N
+ JH AE EY e n/a 20 2789 2797 2809 N
+ JH AE EY i n/a 20 2789 2797 2805 N
+ JH AE EY s n/a 20 2789 2797 2805 N
+ JH AE F b n/a 20 2789 2799 2812 N
+ JH AE F e n/a 20 2789 2799 2812 N
+ JH AE F s n/a 20 2789 2799 2812 N
+ JH AE G e n/a 20 2789 2799 2812 N
+ JH AE G s n/a 20 2789 2799 2812 N
+ JH AE HH e n/a 20 2789 2799 2812 N
+ JH AE HH s n/a 20 2789 2799 2812 N
+ JH AE IH b n/a 20 2789 2798 2803 N
+ JH AE IH e n/a 20 2789 2798 2807 N
+ JH AE IH i n/a 20 2789 2798 2807 N
+ JH AE IH s n/a 20 2789 2798 2807 N
+ JH AE IY b n/a 20 2789 2797 2809 N
+ JH AE IY e n/a 20 2789 2797 2809 N
+ JH AE IY i n/a 20 2789 2797 2809 N
+ JH AE IY s n/a 20 2789 2797 2809 N
+ JH AE JH e n/a 20 2789 2800 2811 N
+ JH AE JH s n/a 20 2789 2800 2811 N
+ JH AE K b n/a 20 2789 2799 2812 N
+ JH AE K e n/a 20 2789 2799 2812 N
+ JH AE K i n/a 20 2789 2799 2812 N
+ JH AE K s n/a 20 2789 2799 2812 N
+ JH AE L e n/a 20 2789 2799 2812 N
+ JH AE L i n/a 20 2789 2799 2812 N
+ JH AE L s n/a 20 2789 2799 2812 N
+ JH AE M e n/a 20 2789 2799 2812 N
+ JH AE M s n/a 20 2789 2799 2812 N
+ JH AE N e n/a 20 2789 2800 2813 N
+ JH AE N i n/a 20 2789 2800 2813 N
+ JH AE N s n/a 20 2789 2800 2813 N
+ JH AE NG e n/a 20 2789 2799 2812 N
+ JH AE NG s n/a 20 2789 2799 2812 N
+ JH AE OW b n/a 20 2789 2795 2806 N
+ JH AE OW e n/a 20 2789 2795 2806 N
+ JH AE OW s n/a 20 2789 2795 2806 N
+ JH AE OY b n/a 20 2789 2795 2804 N
+ JH AE OY e n/a 20 2789 2795 2804 N
+ JH AE OY s n/a 20 2789 2795 2804 N
+ JH AE P b n/a 20 2789 2799 2812 N
+ JH AE P e n/a 20 2789 2799 2812 N
+ JH AE P s n/a 20 2789 2799 2812 N
+ JH AE R e n/a 20 2789 2799 2812 N
+ JH AE R i n/a 20 2789 2799 2812 N
+ JH AE R s n/a 20 2789 2799 2812 N
+ JH AE S b n/a 20 2789 2800 2813 N
+ JH AE S e n/a 20 2789 2800 2813 N
+ JH AE S s n/a 20 2789 2800 2813 N
+ JH AE SH e n/a 20 2789 2800 2811 N
+ JH AE SH s n/a 20 2789 2800 2811 N
+ JH AE SIL e n/a 20 2789 2801 2811 N
+ JH AE SIL s n/a 20 2789 2801 2811 N
+ JH AE T e n/a 20 2789 2800 2813 N
+ JH AE T s n/a 20 2789 2800 2813 N
+ JH AE TH e n/a 20 2789 2800 2813 N
+ JH AE TH s n/a 20 2789 2800 2813 N
+ JH AE UH b n/a 20 2789 2795 2810 N
+ JH AE UH e n/a 20 2789 2795 2810 N
+ JH AE UH s n/a 20 2789 2795 2810 N
+ JH AE UW b n/a 20 2789 2795 2810 N
+ JH AE UW e n/a 20 2789 2795 2810 N
+ JH AE UW i n/a 20 2789 2795 2810 N
+ JH AE UW s n/a 20 2789 2795 2810 N
+ JH AE V e n/a 20 2789 2799 2812 N
+ JH AE V s n/a 20 2789 2799 2812 N
+ JH AE W b n/a 20 2789 2799 2812 N
+ JH AE W e n/a 20 2789 2799 2812 N
+ JH AE W i n/a 20 2789 2799 2812 N
+ JH AE W s n/a 20 2789 2799 2812 N
+ JH AE Y b n/a 20 2789 2800 2812 N
+ JH AE Y e n/a 20 2789 2800 2812 N
+ JH AE Y s n/a 20 2789 2800 2812 N
+ JH AE Z b n/a 20 2789 2800 2813 N
+ JH AE Z e n/a 20 2789 2800 2813 N
+ JH AE Z s n/a 20 2789 2800 2813 N
+ JH AE ZH e n/a 20 2789 2800 2811 N
+ JH AE ZH s n/a 20 2789 2800 2811 N
+ JH AH AA b n/a 20 2786 2795 2802 N
+ JH AH AA e n/a 20 2785 2795 2802 N
+ JH AH AA i n/a 20 2785 2795 2802 N
+ JH AH AA s n/a 20 2785 2795 2802 N
+ JH AH AE b n/a 20 2786 2795 2805 N
+ JH AH AE e n/a 20 2786 2797 2808 N
+ JH AH AE i n/a 20 2786 2797 2805 N
+ JH AH AE s n/a 20 2786 2797 2805 N
+ JH AH AH b n/a 20 2786 2795 2802 N
+ JH AH AH e n/a 20 2785 2797 2808 N
+ JH AH AH i n/a 20 2785 2797 2808 N
+ JH AH AH s n/a 20 2785 2797 2808 N
+ JH AH AO b n/a 20 2786 2795 2804 N
+ JH AH AO e n/a 20 2785 2795 2804 N
+ JH AH AO i n/a 20 2785 2795 2804 N
+ JH AH AO s n/a 20 2785 2795 2804 N
+ JH AH AW b n/a 20 2786 2795 2806 N
+ JH AH AW e n/a 20 2785 2797 2806 N
+ JH AH AW s n/a 20 2785 2797 2806 N
+ JH AH AY b n/a 20 2786 2795 2802 N
+ JH AH AY e n/a 20 2786 2795 2802 N
+ JH AH AY i n/a 20 2786 2795 2802 N
+ JH AH AY s n/a 20 2786 2795 2802 N
+ JH AH B e n/a 20 2785 2799 2812 N
+ JH AH B s n/a 20 2785 2799 2812 N
+ JH AH CH e n/a 20 2785 2800 2811 N
+ JH AH CH s n/a 20 2785 2800 2811 N
+ JH AH D e n/a 20 2785 2800 2813 N
+ JH AH D i n/a 20 2785 2800 2813 N
+ JH AH D s n/a 20 2785 2800 2813 N
+ JH AH DH e n/a 20 2785 2800 2813 N
+ JH AH DH s n/a 20 2785 2800 2813 N
+ JH AH EH b n/a 20 2786 2795 2805 N
+ JH AH EH e n/a 20 2786 2797 2808 N
+ JH AH EH i n/a 20 2786 2797 2805 N
+ JH AH EH s n/a 20 2786 2797 2805 N
+ JH AH ER b n/a 20 2786 2795 2810 N
+ JH AH ER e n/a 20 2785 2795 2810 N
+ JH AH ER i n/a 20 2785 2795 2810 N
+ JH AH ER s n/a 20 2785 2795 2810 N
+ JH AH EY b n/a 20 2786 2798 2805 N
+ JH AH EY e n/a 20 2784 2798 2809 N
+ JH AH EY i n/a 20 2784 2798 2805 N
+ JH AH EY s n/a 20 2784 2798 2805 N
+ JH AH F b n/a 20 2786 2799 2812 N
+ JH AH F e n/a 20 2785 2799 2812 N
+ JH AH F s n/a 20 2785 2799 2812 N
+ JH AH G e n/a 20 2785 2799 2812 N
+ JH AH G s n/a 20 2785 2799 2812 N
+ JH AH HH e n/a 20 2785 2799 2812 N
+ JH AH HH s n/a 20 2785 2799 2812 N
+ JH AH IH b n/a 20 2786 2795 2803 N
+ JH AH IH e n/a 20 2785 2797 2807 N
+ JH AH IH i n/a 20 2785 2797 2807 N
+ JH AH IH s n/a 20 2785 2797 2807 N
+ JH AH IY b n/a 20 2786 2798 2809 N
+ JH AH IY e n/a 20 2784 2798 2809 N
+ JH AH IY i n/a 20 2784 2798 2809 N
+ JH AH IY s n/a 20 2784 2798 2809 N
+ JH AH JH e n/a 20 2785 2800 2811 N
+ JH AH JH s n/a 20 2785 2800 2811 N
+ JH AH K b n/a 20 2786 2799 2812 N
+ JH AH K e n/a 20 2785 2799 2812 N
+ JH AH K s n/a 20 2785 2799 2812 N
+ JH AH L e n/a 20 2785 2799 2812 N
+ JH AH L i n/a 20 2785 2799 2812 N
+ JH AH L s n/a 20 2785 2799 2812 N
+ JH AH M e n/a 20 2785 2799 2812 N
+ JH AH M i n/a 20 2785 2799 2812 N
+ JH AH M s n/a 20 2785 2799 2812 N
+ JH AH N e n/a 20 2785 2800 2813 N
+ JH AH N s n/a 20 2785 2800 2813 N
+ JH AH NG e n/a 20 2785 2799 2812 N
+ JH AH NG s n/a 20 2785 2799 2812 N
+ JH AH OW b n/a 20 2786 2795 2806 N
+ JH AH OW e n/a 20 2785 2795 2806 N
+ JH AH OW i n/a 20 2785 2795 2806 N
+ JH AH OW s n/a 20 2785 2795 2806 N
+ JH AH OY b n/a 20 2786 2795 2804 N
+ JH AH OY e n/a 20 2786 2795 2804 N
+ JH AH OY i n/a 20 2786 2795 2804 N
+ JH AH OY s n/a 20 2786 2795 2804 N
+ JH AH P b n/a 20 2786 2799 2812 N
+ JH AH P e n/a 20 2785 2799 2812 N
+ JH AH P i n/a 20 2785 2799 2812 N
+ JH AH P s n/a 20 2785 2799 2812 N
+ JH AH R e n/a 20 2785 2799 2812 N
+ JH AH R i n/a 20 2785 2799 2812 N
+ JH AH R s n/a 20 2785 2799 2812 N
+ JH AH S b n/a 20 2786 2800 2813 N
+ JH AH S e n/a 20 2785 2800 2813 N
+ JH AH S i n/a 20 2785 2800 2813 N
+ JH AH S s n/a 20 2785 2800 2813 N
+ JH AH SH e n/a 20 2785 2800 2811 N
+ JH AH SH i n/a 20 2785 2800 2811 N
+ JH AH SH s n/a 20 2785 2800 2811 N
+ JH AH SIL e n/a 20 2786 2801 2811 N
+ JH AH SIL s n/a 20 2786 2801 2811 N
+ JH AH T e n/a 20 2785 2800 2813 N
+ JH AH T i n/a 20 2785 2800 2813 N
+ JH AH T s n/a 20 2785 2800 2813 N
+ JH AH TH e n/a 20 2785 2800 2813 N
+ JH AH TH s n/a 20 2785 2800 2813 N
+ JH AH UH b n/a 20 2786 2795 2810 N
+ JH AH UH e n/a 20 2785 2795 2810 N
+ JH AH UH i n/a 20 2785 2795 2810 N
+ JH AH UH s n/a 20 2785 2795 2810 N
+ JH AH UW b n/a 20 2786 2795 2810 N
+ JH AH UW e n/a 20 2785 2795 2810 N
+ JH AH UW i n/a 20 2785 2795 2810 N
+ JH AH UW s n/a 20 2785 2795 2810 N
+ JH AH V e n/a 20 2785 2799 2812 N
+ JH AH V i n/a 20 2785 2799 2812 N
+ JH AH V s n/a 20 2785 2799 2812 N
+ JH AH W b n/a 20 2786 2799 2812 N
+ JH AH W e n/a 20 2785 2799 2812 N
+ JH AH W i n/a 20 2785 2799 2812 N
+ JH AH W s n/a 20 2785 2799 2812 N
+ JH AH Y b n/a 20 2786 2800 2812 N
+ JH AH Y e n/a 20 2786 2800 2812 N
+ JH AH Y s n/a 20 2786 2800 2812 N
+ JH AH Z b n/a 20 2786 2800 2813 N
+ JH AH Z e n/a 20 2785 2800 2813 N
+ JH AH Z i n/a 20 2785 2800 2813 N
+ JH AH Z s n/a 20 2785 2800 2813 N
+ JH AH ZH e n/a 20 2785 2800 2811 N
+ JH AH ZH s n/a 20 2785 2800 2811 N
+ JH AO AA b n/a 20 2788 2795 2802 N
+ JH AO AA e n/a 20 2788 2795 2802 N
+ JH AO AA s n/a 20 2788 2795 2802 N
+ JH AO AE b n/a 20 2788 2798 2805 N
+ JH AO AE e n/a 20 2788 2798 2808 N
+ JH AO AE s n/a 20 2788 2798 2805 N
+ JH AO AH b n/a 20 2788 2798 2802 N
+ JH AO AH e n/a 20 2788 2798 2808 N
+ JH AO AH i n/a 20 2788 2798 2807 N
+ JH AO AH s n/a 20 2788 2798 2808 N
+ JH AO AO b n/a 20 2788 2795 2804 N
+ JH AO AO e n/a 20 2788 2795 2804 N
+ JH AO AO s n/a 20 2788 2795 2804 N
+ JH AO AW b n/a 20 2788 2798 2806 N
+ JH AO AW e n/a 20 2788 2798 2806 N
+ JH AO AW s n/a 20 2788 2798 2806 N
+ JH AO AY b n/a 20 2788 2795 2802 N
+ JH AO AY e n/a 20 2788 2795 2802 N
+ JH AO AY s n/a 20 2788 2795 2802 N
+ JH AO B e n/a 20 2788 2799 2812 N
+ JH AO B s n/a 20 2788 2799 2812 N
+ JH AO CH e n/a 20 2788 2800 2811 N
+ JH AO CH s n/a 20 2788 2800 2811 N
+ JH AO D e n/a 20 2788 2800 2813 N
+ JH AO D s n/a 20 2788 2800 2813 N
+ JH AO DH e n/a 20 2788 2800 2813 N
+ JH AO DH s n/a 20 2788 2800 2813 N
+ JH AO EH b n/a 20 2788 2798 2805 N
+ JH AO EH e n/a 20 2788 2798 2808 N
+ JH AO EH i n/a 20 2788 2798 2805 N
+ JH AO EH s n/a 20 2788 2798 2805 N
+ JH AO ER b n/a 20 2788 2795 2810 N
+ JH AO ER e n/a 20 2788 2795 2810 N
+ JH AO ER i n/a 20 2788 2795 2810 N
+ JH AO ER s n/a 20 2788 2795 2810 N
+ JH AO EY b n/a 20 2788 2797 2805 N
+ JH AO EY e n/a 20 2788 2797 2809 N
+ JH AO EY s n/a 20 2788 2797 2805 N
+ JH AO F b n/a 20 2788 2799 2812 N
+ JH AO F e n/a 20 2788 2799 2812 N
+ JH AO F s n/a 20 2788 2799 2812 N
+ JH AO G e n/a 20 2788 2799 2812 N
+ JH AO G s n/a 20 2788 2799 2812 N
+ JH AO HH e n/a 20 2788 2799 2812 N
+ JH AO HH s n/a 20 2788 2799 2812 N
+ JH AO IH b n/a 20 2788 2798 2803 N
+ JH AO IH e n/a 20 2788 2798 2807 N
+ JH AO IH i n/a 20 2788 2798 2807 N
+ JH AO IH s n/a 20 2788 2798 2807 N
+ JH AO IY b n/a 20 2788 2797 2809 N
+ JH AO IY e n/a 20 2788 2797 2809 N
+ JH AO IY i n/a 20 2788 2797 2809 N
+ JH AO IY s n/a 20 2788 2797 2809 N
+ JH AO JH e n/a 20 2788 2800 2811 N
+ JH AO JH s n/a 20 2788 2800 2811 N
+ JH AO K b n/a 20 2788 2799 2812 N
+ JH AO K e n/a 20 2788 2799 2812 N
+ JH AO K s n/a 20 2788 2799 2812 N
+ JH AO L e n/a 20 2788 2799 2812 N
+ JH AO L s n/a 20 2788 2799 2812 N
+ JH AO M e n/a 20 2788 2799 2812 N
+ JH AO M s n/a 20 2788 2799 2812 N
+ JH AO N e n/a 20 2788 2800 2813 N
+ JH AO N s n/a 20 2788 2800 2813 N
+ JH AO NG e n/a 20 2788 2799 2812 N
+ JH AO NG s n/a 20 2788 2799 2812 N
+ JH AO OW b n/a 20 2788 2795 2806 N
+ JH AO OW e n/a 20 2788 2795 2806 N
+ JH AO OW s n/a 20 2788 2795 2806 N
+ JH AO OY b n/a 20 2788 2795 2804 N
+ JH AO OY e n/a 20 2788 2795 2804 N
+ JH AO OY s n/a 20 2788 2795 2804 N
+ JH AO P b n/a 20 2788 2799 2812 N
+ JH AO P e n/a 20 2788 2799 2812 N
+ JH AO P s n/a 20 2788 2799 2812 N
+ JH AO R e n/a 20 2788 2799 2812 N
+ JH AO R s n/a 20 2788 2799 2812 N
+ JH AO S b n/a 20 2788 2800 2813 N
+ JH AO S e n/a 20 2788 2800 2813 N
+ JH AO S s n/a 20 2788 2800 2813 N
+ JH AO SH e n/a 20 2788 2800 2811 N
+ JH AO SH s n/a 20 2788 2800 2811 N
+ JH AO SIL e n/a 20 2788 2801 2811 N
+ JH AO SIL s n/a 20 2788 2801 2811 N
+ JH AO T e n/a 20 2788 2800 2813 N
+ JH AO T s n/a 20 2788 2800 2813 N
+ JH AO TH e n/a 20 2788 2800 2813 N
+ JH AO TH s n/a 20 2788 2800 2813 N
+ JH AO UH b n/a 20 2788 2795 2810 N
+ JH AO UH e n/a 20 2788 2795 2810 N
+ JH AO UH s n/a 20 2788 2795 2810 N
+ JH AO UW b n/a 20 2788 2795 2810 N
+ JH AO UW e n/a 20 2788 2795 2810 N
+ JH AO UW i n/a 20 2788 2795 2810 N
+ JH AO UW s n/a 20 2788 2795 2810 N
+ JH AO V e n/a 20 2788 2799 2812 N
+ JH AO V s n/a 20 2788 2799 2812 N
+ JH AO W b n/a 20 2788 2799 2812 N
+ JH AO W e n/a 20 2788 2799 2812 N
+ JH AO W s n/a 20 2788 2799 2812 N
+ JH AO Y b n/a 20 2788 2800 2812 N
+ JH AO Y e n/a 20 2788 2800 2812 N
+ JH AO Y i n/a 20 2788 2800 2812 N
+ JH AO Y s n/a 20 2788 2800 2812 N
+ JH AO Z b n/a 20 2788 2800 2813 N
+ JH AO Z e n/a 20 2788 2800 2813 N
+ JH AO Z s n/a 20 2788 2800 2813 N
+ JH AO ZH e n/a 20 2788 2800 2811 N
+ JH AO ZH s n/a 20 2788 2800 2811 N
+ JH AW AA b n/a 20 2788 2795 2802 N
+ JH AW AA e n/a 20 2788 2795 2802 N
+ JH AW AA s n/a 20 2788 2795 2802 N
+ JH AW AE b n/a 20 2788 2798 2805 N
+ JH AW AE e n/a 20 2788 2798 2808 N
+ JH AW AE s n/a 20 2788 2798 2805 N
+ JH AW AH b n/a 20 2788 2798 2802 N
+ JH AW AH e n/a 20 2788 2798 2808 N
+ JH AW AH s n/a 20 2788 2798 2808 N
+ JH AW AO b n/a 20 2788 2795 2804 N
+ JH AW AO e n/a 20 2788 2795 2804 N
+ JH AW AO s n/a 20 2788 2795 2804 N
+ JH AW AW b n/a 20 2788 2798 2806 N
+ JH AW AW e n/a 20 2788 2798 2806 N
+ JH AW AW s n/a 20 2788 2798 2806 N
+ JH AW AY b n/a 20 2788 2795 2802 N
+ JH AW AY e n/a 20 2788 2795 2802 N
+ JH AW AY s n/a 20 2788 2795 2802 N
+ JH AW B e n/a 20 2788 2799 2812 N
+ JH AW B s n/a 20 2788 2799 2812 N
+ JH AW CH e n/a 20 2788 2800 2811 N
+ JH AW CH s n/a 20 2788 2800 2811 N
+ JH AW D e n/a 20 2788 2800 2813 N
+ JH AW D i n/a 20 2788 2800 2813 N
+ JH AW D s n/a 20 2788 2800 2813 N
+ JH AW DH e n/a 20 2788 2800 2813 N
+ JH AW DH s n/a 20 2788 2800 2813 N
+ JH AW EH b n/a 20 2788 2798 2805 N
+ JH AW EH e n/a 20 2788 2798 2808 N
+ JH AW EH s n/a 20 2788 2798 2805 N
+ JH AW ER b n/a 20 2788 2795 2810 N
+ JH AW ER e n/a 20 2788 2795 2810 N
+ JH AW ER i n/a 20 2788 2795 2810 N
+ JH AW ER s n/a 20 2788 2795 2810 N
+ JH AW EY b n/a 20 2788 2797 2805 N
+ JH AW EY e n/a 20 2788 2797 2809 N
+ JH AW EY s n/a 20 2788 2797 2805 N
+ JH AW F b n/a 20 2788 2799 2812 N
+ JH AW F e n/a 20 2788 2799 2812 N
+ JH AW F s n/a 20 2788 2799 2812 N
+ JH AW G e n/a 20 2788 2799 2812 N
+ JH AW G s n/a 20 2788 2799 2812 N
+ JH AW HH e n/a 20 2788 2799 2812 N
+ JH AW HH s n/a 20 2788 2799 2812 N
+ JH AW IH b n/a 20 2788 2798 2803 N
+ JH AW IH e n/a 20 2788 2798 2807 N
+ JH AW IH i n/a 20 2788 2798 2807 N
+ JH AW IH s n/a 20 2788 2798 2807 N
+ JH AW IY b n/a 20 2788 2797 2809 N
+ JH AW IY e n/a 20 2788 2797 2809 N
+ JH AW IY i n/a 20 2788 2797 2809 N
+ JH AW IY s n/a 20 2788 2797 2809 N
+ JH AW JH e n/a 20 2788 2800 2811 N
+ JH AW JH i n/a 20 2788 2800 2811 N
+ JH AW JH s n/a 20 2788 2800 2811 N
+ JH AW K b n/a 20 2788 2799 2812 N
+ JH AW K e n/a 20 2788 2799 2812 N
+ JH AW K s n/a 20 2788 2799 2812 N
+ JH AW L e n/a 20 2788 2799 2812 N
+ JH AW L s n/a 20 2788 2799 2812 N
+ JH AW M e n/a 20 2788 2799 2812 N
+ JH AW M s n/a 20 2788 2799 2812 N
+ JH AW N e n/a 20 2788 2800 2813 N
+ JH AW N s n/a 20 2788 2800 2813 N
+ JH AW NG e n/a 20 2788 2799 2812 N
+ JH AW NG s n/a 20 2788 2799 2812 N
+ JH AW OW b n/a 20 2788 2795 2806 N
+ JH AW OW e n/a 20 2788 2795 2806 N
+ JH AW OW s n/a 20 2788 2795 2806 N
+ JH AW OY b n/a 20 2788 2795 2804 N
+ JH AW OY e n/a 20 2788 2795 2804 N
+ JH AW OY s n/a 20 2788 2795 2804 N
+ JH AW P b n/a 20 2788 2799 2812 N
+ JH AW P e n/a 20 2788 2799 2812 N
+ JH AW P s n/a 20 2788 2799 2812 N
+ JH AW R e n/a 20 2788 2799 2812 N
+ JH AW R s n/a 20 2788 2799 2812 N
+ JH AW S b n/a 20 2788 2800 2813 N
+ JH AW S e n/a 20 2788 2800 2813 N
+ JH AW S s n/a 20 2788 2800 2813 N
+ JH AW SH e n/a 20 2788 2800 2811 N
+ JH AW SH s n/a 20 2788 2800 2811 N
+ JH AW SIL e n/a 20 2788 2801 2811 N
+ JH AW SIL s n/a 20 2788 2801 2811 N
+ JH AW T e n/a 20 2788 2800 2813 N
+ JH AW T s n/a 20 2788 2800 2813 N
+ JH AW TH e n/a 20 2788 2800 2813 N
+ JH AW TH s n/a 20 2788 2800 2813 N
+ JH AW UH b n/a 20 2788 2795 2810 N
+ JH AW UH e n/a 20 2788 2795 2810 N
+ JH AW UH s n/a 20 2788 2795 2810 N
+ JH AW UW b n/a 20 2788 2795 2810 N
+ JH AW UW e n/a 20 2788 2795 2810 N
+ JH AW UW s n/a 20 2788 2795 2810 N
+ JH AW V e n/a 20 2788 2799 2812 N
+ JH AW V s n/a 20 2788 2799 2812 N
+ JH AW W b n/a 20 2788 2799 2812 N
+ JH AW W e n/a 20 2788 2799 2812 N
+ JH AW W s n/a 20 2788 2799 2812 N
+ JH AW Y b n/a 20 2788 2800 2812 N
+ JH AW Y e n/a 20 2788 2800 2812 N
+ JH AW Y s n/a 20 2788 2800 2812 N
+ JH AW Z b n/a 20 2788 2800 2813 N
+ JH AW Z e n/a 20 2788 2800 2813 N
+ JH AW Z s n/a 20 2788 2800 2813 N
+ JH AW ZH e n/a 20 2788 2800 2811 N
+ JH AW ZH s n/a 20 2788 2800 2811 N
+ JH AY AA b n/a 20 2786 2795 2802 N
+ JH AY AA e n/a 20 2785 2795 2802 N
+ JH AY AA i n/a 20 2785 2795 2802 N
+ JH AY AA s n/a 20 2785 2795 2802 N
+ JH AY AE b n/a 20 2786 2798 2805 N
+ JH AY AE e n/a 20 2786 2798 2808 N
+ JH AY AE i n/a 20 2786 2798 2805 N
+ JH AY AE s n/a 20 2786 2798 2805 N
+ JH AY AH b n/a 20 2786 2798 2802 N
+ JH AY AH e n/a 20 2785 2798 2808 N
+ JH AY AH i n/a 20 2785 2798 2807 N
+ JH AY AH s n/a 20 2785 2798 2808 N
+ JH AY AO b n/a 20 2786 2795 2804 N
+ JH AY AO e n/a 20 2785 2795 2804 N
+ JH AY AO s n/a 20 2785 2795 2804 N
+ JH AY AW b n/a 20 2786 2798 2806 N
+ JH AY AW e n/a 20 2785 2798 2806 N
+ JH AY AW s n/a 20 2785 2798 2806 N
+ JH AY AY b n/a 20 2786 2795 2802 N
+ JH AY AY e n/a 20 2786 2795 2802 N
+ JH AY AY s n/a 20 2786 2795 2802 N
+ JH AY B e n/a 20 2785 2799 2812 N
+ JH AY B s n/a 20 2785 2799 2812 N
+ JH AY CH e n/a 20 2785 2800 2811 N
+ JH AY CH s n/a 20 2785 2800 2811 N
+ JH AY D e n/a 20 2785 2800 2813 N
+ JH AY D i n/a 20 2785 2800 2813 N
+ JH AY D s n/a 20 2785 2800 2813 N
+ JH AY DH e n/a 20 2785 2800 2813 N
+ JH AY DH s n/a 20 2785 2800 2813 N
+ JH AY EH b n/a 20 2786 2798 2805 N
+ JH AY EH e n/a 20 2786 2798 2808 N
+ JH AY EH i n/a 20 2786 2798 2805 N
+ JH AY EH s n/a 20 2786 2798 2805 N
+ JH AY ER b n/a 20 2786 2795 2810 N
+ JH AY ER e n/a 20 2785 2795 2810 N
+ JH AY ER i n/a 20 2785 2795 2810 N
+ JH AY ER s n/a 20 2785 2795 2810 N
+ JH AY EY b n/a 20 2786 2797 2805 N
+ JH AY EY e n/a 20 2784 2797 2809 N
+ JH AY EY i n/a 20 2784 2797 2805 N
+ JH AY EY s n/a 20 2784 2797 2805 N
+ JH AY F b n/a 20 2786 2799 2812 N
+ JH AY F e n/a 20 2785 2799 2812 N
+ JH AY F s n/a 20 2785 2799 2812 N
+ JH AY G e n/a 20 2785 2799 2812 N
+ JH AY G s n/a 20 2785 2799 2812 N
+ JH AY HH e n/a 20 2785 2799 2812 N
+ JH AY HH s n/a 20 2785 2799 2812 N
+ JH AY IH b n/a 20 2786 2798 2803 N
+ JH AY IH e n/a 20 2785 2798 2807 N
+ JH AY IH i n/a 20 2785 2798 2807 N
+ JH AY IH s n/a 20 2785 2798 2807 N
+ JH AY IY b n/a 20 2786 2797 2809 N
+ JH AY IY e n/a 20 2784 2797 2809 N
+ JH AY IY i n/a 20 2784 2797 2809 N
+ JH AY IY s n/a 20 2784 2797 2809 N
+ JH AY JH e n/a 20 2785 2800 2811 N
+ JH AY JH s n/a 20 2785 2800 2811 N
+ JH AY K b n/a 20 2786 2799 2812 N
+ JH AY K e n/a 20 2785 2799 2812 N
+ JH AY K s n/a 20 2785 2799 2812 N
+ JH AY L e n/a 20 2785 2799 2812 N
+ JH AY L i n/a 20 2785 2799 2812 N
+ JH AY L s n/a 20 2785 2799 2812 N
+ JH AY M e n/a 20 2785 2799 2812 N
+ JH AY M s n/a 20 2785 2799 2812 N
+ JH AY N e n/a 20 2785 2800 2813 N
+ JH AY N s n/a 20 2785 2800 2813 N
+ JH AY NG e n/a 20 2785 2799 2812 N
+ JH AY NG s n/a 20 2785 2799 2812 N
+ JH AY OW b n/a 20 2786 2795 2806 N
+ JH AY OW e n/a 20 2785 2795 2806 N
+ JH AY OW s n/a 20 2785 2795 2806 N
+ JH AY OY b n/a 20 2786 2795 2804 N
+ JH AY OY e n/a 20 2786 2795 2804 N
+ JH AY OY s n/a 20 2786 2795 2804 N
+ JH AY P b n/a 20 2786 2799 2812 N
+ JH AY P e n/a 20 2785 2799 2812 N
+ JH AY P s n/a 20 2785 2799 2812 N
+ JH AY R e n/a 20 2785 2799 2812 N
+ JH AY R s n/a 20 2785 2799 2812 N
+ JH AY S b n/a 20 2786 2800 2813 N
+ JH AY S e n/a 20 2785 2800 2813 N
+ JH AY S s n/a 20 2785 2800 2813 N
+ JH AY SH e n/a 20 2785 2800 2811 N
+ JH AY SH s n/a 20 2785 2800 2811 N
+ JH AY SIL e n/a 20 2786 2801 2811 N
+ JH AY SIL s n/a 20 2786 2801 2811 N
+ JH AY T e n/a 20 2785 2800 2813 N
+ JH AY T s n/a 20 2785 2800 2813 N
+ JH AY TH e n/a 20 2785 2800 2813 N
+ JH AY TH s n/a 20 2785 2800 2813 N
+ JH AY UH b n/a 20 2786 2795 2810 N
+ JH AY UH e n/a 20 2785 2795 2810 N
+ JH AY UH s n/a 20 2785 2795 2810 N
+ JH AY UW b n/a 20 2786 2795 2810 N
+ JH AY UW e n/a 20 2785 2795 2810 N
+ JH AY UW i n/a 20 2785 2795 2810 N
+ JH AY UW s n/a 20 2785 2795 2810 N
+ JH AY V e n/a 20 2785 2799 2812 N
+ JH AY V s n/a 20 2785 2799 2812 N
+ JH AY W b n/a 20 2786 2799 2812 N
+ JH AY W e n/a 20 2785 2799 2812 N
+ JH AY W s n/a 20 2785 2799 2812 N
+ JH AY Y b n/a 20 2786 2800 2812 N
+ JH AY Y e n/a 20 2786 2800 2812 N
+ JH AY Y s n/a 20 2786 2800 2812 N
+ JH AY Z b n/a 20 2786 2800 2813 N
+ JH AY Z e n/a 20 2785 2800 2813 N
+ JH AY Z s n/a 20 2785 2800 2813 N
+ JH AY ZH e n/a 20 2785 2800 2811 N
+ JH AY ZH s n/a 20 2785 2800 2811 N
+ JH B AA b n/a 20 2792 2794 2802 N
+ JH B AA s n/a 20 2792 2794 2802 N
+ JH B AE b n/a 20 2792 2794 2805 N
+ JH B AE s n/a 20 2792 2794 2805 N
+ JH B AH b n/a 20 2792 2794 2802 N
+ JH B AH i n/a 20 2792 2794 2807 N
+ JH B AH s n/a 20 2792 2794 2808 N
+ JH B AO b n/a 20 2792 2794 2804 N
+ JH B AO s n/a 20 2792 2794 2804 N
+ JH B AW b n/a 20 2792 2794 2806 N
+ JH B AW s n/a 20 2792 2794 2806 N
+ JH B AY b n/a 20 2792 2794 2802 N
+ JH B AY s n/a 20 2792 2794 2802 N
+ JH B B s n/a 20 2792 2799 2812 N
+ JH B CH s n/a 20 2792 2800 2811 N
+ JH B D s n/a 20 2792 2800 2813 N
+ JH B DH s n/a 20 2792 2800 2813 N
+ JH B EH b n/a 20 2792 2794 2805 N
+ JH B EH i n/a 20 2792 2794 2805 N
+ JH B EH s n/a 20 2792 2794 2805 N
+ JH B ER b n/a 20 2792 2794 2810 N
+ JH B ER i n/a 20 2792 2794 2810 N
+ JH B ER s n/a 20 2792 2794 2810 N
+ JH B EY b n/a 20 2792 2794 2805 N
+ JH B EY s n/a 20 2792 2794 2805 N
+ JH B F b n/a 20 2792 2799 2812 N
+ JH B F s n/a 20 2792 2799 2812 N
+ JH B G s n/a 20 2792 2799 2812 N
+ JH B HH s n/a 20 2792 2799 2812 N
+ JH B IH b n/a 20 2792 2794 2803 N
+ JH B IH i n/a 20 2792 2794 2807 N
+ JH B IH s n/a 20 2792 2794 2807 N
+ JH B IY b n/a 20 2792 2794 2809 N
+ JH B IY s n/a 20 2792 2794 2809 N
+ JH B JH s n/a 20 2792 2800 2811 N
+ JH B K b n/a 20 2792 2799 2812 N
+ JH B K s n/a 20 2792 2799 2812 N
+ JH B L s n/a 20 2792 2799 2812 N
+ JH B M s n/a 20 2792 2799 2812 N
+ JH B N s n/a 20 2792 2800 2813 N
+ JH B NG s n/a 20 2792 2799 2812 N
+ JH B OW b n/a 20 2792 2794 2806 N
+ JH B OW s n/a 20 2792 2794 2806 N
+ JH B OY b n/a 20 2792 2794 2804 N
+ JH B OY i n/a 20 2792 2794 2804 N
+ JH B OY s n/a 20 2792 2794 2804 N
+ JH B P b n/a 20 2792 2799 2812 N
+ JH B P s n/a 20 2792 2799 2812 N
+ JH B R s n/a 20 2792 2799 2812 N
+ JH B S b n/a 20 2792 2800 2813 N
+ JH B S s n/a 20 2792 2800 2813 N
+ JH B SH s n/a 20 2792 2800 2811 N
+ JH B SIL s n/a 20 2792 2801 2811 N
+ JH B T s n/a 20 2792 2800 2813 N
+ JH B TH s n/a 20 2792 2800 2813 N
+ JH B UH b n/a 20 2792 2794 2810 N
+ JH B UH s n/a 20 2792 2794 2810 N
+ JH B UW b n/a 20 2792 2794 2810 N
+ JH B UW s n/a 20 2792 2794 2810 N
+ JH B V s n/a 20 2792 2799 2812 N
+ JH B W b n/a 20 2792 2799 2812 N
+ JH B W s n/a 20 2792 2799 2812 N
+ JH B Y b n/a 20 2792 2800 2812 N
+ JH B Y i n/a 20 2792 2800 2812 N
+ JH B Y s n/a 20 2792 2800 2812 N
+ JH B Z b n/a 20 2792 2800 2813 N
+ JH B Z s n/a 20 2792 2800 2813 N
+ JH B ZH s n/a 20 2792 2800 2811 N
+ JH CH AA b n/a 20 2791 2794 2802 N
+ JH CH AA s n/a 20 2791 2794 2802 N
+ JH CH AE b n/a 20 2791 2794 2805 N
+ JH CH AE s n/a 20 2791 2794 2805 N
+ JH CH AH b n/a 20 2791 2794 2802 N
+ JH CH AH s n/a 20 2791 2794 2808 N
+ JH CH AO b n/a 20 2791 2794 2804 N
+ JH CH AO s n/a 20 2791 2794 2804 N
+ JH CH AW b n/a 20 2791 2794 2806 N
+ JH CH AW s n/a 20 2791 2794 2806 N
+ JH CH AY b n/a 20 2791 2794 2802 N
+ JH CH AY s n/a 20 2791 2794 2802 N
+ JH CH B s n/a 20 2791 2799 2812 N
+ JH CH CH s n/a 20 2791 2800 2811 N
+ JH CH D s n/a 20 2791 2800 2813 N
+ JH CH DH s n/a 20 2791 2800 2813 N
+ JH CH EH b n/a 20 2791 2794 2805 N
+ JH CH EH s n/a 20 2791 2794 2805 N
+ JH CH ER b n/a 20 2791 2794 2810 N
+ JH CH ER s n/a 20 2791 2794 2810 N
+ JH CH EY b n/a 20 2791 2794 2805 N
+ JH CH EY s n/a 20 2791 2794 2805 N
+ JH CH F b n/a 20 2791 2799 2812 N
+ JH CH F s n/a 20 2791 2799 2812 N
+ JH CH G s n/a 20 2791 2799 2812 N
+ JH CH HH s n/a 20 2791 2799 2812 N
+ JH CH IH b n/a 20 2791 2794 2803 N
+ JH CH IH s n/a 20 2791 2794 2807 N
+ JH CH IY b n/a 20 2791 2794 2809 N
+ JH CH IY i n/a 20 2791 2794 2809 N
+ JH CH IY s n/a 20 2791 2794 2809 N
+ JH CH JH s n/a 20 2791 2800 2811 N
+ JH CH K b n/a 20 2791 2799 2812 N
+ JH CH K s n/a 20 2791 2799 2812 N
+ JH CH L s n/a 20 2791 2799 2812 N
+ JH CH M s n/a 20 2791 2799 2812 N
+ JH CH N s n/a 20 2791 2800 2813 N
+ JH CH NG s n/a 20 2791 2799 2812 N
+ JH CH OW b n/a 20 2791 2794 2806 N
+ JH CH OW s n/a 20 2791 2794 2806 N
+ JH CH OY b n/a 20 2791 2794 2804 N
+ JH CH OY s n/a 20 2791 2794 2804 N
+ JH CH P b n/a 20 2791 2799 2812 N
+ JH CH P s n/a 20 2791 2799 2812 N
+ JH CH R s n/a 20 2791 2799 2812 N
+ JH CH S b n/a 20 2791 2800 2813 N
+ JH CH S s n/a 20 2791 2800 2813 N
+ JH CH SH s n/a 20 2791 2800 2811 N
+ JH CH SIL s n/a 20 2791 2801 2811 N
+ JH CH T s n/a 20 2791 2800 2813 N
+ JH CH TH s n/a 20 2791 2800 2813 N
+ JH CH UH b n/a 20 2791 2794 2810 N
+ JH CH UH s n/a 20 2791 2794 2810 N
+ JH CH UW b n/a 20 2791 2794 2810 N
+ JH CH UW s n/a 20 2791 2794 2810 N
+ JH CH V s n/a 20 2791 2799 2812 N
+ JH CH W b n/a 20 2791 2799 2812 N
+ JH CH W s n/a 20 2791 2799 2812 N
+ JH CH Y b n/a 20 2791 2800 2812 N
+ JH CH Y s n/a 20 2791 2800 2812 N
+ JH CH Z b n/a 20 2791 2800 2813 N
+ JH CH Z s n/a 20 2791 2800 2813 N
+ JH CH ZH s n/a 20 2791 2800 2811 N
+ JH D AA b n/a 20 2792 2794 2802 N
+ JH D AA i n/a 20 2792 2794 2802 N
+ JH D AA s n/a 20 2792 2794 2802 N
+ JH D AE b n/a 20 2792 2794 2805 N
+ JH D AE s n/a 20 2792 2794 2805 N
+ JH D AH b n/a 20 2792 2794 2802 N
+ JH D AH s n/a 20 2792 2794 2808 N
+ JH D AO b n/a 20 2792 2794 2804 N
+ JH D AO s n/a 20 2792 2794 2804 N
+ JH D AW b n/a 20 2792 2794 2806 N
+ JH D AW s n/a 20 2792 2794 2806 N
+ JH D AY b n/a 20 2792 2794 2802 N
+ JH D AY s n/a 20 2792 2794 2802 N
+ JH D B s n/a 20 2792 2799 2812 N
+ JH D CH s n/a 20 2792 2800 2811 N
+ JH D D s n/a 20 2792 2800 2813 N
+ JH D DH s n/a 20 2792 2800 2813 N
+ JH D EH b n/a 20 2792 2794 2805 N
+ JH D EH s n/a 20 2792 2794 2805 N
+ JH D ER b n/a 20 2792 2794 2810 N
+ JH D ER s n/a 20 2792 2794 2810 N
+ JH D EY b n/a 20 2792 2794 2805 N
+ JH D EY s n/a 20 2792 2794 2805 N
+ JH D F b n/a 20 2792 2799 2812 N
+ JH D F s n/a 20 2792 2799 2812 N
+ JH D G s n/a 20 2792 2799 2812 N
+ JH D HH s n/a 20 2792 2799 2812 N
+ JH D IH b n/a 20 2792 2794 2803 N
+ JH D IH i n/a 20 2792 2794 2807 N
+ JH D IH s n/a 20 2792 2794 2807 N
+ JH D IY b n/a 20 2792 2794 2809 N
+ JH D IY i n/a 20 2792 2794 2809 N
+ JH D IY s n/a 20 2792 2794 2809 N
+ JH D JH s n/a 20 2792 2800 2811 N
+ JH D K b n/a 20 2792 2799 2812 N
+ JH D K s n/a 20 2792 2799 2812 N
+ JH D L s n/a 20 2792 2799 2812 N
+ JH D M s n/a 20 2792 2799 2812 N
+ JH D N s n/a 20 2792 2800 2813 N
+ JH D NG s n/a 20 2792 2799 2812 N
+ JH D OW b n/a 20 2792 2794 2806 N
+ JH D OW s n/a 20 2792 2794 2806 N
+ JH D OY b n/a 20 2792 2794 2804 N
+ JH D OY s n/a 20 2792 2794 2804 N
+ JH D P b n/a 20 2792 2799 2812 N
+ JH D P s n/a 20 2792 2799 2812 N
+ JH D R s n/a 20 2792 2799 2812 N
+ JH D S b n/a 20 2792 2800 2813 N
+ JH D S s n/a 20 2792 2800 2813 N
+ JH D SH s n/a 20 2792 2800 2811 N
+ JH D SIL s n/a 20 2792 2801 2811 N
+ JH D T s n/a 20 2792 2800 2813 N
+ JH D TH s n/a 20 2792 2800 2813 N
+ JH D UH b n/a 20 2792 2794 2810 N
+ JH D UH s n/a 20 2792 2794 2810 N
+ JH D UW b n/a 20 2792 2794 2810 N
+ JH D UW s n/a 20 2792 2794 2810 N
+ JH D V s n/a 20 2792 2799 2812 N
+ JH D W b n/a 20 2792 2799 2812 N
+ JH D W s n/a 20 2792 2799 2812 N
+ JH D Y b n/a 20 2792 2800 2812 N
+ JH D Y s n/a 20 2792 2800 2812 N
+ JH D Z b n/a 20 2792 2800 2813 N
+ JH D Z s n/a 20 2792 2800 2813 N
+ JH D ZH s n/a 20 2792 2800 2811 N
+ JH DH AA b n/a 20 2792 2794 2802 N
+ JH DH AA s n/a 20 2792 2794 2802 N
+ JH DH AE b n/a 20 2792 2794 2805 N
+ JH DH AE s n/a 20 2792 2794 2805 N
+ JH DH AH b n/a 20 2792 2794 2802 N
+ JH DH AH s n/a 20 2792 2794 2808 N
+ JH DH AO b n/a 20 2792 2794 2804 N
+ JH DH AO s n/a 20 2792 2794 2804 N
+ JH DH AW b n/a 20 2792 2794 2806 N
+ JH DH AW s n/a 20 2792 2794 2806 N
+ JH DH AY b n/a 20 2792 2794 2802 N
+ JH DH AY s n/a 20 2792 2794 2802 N
+ JH DH B s n/a 20 2792 2799 2812 N
+ JH DH CH s n/a 20 2792 2800 2811 N
+ JH DH D s n/a 20 2792 2800 2813 N
+ JH DH DH s n/a 20 2792 2800 2813 N
+ JH DH EH b n/a 20 2792 2794 2805 N
+ JH DH EH s n/a 20 2792 2794 2805 N
+ JH DH ER b n/a 20 2792 2794 2810 N
+ JH DH ER s n/a 20 2792 2794 2810 N
+ JH DH EY b n/a 20 2792 2794 2805 N
+ JH DH EY s n/a 20 2792 2794 2805 N
+ JH DH F b n/a 20 2792 2799 2812 N
+ JH DH F s n/a 20 2792 2799 2812 N
+ JH DH G s n/a 20 2792 2799 2812 N
+ JH DH HH s n/a 20 2792 2799 2812 N
+ JH DH IH b n/a 20 2792 2794 2803 N
+ JH DH IH s n/a 20 2792 2794 2807 N
+ JH DH IY b n/a 20 2792 2794 2809 N
+ JH DH IY s n/a 20 2792 2794 2809 N
+ JH DH JH s n/a 20 2792 2800 2811 N
+ JH DH K b n/a 20 2792 2799 2812 N
+ JH DH K s n/a 20 2792 2799 2812 N
+ JH DH L s n/a 20 2792 2799 2812 N
+ JH DH M s n/a 20 2792 2799 2812 N
+ JH DH N s n/a 20 2792 2800 2813 N
+ JH DH NG s n/a 20 2792 2799 2812 N
+ JH DH OW b n/a 20 2792 2794 2806 N
+ JH DH OW s n/a 20 2792 2794 2806 N
+ JH DH OY b n/a 20 2792 2794 2804 N
+ JH DH OY s n/a 20 2792 2794 2804 N
+ JH DH P b n/a 20 2792 2799 2812 N
+ JH DH P s n/a 20 2792 2799 2812 N
+ JH DH R s n/a 20 2792 2799 2812 N
+ JH DH S b n/a 20 2792 2800 2813 N
+ JH DH S s n/a 20 2792 2800 2813 N
+ JH DH SH s n/a 20 2792 2800 2811 N
+ JH DH SIL s n/a 20 2792 2801 2811 N
+ JH DH T s n/a 20 2792 2800 2813 N
+ JH DH TH s n/a 20 2792 2800 2813 N
+ JH DH UH b n/a 20 2792 2794 2810 N
+ JH DH UH s n/a 20 2792 2794 2810 N
+ JH DH UW b n/a 20 2792 2794 2810 N
+ JH DH UW s n/a 20 2792 2794 2810 N
+ JH DH V s n/a 20 2792 2799 2812 N
+ JH DH W b n/a 20 2792 2799 2812 N
+ JH DH W s n/a 20 2792 2799 2812 N
+ JH DH Y b n/a 20 2792 2800 2812 N
+ JH DH Y s n/a 20 2792 2800 2812 N
+ JH DH Z b n/a 20 2792 2800 2813 N
+ JH DH Z s n/a 20 2792 2800 2813 N
+ JH DH ZH s n/a 20 2792 2800 2811 N
+ JH EH AA b n/a 20 2789 2795 2802 N
+ JH EH AA e n/a 20 2789 2795 2802 N
+ JH EH AA i n/a 20 2789 2795 2802 N
+ JH EH AA s n/a 20 2789 2795 2802 N
+ JH EH AE b n/a 20 2789 2795 2805 N
+ JH EH AE e n/a 20 2789 2797 2808 N
+ JH EH AE s n/a 20 2789 2797 2805 N
+ JH EH AH b n/a 20 2789 2795 2802 N
+ JH EH AH e n/a 20 2789 2797 2808 N
+ JH EH AH i n/a 20 2789 2797 2807 N
+ JH EH AH s n/a 20 2789 2797 2808 N
+ JH EH AO b n/a 20 2789 2795 2804 N
+ JH EH AO e n/a 20 2789 2795 2804 N
+ JH EH AO s n/a 20 2789 2795 2804 N
+ JH EH AW b n/a 20 2789 2795 2806 N
+ JH EH AW e n/a 20 2789 2797 2806 N
+ JH EH AW s n/a 20 2789 2797 2806 N
+ JH EH AY b n/a 20 2789 2795 2802 N
+ JH EH AY e n/a 20 2789 2795 2802 N
+ JH EH AY s n/a 20 2789 2795 2802 N
+ JH EH B e n/a 20 2789 2799 2812 N
+ JH EH B i n/a 20 2789 2799 2812 N
+ JH EH B s n/a 20 2789 2799 2812 N
+ JH EH CH e n/a 20 2789 2800 2811 N
+ JH EH CH s n/a 20 2789 2800 2811 N
+ JH EH D e n/a 20 2789 2800 2813 N
+ JH EH D i n/a 20 2789 2800 2813 N
+ JH EH D s n/a 20 2789 2800 2813 N
+ JH EH DH e n/a 20 2789 2800 2813 N
+ JH EH DH s n/a 20 2789 2800 2813 N
+ JH EH EH b n/a 20 2789 2795 2805 N
+ JH EH EH e n/a 20 2789 2797 2808 N
+ JH EH EH i n/a 20 2789 2797 2805 N
+ JH EH EH s n/a 20 2789 2797 2805 N
+ JH EH ER b n/a 20 2789 2795 2810 N
+ JH EH ER e n/a 20 2789 2795 2810 N
+ JH EH ER i n/a 20 2789 2795 2810 N
+ JH EH ER s n/a 20 2789 2795 2810 N
+ JH EH EY b n/a 20 2789 2798 2805 N
+ JH EH EY e n/a 20 2789 2798 2809 N
+ JH EH EY i n/a 20 2789 2798 2805 N
+ JH EH EY s n/a 20 2789 2798 2805 N
+ JH EH F b n/a 20 2789 2799 2812 N
+ JH EH F e n/a 20 2789 2799 2812 N
+ JH EH F s n/a 20 2789 2799 2812 N
+ JH EH G e n/a 20 2789 2799 2812 N
+ JH EH G s n/a 20 2789 2799 2812 N
+ JH EH HH e n/a 20 2789 2799 2812 N
+ JH EH HH i n/a 20 2789 2799 2812 N
+ JH EH HH s n/a 20 2789 2799 2812 N
+ JH EH IH b n/a 20 2789 2795 2803 N
+ JH EH IH e n/a 20 2789 2797 2807 N
+ JH EH IH i n/a 20 2789 2797 2807 N
+ JH EH IH s n/a 20 2789 2797 2807 N
+ JH EH IY b n/a 20 2789 2798 2809 N
+ JH EH IY e n/a 20 2789 2798 2809 N
+ JH EH IY i n/a 20 2789 2798 2809 N
+ JH EH IY s n/a 20 2789 2798 2809 N
+ JH EH JH e n/a 20 2789 2800 2811 N
+ JH EH JH s n/a 20 2789 2800 2811 N
+ JH EH K b n/a 20 2789 2799 2812 N
+ JH EH K e n/a 20 2789 2799 2812 N
+ JH EH K i n/a 20 2789 2799 2812 N
+ JH EH K s n/a 20 2789 2799 2812 N
+ JH EH L e n/a 20 2789 2799 2812 N
+ JH EH L i n/a 20 2789 2799 2812 N
+ JH EH L s n/a 20 2789 2799 2812 N
+ JH EH M e n/a 20 2789 2799 2812 N
+ JH EH M i n/a 20 2789 2799 2812 N
+ JH EH M s n/a 20 2789 2799 2812 N
+ JH EH N e n/a 20 2789 2800 2813 N
+ JH EH N i n/a 20 2789 2800 2813 N
+ JH EH N s n/a 20 2789 2800 2813 N
+ JH EH NG e n/a 20 2789 2799 2812 N
+ JH EH NG s n/a 20 2789 2799 2812 N
+ JH EH OW b n/a 20 2789 2795 2806 N
+ JH EH OW e n/a 20 2789 2795 2806 N
+ JH EH OW i n/a 20 2789 2795 2806 N
+ JH EH OW s n/a 20 2789 2795 2806 N
+ JH EH OY b n/a 20 2789 2795 2804 N
+ JH EH OY e n/a 20 2789 2795 2804 N
+ JH EH OY s n/a 20 2789 2795 2804 N
+ JH EH P b n/a 20 2789 2799 2812 N
+ JH EH P e n/a 20 2789 2799 2812 N
+ JH EH P i n/a 20 2789 2799 2812 N
+ JH EH P s n/a 20 2789 2799 2812 N
+ JH EH R e n/a 20 2789 2799 2812 N
+ JH EH R s n/a 20 2789 2799 2812 N
+ JH EH S b n/a 20 2789 2800 2813 N
+ JH EH S e n/a 20 2789 2800 2813 N
+ JH EH S i n/a 20 2789 2800 2813 N
+ JH EH S s n/a 20 2789 2800 2813 N
+ JH EH SH e n/a 20 2789 2800 2811 N
+ JH EH SH s n/a 20 2789 2800 2811 N
+ JH EH SIL e n/a 20 2789 2801 2811 N
+ JH EH SIL s n/a 20 2789 2801 2811 N
+ JH EH T e n/a 20 2789 2800 2813 N
+ JH EH T i n/a 20 2789 2800 2813 N
+ JH EH T s n/a 20 2789 2800 2813 N
+ JH EH TH e n/a 20 2789 2800 2813 N
+ JH EH TH s n/a 20 2789 2800 2813 N
+ JH EH UH b n/a 20 2789 2795 2810 N
+ JH EH UH e n/a 20 2789 2795 2810 N
+ JH EH UH i n/a 20 2789 2795 2810 N
+ JH EH UH s n/a 20 2789 2795 2810 N
+ JH EH UW b n/a 20 2789 2795 2810 N
+ JH EH UW e n/a 20 2789 2795 2810 N
+ JH EH UW i n/a 20 2789 2795 2810 N
+ JH EH UW s n/a 20 2789 2795 2810 N
+ JH EH V e n/a 20 2789 2799 2812 N
+ JH EH V s n/a 20 2789 2799 2812 N
+ JH EH W b n/a 20 2789 2799 2812 N
+ JH EH W e n/a 20 2789 2799 2812 N
+ JH EH W i n/a 20 2789 2799 2812 N
+ JH EH W s n/a 20 2789 2799 2812 N
+ JH EH Y b n/a 20 2789 2800 2812 N
+ JH EH Y e n/a 20 2789 2800 2812 N
+ JH EH Y i n/a 20 2789 2800 2812 N
+ JH EH Y s n/a 20 2789 2800 2812 N
+ JH EH Z b n/a 20 2789 2800 2813 N
+ JH EH Z e n/a 20 2789 2800 2813 N
+ JH EH Z s n/a 20 2789 2800 2813 N
+ JH EH ZH e n/a 20 2789 2800 2811 N
+ JH EH ZH s n/a 20 2789 2800 2811 N
+ JH ER AA b n/a 20 2790 2795 2802 N
+ JH ER AA e n/a 20 2790 2795 2802 N
+ JH ER AA i n/a 20 2790 2795 2802 N
+ JH ER AA s n/a 20 2790 2795 2802 N
+ JH ER AE b n/a 20 2790 2795 2805 N
+ JH ER AE e n/a 20 2790 2797 2808 N
+ JH ER AE i n/a 20 2790 2797 2805 N
+ JH ER AE s n/a 20 2790 2797 2805 N
+ JH ER AH b n/a 20 2790 2795 2802 N
+ JH ER AH e n/a 20 2790 2797 2808 N
+ JH ER AH i n/a 20 2790 2797 2808 N
+ JH ER AH s n/a 20 2790 2797 2808 N
+ JH ER AO b n/a 20 2790 2795 2804 N
+ JH ER AO e n/a 20 2790 2795 2804 N
+ JH ER AO s n/a 20 2790 2795 2804 N
+ JH ER AW b n/a 20 2790 2795 2806 N
+ JH ER AW e n/a 20 2790 2797 2806 N
+ JH ER AW s n/a 20 2790 2797 2806 N
+ JH ER AY b n/a 20 2790 2795 2802 N
+ JH ER AY e n/a 20 2790 2795 2802 N
+ JH ER AY i n/a 20 2790 2795 2802 N
+ JH ER AY s n/a 20 2790 2795 2802 N
+ JH ER B e n/a 20 2790 2799 2812 N
+ JH ER B s n/a 20 2790 2799 2812 N
+ JH ER CH e n/a 20 2790 2800 2811 N
+ JH ER CH s n/a 20 2790 2800 2811 N
+ JH ER D e n/a 20 2790 2800 2813 N
+ JH ER D i n/a 20 2790 2800 2813 N
+ JH ER D s n/a 20 2790 2800 2813 N
+ JH ER DH e n/a 20 2790 2800 2813 N
+ JH ER DH s n/a 20 2790 2800 2813 N
+ JH ER EH b n/a 20 2790 2795 2805 N
+ JH ER EH e n/a 20 2790 2797 2808 N
+ JH ER EH i n/a 20 2790 2797 2805 N
+ JH ER EH s n/a 20 2790 2797 2805 N
+ JH ER ER b n/a 20 2790 2795 2810 N
+ JH ER ER e n/a 20 2790 2795 2810 N
+ JH ER ER i n/a 20 2790 2795 2810 N
+ JH ER ER s n/a 20 2790 2795 2810 N
+ JH ER EY b n/a 20 2790 2797 2805 N
+ JH ER EY e n/a 20 2790 2797 2809 N
+ JH ER EY i n/a 20 2790 2797 2805 N
+ JH ER EY s n/a 20 2790 2797 2805 N
+ JH ER F b n/a 20 2790 2799 2812 N
+ JH ER F e n/a 20 2790 2799 2812 N
+ JH ER F s n/a 20 2790 2799 2812 N
+ JH ER G e n/a 20 2790 2799 2812 N
+ JH ER G s n/a 20 2790 2799 2812 N
+ JH ER HH e n/a 20 2790 2799 2812 N
+ JH ER HH s n/a 20 2790 2799 2812 N
+ JH ER IH b n/a 20 2790 2795 2803 N
+ JH ER IH e n/a 20 2790 2797 2807 N
+ JH ER IH i n/a 20 2790 2797 2807 N
+ JH ER IH s n/a 20 2790 2797 2807 N
+ JH ER IY b n/a 20 2790 2797 2809 N
+ JH ER IY e n/a 20 2790 2797 2809 N
+ JH ER IY i n/a 20 2790 2797 2809 N
+ JH ER IY s n/a 20 2790 2797 2809 N
+ JH ER JH e n/a 20 2790 2800 2811 N
+ JH ER JH s n/a 20 2790 2800 2811 N
+ JH ER K b n/a 20 2790 2799 2812 N
+ JH ER K e n/a 20 2790 2799 2812 N
+ JH ER K s n/a 20 2790 2799 2812 N
+ JH ER L e n/a 20 2790 2799 2812 N
+ JH ER L i n/a 20 2790 2799 2812 N
+ JH ER L s n/a 20 2790 2799 2812 N
+ JH ER M e n/a 20 2790 2799 2812 N
+ JH ER M s n/a 20 2790 2799 2812 N
+ JH ER N e n/a 20 2790 2800 2813 N
+ JH ER N s n/a 20 2790 2800 2813 N
+ JH ER NG e n/a 20 2790 2799 2812 N
+ JH ER NG s n/a 20 2790 2799 2812 N
+ JH ER OW b n/a 20 2790 2795 2806 N
+ JH ER OW e n/a 20 2790 2795 2806 N
+ JH ER OW s n/a 20 2790 2795 2806 N
+ JH ER OY b n/a 20 2790 2795 2804 N
+ JH ER OY e n/a 20 2790 2795 2804 N
+ JH ER OY i n/a 20 2790 2795 2804 N
+ JH ER OY s n/a 20 2790 2795 2804 N
+ JH ER P b n/a 20 2790 2799 2812 N
+ JH ER P e n/a 20 2790 2799 2812 N
+ JH ER P s n/a 20 2790 2799 2812 N
+ JH ER R e n/a 20 2790 2799 2812 N
+ JH ER R s n/a 20 2790 2799 2812 N
+ JH ER S b n/a 20 2790 2800 2813 N
+ JH ER S e n/a 20 2790 2800 2813 N
+ JH ER S s n/a 20 2790 2800 2813 N
+ JH ER SH e n/a 20 2790 2800 2811 N
+ JH ER SH s n/a 20 2790 2800 2811 N
+ JH ER SIL e n/a 20 2790 2801 2811 N
+ JH ER SIL s n/a 20 2790 2801 2811 N
+ JH ER T e n/a 20 2790 2800 2813 N
+ JH ER T s n/a 20 2790 2800 2813 N
+ JH ER TH e n/a 20 2790 2800 2813 N
+ JH ER TH s n/a 20 2790 2800 2813 N
+ JH ER UH b n/a 20 2790 2795 2810 N
+ JH ER UH e n/a 20 2790 2795 2810 N
+ JH ER UH s n/a 20 2790 2795 2810 N
+ JH ER UW b n/a 20 2790 2795 2810 N
+ JH ER UW e n/a 20 2790 2795 2810 N
+ JH ER UW s n/a 20 2790 2795 2810 N
+ JH ER V e n/a 20 2790 2799 2812 N
+ JH ER V s n/a 20 2790 2799 2812 N
+ JH ER W b n/a 20 2790 2799 2812 N
+ JH ER W e n/a 20 2790 2799 2812 N
+ JH ER W s n/a 20 2790 2799 2812 N
+ JH ER Y b n/a 20 2790 2800 2812 N
+ JH ER Y e n/a 20 2790 2800 2812 N
+ JH ER Y i n/a 20 2790 2800 2812 N
+ JH ER Y s n/a 20 2790 2800 2812 N
+ JH ER Z b n/a 20 2790 2800 2813 N
+ JH ER Z e n/a 20 2790 2800 2813 N
+ JH ER Z s n/a 20 2790 2800 2813 N
+ JH ER ZH e n/a 20 2790 2800 2811 N
+ JH ER ZH s n/a 20 2790 2800 2811 N
+ JH EY AA b n/a 20 2787 2795 2802 N
+ JH EY AA e n/a 20 2787 2795 2802 N
+ JH EY AA i n/a 20 2787 2795 2802 N
+ JH EY AA s n/a 20 2787 2795 2802 N
+ JH EY AE b n/a 20 2787 2795 2805 N
+ JH EY AE e n/a 20 2787 2797 2808 N
+ JH EY AE i n/a 20 2787 2797 2805 N
+ JH EY AE s n/a 20 2787 2797 2805 N
+ JH EY AH b n/a 20 2787 2795 2802 N
+ JH EY AH e n/a 20 2787 2797 2808 N
+ JH EY AH i n/a 20 2787 2797 2807 N
+ JH EY AH s n/a 20 2787 2797 2808 N
+ JH EY AO b n/a 20 2787 2795 2804 N
+ JH EY AO e n/a 20 2787 2795 2804 N
+ JH EY AO s n/a 20 2787 2795 2804 N
+ JH EY AW b n/a 20 2787 2795 2806 N
+ JH EY AW e n/a 20 2787 2797 2806 N
+ JH EY AW s n/a 20 2787 2797 2806 N
+ JH EY AY b n/a 20 2787 2795 2802 N
+ JH EY AY e n/a 20 2787 2795 2802 N
+ JH EY AY i n/a 20 2787 2795 2802 N
+ JH EY AY s n/a 20 2787 2795 2802 N
+ JH EY B e n/a 20 2787 2799 2812 N
+ JH EY B i n/a 20 2787 2799 2812 N
+ JH EY B s n/a 20 2787 2799 2812 N
+ JH EY CH e n/a 20 2787 2800 2811 N
+ JH EY CH s n/a 20 2787 2800 2811 N
+ JH EY D e n/a 20 2787 2800 2813 N
+ JH EY D i n/a 20 2787 2800 2813 N
+ JH EY D s n/a 20 2787 2800 2813 N
+ JH EY DH e n/a 20 2787 2800 2813 N
+ JH EY DH s n/a 20 2787 2800 2813 N
+ JH EY EH b n/a 20 2787 2795 2805 N
+ JH EY EH e n/a 20 2787 2797 2808 N
+ JH EY EH i n/a 20 2787 2797 2805 N
+ JH EY EH s n/a 20 2787 2797 2805 N
+ JH EY ER b n/a 20 2787 2795 2810 N
+ JH EY ER e n/a 20 2787 2795 2810 N
+ JH EY ER i n/a 20 2787 2795 2810 N
+ JH EY ER s n/a 20 2787 2795 2810 N
+ JH EY EY b n/a 20 2787 2797 2805 N
+ JH EY EY e n/a 20 2787 2797 2809 N
+ JH EY EY i n/a 20 2787 2797 2805 N
+ JH EY EY s n/a 20 2787 2797 2805 N
+ JH EY F b n/a 20 2787 2799 2812 N
+ JH EY F e n/a 20 2787 2799 2812 N
+ JH EY F i n/a 20 2787 2799 2812 N
+ JH EY F s n/a 20 2787 2799 2812 N
+ JH EY G e n/a 20 2787 2799 2812 N
+ JH EY G s n/a 20 2787 2799 2812 N
+ JH EY HH e n/a 20 2787 2799 2812 N
+ JH EY HH i n/a 20 2787 2799 2812 N
+ JH EY HH s n/a 20 2787 2799 2812 N
+ JH EY IH b n/a 20 2787 2795 2803 N
+ JH EY IH e n/a 20 2787 2797 2807 N
+ JH EY IH i n/a 20 2787 2797 2807 N
+ JH EY IH s n/a 20 2787 2797 2807 N
+ JH EY IY b n/a 20 2787 2797 2809 N
+ JH EY IY e n/a 20 2787 2797 2809 N
+ JH EY IY i n/a 20 2787 2797 2809 N
+ JH EY IY s n/a 20 2787 2797 2809 N
+ JH EY JH e n/a 20 2787 2800 2811 N
+ JH EY JH s n/a 20 2787 2800 2811 N
+ JH EY K b n/a 20 2787 2799 2812 N
+ JH EY K e n/a 20 2787 2799 2812 N
+ JH EY K i n/a 20 2787 2799 2812 N
+ JH EY K s n/a 20 2787 2799 2812 N
+ JH EY L e n/a 20 2787 2799 2812 N
+ JH EY L i n/a 20 2787 2799 2812 N
+ JH EY L s n/a 20 2787 2799 2812 N
+ JH EY M e n/a 20 2787 2799 2812 N
+ JH EY M i n/a 20 2787 2799 2812 N
+ JH EY M s n/a 20 2787 2799 2812 N
+ JH EY N e n/a 20 2787 2800 2813 N
+ JH EY N i n/a 20 2787 2800 2813 N
+ JH EY N s n/a 20 2787 2800 2813 N
+ JH EY NG e n/a 20 2787 2799 2812 N
+ JH EY NG s n/a 20 2787 2799 2812 N
+ JH EY OW b n/a 20 2787 2795 2806 N
+ JH EY OW e n/a 20 2787 2795 2806 N
+ JH EY OW s n/a 20 2787 2795 2806 N
+ JH EY OY b n/a 20 2787 2795 2804 N
+ JH EY OY e n/a 20 2787 2795 2804 N
+ JH EY OY s n/a 20 2787 2795 2804 N
+ JH EY P b n/a 20 2787 2799 2812 N
+ JH EY P e n/a 20 2787 2799 2812 N
+ JH EY P s n/a 20 2787 2799 2812 N
+ JH EY R e n/a 20 2787 2799 2812 N
+ JH EY R s n/a 20 2787 2799 2812 N
+ JH EY S b n/a 20 2787 2800 2813 N
+ JH EY S e n/a 20 2787 2800 2813 N
+ JH EY S s n/a 20 2787 2800 2813 N
+ JH EY SH e n/a 20 2787 2800 2811 N
+ JH EY SH s n/a 20 2787 2800 2811 N
+ JH EY SIL e n/a 20 2787 2801 2811 N
+ JH EY SIL s n/a 20 2787 2801 2811 N
+ JH EY T e n/a 20 2787 2800 2813 N
+ JH EY T s n/a 20 2787 2800 2813 N
+ JH EY TH e n/a 20 2787 2800 2813 N
+ JH EY TH s n/a 20 2787 2800 2813 N
+ JH EY UH b n/a 20 2787 2795 2810 N
+ JH EY UH e n/a 20 2787 2795 2810 N
+ JH EY UH s n/a 20 2787 2795 2810 N
+ JH EY UW b n/a 20 2787 2795 2810 N
+ JH EY UW e n/a 20 2787 2795 2810 N
+ JH EY UW s n/a 20 2787 2795 2810 N
+ JH EY V e n/a 20 2787 2799 2812 N
+ JH EY V s n/a 20 2787 2799 2812 N
+ JH EY W b n/a 20 2787 2799 2812 N
+ JH EY W e n/a 20 2787 2799 2812 N
+ JH EY W i n/a 20 2787 2799 2812 N
+ JH EY W s n/a 20 2787 2799 2812 N
+ JH EY Y b n/a 20 2787 2800 2812 N
+ JH EY Y e n/a 20 2787 2800 2812 N
+ JH EY Y s n/a 20 2787 2800 2812 N
+ JH EY Z b n/a 20 2787 2800 2813 N
+ JH EY Z e n/a 20 2787 2800 2813 N
+ JH EY Z s n/a 20 2787 2800 2813 N
+ JH EY ZH e n/a 20 2787 2800 2811 N
+ JH EY ZH s n/a 20 2787 2800 2811 N
+ JH F AA b n/a 20 2791 2794 2802 N
+ JH F AA s n/a 20 2791 2794 2802 N
+ JH F AE b n/a 20 2791 2794 2805 N
+ JH F AE s n/a 20 2791 2794 2805 N
+ JH F AH b n/a 20 2791 2794 2802 N
+ JH F AH s n/a 20 2791 2794 2808 N
+ JH F AO b n/a 20 2791 2794 2804 N
+ JH F AO s n/a 20 2791 2794 2804 N
+ JH F AW b n/a 20 2791 2794 2806 N
+ JH F AW s n/a 20 2791 2794 2806 N
+ JH F AY b n/a 20 2791 2794 2802 N
+ JH F AY s n/a 20 2791 2794 2802 N
+ JH F B s n/a 20 2791 2799 2812 N
+ JH F CH s n/a 20 2791 2800 2811 N
+ JH F D s n/a 20 2791 2800 2813 N
+ JH F DH s n/a 20 2791 2800 2813 N
+ JH F EH b n/a 20 2791 2794 2805 N
+ JH F EH s n/a 20 2791 2794 2805 N
+ JH F ER b n/a 20 2791 2794 2810 N
+ JH F ER s n/a 20 2791 2794 2810 N
+ JH F EY b n/a 20 2791 2794 2805 N
+ JH F EY s n/a 20 2791 2794 2805 N
+ JH F F b n/a 20 2791 2799 2812 N
+ JH F F s n/a 20 2791 2799 2812 N
+ JH F G s n/a 20 2791 2799 2812 N
+ JH F HH s n/a 20 2791 2799 2812 N
+ JH F IH b n/a 20 2791 2794 2803 N
+ JH F IH s n/a 20 2791 2794 2807 N
+ JH F IY b n/a 20 2791 2794 2809 N
+ JH F IY s n/a 20 2791 2794 2809 N
+ JH F JH s n/a 20 2791 2800 2811 N
+ JH F K b n/a 20 2791 2799 2812 N
+ JH F K s n/a 20 2791 2799 2812 N
+ JH F L s n/a 20 2791 2799 2812 N
+ JH F M s n/a 20 2791 2799 2812 N
+ JH F N s n/a 20 2791 2800 2813 N
+ JH F NG s n/a 20 2791 2799 2812 N
+ JH F OW b n/a 20 2791 2794 2806 N
+ JH F OW s n/a 20 2791 2794 2806 N
+ JH F OY b n/a 20 2791 2794 2804 N
+ JH F OY s n/a 20 2791 2794 2804 N
+ JH F P b n/a 20 2791 2799 2812 N
+ JH F P s n/a 20 2791 2799 2812 N
+ JH F R s n/a 20 2791 2799 2812 N
+ JH F S b n/a 20 2791 2800 2813 N
+ JH F S s n/a 20 2791 2800 2813 N
+ JH F SH s n/a 20 2791 2800 2811 N
+ JH F SIL s n/a 20 2791 2801 2811 N
+ JH F T s n/a 20 2791 2800 2813 N
+ JH F TH s n/a 20 2791 2800 2813 N
+ JH F UH b n/a 20 2791 2794 2810 N
+ JH F UH s n/a 20 2791 2794 2810 N
+ JH F UW b n/a 20 2791 2794 2810 N
+ JH F UW s n/a 20 2791 2794 2810 N
+ JH F V s n/a 20 2791 2799 2812 N
+ JH F W b n/a 20 2791 2799 2812 N
+ JH F W s n/a 20 2791 2799 2812 N
+ JH F Y b n/a 20 2791 2800 2812 N
+ JH F Y s n/a 20 2791 2800 2812 N
+ JH F Z b n/a 20 2791 2800 2813 N
+ JH F Z s n/a 20 2791 2800 2813 N
+ JH F ZH s n/a 20 2791 2800 2811 N
+ JH G AA b n/a 20 2792 2794 2802 N
+ JH G AA s n/a 20 2792 2794 2802 N
+ JH G AE b n/a 20 2792 2794 2805 N
+ JH G AE i n/a 20 2792 2794 2805 N
+ JH G AE s n/a 20 2792 2794 2805 N
+ JH G AH b n/a 20 2792 2794 2802 N
+ JH G AH i n/a 20 2792 2794 2807 N
+ JH G AH s n/a 20 2792 2794 2808 N
+ JH G AO b n/a 20 2792 2794 2804 N
+ JH G AO s n/a 20 2792 2794 2804 N
+ JH G AW b n/a 20 2792 2794 2806 N
+ JH G AW s n/a 20 2792 2794 2806 N
+ JH G AY b n/a 20 2792 2794 2802 N
+ JH G AY s n/a 20 2792 2794 2802 N
+ JH G B s n/a 20 2792 2799 2812 N
+ JH G CH s n/a 20 2792 2800 2811 N
+ JH G D s n/a 20 2792 2800 2813 N
+ JH G DH s n/a 20 2792 2800 2813 N
+ JH G EH b n/a 20 2792 2794 2805 N
+ JH G EH s n/a 20 2792 2794 2805 N
+ JH G ER b n/a 20 2792 2794 2810 N
+ JH G ER s n/a 20 2792 2794 2810 N
+ JH G EY b n/a 20 2792 2794 2805 N
+ JH G EY s n/a 20 2792 2794 2805 N
+ JH G F b n/a 20 2792 2799 2812 N
+ JH G F s n/a 20 2792 2799 2812 N
+ JH G G s n/a 20 2792 2799 2812 N
+ JH G HH s n/a 20 2792 2799 2812 N
+ JH G IH b n/a 20 2792 2794 2803 N
+ JH G IH s n/a 20 2792 2794 2807 N
+ JH G IY b n/a 20 2792 2794 2809 N
+ JH G IY s n/a 20 2792 2794 2809 N
+ JH G JH s n/a 20 2792 2800 2811 N
+ JH G K b n/a 20 2792 2799 2812 N
+ JH G K s n/a 20 2792 2799 2812 N
+ JH G L s n/a 20 2792 2799 2812 N
+ JH G M s n/a 20 2792 2799 2812 N
+ JH G N s n/a 20 2792 2800 2813 N
+ JH G NG s n/a 20 2792 2799 2812 N
+ JH G OW b n/a 20 2792 2794 2806 N
+ JH G OW s n/a 20 2792 2794 2806 N
+ JH G OY b n/a 20 2792 2794 2804 N
+ JH G OY s n/a 20 2792 2794 2804 N
+ JH G P b n/a 20 2792 2799 2812 N
+ JH G P s n/a 20 2792 2799 2812 N
+ JH G R s n/a 20 2792 2799 2812 N
+ JH G S b n/a 20 2792 2800 2813 N
+ JH G S s n/a 20 2792 2800 2813 N
+ JH G SH s n/a 20 2792 2800 2811 N
+ JH G SIL s n/a 20 2792 2801 2811 N
+ JH G T s n/a 20 2792 2800 2813 N
+ JH G TH s n/a 20 2792 2800 2813 N
+ JH G UH b n/a 20 2792 2794 2810 N
+ JH G UH s n/a 20 2792 2794 2810 N
+ JH G UW b n/a 20 2792 2794 2810 N
+ JH G UW s n/a 20 2792 2794 2810 N
+ JH G V s n/a 20 2792 2799 2812 N
+ JH G W b n/a 20 2792 2799 2812 N
+ JH G W s n/a 20 2792 2799 2812 N
+ JH G Y b n/a 20 2792 2800 2812 N
+ JH G Y s n/a 20 2792 2800 2812 N
+ JH G Z b n/a 20 2792 2800 2813 N
+ JH G Z s n/a 20 2792 2800 2813 N
+ JH G ZH s n/a 20 2792 2800 2811 N
+ JH HH AA b n/a 20 2791 2794 2802 N
+ JH HH AA s n/a 20 2791 2794 2802 N
+ JH HH AE b n/a 20 2791 2794 2805 N
+ JH HH AE s n/a 20 2791 2794 2805 N
+ JH HH AH b n/a 20 2791 2794 2802 N
+ JH HH AH s n/a 20 2791 2794 2808 N
+ JH HH AO b n/a 20 2791 2794 2804 N
+ JH HH AO s n/a 20 2791 2794 2804 N
+ JH HH AW b n/a 20 2791 2794 2806 N
+ JH HH AW s n/a 20 2791 2794 2806 N
+ JH HH AY b n/a 20 2791 2794 2802 N
+ JH HH AY s n/a 20 2791 2794 2802 N
+ JH HH B s n/a 20 2791 2799 2812 N
+ JH HH CH s n/a 20 2791 2800 2811 N
+ JH HH D s n/a 20 2791 2800 2813 N
+ JH HH DH s n/a 20 2791 2800 2813 N
+ JH HH EH b n/a 20 2791 2794 2805 N
+ JH HH EH s n/a 20 2791 2794 2805 N
+ JH HH ER b n/a 20 2791 2794 2810 N
+ JH HH ER s n/a 20 2791 2794 2810 N
+ JH HH EY b n/a 20 2791 2794 2805 N
+ JH HH EY s n/a 20 2791 2794 2805 N
+ JH HH F b n/a 20 2791 2799 2812 N
+ JH HH F s n/a 20 2791 2799 2812 N
+ JH HH G s n/a 20 2791 2799 2812 N
+ JH HH HH s n/a 20 2791 2799 2812 N
+ JH HH IH b n/a 20 2791 2794 2803 N
+ JH HH IH s n/a 20 2791 2794 2807 N
+ JH HH IY b n/a 20 2791 2794 2809 N
+ JH HH IY s n/a 20 2791 2794 2809 N
+ JH HH JH s n/a 20 2791 2800 2811 N
+ JH HH K b n/a 20 2791 2799 2812 N
+ JH HH K s n/a 20 2791 2799 2812 N
+ JH HH L s n/a 20 2791 2799 2812 N
+ JH HH M s n/a 20 2791 2799 2812 N
+ JH HH N s n/a 20 2791 2800 2813 N
+ JH HH NG s n/a 20 2791 2799 2812 N
+ JH HH OW b n/a 20 2791 2794 2806 N
+ JH HH OW s n/a 20 2791 2794 2806 N
+ JH HH OY b n/a 20 2791 2794 2804 N
+ JH HH OY s n/a 20 2791 2794 2804 N
+ JH HH P b n/a 20 2791 2799 2812 N
+ JH HH P s n/a 20 2791 2799 2812 N
+ JH HH R s n/a 20 2791 2799 2812 N
+ JH HH S b n/a 20 2791 2800 2813 N
+ JH HH S s n/a 20 2791 2800 2813 N
+ JH HH SH s n/a 20 2791 2800 2811 N
+ JH HH SIL s n/a 20 2791 2801 2811 N
+ JH HH T s n/a 20 2791 2800 2813 N
+ JH HH TH s n/a 20 2791 2800 2813 N
+ JH HH UH b n/a 20 2791 2794 2810 N
+ JH HH UH s n/a 20 2791 2794 2810 N
+ JH HH UW b n/a 20 2791 2794 2810 N
+ JH HH UW s n/a 20 2791 2794 2810 N
+ JH HH V s n/a 20 2791 2799 2812 N
+ JH HH W b n/a 20 2791 2799 2812 N
+ JH HH W s n/a 20 2791 2799 2812 N
+ JH HH Y b n/a 20 2791 2800 2812 N
+ JH HH Y s n/a 20 2791 2800 2812 N
+ JH HH Z b n/a 20 2791 2800 2813 N
+ JH HH Z s n/a 20 2791 2800 2813 N
+ JH HH ZH s n/a 20 2791 2800 2811 N
+ JH IH AA b n/a 20 2786 2795 2802 N
+ JH IH AA e n/a 20 2785 2795 2802 N
+ JH IH AA i n/a 20 2785 2795 2802 N
+ JH IH AA s n/a 20 2785 2795 2802 N
+ JH IH AE b n/a 20 2786 2795 2805 N
+ JH IH AE e n/a 20 2785 2797 2808 N
+ JH IH AE i n/a 20 2785 2797 2805 N
+ JH IH AE s n/a 20 2785 2797 2805 N
+ JH IH AH b n/a 20 2786 2795 2802 N
+ JH IH AH e n/a 20 2785 2797 2808 N
+ JH IH AH i n/a 20 2785 2797 2808 N
+ JH IH AH s n/a 20 2785 2797 2808 N
+ JH IH AO b n/a 20 2786 2795 2804 N
+ JH IH AO e n/a 20 2785 2795 2804 N
+ JH IH AO i n/a 20 2785 2795 2804 N
+ JH IH AO s n/a 20 2785 2795 2804 N
+ JH IH AW b n/a 20 2786 2795 2806 N
+ JH IH AW e n/a 20 2785 2797 2806 N
+ JH IH AW s n/a 20 2785 2797 2806 N
+ JH IH AY b n/a 20 2786 2795 2802 N
+ JH IH AY e n/a 20 2785 2795 2802 N
+ JH IH AY s n/a 20 2785 2795 2802 N
+ JH IH B e n/a 20 2785 2799 2812 N
+ JH IH B i n/a 20 2785 2799 2812 N
+ JH IH B s n/a 20 2785 2799 2812 N
+ JH IH CH e n/a 20 2785 2800 2811 N
+ JH IH CH s n/a 20 2785 2800 2811 N
+ JH IH D e n/a 20 2785 2800 2813 N
+ JH IH D i n/a 20 2785 2800 2813 N
+ JH IH D s n/a 20 2785 2800 2813 N
+ JH IH DH e n/a 20 2785 2800 2813 N
+ JH IH DH s n/a 20 2785 2800 2813 N
+ JH IH EH b n/a 20 2786 2795 2805 N
+ JH IH EH e n/a 20 2785 2797 2808 N
+ JH IH EH i n/a 20 2785 2797 2805 N
+ JH IH EH s n/a 20 2785 2797 2805 N
+ JH IH ER b n/a 20 2786 2795 2810 N
+ JH IH ER e n/a 20 2785 2795 2810 N
+ JH IH ER i n/a 20 2785 2795 2810 N
+ JH IH ER s n/a 20 2785 2795 2810 N
+ JH IH EY b n/a 20 2786 2798 2805 N
+ JH IH EY e n/a 20 2784 2798 2809 N
+ JH IH EY s n/a 20 2784 2798 2805 N
+ JH IH F b n/a 20 2786 2799 2812 N
+ JH IH F e n/a 20 2785 2799 2812 N
+ JH IH F i n/a 20 2785 2799 2812 N
+ JH IH F s n/a 20 2785 2799 2812 N
+ JH IH G e n/a 20 2785 2799 2812 N
+ JH IH G s n/a 20 2785 2799 2812 N
+ JH IH HH e n/a 20 2785 2799 2812 N
+ JH IH HH i n/a 20 2785 2799 2812 N
+ JH IH HH s n/a 20 2785 2799 2812 N
+ JH IH IH b n/a 20 2786 2795 2803 N
+ JH IH IH e n/a 20 2785 2797 2807 N
+ JH IH IH i n/a 20 2785 2797 2807 N
+ JH IH IH s n/a 20 2785 2797 2807 N
+ JH IH IY b n/a 20 2786 2798 2809 N
+ JH IH IY e n/a 20 2784 2798 2809 N
+ JH IH IY i n/a 20 2784 2798 2809 N
+ JH IH IY s n/a 20 2784 2798 2809 N
+ JH IH JH e n/a 20 2785 2800 2811 N
+ JH IH JH s n/a 20 2785 2800 2811 N
+ JH IH K b n/a 20 2786 2799 2812 N
+ JH IH K e n/a 20 2785 2799 2812 N
+ JH IH K i n/a 20 2785 2799 2812 N
+ JH IH K s n/a 20 2785 2799 2812 N
+ JH IH L e n/a 20 2785 2799 2812 N
+ JH IH L i n/a 20 2785 2799 2812 N
+ JH IH L s n/a 20 2785 2799 2812 N
+ JH IH M e n/a 20 2785 2799 2812 N
+ JH IH M i n/a 20 2785 2799 2812 N
+ JH IH M s n/a 20 2785 2799 2812 N
+ JH IH N e n/a 20 2785 2800 2813 N
+ JH IH N i n/a 20 2785 2800 2813 N
+ JH IH N s n/a 20 2785 2800 2813 N
+ JH IH NG e n/a 20 2785 2799 2812 N
+ JH IH NG s n/a 20 2785 2799 2812 N
+ JH IH OW b n/a 20 2786 2795 2806 N
+ JH IH OW e n/a 20 2785 2795 2806 N
+ JH IH OW i n/a 20 2785 2795 2806 N
+ JH IH OW s n/a 20 2785 2795 2806 N
+ JH IH OY b n/a 20 2786 2795 2804 N
+ JH IH OY e n/a 20 2785 2795 2804 N
+ JH IH OY i n/a 20 2785 2795 2804 N
+ JH IH OY s n/a 20 2785 2795 2804 N
+ JH IH P b n/a 20 2786 2799 2812 N
+ JH IH P e n/a 20 2785 2799 2812 N
+ JH IH P i n/a 20 2785 2799 2812 N
+ JH IH P s n/a 20 2785 2799 2812 N
+ JH IH R e n/a 20 2785 2799 2812 N
+ JH IH R i n/a 20 2785 2799 2812 N
+ JH IH R s n/a 20 2785 2799 2812 N
+ JH IH S b n/a 20 2786 2800 2813 N
+ JH IH S e n/a 20 2785 2800 2813 N
+ JH IH S i n/a 20 2785 2800 2813 N
+ JH IH S s n/a 20 2785 2800 2813 N
+ JH IH SH e n/a 20 2785 2800 2811 N
+ JH IH SH s n/a 20 2785 2800 2811 N
+ JH IH SIL e n/a 20 2786 2801 2811 N
+ JH IH SIL s n/a 20 2786 2801 2811 N
+ JH IH T e n/a 20 2785 2800 2813 N
+ JH IH T i n/a 20 2785 2800 2813 N
+ JH IH T s n/a 20 2785 2800 2813 N
+ JH IH TH e n/a 20 2785 2800 2813 N
+ JH IH TH s n/a 20 2785 2800 2813 N
+ JH IH UH b n/a 20 2786 2795 2810 N
+ JH IH UH e n/a 20 2785 2795 2810 N
+ JH IH UH s n/a 20 2785 2795 2810 N
+ JH IH UW b n/a 20 2786 2795 2810 N
+ JH IH UW e n/a 20 2785 2795 2810 N
+ JH IH UW i n/a 20 2785 2795 2810 N
+ JH IH UW s n/a 20 2785 2795 2810 N
+ JH IH V e n/a 20 2785 2799 2812 N
+ JH IH V s n/a 20 2785 2799 2812 N
+ JH IH W b n/a 20 2786 2799 2812 N
+ JH IH W e n/a 20 2785 2799 2812 N
+ JH IH W i n/a 20 2785 2799 2812 N
+ JH IH W s n/a 20 2785 2799 2812 N
+ JH IH Y b n/a 20 2786 2800 2812 N
+ JH IH Y e n/a 20 2785 2800 2812 N
+ JH IH Y s n/a 20 2785 2800 2812 N
+ JH IH Z b n/a 20 2786 2800 2813 N
+ JH IH Z e n/a 20 2785 2800 2813 N
+ JH IH Z i n/a 20 2785 2800 2813 N
+ JH IH Z s n/a 20 2785 2800 2813 N
+ JH IH ZH e n/a 20 2785 2800 2811 N
+ JH IH ZH s n/a 20 2785 2800 2811 N
+ JH IY AA b n/a 20 2787 2795 2802 N
+ JH IY AA e n/a 20 2787 2795 2802 N
+ JH IY AA i n/a 20 2787 2795 2802 N
+ JH IY AA s n/a 20 2787 2795 2802 N
+ JH IY AE b n/a 20 2787 2795 2805 N
+ JH IY AE e n/a 20 2787 2797 2808 N
+ JH IY AE i n/a 20 2787 2797 2805 N
+ JH IY AE s n/a 20 2787 2797 2805 N
+ JH IY AH b n/a 20 2787 2795 2802 N
+ JH IY AH e n/a 20 2787 2797 2808 N
+ JH IY AH i n/a 20 2787 2797 2808 N
+ JH IY AH s n/a 20 2787 2797 2808 N
+ JH IY AO b n/a 20 2787 2795 2804 N
+ JH IY AO e n/a 20 2787 2795 2804 N
+ JH IY AO s n/a 20 2787 2795 2804 N
+ JH IY AW b n/a 20 2787 2795 2806 N
+ JH IY AW e n/a 20 2787 2797 2806 N
+ JH IY AW s n/a 20 2787 2797 2806 N
+ JH IY AY b n/a 20 2787 2795 2802 N
+ JH IY AY e n/a 20 2787 2795 2802 N
+ JH IY AY s n/a 20 2787 2795 2802 N
+ JH IY B e n/a 20 2787 2799 2812 N
+ JH IY B s n/a 20 2787 2799 2812 N
+ JH IY CH e n/a 20 2787 2800 2811 N
+ JH IY CH s n/a 20 2787 2800 2811 N
+ JH IY D e n/a 20 2787 2800 2813 N
+ JH IY D i n/a 20 2787 2800 2813 N
+ JH IY D s n/a 20 2787 2800 2813 N
+ JH IY DH e n/a 20 2787 2800 2813 N
+ JH IY DH s n/a 20 2787 2800 2813 N
+ JH IY EH b n/a 20 2787 2795 2805 N
+ JH IY EH e n/a 20 2787 2797 2808 N
+ JH IY EH i n/a 20 2787 2797 2805 N
+ JH IY EH s n/a 20 2787 2797 2805 N
+ JH IY ER b n/a 20 2787 2795 2810 N
+ JH IY ER e n/a 20 2787 2795 2810 N
+ JH IY ER i n/a 20 2787 2795 2810 N
+ JH IY ER s n/a 20 2787 2795 2810 N
+ JH IY EY b n/a 20 2787 2797 2805 N
+ JH IY EY e n/a 20 2787 2797 2809 N
+ JH IY EY i n/a 20 2787 2797 2805 N
+ JH IY EY s n/a 20 2787 2797 2805 N
+ JH IY F b n/a 20 2787 2799 2812 N
+ JH IY F e n/a 20 2787 2799 2812 N
+ JH IY F s n/a 20 2787 2799 2812 N
+ JH IY G e n/a 20 2787 2799 2812 N
+ JH IY G s n/a 20 2787 2799 2812 N
+ JH IY HH e n/a 20 2787 2799 2812 N
+ JH IY HH s n/a 20 2787 2799 2812 N
+ JH IY IH b n/a 20 2787 2795 2803 N
+ JH IY IH e n/a 20 2787 2797 2807 N
+ JH IY IH i n/a 20 2787 2797 2807 N
+ JH IY IH s n/a 20 2787 2797 2807 N
+ JH IY IY b n/a 20 2787 2797 2809 N
+ JH IY IY e n/a 20 2787 2797 2809 N
+ JH IY IY i n/a 20 2787 2797 2809 N
+ JH IY IY s n/a 20 2787 2797 2809 N
+ JH IY JH e n/a 20 2787 2800 2811 N
+ JH IY JH s n/a 20 2787 2800 2811 N
+ JH IY K b n/a 20 2787 2799 2812 N
+ JH IY K e n/a 20 2787 2799 2812 N
+ JH IY K i n/a 20 2787 2799 2812 N
+ JH IY K s n/a 20 2787 2799 2812 N
+ JH IY L e n/a 20 2787 2799 2812 N
+ JH IY L s n/a 20 2787 2799 2812 N
+ JH IY M e n/a 20 2787 2799 2812 N
+ JH IY M i n/a 20 2787 2799 2812 N
+ JH IY M s n/a 20 2787 2799 2812 N
+ JH IY N e n/a 20 2787 2800 2813 N
+ JH IY N s n/a 20 2787 2800 2813 N
+ JH IY NG e n/a 20 2787 2799 2812 N
+ JH IY NG s n/a 20 2787 2799 2812 N
+ JH IY OW b n/a 20 2787 2795 2806 N
+ JH IY OW e n/a 20 2787 2795 2806 N
+ JH IY OW s n/a 20 2787 2795 2806 N
+ JH IY OY b n/a 20 2787 2795 2804 N
+ JH IY OY e n/a 20 2787 2795 2804 N
+ JH IY OY i n/a 20 2787 2795 2804 N
+ JH IY OY s n/a 20 2787 2795 2804 N
+ JH IY P b n/a 20 2787 2799 2812 N
+ JH IY P e n/a 20 2787 2799 2812 N
+ JH IY P s n/a 20 2787 2799 2812 N
+ JH IY R e n/a 20 2787 2799 2812 N
+ JH IY R i n/a 20 2787 2799 2812 N
+ JH IY R s n/a 20 2787 2799 2812 N
+ JH IY S b n/a 20 2787 2800 2813 N
+ JH IY S e n/a 20 2787 2800 2813 N
+ JH IY S s n/a 20 2787 2800 2813 N
+ JH IY SH e n/a 20 2787 2800 2811 N
+ JH IY SH s n/a 20 2787 2800 2811 N
+ JH IY SIL e n/a 20 2787 2801 2811 N
+ JH IY SIL s n/a 20 2787 2801 2811 N
+ JH IY T e n/a 20 2787 2800 2813 N
+ JH IY T s n/a 20 2787 2800 2813 N
+ JH IY TH e n/a 20 2787 2800 2813 N
+ JH IY TH s n/a 20 2787 2800 2813 N
+ JH IY UH b n/a 20 2787 2795 2810 N
+ JH IY UH e n/a 20 2787 2795 2810 N
+ JH IY UH s n/a 20 2787 2795 2810 N
+ JH IY UW b n/a 20 2787 2795 2810 N
+ JH IY UW e n/a 20 2787 2795 2810 N
+ JH IY UW i n/a 20 2787 2795 2810 N
+ JH IY UW s n/a 20 2787 2795 2810 N
+ JH IY V e n/a 20 2787 2799 2812 N
+ JH IY V i n/a 20 2787 2799 2812 N
+ JH IY V s n/a 20 2787 2799 2812 N
+ JH IY W b n/a 20 2787 2799 2812 N
+ JH IY W e n/a 20 2787 2799 2812 N
+ JH IY W s n/a 20 2787 2799 2812 N
+ JH IY Y b n/a 20 2787 2800 2812 N
+ JH IY Y e n/a 20 2787 2800 2812 N
+ JH IY Y i n/a 20 2787 2800 2812 N
+ JH IY Y s n/a 20 2787 2800 2812 N
+ JH IY Z b n/a 20 2787 2800 2813 N
+ JH IY Z e n/a 20 2787 2800 2813 N
+ JH IY Z s n/a 20 2787 2800 2813 N
+ JH IY ZH e n/a 20 2787 2800 2811 N
+ JH IY ZH s n/a 20 2787 2800 2811 N
+ JH JH AA b n/a 20 2791 2794 2802 N
+ JH JH AA e n/a 20 2791 2794 2802 N
+ JH JH AA s n/a 20 2791 2794 2802 N
+ JH JH AE b n/a 20 2791 2794 2805 N
+ JH JH AE e n/a 20 2791 2794 2808 N
+ JH JH AE s n/a 20 2791 2794 2805 N
+ JH JH AH b n/a 20 2791 2794 2802 N
+ JH JH AH e n/a 20 2791 2794 2808 N
+ JH JH AH s n/a 20 2791 2794 2808 N
+ JH JH AO b n/a 20 2791 2794 2804 N
+ JH JH AO e n/a 20 2791 2794 2804 N
+ JH JH AO s n/a 20 2791 2794 2804 N
+ JH JH AW b n/a 20 2791 2794 2806 N
+ JH JH AW e n/a 20 2791 2794 2806 N
+ JH JH AW s n/a 20 2791 2794 2806 N
+ JH JH AY b n/a 20 2791 2794 2802 N
+ JH JH AY e n/a 20 2791 2794 2802 N
+ JH JH AY s n/a 20 2791 2794 2802 N
+ JH JH B e n/a 20 2791 2799 2812 N
+ JH JH B s n/a 20 2791 2799 2812 N
+ JH JH CH e n/a 20 2791 2800 2811 N
+ JH JH CH s n/a 20 2791 2800 2811 N
+ JH JH D e n/a 20 2791 2800 2813 N
+ JH JH D s n/a 20 2791 2800 2813 N
+ JH JH DH e n/a 20 2791 2800 2813 N
+ JH JH DH s n/a 20 2791 2800 2813 N
+ JH JH EH b n/a 20 2791 2794 2805 N
+ JH JH EH e n/a 20 2791 2794 2808 N
+ JH JH EH s n/a 20 2791 2794 2805 N
+ JH JH ER b n/a 20 2791 2794 2810 N
+ JH JH ER e n/a 20 2791 2794 2810 N
+ JH JH ER s n/a 20 2791 2794 2810 N
+ JH JH EY b n/a 20 2791 2794 2805 N
+ JH JH EY e n/a 20 2791 2794 2809 N
+ JH JH EY s n/a 20 2791 2794 2805 N
+ JH JH F b n/a 20 2791 2799 2812 N
+ JH JH F e n/a 20 2791 2799 2812 N
+ JH JH F s n/a 20 2791 2799 2812 N
+ JH JH G e n/a 20 2791 2799 2812 N
+ JH JH G s n/a 20 2791 2799 2812 N
+ JH JH HH e n/a 20 2791 2799 2812 N
+ JH JH HH s n/a 20 2791 2799 2812 N
+ JH JH IH b n/a 20 2791 2794 2803 N
+ JH JH IH e n/a 20 2791 2794 2807 N
+ JH JH IH s n/a 20 2791 2794 2807 N
+ JH JH IY b n/a 20 2791 2794 2809 N
+ JH JH IY e n/a 20 2791 2794 2809 N
+ JH JH IY s n/a 20 2791 2794 2809 N
+ JH JH JH e n/a 20 2791 2800 2811 N
+ JH JH JH s n/a 20 2791 2800 2811 N
+ JH JH K b n/a 20 2791 2799 2812 N
+ JH JH K e n/a 20 2791 2799 2812 N
+ JH JH K s n/a 20 2791 2799 2812 N
+ JH JH L e n/a 20 2791 2799 2812 N
+ JH JH L s n/a 20 2791 2799 2812 N
+ JH JH M e n/a 20 2791 2799 2812 N
+ JH JH M s n/a 20 2791 2799 2812 N
+ JH JH N e n/a 20 2791 2800 2813 N
+ JH JH N s n/a 20 2791 2800 2813 N
+ JH JH NG e n/a 20 2791 2799 2812 N
+ JH JH NG s n/a 20 2791 2799 2812 N
+ JH JH OW b n/a 20 2791 2794 2806 N
+ JH JH OW e n/a 20 2791 2794 2806 N
+ JH JH OW s n/a 20 2791 2794 2806 N
+ JH JH OY b n/a 20 2791 2794 2804 N
+ JH JH OY e n/a 20 2791 2794 2804 N
+ JH JH OY s n/a 20 2791 2794 2804 N
+ JH JH P b n/a 20 2791 2799 2812 N
+ JH JH P e n/a 20 2791 2799 2812 N
+ JH JH P s n/a 20 2791 2799 2812 N
+ JH JH R e n/a 20 2791 2799 2812 N
+ JH JH R s n/a 20 2791 2799 2812 N
+ JH JH S b n/a 20 2791 2800 2813 N
+ JH JH S e n/a 20 2791 2800 2813 N
+ JH JH S s n/a 20 2791 2800 2813 N
+ JH JH SH e n/a 20 2791 2800 2811 N
+ JH JH SH s n/a 20 2791 2800 2811 N
+ JH JH SIL e n/a 20 2791 2801 2811 N
+ JH JH SIL s n/a 20 2791 2801 2811 N
+ JH JH T e n/a 20 2791 2800 2813 N
+ JH JH T s n/a 20 2791 2800 2813 N
+ JH JH TH e n/a 20 2791 2800 2813 N
+ JH JH TH s n/a 20 2791 2800 2813 N
+ JH JH UH b n/a 20 2791 2794 2810 N
+ JH JH UH e n/a 20 2791 2794 2810 N
+ JH JH UH s n/a 20 2791 2794 2810 N
+ JH JH UW b n/a 20 2791 2794 2810 N
+ JH JH UW e n/a 20 2791 2794 2810 N
+ JH JH UW s n/a 20 2791 2794 2810 N
+ JH JH V e n/a 20 2791 2799 2812 N
+ JH JH V s n/a 20 2791 2799 2812 N
+ JH JH W b n/a 20 2791 2799 2812 N
+ JH JH W e n/a 20 2791 2799 2812 N
+ JH JH W s n/a 20 2791 2799 2812 N
+ JH JH Y b n/a 20 2791 2800 2812 N
+ JH JH Y e n/a 20 2791 2800 2812 N
+ JH JH Y s n/a 20 2791 2800 2812 N
+ JH JH Z b n/a 20 2791 2800 2813 N
+ JH JH Z e n/a 20 2791 2800 2813 N
+ JH JH Z s n/a 20 2791 2800 2813 N
+ JH JH ZH e n/a 20 2791 2800 2811 N
+ JH JH ZH s n/a 20 2791 2800 2811 N
+ JH K AA b n/a 20 2791 2794 2802 N
+ JH K AA s n/a 20 2791 2794 2802 N
+ JH K AE b n/a 20 2791 2794 2805 N
+ JH K AE i n/a 20 2791 2794 2805 N
+ JH K AE s n/a 20 2791 2794 2805 N
+ JH K AH b n/a 20 2791 2794 2802 N
+ JH K AH i n/a 20 2791 2794 2807 N
+ JH K AH s n/a 20 2791 2794 2808 N
+ JH K AO b n/a 20 2791 2794 2804 N
+ JH K AO i n/a 20 2791 2794 2804 N
+ JH K AO s n/a 20 2791 2794 2804 N
+ JH K AW b n/a 20 2791 2794 2806 N
+ JH K AW s n/a 20 2791 2794 2806 N
+ JH K AY b n/a 20 2791 2794 2802 N
+ JH K AY s n/a 20 2791 2794 2802 N
+ JH K B s n/a 20 2791 2799 2812 N
+ JH K CH s n/a 20 2791 2800 2811 N
+ JH K D s n/a 20 2791 2800 2813 N
+ JH K DH s n/a 20 2791 2800 2813 N
+ JH K EH b n/a 20 2791 2794 2805 N
+ JH K EH i n/a 20 2791 2794 2805 N
+ JH K EH s n/a 20 2791 2794 2805 N
+ JH K ER b n/a 20 2791 2794 2810 N
+ JH K ER s n/a 20 2791 2794 2810 N
+ JH K EY b n/a 20 2791 2794 2805 N
+ JH K EY i n/a 20 2791 2794 2805 N
+ JH K EY s n/a 20 2791 2794 2805 N
+ JH K F b n/a 20 2791 2799 2812 N
+ JH K F s n/a 20 2791 2799 2812 N
+ JH K G s n/a 20 2791 2799 2812 N
+ JH K HH s n/a 20 2791 2799 2812 N
+ JH K IH b n/a 20 2791 2794 2803 N
+ JH K IH s n/a 20 2791 2794 2807 N
+ JH K IY b n/a 20 2791 2794 2809 N
+ JH K IY i n/a 20 2791 2794 2809 N
+ JH K IY s n/a 20 2791 2794 2809 N
+ JH K JH s n/a 20 2791 2800 2811 N
+ JH K K b n/a 20 2791 2799 2812 N
+ JH K K s n/a 20 2791 2799 2812 N
+ JH K L s n/a 20 2791 2799 2812 N
+ JH K M s n/a 20 2791 2799 2812 N
+ JH K N s n/a 20 2791 2800 2813 N
+ JH K NG s n/a 20 2791 2799 2812 N
+ JH K OW b n/a 20 2791 2794 2806 N
+ JH K OW i n/a 20 2791 2794 2806 N
+ JH K OW s n/a 20 2791 2794 2806 N
+ JH K OY b n/a 20 2791 2794 2804 N
+ JH K OY s n/a 20 2791 2794 2804 N
+ JH K P b n/a 20 2791 2799 2812 N
+ JH K P s n/a 20 2791 2799 2812 N
+ JH K R s n/a 20 2791 2799 2812 N
+ JH K S b n/a 20 2791 2800 2813 N
+ JH K S s n/a 20 2791 2800 2813 N
+ JH K SH s n/a 20 2791 2800 2811 N
+ JH K SIL s n/a 20 2791 2801 2811 N
+ JH K T s n/a 20 2791 2800 2813 N
+ JH K TH s n/a 20 2791 2800 2813 N
+ JH K UH b n/a 20 2791 2794 2810 N
+ JH K UH s n/a 20 2791 2794 2810 N
+ JH K UW b n/a 20 2791 2794 2810 N
+ JH K UW s n/a 20 2791 2794 2810 N
+ JH K V s n/a 20 2791 2799 2812 N
+ JH K W b n/a 20 2791 2799 2812 N
+ JH K W s n/a 20 2791 2799 2812 N
+ JH K Y b n/a 20 2791 2800 2812 N
+ JH K Y s n/a 20 2791 2800 2812 N
+ JH K Z b n/a 20 2791 2800 2813 N
+ JH K Z s n/a 20 2791 2800 2813 N
+ JH K ZH s n/a 20 2791 2800 2811 N
+ JH L AA b n/a 20 2784 2795 2802 N
+ JH L AA e n/a 20 2784 2795 2802 N
+ JH L AA i n/a 20 2784 2795 2802 N
+ JH L AA s n/a 20 2784 2795 2802 N
+ JH L AE b n/a 20 2784 2795 2805 N
+ JH L AE e n/a 20 2784 2797 2808 N
+ JH L AE s n/a 20 2784 2797 2805 N
+ JH L AH b n/a 20 2784 2795 2802 N
+ JH L AH e n/a 20 2784 2797 2808 N
+ JH L AH i n/a 20 2784 2797 2807 N
+ JH L AH s n/a 20 2784 2797 2808 N
+ JH L AO b n/a 20 2784 2795 2804 N
+ JH L AO e n/a 20 2784 2795 2804 N
+ JH L AO i n/a 20 2784 2795 2804 N
+ JH L AO s n/a 20 2784 2795 2804 N
+ JH L AW b n/a 20 2784 2795 2806 N
+ JH L AW e n/a 20 2784 2797 2806 N
+ JH L AW i n/a 20 2784 2797 2806 N
+ JH L AW s n/a 20 2784 2797 2806 N
+ JH L AY b n/a 20 2784 2795 2802 N
+ JH L AY e n/a 20 2784 2795 2802 N
+ JH L AY s n/a 20 2784 2795 2802 N
+ JH L B e n/a 20 2784 2799 2812 N
+ JH L B s n/a 20 2784 2799 2812 N
+ JH L CH e n/a 20 2784 2800 2811 N
+ JH L CH s n/a 20 2784 2800 2811 N
+ JH L D e n/a 20 2784 2800 2813 N
+ JH L D i n/a 20 2784 2800 2813 N
+ JH L D s n/a 20 2784 2800 2813 N
+ JH L DH e n/a 20 2784 2800 2813 N
+ JH L DH s n/a 20 2784 2800 2813 N
+ JH L EH b n/a 20 2784 2795 2805 N
+ JH L EH e n/a 20 2784 2797 2808 N
+ JH L EH i n/a 20 2784 2797 2805 N
+ JH L EH s n/a 20 2784 2797 2805 N
+ JH L ER b n/a 20 2784 2795 2810 N
+ JH L ER e n/a 20 2784 2795 2810 N
+ JH L ER i n/a 20 2784 2795 2810 N
+ JH L ER s n/a 20 2784 2795 2810 N
+ JH L EY b n/a 20 2784 2797 2805 N
+ JH L EY e n/a 20 2784 2797 2809 N
+ JH L EY s n/a 20 2784 2797 2805 N
+ JH L F b n/a 20 2784 2799 2812 N
+ JH L F e n/a 20 2784 2799 2812 N
+ JH L F s n/a 20 2784 2799 2812 N
+ JH L G e n/a 20 2784 2799 2812 N
+ JH L G s n/a 20 2784 2799 2812 N
+ JH L HH e n/a 20 2784 2799 2812 N
+ JH L HH s n/a 20 2784 2799 2812 N
+ JH L IH b n/a 20 2784 2795 2803 N
+ JH L IH e n/a 20 2784 2797 2807 N
+ JH L IH i n/a 20 2784 2797 2807 N
+ JH L IH s n/a 20 2784 2797 2807 N
+ JH L IY b n/a 20 2784 2797 2809 N
+ JH L IY e n/a 20 2784 2797 2809 N
+ JH L IY i n/a 20 2784 2797 2809 N
+ JH L IY s n/a 20 2784 2797 2809 N
+ JH L JH e n/a 20 2784 2800 2811 N
+ JH L JH s n/a 20 2784 2800 2811 N
+ JH L K b n/a 20 2784 2799 2812 N
+ JH L K e n/a 20 2784 2799 2812 N
+ JH L K s n/a 20 2784 2799 2812 N
+ JH L L e n/a 20 2784 2799 2812 N
+ JH L L s n/a 20 2784 2799 2812 N
+ JH L M e n/a 20 2784 2799 2812 N
+ JH L M s n/a 20 2784 2799 2812 N
+ JH L N e n/a 20 2784 2800 2813 N
+ JH L N s n/a 20 2784 2800 2813 N
+ JH L NG e n/a 20 2784 2799 2812 N
+ JH L NG s n/a 20 2784 2799 2812 N
+ JH L OW b n/a 20 2784 2795 2806 N
+ JH L OW e n/a 20 2784 2795 2806 N
+ JH L OW i n/a 20 2784 2795 2806 N
+ JH L OW s n/a 20 2784 2795 2806 N
+ JH L OY b n/a 20 2784 2795 2804 N
+ JH L OY e n/a 20 2784 2795 2804 N
+ JH L OY i n/a 20 2784 2795 2804 N
+ JH L OY s n/a 20 2784 2795 2804 N
+ JH L P b n/a 20 2784 2799 2812 N
+ JH L P e n/a 20 2784 2799 2812 N
+ JH L P s n/a 20 2784 2799 2812 N
+ JH L R e n/a 20 2784 2799 2812 N
+ JH L R s n/a 20 2784 2799 2812 N
+ JH L S b n/a 20 2784 2800 2813 N
+ JH L S e n/a 20 2784 2800 2813 N
+ JH L S s n/a 20 2784 2800 2813 N
+ JH L SH e n/a 20 2784 2800 2811 N
+ JH L SH s n/a 20 2784 2800 2811 N
+ JH L SIL e n/a 20 2784 2801 2811 N
+ JH L SIL s n/a 20 2784 2801 2811 N
+ JH L T e n/a 20 2784 2800 2813 N
+ JH L T s n/a 20 2784 2800 2813 N
+ JH L TH e n/a 20 2784 2800 2813 N
+ JH L TH s n/a 20 2784 2800 2813 N
+ JH L UH b n/a 20 2784 2795 2810 N
+ JH L UH e n/a 20 2784 2795 2810 N
+ JH L UH s n/a 20 2784 2795 2810 N
+ JH L UW b n/a 20 2784 2795 2810 N
+ JH L UW e n/a 20 2784 2795 2810 N
+ JH L UW i n/a 20 2784 2795 2810 N
+ JH L UW s n/a 20 2784 2795 2810 N
+ JH L V e n/a 20 2784 2799 2812 N
+ JH L V s n/a 20 2784 2799 2812 N
+ JH L W b n/a 20 2784 2799 2812 N
+ JH L W e n/a 20 2784 2799 2812 N
+ JH L W s n/a 20 2784 2799 2812 N
+ JH L Y b n/a 20 2784 2800 2812 N
+ JH L Y e n/a 20 2784 2800 2812 N
+ JH L Y s n/a 20 2784 2800 2812 N
+ JH L Z b n/a 20 2784 2800 2813 N
+ JH L Z e n/a 20 2784 2800 2813 N
+ JH L Z s n/a 20 2784 2800 2813 N
+ JH L ZH e n/a 20 2784 2800 2811 N
+ JH L ZH s n/a 20 2784 2800 2811 N
+ JH M AA b n/a 20 2793 2795 2802 N
+ JH M AA e n/a 20 2793 2795 2802 N
+ JH M AA s n/a 20 2793 2795 2802 N
+ JH M AE b n/a 20 2793 2795 2805 N
+ JH M AE e n/a 20 2793 2795 2808 N
+ JH M AE i n/a 20 2793 2795 2805 N
+ JH M AE s n/a 20 2793 2795 2805 N
+ JH M AH b n/a 20 2793 2795 2802 N
+ JH M AH e n/a 20 2793 2795 2808 N
+ JH M AH s n/a 20 2793 2795 2808 N
+ JH M AO b n/a 20 2793 2795 2804 N
+ JH M AO e n/a 20 2793 2795 2804 N
+ JH M AO s n/a 20 2793 2795 2804 N
+ JH M AW b n/a 20 2793 2795 2806 N
+ JH M AW e n/a 20 2793 2795 2806 N
+ JH M AW s n/a 20 2793 2795 2806 N
+ JH M AY b n/a 20 2793 2795 2802 N
+ JH M AY e n/a 20 2793 2795 2802 N
+ JH M AY s n/a 20 2793 2795 2802 N
+ JH M B e n/a 20 2793 2799 2812 N
+ JH M B s n/a 20 2793 2799 2812 N
+ JH M CH e n/a 20 2793 2799 2811 N
+ JH M CH s n/a 20 2793 2799 2811 N
+ JH M D e n/a 20 2793 2800 2813 N
+ JH M D s n/a 20 2793 2800 2813 N
+ JH M DH e n/a 20 2793 2800 2813 N
+ JH M DH s n/a 20 2793 2800 2813 N
+ JH M EH b n/a 20 2793 2795 2805 N
+ JH M EH e n/a 20 2793 2795 2808 N
+ JH M EH i n/a 20 2793 2795 2805 N
+ JH M EH s n/a 20 2793 2795 2805 N
+ JH M ER b n/a 20 2793 2795 2810 N
+ JH M ER e n/a 20 2793 2795 2810 N
+ JH M ER s n/a 20 2793 2795 2810 N
+ JH M EY b n/a 20 2793 2795 2805 N
+ JH M EY e n/a 20 2793 2795 2809 N
+ JH M EY i n/a 20 2793 2795 2805 N
+ JH M EY s n/a 20 2793 2795 2805 N
+ JH M F b n/a 20 2793 2799 2812 N
+ JH M F e n/a 20 2793 2799 2812 N
+ JH M F s n/a 20 2793 2799 2812 N
+ JH M G e n/a 20 2793 2799 2812 N
+ JH M G s n/a 20 2793 2799 2812 N
+ JH M HH e n/a 20 2793 2799 2812 N
+ JH M HH s n/a 20 2793 2799 2812 N
+ JH M IH b n/a 20 2793 2795 2803 N
+ JH M IH e n/a 20 2793 2795 2807 N
+ JH M IH s n/a 20 2793 2795 2807 N
+ JH M IY b n/a 20 2793 2795 2809 N
+ JH M IY e n/a 20 2793 2795 2809 N
+ JH M IY s n/a 20 2793 2795 2809 N
+ JH M JH e n/a 20 2793 2799 2811 N
+ JH M JH s n/a 20 2793 2799 2811 N
+ JH M K b n/a 20 2793 2799 2812 N
+ JH M K e n/a 20 2793 2799 2812 N
+ JH M K s n/a 20 2793 2799 2812 N
+ JH M L e n/a 20 2793 2799 2812 N
+ JH M L s n/a 20 2793 2799 2812 N
+ JH M M e n/a 20 2793 2799 2812 N
+ JH M M s n/a 20 2793 2799 2812 N
+ JH M N e n/a 20 2793 2800 2813 N
+ JH M N s n/a 20 2793 2800 2813 N
+ JH M NG e n/a 20 2793 2799 2812 N
+ JH M NG s n/a 20 2793 2799 2812 N
+ JH M OW b n/a 20 2793 2795 2806 N
+ JH M OW e n/a 20 2793 2795 2806 N
+ JH M OW s n/a 20 2793 2795 2806 N
+ JH M OY b n/a 20 2793 2795 2804 N
+ JH M OY e n/a 20 2793 2795 2804 N
+ JH M OY s n/a 20 2793 2795 2804 N
+ JH M P b n/a 20 2793 2799 2812 N
+ JH M P e n/a 20 2793 2799 2812 N
+ JH M P s n/a 20 2793 2799 2812 N
+ JH M R e n/a 20 2793 2799 2812 N
+ JH M R s n/a 20 2793 2799 2812 N
+ JH M S b n/a 20 2793 2800 2813 N
+ JH M S e n/a 20 2793 2800 2813 N
+ JH M S s n/a 20 2793 2800 2813 N
+ JH M SH e n/a 20 2793 2799 2811 N
+ JH M SH s n/a 20 2793 2799 2811 N
+ JH M SIL e n/a 20 2793 2801 2811 N
+ JH M SIL s n/a 20 2793 2801 2811 N
+ JH M T e n/a 20 2793 2800 2813 N
+ JH M T s n/a 20 2793 2800 2813 N
+ JH M TH e n/a 20 2793 2800 2813 N
+ JH M TH s n/a 20 2793 2800 2813 N
+ JH M UH b n/a 20 2793 2795 2810 N
+ JH M UH e n/a 20 2793 2795 2810 N
+ JH M UH s n/a 20 2793 2795 2810 N
+ JH M UW b n/a 20 2793 2795 2810 N
+ JH M UW e n/a 20 2793 2795 2810 N
+ JH M UW i n/a 20 2793 2795 2810 N
+ JH M UW s n/a 20 2793 2795 2810 N
+ JH M V e n/a 20 2793 2799 2812 N
+ JH M V s n/a 20 2793 2799 2812 N
+ JH M W b n/a 20 2793 2799 2812 N
+ JH M W e n/a 20 2793 2799 2812 N
+ JH M W s n/a 20 2793 2799 2812 N
+ JH M Y b n/a 20 2793 2799 2812 N
+ JH M Y e n/a 20 2793 2799 2812 N
+ JH M Y s n/a 20 2793 2799 2812 N
+ JH M Z b n/a 20 2793 2800 2813 N
+ JH M Z e n/a 20 2793 2800 2813 N
+ JH M Z i n/a 20 2793 2800 2813 N
+ JH M Z s n/a 20 2793 2800 2813 N
+ JH M ZH e n/a 20 2793 2799 2811 N
+ JH M ZH s n/a 20 2793 2799 2811 N
+ JH N AA b n/a 20 2793 2796 2802 N
+ JH N AA e n/a 20 2793 2796 2802 N
+ JH N AA i n/a 20 2793 2796 2802 N
+ JH N AA s n/a 20 2793 2796 2802 N
+ JH N AE b n/a 20 2793 2796 2805 N
+ JH N AE e n/a 20 2793 2796 2808 N
+ JH N AE i n/a 20 2793 2796 2805 N
+ JH N AE s n/a 20 2793 2796 2805 N
+ JH N AH b n/a 20 2793 2796 2802 N
+ JH N AH e n/a 20 2793 2796 2808 N
+ JH N AH i n/a 20 2793 2796 2808 N
+ JH N AH s n/a 20 2793 2796 2808 N
+ JH N AO b n/a 20 2793 2796 2804 N
+ JH N AO e n/a 20 2793 2796 2804 N
+ JH N AO i n/a 20 2793 2796 2804 N
+ JH N AO s n/a 20 2793 2796 2804 N
+ JH N AW b n/a 20 2793 2796 2806 N
+ JH N AW e n/a 20 2793 2796 2806 N
+ JH N AW s n/a 20 2793 2796 2806 N
+ JH N AY b n/a 20 2793 2796 2802 N
+ JH N AY e n/a 20 2793 2796 2802 N
+ JH N AY i n/a 20 2793 2796 2802 N
+ JH N AY s n/a 20 2793 2796 2802 N
+ JH N B e n/a 20 2793 2799 2812 N
+ JH N B i n/a 20 2793 2799 2812 N
+ JH N B s n/a 20 2793 2799 2812 N
+ JH N CH e n/a 20 2793 2799 2811 N
+ JH N CH s n/a 20 2793 2799 2811 N
+ JH N D e n/a 20 2793 2800 2813 N
+ JH N D i n/a 20 2793 2800 2813 N
+ JH N D s n/a 20 2793 2800 2813 N
+ JH N DH e n/a 20 2793 2800 2813 N
+ JH N DH s n/a 20 2793 2800 2813 N
+ JH N EH b n/a 20 2793 2796 2805 N
+ JH N EH e n/a 20 2793 2796 2808 N
+ JH N EH i n/a 20 2793 2796 2805 N
+ JH N EH s n/a 20 2793 2796 2805 N
+ JH N ER b n/a 20 2793 2796 2810 N
+ JH N ER e n/a 20 2793 2796 2810 N
+ JH N ER i n/a 20 2793 2796 2810 N
+ JH N ER s n/a 20 2793 2796 2810 N
+ JH N EY b n/a 20 2793 2796 2805 N
+ JH N EY e n/a 20 2793 2796 2809 N
+ JH N EY i n/a 20 2793 2796 2805 N
+ JH N EY s n/a 20 2793 2796 2805 N
+ JH N F b n/a 20 2793 2799 2812 N
+ JH N F e n/a 20 2793 2799 2812 N
+ JH N F i n/a 20 2793 2799 2812 N
+ JH N F s n/a 20 2793 2799 2812 N
+ JH N G e n/a 20 2793 2799 2812 N
+ JH N G i n/a 20 2793 2799 2812 N
+ JH N G s n/a 20 2793 2799 2812 N
+ JH N HH e n/a 20 2793 2799 2812 N
+ JH N HH s n/a 20 2793 2799 2812 N
+ JH N IH b n/a 20 2793 2796 2803 N
+ JH N IH e n/a 20 2793 2796 2807 N
+ JH N IH i n/a 20 2793 2796 2807 N
+ JH N IH s n/a 20 2793 2796 2807 N
+ JH N IY b n/a 20 2793 2796 2809 N
+ JH N IY e n/a 20 2793 2796 2809 N
+ JH N IY i n/a 20 2793 2796 2809 N
+ JH N IY s n/a 20 2793 2796 2809 N
+ JH N JH e n/a 20 2793 2799 2811 N
+ JH N JH s n/a 20 2793 2799 2811 N
+ JH N K b n/a 20 2793 2799 2812 N
+ JH N K e n/a 20 2793 2799 2812 N
+ JH N K s n/a 20 2793 2799 2812 N
+ JH N L e n/a 20 2793 2799 2812 N
+ JH N L i n/a 20 2793 2799 2812 N
+ JH N L s n/a 20 2793 2799 2812 N
+ JH N M e n/a 20 2793 2799 2812 N
+ JH N M i n/a 20 2793 2799 2812 N
+ JH N M s n/a 20 2793 2799 2812 N
+ JH N N e n/a 20 2793 2800 2813 N
+ JH N N i n/a 20 2793 2800 2813 N
+ JH N N s n/a 20 2793 2800 2813 N
+ JH N NG e n/a 20 2793 2799 2812 N
+ JH N NG s n/a 20 2793 2799 2812 N
+ JH N OW b n/a 20 2793 2796 2806 N
+ JH N OW e n/a 20 2793 2796 2806 N
+ JH N OW i n/a 20 2793 2796 2806 N
+ JH N OW s n/a 20 2793 2796 2806 N
+ JH N OY b n/a 20 2793 2796 2804 N
+ JH N OY e n/a 20 2793 2796 2804 N
+ JH N OY i n/a 20 2793 2796 2804 N
+ JH N OY s n/a 20 2793 2796 2804 N
+ JH N P b n/a 20 2793 2799 2812 N
+ JH N P e n/a 20 2793 2799 2812 N
+ JH N P s n/a 20 2793 2799 2812 N
+ JH N R e n/a 20 2793 2799 2812 N
+ JH N R i n/a 20 2793 2799 2812 N
+ JH N R s n/a 20 2793 2799 2812 N
+ JH N S b n/a 20 2793 2800 2813 N
+ JH N S e n/a 20 2793 2800 2813 N
+ JH N S s n/a 20 2793 2800 2813 N
+ JH N SH e n/a 20 2793 2799 2811 N
+ JH N SH s n/a 20 2793 2799 2811 N
+ JH N SIL e n/a 20 2793 2801 2811 N
+ JH N SIL s n/a 20 2793 2801 2811 N
+ JH N T e n/a 20 2793 2800 2813 N
+ JH N T s n/a 20 2793 2800 2813 N
+ JH N TH e n/a 20 2793 2800 2813 N
+ JH N TH s n/a 20 2793 2800 2813 N
+ JH N UH b n/a 20 2793 2796 2810 N
+ JH N UH e n/a 20 2793 2796 2810 N
+ JH N UH i n/a 20 2793 2796 2810 N
+ JH N UH s n/a 20 2793 2796 2810 N
+ JH N UW b n/a 20 2793 2796 2810 N
+ JH N UW e n/a 20 2793 2796 2810 N
+ JH N UW i n/a 20 2793 2796 2810 N
+ JH N UW s n/a 20 2793 2796 2810 N
+ JH N V e n/a 20 2793 2799 2812 N
+ JH N V i n/a 20 2793 2799 2812 N
+ JH N V s n/a 20 2793 2799 2812 N
+ JH N W b n/a 20 2793 2799 2812 N
+ JH N W e n/a 20 2793 2799 2812 N
+ JH N W s n/a 20 2793 2799 2812 N
+ JH N Y b n/a 20 2793 2799 2812 N
+ JH N Y e n/a 20 2793 2799 2812 N
+ JH N Y i n/a 20 2793 2799 2812 N
+ JH N Y s n/a 20 2793 2799 2812 N
+ JH N Z b n/a 20 2793 2800 2813 N
+ JH N Z e n/a 20 2793 2800 2813 N
+ JH N Z s n/a 20 2793 2800 2813 N
+ JH N ZH e n/a 20 2793 2799 2811 N
+ JH N ZH s n/a 20 2793 2799 2811 N
+ JH NG AA b n/a 20 2793 2795 2802 N
+ JH NG AA s n/a 20 2793 2795 2802 N
+ JH NG AE b n/a 20 2793 2795 2805 N
+ JH NG AE s n/a 20 2793 2795 2805 N
+ JH NG AH b n/a 20 2793 2795 2802 N
+ JH NG AH s n/a 20 2793 2795 2808 N
+ JH NG AO b n/a 20 2793 2795 2804 N
+ JH NG AO s n/a 20 2793 2795 2804 N
+ JH NG AW b n/a 20 2793 2795 2806 N
+ JH NG AW s n/a 20 2793 2795 2806 N
+ JH NG AY b n/a 20 2793 2795 2802 N
+ JH NG AY s n/a 20 2793 2795 2802 N
+ JH NG B s n/a 20 2793 2799 2812 N
+ JH NG CH s n/a 20 2793 2799 2811 N
+ JH NG D s n/a 20 2793 2800 2813 N
+ JH NG DH s n/a 20 2793 2800 2813 N
+ JH NG EH b n/a 20 2793 2795 2805 N
+ JH NG EH i n/a 20 2793 2795 2805 N
+ JH NG EH s n/a 20 2793 2795 2805 N
+ JH NG ER b n/a 20 2793 2795 2810 N
+ JH NG ER i n/a 20 2793 2795 2810 N
+ JH NG ER s n/a 20 2793 2795 2810 N
+ JH NG EY b n/a 20 2793 2795 2805 N
+ JH NG EY s n/a 20 2793 2795 2805 N
+ JH NG F b n/a 20 2793 2799 2812 N
+ JH NG F s n/a 20 2793 2799 2812 N
+ JH NG G s n/a 20 2793 2799 2812 N
+ JH NG HH s n/a 20 2793 2799 2812 N
+ JH NG IH b n/a 20 2793 2795 2803 N
+ JH NG IH i n/a 20 2793 2795 2807 N
+ JH NG IH s n/a 20 2793 2795 2807 N
+ JH NG IY b n/a 20 2793 2795 2809 N
+ JH NG IY i n/a 20 2793 2795 2809 N
+ JH NG IY s n/a 20 2793 2795 2809 N
+ JH NG JH s n/a 20 2793 2799 2811 N
+ JH NG K b n/a 20 2793 2799 2812 N
+ JH NG K s n/a 20 2793 2799 2812 N
+ JH NG L s n/a 20 2793 2799 2812 N
+ JH NG M s n/a 20 2793 2799 2812 N
+ JH NG N s n/a 20 2793 2800 2813 N
+ JH NG NG s n/a 20 2793 2799 2812 N
+ JH NG OW b n/a 20 2793 2795 2806 N
+ JH NG OW i n/a 20 2793 2795 2806 N
+ JH NG OW s n/a 20 2793 2795 2806 N
+ JH NG OY b n/a 20 2793 2795 2804 N
+ JH NG OY s n/a 20 2793 2795 2804 N
+ JH NG P b n/a 20 2793 2799 2812 N
+ JH NG P s n/a 20 2793 2799 2812 N
+ JH NG R s n/a 20 2793 2799 2812 N
+ JH NG S b n/a 20 2793 2800 2813 N
+ JH NG S s n/a 20 2793 2800 2813 N
+ JH NG SH s n/a 20 2793 2799 2811 N
+ JH NG SIL s n/a 20 2793 2801 2811 N
+ JH NG T s n/a 20 2793 2800 2813 N
+ JH NG TH s n/a 20 2793 2800 2813 N
+ JH NG UH b n/a 20 2793 2795 2810 N
+ JH NG UH s n/a 20 2793 2795 2810 N
+ JH NG UW b n/a 20 2793 2795 2810 N
+ JH NG UW i n/a 20 2793 2795 2810 N
+ JH NG UW s n/a 20 2793 2795 2810 N
+ JH NG V s n/a 20 2793 2799 2812 N
+ JH NG W b n/a 20 2793 2799 2812 N
+ JH NG W s n/a 20 2793 2799 2812 N
+ JH NG Y b n/a 20 2793 2799 2812 N
+ JH NG Y s n/a 20 2793 2799 2812 N
+ JH NG Z b n/a 20 2793 2800 2813 N
+ JH NG Z s n/a 20 2793 2800 2813 N
+ JH NG ZH s n/a 20 2793 2799 2811 N
+ JH OW AA b n/a 20 2786 2795 2802 N
+ JH OW AA e n/a 20 2785 2795 2802 N
+ JH OW AA i n/a 20 2785 2795 2802 N
+ JH OW AA s n/a 20 2785 2795 2802 N
+ JH OW AE b n/a 20 2786 2795 2805 N
+ JH OW AE e n/a 20 2786 2797 2808 N
+ JH OW AE i n/a 20 2786 2797 2805 N
+ JH OW AE s n/a 20 2786 2797 2805 N
+ JH OW AH b n/a 20 2786 2795 2802 N
+ JH OW AH e n/a 20 2785 2797 2808 N
+ JH OW AH i n/a 20 2785 2797 2807 N
+ JH OW AH s n/a 20 2785 2797 2808 N
+ JH OW AO b n/a 20 2786 2795 2804 N
+ JH OW AO e n/a 20 2785 2795 2804 N
+ JH OW AO s n/a 20 2785 2795 2804 N
+ JH OW AW b n/a 20 2786 2795 2806 N
+ JH OW AW e n/a 20 2785 2797 2806 N
+ JH OW AW s n/a 20 2785 2797 2806 N
+ JH OW AY b n/a 20 2786 2795 2802 N
+ JH OW AY e n/a 20 2786 2795 2802 N
+ JH OW AY s n/a 20 2786 2795 2802 N
+ JH OW B e n/a 20 2785 2799 2812 N
+ JH OW B s n/a 20 2785 2799 2812 N
+ JH OW CH e n/a 20 2785 2800 2811 N
+ JH OW CH s n/a 20 2785 2800 2811 N
+ JH OW D e n/a 20 2785 2800 2813 N
+ JH OW D s n/a 20 2785 2800 2813 N
+ JH OW DH e n/a 20 2785 2800 2813 N
+ JH OW DH s n/a 20 2785 2800 2813 N
+ JH OW EH b n/a 20 2786 2795 2805 N
+ JH OW EH e n/a 20 2786 2797 2808 N
+ JH OW EH i n/a 20 2786 2797 2805 N
+ JH OW EH s n/a 20 2786 2797 2805 N
+ JH OW ER b n/a 20 2786 2795 2810 N
+ JH OW ER e n/a 20 2785 2795 2810 N
+ JH OW ER i n/a 20 2785 2795 2810 N
+ JH OW ER s n/a 20 2785 2795 2810 N
+ JH OW EY b n/a 20 2786 2797 2805 N
+ JH OW EY e n/a 20 2784 2797 2809 N
+ JH OW EY i n/a 20 2784 2797 2805 N
+ JH OW EY s n/a 20 2784 2797 2805 N
+ JH OW F b n/a 20 2786 2799 2812 N
+ JH OW F e n/a 20 2785 2799 2812 N
+ JH OW F s n/a 20 2785 2799 2812 N
+ JH OW G e n/a 20 2785 2799 2812 N
+ JH OW G s n/a 20 2785 2799 2812 N
+ JH OW HH e n/a 20 2785 2799 2812 N
+ JH OW HH s n/a 20 2785 2799 2812 N
+ JH OW IH b n/a 20 2786 2795 2803 N
+ JH OW IH e n/a 20 2785 2797 2807 N
+ JH OW IH i n/a 20 2785 2797 2807 N
+ JH OW IH s n/a 20 2785 2797 2807 N
+ JH OW IY b n/a 20 2786 2797 2809 N
+ JH OW IY e n/a 20 2784 2797 2809 N
+ JH OW IY i n/a 20 2784 2797 2809 N
+ JH OW IY s n/a 20 2784 2797 2809 N
+ JH OW JH e n/a 20 2785 2800 2811 N
+ JH OW JH s n/a 20 2785 2800 2811 N
+ JH OW K b n/a 20 2786 2799 2812 N
+ JH OW K e n/a 20 2785 2799 2812 N
+ JH OW K s n/a 20 2785 2799 2812 N
+ JH OW L e n/a 20 2785 2799 2812 N
+ JH OW L s n/a 20 2785 2799 2812 N
+ JH OW M e n/a 20 2785 2799 2812 N
+ JH OW M s n/a 20 2785 2799 2812 N
+ JH OW N e n/a 20 2785 2800 2813 N
+ JH OW N s n/a 20 2785 2800 2813 N
+ JH OW NG e n/a 20 2785 2799 2812 N
+ JH OW NG s n/a 20 2785 2799 2812 N
+ JH OW OW b n/a 20 2786 2795 2806 N
+ JH OW OW e n/a 20 2785 2795 2806 N
+ JH OW OW i n/a 20 2785 2795 2806 N
+ JH OW OW s n/a 20 2785 2795 2806 N
+ JH OW OY b n/a 20 2786 2795 2804 N
+ JH OW OY e n/a 20 2786 2795 2804 N
+ JH OW OY s n/a 20 2786 2795 2804 N
+ JH OW P b n/a 20 2786 2799 2812 N
+ JH OW P e n/a 20 2785 2799 2812 N
+ JH OW P s n/a 20 2785 2799 2812 N
+ JH OW R e n/a 20 2785 2799 2812 N
+ JH OW R s n/a 20 2785 2799 2812 N
+ JH OW S b n/a 20 2786 2800 2813 N
+ JH OW S e n/a 20 2785 2800 2813 N
+ JH OW S s n/a 20 2785 2800 2813 N
+ JH OW SH e n/a 20 2785 2800 2811 N
+ JH OW SH s n/a 20 2785 2800 2811 N
+ JH OW SIL e n/a 20 2786 2801 2811 N
+ JH OW SIL s n/a 20 2786 2801 2811 N
+ JH OW T e n/a 20 2785 2800 2813 N
+ JH OW T s n/a 20 2785 2800 2813 N
+ JH OW TH e n/a 20 2785 2800 2813 N
+ JH OW TH s n/a 20 2785 2800 2813 N
+ JH OW UH b n/a 20 2786 2795 2810 N
+ JH OW UH e n/a 20 2785 2795 2810 N
+ JH OW UH s n/a 20 2785 2795 2810 N
+ JH OW UW b n/a 20 2786 2795 2810 N
+ JH OW UW e n/a 20 2785 2795 2810 N
+ JH OW UW i n/a 20 2785 2795 2810 N
+ JH OW UW s n/a 20 2785 2795 2810 N
+ JH OW V e n/a 20 2785 2799 2812 N
+ JH OW V s n/a 20 2785 2799 2812 N
+ JH OW W b n/a 20 2786 2799 2812 N
+ JH OW W e n/a 20 2785 2799 2812 N
+ JH OW W i n/a 20 2785 2799 2812 N
+ JH OW W s n/a 20 2785 2799 2812 N
+ JH OW Y b n/a 20 2786 2800 2812 N
+ JH OW Y e n/a 20 2786 2800 2812 N
+ JH OW Y i n/a 20 2786 2800 2812 N
+ JH OW Y s n/a 20 2786 2800 2812 N
+ JH OW Z b n/a 20 2786 2800 2813 N
+ JH OW Z e n/a 20 2785 2800 2813 N
+ JH OW Z s n/a 20 2785 2800 2813 N
+ JH OW ZH e n/a 20 2785 2800 2811 N
+ JH OW ZH s n/a 20 2785 2800 2811 N
+ JH OY AA b n/a 20 2786 2795 2802 N
+ JH OY AA e n/a 20 2785 2795 2802 N
+ JH OY AA s n/a 20 2785 2795 2802 N
+ JH OY AE b n/a 20 2786 2798 2805 N
+ JH OY AE e n/a 20 2786 2798 2808 N
+ JH OY AE s n/a 20 2786 2798 2805 N
+ JH OY AH b n/a 20 2786 2798 2802 N
+ JH OY AH e n/a 20 2785 2798 2808 N
+ JH OY AH s n/a 20 2785 2798 2808 N
+ JH OY AO b n/a 20 2786 2795 2804 N
+ JH OY AO e n/a 20 2785 2795 2804 N
+ JH OY AO s n/a 20 2785 2795 2804 N
+ JH OY AW b n/a 20 2786 2798 2806 N
+ JH OY AW e n/a 20 2785 2798 2806 N
+ JH OY AW s n/a 20 2785 2798 2806 N
+ JH OY AY b n/a 20 2786 2795 2802 N
+ JH OY AY e n/a 20 2786 2795 2802 N
+ JH OY AY s n/a 20 2786 2795 2802 N
+ JH OY B e n/a 20 2785 2799 2812 N
+ JH OY B s n/a 20 2785 2799 2812 N
+ JH OY CH e n/a 20 2785 2800 2811 N
+ JH OY CH s n/a 20 2785 2800 2811 N
+ JH OY D e n/a 20 2785 2800 2813 N
+ JH OY D s n/a 20 2785 2800 2813 N
+ JH OY DH e n/a 20 2785 2800 2813 N
+ JH OY DH s n/a 20 2785 2800 2813 N
+ JH OY EH b n/a 20 2786 2798 2805 N
+ JH OY EH e n/a 20 2786 2798 2808 N
+ JH OY EH s n/a 20 2786 2798 2805 N
+ JH OY ER b n/a 20 2786 2795 2810 N
+ JH OY ER e n/a 20 2785 2795 2810 N
+ JH OY ER s n/a 20 2785 2795 2810 N
+ JH OY EY b n/a 20 2786 2797 2805 N
+ JH OY EY e n/a 20 2784 2797 2809 N
+ JH OY EY s n/a 20 2784 2797 2805 N
+ JH OY F b n/a 20 2786 2799 2812 N
+ JH OY F e n/a 20 2785 2799 2812 N
+ JH OY F s n/a 20 2785 2799 2812 N
+ JH OY G e n/a 20 2785 2799 2812 N
+ JH OY G s n/a 20 2785 2799 2812 N
+ JH OY HH e n/a 20 2785 2799 2812 N
+ JH OY HH s n/a 20 2785 2799 2812 N
+ JH OY IH b n/a 20 2786 2798 2803 N
+ JH OY IH e n/a 20 2785 2798 2807 N
+ JH OY IH s n/a 20 2785 2798 2807 N
+ JH OY IY b n/a 20 2786 2797 2809 N
+ JH OY IY e n/a 20 2784 2797 2809 N
+ JH OY IY s n/a 20 2784 2797 2809 N
+ JH OY JH e n/a 20 2785 2800 2811 N
+ JH OY JH s n/a 20 2785 2800 2811 N
+ JH OY K b n/a 20 2786 2799 2812 N
+ JH OY K e n/a 20 2785 2799 2812 N
+ JH OY K s n/a 20 2785 2799 2812 N
+ JH OY L e n/a 20 2785 2799 2812 N
+ JH OY L s n/a 20 2785 2799 2812 N
+ JH OY M e n/a 20 2785 2799 2812 N
+ JH OY M s n/a 20 2785 2799 2812 N
+ JH OY N e n/a 20 2785 2800 2813 N
+ JH OY N s n/a 20 2785 2800 2813 N
+ JH OY NG e n/a 20 2785 2799 2812 N
+ JH OY NG s n/a 20 2785 2799 2812 N
+ JH OY OW b n/a 20 2786 2795 2806 N
+ JH OY OW e n/a 20 2785 2795 2806 N
+ JH OY OW s n/a 20 2785 2795 2806 N
+ JH OY OY b n/a 20 2786 2795 2804 N
+ JH OY OY e n/a 20 2786 2795 2804 N
+ JH OY OY s n/a 20 2786 2795 2804 N
+ JH OY P b n/a 20 2786 2799 2812 N
+ JH OY P e n/a 20 2785 2799 2812 N
+ JH OY P s n/a 20 2785 2799 2812 N
+ JH OY R e n/a 20 2785 2799 2812 N
+ JH OY R s n/a 20 2785 2799 2812 N
+ JH OY S b n/a 20 2786 2800 2813 N
+ JH OY S e n/a 20 2785 2800 2813 N
+ JH OY S s n/a 20 2785 2800 2813 N
+ JH OY SH e n/a 20 2785 2800 2811 N
+ JH OY SH s n/a 20 2785 2800 2811 N
+ JH OY SIL e n/a 20 2786 2801 2811 N
+ JH OY SIL s n/a 20 2786 2801 2811 N
+ JH OY T e n/a 20 2785 2800 2813 N
+ JH OY T s n/a 20 2785 2800 2813 N
+ JH OY TH e n/a 20 2785 2800 2813 N
+ JH OY TH s n/a 20 2785 2800 2813 N
+ JH OY UH b n/a 20 2786 2795 2810 N
+ JH OY UH e n/a 20 2785 2795 2810 N
+ JH OY UH s n/a 20 2785 2795 2810 N
+ JH OY UW b n/a 20 2786 2795 2810 N
+ JH OY UW e n/a 20 2785 2795 2810 N
+ JH OY UW s n/a 20 2785 2795 2810 N
+ JH OY V e n/a 20 2785 2799 2812 N
+ JH OY V s n/a 20 2785 2799 2812 N
+ JH OY W b n/a 20 2786 2799 2812 N
+ JH OY W e n/a 20 2785 2799 2812 N
+ JH OY W s n/a 20 2785 2799 2812 N
+ JH OY Y b n/a 20 2786 2800 2812 N
+ JH OY Y e n/a 20 2786 2800 2812 N
+ JH OY Y s n/a 20 2786 2800 2812 N
+ JH OY Z b n/a 20 2786 2800 2813 N
+ JH OY Z e n/a 20 2785 2800 2813 N
+ JH OY Z s n/a 20 2785 2800 2813 N
+ JH OY ZH e n/a 20 2785 2800 2811 N
+ JH OY ZH s n/a 20 2785 2800 2811 N
+ JH P AA b n/a 20 2792 2794 2802 N
+ JH P AA i n/a 20 2792 2794 2802 N
+ JH P AA s n/a 20 2792 2794 2802 N
+ JH P AE b n/a 20 2792 2794 2805 N
+ JH P AE i n/a 20 2792 2794 2805 N
+ JH P AE s n/a 20 2792 2794 2805 N
+ JH P AH b n/a 20 2792 2794 2802 N
+ JH P AH s n/a 20 2792 2794 2808 N
+ JH P AO b n/a 20 2792 2794 2804 N
+ JH P AO s n/a 20 2792 2794 2804 N
+ JH P AW b n/a 20 2792 2794 2806 N
+ JH P AW s n/a 20 2792 2794 2806 N
+ JH P AY b n/a 20 2792 2794 2802 N
+ JH P AY s n/a 20 2792 2794 2802 N
+ JH P B s n/a 20 2792 2799 2812 N
+ JH P CH s n/a 20 2792 2800 2811 N
+ JH P D s n/a 20 2792 2800 2813 N
+ JH P DH s n/a 20 2792 2800 2813 N
+ JH P EH b n/a 20 2792 2794 2805 N
+ JH P EH s n/a 20 2792 2794 2805 N
+ JH P ER b n/a 20 2792 2794 2810 N
+ JH P ER s n/a 20 2792 2794 2810 N
+ JH P EY b n/a 20 2792 2794 2805 N
+ JH P EY s n/a 20 2792 2794 2805 N
+ JH P F b n/a 20 2792 2799 2812 N
+ JH P F s n/a 20 2792 2799 2812 N
+ JH P G s n/a 20 2792 2799 2812 N
+ JH P HH s n/a 20 2792 2799 2812 N
+ JH P IH b n/a 20 2792 2794 2803 N
+ JH P IH s n/a 20 2792 2794 2807 N
+ JH P IY b n/a 20 2792 2794 2809 N
+ JH P IY i n/a 20 2792 2794 2809 N
+ JH P IY s n/a 20 2792 2794 2809 N
+ JH P JH s n/a 20 2792 2800 2811 N
+ JH P K b n/a 20 2792 2799 2812 N
+ JH P K s n/a 20 2792 2799 2812 N
+ JH P L s n/a 20 2792 2799 2812 N
+ JH P M s n/a 20 2792 2799 2812 N
+ JH P N s n/a 20 2792 2800 2813 N
+ JH P NG s n/a 20 2792 2799 2812 N
+ JH P OW b n/a 20 2792 2794 2806 N
+ JH P OW s n/a 20 2792 2794 2806 N
+ JH P OY b n/a 20 2792 2794 2804 N
+ JH P OY i n/a 20 2792 2794 2804 N
+ JH P OY s n/a 20 2792 2794 2804 N
+ JH P P b n/a 20 2792 2799 2812 N
+ JH P P s n/a 20 2792 2799 2812 N
+ JH P R s n/a 20 2792 2799 2812 N
+ JH P S b n/a 20 2792 2800 2813 N
+ JH P S s n/a 20 2792 2800 2813 N
+ JH P SH s n/a 20 2792 2800 2811 N
+ JH P SIL s n/a 20 2792 2801 2811 N
+ JH P T s n/a 20 2792 2800 2813 N
+ JH P TH s n/a 20 2792 2800 2813 N
+ JH P UH b n/a 20 2792 2794 2810 N
+ JH P UH s n/a 20 2792 2794 2810 N
+ JH P UW b n/a 20 2792 2794 2810 N
+ JH P UW s n/a 20 2792 2794 2810 N
+ JH P V s n/a 20 2792 2799 2812 N
+ JH P W b n/a 20 2792 2799 2812 N
+ JH P W s n/a 20 2792 2799 2812 N
+ JH P Y b n/a 20 2792 2800 2812 N
+ JH P Y s n/a 20 2792 2800 2812 N
+ JH P Z b n/a 20 2792 2800 2813 N
+ JH P Z s n/a 20 2792 2800 2813 N
+ JH P ZH s n/a 20 2792 2800 2811 N
+ JH R AA b n/a 20 2790 2795 2802 N
+ JH R AA e n/a 20 2790 2795 2802 N
+ JH R AA i n/a 20 2790 2795 2802 N
+ JH R AA s n/a 20 2790 2795 2802 N
+ JH R AE b n/a 20 2790 2795 2805 N
+ JH R AE e n/a 20 2790 2797 2808 N
+ JH R AE i n/a 20 2790 2797 2805 N
+ JH R AE s n/a 20 2790 2797 2805 N
+ JH R AH b n/a 20 2790 2795 2802 N
+ JH R AH e n/a 20 2790 2797 2808 N
+ JH R AH i n/a 20 2790 2797 2807 N
+ JH R AH s n/a 20 2790 2797 2808 N
+ JH R AO b n/a 20 2790 2795 2804 N
+ JH R AO e n/a 20 2790 2795 2804 N
+ JH R AO s n/a 20 2790 2795 2804 N
+ JH R AW b n/a 20 2790 2795 2806 N
+ JH R AW e n/a 20 2790 2797 2806 N
+ JH R AW s n/a 20 2790 2797 2806 N
+ JH R AY b n/a 20 2790 2795 2802 N
+ JH R AY e n/a 20 2790 2795 2802 N
+ JH R AY s n/a 20 2790 2795 2802 N
+ JH R B e n/a 20 2790 2799 2812 N
+ JH R B s n/a 20 2790 2799 2812 N
+ JH R CH e n/a 20 2790 2800 2811 N
+ JH R CH s n/a 20 2790 2800 2811 N
+ JH R D e n/a 20 2790 2800 2813 N
+ JH R D i n/a 20 2790 2800 2813 N
+ JH R D s n/a 20 2790 2800 2813 N
+ JH R DH e n/a 20 2790 2800 2813 N
+ JH R DH s n/a 20 2790 2800 2813 N
+ JH R EH b n/a 20 2790 2795 2805 N
+ JH R EH e n/a 20 2790 2797 2808 N
+ JH R EH i n/a 20 2790 2797 2805 N
+ JH R EH s n/a 20 2790 2797 2805 N
+ JH R ER b n/a 20 2790 2795 2810 N
+ JH R ER e n/a 20 2790 2795 2810 N
+ JH R ER i n/a 20 2790 2795 2810 N
+ JH R ER s n/a 20 2790 2795 2810 N
+ JH R EY b n/a 20 2790 2797 2805 N
+ JH R EY e n/a 20 2790 2797 2809 N
+ JH R EY i n/a 20 2790 2797 2805 N
+ JH R EY s n/a 20 2790 2797 2805 N
+ JH R F b n/a 20 2790 2799 2812 N
+ JH R F e n/a 20 2790 2799 2812 N
+ JH R F s n/a 20 2790 2799 2812 N
+ JH R G e n/a 20 2790 2799 2812 N
+ JH R G s n/a 20 2790 2799 2812 N
+ JH R HH e n/a 20 2790 2799 2812 N
+ JH R HH s n/a 20 2790 2799 2812 N
+ JH R IH b n/a 20 2790 2795 2803 N
+ JH R IH e n/a 20 2790 2797 2807 N
+ JH R IH i n/a 20 2790 2797 2807 N
+ JH R IH s n/a 20 2790 2797 2807 N
+ JH R IY b n/a 20 2790 2797 2809 N
+ JH R IY e n/a 20 2790 2797 2809 N
+ JH R IY i n/a 20 2790 2797 2809 N
+ JH R IY s n/a 20 2790 2797 2809 N
+ JH R JH e n/a 20 2790 2800 2811 N
+ JH R JH s n/a 20 2790 2800 2811 N
+ JH R K b n/a 20 2790 2799 2812 N
+ JH R K e n/a 20 2790 2799 2812 N
+ JH R K s n/a 20 2790 2799 2812 N
+ JH R L e n/a 20 2790 2799 2812 N
+ JH R L i n/a 20 2790 2799 2812 N
+ JH R L s n/a 20 2790 2799 2812 N
+ JH R M e n/a 20 2790 2799 2812 N
+ JH R M i n/a 20 2790 2799 2812 N
+ JH R M s n/a 20 2790 2799 2812 N
+ JH R N e n/a 20 2790 2800 2813 N
+ JH R N i n/a 20 2790 2800 2813 N
+ JH R N s n/a 20 2790 2800 2813 N
+ JH R NG e n/a 20 2790 2799 2812 N
+ JH R NG s n/a 20 2790 2799 2812 N
+ JH R OW b n/a 20 2790 2795 2806 N
+ JH R OW e n/a 20 2790 2795 2806 N
+ JH R OW i n/a 20 2790 2795 2806 N
+ JH R OW s n/a 20 2790 2795 2806 N
+ JH R OY b n/a 20 2790 2795 2804 N
+ JH R OY e n/a 20 2790 2795 2804 N
+ JH R OY s n/a 20 2790 2795 2804 N
+ JH R P b n/a 20 2790 2799 2812 N
+ JH R P e n/a 20 2790 2799 2812 N
+ JH R P s n/a 20 2790 2799 2812 N
+ JH R R e n/a 20 2790 2799 2812 N
+ JH R R i n/a 20 2790 2799 2812 N
+ JH R R s n/a 20 2790 2799 2812 N
+ JH R S b n/a 20 2790 2800 2813 N
+ JH R S e n/a 20 2790 2800 2813 N
+ JH R S i n/a 20 2790 2800 2813 N
+ JH R S s n/a 20 2790 2800 2813 N
+ JH R SH e n/a 20 2790 2800 2811 N
+ JH R SH s n/a 20 2790 2800 2811 N
+ JH R SIL e n/a 20 2790 2801 2811 N
+ JH R SIL s n/a 20 2790 2801 2811 N
+ JH R T e n/a 20 2790 2800 2813 N
+ JH R T i n/a 20 2790 2800 2813 N
+ JH R T s n/a 20 2790 2800 2813 N
+ JH R TH e n/a 20 2790 2800 2813 N
+ JH R TH s n/a 20 2790 2800 2813 N
+ JH R UH b n/a 20 2790 2795 2810 N
+ JH R UH e n/a 20 2790 2795 2810 N
+ JH R UH s n/a 20 2790 2795 2810 N
+ JH R UW b n/a 20 2790 2795 2810 N
+ JH R UW e n/a 20 2790 2795 2810 N
+ JH R UW i n/a 20 2790 2795 2810 N
+ JH R UW s n/a 20 2790 2795 2810 N
+ JH R V e n/a 20 2790 2799 2812 N
+ JH R V s n/a 20 2790 2799 2812 N
+ JH R W b n/a 20 2790 2799 2812 N
+ JH R W e n/a 20 2790 2799 2812 N
+ JH R W s n/a 20 2790 2799 2812 N
+ JH R Y b n/a 20 2790 2800 2812 N
+ JH R Y e n/a 20 2790 2800 2812 N
+ JH R Y s n/a 20 2790 2800 2812 N
+ JH R Z b n/a 20 2790 2800 2813 N
+ JH R Z e n/a 20 2790 2800 2813 N
+ JH R Z s n/a 20 2790 2800 2813 N
+ JH R ZH e n/a 20 2790 2800 2811 N
+ JH R ZH s n/a 20 2790 2800 2811 N
+ JH S AA b n/a 20 2791 2794 2802 N
+ JH S AA s n/a 20 2791 2794 2802 N
+ JH S AE b n/a 20 2791 2794 2805 N
+ JH S AE s n/a 20 2791 2794 2805 N
+ JH S AH b n/a 20 2791 2794 2802 N
+ JH S AH i n/a 20 2791 2794 2808 N
+ JH S AH s n/a 20 2791 2794 2808 N
+ JH S AO b n/a 20 2791 2794 2804 N
+ JH S AO s n/a 20 2791 2794 2804 N
+ JH S AW b n/a 20 2791 2794 2806 N
+ JH S AW s n/a 20 2791 2794 2806 N
+ JH S AY b n/a 20 2791 2794 2802 N
+ JH S AY s n/a 20 2791 2794 2802 N
+ JH S B s n/a 20 2791 2799 2812 N
+ JH S CH s n/a 20 2791 2800 2811 N
+ JH S D s n/a 20 2791 2800 2813 N
+ JH S DH s n/a 20 2791 2800 2813 N
+ JH S EH b n/a 20 2791 2794 2805 N
+ JH S EH i n/a 20 2791 2794 2805 N
+ JH S EH s n/a 20 2791 2794 2805 N
+ JH S ER b n/a 20 2791 2794 2810 N
+ JH S ER s n/a 20 2791 2794 2810 N
+ JH S EY b n/a 20 2791 2794 2805 N
+ JH S EY s n/a 20 2791 2794 2805 N
+ JH S F b n/a 20 2791 2799 2812 N
+ JH S F s n/a 20 2791 2799 2812 N
+ JH S G s n/a 20 2791 2799 2812 N
+ JH S HH s n/a 20 2791 2799 2812 N
+ JH S IH b n/a 20 2791 2794 2803 N
+ JH S IH i n/a 20 2791 2794 2807 N
+ JH S IH s n/a 20 2791 2794 2807 N
+ JH S IY b n/a 20 2791 2794 2809 N
+ JH S IY i n/a 20 2791 2794 2809 N
+ JH S IY s n/a 20 2791 2794 2809 N
+ JH S JH s n/a 20 2791 2800 2811 N
+ JH S K b n/a 20 2791 2799 2812 N
+ JH S K s n/a 20 2791 2799 2812 N
+ JH S L s n/a 20 2791 2799 2812 N
+ JH S M s n/a 20 2791 2799 2812 N
+ JH S N s n/a 20 2791 2800 2813 N
+ JH S NG s n/a 20 2791 2799 2812 N
+ JH S OW b n/a 20 2791 2794 2806 N
+ JH S OW i n/a 20 2791 2794 2806 N
+ JH S OW s n/a 20 2791 2794 2806 N
+ JH S OY b n/a 20 2791 2794 2804 N
+ JH S OY i n/a 20 2791 2794 2804 N
+ JH S OY s n/a 20 2791 2794 2804 N
+ JH S P b n/a 20 2791 2799 2812 N
+ JH S P s n/a 20 2791 2799 2812 N
+ JH S R s n/a 20 2791 2799 2812 N
+ JH S S b n/a 20 2791 2800 2813 N
+ JH S S s n/a 20 2791 2800 2813 N
+ JH S SH s n/a 20 2791 2800 2811 N
+ JH S SIL s n/a 20 2791 2801 2811 N
+ JH S T s n/a 20 2791 2800 2813 N
+ JH S TH s n/a 20 2791 2800 2813 N
+ JH S UH b n/a 20 2791 2794 2810 N
+ JH S UH s n/a 20 2791 2794 2810 N
+ JH S UW b n/a 20 2791 2794 2810 N
+ JH S UW s n/a 20 2791 2794 2810 N
+ JH S V s n/a 20 2791 2799 2812 N
+ JH S W b n/a 20 2791 2799 2812 N
+ JH S W s n/a 20 2791 2799 2812 N
+ JH S Y b n/a 20 2791 2800 2812 N
+ JH S Y s n/a 20 2791 2800 2812 N
+ JH S Z b n/a 20 2791 2800 2813 N
+ JH S Z s n/a 20 2791 2800 2813 N
+ JH S ZH s n/a 20 2791 2800 2811 N
+ JH SH AA b n/a 20 2791 2794 2802 N
+ JH SH AA s n/a 20 2791 2794 2802 N
+ JH SH AE b n/a 20 2791 2794 2805 N
+ JH SH AE s n/a 20 2791 2794 2805 N
+ JH SH AH b n/a 20 2791 2794 2802 N
+ JH SH AH i n/a 20 2791 2794 2807 N
+ JH SH AH s n/a 20 2791 2794 2808 N
+ JH SH AO b n/a 20 2791 2794 2804 N
+ JH SH AO s n/a 20 2791 2794 2804 N
+ JH SH AW b n/a 20 2791 2794 2806 N
+ JH SH AW s n/a 20 2791 2794 2806 N
+ JH SH AY b n/a 20 2791 2794 2802 N
+ JH SH AY s n/a 20 2791 2794 2802 N
+ JH SH B s n/a 20 2791 2799 2812 N
+ JH SH CH s n/a 20 2791 2800 2811 N
+ JH SH D s n/a 20 2791 2800 2813 N
+ JH SH DH s n/a 20 2791 2800 2813 N
+ JH SH EH b n/a 20 2791 2794 2805 N
+ JH SH EH s n/a 20 2791 2794 2805 N
+ JH SH ER b n/a 20 2791 2794 2810 N
+ JH SH ER s n/a 20 2791 2794 2810 N
+ JH SH EY b n/a 20 2791 2794 2805 N
+ JH SH EY s n/a 20 2791 2794 2805 N
+ JH SH F b n/a 20 2791 2799 2812 N
+ JH SH F s n/a 20 2791 2799 2812 N
+ JH SH G s n/a 20 2791 2799 2812 N
+ JH SH HH s n/a 20 2791 2799 2812 N
+ JH SH IH b n/a 20 2791 2794 2803 N
+ JH SH IH s n/a 20 2791 2794 2807 N
+ JH SH IY b n/a 20 2791 2794 2809 N
+ JH SH IY i n/a 20 2791 2794 2809 N
+ JH SH IY s n/a 20 2791 2794 2809 N
+ JH SH JH s n/a 20 2791 2800 2811 N
+ JH SH K b n/a 20 2791 2799 2812 N
+ JH SH K s n/a 20 2791 2799 2812 N
+ JH SH L s n/a 20 2791 2799 2812 N
+ JH SH M s n/a 20 2791 2799 2812 N
+ JH SH N s n/a 20 2791 2800 2813 N
+ JH SH NG s n/a 20 2791 2799 2812 N
+ JH SH OW b n/a 20 2791 2794 2806 N
+ JH SH OW s n/a 20 2791 2794 2806 N
+ JH SH OY b n/a 20 2791 2794 2804 N
+ JH SH OY s n/a 20 2791 2794 2804 N
+ JH SH P b n/a 20 2791 2799 2812 N
+ JH SH P s n/a 20 2791 2799 2812 N
+ JH SH R s n/a 20 2791 2799 2812 N
+ JH SH S b n/a 20 2791 2800 2813 N
+ JH SH S s n/a 20 2791 2800 2813 N
+ JH SH SH s n/a 20 2791 2800 2811 N
+ JH SH SIL s n/a 20 2791 2801 2811 N
+ JH SH T s n/a 20 2791 2800 2813 N
+ JH SH TH s n/a 20 2791 2800 2813 N
+ JH SH UH b n/a 20 2791 2794 2810 N
+ JH SH UH s n/a 20 2791 2794 2810 N
+ JH SH UW b n/a 20 2791 2794 2810 N
+ JH SH UW s n/a 20 2791 2794 2810 N
+ JH SH V s n/a 20 2791 2799 2812 N
+ JH SH W b n/a 20 2791 2799 2812 N
+ JH SH W s n/a 20 2791 2799 2812 N
+ JH SH Y b n/a 20 2791 2800 2812 N
+ JH SH Y s n/a 20 2791 2800 2812 N
+ JH SH Z b n/a 20 2791 2800 2813 N
+ JH SH Z s n/a 20 2791 2800 2813 N
+ JH SH ZH s n/a 20 2791 2800 2811 N
+ JH SIL AA b n/a 20 2791 2794 2802 N
+ JH SIL AA s n/a 20 2791 2794 2802 N
+ JH SIL AE b n/a 20 2791 2794 2805 N
+ JH SIL AE s n/a 20 2791 2794 2805 N
+ JH SIL AH b n/a 20 2791 2794 2802 N
+ JH SIL AH s n/a 20 2791 2794 2808 N
+ JH SIL AO b n/a 20 2791 2794 2804 N
+ JH SIL AO s n/a 20 2791 2794 2804 N
+ JH SIL AW b n/a 20 2791 2794 2806 N
+ JH SIL AW s n/a 20 2791 2794 2806 N
+ JH SIL AY b n/a 20 2791 2794 2802 N
+ JH SIL AY s n/a 20 2791 2794 2802 N
+ JH SIL B s n/a 20 2791 2799 2812 N
+ JH SIL CH s n/a 20 2791 2800 2811 N
+ JH SIL D s n/a 20 2791 2800 2813 N
+ JH SIL DH s n/a 20 2791 2800 2813 N
+ JH SIL EH b n/a 20 2791 2794 2805 N
+ JH SIL EH s n/a 20 2791 2794 2805 N
+ JH SIL ER b n/a 20 2791 2794 2810 N
+ JH SIL ER s n/a 20 2791 2794 2810 N
+ JH SIL EY b n/a 20 2791 2794 2805 N
+ JH SIL EY s n/a 20 2791 2794 2805 N
+ JH SIL F b n/a 20 2791 2799 2812 N
+ JH SIL F s n/a 20 2791 2799 2812 N
+ JH SIL G s n/a 20 2791 2799 2812 N
+ JH SIL HH s n/a 20 2791 2799 2812 N
+ JH SIL IH b n/a 20 2791 2794 2803 N
+ JH SIL IH s n/a 20 2791 2794 2807 N
+ JH SIL IY b n/a 20 2791 2794 2809 N
+ JH SIL IY s n/a 20 2791 2794 2809 N
+ JH SIL JH s n/a 20 2791 2800 2811 N
+ JH SIL K b n/a 20 2791 2799 2812 N
+ JH SIL K s n/a 20 2791 2799 2812 N
+ JH SIL L s n/a 20 2791 2799 2812 N
+ JH SIL M s n/a 20 2791 2799 2812 N
+ JH SIL N s n/a 20 2791 2800 2813 N
+ JH SIL NG s n/a 20 2791 2799 2812 N
+ JH SIL OW b n/a 20 2791 2794 2806 N
+ JH SIL OW s n/a 20 2791 2794 2806 N
+ JH SIL OY b n/a 20 2791 2794 2804 N
+ JH SIL OY s n/a 20 2791 2794 2804 N
+ JH SIL P b n/a 20 2791 2799 2812 N
+ JH SIL P s n/a 20 2791 2799 2812 N
+ JH SIL R s n/a 20 2791 2799 2812 N
+ JH SIL S b n/a 20 2791 2800 2813 N
+ JH SIL S s n/a 20 2791 2800 2813 N
+ JH SIL SH s n/a 20 2791 2800 2811 N
+ JH SIL SIL s n/a 20 2791 2801 2811 N
+ JH SIL T s n/a 20 2791 2800 2813 N
+ JH SIL TH s n/a 20 2791 2800 2813 N
+ JH SIL UH b n/a 20 2791 2794 2810 N
+ JH SIL UH s n/a 20 2791 2794 2810 N
+ JH SIL UW b n/a 20 2791 2794 2810 N
+ JH SIL UW s n/a 20 2791 2794 2810 N
+ JH SIL V s n/a 20 2791 2799 2812 N
+ JH SIL W b n/a 20 2791 2799 2812 N
+ JH SIL W s n/a 20 2791 2799 2812 N
+ JH SIL Y b n/a 20 2791 2800 2812 N
+ JH SIL Y s n/a 20 2791 2800 2812 N
+ JH SIL Z b n/a 20 2791 2800 2813 N
+ JH SIL Z s n/a 20 2791 2800 2813 N
+ JH SIL ZH s n/a 20 2791 2800 2811 N
+ JH T AA b n/a 20 2792 2794 2802 N
+ JH T AA e n/a 20 2792 2794 2802 N
+ JH T AA i n/a 20 2792 2794 2802 N
+ JH T AA s n/a 20 2792 2794 2802 N
+ JH T AE b n/a 20 2792 2794 2805 N
+ JH T AE e n/a 20 2792 2794 2808 N
+ JH T AE i n/a 20 2792 2794 2805 N
+ JH T AE s n/a 20 2792 2794 2805 N
+ JH T AH b n/a 20 2792 2794 2802 N
+ JH T AH e n/a 20 2792 2794 2808 N
+ JH T AH i n/a 20 2792 2794 2808 N
+ JH T AH s n/a 20 2792 2794 2808 N
+ JH T AO b n/a 20 2792 2794 2804 N
+ JH T AO e n/a 20 2792 2794 2804 N
+ JH T AO i n/a 20 2792 2794 2804 N
+ JH T AO s n/a 20 2792 2794 2804 N
+ JH T AW b n/a 20 2792 2794 2806 N
+ JH T AW e n/a 20 2792 2794 2806 N
+ JH T AW s n/a 20 2792 2794 2806 N
+ JH T AY b n/a 20 2792 2794 2802 N
+ JH T AY e n/a 20 2792 2794 2802 N
+ JH T AY s n/a 20 2792 2794 2802 N
+ JH T B e n/a 20 2792 2799 2812 N
+ JH T B s n/a 20 2792 2799 2812 N
+ JH T CH e n/a 20 2792 2800 2811 N
+ JH T CH s n/a 20 2792 2800 2811 N
+ JH T D e n/a 20 2792 2800 2813 N
+ JH T D s n/a 20 2792 2800 2813 N
+ JH T DH e n/a 20 2792 2800 2813 N
+ JH T DH s n/a 20 2792 2800 2813 N
+ JH T EH b n/a 20 2792 2794 2805 N
+ JH T EH e n/a 20 2792 2794 2808 N
+ JH T EH i n/a 20 2792 2794 2805 N
+ JH T EH s n/a 20 2792 2794 2805 N
+ JH T ER b n/a 20 2792 2794 2810 N
+ JH T ER e n/a 20 2792 2794 2810 N
+ JH T ER i n/a 20 2792 2794 2810 N
+ JH T ER s n/a 20 2792 2794 2810 N
+ JH T EY b n/a 20 2792 2794 2805 N
+ JH T EY e n/a 20 2792 2794 2809 N
+ JH T EY i n/a 20 2792 2794 2805 N
+ JH T EY s n/a 20 2792 2794 2805 N
+ JH T F b n/a 20 2792 2799 2812 N
+ JH T F e n/a 20 2792 2799 2812 N
+ JH T F s n/a 20 2792 2799 2812 N
+ JH T G e n/a 20 2792 2799 2812 N
+ JH T G s n/a 20 2792 2799 2812 N
+ JH T HH e n/a 20 2792 2799 2812 N
+ JH T HH s n/a 20 2792 2799 2812 N
+ JH T IH b n/a 20 2792 2794 2803 N
+ JH T IH e n/a 20 2792 2794 2807 N
+ JH T IH i n/a 20 2792 2794 2807 N
+ JH T IH s n/a 20 2792 2794 2807 N
+ JH T IY b n/a 20 2792 2794 2809 N
+ JH T IY e n/a 20 2792 2794 2809 N
+ JH T IY i n/a 20 2792 2794 2809 N
+ JH T IY s n/a 20 2792 2794 2809 N
+ JH T JH e n/a 20 2792 2800 2811 N
+ JH T JH s n/a 20 2792 2800 2811 N
+ JH T K b n/a 20 2792 2799 2812 N
+ JH T K e n/a 20 2792 2799 2812 N
+ JH T K s n/a 20 2792 2799 2812 N
+ JH T L e n/a 20 2792 2799 2812 N
+ JH T L s n/a 20 2792 2799 2812 N
+ JH T M e n/a 20 2792 2799 2812 N
+ JH T M s n/a 20 2792 2799 2812 N
+ JH T N e n/a 20 2792 2800 2813 N
+ JH T N s n/a 20 2792 2800 2813 N
+ JH T NG e n/a 20 2792 2799 2812 N
+ JH T NG s n/a 20 2792 2799 2812 N
+ JH T OW b n/a 20 2792 2794 2806 N
+ JH T OW e n/a 20 2792 2794 2806 N
+ JH T OW s n/a 20 2792 2794 2806 N
+ JH T OY b n/a 20 2792 2794 2804 N
+ JH T OY e n/a 20 2792 2794 2804 N
+ JH T OY i n/a 20 2792 2794 2804 N
+ JH T OY s n/a 20 2792 2794 2804 N
+ JH T P b n/a 20 2792 2799 2812 N
+ JH T P e n/a 20 2792 2799 2812 N
+ JH T P s n/a 20 2792 2799 2812 N
+ JH T R e n/a 20 2792 2799 2812 N
+ JH T R s n/a 20 2792 2799 2812 N
+ JH T S b n/a 20 2792 2800 2813 N
+ JH T S e n/a 20 2792 2800 2813 N
+ JH T S s n/a 20 2792 2800 2813 N
+ JH T SH e n/a 20 2792 2800 2811 N
+ JH T SH s n/a 20 2792 2800 2811 N
+ JH T SIL e n/a 20 2792 2801 2811 N
+ JH T SIL s n/a 20 2792 2801 2811 N
+ JH T T e n/a 20 2792 2800 2813 N
+ JH T T i n/a 20 2792 2800 2813 N
+ JH T T s n/a 20 2792 2800 2813 N
+ JH T TH e n/a 20 2792 2800 2813 N
+ JH T TH s n/a 20 2792 2800 2813 N
+ JH T UH b n/a 20 2792 2794 2810 N
+ JH T UH e n/a 20 2792 2794 2810 N
+ JH T UH s n/a 20 2792 2794 2810 N
+ JH T UW b n/a 20 2792 2794 2810 N
+ JH T UW e n/a 20 2792 2794 2810 N
+ JH T UW i n/a 20 2792 2794 2810 N
+ JH T UW s n/a 20 2792 2794 2810 N
+ JH T V e n/a 20 2792 2799 2812 N
+ JH T V s n/a 20 2792 2799 2812 N
+ JH T W b n/a 20 2792 2799 2812 N
+ JH T W e n/a 20 2792 2799 2812 N
+ JH T W s n/a 20 2792 2799 2812 N
+ JH T Y b n/a 20 2792 2800 2812 N
+ JH T Y e n/a 20 2792 2800 2812 N
+ JH T Y s n/a 20 2792 2800 2812 N
+ JH T Z b n/a 20 2792 2800 2813 N
+ JH T Z e n/a 20 2792 2800 2813 N
+ JH T Z s n/a 20 2792 2800 2813 N
+ JH T ZH e n/a 20 2792 2800 2811 N
+ JH T ZH s n/a 20 2792 2800 2811 N
+ JH TH AA b n/a 20 2791 2794 2802 N
+ JH TH AA s n/a 20 2791 2794 2802 N
+ JH TH AE b n/a 20 2791 2794 2805 N
+ JH TH AE s n/a 20 2791 2794 2805 N
+ JH TH AH b n/a 20 2791 2794 2802 N
+ JH TH AH i n/a 20 2791 2794 2808 N
+ JH TH AH s n/a 20 2791 2794 2808 N
+ JH TH AO b n/a 20 2791 2794 2804 N
+ JH TH AO s n/a 20 2791 2794 2804 N
+ JH TH AW b n/a 20 2791 2794 2806 N
+ JH TH AW s n/a 20 2791 2794 2806 N
+ JH TH AY b n/a 20 2791 2794 2802 N
+ JH TH AY s n/a 20 2791 2794 2802 N
+ JH TH B s n/a 20 2791 2799 2812 N
+ JH TH CH s n/a 20 2791 2800 2811 N
+ JH TH D s n/a 20 2791 2800 2813 N
+ JH TH DH s n/a 20 2791 2800 2813 N
+ JH TH EH b n/a 20 2791 2794 2805 N
+ JH TH EH s n/a 20 2791 2794 2805 N
+ JH TH ER b n/a 20 2791 2794 2810 N
+ JH TH ER s n/a 20 2791 2794 2810 N
+ JH TH EY b n/a 20 2791 2794 2805 N
+ JH TH EY s n/a 20 2791 2794 2805 N
+ JH TH F b n/a 20 2791 2799 2812 N
+ JH TH F s n/a 20 2791 2799 2812 N
+ JH TH G s n/a 20 2791 2799 2812 N
+ JH TH HH s n/a 20 2791 2799 2812 N
+ JH TH IH b n/a 20 2791 2794 2803 N
+ JH TH IH s n/a 20 2791 2794 2807 N
+ JH TH IY b n/a 20 2791 2794 2809 N
+ JH TH IY s n/a 20 2791 2794 2809 N
+ JH TH JH s n/a 20 2791 2800 2811 N
+ JH TH K b n/a 20 2791 2799 2812 N
+ JH TH K s n/a 20 2791 2799 2812 N
+ JH TH L s n/a 20 2791 2799 2812 N
+ JH TH M s n/a 20 2791 2799 2812 N
+ JH TH N s n/a 20 2791 2800 2813 N
+ JH TH NG s n/a 20 2791 2799 2812 N
+ JH TH OW b n/a 20 2791 2794 2806 N
+ JH TH OW s n/a 20 2791 2794 2806 N
+ JH TH OY b n/a 20 2791 2794 2804 N
+ JH TH OY s n/a 20 2791 2794 2804 N
+ JH TH P b n/a 20 2791 2799 2812 N
+ JH TH P s n/a 20 2791 2799 2812 N
+ JH TH R s n/a 20 2791 2799 2812 N
+ JH TH S b n/a 20 2791 2800 2813 N
+ JH TH S s n/a 20 2791 2800 2813 N
+ JH TH SH s n/a 20 2791 2800 2811 N
+ JH TH SIL s n/a 20 2791 2801 2811 N
+ JH TH T s n/a 20 2791 2800 2813 N
+ JH TH TH s n/a 20 2791 2800 2813 N
+ JH TH UH b n/a 20 2791 2794 2810 N
+ JH TH UH s n/a 20 2791 2794 2810 N
+ JH TH UW b n/a 20 2791 2794 2810 N
+ JH TH UW s n/a 20 2791 2794 2810 N
+ JH TH V s n/a 20 2791 2799 2812 N
+ JH TH W b n/a 20 2791 2799 2812 N
+ JH TH W s n/a 20 2791 2799 2812 N
+ JH TH Y b n/a 20 2791 2800 2812 N
+ JH TH Y s n/a 20 2791 2800 2812 N
+ JH TH Z b n/a 20 2791 2800 2813 N
+ JH TH Z s n/a 20 2791 2800 2813 N
+ JH TH ZH s n/a 20 2791 2800 2811 N
+ JH UH AA b n/a 20 2786 2795 2802 N
+ JH UH AA s n/a 20 2785 2795 2802 N
+ JH UH AE b n/a 20 2786 2795 2805 N
+ JH UH AE s n/a 20 2785 2797 2805 N
+ JH UH AH b n/a 20 2786 2795 2802 N
+ JH UH AH s n/a 20 2785 2797 2808 N
+ JH UH AO b n/a 20 2786 2795 2804 N
+ JH UH AO s n/a 20 2785 2795 2804 N
+ JH UH AW b n/a 20 2786 2795 2806 N
+ JH UH AW s n/a 20 2785 2797 2806 N
+ JH UH AY b n/a 20 2786 2795 2802 N
+ JH UH AY s n/a 20 2785 2795 2802 N
+ JH UH B s n/a 20 2785 2799 2812 N
+ JH UH CH s n/a 20 2785 2800 2811 N
+ JH UH D s n/a 20 2785 2800 2813 N
+ JH UH DH s n/a 20 2785 2800 2813 N
+ JH UH EH b n/a 20 2786 2795 2805 N
+ JH UH EH s n/a 20 2785 2797 2805 N
+ JH UH ER b n/a 20 2786 2795 2810 N
+ JH UH ER s n/a 20 2785 2795 2810 N
+ JH UH EY b n/a 20 2786 2798 2805 N
+ JH UH EY s n/a 20 2784 2798 2805 N
+ JH UH F b n/a 20 2786 2799 2812 N
+ JH UH F s n/a 20 2785 2799 2812 N
+ JH UH G s n/a 20 2785 2799 2812 N
+ JH UH HH s n/a 20 2785 2799 2812 N
+ JH UH IH b n/a 20 2786 2795 2803 N
+ JH UH IH s n/a 20 2785 2797 2807 N
+ JH UH IY b n/a 20 2786 2798 2809 N
+ JH UH IY s n/a 20 2784 2798 2809 N
+ JH UH JH s n/a 20 2785 2800 2811 N
+ JH UH K b n/a 20 2786 2799 2812 N
+ JH UH K s n/a 20 2785 2799 2812 N
+ JH UH L s n/a 20 2785 2799 2812 N
+ JH UH M i n/a 20 2785 2799 2812 N
+ JH UH M s n/a 20 2785 2799 2812 N
+ JH UH N s n/a 20 2785 2800 2813 N
+ JH UH NG s n/a 20 2785 2799 2812 N
+ JH UH OW b n/a 20 2786 2795 2806 N
+ JH UH OW s n/a 20 2785 2795 2806 N
+ JH UH OY b n/a 20 2786 2795 2804 N
+ JH UH OY s n/a 20 2785 2795 2804 N
+ JH UH P b n/a 20 2786 2799 2812 N
+ JH UH P s n/a 20 2785 2799 2812 N
+ JH UH R s n/a 20 2785 2799 2812 N
+ JH UH S b n/a 20 2786 2800 2813 N
+ JH UH S s n/a 20 2785 2800 2813 N
+ JH UH SH s n/a 20 2785 2800 2811 N
+ JH UH SIL s n/a 20 2786 2801 2811 N
+ JH UH T s n/a 20 2785 2800 2813 N
+ JH UH TH s n/a 20 2785 2800 2813 N
+ JH UH UH b n/a 20 2786 2795 2810 N
+ JH UH UH s n/a 20 2785 2795 2810 N
+ JH UH UW b n/a 20 2786 2795 2810 N
+ JH UH UW s n/a 20 2785 2795 2810 N
+ JH UH V s n/a 20 2785 2799 2812 N
+ JH UH W b n/a 20 2786 2799 2812 N
+ JH UH W s n/a 20 2785 2799 2812 N
+ JH UH Y b n/a 20 2786 2800 2812 N
+ JH UH Y s n/a 20 2785 2800 2812 N
+ JH UH Z b n/a 20 2786 2800 2813 N
+ JH UH Z s n/a 20 2785 2800 2813 N
+ JH UH ZH s n/a 20 2785 2800 2811 N
+ JH UW AA b n/a 20 2787 2795 2802 N
+ JH UW AA e n/a 20 2787 2795 2802 N
+ JH UW AA i n/a 20 2787 2795 2802 N
+ JH UW AA s n/a 20 2787 2795 2802 N
+ JH UW AE b n/a 20 2787 2795 2805 N
+ JH UW AE e n/a 20 2787 2797 2808 N
+ JH UW AE i n/a 20 2787 2797 2805 N
+ JH UW AE s n/a 20 2787 2797 2805 N
+ JH UW AH b n/a 20 2787 2795 2802 N
+ JH UW AH e n/a 20 2787 2797 2808 N
+ JH UW AH i n/a 20 2787 2797 2808 N
+ JH UW AH s n/a 20 2787 2797 2808 N
+ JH UW AO b n/a 20 2787 2795 2804 N
+ JH UW AO e n/a 20 2787 2795 2804 N
+ JH UW AO i n/a 20 2787 2795 2804 N
+ JH UW AO s n/a 20 2787 2795 2804 N
+ JH UW AW b n/a 20 2787 2795 2806 N
+ JH UW AW e n/a 20 2787 2797 2806 N
+ JH UW AW s n/a 20 2787 2797 2806 N
+ JH UW AY b n/a 20 2787 2795 2802 N
+ JH UW AY e n/a 20 2787 2795 2802 N
+ JH UW AY s n/a 20 2787 2795 2802 N
+ JH UW B e n/a 20 2787 2799 2812 N
+ JH UW B s n/a 20 2787 2799 2812 N
+ JH UW CH e n/a 20 2787 2800 2811 N
+ JH UW CH s n/a 20 2787 2800 2811 N
+ JH UW D e n/a 20 2787 2800 2813 N
+ JH UW D i n/a 20 2787 2800 2813 N
+ JH UW D s n/a 20 2787 2800 2813 N
+ JH UW DH e n/a 20 2787 2800 2813 N
+ JH UW DH s n/a 20 2787 2800 2813 N
+ JH UW EH b n/a 20 2787 2795 2805 N
+ JH UW EH e n/a 20 2787 2797 2808 N
+ JH UW EH i n/a 20 2787 2797 2805 N
+ JH UW EH s n/a 20 2787 2797 2805 N
+ JH UW ER b n/a 20 2787 2795 2810 N
+ JH UW ER e n/a 20 2787 2795 2810 N
+ JH UW ER i n/a 20 2787 2795 2810 N
+ JH UW ER s n/a 20 2787 2795 2810 N
+ JH UW EY b n/a 20 2787 2797 2805 N
+ JH UW EY e n/a 20 2787 2797 2809 N
+ JH UW EY i n/a 20 2787 2797 2805 N
+ JH UW EY s n/a 20 2787 2797 2805 N
+ JH UW F b n/a 20 2787 2799 2812 N
+ JH UW F e n/a 20 2787 2799 2812 N
+ JH UW F s n/a 20 2787 2799 2812 N
+ JH UW G e n/a 20 2787 2799 2812 N
+ JH UW G s n/a 20 2787 2799 2812 N
+ JH UW HH e n/a 20 2787 2799 2812 N
+ JH UW HH s n/a 20 2787 2799 2812 N
+ JH UW IH b n/a 20 2787 2795 2803 N
+ JH UW IH e n/a 20 2787 2797 2807 N
+ JH UW IH i n/a 20 2787 2797 2807 N
+ JH UW IH s n/a 20 2787 2797 2807 N
+ JH UW IY b n/a 20 2787 2797 2809 N
+ JH UW IY e n/a 20 2787 2797 2809 N
+ JH UW IY i n/a 20 2787 2797 2809 N
+ JH UW IY s n/a 20 2787 2797 2809 N
+ JH UW JH e n/a 20 2787 2800 2811 N
+ JH UW JH s n/a 20 2787 2800 2811 N
+ JH UW K b n/a 20 2787 2799 2812 N
+ JH UW K e n/a 20 2787 2799 2812 N
+ JH UW K s n/a 20 2787 2799 2812 N
+ JH UW L e n/a 20 2787 2799 2812 N
+ JH UW L i n/a 20 2787 2799 2812 N
+ JH UW L s n/a 20 2787 2799 2812 N
+ JH UW M e n/a 20 2787 2799 2812 N
+ JH UW M s n/a 20 2787 2799 2812 N
+ JH UW N e n/a 20 2787 2800 2813 N
+ JH UW N s n/a 20 2787 2800 2813 N
+ JH UW NG e n/a 20 2787 2799 2812 N
+ JH UW NG s n/a 20 2787 2799 2812 N
+ JH UW OW b n/a 20 2787 2795 2806 N
+ JH UW OW e n/a 20 2787 2795 2806 N
+ JH UW OW i n/a 20 2787 2795 2806 N
+ JH UW OW s n/a 20 2787 2795 2806 N
+ JH UW OY b n/a 20 2787 2795 2804 N
+ JH UW OY e n/a 20 2787 2795 2804 N
+ JH UW OY s n/a 20 2787 2795 2804 N
+ JH UW P b n/a 20 2787 2799 2812 N
+ JH UW P e n/a 20 2787 2799 2812 N
+ JH UW P s n/a 20 2787 2799 2812 N
+ JH UW R e n/a 20 2787 2799 2812 N
+ JH UW R s n/a 20 2787 2799 2812 N
+ JH UW S b n/a 20 2787 2800 2813 N
+ JH UW S e n/a 20 2787 2800 2813 N
+ JH UW S s n/a 20 2787 2800 2813 N
+ JH UW SH e n/a 20 2787 2800 2811 N
+ JH UW SH s n/a 20 2787 2800 2811 N
+ JH UW SIL e n/a 20 2787 2801 2811 N
+ JH UW SIL s n/a 20 2787 2801 2811 N
+ JH UW T e n/a 20 2787 2800 2813 N
+ JH UW T s n/a 20 2787 2800 2813 N
+ JH UW TH e n/a 20 2787 2800 2813 N
+ JH UW TH s n/a 20 2787 2800 2813 N
+ JH UW UH b n/a 20 2787 2795 2810 N
+ JH UW UH e n/a 20 2787 2795 2810 N
+ JH UW UH s n/a 20 2787 2795 2810 N
+ JH UW UW b n/a 20 2787 2795 2810 N
+ JH UW UW e n/a 20 2787 2795 2810 N
+ JH UW UW i n/a 20 2787 2795 2810 N
+ JH UW UW s n/a 20 2787 2795 2810 N
+ JH UW V e n/a 20 2787 2799 2812 N
+ JH UW V s n/a 20 2787 2799 2812 N
+ JH UW W b n/a 20 2787 2799 2812 N
+ JH UW W e n/a 20 2787 2799 2812 N
+ JH UW W s n/a 20 2787 2799 2812 N
+ JH UW Y b n/a 20 2787 2800 2812 N
+ JH UW Y e n/a 20 2787 2800 2812 N
+ JH UW Y s n/a 20 2787 2800 2812 N
+ JH UW Z b n/a 20 2787 2800 2813 N
+ JH UW Z e n/a 20 2787 2800 2813 N
+ JH UW Z s n/a 20 2787 2800 2813 N
+ JH UW ZH e n/a 20 2787 2800 2811 N
+ JH UW ZH s n/a 20 2787 2800 2811 N
+ JH V AA b n/a 20 2792 2794 2802 N
+ JH V AA s n/a 20 2792 2794 2802 N
+ JH V AE b n/a 20 2792 2794 2805 N
+ JH V AE s n/a 20 2792 2794 2805 N
+ JH V AH b n/a 20 2792 2794 2802 N
+ JH V AH i n/a 20 2792 2794 2807 N
+ JH V AH s n/a 20 2792 2794 2808 N
+ JH V AO b n/a 20 2792 2794 2804 N
+ JH V AO s n/a 20 2792 2794 2804 N
+ JH V AW b n/a 20 2792 2794 2806 N
+ JH V AW s n/a 20 2792 2794 2806 N
+ JH V AY b n/a 20 2792 2794 2802 N
+ JH V AY s n/a 20 2792 2794 2802 N
+ JH V B s n/a 20 2792 2799 2812 N
+ JH V CH s n/a 20 2792 2800 2811 N
+ JH V D s n/a 20 2792 2800 2813 N
+ JH V DH s n/a 20 2792 2800 2813 N
+ JH V EH b n/a 20 2792 2794 2805 N
+ JH V EH s n/a 20 2792 2794 2805 N
+ JH V ER b n/a 20 2792 2794 2810 N
+ JH V ER s n/a 20 2792 2794 2810 N
+ JH V EY b n/a 20 2792 2794 2805 N
+ JH V EY s n/a 20 2792 2794 2805 N
+ JH V F b n/a 20 2792 2799 2812 N
+ JH V F s n/a 20 2792 2799 2812 N
+ JH V G s n/a 20 2792 2799 2812 N
+ JH V HH s n/a 20 2792 2799 2812 N
+ JH V IH b n/a 20 2792 2794 2803 N
+ JH V IH s n/a 20 2792 2794 2807 N
+ JH V IY b n/a 20 2792 2794 2809 N
+ JH V IY s n/a 20 2792 2794 2809 N
+ JH V JH s n/a 20 2792 2800 2811 N
+ JH V K b n/a 20 2792 2799 2812 N
+ JH V K s n/a 20 2792 2799 2812 N
+ JH V L s n/a 20 2792 2799 2812 N
+ JH V M s n/a 20 2792 2799 2812 N
+ JH V N s n/a 20 2792 2800 2813 N
+ JH V NG s n/a 20 2792 2799 2812 N
+ JH V OW b n/a 20 2792 2794 2806 N
+ JH V OW s n/a 20 2792 2794 2806 N
+ JH V OY b n/a 20 2792 2794 2804 N
+ JH V OY i n/a 20 2792 2794 2804 N
+ JH V OY s n/a 20 2792 2794 2804 N
+ JH V P b n/a 20 2792 2799 2812 N
+ JH V P s n/a 20 2792 2799 2812 N
+ JH V R s n/a 20 2792 2799 2812 N
+ JH V S b n/a 20 2792 2800 2813 N
+ JH V S s n/a 20 2792 2800 2813 N
+ JH V SH s n/a 20 2792 2800 2811 N
+ JH V SIL s n/a 20 2792 2801 2811 N
+ JH V T s n/a 20 2792 2800 2813 N
+ JH V TH s n/a 20 2792 2800 2813 N
+ JH V UH b n/a 20 2792 2794 2810 N
+ JH V UH s n/a 20 2792 2794 2810 N
+ JH V UW b n/a 20 2792 2794 2810 N
+ JH V UW i n/a 20 2792 2794 2810 N
+ JH V UW s n/a 20 2792 2794 2810 N
+ JH V V s n/a 20 2792 2799 2812 N
+ JH V W b n/a 20 2792 2799 2812 N
+ JH V W s n/a 20 2792 2799 2812 N
+ JH V Y b n/a 20 2792 2800 2812 N
+ JH V Y s n/a 20 2792 2800 2812 N
+ JH V Z b n/a 20 2792 2800 2813 N
+ JH V Z s n/a 20 2792 2800 2813 N
+ JH V ZH s n/a 20 2792 2800 2811 N
+ JH W AA b n/a 20 2784 2795 2802 N
+ JH W AA s n/a 20 2784 2795 2802 N
+ JH W AE b n/a 20 2784 2795 2805 N
+ JH W AE s n/a 20 2784 2797 2805 N
+ JH W AH b n/a 20 2784 2795 2802 N
+ JH W AH s n/a 20 2784 2797 2808 N
+ JH W AO b n/a 20 2784 2795 2804 N
+ JH W AO s n/a 20 2784 2795 2804 N
+ JH W AW b n/a 20 2784 2795 2806 N
+ JH W AW s n/a 20 2784 2797 2806 N
+ JH W AY b n/a 20 2784 2795 2802 N
+ JH W AY s n/a 20 2784 2795 2802 N
+ JH W B s n/a 20 2784 2799 2812 N
+ JH W CH s n/a 20 2784 2800 2811 N
+ JH W D s n/a 20 2784 2800 2813 N
+ JH W DH s n/a 20 2784 2800 2813 N
+ JH W EH b n/a 20 2784 2795 2805 N
+ JH W EH s n/a 20 2784 2797 2805 N
+ JH W ER b n/a 20 2784 2795 2810 N
+ JH W ER s n/a 20 2784 2795 2810 N
+ JH W EY b n/a 20 2784 2797 2805 N
+ JH W EY s n/a 20 2784 2797 2805 N
+ JH W F b n/a 20 2784 2799 2812 N
+ JH W F s n/a 20 2784 2799 2812 N
+ JH W G s n/a 20 2784 2799 2812 N
+ JH W HH s n/a 20 2784 2799 2812 N
+ JH W IH b n/a 20 2784 2795 2803 N
+ JH W IH s n/a 20 2784 2797 2807 N
+ JH W IY b n/a 20 2784 2797 2809 N
+ JH W IY s n/a 20 2784 2797 2809 N
+ JH W JH s n/a 20 2784 2800 2811 N
+ JH W K b n/a 20 2784 2799 2812 N
+ JH W K s n/a 20 2784 2799 2812 N
+ JH W L s n/a 20 2784 2799 2812 N
+ JH W M s n/a 20 2784 2799 2812 N
+ JH W N s n/a 20 2784 2800 2813 N
+ JH W NG s n/a 20 2784 2799 2812 N
+ JH W OW b n/a 20 2784 2795 2806 N
+ JH W OW s n/a 20 2784 2795 2806 N
+ JH W OY b n/a 20 2784 2795 2804 N
+ JH W OY s n/a 20 2784 2795 2804 N
+ JH W P b n/a 20 2784 2799 2812 N
+ JH W P s n/a 20 2784 2799 2812 N
+ JH W R s n/a 20 2784 2799 2812 N
+ JH W S b n/a 20 2784 2800 2813 N
+ JH W S s n/a 20 2784 2800 2813 N
+ JH W SH s n/a 20 2784 2800 2811 N
+ JH W SIL s n/a 20 2784 2801 2811 N
+ JH W T s n/a 20 2784 2800 2813 N
+ JH W TH s n/a 20 2784 2800 2813 N
+ JH W UH b n/a 20 2784 2795 2810 N
+ JH W UH s n/a 20 2784 2795 2810 N
+ JH W UW b n/a 20 2784 2795 2810 N
+ JH W UW s n/a 20 2784 2795 2810 N
+ JH W V s n/a 20 2784 2799 2812 N
+ JH W W b n/a 20 2784 2799 2812 N
+ JH W W s n/a 20 2784 2799 2812 N
+ JH W Y b n/a 20 2784 2800 2812 N
+ JH W Y s n/a 20 2784 2800 2812 N
+ JH W Z b n/a 20 2784 2800 2813 N
+ JH W Z s n/a 20 2784 2800 2813 N
+ JH W ZH s n/a 20 2784 2800 2811 N
+ JH Y AA b n/a 20 2789 2795 2802 N
+ JH Y AA s n/a 20 2789 2795 2802 N
+ JH Y AE b n/a 20 2789 2795 2805 N
+ JH Y AE s n/a 20 2789 2797 2805 N
+ JH Y AH b n/a 20 2789 2795 2802 N
+ JH Y AH s n/a 20 2789 2797 2808 N
+ JH Y AO b n/a 20 2789 2795 2804 N
+ JH Y AO s n/a 20 2789 2795 2804 N
+ JH Y AW b n/a 20 2789 2795 2806 N
+ JH Y AW s n/a 20 2789 2797 2806 N
+ JH Y AY b n/a 20 2789 2795 2802 N
+ JH Y AY s n/a 20 2789 2795 2802 N
+ JH Y B s n/a 20 2789 2799 2812 N
+ JH Y CH s n/a 20 2789 2800 2811 N
+ JH Y D s n/a 20 2789 2800 2813 N
+ JH Y DH s n/a 20 2789 2800 2813 N
+ JH Y EH b n/a 20 2789 2795 2805 N
+ JH Y EH s n/a 20 2789 2797 2805 N
+ JH Y ER b n/a 20 2789 2795 2810 N
+ JH Y ER i n/a 20 2789 2795 2810 N
+ JH Y ER s n/a 20 2789 2795 2810 N
+ JH Y EY b n/a 20 2789 2797 2805 N
+ JH Y EY s n/a 20 2789 2797 2805 N
+ JH Y F b n/a 20 2789 2799 2812 N
+ JH Y F s n/a 20 2789 2799 2812 N
+ JH Y G s n/a 20 2789 2799 2812 N
+ JH Y HH s n/a 20 2789 2799 2812 N
+ JH Y IH b n/a 20 2789 2795 2803 N
+ JH Y IH s n/a 20 2789 2797 2807 N
+ JH Y IY b n/a 20 2789 2797 2809 N
+ JH Y IY s n/a 20 2789 2797 2809 N
+ JH Y JH s n/a 20 2789 2800 2811 N
+ JH Y K b n/a 20 2789 2799 2812 N
+ JH Y K s n/a 20 2789 2799 2812 N
+ JH Y L s n/a 20 2789 2799 2812 N
+ JH Y M s n/a 20 2789 2799 2812 N
+ JH Y N s n/a 20 2789 2800 2813 N
+ JH Y NG s n/a 20 2789 2799 2812 N
+ JH Y OW b n/a 20 2789 2795 2806 N
+ JH Y OW s n/a 20 2789 2795 2806 N
+ JH Y OY b n/a 20 2789 2795 2804 N
+ JH Y OY s n/a 20 2789 2795 2804 N
+ JH Y P b n/a 20 2789 2799 2812 N
+ JH Y P s n/a 20 2789 2799 2812 N
+ JH Y R i n/a 20 2789 2799 2812 N
+ JH Y R s n/a 20 2789 2799 2812 N
+ JH Y S b n/a 20 2789 2800 2813 N
+ JH Y S s n/a 20 2789 2800 2813 N
+ JH Y SH s n/a 20 2789 2800 2811 N
+ JH Y SIL s n/a 20 2789 2801 2811 N
+ JH Y T s n/a 20 2789 2800 2813 N
+ JH Y TH s n/a 20 2789 2800 2813 N
+ JH Y UH b n/a 20 2789 2795 2810 N
+ JH Y UH s n/a 20 2789 2795 2810 N
+ JH Y UW b n/a 20 2789 2795 2810 N
+ JH Y UW s n/a 20 2789 2795 2810 N
+ JH Y V s n/a 20 2789 2799 2812 N
+ JH Y W b n/a 20 2789 2799 2812 N
+ JH Y W s n/a 20 2789 2799 2812 N
+ JH Y Y b n/a 20 2789 2800 2812 N
+ JH Y Y s n/a 20 2789 2800 2812 N
+ JH Y Z b n/a 20 2789 2800 2813 N
+ JH Y Z s n/a 20 2789 2800 2813 N
+ JH Y ZH s n/a 20 2789 2800 2811 N
+ JH Z AA b n/a 20 2791 2794 2802 N
+ JH Z AA s n/a 20 2791 2794 2802 N
+ JH Z AE b n/a 20 2791 2794 2805 N
+ JH Z AE s n/a 20 2791 2794 2805 N
+ JH Z AH b n/a 20 2791 2794 2802 N
+ JH Z AH s n/a 20 2791 2794 2808 N
+ JH Z AO b n/a 20 2791 2794 2804 N
+ JH Z AO s n/a 20 2791 2794 2804 N
+ JH Z AW b n/a 20 2791 2794 2806 N
+ JH Z AW s n/a 20 2791 2794 2806 N
+ JH Z AY b n/a 20 2791 2794 2802 N
+ JH Z AY s n/a 20 2791 2794 2802 N
+ JH Z B s n/a 20 2791 2799 2812 N
+ JH Z CH s n/a 20 2791 2800 2811 N
+ JH Z D s n/a 20 2791 2800 2813 N
+ JH Z DH s n/a 20 2791 2800 2813 N
+ JH Z EH b n/a 20 2791 2794 2805 N
+ JH Z EH i n/a 20 2791 2794 2805 N
+ JH Z EH s n/a 20 2791 2794 2805 N
+ JH Z ER b n/a 20 2791 2794 2810 N
+ JH Z ER i n/a 20 2791 2794 2810 N
+ JH Z ER s n/a 20 2791 2794 2810 N
+ JH Z EY b n/a 20 2791 2794 2805 N
+ JH Z EY s n/a 20 2791 2794 2805 N
+ JH Z F b n/a 20 2791 2799 2812 N
+ JH Z F s n/a 20 2791 2799 2812 N
+ JH Z G s n/a 20 2791 2799 2812 N
+ JH Z HH s n/a 20 2791 2799 2812 N
+ JH Z IH b n/a 20 2791 2794 2803 N
+ JH Z IH i n/a 20 2791 2794 2807 N
+ JH Z IH s n/a 20 2791 2794 2807 N
+ JH Z IY b n/a 20 2791 2794 2809 N
+ JH Z IY s n/a 20 2791 2794 2809 N
+ JH Z JH s n/a 20 2791 2800 2811 N
+ JH Z K b n/a 20 2791 2799 2812 N
+ JH Z K s n/a 20 2791 2799 2812 N
+ JH Z L s n/a 20 2791 2799 2812 N
+ JH Z M s n/a 20 2791 2799 2812 N
+ JH Z N s n/a 20 2791 2800 2813 N
+ JH Z NG s n/a 20 2791 2799 2812 N
+ JH Z OW b n/a 20 2791 2794 2806 N
+ JH Z OW s n/a 20 2791 2794 2806 N
+ JH Z OY b n/a 20 2791 2794 2804 N
+ JH Z OY s n/a 20 2791 2794 2804 N
+ JH Z P b n/a 20 2791 2799 2812 N
+ JH Z P s n/a 20 2791 2799 2812 N
+ JH Z R s n/a 20 2791 2799 2812 N
+ JH Z S b n/a 20 2791 2800 2813 N
+ JH Z S s n/a 20 2791 2800 2813 N
+ JH Z SH s n/a 20 2791 2800 2811 N
+ JH Z SIL s n/a 20 2791 2801 2811 N
+ JH Z T s n/a 20 2791 2800 2813 N
+ JH Z TH s n/a 20 2791 2800 2813 N
+ JH Z UH b n/a 20 2791 2794 2810 N
+ JH Z UH s n/a 20 2791 2794 2810 N
+ JH Z UW b n/a 20 2791 2794 2810 N
+ JH Z UW s n/a 20 2791 2794 2810 N
+ JH Z V s n/a 20 2791 2799 2812 N
+ JH Z W b n/a 20 2791 2799 2812 N
+ JH Z W s n/a 20 2791 2799 2812 N
+ JH Z Y b n/a 20 2791 2800 2812 N
+ JH Z Y s n/a 20 2791 2800 2812 N
+ JH Z Z b n/a 20 2791 2800 2813 N
+ JH Z Z s n/a 20 2791 2800 2813 N
+ JH Z ZH s n/a 20 2791 2800 2811 N
+ JH ZH AA b n/a 20 2791 2794 2802 N
+ JH ZH AA s n/a 20 2791 2794 2802 N
+ JH ZH AE b n/a 20 2791 2794 2805 N
+ JH ZH AE s n/a 20 2791 2794 2805 N
+ JH ZH AH b n/a 20 2791 2794 2802 N
+ JH ZH AH s n/a 20 2791 2794 2808 N
+ JH ZH AO b n/a 20 2791 2794 2804 N
+ JH ZH AO s n/a 20 2791 2794 2804 N
+ JH ZH AW b n/a 20 2791 2794 2806 N
+ JH ZH AW s n/a 20 2791 2794 2806 N
+ JH ZH AY b n/a 20 2791 2794 2802 N
+ JH ZH AY s n/a 20 2791 2794 2802 N
+ JH ZH B s n/a 20 2791 2799 2812 N
+ JH ZH CH s n/a 20 2791 2800 2811 N
+ JH ZH D s n/a 20 2791 2800 2813 N
+ JH ZH DH s n/a 20 2791 2800 2813 N
+ JH ZH EH b n/a 20 2791 2794 2805 N
+ JH ZH EH s n/a 20 2791 2794 2805 N
+ JH ZH ER b n/a 20 2791 2794 2810 N
+ JH ZH ER s n/a 20 2791 2794 2810 N
+ JH ZH EY b n/a 20 2791 2794 2805 N
+ JH ZH EY s n/a 20 2791 2794 2805 N
+ JH ZH F b n/a 20 2791 2799 2812 N
+ JH ZH F s n/a 20 2791 2799 2812 N
+ JH ZH G s n/a 20 2791 2799 2812 N
+ JH ZH HH s n/a 20 2791 2799 2812 N
+ JH ZH IH b n/a 20 2791 2794 2803 N
+ JH ZH IH s n/a 20 2791 2794 2807 N
+ JH ZH IY b n/a 20 2791 2794 2809 N
+ JH ZH IY s n/a 20 2791 2794 2809 N
+ JH ZH JH s n/a 20 2791 2800 2811 N
+ JH ZH K b n/a 20 2791 2799 2812 N
+ JH ZH K s n/a 20 2791 2799 2812 N
+ JH ZH L s n/a 20 2791 2799 2812 N
+ JH ZH M s n/a 20 2791 2799 2812 N
+ JH ZH N s n/a 20 2791 2800 2813 N
+ JH ZH NG s n/a 20 2791 2799 2812 N
+ JH ZH OW b n/a 20 2791 2794 2806 N
+ JH ZH OW s n/a 20 2791 2794 2806 N
+ JH ZH OY b n/a 20 2791 2794 2804 N
+ JH ZH OY s n/a 20 2791 2794 2804 N
+ JH ZH P b n/a 20 2791 2799 2812 N
+ JH ZH P s n/a 20 2791 2799 2812 N
+ JH ZH R s n/a 20 2791 2799 2812 N
+ JH ZH S b n/a 20 2791 2800 2813 N
+ JH ZH S s n/a 20 2791 2800 2813 N
+ JH ZH SH s n/a 20 2791 2800 2811 N
+ JH ZH SIL s n/a 20 2791 2801 2811 N
+ JH ZH T s n/a 20 2791 2800 2813 N
+ JH ZH TH s n/a 20 2791 2800 2813 N
+ JH ZH UH b n/a 20 2791 2794 2810 N
+ JH ZH UH s n/a 20 2791 2794 2810 N
+ JH ZH UW b n/a 20 2791 2794 2810 N
+ JH ZH UW s n/a 20 2791 2794 2810 N
+ JH ZH V s n/a 20 2791 2799 2812 N
+ JH ZH W b n/a 20 2791 2799 2812 N
+ JH ZH W s n/a 20 2791 2799 2812 N
+ JH ZH Y b n/a 20 2791 2800 2812 N
+ JH ZH Y s n/a 20 2791 2800 2812 N
+ JH ZH Z b n/a 20 2791 2800 2813 N
+ JH ZH Z s n/a 20 2791 2800 2813 N
+ JH ZH ZH s n/a 20 2791 2800 2811 N
+ K AA AA b n/a 21 2836 2915 2928 N
+ K AA AA e n/a 21 2836 2905 2929 N
+ K AA AA i n/a 21 2836 2915 2928 N
+ K AA AA s n/a 21 2836 2915 2929 N
+ K AA AE b n/a 21 2836 2888 2958 N
+ K AA AE e n/a 21 2836 2888 2963 N
+ K AA AE i n/a 21 2836 2888 2958 N
+ K AA AE s n/a 21 2836 2888 2958 N
+ K AA AH b n/a 21 2836 2874 2931 N
+ K AA AH e n/a 21 2836 2874 2935 N
+ K AA AH i n/a 21 2836 2874 2935 N
+ K AA AH s n/a 21 2836 2874 2935 N
+ K AA AO b n/a 21 2836 2896 2916 N
+ K AA AO e n/a 21 2836 2899 2918 N
+ K AA AO i n/a 21 2836 2899 2917 N
+ K AA AO s n/a 21 2836 2899 2916 N
+ K AA AW b n/a 21 2836 2888 2959 N
+ K AA AW e n/a 21 2836 2888 2963 N
+ K AA AW i n/a 21 2836 2888 2959 N
+ K AA AW s n/a 21 2836 2888 2959 N
+ K AA AY b n/a 21 2836 2915 2930 N
+ K AA AY e n/a 21 2836 2905 2925 N
+ K AA AY i n/a 21 2836 2915 2925 N
+ K AA AY s n/a 21 2836 2915 2925 N
+ K AA B b n/a 21 2836 2903 2945 N
+ K AA B e n/a 21 2836 2903 2945 N
+ K AA B i n/a 21 2836 2903 2945 N
+ K AA B s n/a 21 2836 2903 2945 N
+ K AA CH e n/a 21 2836 2903 2945 N
+ K AA CH i n/a 21 2836 2903 2945 N
+ K AA CH s n/a 21 2836 2903 2945 N
+ K AA D b n/a 21 2836 2903 2945 N
+ K AA D e n/a 21 2836 2903 2945 N
+ K AA D i n/a 21 2836 2903 2945 N
+ K AA D s n/a 21 2836 2903 2945 N
+ K AA DH e n/a 21 2836 2903 2945 N
+ K AA DH i n/a 21 2836 2903 2945 N
+ K AA DH s n/a 21 2836 2903 2945 N
+ K AA EH b n/a 21 2836 2888 2958 N
+ K AA EH e n/a 21 2836 2888 2963 N
+ K AA EH i n/a 21 2836 2888 2958 N
+ K AA EH s n/a 21 2836 2888 2958 N
+ K AA ER b n/a 21 2836 2915 2926 N
+ K AA ER e n/a 21 2836 2915 2936 N
+ K AA ER i n/a 21 2836 2915 2936 N
+ K AA ER s n/a 21 2836 2915 2936 N
+ K AA EY b n/a 21 2836 2888 2960 N
+ K AA EY e n/a 21 2836 2888 2963 N
+ K AA EY i n/a 21 2836 2888 2960 N
+ K AA EY s n/a 21 2836 2888 2960 N
+ K AA F b n/a 21 2836 2903 2952 N
+ K AA F e n/a 21 2836 2903 2952 N
+ K AA F i n/a 21 2836 2903 2952 N
+ K AA F s n/a 21 2836 2903 2952 N
+ K AA G e n/a 21 2836 2903 2945 N
+ K AA G i n/a 21 2836 2903 2945 N
+ K AA G s n/a 21 2836 2903 2945 N
+ K AA HH e n/a 21 2836 2903 2951 N
+ K AA HH i n/a 21 2836 2903 2951 N
+ K AA HH s n/a 21 2836 2903 2951 N
+ K AA IH b n/a 21 2836 2888 2969 N
+ K AA IH e n/a 21 2836 2888 2961 N
+ K AA IH i n/a 21 2836 2888 2961 N
+ K AA IH s n/a 21 2836 2888 2961 N
+ K AA IY b n/a 21 2836 2888 2966 N
+ K AA IY e n/a 21 2836 2888 2961 N
+ K AA IY i n/a 21 2836 2888 2962 N
+ K AA IY s n/a 21 2836 2888 2961 N
+ K AA JH e n/a 21 2836 2903 2945 N
+ K AA JH i n/a 21 2836 2903 2945 N
+ K AA JH s n/a 21 2836 2903 2945 N
+ K AA K b n/a 21 2836 2903 2945 N
+ K AA K e n/a 21 2836 2903 2945 N
+ K AA K i n/a 21 2836 2903 2945 N
+ K AA K s n/a 21 2836 2903 2945 N
+ K AA L b n/a 21 2836 2896 2919 N
+ K AA L e n/a 21 2836 2899 2918 N
+ K AA L i n/a 21 2836 2899 2918 N
+ K AA L s n/a 21 2836 2899 2918 N
+ K AA M b n/a 21 2836 2903 2947 N
+ K AA M e n/a 21 2836 2903 2947 N
+ K AA M i n/a 21 2836 2903 2947 N
+ K AA M s n/a 21 2836 2903 2947 N
+ K AA N b n/a 21 2836 2903 2947 N
+ K AA N e n/a 21 2836 2903 2947 N
+ K AA N i n/a 21 2836 2903 2947 N
+ K AA N s n/a 21 2836 2903 2947 N
+ K AA NG b n/a 21 2836 2903 2947 N
+ K AA NG e n/a 21 2836 2903 2947 N
+ K AA NG s n/a 21 2836 2903 2947 N
+ K AA OW b n/a 21 2836 2915 2927 N
+ K AA OW e n/a 21 2836 2915 2924 N
+ K AA OW i n/a 21 2836 2915 2924 N
+ K AA OW s n/a 21 2836 2915 2924 N
+ K AA OY b n/a 21 2836 2896 2916 N
+ K AA OY e n/a 21 2836 2899 2918 N
+ K AA OY s n/a 21 2836 2899 2916 N
+ K AA P b n/a 21 2836 2903 2945 N
+ K AA P e n/a 21 2836 2903 2945 N
+ K AA P i n/a 21 2836 2903 2945 N
+ K AA P s n/a 21 2836 2903 2945 N
+ K AA R b n/a 21 2836 2898 2923 N
+ K AA R e n/a 21 2836 2899 2922 N
+ K AA R i n/a 21 2836 2899 2922 N
+ K AA R s n/a 21 2836 2899 2922 N
+ K AA S b n/a 21 2836 2903 2955 N
+ K AA S e n/a 21 2836 2903 2955 N
+ K AA S i n/a 21 2836 2903 2955 N
+ K AA S s n/a 21 2836 2903 2955 N
+ K AA SH b n/a 21 2836 2903 2956 N
+ K AA SH e n/a 21 2836 2903 2956 N
+ K AA SH i n/a 21 2836 2903 2956 N
+ K AA SH s n/a 21 2836 2903 2956 N
+ K AA SIL e n/a 21 2836 2903 2950 N
+ K AA SIL s n/a 21 2836 2903 2950 N
+ K AA T b n/a 21 2836 2903 2945 N
+ K AA T e n/a 21 2836 2903 2945 N
+ K AA T i n/a 21 2836 2903 2945 N
+ K AA T s n/a 21 2836 2903 2945 N
+ K AA TH e n/a 21 2836 2903 2950 N
+ K AA TH i n/a 21 2836 2903 2950 N
+ K AA TH s n/a 21 2836 2903 2950 N
+ K AA UH b n/a 21 2836 2915 2934 N
+ K AA UH e n/a 21 2836 2915 2936 N
+ K AA UH i n/a 21 2836 2915 2936 N
+ K AA UH s n/a 21 2836 2915 2936 N
+ K AA UW b n/a 21 2836 2915 2927 N
+ K AA UW e n/a 21 2836 2915 2926 N
+ K AA UW i n/a 21 2836 2915 2926 N
+ K AA UW s n/a 21 2836 2915 2926 N
+ K AA V b n/a 21 2836 2903 2945 N
+ K AA V e n/a 21 2836 2903 2945 N
+ K AA V i n/a 21 2836 2903 2945 N
+ K AA V s n/a 21 2836 2903 2945 N
+ K AA W b n/a 21 2836 2892 2921 N
+ K AA W e n/a 21 2836 2905 2920 N
+ K AA W i n/a 21 2836 2892 2920 N
+ K AA W s n/a 21 2836 2892 2921 N
+ K AA Y b n/a 21 2836 2888 2965 N
+ K AA Y e n/a 21 2836 2888 2965 N
+ K AA Y i n/a 21 2836 2888 2965 N
+ K AA Y s n/a 21 2836 2888 2965 N
+ K AA Z e n/a 21 2836 2903 2955 N
+ K AA Z i n/a 21 2836 2903 2955 N
+ K AA Z s n/a 21 2836 2903 2955 N
+ K AA ZH e n/a 21 2836 2903 2956 N
+ K AA ZH i n/a 21 2836 2903 2956 N
+ K AA ZH s n/a 21 2836 2903 2956 N
+ K AE AA b n/a 21 2839 2908 2928 N
+ K AE AA e n/a 21 2839 2906 2929 N
+ K AE AA i n/a 21 2839 2908 2928 N
+ K AE AA s n/a 21 2839 2908 2929 N
+ K AE AE b n/a 21 2839 2889 2958 N
+ K AE AE e n/a 21 2839 2889 2963 N
+ K AE AE i n/a 21 2839 2889 2958 N
+ K AE AE s n/a 21 2839 2889 2958 N
+ K AE AH b n/a 21 2839 2855 2931 N
+ K AE AH e n/a 21 2839 2855 2940 N
+ K AE AH i n/a 21 2839 2855 2940 N
+ K AE AH s n/a 21 2839 2855 2940 N
+ K AE AO b n/a 21 2839 2896 2916 N
+ K AE AO e n/a 21 2839 2900 2918 N
+ K AE AO i n/a 21 2839 2900 2917 N
+ K AE AO s n/a 21 2839 2900 2916 N
+ K AE AW b n/a 21 2839 2889 2959 N
+ K AE AW e n/a 21 2839 2889 2963 N
+ K AE AW i n/a 21 2839 2889 2959 N
+ K AE AW s n/a 21 2839 2889 2959 N
+ K AE AY b n/a 21 2839 2910 2930 N
+ K AE AY e n/a 21 2839 2906 2925 N
+ K AE AY i n/a 21 2839 2910 2925 N
+ K AE AY s n/a 21 2839 2910 2925 N
+ K AE B b n/a 21 2840 2855 2946 N
+ K AE B e n/a 21 2840 2855 2946 N
+ K AE B i n/a 21 2840 2855 2946 N
+ K AE B s n/a 21 2840 2855 2946 N
+ K AE CH e n/a 21 2840 2856 2943 N
+ K AE CH i n/a 21 2840 2856 2943 N
+ K AE CH s n/a 21 2840 2856 2943 N
+ K AE D b n/a 21 2840 2862 2946 N
+ K AE D e n/a 21 2840 2862 2946 N
+ K AE D i n/a 21 2840 2862 2946 N
+ K AE D s n/a 21 2840 2862 2946 N
+ K AE DH e n/a 21 2839 2855 2946 N
+ K AE DH s n/a 21 2839 2855 2946 N
+ K AE EH b n/a 21 2839 2889 2958 N
+ K AE EH e n/a 21 2839 2889 2963 N
+ K AE EH i n/a 21 2839 2889 2958 N
+ K AE EH s n/a 21 2839 2889 2958 N
+ K AE ER b n/a 21 2839 2915 2926 N
+ K AE ER e n/a 21 2839 2915 2936 N
+ K AE ER i n/a 21 2839 2915 2936 N
+ K AE ER s n/a 21 2839 2915 2936 N
+ K AE EY b n/a 21 2839 2889 2960 N
+ K AE EY e n/a 21 2839 2889 2963 N
+ K AE EY i n/a 21 2839 2889 2960 N
+ K AE EY s n/a 21 2839 2889 2960 N
+ K AE F b n/a 21 2839 2855 2952 N
+ K AE F e n/a 21 2839 2855 2952 N
+ K AE F i n/a 21 2839 2855 2952 N
+ K AE F s n/a 21 2839 2855 2952 N
+ K AE G e n/a 21 2840 2855 2946 N
+ K AE G i n/a 21 2840 2855 2946 N
+ K AE G s n/a 21 2840 2855 2946 N
+ K AE HH e n/a 21 2839 2855 2951 N
+ K AE HH i n/a 21 2839 2855 2951 N
+ K AE HH s n/a 21 2839 2855 2951 N
+ K AE IH b n/a 21 2839 2889 2969 N
+ K AE IH e n/a 21 2839 2889 2961 N
+ K AE IH i n/a 21 2839 2889 2967 N
+ K AE IH s n/a 21 2839 2889 2961 N
+ K AE IY b n/a 21 2839 2889 2966 N
+ K AE IY e n/a 21 2839 2889 2961 N
+ K AE IY i n/a 21 2839 2889 2967 N
+ K AE IY s n/a 21 2839 2889 2961 N
+ K AE JH e n/a 21 2840 2857 2946 N
+ K AE JH i n/a 21 2840 2857 2946 N
+ K AE JH s n/a 21 2840 2857 2946 N
+ K AE K b n/a 21 2840 2855 2942 N
+ K AE K e n/a 21 2840 2855 2942 N
+ K AE K i n/a 21 2840 2855 2942 N
+ K AE K s n/a 21 2840 2855 2942 N
+ K AE L b n/a 21 2839 2897 2919 N
+ K AE L e n/a 21 2839 2900 2918 N
+ K AE L i n/a 21 2839 2900 2918 N
+ K AE L s n/a 21 2839 2900 2918 N
+ K AE M b n/a 21 2839 2855 2947 N
+ K AE M e n/a 21 2839 2855 2947 N
+ K AE M i n/a 21 2839 2855 2947 N
+ K AE M s n/a 21 2839 2855 2947 N
+ K AE N b n/a 21 2839 2862 2947 N
+ K AE N e n/a 21 2839 2862 2947 N
+ K AE N i n/a 21 2839 2862 2947 N
+ K AE N s n/a 21 2839 2862 2947 N
+ K AE NG b n/a 21 2839 2855 2947 N
+ K AE NG e n/a 21 2839 2855 2947 N
+ K AE NG s n/a 21 2839 2855 2947 N
+ K AE OW b n/a 21 2839 2915 2927 N
+ K AE OW e n/a 21 2839 2915 2925 N
+ K AE OW i n/a 21 2839 2915 2925 N
+ K AE OW s n/a 21 2839 2915 2925 N
+ K AE OY b n/a 21 2839 2896 2916 N
+ K AE OY e n/a 21 2839 2900 2918 N
+ K AE OY i n/a 21 2839 2900 2917 N
+ K AE OY s n/a 21 2839 2900 2916 N
+ K AE P b n/a 21 2840 2855 2942 N
+ K AE P e n/a 21 2840 2855 2942 N
+ K AE P i n/a 21 2840 2855 2942 N
+ K AE P s n/a 21 2840 2855 2942 N
+ K AE R b n/a 21 2839 2898 2923 N
+ K AE R e n/a 21 2839 2900 2922 N
+ K AE R i n/a 21 2839 2900 2922 N
+ K AE R s n/a 21 2839 2900 2922 N
+ K AE S b n/a 21 2839 2867 2954 N
+ K AE S e n/a 21 2839 2867 2954 N
+ K AE S i n/a 21 2839 2867 2954 N
+ K AE S s n/a 21 2839 2867 2954 N
+ K AE SH b n/a 21 2840 2856 2956 N
+ K AE SH e n/a 21 2840 2856 2956 N
+ K AE SH i n/a 21 2840 2856 2956 N
+ K AE SH s n/a 21 2840 2856 2956 N
+ K AE SIL e n/a 21 2839 2855 2949 N
+ K AE SIL s n/a 21 2839 2855 2949 N
+ K AE T b n/a 21 2840 2862 2942 N
+ K AE T e n/a 21 2840 2862 2942 N
+ K AE T i n/a 21 2840 2862 2942 N
+ K AE T s n/a 21 2840 2862 2942 N
+ K AE TH e n/a 21 2839 2855 2949 N
+ K AE TH i n/a 21 2839 2855 2949 N
+ K AE TH s n/a 21 2839 2855 2949 N
+ K AE UH b n/a 21 2839 2915 2934 N
+ K AE UH e n/a 21 2839 2915 2936 N
+ K AE UH i n/a 21 2839 2915 2936 N
+ K AE UH s n/a 21 2839 2915 2936 N
+ K AE UW b n/a 21 2839 2915 2927 N
+ K AE UW e n/a 21 2839 2915 2926 N
+ K AE UW i n/a 21 2839 2915 2926 N
+ K AE UW s n/a 21 2839 2915 2926 N
+ K AE V b n/a 21 2839 2855 2946 N
+ K AE V e n/a 21 2839 2855 2946 N
+ K AE V i n/a 21 2839 2855 2946 N
+ K AE V s n/a 21 2839 2855 2946 N
+ K AE W b n/a 21 2839 2891 2921 N
+ K AE W e n/a 21 2839 2906 2920 N
+ K AE W i n/a 21 2839 2891 2920 N
+ K AE W s n/a 21 2839 2891 2921 N
+ K AE Y b n/a 21 2839 2889 2965 N
+ K AE Y e n/a 21 2839 2889 2965 N
+ K AE Y i n/a 21 2839 2889 2965 N
+ K AE Y s n/a 21 2839 2889 2965 N
+ K AE Z e n/a 21 2839 2865 2954 N
+ K AE Z i n/a 21 2839 2865 2954 N
+ K AE Z s n/a 21 2839 2865 2954 N
+ K AE ZH e n/a 21 2840 2857 2956 N
+ K AE ZH s n/a 21 2840 2857 2956 N
+ K AH AA b n/a 21 2843 2908 2928 N
+ K AH AA e n/a 21 2841 2906 2929 N
+ K AH AA i n/a 21 2841 2908 2928 N
+ K AH AA s n/a 21 2841 2908 2929 N
+ K AH AE b n/a 21 2847 2881 2958 N
+ K AH AE e n/a 21 2847 2883 2963 N
+ K AH AE i n/a 21 2847 2881 2958 N
+ K AH AE s n/a 21 2847 2881 2958 N
+ K AH AH b n/a 21 2846 2878 2931 N
+ K AH AH e n/a 21 2841 2875 2937 N
+ K AH AH i n/a 21 2841 2873 2938 N
+ K AH AH s n/a 21 2841 2873 2937 N
+ K AH AO b n/a 21 2842 2896 2917 N
+ K AH AO e n/a 21 2841 2896 2918 N
+ K AH AO i n/a 21 2841 2896 2917 N
+ K AH AO s n/a 21 2841 2896 2917 N
+ K AH AW b n/a 21 2847 2881 2959 N
+ K AH AW e n/a 21 2847 2883 2963 N
+ K AH AW i n/a 21 2847 2881 2959 N
+ K AH AW s n/a 21 2847 2881 2959 N
+ K AH AY b n/a 21 2843 2910 2930 N
+ K AH AY e n/a 21 2841 2906 2925 N
+ K AH AY i n/a 21 2841 2910 2925 N
+ K AH AY s n/a 21 2841 2910 2925 N
+ K AH B b n/a 21 2844 2859 2944 N
+ K AH B e n/a 21 2844 2859 2944 N
+ K AH B i n/a 21 2844 2859 2944 N
+ K AH B s n/a 21 2844 2859 2944 N
+ K AH CH e n/a 21 2844 2858 2943 N
+ K AH CH i n/a 21 2844 2858 2943 N
+ K AH CH s n/a 21 2844 2858 2943 N
+ K AH D b n/a 21 2844 2864 2944 N
+ K AH D e n/a 21 2844 2864 2944 N
+ K AH D i n/a 21 2844 2864 2944 N
+ K AH D s n/a 21 2844 2864 2944 N
+ K AH DH e n/a 21 2844 2859 2944 N
+ K AH DH s n/a 21 2844 2859 2944 N
+ K AH EH b n/a 21 2847 2881 2958 N
+ K AH EH e n/a 21 2847 2883 2963 N
+ K AH EH i n/a 21 2847 2881 2958 N
+ K AH EH s n/a 21 2847 2881 2958 N
+ K AH ER b n/a 21 2843 2913 2926 N
+ K AH ER e n/a 21 2841 2915 2934 N
+ K AH ER i n/a 21 2841 2915 2934 N
+ K AH ER s n/a 21 2841 2915 2934 N
+ K AH EY b n/a 21 2847 2881 2960 N
+ K AH EY e n/a 21 2847 2883 2963 N
+ K AH EY i n/a 21 2847 2881 2960 N
+ K AH EY s n/a 21 2847 2881 2960 N
+ K AH F b n/a 21 2844 2859 2952 N
+ K AH F e n/a 21 2844 2859 2952 N
+ K AH F i n/a 21 2844 2859 2952 N
+ K AH F s n/a 21 2844 2859 2952 N
+ K AH G e n/a 21 2844 2859 2944 N
+ K AH G i n/a 21 2844 2859 2944 N
+ K AH G s n/a 21 2844 2859 2944 N
+ K AH HH e n/a 21 2844 2859 2951 N
+ K AH HH i n/a 21 2844 2859 2951 N
+ K AH HH s n/a 21 2844 2859 2951 N
+ K AH IH b n/a 21 2847 2881 2969 N
+ K AH IH e n/a 21 2841 2883 2961 N
+ K AH IH i n/a 21 2841 2883 2967 N
+ K AH IH s n/a 21 2841 2881 2961 N
+ K AH IY b n/a 21 2847 2881 2966 N
+ K AH IY e n/a 21 2847 2883 2961 N
+ K AH IY i n/a 21 2847 2883 2968 N
+ K AH IY s n/a 21 2847 2881 2961 N
+ K AH JH e n/a 21 2844 2858 2944 N
+ K AH JH i n/a 21 2844 2858 2944 N
+ K AH JH s n/a 21 2844 2858 2944 N
+ K AH K b n/a 21 2844 2859 2941 N
+ K AH K e n/a 21 2844 2859 2941 N
+ K AH K i n/a 21 2844 2859 2941 N
+ K AH K s n/a 21 2844 2859 2941 N
+ K AH L b n/a 21 2842 2897 2919 N
+ K AH L e n/a 21 2841 2897 2918 N
+ K AH L i n/a 21 2841 2897 2918 N
+ K AH L s n/a 21 2841 2897 2918 N
+ K AH M b n/a 21 2844 2859 2947 N
+ K AH M e n/a 21 2844 2859 2947 N
+ K AH M i n/a 21 2844 2859 2947 N
+ K AH M s n/a 21 2844 2859 2947 N
+ K AH N b n/a 21 2844 2864 2947 N
+ K AH N e n/a 21 2844 2864 2947 N
+ K AH N i n/a 21 2844 2864 2947 N
+ K AH N s n/a 21 2844 2864 2947 N
+ K AH NG b n/a 21 2844 2859 2947 N
+ K AH NG e n/a 21 2844 2859 2947 N
+ K AH NG s n/a 21 2844 2859 2947 N
+ K AH OW b n/a 21 2843 2913 2927 N
+ K AH OW e n/a 21 2841 2915 2925 N
+ K AH OW i n/a 21 2841 2915 2925 N
+ K AH OW s n/a 21 2841 2915 2925 N
+ K AH OY b n/a 21 2842 2896 2917 N
+ K AH OY e n/a 21 2841 2896 2918 N
+ K AH OY i n/a 21 2841 2896 2917 N
+ K AH OY s n/a 21 2841 2896 2917 N
+ K AH P b n/a 21 2844 2859 2941 N
+ K AH P e n/a 21 2844 2859 2941 N
+ K AH P i n/a 21 2844 2859 2941 N
+ K AH P s n/a 21 2844 2859 2941 N
+ K AH R b n/a 21 2842 2898 2923 N
+ K AH R e n/a 21 2841 2898 2922 N
+ K AH R i n/a 21 2841 2898 2923 N
+ K AH R s n/a 21 2841 2898 2922 N
+ K AH S b n/a 21 2846 2869 2955 N
+ K AH S e n/a 21 2845 2869 2955 N
+ K AH S i n/a 21 2845 2869 2955 N
+ K AH S s n/a 21 2845 2869 2955 N
+ K AH SH b n/a 21 2844 2858 2956 N
+ K AH SH e n/a 21 2844 2858 2956 N
+ K AH SH i n/a 21 2844 2858 2956 N
+ K AH SH s n/a 21 2844 2858 2956 N
+ K AH SIL e n/a 21 2844 2859 2949 N
+ K AH SIL s n/a 21 2844 2859 2949 N
+ K AH T b n/a 21 2844 2864 2941 N
+ K AH T e n/a 21 2844 2864 2941 N
+ K AH T i n/a 21 2844 2864 2941 N
+ K AH T s n/a 21 2844 2864 2941 N
+ K AH TH e n/a 21 2844 2859 2949 N
+ K AH TH i n/a 21 2844 2859 2949 N
+ K AH TH s n/a 21 2844 2859 2949 N
+ K AH UH b n/a 21 2843 2913 2934 N
+ K AH UH e n/a 21 2841 2915 2934 N
+ K AH UH i n/a 21 2841 2915 2934 N
+ K AH UH s n/a 21 2841 2915 2934 N
+ K AH UW b n/a 21 2843 2913 2927 N
+ K AH UW e n/a 21 2841 2915 2926 N
+ K AH UW i n/a 21 2841 2915 2926 N
+ K AH UW s n/a 21 2841 2915 2926 N
+ K AH V b n/a 21 2844 2859 2944 N
+ K AH V e n/a 21 2844 2859 2944 N
+ K AH V i n/a 21 2844 2859 2944 N
+ K AH V s n/a 21 2844 2859 2944 N
+ K AH W b n/a 21 2842 2892 2921 N
+ K AH W e n/a 21 2841 2906 2920 N
+ K AH W i n/a 21 2841 2892 2921 N
+ K AH W s n/a 21 2841 2892 2921 N
+ K AH Y b n/a 21 2847 2884 2965 N
+ K AH Y e n/a 21 2847 2884 2965 N
+ K AH Y i n/a 21 2847 2884 2965 N
+ K AH Y s n/a 21 2847 2884 2965 N
+ K AH Z e n/a 21 2845 2865 2955 N
+ K AH Z i n/a 21 2845 2865 2955 N
+ K AH Z s n/a 21 2845 2865 2955 N
+ K AH ZH e n/a 21 2844 2858 2956 N
+ K AH ZH s n/a 21 2844 2858 2956 N
+ K AO AA b n/a 21 2836 2915 2928 N
+ K AO AA e n/a 21 2836 2905 2929 N
+ K AO AA i n/a 21 2836 2915 2928 N
+ K AO AA s n/a 21 2836 2915 2929 N
+ K AO AE b n/a 21 2836 2888 2958 N
+ K AO AE e n/a 21 2836 2888 2963 N
+ K AO AE i n/a 21 2836 2888 2958 N
+ K AO AE s n/a 21 2836 2888 2958 N
+ K AO AH b n/a 21 2836 2874 2931 N
+ K AO AH e n/a 21 2836 2874 2935 N
+ K AO AH i n/a 21 2836 2874 2935 N
+ K AO AH s n/a 21 2836 2874 2935 N
+ K AO AO b n/a 21 2836 2896 2916 N
+ K AO AO e n/a 21 2836 2899 2918 N
+ K AO AO i n/a 21 2836 2899 2917 N
+ K AO AO s n/a 21 2836 2899 2916 N
+ K AO AW b n/a 21 2836 2888 2959 N
+ K AO AW e n/a 21 2836 2888 2963 N
+ K AO AW i n/a 21 2836 2888 2959 N
+ K AO AW s n/a 21 2836 2888 2959 N
+ K AO AY b n/a 21 2836 2915 2930 N
+ K AO AY e n/a 21 2836 2905 2925 N
+ K AO AY i n/a 21 2836 2915 2925 N
+ K AO AY s n/a 21 2836 2915 2925 N
+ K AO B b n/a 21 2836 2903 2945 N
+ K AO B e n/a 21 2836 2903 2945 N
+ K AO B i n/a 21 2836 2903 2945 N
+ K AO B s n/a 21 2836 2903 2945 N
+ K AO CH e n/a 21 2836 2903 2945 N
+ K AO CH s n/a 21 2836 2903 2945 N
+ K AO D b n/a 21 2836 2903 2945 N
+ K AO D e n/a 21 2836 2903 2945 N
+ K AO D i n/a 21 2836 2903 2945 N
+ K AO D s n/a 21 2836 2903 2945 N
+ K AO DH e n/a 21 2836 2903 2945 N
+ K AO DH s n/a 21 2836 2903 2945 N
+ K AO EH b n/a 21 2836 2888 2958 N
+ K AO EH e n/a 21 2836 2888 2963 N
+ K AO EH s n/a 21 2836 2888 2958 N
+ K AO ER b n/a 21 2836 2915 2926 N
+ K AO ER e n/a 21 2836 2915 2936 N
+ K AO ER i n/a 21 2836 2915 2936 N
+ K AO ER s n/a 21 2836 2915 2936 N
+ K AO EY b n/a 21 2836 2888 2960 N
+ K AO EY e n/a 21 2836 2888 2963 N
+ K AO EY i n/a 21 2836 2888 2960 N
+ K AO EY s n/a 21 2836 2888 2960 N
+ K AO F b n/a 21 2836 2903 2952 N
+ K AO F e n/a 21 2836 2903 2952 N
+ K AO F s n/a 21 2836 2903 2952 N
+ K AO G e n/a 21 2836 2903 2945 N
+ K AO G s n/a 21 2836 2903 2945 N
+ K AO HH e n/a 21 2836 2903 2951 N
+ K AO HH i n/a 21 2836 2903 2951 N
+ K AO HH s n/a 21 2836 2903 2951 N
+ K AO IH b n/a 21 2836 2888 2969 N
+ K AO IH e n/a 21 2836 2888 2961 N
+ K AO IH i n/a 21 2836 2888 2961 N
+ K AO IH s n/a 21 2836 2888 2961 N
+ K AO IY b n/a 21 2836 2888 2966 N
+ K AO IY e n/a 21 2836 2888 2961 N
+ K AO IY i n/a 21 2836 2888 2962 N
+ K AO IY s n/a 21 2836 2888 2961 N
+ K AO JH e n/a 21 2836 2903 2945 N
+ K AO JH s n/a 21 2836 2903 2945 N
+ K AO K b n/a 21 2836 2903 2945 N
+ K AO K e n/a 21 2836 2903 2945 N
+ K AO K s n/a 21 2836 2903 2945 N
+ K AO L b n/a 21 2836 2896 2919 N
+ K AO L e n/a 21 2836 2899 2918 N
+ K AO L i n/a 21 2836 2899 2918 N
+ K AO L s n/a 21 2836 2899 2918 N
+ K AO M b n/a 21 2836 2903 2947 N
+ K AO M e n/a 21 2836 2903 2947 N
+ K AO M i n/a 21 2836 2903 2947 N
+ K AO M s n/a 21 2836 2903 2947 N
+ K AO N b n/a 21 2836 2903 2947 N
+ K AO N e n/a 21 2836 2903 2947 N
+ K AO N i n/a 21 2836 2903 2947 N
+ K AO N s n/a 21 2836 2903 2947 N
+ K AO NG b n/a 21 2836 2903 2947 N
+ K AO NG e n/a 21 2836 2903 2947 N
+ K AO NG s n/a 21 2836 2903 2947 N
+ K AO OW b n/a 21 2836 2915 2927 N
+ K AO OW e n/a 21 2836 2915 2924 N
+ K AO OW i n/a 21 2836 2915 2924 N
+ K AO OW s n/a 21 2836 2915 2924 N
+ K AO OY b n/a 21 2836 2896 2916 N
+ K AO OY e n/a 21 2836 2899 2918 N
+ K AO OY s n/a 21 2836 2899 2916 N
+ K AO P b n/a 21 2836 2903 2945 N
+ K AO P e n/a 21 2836 2903 2945 N
+ K AO P s n/a 21 2836 2903 2945 N
+ K AO R b n/a 21 2836 2898 2923 N
+ K AO R e n/a 21 2836 2899 2922 N
+ K AO R i n/a 21 2836 2899 2922 N
+ K AO R s n/a 21 2836 2899 2922 N
+ K AO S b n/a 21 2836 2903 2955 N
+ K AO S e n/a 21 2836 2903 2955 N
+ K AO S i n/a 21 2836 2903 2955 N
+ K AO S s n/a 21 2836 2903 2955 N
+ K AO SH b n/a 21 2836 2903 2956 N
+ K AO SH e n/a 21 2836 2903 2956 N
+ K AO SH i n/a 21 2836 2903 2956 N
+ K AO SH s n/a 21 2836 2903 2956 N
+ K AO SIL e n/a 21 2836 2903 2950 N
+ K AO SIL s n/a 21 2836 2903 2950 N
+ K AO T b n/a 21 2836 2903 2945 N
+ K AO T e n/a 21 2836 2903 2945 N
+ K AO T i n/a 21 2836 2903 2945 N
+ K AO T s n/a 21 2836 2903 2945 N
+ K AO TH e n/a 21 2836 2903 2950 N
+ K AO TH s n/a 21 2836 2903 2950 N
+ K AO UH b n/a 21 2836 2915 2934 N
+ K AO UH e n/a 21 2836 2915 2936 N
+ K AO UH s n/a 21 2836 2915 2936 N
+ K AO UW b n/a 21 2836 2915 2927 N
+ K AO UW e n/a 21 2836 2915 2926 N
+ K AO UW s n/a 21 2836 2915 2926 N
+ K AO V b n/a 21 2836 2903 2945 N
+ K AO V e n/a 21 2836 2903 2945 N
+ K AO V s n/a 21 2836 2903 2945 N
+ K AO W b n/a 21 2836 2892 2921 N
+ K AO W e n/a 21 2836 2905 2920 N
+ K AO W i n/a 21 2836 2892 2920 N
+ K AO W s n/a 21 2836 2892 2921 N
+ K AO Y b n/a 21 2836 2888 2965 N
+ K AO Y e n/a 21 2836 2888 2965 N
+ K AO Y i n/a 21 2836 2888 2965 N
+ K AO Y s n/a 21 2836 2888 2965 N
+ K AO Z e n/a 21 2836 2903 2955 N
+ K AO Z s n/a 21 2836 2903 2955 N
+ K AO ZH e n/a 21 2836 2903 2956 N
+ K AO ZH s n/a 21 2836 2903 2956 N
+ K AW AA b n/a 21 2829 2915 2928 N
+ K AW AA e n/a 21 2829 2905 2929 N
+ K AW AA s n/a 21 2829 2915 2929 N
+ K AW AE b n/a 21 2830 2887 2958 N
+ K AW AE e n/a 21 2830 2887 2963 N
+ K AW AE i n/a 21 2830 2887 2958 N
+ K AW AE s n/a 21 2830 2887 2958 N
+ K AW AH b n/a 21 2830 2874 2933 N
+ K AW AH e n/a 21 2830 2874 2940 N
+ K AW AH i n/a 21 2830 2874 2940 N
+ K AW AH s n/a 21 2830 2874 2940 N
+ K AW AO b n/a 21 2829 2896 2916 N
+ K AW AO e n/a 21 2829 2899 2918 N
+ K AW AO s n/a 21 2829 2899 2916 N
+ K AW AW b n/a 21 2829 2887 2959 N
+ K AW AW e n/a 21 2829 2887 2963 N
+ K AW AW s n/a 21 2829 2887 2959 N
+ K AW AY b n/a 21 2830 2915 2930 N
+ K AW AY e n/a 21 2830 2905 2925 N
+ K AW AY s n/a 21 2830 2915 2925 N
+ K AW B b n/a 21 2830 2903 2945 N
+ K AW B e n/a 21 2830 2903 2945 N
+ K AW B s n/a 21 2830 2903 2945 N
+ K AW CH e n/a 21 2830 2903 2945 N
+ K AW CH s n/a 21 2830 2903 2945 N
+ K AW D b n/a 21 2830 2903 2945 N
+ K AW D e n/a 21 2830 2903 2945 N
+ K AW D s n/a 21 2830 2903 2945 N
+ K AW DH e n/a 21 2830 2903 2945 N
+ K AW DH s n/a 21 2830 2903 2945 N
+ K AW EH b n/a 21 2830 2887 2958 N
+ K AW EH e n/a 21 2830 2887 2963 N
+ K AW EH s n/a 21 2830 2887 2958 N
+ K AW ER b n/a 21 2829 2915 2926 N
+ K AW ER e n/a 21 2829 2915 2936 N
+ K AW ER i n/a 21 2829 2915 2936 N
+ K AW ER s n/a 21 2829 2915 2936 N
+ K AW EY b n/a 21 2830 2887 2960 N
+ K AW EY e n/a 21 2830 2887 2963 N
+ K AW EY s n/a 21 2830 2887 2960 N
+ K AW F b n/a 21 2830 2903 2952 N
+ K AW F e n/a 21 2830 2903 2952 N
+ K AW F s n/a 21 2830 2903 2952 N
+ K AW G e n/a 21 2830 2903 2945 N
+ K AW G s n/a 21 2830 2903 2945 N
+ K AW HH e n/a 21 2830 2903 2951 N
+ K AW HH s n/a 21 2830 2903 2951 N
+ K AW IH b n/a 21 2830 2887 2969 N
+ K AW IH e n/a 21 2830 2887 2961 N
+ K AW IH i n/a 21 2830 2887 2961 N
+ K AW IH s n/a 21 2830 2887 2961 N
+ K AW IY b n/a 21 2830 2887 2966 N
+ K AW IY e n/a 21 2830 2887 2961 N
+ K AW IY s n/a 21 2830 2887 2961 N
+ K AW JH e n/a 21 2830 2903 2945 N
+ K AW JH s n/a 21 2830 2903 2945 N
+ K AW K b n/a 21 2830 2903 2945 N
+ K AW K e n/a 21 2830 2903 2945 N
+ K AW K s n/a 21 2830 2903 2945 N
+ K AW L b n/a 21 2829 2896 2919 N
+ K AW L e n/a 21 2829 2899 2918 N
+ K AW L i n/a 21 2829 2899 2918 N
+ K AW L s n/a 21 2829 2899 2918 N
+ K AW M b n/a 21 2830 2903 2947 N
+ K AW M e n/a 21 2830 2903 2947 N
+ K AW M s n/a 21 2830 2903 2947 N
+ K AW N b n/a 21 2830 2903 2947 N
+ K AW N e n/a 21 2830 2903 2947 N
+ K AW N i n/a 21 2830 2903 2947 N
+ K AW N s n/a 21 2830 2903 2947 N
+ K AW NG b n/a 21 2830 2903 2947 N
+ K AW NG e n/a 21 2830 2903 2947 N
+ K AW NG s n/a 21 2830 2903 2947 N
+ K AW OW b n/a 21 2829 2915 2927 N
+ K AW OW e n/a 21 2829 2915 2924 N
+ K AW OW i n/a 21 2829 2915 2924 N
+ K AW OW s n/a 21 2829 2915 2924 N
+ K AW OY b n/a 21 2830 2896 2916 N
+ K AW OY e n/a 21 2830 2899 2918 N
+ K AW OY s n/a 21 2830 2899 2916 N
+ K AW P b n/a 21 2830 2903 2945 N
+ K AW P e n/a 21 2830 2903 2945 N
+ K AW P s n/a 21 2830 2903 2945 N
+ K AW R b n/a 21 2829 2898 2923 N
+ K AW R e n/a 21 2829 2899 2922 N
+ K AW R i n/a 21 2829 2899 2922 N
+ K AW R s n/a 21 2829 2899 2922 N
+ K AW S b n/a 21 2830 2903 2955 N
+ K AW S e n/a 21 2830 2903 2955 N
+ K AW S i n/a 21 2830 2903 2955 N
+ K AW S s n/a 21 2830 2903 2955 N
+ K AW SH b n/a 21 2830 2903 2956 N
+ K AW SH e n/a 21 2830 2903 2956 N
+ K AW SH s n/a 21 2830 2903 2956 N
+ K AW SIL e n/a 21 2830 2903 2950 N
+ K AW SIL s n/a 21 2830 2903 2950 N
+ K AW T b n/a 21 2830 2903 2945 N
+ K AW T e n/a 21 2830 2903 2945 N
+ K AW T i n/a 21 2830 2903 2945 N
+ K AW T s n/a 21 2830 2903 2945 N
+ K AW TH e n/a 21 2830 2903 2950 N
+ K AW TH s n/a 21 2830 2903 2950 N
+ K AW UH b n/a 21 2829 2915 2934 N
+ K AW UH e n/a 21 2829 2915 2936 N
+ K AW UH s n/a 21 2829 2915 2936 N
+ K AW UW b n/a 21 2829 2915 2927 N
+ K AW UW e n/a 21 2829 2915 2926 N
+ K AW UW i n/a 21 2829 2915 2926 N
+ K AW UW s n/a 21 2829 2915 2926 N
+ K AW V b n/a 21 2830 2903 2945 N
+ K AW V e n/a 21 2830 2903 2945 N
+ K AW V s n/a 21 2830 2903 2945 N
+ K AW W b n/a 21 2829 2892 2921 N
+ K AW W e n/a 21 2829 2905 2920 N
+ K AW W s n/a 21 2829 2892 2921 N
+ K AW Y b n/a 21 2832 2887 2965 N
+ K AW Y e n/a 21 2832 2887 2965 N
+ K AW Y s n/a 21 2832 2887 2965 N
+ K AW Z e n/a 21 2830 2903 2955 N
+ K AW Z s n/a 21 2830 2903 2955 N
+ K AW ZH e n/a 21 2830 2903 2956 N
+ K AW ZH s n/a 21 2830 2903 2956 N
+ K AY AA b n/a 21 2851 2908 2928 N
+ K AY AA e n/a 21 2851 2906 2929 N
+ K AY AA i n/a 21 2851 2908 2928 N
+ K AY AA s n/a 21 2851 2908 2929 N
+ K AY AE b n/a 21 2851 2889 2958 N
+ K AY AE e n/a 21 2851 2889 2963 N
+ K AY AE i n/a 21 2851 2889 2958 N
+ K AY AE s n/a 21 2851 2889 2958 N
+ K AY AH b n/a 21 2851 2857 2933 N
+ K AY AH e n/a 21 2851 2857 2940 N
+ K AY AH i n/a 21 2851 2857 2938 N
+ K AY AH s n/a 21 2851 2857 2940 N
+ K AY AO b n/a 21 2851 2900 2916 N
+ K AY AO e n/a 21 2851 2900 2918 N
+ K AY AO i n/a 21 2851 2900 2917 N
+ K AY AO s n/a 21 2851 2900 2916 N
+ K AY AW b n/a 21 2851 2889 2959 N
+ K AY AW e n/a 21 2851 2889 2963 N
+ K AY AW i n/a 21 2851 2889 2959 N
+ K AY AW s n/a 21 2851 2889 2959 N
+ K AY AY b n/a 21 2851 2910 2930 N
+ K AY AY e n/a 21 2851 2906 2925 N
+ K AY AY i n/a 21 2851 2910 2925 N
+ K AY AY s n/a 21 2851 2910 2925 N
+ K AY B b n/a 21 2851 2861 2946 N
+ K AY B e n/a 21 2851 2861 2946 N
+ K AY B i n/a 21 2851 2861 2946 N
+ K AY B s n/a 21 2851 2861 2946 N
+ K AY CH e n/a 21 2851 2856 2943 N
+ K AY CH i n/a 21 2851 2856 2943 N
+ K AY CH s n/a 21 2851 2856 2943 N
+ K AY D b n/a 21 2851 2864 2946 N
+ K AY D e n/a 21 2851 2864 2946 N
+ K AY D s n/a 21 2851 2864 2946 N
+ K AY DH e n/a 21 2851 2861 2946 N
+ K AY DH s n/a 21 2851 2861 2946 N
+ K AY EH b n/a 21 2851 2889 2958 N
+ K AY EH e n/a 21 2851 2889 2963 N
+ K AY EH i n/a 21 2851 2889 2958 N
+ K AY EH s n/a 21 2851 2889 2958 N
+ K AY ER b n/a 21 2851 2915 2926 N
+ K AY ER e n/a 21 2851 2915 2936 N
+ K AY ER i n/a 21 2851 2915 2936 N
+ K AY ER s n/a 21 2851 2915 2936 N
+ K AY EY b n/a 21 2851 2889 2960 N
+ K AY EY e n/a 21 2851 2889 2963 N
+ K AY EY i n/a 21 2851 2889 2960 N
+ K AY EY s n/a 21 2851 2889 2960 N
+ K AY F b n/a 21 2851 2861 2952 N
+ K AY F e n/a 21 2851 2861 2952 N
+ K AY F s n/a 21 2851 2861 2952 N
+ K AY G e n/a 21 2851 2861 2946 N
+ K AY G s n/a 21 2851 2861 2946 N
+ K AY HH e n/a 21 2851 2861 2951 N
+ K AY HH i n/a 21 2851 2861 2951 N
+ K AY HH s n/a 21 2851 2861 2951 N
+ K AY IH b n/a 21 2851 2889 2969 N
+ K AY IH e n/a 21 2851 2889 2961 N
+ K AY IH i n/a 21 2851 2889 2968 N
+ K AY IH s n/a 21 2851 2889 2961 N
+ K AY IY b n/a 21 2851 2889 2966 N
+ K AY IY e n/a 21 2851 2889 2961 N
+ K AY IY i n/a 21 2851 2889 2968 N
+ K AY IY s n/a 21 2851 2889 2961 N
+ K AY JH e n/a 21 2851 2857 2946 N
+ K AY JH s n/a 21 2851 2857 2946 N
+ K AY K b n/a 21 2851 2861 2941 N
+ K AY K e n/a 21 2851 2861 2941 N
+ K AY K s n/a 21 2851 2861 2941 N
+ K AY L b n/a 21 2851 2900 2919 N
+ K AY L e n/a 21 2851 2900 2918 N
+ K AY L i n/a 21 2851 2900 2918 N
+ K AY L s n/a 21 2851 2900 2918 N
+ K AY M b n/a 21 2851 2861 2947 N
+ K AY M e n/a 21 2851 2861 2947 N
+ K AY M i n/a 21 2851 2861 2947 N
+ K AY M s n/a 21 2851 2861 2947 N
+ K AY N b n/a 21 2851 2864 2947 N
+ K AY N e n/a 21 2851 2864 2947 N
+ K AY N i n/a 21 2851 2864 2947 N
+ K AY N s n/a 21 2851 2864 2947 N
+ K AY NG b n/a 21 2851 2861 2947 N
+ K AY NG e n/a 21 2851 2861 2947 N
+ K AY NG s n/a 21 2851 2861 2947 N
+ K AY OW b n/a 21 2851 2915 2927 N
+ K AY OW e n/a 21 2851 2915 2925 N
+ K AY OW i n/a 21 2851 2915 2925 N
+ K AY OW s n/a 21 2851 2915 2925 N
+ K AY OY b n/a 21 2851 2900 2916 N
+ K AY OY e n/a 21 2851 2900 2918 N
+ K AY OY s n/a 21 2851 2900 2916 N
+ K AY P b n/a 21 2851 2861 2941 N
+ K AY P e n/a 21 2851 2861 2941 N
+ K AY P s n/a 21 2851 2861 2941 N
+ K AY R b n/a 21 2851 2900 2923 N
+ K AY R e n/a 21 2851 2900 2922 N
+ K AY R i n/a 21 2851 2900 2922 N
+ K AY R s n/a 21 2851 2900 2922 N
+ K AY S b n/a 21 2851 2867 2954 N
+ K AY S e n/a 21 2851 2867 2954 N
+ K AY S i n/a 21 2851 2867 2954 N
+ K AY S s n/a 21 2851 2867 2954 N
+ K AY SH b n/a 21 2851 2856 2956 N
+ K AY SH e n/a 21 2851 2856 2956 N
+ K AY SH s n/a 21 2851 2856 2956 N
+ K AY SIL e n/a 21 2851 2861 2949 N
+ K AY SIL s n/a 21 2851 2861 2949 N
+ K AY T b n/a 21 2851 2864 2941 N
+ K AY T e n/a 21 2851 2864 2941 N
+ K AY T i n/a 21 2851 2864 2941 N
+ K AY T s n/a 21 2851 2864 2941 N
+ K AY TH e n/a 21 2851 2861 2949 N
+ K AY TH s n/a 21 2851 2861 2949 N
+ K AY UH b n/a 21 2851 2915 2934 N
+ K AY UH e n/a 21 2851 2915 2936 N
+ K AY UH s n/a 21 2851 2915 2936 N
+ K AY UW b n/a 21 2851 2915 2927 N
+ K AY UW e n/a 21 2851 2915 2926 N
+ K AY UW i n/a 21 2851 2915 2926 N
+ K AY UW s n/a 21 2851 2915 2926 N
+ K AY V b n/a 21 2851 2861 2946 N
+ K AY V e n/a 21 2851 2861 2946 N
+ K AY V i n/a 21 2851 2861 2946 N
+ K AY V s n/a 21 2851 2861 2946 N
+ K AY W b n/a 21 2851 2891 2921 N
+ K AY W e n/a 21 2851 2906 2920 N
+ K AY W i n/a 21 2851 2891 2920 N
+ K AY W s n/a 21 2851 2891 2921 N
+ K AY Y b n/a 21 2851 2889 2965 N
+ K AY Y e n/a 21 2851 2889 2965 N
+ K AY Y i n/a 21 2851 2889 2965 N
+ K AY Y s n/a 21 2851 2889 2965 N
+ K AY Z e n/a 21 2851 2865 2954 N
+ K AY Z s n/a 21 2851 2865 2954 N
+ K AY ZH e n/a 21 2851 2857 2956 N
+ K AY ZH s n/a 21 2851 2857 2956 N
+ K B AA b n/a 21 2819 2908 2928 N
+ K B AA e n/a 21 2819 2906 2929 N
+ K B AA i n/a 21 2819 2908 2928 N
+ K B AA s n/a 21 2819 2908 2929 N
+ K B AE b n/a 21 2816 2879 2958 N
+ K B AE e n/a 21 2816 2879 2963 N
+ K B AE i n/a 21 2816 2879 2958 N
+ K B AE s n/a 21 2816 2879 2958 N
+ K B AH b n/a 21 2815 2871 2931 N
+ K B AH e n/a 21 2815 2871 2940 N
+ K B AH i n/a 21 2815 2871 2938 N
+ K B AH s n/a 21 2815 2871 2940 N
+ K B AO b n/a 21 2819 2894 2916 N
+ K B AO e n/a 21 2819 2894 2918 N
+ K B AO i n/a 21 2819 2894 2917 N
+ K B AO s n/a 21 2819 2894 2916 N
+ K B AW b n/a 21 2816 2879 2959 N
+ K B AW e n/a 21 2816 2879 2963 N
+ K B AW i n/a 21 2816 2879 2959 N
+ K B AW s n/a 21 2816 2879 2959 N
+ K B AY b n/a 21 2819 2910 2930 N
+ K B AY e n/a 21 2819 2906 2925 N
+ K B AY s n/a 21 2819 2910 2925 N
+ K B B b n/a 21 2816 2859 2944 N
+ K B B e n/a 21 2816 2859 2944 N
+ K B B s n/a 21 2816 2859 2944 N
+ K B CH e n/a 21 2816 2856 2944 N
+ K B CH s n/a 21 2816 2856 2944 N
+ K B D b n/a 21 2816 2859 2944 N
+ K B D e n/a 21 2816 2859 2944 N
+ K B D s n/a 21 2816 2859 2944 N
+ K B DH e n/a 21 2816 2859 2944 N
+ K B DH s n/a 21 2816 2859 2944 N
+ K B EH b n/a 21 2816 2879 2958 N
+ K B EH e n/a 21 2816 2879 2963 N
+ K B EH i n/a 21 2816 2879 2958 N
+ K B EH s n/a 21 2816 2879 2958 N
+ K B ER b n/a 21 2819 2912 2926 N
+ K B ER e n/a 21 2819 2912 2936 N
+ K B ER s n/a 21 2819 2912 2936 N
+ K B EY b n/a 21 2816 2879 2960 N
+ K B EY e n/a 21 2816 2879 2963 N
+ K B EY i n/a 21 2816 2879 2960 N
+ K B EY s n/a 21 2816 2879 2960 N
+ K B F b n/a 21 2816 2859 2952 N
+ K B F e n/a 21 2816 2859 2952 N
+ K B F s n/a 21 2816 2859 2952 N
+ K B G e n/a 21 2816 2859 2944 N
+ K B G s n/a 21 2816 2859 2944 N
+ K B HH e n/a 21 2816 2859 2951 N
+ K B HH s n/a 21 2816 2859 2951 N
+ K B IH b n/a 21 2815 2880 2969 N
+ K B IH e n/a 21 2815 2880 2961 N
+ K B IH i n/a 21 2815 2880 2968 N
+ K B IH s n/a 21 2815 2880 2961 N
+ K B IY b n/a 21 2816 2880 2966 N
+ K B IY e n/a 21 2816 2880 2961 N
+ K B IY i n/a 21 2816 2880 2968 N
+ K B IY s n/a 21 2816 2880 2961 N
+ K B JH e n/a 21 2816 2857 2944 N
+ K B JH s n/a 21 2816 2857 2944 N
+ K B K b n/a 21 2816 2859 2944 N
+ K B K e n/a 21 2816 2859 2944 N
+ K B K s n/a 21 2816 2859 2944 N
+ K B L b n/a 21 2819 2894 2919 N
+ K B L e n/a 21 2819 2894 2918 N
+ K B L i n/a 21 2819 2894 2918 N
+ K B L s n/a 21 2819 2894 2918 N
+ K B M b n/a 21 2816 2859 2947 N
+ K B M e n/a 21 2816 2859 2947 N
+ K B M i n/a 21 2816 2859 2947 N
+ K B M s n/a 21 2816 2859 2947 N
+ K B N b n/a 21 2816 2859 2947 N
+ K B N e n/a 21 2816 2859 2947 N
+ K B N s n/a 21 2816 2859 2947 N
+ K B NG b n/a 21 2816 2859 2947 N
+ K B NG e n/a 21 2816 2859 2947 N
+ K B NG s n/a 21 2816 2859 2947 N
+ K B OW b n/a 21 2819 2913 2927 N
+ K B OW e n/a 21 2819 2912 2925 N
+ K B OW i n/a 21 2819 2912 2925 N
+ K B OW s n/a 21 2819 2912 2925 N
+ K B OY b n/a 21 2819 2894 2916 N
+ K B OY e n/a 21 2819 2894 2918 N
+ K B OY s n/a 21 2819 2894 2916 N
+ K B P b n/a 21 2816 2859 2944 N
+ K B P e n/a 21 2816 2859 2944 N
+ K B P s n/a 21 2816 2859 2944 N
+ K B R b n/a 21 2819 2898 2923 N
+ K B R e n/a 21 2819 2898 2922 N
+ K B R s n/a 21 2819 2898 2922 N
+ K B S b n/a 21 2816 2867 2955 N
+ K B S e n/a 21 2816 2867 2955 N
+ K B S s n/a 21 2816 2867 2955 N
+ K B SH b n/a 21 2816 2856 2956 N
+ K B SH e n/a 21 2816 2856 2956 N
+ K B SH s n/a 21 2816 2856 2956 N
+ K B SIL e n/a 21 2816 2859 2949 N
+ K B SIL s n/a 21 2816 2859 2949 N
+ K B T b n/a 21 2816 2859 2944 N
+ K B T e n/a 21 2816 2859 2944 N
+ K B T s n/a 21 2816 2859 2944 N
+ K B TH e n/a 21 2816 2859 2949 N
+ K B TH s n/a 21 2816 2859 2949 N
+ K B UH b n/a 21 2819 2912 2934 N
+ K B UH e n/a 21 2819 2912 2936 N
+ K B UH s n/a 21 2819 2912 2936 N
+ K B UW b n/a 21 2819 2913 2927 N
+ K B UW e n/a 21 2819 2912 2926 N
+ K B UW s n/a 21 2819 2912 2926 N
+ K B V b n/a 21 2816 2859 2944 N
+ K B V e n/a 21 2816 2859 2944 N
+ K B V s n/a 21 2816 2859 2944 N
+ K B W b n/a 21 2819 2892 2921 N
+ K B W e n/a 21 2819 2906 2920 N
+ K B W s n/a 21 2819 2892 2921 N
+ K B Y b n/a 21 2816 2880 2965 N
+ K B Y e n/a 21 2816 2880 2965 N
+ K B Y i n/a 21 2816 2880 2965 N
+ K B Y s n/a 21 2816 2880 2965 N
+ K B Z e n/a 21 2816 2865 2955 N
+ K B Z s n/a 21 2816 2865 2955 N
+ K B ZH e n/a 21 2816 2857 2956 N
+ K B ZH s n/a 21 2816 2857 2956 N
+ K CH AA b n/a 21 2817 2908 2928 N
+ K CH AA e n/a 21 2817 2906 2929 N
+ K CH AA i n/a 21 2817 2908 2928 N
+ K CH AA s n/a 21 2817 2908 2929 N
+ K CH AE b n/a 21 2816 2879 2958 N
+ K CH AE e n/a 21 2816 2879 2963 N
+ K CH AE i n/a 21 2816 2879 2958 N
+ K CH AE s n/a 21 2816 2879 2958 N
+ K CH AH b n/a 21 2814 2871 2931 N
+ K CH AH e n/a 21 2814 2871 2940 N
+ K CH AH i n/a 21 2814 2871 2940 N
+ K CH AH s n/a 21 2814 2871 2940 N
+ K CH AO b n/a 21 2817 2894 2916 N
+ K CH AO e n/a 21 2817 2894 2918 N
+ K CH AO i n/a 21 2817 2894 2917 N
+ K CH AO s n/a 21 2817 2894 2916 N
+ K CH AW b n/a 21 2816 2879 2959 N
+ K CH AW e n/a 21 2816 2879 2963 N
+ K CH AW s n/a 21 2816 2879 2959 N
+ K CH AY b n/a 21 2817 2910 2930 N
+ K CH AY e n/a 21 2817 2906 2925 N
+ K CH AY s n/a 21 2817 2910 2925 N
+ K CH B b n/a 21 2816 2859 2944 N
+ K CH B e n/a 21 2816 2859 2944 N
+ K CH B s n/a 21 2816 2859 2944 N
+ K CH CH e n/a 21 2816 2856 2944 N
+ K CH CH s n/a 21 2816 2856 2944 N
+ K CH D b n/a 21 2816 2859 2944 N
+ K CH D e n/a 21 2816 2859 2944 N
+ K CH D s n/a 21 2816 2859 2944 N
+ K CH DH e n/a 21 2816 2859 2944 N
+ K CH DH s n/a 21 2816 2859 2944 N
+ K CH EH b n/a 21 2816 2879 2958 N
+ K CH EH e n/a 21 2816 2879 2963 N
+ K CH EH s n/a 21 2816 2879 2958 N
+ K CH ER b n/a 21 2817 2912 2926 N
+ K CH ER e n/a 21 2817 2912 2936 N
+ K CH ER s n/a 21 2817 2912 2936 N
+ K CH EY b n/a 21 2816 2879 2960 N
+ K CH EY e n/a 21 2816 2879 2963 N
+ K CH EY i n/a 21 2816 2879 2960 N
+ K CH EY s n/a 21 2816 2879 2960 N
+ K CH F b n/a 21 2816 2859 2952 N
+ K CH F e n/a 21 2816 2859 2952 N
+ K CH F s n/a 21 2816 2859 2952 N
+ K CH G e n/a 21 2816 2859 2944 N
+ K CH G s n/a 21 2816 2859 2944 N
+ K CH HH e n/a 21 2816 2859 2951 N
+ K CH HH s n/a 21 2816 2859 2951 N
+ K CH IH b n/a 21 2814 2879 2969 N
+ K CH IH e n/a 21 2814 2879 2961 N
+ K CH IH i n/a 21 2814 2879 2967 N
+ K CH IH s n/a 21 2814 2879 2961 N
+ K CH IY b n/a 21 2816 2879 2966 N
+ K CH IY e n/a 21 2816 2879 2961 N
+ K CH IY i n/a 21 2816 2879 2967 N
+ K CH IY s n/a 21 2816 2879 2961 N
+ K CH JH e n/a 21 2816 2857 2944 N
+ K CH JH s n/a 21 2816 2857 2944 N
+ K CH K b n/a 21 2816 2859 2944 N
+ K CH K e n/a 21 2816 2859 2944 N
+ K CH K s n/a 21 2816 2859 2944 N
+ K CH L b n/a 21 2817 2894 2919 N
+ K CH L e n/a 21 2817 2894 2918 N
+ K CH L i n/a 21 2817 2894 2918 N
+ K CH L s n/a 21 2817 2894 2918 N
+ K CH M b n/a 21 2816 2859 2947 N
+ K CH M e n/a 21 2816 2859 2947 N
+ K CH M s n/a 21 2816 2859 2947 N
+ K CH N b n/a 21 2816 2859 2947 N
+ K CH N e n/a 21 2816 2859 2947 N
+ K CH N s n/a 21 2816 2859 2947 N
+ K CH NG b n/a 21 2816 2859 2947 N
+ K CH NG e n/a 21 2816 2859 2947 N
+ K CH NG s n/a 21 2816 2859 2947 N
+ K CH OW b n/a 21 2817 2913 2927 N
+ K CH OW e n/a 21 2817 2912 2925 N
+ K CH OW i n/a 21 2817 2912 2925 N
+ K CH OW s n/a 21 2817 2912 2925 N
+ K CH OY b n/a 21 2817 2894 2916 N
+ K CH OY e n/a 21 2817 2894 2918 N
+ K CH OY s n/a 21 2817 2894 2916 N
+ K CH P b n/a 21 2816 2859 2944 N
+ K CH P e n/a 21 2816 2859 2944 N
+ K CH P s n/a 21 2816 2859 2944 N
+ K CH R b n/a 21 2817 2898 2923 N
+ K CH R e n/a 21 2817 2898 2922 N
+ K CH R i n/a 21 2817 2898 2922 N
+ K CH R s n/a 21 2817 2898 2922 N
+ K CH S b n/a 21 2816 2867 2955 N
+ K CH S e n/a 21 2816 2867 2955 N
+ K CH S s n/a 21 2816 2867 2955 N
+ K CH SH b n/a 21 2816 2856 2956 N
+ K CH SH e n/a 21 2816 2856 2956 N
+ K CH SH s n/a 21 2816 2856 2956 N
+ K CH SIL e n/a 21 2816 2859 2949 N
+ K CH SIL s n/a 21 2816 2859 2949 N
+ K CH T b n/a 21 2816 2859 2944 N
+ K CH T e n/a 21 2816 2859 2944 N
+ K CH T s n/a 21 2816 2859 2944 N
+ K CH TH e n/a 21 2816 2859 2949 N
+ K CH TH s n/a 21 2816 2859 2949 N
+ K CH UH b n/a 21 2817 2912 2934 N
+ K CH UH e n/a 21 2817 2912 2936 N
+ K CH UH s n/a 21 2817 2912 2936 N
+ K CH UW b n/a 21 2817 2913 2927 N
+ K CH UW e n/a 21 2817 2912 2924 N
+ K CH UW s n/a 21 2817 2912 2924 N
+ K CH V b n/a 21 2816 2859 2944 N
+ K CH V e n/a 21 2816 2859 2944 N
+ K CH V s n/a 21 2816 2859 2944 N
+ K CH W b n/a 21 2819 2892 2921 N
+ K CH W e n/a 21 2819 2906 2920 N
+ K CH W s n/a 21 2819 2892 2921 N
+ K CH Y b n/a 21 2816 2879 2965 N
+ K CH Y e n/a 21 2816 2879 2965 N
+ K CH Y s n/a 21 2816 2879 2965 N
+ K CH Z e n/a 21 2816 2865 2955 N
+ K CH Z s n/a 21 2816 2865 2955 N
+ K CH ZH e n/a 21 2816 2857 2956 N
+ K CH ZH s n/a 21 2816 2857 2956 N
+ K D AA b n/a 21 2817 2907 2928 N
+ K D AA i n/a 21 2817 2907 2928 N
+ K D AA s n/a 21 2817 2907 2929 N
+ K D AE b n/a 21 2816 2879 2958 N
+ K D AE i n/a 21 2816 2879 2958 N
+ K D AE s n/a 21 2816 2879 2958 N
+ K D AH b n/a 21 2815 2870 2932 N
+ K D AH i n/a 21 2815 2870 2932 N
+ K D AH s n/a 21 2815 2870 2932 N
+ K D AO b n/a 21 2817 2894 2916 N
+ K D AO i n/a 21 2817 2894 2917 N
+ K D AO s n/a 21 2817 2894 2916 N
+ K D AW b n/a 21 2816 2879 2959 N
+ K D AW i n/a 21 2816 2879 2959 N
+ K D AW s n/a 21 2816 2879 2959 N
+ K D AY b n/a 21 2817 2910 2930 N
+ K D AY s n/a 21 2817 2910 2925 N
+ K D B b n/a 21 2816 2859 2944 N
+ K D B s n/a 21 2816 2859 2944 N
+ K D CH s n/a 21 2816 2856 2944 N
+ K D D b n/a 21 2816 2859 2944 N
+ K D D s n/a 21 2816 2859 2944 N
+ K D DH s n/a 21 2816 2859 2944 N
+ K D EH b n/a 21 2816 2879 2958 N
+ K D EH i n/a 21 2816 2879 2958 N
+ K D EH s n/a 21 2816 2879 2958 N
+ K D ER b n/a 21 2817 2912 2926 N
+ K D ER s n/a 21 2817 2912 2932 N
+ K D EY b n/a 21 2816 2879 2960 N
+ K D EY i n/a 21 2816 2879 2960 N
+ K D EY s n/a 21 2816 2879 2960 N
+ K D F b n/a 21 2816 2859 2952 N
+ K D F s n/a 21 2816 2859 2952 N
+ K D G s n/a 21 2816 2859 2944 N
+ K D HH s n/a 21 2816 2859 2951 N
+ K D IH b n/a 21 2815 2880 2969 N
+ K D IH i n/a 21 2815 2880 2968 N
+ K D IH s n/a 21 2815 2880 2961 N
+ K D IY b n/a 21 2816 2880 2966 N
+ K D IY i n/a 21 2816 2880 2968 N
+ K D IY s n/a 21 2816 2880 2961 N
+ K D JH s n/a 21 2816 2857 2944 N
+ K D K b n/a 21 2816 2859 2944 N
+ K D K s n/a 21 2816 2859 2944 N
+ K D L b n/a 21 2817 2894 2919 N
+ K D L i n/a 21 2817 2894 2919 N
+ K D L s n/a 21 2817 2894 2919 N
+ K D M b n/a 21 2816 2859 2947 N
+ K D M s n/a 21 2816 2859 2947 N
+ K D N b n/a 21 2816 2859 2947 N
+ K D N s n/a 21 2816 2859 2947 N
+ K D NG b n/a 21 2816 2859 2947 N
+ K D NG s n/a 21 2816 2859 2947 N
+ K D OW b n/a 21 2817 2913 2927 N
+ K D OW i n/a 21 2817 2912 2925 N
+ K D OW s n/a 21 2817 2912 2925 N
+ K D OY b n/a 21 2817 2894 2916 N
+ K D OY s n/a 21 2817 2894 2916 N
+ K D P b n/a 21 2816 2859 2944 N
+ K D P s n/a 21 2816 2859 2944 N
+ K D R b n/a 21 2817 2895 2923 N
+ K D R i n/a 21 2817 2895 2923 N
+ K D R s n/a 21 2817 2895 2923 N
+ K D S b n/a 21 2816 2867 2955 N
+ K D S s n/a 21 2816 2867 2955 N
+ K D SH b n/a 21 2816 2856 2956 N
+ K D SH s n/a 21 2816 2856 2956 N
+ K D SIL s n/a 21 2816 2859 2949 N
+ K D T b n/a 21 2816 2859 2944 N
+ K D T s n/a 21 2816 2859 2944 N
+ K D TH s n/a 21 2816 2859 2949 N
+ K D UH b n/a 21 2817 2912 2934 N
+ K D UH s n/a 21 2817 2912 2932 N
+ K D UW b n/a 21 2817 2913 2927 N
+ K D UW s n/a 21 2817 2912 2926 N
+ K D V b n/a 21 2816 2859 2944 N
+ K D V s n/a 21 2816 2859 2944 N
+ K D W b n/a 21 2819 2892 2921 N
+ K D W i n/a 21 2819 2892 2921 N
+ K D W s n/a 21 2819 2892 2921 N
+ K D Y b n/a 21 2816 2880 2965 N
+ K D Y s n/a 21 2816 2880 2965 N
+ K D Z s n/a 21 2816 2865 2955 N
+ K D ZH s n/a 21 2816 2857 2956 N
+ K DH AA b n/a 21 2817 2908 2928 N
+ K DH AA s n/a 21 2817 2908 2929 N
+ K DH AE b n/a 21 2814 2885 2958 N
+ K DH AE s n/a 21 2814 2885 2958 N
+ K DH AH b n/a 21 2814 2877 2931 N
+ K DH AH s n/a 21 2814 2877 2940 N
+ K DH AO b n/a 21 2817 2896 2916 N
+ K DH AO s n/a 21 2817 2896 2916 N
+ K DH AW b n/a 21 2814 2885 2959 N
+ K DH AW s n/a 21 2814 2885 2959 N
+ K DH AY b n/a 21 2817 2910 2930 N
+ K DH AY s n/a 21 2817 2910 2925 N
+ K DH B b n/a 21 2814 2859 2944 N
+ K DH B s n/a 21 2814 2859 2944 N
+ K DH CH s n/a 21 2814 2856 2944 N
+ K DH D b n/a 21 2814 2859 2944 N
+ K DH D s n/a 21 2814 2859 2944 N
+ K DH DH s n/a 21 2814 2859 2944 N
+ K DH EH b n/a 21 2814 2885 2958 N
+ K DH EH s n/a 21 2814 2885 2958 N
+ K DH ER b n/a 21 2817 2912 2926 N
+ K DH ER s n/a 21 2817 2912 2936 N
+ K DH EY b n/a 21 2814 2885 2960 N
+ K DH EY s n/a 21 2814 2885 2960 N
+ K DH F b n/a 21 2814 2859 2952 N
+ K DH F s n/a 21 2814 2859 2952 N
+ K DH G s n/a 21 2814 2859 2944 N
+ K DH HH s n/a 21 2814 2859 2951 N
+ K DH IH b n/a 21 2814 2885 2969 N
+ K DH IH s n/a 21 2814 2885 2961 N
+ K DH IY b n/a 21 2814 2885 2966 N
+ K DH IY s n/a 21 2814 2885 2961 N
+ K DH JH s n/a 21 2814 2857 2944 N
+ K DH K b n/a 21 2814 2859 2944 N
+ K DH K s n/a 21 2814 2859 2944 N
+ K DH L b n/a 21 2817 2897 2919 N
+ K DH L s n/a 21 2817 2897 2918 N
+ K DH M b n/a 21 2814 2859 2947 N
+ K DH M s n/a 21 2814 2859 2947 N
+ K DH N b n/a 21 2814 2859 2947 N
+ K DH N s n/a 21 2814 2859 2947 N
+ K DH NG b n/a 21 2814 2859 2947 N
+ K DH NG s n/a 21 2814 2859 2947 N
+ K DH OW b n/a 21 2817 2913 2927 N
+ K DH OW s n/a 21 2817 2912 2925 N
+ K DH OY b n/a 21 2817 2896 2916 N
+ K DH OY s n/a 21 2817 2896 2916 N
+ K DH P b n/a 21 2814 2859 2944 N
+ K DH P s n/a 21 2814 2859 2944 N
+ K DH R b n/a 21 2817 2898 2923 N
+ K DH R s n/a 21 2817 2898 2922 N
+ K DH S b n/a 21 2814 2867 2955 N
+ K DH S s n/a 21 2814 2867 2955 N
+ K DH SH b n/a 21 2814 2856 2956 N
+ K DH SH s n/a 21 2814 2856 2956 N
+ K DH SIL s n/a 21 2814 2859 2949 N
+ K DH T b n/a 21 2814 2859 2944 N
+ K DH T s n/a 21 2814 2859 2944 N
+ K DH TH s n/a 21 2814 2859 2949 N
+ K DH UH b n/a 21 2817 2912 2934 N
+ K DH UH s n/a 21 2817 2912 2936 N
+ K DH UW b n/a 21 2817 2913 2927 N
+ K DH UW s n/a 21 2817 2912 2926 N
+ K DH V b n/a 21 2814 2859 2944 N
+ K DH V s n/a 21 2814 2859 2944 N
+ K DH W b n/a 21 2819 2892 2921 N
+ K DH W s n/a 21 2819 2892 2921 N
+ K DH Y b n/a 21 2814 2885 2965 N
+ K DH Y s n/a 21 2814 2885 2965 N
+ K DH Z s n/a 21 2814 2865 2955 N
+ K DH ZH s n/a 21 2814 2857 2956 N
+ K EH AA b n/a 21 2837 2908 2928 N
+ K EH AA e n/a 21 2837 2906 2929 N
+ K EH AA i n/a 21 2837 2908 2928 N
+ K EH AA s n/a 21 2837 2908 2929 N
+ K EH AE b n/a 21 2837 2883 2958 N
+ K EH AE e n/a 21 2837 2883 2963 N
+ K EH AE i n/a 21 2837 2883 2958 N
+ K EH AE s n/a 21 2837 2883 2958 N
+ K EH AH b n/a 21 2837 2857 2931 N
+ K EH AH e n/a 21 2837 2857 2939 N
+ K EH AH i n/a 21 2837 2857 2939 N
+ K EH AH s n/a 21 2837 2857 2939 N
+ K EH AO b n/a 21 2837 2896 2917 N
+ K EH AO e n/a 21 2837 2900 2918 N
+ K EH AO i n/a 21 2837 2900 2917 N
+ K EH AO s n/a 21 2837 2900 2917 N
+ K EH AW b n/a 21 2837 2883 2959 N
+ K EH AW e n/a 21 2837 2883 2963 N
+ K EH AW i n/a 21 2837 2883 2959 N
+ K EH AW s n/a 21 2837 2883 2959 N
+ K EH AY b n/a 21 2837 2910 2930 N
+ K EH AY e n/a 21 2837 2906 2925 N
+ K EH AY i n/a 21 2837 2910 2925 N
+ K EH AY s n/a 21 2837 2910 2925 N
+ K EH B b n/a 21 2837 2859 2944 N
+ K EH B e n/a 21 2837 2859 2944 N
+ K EH B i n/a 21 2837 2859 2944 N
+ K EH B s n/a 21 2837 2859 2944 N
+ K EH CH e n/a 21 2838 2856 2943 N
+ K EH CH i n/a 21 2838 2856 2943 N
+ K EH CH s n/a 21 2838 2856 2943 N
+ K EH D b n/a 21 2838 2864 2944 N
+ K EH D e n/a 21 2838 2864 2944 N
+ K EH D i n/a 21 2838 2864 2944 N
+ K EH D s n/a 21 2838 2864 2944 N
+ K EH DH e n/a 21 2837 2859 2944 N
+ K EH DH s n/a 21 2837 2859 2944 N
+ K EH EH b n/a 21 2837 2883 2958 N
+ K EH EH e n/a 21 2837 2883 2963 N
+ K EH EH i n/a 21 2837 2883 2958 N
+ K EH EH s n/a 21 2837 2883 2958 N
+ K EH ER b n/a 21 2837 2913 2926 N
+ K EH ER e n/a 21 2837 2915 2936 N
+ K EH ER i n/a 21 2837 2915 2936 N
+ K EH ER s n/a 21 2837 2915 2936 N
+ K EH EY b n/a 21 2837 2883 2960 N
+ K EH EY e n/a 21 2837 2883 2963 N
+ K EH EY i n/a 21 2837 2883 2960 N
+ K EH EY s n/a 21 2837 2883 2960 N
+ K EH F b n/a 21 2837 2859 2952 N
+ K EH F e n/a 21 2837 2859 2952 N
+ K EH F i n/a 21 2837 2859 2952 N
+ K EH F s n/a 21 2837 2859 2952 N
+ K EH G e n/a 21 2837 2859 2944 N
+ K EH G i n/a 21 2837 2859 2944 N
+ K EH G s n/a 21 2837 2859 2944 N
+ K EH HH e n/a 21 2837 2859 2951 N
+ K EH HH i n/a 21 2837 2859 2951 N
+ K EH HH s n/a 21 2837 2859 2951 N
+ K EH IH b n/a 21 2837 2883 2969 N
+ K EH IH e n/a 21 2837 2883 2961 N
+ K EH IH i n/a 21 2837 2883 2967 N
+ K EH IH s n/a 21 2837 2883 2961 N
+ K EH IY b n/a 21 2837 2883 2966 N
+ K EH IY e n/a 21 2837 2883 2961 N
+ K EH IY i n/a 21 2837 2883 2968 N
+ K EH IY s n/a 21 2837 2883 2961 N
+ K EH JH e n/a 21 2838 2857 2944 N
+ K EH JH s n/a 21 2838 2857 2944 N
+ K EH K b n/a 21 2837 2859 2941 N
+ K EH K e n/a 21 2837 2859 2941 N
+ K EH K i n/a 21 2837 2859 2941 N
+ K EH K s n/a 21 2837 2859 2941 N
+ K EH L b n/a 21 2837 2897 2919 N
+ K EH L e n/a 21 2837 2900 2918 N
+ K EH L i n/a 21 2837 2900 2918 N
+ K EH L s n/a 21 2837 2900 2918 N
+ K EH M b n/a 21 2837 2859 2947 N
+ K EH M e n/a 21 2837 2859 2947 N
+ K EH M i n/a 21 2837 2859 2947 N
+ K EH M s n/a 21 2837 2859 2947 N
+ K EH N b n/a 21 2838 2864 2947 N
+ K EH N e n/a 21 2838 2864 2947 N
+ K EH N i n/a 21 2838 2864 2947 N
+ K EH N s n/a 21 2838 2864 2947 N
+ K EH NG b n/a 21 2837 2859 2947 N
+ K EH NG e n/a 21 2837 2859 2947 N
+ K EH NG s n/a 21 2837 2859 2947 N
+ K EH OW b n/a 21 2837 2913 2927 N
+ K EH OW e n/a 21 2837 2915 2925 N
+ K EH OW i n/a 21 2837 2915 2925 N
+ K EH OW s n/a 21 2837 2915 2925 N
+ K EH OY b n/a 21 2837 2896 2917 N
+ K EH OY e n/a 21 2837 2900 2918 N
+ K EH OY i n/a 21 2837 2900 2917 N
+ K EH OY s n/a 21 2837 2900 2917 N
+ K EH P b n/a 21 2837 2859 2941 N
+ K EH P e n/a 21 2837 2859 2941 N
+ K EH P i n/a 21 2837 2859 2941 N
+ K EH P s n/a 21 2837 2859 2941 N
+ K EH R b n/a 21 2837 2898 2923 N
+ K EH R e n/a 21 2837 2900 2922 N
+ K EH R i n/a 21 2837 2900 2922 N
+ K EH R s n/a 21 2837 2900 2922 N
+ K EH S b n/a 21 2837 2867 2954 N
+ K EH S e n/a 21 2837 2867 2954 N
+ K EH S i n/a 21 2837 2867 2954 N
+ K EH S s n/a 21 2837 2867 2954 N
+ K EH SH b n/a 21 2838 2856 2956 N
+ K EH SH e n/a 21 2838 2856 2956 N
+ K EH SH i n/a 21 2838 2856 2956 N
+ K EH SH s n/a 21 2838 2856 2956 N
+ K EH SIL e n/a 21 2837 2859 2949 N
+ K EH SIL s n/a 21 2837 2859 2949 N
+ K EH T b n/a 21 2838 2863 2941 N
+ K EH T e n/a 21 2838 2863 2941 N
+ K EH T i n/a 21 2838 2863 2941 N
+ K EH T s n/a 21 2838 2863 2941 N
+ K EH TH e n/a 21 2837 2859 2949 N
+ K EH TH i n/a 21 2837 2859 2949 N
+ K EH TH s n/a 21 2837 2859 2949 N
+ K EH UH b n/a 21 2837 2913 2934 N
+ K EH UH e n/a 21 2837 2915 2936 N
+ K EH UH i n/a 21 2837 2915 2936 N
+ K EH UH s n/a 21 2837 2915 2936 N
+ K EH UW b n/a 21 2837 2913 2927 N
+ K EH UW e n/a 21 2837 2915 2926 N
+ K EH UW i n/a 21 2837 2915 2926 N
+ K EH UW s n/a 21 2837 2915 2926 N
+ K EH V b n/a 21 2837 2859 2944 N
+ K EH V e n/a 21 2837 2859 2944 N
+ K EH V i n/a 21 2837 2859 2944 N
+ K EH V s n/a 21 2837 2859 2944 N
+ K EH W b n/a 21 2837 2893 2921 N
+ K EH W e n/a 21 2837 2906 2920 N
+ K EH W i n/a 21 2837 2893 2921 N
+ K EH W s n/a 21 2837 2893 2921 N
+ K EH Y b n/a 21 2838 2884 2965 N
+ K EH Y e n/a 21 2838 2884 2965 N
+ K EH Y i n/a 21 2838 2884 2965 N
+ K EH Y s n/a 21 2838 2884 2965 N
+ K EH Z e n/a 21 2837 2865 2954 N
+ K EH Z i n/a 21 2837 2865 2954 N
+ K EH Z s n/a 21 2837 2865 2954 N
+ K EH ZH e n/a 21 2838 2857 2956 N
+ K EH ZH s n/a 21 2838 2857 2956 N
+ K ER AA b n/a 21 2834 2913 2928 N
+ K ER AA e n/a 21 2834 2905 2929 N
+ K ER AA i n/a 21 2834 2913 2928 N
+ K ER AA s n/a 21 2834 2913 2929 N
+ K ER AE b n/a 21 2833 2890 2958 N
+ K ER AE e n/a 21 2833 2888 2963 N
+ K ER AE i n/a 21 2833 2888 2958 N
+ K ER AE s n/a 21 2833 2888 2958 N
+ K ER AH b n/a 21 2834 2873 2931 N
+ K ER AH e n/a 21 2834 2875 2937 N
+ K ER AH i n/a 21 2834 2873 2937 N
+ K ER AH s n/a 21 2834 2873 2937 N
+ K ER AO b n/a 21 2834 2896 2916 N
+ K ER AO e n/a 21 2834 2896 2918 N
+ K ER AO i n/a 21 2834 2896 2917 N
+ K ER AO s n/a 21 2834 2896 2916 N
+ K ER AW b n/a 21 2833 2890 2959 N
+ K ER AW e n/a 21 2833 2888 2963 N
+ K ER AW i n/a 21 2833 2888 2959 N
+ K ER AW s n/a 21 2833 2888 2959 N
+ K ER AY b n/a 21 2834 2913 2930 N
+ K ER AY e n/a 21 2834 2905 2925 N
+ K ER AY i n/a 21 2834 2913 2925 N
+ K ER AY s n/a 21 2834 2913 2925 N
+ K ER B b n/a 21 2834 2905 2945 N
+ K ER B e n/a 21 2835 2905 2945 N
+ K ER B i n/a 21 2835 2905 2945 N
+ K ER B s n/a 21 2835 2905 2945 N
+ K ER CH e n/a 21 2835 2905 2945 N
+ K ER CH i n/a 21 2835 2905 2945 N
+ K ER CH s n/a 21 2835 2905 2945 N
+ K ER D b n/a 21 2834 2905 2945 N
+ K ER D e n/a 21 2835 2905 2945 N
+ K ER D i n/a 21 2835 2905 2945 N
+ K ER D s n/a 21 2835 2905 2945 N
+ K ER DH e n/a 21 2835 2905 2945 N
+ K ER DH s n/a 21 2835 2905 2945 N
+ K ER EH b n/a 21 2833 2890 2958 N
+ K ER EH e n/a 21 2833 2888 2963 N
+ K ER EH i n/a 21 2833 2888 2958 N
+ K ER EH s n/a 21 2833 2888 2958 N
+ K ER ER b n/a 21 2834 2913 2926 N
+ K ER ER e n/a 21 2834 2913 2936 N
+ K ER ER i n/a 21 2834 2913 2936 N
+ K ER ER s n/a 21 2834 2913 2936 N
+ K ER EY b n/a 21 2833 2890 2960 N
+ K ER EY e n/a 21 2833 2888 2963 N
+ K ER EY i n/a 21 2833 2888 2960 N
+ K ER EY s n/a 21 2833 2888 2960 N
+ K ER F b n/a 21 2834 2905 2952 N
+ K ER F e n/a 21 2835 2905 2952 N
+ K ER F i n/a 21 2835 2905 2952 N
+ K ER F s n/a 21 2835 2905 2952 N
+ K ER G e n/a 21 2835 2905 2945 N
+ K ER G i n/a 21 2835 2905 2945 N
+ K ER G s n/a 21 2835 2905 2945 N
+ K ER HH e n/a 21 2835 2905 2951 N
+ K ER HH i n/a 21 2835 2905 2951 N
+ K ER HH s n/a 21 2835 2905 2951 N
+ K ER IH b n/a 21 2833 2890 2969 N
+ K ER IH e n/a 21 2833 2888 2961 N
+ K ER IH i n/a 21 2833 2888 2962 N
+ K ER IH s n/a 21 2833 2888 2961 N
+ K ER IY b n/a 21 2833 2890 2966 N
+ K ER IY e n/a 21 2833 2888 2961 N
+ K ER IY i n/a 21 2833 2888 2962 N
+ K ER IY s n/a 21 2833 2888 2961 N
+ K ER JH e n/a 21 2835 2905 2945 N
+ K ER JH i n/a 21 2835 2905 2945 N
+ K ER JH s n/a 21 2835 2905 2945 N
+ K ER K b n/a 21 2834 2905 2945 N
+ K ER K e n/a 21 2835 2905 2945 N
+ K ER K s n/a 21 2835 2905 2945 N
+ K ER L b n/a 21 2834 2897 2919 N
+ K ER L e n/a 21 2835 2897 2918 N
+ K ER L i n/a 21 2835 2897 2918 N
+ K ER L s n/a 21 2835 2897 2918 N
+ K ER M b n/a 21 2834 2905 2947 N
+ K ER M e n/a 21 2835 2905 2947 N
+ K ER M i n/a 21 2835 2905 2947 N
+ K ER M s n/a 21 2835 2905 2947 N
+ K ER N b n/a 21 2834 2905 2947 N
+ K ER N e n/a 21 2835 2905 2947 N
+ K ER N i n/a 21 2835 2905 2947 N
+ K ER N s n/a 21 2835 2905 2947 N
+ K ER NG b n/a 21 2834 2905 2947 N
+ K ER NG e n/a 21 2835 2905 2947 N
+ K ER NG s n/a 21 2835 2905 2947 N
+ K ER OW b n/a 21 2834 2913 2927 N
+ K ER OW e n/a 21 2834 2913 2924 N
+ K ER OW i n/a 21 2834 2913 2924 N
+ K ER OW s n/a 21 2834 2913 2924 N
+ K ER OY b n/a 21 2834 2896 2916 N
+ K ER OY e n/a 21 2834 2896 2918 N
+ K ER OY s n/a 21 2834 2896 2916 N
+ K ER P b n/a 21 2834 2905 2945 N
+ K ER P e n/a 21 2835 2905 2945 N
+ K ER P i n/a 21 2835 2905 2945 N
+ K ER P s n/a 21 2835 2905 2945 N
+ K ER R b n/a 21 2834 2898 2923 N
+ K ER R e n/a 21 2835 2898 2922 N
+ K ER R i n/a 21 2835 2898 2923 N
+ K ER R s n/a 21 2835 2898 2922 N
+ K ER S b n/a 21 2834 2905 2955 N
+ K ER S e n/a 21 2835 2905 2955 N
+ K ER S i n/a 21 2835 2905 2955 N
+ K ER S s n/a 21 2835 2905 2955 N
+ K ER SH b n/a 21 2834 2905 2956 N
+ K ER SH e n/a 21 2835 2905 2956 N
+ K ER SH i n/a 21 2835 2905 2956 N
+ K ER SH s n/a 21 2835 2905 2956 N
+ K ER SIL e n/a 21 2835 2905 2950 N
+ K ER SIL s n/a 21 2835 2905 2950 N
+ K ER T b n/a 21 2834 2905 2945 N
+ K ER T e n/a 21 2835 2905 2945 N
+ K ER T i n/a 21 2835 2905 2945 N
+ K ER T s n/a 21 2835 2905 2945 N
+ K ER TH e n/a 21 2835 2905 2950 N
+ K ER TH s n/a 21 2835 2905 2950 N
+ K ER UH b n/a 21 2834 2913 2934 N
+ K ER UH e n/a 21 2834 2913 2936 N
+ K ER UH i n/a 21 2834 2913 2936 N
+ K ER UH s n/a 21 2834 2913 2936 N
+ K ER UW b n/a 21 2834 2913 2927 N
+ K ER UW e n/a 21 2834 2913 2926 N
+ K ER UW i n/a 21 2834 2913 2926 N
+ K ER UW s n/a 21 2834 2913 2926 N
+ K ER V b n/a 21 2834 2905 2945 N
+ K ER V e n/a 21 2835 2905 2945 N
+ K ER V i n/a 21 2835 2905 2945 N
+ K ER V s n/a 21 2835 2905 2945 N
+ K ER W b n/a 21 2834 2892 2921 N
+ K ER W e n/a 21 2835 2905 2920 N
+ K ER W i n/a 21 2835 2892 2921 N
+ K ER W s n/a 21 2835 2892 2921 N
+ K ER Y b n/a 21 2833 2890 2965 N
+ K ER Y e n/a 21 2833 2888 2965 N
+ K ER Y i n/a 21 2833 2888 2965 N
+ K ER Y s n/a 21 2833 2888 2965 N
+ K ER Z e n/a 21 2835 2905 2955 N
+ K ER Z i n/a 21 2835 2905 2955 N
+ K ER Z s n/a 21 2835 2905 2955 N
+ K ER ZH e n/a 21 2835 2905 2956 N
+ K ER ZH s n/a 21 2835 2905 2956 N
+ K EY AA b n/a 21 2854 2908 2928 N
+ K EY AA e n/a 21 2854 2906 2929 N
+ K EY AA i n/a 21 2854 2908 2928 N
+ K EY AA s n/a 21 2854 2908 2929 N
+ K EY AE b n/a 21 2854 2880 2958 N
+ K EY AE e n/a 21 2854 2882 2963 N
+ K EY AE i n/a 21 2854 2880 2958 N
+ K EY AE s n/a 21 2854 2880 2958 N
+ K EY AH b n/a 21 2854 2865 2933 N
+ K EY AH e n/a 21 2854 2865 2940 N
+ K EY AH i n/a 21 2854 2865 2939 N
+ K EY AH s n/a 21 2854 2865 2940 N
+ K EY AO b n/a 21 2854 2901 2916 N
+ K EY AO e n/a 21 2854 2902 2918 N
+ K EY AO i n/a 21 2854 2901 2917 N
+ K EY AO s n/a 21 2854 2902 2916 N
+ K EY AW b n/a 21 2854 2880 2959 N
+ K EY AW e n/a 21 2854 2882 2963 N
+ K EY AW i n/a 21 2854 2880 2959 N
+ K EY AW s n/a 21 2854 2880 2959 N
+ K EY AY b n/a 21 2854 2910 2930 N
+ K EY AY e n/a 21 2854 2906 2925 N
+ K EY AY s n/a 21 2854 2910 2925 N
+ K EY B b n/a 21 2854 2860 2944 N
+ K EY B e n/a 21 2854 2860 2944 N
+ K EY B i n/a 21 2854 2860 2944 N
+ K EY B s n/a 21 2854 2860 2944 N
+ K EY CH e n/a 21 2854 2856 2944 N
+ K EY CH s n/a 21 2854 2856 2944 N
+ K EY D b n/a 21 2854 2860 2944 N
+ K EY D e n/a 21 2854 2860 2944 N
+ K EY D i n/a 21 2854 2860 2944 N
+ K EY D s n/a 21 2854 2860 2944 N
+ K EY DH e n/a 21 2854 2865 2944 N
+ K EY DH s n/a 21 2854 2865 2944 N
+ K EY EH b n/a 21 2854 2880 2958 N
+ K EY EH e n/a 21 2854 2882 2963 N
+ K EY EH i n/a 21 2854 2880 2958 N
+ K EY EH s n/a 21 2854 2880 2958 N
+ K EY ER b n/a 21 2854 2911 2926 N
+ K EY ER e n/a 21 2854 2911 2936 N
+ K EY ER i n/a 21 2854 2911 2936 N
+ K EY ER s n/a 21 2854 2911 2936 N
+ K EY EY b n/a 21 2854 2880 2960 N
+ K EY EY e n/a 21 2854 2882 2963 N
+ K EY EY i n/a 21 2854 2880 2960 N
+ K EY EY s n/a 21 2854 2880 2960 N
+ K EY F b n/a 21 2854 2868 2952 N
+ K EY F e n/a 21 2854 2868 2952 N
+ K EY F i n/a 21 2854 2868 2952 N
+ K EY F s n/a 21 2854 2868 2952 N
+ K EY G e n/a 21 2854 2860 2944 N
+ K EY G i n/a 21 2854 2860 2944 N
+ K EY G s n/a 21 2854 2860 2944 N
+ K EY HH e n/a 21 2854 2865 2951 N
+ K EY HH i n/a 21 2854 2865 2951 N
+ K EY HH s n/a 21 2854 2865 2951 N
+ K EY IH b n/a 21 2854 2882 2969 N
+ K EY IH e n/a 21 2854 2882 2961 N
+ K EY IH i n/a 21 2854 2882 2968 N
+ K EY IH s n/a 21 2854 2882 2961 N
+ K EY IY b n/a 21 2854 2882 2966 N
+ K EY IY e n/a 21 2854 2882 2961 N
+ K EY IY i n/a 21 2854 2882 2968 N
+ K EY IY s n/a 21 2854 2882 2961 N
+ K EY JH e n/a 21 2854 2857 2944 N
+ K EY JH s n/a 21 2854 2857 2944 N
+ K EY K b n/a 21 2854 2860 2944 N
+ K EY K e n/a 21 2854 2860 2944 N
+ K EY K s n/a 21 2854 2860 2944 N
+ K EY L b n/a 21 2854 2901 2919 N
+ K EY L e n/a 21 2854 2902 2918 N
+ K EY L i n/a 21 2854 2902 2918 N
+ K EY L s n/a 21 2854 2902 2918 N
+ K EY M b n/a 21 2854 2865 2947 N
+ K EY M e n/a 21 2854 2865 2947 N
+ K EY M i n/a 21 2854 2865 2947 N
+ K EY M s n/a 21 2854 2865 2947 N
+ K EY N b n/a 21 2854 2865 2947 N
+ K EY N e n/a 21 2854 2865 2947 N
+ K EY N i n/a 21 2854 2865 2947 N
+ K EY N s n/a 21 2854 2865 2947 N
+ K EY NG b n/a 21 2854 2865 2947 N
+ K EY NG e n/a 21 2854 2865 2947 N
+ K EY NG s n/a 21 2854 2865 2947 N
+ K EY OW b n/a 21 2854 2911 2927 N
+ K EY OW e n/a 21 2854 2911 2925 N
+ K EY OW i n/a 21 2854 2911 2925 N
+ K EY OW s n/a 21 2854 2911 2925 N
+ K EY OY b n/a 21 2854 2901 2916 N
+ K EY OY e n/a 21 2854 2902 2918 N
+ K EY OY s n/a 21 2854 2902 2916 N
+ K EY P b n/a 21 2854 2860 2944 N
+ K EY P e n/a 21 2854 2860 2944 N
+ K EY P s n/a 21 2854 2860 2944 N
+ K EY R b n/a 21 2854 2901 2923 N
+ K EY R e n/a 21 2854 2902 2922 N
+ K EY R i n/a 21 2854 2901 2922 N
+ K EY R s n/a 21 2854 2902 2922 N
+ K EY S b n/a 21 2854 2868 2953 N
+ K EY S e n/a 21 2854 2868 2953 N
+ K EY S i n/a 21 2854 2868 2953 N
+ K EY S s n/a 21 2854 2868 2953 N
+ K EY SH b n/a 21 2854 2868 2956 N
+ K EY SH e n/a 21 2854 2868 2956 N
+ K EY SH i n/a 21 2854 2868 2956 N
+ K EY SH s n/a 21 2854 2868 2956 N
+ K EY SIL e n/a 21 2854 2865 2948 N
+ K EY SIL s n/a 21 2854 2865 2948 N
+ K EY T b n/a 21 2854 2860 2944 N
+ K EY T e n/a 21 2854 2860 2944 N
+ K EY T i n/a 21 2854 2860 2944 N
+ K EY T s n/a 21 2854 2860 2944 N
+ K EY TH e n/a 21 2854 2868 2948 N
+ K EY TH i n/a 21 2854 2868 2948 N
+ K EY TH s n/a 21 2854 2868 2948 N
+ K EY UH b n/a 21 2854 2911 2934 N
+ K EY UH e n/a 21 2854 2911 2936 N
+ K EY UH i n/a 21 2854 2911 2936 N
+ K EY UH s n/a 21 2854 2911 2936 N
+ K EY UW b n/a 21 2854 2911 2927 N
+ K EY UW e n/a 21 2854 2911 2926 N
+ K EY UW i n/a 21 2854 2911 2926 N
+ K EY UW s n/a 21 2854 2911 2926 N
+ K EY V b n/a 21 2854 2865 2944 N
+ K EY V e n/a 21 2854 2865 2944 N
+ K EY V i n/a 21 2854 2865 2944 N
+ K EY V s n/a 21 2854 2865 2944 N
+ K EY W b n/a 21 2854 2893 2921 N
+ K EY W e n/a 21 2854 2906 2920 N
+ K EY W i n/a 21 2854 2893 2921 N
+ K EY W s n/a 21 2854 2893 2921 N
+ K EY Y b n/a 21 2854 2882 2965 N
+ K EY Y e n/a 21 2854 2882 2965 N
+ K EY Y s n/a 21 2854 2882 2965 N
+ K EY Z e n/a 21 2854 2865 2953 N
+ K EY Z i n/a 21 2854 2865 2953 N
+ K EY Z s n/a 21 2854 2865 2953 N
+ K EY ZH e n/a 21 2854 2865 2956 N
+ K EY ZH s n/a 21 2854 2865 2956 N
+ K F AA b n/a 21 2819 2908 2928 N
+ K F AA e n/a 21 2819 2906 2929 N
+ K F AA i n/a 21 2819 2908 2928 N
+ K F AA s n/a 21 2819 2908 2929 N
+ K F AE b n/a 21 2814 2885 2958 N
+ K F AE e n/a 21 2814 2886 2963 N
+ K F AE i n/a 21 2814 2886 2958 N
+ K F AE s n/a 21 2814 2885 2958 N
+ K F AH b n/a 21 2814 2877 2931 N
+ K F AH e n/a 21 2814 2877 2940 N
+ K F AH i n/a 21 2814 2877 2940 N
+ K F AH s n/a 21 2814 2877 2940 N
+ K F AO b n/a 21 2819 2896 2917 N
+ K F AO e n/a 21 2819 2896 2918 N
+ K F AO i n/a 21 2819 2896 2917 N
+ K F AO s n/a 21 2819 2896 2917 N
+ K F AW b n/a 21 2814 2885 2959 N
+ K F AW e n/a 21 2814 2886 2963 N
+ K F AW s n/a 21 2814 2885 2959 N
+ K F AY b n/a 21 2819 2910 2930 N
+ K F AY e n/a 21 2819 2906 2925 N
+ K F AY s n/a 21 2819 2910 2925 N
+ K F B b n/a 21 2814 2859 2944 N
+ K F B e n/a 21 2814 2859 2944 N
+ K F B s n/a 21 2814 2859 2944 N
+ K F CH e n/a 21 2814 2856 2944 N
+ K F CH s n/a 21 2814 2856 2944 N
+ K F D b n/a 21 2814 2859 2944 N
+ K F D e n/a 21 2814 2859 2944 N
+ K F D s n/a 21 2814 2859 2944 N
+ K F DH e n/a 21 2814 2859 2944 N
+ K F DH s n/a 21 2814 2859 2944 N
+ K F EH b n/a 21 2814 2885 2958 N
+ K F EH e n/a 21 2814 2886 2963 N
+ K F EH s n/a 21 2814 2885 2958 N
+ K F ER b n/a 21 2819 2912 2926 N
+ K F ER e n/a 21 2819 2912 2936 N
+ K F ER i n/a 21 2819 2912 2936 N
+ K F ER s n/a 21 2819 2912 2936 N
+ K F EY b n/a 21 2814 2885 2960 N
+ K F EY e n/a 21 2814 2886 2963 N
+ K F EY i n/a 21 2814 2886 2960 N
+ K F EY s n/a 21 2814 2885 2960 N
+ K F F b n/a 21 2814 2859 2952 N
+ K F F e n/a 21 2814 2859 2952 N
+ K F F s n/a 21 2814 2859 2952 N
+ K F G e n/a 21 2814 2859 2944 N
+ K F G s n/a 21 2814 2859 2944 N
+ K F HH e n/a 21 2814 2859 2951 N
+ K F HH s n/a 21 2814 2859 2951 N
+ K F IH b n/a 21 2814 2885 2969 N
+ K F IH e n/a 21 2814 2886 2961 N
+ K F IH i n/a 21 2814 2886 2967 N
+ K F IH s n/a 21 2814 2885 2961 N
+ K F IY b n/a 21 2814 2885 2966 N
+ K F IY e n/a 21 2814 2886 2961 N
+ K F IY i n/a 21 2814 2886 2967 N
+ K F IY s n/a 21 2814 2885 2961 N
+ K F JH e n/a 21 2814 2857 2944 N
+ K F JH s n/a 21 2814 2857 2944 N
+ K F K b n/a 21 2814 2859 2944 N
+ K F K e n/a 21 2814 2859 2944 N
+ K F K s n/a 21 2814 2859 2944 N
+ K F L b n/a 21 2819 2897 2919 N
+ K F L e n/a 21 2819 2897 2918 N
+ K F L s n/a 21 2819 2897 2918 N
+ K F M b n/a 21 2814 2859 2947 N
+ K F M e n/a 21 2814 2859 2947 N
+ K F M s n/a 21 2814 2859 2947 N
+ K F N b n/a 21 2814 2859 2947 N
+ K F N e n/a 21 2814 2859 2947 N
+ K F N i n/a 21 2814 2859 2947 N
+ K F N s n/a 21 2814 2859 2947 N
+ K F NG b n/a 21 2814 2859 2947 N
+ K F NG e n/a 21 2814 2859 2947 N
+ K F NG s n/a 21 2814 2859 2947 N
+ K F OW b n/a 21 2819 2913 2927 N
+ K F OW e n/a 21 2819 2912 2925 N
+ K F OW i n/a 21 2819 2912 2925 N
+ K F OW s n/a 21 2819 2912 2925 N
+ K F OY b n/a 21 2819 2896 2917 N
+ K F OY e n/a 21 2819 2896 2918 N
+ K F OY s n/a 21 2819 2896 2917 N
+ K F P b n/a 21 2814 2859 2944 N
+ K F P e n/a 21 2814 2859 2944 N
+ K F P s n/a 21 2814 2859 2944 N
+ K F R b n/a 21 2819 2898 2923 N
+ K F R e n/a 21 2819 2898 2922 N
+ K F R i n/a 21 2819 2898 2922 N
+ K F R s n/a 21 2819 2898 2922 N
+ K F S b n/a 21 2814 2867 2955 N
+ K F S e n/a 21 2814 2867 2955 N
+ K F S s n/a 21 2814 2867 2955 N
+ K F SH b n/a 21 2814 2856 2956 N
+ K F SH e n/a 21 2814 2856 2956 N
+ K F SH s n/a 21 2814 2856 2956 N
+ K F SIL e n/a 21 2814 2859 2949 N
+ K F SIL s n/a 21 2814 2859 2949 N
+ K F T b n/a 21 2814 2859 2944 N
+ K F T e n/a 21 2814 2859 2944 N
+ K F T s n/a 21 2814 2859 2944 N
+ K F TH e n/a 21 2814 2859 2949 N
+ K F TH s n/a 21 2814 2859 2949 N
+ K F UH b n/a 21 2819 2912 2934 N
+ K F UH e n/a 21 2819 2912 2936 N
+ K F UH s n/a 21 2819 2912 2936 N
+ K F UW b n/a 21 2819 2913 2927 N
+ K F UW e n/a 21 2819 2912 2924 N
+ K F UW s n/a 21 2819 2912 2924 N
+ K F V b n/a 21 2814 2859 2944 N
+ K F V e n/a 21 2814 2859 2944 N
+ K F V s n/a 21 2814 2859 2944 N
+ K F W b n/a 21 2819 2892 2921 N
+ K F W e n/a 21 2819 2906 2920 N
+ K F W i n/a 21 2819 2892 2921 N
+ K F W s n/a 21 2819 2892 2921 N
+ K F Y b n/a 21 2814 2885 2965 N
+ K F Y e n/a 21 2814 2886 2965 N
+ K F Y s n/a 21 2814 2885 2965 N
+ K F Z e n/a 21 2814 2865 2955 N
+ K F Z s n/a 21 2814 2865 2955 N
+ K F ZH e n/a 21 2814 2857 2956 N
+ K F ZH s n/a 21 2814 2857 2956 N
+ K G AA b n/a 21 2817 2908 2928 N
+ K G AA e n/a 21 2817 2906 2929 N
+ K G AA i n/a 21 2817 2908 2928 N
+ K G AA s n/a 21 2817 2908 2929 N
+ K G AE b n/a 21 2816 2880 2958 N
+ K G AE e n/a 21 2816 2880 2963 N
+ K G AE s n/a 21 2816 2880 2958 N
+ K G AH b n/a 21 2815 2871 2931 N
+ K G AH e n/a 21 2815 2871 2940 N
+ K G AH i n/a 21 2815 2871 2938 N
+ K G AH s n/a 21 2815 2871 2940 N
+ K G AO b n/a 21 2817 2894 2916 N
+ K G AO e n/a 21 2817 2894 2918 N
+ K G AO i n/a 21 2817 2894 2917 N
+ K G AO s n/a 21 2817 2894 2916 N
+ K G AW b n/a 21 2816 2880 2959 N
+ K G AW e n/a 21 2816 2880 2963 N
+ K G AW s n/a 21 2816 2880 2959 N
+ K G AY b n/a 21 2817 2910 2930 N
+ K G AY e n/a 21 2817 2906 2925 N
+ K G AY s n/a 21 2817 2910 2925 N
+ K G B b n/a 21 2816 2859 2944 N
+ K G B e n/a 21 2816 2859 2944 N
+ K G B s n/a 21 2816 2859 2944 N
+ K G CH e n/a 21 2816 2856 2944 N
+ K G CH s n/a 21 2816 2856 2944 N
+ K G D b n/a 21 2816 2859 2944 N
+ K G D e n/a 21 2816 2859 2944 N
+ K G D s n/a 21 2816 2859 2944 N
+ K G DH e n/a 21 2816 2859 2944 N
+ K G DH s n/a 21 2816 2859 2944 N
+ K G EH b n/a 21 2816 2880 2958 N
+ K G EH e n/a 21 2816 2880 2963 N
+ K G EH s n/a 21 2816 2880 2958 N
+ K G ER b n/a 21 2817 2912 2926 N
+ K G ER e n/a 21 2817 2912 2936 N
+ K G ER i n/a 21 2817 2912 2936 N
+ K G ER s n/a 21 2817 2912 2936 N
+ K G EY b n/a 21 2816 2880 2960 N
+ K G EY e n/a 21 2816 2880 2963 N
+ K G EY s n/a 21 2816 2880 2960 N
+ K G F b n/a 21 2816 2859 2952 N
+ K G F e n/a 21 2816 2859 2952 N
+ K G F s n/a 21 2816 2859 2952 N
+ K G G e n/a 21 2816 2859 2944 N
+ K G G s n/a 21 2816 2859 2944 N
+ K G HH e n/a 21 2816 2859 2951 N
+ K G HH s n/a 21 2816 2859 2951 N
+ K G IH b n/a 21 2815 2880 2969 N
+ K G IH e n/a 21 2815 2880 2961 N
+ K G IH s n/a 21 2815 2880 2961 N
+ K G IY b n/a 21 2816 2880 2966 N
+ K G IY e n/a 21 2816 2880 2961 N
+ K G IY s n/a 21 2816 2880 2961 N
+ K G JH e n/a 21 2816 2857 2944 N
+ K G JH s n/a 21 2816 2857 2944 N
+ K G K b n/a 21 2816 2859 2944 N
+ K G K e n/a 21 2816 2859 2944 N
+ K G K s n/a 21 2816 2859 2944 N
+ K G L b n/a 21 2817 2894 2919 N
+ K G L e n/a 21 2817 2894 2918 N
+ K G L s n/a 21 2817 2894 2918 N
+ K G M b n/a 21 2816 2859 2947 N
+ K G M e n/a 21 2816 2859 2947 N
+ K G M s n/a 21 2816 2859 2947 N
+ K G N b n/a 21 2816 2859 2947 N
+ K G N e n/a 21 2816 2859 2947 N
+ K G N s n/a 21 2816 2859 2947 N
+ K G NG b n/a 21 2816 2859 2947 N
+ K G NG e n/a 21 2816 2859 2947 N
+ K G NG s n/a 21 2816 2859 2947 N
+ K G OW b n/a 21 2817 2913 2927 N
+ K G OW e n/a 21 2817 2912 2925 N
+ K G OW i n/a 21 2817 2912 2925 N
+ K G OW s n/a 21 2817 2912 2925 N
+ K G OY b n/a 21 2817 2894 2916 N
+ K G OY e n/a 21 2817 2894 2918 N
+ K G OY s n/a 21 2817 2894 2916 N
+ K G P b n/a 21 2816 2859 2944 N
+ K G P e n/a 21 2816 2859 2944 N
+ K G P s n/a 21 2816 2859 2944 N
+ K G R b n/a 21 2817 2898 2923 N
+ K G R e n/a 21 2817 2898 2922 N
+ K G R s n/a 21 2817 2898 2922 N
+ K G S b n/a 21 2816 2868 2955 N
+ K G S e n/a 21 2816 2868 2955 N
+ K G S s n/a 21 2816 2868 2955 N
+ K G SH b n/a 21 2816 2856 2956 N
+ K G SH e n/a 21 2816 2856 2956 N
+ K G SH s n/a 21 2816 2856 2956 N
+ K G SIL e n/a 21 2816 2859 2948 N
+ K G SIL s n/a 21 2816 2859 2948 N
+ K G T b n/a 21 2816 2859 2944 N
+ K G T e n/a 21 2816 2859 2944 N
+ K G T s n/a 21 2816 2859 2944 N
+ K G TH e n/a 21 2816 2859 2949 N
+ K G TH s n/a 21 2816 2859 2949 N
+ K G UH b n/a 21 2817 2912 2934 N
+ K G UH e n/a 21 2817 2912 2936 N
+ K G UH s n/a 21 2817 2912 2936 N
+ K G UW b n/a 21 2817 2913 2927 N
+ K G UW e n/a 21 2817 2912 2926 N
+ K G UW s n/a 21 2817 2912 2926 N
+ K G V b n/a 21 2816 2859 2944 N
+ K G V e n/a 21 2816 2859 2944 N
+ K G V s n/a 21 2816 2859 2944 N
+ K G W b n/a 21 2819 2892 2921 N
+ K G W e n/a 21 2819 2906 2920 N
+ K G W i n/a 21 2819 2892 2921 N
+ K G W s n/a 21 2819 2892 2921 N
+ K G Y b n/a 21 2816 2880 2965 N
+ K G Y e n/a 21 2816 2880 2965 N
+ K G Y s n/a 21 2816 2880 2965 N
+ K G Z e n/a 21 2816 2865 2955 N
+ K G Z s n/a 21 2816 2865 2955 N
+ K G ZH e n/a 21 2816 2857 2956 N
+ K G ZH s n/a 21 2816 2857 2956 N
+ K HH AA b n/a 21 2817 2908 2928 N
+ K HH AA s n/a 21 2817 2908 2929 N
+ K HH AE b n/a 21 2814 2879 2958 N
+ K HH AE s n/a 21 2814 2879 2958 N
+ K HH AH b n/a 21 2814 2870 2931 N
+ K HH AH s n/a 21 2814 2870 2940 N
+ K HH AO b n/a 21 2817 2894 2916 N
+ K HH AO s n/a 21 2817 2894 2916 N
+ K HH AW b n/a 21 2814 2879 2959 N
+ K HH AW s n/a 21 2814 2879 2959 N
+ K HH AY b n/a 21 2817 2910 2930 N
+ K HH AY s n/a 21 2817 2910 2925 N
+ K HH B b n/a 21 2814 2859 2944 N
+ K HH B s n/a 21 2814 2859 2944 N
+ K HH CH s n/a 21 2814 2856 2944 N
+ K HH D b n/a 21 2814 2859 2944 N
+ K HH D s n/a 21 2814 2859 2944 N
+ K HH DH s n/a 21 2814 2859 2944 N
+ K HH EH b n/a 21 2814 2879 2958 N
+ K HH EH s n/a 21 2814 2879 2958 N
+ K HH ER b n/a 21 2817 2912 2926 N
+ K HH ER s n/a 21 2817 2912 2936 N
+ K HH EY b n/a 21 2814 2879 2960 N
+ K HH EY s n/a 21 2814 2879 2960 N
+ K HH F b n/a 21 2814 2859 2952 N
+ K HH F s n/a 21 2814 2859 2952 N
+ K HH G s n/a 21 2814 2859 2944 N
+ K HH HH s n/a 21 2814 2859 2951 N
+ K HH IH b n/a 21 2814 2879 2969 N
+ K HH IH s n/a 21 2814 2879 2961 N
+ K HH IY b n/a 21 2814 2879 2966 N
+ K HH IY s n/a 21 2814 2879 2961 N
+ K HH JH s n/a 21 2814 2857 2944 N
+ K HH K b n/a 21 2814 2859 2944 N
+ K HH K s n/a 21 2814 2859 2944 N
+ K HH L b n/a 21 2817 2894 2919 N
+ K HH L s n/a 21 2817 2894 2918 N
+ K HH M b n/a 21 2814 2859 2947 N
+ K HH M s n/a 21 2814 2859 2947 N
+ K HH N b n/a 21 2814 2859 2947 N
+ K HH N s n/a 21 2814 2859 2947 N
+ K HH NG b n/a 21 2814 2859 2947 N
+ K HH NG s n/a 21 2814 2859 2947 N
+ K HH OW b n/a 21 2817 2913 2927 N
+ K HH OW s n/a 21 2817 2912 2925 N
+ K HH OY b n/a 21 2817 2894 2916 N
+ K HH OY s n/a 21 2817 2894 2916 N
+ K HH P b n/a 21 2814 2859 2944 N
+ K HH P s n/a 21 2814 2859 2944 N
+ K HH R b n/a 21 2817 2898 2923 N
+ K HH R s n/a 21 2817 2898 2922 N
+ K HH S b n/a 21 2814 2867 2955 N
+ K HH S s n/a 21 2814 2867 2955 N
+ K HH SH b n/a 21 2814 2856 2956 N
+ K HH SH s n/a 21 2814 2856 2956 N
+ K HH SIL s n/a 21 2814 2859 2949 N
+ K HH T b n/a 21 2814 2859 2944 N
+ K HH T s n/a 21 2814 2859 2944 N
+ K HH TH s n/a 21 2814 2859 2949 N
+ K HH UH b n/a 21 2817 2912 2934 N
+ K HH UH i n/a 21 2817 2912 2936 N
+ K HH UH s n/a 21 2817 2912 2936 N
+ K HH UW b n/a 21 2817 2913 2927 N
+ K HH UW s n/a 21 2817 2912 2924 N
+ K HH V b n/a 21 2814 2859 2944 N
+ K HH V s n/a 21 2814 2859 2944 N
+ K HH W b n/a 21 2819 2892 2921 N
+ K HH W s n/a 21 2819 2892 2921 N
+ K HH Y b n/a 21 2814 2879 2965 N
+ K HH Y s n/a 21 2814 2879 2965 N
+ K HH Z s n/a 21 2814 2865 2955 N
+ K HH ZH s n/a 21 2814 2857 2956 N
+ K IH AA b n/a 21 2846 2910 2928 N
+ K IH AA e n/a 21 2845 2906 2929 N
+ K IH AA i n/a 21 2845 2910 2928 N
+ K IH AA s n/a 21 2845 2910 2929 N
+ K IH AE b n/a 21 2848 2881 2958 N
+ K IH AE e n/a 21 2849 2883 2963 N
+ K IH AE i n/a 21 2848 2881 2958 N
+ K IH AE s n/a 21 2848 2881 2958 N
+ K IH AH b n/a 21 2848 2878 2931 N
+ K IH AH e n/a 21 2849 2875 2937 N
+ K IH AH i n/a 21 2848 2876 2937 N
+ K IH AH s n/a 21 2848 2873 2937 N
+ K IH AO b n/a 21 2846 2896 2916 N
+ K IH AO e n/a 21 2845 2902 2918 N
+ K IH AO i n/a 21 2845 2901 2916 N
+ K IH AO s n/a 21 2845 2902 2916 N
+ K IH AW b n/a 21 2848 2881 2959 N
+ K IH AW e n/a 21 2849 2883 2963 N
+ K IH AW i n/a 21 2848 2881 2959 N
+ K IH AW s n/a 21 2848 2881 2959 N
+ K IH AY b n/a 21 2846 2910 2930 N
+ K IH AY e n/a 21 2845 2906 2925 N
+ K IH AY i n/a 21 2845 2910 2925 N
+ K IH AY s n/a 21 2845 2910 2925 N
+ K IH B b n/a 21 2849 2860 2944 N
+ K IH B e n/a 21 2849 2860 2944 N
+ K IH B i n/a 21 2849 2860 2944 N
+ K IH B s n/a 21 2849 2860 2944 N
+ K IH CH e n/a 21 2849 2860 2944 N
+ K IH CH i n/a 21 2849 2860 2944 N
+ K IH CH s n/a 21 2849 2860 2944 N
+ K IH D b n/a 21 2849 2864 2944 N
+ K IH D e n/a 21 2849 2864 2944 N
+ K IH D i n/a 21 2849 2864 2944 N
+ K IH D s n/a 21 2849 2864 2944 N
+ K IH DH e n/a 21 2849 2860 2944 N
+ K IH DH s n/a 21 2849 2860 2944 N
+ K IH EH b n/a 21 2848 2881 2958 N
+ K IH EH e n/a 21 2849 2883 2963 N
+ K IH EH i n/a 21 2848 2881 2958 N
+ K IH EH s n/a 21 2848 2881 2958 N
+ K IH ER b n/a 21 2846 2913 2926 N
+ K IH ER e n/a 21 2845 2915 2934 N
+ K IH ER i n/a 21 2845 2915 2934 N
+ K IH ER s n/a 21 2845 2915 2934 N
+ K IH EY b n/a 21 2848 2881 2960 N
+ K IH EY e n/a 21 2849 2883 2963 N
+ K IH EY i n/a 21 2848 2881 2960 N
+ K IH EY s n/a 21 2848 2881 2960 N
+ K IH F b n/a 21 2849 2860 2952 N
+ K IH F e n/a 21 2849 2860 2952 N
+ K IH F i n/a 21 2849 2860 2952 N
+ K IH F s n/a 21 2849 2860 2952 N
+ K IH G e n/a 21 2849 2860 2944 N
+ K IH G s n/a 21 2849 2860 2944 N
+ K IH HH e n/a 21 2849 2860 2951 N
+ K IH HH i n/a 21 2849 2860 2951 N
+ K IH HH s n/a 21 2849 2860 2951 N
+ K IH IH b n/a 21 2848 2881 2969 N
+ K IH IH e n/a 21 2849 2883 2961 N
+ K IH IH i n/a 21 2848 2882 2967 N
+ K IH IH s n/a 21 2848 2881 2961 N
+ K IH IY b n/a 21 2848 2881 2966 N
+ K IH IY e n/a 21 2849 2883 2961 N
+ K IH IY i n/a 21 2848 2882 2968 N
+ K IH IY s n/a 21 2848 2881 2961 N
+ K IH JH e n/a 21 2849 2860 2944 N
+ K IH JH s n/a 21 2849 2860 2944 N
+ K IH K b n/a 21 2849 2860 2944 N
+ K IH K e n/a 21 2849 2860 2944 N
+ K IH K s n/a 21 2849 2860 2944 N
+ K IH L b n/a 21 2846 2897 2919 N
+ K IH L e n/a 21 2845 2902 2918 N
+ K IH L i n/a 21 2845 2902 2918 N
+ K IH L s n/a 21 2845 2902 2918 N
+ K IH M b n/a 21 2849 2860 2947 N
+ K IH M e n/a 21 2849 2860 2947 N
+ K IH M i n/a 21 2849 2860 2947 N
+ K IH M s n/a 21 2849 2860 2947 N
+ K IH N b n/a 21 2849 2864 2947 N
+ K IH N e n/a 21 2849 2864 2947 N
+ K IH N i n/a 21 2849 2864 2947 N
+ K IH N s n/a 21 2849 2864 2947 N
+ K IH NG b n/a 21 2849 2860 2947 N
+ K IH NG e n/a 21 2849 2860 2947 N
+ K IH NG s n/a 21 2849 2860 2947 N
+ K IH OW b n/a 21 2846 2913 2927 N
+ K IH OW e n/a 21 2845 2915 2925 N
+ K IH OW i n/a 21 2845 2915 2925 N
+ K IH OW s n/a 21 2845 2915 2925 N
+ K IH OY b n/a 21 2846 2896 2916 N
+ K IH OY e n/a 21 2845 2902 2918 N
+ K IH OY i n/a 21 2845 2901 2916 N
+ K IH OY s n/a 21 2845 2902 2916 N
+ K IH P b n/a 21 2849 2860 2944 N
+ K IH P e n/a 21 2849 2860 2944 N
+ K IH P i n/a 21 2849 2860 2944 N
+ K IH P s n/a 21 2849 2860 2944 N
+ K IH R b n/a 21 2846 2898 2923 N
+ K IH R e n/a 21 2845 2902 2922 N
+ K IH R i n/a 21 2845 2901 2923 N
+ K IH R s n/a 21 2845 2902 2922 N
+ K IH S b n/a 21 2850 2869 2953 N
+ K IH S e n/a 21 2850 2869 2953 N
+ K IH S i n/a 21 2850 2869 2953 N
+ K IH S s n/a 21 2850 2869 2953 N
+ K IH SH b n/a 21 2849 2860 2956 N
+ K IH SH e n/a 21 2849 2860 2956 N
+ K IH SH i n/a 21 2849 2860 2956 N
+ K IH SH s n/a 21 2849 2860 2956 N
+ K IH SIL e n/a 21 2849 2860 2948 N
+ K IH SIL s n/a 21 2849 2860 2948 N
+ K IH T b n/a 21 2849 2864 2944 N
+ K IH T e n/a 21 2849 2864 2944 N
+ K IH T i n/a 21 2849 2864 2944 N
+ K IH T s n/a 21 2849 2864 2944 N
+ K IH TH e n/a 21 2849 2860 2948 N
+ K IH TH s n/a 21 2849 2860 2948 N
+ K IH UH b n/a 21 2846 2913 2934 N
+ K IH UH e n/a 21 2845 2915 2934 N
+ K IH UH i n/a 21 2845 2915 2934 N
+ K IH UH s n/a 21 2845 2915 2934 N
+ K IH UW b n/a 21 2846 2913 2927 N
+ K IH UW e n/a 21 2845 2915 2926 N
+ K IH UW i n/a 21 2845 2915 2926 N
+ K IH UW s n/a 21 2845 2915 2926 N
+ K IH V b n/a 21 2849 2860 2944 N
+ K IH V e n/a 21 2849 2860 2944 N
+ K IH V i n/a 21 2849 2860 2944 N
+ K IH V s n/a 21 2849 2860 2944 N
+ K IH W b n/a 21 2846 2893 2921 N
+ K IH W e n/a 21 2845 2906 2920 N
+ K IH W i n/a 21 2845 2893 2921 N
+ K IH W s n/a 21 2845 2893 2921 N
+ K IH Y b n/a 21 2849 2883 2965 N
+ K IH Y e n/a 21 2849 2883 2965 N
+ K IH Y i n/a 21 2849 2884 2965 N
+ K IH Y s n/a 21 2849 2883 2965 N
+ K IH Z e n/a 21 2850 2865 2953 N
+ K IH Z i n/a 21 2850 2865 2953 N
+ K IH Z s n/a 21 2850 2865 2953 N
+ K IH ZH e n/a 21 2849 2860 2956 N
+ K IH ZH s n/a 21 2849 2860 2956 N
+ K IY AA b n/a 21 2853 2910 2928 N
+ K IY AA e n/a 21 2853 2906 2929 N
+ K IY AA i n/a 21 2853 2910 2928 N
+ K IY AA s n/a 21 2853 2910 2929 N
+ K IY AE b n/a 21 2852 2880 2958 N
+ K IY AE e n/a 21 2852 2882 2963 N
+ K IY AE i n/a 21 2852 2880 2958 N
+ K IY AE s n/a 21 2852 2880 2958 N
+ K IY AH b n/a 21 2852 2866 2933 N
+ K IY AH e n/a 21 2852 2866 2940 N
+ K IY AH i n/a 21 2852 2866 2939 N
+ K IY AH s n/a 21 2852 2866 2940 N
+ K IY AO b n/a 21 2853 2901 2916 N
+ K IY AO e n/a 21 2853 2902 2918 N
+ K IY AO i n/a 21 2853 2901 2916 N
+ K IY AO s n/a 21 2853 2902 2916 N
+ K IY AW b n/a 21 2852 2880 2959 N
+ K IY AW e n/a 21 2852 2882 2963 N
+ K IY AW i n/a 21 2852 2880 2959 N
+ K IY AW s n/a 21 2852 2880 2959 N
+ K IY AY b n/a 21 2853 2910 2930 N
+ K IY AY e n/a 21 2853 2906 2925 N
+ K IY AY i n/a 21 2853 2910 2925 N
+ K IY AY s n/a 21 2853 2910 2925 N
+ K IY B b n/a 21 2852 2860 2944 N
+ K IY B e n/a 21 2852 2860 2944 N
+ K IY B i n/a 21 2852 2860 2944 N
+ K IY B s n/a 21 2852 2860 2944 N
+ K IY CH e n/a 21 2852 2860 2944 N
+ K IY CH i n/a 21 2852 2860 2944 N
+ K IY CH s n/a 21 2852 2860 2944 N
+ K IY D b n/a 21 2852 2860 2944 N
+ K IY D e n/a 21 2852 2860 2944 N
+ K IY D i n/a 21 2852 2860 2944 N
+ K IY D s n/a 21 2852 2860 2944 N
+ K IY DH e n/a 21 2852 2865 2944 N
+ K IY DH s n/a 21 2852 2865 2944 N
+ K IY EH b n/a 21 2852 2880 2958 N
+ K IY EH e n/a 21 2852 2882 2963 N
+ K IY EH i n/a 21 2852 2880 2958 N
+ K IY EH s n/a 21 2852 2880 2958 N
+ K IY ER b n/a 21 2853 2911 2926 N
+ K IY ER e n/a 21 2853 2911 2936 N
+ K IY ER i n/a 21 2853 2911 2936 N
+ K IY ER s n/a 21 2853 2911 2936 N
+ K IY EY b n/a 21 2852 2880 2960 N
+ K IY EY e n/a 21 2852 2882 2963 N
+ K IY EY i n/a 21 2852 2880 2960 N
+ K IY EY s n/a 21 2852 2880 2960 N
+ K IY F b n/a 21 2852 2868 2952 N
+ K IY F e n/a 21 2852 2868 2952 N
+ K IY F s n/a 21 2852 2868 2952 N
+ K IY G e n/a 21 2852 2860 2944 N
+ K IY G s n/a 21 2852 2860 2944 N
+ K IY HH e n/a 21 2852 2865 2951 N
+ K IY HH s n/a 21 2852 2865 2951 N
+ K IY IH b n/a 21 2852 2882 2969 N
+ K IY IH e n/a 21 2852 2882 2961 N
+ K IY IH i n/a 21 2852 2882 2968 N
+ K IY IH s n/a 21 2852 2882 2961 N
+ K IY IY b n/a 21 2852 2882 2966 N
+ K IY IY e n/a 21 2852 2882 2961 N
+ K IY IY i n/a 21 2852 2882 2968 N
+ K IY IY s n/a 21 2852 2882 2961 N
+ K IY JH e n/a 21 2852 2860 2944 N
+ K IY JH s n/a 21 2852 2860 2944 N
+ K IY K b n/a 21 2852 2860 2944 N
+ K IY K e n/a 21 2852 2860 2944 N
+ K IY K s n/a 21 2852 2860 2944 N
+ K IY L b n/a 21 2853 2901 2919 N
+ K IY L e n/a 21 2853 2902 2918 N
+ K IY L i n/a 21 2853 2902 2918 N
+ K IY L s n/a 21 2853 2902 2918 N
+ K IY M b n/a 21 2852 2865 2947 N
+ K IY M e n/a 21 2852 2865 2947 N
+ K IY M i n/a 21 2852 2865 2947 N
+ K IY M s n/a 21 2852 2865 2947 N
+ K IY N b n/a 21 2852 2865 2947 N
+ K IY N e n/a 21 2852 2865 2947 N
+ K IY N i n/a 21 2852 2865 2947 N
+ K IY N s n/a 21 2852 2865 2947 N
+ K IY NG b n/a 21 2852 2865 2947 N
+ K IY NG e n/a 21 2852 2865 2947 N
+ K IY NG s n/a 21 2852 2865 2947 N
+ K IY OW b n/a 21 2853 2911 2927 N
+ K IY OW e n/a 21 2853 2911 2925 N
+ K IY OW i n/a 21 2853 2911 2925 N
+ K IY OW s n/a 21 2853 2911 2925 N
+ K IY OY b n/a 21 2853 2901 2916 N
+ K IY OY e n/a 21 2853 2902 2918 N
+ K IY OY i n/a 21 2853 2901 2916 N
+ K IY OY s n/a 21 2853 2902 2916 N
+ K IY P b n/a 21 2852 2860 2944 N
+ K IY P e n/a 21 2852 2860 2944 N
+ K IY P i n/a 21 2852 2860 2944 N
+ K IY P s n/a 21 2852 2860 2944 N
+ K IY R b n/a 21 2853 2901 2923 N
+ K IY R e n/a 21 2853 2902 2922 N
+ K IY R i n/a 21 2853 2901 2922 N
+ K IY R s n/a 21 2853 2902 2922 N
+ K IY S b n/a 21 2852 2868 2953 N
+ K IY S e n/a 21 2852 2868 2953 N
+ K IY S i n/a 21 2852 2868 2953 N
+ K IY S s n/a 21 2852 2868 2953 N
+ K IY SH b n/a 21 2852 2868 2956 N
+ K IY SH e n/a 21 2852 2868 2956 N
+ K IY SH i n/a 21 2852 2868 2956 N
+ K IY SH s n/a 21 2852 2868 2956 N
+ K IY SIL e n/a 21 2852 2866 2948 N
+ K IY SIL s n/a 21 2852 2866 2948 N
+ K IY T b n/a 21 2852 2860 2944 N
+ K IY T e n/a 21 2852 2860 2944 N
+ K IY T i n/a 21 2852 2860 2944 N
+ K IY T s n/a 21 2852 2860 2944 N
+ K IY TH e n/a 21 2852 2868 2948 N
+ K IY TH s n/a 21 2852 2868 2948 N
+ K IY UH b n/a 21 2852 2911 2934 N
+ K IY UH e n/a 21 2852 2911 2936 N
+ K IY UH i n/a 21 2852 2911 2936 N
+ K IY UH s n/a 21 2852 2911 2936 N
+ K IY UW b n/a 21 2853 2911 2927 N
+ K IY UW e n/a 21 2853 2911 2926 N
+ K IY UW i n/a 21 2853 2911 2926 N
+ K IY UW s n/a 21 2853 2911 2926 N
+ K IY V b n/a 21 2852 2865 2944 N
+ K IY V e n/a 21 2852 2865 2944 N
+ K IY V s n/a 21 2852 2865 2944 N
+ K IY W b n/a 21 2853 2893 2921 N
+ K IY W e n/a 21 2853 2906 2920 N
+ K IY W i n/a 21 2853 2893 2921 N
+ K IY W s n/a 21 2853 2893 2921 N
+ K IY Y b n/a 21 2852 2882 2965 N
+ K IY Y e n/a 21 2852 2882 2965 N
+ K IY Y i n/a 21 2852 2882 2965 N
+ K IY Y s n/a 21 2852 2882 2965 N
+ K IY Z e n/a 21 2852 2865 2953 N
+ K IY Z i n/a 21 2852 2865 2953 N
+ K IY Z s n/a 21 2852 2865 2953 N
+ K IY ZH e n/a 21 2852 2865 2956 N
+ K IY ZH s n/a 21 2852 2865 2956 N
+ K JH AA b n/a 21 2817 2908 2928 N
+ K JH AA e n/a 21 2817 2906 2929 N
+ K JH AA i n/a 21 2817 2908 2928 N
+ K JH AA s n/a 21 2817 2908 2929 N
+ K JH AE b n/a 21 2816 2880 2958 N
+ K JH AE e n/a 21 2816 2880 2963 N
+ K JH AE s n/a 21 2816 2880 2958 N
+ K JH AH b n/a 21 2814 2871 2931 N
+ K JH AH e n/a 21 2814 2871 2940 N
+ K JH AH i n/a 21 2814 2871 2938 N
+ K JH AH s n/a 21 2814 2871 2940 N
+ K JH AO b n/a 21 2817 2894 2916 N
+ K JH AO e n/a 21 2817 2894 2918 N
+ K JH AO i n/a 21 2817 2894 2917 N
+ K JH AO s n/a 21 2817 2894 2916 N
+ K JH AW b n/a 21 2816 2880 2959 N
+ K JH AW e n/a 21 2816 2880 2963 N
+ K JH AW s n/a 21 2816 2880 2959 N
+ K JH AY b n/a 21 2817 2910 2930 N
+ K JH AY e n/a 21 2817 2906 2925 N
+ K JH AY s n/a 21 2817 2910 2925 N
+ K JH B b n/a 21 2816 2859 2944 N
+ K JH B e n/a 21 2816 2859 2944 N
+ K JH B s n/a 21 2816 2859 2944 N
+ K JH CH e n/a 21 2816 2856 2944 N
+ K JH CH s n/a 21 2816 2856 2944 N
+ K JH D b n/a 21 2816 2859 2944 N
+ K JH D e n/a 21 2816 2859 2944 N
+ K JH D s n/a 21 2816 2859 2944 N
+ K JH DH e n/a 21 2816 2859 2944 N
+ K JH DH s n/a 21 2816 2859 2944 N
+ K JH EH b n/a 21 2816 2880 2958 N
+ K JH EH e n/a 21 2816 2880 2963 N
+ K JH EH s n/a 21 2816 2880 2958 N
+ K JH ER b n/a 21 2817 2912 2926 N
+ K JH ER e n/a 21 2817 2912 2936 N
+ K JH ER i n/a 21 2817 2912 2936 N
+ K JH ER s n/a 21 2817 2912 2936 N
+ K JH EY b n/a 21 2816 2880 2960 N
+ K JH EY e n/a 21 2816 2880 2963 N
+ K JH EY s n/a 21 2816 2880 2960 N
+ K JH F b n/a 21 2816 2859 2952 N
+ K JH F e n/a 21 2816 2859 2952 N
+ K JH F s n/a 21 2816 2859 2952 N
+ K JH G e n/a 21 2816 2859 2944 N
+ K JH G s n/a 21 2816 2859 2944 N
+ K JH HH e n/a 21 2816 2859 2951 N
+ K JH HH s n/a 21 2816 2859 2951 N
+ K JH IH b n/a 21 2814 2880 2969 N
+ K JH IH e n/a 21 2814 2880 2961 N
+ K JH IH i n/a 21 2814 2880 2968 N
+ K JH IH s n/a 21 2814 2880 2961 N
+ K JH IY b n/a 21 2816 2880 2966 N
+ K JH IY e n/a 21 2816 2880 2961 N
+ K JH IY i n/a 21 2816 2880 2968 N
+ K JH IY s n/a 21 2816 2880 2961 N
+ K JH JH e n/a 21 2816 2857 2944 N
+ K JH JH s n/a 21 2816 2857 2944 N
+ K JH K b n/a 21 2816 2859 2944 N
+ K JH K e n/a 21 2816 2859 2944 N
+ K JH K s n/a 21 2816 2859 2944 N
+ K JH L b n/a 21 2817 2894 2919 N
+ K JH L e n/a 21 2817 2894 2918 N
+ K JH L s n/a 21 2817 2894 2918 N
+ K JH M b n/a 21 2816 2859 2947 N
+ K JH M e n/a 21 2816 2859 2947 N
+ K JH M s n/a 21 2816 2859 2947 N
+ K JH N b n/a 21 2816 2859 2947 N
+ K JH N e n/a 21 2816 2859 2947 N
+ K JH N s n/a 21 2816 2859 2947 N
+ K JH NG b n/a 21 2816 2859 2947 N
+ K JH NG e n/a 21 2816 2859 2947 N
+ K JH NG s n/a 21 2816 2859 2947 N
+ K JH OW b n/a 21 2817 2913 2927 N
+ K JH OW e n/a 21 2817 2912 2925 N
+ K JH OW i n/a 21 2817 2912 2925 N
+ K JH OW s n/a 21 2817 2912 2925 N
+ K JH OY b n/a 21 2817 2894 2916 N
+ K JH OY e n/a 21 2817 2894 2918 N
+ K JH OY s n/a 21 2817 2894 2916 N
+ K JH P b n/a 21 2816 2859 2944 N
+ K JH P e n/a 21 2816 2859 2944 N
+ K JH P s n/a 21 2816 2859 2944 N
+ K JH R b n/a 21 2817 2898 2923 N
+ K JH R e n/a 21 2817 2898 2922 N
+ K JH R i n/a 21 2817 2898 2922 N
+ K JH R s n/a 21 2817 2898 2922 N
+ K JH S b n/a 21 2816 2867 2955 N
+ K JH S e n/a 21 2816 2867 2955 N
+ K JH S s n/a 21 2816 2867 2955 N
+ K JH SH b n/a 21 2816 2856 2956 N
+ K JH SH e n/a 21 2816 2856 2956 N
+ K JH SH s n/a 21 2816 2856 2956 N
+ K JH SIL e n/a 21 2816 2859 2949 N
+ K JH SIL s n/a 21 2816 2859 2949 N
+ K JH T b n/a 21 2816 2859 2944 N
+ K JH T e n/a 21 2816 2859 2944 N
+ K JH T s n/a 21 2816 2859 2944 N
+ K JH TH e n/a 21 2816 2859 2949 N
+ K JH TH s n/a 21 2816 2859 2949 N
+ K JH UH b n/a 21 2817 2912 2934 N
+ K JH UH e n/a 21 2817 2912 2936 N
+ K JH UH s n/a 21 2817 2912 2936 N
+ K JH UW b n/a 21 2817 2913 2927 N
+ K JH UW e n/a 21 2817 2912 2926 N
+ K JH UW s n/a 21 2817 2912 2926 N
+ K JH V b n/a 21 2816 2859 2944 N
+ K JH V e n/a 21 2816 2859 2944 N
+ K JH V s n/a 21 2816 2859 2944 N
+ K JH W b n/a 21 2819 2892 2921 N
+ K JH W e n/a 21 2819 2906 2920 N
+ K JH W s n/a 21 2819 2892 2921 N
+ K JH Y b n/a 21 2816 2880 2965 N
+ K JH Y e n/a 21 2816 2880 2965 N
+ K JH Y s n/a 21 2816 2880 2965 N
+ K JH Z e n/a 21 2816 2865 2955 N
+ K JH Z s n/a 21 2816 2865 2955 N
+ K JH ZH e n/a 21 2816 2857 2956 N
+ K JH ZH s n/a 21 2816 2857 2956 N
+ K K AA b n/a 21 2817 2908 2928 N
+ K K AA e n/a 21 2817 2906 2929 N
+ K K AA s n/a 21 2817 2908 2929 N
+ K K AE b n/a 21 2816 2879 2958 N
+ K K AE e n/a 21 2816 2879 2963 N
+ K K AE s n/a 21 2816 2879 2958 N
+ K K AH b n/a 21 2815 2871 2931 N
+ K K AH e n/a 21 2815 2871 2940 N
+ K K AH s n/a 21 2815 2871 2940 N
+ K K AO b n/a 21 2817 2894 2916 N
+ K K AO e n/a 21 2817 2894 2918 N
+ K K AO s n/a 21 2817 2894 2916 N
+ K K AW b n/a 21 2816 2879 2959 N
+ K K AW e n/a 21 2816 2879 2963 N
+ K K AW s n/a 21 2816 2879 2959 N
+ K K AY b n/a 21 2817 2910 2930 N
+ K K AY e n/a 21 2817 2906 2925 N
+ K K AY s n/a 21 2817 2910 2925 N
+ K K B b n/a 21 2816 2859 2944 N
+ K K B e n/a 21 2816 2859 2944 N
+ K K B s n/a 21 2816 2859 2944 N
+ K K CH e n/a 21 2816 2856 2944 N
+ K K CH s n/a 21 2816 2856 2944 N
+ K K D b n/a 21 2816 2859 2944 N
+ K K D e n/a 21 2816 2859 2944 N
+ K K D s n/a 21 2816 2859 2944 N
+ K K DH e n/a 21 2816 2859 2944 N
+ K K DH s n/a 21 2816 2859 2944 N
+ K K EH b n/a 21 2816 2879 2958 N
+ K K EH e n/a 21 2816 2879 2963 N
+ K K EH s n/a 21 2816 2879 2958 N
+ K K ER b n/a 21 2817 2912 2926 N
+ K K ER e n/a 21 2817 2912 2936 N
+ K K ER i n/a 21 2817 2912 2936 N
+ K K ER s n/a 21 2817 2912 2936 N
+ K K EY b n/a 21 2816 2879 2960 N
+ K K EY e n/a 21 2816 2879 2963 N
+ K K EY i n/a 21 2816 2879 2960 N
+ K K EY s n/a 21 2816 2879 2960 N
+ K K F b n/a 21 2816 2859 2952 N
+ K K F e n/a 21 2816 2859 2952 N
+ K K F s n/a 21 2816 2859 2952 N
+ K K G e n/a 21 2816 2859 2944 N
+ K K G s n/a 21 2816 2859 2944 N
+ K K HH e n/a 21 2816 2859 2951 N
+ K K HH s n/a 21 2816 2859 2951 N
+ K K IH b n/a 21 2815 2879 2969 N
+ K K IH e n/a 21 2815 2879 2961 N
+ K K IH s n/a 21 2815 2879 2961 N
+ K K IY b n/a 21 2816 2879 2966 N
+ K K IY e n/a 21 2816 2879 2961 N
+ K K IY i n/a 21 2816 2879 2967 N
+ K K IY s n/a 21 2816 2879 2961 N
+ K K JH e n/a 21 2816 2857 2944 N
+ K K JH s n/a 21 2816 2857 2944 N
+ K K K b n/a 21 2816 2859 2944 N
+ K K K e n/a 21 2816 2859 2944 N
+ K K K s n/a 21 2816 2859 2944 N
+ K K L b n/a 21 2817 2894 2919 N
+ K K L e n/a 21 2817 2894 2918 N
+ K K L i n/a 21 2817 2894 2918 N
+ K K L s n/a 21 2817 2894 2918 N
+ K K M b n/a 21 2816 2859 2947 N
+ K K M e n/a 21 2816 2859 2947 N
+ K K M s n/a 21 2816 2859 2947 N
+ K K N b n/a 21 2816 2859 2947 N
+ K K N e n/a 21 2816 2859 2947 N
+ K K N s n/a 21 2816 2859 2947 N
+ K K NG b n/a 21 2816 2859 2947 N
+ K K NG e n/a 21 2816 2859 2947 N
+ K K NG s n/a 21 2816 2859 2947 N
+ K K OW b n/a 21 2817 2913 2927 N
+ K K OW e n/a 21 2817 2912 2925 N
+ K K OW i n/a 21 2817 2912 2925 N
+ K K OW s n/a 21 2817 2912 2925 N
+ K K OY b n/a 21 2817 2894 2916 N
+ K K OY e n/a 21 2817 2894 2918 N
+ K K OY s n/a 21 2817 2894 2916 N
+ K K P b n/a 21 2816 2859 2944 N
+ K K P e n/a 21 2816 2859 2944 N
+ K K P s n/a 21 2816 2859 2944 N
+ K K R b n/a 21 2817 2898 2923 N
+ K K R e n/a 21 2817 2898 2922 N
+ K K R s n/a 21 2817 2898 2922 N
+ K K S b n/a 21 2816 2868 2955 N
+ K K S e n/a 21 2816 2868 2955 N
+ K K S s n/a 21 2816 2868 2955 N
+ K K SH b n/a 21 2816 2856 2956 N
+ K K SH e n/a 21 2816 2856 2956 N
+ K K SH s n/a 21 2816 2856 2956 N
+ K K SIL e n/a 21 2816 2859 2948 N
+ K K SIL s n/a 21 2816 2859 2948 N
+ K K T b n/a 21 2816 2859 2944 N
+ K K T e n/a 21 2816 2859 2944 N
+ K K T s n/a 21 2816 2859 2944 N
+ K K TH e n/a 21 2816 2859 2949 N
+ K K TH i n/a 21 2816 2859 2949 N
+ K K TH s n/a 21 2816 2859 2949 N
+ K K UH b n/a 21 2817 2912 2934 N
+ K K UH e n/a 21 2817 2912 2936 N
+ K K UH s n/a 21 2817 2912 2936 N
+ K K UW b n/a 21 2817 2913 2927 N
+ K K UW e n/a 21 2817 2912 2924 N
+ K K UW s n/a 21 2817 2912 2924 N
+ K K V b n/a 21 2816 2859 2944 N
+ K K V e n/a 21 2816 2859 2944 N
+ K K V s n/a 21 2816 2859 2944 N
+ K K W b n/a 21 2819 2892 2921 N
+ K K W e n/a 21 2819 2906 2920 N
+ K K W i n/a 21 2819 2892 2921 N
+ K K W s n/a 21 2819 2892 2921 N
+ K K Y b n/a 21 2816 2879 2965 N
+ K K Y e n/a 21 2816 2879 2965 N
+ K K Y s n/a 21 2816 2879 2965 N
+ K K Z e n/a 21 2816 2865 2955 N
+ K K Z s n/a 21 2816 2865 2955 N
+ K K ZH e n/a 21 2816 2857 2956 N
+ K K ZH s n/a 21 2816 2857 2956 N
+ K L AA b n/a 21 2829 2913 2928 N
+ K L AA e n/a 21 2829 2905 2929 N
+ K L AA i n/a 21 2829 2913 2928 N
+ K L AA s n/a 21 2829 2913 2929 N
+ K L AE b n/a 21 2830 2887 2958 N
+ K L AE e n/a 21 2830 2887 2963 N
+ K L AE i n/a 21 2830 2887 2958 N
+ K L AE s n/a 21 2830 2887 2958 N
+ K L AH b n/a 21 2830 2872 2931 N
+ K L AH e n/a 21 2830 2872 2935 N
+ K L AH i n/a 21 2830 2872 2935 N
+ K L AH s n/a 21 2830 2872 2935 N
+ K L AO b n/a 21 2829 2896 2916 N
+ K L AO e n/a 21 2829 2899 2918 N
+ K L AO i n/a 21 2829 2899 2917 N
+ K L AO s n/a 21 2829 2899 2916 N
+ K L AW b n/a 21 2829 2887 2959 N
+ K L AW e n/a 21 2829 2887 2963 N
+ K L AW i n/a 21 2829 2887 2959 N
+ K L AW s n/a 21 2829 2887 2959 N
+ K L AY b n/a 21 2830 2913 2930 N
+ K L AY e n/a 21 2830 2905 2925 N
+ K L AY i n/a 21 2830 2913 2925 N
+ K L AY s n/a 21 2830 2913 2925 N
+ K L B b n/a 21 2830 2904 2945 N
+ K L B e n/a 21 2830 2904 2945 N
+ K L B i n/a 21 2830 2904 2945 N
+ K L B s n/a 21 2830 2904 2945 N
+ K L CH e n/a 21 2830 2904 2945 N
+ K L CH s n/a 21 2830 2904 2945 N
+ K L D b n/a 21 2830 2904 2945 N
+ K L D e n/a 21 2830 2904 2945 N
+ K L D s n/a 21 2830 2904 2945 N
+ K L DH e n/a 21 2830 2904 2945 N
+ K L DH s n/a 21 2830 2904 2945 N
+ K L EH b n/a 21 2830 2887 2958 N
+ K L EH e n/a 21 2830 2887 2963 N
+ K L EH i n/a 21 2830 2887 2958 N
+ K L EH s n/a 21 2830 2887 2958 N
+ K L ER b n/a 21 2829 2913 2926 N
+ K L ER e n/a 21 2829 2913 2936 N
+ K L ER i n/a 21 2829 2913 2936 N
+ K L ER s n/a 21 2829 2913 2936 N
+ K L EY b n/a 21 2830 2887 2960 N
+ K L EY e n/a 21 2830 2887 2963 N
+ K L EY i n/a 21 2830 2887 2960 N
+ K L EY s n/a 21 2830 2887 2960 N
+ K L F b n/a 21 2830 2904 2952 N
+ K L F e n/a 21 2830 2904 2952 N
+ K L F s n/a 21 2830 2904 2952 N
+ K L G e n/a 21 2830 2904 2945 N
+ K L G s n/a 21 2830 2904 2945 N
+ K L HH e n/a 21 2830 2904 2951 N
+ K L HH i n/a 21 2830 2904 2951 N
+ K L HH s n/a 21 2830 2904 2951 N
+ K L IH b n/a 21 2830 2887 2969 N
+ K L IH e n/a 21 2830 2887 2961 N
+ K L IH i n/a 21 2830 2887 2961 N
+ K L IH s n/a 21 2830 2887 2961 N
+ K L IY b n/a 21 2830 2887 2966 N
+ K L IY e n/a 21 2830 2887 2961 N
+ K L IY i n/a 21 2830 2887 2962 N
+ K L IY s n/a 21 2830 2887 2961 N
+ K L JH e n/a 21 2830 2904 2945 N
+ K L JH s n/a 21 2830 2904 2945 N
+ K L K b n/a 21 2830 2904 2945 N
+ K L K e n/a 21 2830 2904 2945 N
+ K L K s n/a 21 2830 2904 2945 N
+ K L L b n/a 21 2829 2896 2919 N
+ K L L e n/a 21 2829 2899 2918 N
+ K L L i n/a 21 2829 2899 2918 N
+ K L L s n/a 21 2829 2899 2918 N
+ K L M b n/a 21 2830 2904 2947 N
+ K L M e n/a 21 2830 2904 2947 N
+ K L M i n/a 21 2830 2904 2947 N
+ K L M s n/a 21 2830 2904 2947 N
+ K L N b n/a 21 2830 2904 2947 N
+ K L N e n/a 21 2830 2904 2947 N
+ K L N i n/a 21 2830 2904 2947 N
+ K L N s n/a 21 2830 2904 2947 N
+ K L NG b n/a 21 2830 2904 2947 N
+ K L NG e n/a 21 2830 2904 2947 N
+ K L NG s n/a 21 2830 2904 2947 N
+ K L OW b n/a 21 2829 2913 2927 N
+ K L OW e n/a 21 2829 2913 2924 N
+ K L OW i n/a 21 2829 2913 2924 N
+ K L OW s n/a 21 2829 2913 2924 N
+ K L OY b n/a 21 2830 2896 2916 N
+ K L OY e n/a 21 2830 2899 2918 N
+ K L OY i n/a 21 2830 2899 2917 N
+ K L OY s n/a 21 2830 2899 2916 N
+ K L P b n/a 21 2830 2904 2945 N
+ K L P e n/a 21 2830 2904 2945 N
+ K L P s n/a 21 2830 2904 2945 N
+ K L R b n/a 21 2829 2898 2923 N
+ K L R e n/a 21 2829 2899 2922 N
+ K L R i n/a 21 2829 2899 2922 N
+ K L R s n/a 21 2829 2899 2922 N
+ K L S b n/a 21 2830 2904 2955 N
+ K L S e n/a 21 2830 2904 2955 N
+ K L S i n/a 21 2830 2904 2955 N
+ K L S s n/a 21 2830 2904 2955 N
+ K L SH b n/a 21 2830 2904 2956 N
+ K L SH e n/a 21 2830 2904 2956 N
+ K L SH i n/a 21 2830 2904 2956 N
+ K L SH s n/a 21 2830 2904 2956 N
+ K L SIL e n/a 21 2830 2904 2950 N
+ K L SIL s n/a 21 2830 2904 2950 N
+ K L T b n/a 21 2830 2904 2945 N
+ K L T e n/a 21 2830 2904 2945 N
+ K L T i n/a 21 2830 2904 2945 N
+ K L T s n/a 21 2830 2904 2945 N
+ K L TH e n/a 21 2830 2904 2950 N
+ K L TH i n/a 21 2830 2904 2950 N
+ K L TH s n/a 21 2830 2904 2950 N
+ K L UH b n/a 21 2829 2913 2934 N
+ K L UH e n/a 21 2829 2913 2936 N
+ K L UH s n/a 21 2829 2913 2936 N
+ K L UW b n/a 21 2829 2913 2927 N
+ K L UW e n/a 21 2829 2913 2926 N
+ K L UW i n/a 21 2829 2913 2926 N
+ K L UW s n/a 21 2829 2913 2926 N
+ K L V b n/a 21 2830 2904 2945 N
+ K L V e n/a 21 2830 2904 2945 N
+ K L V s n/a 21 2830 2904 2945 N
+ K L W b n/a 21 2829 2892 2921 N
+ K L W e n/a 21 2829 2905 2920 N
+ K L W i n/a 21 2829 2892 2921 N
+ K L W s n/a 21 2829 2892 2921 N
+ K L Y b n/a 21 2832 2887 2965 N
+ K L Y e n/a 21 2832 2887 2965 N
+ K L Y i n/a 21 2832 2887 2965 N
+ K L Y s n/a 21 2832 2887 2965 N
+ K L Z e n/a 21 2830 2904 2955 N
+ K L Z s n/a 21 2830 2904 2955 N
+ K L ZH e n/a 21 2830 2904 2956 N
+ K L ZH s n/a 21 2830 2904 2956 N
+ K M AA b n/a 21 2827 2908 2928 N
+ K M AA e n/a 21 2827 2906 2929 N
+ K M AA i n/a 21 2827 2908 2928 N
+ K M AA s n/a 21 2827 2908 2929 N
+ K M AE b n/a 21 2824 2880 2958 N
+ K M AE e n/a 21 2824 2880 2963 N
+ K M AE i n/a 21 2824 2880 2958 N
+ K M AE s n/a 21 2824 2880 2958 N
+ K M AH b n/a 21 2825 2871 2931 N
+ K M AH e n/a 21 2825 2871 2940 N
+ K M AH i n/a 21 2825 2871 2938 N
+ K M AH s n/a 21 2825 2871 2940 N
+ K M AO b n/a 21 2828 2894 2916 N
+ K M AO e n/a 21 2828 2894 2918 N
+ K M AO i n/a 21 2828 2894 2917 N
+ K M AO s n/a 21 2828 2894 2916 N
+ K M AW b n/a 21 2824 2880 2959 N
+ K M AW e n/a 21 2824 2880 2963 N
+ K M AW s n/a 21 2824 2880 2959 N
+ K M AY b n/a 21 2827 2910 2930 N
+ K M AY e n/a 21 2827 2906 2925 N
+ K M AY s n/a 21 2827 2910 2925 N
+ K M B b n/a 21 2825 2860 2944 N
+ K M B e n/a 21 2825 2860 2944 N
+ K M B s n/a 21 2825 2860 2944 N
+ K M CH e n/a 21 2825 2856 2944 N
+ K M CH s n/a 21 2825 2856 2944 N
+ K M D b n/a 21 2825 2860 2944 N
+ K M D e n/a 21 2825 2860 2944 N
+ K M D s n/a 21 2825 2860 2944 N
+ K M DH e n/a 21 2825 2865 2944 N
+ K M DH s n/a 21 2825 2865 2944 N
+ K M EH b n/a 21 2824 2880 2958 N
+ K M EH e n/a 21 2824 2880 2963 N
+ K M EH i n/a 21 2824 2880 2958 N
+ K M EH s n/a 21 2824 2880 2958 N
+ K M ER b n/a 21 2827 2912 2926 N
+ K M ER e n/a 21 2827 2912 2936 N
+ K M ER i n/a 21 2827 2911 2936 N
+ K M ER s n/a 21 2827 2912 2936 N
+ K M EY b n/a 21 2824 2880 2960 N
+ K M EY e n/a 21 2824 2880 2963 N
+ K M EY i n/a 21 2824 2880 2960 N
+ K M EY s n/a 21 2824 2880 2960 N
+ K M F b n/a 21 2825 2867 2952 N
+ K M F e n/a 21 2825 2867 2952 N
+ K M F s n/a 21 2825 2867 2952 N
+ K M G e n/a 21 2825 2860 2944 N
+ K M G s n/a 21 2825 2860 2944 N
+ K M HH e n/a 21 2825 2865 2951 N
+ K M HH s n/a 21 2825 2865 2951 N
+ K M IH b n/a 21 2824 2880 2969 N
+ K M IH e n/a 21 2824 2880 2961 N
+ K M IH i n/a 21 2824 2880 2968 N
+ K M IH s n/a 21 2824 2880 2961 N
+ K M IY b n/a 21 2824 2880 2966 N
+ K M IY e n/a 21 2824 2880 2961 N
+ K M IY i n/a 21 2824 2880 2968 N
+ K M IY s n/a 21 2824 2880 2961 N
+ K M JH e n/a 21 2825 2857 2944 N
+ K M JH s n/a 21 2825 2857 2944 N
+ K M K b n/a 21 2825 2860 2944 N
+ K M K e n/a 21 2825 2860 2944 N
+ K M K s n/a 21 2825 2860 2944 N
+ K M L b n/a 21 2828 2894 2919 N
+ K M L e n/a 21 2828 2894 2918 N
+ K M L i n/a 21 2828 2894 2918 N
+ K M L s n/a 21 2828 2894 2918 N
+ K M M b n/a 21 2825 2865 2947 N
+ K M M e n/a 21 2825 2865 2947 N
+ K M M s n/a 21 2825 2865 2947 N
+ K M N b n/a 21 2825 2865 2947 N
+ K M N e n/a 21 2825 2865 2947 N
+ K M N s n/a 21 2825 2865 2947 N
+ K M NG b n/a 21 2825 2865 2947 N
+ K M NG e n/a 21 2825 2865 2947 N
+ K M NG s n/a 21 2825 2865 2947 N
+ K M OW b n/a 21 2827 2913 2927 N
+ K M OW e n/a 21 2827 2912 2925 N
+ K M OW i n/a 21 2827 2911 2925 N
+ K M OW s n/a 21 2827 2912 2925 N
+ K M OY b n/a 21 2827 2894 2916 N
+ K M OY e n/a 21 2827 2894 2918 N
+ K M OY s n/a 21 2827 2894 2916 N
+ K M P b n/a 21 2825 2860 2944 N
+ K M P e n/a 21 2825 2860 2944 N
+ K M P s n/a 21 2825 2860 2944 N
+ K M R b n/a 21 2828 2898 2923 N
+ K M R e n/a 21 2828 2898 2922 N
+ K M R i n/a 21 2828 2898 2922 N
+ K M R s n/a 21 2828 2898 2922 N
+ K M S b n/a 21 2825 2867 2953 N
+ K M S e n/a 21 2825 2867 2953 N
+ K M S i n/a 21 2825 2867 2953 N
+ K M S s n/a 21 2825 2867 2953 N
+ K M SH b n/a 21 2825 2867 2956 N
+ K M SH e n/a 21 2825 2867 2956 N
+ K M SH s n/a 21 2825 2867 2956 N
+ K M SIL e n/a 21 2825 2865 2949 N
+ K M SIL s n/a 21 2825 2865 2949 N
+ K M T b n/a 21 2825 2860 2944 N
+ K M T e n/a 21 2825 2860 2944 N
+ K M T s n/a 21 2825 2860 2944 N
+ K M TH e n/a 21 2825 2867 2949 N
+ K M TH s n/a 21 2825 2867 2949 N
+ K M UH b n/a 21 2827 2912 2934 N
+ K M UH e n/a 21 2827 2912 2936 N
+ K M UH s n/a 21 2827 2912 2936 N
+ K M UW b n/a 21 2828 2913 2927 N
+ K M UW e n/a 21 2828 2912 2926 N
+ K M UW s n/a 21 2828 2912 2926 N
+ K M V b n/a 21 2825 2865 2944 N
+ K M V e n/a 21 2825 2865 2944 N
+ K M V i n/a 21 2825 2865 2944 N
+ K M V s n/a 21 2825 2865 2944 N
+ K M W b n/a 21 2828 2892 2921 N
+ K M W e n/a 21 2828 2906 2920 N
+ K M W i n/a 21 2828 2892 2921 N
+ K M W s n/a 21 2828 2892 2921 N
+ K M Y b n/a 21 2824 2880 2965 N
+ K M Y e n/a 21 2824 2880 2965 N
+ K M Y s n/a 21 2824 2880 2965 N
+ K M Z e n/a 21 2825 2865 2953 N
+ K M Z s n/a 21 2825 2865 2953 N
+ K M ZH e n/a 21 2825 2865 2956 N
+ K M ZH s n/a 21 2825 2865 2956 N
+ K N AA b n/a 21 2827 2908 2928 N
+ K N AA e n/a 21 2827 2906 2929 N
+ K N AA i n/a 21 2827 2908 2928 N
+ K N AA s n/a 21 2827 2908 2929 N
+ K N AE b n/a 21 2824 2880 2958 N
+ K N AE e n/a 21 2824 2880 2963 N
+ K N AE i n/a 21 2824 2880 2958 N
+ K N AE s n/a 21 2824 2880 2958 N
+ K N AH b n/a 21 2825 2871 2932 N
+ K N AH e n/a 21 2825 2871 2932 N
+ K N AH i n/a 21 2825 2870 2932 N
+ K N AH s n/a 21 2825 2871 2932 N
+ K N AO b n/a 21 2828 2894 2916 N
+ K N AO e n/a 21 2828 2894 2919 N
+ K N AO i n/a 21 2828 2894 2917 N
+ K N AO s n/a 21 2828 2894 2916 N
+ K N AW b n/a 21 2824 2880 2959 N
+ K N AW e n/a 21 2824 2880 2963 N
+ K N AW i n/a 21 2824 2880 2959 N
+ K N AW s n/a 21 2824 2880 2959 N
+ K N AY b n/a 21 2827 2910 2930 N
+ K N AY e n/a 21 2827 2906 2925 N
+ K N AY i n/a 21 2827 2910 2925 N
+ K N AY s n/a 21 2827 2910 2925 N
+ K N B b n/a 21 2825 2860 2944 N
+ K N B e n/a 21 2825 2860 2944 N
+ K N B s n/a 21 2825 2860 2944 N
+ K N CH e n/a 21 2825 2856 2944 N
+ K N CH i n/a 21 2825 2856 2944 N
+ K N CH s n/a 21 2825 2856 2944 N
+ K N D b n/a 21 2825 2860 2944 N
+ K N D e n/a 21 2825 2860 2944 N
+ K N D s n/a 21 2825 2860 2944 N
+ K N DH e n/a 21 2825 2865 2944 N
+ K N DH s n/a 21 2825 2865 2944 N
+ K N EH b n/a 21 2824 2880 2958 N
+ K N EH e n/a 21 2824 2880 2963 N
+ K N EH i n/a 21 2824 2880 2958 N
+ K N EH s n/a 21 2824 2880 2958 N
+ K N ER b n/a 21 2827 2912 2926 N
+ K N ER e n/a 21 2827 2912 2932 N
+ K N ER i n/a 21 2827 2911 2932 N
+ K N ER s n/a 21 2827 2912 2932 N
+ K N EY b n/a 21 2824 2880 2960 N
+ K N EY e n/a 21 2824 2880 2963 N
+ K N EY i n/a 21 2824 2880 2960 N
+ K N EY s n/a 21 2824 2880 2960 N
+ K N F b n/a 21 2825 2867 2952 N
+ K N F e n/a 21 2825 2867 2952 N
+ K N F s n/a 21 2825 2867 2952 N
+ K N G e n/a 21 2825 2860 2944 N
+ K N G s n/a 21 2825 2860 2944 N
+ K N HH e n/a 21 2825 2865 2951 N
+ K N HH s n/a 21 2825 2865 2951 N
+ K N IH b n/a 21 2824 2880 2969 N
+ K N IH e n/a 21 2824 2880 2961 N
+ K N IH i n/a 21 2824 2880 2968 N
+ K N IH s n/a 21 2824 2880 2961 N
+ K N IY b n/a 21 2824 2880 2966 N
+ K N IY e n/a 21 2824 2880 2961 N
+ K N IY i n/a 21 2824 2880 2968 N
+ K N IY s n/a 21 2824 2880 2961 N
+ K N JH e n/a 21 2825 2857 2944 N
+ K N JH s n/a 21 2825 2857 2944 N
+ K N K b n/a 21 2825 2860 2944 N
+ K N K e n/a 21 2825 2860 2944 N
+ K N K s n/a 21 2825 2860 2944 N
+ K N L b n/a 21 2828 2894 2919 N
+ K N L e n/a 21 2828 2894 2919 N
+ K N L i n/a 21 2828 2894 2919 N
+ K N L s n/a 21 2828 2894 2919 N
+ K N M b n/a 21 2825 2865 2947 N
+ K N M e n/a 21 2825 2865 2947 N
+ K N M s n/a 21 2825 2865 2947 N
+ K N N b n/a 21 2825 2865 2947 N
+ K N N e n/a 21 2825 2865 2947 N
+ K N N s n/a 21 2825 2865 2947 N
+ K N NG b n/a 21 2825 2865 2947 N
+ K N NG e n/a 21 2825 2865 2947 N
+ K N NG s n/a 21 2825 2865 2947 N
+ K N OW b n/a 21 2827 2913 2927 N
+ K N OW e n/a 21 2827 2912 2925 N
+ K N OW i n/a 21 2827 2911 2925 N
+ K N OW s n/a 21 2827 2912 2925 N
+ K N OY b n/a 21 2827 2894 2916 N
+ K N OY e n/a 21 2827 2894 2919 N
+ K N OY i n/a 21 2827 2894 2917 N
+ K N OY s n/a 21 2827 2894 2916 N
+ K N P b n/a 21 2825 2860 2944 N
+ K N P e n/a 21 2825 2860 2944 N
+ K N P s n/a 21 2825 2860 2944 N
+ K N R b n/a 21 2828 2895 2923 N
+ K N R e n/a 21 2828 2895 2923 N
+ K N R i n/a 21 2828 2895 2923 N
+ K N R s n/a 21 2828 2895 2923 N
+ K N S b n/a 21 2825 2867 2953 N
+ K N S e n/a 21 2825 2867 2953 N
+ K N S i n/a 21 2825 2867 2953 N
+ K N S s n/a 21 2825 2867 2953 N
+ K N SH b n/a 21 2825 2867 2956 N
+ K N SH e n/a 21 2825 2867 2956 N
+ K N SH s n/a 21 2825 2867 2956 N
+ K N SIL e n/a 21 2825 2865 2949 N
+ K N SIL s n/a 21 2825 2865 2949 N
+ K N T b n/a 21 2825 2860 2944 N
+ K N T e n/a 21 2825 2860 2944 N
+ K N T i n/a 21 2825 2860 2944 N
+ K N T s n/a 21 2825 2860 2944 N
+ K N TH e n/a 21 2825 2867 2949 N
+ K N TH i n/a 21 2825 2867 2949 N
+ K N TH s n/a 21 2825 2867 2949 N
+ K N UH b n/a 21 2827 2912 2934 N
+ K N UH e n/a 21 2827 2912 2932 N
+ K N UH i n/a 21 2827 2911 2932 N
+ K N UH s n/a 21 2827 2912 2932 N
+ K N UW b n/a 21 2828 2913 2927 N
+ K N UW e n/a 21 2828 2912 2926 N
+ K N UW i n/a 21 2828 2911 2926 N
+ K N UW s n/a 21 2828 2912 2926 N
+ K N V b n/a 21 2825 2865 2944 N
+ K N V e n/a 21 2825 2865 2944 N
+ K N V s n/a 21 2825 2865 2944 N
+ K N W b n/a 21 2828 2892 2921 N
+ K N W e n/a 21 2828 2906 2920 N
+ K N W i n/a 21 2828 2892 2921 N
+ K N W s n/a 21 2828 2892 2921 N
+ K N Y b n/a 21 2824 2880 2965 N
+ K N Y e n/a 21 2824 2880 2965 N
+ K N Y i n/a 21 2824 2880 2965 N
+ K N Y s n/a 21 2824 2880 2965 N
+ K N Z e n/a 21 2825 2865 2953 N
+ K N Z s n/a 21 2825 2865 2953 N
+ K N ZH e n/a 21 2825 2865 2956 N
+ K N ZH s n/a 21 2825 2865 2956 N
+ K NG AA b n/a 21 2827 2908 2928 N
+ K NG AA e n/a 21 2827 2906 2929 N
+ K NG AA i n/a 21 2827 2908 2928 N
+ K NG AA s n/a 21 2827 2908 2929 N
+ K NG AE b n/a 21 2824 2880 2958 N
+ K NG AE e n/a 21 2824 2880 2963 N
+ K NG AE i n/a 21 2824 2880 2958 N
+ K NG AE s n/a 21 2824 2880 2958 N
+ K NG AH b n/a 21 2825 2871 2931 N
+ K NG AH e n/a 21 2825 2871 2940 N
+ K NG AH i n/a 21 2825 2871 2938 N
+ K NG AH s n/a 21 2825 2871 2940 N
+ K NG AO b n/a 21 2828 2894 2916 N
+ K NG AO e n/a 21 2828 2894 2918 N
+ K NG AO i n/a 21 2828 2894 2917 N
+ K NG AO s n/a 21 2828 2894 2916 N
+ K NG AW b n/a 21 2824 2880 2959 N
+ K NG AW e n/a 21 2824 2880 2963 N
+ K NG AW i n/a 21 2824 2880 2959 N
+ K NG AW s n/a 21 2824 2880 2959 N
+ K NG AY b n/a 21 2827 2910 2930 N
+ K NG AY e n/a 21 2827 2906 2925 N
+ K NG AY i n/a 21 2827 2910 2925 N
+ K NG AY s n/a 21 2827 2910 2925 N
+ K NG B b n/a 21 2825 2860 2944 N
+ K NG B e n/a 21 2825 2860 2944 N
+ K NG B i n/a 21 2825 2860 2944 N
+ K NG B s n/a 21 2825 2860 2944 N
+ K NG CH e n/a 21 2825 2856 2944 N
+ K NG CH i n/a 21 2825 2856 2944 N
+ K NG CH s n/a 21 2825 2856 2944 N
+ K NG D b n/a 21 2825 2860 2944 N
+ K NG D e n/a 21 2825 2860 2944 N
+ K NG D i n/a 21 2825 2860 2944 N
+ K NG D s n/a 21 2825 2860 2944 N
+ K NG DH e n/a 21 2825 2865 2944 N
+ K NG DH s n/a 21 2825 2865 2944 N
+ K NG EH b n/a 21 2824 2880 2958 N
+ K NG EH e n/a 21 2824 2880 2963 N
+ K NG EH i n/a 21 2824 2880 2958 N
+ K NG EH s n/a 21 2824 2880 2958 N
+ K NG ER b n/a 21 2827 2912 2926 N
+ K NG ER e n/a 21 2827 2912 2936 N
+ K NG ER i n/a 21 2827 2911 2936 N
+ K NG ER s n/a 21 2827 2912 2936 N
+ K NG EY b n/a 21 2824 2880 2960 N
+ K NG EY e n/a 21 2824 2880 2963 N
+ K NG EY i n/a 21 2824 2880 2960 N
+ K NG EY s n/a 21 2824 2880 2960 N
+ K NG F b n/a 21 2825 2868 2952 N
+ K NG F e n/a 21 2825 2868 2952 N
+ K NG F i n/a 21 2825 2868 2952 N
+ K NG F s n/a 21 2825 2868 2952 N
+ K NG G e n/a 21 2825 2860 2944 N
+ K NG G s n/a 21 2825 2860 2944 N
+ K NG HH e n/a 21 2825 2865 2951 N
+ K NG HH i n/a 21 2825 2865 2951 N
+ K NG HH s n/a 21 2825 2865 2951 N
+ K NG IH b n/a 21 2824 2880 2969 N
+ K NG IH e n/a 21 2824 2880 2961 N
+ K NG IH i n/a 21 2824 2880 2968 N
+ K NG IH s n/a 21 2824 2880 2961 N
+ K NG IY b n/a 21 2824 2880 2966 N
+ K NG IY e n/a 21 2824 2880 2961 N
+ K NG IY i n/a 21 2824 2880 2968 N
+ K NG IY s n/a 21 2824 2880 2961 N
+ K NG JH e n/a 21 2825 2857 2944 N
+ K NG JH i n/a 21 2825 2857 2944 N
+ K NG JH s n/a 21 2825 2857 2944 N
+ K NG K b n/a 21 2825 2860 2944 N
+ K NG K e n/a 21 2825 2860 2944 N
+ K NG K s n/a 21 2825 2860 2944 N
+ K NG L b n/a 21 2828 2894 2919 N
+ K NG L e n/a 21 2828 2894 2918 N
+ K NG L i n/a 21 2828 2894 2918 N
+ K NG L s n/a 21 2828 2894 2918 N
+ K NG M b n/a 21 2825 2865 2947 N
+ K NG M e n/a 21 2825 2865 2947 N
+ K NG M i n/a 21 2825 2865 2947 N
+ K NG M s n/a 21 2825 2865 2947 N
+ K NG N b n/a 21 2825 2865 2947 N
+ K NG N e n/a 21 2825 2865 2947 N
+ K NG N i n/a 21 2825 2865 2947 N
+ K NG N s n/a 21 2825 2865 2947 N
+ K NG NG b n/a 21 2825 2865 2947 N
+ K NG NG e n/a 21 2825 2865 2947 N
+ K NG NG s n/a 21 2825 2865 2947 N
+ K NG OW b n/a 21 2827 2913 2927 N
+ K NG OW e n/a 21 2827 2912 2925 N
+ K NG OW i n/a 21 2827 2911 2925 N
+ K NG OW s n/a 21 2827 2912 2925 N
+ K NG OY b n/a 21 2827 2894 2916 N
+ K NG OY e n/a 21 2827 2894 2918 N
+ K NG OY i n/a 21 2827 2894 2917 N
+ K NG OY s n/a 21 2827 2894 2916 N
+ K NG P b n/a 21 2825 2860 2944 N
+ K NG P e n/a 21 2825 2860 2944 N
+ K NG P i n/a 21 2825 2860 2944 N
+ K NG P s n/a 21 2825 2860 2944 N
+ K NG R b n/a 21 2828 2898 2923 N
+ K NG R e n/a 21 2828 2898 2922 N
+ K NG R i n/a 21 2828 2898 2922 N
+ K NG R s n/a 21 2828 2898 2922 N
+ K NG S b n/a 21 2825 2868 2953 N
+ K NG S e n/a 21 2825 2868 2953 N
+ K NG S i n/a 21 2825 2868 2953 N
+ K NG S s n/a 21 2825 2868 2953 N
+ K NG SH b n/a 21 2825 2868 2956 N
+ K NG SH e n/a 21 2825 2868 2956 N
+ K NG SH i n/a 21 2825 2868 2956 N
+ K NG SH s n/a 21 2825 2868 2956 N
+ K NG SIL e n/a 21 2825 2866 2948 N
+ K NG SIL s n/a 21 2825 2866 2948 N
+ K NG T b n/a 21 2825 2860 2944 N
+ K NG T e n/a 21 2825 2860 2944 N
+ K NG T i n/a 21 2825 2860 2944 N
+ K NG T s n/a 21 2825 2860 2944 N
+ K NG TH e n/a 21 2825 2868 2949 N
+ K NG TH i n/a 21 2825 2868 2949 N
+ K NG TH s n/a 21 2825 2868 2949 N
+ K NG UH b n/a 21 2827 2912 2934 N
+ K NG UH e n/a 21 2827 2912 2936 N
+ K NG UH i n/a 21 2827 2911 2936 N
+ K NG UH s n/a 21 2827 2912 2936 N
+ K NG UW b n/a 21 2828 2913 2927 N
+ K NG UW e n/a 21 2828 2912 2926 N
+ K NG UW i n/a 21 2828 2911 2926 N
+ K NG UW s n/a 21 2828 2912 2926 N
+ K NG V b n/a 21 2825 2865 2944 N
+ K NG V e n/a 21 2825 2865 2944 N
+ K NG V i n/a 21 2825 2865 2944 N
+ K NG V s n/a 21 2825 2865 2944 N
+ K NG W b n/a 21 2828 2892 2921 N
+ K NG W e n/a 21 2828 2906 2920 N
+ K NG W i n/a 21 2828 2892 2921 N
+ K NG W s n/a 21 2828 2892 2921 N
+ K NG Y b n/a 21 2824 2880 2965 N
+ K NG Y e n/a 21 2824 2880 2965 N
+ K NG Y i n/a 21 2824 2880 2965 N
+ K NG Y s n/a 21 2824 2880 2965 N
+ K NG Z e n/a 21 2825 2865 2953 N
+ K NG Z i n/a 21 2825 2865 2953 N
+ K NG Z s n/a 21 2825 2865 2953 N
+ K NG ZH e n/a 21 2825 2865 2956 N
+ K NG ZH s n/a 21 2825 2865 2956 N
+ K OW AA b n/a 21 2829 2913 2928 N
+ K OW AA e n/a 21 2829 2905 2929 N
+ K OW AA i n/a 21 2829 2913 2928 N
+ K OW AA s n/a 21 2829 2913 2929 N
+ K OW AE b n/a 21 2830 2887 2958 N
+ K OW AE e n/a 21 2830 2887 2963 N
+ K OW AE i n/a 21 2830 2887 2958 N
+ K OW AE s n/a 21 2830 2887 2958 N
+ K OW AH b n/a 21 2830 2872 2933 N
+ K OW AH e n/a 21 2830 2872 2935 N
+ K OW AH i n/a 21 2830 2872 2935 N
+ K OW AH s n/a 21 2830 2872 2935 N
+ K OW AO b n/a 21 2829 2896 2916 N
+ K OW AO e n/a 21 2829 2899 2918 N
+ K OW AO i n/a 21 2829 2899 2917 N
+ K OW AO s n/a 21 2829 2899 2916 N
+ K OW AW b n/a 21 2829 2887 2959 N
+ K OW AW e n/a 21 2829 2887 2963 N
+ K OW AW i n/a 21 2829 2887 2959 N
+ K OW AW s n/a 21 2829 2887 2959 N
+ K OW AY b n/a 21 2831 2913 2930 N
+ K OW AY e n/a 21 2831 2905 2925 N
+ K OW AY i n/a 21 2831 2913 2925 N
+ K OW AY s n/a 21 2831 2913 2925 N
+ K OW B b n/a 21 2830 2904 2945 N
+ K OW B e n/a 21 2830 2904 2945 N
+ K OW B i n/a 21 2830 2904 2945 N
+ K OW B s n/a 21 2830 2904 2945 N
+ K OW CH e n/a 21 2830 2904 2945 N
+ K OW CH s n/a 21 2830 2904 2945 N
+ K OW D b n/a 21 2830 2904 2945 N
+ K OW D e n/a 21 2830 2904 2945 N
+ K OW D i n/a 21 2830 2904 2945 N
+ K OW D s n/a 21 2830 2904 2945 N
+ K OW DH e n/a 21 2830 2904 2945 N
+ K OW DH s n/a 21 2830 2904 2945 N
+ K OW EH b n/a 21 2830 2887 2958 N
+ K OW EH e n/a 21 2830 2887 2963 N
+ K OW EH i n/a 21 2830 2887 2958 N
+ K OW EH s n/a 21 2830 2887 2958 N
+ K OW ER b n/a 21 2829 2913 2926 N
+ K OW ER e n/a 21 2829 2913 2936 N
+ K OW ER i n/a 21 2829 2913 2936 N
+ K OW ER s n/a 21 2829 2913 2936 N
+ K OW EY b n/a 21 2832 2887 2960 N
+ K OW EY e n/a 21 2832 2887 2963 N
+ K OW EY i n/a 21 2832 2887 2960 N
+ K OW EY s n/a 21 2832 2887 2960 N
+ K OW F b n/a 21 2830 2904 2952 N
+ K OW F e n/a 21 2830 2904 2952 N
+ K OW F i n/a 21 2830 2904 2952 N
+ K OW F s n/a 21 2830 2904 2952 N
+ K OW G e n/a 21 2830 2904 2945 N
+ K OW G i n/a 21 2830 2904 2945 N
+ K OW G s n/a 21 2830 2904 2945 N
+ K OW HH e n/a 21 2830 2904 2951 N
+ K OW HH i n/a 21 2830 2904 2951 N
+ K OW HH s n/a 21 2830 2904 2951 N
+ K OW IH b n/a 21 2830 2887 2969 N
+ K OW IH e n/a 21 2830 2887 2961 N
+ K OW IH i n/a 21 2830 2887 2961 N
+ K OW IH s n/a 21 2830 2887 2961 N
+ K OW IY b n/a 21 2832 2887 2966 N
+ K OW IY e n/a 21 2832 2887 2961 N
+ K OW IY i n/a 21 2832 2887 2962 N
+ K OW IY s n/a 21 2832 2887 2961 N
+ K OW JH e n/a 21 2830 2904 2945 N
+ K OW JH i n/a 21 2830 2904 2945 N
+ K OW JH s n/a 21 2830 2904 2945 N
+ K OW K b n/a 21 2830 2904 2945 N
+ K OW K e n/a 21 2830 2904 2945 N
+ K OW K s n/a 21 2830 2904 2945 N
+ K OW L b n/a 21 2829 2896 2919 N
+ K OW L e n/a 21 2829 2899 2918 N
+ K OW L i n/a 21 2829 2899 2918 N
+ K OW L s n/a 21 2829 2899 2918 N
+ K OW M b n/a 21 2830 2904 2947 N
+ K OW M e n/a 21 2830 2904 2947 N
+ K OW M i n/a 21 2830 2904 2947 N
+ K OW M s n/a 21 2830 2904 2947 N
+ K OW N b n/a 21 2830 2904 2947 N
+ K OW N e n/a 21 2830 2904 2947 N
+ K OW N i n/a 21 2830 2904 2947 N
+ K OW N s n/a 21 2830 2904 2947 N
+ K OW NG b n/a 21 2830 2904 2947 N
+ K OW NG e n/a 21 2830 2904 2947 N
+ K OW NG s n/a 21 2830 2904 2947 N
+ K OW OW b n/a 21 2829 2913 2927 N
+ K OW OW e n/a 21 2829 2913 2924 N
+ K OW OW i n/a 21 2829 2913 2924 N
+ K OW OW s n/a 21 2829 2913 2924 N
+ K OW OY b n/a 21 2831 2896 2916 N
+ K OW OY e n/a 21 2831 2899 2918 N
+ K OW OY i n/a 21 2831 2899 2917 N
+ K OW OY s n/a 21 2831 2899 2916 N
+ K OW P b n/a 21 2830 2904 2945 N
+ K OW P e n/a 21 2830 2904 2945 N
+ K OW P s n/a 21 2830 2904 2945 N
+ K OW R b n/a 21 2829 2898 2923 N
+ K OW R e n/a 21 2829 2899 2922 N
+ K OW R i n/a 21 2829 2899 2922 N
+ K OW R s n/a 21 2829 2899 2922 N
+ K OW S b n/a 21 2830 2904 2955 N
+ K OW S e n/a 21 2830 2904 2955 N
+ K OW S i n/a 21 2830 2904 2955 N
+ K OW S s n/a 21 2830 2904 2955 N
+ K OW SH b n/a 21 2830 2904 2956 N
+ K OW SH e n/a 21 2830 2904 2956 N
+ K OW SH i n/a 21 2830 2904 2956 N
+ K OW SH s n/a 21 2830 2904 2956 N
+ K OW SIL e n/a 21 2829 2904 2950 N
+ K OW SIL s n/a 21 2829 2904 2950 N
+ K OW T b n/a 21 2830 2904 2945 N
+ K OW T e n/a 21 2830 2904 2945 N
+ K OW T i n/a 21 2830 2904 2945 N
+ K OW T s n/a 21 2830 2904 2945 N
+ K OW TH e n/a 21 2830 2904 2950 N
+ K OW TH s n/a 21 2830 2904 2950 N
+ K OW UH b n/a 21 2829 2913 2934 N
+ K OW UH e n/a 21 2829 2913 2936 N
+ K OW UH i n/a 21 2829 2913 2936 N
+ K OW UH s n/a 21 2829 2913 2936 N
+ K OW UW b n/a 21 2829 2913 2927 N
+ K OW UW e n/a 21 2829 2913 2926 N
+ K OW UW i n/a 21 2829 2913 2926 N
+ K OW UW s n/a 21 2829 2913 2926 N
+ K OW V b n/a 21 2830 2904 2945 N
+ K OW V e n/a 21 2830 2904 2945 N
+ K OW V i n/a 21 2830 2904 2945 N
+ K OW V s n/a 21 2830 2904 2945 N
+ K OW W b n/a 21 2829 2892 2921 N
+ K OW W e n/a 21 2829 2905 2920 N
+ K OW W i n/a 21 2829 2892 2921 N
+ K OW W s n/a 21 2829 2892 2921 N
+ K OW Y b n/a 21 2832 2887 2965 N
+ K OW Y e n/a 21 2832 2887 2965 N
+ K OW Y i n/a 21 2832 2887 2965 N
+ K OW Y s n/a 21 2832 2887 2965 N
+ K OW Z e n/a 21 2830 2904 2955 N
+ K OW Z i n/a 21 2830 2904 2955 N
+ K OW Z s n/a 21 2830 2904 2955 N
+ K OW ZH e n/a 21 2830 2904 2956 N
+ K OW ZH s n/a 21 2830 2904 2956 N
+ K OY AA b n/a 21 2851 2908 2928 N
+ K OY AA e n/a 21 2851 2906 2929 N
+ K OY AA i n/a 21 2851 2908 2928 N
+ K OY AA s n/a 21 2851 2908 2929 N
+ K OY AE b n/a 21 2851 2889 2958 N
+ K OY AE e n/a 21 2851 2889 2963 N
+ K OY AE s n/a 21 2851 2889 2958 N
+ K OY AH b n/a 21 2851 2857 2933 N
+ K OY AH e n/a 21 2851 2857 2940 N
+ K OY AH i n/a 21 2851 2857 2937 N
+ K OY AH s n/a 21 2851 2857 2940 N
+ K OY AO b n/a 21 2851 2900 2916 N
+ K OY AO e n/a 21 2851 2900 2918 N
+ K OY AO s n/a 21 2851 2900 2916 N
+ K OY AW b n/a 21 2851 2889 2959 N
+ K OY AW e n/a 21 2851 2889 2963 N
+ K OY AW s n/a 21 2851 2889 2959 N
+ K OY AY b n/a 21 2851 2910 2930 N
+ K OY AY e n/a 21 2851 2906 2925 N
+ K OY AY s n/a 21 2851 2910 2925 N
+ K OY B b n/a 21 2851 2861 2946 N
+ K OY B e n/a 21 2851 2861 2946 N
+ K OY B s n/a 21 2851 2861 2946 N
+ K OY CH e n/a 21 2851 2856 2943 N
+ K OY CH s n/a 21 2851 2856 2943 N
+ K OY D b n/a 21 2851 2864 2946 N
+ K OY D e n/a 21 2851 2864 2946 N
+ K OY D s n/a 21 2851 2864 2946 N
+ K OY DH e n/a 21 2851 2861 2946 N
+ K OY DH s n/a 21 2851 2861 2946 N
+ K OY EH b n/a 21 2851 2889 2958 N
+ K OY EH e n/a 21 2851 2889 2963 N
+ K OY EH i n/a 21 2851 2889 2958 N
+ K OY EH s n/a 21 2851 2889 2958 N
+ K OY ER b n/a 21 2851 2915 2926 N
+ K OY ER e n/a 21 2851 2915 2936 N
+ K OY ER s n/a 21 2851 2915 2936 N
+ K OY EY b n/a 21 2851 2889 2960 N
+ K OY EY e n/a 21 2851 2889 2963 N
+ K OY EY i n/a 21 2851 2889 2960 N
+ K OY EY s n/a 21 2851 2889 2960 N
+ K OY F b n/a 21 2851 2861 2952 N
+ K OY F e n/a 21 2851 2861 2952 N
+ K OY F s n/a 21 2851 2861 2952 N
+ K OY G e n/a 21 2851 2861 2946 N
+ K OY G s n/a 21 2851 2861 2946 N
+ K OY HH e n/a 21 2851 2861 2951 N
+ K OY HH s n/a 21 2851 2861 2951 N
+ K OY IH b n/a 21 2851 2889 2969 N
+ K OY IH e n/a 21 2851 2889 2961 N
+ K OY IH i n/a 21 2851 2889 2968 N
+ K OY IH s n/a 21 2851 2889 2961 N
+ K OY IY b n/a 21 2851 2889 2966 N
+ K OY IY e n/a 21 2851 2889 2961 N
+ K OY IY s n/a 21 2851 2889 2961 N
+ K OY JH e n/a 21 2851 2857 2946 N
+ K OY JH s n/a 21 2851 2857 2946 N
+ K OY K b n/a 21 2851 2861 2941 N
+ K OY K e n/a 21 2851 2861 2941 N
+ K OY K s n/a 21 2851 2861 2941 N
+ K OY L b n/a 21 2851 2900 2919 N
+ K OY L e n/a 21 2851 2900 2918 N
+ K OY L i n/a 21 2851 2900 2918 N
+ K OY L s n/a 21 2851 2900 2918 N
+ K OY M b n/a 21 2851 2861 2947 N
+ K OY M e n/a 21 2851 2861 2947 N
+ K OY M s n/a 21 2851 2861 2947 N
+ K OY N b n/a 21 2851 2864 2947 N
+ K OY N e n/a 21 2851 2864 2947 N
+ K OY N s n/a 21 2851 2864 2947 N
+ K OY NG b n/a 21 2851 2861 2947 N
+ K OY NG e n/a 21 2851 2861 2947 N
+ K OY NG s n/a 21 2851 2861 2947 N
+ K OY OW b n/a 21 2851 2915 2927 N
+ K OY OW e n/a 21 2851 2915 2925 N
+ K OY OW i n/a 21 2851 2915 2925 N
+ K OY OW s n/a 21 2851 2915 2925 N
+ K OY OY b n/a 21 2851 2900 2916 N
+ K OY OY e n/a 21 2851 2900 2918 N
+ K OY OY s n/a 21 2851 2900 2916 N
+ K OY P b n/a 21 2851 2861 2941 N
+ K OY P e n/a 21 2851 2861 2941 N
+ K OY P s n/a 21 2851 2861 2941 N
+ K OY R b n/a 21 2851 2900 2923 N
+ K OY R e n/a 21 2851 2900 2922 N
+ K OY R i n/a 21 2851 2900 2922 N
+ K OY R s n/a 21 2851 2900 2922 N
+ K OY S b n/a 21 2851 2867 2954 N
+ K OY S e n/a 21 2851 2867 2954 N
+ K OY S i n/a 21 2851 2867 2954 N
+ K OY S s n/a 21 2851 2867 2954 N
+ K OY SH b n/a 21 2851 2856 2956 N
+ K OY SH e n/a 21 2851 2856 2956 N
+ K OY SH s n/a 21 2851 2856 2956 N
+ K OY SIL e n/a 21 2851 2861 2949 N
+ K OY SIL s n/a 21 2851 2861 2949 N
+ K OY T b n/a 21 2851 2864 2941 N
+ K OY T e n/a 21 2851 2864 2941 N
+ K OY T i n/a 21 2851 2864 2941 N
+ K OY T s n/a 21 2851 2864 2941 N
+ K OY TH e n/a 21 2851 2861 2949 N
+ K OY TH s n/a 21 2851 2861 2949 N
+ K OY UH b n/a 21 2851 2915 2934 N
+ K OY UH e n/a 21 2851 2915 2936 N
+ K OY UH s n/a 21 2851 2915 2936 N
+ K OY UW b n/a 21 2851 2915 2927 N
+ K OY UW e n/a 21 2851 2915 2926 N
+ K OY UW s n/a 21 2851 2915 2926 N
+ K OY V b n/a 21 2851 2861 2946 N
+ K OY V e n/a 21 2851 2861 2946 N
+ K OY V s n/a 21 2851 2861 2946 N
+ K OY W b n/a 21 2851 2891 2921 N
+ K OY W e n/a 21 2851 2906 2920 N
+ K OY W s n/a 21 2851 2891 2921 N
+ K OY Y b n/a 21 2851 2889 2965 N
+ K OY Y e n/a 21 2851 2889 2965 N
+ K OY Y s n/a 21 2851 2889 2965 N
+ K OY Z e n/a 21 2851 2865 2954 N
+ K OY Z s n/a 21 2851 2865 2954 N
+ K OY ZH e n/a 21 2851 2857 2956 N
+ K OY ZH s n/a 21 2851 2857 2956 N
+ K P AA b n/a 21 2819 2908 2928 N
+ K P AA e n/a 21 2819 2906 2929 N
+ K P AA i n/a 21 2819 2908 2928 N
+ K P AA s n/a 21 2819 2908 2929 N
+ K P AE b n/a 21 2816 2879 2958 N
+ K P AE e n/a 21 2816 2879 2963 N
+ K P AE i n/a 21 2816 2879 2958 N
+ K P AE s n/a 21 2816 2879 2958 N
+ K P AH b n/a 21 2815 2871 2931 N
+ K P AH e n/a 21 2815 2871 2940 N
+ K P AH i n/a 21 2815 2871 2940 N
+ K P AH s n/a 21 2815 2871 2940 N
+ K P AO b n/a 21 2819 2894 2916 N
+ K P AO e n/a 21 2819 2894 2918 N
+ K P AO i n/a 21 2819 2894 2917 N
+ K P AO s n/a 21 2819 2894 2916 N
+ K P AW b n/a 21 2816 2879 2959 N
+ K P AW e n/a 21 2816 2879 2963 N
+ K P AW s n/a 21 2816 2879 2959 N
+ K P AY b n/a 21 2819 2910 2930 N
+ K P AY e n/a 21 2819 2906 2925 N
+ K P AY i n/a 21 2819 2910 2925 N
+ K P AY s n/a 21 2819 2910 2925 N
+ K P B b n/a 21 2816 2859 2944 N
+ K P B e n/a 21 2816 2859 2944 N
+ K P B s n/a 21 2816 2859 2944 N
+ K P CH e n/a 21 2816 2856 2944 N
+ K P CH s n/a 21 2816 2856 2944 N
+ K P D b n/a 21 2816 2859 2944 N
+ K P D e n/a 21 2816 2859 2944 N
+ K P D s n/a 21 2816 2859 2944 N
+ K P DH e n/a 21 2816 2859 2944 N
+ K P DH s n/a 21 2816 2859 2944 N
+ K P EH b n/a 21 2816 2879 2958 N
+ K P EH e n/a 21 2816 2879 2963 N
+ K P EH s n/a 21 2816 2879 2958 N
+ K P ER b n/a 21 2819 2912 2926 N
+ K P ER e n/a 21 2819 2912 2936 N
+ K P ER i n/a 21 2819 2912 2936 N
+ K P ER s n/a 21 2819 2912 2936 N
+ K P EY b n/a 21 2816 2879 2960 N
+ K P EY e n/a 21 2816 2879 2963 N
+ K P EY i n/a 21 2816 2879 2960 N
+ K P EY s n/a 21 2816 2879 2960 N
+ K P F b n/a 21 2816 2859 2952 N
+ K P F e n/a 21 2816 2859 2952 N
+ K P F s n/a 21 2816 2859 2952 N
+ K P G e n/a 21 2816 2859 2944 N
+ K P G s n/a 21 2816 2859 2944 N
+ K P HH e n/a 21 2816 2859 2951 N
+ K P HH s n/a 21 2816 2859 2951 N
+ K P IH b n/a 21 2815 2879 2969 N
+ K P IH e n/a 21 2815 2879 2961 N
+ K P IH i n/a 21 2815 2879 2967 N
+ K P IH s n/a 21 2815 2879 2961 N
+ K P IY b n/a 21 2816 2879 2966 N
+ K P IY e n/a 21 2816 2879 2961 N
+ K P IY i n/a 21 2816 2879 2967 N
+ K P IY s n/a 21 2816 2879 2961 N
+ K P JH e n/a 21 2816 2857 2944 N
+ K P JH s n/a 21 2816 2857 2944 N
+ K P K b n/a 21 2816 2859 2944 N
+ K P K e n/a 21 2816 2859 2944 N
+ K P K s n/a 21 2816 2859 2944 N
+ K P L b n/a 21 2819 2894 2919 N
+ K P L e n/a 21 2819 2894 2918 N
+ K P L s n/a 21 2819 2894 2918 N
+ K P M b n/a 21 2816 2859 2947 N
+ K P M e n/a 21 2816 2859 2947 N
+ K P M s n/a 21 2816 2859 2947 N
+ K P N b n/a 21 2816 2859 2947 N
+ K P N e n/a 21 2816 2859 2947 N
+ K P N s n/a 21 2816 2859 2947 N
+ K P NG b n/a 21 2816 2859 2947 N
+ K P NG e n/a 21 2816 2859 2947 N
+ K P NG s n/a 21 2816 2859 2947 N
+ K P OW b n/a 21 2819 2913 2927 N
+ K P OW e n/a 21 2819 2912 2925 N
+ K P OW i n/a 21 2819 2912 2925 N
+ K P OW s n/a 21 2819 2912 2925 N
+ K P OY b n/a 21 2819 2894 2916 N
+ K P OY e n/a 21 2819 2894 2918 N
+ K P OY s n/a 21 2819 2894 2916 N
+ K P P b n/a 21 2816 2859 2944 N
+ K P P e n/a 21 2816 2859 2944 N
+ K P P s n/a 21 2816 2859 2944 N
+ K P R b n/a 21 2819 2898 2923 N
+ K P R e n/a 21 2819 2898 2922 N
+ K P R s n/a 21 2819 2898 2922 N
+ K P S b n/a 21 2816 2867 2955 N
+ K P S e n/a 21 2816 2867 2955 N
+ K P S s n/a 21 2816 2867 2955 N
+ K P SH b n/a 21 2816 2856 2956 N
+ K P SH e n/a 21 2816 2856 2956 N
+ K P SH s n/a 21 2816 2856 2956 N
+ K P SIL e n/a 21 2816 2859 2949 N
+ K P SIL s n/a 21 2816 2859 2949 N
+ K P T b n/a 21 2816 2859 2944 N
+ K P T e n/a 21 2816 2859 2944 N
+ K P T s n/a 21 2816 2859 2944 N
+ K P TH e n/a 21 2816 2859 2949 N
+ K P TH s n/a 21 2816 2859 2949 N
+ K P UH b n/a 21 2819 2912 2934 N
+ K P UH e n/a 21 2819 2912 2936 N
+ K P UH s n/a 21 2819 2912 2936 N
+ K P UW b n/a 21 2819 2913 2927 N
+ K P UW e n/a 21 2819 2912 2924 N
+ K P UW s n/a 21 2819 2912 2924 N
+ K P V b n/a 21 2816 2859 2944 N
+ K P V e n/a 21 2816 2859 2944 N
+ K P V s n/a 21 2816 2859 2944 N
+ K P W b n/a 21 2819 2892 2921 N
+ K P W e n/a 21 2819 2906 2920 N
+ K P W i n/a 21 2819 2892 2921 N
+ K P W s n/a 21 2819 2892 2921 N
+ K P Y b n/a 21 2816 2879 2965 N
+ K P Y e n/a 21 2816 2879 2965 N
+ K P Y s n/a 21 2816 2879 2965 N
+ K P Z e n/a 21 2816 2865 2955 N
+ K P Z s n/a 21 2816 2865 2955 N
+ K P ZH e n/a 21 2816 2857 2956 N
+ K P ZH s n/a 21 2816 2857 2956 N
+ K R AA b n/a 21 2834 2913 2928 N
+ K R AA e n/a 21 2835 2905 2929 N
+ K R AA i n/a 21 2835 2913 2928 N
+ K R AA s n/a 21 2835 2913 2929 N
+ K R AE b n/a 21 2833 2890 2958 N
+ K R AE e n/a 21 2833 2888 2963 N
+ K R AE i n/a 21 2833 2888 2958 N
+ K R AE s n/a 21 2833 2888 2958 N
+ K R AH b n/a 21 2834 2875 2931 N
+ K R AH e n/a 21 2835 2875 2935 N
+ K R AH i n/a 21 2835 2874 2935 N
+ K R AH s n/a 21 2835 2875 2935 N
+ K R AO b n/a 21 2834 2896 2916 N
+ K R AO e n/a 21 2835 2899 2918 N
+ K R AO i n/a 21 2835 2899 2917 N
+ K R AO s n/a 21 2835 2899 2916 N
+ K R AW b n/a 21 2833 2890 2959 N
+ K R AW e n/a 21 2833 2888 2963 N
+ K R AW i n/a 21 2833 2888 2959 N
+ K R AW s n/a 21 2833 2888 2959 N
+ K R AY b n/a 21 2834 2913 2930 N
+ K R AY e n/a 21 2835 2905 2925 N
+ K R AY i n/a 21 2835 2913 2925 N
+ K R AY s n/a 21 2835 2913 2925 N
+ K R B b n/a 21 2834 2905 2945 N
+ K R B e n/a 21 2835 2905 2945 N
+ K R B i n/a 21 2835 2905 2945 N
+ K R B s n/a 21 2835 2905 2945 N
+ K R CH e n/a 21 2835 2905 2945 N
+ K R CH s n/a 21 2835 2905 2945 N
+ K R D b n/a 21 2834 2905 2945 N
+ K R D e n/a 21 2835 2905 2945 N
+ K R D i n/a 21 2835 2905 2945 N
+ K R D s n/a 21 2835 2905 2945 N
+ K R DH e n/a 21 2835 2905 2945 N
+ K R DH s n/a 21 2835 2905 2945 N
+ K R EH b n/a 21 2833 2890 2958 N
+ K R EH e n/a 21 2833 2888 2963 N
+ K R EH i n/a 21 2833 2888 2958 N
+ K R EH s n/a 21 2833 2888 2958 N
+ K R ER b n/a 21 2834 2913 2926 N
+ K R ER e n/a 21 2835 2913 2936 N
+ K R ER i n/a 21 2835 2913 2936 N
+ K R ER s n/a 21 2835 2913 2936 N
+ K R EY b n/a 21 2833 2890 2960 N
+ K R EY e n/a 21 2833 2888 2963 N
+ K R EY i n/a 21 2833 2888 2960 N
+ K R EY s n/a 21 2833 2888 2960 N
+ K R F b n/a 21 2834 2905 2952 N
+ K R F e n/a 21 2835 2905 2952 N
+ K R F i n/a 21 2835 2905 2952 N
+ K R F s n/a 21 2835 2905 2952 N
+ K R G e n/a 21 2835 2905 2945 N
+ K R G i n/a 21 2835 2905 2945 N
+ K R G s n/a 21 2835 2905 2945 N
+ K R HH e n/a 21 2835 2905 2951 N
+ K R HH i n/a 21 2835 2905 2951 N
+ K R HH s n/a 21 2835 2905 2951 N
+ K R IH b n/a 21 2833 2890 2969 N
+ K R IH e n/a 21 2833 2888 2961 N
+ K R IH i n/a 21 2833 2888 2961 N
+ K R IH s n/a 21 2833 2888 2961 N
+ K R IY b n/a 21 2833 2890 2966 N
+ K R IY e n/a 21 2833 2888 2961 N
+ K R IY i n/a 21 2833 2888 2962 N
+ K R IY s n/a 21 2833 2888 2961 N
+ K R JH e n/a 21 2835 2905 2945 N
+ K R JH s n/a 21 2835 2905 2945 N
+ K R K b n/a 21 2834 2905 2945 N
+ K R K e n/a 21 2835 2905 2945 N
+ K R K s n/a 21 2835 2905 2945 N
+ K R L b n/a 21 2834 2897 2919 N
+ K R L e n/a 21 2835 2899 2918 N
+ K R L i n/a 21 2835 2899 2918 N
+ K R L s n/a 21 2835 2899 2918 N
+ K R M b n/a 21 2834 2905 2947 N
+ K R M e n/a 21 2835 2905 2947 N
+ K R M i n/a 21 2835 2905 2947 N
+ K R M s n/a 21 2835 2905 2947 N
+ K R N b n/a 21 2834 2905 2947 N
+ K R N e n/a 21 2835 2905 2947 N
+ K R N i n/a 21 2835 2905 2947 N
+ K R N s n/a 21 2835 2905 2947 N
+ K R NG b n/a 21 2834 2905 2947 N
+ K R NG e n/a 21 2835 2905 2947 N
+ K R NG s n/a 21 2835 2905 2947 N
+ K R OW b n/a 21 2834 2913 2927 N
+ K R OW e n/a 21 2835 2913 2924 N
+ K R OW i n/a 21 2835 2913 2924 N
+ K R OW s n/a 21 2835 2913 2924 N
+ K R OY b n/a 21 2834 2896 2916 N
+ K R OY e n/a 21 2835 2899 2918 N
+ K R OY s n/a 21 2835 2899 2916 N
+ K R P b n/a 21 2834 2905 2945 N
+ K R P e n/a 21 2835 2905 2945 N
+ K R P i n/a 21 2835 2905 2945 N
+ K R P s n/a 21 2835 2905 2945 N
+ K R R b n/a 21 2834 2898 2923 N
+ K R R e n/a 21 2835 2899 2922 N
+ K R R i n/a 21 2835 2899 2922 N
+ K R R s n/a 21 2835 2899 2922 N
+ K R S b n/a 21 2834 2905 2955 N
+ K R S e n/a 21 2835 2905 2955 N
+ K R S i n/a 21 2835 2905 2955 N
+ K R S s n/a 21 2835 2905 2955 N
+ K R SH b n/a 21 2834 2905 2956 N
+ K R SH e n/a 21 2835 2905 2956 N
+ K R SH i n/a 21 2835 2905 2956 N
+ K R SH s n/a 21 2835 2905 2956 N
+ K R SIL e n/a 21 2835 2905 2950 N
+ K R SIL s n/a 21 2835 2905 2950 N
+ K R T b n/a 21 2834 2905 2945 N
+ K R T e n/a 21 2835 2905 2945 N
+ K R T i n/a 21 2835 2905 2945 N
+ K R T s n/a 21 2835 2905 2945 N
+ K R TH e n/a 21 2835 2905 2950 N
+ K R TH s n/a 21 2835 2905 2950 N
+ K R UH b n/a 21 2834 2913 2934 N
+ K R UH e n/a 21 2835 2913 2936 N
+ K R UH i n/a 21 2835 2913 2936 N
+ K R UH s n/a 21 2835 2913 2936 N
+ K R UW b n/a 21 2834 2913 2927 N
+ K R UW e n/a 21 2835 2913 2926 N
+ K R UW i n/a 21 2835 2913 2926 N
+ K R UW s n/a 21 2835 2913 2926 N
+ K R V b n/a 21 2834 2905 2945 N
+ K R V e n/a 21 2835 2905 2945 N
+ K R V s n/a 21 2835 2905 2945 N
+ K R W b n/a 21 2834 2892 2921 N
+ K R W e n/a 21 2835 2905 2920 N
+ K R W i n/a 21 2835 2892 2921 N
+ K R W s n/a 21 2835 2892 2921 N
+ K R Y b n/a 21 2833 2890 2965 N
+ K R Y e n/a 21 2833 2888 2965 N
+ K R Y i n/a 21 2833 2888 2965 N
+ K R Y s n/a 21 2833 2888 2965 N
+ K R Z e n/a 21 2835 2905 2955 N
+ K R Z i n/a 21 2835 2905 2955 N
+ K R Z s n/a 21 2835 2905 2955 N
+ K R ZH e n/a 21 2835 2905 2956 N
+ K R ZH s n/a 21 2835 2905 2956 N
+ K S AA b n/a 21 2821 2910 2928 N
+ K S AA e n/a 21 2820 2906 2929 N
+ K S AA i n/a 21 2820 2909 2929 N
+ K S AA s n/a 21 2820 2910 2929 N
+ K S AE b n/a 21 2823 2885 2958 N
+ K S AE e n/a 21 2823 2886 2963 N
+ K S AE i n/a 21 2823 2886 2957 N
+ K S AE s n/a 21 2823 2885 2958 N
+ K S AH b n/a 21 2821 2877 2931 N
+ K S AH e n/a 21 2820 2877 2940 N
+ K S AH i n/a 21 2820 2877 2940 N
+ K S AH s n/a 21 2820 2877 2940 N
+ K S AO b n/a 21 2822 2897 2916 N
+ K S AO e n/a 21 2820 2891 2918 N
+ K S AO i n/a 21 2820 2891 2917 N
+ K S AO s n/a 21 2820 2891 2916 N
+ K S AW b n/a 21 2823 2885 2959 N
+ K S AW e n/a 21 2823 2886 2963 N
+ K S AW i n/a 21 2823 2886 2959 N
+ K S AW s n/a 21 2823 2885 2959 N
+ K S AY b n/a 21 2821 2910 2930 N
+ K S AY e n/a 21 2820 2906 2925 N
+ K S AY i n/a 21 2820 2909 2925 N
+ K S AY s n/a 21 2820 2910 2925 N
+ K S B b n/a 21 2821 2859 2944 N
+ K S B e n/a 21 2820 2859 2944 N
+ K S B i n/a 21 2820 2859 2944 N
+ K S B s n/a 21 2820 2859 2944 N
+ K S CH e n/a 21 2820 2856 2944 N
+ K S CH s n/a 21 2820 2856 2944 N
+ K S D b n/a 21 2821 2859 2944 N
+ K S D e n/a 21 2820 2859 2944 N
+ K S D i n/a 21 2820 2859 2944 N
+ K S D s n/a 21 2820 2859 2944 N
+ K S DH e n/a 21 2820 2859 2944 N
+ K S DH s n/a 21 2820 2859 2944 N
+ K S EH b n/a 21 2823 2885 2969 N
+ K S EH e n/a 21 2823 2886 2963 N
+ K S EH i n/a 21 2823 2886 2964 N
+ K S EH s n/a 21 2823 2885 2963 N
+ K S ER b n/a 21 2821 2912 2926 N
+ K S ER e n/a 21 2820 2915 2936 N
+ K S ER i n/a 21 2820 2914 2936 N
+ K S ER s n/a 21 2820 2915 2936 N
+ K S EY b n/a 21 2823 2885 2969 N
+ K S EY e n/a 21 2823 2886 2963 N
+ K S EY i n/a 21 2823 2886 2964 N
+ K S EY s n/a 21 2823 2885 2963 N
+ K S F b n/a 21 2821 2859 2952 N
+ K S F e n/a 21 2820 2859 2952 N
+ K S F i n/a 21 2820 2859 2952 N
+ K S F s n/a 21 2820 2859 2952 N
+ K S G e n/a 21 2820 2859 2944 N
+ K S G s n/a 21 2820 2859 2944 N
+ K S HH e n/a 21 2820 2859 2951 N
+ K S HH i n/a 21 2820 2859 2951 N
+ K S HH s n/a 21 2820 2859 2951 N
+ K S IH b n/a 21 2823 2885 2969 N
+ K S IH e n/a 21 2823 2886 2961 N
+ K S IH i n/a 21 2823 2886 2967 N
+ K S IH s n/a 21 2823 2885 2961 N
+ K S IY b n/a 21 2823 2885 2966 N
+ K S IY e n/a 21 2823 2886 2961 N
+ K S IY i n/a 21 2823 2886 2967 N
+ K S IY s n/a 21 2823 2885 2961 N
+ K S JH e n/a 21 2820 2857 2944 N
+ K S JH i n/a 21 2820 2857 2944 N
+ K S JH s n/a 21 2820 2857 2944 N
+ K S K b n/a 21 2821 2859 2944 N
+ K S K e n/a 21 2820 2859 2944 N
+ K S K s n/a 21 2820 2859 2944 N
+ K S L b n/a 21 2822 2897 2919 N
+ K S L e n/a 21 2820 2891 2918 N
+ K S L i n/a 21 2820 2891 2918 N
+ K S L s n/a 21 2820 2891 2918 N
+ K S M b n/a 21 2821 2859 2947 N
+ K S M e n/a 21 2820 2859 2947 N
+ K S M i n/a 21 2820 2859 2947 N
+ K S M s n/a 21 2820 2859 2947 N
+ K S N b n/a 21 2821 2859 2947 N
+ K S N e n/a 21 2820 2859 2947 N
+ K S N i n/a 21 2820 2859 2947 N
+ K S N s n/a 21 2820 2859 2947 N
+ K S NG b n/a 21 2821 2859 2947 N
+ K S NG e n/a 21 2820 2859 2947 N
+ K S NG s n/a 21 2820 2859 2947 N
+ K S OW b n/a 21 2821 2915 2927 N
+ K S OW e n/a 21 2820 2915 2925 N
+ K S OW i n/a 21 2820 2914 2925 N
+ K S OW s n/a 21 2820 2915 2925 N
+ K S OY b n/a 21 2821 2897 2916 N
+ K S OY e n/a 21 2820 2891 2918 N
+ K S OY i n/a 21 2820 2891 2917 N
+ K S OY s n/a 21 2820 2891 2916 N
+ K S P b n/a 21 2821 2859 2944 N
+ K S P e n/a 21 2820 2859 2944 N
+ K S P i n/a 21 2820 2859 2944 N
+ K S P s n/a 21 2820 2859 2944 N
+ K S R b n/a 21 2822 2898 2923 N
+ K S R e n/a 21 2820 2891 2922 N
+ K S R i n/a 21 2820 2891 2922 N
+ K S R s n/a 21 2820 2891 2922 N
+ K S S b n/a 21 2821 2867 2955 N
+ K S S e n/a 21 2820 2867 2955 N
+ K S S i n/a 21 2820 2867 2955 N
+ K S S s n/a 21 2820 2867 2955 N
+ K S SH b n/a 21 2821 2856 2956 N
+ K S SH e n/a 21 2820 2856 2956 N
+ K S SH i n/a 21 2820 2856 2956 N
+ K S SH s n/a 21 2820 2856 2956 N
+ K S SIL e n/a 21 2820 2859 2949 N
+ K S SIL s n/a 21 2820 2859 2949 N
+ K S T b n/a 21 2821 2859 2944 N
+ K S T e n/a 21 2820 2859 2944 N
+ K S T i n/a 21 2820 2859 2944 N
+ K S T s n/a 21 2820 2859 2944 N
+ K S TH e n/a 21 2820 2859 2949 N
+ K S TH s n/a 21 2820 2859 2949 N
+ K S UH b n/a 21 2821 2912 2934 N
+ K S UH e n/a 21 2820 2915 2936 N
+ K S UH i n/a 21 2820 2914 2936 N
+ K S UH s n/a 21 2820 2915 2936 N
+ K S UW b n/a 21 2821 2914 2927 N
+ K S UW e n/a 21 2820 2914 2924 N
+ K S UW i n/a 21 2820 2914 2924 N
+ K S UW s n/a 21 2820 2914 2924 N
+ K S V b n/a 21 2821 2859 2944 N
+ K S V e n/a 21 2820 2859 2944 N
+ K S V i n/a 21 2820 2859 2944 N
+ K S V s n/a 21 2820 2859 2944 N
+ K S W b n/a 21 2822 2891 2921 N
+ K S W e n/a 21 2820 2906 2920 N
+ K S W i n/a 21 2820 2891 2920 N
+ K S W s n/a 21 2820 2891 2921 N
+ K S Y b n/a 21 2823 2885 2965 N
+ K S Y e n/a 21 2823 2886 2965 N
+ K S Y i n/a 21 2823 2886 2965 N
+ K S Y s n/a 21 2823 2885 2965 N
+ K S Z e n/a 21 2820 2865 2955 N
+ K S Z s n/a 21 2820 2865 2955 N
+ K S ZH e n/a 21 2820 2857 2956 N
+ K S ZH s n/a 21 2820 2857 2956 N
+ K SH AA b n/a 21 2821 2910 2928 N
+ K SH AA e n/a 21 2820 2906 2929 N
+ K SH AA i n/a 21 2820 2909 2929 N
+ K SH AA s n/a 21 2820 2910 2929 N
+ K SH AE b n/a 21 2823 2885 2958 N
+ K SH AE e n/a 21 2823 2886 2963 N
+ K SH AE s n/a 21 2823 2885 2958 N
+ K SH AH b n/a 21 2821 2877 2931 N
+ K SH AH e n/a 21 2820 2877 2940 N
+ K SH AH i n/a 21 2820 2877 2940 N
+ K SH AH s n/a 21 2820 2877 2940 N
+ K SH AO b n/a 21 2822 2897 2916 N
+ K SH AO e n/a 21 2820 2891 2918 N
+ K SH AO i n/a 21 2820 2891 2917 N
+ K SH AO s n/a 21 2820 2891 2916 N
+ K SH AW b n/a 21 2823 2885 2959 N
+ K SH AW e n/a 21 2823 2886 2963 N
+ K SH AW s n/a 21 2823 2885 2959 N
+ K SH AY b n/a 21 2821 2910 2930 N
+ K SH AY e n/a 21 2820 2906 2925 N
+ K SH AY s n/a 21 2820 2910 2925 N
+ K SH B b n/a 21 2821 2859 2944 N
+ K SH B e n/a 21 2820 2859 2944 N
+ K SH B s n/a 21 2820 2859 2944 N
+ K SH CH e n/a 21 2820 2856 2944 N
+ K SH CH s n/a 21 2820 2856 2944 N
+ K SH D b n/a 21 2821 2859 2944 N
+ K SH D e n/a 21 2820 2859 2944 N
+ K SH D s n/a 21 2820 2859 2944 N
+ K SH DH e n/a 21 2820 2859 2944 N
+ K SH DH s n/a 21 2820 2859 2944 N
+ K SH EH b n/a 21 2823 2885 2969 N
+ K SH EH e n/a 21 2823 2886 2963 N
+ K SH EH i n/a 21 2823 2886 2964 N
+ K SH EH s n/a 21 2823 2885 2963 N
+ K SH ER b n/a 21 2821 2912 2926 N
+ K SH ER e n/a 21 2820 2915 2936 N
+ K SH ER i n/a 21 2820 2914 2936 N
+ K SH ER s n/a 21 2820 2915 2936 N
+ K SH EY b n/a 21 2823 2885 2969 N
+ K SH EY e n/a 21 2823 2886 2963 N
+ K SH EY i n/a 21 2823 2886 2964 N
+ K SH EY s n/a 21 2823 2885 2963 N
+ K SH F b n/a 21 2821 2859 2952 N
+ K SH F e n/a 21 2820 2859 2952 N
+ K SH F s n/a 21 2820 2859 2952 N
+ K SH G e n/a 21 2820 2859 2944 N
+ K SH G s n/a 21 2820 2859 2944 N
+ K SH HH e n/a 21 2820 2859 2951 N
+ K SH HH s n/a 21 2820 2859 2951 N
+ K SH IH b n/a 21 2823 2885 2969 N
+ K SH IH e n/a 21 2823 2886 2961 N
+ K SH IH i n/a 21 2823 2886 2967 N
+ K SH IH s n/a 21 2823 2885 2961 N
+ K SH IY b n/a 21 2823 2885 2966 N
+ K SH IY e n/a 21 2823 2886 2961 N
+ K SH IY i n/a 21 2823 2886 2967 N
+ K SH IY s n/a 21 2823 2885 2961 N
+ K SH JH e n/a 21 2820 2857 2944 N
+ K SH JH s n/a 21 2820 2857 2944 N
+ K SH K b n/a 21 2821 2859 2944 N
+ K SH K e n/a 21 2820 2859 2944 N
+ K SH K s n/a 21 2820 2859 2944 N
+ K SH L b n/a 21 2822 2897 2919 N
+ K SH L e n/a 21 2820 2891 2918 N
+ K SH L i n/a 21 2820 2891 2918 N
+ K SH L s n/a 21 2820 2891 2918 N
+ K SH M b n/a 21 2821 2859 2947 N
+ K SH M e n/a 21 2820 2859 2947 N
+ K SH M s n/a 21 2820 2859 2947 N
+ K SH N b n/a 21 2821 2859 2947 N
+ K SH N e n/a 21 2820 2859 2947 N
+ K SH N s n/a 21 2820 2859 2947 N
+ K SH NG b n/a 21 2821 2859 2947 N
+ K SH NG e n/a 21 2820 2859 2947 N
+ K SH NG s n/a 21 2820 2859 2947 N
+ K SH OW b n/a 21 2821 2915 2927 N
+ K SH OW e n/a 21 2820 2915 2925 N
+ K SH OW i n/a 21 2820 2914 2925 N
+ K SH OW s n/a 21 2820 2915 2925 N
+ K SH OY b n/a 21 2821 2897 2916 N
+ K SH OY e n/a 21 2820 2891 2918 N
+ K SH OY s n/a 21 2820 2891 2916 N
+ K SH P b n/a 21 2821 2859 2944 N
+ K SH P e n/a 21 2820 2859 2944 N
+ K SH P s n/a 21 2820 2859 2944 N
+ K SH R b n/a 21 2822 2898 2923 N
+ K SH R e n/a 21 2820 2891 2922 N
+ K SH R i n/a 21 2820 2891 2922 N
+ K SH R s n/a 21 2820 2891 2922 N
+ K SH S b n/a 21 2821 2867 2955 N
+ K SH S e n/a 21 2820 2867 2955 N
+ K SH S s n/a 21 2820 2867 2955 N
+ K SH SH b n/a 21 2821 2856 2956 N
+ K SH SH e n/a 21 2820 2856 2956 N
+ K SH SH s n/a 21 2820 2856 2956 N
+ K SH SIL e n/a 21 2820 2859 2949 N
+ K SH SIL s n/a 21 2820 2859 2949 N
+ K SH T b n/a 21 2821 2859 2944 N
+ K SH T e n/a 21 2820 2859 2944 N
+ K SH T s n/a 21 2820 2859 2944 N
+ K SH TH e n/a 21 2820 2859 2949 N
+ K SH TH s n/a 21 2820 2859 2949 N
+ K SH UH b n/a 21 2821 2912 2934 N
+ K SH UH e n/a 21 2820 2915 2936 N
+ K SH UH s n/a 21 2820 2915 2936 N
+ K SH UW b n/a 21 2821 2914 2927 N
+ K SH UW e n/a 21 2820 2914 2924 N
+ K SH UW s n/a 21 2820 2914 2924 N
+ K SH V b n/a 21 2821 2859 2944 N
+ K SH V e n/a 21 2820 2859 2944 N
+ K SH V s n/a 21 2820 2859 2944 N
+ K SH W b n/a 21 2822 2891 2921 N
+ K SH W e n/a 21 2820 2906 2920 N
+ K SH W s n/a 21 2820 2891 2921 N
+ K SH Y b n/a 21 2823 2885 2965 N
+ K SH Y e n/a 21 2823 2886 2965 N
+ K SH Y s n/a 21 2823 2885 2965 N
+ K SH Z e n/a 21 2820 2865 2955 N
+ K SH Z s n/a 21 2820 2865 2955 N
+ K SH ZH e n/a 21 2820 2857 2956 N
+ K SH ZH s n/a 21 2820 2857 2956 N
+ K SIL AA b n/a 21 2818 2907 2928 N
+ K SIL AA s n/a 21 2818 2907 2929 N
+ K SIL AE b n/a 21 2816 2879 2958 N
+ K SIL AE s n/a 21 2816 2879 2958 N
+ K SIL AH b n/a 21 2815 2870 2932 N
+ K SIL AH s n/a 21 2815 2870 2940 N
+ K SIL AO b n/a 21 2818 2894 2916 N
+ K SIL AO s n/a 21 2818 2894 2916 N
+ K SIL AW b n/a 21 2816 2879 2959 N
+ K SIL AW s n/a 21 2816 2879 2959 N
+ K SIL AY b n/a 21 2818 2910 2930 N
+ K SIL AY s n/a 21 2818 2910 2925 N
+ K SIL B b n/a 21 2816 2859 2944 N
+ K SIL B s n/a 21 2816 2859 2944 N
+ K SIL CH s n/a 21 2816 2856 2944 N
+ K SIL D b n/a 21 2816 2859 2944 N
+ K SIL D s n/a 21 2816 2859 2944 N
+ K SIL DH s n/a 21 2816 2859 2944 N
+ K SIL EH b n/a 21 2816 2879 2958 N
+ K SIL EH s n/a 21 2816 2879 2958 N
+ K SIL ER b n/a 21 2818 2912 2926 N
+ K SIL ER s n/a 21 2818 2912 2936 N
+ K SIL EY b n/a 21 2816 2879 2960 N
+ K SIL EY s n/a 21 2816 2879 2960 N
+ K SIL F b n/a 21 2816 2859 2952 N
+ K SIL F s n/a 21 2816 2859 2952 N
+ K SIL G s n/a 21 2816 2859 2944 N
+ K SIL HH s n/a 21 2816 2859 2951 N
+ K SIL IH b n/a 21 2816 2879 2969 N
+ K SIL IH s n/a 21 2816 2879 2961 N
+ K SIL IY b n/a 21 2816 2879 2966 N
+ K SIL IY s n/a 21 2816 2879 2961 N
+ K SIL JH s n/a 21 2816 2857 2944 N
+ K SIL K b n/a 21 2816 2859 2944 N
+ K SIL K s n/a 21 2816 2859 2944 N
+ K SIL L b n/a 21 2818 2894 2919 N
+ K SIL L s n/a 21 2818 2894 2918 N
+ K SIL M b n/a 21 2816 2859 2947 N
+ K SIL M s n/a 21 2816 2859 2947 N
+ K SIL N b n/a 21 2816 2859 2947 N
+ K SIL N s n/a 21 2816 2859 2947 N
+ K SIL NG b n/a 21 2816 2859 2947 N
+ K SIL NG s n/a 21 2816 2859 2947 N
+ K SIL OW b n/a 21 2818 2913 2927 N
+ K SIL OW s n/a 21 2818 2912 2925 N
+ K SIL OY b n/a 21 2818 2894 2916 N
+ K SIL OY s n/a 21 2818 2894 2916 N
+ K SIL P b n/a 21 2816 2859 2944 N
+ K SIL P s n/a 21 2816 2859 2944 N
+ K SIL R b n/a 21 2818 2898 2923 N
+ K SIL R s n/a 21 2818 2898 2922 N
+ K SIL S b n/a 21 2816 2867 2955 N
+ K SIL S s n/a 21 2816 2867 2955 N
+ K SIL SH b n/a 21 2816 2856 2956 N
+ K SIL SH s n/a 21 2816 2856 2956 N
+ K SIL SIL s n/a 21 2816 2859 2949 N
+ K SIL T b n/a 21 2816 2859 2944 N
+ K SIL T s n/a 21 2816 2859 2944 N
+ K SIL TH s n/a 21 2816 2859 2949 N
+ K SIL UH b n/a 21 2818 2912 2934 N
+ K SIL UH s n/a 21 2818 2912 2936 N
+ K SIL UW b n/a 21 2818 2913 2927 N
+ K SIL UW s n/a 21 2818 2912 2924 N
+ K SIL V b n/a 21 2816 2859 2944 N
+ K SIL V s n/a 21 2816 2859 2944 N
+ K SIL W b n/a 21 2819 2892 2921 N
+ K SIL W s n/a 21 2819 2892 2921 N
+ K SIL Y b n/a 21 2816 2879 2965 N
+ K SIL Y s n/a 21 2816 2879 2965 N
+ K SIL Z s n/a 21 2816 2865 2955 N
+ K SIL ZH s n/a 21 2816 2857 2956 N
+ K T AA b n/a 21 2817 2907 2928 N
+ K T AA i n/a 21 2817 2907 2928 N
+ K T AA s n/a 21 2817 2907 2929 N
+ K T AE b n/a 21 2816 2879 2958 N
+ K T AE i n/a 21 2816 2879 2958 N
+ K T AE s n/a 21 2816 2879 2958 N
+ K T AH b n/a 21 2815 2870 2932 N
+ K T AH i n/a 21 2815 2870 2932 N
+ K T AH s n/a 21 2815 2870 2932 N
+ K T AO b n/a 21 2817 2894 2916 N
+ K T AO i n/a 21 2817 2894 2917 N
+ K T AO s n/a 21 2817 2894 2916 N
+ K T AW b n/a 21 2816 2879 2959 N
+ K T AW i n/a 21 2816 2879 2959 N
+ K T AW s n/a 21 2816 2879 2959 N
+ K T AY b n/a 21 2817 2910 2930 N
+ K T AY s n/a 21 2817 2910 2925 N
+ K T B b n/a 21 2816 2859 2944 N
+ K T B s n/a 21 2816 2859 2944 N
+ K T CH s n/a 21 2816 2856 2944 N
+ K T D b n/a 21 2816 2859 2944 N
+ K T D s n/a 21 2816 2859 2944 N
+ K T DH s n/a 21 2816 2859 2944 N
+ K T EH b n/a 21 2816 2879 2958 N
+ K T EH s n/a 21 2816 2879 2958 N
+ K T ER b n/a 21 2817 2912 2926 N
+ K T ER i n/a 21 2817 2912 2932 N
+ K T ER s n/a 21 2817 2912 2932 N
+ K T EY b n/a 21 2816 2879 2960 N
+ K T EY i n/a 21 2816 2879 2960 N
+ K T EY s n/a 21 2816 2879 2960 N
+ K T F b n/a 21 2816 2859 2952 N
+ K T F s n/a 21 2816 2859 2952 N
+ K T G s n/a 21 2816 2859 2944 N
+ K T HH s n/a 21 2816 2859 2951 N
+ K T IH b n/a 21 2815 2879 2969 N
+ K T IH i n/a 21 2815 2879 2967 N
+ K T IH s n/a 21 2815 2879 2961 N
+ K T IY b n/a 21 2816 2879 2966 N
+ K T IY i n/a 21 2816 2879 2967 N
+ K T IY s n/a 21 2816 2879 2961 N
+ K T JH s n/a 21 2816 2857 2944 N
+ K T K b n/a 21 2816 2859 2944 N
+ K T K s n/a 21 2816 2859 2944 N
+ K T L b n/a 21 2817 2894 2919 N
+ K T L i n/a 21 2817 2894 2919 N
+ K T L s n/a 21 2817 2894 2919 N
+ K T M b n/a 21 2816 2859 2947 N
+ K T M s n/a 21 2816 2859 2947 N
+ K T N b n/a 21 2816 2859 2947 N
+ K T N s n/a 21 2816 2859 2947 N
+ K T NG b n/a 21 2816 2859 2947 N
+ K T NG s n/a 21 2816 2859 2947 N
+ K T OW b n/a 21 2817 2913 2927 N
+ K T OW i n/a 21 2817 2912 2925 N
+ K T OW s n/a 21 2817 2912 2925 N
+ K T OY b n/a 21 2817 2894 2916 N
+ K T OY i n/a 21 2817 2894 2917 N
+ K T OY s n/a 21 2817 2894 2916 N
+ K T P b n/a 21 2816 2859 2944 N
+ K T P s n/a 21 2816 2859 2944 N
+ K T R b n/a 21 2817 2895 2923 N
+ K T R i n/a 21 2817 2895 2923 N
+ K T R s n/a 21 2817 2895 2923 N
+ K T S b n/a 21 2816 2867 2955 N
+ K T S i n/a 21 2816 2867 2955 N
+ K T S s n/a 21 2816 2867 2955 N
+ K T SH b n/a 21 2816 2856 2956 N
+ K T SH s n/a 21 2816 2856 2956 N
+ K T SIL s n/a 21 2816 2859 2949 N
+ K T T b n/a 21 2816 2859 2944 N
+ K T T s n/a 21 2816 2859 2944 N
+ K T TH s n/a 21 2816 2859 2949 N
+ K T UH b n/a 21 2817 2912 2934 N
+ K T UH s n/a 21 2817 2912 2932 N
+ K T UW b n/a 21 2817 2913 2927 N
+ K T UW s n/a 21 2817 2912 2924 N
+ K T V b n/a 21 2816 2859 2944 N
+ K T V s n/a 21 2816 2859 2944 N
+ K T W b n/a 21 2819 2892 2921 N
+ K T W i n/a 21 2819 2892 2921 N
+ K T W s n/a 21 2819 2892 2921 N
+ K T Y b n/a 21 2816 2879 2965 N
+ K T Y s n/a 21 2816 2879 2965 N
+ K T Z s n/a 21 2816 2865 2955 N
+ K T ZH s n/a 21 2816 2857 2956 N
+ K TH AA b n/a 21 2817 2908 2928 N
+ K TH AA e n/a 21 2817 2906 2929 N
+ K TH AA i n/a 21 2817 2908 2928 N
+ K TH AA s n/a 21 2817 2908 2929 N
+ K TH AE b n/a 21 2814 2885 2958 N
+ K TH AE e n/a 21 2814 2886 2963 N
+ K TH AE s n/a 21 2814 2885 2958 N
+ K TH AH b n/a 21 2814 2877 2931 N
+ K TH AH e n/a 21 2814 2877 2940 N
+ K TH AH i n/a 21 2814 2877 2940 N
+ K TH AH s n/a 21 2814 2877 2940 N
+ K TH AO b n/a 21 2817 2896 2916 N
+ K TH AO e n/a 21 2817 2896 2918 N
+ K TH AO i n/a 21 2817 2896 2917 N
+ K TH AO s n/a 21 2817 2896 2916 N
+ K TH AW b n/a 21 2814 2885 2959 N
+ K TH AW e n/a 21 2814 2886 2963 N
+ K TH AW s n/a 21 2814 2885 2959 N
+ K TH AY b n/a 21 2817 2910 2930 N
+ K TH AY e n/a 21 2817 2906 2925 N
+ K TH AY s n/a 21 2817 2910 2925 N
+ K TH B b n/a 21 2814 2859 2944 N
+ K TH B e n/a 21 2814 2859 2944 N
+ K TH B s n/a 21 2814 2859 2944 N
+ K TH CH e n/a 21 2814 2856 2944 N
+ K TH CH s n/a 21 2814 2856 2944 N
+ K TH D b n/a 21 2814 2859 2944 N
+ K TH D e n/a 21 2814 2859 2944 N
+ K TH D s n/a 21 2814 2859 2944 N
+ K TH DH e n/a 21 2814 2859 2944 N
+ K TH DH s n/a 21 2814 2859 2944 N
+ K TH EH b n/a 21 2814 2885 2958 N
+ K TH EH e n/a 21 2814 2886 2963 N
+ K TH EH i n/a 21 2814 2886 2958 N
+ K TH EH s n/a 21 2814 2885 2958 N
+ K TH ER b n/a 21 2817 2912 2926 N
+ K TH ER e n/a 21 2817 2912 2936 N
+ K TH ER s n/a 21 2817 2912 2936 N
+ K TH EY b n/a 21 2814 2885 2960 N
+ K TH EY e n/a 21 2814 2886 2963 N
+ K TH EY s n/a 21 2814 2885 2960 N
+ K TH F b n/a 21 2814 2859 2952 N
+ K TH F e n/a 21 2814 2859 2952 N
+ K TH F s n/a 21 2814 2859 2952 N
+ K TH G e n/a 21 2814 2859 2944 N
+ K TH G s n/a 21 2814 2859 2944 N
+ K TH HH e n/a 21 2814 2859 2951 N
+ K TH HH s n/a 21 2814 2859 2951 N
+ K TH IH b n/a 21 2814 2885 2969 N
+ K TH IH e n/a 21 2814 2886 2961 N
+ K TH IH s n/a 21 2814 2885 2961 N
+ K TH IY b n/a 21 2814 2885 2966 N
+ K TH IY e n/a 21 2814 2886 2961 N
+ K TH IY s n/a 21 2814 2885 2961 N
+ K TH JH e n/a 21 2814 2857 2944 N
+ K TH JH s n/a 21 2814 2857 2944 N
+ K TH K b n/a 21 2814 2859 2944 N
+ K TH K e n/a 21 2814 2859 2944 N
+ K TH K s n/a 21 2814 2859 2944 N
+ K TH L b n/a 21 2817 2897 2919 N
+ K TH L e n/a 21 2817 2897 2918 N
+ K TH L i n/a 21 2817 2897 2918 N
+ K TH L s n/a 21 2817 2897 2918 N
+ K TH M b n/a 21 2814 2859 2947 N
+ K TH M e n/a 21 2814 2859 2947 N
+ K TH M s n/a 21 2814 2859 2947 N
+ K TH N b n/a 21 2814 2859 2947 N
+ K TH N e n/a 21 2814 2859 2947 N
+ K TH N s n/a 21 2814 2859 2947 N
+ K TH NG b n/a 21 2814 2859 2947 N
+ K TH NG e n/a 21 2814 2859 2947 N
+ K TH NG s n/a 21 2814 2859 2947 N
+ K TH OW b n/a 21 2817 2913 2927 N
+ K TH OW e n/a 21 2817 2912 2925 N
+ K TH OW i n/a 21 2817 2912 2925 N
+ K TH OW s n/a 21 2817 2912 2925 N
+ K TH OY b n/a 21 2817 2896 2916 N
+ K TH OY e n/a 21 2817 2896 2918 N
+ K TH OY s n/a 21 2817 2896 2916 N
+ K TH P b n/a 21 2814 2859 2944 N
+ K TH P e n/a 21 2814 2859 2944 N
+ K TH P s n/a 21 2814 2859 2944 N
+ K TH R b n/a 21 2817 2898 2923 N
+ K TH R e n/a 21 2817 2898 2922 N
+ K TH R i n/a 21 2817 2898 2922 N
+ K TH R s n/a 21 2817 2898 2922 N
+ K TH S b n/a 21 2814 2867 2955 N
+ K TH S e n/a 21 2814 2867 2955 N
+ K TH S s n/a 21 2814 2867 2955 N
+ K TH SH b n/a 21 2814 2856 2956 N
+ K TH SH e n/a 21 2814 2856 2956 N
+ K TH SH s n/a 21 2814 2856 2956 N
+ K TH SIL e n/a 21 2814 2859 2949 N
+ K TH SIL s n/a 21 2814 2859 2949 N
+ K TH T b n/a 21 2814 2859 2944 N
+ K TH T e n/a 21 2814 2859 2944 N
+ K TH T s n/a 21 2814 2859 2944 N
+ K TH TH e n/a 21 2814 2859 2949 N
+ K TH TH s n/a 21 2814 2859 2949 N
+ K TH UH b n/a 21 2817 2912 2934 N
+ K TH UH e n/a 21 2817 2912 2936 N
+ K TH UH s n/a 21 2817 2912 2936 N
+ K TH UW b n/a 21 2817 2913 2927 N
+ K TH UW e n/a 21 2817 2912 2924 N
+ K TH UW s n/a 21 2817 2912 2924 N
+ K TH V b n/a 21 2814 2859 2944 N
+ K TH V e n/a 21 2814 2859 2944 N
+ K TH V s n/a 21 2814 2859 2944 N
+ K TH W b n/a 21 2819 2892 2921 N
+ K TH W e n/a 21 2819 2906 2920 N
+ K TH W i n/a 21 2819 2892 2921 N
+ K TH W s n/a 21 2819 2892 2921 N
+ K TH Y b n/a 21 2814 2885 2965 N
+ K TH Y e n/a 21 2814 2886 2965 N
+ K TH Y s n/a 21 2814 2885 2965 N
+ K TH Z e n/a 21 2814 2865 2955 N
+ K TH Z s n/a 21 2814 2865 2955 N
+ K TH ZH e n/a 21 2814 2857 2956 N
+ K TH ZH s n/a 21 2814 2857 2956 N
+ K UH AA b n/a 21 2831 2913 2928 N
+ K UH AA e n/a 21 2831 2905 2929 N
+ K UH AA s n/a 21 2831 2913 2929 N
+ K UH AE b n/a 21 2832 2887 2958 N
+ K UH AE e n/a 21 2832 2887 2963 N
+ K UH AE s n/a 21 2832 2887 2958 N
+ K UH AH b n/a 21 2832 2871 2931 N
+ K UH AH e n/a 21 2832 2872 2935 N
+ K UH AH i n/a 21 2832 2872 2935 N
+ K UH AH s n/a 21 2832 2872 2935 N
+ K UH AO b n/a 21 2831 2896 2916 N
+ K UH AO e n/a 21 2831 2899 2918 N
+ K UH AO s n/a 21 2831 2899 2916 N
+ K UH AW b n/a 21 2832 2887 2959 N
+ K UH AW e n/a 21 2832 2887 2963 N
+ K UH AW i n/a 21 2832 2887 2959 N
+ K UH AW s n/a 21 2832 2887 2959 N
+ K UH AY b n/a 21 2831 2913 2930 N
+ K UH AY e n/a 21 2831 2905 2925 N
+ K UH AY s n/a 21 2831 2913 2925 N
+ K UH B b n/a 21 2831 2904 2945 N
+ K UH B e n/a 21 2831 2904 2945 N
+ K UH B i n/a 21 2831 2904 2945 N
+ K UH B s n/a 21 2831 2904 2945 N
+ K UH CH e n/a 21 2831 2904 2945 N
+ K UH CH s n/a 21 2831 2904 2945 N
+ K UH D b n/a 21 2831 2904 2945 N
+ K UH D e n/a 21 2831 2904 2945 N
+ K UH D i n/a 21 2831 2904 2945 N
+ K UH D s n/a 21 2831 2904 2945 N
+ K UH DH e n/a 21 2831 2904 2945 N
+ K UH DH s n/a 21 2831 2904 2945 N
+ K UH EH b n/a 21 2832 2887 2958 N
+ K UH EH e n/a 21 2832 2887 2963 N
+ K UH EH i n/a 21 2832 2887 2958 N
+ K UH EH s n/a 21 2832 2887 2958 N
+ K UH ER b n/a 21 2831 2913 2926 N
+ K UH ER e n/a 21 2831 2913 2936 N
+ K UH ER i n/a 21 2831 2913 2936 N
+ K UH ER s n/a 21 2831 2913 2936 N
+ K UH EY b n/a 21 2832 2887 2960 N
+ K UH EY e n/a 21 2832 2887 2963 N
+ K UH EY i n/a 21 2832 2887 2960 N
+ K UH EY s n/a 21 2832 2887 2960 N
+ K UH F b n/a 21 2831 2904 2952 N
+ K UH F e n/a 21 2831 2904 2952 N
+ K UH F i n/a 21 2831 2904 2952 N
+ K UH F s n/a 21 2831 2904 2952 N
+ K UH G e n/a 21 2831 2904 2945 N
+ K UH G s n/a 21 2831 2904 2945 N
+ K UH HH e n/a 21 2832 2904 2951 N
+ K UH HH i n/a 21 2832 2904 2951 N
+ K UH HH s n/a 21 2832 2904 2951 N
+ K UH IH b n/a 21 2832 2887 2969 N
+ K UH IH e n/a 21 2832 2887 2961 N
+ K UH IH i n/a 21 2832 2887 2962 N
+ K UH IH s n/a 21 2832 2887 2961 N
+ K UH IY b n/a 21 2832 2887 2966 N
+ K UH IY e n/a 21 2832 2887 2961 N
+ K UH IY i n/a 21 2832 2887 2962 N
+ K UH IY s n/a 21 2832 2887 2961 N
+ K UH JH e n/a 21 2831 2904 2945 N
+ K UH JH s n/a 21 2831 2904 2945 N
+ K UH K b n/a 21 2832 2904 2945 N
+ K UH K e n/a 21 2832 2904 2945 N
+ K UH K i n/a 21 2832 2904 2945 N
+ K UH K s n/a 21 2832 2904 2945 N
+ K UH L b n/a 21 2831 2896 2919 N
+ K UH L e n/a 21 2831 2899 2918 N
+ K UH L i n/a 21 2831 2899 2918 N
+ K UH L s n/a 21 2831 2899 2918 N
+ K UH M b n/a 21 2831 2904 2947 N
+ K UH M e n/a 21 2831 2904 2947 N
+ K UH M i n/a 21 2831 2904 2947 N
+ K UH M s n/a 21 2831 2904 2947 N
+ K UH N b n/a 21 2831 2904 2947 N
+ K UH N e n/a 21 2831 2904 2947 N
+ K UH N i n/a 21 2831 2904 2947 N
+ K UH N s n/a 21 2831 2904 2947 N
+ K UH NG b n/a 21 2831 2904 2947 N
+ K UH NG e n/a 21 2831 2904 2947 N
+ K UH NG s n/a 21 2831 2904 2947 N
+ K UH OW b n/a 21 2831 2913 2927 N
+ K UH OW e n/a 21 2831 2913 2924 N
+ K UH OW i n/a 21 2831 2913 2924 N
+ K UH OW s n/a 21 2831 2913 2924 N
+ K UH OY b n/a 21 2831 2896 2916 N
+ K UH OY e n/a 21 2831 2899 2918 N
+ K UH OY s n/a 21 2831 2899 2916 N
+ K UH P b n/a 21 2832 2904 2945 N
+ K UH P e n/a 21 2832 2904 2945 N
+ K UH P s n/a 21 2832 2904 2945 N
+ K UH R b n/a 21 2831 2898 2923 N
+ K UH R e n/a 21 2831 2899 2922 N
+ K UH R i n/a 21 2831 2899 2922 N
+ K UH R s n/a 21 2831 2899 2922 N
+ K UH S b n/a 21 2831 2904 2955 N
+ K UH S e n/a 21 2831 2904 2955 N
+ K UH S i n/a 21 2831 2904 2955 N
+ K UH S s n/a 21 2831 2904 2955 N
+ K UH SH b n/a 21 2831 2904 2956 N
+ K UH SH e n/a 21 2831 2904 2956 N
+ K UH SH i n/a 21 2831 2904 2956 N
+ K UH SH s n/a 21 2831 2904 2956 N
+ K UH SIL e n/a 21 2831 2904 2950 N
+ K UH SIL s n/a 21 2831 2904 2950 N
+ K UH T b n/a 21 2832 2904 2945 N
+ K UH T e n/a 21 2832 2904 2945 N
+ K UH T i n/a 21 2832 2904 2945 N
+ K UH T s n/a 21 2832 2904 2945 N
+ K UH TH e n/a 21 2831 2904 2950 N
+ K UH TH s n/a 21 2831 2904 2950 N
+ K UH UH b n/a 21 2831 2913 2934 N
+ K UH UH e n/a 21 2831 2913 2936 N
+ K UH UH s n/a 21 2831 2913 2936 N
+ K UH UW b n/a 21 2831 2913 2927 N
+ K UH UW e n/a 21 2831 2913 2926 N
+ K UH UW i n/a 21 2831 2913 2926 N
+ K UH UW s n/a 21 2831 2913 2926 N
+ K UH V b n/a 21 2831 2904 2945 N
+ K UH V e n/a 21 2831 2904 2945 N
+ K UH V s n/a 21 2831 2904 2945 N
+ K UH W b n/a 21 2831 2892 2921 N
+ K UH W e n/a 21 2831 2905 2920 N
+ K UH W i n/a 21 2831 2892 2921 N
+ K UH W s n/a 21 2831 2892 2921 N
+ K UH Y b n/a 21 2832 2887 2965 N
+ K UH Y e n/a 21 2832 2887 2965 N
+ K UH Y s n/a 21 2832 2887 2965 N
+ K UH Z e n/a 21 2831 2904 2955 N
+ K UH Z i n/a 21 2831 2904 2955 N
+ K UH Z s n/a 21 2831 2904 2955 N
+ K UH ZH e n/a 21 2831 2904 2956 N
+ K UH ZH s n/a 21 2831 2904 2956 N
+ K UW AA b n/a 21 2828 2913 2928 N
+ K UW AA e n/a 21 2828 2905 2929 N
+ K UW AA i n/a 21 2828 2913 2928 N
+ K UW AA s n/a 21 2828 2913 2929 N
+ K UW AE b n/a 21 2826 2885 2958 N
+ K UW AE e n/a 21 2826 2885 2963 N
+ K UW AE i n/a 21 2826 2885 2958 N
+ K UW AE s n/a 21 2826 2885 2958 N
+ K UW AH b n/a 21 2826 2871 2933 N
+ K UW AH e n/a 21 2826 2872 2935 N
+ K UW AH i n/a 21 2826 2872 2935 N
+ K UW AH s n/a 21 2826 2872 2935 N
+ K UW AO b n/a 21 2828 2896 2916 N
+ K UW AO e n/a 21 2828 2899 2918 N
+ K UW AO i n/a 21 2828 2899 2916 N
+ K UW AO s n/a 21 2828 2899 2916 N
+ K UW AW b n/a 21 2826 2885 2959 N
+ K UW AW e n/a 21 2826 2885 2963 N
+ K UW AW i n/a 21 2826 2885 2959 N
+ K UW AW s n/a 21 2826 2885 2959 N
+ K UW AY b n/a 21 2828 2913 2930 N
+ K UW AY e n/a 21 2828 2905 2925 N
+ K UW AY i n/a 21 2828 2913 2925 N
+ K UW AY s n/a 21 2828 2913 2925 N
+ K UW B b n/a 21 2826 2904 2945 N
+ K UW B e n/a 21 2826 2904 2945 N
+ K UW B i n/a 21 2826 2904 2945 N
+ K UW B s n/a 21 2826 2904 2945 N
+ K UW CH e n/a 21 2826 2904 2945 N
+ K UW CH i n/a 21 2826 2904 2945 N
+ K UW CH s n/a 21 2826 2904 2945 N
+ K UW D b n/a 21 2826 2904 2945 N
+ K UW D e n/a 21 2826 2904 2945 N
+ K UW D i n/a 21 2826 2904 2945 N
+ K UW D s n/a 21 2826 2904 2945 N
+ K UW DH e n/a 21 2826 2904 2945 N
+ K UW DH s n/a 21 2826 2904 2945 N
+ K UW EH b n/a 21 2826 2885 2958 N
+ K UW EH e n/a 21 2826 2885 2963 N
+ K UW EH i n/a 21 2826 2885 2958 N
+ K UW EH s n/a 21 2826 2885 2958 N
+ K UW ER b n/a 21 2828 2913 2926 N
+ K UW ER e n/a 21 2828 2913 2936 N
+ K UW ER i n/a 21 2828 2913 2936 N
+ K UW ER s n/a 21 2828 2913 2936 N
+ K UW EY b n/a 21 2826 2885 2960 N
+ K UW EY e n/a 21 2826 2885 2963 N
+ K UW EY i n/a 21 2826 2885 2960 N
+ K UW EY s n/a 21 2826 2885 2960 N
+ K UW F b n/a 21 2826 2904 2952 N
+ K UW F e n/a 21 2826 2904 2952 N
+ K UW F s n/a 21 2826 2904 2952 N
+ K UW G e n/a 21 2826 2904 2945 N
+ K UW G s n/a 21 2826 2904 2945 N
+ K UW HH e n/a 21 2826 2904 2951 N
+ K UW HH i n/a 21 2826 2904 2951 N
+ K UW HH s n/a 21 2826 2904 2951 N
+ K UW IH b n/a 21 2826 2885 2969 N
+ K UW IH e n/a 21 2826 2885 2961 N
+ K UW IH i n/a 21 2826 2885 2961 N
+ K UW IH s n/a 21 2826 2885 2961 N
+ K UW IY b n/a 21 2826 2885 2966 N
+ K UW IY e n/a 21 2826 2885 2961 N
+ K UW IY i n/a 21 2826 2885 2962 N
+ K UW IY s n/a 21 2826 2885 2961 N
+ K UW JH e n/a 21 2826 2904 2945 N
+ K UW JH i n/a 21 2826 2904 2945 N
+ K UW JH s n/a 21 2826 2904 2945 N
+ K UW K b n/a 21 2826 2904 2945 N
+ K UW K e n/a 21 2826 2904 2945 N
+ K UW K s n/a 21 2826 2904 2945 N
+ K UW L b n/a 21 2828 2896 2919 N
+ K UW L e n/a 21 2828 2899 2918 N
+ K UW L i n/a 21 2828 2899 2918 N
+ K UW L s n/a 21 2828 2899 2918 N
+ K UW M b n/a 21 2826 2904 2947 N
+ K UW M e n/a 21 2826 2904 2947 N
+ K UW M i n/a 21 2826 2904 2947 N
+ K UW M s n/a 21 2826 2904 2947 N
+ K UW N b n/a 21 2826 2904 2947 N
+ K UW N e n/a 21 2826 2904 2947 N
+ K UW N i n/a 21 2826 2904 2947 N
+ K UW N s n/a 21 2826 2904 2947 N
+ K UW NG b n/a 21 2826 2904 2947 N
+ K UW NG e n/a 21 2826 2904 2947 N
+ K UW NG s n/a 21 2826 2904 2947 N
+ K UW OW b n/a 21 2828 2913 2927 N
+ K UW OW e n/a 21 2828 2913 2924 N
+ K UW OW i n/a 21 2828 2913 2924 N
+ K UW OW s n/a 21 2828 2913 2924 N
+ K UW OY b n/a 21 2828 2896 2916 N
+ K UW OY e n/a 21 2828 2899 2918 N
+ K UW OY i n/a 21 2828 2899 2916 N
+ K UW OY s n/a 21 2828 2899 2916 N
+ K UW P b n/a 21 2826 2904 2945 N
+ K UW P e n/a 21 2826 2904 2945 N
+ K UW P s n/a 21 2826 2904 2945 N
+ K UW R b n/a 21 2828 2898 2923 N
+ K UW R e n/a 21 2828 2899 2922 N
+ K UW R i n/a 21 2828 2899 2922 N
+ K UW R s n/a 21 2828 2899 2922 N
+ K UW S b n/a 21 2826 2904 2955 N
+ K UW S e n/a 21 2826 2904 2955 N
+ K UW S i n/a 21 2826 2904 2955 N
+ K UW S s n/a 21 2826 2904 2955 N
+ K UW SH b n/a 21 2826 2904 2956 N
+ K UW SH e n/a 21 2826 2904 2956 N
+ K UW SH i n/a 21 2826 2904 2956 N
+ K UW SH s n/a 21 2826 2904 2956 N
+ K UW SIL e n/a 21 2826 2904 2950 N
+ K UW SIL s n/a 21 2826 2904 2950 N
+ K UW T b n/a 21 2826 2904 2945 N
+ K UW T e n/a 21 2826 2904 2945 N
+ K UW T i n/a 21 2826 2904 2945 N
+ K UW T s n/a 21 2826 2904 2945 N
+ K UW TH e n/a 21 2826 2904 2950 N
+ K UW TH s n/a 21 2826 2904 2950 N
+ K UW UH b n/a 21 2828 2913 2934 N
+ K UW UH e n/a 21 2828 2913 2936 N
+ K UW UH i n/a 21 2828 2913 2936 N
+ K UW UH s n/a 21 2828 2913 2936 N
+ K UW UW b n/a 21 2828 2913 2927 N
+ K UW UW e n/a 21 2828 2913 2926 N
+ K UW UW i n/a 21 2828 2913 2926 N
+ K UW UW s n/a 21 2828 2913 2926 N
+ K UW V b n/a 21 2826 2904 2945 N
+ K UW V e n/a 21 2826 2904 2945 N
+ K UW V s n/a 21 2826 2904 2945 N
+ K UW W b n/a 21 2828 2892 2921 N
+ K UW W e n/a 21 2828 2905 2920 N
+ K UW W i n/a 21 2828 2892 2921 N
+ K UW W s n/a 21 2828 2892 2921 N
+ K UW Y b n/a 21 2826 2885 2965 N
+ K UW Y e n/a 21 2826 2885 2965 N
+ K UW Y i n/a 21 2826 2885 2965 N
+ K UW Y s n/a 21 2826 2885 2965 N
+ K UW Z e n/a 21 2826 2904 2955 N
+ K UW Z i n/a 21 2826 2904 2955 N
+ K UW Z s n/a 21 2826 2904 2955 N
+ K UW ZH e n/a 21 2826 2904 2956 N
+ K UW ZH s n/a 21 2826 2904 2956 N
+ K V AA b n/a 21 2819 2907 2928 N
+ K V AA e n/a 21 2819 2906 2929 N
+ K V AA i n/a 21 2819 2907 2928 N
+ K V AA s n/a 21 2819 2907 2929 N
+ K V AE b n/a 21 2814 2885 2958 N
+ K V AE e n/a 21 2814 2886 2963 N
+ K V AE s n/a 21 2814 2885 2958 N
+ K V AH b n/a 21 2814 2878 2931 N
+ K V AH e n/a 21 2814 2878 2940 N
+ K V AH i n/a 21 2814 2878 2938 N
+ K V AH s n/a 21 2814 2878 2940 N
+ K V AO b n/a 21 2819 2896 2917 N
+ K V AO e n/a 21 2819 2896 2918 N
+ K V AO s n/a 21 2819 2896 2917 N
+ K V AW b n/a 21 2814 2885 2959 N
+ K V AW e n/a 21 2814 2886 2963 N
+ K V AW s n/a 21 2814 2885 2959 N
+ K V AY b n/a 21 2819 2910 2930 N
+ K V AY e n/a 21 2819 2906 2925 N
+ K V AY s n/a 21 2819 2910 2925 N
+ K V B b n/a 21 2814 2859 2944 N
+ K V B e n/a 21 2814 2859 2944 N
+ K V B s n/a 21 2814 2859 2944 N
+ K V CH e n/a 21 2814 2856 2944 N
+ K V CH s n/a 21 2814 2856 2944 N
+ K V D b n/a 21 2814 2859 2944 N
+ K V D e n/a 21 2814 2859 2944 N
+ K V D s n/a 21 2814 2859 2944 N
+ K V DH e n/a 21 2814 2859 2944 N
+ K V DH s n/a 21 2814 2859 2944 N
+ K V EH b n/a 21 2814 2885 2958 N
+ K V EH e n/a 21 2814 2886 2963 N
+ K V EH s n/a 21 2814 2885 2958 N
+ K V ER b n/a 21 2819 2912 2926 N
+ K V ER e n/a 21 2819 2912 2936 N
+ K V ER i n/a 21 2819 2912 2936 N
+ K V ER s n/a 21 2819 2912 2936 N
+ K V EY b n/a 21 2814 2885 2960 N
+ K V EY e n/a 21 2814 2886 2963 N
+ K V EY s n/a 21 2814 2885 2960 N
+ K V F b n/a 21 2814 2859 2952 N
+ K V F e n/a 21 2814 2859 2952 N
+ K V F s n/a 21 2814 2859 2952 N
+ K V G e n/a 21 2814 2859 2944 N
+ K V G s n/a 21 2814 2859 2944 N
+ K V HH e n/a 21 2814 2859 2951 N
+ K V HH s n/a 21 2814 2859 2951 N
+ K V IH b n/a 21 2814 2885 2969 N
+ K V IH e n/a 21 2814 2886 2961 N
+ K V IH i n/a 21 2814 2886 2968 N
+ K V IH s n/a 21 2814 2885 2961 N
+ K V IY b n/a 21 2814 2885 2966 N
+ K V IY e n/a 21 2814 2886 2961 N
+ K V IY s n/a 21 2814 2885 2961 N
+ K V JH e n/a 21 2814 2857 2944 N
+ K V JH s n/a 21 2814 2857 2944 N
+ K V K b n/a 21 2814 2859 2944 N
+ K V K e n/a 21 2814 2859 2944 N
+ K V K s n/a 21 2814 2859 2944 N
+ K V L b n/a 21 2819 2897 2919 N
+ K V L e n/a 21 2819 2897 2918 N
+ K V L s n/a 21 2819 2897 2918 N
+ K V M b n/a 21 2814 2859 2947 N
+ K V M e n/a 21 2814 2859 2947 N
+ K V M s n/a 21 2814 2859 2947 N
+ K V N b n/a 21 2814 2859 2947 N
+ K V N e n/a 21 2814 2859 2947 N
+ K V N s n/a 21 2814 2859 2947 N
+ K V NG b n/a 21 2814 2859 2947 N
+ K V NG e n/a 21 2814 2859 2947 N
+ K V NG s n/a 21 2814 2859 2947 N
+ K V OW b n/a 21 2819 2913 2927 N
+ K V OW e n/a 21 2819 2912 2925 N
+ K V OW i n/a 21 2819 2912 2925 N
+ K V OW s n/a 21 2819 2912 2925 N
+ K V OY b n/a 21 2819 2896 2917 N
+ K V OY e n/a 21 2819 2896 2918 N
+ K V OY s n/a 21 2819 2896 2917 N
+ K V P b n/a 21 2814 2859 2944 N
+ K V P e n/a 21 2814 2859 2944 N
+ K V P s n/a 21 2814 2859 2944 N
+ K V R b n/a 21 2819 2898 2923 N
+ K V R e n/a 21 2819 2898 2922 N
+ K V R i n/a 21 2819 2898 2922 N
+ K V R s n/a 21 2819 2898 2922 N
+ K V S b n/a 21 2814 2867 2955 N
+ K V S e n/a 21 2814 2867 2955 N
+ K V S i n/a 21 2814 2867 2955 N
+ K V S s n/a 21 2814 2867 2955 N
+ K V SH b n/a 21 2814 2856 2956 N
+ K V SH e n/a 21 2814 2856 2956 N
+ K V SH s n/a 21 2814 2856 2956 N
+ K V SIL e n/a 21 2814 2859 2949 N
+ K V SIL s n/a 21 2814 2859 2949 N
+ K V T b n/a 21 2814 2859 2944 N
+ K V T e n/a 21 2814 2859 2944 N
+ K V T s n/a 21 2814 2859 2944 N
+ K V TH e n/a 21 2814 2859 2949 N
+ K V TH s n/a 21 2814 2859 2949 N
+ K V UH b n/a 21 2819 2912 2934 N
+ K V UH e n/a 21 2819 2912 2936 N
+ K V UH s n/a 21 2819 2912 2936 N
+ K V UW b n/a 21 2819 2913 2927 N
+ K V UW e n/a 21 2819 2912 2926 N
+ K V UW s n/a 21 2819 2912 2926 N
+ K V V b n/a 21 2814 2859 2944 N
+ K V V e n/a 21 2814 2859 2944 N
+ K V V s n/a 21 2814 2859 2944 N
+ K V W b n/a 21 2819 2892 2921 N
+ K V W e n/a 21 2819 2906 2920 N
+ K V W i n/a 21 2819 2892 2921 N
+ K V W s n/a 21 2819 2892 2921 N
+ K V Y b n/a 21 2814 2885 2965 N
+ K V Y e n/a 21 2814 2886 2965 N
+ K V Y s n/a 21 2814 2885 2965 N
+ K V Z e n/a 21 2814 2865 2955 N
+ K V Z s n/a 21 2814 2865 2955 N
+ K V ZH e n/a 21 2814 2857 2956 N
+ K V ZH s n/a 21 2814 2857 2956 N
+ K W AA b n/a 21 2829 2913 2928 N
+ K W AA s n/a 21 2829 2913 2929 N
+ K W AE b n/a 21 2830 2887 2958 N
+ K W AE s n/a 21 2830 2887 2958 N
+ K W AH b n/a 21 2830 2872 2931 N
+ K W AH s n/a 21 2830 2872 2935 N
+ K W AO b n/a 21 2829 2896 2916 N
+ K W AO s n/a 21 2829 2899 2916 N
+ K W AW b n/a 21 2829 2887 2959 N
+ K W AW s n/a 21 2829 2887 2959 N
+ K W AY b n/a 21 2831 2913 2930 N
+ K W AY s n/a 21 2831 2913 2925 N
+ K W B b n/a 21 2830 2904 2945 N
+ K W B s n/a 21 2830 2904 2945 N
+ K W CH s n/a 21 2830 2904 2945 N
+ K W D b n/a 21 2830 2904 2945 N
+ K W D s n/a 21 2830 2904 2945 N
+ K W DH s n/a 21 2830 2904 2945 N
+ K W EH b n/a 21 2830 2887 2958 N
+ K W EH s n/a 21 2830 2887 2958 N
+ K W ER b n/a 21 2829 2913 2926 N
+ K W ER s n/a 21 2829 2913 2936 N
+ K W EY b n/a 21 2832 2887 2960 N
+ K W EY s n/a 21 2832 2887 2960 N
+ K W F b n/a 21 2830 2904 2952 N
+ K W F s n/a 21 2830 2904 2952 N
+ K W G s n/a 21 2830 2904 2945 N
+ K W HH s n/a 21 2830 2904 2951 N
+ K W IH b n/a 21 2830 2887 2969 N
+ K W IH s n/a 21 2830 2887 2961 N
+ K W IY b n/a 21 2832 2887 2966 N
+ K W IY s n/a 21 2832 2887 2961 N
+ K W JH s n/a 21 2830 2904 2945 N
+ K W K b n/a 21 2830 2904 2945 N
+ K W K s n/a 21 2830 2904 2945 N
+ K W L b n/a 21 2829 2896 2919 N
+ K W L s n/a 21 2829 2899 2918 N
+ K W M b n/a 21 2830 2904 2947 N
+ K W M s n/a 21 2830 2904 2947 N
+ K W N b n/a 21 2830 2904 2947 N
+ K W N s n/a 21 2830 2904 2947 N
+ K W NG b n/a 21 2830 2904 2947 N
+ K W NG s n/a 21 2830 2904 2947 N
+ K W OW b n/a 21 2829 2913 2927 N
+ K W OW s n/a 21 2829 2913 2924 N
+ K W OY b n/a 21 2831 2896 2916 N
+ K W OY s n/a 21 2831 2899 2916 N
+ K W P b n/a 21 2830 2904 2945 N
+ K W P s n/a 21 2830 2904 2945 N
+ K W R b n/a 21 2829 2898 2923 N
+ K W R i n/a 21 2829 2899 2922 N
+ K W R s n/a 21 2829 2899 2922 N
+ K W S b n/a 21 2830 2904 2955 N
+ K W S s n/a 21 2830 2904 2955 N
+ K W SH b n/a 21 2830 2904 2956 N
+ K W SH s n/a 21 2830 2904 2956 N
+ K W SIL s n/a 21 2829 2904 2950 N
+ K W T b n/a 21 2830 2904 2945 N
+ K W T s n/a 21 2830 2904 2945 N
+ K W TH s n/a 21 2830 2904 2950 N
+ K W UH b n/a 21 2829 2913 2934 N
+ K W UH s n/a 21 2829 2913 2936 N
+ K W UW b n/a 21 2829 2913 2927 N
+ K W UW s n/a 21 2829 2913 2926 N
+ K W V b n/a 21 2830 2904 2945 N
+ K W V s n/a 21 2830 2904 2945 N
+ K W W b n/a 21 2829 2892 2921 N
+ K W W s n/a 21 2829 2892 2921 N
+ K W Y b n/a 21 2832 2887 2965 N
+ K W Y s n/a 21 2832 2887 2965 N
+ K W Z s n/a 21 2830 2904 2955 N
+ K W ZH s n/a 21 2830 2904 2956 N
+ K Y AA b n/a 21 2848 2910 2928 N
+ K Y AA s n/a 21 2848 2910 2929 N
+ K Y AE b n/a 21 2848 2883 2958 N
+ K Y AE s n/a 21 2848 2883 2958 N
+ K Y AH b n/a 21 2848 2857 2931 N
+ K Y AH s n/a 21 2848 2857 2940 N
+ K Y AO b n/a 21 2848 2901 2916 N
+ K Y AO s n/a 21 2848 2902 2916 N
+ K Y AW b n/a 21 2848 2883 2959 N
+ K Y AW s n/a 21 2848 2883 2959 N
+ K Y AY b n/a 21 2848 2910 2930 N
+ K Y AY s n/a 21 2848 2910 2925 N
+ K Y B b n/a 21 2849 2860 2944 N
+ K Y B s n/a 21 2849 2860 2944 N
+ K Y CH s n/a 21 2849 2860 2944 N
+ K Y D b n/a 21 2849 2860 2944 N
+ K Y D s n/a 21 2849 2860 2944 N
+ K Y DH s n/a 21 2849 2860 2944 N
+ K Y EH b n/a 21 2848 2883 2958 N
+ K Y EH s n/a 21 2848 2883 2958 N
+ K Y ER b n/a 21 2848 2911 2926 N
+ K Y ER s n/a 21 2848 2911 2936 N
+ K Y EY b n/a 21 2848 2883 2960 N
+ K Y EY s n/a 21 2848 2883 2960 N
+ K Y F b n/a 21 2849 2860 2952 N
+ K Y F s n/a 21 2849 2860 2952 N
+ K Y G s n/a 21 2849 2860 2944 N
+ K Y HH s n/a 21 2849 2860 2951 N
+ K Y IH b n/a 21 2848 2883 2969 N
+ K Y IH s n/a 21 2848 2883 2961 N
+ K Y IY b n/a 21 2848 2883 2966 N
+ K Y IY s n/a 21 2848 2883 2961 N
+ K Y JH s n/a 21 2849 2860 2944 N
+ K Y K b n/a 21 2849 2860 2944 N
+ K Y K s n/a 21 2849 2860 2944 N
+ K Y L b n/a 21 2849 2901 2919 N
+ K Y L i n/a 21 2849 2902 2918 N
+ K Y L s n/a 21 2849 2902 2918 N
+ K Y M b n/a 21 2849 2860 2947 N
+ K Y M s n/a 21 2849 2860 2947 N
+ K Y N b n/a 21 2849 2860 2947 N
+ K Y N s n/a 21 2849 2860 2947 N
+ K Y NG b n/a 21 2849 2860 2947 N
+ K Y NG s n/a 21 2849 2860 2947 N
+ K Y OW b n/a 21 2848 2911 2927 N
+ K Y OW s n/a 21 2848 2911 2925 N
+ K Y OY b n/a 21 2848 2901 2916 N
+ K Y OY s n/a 21 2848 2902 2916 N
+ K Y P b n/a 21 2849 2860 2944 N
+ K Y P s n/a 21 2849 2860 2944 N
+ K Y R b n/a 21 2849 2901 2923 N
+ K Y R s n/a 21 2849 2902 2922 N
+ K Y S b n/a 21 2850 2867 2953 N
+ K Y S s n/a 21 2850 2867 2953 N
+ K Y SH b n/a 21 2849 2860 2956 N
+ K Y SH s n/a 21 2849 2860 2956 N
+ K Y SIL s n/a 21 2849 2860 2948 N
+ K Y T b n/a 21 2849 2860 2944 N
+ K Y T s n/a 21 2849 2860 2944 N
+ K Y TH s n/a 21 2849 2860 2948 N
+ K Y UH b n/a 21 2848 2911 2934 N
+ K Y UH s n/a 21 2848 2911 2936 N
+ K Y UW b n/a 21 2848 2911 2927 N
+ K Y UW s n/a 21 2848 2911 2926 N
+ K Y V b n/a 21 2849 2860 2944 N
+ K Y V s n/a 21 2849 2860 2944 N
+ K Y W b n/a 21 2849 2893 2921 N
+ K Y W s n/a 21 2849 2893 2921 N
+ K Y Y b n/a 21 2849 2884 2965 N
+ K Y Y s n/a 21 2849 2884 2965 N
+ K Y Z s n/a 21 2850 2865 2953 N
+ K Y ZH s n/a 21 2849 2860 2956 N
+ K Z AA b n/a 21 2821 2910 2928 N
+ K Z AA e n/a 21 2820 2906 2929 N
+ K Z AA i n/a 21 2820 2909 2928 N
+ K Z AA s n/a 21 2820 2910 2929 N
+ K Z AE b n/a 21 2823 2885 2958 N
+ K Z AE e n/a 21 2823 2886 2963 N
+ K Z AE i n/a 21 2823 2886 2958 N
+ K Z AE s n/a 21 2823 2885 2958 N
+ K Z AH b n/a 21 2821 2877 2931 N
+ K Z AH e n/a 21 2820 2877 2940 N
+ K Z AH i n/a 21 2820 2877 2938 N
+ K Z AH s n/a 21 2820 2877 2940 N
+ K Z AO b n/a 21 2822 2897 2916 N
+ K Z AO e n/a 21 2820 2897 2918 N
+ K Z AO i n/a 21 2820 2897 2917 N
+ K Z AO s n/a 21 2820 2897 2916 N
+ K Z AW b n/a 21 2823 2885 2959 N
+ K Z AW e n/a 21 2823 2886 2963 N
+ K Z AW s n/a 21 2823 2885 2959 N
+ K Z AY b n/a 21 2821 2910 2930 N
+ K Z AY e n/a 21 2820 2906 2925 N
+ K Z AY i n/a 21 2820 2909 2925 N
+ K Z AY s n/a 21 2820 2910 2925 N
+ K Z B b n/a 21 2821 2859 2944 N
+ K Z B e n/a 21 2820 2859 2944 N
+ K Z B s n/a 21 2820 2859 2944 N
+ K Z CH e n/a 21 2820 2856 2944 N
+ K Z CH s n/a 21 2820 2856 2944 N
+ K Z D b n/a 21 2821 2859 2944 N
+ K Z D e n/a 21 2820 2859 2944 N
+ K Z D s n/a 21 2820 2859 2944 N
+ K Z DH e n/a 21 2820 2859 2944 N
+ K Z DH s n/a 21 2820 2859 2944 N
+ K Z EH b n/a 21 2823 2885 2958 N
+ K Z EH e n/a 21 2823 2886 2963 N
+ K Z EH s n/a 21 2823 2885 2958 N
+ K Z ER b n/a 21 2821 2912 2926 N
+ K Z ER e n/a 21 2820 2913 2936 N
+ K Z ER s n/a 21 2820 2913 2936 N
+ K Z EY b n/a 21 2823 2885 2960 N
+ K Z EY e n/a 21 2823 2886 2963 N
+ K Z EY i n/a 21 2823 2886 2960 N
+ K Z EY s n/a 21 2823 2885 2960 N
+ K Z F b n/a 21 2821 2859 2952 N
+ K Z F e n/a 21 2820 2859 2952 N
+ K Z F s n/a 21 2820 2859 2952 N
+ K Z G e n/a 21 2820 2859 2944 N
+ K Z G s n/a 21 2820 2859 2944 N
+ K Z HH e n/a 21 2820 2859 2951 N
+ K Z HH s n/a 21 2820 2859 2951 N
+ K Z IH b n/a 21 2823 2885 2969 N
+ K Z IH e n/a 21 2823 2886 2961 N
+ K Z IH s n/a 21 2823 2885 2961 N
+ K Z IY b n/a 21 2823 2885 2966 N
+ K Z IY e n/a 21 2823 2886 2961 N
+ K Z IY i n/a 21 2823 2886 2968 N
+ K Z IY s n/a 21 2823 2885 2961 N
+ K Z JH e n/a 21 2820 2857 2944 N
+ K Z JH s n/a 21 2820 2857 2944 N
+ K Z K b n/a 21 2821 2859 2944 N
+ K Z K e n/a 21 2820 2859 2944 N
+ K Z K s n/a 21 2820 2859 2944 N
+ K Z L b n/a 21 2822 2897 2919 N
+ K Z L e n/a 21 2820 2897 2918 N
+ K Z L s n/a 21 2820 2897 2918 N
+ K Z M b n/a 21 2821 2859 2947 N
+ K Z M e n/a 21 2820 2859 2947 N
+ K Z M s n/a 21 2820 2859 2947 N
+ K Z N b n/a 21 2821 2859 2947 N
+ K Z N e n/a 21 2820 2859 2947 N
+ K Z N i n/a 21 2820 2859 2947 N
+ K Z N s n/a 21 2820 2859 2947 N
+ K Z NG b n/a 21 2821 2859 2947 N
+ K Z NG e n/a 21 2820 2859 2947 N
+ K Z NG s n/a 21 2820 2859 2947 N
+ K Z OW b n/a 21 2821 2913 2927 N
+ K Z OW e n/a 21 2820 2913 2925 N
+ K Z OW i n/a 21 2820 2913 2925 N
+ K Z OW s n/a 21 2820 2913 2925 N
+ K Z OY b n/a 21 2821 2897 2916 N
+ K Z OY e n/a 21 2820 2897 2918 N
+ K Z OY s n/a 21 2820 2897 2916 N
+ K Z P b n/a 21 2821 2859 2944 N
+ K Z P e n/a 21 2820 2859 2944 N
+ K Z P s n/a 21 2820 2859 2944 N
+ K Z R b n/a 21 2822 2898 2923 N
+ K Z R e n/a 21 2820 2898 2922 N
+ K Z R i n/a 21 2820 2898 2922 N
+ K Z R s n/a 21 2820 2898 2922 N
+ K Z S b n/a 21 2821 2867 2955 N
+ K Z S e n/a 21 2820 2867 2955 N
+ K Z S s n/a 21 2820 2867 2955 N
+ K Z SH b n/a 21 2821 2856 2956 N
+ K Z SH e n/a 21 2820 2856 2956 N
+ K Z SH s n/a 21 2820 2856 2956 N
+ K Z SIL e n/a 21 2820 2859 2949 N
+ K Z SIL s n/a 21 2820 2859 2949 N
+ K Z T b n/a 21 2821 2859 2944 N
+ K Z T e n/a 21 2820 2859 2944 N
+ K Z T s n/a 21 2820 2859 2944 N
+ K Z TH e n/a 21 2820 2859 2949 N
+ K Z TH s n/a 21 2820 2859 2949 N
+ K Z UH b n/a 21 2821 2912 2934 N
+ K Z UH e n/a 21 2820 2913 2936 N
+ K Z UH s n/a 21 2820 2913 2936 N
+ K Z UW b n/a 21 2821 2913 2927 N
+ K Z UW e n/a 21 2820 2913 2926 N
+ K Z UW i n/a 21 2820 2913 2926 N
+ K Z UW s n/a 21 2820 2913 2926 N
+ K Z V b n/a 21 2821 2859 2944 N
+ K Z V e n/a 21 2820 2859 2944 N
+ K Z V s n/a 21 2820 2859 2944 N
+ K Z W b n/a 21 2822 2892 2921 N
+ K Z W e n/a 21 2820 2906 2920 N
+ K Z W i n/a 21 2820 2892 2921 N
+ K Z W s n/a 21 2820 2892 2921 N
+ K Z Y b n/a 21 2823 2885 2965 N
+ K Z Y e n/a 21 2823 2886 2965 N
+ K Z Y i n/a 21 2823 2886 2965 N
+ K Z Y s n/a 21 2823 2885 2965 N
+ K Z Z e n/a 21 2820 2865 2955 N
+ K Z Z s n/a 21 2820 2865 2955 N
+ K Z ZH e n/a 21 2820 2857 2956 N
+ K Z ZH s n/a 21 2820 2857 2956 N
+ K ZH AA b n/a 21 2821 2910 2928 N
+ K ZH AA s n/a 21 2820 2910 2929 N
+ K ZH AE b n/a 21 2823 2885 2958 N
+ K ZH AE s n/a 21 2823 2885 2958 N
+ K ZH AH b n/a 21 2821 2878 2931 N
+ K ZH AH s n/a 21 2820 2878 2940 N
+ K ZH AO b n/a 21 2822 2897 2916 N
+ K ZH AO i n/a 21 2820 2897 2917 N
+ K ZH AO s n/a 21 2820 2897 2916 N
+ K ZH AW b n/a 21 2823 2885 2959 N
+ K ZH AW s n/a 21 2823 2885 2959 N
+ K ZH AY b n/a 21 2821 2910 2930 N
+ K ZH AY s n/a 21 2820 2910 2925 N
+ K ZH B b n/a 21 2821 2859 2944 N
+ K ZH B s n/a 21 2820 2859 2944 N
+ K ZH CH s n/a 21 2820 2856 2944 N
+ K ZH D b n/a 21 2821 2859 2944 N
+ K ZH D s n/a 21 2820 2859 2944 N
+ K ZH DH s n/a 21 2820 2859 2944 N
+ K ZH EH b n/a 21 2823 2885 2958 N
+ K ZH EH s n/a 21 2823 2885 2958 N
+ K ZH ER b n/a 21 2821 2912 2926 N
+ K ZH ER s n/a 21 2820 2913 2936 N
+ K ZH EY b n/a 21 2823 2885 2960 N
+ K ZH EY s n/a 21 2823 2885 2960 N
+ K ZH F b n/a 21 2821 2859 2952 N
+ K ZH F s n/a 21 2820 2859 2952 N
+ K ZH G s n/a 21 2820 2859 2944 N
+ K ZH HH s n/a 21 2820 2859 2951 N
+ K ZH IH b n/a 21 2823 2885 2969 N
+ K ZH IH s n/a 21 2823 2885 2961 N
+ K ZH IY b n/a 21 2823 2885 2966 N
+ K ZH IY s n/a 21 2823 2885 2961 N
+ K ZH JH s n/a 21 2820 2857 2944 N
+ K ZH K b n/a 21 2821 2859 2944 N
+ K ZH K s n/a 21 2820 2859 2944 N
+ K ZH L b n/a 21 2822 2897 2919 N
+ K ZH L s n/a 21 2820 2897 2918 N
+ K ZH M b n/a 21 2821 2859 2947 N
+ K ZH M s n/a 21 2820 2859 2947 N
+ K ZH N b n/a 21 2821 2859 2947 N
+ K ZH N s n/a 21 2820 2859 2947 N
+ K ZH NG b n/a 21 2821 2859 2947 N
+ K ZH NG s n/a 21 2820 2859 2947 N
+ K ZH OW b n/a 21 2821 2913 2927 N
+ K ZH OW i n/a 21 2820 2913 2925 N
+ K ZH OW s n/a 21 2820 2913 2925 N
+ K ZH OY b n/a 21 2821 2897 2916 N
+ K ZH OY s n/a 21 2820 2897 2916 N
+ K ZH P b n/a 21 2821 2859 2944 N
+ K ZH P s n/a 21 2820 2859 2944 N
+ K ZH R b n/a 21 2822 2898 2923 N
+ K ZH R s n/a 21 2820 2898 2922 N
+ K ZH S b n/a 21 2821 2867 2955 N
+ K ZH S s n/a 21 2820 2867 2955 N
+ K ZH SH b n/a 21 2821 2856 2956 N
+ K ZH SH s n/a 21 2820 2856 2956 N
+ K ZH SIL s n/a 21 2820 2859 2949 N
+ K ZH T b n/a 21 2821 2859 2944 N
+ K ZH T s n/a 21 2820 2859 2944 N
+ K ZH TH s n/a 21 2820 2859 2949 N
+ K ZH UH b n/a 21 2821 2912 2934 N
+ K ZH UH s n/a 21 2820 2913 2936 N
+ K ZH UW b n/a 21 2821 2913 2927 N
+ K ZH UW i n/a 21 2820 2913 2926 N
+ K ZH UW s n/a 21 2820 2913 2926 N
+ K ZH V b n/a 21 2821 2859 2944 N
+ K ZH V s n/a 21 2820 2859 2944 N
+ K ZH W b n/a 21 2822 2892 2921 N
+ K ZH W s n/a 21 2820 2892 2921 N
+ K ZH Y b n/a 21 2823 2885 2965 N
+ K ZH Y s n/a 21 2823 2885 2965 N
+ K ZH Z s n/a 21 2820 2865 2955 N
+ K ZH ZH s n/a 21 2820 2857 2956 N
+ L AA AA b n/a 22 2984 3071 3168 N
+ L AA AA e n/a 22 2984 3090 3162 N
+ L AA AA i n/a 22 2987 3074 3168 N
+ L AA AA s n/a 22 2984 3090 3168 N
+ L AA AE b n/a 22 2984 3066 3174 N
+ L AA AE e n/a 22 2984 3091 3180 N
+ L AA AE i n/a 22 2987 3066 3174 N
+ L AA AE s n/a 22 2984 3091 3174 N
+ L AA AH b n/a 22 2984 3066 3172 N
+ L AA AH e n/a 22 2984 3090 3161 N
+ L AA AH i n/a 22 2986 3092 3159 N
+ L AA AH s n/a 22 2984 3090 3172 N
+ L AA AO b n/a 22 2984 3071 3167 N
+ L AA AO e n/a 22 2984 3090 3162 N
+ L AA AO i n/a 22 2987 3074 3167 N
+ L AA AO s n/a 22 2984 3090 3167 N
+ L AA AW b n/a 22 2984 3066 3174 N
+ L AA AW e n/a 22 2984 3091 3180 N
+ L AA AW i n/a 22 2987 3066 3174 N
+ L AA AW s n/a 22 2984 3091 3174 N
+ L AA AY b n/a 22 2984 3074 3171 N
+ L AA AY e n/a 22 2984 3090 3173 N
+ L AA AY i n/a 22 2987 3074 3171 N
+ L AA AY s n/a 22 2984 3090 3171 N
+ L AA B e n/a 22 2981 3106 3128 N
+ L AA B i n/a 22 2981 3106 3125 N
+ L AA B s n/a 22 2981 3106 3125 N
+ L AA CH e n/a 22 2981 3114 3138 N
+ L AA CH i n/a 22 2981 3114 3138 N
+ L AA CH s n/a 22 2981 3114 3138 N
+ L AA D e n/a 22 2981 3106 3127 N
+ L AA D i n/a 22 2981 3106 3125 N
+ L AA D s n/a 22 2981 3106 3125 N
+ L AA DH e n/a 22 2981 3106 3129 N
+ L AA DH s n/a 22 2981 3106 3125 N
+ L AA EH b n/a 22 2984 3066 3178 N
+ L AA EH e n/a 22 2984 3091 3180 N
+ L AA EH i n/a 22 2986 3066 3178 N
+ L AA EH s n/a 22 2984 3091 3178 N
+ L AA ER b n/a 22 2984 3070 3188 N
+ L AA ER e n/a 22 2984 3090 3187 N
+ L AA ER i n/a 22 2987 3092 3187 N
+ L AA ER s n/a 22 2984 3090 3187 N
+ L AA EY b n/a 22 2984 3067 3155 N
+ L AA EY e n/a 22 2984 3079 3155 N
+ L AA EY i n/a 22 2987 3067 3155 N
+ L AA EY s n/a 22 2984 3079 3155 N
+ L AA F b n/a 22 2981 3116 3135 N
+ L AA F e n/a 22 2981 3116 3136 N
+ L AA F i n/a 22 2981 3116 3135 N
+ L AA F s n/a 22 2981 3116 3135 N
+ L AA G b n/a 22 2981 3106 3125 N
+ L AA G e n/a 22 2981 3106 3127 N
+ L AA G i n/a 22 2981 3106 3125 N
+ L AA G s n/a 22 2981 3106 3125 N
+ L AA HH b n/a 22 2981 3111 3132 N
+ L AA HH e n/a 22 2981 3111 3132 N
+ L AA HH i n/a 22 2981 3111 3132 N
+ L AA HH s n/a 22 2981 3111 3132 N
+ L AA IH b n/a 22 2984 3068 3190 N
+ L AA IH e n/a 22 2984 3091 3183 N
+ L AA IH i n/a 22 2986 3092 3184 N
+ L AA IH s n/a 22 2984 3091 3183 N
+ L AA IY b n/a 22 2984 3079 3148 N
+ L AA IY e n/a 22 2984 3079 3148 N
+ L AA IY i n/a 22 2987 3079 3146 N
+ L AA IY s n/a 22 2984 3079 3148 N
+ L AA JH b n/a 22 2981 3106 3125 N
+ L AA JH e n/a 22 2981 3106 3127 N
+ L AA JH s n/a 22 2981 3106 3125 N
+ L AA K b n/a 22 2981 3114 3139 N
+ L AA K e n/a 22 2981 3114 3139 N
+ L AA K i n/a 22 2981 3114 3139 N
+ L AA K s n/a 22 2981 3114 3139 N
+ L AA L e n/a 22 2985 3124 3143 N
+ L AA L i n/a 22 2987 3124 3143 N
+ L AA L s n/a 22 2985 3124 3143 N
+ L AA M b n/a 22 2981 3108 3133 N
+ L AA M e n/a 22 2981 3108 3133 N
+ L AA M i n/a 22 2981 3108 3133 N
+ L AA M s n/a 22 2981 3108 3133 N
+ L AA N e n/a 22 2981 3108 3134 N
+ L AA N i n/a 22 2981 3108 3134 N
+ L AA N s n/a 22 2981 3108 3134 N
+ L AA NG e n/a 22 2981 3108 3133 N
+ L AA NG s n/a 22 2981 3108 3133 N
+ L AA OW b n/a 22 2984 3070 3163 N
+ L AA OW e n/a 22 2984 3090 3162 N
+ L AA OW i n/a 22 2987 3077 3163 N
+ L AA OW s n/a 22 2984 3090 3163 N
+ L AA OY b n/a 22 2984 3074 3167 N
+ L AA OY e n/a 22 2984 3090 3173 N
+ L AA OY i n/a 22 2987 3074 3167 N
+ L AA OY s n/a 22 2984 3090 3167 N
+ L AA P e n/a 22 2981 3114 3140 N
+ L AA P i n/a 22 2981 3114 3140 N
+ L AA P s n/a 22 2981 3114 3140 N
+ L AA R e n/a 22 2984 3109 3144 N
+ L AA R i n/a 22 2987 3109 3144 N
+ L AA R s n/a 22 2984 3109 3144 N
+ L AA S b n/a 22 2981 3116 3136 N
+ L AA S e n/a 22 2981 3116 3136 N
+ L AA S i n/a 22 2981 3116 3136 N
+ L AA S s n/a 22 2981 3116 3136 N
+ L AA SH e n/a 22 2981 3116 3137 N
+ L AA SH i n/a 22 2981 3116 3137 N
+ L AA SH s n/a 22 2981 3116 3137 N
+ L AA SIL e n/a 22 2981 3117 3142 N
+ L AA SIL s n/a 22 2981 3117 3142 N
+ L AA T b n/a 22 2981 3114 3138 N
+ L AA T e n/a 22 2981 3114 3138 N
+ L AA T i n/a 22 2981 3114 3138 N
+ L AA T s n/a 22 2981 3114 3138 N
+ L AA TH e n/a 22 2981 3116 3136 N
+ L AA TH i n/a 22 2981 3116 3135 N
+ L AA TH s n/a 22 2981 3116 3135 N
+ L AA UH b n/a 22 2984 3070 3189 N
+ L AA UH e n/a 22 2984 3091 3189 N
+ L AA UH i n/a 22 2986 3092 3189 N
+ L AA UH s n/a 22 2984 3091 3189 N
+ L AA UW b n/a 22 2984 3070 3192 N
+ L AA UW e n/a 22 2984 3091 3192 N
+ L AA UW i n/a 22 2987 3092 3192 N
+ L AA UW s n/a 22 2984 3091 3192 N
+ L AA V e n/a 22 2981 3107 3130 N
+ L AA V i n/a 22 2981 3107 3130 N
+ L AA V s n/a 22 2981 3107 3130 N
+ L AA W b n/a 22 2985 3124 3143 N
+ L AA W e n/a 22 2985 3124 3143 N
+ L AA W i n/a 22 2985 3124 3143 N
+ L AA W s n/a 22 2985 3124 3143 N
+ L AA Y b n/a 22 2984 3084 3150 N
+ L AA Y e n/a 22 2984 3084 3150 N
+ L AA Y i n/a 22 2987 3084 3150 N
+ L AA Y s n/a 22 2984 3084 3150 N
+ L AA Z e n/a 22 2981 3123 3131 N
+ L AA Z i n/a 22 2981 3123 3131 N
+ L AA Z s n/a 22 2981 3123 3131 N
+ L AA ZH e n/a 22 2981 3106 3130 N
+ L AA ZH s n/a 22 2981 3106 3130 N
+ L AE AA b n/a 22 2990 3071 3168 N
+ L AE AA e n/a 22 2990 3090 3162 N
+ L AE AA i n/a 22 2990 3074 3168 N
+ L AE AA s n/a 22 2990 3090 3168 N
+ L AE AE b n/a 22 2990 3066 3174 N
+ L AE AE e n/a 22 2990 3094 3180 N
+ L AE AE i n/a 22 2990 3066 3174 N
+ L AE AE s n/a 22 2990 3094 3174 N
+ L AE AH b n/a 22 2990 3066 3172 N
+ L AE AH e n/a 22 2990 3090 3161 N
+ L AE AH i n/a 22 2990 3093 3158 N
+ L AE AH s n/a 22 2990 3090 3172 N
+ L AE AO b n/a 22 2990 3071 3167 N
+ L AE AO e n/a 22 2990 3090 3162 N
+ L AE AO i n/a 22 2990 3074 3167 N
+ L AE AO s n/a 22 2990 3090 3167 N
+ L AE AW b n/a 22 2990 3066 3174 N
+ L AE AW e n/a 22 2990 3094 3180 N
+ L AE AW i n/a 22 2990 3066 3174 N
+ L AE AW s n/a 22 2990 3094 3174 N
+ L AE AY b n/a 22 2990 3074 3171 N
+ L AE AY e n/a 22 2990 3090 3173 N
+ L AE AY i n/a 22 2990 3074 3171 N
+ L AE AY s n/a 22 2990 3090 3171 N
+ L AE B e n/a 22 2995 3097 3128 N
+ L AE B i n/a 22 2995 3097 3126 N
+ L AE B s n/a 22 2995 3097 3126 N
+ L AE CH e n/a 22 2995 3102 3138 N
+ L AE CH i n/a 22 2995 3102 3138 N
+ L AE CH s n/a 22 2995 3102 3138 N
+ L AE D e n/a 22 2995 3097 3127 N
+ L AE D i n/a 22 2995 3097 3126 N
+ L AE D s n/a 22 2995 3097 3126 N
+ L AE DH e n/a 22 2995 3097 3129 N
+ L AE DH i n/a 22 2995 3097 3126 N
+ L AE DH s n/a 22 2995 3097 3126 N
+ L AE EH b n/a 22 2990 3066 3178 N
+ L AE EH e n/a 22 2990 3094 3180 N
+ L AE EH i n/a 22 2990 3066 3178 N
+ L AE EH s n/a 22 2990 3094 3178 N
+ L AE ER b n/a 22 2990 3070 3188 N
+ L AE ER e n/a 22 2990 3090 3187 N
+ L AE ER i n/a 22 2990 3093 3187 N
+ L AE ER s n/a 22 2990 3090 3187 N
+ L AE EY b n/a 22 2990 3067 3155 N
+ L AE EY e n/a 22 2990 3079 3155 N
+ L AE EY i n/a 22 2990 3067 3155 N
+ L AE EY s n/a 22 2990 3079 3155 N
+ L AE F b n/a 22 2992 3101 3135 N
+ L AE F e n/a 22 2992 3101 3136 N
+ L AE F i n/a 22 2992 3100 3135 N
+ L AE F s n/a 22 2992 3101 3135 N
+ L AE G b n/a 22 2995 3097 3126 N
+ L AE G e n/a 22 2995 3097 3127 N
+ L AE G i n/a 22 2995 3097 3126 N
+ L AE G s n/a 22 2995 3097 3126 N
+ L AE HH b n/a 22 2995 3101 3132 N
+ L AE HH e n/a 22 2995 3101 3132 N
+ L AE HH i n/a 22 2995 3101 3132 N
+ L AE HH s n/a 22 2995 3101 3132 N
+ L AE IH b n/a 22 2990 3068 3190 N
+ L AE IH e n/a 22 2990 3094 3183 N
+ L AE IH i n/a 22 2990 3093 3184 N
+ L AE IH s n/a 22 2990 3094 3183 N
+ L AE IY b n/a 22 2990 3079 3148 N
+ L AE IY e n/a 22 2990 3079 3148 N
+ L AE IY i n/a 22 2990 3079 3146 N
+ L AE IY s n/a 22 2990 3079 3148 N
+ L AE JH b n/a 22 2995 3097 3126 N
+ L AE JH e n/a 22 2995 3097 3127 N
+ L AE JH i n/a 22 2995 3097 3126 N
+ L AE JH s n/a 22 2995 3097 3126 N
+ L AE K b n/a 22 2995 3102 3139 N
+ L AE K e n/a 22 2995 3102 3139 N
+ L AE K i n/a 22 2995 3102 3139 N
+ L AE K s n/a 22 2995 3102 3139 N
+ L AE L e n/a 22 2995 3099 3143 N
+ L AE L i n/a 22 2995 3099 3143 N
+ L AE L s n/a 22 2995 3099 3143 N
+ L AE M b n/a 22 2995 3097 3133 N
+ L AE M e n/a 22 2995 3097 3133 N
+ L AE M i n/a 22 2995 3097 3133 N
+ L AE M s n/a 22 2995 3097 3133 N
+ L AE N e n/a 22 2995 3097 3134 N
+ L AE N i n/a 22 2995 3097 3134 N
+ L AE N s n/a 22 2995 3097 3134 N
+ L AE NG e n/a 22 2995 3097 3133 N
+ L AE NG s n/a 22 2995 3097 3133 N
+ L AE OW b n/a 22 2990 3070 3163 N
+ L AE OW e n/a 22 2990 3090 3162 N
+ L AE OW i n/a 22 2990 3077 3163 N
+ L AE OW s n/a 22 2990 3090 3163 N
+ L AE OY b n/a 22 2990 3074 3167 N
+ L AE OY e n/a 22 2990 3090 3173 N
+ L AE OY i n/a 22 2990 3074 3167 N
+ L AE OY s n/a 22 2990 3090 3167 N
+ L AE P e n/a 22 2995 3102 3140 N
+ L AE P i n/a 22 2995 3102 3140 N
+ L AE P s n/a 22 2995 3102 3140 N
+ L AE R e n/a 22 2995 3099 3144 N
+ L AE R i n/a 22 2995 3099 3144 N
+ L AE R s n/a 22 2995 3099 3144 N
+ L AE S b n/a 22 2995 3101 3136 N
+ L AE S e n/a 22 2995 3101 3136 N
+ L AE S i n/a 22 2995 3101 3136 N
+ L AE S s n/a 22 2995 3101 3136 N
+ L AE SH e n/a 22 2995 3101 3137 N
+ L AE SH s n/a 22 2995 3101 3137 N
+ L AE SIL e n/a 22 2993 3118 3142 N
+ L AE SIL s n/a 22 2993 3118 3142 N
+ L AE T b n/a 22 2995 3102 3138 N
+ L AE T e n/a 22 2995 3102 3138 N
+ L AE T i n/a 22 2995 3102 3138 N
+ L AE T s n/a 22 2995 3102 3138 N
+ L AE TH e n/a 22 2995 3101 3136 N
+ L AE TH i n/a 22 2995 3101 3135 N
+ L AE TH s n/a 22 2995 3101 3135 N
+ L AE UH b n/a 22 2990 3070 3189 N
+ L AE UH e n/a 22 2990 3094 3189 N
+ L AE UH i n/a 22 2990 3093 3189 N
+ L AE UH s n/a 22 2990 3094 3189 N
+ L AE UW b n/a 22 2990 3070 3192 N
+ L AE UW e n/a 22 2990 3094 3192 N
+ L AE UW i n/a 22 2989 3093 3192 N
+ L AE UW s n/a 22 2990 3094 3192 N
+ L AE V e n/a 22 2992 3097 3130 N
+ L AE V i n/a 22 2992 3097 3130 N
+ L AE V s n/a 22 2992 3097 3130 N
+ L AE W b n/a 22 2995 3099 3143 N
+ L AE W e n/a 22 2995 3099 3143 N
+ L AE W i n/a 22 2995 3099 3143 N
+ L AE W s n/a 22 2995 3099 3143 N
+ L AE Y b n/a 22 2996 3084 3150 N
+ L AE Y e n/a 22 2996 3084 3150 N
+ L AE Y i n/a 22 2996 3084 3150 N
+ L AE Y s n/a 22 2996 3084 3150 N
+ L AE Z e n/a 22 2995 3097 3131 N
+ L AE Z i n/a 22 2995 3097 3131 N
+ L AE Z s n/a 22 2995 3097 3131 N
+ L AE ZH e n/a 22 2995 3097 3130 N
+ L AE ZH i n/a 22 2995 3097 3130 N
+ L AE ZH s n/a 22 2995 3097 3130 N
+ L AH AA b n/a 22 3011 3073 3168 N
+ L AH AA e n/a 22 2988 3090 3162 N
+ L AH AA i n/a 22 3011 3073 3168 N
+ L AH AA s n/a 22 3011 3088 3168 N
+ L AH AE b n/a 22 3011 3076 3174 N
+ L AH AE e n/a 22 2988 3091 3180 N
+ L AH AE i n/a 22 3011 3076 3174 N
+ L AH AE s n/a 22 3011 3088 3174 N
+ L AH AH b n/a 22 3010 3075 3172 N
+ L AH AH e n/a 22 2988 3089 3161 N
+ L AH AH i n/a 22 3012 3086 3160 N
+ L AH AH s n/a 22 3012 3086 3172 N
+ L AH AO b n/a 22 3011 3073 3167 N
+ L AH AO e n/a 22 2988 3090 3162 N
+ L AH AO i n/a 22 3011 3073 3167 N
+ L AH AO s n/a 22 3011 3088 3167 N
+ L AH AW b n/a 22 3011 3076 3174 N
+ L AH AW e n/a 22 2988 3091 3180 N
+ L AH AW i n/a 22 3011 3076 3174 N
+ L AH AW s n/a 22 3011 3088 3174 N
+ L AH AY b n/a 22 3011 3075 3171 N
+ L AH AY e n/a 22 2988 3090 3173 N
+ L AH AY i n/a 22 3011 3075 3171 N
+ L AH AY s n/a 22 3011 3088 3171 N
+ L AH B e n/a 22 2974 3104 3128 N
+ L AH B i n/a 22 2976 3105 3125 N
+ L AH B s n/a 22 2976 3104 3125 N
+ L AH CH e n/a 22 2973 3113 3138 N
+ L AH CH i n/a 22 2970 3112 3138 N
+ L AH CH s n/a 22 2970 3113 3138 N
+ L AH D e n/a 22 2973 3104 3127 N
+ L AH D i n/a 22 2976 3105 3125 N
+ L AH D s n/a 22 2976 3104 3125 N
+ L AH DH e n/a 22 2971 3105 3129 N
+ L AH DH i n/a 22 2976 3105 3125 N
+ L AH DH s n/a 22 2976 3105 3125 N
+ L AH EH b n/a 22 3010 3076 3178 N
+ L AH EH e n/a 22 2988 3091 3180 N
+ L AH EH i n/a 22 3012 3076 3178 N
+ L AH EH s n/a 22 3012 3088 3178 N
+ L AH ER b n/a 22 3010 3072 3188 N
+ L AH ER e n/a 22 2988 3089 3186 N
+ L AH ER i n/a 22 3012 3087 3188 N
+ L AH ER s n/a 22 3012 3087 3188 N
+ L AH EY b n/a 22 3010 3067 3155 N
+ L AH EY e n/a 22 2988 3080 3155 N
+ L AH EY i n/a 22 3012 3067 3155 N
+ L AH EY s n/a 22 3012 3080 3155 N
+ L AH F b n/a 22 2970 3115 3135 N
+ L AH F e n/a 22 2973 3115 3136 N
+ L AH F i n/a 22 2970 3115 3135 N
+ L AH F s n/a 22 2970 3115 3135 N
+ L AH G b n/a 22 2976 3104 3125 N
+ L AH G e n/a 22 2974 3104 3127 N
+ L AH G i n/a 22 2976 3105 3125 N
+ L AH G s n/a 22 2976 3104 3125 N
+ L AH HH b n/a 22 2970 3111 3132 N
+ L AH HH e n/a 22 2971 3111 3132 N
+ L AH HH i n/a 22 2970 3111 3132 N
+ L AH HH s n/a 22 2970 3111 3132 N
+ L AH IH b n/a 22 3010 3068 3191 N
+ L AH IH e n/a 22 2988 3091 3183 N
+ L AH IH i n/a 22 3007 3086 3185 N
+ L AH IH s n/a 22 3007 3086 3185 N
+ L AH IY b n/a 22 3010 3082 3148 N
+ L AH IY e n/a 22 2988 3080 3148 N
+ L AH IY i n/a 22 3007 3080 3147 N
+ L AH IY s n/a 22 3007 3080 3148 N
+ L AH JH b n/a 22 2975 3104 3125 N
+ L AH JH e n/a 22 2973 3104 3127 N
+ L AH JH i n/a 22 2975 3105 3125 N
+ L AH JH s n/a 22 2975 3104 3125 N
+ L AH K b n/a 22 2974 3114 3139 N
+ L AH K e n/a 22 2974 3114 3139 N
+ L AH K i n/a 22 2974 3114 3139 N
+ L AH K s n/a 22 2974 3114 3139 N
+ L AH L e n/a 22 2972 3124 3143 N
+ L AH L i n/a 22 2976 3124 3143 N
+ L AH L s n/a 22 2976 3124 3143 N
+ L AH M b n/a 22 2977 3108 3133 N
+ L AH M e n/a 22 2971 3108 3133 N
+ L AH M i n/a 22 2977 3108 3133 N
+ L AH M s n/a 22 2977 3108 3133 N
+ L AH N e n/a 22 2971 3108 3134 N
+ L AH N i n/a 22 2977 3108 3134 N
+ L AH N s n/a 22 2977 3108 3134 N
+ L AH NG e n/a 22 2971 3108 3133 N
+ L AH NG s n/a 22 2977 3108 3133 N
+ L AH OW b n/a 22 3010 3072 3165 N
+ L AH OW e n/a 22 2988 3089 3162 N
+ L AH OW i n/a 22 3011 3072 3165 N
+ L AH OW s n/a 22 3010 3088 3165 N
+ L AH OY b n/a 22 3011 3075 3167 N
+ L AH OY e n/a 22 2988 3090 3173 N
+ L AH OY i n/a 22 3011 3075 3167 N
+ L AH OY s n/a 22 3011 3088 3167 N
+ L AH P e n/a 22 2974 3114 3140 N
+ L AH P i n/a 22 2970 3112 3140 N
+ L AH P s n/a 22 2970 3114 3140 N
+ L AH R e n/a 22 2971 3109 3144 N
+ L AH R i n/a 22 2976 3109 3144 N
+ L AH R s n/a 22 2976 3109 3144 N
+ L AH S b n/a 22 2970 3115 3136 N
+ L AH S e n/a 22 2973 3115 3136 N
+ L AH S i n/a 22 2970 3115 3136 N
+ L AH S s n/a 22 2970 3115 3136 N
+ L AH SH e n/a 22 2973 3115 3137 N
+ L AH SH i n/a 22 2970 3115 3137 N
+ L AH SH s n/a 22 2970 3115 3137 N
+ L AH SIL e n/a 22 2975 3118 3141 N
+ L AH SIL s n/a 22 2976 3118 3141 N
+ L AH T b n/a 22 2970 3113 3138 N
+ L AH T e n/a 22 2973 3113 3138 N
+ L AH T i n/a 22 2970 3112 3138 N
+ L AH T s n/a 22 2970 3113 3138 N
+ L AH TH e n/a 22 2973 3115 3136 N
+ L AH TH i n/a 22 2970 3115 3135 N
+ L AH TH s n/a 22 2970 3115 3135 N
+ L AH UH b n/a 22 3010 3072 3189 N
+ L AH UH e n/a 22 2988 3091 3189 N
+ L AH UH i n/a 22 3007 3088 3189 N
+ L AH UH s n/a 22 3007 3088 3189 N
+ L AH UW b n/a 22 3010 3072 3192 N
+ L AH UW e n/a 22 2988 3091 3192 N
+ L AH UW i n/a 22 3007 3088 3192 N
+ L AH UW s n/a 22 3007 3088 3192 N
+ L AH V e n/a 22 2971 3105 3130 N
+ L AH V i n/a 22 2976 3105 3130 N
+ L AH V s n/a 22 2976 3105 3130 N
+ L AH W b n/a 22 2976 3124 3143 N
+ L AH W e n/a 22 2972 3124 3143 N
+ L AH W i n/a 22 2976 3124 3143 N
+ L AH W s n/a 22 2976 3124 3143 N
+ L AH Y b n/a 22 2977 3083 3149 N
+ L AH Y e n/a 22 2973 3083 3149 N
+ L AH Y i n/a 22 2977 3083 3149 N
+ L AH Y s n/a 22 2977 3083 3149 N
+ L AH Z e n/a 22 2971 3123 3131 N
+ L AH Z i n/a 22 2976 3123 3131 N
+ L AH Z s n/a 22 2976 3123 3131 N
+ L AH ZH e n/a 22 2973 3105 3130 N
+ L AH ZH s n/a 22 2975 3105 3130 N
+ L AO AA b n/a 22 2984 3071 3168 N
+ L AO AA e n/a 22 2984 3090 3162 N
+ L AO AA i n/a 22 2987 3074 3168 N
+ L AO AA s n/a 22 2984 3090 3168 N
+ L AO AE b n/a 22 2984 3066 3174 N
+ L AO AE e n/a 22 2984 3091 3180 N
+ L AO AE i n/a 22 2987 3066 3174 N
+ L AO AE s n/a 22 2984 3091 3174 N
+ L AO AH b n/a 22 2984 3066 3172 N
+ L AO AH e n/a 22 2984 3089 3161 N
+ L AO AH i n/a 22 2986 3092 3159 N
+ L AO AH s n/a 22 2984 3089 3172 N
+ L AO AO b n/a 22 2984 3071 3167 N
+ L AO AO e n/a 22 2984 3090 3162 N
+ L AO AO i n/a 22 2987 3074 3167 N
+ L AO AO s n/a 22 2984 3090 3167 N
+ L AO AW b n/a 22 2984 3066 3174 N
+ L AO AW e n/a 22 2984 3091 3180 N
+ L AO AW i n/a 22 2987 3066 3174 N
+ L AO AW s n/a 22 2984 3091 3174 N
+ L AO AY b n/a 22 2984 3074 3171 N
+ L AO AY e n/a 22 2984 3090 3173 N
+ L AO AY i n/a 22 2987 3074 3171 N
+ L AO AY s n/a 22 2984 3090 3171 N
+ L AO B e n/a 22 2979 3106 3128 N
+ L AO B i n/a 22 2979 3106 3125 N
+ L AO B s n/a 22 2979 3106 3125 N
+ L AO CH e n/a 22 2979 3114 3138 N
+ L AO CH i n/a 22 2979 3114 3138 N
+ L AO CH s n/a 22 2979 3114 3138 N
+ L AO D e n/a 22 2979 3106 3127 N
+ L AO D i n/a 22 2979 3106 3125 N
+ L AO D s n/a 22 2979 3106 3125 N
+ L AO DH e n/a 22 2979 3106 3129 N
+ L AO DH i n/a 22 2979 3106 3125 N
+ L AO DH s n/a 22 2979 3106 3125 N
+ L AO EH b n/a 22 2984 3066 3178 N
+ L AO EH e n/a 22 2984 3091 3180 N
+ L AO EH i n/a 22 2986 3066 3178 N
+ L AO EH s n/a 22 2984 3091 3178 N
+ L AO ER b n/a 22 2984 3070 3186 N
+ L AO ER e n/a 22 2984 3089 3186 N
+ L AO ER i n/a 22 2986 3092 3186 N
+ L AO ER s n/a 22 2984 3089 3186 N
+ L AO EY b n/a 22 2984 3067 3155 N
+ L AO EY e n/a 22 2984 3079 3155 N
+ L AO EY i n/a 22 2987 3067 3155 N
+ L AO EY s n/a 22 2984 3079 3155 N
+ L AO F b n/a 22 2979 3116 3135 N
+ L AO F e n/a 22 2979 3116 3136 N
+ L AO F i n/a 22 2979 3116 3135 N
+ L AO F s n/a 22 2979 3116 3135 N
+ L AO G b n/a 22 2979 3106 3125 N
+ L AO G e n/a 22 2979 3106 3127 N
+ L AO G i n/a 22 2979 3106 3125 N
+ L AO G s n/a 22 2979 3106 3125 N
+ L AO HH b n/a 22 2979 3111 3132 N
+ L AO HH e n/a 22 2979 3111 3132 N
+ L AO HH i n/a 22 2979 3111 3132 N
+ L AO HH s n/a 22 2979 3111 3132 N
+ L AO IH b n/a 22 2984 3068 3190 N
+ L AO IH e n/a 22 2984 3091 3183 N
+ L AO IH i n/a 22 2986 3092 3184 N
+ L AO IH s n/a 22 2984 3091 3183 N
+ L AO IY b n/a 22 2984 3079 3148 N
+ L AO IY e n/a 22 2984 3079 3148 N
+ L AO IY i n/a 22 2987 3079 3146 N
+ L AO IY s n/a 22 2984 3079 3148 N
+ L AO JH b n/a 22 2979 3106 3125 N
+ L AO JH e n/a 22 2979 3106 3127 N
+ L AO JH s n/a 22 2979 3106 3125 N
+ L AO K b n/a 22 2979 3114 3139 N
+ L AO K e n/a 22 2979 3114 3139 N
+ L AO K i n/a 22 2979 3114 3139 N
+ L AO K s n/a 22 2979 3114 3139 N
+ L AO L e n/a 22 2985 3124 3143 N
+ L AO L s n/a 22 2985 3124 3143 N
+ L AO M b n/a 22 2980 3108 3133 N
+ L AO M e n/a 22 2980 3108 3133 N
+ L AO M i n/a 22 2980 3108 3133 N
+ L AO M s n/a 22 2980 3108 3133 N
+ L AO N e n/a 22 2980 3108 3134 N
+ L AO N i n/a 22 2980 3108 3134 N
+ L AO N s n/a 22 2980 3108 3134 N
+ L AO NG e n/a 22 2980 3108 3133 N
+ L AO NG s n/a 22 2980 3108 3133 N
+ L AO OW b n/a 22 2984 3070 3163 N
+ L AO OW e n/a 22 2984 3089 3162 N
+ L AO OW i n/a 22 2987 3077 3163 N
+ L AO OW s n/a 22 2984 3089 3163 N
+ L AO OY b n/a 22 2984 3074 3167 N
+ L AO OY e n/a 22 2984 3090 3173 N
+ L AO OY s n/a 22 2984 3090 3167 N
+ L AO P e n/a 22 2979 3114 3140 N
+ L AO P i n/a 22 2979 3114 3140 N
+ L AO P s n/a 22 2979 3114 3140 N
+ L AO R e n/a 22 2984 3109 3144 N
+ L AO R i n/a 22 2986 3109 3144 N
+ L AO R s n/a 22 2984 3109 3144 N
+ L AO S b n/a 22 2979 3116 3136 N
+ L AO S e n/a 22 2979 3116 3136 N
+ L AO S i n/a 22 2979 3116 3136 N
+ L AO S s n/a 22 2979 3116 3136 N
+ L AO SH e n/a 22 2979 3116 3137 N
+ L AO SH i n/a 22 2979 3116 3137 N
+ L AO SH s n/a 22 2979 3116 3137 N
+ L AO SIL e n/a 22 2981 3117 3142 N
+ L AO SIL s n/a 22 2981 3117 3142 N
+ L AO T b n/a 22 2979 3114 3138 N
+ L AO T e n/a 22 2979 3114 3138 N
+ L AO T i n/a 22 2979 3114 3138 N
+ L AO T s n/a 22 2979 3114 3138 N
+ L AO TH e n/a 22 2979 3116 3136 N
+ L AO TH i n/a 22 2979 3116 3135 N
+ L AO TH s n/a 22 2979 3116 3135 N
+ L AO UH b n/a 22 2984 3070 3189 N
+ L AO UH e n/a 22 2984 3091 3189 N
+ L AO UH s n/a 22 2984 3091 3189 N
+ L AO UW b n/a 22 2984 3070 3192 N
+ L AO UW e n/a 22 2984 3091 3192 N
+ L AO UW i n/a 22 2987 3092 3192 N
+ L AO UW s n/a 22 2984 3091 3192 N
+ L AO V e n/a 22 2979 3107 3130 N
+ L AO V i n/a 22 2979 3107 3130 N
+ L AO V s n/a 22 2979 3107 3130 N
+ L AO W b n/a 22 2985 3124 3143 N
+ L AO W e n/a 22 2985 3124 3143 N
+ L AO W i n/a 22 2985 3124 3143 N
+ L AO W s n/a 22 2985 3124 3143 N
+ L AO Y b n/a 22 2984 3084 3150 N
+ L AO Y e n/a 22 2984 3084 3150 N
+ L AO Y i n/a 22 2986 3084 3150 N
+ L AO Y s n/a 22 2984 3084 3150 N
+ L AO Z e n/a 22 2981 3123 3131 N
+ L AO Z i n/a 22 2981 3123 3131 N
+ L AO Z s n/a 22 2981 3123 3131 N
+ L AO ZH e n/a 22 2981 3106 3130 N
+ L AO ZH s n/a 22 2981 3106 3130 N
+ L AW AA b n/a 22 2984 3071 3168 N
+ L AW AA e n/a 22 2984 3090 3162 N
+ L AW AA i n/a 22 2987 3074 3168 N
+ L AW AA s n/a 22 2984 3090 3168 N
+ L AW AE b n/a 22 2984 3066 3174 N
+ L AW AE e n/a 22 2984 3091 3180 N
+ L AW AE s n/a 22 2984 3091 3174 N
+ L AW AH b n/a 22 2984 3066 3172 N
+ L AW AH e n/a 22 2984 3090 3161 N
+ L AW AH i n/a 22 2986 3092 3158 N
+ L AW AH s n/a 22 2984 3090 3172 N
+ L AW AO b n/a 22 2984 3071 3167 N
+ L AW AO e n/a 22 2984 3090 3162 N
+ L AW AO s n/a 22 2984 3090 3167 N
+ L AW AW b n/a 22 2984 3066 3174 N
+ L AW AW e n/a 22 2984 3091 3180 N
+ L AW AW s n/a 22 2984 3091 3174 N
+ L AW AY b n/a 22 2984 3074 3170 N
+ L AW AY e n/a 22 2984 3090 3173 N
+ L AW AY s n/a 22 2984 3090 3170 N
+ L AW B e n/a 22 2981 3103 3128 N
+ L AW B s n/a 22 2981 3103 3125 N
+ L AW CH e n/a 22 2981 3114 3138 N
+ L AW CH s n/a 22 2981 3114 3138 N
+ L AW D e n/a 22 2981 3103 3127 N
+ L AW D i n/a 22 2981 3103 3125 N
+ L AW D s n/a 22 2981 3103 3125 N
+ L AW DH e n/a 22 2981 3105 3129 N
+ L AW DH s n/a 22 2981 3105 3125 N
+ L AW EH b n/a 22 2984 3066 3179 N
+ L AW EH e n/a 22 2984 3091 3180 N
+ L AW EH s n/a 22 2984 3091 3179 N
+ L AW ER b n/a 22 2984 3070 3188 N
+ L AW ER e n/a 22 2984 3090 3187 N
+ L AW ER i n/a 22 2987 3092 3187 N
+ L AW ER s n/a 22 2984 3090 3187 N
+ L AW EY b n/a 22 2984 3067 3155 N
+ L AW EY e n/a 22 2984 3079 3155 N
+ L AW EY s n/a 22 2984 3079 3155 N
+ L AW F b n/a 22 2981 3116 3135 N
+ L AW F e n/a 22 2981 3116 3136 N
+ L AW F i n/a 22 2981 3116 3135 N
+ L AW F s n/a 22 2981 3116 3135 N
+ L AW G b n/a 22 2981 3103 3125 N
+ L AW G e n/a 22 2981 3103 3127 N
+ L AW G s n/a 22 2981 3103 3125 N
+ L AW HH b n/a 22 2981 3111 3132 N
+ L AW HH e n/a 22 2981 3111 3132 N
+ L AW HH i n/a 22 2981 3111 3132 N
+ L AW HH s n/a 22 2981 3111 3132 N
+ L AW IH b n/a 22 2984 3068 3190 N
+ L AW IH e n/a 22 2984 3091 3183 N
+ L AW IH i n/a 22 2986 3092 3185 N
+ L AW IH s n/a 22 2984 3091 3185 N
+ L AW IY b n/a 22 2984 3079 3148 N
+ L AW IY e n/a 22 2984 3079 3148 N
+ L AW IY i n/a 22 2987 3079 3146 N
+ L AW IY s n/a 22 2984 3079 3148 N
+ L AW JH b n/a 22 2981 3103 3125 N
+ L AW JH e n/a 22 2981 3103 3127 N
+ L AW JH s n/a 22 2981 3103 3125 N
+ L AW K b n/a 22 2981 3114 3139 N
+ L AW K e n/a 22 2981 3114 3139 N
+ L AW K i n/a 22 2981 3114 3139 N
+ L AW K s n/a 22 2981 3114 3139 N
+ L AW L e n/a 22 2985 3124 3143 N
+ L AW L s n/a 22 2985 3124 3143 N
+ L AW M b n/a 22 2981 3105 3133 N
+ L AW M e n/a 22 2981 3105 3133 N
+ L AW M i n/a 22 2981 3105 3133 N
+ L AW M s n/a 22 2981 3105 3133 N
+ L AW N e n/a 22 2981 3105 3134 N
+ L AW N i n/a 22 2981 3105 3134 N
+ L AW N s n/a 22 2981 3105 3134 N
+ L AW NG e n/a 22 2981 3105 3133 N
+ L AW NG s n/a 22 2981 3105 3133 N
+ L AW OW b n/a 22 2984 3070 3163 N
+ L AW OW e n/a 22 2984 3090 3162 N
+ L AW OW i n/a 22 2987 3077 3163 N
+ L AW OW s n/a 22 2984 3090 3163 N
+ L AW OY b n/a 22 2984 3074 3167 N
+ L AW OY e n/a 22 2984 3090 3173 N
+ L AW OY s n/a 22 2984 3090 3167 N
+ L AW P e n/a 22 2981 3114 3140 N
+ L AW P s n/a 22 2981 3114 3140 N
+ L AW R e n/a 22 2984 3105 3144 N
+ L AW R s n/a 22 2984 3105 3144 N
+ L AW S b n/a 22 2981 3116 3136 N
+ L AW S e n/a 22 2981 3116 3136 N
+ L AW S i n/a 22 2981 3116 3136 N
+ L AW S s n/a 22 2981 3116 3136 N
+ L AW SH e n/a 22 2981 3116 3137 N
+ L AW SH s n/a 22 2981 3116 3137 N
+ L AW SIL e n/a 22 2981 3117 3142 N
+ L AW SIL s n/a 22 2981 3117 3142 N
+ L AW T b n/a 22 2981 3114 3138 N
+ L AW T e n/a 22 2981 3114 3138 N
+ L AW T i n/a 22 2981 3114 3138 N
+ L AW T s n/a 22 2981 3114 3138 N
+ L AW TH e n/a 22 2981 3116 3136 N
+ L AW TH i n/a 22 2981 3116 3135 N
+ L AW TH s n/a 22 2981 3116 3135 N
+ L AW UH b n/a 22 2984 3070 3189 N
+ L AW UH e n/a 22 2984 3091 3189 N
+ L AW UH s n/a 22 2984 3091 3189 N
+ L AW UW b n/a 22 2984 3070 3192 N
+ L AW UW e n/a 22 2984 3091 3192 N
+ L AW UW s n/a 22 2984 3091 3192 N
+ L AW V e n/a 22 2981 3105 3130 N
+ L AW V s n/a 22 2981 3105 3130 N
+ L AW W b n/a 22 2985 3124 3143 N
+ L AW W e n/a 22 2985 3124 3143 N
+ L AW W i n/a 22 2985 3124 3143 N
+ L AW W s n/a 22 2985 3124 3143 N
+ L AW Y b n/a 22 2984 3084 3150 N
+ L AW Y e n/a 22 2984 3084 3150 N
+ L AW Y s n/a 22 2984 3084 3150 N
+ L AW Z e n/a 22 2981 3123 3131 N
+ L AW Z i n/a 22 2981 3123 3131 N
+ L AW Z s n/a 22 2981 3123 3131 N
+ L AW ZH e n/a 22 2981 3105 3130 N
+ L AW ZH s n/a 22 2981 3105 3130 N
+ L AY AA b n/a 22 3022 3071 3168 N
+ L AY AA e n/a 22 3017 3090 3162 N
+ L AY AA i n/a 22 3023 3074 3168 N
+ L AY AA s n/a 22 3013 3078 3168 N
+ L AY AE b n/a 22 3022 3066 3174 N
+ L AY AE e n/a 22 3017 3094 3180 N
+ L AY AE i n/a 22 3023 3066 3174 N
+ L AY AE s n/a 22 3013 3078 3174 N
+ L AY AH b n/a 22 3022 3066 3172 N
+ L AY AH e n/a 22 3017 3094 3161 N
+ L AY AH i n/a 22 3023 3078 3160 N
+ L AY AH s n/a 22 3017 3078 3172 N
+ L AY AO b n/a 22 3022 3071 3167 N
+ L AY AO e n/a 22 3017 3090 3162 N
+ L AY AO i n/a 22 3023 3074 3167 N
+ L AY AO s n/a 22 3013 3078 3167 N
+ L AY AW b n/a 22 3022 3066 3174 N
+ L AY AW e n/a 22 3017 3094 3180 N
+ L AY AW s n/a 22 3013 3078 3174 N
+ L AY AY b n/a 22 3022 3074 3170 N
+ L AY AY e n/a 22 3017 3090 3173 N
+ L AY AY i n/a 22 3023 3074 3170 N
+ L AY AY s n/a 22 3013 3090 3170 N
+ L AY B e n/a 22 2997 3097 3128 N
+ L AY B i n/a 22 2999 3097 3126 N
+ L AY B s n/a 22 2997 3097 3126 N
+ L AY CH e n/a 22 2997 3102 3138 N
+ L AY CH s n/a 22 2997 3102 3138 N
+ L AY D e n/a 22 2997 3097 3127 N
+ L AY D i n/a 22 2999 3097 3126 N
+ L AY D s n/a 22 2997 3097 3126 N
+ L AY DH e n/a 22 2997 3097 3129 N
+ L AY DH s n/a 22 2997 3097 3126 N
+ L AY EH b n/a 22 3022 3066 3179 N
+ L AY EH e n/a 22 3017 3094 3180 N
+ L AY EH i n/a 22 3023 3066 3179 N
+ L AY EH s n/a 22 3013 3078 3179 N
+ L AY ER b n/a 22 3022 3070 3188 N
+ L AY ER e n/a 22 3017 3094 3187 N
+ L AY ER i n/a 22 3023 3078 3187 N
+ L AY ER s n/a 22 3017 3078 3187 N
+ L AY EY b n/a 22 3022 3067 3155 N
+ L AY EY e n/a 22 3017 3078 3155 N
+ L AY EY i n/a 22 3023 3067 3155 N
+ L AY EY s n/a 22 3013 3078 3155 N
+ L AY F b n/a 22 2997 3101 3135 N
+ L AY F e n/a 22 2997 3101 3136 N
+ L AY F i n/a 22 2997 3100 3135 N
+ L AY F s n/a 22 2997 3101 3135 N
+ L AY G b n/a 22 2997 3097 3126 N
+ L AY G e n/a 22 2997 3097 3127 N
+ L AY G i n/a 22 2999 3097 3126 N
+ L AY G s n/a 22 2997 3097 3126 N
+ L AY HH b n/a 22 2997 3101 3132 N
+ L AY HH e n/a 22 2997 3101 3132 N
+ L AY HH i n/a 22 2999 3101 3132 N
+ L AY HH s n/a 22 2997 3101 3132 N
+ L AY IH b n/a 22 3022 3069 3190 N
+ L AY IH e n/a 22 3017 3094 3183 N
+ L AY IH i n/a 22 3023 3078 3181 N
+ L AY IH s n/a 22 3017 3078 3181 N
+ L AY IY b n/a 22 3022 3078 3148 N
+ L AY IY e n/a 22 3017 3078 3148 N
+ L AY IY i n/a 22 3023 3078 3147 N
+ L AY IY s n/a 22 3013 3078 3148 N
+ L AY JH b n/a 22 2997 3097 3126 N
+ L AY JH e n/a 22 2997 3097 3127 N
+ L AY JH s n/a 22 2997 3097 3126 N
+ L AY K b n/a 22 2997 3102 3139 N
+ L AY K e n/a 22 2997 3102 3139 N
+ L AY K s n/a 22 2997 3102 3139 N
+ L AY L e n/a 22 2997 3099 3143 N
+ L AY L i n/a 22 2999 3099 3143 N
+ L AY L s n/a 22 2997 3099 3143 N
+ L AY M b n/a 22 2997 3097 3133 N
+ L AY M e n/a 22 2997 3097 3133 N
+ L AY M i n/a 22 2999 3097 3133 N
+ L AY M s n/a 22 2997 3097 3133 N
+ L AY N e n/a 22 2997 3097 3134 N
+ L AY N i n/a 22 2999 3097 3134 N
+ L AY N s n/a 22 2997 3097 3134 N
+ L AY NG e n/a 22 2997 3097 3133 N
+ L AY NG s n/a 22 2997 3097 3133 N
+ L AY OW b n/a 22 3022 3070 3163 N
+ L AY OW e n/a 22 3017 3090 3162 N
+ L AY OW i n/a 22 3023 3077 3163 N
+ L AY OW s n/a 22 3013 3078 3163 N
+ L AY OY b n/a 22 3022 3074 3167 N
+ L AY OY e n/a 22 3017 3090 3173 N
+ L AY OY s n/a 22 3013 3090 3167 N
+ L AY P e n/a 22 2997 3102 3140 N
+ L AY P s n/a 22 2997 3102 3140 N
+ L AY R e n/a 22 2997 3099 3144 N
+ L AY R s n/a 22 2997 3099 3144 N
+ L AY S b n/a 22 2997 3101 3136 N
+ L AY S e n/a 22 2997 3101 3136 N
+ L AY S i n/a 22 2997 3101 3136 N
+ L AY S s n/a 22 2997 3101 3136 N
+ L AY SH e n/a 22 2997 3101 3137 N
+ L AY SH s n/a 22 2997 3101 3137 N
+ L AY SIL e n/a 22 2999 3119 3142 N
+ L AY SIL s n/a 22 2999 3119 3142 N
+ L AY T b n/a 22 2997 3102 3138 N
+ L AY T e n/a 22 2997 3102 3138 N
+ L AY T i n/a 22 2999 3102 3138 N
+ L AY T s n/a 22 2997 3102 3138 N
+ L AY TH e n/a 22 2997 3101 3136 N
+ L AY TH s n/a 22 2997 3101 3135 N
+ L AY UH b n/a 22 3022 3070 3189 N
+ L AY UH e n/a 22 3017 3094 3189 N
+ L AY UH s n/a 22 3013 3078 3189 N
+ L AY UW b n/a 22 3022 3070 3192 N
+ L AY UW e n/a 22 3017 3094 3192 N
+ L AY UW i n/a 22 3023 3078 3192 N
+ L AY UW s n/a 22 3013 3078 3192 N
+ L AY V e n/a 22 2997 3097 3130 N
+ L AY V s n/a 22 2997 3097 3130 N
+ L AY W b n/a 22 2997 3099 3143 N
+ L AY W e n/a 22 2997 3099 3143 N
+ L AY W i n/a 22 2999 3099 3143 N
+ L AY W s n/a 22 2997 3099 3143 N
+ L AY Y b n/a 22 2997 3084 3150 N
+ L AY Y e n/a 22 2997 3084 3150 N
+ L AY Y s n/a 22 2997 3084 3150 N
+ L AY Z e n/a 22 2997 3097 3131 N
+ L AY Z i n/a 22 2999 3097 3131 N
+ L AY Z s n/a 22 2997 3097 3131 N
+ L AY ZH e n/a 22 2997 3097 3130 N
+ L AY ZH s n/a 22 2997 3097 3130 N
+ L B AA b n/a 22 3035 3064 3168 N
+ L B AA i n/a 22 3030 3064 3168 N
+ L B AA s n/a 22 3030 3064 3168 N
+ L B AE b n/a 22 3035 3063 3174 N
+ L B AE i n/a 22 3030 3052 3175 N
+ L B AE s n/a 22 3030 3063 3174 N
+ L B AH b n/a 22 3035 3061 3172 N
+ L B AH i n/a 22 3030 3053 3157 N
+ L B AH s n/a 22 3030 3061 3172 N
+ L B AO b n/a 22 3035 3064 3167 N
+ L B AO i n/a 22 3030 3064 3167 N
+ L B AO s n/a 22 3030 3064 3167 N
+ L B AW b n/a 22 3035 3065 3175 N
+ L B AW i n/a 22 3030 3052 3175 N
+ L B AW s n/a 22 3030 3065 3175 N
+ L B AY b n/a 22 3035 3060 3171 N
+ L B AY i n/a 22 3030 3060 3171 N
+ L B AY s n/a 22 3030 3060 3171 N
+ L B B s n/a 22 3030 3097 3125 N
+ L B CH s n/a 22 3030 3102 3138 N
+ L B D s n/a 22 3030 3097 3125 N
+ L B DH s n/a 22 3030 3097 3125 N
+ L B EH b n/a 22 3035 3054 3178 N
+ L B EH i n/a 22 3030 3052 3178 N
+ L B EH s n/a 22 3030 3061 3178 N
+ L B ER b n/a 22 3035 3065 3188 N
+ L B ER i n/a 22 3030 3065 3188 N
+ L B ER s n/a 22 3030 3065 3188 N
+ L B EY b n/a 22 3035 3054 3155 N
+ L B EY i n/a 22 3030 3052 3154 N
+ L B EY s n/a 22 3030 3060 3155 N
+ L B F b n/a 22 3035 3101 3135 N
+ L B F s n/a 22 3030 3101 3135 N
+ L B G b n/a 22 3035 3097 3125 N
+ L B G s n/a 22 3030 3097 3125 N
+ L B HH b n/a 22 3035 3101 3132 N
+ L B HH s n/a 22 3030 3101 3132 N
+ L B IH b n/a 22 3035 3057 3190 N
+ L B IH i n/a 22 3031 3049 3182 N
+ L B IH s n/a 22 3031 3057 3182 N
+ L B IY b n/a 22 3035 3041 3148 N
+ L B IY i n/a 22 3031 3042 3151 N
+ L B IY s n/a 22 3031 3041 3148 N
+ L B JH b n/a 22 3035 3097 3125 N
+ L B JH s n/a 22 3030 3097 3125 N
+ L B K b n/a 22 3035 3102 3139 N
+ L B K s n/a 22 3030 3102 3139 N
+ L B L s n/a 22 3030 3098 3143 N
+ L B M b n/a 22 3035 3097 3133 N
+ L B M s n/a 22 3030 3097 3133 N
+ L B N s n/a 22 3030 3097 3134 N
+ L B NG s n/a 22 3030 3097 3133 N
+ L B OW b n/a 22 3035 3055 3165 N
+ L B OW i n/a 22 3030 3065 3165 N
+ L B OW s n/a 22 3030 3065 3165 N
+ L B OY b n/a 22 3035 3060 3167 N
+ L B OY i n/a 22 3030 3060 3167 N
+ L B OY s n/a 22 3030 3060 3167 N
+ L B P s n/a 22 3030 3102 3140 N
+ L B R s n/a 22 3030 3099 3144 N
+ L B S b n/a 22 3035 3101 3136 N
+ L B S s n/a 22 3030 3101 3136 N
+ L B SH s n/a 22 3030 3101 3137 N
+ L B SIL s n/a 22 3030 3118 3142 N
+ L B T b n/a 22 3035 3102 3138 N
+ L B T s n/a 22 3030 3102 3138 N
+ L B TH s n/a 22 3030 3101 3135 N
+ L B UH b n/a 22 3035 3055 3189 N
+ L B UH i n/a 22 3031 3057 3189 N
+ L B UH s n/a 22 3031 3055 3189 N
+ L B UW b n/a 22 3035 3057 3192 N
+ L B UW i n/a 22 3031 3057 3192 N
+ L B UW s n/a 22 3031 3057 3192 N
+ L B V s n/a 22 3030 3097 3130 N
+ L B W b n/a 22 3035 3098 3143 N
+ L B W i n/a 22 3030 3098 3143 N
+ L B W s n/a 22 3030 3098 3143 N
+ L B Y b n/a 22 3035 3041 3149 N
+ L B Y i n/a 22 3031 3042 3151 N
+ L B Y s n/a 22 3031 3041 3149 N
+ L B Z s n/a 22 3030 3096 3131 N
+ L B ZH s n/a 22 3030 3096 3130 N
+ L CH AA b n/a 22 3035 3064 3168 N
+ L CH AA i n/a 22 3024 3064 3168 N
+ L CH AA s n/a 22 3030 3064 3168 N
+ L CH AE b n/a 22 3035 3063 3174 N
+ L CH AE i n/a 22 3024 3047 3174 N
+ L CH AE s n/a 22 3030 3063 3174 N
+ L CH AH b n/a 22 3035 3061 3172 N
+ L CH AH i n/a 22 3024 3051 3156 N
+ L CH AH s n/a 22 3030 3061 3172 N
+ L CH AO b n/a 22 3035 3064 3167 N
+ L CH AO s n/a 22 3030 3064 3167 N
+ L CH AW b n/a 22 3035 3065 3174 N
+ L CH AW s n/a 22 3030 3065 3174 N
+ L CH AY b n/a 22 3035 3060 3170 N
+ L CH AY i n/a 22 3024 3058 3170 N
+ L CH AY s n/a 22 3030 3060 3170 N
+ L CH B s n/a 22 3030 3097 3125 N
+ L CH CH s n/a 22 3030 3102 3138 N
+ L CH D s n/a 22 3030 3097 3125 N
+ L CH DH s n/a 22 3030 3097 3125 N
+ L CH EH b n/a 22 3035 3054 3178 N
+ L CH EH i n/a 22 3024 3048 3177 N
+ L CH EH s n/a 22 3030 3061 3178 N
+ L CH ER b n/a 22 3035 3065 3188 N
+ L CH ER i n/a 22 3024 3065 3188 N
+ L CH ER s n/a 22 3030 3065 3188 N
+ L CH EY b n/a 22 3035 3054 3155 N
+ L CH EY s n/a 22 3030 3060 3155 N
+ L CH F b n/a 22 3035 3101 3135 N
+ L CH F s n/a 22 3030 3101 3135 N
+ L CH G b n/a 22 3035 3097 3125 N
+ L CH G s n/a 22 3030 3097 3125 N
+ L CH HH b n/a 22 3035 3101 3132 N
+ L CH HH s n/a 22 3030 3101 3132 N
+ L CH IH b n/a 22 3035 3057 3190 N
+ L CH IH i n/a 22 3028 3050 3182 N
+ L CH IH s n/a 22 3031 3057 3182 N
+ L CH IY b n/a 22 3035 3041 3148 N
+ L CH IY i n/a 22 3029 3040 3151 N
+ L CH IY s n/a 22 3031 3041 3148 N
+ L CH JH b n/a 22 3035 3097 3125 N
+ L CH JH s n/a 22 3030 3097 3125 N
+ L CH K b n/a 22 3035 3102 3139 N
+ L CH K s n/a 22 3030 3102 3139 N
+ L CH L s n/a 22 3030 3098 3143 N
+ L CH M b n/a 22 3035 3097 3133 N
+ L CH M s n/a 22 3030 3097 3133 N
+ L CH N s n/a 22 3030 3097 3134 N
+ L CH NG s n/a 22 3030 3097 3133 N
+ L CH OW b n/a 22 3035 3055 3165 N
+ L CH OW i n/a 22 3024 3065 3165 N
+ L CH OW s n/a 22 3030 3065 3165 N
+ L CH OY b n/a 22 3035 3060 3167 N
+ L CH OY s n/a 22 3030 3060 3167 N
+ L CH P s n/a 22 3030 3102 3140 N
+ L CH R s n/a 22 3030 3099 3144 N
+ L CH S b n/a 22 3035 3101 3136 N
+ L CH S s n/a 22 3030 3101 3136 N
+ L CH SH s n/a 22 3030 3101 3137 N
+ L CH SIL s n/a 22 3030 3118 3142 N
+ L CH T b n/a 22 3035 3102 3138 N
+ L CH T s n/a 22 3030 3102 3138 N
+ L CH TH s n/a 22 3030 3101 3135 N
+ L CH UH b n/a 22 3035 3055 3189 N
+ L CH UH s n/a 22 3031 3055 3189 N
+ L CH UW b n/a 22 3035 3057 3192 N
+ L CH UW s n/a 22 3031 3057 3192 N
+ L CH V s n/a 22 3030 3097 3130 N
+ L CH W b n/a 22 3035 3098 3143 N
+ L CH W s n/a 22 3030 3098 3143 N
+ L CH Y b n/a 22 3035 3041 3149 N
+ L CH Y s n/a 22 3031 3041 3149 N
+ L CH Z s n/a 22 3030 3096 3131 N
+ L CH ZH s n/a 22 3030 3096 3130 N
+ L D AA b n/a 22 3032 3064 3168 N
+ L D AA e n/a 22 3032 3064 3162 N
+ L D AA i n/a 22 3034 3064 3168 N
+ L D AA s n/a 22 3032 3064 3168 N
+ L D AE b n/a 22 3032 3063 3174 N
+ L D AE e n/a 22 3032 3063 3180 N
+ L D AE i n/a 22 3034 3052 3174 N
+ L D AE s n/a 22 3032 3063 3174 N
+ L D AH b n/a 22 3032 3061 3172 N
+ L D AH e n/a 22 3032 3061 3161 N
+ L D AH i n/a 22 3034 3049 3160 N
+ L D AH s n/a 22 3032 3061 3172 N
+ L D AO b n/a 22 3032 3064 3167 N
+ L D AO e n/a 22 3032 3064 3162 N
+ L D AO i n/a 22 3034 3064 3166 N
+ L D AO s n/a 22 3032 3064 3166 N
+ L D AW b n/a 22 3032 3065 3174 N
+ L D AW e n/a 22 3032 3065 3180 N
+ L D AW i n/a 22 3034 3052 3174 N
+ L D AW s n/a 22 3032 3065 3174 N
+ L D AY b n/a 22 3032 3060 3170 N
+ L D AY e n/a 22 3032 3060 3173 N
+ L D AY i n/a 22 3034 3060 3170 N
+ L D AY s n/a 22 3032 3060 3170 N
+ L D B e n/a 22 3032 3097 3128 N
+ L D B s n/a 22 3032 3097 3125 N
+ L D CH e n/a 22 3032 3102 3138 N
+ L D CH s n/a 22 3032 3102 3138 N
+ L D D e n/a 22 3032 3097 3127 N
+ L D D s n/a 22 3032 3097 3125 N
+ L D DH e n/a 22 3032 3097 3129 N
+ L D DH s n/a 22 3032 3097 3125 N
+ L D EH b n/a 22 3032 3054 3178 N
+ L D EH e n/a 22 3032 3061 3180 N
+ L D EH i n/a 22 3034 3049 3178 N
+ L D EH s n/a 22 3032 3061 3178 N
+ L D ER b n/a 22 3032 3065 3188 N
+ L D ER e n/a 22 3032 3065 3186 N
+ L D ER i n/a 22 3034 3065 3188 N
+ L D ER s n/a 22 3032 3065 3188 N
+ L D EY b n/a 22 3032 3054 3155 N
+ L D EY e n/a 22 3032 3060 3155 N
+ L D EY i n/a 22 3034 3049 3154 N
+ L D EY s n/a 22 3032 3060 3155 N
+ L D F b n/a 22 3032 3101 3135 N
+ L D F e n/a 22 3032 3101 3136 N
+ L D F s n/a 22 3032 3101 3135 N
+ L D G b n/a 22 3032 3097 3125 N
+ L D G e n/a 22 3032 3097 3127 N
+ L D G s n/a 22 3032 3097 3125 N
+ L D HH b n/a 22 3032 3101 3132 N
+ L D HH e n/a 22 3032 3101 3132 N
+ L D HH s n/a 22 3032 3101 3132 N
+ L D IH b n/a 22 3032 3057 3190 N
+ L D IH e n/a 22 3032 3057 3181 N
+ L D IH i n/a 22 3034 3049 3181 N
+ L D IH s n/a 22 3032 3057 3181 N
+ L D IY b n/a 22 3032 3041 3148 N
+ L D IY e n/a 22 3032 3041 3148 N
+ L D IY i n/a 22 3034 3043 3153 N
+ L D IY s n/a 22 3032 3041 3148 N
+ L D JH b n/a 22 3032 3097 3125 N
+ L D JH e n/a 22 3032 3097 3127 N
+ L D JH s n/a 22 3032 3097 3125 N
+ L D K b n/a 22 3032 3102 3139 N
+ L D K e n/a 22 3032 3102 3139 N
+ L D K s n/a 22 3032 3102 3139 N
+ L D L e n/a 22 3032 3098 3143 N
+ L D L s n/a 22 3032 3098 3143 N
+ L D M b n/a 22 3032 3097 3133 N
+ L D M e n/a 22 3032 3097 3133 N
+ L D M s n/a 22 3032 3097 3133 N
+ L D N e n/a 22 3032 3097 3134 N
+ L D N s n/a 22 3032 3097 3134 N
+ L D NG e n/a 22 3032 3097 3133 N
+ L D NG s n/a 22 3032 3097 3133 N
+ L D OW b n/a 22 3032 3055 3165 N
+ L D OW e n/a 22 3032 3065 3162 N
+ L D OW i n/a 22 3034 3065 3165 N
+ L D OW s n/a 22 3032 3065 3165 N
+ L D OY b n/a 22 3032 3060 3167 N
+ L D OY e n/a 22 3032 3060 3173 N
+ L D OY i n/a 22 3034 3060 3166 N
+ L D OY s n/a 22 3032 3060 3166 N
+ L D P e n/a 22 3032 3102 3140 N
+ L D P s n/a 22 3032 3102 3140 N
+ L D R e n/a 22 3032 3099 3144 N
+ L D R s n/a 22 3032 3099 3144 N
+ L D S b n/a 22 3032 3101 3136 N
+ L D S e n/a 22 3032 3101 3136 N
+ L D S s n/a 22 3032 3101 3136 N
+ L D SH e n/a 22 3032 3101 3137 N
+ L D SH s n/a 22 3032 3101 3137 N
+ L D SIL e n/a 22 3032 3118 3142 N
+ L D SIL s n/a 22 3032 3118 3142 N
+ L D T b n/a 22 3032 3102 3138 N
+ L D T e n/a 22 3032 3102 3138 N
+ L D T s n/a 22 3032 3102 3138 N
+ L D TH e n/a 22 3032 3101 3136 N
+ L D TH s n/a 22 3032 3101 3135 N
+ L D UH b n/a 22 3032 3055 3189 N
+ L D UH e n/a 22 3032 3055 3189 N
+ L D UH i n/a 22 3034 3057 3189 N
+ L D UH s n/a 22 3032 3055 3189 N
+ L D UW b n/a 22 3032 3057 3192 N
+ L D UW e n/a 22 3032 3057 3192 N
+ L D UW i n/a 22 3034 3057 3192 N
+ L D UW s n/a 22 3032 3057 3192 N
+ L D V e n/a 22 3032 3097 3130 N
+ L D V s n/a 22 3032 3097 3130 N
+ L D W b n/a 22 3032 3098 3143 N
+ L D W e n/a 22 3032 3098 3143 N
+ L D W s n/a 22 3032 3098 3143 N
+ L D Y b n/a 22 3032 3041 3149 N
+ L D Y e n/a 22 3032 3041 3150 N
+ L D Y s n/a 22 3032 3041 3149 N
+ L D Z e n/a 22 3032 3096 3131 N
+ L D Z i n/a 22 3034 3096 3131 N
+ L D Z s n/a 22 3032 3096 3131 N
+ L D ZH e n/a 22 3032 3096 3130 N
+ L D ZH s n/a 22 3032 3096 3130 N
+ L DH AA b n/a 22 3035 3064 3168 N
+ L DH AA s n/a 22 3035 3064 3168 N
+ L DH AE b n/a 22 3035 3063 3174 N
+ L DH AE s n/a 22 3035 3063 3174 N
+ L DH AH b n/a 22 3035 3061 3172 N
+ L DH AH s n/a 22 3035 3061 3172 N
+ L DH AO b n/a 22 3035 3064 3167 N
+ L DH AO s n/a 22 3035 3064 3167 N
+ L DH AW b n/a 22 3035 3065 3174 N
+ L DH AW s n/a 22 3035 3065 3174 N
+ L DH AY b n/a 22 3035 3060 3170 N
+ L DH AY s n/a 22 3035 3060 3170 N
+ L DH B s n/a 22 3035 3097 3125 N
+ L DH CH s n/a 22 3035 3102 3138 N
+ L DH D s n/a 22 3035 3097 3125 N
+ L DH DH s n/a 22 3035 3097 3125 N
+ L DH EH b n/a 22 3035 3054 3178 N
+ L DH EH s n/a 22 3035 3061 3178 N
+ L DH ER b n/a 22 3035 3065 3188 N
+ L DH ER s n/a 22 3035 3065 3188 N
+ L DH EY b n/a 22 3035 3054 3155 N
+ L DH EY s n/a 22 3035 3060 3155 N
+ L DH F b n/a 22 3035 3101 3135 N
+ L DH F s n/a 22 3035 3101 3135 N
+ L DH G b n/a 22 3035 3097 3125 N
+ L DH G s n/a 22 3035 3097 3125 N
+ L DH HH b n/a 22 3035 3101 3132 N
+ L DH HH s n/a 22 3035 3101 3132 N
+ L DH IH b n/a 22 3035 3057 3190 N
+ L DH IH s n/a 22 3035 3057 3181 N
+ L DH IY b n/a 22 3035 3041 3148 N
+ L DH IY i n/a 22 3035 3042 3151 N
+ L DH IY s n/a 22 3035 3041 3148 N
+ L DH JH b n/a 22 3035 3097 3125 N
+ L DH JH s n/a 22 3035 3097 3125 N
+ L DH K b n/a 22 3035 3102 3139 N
+ L DH K s n/a 22 3035 3102 3139 N
+ L DH L s n/a 22 3035 3098 3143 N
+ L DH M b n/a 22 3035 3097 3133 N
+ L DH M s n/a 22 3035 3097 3133 N
+ L DH N s n/a 22 3035 3097 3134 N
+ L DH NG s n/a 22 3035 3097 3133 N
+ L DH OW b n/a 22 3035 3055 3165 N
+ L DH OW s n/a 22 3035 3065 3165 N
+ L DH OY b n/a 22 3035 3060 3167 N
+ L DH OY s n/a 22 3035 3060 3167 N
+ L DH P s n/a 22 3035 3102 3140 N
+ L DH R s n/a 22 3035 3099 3144 N
+ L DH S b n/a 22 3035 3101 3136 N
+ L DH S s n/a 22 3035 3101 3136 N
+ L DH SH s n/a 22 3035 3101 3137 N
+ L DH SIL s n/a 22 3035 3118 3142 N
+ L DH T b n/a 22 3035 3102 3138 N
+ L DH T s n/a 22 3035 3102 3138 N
+ L DH TH s n/a 22 3035 3101 3135 N
+ L DH UH b n/a 22 3035 3055 3189 N
+ L DH UH s n/a 22 3035 3055 3189 N
+ L DH UW b n/a 22 3035 3057 3192 N
+ L DH UW s n/a 22 3035 3057 3192 N
+ L DH V s n/a 22 3035 3097 3130 N
+ L DH W b n/a 22 3035 3098 3143 N
+ L DH W s n/a 22 3035 3098 3143 N
+ L DH Y b n/a 22 3035 3041 3149 N
+ L DH Y s n/a 22 3035 3041 3149 N
+ L DH Z s n/a 22 3035 3096 3131 N
+ L DH ZH s n/a 22 3035 3096 3130 N
+ L EH AA b n/a 22 3000 3075 3168 N
+ L EH AA e n/a 22 2990 3090 3162 N
+ L EH AA i n/a 22 3000 3075 3168 N
+ L EH AA s n/a 22 3000 3090 3168 N
+ L EH AE b n/a 22 3000 3076 3174 N
+ L EH AE e n/a 22 2990 3094 3180 N
+ L EH AE i n/a 22 3000 3076 3174 N
+ L EH AE s n/a 22 3000 3094 3174 N
+ L EH AH b n/a 22 3000 3075 3172 N
+ L EH AH e n/a 22 2990 3090 3161 N
+ L EH AH i n/a 22 3000 3094 3158 N
+ L EH AH s n/a 22 3000 3090 3172 N
+ L EH AO b n/a 22 3000 3075 3167 N
+ L EH AO e n/a 22 2990 3090 3162 N
+ L EH AO i n/a 22 3000 3075 3167 N
+ L EH AO s n/a 22 3000 3090 3167 N
+ L EH AW b n/a 22 3000 3076 3174 N
+ L EH AW e n/a 22 2990 3094 3180 N
+ L EH AW i n/a 22 3000 3076 3174 N
+ L EH AW s n/a 22 3000 3094 3174 N
+ L EH AY b n/a 22 3000 3075 3171 N
+ L EH AY e n/a 22 2990 3090 3173 N
+ L EH AY i n/a 22 3000 3075 3171 N
+ L EH AY s n/a 22 3000 3090 3171 N
+ L EH B e n/a 22 2994 3097 3128 N
+ L EH B i n/a 22 2994 3097 3126 N
+ L EH B s n/a 22 2994 3097 3126 N
+ L EH CH e n/a 22 2994 3102 3138 N
+ L EH CH i n/a 22 2994 3102 3138 N
+ L EH CH s n/a 22 2994 3102 3138 N
+ L EH D e n/a 22 2994 3097 3127 N
+ L EH D i n/a 22 2994 3097 3126 N
+ L EH D s n/a 22 2994 3097 3126 N
+ L EH DH e n/a 22 2994 3097 3129 N
+ L EH DH s n/a 22 2994 3097 3126 N
+ L EH EH b n/a 22 3000 3076 3178 N
+ L EH EH e n/a 22 2990 3094 3180 N
+ L EH EH i n/a 22 3000 3076 3178 N
+ L EH EH s n/a 22 3000 3094 3178 N
+ L EH ER b n/a 22 3000 3075 3188 N
+ L EH ER e n/a 22 2990 3090 3186 N
+ L EH ER i n/a 22 3000 3094 3187 N
+ L EH ER s n/a 22 3000 3090 3187 N
+ L EH EY b n/a 22 3000 3067 3155 N
+ L EH EY e n/a 22 2990 3079 3155 N
+ L EH EY i n/a 22 3000 3067 3155 N
+ L EH EY s n/a 22 3000 3079 3155 N
+ L EH F b n/a 22 2992 3101 3135 N
+ L EH F e n/a 22 2992 3101 3136 N
+ L EH F i n/a 22 2992 3100 3135 N
+ L EH F s n/a 22 2992 3101 3135 N
+ L EH G b n/a 22 2994 3097 3126 N
+ L EH G e n/a 22 2994 3097 3127 N
+ L EH G i n/a 22 2994 3097 3126 N
+ L EH G s n/a 22 2994 3097 3126 N
+ L EH HH b n/a 22 2994 3101 3132 N
+ L EH HH e n/a 22 2994 3101 3132 N
+ L EH HH i n/a 22 2994 3101 3132 N
+ L EH HH s n/a 22 2994 3101 3132 N
+ L EH IH b n/a 22 3000 3068 3191 N
+ L EH IH e n/a 22 2990 3094 3183 N
+ L EH IH i n/a 22 3000 3094 3184 N
+ L EH IH s n/a 22 3000 3094 3183 N
+ L EH IY b n/a 22 3000 3082 3148 N
+ L EH IY e n/a 22 2990 3079 3148 N
+ L EH IY i n/a 22 3000 3079 3146 N
+ L EH IY s n/a 22 3000 3079 3148 N
+ L EH JH b n/a 22 2994 3097 3126 N
+ L EH JH e n/a 22 2994 3097 3127 N
+ L EH JH i n/a 22 2994 3097 3126 N
+ L EH JH s n/a 22 2994 3097 3126 N
+ L EH K b n/a 22 2994 3102 3139 N
+ L EH K e n/a 22 2994 3102 3139 N
+ L EH K i n/a 22 2994 3102 3139 N
+ L EH K s n/a 22 2994 3102 3139 N
+ L EH L e n/a 22 2994 3099 3143 N
+ L EH L s n/a 22 2994 3099 3143 N
+ L EH M b n/a 22 2994 3096 3133 N
+ L EH M e n/a 22 2994 3096 3133 N
+ L EH M i n/a 22 2994 3096 3133 N
+ L EH M s n/a 22 2994 3096 3133 N
+ L EH N e n/a 22 2994 3096 3134 N
+ L EH N i n/a 22 2994 3096 3134 N
+ L EH N s n/a 22 2994 3096 3134 N
+ L EH NG e n/a 22 2994 3096 3133 N
+ L EH NG s n/a 22 2994 3096 3133 N
+ L EH OW b n/a 22 3000 3077 3165 N
+ L EH OW e n/a 22 2990 3090 3162 N
+ L EH OW i n/a 22 3000 3077 3163 N
+ L EH OW s n/a 22 3000 3090 3165 N
+ L EH OY b n/a 22 3000 3075 3167 N
+ L EH OY e n/a 22 2990 3090 3173 N
+ L EH OY i n/a 22 3000 3075 3167 N
+ L EH OY s n/a 22 3000 3090 3167 N
+ L EH P e n/a 22 2995 3102 3140 N
+ L EH P i n/a 22 2995 3102 3140 N
+ L EH P s n/a 22 2995 3102 3140 N
+ L EH R e n/a 22 2994 3099 3144 N
+ L EH R i n/a 22 2994 3096 3144 N
+ L EH R s n/a 22 2994 3099 3144 N
+ L EH S b n/a 22 2994 3101 3136 N
+ L EH S e n/a 22 2994 3101 3136 N
+ L EH S i n/a 22 2994 3101 3136 N
+ L EH S s n/a 22 2994 3101 3136 N
+ L EH SH e n/a 22 2994 3101 3137 N
+ L EH SH i n/a 22 2994 3101 3137 N
+ L EH SH s n/a 22 2994 3101 3137 N
+ L EH SIL e n/a 22 2993 3119 3142 N
+ L EH SIL s n/a 22 2993 3119 3142 N
+ L EH T b n/a 22 2994 3102 3138 N
+ L EH T e n/a 22 2994 3102 3138 N
+ L EH T i n/a 22 2994 3102 3138 N
+ L EH T s n/a 22 2994 3102 3138 N
+ L EH TH e n/a 22 2994 3101 3136 N
+ L EH TH i n/a 22 2994 3101 3135 N
+ L EH TH s n/a 22 2994 3101 3135 N
+ L EH UH b n/a 22 3000 3075 3189 N
+ L EH UH e n/a 22 2990 3094 3189 N
+ L EH UH i n/a 22 3000 3094 3189 N
+ L EH UH s n/a 22 3000 3094 3189 N
+ L EH UW b n/a 22 3000 3077 3192 N
+ L EH UW e n/a 22 2990 3094 3192 N
+ L EH UW i n/a 22 3000 3094 3192 N
+ L EH UW s n/a 22 3000 3094 3192 N
+ L EH V e n/a 22 2993 3097 3130 N
+ L EH V i n/a 22 2993 3095 3130 N
+ L EH V s n/a 22 2993 3097 3130 N
+ L EH W b n/a 22 2994 3099 3143 N
+ L EH W e n/a 22 2994 3099 3143 N
+ L EH W i n/a 22 2994 3096 3143 N
+ L EH W s n/a 22 2994 3099 3143 N
+ L EH Y b n/a 22 2996 3084 3149 N
+ L EH Y e n/a 22 2996 3084 3150 N
+ L EH Y i n/a 22 2996 3083 3149 N
+ L EH Y s n/a 22 2996 3084 3149 N
+ L EH Z e n/a 22 2994 3097 3131 N
+ L EH Z i n/a 22 2994 3095 3131 N
+ L EH Z s n/a 22 2994 3097 3131 N
+ L EH ZH e n/a 22 2994 3097 3130 N
+ L EH ZH i n/a 22 2994 3096 3130 N
+ L EH ZH s n/a 22 2994 3097 3130 N
+ L ER AA b n/a 22 3013 3071 3168 N
+ L ER AA e n/a 22 2991 3090 3162 N
+ L ER AA i n/a 22 3014 3073 3168 N
+ L ER AA s n/a 22 3013 3088 3168 N
+ L ER AE b n/a 22 3013 3066 3174 N
+ L ER AE e n/a 22 2991 3091 3180 N
+ L ER AE i n/a 22 3014 3066 3174 N
+ L ER AE s n/a 22 3013 3088 3174 N
+ L ER AH b n/a 22 3013 3066 3172 N
+ L ER AH e n/a 22 2991 3089 3161 N
+ L ER AH i n/a 22 3013 3087 3160 N
+ L ER AH s n/a 22 3013 3087 3172 N
+ L ER AO b n/a 22 3013 3071 3167 N
+ L ER AO e n/a 22 2991 3090 3162 N
+ L ER AO i n/a 22 3014 3073 3167 N
+ L ER AO s n/a 22 3013 3088 3167 N
+ L ER AW b n/a 22 3013 3066 3174 N
+ L ER AW e n/a 22 2991 3091 3180 N
+ L ER AW i n/a 22 3013 3066 3174 N
+ L ER AW s n/a 22 3013 3088 3174 N
+ L ER AY b n/a 22 3013 3074 3171 N
+ L ER AY e n/a 22 2991 3090 3173 N
+ L ER AY i n/a 22 3013 3074 3171 N
+ L ER AY s n/a 22 3013 3088 3171 N
+ L ER B e n/a 22 2991 3107 3128 N
+ L ER B i n/a 22 2991 3107 3126 N
+ L ER B s n/a 22 2991 3107 3126 N
+ L ER CH e n/a 22 2991 3113 3138 N
+ L ER CH s n/a 22 2991 3113 3138 N
+ L ER D e n/a 22 2991 3107 3127 N
+ L ER D i n/a 22 2991 3107 3126 N
+ L ER D s n/a 22 2991 3107 3126 N
+ L ER DH e n/a 22 2991 3107 3129 N
+ L ER DH s n/a 22 2991 3107 3126 N
+ L ER EH b n/a 22 3013 3066 3178 N
+ L ER EH e n/a 22 2991 3091 3180 N
+ L ER EH i n/a 22 3013 3066 3178 N
+ L ER EH s n/a 22 3013 3088 3178 N
+ L ER ER b n/a 22 3013 3070 3188 N
+ L ER ER e n/a 22 2991 3089 3186 N
+ L ER ER i n/a 22 3013 3086 3186 N
+ L ER ER s n/a 22 3013 3086 3188 N
+ L ER EY b n/a 22 3013 3067 3155 N
+ L ER EY e n/a 22 2991 3081 3155 N
+ L ER EY i n/a 22 3014 3067 3155 N
+ L ER EY s n/a 22 3013 3081 3155 N
+ L ER F b n/a 22 2991 3115 3135 N
+ L ER F e n/a 22 2991 3115 3136 N
+ L ER F i n/a 22 2991 3115 3135 N
+ L ER F s n/a 22 2991 3115 3135 N
+ L ER G b n/a 22 2991 3107 3126 N
+ L ER G e n/a 22 2991 3107 3127 N
+ L ER G s n/a 22 2991 3107 3126 N
+ L ER HH b n/a 22 2991 3110 3132 N
+ L ER HH e n/a 22 2991 3110 3132 N
+ L ER HH i n/a 22 2991 3110 3132 N
+ L ER HH s n/a 22 2991 3110 3132 N
+ L ER IH b n/a 22 3013 3069 3190 N
+ L ER IH e n/a 22 2991 3091 3183 N
+ L ER IH i n/a 22 3013 3087 3185 N
+ L ER IH s n/a 22 3013 3087 3185 N
+ L ER IY b n/a 22 3013 3082 3148 N
+ L ER IY e n/a 22 2991 3081 3148 N
+ L ER IY i n/a 22 3014 3081 3147 N
+ L ER IY s n/a 22 3013 3081 3148 N
+ L ER JH b n/a 22 2991 3107 3126 N
+ L ER JH e n/a 22 2991 3107 3127 N
+ L ER JH s n/a 22 2991 3107 3126 N
+ L ER K b n/a 22 2991 3114 3139 N
+ L ER K e n/a 22 2991 3114 3139 N
+ L ER K i n/a 22 2991 3114 3139 N
+ L ER K s n/a 22 2991 3114 3139 N
+ L ER L e n/a 22 2991 3124 3143 N
+ L ER L s n/a 22 2991 3124 3143 N
+ L ER M b n/a 22 2991 3108 3133 N
+ L ER M e n/a 22 2991 3108 3133 N
+ L ER M i n/a 22 2991 3108 3133 N
+ L ER M s n/a 22 2991 3108 3133 N
+ L ER N e n/a 22 2991 3108 3134 N
+ L ER N s n/a 22 2991 3108 3134 N
+ L ER NG e n/a 22 2991 3108 3133 N
+ L ER NG s n/a 22 2991 3108 3133 N
+ L ER OW b n/a 22 3013 3070 3165 N
+ L ER OW e n/a 22 2991 3089 3162 N
+ L ER OW i n/a 22 3013 3072 3165 N
+ L ER OW s n/a 22 3013 3088 3165 N
+ L ER OY b n/a 22 3013 3074 3167 N
+ L ER OY e n/a 22 2991 3090 3173 N
+ L ER OY i n/a 22 3013 3074 3167 N
+ L ER OY s n/a 22 3013 3088 3167 N
+ L ER P e n/a 22 2991 3114 3140 N
+ L ER P i n/a 22 2991 3112 3140 N
+ L ER P s n/a 22 2991 3114 3140 N
+ L ER R e n/a 22 2991 3109 3144 N
+ L ER R s n/a 22 2991 3109 3144 N
+ L ER S b n/a 22 2991 3115 3136 N
+ L ER S e n/a 22 2991 3115 3136 N
+ L ER S i n/a 22 2991 3115 3136 N
+ L ER S s n/a 22 2991 3115 3136 N
+ L ER SH e n/a 22 2991 3115 3137 N
+ L ER SH i n/a 22 2991 3115 3137 N
+ L ER SH s n/a 22 2991 3115 3137 N
+ L ER SIL e n/a 22 2991 3119 3142 N
+ L ER SIL s n/a 22 2991 3119 3142 N
+ L ER T b n/a 22 2991 3113 3138 N
+ L ER T e n/a 22 2991 3113 3138 N
+ L ER T i n/a 22 2991 3112 3138 N
+ L ER T s n/a 22 2991 3113 3138 N
+ L ER TH e n/a 22 2991 3115 3136 N
+ L ER TH s n/a 22 2991 3115 3135 N
+ L ER UH b n/a 22 3013 3070 3189 N
+ L ER UH e n/a 22 2991 3091 3189 N
+ L ER UH i n/a 22 3013 3088 3189 N
+ L ER UH s n/a 22 3013 3088 3189 N
+ L ER UW b n/a 22 3013 3070 3192 N
+ L ER UW e n/a 22 2991 3091 3192 N
+ L ER UW i n/a 22 3014 3088 3192 N
+ L ER UW s n/a 22 3013 3088 3192 N
+ L ER V e n/a 22 2991 3107 3130 N
+ L ER V s n/a 22 2991 3107 3130 N
+ L ER W b n/a 22 2991 3124 3143 N
+ L ER W e n/a 22 2991 3124 3143 N
+ L ER W i n/a 22 2991 3124 3143 N
+ L ER W s n/a 22 2991 3124 3143 N
+ L ER Y b n/a 22 2991 3083 3149 N
+ L ER Y e n/a 22 2991 3083 3149 N
+ L ER Y i n/a 22 2991 3083 3149 N
+ L ER Y s n/a 22 2991 3083 3149 N
+ L ER Z e n/a 22 2991 3121 3131 N
+ L ER Z i n/a 22 2991 3121 3131 N
+ L ER Z s n/a 22 2991 3121 3131 N
+ L ER ZH e n/a 22 2991 3107 3130 N
+ L ER ZH s n/a 22 2991 3107 3130 N
+ L EY AA b n/a 22 3020 3071 3168 N
+ L EY AA e n/a 22 3017 3090 3162 N
+ L EY AA i n/a 22 3021 3074 3168 N
+ L EY AA s n/a 22 3016 3078 3168 N
+ L EY AE b n/a 22 3020 3066 3174 N
+ L EY AE e n/a 22 3017 3094 3180 N
+ L EY AE i n/a 22 3021 3066 3174 N
+ L EY AE s n/a 22 3016 3078 3174 N
+ L EY AH b n/a 22 3020 3066 3172 N
+ L EY AH e n/a 22 3017 3094 3161 N
+ L EY AH i n/a 22 3021 3078 3158 N
+ L EY AH s n/a 22 3017 3078 3172 N
+ L EY AO b n/a 22 3020 3071 3167 N
+ L EY AO e n/a 22 3017 3090 3162 N
+ L EY AO i n/a 22 3021 3074 3167 N
+ L EY AO s n/a 22 3016 3078 3167 N
+ L EY AW b n/a 22 3020 3066 3174 N
+ L EY AW e n/a 22 3017 3094 3180 N
+ L EY AW i n/a 22 3021 3066 3174 N
+ L EY AW s n/a 22 3016 3078 3174 N
+ L EY AY b n/a 22 3020 3074 3170 N
+ L EY AY e n/a 22 3017 3090 3173 N
+ L EY AY i n/a 22 3021 3074 3170 N
+ L EY AY s n/a 22 3016 3090 3170 N
+ L EY B e n/a 22 3005 3097 3128 N
+ L EY B i n/a 22 3005 3097 3126 N
+ L EY B s n/a 22 3005 3097 3126 N
+ L EY CH e n/a 22 3005 3102 3138 N
+ L EY CH i n/a 22 3005 3102 3138 N
+ L EY CH s n/a 22 3005 3102 3138 N
+ L EY D e n/a 22 3005 3097 3127 N
+ L EY D i n/a 22 3005 3097 3126 N
+ L EY D s n/a 22 3005 3097 3126 N
+ L EY DH e n/a 22 3005 3097 3129 N
+ L EY DH s n/a 22 3005 3097 3126 N
+ L EY EH b n/a 22 3020 3066 3179 N
+ L EY EH e n/a 22 3017 3094 3180 N
+ L EY EH i n/a 22 3021 3066 3179 N
+ L EY EH s n/a 22 3016 3078 3179 N
+ L EY ER b n/a 22 3020 3070 3188 N
+ L EY ER e n/a 22 3017 3094 3186 N
+ L EY ER i n/a 22 3021 3078 3188 N
+ L EY ER s n/a 22 3017 3078 3188 N
+ L EY EY b n/a 22 3020 3067 3155 N
+ L EY EY e n/a 22 3017 3078 3155 N
+ L EY EY i n/a 22 3021 3067 3155 N
+ L EY EY s n/a 22 3016 3078 3155 N
+ L EY F b n/a 22 3005 3101 3135 N
+ L EY F e n/a 22 3005 3101 3136 N
+ L EY F i n/a 22 3005 3100 3135 N
+ L EY F s n/a 22 3005 3101 3135 N
+ L EY G b n/a 22 3005 3097 3126 N
+ L EY G e n/a 22 3005 3097 3127 N
+ L EY G i n/a 22 3005 3097 3126 N
+ L EY G s n/a 22 3005 3097 3126 N
+ L EY HH b n/a 22 3005 3101 3132 N
+ L EY HH e n/a 22 3005 3101 3132 N
+ L EY HH i n/a 22 3005 3101 3132 N
+ L EY HH s n/a 22 3005 3101 3132 N
+ L EY IH b n/a 22 3020 3069 3190 N
+ L EY IH e n/a 22 3017 3094 3183 N
+ L EY IH i n/a 22 3021 3078 3181 N
+ L EY IH s n/a 22 3017 3078 3181 N
+ L EY IY b n/a 22 3020 3082 3148 N
+ L EY IY e n/a 22 3017 3078 3148 N
+ L EY IY i n/a 22 3021 3078 3147 N
+ L EY IY s n/a 22 3015 3078 3148 N
+ L EY JH b n/a 22 3005 3097 3126 N
+ L EY JH e n/a 22 3005 3097 3127 N
+ L EY JH s n/a 22 3005 3097 3126 N
+ L EY K b n/a 22 3005 3102 3139 N
+ L EY K e n/a 22 3005 3102 3139 N
+ L EY K i n/a 22 3005 3102 3139 N
+ L EY K s n/a 22 3005 3102 3139 N
+ L EY L e n/a 22 3005 3099 3143 N
+ L EY L s n/a 22 3005 3099 3143 N
+ L EY M b n/a 22 3005 3097 3133 N
+ L EY M e n/a 22 3005 3097 3133 N
+ L EY M i n/a 22 3005 3097 3133 N
+ L EY M s n/a 22 3005 3097 3133 N
+ L EY N e n/a 22 3005 3097 3134 N
+ L EY N i n/a 22 3005 3097 3134 N
+ L EY N s n/a 22 3005 3097 3134 N
+ L EY NG e n/a 22 3005 3097 3133 N
+ L EY NG s n/a 22 3005 3097 3133 N
+ L EY OW b n/a 22 3020 3070 3165 N
+ L EY OW e n/a 22 3017 3090 3162 N
+ L EY OW i n/a 22 3021 3077 3163 N
+ L EY OW s n/a 22 3016 3078 3165 N
+ L EY OY b n/a 22 3020 3074 3167 N
+ L EY OY e n/a 22 3017 3090 3173 N
+ L EY OY s n/a 22 3016 3090 3167 N
+ L EY P e n/a 22 3005 3102 3140 N
+ L EY P i n/a 22 3005 3102 3140 N
+ L EY P s n/a 22 3005 3102 3140 N
+ L EY R e n/a 22 3005 3099 3144 N
+ L EY R i n/a 22 3005 3099 3144 N
+ L EY R s n/a 22 3005 3099 3144 N
+ L EY S b n/a 22 3005 3101 3136 N
+ L EY S e n/a 22 3005 3101 3136 N
+ L EY S i n/a 22 3005 3101 3136 N
+ L EY S s n/a 22 3005 3101 3136 N
+ L EY SH e n/a 22 3005 3101 3137 N
+ L EY SH i n/a 22 3005 3101 3137 N
+ L EY SH s n/a 22 3005 3101 3137 N
+ L EY SIL e n/a 22 3005 3119 3142 N
+ L EY SIL s n/a 22 3005 3119 3142 N
+ L EY T b n/a 22 3005 3102 3138 N
+ L EY T e n/a 22 3005 3102 3138 N
+ L EY T i n/a 22 3005 3102 3138 N
+ L EY T s n/a 22 3005 3102 3138 N
+ L EY TH e n/a 22 3005 3101 3136 N
+ L EY TH s n/a 22 3005 3101 3135 N
+ L EY UH b n/a 22 3020 3070 3189 N
+ L EY UH e n/a 22 3017 3094 3189 N
+ L EY UH i n/a 22 3021 3078 3189 N
+ L EY UH s n/a 22 3016 3078 3189 N
+ L EY UW b n/a 22 3020 3070 3192 N
+ L EY UW e n/a 22 3017 3094 3192 N
+ L EY UW i n/a 22 3021 3078 3192 N
+ L EY UW s n/a 22 3016 3078 3192 N
+ L EY V e n/a 22 3005 3097 3130 N
+ L EY V i n/a 22 3005 3097 3130 N
+ L EY V s n/a 22 3005 3097 3130 N
+ L EY W b n/a 22 3005 3099 3143 N
+ L EY W e n/a 22 3005 3099 3143 N
+ L EY W i n/a 22 3005 3099 3143 N
+ L EY W s n/a 22 3005 3099 3143 N
+ L EY Y b n/a 22 3005 3084 3149 N
+ L EY Y e n/a 22 3005 3084 3150 N
+ L EY Y i n/a 22 3005 3083 3149 N
+ L EY Y s n/a 22 3005 3084 3149 N
+ L EY Z e n/a 22 3005 3096 3131 N
+ L EY Z i n/a 22 3005 3096 3131 N
+ L EY Z s n/a 22 3005 3096 3131 N
+ L EY ZH e n/a 22 3005 3096 3130 N
+ L EY ZH s n/a 22 3005 3096 3130 N
+ L F AA b n/a 22 3033 3064 3168 N
+ L F AA e n/a 22 3030 3064 3162 N
+ L F AA i n/a 22 3025 3064 3168 N
+ L F AA s n/a 22 3030 3064 3168 N
+ L F AE b n/a 22 3033 3063 3174 N
+ L F AE e n/a 22 3030 3063 3180 N
+ L F AE i n/a 22 3025 3046 3175 N
+ L F AE s n/a 22 3030 3063 3174 N
+ L F AH b n/a 22 3033 3061 3172 N
+ L F AH e n/a 22 3030 3061 3161 N
+ L F AH i n/a 22 3025 3053 3157 N
+ L F AH s n/a 22 3030 3061 3172 N
+ L F AO b n/a 22 3033 3064 3166 N
+ L F AO e n/a 22 3030 3064 3162 N
+ L F AO i n/a 22 3024 3064 3166 N
+ L F AO s n/a 22 3030 3064 3166 N
+ L F AW b n/a 22 3033 3061 3175 N
+ L F AW e n/a 22 3030 3061 3180 N
+ L F AW i n/a 22 3025 3046 3175 N
+ L F AW s n/a 22 3030 3061 3175 N
+ L F AY b n/a 22 3033 3060 3171 N
+ L F AY e n/a 22 3030 3060 3173 N
+ L F AY i n/a 22 3025 3058 3171 N
+ L F AY s n/a 22 3030 3060 3171 N
+ L F B e n/a 22 3030 3097 3128 N
+ L F B s n/a 22 3030 3097 3125 N
+ L F CH e n/a 22 3030 3102 3138 N
+ L F CH s n/a 22 3030 3102 3138 N
+ L F D e n/a 22 3030 3097 3127 N
+ L F D i n/a 22 3025 3097 3125 N
+ L F D s n/a 22 3030 3097 3125 N
+ L F DH e n/a 22 3030 3097 3129 N
+ L F DH s n/a 22 3030 3097 3125 N
+ L F EH b n/a 22 3033 3054 3178 N
+ L F EH e n/a 22 3030 3061 3180 N
+ L F EH i n/a 22 3025 3046 3177 N
+ L F EH s n/a 22 3030 3061 3178 N
+ L F ER b n/a 22 3033 3063 3188 N
+ L F ER e n/a 22 3030 3063 3186 N
+ L F ER i n/a 22 3024 3063 3188 N
+ L F ER s n/a 22 3030 3063 3188 N
+ L F EY b n/a 22 3033 3054 3155 N
+ L F EY e n/a 22 3030 3060 3155 N
+ L F EY i n/a 22 3025 3048 3154 N
+ L F EY s n/a 22 3030 3060 3155 N
+ L F F b n/a 22 3033 3101 3135 N
+ L F F e n/a 22 3030 3101 3136 N
+ L F F s n/a 22 3030 3101 3135 N
+ L F G b n/a 22 3033 3097 3125 N
+ L F G e n/a 22 3030 3097 3127 N
+ L F G s n/a 22 3030 3097 3125 N
+ L F HH b n/a 22 3033 3101 3132 N
+ L F HH e n/a 22 3030 3101 3132 N
+ L F HH i n/a 22 3025 3101 3132 N
+ L F HH s n/a 22 3030 3101 3132 N
+ L F IH b n/a 22 3033 3057 3190 N
+ L F IH e n/a 22 3031 3057 3182 N
+ L F IH i n/a 22 3028 3050 3182 N
+ L F IH s n/a 22 3031 3057 3182 N
+ L F IY b n/a 22 3033 3041 3148 N
+ L F IY e n/a 22 3031 3041 3148 N
+ L F IY i n/a 22 3028 3040 3151 N
+ L F IY s n/a 22 3031 3041 3148 N
+ L F JH b n/a 22 3033 3097 3125 N
+ L F JH e n/a 22 3030 3097 3127 N
+ L F JH s n/a 22 3030 3097 3125 N
+ L F K b n/a 22 3033 3102 3139 N
+ L F K e n/a 22 3030 3102 3139 N
+ L F K s n/a 22 3030 3102 3139 N
+ L F L e n/a 22 3030 3098 3143 N
+ L F L i n/a 22 3025 3098 3143 N
+ L F L s n/a 22 3030 3098 3143 N
+ L F M b n/a 22 3033 3097 3133 N
+ L F M e n/a 22 3030 3097 3133 N
+ L F M s n/a 22 3030 3097 3133 N
+ L F N e n/a 22 3030 3097 3134 N
+ L F N s n/a 22 3030 3097 3134 N
+ L F NG e n/a 22 3030 3097 3133 N
+ L F NG s n/a 22 3030 3097 3133 N
+ L F OW b n/a 22 3033 3055 3165 N
+ L F OW e n/a 22 3030 3061 3162 N
+ L F OW i n/a 22 3024 3061 3165 N
+ L F OW s n/a 22 3030 3061 3165 N
+ L F OY b n/a 22 3033 3060 3166 N
+ L F OY e n/a 22 3030 3060 3173 N
+ L F OY i n/a 22 3024 3059 3166 N
+ L F OY s n/a 22 3030 3060 3166 N
+ L F P e n/a 22 3030 3102 3140 N
+ L F P s n/a 22 3030 3102 3140 N
+ L F R e n/a 22 3030 3099 3144 N
+ L F R s n/a 22 3030 3099 3144 N
+ L F S b n/a 22 3033 3101 3136 N
+ L F S e n/a 22 3030 3101 3136 N
+ L F S s n/a 22 3030 3101 3136 N
+ L F SH e n/a 22 3030 3101 3137 N
+ L F SH s n/a 22 3030 3101 3137 N
+ L F SIL e n/a 22 3030 3118 3142 N
+ L F SIL s n/a 22 3030 3118 3142 N
+ L F T b n/a 22 3033 3102 3138 N
+ L F T e n/a 22 3030 3102 3138 N
+ L F T s n/a 22 3030 3102 3138 N
+ L F TH e n/a 22 3030 3101 3136 N
+ L F TH s n/a 22 3030 3101 3135 N
+ L F UH b n/a 22 3033 3055 3189 N
+ L F UH e n/a 22 3031 3055 3189 N
+ L F UH i n/a 22 3028 3056 3189 N
+ L F UH s n/a 22 3031 3055 3189 N
+ L F UW b n/a 22 3033 3057 3192 N
+ L F UW e n/a 22 3031 3057 3192 N
+ L F UW i n/a 22 3028 3056 3192 N
+ L F UW s n/a 22 3031 3057 3192 N
+ L F V e n/a 22 3030 3097 3130 N
+ L F V s n/a 22 3030 3097 3130 N
+ L F W b n/a 22 3033 3098 3143 N
+ L F W e n/a 22 3030 3098 3143 N
+ L F W i n/a 22 3024 3098 3143 N
+ L F W s n/a 22 3030 3098 3143 N
+ L F Y b n/a 22 3033 3041 3149 N
+ L F Y e n/a 22 3031 3041 3150 N
+ L F Y s n/a 22 3031 3041 3149 N
+ L F Z e n/a 22 3030 3096 3131 N
+ L F Z i n/a 22 3025 3096 3131 N
+ L F Z s n/a 22 3030 3096 3131 N
+ L F ZH e n/a 22 3030 3096 3130 N
+ L F ZH s n/a 22 3030 3096 3130 N
+ L G AA b n/a 22 3035 3064 3168 N
+ L G AA i n/a 22 3030 3064 3168 N
+ L G AA s n/a 22 3030 3064 3168 N
+ L G AE b n/a 22 3035 3063 3175 N
+ L G AE i n/a 22 3030 3052 3175 N
+ L G AE s n/a 22 3030 3063 3175 N
+ L G AH b n/a 22 3035 3061 3172 N
+ L G AH i n/a 22 3030 3049 3160 N
+ L G AH s n/a 22 3030 3061 3172 N
+ L G AO b n/a 22 3035 3064 3167 N
+ L G AO i n/a 22 3030 3064 3166 N
+ L G AO s n/a 22 3030 3064 3166 N
+ L G AW b n/a 22 3035 3065 3174 N
+ L G AW i n/a 22 3030 3052 3174 N
+ L G AW s n/a 22 3030 3065 3174 N
+ L G AY b n/a 22 3035 3060 3170 N
+ L G AY i n/a 22 3030 3060 3170 N
+ L G AY s n/a 22 3030 3060 3170 N
+ L G B s n/a 22 3030 3097 3125 N
+ L G CH s n/a 22 3030 3102 3138 N
+ L G D s n/a 22 3030 3097 3125 N
+ L G DH s n/a 22 3030 3097 3125 N
+ L G EH b n/a 22 3035 3054 3178 N
+ L G EH i n/a 22 3030 3049 3178 N
+ L G EH s n/a 22 3030 3061 3178 N
+ L G ER b n/a 22 3035 3065 3188 N
+ L G ER i n/a 22 3030 3065 3188 N
+ L G ER s n/a 22 3030 3065 3188 N
+ L G EY b n/a 22 3035 3054 3155 N
+ L G EY i n/a 22 3030 3049 3154 N
+ L G EY s n/a 22 3030 3060 3155 N
+ L G F b n/a 22 3035 3101 3135 N
+ L G F s n/a 22 3030 3101 3135 N
+ L G G b n/a 22 3035 3097 3125 N
+ L G G s n/a 22 3030 3097 3125 N
+ L G HH b n/a 22 3035 3101 3132 N
+ L G HH s n/a 22 3030 3101 3132 N
+ L G IH b n/a 22 3035 3057 3190 N
+ L G IH i n/a 22 3031 3049 3182 N
+ L G IH s n/a 22 3031 3057 3182 N
+ L G IY b n/a 22 3035 3041 3148 N
+ L G IY i n/a 22 3031 3042 3151 N
+ L G IY s n/a 22 3031 3041 3148 N
+ L G JH b n/a 22 3035 3097 3125 N
+ L G JH s n/a 22 3030 3097 3125 N
+ L G K b n/a 22 3035 3102 3139 N
+ L G K s n/a 22 3030 3102 3139 N
+ L G L s n/a 22 3030 3098 3143 N
+ L G M b n/a 22 3035 3097 3133 N
+ L G M s n/a 22 3030 3097 3133 N
+ L G N s n/a 22 3030 3097 3134 N
+ L G NG s n/a 22 3030 3097 3133 N
+ L G OW b n/a 22 3035 3055 3165 N
+ L G OW i n/a 22 3030 3065 3165 N
+ L G OW s n/a 22 3030 3065 3165 N
+ L G OY b n/a 22 3035 3060 3167 N
+ L G OY i n/a 22 3030 3060 3166 N
+ L G OY s n/a 22 3030 3060 3166 N
+ L G P s n/a 22 3030 3102 3140 N
+ L G R s n/a 22 3030 3099 3144 N
+ L G S b n/a 22 3035 3101 3136 N
+ L G S s n/a 22 3030 3101 3136 N
+ L G SH s n/a 22 3030 3101 3137 N
+ L G SIL s n/a 22 3030 3118 3142 N
+ L G T b n/a 22 3035 3102 3138 N
+ L G T s n/a 22 3030 3102 3138 N
+ L G TH s n/a 22 3030 3101 3135 N
+ L G UH b n/a 22 3035 3055 3189 N
+ L G UH i n/a 22 3031 3057 3189 N
+ L G UH s n/a 22 3031 3055 3189 N
+ L G UW b n/a 22 3035 3057 3192 N
+ L G UW i n/a 22 3031 3057 3192 N
+ L G UW s n/a 22 3031 3057 3192 N
+ L G V s n/a 22 3030 3097 3130 N
+ L G W b n/a 22 3035 3098 3143 N
+ L G W i n/a 22 3030 3098 3143 N
+ L G W s n/a 22 3030 3098 3143 N
+ L G Y b n/a 22 3035 3041 3149 N
+ L G Y i n/a 22 3031 3042 3151 N
+ L G Y s n/a 22 3031 3041 3149 N
+ L G Z s n/a 22 3030 3096 3131 N
+ L G ZH s n/a 22 3030 3096 3130 N
+ L HH AA b n/a 22 3035 3064 3168 N
+ L HH AA e n/a 22 3030 3064 3162 N
+ L HH AA i n/a 22 3024 3064 3168 N
+ L HH AA s n/a 22 3030 3064 3168 N
+ L HH AE b n/a 22 3035 3063 3174 N
+ L HH AE e n/a 22 3030 3063 3180 N
+ L HH AE i n/a 22 3024 3046 3174 N
+ L HH AE s n/a 22 3030 3063 3174 N
+ L HH AH b n/a 22 3035 3061 3172 N
+ L HH AH e n/a 22 3030 3061 3161 N
+ L HH AH i n/a 22 3024 3051 3156 N
+ L HH AH s n/a 22 3030 3061 3172 N
+ L HH AO b n/a 22 3035 3064 3167 N
+ L HH AO e n/a 22 3030 3064 3162 N
+ L HH AO s n/a 22 3030 3064 3167 N
+ L HH AW b n/a 22 3035 3065 3174 N
+ L HH AW e n/a 22 3030 3065 3180 N
+ L HH AW s n/a 22 3030 3065 3174 N
+ L HH AY b n/a 22 3035 3060 3170 N
+ L HH AY e n/a 22 3030 3060 3173 N
+ L HH AY s n/a 22 3030 3060 3170 N
+ L HH B e n/a 22 3030 3097 3128 N
+ L HH B s n/a 22 3030 3097 3125 N
+ L HH CH e n/a 22 3030 3102 3138 N
+ L HH CH s n/a 22 3030 3102 3138 N
+ L HH D e n/a 22 3030 3097 3127 N
+ L HH D s n/a 22 3030 3097 3125 N
+ L HH DH e n/a 22 3030 3097 3129 N
+ L HH DH s n/a 22 3030 3097 3125 N
+ L HH EH b n/a 22 3035 3054 3178 N
+ L HH EH e n/a 22 3030 3061 3180 N
+ L HH EH s n/a 22 3030 3061 3178 N
+ L HH ER b n/a 22 3035 3065 3188 N
+ L HH ER e n/a 22 3030 3065 3186 N
+ L HH ER s n/a 22 3030 3065 3188 N
+ L HH EY b n/a 22 3035 3054 3155 N
+ L HH EY e n/a 22 3030 3060 3155 N
+ L HH EY s n/a 22 3030 3060 3155 N
+ L HH F b n/a 22 3035 3101 3135 N
+ L HH F e n/a 22 3030 3101 3136 N
+ L HH F s n/a 22 3030 3101 3135 N
+ L HH G b n/a 22 3035 3097 3125 N
+ L HH G e n/a 22 3030 3097 3127 N
+ L HH G s n/a 22 3030 3097 3125 N
+ L HH HH b n/a 22 3035 3101 3132 N
+ L HH HH e n/a 22 3030 3101 3132 N
+ L HH HH s n/a 22 3030 3101 3132 N
+ L HH IH b n/a 22 3035 3057 3190 N
+ L HH IH e n/a 22 3031 3057 3182 N
+ L HH IH s n/a 22 3031 3057 3182 N
+ L HH IY b n/a 22 3035 3041 3148 N
+ L HH IY e n/a 22 3031 3041 3148 N
+ L HH IY s n/a 22 3031 3041 3148 N
+ L HH JH b n/a 22 3035 3097 3125 N
+ L HH JH e n/a 22 3030 3097 3127 N
+ L HH JH s n/a 22 3030 3097 3125 N
+ L HH K b n/a 22 3035 3102 3139 N
+ L HH K e n/a 22 3030 3102 3139 N
+ L HH K s n/a 22 3030 3102 3139 N
+ L HH L e n/a 22 3030 3098 3143 N
+ L HH L s n/a 22 3030 3098 3143 N
+ L HH M b n/a 22 3035 3097 3133 N
+ L HH M e n/a 22 3030 3097 3133 N
+ L HH M s n/a 22 3030 3097 3133 N
+ L HH N e n/a 22 3030 3097 3134 N
+ L HH N s n/a 22 3030 3097 3134 N
+ L HH NG e n/a 22 3030 3097 3133 N
+ L HH NG s n/a 22 3030 3097 3133 N
+ L HH OW b n/a 22 3035 3055 3165 N
+ L HH OW e n/a 22 3030 3065 3162 N
+ L HH OW s n/a 22 3030 3065 3165 N
+ L HH OY b n/a 22 3035 3060 3167 N
+ L HH OY e n/a 22 3030 3060 3173 N
+ L HH OY s n/a 22 3030 3060 3167 N
+ L HH P e n/a 22 3030 3102 3140 N
+ L HH P s n/a 22 3030 3102 3140 N
+ L HH R e n/a 22 3030 3099 3144 N
+ L HH R s n/a 22 3030 3099 3144 N
+ L HH S b n/a 22 3035 3101 3136 N
+ L HH S e n/a 22 3030 3101 3136 N
+ L HH S s n/a 22 3030 3101 3136 N
+ L HH SH e n/a 22 3030 3101 3137 N
+ L HH SH s n/a 22 3030 3101 3137 N
+ L HH SIL e n/a 22 3030 3118 3142 N
+ L HH SIL s n/a 22 3030 3118 3142 N
+ L HH T b n/a 22 3035 3102 3138 N
+ L HH T e n/a 22 3030 3102 3138 N
+ L HH T s n/a 22 3030 3102 3138 N
+ L HH TH e n/a 22 3030 3101 3136 N
+ L HH TH s n/a 22 3030 3101 3135 N
+ L HH UH b n/a 22 3035 3055 3189 N
+ L HH UH e n/a 22 3031 3055 3189 N
+ L HH UH s n/a 22 3031 3055 3189 N
+ L HH UW b n/a 22 3035 3057 3192 N
+ L HH UW e n/a 22 3031 3057 3192 N
+ L HH UW s n/a 22 3031 3057 3192 N
+ L HH V e n/a 22 3030 3097 3130 N
+ L HH V s n/a 22 3030 3097 3130 N
+ L HH W b n/a 22 3035 3098 3143 N
+ L HH W e n/a 22 3030 3098 3143 N
+ L HH W s n/a 22 3030 3098 3143 N
+ L HH Y b n/a 22 3035 3041 3149 N
+ L HH Y e n/a 22 3031 3041 3150 N
+ L HH Y s n/a 22 3031 3041 3149 N
+ L HH Z e n/a 22 3030 3096 3131 N
+ L HH Z s n/a 22 3030 3096 3131 N
+ L HH ZH e n/a 22 3030 3096 3130 N
+ L HH ZH s n/a 22 3030 3096 3130 N
+ L IH AA b n/a 22 3016 3073 3168 N
+ L IH AA e n/a 22 2989 3090 3162 N
+ L IH AA i n/a 22 3016 3073 3168 N
+ L IH AA s n/a 22 3016 3088 3168 N
+ L IH AE b n/a 22 3016 3076 3174 N
+ L IH AE e n/a 22 2989 3094 3180 N
+ L IH AE i n/a 22 3016 3076 3174 N
+ L IH AE s n/a 22 3016 3088 3174 N
+ L IH AH b n/a 22 3018 3075 3172 N
+ L IH AH e n/a 22 2989 3090 3161 N
+ L IH AH i n/a 22 3018 3085 3160 N
+ L IH AH s n/a 22 3018 3085 3172 N
+ L IH AO b n/a 22 3016 3073 3167 N
+ L IH AO e n/a 22 2989 3090 3162 N
+ L IH AO i n/a 22 3016 3073 3167 N
+ L IH AO s n/a 22 3016 3088 3167 N
+ L IH AW b n/a 22 3016 3076 3174 N
+ L IH AW e n/a 22 2989 3094 3180 N
+ L IH AW i n/a 22 3016 3076 3174 N
+ L IH AW s n/a 22 3016 3088 3174 N
+ L IH AY b n/a 22 3016 3075 3171 N
+ L IH AY e n/a 22 2989 3090 3173 N
+ L IH AY i n/a 22 3016 3075 3171 N
+ L IH AY s n/a 22 3016 3088 3171 N
+ L IH B e n/a 22 3001 3120 3128 N
+ L IH B i n/a 22 3001 3120 3126 N
+ L IH B s n/a 22 3001 3120 3126 N
+ L IH CH e n/a 22 3001 3110 3138 N
+ L IH CH i n/a 22 3001 3110 3138 N
+ L IH CH s n/a 22 3001 3110 3138 N
+ L IH D e n/a 22 3001 3120 3127 N
+ L IH D i n/a 22 3001 3120 3126 N
+ L IH D s n/a 22 3001 3120 3126 N
+ L IH DH e n/a 22 3001 3120 3129 N
+ L IH DH s n/a 22 3001 3120 3126 N
+ L IH EH b n/a 22 3016 3076 3178 N
+ L IH EH e n/a 22 2989 3094 3180 N
+ L IH EH i n/a 22 3016 3076 3178 N
+ L IH EH s n/a 22 3016 3088 3178 N
+ L IH ER b n/a 22 3018 3072 3188 N
+ L IH ER e n/a 22 2989 3090 3186 N
+ L IH ER i n/a 22 3018 3085 3188 N
+ L IH ER s n/a 22 3018 3085 3188 N
+ L IH EY b n/a 22 3016 3067 3155 N
+ L IH EY e n/a 22 2989 3082 3155 N
+ L IH EY i n/a 22 3016 3067 3155 N
+ L IH EY s n/a 22 3016 3082 3155 N
+ L IH F b n/a 22 3001 3110 3136 N
+ L IH F e n/a 22 3001 3110 3136 N
+ L IH F i n/a 22 3001 3110 3136 N
+ L IH F s n/a 22 3001 3110 3136 N
+ L IH G b n/a 22 3001 3120 3126 N
+ L IH G e n/a 22 3001 3120 3127 N
+ L IH G i n/a 22 3001 3120 3126 N
+ L IH G s n/a 22 3001 3120 3126 N
+ L IH HH b n/a 22 3001 3110 3132 N
+ L IH HH e n/a 22 3001 3110 3132 N
+ L IH HH i n/a 22 3001 3110 3132 N
+ L IH HH s n/a 22 3001 3110 3132 N
+ L IH IH b n/a 22 3018 3069 3191 N
+ L IH IH e n/a 22 2989 3094 3183 N
+ L IH IH i n/a 22 3018 3085 3185 N
+ L IH IH s n/a 22 3018 3085 3185 N
+ L IH IY b n/a 22 3015 3082 3148 N
+ L IH IY e n/a 22 2989 3082 3148 N
+ L IH IY i n/a 22 3015 3082 3145 N
+ L IH IY s n/a 22 3015 3082 3148 N
+ L IH JH b n/a 22 3001 3120 3126 N
+ L IH JH e n/a 22 3001 3120 3127 N
+ L IH JH i n/a 22 3001 3120 3126 N
+ L IH JH s n/a 22 3001 3120 3126 N
+ L IH K b n/a 22 3001 3110 3139 N
+ L IH K e n/a 22 3001 3110 3139 N
+ L IH K i n/a 22 3001 3110 3139 N
+ L IH K s n/a 22 3001 3110 3139 N
+ L IH L e n/a 22 3001 3120 3143 N
+ L IH L s n/a 22 3001 3120 3143 N
+ L IH M b n/a 22 3001 3121 3133 N
+ L IH M e n/a 22 3001 3121 3133 N
+ L IH M i n/a 22 3001 3121 3133 N
+ L IH M s n/a 22 3001 3121 3133 N
+ L IH N e n/a 22 3001 3121 3134 N
+ L IH N i n/a 22 3001 3121 3134 N
+ L IH N s n/a 22 3001 3121 3134 N
+ L IH NG e n/a 22 3001 3121 3133 N
+ L IH NG s n/a 22 3001 3121 3133 N
+ L IH OW b n/a 22 3016 3072 3165 N
+ L IH OW e n/a 22 2989 3090 3162 N
+ L IH OW i n/a 22 3016 3072 3165 N
+ L IH OW s n/a 22 3016 3088 3165 N
+ L IH OY b n/a 22 3016 3075 3167 N
+ L IH OY e n/a 22 2989 3090 3173 N
+ L IH OY i n/a 22 3016 3075 3167 N
+ L IH OY s n/a 22 3016 3088 3167 N
+ L IH P e n/a 22 3001 3110 3140 N
+ L IH P i n/a 22 3001 3110 3140 N
+ L IH P s n/a 22 3001 3110 3140 N
+ L IH R e n/a 22 3001 3120 3144 N
+ L IH R i n/a 22 3001 3120 3144 N
+ L IH R s n/a 22 3001 3120 3144 N
+ L IH S b n/a 22 3001 3110 3136 N
+ L IH S e n/a 22 3001 3110 3136 N
+ L IH S i n/a 22 3001 3110 3136 N
+ L IH S s n/a 22 3001 3110 3136 N
+ L IH SH e n/a 22 3001 3110 3137 N
+ L IH SH i n/a 22 3001 3110 3137 N
+ L IH SH s n/a 22 3001 3110 3137 N
+ L IH SIL e n/a 22 3002 3119 3142 N
+ L IH SIL s n/a 22 3002 3119 3142 N
+ L IH T b n/a 22 3001 3110 3138 N
+ L IH T e n/a 22 3001 3110 3138 N
+ L IH T i n/a 22 3001 3110 3138 N
+ L IH T s n/a 22 3001 3110 3138 N
+ L IH TH e n/a 22 3001 3110 3136 N
+ L IH TH i n/a 22 3001 3110 3136 N
+ L IH TH s n/a 22 3001 3110 3136 N
+ L IH UH b n/a 22 3016 3072 3189 N
+ L IH UH e n/a 22 2989 3094 3189 N
+ L IH UH i n/a 22 3016 3088 3189 N
+ L IH UH s n/a 22 3016 3088 3189 N
+ L IH UW b n/a 22 3016 3072 3192 N
+ L IH UW e n/a 22 2989 3094 3192 N
+ L IH UW i n/a 22 3016 3088 3192 N
+ L IH UW s n/a 22 3016 3088 3192 N
+ L IH V e n/a 22 3001 3120 3130 N
+ L IH V i n/a 22 3001 3120 3130 N
+ L IH V s n/a 22 3001 3120 3130 N
+ L IH W b n/a 22 3001 3120 3143 N
+ L IH W e n/a 22 3001 3120 3143 N
+ L IH W i n/a 22 3001 3120 3143 N
+ L IH W s n/a 22 3001 3120 3143 N
+ L IH Y b n/a 22 3004 3083 3149 N
+ L IH Y e n/a 22 3004 3083 3149 N
+ L IH Y i n/a 22 3004 3083 3149 N
+ L IH Y s n/a 22 3004 3083 3149 N
+ L IH Z e n/a 22 3002 3121 3131 N
+ L IH Z i n/a 22 3002 3121 3131 N
+ L IH Z s n/a 22 3002 3121 3131 N
+ L IH ZH e n/a 22 3002 3121 3130 N
+ L IH ZH s n/a 22 3002 3121 3130 N
+ L IY AA b n/a 22 3020 3071 3168 N
+ L IY AA e n/a 22 3019 3090 3162 N
+ L IY AA i n/a 22 3020 3074 3168 N
+ L IY AA s n/a 22 3016 3081 3168 N
+ L IY AE b n/a 22 3020 3066 3174 N
+ L IY AE e n/a 22 3019 3094 3180 N
+ L IY AE i n/a 22 3020 3066 3174 N
+ L IY AE s n/a 22 3016 3081 3174 N
+ L IY AH b n/a 22 3020 3066 3172 N
+ L IY AH e n/a 22 3019 3094 3161 N
+ L IY AH i n/a 22 3021 3078 3158 N
+ L IY AH s n/a 22 3018 3078 3172 N
+ L IY AO b n/a 22 3020 3071 3167 N
+ L IY AO e n/a 22 3019 3090 3162 N
+ L IY AO i n/a 22 3020 3074 3167 N
+ L IY AO s n/a 22 3016 3081 3167 N
+ L IY AW b n/a 22 3020 3066 3174 N
+ L IY AW e n/a 22 3019 3094 3180 N
+ L IY AW i n/a 22 3020 3066 3174 N
+ L IY AW s n/a 22 3016 3081 3174 N
+ L IY AY b n/a 22 3020 3074 3170 N
+ L IY AY e n/a 22 3019 3090 3173 N
+ L IY AY i n/a 22 3020 3074 3170 N
+ L IY AY s n/a 22 3016 3090 3170 N
+ L IY B e n/a 22 3003 3098 3128 N
+ L IY B i n/a 22 3003 3098 3126 N
+ L IY B s n/a 22 3003 3098 3126 N
+ L IY CH e n/a 22 3003 3102 3138 N
+ L IY CH i n/a 22 3003 3102 3138 N
+ L IY CH s n/a 22 3003 3102 3138 N
+ L IY D e n/a 22 3003 3098 3127 N
+ L IY D i n/a 22 3003 3098 3126 N
+ L IY D s n/a 22 3003 3098 3126 N
+ L IY DH e n/a 22 3003 3098 3129 N
+ L IY DH s n/a 22 3003 3098 3126 N
+ L IY EH b n/a 22 3020 3066 3179 N
+ L IY EH e n/a 22 3019 3094 3180 N
+ L IY EH i n/a 22 3020 3066 3179 N
+ L IY EH s n/a 22 3016 3078 3179 N
+ L IY ER b n/a 22 3020 3070 3188 N
+ L IY ER e n/a 22 3019 3094 3186 N
+ L IY ER i n/a 22 3021 3078 3188 N
+ L IY ER s n/a 22 3018 3078 3188 N
+ L IY EY b n/a 22 3020 3067 3155 N
+ L IY EY e n/a 22 3019 3081 3155 N
+ L IY EY i n/a 22 3020 3067 3155 N
+ L IY EY s n/a 22 3016 3081 3155 N
+ L IY F b n/a 22 3003 3101 3136 N
+ L IY F e n/a 22 3003 3101 3136 N
+ L IY F i n/a 22 3003 3100 3136 N
+ L IY F s n/a 22 3003 3101 3136 N
+ L IY G b n/a 22 3003 3098 3126 N
+ L IY G e n/a 22 3003 3098 3127 N
+ L IY G i n/a 22 3003 3098 3126 N
+ L IY G s n/a 22 3003 3098 3126 N
+ L IY HH b n/a 22 3003 3101 3132 N
+ L IY HH e n/a 22 3003 3101 3132 N
+ L IY HH i n/a 22 3003 3101 3132 N
+ L IY HH s n/a 22 3003 3101 3132 N
+ L IY IH b n/a 22 3020 3069 3190 N
+ L IY IH e n/a 22 3019 3094 3183 N
+ L IY IH i n/a 22 3021 3078 3181 N
+ L IY IH s n/a 22 3018 3078 3181 N
+ L IY IY b n/a 22 3020 3082 3148 N
+ L IY IY e n/a 22 3019 3081 3148 N
+ L IY IY i n/a 22 3020 3081 3145 N
+ L IY IY s n/a 22 3015 3081 3148 N
+ L IY JH b n/a 22 3003 3098 3126 N
+ L IY JH e n/a 22 3003 3098 3127 N
+ L IY JH i n/a 22 3003 3098 3126 N
+ L IY JH s n/a 22 3003 3098 3126 N
+ L IY K b n/a 22 3003 3102 3139 N
+ L IY K e n/a 22 3003 3102 3139 N
+ L IY K i n/a 22 3003 3102 3139 N
+ L IY K s n/a 22 3003 3102 3139 N
+ L IY L e n/a 22 3003 3099 3143 N
+ L IY L i n/a 22 3003 3099 3143 N
+ L IY L s n/a 22 3003 3099 3143 N
+ L IY M b n/a 22 3003 3098 3133 N
+ L IY M e n/a 22 3003 3098 3133 N
+ L IY M i n/a 22 3003 3098 3133 N
+ L IY M s n/a 22 3003 3098 3133 N
+ L IY N e n/a 22 3003 3098 3134 N
+ L IY N i n/a 22 3003 3098 3134 N
+ L IY N s n/a 22 3003 3098 3134 N
+ L IY NG e n/a 22 3003 3098 3133 N
+ L IY NG s n/a 22 3003 3098 3133 N
+ L IY OW b n/a 22 3020 3070 3165 N
+ L IY OW e n/a 22 3019 3090 3162 N
+ L IY OW i n/a 22 3020 3077 3163 N
+ L IY OW s n/a 22 3016 3081 3165 N
+ L IY OY b n/a 22 3020 3074 3167 N
+ L IY OY e n/a 22 3019 3090 3173 N
+ L IY OY i n/a 22 3020 3074 3167 N
+ L IY OY s n/a 22 3016 3090 3167 N
+ L IY P e n/a 22 3003 3102 3140 N
+ L IY P i n/a 22 3003 3102 3140 N
+ L IY P s n/a 22 3003 3102 3140 N
+ L IY R e n/a 22 3003 3099 3144 N
+ L IY R i n/a 22 3003 3099 3144 N
+ L IY R s n/a 22 3003 3099 3144 N
+ L IY S b n/a 22 3003 3101 3136 N
+ L IY S e n/a 22 3003 3101 3136 N
+ L IY S i n/a 22 3003 3101 3136 N
+ L IY S s n/a 22 3003 3101 3136 N
+ L IY SH e n/a 22 3003 3101 3137 N
+ L IY SH i n/a 22 3003 3101 3137 N
+ L IY SH s n/a 22 3003 3101 3137 N
+ L IY SIL e n/a 22 3003 3119 3141 N
+ L IY SIL s n/a 22 3003 3119 3141 N
+ L IY T b n/a 22 3003 3102 3138 N
+ L IY T e n/a 22 3003 3102 3138 N
+ L IY T i n/a 22 3003 3102 3138 N
+ L IY T s n/a 22 3003 3102 3138 N
+ L IY TH e n/a 22 3003 3101 3136 N
+ L IY TH i n/a 22 3003 3101 3136 N
+ L IY TH s n/a 22 3003 3101 3136 N
+ L IY UH b n/a 22 3020 3070 3189 N
+ L IY UH e n/a 22 3019 3094 3189 N
+ L IY UH s n/a 22 3016 3078 3189 N
+ L IY UW b n/a 22 3020 3070 3192 N
+ L IY UW e n/a 22 3019 3094 3192 N
+ L IY UW i n/a 22 3020 3081 3192 N
+ L IY UW s n/a 22 3016 3081 3192 N
+ L IY V e n/a 22 3003 3098 3130 N
+ L IY V i n/a 22 3003 3098 3130 N
+ L IY V s n/a 22 3003 3098 3130 N
+ L IY W b n/a 22 3003 3099 3143 N
+ L IY W e n/a 22 3003 3099 3143 N
+ L IY W i n/a 22 3003 3099 3143 N
+ L IY W s n/a 22 3003 3099 3143 N
+ L IY Y b n/a 22 3004 3083 3149 N
+ L IY Y e n/a 22 3004 3083 3149 N
+ L IY Y i n/a 22 3004 3083 3149 N
+ L IY Y s n/a 22 3004 3083 3149 N
+ L IY Z e n/a 22 3003 3096 3131 N
+ L IY Z i n/a 22 3003 3096 3131 N
+ L IY Z s n/a 22 3003 3096 3131 N
+ L IY ZH e n/a 22 3003 3096 3130 N
+ L IY ZH s n/a 22 3003 3096 3130 N
+ L JH AA b n/a 22 3035 3064 3168 N
+ L JH AA e n/a 22 3030 3064 3162 N
+ L JH AA s n/a 22 3030 3064 3168 N
+ L JH AE b n/a 22 3035 3063 3174 N
+ L JH AE e n/a 22 3030 3063 3180 N
+ L JH AE s n/a 22 3030 3063 3174 N
+ L JH AH b n/a 22 3035 3061 3172 N
+ L JH AH e n/a 22 3030 3061 3161 N
+ L JH AH i n/a 22 3030 3049 3156 N
+ L JH AH s n/a 22 3030 3061 3172 N
+ L JH AO b n/a 22 3035 3064 3167 N
+ L JH AO e n/a 22 3030 3064 3162 N
+ L JH AO s n/a 22 3030 3064 3167 N
+ L JH AW b n/a 22 3035 3065 3174 N
+ L JH AW e n/a 22 3030 3065 3180 N
+ L JH AW s n/a 22 3030 3065 3174 N
+ L JH AY b n/a 22 3035 3060 3170 N
+ L JH AY e n/a 22 3030 3060 3173 N
+ L JH AY s n/a 22 3030 3060 3170 N
+ L JH B e n/a 22 3030 3097 3128 N
+ L JH B s n/a 22 3030 3097 3125 N
+ L JH CH e n/a 22 3030 3102 3138 N
+ L JH CH s n/a 22 3030 3102 3138 N
+ L JH D e n/a 22 3030 3097 3127 N
+ L JH D s n/a 22 3030 3097 3125 N
+ L JH DH e n/a 22 3030 3097 3129 N
+ L JH DH s n/a 22 3030 3097 3125 N
+ L JH EH b n/a 22 3035 3054 3178 N
+ L JH EH e n/a 22 3030 3061 3180 N
+ L JH EH s n/a 22 3030 3061 3178 N
+ L JH ER b n/a 22 3035 3065 3188 N
+ L JH ER e n/a 22 3030 3065 3186 N
+ L JH ER s n/a 22 3030 3065 3188 N
+ L JH EY b n/a 22 3035 3054 3155 N
+ L JH EY e n/a 22 3030 3060 3155 N
+ L JH EY s n/a 22 3030 3060 3155 N
+ L JH F b n/a 22 3035 3101 3135 N
+ L JH F e n/a 22 3030 3101 3136 N
+ L JH F s n/a 22 3030 3101 3135 N
+ L JH G b n/a 22 3035 3097 3125 N
+ L JH G e n/a 22 3030 3097 3127 N
+ L JH G s n/a 22 3030 3097 3125 N
+ L JH HH b n/a 22 3035 3101 3132 N
+ L JH HH e n/a 22 3030 3101 3132 N
+ L JH HH s n/a 22 3030 3101 3132 N
+ L JH IH b n/a 22 3035 3057 3190 N
+ L JH IH e n/a 22 3031 3057 3181 N
+ L JH IH i n/a 22 3031 3049 3181 N
+ L JH IH s n/a 22 3031 3057 3181 N
+ L JH IY b n/a 22 3035 3041 3148 N
+ L JH IY e n/a 22 3031 3041 3148 N
+ L JH IY i n/a 22 3031 3042 3151 N
+ L JH IY s n/a 22 3031 3041 3148 N
+ L JH JH b n/a 22 3035 3097 3125 N
+ L JH JH e n/a 22 3030 3097 3127 N
+ L JH JH s n/a 22 3030 3097 3125 N
+ L JH K b n/a 22 3035 3102 3139 N
+ L JH K e n/a 22 3030 3102 3139 N
+ L JH K s n/a 22 3030 3102 3139 N
+ L JH L e n/a 22 3030 3098 3143 N
+ L JH L s n/a 22 3030 3098 3143 N
+ L JH M b n/a 22 3035 3097 3133 N
+ L JH M e n/a 22 3030 3097 3133 N
+ L JH M s n/a 22 3030 3097 3133 N
+ L JH N e n/a 22 3030 3097 3134 N
+ L JH N s n/a 22 3030 3097 3134 N
+ L JH NG e n/a 22 3030 3097 3133 N
+ L JH NG s n/a 22 3030 3097 3133 N
+ L JH OW b n/a 22 3035 3055 3165 N
+ L JH OW e n/a 22 3030 3065 3162 N
+ L JH OW s n/a 22 3030 3065 3165 N
+ L JH OY b n/a 22 3035 3060 3167 N
+ L JH OY e n/a 22 3030 3060 3173 N
+ L JH OY s n/a 22 3030 3060 3167 N
+ L JH P e n/a 22 3030 3102 3140 N
+ L JH P s n/a 22 3030 3102 3140 N
+ L JH R e n/a 22 3030 3099 3144 N
+ L JH R s n/a 22 3030 3099 3144 N
+ L JH S b n/a 22 3035 3101 3136 N
+ L JH S e n/a 22 3030 3101 3136 N
+ L JH S s n/a 22 3030 3101 3136 N
+ L JH SH e n/a 22 3030 3101 3137 N
+ L JH SH s n/a 22 3030 3101 3137 N
+ L JH SIL e n/a 22 3030 3118 3142 N
+ L JH SIL s n/a 22 3030 3118 3142 N
+ L JH T b n/a 22 3035 3102 3138 N
+ L JH T e n/a 22 3030 3102 3138 N
+ L JH T s n/a 22 3030 3102 3138 N
+ L JH TH e n/a 22 3030 3101 3136 N
+ L JH TH s n/a 22 3030 3101 3135 N
+ L JH UH b n/a 22 3035 3055 3189 N
+ L JH UH e n/a 22 3031 3055 3189 N
+ L JH UH s n/a 22 3031 3055 3189 N
+ L JH UW b n/a 22 3035 3057 3192 N
+ L JH UW e n/a 22 3031 3057 3192 N
+ L JH UW s n/a 22 3031 3057 3192 N
+ L JH V e n/a 22 3030 3097 3130 N
+ L JH V s n/a 22 3030 3097 3130 N
+ L JH W b n/a 22 3035 3098 3143 N
+ L JH W e n/a 22 3030 3098 3143 N
+ L JH W s n/a 22 3030 3098 3143 N
+ L JH Y b n/a 22 3035 3041 3149 N
+ L JH Y e n/a 22 3031 3041 3150 N
+ L JH Y s n/a 22 3031 3041 3149 N
+ L JH Z e n/a 22 3030 3096 3131 N
+ L JH Z s n/a 22 3030 3096 3131 N
+ L JH ZH e n/a 22 3030 3096 3130 N
+ L JH ZH s n/a 22 3030 3096 3130 N
+ L K AA b n/a 22 3035 3064 3168 N
+ L K AA e n/a 22 3030 3058 3162 N
+ L K AA i n/a 22 3027 3058 3168 N
+ L K AA s n/a 22 3030 3058 3168 N
+ L K AE b n/a 22 3035 3063 3176 N
+ L K AE e n/a 22 3030 3063 3180 N
+ L K AE i n/a 22 3026 3047 3176 N
+ L K AE s n/a 22 3030 3063 3176 N
+ L K AH b n/a 22 3035 3061 3172 N
+ L K AH e n/a 22 3030 3061 3161 N
+ L K AH i n/a 22 3027 3051 3157 N
+ L K AH s n/a 22 3030 3061 3172 N
+ L K AO b n/a 22 3035 3064 3167 N
+ L K AO e n/a 22 3030 3059 3162 N
+ L K AO i n/a 22 3027 3059 3167 N
+ L K AO s n/a 22 3030 3059 3167 N
+ L K AW b n/a 22 3035 3065 3176 N
+ L K AW e n/a 22 3030 3058 3180 N
+ L K AW i n/a 22 3026 3047 3176 N
+ L K AW s n/a 22 3030 3058 3176 N
+ L K AY b n/a 22 3035 3060 3170 N
+ L K AY e n/a 22 3030 3060 3173 N
+ L K AY i n/a 22 3027 3058 3169 N
+ L K AY s n/a 22 3030 3060 3169 N
+ L K B e n/a 22 3030 3097 3128 N
+ L K B s n/a 22 3030 3097 3125 N
+ L K CH e n/a 22 3030 3102 3138 N
+ L K CH s n/a 22 3030 3102 3138 N
+ L K D e n/a 22 3030 3097 3127 N
+ L K D s n/a 22 3030 3097 3125 N
+ L K DH e n/a 22 3030 3097 3129 N
+ L K DH s n/a 22 3030 3097 3125 N
+ L K EH b n/a 22 3035 3054 3178 N
+ L K EH e n/a 22 3030 3061 3180 N
+ L K EH i n/a 22 3026 3048 3177 N
+ L K EH s n/a 22 3030 3061 3178 N
+ L K ER b n/a 22 3035 3065 3188 N
+ L K ER e n/a 22 3030 3059 3186 N
+ L K ER i n/a 22 3027 3059 3188 N
+ L K ER s n/a 22 3030 3059 3188 N
+ L K EY b n/a 22 3035 3054 3155 N
+ L K EY e n/a 22 3030 3060 3155 N
+ L K EY i n/a 22 3026 3048 3154 N
+ L K EY s n/a 22 3030 3060 3155 N
+ L K F b n/a 22 3035 3101 3135 N
+ L K F e n/a 22 3030 3101 3136 N
+ L K F s n/a 22 3030 3101 3135 N
+ L K G b n/a 22 3035 3097 3125 N
+ L K G e n/a 22 3030 3097 3127 N
+ L K G i n/a 22 3026 3097 3125 N
+ L K G s n/a 22 3030 3097 3125 N
+ L K HH b n/a 22 3035 3101 3132 N
+ L K HH e n/a 22 3030 3101 3132 N
+ L K HH s n/a 22 3030 3101 3132 N
+ L K IH b n/a 22 3035 3057 3190 N
+ L K IH e n/a 22 3031 3057 3182 N
+ L K IH i n/a 22 3029 3050 3182 N
+ L K IH s n/a 22 3031 3057 3182 N
+ L K IY b n/a 22 3035 3041 3148 N
+ L K IY e n/a 22 3031 3041 3148 N
+ L K IY i n/a 22 3029 3040 3151 N
+ L K IY s n/a 22 3031 3041 3148 N
+ L K JH b n/a 22 3035 3097 3125 N
+ L K JH e n/a 22 3030 3097 3127 N
+ L K JH s n/a 22 3030 3097 3125 N
+ L K K b n/a 22 3035 3102 3139 N
+ L K K e n/a 22 3030 3102 3139 N
+ L K K s n/a 22 3030 3102 3139 N
+ L K L e n/a 22 3030 3098 3143 N
+ L K L s n/a 22 3030 3098 3143 N
+ L K M b n/a 22 3035 3097 3133 N
+ L K M e n/a 22 3030 3097 3133 N
+ L K M i n/a 22 3026 3097 3133 N
+ L K M s n/a 22 3030 3097 3133 N
+ L K N e n/a 22 3030 3097 3134 N
+ L K N i n/a 22 3026 3097 3134 N
+ L K N s n/a 22 3030 3097 3134 N
+ L K NG e n/a 22 3030 3097 3133 N
+ L K NG s n/a 22 3030 3097 3133 N
+ L K OW b n/a 22 3035 3055 3164 N
+ L K OW e n/a 22 3030 3059 3162 N
+ L K OW i n/a 22 3027 3059 3164 N
+ L K OW s n/a 22 3030 3059 3164 N
+ L K OY b n/a 22 3035 3060 3167 N
+ L K OY e n/a 22 3030 3060 3173 N
+ L K OY i n/a 22 3027 3059 3167 N
+ L K OY s n/a 22 3030 3060 3167 N
+ L K P e n/a 22 3030 3102 3140 N
+ L K P s n/a 22 3030 3102 3140 N
+ L K R e n/a 22 3030 3099 3144 N
+ L K R s n/a 22 3030 3099 3144 N
+ L K S b n/a 22 3035 3101 3136 N
+ L K S e n/a 22 3030 3101 3136 N
+ L K S s n/a 22 3030 3101 3136 N
+ L K SH e n/a 22 3030 3101 3137 N
+ L K SH s n/a 22 3030 3101 3137 N
+ L K SIL e n/a 22 3030 3118 3142 N
+ L K SIL s n/a 22 3030 3118 3142 N
+ L K T b n/a 22 3035 3102 3138 N
+ L K T e n/a 22 3030 3102 3138 N
+ L K T s n/a 22 3030 3102 3138 N
+ L K TH e n/a 22 3030 3101 3136 N
+ L K TH s n/a 22 3030 3101 3135 N
+ L K UH b n/a 22 3035 3055 3189 N
+ L K UH e n/a 22 3031 3055 3189 N
+ L K UH i n/a 22 3029 3056 3189 N
+ L K UH s n/a 22 3031 3055 3189 N
+ L K UW b n/a 22 3035 3057 3192 N
+ L K UW e n/a 22 3031 3057 3192 N
+ L K UW i n/a 22 3029 3056 3192 N
+ L K UW s n/a 22 3031 3057 3192 N
+ L K V e n/a 22 3030 3097 3130 N
+ L K V s n/a 22 3030 3097 3130 N
+ L K W b n/a 22 3035 3098 3143 N
+ L K W e n/a 22 3030 3098 3143 N
+ L K W s n/a 22 3030 3098 3143 N
+ L K Y b n/a 22 3035 3041 3149 N
+ L K Y e n/a 22 3031 3041 3150 N
+ L K Y s n/a 22 3031 3041 3149 N
+ L K Z e n/a 22 3030 3096 3131 N
+ L K Z s n/a 22 3030 3096 3131 N
+ L K ZH e n/a 22 3030 3096 3130 N
+ L K ZH s n/a 22 3030 3096 3130 N
+ L L AA b n/a 22 3008 3071 3168 N
+ L L AA e n/a 22 2988 3090 3162 N
+ L L AA s n/a 22 3006 3088 3168 N
+ L L AE b n/a 22 3008 3066 3174 N
+ L L AE e n/a 22 2988 3091 3180 N
+ L L AE s n/a 22 3006 3088 3174 N
+ L L AH b n/a 22 3008 3066 3172 N
+ L L AH e n/a 22 2988 3090 3161 N
+ L L AH i n/a 22 3006 3086 3160 N
+ L L AH s n/a 22 3006 3086 3172 N
+ L L AO b n/a 22 3008 3071 3167 N
+ L L AO e n/a 22 2988 3090 3162 N
+ L L AO s n/a 22 3006 3088 3167 N
+ L L AW b n/a 22 3008 3066 3174 N
+ L L AW e n/a 22 2988 3091 3180 N
+ L L AW s n/a 22 3006 3088 3174 N
+ L L AY b n/a 22 3008 3074 3171 N
+ L L AY e n/a 22 2988 3090 3173 N
+ L L AY i n/a 22 3006 3074 3171 N
+ L L AY s n/a 22 3006 3088 3171 N
+ L L B e n/a 22 2978 3104 3128 N
+ L L B s n/a 22 2978 3104 3125 N
+ L L CH e n/a 22 2978 3113 3138 N
+ L L CH s n/a 22 2978 3113 3138 N
+ L L D e n/a 22 2978 3104 3127 N
+ L L D s n/a 22 2978 3104 3125 N
+ L L DH e n/a 22 2978 3105 3129 N
+ L L DH s n/a 22 2978 3105 3125 N
+ L L EH b n/a 22 3008 3066 3178 N
+ L L EH e n/a 22 2988 3091 3180 N
+ L L EH s n/a 22 3006 3088 3178 N
+ L L ER b n/a 22 3008 3070 3188 N
+ L L ER e n/a 22 2988 3090 3186 N
+ L L ER s n/a 22 3006 3087 3188 N
+ L L EY b n/a 22 3008 3067 3155 N
+ L L EY e n/a 22 2988 3079 3155 N
+ L L EY s n/a 22 3006 3079 3155 N
+ L L F b n/a 22 2978 3115 3135 N
+ L L F e n/a 22 2978 3115 3136 N
+ L L F s n/a 22 2978 3115 3135 N
+ L L G b n/a 22 2978 3104 3125 N
+ L L G e n/a 22 2978 3104 3127 N
+ L L G s n/a 22 2978 3104 3125 N
+ L L HH b n/a 22 2978 3111 3132 N
+ L L HH e n/a 22 2978 3111 3132 N
+ L L HH s n/a 22 2978 3111 3132 N
+ L L IH b n/a 22 3008 3069 3190 N
+ L L IH e n/a 22 2988 3091 3183 N
+ L L IH s n/a 22 3006 3086 3183 N
+ L L IY b n/a 22 3008 3082 3148 N
+ L L IY e n/a 22 2988 3079 3148 N
+ L L IY i n/a 22 3006 3079 3147 N
+ L L IY s n/a 22 3006 3079 3148 N
+ L L JH b n/a 22 2978 3104 3125 N
+ L L JH e n/a 22 2978 3104 3127 N
+ L L JH s n/a 22 2978 3104 3125 N
+ L L K b n/a 22 2978 3114 3139 N
+ L L K e n/a 22 2978 3114 3139 N
+ L L K s n/a 22 2978 3114 3139 N
+ L L L e n/a 22 2978 3124 3143 N
+ L L L s n/a 22 2978 3124 3143 N
+ L L M b n/a 22 2978 3108 3133 N
+ L L M e n/a 22 2978 3108 3133 N
+ L L M s n/a 22 2978 3108 3133 N
+ L L N e n/a 22 2978 3108 3134 N
+ L L N s n/a 22 2978 3108 3134 N
+ L L NG e n/a 22 2978 3108 3133 N
+ L L NG s n/a 22 2978 3108 3133 N
+ L L OW b n/a 22 3008 3070 3165 N
+ L L OW e n/a 22 2988 3090 3162 N
+ L L OW s n/a 22 3006 3088 3165 N
+ L L OY b n/a 22 3008 3074 3167 N
+ L L OY e n/a 22 2988 3090 3173 N
+ L L OY s n/a 22 3006 3088 3167 N
+ L L P e n/a 22 2978 3114 3140 N
+ L L P s n/a 22 2978 3114 3140 N
+ L L R e n/a 22 2978 3109 3144 N
+ L L R s n/a 22 2978 3109 3144 N
+ L L S b n/a 22 2978 3115 3136 N
+ L L S e n/a 22 2978 3115 3136 N
+ L L S s n/a 22 2978 3115 3136 N
+ L L SH e n/a 22 2978 3115 3137 N
+ L L SH s n/a 22 2978 3115 3137 N
+ L L SIL e n/a 22 2978 3118 3142 N
+ L L SIL s n/a 22 2978 3118 3142 N
+ L L T b n/a 22 2978 3113 3138 N
+ L L T e n/a 22 2978 3113 3138 N
+ L L T s n/a 22 2978 3113 3138 N
+ L L TH e n/a 22 2978 3115 3136 N
+ L L TH s n/a 22 2978 3115 3135 N
+ L L UH b n/a 22 3008 3070 3189 N
+ L L UH e n/a 22 2988 3091 3189 N
+ L L UH s n/a 22 3006 3088 3189 N
+ L L UW b n/a 22 3008 3070 3192 N
+ L L UW e n/a 22 2988 3091 3192 N
+ L L UW i n/a 22 3006 3088 3192 N
+ L L UW s n/a 22 3006 3088 3192 N
+ L L V e n/a 22 2978 3107 3130 N
+ L L V s n/a 22 2978 3107 3130 N
+ L L W b n/a 22 2978 3124 3143 N
+ L L W e n/a 22 2978 3124 3143 N
+ L L W s n/a 22 2978 3124 3143 N
+ L L Y b n/a 22 2978 3084 3150 N
+ L L Y e n/a 22 2978 3084 3150 N
+ L L Y s n/a 22 2978 3084 3150 N
+ L L Z e n/a 22 2978 3123 3131 N
+ L L Z s n/a 22 2978 3123 3131 N
+ L L ZH e n/a 22 2978 3105 3130 N
+ L L ZH s n/a 22 2978 3105 3130 N
+ L M AA b n/a 22 3039 3064 3168 N
+ L M AA e n/a 22 3039 3064 3162 N
+ L M AA i n/a 22 3039 3064 3168 N
+ L M AA s n/a 22 3039 3064 3168 N
+ L M AE b n/a 22 3039 3063 3174 N
+ L M AE e n/a 22 3039 3063 3180 N
+ L M AE i n/a 22 3039 3052 3175 N
+ L M AE s n/a 22 3039 3063 3174 N
+ L M AH b n/a 22 3039 3062 3172 N
+ L M AH e n/a 22 3039 3062 3161 N
+ L M AH i n/a 22 3039 3052 3156 N
+ L M AH s n/a 22 3039 3062 3172 N
+ L M AO b n/a 22 3039 3064 3167 N
+ L M AO e n/a 22 3039 3064 3162 N
+ L M AO i n/a 22 3039 3064 3167 N
+ L M AO s n/a 22 3039 3064 3167 N
+ L M AW b n/a 22 3039 3065 3175 N
+ L M AW e n/a 22 3039 3065 3180 N
+ L M AW i n/a 22 3039 3052 3175 N
+ L M AW s n/a 22 3039 3065 3175 N
+ L M AY b n/a 22 3039 3062 3171 N
+ L M AY e n/a 22 3039 3062 3173 N
+ L M AY i n/a 22 3039 3062 3171 N
+ L M AY s n/a 22 3039 3062 3171 N
+ L M B e n/a 22 3039 3097 3128 N
+ L M B s n/a 22 3039 3097 3125 N
+ L M CH e n/a 22 3039 3102 3138 N
+ L M CH s n/a 22 3039 3102 3138 N
+ L M D e n/a 22 3039 3097 3127 N
+ L M D s n/a 22 3039 3097 3125 N
+ L M DH e n/a 22 3039 3097 3129 N
+ L M DH s n/a 22 3039 3097 3125 N
+ L M EH b n/a 22 3039 3054 3178 N
+ L M EH e n/a 22 3039 3062 3180 N
+ L M EH i n/a 22 3039 3052 3178 N
+ L M EH s n/a 22 3039 3062 3178 N
+ L M ER b n/a 22 3039 3065 3188 N
+ L M ER e n/a 22 3039 3065 3186 N
+ L M ER i n/a 22 3039 3065 3188 N
+ L M ER s n/a 22 3039 3065 3188 N
+ L M EY b n/a 22 3039 3054 3155 N
+ L M EY e n/a 22 3039 3063 3155 N
+ L M EY i n/a 22 3039 3052 3154 N
+ L M EY s n/a 22 3039 3063 3155 N
+ L M F b n/a 22 3039 3101 3135 N
+ L M F e n/a 22 3039 3101 3136 N
+ L M F s n/a 22 3039 3101 3135 N
+ L M G b n/a 22 3039 3097 3125 N
+ L M G e n/a 22 3039 3097 3127 N
+ L M G s n/a 22 3039 3097 3125 N
+ L M HH b n/a 22 3039 3101 3132 N
+ L M HH e n/a 22 3039 3101 3132 N
+ L M HH s n/a 22 3039 3101 3132 N
+ L M IH b n/a 22 3039 3057 3190 N
+ L M IH e n/a 22 3039 3057 3182 N
+ L M IH i n/a 22 3038 3049 3182 N
+ L M IH s n/a 22 3039 3057 3182 N
+ L M IY b n/a 22 3039 3043 3153 N
+ L M IY e n/a 22 3039 3043 3153 N
+ L M IY i n/a 22 3038 3044 3152 N
+ L M IY s n/a 22 3039 3043 3153 N
+ L M JH b n/a 22 3039 3097 3125 N
+ L M JH e n/a 22 3039 3097 3127 N
+ L M JH s n/a 22 3039 3097 3125 N
+ L M K b n/a 22 3039 3102 3139 N
+ L M K e n/a 22 3039 3102 3139 N
+ L M K s n/a 22 3039 3102 3139 N
+ L M L e n/a 22 3039 3098 3143 N
+ L M L s n/a 22 3039 3098 3143 N
+ L M M b n/a 22 3039 3097 3133 N
+ L M M e n/a 22 3039 3097 3133 N
+ L M M s n/a 22 3039 3097 3133 N
+ L M N e n/a 22 3039 3097 3134 N
+ L M N s n/a 22 3039 3097 3134 N
+ L M NG e n/a 22 3039 3097 3133 N
+ L M NG s n/a 22 3039 3097 3133 N
+ L M OW b n/a 22 3039 3055 3165 N
+ L M OW e n/a 22 3039 3065 3162 N
+ L M OW i n/a 22 3039 3065 3165 N
+ L M OW s n/a 22 3039 3065 3165 N
+ L M OY b n/a 22 3039 3062 3167 N
+ L M OY e n/a 22 3039 3062 3173 N
+ L M OY s n/a 22 3039 3062 3167 N
+ L M P e n/a 22 3039 3102 3140 N
+ L M P s n/a 22 3039 3102 3140 N
+ L M R e n/a 22 3039 3099 3144 N
+ L M R s n/a 22 3039 3099 3144 N
+ L M S b n/a 22 3039 3101 3136 N
+ L M S e n/a 22 3039 3101 3136 N
+ L M S s n/a 22 3039 3101 3136 N
+ L M SH e n/a 22 3039 3101 3137 N
+ L M SH s n/a 22 3039 3101 3137 N
+ L M SIL e n/a 22 3039 3118 3142 N
+ L M SIL s n/a 22 3039 3118 3142 N
+ L M T b n/a 22 3039 3102 3138 N
+ L M T e n/a 22 3039 3102 3138 N
+ L M T s n/a 22 3039 3102 3138 N
+ L M TH e n/a 22 3039 3101 3136 N
+ L M TH s n/a 22 3039 3101 3135 N
+ L M UH b n/a 22 3039 3055 3189 N
+ L M UH e n/a 22 3039 3055 3189 N
+ L M UH s n/a 22 3039 3055 3189 N
+ L M UW b n/a 22 3039 3057 3192 N
+ L M UW e n/a 22 3039 3057 3192 N
+ L M UW i n/a 22 3038 3057 3192 N
+ L M UW s n/a 22 3039 3057 3192 N
+ L M V e n/a 22 3039 3097 3130 N
+ L M V s n/a 22 3039 3097 3130 N
+ L M W b n/a 22 3039 3098 3143 N
+ L M W e n/a 22 3039 3098 3143 N
+ L M W s n/a 22 3039 3098 3143 N
+ L M Y b n/a 22 3039 3043 3153 N
+ L M Y e n/a 22 3039 3043 3153 N
+ L M Y s n/a 22 3039 3043 3153 N
+ L M Z e n/a 22 3039 3096 3131 N
+ L M Z i n/a 22 3039 3096 3131 N
+ L M Z s n/a 22 3039 3096 3131 N
+ L M ZH e n/a 22 3039 3096 3130 N
+ L M ZH s n/a 22 3039 3096 3130 N
+ L N AA b n/a 22 3039 3064 3168 N
+ L N AA e n/a 22 3039 3064 3162 N
+ L N AA i n/a 22 3039 3064 3168 N
+ L N AA s n/a 22 3039 3064 3168 N
+ L N AE b n/a 22 3039 3063 3174 N
+ L N AE e n/a 22 3039 3063 3180 N
+ L N AE i n/a 22 3039 3052 3174 N
+ L N AE s n/a 22 3039 3063 3174 N
+ L N AH b n/a 22 3039 3062 3172 N
+ L N AH e n/a 22 3039 3062 3161 N
+ L N AH i n/a 22 3039 3049 3160 N
+ L N AH s n/a 22 3039 3062 3172 N
+ L N AO b n/a 22 3039 3064 3167 N
+ L N AO e n/a 22 3039 3064 3162 N
+ L N AO i n/a 22 3039 3064 3167 N
+ L N AO s n/a 22 3039 3064 3167 N
+ L N AW b n/a 22 3039 3065 3174 N
+ L N AW e n/a 22 3039 3065 3180 N
+ L N AW i n/a 22 3039 3052 3174 N
+ L N AW s n/a 22 3039 3065 3174 N
+ L N AY b n/a 22 3039 3062 3171 N
+ L N AY e n/a 22 3039 3062 3173 N
+ L N AY i n/a 22 3039 3062 3171 N
+ L N AY s n/a 22 3039 3062 3171 N
+ L N B e n/a 22 3039 3097 3128 N
+ L N B s n/a 22 3039 3097 3125 N
+ L N CH e n/a 22 3039 3102 3138 N
+ L N CH s n/a 22 3039 3102 3138 N
+ L N D e n/a 22 3039 3097 3127 N
+ L N D s n/a 22 3039 3097 3125 N
+ L N DH e n/a 22 3039 3097 3129 N
+ L N DH s n/a 22 3039 3097 3125 N
+ L N EH b n/a 22 3039 3054 3178 N
+ L N EH e n/a 22 3039 3062 3180 N
+ L N EH i n/a 22 3039 3049 3178 N
+ L N EH s n/a 22 3039 3062 3178 N
+ L N ER b n/a 22 3039 3065 3188 N
+ L N ER e n/a 22 3039 3065 3186 N
+ L N ER i n/a 22 3039 3065 3188 N
+ L N ER s n/a 22 3039 3065 3188 N
+ L N EY b n/a 22 3039 3054 3155 N
+ L N EY e n/a 22 3039 3063 3155 N
+ L N EY i n/a 22 3039 3049 3154 N
+ L N EY s n/a 22 3039 3063 3155 N
+ L N F b n/a 22 3039 3101 3135 N
+ L N F e n/a 22 3039 3101 3136 N
+ L N F s n/a 22 3039 3101 3135 N
+ L N G b n/a 22 3039 3097 3125 N
+ L N G e n/a 22 3039 3097 3127 N
+ L N G s n/a 22 3039 3097 3125 N
+ L N HH b n/a 22 3039 3101 3132 N
+ L N HH e n/a 22 3039 3101 3132 N
+ L N HH s n/a 22 3039 3101 3132 N
+ L N IH b n/a 22 3039 3057 3190 N
+ L N IH e n/a 22 3039 3057 3181 N
+ L N IH i n/a 22 3038 3049 3181 N
+ L N IH s n/a 22 3039 3057 3181 N
+ L N IY b n/a 22 3039 3041 3151 N
+ L N IY e n/a 22 3039 3041 3151 N
+ L N IY i n/a 22 3037 3045 3152 N
+ L N IY s n/a 22 3039 3041 3151 N
+ L N JH b n/a 22 3039 3097 3125 N
+ L N JH e n/a 22 3039 3097 3127 N
+ L N JH s n/a 22 3039 3097 3125 N
+ L N K b n/a 22 3039 3102 3139 N
+ L N K e n/a 22 3039 3102 3139 N
+ L N K s n/a 22 3039 3102 3139 N
+ L N L e n/a 22 3039 3098 3143 N
+ L N L s n/a 22 3039 3098 3143 N
+ L N M b n/a 22 3039 3097 3133 N
+ L N M e n/a 22 3039 3097 3133 N
+ L N M s n/a 22 3039 3097 3133 N
+ L N N e n/a 22 3039 3097 3134 N
+ L N N s n/a 22 3039 3097 3134 N
+ L N NG e n/a 22 3039 3097 3133 N
+ L N NG s n/a 22 3039 3097 3133 N
+ L N OW b n/a 22 3039 3055 3165 N
+ L N OW e n/a 22 3039 3065 3162 N
+ L N OW i n/a 22 3039 3065 3165 N
+ L N OW s n/a 22 3039 3065 3165 N
+ L N OY b n/a 22 3039 3062 3167 N
+ L N OY e n/a 22 3039 3062 3173 N
+ L N OY i n/a 22 3039 3062 3167 N
+ L N OY s n/a 22 3039 3062 3167 N
+ L N P e n/a 22 3039 3102 3140 N
+ L N P s n/a 22 3039 3102 3140 N
+ L N R e n/a 22 3039 3099 3144 N
+ L N R s n/a 22 3039 3099 3144 N
+ L N S b n/a 22 3039 3101 3136 N
+ L N S e n/a 22 3039 3101 3136 N
+ L N S s n/a 22 3039 3101 3136 N
+ L N SH e n/a 22 3039 3101 3137 N
+ L N SH s n/a 22 3039 3101 3137 N
+ L N SIL e n/a 22 3039 3118 3142 N
+ L N SIL s n/a 22 3039 3118 3142 N
+ L N T b n/a 22 3039 3102 3138 N
+ L N T e n/a 22 3039 3102 3138 N
+ L N T s n/a 22 3039 3102 3138 N
+ L N TH e n/a 22 3039 3101 3136 N
+ L N TH s n/a 22 3039 3101 3135 N
+ L N UH b n/a 22 3039 3055 3189 N
+ L N UH e n/a 22 3039 3055 3189 N
+ L N UH i n/a 22 3037 3057 3189 N
+ L N UH s n/a 22 3039 3055 3189 N
+ L N UW b n/a 22 3039 3057 3192 N
+ L N UW e n/a 22 3039 3057 3192 N
+ L N UW i n/a 22 3038 3057 3192 N
+ L N UW s n/a 22 3039 3057 3192 N
+ L N V e n/a 22 3039 3097 3130 N
+ L N V i n/a 22 3039 3097 3130 N
+ L N V s n/a 22 3039 3097 3130 N
+ L N W b n/a 22 3039 3098 3143 N
+ L N W e n/a 22 3039 3098 3143 N
+ L N W s n/a 22 3039 3098 3143 N
+ L N Y b n/a 22 3039 3041 3151 N
+ L N Y e n/a 22 3039 3041 3151 N
+ L N Y s n/a 22 3039 3041 3151 N
+ L N Z e n/a 22 3039 3096 3131 N
+ L N Z i n/a 22 3039 3096 3131 N
+ L N Z s n/a 22 3039 3096 3131 N
+ L N ZH e n/a 22 3039 3096 3130 N
+ L N ZH s n/a 22 3039 3096 3130 N
+ L NG AA b n/a 22 3039 3064 3168 N
+ L NG AA e n/a 22 3039 3064 3162 N
+ L NG AA i n/a 22 3039 3064 3168 N
+ L NG AA s n/a 22 3039 3064 3168 N
+ L NG AE b n/a 22 3039 3063 3175 N
+ L NG AE e n/a 22 3039 3063 3180 N
+ L NG AE s n/a 22 3039 3063 3175 N
+ L NG AH b n/a 22 3039 3062 3172 N
+ L NG AH e n/a 22 3039 3062 3161 N
+ L NG AH i n/a 22 3039 3049 3156 N
+ L NG AH s n/a 22 3039 3062 3172 N
+ L NG AO b n/a 22 3039 3064 3167 N
+ L NG AO e n/a 22 3039 3064 3162 N
+ L NG AO i n/a 22 3039 3064 3167 N
+ L NG AO s n/a 22 3039 3064 3167 N
+ L NG AW b n/a 22 3039 3065 3174 N
+ L NG AW e n/a 22 3039 3065 3180 N
+ L NG AW i n/a 22 3039 3052 3174 N
+ L NG AW s n/a 22 3039 3065 3174 N
+ L NG AY b n/a 22 3039 3062 3171 N
+ L NG AY e n/a 22 3039 3062 3173 N
+ L NG AY i n/a 22 3039 3062 3171 N
+ L NG AY s n/a 22 3039 3062 3171 N
+ L NG B e n/a 22 3039 3097 3128 N
+ L NG B s n/a 22 3039 3097 3125 N
+ L NG CH e n/a 22 3039 3102 3138 N
+ L NG CH s n/a 22 3039 3102 3138 N
+ L NG D e n/a 22 3039 3097 3127 N
+ L NG D s n/a 22 3039 3097 3125 N
+ L NG DH e n/a 22 3039 3097 3129 N
+ L NG DH s n/a 22 3039 3097 3125 N
+ L NG EH b n/a 22 3039 3054 3178 N
+ L NG EH e n/a 22 3039 3062 3180 N
+ L NG EH i n/a 22 3039 3049 3178 N
+ L NG EH s n/a 22 3039 3062 3178 N
+ L NG ER b n/a 22 3039 3065 3188 N
+ L NG ER e n/a 22 3039 3065 3186 N
+ L NG ER i n/a 22 3039 3065 3188 N
+ L NG ER s n/a 22 3039 3065 3188 N
+ L NG EY b n/a 22 3039 3054 3155 N
+ L NG EY e n/a 22 3039 3063 3155 N
+ L NG EY s n/a 22 3039 3063 3155 N
+ L NG F b n/a 22 3039 3101 3135 N
+ L NG F e n/a 22 3039 3101 3136 N
+ L NG F s n/a 22 3039 3101 3135 N
+ L NG G b n/a 22 3039 3097 3125 N
+ L NG G e n/a 22 3039 3097 3127 N
+ L NG G s n/a 22 3039 3097 3125 N
+ L NG HH b n/a 22 3039 3101 3132 N
+ L NG HH e n/a 22 3039 3101 3132 N
+ L NG HH s n/a 22 3039 3101 3132 N
+ L NG IH b n/a 22 3039 3057 3190 N
+ L NG IH e n/a 22 3039 3057 3182 N
+ L NG IH i n/a 22 3038 3049 3182 N
+ L NG IH s n/a 22 3039 3057 3182 N
+ L NG IY b n/a 22 3039 3043 3153 N
+ L NG IY e n/a 22 3039 3043 3153 N
+ L NG IY i n/a 22 3038 3044 3152 N
+ L NG IY s n/a 22 3039 3043 3153 N
+ L NG JH b n/a 22 3039 3097 3125 N
+ L NG JH e n/a 22 3039 3097 3127 N
+ L NG JH s n/a 22 3039 3097 3125 N
+ L NG K b n/a 22 3039 3102 3139 N
+ L NG K e n/a 22 3039 3102 3139 N
+ L NG K s n/a 22 3039 3102 3139 N
+ L NG L e n/a 22 3039 3098 3143 N
+ L NG L s n/a 22 3039 3098 3143 N
+ L NG M b n/a 22 3039 3097 3133 N
+ L NG M e n/a 22 3039 3097 3133 N
+ L NG M s n/a 22 3039 3097 3133 N
+ L NG N e n/a 22 3039 3097 3134 N
+ L NG N s n/a 22 3039 3097 3134 N
+ L NG NG e n/a 22 3039 3097 3133 N
+ L NG NG s n/a 22 3039 3097 3133 N
+ L NG OW b n/a 22 3039 3055 3165 N
+ L NG OW e n/a 22 3039 3065 3162 N
+ L NG OW s n/a 22 3039 3065 3165 N
+ L NG OY b n/a 22 3039 3062 3167 N
+ L NG OY e n/a 22 3039 3062 3173 N
+ L NG OY s n/a 22 3039 3062 3167 N
+ L NG P e n/a 22 3039 3102 3140 N
+ L NG P s n/a 22 3039 3102 3140 N
+ L NG R e n/a 22 3039 3099 3144 N
+ L NG R s n/a 22 3039 3099 3144 N
+ L NG S b n/a 22 3039 3101 3136 N
+ L NG S e n/a 22 3039 3101 3136 N
+ L NG S s n/a 22 3039 3101 3136 N
+ L NG SH e n/a 22 3039 3101 3137 N
+ L NG SH s n/a 22 3039 3101 3137 N
+ L NG SIL e n/a 22 3039 3118 3142 N
+ L NG SIL s n/a 22 3039 3118 3142 N
+ L NG T b n/a 22 3039 3102 3138 N
+ L NG T e n/a 22 3039 3102 3138 N
+ L NG T s n/a 22 3039 3102 3138 N
+ L NG TH e n/a 22 3039 3101 3136 N
+ L NG TH s n/a 22 3039 3101 3135 N
+ L NG UH b n/a 22 3039 3055 3189 N
+ L NG UH e n/a 22 3039 3055 3189 N
+ L NG UH s n/a 22 3039 3055 3189 N
+ L NG UW b n/a 22 3039 3057 3192 N
+ L NG UW e n/a 22 3039 3057 3192 N
+ L NG UW s n/a 22 3039 3057 3192 N
+ L NG V e n/a 22 3039 3097 3130 N
+ L NG V s n/a 22 3039 3097 3130 N
+ L NG W b n/a 22 3039 3098 3143 N
+ L NG W e n/a 22 3039 3098 3143 N
+ L NG W i n/a 22 3039 3098 3143 N
+ L NG W s n/a 22 3039 3098 3143 N
+ L NG Y b n/a 22 3039 3043 3153 N
+ L NG Y e n/a 22 3039 3043 3153 N
+ L NG Y i n/a 22 3038 3043 3152 N
+ L NG Y s n/a 22 3039 3043 3153 N
+ L NG Z e n/a 22 3039 3096 3131 N
+ L NG Z s n/a 22 3039 3096 3131 N
+ L NG ZH e n/a 22 3039 3096 3130 N
+ L NG ZH s n/a 22 3039 3096 3130 N
+ L OW AA b n/a 22 3006 3071 3168 N
+ L OW AA e n/a 22 2982 3090 3162 N
+ L OW AA i n/a 22 3006 3074 3168 N
+ L OW AA s n/a 22 3006 3088 3168 N
+ L OW AE b n/a 22 3006 3066 3174 N
+ L OW AE e n/a 22 2982 3091 3180 N
+ L OW AE i n/a 22 3006 3066 3174 N
+ L OW AE s n/a 22 3006 3088 3174 N
+ L OW AH b n/a 22 3006 3066 3172 N
+ L OW AH e n/a 22 2982 3089 3161 N
+ L OW AH i n/a 22 3006 3086 3160 N
+ L OW AH s n/a 22 3006 3086 3172 N
+ L OW AO b n/a 22 3006 3071 3167 N
+ L OW AO e n/a 22 2982 3090 3162 N
+ L OW AO i n/a 22 3006 3074 3167 N
+ L OW AO s n/a 22 3006 3088 3167 N
+ L OW AW b n/a 22 3006 3066 3174 N
+ L OW AW e n/a 22 2982 3091 3180 N
+ L OW AW i n/a 22 3006 3066 3174 N
+ L OW AW s n/a 22 3006 3088 3174 N
+ L OW AY b n/a 22 3006 3074 3170 N
+ L OW AY e n/a 22 2982 3090 3173 N
+ L OW AY i n/a 22 3006 3074 3170 N
+ L OW AY s n/a 22 3006 3088 3170 N
+ L OW B e n/a 22 2982 3103 3128 N
+ L OW B i n/a 22 2982 3103 3125 N
+ L OW B s n/a 22 2982 3103 3125 N
+ L OW CH e n/a 22 2982 3113 3138 N
+ L OW CH i n/a 22 2982 3113 3138 N
+ L OW CH s n/a 22 2982 3113 3138 N
+ L OW D e n/a 22 2982 3103 3127 N
+ L OW D i n/a 22 2982 3103 3125 N
+ L OW D s n/a 22 2982 3103 3125 N
+ L OW DH e n/a 22 2983 3105 3129 N
+ L OW DH s n/a 22 2983 3105 3125 N
+ L OW EH b n/a 22 3006 3066 3179 N
+ L OW EH e n/a 22 2982 3091 3180 N
+ L OW EH i n/a 22 3006 3066 3179 N
+ L OW EH s n/a 22 3006 3088 3179 N
+ L OW ER b n/a 22 3006 3070 3188 N
+ L OW ER e n/a 22 2982 3089 3186 N
+ L OW ER i n/a 22 3006 3086 3186 N
+ L OW ER s n/a 22 3006 3086 3188 N
+ L OW EY b n/a 22 3006 3067 3155 N
+ L OW EY e n/a 22 2982 3080 3155 N
+ L OW EY i n/a 22 3006 3067 3155 N
+ L OW EY s n/a 22 3006 3080 3155 N
+ L OW F b n/a 22 2982 3115 3135 N
+ L OW F e n/a 22 2982 3115 3136 N
+ L OW F i n/a 22 2982 3115 3135 N
+ L OW F s n/a 22 2982 3115 3135 N
+ L OW G b n/a 22 2982 3103 3125 N
+ L OW G e n/a 22 2982 3103 3127 N
+ L OW G i n/a 22 2982 3103 3125 N
+ L OW G s n/a 22 2982 3103 3125 N
+ L OW HH b n/a 22 2982 3111 3132 N
+ L OW HH e n/a 22 2982 3111 3132 N
+ L OW HH i n/a 22 2982 3111 3132 N
+ L OW HH s n/a 22 2982 3111 3132 N
+ L OW IH b n/a 22 3006 3068 3190 N
+ L OW IH e n/a 22 2982 3091 3183 N
+ L OW IH i n/a 22 3006 3086 3185 N
+ L OW IH s n/a 22 3006 3086 3185 N
+ L OW IY b n/a 22 3006 3082 3148 N
+ L OW IY e n/a 22 2982 3080 3148 N
+ L OW IY i n/a 22 3006 3080 3145 N
+ L OW IY s n/a 22 3006 3080 3148 N
+ L OW JH b n/a 22 2982 3103 3125 N
+ L OW JH e n/a 22 2982 3103 3127 N
+ L OW JH i n/a 22 2982 3103 3125 N
+ L OW JH s n/a 22 2982 3103 3125 N
+ L OW K b n/a 22 2982 3114 3139 N
+ L OW K e n/a 22 2982 3114 3139 N
+ L OW K i n/a 22 2982 3114 3139 N
+ L OW K s n/a 22 2982 3114 3139 N
+ L OW L e n/a 22 2983 3124 3143 N
+ L OW L i n/a 22 2983 3124 3143 N
+ L OW L s n/a 22 2983 3124 3143 N
+ L OW M b n/a 22 2982 3105 3133 N
+ L OW M e n/a 22 2982 3105 3133 N
+ L OW M i n/a 22 2982 3105 3133 N
+ L OW M s n/a 22 2982 3105 3133 N
+ L OW N e n/a 22 2982 3105 3134 N
+ L OW N i n/a 22 2982 3105 3134 N
+ L OW N s n/a 22 2982 3105 3134 N
+ L OW NG e n/a 22 2982 3105 3133 N
+ L OW NG s n/a 22 2982 3105 3133 N
+ L OW OW b n/a 22 3006 3070 3165 N
+ L OW OW e n/a 22 2982 3089 3162 N
+ L OW OW i n/a 22 3006 3077 3163 N
+ L OW OW s n/a 22 3006 3088 3165 N
+ L OW OY b n/a 22 3006 3074 3167 N
+ L OW OY e n/a 22 2982 3090 3173 N
+ L OW OY i n/a 22 3006 3074 3167 N
+ L OW OY s n/a 22 3006 3088 3167 N
+ L OW P e n/a 22 2982 3114 3140 N
+ L OW P i n/a 22 2982 3114 3140 N
+ L OW P s n/a 22 2982 3114 3140 N
+ L OW R e n/a 22 2982 3105 3144 N
+ L OW R i n/a 22 2982 3105 3144 N
+ L OW R s n/a 22 2982 3105 3144 N
+ L OW S b n/a 22 2982 3115 3136 N
+ L OW S e n/a 22 2982 3115 3136 N
+ L OW S i n/a 22 2982 3115 3136 N
+ L OW S s n/a 22 2982 3115 3136 N
+ L OW SH e n/a 22 2982 3115 3137 N
+ L OW SH i n/a 22 2982 3115 3137 N
+ L OW SH s n/a 22 2982 3115 3137 N
+ L OW SIL e n/a 22 2983 3117 3141 N
+ L OW SIL s n/a 22 2983 3117 3141 N
+ L OW T b n/a 22 2982 3113 3138 N
+ L OW T e n/a 22 2982 3113 3138 N
+ L OW T i n/a 22 2982 3113 3138 N
+ L OW T s n/a 22 2982 3113 3138 N
+ L OW TH e n/a 22 2982 3115 3136 N
+ L OW TH i n/a 22 2982 3115 3135 N
+ L OW TH s n/a 22 2982 3115 3135 N
+ L OW UH b n/a 22 3006 3070 3189 N
+ L OW UH e n/a 22 2982 3091 3189 N
+ L OW UH s n/a 22 3006 3088 3189 N
+ L OW UW b n/a 22 3006 3070 3192 N
+ L OW UW e n/a 22 2982 3091 3192 N
+ L OW UW i n/a 22 3006 3088 3192 N
+ L OW UW s n/a 22 3006 3088 3192 N
+ L OW V e n/a 22 2983 3105 3130 N
+ L OW V i n/a 22 2983 3105 3130 N
+ L OW V s n/a 22 2983 3105 3130 N
+ L OW W b n/a 22 2983 3124 3143 N
+ L OW W e n/a 22 2983 3124 3143 N
+ L OW W i n/a 22 2983 3124 3143 N
+ L OW W s n/a 22 2983 3124 3143 N
+ L OW Y b n/a 22 2982 3084 3150 N
+ L OW Y e n/a 22 2982 3084 3150 N
+ L OW Y i n/a 22 2982 3084 3150 N
+ L OW Y s n/a 22 2982 3084 3150 N
+ L OW Z e n/a 22 2983 3123 3131 N
+ L OW Z i n/a 22 2983 3123 3131 N
+ L OW Z s n/a 22 2983 3123 3131 N
+ L OW ZH e n/a 22 2983 3105 3130 N
+ L OW ZH s n/a 22 2983 3105 3130 N
+ L OY AA b n/a 22 3022 3071 3168 N
+ L OY AA e n/a 22 3017 3090 3162 N
+ L OY AA i n/a 22 3023 3074 3168 N
+ L OY AA s n/a 22 3013 3078 3168 N
+ L OY AE b n/a 22 3022 3066 3174 N
+ L OY AE e n/a 22 3017 3094 3180 N
+ L OY AE i n/a 22 3023 3066 3174 N
+ L OY AE s n/a 22 3013 3078 3174 N
+ L OY AH b n/a 22 3022 3066 3172 N
+ L OY AH e n/a 22 3017 3094 3161 N
+ L OY AH i n/a 22 3023 3078 3160 N
+ L OY AH s n/a 22 3017 3078 3172 N
+ L OY AO b n/a 22 3022 3071 3167 N
+ L OY AO e n/a 22 3017 3090 3162 N
+ L OY AO s n/a 22 3013 3078 3167 N
+ L OY AW b n/a 22 3022 3066 3174 N
+ L OY AW e n/a 22 3017 3094 3180 N
+ L OY AW s n/a 22 3013 3078 3174 N
+ L OY AY b n/a 22 3022 3074 3170 N
+ L OY AY e n/a 22 3017 3090 3173 N
+ L OY AY i n/a 22 3023 3074 3170 N
+ L OY AY s n/a 22 3013 3090 3170 N
+ L OY B e n/a 22 2998 3097 3128 N
+ L OY B s n/a 22 2998 3097 3126 N
+ L OY CH e n/a 22 2998 3102 3138 N
+ L OY CH s n/a 22 2998 3102 3138 N
+ L OY D e n/a 22 2998 3097 3127 N
+ L OY D i n/a 22 2998 3097 3126 N
+ L OY D s n/a 22 2998 3097 3126 N
+ L OY DH e n/a 22 2998 3097 3129 N
+ L OY DH s n/a 22 2998 3097 3126 N
+ L OY EH b n/a 22 3022 3066 3179 N
+ L OY EH e n/a 22 3017 3094 3180 N
+ L OY EH i n/a 22 3023 3066 3179 N
+ L OY EH s n/a 22 3013 3078 3179 N
+ L OY ER b n/a 22 3022 3070 3186 N
+ L OY ER e n/a 22 3017 3094 3186 N
+ L OY ER i n/a 22 3023 3078 3186 N
+ L OY ER s n/a 22 3017 3078 3186 N
+ L OY EY b n/a 22 3022 3067 3155 N
+ L OY EY e n/a 22 3017 3078 3155 N
+ L OY EY i n/a 22 3023 3067 3155 N
+ L OY EY s n/a 22 3013 3078 3155 N
+ L OY F b n/a 22 2998 3101 3135 N
+ L OY F e n/a 22 2998 3101 3136 N
+ L OY F i n/a 22 2998 3100 3135 N
+ L OY F s n/a 22 2998 3101 3135 N
+ L OY G b n/a 22 2998 3097 3126 N
+ L OY G e n/a 22 2998 3097 3127 N
+ L OY G s n/a 22 2998 3097 3126 N
+ L OY HH b n/a 22 2998 3101 3132 N
+ L OY HH e n/a 22 2998 3101 3132 N
+ L OY HH s n/a 22 2998 3101 3132 N
+ L OY IH b n/a 22 3022 3069 3190 N
+ L OY IH e n/a 22 3017 3094 3183 N
+ L OY IH i n/a 22 3023 3078 3181 N
+ L OY IH s n/a 22 3017 3078 3181 N
+ L OY IY b n/a 22 3022 3078 3148 N
+ L OY IY e n/a 22 3017 3078 3148 N
+ L OY IY i n/a 22 3023 3078 3145 N
+ L OY IY s n/a 22 3013 3078 3148 N
+ L OY JH b n/a 22 2998 3097 3126 N
+ L OY JH e n/a 22 2998 3097 3127 N
+ L OY JH s n/a 22 2998 3097 3126 N
+ L OY K b n/a 22 2998 3102 3139 N
+ L OY K e n/a 22 2998 3102 3139 N
+ L OY K i n/a 22 2998 3102 3139 N
+ L OY K s n/a 22 2998 3102 3139 N
+ L OY L e n/a 22 2998 3099 3143 N
+ L OY L s n/a 22 2998 3099 3143 N
+ L OY M b n/a 22 2998 3097 3133 N
+ L OY M e n/a 22 2998 3097 3133 N
+ L OY M i n/a 22 2998 3097 3133 N
+ L OY M s n/a 22 2998 3097 3133 N
+ L OY N e n/a 22 2998 3097 3134 N
+ L OY N i n/a 22 2998 3097 3134 N
+ L OY N s n/a 22 2998 3097 3134 N
+ L OY NG e n/a 22 2998 3097 3133 N
+ L OY NG s n/a 22 2998 3097 3133 N
+ L OY OW b n/a 22 3022 3070 3163 N
+ L OY OW e n/a 22 3017 3089 3162 N
+ L OY OW i n/a 22 3023 3077 3163 N
+ L OY OW s n/a 22 3013 3078 3163 N
+ L OY OY b n/a 22 3022 3074 3167 N
+ L OY OY e n/a 22 3017 3090 3173 N
+ L OY OY s n/a 22 3013 3090 3167 N
+ L OY P e n/a 22 2998 3102 3140 N
+ L OY P s n/a 22 2998 3102 3140 N
+ L OY R e n/a 22 2998 3099 3144 N
+ L OY R s n/a 22 2998 3099 3144 N
+ L OY S b n/a 22 2998 3101 3136 N
+ L OY S e n/a 22 2998 3101 3136 N
+ L OY S i n/a 22 2998 3101 3136 N
+ L OY S s n/a 22 2998 3101 3136 N
+ L OY SH e n/a 22 2998 3101 3137 N
+ L OY SH s n/a 22 2998 3101 3137 N
+ L OY SIL e n/a 22 2998 3119 3142 N
+ L OY SIL s n/a 22 2998 3119 3142 N
+ L OY T b n/a 22 2998 3102 3138 N
+ L OY T e n/a 22 2998 3102 3138 N
+ L OY T i n/a 22 2998 3102 3138 N
+ L OY T s n/a 22 2998 3102 3138 N
+ L OY TH e n/a 22 2998 3101 3136 N
+ L OY TH s n/a 22 2998 3101 3135 N
+ L OY UH b n/a 22 3022 3070 3189 N
+ L OY UH e n/a 22 3017 3094 3189 N
+ L OY UH i n/a 22 3023 3078 3189 N
+ L OY UH s n/a 22 3013 3078 3189 N
+ L OY UW b n/a 22 3022 3070 3192 N
+ L OY UW e n/a 22 3017 3094 3192 N
+ L OY UW s n/a 22 3013 3078 3192 N
+ L OY V e n/a 22 2998 3097 3130 N
+ L OY V s n/a 22 2998 3097 3130 N
+ L OY W b n/a 22 2998 3099 3143 N
+ L OY W e n/a 22 2998 3099 3143 N
+ L OY W i n/a 22 2998 3099 3143 N
+ L OY W s n/a 22 2998 3099 3143 N
+ L OY Y b n/a 22 2998 3084 3150 N
+ L OY Y e n/a 22 2998 3084 3150 N
+ L OY Y s n/a 22 2998 3084 3150 N
+ L OY Z e n/a 22 2998 3097 3131 N
+ L OY Z i n/a 22 2998 3097 3131 N
+ L OY Z s n/a 22 2998 3097 3131 N
+ L OY ZH e n/a 22 2998 3097 3130 N
+ L OY ZH s n/a 22 2998 3097 3130 N
+ L P AA b n/a 22 3035 3064 3168 N
+ L P AA e n/a 22 3030 3058 3162 N
+ L P AA i n/a 22 3027 3058 3168 N
+ L P AA s n/a 22 3030 3058 3168 N
+ L P AE b n/a 22 3035 3063 3176 N
+ L P AE e n/a 22 3030 3063 3180 N
+ L P AE i n/a 22 3026 3047 3176 N
+ L P AE s n/a 22 3030 3063 3176 N
+ L P AH b n/a 22 3035 3061 3172 N
+ L P AH e n/a 22 3030 3061 3161 N
+ L P AH i n/a 22 3027 3051 3156 N
+ L P AH s n/a 22 3030 3061 3172 N
+ L P AO b n/a 22 3035 3064 3166 N
+ L P AO e n/a 22 3030 3059 3162 N
+ L P AO i n/a 22 3024 3059 3166 N
+ L P AO s n/a 22 3030 3059 3166 N
+ L P AW b n/a 22 3035 3065 3176 N
+ L P AW e n/a 22 3030 3058 3180 N
+ L P AW i n/a 22 3026 3047 3176 N
+ L P AW s n/a 22 3030 3058 3176 N
+ L P AY b n/a 22 3035 3060 3171 N
+ L P AY e n/a 22 3030 3060 3173 N
+ L P AY i n/a 22 3027 3058 3169 N
+ L P AY s n/a 22 3030 3060 3169 N
+ L P B e n/a 22 3030 3097 3128 N
+ L P B s n/a 22 3030 3097 3125 N
+ L P CH e n/a 22 3030 3102 3138 N
+ L P CH s n/a 22 3030 3102 3138 N
+ L P D e n/a 22 3030 3097 3127 N
+ L P D s n/a 22 3030 3097 3125 N
+ L P DH e n/a 22 3030 3097 3129 N
+ L P DH s n/a 22 3030 3097 3125 N
+ L P EH b n/a 22 3035 3054 3178 N
+ L P EH e n/a 22 3030 3061 3180 N
+ L P EH i n/a 22 3026 3048 3177 N
+ L P EH s n/a 22 3030 3061 3178 N
+ L P ER b n/a 22 3035 3065 3188 N
+ L P ER e n/a 22 3030 3059 3186 N
+ L P ER i n/a 22 3024 3059 3188 N
+ L P ER s n/a 22 3030 3059 3188 N
+ L P EY b n/a 22 3035 3054 3155 N
+ L P EY e n/a 22 3030 3060 3155 N
+ L P EY i n/a 22 3026 3048 3154 N
+ L P EY s n/a 22 3030 3060 3155 N
+ L P F b n/a 22 3035 3101 3135 N
+ L P F e n/a 22 3030 3101 3136 N
+ L P F s n/a 22 3030 3101 3135 N
+ L P G b n/a 22 3035 3097 3125 N
+ L P G e n/a 22 3030 3097 3127 N
+ L P G s n/a 22 3030 3097 3125 N
+ L P HH b n/a 22 3035 3101 3132 N
+ L P HH e n/a 22 3030 3101 3132 N
+ L P HH s n/a 22 3030 3101 3132 N
+ L P IH b n/a 22 3035 3057 3190 N
+ L P IH e n/a 22 3031 3057 3182 N
+ L P IH i n/a 22 3028 3050 3182 N
+ L P IH s n/a 22 3031 3057 3182 N
+ L P IY b n/a 22 3035 3041 3148 N
+ L P IY e n/a 22 3031 3041 3148 N
+ L P IY i n/a 22 3029 3040 3151 N
+ L P IY s n/a 22 3031 3041 3148 N
+ L P JH b n/a 22 3035 3097 3125 N
+ L P JH e n/a 22 3030 3097 3127 N
+ L P JH s n/a 22 3030 3097 3125 N
+ L P K b n/a 22 3035 3102 3139 N
+ L P K e n/a 22 3030 3102 3139 N
+ L P K s n/a 22 3030 3102 3139 N
+ L P L e n/a 22 3030 3098 3143 N
+ L P L s n/a 22 3030 3098 3143 N
+ L P M b n/a 22 3035 3097 3133 N
+ L P M e n/a 22 3030 3097 3133 N
+ L P M s n/a 22 3030 3097 3133 N
+ L P N e n/a 22 3030 3097 3134 N
+ L P N s n/a 22 3030 3097 3134 N
+ L P NG e n/a 22 3030 3097 3133 N
+ L P NG s n/a 22 3030 3097 3133 N
+ L P OW b n/a 22 3035 3055 3165 N
+ L P OW e n/a 22 3030 3059 3162 N
+ L P OW i n/a 22 3024 3059 3165 N
+ L P OW s n/a 22 3030 3059 3165 N
+ L P OY b n/a 22 3035 3060 3166 N
+ L P OY e n/a 22 3030 3060 3173 N
+ L P OY i n/a 22 3024 3059 3166 N
+ L P OY s n/a 22 3030 3060 3166 N
+ L P P e n/a 22 3030 3102 3140 N
+ L P P s n/a 22 3030 3102 3140 N
+ L P R e n/a 22 3030 3099 3144 N
+ L P R s n/a 22 3030 3099 3144 N
+ L P S b n/a 22 3035 3101 3136 N
+ L P S e n/a 22 3030 3101 3136 N
+ L P S s n/a 22 3030 3101 3136 N
+ L P SH e n/a 22 3030 3101 3137 N
+ L P SH s n/a 22 3030 3101 3137 N
+ L P SIL e n/a 22 3030 3118 3142 N
+ L P SIL s n/a 22 3030 3118 3142 N
+ L P T b n/a 22 3035 3102 3138 N
+ L P T e n/a 22 3030 3102 3138 N
+ L P T s n/a 22 3030 3102 3138 N
+ L P TH e n/a 22 3030 3101 3136 N
+ L P TH s n/a 22 3030 3101 3135 N
+ L P UH b n/a 22 3035 3055 3189 N
+ L P UH e n/a 22 3031 3055 3189 N
+ L P UH i n/a 22 3028 3056 3189 N
+ L P UH s n/a 22 3031 3055 3189 N
+ L P UW b n/a 22 3035 3057 3192 N
+ L P UW e n/a 22 3031 3057 3192 N
+ L P UW i n/a 22 3028 3056 3192 N
+ L P UW s n/a 22 3031 3057 3192 N
+ L P V e n/a 22 3030 3097 3130 N
+ L P V s n/a 22 3030 3097 3130 N
+ L P W b n/a 22 3035 3098 3143 N
+ L P W e n/a 22 3030 3098 3143 N
+ L P W s n/a 22 3030 3098 3143 N
+ L P Y b n/a 22 3035 3041 3149 N
+ L P Y e n/a 22 3031 3041 3150 N
+ L P Y i n/a 22 3029 3040 3151 N
+ L P Y s n/a 22 3031 3041 3149 N
+ L P Z e n/a 22 3030 3096 3131 N
+ L P Z s n/a 22 3030 3096 3131 N
+ L P ZH e n/a 22 3030 3096 3130 N
+ L P ZH s n/a 22 3030 3096 3130 N
+ L R AA b n/a 22 3013 3071 3168 N
+ L R AA e n/a 22 2991 3090 3162 N
+ L R AA i n/a 22 3014 3074 3168 N
+ L R AA s n/a 22 3013 3088 3168 N
+ L R AE b n/a 22 3013 3066 3174 N
+ L R AE e n/a 22 2991 3091 3180 N
+ L R AE i n/a 22 3014 3066 3174 N
+ L R AE s n/a 22 3013 3088 3174 N
+ L R AH b n/a 22 3013 3066 3172 N
+ L R AH e n/a 22 2991 3090 3161 N
+ L R AH i n/a 22 3014 3087 3160 N
+ L R AH s n/a 22 3013 3087 3172 N
+ L R AO b n/a 22 3013 3071 3167 N
+ L R AO e n/a 22 2991 3090 3162 N
+ L R AO i n/a 22 3014 3074 3167 N
+ L R AO s n/a 22 3013 3088 3167 N
+ L R AW b n/a 22 3013 3066 3174 N
+ L R AW e n/a 22 2991 3091 3180 N
+ L R AW i n/a 22 3014 3066 3174 N
+ L R AW s n/a 22 3013 3088 3174 N
+ L R AY b n/a 22 3013 3074 3171 N
+ L R AY e n/a 22 2991 3090 3173 N
+ L R AY i n/a 22 3014 3074 3171 N
+ L R AY s n/a 22 3013 3088 3171 N
+ L R B e n/a 22 2991 3104 3128 N
+ L R B i n/a 22 2991 3105 3125 N
+ L R B s n/a 22 2991 3104 3125 N
+ L R CH e n/a 22 2991 3113 3138 N
+ L R CH s n/a 22 2991 3113 3138 N
+ L R D e n/a 22 2991 3104 3127 N
+ L R D i n/a 22 2991 3105 3125 N
+ L R D s n/a 22 2991 3104 3125 N
+ L R DH e n/a 22 2991 3105 3129 N
+ L R DH s n/a 22 2991 3105 3125 N
+ L R EH b n/a 22 3013 3066 3178 N
+ L R EH e n/a 22 2991 3091 3180 N
+ L R EH i n/a 22 3014 3066 3178 N
+ L R EH s n/a 22 3013 3088 3178 N
+ L R ER b n/a 22 3013 3070 3188 N
+ L R ER e n/a 22 2991 3090 3186 N
+ L R ER i n/a 22 3014 3087 3188 N
+ L R ER s n/a 22 3013 3087 3188 N
+ L R EY b n/a 22 3013 3067 3155 N
+ L R EY e n/a 22 2991 3081 3155 N
+ L R EY i n/a 22 3014 3067 3155 N
+ L R EY s n/a 22 3013 3081 3155 N
+ L R F b n/a 22 2991 3115 3135 N
+ L R F e n/a 22 2991 3115 3136 N
+ L R F s n/a 22 2991 3115 3135 N
+ L R G b n/a 22 2991 3104 3125 N
+ L R G e n/a 22 2991 3104 3127 N
+ L R G s n/a 22 2991 3104 3125 N
+ L R HH b n/a 22 2991 3110 3132 N
+ L R HH e n/a 22 2991 3110 3132 N
+ L R HH i n/a 22 2991 3110 3132 N
+ L R HH s n/a 22 2991 3110 3132 N
+ L R IH b n/a 22 3013 3069 3190 N
+ L R IH e n/a 22 2991 3091 3183 N
+ L R IH i n/a 22 3014 3087 3184 N
+ L R IH s n/a 22 3013 3087 3183 N
+ L R IY b n/a 22 3013 3082 3148 N
+ L R IY e n/a 22 2991 3081 3148 N
+ L R IY i n/a 22 3014 3081 3147 N
+ L R IY s n/a 22 3013 3081 3148 N
+ L R JH b n/a 22 2991 3104 3125 N
+ L R JH e n/a 22 2991 3104 3127 N
+ L R JH i n/a 22 2991 3105 3125 N
+ L R JH s n/a 22 2991 3104 3125 N
+ L R K b n/a 22 2991 3114 3139 N
+ L R K e n/a 22 2991 3114 3139 N
+ L R K i n/a 22 2991 3114 3139 N
+ L R K s n/a 22 2991 3114 3139 N
+ L R L e n/a 22 2991 3124 3143 N
+ L R L s n/a 22 2991 3124 3143 N
+ L R M b n/a 22 2991 3108 3133 N
+ L R M e n/a 22 2991 3108 3133 N
+ L R M i n/a 22 2991 3108 3133 N
+ L R M s n/a 22 2991 3108 3133 N
+ L R N e n/a 22 2991 3108 3134 N
+ L R N s n/a 22 2991 3108 3134 N
+ L R NG e n/a 22 2991 3108 3133 N
+ L R NG s n/a 22 2991 3108 3133 N
+ L R OW b n/a 22 3013 3070 3165 N
+ L R OW e n/a 22 2991 3090 3162 N
+ L R OW i n/a 22 3014 3077 3163 N
+ L R OW s n/a 22 3013 3088 3165 N
+ L R OY b n/a 22 3013 3074 3167 N
+ L R OY e n/a 22 2991 3090 3173 N
+ L R OY s n/a 22 3013 3088 3167 N
+ L R P e n/a 22 2991 3114 3140 N
+ L R P s n/a 22 2991 3114 3140 N
+ L R R e n/a 22 2991 3109 3144 N
+ L R R s n/a 22 2991 3109 3144 N
+ L R S b n/a 22 2991 3115 3136 N
+ L R S e n/a 22 2991 3115 3136 N
+ L R S i n/a 22 2991 3115 3136 N
+ L R S s n/a 22 2991 3115 3136 N
+ L R SH e n/a 22 2991 3115 3137 N
+ L R SH s n/a 22 2991 3115 3137 N
+ L R SIL e n/a 22 2991 3118 3142 N
+ L R SIL s n/a 22 2991 3118 3142 N
+ L R T b n/a 22 2991 3113 3138 N
+ L R T e n/a 22 2991 3113 3138 N
+ L R T i n/a 22 2991 3112 3138 N
+ L R T s n/a 22 2991 3113 3138 N
+ L R TH e n/a 22 2991 3115 3136 N
+ L R TH s n/a 22 2991 3115 3135 N
+ L R UH b n/a 22 3013 3070 3189 N
+ L R UH e n/a 22 2991 3091 3189 N
+ L R UH i n/a 22 3014 3088 3189 N
+ L R UH s n/a 22 3013 3088 3189 N
+ L R UW b n/a 22 3013 3070 3192 N
+ L R UW e n/a 22 2991 3091 3192 N
+ L R UW i n/a 22 3014 3088 3192 N
+ L R UW s n/a 22 3013 3088 3192 N
+ L R V e n/a 22 2991 3107 3130 N
+ L R V s n/a 22 2991 3107 3130 N
+ L R W b n/a 22 2991 3124 3143 N
+ L R W e n/a 22 2991 3124 3143 N
+ L R W i n/a 22 2991 3124 3143 N
+ L R W s n/a 22 2991 3124 3143 N
+ L R Y b n/a 22 2991 3084 3150 N
+ L R Y e n/a 22 2991 3084 3150 N
+ L R Y s n/a 22 2991 3084 3150 N
+ L R Z e n/a 22 2991 3121 3131 N
+ L R Z i n/a 22 2991 3121 3131 N
+ L R Z s n/a 22 2991 3121 3131 N
+ L R ZH e n/a 22 2991 3105 3130 N
+ L R ZH s n/a 22 2991 3105 3130 N
+ L S AA b n/a 22 3035 3064 3168 N
+ L S AA e n/a 22 3035 3064 3162 N
+ L S AA i n/a 22 3024 3064 3168 N
+ L S AA s n/a 22 3035 3064 3168 N
+ L S AE b n/a 22 3035 3063 3174 N
+ L S AE e n/a 22 3035 3063 3180 N
+ L S AE i n/a 22 3024 3046 3174 N
+ L S AE s n/a 22 3035 3063 3174 N
+ L S AH b n/a 22 3035 3061 3172 N
+ L S AH e n/a 22 3035 3061 3161 N
+ L S AH i n/a 22 3024 3051 3156 N
+ L S AH s n/a 22 3035 3061 3172 N
+ L S AO b n/a 22 3035 3064 3167 N
+ L S AO e n/a 22 3035 3064 3162 N
+ L S AO i n/a 22 3024 3064 3167 N
+ L S AO s n/a 22 3035 3064 3167 N
+ L S AW b n/a 22 3035 3061 3174 N
+ L S AW e n/a 22 3035 3061 3180 N
+ L S AW i n/a 22 3024 3046 3174 N
+ L S AW s n/a 22 3035 3061 3174 N
+ L S AY b n/a 22 3035 3060 3170 N
+ L S AY e n/a 22 3035 3060 3173 N
+ L S AY i n/a 22 3024 3058 3170 N
+ L S AY s n/a 22 3035 3060 3170 N
+ L S B e n/a 22 3035 3097 3128 N
+ L S B s n/a 22 3035 3097 3125 N
+ L S CH e n/a 22 3035 3102 3138 N
+ L S CH s n/a 22 3035 3102 3138 N
+ L S D e n/a 22 3035 3097 3127 N
+ L S D i n/a 22 3024 3097 3125 N
+ L S D s n/a 22 3035 3097 3125 N
+ L S DH e n/a 22 3035 3097 3129 N
+ L S DH s n/a 22 3035 3097 3125 N
+ L S EH b n/a 22 3035 3054 3178 N
+ L S EH e n/a 22 3035 3061 3180 N
+ L S EH i n/a 22 3024 3046 3177 N
+ L S EH s n/a 22 3035 3061 3178 N
+ L S ER b n/a 22 3035 3063 3188 N
+ L S ER e n/a 22 3035 3063 3186 N
+ L S ER i n/a 22 3024 3063 3188 N
+ L S ER s n/a 22 3035 3063 3188 N
+ L S EY b n/a 22 3035 3054 3155 N
+ L S EY e n/a 22 3035 3060 3155 N
+ L S EY i n/a 22 3024 3048 3154 N
+ L S EY s n/a 22 3035 3060 3155 N
+ L S F b n/a 22 3035 3101 3135 N
+ L S F e n/a 22 3035 3101 3136 N
+ L S F s n/a 22 3035 3101 3135 N
+ L S G b n/a 22 3035 3097 3125 N
+ L S G e n/a 22 3035 3097 3127 N
+ L S G s n/a 22 3035 3097 3125 N
+ L S HH b n/a 22 3035 3101 3132 N
+ L S HH e n/a 22 3035 3101 3132 N
+ L S HH s n/a 22 3035 3101 3132 N
+ L S IH b n/a 22 3035 3057 3190 N
+ L S IH e n/a 22 3035 3057 3182 N
+ L S IH i n/a 22 3028 3050 3182 N
+ L S IH s n/a 22 3035 3057 3182 N
+ L S IY b n/a 22 3035 3041 3148 N
+ L S IY e n/a 22 3035 3041 3148 N
+ L S IY i n/a 22 3028 3040 3151 N
+ L S IY s n/a 22 3035 3041 3148 N
+ L S JH b n/a 22 3035 3097 3125 N
+ L S JH e n/a 22 3035 3097 3127 N
+ L S JH s n/a 22 3035 3097 3125 N
+ L S K b n/a 22 3035 3102 3139 N
+ L S K e n/a 22 3035 3102 3139 N
+ L S K s n/a 22 3035 3102 3139 N
+ L S L e n/a 22 3035 3098 3143 N
+ L S L s n/a 22 3035 3098 3143 N
+ L S M b n/a 22 3035 3097 3133 N
+ L S M e n/a 22 3035 3097 3133 N
+ L S M s n/a 22 3035 3097 3133 N
+ L S N e n/a 22 3035 3097 3134 N
+ L S N s n/a 22 3035 3097 3134 N
+ L S NG e n/a 22 3035 3097 3133 N
+ L S NG s n/a 22 3035 3097 3133 N
+ L S OW b n/a 22 3035 3055 3165 N
+ L S OW e n/a 22 3035 3061 3162 N
+ L S OW i n/a 22 3024 3061 3165 N
+ L S OW s n/a 22 3035 3061 3165 N
+ L S OY b n/a 22 3035 3060 3167 N
+ L S OY e n/a 22 3035 3060 3173 N
+ L S OY i n/a 22 3024 3059 3167 N
+ L S OY s n/a 22 3035 3060 3167 N
+ L S P e n/a 22 3035 3102 3140 N
+ L S P s n/a 22 3035 3102 3140 N
+ L S R e n/a 22 3035 3099 3144 N
+ L S R s n/a 22 3035 3099 3144 N
+ L S S b n/a 22 3035 3101 3136 N
+ L S S e n/a 22 3035 3101 3136 N
+ L S S s n/a 22 3035 3101 3136 N
+ L S SH e n/a 22 3035 3101 3137 N
+ L S SH s n/a 22 3035 3101 3137 N
+ L S SIL e n/a 22 3035 3118 3142 N
+ L S SIL s n/a 22 3035 3118 3142 N
+ L S T b n/a 22 3035 3102 3138 N
+ L S T e n/a 22 3035 3102 3138 N
+ L S T s n/a 22 3035 3102 3138 N
+ L S TH e n/a 22 3035 3101 3136 N
+ L S TH s n/a 22 3035 3101 3135 N
+ L S UH b n/a 22 3035 3055 3189 N
+ L S UH e n/a 22 3035 3055 3189 N
+ L S UH i n/a 22 3028 3056 3189 N
+ L S UH s n/a 22 3035 3055 3189 N
+ L S UW b n/a 22 3035 3057 3192 N
+ L S UW e n/a 22 3035 3057 3192 N
+ L S UW i n/a 22 3028 3056 3192 N
+ L S UW s n/a 22 3035 3057 3192 N
+ L S V e n/a 22 3035 3097 3130 N
+ L S V s n/a 22 3035 3097 3130 N
+ L S W b n/a 22 3035 3098 3143 N
+ L S W e n/a 22 3035 3098 3143 N
+ L S W s n/a 22 3035 3098 3143 N
+ L S Y b n/a 22 3035 3041 3149 N
+ L S Y e n/a 22 3035 3041 3150 N
+ L S Y i n/a 22 3028 3040 3151 N
+ L S Y s n/a 22 3035 3041 3149 N
+ L S Z e n/a 22 3035 3096 3131 N
+ L S Z s n/a 22 3035 3096 3131 N
+ L S ZH e n/a 22 3035 3096 3130 N
+ L S ZH s n/a 22 3035 3096 3130 N
+ L SH AA b n/a 22 3035 3064 3168 N
+ L SH AA i n/a 22 3024 3064 3168 N
+ L SH AA s n/a 22 3030 3064 3168 N
+ L SH AE b n/a 22 3035 3063 3174 N
+ L SH AE i n/a 22 3024 3046 3174 N
+ L SH AE s n/a 22 3030 3063 3174 N
+ L SH AH b n/a 22 3035 3061 3172 N
+ L SH AH i n/a 22 3024 3051 3156 N
+ L SH AH s n/a 22 3030 3061 3172 N
+ L SH AO b n/a 22 3035 3064 3167 N
+ L SH AO i n/a 22 3024 3064 3167 N
+ L SH AO s n/a 22 3030 3064 3167 N
+ L SH AW b n/a 22 3035 3061 3174 N
+ L SH AW i n/a 22 3024 3046 3174 N
+ L SH AW s n/a 22 3030 3061 3174 N
+ L SH AY b n/a 22 3035 3060 3170 N
+ L SH AY i n/a 22 3024 3058 3170 N
+ L SH AY s n/a 22 3030 3060 3170 N
+ L SH B s n/a 22 3030 3097 3125 N
+ L SH CH s n/a 22 3030 3102 3138 N
+ L SH D s n/a 22 3030 3097 3125 N
+ L SH DH s n/a 22 3030 3097 3125 N
+ L SH EH b n/a 22 3035 3054 3178 N
+ L SH EH i n/a 22 3024 3046 3177 N
+ L SH EH s n/a 22 3030 3061 3178 N
+ L SH ER b n/a 22 3035 3063 3188 N
+ L SH ER i n/a 22 3024 3063 3188 N
+ L SH ER s n/a 22 3030 3063 3188 N
+ L SH EY b n/a 22 3035 3054 3155 N
+ L SH EY i n/a 22 3024 3048 3154 N
+ L SH EY s n/a 22 3030 3060 3155 N
+ L SH F b n/a 22 3035 3101 3135 N
+ L SH F s n/a 22 3030 3101 3135 N
+ L SH G b n/a 22 3035 3097 3125 N
+ L SH G s n/a 22 3030 3097 3125 N
+ L SH HH b n/a 22 3035 3101 3132 N
+ L SH HH s n/a 22 3030 3101 3132 N
+ L SH IH b n/a 22 3035 3057 3190 N
+ L SH IH i n/a 22 3028 3050 3182 N
+ L SH IH s n/a 22 3031 3057 3182 N
+ L SH IY b n/a 22 3035 3041 3148 N
+ L SH IY i n/a 22 3028 3040 3151 N
+ L SH IY s n/a 22 3031 3041 3148 N
+ L SH JH b n/a 22 3035 3097 3125 N
+ L SH JH s n/a 22 3030 3097 3125 N
+ L SH K b n/a 22 3035 3102 3139 N
+ L SH K s n/a 22 3030 3102 3139 N
+ L SH L s n/a 22 3030 3098 3143 N
+ L SH M b n/a 22 3035 3097 3133 N
+ L SH M s n/a 22 3030 3097 3133 N
+ L SH N s n/a 22 3030 3097 3134 N
+ L SH NG s n/a 22 3030 3097 3133 N
+ L SH OW b n/a 22 3035 3055 3165 N
+ L SH OW i n/a 22 3024 3061 3165 N
+ L SH OW s n/a 22 3030 3061 3165 N
+ L SH OY b n/a 22 3035 3060 3167 N
+ L SH OY s n/a 22 3030 3060 3167 N
+ L SH P s n/a 22 3030 3102 3140 N
+ L SH R s n/a 22 3030 3099 3144 N
+ L SH S b n/a 22 3035 3101 3136 N
+ L SH S s n/a 22 3030 3101 3136 N
+ L SH SH s n/a 22 3030 3101 3137 N
+ L SH SIL s n/a 22 3030 3118 3142 N
+ L SH T b n/a 22 3035 3102 3138 N
+ L SH T s n/a 22 3030 3102 3138 N
+ L SH TH s n/a 22 3030 3101 3135 N
+ L SH UH b n/a 22 3035 3055 3189 N
+ L SH UH i n/a 22 3028 3056 3189 N
+ L SH UH s n/a 22 3031 3055 3189 N
+ L SH UW b n/a 22 3035 3057 3192 N
+ L SH UW i n/a 22 3028 3056 3192 N
+ L SH UW s n/a 22 3031 3057 3192 N
+ L SH V s n/a 22 3030 3097 3130 N
+ L SH W b n/a 22 3035 3098 3143 N
+ L SH W s n/a 22 3030 3098 3143 N
+ L SH Y b n/a 22 3035 3041 3149 N
+ L SH Y s n/a 22 3031 3041 3149 N
+ L SH Z s n/a 22 3030 3096 3131 N
+ L SH ZH s n/a 22 3030 3096 3130 N
+ L SIL AA b n/a 22 3036 3064 3168 N
+ L SIL AA s n/a 22 3030 3064 3168 N
+ L SIL AE b n/a 22 3036 3063 3174 N
+ L SIL AE s n/a 22 3030 3063 3174 N
+ L SIL AH b n/a 22 3036 3061 3172 N
+ L SIL AH s n/a 22 3030 3061 3172 N
+ L SIL AO b n/a 22 3036 3064 3167 N
+ L SIL AO s n/a 22 3030 3064 3167 N
+ L SIL AW b n/a 22 3036 3065 3174 N
+ L SIL AW s n/a 22 3030 3065 3174 N
+ L SIL AY b n/a 22 3036 3061 3170 N
+ L SIL AY s n/a 22 3030 3061 3170 N
+ L SIL B s n/a 22 3030 3097 3125 N
+ L SIL CH s n/a 22 3030 3102 3138 N
+ L SIL D s n/a 22 3030 3097 3125 N
+ L SIL DH s n/a 22 3030 3097 3125 N
+ L SIL EH b n/a 22 3036 3054 3179 N
+ L SIL EH s n/a 22 3030 3061 3179 N
+ L SIL ER b n/a 22 3036 3065 3188 N
+ L SIL ER s n/a 22 3030 3065 3188 N
+ L SIL EY b n/a 22 3036 3054 3155 N
+ L SIL EY s n/a 22 3030 3061 3155 N
+ L SIL F b n/a 22 3036 3101 3135 N
+ L SIL F s n/a 22 3030 3101 3135 N
+ L SIL G b n/a 22 3036 3097 3125 N
+ L SIL G s n/a 22 3030 3097 3125 N
+ L SIL HH b n/a 22 3036 3101 3132 N
+ L SIL HH s n/a 22 3030 3101 3132 N
+ L SIL IH b n/a 22 3036 3057 3190 N
+ L SIL IH s n/a 22 3031 3057 3182 N
+ L SIL IY b n/a 22 3036 3041 3148 N
+ L SIL IY s n/a 22 3031 3041 3148 N
+ L SIL JH b n/a 22 3036 3097 3125 N
+ L SIL JH s n/a 22 3030 3097 3125 N
+ L SIL K b n/a 22 3036 3102 3139 N
+ L SIL K s n/a 22 3030 3102 3139 N
+ L SIL L s n/a 22 3030 3098 3143 N
+ L SIL M b n/a 22 3036 3097 3133 N
+ L SIL M s n/a 22 3030 3097 3133 N
+ L SIL N s n/a 22 3030 3097 3134 N
+ L SIL NG s n/a 22 3030 3097 3133 N
+ L SIL OW b n/a 22 3036 3055 3165 N
+ L SIL OW s n/a 22 3030 3065 3165 N
+ L SIL OY b n/a 22 3036 3061 3167 N
+ L SIL OY s n/a 22 3030 3061 3167 N
+ L SIL P s n/a 22 3030 3102 3140 N
+ L SIL R s n/a 22 3030 3099 3144 N
+ L SIL S b n/a 22 3036 3101 3136 N
+ L SIL S s n/a 22 3030 3101 3136 N
+ L SIL SH s n/a 22 3030 3101 3137 N
+ L SIL SIL s n/a 22 3030 3118 3142 N
+ L SIL T b n/a 22 3036 3102 3138 N
+ L SIL T s n/a 22 3030 3102 3138 N
+ L SIL TH s n/a 22 3030 3101 3135 N
+ L SIL UH b n/a 22 3036 3055 3189 N
+ L SIL UH s n/a 22 3031 3055 3189 N
+ L SIL UW b n/a 22 3036 3057 3192 N
+ L SIL UW s n/a 22 3031 3057 3192 N
+ L SIL V s n/a 22 3030 3097 3130 N
+ L SIL W b n/a 22 3036 3098 3143 N
+ L SIL W s n/a 22 3030 3098 3143 N
+ L SIL Y b n/a 22 3036 3041 3149 N
+ L SIL Y s n/a 22 3031 3041 3149 N
+ L SIL Z s n/a 22 3030 3096 3131 N
+ L SIL ZH s n/a 22 3030 3096 3130 N
+ L T AA b n/a 22 3032 3064 3168 N
+ L T AA e n/a 22 3032 3058 3162 N
+ L T AA i n/a 22 3027 3058 3168 N
+ L T AA s n/a 22 3032 3058 3168 N
+ L T AE b n/a 22 3032 3063 3174 N
+ L T AE e n/a 22 3032 3063 3180 N
+ L T AE i n/a 22 3026 3046 3174 N
+ L T AE s n/a 22 3032 3063 3174 N
+ L T AH b n/a 22 3032 3061 3172 N
+ L T AH e n/a 22 3032 3061 3161 N
+ L T AH i n/a 22 3026 3051 3160 N
+ L T AH s n/a 22 3032 3061 3172 N
+ L T AO b n/a 22 3032 3064 3167 N
+ L T AO e n/a 22 3032 3059 3162 N
+ L T AO i n/a 22 3024 3059 3167 N
+ L T AO s n/a 22 3032 3059 3167 N
+ L T AW b n/a 22 3032 3065 3174 N
+ L T AW e n/a 22 3032 3058 3180 N
+ L T AW i n/a 22 3026 3046 3174 N
+ L T AW s n/a 22 3032 3058 3174 N
+ L T AY b n/a 22 3032 3060 3170 N
+ L T AY e n/a 22 3032 3060 3173 N
+ L T AY i n/a 22 3027 3058 3169 N
+ L T AY s n/a 22 3032 3060 3169 N
+ L T B e n/a 22 3032 3097 3128 N
+ L T B i n/a 22 3026 3097 3125 N
+ L T B s n/a 22 3032 3097 3125 N
+ L T CH e n/a 22 3032 3102 3138 N
+ L T CH s n/a 22 3032 3102 3138 N
+ L T D e n/a 22 3032 3097 3127 N
+ L T D i n/a 22 3026 3097 3125 N
+ L T D s n/a 22 3032 3097 3125 N
+ L T DH e n/a 22 3032 3097 3129 N
+ L T DH s n/a 22 3032 3097 3125 N
+ L T EH b n/a 22 3032 3054 3178 N
+ L T EH e n/a 22 3032 3061 3180 N
+ L T EH i n/a 22 3026 3048 3177 N
+ L T EH s n/a 22 3032 3061 3178 N
+ L T ER b n/a 22 3032 3065 3188 N
+ L T ER e n/a 22 3032 3059 3186 N
+ L T ER i n/a 22 3024 3059 3188 N
+ L T ER s n/a 22 3032 3059 3188 N
+ L T EY b n/a 22 3032 3054 3155 N
+ L T EY e n/a 22 3032 3060 3155 N
+ L T EY i n/a 22 3026 3048 3154 N
+ L T EY s n/a 22 3032 3060 3155 N
+ L T F b n/a 22 3032 3101 3135 N
+ L T F e n/a 22 3032 3101 3136 N
+ L T F s n/a 22 3032 3101 3135 N
+ L T G b n/a 22 3032 3097 3125 N
+ L T G e n/a 22 3032 3097 3127 N
+ L T G i n/a 22 3026 3097 3125 N
+ L T G s n/a 22 3032 3097 3125 N
+ L T HH b n/a 22 3032 3101 3132 N
+ L T HH e n/a 22 3032 3101 3132 N
+ L T HH i n/a 22 3026 3101 3132 N
+ L T HH s n/a 22 3032 3101 3132 N
+ L T IH b n/a 22 3032 3057 3190 N
+ L T IH e n/a 22 3032 3057 3181 N
+ L T IH i n/a 22 3034 3049 3181 N
+ L T IH s n/a 22 3032 3057 3181 N
+ L T IY b n/a 22 3032 3041 3148 N
+ L T IY e n/a 22 3032 3041 3148 N
+ L T IY i n/a 22 3034 3043 3153 N
+ L T IY s n/a 22 3032 3041 3148 N
+ L T JH b n/a 22 3032 3097 3125 N
+ L T JH e n/a 22 3032 3097 3127 N
+ L T JH s n/a 22 3032 3097 3125 N
+ L T K b n/a 22 3032 3102 3139 N
+ L T K e n/a 22 3032 3102 3139 N
+ L T K i n/a 22 3026 3102 3139 N
+ L T K s n/a 22 3032 3102 3139 N
+ L T L e n/a 22 3032 3098 3143 N
+ L T L s n/a 22 3032 3098 3143 N
+ L T M b n/a 22 3032 3097 3133 N
+ L T M e n/a 22 3032 3097 3133 N
+ L T M s n/a 22 3032 3097 3133 N
+ L T N e n/a 22 3032 3097 3134 N
+ L T N s n/a 22 3032 3097 3134 N
+ L T NG e n/a 22 3032 3097 3133 N
+ L T NG s n/a 22 3032 3097 3133 N
+ L T OW b n/a 22 3032 3055 3165 N
+ L T OW e n/a 22 3032 3059 3162 N
+ L T OW i n/a 22 3024 3059 3165 N
+ L T OW s n/a 22 3032 3059 3165 N
+ L T OY b n/a 22 3032 3060 3167 N
+ L T OY e n/a 22 3032 3060 3173 N
+ L T OY s n/a 22 3032 3060 3167 N
+ L T P e n/a 22 3032 3102 3140 N
+ L T P s n/a 22 3032 3102 3140 N
+ L T R e n/a 22 3032 3099 3144 N
+ L T R s n/a 22 3032 3099 3144 N
+ L T S b n/a 22 3032 3101 3136 N
+ L T S e n/a 22 3032 3101 3136 N
+ L T S s n/a 22 3032 3101 3136 N
+ L T SH e n/a 22 3032 3101 3137 N
+ L T SH s n/a 22 3032 3101 3137 N
+ L T SIL e n/a 22 3032 3118 3142 N
+ L T SIL s n/a 22 3032 3118 3142 N
+ L T T b n/a 22 3032 3102 3138 N
+ L T T e n/a 22 3032 3102 3138 N
+ L T T s n/a 22 3032 3102 3138 N
+ L T TH e n/a 22 3032 3101 3136 N
+ L T TH s n/a 22 3032 3101 3135 N
+ L T UH b n/a 22 3032 3055 3189 N
+ L T UH e n/a 22 3032 3055 3189 N
+ L T UH i n/a 22 3034 3056 3189 N
+ L T UH s n/a 22 3032 3055 3189 N
+ L T UW b n/a 22 3032 3057 3192 N
+ L T UW e n/a 22 3032 3057 3192 N
+ L T UW i n/a 22 3034 3056 3192 N
+ L T UW s n/a 22 3032 3057 3192 N
+ L T V e n/a 22 3032 3097 3130 N
+ L T V s n/a 22 3032 3097 3130 N
+ L T W b n/a 22 3032 3098 3143 N
+ L T W e n/a 22 3032 3098 3143 N
+ L T W s n/a 22 3032 3098 3143 N
+ L T Y b n/a 22 3032 3041 3149 N
+ L T Y e n/a 22 3032 3041 3150 N
+ L T Y s n/a 22 3032 3041 3149 N
+ L T Z e n/a 22 3032 3096 3131 N
+ L T Z i n/a 22 3026 3096 3131 N
+ L T Z s n/a 22 3032 3096 3131 N
+ L T ZH e n/a 22 3032 3096 3130 N
+ L T ZH s n/a 22 3032 3096 3130 N
+ L TH AA b n/a 22 3035 3064 3168 N
+ L TH AA i n/a 22 3024 3064 3168 N
+ L TH AA s n/a 22 3035 3064 3168 N
+ L TH AE b n/a 22 3035 3063 3174 N
+ L TH AE i n/a 22 3024 3046 3174 N
+ L TH AE s n/a 22 3035 3063 3174 N
+ L TH AH b n/a 22 3035 3061 3172 N
+ L TH AH i n/a 22 3024 3051 3156 N
+ L TH AH s n/a 22 3035 3061 3172 N
+ L TH AO b n/a 22 3035 3064 3167 N
+ L TH AO i n/a 22 3024 3064 3167 N
+ L TH AO s n/a 22 3035 3064 3167 N
+ L TH AW b n/a 22 3035 3061 3174 N
+ L TH AW s n/a 22 3035 3061 3174 N
+ L TH AY b n/a 22 3035 3060 3170 N
+ L TH AY i n/a 22 3024 3058 3170 N
+ L TH AY s n/a 22 3035 3060 3170 N
+ L TH B s n/a 22 3035 3097 3125 N
+ L TH CH s n/a 22 3035 3102 3138 N
+ L TH D s n/a 22 3035 3097 3125 N
+ L TH DH s n/a 22 3035 3097 3125 N
+ L TH EH b n/a 22 3035 3054 3178 N
+ L TH EH i n/a 22 3024 3046 3177 N
+ L TH EH s n/a 22 3035 3061 3178 N
+ L TH ER b n/a 22 3035 3063 3188 N
+ L TH ER i n/a 22 3024 3063 3188 N
+ L TH ER s n/a 22 3035 3063 3188 N
+ L TH EY b n/a 22 3035 3054 3155 N
+ L TH EY s n/a 22 3035 3060 3155 N
+ L TH F b n/a 22 3035 3101 3135 N
+ L TH F s n/a 22 3035 3101 3135 N
+ L TH G b n/a 22 3035 3097 3125 N
+ L TH G s n/a 22 3035 3097 3125 N
+ L TH HH b n/a 22 3035 3101 3132 N
+ L TH HH s n/a 22 3035 3101 3132 N
+ L TH IH b n/a 22 3035 3057 3190 N
+ L TH IH i n/a 22 3028 3050 3182 N
+ L TH IH s n/a 22 3035 3057 3182 N
+ L TH IY b n/a 22 3035 3041 3148 N
+ L TH IY i n/a 22 3028 3040 3151 N
+ L TH IY s n/a 22 3035 3041 3148 N
+ L TH JH b n/a 22 3035 3097 3125 N
+ L TH JH s n/a 22 3035 3097 3125 N
+ L TH K b n/a 22 3035 3102 3139 N
+ L TH K s n/a 22 3035 3102 3139 N
+ L TH L s n/a 22 3035 3098 3143 N
+ L TH M b n/a 22 3035 3097 3133 N
+ L TH M s n/a 22 3035 3097 3133 N
+ L TH N s n/a 22 3035 3097 3134 N
+ L TH NG s n/a 22 3035 3097 3133 N
+ L TH OW b n/a 22 3035 3055 3165 N
+ L TH OW i n/a 22 3024 3061 3165 N
+ L TH OW s n/a 22 3035 3061 3165 N
+ L TH OY b n/a 22 3035 3060 3167 N
+ L TH OY s n/a 22 3035 3060 3167 N
+ L TH P s n/a 22 3035 3102 3140 N
+ L TH R s n/a 22 3035 3099 3144 N
+ L TH S b n/a 22 3035 3101 3136 N
+ L TH S s n/a 22 3035 3101 3136 N
+ L TH SH s n/a 22 3035 3101 3137 N
+ L TH SIL s n/a 22 3035 3118 3142 N
+ L TH T b n/a 22 3035 3102 3138 N
+ L TH T s n/a 22 3035 3102 3138 N
+ L TH TH s n/a 22 3035 3101 3135 N
+ L TH UH b n/a 22 3035 3055 3189 N
+ L TH UH s n/a 22 3035 3055 3189 N
+ L TH UW b n/a 22 3035 3057 3192 N
+ L TH UW s n/a 22 3035 3057 3192 N
+ L TH V s n/a 22 3035 3097 3130 N
+ L TH W b n/a 22 3035 3098 3143 N
+ L TH W s n/a 22 3035 3098 3143 N
+ L TH Y b n/a 22 3035 3041 3149 N
+ L TH Y s n/a 22 3035 3041 3149 N
+ L TH Z s n/a 22 3035 3096 3131 N
+ L TH ZH s n/a 22 3035 3096 3130 N
+ L UH AA b n/a 22 3006 3075 3168 N
+ L UH AA e n/a 22 2988 3090 3162 N
+ L UH AA i n/a 22 3006 3075 3168 N
+ L UH AA s n/a 22 3006 3088 3168 N
+ L UH AE b n/a 22 3006 3076 3174 N
+ L UH AE e n/a 22 2988 3091 3180 N
+ L UH AE s n/a 22 3006 3088 3174 N
+ L UH AH b n/a 22 3006 3075 3172 N
+ L UH AH e n/a 22 2988 3089 3161 N
+ L UH AH i n/a 22 3006 3086 3160 N
+ L UH AH s n/a 22 3006 3086 3172 N
+ L UH AO b n/a 22 3006 3075 3167 N
+ L UH AO e n/a 22 2988 3090 3162 N
+ L UH AO s n/a 22 3006 3088 3167 N
+ L UH AW b n/a 22 3006 3076 3174 N
+ L UH AW e n/a 22 2988 3091 3180 N
+ L UH AW i n/a 22 3006 3076 3174 N
+ L UH AW s n/a 22 3006 3088 3174 N
+ L UH AY b n/a 22 3006 3075 3171 N
+ L UH AY e n/a 22 2988 3090 3173 N
+ L UH AY s n/a 22 3006 3088 3171 N
+ L UH B e n/a 22 2978 3122 3128 N
+ L UH B i n/a 22 2978 3122 3125 N
+ L UH B s n/a 22 2978 3122 3125 N
+ L UH CH e n/a 22 2978 3113 3138 N
+ L UH CH i n/a 22 2978 3112 3138 N
+ L UH CH s n/a 22 2978 3113 3138 N
+ L UH D e n/a 22 2978 3122 3127 N
+ L UH D i n/a 22 2978 3122 3125 N
+ L UH D s n/a 22 2978 3122 3125 N
+ L UH DH e n/a 22 2978 3122 3129 N
+ L UH DH s n/a 22 2978 3122 3125 N
+ L UH EH b n/a 22 3006 3076 3178 N
+ L UH EH e n/a 22 2988 3091 3180 N
+ L UH EH i n/a 22 3006 3076 3178 N
+ L UH EH s n/a 22 3006 3088 3178 N
+ L UH ER b n/a 22 3006 3075 3188 N
+ L UH ER e n/a 22 2988 3089 3186 N
+ L UH ER i n/a 22 3006 3086 3186 N
+ L UH ER s n/a 22 3006 3086 3187 N
+ L UH EY b n/a 22 3006 3067 3155 N
+ L UH EY e n/a 22 2988 3080 3155 N
+ L UH EY i n/a 22 3006 3067 3155 N
+ L UH EY s n/a 22 3006 3080 3155 N
+ L UH F b n/a 22 2978 3115 3136 N
+ L UH F e n/a 22 2978 3115 3136 N
+ L UH F i n/a 22 2978 3115 3136 N
+ L UH F s n/a 22 2978 3115 3136 N
+ L UH G b n/a 22 2978 3122 3125 N
+ L UH G e n/a 22 2978 3122 3127 N
+ L UH G i n/a 22 2978 3122 3125 N
+ L UH G s n/a 22 2978 3122 3125 N
+ L UH HH b n/a 22 2978 3115 3132 N
+ L UH HH e n/a 22 2978 3115 3132 N
+ L UH HH i n/a 22 2978 3115 3132 N
+ L UH HH s n/a 22 2978 3115 3132 N
+ L UH IH b n/a 22 3006 3069 3191 N
+ L UH IH e n/a 22 2988 3091 3183 N
+ L UH IH i n/a 22 3006 3086 3184 N
+ L UH IH s n/a 22 3006 3086 3183 N
+ L UH IY b n/a 22 3006 3080 3148 N
+ L UH IY e n/a 22 2988 3080 3148 N
+ L UH IY i n/a 22 3006 3080 3145 N
+ L UH IY s n/a 22 3006 3080 3148 N
+ L UH JH b n/a 22 2978 3122 3125 N
+ L UH JH e n/a 22 2978 3122 3127 N
+ L UH JH i n/a 22 2978 3122 3125 N
+ L UH JH s n/a 22 2978 3122 3125 N
+ L UH K b n/a 22 2978 3114 3139 N
+ L UH K e n/a 22 2978 3114 3139 N
+ L UH K i n/a 22 2978 3114 3139 N
+ L UH K s n/a 22 2978 3114 3139 N
+ L UH L e n/a 22 2978 3124 3143 N
+ L UH L i n/a 22 2978 3124 3143 N
+ L UH L s n/a 22 2978 3124 3143 N
+ L UH M b n/a 22 2978 3122 3133 N
+ L UH M e n/a 22 2978 3122 3133 N
+ L UH M i n/a 22 2978 3122 3133 N
+ L UH M s n/a 22 2978 3122 3133 N
+ L UH N e n/a 22 2978 3122 3134 N
+ L UH N i n/a 22 2978 3122 3134 N
+ L UH N s n/a 22 2978 3122 3134 N
+ L UH NG e n/a 22 2978 3122 3133 N
+ L UH NG s n/a 22 2978 3122 3133 N
+ L UH OW b n/a 22 3006 3077 3165 N
+ L UH OW e n/a 22 2988 3089 3162 N
+ L UH OW s n/a 22 3006 3088 3165 N
+ L UH OY b n/a 22 3006 3075 3167 N
+ L UH OY e n/a 22 2988 3090 3173 N
+ L UH OY s n/a 22 3006 3088 3167 N
+ L UH P e n/a 22 2978 3114 3140 N
+ L UH P i n/a 22 2978 3112 3140 N
+ L UH P s n/a 22 2978 3114 3140 N
+ L UH R e n/a 22 2978 3122 3144 N
+ L UH R i n/a 22 2978 3122 3144 N
+ L UH R s n/a 22 2978 3122 3144 N
+ L UH S b n/a 22 2978 3115 3136 N
+ L UH S e n/a 22 2978 3115 3136 N
+ L UH S i n/a 22 2978 3115 3136 N
+ L UH S s n/a 22 2978 3115 3136 N
+ L UH SH e n/a 22 2978 3115 3137 N
+ L UH SH i n/a 22 2978 3115 3137 N
+ L UH SH s n/a 22 2978 3115 3137 N
+ L UH SIL e n/a 22 2978 3118 3141 N
+ L UH SIL s n/a 22 2978 3118 3141 N
+ L UH T b n/a 22 2978 3113 3138 N
+ L UH T e n/a 22 2978 3113 3138 N
+ L UH T i n/a 22 2978 3112 3138 N
+ L UH T s n/a 22 2978 3113 3138 N
+ L UH TH e n/a 22 2978 3115 3136 N
+ L UH TH s n/a 22 2978 3115 3136 N
+ L UH UH b n/a 22 3006 3075 3189 N
+ L UH UH e n/a 22 2988 3091 3189 N
+ L UH UH s n/a 22 3006 3088 3189 N
+ L UH UW b n/a 22 3006 3077 3192 N
+ L UH UW e n/a 22 2988 3091 3192 N
+ L UH UW i n/a 22 3006 3088 3192 N
+ L UH UW s n/a 22 3006 3088 3192 N
+ L UH V e n/a 22 2978 3122 3130 N
+ L UH V i n/a 22 2978 3122 3130 N
+ L UH V s n/a 22 2978 3122 3130 N
+ L UH W b n/a 22 2978 3124 3143 N
+ L UH W e n/a 22 2978 3124 3143 N
+ L UH W i n/a 22 2978 3124 3143 N
+ L UH W s n/a 22 2978 3124 3143 N
+ L UH Y b n/a 22 2978 3083 3149 N
+ L UH Y e n/a 22 2978 3083 3149 N
+ L UH Y i n/a 22 2978 3083 3149 N
+ L UH Y s n/a 22 2978 3083 3149 N
+ L UH Z e n/a 22 2978 3122 3131 N
+ L UH Z i n/a 22 2978 3122 3131 N
+ L UH Z s n/a 22 2978 3122 3131 N
+ L UH ZH e n/a 22 2978 3122 3130 N
+ L UH ZH s n/a 22 2978 3122 3130 N
+ L UW AA b n/a 22 3009 3071 3168 N
+ L UW AA e n/a 22 2978 3090 3162 N
+ L UW AA i n/a 22 3007 3074 3168 N
+ L UW AA s n/a 22 3007 3088 3168 N
+ L UW AE b n/a 22 3009 3066 3174 N
+ L UW AE e n/a 22 2978 3091 3180 N
+ L UW AE i n/a 22 3007 3066 3174 N
+ L UW AE s n/a 22 3007 3088 3174 N
+ L UW AH b n/a 22 3009 3066 3172 N
+ L UW AH e n/a 22 2978 3089 3161 N
+ L UW AH i n/a 22 3007 3086 3160 N
+ L UW AH s n/a 22 3007 3086 3172 N
+ L UW AO b n/a 22 3009 3071 3167 N
+ L UW AO e n/a 22 2978 3090 3162 N
+ L UW AO i n/a 22 3007 3074 3167 N
+ L UW AO s n/a 22 3007 3088 3167 N
+ L UW AW b n/a 22 3009 3066 3174 N
+ L UW AW e n/a 22 2978 3091 3180 N
+ L UW AW i n/a 22 3007 3066 3174 N
+ L UW AW s n/a 22 3007 3088 3174 N
+ L UW AY b n/a 22 3009 3074 3170 N
+ L UW AY e n/a 22 2978 3090 3173 N
+ L UW AY i n/a 22 3007 3074 3170 N
+ L UW AY s n/a 22 3007 3088 3170 N
+ L UW B e n/a 22 2978 3122 3128 N
+ L UW B i n/a 22 2978 3122 3125 N
+ L UW B s n/a 22 2978 3122 3125 N
+ L UW CH e n/a 22 2978 3113 3138 N
+ L UW CH i n/a 22 2978 3113 3138 N
+ L UW CH s n/a 22 2978 3113 3138 N
+ L UW D e n/a 22 2978 3122 3127 N
+ L UW D i n/a 22 2978 3122 3125 N
+ L UW D s n/a 22 2978 3122 3125 N
+ L UW DH e n/a 22 2978 3122 3129 N
+ L UW DH s n/a 22 2978 3122 3125 N
+ L UW EH b n/a 22 3009 3066 3179 N
+ L UW EH e n/a 22 2978 3091 3180 N
+ L UW EH i n/a 22 3007 3066 3179 N
+ L UW EH s n/a 22 3007 3088 3179 N
+ L UW ER b n/a 22 3009 3070 3188 N
+ L UW ER e n/a 22 2978 3089 3186 N
+ L UW ER i n/a 22 3007 3086 3186 N
+ L UW ER s n/a 22 3007 3086 3188 N
+ L UW EY b n/a 22 3009 3067 3155 N
+ L UW EY e n/a 22 2978 3080 3155 N
+ L UW EY i n/a 22 3007 3067 3155 N
+ L UW EY s n/a 22 3007 3080 3155 N
+ L UW F b n/a 22 2978 3115 3136 N
+ L UW F e n/a 22 2978 3115 3136 N
+ L UW F i n/a 22 2978 3115 3136 N
+ L UW F s n/a 22 2978 3115 3136 N
+ L UW G b n/a 22 2978 3122 3125 N
+ L UW G e n/a 22 2978 3122 3127 N
+ L UW G i n/a 22 2978 3122 3125 N
+ L UW G s n/a 22 2978 3122 3125 N
+ L UW HH b n/a 22 2978 3115 3132 N
+ L UW HH e n/a 22 2978 3115 3132 N
+ L UW HH i n/a 22 2978 3115 3132 N
+ L UW HH s n/a 22 2978 3115 3132 N
+ L UW IH b n/a 22 3009 3069 3190 N
+ L UW IH e n/a 22 2978 3091 3183 N
+ L UW IH i n/a 22 3007 3086 3185 N
+ L UW IH s n/a 22 3007 3086 3185 N
+ L UW IY b n/a 22 3009 3080 3148 N
+ L UW IY e n/a 22 2978 3080 3148 N
+ L UW IY i n/a 22 3007 3080 3145 N
+ L UW IY s n/a 22 3007 3080 3148 N
+ L UW JH b n/a 22 2978 3122 3125 N
+ L UW JH e n/a 22 2978 3122 3127 N
+ L UW JH i n/a 22 2978 3122 3125 N
+ L UW JH s n/a 22 2978 3122 3125 N
+ L UW K b n/a 22 2978 3114 3139 N
+ L UW K e n/a 22 2978 3114 3139 N
+ L UW K i n/a 22 2978 3114 3139 N
+ L UW K s n/a 22 2978 3114 3139 N
+ L UW L e n/a 22 2978 3124 3143 N
+ L UW L s n/a 22 2978 3124 3143 N
+ L UW M b n/a 22 2978 3122 3133 N
+ L UW M e n/a 22 2978 3122 3133 N
+ L UW M i n/a 22 2978 3122 3133 N
+ L UW M s n/a 22 2978 3122 3133 N
+ L UW N e n/a 22 2978 3122 3134 N
+ L UW N i n/a 22 2978 3122 3134 N
+ L UW N s n/a 22 2978 3122 3134 N
+ L UW NG e n/a 22 2978 3122 3133 N
+ L UW NG s n/a 22 2978 3122 3133 N
+ L UW OW b n/a 22 3009 3070 3165 N
+ L UW OW e n/a 22 2978 3089 3162 N
+ L UW OW i n/a 22 3007 3077 3163 N
+ L UW OW s n/a 22 3007 3088 3165 N
+ L UW OY b n/a 22 3009 3074 3167 N
+ L UW OY e n/a 22 2978 3090 3173 N
+ L UW OY s n/a 22 3007 3088 3167 N
+ L UW P e n/a 22 2978 3114 3140 N
+ L UW P i n/a 22 2978 3114 3140 N
+ L UW P s n/a 22 2978 3114 3140 N
+ L UW R e n/a 22 2978 3122 3144 N
+ L UW R i n/a 22 2978 3122 3144 N
+ L UW R s n/a 22 2978 3122 3144 N
+ L UW S b n/a 22 2978 3115 3136 N
+ L UW S e n/a 22 2978 3115 3136 N
+ L UW S i n/a 22 2978 3115 3136 N
+ L UW S s n/a 22 2978 3115 3136 N
+ L UW SH e n/a 22 2978 3115 3137 N
+ L UW SH s n/a 22 2978 3115 3137 N
+ L UW SIL e n/a 22 2978 3118 3141 N
+ L UW SIL s n/a 22 2978 3118 3141 N
+ L UW T b n/a 22 2978 3113 3138 N
+ L UW T e n/a 22 2978 3113 3138 N
+ L UW T i n/a 22 2978 3113 3138 N
+ L UW T s n/a 22 2978 3113 3138 N
+ L UW TH e n/a 22 2978 3115 3136 N
+ L UW TH i n/a 22 2978 3115 3136 N
+ L UW TH s n/a 22 2978 3115 3136 N
+ L UW UH b n/a 22 3009 3070 3189 N
+ L UW UH e n/a 22 2978 3091 3189 N
+ L UW UH i n/a 22 3007 3088 3189 N
+ L UW UH s n/a 22 3007 3088 3189 N
+ L UW UW b n/a 22 3009 3070 3192 N
+ L UW UW e n/a 22 2978 3091 3192 N
+ L UW UW i n/a 22 3007 3088 3192 N
+ L UW UW s n/a 22 3007 3088 3192 N
+ L UW V e n/a 22 2978 3122 3130 N
+ L UW V i n/a 22 2978 3122 3130 N
+ L UW V s n/a 22 2978 3122 3130 N
+ L UW W b n/a 22 2978 3124 3143 N
+ L UW W e n/a 22 2978 3124 3143 N
+ L UW W i n/a 22 2978 3124 3143 N
+ L UW W s n/a 22 2978 3124 3143 N
+ L UW Y b n/a 22 2978 3083 3149 N
+ L UW Y e n/a 22 2978 3083 3149 N
+ L UW Y i n/a 22 2978 3083 3149 N
+ L UW Y s n/a 22 2978 3083 3149 N
+ L UW Z e n/a 22 2978 3122 3131 N
+ L UW Z i n/a 22 2978 3122 3131 N
+ L UW Z s n/a 22 2978 3122 3131 N
+ L UW ZH e n/a 22 2978 3122 3130 N
+ L UW ZH s n/a 22 2978 3122 3130 N
+ L V AA b n/a 22 3033 3064 3168 N
+ L V AA i n/a 22 3030 3064 3168 N
+ L V AA s n/a 22 3030 3064 3168 N
+ L V AE b n/a 22 3033 3063 3174 N
+ L V AE i n/a 22 3030 3052 3175 N
+ L V AE s n/a 22 3030 3063 3174 N
+ L V AH b n/a 22 3033 3061 3172 N
+ L V AH i n/a 22 3030 3049 3156 N
+ L V AH s n/a 22 3030 3061 3172 N
+ L V AO b n/a 22 3033 3064 3167 N
+ L V AO i n/a 22 3030 3064 3167 N
+ L V AO s n/a 22 3030 3064 3167 N
+ L V AW b n/a 22 3033 3065 3175 N
+ L V AW i n/a 22 3030 3052 3175 N
+ L V AW s n/a 22 3030 3065 3175 N
+ L V AY b n/a 22 3033 3060 3171 N
+ L V AY i n/a 22 3030 3060 3171 N
+ L V AY s n/a 22 3030 3060 3171 N
+ L V B s n/a 22 3030 3097 3125 N
+ L V CH s n/a 22 3030 3102 3138 N
+ L V D s n/a 22 3030 3097 3125 N
+ L V DH s n/a 22 3030 3097 3125 N
+ L V EH b n/a 22 3033 3054 3178 N
+ L V EH i n/a 22 3030 3049 3178 N
+ L V EH s n/a 22 3030 3061 3178 N
+ L V ER b n/a 22 3033 3065 3188 N
+ L V ER i n/a 22 3030 3065 3188 N
+ L V ER s n/a 22 3030 3065 3188 N
+ L V EY b n/a 22 3033 3054 3155 N
+ L V EY i n/a 22 3030 3049 3154 N
+ L V EY s n/a 22 3030 3060 3155 N
+ L V F b n/a 22 3033 3101 3135 N
+ L V F s n/a 22 3030 3101 3135 N
+ L V G b n/a 22 3033 3097 3125 N
+ L V G s n/a 22 3030 3097 3125 N
+ L V HH b n/a 22 3033 3101 3132 N
+ L V HH s n/a 22 3030 3101 3132 N
+ L V IH b n/a 22 3033 3057 3190 N
+ L V IH i n/a 22 3031 3049 3181 N
+ L V IH s n/a 22 3031 3057 3181 N
+ L V IY b n/a 22 3033 3041 3148 N
+ L V IY i n/a 22 3031 3042 3151 N
+ L V IY s n/a 22 3031 3041 3148 N
+ L V JH b n/a 22 3033 3097 3125 N
+ L V JH s n/a 22 3030 3097 3125 N
+ L V K b n/a 22 3033 3102 3139 N
+ L V K s n/a 22 3030 3102 3139 N
+ L V L s n/a 22 3030 3098 3143 N
+ L V M b n/a 22 3033 3097 3133 N
+ L V M s n/a 22 3030 3097 3133 N
+ L V N s n/a 22 3030 3097 3134 N
+ L V NG s n/a 22 3030 3097 3133 N
+ L V OW b n/a 22 3033 3055 3165 N
+ L V OW i n/a 22 3030 3065 3165 N
+ L V OW s n/a 22 3030 3065 3165 N
+ L V OY b n/a 22 3033 3060 3167 N
+ L V OY s n/a 22 3030 3060 3167 N
+ L V P s n/a 22 3030 3102 3140 N
+ L V R s n/a 22 3030 3099 3144 N
+ L V S b n/a 22 3033 3101 3136 N
+ L V S s n/a 22 3030 3101 3136 N
+ L V SH s n/a 22 3030 3101 3137 N
+ L V SIL s n/a 22 3030 3118 3142 N
+ L V T b n/a 22 3033 3102 3138 N
+ L V T s n/a 22 3030 3102 3138 N
+ L V TH s n/a 22 3030 3101 3135 N
+ L V UH b n/a 22 3033 3055 3189 N
+ L V UH s n/a 22 3031 3055 3189 N
+ L V UW b n/a 22 3033 3057 3192 N
+ L V UW s n/a 22 3031 3057 3192 N
+ L V V s n/a 22 3030 3097 3130 N
+ L V W b n/a 22 3033 3098 3143 N
+ L V W s n/a 22 3030 3098 3143 N
+ L V Y b n/a 22 3033 3041 3149 N
+ L V Y s n/a 22 3031 3041 3149 N
+ L V Z i n/a 22 3030 3096 3131 N
+ L V Z s n/a 22 3030 3096 3131 N
+ L V ZH s n/a 22 3030 3096 3130 N
+ L W AA b n/a 22 3008 3071 3168 N
+ L W AA s n/a 22 3006 3088 3168 N
+ L W AE b n/a 22 3008 3066 3174 N
+ L W AE s n/a 22 3006 3088 3174 N
+ L W AH b n/a 22 3008 3066 3172 N
+ L W AH s n/a 22 3006 3086 3172 N
+ L W AO b n/a 22 3008 3071 3167 N
+ L W AO s n/a 22 3006 3088 3167 N
+ L W AW b n/a 22 3008 3066 3175 N
+ L W AW s n/a 22 3006 3088 3175 N
+ L W AY b n/a 22 3008 3074 3171 N
+ L W AY s n/a 22 3006 3088 3171 N
+ L W B s n/a 22 2978 3104 3125 N
+ L W CH s n/a 22 2978 3113 3138 N
+ L W D s n/a 22 2978 3104 3125 N
+ L W DH s n/a 22 2978 3105 3125 N
+ L W EH b n/a 22 3008 3066 3178 N
+ L W EH s n/a 22 3006 3088 3178 N
+ L W ER b n/a 22 3008 3070 3188 N
+ L W ER s n/a 22 3006 3086 3188 N
+ L W EY b n/a 22 3008 3067 3155 N
+ L W EY s n/a 22 3006 3080 3155 N
+ L W F b n/a 22 2978 3115 3135 N
+ L W F s n/a 22 2978 3115 3135 N
+ L W G b n/a 22 2978 3104 3125 N
+ L W G s n/a 22 2978 3104 3125 N
+ L W HH b n/a 22 2978 3111 3132 N
+ L W HH s n/a 22 2978 3111 3132 N
+ L W IH b n/a 22 3008 3069 3190 N
+ L W IH s n/a 22 3006 3086 3183 N
+ L W IY b n/a 22 3008 3082 3148 N
+ L W IY s n/a 22 3006 3080 3148 N
+ L W JH b n/a 22 2978 3104 3125 N
+ L W JH s n/a 22 2978 3104 3125 N
+ L W K b n/a 22 2978 3114 3139 N
+ L W K s n/a 22 2978 3114 3139 N
+ L W L s n/a 22 2978 3124 3143 N
+ L W M b n/a 22 2978 3108 3133 N
+ L W M s n/a 22 2978 3108 3133 N
+ L W N s n/a 22 2978 3108 3134 N
+ L W NG s n/a 22 2978 3108 3133 N
+ L W OW b n/a 22 3008 3070 3165 N
+ L W OW s n/a 22 3006 3088 3165 N
+ L W OY b n/a 22 3008 3074 3167 N
+ L W OY s n/a 22 3006 3088 3167 N
+ L W P s n/a 22 2978 3114 3140 N
+ L W R s n/a 22 2978 3109 3144 N
+ L W S b n/a 22 2978 3115 3136 N
+ L W S s n/a 22 2978 3115 3136 N
+ L W SH s n/a 22 2978 3115 3137 N
+ L W SIL s n/a 22 2978 3117 3141 N
+ L W T b n/a 22 2978 3113 3138 N
+ L W T s n/a 22 2978 3113 3138 N
+ L W TH s n/a 22 2978 3115 3135 N
+ L W UH b n/a 22 3008 3070 3189 N
+ L W UH s n/a 22 3006 3088 3189 N
+ L W UW b n/a 22 3008 3070 3192 N
+ L W UW s n/a 22 3006 3088 3192 N
+ L W V s n/a 22 2978 3107 3130 N
+ L W W b n/a 22 2978 3124 3143 N
+ L W W s n/a 22 2978 3124 3143 N
+ L W Y b n/a 22 2978 3084 3150 N
+ L W Y s n/a 22 2978 3084 3150 N
+ L W Z s n/a 22 2978 3123 3131 N
+ L W ZH s n/a 22 2978 3105 3130 N
+ L Y AA b n/a 22 3016 3071 3168 N
+ L Y AA s n/a 22 3016 3081 3168 N
+ L Y AE b n/a 22 3016 3066 3174 N
+ L Y AE s n/a 22 3016 3081 3174 N
+ L Y AH b n/a 22 3018 3066 3172 N
+ L Y AH i n/a 22 3021 3078 3160 N
+ L Y AH s n/a 22 3018 3078 3172 N
+ L Y AO b n/a 22 3016 3071 3167 N
+ L Y AO s n/a 22 3016 3081 3167 N
+ L Y AW b n/a 22 3016 3066 3174 N
+ L Y AW s n/a 22 3016 3081 3174 N
+ L Y AY b n/a 22 3016 3074 3171 N
+ L Y AY s n/a 22 3016 3090 3171 N
+ L Y B s n/a 22 3001 3098 3126 N
+ L Y CH s n/a 22 3001 3102 3138 N
+ L Y D s n/a 22 3001 3098 3126 N
+ L Y DH s n/a 22 3001 3098 3126 N
+ L Y EH b n/a 22 3016 3066 3178 N
+ L Y EH s n/a 22 3016 3078 3178 N
+ L Y ER b n/a 22 3018 3070 3188 N
+ L Y ER s n/a 22 3018 3078 3188 N
+ L Y EY b n/a 22 3016 3067 3155 N
+ L Y EY s n/a 22 3016 3081 3155 N
+ L Y F b n/a 22 3001 3101 3136 N
+ L Y F s n/a 22 3001 3101 3136 N
+ L Y G b n/a 22 3001 3098 3126 N
+ L Y G s n/a 22 3001 3098 3126 N
+ L Y HH b n/a 22 3001 3101 3132 N
+ L Y HH s n/a 22 3001 3101 3132 N
+ L Y IH b n/a 22 3018 3069 3190 N
+ L Y IH s n/a 22 3018 3078 3181 N
+ L Y IY b n/a 22 3015 3082 3148 N
+ L Y IY s n/a 22 3015 3081 3148 N
+ L Y JH b n/a 22 3001 3098 3126 N
+ L Y JH s n/a 22 3001 3098 3126 N
+ L Y K b n/a 22 3001 3102 3139 N
+ L Y K s n/a 22 3001 3102 3139 N
+ L Y L s n/a 22 3001 3099 3143 N
+ L Y M b n/a 22 3001 3098 3133 N
+ L Y M s n/a 22 3001 3098 3133 N
+ L Y N s n/a 22 3001 3098 3134 N
+ L Y NG s n/a 22 3001 3098 3133 N
+ L Y OW b n/a 22 3016 3070 3165 N
+ L Y OW s n/a 22 3016 3081 3165 N
+ L Y OY b n/a 22 3016 3074 3167 N
+ L Y OY s n/a 22 3016 3090 3167 N
+ L Y P s n/a 22 3001 3102 3140 N
+ L Y R s n/a 22 3001 3099 3144 N
+ L Y S b n/a 22 3001 3101 3136 N
+ L Y S s n/a 22 3001 3101 3136 N
+ L Y SH s n/a 22 3001 3101 3137 N
+ L Y SIL s n/a 22 3002 3119 3141 N
+ L Y T b n/a 22 3001 3102 3138 N
+ L Y T s n/a 22 3001 3102 3138 N
+ L Y TH s n/a 22 3001 3101 3136 N
+ L Y UH b n/a 22 3016 3070 3189 N
+ L Y UH s n/a 22 3016 3078 3189 N
+ L Y UW b n/a 22 3016 3070 3192 N
+ L Y UW s n/a 22 3016 3081 3192 N
+ L Y V s n/a 22 3001 3098 3130 N
+ L Y W b n/a 22 3001 3099 3143 N
+ L Y W s n/a 22 3001 3099 3143 N
+ L Y Y b n/a 22 3004 3083 3149 N
+ L Y Y s n/a 22 3004 3083 3149 N
+ L Y Z s n/a 22 3002 3096 3131 N
+ L Y ZH s n/a 22 3002 3096 3130 N
+ L Z AA b n/a 22 3035 3064 3168 N
+ L Z AA e n/a 22 3035 3064 3162 N
+ L Z AA i n/a 22 3035 3064 3168 N
+ L Z AA s n/a 22 3035 3064 3168 N
+ L Z AE b n/a 22 3035 3063 3174 N
+ L Z AE e n/a 22 3035 3063 3180 N
+ L Z AE i n/a 22 3035 3052 3174 N
+ L Z AE s n/a 22 3035 3063 3174 N
+ L Z AH b n/a 22 3035 3061 3172 N
+ L Z AH e n/a 22 3035 3061 3161 N
+ L Z AH i n/a 22 3035 3049 3156 N
+ L Z AH s n/a 22 3035 3061 3172 N
+ L Z AO b n/a 22 3035 3064 3167 N
+ L Z AO e n/a 22 3035 3064 3162 N
+ L Z AO i n/a 22 3035 3064 3167 N
+ L Z AO s n/a 22 3035 3064 3167 N
+ L Z AW b n/a 22 3035 3065 3174 N
+ L Z AW e n/a 22 3035 3065 3180 N
+ L Z AW i n/a 22 3035 3052 3174 N
+ L Z AW s n/a 22 3035 3065 3174 N
+ L Z AY b n/a 22 3035 3060 3170 N
+ L Z AY e n/a 22 3035 3060 3173 N
+ L Z AY i n/a 22 3035 3060 3170 N
+ L Z AY s n/a 22 3035 3060 3170 N
+ L Z B e n/a 22 3035 3097 3128 N
+ L Z B s n/a 22 3035 3097 3125 N
+ L Z CH e n/a 22 3035 3102 3138 N
+ L Z CH s n/a 22 3035 3102 3138 N
+ L Z D e n/a 22 3035 3097 3127 N
+ L Z D s n/a 22 3035 3097 3125 N
+ L Z DH e n/a 22 3035 3097 3129 N
+ L Z DH s n/a 22 3035 3097 3125 N
+ L Z EH b n/a 22 3035 3054 3178 N
+ L Z EH e n/a 22 3035 3061 3180 N
+ L Z EH i n/a 22 3035 3049 3178 N
+ L Z EH s n/a 22 3035 3061 3178 N
+ L Z ER b n/a 22 3035 3065 3188 N
+ L Z ER e n/a 22 3035 3065 3186 N
+ L Z ER i n/a 22 3035 3065 3188 N
+ L Z ER s n/a 22 3035 3065 3188 N
+ L Z EY b n/a 22 3035 3054 3155 N
+ L Z EY e n/a 22 3035 3060 3155 N
+ L Z EY i n/a 22 3035 3049 3154 N
+ L Z EY s n/a 22 3035 3060 3155 N
+ L Z F b n/a 22 3035 3101 3135 N
+ L Z F e n/a 22 3035 3101 3136 N
+ L Z F s n/a 22 3035 3101 3135 N
+ L Z G b n/a 22 3035 3097 3125 N
+ L Z G e n/a 22 3035 3097 3127 N
+ L Z G s n/a 22 3035 3097 3125 N
+ L Z HH b n/a 22 3035 3101 3132 N
+ L Z HH e n/a 22 3035 3101 3132 N
+ L Z HH s n/a 22 3035 3101 3132 N
+ L Z IH b n/a 22 3035 3057 3190 N
+ L Z IH e n/a 22 3035 3057 3181 N
+ L Z IH i n/a 22 3035 3049 3181 N
+ L Z IH s n/a 22 3035 3057 3181 N
+ L Z IY b n/a 22 3035 3041 3148 N
+ L Z IY e n/a 22 3035 3041 3148 N
+ L Z IY i n/a 22 3035 3042 3151 N
+ L Z IY s n/a 22 3035 3041 3148 N
+ L Z JH b n/a 22 3035 3097 3125 N
+ L Z JH e n/a 22 3035 3097 3127 N
+ L Z JH s n/a 22 3035 3097 3125 N
+ L Z K b n/a 22 3035 3102 3139 N
+ L Z K e n/a 22 3035 3102 3139 N
+ L Z K s n/a 22 3035 3102 3139 N
+ L Z L e n/a 22 3035 3098 3143 N
+ L Z L s n/a 22 3035 3098 3143 N
+ L Z M b n/a 22 3035 3097 3133 N
+ L Z M e n/a 22 3035 3097 3133 N
+ L Z M s n/a 22 3035 3097 3133 N
+ L Z N e n/a 22 3035 3097 3134 N
+ L Z N s n/a 22 3035 3097 3134 N
+ L Z NG e n/a 22 3035 3097 3133 N
+ L Z NG s n/a 22 3035 3097 3133 N
+ L Z OW b n/a 22 3035 3055 3165 N
+ L Z OW e n/a 22 3035 3065 3162 N
+ L Z OW i n/a 22 3035 3065 3165 N
+ L Z OW s n/a 22 3035 3065 3165 N
+ L Z OY b n/a 22 3035 3060 3167 N
+ L Z OY e n/a 22 3035 3060 3173 N
+ L Z OY s n/a 22 3035 3060 3167 N
+ L Z P e n/a 22 3035 3102 3140 N
+ L Z P s n/a 22 3035 3102 3140 N
+ L Z R e n/a 22 3035 3099 3144 N
+ L Z R s n/a 22 3035 3099 3144 N
+ L Z S b n/a 22 3035 3101 3136 N
+ L Z S e n/a 22 3035 3101 3136 N
+ L Z S s n/a 22 3035 3101 3136 N
+ L Z SH e n/a 22 3035 3101 3137 N
+ L Z SH s n/a 22 3035 3101 3137 N
+ L Z SIL e n/a 22 3035 3118 3142 N
+ L Z SIL s n/a 22 3035 3118 3142 N
+ L Z T b n/a 22 3035 3102 3138 N
+ L Z T e n/a 22 3035 3102 3138 N
+ L Z T s n/a 22 3035 3102 3138 N
+ L Z TH e n/a 22 3035 3101 3136 N
+ L Z TH s n/a 22 3035 3101 3135 N
+ L Z UH b n/a 22 3035 3055 3189 N
+ L Z UH e n/a 22 3035 3055 3189 N
+ L Z UH s n/a 22 3035 3055 3189 N
+ L Z UW b n/a 22 3035 3057 3192 N
+ L Z UW e n/a 22 3035 3057 3192 N
+ L Z UW s n/a 22 3035 3057 3192 N
+ L Z V e n/a 22 3035 3097 3130 N
+ L Z V s n/a 22 3035 3097 3130 N
+ L Z W b n/a 22 3035 3098 3143 N
+ L Z W e n/a 22 3035 3098 3143 N
+ L Z W s n/a 22 3035 3098 3143 N
+ L Z Y b n/a 22 3035 3041 3149 N
+ L Z Y e n/a 22 3035 3041 3150 N
+ L Z Y s n/a 22 3035 3041 3149 N
+ L Z Z e n/a 22 3035 3096 3131 N
+ L Z Z s n/a 22 3035 3096 3131 N
+ L Z ZH e n/a 22 3035 3096 3130 N
+ L Z ZH s n/a 22 3035 3096 3130 N
+ L ZH AA b n/a 22 3035 3064 3168 N
+ L ZH AA s n/a 22 3030 3064 3168 N
+ L ZH AE b n/a 22 3035 3063 3174 N
+ L ZH AE s n/a 22 3030 3063 3174 N
+ L ZH AH b n/a 22 3035 3061 3172 N
+ L ZH AH s n/a 22 3030 3061 3172 N
+ L ZH AO b n/a 22 3035 3064 3167 N
+ L ZH AO s n/a 22 3030 3064 3167 N
+ L ZH AW b n/a 22 3035 3065 3174 N
+ L ZH AW s n/a 22 3030 3065 3174 N
+ L ZH AY b n/a 22 3035 3060 3170 N
+ L ZH AY s n/a 22 3030 3060 3170 N
+ L ZH B s n/a 22 3030 3097 3125 N
+ L ZH CH s n/a 22 3030 3102 3138 N
+ L ZH D s n/a 22 3030 3097 3125 N
+ L ZH DH s n/a 22 3030 3097 3125 N
+ L ZH EH b n/a 22 3035 3054 3178 N
+ L ZH EH s n/a 22 3030 3061 3178 N
+ L ZH ER b n/a 22 3035 3065 3188 N
+ L ZH ER s n/a 22 3030 3065 3188 N
+ L ZH EY b n/a 22 3035 3054 3155 N
+ L ZH EY s n/a 22 3030 3060 3155 N
+ L ZH F b n/a 22 3035 3101 3135 N
+ L ZH F s n/a 22 3030 3101 3135 N
+ L ZH G b n/a 22 3035 3097 3125 N
+ L ZH G s n/a 22 3030 3097 3125 N
+ L ZH HH b n/a 22 3035 3101 3132 N
+ L ZH HH s n/a 22 3030 3101 3132 N
+ L ZH IH b n/a 22 3035 3057 3190 N
+ L ZH IH s n/a 22 3031 3057 3181 N
+ L ZH IY b n/a 22 3035 3041 3148 N
+ L ZH IY s n/a 22 3031 3041 3148 N
+ L ZH JH b n/a 22 3035 3097 3125 N
+ L ZH JH s n/a 22 3030 3097 3125 N
+ L ZH K b n/a 22 3035 3102 3139 N
+ L ZH K s n/a 22 3030 3102 3139 N
+ L ZH L s n/a 22 3030 3098 3143 N
+ L ZH M b n/a 22 3035 3097 3133 N
+ L ZH M s n/a 22 3030 3097 3133 N
+ L ZH N s n/a 22 3030 3097 3134 N
+ L ZH NG s n/a 22 3030 3097 3133 N
+ L ZH OW b n/a 22 3035 3055 3165 N
+ L ZH OW s n/a 22 3030 3065 3165 N
+ L ZH OY b n/a 22 3035 3060 3167 N
+ L ZH OY s n/a 22 3030 3060 3167 N
+ L ZH P s n/a 22 3030 3102 3140 N
+ L ZH R s n/a 22 3030 3099 3144 N
+ L ZH S b n/a 22 3035 3101 3136 N
+ L ZH S s n/a 22 3030 3101 3136 N
+ L ZH SH s n/a 22 3030 3101 3137 N
+ L ZH SIL s n/a 22 3030 3118 3142 N
+ L ZH T b n/a 22 3035 3102 3138 N
+ L ZH T s n/a 22 3030 3102 3138 N
+ L ZH TH s n/a 22 3030 3101 3135 N
+ L ZH UH b n/a 22 3035 3055 3189 N
+ L ZH UH s n/a 22 3031 3055 3189 N
+ L ZH UW b n/a 22 3035 3057 3192 N
+ L ZH UW s n/a 22 3031 3057 3192 N
+ L ZH V s n/a 22 3030 3097 3130 N
+ L ZH W b n/a 22 3035 3098 3143 N
+ L ZH W s n/a 22 3030 3098 3143 N
+ L ZH Y b n/a 22 3035 3041 3149 N
+ L ZH Y s n/a 22 3031 3041 3149 N
+ L ZH Z s n/a 22 3030 3096 3131 N
+ L ZH ZH s n/a 22 3030 3096 3130 N
+ M AA AA b n/a 23 3203 3252 3315 N
+ M AA AA e n/a 23 3193 3252 3314 N
+ M AA AA i n/a 23 3193 3252 3315 N
+ M AA AA s n/a 23 3193 3252 3315 N
+ M AA AE b n/a 23 3193 3270 3322 N
+ M AA AE e n/a 23 3193 3270 3325 N
+ M AA AE i n/a 23 3193 3270 3322 N
+ M AA AE s n/a 23 3193 3270 3322 N
+ M AA AH b n/a 23 3193 3252 3317 N
+ M AA AH e n/a 23 3193 3246 3307 N
+ M AA AH i n/a 23 3193 3244 3308 N
+ M AA AH s n/a 23 3193 3246 3307 N
+ M AA AO b n/a 23 3203 3251 3312 N
+ M AA AO e n/a 23 3193 3251 3314 N
+ M AA AO i n/a 23 3193 3252 3312 N
+ M AA AO s n/a 23 3193 3251 3314 N
+ M AA AW b n/a 23 3193 3270 3324 N
+ M AA AW e n/a 23 3193 3270 3324 N
+ M AA AW s n/a 23 3193 3270 3324 N
+ M AA AY b n/a 23 3203 3252 3318 N
+ M AA AY e n/a 23 3193 3252 3307 N
+ M AA AY i n/a 23 3193 3252 3318 N
+ M AA AY s n/a 23 3193 3252 3307 N
+ M AA B b n/a 23 3195 3289 3337 N
+ M AA B e n/a 23 3195 3289 3337 N
+ M AA B i n/a 23 3195 3291 3338 N
+ M AA B s n/a 23 3195 3289 3337 N
+ M AA CH e n/a 23 3193 3285 3343 N
+ M AA CH i n/a 23 3193 3281 3343 N
+ M AA CH s n/a 23 3193 3286 3343 N
+ M AA D b n/a 23 3193 3292 3335 N
+ M AA D e n/a 23 3193 3292 3335 N
+ M AA D i n/a 23 3193 3292 3335 N
+ M AA D s n/a 23 3193 3292 3335 N
+ M AA DH e n/a 23 3193 3294 3336 N
+ M AA DH s n/a 23 3193 3294 3336 N
+ M AA EH b n/a 23 3193 3270 3321 N
+ M AA EH e n/a 23 3193 3270 3325 N
+ M AA EH i n/a 23 3193 3270 3323 N
+ M AA EH s n/a 23 3193 3270 3321 N
+ M AA ER b n/a 23 3204 3252 3311 N
+ M AA ER e n/a 23 3193 3246 3311 N
+ M AA ER i n/a 23 3193 3246 3311 N
+ M AA ER s n/a 23 3193 3246 3311 N
+ M AA EY b n/a 23 3193 3270 3330 N
+ M AA EY e n/a 23 3193 3270 3330 N
+ M AA EY i n/a 23 3193 3270 3330 N
+ M AA EY s n/a 23 3193 3270 3330 N
+ M AA F b n/a 23 3193 3284 3341 N
+ M AA F e n/a 23 3193 3284 3341 N
+ M AA F i n/a 23 3193 3281 3341 N
+ M AA F s n/a 23 3193 3284 3341 N
+ M AA G b n/a 23 3193 3292 3335 N
+ M AA G e n/a 23 3193 3292 3335 N
+ M AA G i n/a 23 3193 3292 3335 N
+ M AA G s n/a 23 3193 3292 3335 N
+ M AA HH b n/a 23 3193 3288 3344 N
+ M AA HH e n/a 23 3193 3288 3344 N
+ M AA HH i n/a 23 3193 3281 3344 N
+ M AA HH s n/a 23 3193 3288 3344 N
+ M AA IH b n/a 23 3193 3270 3329 N
+ M AA IH e n/a 23 3193 3270 3327 N
+ M AA IH i n/a 23 3193 3270 3326 N
+ M AA IH s n/a 23 3193 3270 3327 N
+ M AA IY b n/a 23 3193 3270 3319 N
+ M AA IY e n/a 23 3193 3270 3319 N
+ M AA IY i n/a 23 3193 3270 3319 N
+ M AA IY s n/a 23 3193 3270 3319 N
+ M AA JH b n/a 23 3193 3292 3335 N
+ M AA JH e n/a 23 3193 3292 3335 N
+ M AA JH i n/a 23 3193 3292 3335 N
+ M AA JH s n/a 23 3193 3292 3335 N
+ M AA K b n/a 23 3193 3286 3343 N
+ M AA K e n/a 23 3193 3284 3343 N
+ M AA K i n/a 23 3193 3281 3343 N
+ M AA K s n/a 23 3193 3286 3343 N
+ M AA L b n/a 23 3204 3299 3331 N
+ M AA L e n/a 23 3193 3299 3331 N
+ M AA L i n/a 23 3193 3299 3331 N
+ M AA L s n/a 23 3193 3299 3331 N
+ M AA M e n/a 23 3195 3288 3333 N
+ M AA M i n/a 23 3195 3291 3333 N
+ M AA M s n/a 23 3195 3288 3333 N
+ M AA N b n/a 23 3193 3292 3333 N
+ M AA N e n/a 23 3193 3292 3333 N
+ M AA N i n/a 23 3193 3292 3333 N
+ M AA N s n/a 23 3193 3292 3333 N
+ M AA NG b n/a 23 3193 3292 3333 N
+ M AA NG e n/a 23 3193 3292 3333 N
+ M AA NG s n/a 23 3193 3292 3333 N
+ M AA OW b n/a 23 3204 3252 3313 N
+ M AA OW e n/a 23 3193 3252 3314 N
+ M AA OW i n/a 23 3193 3252 3313 N
+ M AA OW s n/a 23 3193 3252 3313 N
+ M AA OY b n/a 23 3203 3252 3312 N
+ M AA OY e n/a 23 3193 3252 3307 N
+ M AA OY i n/a 23 3193 3252 3312 N
+ M AA OY s n/a 23 3193 3252 3307 N
+ M AA P b n/a 23 3195 3284 3341 N
+ M AA P e n/a 23 3195 3284 3341 N
+ M AA P i n/a 23 3195 3281 3341 N
+ M AA P s n/a 23 3195 3284 3341 N
+ M AA R b n/a 23 3204 3299 3331 N
+ M AA R e n/a 23 3193 3299 3331 N
+ M AA R i n/a 23 3193 3299 3331 N
+ M AA R s n/a 23 3193 3299 3331 N
+ M AA S e n/a 23 3193 3287 3340 N
+ M AA S i n/a 23 3193 3287 3340 N
+ M AA S s n/a 23 3193 3287 3340 N
+ M AA SH e n/a 23 3193 3287 3340 N
+ M AA SH i n/a 23 3193 3281 3340 N
+ M AA SH s n/a 23 3193 3287 3340 N
+ M AA SIL e n/a 23 3193 3300 3346 N
+ M AA SIL s n/a 23 3193 3300 3346 N
+ M AA T b n/a 23 3193 3286 3343 N
+ M AA T e n/a 23 3193 3285 3343 N
+ M AA T i n/a 23 3193 3286 3343 N
+ M AA T s n/a 23 3193 3286 3343 N
+ M AA TH e n/a 23 3193 3285 3341 N
+ M AA TH s n/a 23 3193 3286 3341 N
+ M AA UH b n/a 23 3204 3252 3312 N
+ M AA UH e n/a 23 3193 3252 3316 N
+ M AA UH i n/a 23 3193 3252 3312 N
+ M AA UH s n/a 23 3193 3252 3316 N
+ M AA UW b n/a 23 3204 3252 3316 N
+ M AA UW e n/a 23 3193 3252 3316 N
+ M AA UW i n/a 23 3193 3252 3316 N
+ M AA UW s n/a 23 3193 3252 3316 N
+ M AA V b n/a 23 3193 3294 3337 N
+ M AA V e n/a 23 3193 3294 3337 N
+ M AA V i n/a 23 3193 3294 3338 N
+ M AA V s n/a 23 3193 3294 3337 N
+ M AA W b n/a 23 3204 3298 3332 N
+ M AA W e n/a 23 3193 3298 3332 N
+ M AA W i n/a 23 3193 3298 3332 N
+ M AA W s n/a 23 3193 3298 3332 N
+ M AA Y b n/a 23 3193 3297 3334 N
+ M AA Y e n/a 23 3193 3297 3334 N
+ M AA Y i n/a 23 3193 3297 3334 N
+ M AA Y s n/a 23 3193 3297 3334 N
+ M AA Z b n/a 23 3193 3294 3339 N
+ M AA Z e n/a 23 3193 3294 3339 N
+ M AA Z i n/a 23 3193 3294 3339 N
+ M AA Z s n/a 23 3193 3294 3339 N
+ M AA ZH e n/a 23 3193 3294 3339 N
+ M AA ZH s n/a 23 3193 3294 3339 N
+ M AE AA b n/a 23 3220 3258 3315 N
+ M AE AA e n/a 23 3220 3258 3314 N
+ M AE AA i n/a 23 3220 3258 3315 N
+ M AE AA s n/a 23 3220 3258 3315 N
+ M AE AE b n/a 23 3219 3273 3322 N
+ M AE AE e n/a 23 3219 3268 3325 N
+ M AE AE i n/a 23 3219 3273 3322 N
+ M AE AE s n/a 23 3219 3273 3322 N
+ M AE AH b n/a 23 3219 3258 3317 N
+ M AE AH e n/a 23 3219 3247 3307 N
+ M AE AH i n/a 23 3219 3247 3309 N
+ M AE AH s n/a 23 3219 3247 3307 N
+ M AE AO b n/a 23 3220 3253 3312 N
+ M AE AO e n/a 23 3220 3253 3314 N
+ M AE AO i n/a 23 3220 3253 3312 N
+ M AE AO s n/a 23 3220 3253 3314 N
+ M AE AW b n/a 23 3219 3273 3324 N
+ M AE AW e n/a 23 3219 3268 3324 N
+ M AE AW i n/a 23 3219 3273 3324 N
+ M AE AW s n/a 23 3219 3273 3324 N
+ M AE AY b n/a 23 3220 3258 3318 N
+ M AE AY e n/a 23 3220 3258 3307 N
+ M AE AY i n/a 23 3220 3258 3318 N
+ M AE AY s n/a 23 3220 3258 3307 N
+ M AE B b n/a 23 3220 3289 3337 N
+ M AE B e n/a 23 3220 3289 3337 N
+ M AE B i n/a 23 3220 3290 3337 N
+ M AE B s n/a 23 3220 3289 3337 N
+ M AE CH e n/a 23 3219 3285 3343 N
+ M AE CH i n/a 23 3219 3283 3343 N
+ M AE CH s n/a 23 3219 3286 3343 N
+ M AE D b n/a 23 3219 3292 3335 N
+ M AE D e n/a 23 3219 3292 3335 N
+ M AE D i n/a 23 3219 3292 3335 N
+ M AE D s n/a 23 3219 3292 3335 N
+ M AE DH e n/a 23 3219 3294 3336 N
+ M AE DH s n/a 23 3219 3294 3336 N
+ M AE EH b n/a 23 3219 3273 3321 N
+ M AE EH e n/a 23 3219 3268 3325 N
+ M AE EH i n/a 23 3219 3273 3323 N
+ M AE EH s n/a 23 3219 3273 3321 N
+ M AE ER b n/a 23 3220 3258 3311 N
+ M AE ER e n/a 23 3220 3249 3311 N
+ M AE ER i n/a 23 3220 3249 3311 N
+ M AE ER s n/a 23 3220 3249 3311 N
+ M AE EY b n/a 23 3219 3273 3330 N
+ M AE EY e n/a 23 3219 3269 3330 N
+ M AE EY i n/a 23 3219 3273 3330 N
+ M AE EY s n/a 23 3219 3273 3330 N
+ M AE F b n/a 23 3219 3284 3341 N
+ M AE F e n/a 23 3219 3284 3341 N
+ M AE F i n/a 23 3219 3283 3341 N
+ M AE F s n/a 23 3219 3284 3341 N
+ M AE G b n/a 23 3219 3292 3335 N
+ M AE G e n/a 23 3219 3292 3335 N
+ M AE G i n/a 23 3219 3292 3335 N
+ M AE G s n/a 23 3219 3292 3335 N
+ M AE HH b n/a 23 3219 3288 3344 N
+ M AE HH e n/a 23 3219 3288 3344 N
+ M AE HH i n/a 23 3219 3283 3344 N
+ M AE HH s n/a 23 3219 3288 3344 N
+ M AE IH b n/a 23 3219 3274 3329 N
+ M AE IH e n/a 23 3219 3268 3327 N
+ M AE IH i n/a 23 3219 3268 3326 N
+ M AE IH s n/a 23 3219 3268 3327 N
+ M AE IY b n/a 23 3219 3274 3319 N
+ M AE IY e n/a 23 3219 3269 3319 N
+ M AE IY i n/a 23 3219 3269 3319 N
+ M AE IY s n/a 23 3219 3269 3319 N
+ M AE JH b n/a 23 3219 3292 3335 N
+ M AE JH e n/a 23 3219 3292 3335 N
+ M AE JH i n/a 23 3219 3292 3335 N
+ M AE JH s n/a 23 3219 3292 3335 N
+ M AE K b n/a 23 3219 3286 3343 N
+ M AE K e n/a 23 3219 3284 3343 N
+ M AE K i n/a 23 3219 3283 3343 N
+ M AE K s n/a 23 3219 3286 3343 N
+ M AE L b n/a 23 3220 3299 3331 N
+ M AE L e n/a 23 3220 3299 3331 N
+ M AE L i n/a 23 3220 3299 3331 N
+ M AE L s n/a 23 3220 3299 3331 N
+ M AE M e n/a 23 3220 3288 3333 N
+ M AE M s n/a 23 3220 3288 3333 N
+ M AE N b n/a 23 3219 3292 3333 N
+ M AE N e n/a 23 3219 3292 3333 N
+ M AE N i n/a 23 3219 3292 3333 N
+ M AE N s n/a 23 3219 3292 3333 N
+ M AE NG b n/a 23 3219 3292 3333 N
+ M AE NG e n/a 23 3219 3292 3333 N
+ M AE NG s n/a 23 3219 3292 3333 N
+ M AE OW b n/a 23 3220 3258 3313 N
+ M AE OW e n/a 23 3220 3258 3314 N
+ M AE OW i n/a 23 3220 3258 3313 N
+ M AE OW s n/a 23 3220 3258 3313 N
+ M AE OY b n/a 23 3220 3258 3312 N
+ M AE OY e n/a 23 3220 3258 3307 N
+ M AE OY i n/a 23 3220 3258 3312 N
+ M AE OY s n/a 23 3220 3258 3307 N
+ M AE P b n/a 23 3218 3284 3341 N
+ M AE P e n/a 23 3218 3284 3341 N
+ M AE P i n/a 23 3218 3283 3341 N
+ M AE P s n/a 23 3218 3284 3341 N
+ M AE R b n/a 23 3220 3299 3331 N
+ M AE R e n/a 23 3220 3299 3331 N
+ M AE R i n/a 23 3220 3299 3331 N
+ M AE R s n/a 23 3220 3299 3331 N
+ M AE S e n/a 23 3219 3287 3340 N
+ M AE S i n/a 23 3219 3287 3340 N
+ M AE S s n/a 23 3219 3287 3340 N
+ M AE SH e n/a 23 3219 3287 3340 N
+ M AE SH i n/a 23 3219 3283 3340 N
+ M AE SH s n/a 23 3219 3287 3340 N
+ M AE SIL e n/a 23 3221 3303 3345 N
+ M AE SIL s n/a 23 3221 3303 3345 N
+ M AE T b n/a 23 3219 3286 3343 N
+ M AE T e n/a 23 3219 3285 3343 N
+ M AE T i n/a 23 3219 3286 3343 N
+ M AE T s n/a 23 3219 3286 3343 N
+ M AE TH e n/a 23 3219 3285 3341 N
+ M AE TH i n/a 23 3219 3283 3341 N
+ M AE TH s n/a 23 3219 3286 3341 N
+ M AE UH b n/a 23 3220 3257 3312 N
+ M AE UH e n/a 23 3220 3257 3316 N
+ M AE UH i n/a 23 3220 3257 3312 N
+ M AE UH s n/a 23 3220 3257 3316 N
+ M AE UW b n/a 23 3220 3257 3316 N
+ M AE UW e n/a 23 3220 3257 3316 N
+ M AE UW i n/a 23 3220 3257 3316 N
+ M AE UW s n/a 23 3220 3257 3316 N
+ M AE V b n/a 23 3219 3294 3337 N
+ M AE V e n/a 23 3219 3294 3337 N
+ M AE V i n/a 23 3219 3294 3337 N
+ M AE V s n/a 23 3219 3294 3337 N
+ M AE W b n/a 23 3220 3298 3332 N
+ M AE W e n/a 23 3220 3298 3332 N
+ M AE W i n/a 23 3220 3298 3332 N
+ M AE W s n/a 23 3220 3298 3332 N
+ M AE Y b n/a 23 3219 3297 3334 N
+ M AE Y e n/a 23 3219 3297 3334 N
+ M AE Y i n/a 23 3219 3297 3334 N
+ M AE Y s n/a 23 3219 3297 3334 N
+ M AE Z b n/a 23 3219 3294 3339 N
+ M AE Z e n/a 23 3219 3294 3339 N
+ M AE Z i n/a 23 3219 3294 3339 N
+ M AE Z s n/a 23 3219 3294 3339 N
+ M AE ZH e n/a 23 3219 3294 3339 N
+ M AE ZH s n/a 23 3219 3294 3339 N
+ M AH AA b n/a 23 3204 3256 3315 N
+ M AH AA e n/a 23 3198 3256 3314 N
+ M AH AA i n/a 23 3198 3256 3315 N
+ M AH AA s n/a 23 3198 3256 3315 N
+ M AH AE b n/a 23 3201 3272 3322 N
+ M AH AE e n/a 23 3202 3268 3325 N
+ M AH AE i n/a 23 3201 3272 3322 N
+ M AH AE s n/a 23 3203 3272 3322 N
+ M AH AH b n/a 23 3201 3256 3317 N
+ M AH AH e n/a 23 3203 3246 3307 N
+ M AH AH i n/a 23 3203 3245 3310 N
+ M AH AH s n/a 23 3203 3246 3307 N
+ M AH AO b n/a 23 3204 3253 3312 N
+ M AH AO e n/a 23 3198 3253 3314 N
+ M AH AO i n/a 23 3198 3253 3312 N
+ M AH AO s n/a 23 3198 3253 3314 N
+ M AH AW b n/a 23 3201 3272 3324 N
+ M AH AW e n/a 23 3202 3268 3324 N
+ M AH AW i n/a 23 3201 3272 3324 N
+ M AH AW s n/a 23 3203 3272 3324 N
+ M AH AY b n/a 23 3204 3256 3318 N
+ M AH AY e n/a 23 3198 3256 3307 N
+ M AH AY i n/a 23 3198 3256 3318 N
+ M AH AY s n/a 23 3198 3256 3307 N
+ M AH B b n/a 23 3201 3289 3337 N
+ M AH B e n/a 23 3197 3289 3337 N
+ M AH B i n/a 23 3195 3291 3338 N
+ M AH B s n/a 23 3197 3289 3337 N
+ M AH CH e n/a 23 3197 3285 3343 N
+ M AH CH i n/a 23 3195 3281 3343 N
+ M AH CH s n/a 23 3197 3285 3343 N
+ M AH D b n/a 23 3201 3292 3335 N
+ M AH D e n/a 23 3197 3292 3335 N
+ M AH D i n/a 23 3197 3292 3335 N
+ M AH D s n/a 23 3197 3292 3335 N
+ M AH DH e n/a 23 3199 3293 3336 N
+ M AH DH s n/a 23 3199 3293 3336 N
+ M AH EH b n/a 23 3201 3272 3321 N
+ M AH EH e n/a 23 3202 3268 3325 N
+ M AH EH i n/a 23 3201 3272 3323 N
+ M AH EH s n/a 23 3203 3272 3321 N
+ M AH ER b n/a 23 3204 3255 3311 N
+ M AH ER e n/a 23 3198 3249 3311 N
+ M AH ER i n/a 23 3198 3249 3311 N
+ M AH ER s n/a 23 3198 3249 3311 N
+ M AH EY b n/a 23 3200 3273 3330 N
+ M AH EY e n/a 23 3202 3269 3330 N
+ M AH EY i n/a 23 3201 3273 3330 N
+ M AH EY s n/a 23 3203 3273 3330 N
+ M AH F b n/a 23 3201 3284 3342 N
+ M AH F e n/a 23 3197 3284 3342 N
+ M AH F i n/a 23 3195 3281 3342 N
+ M AH F s n/a 23 3197 3284 3342 N
+ M AH G b n/a 23 3201 3292 3335 N
+ M AH G e n/a 23 3197 3292 3335 N
+ M AH G i n/a 23 3195 3292 3335 N
+ M AH G s n/a 23 3197 3292 3335 N
+ M AH HH b n/a 23 3201 3288 3344 N
+ M AH HH e n/a 23 3197 3288 3344 N
+ M AH HH i n/a 23 3195 3281 3344 N
+ M AH HH s n/a 23 3197 3288 3344 N
+ M AH IH b n/a 23 3200 3274 3329 N
+ M AH IH e n/a 23 3202 3268 3327 N
+ M AH IH i n/a 23 3202 3268 3327 N
+ M AH IH s n/a 23 3202 3268 3327 N
+ M AH IY b n/a 23 3200 3274 3319 N
+ M AH IY e n/a 23 3202 3269 3319 N
+ M AH IY i n/a 23 3200 3269 3319 N
+ M AH IY s n/a 23 3202 3269 3319 N
+ M AH JH b n/a 23 3201 3292 3335 N
+ M AH JH e n/a 23 3197 3292 3335 N
+ M AH JH s n/a 23 3197 3292 3335 N
+ M AH K b n/a 23 3201 3285 3343 N
+ M AH K e n/a 23 3197 3284 3343 N
+ M AH K i n/a 23 3194 3281 3343 N
+ M AH K s n/a 23 3197 3285 3343 N
+ M AH L b n/a 23 3204 3299 3331 N
+ M AH L e n/a 23 3198 3299 3331 N
+ M AH L i n/a 23 3194 3299 3331 N
+ M AH L s n/a 23 3198 3299 3331 N
+ M AH M e n/a 23 3197 3288 3333 N
+ M AH M i n/a 23 3195 3291 3333 N
+ M AH M s n/a 23 3197 3288 3333 N
+ M AH N b n/a 23 3201 3292 3333 N
+ M AH N e n/a 23 3197 3292 3333 N
+ M AH N i n/a 23 3197 3292 3333 N
+ M AH N s n/a 23 3197 3292 3333 N
+ M AH NG b n/a 23 3201 3292 3333 N
+ M AH NG e n/a 23 3197 3292 3333 N
+ M AH NG s n/a 23 3197 3292 3333 N
+ M AH OW b n/a 23 3204 3256 3313 N
+ M AH OW e n/a 23 3198 3256 3314 N
+ M AH OW i n/a 23 3198 3256 3313 N
+ M AH OW s n/a 23 3198 3256 3313 N
+ M AH OY b n/a 23 3204 3256 3312 N
+ M AH OY e n/a 23 3198 3256 3307 N
+ M AH OY i n/a 23 3198 3256 3312 N
+ M AH OY s n/a 23 3198 3256 3307 N
+ M AH P b n/a 23 3201 3284 3342 N
+ M AH P e n/a 23 3197 3284 3342 N
+ M AH P i n/a 23 3194 3281 3342 N
+ M AH P s n/a 23 3197 3284 3342 N
+ M AH R b n/a 23 3204 3299 3331 N
+ M AH R e n/a 23 3198 3299 3331 N
+ M AH R i n/a 23 3195 3299 3331 N
+ M AH R s n/a 23 3198 3299 3331 N
+ M AH S e n/a 23 3197 3287 3340 N
+ M AH S i n/a 23 3197 3287 3340 N
+ M AH S s n/a 23 3197 3287 3340 N
+ M AH SH e n/a 23 3197 3287 3340 N
+ M AH SH i n/a 23 3195 3281 3340 N
+ M AH SH s n/a 23 3197 3287 3340 N
+ M AH SIL e n/a 23 3196 3301 3346 N
+ M AH SIL s n/a 23 3196 3301 3346 N
+ M AH T b n/a 23 3201 3285 3343 N
+ M AH T e n/a 23 3197 3285 3343 N
+ M AH T i n/a 23 3197 3285 3343 N
+ M AH T s n/a 23 3197 3285 3343 N
+ M AH TH e n/a 23 3199 3285 3342 N
+ M AH TH i n/a 23 3195 3281 3341 N
+ M AH TH s n/a 23 3199 3285 3342 N
+ M AH UH b n/a 23 3204 3257 3312 N
+ M AH UH e n/a 23 3198 3257 3316 N
+ M AH UH i n/a 23 3198 3257 3312 N
+ M AH UH s n/a 23 3198 3257 3316 N
+ M AH UW b n/a 23 3204 3257 3316 N
+ M AH UW e n/a 23 3198 3257 3316 N
+ M AH UW i n/a 23 3198 3257 3316 N
+ M AH UW s n/a 23 3198 3257 3316 N
+ M AH V b n/a 23 3201 3294 3337 N
+ M AH V e n/a 23 3197 3294 3337 N
+ M AH V i n/a 23 3195 3294 3338 N
+ M AH V s n/a 23 3197 3294 3337 N
+ M AH W b n/a 23 3204 3298 3332 N
+ M AH W e n/a 23 3198 3298 3332 N
+ M AH W i n/a 23 3195 3298 3332 N
+ M AH W s n/a 23 3198 3298 3332 N
+ M AH Y b n/a 23 3200 3297 3334 N
+ M AH Y e n/a 23 3202 3297 3334 N
+ M AH Y i n/a 23 3200 3297 3334 N
+ M AH Y s n/a 23 3202 3297 3334 N
+ M AH Z b n/a 23 3201 3294 3339 N
+ M AH Z e n/a 23 3196 3294 3339 N
+ M AH Z i n/a 23 3196 3294 3339 N
+ M AH Z s n/a 23 3196 3294 3339 N
+ M AH ZH e n/a 23 3197 3294 3339 N
+ M AH ZH s n/a 23 3197 3294 3339 N
+ M AO AA b n/a 23 3203 3252 3315 N
+ M AO AA e n/a 23 3193 3252 3314 N
+ M AO AA s n/a 23 3193 3252 3315 N
+ M AO AE b n/a 23 3193 3270 3322 N
+ M AO AE e n/a 23 3193 3270 3325 N
+ M AO AE i n/a 23 3193 3270 3322 N
+ M AO AE s n/a 23 3193 3270 3322 N
+ M AO AH b n/a 23 3193 3252 3317 N
+ M AO AH e n/a 23 3193 3246 3307 N
+ M AO AH i n/a 23 3193 3244 3304 N
+ M AO AH s n/a 23 3193 3246 3307 N
+ M AO AO b n/a 23 3203 3251 3312 N
+ M AO AO e n/a 23 3193 3251 3314 N
+ M AO AO i n/a 23 3193 3252 3312 N
+ M AO AO s n/a 23 3193 3251 3314 N
+ M AO AW b n/a 23 3193 3270 3324 N
+ M AO AW e n/a 23 3193 3270 3324 N
+ M AO AW s n/a 23 3193 3270 3324 N
+ M AO AY b n/a 23 3203 3252 3318 N
+ M AO AY e n/a 23 3193 3252 3307 N
+ M AO AY s n/a 23 3193 3252 3307 N
+ M AO B b n/a 23 3195 3289 3337 N
+ M AO B e n/a 23 3195 3289 3337 N
+ M AO B i n/a 23 3195 3291 3338 N
+ M AO B s n/a 23 3195 3289 3337 N
+ M AO CH e n/a 23 3193 3285 3343 N
+ M AO CH s n/a 23 3193 3286 3343 N
+ M AO D b n/a 23 3193 3292 3335 N
+ M AO D e n/a 23 3193 3292 3335 N
+ M AO D s n/a 23 3193 3292 3335 N
+ M AO DH e n/a 23 3193 3294 3336 N
+ M AO DH s n/a 23 3193 3294 3336 N
+ M AO EH b n/a 23 3193 3270 3321 N
+ M AO EH e n/a 23 3193 3270 3325 N
+ M AO EH i n/a 23 3193 3270 3323 N
+ M AO EH s n/a 23 3193 3270 3321 N
+ M AO ER b n/a 23 3204 3252 3311 N
+ M AO ER e n/a 23 3193 3246 3311 N
+ M AO ER i n/a 23 3193 3246 3311 N
+ M AO ER s n/a 23 3193 3246 3311 N
+ M AO EY b n/a 23 3193 3270 3330 N
+ M AO EY e n/a 23 3193 3270 3330 N
+ M AO EY i n/a 23 3193 3270 3330 N
+ M AO EY s n/a 23 3193 3270 3330 N
+ M AO F b n/a 23 3193 3284 3341 N
+ M AO F e n/a 23 3193 3284 3341 N
+ M AO F s n/a 23 3193 3284 3341 N
+ M AO G b n/a 23 3193 3292 3335 N
+ M AO G e n/a 23 3193 3292 3335 N
+ M AO G s n/a 23 3193 3292 3335 N
+ M AO HH b n/a 23 3193 3288 3344 N
+ M AO HH e n/a 23 3193 3288 3344 N
+ M AO HH s n/a 23 3193 3288 3344 N
+ M AO IH b n/a 23 3193 3270 3329 N
+ M AO IH e n/a 23 3193 3270 3327 N
+ M AO IH i n/a 23 3193 3270 3326 N
+ M AO IH s n/a 23 3193 3270 3327 N
+ M AO IY b n/a 23 3193 3270 3319 N
+ M AO IY e n/a 23 3193 3270 3319 N
+ M AO IY i n/a 23 3193 3270 3319 N
+ M AO IY s n/a 23 3193 3270 3319 N
+ M AO JH b n/a 23 3193 3292 3335 N
+ M AO JH e n/a 23 3193 3292 3335 N
+ M AO JH s n/a 23 3193 3292 3335 N
+ M AO K b n/a 23 3193 3286 3343 N
+ M AO K e n/a 23 3193 3284 3343 N
+ M AO K s n/a 23 3193 3286 3343 N
+ M AO L b n/a 23 3204 3299 3331 N
+ M AO L e n/a 23 3193 3299 3331 N
+ M AO L s n/a 23 3193 3299 3331 N
+ M AO M e n/a 23 3195 3288 3333 N
+ M AO M s n/a 23 3195 3288 3333 N
+ M AO N b n/a 23 3193 3292 3333 N
+ M AO N e n/a 23 3193 3292 3333 N
+ M AO N s n/a 23 3193 3292 3333 N
+ M AO NG b n/a 23 3193 3292 3333 N
+ M AO NG e n/a 23 3193 3292 3333 N
+ M AO NG s n/a 23 3193 3292 3333 N
+ M AO OW b n/a 23 3204 3252 3313 N
+ M AO OW e n/a 23 3193 3252 3314 N
+ M AO OW s n/a 23 3193 3252 3313 N
+ M AO OY b n/a 23 3203 3252 3312 N
+ M AO OY e n/a 23 3193 3252 3307 N
+ M AO OY s n/a 23 3193 3252 3307 N
+ M AO P b n/a 23 3195 3284 3341 N
+ M AO P e n/a 23 3195 3284 3341 N
+ M AO P i n/a 23 3195 3281 3341 N
+ M AO P s n/a 23 3195 3284 3341 N
+ M AO R b n/a 23 3204 3299 3331 N
+ M AO R e n/a 23 3193 3299 3331 N
+ M AO R s n/a 23 3193 3299 3331 N
+ M AO S e n/a 23 3193 3287 3340 N
+ M AO S s n/a 23 3193 3287 3340 N
+ M AO SH e n/a 23 3193 3287 3340 N
+ M AO SH s n/a 23 3193 3287 3340 N
+ M AO SIL e n/a 23 3193 3300 3346 N
+ M AO SIL s n/a 23 3193 3300 3346 N
+ M AO T b n/a 23 3193 3286 3343 N
+ M AO T e n/a 23 3193 3285 3343 N
+ M AO T s n/a 23 3193 3286 3343 N
+ M AO TH e n/a 23 3193 3285 3341 N
+ M AO TH s n/a 23 3193 3286 3341 N
+ M AO UH b n/a 23 3204 3252 3312 N
+ M AO UH e n/a 23 3193 3252 3316 N
+ M AO UH s n/a 23 3193 3252 3316 N
+ M AO UW b n/a 23 3204 3252 3316 N
+ M AO UW e n/a 23 3193 3252 3316 N
+ M AO UW i n/a 23 3193 3252 3316 N
+ M AO UW s n/a 23 3193 3252 3316 N
+ M AO V b n/a 23 3193 3294 3337 N
+ M AO V e n/a 23 3193 3294 3337 N
+ M AO V s n/a 23 3193 3294 3337 N
+ M AO W b n/a 23 3204 3298 3332 N
+ M AO W e n/a 23 3193 3298 3332 N
+ M AO W s n/a 23 3193 3298 3332 N
+ M AO Y b n/a 23 3193 3297 3334 N
+ M AO Y e n/a 23 3193 3297 3334 N
+ M AO Y s n/a 23 3193 3297 3334 N
+ M AO Z b n/a 23 3193 3294 3339 N
+ M AO Z e n/a 23 3193 3294 3339 N
+ M AO Z i n/a 23 3193 3294 3339 N
+ M AO Z s n/a 23 3193 3294 3339 N
+ M AO ZH e n/a 23 3193 3294 3339 N
+ M AO ZH s n/a 23 3193 3294 3339 N
+ M AW AA b n/a 23 3203 3252 3315 N
+ M AW AA e n/a 23 3193 3252 3314 N
+ M AW AA s n/a 23 3193 3252 3315 N
+ M AW AE b n/a 23 3193 3270 3322 N
+ M AW AE e n/a 23 3193 3270 3325 N
+ M AW AE s n/a 23 3193 3270 3322 N
+ M AW AH b n/a 23 3193 3252 3317 N
+ M AW AH e n/a 23 3193 3246 3307 N
+ M AW AH i n/a 23 3193 3246 3308 N
+ M AW AH s n/a 23 3193 3246 3307 N
+ M AW AO b n/a 23 3203 3251 3312 N
+ M AW AO e n/a 23 3193 3251 3314 N
+ M AW AO s n/a 23 3193 3251 3314 N
+ M AW AW b n/a 23 3193 3270 3324 N
+ M AW AW e n/a 23 3193 3270 3324 N
+ M AW AW s n/a 23 3193 3270 3324 N
+ M AW AY b n/a 23 3203 3252 3318 N
+ M AW AY e n/a 23 3193 3252 3307 N
+ M AW AY i n/a 23 3193 3252 3318 N
+ M AW AY s n/a 23 3193 3252 3307 N
+ M AW B b n/a 23 3195 3289 3337 N
+ M AW B e n/a 23 3195 3289 3337 N
+ M AW B i n/a 23 3195 3291 3337 N
+ M AW B s n/a 23 3195 3289 3337 N
+ M AW CH e n/a 23 3193 3285 3343 N
+ M AW CH s n/a 23 3193 3286 3343 N
+ M AW D b n/a 23 3193 3292 3335 N
+ M AW D e n/a 23 3193 3292 3335 N
+ M AW D s n/a 23 3193 3292 3335 N
+ M AW DH e n/a 23 3193 3294 3336 N
+ M AW DH s n/a 23 3193 3294 3336 N
+ M AW EH b n/a 23 3193 3270 3323 N
+ M AW EH e n/a 23 3193 3270 3325 N
+ M AW EH i n/a 23 3193 3270 3323 N
+ M AW EH s n/a 23 3193 3270 3323 N
+ M AW ER b n/a 23 3204 3252 3311 N
+ M AW ER e n/a 23 3193 3246 3311 N
+ M AW ER i n/a 23 3193 3246 3311 N
+ M AW ER s n/a 23 3193 3246 3311 N
+ M AW EY b n/a 23 3193 3270 3330 N
+ M AW EY e n/a 23 3193 3270 3330 N
+ M AW EY s n/a 23 3193 3270 3330 N
+ M AW F b n/a 23 3193 3284 3341 N
+ M AW F e n/a 23 3193 3284 3341 N
+ M AW F s n/a 23 3193 3284 3341 N
+ M AW G b n/a 23 3193 3292 3335 N
+ M AW G e n/a 23 3193 3292 3335 N
+ M AW G i n/a 23 3193 3292 3335 N
+ M AW G s n/a 23 3193 3292 3335 N
+ M AW HH b n/a 23 3193 3288 3344 N
+ M AW HH e n/a 23 3193 3288 3344 N
+ M AW HH i n/a 23 3193 3281 3344 N
+ M AW HH s n/a 23 3193 3288 3344 N
+ M AW IH b n/a 23 3193 3270 3329 N
+ M AW IH e n/a 23 3193 3270 3326 N
+ M AW IH s n/a 23 3193 3270 3326 N
+ M AW IY b n/a 23 3193 3270 3319 N
+ M AW IY e n/a 23 3193 3270 3319 N
+ M AW IY i n/a 23 3193 3270 3319 N
+ M AW IY s n/a 23 3193 3270 3319 N
+ M AW JH b n/a 23 3193 3292 3335 N
+ M AW JH e n/a 23 3193 3292 3335 N
+ M AW JH s n/a 23 3193 3292 3335 N
+ M AW K b n/a 23 3193 3286 3343 N
+ M AW K e n/a 23 3193 3284 3343 N
+ M AW K s n/a 23 3193 3286 3343 N
+ M AW L b n/a 23 3204 3299 3331 N
+ M AW L e n/a 23 3193 3299 3331 N
+ M AW L s n/a 23 3193 3299 3331 N
+ M AW M e n/a 23 3195 3288 3333 N
+ M AW M s n/a 23 3195 3288 3333 N
+ M AW N b n/a 23 3193 3292 3333 N
+ M AW N e n/a 23 3193 3292 3333 N
+ M AW N s n/a 23 3193 3292 3333 N
+ M AW NG b n/a 23 3193 3292 3333 N
+ M AW NG e n/a 23 3193 3292 3333 N
+ M AW NG s n/a 23 3193 3292 3333 N
+ M AW OW b n/a 23 3204 3252 3313 N
+ M AW OW e n/a 23 3193 3252 3314 N
+ M AW OW s n/a 23 3193 3252 3313 N
+ M AW OY b n/a 23 3203 3252 3312 N
+ M AW OY e n/a 23 3193 3252 3307 N
+ M AW OY s n/a 23 3193 3252 3307 N
+ M AW P b n/a 23 3194 3284 3341 N
+ M AW P e n/a 23 3194 3284 3341 N
+ M AW P s n/a 23 3194 3284 3341 N
+ M AW R b n/a 23 3204 3299 3331 N
+ M AW R e n/a 23 3193 3299 3331 N
+ M AW R s n/a 23 3193 3299 3331 N
+ M AW S e n/a 23 3193 3287 3340 N
+ M AW S i n/a 23 3193 3287 3340 N
+ M AW S s n/a 23 3193 3287 3340 N
+ M AW SH e n/a 23 3193 3287 3340 N
+ M AW SH s n/a 23 3193 3287 3340 N
+ M AW SIL e n/a 23 3193 3300 3345 N
+ M AW SIL s n/a 23 3193 3300 3345 N
+ M AW T b n/a 23 3193 3286 3343 N
+ M AW T e n/a 23 3193 3285 3343 N
+ M AW T s n/a 23 3193 3286 3343 N
+ M AW TH e n/a 23 3193 3285 3341 N
+ M AW TH s n/a 23 3193 3286 3341 N
+ M AW UH b n/a 23 3204 3252 3312 N
+ M AW UH e n/a 23 3193 3252 3316 N
+ M AW UH s n/a 23 3193 3252 3316 N
+ M AW UW b n/a 23 3204 3252 3316 N
+ M AW UW e n/a 23 3193 3252 3316 N
+ M AW UW i n/a 23 3193 3252 3316 N
+ M AW UW s n/a 23 3193 3252 3316 N
+ M AW V b n/a 23 3193 3294 3337 N
+ M AW V e n/a 23 3193 3294 3337 N
+ M AW V s n/a 23 3193 3294 3337 N
+ M AW W b n/a 23 3204 3298 3332 N
+ M AW W e n/a 23 3193 3298 3332 N
+ M AW W s n/a 23 3193 3298 3332 N
+ M AW Y b n/a 23 3193 3297 3334 N
+ M AW Y e n/a 23 3193 3297 3334 N
+ M AW Y s n/a 23 3193 3297 3334 N
+ M AW Z b n/a 23 3193 3294 3339 N
+ M AW Z e n/a 23 3193 3294 3339 N
+ M AW Z i n/a 23 3193 3294 3339 N
+ M AW Z s n/a 23 3193 3294 3339 N
+ M AW ZH e n/a 23 3193 3294 3339 N
+ M AW ZH s n/a 23 3193 3294 3339 N
+ M AY AA b n/a 23 3226 3258 3315 N
+ M AY AA e n/a 23 3226 3258 3314 N
+ M AY AA i n/a 23 3226 3258 3315 N
+ M AY AA s n/a 23 3226 3258 3315 N
+ M AY AE b n/a 23 3226 3273 3322 N
+ M AY AE e n/a 23 3226 3269 3325 N
+ M AY AE i n/a 23 3226 3273 3322 N
+ M AY AE s n/a 23 3226 3273 3322 N
+ M AY AH b n/a 23 3226 3258 3317 N
+ M AY AH e n/a 23 3226 3247 3307 N
+ M AY AH i n/a 23 3226 3248 3309 N
+ M AY AH s n/a 23 3226 3247 3307 N
+ M AY AO b n/a 23 3226 3253 3312 N
+ M AY AO e n/a 23 3226 3253 3314 N
+ M AY AO i n/a 23 3226 3253 3312 N
+ M AY AO s n/a 23 3226 3253 3314 N
+ M AY AW b n/a 23 3226 3273 3324 N
+ M AY AW e n/a 23 3226 3269 3324 N
+ M AY AW i n/a 23 3226 3273 3324 N
+ M AY AW s n/a 23 3226 3273 3324 N
+ M AY AY b n/a 23 3226 3258 3318 N
+ M AY AY e n/a 23 3226 3258 3307 N
+ M AY AY i n/a 23 3226 3258 3318 N
+ M AY AY s n/a 23 3226 3258 3307 N
+ M AY B b n/a 23 3227 3289 3337 N
+ M AY B e n/a 23 3227 3289 3337 N
+ M AY B i n/a 23 3227 3290 3338 N
+ M AY B s n/a 23 3227 3289 3337 N
+ M AY CH e n/a 23 3227 3286 3343 N
+ M AY CH s n/a 23 3227 3286 3343 N
+ M AY D b n/a 23 3227 3296 3335 N
+ M AY D e n/a 23 3227 3296 3335 N
+ M AY D i n/a 23 3227 3296 3335 N
+ M AY D s n/a 23 3227 3296 3335 N
+ M AY DH e n/a 23 3227 3296 3336 N
+ M AY DH s n/a 23 3227 3296 3336 N
+ M AY EH b n/a 23 3226 3273 3321 N
+ M AY EH e n/a 23 3226 3269 3325 N
+ M AY EH i n/a 23 3226 3273 3323 N
+ M AY EH s n/a 23 3226 3273 3321 N
+ M AY ER b n/a 23 3226 3258 3311 N
+ M AY ER e n/a 23 3226 3249 3311 N
+ M AY ER i n/a 23 3226 3249 3311 N
+ M AY ER s n/a 23 3226 3249 3311 N
+ M AY EY b n/a 23 3226 3273 3330 N
+ M AY EY e n/a 23 3226 3269 3330 N
+ M AY EY i n/a 23 3226 3273 3330 N
+ M AY EY s n/a 23 3226 3273 3330 N
+ M AY F b n/a 23 3227 3284 3341 N
+ M AY F e n/a 23 3227 3284 3341 N
+ M AY F i n/a 23 3227 3283 3341 N
+ M AY F s n/a 23 3227 3284 3341 N
+ M AY G b n/a 23 3227 3296 3335 N
+ M AY G e n/a 23 3227 3296 3335 N
+ M AY G s n/a 23 3227 3296 3335 N
+ M AY HH b n/a 23 3227 3288 3344 N
+ M AY HH e n/a 23 3227 3288 3344 N
+ M AY HH i n/a 23 3227 3283 3344 N
+ M AY HH s n/a 23 3227 3288 3344 N
+ M AY IH b n/a 23 3226 3274 3329 N
+ M AY IH e n/a 23 3226 3269 3327 N
+ M AY IH i n/a 23 3226 3269 3327 N
+ M AY IH s n/a 23 3226 3269 3327 N
+ M AY IY b n/a 23 3226 3274 3319 N
+ M AY IY e n/a 23 3226 3269 3319 N
+ M AY IY i n/a 23 3226 3269 3319 N
+ M AY IY s n/a 23 3226 3269 3319 N
+ M AY JH b n/a 23 3227 3296 3335 N
+ M AY JH e n/a 23 3227 3296 3335 N
+ M AY JH s n/a 23 3227 3296 3335 N
+ M AY K b n/a 23 3227 3286 3343 N
+ M AY K e n/a 23 3227 3286 3343 N
+ M AY K i n/a 23 3227 3283 3343 N
+ M AY K s n/a 23 3227 3286 3343 N
+ M AY L b n/a 23 3226 3299 3331 N
+ M AY L e n/a 23 3226 3299 3331 N
+ M AY L i n/a 23 3226 3299 3331 N
+ M AY L s n/a 23 3226 3299 3331 N
+ M AY M e n/a 23 3227 3289 3333 N
+ M AY M s n/a 23 3227 3289 3333 N
+ M AY N b n/a 23 3227 3296 3333 N
+ M AY N e n/a 23 3227 3296 3333 N
+ M AY N i n/a 23 3227 3296 3333 N
+ M AY N s n/a 23 3227 3296 3333 N
+ M AY NG b n/a 23 3227 3296 3333 N
+ M AY NG e n/a 23 3227 3296 3333 N
+ M AY NG s n/a 23 3227 3296 3333 N
+ M AY OW b n/a 23 3226 3258 3313 N
+ M AY OW e n/a 23 3226 3258 3314 N
+ M AY OW i n/a 23 3226 3258 3313 N
+ M AY OW s n/a 23 3226 3258 3313 N
+ M AY OY b n/a 23 3226 3258 3312 N
+ M AY OY e n/a 23 3226 3258 3307 N
+ M AY OY s n/a 23 3226 3258 3307 N
+ M AY P b n/a 23 3227 3284 3341 N
+ M AY P e n/a 23 3227 3284 3341 N
+ M AY P i n/a 23 3227 3283 3341 N
+ M AY P s n/a 23 3227 3284 3341 N
+ M AY R b n/a 23 3226 3299 3331 N
+ M AY R e n/a 23 3226 3299 3331 N
+ M AY R s n/a 23 3226 3299 3331 N
+ M AY S e n/a 23 3227 3287 3340 N
+ M AY S i n/a 23 3227 3287 3340 N
+ M AY S s n/a 23 3227 3287 3340 N
+ M AY SH e n/a 23 3227 3287 3340 N
+ M AY SH i n/a 23 3227 3283 3340 N
+ M AY SH s n/a 23 3227 3287 3340 N
+ M AY SIL e n/a 23 3227 3302 3346 N
+ M AY SIL s n/a 23 3227 3302 3346 N
+ M AY T b n/a 23 3227 3286 3343 N
+ M AY T e n/a 23 3227 3286 3343 N
+ M AY T i n/a 23 3227 3286 3343 N
+ M AY T s n/a 23 3227 3286 3343 N
+ M AY TH e n/a 23 3227 3286 3341 N
+ M AY TH s n/a 23 3227 3286 3341 N
+ M AY UH b n/a 23 3226 3257 3312 N
+ M AY UH e n/a 23 3226 3257 3316 N
+ M AY UH s n/a 23 3226 3257 3316 N
+ M AY UW b n/a 23 3226 3257 3316 N
+ M AY UW e n/a 23 3226 3257 3316 N
+ M AY UW i n/a 23 3226 3257 3316 N
+ M AY UW s n/a 23 3226 3257 3316 N
+ M AY V b n/a 23 3227 3296 3337 N
+ M AY V e n/a 23 3227 3296 3337 N
+ M AY V s n/a 23 3227 3296 3337 N
+ M AY W b n/a 23 3227 3298 3332 N
+ M AY W e n/a 23 3227 3298 3332 N
+ M AY W i n/a 23 3227 3298 3332 N
+ M AY W s n/a 23 3227 3298 3332 N
+ M AY Y b n/a 23 3226 3297 3334 N
+ M AY Y e n/a 23 3226 3297 3334 N
+ M AY Y i n/a 23 3226 3297 3334 N
+ M AY Y s n/a 23 3226 3297 3334 N
+ M AY Z b n/a 23 3227 3296 3339 N
+ M AY Z e n/a 23 3227 3296 3339 N
+ M AY Z i n/a 23 3227 3296 3339 N
+ M AY Z s n/a 23 3227 3296 3339 N
+ M AY ZH e n/a 23 3227 3296 3339 N
+ M AY ZH s n/a 23 3227 3296 3339 N
+ M B AA b n/a 23 3232 3264 3315 N
+ M B AA e n/a 23 3232 3264 3314 N
+ M B AA s n/a 23 3232 3264 3315 N
+ M B AE b n/a 23 3234 3276 3322 N
+ M B AE e n/a 23 3234 3276 3325 N
+ M B AE i n/a 23 3234 3276 3322 N
+ M B AE s n/a 23 3234 3276 3322 N
+ M B AH b n/a 23 3234 3264 3317 N
+ M B AH e n/a 23 3234 3264 3307 N
+ M B AH i n/a 23 3234 3259 3305 N
+ M B AH s n/a 23 3234 3264 3307 N
+ M B AO b n/a 23 3232 3260 3312 N
+ M B AO e n/a 23 3232 3260 3314 N
+ M B AO s n/a 23 3232 3260 3314 N
+ M B AW b n/a 23 3234 3276 3324 N
+ M B AW e n/a 23 3234 3276 3324 N
+ M B AW s n/a 23 3234 3276 3324 N
+ M B AY b n/a 23 3232 3265 3318 N
+ M B AY e n/a 23 3232 3265 3307 N
+ M B AY i n/a 23 3232 3265 3318 N
+ M B AY s n/a 23 3232 3265 3307 N
+ M B B b n/a 23 3234 3289 3337 N
+ M B B e n/a 23 3234 3289 3337 N
+ M B B s n/a 23 3234 3289 3337 N
+ M B CH e n/a 23 3234 3285 3343 N
+ M B CH s n/a 23 3234 3286 3343 N
+ M B D b n/a 23 3234 3292 3335 N
+ M B D e n/a 23 3234 3292 3335 N
+ M B D i n/a 23 3234 3292 3335 N
+ M B D s n/a 23 3234 3292 3335 N
+ M B DH e n/a 23 3234 3294 3336 N
+ M B DH s n/a 23 3234 3294 3336 N
+ M B EH b n/a 23 3234 3276 3321 N
+ M B EH e n/a 23 3234 3276 3325 N
+ M B EH s n/a 23 3234 3276 3321 N
+ M B ER b n/a 23 3232 3267 3311 N
+ M B ER e n/a 23 3232 3267 3311 N
+ M B ER i n/a 23 3232 3267 3311 N
+ M B ER s n/a 23 3232 3267 3311 N
+ M B EY b n/a 23 3234 3276 3330 N
+ M B EY e n/a 23 3234 3276 3330 N
+ M B EY s n/a 23 3234 3276 3330 N
+ M B F b n/a 23 3234 3284 3342 N
+ M B F e n/a 23 3234 3284 3342 N
+ M B F s n/a 23 3234 3284 3342 N
+ M B G b n/a 23 3234 3292 3335 N
+ M B G e n/a 23 3234 3292 3335 N
+ M B G s n/a 23 3234 3292 3335 N
+ M B HH b n/a 23 3234 3288 3344 N
+ M B HH e n/a 23 3234 3288 3344 N
+ M B HH s n/a 23 3234 3288 3344 N
+ M B IH b n/a 23 3234 3280 3329 N
+ M B IH e n/a 23 3234 3280 3329 N
+ M B IH i n/a 23 3234 3280 3329 N
+ M B IH s n/a 23 3234 3280 3329 N
+ M B IY b n/a 23 3234 3279 3320 N
+ M B IY e n/a 23 3234 3279 3320 N
+ M B IY i n/a 23 3234 3279 3320 N
+ M B IY s n/a 23 3234 3279 3320 N
+ M B JH b n/a 23 3234 3292 3335 N
+ M B JH e n/a 23 3234 3292 3335 N
+ M B JH s n/a 23 3234 3292 3335 N
+ M B K b n/a 23 3234 3286 3343 N
+ M B K e n/a 23 3234 3284 3343 N
+ M B K s n/a 23 3234 3286 3343 N
+ M B L b n/a 23 3232 3299 3331 N
+ M B L e n/a 23 3232 3299 3331 N
+ M B L s n/a 23 3232 3299 3331 N
+ M B M e n/a 23 3234 3288 3333 N
+ M B M s n/a 23 3234 3288 3333 N
+ M B N b n/a 23 3234 3292 3333 N
+ M B N e n/a 23 3234 3292 3333 N
+ M B N s n/a 23 3234 3292 3333 N
+ M B NG b n/a 23 3234 3292 3333 N
+ M B NG e n/a 23 3234 3292 3333 N
+ M B NG s n/a 23 3234 3292 3333 N
+ M B OW b n/a 23 3232 3264 3313 N
+ M B OW e n/a 23 3232 3264 3314 N
+ M B OW s n/a 23 3232 3264 3313 N
+ M B OY b n/a 23 3232 3265 3312 N
+ M B OY e n/a 23 3232 3265 3307 N
+ M B OY s n/a 23 3232 3265 3307 N
+ M B P b n/a 23 3234 3284 3342 N
+ M B P e n/a 23 3234 3284 3342 N
+ M B P s n/a 23 3234 3284 3342 N
+ M B R b n/a 23 3232 3299 3331 N
+ M B R e n/a 23 3232 3299 3331 N
+ M B R s n/a 23 3232 3299 3331 N
+ M B S e n/a 23 3234 3287 3340 N
+ M B S s n/a 23 3234 3287 3340 N
+ M B SH e n/a 23 3234 3287 3340 N
+ M B SH s n/a 23 3234 3287 3340 N
+ M B SIL e n/a 23 3234 3303 3345 N
+ M B SIL s n/a 23 3234 3303 3345 N
+ M B T b n/a 23 3234 3286 3343 N
+ M B T e n/a 23 3234 3285 3343 N
+ M B T s n/a 23 3234 3286 3343 N
+ M B TH e n/a 23 3234 3285 3342 N
+ M B TH s n/a 23 3234 3286 3342 N
+ M B UH b n/a 23 3232 3264 3312 N
+ M B UH e n/a 23 3232 3264 3316 N
+ M B UH s n/a 23 3232 3264 3316 N
+ M B UW b n/a 23 3232 3261 3316 N
+ M B UW e n/a 23 3232 3261 3316 N
+ M B UW s n/a 23 3232 3261 3316 N
+ M B V b n/a 23 3234 3294 3337 N
+ M B V e n/a 23 3234 3294 3337 N
+ M B V s n/a 23 3234 3294 3337 N
+ M B W b n/a 23 3232 3298 3332 N
+ M B W e n/a 23 3232 3298 3332 N
+ M B W s n/a 23 3232 3298 3332 N
+ M B Y b n/a 23 3234 3297 3334 N
+ M B Y e n/a 23 3234 3297 3334 N
+ M B Y i n/a 23 3234 3297 3334 N
+ M B Y s n/a 23 3234 3297 3334 N
+ M B Z b n/a 23 3234 3294 3339 N
+ M B Z e n/a 23 3234 3294 3339 N
+ M B Z i n/a 23 3234 3294 3339 N
+ M B Z s n/a 23 3234 3294 3339 N
+ M B ZH e n/a 23 3234 3294 3339 N
+ M B ZH s n/a 23 3234 3294 3339 N
+ M CH AA b n/a 23 3230 3264 3315 N
+ M CH AA i n/a 23 3230 3264 3315 N
+ M CH AA s n/a 23 3230 3264 3315 N
+ M CH AE b n/a 23 3228 3276 3322 N
+ M CH AE i n/a 23 3228 3276 3322 N
+ M CH AE s n/a 23 3228 3276 3322 N
+ M CH AH b n/a 23 3229 3264 3317 N
+ M CH AH i n/a 23 3228 3259 3305 N
+ M CH AH s n/a 23 3228 3264 3307 N
+ M CH AO b n/a 23 3230 3260 3312 N
+ M CH AO s n/a 23 3230 3260 3314 N
+ M CH AW b n/a 23 3228 3276 3324 N
+ M CH AW s n/a 23 3228 3276 3324 N
+ M CH AY b n/a 23 3230 3265 3318 N
+ M CH AY s n/a 23 3230 3265 3307 N
+ M CH B b n/a 23 3228 3289 3337 N
+ M CH B s n/a 23 3228 3289 3337 N
+ M CH CH s n/a 23 3228 3286 3343 N
+ M CH D b n/a 23 3228 3292 3335 N
+ M CH D s n/a 23 3228 3292 3335 N
+ M CH DH s n/a 23 3228 3294 3336 N
+ M CH EH b n/a 23 3228 3276 3321 N
+ M CH EH i n/a 23 3228 3276 3321 N
+ M CH EH s n/a 23 3228 3276 3321 N
+ M CH ER b n/a 23 3230 3267 3311 N
+ M CH ER i n/a 23 3230 3267 3311 N
+ M CH ER s n/a 23 3230 3267 3311 N
+ M CH EY b n/a 23 3228 3276 3330 N
+ M CH EY i n/a 23 3228 3276 3330 N
+ M CH EY s n/a 23 3228 3276 3330 N
+ M CH F b n/a 23 3228 3284 3342 N
+ M CH F s n/a 23 3228 3284 3342 N
+ M CH G b n/a 23 3228 3292 3335 N
+ M CH G s n/a 23 3228 3292 3335 N
+ M CH HH b n/a 23 3228 3288 3344 N
+ M CH HH s n/a 23 3228 3288 3344 N
+ M CH IH b n/a 23 3228 3280 3329 N
+ M CH IH i n/a 23 3228 3280 3328 N
+ M CH IH s n/a 23 3228 3280 3329 N
+ M CH IY b n/a 23 3228 3279 3320 N
+ M CH IY s n/a 23 3228 3279 3320 N
+ M CH JH b n/a 23 3228 3292 3335 N
+ M CH JH s n/a 23 3228 3292 3335 N
+ M CH K b n/a 23 3228 3286 3343 N
+ M CH K s n/a 23 3228 3286 3343 N
+ M CH L b n/a 23 3230 3299 3331 N
+ M CH L s n/a 23 3230 3299 3331 N
+ M CH M s n/a 23 3228 3288 3333 N
+ M CH N b n/a 23 3228 3292 3333 N
+ M CH N s n/a 23 3228 3292 3333 N
+ M CH NG b n/a 23 3228 3292 3333 N
+ M CH NG s n/a 23 3228 3292 3333 N
+ M CH OW b n/a 23 3230 3264 3313 N
+ M CH OW s n/a 23 3230 3264 3313 N
+ M CH OY b n/a 23 3230 3265 3312 N
+ M CH OY s n/a 23 3230 3265 3307 N
+ M CH P b n/a 23 3228 3284 3342 N
+ M CH P s n/a 23 3228 3284 3342 N
+ M CH R b n/a 23 3230 3299 3331 N
+ M CH R s n/a 23 3230 3299 3331 N
+ M CH S s n/a 23 3228 3287 3340 N
+ M CH SH s n/a 23 3228 3287 3340 N
+ M CH SIL s n/a 23 3228 3302 3345 N
+ M CH T b n/a 23 3228 3286 3343 N
+ M CH T s n/a 23 3228 3286 3343 N
+ M CH TH s n/a 23 3228 3286 3342 N
+ M CH UH b n/a 23 3230 3264 3312 N
+ M CH UH s n/a 23 3230 3264 3316 N
+ M CH UW b n/a 23 3230 3261 3316 N
+ M CH UW s n/a 23 3230 3261 3316 N
+ M CH V b n/a 23 3228 3294 3337 N
+ M CH V s n/a 23 3228 3294 3337 N
+ M CH W b n/a 23 3230 3298 3332 N
+ M CH W s n/a 23 3230 3298 3332 N
+ M CH Y b n/a 23 3228 3297 3334 N
+ M CH Y s n/a 23 3228 3297 3334 N
+ M CH Z b n/a 23 3228 3294 3339 N
+ M CH Z s n/a 23 3228 3294 3339 N
+ M CH ZH s n/a 23 3228 3294 3339 N
+ M D AA b n/a 23 3239 3264 3315 N
+ M D AA e n/a 23 3239 3264 3314 N
+ M D AA i n/a 23 3239 3264 3315 N
+ M D AA s n/a 23 3239 3264 3315 N
+ M D AE b n/a 23 3241 3277 3322 N
+ M D AE e n/a 23 3241 3277 3325 N
+ M D AE i n/a 23 3241 3277 3322 N
+ M D AE s n/a 23 3241 3277 3322 N
+ M D AH b n/a 23 3239 3264 3317 N
+ M D AH e n/a 23 3239 3264 3307 N
+ M D AH i n/a 23 3239 3259 3305 N
+ M D AH s n/a 23 3239 3264 3307 N
+ M D AO b n/a 23 3239 3260 3312 N
+ M D AO e n/a 23 3239 3260 3314 N
+ M D AO i n/a 23 3239 3260 3312 N
+ M D AO s n/a 23 3239 3260 3314 N
+ M D AW b n/a 23 3241 3277 3324 N
+ M D AW e n/a 23 3241 3277 3324 N
+ M D AW i n/a 23 3241 3277 3324 N
+ M D AW s n/a 23 3241 3277 3324 N
+ M D AY b n/a 23 3239 3265 3318 N
+ M D AY e n/a 23 3239 3265 3307 N
+ M D AY i n/a 23 3239 3265 3318 N
+ M D AY s n/a 23 3239 3265 3307 N
+ M D B b n/a 23 3241 3289 3337 N
+ M D B e n/a 23 3241 3289 3337 N
+ M D B s n/a 23 3241 3289 3337 N
+ M D CH e n/a 23 3241 3285 3343 N
+ M D CH s n/a 23 3241 3286 3343 N
+ M D D b n/a 23 3241 3292 3335 N
+ M D D e n/a 23 3241 3292 3335 N
+ M D D i n/a 23 3241 3292 3335 N
+ M D D s n/a 23 3241 3292 3335 N
+ M D DH e n/a 23 3241 3294 3336 N
+ M D DH s n/a 23 3241 3294 3336 N
+ M D EH b n/a 23 3241 3277 3321 N
+ M D EH e n/a 23 3241 3277 3325 N
+ M D EH i n/a 23 3241 3277 3321 N
+ M D EH s n/a 23 3241 3277 3321 N
+ M D ER b n/a 23 3239 3267 3311 N
+ M D ER e n/a 23 3239 3267 3311 N
+ M D ER i n/a 23 3239 3267 3311 N
+ M D ER s n/a 23 3239 3267 3311 N
+ M D EY b n/a 23 3241 3277 3330 N
+ M D EY e n/a 23 3241 3277 3330 N
+ M D EY i n/a 23 3241 3277 3330 N
+ M D EY s n/a 23 3241 3277 3330 N
+ M D F b n/a 23 3241 3284 3342 N
+ M D F e n/a 23 3241 3284 3342 N
+ M D F s n/a 23 3241 3284 3342 N
+ M D G b n/a 23 3241 3292 3335 N
+ M D G e n/a 23 3241 3292 3335 N
+ M D G s n/a 23 3241 3292 3335 N
+ M D HH b n/a 23 3241 3288 3344 N
+ M D HH e n/a 23 3241 3288 3344 N
+ M D HH s n/a 23 3241 3288 3344 N
+ M D IH b n/a 23 3241 3277 3329 N
+ M D IH e n/a 23 3241 3277 3329 N
+ M D IH i n/a 23 3241 3277 3329 N
+ M D IH s n/a 23 3241 3277 3329 N
+ M D IY b n/a 23 3240 3279 3320 N
+ M D IY e n/a 23 3240 3279 3320 N
+ M D IY i n/a 23 3240 3279 3320 N
+ M D IY s n/a 23 3240 3279 3320 N
+ M D JH b n/a 23 3241 3292 3335 N
+ M D JH e n/a 23 3241 3292 3335 N
+ M D JH s n/a 23 3241 3292 3335 N
+ M D K b n/a 23 3241 3286 3343 N
+ M D K e n/a 23 3241 3284 3343 N
+ M D K i n/a 23 3241 3282 3343 N
+ M D K s n/a 23 3241 3286 3343 N
+ M D L b n/a 23 3239 3299 3331 N
+ M D L e n/a 23 3239 3299 3331 N
+ M D L s n/a 23 3239 3299 3331 N
+ M D M e n/a 23 3241 3288 3333 N
+ M D M s n/a 23 3241 3288 3333 N
+ M D N b n/a 23 3241 3292 3333 N
+ M D N e n/a 23 3241 3292 3333 N
+ M D N s n/a 23 3241 3292 3333 N
+ M D NG b n/a 23 3241 3292 3333 N
+ M D NG e n/a 23 3241 3292 3333 N
+ M D NG s n/a 23 3241 3292 3333 N
+ M D OW b n/a 23 3239 3264 3313 N
+ M D OW e n/a 23 3239 3264 3314 N
+ M D OW i n/a 23 3239 3264 3313 N
+ M D OW s n/a 23 3239 3264 3313 N
+ M D OY b n/a 23 3239 3264 3312 N
+ M D OY e n/a 23 3239 3264 3307 N
+ M D OY s n/a 23 3239 3264 3307 N
+ M D P b n/a 23 3241 3284 3342 N
+ M D P e n/a 23 3241 3284 3342 N
+ M D P s n/a 23 3241 3284 3342 N
+ M D R b n/a 23 3239 3299 3331 N
+ M D R e n/a 23 3239 3299 3331 N
+ M D R i n/a 23 3239 3299 3331 N
+ M D R s n/a 23 3239 3299 3331 N
+ M D S e n/a 23 3241 3287 3340 N
+ M D S s n/a 23 3241 3287 3340 N
+ M D SH e n/a 23 3241 3287 3340 N
+ M D SH s n/a 23 3241 3287 3340 N
+ M D SIL e n/a 23 3241 3303 3345 N
+ M D SIL s n/a 23 3241 3303 3345 N
+ M D T b n/a 23 3241 3286 3343 N
+ M D T e n/a 23 3241 3285 3343 N
+ M D T s n/a 23 3241 3286 3343 N
+ M D TH e n/a 23 3241 3285 3342 N
+ M D TH s n/a 23 3241 3286 3342 N
+ M D UH b n/a 23 3239 3264 3312 N
+ M D UH e n/a 23 3239 3264 3316 N
+ M D UH i n/a 23 3239 3264 3312 N
+ M D UH s n/a 23 3239 3264 3316 N
+ M D UW b n/a 23 3239 3261 3316 N
+ M D UW e n/a 23 3239 3261 3316 N
+ M D UW s n/a 23 3239 3261 3316 N
+ M D V b n/a 23 3241 3294 3337 N
+ M D V e n/a 23 3241 3294 3337 N
+ M D V i n/a 23 3241 3294 3338 N
+ M D V s n/a 23 3241 3294 3337 N
+ M D W b n/a 23 3239 3298 3332 N
+ M D W e n/a 23 3239 3298 3332 N
+ M D W s n/a 23 3239 3298 3332 N
+ M D Y b n/a 23 3240 3297 3334 N
+ M D Y e n/a 23 3240 3297 3334 N
+ M D Y i n/a 23 3240 3297 3334 N
+ M D Y s n/a 23 3240 3297 3334 N
+ M D Z b n/a 23 3241 3294 3339 N
+ M D Z e n/a 23 3241 3294 3339 N
+ M D Z s n/a 23 3241 3294 3339 N
+ M D ZH e n/a 23 3241 3294 3339 N
+ M D ZH s n/a 23 3241 3294 3339 N
+ M DH AA b n/a 23 3230 3264 3315 N
+ M DH AA e n/a 23 3230 3264 3314 N
+ M DH AA s n/a 23 3230 3264 3315 N
+ M DH AE b n/a 23 3228 3276 3322 N
+ M DH AE e n/a 23 3228 3276 3325 N
+ M DH AE s n/a 23 3228 3276 3322 N
+ M DH AH b n/a 23 3229 3264 3317 N
+ M DH AH e n/a 23 3228 3264 3307 N
+ M DH AH s n/a 23 3228 3264 3307 N
+ M DH AO b n/a 23 3230 3260 3312 N
+ M DH AO e n/a 23 3230 3260 3314 N
+ M DH AO s n/a 23 3230 3260 3314 N
+ M DH AW b n/a 23 3228 3276 3324 N
+ M DH AW e n/a 23 3228 3276 3324 N
+ M DH AW s n/a 23 3228 3276 3324 N
+ M DH AY b n/a 23 3230 3265 3318 N
+ M DH AY e n/a 23 3230 3265 3307 N
+ M DH AY s n/a 23 3230 3265 3307 N
+ M DH B b n/a 23 3228 3289 3337 N
+ M DH B e n/a 23 3228 3289 3337 N
+ M DH B s n/a 23 3228 3289 3337 N
+ M DH CH e n/a 23 3228 3285 3343 N
+ M DH CH s n/a 23 3228 3286 3343 N
+ M DH D b n/a 23 3228 3292 3335 N
+ M DH D e n/a 23 3228 3292 3335 N
+ M DH D i n/a 23 3228 3292 3335 N
+ M DH D s n/a 23 3228 3292 3335 N
+ M DH DH e n/a 23 3228 3294 3336 N
+ M DH DH s n/a 23 3228 3294 3336 N
+ M DH EH b n/a 23 3228 3276 3321 N
+ M DH EH e n/a 23 3228 3276 3325 N
+ M DH EH s n/a 23 3228 3276 3321 N
+ M DH ER b n/a 23 3230 3267 3311 N
+ M DH ER e n/a 23 3230 3267 3311 N
+ M DH ER s n/a 23 3230 3267 3311 N
+ M DH EY b n/a 23 3228 3276 3330 N
+ M DH EY e n/a 23 3228 3276 3330 N
+ M DH EY s n/a 23 3228 3276 3330 N
+ M DH F b n/a 23 3228 3284 3342 N
+ M DH F e n/a 23 3228 3284 3342 N
+ M DH F s n/a 23 3228 3284 3342 N
+ M DH G b n/a 23 3228 3292 3335 N
+ M DH G e n/a 23 3228 3292 3335 N
+ M DH G s n/a 23 3228 3292 3335 N
+ M DH HH b n/a 23 3228 3288 3344 N
+ M DH HH e n/a 23 3228 3288 3344 N
+ M DH HH s n/a 23 3228 3288 3344 N
+ M DH IH b n/a 23 3228 3280 3329 N
+ M DH IH e n/a 23 3228 3280 3329 N
+ M DH IH i n/a 23 3228 3280 3328 N
+ M DH IH s n/a 23 3228 3280 3329 N
+ M DH IY b n/a 23 3228 3279 3320 N
+ M DH IY e n/a 23 3228 3279 3320 N
+ M DH IY i n/a 23 3228 3279 3320 N
+ M DH IY s n/a 23 3228 3279 3320 N
+ M DH JH b n/a 23 3228 3292 3335 N
+ M DH JH e n/a 23 3228 3292 3335 N
+ M DH JH s n/a 23 3228 3292 3335 N
+ M DH K b n/a 23 3228 3286 3343 N
+ M DH K e n/a 23 3228 3284 3343 N
+ M DH K s n/a 23 3228 3286 3343 N
+ M DH L b n/a 23 3230 3299 3331 N
+ M DH L e n/a 23 3230 3299 3331 N
+ M DH L s n/a 23 3230 3299 3331 N
+ M DH M e n/a 23 3228 3288 3333 N
+ M DH M s n/a 23 3228 3288 3333 N
+ M DH N b n/a 23 3228 3292 3333 N
+ M DH N e n/a 23 3228 3292 3333 N
+ M DH N s n/a 23 3228 3292 3333 N
+ M DH NG b n/a 23 3228 3292 3333 N
+ M DH NG e n/a 23 3228 3292 3333 N
+ M DH NG s n/a 23 3228 3292 3333 N
+ M DH OW b n/a 23 3230 3264 3313 N
+ M DH OW e n/a 23 3230 3264 3314 N
+ M DH OW s n/a 23 3230 3264 3313 N
+ M DH OY b n/a 23 3230 3265 3312 N
+ M DH OY e n/a 23 3230 3265 3307 N
+ M DH OY s n/a 23 3230 3265 3307 N
+ M DH P b n/a 23 3228 3284 3342 N
+ M DH P e n/a 23 3228 3284 3342 N
+ M DH P s n/a 23 3228 3284 3342 N
+ M DH R b n/a 23 3230 3299 3331 N
+ M DH R e n/a 23 3230 3299 3331 N
+ M DH R s n/a 23 3230 3299 3331 N
+ M DH S e n/a 23 3228 3287 3340 N
+ M DH S s n/a 23 3228 3287 3340 N
+ M DH SH e n/a 23 3228 3287 3340 N
+ M DH SH s n/a 23 3228 3287 3340 N
+ M DH SIL e n/a 23 3228 3303 3345 N
+ M DH SIL s n/a 23 3228 3303 3345 N
+ M DH T b n/a 23 3228 3286 3343 N
+ M DH T e n/a 23 3228 3285 3343 N
+ M DH T s n/a 23 3228 3286 3343 N
+ M DH TH e n/a 23 3228 3285 3342 N
+ M DH TH s n/a 23 3228 3286 3342 N
+ M DH UH b n/a 23 3230 3264 3312 N
+ M DH UH e n/a 23 3230 3264 3316 N
+ M DH UH s n/a 23 3230 3264 3316 N
+ M DH UW b n/a 23 3230 3261 3316 N
+ M DH UW e n/a 23 3230 3261 3316 N
+ M DH UW s n/a 23 3230 3261 3316 N
+ M DH V b n/a 23 3228 3294 3337 N
+ M DH V e n/a 23 3228 3294 3337 N
+ M DH V s n/a 23 3228 3294 3337 N
+ M DH W b n/a 23 3230 3298 3332 N
+ M DH W e n/a 23 3230 3298 3332 N
+ M DH W s n/a 23 3230 3298 3332 N
+ M DH Y b n/a 23 3228 3297 3334 N
+ M DH Y e n/a 23 3228 3297 3334 N
+ M DH Y s n/a 23 3228 3297 3334 N
+ M DH Z b n/a 23 3228 3294 3339 N
+ M DH Z e n/a 23 3228 3294 3339 N
+ M DH Z s n/a 23 3228 3294 3339 N
+ M DH ZH e n/a 23 3228 3294 3339 N
+ M DH ZH s n/a 23 3228 3294 3339 N
+ M EH AA b n/a 23 3220 3258 3315 N
+ M EH AA e n/a 23 3220 3258 3314 N
+ M EH AA i n/a 23 3220 3258 3315 N
+ M EH AA s n/a 23 3220 3258 3315 N
+ M EH AE b n/a 23 3219 3272 3322 N
+ M EH AE e n/a 23 3219 3268 3325 N
+ M EH AE i n/a 23 3219 3272 3322 N
+ M EH AE s n/a 23 3219 3272 3322 N
+ M EH AH b n/a 23 3219 3258 3317 N
+ M EH AH e n/a 23 3219 3247 3307 N
+ M EH AH i n/a 23 3219 3248 3309 N
+ M EH AH s n/a 23 3219 3247 3307 N
+ M EH AO b n/a 23 3220 3253 3312 N
+ M EH AO e n/a 23 3220 3253 3314 N
+ M EH AO i n/a 23 3220 3253 3312 N
+ M EH AO s n/a 23 3220 3253 3314 N
+ M EH AW b n/a 23 3219 3272 3324 N
+ M EH AW e n/a 23 3219 3268 3324 N
+ M EH AW i n/a 23 3219 3272 3324 N
+ M EH AW s n/a 23 3219 3272 3324 N
+ M EH AY b n/a 23 3220 3258 3318 N
+ M EH AY e n/a 23 3220 3258 3307 N
+ M EH AY i n/a 23 3220 3258 3318 N
+ M EH AY s n/a 23 3220 3258 3307 N
+ M EH B b n/a 23 3220 3289 3337 N
+ M EH B e n/a 23 3220 3289 3337 N
+ M EH B i n/a 23 3220 3290 3338 N
+ M EH B s n/a 23 3220 3289 3337 N
+ M EH CH e n/a 23 3219 3285 3343 N
+ M EH CH i n/a 23 3219 3283 3343 N
+ M EH CH s n/a 23 3219 3286 3343 N
+ M EH D b n/a 23 3219 3292 3335 N
+ M EH D e n/a 23 3219 3292 3335 N
+ M EH D i n/a 23 3219 3292 3335 N
+ M EH D s n/a 23 3219 3292 3335 N
+ M EH DH e n/a 23 3219 3294 3336 N
+ M EH DH s n/a 23 3219 3294 3336 N
+ M EH EH b n/a 23 3219 3272 3321 N
+ M EH EH e n/a 23 3219 3268 3325 N
+ M EH EH i n/a 23 3219 3272 3323 N
+ M EH EH s n/a 23 3219 3272 3321 N
+ M EH ER b n/a 23 3220 3258 3311 N
+ M EH ER e n/a 23 3220 3249 3311 N
+ M EH ER i n/a 23 3220 3249 3311 N
+ M EH ER s n/a 23 3220 3249 3311 N
+ M EH EY b n/a 23 3219 3273 3330 N
+ M EH EY e n/a 23 3219 3269 3330 N
+ M EH EY i n/a 23 3219 3273 3330 N
+ M EH EY s n/a 23 3219 3273 3330 N
+ M EH F b n/a 23 3219 3284 3342 N
+ M EH F e n/a 23 3219 3284 3342 N
+ M EH F i n/a 23 3219 3283 3342 N
+ M EH F s n/a 23 3219 3284 3342 N
+ M EH G b n/a 23 3219 3292 3335 N
+ M EH G e n/a 23 3219 3292 3335 N
+ M EH G i n/a 23 3219 3292 3335 N
+ M EH G s n/a 23 3219 3292 3335 N
+ M EH HH b n/a 23 3219 3288 3344 N
+ M EH HH e n/a 23 3219 3288 3344 N
+ M EH HH i n/a 23 3219 3283 3344 N
+ M EH HH s n/a 23 3219 3288 3344 N
+ M EH IH b n/a 23 3219 3274 3329 N
+ M EH IH e n/a 23 3219 3268 3327 N
+ M EH IH i n/a 23 3219 3268 3326 N
+ M EH IH s n/a 23 3219 3268 3327 N
+ M EH IY b n/a 23 3219 3274 3319 N
+ M EH IY e n/a 23 3219 3269 3319 N
+ M EH IY i n/a 23 3219 3269 3319 N
+ M EH IY s n/a 23 3219 3269 3319 N
+ M EH JH b n/a 23 3219 3292 3335 N
+ M EH JH e n/a 23 3219 3292 3335 N
+ M EH JH i n/a 23 3219 3292 3335 N
+ M EH JH s n/a 23 3219 3292 3335 N
+ M EH K b n/a 23 3219 3286 3343 N
+ M EH K e n/a 23 3219 3284 3343 N
+ M EH K i n/a 23 3219 3283 3343 N
+ M EH K s n/a 23 3219 3286 3343 N
+ M EH L b n/a 23 3220 3299 3331 N
+ M EH L e n/a 23 3220 3299 3331 N
+ M EH L i n/a 23 3220 3299 3331 N
+ M EH L s n/a 23 3220 3299 3331 N
+ M EH M e n/a 23 3220 3288 3333 N
+ M EH M s n/a 23 3220 3288 3333 N
+ M EH N b n/a 23 3219 3292 3333 N
+ M EH N e n/a 23 3219 3292 3333 N
+ M EH N i n/a 23 3219 3292 3333 N
+ M EH N s n/a 23 3219 3292 3333 N
+ M EH NG b n/a 23 3219 3292 3333 N
+ M EH NG e n/a 23 3219 3292 3333 N
+ M EH NG s n/a 23 3219 3292 3333 N
+ M EH OW b n/a 23 3220 3258 3313 N
+ M EH OW e n/a 23 3220 3258 3314 N
+ M EH OW i n/a 23 3220 3258 3313 N
+ M EH OW s n/a 23 3220 3258 3313 N
+ M EH OY b n/a 23 3220 3258 3312 N
+ M EH OY e n/a 23 3220 3258 3307 N
+ M EH OY i n/a 23 3220 3258 3312 N
+ M EH OY s n/a 23 3220 3258 3307 N
+ M EH P b n/a 23 3220 3284 3342 N
+ M EH P e n/a 23 3220 3284 3342 N
+ M EH P i n/a 23 3220 3283 3342 N
+ M EH P s n/a 23 3220 3284 3342 N
+ M EH R b n/a 23 3220 3299 3331 N
+ M EH R e n/a 23 3220 3299 3331 N
+ M EH R i n/a 23 3220 3299 3331 N
+ M EH R s n/a 23 3220 3299 3331 N
+ M EH S e n/a 23 3219 3287 3340 N
+ M EH S i n/a 23 3219 3287 3340 N
+ M EH S s n/a 23 3219 3287 3340 N
+ M EH SH e n/a 23 3219 3287 3340 N
+ M EH SH i n/a 23 3219 3283 3340 N
+ M EH SH s n/a 23 3219 3287 3340 N
+ M EH SIL e n/a 23 3221 3303 3345 N
+ M EH SIL s n/a 23 3221 3303 3345 N
+ M EH T b n/a 23 3219 3286 3343 N
+ M EH T e n/a 23 3219 3285 3343 N
+ M EH T i n/a 23 3219 3286 3343 N
+ M EH T s n/a 23 3219 3286 3343 N
+ M EH TH e n/a 23 3219 3285 3342 N
+ M EH TH i n/a 23 3219 3283 3341 N
+ M EH TH s n/a 23 3219 3286 3342 N
+ M EH UH b n/a 23 3220 3257 3312 N
+ M EH UH e n/a 23 3220 3257 3316 N
+ M EH UH i n/a 23 3220 3257 3312 N
+ M EH UH s n/a 23 3220 3257 3316 N
+ M EH UW b n/a 23 3220 3257 3316 N
+ M EH UW e n/a 23 3220 3257 3316 N
+ M EH UW i n/a 23 3220 3257 3316 N
+ M EH UW s n/a 23 3220 3257 3316 N
+ M EH V b n/a 23 3219 3294 3337 N
+ M EH V e n/a 23 3219 3294 3337 N
+ M EH V s n/a 23 3219 3294 3337 N
+ M EH W b n/a 23 3220 3298 3332 N
+ M EH W e n/a 23 3220 3298 3332 N
+ M EH W i n/a 23 3220 3298 3332 N
+ M EH W s n/a 23 3220 3298 3332 N
+ M EH Y b n/a 23 3219 3297 3334 N
+ M EH Y e n/a 23 3219 3297 3334 N
+ M EH Y i n/a 23 3219 3297 3334 N
+ M EH Y s n/a 23 3219 3297 3334 N
+ M EH Z b n/a 23 3219 3294 3339 N
+ M EH Z e n/a 23 3219 3294 3339 N
+ M EH Z i n/a 23 3219 3294 3339 N
+ M EH Z s n/a 23 3219 3294 3339 N
+ M EH ZH e n/a 23 3219 3294 3339 N
+ M EH ZH s n/a 23 3219 3294 3339 N
+ M ER AA b n/a 23 3211 3255 3315 N
+ M ER AA e n/a 23 3211 3255 3314 N
+ M ER AA i n/a 23 3211 3255 3315 N
+ M ER AA s n/a 23 3211 3255 3315 N
+ M ER AE b n/a 23 3210 3275 3322 N
+ M ER AE e n/a 23 3210 3275 3325 N
+ M ER AE i n/a 23 3210 3275 3322 N
+ M ER AE s n/a 23 3210 3275 3322 N
+ M ER AH b n/a 23 3211 3255 3317 N
+ M ER AH e n/a 23 3212 3250 3307 N
+ M ER AH i n/a 23 3212 3250 3306 N
+ M ER AH s n/a 23 3212 3250 3307 N
+ M ER AO b n/a 23 3211 3254 3312 N
+ M ER AO e n/a 23 3211 3254 3314 N
+ M ER AO i n/a 23 3211 3254 3312 N
+ M ER AO s n/a 23 3211 3254 3314 N
+ M ER AW b n/a 23 3210 3275 3324 N
+ M ER AW e n/a 23 3210 3275 3324 N
+ M ER AW i n/a 23 3210 3275 3324 N
+ M ER AW s n/a 23 3210 3275 3324 N
+ M ER AY b n/a 23 3211 3255 3318 N
+ M ER AY e n/a 23 3211 3255 3307 N
+ M ER AY i n/a 23 3211 3255 3318 N
+ M ER AY s n/a 23 3211 3255 3307 N
+ M ER B b n/a 23 3210 3289 3337 N
+ M ER B e n/a 23 3213 3289 3337 N
+ M ER B i n/a 23 3213 3291 3338 N
+ M ER B s n/a 23 3213 3289 3337 N
+ M ER CH e n/a 23 3213 3285 3343 N
+ M ER CH s n/a 23 3213 3285 3343 N
+ M ER D b n/a 23 3210 3292 3335 N
+ M ER D e n/a 23 3213 3292 3335 N
+ M ER D i n/a 23 3213 3292 3335 N
+ M ER D s n/a 23 3213 3292 3335 N
+ M ER DH e n/a 23 3213 3293 3336 N
+ M ER DH s n/a 23 3213 3293 3336 N
+ M ER EH b n/a 23 3210 3275 3321 N
+ M ER EH e n/a 23 3212 3275 3325 N
+ M ER EH i n/a 23 3212 3275 3323 N
+ M ER EH s n/a 23 3212 3275 3321 N
+ M ER ER b n/a 23 3211 3255 3311 N
+ M ER ER e n/a 23 3213 3249 3311 N
+ M ER ER i n/a 23 3213 3249 3311 N
+ M ER ER s n/a 23 3213 3249 3311 N
+ M ER EY b n/a 23 3210 3275 3330 N
+ M ER EY e n/a 23 3210 3275 3330 N
+ M ER EY i n/a 23 3210 3275 3330 N
+ M ER EY s n/a 23 3210 3275 3330 N
+ M ER F b n/a 23 3210 3284 3342 N
+ M ER F e n/a 23 3213 3284 3342 N
+ M ER F s n/a 23 3213 3284 3342 N
+ M ER G b n/a 23 3210 3292 3335 N
+ M ER G e n/a 23 3213 3292 3335 N
+ M ER G s n/a 23 3213 3292 3335 N
+ M ER HH b n/a 23 3210 3288 3344 N
+ M ER HH e n/a 23 3213 3288 3344 N
+ M ER HH i n/a 23 3213 3281 3344 N
+ M ER HH s n/a 23 3213 3288 3344 N
+ M ER IH b n/a 23 3210 3275 3329 N
+ M ER IH e n/a 23 3212 3275 3327 N
+ M ER IH i n/a 23 3212 3275 3327 N
+ M ER IH s n/a 23 3212 3275 3327 N
+ M ER IY b n/a 23 3210 3275 3319 N
+ M ER IY e n/a 23 3210 3275 3319 N
+ M ER IY i n/a 23 3210 3275 3319 N
+ M ER IY s n/a 23 3210 3275 3319 N
+ M ER JH b n/a 23 3210 3292 3335 N
+ M ER JH e n/a 23 3213 3292 3335 N
+ M ER JH s n/a 23 3213 3292 3335 N
+ M ER K b n/a 23 3210 3285 3343 N
+ M ER K e n/a 23 3213 3284 3343 N
+ M ER K i n/a 23 3213 3281 3343 N
+ M ER K s n/a 23 3213 3285 3343 N
+ M ER L b n/a 23 3211 3299 3331 N
+ M ER L e n/a 23 3212 3299 3331 N
+ M ER L i n/a 23 3212 3299 3331 N
+ M ER L s n/a 23 3212 3299 3331 N
+ M ER M e n/a 23 3213 3288 3333 N
+ M ER M s n/a 23 3213 3288 3333 N
+ M ER N b n/a 23 3210 3292 3333 N
+ M ER N e n/a 23 3213 3292 3333 N
+ M ER N i n/a 23 3213 3292 3333 N
+ M ER N s n/a 23 3213 3292 3333 N
+ M ER NG b n/a 23 3210 3292 3333 N
+ M ER NG e n/a 23 3213 3292 3333 N
+ M ER NG s n/a 23 3213 3292 3333 N
+ M ER OW b n/a 23 3211 3255 3313 N
+ M ER OW e n/a 23 3211 3255 3314 N
+ M ER OW i n/a 23 3211 3255 3313 N
+ M ER OW s n/a 23 3211 3255 3313 N
+ M ER OY b n/a 23 3211 3255 3312 N
+ M ER OY e n/a 23 3211 3255 3307 N
+ M ER OY i n/a 23 3211 3255 3312 N
+ M ER OY s n/a 23 3211 3255 3307 N
+ M ER P b n/a 23 3210 3284 3342 N
+ M ER P e n/a 23 3213 3284 3342 N
+ M ER P s n/a 23 3213 3284 3342 N
+ M ER R b n/a 23 3211 3299 3331 N
+ M ER R e n/a 23 3213 3299 3331 N
+ M ER R s n/a 23 3213 3299 3331 N
+ M ER S e n/a 23 3213 3287 3340 N
+ M ER S i n/a 23 3213 3287 3340 N
+ M ER S s n/a 23 3213 3287 3340 N
+ M ER SH e n/a 23 3213 3287 3340 N
+ M ER SH s n/a 23 3213 3287 3340 N
+ M ER SIL e n/a 23 3213 3301 3346 N
+ M ER SIL s n/a 23 3213 3301 3346 N
+ M ER T b n/a 23 3210 3285 3343 N
+ M ER T e n/a 23 3213 3285 3343 N
+ M ER T s n/a 23 3213 3285 3343 N
+ M ER TH e n/a 23 3213 3285 3342 N
+ M ER TH s n/a 23 3213 3285 3342 N
+ M ER UH b n/a 23 3211 3255 3312 N
+ M ER UH e n/a 23 3212 3255 3316 N
+ M ER UH i n/a 23 3212 3255 3312 N
+ M ER UH s n/a 23 3212 3255 3316 N
+ M ER UW b n/a 23 3211 3254 3316 N
+ M ER UW e n/a 23 3211 3254 3316 N
+ M ER UW i n/a 23 3211 3254 3316 N
+ M ER UW s n/a 23 3211 3254 3316 N
+ M ER V b n/a 23 3210 3292 3337 N
+ M ER V e n/a 23 3213 3292 3337 N
+ M ER V s n/a 23 3213 3292 3337 N
+ M ER W b n/a 23 3211 3298 3332 N
+ M ER W e n/a 23 3212 3298 3332 N
+ M ER W i n/a 23 3212 3298 3332 N
+ M ER W s n/a 23 3212 3298 3332 N
+ M ER Y b n/a 23 3210 3297 3334 N
+ M ER Y e n/a 23 3212 3297 3334 N
+ M ER Y i n/a 23 3212 3297 3334 N
+ M ER Y s n/a 23 3212 3297 3334 N
+ M ER Z b n/a 23 3210 3292 3339 N
+ M ER Z e n/a 23 3213 3292 3339 N
+ M ER Z i n/a 23 3213 3292 3339 N
+ M ER Z s n/a 23 3213 3292 3339 N
+ M ER ZH e n/a 23 3213 3292 3339 N
+ M ER ZH s n/a 23 3213 3292 3339 N
+ M EY AA b n/a 23 3216 3258 3315 N
+ M EY AA e n/a 23 3214 3258 3314 N
+ M EY AA i n/a 23 3214 3258 3315 N
+ M EY AA s n/a 23 3214 3258 3315 N
+ M EY AE b n/a 23 3217 3273 3322 N
+ M EY AE e n/a 23 3214 3269 3325 N
+ M EY AE i n/a 23 3214 3273 3322 N
+ M EY AE s n/a 23 3214 3273 3322 N
+ M EY AH b n/a 23 3217 3258 3317 N
+ M EY AH e n/a 23 3214 3247 3307 N
+ M EY AH i n/a 23 3214 3248 3309 N
+ M EY AH s n/a 23 3214 3247 3307 N
+ M EY AO b n/a 23 3216 3253 3312 N
+ M EY AO e n/a 23 3214 3253 3314 N
+ M EY AO i n/a 23 3214 3253 3312 N
+ M EY AO s n/a 23 3214 3253 3314 N
+ M EY AW b n/a 23 3217 3273 3324 N
+ M EY AW e n/a 23 3214 3269 3324 N
+ M EY AW s n/a 23 3214 3273 3324 N
+ M EY AY b n/a 23 3216 3258 3318 N
+ M EY AY e n/a 23 3214 3258 3307 N
+ M EY AY i n/a 23 3214 3258 3318 N
+ M EY AY s n/a 23 3214 3258 3307 N
+ M EY B b n/a 23 3214 3289 3337 N
+ M EY B e n/a 23 3214 3289 3337 N
+ M EY B i n/a 23 3214 3290 3337 N
+ M EY B s n/a 23 3214 3289 3337 N
+ M EY CH e n/a 23 3214 3286 3343 N
+ M EY CH s n/a 23 3214 3286 3343 N
+ M EY D b n/a 23 3214 3295 3335 N
+ M EY D e n/a 23 3214 3295 3335 N
+ M EY D i n/a 23 3214 3295 3335 N
+ M EY D s n/a 23 3214 3295 3335 N
+ M EY DH e n/a 23 3214 3295 3336 N
+ M EY DH s n/a 23 3214 3295 3336 N
+ M EY EH b n/a 23 3217 3273 3321 N
+ M EY EH e n/a 23 3214 3269 3325 N
+ M EY EH i n/a 23 3214 3273 3323 N
+ M EY EH s n/a 23 3214 3273 3321 N
+ M EY ER b n/a 23 3216 3258 3311 N
+ M EY ER e n/a 23 3214 3249 3311 N
+ M EY ER i n/a 23 3214 3249 3311 N
+ M EY ER s n/a 23 3214 3249 3311 N
+ M EY EY b n/a 23 3217 3273 3330 N
+ M EY EY e n/a 23 3214 3269 3330 N
+ M EY EY i n/a 23 3214 3273 3330 N
+ M EY EY s n/a 23 3214 3273 3330 N
+ M EY F b n/a 23 3214 3284 3342 N
+ M EY F e n/a 23 3214 3284 3342 N
+ M EY F i n/a 23 3214 3282 3342 N
+ M EY F s n/a 23 3214 3284 3342 N
+ M EY G b n/a 23 3214 3295 3335 N
+ M EY G e n/a 23 3214 3295 3335 N
+ M EY G s n/a 23 3214 3295 3335 N
+ M EY HH b n/a 23 3214 3288 3344 N
+ M EY HH e n/a 23 3214 3288 3344 N
+ M EY HH s n/a 23 3214 3288 3344 N
+ M EY IH b n/a 23 3217 3274 3329 N
+ M EY IH e n/a 23 3214 3269 3327 N
+ M EY IH i n/a 23 3214 3269 3327 N
+ M EY IH s n/a 23 3214 3269 3327 N
+ M EY IY b n/a 23 3217 3274 3319 N
+ M EY IY e n/a 23 3214 3269 3319 N
+ M EY IY i n/a 23 3214 3269 3319 N
+ M EY IY s n/a 23 3214 3269 3319 N
+ M EY JH b n/a 23 3214 3295 3335 N
+ M EY JH e n/a 23 3214 3295 3335 N
+ M EY JH s n/a 23 3214 3295 3335 N
+ M EY K b n/a 23 3214 3286 3343 N
+ M EY K e n/a 23 3214 3286 3343 N
+ M EY K i n/a 23 3214 3282 3343 N
+ M EY K s n/a 23 3214 3286 3343 N
+ M EY L b n/a 23 3214 3299 3331 N
+ M EY L e n/a 23 3214 3299 3331 N
+ M EY L i n/a 23 3214 3299 3331 N
+ M EY L s n/a 23 3214 3299 3331 N
+ M EY M e n/a 23 3214 3289 3333 N
+ M EY M s n/a 23 3214 3289 3333 N
+ M EY N b n/a 23 3214 3295 3333 N
+ M EY N e n/a 23 3214 3295 3333 N
+ M EY N i n/a 23 3214 3295 3333 N
+ M EY N s n/a 23 3214 3295 3333 N
+ M EY NG b n/a 23 3214 3295 3333 N
+ M EY NG e n/a 23 3214 3295 3333 N
+ M EY NG s n/a 23 3214 3295 3333 N
+ M EY OW b n/a 23 3216 3258 3313 N
+ M EY OW e n/a 23 3214 3258 3314 N
+ M EY OW i n/a 23 3214 3258 3313 N
+ M EY OW s n/a 23 3214 3258 3313 N
+ M EY OY b n/a 23 3216 3258 3312 N
+ M EY OY e n/a 23 3214 3258 3307 N
+ M EY OY s n/a 23 3214 3258 3307 N
+ M EY P b n/a 23 3214 3284 3342 N
+ M EY P e n/a 23 3214 3284 3342 N
+ M EY P i n/a 23 3214 3283 3342 N
+ M EY P s n/a 23 3214 3284 3342 N
+ M EY R b n/a 23 3214 3299 3331 N
+ M EY R e n/a 23 3214 3299 3331 N
+ M EY R s n/a 23 3214 3299 3331 N
+ M EY S e n/a 23 3214 3287 3340 N
+ M EY S i n/a 23 3214 3287 3340 N
+ M EY S s n/a 23 3214 3287 3340 N
+ M EY SH e n/a 23 3214 3287 3340 N
+ M EY SH i n/a 23 3214 3282 3340 N
+ M EY SH s n/a 23 3214 3287 3340 N
+ M EY SIL e n/a 23 3214 3302 3345 N
+ M EY SIL s n/a 23 3214 3302 3345 N
+ M EY T b n/a 23 3214 3286 3343 N
+ M EY T e n/a 23 3214 3286 3343 N
+ M EY T s n/a 23 3214 3286 3343 N
+ M EY TH e n/a 23 3214 3286 3342 N
+ M EY TH s n/a 23 3214 3286 3342 N
+ M EY UH b n/a 23 3216 3257 3312 N
+ M EY UH e n/a 23 3214 3257 3316 N
+ M EY UH i n/a 23 3214 3257 3312 N
+ M EY UH s n/a 23 3214 3257 3316 N
+ M EY UW b n/a 23 3216 3257 3316 N
+ M EY UW e n/a 23 3214 3257 3316 N
+ M EY UW i n/a 23 3214 3257 3316 N
+ M EY UW s n/a 23 3214 3257 3316 N
+ M EY V b n/a 23 3214 3295 3337 N
+ M EY V e n/a 23 3214 3295 3337 N
+ M EY V s n/a 23 3214 3295 3337 N
+ M EY W b n/a 23 3214 3298 3332 N
+ M EY W e n/a 23 3214 3298 3332 N
+ M EY W i n/a 23 3214 3298 3332 N
+ M EY W s n/a 23 3214 3298 3332 N
+ M EY Y b n/a 23 3214 3297 3334 N
+ M EY Y e n/a 23 3214 3297 3334 N
+ M EY Y i n/a 23 3214 3297 3334 N
+ M EY Y s n/a 23 3214 3297 3334 N
+ M EY Z b n/a 23 3214 3295 3339 N
+ M EY Z e n/a 23 3214 3295 3339 N
+ M EY Z i n/a 23 3214 3295 3339 N
+ M EY Z s n/a 23 3214 3295 3339 N
+ M EY ZH e n/a 23 3214 3295 3339 N
+ M EY ZH s n/a 23 3214 3295 3339 N
+ M F AA b n/a 23 3231 3264 3315 N
+ M F AA e n/a 23 3231 3264 3314 N
+ M F AA i n/a 23 3231 3264 3315 N
+ M F AA s n/a 23 3231 3264 3315 N
+ M F AE b n/a 23 3234 3276 3322 N
+ M F AE e n/a 23 3234 3276 3325 N
+ M F AE i n/a 23 3234 3276 3322 N
+ M F AE s n/a 23 3234 3276 3322 N
+ M F AH b n/a 23 3234 3264 3317 N
+ M F AH e n/a 23 3234 3264 3307 N
+ M F AH i n/a 23 3234 3259 3305 N
+ M F AH s n/a 23 3234 3264 3307 N
+ M F AO b n/a 23 3231 3260 3312 N
+ M F AO e n/a 23 3231 3260 3315 N
+ M F AO i n/a 23 3231 3260 3312 N
+ M F AO s n/a 23 3231 3260 3315 N
+ M F AW b n/a 23 3234 3276 3324 N
+ M F AW e n/a 23 3234 3276 3324 N
+ M F AW s n/a 23 3234 3276 3324 N
+ M F AY b n/a 23 3231 3265 3318 N
+ M F AY e n/a 23 3231 3265 3307 N
+ M F AY i n/a 23 3231 3265 3318 N
+ M F AY s n/a 23 3231 3265 3307 N
+ M F B b n/a 23 3234 3289 3337 N
+ M F B e n/a 23 3234 3289 3337 N
+ M F B s n/a 23 3234 3289 3337 N
+ M F CH e n/a 23 3234 3285 3343 N
+ M F CH s n/a 23 3234 3286 3343 N
+ M F D b n/a 23 3234 3292 3335 N
+ M F D e n/a 23 3234 3292 3335 N
+ M F D s n/a 23 3234 3292 3335 N
+ M F DH e n/a 23 3234 3294 3336 N
+ M F DH s n/a 23 3234 3294 3336 N
+ M F EH b n/a 23 3234 3276 3321 N
+ M F EH e n/a 23 3234 3276 3325 N
+ M F EH i n/a 23 3234 3276 3321 N
+ M F EH s n/a 23 3234 3276 3321 N
+ M F ER b n/a 23 3231 3267 3311 N
+ M F ER e n/a 23 3231 3267 3311 N
+ M F ER i n/a 23 3231 3267 3311 N
+ M F ER s n/a 23 3231 3267 3311 N
+ M F EY b n/a 23 3234 3276 3330 N
+ M F EY e n/a 23 3234 3276 3330 N
+ M F EY s n/a 23 3234 3276 3330 N
+ M F F b n/a 23 3234 3284 3342 N
+ M F F e n/a 23 3234 3284 3342 N
+ M F F s n/a 23 3234 3284 3342 N
+ M F G b n/a 23 3234 3292 3335 N
+ M F G e n/a 23 3234 3292 3335 N
+ M F G s n/a 23 3234 3292 3335 N
+ M F HH b n/a 23 3234 3288 3344 N
+ M F HH e n/a 23 3234 3288 3344 N
+ M F HH s n/a 23 3234 3288 3344 N
+ M F IH b n/a 23 3234 3280 3329 N
+ M F IH e n/a 23 3234 3280 3329 N
+ M F IH s n/a 23 3234 3280 3329 N
+ M F IY b n/a 23 3234 3279 3320 N
+ M F IY e n/a 23 3234 3279 3320 N
+ M F IY s n/a 23 3234 3279 3320 N
+ M F JH b n/a 23 3234 3292 3335 N
+ M F JH e n/a 23 3234 3292 3335 N
+ M F JH s n/a 23 3234 3292 3335 N
+ M F K b n/a 23 3234 3286 3343 N
+ M F K e n/a 23 3234 3284 3343 N
+ M F K s n/a 23 3234 3286 3343 N
+ M F L b n/a 23 3231 3299 3331 N
+ M F L e n/a 23 3231 3299 3331 N
+ M F L s n/a 23 3231 3299 3331 N
+ M F M e n/a 23 3234 3288 3333 N
+ M F M s n/a 23 3234 3288 3333 N
+ M F N b n/a 23 3234 3292 3333 N
+ M F N e n/a 23 3234 3292 3333 N
+ M F N s n/a 23 3234 3292 3333 N
+ M F NG b n/a 23 3234 3292 3333 N
+ M F NG e n/a 23 3234 3292 3333 N
+ M F NG s n/a 23 3234 3292 3333 N
+ M F OW b n/a 23 3231 3264 3313 N
+ M F OW e n/a 23 3231 3264 3315 N
+ M F OW s n/a 23 3231 3264 3313 N
+ M F OY b n/a 23 3231 3265 3312 N
+ M F OY e n/a 23 3231 3265 3307 N
+ M F OY s n/a 23 3231 3265 3307 N
+ M F P b n/a 23 3234 3284 3342 N
+ M F P e n/a 23 3234 3284 3342 N
+ M F P s n/a 23 3234 3284 3342 N
+ M F R b n/a 23 3231 3299 3331 N
+ M F R e n/a 23 3231 3299 3331 N
+ M F R s n/a 23 3231 3299 3331 N
+ M F S e n/a 23 3234 3287 3340 N
+ M F S s n/a 23 3234 3287 3340 N
+ M F SH e n/a 23 3234 3287 3340 N
+ M F SH s n/a 23 3234 3287 3340 N
+ M F SIL e n/a 23 3234 3302 3345 N
+ M F SIL s n/a 23 3234 3302 3345 N
+ M F T b n/a 23 3234 3286 3343 N
+ M F T e n/a 23 3234 3285 3343 N
+ M F T s n/a 23 3234 3286 3343 N
+ M F TH e n/a 23 3234 3285 3342 N
+ M F TH s n/a 23 3234 3286 3342 N
+ M F UH b n/a 23 3231 3264 3312 N
+ M F UH e n/a 23 3231 3264 3316 N
+ M F UH s n/a 23 3231 3264 3316 N
+ M F UW b n/a 23 3231 3261 3316 N
+ M F UW e n/a 23 3231 3261 3316 N
+ M F UW s n/a 23 3231 3261 3316 N
+ M F V b n/a 23 3234 3294 3337 N
+ M F V e n/a 23 3234 3294 3337 N
+ M F V s n/a 23 3234 3294 3337 N
+ M F W b n/a 23 3231 3298 3332 N
+ M F W e n/a 23 3231 3298 3332 N
+ M F W s n/a 23 3231 3298 3332 N
+ M F Y b n/a 23 3234 3297 3334 N
+ M F Y e n/a 23 3234 3297 3334 N
+ M F Y s n/a 23 3234 3297 3334 N
+ M F Z b n/a 23 3234 3294 3339 N
+ M F Z e n/a 23 3234 3294 3339 N
+ M F Z s n/a 23 3234 3294 3339 N
+ M F ZH e n/a 23 3234 3294 3339 N
+ M F ZH s n/a 23 3234 3294 3339 N
+ M G AA b n/a 23 3230 3264 3315 N
+ M G AA e n/a 23 3230 3264 3314 N
+ M G AA i n/a 23 3230 3264 3315 N
+ M G AA s n/a 23 3230 3264 3315 N
+ M G AE b n/a 23 3229 3276 3322 N
+ M G AE e n/a 23 3229 3276 3325 N
+ M G AE i n/a 23 3229 3276 3322 N
+ M G AE s n/a 23 3229 3276 3322 N
+ M G AH b n/a 23 3229 3264 3317 N
+ M G AH e n/a 23 3229 3264 3307 N
+ M G AH i n/a 23 3229 3259 3305 N
+ M G AH s n/a 23 3229 3264 3307 N
+ M G AO b n/a 23 3230 3260 3312 N
+ M G AO e n/a 23 3230 3260 3314 N
+ M G AO i n/a 23 3230 3260 3312 N
+ M G AO s n/a 23 3230 3260 3314 N
+ M G AW b n/a 23 3229 3276 3324 N
+ M G AW e n/a 23 3229 3276 3324 N
+ M G AW i n/a 23 3229 3276 3324 N
+ M G AW s n/a 23 3229 3276 3324 N
+ M G AY b n/a 23 3230 3265 3318 N
+ M G AY e n/a 23 3230 3265 3307 N
+ M G AY i n/a 23 3230 3265 3318 N
+ M G AY s n/a 23 3230 3265 3307 N
+ M G B b n/a 23 3229 3289 3337 N
+ M G B e n/a 23 3229 3289 3337 N
+ M G B s n/a 23 3229 3289 3337 N
+ M G CH e n/a 23 3229 3285 3343 N
+ M G CH s n/a 23 3229 3286 3343 N
+ M G D b n/a 23 3229 3292 3335 N
+ M G D e n/a 23 3229 3292 3335 N
+ M G D s n/a 23 3229 3292 3335 N
+ M G DH e n/a 23 3229 3294 3336 N
+ M G DH s n/a 23 3229 3294 3336 N
+ M G EH b n/a 23 3229 3276 3321 N
+ M G EH e n/a 23 3229 3276 3325 N
+ M G EH i n/a 23 3229 3276 3321 N
+ M G EH s n/a 23 3229 3276 3321 N
+ M G ER b n/a 23 3230 3267 3311 N
+ M G ER e n/a 23 3230 3267 3311 N
+ M G ER i n/a 23 3230 3267 3311 N
+ M G ER s n/a 23 3230 3267 3311 N
+ M G EY b n/a 23 3229 3276 3330 N
+ M G EY e n/a 23 3229 3276 3330 N
+ M G EY i n/a 23 3229 3276 3330 N
+ M G EY s n/a 23 3229 3276 3330 N
+ M G F b n/a 23 3229 3284 3342 N
+ M G F e n/a 23 3229 3284 3342 N
+ M G F s n/a 23 3229 3284 3342 N
+ M G G b n/a 23 3229 3292 3335 N
+ M G G e n/a 23 3229 3292 3335 N
+ M G G s n/a 23 3229 3292 3335 N
+ M G HH b n/a 23 3229 3288 3344 N
+ M G HH e n/a 23 3229 3288 3344 N
+ M G HH s n/a 23 3229 3288 3344 N
+ M G IH b n/a 23 3229 3280 3329 N
+ M G IH e n/a 23 3229 3280 3329 N
+ M G IH i n/a 23 3229 3280 3329 N
+ M G IH s n/a 23 3229 3280 3329 N
+ M G IY b n/a 23 3229 3279 3320 N
+ M G IY e n/a 23 3229 3279 3320 N
+ M G IY i n/a 23 3229 3279 3320 N
+ M G IY s n/a 23 3229 3279 3320 N
+ M G JH b n/a 23 3229 3292 3335 N
+ M G JH e n/a 23 3229 3292 3335 N
+ M G JH s n/a 23 3229 3292 3335 N
+ M G K b n/a 23 3229 3286 3343 N
+ M G K e n/a 23 3229 3284 3343 N
+ M G K s n/a 23 3229 3286 3343 N
+ M G L b n/a 23 3230 3299 3331 N
+ M G L e n/a 23 3230 3299 3331 N
+ M G L s n/a 23 3230 3299 3331 N
+ M G M e n/a 23 3229 3288 3333 N
+ M G M s n/a 23 3229 3288 3333 N
+ M G N b n/a 23 3229 3292 3333 N
+ M G N e n/a 23 3229 3292 3333 N
+ M G N s n/a 23 3229 3292 3333 N
+ M G NG b n/a 23 3229 3292 3333 N
+ M G NG e n/a 23 3229 3292 3333 N
+ M G NG s n/a 23 3229 3292 3333 N
+ M G OW b n/a 23 3230 3264 3313 N
+ M G OW e n/a 23 3230 3264 3314 N
+ M G OW i n/a 23 3230 3264 3313 N
+ M G OW s n/a 23 3230 3264 3313 N
+ M G OY b n/a 23 3230 3265 3312 N
+ M G OY e n/a 23 3230 3265 3307 N
+ M G OY i n/a 23 3230 3265 3312 N
+ M G OY s n/a 23 3230 3265 3307 N
+ M G P b n/a 23 3229 3284 3342 N
+ M G P e n/a 23 3229 3284 3342 N
+ M G P s n/a 23 3229 3284 3342 N
+ M G R b n/a 23 3230 3299 3331 N
+ M G R e n/a 23 3230 3299 3331 N
+ M G R s n/a 23 3230 3299 3331 N
+ M G S e n/a 23 3229 3287 3340 N
+ M G S s n/a 23 3229 3287 3340 N
+ M G SH e n/a 23 3229 3287 3340 N
+ M G SH s n/a 23 3229 3287 3340 N
+ M G SIL e n/a 23 3229 3303 3345 N
+ M G SIL s n/a 23 3229 3303 3345 N
+ M G T b n/a 23 3229 3286 3343 N
+ M G T e n/a 23 3229 3285 3343 N
+ M G T s n/a 23 3229 3286 3343 N
+ M G TH e n/a 23 3229 3285 3342 N
+ M G TH s n/a 23 3229 3286 3342 N
+ M G UH b n/a 23 3230 3264 3312 N
+ M G UH e n/a 23 3230 3264 3316 N
+ M G UH s n/a 23 3230 3264 3316 N
+ M G UW b n/a 23 3230 3261 3316 N
+ M G UW e n/a 23 3230 3261 3316 N
+ M G UW s n/a 23 3230 3261 3316 N
+ M G V b n/a 23 3229 3294 3337 N
+ M G V e n/a 23 3229 3294 3337 N
+ M G V s n/a 23 3229 3294 3337 N
+ M G W b n/a 23 3230 3298 3332 N
+ M G W e n/a 23 3230 3298 3332 N
+ M G W s n/a 23 3230 3298 3332 N
+ M G Y b n/a 23 3229 3297 3334 N
+ M G Y e n/a 23 3229 3297 3334 N
+ M G Y s n/a 23 3229 3297 3334 N
+ M G Z b n/a 23 3229 3294 3339 N
+ M G Z e n/a 23 3229 3294 3339 N
+ M G Z s n/a 23 3229 3294 3339 N
+ M G ZH e n/a 23 3229 3294 3339 N
+ M G ZH s n/a 23 3229 3294 3339 N
+ M HH AA b n/a 23 3230 3264 3315 N
+ M HH AA e n/a 23 3230 3264 3314 N
+ M HH AA s n/a 23 3230 3264 3315 N
+ M HH AE b n/a 23 3228 3276 3322 N
+ M HH AE e n/a 23 3228 3276 3325 N
+ M HH AE s n/a 23 3228 3276 3322 N
+ M HH AH b n/a 23 3229 3264 3317 N
+ M HH AH e n/a 23 3228 3264 3307 N
+ M HH AH s n/a 23 3228 3264 3307 N
+ M HH AO b n/a 23 3230 3260 3312 N
+ M HH AO e n/a 23 3230 3260 3314 N
+ M HH AO i n/a 23 3230 3260 3312 N
+ M HH AO s n/a 23 3230 3260 3314 N
+ M HH AW b n/a 23 3228 3276 3324 N
+ M HH AW e n/a 23 3228 3276 3324 N
+ M HH AW s n/a 23 3228 3276 3324 N
+ M HH AY b n/a 23 3230 3265 3318 N
+ M HH AY e n/a 23 3230 3265 3307 N
+ M HH AY s n/a 23 3230 3265 3307 N
+ M HH B b n/a 23 3228 3289 3337 N
+ M HH B e n/a 23 3228 3289 3337 N
+ M HH B s n/a 23 3228 3289 3337 N
+ M HH CH e n/a 23 3228 3285 3343 N
+ M HH CH s n/a 23 3228 3286 3343 N
+ M HH D b n/a 23 3228 3292 3335 N
+ M HH D e n/a 23 3228 3292 3335 N
+ M HH D s n/a 23 3228 3292 3335 N
+ M HH DH e n/a 23 3228 3294 3336 N
+ M HH DH s n/a 23 3228 3294 3336 N
+ M HH EH b n/a 23 3228 3276 3321 N
+ M HH EH e n/a 23 3228 3276 3325 N
+ M HH EH i n/a 23 3228 3276 3321 N
+ M HH EH s n/a 23 3228 3276 3321 N
+ M HH ER b n/a 23 3230 3267 3311 N
+ M HH ER e n/a 23 3230 3267 3311 N
+ M HH ER s n/a 23 3230 3267 3311 N
+ M HH EY b n/a 23 3228 3276 3330 N
+ M HH EY e n/a 23 3228 3276 3330 N
+ M HH EY s n/a 23 3228 3276 3330 N
+ M HH F b n/a 23 3228 3284 3342 N
+ M HH F e n/a 23 3228 3284 3342 N
+ M HH F s n/a 23 3228 3284 3342 N
+ M HH G b n/a 23 3228 3292 3335 N
+ M HH G e n/a 23 3228 3292 3335 N
+ M HH G s n/a 23 3228 3292 3335 N
+ M HH HH b n/a 23 3228 3288 3344 N
+ M HH HH e n/a 23 3228 3288 3344 N
+ M HH HH s n/a 23 3228 3288 3344 N
+ M HH IH b n/a 23 3228 3280 3329 N
+ M HH IH e n/a 23 3228 3280 3329 N
+ M HH IH s n/a 23 3228 3280 3329 N
+ M HH IY b n/a 23 3228 3279 3320 N
+ M HH IY e n/a 23 3228 3279 3320 N
+ M HH IY s n/a 23 3228 3279 3320 N
+ M HH JH b n/a 23 3228 3292 3335 N
+ M HH JH e n/a 23 3228 3292 3335 N
+ M HH JH s n/a 23 3228 3292 3335 N
+ M HH K b n/a 23 3228 3286 3343 N
+ M HH K e n/a 23 3228 3284 3343 N
+ M HH K s n/a 23 3228 3286 3343 N
+ M HH L b n/a 23 3230 3299 3331 N
+ M HH L e n/a 23 3230 3299 3331 N
+ M HH L s n/a 23 3230 3299 3331 N
+ M HH M e n/a 23 3228 3288 3333 N
+ M HH M i n/a 23 3228 3290 3333 N
+ M HH M s n/a 23 3228 3288 3333 N
+ M HH N b n/a 23 3228 3292 3333 N
+ M HH N e n/a 23 3228 3292 3333 N
+ M HH N s n/a 23 3228 3292 3333 N
+ M HH NG b n/a 23 3228 3292 3333 N
+ M HH NG e n/a 23 3228 3292 3333 N
+ M HH NG s n/a 23 3228 3292 3333 N
+ M HH OW b n/a 23 3230 3264 3313 N
+ M HH OW e n/a 23 3230 3264 3314 N
+ M HH OW i n/a 23 3230 3264 3313 N
+ M HH OW s n/a 23 3230 3264 3313 N
+ M HH OY b n/a 23 3230 3265 3312 N
+ M HH OY e n/a 23 3230 3265 3307 N
+ M HH OY s n/a 23 3230 3265 3307 N
+ M HH P b n/a 23 3228 3284 3342 N
+ M HH P e n/a 23 3228 3284 3342 N
+ M HH P s n/a 23 3228 3284 3342 N
+ M HH R b n/a 23 3230 3299 3331 N
+ M HH R e n/a 23 3230 3299 3331 N
+ M HH R s n/a 23 3230 3299 3331 N
+ M HH S e n/a 23 3228 3287 3340 N
+ M HH S s n/a 23 3228 3287 3340 N
+ M HH SH e n/a 23 3228 3287 3340 N
+ M HH SH s n/a 23 3228 3287 3340 N
+ M HH SIL e n/a 23 3228 3302 3345 N
+ M HH SIL s n/a 23 3228 3302 3345 N
+ M HH T b n/a 23 3228 3286 3343 N
+ M HH T e n/a 23 3228 3285 3343 N
+ M HH T s n/a 23 3228 3286 3343 N
+ M HH TH e n/a 23 3228 3285 3342 N
+ M HH TH s n/a 23 3228 3286 3342 N
+ M HH UH b n/a 23 3230 3264 3312 N
+ M HH UH e n/a 23 3230 3264 3316 N
+ M HH UH s n/a 23 3230 3264 3316 N
+ M HH UW b n/a 23 3230 3261 3316 N
+ M HH UW e n/a 23 3230 3261 3316 N
+ M HH UW i n/a 23 3230 3261 3316 N
+ M HH UW s n/a 23 3230 3261 3316 N
+ M HH V b n/a 23 3228 3294 3337 N
+ M HH V e n/a 23 3228 3294 3337 N
+ M HH V s n/a 23 3228 3294 3337 N
+ M HH W b n/a 23 3230 3298 3332 N
+ M HH W e n/a 23 3230 3298 3332 N
+ M HH W s n/a 23 3230 3298 3332 N
+ M HH Y b n/a 23 3228 3297 3334 N
+ M HH Y e n/a 23 3228 3297 3334 N
+ M HH Y s n/a 23 3228 3297 3334 N
+ M HH Z b n/a 23 3228 3294 3339 N
+ M HH Z e n/a 23 3228 3294 3339 N
+ M HH Z s n/a 23 3228 3294 3339 N
+ M HH ZH e n/a 23 3228 3294 3339 N
+ M HH ZH s n/a 23 3228 3294 3339 N
+ M IH AA b n/a 23 3223 3256 3315 N
+ M IH AA e n/a 23 3224 3256 3314 N
+ M IH AA i n/a 23 3223 3256 3315 N
+ M IH AA s n/a 23 3223 3256 3315 N
+ M IH AE b n/a 23 3223 3272 3322 N
+ M IH AE e n/a 23 3224 3268 3325 N
+ M IH AE i n/a 23 3223 3272 3322 N
+ M IH AE s n/a 23 3223 3272 3322 N
+ M IH AH b n/a 23 3224 3256 3317 N
+ M IH AH e n/a 23 3224 3247 3307 N
+ M IH AH i n/a 23 3224 3248 3306 N
+ M IH AH s n/a 23 3224 3247 3307 N
+ M IH AO b n/a 23 3223 3253 3312 N
+ M IH AO e n/a 23 3224 3253 3314 N
+ M IH AO i n/a 23 3223 3253 3312 N
+ M IH AO s n/a 23 3223 3253 3314 N
+ M IH AW b n/a 23 3223 3272 3324 N
+ M IH AW e n/a 23 3224 3268 3324 N
+ M IH AW i n/a 23 3223 3272 3324 N
+ M IH AW s n/a 23 3223 3272 3324 N
+ M IH AY b n/a 23 3223 3256 3318 N
+ M IH AY e n/a 23 3224 3256 3307 N
+ M IH AY i n/a 23 3223 3256 3318 N
+ M IH AY s n/a 23 3223 3256 3307 N
+ M IH B b n/a 23 3224 3289 3337 N
+ M IH B e n/a 23 3224 3289 3337 N
+ M IH B i n/a 23 3224 3289 3337 N
+ M IH B s n/a 23 3224 3289 3337 N
+ M IH CH e n/a 23 3224 3286 3343 N
+ M IH CH i n/a 23 3224 3282 3343 N
+ M IH CH s n/a 23 3224 3285 3343 N
+ M IH D b n/a 23 3224 3292 3335 N
+ M IH D e n/a 23 3224 3292 3335 N
+ M IH D i n/a 23 3224 3292 3335 N
+ M IH D s n/a 23 3224 3292 3335 N
+ M IH DH e n/a 23 3224 3294 3336 N
+ M IH DH s n/a 23 3224 3294 3336 N
+ M IH EH b n/a 23 3223 3272 3321 N
+ M IH EH e n/a 23 3224 3268 3325 N
+ M IH EH i n/a 23 3223 3272 3323 N
+ M IH EH s n/a 23 3223 3272 3321 N
+ M IH ER b n/a 23 3224 3255 3311 N
+ M IH ER e n/a 23 3224 3249 3311 N
+ M IH ER i n/a 23 3224 3249 3311 N
+ M IH ER s n/a 23 3224 3249 3311 N
+ M IH EY b n/a 23 3223 3273 3330 N
+ M IH EY e n/a 23 3224 3269 3330 N
+ M IH EY i n/a 23 3223 3273 3330 N
+ M IH EY s n/a 23 3223 3273 3330 N
+ M IH F b n/a 23 3224 3284 3342 N
+ M IH F e n/a 23 3224 3284 3342 N
+ M IH F i n/a 23 3224 3282 3342 N
+ M IH F s n/a 23 3224 3284 3342 N
+ M IH G b n/a 23 3224 3292 3335 N
+ M IH G e n/a 23 3224 3292 3335 N
+ M IH G i n/a 23 3224 3292 3335 N
+ M IH G s n/a 23 3224 3292 3335 N
+ M IH HH b n/a 23 3224 3288 3344 N
+ M IH HH e n/a 23 3224 3288 3344 N
+ M IH HH i n/a 23 3224 3282 3344 N
+ M IH HH s n/a 23 3224 3288 3344 N
+ M IH IH b n/a 23 3224 3274 3329 N
+ M IH IH e n/a 23 3224 3268 3327 N
+ M IH IH i n/a 23 3224 3268 3327 N
+ M IH IH s n/a 23 3224 3268 3327 N
+ M IH IY b n/a 23 3223 3274 3319 N
+ M IH IY e n/a 23 3224 3269 3319 N
+ M IH IY i n/a 23 3223 3269 3319 N
+ M IH IY s n/a 23 3223 3269 3319 N
+ M IH JH b n/a 23 3224 3292 3335 N
+ M IH JH e n/a 23 3224 3292 3335 N
+ M IH JH s n/a 23 3224 3292 3335 N
+ M IH K b n/a 23 3224 3285 3343 N
+ M IH K e n/a 23 3224 3284 3343 N
+ M IH K i n/a 23 3224 3282 3343 N
+ M IH K s n/a 23 3224 3285 3343 N
+ M IH L b n/a 23 3224 3299 3331 N
+ M IH L e n/a 23 3224 3299 3331 N
+ M IH L i n/a 23 3224 3299 3331 N
+ M IH L s n/a 23 3224 3299 3331 N
+ M IH M e n/a 23 3224 3288 3333 N
+ M IH M s n/a 23 3224 3288 3333 N
+ M IH N b n/a 23 3224 3292 3333 N
+ M IH N e n/a 23 3224 3292 3333 N
+ M IH N i n/a 23 3224 3292 3333 N
+ M IH N s n/a 23 3224 3292 3333 N
+ M IH NG b n/a 23 3224 3292 3333 N
+ M IH NG e n/a 23 3224 3292 3333 N
+ M IH NG s n/a 23 3224 3292 3333 N
+ M IH OW b n/a 23 3223 3256 3313 N
+ M IH OW e n/a 23 3224 3256 3314 N
+ M IH OW i n/a 23 3223 3256 3313 N
+ M IH OW s n/a 23 3223 3256 3313 N
+ M IH OY b n/a 23 3223 3256 3312 N
+ M IH OY e n/a 23 3224 3256 3307 N
+ M IH OY i n/a 23 3223 3256 3312 N
+ M IH OY s n/a 23 3223 3256 3307 N
+ M IH P b n/a 23 3225 3284 3342 N
+ M IH P e n/a 23 3225 3284 3342 N
+ M IH P i n/a 23 3225 3282 3342 N
+ M IH P s n/a 23 3225 3284 3342 N
+ M IH R b n/a 23 3224 3299 3331 N
+ M IH R e n/a 23 3224 3299 3331 N
+ M IH R i n/a 23 3224 3299 3331 N
+ M IH R s n/a 23 3224 3299 3331 N
+ M IH S e n/a 23 3224 3287 3340 N
+ M IH S i n/a 23 3224 3287 3340 N
+ M IH S s n/a 23 3224 3287 3340 N
+ M IH SH e n/a 23 3224 3287 3340 N
+ M IH SH i n/a 23 3224 3282 3340 N
+ M IH SH s n/a 23 3224 3287 3340 N
+ M IH SIL e n/a 23 3222 3303 3345 N
+ M IH SIL s n/a 23 3222 3303 3345 N
+ M IH T b n/a 23 3224 3285 3343 N
+ M IH T e n/a 23 3224 3286 3343 N
+ M IH T i n/a 23 3224 3285 3343 N
+ M IH T s n/a 23 3224 3285 3343 N
+ M IH TH e n/a 23 3224 3286 3342 N
+ M IH TH s n/a 23 3224 3285 3342 N
+ M IH UH b n/a 23 3223 3257 3312 N
+ M IH UH e n/a 23 3224 3257 3316 N
+ M IH UH i n/a 23 3223 3257 3312 N
+ M IH UH s n/a 23 3223 3257 3316 N
+ M IH UW b n/a 23 3223 3257 3316 N
+ M IH UW e n/a 23 3224 3257 3316 N
+ M IH UW i n/a 23 3223 3257 3316 N
+ M IH UW s n/a 23 3223 3257 3316 N
+ M IH V b n/a 23 3224 3294 3337 N
+ M IH V e n/a 23 3224 3294 3337 N
+ M IH V s n/a 23 3224 3294 3337 N
+ M IH W b n/a 23 3225 3298 3332 N
+ M IH W e n/a 23 3225 3298 3332 N
+ M IH W i n/a 23 3225 3298 3332 N
+ M IH W s n/a 23 3225 3298 3332 N
+ M IH Y b n/a 23 3224 3297 3334 N
+ M IH Y e n/a 23 3224 3297 3334 N
+ M IH Y i n/a 23 3224 3297 3334 N
+ M IH Y s n/a 23 3224 3297 3334 N
+ M IH Z b n/a 23 3224 3294 3339 N
+ M IH Z e n/a 23 3224 3294 3339 N
+ M IH Z i n/a 23 3224 3294 3339 N
+ M IH Z s n/a 23 3224 3294 3339 N
+ M IH ZH e n/a 23 3224 3294 3339 N
+ M IH ZH s n/a 23 3224 3294 3339 N
+ M IY AA b n/a 23 3216 3258 3315 N
+ M IY AA e n/a 23 3216 3258 3314 N
+ M IY AA i n/a 23 3216 3258 3315 N
+ M IY AA s n/a 23 3216 3258 3315 N
+ M IY AE b n/a 23 3217 3273 3322 N
+ M IY AE e n/a 23 3217 3269 3325 N
+ M IY AE i n/a 23 3217 3273 3322 N
+ M IY AE s n/a 23 3217 3273 3322 N
+ M IY AH b n/a 23 3216 3258 3317 N
+ M IY AH e n/a 23 3217 3247 3307 N
+ M IY AH i n/a 23 3217 3248 3306 N
+ M IY AH s n/a 23 3217 3247 3307 N
+ M IY AO b n/a 23 3216 3253 3312 N
+ M IY AO e n/a 23 3216 3253 3314 N
+ M IY AO i n/a 23 3216 3253 3312 N
+ M IY AO s n/a 23 3216 3253 3314 N
+ M IY AW b n/a 23 3217 3273 3324 N
+ M IY AW e n/a 23 3217 3269 3324 N
+ M IY AW i n/a 23 3217 3273 3324 N
+ M IY AW s n/a 23 3217 3273 3324 N
+ M IY AY b n/a 23 3216 3258 3318 N
+ M IY AY e n/a 23 3216 3258 3307 N
+ M IY AY i n/a 23 3216 3258 3318 N
+ M IY AY s n/a 23 3216 3258 3307 N
+ M IY B b n/a 23 3215 3289 3337 N
+ M IY B e n/a 23 3215 3289 3337 N
+ M IY B i n/a 23 3215 3290 3337 N
+ M IY B s n/a 23 3215 3289 3337 N
+ M IY CH e n/a 23 3215 3286 3343 N
+ M IY CH i n/a 23 3215 3282 3343 N
+ M IY CH s n/a 23 3215 3286 3343 N
+ M IY D b n/a 23 3215 3295 3335 N
+ M IY D e n/a 23 3215 3295 3335 N
+ M IY D i n/a 23 3215 3295 3335 N
+ M IY D s n/a 23 3215 3295 3335 N
+ M IY DH e n/a 23 3215 3295 3336 N
+ M IY DH s n/a 23 3215 3295 3336 N
+ M IY EH b n/a 23 3217 3273 3321 N
+ M IY EH e n/a 23 3217 3269 3325 N
+ M IY EH i n/a 23 3217 3273 3323 N
+ M IY EH s n/a 23 3217 3273 3321 N
+ M IY ER b n/a 23 3216 3257 3311 N
+ M IY ER e n/a 23 3216 3249 3311 N
+ M IY ER i n/a 23 3216 3249 3311 N
+ M IY ER s n/a 23 3216 3249 3311 N
+ M IY EY b n/a 23 3217 3273 3330 N
+ M IY EY e n/a 23 3217 3269 3330 N
+ M IY EY i n/a 23 3217 3273 3330 N
+ M IY EY s n/a 23 3217 3273 3330 N
+ M IY F b n/a 23 3215 3284 3342 N
+ M IY F e n/a 23 3215 3284 3342 N
+ M IY F s n/a 23 3215 3284 3342 N
+ M IY G b n/a 23 3215 3295 3335 N
+ M IY G e n/a 23 3215 3295 3335 N
+ M IY G s n/a 23 3215 3295 3335 N
+ M IY HH b n/a 23 3215 3288 3344 N
+ M IY HH e n/a 23 3215 3288 3344 N
+ M IY HH s n/a 23 3215 3288 3344 N
+ M IY IH b n/a 23 3217 3274 3329 N
+ M IY IH e n/a 23 3217 3269 3327 N
+ M IY IH i n/a 23 3217 3269 3327 N
+ M IY IH s n/a 23 3217 3269 3327 N
+ M IY IY b n/a 23 3217 3274 3319 N
+ M IY IY e n/a 23 3217 3269 3319 N
+ M IY IY i n/a 23 3217 3269 3319 N
+ M IY IY s n/a 23 3217 3269 3319 N
+ M IY JH b n/a 23 3215 3295 3335 N
+ M IY JH e n/a 23 3215 3295 3335 N
+ M IY JH s n/a 23 3215 3295 3335 N
+ M IY K b n/a 23 3215 3286 3343 N
+ M IY K e n/a 23 3215 3286 3343 N
+ M IY K i n/a 23 3215 3282 3343 N
+ M IY K s n/a 23 3215 3286 3343 N
+ M IY L b n/a 23 3215 3299 3331 N
+ M IY L e n/a 23 3215 3299 3331 N
+ M IY L i n/a 23 3215 3299 3331 N
+ M IY L s n/a 23 3215 3299 3331 N
+ M IY M e n/a 23 3215 3289 3333 N
+ M IY M i n/a 23 3215 3290 3333 N
+ M IY M s n/a 23 3215 3289 3333 N
+ M IY N b n/a 23 3215 3295 3333 N
+ M IY N e n/a 23 3215 3295 3333 N
+ M IY N s n/a 23 3215 3295 3333 N
+ M IY NG b n/a 23 3215 3295 3333 N
+ M IY NG e n/a 23 3215 3295 3333 N
+ M IY NG s n/a 23 3215 3295 3333 N
+ M IY OW b n/a 23 3216 3258 3313 N
+ M IY OW e n/a 23 3216 3258 3314 N
+ M IY OW i n/a 23 3216 3258 3313 N
+ M IY OW s n/a 23 3216 3258 3313 N
+ M IY OY b n/a 23 3216 3258 3312 N
+ M IY OY e n/a 23 3216 3258 3307 N
+ M IY OY i n/a 23 3216 3258 3312 N
+ M IY OY s n/a 23 3216 3258 3307 N
+ M IY P b n/a 23 3215 3284 3342 N
+ M IY P e n/a 23 3215 3284 3342 N
+ M IY P i n/a 23 3215 3282 3342 N
+ M IY P s n/a 23 3215 3284 3342 N
+ M IY R b n/a 23 3215 3299 3331 N
+ M IY R e n/a 23 3215 3299 3331 N
+ M IY R i n/a 23 3215 3299 3331 N
+ M IY R s n/a 23 3215 3299 3331 N
+ M IY S e n/a 23 3215 3287 3340 N
+ M IY S i n/a 23 3215 3287 3340 N
+ M IY S s n/a 23 3215 3287 3340 N
+ M IY SH e n/a 23 3215 3287 3340 N
+ M IY SH i n/a 23 3215 3282 3340 N
+ M IY SH s n/a 23 3215 3287 3340 N
+ M IY SIL e n/a 23 3215 3302 3345 N
+ M IY SIL s n/a 23 3215 3302 3345 N
+ M IY T b n/a 23 3215 3286 3343 N
+ M IY T e n/a 23 3215 3286 3343 N
+ M IY T i n/a 23 3215 3286 3343 N
+ M IY T s n/a 23 3215 3286 3343 N
+ M IY TH e n/a 23 3215 3286 3342 N
+ M IY TH s n/a 23 3215 3286 3342 N
+ M IY UH b n/a 23 3216 3257 3312 N
+ M IY UH e n/a 23 3216 3257 3316 N
+ M IY UH i n/a 23 3216 3257 3312 N
+ M IY UH s n/a 23 3216 3257 3316 N
+ M IY UW b n/a 23 3216 3257 3316 N
+ M IY UW e n/a 23 3216 3257 3316 N
+ M IY UW i n/a 23 3216 3257 3316 N
+ M IY UW s n/a 23 3216 3257 3316 N
+ M IY V b n/a 23 3215 3295 3337 N
+ M IY V e n/a 23 3215 3295 3337 N
+ M IY V s n/a 23 3215 3295 3337 N
+ M IY W b n/a 23 3215 3298 3332 N
+ M IY W e n/a 23 3215 3298 3332 N
+ M IY W i n/a 23 3215 3298 3332 N
+ M IY W s n/a 23 3215 3298 3332 N
+ M IY Y b n/a 23 3215 3297 3334 N
+ M IY Y e n/a 23 3215 3297 3334 N
+ M IY Y i n/a 23 3215 3297 3334 N
+ M IY Y s n/a 23 3215 3297 3334 N
+ M IY Z b n/a 23 3215 3295 3339 N
+ M IY Z e n/a 23 3215 3295 3339 N
+ M IY Z i n/a 23 3215 3295 3339 N
+ M IY Z s n/a 23 3215 3295 3339 N
+ M IY ZH e n/a 23 3215 3295 3339 N
+ M IY ZH s n/a 23 3215 3295 3339 N
+ M JH AA b n/a 23 3230 3264 3315 N
+ M JH AA s n/a 23 3230 3264 3315 N
+ M JH AE b n/a 23 3228 3276 3322 N
+ M JH AE s n/a 23 3228 3276 3322 N
+ M JH AH b n/a 23 3229 3264 3317 N
+ M JH AH i n/a 23 3228 3259 3305 N
+ M JH AH s n/a 23 3228 3264 3307 N
+ M JH AO b n/a 23 3230 3260 3312 N
+ M JH AO i n/a 23 3230 3260 3312 N
+ M JH AO s n/a 23 3230 3260 3314 N
+ M JH AW b n/a 23 3228 3276 3324 N
+ M JH AW s n/a 23 3228 3276 3324 N
+ M JH AY b n/a 23 3230 3265 3318 N
+ M JH AY s n/a 23 3230 3265 3307 N
+ M JH B b n/a 23 3228 3289 3337 N
+ M JH B s n/a 23 3228 3289 3337 N
+ M JH CH s n/a 23 3228 3286 3343 N
+ M JH D b n/a 23 3228 3292 3335 N
+ M JH D s n/a 23 3228 3292 3335 N
+ M JH DH s n/a 23 3228 3294 3336 N
+ M JH EH b n/a 23 3228 3276 3321 N
+ M JH EH i n/a 23 3228 3276 3321 N
+ M JH EH s n/a 23 3228 3276 3321 N
+ M JH ER b n/a 23 3230 3267 3311 N
+ M JH ER s n/a 23 3230 3267 3311 N
+ M JH EY b n/a 23 3228 3276 3330 N
+ M JH EY i n/a 23 3228 3276 3330 N
+ M JH EY s n/a 23 3228 3276 3330 N
+ M JH F b n/a 23 3228 3284 3342 N
+ M JH F s n/a 23 3228 3284 3342 N
+ M JH G b n/a 23 3228 3292 3335 N
+ M JH G s n/a 23 3228 3292 3335 N
+ M JH HH b n/a 23 3228 3288 3344 N
+ M JH HH s n/a 23 3228 3288 3344 N
+ M JH IH b n/a 23 3228 3280 3329 N
+ M JH IH s n/a 23 3228 3280 3329 N
+ M JH IY b n/a 23 3228 3279 3320 N
+ M JH IY s n/a 23 3228 3279 3320 N
+ M JH JH b n/a 23 3228 3292 3335 N
+ M JH JH s n/a 23 3228 3292 3335 N
+ M JH K b n/a 23 3228 3286 3343 N
+ M JH K s n/a 23 3228 3286 3343 N
+ M JH L b n/a 23 3230 3299 3331 N
+ M JH L s n/a 23 3230 3299 3331 N
+ M JH M s n/a 23 3228 3288 3333 N
+ M JH N b n/a 23 3228 3292 3333 N
+ M JH N s n/a 23 3228 3292 3333 N
+ M JH NG b n/a 23 3228 3292 3333 N
+ M JH NG s n/a 23 3228 3292 3333 N
+ M JH OW b n/a 23 3230 3264 3313 N
+ M JH OW s n/a 23 3230 3264 3313 N
+ M JH OY b n/a 23 3230 3265 3312 N
+ M JH OY s n/a 23 3230 3265 3307 N
+ M JH P b n/a 23 3228 3284 3342 N
+ M JH P s n/a 23 3228 3284 3342 N
+ M JH R b n/a 23 3230 3299 3331 N
+ M JH R s n/a 23 3230 3299 3331 N
+ M JH S s n/a 23 3228 3287 3340 N
+ M JH SH s n/a 23 3228 3287 3340 N
+ M JH SIL s n/a 23 3228 3303 3345 N
+ M JH T b n/a 23 3228 3286 3343 N
+ M JH T s n/a 23 3228 3286 3343 N
+ M JH TH s n/a 23 3228 3286 3342 N
+ M JH UH b n/a 23 3230 3264 3312 N
+ M JH UH i n/a 23 3230 3264 3312 N
+ M JH UH s n/a 23 3230 3264 3316 N
+ M JH UW b n/a 23 3230 3261 3316 N
+ M JH UW s n/a 23 3230 3261 3316 N
+ M JH V b n/a 23 3228 3294 3337 N
+ M JH V s n/a 23 3228 3294 3337 N
+ M JH W b n/a 23 3230 3298 3332 N
+ M JH W s n/a 23 3230 3298 3332 N
+ M JH Y b n/a 23 3228 3297 3334 N
+ M JH Y s n/a 23 3228 3297 3334 N
+ M JH Z b n/a 23 3228 3294 3339 N
+ M JH Z s n/a 23 3228 3294 3339 N
+ M JH ZH s n/a 23 3228 3294 3339 N
+ M K AA b n/a 23 3230 3264 3315 N
+ M K AA e n/a 23 3230 3264 3314 N
+ M K AA i n/a 23 3230 3264 3315 N
+ M K AA s n/a 23 3230 3264 3315 N
+ M K AE b n/a 23 3229 3276 3322 N
+ M K AE e n/a 23 3228 3276 3325 N
+ M K AE i n/a 23 3228 3276 3322 N
+ M K AE s n/a 23 3228 3276 3322 N
+ M K AH b n/a 23 3229 3264 3317 N
+ M K AH e n/a 23 3228 3264 3307 N
+ M K AH i n/a 23 3228 3259 3305 N
+ M K AH s n/a 23 3228 3264 3307 N
+ M K AO b n/a 23 3230 3260 3312 N
+ M K AO e n/a 23 3230 3260 3314 N
+ M K AO i n/a 23 3230 3260 3312 N
+ M K AO s n/a 23 3230 3260 3314 N
+ M K AW b n/a 23 3229 3276 3324 N
+ M K AW e n/a 23 3228 3276 3324 N
+ M K AW s n/a 23 3228 3276 3324 N
+ M K AY b n/a 23 3230 3265 3318 N
+ M K AY e n/a 23 3230 3265 3307 N
+ M K AY i n/a 23 3230 3265 3318 N
+ M K AY s n/a 23 3230 3265 3307 N
+ M K B b n/a 23 3229 3289 3337 N
+ M K B e n/a 23 3228 3289 3337 N
+ M K B s n/a 23 3228 3289 3337 N
+ M K CH e n/a 23 3228 3285 3343 N
+ M K CH s n/a 23 3228 3286 3343 N
+ M K D b n/a 23 3229 3292 3335 N
+ M K D e n/a 23 3228 3292 3335 N
+ M K D s n/a 23 3228 3292 3335 N
+ M K DH e n/a 23 3228 3294 3336 N
+ M K DH s n/a 23 3228 3294 3336 N
+ M K EH b n/a 23 3229 3276 3321 N
+ M K EH e n/a 23 3228 3276 3325 N
+ M K EH i n/a 23 3228 3276 3321 N
+ M K EH s n/a 23 3228 3276 3321 N
+ M K ER b n/a 23 3230 3267 3311 N
+ M K ER e n/a 23 3230 3267 3311 N
+ M K ER i n/a 23 3230 3267 3311 N
+ M K ER s n/a 23 3230 3267 3311 N
+ M K EY b n/a 23 3229 3276 3330 N
+ M K EY e n/a 23 3228 3276 3330 N
+ M K EY i n/a 23 3228 3276 3330 N
+ M K EY s n/a 23 3228 3276 3330 N
+ M K F b n/a 23 3229 3284 3342 N
+ M K F e n/a 23 3228 3284 3342 N
+ M K F s n/a 23 3228 3284 3342 N
+ M K G b n/a 23 3229 3292 3335 N
+ M K G e n/a 23 3228 3292 3335 N
+ M K G s n/a 23 3228 3292 3335 N
+ M K HH b n/a 23 3229 3288 3344 N
+ M K HH e n/a 23 3228 3288 3344 N
+ M K HH s n/a 23 3228 3288 3344 N
+ M K IH b n/a 23 3229 3280 3329 N
+ M K IH e n/a 23 3228 3280 3329 N
+ M K IH i n/a 23 3228 3280 3328 N
+ M K IH s n/a 23 3228 3280 3329 N
+ M K IY b n/a 23 3229 3279 3320 N
+ M K IY e n/a 23 3228 3279 3320 N
+ M K IY i n/a 23 3228 3279 3320 N
+ M K IY s n/a 23 3228 3279 3320 N
+ M K JH b n/a 23 3229 3292 3335 N
+ M K JH e n/a 23 3228 3292 3335 N
+ M K JH s n/a 23 3228 3292 3335 N
+ M K K b n/a 23 3229 3286 3343 N
+ M K K e n/a 23 3228 3284 3343 N
+ M K K s n/a 23 3228 3286 3343 N
+ M K L b n/a 23 3230 3299 3331 N
+ M K L e n/a 23 3230 3299 3331 N
+ M K L s n/a 23 3230 3299 3331 N
+ M K M e n/a 23 3228 3288 3333 N
+ M K M s n/a 23 3228 3288 3333 N
+ M K N b n/a 23 3229 3292 3333 N
+ M K N e n/a 23 3228 3292 3333 N
+ M K N s n/a 23 3228 3292 3333 N
+ M K NG b n/a 23 3229 3292 3333 N
+ M K NG e n/a 23 3228 3292 3333 N
+ M K NG s n/a 23 3228 3292 3333 N
+ M K OW b n/a 23 3230 3264 3313 N
+ M K OW e n/a 23 3230 3264 3314 N
+ M K OW i n/a 23 3230 3264 3313 N
+ M K OW s n/a 23 3230 3264 3313 N
+ M K OY b n/a 23 3230 3265 3312 N
+ M K OY e n/a 23 3230 3265 3307 N
+ M K OY s n/a 23 3230 3265 3307 N
+ M K P b n/a 23 3229 3284 3342 N
+ M K P e n/a 23 3228 3284 3342 N
+ M K P s n/a 23 3228 3284 3342 N
+ M K R b n/a 23 3230 3299 3331 N
+ M K R e n/a 23 3230 3299 3331 N
+ M K R s n/a 23 3230 3299 3331 N
+ M K S e n/a 23 3228 3287 3340 N
+ M K S s n/a 23 3228 3287 3340 N
+ M K SH e n/a 23 3228 3287 3340 N
+ M K SH s n/a 23 3228 3287 3340 N
+ M K SIL e n/a 23 3228 3302 3345 N
+ M K SIL s n/a 23 3228 3302 3345 N
+ M K T b n/a 23 3229 3286 3343 N
+ M K T e n/a 23 3228 3285 3343 N
+ M K T s n/a 23 3228 3286 3343 N
+ M K TH e n/a 23 3228 3285 3342 N
+ M K TH s n/a 23 3228 3286 3342 N
+ M K UH b n/a 23 3230 3264 3312 N
+ M K UH e n/a 23 3230 3264 3316 N
+ M K UH i n/a 23 3230 3264 3312 N
+ M K UH s n/a 23 3230 3264 3316 N
+ M K UW b n/a 23 3230 3261 3316 N
+ M K UW e n/a 23 3230 3261 3316 N
+ M K UW i n/a 23 3230 3261 3316 N
+ M K UW s n/a 23 3230 3261 3316 N
+ M K V b n/a 23 3229 3294 3337 N
+ M K V e n/a 23 3228 3294 3337 N
+ M K V s n/a 23 3228 3294 3337 N
+ M K W b n/a 23 3230 3298 3332 N
+ M K W e n/a 23 3230 3298 3332 N
+ M K W s n/a 23 3230 3298 3332 N
+ M K Y b n/a 23 3229 3297 3334 N
+ M K Y e n/a 23 3228 3297 3334 N
+ M K Y s n/a 23 3228 3297 3334 N
+ M K Z b n/a 23 3229 3294 3339 N
+ M K Z e n/a 23 3228 3294 3339 N
+ M K Z i n/a 23 3228 3294 3339 N
+ M K Z s n/a 23 3228 3294 3339 N
+ M K ZH e n/a 23 3228 3294 3339 N
+ M K ZH s n/a 23 3228 3294 3339 N
+ M L AA b n/a 23 3206 3252 3315 N
+ M L AA e n/a 23 3206 3252 3314 N
+ M L AA i n/a 23 3206 3251 3315 N
+ M L AA s n/a 23 3206 3252 3315 N
+ M L AE b n/a 23 3207 3270 3322 N
+ M L AE e n/a 23 3207 3270 3325 N
+ M L AE i n/a 23 3207 3270 3322 N
+ M L AE s n/a 23 3207 3270 3322 N
+ M L AH b n/a 23 3207 3252 3317 N
+ M L AH e n/a 23 3207 3242 3307 N
+ M L AH i n/a 23 3207 3243 3309 N
+ M L AH s n/a 23 3207 3242 3307 N
+ M L AO b n/a 23 3206 3251 3312 N
+ M L AO e n/a 23 3206 3251 3314 N
+ M L AO i n/a 23 3206 3251 3312 N
+ M L AO s n/a 23 3206 3251 3314 N
+ M L AW b n/a 23 3207 3270 3324 N
+ M L AW e n/a 23 3207 3270 3324 N
+ M L AW i n/a 23 3207 3270 3324 N
+ M L AW s n/a 23 3207 3270 3324 N
+ M L AY b n/a 23 3206 3252 3318 N
+ M L AY e n/a 23 3206 3252 3307 N
+ M L AY i n/a 23 3206 3252 3318 N
+ M L AY s n/a 23 3206 3252 3307 N
+ M L B b n/a 23 3205 3289 3337 N
+ M L B e n/a 23 3205 3289 3337 N
+ M L B i n/a 23 3205 3291 3338 N
+ M L B s n/a 23 3205 3289 3337 N
+ M L CH e n/a 23 3205 3285 3343 N
+ M L CH s n/a 23 3205 3286 3343 N
+ M L D b n/a 23 3205 3292 3335 N
+ M L D e n/a 23 3205 3292 3335 N
+ M L D i n/a 23 3205 3292 3335 N
+ M L D s n/a 23 3205 3292 3335 N
+ M L DH e n/a 23 3205 3294 3336 N
+ M L DH s n/a 23 3205 3294 3336 N
+ M L EH b n/a 23 3207 3270 3321 N
+ M L EH e n/a 23 3207 3270 3325 N
+ M L EH i n/a 23 3207 3270 3323 N
+ M L EH s n/a 23 3207 3270 3321 N
+ M L ER b n/a 23 3206 3252 3311 N
+ M L ER e n/a 23 3206 3246 3311 N
+ M L ER i n/a 23 3206 3246 3311 N
+ M L ER s n/a 23 3206 3246 3311 N
+ M L EY b n/a 23 3207 3270 3330 N
+ M L EY e n/a 23 3207 3270 3330 N
+ M L EY i n/a 23 3207 3270 3330 N
+ M L EY s n/a 23 3207 3270 3330 N
+ M L F b n/a 23 3205 3284 3342 N
+ M L F e n/a 23 3205 3284 3342 N
+ M L F s n/a 23 3205 3284 3342 N
+ M L G b n/a 23 3205 3292 3335 N
+ M L G e n/a 23 3205 3292 3335 N
+ M L G i n/a 23 3205 3292 3335 N
+ M L G s n/a 23 3205 3292 3335 N
+ M L HH b n/a 23 3205 3288 3344 N
+ M L HH e n/a 23 3205 3288 3344 N
+ M L HH i n/a 23 3205 3281 3344 N
+ M L HH s n/a 23 3205 3288 3344 N
+ M L IH b n/a 23 3207 3270 3329 N
+ M L IH e n/a 23 3207 3270 3327 N
+ M L IH i n/a 23 3207 3270 3326 N
+ M L IH s n/a 23 3207 3270 3327 N
+ M L IY b n/a 23 3207 3270 3319 N
+ M L IY e n/a 23 3207 3270 3319 N
+ M L IY i n/a 23 3207 3270 3319 N
+ M L IY s n/a 23 3207 3270 3319 N
+ M L JH b n/a 23 3205 3292 3335 N
+ M L JH e n/a 23 3205 3292 3335 N
+ M L JH s n/a 23 3205 3292 3335 N
+ M L K b n/a 23 3205 3286 3343 N
+ M L K e n/a 23 3205 3284 3343 N
+ M L K i n/a 23 3205 3281 3343 N
+ M L K s n/a 23 3205 3286 3343 N
+ M L L b n/a 23 3205 3299 3331 N
+ M L L e n/a 23 3205 3299 3331 N
+ M L L i n/a 23 3205 3299 3331 N
+ M L L s n/a 23 3205 3299 3331 N
+ M L M e n/a 23 3205 3288 3333 N
+ M L M s n/a 23 3205 3288 3333 N
+ M L N b n/a 23 3205 3292 3333 N
+ M L N e n/a 23 3205 3292 3333 N
+ M L N i n/a 23 3205 3292 3333 N
+ M L N s n/a 23 3205 3292 3333 N
+ M L NG b n/a 23 3205 3292 3333 N
+ M L NG e n/a 23 3205 3292 3333 N
+ M L NG s n/a 23 3205 3292 3333 N
+ M L OW b n/a 23 3206 3252 3314 N
+ M L OW e n/a 23 3206 3252 3314 N
+ M L OW i n/a 23 3206 3251 3314 N
+ M L OW s n/a 23 3206 3252 3314 N
+ M L OY b n/a 23 3206 3252 3312 N
+ M L OY e n/a 23 3206 3252 3307 N
+ M L OY i n/a 23 3206 3252 3312 N
+ M L OY s n/a 23 3206 3252 3307 N
+ M L P b n/a 23 3205 3284 3342 N
+ M L P e n/a 23 3205 3284 3342 N
+ M L P s n/a 23 3205 3284 3342 N
+ M L R b n/a 23 3205 3299 3331 N
+ M L R e n/a 23 3205 3299 3331 N
+ M L R s n/a 23 3205 3299 3331 N
+ M L S e n/a 23 3205 3287 3340 N
+ M L S i n/a 23 3205 3287 3340 N
+ M L S s n/a 23 3205 3287 3340 N
+ M L SH e n/a 23 3205 3287 3340 N
+ M L SH s n/a 23 3205 3287 3340 N
+ M L SIL e n/a 23 3205 3300 3346 N
+ M L SIL s n/a 23 3205 3300 3346 N
+ M L T b n/a 23 3205 3286 3343 N
+ M L T e n/a 23 3205 3285 3343 N
+ M L T i n/a 23 3205 3286 3343 N
+ M L T s n/a 23 3205 3286 3343 N
+ M L TH e n/a 23 3205 3285 3342 N
+ M L TH s n/a 23 3205 3286 3342 N
+ M L UH b n/a 23 3206 3252 3312 N
+ M L UH e n/a 23 3206 3252 3316 N
+ M L UH i n/a 23 3206 3251 3312 N
+ M L UH s n/a 23 3206 3252 3316 N
+ M L UW b n/a 23 3206 3252 3316 N
+ M L UW e n/a 23 3206 3252 3316 N
+ M L UW i n/a 23 3206 3251 3316 N
+ M L UW s n/a 23 3206 3252 3316 N
+ M L V b n/a 23 3205 3294 3337 N
+ M L V e n/a 23 3205 3294 3337 N
+ M L V s n/a 23 3205 3294 3337 N
+ M L W b n/a 23 3205 3298 3332 N
+ M L W e n/a 23 3205 3298 3332 N
+ M L W i n/a 23 3205 3298 3332 N
+ M L W s n/a 23 3205 3298 3332 N
+ M L Y b n/a 23 3207 3297 3334 N
+ M L Y e n/a 23 3207 3297 3334 N
+ M L Y s n/a 23 3207 3297 3334 N
+ M L Z b n/a 23 3205 3294 3339 N
+ M L Z e n/a 23 3205 3294 3339 N
+ M L Z i n/a 23 3205 3294 3339 N
+ M L Z s n/a 23 3205 3294 3339 N
+ M L ZH e n/a 23 3205 3294 3339 N
+ M L ZH s n/a 23 3205 3294 3339 N
+ M M AA b n/a 23 3235 3266 3315 N
+ M M AA e n/a 23 3235 3266 3314 N
+ M M AA s n/a 23 3235 3266 3315 N
+ M M AE b n/a 23 3235 3278 3322 N
+ M M AE e n/a 23 3235 3278 3325 N
+ M M AE s n/a 23 3235 3278 3322 N
+ M M AH b n/a 23 3235 3266 3317 N
+ M M AH e n/a 23 3235 3266 3307 N
+ M M AH i n/a 23 3235 3259 3305 N
+ M M AH s n/a 23 3235 3266 3307 N
+ M M AO b n/a 23 3235 3260 3312 N
+ M M AO e n/a 23 3235 3260 3314 N
+ M M AO s n/a 23 3235 3260 3314 N
+ M M AW b n/a 23 3235 3278 3324 N
+ M M AW e n/a 23 3235 3278 3324 N
+ M M AW s n/a 23 3235 3278 3324 N
+ M M AY b n/a 23 3235 3266 3318 N
+ M M AY e n/a 23 3235 3266 3307 N
+ M M AY s n/a 23 3235 3266 3307 N
+ M M B b n/a 23 3235 3289 3337 N
+ M M B e n/a 23 3235 3289 3337 N
+ M M B s n/a 23 3235 3289 3337 N
+ M M CH e n/a 23 3235 3285 3343 N
+ M M CH s n/a 23 3235 3286 3343 N
+ M M D b n/a 23 3235 3292 3335 N
+ M M D e n/a 23 3235 3292 3335 N
+ M M D s n/a 23 3235 3292 3335 N
+ M M DH e n/a 23 3235 3294 3336 N
+ M M DH s n/a 23 3235 3294 3336 N
+ M M EH b n/a 23 3235 3278 3321 N
+ M M EH e n/a 23 3235 3278 3325 N
+ M M EH i n/a 23 3235 3278 3321 N
+ M M EH s n/a 23 3235 3278 3321 N
+ M M ER b n/a 23 3235 3267 3311 N
+ M M ER e n/a 23 3235 3267 3311 N
+ M M ER s n/a 23 3235 3267 3311 N
+ M M EY b n/a 23 3235 3278 3330 N
+ M M EY e n/a 23 3235 3278 3330 N
+ M M EY i n/a 23 3235 3278 3330 N
+ M M EY s n/a 23 3235 3278 3330 N
+ M M F b n/a 23 3235 3284 3342 N
+ M M F e n/a 23 3235 3284 3342 N
+ M M F s n/a 23 3235 3284 3342 N
+ M M G b n/a 23 3235 3292 3335 N
+ M M G e n/a 23 3235 3292 3335 N
+ M M G s n/a 23 3235 3292 3335 N
+ M M HH b n/a 23 3235 3288 3344 N
+ M M HH e n/a 23 3235 3288 3344 N
+ M M HH s n/a 23 3235 3288 3344 N
+ M M IH b n/a 23 3235 3279 3329 N
+ M M IH e n/a 23 3235 3279 3329 N
+ M M IH s n/a 23 3235 3279 3329 N
+ M M IY b n/a 23 3235 3279 3320 N
+ M M IY e n/a 23 3235 3279 3320 N
+ M M IY s n/a 23 3235 3279 3320 N
+ M M JH b n/a 23 3235 3292 3335 N
+ M M JH e n/a 23 3235 3292 3335 N
+ M M JH s n/a 23 3235 3292 3335 N
+ M M K b n/a 23 3235 3286 3343 N
+ M M K e n/a 23 3235 3284 3343 N
+ M M K s n/a 23 3235 3286 3343 N
+ M M L b n/a 23 3235 3299 3331 N
+ M M L e n/a 23 3235 3299 3331 N
+ M M L s n/a 23 3235 3299 3331 N
+ M M M e n/a 23 3235 3288 3333 N
+ M M M i n/a 23 3235 3290 3333 N
+ M M M s n/a 23 3235 3288 3333 N
+ M M N b n/a 23 3235 3292 3333 N
+ M M N e n/a 23 3235 3292 3333 N
+ M M N s n/a 23 3235 3292 3333 N
+ M M NG b n/a 23 3235 3292 3333 N
+ M M NG e n/a 23 3235 3292 3333 N
+ M M NG s n/a 23 3235 3292 3333 N
+ M M OW b n/a 23 3235 3266 3313 N
+ M M OW e n/a 23 3235 3266 3314 N
+ M M OW s n/a 23 3235 3266 3313 N
+ M M OY b n/a 23 3235 3266 3312 N
+ M M OY e n/a 23 3235 3266 3307 N
+ M M OY s n/a 23 3235 3266 3307 N
+ M M P b n/a 23 3235 3284 3342 N
+ M M P e n/a 23 3235 3284 3342 N
+ M M P s n/a 23 3235 3284 3342 N
+ M M R b n/a 23 3235 3299 3331 N
+ M M R e n/a 23 3235 3299 3331 N
+ M M R s n/a 23 3235 3299 3331 N
+ M M S e n/a 23 3235 3287 3340 N
+ M M S s n/a 23 3235 3287 3340 N
+ M M SH e n/a 23 3235 3287 3340 N
+ M M SH s n/a 23 3235 3287 3340 N
+ M M SIL e n/a 23 3235 3303 3345 N
+ M M SIL s n/a 23 3235 3303 3345 N
+ M M T b n/a 23 3235 3286 3343 N
+ M M T e n/a 23 3235 3285 3343 N
+ M M T s n/a 23 3235 3286 3343 N
+ M M TH e n/a 23 3235 3285 3342 N
+ M M TH s n/a 23 3235 3286 3342 N
+ M M UH b n/a 23 3235 3266 3312 N
+ M M UH e n/a 23 3235 3266 3316 N
+ M M UH s n/a 23 3235 3266 3316 N
+ M M UW b n/a 23 3235 3261 3316 N
+ M M UW e n/a 23 3235 3261 3316 N
+ M M UW s n/a 23 3235 3261 3316 N
+ M M V b n/a 23 3235 3294 3337 N
+ M M V e n/a 23 3235 3294 3337 N
+ M M V s n/a 23 3235 3294 3337 N
+ M M W b n/a 23 3235 3298 3332 N
+ M M W e n/a 23 3235 3298 3332 N
+ M M W s n/a 23 3235 3298 3332 N
+ M M Y b n/a 23 3235 3297 3334 N
+ M M Y e n/a 23 3235 3297 3334 N
+ M M Y s n/a 23 3235 3297 3334 N
+ M M Z b n/a 23 3235 3294 3339 N
+ M M Z e n/a 23 3235 3294 3339 N
+ M M Z s n/a 23 3235 3294 3339 N
+ M M ZH e n/a 23 3235 3294 3339 N
+ M M ZH s n/a 23 3235 3294 3339 N
+ M N AA b n/a 23 3236 3266 3315 N
+ M N AA i n/a 23 3236 3266 3315 N
+ M N AA s n/a 23 3236 3266 3315 N
+ M N AE b n/a 23 3237 3278 3322 N
+ M N AE i n/a 23 3237 3278 3322 N
+ M N AE s n/a 23 3237 3278 3322 N
+ M N AH b n/a 23 3236 3266 3317 N
+ M N AH i n/a 23 3237 3259 3305 N
+ M N AH s n/a 23 3237 3266 3307 N
+ M N AO b n/a 23 3236 3260 3312 N
+ M N AO i n/a 23 3236 3260 3312 N
+ M N AO s n/a 23 3236 3260 3314 N
+ M N AW b n/a 23 3237 3278 3324 N
+ M N AW i n/a 23 3237 3278 3324 N
+ M N AW s n/a 23 3237 3278 3324 N
+ M N AY b n/a 23 3236 3266 3318 N
+ M N AY i n/a 23 3236 3266 3318 N
+ M N AY s n/a 23 3236 3266 3307 N
+ M N B b n/a 23 3237 3289 3337 N
+ M N B s n/a 23 3237 3289 3337 N
+ M N CH s n/a 23 3237 3286 3343 N
+ M N D b n/a 23 3237 3292 3335 N
+ M N D s n/a 23 3237 3292 3335 N
+ M N DH s n/a 23 3237 3294 3336 N
+ M N EH b n/a 23 3237 3278 3321 N
+ M N EH i n/a 23 3237 3278 3321 N
+ M N EH s n/a 23 3237 3278 3321 N
+ M N ER b n/a 23 3236 3267 3311 N
+ M N ER i n/a 23 3236 3267 3311 N
+ M N ER s n/a 23 3236 3267 3311 N
+ M N EY b n/a 23 3237 3278 3330 N
+ M N EY i n/a 23 3237 3278 3330 N
+ M N EY s n/a 23 3237 3278 3330 N
+ M N F b n/a 23 3237 3284 3342 N
+ M N F s n/a 23 3237 3284 3342 N
+ M N G b n/a 23 3237 3292 3335 N
+ M N G s n/a 23 3237 3292 3335 N
+ M N HH b n/a 23 3237 3288 3344 N
+ M N HH i n/a 23 3237 3282 3344 N
+ M N HH s n/a 23 3237 3288 3344 N
+ M N IH b n/a 23 3237 3278 3329 N
+ M N IH i n/a 23 3237 3278 3328 N
+ M N IH s n/a 23 3237 3278 3329 N
+ M N IY b n/a 23 3237 3279 3320 N
+ M N IY i n/a 23 3237 3279 3320 N
+ M N IY s n/a 23 3237 3279 3320 N
+ M N JH b n/a 23 3237 3292 3335 N
+ M N JH s n/a 23 3237 3292 3335 N
+ M N K b n/a 23 3237 3286 3343 N
+ M N K s n/a 23 3237 3286 3343 N
+ M N L b n/a 23 3236 3299 3331 N
+ M N L s n/a 23 3236 3299 3331 N
+ M N M s n/a 23 3237 3288 3333 N
+ M N N b n/a 23 3237 3292 3333 N
+ M N N s n/a 23 3237 3292 3333 N
+ M N NG b n/a 23 3237 3292 3333 N
+ M N NG s n/a 23 3237 3292 3333 N
+ M N OW b n/a 23 3236 3266 3313 N
+ M N OW i n/a 23 3236 3266 3313 N
+ M N OW s n/a 23 3236 3266 3313 N
+ M N OY b n/a 23 3236 3266 3312 N
+ M N OY i n/a 23 3236 3266 3312 N
+ M N OY s n/a 23 3236 3266 3307 N
+ M N P b n/a 23 3237 3284 3342 N
+ M N P s n/a 23 3237 3284 3342 N
+ M N R b n/a 23 3236 3299 3331 N
+ M N R s n/a 23 3236 3299 3331 N
+ M N S s n/a 23 3237 3287 3340 N
+ M N SH s n/a 23 3237 3287 3340 N
+ M N SIL s n/a 23 3237 3303 3345 N
+ M N T b n/a 23 3237 3286 3343 N
+ M N T s n/a 23 3237 3286 3343 N
+ M N TH s n/a 23 3237 3286 3342 N
+ M N UH b n/a 23 3236 3266 3312 N
+ M N UH i n/a 23 3236 3266 3312 N
+ M N UH s n/a 23 3236 3266 3316 N
+ M N UW b n/a 23 3236 3261 3316 N
+ M N UW i n/a 23 3236 3261 3316 N
+ M N UW s n/a 23 3236 3261 3316 N
+ M N V b n/a 23 3237 3294 3337 N
+ M N V s n/a 23 3237 3294 3337 N
+ M N W b n/a 23 3236 3298 3332 N
+ M N W s n/a 23 3236 3298 3332 N
+ M N Y b n/a 23 3237 3297 3334 N
+ M N Y i n/a 23 3237 3297 3334 N
+ M N Y s n/a 23 3237 3297 3334 N
+ M N Z b n/a 23 3237 3294 3339 N
+ M N Z s n/a 23 3237 3294 3339 N
+ M N ZH s n/a 23 3237 3294 3339 N
+ M NG AA b n/a 23 3235 3266 3315 N
+ M NG AA i n/a 23 3235 3266 3315 N
+ M NG AA s n/a 23 3235 3266 3315 N
+ M NG AE b n/a 23 3235 3278 3322 N
+ M NG AE i n/a 23 3235 3278 3322 N
+ M NG AE s n/a 23 3235 3278 3322 N
+ M NG AH b n/a 23 3235 3266 3317 N
+ M NG AH i n/a 23 3235 3259 3305 N
+ M NG AH s n/a 23 3235 3266 3307 N
+ M NG AO b n/a 23 3235 3260 3312 N
+ M NG AO i n/a 23 3235 3260 3312 N
+ M NG AO s n/a 23 3235 3260 3314 N
+ M NG AW b n/a 23 3235 3278 3324 N
+ M NG AW s n/a 23 3235 3278 3324 N
+ M NG AY b n/a 23 3235 3266 3318 N
+ M NG AY i n/a 23 3235 3266 3318 N
+ M NG AY s n/a 23 3235 3266 3307 N
+ M NG B b n/a 23 3235 3289 3337 N
+ M NG B s n/a 23 3235 3289 3337 N
+ M NG CH s n/a 23 3235 3286 3343 N
+ M NG D b n/a 23 3235 3292 3335 N
+ M NG D s n/a 23 3235 3292 3335 N
+ M NG DH s n/a 23 3235 3294 3336 N
+ M NG EH b n/a 23 3235 3278 3321 N
+ M NG EH i n/a 23 3235 3278 3321 N
+ M NG EH s n/a 23 3235 3278 3321 N
+ M NG ER b n/a 23 3235 3267 3311 N
+ M NG ER s n/a 23 3235 3267 3311 N
+ M NG EY b n/a 23 3235 3278 3330 N
+ M NG EY i n/a 23 3235 3278 3330 N
+ M NG EY s n/a 23 3235 3278 3330 N
+ M NG F b n/a 23 3235 3284 3342 N
+ M NG F s n/a 23 3235 3284 3342 N
+ M NG G b n/a 23 3235 3292 3335 N
+ M NG G s n/a 23 3235 3292 3335 N
+ M NG HH b n/a 23 3235 3288 3344 N
+ M NG HH s n/a 23 3235 3288 3344 N
+ M NG IH b n/a 23 3235 3279 3329 N
+ M NG IH i n/a 23 3235 3279 3328 N
+ M NG IH s n/a 23 3235 3279 3329 N
+ M NG IY b n/a 23 3235 3279 3320 N
+ M NG IY i n/a 23 3235 3279 3320 N
+ M NG IY s n/a 23 3235 3279 3320 N
+ M NG JH b n/a 23 3235 3292 3335 N
+ M NG JH s n/a 23 3235 3292 3335 N
+ M NG K b n/a 23 3235 3286 3343 N
+ M NG K s n/a 23 3235 3286 3343 N
+ M NG L b n/a 23 3235 3299 3331 N
+ M NG L s n/a 23 3235 3299 3331 N
+ M NG M s n/a 23 3235 3288 3333 N
+ M NG N b n/a 23 3235 3292 3333 N
+ M NG N s n/a 23 3235 3292 3333 N
+ M NG NG b n/a 23 3235 3292 3333 N
+ M NG NG s n/a 23 3235 3292 3333 N
+ M NG OW b n/a 23 3235 3266 3313 N
+ M NG OW s n/a 23 3235 3266 3313 N
+ M NG OY b n/a 23 3235 3266 3312 N
+ M NG OY s n/a 23 3235 3266 3307 N
+ M NG P b n/a 23 3235 3284 3342 N
+ M NG P s n/a 23 3235 3284 3342 N
+ M NG R b n/a 23 3235 3299 3331 N
+ M NG R s n/a 23 3235 3299 3331 N
+ M NG S s n/a 23 3235 3287 3340 N
+ M NG SH s n/a 23 3235 3287 3340 N
+ M NG SIL s n/a 23 3235 3303 3345 N
+ M NG T b n/a 23 3235 3286 3343 N
+ M NG T s n/a 23 3235 3286 3343 N
+ M NG TH s n/a 23 3235 3286 3342 N
+ M NG UH b n/a 23 3235 3266 3312 N
+ M NG UH s n/a 23 3235 3266 3316 N
+ M NG UW b n/a 23 3235 3261 3316 N
+ M NG UW s n/a 23 3235 3261 3316 N
+ M NG V b n/a 23 3235 3294 3337 N
+ M NG V s n/a 23 3235 3294 3337 N
+ M NG W b n/a 23 3235 3298 3332 N
+ M NG W s n/a 23 3235 3298 3332 N
+ M NG Y b n/a 23 3235 3297 3334 N
+ M NG Y s n/a 23 3235 3297 3334 N
+ M NG Z b n/a 23 3235 3294 3339 N
+ M NG Z s n/a 23 3235 3294 3339 N
+ M NG ZH s n/a 23 3235 3294 3339 N
+ M OW AA b n/a 23 3206 3252 3315 N
+ M OW AA e n/a 23 3206 3252 3314 N
+ M OW AA i n/a 23 3206 3252 3315 N
+ M OW AA s n/a 23 3206 3252 3315 N
+ M OW AE b n/a 23 3207 3270 3322 N
+ M OW AE e n/a 23 3207 3270 3325 N
+ M OW AE i n/a 23 3207 3270 3322 N
+ M OW AE s n/a 23 3207 3270 3322 N
+ M OW AH b n/a 23 3206 3252 3317 N
+ M OW AH e n/a 23 3205 3242 3307 N
+ M OW AH i n/a 23 3205 3242 3304 N
+ M OW AH s n/a 23 3205 3242 3307 N
+ M OW AO b n/a 23 3206 3251 3312 N
+ M OW AO e n/a 23 3206 3251 3314 N
+ M OW AO i n/a 23 3206 3252 3312 N
+ M OW AO s n/a 23 3206 3251 3314 N
+ M OW AW b n/a 23 3207 3270 3324 N
+ M OW AW e n/a 23 3207 3270 3324 N
+ M OW AW s n/a 23 3207 3270 3324 N
+ M OW AY b n/a 23 3206 3252 3318 N
+ M OW AY e n/a 23 3206 3252 3307 N
+ M OW AY i n/a 23 3206 3252 3318 N
+ M OW AY s n/a 23 3206 3252 3307 N
+ M OW B b n/a 23 3205 3289 3337 N
+ M OW B e n/a 23 3205 3289 3337 N
+ M OW B i n/a 23 3205 3291 3338 N
+ M OW B s n/a 23 3205 3289 3337 N
+ M OW CH e n/a 23 3205 3285 3343 N
+ M OW CH s n/a 23 3205 3286 3343 N
+ M OW D b n/a 23 3205 3292 3335 N
+ M OW D e n/a 23 3205 3292 3335 N
+ M OW D i n/a 23 3205 3292 3335 N
+ M OW D s n/a 23 3205 3292 3335 N
+ M OW DH e n/a 23 3205 3294 3336 N
+ M OW DH s n/a 23 3205 3294 3336 N
+ M OW EH b n/a 23 3207 3270 3323 N
+ M OW EH e n/a 23 3207 3270 3325 N
+ M OW EH i n/a 23 3207 3270 3323 N
+ M OW EH s n/a 23 3207 3270 3323 N
+ M OW ER b n/a 23 3206 3252 3311 N
+ M OW ER e n/a 23 3205 3246 3311 N
+ M OW ER i n/a 23 3205 3246 3311 N
+ M OW ER s n/a 23 3205 3246 3311 N
+ M OW EY b n/a 23 3207 3270 3330 N
+ M OW EY e n/a 23 3207 3270 3330 N
+ M OW EY i n/a 23 3207 3270 3330 N
+ M OW EY s n/a 23 3207 3270 3330 N
+ M OW F b n/a 23 3205 3284 3342 N
+ M OW F e n/a 23 3205 3284 3342 N
+ M OW F i n/a 23 3205 3281 3342 N
+ M OW F s n/a 23 3205 3284 3342 N
+ M OW G b n/a 23 3205 3292 3335 N
+ M OW G e n/a 23 3205 3292 3335 N
+ M OW G i n/a 23 3205 3292 3335 N
+ M OW G s n/a 23 3205 3292 3335 N
+ M OW HH b n/a 23 3205 3288 3344 N
+ M OW HH e n/a 23 3205 3288 3344 N
+ M OW HH s n/a 23 3205 3288 3344 N
+ M OW IH b n/a 23 3206 3270 3329 N
+ M OW IH e n/a 23 3205 3270 3326 N
+ M OW IH i n/a 23 3205 3270 3327 N
+ M OW IH s n/a 23 3205 3270 3326 N
+ M OW IY b n/a 23 3207 3270 3319 N
+ M OW IY e n/a 23 3207 3270 3319 N
+ M OW IY i n/a 23 3207 3270 3319 N
+ M OW IY s n/a 23 3207 3270 3319 N
+ M OW JH b n/a 23 3205 3292 3335 N
+ M OW JH e n/a 23 3205 3292 3335 N
+ M OW JH s n/a 23 3205 3292 3335 N
+ M OW K b n/a 23 3205 3286 3343 N
+ M OW K e n/a 23 3205 3284 3343 N
+ M OW K i n/a 23 3205 3281 3343 N
+ M OW K s n/a 23 3205 3286 3343 N
+ M OW L b n/a 23 3205 3299 3331 N
+ M OW L e n/a 23 3205 3299 3331 N
+ M OW L i n/a 23 3205 3299 3331 N
+ M OW L s n/a 23 3205 3299 3331 N
+ M OW M e n/a 23 3205 3288 3333 N
+ M OW M i n/a 23 3205 3291 3333 N
+ M OW M s n/a 23 3205 3288 3333 N
+ M OW N b n/a 23 3205 3292 3333 N
+ M OW N e n/a 23 3205 3292 3333 N
+ M OW N i n/a 23 3205 3292 3333 N
+ M OW N s n/a 23 3205 3292 3333 N
+ M OW NG b n/a 23 3205 3292 3333 N
+ M OW NG e n/a 23 3205 3292 3333 N
+ M OW NG s n/a 23 3205 3292 3333 N
+ M OW OW b n/a 23 3206 3252 3313 N
+ M OW OW e n/a 23 3206 3252 3314 N
+ M OW OW i n/a 23 3206 3252 3313 N
+ M OW OW s n/a 23 3206 3252 3313 N
+ M OW OY b n/a 23 3206 3252 3312 N
+ M OW OY e n/a 23 3206 3252 3307 N
+ M OW OY s n/a 23 3206 3252 3307 N
+ M OW P b n/a 23 3205 3284 3342 N
+ M OW P e n/a 23 3205 3284 3342 N
+ M OW P i n/a 23 3205 3281 3342 N
+ M OW P s n/a 23 3205 3284 3342 N
+ M OW R b n/a 23 3205 3299 3331 N
+ M OW R e n/a 23 3205 3299 3331 N
+ M OW R i n/a 23 3205 3299 3331 N
+ M OW R s n/a 23 3205 3299 3331 N
+ M OW S e n/a 23 3205 3287 3340 N
+ M OW S i n/a 23 3205 3287 3340 N
+ M OW S s n/a 23 3205 3287 3340 N
+ M OW SH e n/a 23 3205 3287 3340 N
+ M OW SH s n/a 23 3205 3287 3340 N
+ M OW SIL e n/a 23 3205 3300 3346 N
+ M OW SIL s n/a 23 3205 3300 3346 N
+ M OW T b n/a 23 3205 3286 3343 N
+ M OW T e n/a 23 3205 3285 3343 N
+ M OW T i n/a 23 3205 3286 3343 N
+ M OW T s n/a 23 3205 3286 3343 N
+ M OW TH e n/a 23 3205 3285 3342 N
+ M OW TH s n/a 23 3205 3286 3342 N
+ M OW UH b n/a 23 3206 3252 3312 N
+ M OW UH e n/a 23 3206 3252 3316 N
+ M OW UH i n/a 23 3206 3252 3312 N
+ M OW UH s n/a 23 3206 3252 3316 N
+ M OW UW b n/a 23 3206 3252 3316 N
+ M OW UW e n/a 23 3206 3252 3316 N
+ M OW UW i n/a 23 3206 3252 3316 N
+ M OW UW s n/a 23 3206 3252 3316 N
+ M OW V b n/a 23 3205 3294 3337 N
+ M OW V e n/a 23 3205 3294 3337 N
+ M OW V i n/a 23 3205 3294 3338 N
+ M OW V s n/a 23 3205 3294 3337 N
+ M OW W b n/a 23 3205 3298 3332 N
+ M OW W e n/a 23 3205 3298 3332 N
+ M OW W i n/a 23 3205 3298 3332 N
+ M OW W s n/a 23 3205 3298 3332 N
+ M OW Y b n/a 23 3205 3297 3334 N
+ M OW Y e n/a 23 3205 3297 3334 N
+ M OW Y i n/a 23 3205 3297 3334 N
+ M OW Y s n/a 23 3205 3297 3334 N
+ M OW Z b n/a 23 3205 3294 3339 N
+ M OW Z e n/a 23 3205 3294 3339 N
+ M OW Z i n/a 23 3205 3294 3339 N
+ M OW Z s n/a 23 3205 3294 3339 N
+ M OW ZH e n/a 23 3205 3294 3339 N
+ M OW ZH s n/a 23 3205 3294 3339 N
+ M OY AA b n/a 23 3226 3258 3315 N
+ M OY AA e n/a 23 3226 3258 3314 N
+ M OY AA s n/a 23 3226 3258 3315 N
+ M OY AE b n/a 23 3226 3273 3322 N
+ M OY AE e n/a 23 3226 3269 3325 N
+ M OY AE s n/a 23 3226 3273 3322 N
+ M OY AH b n/a 23 3226 3258 3317 N
+ M OY AH e n/a 23 3226 3247 3307 N
+ M OY AH i n/a 23 3226 3248 3306 N
+ M OY AH s n/a 23 3226 3247 3307 N
+ M OY AO b n/a 23 3226 3253 3312 N
+ M OY AO e n/a 23 3226 3253 3314 N
+ M OY AO s n/a 23 3226 3253 3314 N
+ M OY AW b n/a 23 3226 3273 3324 N
+ M OY AW e n/a 23 3226 3269 3324 N
+ M OY AW s n/a 23 3226 3273 3324 N
+ M OY AY b n/a 23 3226 3258 3318 N
+ M OY AY e n/a 23 3226 3258 3307 N
+ M OY AY s n/a 23 3226 3258 3307 N
+ M OY B b n/a 23 3227 3289 3337 N
+ M OY B e n/a 23 3227 3289 3337 N
+ M OY B s n/a 23 3227 3289 3337 N
+ M OY CH e n/a 23 3227 3286 3343 N
+ M OY CH s n/a 23 3227 3286 3343 N
+ M OY D b n/a 23 3227 3296 3335 N
+ M OY D e n/a 23 3227 3296 3335 N
+ M OY D s n/a 23 3227 3296 3335 N
+ M OY DH e n/a 23 3227 3296 3336 N
+ M OY DH s n/a 23 3227 3296 3336 N
+ M OY EH b n/a 23 3226 3273 3321 N
+ M OY EH e n/a 23 3226 3269 3325 N
+ M OY EH s n/a 23 3226 3273 3321 N
+ M OY ER b n/a 23 3226 3258 3311 N
+ M OY ER e n/a 23 3226 3249 3311 N
+ M OY ER s n/a 23 3226 3249 3311 N
+ M OY EY b n/a 23 3226 3273 3330 N
+ M OY EY e n/a 23 3226 3269 3330 N
+ M OY EY i n/a 23 3226 3273 3330 N
+ M OY EY s n/a 23 3226 3273 3330 N
+ M OY F b n/a 23 3227 3284 3341 N
+ M OY F e n/a 23 3227 3284 3341 N
+ M OY F s n/a 23 3227 3284 3341 N
+ M OY G b n/a 23 3227 3296 3335 N
+ M OY G e n/a 23 3227 3296 3335 N
+ M OY G s n/a 23 3227 3296 3335 N
+ M OY HH b n/a 23 3227 3288 3344 N
+ M OY HH e n/a 23 3227 3288 3344 N
+ M OY HH s n/a 23 3227 3288 3344 N
+ M OY IH b n/a 23 3226 3274 3329 N
+ M OY IH e n/a 23 3226 3269 3327 N
+ M OY IH s n/a 23 3226 3269 3327 N
+ M OY IY b n/a 23 3226 3274 3319 N
+ M OY IY e n/a 23 3226 3269 3319 N
+ M OY IY s n/a 23 3226 3269 3319 N
+ M OY JH b n/a 23 3227 3296 3335 N
+ M OY JH e n/a 23 3227 3296 3335 N
+ M OY JH s n/a 23 3227 3296 3335 N
+ M OY K b n/a 23 3227 3286 3343 N
+ M OY K e n/a 23 3227 3286 3343 N
+ M OY K s n/a 23 3227 3286 3343 N
+ M OY L b n/a 23 3226 3299 3331 N
+ M OY L e n/a 23 3226 3299 3331 N
+ M OY L s n/a 23 3226 3299 3331 N
+ M OY M e n/a 23 3227 3289 3333 N
+ M OY M s n/a 23 3227 3289 3333 N
+ M OY N b n/a 23 3227 3296 3333 N
+ M OY N e n/a 23 3227 3296 3333 N
+ M OY N s n/a 23 3227 3296 3333 N
+ M OY NG b n/a 23 3227 3296 3333 N
+ M OY NG e n/a 23 3227 3296 3333 N
+ M OY NG s n/a 23 3227 3296 3333 N
+ M OY OW b n/a 23 3226 3258 3313 N
+ M OY OW e n/a 23 3226 3258 3314 N
+ M OY OW s n/a 23 3226 3258 3313 N
+ M OY OY b n/a 23 3226 3258 3312 N
+ M OY OY e n/a 23 3226 3258 3307 N
+ M OY OY s n/a 23 3226 3258 3307 N
+ M OY P b n/a 23 3227 3284 3341 N
+ M OY P e n/a 23 3227 3284 3341 N
+ M OY P s n/a 23 3227 3284 3341 N
+ M OY R b n/a 23 3226 3299 3331 N
+ M OY R e n/a 23 3226 3299 3331 N
+ M OY R s n/a 23 3226 3299 3331 N
+ M OY S e n/a 23 3227 3287 3340 N
+ M OY S s n/a 23 3227 3287 3340 N
+ M OY SH e n/a 23 3227 3287 3340 N
+ M OY SH s n/a 23 3227 3287 3340 N
+ M OY SIL e n/a 23 3227 3302 3346 N
+ M OY SIL s n/a 23 3227 3302 3346 N
+ M OY T b n/a 23 3227 3286 3343 N
+ M OY T e n/a 23 3227 3286 3343 N
+ M OY T s n/a 23 3227 3286 3343 N
+ M OY TH e n/a 23 3227 3286 3341 N
+ M OY TH s n/a 23 3227 3286 3341 N
+ M OY UH b n/a 23 3226 3257 3312 N
+ M OY UH e n/a 23 3226 3257 3316 N
+ M OY UH s n/a 23 3226 3257 3316 N
+ M OY UW b n/a 23 3226 3257 3316 N
+ M OY UW e n/a 23 3226 3257 3316 N
+ M OY UW s n/a 23 3226 3257 3316 N
+ M OY V b n/a 23 3227 3296 3337 N
+ M OY V e n/a 23 3227 3296 3337 N
+ M OY V s n/a 23 3227 3296 3337 N
+ M OY W b n/a 23 3227 3298 3332 N
+ M OY W e n/a 23 3227 3298 3332 N
+ M OY W s n/a 23 3227 3298 3332 N
+ M OY Y b n/a 23 3226 3297 3334 N
+ M OY Y e n/a 23 3226 3297 3334 N
+ M OY Y i n/a 23 3226 3297 3334 N
+ M OY Y s n/a 23 3226 3297 3334 N
+ M OY Z b n/a 23 3227 3296 3339 N
+ M OY Z e n/a 23 3227 3296 3339 N
+ M OY Z i n/a 23 3227 3296 3339 N
+ M OY Z s n/a 23 3227 3296 3339 N
+ M OY ZH e n/a 23 3227 3296 3339 N
+ M OY ZH s n/a 23 3227 3296 3339 N
+ M P AA b n/a 23 3231 3264 3315 N
+ M P AA e n/a 23 3231 3264 3314 N
+ M P AA i n/a 23 3231 3264 3315 N
+ M P AA s n/a 23 3231 3264 3315 N
+ M P AE b n/a 23 3234 3276 3322 N
+ M P AE e n/a 23 3234 3276 3325 N
+ M P AE i n/a 23 3234 3276 3322 N
+ M P AE s n/a 23 3234 3276 3322 N
+ M P AH b n/a 23 3234 3264 3317 N
+ M P AH e n/a 23 3234 3264 3307 N
+ M P AH i n/a 23 3234 3259 3305 N
+ M P AH s n/a 23 3234 3264 3307 N
+ M P AO b n/a 23 3231 3260 3312 N
+ M P AO e n/a 23 3231 3260 3314 N
+ M P AO s n/a 23 3231 3260 3314 N
+ M P AW b n/a 23 3234 3276 3324 N
+ M P AW e n/a 23 3234 3276 3324 N
+ M P AW i n/a 23 3234 3276 3324 N
+ M P AW s n/a 23 3234 3276 3324 N
+ M P AY b n/a 23 3231 3265 3318 N
+ M P AY e n/a 23 3231 3265 3307 N
+ M P AY i n/a 23 3231 3265 3318 N
+ M P AY s n/a 23 3231 3265 3307 N
+ M P B b n/a 23 3234 3289 3337 N
+ M P B e n/a 23 3234 3289 3337 N
+ M P B s n/a 23 3234 3289 3337 N
+ M P CH e n/a 23 3234 3285 3343 N
+ M P CH s n/a 23 3234 3286 3343 N
+ M P D b n/a 23 3234 3292 3335 N
+ M P D e n/a 23 3234 3292 3335 N
+ M P D s n/a 23 3234 3292 3335 N
+ M P DH e n/a 23 3234 3294 3336 N
+ M P DH s n/a 23 3234 3294 3336 N
+ M P EH b n/a 23 3234 3276 3321 N
+ M P EH e n/a 23 3234 3276 3325 N
+ M P EH i n/a 23 3234 3276 3321 N
+ M P EH s n/a 23 3234 3276 3321 N
+ M P ER b n/a 23 3231 3267 3311 N
+ M P ER e n/a 23 3231 3267 3311 N
+ M P ER s n/a 23 3231 3267 3311 N
+ M P EY b n/a 23 3234 3276 3330 N
+ M P EY e n/a 23 3234 3276 3330 N
+ M P EY i n/a 23 3234 3276 3330 N
+ M P EY s n/a 23 3234 3276 3330 N
+ M P F b n/a 23 3234 3284 3342 N
+ M P F e n/a 23 3234 3284 3342 N
+ M P F s n/a 23 3234 3284 3342 N
+ M P G b n/a 23 3234 3292 3335 N
+ M P G e n/a 23 3234 3292 3335 N
+ M P G s n/a 23 3234 3292 3335 N
+ M P HH b n/a 23 3234 3288 3344 N
+ M P HH e n/a 23 3234 3288 3344 N
+ M P HH s n/a 23 3234 3288 3344 N
+ M P IH b n/a 23 3234 3280 3329 N
+ M P IH e n/a 23 3234 3280 3329 N
+ M P IH i n/a 23 3234 3280 3328 N
+ M P IH s n/a 23 3234 3280 3329 N
+ M P IY b n/a 23 3234 3279 3320 N
+ M P IY e n/a 23 3234 3279 3320 N
+ M P IY s n/a 23 3234 3279 3320 N
+ M P JH b n/a 23 3234 3292 3335 N
+ M P JH e n/a 23 3234 3292 3335 N
+ M P JH s n/a 23 3234 3292 3335 N
+ M P K b n/a 23 3234 3286 3343 N
+ M P K e n/a 23 3234 3284 3343 N
+ M P K s n/a 23 3234 3286 3343 N
+ M P L b n/a 23 3231 3299 3331 N
+ M P L e n/a 23 3231 3299 3331 N
+ M P L s n/a 23 3231 3299 3331 N
+ M P M e n/a 23 3234 3288 3333 N
+ M P M s n/a 23 3234 3288 3333 N
+ M P N b n/a 23 3234 3292 3333 N
+ M P N e n/a 23 3234 3292 3333 N
+ M P N s n/a 23 3234 3292 3333 N
+ M P NG b n/a 23 3234 3292 3333 N
+ M P NG e n/a 23 3234 3292 3333 N
+ M P NG s n/a 23 3234 3292 3333 N
+ M P OW b n/a 23 3231 3264 3313 N
+ M P OW e n/a 23 3231 3264 3314 N
+ M P OW i n/a 23 3231 3264 3313 N
+ M P OW s n/a 23 3231 3264 3313 N
+ M P OY b n/a 23 3231 3265 3312 N
+ M P OY e n/a 23 3231 3265 3307 N
+ M P OY s n/a 23 3231 3265 3307 N
+ M P P b n/a 23 3234 3284 3342 N
+ M P P e n/a 23 3234 3284 3342 N
+ M P P s n/a 23 3234 3284 3342 N
+ M P R b n/a 23 3231 3299 3331 N
+ M P R e n/a 23 3231 3299 3331 N
+ M P R s n/a 23 3231 3299 3331 N
+ M P S e n/a 23 3234 3287 3340 N
+ M P S s n/a 23 3234 3287 3340 N
+ M P SH e n/a 23 3234 3287 3340 N
+ M P SH s n/a 23 3234 3287 3340 N
+ M P SIL e n/a 23 3234 3302 3345 N
+ M P SIL s n/a 23 3234 3302 3345 N
+ M P T b n/a 23 3234 3286 3343 N
+ M P T e n/a 23 3234 3285 3343 N
+ M P T s n/a 23 3234 3286 3343 N
+ M P TH e n/a 23 3234 3285 3342 N
+ M P TH s n/a 23 3234 3286 3342 N
+ M P UH b n/a 23 3231 3264 3312 N
+ M P UH e n/a 23 3231 3264 3316 N
+ M P UH s n/a 23 3231 3264 3316 N
+ M P UW b n/a 23 3231 3261 3316 N
+ M P UW e n/a 23 3231 3261 3316 N
+ M P UW s n/a 23 3231 3261 3316 N
+ M P V b n/a 23 3234 3294 3337 N
+ M P V e n/a 23 3234 3294 3337 N
+ M P V s n/a 23 3234 3294 3337 N
+ M P W b n/a 23 3231 3298 3332 N
+ M P W e n/a 23 3231 3298 3332 N
+ M P W s n/a 23 3231 3298 3332 N
+ M P Y b n/a 23 3234 3297 3334 N
+ M P Y e n/a 23 3234 3297 3334 N
+ M P Y s n/a 23 3234 3297 3334 N
+ M P Z b n/a 23 3234 3294 3339 N
+ M P Z e n/a 23 3234 3294 3339 N
+ M P Z i n/a 23 3234 3294 3339 N
+ M P Z s n/a 23 3234 3294 3339 N
+ M P ZH e n/a 23 3234 3294 3339 N
+ M P ZH s n/a 23 3234 3294 3339 N
+ M R AA b n/a 23 3211 3255 3315 N
+ M R AA e n/a 23 3212 3255 3314 N
+ M R AA i n/a 23 3212 3255 3315 N
+ M R AA s n/a 23 3212 3255 3315 N
+ M R AE b n/a 23 3210 3275 3322 N
+ M R AE e n/a 23 3212 3275 3325 N
+ M R AE i n/a 23 3212 3275 3322 N
+ M R AE s n/a 23 3212 3275 3322 N
+ M R AH b n/a 23 3211 3255 3317 N
+ M R AH e n/a 23 3212 3250 3307 N
+ M R AH i n/a 23 3212 3250 3309 N
+ M R AH s n/a 23 3212 3250 3307 N
+ M R AO b n/a 23 3211 3254 3312 N
+ M R AO e n/a 23 3212 3254 3314 N
+ M R AO i n/a 23 3212 3254 3312 N
+ M R AO s n/a 23 3212 3254 3314 N
+ M R AW b n/a 23 3210 3275 3324 N
+ M R AW e n/a 23 3212 3275 3324 N
+ M R AW i n/a 23 3212 3275 3324 N
+ M R AW s n/a 23 3212 3275 3324 N
+ M R AY b n/a 23 3211 3255 3318 N
+ M R AY e n/a 23 3212 3255 3307 N
+ M R AY i n/a 23 3212 3255 3318 N
+ M R AY s n/a 23 3212 3255 3307 N
+ M R B b n/a 23 3210 3289 3337 N
+ M R B e n/a 23 3213 3289 3337 N
+ M R B i n/a 23 3213 3291 3338 N
+ M R B s n/a 23 3213 3289 3337 N
+ M R CH e n/a 23 3213 3285 3343 N
+ M R CH i n/a 23 3213 3281 3343 N
+ M R CH s n/a 23 3213 3286 3343 N
+ M R D b n/a 23 3210 3292 3335 N
+ M R D e n/a 23 3213 3292 3335 N
+ M R D i n/a 23 3213 3292 3335 N
+ M R D s n/a 23 3213 3292 3335 N
+ M R DH e n/a 23 3213 3293 3336 N
+ M R DH s n/a 23 3213 3293 3336 N
+ M R EH b n/a 23 3210 3275 3321 N
+ M R EH e n/a 23 3212 3275 3325 N
+ M R EH i n/a 23 3212 3275 3323 N
+ M R EH s n/a 23 3212 3275 3321 N
+ M R ER b n/a 23 3211 3255 3311 N
+ M R ER e n/a 23 3212 3249 3311 N
+ M R ER i n/a 23 3212 3249 3311 N
+ M R ER s n/a 23 3212 3249 3311 N
+ M R EY b n/a 23 3210 3275 3330 N
+ M R EY e n/a 23 3212 3275 3330 N
+ M R EY i n/a 23 3212 3275 3330 N
+ M R EY s n/a 23 3212 3275 3330 N
+ M R F b n/a 23 3210 3284 3342 N
+ M R F e n/a 23 3213 3284 3342 N
+ M R F i n/a 23 3213 3281 3342 N
+ M R F s n/a 23 3213 3284 3342 N
+ M R G b n/a 23 3210 3292 3335 N
+ M R G e n/a 23 3213 3292 3335 N
+ M R G s n/a 23 3213 3292 3335 N
+ M R HH b n/a 23 3210 3288 3344 N
+ M R HH e n/a 23 3213 3288 3344 N
+ M R HH i n/a 23 3213 3281 3344 N
+ M R HH s n/a 23 3213 3288 3344 N
+ M R IH b n/a 23 3210 3275 3329 N
+ M R IH e n/a 23 3212 3275 3327 N
+ M R IH i n/a 23 3212 3275 3327 N
+ M R IH s n/a 23 3212 3275 3327 N
+ M R IY b n/a 23 3210 3275 3319 N
+ M R IY e n/a 23 3212 3275 3319 N
+ M R IY i n/a 23 3212 3275 3319 N
+ M R IY s n/a 23 3212 3275 3319 N
+ M R JH b n/a 23 3210 3292 3335 N
+ M R JH e n/a 23 3213 3292 3335 N
+ M R JH s n/a 23 3213 3292 3335 N
+ M R K b n/a 23 3210 3286 3343 N
+ M R K e n/a 23 3213 3284 3343 N
+ M R K i n/a 23 3213 3281 3343 N
+ M R K s n/a 23 3213 3286 3343 N
+ M R L b n/a 23 3211 3299 3331 N
+ M R L e n/a 23 3212 3299 3331 N
+ M R L i n/a 23 3212 3299 3331 N
+ M R L s n/a 23 3212 3299 3331 N
+ M R M e n/a 23 3213 3288 3333 N
+ M R M s n/a 23 3213 3288 3333 N
+ M R N b n/a 23 3210 3292 3333 N
+ M R N e n/a 23 3213 3292 3333 N
+ M R N s n/a 23 3213 3292 3333 N
+ M R NG b n/a 23 3210 3292 3333 N
+ M R NG e n/a 23 3213 3292 3333 N
+ M R NG s n/a 23 3213 3292 3333 N
+ M R OW b n/a 23 3211 3255 3313 N
+ M R OW e n/a 23 3212 3255 3314 N
+ M R OW i n/a 23 3212 3255 3313 N
+ M R OW s n/a 23 3212 3255 3313 N
+ M R OY b n/a 23 3211 3255 3312 N
+ M R OY e n/a 23 3212 3255 3307 N
+ M R OY i n/a 23 3212 3255 3312 N
+ M R OY s n/a 23 3212 3255 3307 N
+ M R P b n/a 23 3210 3284 3342 N
+ M R P e n/a 23 3213 3284 3342 N
+ M R P i n/a 23 3213 3281 3342 N
+ M R P s n/a 23 3213 3284 3342 N
+ M R R b n/a 23 3211 3299 3331 N
+ M R R e n/a 23 3212 3299 3331 N
+ M R R i n/a 23 3212 3299 3331 N
+ M R R s n/a 23 3212 3299 3331 N
+ M R S e n/a 23 3213 3287 3340 N
+ M R S i n/a 23 3213 3287 3340 N
+ M R S s n/a 23 3213 3287 3340 N
+ M R SH e n/a 23 3213 3287 3340 N
+ M R SH s n/a 23 3213 3287 3340 N
+ M R SIL e n/a 23 3213 3301 3346 N
+ M R SIL s n/a 23 3213 3301 3346 N
+ M R T b n/a 23 3210 3286 3343 N
+ M R T e n/a 23 3213 3285 3343 N
+ M R T i n/a 23 3213 3286 3343 N
+ M R T s n/a 23 3213 3286 3343 N
+ M R TH e n/a 23 3213 3285 3342 N
+ M R TH i n/a 23 3213 3281 3341 N
+ M R TH s n/a 23 3213 3286 3342 N
+ M R UH b n/a 23 3211 3255 3312 N
+ M R UH e n/a 23 3212 3255 3316 N
+ M R UH i n/a 23 3212 3255 3312 N
+ M R UH s n/a 23 3212 3255 3316 N
+ M R UW b n/a 23 3211 3254 3316 N
+ M R UW e n/a 23 3212 3254 3316 N
+ M R UW i n/a 23 3212 3254 3316 N
+ M R UW s n/a 23 3212 3254 3316 N
+ M R V b n/a 23 3210 3292 3337 N
+ M R V e n/a 23 3213 3292 3337 N
+ M R V i n/a 23 3213 3292 3338 N
+ M R V s n/a 23 3213 3292 3337 N
+ M R W b n/a 23 3211 3298 3332 N
+ M R W e n/a 23 3212 3298 3332 N
+ M R W i n/a 23 3212 3298 3332 N
+ M R W s n/a 23 3212 3298 3332 N
+ M R Y b n/a 23 3210 3297 3334 N
+ M R Y e n/a 23 3212 3297 3334 N
+ M R Y i n/a 23 3212 3297 3334 N
+ M R Y s n/a 23 3212 3297 3334 N
+ M R Z b n/a 23 3210 3292 3339 N
+ M R Z e n/a 23 3213 3292 3339 N
+ M R Z i n/a 23 3213 3292 3339 N
+ M R Z s n/a 23 3213 3292 3339 N
+ M R ZH e n/a 23 3213 3292 3339 N
+ M R ZH s n/a 23 3213 3292 3339 N
+ M S AA b n/a 23 3230 3262 3315 N
+ M S AA e n/a 23 3230 3262 3314 N
+ M S AA i n/a 23 3230 3262 3315 N
+ M S AA s n/a 23 3230 3262 3315 N
+ M S AE b n/a 23 3228 3276 3322 N
+ M S AE e n/a 23 3228 3276 3325 N
+ M S AE i n/a 23 3228 3276 3322 N
+ M S AE s n/a 23 3228 3276 3322 N
+ M S AH b n/a 23 3229 3262 3317 N
+ M S AH e n/a 23 3228 3262 3307 N
+ M S AH i n/a 23 3228 3259 3305 N
+ M S AH s n/a 23 3228 3262 3307 N
+ M S AO b n/a 23 3230 3262 3312 N
+ M S AO e n/a 23 3230 3262 3315 N
+ M S AO i n/a 23 3230 3262 3315 N
+ M S AO s n/a 23 3230 3262 3315 N
+ M S AW b n/a 23 3228 3276 3324 N
+ M S AW e n/a 23 3228 3276 3324 N
+ M S AW i n/a 23 3228 3276 3324 N
+ M S AW s n/a 23 3228 3276 3324 N
+ M S AY b n/a 23 3230 3262 3318 N
+ M S AY e n/a 23 3230 3262 3307 N
+ M S AY i n/a 23 3230 3262 3318 N
+ M S AY s n/a 23 3230 3262 3307 N
+ M S B b n/a 23 3228 3289 3337 N
+ M S B e n/a 23 3228 3289 3337 N
+ M S B i n/a 23 3228 3290 3338 N
+ M S B s n/a 23 3228 3289 3337 N
+ M S CH e n/a 23 3228 3285 3343 N
+ M S CH s n/a 23 3228 3286 3343 N
+ M S D b n/a 23 3228 3292 3335 N
+ M S D e n/a 23 3228 3292 3335 N
+ M S D i n/a 23 3228 3292 3335 N
+ M S D s n/a 23 3228 3292 3335 N
+ M S DH e n/a 23 3228 3294 3336 N
+ M S DH s n/a 23 3228 3294 3336 N
+ M S EH b n/a 23 3228 3276 3321 N
+ M S EH e n/a 23 3228 3276 3325 N
+ M S EH i n/a 23 3228 3276 3321 N
+ M S EH s n/a 23 3228 3276 3321 N
+ M S ER b n/a 23 3230 3262 3311 N
+ M S ER e n/a 23 3230 3262 3311 N
+ M S ER i n/a 23 3230 3262 3311 N
+ M S ER s n/a 23 3230 3262 3311 N
+ M S EY b n/a 23 3228 3276 3330 N
+ M S EY e n/a 23 3228 3276 3330 N
+ M S EY i n/a 23 3228 3276 3330 N
+ M S EY s n/a 23 3228 3276 3330 N
+ M S F b n/a 23 3228 3284 3342 N
+ M S F e n/a 23 3228 3284 3342 N
+ M S F s n/a 23 3228 3284 3342 N
+ M S G b n/a 23 3228 3292 3335 N
+ M S G e n/a 23 3228 3292 3335 N
+ M S G s n/a 23 3228 3292 3335 N
+ M S HH b n/a 23 3228 3288 3344 N
+ M S HH e n/a 23 3228 3288 3344 N
+ M S HH s n/a 23 3228 3288 3344 N
+ M S IH b n/a 23 3228 3280 3329 N
+ M S IH e n/a 23 3228 3280 3329 N
+ M S IH i n/a 23 3228 3280 3328 N
+ M S IH s n/a 23 3228 3280 3329 N
+ M S IY b n/a 23 3228 3279 3320 N
+ M S IY e n/a 23 3228 3279 3320 N
+ M S IY i n/a 23 3228 3279 3320 N
+ M S IY s n/a 23 3228 3279 3320 N
+ M S JH b n/a 23 3228 3292 3335 N
+ M S JH e n/a 23 3228 3292 3335 N
+ M S JH s n/a 23 3228 3292 3335 N
+ M S K b n/a 23 3228 3286 3343 N
+ M S K e n/a 23 3228 3284 3343 N
+ M S K s n/a 23 3228 3286 3343 N
+ M S L b n/a 23 3230 3299 3331 N
+ M S L e n/a 23 3230 3299 3331 N
+ M S L s n/a 23 3230 3299 3331 N
+ M S M e n/a 23 3228 3288 3333 N
+ M S M s n/a 23 3228 3288 3333 N
+ M S N b n/a 23 3228 3292 3333 N
+ M S N e n/a 23 3228 3292 3333 N
+ M S N s n/a 23 3228 3292 3333 N
+ M S NG b n/a 23 3228 3292 3333 N
+ M S NG e n/a 23 3228 3292 3333 N
+ M S NG s n/a 23 3228 3292 3333 N
+ M S OW b n/a 23 3230 3262 3313 N
+ M S OW e n/a 23 3230 3262 3315 N
+ M S OW i n/a 23 3230 3262 3313 N
+ M S OW s n/a 23 3230 3262 3313 N
+ M S OY b n/a 23 3230 3262 3312 N
+ M S OY e n/a 23 3230 3262 3307 N
+ M S OY i n/a 23 3230 3262 3315 N
+ M S OY s n/a 23 3230 3262 3307 N
+ M S P b n/a 23 3228 3284 3342 N
+ M S P e n/a 23 3228 3284 3342 N
+ M S P s n/a 23 3228 3284 3342 N
+ M S R b n/a 23 3230 3299 3331 N
+ M S R e n/a 23 3230 3299 3331 N
+ M S R i n/a 23 3230 3299 3331 N
+ M S R s n/a 23 3230 3299 3331 N
+ M S S e n/a 23 3228 3287 3340 N
+ M S S s n/a 23 3228 3287 3340 N
+ M S SH e n/a 23 3228 3287 3340 N
+ M S SH s n/a 23 3228 3287 3340 N
+ M S SIL e n/a 23 3228 3302 3345 N
+ M S SIL s n/a 23 3228 3302 3345 N
+ M S T b n/a 23 3228 3286 3343 N
+ M S T e n/a 23 3228 3285 3343 N
+ M S T i n/a 23 3228 3286 3343 N
+ M S T s n/a 23 3228 3286 3343 N
+ M S TH e n/a 23 3228 3285 3342 N
+ M S TH s n/a 23 3228 3286 3342 N
+ M S UH b n/a 23 3230 3262 3312 N
+ M S UH e n/a 23 3230 3262 3316 N
+ M S UH i n/a 23 3230 3262 3316 N
+ M S UH s n/a 23 3230 3262 3316 N
+ M S UW b n/a 23 3230 3263 3316 N
+ M S UW e n/a 23 3230 3263 3316 N
+ M S UW i n/a 23 3230 3263 3316 N
+ M S UW s n/a 23 3230 3263 3316 N
+ M S V b n/a 23 3228 3294 3337 N
+ M S V e n/a 23 3228 3294 3337 N
+ M S V s n/a 23 3228 3294 3337 N
+ M S W b n/a 23 3230 3298 3332 N
+ M S W e n/a 23 3230 3298 3332 N
+ M S W s n/a 23 3230 3298 3332 N
+ M S Y b n/a 23 3228 3297 3334 N
+ M S Y e n/a 23 3228 3297 3334 N
+ M S Y i n/a 23 3228 3297 3334 N
+ M S Y s n/a 23 3228 3297 3334 N
+ M S Z b n/a 23 3228 3294 3339 N
+ M S Z e n/a 23 3228 3294 3339 N
+ M S Z s n/a 23 3228 3294 3339 N
+ M S ZH e n/a 23 3228 3294 3339 N
+ M S ZH s n/a 23 3228 3294 3339 N
+ M SH AA b n/a 23 3230 3262 3315 N
+ M SH AA i n/a 23 3230 3262 3315 N
+ M SH AA s n/a 23 3230 3262 3315 N
+ M SH AE b n/a 23 3228 3276 3322 N
+ M SH AE i n/a 23 3228 3276 3322 N
+ M SH AE s n/a 23 3228 3276 3322 N
+ M SH AH b n/a 23 3229 3262 3317 N
+ M SH AH i n/a 23 3228 3259 3305 N
+ M SH AH s n/a 23 3228 3262 3307 N
+ M SH AO b n/a 23 3230 3262 3312 N
+ M SH AO i n/a 23 3230 3262 3315 N
+ M SH AO s n/a 23 3230 3262 3315 N
+ M SH AW b n/a 23 3228 3276 3324 N
+ M SH AW i n/a 23 3228 3276 3324 N
+ M SH AW s n/a 23 3228 3276 3324 N
+ M SH AY b n/a 23 3230 3262 3318 N
+ M SH AY i n/a 23 3230 3262 3318 N
+ M SH AY s n/a 23 3230 3262 3307 N
+ M SH B b n/a 23 3228 3289 3337 N
+ M SH B s n/a 23 3228 3289 3337 N
+ M SH CH s n/a 23 3228 3286 3343 N
+ M SH D b n/a 23 3228 3292 3335 N
+ M SH D s n/a 23 3228 3292 3335 N
+ M SH DH s n/a 23 3228 3294 3336 N
+ M SH EH b n/a 23 3228 3276 3321 N
+ M SH EH i n/a 23 3228 3276 3321 N
+ M SH EH s n/a 23 3228 3276 3321 N
+ M SH ER b n/a 23 3230 3262 3311 N
+ M SH ER i n/a 23 3230 3262 3311 N
+ M SH ER s n/a 23 3230 3262 3311 N
+ M SH EY b n/a 23 3228 3276 3330 N
+ M SH EY i n/a 23 3228 3276 3330 N
+ M SH EY s n/a 23 3228 3276 3330 N
+ M SH F b n/a 23 3228 3284 3342 N
+ M SH F s n/a 23 3228 3284 3342 N
+ M SH G b n/a 23 3228 3292 3335 N
+ M SH G s n/a 23 3228 3292 3335 N
+ M SH HH b n/a 23 3228 3288 3344 N
+ M SH HH s n/a 23 3228 3288 3344 N
+ M SH IH b n/a 23 3228 3280 3329 N
+ M SH IH i n/a 23 3228 3280 3328 N
+ M SH IH s n/a 23 3228 3280 3329 N
+ M SH IY b n/a 23 3228 3279 3320 N
+ M SH IY i n/a 23 3228 3279 3320 N
+ M SH IY s n/a 23 3228 3279 3320 N
+ M SH JH b n/a 23 3228 3292 3335 N
+ M SH JH s n/a 23 3228 3292 3335 N
+ M SH K b n/a 23 3228 3286 3343 N
+ M SH K s n/a 23 3228 3286 3343 N
+ M SH L b n/a 23 3230 3299 3331 N
+ M SH L s n/a 23 3230 3299 3331 N
+ M SH M s n/a 23 3228 3288 3333 N
+ M SH N b n/a 23 3228 3292 3333 N
+ M SH N s n/a 23 3228 3292 3333 N
+ M SH NG b n/a 23 3228 3292 3333 N
+ M SH NG s n/a 23 3228 3292 3333 N
+ M SH OW b n/a 23 3230 3262 3313 N
+ M SH OW i n/a 23 3230 3262 3313 N
+ M SH OW s n/a 23 3230 3262 3313 N
+ M SH OY b n/a 23 3230 3262 3312 N
+ M SH OY i n/a 23 3230 3262 3315 N
+ M SH OY s n/a 23 3230 3262 3307 N
+ M SH P b n/a 23 3228 3284 3342 N
+ M SH P s n/a 23 3228 3284 3342 N
+ M SH R b n/a 23 3230 3299 3331 N
+ M SH R s n/a 23 3230 3299 3331 N
+ M SH S s n/a 23 3228 3287 3340 N
+ M SH SH s n/a 23 3228 3287 3340 N
+ M SH SIL s n/a 23 3228 3302 3345 N
+ M SH T b n/a 23 3228 3286 3343 N
+ M SH T s n/a 23 3228 3286 3343 N
+ M SH TH s n/a 23 3228 3286 3342 N
+ M SH UH b n/a 23 3230 3262 3312 N
+ M SH UH s n/a 23 3230 3262 3316 N
+ M SH UW b n/a 23 3230 3263 3316 N
+ M SH UW i n/a 23 3230 3263 3316 N
+ M SH UW s n/a 23 3230 3263 3316 N
+ M SH V b n/a 23 3228 3294 3337 N
+ M SH V s n/a 23 3228 3294 3337 N
+ M SH W b n/a 23 3230 3298 3332 N
+ M SH W s n/a 23 3230 3298 3332 N
+ M SH Y b n/a 23 3228 3297 3334 N
+ M SH Y i n/a 23 3228 3297 3334 N
+ M SH Y s n/a 23 3228 3297 3334 N
+ M SH Z b n/a 23 3228 3294 3339 N
+ M SH Z s n/a 23 3228 3294 3339 N
+ M SH ZH s n/a 23 3228 3294 3339 N
+ M SIL AA b n/a 23 3231 3263 3315 N
+ M SIL AA s n/a 23 3231 3263 3315 N
+ M SIL AE b n/a 23 3233 3276 3322 N
+ M SIL AE s n/a 23 3233 3276 3322 N
+ M SIL AH b n/a 23 3231 3263 3317 N
+ M SIL AH s n/a 23 3231 3263 3307 N
+ M SIL AO b n/a 23 3231 3260 3312 N
+ M SIL AO s n/a 23 3231 3260 3314 N
+ M SIL AW b n/a 23 3233 3276 3324 N
+ M SIL AW s n/a 23 3233 3276 3324 N
+ M SIL AY b n/a 23 3231 3263 3318 N
+ M SIL AY s n/a 23 3231 3263 3307 N
+ M SIL B b n/a 23 3233 3289 3337 N
+ M SIL B s n/a 23 3233 3289 3337 N
+ M SIL CH s n/a 23 3233 3286 3343 N
+ M SIL D b n/a 23 3233 3292 3335 N
+ M SIL D s n/a 23 3233 3292 3335 N
+ M SIL DH s n/a 23 3233 3294 3336 N
+ M SIL EH b n/a 23 3233 3276 3321 N
+ M SIL EH s n/a 23 3233 3276 3321 N
+ M SIL ER b n/a 23 3231 3263 3311 N
+ M SIL ER s n/a 23 3231 3263 3311 N
+ M SIL EY b n/a 23 3233 3276 3330 N
+ M SIL EY s n/a 23 3233 3276 3330 N
+ M SIL F b n/a 23 3233 3284 3342 N
+ M SIL F s n/a 23 3233 3284 3342 N
+ M SIL G b n/a 23 3233 3292 3335 N
+ M SIL G s n/a 23 3233 3292 3335 N
+ M SIL HH b n/a 23 3233 3288 3344 N
+ M SIL HH s n/a 23 3233 3288 3344 N
+ M SIL IH b n/a 23 3233 3280 3328 N
+ M SIL IH s n/a 23 3233 3280 3328 N
+ M SIL IY b n/a 23 3233 3279 3320 N
+ M SIL IY s n/a 23 3233 3279 3320 N
+ M SIL JH b n/a 23 3233 3292 3335 N
+ M SIL JH s n/a 23 3233 3292 3335 N
+ M SIL K b n/a 23 3233 3286 3343 N
+ M SIL K s n/a 23 3233 3286 3343 N
+ M SIL L b n/a 23 3231 3299 3331 N
+ M SIL L s n/a 23 3231 3299 3331 N
+ M SIL M s n/a 23 3233 3288 3333 N
+ M SIL N b n/a 23 3233 3292 3333 N
+ M SIL N s n/a 23 3233 3292 3333 N
+ M SIL NG b n/a 23 3233 3292 3333 N
+ M SIL NG s n/a 23 3233 3292 3333 N
+ M SIL OW b n/a 23 3231 3263 3313 N
+ M SIL OW s n/a 23 3231 3263 3313 N
+ M SIL OY b n/a 23 3231 3263 3312 N
+ M SIL OY s n/a 23 3231 3263 3307 N
+ M SIL P b n/a 23 3233 3284 3342 N
+ M SIL P s n/a 23 3233 3284 3342 N
+ M SIL R b n/a 23 3231 3299 3331 N
+ M SIL R s n/a 23 3231 3299 3331 N
+ M SIL S s n/a 23 3233 3287 3340 N
+ M SIL SH s n/a 23 3233 3287 3340 N
+ M SIL SIL s n/a 23 3233 3302 3345 N
+ M SIL T b n/a 23 3233 3286 3343 N
+ M SIL T s n/a 23 3233 3286 3343 N
+ M SIL TH s n/a 23 3233 3286 3342 N
+ M SIL UH b n/a 23 3231 3263 3312 N
+ M SIL UH s n/a 23 3231 3263 3316 N
+ M SIL UW b n/a 23 3231 3261 3316 N
+ M SIL UW s n/a 23 3231 3261 3316 N
+ M SIL V b n/a 23 3233 3294 3337 N
+ M SIL V s n/a 23 3233 3294 3337 N
+ M SIL W b n/a 23 3231 3298 3332 N
+ M SIL W s n/a 23 3231 3298 3332 N
+ M SIL Y b n/a 23 3233 3297 3334 N
+ M SIL Y s n/a 23 3233 3297 3334 N
+ M SIL Z b n/a 23 3233 3294 3339 N
+ M SIL Z s n/a 23 3233 3294 3339 N
+ M SIL ZH s n/a 23 3233 3294 3339 N
+ M T AA b n/a 23 3238 3264 3315 N
+ M T AA e n/a 23 3238 3264 3314 N
+ M T AA i n/a 23 3238 3264 3315 N
+ M T AA s n/a 23 3238 3264 3315 N
+ M T AE b n/a 23 3240 3277 3322 N
+ M T AE e n/a 23 3240 3277 3325 N
+ M T AE i n/a 23 3240 3277 3322 N
+ M T AE s n/a 23 3240 3277 3322 N
+ M T AH b n/a 23 3238 3264 3317 N
+ M T AH e n/a 23 3238 3264 3307 N
+ M T AH i n/a 23 3238 3259 3305 N
+ M T AH s n/a 23 3238 3264 3307 N
+ M T AO b n/a 23 3238 3260 3312 N
+ M T AO e n/a 23 3238 3260 3314 N
+ M T AO i n/a 23 3238 3260 3312 N
+ M T AO s n/a 23 3238 3260 3314 N
+ M T AW b n/a 23 3240 3277 3324 N
+ M T AW e n/a 23 3240 3277 3324 N
+ M T AW i n/a 23 3240 3277 3324 N
+ M T AW s n/a 23 3240 3277 3324 N
+ M T AY b n/a 23 3238 3265 3318 N
+ M T AY e n/a 23 3238 3265 3307 N
+ M T AY i n/a 23 3238 3265 3318 N
+ M T AY s n/a 23 3238 3265 3307 N
+ M T B b n/a 23 3240 3289 3337 N
+ M T B e n/a 23 3240 3289 3337 N
+ M T B s n/a 23 3240 3289 3337 N
+ M T CH e n/a 23 3240 3285 3343 N
+ M T CH s n/a 23 3240 3286 3343 N
+ M T D b n/a 23 3240 3292 3335 N
+ M T D e n/a 23 3240 3292 3335 N
+ M T D s n/a 23 3240 3292 3335 N
+ M T DH e n/a 23 3240 3294 3336 N
+ M T DH s n/a 23 3240 3294 3336 N
+ M T EH b n/a 23 3240 3277 3321 N
+ M T EH e n/a 23 3240 3277 3325 N
+ M T EH i n/a 23 3240 3277 3321 N
+ M T EH s n/a 23 3240 3277 3321 N
+ M T ER b n/a 23 3238 3267 3311 N
+ M T ER e n/a 23 3238 3267 3311 N
+ M T ER i n/a 23 3238 3267 3311 N
+ M T ER s n/a 23 3238 3267 3311 N
+ M T EY b n/a 23 3240 3277 3330 N
+ M T EY e n/a 23 3240 3277 3330 N
+ M T EY i n/a 23 3240 3277 3330 N
+ M T EY s n/a 23 3240 3277 3330 N
+ M T F b n/a 23 3240 3284 3342 N
+ M T F e n/a 23 3240 3284 3342 N
+ M T F s n/a 23 3240 3284 3342 N
+ M T G b n/a 23 3240 3292 3335 N
+ M T G e n/a 23 3240 3292 3335 N
+ M T G s n/a 23 3240 3292 3335 N
+ M T HH b n/a 23 3240 3288 3344 N
+ M T HH e n/a 23 3240 3288 3344 N
+ M T HH s n/a 23 3240 3288 3344 N
+ M T IH b n/a 23 3238 3277 3329 N
+ M T IH e n/a 23 3238 3277 3329 N
+ M T IH i n/a 23 3238 3277 3328 N
+ M T IH s n/a 23 3238 3277 3329 N
+ M T IY b n/a 23 3240 3279 3320 N
+ M T IY e n/a 23 3240 3279 3320 N
+ M T IY i n/a 23 3240 3279 3320 N
+ M T IY s n/a 23 3240 3279 3320 N
+ M T JH b n/a 23 3240 3292 3335 N
+ M T JH e n/a 23 3240 3292 3335 N
+ M T JH s n/a 23 3240 3292 3335 N
+ M T K b n/a 23 3240 3286 3343 N
+ M T K e n/a 23 3240 3284 3343 N
+ M T K s n/a 23 3240 3286 3343 N
+ M T L b n/a 23 3238 3299 3331 N
+ M T L e n/a 23 3238 3299 3331 N
+ M T L s n/a 23 3238 3299 3331 N
+ M T M e n/a 23 3240 3288 3333 N
+ M T M s n/a 23 3240 3288 3333 N
+ M T N b n/a 23 3240 3292 3333 N
+ M T N e n/a 23 3240 3292 3333 N
+ M T N i n/a 23 3240 3292 3333 N
+ M T N s n/a 23 3240 3292 3333 N
+ M T NG b n/a 23 3240 3292 3333 N
+ M T NG e n/a 23 3240 3292 3333 N
+ M T NG s n/a 23 3240 3292 3333 N
+ M T OW b n/a 23 3238 3264 3313 N
+ M T OW e n/a 23 3238 3264 3314 N
+ M T OW i n/a 23 3238 3264 3313 N
+ M T OW s n/a 23 3238 3264 3313 N
+ M T OY b n/a 23 3238 3264 3312 N
+ M T OY e n/a 23 3238 3264 3307 N
+ M T OY i n/a 23 3238 3264 3312 N
+ M T OY s n/a 23 3238 3264 3307 N
+ M T P b n/a 23 3240 3284 3342 N
+ M T P e n/a 23 3240 3284 3342 N
+ M T P s n/a 23 3240 3284 3342 N
+ M T R b n/a 23 3238 3299 3331 N
+ M T R e n/a 23 3238 3299 3331 N
+ M T R s n/a 23 3238 3299 3331 N
+ M T S e n/a 23 3240 3287 3340 N
+ M T S s n/a 23 3240 3287 3340 N
+ M T SH e n/a 23 3240 3287 3340 N
+ M T SH s n/a 23 3240 3287 3340 N
+ M T SIL e n/a 23 3240 3302 3345 N
+ M T SIL s n/a 23 3240 3302 3345 N
+ M T T b n/a 23 3240 3286 3343 N
+ M T T e n/a 23 3240 3285 3343 N
+ M T T s n/a 23 3240 3286 3343 N
+ M T TH e n/a 23 3240 3285 3342 N
+ M T TH s n/a 23 3240 3286 3342 N
+ M T UH b n/a 23 3238 3264 3312 N
+ M T UH e n/a 23 3238 3264 3316 N
+ M T UH i n/a 23 3238 3264 3312 N
+ M T UH s n/a 23 3238 3264 3316 N
+ M T UW b n/a 23 3238 3261 3316 N
+ M T UW e n/a 23 3238 3261 3316 N
+ M T UW s n/a 23 3238 3261 3316 N
+ M T V b n/a 23 3240 3294 3337 N
+ M T V e n/a 23 3240 3294 3337 N
+ M T V s n/a 23 3240 3294 3337 N
+ M T W b n/a 23 3238 3298 3332 N
+ M T W e n/a 23 3238 3298 3332 N
+ M T W s n/a 23 3238 3298 3332 N
+ M T Y b n/a 23 3240 3297 3334 N
+ M T Y e n/a 23 3240 3297 3334 N
+ M T Y s n/a 23 3240 3297 3334 N
+ M T Z b n/a 23 3240 3294 3339 N
+ M T Z e n/a 23 3240 3294 3339 N
+ M T Z i n/a 23 3240 3294 3339 N
+ M T Z s n/a 23 3240 3294 3339 N
+ M T ZH e n/a 23 3240 3294 3339 N
+ M T ZH s n/a 23 3240 3294 3339 N
+ M TH AA b n/a 23 3230 3264 3315 N
+ M TH AA i n/a 23 3230 3264 3315 N
+ M TH AA s n/a 23 3230 3264 3315 N
+ M TH AE b n/a 23 3228 3276 3322 N
+ M TH AE i n/a 23 3228 3276 3322 N
+ M TH AE s n/a 23 3228 3276 3322 N
+ M TH AH b n/a 23 3229 3264 3317 N
+ M TH AH i n/a 23 3228 3259 3305 N
+ M TH AH s n/a 23 3228 3264 3307 N
+ M TH AO b n/a 23 3230 3260 3312 N
+ M TH AO i n/a 23 3230 3260 3312 N
+ M TH AO s n/a 23 3230 3260 3315 N
+ M TH AW b n/a 23 3228 3276 3324 N
+ M TH AW s n/a 23 3228 3276 3324 N
+ M TH AY b n/a 23 3230 3265 3318 N
+ M TH AY i n/a 23 3230 3265 3318 N
+ M TH AY s n/a 23 3230 3265 3307 N
+ M TH B b n/a 23 3228 3289 3337 N
+ M TH B s n/a 23 3228 3289 3337 N
+ M TH CH s n/a 23 3228 3286 3343 N
+ M TH D b n/a 23 3228 3292 3335 N
+ M TH D s n/a 23 3228 3292 3335 N
+ M TH DH s n/a 23 3228 3294 3336 N
+ M TH EH b n/a 23 3228 3276 3321 N
+ M TH EH i n/a 23 3228 3276 3321 N
+ M TH EH s n/a 23 3228 3276 3321 N
+ M TH ER b n/a 23 3230 3267 3311 N
+ M TH ER i n/a 23 3230 3267 3311 N
+ M TH ER s n/a 23 3230 3267 3311 N
+ M TH EY b n/a 23 3228 3276 3330 N
+ M TH EY s n/a 23 3228 3276 3330 N
+ M TH F b n/a 23 3228 3284 3342 N
+ M TH F s n/a 23 3228 3284 3342 N
+ M TH G b n/a 23 3228 3292 3335 N
+ M TH G s n/a 23 3228 3292 3335 N
+ M TH HH b n/a 23 3228 3288 3344 N
+ M TH HH s n/a 23 3228 3288 3344 N
+ M TH IH b n/a 23 3228 3280 3329 N
+ M TH IH i n/a 23 3228 3280 3328 N
+ M TH IH s n/a 23 3228 3280 3329 N
+ M TH IY b n/a 23 3228 3279 3320 N
+ M TH IY s n/a 23 3228 3279 3320 N
+ M TH JH b n/a 23 3228 3292 3335 N
+ M TH JH s n/a 23 3228 3292 3335 N
+ M TH K b n/a 23 3228 3286 3343 N
+ M TH K s n/a 23 3228 3286 3343 N
+ M TH L b n/a 23 3230 3299 3331 N
+ M TH L s n/a 23 3230 3299 3331 N
+ M TH M s n/a 23 3228 3288 3333 N
+ M TH N b n/a 23 3228 3292 3333 N
+ M TH N s n/a 23 3228 3292 3333 N
+ M TH NG b n/a 23 3228 3292 3333 N
+ M TH NG s n/a 23 3228 3292 3333 N
+ M TH OW b n/a 23 3230 3264 3313 N
+ M TH OW i n/a 23 3230 3264 3313 N
+ M TH OW s n/a 23 3230 3264 3313 N
+ M TH OY b n/a 23 3230 3265 3312 N
+ M TH OY s n/a 23 3230 3265 3307 N
+ M TH P b n/a 23 3228 3284 3342 N
+ M TH P s n/a 23 3228 3284 3342 N
+ M TH R b n/a 23 3230 3299 3331 N
+ M TH R s n/a 23 3230 3299 3331 N
+ M TH S s n/a 23 3228 3287 3340 N
+ M TH SH s n/a 23 3228 3287 3340 N
+ M TH SIL s n/a 23 3228 3302 3345 N
+ M TH T b n/a 23 3228 3286 3343 N
+ M TH T s n/a 23 3228 3286 3343 N
+ M TH TH s n/a 23 3228 3286 3342 N
+ M TH UH b n/a 23 3230 3264 3312 N
+ M TH UH s n/a 23 3230 3264 3316 N
+ M TH UW b n/a 23 3230 3261 3316 N
+ M TH UW i n/a 23 3230 3261 3316 N
+ M TH UW s n/a 23 3230 3261 3316 N
+ M TH V b n/a 23 3228 3294 3337 N
+ M TH V s n/a 23 3228 3294 3337 N
+ M TH W b n/a 23 3230 3298 3332 N
+ M TH W s n/a 23 3230 3298 3332 N
+ M TH Y b n/a 23 3228 3297 3334 N
+ M TH Y s n/a 23 3228 3297 3334 N
+ M TH Z b n/a 23 3228 3294 3339 N
+ M TH Z s n/a 23 3228 3294 3339 N
+ M TH ZH s n/a 23 3228 3294 3339 N
+ M UH AA b n/a 23 3206 3252 3315 N
+ M UH AA e n/a 23 3206 3252 3314 N
+ M UH AA s n/a 23 3206 3252 3315 N
+ M UH AE b n/a 23 3207 3271 3322 N
+ M UH AE e n/a 23 3207 3271 3325 N
+ M UH AE i n/a 23 3207 3271 3322 N
+ M UH AE s n/a 23 3207 3271 3322 N
+ M UH AH b n/a 23 3206 3252 3317 N
+ M UH AH e n/a 23 3206 3242 3307 N
+ M UH AH i n/a 23 3207 3243 3304 N
+ M UH AH s n/a 23 3206 3242 3307 N
+ M UH AO b n/a 23 3206 3251 3312 N
+ M UH AO e n/a 23 3206 3251 3314 N
+ M UH AO s n/a 23 3206 3251 3314 N
+ M UH AW b n/a 23 3207 3271 3324 N
+ M UH AW e n/a 23 3207 3271 3324 N
+ M UH AW s n/a 23 3207 3271 3324 N
+ M UH AY b n/a 23 3206 3252 3318 N
+ M UH AY e n/a 23 3206 3252 3307 N
+ M UH AY s n/a 23 3206 3252 3307 N
+ M UH B b n/a 23 3205 3289 3337 N
+ M UH B e n/a 23 3205 3289 3337 N
+ M UH B i n/a 23 3205 3291 3338 N
+ M UH B s n/a 23 3205 3289 3337 N
+ M UH CH e n/a 23 3205 3286 3343 N
+ M UH CH s n/a 23 3205 3286 3343 N
+ M UH D b n/a 23 3205 3292 3335 N
+ M UH D e n/a 23 3205 3292 3335 N
+ M UH D i n/a 23 3205 3292 3335 N
+ M UH D s n/a 23 3205 3292 3335 N
+ M UH DH e n/a 23 3205 3294 3336 N
+ M UH DH s n/a 23 3205 3294 3336 N
+ M UH EH b n/a 23 3207 3271 3321 N
+ M UH EH e n/a 23 3207 3271 3325 N
+ M UH EH s n/a 23 3207 3271 3321 N
+ M UH ER b n/a 23 3206 3252 3311 N
+ M UH ER e n/a 23 3206 3246 3311 N
+ M UH ER s n/a 23 3206 3246 3311 N
+ M UH EY b n/a 23 3207 3271 3330 N
+ M UH EY e n/a 23 3207 3271 3330 N
+ M UH EY s n/a 23 3207 3271 3330 N
+ M UH F b n/a 23 3205 3284 3342 N
+ M UH F e n/a 23 3205 3284 3342 N
+ M UH F s n/a 23 3205 3284 3342 N
+ M UH G b n/a 23 3205 3292 3335 N
+ M UH G e n/a 23 3205 3292 3335 N
+ M UH G s n/a 23 3205 3292 3335 N
+ M UH HH b n/a 23 3205 3288 3344 N
+ M UH HH e n/a 23 3205 3288 3344 N
+ M UH HH s n/a 23 3205 3288 3344 N
+ M UH IH b n/a 23 3206 3271 3329 N
+ M UH IH e n/a 23 3206 3271 3327 N
+ M UH IH i n/a 23 3207 3271 3326 N
+ M UH IH s n/a 23 3206 3271 3327 N
+ M UH IY b n/a 23 3207 3271 3319 N
+ M UH IY e n/a 23 3207 3271 3319 N
+ M UH IY s n/a 23 3207 3271 3319 N
+ M UH JH b n/a 23 3205 3292 3335 N
+ M UH JH e n/a 23 3205 3292 3335 N
+ M UH JH s n/a 23 3205 3292 3335 N
+ M UH K b n/a 23 3205 3286 3343 N
+ M UH K e n/a 23 3205 3284 3343 N
+ M UH K s n/a 23 3205 3286 3343 N
+ M UH L b n/a 23 3205 3299 3331 N
+ M UH L e n/a 23 3205 3299 3331 N
+ M UH L s n/a 23 3205 3299 3331 N
+ M UH M e n/a 23 3205 3288 3333 N
+ M UH M s n/a 23 3205 3288 3333 N
+ M UH N b n/a 23 3205 3292 3333 N
+ M UH N e n/a 23 3205 3292 3333 N
+ M UH N s n/a 23 3205 3292 3333 N
+ M UH NG b n/a 23 3205 3292 3333 N
+ M UH NG e n/a 23 3205 3292 3333 N
+ M UH NG s n/a 23 3205 3292 3333 N
+ M UH OW b n/a 23 3206 3252 3313 N
+ M UH OW e n/a 23 3206 3252 3314 N
+ M UH OW s n/a 23 3206 3252 3313 N
+ M UH OY b n/a 23 3206 3252 3312 N
+ M UH OY e n/a 23 3206 3252 3307 N
+ M UH OY s n/a 23 3206 3252 3307 N
+ M UH P b n/a 23 3205 3284 3342 N
+ M UH P e n/a 23 3205 3284 3342 N
+ M UH P s n/a 23 3205 3284 3342 N
+ M UH R b n/a 23 3205 3299 3331 N
+ M UH R e n/a 23 3205 3299 3331 N
+ M UH R s n/a 23 3205 3299 3331 N
+ M UH S e n/a 23 3205 3287 3340 N
+ M UH S s n/a 23 3205 3287 3340 N
+ M UH SH e n/a 23 3205 3287 3340 N
+ M UH SH s n/a 23 3205 3287 3340 N
+ M UH SIL e n/a 23 3205 3300 3346 N
+ M UH SIL s n/a 23 3205 3300 3346 N
+ M UH T b n/a 23 3205 3286 3343 N
+ M UH T e n/a 23 3205 3286 3343 N
+ M UH T s n/a 23 3205 3286 3343 N
+ M UH TH e n/a 23 3205 3286 3342 N
+ M UH TH s n/a 23 3205 3286 3342 N
+ M UH UH b n/a 23 3206 3252 3312 N
+ M UH UH e n/a 23 3206 3252 3316 N
+ M UH UH s n/a 23 3206 3252 3316 N
+ M UH UW b n/a 23 3206 3252 3316 N
+ M UH UW e n/a 23 3206 3252 3316 N
+ M UH UW s n/a 23 3206 3252 3316 N
+ M UH V b n/a 23 3205 3294 3337 N
+ M UH V e n/a 23 3205 3294 3337 N
+ M UH V s n/a 23 3205 3294 3337 N
+ M UH W b n/a 23 3205 3298 3332 N
+ M UH W e n/a 23 3205 3298 3332 N
+ M UH W s n/a 23 3205 3298 3332 N
+ M UH Y b n/a 23 3207 3297 3334 N
+ M UH Y e n/a 23 3207 3297 3334 N
+ M UH Y s n/a 23 3207 3297 3334 N
+ M UH Z b n/a 23 3205 3294 3339 N
+ M UH Z e n/a 23 3205 3294 3339 N
+ M UH Z s n/a 23 3205 3294 3339 N
+ M UH ZH e n/a 23 3205 3294 3339 N
+ M UH ZH s n/a 23 3205 3294 3339 N
+ M UW AA b n/a 23 3208 3252 3315 N
+ M UW AA e n/a 23 3209 3252 3314 N
+ M UW AA i n/a 23 3208 3252 3315 N
+ M UW AA s n/a 23 3208 3252 3315 N
+ M UW AE b n/a 23 3208 3271 3322 N
+ M UW AE e n/a 23 3209 3271 3325 N
+ M UW AE i n/a 23 3208 3271 3322 N
+ M UW AE s n/a 23 3208 3271 3322 N
+ M UW AH b n/a 23 3208 3252 3317 N
+ M UW AH e n/a 23 3209 3246 3307 N
+ M UW AH i n/a 23 3208 3243 3304 N
+ M UW AH s n/a 23 3208 3246 3307 N
+ M UW AO b n/a 23 3208 3251 3312 N
+ M UW AO e n/a 23 3209 3251 3314 N
+ M UW AO i n/a 23 3208 3252 3312 N
+ M UW AO s n/a 23 3208 3251 3314 N
+ M UW AW b n/a 23 3208 3271 3324 N
+ M UW AW e n/a 23 3209 3271 3324 N
+ M UW AW i n/a 23 3208 3271 3324 N
+ M UW AW s n/a 23 3208 3271 3324 N
+ M UW AY b n/a 23 3208 3252 3318 N
+ M UW AY e n/a 23 3209 3252 3307 N
+ M UW AY i n/a 23 3208 3252 3318 N
+ M UW AY s n/a 23 3208 3252 3307 N
+ M UW B b n/a 23 3209 3289 3337 N
+ M UW B e n/a 23 3209 3289 3337 N
+ M UW B i n/a 23 3209 3291 3338 N
+ M UW B s n/a 23 3209 3289 3337 N
+ M UW CH e n/a 23 3209 3286 3343 N
+ M UW CH s n/a 23 3209 3286 3343 N
+ M UW D b n/a 23 3209 3292 3335 N
+ M UW D e n/a 23 3209 3292 3335 N
+ M UW D i n/a 23 3209 3292 3335 N
+ M UW D s n/a 23 3209 3292 3335 N
+ M UW DH e n/a 23 3209 3294 3336 N
+ M UW DH s n/a 23 3209 3294 3336 N
+ M UW EH b n/a 23 3208 3271 3323 N
+ M UW EH e n/a 23 3209 3271 3325 N
+ M UW EH i n/a 23 3208 3271 3323 N
+ M UW EH s n/a 23 3208 3271 3323 N
+ M UW ER b n/a 23 3208 3252 3311 N
+ M UW ER e n/a 23 3209 3246 3311 N
+ M UW ER i n/a 23 3208 3246 3311 N
+ M UW ER s n/a 23 3208 3246 3311 N
+ M UW EY b n/a 23 3208 3271 3330 N
+ M UW EY e n/a 23 3209 3271 3330 N
+ M UW EY i n/a 23 3208 3271 3330 N
+ M UW EY s n/a 23 3208 3271 3330 N
+ M UW F b n/a 23 3209 3284 3342 N
+ M UW F e n/a 23 3209 3284 3342 N
+ M UW F i n/a 23 3209 3282 3342 N
+ M UW F s n/a 23 3209 3284 3342 N
+ M UW G b n/a 23 3209 3292 3335 N
+ M UW G e n/a 23 3209 3292 3335 N
+ M UW G s n/a 23 3209 3292 3335 N
+ M UW HH b n/a 23 3209 3288 3344 N
+ M UW HH e n/a 23 3209 3288 3344 N
+ M UW HH i n/a 23 3209 3282 3344 N
+ M UW HH s n/a 23 3209 3288 3344 N
+ M UW IH b n/a 23 3208 3271 3329 N
+ M UW IH e n/a 23 3209 3271 3326 N
+ M UW IH i n/a 23 3208 3271 3327 N
+ M UW IH s n/a 23 3208 3271 3326 N
+ M UW IY b n/a 23 3208 3271 3319 N
+ M UW IY e n/a 23 3209 3271 3319 N
+ M UW IY i n/a 23 3208 3271 3319 N
+ M UW IY s n/a 23 3208 3271 3319 N
+ M UW JH b n/a 23 3209 3292 3335 N
+ M UW JH e n/a 23 3209 3292 3335 N
+ M UW JH s n/a 23 3209 3292 3335 N
+ M UW K b n/a 23 3209 3286 3343 N
+ M UW K e n/a 23 3209 3284 3343 N
+ M UW K i n/a 23 3209 3282 3343 N
+ M UW K s n/a 23 3209 3286 3343 N
+ M UW L b n/a 23 3209 3299 3331 N
+ M UW L e n/a 23 3209 3299 3331 N
+ M UW L i n/a 23 3209 3299 3331 N
+ M UW L s n/a 23 3209 3299 3331 N
+ M UW M e n/a 23 3209 3288 3333 N
+ M UW M i n/a 23 3209 3291 3333 N
+ M UW M s n/a 23 3209 3288 3333 N
+ M UW N b n/a 23 3209 3292 3333 N
+ M UW N e n/a 23 3209 3292 3333 N
+ M UW N s n/a 23 3209 3292 3333 N
+ M UW NG b n/a 23 3209 3292 3333 N
+ M UW NG e n/a 23 3209 3292 3333 N
+ M UW NG s n/a 23 3209 3292 3333 N
+ M UW OW b n/a 23 3208 3252 3313 N
+ M UW OW e n/a 23 3209 3252 3314 N
+ M UW OW i n/a 23 3208 3252 3313 N
+ M UW OW s n/a 23 3208 3252 3313 N
+ M UW OY b n/a 23 3208 3252 3312 N
+ M UW OY e n/a 23 3209 3252 3307 N
+ M UW OY s n/a 23 3208 3252 3307 N
+ M UW P b n/a 23 3209 3284 3342 N
+ M UW P e n/a 23 3209 3284 3342 N
+ M UW P i n/a 23 3209 3282 3342 N
+ M UW P s n/a 23 3209 3284 3342 N
+ M UW R b n/a 23 3209 3299 3331 N
+ M UW R e n/a 23 3209 3299 3331 N
+ M UW R i n/a 23 3209 3299 3331 N
+ M UW R s n/a 23 3209 3299 3331 N
+ M UW S e n/a 23 3209 3287 3340 N
+ M UW S i n/a 23 3209 3287 3340 N
+ M UW S s n/a 23 3209 3287 3340 N
+ M UW SH e n/a 23 3209 3287 3340 N
+ M UW SH s n/a 23 3209 3287 3340 N
+ M UW SIL e n/a 23 3209 3300 3346 N
+ M UW SIL s n/a 23 3209 3300 3346 N
+ M UW T b n/a 23 3209 3286 3343 N
+ M UW T e n/a 23 3209 3286 3343 N
+ M UW T i n/a 23 3209 3286 3343 N
+ M UW T s n/a 23 3209 3286 3343 N
+ M UW TH e n/a 23 3209 3286 3342 N
+ M UW TH i n/a 23 3209 3282 3341 N
+ M UW TH s n/a 23 3209 3286 3342 N
+ M UW UH b n/a 23 3208 3252 3312 N
+ M UW UH e n/a 23 3209 3252 3316 N
+ M UW UH i n/a 23 3208 3252 3312 N
+ M UW UH s n/a 23 3208 3252 3316 N
+ M UW UW b n/a 23 3208 3252 3316 N
+ M UW UW e n/a 23 3209 3252 3316 N
+ M UW UW i n/a 23 3208 3252 3316 N
+ M UW UW s n/a 23 3208 3252 3316 N
+ M UW V b n/a 23 3209 3294 3337 N
+ M UW V e n/a 23 3209 3294 3337 N
+ M UW V s n/a 23 3209 3294 3337 N
+ M UW W b n/a 23 3209 3298 3332 N
+ M UW W e n/a 23 3209 3298 3332 N
+ M UW W s n/a 23 3209 3298 3332 N
+ M UW Y b n/a 23 3209 3297 3334 N
+ M UW Y e n/a 23 3209 3297 3334 N
+ M UW Y i n/a 23 3209 3297 3334 N
+ M UW Y s n/a 23 3209 3297 3334 N
+ M UW Z b n/a 23 3209 3294 3339 N
+ M UW Z e n/a 23 3209 3294 3339 N
+ M UW Z i n/a 23 3209 3294 3339 N
+ M UW Z s n/a 23 3209 3294 3339 N
+ M UW ZH e n/a 23 3209 3294 3339 N
+ M UW ZH s n/a 23 3209 3294 3339 N
+ M V AA b n/a 23 3232 3264 3315 N
+ M V AA i n/a 23 3232 3264 3315 N
+ M V AA s n/a 23 3232 3264 3315 N
+ M V AE b n/a 23 3234 3276 3322 N
+ M V AE i n/a 23 3234 3276 3322 N
+ M V AE s n/a 23 3234 3276 3322 N
+ M V AH b n/a 23 3234 3264 3317 N
+ M V AH i n/a 23 3234 3259 3305 N
+ M V AH s n/a 23 3234 3264 3307 N
+ M V AO b n/a 23 3232 3260 3312 N
+ M V AO s n/a 23 3232 3260 3314 N
+ M V AW b n/a 23 3234 3276 3324 N
+ M V AW s n/a 23 3234 3276 3324 N
+ M V AY b n/a 23 3232 3265 3318 N
+ M V AY s n/a 23 3232 3265 3307 N
+ M V B b n/a 23 3234 3289 3337 N
+ M V B i n/a 23 3234 3290 3338 N
+ M V B s n/a 23 3234 3289 3337 N
+ M V CH s n/a 23 3234 3286 3343 N
+ M V D b n/a 23 3234 3292 3335 N
+ M V D s n/a 23 3234 3292 3335 N
+ M V DH s n/a 23 3234 3294 3336 N
+ M V EH b n/a 23 3234 3276 3321 N
+ M V EH i n/a 23 3234 3276 3321 N
+ M V EH s n/a 23 3234 3276 3321 N
+ M V ER b n/a 23 3232 3267 3311 N
+ M V ER i n/a 23 3232 3267 3311 N
+ M V ER s n/a 23 3232 3267 3311 N
+ M V EY b n/a 23 3234 3276 3330 N
+ M V EY i n/a 23 3234 3276 3330 N
+ M V EY s n/a 23 3234 3276 3330 N
+ M V F b n/a 23 3234 3284 3342 N
+ M V F s n/a 23 3234 3284 3342 N
+ M V G b n/a 23 3234 3292 3335 N
+ M V G s n/a 23 3234 3292 3335 N
+ M V HH b n/a 23 3234 3288 3344 N
+ M V HH s n/a 23 3234 3288 3344 N
+ M V IH b n/a 23 3234 3280 3329 N
+ M V IH s n/a 23 3234 3280 3329 N
+ M V IY b n/a 23 3234 3279 3320 N
+ M V IY s n/a 23 3234 3279 3320 N
+ M V JH b n/a 23 3234 3292 3335 N
+ M V JH s n/a 23 3234 3292 3335 N
+ M V K b n/a 23 3234 3286 3343 N
+ M V K s n/a 23 3234 3286 3343 N
+ M V L b n/a 23 3232 3299 3331 N
+ M V L s n/a 23 3232 3299 3331 N
+ M V M s n/a 23 3234 3288 3333 N
+ M V N b n/a 23 3234 3292 3333 N
+ M V N s n/a 23 3234 3292 3333 N
+ M V NG b n/a 23 3234 3292 3333 N
+ M V NG s n/a 23 3234 3292 3333 N
+ M V OW b n/a 23 3232 3264 3313 N
+ M V OW s n/a 23 3232 3264 3313 N
+ M V OY b n/a 23 3232 3265 3312 N
+ M V OY s n/a 23 3232 3265 3307 N
+ M V P b n/a 23 3234 3284 3342 N
+ M V P s n/a 23 3234 3284 3342 N
+ M V R b n/a 23 3232 3299 3331 N
+ M V R s n/a 23 3232 3299 3331 N
+ M V S s n/a 23 3234 3287 3340 N
+ M V SH s n/a 23 3234 3287 3340 N
+ M V SIL s n/a 23 3234 3303 3345 N
+ M V T b n/a 23 3234 3286 3343 N
+ M V T s n/a 23 3234 3286 3343 N
+ M V TH s n/a 23 3234 3286 3342 N
+ M V UH b n/a 23 3232 3264 3312 N
+ M V UH s n/a 23 3232 3264 3316 N
+ M V UW b n/a 23 3232 3261 3316 N
+ M V UW s n/a 23 3232 3261 3316 N
+ M V V b n/a 23 3234 3294 3337 N
+ M V V s n/a 23 3234 3294 3337 N
+ M V W b n/a 23 3232 3298 3332 N
+ M V W s n/a 23 3232 3298 3332 N
+ M V Y b n/a 23 3234 3297 3334 N
+ M V Y s n/a 23 3234 3297 3334 N
+ M V Z b n/a 23 3234 3294 3339 N
+ M V Z s n/a 23 3234 3294 3339 N
+ M V ZH s n/a 23 3234 3294 3339 N
+ M W AA b n/a 23 3206 3252 3315 N
+ M W AA s n/a 23 3206 3252 3315 N
+ M W AE b n/a 23 3207 3270 3322 N
+ M W AE i n/a 23 3207 3270 3322 N
+ M W AE s n/a 23 3207 3270 3322 N
+ M W AH b n/a 23 3206 3252 3317 N
+ M W AH s n/a 23 3205 3242 3307 N
+ M W AO b n/a 23 3206 3251 3312 N
+ M W AO s n/a 23 3206 3251 3314 N
+ M W AW b n/a 23 3207 3270 3324 N
+ M W AW s n/a 23 3207 3270 3324 N
+ M W AY b n/a 23 3206 3252 3318 N
+ M W AY s n/a 23 3206 3252 3307 N
+ M W B b n/a 23 3205 3289 3337 N
+ M W B s n/a 23 3205 3289 3337 N
+ M W CH s n/a 23 3205 3286 3343 N
+ M W D b n/a 23 3205 3292 3335 N
+ M W D s n/a 23 3205 3292 3335 N
+ M W DH s n/a 23 3205 3294 3336 N
+ M W EH b n/a 23 3207 3270 3323 N
+ M W EH s n/a 23 3207 3270 3323 N
+ M W ER b n/a 23 3206 3252 3311 N
+ M W ER s n/a 23 3205 3246 3311 N
+ M W EY b n/a 23 3207 3270 3330 N
+ M W EY s n/a 23 3207 3270 3330 N
+ M W F b n/a 23 3205 3284 3342 N
+ M W F s n/a 23 3205 3284 3342 N
+ M W G b n/a 23 3205 3292 3335 N
+ M W G i n/a 23 3205 3292 3335 N
+ M W G s n/a 23 3205 3292 3335 N
+ M W HH b n/a 23 3205 3288 3344 N
+ M W HH s n/a 23 3205 3288 3344 N
+ M W IH b n/a 23 3206 3270 3329 N
+ M W IH s n/a 23 3205 3270 3326 N
+ M W IY b n/a 23 3207 3270 3319 N
+ M W IY s n/a 23 3207 3270 3319 N
+ M W JH b n/a 23 3205 3292 3335 N
+ M W JH s n/a 23 3205 3292 3335 N
+ M W K b n/a 23 3205 3286 3343 N
+ M W K s n/a 23 3205 3286 3343 N
+ M W L b n/a 23 3205 3299 3331 N
+ M W L s n/a 23 3205 3299 3331 N
+ M W M s n/a 23 3205 3288 3333 N
+ M W N b n/a 23 3205 3292 3333 N
+ M W N s n/a 23 3205 3292 3333 N
+ M W NG b n/a 23 3205 3292 3333 N
+ M W NG s n/a 23 3205 3292 3333 N
+ M W OW b n/a 23 3206 3252 3314 N
+ M W OW s n/a 23 3206 3252 3314 N
+ M W OY b n/a 23 3206 3252 3312 N
+ M W OY s n/a 23 3206 3252 3307 N
+ M W P b n/a 23 3205 3284 3342 N
+ M W P s n/a 23 3205 3284 3342 N
+ M W R b n/a 23 3205 3299 3331 N
+ M W R s n/a 23 3205 3299 3331 N
+ M W S s n/a 23 3205 3287 3340 N
+ M W SH s n/a 23 3205 3287 3340 N
+ M W SIL s n/a 23 3205 3300 3346 N
+ M W T b n/a 23 3205 3286 3343 N
+ M W T s n/a 23 3205 3286 3343 N
+ M W TH s n/a 23 3205 3286 3342 N
+ M W UH b n/a 23 3206 3252 3312 N
+ M W UH s n/a 23 3206 3252 3316 N
+ M W UW b n/a 23 3206 3252 3316 N
+ M W UW s n/a 23 3206 3252 3316 N
+ M W V b n/a 23 3205 3294 3337 N
+ M W V s n/a 23 3205 3294 3337 N
+ M W W b n/a 23 3205 3298 3332 N
+ M W W s n/a 23 3205 3298 3332 N
+ M W Y b n/a 23 3205 3297 3334 N
+ M W Y s n/a 23 3205 3297 3334 N
+ M W Z b n/a 23 3205 3294 3339 N
+ M W Z s n/a 23 3205 3294 3339 N
+ M W ZH s n/a 23 3205 3294 3339 N
+ M Y AA b n/a 23 3216 3258 3315 N
+ M Y AA s n/a 23 3216 3258 3315 N
+ M Y AE b n/a 23 3217 3272 3322 N
+ M Y AE s n/a 23 3217 3272 3322 N
+ M Y AH b n/a 23 3216 3258 3317 N
+ M Y AH i n/a 23 3217 3248 3305 N
+ M Y AH s n/a 23 3217 3247 3307 N
+ M Y AO b n/a 23 3216 3253 3312 N
+ M Y AO s n/a 23 3216 3253 3314 N
+ M Y AW b n/a 23 3217 3272 3324 N
+ M Y AW s n/a 23 3217 3272 3324 N
+ M Y AY b n/a 23 3216 3258 3318 N
+ M Y AY s n/a 23 3216 3258 3307 N
+ M Y B b n/a 23 3215 3289 3337 N
+ M Y B s n/a 23 3215 3289 3337 N
+ M Y CH s n/a 23 3215 3286 3343 N
+ M Y D b n/a 23 3215 3295 3335 N
+ M Y D s n/a 23 3215 3295 3335 N
+ M Y DH s n/a 23 3215 3295 3336 N
+ M Y EH b n/a 23 3217 3272 3321 N
+ M Y EH s n/a 23 3217 3272 3321 N
+ M Y ER b n/a 23 3216 3257 3311 N
+ M Y ER i n/a 23 3216 3249 3311 N
+ M Y ER s n/a 23 3216 3249 3311 N
+ M Y EY b n/a 23 3217 3273 3330 N
+ M Y EY s n/a 23 3217 3273 3330 N
+ M Y F b n/a 23 3215 3284 3342 N
+ M Y F s n/a 23 3215 3284 3342 N
+ M Y G b n/a 23 3215 3295 3335 N
+ M Y G s n/a 23 3215 3295 3335 N
+ M Y HH b n/a 23 3215 3288 3344 N
+ M Y HH s n/a 23 3215 3288 3344 N
+ M Y IH b n/a 23 3217 3274 3329 N
+ M Y IH s n/a 23 3217 3268 3327 N
+ M Y IY b n/a 23 3217 3274 3319 N
+ M Y IY s n/a 23 3217 3269 3319 N
+ M Y JH b n/a 23 3215 3295 3335 N
+ M Y JH s n/a 23 3215 3295 3335 N
+ M Y K b n/a 23 3215 3286 3343 N
+ M Y K i n/a 23 3215 3282 3343 N
+ M Y K s n/a 23 3215 3286 3343 N
+ M Y L b n/a 23 3215 3299 3331 N
+ M Y L s n/a 23 3215 3299 3331 N
+ M Y M s n/a 23 3215 3289 3333 N
+ M Y N b n/a 23 3215 3295 3333 N
+ M Y N s n/a 23 3215 3295 3333 N
+ M Y NG b n/a 23 3215 3295 3333 N
+ M Y NG s n/a 23 3215 3295 3333 N
+ M Y OW b n/a 23 3216 3258 3313 N
+ M Y OW s n/a 23 3216 3258 3313 N
+ M Y OY b n/a 23 3216 3258 3312 N
+ M Y OY s n/a 23 3216 3258 3307 N
+ M Y P b n/a 23 3215 3284 3342 N
+ M Y P s n/a 23 3215 3284 3342 N
+ M Y R b n/a 23 3215 3299 3331 N
+ M Y R s n/a 23 3215 3299 3331 N
+ M Y S s n/a 23 3215 3287 3340 N
+ M Y SH s n/a 23 3215 3287 3340 N
+ M Y SIL s n/a 23 3215 3303 3345 N
+ M Y T b n/a 23 3215 3286 3343 N
+ M Y T s n/a 23 3215 3286 3343 N
+ M Y TH s n/a 23 3215 3286 3342 N
+ M Y UH b n/a 23 3216 3257 3312 N
+ M Y UH s n/a 23 3216 3257 3316 N
+ M Y UW b n/a 23 3216 3257 3316 N
+ M Y UW s n/a 23 3216 3257 3316 N
+ M Y V b n/a 23 3215 3295 3337 N
+ M Y V s n/a 23 3215 3295 3337 N
+ M Y W b n/a 23 3215 3298 3332 N
+ M Y W s n/a 23 3215 3298 3332 N
+ M Y Y b n/a 23 3215 3297 3334 N
+ M Y Y s n/a 23 3215 3297 3334 N
+ M Y Z b n/a 23 3215 3295 3339 N
+ M Y Z s n/a 23 3215 3295 3339 N
+ M Y ZH s n/a 23 3215 3295 3339 N
+ M Z AA b n/a 23 3230 3264 3315 N
+ M Z AA e n/a 23 3230 3264 3314 N
+ M Z AA i n/a 23 3230 3264 3315 N
+ M Z AA s n/a 23 3230 3264 3315 N
+ M Z AE b n/a 23 3228 3276 3322 N
+ M Z AE e n/a 23 3228 3276 3325 N
+ M Z AE i n/a 23 3228 3276 3322 N
+ M Z AE s n/a 23 3228 3276 3322 N
+ M Z AH b n/a 23 3229 3264 3317 N
+ M Z AH e n/a 23 3228 3264 3307 N
+ M Z AH i n/a 23 3228 3259 3305 N
+ M Z AH s n/a 23 3228 3264 3307 N
+ M Z AO b n/a 23 3230 3260 3312 N
+ M Z AO e n/a 23 3230 3260 3314 N
+ M Z AO i n/a 23 3230 3260 3314 N
+ M Z AO s n/a 23 3230 3260 3314 N
+ M Z AW b n/a 23 3228 3276 3324 N
+ M Z AW e n/a 23 3228 3276 3324 N
+ M Z AW s n/a 23 3228 3276 3324 N
+ M Z AY b n/a 23 3230 3265 3318 N
+ M Z AY e n/a 23 3230 3265 3307 N
+ M Z AY i n/a 23 3230 3265 3318 N
+ M Z AY s n/a 23 3230 3265 3307 N
+ M Z B b n/a 23 3228 3289 3337 N
+ M Z B e n/a 23 3228 3289 3337 N
+ M Z B s n/a 23 3228 3289 3337 N
+ M Z CH e n/a 23 3228 3285 3343 N
+ M Z CH s n/a 23 3228 3286 3343 N
+ M Z D b n/a 23 3228 3292 3335 N
+ M Z D e n/a 23 3228 3292 3335 N
+ M Z D s n/a 23 3228 3292 3335 N
+ M Z DH e n/a 23 3228 3294 3336 N
+ M Z DH s n/a 23 3228 3294 3336 N
+ M Z EH b n/a 23 3228 3276 3321 N
+ M Z EH e n/a 23 3228 3276 3325 N
+ M Z EH i n/a 23 3228 3276 3321 N
+ M Z EH s n/a 23 3228 3276 3321 N
+ M Z ER b n/a 23 3230 3267 3311 N
+ M Z ER e n/a 23 3230 3267 3311 N
+ M Z ER i n/a 23 3230 3267 3311 N
+ M Z ER s n/a 23 3230 3267 3311 N
+ M Z EY b n/a 23 3228 3276 3330 N
+ M Z EY e n/a 23 3228 3276 3330 N
+ M Z EY i n/a 23 3228 3276 3330 N
+ M Z EY s n/a 23 3228 3276 3330 N
+ M Z F b n/a 23 3228 3284 3342 N
+ M Z F e n/a 23 3228 3284 3342 N
+ M Z F s n/a 23 3228 3284 3342 N
+ M Z G b n/a 23 3228 3292 3335 N
+ M Z G e n/a 23 3228 3292 3335 N
+ M Z G s n/a 23 3228 3292 3335 N
+ M Z HH b n/a 23 3228 3288 3344 N
+ M Z HH e n/a 23 3228 3288 3344 N
+ M Z HH s n/a 23 3228 3288 3344 N
+ M Z IH b n/a 23 3228 3280 3329 N
+ M Z IH e n/a 23 3228 3280 3329 N
+ M Z IH i n/a 23 3228 3280 3328 N
+ M Z IH s n/a 23 3228 3280 3329 N
+ M Z IY b n/a 23 3228 3279 3320 N
+ M Z IY e n/a 23 3228 3279 3320 N
+ M Z IY i n/a 23 3228 3279 3320 N
+ M Z IY s n/a 23 3228 3279 3320 N
+ M Z JH b n/a 23 3228 3292 3335 N
+ M Z JH e n/a 23 3228 3292 3335 N
+ M Z JH s n/a 23 3228 3292 3335 N
+ M Z K b n/a 23 3228 3286 3343 N
+ M Z K e n/a 23 3228 3284 3343 N
+ M Z K s n/a 23 3228 3286 3343 N
+ M Z L b n/a 23 3230 3299 3331 N
+ M Z L e n/a 23 3230 3299 3331 N
+ M Z L s n/a 23 3230 3299 3331 N
+ M Z M e n/a 23 3228 3288 3333 N
+ M Z M s n/a 23 3228 3288 3333 N
+ M Z N b n/a 23 3228 3292 3333 N
+ M Z N e n/a 23 3228 3292 3333 N
+ M Z N s n/a 23 3228 3292 3333 N
+ M Z NG b n/a 23 3228 3292 3333 N
+ M Z NG e n/a 23 3228 3292 3333 N
+ M Z NG s n/a 23 3228 3292 3333 N
+ M Z OW b n/a 23 3230 3264 3313 N
+ M Z OW e n/a 23 3230 3264 3314 N
+ M Z OW i n/a 23 3230 3264 3313 N
+ M Z OW s n/a 23 3230 3264 3313 N
+ M Z OY b n/a 23 3230 3265 3312 N
+ M Z OY e n/a 23 3230 3265 3307 N
+ M Z OY i n/a 23 3230 3265 3314 N
+ M Z OY s n/a 23 3230 3265 3307 N
+ M Z P b n/a 23 3228 3284 3342 N
+ M Z P e n/a 23 3228 3284 3342 N
+ M Z P s n/a 23 3228 3284 3342 N
+ M Z R b n/a 23 3230 3299 3331 N
+ M Z R e n/a 23 3230 3299 3331 N
+ M Z R s n/a 23 3230 3299 3331 N
+ M Z S e n/a 23 3228 3287 3340 N
+ M Z S s n/a 23 3228 3287 3340 N
+ M Z SH e n/a 23 3228 3287 3340 N
+ M Z SH s n/a 23 3228 3287 3340 N
+ M Z SIL e n/a 23 3228 3303 3345 N
+ M Z SIL s n/a 23 3228 3303 3345 N
+ M Z T b n/a 23 3228 3286 3343 N
+ M Z T e n/a 23 3228 3285 3343 N
+ M Z T s n/a 23 3228 3286 3343 N
+ M Z TH e n/a 23 3228 3285 3342 N
+ M Z TH s n/a 23 3228 3286 3342 N
+ M Z UH b n/a 23 3230 3264 3312 N
+ M Z UH e n/a 23 3230 3264 3316 N
+ M Z UH i n/a 23 3230 3264 3316 N
+ M Z UH s n/a 23 3230 3264 3316 N
+ M Z UW b n/a 23 3230 3261 3316 N
+ M Z UW e n/a 23 3230 3261 3316 N
+ M Z UW i n/a 23 3230 3261 3316 N
+ M Z UW s n/a 23 3230 3261 3316 N
+ M Z V b n/a 23 3228 3294 3337 N
+ M Z V e n/a 23 3228 3294 3337 N
+ M Z V s n/a 23 3228 3294 3337 N
+ M Z W b n/a 23 3230 3298 3332 N
+ M Z W e n/a 23 3230 3298 3332 N
+ M Z W s n/a 23 3230 3298 3332 N
+ M Z Y b n/a 23 3228 3297 3334 N
+ M Z Y e n/a 23 3228 3297 3334 N
+ M Z Y i n/a 23 3228 3297 3334 N
+ M Z Y s n/a 23 3228 3297 3334 N
+ M Z Z b n/a 23 3228 3294 3339 N
+ M Z Z e n/a 23 3228 3294 3339 N
+ M Z Z i n/a 23 3228 3294 3339 N
+ M Z Z s n/a 23 3228 3294 3339 N
+ M Z ZH e n/a 23 3228 3294 3339 N
+ M Z ZH s n/a 23 3228 3294 3339 N
+ M ZH AA b n/a 23 3230 3264 3315 N
+ M ZH AA s n/a 23 3230 3264 3315 N
+ M ZH AE b n/a 23 3228 3276 3322 N
+ M ZH AE s n/a 23 3228 3276 3322 N
+ M ZH AH b n/a 23 3229 3264 3317 N
+ M ZH AH s n/a 23 3228 3264 3307 N
+ M ZH AO b n/a 23 3230 3260 3312 N
+ M ZH AO s n/a 23 3230 3260 3314 N
+ M ZH AW b n/a 23 3228 3276 3324 N
+ M ZH AW s n/a 23 3228 3276 3324 N
+ M ZH AY b n/a 23 3230 3265 3318 N
+ M ZH AY s n/a 23 3230 3265 3307 N
+ M ZH B b n/a 23 3228 3289 3337 N
+ M ZH B s n/a 23 3228 3289 3337 N
+ M ZH CH s n/a 23 3228 3286 3343 N
+ M ZH D b n/a 23 3228 3292 3335 N
+ M ZH D s n/a 23 3228 3292 3335 N
+ M ZH DH s n/a 23 3228 3294 3336 N
+ M ZH EH b n/a 23 3228 3276 3321 N
+ M ZH EH s n/a 23 3228 3276 3321 N
+ M ZH ER b n/a 23 3230 3267 3311 N
+ M ZH ER s n/a 23 3230 3267 3311 N
+ M ZH EY b n/a 23 3228 3276 3330 N
+ M ZH EY s n/a 23 3228 3276 3330 N
+ M ZH F b n/a 23 3228 3284 3342 N
+ M ZH F s n/a 23 3228 3284 3342 N
+ M ZH G b n/a 23 3228 3292 3335 N
+ M ZH G s n/a 23 3228 3292 3335 N
+ M ZH HH b n/a 23 3228 3288 3344 N
+ M ZH HH s n/a 23 3228 3288 3344 N
+ M ZH IH b n/a 23 3228 3280 3329 N
+ M ZH IH i n/a 23 3228 3280 3328 N
+ M ZH IH s n/a 23 3228 3280 3329 N
+ M ZH IY b n/a 23 3228 3279 3320 N
+ M ZH IY s n/a 23 3228 3279 3320 N
+ M ZH JH b n/a 23 3228 3292 3335 N
+ M ZH JH s n/a 23 3228 3292 3335 N
+ M ZH K b n/a 23 3228 3286 3343 N
+ M ZH K s n/a 23 3228 3286 3343 N
+ M ZH L b n/a 23 3230 3299 3331 N
+ M ZH L s n/a 23 3230 3299 3331 N
+ M ZH M s n/a 23 3228 3288 3333 N
+ M ZH N b n/a 23 3228 3292 3333 N
+ M ZH N s n/a 23 3228 3292 3333 N
+ M ZH NG b n/a 23 3228 3292 3333 N
+ M ZH NG s n/a 23 3228 3292 3333 N
+ M ZH OW b n/a 23 3230 3264 3313 N
+ M ZH OW s n/a 23 3230 3264 3313 N
+ M ZH OY b n/a 23 3230 3265 3312 N
+ M ZH OY s n/a 23 3230 3265 3307 N
+ M ZH P b n/a 23 3228 3284 3342 N
+ M ZH P s n/a 23 3228 3284 3342 N
+ M ZH R b n/a 23 3230 3299 3331 N
+ M ZH R s n/a 23 3230 3299 3331 N
+ M ZH S s n/a 23 3228 3287 3340 N
+ M ZH SH s n/a 23 3228 3287 3340 N
+ M ZH SIL s n/a 23 3228 3303 3345 N
+ M ZH T b n/a 23 3228 3286 3343 N
+ M ZH T s n/a 23 3228 3286 3343 N
+ M ZH TH s n/a 23 3228 3286 3342 N
+ M ZH UH b n/a 23 3230 3264 3312 N
+ M ZH UH s n/a 23 3230 3264 3316 N
+ M ZH UW b n/a 23 3230 3261 3316 N
+ M ZH UW s n/a 23 3230 3261 3316 N
+ M ZH V b n/a 23 3228 3294 3337 N
+ M ZH V s n/a 23 3228 3294 3337 N
+ M ZH W b n/a 23 3230 3298 3332 N
+ M ZH W s n/a 23 3230 3298 3332 N
+ M ZH Y b n/a 23 3228 3297 3334 N
+ M ZH Y s n/a 23 3228 3297 3334 N
+ M ZH Z b n/a 23 3228 3294 3339 N
+ M ZH Z s n/a 23 3228 3294 3339 N
+ M ZH ZH s n/a 23 3228 3294 3339 N
+ N AA AA b n/a 24 3380 3466 3548 N
+ N AA AA e n/a 24 3380 3490 3546 N
+ N AA AA i n/a 24 3380 3490 3548 N
+ N AA AA s n/a 24 3380 3490 3546 N
+ N AA AE b n/a 24 3380 3466 3561 N
+ N AA AE e n/a 24 3380 3490 3560 N
+ N AA AE i n/a 24 3380 3490 3561 N
+ N AA AE s n/a 24 3380 3490 3560 N
+ N AA AH b n/a 24 3380 3466 3549 N
+ N AA AH e n/a 24 3380 3490 3539 N
+ N AA AH i n/a 24 3380 3490 3539 N
+ N AA AH s n/a 24 3380 3490 3539 N
+ N AA AO b n/a 24 3380 3466 3551 N
+ N AA AO e n/a 24 3380 3490 3546 N
+ N AA AO i n/a 24 3380 3490 3551 N
+ N AA AO s n/a 24 3380 3490 3546 N
+ N AA AW b n/a 24 3380 3466 3563 N
+ N AA AW e n/a 24 3380 3490 3560 N
+ N AA AW i n/a 24 3380 3490 3563 N
+ N AA AW s n/a 24 3380 3490 3560 N
+ N AA AY b n/a 24 3380 3466 3549 N
+ N AA AY e n/a 24 3380 3490 3547 N
+ N AA AY i n/a 24 3380 3490 3549 N
+ N AA AY s n/a 24 3380 3490 3547 N
+ N AA B e n/a 24 3378 3463 3528 N
+ N AA B i n/a 24 3378 3463 3528 N
+ N AA B s n/a 24 3378 3463 3528 N
+ N AA CH e n/a 24 3376 3439 3509 N
+ N AA CH i n/a 24 3376 3444 3508 N
+ N AA CH s n/a 24 3376 3444 3509 N
+ N AA D b n/a 24 3378 3463 3536 N
+ N AA D e n/a 24 3378 3463 3537 N
+ N AA D i n/a 24 3378 3463 3535 N
+ N AA D s n/a 24 3378 3463 3536 N
+ N AA DH e n/a 24 3384 3465 3514 N
+ N AA DH i n/a 24 3384 3465 3514 N
+ N AA DH s n/a 24 3384 3465 3514 N
+ N AA EH b n/a 24 3380 3466 3561 N
+ N AA EH e n/a 24 3380 3490 3559 N
+ N AA EH i n/a 24 3380 3490 3561 N
+ N AA EH s n/a 24 3380 3490 3559 N
+ N AA ER b n/a 24 3380 3466 3552 N
+ N AA ER e n/a 24 3380 3490 3545 N
+ N AA ER i n/a 24 3380 3490 3545 N
+ N AA ER s n/a 24 3380 3490 3545 N
+ N AA EY b n/a 24 3380 3466 3562 N
+ N AA EY e n/a 24 3380 3490 3559 N
+ N AA EY i n/a 24 3380 3490 3562 N
+ N AA EY s n/a 24 3380 3490 3559 N
+ N AA F b n/a 24 3378 3444 3500 N
+ N AA F e n/a 24 3378 3439 3500 N
+ N AA F i n/a 24 3377 3444 3500 N
+ N AA F s n/a 24 3378 3444 3500 N
+ N AA G b n/a 24 3378 3463 3528 N
+ N AA G e n/a 24 3378 3463 3528 N
+ N AA G i n/a 24 3378 3463 3528 N
+ N AA G s n/a 24 3378 3463 3528 N
+ N AA HH e n/a 24 3378 3445 3525 N
+ N AA HH i n/a 24 3378 3445 3525 N
+ N AA HH s n/a 24 3378 3445 3525 N
+ N AA IH b n/a 24 3380 3471 3566 N
+ N AA IH e n/a 24 3380 3490 3554 N
+ N AA IH i n/a 24 3380 3490 3554 N
+ N AA IH s n/a 24 3380 3490 3554 N
+ N AA IY b n/a 24 3380 3471 3566 N
+ N AA IY e n/a 24 3380 3493 3564 N
+ N AA IY i n/a 24 3380 3493 3564 N
+ N AA IY s n/a 24 3380 3493 3564 N
+ N AA JH b n/a 24 3376 3464 3531 N
+ N AA JH e n/a 24 3376 3464 3531 N
+ N AA JH i n/a 24 3376 3464 3531 N
+ N AA JH s n/a 24 3376 3464 3531 N
+ N AA K b n/a 24 3378 3444 3502 N
+ N AA K e n/a 24 3378 3440 3502 N
+ N AA K i n/a 24 3376 3444 3502 N
+ N AA K s n/a 24 3378 3444 3502 N
+ N AA L b n/a 24 3378 3463 3521 N
+ N AA L e n/a 24 3378 3463 3521 N
+ N AA L i n/a 24 3378 3463 3521 N
+ N AA L s n/a 24 3378 3463 3521 N
+ N AA M e n/a 24 3378 3463 3517 N
+ N AA M i n/a 24 3378 3463 3517 N
+ N AA M s n/a 24 3378 3463 3517 N
+ N AA N e n/a 24 3378 3463 3516 N
+ N AA N i n/a 24 3378 3463 3516 N
+ N AA N s n/a 24 3378 3463 3516 N
+ N AA NG e n/a 24 3378 3463 3516 N
+ N AA NG s n/a 24 3378 3463 3516 N
+ N AA OW b n/a 24 3380 3466 3553 N
+ N AA OW e n/a 24 3380 3490 3546 N
+ N AA OW i n/a 24 3380 3490 3553 N
+ N AA OW s n/a 24 3380 3490 3546 N
+ N AA OY b n/a 24 3380 3466 3551 N
+ N AA OY e n/a 24 3380 3490 3547 N
+ N AA OY i n/a 24 3380 3490 3551 N
+ N AA OY s n/a 24 3380 3490 3547 N
+ N AA P b n/a 24 3378 3444 3504 N
+ N AA P e n/a 24 3378 3439 3506 N
+ N AA P i n/a 24 3378 3444 3504 N
+ N AA P s n/a 24 3378 3444 3504 N
+ N AA R b n/a 24 3378 3463 3523 N
+ N AA R e n/a 24 3378 3463 3523 N
+ N AA R i n/a 24 3378 3463 3523 N
+ N AA R s n/a 24 3378 3463 3523 N
+ N AA S b n/a 24 3378 3444 3500 N
+ N AA S e n/a 24 3378 3439 3500 N
+ N AA S i n/a 24 3377 3444 3500 N
+ N AA S s n/a 24 3378 3444 3500 N
+ N AA SH e n/a 24 3376 3439 3508 N
+ N AA SH i n/a 24 3376 3444 3508 N
+ N AA SH s n/a 24 3376 3444 3508 N
+ N AA SIL e n/a 24 3381 3430 3511 N
+ N AA SIL s n/a 24 3381 3430 3511 N
+ N AA T b n/a 24 3378 3444 3504 N
+ N AA T e n/a 24 3378 3439 3506 N
+ N AA T i n/a 24 3376 3444 3504 N
+ N AA T s n/a 24 3378 3444 3504 N
+ N AA TH e n/a 24 3384 3439 3500 N
+ N AA TH i n/a 24 3384 3444 3500 N
+ N AA TH s n/a 24 3384 3444 3500 N
+ N AA UH b n/a 24 3380 3471 3567 N
+ N AA UH e n/a 24 3380 3490 3554 N
+ N AA UH i n/a 24 3380 3490 3554 N
+ N AA UH s n/a 24 3380 3490 3554 N
+ N AA UW b n/a 24 3380 3471 3567 N
+ N AA UW e n/a 24 3380 3490 3554 N
+ N AA UW i n/a 24 3380 3490 3558 N
+ N AA UW s n/a 24 3380 3490 3554 N
+ N AA V b n/a 24 3378 3463 3519 N
+ N AA V e n/a 24 3378 3463 3519 N
+ N AA V i n/a 24 3377 3463 3519 N
+ N AA V s n/a 24 3378 3463 3519 N
+ N AA W b n/a 24 3378 3463 3522 N
+ N AA W e n/a 24 3378 3463 3522 N
+ N AA W i n/a 24 3378 3463 3522 N
+ N AA W s n/a 24 3378 3463 3522 N
+ N AA Y b n/a 24 3376 3464 3526 N
+ N AA Y e n/a 24 3376 3464 3527 N
+ N AA Y i n/a 24 3376 3464 3526 N
+ N AA Y s n/a 24 3376 3464 3527 N
+ N AA Z b n/a 24 3378 3463 3510 N
+ N AA Z e n/a 24 3378 3463 3510 N
+ N AA Z i n/a 24 3378 3463 3510 N
+ N AA Z s n/a 24 3378 3463 3510 N
+ N AA ZH e n/a 24 3376 3464 3510 N
+ N AA ZH i n/a 24 3376 3464 3510 N
+ N AA ZH s n/a 24 3376 3464 3510 N
+ N AE AA b n/a 24 3394 3466 3548 N
+ N AE AA e n/a 24 3394 3487 3546 N
+ N AE AA i n/a 24 3394 3487 3548 N
+ N AE AA s n/a 24 3394 3487 3546 N
+ N AE AE b n/a 24 3393 3466 3561 N
+ N AE AE e n/a 24 3393 3487 3560 N
+ N AE AE i n/a 24 3394 3488 3561 N
+ N AE AE s n/a 24 3393 3487 3560 N
+ N AE AH b n/a 24 3393 3466 3549 N
+ N AE AH e n/a 24 3393 3487 3538 N
+ N AE AH i n/a 24 3394 3488 3539 N
+ N AE AH s n/a 24 3393 3487 3538 N
+ N AE AO b n/a 24 3394 3466 3551 N
+ N AE AO e n/a 24 3394 3487 3546 N
+ N AE AO i n/a 24 3394 3487 3551 N
+ N AE AO s n/a 24 3394 3487 3546 N
+ N AE AW b n/a 24 3393 3466 3563 N
+ N AE AW e n/a 24 3393 3487 3560 N
+ N AE AW i n/a 24 3394 3487 3563 N
+ N AE AW s n/a 24 3393 3487 3560 N
+ N AE AY b n/a 24 3404 3466 3549 N
+ N AE AY e n/a 24 3404 3487 3547 N
+ N AE AY s n/a 24 3404 3487 3547 N
+ N AE B e n/a 24 3391 3455 3528 N
+ N AE B i n/a 24 3388 3455 3528 N
+ N AE B s n/a 24 3391 3455 3528 N
+ N AE CH e n/a 24 3389 3451 3509 N
+ N AE CH i n/a 24 3389 3442 3508 N
+ N AE CH s n/a 24 3389 3451 3509 N
+ N AE D b n/a 24 3391 3454 3533 N
+ N AE D e n/a 24 3391 3454 3533 N
+ N AE D i n/a 24 3388 3454 3532 N
+ N AE D s n/a 24 3391 3454 3533 N
+ N AE DH e n/a 24 3395 3457 3518 N
+ N AE DH i n/a 24 3394 3457 3518 N
+ N AE DH s n/a 24 3395 3457 3518 N
+ N AE EH b n/a 24 3393 3466 3561 N
+ N AE EH e n/a 24 3393 3487 3559 N
+ N AE EH i n/a 24 3394 3488 3561 N
+ N AE EH s n/a 24 3393 3487 3559 N
+ N AE ER b n/a 24 3394 3466 3552 N
+ N AE ER e n/a 24 3394 3487 3545 N
+ N AE ER i n/a 24 3394 3488 3545 N
+ N AE ER s n/a 24 3394 3487 3545 N
+ N AE EY b n/a 24 3405 3466 3562 N
+ N AE EY e n/a 24 3405 3487 3559 N
+ N AE EY i n/a 24 3405 3488 3562 N
+ N AE EY s n/a 24 3405 3487 3559 N
+ N AE F b n/a 24 3393 3451 3501 N
+ N AE F e n/a 24 3393 3451 3501 N
+ N AE F i n/a 24 3394 3441 3501 N
+ N AE F s n/a 24 3393 3451 3501 N
+ N AE G b n/a 24 3391 3455 3529 N
+ N AE G e n/a 24 3391 3455 3529 N
+ N AE G i n/a 24 3388 3455 3529 N
+ N AE G s n/a 24 3391 3455 3529 N
+ N AE HH e n/a 24 3393 3453 3525 N
+ N AE HH i n/a 24 3394 3441 3525 N
+ N AE HH s n/a 24 3393 3453 3525 N
+ N AE IH b n/a 24 3393 3471 3566 N
+ N AE IH e n/a 24 3393 3494 3557 N
+ N AE IH i n/a 24 3394 3494 3554 N
+ N AE IH s n/a 24 3393 3494 3557 N
+ N AE IY b n/a 24 3406 3471 3566 N
+ N AE IY e n/a 24 3406 3491 3565 N
+ N AE IY i n/a 24 3406 3491 3565 N
+ N AE IY s n/a 24 3406 3491 3565 N
+ N AE JH b n/a 24 3391 3455 3531 N
+ N AE JH e n/a 24 3391 3455 3531 N
+ N AE JH i n/a 24 3391 3455 3531 N
+ N AE JH s n/a 24 3391 3455 3531 N
+ N AE K b n/a 24 3391 3448 3502 N
+ N AE K e n/a 24 3391 3448 3502 N
+ N AE K i n/a 24 3390 3442 3502 N
+ N AE K s n/a 24 3391 3448 3502 N
+ N AE L b n/a 24 3394 3455 3521 N
+ N AE L e n/a 24 3394 3455 3521 N
+ N AE L i n/a 24 3394 3455 3521 N
+ N AE L s n/a 24 3394 3455 3521 N
+ N AE M e n/a 24 3393 3455 3517 N
+ N AE M i n/a 24 3394 3455 3517 N
+ N AE M s n/a 24 3393 3455 3517 N
+ N AE N e n/a 24 3393 3454 3516 N
+ N AE N s n/a 24 3393 3454 3516 N
+ N AE NG e n/a 24 3393 3455 3516 N
+ N AE NG s n/a 24 3393 3455 3516 N
+ N AE OW b n/a 24 3394 3466 3553 N
+ N AE OW e n/a 24 3394 3487 3546 N
+ N AE OW i n/a 24 3394 3487 3553 N
+ N AE OW s n/a 24 3394 3487 3546 N
+ N AE OY b n/a 24 3404 3466 3551 N
+ N AE OY e n/a 24 3404 3487 3547 N
+ N AE OY i n/a 24 3404 3488 3551 N
+ N AE OY s n/a 24 3404 3487 3547 N
+ N AE P b n/a 24 3391 3451 3503 N
+ N AE P e n/a 24 3391 3451 3503 N
+ N AE P i n/a 24 3389 3441 3503 N
+ N AE P s n/a 24 3391 3451 3503 N
+ N AE R b n/a 24 3394 3455 3523 N
+ N AE R e n/a 24 3394 3455 3523 N
+ N AE R i n/a 24 3394 3455 3523 N
+ N AE R s n/a 24 3394 3455 3523 N
+ N AE S b n/a 24 3395 3451 3497 N
+ N AE S e n/a 24 3395 3451 3497 N
+ N AE S i n/a 24 3397 3443 3499 N
+ N AE S s n/a 24 3395 3451 3497 N
+ N AE SH e n/a 24 3389 3451 3508 N
+ N AE SH i n/a 24 3389 3442 3508 N
+ N AE SH s n/a 24 3389 3451 3508 N
+ N AE SIL e n/a 24 3396 3430 3513 N
+ N AE SIL s n/a 24 3396 3430 3513 N
+ N AE T b n/a 24 3391 3451 3505 N
+ N AE T e n/a 24 3391 3451 3505 N
+ N AE T i n/a 24 3389 3441 3505 N
+ N AE T s n/a 24 3391 3451 3505 N
+ N AE TH e n/a 24 3395 3451 3501 N
+ N AE TH i n/a 24 3394 3441 3500 N
+ N AE TH s n/a 24 3395 3451 3501 N
+ N AE UH b n/a 24 3394 3471 3567 N
+ N AE UH e n/a 24 3394 3494 3557 N
+ N AE UH i n/a 24 3394 3494 3554 N
+ N AE UH s n/a 24 3394 3494 3557 N
+ N AE UW b n/a 24 3394 3471 3567 N
+ N AE UW e n/a 24 3394 3494 3557 N
+ N AE UW i n/a 24 3394 3494 3558 N
+ N AE UW s n/a 24 3394 3494 3557 N
+ N AE V b n/a 24 3393 3455 3519 N
+ N AE V e n/a 24 3393 3455 3519 N
+ N AE V i n/a 24 3394 3455 3519 N
+ N AE V s n/a 24 3393 3455 3519 N
+ N AE W b n/a 24 3394 3455 3522 N
+ N AE W e n/a 24 3394 3455 3522 N
+ N AE W i n/a 24 3394 3455 3522 N
+ N AE W s n/a 24 3394 3455 3522 N
+ N AE Y b n/a 24 3406 3462 3526 N
+ N AE Y e n/a 24 3406 3462 3527 N
+ N AE Y i n/a 24 3406 3462 3527 N
+ N AE Y s n/a 24 3406 3462 3527 N
+ N AE Z b n/a 24 3395 3457 3510 N
+ N AE Z e n/a 24 3395 3457 3510 N
+ N AE Z i n/a 24 3397 3457 3510 N
+ N AE Z s n/a 24 3395 3457 3510 N
+ N AE ZH e n/a 24 3395 3455 3510 N
+ N AE ZH i n/a 24 3397 3455 3510 N
+ N AE ZH s n/a 24 3395 3455 3510 N
+ N AH AA b n/a 24 3369 3466 3548 N
+ N AH AA e n/a 24 3368 3480 3546 N
+ N AH AA i n/a 24 3368 3480 3548 N
+ N AH AA s n/a 24 3368 3480 3546 N
+ N AH AE b n/a 24 3369 3466 3561 N
+ N AH AE e n/a 24 3366 3483 3560 N
+ N AH AE i n/a 24 3366 3482 3561 N
+ N AH AE s n/a 24 3366 3483 3560 N
+ N AH AH b n/a 24 3369 3466 3549 N
+ N AH AH e n/a 24 3368 3480 3538 N
+ N AH AH i n/a 24 3368 3480 3541 N
+ N AH AH s n/a 24 3368 3480 3538 N
+ N AH AO b n/a 24 3369 3466 3551 N
+ N AH AO e n/a 24 3368 3480 3546 N
+ N AH AO i n/a 24 3368 3480 3551 N
+ N AH AO s n/a 24 3368 3480 3546 N
+ N AH AW b n/a 24 3369 3466 3563 N
+ N AH AW e n/a 24 3366 3483 3560 N
+ N AH AW i n/a 24 3366 3482 3563 N
+ N AH AW s n/a 24 3366 3483 3560 N
+ N AH AY b n/a 24 3369 3466 3549 N
+ N AH AY e n/a 24 3368 3480 3547 N
+ N AH AY i n/a 24 3368 3480 3549 N
+ N AH AY s n/a 24 3368 3480 3547 N
+ N AH B e n/a 24 3363 3415 3528 N
+ N AH B i n/a 24 3362 3415 3528 N
+ N AH B s n/a 24 3363 3415 3528 N
+ N AH CH e n/a 24 3363 3447 3509 N
+ N AH CH i n/a 24 3363 3439 3508 N
+ N AH CH s n/a 24 3363 3447 3509 N
+ N AH D b n/a 24 3412 3455 3534 N
+ N AH D e n/a 24 3412 3460 3537 N
+ N AH D i n/a 24 3410 3455 3534 N
+ N AH D s n/a 24 3412 3455 3534 N
+ N AH DH e n/a 24 3359 3423 3518 N
+ N AH DH i n/a 24 3359 3423 3518 N
+ N AH DH s n/a 24 3359 3423 3518 N
+ N AH EH b n/a 24 3369 3466 3561 N
+ N AH EH e n/a 24 3366 3482 3559 N
+ N AH EH i n/a 24 3366 3482 3561 N
+ N AH EH s n/a 24 3366 3482 3559 N
+ N AH ER b n/a 24 3369 3466 3552 N
+ N AH ER e n/a 24 3368 3485 3545 N
+ N AH ER i n/a 24 3367 3484 3544 N
+ N AH ER s n/a 24 3368 3485 3545 N
+ N AH EY b n/a 24 3369 3466 3562 N
+ N AH EY e n/a 24 3366 3482 3559 N
+ N AH EY i n/a 24 3366 3482 3562 N
+ N AH EY s n/a 24 3366 3482 3559 N
+ N AH F b n/a 24 3363 3446 3501 N
+ N AH F e n/a 24 3363 3446 3501 N
+ N AH F i n/a 24 3363 3440 3501 N
+ N AH F s n/a 24 3363 3446 3501 N
+ N AH G b n/a 24 3364 3416 3529 N
+ N AH G e n/a 24 3364 3416 3529 N
+ N AH G i n/a 24 3362 3416 3529 N
+ N AH G s n/a 24 3364 3416 3529 N
+ N AH HH e n/a 24 3363 3452 3525 N
+ N AH HH i n/a 24 3362 3439 3525 N
+ N AH HH s n/a 24 3363 3452 3525 N
+ N AH IH b n/a 24 3369 3471 3566 N
+ N AH IH e n/a 24 3366 3495 3557 N
+ N AH IH i n/a 24 3365 3495 3555 N
+ N AH IH s n/a 24 3366 3495 3557 N
+ N AH IY b n/a 24 3369 3471 3566 N
+ N AH IY e n/a 24 3366 3492 3565 N
+ N AH IY i n/a 24 3365 3493 3564 N
+ N AH IY s n/a 24 3366 3492 3565 N
+ N AH JH b n/a 24 3363 3420 3531 N
+ N AH JH e n/a 24 3363 3417 3531 N
+ N AH JH i n/a 24 3363 3417 3531 N
+ N AH JH s n/a 24 3363 3417 3531 N
+ N AH K b n/a 24 3364 3448 3502 N
+ N AH K e n/a 24 3364 3448 3502 N
+ N AH K i n/a 24 3362 3440 3502 N
+ N AH K s n/a 24 3364 3448 3502 N
+ N AH L b n/a 24 3363 3425 3521 N
+ N AH L e n/a 24 3363 3425 3521 N
+ N AH L i n/a 24 3362 3425 3521 N
+ N AH L s n/a 24 3363 3425 3521 N
+ N AH M e n/a 24 3363 3421 3517 N
+ N AH M i n/a 24 3362 3421 3517 N
+ N AH M s n/a 24 3363 3421 3517 N
+ N AH N e n/a 24 3412 3458 3516 N
+ N AH N i n/a 24 3410 3456 3516 N
+ N AH N s n/a 24 3412 3456 3516 N
+ N AH NG e n/a 24 3364 3421 3516 N
+ N AH NG s n/a 24 3364 3421 3516 N
+ N AH OW b n/a 24 3369 3466 3552 N
+ N AH OW e n/a 24 3368 3480 3546 N
+ N AH OW i n/a 24 3368 3480 3552 N
+ N AH OW s n/a 24 3368 3480 3546 N
+ N AH OY b n/a 24 3369 3466 3551 N
+ N AH OY e n/a 24 3368 3480 3547 N
+ N AH OY i n/a 24 3368 3480 3551 N
+ N AH OY s n/a 24 3368 3480 3547 N
+ N AH P b n/a 24 3363 3447 3503 N
+ N AH P e n/a 24 3363 3447 3503 N
+ N AH P i n/a 24 3362 3440 3503 N
+ N AH P s n/a 24 3363 3447 3503 N
+ N AH R b n/a 24 3363 3427 3523 N
+ N AH R e n/a 24 3363 3427 3523 N
+ N AH R i n/a 24 3362 3426 3523 N
+ N AH R s n/a 24 3363 3427 3523 N
+ N AH S b n/a 24 3361 3446 3497 N
+ N AH S e n/a 24 3361 3446 3497 N
+ N AH S i n/a 24 3361 3437 3498 N
+ N AH S s n/a 24 3361 3446 3497 N
+ N AH SH e n/a 24 3363 3447 3508 N
+ N AH SH i n/a 24 3363 3440 3508 N
+ N AH SH s n/a 24 3363 3447 3508 N
+ N AH SIL e n/a 24 3357 3432 3512 N
+ N AH SIL s n/a 24 3357 3432 3512 N
+ N AH T b n/a 24 3412 3447 3509 N
+ N AH T e n/a 24 3412 3447 3509 N
+ N AH T i n/a 24 3411 3438 3506 N
+ N AH T s n/a 24 3412 3447 3509 N
+ N AH TH e n/a 24 3361 3446 3501 N
+ N AH TH i n/a 24 3360 3439 3500 N
+ N AH TH s n/a 24 3361 3446 3501 N
+ N AH UH b n/a 24 3369 3471 3567 N
+ N AH UH e n/a 24 3366 3495 3557 N
+ N AH UH i n/a 24 3366 3495 3555 N
+ N AH UH s n/a 24 3366 3495 3557 N
+ N AH UW b n/a 24 3369 3471 3567 N
+ N AH UW e n/a 24 3366 3495 3557 N
+ N AH UW i n/a 24 3366 3495 3558 N
+ N AH UW s n/a 24 3366 3495 3557 N
+ N AH V b n/a 24 3363 3415 3519 N
+ N AH V e n/a 24 3363 3415 3519 N
+ N AH V i n/a 24 3363 3415 3519 N
+ N AH V s n/a 24 3363 3415 3519 N
+ N AH W b n/a 24 3363 3425 3522 N
+ N AH W e n/a 24 3363 3425 3522 N
+ N AH W i n/a 24 3362 3425 3522 N
+ N AH W s n/a 24 3363 3425 3522 N
+ N AH Y b n/a 24 3364 3420 3526 N
+ N AH Y e n/a 24 3364 3418 3527 N
+ N AH Y i n/a 24 3364 3418 3527 N
+ N AH Y s n/a 24 3364 3418 3527 N
+ N AH Z b n/a 24 3359 3435 3510 N
+ N AH Z e n/a 24 3359 3435 3510 N
+ N AH Z i n/a 24 3359 3435 3510 N
+ N AH Z s n/a 24 3359 3435 3510 N
+ N AH ZH e n/a 24 3363 3415 3510 N
+ N AH ZH i n/a 24 3363 3415 3510 N
+ N AH ZH s n/a 24 3363 3415 3510 N
+ N AO AA b n/a 24 3379 3466 3548 N
+ N AO AA e n/a 24 3379 3490 3546 N
+ N AO AA s n/a 24 3379 3490 3546 N
+ N AO AE b n/a 24 3379 3466 3561 N
+ N AO AE e n/a 24 3379 3490 3560 N
+ N AO AE s n/a 24 3379 3490 3560 N
+ N AO AH b n/a 24 3379 3466 3549 N
+ N AO AH e n/a 24 3379 3490 3539 N
+ N AO AH i n/a 24 3379 3490 3539 N
+ N AO AH s n/a 24 3379 3490 3539 N
+ N AO AO b n/a 24 3379 3466 3551 N
+ N AO AO e n/a 24 3379 3490 3546 N
+ N AO AO i n/a 24 3379 3490 3551 N
+ N AO AO s n/a 24 3379 3490 3546 N
+ N AO AW b n/a 24 3379 3466 3563 N
+ N AO AW e n/a 24 3379 3490 3560 N
+ N AO AW s n/a 24 3379 3490 3560 N
+ N AO AY b n/a 24 3379 3466 3549 N
+ N AO AY e n/a 24 3379 3490 3547 N
+ N AO AY s n/a 24 3379 3490 3547 N
+ N AO B e n/a 24 3379 3463 3528 N
+ N AO B i n/a 24 3379 3463 3528 N
+ N AO B s n/a 24 3379 3463 3528 N
+ N AO CH e n/a 24 3379 3439 3509 N
+ N AO CH i n/a 24 3379 3444 3508 N
+ N AO CH s n/a 24 3379 3444 3509 N
+ N AO D b n/a 24 3379 3463 3536 N
+ N AO D e n/a 24 3379 3463 3537 N
+ N AO D i n/a 24 3379 3463 3535 N
+ N AO D s n/a 24 3379 3463 3536 N
+ N AO DH e n/a 24 3384 3465 3514 N
+ N AO DH s n/a 24 3384 3465 3514 N
+ N AO EH b n/a 24 3379 3466 3561 N
+ N AO EH e n/a 24 3379 3490 3559 N
+ N AO EH s n/a 24 3379 3490 3559 N
+ N AO ER b n/a 24 3379 3466 3552 N
+ N AO ER e n/a 24 3379 3490 3545 N
+ N AO ER i n/a 24 3379 3490 3545 N
+ N AO ER s n/a 24 3379 3490 3545 N
+ N AO EY b n/a 24 3379 3466 3562 N
+ N AO EY e n/a 24 3379 3490 3559 N
+ N AO EY i n/a 24 3379 3490 3562 N
+ N AO EY s n/a 24 3379 3490 3559 N
+ N AO F b n/a 24 3379 3444 3500 N
+ N AO F e n/a 24 3379 3439 3500 N
+ N AO F i n/a 24 3379 3444 3500 N
+ N AO F s n/a 24 3379 3444 3500 N
+ N AO G b n/a 24 3379 3463 3528 N
+ N AO G e n/a 24 3379 3463 3528 N
+ N AO G i n/a 24 3379 3463 3528 N
+ N AO G s n/a 24 3379 3463 3528 N
+ N AO HH e n/a 24 3379 3445 3525 N
+ N AO HH s n/a 24 3379 3445 3525 N
+ N AO IH b n/a 24 3379 3471 3566 N
+ N AO IH e n/a 24 3379 3490 3554 N
+ N AO IH i n/a 24 3379 3490 3554 N
+ N AO IH s n/a 24 3379 3490 3554 N
+ N AO IY b n/a 24 3379 3471 3566 N
+ N AO IY e n/a 24 3379 3493 3564 N
+ N AO IY i n/a 24 3379 3493 3564 N
+ N AO IY s n/a 24 3379 3493 3564 N
+ N AO JH b n/a 24 3379 3464 3531 N
+ N AO JH e n/a 24 3379 3464 3531 N
+ N AO JH i n/a 24 3379 3464 3531 N
+ N AO JH s n/a 24 3379 3464 3531 N
+ N AO K b n/a 24 3379 3444 3502 N
+ N AO K e n/a 24 3379 3440 3502 N
+ N AO K i n/a 24 3379 3444 3502 N
+ N AO K s n/a 24 3379 3444 3502 N
+ N AO L b n/a 24 3379 3463 3521 N
+ N AO L e n/a 24 3379 3463 3521 N
+ N AO L i n/a 24 3379 3463 3521 N
+ N AO L s n/a 24 3379 3463 3521 N
+ N AO M e n/a 24 3379 3463 3517 N
+ N AO M i n/a 24 3379 3463 3517 N
+ N AO M s n/a 24 3379 3463 3517 N
+ N AO N e n/a 24 3379 3463 3516 N
+ N AO N s n/a 24 3379 3463 3516 N
+ N AO NG e n/a 24 3379 3463 3516 N
+ N AO NG s n/a 24 3379 3463 3516 N
+ N AO OW b n/a 24 3379 3466 3553 N
+ N AO OW e n/a 24 3379 3490 3546 N
+ N AO OW s n/a 24 3379 3490 3546 N
+ N AO OY b n/a 24 3379 3466 3551 N
+ N AO OY e n/a 24 3379 3490 3547 N
+ N AO OY s n/a 24 3379 3490 3547 N
+ N AO P b n/a 24 3379 3444 3504 N
+ N AO P e n/a 24 3379 3439 3506 N
+ N AO P i n/a 24 3379 3444 3504 N
+ N AO P s n/a 24 3379 3444 3504 N
+ N AO R b n/a 24 3379 3463 3523 N
+ N AO R e n/a 24 3379 3463 3523 N
+ N AO R i n/a 24 3379 3463 3523 N
+ N AO R s n/a 24 3379 3463 3523 N
+ N AO S b n/a 24 3379 3444 3500 N
+ N AO S e n/a 24 3379 3440 3500 N
+ N AO S i n/a 24 3379 3444 3500 N
+ N AO S s n/a 24 3379 3444 3500 N
+ N AO SH e n/a 24 3379 3439 3508 N
+ N AO SH i n/a 24 3379 3444 3508 N
+ N AO SH s n/a 24 3379 3444 3508 N
+ N AO SIL e n/a 24 3381 3429 3511 N
+ N AO SIL s n/a 24 3381 3429 3511 N
+ N AO T b n/a 24 3379 3444 3504 N
+ N AO T e n/a 24 3379 3440 3506 N
+ N AO T i n/a 24 3379 3444 3504 N
+ N AO T s n/a 24 3379 3444 3504 N
+ N AO TH e n/a 24 3384 3440 3500 N
+ N AO TH s n/a 24 3384 3444 3500 N
+ N AO UH b n/a 24 3379 3471 3567 N
+ N AO UH e n/a 24 3379 3490 3554 N
+ N AO UH s n/a 24 3379 3490 3554 N
+ N AO UW b n/a 24 3379 3471 3567 N
+ N AO UW e n/a 24 3379 3490 3554 N
+ N AO UW s n/a 24 3379 3490 3554 N
+ N AO V b n/a 24 3379 3463 3519 N
+ N AO V e n/a 24 3379 3463 3519 N
+ N AO V i n/a 24 3379 3463 3519 N
+ N AO V s n/a 24 3379 3463 3519 N
+ N AO W b n/a 24 3379 3463 3522 N
+ N AO W e n/a 24 3379 3463 3522 N
+ N AO W i n/a 24 3379 3463 3522 N
+ N AO W s n/a 24 3379 3463 3522 N
+ N AO Y b n/a 24 3379 3464 3526 N
+ N AO Y e n/a 24 3379 3464 3527 N
+ N AO Y s n/a 24 3379 3464 3527 N
+ N AO Z b n/a 24 3379 3463 3510 N
+ N AO Z e n/a 24 3379 3463 3510 N
+ N AO Z i n/a 24 3379 3463 3510 N
+ N AO Z s n/a 24 3379 3463 3510 N
+ N AO ZH e n/a 24 3379 3464 3510 N
+ N AO ZH s n/a 24 3379 3464 3510 N
+ N AW AA b n/a 24 3383 3466 3550 N
+ N AW AA e n/a 24 3383 3490 3546 N
+ N AW AA i n/a 24 3383 3490 3550 N
+ N AW AA s n/a 24 3383 3490 3546 N
+ N AW AE b n/a 24 3383 3466 3561 N
+ N AW AE e n/a 24 3383 3490 3560 N
+ N AW AE s n/a 24 3383 3490 3560 N
+ N AW AH b n/a 24 3383 3466 3549 N
+ N AW AH e n/a 24 3383 3490 3538 N
+ N AW AH i n/a 24 3383 3490 3539 N
+ N AW AH s n/a 24 3383 3490 3538 N
+ N AW AO b n/a 24 3383 3466 3551 N
+ N AW AO e n/a 24 3383 3490 3546 N
+ N AW AO s n/a 24 3383 3490 3546 N
+ N AW AW b n/a 24 3383 3466 3563 N
+ N AW AW e n/a 24 3383 3490 3560 N
+ N AW AW i n/a 24 3383 3490 3563 N
+ N AW AW s n/a 24 3383 3490 3560 N
+ N AW AY b n/a 24 3383 3466 3549 N
+ N AW AY e n/a 24 3383 3490 3547 N
+ N AW AY s n/a 24 3383 3490 3547 N
+ N AW B e n/a 24 3383 3463 3528 N
+ N AW B i n/a 24 3383 3463 3528 N
+ N AW B s n/a 24 3383 3463 3528 N
+ N AW CH e n/a 24 3383 3439 3509 N
+ N AW CH s n/a 24 3383 3444 3509 N
+ N AW D b n/a 24 3383 3463 3535 N
+ N AW D e n/a 24 3383 3463 3535 N
+ N AW D i n/a 24 3383 3463 3535 N
+ N AW D s n/a 24 3383 3463 3535 N
+ N AW DH e n/a 24 3384 3465 3514 N
+ N AW DH i n/a 24 3384 3465 3514 N
+ N AW DH s n/a 24 3384 3465 3514 N
+ N AW EH b n/a 24 3383 3466 3561 N
+ N AW EH e n/a 24 3383 3490 3559 N
+ N AW EH i n/a 24 3383 3490 3561 N
+ N AW EH s n/a 24 3383 3490 3559 N
+ N AW ER b n/a 24 3383 3466 3552 N
+ N AW ER e n/a 24 3383 3490 3545 N
+ N AW ER i n/a 24 3383 3490 3545 N
+ N AW ER s n/a 24 3383 3490 3545 N
+ N AW EY b n/a 24 3383 3466 3562 N
+ N AW EY e n/a 24 3383 3490 3559 N
+ N AW EY s n/a 24 3383 3490 3559 N
+ N AW F b n/a 24 3383 3444 3500 N
+ N AW F e n/a 24 3383 3439 3500 N
+ N AW F i n/a 24 3383 3444 3500 N
+ N AW F s n/a 24 3383 3444 3500 N
+ N AW G b n/a 24 3383 3463 3528 N
+ N AW G e n/a 24 3383 3463 3528 N
+ N AW G i n/a 24 3383 3463 3528 N
+ N AW G s n/a 24 3383 3463 3528 N
+ N AW HH e n/a 24 3383 3445 3525 N
+ N AW HH i n/a 24 3383 3445 3525 N
+ N AW HH s n/a 24 3383 3445 3525 N
+ N AW IH b n/a 24 3383 3471 3566 N
+ N AW IH e n/a 24 3383 3490 3554 N
+ N AW IH i n/a 24 3383 3490 3554 N
+ N AW IH s n/a 24 3383 3490 3554 N
+ N AW IY b n/a 24 3383 3471 3566 N
+ N AW IY e n/a 24 3383 3493 3564 N
+ N AW IY i n/a 24 3383 3493 3564 N
+ N AW IY s n/a 24 3383 3493 3564 N
+ N AW JH b n/a 24 3383 3463 3531 N
+ N AW JH e n/a 24 3383 3463 3531 N
+ N AW JH i n/a 24 3383 3463 3531 N
+ N AW JH s n/a 24 3383 3463 3531 N
+ N AW K b n/a 24 3383 3444 3502 N
+ N AW K e n/a 24 3383 3440 3502 N
+ N AW K i n/a 24 3383 3444 3502 N
+ N AW K s n/a 24 3383 3444 3502 N
+ N AW L b n/a 24 3383 3463 3521 N
+ N AW L e n/a 24 3383 3463 3521 N
+ N AW L i n/a 24 3383 3463 3520 N
+ N AW L s n/a 24 3383 3463 3521 N
+ N AW M e n/a 24 3383 3463 3517 N
+ N AW M i n/a 24 3383 3463 3517 N
+ N AW M s n/a 24 3383 3463 3517 N
+ N AW N e n/a 24 3383 3463 3516 N
+ N AW N i n/a 24 3383 3463 3516 N
+ N AW N s n/a 24 3383 3463 3516 N
+ N AW NG e n/a 24 3383 3463 3516 N
+ N AW NG s n/a 24 3383 3463 3516 N
+ N AW OW b n/a 24 3383 3466 3552 N
+ N AW OW e n/a 24 3383 3490 3546 N
+ N AW OW i n/a 24 3383 3490 3552 N
+ N AW OW s n/a 24 3383 3490 3546 N
+ N AW OY b n/a 24 3383 3466 3551 N
+ N AW OY e n/a 24 3383 3490 3547 N
+ N AW OY s n/a 24 3383 3490 3547 N
+ N AW P b n/a 24 3383 3444 3504 N
+ N AW P e n/a 24 3383 3439 3506 N
+ N AW P i n/a 24 3383 3444 3504 N
+ N AW P s n/a 24 3383 3444 3504 N
+ N AW R b n/a 24 3383 3463 3523 N
+ N AW R e n/a 24 3383 3463 3523 N
+ N AW R i n/a 24 3383 3463 3523 N
+ N AW R s n/a 24 3383 3463 3523 N
+ N AW S b n/a 24 3382 3444 3500 N
+ N AW S e n/a 24 3382 3439 3500 N
+ N AW S i n/a 24 3382 3444 3500 N
+ N AW S s n/a 24 3382 3444 3500 N
+ N AW SH e n/a 24 3383 3439 3508 N
+ N AW SH i n/a 24 3383 3444 3508 N
+ N AW SH s n/a 24 3383 3444 3508 N
+ N AW SIL e n/a 24 3383 3429 3511 N
+ N AW SIL s n/a 24 3383 3429 3511 N
+ N AW T b n/a 24 3383 3444 3504 N
+ N AW T e n/a 24 3383 3439 3506 N
+ N AW T i n/a 24 3382 3444 3504 N
+ N AW T s n/a 24 3383 3444 3504 N
+ N AW TH e n/a 24 3384 3439 3500 N
+ N AW TH s n/a 24 3384 3444 3500 N
+ N AW UH b n/a 24 3383 3471 3567 N
+ N AW UH e n/a 24 3383 3490 3554 N
+ N AW UH s n/a 24 3383 3490 3554 N
+ N AW UW b n/a 24 3383 3471 3567 N
+ N AW UW e n/a 24 3383 3490 3554 N
+ N AW UW s n/a 24 3383 3490 3554 N
+ N AW V b n/a 24 3383 3463 3519 N
+ N AW V e n/a 24 3383 3463 3519 N
+ N AW V s n/a 24 3383 3463 3519 N
+ N AW W b n/a 24 3383 3463 3522 N
+ N AW W e n/a 24 3383 3463 3522 N
+ N AW W i n/a 24 3383 3463 3522 N
+ N AW W s n/a 24 3383 3463 3522 N
+ N AW Y b n/a 24 3383 3463 3526 N
+ N AW Y e n/a 24 3383 3463 3527 N
+ N AW Y i n/a 24 3383 3463 3526 N
+ N AW Y s n/a 24 3383 3463 3527 N
+ N AW Z b n/a 24 3383 3463 3510 N
+ N AW Z e n/a 24 3383 3463 3510 N
+ N AW Z i n/a 24 3383 3463 3510 N
+ N AW Z s n/a 24 3383 3463 3510 N
+ N AW ZH e n/a 24 3383 3463 3510 N
+ N AW ZH s n/a 24 3383 3463 3510 N
+ N AY AA b n/a 24 3405 3469 3550 N
+ N AY AA e n/a 24 3405 3489 3546 N
+ N AY AA i n/a 24 3405 3489 3550 N
+ N AY AA s n/a 24 3405 3489 3546 N
+ N AY AE b n/a 24 3405 3469 3561 N
+ N AY AE e n/a 24 3405 3489 3560 N
+ N AY AE i n/a 24 3405 3489 3561 N
+ N AY AE s n/a 24 3405 3489 3560 N
+ N AY AH b n/a 24 3405 3469 3549 N
+ N AY AH e n/a 24 3405 3489 3538 N
+ N AY AH i n/a 24 3405 3489 3539 N
+ N AY AH s n/a 24 3405 3489 3538 N
+ N AY AO b n/a 24 3405 3469 3551 N
+ N AY AO e n/a 24 3405 3489 3546 N
+ N AY AO i n/a 24 3405 3489 3551 N
+ N AY AO s n/a 24 3405 3489 3546 N
+ N AY AW b n/a 24 3405 3469 3563 N
+ N AY AW e n/a 24 3405 3489 3560 N
+ N AY AW i n/a 24 3405 3489 3563 N
+ N AY AW s n/a 24 3405 3489 3560 N
+ N AY AY b n/a 24 3405 3469 3549 N
+ N AY AY e n/a 24 3405 3489 3547 N
+ N AY AY i n/a 24 3405 3489 3549 N
+ N AY AY s n/a 24 3405 3489 3547 N
+ N AY B e n/a 24 3408 3462 3528 N
+ N AY B i n/a 24 3408 3462 3528 N
+ N AY B s n/a 24 3408 3462 3528 N
+ N AY CH e n/a 24 3408 3450 3509 N
+ N AY CH s n/a 24 3408 3450 3509 N
+ N AY D b n/a 24 3408 3462 3536 N
+ N AY D e n/a 24 3408 3462 3537 N
+ N AY D i n/a 24 3407 3461 3536 N
+ N AY D s n/a 24 3408 3462 3536 N
+ N AY DH e n/a 24 3408 3462 3518 N
+ N AY DH s n/a 24 3408 3462 3518 N
+ N AY EH b n/a 24 3405 3469 3561 N
+ N AY EH e n/a 24 3405 3489 3559 N
+ N AY EH i n/a 24 3405 3489 3561 N
+ N AY EH s n/a 24 3405 3489 3559 N
+ N AY ER b n/a 24 3405 3469 3552 N
+ N AY ER e n/a 24 3405 3489 3545 N
+ N AY ER i n/a 24 3405 3489 3545 N
+ N AY ER s n/a 24 3405 3489 3545 N
+ N AY EY b n/a 24 3405 3469 3562 N
+ N AY EY e n/a 24 3405 3489 3559 N
+ N AY EY i n/a 24 3405 3489 3562 N
+ N AY EY s n/a 24 3405 3489 3559 N
+ N AY F b n/a 24 3408 3450 3501 N
+ N AY F e n/a 24 3408 3450 3501 N
+ N AY F i n/a 24 3408 3450 3501 N
+ N AY F s n/a 24 3408 3450 3501 N
+ N AY G b n/a 24 3408 3462 3529 N
+ N AY G e n/a 24 3408 3462 3529 N
+ N AY G i n/a 24 3408 3462 3529 N
+ N AY G s n/a 24 3408 3462 3529 N
+ N AY HH e n/a 24 3408 3453 3525 N
+ N AY HH i n/a 24 3408 3453 3525 N
+ N AY HH s n/a 24 3408 3453 3525 N
+ N AY IH b n/a 24 3408 3471 3566 N
+ N AY IH e n/a 24 3408 3492 3557 N
+ N AY IH i n/a 24 3408 3492 3556 N
+ N AY IH s n/a 24 3408 3492 3557 N
+ N AY IY b n/a 24 3408 3471 3566 N
+ N AY IY e n/a 24 3408 3492 3565 N
+ N AY IY i n/a 24 3408 3492 3565 N
+ N AY IY s n/a 24 3408 3492 3565 N
+ N AY JH b n/a 24 3408 3462 3531 N
+ N AY JH e n/a 24 3408 3462 3531 N
+ N AY JH s n/a 24 3408 3462 3531 N
+ N AY K b n/a 24 3408 3448 3502 N
+ N AY K e n/a 24 3408 3448 3502 N
+ N AY K i n/a 24 3409 3450 3502 N
+ N AY K s n/a 24 3408 3448 3502 N
+ N AY L b n/a 24 3405 3462 3521 N
+ N AY L e n/a 24 3405 3462 3521 N
+ N AY L i n/a 24 3405 3462 3521 N
+ N AY L s n/a 24 3405 3462 3521 N
+ N AY M e n/a 24 3408 3462 3517 N
+ N AY M i n/a 24 3408 3462 3517 N
+ N AY M s n/a 24 3408 3462 3517 N
+ N AY N e n/a 24 3408 3462 3516 N
+ N AY N i n/a 24 3407 3461 3516 N
+ N AY N s n/a 24 3408 3462 3516 N
+ N AY NG e n/a 24 3408 3462 3516 N
+ N AY NG s n/a 24 3408 3462 3516 N
+ N AY OW b n/a 24 3405 3469 3552 N
+ N AY OW e n/a 24 3405 3489 3546 N
+ N AY OW i n/a 24 3405 3489 3553 N
+ N AY OW s n/a 24 3405 3489 3546 N
+ N AY OY b n/a 24 3405 3469 3551 N
+ N AY OY e n/a 24 3405 3489 3547 N
+ N AY OY s n/a 24 3405 3489 3547 N
+ N AY P b n/a 24 3408 3450 3503 N
+ N AY P e n/a 24 3408 3450 3503 N
+ N AY P i n/a 24 3409 3450 3503 N
+ N AY P s n/a 24 3408 3450 3503 N
+ N AY R b n/a 24 3405 3462 3523 N
+ N AY R e n/a 24 3405 3462 3523 N
+ N AY R i n/a 24 3405 3462 3523 N
+ N AY R s n/a 24 3405 3462 3523 N
+ N AY S b n/a 24 3408 3450 3497 N
+ N AY S e n/a 24 3408 3450 3497 N
+ N AY S i n/a 24 3408 3450 3498 N
+ N AY S s n/a 24 3408 3450 3497 N
+ N AY SH e n/a 24 3408 3450 3508 N
+ N AY SH i n/a 24 3408 3450 3508 N
+ N AY SH s n/a 24 3408 3450 3508 N
+ N AY SIL e n/a 24 3408 3431 3511 N
+ N AY SIL s n/a 24 3408 3431 3511 N
+ N AY T b n/a 24 3408 3449 3506 N
+ N AY T e n/a 24 3408 3449 3506 N
+ N AY T i n/a 24 3409 3449 3507 N
+ N AY T s n/a 24 3408 3449 3506 N
+ N AY TH e n/a 24 3408 3450 3501 N
+ N AY TH i n/a 24 3408 3450 3500 N
+ N AY TH s n/a 24 3408 3450 3501 N
+ N AY UH b n/a 24 3408 3471 3567 N
+ N AY UH e n/a 24 3408 3492 3557 N
+ N AY UH s n/a 24 3408 3492 3557 N
+ N AY UW b n/a 24 3408 3471 3567 N
+ N AY UW e n/a 24 3408 3492 3557 N
+ N AY UW i n/a 24 3408 3492 3558 N
+ N AY UW s n/a 24 3408 3492 3557 N
+ N AY V b n/a 24 3408 3462 3519 N
+ N AY V e n/a 24 3408 3462 3519 N
+ N AY V i n/a 24 3408 3462 3519 N
+ N AY V s n/a 24 3408 3462 3519 N
+ N AY W b n/a 24 3405 3462 3522 N
+ N AY W e n/a 24 3405 3462 3522 N
+ N AY W i n/a 24 3405 3462 3522 N
+ N AY W s n/a 24 3405 3462 3522 N
+ N AY Y b n/a 24 3408 3462 3526 N
+ N AY Y e n/a 24 3408 3462 3527 N
+ N AY Y i n/a 24 3408 3462 3527 N
+ N AY Y s n/a 24 3408 3462 3527 N
+ N AY Z b n/a 24 3408 3462 3510 N
+ N AY Z e n/a 24 3408 3462 3510 N
+ N AY Z i n/a 24 3408 3462 3510 N
+ N AY Z s n/a 24 3408 3462 3510 N
+ N AY ZH e n/a 24 3408 3462 3510 N
+ N AY ZH s n/a 24 3408 3462 3510 N
+ N B AA b n/a 24 3349 3472 3550 N
+ N B AA i n/a 24 3349 3472 3550 N
+ N B AA s n/a 24 3349 3472 3546 N
+ N B AE b n/a 24 3349 3479 3561 N
+ N B AE s n/a 24 3349 3479 3560 N
+ N B AH b n/a 24 3349 3475 3549 N
+ N B AH i n/a 24 3349 3478 3542 N
+ N B AH s n/a 24 3349 3478 3538 N
+ N B AO b n/a 24 3349 3472 3551 N
+ N B AO i n/a 24 3349 3472 3551 N
+ N B AO s n/a 24 3349 3472 3546 N
+ N B AW b n/a 24 3349 3479 3563 N
+ N B AW s n/a 24 3349 3479 3560 N
+ N B AY b n/a 24 3349 3472 3549 N
+ N B AY s n/a 24 3349 3472 3547 N
+ N B B i n/a 24 3349 3415 3528 N
+ N B B s n/a 24 3349 3415 3528 N
+ N B CH s n/a 24 3349 3447 3509 N
+ N B D b n/a 24 3349 3456 3533 N
+ N B D s n/a 24 3349 3456 3533 N
+ N B DH s n/a 24 3349 3423 3518 N
+ N B EH b n/a 24 3349 3475 3561 N
+ N B EH s n/a 24 3349 3478 3559 N
+ N B ER b n/a 24 3349 3475 3552 N
+ N B ER i n/a 24 3349 3478 3545 N
+ N B ER s n/a 24 3349 3478 3545 N
+ N B EY b n/a 24 3349 3475 3562 N
+ N B EY i n/a 24 3349 3478 3562 N
+ N B EY s n/a 24 3349 3478 3559 N
+ N B F b n/a 24 3349 3446 3501 N
+ N B F s n/a 24 3349 3446 3501 N
+ N B G b n/a 24 3349 3416 3528 N
+ N B G s n/a 24 3349 3416 3528 N
+ N B HH s n/a 24 3349 3453 3524 N
+ N B IH b n/a 24 3349 3470 3566 N
+ N B IH i n/a 24 3349 3478 3555 N
+ N B IH s n/a 24 3349 3478 3557 N
+ N B IY b n/a 24 3349 3470 3566 N
+ N B IY i n/a 24 3349 3478 3564 N
+ N B IY s n/a 24 3349 3478 3564 N
+ N B JH b n/a 24 3349 3420 3531 N
+ N B JH s n/a 24 3349 3417 3531 N
+ N B K b n/a 24 3349 3448 3502 N
+ N B K s n/a 24 3349 3448 3502 N
+ N B L b n/a 24 3349 3425 3521 N
+ N B L s n/a 24 3349 3425 3521 N
+ N B M s n/a 24 3349 3421 3517 N
+ N B N s n/a 24 3349 3456 3516 N
+ N B NG s n/a 24 3349 3421 3516 N
+ N B OW b n/a 24 3349 3475 3552 N
+ N B OW i n/a 24 3349 3478 3552 N
+ N B OW s n/a 24 3349 3478 3546 N
+ N B OY b n/a 24 3349 3472 3551 N
+ N B OY s n/a 24 3349 3472 3547 N
+ N B P b n/a 24 3349 3447 3503 N
+ N B P i n/a 24 3349 3441 3503 N
+ N B P s n/a 24 3349 3447 3503 N
+ N B R b n/a 24 3349 3426 3523 N
+ N B R s n/a 24 3349 3426 3523 N
+ N B S b n/a 24 3349 3446 3497 N
+ N B S s n/a 24 3349 3446 3497 N
+ N B SH s n/a 24 3349 3447 3508 N
+ N B SIL s n/a 24 3349 3430 3513 N
+ N B T b n/a 24 3349 3447 3505 N
+ N B T s n/a 24 3349 3447 3505 N
+ N B TH s n/a 24 3349 3446 3501 N
+ N B UH b n/a 24 3349 3470 3567 N
+ N B UH s n/a 24 3349 3478 3557 N
+ N B UW b n/a 24 3349 3470 3567 N
+ N B UW s n/a 24 3349 3478 3557 N
+ N B V b n/a 24 3349 3415 3519 N
+ N B V s n/a 24 3349 3415 3519 N
+ N B W b n/a 24 3349 3425 3522 N
+ N B W s n/a 24 3349 3425 3522 N
+ N B Y b n/a 24 3349 3420 3526 N
+ N B Y s n/a 24 3349 3418 3527 N
+ N B Z b n/a 24 3349 3435 3510 N
+ N B Z s n/a 24 3349 3435 3510 N
+ N B ZH s n/a 24 3349 3415 3510 N
+ N CH AA b n/a 24 3347 3473 3548 N
+ N CH AA s n/a 24 3347 3473 3546 N
+ N CH AE b n/a 24 3347 3479 3561 N
+ N CH AE s n/a 24 3347 3479 3560 N
+ N CH AH b n/a 24 3347 3475 3549 N
+ N CH AH i n/a 24 3347 3478 3542 N
+ N CH AH s n/a 24 3347 3478 3538 N
+ N CH AO b n/a 24 3347 3473 3551 N
+ N CH AO s n/a 24 3347 3473 3546 N
+ N CH AW b n/a 24 3347 3479 3563 N
+ N CH AW s n/a 24 3347 3479 3560 N
+ N CH AY b n/a 24 3347 3473 3549 N
+ N CH AY i n/a 24 3347 3474 3549 N
+ N CH AY s n/a 24 3347 3473 3547 N
+ N CH B s n/a 24 3347 3415 3528 N
+ N CH CH s n/a 24 3347 3447 3509 N
+ N CH D b n/a 24 3347 3456 3533 N
+ N CH D s n/a 24 3347 3456 3533 N
+ N CH DH s n/a 24 3347 3423 3518 N
+ N CH EH b n/a 24 3347 3475 3561 N
+ N CH EH i n/a 24 3347 3478 3561 N
+ N CH EH s n/a 24 3347 3478 3559 N
+ N CH ER b n/a 24 3347 3475 3552 N
+ N CH ER i n/a 24 3347 3478 3545 N
+ N CH ER s n/a 24 3347 3478 3545 N
+ N CH EY b n/a 24 3347 3475 3562 N
+ N CH EY s n/a 24 3347 3478 3559 N
+ N CH F b n/a 24 3347 3446 3501 N
+ N CH F s n/a 24 3347 3446 3501 N
+ N CH G b n/a 24 3347 3416 3528 N
+ N CH G s n/a 24 3347 3416 3528 N
+ N CH HH s n/a 24 3347 3453 3524 N
+ N CH IH b n/a 24 3347 3470 3566 N
+ N CH IH i n/a 24 3347 3478 3555 N
+ N CH IH s n/a 24 3347 3478 3557 N
+ N CH IY b n/a 24 3347 3470 3566 N
+ N CH IY i n/a 24 3347 3478 3564 N
+ N CH IY s n/a 24 3347 3478 3564 N
+ N CH JH b n/a 24 3347 3420 3531 N
+ N CH JH s n/a 24 3347 3417 3531 N
+ N CH K b n/a 24 3347 3448 3502 N
+ N CH K s n/a 24 3347 3448 3502 N
+ N CH L b n/a 24 3347 3425 3521 N
+ N CH L s n/a 24 3347 3425 3521 N
+ N CH M s n/a 24 3347 3421 3517 N
+ N CH N s n/a 24 3347 3456 3516 N
+ N CH NG s n/a 24 3347 3421 3516 N
+ N CH OW b n/a 24 3347 3475 3552 N
+ N CH OW s n/a 24 3347 3478 3546 N
+ N CH OY b n/a 24 3347 3473 3551 N
+ N CH OY s n/a 24 3347 3473 3547 N
+ N CH P b n/a 24 3347 3447 3503 N
+ N CH P s n/a 24 3347 3447 3503 N
+ N CH R b n/a 24 3347 3426 3523 N
+ N CH R s n/a 24 3347 3426 3523 N
+ N CH S b n/a 24 3347 3446 3497 N
+ N CH S s n/a 24 3347 3446 3497 N
+ N CH SH s n/a 24 3347 3447 3508 N
+ N CH SIL s n/a 24 3347 3430 3513 N
+ N CH T b n/a 24 3347 3447 3505 N
+ N CH T s n/a 24 3347 3447 3505 N
+ N CH TH s n/a 24 3347 3446 3501 N
+ N CH UH b n/a 24 3347 3470 3567 N
+ N CH UH s n/a 24 3347 3478 3557 N
+ N CH UW b n/a 24 3347 3470 3567 N
+ N CH UW s n/a 24 3347 3478 3557 N
+ N CH V b n/a 24 3347 3415 3519 N
+ N CH V s n/a 24 3347 3415 3519 N
+ N CH W b n/a 24 3347 3425 3522 N
+ N CH W s n/a 24 3347 3425 3522 N
+ N CH Y b n/a 24 3347 3420 3526 N
+ N CH Y s n/a 24 3347 3418 3527 N
+ N CH Z b n/a 24 3347 3435 3510 N
+ N CH Z s n/a 24 3347 3435 3510 N
+ N CH ZH s n/a 24 3347 3415 3510 N
+ N D AA b n/a 24 3349 3472 3550 N
+ N D AA e n/a 24 3349 3472 3546 N
+ N D AA i n/a 24 3349 3472 3550 N
+ N D AA s n/a 24 3349 3472 3546 N
+ N D AE b n/a 24 3349 3479 3561 N
+ N D AE e n/a 24 3349 3479 3560 N
+ N D AE i n/a 24 3349 3479 3561 N
+ N D AE s n/a 24 3349 3479 3560 N
+ N D AH b n/a 24 3349 3477 3549 N
+ N D AH e n/a 24 3349 3478 3538 N
+ N D AH i n/a 24 3349 3478 3542 N
+ N D AH s n/a 24 3349 3478 3538 N
+ N D AO b n/a 24 3349 3472 3551 N
+ N D AO e n/a 24 3349 3472 3546 N
+ N D AO i n/a 24 3349 3472 3551 N
+ N D AO s n/a 24 3349 3472 3546 N
+ N D AW b n/a 24 3349 3479 3563 N
+ N D AW e n/a 24 3349 3479 3560 N
+ N D AW s n/a 24 3349 3479 3560 N
+ N D AY b n/a 24 3349 3472 3549 N
+ N D AY e n/a 24 3349 3472 3547 N
+ N D AY i n/a 24 3349 3472 3549 N
+ N D AY s n/a 24 3349 3472 3547 N
+ N D B e n/a 24 3349 3415 3528 N
+ N D B s n/a 24 3349 3415 3528 N
+ N D CH e n/a 24 3349 3447 3509 N
+ N D CH s n/a 24 3349 3447 3509 N
+ N D D b n/a 24 3349 3456 3533 N
+ N D D e n/a 24 3349 3456 3533 N
+ N D D i n/a 24 3349 3456 3532 N
+ N D D s n/a 24 3349 3456 3533 N
+ N D DH e n/a 24 3349 3423 3518 N
+ N D DH s n/a 24 3349 3423 3518 N
+ N D EH b n/a 24 3349 3476 3561 N
+ N D EH e n/a 24 3349 3478 3559 N
+ N D EH i n/a 24 3349 3478 3561 N
+ N D EH s n/a 24 3349 3478 3559 N
+ N D ER b n/a 24 3349 3477 3552 N
+ N D ER e n/a 24 3349 3478 3545 N
+ N D ER i n/a 24 3349 3478 3545 N
+ N D ER s n/a 24 3349 3478 3545 N
+ N D EY b n/a 24 3349 3476 3562 N
+ N D EY e n/a 24 3349 3478 3559 N
+ N D EY i n/a 24 3349 3478 3562 N
+ N D EY s n/a 24 3349 3478 3559 N
+ N D F b n/a 24 3349 3446 3501 N
+ N D F e n/a 24 3349 3446 3501 N
+ N D F s n/a 24 3349 3446 3501 N
+ N D G b n/a 24 3349 3416 3528 N
+ N D G e n/a 24 3349 3416 3528 N
+ N D G s n/a 24 3349 3416 3528 N
+ N D HH e n/a 24 3349 3453 3524 N
+ N D HH s n/a 24 3349 3453 3524 N
+ N D IH b n/a 24 3349 3470 3566 N
+ N D IH e n/a 24 3349 3478 3557 N
+ N D IH i n/a 24 3349 3478 3555 N
+ N D IH s n/a 24 3349 3478 3557 N
+ N D IY b n/a 24 3349 3470 3566 N
+ N D IY e n/a 24 3349 3478 3564 N
+ N D IY i n/a 24 3349 3478 3564 N
+ N D IY s n/a 24 3349 3478 3564 N
+ N D JH b n/a 24 3349 3420 3531 N
+ N D JH e n/a 24 3349 3417 3531 N
+ N D JH s n/a 24 3349 3417 3531 N
+ N D K b n/a 24 3349 3448 3502 N
+ N D K e n/a 24 3349 3448 3502 N
+ N D K s n/a 24 3349 3448 3502 N
+ N D L b n/a 24 3349 3425 3521 N
+ N D L e n/a 24 3349 3425 3521 N
+ N D L s n/a 24 3349 3425 3521 N
+ N D M e n/a 24 3349 3421 3517 N
+ N D M s n/a 24 3349 3421 3517 N
+ N D N e n/a 24 3349 3456 3516 N
+ N D N s n/a 24 3349 3456 3516 N
+ N D NG e n/a 24 3349 3421 3516 N
+ N D NG s n/a 24 3349 3421 3516 N
+ N D OW b n/a 24 3349 3477 3553 N
+ N D OW e n/a 24 3349 3478 3546 N
+ N D OW i n/a 24 3349 3478 3553 N
+ N D OW s n/a 24 3349 3478 3546 N
+ N D OY b n/a 24 3349 3472 3551 N
+ N D OY e n/a 24 3349 3472 3547 N
+ N D OY s n/a 24 3349 3472 3547 N
+ N D P b n/a 24 3349 3447 3503 N
+ N D P e n/a 24 3349 3447 3503 N
+ N D P s n/a 24 3349 3447 3503 N
+ N D R b n/a 24 3349 3426 3523 N
+ N D R e n/a 24 3349 3426 3523 N
+ N D R s n/a 24 3349 3426 3523 N
+ N D S b n/a 24 3349 3446 3497 N
+ N D S e n/a 24 3349 3446 3497 N
+ N D S s n/a 24 3349 3446 3497 N
+ N D SH e n/a 24 3349 3447 3508 N
+ N D SH s n/a 24 3349 3447 3508 N
+ N D SIL e n/a 24 3349 3430 3513 N
+ N D SIL s n/a 24 3349 3430 3513 N
+ N D T b n/a 24 3349 3447 3505 N
+ N D T e n/a 24 3349 3447 3505 N
+ N D T i n/a 24 3349 3442 3506 N
+ N D T s n/a 24 3349 3447 3505 N
+ N D TH e n/a 24 3349 3446 3501 N
+ N D TH s n/a 24 3349 3446 3501 N
+ N D UH b n/a 24 3349 3470 3567 N
+ N D UH e n/a 24 3349 3478 3557 N
+ N D UH i n/a 24 3349 3478 3555 N
+ N D UH s n/a 24 3349 3478 3557 N
+ N D UW b n/a 24 3349 3470 3567 N
+ N D UW e n/a 24 3349 3478 3557 N
+ N D UW i n/a 24 3349 3478 3558 N
+ N D UW s n/a 24 3349 3478 3557 N
+ N D V b n/a 24 3349 3415 3519 N
+ N D V e n/a 24 3349 3415 3519 N
+ N D V s n/a 24 3349 3415 3519 N
+ N D W b n/a 24 3349 3425 3522 N
+ N D W e n/a 24 3349 3425 3522 N
+ N D W s n/a 24 3349 3425 3522 N
+ N D Y b n/a 24 3349 3420 3526 N
+ N D Y e n/a 24 3349 3418 3527 N
+ N D Y s n/a 24 3349 3418 3527 N
+ N D Z b n/a 24 3349 3435 3510 N
+ N D Z e n/a 24 3349 3435 3510 N
+ N D Z i n/a 24 3349 3435 3510 N
+ N D Z s n/a 24 3349 3435 3510 N
+ N D ZH e n/a 24 3349 3415 3510 N
+ N D ZH s n/a 24 3349 3415 3510 N
+ N DH AA b n/a 24 3350 3473 3548 N
+ N DH AA s n/a 24 3350 3473 3546 N
+ N DH AE b n/a 24 3350 3478 3561 N
+ N DH AE s n/a 24 3350 3478 3560 N
+ N DH AH b n/a 24 3350 3475 3549 N
+ N DH AH i n/a 24 3350 3478 3542 N
+ N DH AH s n/a 24 3350 3478 3538 N
+ N DH AO b n/a 24 3350 3473 3551 N
+ N DH AO s n/a 24 3350 3473 3546 N
+ N DH AW b n/a 24 3350 3478 3563 N
+ N DH AW s n/a 24 3350 3478 3560 N
+ N DH AY b n/a 24 3350 3473 3549 N
+ N DH AY s n/a 24 3350 3473 3547 N
+ N DH B s n/a 24 3350 3415 3528 N
+ N DH CH s n/a 24 3350 3447 3509 N
+ N DH D b n/a 24 3350 3456 3533 N
+ N DH D s n/a 24 3350 3456 3533 N
+ N DH DH s n/a 24 3350 3423 3518 N
+ N DH EH b n/a 24 3350 3475 3561 N
+ N DH EH s n/a 24 3350 3478 3559 N
+ N DH ER b n/a 24 3350 3475 3552 N
+ N DH ER s n/a 24 3350 3478 3545 N
+ N DH EY b n/a 24 3350 3475 3562 N
+ N DH EY s n/a 24 3350 3478 3559 N
+ N DH F b n/a 24 3350 3446 3501 N
+ N DH F s n/a 24 3350 3446 3501 N
+ N DH G b n/a 24 3350 3416 3528 N
+ N DH G s n/a 24 3350 3416 3528 N
+ N DH HH s n/a 24 3350 3453 3524 N
+ N DH IH b n/a 24 3350 3470 3566 N
+ N DH IH s n/a 24 3350 3478 3557 N
+ N DH IY b n/a 24 3350 3470 3566 N
+ N DH IY s n/a 24 3350 3478 3564 N
+ N DH JH b n/a 24 3350 3420 3531 N
+ N DH JH s n/a 24 3350 3417 3531 N
+ N DH K b n/a 24 3350 3448 3502 N
+ N DH K s n/a 24 3350 3448 3502 N
+ N DH L b n/a 24 3350 3425 3521 N
+ N DH L s n/a 24 3350 3425 3521 N
+ N DH M s n/a 24 3350 3421 3517 N
+ N DH N s n/a 24 3350 3456 3516 N
+ N DH NG s n/a 24 3350 3421 3516 N
+ N DH OW b n/a 24 3350 3475 3552 N
+ N DH OW s n/a 24 3350 3478 3546 N
+ N DH OY b n/a 24 3350 3473 3551 N
+ N DH OY s n/a 24 3350 3473 3547 N
+ N DH P b n/a 24 3350 3447 3503 N
+ N DH P s n/a 24 3350 3447 3503 N
+ N DH R b n/a 24 3350 3426 3523 N
+ N DH R s n/a 24 3350 3426 3523 N
+ N DH S b n/a 24 3350 3446 3497 N
+ N DH S s n/a 24 3350 3446 3497 N
+ N DH SH s n/a 24 3350 3447 3508 N
+ N DH SIL s n/a 24 3350 3430 3513 N
+ N DH T b n/a 24 3350 3447 3505 N
+ N DH T s n/a 24 3350 3447 3505 N
+ N DH TH s n/a 24 3350 3446 3501 N
+ N DH UH b n/a 24 3350 3470 3567 N
+ N DH UH s n/a 24 3350 3478 3557 N
+ N DH UW b n/a 24 3350 3470 3567 N
+ N DH UW s n/a 24 3350 3478 3557 N
+ N DH V b n/a 24 3350 3415 3519 N
+ N DH V s n/a 24 3350 3415 3519 N
+ N DH W b n/a 24 3350 3425 3522 N
+ N DH W s n/a 24 3350 3425 3522 N
+ N DH Y b n/a 24 3350 3420 3526 N
+ N DH Y s n/a 24 3350 3418 3527 N
+ N DH Z b n/a 24 3350 3435 3510 N
+ N DH Z s n/a 24 3350 3435 3510 N
+ N DH ZH s n/a 24 3350 3415 3510 N
+ N EH AA b n/a 24 3394 3466 3548 N
+ N EH AA e n/a 24 3394 3487 3546 N
+ N EH AA i n/a 24 3393 3487 3548 N
+ N EH AA s n/a 24 3394 3487 3546 N
+ N EH AE b n/a 24 3393 3466 3561 N
+ N EH AE e n/a 24 3393 3487 3560 N
+ N EH AE i n/a 24 3393 3487 3561 N
+ N EH AE s n/a 24 3393 3487 3560 N
+ N EH AH b n/a 24 3393 3466 3549 N
+ N EH AH e n/a 24 3393 3487 3538 N
+ N EH AH i n/a 24 3394 3488 3539 N
+ N EH AH s n/a 24 3393 3487 3538 N
+ N EH AO b n/a 24 3394 3466 3551 N
+ N EH AO e n/a 24 3394 3487 3546 N
+ N EH AO i n/a 24 3393 3487 3551 N
+ N EH AO s n/a 24 3394 3487 3546 N
+ N EH AW b n/a 24 3393 3466 3563 N
+ N EH AW e n/a 24 3393 3487 3560 N
+ N EH AW i n/a 24 3393 3487 3563 N
+ N EH AW s n/a 24 3393 3487 3560 N
+ N EH AY b n/a 24 3404 3466 3549 N
+ N EH AY e n/a 24 3404 3487 3547 N
+ N EH AY i n/a 24 3404 3487 3549 N
+ N EH AY s n/a 24 3404 3487 3547 N
+ N EH B e n/a 24 3391 3415 3528 N
+ N EH B i n/a 24 3391 3415 3528 N
+ N EH B s n/a 24 3391 3415 3528 N
+ N EH CH e n/a 24 3390 3447 3509 N
+ N EH CH i n/a 24 3390 3442 3508 N
+ N EH CH s n/a 24 3390 3447 3509 N
+ N EH D b n/a 24 3391 3456 3533 N
+ N EH D e n/a 24 3391 3456 3533 N
+ N EH D i n/a 24 3391 3456 3533 N
+ N EH D s n/a 24 3391 3456 3533 N
+ N EH DH e n/a 24 3395 3422 3518 N
+ N EH DH i n/a 24 3393 3422 3518 N
+ N EH DH s n/a 24 3395 3422 3518 N
+ N EH EH b n/a 24 3393 3466 3561 N
+ N EH EH e n/a 24 3393 3487 3559 N
+ N EH EH i n/a 24 3393 3487 3561 N
+ N EH EH s n/a 24 3393 3487 3559 N
+ N EH ER b n/a 24 3394 3466 3552 N
+ N EH ER e n/a 24 3394 3487 3545 N
+ N EH ER i n/a 24 3394 3488 3545 N
+ N EH ER s n/a 24 3394 3487 3545 N
+ N EH EY b n/a 24 3405 3466 3562 N
+ N EH EY e n/a 24 3405 3487 3559 N
+ N EH EY i n/a 24 3405 3487 3562 N
+ N EH EY s n/a 24 3405 3487 3559 N
+ N EH F b n/a 24 3393 3446 3501 N
+ N EH F e n/a 24 3393 3446 3501 N
+ N EH F i n/a 24 3393 3441 3501 N
+ N EH F s n/a 24 3393 3446 3501 N
+ N EH G b n/a 24 3393 3416 3529 N
+ N EH G e n/a 24 3393 3416 3529 N
+ N EH G i n/a 24 3392 3416 3529 N
+ N EH G s n/a 24 3393 3416 3529 N
+ N EH HH e n/a 24 3393 3453 3524 N
+ N EH HH i n/a 24 3393 3441 3524 N
+ N EH HH s n/a 24 3393 3453 3524 N
+ N EH IH b n/a 24 3393 3471 3566 N
+ N EH IH e n/a 24 3393 3494 3557 N
+ N EH IH i n/a 24 3394 3494 3555 N
+ N EH IH s n/a 24 3393 3494 3557 N
+ N EH IY b n/a 24 3406 3471 3566 N
+ N EH IY e n/a 24 3406 3491 3565 N
+ N EH IY i n/a 24 3406 3491 3565 N
+ N EH IY s n/a 24 3406 3491 3565 N
+ N EH JH b n/a 24 3391 3420 3531 N
+ N EH JH e n/a 24 3391 3417 3531 N
+ N EH JH i n/a 24 3391 3417 3531 N
+ N EH JH s n/a 24 3391 3417 3531 N
+ N EH K b n/a 24 3393 3448 3502 N
+ N EH K e n/a 24 3393 3448 3502 N
+ N EH K i n/a 24 3392 3442 3502 N
+ N EH K s n/a 24 3393 3448 3502 N
+ N EH L b n/a 24 3394 3425 3521 N
+ N EH L e n/a 24 3394 3425 3521 N
+ N EH L i n/a 24 3393 3425 3521 N
+ N EH L s n/a 24 3394 3425 3521 N
+ N EH M e n/a 24 3393 3421 3517 N
+ N EH M i n/a 24 3393 3421 3517 N
+ N EH M s n/a 24 3393 3421 3517 N
+ N EH N e n/a 24 3393 3456 3516 N
+ N EH N i n/a 24 3393 3456 3516 N
+ N EH N s n/a 24 3393 3456 3516 N
+ N EH NG e n/a 24 3393 3421 3516 N
+ N EH NG s n/a 24 3393 3421 3516 N
+ N EH OW b n/a 24 3394 3466 3552 N
+ N EH OW e n/a 24 3394 3487 3546 N
+ N EH OW i n/a 24 3393 3487 3552 N
+ N EH OW s n/a 24 3394 3487 3546 N
+ N EH OY b n/a 24 3404 3466 3551 N
+ N EH OY e n/a 24 3404 3487 3547 N
+ N EH OY i n/a 24 3404 3487 3551 N
+ N EH OY s n/a 24 3404 3487 3547 N
+ N EH P b n/a 24 3391 3447 3503 N
+ N EH P e n/a 24 3391 3447 3503 N
+ N EH P i n/a 24 3390 3441 3503 N
+ N EH P s n/a 24 3391 3447 3503 N
+ N EH R b n/a 24 3394 3426 3523 N
+ N EH R e n/a 24 3394 3426 3523 N
+ N EH R i n/a 24 3394 3426 3523 N
+ N EH R s n/a 24 3394 3426 3523 N
+ N EH S b n/a 24 3395 3446 3497 N
+ N EH S e n/a 24 3395 3446 3497 N
+ N EH S i n/a 24 3397 3443 3499 N
+ N EH S s n/a 24 3395 3446 3497 N
+ N EH SH e n/a 24 3390 3447 3508 N
+ N EH SH i n/a 24 3390 3442 3508 N
+ N EH SH s n/a 24 3390 3447 3508 N
+ N EH SIL e n/a 24 3396 3433 3513 N
+ N EH SIL s n/a 24 3396 3433 3513 N
+ N EH T b n/a 24 3391 3447 3505 N
+ N EH T e n/a 24 3391 3447 3505 N
+ N EH T i n/a 24 3389 3441 3505 N
+ N EH T s n/a 24 3391 3447 3505 N
+ N EH TH e n/a 24 3395 3446 3501 N
+ N EH TH i n/a 24 3393 3441 3500 N
+ N EH TH s n/a 24 3395 3446 3501 N
+ N EH UH b n/a 24 3394 3471 3567 N
+ N EH UH e n/a 24 3394 3494 3557 N
+ N EH UH i n/a 24 3393 3494 3555 N
+ N EH UH s n/a 24 3394 3494 3557 N
+ N EH UW b n/a 24 3394 3471 3567 N
+ N EH UW e n/a 24 3394 3494 3557 N
+ N EH UW i n/a 24 3393 3494 3558 N
+ N EH UW s n/a 24 3394 3494 3557 N
+ N EH V b n/a 24 3393 3415 3519 N
+ N EH V e n/a 24 3393 3415 3519 N
+ N EH V i n/a 24 3393 3415 3519 N
+ N EH V s n/a 24 3393 3415 3519 N
+ N EH W b n/a 24 3394 3425 3522 N
+ N EH W e n/a 24 3394 3425 3522 N
+ N EH W i n/a 24 3393 3425 3522 N
+ N EH W s n/a 24 3394 3425 3522 N
+ N EH Y b n/a 24 3406 3420 3526 N
+ N EH Y e n/a 24 3406 3418 3527 N
+ N EH Y i n/a 24 3406 3418 3527 N
+ N EH Y s n/a 24 3406 3418 3527 N
+ N EH Z b n/a 24 3395 3435 3510 N
+ N EH Z e n/a 24 3395 3435 3510 N
+ N EH Z i n/a 24 3395 3435 3510 N
+ N EH Z s n/a 24 3395 3435 3510 N
+ N EH ZH e n/a 24 3395 3415 3510 N
+ N EH ZH i n/a 24 3395 3415 3510 N
+ N EH ZH s n/a 24 3395 3415 3510 N
+ N ER AA b n/a 24 3375 3466 3548 N
+ N ER AA e n/a 24 3373 3486 3546 N
+ N ER AA i n/a 24 3373 3486 3548 N
+ N ER AA s n/a 24 3373 3486 3546 N
+ N ER AE b n/a 24 3375 3466 3561 N
+ N ER AE e n/a 24 3373 3486 3560 N
+ N ER AE i n/a 24 3373 3486 3561 N
+ N ER AE s n/a 24 3373 3486 3560 N
+ N ER AH b n/a 24 3375 3466 3549 N
+ N ER AH e n/a 24 3373 3486 3538 N
+ N ER AH i n/a 24 3373 3486 3543 N
+ N ER AH s n/a 24 3373 3486 3538 N
+ N ER AO b n/a 24 3375 3466 3551 N
+ N ER AO e n/a 24 3373 3486 3546 N
+ N ER AO i n/a 24 3373 3486 3551 N
+ N ER AO s n/a 24 3373 3486 3546 N
+ N ER AW b n/a 24 3375 3466 3563 N
+ N ER AW e n/a 24 3373 3486 3560 N
+ N ER AW i n/a 24 3373 3486 3563 N
+ N ER AW s n/a 24 3373 3486 3560 N
+ N ER AY b n/a 24 3375 3466 3549 N
+ N ER AY e n/a 24 3373 3486 3547 N
+ N ER AY i n/a 24 3373 3486 3549 N
+ N ER AY s n/a 24 3373 3486 3547 N
+ N ER B e n/a 24 3373 3415 3528 N
+ N ER B i n/a 24 3373 3415 3528 N
+ N ER B s n/a 24 3373 3415 3528 N
+ N ER CH e n/a 24 3373 3447 3509 N
+ N ER CH i n/a 24 3373 3444 3508 N
+ N ER CH s n/a 24 3373 3447 3509 N
+ N ER D b n/a 24 3375 3464 3536 N
+ N ER D e n/a 24 3373 3464 3537 N
+ N ER D i n/a 24 3373 3464 3536 N
+ N ER D s n/a 24 3373 3464 3536 N
+ N ER DH e n/a 24 3373 3423 3518 N
+ N ER DH s n/a 24 3373 3423 3518 N
+ N ER EH b n/a 24 3375 3466 3561 N
+ N ER EH e n/a 24 3373 3486 3559 N
+ N ER EH i n/a 24 3373 3486 3561 N
+ N ER EH s n/a 24 3373 3486 3559 N
+ N ER ER b n/a 24 3375 3466 3552 N
+ N ER ER e n/a 24 3373 3486 3545 N
+ N ER ER i n/a 24 3373 3486 3545 N
+ N ER ER s n/a 24 3373 3486 3545 N
+ N ER EY b n/a 24 3375 3466 3562 N
+ N ER EY e n/a 24 3373 3486 3559 N
+ N ER EY i n/a 24 3373 3486 3562 N
+ N ER EY s n/a 24 3373 3486 3559 N
+ N ER F b n/a 24 3375 3446 3500 N
+ N ER F e n/a 24 3373 3446 3500 N
+ N ER F i n/a 24 3373 3444 3500 N
+ N ER F s n/a 24 3373 3446 3500 N
+ N ER G b n/a 24 3375 3416 3528 N
+ N ER G e n/a 24 3373 3416 3528 N
+ N ER G s n/a 24 3373 3416 3528 N
+ N ER HH e n/a 24 3373 3453 3525 N
+ N ER HH i n/a 24 3373 3445 3525 N
+ N ER HH s n/a 24 3373 3453 3525 N
+ N ER IH b n/a 24 3375 3471 3566 N
+ N ER IH e n/a 24 3373 3486 3555 N
+ N ER IH i n/a 24 3373 3486 3555 N
+ N ER IH s n/a 24 3373 3486 3555 N
+ N ER IY b n/a 24 3375 3471 3566 N
+ N ER IY e n/a 24 3373 3493 3565 N
+ N ER IY i n/a 24 3373 3493 3565 N
+ N ER IY s n/a 24 3373 3493 3565 N
+ N ER JH b n/a 24 3375 3420 3531 N
+ N ER JH e n/a 24 3373 3417 3531 N
+ N ER JH s n/a 24 3373 3417 3531 N
+ N ER K b n/a 24 3375 3448 3502 N
+ N ER K e n/a 24 3373 3448 3502 N
+ N ER K i n/a 24 3373 3444 3502 N
+ N ER K s n/a 24 3373 3448 3502 N
+ N ER L b n/a 24 3375 3425 3521 N
+ N ER L e n/a 24 3373 3425 3521 N
+ N ER L i n/a 24 3373 3425 3521 N
+ N ER L s n/a 24 3373 3425 3521 N
+ N ER M e n/a 24 3373 3421 3517 N
+ N ER M i n/a 24 3373 3421 3517 N
+ N ER M s n/a 24 3373 3421 3517 N
+ N ER N e n/a 24 3373 3464 3516 N
+ N ER N i n/a 24 3373 3464 3516 N
+ N ER N s n/a 24 3373 3464 3516 N
+ N ER NG e n/a 24 3373 3421 3516 N
+ N ER NG s n/a 24 3373 3421 3516 N
+ N ER OW b n/a 24 3375 3466 3552 N
+ N ER OW e n/a 24 3373 3486 3546 N
+ N ER OW i n/a 24 3373 3486 3552 N
+ N ER OW s n/a 24 3373 3486 3546 N
+ N ER OY b n/a 24 3375 3466 3551 N
+ N ER OY e n/a 24 3373 3486 3547 N
+ N ER OY s n/a 24 3373 3486 3547 N
+ N ER P b n/a 24 3375 3447 3504 N
+ N ER P e n/a 24 3373 3447 3506 N
+ N ER P i n/a 24 3373 3444 3504 N
+ N ER P s n/a 24 3373 3447 3504 N
+ N ER R b n/a 24 3375 3427 3523 N
+ N ER R e n/a 24 3373 3427 3523 N
+ N ER R i n/a 24 3373 3426 3523 N
+ N ER R s n/a 24 3373 3427 3523 N
+ N ER S b n/a 24 3375 3446 3497 N
+ N ER S e n/a 24 3373 3446 3497 N
+ N ER S i n/a 24 3373 3444 3499 N
+ N ER S s n/a 24 3373 3446 3497 N
+ N ER SH e n/a 24 3373 3447 3508 N
+ N ER SH i n/a 24 3373 3444 3508 N
+ N ER SH s n/a 24 3373 3447 3508 N
+ N ER SIL e n/a 24 3373 3430 3511 N
+ N ER SIL s n/a 24 3373 3430 3511 N
+ N ER T b n/a 24 3375 3447 3504 N
+ N ER T e n/a 24 3373 3447 3506 N
+ N ER T i n/a 24 3373 3444 3504 N
+ N ER T s n/a 24 3373 3447 3504 N
+ N ER TH e n/a 24 3373 3446 3500 N
+ N ER TH s n/a 24 3373 3446 3500 N
+ N ER UH b n/a 24 3375 3471 3567 N
+ N ER UH e n/a 24 3375 3486 3555 N
+ N ER UH s n/a 24 3375 3486 3555 N
+ N ER UW b n/a 24 3375 3471 3567 N
+ N ER UW e n/a 24 3375 3483 3555 N
+ N ER UW i n/a 24 3375 3482 3558 N
+ N ER UW s n/a 24 3375 3483 3555 N
+ N ER V b n/a 24 3375 3415 3519 N
+ N ER V e n/a 24 3373 3415 3519 N
+ N ER V s n/a 24 3373 3415 3519 N
+ N ER W b n/a 24 3375 3425 3522 N
+ N ER W e n/a 24 3373 3425 3522 N
+ N ER W i n/a 24 3373 3425 3522 N
+ N ER W s n/a 24 3373 3425 3522 N
+ N ER Y b n/a 24 3375 3420 3526 N
+ N ER Y e n/a 24 3373 3418 3527 N
+ N ER Y i n/a 24 3373 3418 3526 N
+ N ER Y s n/a 24 3373 3418 3527 N
+ N ER Z b n/a 24 3375 3435 3510 N
+ N ER Z e n/a 24 3373 3435 3510 N
+ N ER Z i n/a 24 3373 3435 3510 N
+ N ER Z s n/a 24 3373 3435 3510 N
+ N ER ZH e n/a 24 3373 3415 3510 N
+ N ER ZH s n/a 24 3373 3415 3510 N
+ N EY AA b n/a 24 3356 3469 3550 N
+ N EY AA e n/a 24 3352 3496 3546 N
+ N EY AA i n/a 24 3352 3496 3550 N
+ N EY AA s n/a 24 3352 3496 3546 N
+ N EY AE b n/a 24 3356 3469 3561 N
+ N EY AE e n/a 24 3352 3496 3560 N
+ N EY AE i n/a 24 3352 3496 3561 N
+ N EY AE s n/a 24 3352 3496 3560 N
+ N EY AH b n/a 24 3356 3469 3549 N
+ N EY AH e n/a 24 3352 3496 3538 N
+ N EY AH i n/a 24 3352 3496 3539 N
+ N EY AH s n/a 24 3352 3496 3538 N
+ N EY AO b n/a 24 3356 3469 3551 N
+ N EY AO e n/a 24 3352 3496 3546 N
+ N EY AO i n/a 24 3352 3496 3551 N
+ N EY AO s n/a 24 3352 3496 3546 N
+ N EY AW b n/a 24 3356 3469 3563 N
+ N EY AW e n/a 24 3352 3496 3560 N
+ N EY AW i n/a 24 3352 3496 3563 N
+ N EY AW s n/a 24 3352 3496 3560 N
+ N EY AY b n/a 24 3356 3469 3549 N
+ N EY AY e n/a 24 3352 3492 3547 N
+ N EY AY i n/a 24 3352 3492 3549 N
+ N EY AY s n/a 24 3352 3492 3547 N
+ N EY B e n/a 24 3352 3416 3528 N
+ N EY B i n/a 24 3352 3416 3528 N
+ N EY B s n/a 24 3352 3416 3528 N
+ N EY CH e n/a 24 3353 3447 3509 N
+ N EY CH i n/a 24 3353 3451 3508 N
+ N EY CH s n/a 24 3353 3447 3509 N
+ N EY D b n/a 24 3356 3459 3537 N
+ N EY D e n/a 24 3352 3459 3537 N
+ N EY D i n/a 24 3352 3459 3537 N
+ N EY D s n/a 24 3352 3459 3537 N
+ N EY DH e n/a 24 3352 3424 3518 N
+ N EY DH s n/a 24 3352 3424 3518 N
+ N EY EH b n/a 24 3356 3469 3561 N
+ N EY EH e n/a 24 3352 3496 3559 N
+ N EY EH i n/a 24 3352 3496 3561 N
+ N EY EH s n/a 24 3352 3496 3559 N
+ N EY ER b n/a 24 3356 3469 3552 N
+ N EY ER e n/a 24 3352 3496 3545 N
+ N EY ER i n/a 24 3352 3496 3545 N
+ N EY ER s n/a 24 3352 3496 3545 N
+ N EY EY b n/a 24 3356 3469 3562 N
+ N EY EY e n/a 24 3352 3492 3559 N
+ N EY EY i n/a 24 3352 3492 3562 N
+ N EY EY s n/a 24 3352 3492 3559 N
+ N EY F b n/a 24 3356 3446 3501 N
+ N EY F e n/a 24 3352 3446 3501 N
+ N EY F i n/a 24 3352 3450 3501 N
+ N EY F s n/a 24 3352 3446 3501 N
+ N EY G b n/a 24 3356 3416 3529 N
+ N EY G e n/a 24 3352 3416 3529 N
+ N EY G i n/a 24 3352 3416 3529 N
+ N EY G s n/a 24 3352 3416 3529 N
+ N EY HH e n/a 24 3352 3453 3524 N
+ N EY HH i n/a 24 3352 3453 3524 N
+ N EY HH s n/a 24 3352 3453 3524 N
+ N EY IH b n/a 24 3356 3471 3566 N
+ N EY IH e n/a 24 3352 3492 3557 N
+ N EY IH i n/a 24 3352 3492 3556 N
+ N EY IH s n/a 24 3352 3492 3557 N
+ N EY IY b n/a 24 3356 3471 3566 N
+ N EY IY e n/a 24 3352 3492 3565 N
+ N EY IY i n/a 24 3352 3492 3565 N
+ N EY IY s n/a 24 3352 3492 3565 N
+ N EY JH b n/a 24 3356 3420 3531 N
+ N EY JH e n/a 24 3353 3419 3531 N
+ N EY JH i n/a 24 3353 3419 3531 N
+ N EY JH s n/a 24 3353 3419 3531 N
+ N EY K b n/a 24 3356 3448 3502 N
+ N EY K e n/a 24 3352 3448 3502 N
+ N EY K i n/a 24 3353 3451 3502 N
+ N EY K s n/a 24 3352 3448 3502 N
+ N EY L b n/a 24 3356 3427 3521 N
+ N EY L e n/a 24 3352 3427 3521 N
+ N EY L i n/a 24 3352 3427 3521 N
+ N EY L s n/a 24 3352 3427 3521 N
+ N EY M e n/a 24 3352 3424 3517 N
+ N EY M i n/a 24 3352 3424 3517 N
+ N EY M s n/a 24 3352 3424 3517 N
+ N EY N e n/a 24 3352 3459 3516 N
+ N EY N i n/a 24 3352 3459 3516 N
+ N EY N s n/a 24 3352 3459 3516 N
+ N EY NG e n/a 24 3352 3424 3516 N
+ N EY NG s n/a 24 3352 3424 3516 N
+ N EY OW b n/a 24 3356 3469 3552 N
+ N EY OW e n/a 24 3352 3496 3546 N
+ N EY OW i n/a 24 3352 3496 3553 N
+ N EY OW s n/a 24 3352 3496 3546 N
+ N EY OY b n/a 24 3356 3469 3551 N
+ N EY OY e n/a 24 3352 3492 3547 N
+ N EY OY s n/a 24 3352 3492 3547 N
+ N EY P b n/a 24 3356 3447 3503 N
+ N EY P e n/a 24 3352 3447 3503 N
+ N EY P i n/a 24 3353 3451 3503 N
+ N EY P s n/a 24 3352 3447 3503 N
+ N EY R b n/a 24 3356 3427 3523 N
+ N EY R e n/a 24 3352 3427 3523 N
+ N EY R i n/a 24 3352 3427 3523 N
+ N EY R s n/a 24 3352 3427 3523 N
+ N EY S b n/a 24 3356 3447 3497 N
+ N EY S e n/a 24 3352 3447 3497 N
+ N EY S i n/a 24 3352 3450 3499 N
+ N EY S s n/a 24 3352 3447 3497 N
+ N EY SH e n/a 24 3353 3447 3508 N
+ N EY SH i n/a 24 3353 3450 3508 N
+ N EY SH s n/a 24 3353 3447 3508 N
+ N EY SIL e n/a 24 3354 3434 3513 N
+ N EY SIL s n/a 24 3354 3434 3513 N
+ N EY T b n/a 24 3356 3447 3507 N
+ N EY T e n/a 24 3352 3447 3507 N
+ N EY T i n/a 24 3353 3449 3507 N
+ N EY T s n/a 24 3352 3447 3507 N
+ N EY TH e n/a 24 3352 3447 3501 N
+ N EY TH s n/a 24 3352 3447 3501 N
+ N EY UH b n/a 24 3356 3471 3567 N
+ N EY UH e n/a 24 3352 3492 3557 N
+ N EY UH s n/a 24 3352 3492 3557 N
+ N EY UW b n/a 24 3356 3471 3567 N
+ N EY UW e n/a 24 3352 3492 3557 N
+ N EY UW i n/a 24 3352 3492 3558 N
+ N EY UW s n/a 24 3352 3492 3557 N
+ N EY V b n/a 24 3356 3415 3519 N
+ N EY V e n/a 24 3352 3415 3519 N
+ N EY V i n/a 24 3352 3415 3519 N
+ N EY V s n/a 24 3352 3415 3519 N
+ N EY W b n/a 24 3356 3427 3522 N
+ N EY W e n/a 24 3352 3427 3522 N
+ N EY W i n/a 24 3352 3427 3522 N
+ N EY W s n/a 24 3352 3427 3522 N
+ N EY Y b n/a 24 3356 3420 3526 N
+ N EY Y e n/a 24 3353 3418 3527 N
+ N EY Y i n/a 24 3353 3418 3527 N
+ N EY Y s n/a 24 3353 3418 3527 N
+ N EY Z b n/a 24 3356 3436 3510 N
+ N EY Z e n/a 24 3352 3436 3510 N
+ N EY Z i n/a 24 3352 3436 3510 N
+ N EY Z s n/a 24 3352 3436 3510 N
+ N EY ZH e n/a 24 3353 3419 3510 N
+ N EY ZH s n/a 24 3353 3419 3510 N
+ N F AA b n/a 24 3347 3473 3548 N
+ N F AA i n/a 24 3347 3474 3548 N
+ N F AA s n/a 24 3347 3473 3546 N
+ N F AE b n/a 24 3347 3478 3561 N
+ N F AE s n/a 24 3347 3478 3560 N
+ N F AH b n/a 24 3347 3475 3549 N
+ N F AH i n/a 24 3347 3478 3542 N
+ N F AH s n/a 24 3347 3478 3538 N
+ N F AO b n/a 24 3347 3473 3551 N
+ N F AO s n/a 24 3347 3473 3546 N
+ N F AW b n/a 24 3347 3478 3563 N
+ N F AW s n/a 24 3347 3478 3560 N
+ N F AY b n/a 24 3347 3473 3549 N
+ N F AY s n/a 24 3347 3473 3547 N
+ N F B s n/a 24 3347 3415 3528 N
+ N F CH s n/a 24 3347 3447 3509 N
+ N F D b n/a 24 3347 3456 3533 N
+ N F D i n/a 24 3347 3456 3532 N
+ N F D s n/a 24 3347 3456 3533 N
+ N F DH s n/a 24 3347 3423 3518 N
+ N F EH b n/a 24 3347 3475 3561 N
+ N F EH i n/a 24 3347 3478 3561 N
+ N F EH s n/a 24 3347 3478 3559 N
+ N F ER b n/a 24 3347 3475 3552 N
+ N F ER i n/a 24 3347 3478 3545 N
+ N F ER s n/a 24 3347 3478 3545 N
+ N F EY b n/a 24 3347 3475 3562 N
+ N F EY i n/a 24 3347 3478 3562 N
+ N F EY s n/a 24 3347 3478 3559 N
+ N F F b n/a 24 3347 3446 3501 N
+ N F F s n/a 24 3347 3446 3501 N
+ N F G b n/a 24 3347 3416 3528 N
+ N F G s n/a 24 3347 3416 3528 N
+ N F HH s n/a 24 3347 3453 3524 N
+ N F IH b n/a 24 3347 3470 3566 N
+ N F IH i n/a 24 3347 3478 3555 N
+ N F IH s n/a 24 3347 3478 3557 N
+ N F IY b n/a 24 3347 3470 3566 N
+ N F IY i n/a 24 3347 3478 3564 N
+ N F IY s n/a 24 3347 3478 3564 N
+ N F JH b n/a 24 3347 3420 3531 N
+ N F JH s n/a 24 3347 3417 3531 N
+ N F K b n/a 24 3347 3448 3502 N
+ N F K s n/a 24 3347 3448 3502 N
+ N F L b n/a 24 3347 3425 3521 N
+ N F L s n/a 24 3347 3425 3521 N
+ N F M s n/a 24 3347 3421 3517 N
+ N F N s n/a 24 3347 3456 3516 N
+ N F NG s n/a 24 3347 3421 3516 N
+ N F OW b n/a 24 3347 3475 3552 N
+ N F OW s n/a 24 3347 3478 3546 N
+ N F OY b n/a 24 3347 3473 3551 N
+ N F OY s n/a 24 3347 3473 3547 N
+ N F P b n/a 24 3347 3447 3503 N
+ N F P s n/a 24 3347 3447 3503 N
+ N F R b n/a 24 3347 3426 3523 N
+ N F R s n/a 24 3347 3426 3523 N
+ N F S b n/a 24 3347 3446 3497 N
+ N F S s n/a 24 3347 3446 3497 N
+ N F SH s n/a 24 3347 3447 3508 N
+ N F SIL s n/a 24 3347 3430 3513 N
+ N F T b n/a 24 3347 3447 3505 N
+ N F T s n/a 24 3347 3447 3505 N
+ N F TH s n/a 24 3347 3446 3501 N
+ N F UH b n/a 24 3347 3470 3567 N
+ N F UH s n/a 24 3347 3478 3557 N
+ N F UW b n/a 24 3347 3470 3567 N
+ N F UW s n/a 24 3347 3478 3557 N
+ N F V b n/a 24 3347 3415 3519 N
+ N F V s n/a 24 3347 3415 3519 N
+ N F W b n/a 24 3347 3425 3522 N
+ N F W s n/a 24 3347 3425 3522 N
+ N F Y b n/a 24 3347 3420 3526 N
+ N F Y s n/a 24 3347 3418 3527 N
+ N F Z b n/a 24 3347 3435 3510 N
+ N F Z s n/a 24 3347 3435 3510 N
+ N F ZH s n/a 24 3347 3415 3510 N
+ N G AA b n/a 24 3349 3472 3550 N
+ N G AA e n/a 24 3349 3472 3546 N
+ N G AA i n/a 24 3349 3472 3550 N
+ N G AA s n/a 24 3349 3472 3546 N
+ N G AE b n/a 24 3349 3479 3561 N
+ N G AE e n/a 24 3349 3479 3560 N
+ N G AE i n/a 24 3349 3479 3561 N
+ N G AE s n/a 24 3349 3479 3560 N
+ N G AH b n/a 24 3349 3475 3549 N
+ N G AH e n/a 24 3349 3478 3538 N
+ N G AH i n/a 24 3349 3478 3542 N
+ N G AH s n/a 24 3349 3478 3538 N
+ N G AO b n/a 24 3349 3472 3551 N
+ N G AO e n/a 24 3349 3472 3546 N
+ N G AO i n/a 24 3349 3472 3551 N
+ N G AO s n/a 24 3349 3472 3546 N
+ N G AW b n/a 24 3349 3479 3563 N
+ N G AW e n/a 24 3349 3479 3560 N
+ N G AW s n/a 24 3349 3479 3560 N
+ N G AY b n/a 24 3349 3472 3549 N
+ N G AY e n/a 24 3349 3472 3547 N
+ N G AY i n/a 24 3349 3472 3549 N
+ N G AY s n/a 24 3349 3472 3547 N
+ N G B e n/a 24 3349 3415 3528 N
+ N G B s n/a 24 3349 3415 3528 N
+ N G CH e n/a 24 3349 3447 3509 N
+ N G CH s n/a 24 3349 3447 3509 N
+ N G D b n/a 24 3349 3456 3533 N
+ N G D e n/a 24 3349 3456 3533 N
+ N G D s n/a 24 3349 3456 3533 N
+ N G DH e n/a 24 3349 3423 3518 N
+ N G DH s n/a 24 3349 3423 3518 N
+ N G EH b n/a 24 3349 3475 3561 N
+ N G EH e n/a 24 3349 3478 3559 N
+ N G EH i n/a 24 3349 3478 3561 N
+ N G EH s n/a 24 3349 3478 3559 N
+ N G ER b n/a 24 3349 3475 3552 N
+ N G ER e n/a 24 3349 3478 3545 N
+ N G ER i n/a 24 3349 3478 3545 N
+ N G ER s n/a 24 3349 3478 3545 N
+ N G EY b n/a 24 3349 3475 3562 N
+ N G EY e n/a 24 3349 3478 3559 N
+ N G EY i n/a 24 3349 3478 3562 N
+ N G EY s n/a 24 3349 3478 3559 N
+ N G F b n/a 24 3349 3446 3501 N
+ N G F e n/a 24 3349 3446 3501 N
+ N G F s n/a 24 3349 3446 3501 N
+ N G G b n/a 24 3349 3416 3528 N
+ N G G e n/a 24 3349 3416 3528 N
+ N G G s n/a 24 3349 3416 3528 N
+ N G HH e n/a 24 3349 3453 3524 N
+ N G HH s n/a 24 3349 3453 3524 N
+ N G IH b n/a 24 3349 3470 3566 N
+ N G IH e n/a 24 3349 3478 3557 N
+ N G IH i n/a 24 3349 3478 3555 N
+ N G IH s n/a 24 3349 3478 3557 N
+ N G IY b n/a 24 3349 3470 3566 N
+ N G IY e n/a 24 3349 3478 3564 N
+ N G IY i n/a 24 3349 3478 3564 N
+ N G IY s n/a 24 3349 3478 3564 N
+ N G JH b n/a 24 3349 3420 3531 N
+ N G JH e n/a 24 3349 3417 3531 N
+ N G JH s n/a 24 3349 3417 3531 N
+ N G K b n/a 24 3349 3448 3502 N
+ N G K e n/a 24 3349 3448 3502 N
+ N G K s n/a 24 3349 3448 3502 N
+ N G L b n/a 24 3349 3425 3521 N
+ N G L e n/a 24 3349 3425 3521 N
+ N G L s n/a 24 3349 3425 3521 N
+ N G M e n/a 24 3349 3421 3517 N
+ N G M s n/a 24 3349 3421 3517 N
+ N G N e n/a 24 3349 3456 3516 N
+ N G N s n/a 24 3349 3456 3516 N
+ N G NG e n/a 24 3349 3421 3516 N
+ N G NG s n/a 24 3349 3421 3516 N
+ N G OW b n/a 24 3349 3475 3552 N
+ N G OW e n/a 24 3349 3478 3546 N
+ N G OW i n/a 24 3349 3478 3552 N
+ N G OW s n/a 24 3349 3478 3546 N
+ N G OY b n/a 24 3349 3472 3551 N
+ N G OY e n/a 24 3349 3472 3547 N
+ N G OY s n/a 24 3349 3472 3547 N
+ N G P b n/a 24 3349 3447 3503 N
+ N G P e n/a 24 3349 3447 3503 N
+ N G P s n/a 24 3349 3447 3503 N
+ N G R b n/a 24 3349 3426 3523 N
+ N G R e n/a 24 3349 3426 3523 N
+ N G R s n/a 24 3349 3426 3523 N
+ N G S b n/a 24 3349 3446 3497 N
+ N G S e n/a 24 3349 3446 3497 N
+ N G S s n/a 24 3349 3446 3497 N
+ N G SH e n/a 24 3349 3447 3508 N
+ N G SH s n/a 24 3349 3447 3508 N
+ N G SIL e n/a 24 3349 3430 3513 N
+ N G SIL s n/a 24 3349 3430 3513 N
+ N G T b n/a 24 3349 3447 3505 N
+ N G T e n/a 24 3349 3447 3505 N
+ N G T s n/a 24 3349 3447 3505 N
+ N G TH e n/a 24 3349 3446 3501 N
+ N G TH s n/a 24 3349 3446 3501 N
+ N G UH b n/a 24 3349 3470 3567 N
+ N G UH e n/a 24 3349 3478 3557 N
+ N G UH s n/a 24 3349 3478 3557 N
+ N G UW b n/a 24 3349 3470 3567 N
+ N G UW e n/a 24 3349 3478 3557 N
+ N G UW i n/a 24 3349 3478 3558 N
+ N G UW s n/a 24 3349 3478 3557 N
+ N G V b n/a 24 3349 3415 3519 N
+ N G V e n/a 24 3349 3415 3519 N
+ N G V s n/a 24 3349 3415 3519 N
+ N G W b n/a 24 3349 3425 3522 N
+ N G W e n/a 24 3349 3425 3522 N
+ N G W s n/a 24 3349 3425 3522 N
+ N G Y b n/a 24 3349 3420 3526 N
+ N G Y e n/a 24 3349 3418 3527 N
+ N G Y i n/a 24 3349 3418 3526 N
+ N G Y s n/a 24 3349 3418 3527 N
+ N G Z b n/a 24 3349 3435 3510 N
+ N G Z e n/a 24 3349 3435 3510 N
+ N G Z i n/a 24 3349 3435 3510 N
+ N G Z s n/a 24 3349 3435 3510 N
+ N G ZH e n/a 24 3349 3415 3510 N
+ N G ZH s n/a 24 3349 3415 3510 N
+ N HH AA b n/a 24 3347 3473 3548 N
+ N HH AA s n/a 24 3347 3473 3546 N
+ N HH AE b n/a 24 3347 3479 3561 N
+ N HH AE i n/a 24 3347 3479 3561 N
+ N HH AE s n/a 24 3347 3479 3560 N
+ N HH AH b n/a 24 3347 3475 3549 N
+ N HH AH s n/a 24 3347 3478 3538 N
+ N HH AO b n/a 24 3347 3473 3551 N
+ N HH AO s n/a 24 3347 3473 3546 N
+ N HH AW b n/a 24 3347 3479 3563 N
+ N HH AW s n/a 24 3347 3479 3560 N
+ N HH AY b n/a 24 3347 3473 3549 N
+ N HH AY s n/a 24 3347 3473 3547 N
+ N HH B s n/a 24 3347 3415 3528 N
+ N HH CH s n/a 24 3347 3447 3509 N
+ N HH D b n/a 24 3347 3456 3533 N
+ N HH D s n/a 24 3347 3456 3533 N
+ N HH DH s n/a 24 3347 3423 3518 N
+ N HH EH b n/a 24 3347 3475 3561 N
+ N HH EH s n/a 24 3347 3478 3559 N
+ N HH ER b n/a 24 3347 3475 3552 N
+ N HH ER s n/a 24 3347 3478 3545 N
+ N HH EY b n/a 24 3347 3475 3562 N
+ N HH EY s n/a 24 3347 3478 3559 N
+ N HH F b n/a 24 3347 3446 3501 N
+ N HH F s n/a 24 3347 3446 3501 N
+ N HH G b n/a 24 3347 3416 3528 N
+ N HH G s n/a 24 3347 3416 3528 N
+ N HH HH s n/a 24 3347 3453 3524 N
+ N HH IH b n/a 24 3347 3470 3566 N
+ N HH IH s n/a 24 3347 3478 3557 N
+ N HH IY b n/a 24 3347 3470 3566 N
+ N HH IY s n/a 24 3347 3478 3564 N
+ N HH JH b n/a 24 3347 3420 3531 N
+ N HH JH s n/a 24 3347 3417 3531 N
+ N HH K b n/a 24 3347 3448 3502 N
+ N HH K s n/a 24 3347 3448 3502 N
+ N HH L b n/a 24 3347 3425 3521 N
+ N HH L s n/a 24 3347 3425 3521 N
+ N HH M s n/a 24 3347 3421 3517 N
+ N HH N s n/a 24 3347 3456 3516 N
+ N HH NG s n/a 24 3347 3421 3516 N
+ N HH OW b n/a 24 3347 3475 3552 N
+ N HH OW s n/a 24 3347 3478 3546 N
+ N HH OY b n/a 24 3347 3473 3551 N
+ N HH OY s n/a 24 3347 3473 3547 N
+ N HH P b n/a 24 3347 3447 3503 N
+ N HH P s n/a 24 3347 3447 3503 N
+ N HH R b n/a 24 3347 3426 3523 N
+ N HH R s n/a 24 3347 3426 3523 N
+ N HH S b n/a 24 3347 3446 3497 N
+ N HH S s n/a 24 3347 3446 3497 N
+ N HH SH s n/a 24 3347 3447 3508 N
+ N HH SIL s n/a 24 3347 3430 3513 N
+ N HH T b n/a 24 3347 3447 3505 N
+ N HH T s n/a 24 3347 3447 3505 N
+ N HH TH s n/a 24 3347 3446 3501 N
+ N HH UH b n/a 24 3347 3470 3567 N
+ N HH UH s n/a 24 3347 3478 3557 N
+ N HH UW b n/a 24 3347 3470 3567 N
+ N HH UW s n/a 24 3347 3478 3557 N
+ N HH V b n/a 24 3347 3415 3519 N
+ N HH V s n/a 24 3347 3415 3519 N
+ N HH W b n/a 24 3347 3425 3522 N
+ N HH W s n/a 24 3347 3425 3522 N
+ N HH Y b n/a 24 3347 3420 3526 N
+ N HH Y s n/a 24 3347 3418 3527 N
+ N HH Z b n/a 24 3347 3435 3510 N
+ N HH Z s n/a 24 3347 3435 3510 N
+ N HH ZH s n/a 24 3347 3415 3510 N
+ N IH AA b n/a 24 3399 3468 3548 N
+ N IH AA e n/a 24 3399 3485 3546 N
+ N IH AA i n/a 24 3399 3485 3548 N
+ N IH AA s n/a 24 3399 3485 3546 N
+ N IH AE b n/a 24 3399 3469 3561 N
+ N IH AE e n/a 24 3399 3483 3560 N
+ N IH AE i n/a 24 3399 3482 3561 N
+ N IH AE s n/a 24 3399 3483 3560 N
+ N IH AH b n/a 24 3399 3469 3549 N
+ N IH AH e n/a 24 3399 3485 3543 N
+ N IH AH i n/a 24 3399 3485 3543 N
+ N IH AH s n/a 24 3399 3485 3543 N
+ N IH AO b n/a 24 3399 3468 3551 N
+ N IH AO e n/a 24 3399 3485 3546 N
+ N IH AO i n/a 24 3399 3485 3551 N
+ N IH AO s n/a 24 3399 3485 3546 N
+ N IH AW b n/a 24 3399 3469 3563 N
+ N IH AW e n/a 24 3399 3483 3560 N
+ N IH AW i n/a 24 3399 3482 3563 N
+ N IH AW s n/a 24 3399 3483 3560 N
+ N IH AY b n/a 24 3399 3468 3549 N
+ N IH AY e n/a 24 3399 3485 3547 N
+ N IH AY i n/a 24 3399 3485 3549 N
+ N IH AY s n/a 24 3399 3485 3547 N
+ N IH B e n/a 24 3402 3415 3528 N
+ N IH B i n/a 24 3402 3415 3528 N
+ N IH B s n/a 24 3402 3415 3528 N
+ N IH CH e n/a 24 3402 3447 3509 N
+ N IH CH i n/a 24 3401 3450 3508 N
+ N IH CH s n/a 24 3402 3447 3509 N
+ N IH D b n/a 24 3402 3460 3530 N
+ N IH D e n/a 24 3402 3460 3530 N
+ N IH D i n/a 24 3402 3460 3530 N
+ N IH D s n/a 24 3402 3460 3530 N
+ N IH DH e n/a 24 3413 3422 3515 N
+ N IH DH i n/a 24 3413 3422 3515 N
+ N IH DH s n/a 24 3413 3422 3515 N
+ N IH EH b n/a 24 3399 3469 3561 N
+ N IH EH e n/a 24 3399 3482 3559 N
+ N IH EH i n/a 24 3399 3482 3561 N
+ N IH EH s n/a 24 3399 3482 3559 N
+ N IH ER b n/a 24 3399 3468 3552 N
+ N IH ER e n/a 24 3399 3485 3545 N
+ N IH ER i n/a 24 3399 3485 3545 N
+ N IH ER s n/a 24 3399 3485 3545 N
+ N IH EY b n/a 24 3400 3469 3562 N
+ N IH EY e n/a 24 3400 3482 3559 N
+ N IH EY i n/a 24 3400 3482 3562 N
+ N IH EY s n/a 24 3400 3482 3559 N
+ N IH F b n/a 24 3414 3446 3501 N
+ N IH F e n/a 24 3414 3446 3501 N
+ N IH F i n/a 24 3414 3450 3501 N
+ N IH F s n/a 24 3414 3446 3501 N
+ N IH G b n/a 24 3403 3416 3529 N
+ N IH G e n/a 24 3403 3416 3529 N
+ N IH G i n/a 24 3403 3416 3529 N
+ N IH G s n/a 24 3403 3416 3529 N
+ N IH HH e n/a 24 3400 3453 3524 N
+ N IH HH i n/a 24 3400 3453 3524 N
+ N IH HH s n/a 24 3400 3453 3524 N
+ N IH IH b n/a 24 3399 3471 3566 N
+ N IH IH e n/a 24 3399 3494 3557 N
+ N IH IH i n/a 24 3399 3494 3555 N
+ N IH IH s n/a 24 3399 3494 3557 N
+ N IH IY b n/a 24 3400 3471 3566 N
+ N IH IY e n/a 24 3400 3492 3565 N
+ N IH IY i n/a 24 3400 3492 3565 N
+ N IH IY s n/a 24 3400 3492 3565 N
+ N IH JH b n/a 24 3402 3420 3531 N
+ N IH JH e n/a 24 3402 3417 3531 N
+ N IH JH i n/a 24 3402 3417 3531 N
+ N IH JH s n/a 24 3402 3417 3531 N
+ N IH K b n/a 24 3403 3448 3502 N
+ N IH K e n/a 24 3403 3448 3502 N
+ N IH K i n/a 24 3403 3448 3502 N
+ N IH K s n/a 24 3403 3448 3502 N
+ N IH L b n/a 24 3398 3425 3521 N
+ N IH L e n/a 24 3398 3425 3521 N
+ N IH L i n/a 24 3398 3425 3521 N
+ N IH L s n/a 24 3398 3425 3521 N
+ N IH M e n/a 24 3400 3421 3517 N
+ N IH M i n/a 24 3400 3421 3517 N
+ N IH M s n/a 24 3400 3421 3517 N
+ N IH N e n/a 24 3400 3458 3516 N
+ N IH N i n/a 24 3400 3458 3516 N
+ N IH N s n/a 24 3400 3458 3516 N
+ N IH NG e n/a 24 3400 3421 3516 N
+ N IH NG s n/a 24 3400 3421 3516 N
+ N IH OW b n/a 24 3399 3468 3552 N
+ N IH OW e n/a 24 3399 3485 3546 N
+ N IH OW i n/a 24 3399 3485 3552 N
+ N IH OW s n/a 24 3399 3485 3546 N
+ N IH OY b n/a 24 3399 3468 3551 N
+ N IH OY e n/a 24 3399 3485 3547 N
+ N IH OY i n/a 24 3399 3485 3551 N
+ N IH OY s n/a 24 3399 3485 3547 N
+ N IH P b n/a 24 3402 3447 3503 N
+ N IH P e n/a 24 3402 3447 3503 N
+ N IH P i n/a 24 3401 3450 3503 N
+ N IH P s n/a 24 3402 3447 3503 N
+ N IH R b n/a 24 3400 3427 3523 N
+ N IH R e n/a 24 3400 3427 3523 N
+ N IH R i n/a 24 3400 3427 3523 N
+ N IH R s n/a 24 3400 3427 3523 N
+ N IH S b n/a 24 3414 3446 3497 N
+ N IH S e n/a 24 3414 3446 3497 N
+ N IH S i n/a 24 3414 3451 3497 N
+ N IH S s n/a 24 3414 3446 3497 N
+ N IH SH e n/a 24 3412 3447 3508 N
+ N IH SH i n/a 24 3412 3450 3508 N
+ N IH SH s n/a 24 3412 3447 3508 N
+ N IH SIL e n/a 24 3398 3433 3513 N
+ N IH SIL s n/a 24 3398 3433 3513 N
+ N IH T b n/a 24 3402 3447 3509 N
+ N IH T e n/a 24 3402 3447 3509 N
+ N IH T i n/a 24 3401 3450 3509 N
+ N IH T s n/a 24 3402 3447 3509 N
+ N IH TH e n/a 24 3414 3446 3501 N
+ N IH TH i n/a 24 3414 3451 3501 N
+ N IH TH s n/a 24 3414 3446 3501 N
+ N IH UH b n/a 24 3399 3471 3567 N
+ N IH UH e n/a 24 3399 3494 3557 N
+ N IH UH i n/a 24 3399 3494 3555 N
+ N IH UH s n/a 24 3399 3494 3557 N
+ N IH UW b n/a 24 3400 3471 3567 N
+ N IH UW e n/a 24 3400 3495 3557 N
+ N IH UW i n/a 24 3400 3495 3558 N
+ N IH UW s n/a 24 3400 3495 3557 N
+ N IH V b n/a 24 3414 3415 3519 N
+ N IH V e n/a 24 3414 3415 3519 N
+ N IH V i n/a 24 3414 3415 3519 N
+ N IH V s n/a 24 3414 3415 3519 N
+ N IH W b n/a 24 3400 3427 3522 N
+ N IH W e n/a 24 3400 3427 3522 N
+ N IH W i n/a 24 3400 3427 3522 N
+ N IH W s n/a 24 3400 3427 3522 N
+ N IH Y b n/a 24 3403 3420 3526 N
+ N IH Y e n/a 24 3403 3418 3527 N
+ N IH Y i n/a 24 3403 3418 3527 N
+ N IH Y s n/a 24 3403 3418 3527 N
+ N IH Z b n/a 24 3413 3435 3510 N
+ N IH Z e n/a 24 3413 3435 3510 N
+ N IH Z i n/a 24 3413 3435 3510 N
+ N IH Z s n/a 24 3413 3435 3510 N
+ N IH ZH e n/a 24 3412 3415 3510 N
+ N IH ZH s n/a 24 3412 3415 3510 N
+ N IY AA b n/a 24 3356 3469 3550 N
+ N IY AA e n/a 24 3355 3496 3546 N
+ N IY AA i n/a 24 3355 3496 3550 N
+ N IY AA s n/a 24 3355 3496 3546 N
+ N IY AE b n/a 24 3356 3469 3561 N
+ N IY AE e n/a 24 3355 3496 3560 N
+ N IY AE i n/a 24 3355 3496 3561 N
+ N IY AE s n/a 24 3355 3496 3560 N
+ N IY AH b n/a 24 3356 3469 3549 N
+ N IY AH e n/a 24 3355 3496 3542 N
+ N IY AH i n/a 24 3355 3496 3542 N
+ N IY AH s n/a 24 3355 3496 3542 N
+ N IY AO b n/a 24 3356 3469 3551 N
+ N IY AO e n/a 24 3355 3496 3546 N
+ N IY AO i n/a 24 3355 3496 3551 N
+ N IY AO s n/a 24 3355 3496 3546 N
+ N IY AW b n/a 24 3356 3469 3563 N
+ N IY AW e n/a 24 3355 3496 3560 N
+ N IY AW i n/a 24 3355 3496 3563 N
+ N IY AW s n/a 24 3355 3496 3560 N
+ N IY AY b n/a 24 3356 3469 3549 N
+ N IY AY e n/a 24 3355 3492 3547 N
+ N IY AY i n/a 24 3355 3492 3549 N
+ N IY AY s n/a 24 3355 3492 3547 N
+ N IY B e n/a 24 3354 3416 3528 N
+ N IY B i n/a 24 3354 3416 3528 N
+ N IY B s n/a 24 3354 3416 3528 N
+ N IY CH e n/a 24 3354 3447 3509 N
+ N IY CH i n/a 24 3354 3451 3508 N
+ N IY CH s n/a 24 3354 3447 3509 N
+ N IY D b n/a 24 3356 3459 3537 N
+ N IY D e n/a 24 3354 3459 3537 N
+ N IY D i n/a 24 3354 3459 3537 N
+ N IY D s n/a 24 3354 3459 3537 N
+ N IY DH e n/a 24 3354 3424 3515 N
+ N IY DH i n/a 24 3354 3424 3515 N
+ N IY DH s n/a 24 3354 3424 3515 N
+ N IY EH b n/a 24 3356 3469 3561 N
+ N IY EH e n/a 24 3355 3496 3559 N
+ N IY EH i n/a 24 3355 3496 3561 N
+ N IY EH s n/a 24 3355 3496 3559 N
+ N IY ER b n/a 24 3356 3469 3552 N
+ N IY ER e n/a 24 3355 3496 3545 N
+ N IY ER i n/a 24 3355 3496 3545 N
+ N IY ER s n/a 24 3355 3496 3545 N
+ N IY EY b n/a 24 3356 3469 3562 N
+ N IY EY e n/a 24 3355 3492 3559 N
+ N IY EY i n/a 24 3355 3492 3562 N
+ N IY EY s n/a 24 3355 3492 3559 N
+ N IY F b n/a 24 3356 3446 3501 N
+ N IY F e n/a 24 3354 3446 3501 N
+ N IY F i n/a 24 3354 3450 3501 N
+ N IY F s n/a 24 3354 3446 3501 N
+ N IY G b n/a 24 3356 3416 3529 N
+ N IY G e n/a 24 3354 3416 3529 N
+ N IY G i n/a 24 3354 3416 3529 N
+ N IY G s n/a 24 3354 3416 3529 N
+ N IY HH e n/a 24 3354 3453 3524 N
+ N IY HH i n/a 24 3354 3453 3524 N
+ N IY HH s n/a 24 3354 3453 3524 N
+ N IY IH b n/a 24 3356 3471 3566 N
+ N IY IH e n/a 24 3355 3492 3557 N
+ N IY IH i n/a 24 3355 3492 3556 N
+ N IY IH s n/a 24 3355 3492 3557 N
+ N IY IY b n/a 24 3356 3471 3566 N
+ N IY IY e n/a 24 3355 3492 3565 N
+ N IY IY i n/a 24 3355 3492 3565 N
+ N IY IY s n/a 24 3355 3492 3565 N
+ N IY JH b n/a 24 3356 3420 3531 N
+ N IY JH e n/a 24 3354 3419 3531 N
+ N IY JH i n/a 24 3354 3419 3531 N
+ N IY JH s n/a 24 3354 3419 3531 N
+ N IY K b n/a 24 3356 3448 3502 N
+ N IY K e n/a 24 3354 3448 3502 N
+ N IY K i n/a 24 3354 3448 3502 N
+ N IY K s n/a 24 3354 3448 3502 N
+ N IY L b n/a 24 3356 3427 3521 N
+ N IY L e n/a 24 3355 3427 3521 N
+ N IY L i n/a 24 3355 3427 3521 N
+ N IY L s n/a 24 3355 3427 3521 N
+ N IY M e n/a 24 3354 3424 3517 N
+ N IY M i n/a 24 3354 3424 3517 N
+ N IY M s n/a 24 3354 3424 3517 N
+ N IY N e n/a 24 3354 3459 3516 N
+ N IY N i n/a 24 3354 3459 3516 N
+ N IY N s n/a 24 3354 3459 3516 N
+ N IY NG e n/a 24 3354 3424 3516 N
+ N IY NG s n/a 24 3354 3424 3516 N
+ N IY OW b n/a 24 3356 3469 3552 N
+ N IY OW e n/a 24 3355 3496 3546 N
+ N IY OW i n/a 24 3355 3496 3553 N
+ N IY OW s n/a 24 3355 3496 3546 N
+ N IY OY b n/a 24 3356 3469 3551 N
+ N IY OY e n/a 24 3355 3492 3547 N
+ N IY OY s n/a 24 3355 3492 3547 N
+ N IY P b n/a 24 3356 3447 3503 N
+ N IY P e n/a 24 3354 3447 3503 N
+ N IY P i n/a 24 3354 3451 3503 N
+ N IY P s n/a 24 3354 3447 3503 N
+ N IY R b n/a 24 3356 3427 3523 N
+ N IY R e n/a 24 3355 3427 3523 N
+ N IY R i n/a 24 3355 3427 3523 N
+ N IY R s n/a 24 3355 3427 3523 N
+ N IY S b n/a 24 3356 3447 3497 N
+ N IY S e n/a 24 3354 3447 3497 N
+ N IY S i n/a 24 3354 3450 3497 N
+ N IY S s n/a 24 3354 3447 3497 N
+ N IY SH e n/a 24 3354 3447 3508 N
+ N IY SH i n/a 24 3354 3450 3508 N
+ N IY SH s n/a 24 3354 3447 3508 N
+ N IY SIL e n/a 24 3354 3434 3513 N
+ N IY SIL s n/a 24 3354 3434 3513 N
+ N IY T b n/a 24 3356 3447 3509 N
+ N IY T e n/a 24 3354 3447 3509 N
+ N IY T i n/a 24 3354 3449 3509 N
+ N IY T s n/a 24 3354 3447 3509 N
+ N IY TH e n/a 24 3354 3447 3501 N
+ N IY TH i n/a 24 3354 3450 3501 N
+ N IY TH s n/a 24 3354 3447 3501 N
+ N IY UH b n/a 24 3356 3471 3567 N
+ N IY UH e n/a 24 3355 3492 3557 N
+ N IY UH i n/a 24 3355 3492 3556 N
+ N IY UH s n/a 24 3355 3492 3557 N
+ N IY UW b n/a 24 3356 3471 3567 N
+ N IY UW e n/a 24 3355 3492 3557 N
+ N IY UW i n/a 24 3355 3492 3558 N
+ N IY UW s n/a 24 3355 3492 3557 N
+ N IY V b n/a 24 3356 3415 3519 N
+ N IY V e n/a 24 3354 3415 3519 N
+ N IY V i n/a 24 3354 3415 3519 N
+ N IY V s n/a 24 3354 3415 3519 N
+ N IY W b n/a 24 3356 3427 3522 N
+ N IY W e n/a 24 3355 3427 3522 N
+ N IY W i n/a 24 3355 3427 3522 N
+ N IY W s n/a 24 3355 3427 3522 N
+ N IY Y b n/a 24 3356 3420 3526 N
+ N IY Y e n/a 24 3356 3419 3527 N
+ N IY Y i n/a 24 3356 3419 3527 N
+ N IY Y s n/a 24 3356 3419 3527 N
+ N IY Z b n/a 24 3356 3436 3510 N
+ N IY Z e n/a 24 3354 3436 3510 N
+ N IY Z i n/a 24 3354 3436 3510 N
+ N IY Z s n/a 24 3354 3436 3510 N
+ N IY ZH e n/a 24 3354 3419 3510 N
+ N IY ZH s n/a 24 3354 3419 3510 N
+ N JH AA b n/a 24 3347 3472 3548 N
+ N JH AA s n/a 24 3347 3472 3546 N
+ N JH AE b n/a 24 3347 3479 3561 N
+ N JH AE s n/a 24 3347 3479 3560 N
+ N JH AH b n/a 24 3347 3475 3549 N
+ N JH AH i n/a 24 3347 3478 3542 N
+ N JH AH s n/a 24 3347 3478 3538 N
+ N JH AO b n/a 24 3347 3472 3551 N
+ N JH AO s n/a 24 3347 3472 3546 N
+ N JH AW b n/a 24 3347 3479 3563 N
+ N JH AW s n/a 24 3347 3479 3560 N
+ N JH AY b n/a 24 3347 3472 3549 N
+ N JH AY s n/a 24 3347 3472 3547 N
+ N JH B s n/a 24 3347 3415 3528 N
+ N JH CH s n/a 24 3347 3447 3509 N
+ N JH D b n/a 24 3347 3456 3533 N
+ N JH D s n/a 24 3347 3456 3533 N
+ N JH DH s n/a 24 3347 3423 3518 N
+ N JH EH b n/a 24 3347 3475 3561 N
+ N JH EH i n/a 24 3347 3478 3561 N
+ N JH EH s n/a 24 3347 3478 3559 N
+ N JH ER b n/a 24 3347 3475 3552 N
+ N JH ER s n/a 24 3347 3478 3545 N
+ N JH EY b n/a 24 3347 3475 3562 N
+ N JH EY s n/a 24 3347 3478 3559 N
+ N JH F b n/a 24 3347 3446 3501 N
+ N JH F s n/a 24 3347 3446 3501 N
+ N JH G b n/a 24 3347 3416 3528 N
+ N JH G s n/a 24 3347 3416 3528 N
+ N JH HH s n/a 24 3347 3453 3524 N
+ N JH IH b n/a 24 3347 3470 3566 N
+ N JH IH i n/a 24 3347 3478 3555 N
+ N JH IH s n/a 24 3347 3478 3557 N
+ N JH IY b n/a 24 3347 3470 3566 N
+ N JH IY i n/a 24 3347 3478 3564 N
+ N JH IY s n/a 24 3347 3478 3564 N
+ N JH JH b n/a 24 3347 3420 3531 N
+ N JH JH s n/a 24 3347 3417 3531 N
+ N JH K b n/a 24 3347 3448 3502 N
+ N JH K s n/a 24 3347 3448 3502 N
+ N JH L b n/a 24 3347 3425 3521 N
+ N JH L s n/a 24 3347 3425 3521 N
+ N JH M s n/a 24 3347 3421 3517 N
+ N JH N s n/a 24 3347 3456 3516 N
+ N JH NG s n/a 24 3347 3421 3516 N
+ N JH OW b n/a 24 3347 3475 3552 N
+ N JH OW s n/a 24 3347 3478 3546 N
+ N JH OY b n/a 24 3347 3472 3551 N
+ N JH OY s n/a 24 3347 3472 3547 N
+ N JH P b n/a 24 3347 3447 3503 N
+ N JH P s n/a 24 3347 3447 3503 N
+ N JH R b n/a 24 3347 3426 3523 N
+ N JH R s n/a 24 3347 3426 3523 N
+ N JH S b n/a 24 3347 3446 3497 N
+ N JH S s n/a 24 3347 3446 3497 N
+ N JH SH s n/a 24 3347 3447 3508 N
+ N JH SIL s n/a 24 3347 3430 3513 N
+ N JH T b n/a 24 3347 3447 3505 N
+ N JH T s n/a 24 3347 3447 3505 N
+ N JH TH s n/a 24 3347 3446 3501 N
+ N JH UH b n/a 24 3347 3470 3567 N
+ N JH UH s n/a 24 3347 3478 3557 N
+ N JH UW b n/a 24 3347 3470 3567 N
+ N JH UW i n/a 24 3347 3478 3558 N
+ N JH UW s n/a 24 3347 3478 3557 N
+ N JH V b n/a 24 3347 3415 3519 N
+ N JH V s n/a 24 3347 3415 3519 N
+ N JH W b n/a 24 3347 3425 3522 N
+ N JH W s n/a 24 3347 3425 3522 N
+ N JH Y b n/a 24 3347 3420 3526 N
+ N JH Y s n/a 24 3347 3418 3527 N
+ N JH Z b n/a 24 3347 3435 3510 N
+ N JH Z s n/a 24 3347 3435 3510 N
+ N JH ZH s n/a 24 3347 3415 3510 N
+ N K AA b n/a 24 3347 3473 3548 N
+ N K AA e n/a 24 3347 3473 3546 N
+ N K AA i n/a 24 3347 3474 3548 N
+ N K AA s n/a 24 3347 3473 3546 N
+ N K AE b n/a 24 3347 3479 3561 N
+ N K AE e n/a 24 3347 3479 3560 N
+ N K AE i n/a 24 3347 3479 3561 N
+ N K AE s n/a 24 3347 3479 3560 N
+ N K AH b n/a 24 3347 3475 3549 N
+ N K AH e n/a 24 3347 3478 3538 N
+ N K AH i n/a 24 3347 3478 3542 N
+ N K AH s n/a 24 3347 3478 3538 N
+ N K AO b n/a 24 3347 3473 3551 N
+ N K AO e n/a 24 3347 3473 3546 N
+ N K AO i n/a 24 3347 3474 3551 N
+ N K AO s n/a 24 3347 3473 3546 N
+ N K AW b n/a 24 3347 3479 3563 N
+ N K AW e n/a 24 3347 3479 3560 N
+ N K AW i n/a 24 3347 3479 3563 N
+ N K AW s n/a 24 3347 3479 3560 N
+ N K AY b n/a 24 3347 3473 3549 N
+ N K AY e n/a 24 3347 3473 3547 N
+ N K AY i n/a 24 3347 3474 3549 N
+ N K AY s n/a 24 3347 3473 3547 N
+ N K B e n/a 24 3347 3415 3528 N
+ N K B s n/a 24 3347 3415 3528 N
+ N K CH e n/a 24 3347 3447 3509 N
+ N K CH s n/a 24 3347 3447 3509 N
+ N K D b n/a 24 3347 3456 3533 N
+ N K D e n/a 24 3347 3456 3533 N
+ N K D s n/a 24 3347 3456 3533 N
+ N K DH e n/a 24 3347 3423 3518 N
+ N K DH s n/a 24 3347 3423 3518 N
+ N K EH b n/a 24 3347 3475 3561 N
+ N K EH e n/a 24 3347 3478 3559 N
+ N K EH i n/a 24 3347 3478 3561 N
+ N K EH s n/a 24 3347 3478 3559 N
+ N K ER b n/a 24 3347 3475 3552 N
+ N K ER e n/a 24 3347 3478 3545 N
+ N K ER i n/a 24 3347 3478 3545 N
+ N K ER s n/a 24 3347 3478 3545 N
+ N K EY b n/a 24 3347 3475 3562 N
+ N K EY e n/a 24 3347 3478 3559 N
+ N K EY i n/a 24 3347 3478 3562 N
+ N K EY s n/a 24 3347 3478 3559 N
+ N K F b n/a 24 3347 3446 3501 N
+ N K F e n/a 24 3347 3446 3501 N
+ N K F s n/a 24 3347 3446 3501 N
+ N K G b n/a 24 3347 3416 3528 N
+ N K G e n/a 24 3347 3416 3528 N
+ N K G s n/a 24 3347 3416 3528 N
+ N K HH e n/a 24 3347 3453 3524 N
+ N K HH s n/a 24 3347 3453 3524 N
+ N K IH b n/a 24 3347 3470 3566 N
+ N K IH e n/a 24 3347 3478 3557 N
+ N K IH i n/a 24 3347 3478 3555 N
+ N K IH s n/a 24 3347 3478 3557 N
+ N K IY b n/a 24 3347 3470 3566 N
+ N K IY e n/a 24 3347 3478 3564 N
+ N K IY i n/a 24 3347 3478 3564 N
+ N K IY s n/a 24 3347 3478 3564 N
+ N K JH b n/a 24 3347 3420 3531 N
+ N K JH e n/a 24 3347 3417 3531 N
+ N K JH s n/a 24 3347 3417 3531 N
+ N K K b n/a 24 3347 3448 3502 N
+ N K K e n/a 24 3347 3448 3502 N
+ N K K s n/a 24 3347 3448 3502 N
+ N K L b n/a 24 3347 3425 3521 N
+ N K L e n/a 24 3347 3425 3521 N
+ N K L s n/a 24 3347 3425 3521 N
+ N K M e n/a 24 3347 3421 3517 N
+ N K M s n/a 24 3347 3421 3517 N
+ N K N e n/a 24 3347 3456 3516 N
+ N K N s n/a 24 3347 3456 3516 N
+ N K NG e n/a 24 3347 3421 3516 N
+ N K NG s n/a 24 3347 3421 3516 N
+ N K OW b n/a 24 3347 3475 3552 N
+ N K OW e n/a 24 3347 3478 3546 N
+ N K OW i n/a 24 3347 3478 3552 N
+ N K OW s n/a 24 3347 3478 3546 N
+ N K OY b n/a 24 3347 3473 3551 N
+ N K OY e n/a 24 3347 3473 3547 N
+ N K OY s n/a 24 3347 3473 3547 N
+ N K P b n/a 24 3347 3447 3503 N
+ N K P e n/a 24 3347 3447 3503 N
+ N K P s n/a 24 3347 3447 3503 N
+ N K R b n/a 24 3347 3426 3523 N
+ N K R e n/a 24 3347 3426 3523 N
+ N K R s n/a 24 3347 3426 3523 N
+ N K S b n/a 24 3347 3446 3497 N
+ N K S e n/a 24 3347 3446 3497 N
+ N K S s n/a 24 3347 3446 3497 N
+ N K SH e n/a 24 3347 3447 3508 N
+ N K SH s n/a 24 3347 3447 3508 N
+ N K SIL e n/a 24 3347 3430 3513 N
+ N K SIL s n/a 24 3347 3430 3513 N
+ N K T b n/a 24 3347 3447 3505 N
+ N K T e n/a 24 3347 3447 3505 N
+ N K T s n/a 24 3347 3447 3505 N
+ N K TH e n/a 24 3347 3446 3501 N
+ N K TH s n/a 24 3347 3446 3501 N
+ N K UH b n/a 24 3347 3470 3567 N
+ N K UH e n/a 24 3347 3478 3557 N
+ N K UH s n/a 24 3347 3478 3557 N
+ N K UW b n/a 24 3347 3470 3567 N
+ N K UW e n/a 24 3347 3478 3557 N
+ N K UW i n/a 24 3347 3478 3558 N
+ N K UW s n/a 24 3347 3478 3557 N
+ N K V b n/a 24 3347 3415 3519 N
+ N K V e n/a 24 3347 3415 3519 N
+ N K V s n/a 24 3347 3415 3519 N
+ N K W b n/a 24 3347 3425 3522 N
+ N K W e n/a 24 3347 3425 3522 N
+ N K W i n/a 24 3347 3425 3522 N
+ N K W s n/a 24 3347 3425 3522 N
+ N K Y b n/a 24 3347 3420 3526 N
+ N K Y e n/a 24 3347 3418 3527 N
+ N K Y i n/a 24 3347 3418 3526 N
+ N K Y s n/a 24 3347 3418 3527 N
+ N K Z b n/a 24 3347 3435 3510 N
+ N K Z e n/a 24 3347 3435 3510 N
+ N K Z i n/a 24 3347 3435 3510 N
+ N K Z s n/a 24 3347 3435 3510 N
+ N K ZH e n/a 24 3347 3415 3510 N
+ N K ZH s n/a 24 3347 3415 3510 N
+ N L AA b n/a 24 3372 3467 3548 N
+ N L AA e n/a 24 3372 3481 3546 N
+ N L AA i n/a 24 3372 3481 3548 N
+ N L AA s n/a 24 3372 3481 3546 N
+ N L AE b n/a 24 3372 3467 3561 N
+ N L AE e n/a 24 3372 3481 3560 N
+ N L AE i n/a 24 3372 3481 3561 N
+ N L AE s n/a 24 3372 3481 3560 N
+ N L AH b n/a 24 3372 3467 3549 N
+ N L AH e n/a 24 3372 3481 3538 N
+ N L AH i n/a 24 3372 3481 3540 N
+ N L AH s n/a 24 3372 3481 3538 N
+ N L AO b n/a 24 3372 3467 3551 N
+ N L AO e n/a 24 3372 3481 3546 N
+ N L AO i n/a 24 3372 3481 3551 N
+ N L AO s n/a 24 3372 3481 3546 N
+ N L AW b n/a 24 3372 3467 3563 N
+ N L AW e n/a 24 3372 3481 3560 N
+ N L AW s n/a 24 3372 3481 3560 N
+ N L AY b n/a 24 3372 3467 3549 N
+ N L AY e n/a 24 3372 3481 3547 N
+ N L AY i n/a 24 3372 3481 3549 N
+ N L AY s n/a 24 3372 3481 3547 N
+ N L B e n/a 24 3372 3415 3528 N
+ N L B s n/a 24 3372 3415 3528 N
+ N L CH e n/a 24 3372 3439 3509 N
+ N L CH s n/a 24 3372 3444 3509 N
+ N L D b n/a 24 3358 3463 3533 N
+ N L D e n/a 24 3358 3463 3533 N
+ N L D s n/a 24 3358 3463 3533 N
+ N L DH e n/a 24 3358 3423 3518 N
+ N L DH s n/a 24 3358 3423 3518 N
+ N L EH b n/a 24 3372 3467 3561 N
+ N L EH e n/a 24 3372 3481 3559 N
+ N L EH i n/a 24 3372 3481 3561 N
+ N L EH s n/a 24 3372 3481 3559 N
+ N L ER b n/a 24 3372 3467 3553 N
+ N L ER e n/a 24 3372 3481 3545 N
+ N L ER i n/a 24 3372 3481 3545 N
+ N L ER s n/a 24 3372 3481 3545 N
+ N L EY b n/a 24 3372 3467 3562 N
+ N L EY e n/a 24 3372 3481 3559 N
+ N L EY s n/a 24 3372 3481 3559 N
+ N L F b n/a 24 3372 3444 3500 N
+ N L F e n/a 24 3372 3440 3500 N
+ N L F s n/a 24 3372 3444 3500 N
+ N L G b n/a 24 3372 3416 3528 N
+ N L G e n/a 24 3372 3416 3528 N
+ N L G s n/a 24 3372 3416 3528 N
+ N L HH e n/a 24 3372 3445 3525 N
+ N L HH i n/a 24 3372 3445 3525 N
+ N L HH s n/a 24 3372 3445 3525 N
+ N L IH b n/a 24 3372 3471 3566 N
+ N L IH e n/a 24 3372 3481 3555 N
+ N L IH i n/a 24 3372 3481 3555 N
+ N L IH s n/a 24 3372 3481 3555 N
+ N L IY b n/a 24 3372 3471 3566 N
+ N L IY e n/a 24 3372 3492 3564 N
+ N L IY i n/a 24 3372 3493 3564 N
+ N L IY s n/a 24 3372 3492 3564 N
+ N L JH b n/a 24 3372 3420 3531 N
+ N L JH e n/a 24 3372 3417 3531 N
+ N L JH s n/a 24 3372 3417 3531 N
+ N L K b n/a 24 3372 3444 3502 N
+ N L K e n/a 24 3372 3440 3502 N
+ N L K s n/a 24 3372 3444 3502 N
+ N L L b n/a 24 3372 3425 3521 N
+ N L L e n/a 24 3372 3425 3521 N
+ N L L s n/a 24 3372 3425 3521 N
+ N L M e n/a 24 3372 3421 3517 N
+ N L M s n/a 24 3372 3421 3517 N
+ N L N e n/a 24 3358 3463 3516 N
+ N L N s n/a 24 3358 3463 3516 N
+ N L NG e n/a 24 3372 3421 3516 N
+ N L NG s n/a 24 3372 3421 3516 N
+ N L OW b n/a 24 3372 3467 3553 N
+ N L OW e n/a 24 3372 3481 3546 N
+ N L OW i n/a 24 3372 3481 3553 N
+ N L OW s n/a 24 3372 3481 3546 N
+ N L OY b n/a 24 3372 3467 3551 N
+ N L OY e n/a 24 3372 3481 3547 N
+ N L OY s n/a 24 3372 3481 3547 N
+ N L P b n/a 24 3372 3444 3504 N
+ N L P e n/a 24 3372 3440 3506 N
+ N L P s n/a 24 3372 3444 3504 N
+ N L R b n/a 24 3372 3426 3523 N
+ N L R e n/a 24 3372 3426 3523 N
+ N L R s n/a 24 3372 3426 3523 N
+ N L S b n/a 24 3361 3444 3497 N
+ N L S e n/a 24 3361 3437 3497 N
+ N L S s n/a 24 3361 3444 3497 N
+ N L SH e n/a 24 3372 3440 3508 N
+ N L SH s n/a 24 3372 3444 3508 N
+ N L SIL e n/a 24 3357 3430 3511 N
+ N L SIL s n/a 24 3357 3430 3511 N
+ N L T b n/a 24 3358 3444 3504 N
+ N L T e n/a 24 3358 3438 3506 N
+ N L T i n/a 24 3358 3444 3504 N
+ N L T s n/a 24 3358 3444 3504 N
+ N L TH e n/a 24 3361 3439 3500 N
+ N L TH s n/a 24 3361 3444 3500 N
+ N L UH b n/a 24 3372 3471 3567 N
+ N L UH e n/a 24 3372 3481 3555 N
+ N L UH i n/a 24 3372 3481 3555 N
+ N L UH s n/a 24 3372 3481 3555 N
+ N L UW b n/a 24 3372 3471 3567 N
+ N L UW e n/a 24 3372 3481 3555 N
+ N L UW i n/a 24 3372 3481 3558 N
+ N L UW s n/a 24 3372 3481 3555 N
+ N L V b n/a 24 3372 3415 3519 N
+ N L V e n/a 24 3372 3415 3519 N
+ N L V s n/a 24 3372 3415 3519 N
+ N L W b n/a 24 3372 3425 3522 N
+ N L W e n/a 24 3372 3425 3522 N
+ N L W s n/a 24 3372 3425 3522 N
+ N L Y b n/a 24 3372 3420 3526 N
+ N L Y e n/a 24 3372 3418 3527 N
+ N L Y s n/a 24 3372 3418 3527 N
+ N L Z b n/a 24 3358 3435 3510 N
+ N L Z e n/a 24 3358 3435 3510 N
+ N L Z i n/a 24 3358 3435 3510 N
+ N L Z s n/a 24 3358 3435 3510 N
+ N L ZH e n/a 24 3372 3415 3510 N
+ N L ZH s n/a 24 3372 3415 3510 N
+ N M AA b n/a 24 3351 3472 3548 N
+ N M AA e n/a 24 3351 3472 3546 N
+ N M AA i n/a 24 3351 3472 3548 N
+ N M AA s n/a 24 3351 3472 3546 N
+ N M AE b n/a 24 3351 3479 3561 N
+ N M AE e n/a 24 3351 3479 3560 N
+ N M AE i n/a 24 3351 3479 3561 N
+ N M AE s n/a 24 3351 3479 3560 N
+ N M AH b n/a 24 3351 3477 3549 N
+ N M AH e n/a 24 3351 3477 3538 N
+ N M AH i n/a 24 3351 3477 3542 N
+ N M AH s n/a 24 3351 3477 3538 N
+ N M AO b n/a 24 3351 3472 3551 N
+ N M AO e n/a 24 3351 3472 3546 N
+ N M AO s n/a 24 3351 3472 3546 N
+ N M AW b n/a 24 3351 3479 3563 N
+ N M AW e n/a 24 3351 3479 3560 N
+ N M AW i n/a 24 3351 3479 3563 N
+ N M AW s n/a 24 3351 3479 3560 N
+ N M AY b n/a 24 3351 3472 3549 N
+ N M AY e n/a 24 3351 3472 3547 N
+ N M AY i n/a 24 3351 3472 3549 N
+ N M AY s n/a 24 3351 3472 3547 N
+ N M B e n/a 24 3351 3415 3528 N
+ N M B s n/a 24 3351 3415 3528 N
+ N M CH e n/a 24 3351 3447 3509 N
+ N M CH s n/a 24 3351 3447 3509 N
+ N M D b n/a 24 3351 3456 3533 N
+ N M D e n/a 24 3351 3456 3533 N
+ N M D i n/a 24 3351 3456 3532 N
+ N M D s n/a 24 3351 3456 3533 N
+ N M DH e n/a 24 3351 3423 3518 N
+ N M DH s n/a 24 3351 3423 3518 N
+ N M EH b n/a 24 3351 3477 3561 N
+ N M EH e n/a 24 3351 3477 3559 N
+ N M EH i n/a 24 3351 3477 3561 N
+ N M EH s n/a 24 3351 3477 3559 N
+ N M ER b n/a 24 3351 3477 3552 N
+ N M ER e n/a 24 3351 3477 3545 N
+ N M ER i n/a 24 3351 3477 3545 N
+ N M ER s n/a 24 3351 3477 3545 N
+ N M EY b n/a 24 3351 3477 3562 N
+ N M EY e n/a 24 3351 3477 3559 N
+ N M EY i n/a 24 3351 3477 3562 N
+ N M EY s n/a 24 3351 3477 3559 N
+ N M F b n/a 24 3351 3446 3501 N
+ N M F e n/a 24 3351 3446 3501 N
+ N M F s n/a 24 3351 3446 3501 N
+ N M G b n/a 24 3351 3416 3528 N
+ N M G e n/a 24 3351 3416 3528 N
+ N M G s n/a 24 3351 3416 3528 N
+ N M HH e n/a 24 3351 3453 3524 N
+ N M HH s n/a 24 3351 3453 3524 N
+ N M IH b n/a 24 3351 3471 3566 N
+ N M IH e n/a 24 3351 3477 3557 N
+ N M IH i n/a 24 3351 3477 3555 N
+ N M IH s n/a 24 3351 3477 3557 N
+ N M IY b n/a 24 3351 3471 3566 N
+ N M IY e n/a 24 3351 3477 3564 N
+ N M IY i n/a 24 3351 3477 3564 N
+ N M IY s n/a 24 3351 3477 3564 N
+ N M JH b n/a 24 3351 3420 3531 N
+ N M JH e n/a 24 3351 3417 3531 N
+ N M JH s n/a 24 3351 3417 3531 N
+ N M K b n/a 24 3351 3448 3502 N
+ N M K e n/a 24 3351 3448 3502 N
+ N M K s n/a 24 3351 3448 3502 N
+ N M L b n/a 24 3351 3425 3521 N
+ N M L e n/a 24 3351 3425 3521 N
+ N M L s n/a 24 3351 3425 3521 N
+ N M M e n/a 24 3351 3421 3517 N
+ N M M s n/a 24 3351 3421 3517 N
+ N M N e n/a 24 3351 3456 3516 N
+ N M N s n/a 24 3351 3456 3516 N
+ N M NG e n/a 24 3351 3421 3516 N
+ N M NG s n/a 24 3351 3421 3516 N
+ N M OW b n/a 24 3351 3477 3552 N
+ N M OW e n/a 24 3351 3477 3546 N
+ N M OW i n/a 24 3351 3477 3552 N
+ N M OW s n/a 24 3351 3477 3546 N
+ N M OY b n/a 24 3351 3472 3551 N
+ N M OY e n/a 24 3351 3472 3547 N
+ N M OY s n/a 24 3351 3472 3547 N
+ N M P b n/a 24 3351 3447 3503 N
+ N M P e n/a 24 3351 3447 3503 N
+ N M P s n/a 24 3351 3447 3503 N
+ N M R b n/a 24 3351 3426 3523 N
+ N M R e n/a 24 3351 3426 3523 N
+ N M R s n/a 24 3351 3426 3523 N
+ N M S b n/a 24 3351 3446 3497 N
+ N M S e n/a 24 3351 3446 3497 N
+ N M S s n/a 24 3351 3446 3497 N
+ N M SH e n/a 24 3351 3447 3508 N
+ N M SH s n/a 24 3351 3447 3508 N
+ N M SIL e n/a 24 3351 3430 3513 N
+ N M SIL s n/a 24 3351 3430 3513 N
+ N M T b n/a 24 3351 3447 3505 N
+ N M T e n/a 24 3351 3447 3505 N
+ N M T i n/a 24 3351 3441 3505 N
+ N M T s n/a 24 3351 3447 3505 N
+ N M TH e n/a 24 3351 3446 3501 N
+ N M TH s n/a 24 3351 3446 3501 N
+ N M UH b n/a 24 3351 3471 3567 N
+ N M UH e n/a 24 3351 3477 3557 N
+ N M UH i n/a 24 3351 3477 3555 N
+ N M UH s n/a 24 3351 3477 3557 N
+ N M UW b n/a 24 3351 3471 3567 N
+ N M UW e n/a 24 3351 3477 3557 N
+ N M UW i n/a 24 3351 3477 3558 N
+ N M UW s n/a 24 3351 3477 3557 N
+ N M V b n/a 24 3351 3415 3519 N
+ N M V e n/a 24 3351 3415 3519 N
+ N M V s n/a 24 3351 3415 3519 N
+ N M W b n/a 24 3351 3425 3522 N
+ N M W e n/a 24 3351 3425 3522 N
+ N M W s n/a 24 3351 3425 3522 N
+ N M Y b n/a 24 3351 3420 3526 N
+ N M Y e n/a 24 3351 3418 3527 N
+ N M Y s n/a 24 3351 3418 3527 N
+ N M Z b n/a 24 3351 3435 3510 N
+ N M Z e n/a 24 3351 3435 3510 N
+ N M Z i n/a 24 3351 3435 3510 N
+ N M Z s n/a 24 3351 3435 3510 N
+ N M ZH e n/a 24 3351 3415 3510 N
+ N M ZH s n/a 24 3351 3415 3510 N
+ N N AA b n/a 24 3351 3472 3548 N
+ N N AA i n/a 24 3351 3472 3548 N
+ N N AA s n/a 24 3351 3472 3546 N
+ N N AE b n/a 24 3351 3479 3561 N
+ N N AE i n/a 24 3351 3479 3561 N
+ N N AE s n/a 24 3351 3479 3560 N
+ N N AH b n/a 24 3351 3477 3549 N
+ N N AH i n/a 24 3351 3477 3542 N
+ N N AH s n/a 24 3351 3477 3538 N
+ N N AO b n/a 24 3351 3472 3551 N
+ N N AO s n/a 24 3351 3472 3546 N
+ N N AW b n/a 24 3351 3479 3563 N
+ N N AW s n/a 24 3351 3479 3560 N
+ N N AY b n/a 24 3351 3472 3549 N
+ N N AY i n/a 24 3351 3472 3549 N
+ N N AY s n/a 24 3351 3472 3547 N
+ N N B s n/a 24 3351 3415 3528 N
+ N N CH s n/a 24 3351 3447 3509 N
+ N N D b n/a 24 3351 3456 3533 N
+ N N D s n/a 24 3351 3456 3533 N
+ N N DH s n/a 24 3351 3423 3518 N
+ N N EH b n/a 24 3351 3477 3561 N
+ N N EH i n/a 24 3351 3477 3561 N
+ N N EH s n/a 24 3351 3477 3559 N
+ N N ER b n/a 24 3351 3477 3552 N
+ N N ER i n/a 24 3351 3477 3545 N
+ N N ER s n/a 24 3351 3477 3545 N
+ N N EY b n/a 24 3351 3477 3562 N
+ N N EY i n/a 24 3351 3477 3562 N
+ N N EY s n/a 24 3351 3477 3559 N
+ N N F b n/a 24 3351 3446 3501 N
+ N N F s n/a 24 3351 3446 3501 N
+ N N G b n/a 24 3351 3416 3528 N
+ N N G s n/a 24 3351 3416 3528 N
+ N N HH s n/a 24 3351 3453 3524 N
+ N N IH b n/a 24 3351 3471 3566 N
+ N N IH i n/a 24 3351 3477 3555 N
+ N N IH s n/a 24 3351 3477 3557 N
+ N N IY b n/a 24 3351 3471 3566 N
+ N N IY i n/a 24 3351 3477 3564 N
+ N N IY s n/a 24 3351 3477 3564 N
+ N N JH b n/a 24 3351 3420 3531 N
+ N N JH s n/a 24 3351 3417 3531 N
+ N N K b n/a 24 3351 3448 3502 N
+ N N K s n/a 24 3351 3448 3502 N
+ N N L b n/a 24 3351 3425 3521 N
+ N N L s n/a 24 3351 3425 3521 N
+ N N M s n/a 24 3351 3421 3517 N
+ N N N s n/a 24 3351 3456 3516 N
+ N N NG s n/a 24 3351 3421 3516 N
+ N N OW b n/a 24 3351 3477 3553 N
+ N N OW i n/a 24 3351 3477 3553 N
+ N N OW s n/a 24 3351 3477 3546 N
+ N N OY b n/a 24 3351 3472 3551 N
+ N N OY s n/a 24 3351 3472 3547 N
+ N N P b n/a 24 3351 3447 3503 N
+ N N P s n/a 24 3351 3447 3503 N
+ N N R b n/a 24 3351 3426 3523 N
+ N N R s n/a 24 3351 3426 3523 N
+ N N S b n/a 24 3351 3446 3497 N
+ N N S s n/a 24 3351 3446 3497 N
+ N N SH s n/a 24 3351 3447 3508 N
+ N N SIL s n/a 24 3351 3430 3513 N
+ N N T b n/a 24 3351 3447 3505 N
+ N N T i n/a 24 3351 3441 3505 N
+ N N T s n/a 24 3351 3447 3505 N
+ N N TH s n/a 24 3351 3446 3501 N
+ N N UH b n/a 24 3351 3471 3567 N
+ N N UH s n/a 24 3351 3477 3557 N
+ N N UW b n/a 24 3351 3471 3567 N
+ N N UW s n/a 24 3351 3477 3557 N
+ N N V b n/a 24 3351 3415 3519 N
+ N N V s n/a 24 3351 3415 3519 N
+ N N W b n/a 24 3351 3425 3522 N
+ N N W i n/a 24 3351 3425 3522 N
+ N N W s n/a 24 3351 3425 3522 N
+ N N Y b n/a 24 3351 3420 3526 N
+ N N Y s n/a 24 3351 3418 3527 N
+ N N Z b n/a 24 3351 3435 3510 N
+ N N Z s n/a 24 3351 3435 3510 N
+ N N ZH s n/a 24 3351 3415 3510 N
+ N NG AA b n/a 24 3351 3472 3548 N
+ N NG AA s n/a 24 3351 3472 3546 N
+ N NG AE b n/a 24 3351 3479 3561 N
+ N NG AE s n/a 24 3351 3479 3560 N
+ N NG AH b n/a 24 3351 3477 3549 N
+ N NG AH i n/a 24 3351 3477 3542 N
+ N NG AH s n/a 24 3351 3477 3538 N
+ N NG AO b n/a 24 3351 3472 3551 N
+ N NG AO s n/a 24 3351 3472 3546 N
+ N NG AW b n/a 24 3351 3479 3563 N
+ N NG AW s n/a 24 3351 3479 3560 N
+ N NG AY b n/a 24 3351 3472 3549 N
+ N NG AY s n/a 24 3351 3472 3547 N
+ N NG B s n/a 24 3351 3415 3528 N
+ N NG CH s n/a 24 3351 3447 3509 N
+ N NG D b n/a 24 3351 3456 3533 N
+ N NG D s n/a 24 3351 3456 3533 N
+ N NG DH s n/a 24 3351 3423 3518 N
+ N NG EH b n/a 24 3351 3477 3561 N
+ N NG EH i n/a 24 3351 3477 3561 N
+ N NG EH s n/a 24 3351 3477 3559 N
+ N NG ER b n/a 24 3351 3477 3552 N
+ N NG ER i n/a 24 3351 3477 3545 N
+ N NG ER s n/a 24 3351 3477 3545 N
+ N NG EY b n/a 24 3351 3477 3562 N
+ N NG EY s n/a 24 3351 3477 3559 N
+ N NG F b n/a 24 3351 3446 3501 N
+ N NG F s n/a 24 3351 3446 3501 N
+ N NG G b n/a 24 3351 3416 3528 N
+ N NG G s n/a 24 3351 3416 3528 N
+ N NG HH s n/a 24 3351 3453 3524 N
+ N NG IH b n/a 24 3351 3471 3566 N
+ N NG IH i n/a 24 3351 3477 3555 N
+ N NG IH s n/a 24 3351 3477 3557 N
+ N NG IY b n/a 24 3351 3471 3566 N
+ N NG IY s n/a 24 3351 3477 3564 N
+ N NG JH b n/a 24 3351 3420 3531 N
+ N NG JH s n/a 24 3351 3417 3531 N
+ N NG K b n/a 24 3351 3448 3502 N
+ N NG K s n/a 24 3351 3448 3502 N
+ N NG L b n/a 24 3351 3425 3521 N
+ N NG L s n/a 24 3351 3425 3521 N
+ N NG M s n/a 24 3351 3421 3517 N
+ N NG N s n/a 24 3351 3456 3516 N
+ N NG NG s n/a 24 3351 3421 3516 N
+ N NG OW b n/a 24 3351 3477 3552 N
+ N NG OW s n/a 24 3351 3477 3546 N
+ N NG OY b n/a 24 3351 3472 3551 N
+ N NG OY s n/a 24 3351 3472 3547 N
+ N NG P b n/a 24 3351 3447 3503 N
+ N NG P s n/a 24 3351 3447 3503 N
+ N NG R b n/a 24 3351 3426 3523 N
+ N NG R s n/a 24 3351 3426 3523 N
+ N NG S b n/a 24 3351 3446 3497 N
+ N NG S s n/a 24 3351 3446 3497 N
+ N NG SH s n/a 24 3351 3447 3508 N
+ N NG SIL s n/a 24 3351 3430 3513 N
+ N NG T b n/a 24 3351 3447 3505 N
+ N NG T s n/a 24 3351 3447 3505 N
+ N NG TH s n/a 24 3351 3446 3501 N
+ N NG UH b n/a 24 3351 3471 3567 N
+ N NG UH s n/a 24 3351 3477 3557 N
+ N NG UW b n/a 24 3351 3471 3567 N
+ N NG UW s n/a 24 3351 3477 3557 N
+ N NG V b n/a 24 3351 3415 3519 N
+ N NG V s n/a 24 3351 3415 3519 N
+ N NG W b n/a 24 3351 3425 3522 N
+ N NG W s n/a 24 3351 3425 3522 N
+ N NG Y b n/a 24 3351 3420 3526 N
+ N NG Y s n/a 24 3351 3418 3527 N
+ N NG Z b n/a 24 3351 3435 3510 N
+ N NG Z s n/a 24 3351 3435 3510 N
+ N NG ZH s n/a 24 3351 3415 3510 N
+ N OW AA b n/a 24 3386 3466 3550 N
+ N OW AA e n/a 24 3386 3481 3546 N
+ N OW AA i n/a 24 3386 3481 3550 N
+ N OW AA s n/a 24 3386 3481 3546 N
+ N OW AE b n/a 24 3386 3466 3561 N
+ N OW AE e n/a 24 3386 3481 3560 N
+ N OW AE i n/a 24 3386 3481 3561 N
+ N OW AE s n/a 24 3386 3481 3560 N
+ N OW AH b n/a 24 3386 3466 3549 N
+ N OW AH e n/a 24 3386 3481 3538 N
+ N OW AH i n/a 24 3386 3481 3539 N
+ N OW AH s n/a 24 3386 3481 3538 N
+ N OW AO b n/a 24 3386 3466 3551 N
+ N OW AO e n/a 24 3386 3481 3546 N
+ N OW AO i n/a 24 3386 3481 3551 N
+ N OW AO s n/a 24 3386 3481 3546 N
+ N OW AW b n/a 24 3386 3466 3563 N
+ N OW AW e n/a 24 3386 3481 3560 N
+ N OW AW i n/a 24 3386 3481 3563 N
+ N OW AW s n/a 24 3386 3481 3560 N
+ N OW AY b n/a 24 3386 3466 3549 N
+ N OW AY e n/a 24 3386 3481 3547 N
+ N OW AY i n/a 24 3386 3481 3549 N
+ N OW AY s n/a 24 3386 3481 3547 N
+ N OW B e n/a 24 3385 3415 3528 N
+ N OW B i n/a 24 3385 3415 3528 N
+ N OW B s n/a 24 3385 3415 3528 N
+ N OW CH e n/a 24 3385 3440 3509 N
+ N OW CH s n/a 24 3385 3444 3509 N
+ N OW D b n/a 24 3385 3463 3537 N
+ N OW D e n/a 24 3385 3463 3537 N
+ N OW D i n/a 24 3385 3463 3537 N
+ N OW D s n/a 24 3385 3463 3537 N
+ N OW DH e n/a 24 3385 3423 3518 N
+ N OW DH s n/a 24 3385 3423 3518 N
+ N OW EH b n/a 24 3386 3466 3561 N
+ N OW EH e n/a 24 3386 3481 3559 N
+ N OW EH i n/a 24 3386 3481 3561 N
+ N OW EH s n/a 24 3386 3481 3559 N
+ N OW ER b n/a 24 3386 3466 3552 N
+ N OW ER e n/a 24 3386 3481 3545 N
+ N OW ER i n/a 24 3386 3481 3545 N
+ N OW ER s n/a 24 3386 3481 3545 N
+ N OW EY b n/a 24 3386 3466 3562 N
+ N OW EY e n/a 24 3386 3481 3559 N
+ N OW EY i n/a 24 3386 3481 3562 N
+ N OW EY s n/a 24 3386 3481 3559 N
+ N OW F b n/a 24 3385 3444 3500 N
+ N OW F e n/a 24 3385 3440 3500 N
+ N OW F i n/a 24 3385 3444 3500 N
+ N OW F s n/a 24 3385 3444 3500 N
+ N OW G b n/a 24 3385 3416 3528 N
+ N OW G e n/a 24 3385 3416 3528 N
+ N OW G s n/a 24 3385 3416 3528 N
+ N OW HH e n/a 24 3385 3445 3525 N
+ N OW HH i n/a 24 3385 3445 3525 N
+ N OW HH s n/a 24 3385 3445 3525 N
+ N OW IH b n/a 24 3386 3471 3566 N
+ N OW IH e n/a 24 3386 3481 3555 N
+ N OW IH i n/a 24 3386 3481 3555 N
+ N OW IH s n/a 24 3386 3481 3555 N
+ N OW IY b n/a 24 3386 3471 3566 N
+ N OW IY e n/a 24 3386 3493 3564 N
+ N OW IY i n/a 24 3386 3493 3564 N
+ N OW IY s n/a 24 3386 3493 3564 N
+ N OW JH b n/a 24 3385 3420 3531 N
+ N OW JH e n/a 24 3385 3417 3531 N
+ N OW JH i n/a 24 3385 3417 3531 N
+ N OW JH s n/a 24 3385 3417 3531 N
+ N OW K b n/a 24 3385 3444 3502 N
+ N OW K e n/a 24 3385 3440 3502 N
+ N OW K i n/a 24 3385 3444 3502 N
+ N OW K s n/a 24 3385 3444 3502 N
+ N OW L b n/a 24 3387 3428 3521 N
+ N OW L e n/a 24 3387 3428 3521 N
+ N OW L i n/a 24 3387 3428 3520 N
+ N OW L s n/a 24 3387 3428 3521 N
+ N OW M e n/a 24 3385 3423 3517 N
+ N OW M i n/a 24 3385 3423 3517 N
+ N OW M s n/a 24 3385 3423 3517 N
+ N OW N e n/a 24 3385 3463 3516 N
+ N OW N s n/a 24 3385 3463 3516 N
+ N OW NG e n/a 24 3385 3423 3516 N
+ N OW NG s n/a 24 3385 3423 3516 N
+ N OW OW b n/a 24 3386 3466 3552 N
+ N OW OW e n/a 24 3386 3481 3546 N
+ N OW OW i n/a 24 3386 3481 3552 N
+ N OW OW s n/a 24 3386 3481 3546 N
+ N OW OY b n/a 24 3386 3466 3551 N
+ N OW OY e n/a 24 3386 3481 3547 N
+ N OW OY i n/a 24 3386 3481 3551 N
+ N OW OY s n/a 24 3386 3481 3547 N
+ N OW P b n/a 24 3385 3444 3504 N
+ N OW P e n/a 24 3385 3440 3506 N
+ N OW P i n/a 24 3385 3444 3504 N
+ N OW P s n/a 24 3385 3444 3504 N
+ N OW R b n/a 24 3386 3428 3523 N
+ N OW R e n/a 24 3386 3428 3523 N
+ N OW R i n/a 24 3386 3428 3523 N
+ N OW R s n/a 24 3386 3428 3523 N
+ N OW S b n/a 24 3385 3444 3497 N
+ N OW S e n/a 24 3385 3440 3497 N
+ N OW S i n/a 24 3385 3444 3498 N
+ N OW S s n/a 24 3385 3444 3497 N
+ N OW SH e n/a 24 3385 3440 3508 N
+ N OW SH i n/a 24 3385 3444 3508 N
+ N OW SH s n/a 24 3385 3444 3508 N
+ N OW SIL e n/a 24 3385 3429 3511 N
+ N OW SIL s n/a 24 3385 3429 3511 N
+ N OW T b n/a 24 3385 3444 3504 N
+ N OW T e n/a 24 3385 3440 3506 N
+ N OW T i n/a 24 3385 3444 3504 N
+ N OW T s n/a 24 3385 3444 3504 N
+ N OW TH e n/a 24 3385 3440 3500 N
+ N OW TH i n/a 24 3385 3444 3500 N
+ N OW TH s n/a 24 3385 3444 3500 N
+ N OW UH b n/a 24 3386 3471 3567 N
+ N OW UH e n/a 24 3386 3481 3555 N
+ N OW UH i n/a 24 3386 3481 3555 N
+ N OW UH s n/a 24 3386 3481 3555 N
+ N OW UW b n/a 24 3386 3471 3567 N
+ N OW UW e n/a 24 3386 3481 3555 N
+ N OW UW i n/a 24 3386 3481 3558 N
+ N OW UW s n/a 24 3386 3481 3555 N
+ N OW V b n/a 24 3385 3415 3519 N
+ N OW V e n/a 24 3385 3415 3519 N
+ N OW V i n/a 24 3385 3415 3519 N
+ N OW V s n/a 24 3385 3415 3519 N
+ N OW W b n/a 24 3387 3428 3522 N
+ N OW W e n/a 24 3387 3428 3522 N
+ N OW W i n/a 24 3387 3428 3522 N
+ N OW W s n/a 24 3387 3428 3522 N
+ N OW Y b n/a 24 3386 3420 3526 N
+ N OW Y e n/a 24 3386 3418 3527 N
+ N OW Y i n/a 24 3386 3418 3526 N
+ N OW Y s n/a 24 3386 3418 3527 N
+ N OW Z b n/a 24 3385 3435 3510 N
+ N OW Z e n/a 24 3385 3435 3510 N
+ N OW Z i n/a 24 3385 3435 3510 N
+ N OW Z s n/a 24 3385 3435 3510 N
+ N OW ZH e n/a 24 3385 3415 3510 N
+ N OW ZH s n/a 24 3385 3415 3510 N
+ N OY AA b n/a 24 3405 3469 3550 N
+ N OY AA e n/a 24 3405 3489 3546 N
+ N OY AA i n/a 24 3405 3489 3550 N
+ N OY AA s n/a 24 3405 3489 3546 N
+ N OY AE b n/a 24 3405 3469 3561 N
+ N OY AE e n/a 24 3405 3489 3560 N
+ N OY AE s n/a 24 3405 3489 3560 N
+ N OY AH b n/a 24 3405 3469 3549 N
+ N OY AH e n/a 24 3405 3489 3538 N
+ N OY AH i n/a 24 3405 3489 3539 N
+ N OY AH s n/a 24 3405 3489 3538 N
+ N OY AO b n/a 24 3405 3469 3551 N
+ N OY AO e n/a 24 3405 3489 3546 N
+ N OY AO s n/a 24 3405 3489 3546 N
+ N OY AW b n/a 24 3405 3469 3563 N
+ N OY AW e n/a 24 3405 3489 3560 N
+ N OY AW i n/a 24 3405 3489 3563 N
+ N OY AW s n/a 24 3405 3489 3560 N
+ N OY AY b n/a 24 3405 3469 3549 N
+ N OY AY e n/a 24 3405 3489 3547 N
+ N OY AY s n/a 24 3405 3489 3547 N
+ N OY B e n/a 24 3408 3462 3528 N
+ N OY B i n/a 24 3408 3462 3528 N
+ N OY B s n/a 24 3408 3462 3528 N
+ N OY CH e n/a 24 3408 3450 3509 N
+ N OY CH s n/a 24 3408 3450 3509 N
+ N OY D b n/a 24 3408 3462 3536 N
+ N OY D e n/a 24 3408 3462 3537 N
+ N OY D i n/a 24 3407 3461 3536 N
+ N OY D s n/a 24 3408 3462 3536 N
+ N OY DH e n/a 24 3408 3462 3518 N
+ N OY DH s n/a 24 3408 3462 3518 N
+ N OY EH b n/a 24 3405 3469 3561 N
+ N OY EH e n/a 24 3405 3489 3559 N
+ N OY EH s n/a 24 3405 3489 3559 N
+ N OY ER b n/a 24 3405 3469 3552 N
+ N OY ER e n/a 24 3405 3489 3545 N
+ N OY ER i n/a 24 3405 3489 3545 N
+ N OY ER s n/a 24 3405 3489 3545 N
+ N OY EY b n/a 24 3405 3469 3562 N
+ N OY EY e n/a 24 3405 3489 3559 N
+ N OY EY s n/a 24 3405 3489 3559 N
+ N OY F b n/a 24 3408 3450 3501 N
+ N OY F e n/a 24 3408 3450 3501 N
+ N OY F s n/a 24 3408 3450 3501 N
+ N OY G b n/a 24 3408 3462 3529 N
+ N OY G e n/a 24 3408 3462 3529 N
+ N OY G s n/a 24 3408 3462 3529 N
+ N OY HH e n/a 24 3408 3453 3525 N
+ N OY HH s n/a 24 3408 3453 3525 N
+ N OY IH b n/a 24 3408 3471 3566 N
+ N OY IH e n/a 24 3408 3492 3557 N
+ N OY IH i n/a 24 3408 3492 3556 N
+ N OY IH s n/a 24 3408 3492 3557 N
+ N OY IY b n/a 24 3408 3471 3566 N
+ N OY IY e n/a 24 3408 3492 3565 N
+ N OY IY i n/a 24 3408 3492 3565 N
+ N OY IY s n/a 24 3408 3492 3565 N
+ N OY JH b n/a 24 3408 3462 3531 N
+ N OY JH e n/a 24 3408 3462 3531 N
+ N OY JH s n/a 24 3408 3462 3531 N
+ N OY K b n/a 24 3409 3448 3502 N
+ N OY K e n/a 24 3409 3448 3502 N
+ N OY K i n/a 24 3409 3450 3502 N
+ N OY K s n/a 24 3409 3448 3502 N
+ N OY L b n/a 24 3405 3462 3521 N
+ N OY L e n/a 24 3405 3462 3521 N
+ N OY L s n/a 24 3405 3462 3521 N
+ N OY M e n/a 24 3408 3462 3517 N
+ N OY M i n/a 24 3408 3462 3517 N
+ N OY M s n/a 24 3408 3462 3517 N
+ N OY N e n/a 24 3408 3462 3516 N
+ N OY N i n/a 24 3407 3461 3516 N
+ N OY N s n/a 24 3408 3462 3516 N
+ N OY NG e n/a 24 3408 3462 3516 N
+ N OY NG s n/a 24 3408 3462 3516 N
+ N OY OW b n/a 24 3405 3469 3552 N
+ N OY OW e n/a 24 3405 3489 3546 N
+ N OY OW s n/a 24 3405 3489 3546 N
+ N OY OY b n/a 24 3405 3469 3551 N
+ N OY OY e n/a 24 3405 3489 3547 N
+ N OY OY s n/a 24 3405 3489 3547 N
+ N OY P b n/a 24 3409 3450 3503 N
+ N OY P e n/a 24 3409 3450 3503 N
+ N OY P s n/a 24 3409 3450 3503 N
+ N OY R b n/a 24 3405 3462 3523 N
+ N OY R e n/a 24 3405 3462 3523 N
+ N OY R s n/a 24 3405 3462 3523 N
+ N OY S b n/a 24 3408 3450 3497 N
+ N OY S e n/a 24 3408 3450 3497 N
+ N OY S i n/a 24 3408 3450 3498 N
+ N OY S s n/a 24 3408 3450 3497 N
+ N OY SH e n/a 24 3408 3450 3508 N
+ N OY SH s n/a 24 3408 3450 3508 N
+ N OY SIL e n/a 24 3408 3431 3511 N
+ N OY SIL s n/a 24 3408 3431 3511 N
+ N OY T b n/a 24 3409 3449 3507 N
+ N OY T e n/a 24 3409 3449 3507 N
+ N OY T i n/a 24 3409 3449 3507 N
+ N OY T s n/a 24 3409 3449 3507 N
+ N OY TH e n/a 24 3408 3450 3501 N
+ N OY TH s n/a 24 3408 3450 3501 N
+ N OY UH b n/a 24 3408 3471 3567 N
+ N OY UH e n/a 24 3408 3492 3557 N
+ N OY UH s n/a 24 3408 3492 3557 N
+ N OY UW b n/a 24 3408 3471 3567 N
+ N OY UW e n/a 24 3408 3492 3557 N
+ N OY UW s n/a 24 3408 3492 3557 N
+ N OY V b n/a 24 3408 3462 3519 N
+ N OY V e n/a 24 3408 3462 3519 N
+ N OY V s n/a 24 3408 3462 3519 N
+ N OY W b n/a 24 3405 3462 3522 N
+ N OY W e n/a 24 3405 3462 3522 N
+ N OY W s n/a 24 3405 3462 3522 N
+ N OY Y b n/a 24 3408 3462 3526 N
+ N OY Y e n/a 24 3408 3462 3527 N
+ N OY Y i n/a 24 3408 3462 3527 N
+ N OY Y s n/a 24 3408 3462 3527 N
+ N OY Z b n/a 24 3408 3462 3510 N
+ N OY Z e n/a 24 3408 3462 3510 N
+ N OY Z i n/a 24 3408 3462 3510 N
+ N OY Z s n/a 24 3408 3462 3510 N
+ N OY ZH e n/a 24 3408 3462 3510 N
+ N OY ZH s n/a 24 3408 3462 3510 N
+ N P AA b n/a 24 3347 3473 3548 N
+ N P AA e n/a 24 3347 3473 3546 N
+ N P AA i n/a 24 3347 3474 3548 N
+ N P AA s n/a 24 3347 3473 3546 N
+ N P AE b n/a 24 3347 3479 3561 N
+ N P AE e n/a 24 3347 3479 3560 N
+ N P AE i n/a 24 3347 3479 3561 N
+ N P AE s n/a 24 3347 3479 3560 N
+ N P AH b n/a 24 3347 3475 3549 N
+ N P AH e n/a 24 3347 3478 3538 N
+ N P AH i n/a 24 3347 3478 3542 N
+ N P AH s n/a 24 3347 3478 3538 N
+ N P AO b n/a 24 3347 3473 3551 N
+ N P AO e n/a 24 3347 3473 3546 N
+ N P AO i n/a 24 3347 3474 3551 N
+ N P AO s n/a 24 3347 3473 3546 N
+ N P AW b n/a 24 3347 3479 3563 N
+ N P AW e n/a 24 3347 3479 3560 N
+ N P AW i n/a 24 3347 3479 3563 N
+ N P AW s n/a 24 3347 3479 3560 N
+ N P AY b n/a 24 3347 3473 3549 N
+ N P AY e n/a 24 3347 3473 3547 N
+ N P AY s n/a 24 3347 3473 3547 N
+ N P B e n/a 24 3347 3415 3528 N
+ N P B s n/a 24 3347 3415 3528 N
+ N P CH e n/a 24 3347 3447 3509 N
+ N P CH s n/a 24 3347 3447 3509 N
+ N P D b n/a 24 3347 3456 3533 N
+ N P D e n/a 24 3347 3456 3533 N
+ N P D s n/a 24 3347 3456 3533 N
+ N P DH e n/a 24 3347 3423 3518 N
+ N P DH s n/a 24 3347 3423 3518 N
+ N P EH b n/a 24 3347 3475 3561 N
+ N P EH e n/a 24 3347 3478 3559 N
+ N P EH i n/a 24 3347 3478 3561 N
+ N P EH s n/a 24 3347 3478 3559 N
+ N P ER b n/a 24 3347 3475 3552 N
+ N P ER e n/a 24 3347 3478 3545 N
+ N P ER i n/a 24 3347 3478 3545 N
+ N P ER s n/a 24 3347 3478 3545 N
+ N P EY b n/a 24 3347 3475 3562 N
+ N P EY e n/a 24 3347 3478 3559 N
+ N P EY i n/a 24 3347 3478 3562 N
+ N P EY s n/a 24 3347 3478 3559 N
+ N P F b n/a 24 3347 3446 3501 N
+ N P F e n/a 24 3347 3446 3501 N
+ N P F s n/a 24 3347 3446 3501 N
+ N P G b n/a 24 3347 3416 3528 N
+ N P G e n/a 24 3347 3416 3528 N
+ N P G s n/a 24 3347 3416 3528 N
+ N P HH e n/a 24 3347 3453 3524 N
+ N P HH s n/a 24 3347 3453 3524 N
+ N P IH b n/a 24 3347 3470 3566 N
+ N P IH e n/a 24 3347 3478 3557 N
+ N P IH i n/a 24 3347 3478 3555 N
+ N P IH s n/a 24 3347 3478 3557 N
+ N P IY b n/a 24 3347 3470 3566 N
+ N P IY e n/a 24 3347 3478 3564 N
+ N P IY i n/a 24 3347 3478 3564 N
+ N P IY s n/a 24 3347 3478 3564 N
+ N P JH b n/a 24 3347 3420 3531 N
+ N P JH e n/a 24 3347 3417 3531 N
+ N P JH s n/a 24 3347 3417 3531 N
+ N P K b n/a 24 3347 3448 3502 N
+ N P K e n/a 24 3347 3448 3502 N
+ N P K s n/a 24 3347 3448 3502 N
+ N P L b n/a 24 3347 3425 3521 N
+ N P L e n/a 24 3347 3425 3521 N
+ N P L s n/a 24 3347 3425 3521 N
+ N P M e n/a 24 3347 3421 3517 N
+ N P M s n/a 24 3347 3421 3517 N
+ N P N e n/a 24 3347 3456 3516 N
+ N P N s n/a 24 3347 3456 3516 N
+ N P NG e n/a 24 3347 3421 3516 N
+ N P NG s n/a 24 3347 3421 3516 N
+ N P OW b n/a 24 3347 3475 3552 N
+ N P OW e n/a 24 3347 3478 3546 N
+ N P OW i n/a 24 3347 3478 3552 N
+ N P OW s n/a 24 3347 3478 3546 N
+ N P OY b n/a 24 3347 3473 3551 N
+ N P OY e n/a 24 3347 3473 3547 N
+ N P OY s n/a 24 3347 3473 3547 N
+ N P P b n/a 24 3347 3447 3503 N
+ N P P e n/a 24 3347 3447 3503 N
+ N P P s n/a 24 3347 3447 3503 N
+ N P R b n/a 24 3347 3426 3523 N
+ N P R e n/a 24 3347 3426 3523 N
+ N P R s n/a 24 3347 3426 3523 N
+ N P S b n/a 24 3347 3446 3497 N
+ N P S e n/a 24 3347 3446 3497 N
+ N P S s n/a 24 3347 3446 3497 N
+ N P SH e n/a 24 3347 3447 3508 N
+ N P SH s n/a 24 3347 3447 3508 N
+ N P SIL e n/a 24 3347 3430 3513 N
+ N P SIL s n/a 24 3347 3430 3513 N
+ N P T b n/a 24 3347 3447 3505 N
+ N P T e n/a 24 3347 3447 3505 N
+ N P T s n/a 24 3347 3447 3505 N
+ N P TH e n/a 24 3347 3446 3501 N
+ N P TH s n/a 24 3347 3446 3501 N
+ N P UH b n/a 24 3347 3470 3567 N
+ N P UH e n/a 24 3347 3478 3557 N
+ N P UH s n/a 24 3347 3478 3557 N
+ N P UW b n/a 24 3347 3470 3567 N
+ N P UW e n/a 24 3347 3478 3557 N
+ N P UW i n/a 24 3347 3478 3558 N
+ N P UW s n/a 24 3347 3478 3557 N
+ N P V b n/a 24 3347 3415 3519 N
+ N P V e n/a 24 3347 3415 3519 N
+ N P V s n/a 24 3347 3415 3519 N
+ N P W b n/a 24 3347 3425 3522 N
+ N P W e n/a 24 3347 3425 3522 N
+ N P W s n/a 24 3347 3425 3522 N
+ N P Y b n/a 24 3347 3420 3526 N
+ N P Y e n/a 24 3347 3418 3527 N
+ N P Y s n/a 24 3347 3418 3527 N
+ N P Z b n/a 24 3347 3435 3510 N
+ N P Z e n/a 24 3347 3435 3510 N
+ N P Z s n/a 24 3347 3435 3510 N
+ N P ZH e n/a 24 3347 3415 3510 N
+ N P ZH s n/a 24 3347 3415 3510 N
+ N R AA b n/a 24 3375 3466 3548 N
+ N R AA e n/a 24 3374 3486 3546 N
+ N R AA i n/a 24 3374 3486 3548 N
+ N R AA s n/a 24 3374 3486 3546 N
+ N R AE b n/a 24 3375 3466 3561 N
+ N R AE e n/a 24 3374 3486 3560 N
+ N R AE i n/a 24 3374 3486 3561 N
+ N R AE s n/a 24 3374 3486 3560 N
+ N R AH b n/a 24 3375 3466 3549 N
+ N R AH e n/a 24 3374 3486 3538 N
+ N R AH i n/a 24 3374 3486 3542 N
+ N R AH s n/a 24 3374 3486 3538 N
+ N R AO b n/a 24 3375 3466 3551 N
+ N R AO e n/a 24 3374 3486 3546 N
+ N R AO i n/a 24 3374 3486 3551 N
+ N R AO s n/a 24 3374 3486 3546 N
+ N R AW b n/a 24 3375 3466 3563 N
+ N R AW e n/a 24 3374 3486 3560 N
+ N R AW i n/a 24 3374 3486 3563 N
+ N R AW s n/a 24 3374 3486 3560 N
+ N R AY b n/a 24 3375 3466 3549 N
+ N R AY e n/a 24 3374 3486 3547 N
+ N R AY i n/a 24 3374 3486 3549 N
+ N R AY s n/a 24 3374 3486 3547 N
+ N R B e n/a 24 3373 3415 3528 N
+ N R B i n/a 24 3373 3415 3528 N
+ N R B s n/a 24 3373 3415 3528 N
+ N R CH e n/a 24 3373 3439 3509 N
+ N R CH s n/a 24 3373 3444 3509 N
+ N R D b n/a 24 3375 3464 3533 N
+ N R D e n/a 24 3373 3464 3533 N
+ N R D i n/a 24 3373 3464 3532 N
+ N R D s n/a 24 3373 3464 3533 N
+ N R DH e n/a 24 3373 3423 3518 N
+ N R DH s n/a 24 3373 3423 3518 N
+ N R EH b n/a 24 3375 3466 3561 N
+ N R EH e n/a 24 3374 3486 3559 N
+ N R EH i n/a 24 3374 3486 3561 N
+ N R EH s n/a 24 3374 3486 3559 N
+ N R ER b n/a 24 3375 3466 3552 N
+ N R ER e n/a 24 3374 3486 3545 N
+ N R ER i n/a 24 3374 3486 3545 N
+ N R ER s n/a 24 3374 3486 3545 N
+ N R EY b n/a 24 3375 3466 3562 N
+ N R EY e n/a 24 3374 3486 3559 N
+ N R EY i n/a 24 3374 3486 3562 N
+ N R EY s n/a 24 3374 3486 3559 N
+ N R F b n/a 24 3375 3444 3500 N
+ N R F e n/a 24 3373 3440 3500 N
+ N R F i n/a 24 3373 3444 3500 N
+ N R F s n/a 24 3373 3444 3500 N
+ N R G b n/a 24 3375 3416 3528 N
+ N R G e n/a 24 3373 3416 3528 N
+ N R G i n/a 24 3373 3416 3528 N
+ N R G s n/a 24 3373 3416 3528 N
+ N R HH e n/a 24 3373 3445 3525 N
+ N R HH i n/a 24 3373 3445 3525 N
+ N R HH s n/a 24 3373 3445 3525 N
+ N R IH b n/a 24 3375 3471 3566 N
+ N R IH e n/a 24 3374 3486 3555 N
+ N R IH i n/a 24 3374 3486 3555 N
+ N R IH s n/a 24 3374 3486 3555 N
+ N R IY b n/a 24 3375 3471 3566 N
+ N R IY e n/a 24 3374 3493 3564 N
+ N R IY i n/a 24 3374 3493 3564 N
+ N R IY s n/a 24 3374 3493 3564 N
+ N R JH b n/a 24 3375 3420 3531 N
+ N R JH e n/a 24 3373 3417 3531 N
+ N R JH s n/a 24 3373 3417 3531 N
+ N R K b n/a 24 3375 3444 3502 N
+ N R K e n/a 24 3373 3440 3502 N
+ N R K i n/a 24 3373 3444 3502 N
+ N R K s n/a 24 3373 3444 3502 N
+ N R L b n/a 24 3375 3425 3521 N
+ N R L e n/a 24 3374 3425 3521 N
+ N R L i n/a 24 3374 3425 3521 N
+ N R L s n/a 24 3374 3425 3521 N
+ N R M e n/a 24 3373 3421 3517 N
+ N R M i n/a 24 3373 3421 3517 N
+ N R M s n/a 24 3373 3421 3517 N
+ N R N e n/a 24 3373 3464 3516 N
+ N R N i n/a 24 3373 3464 3516 N
+ N R N s n/a 24 3373 3464 3516 N
+ N R NG e n/a 24 3373 3421 3516 N
+ N R NG s n/a 24 3373 3421 3516 N
+ N R OW b n/a 24 3375 3466 3552 N
+ N R OW e n/a 24 3374 3486 3546 N
+ N R OW i n/a 24 3374 3486 3552 N
+ N R OW s n/a 24 3374 3486 3546 N
+ N R OY b n/a 24 3375 3466 3551 N
+ N R OY e n/a 24 3374 3486 3547 N
+ N R OY i n/a 24 3374 3486 3551 N
+ N R OY s n/a 24 3374 3486 3547 N
+ N R P b n/a 24 3375 3444 3504 N
+ N R P e n/a 24 3373 3440 3506 N
+ N R P i n/a 24 3373 3444 3504 N
+ N R P s n/a 24 3373 3444 3504 N
+ N R R b n/a 24 3375 3426 3523 N
+ N R R e n/a 24 3374 3426 3523 N
+ N R R i n/a 24 3374 3426 3523 N
+ N R R s n/a 24 3374 3426 3523 N
+ N R S b n/a 24 3375 3444 3497 N
+ N R S e n/a 24 3373 3437 3497 N
+ N R S i n/a 24 3373 3444 3498 N
+ N R S s n/a 24 3373 3444 3497 N
+ N R SH e n/a 24 3373 3440 3508 N
+ N R SH s n/a 24 3373 3444 3508 N
+ N R SIL e n/a 24 3373 3430 3511 N
+ N R SIL s n/a 24 3373 3430 3511 N
+ N R T b n/a 24 3375 3444 3504 N
+ N R T e n/a 24 3373 3438 3506 N
+ N R T i n/a 24 3373 3444 3504 N
+ N R T s n/a 24 3373 3444 3504 N
+ N R TH e n/a 24 3373 3439 3500 N
+ N R TH s n/a 24 3373 3444 3500 N
+ N R UH b n/a 24 3375 3471 3567 N
+ N R UH e n/a 24 3374 3486 3555 N
+ N R UH i n/a 24 3374 3486 3555 N
+ N R UH s n/a 24 3374 3486 3555 N
+ N R UW b n/a 24 3375 3471 3567 N
+ N R UW e n/a 24 3374 3483 3555 N
+ N R UW i n/a 24 3374 3482 3558 N
+ N R UW s n/a 24 3374 3483 3555 N
+ N R V b n/a 24 3375 3415 3519 N
+ N R V e n/a 24 3373 3415 3519 N
+ N R V s n/a 24 3373 3415 3519 N
+ N R W b n/a 24 3375 3425 3522 N
+ N R W e n/a 24 3374 3425 3522 N
+ N R W i n/a 24 3374 3425 3522 N
+ N R W s n/a 24 3374 3425 3522 N
+ N R Y b n/a 24 3375 3420 3526 N
+ N R Y e n/a 24 3374 3418 3527 N
+ N R Y i n/a 24 3374 3418 3526 N
+ N R Y s n/a 24 3374 3418 3527 N
+ N R Z b n/a 24 3375 3435 3510 N
+ N R Z e n/a 24 3373 3435 3510 N
+ N R Z i n/a 24 3373 3435 3510 N
+ N R Z s n/a 24 3373 3435 3510 N
+ N R ZH e n/a 24 3373 3415 3510 N
+ N R ZH s n/a 24 3373 3415 3510 N
+ N S AA b n/a 24 3347 3473 3548 N
+ N S AA e n/a 24 3347 3473 3546 N
+ N S AA i n/a 24 3347 3474 3548 N
+ N S AA s n/a 24 3347 3473 3546 N
+ N S AE b n/a 24 3347 3478 3561 N
+ N S AE e n/a 24 3347 3478 3560 N
+ N S AE i n/a 24 3347 3478 3561 N
+ N S AE s n/a 24 3347 3478 3560 N
+ N S AH b n/a 24 3347 3475 3549 N
+ N S AH e n/a 24 3347 3473 3538 N
+ N S AH i n/a 24 3347 3474 3540 N
+ N S AH s n/a 24 3347 3473 3538 N
+ N S AO b n/a 24 3347 3473 3551 N
+ N S AO e n/a 24 3347 3473 3546 N
+ N S AO i n/a 24 3347 3474 3551 N
+ N S AO s n/a 24 3347 3473 3546 N
+ N S AW b n/a 24 3347 3478 3563 N
+ N S AW e n/a 24 3347 3478 3560 N
+ N S AW i n/a 24 3347 3478 3563 N
+ N S AW s n/a 24 3347 3478 3560 N
+ N S AY b n/a 24 3347 3473 3549 N
+ N S AY e n/a 24 3347 3473 3547 N
+ N S AY i n/a 24 3347 3474 3549 N
+ N S AY s n/a 24 3347 3473 3547 N
+ N S B e n/a 24 3347 3415 3528 N
+ N S B s n/a 24 3347 3415 3528 N
+ N S CH e n/a 24 3347 3447 3509 N
+ N S CH s n/a 24 3347 3447 3509 N
+ N S D b n/a 24 3347 3456 3533 N
+ N S D e n/a 24 3347 3456 3533 N
+ N S D i n/a 24 3347 3456 3532 N
+ N S D s n/a 24 3347 3456 3533 N
+ N S DH e n/a 24 3347 3423 3518 N
+ N S DH s n/a 24 3347 3423 3518 N
+ N S EH b n/a 24 3347 3475 3561 N
+ N S EH e n/a 24 3347 3473 3559 N
+ N S EH i n/a 24 3347 3474 3561 N
+ N S EH s n/a 24 3347 3473 3559 N
+ N S ER b n/a 24 3347 3475 3552 N
+ N S ER e n/a 24 3347 3473 3545 N
+ N S ER i n/a 24 3347 3474 3545 N
+ N S ER s n/a 24 3347 3473 3545 N
+ N S EY b n/a 24 3347 3475 3562 N
+ N S EY e n/a 24 3347 3473 3559 N
+ N S EY i n/a 24 3347 3474 3562 N
+ N S EY s n/a 24 3347 3473 3559 N
+ N S F b n/a 24 3347 3446 3501 N
+ N S F e n/a 24 3347 3446 3501 N
+ N S F s n/a 24 3347 3446 3501 N
+ N S G b n/a 24 3347 3416 3528 N
+ N S G e n/a 24 3347 3416 3528 N
+ N S G s n/a 24 3347 3416 3528 N
+ N S HH e n/a 24 3347 3453 3524 N
+ N S HH s n/a 24 3347 3453 3524 N
+ N S IH b n/a 24 3347 3470 3566 N
+ N S IH e n/a 24 3347 3473 3557 N
+ N S IH i n/a 24 3347 3474 3555 N
+ N S IH s n/a 24 3347 3473 3557 N
+ N S IY b n/a 24 3347 3470 3566 N
+ N S IY e n/a 24 3347 3473 3564 N
+ N S IY i n/a 24 3347 3474 3564 N
+ N S IY s n/a 24 3347 3473 3564 N
+ N S JH b n/a 24 3347 3420 3531 N
+ N S JH e n/a 24 3347 3417 3531 N
+ N S JH s n/a 24 3347 3417 3531 N
+ N S K b n/a 24 3347 3448 3502 N
+ N S K e n/a 24 3347 3448 3502 N
+ N S K s n/a 24 3347 3448 3502 N
+ N S L b n/a 24 3347 3425 3521 N
+ N S L e n/a 24 3347 3425 3521 N
+ N S L s n/a 24 3347 3425 3521 N
+ N S M e n/a 24 3347 3421 3517 N
+ N S M s n/a 24 3347 3421 3517 N
+ N S N e n/a 24 3347 3456 3516 N
+ N S N s n/a 24 3347 3456 3516 N
+ N S NG e n/a 24 3347 3421 3516 N
+ N S NG s n/a 24 3347 3421 3516 N
+ N S OW b n/a 24 3347 3475 3553 N
+ N S OW e n/a 24 3347 3473 3546 N
+ N S OW i n/a 24 3347 3474 3553 N
+ N S OW s n/a 24 3347 3473 3546 N
+ N S OY b n/a 24 3347 3473 3551 N
+ N S OY e n/a 24 3347 3473 3547 N
+ N S OY i n/a 24 3347 3474 3551 N
+ N S OY s n/a 24 3347 3473 3547 N
+ N S P b n/a 24 3347 3447 3503 N
+ N S P e n/a 24 3347 3447 3503 N
+ N S P s n/a 24 3347 3447 3503 N
+ N S R b n/a 24 3347 3426 3523 N
+ N S R e n/a 24 3347 3426 3523 N
+ N S R s n/a 24 3347 3426 3523 N
+ N S S b n/a 24 3347 3446 3497 N
+ N S S e n/a 24 3347 3446 3497 N
+ N S S s n/a 24 3347 3446 3497 N
+ N S SH e n/a 24 3347 3447 3508 N
+ N S SH s n/a 24 3347 3447 3508 N
+ N S SIL e n/a 24 3347 3430 3513 N
+ N S SIL s n/a 24 3347 3430 3513 N
+ N S T b n/a 24 3347 3447 3505 N
+ N S T e n/a 24 3347 3447 3505 N
+ N S T s n/a 24 3347 3447 3505 N
+ N S TH e n/a 24 3347 3446 3501 N
+ N S TH s n/a 24 3347 3446 3501 N
+ N S UH b n/a 24 3347 3470 3567 N
+ N S UH e n/a 24 3347 3473 3557 N
+ N S UH i n/a 24 3347 3474 3555 N
+ N S UH s n/a 24 3347 3473 3557 N
+ N S UW b n/a 24 3347 3470 3567 N
+ N S UW e n/a 24 3347 3473 3557 N
+ N S UW i n/a 24 3347 3474 3558 N
+ N S UW s n/a 24 3347 3473 3557 N
+ N S V b n/a 24 3347 3415 3519 N
+ N S V e n/a 24 3347 3415 3519 N
+ N S V s n/a 24 3347 3415 3519 N
+ N S W b n/a 24 3347 3425 3522 N
+ N S W e n/a 24 3347 3425 3522 N
+ N S W s n/a 24 3347 3425 3522 N
+ N S Y b n/a 24 3347 3420 3526 N
+ N S Y e n/a 24 3347 3418 3527 N
+ N S Y s n/a 24 3347 3418 3527 N
+ N S Z b n/a 24 3347 3435 3510 N
+ N S Z e n/a 24 3347 3435 3510 N
+ N S Z s n/a 24 3347 3435 3510 N
+ N S ZH e n/a 24 3347 3415 3510 N
+ N S ZH s n/a 24 3347 3415 3510 N
+ N SH AA b n/a 24 3347 3473 3548 N
+ N SH AA e n/a 24 3347 3473 3546 N
+ N SH AA s n/a 24 3347 3473 3546 N
+ N SH AE b n/a 24 3347 3478 3561 N
+ N SH AE e n/a 24 3347 3478 3560 N
+ N SH AE i n/a 24 3347 3478 3561 N
+ N SH AE s n/a 24 3347 3478 3560 N
+ N SH AH b n/a 24 3347 3475 3549 N
+ N SH AH e n/a 24 3347 3473 3538 N
+ N SH AH i n/a 24 3347 3474 3541 N
+ N SH AH s n/a 24 3347 3473 3538 N
+ N SH AO b n/a 24 3347 3473 3551 N
+ N SH AO e n/a 24 3347 3473 3546 N
+ N SH AO i n/a 24 3347 3474 3551 N
+ N SH AO s n/a 24 3347 3473 3546 N
+ N SH AW b n/a 24 3347 3478 3563 N
+ N SH AW e n/a 24 3347 3478 3560 N
+ N SH AW i n/a 24 3347 3478 3563 N
+ N SH AW s n/a 24 3347 3478 3560 N
+ N SH AY b n/a 24 3347 3473 3549 N
+ N SH AY e n/a 24 3347 3473 3547 N
+ N SH AY i n/a 24 3347 3474 3549 N
+ N SH AY s n/a 24 3347 3473 3547 N
+ N SH B e n/a 24 3347 3415 3528 N
+ N SH B s n/a 24 3347 3415 3528 N
+ N SH CH e n/a 24 3347 3447 3509 N
+ N SH CH s n/a 24 3347 3447 3509 N
+ N SH D b n/a 24 3347 3456 3533 N
+ N SH D e n/a 24 3347 3456 3533 N
+ N SH D s n/a 24 3347 3456 3533 N
+ N SH DH e n/a 24 3347 3423 3518 N
+ N SH DH s n/a 24 3347 3423 3518 N
+ N SH EH b n/a 24 3347 3475 3561 N
+ N SH EH e n/a 24 3347 3473 3559 N
+ N SH EH i n/a 24 3347 3474 3561 N
+ N SH EH s n/a 24 3347 3473 3559 N
+ N SH ER b n/a 24 3347 3475 3552 N
+ N SH ER e n/a 24 3347 3473 3545 N
+ N SH ER i n/a 24 3347 3474 3545 N
+ N SH ER s n/a 24 3347 3473 3545 N
+ N SH EY b n/a 24 3347 3475 3562 N
+ N SH EY e n/a 24 3347 3473 3559 N
+ N SH EY i n/a 24 3347 3474 3562 N
+ N SH EY s n/a 24 3347 3473 3559 N
+ N SH F b n/a 24 3347 3446 3501 N
+ N SH F e n/a 24 3347 3446 3501 N
+ N SH F s n/a 24 3347 3446 3501 N
+ N SH G b n/a 24 3347 3416 3528 N
+ N SH G e n/a 24 3347 3416 3528 N
+ N SH G s n/a 24 3347 3416 3528 N
+ N SH HH e n/a 24 3347 3453 3524 N
+ N SH HH s n/a 24 3347 3453 3524 N
+ N SH IH b n/a 24 3347 3470 3566 N
+ N SH IH e n/a 24 3347 3473 3557 N
+ N SH IH i n/a 24 3347 3474 3555 N
+ N SH IH s n/a 24 3347 3473 3557 N
+ N SH IY b n/a 24 3347 3470 3566 N
+ N SH IY e n/a 24 3347 3473 3564 N
+ N SH IY i n/a 24 3347 3474 3564 N
+ N SH IY s n/a 24 3347 3473 3564 N
+ N SH JH b n/a 24 3347 3420 3531 N
+ N SH JH e n/a 24 3347 3417 3531 N
+ N SH JH s n/a 24 3347 3417 3531 N
+ N SH K b n/a 24 3347 3448 3502 N
+ N SH K e n/a 24 3347 3448 3502 N
+ N SH K s n/a 24 3347 3448 3502 N
+ N SH L b n/a 24 3347 3425 3521 N
+ N SH L e n/a 24 3347 3425 3521 N
+ N SH L s n/a 24 3347 3425 3521 N
+ N SH M e n/a 24 3347 3421 3517 N
+ N SH M s n/a 24 3347 3421 3517 N
+ N SH N e n/a 24 3347 3456 3516 N
+ N SH N s n/a 24 3347 3456 3516 N
+ N SH NG e n/a 24 3347 3421 3516 N
+ N SH NG s n/a 24 3347 3421 3516 N
+ N SH OW b n/a 24 3347 3475 3552 N
+ N SH OW e n/a 24 3347 3473 3546 N
+ N SH OW i n/a 24 3347 3474 3552 N
+ N SH OW s n/a 24 3347 3473 3546 N
+ N SH OY b n/a 24 3347 3473 3551 N
+ N SH OY e n/a 24 3347 3473 3547 N
+ N SH OY s n/a 24 3347 3473 3547 N
+ N SH P b n/a 24 3347 3447 3503 N
+ N SH P e n/a 24 3347 3447 3503 N
+ N SH P s n/a 24 3347 3447 3503 N
+ N SH R b n/a 24 3347 3426 3523 N
+ N SH R e n/a 24 3347 3426 3523 N
+ N SH R s n/a 24 3347 3426 3523 N
+ N SH S b n/a 24 3347 3446 3497 N
+ N SH S e n/a 24 3347 3446 3497 N
+ N SH S s n/a 24 3347 3446 3497 N
+ N SH SH e n/a 24 3347 3447 3508 N
+ N SH SH s n/a 24 3347 3447 3508 N
+ N SH SIL e n/a 24 3347 3430 3513 N
+ N SH SIL s n/a 24 3347 3430 3513 N
+ N SH T b n/a 24 3347 3447 3505 N
+ N SH T e n/a 24 3347 3447 3505 N
+ N SH T s n/a 24 3347 3447 3505 N
+ N SH TH e n/a 24 3347 3446 3501 N
+ N SH TH s n/a 24 3347 3446 3501 N
+ N SH UH b n/a 24 3347 3470 3567 N
+ N SH UH e n/a 24 3347 3473 3557 N
+ N SH UH i n/a 24 3347 3474 3555 N
+ N SH UH s n/a 24 3347 3473 3557 N
+ N SH UW b n/a 24 3347 3470 3567 N
+ N SH UW e n/a 24 3347 3473 3557 N
+ N SH UW i n/a 24 3347 3474 3558 N
+ N SH UW s n/a 24 3347 3473 3557 N
+ N SH V b n/a 24 3347 3415 3519 N
+ N SH V e n/a 24 3347 3415 3519 N
+ N SH V s n/a 24 3347 3415 3519 N
+ N SH W b n/a 24 3347 3425 3522 N
+ N SH W e n/a 24 3347 3425 3522 N
+ N SH W s n/a 24 3347 3425 3522 N
+ N SH Y b n/a 24 3347 3420 3526 N
+ N SH Y e n/a 24 3347 3418 3527 N
+ N SH Y i n/a 24 3347 3418 3526 N
+ N SH Y s n/a 24 3347 3418 3527 N
+ N SH Z b n/a 24 3347 3435 3510 N
+ N SH Z e n/a 24 3347 3435 3510 N
+ N SH Z s n/a 24 3347 3435 3510 N
+ N SH ZH e n/a 24 3347 3415 3510 N
+ N SH ZH s n/a 24 3347 3415 3510 N
+ N SIL AA b n/a 24 3348 3473 3550 N
+ N SIL AA s n/a 24 3348 3473 3546 N
+ N SIL AE b n/a 24 3348 3479 3561 N
+ N SIL AE s n/a 24 3348 3479 3560 N
+ N SIL AH b n/a 24 3348 3476 3549 N
+ N SIL AH s n/a 24 3348 3478 3538 N
+ N SIL AO b n/a 24 3348 3473 3551 N
+ N SIL AO s n/a 24 3348 3473 3546 N
+ N SIL AW b n/a 24 3348 3479 3563 N
+ N SIL AW s n/a 24 3348 3479 3560 N
+ N SIL AY b n/a 24 3348 3473 3549 N
+ N SIL AY s n/a 24 3348 3473 3547 N
+ N SIL B s n/a 24 3348 3415 3528 N
+ N SIL CH s n/a 24 3348 3447 3509 N
+ N SIL D b n/a 24 3348 3456 3533 N
+ N SIL D s n/a 24 3348 3456 3533 N
+ N SIL DH s n/a 24 3348 3423 3518 N
+ N SIL EH b n/a 24 3348 3476 3561 N
+ N SIL EH s n/a 24 3348 3478 3559 N
+ N SIL ER b n/a 24 3348 3476 3553 N
+ N SIL ER s n/a 24 3348 3478 3545 N
+ N SIL EY b n/a 24 3348 3476 3562 N
+ N SIL EY s n/a 24 3348 3478 3559 N
+ N SIL F b n/a 24 3348 3446 3501 N
+ N SIL F s n/a 24 3348 3446 3501 N
+ N SIL G b n/a 24 3348 3416 3528 N
+ N SIL G s n/a 24 3348 3416 3528 N
+ N SIL HH s n/a 24 3348 3453 3524 N
+ N SIL IH b n/a 24 3348 3470 3566 N
+ N SIL IH s n/a 24 3348 3478 3557 N
+ N SIL IY b n/a 24 3348 3470 3566 N
+ N SIL IY s n/a 24 3348 3478 3564 N
+ N SIL JH b n/a 24 3348 3420 3531 N
+ N SIL JH s n/a 24 3348 3417 3531 N
+ N SIL K b n/a 24 3348 3448 3502 N
+ N SIL K s n/a 24 3348 3448 3502 N
+ N SIL L b n/a 24 3348 3425 3521 N
+ N SIL L s n/a 24 3348 3425 3521 N
+ N SIL M s n/a 24 3348 3421 3517 N
+ N SIL N s n/a 24 3348 3456 3516 N
+ N SIL NG s n/a 24 3348 3421 3516 N
+ N SIL OW b n/a 24 3348 3476 3553 N
+ N SIL OW s n/a 24 3348 3478 3546 N
+ N SIL OY b n/a 24 3348 3473 3551 N
+ N SIL OY s n/a 24 3348 3473 3547 N
+ N SIL P b n/a 24 3348 3447 3503 N
+ N SIL P s n/a 24 3348 3447 3503 N
+ N SIL R b n/a 24 3348 3426 3523 N
+ N SIL R s n/a 24 3348 3426 3523 N
+ N SIL S b n/a 24 3348 3446 3497 N
+ N SIL S s n/a 24 3348 3446 3497 N
+ N SIL SH s n/a 24 3348 3447 3508 N
+ N SIL SIL s n/a 24 3348 3430 3513 N
+ N SIL T b n/a 24 3348 3447 3505 N
+ N SIL T s n/a 24 3348 3447 3505 N
+ N SIL TH s n/a 24 3348 3446 3501 N
+ N SIL UH b n/a 24 3348 3470 3567 N
+ N SIL UH s n/a 24 3348 3478 3557 N
+ N SIL UW b n/a 24 3348 3470 3567 N
+ N SIL UW s n/a 24 3348 3478 3557 N
+ N SIL V b n/a 24 3348 3415 3519 N
+ N SIL V s n/a 24 3348 3415 3519 N
+ N SIL W b n/a 24 3348 3425 3522 N
+ N SIL W s n/a 24 3348 3425 3522 N
+ N SIL Y b n/a 24 3348 3420 3526 N
+ N SIL Y s n/a 24 3348 3418 3527 N
+ N SIL Z b n/a 24 3348 3435 3510 N
+ N SIL Z s n/a 24 3348 3435 3510 N
+ N SIL ZH s n/a 24 3348 3415 3510 N
+ N T AA b n/a 24 3350 3473 3548 N
+ N T AA e n/a 24 3350 3473 3546 N
+ N T AA i n/a 24 3350 3474 3548 N
+ N T AA s n/a 24 3350 3473 3546 N
+ N T AE b n/a 24 3350 3479 3561 N
+ N T AE e n/a 24 3350 3479 3560 N
+ N T AE i n/a 24 3350 3479 3561 N
+ N T AE s n/a 24 3350 3479 3560 N
+ N T AH b n/a 24 3350 3477 3549 N
+ N T AH e n/a 24 3350 3478 3538 N
+ N T AH i n/a 24 3350 3478 3542 N
+ N T AH s n/a 24 3350 3478 3538 N
+ N T AO b n/a 24 3350 3473 3551 N
+ N T AO e n/a 24 3350 3473 3546 N
+ N T AO i n/a 24 3350 3474 3551 N
+ N T AO s n/a 24 3350 3473 3546 N
+ N T AW b n/a 24 3350 3479 3563 N
+ N T AW e n/a 24 3350 3479 3560 N
+ N T AW s n/a 24 3350 3479 3560 N
+ N T AY b n/a 24 3350 3473 3549 N
+ N T AY e n/a 24 3350 3473 3547 N
+ N T AY i n/a 24 3350 3474 3549 N
+ N T AY s n/a 24 3350 3473 3547 N
+ N T B e n/a 24 3350 3415 3528 N
+ N T B s n/a 24 3350 3415 3528 N
+ N T CH e n/a 24 3350 3447 3509 N
+ N T CH s n/a 24 3350 3447 3509 N
+ N T D b n/a 24 3350 3456 3533 N
+ N T D e n/a 24 3350 3456 3533 N
+ N T D i n/a 24 3350 3456 3532 N
+ N T D s n/a 24 3350 3456 3533 N
+ N T DH e n/a 24 3350 3423 3518 N
+ N T DH s n/a 24 3350 3423 3518 N
+ N T EH b n/a 24 3350 3476 3561 N
+ N T EH e n/a 24 3350 3478 3559 N
+ N T EH i n/a 24 3350 3478 3561 N
+ N T EH s n/a 24 3350 3478 3559 N
+ N T ER b n/a 24 3350 3477 3552 N
+ N T ER e n/a 24 3350 3478 3545 N
+ N T ER i n/a 24 3350 3478 3545 N
+ N T ER s n/a 24 3350 3478 3545 N
+ N T EY b n/a 24 3350 3476 3562 N
+ N T EY e n/a 24 3350 3478 3559 N
+ N T EY i n/a 24 3350 3478 3562 N
+ N T EY s n/a 24 3350 3478 3559 N
+ N T F b n/a 24 3350 3446 3501 N
+ N T F e n/a 24 3350 3446 3501 N
+ N T F s n/a 24 3350 3446 3501 N
+ N T G b n/a 24 3350 3416 3528 N
+ N T G e n/a 24 3350 3416 3528 N
+ N T G s n/a 24 3350 3416 3528 N
+ N T HH e n/a 24 3350 3453 3524 N
+ N T HH s n/a 24 3350 3453 3524 N
+ N T IH b n/a 24 3350 3470 3566 N
+ N T IH e n/a 24 3350 3478 3557 N
+ N T IH i n/a 24 3350 3478 3555 N
+ N T IH s n/a 24 3350 3478 3557 N
+ N T IY b n/a 24 3350 3470 3566 N
+ N T IY e n/a 24 3350 3478 3564 N
+ N T IY i n/a 24 3350 3478 3564 N
+ N T IY s n/a 24 3350 3478 3564 N
+ N T JH b n/a 24 3350 3420 3531 N
+ N T JH e n/a 24 3350 3417 3531 N
+ N T JH s n/a 24 3350 3417 3531 N
+ N T K b n/a 24 3350 3448 3502 N
+ N T K e n/a 24 3350 3448 3502 N
+ N T K s n/a 24 3350 3448 3502 N
+ N T L b n/a 24 3350 3425 3521 N
+ N T L e n/a 24 3350 3425 3521 N
+ N T L s n/a 24 3350 3425 3521 N
+ N T M e n/a 24 3350 3421 3517 N
+ N T M s n/a 24 3350 3421 3517 N
+ N T N e n/a 24 3350 3456 3516 N
+ N T N s n/a 24 3350 3456 3516 N
+ N T NG e n/a 24 3350 3421 3516 N
+ N T NG s n/a 24 3350 3421 3516 N
+ N T OW b n/a 24 3350 3477 3553 N
+ N T OW e n/a 24 3350 3478 3546 N
+ N T OW i n/a 24 3350 3478 3553 N
+ N T OW s n/a 24 3350 3478 3546 N
+ N T OY b n/a 24 3350 3473 3551 N
+ N T OY e n/a 24 3350 3473 3547 N
+ N T OY i n/a 24 3350 3474 3551 N
+ N T OY s n/a 24 3350 3473 3547 N
+ N T P b n/a 24 3350 3447 3503 N
+ N T P e n/a 24 3350 3447 3503 N
+ N T P s n/a 24 3350 3447 3503 N
+ N T R b n/a 24 3350 3426 3523 N
+ N T R e n/a 24 3350 3426 3523 N
+ N T R s n/a 24 3350 3426 3523 N
+ N T S b n/a 24 3350 3446 3497 N
+ N T S e n/a 24 3350 3446 3497 N
+ N T S s n/a 24 3350 3446 3497 N
+ N T SH e n/a 24 3350 3447 3508 N
+ N T SH s n/a 24 3350 3447 3508 N
+ N T SIL e n/a 24 3350 3430 3513 N
+ N T SIL s n/a 24 3350 3430 3513 N
+ N T T b n/a 24 3350 3447 3505 N
+ N T T e n/a 24 3350 3447 3505 N
+ N T T i n/a 24 3350 3441 3505 N
+ N T T s n/a 24 3350 3447 3505 N
+ N T TH e n/a 24 3350 3446 3501 N
+ N T TH i n/a 24 3350 3441 3500 N
+ N T TH s n/a 24 3350 3446 3501 N
+ N T UH b n/a 24 3350 3470 3567 N
+ N T UH e n/a 24 3350 3478 3557 N
+ N T UH s n/a 24 3350 3478 3557 N
+ N T UW b n/a 24 3350 3470 3567 N
+ N T UW e n/a 24 3350 3478 3557 N
+ N T UW i n/a 24 3350 3478 3558 N
+ N T UW s n/a 24 3350 3478 3557 N
+ N T V b n/a 24 3350 3415 3519 N
+ N T V e n/a 24 3350 3415 3519 N
+ N T V s n/a 24 3350 3415 3519 N
+ N T W b n/a 24 3350 3425 3522 N
+ N T W e n/a 24 3350 3425 3522 N
+ N T W i n/a 24 3350 3425 3522 N
+ N T W s n/a 24 3350 3425 3522 N
+ N T Y b n/a 24 3350 3420 3526 N
+ N T Y e n/a 24 3350 3418 3527 N
+ N T Y s n/a 24 3350 3418 3527 N
+ N T Z b n/a 24 3350 3435 3510 N
+ N T Z e n/a 24 3350 3435 3510 N
+ N T Z i n/a 24 3350 3435 3510 N
+ N T Z s n/a 24 3350 3435 3510 N
+ N T ZH e n/a 24 3350 3415 3510 N
+ N T ZH s n/a 24 3350 3415 3510 N
+ N TH AA b n/a 24 3347 3473 3548 N
+ N TH AA e n/a 24 3347 3473 3546 N
+ N TH AA i n/a 24 3347 3474 3548 N
+ N TH AA s n/a 24 3347 3473 3546 N
+ N TH AE b n/a 24 3347 3478 3561 N
+ N TH AE e n/a 24 3347 3478 3560 N
+ N TH AE s n/a 24 3347 3478 3560 N
+ N TH AH b n/a 24 3347 3475 3549 N
+ N TH AH e n/a 24 3347 3478 3538 N
+ N TH AH i n/a 24 3347 3478 3542 N
+ N TH AH s n/a 24 3347 3478 3538 N
+ N TH AO b n/a 24 3347 3473 3551 N
+ N TH AO e n/a 24 3347 3473 3546 N
+ N TH AO i n/a 24 3347 3474 3551 N
+ N TH AO s n/a 24 3347 3473 3546 N
+ N TH AW b n/a 24 3347 3478 3563 N
+ N TH AW e n/a 24 3347 3478 3560 N
+ N TH AW s n/a 24 3347 3478 3560 N
+ N TH AY b n/a 24 3347 3473 3549 N
+ N TH AY e n/a 24 3347 3473 3547 N
+ N TH AY i n/a 24 3347 3474 3549 N
+ N TH AY s n/a 24 3347 3473 3547 N
+ N TH B e n/a 24 3347 3415 3528 N
+ N TH B s n/a 24 3347 3415 3528 N
+ N TH CH e n/a 24 3347 3447 3509 N
+ N TH CH s n/a 24 3347 3447 3509 N
+ N TH D b n/a 24 3347 3456 3533 N
+ N TH D e n/a 24 3347 3456 3533 N
+ N TH D i n/a 24 3347 3456 3532 N
+ N TH D s n/a 24 3347 3456 3533 N
+ N TH DH e n/a 24 3347 3423 3518 N
+ N TH DH s n/a 24 3347 3423 3518 N
+ N TH EH b n/a 24 3347 3475 3561 N
+ N TH EH e n/a 24 3347 3478 3559 N
+ N TH EH s n/a 24 3347 3478 3559 N
+ N TH ER b n/a 24 3347 3475 3552 N
+ N TH ER e n/a 24 3347 3478 3545 N
+ N TH ER i n/a 24 3347 3478 3545 N
+ N TH ER s n/a 24 3347 3478 3545 N
+ N TH EY b n/a 24 3347 3475 3562 N
+ N TH EY e n/a 24 3347 3478 3559 N
+ N TH EY i n/a 24 3347 3478 3562 N
+ N TH EY s n/a 24 3347 3478 3559 N
+ N TH F b n/a 24 3347 3446 3501 N
+ N TH F e n/a 24 3347 3446 3501 N
+ N TH F s n/a 24 3347 3446 3501 N
+ N TH G b n/a 24 3347 3416 3528 N
+ N TH G e n/a 24 3347 3416 3528 N
+ N TH G s n/a 24 3347 3416 3528 N
+ N TH HH e n/a 24 3347 3453 3524 N
+ N TH HH s n/a 24 3347 3453 3524 N
+ N TH IH b n/a 24 3347 3470 3566 N
+ N TH IH e n/a 24 3347 3478 3557 N
+ N TH IH i n/a 24 3347 3478 3555 N
+ N TH IH s n/a 24 3347 3478 3557 N
+ N TH IY b n/a 24 3347 3470 3566 N
+ N TH IY e n/a 24 3347 3478 3564 N
+ N TH IY s n/a 24 3347 3478 3564 N
+ N TH JH b n/a 24 3347 3420 3531 N
+ N TH JH e n/a 24 3347 3417 3531 N
+ N TH JH s n/a 24 3347 3417 3531 N
+ N TH K b n/a 24 3347 3448 3502 N
+ N TH K e n/a 24 3347 3448 3502 N
+ N TH K s n/a 24 3347 3448 3502 N
+ N TH L b n/a 24 3347 3425 3521 N
+ N TH L e n/a 24 3347 3425 3521 N
+ N TH L s n/a 24 3347 3425 3521 N
+ N TH M e n/a 24 3347 3421 3517 N
+ N TH M s n/a 24 3347 3421 3517 N
+ N TH N e n/a 24 3347 3456 3516 N
+ N TH N s n/a 24 3347 3456 3516 N
+ N TH NG e n/a 24 3347 3421 3516 N
+ N TH NG s n/a 24 3347 3421 3516 N
+ N TH OW b n/a 24 3347 3475 3552 N
+ N TH OW e n/a 24 3347 3478 3546 N
+ N TH OW i n/a 24 3347 3478 3552 N
+ N TH OW s n/a 24 3347 3478 3546 N
+ N TH OY b n/a 24 3347 3473 3551 N
+ N TH OY e n/a 24 3347 3473 3547 N
+ N TH OY s n/a 24 3347 3473 3547 N
+ N TH P b n/a 24 3347 3447 3503 N
+ N TH P e n/a 24 3347 3447 3503 N
+ N TH P s n/a 24 3347 3447 3503 N
+ N TH R b n/a 24 3347 3426 3523 N
+ N TH R e n/a 24 3347 3426 3523 N
+ N TH R s n/a 24 3347 3426 3523 N
+ N TH S b n/a 24 3347 3446 3497 N
+ N TH S e n/a 24 3347 3446 3497 N
+ N TH S s n/a 24 3347 3446 3497 N
+ N TH SH e n/a 24 3347 3447 3508 N
+ N TH SH s n/a 24 3347 3447 3508 N
+ N TH SIL e n/a 24 3347 3430 3513 N
+ N TH SIL s n/a 24 3347 3430 3513 N
+ N TH T b n/a 24 3347 3447 3505 N
+ N TH T e n/a 24 3347 3447 3505 N
+ N TH T s n/a 24 3347 3447 3505 N
+ N TH TH e n/a 24 3347 3446 3501 N
+ N TH TH s n/a 24 3347 3446 3501 N
+ N TH UH b n/a 24 3347 3470 3567 N
+ N TH UH e n/a 24 3347 3478 3557 N
+ N TH UH s n/a 24 3347 3478 3557 N
+ N TH UW b n/a 24 3347 3470 3567 N
+ N TH UW e n/a 24 3347 3478 3557 N
+ N TH UW s n/a 24 3347 3478 3557 N
+ N TH V b n/a 24 3347 3415 3519 N
+ N TH V e n/a 24 3347 3415 3519 N
+ N TH V s n/a 24 3347 3415 3519 N
+ N TH W b n/a 24 3347 3425 3522 N
+ N TH W e n/a 24 3347 3425 3522 N
+ N TH W s n/a 24 3347 3425 3522 N
+ N TH Y b n/a 24 3347 3420 3526 N
+ N TH Y e n/a 24 3347 3418 3527 N
+ N TH Y s n/a 24 3347 3418 3527 N
+ N TH Z b n/a 24 3347 3435 3510 N
+ N TH Z e n/a 24 3347 3435 3510 N
+ N TH Z s n/a 24 3347 3435 3510 N
+ N TH ZH e n/a 24 3347 3415 3510 N
+ N TH ZH s n/a 24 3347 3415 3510 N
+ N UH AA b n/a 24 3371 3468 3548 N
+ N UH AA e n/a 24 3370 3485 3546 N
+ N UH AA s n/a 24 3371 3485 3546 N
+ N UH AE b n/a 24 3371 3469 3561 N
+ N UH AE e n/a 24 3370 3483 3560 N
+ N UH AE s n/a 24 3371 3483 3560 N
+ N UH AH b n/a 24 3371 3469 3549 N
+ N UH AH e n/a 24 3370 3483 3542 N
+ N UH AH i n/a 24 3371 3482 3542 N
+ N UH AH s n/a 24 3371 3483 3542 N
+ N UH AO b n/a 24 3371 3468 3551 N
+ N UH AO e n/a 24 3370 3485 3546 N
+ N UH AO s n/a 24 3371 3485 3546 N
+ N UH AW b n/a 24 3371 3469 3563 N
+ N UH AW e n/a 24 3370 3483 3560 N
+ N UH AW s n/a 24 3371 3483 3560 N
+ N UH AY b n/a 24 3371 3468 3549 N
+ N UH AY e n/a 24 3370 3485 3547 N
+ N UH AY i n/a 24 3371 3485 3549 N
+ N UH AY s n/a 24 3371 3485 3547 N
+ N UH B e n/a 24 3370 3415 3528 N
+ N UH B i n/a 24 3370 3415 3528 N
+ N UH B s n/a 24 3370 3415 3528 N
+ N UH CH e n/a 24 3370 3439 3509 N
+ N UH CH s n/a 24 3370 3444 3509 N
+ N UH D b n/a 24 3358 3463 3530 N
+ N UH D e n/a 24 3358 3463 3530 N
+ N UH D i n/a 24 3358 3463 3530 N
+ N UH D s n/a 24 3358 3463 3530 N
+ N UH DH e n/a 24 3358 3422 3518 N
+ N UH DH s n/a 24 3358 3422 3518 N
+ N UH EH b n/a 24 3371 3469 3561 N
+ N UH EH e n/a 24 3370 3483 3559 N
+ N UH EH s n/a 24 3371 3483 3559 N
+ N UH ER b n/a 24 3370 3468 3552 N
+ N UH ER e n/a 24 3370 3485 3545 N
+ N UH ER i n/a 24 3370 3485 3545 N
+ N UH ER s n/a 24 3370 3485 3545 N
+ N UH EY b n/a 24 3371 3469 3562 N
+ N UH EY e n/a 24 3370 3483 3559 N
+ N UH EY s n/a 24 3371 3483 3559 N
+ N UH F b n/a 24 3370 3444 3500 N
+ N UH F e n/a 24 3370 3440 3500 N
+ N UH F s n/a 24 3370 3444 3500 N
+ N UH G b n/a 24 3370 3416 3528 N
+ N UH G e n/a 24 3370 3416 3528 N
+ N UH G s n/a 24 3370 3416 3528 N
+ N UH HH e n/a 24 3370 3445 3525 N
+ N UH HH i n/a 24 3370 3445 3525 N
+ N UH HH s n/a 24 3370 3445 3525 N
+ N UH IH b n/a 24 3371 3471 3566 N
+ N UH IH e n/a 24 3370 3483 3555 N
+ N UH IH i n/a 24 3371 3482 3555 N
+ N UH IH s n/a 24 3371 3483 3555 N
+ N UH IY b n/a 24 3371 3471 3566 N
+ N UH IY e n/a 24 3370 3492 3564 N
+ N UH IY i n/a 24 3371 3492 3564 N
+ N UH IY s n/a 24 3371 3492 3564 N
+ N UH JH b n/a 24 3370 3420 3531 N
+ N UH JH e n/a 24 3370 3417 3531 N
+ N UH JH s n/a 24 3370 3417 3531 N
+ N UH K b n/a 24 3370 3444 3502 N
+ N UH K e n/a 24 3370 3440 3502 N
+ N UH K s n/a 24 3370 3444 3502 N
+ N UH L b n/a 24 3370 3425 3521 N
+ N UH L e n/a 24 3370 3425 3521 N
+ N UH L s n/a 24 3370 3425 3521 N
+ N UH M e n/a 24 3370 3421 3517 N
+ N UH M s n/a 24 3370 3421 3517 N
+ N UH N e n/a 24 3358 3463 3516 N
+ N UH N s n/a 24 3358 3463 3516 N
+ N UH NG e n/a 24 3370 3421 3516 N
+ N UH NG s n/a 24 3370 3421 3516 N
+ N UH OW b n/a 24 3371 3468 3552 N
+ N UH OW e n/a 24 3370 3485 3546 N
+ N UH OW s n/a 24 3371 3485 3546 N
+ N UH OY b n/a 24 3371 3468 3551 N
+ N UH OY e n/a 24 3370 3485 3547 N
+ N UH OY s n/a 24 3371 3485 3547 N
+ N UH P b n/a 24 3370 3444 3504 N
+ N UH P e n/a 24 3370 3440 3506 N
+ N UH P s n/a 24 3370 3444 3504 N
+ N UH R b n/a 24 3370 3426 3523 N
+ N UH R e n/a 24 3370 3426 3523 N
+ N UH R s n/a 24 3370 3426 3523 N
+ N UH S b n/a 24 3361 3444 3497 N
+ N UH S e n/a 24 3361 3437 3497 N
+ N UH S i n/a 24 3361 3444 3497 N
+ N UH S s n/a 24 3361 3444 3497 N
+ N UH SH e n/a 24 3370 3440 3508 N
+ N UH SH i n/a 24 3370 3444 3508 N
+ N UH SH s n/a 24 3370 3444 3508 N
+ N UH SIL e n/a 24 3357 3433 3513 N
+ N UH SIL s n/a 24 3357 3433 3513 N
+ N UH T b n/a 24 3358 3444 3504 N
+ N UH T e n/a 24 3358 3438 3506 N
+ N UH T i n/a 24 3358 3444 3504 N
+ N UH T s n/a 24 3358 3444 3504 N
+ N UH TH e n/a 24 3361 3440 3500 N
+ N UH TH i n/a 24 3360 3444 3500 N
+ N UH TH s n/a 24 3361 3444 3500 N
+ N UH UH b n/a 24 3371 3471 3567 N
+ N UH UH e n/a 24 3370 3485 3555 N
+ N UH UH s n/a 24 3371 3485 3555 N
+ N UH UW b n/a 24 3371 3471 3567 N
+ N UH UW e n/a 24 3370 3485 3555 N
+ N UH UW s n/a 24 3371 3485 3555 N
+ N UH V b n/a 24 3370 3415 3519 N
+ N UH V e n/a 24 3370 3415 3519 N
+ N UH V s n/a 24 3370 3415 3519 N
+ N UH W b n/a 24 3370 3426 3522 N
+ N UH W e n/a 24 3370 3426 3522 N
+ N UH W i n/a 24 3370 3426 3522 N
+ N UH W s n/a 24 3370 3426 3522 N
+ N UH Y b n/a 24 3371 3420 3526 N
+ N UH Y e n/a 24 3370 3418 3527 N
+ N UH Y s n/a 24 3371 3418 3527 N
+ N UH Z b n/a 24 3358 3435 3510 N
+ N UH Z e n/a 24 3358 3435 3510 N
+ N UH Z i n/a 24 3358 3435 3510 N
+ N UH Z s n/a 24 3358 3435 3510 N
+ N UH ZH e n/a 24 3370 3415 3510 N
+ N UH ZH s n/a 24 3370 3415 3510 N
+ N UW AA b n/a 24 3371 3468 3550 N
+ N UW AA e n/a 24 3370 3485 3546 N
+ N UW AA i n/a 24 3371 3485 3550 N
+ N UW AA s n/a 24 3371 3485 3546 N
+ N UW AE b n/a 24 3371 3469 3561 N
+ N UW AE e n/a 24 3370 3483 3560 N
+ N UW AE i n/a 24 3371 3482 3561 N
+ N UW AE s n/a 24 3371 3483 3560 N
+ N UW AH b n/a 24 3371 3469 3549 N
+ N UW AH e n/a 24 3370 3483 3542 N
+ N UW AH i n/a 24 3371 3482 3542 N
+ N UW AH s n/a 24 3371 3483 3542 N
+ N UW AO b n/a 24 3371 3468 3551 N
+ N UW AO e n/a 24 3370 3485 3546 N
+ N UW AO i n/a 24 3371 3485 3551 N
+ N UW AO s n/a 24 3371 3485 3546 N
+ N UW AW b n/a 24 3371 3469 3563 N
+ N UW AW e n/a 24 3370 3483 3560 N
+ N UW AW i n/a 24 3371 3482 3563 N
+ N UW AW s n/a 24 3371 3483 3560 N
+ N UW AY b n/a 24 3371 3468 3549 N
+ N UW AY e n/a 24 3370 3485 3547 N
+ N UW AY i n/a 24 3371 3485 3549 N
+ N UW AY s n/a 24 3371 3485 3547 N
+ N UW B e n/a 24 3370 3415 3528 N
+ N UW B i n/a 24 3370 3415 3528 N
+ N UW B s n/a 24 3370 3415 3528 N
+ N UW CH e n/a 24 3370 3440 3509 N
+ N UW CH i n/a 24 3370 3444 3508 N
+ N UW CH s n/a 24 3370 3444 3509 N
+ N UW D b n/a 24 3358 3463 3537 N
+ N UW D e n/a 24 3358 3463 3537 N
+ N UW D i n/a 24 3358 3463 3537 N
+ N UW D s n/a 24 3358 3463 3537 N
+ N UW DH e n/a 24 3358 3422 3518 N
+ N UW DH s n/a 24 3358 3422 3518 N
+ N UW EH b n/a 24 3371 3469 3561 N
+ N UW EH e n/a 24 3370 3483 3559 N
+ N UW EH i n/a 24 3371 3482 3561 N
+ N UW EH s n/a 24 3371 3483 3559 N
+ N UW ER b n/a 24 3370 3468 3552 N
+ N UW ER e n/a 24 3370 3485 3545 N
+ N UW ER i n/a 24 3370 3485 3545 N
+ N UW ER s n/a 24 3370 3485 3545 N
+ N UW EY b n/a 24 3371 3469 3562 N
+ N UW EY e n/a 24 3370 3483 3559 N
+ N UW EY i n/a 24 3371 3482 3562 N
+ N UW EY s n/a 24 3371 3483 3559 N
+ N UW F b n/a 24 3370 3444 3500 N
+ N UW F e n/a 24 3370 3440 3500 N
+ N UW F i n/a 24 3370 3444 3500 N
+ N UW F s n/a 24 3370 3444 3500 N
+ N UW G b n/a 24 3370 3416 3528 N
+ N UW G e n/a 24 3370 3416 3528 N
+ N UW G i n/a 24 3370 3416 3528 N
+ N UW G s n/a 24 3370 3416 3528 N
+ N UW HH e n/a 24 3370 3445 3525 N
+ N UW HH i n/a 24 3370 3445 3525 N
+ N UW HH s n/a 24 3370 3445 3525 N
+ N UW IH b n/a 24 3371 3471 3566 N
+ N UW IH e n/a 24 3370 3483 3555 N
+ N UW IH i n/a 24 3371 3482 3555 N
+ N UW IH s n/a 24 3371 3483 3555 N
+ N UW IY b n/a 24 3371 3471 3566 N
+ N UW IY e n/a 24 3370 3492 3564 N
+ N UW IY i n/a 24 3371 3492 3564 N
+ N UW IY s n/a 24 3371 3492 3564 N
+ N UW JH b n/a 24 3370 3420 3531 N
+ N UW JH e n/a 24 3370 3417 3531 N
+ N UW JH i n/a 24 3370 3417 3531 N
+ N UW JH s n/a 24 3370 3417 3531 N
+ N UW K b n/a 24 3370 3444 3502 N
+ N UW K e n/a 24 3370 3440 3502 N
+ N UW K i n/a 24 3370 3444 3502 N
+ N UW K s n/a 24 3370 3444 3502 N
+ N UW L b n/a 24 3370 3428 3521 N
+ N UW L e n/a 24 3370 3428 3521 N
+ N UW L i n/a 24 3370 3428 3521 N
+ N UW L s n/a 24 3370 3428 3521 N
+ N UW M e n/a 24 3370 3421 3517 N
+ N UW M i n/a 24 3370 3421 3517 N
+ N UW M s n/a 24 3370 3421 3517 N
+ N UW N e n/a 24 3358 3463 3516 N
+ N UW N s n/a 24 3358 3463 3516 N
+ N UW NG e n/a 24 3370 3421 3516 N
+ N UW NG s n/a 24 3370 3421 3516 N
+ N UW OW b n/a 24 3371 3468 3553 N
+ N UW OW e n/a 24 3370 3485 3546 N
+ N UW OW i n/a 24 3371 3485 3553 N
+ N UW OW s n/a 24 3371 3485 3546 N
+ N UW OY b n/a 24 3371 3468 3551 N
+ N UW OY e n/a 24 3370 3485 3547 N
+ N UW OY s n/a 24 3371 3485 3547 N
+ N UW P b n/a 24 3370 3444 3504 N
+ N UW P e n/a 24 3370 3440 3506 N
+ N UW P s n/a 24 3370 3444 3504 N
+ N UW R b n/a 24 3370 3428 3523 N
+ N UW R e n/a 24 3370 3428 3523 N
+ N UW R i n/a 24 3370 3428 3523 N
+ N UW R s n/a 24 3370 3428 3523 N
+ N UW S b n/a 24 3361 3444 3497 N
+ N UW S e n/a 24 3361 3440 3497 N
+ N UW S i n/a 24 3361 3444 3497 N
+ N UW S s n/a 24 3361 3444 3497 N
+ N UW SH e n/a 24 3370 3440 3508 N
+ N UW SH i n/a 24 3370 3444 3508 N
+ N UW SH s n/a 24 3370 3444 3508 N
+ N UW SIL e n/a 24 3358 3429 3512 N
+ N UW SIL s n/a 24 3358 3429 3512 N
+ N UW T b n/a 24 3358 3444 3504 N
+ N UW T e n/a 24 3358 3440 3506 N
+ N UW T i n/a 24 3358 3444 3504 N
+ N UW T s n/a 24 3358 3444 3504 N
+ N UW TH e n/a 24 3361 3440 3500 N
+ N UW TH s n/a 24 3361 3444 3500 N
+ N UW UH b n/a 24 3371 3471 3567 N
+ N UW UH e n/a 24 3370 3485 3555 N
+ N UW UH s n/a 24 3371 3485 3555 N
+ N UW UW b n/a 24 3371 3471 3567 N
+ N UW UW e n/a 24 3370 3485 3555 N
+ N UW UW i n/a 24 3371 3485 3558 N
+ N UW UW s n/a 24 3371 3485 3555 N
+ N UW V b n/a 24 3370 3415 3519 N
+ N UW V e n/a 24 3370 3415 3519 N
+ N UW V i n/a 24 3370 3415 3519 N
+ N UW V s n/a 24 3370 3415 3519 N
+ N UW W b n/a 24 3370 3428 3522 N
+ N UW W e n/a 24 3370 3428 3522 N
+ N UW W i n/a 24 3370 3428 3522 N
+ N UW W s n/a 24 3370 3428 3522 N
+ N UW Y b n/a 24 3371 3420 3526 N
+ N UW Y e n/a 24 3370 3418 3527 N
+ N UW Y i n/a 24 3371 3418 3527 N
+ N UW Y s n/a 24 3371 3418 3527 N
+ N UW Z b n/a 24 3358 3435 3510 N
+ N UW Z e n/a 24 3358 3435 3510 N
+ N UW Z i n/a 24 3358 3435 3510 N
+ N UW Z s n/a 24 3358 3435 3510 N
+ N UW ZH e n/a 24 3370 3415 3510 N
+ N UW ZH s n/a 24 3370 3415 3510 N
+ N V AA b n/a 24 3350 3473 3548 N
+ N V AA s n/a 24 3350 3473 3546 N
+ N V AE b n/a 24 3350 3478 3561 N
+ N V AE s n/a 24 3350 3478 3560 N
+ N V AH b n/a 24 3350 3475 3549 N
+ N V AH i n/a 24 3350 3478 3542 N
+ N V AH s n/a 24 3350 3478 3538 N
+ N V AO b n/a 24 3350 3473 3551 N
+ N V AO s n/a 24 3350 3473 3546 N
+ N V AW b n/a 24 3350 3478 3563 N
+ N V AW s n/a 24 3350 3478 3560 N
+ N V AY b n/a 24 3350 3473 3549 N
+ N V AY s n/a 24 3350 3473 3547 N
+ N V B s n/a 24 3350 3415 3528 N
+ N V CH s n/a 24 3350 3447 3509 N
+ N V D b n/a 24 3350 3456 3533 N
+ N V D s n/a 24 3350 3456 3533 N
+ N V DH s n/a 24 3350 3423 3518 N
+ N V EH b n/a 24 3350 3475 3561 N
+ N V EH i n/a 24 3350 3478 3561 N
+ N V EH s n/a 24 3350 3478 3559 N
+ N V ER b n/a 24 3350 3475 3552 N
+ N V ER i n/a 24 3350 3478 3545 N
+ N V ER s n/a 24 3350 3478 3545 N
+ N V EY b n/a 24 3350 3475 3562 N
+ N V EY i n/a 24 3350 3478 3562 N
+ N V EY s n/a 24 3350 3478 3559 N
+ N V F b n/a 24 3350 3446 3501 N
+ N V F s n/a 24 3350 3446 3501 N
+ N V G b n/a 24 3350 3416 3528 N
+ N V G s n/a 24 3350 3416 3528 N
+ N V HH s n/a 24 3350 3453 3524 N
+ N V IH b n/a 24 3350 3470 3566 N
+ N V IH i n/a 24 3350 3478 3555 N
+ N V IH s n/a 24 3350 3478 3557 N
+ N V IY b n/a 24 3350 3470 3566 N
+ N V IY i n/a 24 3350 3478 3564 N
+ N V IY s n/a 24 3350 3478 3564 N
+ N V JH b n/a 24 3350 3420 3531 N
+ N V JH s n/a 24 3350 3417 3531 N
+ N V K b n/a 24 3350 3448 3502 N
+ N V K s n/a 24 3350 3448 3502 N
+ N V L b n/a 24 3350 3425 3521 N
+ N V L s n/a 24 3350 3425 3521 N
+ N V M s n/a 24 3350 3421 3517 N
+ N V N s n/a 24 3350 3456 3516 N
+ N V NG s n/a 24 3350 3421 3516 N
+ N V OW b n/a 24 3350 3475 3552 N
+ N V OW s n/a 24 3350 3478 3546 N
+ N V OY b n/a 24 3350 3473 3551 N
+ N V OY s n/a 24 3350 3473 3547 N
+ N V P b n/a 24 3350 3447 3503 N
+ N V P s n/a 24 3350 3447 3503 N
+ N V R b n/a 24 3350 3426 3523 N
+ N V R s n/a 24 3350 3426 3523 N
+ N V S b n/a 24 3350 3446 3497 N
+ N V S s n/a 24 3350 3446 3497 N
+ N V SH s n/a 24 3350 3447 3508 N
+ N V SIL s n/a 24 3350 3430 3513 N
+ N V T b n/a 24 3350 3447 3505 N
+ N V T s n/a 24 3350 3447 3505 N
+ N V TH s n/a 24 3350 3446 3501 N
+ N V UH b n/a 24 3350 3470 3567 N
+ N V UH s n/a 24 3350 3478 3557 N
+ N V UW b n/a 24 3350 3470 3567 N
+ N V UW s n/a 24 3350 3478 3557 N
+ N V V b n/a 24 3350 3415 3519 N
+ N V V s n/a 24 3350 3415 3519 N
+ N V W b n/a 24 3350 3425 3522 N
+ N V W s n/a 24 3350 3425 3522 N
+ N V Y b n/a 24 3350 3420 3526 N
+ N V Y s n/a 24 3350 3418 3527 N
+ N V Z b n/a 24 3350 3435 3510 N
+ N V Z s n/a 24 3350 3435 3510 N
+ N V ZH s n/a 24 3350 3415 3510 N
+ N W AA b n/a 24 3372 3467 3548 N
+ N W AA s n/a 24 3372 3481 3546 N
+ N W AE b n/a 24 3372 3467 3561 N
+ N W AE s n/a 24 3372 3481 3560 N
+ N W AH b n/a 24 3372 3467 3549 N
+ N W AH i n/a 24 3372 3481 3542 N
+ N W AH s n/a 24 3372 3481 3538 N
+ N W AO b n/a 24 3372 3467 3551 N
+ N W AO s n/a 24 3372 3481 3546 N
+ N W AW b n/a 24 3372 3467 3563 N
+ N W AW s n/a 24 3372 3481 3560 N
+ N W AY b n/a 24 3372 3467 3549 N
+ N W AY s n/a 24 3372 3481 3547 N
+ N W B s n/a 24 3372 3415 3528 N
+ N W CH s n/a 24 3372 3444 3509 N
+ N W D b n/a 24 3358 3463 3533 N
+ N W D s n/a 24 3358 3463 3533 N
+ N W DH s n/a 24 3358 3423 3518 N
+ N W EH b n/a 24 3372 3467 3561 N
+ N W EH i n/a 24 3372 3481 3561 N
+ N W EH s n/a 24 3372 3481 3559 N
+ N W ER b n/a 24 3372 3467 3553 N
+ N W ER s n/a 24 3372 3481 3545 N
+ N W EY b n/a 24 3372 3467 3562 N
+ N W EY s n/a 24 3372 3481 3559 N
+ N W F b n/a 24 3372 3444 3500 N
+ N W F s n/a 24 3372 3444 3500 N
+ N W G b n/a 24 3372 3416 3528 N
+ N W G s n/a 24 3372 3416 3528 N
+ N W HH s n/a 24 3372 3445 3525 N
+ N W IH b n/a 24 3372 3471 3566 N
+ N W IH s n/a 24 3372 3481 3555 N
+ N W IY b n/a 24 3372 3471 3566 N
+ N W IY s n/a 24 3372 3492 3564 N
+ N W JH b n/a 24 3372 3420 3531 N
+ N W JH s n/a 24 3372 3417 3531 N
+ N W K b n/a 24 3372 3444 3502 N
+ N W K s n/a 24 3372 3444 3502 N
+ N W L b n/a 24 3372 3428 3521 N
+ N W L s n/a 24 3372 3428 3521 N
+ N W M s n/a 24 3372 3421 3517 N
+ N W N s n/a 24 3358 3463 3516 N
+ N W NG s n/a 24 3372 3421 3516 N
+ N W OW b n/a 24 3372 3467 3553 N
+ N W OW s n/a 24 3372 3481 3546 N
+ N W OY b n/a 24 3372 3467 3551 N
+ N W OY s n/a 24 3372 3481 3547 N
+ N W P b n/a 24 3372 3444 3504 N
+ N W P s n/a 24 3372 3444 3504 N
+ N W R b n/a 24 3372 3428 3523 N
+ N W R s n/a 24 3372 3428 3523 N
+ N W S b n/a 24 3361 3444 3497 N
+ N W S s n/a 24 3361 3444 3497 N
+ N W SH s n/a 24 3372 3444 3508 N
+ N W SIL s n/a 24 3357 3429 3511 N
+ N W T b n/a 24 3358 3444 3504 N
+ N W T s n/a 24 3358 3444 3504 N
+ N W TH s n/a 24 3361 3444 3500 N
+ N W UH b n/a 24 3372 3471 3567 N
+ N W UH s n/a 24 3372 3481 3555 N
+ N W UW b n/a 24 3372 3471 3567 N
+ N W UW s n/a 24 3372 3481 3555 N
+ N W V b n/a 24 3372 3415 3519 N
+ N W V s n/a 24 3372 3415 3519 N
+ N W W b n/a 24 3372 3428 3522 N
+ N W W s n/a 24 3372 3428 3522 N
+ N W Y b n/a 24 3372 3420 3526 N
+ N W Y s n/a 24 3372 3418 3527 N
+ N W Z b n/a 24 3358 3435 3510 N
+ N W Z s n/a 24 3358 3435 3510 N
+ N W ZH s n/a 24 3372 3415 3510 N
+ N Y AA b n/a 24 3399 3469 3548 N
+ N Y AA e n/a 24 3399 3496 3546 N
+ N Y AA i n/a 24 3399 3496 3548 N
+ N Y AA s n/a 24 3399 3496 3546 N
+ N Y AE b n/a 24 3399 3469 3561 N
+ N Y AE e n/a 24 3399 3496 3560 N
+ N Y AE s n/a 24 3399 3496 3560 N
+ N Y AH b n/a 24 3399 3469 3549 N
+ N Y AH e n/a 24 3399 3496 3542 N
+ N Y AH s n/a 24 3399 3496 3542 N
+ N Y AO b n/a 24 3399 3469 3551 N
+ N Y AO e n/a 24 3399 3496 3546 N
+ N Y AO i n/a 24 3399 3496 3551 N
+ N Y AO s n/a 24 3399 3496 3546 N
+ N Y AW b n/a 24 3399 3469 3563 N
+ N Y AW e n/a 24 3399 3496 3560 N
+ N Y AW s n/a 24 3399 3496 3560 N
+ N Y AY b n/a 24 3399 3469 3549 N
+ N Y AY e n/a 24 3399 3492 3547 N
+ N Y AY s n/a 24 3399 3492 3547 N
+ N Y B e n/a 24 3402 3415 3528 N
+ N Y B s n/a 24 3402 3415 3528 N
+ N Y CH e n/a 24 3402 3447 3509 N
+ N Y CH s n/a 24 3402 3447 3509 N
+ N Y D b n/a 24 3402 3460 3530 N
+ N Y D e n/a 24 3402 3460 3530 N
+ N Y D s n/a 24 3402 3460 3530 N
+ N Y DH e n/a 24 3400 3423 3515 N
+ N Y DH s n/a 24 3400 3423 3515 N
+ N Y EH b n/a 24 3399 3469 3561 N
+ N Y EH e n/a 24 3399 3496 3559 N
+ N Y EH s n/a 24 3399 3496 3559 N
+ N Y ER b n/a 24 3399 3469 3552 N
+ N Y ER e n/a 24 3399 3496 3545 N
+ N Y ER s n/a 24 3399 3496 3545 N
+ N Y EY b n/a 24 3400 3469 3562 N
+ N Y EY e n/a 24 3400 3492 3559 N
+ N Y EY s n/a 24 3400 3492 3559 N
+ N Y F b n/a 24 3400 3446 3501 N
+ N Y F e n/a 24 3400 3446 3501 N
+ N Y F s n/a 24 3400 3446 3501 N
+ N Y G b n/a 24 3403 3416 3529 N
+ N Y G e n/a 24 3403 3416 3529 N
+ N Y G s n/a 24 3403 3416 3529 N
+ N Y HH e n/a 24 3400 3453 3524 N
+ N Y HH s n/a 24 3400 3453 3524 N
+ N Y IH b n/a 24 3399 3471 3566 N
+ N Y IH e n/a 24 3399 3492 3557 N
+ N Y IH s n/a 24 3399 3492 3557 N
+ N Y IY b n/a 24 3400 3471 3566 N
+ N Y IY e n/a 24 3400 3492 3565 N
+ N Y IY i n/a 24 3400 3492 3565 N
+ N Y IY s n/a 24 3400 3492 3565 N
+ N Y JH b n/a 24 3402 3420 3531 N
+ N Y JH e n/a 24 3402 3419 3531 N
+ N Y JH s n/a 24 3402 3419 3531 N
+ N Y K b n/a 24 3403 3448 3502 N
+ N Y K e n/a 24 3403 3448 3502 N
+ N Y K s n/a 24 3403 3448 3502 N
+ N Y L b n/a 24 3398 3425 3521 N
+ N Y L e n/a 24 3398 3425 3521 N
+ N Y L s n/a 24 3398 3425 3521 N
+ N Y M e n/a 24 3400 3423 3517 N
+ N Y M s n/a 24 3400 3423 3517 N
+ N Y N e n/a 24 3400 3458 3516 N
+ N Y N s n/a 24 3400 3458 3516 N
+ N Y NG e n/a 24 3400 3423 3516 N
+ N Y NG s n/a 24 3400 3423 3516 N
+ N Y OW b n/a 24 3399 3469 3552 N
+ N Y OW e n/a 24 3399 3496 3546 N
+ N Y OW s n/a 24 3399 3496 3546 N
+ N Y OY b n/a 24 3399 3469 3551 N
+ N Y OY e n/a 24 3399 3492 3547 N
+ N Y OY s n/a 24 3399 3492 3547 N
+ N Y P b n/a 24 3402 3447 3503 N
+ N Y P e n/a 24 3402 3447 3503 N
+ N Y P s n/a 24 3402 3447 3503 N
+ N Y R b n/a 24 3400 3426 3523 N
+ N Y R e n/a 24 3400 3426 3523 N
+ N Y R s n/a 24 3400 3426 3523 N
+ N Y S b n/a 24 3400 3446 3497 N
+ N Y S e n/a 24 3400 3446 3497 N
+ N Y S s n/a 24 3400 3446 3497 N
+ N Y SH e n/a 24 3402 3447 3508 N
+ N Y SH s n/a 24 3402 3447 3508 N
+ N Y SIL e n/a 24 3398 3433 3513 N
+ N Y SIL s n/a 24 3398 3433 3513 N
+ N Y T b n/a 24 3402 3447 3509 N
+ N Y T e n/a 24 3402 3447 3509 N
+ N Y T s n/a 24 3402 3447 3509 N
+ N Y TH e n/a 24 3400 3446 3501 N
+ N Y TH s n/a 24 3400 3446 3501 N
+ N Y UH b n/a 24 3399 3471 3567 N
+ N Y UH e n/a 24 3399 3492 3557 N
+ N Y UH s n/a 24 3399 3492 3557 N
+ N Y UW b n/a 24 3400 3471 3567 N
+ N Y UW e n/a 24 3400 3492 3557 N
+ N Y UW s n/a 24 3400 3492 3557 N
+ N Y V b n/a 24 3400 3415 3519 N
+ N Y V e n/a 24 3400 3415 3519 N
+ N Y V s n/a 24 3400 3415 3519 N
+ N Y W b n/a 24 3400 3426 3522 N
+ N Y W e n/a 24 3400 3426 3522 N
+ N Y W s n/a 24 3400 3426 3522 N
+ N Y Y b n/a 24 3403 3420 3526 N
+ N Y Y e n/a 24 3403 3419 3527 N
+ N Y Y s n/a 24 3403 3419 3527 N
+ N Y Z b n/a 24 3400 3436 3510 N
+ N Y Z e n/a 24 3400 3436 3510 N
+ N Y Z s n/a 24 3400 3436 3510 N
+ N Y ZH e n/a 24 3402 3419 3510 N
+ N Y ZH s n/a 24 3402 3419 3510 N
+ N Z AA b n/a 24 3347 3473 3548 N
+ N Z AA i n/a 24 3347 3474 3548 N
+ N Z AA s n/a 24 3347 3473 3546 N
+ N Z AE b n/a 24 3347 3478 3561 N
+ N Z AE i n/a 24 3347 3478 3561 N
+ N Z AE s n/a 24 3347 3478 3560 N
+ N Z AH b n/a 24 3347 3475 3549 N
+ N Z AH i n/a 24 3347 3474 3540 N
+ N Z AH s n/a 24 3347 3473 3538 N
+ N Z AO b n/a 24 3347 3473 3551 N
+ N Z AO i n/a 24 3347 3474 3551 N
+ N Z AO s n/a 24 3347 3473 3546 N
+ N Z AW b n/a 24 3347 3478 3563 N
+ N Z AW i n/a 24 3347 3478 3563 N
+ N Z AW s n/a 24 3347 3478 3560 N
+ N Z AY b n/a 24 3347 3473 3549 N
+ N Z AY i n/a 24 3347 3474 3549 N
+ N Z AY s n/a 24 3347 3473 3547 N
+ N Z B s n/a 24 3347 3415 3528 N
+ N Z CH s n/a 24 3347 3447 3509 N
+ N Z D b n/a 24 3347 3456 3533 N
+ N Z D s n/a 24 3347 3456 3533 N
+ N Z DH s n/a 24 3347 3423 3518 N
+ N Z EH b n/a 24 3347 3475 3561 N
+ N Z EH i n/a 24 3347 3474 3561 N
+ N Z EH s n/a 24 3347 3473 3559 N
+ N Z ER b n/a 24 3347 3475 3552 N
+ N Z ER i n/a 24 3347 3474 3545 N
+ N Z ER s n/a 24 3347 3473 3545 N
+ N Z EY b n/a 24 3347 3475 3562 N
+ N Z EY i n/a 24 3347 3474 3562 N
+ N Z EY s n/a 24 3347 3473 3559 N
+ N Z F b n/a 24 3347 3446 3501 N
+ N Z F s n/a 24 3347 3446 3501 N
+ N Z G b n/a 24 3347 3416 3528 N
+ N Z G s n/a 24 3347 3416 3528 N
+ N Z HH s n/a 24 3347 3453 3524 N
+ N Z IH b n/a 24 3347 3470 3566 N
+ N Z IH i n/a 24 3347 3474 3555 N
+ N Z IH s n/a 24 3347 3473 3557 N
+ N Z IY b n/a 24 3347 3470 3566 N
+ N Z IY i n/a 24 3347 3474 3564 N
+ N Z IY s n/a 24 3347 3473 3564 N
+ N Z JH b n/a 24 3347 3420 3531 N
+ N Z JH s n/a 24 3347 3417 3531 N
+ N Z K b n/a 24 3347 3448 3502 N
+ N Z K s n/a 24 3347 3448 3502 N
+ N Z L b n/a 24 3347 3425 3521 N
+ N Z L s n/a 24 3347 3425 3521 N
+ N Z M s n/a 24 3347 3421 3517 N
+ N Z N s n/a 24 3347 3456 3516 N
+ N Z NG s n/a 24 3347 3421 3516 N
+ N Z OW b n/a 24 3347 3475 3553 N
+ N Z OW i n/a 24 3347 3474 3553 N
+ N Z OW s n/a 24 3347 3473 3546 N
+ N Z OY b n/a 24 3347 3473 3551 N
+ N Z OY s n/a 24 3347 3473 3547 N
+ N Z P b n/a 24 3347 3447 3503 N
+ N Z P s n/a 24 3347 3447 3503 N
+ N Z R b n/a 24 3347 3426 3523 N
+ N Z R s n/a 24 3347 3426 3523 N
+ N Z S b n/a 24 3347 3446 3497 N
+ N Z S s n/a 24 3347 3446 3497 N
+ N Z SH s n/a 24 3347 3447 3508 N
+ N Z SIL s n/a 24 3347 3430 3513 N
+ N Z T b n/a 24 3347 3447 3505 N
+ N Z T s n/a 24 3347 3447 3505 N
+ N Z TH s n/a 24 3347 3446 3501 N
+ N Z UH b n/a 24 3347 3470 3567 N
+ N Z UH s n/a 24 3347 3473 3557 N
+ N Z UW b n/a 24 3347 3470 3567 N
+ N Z UW i n/a 24 3347 3474 3558 N
+ N Z UW s n/a 24 3347 3473 3557 N
+ N Z V b n/a 24 3347 3415 3519 N
+ N Z V s n/a 24 3347 3415 3519 N
+ N Z W b n/a 24 3347 3425 3522 N
+ N Z W s n/a 24 3347 3425 3522 N
+ N Z Y b n/a 24 3347 3420 3526 N
+ N Z Y i n/a 24 3347 3418 3526 N
+ N Z Y s n/a 24 3347 3418 3527 N
+ N Z Z b n/a 24 3347 3435 3510 N
+ N Z Z i n/a 24 3347 3435 3510 N
+ N Z Z s n/a 24 3347 3435 3510 N
+ N Z ZH s n/a 24 3347 3415 3510 N
+ N ZH AA b n/a 24 3347 3473 3548 N
+ N ZH AA e n/a 24 3347 3473 3546 N
+ N ZH AA s n/a 24 3347 3473 3546 N
+ N ZH AE b n/a 24 3347 3478 3561 N
+ N ZH AE e n/a 24 3347 3478 3560 N
+ N ZH AE s n/a 24 3347 3478 3560 N
+ N ZH AH b n/a 24 3347 3475 3549 N
+ N ZH AH e n/a 24 3347 3473 3538 N
+ N ZH AH i n/a 24 3347 3474 3541 N
+ N ZH AH s n/a 24 3347 3473 3538 N
+ N ZH AO b n/a 24 3347 3473 3551 N
+ N ZH AO e n/a 24 3347 3473 3546 N
+ N ZH AO s n/a 24 3347 3473 3546 N
+ N ZH AW b n/a 24 3347 3478 3563 N
+ N ZH AW e n/a 24 3347 3478 3560 N
+ N ZH AW s n/a 24 3347 3478 3560 N
+ N ZH AY b n/a 24 3347 3473 3549 N
+ N ZH AY e n/a 24 3347 3473 3547 N
+ N ZH AY s n/a 24 3347 3473 3547 N
+ N ZH B e n/a 24 3347 3415 3528 N
+ N ZH B s n/a 24 3347 3415 3528 N
+ N ZH CH e n/a 24 3347 3447 3509 N
+ N ZH CH s n/a 24 3347 3447 3509 N
+ N ZH D b n/a 24 3347 3456 3533 N
+ N ZH D e n/a 24 3347 3456 3533 N
+ N ZH D s n/a 24 3347 3456 3533 N
+ N ZH DH e n/a 24 3347 3423 3518 N
+ N ZH DH s n/a 24 3347 3423 3518 N
+ N ZH EH b n/a 24 3347 3475 3561 N
+ N ZH EH e n/a 24 3347 3473 3559 N
+ N ZH EH s n/a 24 3347 3473 3559 N
+ N ZH ER b n/a 24 3347 3475 3552 N
+ N ZH ER e n/a 24 3347 3473 3545 N
+ N ZH ER s n/a 24 3347 3473 3545 N
+ N ZH EY b n/a 24 3347 3475 3562 N
+ N ZH EY e n/a 24 3347 3473 3559 N
+ N ZH EY s n/a 24 3347 3473 3559 N
+ N ZH F b n/a 24 3347 3446 3501 N
+ N ZH F e n/a 24 3347 3446 3501 N
+ N ZH F s n/a 24 3347 3446 3501 N
+ N ZH G b n/a 24 3347 3416 3528 N
+ N ZH G e n/a 24 3347 3416 3528 N
+ N ZH G s n/a 24 3347 3416 3528 N
+ N ZH HH e n/a 24 3347 3453 3524 N
+ N ZH HH s n/a 24 3347 3453 3524 N
+ N ZH IH b n/a 24 3347 3470 3566 N
+ N ZH IH e n/a 24 3347 3473 3557 N
+ N ZH IH s n/a 24 3347 3473 3557 N
+ N ZH IY b n/a 24 3347 3470 3566 N
+ N ZH IY e n/a 24 3347 3473 3564 N
+ N ZH IY i n/a 24 3347 3474 3564 N
+ N ZH IY s n/a 24 3347 3473 3564 N
+ N ZH JH b n/a 24 3347 3420 3531 N
+ N ZH JH e n/a 24 3347 3417 3531 N
+ N ZH JH s n/a 24 3347 3417 3531 N
+ N ZH K b n/a 24 3347 3448 3502 N
+ N ZH K e n/a 24 3347 3448 3502 N
+ N ZH K s n/a 24 3347 3448 3502 N
+ N ZH L b n/a 24 3347 3425 3521 N
+ N ZH L e n/a 24 3347 3425 3521 N
+ N ZH L s n/a 24 3347 3425 3521 N
+ N ZH M e n/a 24 3347 3421 3517 N
+ N ZH M s n/a 24 3347 3421 3517 N
+ N ZH N e n/a 24 3347 3456 3516 N
+ N ZH N s n/a 24 3347 3456 3516 N
+ N ZH NG e n/a 24 3347 3421 3516 N
+ N ZH NG s n/a 24 3347 3421 3516 N
+ N ZH OW b n/a 24 3347 3475 3552 N
+ N ZH OW e n/a 24 3347 3473 3546 N
+ N ZH OW i n/a 24 3347 3474 3552 N
+ N ZH OW s n/a 24 3347 3473 3546 N
+ N ZH OY b n/a 24 3347 3473 3551 N
+ N ZH OY e n/a 24 3347 3473 3547 N
+ N ZH OY s n/a 24 3347 3473 3547 N
+ N ZH P b n/a 24 3347 3447 3503 N
+ N ZH P e n/a 24 3347 3447 3503 N
+ N ZH P s n/a 24 3347 3447 3503 N
+ N ZH R b n/a 24 3347 3426 3523 N
+ N ZH R e n/a 24 3347 3426 3523 N
+ N ZH R s n/a 24 3347 3426 3523 N
+ N ZH S b n/a 24 3347 3446 3497 N
+ N ZH S e n/a 24 3347 3446 3497 N
+ N ZH S s n/a 24 3347 3446 3497 N
+ N ZH SH e n/a 24 3347 3447 3508 N
+ N ZH SH s n/a 24 3347 3447 3508 N
+ N ZH SIL e n/a 24 3347 3430 3513 N
+ N ZH SIL s n/a 24 3347 3430 3513 N
+ N ZH T b n/a 24 3347 3447 3505 N
+ N ZH T e n/a 24 3347 3447 3505 N
+ N ZH T s n/a 24 3347 3447 3505 N
+ N ZH TH e n/a 24 3347 3446 3501 N
+ N ZH TH s n/a 24 3347 3446 3501 N
+ N ZH UH b n/a 24 3347 3470 3567 N
+ N ZH UH e n/a 24 3347 3473 3557 N
+ N ZH UH s n/a 24 3347 3473 3557 N
+ N ZH UW b n/a 24 3347 3470 3567 N
+ N ZH UW e n/a 24 3347 3473 3557 N
+ N ZH UW s n/a 24 3347 3473 3557 N
+ N ZH V b n/a 24 3347 3415 3519 N
+ N ZH V e n/a 24 3347 3415 3519 N
+ N ZH V s n/a 24 3347 3415 3519 N
+ N ZH W b n/a 24 3347 3425 3522 N
+ N ZH W e n/a 24 3347 3425 3522 N
+ N ZH W s n/a 24 3347 3425 3522 N
+ N ZH Y b n/a 24 3347 3420 3526 N
+ N ZH Y e n/a 24 3347 3418 3527 N
+ N ZH Y s n/a 24 3347 3418 3527 N
+ N ZH Z b n/a 24 3347 3435 3510 N
+ N ZH Z e n/a 24 3347 3435 3510 N
+ N ZH Z s n/a 24 3347 3435 3510 N
+ N ZH ZH e n/a 24 3347 3415 3510 N
+ N ZH ZH s n/a 24 3347 3415 3510 N
+ NG AA AA e n/a 25 3573 3579 3611 N
+ NG AA AE e n/a 25 3573 3579 3607 N
+ NG AA AH e n/a 25 3573 3579 3611 N
+ NG AA AO e n/a 25 3573 3579 3611 N
+ NG AA AW e n/a 25 3573 3579 3610 N
+ NG AA AY e n/a 25 3573 3579 3611 N
+ NG AA B e n/a 25 3573 3578 3591 N
+ NG AA CH e n/a 25 3573 3578 3602 N
+ NG AA CH i n/a 25 3573 3582 3601 N
+ NG AA D e n/a 25 3573 3578 3591 N
+ NG AA D i n/a 25 3573 3578 3592 N
+ NG AA DH e n/a 25 3573 3575 3593 N
+ NG AA EH e n/a 25 3573 3579 3607 N
+ NG AA ER e n/a 25 3573 3579 3611 N
+ NG AA EY e n/a 25 3573 3579 3607 N
+ NG AA F e n/a 25 3573 3578 3604 N
+ NG AA G b n/a 25 3573 3578 3592 N
+ NG AA G e n/a 25 3573 3578 3591 N
+ NG AA G i n/a 25 3573 3578 3592 N
+ NG AA HH e n/a 25 3573 3578 3594 N
+ NG AA HH i n/a 25 3573 3582 3594 N
+ NG AA IH e n/a 25 3573 3579 3607 N
+ NG AA IY e n/a 25 3573 3579 3607 N
+ NG AA IY i n/a 25 3573 3579 3608 N
+ NG AA JH e n/a 25 3573 3578 3591 N
+ NG AA JH i n/a 25 3573 3577 3592 N
+ NG AA K b n/a 25 3573 3582 3602 N
+ NG AA K e n/a 25 3573 3578 3602 N
+ NG AA K i n/a 25 3573 3582 3601 N
+ NG AA L e n/a 25 3573 3575 3598 N
+ NG AA M e n/a 25 3573 3575 3596 N
+ NG AA M i n/a 25 3573 3575 3596 N
+ NG AA N e n/a 25 3573 3575 3597 N
+ NG AA NG e n/a 25 3573 3575 3596 N
+ NG AA OW e n/a 25 3573 3579 3611 N
+ NG AA OW i n/a 25 3573 3579 3610 N
+ NG AA OY e n/a 25 3573 3579 3611 N
+ NG AA P e n/a 25 3573 3578 3602 N
+ NG AA P i n/a 25 3573 3582 3601 N
+ NG AA R e n/a 25 3573 3575 3599 N
+ NG AA S e n/a 25 3573 3578 3603 N
+ NG AA S i n/a 25 3573 3582 3603 N
+ NG AA SH e n/a 25 3573 3578 3603 N
+ NG AA SH i n/a 25 3573 3582 3603 N
+ NG AA SIL e n/a 25 3574 3575 3606 N
+ NG AA T e n/a 25 3573 3578 3602 N
+ NG AA TH e n/a 25 3573 3578 3604 N
+ NG AA UH e n/a 25 3573 3579 3607 N
+ NG AA UW e n/a 25 3573 3579 3607 N
+ NG AA V e n/a 25 3573 3575 3591 N
+ NG AA W e n/a 25 3573 3575 3596 N
+ NG AA Y e n/a 25 3573 3575 3594 N
+ NG AA Z e n/a 25 3573 3575 3595 N
+ NG AA Z i n/a 25 3573 3575 3595 N
+ NG AA ZH e n/a 25 3573 3575 3595 N
+ NG AE AA e n/a 25 3568 3579 3611 N
+ NG AE AA i n/a 25 3568 3581 3611 N
+ NG AE AE e n/a 25 3568 3579 3607 N
+ NG AE AH e n/a 25 3568 3579 3611 N
+ NG AE AH i n/a 25 3568 3581 3611 N
+ NG AE AO e n/a 25 3568 3579 3611 N
+ NG AE AW e n/a 25 3568 3579 3610 N
+ NG AE AW i n/a 25 3568 3581 3610 N
+ NG AE AY e n/a 25 3568 3579 3611 N
+ NG AE B e n/a 25 3568 3578 3591 N
+ NG AE B i n/a 25 3568 3581 3592 N
+ NG AE CH e n/a 25 3568 3578 3602 N
+ NG AE D e n/a 25 3568 3578 3591 N
+ NG AE D i n/a 25 3568 3581 3592 N
+ NG AE DH e n/a 25 3568 3575 3593 N
+ NG AE EH e n/a 25 3568 3579 3607 N
+ NG AE ER e n/a 25 3568 3579 3611 N
+ NG AE ER i n/a 25 3568 3581 3610 N
+ NG AE EY e n/a 25 3568 3579 3607 N
+ NG AE F e n/a 25 3568 3578 3604 N
+ NG AE F i n/a 25 3568 3580 3604 N
+ NG AE G b n/a 25 3568 3581 3592 N
+ NG AE G e n/a 25 3568 3578 3591 N
+ NG AE G i n/a 25 3568 3581 3592 N
+ NG AE HH e n/a 25 3568 3578 3594 N
+ NG AE HH i n/a 25 3568 3580 3594 N
+ NG AE IH e n/a 25 3568 3579 3607 N
+ NG AE IH i n/a 25 3568 3581 3608 N
+ NG AE IY e n/a 25 3568 3579 3607 N
+ NG AE IY i n/a 25 3568 3581 3608 N
+ NG AE JH e n/a 25 3568 3578 3591 N
+ NG AE K b n/a 25 3568 3580 3600 N
+ NG AE K e n/a 25 3568 3578 3602 N
+ NG AE K i n/a 25 3568 3580 3600 N
+ NG AE L e n/a 25 3568 3575 3598 N
+ NG AE L i n/a 25 3568 3581 3598 N
+ NG AE M e n/a 25 3568 3575 3596 N
+ NG AE M i n/a 25 3568 3581 3596 N
+ NG AE N e n/a 25 3568 3575 3597 N
+ NG AE N i n/a 25 3568 3581 3597 N
+ NG AE NG e n/a 25 3568 3575 3596 N
+ NG AE OW e n/a 25 3568 3579 3611 N
+ NG AE OW i n/a 25 3568 3581 3610 N
+ NG AE OY e n/a 25 3568 3579 3611 N
+ NG AE P e n/a 25 3568 3578 3602 N
+ NG AE P i n/a 25 3568 3580 3600 N
+ NG AE R e n/a 25 3568 3575 3599 N
+ NG AE R i n/a 25 3568 3581 3599 N
+ NG AE S e n/a 25 3568 3578 3603 N
+ NG AE S i n/a 25 3568 3580 3603 N
+ NG AE SH e n/a 25 3568 3578 3603 N
+ NG AE SH i n/a 25 3568 3580 3603 N
+ NG AE SIL e n/a 25 3568 3575 3605 N
+ NG AE T e n/a 25 3568 3578 3602 N
+ NG AE T i n/a 25 3568 3580 3600 N
+ NG AE TH e n/a 25 3568 3578 3604 N
+ NG AE UH e n/a 25 3568 3579 3607 N
+ NG AE UH i n/a 25 3568 3581 3608 N
+ NG AE UW e n/a 25 3568 3579 3607 N
+ NG AE UW i n/a 25 3568 3581 3608 N
+ NG AE V e n/a 25 3568 3575 3591 N
+ NG AE W e n/a 25 3568 3575 3596 N
+ NG AE W i n/a 25 3568 3581 3596 N
+ NG AE Y e n/a 25 3568 3575 3594 N
+ NG AE Y i n/a 25 3568 3581 3594 N
+ NG AE Z e n/a 25 3568 3575 3595 N
+ NG AE Z i n/a 25 3568 3581 3595 N
+ NG AE ZH e n/a 25 3568 3575 3595 N
+ NG AE ZH i n/a 25 3568 3581 3595 N
+ NG AH AA e n/a 25 3573 3579 3611 N
+ NG AH AE e n/a 25 3573 3579 3607 N
+ NG AH AH e n/a 25 3573 3579 3611 N
+ NG AH AH i n/a 25 3573 3582 3611 N
+ NG AH AO e n/a 25 3573 3579 3611 N
+ NG AH AW e n/a 25 3573 3579 3610 N
+ NG AH AY e n/a 25 3573 3579 3611 N
+ NG AH B e n/a 25 3573 3578 3591 N
+ NG AH B i n/a 25 3573 3582 3592 N
+ NG AH CH e n/a 25 3573 3578 3602 N
+ NG AH CH i n/a 25 3573 3577 3601 N
+ NG AH D e n/a 25 3573 3578 3591 N
+ NG AH D i n/a 25 3573 3582 3592 N
+ NG AH DH e n/a 25 3573 3576 3593 N
+ NG AH EH e n/a 25 3573 3579 3607 N
+ NG AH ER e n/a 25 3573 3579 3611 N
+ NG AH ER i n/a 25 3573 3581 3610 N
+ NG AH EY e n/a 25 3573 3579 3607 N
+ NG AH EY i n/a 25 3573 3582 3607 N
+ NG AH F e n/a 25 3573 3578 3604 N
+ NG AH F i n/a 25 3573 3577 3604 N
+ NG AH G b n/a 25 3573 3582 3592 N
+ NG AH G e n/a 25 3573 3578 3591 N
+ NG AH G i n/a 25 3573 3582 3592 N
+ NG AH HH e n/a 25 3573 3578 3594 N
+ NG AH HH i n/a 25 3573 3577 3594 N
+ NG AH IH e n/a 25 3573 3579 3607 N
+ NG AH IH i n/a 25 3573 3582 3608 N
+ NG AH IY e n/a 25 3573 3579 3607 N
+ NG AH IY i n/a 25 3573 3582 3608 N
+ NG AH JH e n/a 25 3573 3578 3591 N
+ NG AH K b n/a 25 3573 3578 3602 N
+ NG AH K e n/a 25 3573 3578 3602 N
+ NG AH K i n/a 25 3573 3577 3601 N
+ NG AH L e n/a 25 3573 3576 3598 N
+ NG AH L i n/a 25 3573 3581 3598 N
+ NG AH M e n/a 25 3573 3576 3597 N
+ NG AH M i n/a 25 3573 3582 3597 N
+ NG AH N e n/a 25 3573 3576 3597 N
+ NG AH NG e n/a 25 3573 3576 3597 N
+ NG AH OW e n/a 25 3573 3579 3611 N
+ NG AH OW i n/a 25 3573 3581 3610 N
+ NG AH OY e n/a 25 3573 3579 3611 N
+ NG AH P e n/a 25 3573 3578 3602 N
+ NG AH R e n/a 25 3573 3576 3599 N
+ NG AH R i n/a 25 3573 3581 3599 N
+ NG AH S e n/a 25 3573 3578 3603 N
+ NG AH S i n/a 25 3573 3577 3603 N
+ NG AH SH e n/a 25 3573 3578 3603 N
+ NG AH SH i n/a 25 3573 3577 3603 N
+ NG AH SIL e n/a 25 3574 3575 3606 N
+ NG AH T e n/a 25 3573 3578 3602 N
+ NG AH T i n/a 25 3573 3577 3601 N
+ NG AH TH e n/a 25 3573 3578 3604 N
+ NG AH UH e n/a 25 3573 3579 3607 N
+ NG AH UW e n/a 25 3573 3579 3607 N
+ NG AH UW i n/a 25 3573 3581 3608 N
+ NG AH V e n/a 25 3573 3576 3591 N
+ NG AH W e n/a 25 3573 3576 3596 N
+ NG AH Y e n/a 25 3573 3576 3594 N
+ NG AH Z e n/a 25 3573 3576 3595 N
+ NG AH Z i n/a 25 3573 3582 3595 N
+ NG AH ZH e n/a 25 3573 3576 3595 N
+ NG AO AA e n/a 25 3574 3579 3611 N
+ NG AO AE e n/a 25 3574 3579 3607 N
+ NG AO AH e n/a 25 3574 3579 3611 N
+ NG AO AH i n/a 25 3574 3579 3611 N
+ NG AO AO e n/a 25 3574 3579 3611 N
+ NG AO AW e n/a 25 3574 3579 3610 N
+ NG AO AY e n/a 25 3574 3579 3611 N
+ NG AO AY i n/a 25 3574 3579 3611 N
+ NG AO B e n/a 25 3574 3578 3591 N
+ NG AO B i n/a 25 3574 3578 3592 N
+ NG AO CH e n/a 25 3574 3578 3601 N
+ NG AO CH i n/a 25 3574 3582 3601 N
+ NG AO D e n/a 25 3574 3578 3591 N
+ NG AO D i n/a 25 3574 3578 3592 N
+ NG AO DH e n/a 25 3574 3576 3593 N
+ NG AO EH e n/a 25 3574 3579 3607 N
+ NG AO ER e n/a 25 3574 3579 3611 N
+ NG AO ER i n/a 25 3574 3579 3610 N
+ NG AO EY e n/a 25 3574 3579 3607 N
+ NG AO EY i n/a 25 3574 3579 3607 N
+ NG AO F e n/a 25 3574 3578 3604 N
+ NG AO F i n/a 25 3574 3582 3604 N
+ NG AO G b n/a 25 3574 3578 3592 N
+ NG AO G e n/a 25 3574 3578 3591 N
+ NG AO G i n/a 25 3574 3578 3592 N
+ NG AO HH e n/a 25 3574 3578 3594 N
+ NG AO HH i n/a 25 3574 3582 3594 N
+ NG AO IH e n/a 25 3574 3579 3607 N
+ NG AO IH i n/a 25 3574 3579 3608 N
+ NG AO IY e n/a 25 3574 3579 3607 N
+ NG AO JH e n/a 25 3574 3578 3591 N
+ NG AO JH i n/a 25 3574 3577 3592 N
+ NG AO K b n/a 25 3574 3582 3601 N
+ NG AO K e n/a 25 3574 3578 3601 N
+ NG AO K i n/a 25 3574 3582 3601 N
+ NG AO L e n/a 25 3574 3576 3598 N
+ NG AO L i n/a 25 3574 3576 3598 N
+ NG AO M e n/a 25 3574 3576 3596 N
+ NG AO M i n/a 25 3574 3576 3596 N
+ NG AO N e n/a 25 3574 3576 3597 N
+ NG AO N i n/a 25 3574 3576 3597 N
+ NG AO NG e n/a 25 3574 3576 3596 N
+ NG AO OW e n/a 25 3574 3579 3611 N
+ NG AO OW i n/a 25 3574 3579 3610 N
+ NG AO OY e n/a 25 3574 3579 3611 N
+ NG AO P e n/a 25 3574 3578 3601 N
+ NG AO P i n/a 25 3574 3582 3601 N
+ NG AO R e n/a 25 3574 3576 3599 N
+ NG AO R i n/a 25 3574 3576 3599 N
+ NG AO S e n/a 25 3574 3578 3603 N
+ NG AO S i n/a 25 3574 3582 3603 N
+ NG AO SH e n/a 25 3574 3578 3603 N
+ NG AO SH i n/a 25 3574 3582 3603 N
+ NG AO SIL e n/a 25 3574 3575 3606 N
+ NG AO T e n/a 25 3574 3578 3601 N
+ NG AO T i n/a 25 3574 3582 3601 N
+ NG AO TH e n/a 25 3574 3578 3604 N
+ NG AO UH e n/a 25 3574 3579 3607 N
+ NG AO UW e n/a 25 3574 3579 3607 N
+ NG AO V e n/a 25 3574 3576 3591 N
+ NG AO V i n/a 25 3574 3576 3593 N
+ NG AO W e n/a 25 3574 3576 3596 N
+ NG AO W i n/a 25 3574 3576 3596 N
+ NG AO Y e n/a 25 3574 3576 3594 N
+ NG AO Y i n/a 25 3574 3576 3594 N
+ NG AO Z e n/a 25 3574 3576 3595 N
+ NG AO Z i n/a 25 3574 3576 3595 N
+ NG AO ZH e n/a 25 3574 3576 3595 N
+ NG AW AA e n/a 25 3573 3579 3611 N
+ NG AW AE e n/a 25 3573 3579 3607 N
+ NG AW AH e n/a 25 3573 3579 3611 N
+ NG AW AO e n/a 25 3573 3579 3611 N
+ NG AW AW e n/a 25 3573 3579 3610 N
+ NG AW AY e n/a 25 3573 3579 3611 N
+ NG AW B e n/a 25 3573 3579 3591 N
+ NG AW CH e n/a 25 3573 3579 3602 N
+ NG AW D e n/a 25 3573 3579 3591 N
+ NG AW DH e n/a 25 3573 3575 3593 N
+ NG AW EH e n/a 25 3573 3579 3607 N
+ NG AW ER e n/a 25 3573 3579 3611 N
+ NG AW ER i n/a 25 3573 3579 3610 N
+ NG AW EY e n/a 25 3573 3579 3607 N
+ NG AW F e n/a 25 3573 3579 3604 N
+ NG AW G b n/a 25 3573 3579 3592 N
+ NG AW G e n/a 25 3573 3579 3591 N
+ NG AW G i n/a 25 3573 3578 3592 N
+ NG AW HH e n/a 25 3573 3579 3594 N
+ NG AW IH e n/a 25 3573 3579 3607 N
+ NG AW IY e n/a 25 3573 3579 3607 N
+ NG AW JH e n/a 25 3573 3579 3591 N
+ NG AW K b n/a 25 3573 3580 3600 N
+ NG AW K e n/a 25 3573 3579 3602 N
+ NG AW L e n/a 25 3573 3575 3598 N
+ NG AW M e n/a 25 3573 3575 3596 N
+ NG AW N e n/a 25 3573 3575 3597 N
+ NG AW NG e n/a 25 3573 3575 3596 N
+ NG AW OW e n/a 25 3573 3579 3611 N
+ NG AW OY e n/a 25 3573 3579 3611 N
+ NG AW P e n/a 25 3573 3579 3602 N
+ NG AW R e n/a 25 3573 3575 3599 N
+ NG AW S e n/a 25 3573 3579 3603 N
+ NG AW SH e n/a 25 3573 3579 3603 N
+ NG AW SIL e n/a 25 3574 3575 3606 N
+ NG AW T e n/a 25 3573 3579 3602 N
+ NG AW TH e n/a 25 3573 3579 3604 N
+ NG AW UH e n/a 25 3573 3579 3607 N
+ NG AW UW e n/a 25 3573 3579 3607 N
+ NG AW V e n/a 25 3573 3575 3591 N
+ NG AW W e n/a 25 3573 3575 3596 N
+ NG AW Y e n/a 25 3573 3575 3594 N
+ NG AW Z e n/a 25 3573 3575 3595 N
+ NG AW ZH e n/a 25 3573 3575 3595 N
+ NG AY AA e n/a 25 3568 3579 3611 N
+ NG AY AE e n/a 25 3568 3579 3607 N
+ NG AY AH e n/a 25 3568 3579 3611 N
+ NG AY AO e n/a 25 3568 3579 3611 N
+ NG AY AW e n/a 25 3568 3579 3610 N
+ NG AY AY e n/a 25 3568 3579 3611 N
+ NG AY B e n/a 25 3568 3579 3591 N
+ NG AY CH e n/a 25 3568 3579 3602 N
+ NG AY D e n/a 25 3568 3579 3591 N
+ NG AY DH e n/a 25 3568 3575 3593 N
+ NG AY EH e n/a 25 3568 3579 3607 N
+ NG AY ER e n/a 25 3568 3579 3611 N
+ NG AY EY e n/a 25 3568 3579 3607 N
+ NG AY F e n/a 25 3568 3579 3604 N
+ NG AY G b n/a 25 3568 3581 3592 N
+ NG AY G e n/a 25 3568 3579 3591 N
+ NG AY G i n/a 25 3568 3581 3592 N
+ NG AY HH e n/a 25 3568 3579 3594 N
+ NG AY IH e n/a 25 3568 3579 3607 N
+ NG AY IY e n/a 25 3568 3579 3607 N
+ NG AY JH e n/a 25 3568 3579 3591 N
+ NG AY K b n/a 25 3568 3582 3602 N
+ NG AY K e n/a 25 3568 3579 3602 N
+ NG AY K i n/a 25 3568 3582 3601 N
+ NG AY L e n/a 25 3568 3575 3598 N
+ NG AY M e n/a 25 3568 3575 3596 N
+ NG AY N e n/a 25 3568 3575 3597 N
+ NG AY NG e n/a 25 3568 3575 3596 N
+ NG AY OW e n/a 25 3568 3579 3611 N
+ NG AY OY e n/a 25 3568 3579 3611 N
+ NG AY P e n/a 25 3568 3579 3602 N
+ NG AY R e n/a 25 3568 3575 3599 N
+ NG AY S e n/a 25 3568 3579 3603 N
+ NG AY SH e n/a 25 3568 3579 3603 N
+ NG AY SIL e n/a 25 3568 3575 3606 N
+ NG AY T e n/a 25 3568 3579 3602 N
+ NG AY TH e n/a 25 3568 3579 3604 N
+ NG AY UH e n/a 25 3568 3579 3607 N
+ NG AY UW e n/a 25 3568 3579 3607 N
+ NG AY V e n/a 25 3568 3575 3591 N
+ NG AY W e n/a 25 3568 3575 3596 N
+ NG AY Y e n/a 25 3568 3575 3594 N
+ NG AY Z e n/a 25 3568 3575 3595 N
+ NG AY ZH e n/a 25 3568 3575 3595 N
+ NG B G b n/a 25 3568 3581 3592 N
+ NG B K b n/a 25 3568 3580 3600 N
+ NG CH G b n/a 25 3568 3581 3592 N
+ NG CH K b n/a 25 3568 3580 3600 N
+ NG D G b n/a 25 3568 3581 3592 N
+ NG D K b n/a 25 3568 3580 3600 N
+ NG D K i n/a 25 3568 3580 3600 N
+ NG DH G b n/a 25 3568 3581 3592 N
+ NG DH K b n/a 25 3568 3580 3600 N
+ NG EH AA e n/a 25 3568 3579 3611 N
+ NG EH AE e n/a 25 3568 3579 3607 N
+ NG EH AH e n/a 25 3568 3579 3611 N
+ NG EH AH i n/a 25 3568 3581 3611 N
+ NG EH AO e n/a 25 3568 3579 3611 N
+ NG EH AW e n/a 25 3568 3579 3610 N
+ NG EH AY e n/a 25 3568 3579 3611 N
+ NG EH B e n/a 25 3568 3578 3591 N
+ NG EH B i n/a 25 3568 3581 3592 N
+ NG EH CH e n/a 25 3568 3578 3602 N
+ NG EH CH i n/a 25 3568 3580 3600 N
+ NG EH D e n/a 25 3568 3578 3591 N
+ NG EH D i n/a 25 3568 3581 3592 N
+ NG EH DH e n/a 25 3568 3575 3593 N
+ NG EH EH e n/a 25 3568 3579 3607 N
+ NG EH ER e n/a 25 3568 3579 3611 N
+ NG EH ER i n/a 25 3568 3581 3610 N
+ NG EH EY e n/a 25 3568 3579 3607 N
+ NG EH F e n/a 25 3568 3578 3604 N
+ NG EH F i n/a 25 3568 3580 3604 N
+ NG EH G b n/a 25 3568 3581 3592 N
+ NG EH G e n/a 25 3568 3578 3591 N
+ NG EH G i n/a 25 3568 3581 3592 N
+ NG EH HH e n/a 25 3568 3578 3594 N
+ NG EH HH i n/a 25 3568 3580 3594 N
+ NG EH IH e n/a 25 3568 3579 3607 N
+ NG EH IY e n/a 25 3568 3579 3607 N
+ NG EH JH e n/a 25 3568 3578 3591 N
+ NG EH K b n/a 25 3568 3580 3600 N
+ NG EH K e n/a 25 3568 3578 3602 N
+ NG EH K i n/a 25 3568 3580 3600 N
+ NG EH L e n/a 25 3568 3575 3598 N
+ NG EH L i n/a 25 3568 3581 3598 N
+ NG EH M e n/a 25 3568 3575 3597 N
+ NG EH M i n/a 25 3568 3581 3597 N
+ NG EH N e n/a 25 3568 3575 3597 N
+ NG EH NG e n/a 25 3568 3575 3597 N
+ NG EH OW e n/a 25 3568 3579 3611 N
+ NG EH OY e n/a 25 3568 3579 3611 N
+ NG EH P e n/a 25 3568 3578 3602 N
+ NG EH R e n/a 25 3568 3575 3599 N
+ NG EH R i n/a 25 3568 3581 3599 N
+ NG EH S e n/a 25 3568 3578 3603 N
+ NG EH S i n/a 25 3568 3580 3603 N
+ NG EH SH e n/a 25 3568 3578 3603 N
+ NG EH SH i n/a 25 3568 3580 3603 N
+ NG EH SIL e n/a 25 3568 3575 3605 N
+ NG EH T e n/a 25 3568 3578 3602 N
+ NG EH T i n/a 25 3568 3580 3600 N
+ NG EH TH e n/a 25 3568 3578 3604 N
+ NG EH TH i n/a 25 3568 3580 3603 N
+ NG EH UH e n/a 25 3568 3579 3607 N
+ NG EH UW e n/a 25 3568 3579 3607 N
+ NG EH V e n/a 25 3568 3575 3591 N
+ NG EH W e n/a 25 3568 3575 3596 N
+ NG EH W i n/a 25 3568 3581 3596 N
+ NG EH Y e n/a 25 3568 3575 3594 N
+ NG EH Y i n/a 25 3568 3581 3594 N
+ NG EH Z e n/a 25 3568 3575 3595 N
+ NG EH Z i n/a 25 3568 3581 3595 N
+ NG EH ZH e n/a 25 3568 3575 3595 N
+ NG ER G b n/a 25 3574 3578 3592 N
+ NG ER K b n/a 25 3574 3578 3601 N
+ NG EY AA e n/a 25 3568 3579 3611 N
+ NG EY AE e n/a 25 3568 3579 3607 N
+ NG EY AH e n/a 25 3568 3579 3611 N
+ NG EY AO e n/a 25 3568 3579 3611 N
+ NG EY AW e n/a 25 3568 3579 3610 N
+ NG EY AY e n/a 25 3568 3579 3611 N
+ NG EY B e n/a 25 3568 3579 3591 N
+ NG EY CH e n/a 25 3568 3579 3602 N
+ NG EY D e n/a 25 3568 3579 3591 N
+ NG EY DH e n/a 25 3568 3575 3593 N
+ NG EY EH e n/a 25 3568 3579 3607 N
+ NG EY ER e n/a 25 3568 3579 3611 N
+ NG EY EY e n/a 25 3568 3579 3607 N
+ NG EY F e n/a 25 3568 3579 3604 N
+ NG EY G b n/a 25 3568 3581 3592 N
+ NG EY G e n/a 25 3568 3579 3591 N
+ NG EY G i n/a 25 3568 3581 3592 N
+ NG EY HH e n/a 25 3568 3579 3594 N
+ NG EY IH e n/a 25 3568 3579 3607 N
+ NG EY IY e n/a 25 3568 3579 3607 N
+ NG EY JH e n/a 25 3568 3579 3591 N
+ NG EY JH i n/a 25 3568 3581 3592 N
+ NG EY K b n/a 25 3568 3580 3600 N
+ NG EY K e n/a 25 3568 3579 3602 N
+ NG EY K i n/a 25 3568 3580 3600 N
+ NG EY L e n/a 25 3568 3575 3598 N
+ NG EY M e n/a 25 3568 3575 3596 N
+ NG EY N e n/a 25 3568 3575 3597 N
+ NG EY NG e n/a 25 3568 3575 3596 N
+ NG EY OW e n/a 25 3568 3579 3611 N
+ NG EY OY e n/a 25 3568 3579 3611 N
+ NG EY P e n/a 25 3568 3579 3602 N
+ NG EY R e n/a 25 3568 3575 3599 N
+ NG EY S e n/a 25 3568 3579 3603 N
+ NG EY SH e n/a 25 3568 3579 3603 N
+ NG EY SIL e n/a 25 3568 3575 3605 N
+ NG EY T e n/a 25 3568 3579 3602 N
+ NG EY TH e n/a 25 3568 3579 3604 N
+ NG EY UH e n/a 25 3568 3579 3607 N
+ NG EY UW e n/a 25 3568 3579 3607 N
+ NG EY V e n/a 25 3568 3575 3591 N
+ NG EY W e n/a 25 3568 3575 3596 N
+ NG EY Y e n/a 25 3568 3575 3594 N
+ NG EY Z e n/a 25 3568 3575 3595 N
+ NG EY ZH e n/a 25 3568 3575 3595 N
+ NG F G b n/a 25 3568 3581 3592 N
+ NG F K b n/a 25 3568 3580 3600 N
+ NG G G b n/a 25 3568 3581 3592 N
+ NG G K b n/a 25 3568 3580 3600 N
+ NG HH G b n/a 25 3568 3581 3592 N
+ NG HH K b n/a 25 3568 3580 3600 N
+ NG IH AA e n/a 25 3572 3590 3611 N
+ NG IH AE e n/a 25 3572 3589 3607 N
+ NG IH AE i n/a 25 3572 3589 3607 N
+ NG IH AH e n/a 25 3572 3590 3610 N
+ NG IH AH i n/a 25 3572 3590 3610 N
+ NG IH AO e n/a 25 3572 3590 3611 N
+ NG IH AO i n/a 25 3572 3590 3611 N
+ NG IH AW e n/a 25 3572 3590 3610 N
+ NG IH AY e n/a 25 3572 3590 3611 N
+ NG IH B e n/a 25 3571 3587 3591 N
+ NG IH B i n/a 25 3571 3586 3592 N
+ NG IH CH e n/a 25 3571 3583 3602 N
+ NG IH D e n/a 25 3571 3587 3591 N
+ NG IH D i n/a 25 3571 3586 3592 N
+ NG IH DH e n/a 25 3571 3587 3593 N
+ NG IH EH e n/a 25 3572 3589 3607 N
+ NG IH EH i n/a 25 3572 3589 3607 N
+ NG IH ER e n/a 25 3572 3590 3611 N
+ NG IH ER i n/a 25 3572 3590 3610 N
+ NG IH EY e n/a 25 3572 3589 3607 N
+ NG IH EY i n/a 25 3572 3589 3607 N
+ NG IH F e n/a 25 3571 3583 3604 N
+ NG IH F i n/a 25 3571 3583 3604 N
+ NG IH G b n/a 25 3571 3587 3592 N
+ NG IH G e n/a 25 3571 3587 3591 N
+ NG IH G i n/a 25 3569 3586 3592 N
+ NG IH HH e n/a 25 3572 3584 3594 N
+ NG IH HH i n/a 25 3572 3584 3594 N
+ NG IH IH e n/a 25 3572 3589 3609 N
+ NG IH IH i n/a 25 3572 3589 3608 N
+ NG IH IY e n/a 25 3572 3589 3609 N
+ NG IH IY i n/a 25 3572 3589 3608 N
+ NG IH JH e n/a 25 3571 3587 3591 N
+ NG IH JH i n/a 25 3571 3586 3592 N
+ NG IH K b n/a 25 3571 3583 3600 N
+ NG IH K e n/a 25 3571 3583 3602 N
+ NG IH K i n/a 25 3569 3580 3600 N
+ NG IH L e n/a 25 3571 3586 3598 N
+ NG IH L i n/a 25 3571 3586 3598 N
+ NG IH M e n/a 25 3571 3586 3597 N
+ NG IH M i n/a 25 3571 3586 3597 N
+ NG IH N e n/a 25 3571 3586 3597 N
+ NG IH N i n/a 25 3571 3586 3597 N
+ NG IH NG e n/a 25 3571 3586 3597 N
+ NG IH OW e n/a 25 3572 3590 3611 N
+ NG IH OY e n/a 25 3572 3590 3611 N
+ NG IH P e n/a 25 3571 3583 3602 N
+ NG IH P i n/a 25 3571 3580 3600 N
+ NG IH R e n/a 25 3571 3586 3599 N
+ NG IH R i n/a 25 3571 3586 3599 N
+ NG IH S e n/a 25 3571 3583 3603 N
+ NG IH S i n/a 25 3571 3583 3603 N
+ NG IH SH e n/a 25 3571 3583 3603 N
+ NG IH SH i n/a 25 3571 3583 3603 N
+ NG IH SIL e n/a 25 3570 3585 3605 N
+ NG IH T e n/a 25 3571 3583 3602 N
+ NG IH T i n/a 25 3571 3580 3600 N
+ NG IH TH e n/a 25 3571 3583 3604 N
+ NG IH UH e n/a 25 3572 3589 3609 N
+ NG IH UW e n/a 25 3572 3589 3609 N
+ NG IH V e n/a 25 3571 3587 3591 N
+ NG IH V i n/a 25 3570 3587 3593 N
+ NG IH W e n/a 25 3571 3586 3596 N
+ NG IH W i n/a 25 3571 3586 3596 N
+ NG IH Y e n/a 25 3571 3586 3594 N
+ NG IH Y i n/a 25 3571 3586 3594 N
+ NG IH Z e n/a 25 3571 3588 3595 N
+ NG IH Z i n/a 25 3570 3588 3595 N
+ NG IH ZH e n/a 25 3571 3587 3595 N
+ NG IY AA e n/a 25 3572 3590 3611 N
+ NG IY AE e n/a 25 3572 3589 3607 N
+ NG IY AH e n/a 25 3572 3590 3610 N
+ NG IY AO e n/a 25 3572 3590 3611 N
+ NG IY AW e n/a 25 3572 3590 3610 N
+ NG IY AY e n/a 25 3572 3590 3611 N
+ NG IY B e n/a 25 3571 3587 3591 N
+ NG IY CH e n/a 25 3571 3583 3602 N
+ NG IY D e n/a 25 3571 3587 3591 N
+ NG IY DH e n/a 25 3571 3587 3593 N
+ NG IY EH e n/a 25 3572 3589 3607 N
+ NG IY ER e n/a 25 3572 3590 3611 N
+ NG IY EY e n/a 25 3572 3589 3607 N
+ NG IY F e n/a 25 3571 3583 3604 N
+ NG IY G b n/a 25 3571 3587 3592 N
+ NG IY G e n/a 25 3571 3587 3591 N
+ NG IY G i n/a 25 3569 3586 3592 N
+ NG IY HH e n/a 25 3572 3584 3594 N
+ NG IY IH e n/a 25 3572 3589 3609 N
+ NG IY IY e n/a 25 3572 3589 3609 N
+ NG IY JH e n/a 25 3571 3587 3591 N
+ NG IY K b n/a 25 3571 3583 3600 N
+ NG IY K e n/a 25 3571 3583 3602 N
+ NG IY K i n/a 25 3569 3580 3600 N
+ NG IY L e n/a 25 3571 3586 3598 N
+ NG IY M e n/a 25 3571 3586 3597 N
+ NG IY N e n/a 25 3571 3586 3597 N
+ NG IY NG e n/a 25 3571 3586 3597 N
+ NG IY OW e n/a 25 3572 3590 3611 N
+ NG IY OY e n/a 25 3572 3590 3611 N
+ NG IY P e n/a 25 3571 3583 3602 N
+ NG IY R e n/a 25 3571 3586 3599 N
+ NG IY S e n/a 25 3571 3583 3603 N
+ NG IY SH e n/a 25 3571 3583 3603 N
+ NG IY SIL e n/a 25 3570 3585 3605 N
+ NG IY T e n/a 25 3571 3583 3602 N
+ NG IY TH e n/a 25 3571 3583 3604 N
+ NG IY UH e n/a 25 3572 3589 3609 N
+ NG IY UW e n/a 25 3572 3589 3609 N
+ NG IY V e n/a 25 3571 3587 3591 N
+ NG IY W e n/a 25 3571 3586 3596 N
+ NG IY Y e n/a 25 3571 3586 3594 N
+ NG IY Z e n/a 25 3571 3588 3595 N
+ NG IY ZH e n/a 25 3571 3587 3595 N
+ NG JH G b n/a 25 3568 3581 3592 N
+ NG JH K b n/a 25 3568 3580 3600 N
+ NG K G b n/a 25 3568 3581 3592 N
+ NG K K b n/a 25 3568 3580 3600 N
+ NG K K i n/a 25 3568 3580 3600 N
+ NG L G b n/a 25 3573 3578 3592 N
+ NG L K b n/a 25 3573 3582 3602 N
+ NG M G b n/a 25 3568 3581 3592 N
+ NG M K b n/a 25 3568 3580 3600 N
+ NG M K i n/a 25 3568 3580 3600 N
+ NG N G b n/a 25 3568 3581 3592 N
+ NG N K b n/a 25 3568 3580 3600 N
+ NG NG G b n/a 25 3568 3581 3592 N
+ NG NG K b n/a 25 3568 3580 3600 N
+ NG OW AA e n/a 25 3574 3579 3611 N
+ NG OW AE e n/a 25 3574 3579 3607 N
+ NG OW AH e n/a 25 3574 3579 3611 N
+ NG OW AO e n/a 25 3574 3579 3611 N
+ NG OW AW e n/a 25 3574 3579 3610 N
+ NG OW AY e n/a 25 3574 3579 3611 N
+ NG OW B e n/a 25 3574 3579 3591 N
+ NG OW CH e n/a 25 3574 3579 3602 N
+ NG OW CH i n/a 25 3574 3582 3601 N
+ NG OW D e n/a 25 3574 3579 3591 N
+ NG OW DH e n/a 25 3574 3576 3593 N
+ NG OW EH e n/a 25 3574 3579 3607 N
+ NG OW ER e n/a 25 3574 3579 3611 N
+ NG OW EY e n/a 25 3574 3579 3607 N
+ NG OW F e n/a 25 3574 3579 3604 N
+ NG OW G b n/a 25 3574 3579 3592 N
+ NG OW G e n/a 25 3574 3579 3591 N
+ NG OW G i n/a 25 3574 3578 3592 N
+ NG OW HH e n/a 25 3574 3579 3594 N
+ NG OW IH e n/a 25 3574 3579 3607 N
+ NG OW IY e n/a 25 3574 3579 3607 N
+ NG OW JH e n/a 25 3574 3579 3591 N
+ NG OW K b n/a 25 3574 3582 3602 N
+ NG OW K e n/a 25 3574 3579 3602 N
+ NG OW K i n/a 25 3574 3582 3601 N
+ NG OW L e n/a 25 3574 3576 3598 N
+ NG OW M e n/a 25 3574 3576 3596 N
+ NG OW M i n/a 25 3574 3576 3596 N
+ NG OW N e n/a 25 3574 3576 3597 N
+ NG OW NG e n/a 25 3574 3576 3596 N
+ NG OW OW e n/a 25 3574 3579 3611 N
+ NG OW OY e n/a 25 3574 3579 3611 N
+ NG OW P e n/a 25 3574 3579 3602 N
+ NG OW R e n/a 25 3574 3576 3599 N
+ NG OW S e n/a 25 3574 3579 3603 N
+ NG OW SH e n/a 25 3574 3579 3603 N
+ NG OW SIL e n/a 25 3574 3575 3606 N
+ NG OW T e n/a 25 3574 3579 3602 N
+ NG OW TH e n/a 25 3574 3579 3604 N
+ NG OW UH e n/a 25 3574 3579 3607 N
+ NG OW UW e n/a 25 3574 3579 3607 N
+ NG OW V e n/a 25 3574 3576 3591 N
+ NG OW W e n/a 25 3574 3576 3596 N
+ NG OW Y e n/a 25 3574 3576 3594 N
+ NG OW Z e n/a 25 3574 3576 3595 N
+ NG OW Z i n/a 25 3574 3576 3595 N
+ NG OW ZH e n/a 25 3574 3576 3595 N
+ NG OY G b n/a 25 3568 3581 3592 N
+ NG OY K b n/a 25 3568 3582 3602 N
+ NG P G b n/a 25 3568 3581 3592 N
+ NG P K b n/a 25 3568 3580 3600 N
+ NG R AA e n/a 25 3573 3579 3611 N
+ NG R AA i n/a 25 3573 3579 3611 N
+ NG R AE e n/a 25 3573 3579 3607 N
+ NG R AH e n/a 25 3573 3579 3611 N
+ NG R AO e n/a 25 3573 3579 3611 N
+ NG R AW e n/a 25 3573 3579 3610 N
+ NG R AY e n/a 25 3573 3579 3611 N
+ NG R B e n/a 25 3573 3578 3591 N
+ NG R CH e n/a 25 3573 3578 3602 N
+ NG R D e n/a 25 3573 3578 3591 N
+ NG R DH e n/a 25 3573 3575 3593 N
+ NG R EH e n/a 25 3573 3579 3607 N
+ NG R ER e n/a 25 3573 3579 3611 N
+ NG R EY e n/a 25 3573 3579 3607 N
+ NG R F e n/a 25 3573 3578 3604 N
+ NG R G b n/a 25 3573 3578 3592 N
+ NG R G e n/a 25 3573 3578 3591 N
+ NG R HH e n/a 25 3573 3578 3594 N
+ NG R IH e n/a 25 3573 3579 3607 N
+ NG R IY e n/a 25 3573 3579 3607 N
+ NG R JH e n/a 25 3573 3578 3591 N
+ NG R K b n/a 25 3573 3582 3602 N
+ NG R K e n/a 25 3573 3578 3602 N
+ NG R K i n/a 25 3573 3582 3601 N
+ NG R L e n/a 25 3573 3575 3598 N
+ NG R M e n/a 25 3573 3575 3597 N
+ NG R N e n/a 25 3573 3575 3597 N
+ NG R NG e n/a 25 3573 3575 3597 N
+ NG R OW e n/a 25 3573 3579 3611 N
+ NG R OY e n/a 25 3573 3579 3611 N
+ NG R P e n/a 25 3573 3578 3602 N
+ NG R R e n/a 25 3573 3575 3599 N
+ NG R S e n/a 25 3573 3578 3603 N
+ NG R SH e n/a 25 3573 3578 3603 N
+ NG R SIL e n/a 25 3574 3575 3606 N
+ NG R T e n/a 25 3573 3578 3602 N
+ NG R TH e n/a 25 3573 3578 3604 N
+ NG R UH e n/a 25 3573 3579 3607 N
+ NG R UW e n/a 25 3573 3579 3607 N
+ NG R V e n/a 25 3573 3575 3591 N
+ NG R W e n/a 25 3573 3575 3596 N
+ NG R Y e n/a 25 3573 3575 3594 N
+ NG R Z e n/a 25 3573 3575 3595 N
+ NG R Z i n/a 25 3573 3575 3595 N
+ NG R ZH e n/a 25 3573 3575 3595 N
+ NG S G b n/a 25 3568 3581 3592 N
+ NG S K b n/a 25 3568 3580 3600 N
+ NG SH G b n/a 25 3568 3581 3592 N
+ NG SH K b n/a 25 3568 3580 3600 N
+ NG SIL G b n/a 25 3568 3581 3592 N
+ NG SIL K b n/a 25 3568 3580 3600 N
+ NG T G b n/a 25 3568 3581 3592 N
+ NG T K b n/a 25 3568 3580 3600 N
+ NG T K i n/a 25 3568 3580 3600 N
+ NG TH G b n/a 25 3568 3581 3592 N
+ NG TH K b n/a 25 3568 3580 3600 N
+ NG UH AA e n/a 25 3572 3590 3611 N
+ NG UH AE e n/a 25 3572 3589 3607 N
+ NG UH AH e n/a 25 3572 3590 3610 N
+ NG UH AO e n/a 25 3572 3590 3611 N
+ NG UH AW e n/a 25 3572 3590 3610 N
+ NG UH AY e n/a 25 3572 3590 3611 N
+ NG UH B e n/a 25 3571 3587 3591 N
+ NG UH CH e n/a 25 3571 3583 3602 N
+ NG UH D e n/a 25 3571 3587 3591 N
+ NG UH DH e n/a 25 3571 3587 3593 N
+ NG UH EH e n/a 25 3572 3589 3607 N
+ NG UH ER e n/a 25 3572 3590 3611 N
+ NG UH EY e n/a 25 3572 3589 3607 N
+ NG UH F e n/a 25 3571 3583 3604 N
+ NG UH G b n/a 25 3571 3587 3592 N
+ NG UH G e n/a 25 3571 3587 3591 N
+ NG UH HH e n/a 25 3572 3584 3594 N
+ NG UH IH e n/a 25 3572 3589 3609 N
+ NG UH IY e n/a 25 3572 3589 3609 N
+ NG UH JH e n/a 25 3571 3587 3591 N
+ NG UH K b n/a 25 3571 3583 3600 N
+ NG UH K e n/a 25 3571 3583 3602 N
+ NG UH L e n/a 25 3571 3586 3598 N
+ NG UH M e n/a 25 3571 3586 3597 N
+ NG UH N e n/a 25 3571 3586 3597 N
+ NG UH NG e n/a 25 3571 3586 3597 N
+ NG UH OW e n/a 25 3572 3590 3611 N
+ NG UH OY e n/a 25 3572 3590 3611 N
+ NG UH P e n/a 25 3571 3583 3602 N
+ NG UH R e n/a 25 3571 3586 3599 N
+ NG UH S e n/a 25 3571 3583 3603 N
+ NG UH SH e n/a 25 3571 3583 3603 N
+ NG UH SIL e n/a 25 3570 3585 3605 N
+ NG UH T e n/a 25 3571 3583 3602 N
+ NG UH TH e n/a 25 3571 3583 3604 N
+ NG UH UH e n/a 25 3572 3589 3609 N
+ NG UH UW e n/a 25 3572 3589 3609 N
+ NG UH V e n/a 25 3571 3587 3591 N
+ NG UH W e n/a 25 3571 3586 3596 N
+ NG UH Y e n/a 25 3571 3586 3594 N
+ NG UH Z e n/a 25 3571 3588 3595 N
+ NG UH Z i n/a 25 3570 3588 3595 N
+ NG UH ZH e n/a 25 3571 3587 3595 N
+ NG UW AA e n/a 25 3572 3590 3611 N
+ NG UW AE e n/a 25 3572 3589 3607 N
+ NG UW AH e n/a 25 3572 3590 3610 N
+ NG UW AH i n/a 25 3572 3590 3610 N
+ NG UW AO e n/a 25 3572 3590 3611 N
+ NG UW AW e n/a 25 3572 3590 3610 N
+ NG UW AY e n/a 25 3572 3590 3611 N
+ NG UW B e n/a 25 3571 3587 3591 N
+ NG UW CH e n/a 25 3571 3583 3602 N
+ NG UW D e n/a 25 3571 3587 3591 N
+ NG UW DH e n/a 25 3571 3587 3593 N
+ NG UW EH e n/a 25 3572 3589 3607 N
+ NG UW ER e n/a 25 3572 3590 3611 N
+ NG UW EY e n/a 25 3572 3589 3607 N
+ NG UW EY i n/a 25 3572 3589 3607 N
+ NG UW F e n/a 25 3571 3583 3604 N
+ NG UW G b n/a 25 3571 3587 3592 N
+ NG UW G e n/a 25 3571 3587 3591 N
+ NG UW G i n/a 25 3569 3586 3592 N
+ NG UW HH e n/a 25 3572 3584 3594 N
+ NG UW IH e n/a 25 3572 3589 3609 N
+ NG UW IY e n/a 25 3572 3589 3609 N
+ NG UW JH e n/a 25 3571 3587 3591 N
+ NG UW K b n/a 25 3571 3583 3600 N
+ NG UW K e n/a 25 3571 3583 3602 N
+ NG UW K i n/a 25 3569 3582 3600 N
+ NG UW L e n/a 25 3571 3586 3598 N
+ NG UW M e n/a 25 3571 3586 3597 N
+ NG UW N e n/a 25 3571 3586 3597 N
+ NG UW NG e n/a 25 3571 3586 3597 N
+ NG UW OW e n/a 25 3572 3590 3611 N
+ NG UW OY e n/a 25 3572 3590 3611 N
+ NG UW P e n/a 25 3571 3583 3602 N
+ NG UW R e n/a 25 3571 3586 3599 N
+ NG UW S e n/a 25 3571 3583 3603 N
+ NG UW SH e n/a 25 3571 3583 3603 N
+ NG UW SIL e n/a 25 3570 3585 3605 N
+ NG UW T e n/a 25 3571 3583 3602 N
+ NG UW TH e n/a 25 3571 3583 3604 N
+ NG UW UH e n/a 25 3572 3589 3609 N
+ NG UW UH i n/a 25 3572 3589 3608 N
+ NG UW UW e n/a 25 3572 3589 3609 N
+ NG UW V e n/a 25 3571 3587 3591 N
+ NG UW W e n/a 25 3571 3586 3596 N
+ NG UW Y e n/a 25 3571 3586 3594 N
+ NG UW Y i n/a 25 3571 3586 3594 N
+ NG UW Z e n/a 25 3571 3588 3595 N
+ NG UW Z i n/a 25 3570 3588 3595 N
+ NG UW ZH e n/a 25 3571 3587 3595 N
+ NG V G b n/a 25 3568 3581 3592 N
+ NG V K b n/a 25 3568 3580 3600 N
+ NG W G b n/a 25 3574 3578 3592 N
+ NG W K b n/a 25 3574 3582 3601 N
+ NG Y AH i n/a 25 3572 3590 3610 N
+ NG Y G b n/a 25 3571 3587 3592 N
+ NG Y K b n/a 25 3571 3583 3600 N
+ NG Z G b n/a 25 3568 3581 3592 N
+ NG Z K b n/a 25 3568 3580 3600 N
+ NG ZH G b n/a 25 3568 3581 3592 N
+ NG ZH K b n/a 25 3568 3580 3600 N
+ OW AA AA b n/a 26 3652 3704 3735 N
+ OW AA AA e n/a 26 3649 3704 3735 N
+ OW AA AA s n/a 26 3649 3704 3735 N
+ OW AA AE e n/a 26 3649 3704 3724 N
+ OW AA AE s n/a 26 3649 3704 3724 N
+ OW AA AH b n/a 26 3652 3704 3721 N
+ OW AA AH e n/a 26 3649 3704 3721 N
+ OW AA AH s n/a 26 3649 3704 3721 N
+ OW AA AO b n/a 26 3652 3704 3735 N
+ OW AA AO e n/a 26 3649 3704 3735 N
+ OW AA AO s n/a 26 3649 3704 3735 N
+ OW AA AW b n/a 26 3652 3704 3736 N
+ OW AA AW e n/a 26 3649 3704 3736 N
+ OW AA AW s n/a 26 3649 3704 3736 N
+ OW AA AY e n/a 26 3649 3704 3721 N
+ OW AA AY s n/a 26 3649 3704 3721 N
+ OW AA B b n/a 26 3652 3675 3718 N
+ OW AA B e n/a 26 3649 3675 3718 N
+ OW AA B s n/a 26 3649 3675 3718 N
+ OW AA CH b n/a 26 3652 3671 3706 N
+ OW AA CH e n/a 26 3649 3671 3706 N
+ OW AA CH s n/a 26 3652 3671 3706 N
+ OW AA D b n/a 26 3652 3671 3705 N
+ OW AA D e n/a 26 3649 3671 3705 N
+ OW AA D s n/a 26 3649 3671 3705 N
+ OW AA DH b n/a 26 3652 3672 3713 N
+ OW AA DH e n/a 26 3652 3672 3713 N
+ OW AA DH s n/a 26 3652 3672 3713 N
+ OW AA EH b n/a 26 3652 3704 3724 N
+ OW AA EH e n/a 26 3649 3704 3724 N
+ OW AA EH s n/a 26 3649 3704 3724 N
+ OW AA ER b n/a 26 3652 3704 3736 N
+ OW AA ER e n/a 26 3649 3704 3736 N
+ OW AA ER s n/a 26 3649 3704 3736 N
+ OW AA EY b n/a 26 3652 3704 3724 N
+ OW AA EY e n/a 26 3649 3704 3724 N
+ OW AA EY s n/a 26 3649 3704 3724 N
+ OW AA F b n/a 26 3652 3676 3717 N
+ OW AA F e n/a 26 3649 3677 3717 N
+ OW AA F s n/a 26 3652 3677 3717 N
+ OW AA G b n/a 26 3652 3678 3716 N
+ OW AA G e n/a 26 3649 3678 3716 N
+ OW AA G s n/a 26 3649 3678 3716 N
+ OW AA HH b n/a 26 3652 3676 3723 N
+ OW AA HH e n/a 26 3649 3677 3723 N
+ OW AA HH s n/a 26 3652 3677 3723 N
+ OW AA IH b n/a 26 3652 3704 3715 N
+ OW AA IH e n/a 26 3649 3704 3715 N
+ OW AA IH s n/a 26 3649 3704 3715 N
+ OW AA IY b n/a 26 3652 3704 3715 N
+ OW AA IY e n/a 26 3649 3704 3715 N
+ OW AA IY s n/a 26 3649 3704 3715 N
+ OW AA JH b n/a 26 3652 3671 3705 N
+ OW AA JH e n/a 26 3649 3671 3705 N
+ OW AA JH s n/a 26 3649 3671 3705 N
+ OW AA K b n/a 26 3652 3678 3716 N
+ OW AA K e n/a 26 3649 3678 3716 N
+ OW AA K i n/a 26 3651 3678 3716 N
+ OW AA K s n/a 26 3652 3678 3716 N
+ OW AA L b n/a 26 3638 3692 3727 N
+ OW AA L e n/a 26 3638 3692 3738 N
+ OW AA L i n/a 26 3638 3692 3727 N
+ OW AA L s n/a 26 3638 3692 3727 N
+ OW AA M b n/a 26 3652 3689 3732 N
+ OW AA M e n/a 26 3649 3689 3732 N
+ OW AA M i n/a 26 3651 3689 3732 N
+ OW AA M s n/a 26 3652 3689 3732 N
+ OW AA N b n/a 26 3652 3688 3733 N
+ OW AA N e n/a 26 3649 3686 3731 N
+ OW AA N i n/a 26 3651 3686 3730 N
+ OW AA N s n/a 26 3652 3686 3731 N
+ OW AA NG e n/a 26 3649 3686 3731 N
+ OW AA NG s n/a 26 3652 3686 3731 N
+ OW AA OW e n/a 26 3649 3704 3735 N
+ OW AA OW s n/a 26 3649 3704 3735 N
+ OW AA OY b n/a 26 3652 3704 3721 N
+ OW AA OY e n/a 26 3649 3704 3721 N
+ OW AA OY s n/a 26 3649 3704 3721 N
+ OW AA P b n/a 26 3652 3675 3719 N
+ OW AA P e n/a 26 3649 3675 3719 N
+ OW AA P s n/a 26 3652 3675 3719 N
+ OW AA R b n/a 26 3643 3696 3736 N
+ OW AA R e n/a 26 3643 3698 3736 N
+ OW AA R s n/a 26 3643 3698 3736 N
+ OW AA S b n/a 26 3652 3671 3709 N
+ OW AA S e n/a 26 3649 3671 3709 N
+ OW AA S i n/a 26 3651 3671 3709 N
+ OW AA S s n/a 26 3652 3671 3709 N
+ OW AA SH b n/a 26 3652 3671 3711 N
+ OW AA SH e n/a 26 3649 3671 3711 N
+ OW AA SH i n/a 26 3651 3671 3711 N
+ OW AA SH s n/a 26 3652 3671 3711 N
+ OW AA SIL e n/a 26 3649 3683 3725 N
+ OW AA SIL s n/a 26 3652 3683 3725 N
+ OW AA T b n/a 26 3652 3671 3706 N
+ OW AA T e n/a 26 3649 3671 3706 N
+ OW AA T s n/a 26 3652 3671 3706 N
+ OW AA TH b n/a 26 3652 3671 3710 N
+ OW AA TH e n/a 26 3652 3671 3710 N
+ OW AA TH s n/a 26 3652 3671 3710 N
+ OW AA UH b n/a 26 3652 3704 3736 N
+ OW AA UH e n/a 26 3649 3704 3736 N
+ OW AA UH s n/a 26 3649 3704 3736 N
+ OW AA UW e n/a 26 3649 3704 3735 N
+ OW AA UW s n/a 26 3649 3704 3735 N
+ OW AA V b n/a 26 3652 3676 3720 N
+ OW AA V e n/a 26 3649 3677 3720 N
+ OW AA V s n/a 26 3649 3677 3720 N
+ OW AA W b n/a 26 3652 3676 3727 N
+ OW AA W e n/a 26 3649 3677 3737 N
+ OW AA W s n/a 26 3649 3677 3727 N
+ OW AA Y b n/a 26 3652 3671 3707 N
+ OW AA Y e n/a 26 3649 3671 3707 N
+ OW AA Y s n/a 26 3649 3671 3707 N
+ OW AA Z b n/a 26 3652 3672 3712 N
+ OW AA Z e n/a 26 3649 3672 3712 N
+ OW AA Z s n/a 26 3649 3672 3712 N
+ OW AA ZH b n/a 26 3652 3672 3712 N
+ OW AA ZH e n/a 26 3649 3672 3712 N
+ OW AA ZH s n/a 26 3649 3672 3712 N
+ OW AE AA b n/a 26 3630 3704 3735 N
+ OW AE AA s n/a 26 3618 3704 3735 N
+ OW AE AE s n/a 26 3618 3704 3724 N
+ OW AE AH b n/a 26 3630 3704 3721 N
+ OW AE AH s n/a 26 3618 3704 3721 N
+ OW AE AO b n/a 26 3630 3704 3735 N
+ OW AE AO s n/a 26 3618 3704 3735 N
+ OW AE AW b n/a 26 3630 3704 3736 N
+ OW AE AW s n/a 26 3618 3704 3736 N
+ OW AE AY s n/a 26 3618 3704 3721 N
+ OW AE B b n/a 26 3631 3675 3718 N
+ OW AE B s n/a 26 3612 3675 3718 N
+ OW AE CH b n/a 26 3631 3667 3706 N
+ OW AE CH s n/a 26 3612 3667 3706 N
+ OW AE D b n/a 26 3631 3667 3705 N
+ OW AE D s n/a 26 3612 3667 3705 N
+ OW AE DH b n/a 26 3631 3664 3713 N
+ OW AE DH s n/a 26 3612 3664 3713 N
+ OW AE EH b n/a 26 3630 3704 3724 N
+ OW AE EH s n/a 26 3618 3704 3724 N
+ OW AE ER b n/a 26 3630 3704 3736 N
+ OW AE ER s n/a 26 3618 3704 3736 N
+ OW AE EY b n/a 26 3630 3704 3724 N
+ OW AE EY s n/a 26 3618 3704 3724 N
+ OW AE F b n/a 26 3631 3676 3717 N
+ OW AE F s n/a 26 3612 3677 3717 N
+ OW AE G b n/a 26 3631 3678 3716 N
+ OW AE G s n/a 26 3612 3678 3716 N
+ OW AE HH b n/a 26 3630 3676 3723 N
+ OW AE HH s n/a 26 3612 3677 3723 N
+ OW AE IH b n/a 26 3630 3704 3715 N
+ OW AE IH s n/a 26 3618 3704 3715 N
+ OW AE IY b n/a 26 3630 3704 3715 N
+ OW AE IY s n/a 26 3618 3704 3715 N
+ OW AE JH b n/a 26 3631 3667 3705 N
+ OW AE JH s n/a 26 3612 3667 3705 N
+ OW AE K b n/a 26 3631 3678 3716 N
+ OW AE K s n/a 26 3612 3678 3716 N
+ OW AE L b n/a 26 3644 3695 3728 N
+ OW AE L s n/a 26 3643 3695 3727 N
+ OW AE M b n/a 26 3630 3689 3732 N
+ OW AE M s n/a 26 3612 3689 3732 N
+ OW AE N b n/a 26 3630 3687 3733 N
+ OW AE N s n/a 26 3612 3686 3731 N
+ OW AE NG s n/a 26 3612 3686 3731 N
+ OW AE OW s n/a 26 3618 3704 3735 N
+ OW AE OY b n/a 26 3630 3704 3721 N
+ OW AE OY s n/a 26 3618 3704 3721 N
+ OW AE P b n/a 26 3631 3675 3719 N
+ OW AE P s n/a 26 3612 3675 3719 N
+ OW AE R b n/a 26 3644 3696 3736 N
+ OW AE R s n/a 26 3643 3698 3736 N
+ OW AE S b n/a 26 3631 3667 3709 N
+ OW AE S s n/a 26 3613 3667 3709 N
+ OW AE SH b n/a 26 3631 3667 3711 N
+ OW AE SH s n/a 26 3613 3667 3711 N
+ OW AE SIL s n/a 26 3612 3683 3725 N
+ OW AE T b n/a 26 3631 3667 3706 N
+ OW AE T s n/a 26 3612 3667 3706 N
+ OW AE TH b n/a 26 3631 3667 3710 N
+ OW AE TH s n/a 26 3612 3667 3710 N
+ OW AE UH b n/a 26 3630 3704 3736 N
+ OW AE UH s n/a 26 3618 3704 3736 N
+ OW AE UW s n/a 26 3618 3704 3735 N
+ OW AE V b n/a 26 3631 3676 3720 N
+ OW AE V s n/a 26 3612 3677 3720 N
+ OW AE W b n/a 26 3630 3676 3728 N
+ OW AE W s n/a 26 3618 3677 3727 N
+ OW AE Y b n/a 26 3630 3667 3707 N
+ OW AE Y s n/a 26 3618 3667 3707 N
+ OW AE Z b n/a 26 3631 3664 3712 N
+ OW AE Z s n/a 26 3613 3664 3712 N
+ OW AE ZH b n/a 26 3631 3664 3712 N
+ OW AE ZH s n/a 26 3613 3664 3712 N
+ OW AH AA b n/a 26 3630 3704 3735 N
+ OW AH AA s n/a 26 3618 3704 3735 N
+ OW AH AE s n/a 26 3618 3704 3724 N
+ OW AH AH b n/a 26 3630 3704 3721 N
+ OW AH AH s n/a 26 3618 3704 3721 N
+ OW AH AO b n/a 26 3630 3704 3735 N
+ OW AH AO s n/a 26 3618 3704 3735 N
+ OW AH AW b n/a 26 3630 3704 3736 N
+ OW AH AW s n/a 26 3618 3704 3736 N
+ OW AH AY s n/a 26 3618 3704 3721 N
+ OW AH B b n/a 26 3631 3675 3718 N
+ OW AH B s n/a 26 3612 3675 3718 N
+ OW AH CH b n/a 26 3631 3667 3706 N
+ OW AH CH s n/a 26 3612 3667 3706 N
+ OW AH D b n/a 26 3631 3667 3705 N
+ OW AH D s n/a 26 3612 3667 3705 N
+ OW AH DH b n/a 26 3631 3664 3713 N
+ OW AH DH s n/a 26 3612 3664 3713 N
+ OW AH EH b n/a 26 3630 3704 3724 N
+ OW AH EH s n/a 26 3618 3704 3724 N
+ OW AH ER b n/a 26 3630 3704 3736 N
+ OW AH ER s n/a 26 3618 3704 3736 N
+ OW AH EY b n/a 26 3630 3704 3724 N
+ OW AH EY s n/a 26 3618 3704 3724 N
+ OW AH F b n/a 26 3631 3676 3717 N
+ OW AH F s n/a 26 3612 3677 3717 N
+ OW AH G b n/a 26 3631 3678 3716 N
+ OW AH G s n/a 26 3612 3678 3716 N
+ OW AH HH b n/a 26 3630 3676 3723 N
+ OW AH HH s n/a 26 3612 3677 3723 N
+ OW AH IH b n/a 26 3630 3704 3715 N
+ OW AH IH s n/a 26 3618 3704 3715 N
+ OW AH IY b n/a 26 3630 3704 3715 N
+ OW AH IY s n/a 26 3618 3704 3715 N
+ OW AH JH b n/a 26 3631 3667 3705 N
+ OW AH JH s n/a 26 3612 3667 3705 N
+ OW AH K b n/a 26 3631 3678 3716 N
+ OW AH K i n/a 26 3612 3678 3716 N
+ OW AH K s n/a 26 3612 3678 3716 N
+ OW AH L b n/a 26 3644 3695 3728 N
+ OW AH L s n/a 26 3643 3695 3727 N
+ OW AH M b n/a 26 3630 3689 3732 N
+ OW AH M s n/a 26 3612 3689 3732 N
+ OW AH N b n/a 26 3630 3687 3733 N
+ OW AH N i n/a 26 3612 3686 3730 N
+ OW AH N s n/a 26 3612 3686 3731 N
+ OW AH NG s n/a 26 3612 3686 3731 N
+ OW AH OW s n/a 26 3618 3704 3735 N
+ OW AH OY b n/a 26 3630 3704 3721 N
+ OW AH OY s n/a 26 3618 3704 3721 N
+ OW AH P b n/a 26 3631 3675 3719 N
+ OW AH P s n/a 26 3612 3675 3719 N
+ OW AH R b n/a 26 3644 3696 3736 N
+ OW AH R s n/a 26 3643 3698 3736 N
+ OW AH S b n/a 26 3631 3667 3709 N
+ OW AH S s n/a 26 3613 3667 3709 N
+ OW AH SH b n/a 26 3631 3667 3711 N
+ OW AH SH s n/a 26 3613 3667 3711 N
+ OW AH SIL s n/a 26 3612 3683 3725 N
+ OW AH T b n/a 26 3631 3667 3706 N
+ OW AH T i n/a 26 3612 3667 3706 N
+ OW AH T s n/a 26 3612 3667 3706 N
+ OW AH TH b n/a 26 3631 3667 3710 N
+ OW AH TH s n/a 26 3612 3667 3710 N
+ OW AH UH b n/a 26 3630 3704 3736 N
+ OW AH UH s n/a 26 3618 3704 3736 N
+ OW AH UW s n/a 26 3618 3704 3735 N
+ OW AH V b n/a 26 3631 3676 3720 N
+ OW AH V s n/a 26 3612 3677 3720 N
+ OW AH W b n/a 26 3630 3676 3728 N
+ OW AH W s n/a 26 3618 3677 3727 N
+ OW AH Y b n/a 26 3630 3667 3707 N
+ OW AH Y s n/a 26 3618 3667 3707 N
+ OW AH Z b n/a 26 3631 3664 3712 N
+ OW AH Z i n/a 26 3613 3665 3712 N
+ OW AH Z s n/a 26 3613 3664 3712 N
+ OW AH ZH b n/a 26 3631 3664 3712 N
+ OW AH ZH s n/a 26 3613 3664 3712 N
+ OW AO AA b n/a 26 3652 3704 3735 N
+ OW AO AA s n/a 26 3649 3704 3735 N
+ OW AO AE s n/a 26 3649 3704 3724 N
+ OW AO AH b n/a 26 3652 3704 3721 N
+ OW AO AH s n/a 26 3649 3704 3721 N
+ OW AO AO b n/a 26 3652 3704 3735 N
+ OW AO AO s n/a 26 3649 3704 3735 N
+ OW AO AW b n/a 26 3652 3704 3736 N
+ OW AO AW s n/a 26 3649 3704 3736 N
+ OW AO AY s n/a 26 3649 3704 3721 N
+ OW AO B b n/a 26 3652 3675 3718 N
+ OW AO B s n/a 26 3649 3675 3718 N
+ OW AO CH b n/a 26 3652 3671 3706 N
+ OW AO CH s n/a 26 3652 3671 3706 N
+ OW AO D b n/a 26 3652 3671 3705 N
+ OW AO D s n/a 26 3649 3671 3705 N
+ OW AO DH b n/a 26 3652 3672 3713 N
+ OW AO DH s n/a 26 3652 3672 3713 N
+ OW AO EH b n/a 26 3652 3704 3724 N
+ OW AO EH s n/a 26 3649 3704 3724 N
+ OW AO ER b n/a 26 3652 3704 3736 N
+ OW AO ER s n/a 26 3649 3704 3736 N
+ OW AO EY b n/a 26 3652 3704 3724 N
+ OW AO EY s n/a 26 3649 3704 3724 N
+ OW AO F b n/a 26 3652 3676 3717 N
+ OW AO F s n/a 26 3652 3677 3717 N
+ OW AO G b n/a 26 3652 3678 3716 N
+ OW AO G s n/a 26 3649 3678 3716 N
+ OW AO HH b n/a 26 3652 3676 3723 N
+ OW AO HH s n/a 26 3652 3677 3723 N
+ OW AO IH b n/a 26 3652 3704 3715 N
+ OW AO IH s n/a 26 3649 3704 3715 N
+ OW AO IY b n/a 26 3652 3704 3715 N
+ OW AO IY s n/a 26 3649 3704 3715 N
+ OW AO JH b n/a 26 3652 3671 3705 N
+ OW AO JH s n/a 26 3649 3671 3705 N
+ OW AO K b n/a 26 3652 3678 3716 N
+ OW AO K s n/a 26 3652 3678 3716 N
+ OW AO L b n/a 26 3638 3692 3727 N
+ OW AO L s n/a 26 3638 3692 3727 N
+ OW AO M b n/a 26 3652 3689 3732 N
+ OW AO M s n/a 26 3652 3689 3732 N
+ OW AO N b n/a 26 3652 3688 3733 N
+ OW AO N s n/a 26 3652 3686 3731 N
+ OW AO NG s n/a 26 3652 3686 3731 N
+ OW AO OW s n/a 26 3649 3704 3735 N
+ OW AO OY b n/a 26 3652 3704 3721 N
+ OW AO OY s n/a 26 3649 3704 3721 N
+ OW AO P b n/a 26 3652 3675 3719 N
+ OW AO P s n/a 26 3652 3675 3719 N
+ OW AO R b n/a 26 3643 3696 3736 N
+ OW AO R s n/a 26 3643 3698 3736 N
+ OW AO S b n/a 26 3652 3671 3709 N
+ OW AO S s n/a 26 3652 3671 3709 N
+ OW AO SH b n/a 26 3652 3671 3711 N
+ OW AO SH s n/a 26 3652 3671 3711 N
+ OW AO SIL s n/a 26 3652 3683 3725 N
+ OW AO T b n/a 26 3652 3671 3706 N
+ OW AO T s n/a 26 3652 3671 3706 N
+ OW AO TH b n/a 26 3652 3671 3710 N
+ OW AO TH s n/a 26 3652 3671 3710 N
+ OW AO UH b n/a 26 3652 3704 3736 N
+ OW AO UH s n/a 26 3649 3704 3736 N
+ OW AO UW s n/a 26 3649 3704 3735 N
+ OW AO V b n/a 26 3652 3676 3720 N
+ OW AO V s n/a 26 3649 3677 3720 N
+ OW AO W b n/a 26 3652 3676 3727 N
+ OW AO W s n/a 26 3649 3677 3727 N
+ OW AO Y b n/a 26 3652 3671 3707 N
+ OW AO Y s n/a 26 3649 3671 3707 N
+ OW AO Z b n/a 26 3652 3672 3712 N
+ OW AO Z s n/a 26 3649 3672 3712 N
+ OW AO ZH b n/a 26 3652 3672 3712 N
+ OW AO ZH s n/a 26 3649 3672 3712 N
+ OW AW AA b n/a 26 3652 3704 3735 N
+ OW AW AA s n/a 26 3649 3704 3735 N
+ OW AW AE s n/a 26 3649 3704 3724 N
+ OW AW AH b n/a 26 3652 3704 3721 N
+ OW AW AH s n/a 26 3649 3704 3721 N
+ OW AW AO b n/a 26 3652 3704 3735 N
+ OW AW AO s n/a 26 3649 3704 3735 N
+ OW AW AW b n/a 26 3652 3704 3736 N
+ OW AW AW s n/a 26 3649 3704 3736 N
+ OW AW AY s n/a 26 3649 3704 3721 N
+ OW AW B b n/a 26 3652 3675 3718 N
+ OW AW B s n/a 26 3649 3675 3718 N
+ OW AW CH b n/a 26 3652 3671 3706 N
+ OW AW CH s n/a 26 3652 3671 3706 N
+ OW AW D b n/a 26 3652 3671 3705 N
+ OW AW D s n/a 26 3649 3671 3705 N
+ OW AW DH b n/a 26 3652 3672 3713 N
+ OW AW DH s n/a 26 3652 3672 3713 N
+ OW AW EH b n/a 26 3652 3704 3724 N
+ OW AW EH s n/a 26 3649 3704 3724 N
+ OW AW ER b n/a 26 3652 3704 3736 N
+ OW AW ER s n/a 26 3649 3704 3736 N
+ OW AW EY b n/a 26 3652 3704 3724 N
+ OW AW EY s n/a 26 3649 3704 3724 N
+ OW AW F b n/a 26 3652 3676 3717 N
+ OW AW F s n/a 26 3652 3677 3717 N
+ OW AW G b n/a 26 3652 3678 3716 N
+ OW AW G s n/a 26 3649 3678 3716 N
+ OW AW HH b n/a 26 3652 3676 3723 N
+ OW AW HH s n/a 26 3652 3677 3723 N
+ OW AW IH b n/a 26 3652 3704 3715 N
+ OW AW IH s n/a 26 3649 3704 3715 N
+ OW AW IY b n/a 26 3652 3704 3715 N
+ OW AW IY s n/a 26 3649 3704 3715 N
+ OW AW JH b n/a 26 3652 3671 3705 N
+ OW AW JH s n/a 26 3649 3671 3705 N
+ OW AW K b n/a 26 3652 3678 3716 N
+ OW AW K s n/a 26 3652 3678 3716 N
+ OW AW L b n/a 26 3638 3692 3727 N
+ OW AW L i n/a 26 3638 3692 3727 N
+ OW AW L s n/a 26 3638 3692 3727 N
+ OW AW M b n/a 26 3652 3689 3732 N
+ OW AW M s n/a 26 3652 3689 3732 N
+ OW AW N b n/a 26 3652 3688 3733 N
+ OW AW N s n/a 26 3652 3686 3731 N
+ OW AW NG s n/a 26 3652 3686 3731 N
+ OW AW OW s n/a 26 3649 3704 3735 N
+ OW AW OY b n/a 26 3652 3704 3721 N
+ OW AW OY s n/a 26 3649 3704 3721 N
+ OW AW P b n/a 26 3652 3675 3719 N
+ OW AW P s n/a 26 3652 3675 3719 N
+ OW AW R b n/a 26 3643 3696 3736 N
+ OW AW R s n/a 26 3643 3698 3736 N
+ OW AW S b n/a 26 3652 3671 3709 N
+ OW AW S s n/a 26 3652 3671 3709 N
+ OW AW SH b n/a 26 3652 3671 3711 N
+ OW AW SH s n/a 26 3652 3671 3711 N
+ OW AW SIL s n/a 26 3652 3683 3725 N
+ OW AW T b n/a 26 3652 3671 3706 N
+ OW AW T i n/a 26 3651 3671 3706 N
+ OW AW T s n/a 26 3652 3671 3706 N
+ OW AW TH b n/a 26 3652 3671 3710 N
+ OW AW TH s n/a 26 3652 3671 3710 N
+ OW AW UH b n/a 26 3652 3704 3736 N
+ OW AW UH s n/a 26 3649 3704 3736 N
+ OW AW UW s n/a 26 3649 3704 3735 N
+ OW AW V b n/a 26 3652 3676 3720 N
+ OW AW V s n/a 26 3649 3677 3720 N
+ OW AW W b n/a 26 3652 3676 3727 N
+ OW AW W s n/a 26 3649 3677 3727 N
+ OW AW Y b n/a 26 3652 3671 3707 N
+ OW AW Y s n/a 26 3649 3671 3707 N
+ OW AW Z b n/a 26 3652 3672 3712 N
+ OW AW Z s n/a 26 3649 3672 3712 N
+ OW AW ZH b n/a 26 3652 3672 3712 N
+ OW AW ZH s n/a 26 3649 3672 3712 N
+ OW AY AA b n/a 26 3633 3704 3735 N
+ OW AY AA e n/a 26 3612 3702 3735 N
+ OW AY AA s n/a 26 3618 3704 3735 N
+ OW AY AE e n/a 26 3612 3702 3724 N
+ OW AY AE i n/a 26 3618 3704 3724 N
+ OW AY AE s n/a 26 3618 3704 3724 N
+ OW AY AH b n/a 26 3633 3704 3721 N
+ OW AY AH e n/a 26 3612 3702 3721 N
+ OW AY AH i n/a 26 3618 3704 3724 N
+ OW AY AH s n/a 26 3618 3704 3721 N
+ OW AY AO b n/a 26 3633 3704 3735 N
+ OW AY AO e n/a 26 3612 3702 3735 N
+ OW AY AO s n/a 26 3618 3704 3735 N
+ OW AY AW b n/a 26 3633 3704 3736 N
+ OW AY AW e n/a 26 3612 3702 3736 N
+ OW AY AW s n/a 26 3618 3704 3736 N
+ OW AY AY e n/a 26 3612 3702 3721 N
+ OW AY AY s n/a 26 3618 3704 3721 N
+ OW AY B b n/a 26 3633 3675 3718 N
+ OW AY B e n/a 26 3612 3675 3718 N
+ OW AY B i n/a 26 3612 3675 3718 N
+ OW AY B s n/a 26 3612 3675 3718 N
+ OW AY CH b n/a 26 3633 3667 3706 N
+ OW AY CH e n/a 26 3612 3667 3706 N
+ OW AY CH s n/a 26 3612 3667 3706 N
+ OW AY D b n/a 26 3633 3667 3705 N
+ OW AY D e n/a 26 3612 3667 3705 N
+ OW AY D i n/a 26 3612 3667 3705 N
+ OW AY D s n/a 26 3612 3667 3705 N
+ OW AY DH b n/a 26 3633 3664 3713 N
+ OW AY DH e n/a 26 3612 3664 3713 N
+ OW AY DH s n/a 26 3612 3664 3713 N
+ OW AY EH b n/a 26 3633 3704 3724 N
+ OW AY EH e n/a 26 3612 3702 3724 N
+ OW AY EH i n/a 26 3618 3704 3724 N
+ OW AY EH s n/a 26 3618 3704 3724 N
+ OW AY ER b n/a 26 3633 3704 3736 N
+ OW AY ER e n/a 26 3612 3702 3736 N
+ OW AY ER s n/a 26 3618 3704 3736 N
+ OW AY EY b n/a 26 3633 3704 3724 N
+ OW AY EY e n/a 26 3612 3702 3724 N
+ OW AY EY s n/a 26 3618 3704 3724 N
+ OW AY F b n/a 26 3633 3677 3717 N
+ OW AY F e n/a 26 3612 3677 3717 N
+ OW AY F i n/a 26 3612 3677 3717 N
+ OW AY F s n/a 26 3612 3677 3717 N
+ OW AY G b n/a 26 3633 3678 3716 N
+ OW AY G e n/a 26 3612 3678 3716 N
+ OW AY G i n/a 26 3612 3678 3716 N
+ OW AY G s n/a 26 3612 3678 3716 N
+ OW AY HH b n/a 26 3633 3677 3723 N
+ OW AY HH e n/a 26 3612 3677 3723 N
+ OW AY HH i n/a 26 3612 3677 3723 N
+ OW AY HH s n/a 26 3612 3677 3723 N
+ OW AY IH b n/a 26 3633 3704 3715 N
+ OW AY IH e n/a 26 3612 3702 3715 N
+ OW AY IH i n/a 26 3618 3700 3714 N
+ OW AY IH s n/a 26 3618 3704 3715 N
+ OW AY IY b n/a 26 3633 3704 3715 N
+ OW AY IY e n/a 26 3612 3702 3715 N
+ OW AY IY s n/a 26 3618 3704 3715 N
+ OW AY JH b n/a 26 3633 3667 3705 N
+ OW AY JH e n/a 26 3612 3667 3705 N
+ OW AY JH i n/a 26 3612 3667 3705 N
+ OW AY JH s n/a 26 3612 3667 3705 N
+ OW AY K b n/a 26 3633 3678 3716 N
+ OW AY K e n/a 26 3612 3678 3716 N
+ OW AY K i n/a 26 3612 3678 3716 N
+ OW AY K s n/a 26 3612 3678 3716 N
+ OW AY L b n/a 26 3644 3695 3728 N
+ OW AY L e n/a 26 3643 3698 3738 N
+ OW AY L i n/a 26 3643 3695 3727 N
+ OW AY L s n/a 26 3643 3695 3727 N
+ OW AY M b n/a 26 3633 3689 3732 N
+ OW AY M e n/a 26 3612 3689 3732 N
+ OW AY M i n/a 26 3612 3689 3732 N
+ OW AY M s n/a 26 3612 3689 3732 N
+ OW AY N b n/a 26 3633 3686 3733 N
+ OW AY N e n/a 26 3612 3686 3731 N
+ OW AY N i n/a 26 3612 3686 3730 N
+ OW AY N s n/a 26 3612 3686 3731 N
+ OW AY NG e n/a 26 3612 3686 3731 N
+ OW AY NG s n/a 26 3612 3686 3731 N
+ OW AY OW e n/a 26 3612 3702 3735 N
+ OW AY OW s n/a 26 3618 3704 3735 N
+ OW AY OY b n/a 26 3633 3704 3721 N
+ OW AY OY e n/a 26 3612 3702 3721 N
+ OW AY OY s n/a 26 3618 3704 3721 N
+ OW AY P b n/a 26 3633 3675 3719 N
+ OW AY P e n/a 26 3612 3675 3719 N
+ OW AY P i n/a 26 3612 3675 3719 N
+ OW AY P s n/a 26 3612 3675 3719 N
+ OW AY R b n/a 26 3644 3696 3736 N
+ OW AY R e n/a 26 3643 3698 3736 N
+ OW AY R s n/a 26 3643 3698 3736 N
+ OW AY S b n/a 26 3633 3667 3709 N
+ OW AY S e n/a 26 3613 3667 3709 N
+ OW AY S i n/a 26 3613 3667 3709 N
+ OW AY S s n/a 26 3613 3667 3709 N
+ OW AY SH b n/a 26 3633 3667 3711 N
+ OW AY SH e n/a 26 3613 3667 3711 N
+ OW AY SH i n/a 26 3613 3667 3711 N
+ OW AY SH s n/a 26 3613 3667 3711 N
+ OW AY SIL e n/a 26 3612 3685 3725 N
+ OW AY SIL s n/a 26 3612 3683 3725 N
+ OW AY T b n/a 26 3633 3667 3706 N
+ OW AY T e n/a 26 3612 3667 3706 N
+ OW AY T i n/a 26 3612 3667 3706 N
+ OW AY T s n/a 26 3612 3667 3706 N
+ OW AY TH b n/a 26 3633 3667 3710 N
+ OW AY TH e n/a 26 3612 3667 3710 N
+ OW AY TH i n/a 26 3612 3667 3710 N
+ OW AY TH s n/a 26 3612 3667 3710 N
+ OW AY UH b n/a 26 3633 3704 3736 N
+ OW AY UH e n/a 26 3612 3702 3736 N
+ OW AY UH s n/a 26 3618 3704 3736 N
+ OW AY UW e n/a 26 3612 3702 3735 N
+ OW AY UW s n/a 26 3618 3704 3735 N
+ OW AY V b n/a 26 3633 3677 3720 N
+ OW AY V e n/a 26 3612 3677 3720 N
+ OW AY V i n/a 26 3612 3677 3720 N
+ OW AY V s n/a 26 3612 3677 3720 N
+ OW AY W b n/a 26 3633 3677 3728 N
+ OW AY W e n/a 26 3612 3677 3737 N
+ OW AY W i n/a 26 3618 3677 3727 N
+ OW AY W s n/a 26 3618 3677 3727 N
+ OW AY Y b n/a 26 3633 3667 3707 N
+ OW AY Y e n/a 26 3612 3667 3707 N
+ OW AY Y i n/a 26 3618 3667 3707 N
+ OW AY Y s n/a 26 3618 3667 3707 N
+ OW AY Z b n/a 26 3633 3664 3712 N
+ OW AY Z e n/a 26 3613 3664 3712 N
+ OW AY Z i n/a 26 3613 3665 3712 N
+ OW AY Z s n/a 26 3613 3664 3712 N
+ OW AY ZH b n/a 26 3633 3664 3712 N
+ OW AY ZH e n/a 26 3613 3664 3712 N
+ OW AY ZH s n/a 26 3613 3664 3712 N
+ OW B AA b n/a 26 3652 3704 3735 N
+ OW B AA e n/a 26 3649 3702 3735 N
+ OW B AA s n/a 26 3649 3704 3735 N
+ OW B AE e n/a 26 3649 3702 3724 N
+ OW B AE i n/a 26 3649 3704 3724 N
+ OW B AE s n/a 26 3649 3704 3724 N
+ OW B AH b n/a 26 3652 3704 3721 N
+ OW B AH e n/a 26 3649 3702 3721 N
+ OW B AH i n/a 26 3649 3704 3724 N
+ OW B AH s n/a 26 3649 3704 3721 N
+ OW B AO b n/a 26 3652 3704 3735 N
+ OW B AO e n/a 26 3649 3702 3735 N
+ OW B AO i n/a 26 3649 3704 3735 N
+ OW B AO s n/a 26 3649 3704 3735 N
+ OW B AW b n/a 26 3652 3704 3736 N
+ OW B AW e n/a 26 3649 3702 3736 N
+ OW B AW s n/a 26 3649 3704 3736 N
+ OW B AY e n/a 26 3649 3702 3721 N
+ OW B AY i n/a 26 3649 3704 3721 N
+ OW B AY s n/a 26 3649 3704 3721 N
+ OW B B b n/a 26 3652 3675 3718 N
+ OW B B e n/a 26 3649 3676 3718 N
+ OW B B i n/a 26 3649 3676 3718 N
+ OW B B s n/a 26 3649 3676 3718 N
+ OW B CH b n/a 26 3652 3671 3706 N
+ OW B CH e n/a 26 3649 3671 3706 N
+ OW B CH i n/a 26 3651 3671 3706 N
+ OW B CH s n/a 26 3652 3671 3706 N
+ OW B D b n/a 26 3652 3671 3705 N
+ OW B D e n/a 26 3649 3671 3705 N
+ OW B D i n/a 26 3649 3671 3705 N
+ OW B D s n/a 26 3649 3671 3705 N
+ OW B DH b n/a 26 3652 3672 3713 N
+ OW B DH e n/a 26 3651 3672 3713 N
+ OW B DH i n/a 26 3651 3672 3712 N
+ OW B DH s n/a 26 3652 3672 3713 N
+ OW B EH b n/a 26 3652 3704 3724 N
+ OW B EH e n/a 26 3649 3702 3724 N
+ OW B EH s n/a 26 3649 3704 3724 N
+ OW B ER b n/a 26 3652 3704 3736 N
+ OW B ER e n/a 26 3649 3702 3736 N
+ OW B ER i n/a 26 3649 3704 3736 N
+ OW B ER s n/a 26 3649 3704 3736 N
+ OW B EY b n/a 26 3652 3704 3724 N
+ OW B EY e n/a 26 3649 3702 3724 N
+ OW B EY s n/a 26 3649 3704 3724 N
+ OW B F b n/a 26 3652 3676 3717 N
+ OW B F e n/a 26 3649 3677 3717 N
+ OW B F i n/a 26 3651 3677 3717 N
+ OW B F s n/a 26 3652 3677 3717 N
+ OW B G b n/a 26 3652 3678 3716 N
+ OW B G e n/a 26 3649 3678 3716 N
+ OW B G i n/a 26 3649 3678 3716 N
+ OW B G s n/a 26 3649 3678 3716 N
+ OW B HH b n/a 26 3652 3676 3723 N
+ OW B HH e n/a 26 3649 3677 3723 N
+ OW B HH i n/a 26 3651 3677 3723 N
+ OW B HH s n/a 26 3652 3677 3723 N
+ OW B IH b n/a 26 3652 3704 3715 N
+ OW B IH e n/a 26 3649 3702 3715 N
+ OW B IH i n/a 26 3649 3700 3714 N
+ OW B IH s n/a 26 3649 3704 3715 N
+ OW B IY b n/a 26 3652 3704 3715 N
+ OW B IY e n/a 26 3649 3702 3715 N
+ OW B IY i n/a 26 3649 3700 3715 N
+ OW B IY s n/a 26 3649 3704 3715 N
+ OW B JH b n/a 26 3652 3671 3705 N
+ OW B JH e n/a 26 3649 3671 3705 N
+ OW B JH i n/a 26 3649 3671 3705 N
+ OW B JH s n/a 26 3649 3671 3705 N
+ OW B K b n/a 26 3652 3678 3716 N
+ OW B K e n/a 26 3649 3678 3716 N
+ OW B K i n/a 26 3651 3678 3716 N
+ OW B K s n/a 26 3652 3678 3716 N
+ OW B L b n/a 26 3640 3692 3729 N
+ OW B L e n/a 26 3640 3692 3738 N
+ OW B L i n/a 26 3640 3692 3729 N
+ OW B L s n/a 26 3640 3692 3729 N
+ OW B M b n/a 26 3652 3690 3732 N
+ OW B M e n/a 26 3649 3690 3732 N
+ OW B M i n/a 26 3651 3690 3732 N
+ OW B M s n/a 26 3652 3690 3732 N
+ OW B N b n/a 26 3652 3688 3733 N
+ OW B N e n/a 26 3649 3688 3730 N
+ OW B N i n/a 26 3651 3688 3730 N
+ OW B N s n/a 26 3652 3688 3730 N
+ OW B NG e n/a 26 3649 3689 3730 N
+ OW B NG i n/a 26 3651 3689 3730 N
+ OW B NG s n/a 26 3652 3689 3730 N
+ OW B OW e n/a 26 3649 3702 3735 N
+ OW B OW i n/a 26 3649 3704 3735 N
+ OW B OW s n/a 26 3649 3704 3735 N
+ OW B OY b n/a 26 3652 3704 3721 N
+ OW B OY e n/a 26 3649 3702 3721 N
+ OW B OY s n/a 26 3649 3704 3721 N
+ OW B P b n/a 26 3652 3675 3719 N
+ OW B P e n/a 26 3649 3676 3719 N
+ OW B P i n/a 26 3651 3676 3719 N
+ OW B P s n/a 26 3652 3676 3719 N
+ OW B R b n/a 26 3643 3696 3736 N
+ OW B R e n/a 26 3646 3698 3736 N
+ OW B R i n/a 26 3646 3698 3736 N
+ OW B R s n/a 26 3646 3698 3736 N
+ OW B S b n/a 26 3652 3671 3709 N
+ OW B S e n/a 26 3649 3671 3709 N
+ OW B S i n/a 26 3651 3671 3709 N
+ OW B S s n/a 26 3652 3671 3709 N
+ OW B SH b n/a 26 3652 3671 3711 N
+ OW B SH e n/a 26 3649 3671 3711 N
+ OW B SH i n/a 26 3651 3671 3711 N
+ OW B SH s n/a 26 3652 3671 3711 N
+ OW B SIL e n/a 26 3649 3683 3725 N
+ OW B SIL s n/a 26 3652 3683 3725 N
+ OW B T b n/a 26 3652 3671 3706 N
+ OW B T e n/a 26 3649 3671 3706 N
+ OW B T i n/a 26 3651 3671 3706 N
+ OW B T s n/a 26 3652 3671 3706 N
+ OW B TH b n/a 26 3652 3671 3710 N
+ OW B TH e n/a 26 3651 3671 3710 N
+ OW B TH i n/a 26 3651 3671 3710 N
+ OW B TH s n/a 26 3652 3671 3710 N
+ OW B UH b n/a 26 3652 3704 3736 N
+ OW B UH e n/a 26 3649 3702 3736 N
+ OW B UH s n/a 26 3649 3704 3736 N
+ OW B UW e n/a 26 3649 3702 3735 N
+ OW B UW s n/a 26 3649 3704 3735 N
+ OW B V b n/a 26 3652 3676 3720 N
+ OW B V e n/a 26 3649 3677 3720 N
+ OW B V i n/a 26 3649 3677 3720 N
+ OW B V s n/a 26 3649 3677 3720 N
+ OW B W b n/a 26 3652 3676 3729 N
+ OW B W e n/a 26 3649 3677 3737 N
+ OW B W i n/a 26 3649 3677 3729 N
+ OW B W s n/a 26 3649 3677 3729 N
+ OW B Y b n/a 26 3652 3671 3707 N
+ OW B Y e n/a 26 3649 3671 3707 N
+ OW B Y i n/a 26 3649 3671 3707 N
+ OW B Y s n/a 26 3649 3671 3707 N
+ OW B Z b n/a 26 3652 3672 3712 N
+ OW B Z e n/a 26 3649 3672 3712 N
+ OW B Z i n/a 26 3649 3672 3712 N
+ OW B Z s n/a 26 3649 3672 3712 N
+ OW B ZH b n/a 26 3652 3672 3712 N
+ OW B ZH e n/a 26 3649 3672 3712 N
+ OW B ZH s n/a 26 3649 3672 3712 N
+ OW CH AA b n/a 26 3630 3704 3735 N
+ OW CH AA e n/a 26 3627 3702 3735 N
+ OW CH AA s n/a 26 3630 3704 3735 N
+ OW CH AE e n/a 26 3627 3702 3724 N
+ OW CH AE s n/a 26 3630 3704 3724 N
+ OW CH AH b n/a 26 3630 3704 3721 N
+ OW CH AH e n/a 26 3627 3702 3721 N
+ OW CH AH i n/a 26 3627 3704 3724 N
+ OW CH AH s n/a 26 3630 3704 3721 N
+ OW CH AO b n/a 26 3630 3704 3735 N
+ OW CH AO e n/a 26 3627 3702 3735 N
+ OW CH AO s n/a 26 3630 3704 3735 N
+ OW CH AW b n/a 26 3630 3704 3736 N
+ OW CH AW e n/a 26 3627 3702 3736 N
+ OW CH AW s n/a 26 3630 3704 3736 N
+ OW CH AY e n/a 26 3627 3702 3721 N
+ OW CH AY s n/a 26 3630 3704 3721 N
+ OW CH B b n/a 26 3631 3675 3718 N
+ OW CH B e n/a 26 3627 3675 3718 N
+ OW CH B i n/a 26 3627 3675 3718 N
+ OW CH B s n/a 26 3631 3675 3718 N
+ OW CH CH b n/a 26 3631 3667 3706 N
+ OW CH CH e n/a 26 3627 3667 3706 N
+ OW CH CH i n/a 26 3627 3667 3706 N
+ OW CH CH s n/a 26 3631 3667 3706 N
+ OW CH D b n/a 26 3631 3667 3705 N
+ OW CH D e n/a 26 3627 3667 3705 N
+ OW CH D i n/a 26 3627 3667 3705 N
+ OW CH D s n/a 26 3631 3667 3705 N
+ OW CH DH b n/a 26 3631 3664 3713 N
+ OW CH DH e n/a 26 3627 3664 3713 N
+ OW CH DH s n/a 26 3631 3664 3713 N
+ OW CH EH b n/a 26 3630 3704 3724 N
+ OW CH EH e n/a 26 3627 3702 3724 N
+ OW CH EH s n/a 26 3630 3704 3724 N
+ OW CH ER b n/a 26 3630 3704 3736 N
+ OW CH ER e n/a 26 3627 3702 3736 N
+ OW CH ER s n/a 26 3630 3704 3736 N
+ OW CH EY b n/a 26 3630 3704 3724 N
+ OW CH EY e n/a 26 3627 3702 3724 N
+ OW CH EY s n/a 26 3630 3704 3724 N
+ OW CH F b n/a 26 3631 3676 3717 N
+ OW CH F e n/a 26 3627 3677 3717 N
+ OW CH F s n/a 26 3631 3677 3717 N
+ OW CH G b n/a 26 3631 3678 3716 N
+ OW CH G e n/a 26 3627 3678 3716 N
+ OW CH G s n/a 26 3631 3678 3716 N
+ OW CH HH b n/a 26 3630 3676 3723 N
+ OW CH HH e n/a 26 3627 3677 3723 N
+ OW CH HH s n/a 26 3630 3677 3723 N
+ OW CH IH b n/a 26 3630 3704 3715 N
+ OW CH IH e n/a 26 3627 3702 3715 N
+ OW CH IH s n/a 26 3630 3704 3715 N
+ OW CH IY b n/a 26 3630 3704 3715 N
+ OW CH IY e n/a 26 3627 3702 3715 N
+ OW CH IY s n/a 26 3630 3704 3715 N
+ OW CH JH b n/a 26 3631 3667 3705 N
+ OW CH JH e n/a 26 3627 3667 3705 N
+ OW CH JH s n/a 26 3631 3667 3705 N
+ OW CH K b n/a 26 3631 3678 3716 N
+ OW CH K e n/a 26 3627 3678 3716 N
+ OW CH K i n/a 26 3627 3678 3716 N
+ OW CH K s n/a 26 3631 3678 3716 N
+ OW CH L b n/a 26 3643 3689 3728 N
+ OW CH L e n/a 26 3643 3687 3738 N
+ OW CH L i n/a 26 3643 3687 3727 N
+ OW CH L s n/a 26 3643 3687 3727 N
+ OW CH M b n/a 26 3630 3689 3732 N
+ OW CH M e n/a 26 3627 3689 3732 N
+ OW CH M i n/a 26 3627 3689 3732 N
+ OW CH M s n/a 26 3630 3689 3732 N
+ OW CH N b n/a 26 3630 3688 3733 N
+ OW CH N e n/a 26 3627 3686 3731 N
+ OW CH N i n/a 26 3627 3686 3730 N
+ OW CH N s n/a 26 3630 3686 3731 N
+ OW CH NG e n/a 26 3627 3686 3731 N
+ OW CH NG s n/a 26 3630 3686 3731 N
+ OW CH OW e n/a 26 3627 3702 3735 N
+ OW CH OW s n/a 26 3630 3704 3735 N
+ OW CH OY b n/a 26 3630 3704 3721 N
+ OW CH OY e n/a 26 3627 3702 3721 N
+ OW CH OY s n/a 26 3630 3704 3721 N
+ OW CH P b n/a 26 3631 3675 3719 N
+ OW CH P e n/a 26 3627 3675 3719 N
+ OW CH P i n/a 26 3627 3675 3719 N
+ OW CH P s n/a 26 3631 3675 3719 N
+ OW CH R b n/a 26 3643 3696 3736 N
+ OW CH R e n/a 26 3643 3698 3736 N
+ OW CH R s n/a 26 3643 3698 3736 N
+ OW CH S b n/a 26 3631 3667 3709 N
+ OW CH S e n/a 26 3627 3667 3709 N
+ OW CH S i n/a 26 3627 3667 3709 N
+ OW CH S s n/a 26 3631 3667 3709 N
+ OW CH SH b n/a 26 3631 3667 3711 N
+ OW CH SH e n/a 26 3627 3667 3711 N
+ OW CH SH s n/a 26 3631 3667 3711 N
+ OW CH SIL e n/a 26 3629 3685 3725 N
+ OW CH SIL s n/a 26 3630 3683 3725 N
+ OW CH T b n/a 26 3631 3667 3706 N
+ OW CH T e n/a 26 3627 3667 3706 N
+ OW CH T i n/a 26 3627 3667 3706 N
+ OW CH T s n/a 26 3631 3667 3706 N
+ OW CH TH b n/a 26 3631 3667 3710 N
+ OW CH TH e n/a 26 3627 3667 3710 N
+ OW CH TH s n/a 26 3631 3667 3710 N
+ OW CH UH b n/a 26 3630 3704 3736 N
+ OW CH UH e n/a 26 3627 3702 3736 N
+ OW CH UH s n/a 26 3630 3704 3736 N
+ OW CH UW e n/a 26 3627 3702 3735 N
+ OW CH UW s n/a 26 3630 3704 3735 N
+ OW CH V b n/a 26 3631 3676 3720 N
+ OW CH V e n/a 26 3627 3677 3720 N
+ OW CH V i n/a 26 3627 3677 3720 N
+ OW CH V s n/a 26 3631 3677 3720 N
+ OW CH W b n/a 26 3630 3676 3728 N
+ OW CH W e n/a 26 3627 3677 3737 N
+ OW CH W s n/a 26 3630 3677 3727 N
+ OW CH Y b n/a 26 3630 3667 3707 N
+ OW CH Y e n/a 26 3627 3667 3707 N
+ OW CH Y s n/a 26 3630 3667 3707 N
+ OW CH Z b n/a 26 3631 3664 3712 N
+ OW CH Z e n/a 26 3627 3664 3712 N
+ OW CH Z i n/a 26 3627 3665 3712 N
+ OW CH Z s n/a 26 3631 3664 3712 N
+ OW CH ZH b n/a 26 3631 3664 3712 N
+ OW CH ZH e n/a 26 3627 3664 3712 N
+ OW CH ZH s n/a 26 3631 3664 3712 N
+ OW D AA b n/a 26 3630 3702 3735 N
+ OW D AA e n/a 26 3612 3702 3735 N
+ OW D AA s n/a 26 3618 3702 3735 N
+ OW D AE e n/a 26 3612 3702 3724 N
+ OW D AE s n/a 26 3618 3702 3724 N
+ OW D AH b n/a 26 3630 3702 3721 N
+ OW D AH e n/a 26 3612 3702 3721 N
+ OW D AH i n/a 26 3618 3702 3724 N
+ OW D AH s n/a 26 3618 3702 3721 N
+ OW D AO b n/a 26 3630 3702 3735 N
+ OW D AO e n/a 26 3612 3702 3735 N
+ OW D AO s n/a 26 3618 3702 3735 N
+ OW D AW b n/a 26 3630 3702 3736 N
+ OW D AW e n/a 26 3612 3702 3736 N
+ OW D AW s n/a 26 3618 3702 3736 N
+ OW D AY e n/a 26 3612 3702 3721 N
+ OW D AY s n/a 26 3618 3702 3721 N
+ OW D B b n/a 26 3631 3675 3718 N
+ OW D B e n/a 26 3612 3681 3718 N
+ OW D B i n/a 26 3612 3681 3718 N
+ OW D B s n/a 26 3612 3681 3718 N
+ OW D CH b n/a 26 3631 3682 3705 N
+ OW D CH e n/a 26 3612 3682 3705 N
+ OW D CH i n/a 26 3612 3682 3705 N
+ OW D CH s n/a 26 3612 3682 3705 N
+ OW D D b n/a 26 3631 3667 3705 N
+ OW D D e n/a 26 3613 3667 3705 N
+ OW D D i n/a 26 3613 3667 3705 N
+ OW D D s n/a 26 3613 3667 3705 N
+ OW D DH b n/a 26 3631 3664 3713 N
+ OW D DH e n/a 26 3613 3664 3713 N
+ OW D DH s n/a 26 3613 3664 3713 N
+ OW D EH b n/a 26 3630 3702 3724 N
+ OW D EH e n/a 26 3612 3702 3724 N
+ OW D EH s n/a 26 3618 3702 3724 N
+ OW D ER b n/a 26 3630 3702 3736 N
+ OW D ER e n/a 26 3612 3702 3736 N
+ OW D ER i n/a 26 3618 3702 3736 N
+ OW D ER s n/a 26 3618 3702 3736 N
+ OW D EY b n/a 26 3630 3702 3724 N
+ OW D EY e n/a 26 3612 3702 3724 N
+ OW D EY s n/a 26 3618 3702 3724 N
+ OW D F b n/a 26 3631 3677 3717 N
+ OW D F e n/a 26 3612 3681 3717 N
+ OW D F i n/a 26 3612 3681 3717 N
+ OW D F s n/a 26 3612 3681 3717 N
+ OW D G b n/a 26 3631 3678 3716 N
+ OW D G e n/a 26 3612 3681 3716 N
+ OW D G i n/a 26 3612 3681 3716 N
+ OW D G s n/a 26 3612 3681 3716 N
+ OW D HH b n/a 26 3630 3677 3723 N
+ OW D HH e n/a 26 3612 3682 3723 N
+ OW D HH i n/a 26 3612 3682 3723 N
+ OW D HH s n/a 26 3612 3682 3723 N
+ OW D IH b n/a 26 3630 3702 3715 N
+ OW D IH e n/a 26 3612 3702 3715 N
+ OW D IH i n/a 26 3618 3700 3714 N
+ OW D IH s n/a 26 3618 3702 3715 N
+ OW D IY b n/a 26 3630 3702 3715 N
+ OW D IY e n/a 26 3612 3702 3715 N
+ OW D IY i n/a 26 3618 3700 3715 N
+ OW D IY s n/a 26 3618 3702 3715 N
+ OW D JH b n/a 26 3631 3682 3705 N
+ OW D JH e n/a 26 3612 3682 3705 N
+ OW D JH i n/a 26 3612 3682 3705 N
+ OW D JH s n/a 26 3612 3682 3705 N
+ OW D K b n/a 26 3631 3678 3716 N
+ OW D K e n/a 26 3612 3681 3716 N
+ OW D K i n/a 26 3612 3681 3716 N
+ OW D K s n/a 26 3612 3681 3716 N
+ OW D L b n/a 26 3630 3695 3728 N
+ OW D L e n/a 26 3612 3698 3738 N
+ OW D L i n/a 26 3617 3695 3727 N
+ OW D L s n/a 26 3618 3695 3727 N
+ OW D M b n/a 26 3630 3696 3732 N
+ OW D M e n/a 26 3622 3698 3732 N
+ OW D M i n/a 26 3622 3698 3732 N
+ OW D M s n/a 26 3622 3698 3732 N
+ OW D N b n/a 26 3630 3696 3733 N
+ OW D N e n/a 26 3622 3699 3731 N
+ OW D N i n/a 26 3622 3699 3731 N
+ OW D N s n/a 26 3622 3699 3731 N
+ OW D NG e n/a 26 3622 3698 3731 N
+ OW D NG i n/a 26 3622 3698 3731 N
+ OW D NG s n/a 26 3622 3698 3731 N
+ OW D OW e n/a 26 3612 3702 3735 N
+ OW D OW s n/a 26 3618 3702 3735 N
+ OW D OY b n/a 26 3630 3702 3721 N
+ OW D OY e n/a 26 3612 3702 3721 N
+ OW D OY s n/a 26 3618 3702 3721 N
+ OW D P b n/a 26 3631 3675 3719 N
+ OW D P e n/a 26 3612 3681 3719 N
+ OW D P i n/a 26 3612 3681 3719 N
+ OW D P s n/a 26 3612 3681 3719 N
+ OW D R b n/a 26 3630 3696 3736 N
+ OW D R e n/a 26 3612 3698 3736 N
+ OW D R s n/a 26 3618 3698 3736 N
+ OW D S b n/a 26 3631 3667 3709 N
+ OW D S e n/a 26 3613 3667 3709 N
+ OW D S i n/a 26 3613 3667 3709 N
+ OW D S s n/a 26 3613 3667 3709 N
+ OW D SH b n/a 26 3631 3682 3711 N
+ OW D SH e n/a 26 3612 3682 3711 N
+ OW D SH i n/a 26 3612 3682 3711 N
+ OW D SH s n/a 26 3612 3682 3711 N
+ OW D SIL e n/a 26 3613 3685 3725 N
+ OW D SIL s n/a 26 3613 3683 3725 N
+ OW D T b n/a 26 3631 3667 3705 N
+ OW D T e n/a 26 3613 3667 3705 N
+ OW D T i n/a 26 3613 3667 3705 N
+ OW D T s n/a 26 3613 3667 3705 N
+ OW D TH b n/a 26 3631 3667 3710 N
+ OW D TH e n/a 26 3613 3667 3710 N
+ OW D TH i n/a 26 3613 3667 3710 N
+ OW D TH s n/a 26 3613 3667 3710 N
+ OW D UH b n/a 26 3630 3702 3736 N
+ OW D UH e n/a 26 3612 3702 3736 N
+ OW D UH s n/a 26 3618 3702 3736 N
+ OW D UW e n/a 26 3612 3702 3735 N
+ OW D UW s n/a 26 3618 3702 3735 N
+ OW D V b n/a 26 3631 3677 3720 N
+ OW D V e n/a 26 3612 3682 3720 N
+ OW D V i n/a 26 3612 3682 3720 N
+ OW D V s n/a 26 3612 3682 3720 N
+ OW D W b n/a 26 3630 3677 3728 N
+ OW D W e n/a 26 3612 3680 3737 N
+ OW D W s n/a 26 3618 3680 3727 N
+ OW D Y b n/a 26 3630 3682 3707 N
+ OW D Y e n/a 26 3612 3682 3707 N
+ OW D Y i n/a 26 3618 3682 3707 N
+ OW D Y s n/a 26 3618 3682 3707 N
+ OW D Z b n/a 26 3631 3664 3712 N
+ OW D Z e n/a 26 3613 3664 3712 N
+ OW D Z i n/a 26 3613 3665 3712 N
+ OW D Z s n/a 26 3613 3664 3712 N
+ OW D ZH b n/a 26 3631 3682 3712 N
+ OW D ZH e n/a 26 3612 3682 3712 N
+ OW D ZH s n/a 26 3612 3682 3712 N
+ OW DH AA b n/a 26 3630 3702 3735 N
+ OW DH AA e n/a 26 3615 3702 3735 N
+ OW DH AA s n/a 26 3618 3702 3735 N
+ OW DH AE e n/a 26 3615 3702 3724 N
+ OW DH AE i n/a 26 3618 3702 3724 N
+ OW DH AE s n/a 26 3618 3702 3724 N
+ OW DH AH b n/a 26 3630 3702 3721 N
+ OW DH AH e n/a 26 3615 3702 3721 N
+ OW DH AH s n/a 26 3618 3702 3721 N
+ OW DH AO b n/a 26 3630 3702 3735 N
+ OW DH AO e n/a 26 3615 3702 3735 N
+ OW DH AO s n/a 26 3618 3702 3735 N
+ OW DH AW b n/a 26 3630 3702 3736 N
+ OW DH AW e n/a 26 3615 3702 3736 N
+ OW DH AW s n/a 26 3618 3702 3736 N
+ OW DH AY e n/a 26 3615 3702 3721 N
+ OW DH AY s n/a 26 3618 3702 3721 N
+ OW DH B b n/a 26 3631 3675 3718 N
+ OW DH B e n/a 26 3615 3681 3718 N
+ OW DH B s n/a 26 3615 3681 3718 N
+ OW DH CH b n/a 26 3631 3682 3706 N
+ OW DH CH e n/a 26 3615 3682 3706 N
+ OW DH CH s n/a 26 3615 3682 3706 N
+ OW DH D b n/a 26 3631 3667 3705 N
+ OW DH D e n/a 26 3615 3667 3705 N
+ OW DH D s n/a 26 3615 3667 3705 N
+ OW DH DH b n/a 26 3631 3665 3713 N
+ OW DH DH e n/a 26 3615 3665 3713 N
+ OW DH DH s n/a 26 3615 3665 3713 N
+ OW DH EH b n/a 26 3630 3702 3724 N
+ OW DH EH e n/a 26 3615 3702 3724 N
+ OW DH EH s n/a 26 3618 3702 3724 N
+ OW DH ER b n/a 26 3630 3702 3736 N
+ OW DH ER e n/a 26 3615 3702 3736 N
+ OW DH ER s n/a 26 3618 3702 3736 N
+ OW DH EY b n/a 26 3630 3702 3724 N
+ OW DH EY e n/a 26 3615 3702 3724 N
+ OW DH EY s n/a 26 3618 3702 3724 N
+ OW DH F b n/a 26 3631 3677 3717 N
+ OW DH F e n/a 26 3615 3681 3717 N
+ OW DH F s n/a 26 3615 3681 3717 N
+ OW DH G b n/a 26 3631 3678 3716 N
+ OW DH G e n/a 26 3615 3681 3716 N
+ OW DH G s n/a 26 3615 3681 3716 N
+ OW DH HH b n/a 26 3630 3677 3723 N
+ OW DH HH e n/a 26 3615 3682 3723 N
+ OW DH HH s n/a 26 3615 3682 3723 N
+ OW DH IH b n/a 26 3630 3702 3715 N
+ OW DH IH e n/a 26 3615 3702 3715 N
+ OW DH IH s n/a 26 3618 3702 3715 N
+ OW DH IY b n/a 26 3630 3702 3715 N
+ OW DH IY e n/a 26 3615 3702 3715 N
+ OW DH IY s n/a 26 3618 3702 3715 N
+ OW DH JH b n/a 26 3631 3682 3705 N
+ OW DH JH e n/a 26 3615 3682 3705 N
+ OW DH JH s n/a 26 3615 3682 3705 N
+ OW DH K b n/a 26 3631 3678 3716 N
+ OW DH K e n/a 26 3615 3681 3716 N
+ OW DH K s n/a 26 3615 3681 3716 N
+ OW DH L b n/a 26 3630 3692 3728 N
+ OW DH L e n/a 26 3615 3692 3738 N
+ OW DH L s n/a 26 3618 3692 3727 N
+ OW DH M b n/a 26 3630 3696 3732 N
+ OW DH M e n/a 26 3615 3698 3732 N
+ OW DH M i n/a 26 3615 3698 3732 N
+ OW DH M s n/a 26 3615 3698 3732 N
+ OW DH N b n/a 26 3630 3696 3733 N
+ OW DH N e n/a 26 3615 3697 3731 N
+ OW DH N s n/a 26 3615 3697 3731 N
+ OW DH NG e n/a 26 3615 3698 3731 N
+ OW DH NG s n/a 26 3615 3698 3731 N
+ OW DH OW e n/a 26 3615 3702 3735 N
+ OW DH OW s n/a 26 3618 3702 3735 N
+ OW DH OY b n/a 26 3630 3702 3721 N
+ OW DH OY e n/a 26 3615 3702 3721 N
+ OW DH OY s n/a 26 3618 3702 3721 N
+ OW DH P b n/a 26 3631 3675 3719 N
+ OW DH P e n/a 26 3615 3681 3719 N
+ OW DH P s n/a 26 3615 3681 3719 N
+ OW DH R b n/a 26 3630 3696 3736 N
+ OW DH R e n/a 26 3615 3698 3736 N
+ OW DH R s n/a 26 3618 3698 3736 N
+ OW DH S b n/a 26 3631 3667 3709 N
+ OW DH S e n/a 26 3615 3667 3709 N
+ OW DH S s n/a 26 3615 3667 3709 N
+ OW DH SH b n/a 26 3631 3682 3711 N
+ OW DH SH e n/a 26 3615 3682 3711 N
+ OW DH SH s n/a 26 3615 3682 3711 N
+ OW DH SIL e n/a 26 3615 3685 3725 N
+ OW DH SIL s n/a 26 3615 3683 3725 N
+ OW DH T b n/a 26 3631 3667 3706 N
+ OW DH T e n/a 26 3615 3667 3706 N
+ OW DH T i n/a 26 3615 3667 3706 N
+ OW DH T s n/a 26 3615 3667 3706 N
+ OW DH TH b n/a 26 3631 3667 3710 N
+ OW DH TH e n/a 26 3615 3667 3710 N
+ OW DH TH s n/a 26 3615 3667 3710 N
+ OW DH UH b n/a 26 3630 3702 3736 N
+ OW DH UH e n/a 26 3615 3702 3736 N
+ OW DH UH s n/a 26 3618 3702 3736 N
+ OW DH UW e n/a 26 3615 3702 3735 N
+ OW DH UW s n/a 26 3618 3702 3735 N
+ OW DH V b n/a 26 3631 3677 3720 N
+ OW DH V e n/a 26 3615 3682 3720 N
+ OW DH V s n/a 26 3615 3682 3720 N
+ OW DH W b n/a 26 3630 3677 3728 N
+ OW DH W e n/a 26 3615 3680 3737 N
+ OW DH W s n/a 26 3618 3680 3727 N
+ OW DH Y b n/a 26 3630 3682 3707 N
+ OW DH Y e n/a 26 3615 3682 3707 N
+ OW DH Y s n/a 26 3618 3682 3707 N
+ OW DH Z b n/a 26 3631 3665 3712 N
+ OW DH Z e n/a 26 3615 3665 3712 N
+ OW DH Z i n/a 26 3615 3665 3712 N
+ OW DH Z s n/a 26 3615 3665 3712 N
+ OW DH ZH b n/a 26 3631 3682 3712 N
+ OW DH ZH e n/a 26 3615 3682 3712 N
+ OW DH ZH s n/a 26 3615 3682 3712 N
+ OW EH AA b n/a 26 3630 3704 3735 N
+ OW EH AA s n/a 26 3618 3704 3735 N
+ OW EH AE s n/a 26 3618 3704 3724 N
+ OW EH AH b n/a 26 3630 3704 3721 N
+ OW EH AH s n/a 26 3618 3704 3721 N
+ OW EH AO b n/a 26 3630 3704 3735 N
+ OW EH AO s n/a 26 3618 3704 3735 N
+ OW EH AW b n/a 26 3630 3704 3736 N
+ OW EH AW s n/a 26 3618 3704 3736 N
+ OW EH AY s n/a 26 3618 3704 3721 N
+ OW EH B b n/a 26 3631 3675 3718 N
+ OW EH B i n/a 26 3612 3675 3718 N
+ OW EH B s n/a 26 3612 3675 3718 N
+ OW EH CH b n/a 26 3631 3667 3706 N
+ OW EH CH s n/a 26 3612 3667 3706 N
+ OW EH D b n/a 26 3631 3667 3705 N
+ OW EH D i n/a 26 3612 3667 3705 N
+ OW EH D s n/a 26 3612 3667 3705 N
+ OW EH DH b n/a 26 3631 3664 3713 N
+ OW EH DH s n/a 26 3612 3664 3713 N
+ OW EH EH b n/a 26 3630 3704 3724 N
+ OW EH EH s n/a 26 3618 3704 3724 N
+ OW EH ER b n/a 26 3630 3704 3736 N
+ OW EH ER s n/a 26 3618 3704 3736 N
+ OW EH EY b n/a 26 3630 3704 3724 N
+ OW EH EY s n/a 26 3618 3704 3724 N
+ OW EH F b n/a 26 3631 3676 3717 N
+ OW EH F s n/a 26 3612 3677 3717 N
+ OW EH G b n/a 26 3631 3678 3716 N
+ OW EH G s n/a 26 3612 3678 3716 N
+ OW EH HH b n/a 26 3630 3676 3723 N
+ OW EH HH s n/a 26 3612 3677 3723 N
+ OW EH IH b n/a 26 3630 3704 3715 N
+ OW EH IH s n/a 26 3618 3704 3715 N
+ OW EH IY b n/a 26 3630 3704 3715 N
+ OW EH IY s n/a 26 3618 3704 3715 N
+ OW EH JH b n/a 26 3631 3667 3705 N
+ OW EH JH s n/a 26 3612 3667 3705 N
+ OW EH K b n/a 26 3631 3678 3716 N
+ OW EH K s n/a 26 3612 3678 3716 N
+ OW EH L b n/a 26 3644 3695 3728 N
+ OW EH L s n/a 26 3643 3695 3727 N
+ OW EH M b n/a 26 3630 3689 3732 N
+ OW EH M s n/a 26 3612 3689 3732 N
+ OW EH N b n/a 26 3630 3687 3733 N
+ OW EH N i n/a 26 3612 3686 3730 N
+ OW EH N s n/a 26 3612 3686 3731 N
+ OW EH NG s n/a 26 3612 3686 3731 N
+ OW EH OW s n/a 26 3618 3704 3735 N
+ OW EH OY b n/a 26 3630 3704 3721 N
+ OW EH OY s n/a 26 3618 3704 3721 N
+ OW EH P b n/a 26 3631 3675 3719 N
+ OW EH P s n/a 26 3612 3675 3719 N
+ OW EH R b n/a 26 3644 3696 3736 N
+ OW EH R s n/a 26 3643 3698 3736 N
+ OW EH S b n/a 26 3631 3667 3709 N
+ OW EH S s n/a 26 3613 3667 3709 N
+ OW EH SH b n/a 26 3631 3667 3711 N
+ OW EH SH s n/a 26 3613 3667 3711 N
+ OW EH SIL s n/a 26 3612 3683 3725 N
+ OW EH T b n/a 26 3631 3667 3706 N
+ OW EH T s n/a 26 3612 3667 3706 N
+ OW EH TH b n/a 26 3631 3667 3710 N
+ OW EH TH s n/a 26 3612 3667 3710 N
+ OW EH UH b n/a 26 3630 3704 3736 N
+ OW EH UH s n/a 26 3618 3704 3736 N
+ OW EH UW s n/a 26 3618 3704 3735 N
+ OW EH V b n/a 26 3631 3676 3720 N
+ OW EH V s n/a 26 3612 3677 3720 N
+ OW EH W b n/a 26 3630 3676 3728 N
+ OW EH W s n/a 26 3618 3677 3727 N
+ OW EH Y b n/a 26 3630 3667 3707 N
+ OW EH Y s n/a 26 3618 3667 3707 N
+ OW EH Z b n/a 26 3631 3664 3712 N
+ OW EH Z s n/a 26 3613 3664 3712 N
+ OW EH ZH b n/a 26 3631 3664 3712 N
+ OW EH ZH s n/a 26 3613 3664 3712 N
+ OW ER AA b n/a 26 3663 3704 3735 N
+ OW ER AA e n/a 26 3661 3704 3735 N
+ OW ER AA s n/a 26 3661 3704 3735 N
+ OW ER AE e n/a 26 3661 3704 3724 N
+ OW ER AE s n/a 26 3661 3704 3724 N
+ OW ER AH b n/a 26 3663 3704 3721 N
+ OW ER AH e n/a 26 3661 3704 3721 N
+ OW ER AH i n/a 26 3661 3704 3724 N
+ OW ER AH s n/a 26 3661 3704 3721 N
+ OW ER AO b n/a 26 3663 3704 3735 N
+ OW ER AO e n/a 26 3661 3704 3735 N
+ OW ER AO s n/a 26 3661 3704 3735 N
+ OW ER AW b n/a 26 3663 3704 3736 N
+ OW ER AW e n/a 26 3661 3704 3736 N
+ OW ER AW s n/a 26 3661 3704 3736 N
+ OW ER AY e n/a 26 3661 3704 3721 N
+ OW ER AY s n/a 26 3661 3704 3721 N
+ OW ER B b n/a 26 3663 3678 3718 N
+ OW ER B e n/a 26 3661 3678 3718 N
+ OW ER B i n/a 26 3661 3678 3718 N
+ OW ER B s n/a 26 3661 3678 3718 N
+ OW ER CH b n/a 26 3663 3670 3706 N
+ OW ER CH e n/a 26 3660 3670 3706 N
+ OW ER CH i n/a 26 3660 3670 3706 N
+ OW ER CH s n/a 26 3660 3670 3706 N
+ OW ER D b n/a 26 3663 3666 3705 N
+ OW ER D e n/a 26 3659 3666 3705 N
+ OW ER D i n/a 26 3659 3666 3705 N
+ OW ER D s n/a 26 3659 3666 3705 N
+ OW ER DH b n/a 26 3663 3666 3713 N
+ OW ER DH e n/a 26 3659 3666 3713 N
+ OW ER DH s n/a 26 3659 3666 3713 N
+ OW ER EH b n/a 26 3663 3704 3724 N
+ OW ER EH e n/a 26 3661 3704 3724 N
+ OW ER EH s n/a 26 3661 3704 3724 N
+ OW ER ER b n/a 26 3663 3704 3736 N
+ OW ER ER e n/a 26 3661 3704 3736 N
+ OW ER ER i n/a 26 3661 3704 3736 N
+ OW ER ER s n/a 26 3661 3704 3736 N
+ OW ER EY b n/a 26 3663 3704 3724 N
+ OW ER EY e n/a 26 3661 3704 3724 N
+ OW ER EY s n/a 26 3661 3704 3724 N
+ OW ER F b n/a 26 3663 3679 3717 N
+ OW ER F e n/a 26 3661 3679 3717 N
+ OW ER F i n/a 26 3660 3679 3717 N
+ OW ER F s n/a 26 3660 3679 3717 N
+ OW ER G b n/a 26 3663 3679 3716 N
+ OW ER G e n/a 26 3660 3679 3716 N
+ OW ER G i n/a 26 3660 3679 3716 N
+ OW ER G s n/a 26 3660 3679 3716 N
+ OW ER HH b n/a 26 3663 3679 3723 N
+ OW ER HH e n/a 26 3661 3679 3723 N
+ OW ER HH i n/a 26 3660 3679 3723 N
+ OW ER HH s n/a 26 3660 3679 3723 N
+ OW ER IH b n/a 26 3663 3704 3715 N
+ OW ER IH e n/a 26 3661 3704 3715 N
+ OW ER IH i n/a 26 3661 3700 3714 N
+ OW ER IH s n/a 26 3661 3704 3715 N
+ OW ER IY b n/a 26 3663 3704 3715 N
+ OW ER IY e n/a 26 3661 3704 3715 N
+ OW ER IY s n/a 26 3661 3704 3715 N
+ OW ER JH b n/a 26 3663 3666 3705 N
+ OW ER JH e n/a 26 3660 3666 3705 N
+ OW ER JH s n/a 26 3660 3666 3705 N
+ OW ER K b n/a 26 3663 3679 3716 N
+ OW ER K e n/a 26 3661 3679 3716 N
+ OW ER K i n/a 26 3660 3679 3716 N
+ OW ER K s n/a 26 3660 3679 3716 N
+ OW ER L b n/a 26 3663 3694 3727 N
+ OW ER L e n/a 26 3663 3693 3738 N
+ OW ER L i n/a 26 3663 3693 3727 N
+ OW ER L s n/a 26 3663 3693 3727 N
+ OW ER M b n/a 26 3663 3689 3732 N
+ OW ER M e n/a 26 3661 3689 3732 N
+ OW ER M i n/a 26 3661 3689 3732 N
+ OW ER M s n/a 26 3661 3689 3732 N
+ OW ER N b n/a 26 3663 3688 3733 N
+ OW ER N e n/a 26 3661 3686 3731 N
+ OW ER N i n/a 26 3661 3686 3730 N
+ OW ER N s n/a 26 3661 3686 3731 N
+ OW ER NG e n/a 26 3661 3686 3731 N
+ OW ER NG s n/a 26 3661 3686 3731 N
+ OW ER OW e n/a 26 3661 3704 3735 N
+ OW ER OW s n/a 26 3661 3704 3735 N
+ OW ER OY b n/a 26 3663 3704 3721 N
+ OW ER OY e n/a 26 3661 3704 3721 N
+ OW ER OY s n/a 26 3661 3704 3721 N
+ OW ER P b n/a 26 3663 3679 3719 N
+ OW ER P e n/a 26 3661 3679 3719 N
+ OW ER P i n/a 26 3660 3679 3719 N
+ OW ER P s n/a 26 3660 3679 3719 N
+ OW ER R b n/a 26 3663 3696 3736 N
+ OW ER R e n/a 26 3663 3698 3736 N
+ OW ER R s n/a 26 3663 3698 3736 N
+ OW ER S b n/a 26 3663 3670 3709 N
+ OW ER S e n/a 26 3660 3670 3709 N
+ OW ER S i n/a 26 3660 3670 3709 N
+ OW ER S s n/a 26 3660 3670 3709 N
+ OW ER SH b n/a 26 3663 3670 3711 N
+ OW ER SH e n/a 26 3660 3670 3711 N
+ OW ER SH i n/a 26 3660 3670 3711 N
+ OW ER SH s n/a 26 3660 3670 3711 N
+ OW ER SIL e n/a 26 3659 3683 3725 N
+ OW ER SIL s n/a 26 3659 3683 3725 N
+ OW ER T b n/a 26 3663 3670 3706 N
+ OW ER T e n/a 26 3660 3670 3706 N
+ OW ER T i n/a 26 3660 3670 3706 N
+ OW ER T s n/a 26 3660 3670 3706 N
+ OW ER TH b n/a 26 3663 3670 3710 N
+ OW ER TH e n/a 26 3660 3670 3710 N
+ OW ER TH s n/a 26 3660 3670 3710 N
+ OW ER UH b n/a 26 3663 3704 3736 N
+ OW ER UH e n/a 26 3661 3704 3736 N
+ OW ER UH s n/a 26 3661 3704 3736 N
+ OW ER UW e n/a 26 3661 3704 3735 N
+ OW ER UW s n/a 26 3661 3704 3735 N
+ OW ER V b n/a 26 3663 3678 3720 N
+ OW ER V e n/a 26 3661 3678 3720 N
+ OW ER V i n/a 26 3661 3678 3720 N
+ OW ER V s n/a 26 3661 3678 3720 N
+ OW ER W b n/a 26 3663 3678 3727 N
+ OW ER W e n/a 26 3661 3678 3737 N
+ OW ER W s n/a 26 3661 3678 3727 N
+ OW ER Y b n/a 26 3663 3666 3707 N
+ OW ER Y e n/a 26 3661 3666 3707 N
+ OW ER Y s n/a 26 3661 3666 3707 N
+ OW ER Z b n/a 26 3663 3666 3712 N
+ OW ER Z e n/a 26 3659 3666 3712 N
+ OW ER Z i n/a 26 3659 3666 3712 N
+ OW ER Z s n/a 26 3659 3666 3712 N
+ OW ER ZH b n/a 26 3663 3666 3712 N
+ OW ER ZH e n/a 26 3660 3666 3712 N
+ OW ER ZH i n/a 26 3660 3666 3712 N
+ OW ER ZH s n/a 26 3660 3666 3712 N
+ OW EY AA b n/a 26 3633 3704 3735 N
+ OW EY AA e n/a 26 3612 3702 3735 N
+ OW EY AA s n/a 26 3618 3704 3735 N
+ OW EY AE e n/a 26 3612 3702 3724 N
+ OW EY AE s n/a 26 3618 3704 3724 N
+ OW EY AH b n/a 26 3633 3704 3721 N
+ OW EY AH e n/a 26 3612 3702 3721 N
+ OW EY AH s n/a 26 3618 3704 3721 N
+ OW EY AO b n/a 26 3633 3704 3735 N
+ OW EY AO e n/a 26 3612 3702 3735 N
+ OW EY AO s n/a 26 3618 3704 3735 N
+ OW EY AW b n/a 26 3633 3704 3736 N
+ OW EY AW e n/a 26 3612 3702 3736 N
+ OW EY AW s n/a 26 3618 3704 3736 N
+ OW EY AY e n/a 26 3612 3702 3721 N
+ OW EY AY s n/a 26 3618 3704 3721 N
+ OW EY B b n/a 26 3633 3675 3718 N
+ OW EY B e n/a 26 3612 3675 3718 N
+ OW EY B s n/a 26 3612 3675 3718 N
+ OW EY CH b n/a 26 3633 3667 3706 N
+ OW EY CH e n/a 26 3612 3667 3706 N
+ OW EY CH s n/a 26 3612 3667 3706 N
+ OW EY D b n/a 26 3633 3667 3705 N
+ OW EY D e n/a 26 3612 3667 3705 N
+ OW EY D s n/a 26 3612 3667 3705 N
+ OW EY DH b n/a 26 3633 3664 3713 N
+ OW EY DH e n/a 26 3612 3664 3713 N
+ OW EY DH s n/a 26 3612 3664 3713 N
+ OW EY EH b n/a 26 3633 3704 3724 N
+ OW EY EH e n/a 26 3612 3702 3724 N
+ OW EY EH i n/a 26 3618 3704 3724 N
+ OW EY EH s n/a 26 3618 3704 3724 N
+ OW EY ER b n/a 26 3633 3704 3736 N
+ OW EY ER e n/a 26 3612 3702 3736 N
+ OW EY ER s n/a 26 3618 3704 3736 N
+ OW EY EY b n/a 26 3633 3704 3724 N
+ OW EY EY e n/a 26 3612 3702 3724 N
+ OW EY EY s n/a 26 3618 3704 3724 N
+ OW EY F b n/a 26 3633 3677 3717 N
+ OW EY F e n/a 26 3612 3677 3717 N
+ OW EY F s n/a 26 3612 3677 3717 N
+ OW EY G b n/a 26 3633 3678 3716 N
+ OW EY G e n/a 26 3612 3678 3716 N
+ OW EY G s n/a 26 3612 3678 3716 N
+ OW EY HH b n/a 26 3633 3677 3723 N
+ OW EY HH e n/a 26 3612 3677 3723 N
+ OW EY HH i n/a 26 3612 3677 3723 N
+ OW EY HH s n/a 26 3612 3677 3723 N
+ OW EY IH b n/a 26 3633 3704 3715 N
+ OW EY IH e n/a 26 3612 3702 3715 N
+ OW EY IH s n/a 26 3618 3704 3715 N
+ OW EY IY b n/a 26 3633 3704 3715 N
+ OW EY IY e n/a 26 3612 3702 3715 N
+ OW EY IY s n/a 26 3618 3704 3715 N
+ OW EY JH b n/a 26 3633 3667 3705 N
+ OW EY JH e n/a 26 3612 3667 3705 N
+ OW EY JH s n/a 26 3612 3667 3705 N
+ OW EY K b n/a 26 3633 3678 3716 N
+ OW EY K e n/a 26 3612 3678 3716 N
+ OW EY K i n/a 26 3612 3678 3716 N
+ OW EY K s n/a 26 3612 3678 3716 N
+ OW EY L b n/a 26 3644 3695 3728 N
+ OW EY L e n/a 26 3643 3698 3738 N
+ OW EY L i n/a 26 3643 3695 3727 N
+ OW EY L s n/a 26 3643 3695 3727 N
+ OW EY M b n/a 26 3633 3689 3732 N
+ OW EY M e n/a 26 3612 3689 3732 N
+ OW EY M i n/a 26 3612 3689 3732 N
+ OW EY M s n/a 26 3612 3689 3732 N
+ OW EY N b n/a 26 3633 3687 3733 N
+ OW EY N e n/a 26 3612 3686 3731 N
+ OW EY N i n/a 26 3612 3686 3730 N
+ OW EY N s n/a 26 3612 3686 3731 N
+ OW EY NG e n/a 26 3612 3686 3731 N
+ OW EY NG s n/a 26 3612 3686 3731 N
+ OW EY OW e n/a 26 3612 3702 3735 N
+ OW EY OW s n/a 26 3618 3704 3735 N
+ OW EY OY b n/a 26 3633 3704 3721 N
+ OW EY OY e n/a 26 3612 3702 3721 N
+ OW EY OY s n/a 26 3618 3704 3721 N
+ OW EY P b n/a 26 3633 3675 3719 N
+ OW EY P e n/a 26 3612 3675 3719 N
+ OW EY P s n/a 26 3612 3675 3719 N
+ OW EY R b n/a 26 3644 3696 3736 N
+ OW EY R e n/a 26 3643 3698 3736 N
+ OW EY R s n/a 26 3643 3698 3736 N
+ OW EY S b n/a 26 3633 3667 3709 N
+ OW EY S e n/a 26 3613 3667 3709 N
+ OW EY S i n/a 26 3613 3667 3709 N
+ OW EY S s n/a 26 3613 3667 3709 N
+ OW EY SH b n/a 26 3633 3667 3711 N
+ OW EY SH e n/a 26 3613 3667 3711 N
+ OW EY SH i n/a 26 3613 3667 3711 N
+ OW EY SH s n/a 26 3613 3667 3711 N
+ OW EY SIL e n/a 26 3612 3685 3725 N
+ OW EY SIL s n/a 26 3612 3683 3725 N
+ OW EY T b n/a 26 3633 3667 3706 N
+ OW EY T e n/a 26 3612 3667 3706 N
+ OW EY T i n/a 26 3612 3667 3706 N
+ OW EY T s n/a 26 3612 3667 3706 N
+ OW EY TH b n/a 26 3633 3667 3710 N
+ OW EY TH e n/a 26 3612 3667 3710 N
+ OW EY TH s n/a 26 3612 3667 3710 N
+ OW EY UH b n/a 26 3633 3704 3736 N
+ OW EY UH e n/a 26 3612 3702 3736 N
+ OW EY UH s n/a 26 3618 3704 3736 N
+ OW EY UW e n/a 26 3612 3702 3735 N
+ OW EY UW s n/a 26 3618 3704 3735 N
+ OW EY V b n/a 26 3633 3677 3720 N
+ OW EY V e n/a 26 3612 3677 3720 N
+ OW EY V i n/a 26 3612 3677 3720 N
+ OW EY V s n/a 26 3612 3677 3720 N
+ OW EY W b n/a 26 3633 3677 3728 N
+ OW EY W e n/a 26 3612 3677 3737 N
+ OW EY W s n/a 26 3618 3677 3727 N
+ OW EY Y b n/a 26 3633 3667 3707 N
+ OW EY Y e n/a 26 3612 3667 3707 N
+ OW EY Y i n/a 26 3618 3667 3707 N
+ OW EY Y s n/a 26 3618 3667 3707 N
+ OW EY Z b n/a 26 3633 3664 3712 N
+ OW EY Z e n/a 26 3613 3664 3712 N
+ OW EY Z i n/a 26 3613 3665 3712 N
+ OW EY Z s n/a 26 3613 3664 3712 N
+ OW EY ZH b n/a 26 3633 3664 3712 N
+ OW EY ZH e n/a 26 3613 3664 3712 N
+ OW EY ZH s n/a 26 3613 3664 3712 N
+ OW F AA b n/a 26 3642 3704 3735 N
+ OW F AA e n/a 26 3646 3702 3735 N
+ OW F AA s n/a 26 3646 3704 3735 N
+ OW F AE e n/a 26 3646 3702 3724 N
+ OW F AE s n/a 26 3646 3704 3724 N
+ OW F AH b n/a 26 3642 3704 3721 N
+ OW F AH e n/a 26 3646 3702 3721 N
+ OW F AH i n/a 26 3646 3704 3724 N
+ OW F AH s n/a 26 3646 3704 3721 N
+ OW F AO b n/a 26 3642 3704 3735 N
+ OW F AO e n/a 26 3646 3702 3735 N
+ OW F AO s n/a 26 3646 3704 3735 N
+ OW F AW b n/a 26 3642 3704 3736 N
+ OW F AW e n/a 26 3646 3702 3736 N
+ OW F AW s n/a 26 3646 3704 3736 N
+ OW F AY e n/a 26 3646 3702 3721 N
+ OW F AY i n/a 26 3646 3704 3721 N
+ OW F AY s n/a 26 3646 3704 3721 N
+ OW F B b n/a 26 3642 3675 3718 N
+ OW F B e n/a 26 3646 3676 3718 N
+ OW F B i n/a 26 3646 3676 3718 N
+ OW F B s n/a 26 3646 3676 3718 N
+ OW F CH b n/a 26 3642 3671 3705 N
+ OW F CH e n/a 26 3646 3671 3705 N
+ OW F CH s n/a 26 3646 3671 3705 N
+ OW F D b n/a 26 3642 3671 3705 N
+ OW F D e n/a 26 3646 3671 3705 N
+ OW F D i n/a 26 3646 3671 3705 N
+ OW F D s n/a 26 3646 3671 3705 N
+ OW F DH b n/a 26 3642 3672 3713 N
+ OW F DH e n/a 26 3645 3672 3713 N
+ OW F DH s n/a 26 3645 3672 3713 N
+ OW F EH b n/a 26 3642 3704 3724 N
+ OW F EH e n/a 26 3646 3702 3724 N
+ OW F EH s n/a 26 3646 3704 3724 N
+ OW F ER b n/a 26 3642 3704 3736 N
+ OW F ER e n/a 26 3646 3702 3736 N
+ OW F ER i n/a 26 3646 3704 3736 N
+ OW F ER s n/a 26 3646 3704 3736 N
+ OW F EY b n/a 26 3642 3704 3724 N
+ OW F EY e n/a 26 3646 3702 3724 N
+ OW F EY s n/a 26 3646 3704 3724 N
+ OW F F b n/a 26 3642 3676 3717 N
+ OW F F e n/a 26 3645 3677 3717 N
+ OW F F s n/a 26 3645 3677 3717 N
+ OW F G b n/a 26 3642 3678 3716 N
+ OW F G e n/a 26 3646 3678 3716 N
+ OW F G i n/a 26 3646 3678 3716 N
+ OW F G s n/a 26 3646 3678 3716 N
+ OW F HH b n/a 26 3642 3676 3723 N
+ OW F HH e n/a 26 3646 3677 3723 N
+ OW F HH s n/a 26 3646 3677 3723 N
+ OW F IH b n/a 26 3642 3704 3715 N
+ OW F IH e n/a 26 3646 3702 3715 N
+ OW F IH s n/a 26 3646 3704 3715 N
+ OW F IY b n/a 26 3642 3704 3715 N
+ OW F IY e n/a 26 3646 3702 3715 N
+ OW F IY s n/a 26 3646 3704 3715 N
+ OW F JH b n/a 26 3642 3671 3705 N
+ OW F JH e n/a 26 3646 3671 3705 N
+ OW F JH i n/a 26 3646 3671 3705 N
+ OW F JH s n/a 26 3646 3671 3705 N
+ OW F K b n/a 26 3642 3678 3716 N
+ OW F K e n/a 26 3646 3678 3716 N
+ OW F K i n/a 26 3646 3678 3716 N
+ OW F K s n/a 26 3646 3678 3716 N
+ OW F L b n/a 26 3638 3692 3729 N
+ OW F L e n/a 26 3638 3692 3738 N
+ OW F L i n/a 26 3640 3692 3729 N
+ OW F L s n/a 26 3638 3692 3729 N
+ OW F M b n/a 26 3642 3690 3732 N
+ OW F M e n/a 26 3646 3690 3732 N
+ OW F M i n/a 26 3646 3690 3732 N
+ OW F M s n/a 26 3646 3690 3732 N
+ OW F N b n/a 26 3642 3688 3733 N
+ OW F N e n/a 26 3646 3688 3731 N
+ OW F N i n/a 26 3646 3688 3730 N
+ OW F N s n/a 26 3646 3688 3731 N
+ OW F NG e n/a 26 3646 3689 3731 N
+ OW F NG s n/a 26 3646 3689 3731 N
+ OW F OW e n/a 26 3646 3702 3735 N
+ OW F OW s n/a 26 3646 3704 3735 N
+ OW F OY b n/a 26 3642 3704 3721 N
+ OW F OY e n/a 26 3646 3702 3721 N
+ OW F OY s n/a 26 3646 3704 3721 N
+ OW F P b n/a 26 3642 3675 3719 N
+ OW F P e n/a 26 3646 3676 3719 N
+ OW F P i n/a 26 3646 3676 3719 N
+ OW F P s n/a 26 3646 3676 3719 N
+ OW F R b n/a 26 3643 3696 3736 N
+ OW F R e n/a 26 3646 3698 3736 N
+ OW F R i n/a 26 3646 3698 3736 N
+ OW F R s n/a 26 3646 3698 3736 N
+ OW F S b n/a 26 3642 3671 3709 N
+ OW F S e n/a 26 3645 3671 3709 N
+ OW F S i n/a 26 3645 3671 3709 N
+ OW F S s n/a 26 3645 3671 3709 N
+ OW F SH b n/a 26 3642 3671 3711 N
+ OW F SH e n/a 26 3645 3671 3711 N
+ OW F SH i n/a 26 3645 3671 3711 N
+ OW F SH s n/a 26 3645 3671 3711 N
+ OW F SIL e n/a 26 3646 3683 3725 N
+ OW F SIL s n/a 26 3646 3683 3725 N
+ OW F T b n/a 26 3642 3671 3705 N
+ OW F T e n/a 26 3646 3671 3705 N
+ OW F T i n/a 26 3646 3671 3705 N
+ OW F T s n/a 26 3646 3671 3705 N
+ OW F TH b n/a 26 3642 3671 3710 N
+ OW F TH e n/a 26 3645 3671 3710 N
+ OW F TH s n/a 26 3645 3671 3710 N
+ OW F UH b n/a 26 3642 3704 3736 N
+ OW F UH e n/a 26 3646 3702 3736 N
+ OW F UH s n/a 26 3646 3704 3736 N
+ OW F UW e n/a 26 3646 3702 3735 N
+ OW F UW s n/a 26 3646 3704 3735 N
+ OW F V b n/a 26 3642 3676 3720 N
+ OW F V e n/a 26 3645 3677 3720 N
+ OW F V s n/a 26 3645 3677 3720 N
+ OW F W b n/a 26 3638 3676 3729 N
+ OW F W e n/a 26 3638 3677 3737 N
+ OW F W i n/a 26 3640 3677 3729 N
+ OW F W s n/a 26 3638 3677 3729 N
+ OW F Y b n/a 26 3642 3671 3707 N
+ OW F Y e n/a 26 3646 3671 3707 N
+ OW F Y i n/a 26 3646 3671 3707 N
+ OW F Y s n/a 26 3646 3671 3707 N
+ OW F Z b n/a 26 3642 3672 3712 N
+ OW F Z e n/a 26 3645 3672 3712 N
+ OW F Z i n/a 26 3645 3672 3712 N
+ OW F Z s n/a 26 3645 3672 3712 N
+ OW F ZH b n/a 26 3642 3672 3712 N
+ OW F ZH e n/a 26 3645 3672 3712 N
+ OW F ZH i n/a 26 3645 3672 3712 N
+ OW F ZH s n/a 26 3645 3672 3712 N
+ OW G AA b n/a 26 3630 3704 3735 N
+ OW G AA e n/a 26 3618 3702 3735 N
+ OW G AA s n/a 26 3617 3704 3735 N
+ OW G AE e n/a 26 3618 3702 3724 N
+ OW G AE s n/a 26 3617 3704 3724 N
+ OW G AH b n/a 26 3630 3704 3721 N
+ OW G AH e n/a 26 3618 3702 3721 N
+ OW G AH i n/a 26 3617 3704 3724 N
+ OW G AH s n/a 26 3617 3704 3721 N
+ OW G AO b n/a 26 3630 3704 3735 N
+ OW G AO e n/a 26 3618 3702 3735 N
+ OW G AO s n/a 26 3617 3704 3735 N
+ OW G AW b n/a 26 3630 3704 3736 N
+ OW G AW e n/a 26 3618 3702 3736 N
+ OW G AW s n/a 26 3617 3704 3736 N
+ OW G AY e n/a 26 3618 3702 3721 N
+ OW G AY s n/a 26 3617 3704 3721 N
+ OW G B b n/a 26 3631 3675 3718 N
+ OW G B e n/a 26 3616 3675 3718 N
+ OW G B i n/a 26 3616 3675 3718 N
+ OW G B s n/a 26 3616 3675 3718 N
+ OW G CH b n/a 26 3631 3667 3706 N
+ OW G CH e n/a 26 3616 3667 3706 N
+ OW G CH i n/a 26 3616 3667 3706 N
+ OW G CH s n/a 26 3616 3667 3706 N
+ OW G D b n/a 26 3631 3667 3705 N
+ OW G D e n/a 26 3616 3667 3705 N
+ OW G D i n/a 26 3616 3667 3705 N
+ OW G D s n/a 26 3616 3667 3705 N
+ OW G DH b n/a 26 3631 3664 3713 N
+ OW G DH e n/a 26 3616 3664 3713 N
+ OW G DH i n/a 26 3616 3665 3712 N
+ OW G DH s n/a 26 3616 3664 3713 N
+ OW G EH b n/a 26 3630 3704 3724 N
+ OW G EH e n/a 26 3618 3702 3724 N
+ OW G EH i n/a 26 3617 3704 3724 N
+ OW G EH s n/a 26 3617 3704 3724 N
+ OW G ER b n/a 26 3630 3704 3736 N
+ OW G ER e n/a 26 3618 3702 3736 N
+ OW G ER i n/a 26 3617 3704 3736 N
+ OW G ER s n/a 26 3617 3704 3736 N
+ OW G EY b n/a 26 3630 3704 3724 N
+ OW G EY e n/a 26 3618 3702 3724 N
+ OW G EY i n/a 26 3617 3704 3724 N
+ OW G EY s n/a 26 3617 3704 3724 N
+ OW G F b n/a 26 3631 3677 3717 N
+ OW G F e n/a 26 3616 3677 3717 N
+ OW G F i n/a 26 3616 3677 3717 N
+ OW G F s n/a 26 3616 3677 3717 N
+ OW G G b n/a 26 3631 3678 3716 N
+ OW G G e n/a 26 3616 3678 3716 N
+ OW G G i n/a 26 3616 3678 3716 N
+ OW G G s n/a 26 3616 3678 3716 N
+ OW G HH b n/a 26 3630 3677 3723 N
+ OW G HH e n/a 26 3616 3677 3723 N
+ OW G HH s n/a 26 3616 3677 3723 N
+ OW G IH b n/a 26 3630 3704 3715 N
+ OW G IH e n/a 26 3618 3702 3715 N
+ OW G IH i n/a 26 3617 3701 3714 N
+ OW G IH s n/a 26 3617 3704 3715 N
+ OW G IY b n/a 26 3630 3704 3715 N
+ OW G IY e n/a 26 3618 3702 3715 N
+ OW G IY i n/a 26 3617 3701 3714 N
+ OW G IY s n/a 26 3617 3704 3715 N
+ OW G JH b n/a 26 3631 3667 3705 N
+ OW G JH e n/a 26 3616 3667 3705 N
+ OW G JH i n/a 26 3616 3667 3705 N
+ OW G JH s n/a 26 3616 3667 3705 N
+ OW G K b n/a 26 3631 3678 3716 N
+ OW G K e n/a 26 3616 3678 3716 N
+ OW G K i n/a 26 3616 3678 3716 N
+ OW G K s n/a 26 3616 3678 3716 N
+ OW G L b n/a 26 3639 3694 3729 N
+ OW G L e n/a 26 3639 3694 3738 N
+ OW G L i n/a 26 3639 3694 3729 N
+ OW G L s n/a 26 3639 3694 3729 N
+ OW G M b n/a 26 3630 3689 3732 N
+ OW G M e n/a 26 3616 3689 3732 N
+ OW G M i n/a 26 3616 3689 3732 N
+ OW G M s n/a 26 3616 3689 3732 N
+ OW G N b n/a 26 3630 3688 3733 N
+ OW G N e n/a 26 3616 3686 3730 N
+ OW G N i n/a 26 3616 3686 3730 N
+ OW G N s n/a 26 3616 3686 3730 N
+ OW G NG e n/a 26 3616 3686 3730 N
+ OW G NG i n/a 26 3616 3686 3730 N
+ OW G NG s n/a 26 3616 3686 3730 N
+ OW G OW e n/a 26 3618 3702 3735 N
+ OW G OW s n/a 26 3617 3704 3735 N
+ OW G OY b n/a 26 3630 3704 3721 N
+ OW G OY e n/a 26 3618 3702 3721 N
+ OW G OY s n/a 26 3617 3704 3721 N
+ OW G P b n/a 26 3631 3675 3719 N
+ OW G P e n/a 26 3616 3675 3719 N
+ OW G P i n/a 26 3616 3675 3719 N
+ OW G P s n/a 26 3616 3675 3719 N
+ OW G R b n/a 26 3643 3696 3736 N
+ OW G R e n/a 26 3643 3698 3736 N
+ OW G R i n/a 26 3643 3698 3736 N
+ OW G R s n/a 26 3643 3698 3736 N
+ OW G S b n/a 26 3631 3667 3709 N
+ OW G S e n/a 26 3616 3667 3709 N
+ OW G S i n/a 26 3616 3667 3709 N
+ OW G S s n/a 26 3616 3667 3709 N
+ OW G SH b n/a 26 3631 3667 3711 N
+ OW G SH e n/a 26 3616 3667 3711 N
+ OW G SH i n/a 26 3616 3667 3711 N
+ OW G SH s n/a 26 3616 3667 3711 N
+ OW G SIL e n/a 26 3614 3685 3725 N
+ OW G SIL s n/a 26 3614 3683 3725 N
+ OW G T b n/a 26 3631 3667 3706 N
+ OW G T e n/a 26 3616 3667 3706 N
+ OW G T i n/a 26 3616 3667 3706 N
+ OW G T s n/a 26 3616 3667 3706 N
+ OW G TH b n/a 26 3631 3667 3710 N
+ OW G TH e n/a 26 3616 3667 3710 N
+ OW G TH i n/a 26 3616 3667 3710 N
+ OW G TH s n/a 26 3616 3667 3710 N
+ OW G UH b n/a 26 3630 3704 3736 N
+ OW G UH e n/a 26 3618 3702 3736 N
+ OW G UH s n/a 26 3617 3704 3736 N
+ OW G UW e n/a 26 3618 3702 3735 N
+ OW G UW s n/a 26 3617 3704 3735 N
+ OW G V b n/a 26 3631 3677 3720 N
+ OW G V e n/a 26 3616 3677 3720 N
+ OW G V i n/a 26 3616 3677 3720 N
+ OW G V s n/a 26 3616 3677 3720 N
+ OW G W b n/a 26 3630 3677 3729 N
+ OW G W e n/a 26 3618 3677 3737 N
+ OW G W i n/a 26 3617 3677 3729 N
+ OW G W s n/a 26 3617 3677 3729 N
+ OW G Y b n/a 26 3630 3667 3707 N
+ OW G Y e n/a 26 3618 3667 3707 N
+ OW G Y i n/a 26 3617 3667 3707 N
+ OW G Y s n/a 26 3617 3667 3707 N
+ OW G Z b n/a 26 3631 3664 3712 N
+ OW G Z e n/a 26 3616 3664 3712 N
+ OW G Z i n/a 26 3616 3665 3712 N
+ OW G Z s n/a 26 3616 3664 3712 N
+ OW G ZH b n/a 26 3631 3664 3712 N
+ OW G ZH e n/a 26 3616 3664 3712 N
+ OW G ZH i n/a 26 3616 3665 3712 N
+ OW G ZH s n/a 26 3616 3664 3712 N
+ OW HH AA b n/a 26 3630 3704 3735 N
+ OW HH AA e n/a 26 3628 3702 3735 N
+ OW HH AA s n/a 26 3630 3704 3735 N
+ OW HH AE e n/a 26 3628 3702 3724 N
+ OW HH AE i n/a 26 3634 3704 3724 N
+ OW HH AE s n/a 26 3630 3704 3724 N
+ OW HH AH b n/a 26 3630 3704 3721 N
+ OW HH AH e n/a 26 3628 3702 3721 N
+ OW HH AH i n/a 26 3634 3704 3724 N
+ OW HH AH s n/a 26 3630 3704 3721 N
+ OW HH AO b n/a 26 3630 3704 3735 N
+ OW HH AO e n/a 26 3628 3702 3735 N
+ OW HH AO s n/a 26 3630 3704 3735 N
+ OW HH AW b n/a 26 3630 3704 3736 N
+ OW HH AW e n/a 26 3628 3702 3736 N
+ OW HH AW s n/a 26 3630 3704 3736 N
+ OW HH AY e n/a 26 3628 3702 3721 N
+ OW HH AY i n/a 26 3634 3704 3721 N
+ OW HH AY s n/a 26 3630 3704 3721 N
+ OW HH B b n/a 26 3631 3675 3718 N
+ OW HH B e n/a 26 3628 3676 3718 N
+ OW HH B i n/a 26 3634 3676 3718 N
+ OW HH B s n/a 26 3631 3676 3718 N
+ OW HH CH b n/a 26 3631 3669 3706 N
+ OW HH CH e n/a 26 3628 3669 3706 N
+ OW HH CH s n/a 26 3631 3669 3706 N
+ OW HH D b n/a 26 3631 3669 3705 N
+ OW HH D e n/a 26 3628 3669 3705 N
+ OW HH D i n/a 26 3634 3669 3705 N
+ OW HH D s n/a 26 3631 3669 3705 N
+ OW HH DH b n/a 26 3631 3664 3713 N
+ OW HH DH e n/a 26 3628 3664 3713 N
+ OW HH DH s n/a 26 3631 3664 3713 N
+ OW HH EH b n/a 26 3630 3704 3724 N
+ OW HH EH e n/a 26 3628 3702 3724 N
+ OW HH EH s n/a 26 3630 3704 3724 N
+ OW HH ER b n/a 26 3630 3704 3736 N
+ OW HH ER e n/a 26 3628 3702 3736 N
+ OW HH ER i n/a 26 3634 3704 3736 N
+ OW HH ER s n/a 26 3630 3704 3736 N
+ OW HH EY b n/a 26 3630 3704 3724 N
+ OW HH EY e n/a 26 3628 3702 3724 N
+ OW HH EY s n/a 26 3630 3704 3724 N
+ OW HH F b n/a 26 3631 3676 3717 N
+ OW HH F e n/a 26 3628 3677 3717 N
+ OW HH F i n/a 26 3634 3677 3717 N
+ OW HH F s n/a 26 3631 3677 3717 N
+ OW HH G b n/a 26 3631 3678 3716 N
+ OW HH G e n/a 26 3628 3678 3716 N
+ OW HH G i n/a 26 3634 3678 3716 N
+ OW HH G s n/a 26 3631 3678 3716 N
+ OW HH HH b n/a 26 3630 3676 3723 N
+ OW HH HH e n/a 26 3628 3677 3723 N
+ OW HH HH i n/a 26 3634 3677 3723 N
+ OW HH HH s n/a 26 3630 3677 3723 N
+ OW HH IH b n/a 26 3630 3704 3715 N
+ OW HH IH e n/a 26 3628 3702 3715 N
+ OW HH IH i n/a 26 3634 3700 3714 N
+ OW HH IH s n/a 26 3630 3704 3715 N
+ OW HH IY b n/a 26 3630 3704 3715 N
+ OW HH IY e n/a 26 3628 3702 3715 N
+ OW HH IY i n/a 26 3634 3700 3715 N
+ OW HH IY s n/a 26 3630 3704 3715 N
+ OW HH JH b n/a 26 3631 3669 3705 N
+ OW HH JH e n/a 26 3628 3669 3705 N
+ OW HH JH i n/a 26 3634 3669 3705 N
+ OW HH JH s n/a 26 3631 3669 3705 N
+ OW HH K b n/a 26 3631 3678 3716 N
+ OW HH K e n/a 26 3625 3678 3716 N
+ OW HH K i n/a 26 3634 3678 3716 N
+ OW HH K s n/a 26 3631 3678 3716 N
+ OW HH L b n/a 26 3641 3692 3729 N
+ OW HH L e n/a 26 3641 3692 3738 N
+ OW HH L i n/a 26 3641 3692 3729 N
+ OW HH L s n/a 26 3641 3692 3729 N
+ OW HH M b n/a 26 3630 3690 3733 N
+ OW HH M e n/a 26 3628 3690 3733 N
+ OW HH M i n/a 26 3635 3690 3734 N
+ OW HH M s n/a 26 3630 3690 3733 N
+ OW HH N b n/a 26 3630 3688 3733 N
+ OW HH N e n/a 26 3628 3686 3731 N
+ OW HH N i n/a 26 3635 3686 3730 N
+ OW HH N s n/a 26 3630 3686 3731 N
+ OW HH NG e n/a 26 3628 3686 3731 N
+ OW HH NG i n/a 26 3635 3686 3730 N
+ OW HH NG s n/a 26 3630 3686 3731 N
+ OW HH OW e n/a 26 3628 3702 3735 N
+ OW HH OW s n/a 26 3630 3704 3735 N
+ OW HH OY b n/a 26 3630 3704 3721 N
+ OW HH OY e n/a 26 3628 3702 3721 N
+ OW HH OY s n/a 26 3630 3704 3721 N
+ OW HH P b n/a 26 3631 3675 3719 N
+ OW HH P e n/a 26 3625 3676 3719 N
+ OW HH P i n/a 26 3634 3676 3719 N
+ OW HH P s n/a 26 3631 3676 3719 N
+ OW HH R b n/a 26 3643 3696 3736 N
+ OW HH R e n/a 26 3643 3698 3736 N
+ OW HH R s n/a 26 3643 3698 3736 N
+ OW HH S b n/a 26 3631 3669 3709 N
+ OW HH S e n/a 26 3628 3669 3709 N
+ OW HH S i n/a 26 3634 3669 3709 N
+ OW HH S s n/a 26 3631 3669 3709 N
+ OW HH SH b n/a 26 3631 3669 3711 N
+ OW HH SH e n/a 26 3628 3669 3711 N
+ OW HH SH i n/a 26 3634 3669 3711 N
+ OW HH SH s n/a 26 3631 3669 3711 N
+ OW HH SIL e n/a 26 3629 3684 3725 N
+ OW HH SIL s n/a 26 3630 3683 3725 N
+ OW HH T b n/a 26 3631 3669 3706 N
+ OW HH T e n/a 26 3625 3669 3706 N
+ OW HH T i n/a 26 3634 3669 3706 N
+ OW HH T s n/a 26 3631 3669 3706 N
+ OW HH TH b n/a 26 3631 3669 3710 N
+ OW HH TH e n/a 26 3628 3669 3710 N
+ OW HH TH s n/a 26 3631 3669 3710 N
+ OW HH UH b n/a 26 3630 3704 3736 N
+ OW HH UH e n/a 26 3628 3702 3736 N
+ OW HH UH s n/a 26 3630 3704 3736 N
+ OW HH UW e n/a 26 3628 3702 3735 N
+ OW HH UW s n/a 26 3630 3704 3735 N
+ OW HH V b n/a 26 3631 3676 3720 N
+ OW HH V e n/a 26 3628 3677 3720 N
+ OW HH V i n/a 26 3634 3677 3720 N
+ OW HH V s n/a 26 3631 3677 3720 N
+ OW HH W b n/a 26 3630 3676 3729 N
+ OW HH W e n/a 26 3628 3677 3737 N
+ OW HH W s n/a 26 3630 3677 3729 N
+ OW HH Y b n/a 26 3630 3669 3707 N
+ OW HH Y e n/a 26 3628 3669 3707 N
+ OW HH Y s n/a 26 3630 3669 3707 N
+ OW HH Z b n/a 26 3631 3664 3712 N
+ OW HH Z e n/a 26 3628 3664 3712 N
+ OW HH Z i n/a 26 3634 3665 3712 N
+ OW HH Z s n/a 26 3631 3664 3712 N
+ OW HH ZH b n/a 26 3631 3664 3712 N
+ OW HH ZH e n/a 26 3628 3664 3712 N
+ OW HH ZH i n/a 26 3634 3665 3712 N
+ OW HH ZH s n/a 26 3631 3664 3712 N
+ OW IH AA b n/a 26 3630 3704 3735 N
+ OW IH AA s n/a 26 3618 3704 3735 N
+ OW IH AE s n/a 26 3618 3704 3724 N
+ OW IH AH b n/a 26 3630 3704 3721 N
+ OW IH AH s n/a 26 3618 3704 3721 N
+ OW IH AO b n/a 26 3630 3704 3735 N
+ OW IH AO s n/a 26 3618 3704 3735 N
+ OW IH AW b n/a 26 3630 3704 3736 N
+ OW IH AW s n/a 26 3618 3704 3736 N
+ OW IH AY s n/a 26 3618 3704 3721 N
+ OW IH B b n/a 26 3631 3675 3718 N
+ OW IH B s n/a 26 3612 3675 3718 N
+ OW IH CH b n/a 26 3631 3667 3706 N
+ OW IH CH s n/a 26 3612 3667 3706 N
+ OW IH D b n/a 26 3631 3667 3705 N
+ OW IH D s n/a 26 3612 3667 3705 N
+ OW IH DH b n/a 26 3631 3664 3713 N
+ OW IH DH s n/a 26 3612 3664 3713 N
+ OW IH EH b n/a 26 3630 3704 3724 N
+ OW IH EH s n/a 26 3618 3704 3724 N
+ OW IH ER b n/a 26 3630 3704 3736 N
+ OW IH ER s n/a 26 3618 3704 3736 N
+ OW IH EY b n/a 26 3630 3704 3724 N
+ OW IH EY s n/a 26 3618 3704 3724 N
+ OW IH F b n/a 26 3631 3676 3717 N
+ OW IH F s n/a 26 3612 3677 3717 N
+ OW IH G b n/a 26 3631 3678 3716 N
+ OW IH G s n/a 26 3612 3678 3716 N
+ OW IH HH b n/a 26 3630 3676 3723 N
+ OW IH HH s n/a 26 3612 3677 3723 N
+ OW IH IH b n/a 26 3630 3704 3715 N
+ OW IH IH s n/a 26 3618 3704 3715 N
+ OW IH IY b n/a 26 3630 3704 3715 N
+ OW IH IY s n/a 26 3618 3704 3715 N
+ OW IH JH b n/a 26 3631 3667 3705 N
+ OW IH JH s n/a 26 3612 3667 3705 N
+ OW IH K b n/a 26 3631 3678 3716 N
+ OW IH K s n/a 26 3612 3678 3716 N
+ OW IH L b n/a 26 3644 3695 3728 N
+ OW IH L s n/a 26 3643 3695 3727 N
+ OW IH M b n/a 26 3630 3689 3732 N
+ OW IH M i n/a 26 3612 3689 3732 N
+ OW IH M s n/a 26 3612 3689 3732 N
+ OW IH N b n/a 26 3630 3687 3733 N
+ OW IH N s n/a 26 3612 3686 3731 N
+ OW IH NG s n/a 26 3612 3686 3731 N
+ OW IH OW s n/a 26 3618 3704 3735 N
+ OW IH OY b n/a 26 3630 3704 3721 N
+ OW IH OY s n/a 26 3618 3704 3721 N
+ OW IH P b n/a 26 3631 3675 3719 N
+ OW IH P s n/a 26 3612 3675 3719 N
+ OW IH R b n/a 26 3644 3696 3736 N
+ OW IH R s n/a 26 3643 3698 3736 N
+ OW IH S b n/a 26 3631 3667 3709 N
+ OW IH S s n/a 26 3613 3667 3709 N
+ OW IH SH b n/a 26 3631 3667 3711 N
+ OW IH SH s n/a 26 3613 3667 3711 N
+ OW IH SIL s n/a 26 3612 3683 3725 N
+ OW IH T b n/a 26 3631 3667 3706 N
+ OW IH T s n/a 26 3612 3667 3706 N
+ OW IH TH b n/a 26 3631 3667 3710 N
+ OW IH TH s n/a 26 3612 3667 3710 N
+ OW IH UH b n/a 26 3630 3704 3736 N
+ OW IH UH s n/a 26 3618 3704 3736 N
+ OW IH UW s n/a 26 3618 3704 3735 N
+ OW IH V b n/a 26 3631 3676 3720 N
+ OW IH V s n/a 26 3612 3677 3720 N
+ OW IH W b n/a 26 3630 3676 3728 N
+ OW IH W s n/a 26 3618 3677 3727 N
+ OW IH Y b n/a 26 3630 3667 3707 N
+ OW IH Y s n/a 26 3618 3667 3707 N
+ OW IH Z b n/a 26 3631 3664 3712 N
+ OW IH Z s n/a 26 3613 3664 3712 N
+ OW IH ZH b n/a 26 3631 3664 3712 N
+ OW IH ZH s n/a 26 3613 3664 3712 N
+ OW IY AA b n/a 26 3633 3704 3735 N
+ OW IY AA e n/a 26 3612 3702 3735 N
+ OW IY AA i n/a 26 3618 3704 3735 N
+ OW IY AA s n/a 26 3618 3704 3735 N
+ OW IY AE e n/a 26 3612 3702 3724 N
+ OW IY AE i n/a 26 3618 3704 3724 N
+ OW IY AE s n/a 26 3618 3704 3724 N
+ OW IY AH b n/a 26 3633 3704 3721 N
+ OW IY AH e n/a 26 3612 3702 3721 N
+ OW IY AH i n/a 26 3618 3704 3724 N
+ OW IY AH s n/a 26 3618 3704 3721 N
+ OW IY AO b n/a 26 3633 3704 3735 N
+ OW IY AO e n/a 26 3612 3702 3735 N
+ OW IY AO s n/a 26 3618 3704 3735 N
+ OW IY AW b n/a 26 3633 3704 3736 N
+ OW IY AW e n/a 26 3612 3702 3736 N
+ OW IY AW s n/a 26 3618 3704 3736 N
+ OW IY AY e n/a 26 3612 3702 3721 N
+ OW IY AY i n/a 26 3618 3704 3721 N
+ OW IY AY s n/a 26 3618 3704 3721 N
+ OW IY B b n/a 26 3633 3675 3718 N
+ OW IY B e n/a 26 3612 3675 3718 N
+ OW IY B i n/a 26 3612 3675 3718 N
+ OW IY B s n/a 26 3612 3675 3718 N
+ OW IY CH b n/a 26 3633 3667 3706 N
+ OW IY CH e n/a 26 3612 3667 3706 N
+ OW IY CH s n/a 26 3612 3667 3706 N
+ OW IY D b n/a 26 3633 3667 3705 N
+ OW IY D e n/a 26 3612 3667 3705 N
+ OW IY D i n/a 26 3612 3667 3705 N
+ OW IY D s n/a 26 3612 3667 3705 N
+ OW IY DH b n/a 26 3633 3664 3713 N
+ OW IY DH e n/a 26 3612 3664 3713 N
+ OW IY DH s n/a 26 3612 3664 3713 N
+ OW IY EH b n/a 26 3633 3704 3724 N
+ OW IY EH e n/a 26 3612 3702 3724 N
+ OW IY EH i n/a 26 3618 3704 3724 N
+ OW IY EH s n/a 26 3618 3704 3724 N
+ OW IY ER b n/a 26 3633 3704 3736 N
+ OW IY ER e n/a 26 3612 3702 3736 N
+ OW IY ER i n/a 26 3618 3704 3736 N
+ OW IY ER s n/a 26 3618 3704 3736 N
+ OW IY EY b n/a 26 3633 3704 3724 N
+ OW IY EY e n/a 26 3612 3702 3724 N
+ OW IY EY s n/a 26 3618 3704 3724 N
+ OW IY F b n/a 26 3633 3677 3717 N
+ OW IY F e n/a 26 3612 3677 3717 N
+ OW IY F i n/a 26 3612 3677 3717 N
+ OW IY F s n/a 26 3612 3677 3717 N
+ OW IY G b n/a 26 3633 3678 3716 N
+ OW IY G e n/a 26 3612 3678 3716 N
+ OW IY G i n/a 26 3612 3678 3716 N
+ OW IY G s n/a 26 3612 3678 3716 N
+ OW IY HH b n/a 26 3633 3677 3723 N
+ OW IY HH e n/a 26 3612 3677 3723 N
+ OW IY HH i n/a 26 3612 3677 3723 N
+ OW IY HH s n/a 26 3612 3677 3723 N
+ OW IY IH b n/a 26 3633 3704 3715 N
+ OW IY IH e n/a 26 3612 3702 3715 N
+ OW IY IH s n/a 26 3618 3704 3715 N
+ OW IY IY b n/a 26 3633 3704 3715 N
+ OW IY IY e n/a 26 3612 3702 3715 N
+ OW IY IY i n/a 26 3618 3700 3715 N
+ OW IY IY s n/a 26 3618 3704 3715 N
+ OW IY JH b n/a 26 3633 3667 3705 N
+ OW IY JH e n/a 26 3612 3667 3705 N
+ OW IY JH i n/a 26 3612 3667 3705 N
+ OW IY JH s n/a 26 3612 3667 3705 N
+ OW IY K b n/a 26 3633 3678 3716 N
+ OW IY K e n/a 26 3612 3678 3716 N
+ OW IY K i n/a 26 3612 3678 3716 N
+ OW IY K s n/a 26 3612 3678 3716 N
+ OW IY L b n/a 26 3644 3695 3728 N
+ OW IY L e n/a 26 3643 3698 3738 N
+ OW IY L i n/a 26 3643 3695 3727 N
+ OW IY L s n/a 26 3643 3695 3727 N
+ OW IY M b n/a 26 3633 3689 3732 N
+ OW IY M e n/a 26 3612 3689 3732 N
+ OW IY M i n/a 26 3612 3689 3732 N
+ OW IY M s n/a 26 3612 3689 3732 N
+ OW IY N b n/a 26 3633 3687 3733 N
+ OW IY N e n/a 26 3612 3686 3731 N
+ OW IY N i n/a 26 3612 3686 3730 N
+ OW IY N s n/a 26 3612 3686 3731 N
+ OW IY NG e n/a 26 3612 3686 3731 N
+ OW IY NG s n/a 26 3612 3686 3731 N
+ OW IY OW e n/a 26 3612 3702 3735 N
+ OW IY OW s n/a 26 3618 3704 3735 N
+ OW IY OY b n/a 26 3633 3704 3721 N
+ OW IY OY e n/a 26 3612 3702 3721 N
+ OW IY OY s n/a 26 3618 3704 3721 N
+ OW IY P b n/a 26 3633 3675 3719 N
+ OW IY P e n/a 26 3612 3675 3719 N
+ OW IY P i n/a 26 3612 3675 3719 N
+ OW IY P s n/a 26 3612 3675 3719 N
+ OW IY R b n/a 26 3644 3696 3736 N
+ OW IY R e n/a 26 3643 3698 3736 N
+ OW IY R i n/a 26 3643 3698 3736 N
+ OW IY R s n/a 26 3643 3698 3736 N
+ OW IY S b n/a 26 3633 3667 3709 N
+ OW IY S e n/a 26 3613 3667 3709 N
+ OW IY S i n/a 26 3613 3667 3709 N
+ OW IY S s n/a 26 3613 3667 3709 N
+ OW IY SH b n/a 26 3633 3667 3711 N
+ OW IY SH e n/a 26 3613 3667 3711 N
+ OW IY SH i n/a 26 3613 3667 3711 N
+ OW IY SH s n/a 26 3613 3667 3711 N
+ OW IY SIL e n/a 26 3612 3685 3725 N
+ OW IY SIL s n/a 26 3612 3683 3725 N
+ OW IY T b n/a 26 3633 3667 3706 N
+ OW IY T e n/a 26 3612 3667 3706 N
+ OW IY T i n/a 26 3612 3667 3706 N
+ OW IY T s n/a 26 3612 3667 3706 N
+ OW IY TH b n/a 26 3633 3667 3710 N
+ OW IY TH e n/a 26 3612 3667 3710 N
+ OW IY TH i n/a 26 3612 3667 3710 N
+ OW IY TH s n/a 26 3612 3667 3710 N
+ OW IY UH b n/a 26 3633 3704 3736 N
+ OW IY UH e n/a 26 3612 3702 3736 N
+ OW IY UH s n/a 26 3618 3704 3736 N
+ OW IY UW e n/a 26 3612 3702 3735 N
+ OW IY UW s n/a 26 3618 3704 3735 N
+ OW IY V b n/a 26 3633 3677 3720 N
+ OW IY V e n/a 26 3612 3677 3720 N
+ OW IY V i n/a 26 3612 3677 3720 N
+ OW IY V s n/a 26 3612 3677 3720 N
+ OW IY W b n/a 26 3633 3677 3728 N
+ OW IY W e n/a 26 3612 3677 3737 N
+ OW IY W i n/a 26 3618 3677 3727 N
+ OW IY W s n/a 26 3618 3677 3727 N
+ OW IY Y b n/a 26 3633 3667 3707 N
+ OW IY Y e n/a 26 3612 3667 3707 N
+ OW IY Y i n/a 26 3618 3667 3707 N
+ OW IY Y s n/a 26 3618 3667 3707 N
+ OW IY Z b n/a 26 3633 3664 3712 N
+ OW IY Z e n/a 26 3613 3664 3712 N
+ OW IY Z i n/a 26 3613 3665 3712 N
+ OW IY Z s n/a 26 3613 3664 3712 N
+ OW IY ZH b n/a 26 3633 3664 3712 N
+ OW IY ZH e n/a 26 3613 3664 3712 N
+ OW IY ZH s n/a 26 3613 3664 3712 N
+ OW JH AA b n/a 26 3630 3704 3735 N
+ OW JH AA e n/a 26 3612 3702 3735 N
+ OW JH AA s n/a 26 3618 3704 3735 N
+ OW JH AE e n/a 26 3612 3702 3724 N
+ OW JH AE i n/a 26 3618 3704 3724 N
+ OW JH AE s n/a 26 3618 3704 3724 N
+ OW JH AH b n/a 26 3630 3704 3721 N
+ OW JH AH e n/a 26 3612 3702 3721 N
+ OW JH AH i n/a 26 3618 3704 3724 N
+ OW JH AH s n/a 26 3618 3704 3721 N
+ OW JH AO b n/a 26 3630 3704 3735 N
+ OW JH AO e n/a 26 3612 3702 3735 N
+ OW JH AO s n/a 26 3618 3704 3735 N
+ OW JH AW b n/a 26 3630 3704 3736 N
+ OW JH AW e n/a 26 3612 3702 3736 N
+ OW JH AW s n/a 26 3618 3704 3736 N
+ OW JH AY e n/a 26 3612 3702 3721 N
+ OW JH AY s n/a 26 3618 3704 3721 N
+ OW JH B b n/a 26 3631 3675 3718 N
+ OW JH B e n/a 26 3612 3675 3718 N
+ OW JH B i n/a 26 3612 3675 3718 N
+ OW JH B s n/a 26 3612 3675 3718 N
+ OW JH CH b n/a 26 3631 3667 3706 N
+ OW JH CH e n/a 26 3612 3667 3706 N
+ OW JH CH s n/a 26 3612 3667 3706 N
+ OW JH D b n/a 26 3631 3667 3705 N
+ OW JH D e n/a 26 3612 3667 3705 N
+ OW JH D i n/a 26 3612 3667 3705 N
+ OW JH D s n/a 26 3612 3667 3705 N
+ OW JH DH b n/a 26 3631 3664 3713 N
+ OW JH DH e n/a 26 3612 3664 3713 N
+ OW JH DH s n/a 26 3612 3664 3713 N
+ OW JH EH b n/a 26 3630 3704 3724 N
+ OW JH EH e n/a 26 3612 3702 3724 N
+ OW JH EH i n/a 26 3618 3704 3724 N
+ OW JH EH s n/a 26 3618 3704 3724 N
+ OW JH ER b n/a 26 3630 3704 3736 N
+ OW JH ER e n/a 26 3612 3702 3736 N
+ OW JH ER i n/a 26 3618 3704 3736 N
+ OW JH ER s n/a 26 3618 3704 3736 N
+ OW JH EY b n/a 26 3630 3704 3724 N
+ OW JH EY e n/a 26 3612 3702 3724 N
+ OW JH EY s n/a 26 3618 3704 3724 N
+ OW JH F b n/a 26 3631 3676 3717 N
+ OW JH F e n/a 26 3612 3677 3717 N
+ OW JH F s n/a 26 3612 3677 3717 N
+ OW JH G b n/a 26 3631 3678 3716 N
+ OW JH G e n/a 26 3612 3678 3716 N
+ OW JH G s n/a 26 3612 3678 3716 N
+ OW JH HH b n/a 26 3630 3676 3723 N
+ OW JH HH e n/a 26 3612 3677 3723 N
+ OW JH HH i n/a 26 3612 3677 3723 N
+ OW JH HH s n/a 26 3612 3677 3723 N
+ OW JH IH b n/a 26 3630 3704 3715 N
+ OW JH IH e n/a 26 3612 3702 3715 N
+ OW JH IH s n/a 26 3618 3704 3715 N
+ OW JH IY b n/a 26 3630 3704 3715 N
+ OW JH IY e n/a 26 3612 3702 3715 N
+ OW JH IY i n/a 26 3618 3700 3715 N
+ OW JH IY s n/a 26 3618 3704 3715 N
+ OW JH JH b n/a 26 3631 3667 3705 N
+ OW JH JH e n/a 26 3612 3667 3705 N
+ OW JH JH i n/a 26 3612 3667 3705 N
+ OW JH JH s n/a 26 3612 3667 3705 N
+ OW JH K b n/a 26 3631 3678 3716 N
+ OW JH K e n/a 26 3612 3678 3716 N
+ OW JH K i n/a 26 3612 3678 3716 N
+ OW JH K s n/a 26 3612 3678 3716 N
+ OW JH L b n/a 26 3643 3689 3728 N
+ OW JH L e n/a 26 3643 3687 3738 N
+ OW JH L i n/a 26 3643 3687 3727 N
+ OW JH L s n/a 26 3643 3687 3727 N
+ OW JH M b n/a 26 3630 3689 3732 N
+ OW JH M e n/a 26 3612 3689 3732 N
+ OW JH M i n/a 26 3612 3689 3732 N
+ OW JH M s n/a 26 3612 3689 3732 N
+ OW JH N b n/a 26 3630 3688 3733 N
+ OW JH N e n/a 26 3612 3686 3731 N
+ OW JH N i n/a 26 3612 3686 3730 N
+ OW JH N s n/a 26 3612 3686 3731 N
+ OW JH NG e n/a 26 3612 3686 3731 N
+ OW JH NG i n/a 26 3612 3686 3730 N
+ OW JH NG s n/a 26 3612 3686 3731 N
+ OW JH OW e n/a 26 3612 3702 3735 N
+ OW JH OW i n/a 26 3618 3704 3735 N
+ OW JH OW s n/a 26 3618 3704 3735 N
+ OW JH OY b n/a 26 3630 3704 3721 N
+ OW JH OY e n/a 26 3612 3702 3721 N
+ OW JH OY s n/a 26 3618 3704 3721 N
+ OW JH P b n/a 26 3631 3675 3719 N
+ OW JH P e n/a 26 3612 3675 3719 N
+ OW JH P i n/a 26 3612 3675 3719 N
+ OW JH P s n/a 26 3612 3675 3719 N
+ OW JH R b n/a 26 3643 3696 3736 N
+ OW JH R e n/a 26 3643 3698 3736 N
+ OW JH R i n/a 26 3643 3698 3736 N
+ OW JH R s n/a 26 3643 3698 3736 N
+ OW JH S b n/a 26 3631 3667 3709 N
+ OW JH S e n/a 26 3613 3667 3709 N
+ OW JH S i n/a 26 3613 3667 3709 N
+ OW JH S s n/a 26 3613 3667 3709 N
+ OW JH SH b n/a 26 3631 3667 3711 N
+ OW JH SH e n/a 26 3613 3667 3711 N
+ OW JH SH i n/a 26 3613 3667 3711 N
+ OW JH SH s n/a 26 3613 3667 3711 N
+ OW JH SIL e n/a 26 3612 3685 3725 N
+ OW JH SIL s n/a 26 3612 3683 3725 N
+ OW JH T b n/a 26 3631 3667 3706 N
+ OW JH T e n/a 26 3612 3667 3706 N
+ OW JH T i n/a 26 3612 3667 3706 N
+ OW JH T s n/a 26 3612 3667 3706 N
+ OW JH TH b n/a 26 3631 3667 3710 N
+ OW JH TH e n/a 26 3612 3667 3710 N
+ OW JH TH s n/a 26 3612 3667 3710 N
+ OW JH UH b n/a 26 3630 3704 3736 N
+ OW JH UH e n/a 26 3612 3702 3736 N
+ OW JH UH s n/a 26 3618 3704 3736 N
+ OW JH UW e n/a 26 3612 3702 3735 N
+ OW JH UW s n/a 26 3618 3704 3735 N
+ OW JH V b n/a 26 3631 3676 3720 N
+ OW JH V e n/a 26 3612 3677 3720 N
+ OW JH V i n/a 26 3612 3677 3720 N
+ OW JH V s n/a 26 3612 3677 3720 N
+ OW JH W b n/a 26 3630 3676 3728 N
+ OW JH W e n/a 26 3612 3677 3737 N
+ OW JH W s n/a 26 3618 3677 3727 N
+ OW JH Y b n/a 26 3630 3667 3707 N
+ OW JH Y e n/a 26 3612 3667 3707 N
+ OW JH Y i n/a 26 3618 3667 3707 N
+ OW JH Y s n/a 26 3618 3667 3707 N
+ OW JH Z b n/a 26 3631 3664 3712 N
+ OW JH Z e n/a 26 3613 3664 3712 N
+ OW JH Z i n/a 26 3613 3665 3712 N
+ OW JH Z s n/a 26 3613 3664 3712 N
+ OW JH ZH b n/a 26 3631 3664 3712 N
+ OW JH ZH e n/a 26 3613 3664 3712 N
+ OW JH ZH s n/a 26 3613 3664 3712 N
+ OW K AA b n/a 26 3630 3704 3735 N
+ OW K AA e n/a 26 3625 3702 3735 N
+ OW K AA i n/a 26 3636 3704 3735 N
+ OW K AA s n/a 26 3630 3704 3735 N
+ OW K AE e n/a 26 3625 3702 3724 N
+ OW K AE i n/a 26 3626 3704 3724 N
+ OW K AE s n/a 26 3630 3704 3724 N
+ OW K AH b n/a 26 3630 3704 3721 N
+ OW K AH e n/a 26 3625 3702 3721 N
+ OW K AH i n/a 26 3626 3704 3724 N
+ OW K AH s n/a 26 3630 3704 3721 N
+ OW K AO b n/a 26 3630 3704 3735 N
+ OW K AO e n/a 26 3625 3702 3735 N
+ OW K AO i n/a 26 3636 3704 3735 N
+ OW K AO s n/a 26 3630 3704 3735 N
+ OW K AW b n/a 26 3630 3704 3736 N
+ OW K AW e n/a 26 3625 3702 3736 N
+ OW K AW i n/a 26 3626 3704 3736 N
+ OW K AW s n/a 26 3630 3704 3736 N
+ OW K AY e n/a 26 3625 3702 3721 N
+ OW K AY i n/a 26 3636 3704 3721 N
+ OW K AY s n/a 26 3630 3704 3721 N
+ OW K B b n/a 26 3631 3675 3718 N
+ OW K B e n/a 26 3625 3675 3718 N
+ OW K B i n/a 26 3625 3675 3718 N
+ OW K B s n/a 26 3631 3675 3718 N
+ OW K CH b n/a 26 3631 3668 3706 N
+ OW K CH e n/a 26 3625 3668 3706 N
+ OW K CH i n/a 26 3626 3668 3706 N
+ OW K CH s n/a 26 3631 3669 3706 N
+ OW K D b n/a 26 3631 3669 3705 N
+ OW K D e n/a 26 3625 3669 3705 N
+ OW K D i n/a 26 3626 3669 3705 N
+ OW K D s n/a 26 3631 3669 3705 N
+ OW K DH b n/a 26 3631 3664 3713 N
+ OW K DH e n/a 26 3625 3664 3713 N
+ OW K DH i n/a 26 3626 3665 3712 N
+ OW K DH s n/a 26 3631 3664 3713 N
+ OW K EH b n/a 26 3630 3704 3724 N
+ OW K EH e n/a 26 3625 3702 3724 N
+ OW K EH i n/a 26 3626 3704 3724 N
+ OW K EH s n/a 26 3630 3704 3724 N
+ OW K ER b n/a 26 3630 3704 3736 N
+ OW K ER e n/a 26 3625 3702 3736 N
+ OW K ER i n/a 26 3636 3704 3736 N
+ OW K ER s n/a 26 3630 3704 3736 N
+ OW K EY b n/a 26 3630 3704 3724 N
+ OW K EY e n/a 26 3625 3702 3724 N
+ OW K EY i n/a 26 3626 3704 3724 N
+ OW K EY s n/a 26 3630 3704 3724 N
+ OW K F b n/a 26 3631 3677 3717 N
+ OW K F e n/a 26 3625 3677 3717 N
+ OW K F i n/a 26 3625 3677 3717 N
+ OW K F s n/a 26 3631 3677 3717 N
+ OW K G b n/a 26 3631 3678 3716 N
+ OW K G e n/a 26 3625 3678 3716 N
+ OW K G i n/a 26 3626 3678 3716 N
+ OW K G s n/a 26 3631 3678 3716 N
+ OW K HH b n/a 26 3630 3677 3723 N
+ OW K HH e n/a 26 3625 3677 3723 N
+ OW K HH i n/a 26 3626 3677 3723 N
+ OW K HH s n/a 26 3630 3677 3723 N
+ OW K IH b n/a 26 3630 3704 3715 N
+ OW K IH e n/a 26 3625 3702 3715 N
+ OW K IH i n/a 26 3626 3701 3715 N
+ OW K IH s n/a 26 3630 3704 3715 N
+ OW K IY b n/a 26 3630 3704 3715 N
+ OW K IY e n/a 26 3625 3702 3715 N
+ OW K IY i n/a 26 3626 3701 3715 N
+ OW K IY s n/a 26 3630 3704 3715 N
+ OW K JH b n/a 26 3631 3669 3705 N
+ OW K JH e n/a 26 3625 3669 3705 N
+ OW K JH i n/a 26 3626 3669 3705 N
+ OW K JH s n/a 26 3631 3669 3705 N
+ OW K K b n/a 26 3631 3678 3716 N
+ OW K K e n/a 26 3625 3678 3716 N
+ OW K K i n/a 26 3626 3678 3716 N
+ OW K K s n/a 26 3631 3678 3716 N
+ OW K L b n/a 26 3638 3692 3729 N
+ OW K L e n/a 26 3638 3692 3738 N
+ OW K L i n/a 26 3640 3692 3729 N
+ OW K L s n/a 26 3638 3692 3729 N
+ OW K M b n/a 26 3630 3689 3732 N
+ OW K M e n/a 26 3625 3689 3732 N
+ OW K M i n/a 26 3626 3689 3732 N
+ OW K M s n/a 26 3630 3689 3732 N
+ OW K N b n/a 26 3630 3688 3733 N
+ OW K N e n/a 26 3625 3686 3731 N
+ OW K N i n/a 26 3626 3686 3730 N
+ OW K N s n/a 26 3630 3686 3731 N
+ OW K NG e n/a 26 3625 3686 3731 N
+ OW K NG s n/a 26 3630 3686 3731 N
+ OW K OW e n/a 26 3625 3702 3735 N
+ OW K OW i n/a 26 3636 3704 3735 N
+ OW K OW s n/a 26 3630 3704 3735 N
+ OW K OY b n/a 26 3630 3704 3721 N
+ OW K OY e n/a 26 3625 3702 3721 N
+ OW K OY s n/a 26 3630 3704 3721 N
+ OW K P b n/a 26 3631 3675 3719 N
+ OW K P e n/a 26 3625 3675 3719 N
+ OW K P i n/a 26 3625 3675 3719 N
+ OW K P s n/a 26 3631 3675 3719 N
+ OW K R b n/a 26 3643 3696 3736 N
+ OW K R e n/a 26 3643 3698 3736 N
+ OW K R i n/a 26 3643 3698 3736 N
+ OW K R s n/a 26 3643 3698 3736 N
+ OW K S b n/a 26 3631 3668 3709 N
+ OW K S e n/a 26 3625 3668 3709 N
+ OW K S i n/a 26 3626 3668 3709 N
+ OW K S s n/a 26 3631 3669 3709 N
+ OW K SH b n/a 26 3631 3668 3711 N
+ OW K SH e n/a 26 3625 3668 3711 N
+ OW K SH i n/a 26 3626 3668 3711 N
+ OW K SH s n/a 26 3631 3669 3711 N
+ OW K SIL e n/a 26 3625 3685 3725 N
+ OW K SIL s n/a 26 3630 3683 3725 N
+ OW K T b n/a 26 3631 3668 3706 N
+ OW K T e n/a 26 3625 3668 3706 N
+ OW K T i n/a 26 3626 3668 3706 N
+ OW K T s n/a 26 3631 3669 3706 N
+ OW K TH b n/a 26 3631 3668 3710 N
+ OW K TH e n/a 26 3625 3668 3710 N
+ OW K TH i n/a 26 3626 3668 3710 N
+ OW K TH s n/a 26 3631 3669 3710 N
+ OW K UH b n/a 26 3630 3704 3736 N
+ OW K UH e n/a 26 3625 3702 3736 N
+ OW K UH i n/a 26 3636 3701 3736 N
+ OW K UH s n/a 26 3630 3704 3736 N
+ OW K UW e n/a 26 3625 3702 3735 N
+ OW K UW s n/a 26 3630 3704 3735 N
+ OW K V b n/a 26 3631 3677 3720 N
+ OW K V e n/a 26 3625 3677 3720 N
+ OW K V i n/a 26 3625 3677 3720 N
+ OW K V s n/a 26 3631 3677 3720 N
+ OW K W b n/a 26 3630 3677 3729 N
+ OW K W e n/a 26 3625 3677 3737 N
+ OW K W i n/a 26 3636 3677 3729 N
+ OW K W s n/a 26 3630 3677 3729 N
+ OW K Y b n/a 26 3630 3669 3707 N
+ OW K Y e n/a 26 3625 3669 3707 N
+ OW K Y i n/a 26 3626 3669 3707 N
+ OW K Y s n/a 26 3630 3669 3707 N
+ OW K Z b n/a 26 3631 3664 3712 N
+ OW K Z e n/a 26 3625 3664 3712 N
+ OW K Z i n/a 26 3626 3665 3712 N
+ OW K Z s n/a 26 3631 3664 3712 N
+ OW K ZH b n/a 26 3631 3664 3712 N
+ OW K ZH e n/a 26 3625 3664 3712 N
+ OW K ZH i n/a 26 3626 3665 3712 N
+ OW K ZH s n/a 26 3631 3664 3712 N
+ OW L AA b n/a 26 3658 3704 3735 N
+ OW L AA e n/a 26 3657 3704 3735 N
+ OW L AA i n/a 26 3658 3704 3735 N
+ OW L AA s n/a 26 3658 3704 3735 N
+ OW L AE e n/a 26 3657 3704 3724 N
+ OW L AE i n/a 26 3658 3704 3724 N
+ OW L AE s n/a 26 3658 3704 3724 N
+ OW L AH b n/a 26 3658 3704 3721 N
+ OW L AH e n/a 26 3657 3704 3721 N
+ OW L AH i n/a 26 3658 3704 3724 N
+ OW L AH s n/a 26 3658 3704 3721 N
+ OW L AO b n/a 26 3658 3704 3735 N
+ OW L AO e n/a 26 3657 3704 3735 N
+ OW L AO s n/a 26 3658 3704 3735 N
+ OW L AW b n/a 26 3658 3704 3736 N
+ OW L AW e n/a 26 3657 3704 3736 N
+ OW L AW i n/a 26 3658 3704 3736 N
+ OW L AW s n/a 26 3658 3704 3736 N
+ OW L AY e n/a 26 3657 3704 3721 N
+ OW L AY i n/a 26 3658 3704 3721 N
+ OW L AY s n/a 26 3658 3704 3721 N
+ OW L B b n/a 26 3656 3675 3718 N
+ OW L B e n/a 26 3657 3676 3718 N
+ OW L B i n/a 26 3656 3676 3718 N
+ OW L B s n/a 26 3656 3676 3718 N
+ OW L CH b n/a 26 3656 3673 3706 N
+ OW L CH e n/a 26 3657 3673 3706 N
+ OW L CH i n/a 26 3655 3673 3706 N
+ OW L CH s n/a 26 3656 3673 3706 N
+ OW L D b n/a 26 3655 3673 3705 N
+ OW L D e n/a 26 3655 3673 3705 N
+ OW L D i n/a 26 3655 3673 3705 N
+ OW L D s n/a 26 3655 3673 3705 N
+ OW L DH b n/a 26 3655 3673 3713 N
+ OW L DH e n/a 26 3655 3673 3713 N
+ OW L DH i n/a 26 3655 3673 3712 N
+ OW L DH s n/a 26 3655 3673 3713 N
+ OW L EH b n/a 26 3658 3704 3724 N
+ OW L EH e n/a 26 3657 3704 3724 N
+ OW L EH i n/a 26 3658 3704 3724 N
+ OW L EH s n/a 26 3658 3704 3724 N
+ OW L ER b n/a 26 3658 3704 3736 N
+ OW L ER e n/a 26 3657 3704 3736 N
+ OW L ER i n/a 26 3658 3704 3736 N
+ OW L ER s n/a 26 3658 3704 3736 N
+ OW L EY b n/a 26 3658 3704 3724 N
+ OW L EY e n/a 26 3657 3704 3724 N
+ OW L EY s n/a 26 3658 3704 3724 N
+ OW L F b n/a 26 3656 3676 3717 N
+ OW L F e n/a 26 3657 3677 3717 N
+ OW L F i n/a 26 3655 3677 3717 N
+ OW L F s n/a 26 3656 3677 3717 N
+ OW L G b n/a 26 3656 3678 3716 N
+ OW L G e n/a 26 3657 3678 3716 N
+ OW L G i n/a 26 3656 3678 3716 N
+ OW L G s n/a 26 3656 3678 3716 N
+ OW L HH b n/a 26 3656 3676 3723 N
+ OW L HH e n/a 26 3657 3677 3723 N
+ OW L HH i n/a 26 3655 3677 3723 N
+ OW L HH s n/a 26 3656 3677 3723 N
+ OW L IH b n/a 26 3658 3704 3715 N
+ OW L IH e n/a 26 3657 3704 3715 N
+ OW L IH i n/a 26 3658 3700 3714 N
+ OW L IH s n/a 26 3658 3704 3715 N
+ OW L IY b n/a 26 3658 3704 3715 N
+ OW L IY e n/a 26 3657 3704 3715 N
+ OW L IY i n/a 26 3658 3700 3715 N
+ OW L IY s n/a 26 3658 3704 3715 N
+ OW L JH b n/a 26 3656 3673 3705 N
+ OW L JH e n/a 26 3657 3673 3705 N
+ OW L JH i n/a 26 3655 3673 3705 N
+ OW L JH s n/a 26 3656 3673 3705 N
+ OW L K b n/a 26 3656 3678 3716 N
+ OW L K e n/a 26 3657 3678 3716 N
+ OW L K i n/a 26 3656 3678 3716 N
+ OW L K s n/a 26 3656 3678 3716 N
+ OW L L b n/a 26 3642 3694 3727 N
+ OW L L e n/a 26 3648 3693 3738 N
+ OW L L i n/a 26 3648 3693 3727 N
+ OW L L s n/a 26 3648 3693 3727 N
+ OW L M b n/a 26 3658 3689 3732 N
+ OW L M e n/a 26 3657 3689 3732 N
+ OW L M i n/a 26 3658 3689 3732 N
+ OW L M s n/a 26 3658 3689 3732 N
+ OW L N b n/a 26 3658 3688 3733 N
+ OW L N e n/a 26 3657 3691 3731 N
+ OW L N i n/a 26 3657 3691 3730 N
+ OW L N s n/a 26 3657 3691 3731 N
+ OW L NG e n/a 26 3657 3690 3731 N
+ OW L NG i n/a 26 3658 3690 3730 N
+ OW L NG s n/a 26 3658 3690 3731 N
+ OW L OW e n/a 26 3657 3704 3735 N
+ OW L OW i n/a 26 3658 3704 3735 N
+ OW L OW s n/a 26 3658 3704 3735 N
+ OW L OY b n/a 26 3658 3704 3721 N
+ OW L OY e n/a 26 3657 3704 3721 N
+ OW L OY s n/a 26 3658 3704 3721 N
+ OW L P b n/a 26 3656 3675 3719 N
+ OW L P e n/a 26 3657 3676 3719 N
+ OW L P i n/a 26 3656 3676 3719 N
+ OW L P s n/a 26 3656 3676 3719 N
+ OW L R b n/a 26 3642 3696 3736 N
+ OW L R e n/a 26 3648 3698 3736 N
+ OW L R i n/a 26 3648 3698 3736 N
+ OW L R s n/a 26 3648 3698 3736 N
+ OW L S b n/a 26 3655 3673 3709 N
+ OW L S e n/a 26 3655 3673 3709 N
+ OW L S i n/a 26 3655 3673 3709 N
+ OW L S s n/a 26 3655 3673 3709 N
+ OW L SH b n/a 26 3656 3673 3711 N
+ OW L SH e n/a 26 3657 3673 3711 N
+ OW L SH i n/a 26 3655 3673 3711 N
+ OW L SH s n/a 26 3656 3673 3711 N
+ OW L SIL e n/a 26 3657 3683 3725 N
+ OW L SIL s n/a 26 3656 3683 3725 N
+ OW L T b n/a 26 3655 3673 3706 N
+ OW L T e n/a 26 3655 3673 3706 N
+ OW L T i n/a 26 3655 3673 3706 N
+ OW L T s n/a 26 3655 3673 3706 N
+ OW L TH b n/a 26 3655 3673 3710 N
+ OW L TH e n/a 26 3655 3673 3710 N
+ OW L TH i n/a 26 3655 3673 3710 N
+ OW L TH s n/a 26 3655 3673 3710 N
+ OW L UH b n/a 26 3658 3704 3736 N
+ OW L UH e n/a 26 3657 3704 3736 N
+ OW L UH s n/a 26 3658 3704 3736 N
+ OW L UW e n/a 26 3657 3704 3735 N
+ OW L UW s n/a 26 3658 3704 3735 N
+ OW L V b n/a 26 3656 3676 3720 N
+ OW L V e n/a 26 3657 3677 3720 N
+ OW L V i n/a 26 3655 3677 3720 N
+ OW L V s n/a 26 3656 3677 3720 N
+ OW L W b n/a 26 3658 3676 3727 N
+ OW L W e n/a 26 3657 3677 3737 N
+ OW L W i n/a 26 3658 3677 3727 N
+ OW L W s n/a 26 3658 3677 3727 N
+ OW L Y b n/a 26 3658 3673 3707 N
+ OW L Y e n/a 26 3657 3673 3707 N
+ OW L Y i n/a 26 3658 3673 3707 N
+ OW L Y s n/a 26 3658 3673 3707 N
+ OW L Z b n/a 26 3655 3673 3712 N
+ OW L Z e n/a 26 3655 3673 3712 N
+ OW L Z i n/a 26 3655 3673 3712 N
+ OW L Z s n/a 26 3655 3673 3712 N
+ OW L ZH b n/a 26 3656 3673 3712 N
+ OW L ZH e n/a 26 3657 3673 3712 N
+ OW L ZH i n/a 26 3655 3673 3712 N
+ OW L ZH s n/a 26 3656 3673 3712 N
+ OW M AA b n/a 26 3653 3704 3735 N
+ OW M AA e n/a 26 3653 3703 3735 N
+ OW M AA i n/a 26 3654 3704 3735 N
+ OW M AA s n/a 26 3653 3704 3735 N
+ OW M AE e n/a 26 3653 3703 3724 N
+ OW M AE i n/a 26 3654 3704 3724 N
+ OW M AE s n/a 26 3653 3704 3724 N
+ OW M AH b n/a 26 3653 3704 3721 N
+ OW M AH e n/a 26 3653 3703 3721 N
+ OW M AH i n/a 26 3654 3704 3724 N
+ OW M AH s n/a 26 3653 3704 3721 N
+ OW M AO b n/a 26 3653 3704 3735 N
+ OW M AO e n/a 26 3653 3703 3735 N
+ OW M AO s n/a 26 3653 3704 3735 N
+ OW M AW b n/a 26 3653 3704 3736 N
+ OW M AW e n/a 26 3653 3703 3736 N
+ OW M AW s n/a 26 3653 3704 3736 N
+ OW M AY e n/a 26 3653 3703 3721 N
+ OW M AY i n/a 26 3654 3704 3721 N
+ OW M AY s n/a 26 3653 3704 3721 N
+ OW M B b n/a 26 3653 3675 3718 N
+ OW M B e n/a 26 3653 3676 3718 N
+ OW M B i n/a 26 3654 3676 3718 N
+ OW M B s n/a 26 3653 3676 3718 N
+ OW M CH b n/a 26 3653 3674 3705 N
+ OW M CH e n/a 26 3653 3674 3705 N
+ OW M CH i n/a 26 3654 3674 3705 N
+ OW M CH s n/a 26 3653 3674 3705 N
+ OW M D b n/a 26 3653 3674 3705 N
+ OW M D e n/a 26 3653 3674 3705 N
+ OW M D i n/a 26 3654 3674 3705 N
+ OW M D s n/a 26 3653 3674 3705 N
+ OW M DH b n/a 26 3653 3674 3713 N
+ OW M DH e n/a 26 3653 3674 3713 N
+ OW M DH s n/a 26 3653 3674 3713 N
+ OW M EH b n/a 26 3653 3704 3724 N
+ OW M EH e n/a 26 3653 3703 3724 N
+ OW M EH i n/a 26 3654 3704 3724 N
+ OW M EH s n/a 26 3653 3704 3724 N
+ OW M ER b n/a 26 3653 3704 3736 N
+ OW M ER e n/a 26 3653 3703 3736 N
+ OW M ER i n/a 26 3654 3704 3736 N
+ OW M ER s n/a 26 3653 3704 3736 N
+ OW M EY b n/a 26 3653 3704 3724 N
+ OW M EY e n/a 26 3653 3703 3724 N
+ OW M EY i n/a 26 3654 3704 3724 N
+ OW M EY s n/a 26 3653 3704 3724 N
+ OW M F b n/a 26 3653 3676 3717 N
+ OW M F e n/a 26 3653 3677 3717 N
+ OW M F i n/a 26 3654 3677 3717 N
+ OW M F s n/a 26 3653 3677 3717 N
+ OW M G b n/a 26 3653 3678 3716 N
+ OW M G e n/a 26 3653 3678 3716 N
+ OW M G i n/a 26 3654 3678 3716 N
+ OW M G s n/a 26 3653 3678 3716 N
+ OW M HH b n/a 26 3653 3676 3722 N
+ OW M HH e n/a 26 3653 3677 3722 N
+ OW M HH i n/a 26 3654 3677 3722 N
+ OW M HH s n/a 26 3653 3677 3722 N
+ OW M IH b n/a 26 3653 3704 3715 N
+ OW M IH e n/a 26 3653 3703 3715 N
+ OW M IH i n/a 26 3654 3700 3714 N
+ OW M IH s n/a 26 3653 3704 3715 N
+ OW M IY b n/a 26 3653 3704 3715 N
+ OW M IY e n/a 26 3653 3703 3715 N
+ OW M IY i n/a 26 3654 3700 3715 N
+ OW M IY s n/a 26 3653 3704 3715 N
+ OW M JH b n/a 26 3653 3674 3705 N
+ OW M JH e n/a 26 3653 3674 3705 N
+ OW M JH i n/a 26 3654 3674 3705 N
+ OW M JH s n/a 26 3653 3674 3705 N
+ OW M K b n/a 26 3653 3678 3716 N
+ OW M K e n/a 26 3653 3678 3716 N
+ OW M K i n/a 26 3654 3678 3716 N
+ OW M K s n/a 26 3653 3678 3716 N
+ OW M L b n/a 26 3638 3692 3729 N
+ OW M L e n/a 26 3638 3692 3738 N
+ OW M L i n/a 26 3638 3692 3729 N
+ OW M L s n/a 26 3638 3692 3729 N
+ OW M M b n/a 26 3653 3690 3732 N
+ OW M M e n/a 26 3653 3690 3732 N
+ OW M M i n/a 26 3653 3690 3732 N
+ OW M M s n/a 26 3653 3690 3732 N
+ OW M N b n/a 26 3653 3688 3733 N
+ OW M N e n/a 26 3653 3688 3731 N
+ OW M N i n/a 26 3653 3688 3730 N
+ OW M N s n/a 26 3653 3688 3731 N
+ OW M NG e n/a 26 3653 3689 3731 N
+ OW M NG i n/a 26 3653 3689 3730 N
+ OW M NG s n/a 26 3653 3689 3731 N
+ OW M OW e n/a 26 3653 3703 3735 N
+ OW M OW s n/a 26 3653 3704 3735 N
+ OW M OY b n/a 26 3653 3704 3721 N
+ OW M OY e n/a 26 3653 3703 3721 N
+ OW M OY s n/a 26 3653 3704 3721 N
+ OW M P b n/a 26 3653 3675 3719 N
+ OW M P e n/a 26 3653 3676 3719 N
+ OW M P i n/a 26 3654 3676 3719 N
+ OW M P s n/a 26 3653 3676 3719 N
+ OW M R b n/a 26 3643 3696 3736 N
+ OW M R e n/a 26 3646 3698 3736 N
+ OW M R s n/a 26 3646 3698 3736 N
+ OW M S b n/a 26 3654 3674 3708 N
+ OW M S e n/a 26 3654 3674 3708 N
+ OW M S i n/a 26 3654 3674 3708 N
+ OW M S s n/a 26 3654 3674 3708 N
+ OW M SH b n/a 26 3653 3674 3711 N
+ OW M SH e n/a 26 3653 3674 3711 N
+ OW M SH i n/a 26 3654 3674 3711 N
+ OW M SH s n/a 26 3653 3674 3711 N
+ OW M SIL e n/a 26 3653 3684 3726 N
+ OW M SIL s n/a 26 3653 3684 3726 N
+ OW M T b n/a 26 3653 3674 3705 N
+ OW M T e n/a 26 3653 3674 3705 N
+ OW M T i n/a 26 3654 3674 3705 N
+ OW M T s n/a 26 3653 3674 3705 N
+ OW M TH b n/a 26 3653 3674 3710 N
+ OW M TH e n/a 26 3653 3674 3710 N
+ OW M TH i n/a 26 3654 3674 3710 N
+ OW M TH s n/a 26 3653 3674 3710 N
+ OW M UH b n/a 26 3653 3704 3736 N
+ OW M UH e n/a 26 3653 3703 3736 N
+ OW M UH s n/a 26 3653 3704 3736 N
+ OW M UW e n/a 26 3653 3703 3735 N
+ OW M UW s n/a 26 3653 3704 3735 N
+ OW M V b n/a 26 3653 3676 3720 N
+ OW M V e n/a 26 3653 3677 3720 N
+ OW M V i n/a 26 3654 3677 3720 N
+ OW M V s n/a 26 3653 3677 3720 N
+ OW M W b n/a 26 3653 3676 3729 N
+ OW M W e n/a 26 3653 3677 3737 N
+ OW M W s n/a 26 3653 3677 3729 N
+ OW M Y b n/a 26 3653 3674 3707 N
+ OW M Y e n/a 26 3653 3674 3707 N
+ OW M Y i n/a 26 3654 3674 3707 N
+ OW M Y s n/a 26 3653 3674 3707 N
+ OW M Z b n/a 26 3654 3674 3712 N
+ OW M Z e n/a 26 3654 3674 3712 N
+ OW M Z i n/a 26 3654 3674 3712 N
+ OW M Z s n/a 26 3654 3674 3712 N
+ OW M ZH b n/a 26 3653 3674 3712 N
+ OW M ZH e n/a 26 3653 3674 3712 N
+ OW M ZH i n/a 26 3654 3674 3712 N
+ OW M ZH s n/a 26 3653 3674 3712 N
+ OW N AA b n/a 26 3630 3703 3735 N
+ OW N AA e n/a 26 3621 3703 3735 N
+ OW N AA i n/a 26 3621 3703 3735 N
+ OW N AA s n/a 26 3621 3703 3735 N
+ OW N AE e n/a 26 3621 3703 3724 N
+ OW N AE s n/a 26 3621 3703 3724 N
+ OW N AH b n/a 26 3630 3703 3721 N
+ OW N AH e n/a 26 3621 3703 3721 N
+ OW N AH i n/a 26 3621 3703 3724 N
+ OW N AH s n/a 26 3621 3703 3721 N
+ OW N AO b n/a 26 3630 3703 3735 N
+ OW N AO e n/a 26 3621 3703 3735 N
+ OW N AO s n/a 26 3621 3703 3735 N
+ OW N AW b n/a 26 3630 3703 3736 N
+ OW N AW e n/a 26 3621 3703 3736 N
+ OW N AW s n/a 26 3621 3703 3736 N
+ OW N AY e n/a 26 3621 3703 3721 N
+ OW N AY s n/a 26 3621 3703 3721 N
+ OW N B b n/a 26 3631 3680 3718 N
+ OW N B e n/a 26 3621 3680 3718 N
+ OW N B i n/a 26 3621 3680 3718 N
+ OW N B s n/a 26 3621 3680 3718 N
+ OW N CH b n/a 26 3631 3682 3705 N
+ OW N CH e n/a 26 3619 3682 3705 N
+ OW N CH i n/a 26 3619 3682 3705 N
+ OW N CH s n/a 26 3619 3682 3705 N
+ OW N D b n/a 26 3631 3667 3705 N
+ OW N D e n/a 26 3619 3667 3705 N
+ OW N D i n/a 26 3619 3667 3705 N
+ OW N D s n/a 26 3619 3667 3705 N
+ OW N DH b n/a 26 3631 3664 3713 N
+ OW N DH e n/a 26 3619 3664 3713 N
+ OW N DH s n/a 26 3619 3664 3713 N
+ OW N EH b n/a 26 3630 3703 3724 N
+ OW N EH e n/a 26 3621 3703 3724 N
+ OW N EH i n/a 26 3621 3703 3724 N
+ OW N EH s n/a 26 3621 3703 3724 N
+ OW N ER b n/a 26 3630 3703 3736 N
+ OW N ER e n/a 26 3621 3703 3736 N
+ OW N ER i n/a 26 3621 3703 3736 N
+ OW N ER s n/a 26 3621 3703 3736 N
+ OW N EY b n/a 26 3630 3703 3724 N
+ OW N EY e n/a 26 3621 3703 3724 N
+ OW N EY i n/a 26 3621 3703 3724 N
+ OW N EY s n/a 26 3621 3703 3724 N
+ OW N F b n/a 26 3631 3680 3717 N
+ OW N F e n/a 26 3621 3680 3717 N
+ OW N F i n/a 26 3621 3680 3717 N
+ OW N F s n/a 26 3621 3680 3717 N
+ OW N G b n/a 26 3631 3680 3716 N
+ OW N G e n/a 26 3621 3680 3716 N
+ OW N G i n/a 26 3621 3680 3716 N
+ OW N G s n/a 26 3621 3680 3716 N
+ OW N HH b n/a 26 3630 3680 3722 N
+ OW N HH e n/a 26 3621 3680 3722 N
+ OW N HH i n/a 26 3621 3680 3722 N
+ OW N HH s n/a 26 3621 3680 3722 N
+ OW N IH b n/a 26 3630 3703 3715 N
+ OW N IH e n/a 26 3621 3703 3715 N
+ OW N IH i n/a 26 3621 3700 3714 N
+ OW N IH s n/a 26 3621 3703 3715 N
+ OW N IY b n/a 26 3630 3703 3715 N
+ OW N IY e n/a 26 3621 3703 3715 N
+ OW N IY i n/a 26 3621 3700 3715 N
+ OW N IY s n/a 26 3621 3703 3715 N
+ OW N JH b n/a 26 3631 3682 3705 N
+ OW N JH e n/a 26 3619 3682 3705 N
+ OW N JH i n/a 26 3619 3682 3705 N
+ OW N JH s n/a 26 3619 3682 3705 N
+ OW N K b n/a 26 3631 3680 3716 N
+ OW N K e n/a 26 3621 3680 3716 N
+ OW N K i n/a 26 3621 3680 3716 N
+ OW N K s n/a 26 3621 3680 3716 N
+ OW N L b n/a 26 3630 3695 3728 N
+ OW N L e n/a 26 3621 3698 3738 N
+ OW N L i n/a 26 3621 3695 3727 N
+ OW N L s n/a 26 3621 3695 3727 N
+ OW N M b n/a 26 3630 3696 3732 N
+ OW N M e n/a 26 3621 3698 3732 N
+ OW N M i n/a 26 3621 3697 3732 N
+ OW N M s n/a 26 3621 3698 3732 N
+ OW N N b n/a 26 3630 3696 3733 N
+ OW N N e n/a 26 3619 3697 3731 N
+ OW N N i n/a 26 3620 3697 3730 N
+ OW N N s n/a 26 3620 3697 3731 N
+ OW N NG e n/a 26 3621 3698 3731 N
+ OW N NG s n/a 26 3621 3698 3731 N
+ OW N OW e n/a 26 3621 3703 3735 N
+ OW N OW i n/a 26 3621 3703 3735 N
+ OW N OW s n/a 26 3621 3703 3735 N
+ OW N OY b n/a 26 3630 3703 3721 N
+ OW N OY e n/a 26 3621 3703 3721 N
+ OW N OY s n/a 26 3621 3703 3721 N
+ OW N P b n/a 26 3631 3680 3719 N
+ OW N P e n/a 26 3621 3680 3719 N
+ OW N P i n/a 26 3621 3680 3719 N
+ OW N P s n/a 26 3621 3680 3719 N
+ OW N R b n/a 26 3630 3696 3736 N
+ OW N R e n/a 26 3621 3698 3736 N
+ OW N R i n/a 26 3621 3697 3736 N
+ OW N R s n/a 26 3621 3698 3736 N
+ OW N S b n/a 26 3631 3667 3709 N
+ OW N S e n/a 26 3619 3667 3709 N
+ OW N S i n/a 26 3619 3667 3709 N
+ OW N S s n/a 26 3619 3667 3709 N
+ OW N SH b n/a 26 3631 3682 3711 N
+ OW N SH e n/a 26 3619 3682 3711 N
+ OW N SH i n/a 26 3619 3682 3711 N
+ OW N SH s n/a 26 3619 3682 3711 N
+ OW N SIL e n/a 26 3620 3684 3726 N
+ OW N SIL s n/a 26 3620 3684 3726 N
+ OW N T b n/a 26 3631 3667 3705 N
+ OW N T e n/a 26 3619 3667 3705 N
+ OW N T i n/a 26 3619 3667 3705 N
+ OW N T s n/a 26 3619 3667 3705 N
+ OW N TH b n/a 26 3631 3667 3710 N
+ OW N TH e n/a 26 3619 3667 3710 N
+ OW N TH i n/a 26 3619 3667 3710 N
+ OW N TH s n/a 26 3619 3667 3710 N
+ OW N UH b n/a 26 3630 3703 3736 N
+ OW N UH e n/a 26 3621 3703 3736 N
+ OW N UH s n/a 26 3621 3703 3736 N
+ OW N UW e n/a 26 3621 3703 3735 N
+ OW N UW i n/a 26 3621 3700 3735 N
+ OW N UW s n/a 26 3621 3703 3735 N
+ OW N V b n/a 26 3631 3680 3720 N
+ OW N V e n/a 26 3621 3680 3720 N
+ OW N V i n/a 26 3621 3680 3720 N
+ OW N V s n/a 26 3621 3680 3720 N
+ OW N W b n/a 26 3630 3680 3728 N
+ OW N W e n/a 26 3621 3680 3737 N
+ OW N W i n/a 26 3621 3680 3727 N
+ OW N W s n/a 26 3621 3680 3727 N
+ OW N Y b n/a 26 3630 3682 3707 N
+ OW N Y e n/a 26 3619 3682 3707 N
+ OW N Y i n/a 26 3619 3682 3707 N
+ OW N Y s n/a 26 3619 3682 3707 N
+ OW N Z b n/a 26 3631 3664 3712 N
+ OW N Z e n/a 26 3619 3664 3712 N
+ OW N Z i n/a 26 3619 3664 3712 N
+ OW N Z s n/a 26 3619 3664 3712 N
+ OW N ZH b n/a 26 3631 3682 3712 N
+ OW N ZH e n/a 26 3619 3682 3712 N
+ OW N ZH i n/a 26 3619 3682 3712 N
+ OW N ZH s n/a 26 3619 3682 3712 N
+ OW NG AA b n/a 26 3630 3704 3735 N
+ OW NG AA s n/a 26 3617 3704 3735 N
+ OW NG AE s n/a 26 3617 3704 3724 N
+ OW NG AH b n/a 26 3630 3704 3721 N
+ OW NG AH s n/a 26 3617 3704 3721 N
+ OW NG AO b n/a 26 3630 3704 3735 N
+ OW NG AO s n/a 26 3617 3704 3735 N
+ OW NG AW b n/a 26 3630 3704 3736 N
+ OW NG AW s n/a 26 3617 3704 3736 N
+ OW NG AY s n/a 26 3617 3704 3721 N
+ OW NG B b n/a 26 3631 3675 3718 N
+ OW NG B s n/a 26 3616 3675 3718 N
+ OW NG CH b n/a 26 3631 3667 3706 N
+ OW NG CH s n/a 26 3616 3667 3706 N
+ OW NG D b n/a 26 3631 3667 3705 N
+ OW NG D s n/a 26 3616 3667 3705 N
+ OW NG DH b n/a 26 3631 3664 3713 N
+ OW NG DH s n/a 26 3616 3664 3713 N
+ OW NG EH b n/a 26 3630 3704 3724 N
+ OW NG EH s n/a 26 3617 3704 3724 N
+ OW NG ER b n/a 26 3630 3704 3736 N
+ OW NG ER i n/a 26 3617 3704 3736 N
+ OW NG ER s n/a 26 3617 3704 3736 N
+ OW NG EY b n/a 26 3630 3704 3724 N
+ OW NG EY s n/a 26 3617 3704 3724 N
+ OW NG F b n/a 26 3631 3677 3717 N
+ OW NG F s n/a 26 3616 3677 3717 N
+ OW NG G b n/a 26 3631 3678 3716 N
+ OW NG G s n/a 26 3616 3678 3716 N
+ OW NG HH b n/a 26 3630 3677 3722 N
+ OW NG HH s n/a 26 3616 3677 3722 N
+ OW NG IH b n/a 26 3630 3704 3715 N
+ OW NG IH s n/a 26 3617 3704 3715 N
+ OW NG IY b n/a 26 3630 3704 3715 N
+ OW NG IY s n/a 26 3617 3704 3715 N
+ OW NG JH b n/a 26 3631 3667 3705 N
+ OW NG JH s n/a 26 3616 3667 3705 N
+ OW NG K b n/a 26 3631 3678 3716 N
+ OW NG K s n/a 26 3616 3678 3716 N
+ OW NG L b n/a 26 3638 3694 3729 N
+ OW NG L i n/a 26 3638 3694 3729 N
+ OW NG L s n/a 26 3638 3694 3729 N
+ OW NG M b n/a 26 3630 3689 3732 N
+ OW NG M s n/a 26 3616 3689 3732 N
+ OW NG N b n/a 26 3630 3688 3733 N
+ OW NG N s n/a 26 3616 3686 3731 N
+ OW NG NG s n/a 26 3616 3686 3731 N
+ OW NG OW s n/a 26 3617 3704 3735 N
+ OW NG OY b n/a 26 3630 3704 3721 N
+ OW NG OY s n/a 26 3617 3704 3721 N
+ OW NG P b n/a 26 3631 3675 3719 N
+ OW NG P s n/a 26 3616 3675 3719 N
+ OW NG R b n/a 26 3643 3696 3736 N
+ OW NG R s n/a 26 3643 3698 3736 N
+ OW NG S b n/a 26 3631 3667 3709 N
+ OW NG S s n/a 26 3616 3667 3709 N
+ OW NG SH b n/a 26 3631 3667 3711 N
+ OW NG SH s n/a 26 3616 3667 3711 N
+ OW NG SIL s n/a 26 3614 3684 3726 N
+ OW NG T b n/a 26 3631 3667 3706 N
+ OW NG T s n/a 26 3616 3667 3706 N
+ OW NG TH b n/a 26 3631 3667 3710 N
+ OW NG TH s n/a 26 3616 3667 3710 N
+ OW NG UH b n/a 26 3630 3704 3736 N
+ OW NG UH s n/a 26 3617 3704 3736 N
+ OW NG UW s n/a 26 3617 3704 3735 N
+ OW NG V b n/a 26 3631 3677 3720 N
+ OW NG V i n/a 26 3616 3677 3720 N
+ OW NG V s n/a 26 3616 3677 3720 N
+ OW NG W b n/a 26 3630 3677 3729 N
+ OW NG W s n/a 26 3617 3677 3729 N
+ OW NG Y b n/a 26 3630 3667 3707 N
+ OW NG Y s n/a 26 3617 3667 3707 N
+ OW NG Z b n/a 26 3631 3664 3712 N
+ OW NG Z s n/a 26 3616 3664 3712 N
+ OW NG ZH b n/a 26 3631 3664 3712 N
+ OW NG ZH s n/a 26 3616 3664 3712 N
+ OW OW AA b n/a 26 3652 3704 3735 N
+ OW OW AA e n/a 26 3649 3704 3735 N
+ OW OW AA s n/a 26 3649 3704 3735 N
+ OW OW AE e n/a 26 3649 3704 3724 N
+ OW OW AE s n/a 26 3649 3704 3724 N
+ OW OW AH b n/a 26 3652 3704 3721 N
+ OW OW AH e n/a 26 3649 3704 3721 N
+ OW OW AH i n/a 26 3649 3704 3724 N
+ OW OW AH s n/a 26 3649 3704 3721 N
+ OW OW AO b n/a 26 3652 3704 3735 N
+ OW OW AO e n/a 26 3649 3704 3735 N
+ OW OW AO s n/a 26 3649 3704 3735 N
+ OW OW AW b n/a 26 3652 3704 3736 N
+ OW OW AW e n/a 26 3649 3704 3736 N
+ OW OW AW s n/a 26 3649 3704 3736 N
+ OW OW AY e n/a 26 3649 3704 3721 N
+ OW OW AY s n/a 26 3649 3704 3721 N
+ OW OW B b n/a 26 3652 3675 3718 N
+ OW OW B e n/a 26 3649 3675 3718 N
+ OW OW B s n/a 26 3649 3675 3718 N
+ OW OW CH b n/a 26 3652 3671 3706 N
+ OW OW CH e n/a 26 3649 3671 3706 N
+ OW OW CH s n/a 26 3652 3671 3706 N
+ OW OW D b n/a 26 3652 3671 3705 N
+ OW OW D e n/a 26 3649 3671 3705 N
+ OW OW D s n/a 26 3649 3671 3705 N
+ OW OW DH b n/a 26 3652 3672 3713 N
+ OW OW DH e n/a 26 3652 3672 3713 N
+ OW OW DH s n/a 26 3652 3672 3713 N
+ OW OW EH b n/a 26 3652 3704 3724 N
+ OW OW EH e n/a 26 3649 3704 3724 N
+ OW OW EH s n/a 26 3649 3704 3724 N
+ OW OW ER b n/a 26 3652 3704 3736 N
+ OW OW ER e n/a 26 3649 3704 3736 N
+ OW OW ER s n/a 26 3649 3704 3736 N
+ OW OW EY b n/a 26 3652 3704 3724 N
+ OW OW EY e n/a 26 3649 3704 3724 N
+ OW OW EY s n/a 26 3649 3704 3724 N
+ OW OW F b n/a 26 3652 3676 3717 N
+ OW OW F e n/a 26 3649 3677 3717 N
+ OW OW F s n/a 26 3652 3677 3717 N
+ OW OW G b n/a 26 3652 3678 3716 N
+ OW OW G e n/a 26 3649 3678 3716 N
+ OW OW G s n/a 26 3649 3678 3716 N
+ OW OW HH b n/a 26 3652 3676 3723 N
+ OW OW HH e n/a 26 3649 3677 3723 N
+ OW OW HH s n/a 26 3652 3677 3723 N
+ OW OW IH b n/a 26 3652 3704 3715 N
+ OW OW IH e n/a 26 3649 3704 3715 N
+ OW OW IH s n/a 26 3649 3704 3715 N
+ OW OW IY b n/a 26 3652 3704 3715 N
+ OW OW IY e n/a 26 3649 3704 3715 N
+ OW OW IY s n/a 26 3649 3704 3715 N
+ OW OW JH b n/a 26 3652 3671 3705 N
+ OW OW JH e n/a 26 3649 3671 3705 N
+ OW OW JH s n/a 26 3649 3671 3705 N
+ OW OW K b n/a 26 3652 3678 3716 N
+ OW OW K e n/a 26 3649 3678 3716 N
+ OW OW K s n/a 26 3652 3678 3716 N
+ OW OW L b n/a 26 3638 3692 3727 N
+ OW OW L e n/a 26 3638 3692 3738 N
+ OW OW L s n/a 26 3638 3692 3727 N
+ OW OW M b n/a 26 3652 3689 3732 N
+ OW OW M e n/a 26 3649 3689 3732 N
+ OW OW M s n/a 26 3652 3689 3732 N
+ OW OW N b n/a 26 3652 3688 3733 N
+ OW OW N e n/a 26 3649 3686 3731 N
+ OW OW N i n/a 26 3651 3686 3731 N
+ OW OW N s n/a 26 3652 3686 3731 N
+ OW OW NG e n/a 26 3649 3686 3731 N
+ OW OW NG s n/a 26 3652 3686 3731 N
+ OW OW OW e n/a 26 3649 3704 3735 N
+ OW OW OW s n/a 26 3649 3704 3735 N
+ OW OW OY b n/a 26 3652 3704 3721 N
+ OW OW OY e n/a 26 3649 3704 3721 N
+ OW OW OY s n/a 26 3649 3704 3721 N
+ OW OW P b n/a 26 3652 3675 3719 N
+ OW OW P e n/a 26 3649 3675 3719 N
+ OW OW P s n/a 26 3652 3675 3719 N
+ OW OW R b n/a 26 3643 3696 3736 N
+ OW OW R e n/a 26 3643 3698 3736 N
+ OW OW R s n/a 26 3643 3698 3736 N
+ OW OW S b n/a 26 3652 3671 3709 N
+ OW OW S e n/a 26 3649 3671 3709 N
+ OW OW S s n/a 26 3652 3671 3709 N
+ OW OW SH b n/a 26 3652 3671 3711 N
+ OW OW SH e n/a 26 3649 3671 3711 N
+ OW OW SH i n/a 26 3651 3671 3711 N
+ OW OW SH s n/a 26 3652 3671 3711 N
+ OW OW SIL e n/a 26 3649 3683 3725 N
+ OW OW SIL s n/a 26 3652 3683 3725 N
+ OW OW T b n/a 26 3652 3671 3706 N
+ OW OW T e n/a 26 3649 3671 3706 N
+ OW OW T s n/a 26 3652 3671 3706 N
+ OW OW TH b n/a 26 3652 3671 3710 N
+ OW OW TH e n/a 26 3652 3671 3710 N
+ OW OW TH s n/a 26 3652 3671 3710 N
+ OW OW UH b n/a 26 3652 3704 3736 N
+ OW OW UH e n/a 26 3649 3704 3736 N
+ OW OW UH s n/a 26 3649 3704 3736 N
+ OW OW UW e n/a 26 3649 3704 3735 N
+ OW OW UW s n/a 26 3649 3704 3735 N
+ OW OW V b n/a 26 3652 3676 3720 N
+ OW OW V e n/a 26 3649 3677 3720 N
+ OW OW V s n/a 26 3649 3677 3720 N
+ OW OW W b n/a 26 3652 3676 3727 N
+ OW OW W e n/a 26 3649 3677 3737 N
+ OW OW W s n/a 26 3649 3677 3727 N
+ OW OW Y b n/a 26 3652 3671 3707 N
+ OW OW Y e n/a 26 3649 3671 3707 N
+ OW OW Y s n/a 26 3649 3671 3707 N
+ OW OW Z b n/a 26 3652 3672 3712 N
+ OW OW Z e n/a 26 3649 3672 3712 N
+ OW OW Z s n/a 26 3649 3672 3712 N
+ OW OW ZH b n/a 26 3652 3672 3712 N
+ OW OW ZH e n/a 26 3649 3672 3712 N
+ OW OW ZH s n/a 26 3649 3672 3712 N
+ OW OY AA b n/a 26 3633 3704 3735 N
+ OW OY AA e n/a 26 3612 3702 3735 N
+ OW OY AA s n/a 26 3618 3704 3735 N
+ OW OY AE e n/a 26 3612 3702 3724 N
+ OW OY AE s n/a 26 3618 3704 3724 N
+ OW OY AH b n/a 26 3633 3704 3721 N
+ OW OY AH e n/a 26 3612 3702 3721 N
+ OW OY AH s n/a 26 3618 3704 3721 N
+ OW OY AO b n/a 26 3633 3704 3735 N
+ OW OY AO e n/a 26 3612 3702 3735 N
+ OW OY AO s n/a 26 3618 3704 3735 N
+ OW OY AW b n/a 26 3633 3704 3736 N
+ OW OY AW e n/a 26 3612 3702 3736 N
+ OW OY AW s n/a 26 3618 3704 3736 N
+ OW OY AY e n/a 26 3612 3702 3721 N
+ OW OY AY s n/a 26 3618 3704 3721 N
+ OW OY B b n/a 26 3633 3675 3718 N
+ OW OY B e n/a 26 3612 3675 3718 N
+ OW OY B s n/a 26 3612 3675 3718 N
+ OW OY CH b n/a 26 3633 3667 3706 N
+ OW OY CH e n/a 26 3612 3667 3706 N
+ OW OY CH s n/a 26 3612 3667 3706 N
+ OW OY D b n/a 26 3633 3667 3705 N
+ OW OY D e n/a 26 3612 3667 3705 N
+ OW OY D s n/a 26 3612 3667 3705 N
+ OW OY DH b n/a 26 3633 3664 3713 N
+ OW OY DH e n/a 26 3612 3664 3713 N
+ OW OY DH s n/a 26 3612 3664 3713 N
+ OW OY EH b n/a 26 3633 3704 3724 N
+ OW OY EH e n/a 26 3612 3702 3724 N
+ OW OY EH s n/a 26 3618 3704 3724 N
+ OW OY ER b n/a 26 3633 3704 3736 N
+ OW OY ER e n/a 26 3612 3702 3736 N
+ OW OY ER s n/a 26 3618 3704 3736 N
+ OW OY EY b n/a 26 3633 3704 3724 N
+ OW OY EY e n/a 26 3612 3702 3724 N
+ OW OY EY s n/a 26 3618 3704 3724 N
+ OW OY F b n/a 26 3633 3677 3717 N
+ OW OY F e n/a 26 3612 3677 3717 N
+ OW OY F s n/a 26 3612 3677 3717 N
+ OW OY G b n/a 26 3633 3678 3716 N
+ OW OY G e n/a 26 3612 3678 3716 N
+ OW OY G s n/a 26 3612 3678 3716 N
+ OW OY HH b n/a 26 3633 3677 3723 N
+ OW OY HH e n/a 26 3612 3677 3723 N
+ OW OY HH s n/a 26 3612 3677 3723 N
+ OW OY IH b n/a 26 3633 3704 3715 N
+ OW OY IH e n/a 26 3612 3702 3715 N
+ OW OY IH s n/a 26 3618 3704 3715 N
+ OW OY IY b n/a 26 3633 3704 3715 N
+ OW OY IY e n/a 26 3612 3702 3715 N
+ OW OY IY s n/a 26 3618 3704 3715 N
+ OW OY JH b n/a 26 3633 3667 3705 N
+ OW OY JH e n/a 26 3612 3667 3705 N
+ OW OY JH s n/a 26 3612 3667 3705 N
+ OW OY K b n/a 26 3633 3678 3716 N
+ OW OY K e n/a 26 3612 3678 3716 N
+ OW OY K s n/a 26 3612 3678 3716 N
+ OW OY L b n/a 26 3644 3695 3728 N
+ OW OY L e n/a 26 3643 3698 3738 N
+ OW OY L i n/a 26 3643 3695 3727 N
+ OW OY L s n/a 26 3643 3695 3727 N
+ OW OY M b n/a 26 3633 3689 3732 N
+ OW OY M e n/a 26 3612 3689 3732 N
+ OW OY M s n/a 26 3612 3689 3732 N
+ OW OY N b n/a 26 3633 3686 3733 N
+ OW OY N e n/a 26 3612 3686 3731 N
+ OW OY N i n/a 26 3612 3686 3730 N
+ OW OY N s n/a 26 3612 3686 3731 N
+ OW OY NG e n/a 26 3612 3686 3731 N
+ OW OY NG s n/a 26 3612 3686 3731 N
+ OW OY OW e n/a 26 3612 3702 3735 N
+ OW OY OW s n/a 26 3618 3704 3735 N
+ OW OY OY b n/a 26 3633 3704 3721 N
+ OW OY OY e n/a 26 3612 3702 3721 N
+ OW OY OY s n/a 26 3618 3704 3721 N
+ OW OY P b n/a 26 3633 3675 3719 N
+ OW OY P e n/a 26 3612 3675 3719 N
+ OW OY P s n/a 26 3612 3675 3719 N
+ OW OY R b n/a 26 3644 3696 3736 N
+ OW OY R e n/a 26 3643 3698 3736 N
+ OW OY R s n/a 26 3643 3698 3736 N
+ OW OY S b n/a 26 3633 3667 3709 N
+ OW OY S e n/a 26 3613 3667 3709 N
+ OW OY S s n/a 26 3613 3667 3709 N
+ OW OY SH b n/a 26 3633 3667 3711 N
+ OW OY SH e n/a 26 3613 3667 3711 N
+ OW OY SH s n/a 26 3613 3667 3711 N
+ OW OY SIL e n/a 26 3612 3685 3725 N
+ OW OY SIL s n/a 26 3612 3683 3725 N
+ OW OY T b n/a 26 3633 3667 3706 N
+ OW OY T e n/a 26 3612 3667 3706 N
+ OW OY T i n/a 26 3612 3667 3706 N
+ OW OY T s n/a 26 3612 3667 3706 N
+ OW OY TH b n/a 26 3633 3667 3710 N
+ OW OY TH e n/a 26 3612 3667 3710 N
+ OW OY TH s n/a 26 3612 3667 3710 N
+ OW OY UH b n/a 26 3633 3704 3736 N
+ OW OY UH e n/a 26 3612 3702 3736 N
+ OW OY UH s n/a 26 3618 3704 3736 N
+ OW OY UW e n/a 26 3612 3702 3735 N
+ OW OY UW s n/a 26 3618 3704 3735 N
+ OW OY V b n/a 26 3633 3677 3720 N
+ OW OY V e n/a 26 3612 3677 3720 N
+ OW OY V s n/a 26 3612 3677 3720 N
+ OW OY W b n/a 26 3633 3677 3728 N
+ OW OY W e n/a 26 3612 3677 3737 N
+ OW OY W s n/a 26 3618 3677 3727 N
+ OW OY Y b n/a 26 3633 3667 3707 N
+ OW OY Y e n/a 26 3612 3667 3707 N
+ OW OY Y s n/a 26 3618 3667 3707 N
+ OW OY Z b n/a 26 3633 3664 3712 N
+ OW OY Z e n/a 26 3613 3664 3712 N
+ OW OY Z i n/a 26 3613 3665 3712 N
+ OW OY Z s n/a 26 3613 3664 3712 N
+ OW OY ZH b n/a 26 3633 3664 3712 N
+ OW OY ZH e n/a 26 3613 3664 3712 N
+ OW OY ZH s n/a 26 3613 3664 3712 N
+ OW P AA b n/a 26 3642 3704 3735 N
+ OW P AA e n/a 26 3646 3702 3735 N
+ OW P AA s n/a 26 3646 3704 3735 N
+ OW P AE e n/a 26 3646 3702 3724 N
+ OW P AE i n/a 26 3645 3704 3724 N
+ OW P AE s n/a 26 3646 3704 3724 N
+ OW P AH b n/a 26 3642 3704 3721 N
+ OW P AH e n/a 26 3646 3702 3721 N
+ OW P AH i n/a 26 3645 3704 3724 N
+ OW P AH s n/a 26 3646 3704 3721 N
+ OW P AO b n/a 26 3642 3704 3735 N
+ OW P AO e n/a 26 3646 3702 3735 N
+ OW P AO s n/a 26 3646 3704 3735 N
+ OW P AW b n/a 26 3642 3704 3736 N
+ OW P AW e n/a 26 3646 3702 3736 N
+ OW P AW s n/a 26 3646 3704 3736 N
+ OW P AY e n/a 26 3646 3702 3721 N
+ OW P AY s n/a 26 3646 3704 3721 N
+ OW P B b n/a 26 3642 3675 3718 N
+ OW P B e n/a 26 3646 3676 3718 N
+ OW P B i n/a 26 3645 3676 3718 N
+ OW P B s n/a 26 3646 3676 3718 N
+ OW P CH b n/a 26 3642 3671 3706 N
+ OW P CH e n/a 26 3646 3671 3706 N
+ OW P CH i n/a 26 3645 3671 3706 N
+ OW P CH s n/a 26 3646 3671 3706 N
+ OW P D b n/a 26 3642 3671 3705 N
+ OW P D e n/a 26 3646 3671 3705 N
+ OW P D i n/a 26 3645 3671 3705 N
+ OW P D s n/a 26 3646 3671 3705 N
+ OW P DH b n/a 26 3642 3672 3713 N
+ OW P DH e n/a 26 3645 3672 3713 N
+ OW P DH s n/a 26 3645 3672 3713 N
+ OW P EH b n/a 26 3642 3704 3724 N
+ OW P EH e n/a 26 3646 3702 3724 N
+ OW P EH i n/a 26 3645 3704 3724 N
+ OW P EH s n/a 26 3646 3704 3724 N
+ OW P ER b n/a 26 3642 3704 3736 N
+ OW P ER e n/a 26 3646 3702 3736 N
+ OW P ER i n/a 26 3645 3704 3736 N
+ OW P ER s n/a 26 3646 3704 3736 N
+ OW P EY b n/a 26 3642 3704 3724 N
+ OW P EY e n/a 26 3646 3702 3724 N
+ OW P EY i n/a 26 3645 3704 3724 N
+ OW P EY s n/a 26 3646 3704 3724 N
+ OW P F b n/a 26 3642 3676 3717 N
+ OW P F e n/a 26 3645 3677 3717 N
+ OW P F i n/a 26 3645 3677 3717 N
+ OW P F s n/a 26 3645 3677 3717 N
+ OW P G b n/a 26 3642 3678 3716 N
+ OW P G e n/a 26 3646 3678 3716 N
+ OW P G i n/a 26 3646 3678 3716 N
+ OW P G s n/a 26 3646 3678 3716 N
+ OW P HH b n/a 26 3642 3676 3723 N
+ OW P HH e n/a 26 3646 3677 3723 N
+ OW P HH i n/a 26 3645 3677 3723 N
+ OW P HH s n/a 26 3646 3677 3723 N
+ OW P IH b n/a 26 3642 3704 3715 N
+ OW P IH e n/a 26 3646 3702 3715 N
+ OW P IH i n/a 26 3645 3700 3714 N
+ OW P IH s n/a 26 3646 3704 3715 N
+ OW P IY b n/a 26 3642 3704 3715 N
+ OW P IY e n/a 26 3646 3702 3715 N
+ OW P IY i n/a 26 3645 3700 3715 N
+ OW P IY s n/a 26 3646 3704 3715 N
+ OW P JH b n/a 26 3642 3671 3705 N
+ OW P JH e n/a 26 3646 3671 3705 N
+ OW P JH i n/a 26 3645 3671 3705 N
+ OW P JH s n/a 26 3646 3671 3705 N
+ OW P K b n/a 26 3642 3678 3716 N
+ OW P K e n/a 26 3646 3678 3716 N
+ OW P K i n/a 26 3646 3678 3716 N
+ OW P K s n/a 26 3646 3678 3716 N
+ OW P L b n/a 26 3638 3692 3729 N
+ OW P L e n/a 26 3638 3692 3738 N
+ OW P L i n/a 26 3640 3692 3729 N
+ OW P L s n/a 26 3638 3692 3729 N
+ OW P M b n/a 26 3642 3690 3732 N
+ OW P M e n/a 26 3646 3690 3732 N
+ OW P M i n/a 26 3645 3690 3732 N
+ OW P M s n/a 26 3646 3690 3732 N
+ OW P N b n/a 26 3642 3688 3733 N
+ OW P N e n/a 26 3646 3688 3731 N
+ OW P N i n/a 26 3645 3688 3730 N
+ OW P N s n/a 26 3646 3688 3731 N
+ OW P NG e n/a 26 3646 3689 3731 N
+ OW P NG s n/a 26 3646 3689 3731 N
+ OW P OW e n/a 26 3646 3702 3735 N
+ OW P OW i n/a 26 3645 3704 3735 N
+ OW P OW s n/a 26 3646 3704 3735 N
+ OW P OY b n/a 26 3642 3704 3721 N
+ OW P OY e n/a 26 3646 3702 3721 N
+ OW P OY s n/a 26 3646 3704 3721 N
+ OW P P b n/a 26 3642 3675 3719 N
+ OW P P e n/a 26 3646 3676 3719 N
+ OW P P i n/a 26 3645 3676 3719 N
+ OW P P s n/a 26 3646 3676 3719 N
+ OW P R b n/a 26 3643 3696 3736 N
+ OW P R e n/a 26 3646 3698 3736 N
+ OW P R s n/a 26 3646 3698 3736 N
+ OW P S b n/a 26 3642 3671 3709 N
+ OW P S e n/a 26 3645 3671 3709 N
+ OW P S i n/a 26 3645 3671 3709 N
+ OW P S s n/a 26 3645 3671 3709 N
+ OW P SH b n/a 26 3642 3671 3711 N
+ OW P SH e n/a 26 3645 3671 3711 N
+ OW P SH i n/a 26 3645 3671 3711 N
+ OW P SH s n/a 26 3645 3671 3711 N
+ OW P SIL e n/a 26 3646 3683 3725 N
+ OW P SIL s n/a 26 3646 3683 3725 N
+ OW P T b n/a 26 3642 3671 3706 N
+ OW P T e n/a 26 3646 3671 3706 N
+ OW P T i n/a 26 3645 3671 3706 N
+ OW P T s n/a 26 3646 3671 3706 N
+ OW P TH b n/a 26 3642 3671 3710 N
+ OW P TH e n/a 26 3645 3671 3710 N
+ OW P TH i n/a 26 3645 3671 3710 N
+ OW P TH s n/a 26 3645 3671 3710 N
+ OW P UH b n/a 26 3642 3704 3736 N
+ OW P UH e n/a 26 3646 3702 3736 N
+ OW P UH s n/a 26 3646 3704 3736 N
+ OW P UW e n/a 26 3646 3702 3735 N
+ OW P UW s n/a 26 3646 3704 3735 N
+ OW P V b n/a 26 3642 3676 3720 N
+ OW P V e n/a 26 3645 3677 3720 N
+ OW P V i n/a 26 3645 3677 3720 N
+ OW P V s n/a 26 3645 3677 3720 N
+ OW P W b n/a 26 3638 3676 3729 N
+ OW P W e n/a 26 3638 3677 3737 N
+ OW P W s n/a 26 3638 3677 3729 N
+ OW P Y b n/a 26 3642 3671 3707 N
+ OW P Y e n/a 26 3646 3671 3707 N
+ OW P Y s n/a 26 3646 3671 3707 N
+ OW P Z b n/a 26 3642 3672 3712 N
+ OW P Z e n/a 26 3645 3672 3712 N
+ OW P Z i n/a 26 3645 3672 3712 N
+ OW P Z s n/a 26 3645 3672 3712 N
+ OW P ZH b n/a 26 3642 3672 3712 N
+ OW P ZH e n/a 26 3645 3672 3712 N
+ OW P ZH i n/a 26 3645 3672 3712 N
+ OW P ZH s n/a 26 3645 3672 3712 N
+ OW R AA b n/a 26 3663 3704 3735 N
+ OW R AA e n/a 26 3661 3704 3735 N
+ OW R AA i n/a 26 3661 3704 3735 N
+ OW R AA s n/a 26 3661 3704 3735 N
+ OW R AE e n/a 26 3661 3704 3724 N
+ OW R AE i n/a 26 3661 3704 3724 N
+ OW R AE s n/a 26 3661 3704 3724 N
+ OW R AH b n/a 26 3663 3704 3721 N
+ OW R AH e n/a 26 3661 3704 3721 N
+ OW R AH i n/a 26 3661 3704 3724 N
+ OW R AH s n/a 26 3661 3704 3721 N
+ OW R AO b n/a 26 3663 3704 3735 N
+ OW R AO e n/a 26 3661 3704 3735 N
+ OW R AO i n/a 26 3661 3704 3735 N
+ OW R AO s n/a 26 3661 3704 3735 N
+ OW R AW b n/a 26 3663 3704 3736 N
+ OW R AW e n/a 26 3661 3704 3736 N
+ OW R AW s n/a 26 3661 3704 3736 N
+ OW R AY e n/a 26 3661 3704 3721 N
+ OW R AY i n/a 26 3661 3704 3721 N
+ OW R AY s n/a 26 3661 3704 3721 N
+ OW R B b n/a 26 3663 3678 3718 N
+ OW R B e n/a 26 3661 3678 3718 N
+ OW R B i n/a 26 3661 3678 3718 N
+ OW R B s n/a 26 3661 3678 3718 N
+ OW R CH b n/a 26 3663 3670 3706 N
+ OW R CH e n/a 26 3660 3670 3706 N
+ OW R CH i n/a 26 3660 3670 3706 N
+ OW R CH s n/a 26 3660 3670 3706 N
+ OW R D b n/a 26 3663 3666 3705 N
+ OW R D e n/a 26 3659 3666 3705 N
+ OW R D i n/a 26 3659 3666 3705 N
+ OW R D s n/a 26 3659 3666 3705 N
+ OW R DH b n/a 26 3663 3666 3713 N
+ OW R DH e n/a 26 3659 3666 3713 N
+ OW R DH i n/a 26 3659 3666 3712 N
+ OW R DH s n/a 26 3659 3666 3713 N
+ OW R EH b n/a 26 3663 3704 3724 N
+ OW R EH e n/a 26 3661 3704 3724 N
+ OW R EH i n/a 26 3661 3704 3724 N
+ OW R EH s n/a 26 3661 3704 3724 N
+ OW R ER b n/a 26 3663 3704 3736 N
+ OW R ER e n/a 26 3661 3704 3736 N
+ OW R ER i n/a 26 3661 3704 3736 N
+ OW R ER s n/a 26 3661 3704 3736 N
+ OW R EY b n/a 26 3663 3704 3724 N
+ OW R EY e n/a 26 3661 3704 3724 N
+ OW R EY i n/a 26 3661 3704 3724 N
+ OW R EY s n/a 26 3661 3704 3724 N
+ OW R F b n/a 26 3663 3679 3717 N
+ OW R F e n/a 26 3661 3679 3717 N
+ OW R F i n/a 26 3660 3679 3717 N
+ OW R F s n/a 26 3660 3679 3717 N
+ OW R G b n/a 26 3663 3679 3716 N
+ OW R G e n/a 26 3660 3679 3716 N
+ OW R G i n/a 26 3660 3679 3716 N
+ OW R G s n/a 26 3660 3679 3716 N
+ OW R HH b n/a 26 3663 3679 3723 N
+ OW R HH e n/a 26 3661 3679 3723 N
+ OW R HH i n/a 26 3660 3679 3723 N
+ OW R HH s n/a 26 3660 3679 3723 N
+ OW R IH b n/a 26 3663 3704 3715 N
+ OW R IH e n/a 26 3661 3704 3715 N
+ OW R IH i n/a 26 3661 3700 3714 N
+ OW R IH s n/a 26 3661 3704 3715 N
+ OW R IY b n/a 26 3663 3704 3715 N
+ OW R IY e n/a 26 3661 3704 3715 N
+ OW R IY i n/a 26 3661 3700 3715 N
+ OW R IY s n/a 26 3661 3704 3715 N
+ OW R JH b n/a 26 3663 3666 3705 N
+ OW R JH e n/a 26 3660 3666 3705 N
+ OW R JH i n/a 26 3660 3666 3705 N
+ OW R JH s n/a 26 3660 3666 3705 N
+ OW R K b n/a 26 3663 3679 3716 N
+ OW R K e n/a 26 3661 3679 3716 N
+ OW R K i n/a 26 3660 3679 3716 N
+ OW R K s n/a 26 3660 3679 3716 N
+ OW R L b n/a 26 3662 3694 3727 N
+ OW R L e n/a 26 3663 3694 3738 N
+ OW R L i n/a 26 3662 3694 3727 N
+ OW R L s n/a 26 3663 3694 3727 N
+ OW R M b n/a 26 3663 3689 3732 N
+ OW R M e n/a 26 3661 3689 3732 N
+ OW R M i n/a 26 3661 3689 3732 N
+ OW R M s n/a 26 3661 3689 3732 N
+ OW R N b n/a 26 3663 3688 3733 N
+ OW R N e n/a 26 3661 3686 3731 N
+ OW R N i n/a 26 3661 3686 3730 N
+ OW R N s n/a 26 3661 3686 3731 N
+ OW R NG e n/a 26 3661 3686 3731 N
+ OW R NG i n/a 26 3661 3686 3730 N
+ OW R NG s n/a 26 3661 3686 3731 N
+ OW R OW e n/a 26 3661 3704 3735 N
+ OW R OW s n/a 26 3661 3704 3735 N
+ OW R OY b n/a 26 3663 3704 3721 N
+ OW R OY e n/a 26 3661 3704 3721 N
+ OW R OY s n/a 26 3661 3704 3721 N
+ OW R P b n/a 26 3663 3679 3719 N
+ OW R P e n/a 26 3661 3679 3719 N
+ OW R P i n/a 26 3660 3679 3719 N
+ OW R P s n/a 26 3660 3679 3719 N
+ OW R R b n/a 26 3663 3696 3736 N
+ OW R R e n/a 26 3663 3698 3736 N
+ OW R R i n/a 26 3663 3698 3736 N
+ OW R R s n/a 26 3663 3698 3736 N
+ OW R S b n/a 26 3663 3670 3709 N
+ OW R S e n/a 26 3660 3670 3709 N
+ OW R S i n/a 26 3660 3670 3709 N
+ OW R S s n/a 26 3660 3670 3709 N
+ OW R SH b n/a 26 3663 3670 3711 N
+ OW R SH e n/a 26 3660 3670 3711 N
+ OW R SH i n/a 26 3660 3670 3711 N
+ OW R SH s n/a 26 3660 3670 3711 N
+ OW R SIL e n/a 26 3659 3683 3725 N
+ OW R SIL s n/a 26 3659 3683 3725 N
+ OW R T b n/a 26 3663 3670 3706 N
+ OW R T e n/a 26 3660 3670 3706 N
+ OW R T i n/a 26 3660 3670 3706 N
+ OW R T s n/a 26 3660 3670 3706 N
+ OW R TH b n/a 26 3663 3670 3710 N
+ OW R TH e n/a 26 3660 3670 3710 N
+ OW R TH i n/a 26 3660 3670 3710 N
+ OW R TH s n/a 26 3660 3670 3710 N
+ OW R UH b n/a 26 3663 3704 3736 N
+ OW R UH e n/a 26 3661 3704 3736 N
+ OW R UH s n/a 26 3661 3704 3736 N
+ OW R UW e n/a 26 3661 3704 3735 N
+ OW R UW s n/a 26 3661 3704 3735 N
+ OW R V b n/a 26 3663 3678 3720 N
+ OW R V e n/a 26 3661 3678 3720 N
+ OW R V i n/a 26 3661 3678 3720 N
+ OW R V s n/a 26 3661 3678 3720 N
+ OW R W b n/a 26 3662 3678 3727 N
+ OW R W e n/a 26 3661 3678 3737 N
+ OW R W i n/a 26 3661 3678 3727 N
+ OW R W s n/a 26 3661 3678 3727 N
+ OW R Y b n/a 26 3663 3666 3707 N
+ OW R Y e n/a 26 3661 3666 3707 N
+ OW R Y i n/a 26 3661 3666 3707 N
+ OW R Y s n/a 26 3661 3666 3707 N
+ OW R Z b n/a 26 3663 3666 3712 N
+ OW R Z e n/a 26 3659 3666 3712 N
+ OW R Z i n/a 26 3659 3666 3712 N
+ OW R Z s n/a 26 3659 3666 3712 N
+ OW R ZH b n/a 26 3663 3666 3712 N
+ OW R ZH e n/a 26 3660 3666 3712 N
+ OW R ZH i n/a 26 3660 3666 3712 N
+ OW R ZH s n/a 26 3660 3666 3712 N
+ OW S AA b n/a 26 3630 3702 3735 N
+ OW S AA e n/a 26 3623 3702 3735 N
+ OW S AA i n/a 26 3637 3702 3735 N
+ OW S AA s n/a 26 3630 3702 3735 N
+ OW S AE e n/a 26 3623 3702 3724 N
+ OW S AE s n/a 26 3631 3702 3724 N
+ OW S AH b n/a 26 3631 3702 3721 N
+ OW S AH e n/a 26 3623 3702 3721 N
+ OW S AH i n/a 26 3623 3702 3724 N
+ OW S AH s n/a 26 3631 3702 3721 N
+ OW S AO b n/a 26 3630 3702 3735 N
+ OW S AO e n/a 26 3623 3702 3735 N
+ OW S AO s n/a 26 3630 3702 3735 N
+ OW S AW b n/a 26 3630 3702 3736 N
+ OW S AW e n/a 26 3623 3702 3736 N
+ OW S AW s n/a 26 3630 3702 3736 N
+ OW S AY e n/a 26 3623 3702 3721 N
+ OW S AY s n/a 26 3631 3702 3721 N
+ OW S B b n/a 26 3631 3675 3718 N
+ OW S B e n/a 26 3623 3681 3718 N
+ OW S B i n/a 26 3623 3681 3718 N
+ OW S B s n/a 26 3631 3681 3718 N
+ OW S CH b n/a 26 3631 3682 3706 N
+ OW S CH e n/a 26 3624 3682 3706 N
+ OW S CH i n/a 26 3624 3682 3706 N
+ OW S CH s n/a 26 3631 3682 3706 N
+ OW S D b n/a 26 3631 3668 3705 N
+ OW S D e n/a 26 3624 3668 3705 N
+ OW S D i n/a 26 3624 3668 3705 N
+ OW S D s n/a 26 3631 3668 3705 N
+ OW S DH b n/a 26 3631 3668 3713 N
+ OW S DH e n/a 26 3624 3668 3713 N
+ OW S DH s n/a 26 3631 3668 3713 N
+ OW S EH b n/a 26 3631 3702 3724 N
+ OW S EH e n/a 26 3623 3702 3724 N
+ OW S EH i n/a 26 3623 3702 3724 N
+ OW S EH s n/a 26 3631 3702 3724 N
+ OW S ER b n/a 26 3630 3702 3736 N
+ OW S ER e n/a 26 3623 3702 3736 N
+ OW S ER i n/a 26 3637 3702 3736 N
+ OW S ER s n/a 26 3630 3702 3736 N
+ OW S EY b n/a 26 3631 3702 3724 N
+ OW S EY e n/a 26 3623 3702 3724 N
+ OW S EY i n/a 26 3623 3702 3724 N
+ OW S EY s n/a 26 3631 3702 3724 N
+ OW S F b n/a 26 3631 3677 3717 N
+ OW S F e n/a 26 3623 3681 3717 N
+ OW S F i n/a 26 3623 3681 3717 N
+ OW S F s n/a 26 3631 3681 3717 N
+ OW S G b n/a 26 3631 3678 3716 N
+ OW S G e n/a 26 3623 3681 3716 N
+ OW S G i n/a 26 3623 3681 3716 N
+ OW S G s n/a 26 3631 3681 3716 N
+ OW S HH b n/a 26 3631 3677 3723 N
+ OW S HH e n/a 26 3623 3682 3723 N
+ OW S HH i n/a 26 3623 3682 3723 N
+ OW S HH s n/a 26 3631 3682 3723 N
+ OW S IH b n/a 26 3631 3702 3715 N
+ OW S IH e n/a 26 3623 3702 3715 N
+ OW S IH i n/a 26 3623 3700 3714 N
+ OW S IH s n/a 26 3631 3702 3715 N
+ OW S IY b n/a 26 3631 3702 3715 N
+ OW S IY e n/a 26 3623 3702 3715 N
+ OW S IY i n/a 26 3623 3700 3715 N
+ OW S IY s n/a 26 3631 3702 3715 N
+ OW S JH b n/a 26 3631 3682 3705 N
+ OW S JH e n/a 26 3624 3682 3705 N
+ OW S JH i n/a 26 3624 3682 3705 N
+ OW S JH s n/a 26 3631 3682 3705 N
+ OW S K b n/a 26 3631 3678 3716 N
+ OW S K e n/a 26 3623 3681 3716 N
+ OW S K i n/a 26 3623 3681 3716 N
+ OW S K s n/a 26 3631 3681 3716 N
+ OW S L b n/a 26 3630 3695 3728 N
+ OW S L e n/a 26 3623 3698 3738 N
+ OW S L i n/a 26 3637 3695 3728 N
+ OW S L s n/a 26 3630 3695 3728 N
+ OW S M b n/a 26 3632 3696 3732 N
+ OW S M e n/a 26 3623 3698 3732 N
+ OW S M i n/a 26 3623 3698 3732 N
+ OW S M s n/a 26 3632 3698 3732 N
+ OW S N b n/a 26 3632 3696 3733 N
+ OW S N e n/a 26 3624 3697 3731 N
+ OW S N i n/a 26 3624 3697 3730 N
+ OW S N s n/a 26 3632 3697 3731 N
+ OW S NG e n/a 26 3623 3698 3731 N
+ OW S NG s n/a 26 3632 3698 3731 N
+ OW S OW e n/a 26 3623 3702 3735 N
+ OW S OW s n/a 26 3630 3702 3735 N
+ OW S OY b n/a 26 3631 3702 3721 N
+ OW S OY e n/a 26 3623 3702 3721 N
+ OW S OY s n/a 26 3631 3702 3721 N
+ OW S P b n/a 26 3631 3675 3719 N
+ OW S P e n/a 26 3623 3681 3719 N
+ OW S P i n/a 26 3623 3681 3719 N
+ OW S P s n/a 26 3631 3681 3719 N
+ OW S R b n/a 26 3630 3696 3736 N
+ OW S R e n/a 26 3623 3698 3736 N
+ OW S R s n/a 26 3630 3698 3736 N
+ OW S S b n/a 26 3631 3668 3709 N
+ OW S S e n/a 26 3624 3668 3709 N
+ OW S S i n/a 26 3624 3668 3709 N
+ OW S S s n/a 26 3631 3668 3709 N
+ OW S SH b n/a 26 3631 3682 3711 N
+ OW S SH e n/a 26 3624 3682 3711 N
+ OW S SH i n/a 26 3624 3682 3711 N
+ OW S SH s n/a 26 3631 3682 3711 N
+ OW S SIL e n/a 26 3629 3685 3726 N
+ OW S SIL s n/a 26 3631 3683 3726 N
+ OW S T b n/a 26 3631 3668 3706 N
+ OW S T e n/a 26 3624 3668 3706 N
+ OW S T i n/a 26 3624 3668 3706 N
+ OW S T s n/a 26 3631 3668 3706 N
+ OW S TH b n/a 26 3631 3668 3710 N
+ OW S TH e n/a 26 3624 3668 3710 N
+ OW S TH i n/a 26 3624 3668 3710 N
+ OW S TH s n/a 26 3631 3668 3710 N
+ OW S UH b n/a 26 3630 3702 3736 N
+ OW S UH e n/a 26 3623 3702 3736 N
+ OW S UH s n/a 26 3630 3702 3736 N
+ OW S UW e n/a 26 3623 3702 3735 N
+ OW S UW s n/a 26 3630 3702 3735 N
+ OW S V b n/a 26 3631 3677 3720 N
+ OW S V e n/a 26 3623 3682 3720 N
+ OW S V i n/a 26 3623 3682 3720 N
+ OW S V s n/a 26 3631 3682 3720 N
+ OW S W b n/a 26 3630 3677 3728 N
+ OW S W e n/a 26 3623 3680 3737 N
+ OW S W s n/a 26 3630 3680 3728 N
+ OW S Y b n/a 26 3631 3682 3707 N
+ OW S Y e n/a 26 3624 3682 3707 N
+ OW S Y s n/a 26 3631 3682 3707 N
+ OW S Z b n/a 26 3631 3668 3712 N
+ OW S Z e n/a 26 3624 3668 3712 N
+ OW S Z i n/a 26 3624 3668 3712 N
+ OW S Z s n/a 26 3631 3668 3712 N
+ OW S ZH b n/a 26 3631 3682 3712 N
+ OW S ZH e n/a 26 3624 3682 3712 N
+ OW S ZH s n/a 26 3631 3682 3712 N
+ OW SH AA b n/a 26 3630 3704 3735 N
+ OW SH AA e n/a 26 3627 3702 3735 N
+ OW SH AA s n/a 26 3630 3704 3735 N
+ OW SH AE e n/a 26 3627 3702 3724 N
+ OW SH AE i n/a 26 3627 3704 3724 N
+ OW SH AE s n/a 26 3630 3704 3724 N
+ OW SH AH b n/a 26 3630 3704 3721 N
+ OW SH AH e n/a 26 3627 3702 3721 N
+ OW SH AH i n/a 26 3627 3704 3724 N
+ OW SH AH s n/a 26 3630 3704 3721 N
+ OW SH AO b n/a 26 3630 3704 3735 N
+ OW SH AO e n/a 26 3627 3702 3735 N
+ OW SH AO i n/a 26 3634 3704 3735 N
+ OW SH AO s n/a 26 3630 3704 3735 N
+ OW SH AW b n/a 26 3630 3704 3736 N
+ OW SH AW e n/a 26 3627 3702 3736 N
+ OW SH AW s n/a 26 3630 3704 3736 N
+ OW SH AY e n/a 26 3627 3702 3721 N
+ OW SH AY s n/a 26 3630 3704 3721 N
+ OW SH B b n/a 26 3631 3675 3718 N
+ OW SH B e n/a 26 3627 3675 3718 N
+ OW SH B i n/a 26 3627 3675 3718 N
+ OW SH B s n/a 26 3631 3675 3718 N
+ OW SH CH b n/a 26 3631 3667 3706 N
+ OW SH CH e n/a 26 3627 3667 3706 N
+ OW SH CH s n/a 26 3631 3667 3706 N
+ OW SH D b n/a 26 3631 3667 3705 N
+ OW SH D e n/a 26 3627 3667 3705 N
+ OW SH D i n/a 26 3627 3667 3705 N
+ OW SH D s n/a 26 3631 3667 3705 N
+ OW SH DH b n/a 26 3631 3664 3713 N
+ OW SH DH e n/a 26 3627 3664 3713 N
+ OW SH DH s n/a 26 3631 3664 3713 N
+ OW SH EH b n/a 26 3630 3704 3724 N
+ OW SH EH e n/a 26 3627 3702 3724 N
+ OW SH EH s n/a 26 3630 3704 3724 N
+ OW SH ER b n/a 26 3630 3704 3736 N
+ OW SH ER e n/a 26 3627 3702 3736 N
+ OW SH ER i n/a 26 3634 3704 3736 N
+ OW SH ER s n/a 26 3630 3704 3736 N
+ OW SH EY b n/a 26 3630 3704 3724 N
+ OW SH EY e n/a 26 3627 3702 3724 N
+ OW SH EY s n/a 26 3630 3704 3724 N
+ OW SH F b n/a 26 3631 3676 3717 N
+ OW SH F e n/a 26 3627 3677 3717 N
+ OW SH F i n/a 26 3627 3677 3717 N
+ OW SH F s n/a 26 3631 3677 3717 N
+ OW SH G b n/a 26 3631 3678 3716 N
+ OW SH G e n/a 26 3627 3678 3716 N
+ OW SH G i n/a 26 3627 3678 3716 N
+ OW SH G s n/a 26 3631 3678 3716 N
+ OW SH HH b n/a 26 3630 3676 3723 N
+ OW SH HH e n/a 26 3627 3677 3723 N
+ OW SH HH i n/a 26 3627 3677 3723 N
+ OW SH HH s n/a 26 3630 3677 3723 N
+ OW SH IH b n/a 26 3630 3704 3715 N
+ OW SH IH e n/a 26 3627 3702 3715 N
+ OW SH IH i n/a 26 3627 3700 3714 N
+ OW SH IH s n/a 26 3630 3704 3715 N
+ OW SH IY b n/a 26 3630 3704 3715 N
+ OW SH IY e n/a 26 3627 3702 3715 N
+ OW SH IY i n/a 26 3627 3700 3715 N
+ OW SH IY s n/a 26 3630 3704 3715 N
+ OW SH JH b n/a 26 3631 3667 3705 N
+ OW SH JH e n/a 26 3627 3667 3705 N
+ OW SH JH i n/a 26 3627 3667 3705 N
+ OW SH JH s n/a 26 3631 3667 3705 N
+ OW SH K b n/a 26 3631 3678 3716 N
+ OW SH K e n/a 26 3627 3678 3716 N
+ OW SH K i n/a 26 3627 3678 3716 N
+ OW SH K s n/a 26 3631 3678 3716 N
+ OW SH L b n/a 26 3643 3689 3728 N
+ OW SH L e n/a 26 3643 3687 3738 N
+ OW SH L i n/a 26 3643 3687 3728 N
+ OW SH L s n/a 26 3643 3687 3728 N
+ OW SH M b n/a 26 3630 3689 3732 N
+ OW SH M e n/a 26 3627 3689 3732 N
+ OW SH M i n/a 26 3627 3689 3732 N
+ OW SH M s n/a 26 3630 3689 3732 N
+ OW SH N b n/a 26 3630 3688 3733 N
+ OW SH N e n/a 26 3627 3686 3731 N
+ OW SH N i n/a 26 3627 3686 3730 N
+ OW SH N s n/a 26 3630 3686 3731 N
+ OW SH NG e n/a 26 3627 3686 3731 N
+ OW SH NG s n/a 26 3630 3686 3731 N
+ OW SH OW e n/a 26 3627 3702 3735 N
+ OW SH OW s n/a 26 3630 3704 3735 N
+ OW SH OY b n/a 26 3630 3704 3721 N
+ OW SH OY e n/a 26 3627 3702 3721 N
+ OW SH OY s n/a 26 3630 3704 3721 N
+ OW SH P b n/a 26 3631 3675 3719 N
+ OW SH P e n/a 26 3627 3675 3719 N
+ OW SH P i n/a 26 3627 3675 3719 N
+ OW SH P s n/a 26 3631 3675 3719 N
+ OW SH R b n/a 26 3643 3696 3736 N
+ OW SH R e n/a 26 3643 3698 3736 N
+ OW SH R i n/a 26 3643 3698 3736 N
+ OW SH R s n/a 26 3643 3698 3736 N
+ OW SH S b n/a 26 3631 3667 3709 N
+ OW SH S e n/a 26 3627 3667 3709 N
+ OW SH S i n/a 26 3627 3667 3709 N
+ OW SH S s n/a 26 3631 3667 3709 N
+ OW SH SH b n/a 26 3631 3667 3711 N
+ OW SH SH e n/a 26 3627 3667 3711 N
+ OW SH SH i n/a 26 3627 3667 3711 N
+ OW SH SH s n/a 26 3631 3667 3711 N
+ OW SH SIL e n/a 26 3629 3685 3726 N
+ OW SH SIL s n/a 26 3630 3683 3726 N
+ OW SH T b n/a 26 3631 3667 3706 N
+ OW SH T e n/a 26 3627 3667 3706 N
+ OW SH T i n/a 26 3627 3667 3706 N
+ OW SH T s n/a 26 3631 3667 3706 N
+ OW SH TH b n/a 26 3631 3667 3710 N
+ OW SH TH e n/a 26 3627 3667 3710 N
+ OW SH TH s n/a 26 3631 3667 3710 N
+ OW SH UH b n/a 26 3630 3704 3736 N
+ OW SH UH e n/a 26 3627 3702 3736 N
+ OW SH UH s n/a 26 3630 3704 3736 N
+ OW SH UW e n/a 26 3627 3702 3735 N
+ OW SH UW s n/a 26 3630 3704 3735 N
+ OW SH V b n/a 26 3631 3676 3720 N
+ OW SH V e n/a 26 3627 3677 3720 N
+ OW SH V i n/a 26 3627 3677 3720 N
+ OW SH V s n/a 26 3631 3677 3720 N
+ OW SH W b n/a 26 3630 3676 3728 N
+ OW SH W e n/a 26 3627 3677 3737 N
+ OW SH W s n/a 26 3630 3677 3728 N
+ OW SH Y b n/a 26 3630 3667 3707 N
+ OW SH Y e n/a 26 3627 3667 3707 N
+ OW SH Y s n/a 26 3630 3667 3707 N
+ OW SH Z b n/a 26 3631 3664 3712 N
+ OW SH Z e n/a 26 3627 3664 3712 N
+ OW SH Z i n/a 26 3627 3665 3712 N
+ OW SH Z s n/a 26 3631 3664 3712 N
+ OW SH ZH b n/a 26 3631 3664 3712 N
+ OW SH ZH e n/a 26 3627 3664 3712 N
+ OW SH ZH s n/a 26 3631 3664 3712 N
+ OW SIL AA b n/a 26 3642 3704 3735 N
+ OW SIL AA s n/a 26 3647 3704 3735 N
+ OW SIL AE s n/a 26 3647 3704 3724 N
+ OW SIL AH b n/a 26 3642 3704 3721 N
+ OW SIL AH s n/a 26 3647 3704 3721 N
+ OW SIL AO b n/a 26 3642 3704 3735 N
+ OW SIL AO s n/a 26 3647 3704 3735 N
+ OW SIL AW b n/a 26 3642 3704 3736 N
+ OW SIL AW s n/a 26 3647 3704 3736 N
+ OW SIL AY s n/a 26 3647 3704 3721 N
+ OW SIL B b n/a 26 3642 3676 3718 N
+ OW SIL B s n/a 26 3647 3675 3718 N
+ OW SIL CH b n/a 26 3642 3669 3706 N
+ OW SIL CH s n/a 26 3647 3669 3706 N
+ OW SIL D b n/a 26 3642 3669 3705 N
+ OW SIL D s n/a 26 3647 3669 3705 N
+ OW SIL DH b n/a 26 3642 3664 3713 N
+ OW SIL DH s n/a 26 3647 3664 3713 N
+ OW SIL EH b n/a 26 3642 3704 3724 N
+ OW SIL EH s n/a 26 3647 3704 3724 N
+ OW SIL ER b n/a 26 3642 3704 3736 N
+ OW SIL ER s n/a 26 3647 3704 3736 N
+ OW SIL EY b n/a 26 3642 3704 3724 N
+ OW SIL EY s n/a 26 3647 3704 3724 N
+ OW SIL F b n/a 26 3642 3676 3717 N
+ OW SIL F s n/a 26 3647 3677 3717 N
+ OW SIL G b n/a 26 3642 3678 3716 N
+ OW SIL G s n/a 26 3647 3678 3716 N
+ OW SIL HH b n/a 26 3642 3676 3723 N
+ OW SIL HH s n/a 26 3647 3677 3723 N
+ OW SIL IH b n/a 26 3642 3704 3715 N
+ OW SIL IH s n/a 26 3647 3704 3715 N
+ OW SIL IY b n/a 26 3642 3704 3715 N
+ OW SIL IY s n/a 26 3647 3704 3715 N
+ OW SIL JH b n/a 26 3642 3669 3705 N
+ OW SIL JH s n/a 26 3647 3669 3705 N
+ OW SIL K b n/a 26 3642 3678 3716 N
+ OW SIL K s n/a 26 3647 3678 3716 N
+ OW SIL L b n/a 26 3638 3692 3729 N
+ OW SIL L s n/a 26 3638 3692 3727 N
+ OW SIL M b n/a 26 3642 3689 3732 N
+ OW SIL M s n/a 26 3647 3689 3732 N
+ OW SIL N b n/a 26 3642 3688 3733 N
+ OW SIL N s n/a 26 3647 3686 3731 N
+ OW SIL NG s n/a 26 3647 3686 3731 N
+ OW SIL OW s n/a 26 3647 3704 3735 N
+ OW SIL OY b n/a 26 3642 3704 3721 N
+ OW SIL OY s n/a 26 3647 3704 3721 N
+ OW SIL P b n/a 26 3642 3676 3719 N
+ OW SIL P s n/a 26 3647 3675 3719 N
+ OW SIL R b n/a 26 3643 3696 3736 N
+ OW SIL R s n/a 26 3647 3698 3736 N
+ OW SIL S b n/a 26 3642 3668 3710 N
+ OW SIL S s n/a 26 3647 3669 3710 N
+ OW SIL SH b n/a 26 3642 3668 3711 N
+ OW SIL SH s n/a 26 3647 3669 3711 N
+ OW SIL SIL s n/a 26 3647 3683 3726 N
+ OW SIL T b n/a 26 3642 3669 3706 N
+ OW SIL T s n/a 26 3647 3669 3706 N
+ OW SIL TH b n/a 26 3642 3668 3710 N
+ OW SIL TH s n/a 26 3647 3669 3710 N
+ OW SIL UH b n/a 26 3642 3704 3736 N
+ OW SIL UH s n/a 26 3647 3704 3736 N
+ OW SIL UW s n/a 26 3647 3704 3735 N
+ OW SIL V b n/a 26 3642 3676 3720 N
+ OW SIL V s n/a 26 3647 3677 3720 N
+ OW SIL W b n/a 26 3638 3676 3729 N
+ OW SIL W s n/a 26 3638 3677 3727 N
+ OW SIL Y b n/a 26 3642 3669 3707 N
+ OW SIL Y s n/a 26 3647 3669 3707 N
+ OW SIL Z b n/a 26 3642 3664 3712 N
+ OW SIL Z s n/a 26 3647 3664 3712 N
+ OW SIL ZH b n/a 26 3642 3664 3712 N
+ OW SIL ZH s n/a 26 3647 3664 3712 N
+ OW T AA b n/a 26 3630 3702 3735 N
+ OW T AA e n/a 26 3628 3702 3735 N
+ OW T AA i n/a 26 3634 3702 3735 N
+ OW T AA s n/a 26 3630 3702 3735 N
+ OW T AE e n/a 26 3628 3702 3724 N
+ OW T AE s n/a 26 3630 3702 3724 N
+ OW T AH b n/a 26 3630 3702 3721 N
+ OW T AH e n/a 26 3628 3702 3721 N
+ OW T AH i n/a 26 3628 3702 3724 N
+ OW T AH s n/a 26 3630 3702 3721 N
+ OW T AO b n/a 26 3630 3702 3735 N
+ OW T AO e n/a 26 3628 3702 3735 N
+ OW T AO i n/a 26 3634 3702 3735 N
+ OW T AO s n/a 26 3630 3702 3735 N
+ OW T AW b n/a 26 3630 3702 3736 N
+ OW T AW e n/a 26 3628 3702 3736 N
+ OW T AW s n/a 26 3630 3702 3736 N
+ OW T AY e n/a 26 3628 3702 3721 N
+ OW T AY i n/a 26 3634 3702 3721 N
+ OW T AY s n/a 26 3630 3702 3721 N
+ OW T B b n/a 26 3631 3675 3718 N
+ OW T B e n/a 26 3628 3681 3718 N
+ OW T B i n/a 26 3628 3681 3718 N
+ OW T B s n/a 26 3631 3681 3718 N
+ OW T CH b n/a 26 3631 3682 3705 N
+ OW T CH e n/a 26 3628 3682 3705 N
+ OW T CH i n/a 26 3628 3682 3705 N
+ OW T CH s n/a 26 3631 3682 3705 N
+ OW T D b n/a 26 3631 3669 3705 N
+ OW T D e n/a 26 3628 3669 3705 N
+ OW T D i n/a 26 3628 3669 3705 N
+ OW T D s n/a 26 3631 3669 3705 N
+ OW T DH b n/a 26 3631 3664 3713 N
+ OW T DH e n/a 26 3628 3664 3713 N
+ OW T DH s n/a 26 3631 3664 3713 N
+ OW T EH b n/a 26 3630 3702 3724 N
+ OW T EH e n/a 26 3628 3702 3724 N
+ OW T EH i n/a 26 3628 3702 3724 N
+ OW T EH s n/a 26 3630 3702 3724 N
+ OW T ER b n/a 26 3630 3702 3736 N
+ OW T ER e n/a 26 3628 3702 3736 N
+ OW T ER i n/a 26 3634 3702 3736 N
+ OW T ER s n/a 26 3630 3702 3736 N
+ OW T EY b n/a 26 3630 3702 3724 N
+ OW T EY e n/a 26 3628 3702 3724 N
+ OW T EY s n/a 26 3630 3702 3724 N
+ OW T F b n/a 26 3631 3677 3717 N
+ OW T F e n/a 26 3628 3681 3717 N
+ OW T F i n/a 26 3628 3681 3717 N
+ OW T F s n/a 26 3631 3681 3717 N
+ OW T G b n/a 26 3631 3678 3716 N
+ OW T G e n/a 26 3628 3681 3716 N
+ OW T G i n/a 26 3628 3681 3716 N
+ OW T G s n/a 26 3631 3681 3716 N
+ OW T HH b n/a 26 3630 3677 3723 N
+ OW T HH e n/a 26 3628 3682 3723 N
+ OW T HH i n/a 26 3628 3682 3723 N
+ OW T HH s n/a 26 3630 3682 3723 N
+ OW T IH b n/a 26 3630 3702 3715 N
+ OW T IH e n/a 26 3628 3702 3715 N
+ OW T IH i n/a 26 3628 3700 3714 N
+ OW T IH s n/a 26 3630 3702 3715 N
+ OW T IY b n/a 26 3630 3702 3715 N
+ OW T IY e n/a 26 3628 3702 3715 N
+ OW T IY i n/a 26 3628 3700 3715 N
+ OW T IY s n/a 26 3630 3702 3715 N
+ OW T JH b n/a 26 3631 3682 3705 N
+ OW T JH e n/a 26 3628 3682 3705 N
+ OW T JH i n/a 26 3628 3682 3705 N
+ OW T JH s n/a 26 3631 3682 3705 N
+ OW T K b n/a 26 3631 3678 3716 N
+ OW T K e n/a 26 3625 3681 3716 N
+ OW T K i n/a 26 3626 3681 3716 N
+ OW T K s n/a 26 3631 3681 3716 N
+ OW T L b n/a 26 3630 3695 3728 N
+ OW T L e n/a 26 3628 3698 3738 N
+ OW T L i n/a 26 3636 3695 3727 N
+ OW T L s n/a 26 3630 3695 3727 N
+ OW T M b n/a 26 3630 3696 3732 N
+ OW T M e n/a 26 3628 3698 3732 N
+ OW T M i n/a 26 3628 3698 3732 N
+ OW T M s n/a 26 3630 3698 3732 N
+ OW T N b n/a 26 3630 3696 3733 N
+ OW T N e n/a 26 3628 3697 3731 N
+ OW T N i n/a 26 3628 3697 3730 N
+ OW T N s n/a 26 3630 3697 3731 N
+ OW T NG e n/a 26 3628 3698 3731 N
+ OW T NG s n/a 26 3630 3698 3731 N
+ OW T OW e n/a 26 3628 3702 3735 N
+ OW T OW s n/a 26 3630 3702 3735 N
+ OW T OY b n/a 26 3630 3702 3721 N
+ OW T OY e n/a 26 3628 3702 3721 N
+ OW T OY s n/a 26 3630 3702 3721 N
+ OW T P b n/a 26 3631 3675 3719 N
+ OW T P e n/a 26 3625 3681 3719 N
+ OW T P i n/a 26 3626 3681 3719 N
+ OW T P s n/a 26 3631 3681 3719 N
+ OW T R b n/a 26 3630 3696 3736 N
+ OW T R e n/a 26 3628 3698 3736 N
+ OW T R i n/a 26 3634 3698 3736 N
+ OW T R s n/a 26 3630 3698 3736 N
+ OW T S b n/a 26 3631 3668 3709 N
+ OW T S e n/a 26 3628 3668 3709 N
+ OW T S i n/a 26 3628 3668 3709 N
+ OW T S s n/a 26 3631 3669 3709 N
+ OW T SH b n/a 26 3631 3682 3711 N
+ OW T SH e n/a 26 3628 3682 3711 N
+ OW T SH i n/a 26 3628 3682 3711 N
+ OW T SH s n/a 26 3631 3682 3711 N
+ OW T SIL e n/a 26 3629 3685 3725 N
+ OW T SIL s n/a 26 3630 3683 3725 N
+ OW T T b n/a 26 3631 3669 3705 N
+ OW T T e n/a 26 3625 3669 3705 N
+ OW T T i n/a 26 3626 3669 3705 N
+ OW T T s n/a 26 3631 3669 3705 N
+ OW T TH b n/a 26 3631 3668 3710 N
+ OW T TH e n/a 26 3628 3668 3710 N
+ OW T TH i n/a 26 3628 3668 3710 N
+ OW T TH s n/a 26 3631 3669 3710 N
+ OW T UH b n/a 26 3630 3702 3736 N
+ OW T UH e n/a 26 3628 3702 3736 N
+ OW T UH s n/a 26 3630 3702 3736 N
+ OW T UW e n/a 26 3628 3702 3735 N
+ OW T UW s n/a 26 3630 3702 3735 N
+ OW T V b n/a 26 3631 3677 3720 N
+ OW T V e n/a 26 3628 3682 3720 N
+ OW T V i n/a 26 3628 3682 3720 N
+ OW T V s n/a 26 3631 3682 3720 N
+ OW T W b n/a 26 3630 3677 3728 N
+ OW T W e n/a 26 3628 3680 3737 N
+ OW T W i n/a 26 3636 3680 3727 N
+ OW T W s n/a 26 3630 3680 3727 N
+ OW T Y b n/a 26 3630 3682 3707 N
+ OW T Y e n/a 26 3628 3682 3707 N
+ OW T Y i n/a 26 3628 3682 3707 N
+ OW T Y s n/a 26 3630 3682 3707 N
+ OW T Z b n/a 26 3631 3664 3712 N
+ OW T Z e n/a 26 3628 3664 3712 N
+ OW T Z i n/a 26 3628 3665 3712 N
+ OW T Z s n/a 26 3631 3664 3712 N
+ OW T ZH b n/a 26 3631 3682 3712 N
+ OW T ZH e n/a 26 3628 3682 3712 N
+ OW T ZH s n/a 26 3631 3682 3712 N
+ OW TH AA b n/a 26 3630 3702 3735 N
+ OW TH AA e n/a 26 3628 3702 3735 N
+ OW TH AA s n/a 26 3630 3702 3735 N
+ OW TH AE e n/a 26 3628 3702 3724 N
+ OW TH AE s n/a 26 3630 3702 3724 N
+ OW TH AH b n/a 26 3630 3702 3721 N
+ OW TH AH e n/a 26 3628 3702 3721 N
+ OW TH AH s n/a 26 3630 3702 3721 N
+ OW TH AO b n/a 26 3630 3702 3735 N
+ OW TH AO e n/a 26 3628 3702 3735 N
+ OW TH AO s n/a 26 3630 3702 3735 N
+ OW TH AW b n/a 26 3630 3702 3736 N
+ OW TH AW e n/a 26 3628 3702 3736 N
+ OW TH AW s n/a 26 3630 3702 3736 N
+ OW TH AY e n/a 26 3628 3702 3721 N
+ OW TH AY s n/a 26 3630 3702 3721 N
+ OW TH B b n/a 26 3631 3675 3718 N
+ OW TH B e n/a 26 3628 3681 3718 N
+ OW TH B i n/a 26 3628 3681 3718 N
+ OW TH B s n/a 26 3631 3681 3718 N
+ OW TH CH b n/a 26 3631 3682 3706 N
+ OW TH CH e n/a 26 3628 3682 3706 N
+ OW TH CH s n/a 26 3631 3682 3706 N
+ OW TH D b n/a 26 3631 3669 3705 N
+ OW TH D e n/a 26 3628 3669 3705 N
+ OW TH D i n/a 26 3628 3669 3705 N
+ OW TH D s n/a 26 3631 3669 3705 N
+ OW TH DH b n/a 26 3631 3664 3713 N
+ OW TH DH e n/a 26 3628 3664 3713 N
+ OW TH DH s n/a 26 3631 3664 3713 N
+ OW TH EH b n/a 26 3630 3702 3724 N
+ OW TH EH e n/a 26 3628 3702 3724 N
+ OW TH EH s n/a 26 3630 3702 3724 N
+ OW TH ER b n/a 26 3630 3702 3736 N
+ OW TH ER e n/a 26 3628 3702 3736 N
+ OW TH ER i n/a 26 3634 3702 3736 N
+ OW TH ER s n/a 26 3630 3702 3736 N
+ OW TH EY b n/a 26 3630 3702 3724 N
+ OW TH EY e n/a 26 3628 3702 3724 N
+ OW TH EY s n/a 26 3630 3702 3724 N
+ OW TH F b n/a 26 3631 3677 3717 N
+ OW TH F e n/a 26 3628 3681 3717 N
+ OW TH F s n/a 26 3631 3681 3717 N
+ OW TH G b n/a 26 3631 3678 3716 N
+ OW TH G e n/a 26 3628 3681 3716 N
+ OW TH G s n/a 26 3631 3681 3716 N
+ OW TH HH b n/a 26 3630 3677 3723 N
+ OW TH HH e n/a 26 3628 3682 3723 N
+ OW TH HH s n/a 26 3630 3682 3723 N
+ OW TH IH b n/a 26 3630 3702 3715 N
+ OW TH IH e n/a 26 3628 3702 3715 N
+ OW TH IH s n/a 26 3630 3702 3715 N
+ OW TH IY b n/a 26 3630 3702 3715 N
+ OW TH IY e n/a 26 3628 3702 3715 N
+ OW TH IY s n/a 26 3630 3702 3715 N
+ OW TH JH b n/a 26 3631 3682 3705 N
+ OW TH JH e n/a 26 3628 3682 3705 N
+ OW TH JH s n/a 26 3631 3682 3705 N
+ OW TH K b n/a 26 3631 3678 3716 N
+ OW TH K e n/a 26 3625 3681 3716 N
+ OW TH K s n/a 26 3631 3681 3716 N
+ OW TH L b n/a 26 3630 3692 3728 N
+ OW TH L e n/a 26 3628 3692 3738 N
+ OW TH L i n/a 26 3637 3692 3727 N
+ OW TH L s n/a 26 3630 3692 3727 N
+ OW TH M b n/a 26 3630 3696 3732 N
+ OW TH M e n/a 26 3628 3698 3732 N
+ OW TH M i n/a 26 3628 3698 3732 N
+ OW TH M s n/a 26 3630 3698 3732 N
+ OW TH N b n/a 26 3630 3696 3733 N
+ OW TH N e n/a 26 3628 3697 3731 N
+ OW TH N i n/a 26 3628 3697 3730 N
+ OW TH N s n/a 26 3630 3697 3731 N
+ OW TH NG e n/a 26 3628 3698 3731 N
+ OW TH NG s n/a 26 3630 3698 3731 N
+ OW TH OW e n/a 26 3628 3702 3735 N
+ OW TH OW s n/a 26 3630 3702 3735 N
+ OW TH OY b n/a 26 3630 3702 3721 N
+ OW TH OY e n/a 26 3628 3702 3721 N
+ OW TH OY s n/a 26 3630 3702 3721 N
+ OW TH P b n/a 26 3631 3675 3719 N
+ OW TH P e n/a 26 3625 3681 3719 N
+ OW TH P s n/a 26 3631 3681 3719 N
+ OW TH R b n/a 26 3630 3696 3736 N
+ OW TH R e n/a 26 3628 3698 3736 N
+ OW TH R s n/a 26 3630 3698 3736 N
+ OW TH S b n/a 26 3631 3668 3709 N
+ OW TH S e n/a 26 3628 3668 3709 N
+ OW TH S s n/a 26 3631 3669 3709 N
+ OW TH SH b n/a 26 3631 3682 3711 N
+ OW TH SH e n/a 26 3628 3682 3711 N
+ OW TH SH s n/a 26 3631 3682 3711 N
+ OW TH SIL e n/a 26 3629 3685 3725 N
+ OW TH SIL s n/a 26 3630 3683 3725 N
+ OW TH T b n/a 26 3631 3669 3706 N
+ OW TH T e n/a 26 3625 3669 3706 N
+ OW TH T i n/a 26 3626 3669 3706 N
+ OW TH T s n/a 26 3631 3669 3706 N
+ OW TH TH b n/a 26 3631 3668 3710 N
+ OW TH TH e n/a 26 3628 3668 3710 N
+ OW TH TH s n/a 26 3631 3669 3710 N
+ OW TH UH b n/a 26 3630 3702 3736 N
+ OW TH UH e n/a 26 3628 3702 3736 N
+ OW TH UH s n/a 26 3630 3702 3736 N
+ OW TH UW e n/a 26 3628 3702 3735 N
+ OW TH UW s n/a 26 3630 3702 3735 N
+ OW TH V b n/a 26 3631 3677 3720 N
+ OW TH V e n/a 26 3628 3682 3720 N
+ OW TH V s n/a 26 3631 3682 3720 N
+ OW TH W b n/a 26 3630 3677 3728 N
+ OW TH W e n/a 26 3628 3680 3737 N
+ OW TH W s n/a 26 3630 3680 3727 N
+ OW TH Y b n/a 26 3630 3682 3707 N
+ OW TH Y e n/a 26 3628 3682 3707 N
+ OW TH Y s n/a 26 3630 3682 3707 N
+ OW TH Z b n/a 26 3631 3664 3712 N
+ OW TH Z e n/a 26 3628 3664 3712 N
+ OW TH Z i n/a 26 3628 3665 3712 N
+ OW TH Z s n/a 26 3631 3664 3712 N
+ OW TH ZH b n/a 26 3631 3682 3712 N
+ OW TH ZH e n/a 26 3628 3682 3712 N
+ OW TH ZH s n/a 26 3631 3682 3712 N
+ OW UH AA b n/a 26 3652 3704 3735 N
+ OW UH AA s n/a 26 3649 3704 3735 N
+ OW UH AE s n/a 26 3649 3704 3724 N
+ OW UH AH b n/a 26 3652 3704 3721 N
+ OW UH AH s n/a 26 3649 3704 3721 N
+ OW UH AO b n/a 26 3652 3704 3735 N
+ OW UH AO s n/a 26 3649 3704 3735 N
+ OW UH AW b n/a 26 3652 3704 3736 N
+ OW UH AW s n/a 26 3649 3704 3736 N
+ OW UH AY s n/a 26 3649 3704 3721 N
+ OW UH B b n/a 26 3652 3675 3718 N
+ OW UH B s n/a 26 3649 3675 3718 N
+ OW UH CH b n/a 26 3652 3671 3706 N
+ OW UH CH s n/a 26 3652 3671 3706 N
+ OW UH D b n/a 26 3652 3671 3705 N
+ OW UH D s n/a 26 3649 3671 3705 N
+ OW UH DH b n/a 26 3652 3672 3713 N
+ OW UH DH s n/a 26 3652 3672 3713 N
+ OW UH EH b n/a 26 3652 3704 3724 N
+ OW UH EH s n/a 26 3649 3704 3724 N
+ OW UH ER b n/a 26 3652 3704 3736 N
+ OW UH ER s n/a 26 3649 3704 3736 N
+ OW UH EY b n/a 26 3652 3704 3724 N
+ OW UH EY s n/a 26 3649 3704 3724 N
+ OW UH F b n/a 26 3652 3676 3717 N
+ OW UH F s n/a 26 3652 3677 3717 N
+ OW UH G b n/a 26 3652 3678 3716 N
+ OW UH G s n/a 26 3649 3678 3716 N
+ OW UH HH b n/a 26 3652 3676 3723 N
+ OW UH HH s n/a 26 3652 3677 3723 N
+ OW UH IH b n/a 26 3652 3704 3715 N
+ OW UH IH s n/a 26 3649 3704 3715 N
+ OW UH IY b n/a 26 3652 3704 3715 N
+ OW UH IY s n/a 26 3649 3704 3715 N
+ OW UH JH b n/a 26 3652 3671 3705 N
+ OW UH JH s n/a 26 3649 3671 3705 N
+ OW UH K b n/a 26 3652 3678 3716 N
+ OW UH K s n/a 26 3652 3678 3716 N
+ OW UH L b n/a 26 3638 3692 3727 N
+ OW UH L s n/a 26 3638 3692 3727 N
+ OW UH M b n/a 26 3652 3689 3732 N
+ OW UH M s n/a 26 3652 3689 3732 N
+ OW UH N b n/a 26 3652 3688 3733 N
+ OW UH N s n/a 26 3652 3686 3731 N
+ OW UH NG s n/a 26 3652 3686 3731 N
+ OW UH OW s n/a 26 3649 3704 3735 N
+ OW UH OY b n/a 26 3652 3704 3721 N
+ OW UH OY s n/a 26 3649 3704 3721 N
+ OW UH P b n/a 26 3652 3675 3719 N
+ OW UH P s n/a 26 3652 3675 3719 N
+ OW UH R b n/a 26 3643 3696 3736 N
+ OW UH R s n/a 26 3643 3698 3736 N
+ OW UH S b n/a 26 3652 3671 3709 N
+ OW UH S s n/a 26 3652 3671 3709 N
+ OW UH SH b n/a 26 3652 3671 3711 N
+ OW UH SH s n/a 26 3652 3671 3711 N
+ OW UH SIL s n/a 26 3652 3683 3725 N
+ OW UH T b n/a 26 3652 3671 3706 N
+ OW UH T s n/a 26 3652 3671 3706 N
+ OW UH TH b n/a 26 3652 3671 3710 N
+ OW UH TH s n/a 26 3652 3671 3710 N
+ OW UH UH b n/a 26 3652 3704 3736 N
+ OW UH UH s n/a 26 3649 3704 3736 N
+ OW UH UW s n/a 26 3649 3704 3735 N
+ OW UH V b n/a 26 3652 3676 3720 N
+ OW UH V s n/a 26 3649 3677 3720 N
+ OW UH W b n/a 26 3652 3676 3727 N
+ OW UH W s n/a 26 3649 3677 3727 N
+ OW UH Y b n/a 26 3652 3671 3707 N
+ OW UH Y s n/a 26 3649 3671 3707 N
+ OW UH Z b n/a 26 3652 3672 3712 N
+ OW UH Z s n/a 26 3649 3672 3712 N
+ OW UH ZH b n/a 26 3652 3672 3712 N
+ OW UH ZH s n/a 26 3649 3672 3712 N
+ OW UW AA b n/a 26 3652 3704 3735 N
+ OW UW AA e n/a 26 3649 3704 3735 N
+ OW UW AA i n/a 26 3649 3704 3735 N
+ OW UW AA s n/a 26 3649 3704 3735 N
+ OW UW AE e n/a 26 3649 3704 3724 N
+ OW UW AE s n/a 26 3649 3704 3724 N
+ OW UW AH b n/a 26 3652 3704 3721 N
+ OW UW AH e n/a 26 3649 3704 3721 N
+ OW UW AH s n/a 26 3649 3704 3721 N
+ OW UW AO b n/a 26 3652 3704 3735 N
+ OW UW AO e n/a 26 3649 3704 3735 N
+ OW UW AO s n/a 26 3649 3704 3735 N
+ OW UW AW b n/a 26 3652 3704 3736 N
+ OW UW AW e n/a 26 3649 3704 3736 N
+ OW UW AW s n/a 26 3649 3704 3736 N
+ OW UW AY e n/a 26 3649 3704 3721 N
+ OW UW AY s n/a 26 3649 3704 3721 N
+ OW UW B b n/a 26 3652 3675 3718 N
+ OW UW B e n/a 26 3649 3675 3718 N
+ OW UW B s n/a 26 3649 3675 3718 N
+ OW UW CH b n/a 26 3652 3671 3706 N
+ OW UW CH e n/a 26 3649 3671 3706 N
+ OW UW CH i n/a 26 3651 3671 3706 N
+ OW UW CH s n/a 26 3652 3671 3706 N
+ OW UW D b n/a 26 3652 3671 3705 N
+ OW UW D e n/a 26 3649 3671 3705 N
+ OW UW D s n/a 26 3649 3671 3705 N
+ OW UW DH b n/a 26 3652 3672 3713 N
+ OW UW DH e n/a 26 3652 3672 3713 N
+ OW UW DH s n/a 26 3652 3672 3713 N
+ OW UW EH b n/a 26 3652 3704 3724 N
+ OW UW EH e n/a 26 3649 3704 3724 N
+ OW UW EH s n/a 26 3649 3704 3724 N
+ OW UW ER b n/a 26 3652 3704 3736 N
+ OW UW ER e n/a 26 3649 3704 3736 N
+ OW UW ER s n/a 26 3649 3704 3736 N
+ OW UW EY b n/a 26 3652 3704 3724 N
+ OW UW EY e n/a 26 3649 3704 3724 N
+ OW UW EY s n/a 26 3649 3704 3724 N
+ OW UW F b n/a 26 3652 3676 3717 N
+ OW UW F e n/a 26 3649 3677 3717 N
+ OW UW F s n/a 26 3652 3677 3717 N
+ OW UW G b n/a 26 3652 3678 3716 N
+ OW UW G e n/a 26 3649 3678 3716 N
+ OW UW G s n/a 26 3649 3678 3716 N
+ OW UW HH b n/a 26 3652 3676 3723 N
+ OW UW HH e n/a 26 3649 3677 3723 N
+ OW UW HH s n/a 26 3652 3677 3723 N
+ OW UW IH b n/a 26 3652 3704 3715 N
+ OW UW IH e n/a 26 3649 3704 3715 N
+ OW UW IH s n/a 26 3649 3704 3715 N
+ OW UW IY b n/a 26 3652 3704 3715 N
+ OW UW IY e n/a 26 3649 3704 3715 N
+ OW UW IY s n/a 26 3649 3704 3715 N
+ OW UW JH b n/a 26 3652 3671 3705 N
+ OW UW JH e n/a 26 3649 3671 3705 N
+ OW UW JH s n/a 26 3649 3671 3705 N
+ OW UW K b n/a 26 3652 3678 3716 N
+ OW UW K e n/a 26 3649 3678 3716 N
+ OW UW K i n/a 26 3651 3678 3716 N
+ OW UW K s n/a 26 3652 3678 3716 N
+ OW UW L b n/a 26 3638 3692 3727 N
+ OW UW L e n/a 26 3638 3692 3738 N
+ OW UW L i n/a 26 3638 3692 3727 N
+ OW UW L s n/a 26 3638 3692 3727 N
+ OW UW M b n/a 26 3652 3689 3732 N
+ OW UW M e n/a 26 3649 3689 3732 N
+ OW UW M i n/a 26 3651 3689 3732 N
+ OW UW M s n/a 26 3652 3689 3732 N
+ OW UW N b n/a 26 3652 3688 3733 N
+ OW UW N e n/a 26 3649 3686 3731 N
+ OW UW N s n/a 26 3652 3686 3731 N
+ OW UW NG e n/a 26 3649 3686 3731 N
+ OW UW NG i n/a 26 3651 3686 3731 N
+ OW UW NG s n/a 26 3652 3686 3731 N
+ OW UW OW e n/a 26 3649 3704 3735 N
+ OW UW OW s n/a 26 3649 3704 3735 N
+ OW UW OY b n/a 26 3652 3704 3721 N
+ OW UW OY e n/a 26 3649 3704 3721 N
+ OW UW OY s n/a 26 3649 3704 3721 N
+ OW UW P b n/a 26 3652 3675 3719 N
+ OW UW P e n/a 26 3649 3675 3719 N
+ OW UW P i n/a 26 3651 3675 3719 N
+ OW UW P s n/a 26 3652 3675 3719 N
+ OW UW R b n/a 26 3643 3696 3736 N
+ OW UW R e n/a 26 3643 3698 3736 N
+ OW UW R s n/a 26 3643 3698 3736 N
+ OW UW S b n/a 26 3652 3671 3709 N
+ OW UW S e n/a 26 3649 3671 3709 N
+ OW UW S i n/a 26 3651 3671 3709 N
+ OW UW S s n/a 26 3652 3671 3709 N
+ OW UW SH b n/a 26 3652 3671 3711 N
+ OW UW SH e n/a 26 3649 3671 3711 N
+ OW UW SH s n/a 26 3652 3671 3711 N
+ OW UW SIL e n/a 26 3649 3683 3725 N
+ OW UW SIL s n/a 26 3652 3683 3725 N
+ OW UW T b n/a 26 3652 3671 3706 N
+ OW UW T e n/a 26 3649 3671 3706 N
+ OW UW T i n/a 26 3651 3671 3706 N
+ OW UW T s n/a 26 3652 3671 3706 N
+ OW UW TH b n/a 26 3652 3671 3710 N
+ OW UW TH e n/a 26 3652 3671 3710 N
+ OW UW TH s n/a 26 3652 3671 3710 N
+ OW UW UH b n/a 26 3652 3704 3736 N
+ OW UW UH e n/a 26 3649 3704 3736 N
+ OW UW UH s n/a 26 3649 3704 3736 N
+ OW UW UW e n/a 26 3649 3704 3735 N
+ OW UW UW s n/a 26 3649 3704 3735 N
+ OW UW V b n/a 26 3652 3676 3720 N
+ OW UW V e n/a 26 3649 3677 3720 N
+ OW UW V s n/a 26 3649 3677 3720 N
+ OW UW W b n/a 26 3652 3676 3727 N
+ OW UW W e n/a 26 3649 3677 3737 N
+ OW UW W s n/a 26 3649 3677 3727 N
+ OW UW Y b n/a 26 3652 3671 3707 N
+ OW UW Y e n/a 26 3649 3671 3707 N
+ OW UW Y s n/a 26 3649 3671 3707 N
+ OW UW Z b n/a 26 3652 3672 3712 N
+ OW UW Z e n/a 26 3649 3672 3712 N
+ OW UW Z s n/a 26 3649 3672 3712 N
+ OW UW ZH b n/a 26 3652 3672 3712 N
+ OW UW ZH e n/a 26 3649 3672 3712 N
+ OW UW ZH s n/a 26 3649 3672 3712 N
+ OW V AA b n/a 26 3652 3704 3735 N
+ OW V AA e n/a 26 3651 3702 3735 N
+ OW V AA s n/a 26 3652 3704 3735 N
+ OW V AE e n/a 26 3651 3702 3724 N
+ OW V AE s n/a 26 3652 3704 3724 N
+ OW V AH b n/a 26 3652 3704 3721 N
+ OW V AH e n/a 26 3651 3702 3721 N
+ OW V AH i n/a 26 3651 3704 3724 N
+ OW V AH s n/a 26 3652 3704 3721 N
+ OW V AO b n/a 26 3652 3704 3735 N
+ OW V AO e n/a 26 3651 3702 3735 N
+ OW V AO s n/a 26 3652 3704 3735 N
+ OW V AW b n/a 26 3652 3704 3736 N
+ OW V AW e n/a 26 3651 3702 3736 N
+ OW V AW s n/a 26 3652 3704 3736 N
+ OW V AY e n/a 26 3651 3702 3721 N
+ OW V AY s n/a 26 3652 3704 3721 N
+ OW V B b n/a 26 3652 3675 3718 N
+ OW V B e n/a 26 3651 3676 3718 N
+ OW V B i n/a 26 3651 3676 3718 N
+ OW V B s n/a 26 3652 3676 3718 N
+ OW V CH b n/a 26 3652 3671 3705 N
+ OW V CH e n/a 26 3651 3671 3705 N
+ OW V CH s n/a 26 3652 3671 3705 N
+ OW V D b n/a 26 3652 3671 3705 N
+ OW V D e n/a 26 3651 3671 3705 N
+ OW V D i n/a 26 3651 3671 3705 N
+ OW V D s n/a 26 3652 3671 3705 N
+ OW V DH b n/a 26 3652 3672 3713 N
+ OW V DH e n/a 26 3651 3672 3713 N
+ OW V DH s n/a 26 3652 3672 3713 N
+ OW V EH b n/a 26 3652 3704 3724 N
+ OW V EH e n/a 26 3651 3702 3724 N
+ OW V EH s n/a 26 3652 3704 3724 N
+ OW V ER b n/a 26 3652 3704 3736 N
+ OW V ER e n/a 26 3651 3702 3736 N
+ OW V ER s n/a 26 3652 3704 3736 N
+ OW V EY b n/a 26 3652 3704 3724 N
+ OW V EY e n/a 26 3651 3702 3724 N
+ OW V EY s n/a 26 3652 3704 3724 N
+ OW V F b n/a 26 3652 3676 3717 N
+ OW V F e n/a 26 3651 3677 3717 N
+ OW V F i n/a 26 3651 3677 3717 N
+ OW V F s n/a 26 3652 3677 3717 N
+ OW V G b n/a 26 3652 3678 3716 N
+ OW V G e n/a 26 3651 3678 3716 N
+ OW V G i n/a 26 3651 3678 3716 N
+ OW V G s n/a 26 3652 3678 3716 N
+ OW V HH b n/a 26 3652 3676 3723 N
+ OW V HH e n/a 26 3651 3677 3723 N
+ OW V HH s n/a 26 3652 3677 3723 N
+ OW V IH b n/a 26 3652 3704 3715 N
+ OW V IH e n/a 26 3651 3702 3715 N
+ OW V IH s n/a 26 3652 3704 3715 N
+ OW V IY b n/a 26 3652 3704 3715 N
+ OW V IY e n/a 26 3651 3702 3715 N
+ OW V IY s n/a 26 3652 3704 3715 N
+ OW V JH b n/a 26 3652 3671 3705 N
+ OW V JH e n/a 26 3651 3671 3705 N
+ OW V JH i n/a 26 3651 3671 3705 N
+ OW V JH s n/a 26 3652 3671 3705 N
+ OW V K b n/a 26 3652 3678 3716 N
+ OW V K e n/a 26 3651 3678 3716 N
+ OW V K i n/a 26 3651 3678 3716 N
+ OW V K s n/a 26 3652 3678 3716 N
+ OW V L b n/a 26 3638 3692 3729 N
+ OW V L e n/a 26 3638 3692 3738 N
+ OW V L i n/a 26 3640 3692 3729 N
+ OW V L s n/a 26 3638 3692 3729 N
+ OW V M b n/a 26 3652 3690 3732 N
+ OW V M e n/a 26 3652 3690 3732 N
+ OW V M i n/a 26 3651 3690 3732 N
+ OW V M s n/a 26 3652 3690 3732 N
+ OW V N b n/a 26 3652 3688 3733 N
+ OW V N e n/a 26 3652 3688 3731 N
+ OW V N i n/a 26 3651 3688 3730 N
+ OW V N s n/a 26 3652 3688 3731 N
+ OW V NG e n/a 26 3652 3689 3731 N
+ OW V NG s n/a 26 3652 3689 3731 N
+ OW V OW e n/a 26 3651 3702 3735 N
+ OW V OW s n/a 26 3652 3704 3735 N
+ OW V OY b n/a 26 3652 3704 3721 N
+ OW V OY e n/a 26 3651 3702 3721 N
+ OW V OY s n/a 26 3652 3704 3721 N
+ OW V P b n/a 26 3652 3675 3719 N
+ OW V P e n/a 26 3651 3676 3719 N
+ OW V P s n/a 26 3652 3676 3719 N
+ OW V R b n/a 26 3643 3696 3736 N
+ OW V R e n/a 26 3646 3698 3736 N
+ OW V R s n/a 26 3646 3698 3736 N
+ OW V S b n/a 26 3652 3671 3709 N
+ OW V S e n/a 26 3651 3671 3709 N
+ OW V S i n/a 26 3651 3671 3709 N
+ OW V S s n/a 26 3652 3671 3709 N
+ OW V SH b n/a 26 3652 3671 3711 N
+ OW V SH e n/a 26 3651 3671 3711 N
+ OW V SH i n/a 26 3651 3671 3711 N
+ OW V SH s n/a 26 3652 3671 3711 N
+ OW V SIL e n/a 26 3651 3683 3725 N
+ OW V SIL s n/a 26 3652 3683 3725 N
+ OW V T b n/a 26 3652 3671 3705 N
+ OW V T e n/a 26 3651 3671 3705 N
+ OW V T i n/a 26 3651 3671 3705 N
+ OW V T s n/a 26 3652 3671 3705 N
+ OW V TH b n/a 26 3652 3671 3710 N
+ OW V TH e n/a 26 3651 3671 3710 N
+ OW V TH s n/a 26 3652 3671 3710 N
+ OW V UH b n/a 26 3652 3704 3736 N
+ OW V UH e n/a 26 3651 3702 3736 N
+ OW V UH s n/a 26 3652 3704 3736 N
+ OW V UW e n/a 26 3651 3702 3735 N
+ OW V UW s n/a 26 3652 3704 3735 N
+ OW V V b n/a 26 3652 3676 3720 N
+ OW V V e n/a 26 3651 3677 3720 N
+ OW V V i n/a 26 3651 3677 3720 N
+ OW V V s n/a 26 3652 3677 3720 N
+ OW V W b n/a 26 3652 3676 3729 N
+ OW V W e n/a 26 3651 3677 3737 N
+ OW V W s n/a 26 3652 3677 3729 N
+ OW V Y b n/a 26 3652 3671 3707 N
+ OW V Y e n/a 26 3651 3671 3707 N
+ OW V Y i n/a 26 3651 3671 3707 N
+ OW V Y s n/a 26 3652 3671 3707 N
+ OW V Z b n/a 26 3652 3672 3712 N
+ OW V Z e n/a 26 3651 3672 3712 N
+ OW V Z i n/a 26 3651 3672 3712 N
+ OW V Z s n/a 26 3652 3672 3712 N
+ OW V ZH b n/a 26 3652 3672 3712 N
+ OW V ZH e n/a 26 3651 3672 3712 N
+ OW V ZH s n/a 26 3652 3672 3712 N
+ OW W AA b n/a 26 3650 3704 3735 N
+ OW W AA e n/a 26 3650 3704 3735 N
+ OW W AA s n/a 26 3650 3704 3735 N
+ OW W AE e n/a 26 3650 3704 3724 N
+ OW W AE s n/a 26 3650 3704 3724 N
+ OW W AH b n/a 26 3650 3704 3721 N
+ OW W AH e n/a 26 3650 3704 3721 N
+ OW W AH i n/a 26 3650 3704 3724 N
+ OW W AH s n/a 26 3650 3704 3721 N
+ OW W AO b n/a 26 3650 3704 3735 N
+ OW W AO e n/a 26 3650 3704 3735 N
+ OW W AO s n/a 26 3650 3704 3735 N
+ OW W AW b n/a 26 3650 3704 3736 N
+ OW W AW e n/a 26 3650 3704 3736 N
+ OW W AW s n/a 26 3650 3704 3736 N
+ OW W AY e n/a 26 3650 3704 3721 N
+ OW W AY i n/a 26 3650 3704 3721 N
+ OW W AY s n/a 26 3650 3704 3721 N
+ OW W B b n/a 26 3650 3675 3718 N
+ OW W B e n/a 26 3650 3676 3718 N
+ OW W B i n/a 26 3650 3676 3718 N
+ OW W B s n/a 26 3650 3676 3718 N
+ OW W CH b n/a 26 3650 3673 3706 N
+ OW W CH e n/a 26 3650 3673 3706 N
+ OW W CH s n/a 26 3650 3673 3706 N
+ OW W D b n/a 26 3650 3673 3705 N
+ OW W D e n/a 26 3650 3673 3705 N
+ OW W D i n/a 26 3650 3673 3705 N
+ OW W D s n/a 26 3650 3673 3705 N
+ OW W DH b n/a 26 3650 3673 3713 N
+ OW W DH e n/a 26 3650 3673 3713 N
+ OW W DH s n/a 26 3650 3673 3713 N
+ OW W EH b n/a 26 3650 3704 3724 N
+ OW W EH e n/a 26 3650 3704 3724 N
+ OW W EH s n/a 26 3650 3704 3724 N
+ OW W ER b n/a 26 3650 3704 3736 N
+ OW W ER e n/a 26 3650 3704 3736 N
+ OW W ER i n/a 26 3650 3704 3736 N
+ OW W ER s n/a 26 3650 3704 3736 N
+ OW W EY b n/a 26 3650 3704 3724 N
+ OW W EY e n/a 26 3650 3704 3724 N
+ OW W EY s n/a 26 3650 3704 3724 N
+ OW W F b n/a 26 3650 3676 3717 N
+ OW W F e n/a 26 3650 3677 3717 N
+ OW W F i n/a 26 3650 3677 3717 N
+ OW W F s n/a 26 3650 3677 3717 N
+ OW W G b n/a 26 3650 3678 3716 N
+ OW W G e n/a 26 3650 3678 3716 N
+ OW W G i n/a 26 3650 3678 3716 N
+ OW W G s n/a 26 3650 3678 3716 N
+ OW W HH b n/a 26 3650 3676 3723 N
+ OW W HH e n/a 26 3650 3677 3723 N
+ OW W HH i n/a 26 3650 3677 3723 N
+ OW W HH s n/a 26 3650 3677 3723 N
+ OW W IH b n/a 26 3650 3704 3715 N
+ OW W IH e n/a 26 3650 3704 3715 N
+ OW W IH s n/a 26 3650 3704 3715 N
+ OW W IY b n/a 26 3650 3704 3715 N
+ OW W IY e n/a 26 3650 3704 3715 N
+ OW W IY i n/a 26 3650 3700 3715 N
+ OW W IY s n/a 26 3650 3704 3715 N
+ OW W JH b n/a 26 3650 3673 3705 N
+ OW W JH e n/a 26 3650 3673 3705 N
+ OW W JH s n/a 26 3650 3673 3705 N
+ OW W K b n/a 26 3650 3678 3716 N
+ OW W K e n/a 26 3650 3678 3716 N
+ OW W K i n/a 26 3650 3678 3716 N
+ OW W K s n/a 26 3650 3678 3716 N
+ OW W L b n/a 26 3642 3692 3727 N
+ OW W L e n/a 26 3646 3692 3738 N
+ OW W L i n/a 26 3646 3692 3727 N
+ OW W L s n/a 26 3646 3692 3727 N
+ OW W M b n/a 26 3653 3690 3732 N
+ OW W M e n/a 26 3653 3690 3732 N
+ OW W M i n/a 26 3653 3690 3732 N
+ OW W M s n/a 26 3653 3690 3732 N
+ OW W N b n/a 26 3653 3688 3733 N
+ OW W N e n/a 26 3653 3688 3731 N
+ OW W N i n/a 26 3653 3688 3731 N
+ OW W N s n/a 26 3653 3688 3731 N
+ OW W NG e n/a 26 3653 3689 3731 N
+ OW W NG s n/a 26 3653 3689 3731 N
+ OW W OW e n/a 26 3650 3704 3735 N
+ OW W OW s n/a 26 3650 3704 3735 N
+ OW W OY b n/a 26 3650 3704 3721 N
+ OW W OY e n/a 26 3650 3704 3721 N
+ OW W OY s n/a 26 3650 3704 3721 N
+ OW W P b n/a 26 3650 3675 3719 N
+ OW W P e n/a 26 3650 3676 3719 N
+ OW W P i n/a 26 3650 3676 3719 N
+ OW W P s n/a 26 3650 3676 3719 N
+ OW W R b n/a 26 3642 3696 3736 N
+ OW W R e n/a 26 3646 3698 3736 N
+ OW W R s n/a 26 3646 3698 3736 N
+ OW W S b n/a 26 3650 3673 3709 N
+ OW W S e n/a 26 3650 3673 3709 N
+ OW W S i n/a 26 3650 3673 3709 N
+ OW W S s n/a 26 3650 3673 3709 N
+ OW W SH b n/a 26 3650 3673 3711 N
+ OW W SH e n/a 26 3650 3673 3711 N
+ OW W SH i n/a 26 3650 3673 3711 N
+ OW W SH s n/a 26 3650 3673 3711 N
+ OW W SIL e n/a 26 3650 3683 3725 N
+ OW W SIL s n/a 26 3650 3683 3725 N
+ OW W T b n/a 26 3650 3673 3706 N
+ OW W T e n/a 26 3650 3673 3706 N
+ OW W T i n/a 26 3650 3673 3706 N
+ OW W T s n/a 26 3650 3673 3706 N
+ OW W TH b n/a 26 3650 3673 3710 N
+ OW W TH e n/a 26 3650 3673 3710 N
+ OW W TH i n/a 26 3650 3673 3710 N
+ OW W TH s n/a 26 3650 3673 3710 N
+ OW W UH b n/a 26 3650 3704 3736 N
+ OW W UH e n/a 26 3650 3704 3736 N
+ OW W UH s n/a 26 3650 3704 3736 N
+ OW W UW e n/a 26 3650 3704 3735 N
+ OW W UW s n/a 26 3650 3704 3735 N
+ OW W V b n/a 26 3650 3676 3720 N
+ OW W V e n/a 26 3650 3677 3720 N
+ OW W V i n/a 26 3650 3677 3720 N
+ OW W V s n/a 26 3650 3677 3720 N
+ OW W W b n/a 26 3650 3676 3727 N
+ OW W W e n/a 26 3650 3677 3737 N
+ OW W W s n/a 26 3650 3677 3727 N
+ OW W Y b n/a 26 3650 3673 3707 N
+ OW W Y e n/a 26 3650 3673 3707 N
+ OW W Y i n/a 26 3650 3673 3707 N
+ OW W Y s n/a 26 3650 3673 3707 N
+ OW W Z b n/a 26 3650 3673 3712 N
+ OW W Z e n/a 26 3650 3673 3712 N
+ OW W Z i n/a 26 3650 3673 3712 N
+ OW W Z s n/a 26 3650 3673 3712 N
+ OW W ZH b n/a 26 3650 3673 3712 N
+ OW W ZH e n/a 26 3650 3673 3712 N
+ OW W ZH s n/a 26 3650 3673 3712 N
+ OW Y AA b n/a 26 3630 3704 3735 N
+ OW Y AA e n/a 26 3612 3702 3735 N
+ OW Y AA i n/a 26 3618 3704 3735 N
+ OW Y AA s n/a 26 3618 3704 3735 N
+ OW Y AE e n/a 26 3612 3702 3724 N
+ OW Y AE i n/a 26 3618 3704 3724 N
+ OW Y AE s n/a 26 3618 3704 3724 N
+ OW Y AH b n/a 26 3630 3704 3721 N
+ OW Y AH e n/a 26 3612 3702 3721 N
+ OW Y AH i n/a 26 3618 3704 3724 N
+ OW Y AH s n/a 26 3618 3704 3721 N
+ OW Y AO b n/a 26 3630 3704 3735 N
+ OW Y AO e n/a 26 3612 3702 3735 N
+ OW Y AO s n/a 26 3618 3704 3735 N
+ OW Y AW b n/a 26 3630 3704 3736 N
+ OW Y AW e n/a 26 3612 3702 3736 N
+ OW Y AW s n/a 26 3618 3704 3736 N
+ OW Y AY e n/a 26 3612 3702 3721 N
+ OW Y AY s n/a 26 3618 3704 3721 N
+ OW Y B b n/a 26 3631 3675 3718 N
+ OW Y B e n/a 26 3612 3675 3718 N
+ OW Y B i n/a 26 3612 3675 3718 N
+ OW Y B s n/a 26 3612 3675 3718 N
+ OW Y CH b n/a 26 3631 3667 3706 N
+ OW Y CH e n/a 26 3612 3667 3706 N
+ OW Y CH i n/a 26 3612 3667 3706 N
+ OW Y CH s n/a 26 3612 3667 3706 N
+ OW Y D b n/a 26 3631 3667 3705 N
+ OW Y D e n/a 26 3612 3667 3705 N
+ OW Y D i n/a 26 3612 3667 3705 N
+ OW Y D s n/a 26 3612 3667 3705 N
+ OW Y DH b n/a 26 3631 3664 3713 N
+ OW Y DH e n/a 26 3612 3664 3713 N
+ OW Y DH s n/a 26 3612 3664 3713 N
+ OW Y EH b n/a 26 3630 3704 3724 N
+ OW Y EH e n/a 26 3612 3702 3724 N
+ OW Y EH s n/a 26 3618 3704 3724 N
+ OW Y ER b n/a 26 3630 3704 3736 N
+ OW Y ER e n/a 26 3612 3702 3736 N
+ OW Y ER i n/a 26 3618 3704 3736 N
+ OW Y ER s n/a 26 3618 3704 3736 N
+ OW Y EY b n/a 26 3630 3704 3724 N
+ OW Y EY e n/a 26 3612 3702 3724 N
+ OW Y EY s n/a 26 3618 3704 3724 N
+ OW Y F b n/a 26 3631 3677 3717 N
+ OW Y F e n/a 26 3612 3677 3717 N
+ OW Y F i n/a 26 3612 3677 3717 N
+ OW Y F s n/a 26 3612 3677 3717 N
+ OW Y G b n/a 26 3631 3678 3716 N
+ OW Y G e n/a 26 3612 3678 3716 N
+ OW Y G i n/a 26 3612 3678 3716 N
+ OW Y G s n/a 26 3612 3678 3716 N
+ OW Y HH b n/a 26 3630 3677 3723 N
+ OW Y HH e n/a 26 3612 3677 3723 N
+ OW Y HH i n/a 26 3612 3677 3723 N
+ OW Y HH s n/a 26 3612 3677 3723 N
+ OW Y IH b n/a 26 3630 3704 3715 N
+ OW Y IH e n/a 26 3612 3702 3715 N
+ OW Y IH i n/a 26 3618 3700 3714 N
+ OW Y IH s n/a 26 3618 3704 3715 N
+ OW Y IY b n/a 26 3630 3704 3715 N
+ OW Y IY e n/a 26 3612 3702 3715 N
+ OW Y IY i n/a 26 3618 3700 3715 N
+ OW Y IY s n/a 26 3618 3704 3715 N
+ OW Y JH b n/a 26 3631 3667 3705 N
+ OW Y JH e n/a 26 3612 3667 3705 N
+ OW Y JH i n/a 26 3612 3667 3705 N
+ OW Y JH s n/a 26 3612 3667 3705 N
+ OW Y K b n/a 26 3631 3678 3716 N
+ OW Y K e n/a 26 3612 3678 3716 N
+ OW Y K i n/a 26 3612 3678 3716 N
+ OW Y K s n/a 26 3612 3678 3716 N
+ OW Y L b n/a 26 3644 3695 3728 N
+ OW Y L e n/a 26 3643 3698 3738 N
+ OW Y L i n/a 26 3643 3695 3727 N
+ OW Y L s n/a 26 3643 3695 3727 N
+ OW Y M b n/a 26 3630 3689 3732 N
+ OW Y M e n/a 26 3612 3689 3732 N
+ OW Y M i n/a 26 3612 3689 3732 N
+ OW Y M s n/a 26 3612 3689 3732 N
+ OW Y N b n/a 26 3630 3687 3733 N
+ OW Y N e n/a 26 3612 3686 3731 N
+ OW Y N i n/a 26 3612 3686 3730 N
+ OW Y N s n/a 26 3612 3686 3731 N
+ OW Y NG e n/a 26 3612 3686 3731 N
+ OW Y NG s n/a 26 3612 3686 3731 N
+ OW Y OW e n/a 26 3612 3702 3735 N
+ OW Y OW s n/a 26 3618 3704 3735 N
+ OW Y OY b n/a 26 3630 3704 3721 N
+ OW Y OY e n/a 26 3612 3702 3721 N
+ OW Y OY s n/a 26 3618 3704 3721 N
+ OW Y P b n/a 26 3631 3675 3719 N
+ OW Y P e n/a 26 3612 3675 3719 N
+ OW Y P s n/a 26 3612 3675 3719 N
+ OW Y R b n/a 26 3644 3696 3736 N
+ OW Y R e n/a 26 3643 3698 3736 N
+ OW Y R i n/a 26 3643 3698 3736 N
+ OW Y R s n/a 26 3643 3698 3736 N
+ OW Y S b n/a 26 3631 3667 3709 N
+ OW Y S e n/a 26 3613 3667 3709 N
+ OW Y S i n/a 26 3613 3667 3709 N
+ OW Y S s n/a 26 3613 3667 3709 N
+ OW Y SH b n/a 26 3631 3667 3711 N
+ OW Y SH e n/a 26 3613 3667 3711 N
+ OW Y SH i n/a 26 3613 3667 3711 N
+ OW Y SH s n/a 26 3613 3667 3711 N
+ OW Y SIL e n/a 26 3612 3685 3725 N
+ OW Y SIL s n/a 26 3612 3683 3725 N
+ OW Y T b n/a 26 3631 3667 3706 N
+ OW Y T e n/a 26 3612 3667 3706 N
+ OW Y T i n/a 26 3612 3667 3706 N
+ OW Y T s n/a 26 3612 3667 3706 N
+ OW Y TH b n/a 26 3631 3667 3710 N
+ OW Y TH e n/a 26 3612 3667 3710 N
+ OW Y TH s n/a 26 3612 3667 3710 N
+ OW Y UH b n/a 26 3630 3704 3736 N
+ OW Y UH e n/a 26 3612 3702 3736 N
+ OW Y UH s n/a 26 3618 3704 3736 N
+ OW Y UW e n/a 26 3612 3702 3735 N
+ OW Y UW s n/a 26 3618 3704 3735 N
+ OW Y V b n/a 26 3631 3677 3720 N
+ OW Y V e n/a 26 3612 3677 3720 N
+ OW Y V i n/a 26 3612 3677 3720 N
+ OW Y V s n/a 26 3612 3677 3720 N
+ OW Y W b n/a 26 3630 3677 3728 N
+ OW Y W e n/a 26 3612 3677 3737 N
+ OW Y W s n/a 26 3618 3677 3727 N
+ OW Y Y b n/a 26 3630 3667 3707 N
+ OW Y Y e n/a 26 3612 3667 3707 N
+ OW Y Y i n/a 26 3618 3667 3707 N
+ OW Y Y s n/a 26 3618 3667 3707 N
+ OW Y Z b n/a 26 3631 3664 3712 N
+ OW Y Z e n/a 26 3613 3664 3712 N
+ OW Y Z i n/a 26 3613 3665 3712 N
+ OW Y Z s n/a 26 3613 3664 3712 N
+ OW Y ZH b n/a 26 3631 3664 3712 N
+ OW Y ZH e n/a 26 3613 3664 3712 N
+ OW Y ZH s n/a 26 3613 3664 3712 N
+ OW Z AA b n/a 26 3630 3702 3735 N
+ OW Z AA e n/a 26 3615 3702 3735 N
+ OW Z AA i n/a 26 3618 3702 3735 N
+ OW Z AA s n/a 26 3618 3702 3735 N
+ OW Z AE e n/a 26 3615 3702 3724 N
+ OW Z AE s n/a 26 3618 3702 3724 N
+ OW Z AH b n/a 26 3631 3702 3721 N
+ OW Z AH e n/a 26 3615 3702 3721 N
+ OW Z AH i n/a 26 3618 3702 3724 N
+ OW Z AH s n/a 26 3618 3702 3721 N
+ OW Z AO b n/a 26 3630 3702 3735 N
+ OW Z AO e n/a 26 3615 3702 3735 N
+ OW Z AO i n/a 26 3618 3702 3735 N
+ OW Z AO s n/a 26 3618 3702 3735 N
+ OW Z AW b n/a 26 3630 3702 3736 N
+ OW Z AW e n/a 26 3615 3702 3736 N
+ OW Z AW s n/a 26 3618 3702 3736 N
+ OW Z AY e n/a 26 3615 3702 3721 N
+ OW Z AY s n/a 26 3618 3702 3721 N
+ OW Z B b n/a 26 3631 3675 3718 N
+ OW Z B e n/a 26 3615 3681 3718 N
+ OW Z B i n/a 26 3615 3681 3718 N
+ OW Z B s n/a 26 3615 3681 3718 N
+ OW Z CH b n/a 26 3631 3682 3706 N
+ OW Z CH e n/a 26 3615 3682 3706 N
+ OW Z CH s n/a 26 3615 3682 3706 N
+ OW Z D b n/a 26 3631 3669 3705 N
+ OW Z D e n/a 26 3615 3669 3705 N
+ OW Z D i n/a 26 3615 3669 3705 N
+ OW Z D s n/a 26 3615 3669 3705 N
+ OW Z DH b n/a 26 3631 3669 3713 N
+ OW Z DH e n/a 26 3615 3669 3713 N
+ OW Z DH s n/a 26 3615 3669 3713 N
+ OW Z EH b n/a 26 3631 3702 3724 N
+ OW Z EH e n/a 26 3615 3702 3724 N
+ OW Z EH s n/a 26 3618 3702 3724 N
+ OW Z ER b n/a 26 3630 3702 3736 N
+ OW Z ER e n/a 26 3615 3702 3736 N
+ OW Z ER s n/a 26 3618 3702 3736 N
+ OW Z EY b n/a 26 3631 3702 3724 N
+ OW Z EY e n/a 26 3615 3702 3724 N
+ OW Z EY s n/a 26 3618 3702 3724 N
+ OW Z F b n/a 26 3631 3677 3717 N
+ OW Z F e n/a 26 3615 3681 3717 N
+ OW Z F i n/a 26 3615 3681 3717 N
+ OW Z F s n/a 26 3615 3681 3717 N
+ OW Z G b n/a 26 3631 3678 3716 N
+ OW Z G e n/a 26 3615 3681 3716 N
+ OW Z G s n/a 26 3615 3681 3716 N
+ OW Z HH b n/a 26 3631 3677 3723 N
+ OW Z HH e n/a 26 3615 3682 3723 N
+ OW Z HH i n/a 26 3615 3682 3723 N
+ OW Z HH s n/a 26 3615 3682 3723 N
+ OW Z IH b n/a 26 3631 3702 3715 N
+ OW Z IH e n/a 26 3615 3702 3715 N
+ OW Z IH i n/a 26 3618 3700 3714 N
+ OW Z IH s n/a 26 3618 3702 3715 N
+ OW Z IY b n/a 26 3631 3702 3715 N
+ OW Z IY e n/a 26 3615 3702 3715 N
+ OW Z IY i n/a 26 3618 3700 3715 N
+ OW Z IY s n/a 26 3618 3702 3715 N
+ OW Z JH b n/a 26 3631 3682 3705 N
+ OW Z JH e n/a 26 3615 3682 3705 N
+ OW Z JH s n/a 26 3615 3682 3705 N
+ OW Z K b n/a 26 3631 3678 3716 N
+ OW Z K e n/a 26 3615 3681 3716 N
+ OW Z K i n/a 26 3615 3681 3716 N
+ OW Z K s n/a 26 3615 3681 3716 N
+ OW Z L b n/a 26 3630 3695 3728 N
+ OW Z L e n/a 26 3615 3698 3738 N
+ OW Z L i n/a 26 3617 3695 3728 N
+ OW Z L s n/a 26 3618 3695 3728 N
+ OW Z M b n/a 26 3632 3696 3732 N
+ OW Z M e n/a 26 3615 3698 3732 N
+ OW Z M i n/a 26 3615 3698 3732 N
+ OW Z M s n/a 26 3615 3698 3732 N
+ OW Z N b n/a 26 3632 3696 3733 N
+ OW Z N e n/a 26 3615 3697 3731 N
+ OW Z N i n/a 26 3615 3697 3730 N
+ OW Z N s n/a 26 3615 3697 3731 N
+ OW Z NG e n/a 26 3615 3698 3731 N
+ OW Z NG s n/a 26 3615 3698 3731 N
+ OW Z OW e n/a 26 3615 3702 3735 N
+ OW Z OW s n/a 26 3618 3702 3735 N
+ OW Z OY b n/a 26 3631 3702 3721 N
+ OW Z OY e n/a 26 3615 3702 3721 N
+ OW Z OY s n/a 26 3618 3702 3721 N
+ OW Z P b n/a 26 3631 3675 3719 N
+ OW Z P e n/a 26 3615 3681 3719 N
+ OW Z P i n/a 26 3615 3681 3719 N
+ OW Z P s n/a 26 3615 3681 3719 N
+ OW Z R b n/a 26 3630 3696 3736 N
+ OW Z R e n/a 26 3615 3698 3736 N
+ OW Z R s n/a 26 3618 3698 3736 N
+ OW Z S b n/a 26 3631 3668 3709 N
+ OW Z S e n/a 26 3615 3668 3709 N
+ OW Z S i n/a 26 3615 3668 3709 N
+ OW Z S s n/a 26 3615 3669 3709 N
+ OW Z SH b n/a 26 3631 3682 3711 N
+ OW Z SH e n/a 26 3615 3682 3711 N
+ OW Z SH i n/a 26 3615 3682 3711 N
+ OW Z SH s n/a 26 3615 3682 3711 N
+ OW Z SIL e n/a 26 3615 3685 3725 N
+ OW Z SIL s n/a 26 3615 3683 3725 N
+ OW Z T b n/a 26 3631 3669 3706 N
+ OW Z T e n/a 26 3615 3669 3706 N
+ OW Z T i n/a 26 3615 3669 3706 N
+ OW Z T s n/a 26 3615 3669 3706 N
+ OW Z TH b n/a 26 3631 3668 3710 N
+ OW Z TH e n/a 26 3615 3668 3710 N
+ OW Z TH s n/a 26 3615 3669 3710 N
+ OW Z UH b n/a 26 3630 3702 3736 N
+ OW Z UH e n/a 26 3615 3702 3736 N
+ OW Z UH s n/a 26 3618 3702 3736 N
+ OW Z UW e n/a 26 3615 3702 3735 N
+ OW Z UW s n/a 26 3618 3702 3735 N
+ OW Z V b n/a 26 3631 3677 3720 N
+ OW Z V e n/a 26 3615 3682 3720 N
+ OW Z V i n/a 26 3615 3682 3720 N
+ OW Z V s n/a 26 3615 3682 3720 N
+ OW Z W b n/a 26 3630 3677 3728 N
+ OW Z W e n/a 26 3615 3680 3737 N
+ OW Z W s n/a 26 3618 3680 3728 N
+ OW Z Y b n/a 26 3631 3682 3707 N
+ OW Z Y e n/a 26 3615 3682 3707 N
+ OW Z Y s n/a 26 3618 3682 3707 N
+ OW Z Z b n/a 26 3631 3669 3712 N
+ OW Z Z e n/a 26 3615 3669 3712 N
+ OW Z Z i n/a 26 3615 3669 3712 N
+ OW Z Z s n/a 26 3615 3669 3712 N
+ OW Z ZH b n/a 26 3631 3682 3712 N
+ OW Z ZH e n/a 26 3615 3682 3712 N
+ OW Z ZH s n/a 26 3615 3682 3712 N
+ OW ZH AA b n/a 26 3630 3704 3735 N
+ OW ZH AA e n/a 26 3616 3702 3735 N
+ OW ZH AA s n/a 26 3618 3704 3735 N
+ OW ZH AE e n/a 26 3616 3702 3724 N
+ OW ZH AE s n/a 26 3618 3704 3724 N
+ OW ZH AH b n/a 26 3630 3704 3721 N
+ OW ZH AH e n/a 26 3616 3702 3721 N
+ OW ZH AH s n/a 26 3618 3704 3721 N
+ OW ZH AO b n/a 26 3630 3704 3735 N
+ OW ZH AO e n/a 26 3616 3702 3735 N
+ OW ZH AO s n/a 26 3618 3704 3735 N
+ OW ZH AW b n/a 26 3630 3704 3736 N
+ OW ZH AW e n/a 26 3616 3702 3736 N
+ OW ZH AW s n/a 26 3618 3704 3736 N
+ OW ZH AY e n/a 26 3616 3702 3721 N
+ OW ZH AY s n/a 26 3618 3704 3721 N
+ OW ZH B b n/a 26 3631 3675 3718 N
+ OW ZH B e n/a 26 3616 3675 3718 N
+ OW ZH B s n/a 26 3616 3675 3718 N
+ OW ZH CH b n/a 26 3631 3667 3706 N
+ OW ZH CH e n/a 26 3616 3667 3706 N
+ OW ZH CH s n/a 26 3616 3667 3706 N
+ OW ZH D b n/a 26 3631 3667 3705 N
+ OW ZH D e n/a 26 3616 3667 3705 N
+ OW ZH D s n/a 26 3616 3667 3705 N
+ OW ZH DH b n/a 26 3631 3665 3713 N
+ OW ZH DH e n/a 26 3616 3665 3713 N
+ OW ZH DH s n/a 26 3616 3665 3713 N
+ OW ZH EH b n/a 26 3630 3704 3724 N
+ OW ZH EH e n/a 26 3616 3702 3724 N
+ OW ZH EH i n/a 26 3618 3704 3724 N
+ OW ZH EH s n/a 26 3618 3704 3724 N
+ OW ZH ER b n/a 26 3630 3704 3736 N
+ OW ZH ER e n/a 26 3616 3702 3736 N
+ OW ZH ER s n/a 26 3618 3704 3736 N
+ OW ZH EY b n/a 26 3630 3704 3724 N
+ OW ZH EY e n/a 26 3616 3702 3724 N
+ OW ZH EY s n/a 26 3618 3704 3724 N
+ OW ZH F b n/a 26 3631 3676 3717 N
+ OW ZH F e n/a 26 3616 3677 3717 N
+ OW ZH F s n/a 26 3616 3677 3717 N
+ OW ZH G b n/a 26 3631 3678 3716 N
+ OW ZH G e n/a 26 3616 3678 3716 N
+ OW ZH G s n/a 26 3616 3678 3716 N
+ OW ZH HH b n/a 26 3630 3676 3723 N
+ OW ZH HH e n/a 26 3616 3677 3723 N
+ OW ZH HH s n/a 26 3616 3677 3723 N
+ OW ZH IH b n/a 26 3630 3704 3715 N
+ OW ZH IH e n/a 26 3616 3702 3715 N
+ OW ZH IH s n/a 26 3618 3704 3715 N
+ OW ZH IY b n/a 26 3630 3704 3715 N
+ OW ZH IY e n/a 26 3616 3702 3715 N
+ OW ZH IY s n/a 26 3618 3704 3715 N
+ OW ZH JH b n/a 26 3631 3667 3705 N
+ OW ZH JH e n/a 26 3616 3667 3705 N
+ OW ZH JH s n/a 26 3616 3667 3705 N
+ OW ZH K b n/a 26 3631 3678 3716 N
+ OW ZH K e n/a 26 3616 3678 3716 N
+ OW ZH K s n/a 26 3616 3678 3716 N
+ OW ZH L b n/a 26 3643 3689 3728 N
+ OW ZH L e n/a 26 3643 3687 3738 N
+ OW ZH L s n/a 26 3643 3687 3728 N
+ OW ZH M b n/a 26 3630 3689 3732 N
+ OW ZH M e n/a 26 3616 3689 3732 N
+ OW ZH M s n/a 26 3616 3689 3732 N
+ OW ZH N b n/a 26 3630 3688 3733 N
+ OW ZH N e n/a 26 3616 3686 3731 N
+ OW ZH N i n/a 26 3616 3686 3730 N
+ OW ZH N s n/a 26 3616 3686 3731 N
+ OW ZH NG e n/a 26 3616 3686 3731 N
+ OW ZH NG s n/a 26 3616 3686 3731 N
+ OW ZH OW e n/a 26 3616 3702 3735 N
+ OW ZH OW s n/a 26 3618 3704 3735 N
+ OW ZH OY b n/a 26 3630 3704 3721 N
+ OW ZH OY e n/a 26 3616 3702 3721 N
+ OW ZH OY s n/a 26 3618 3704 3721 N
+ OW ZH P b n/a 26 3631 3675 3719 N
+ OW ZH P e n/a 26 3616 3675 3719 N
+ OW ZH P s n/a 26 3616 3675 3719 N
+ OW ZH R b n/a 26 3643 3696 3736 N
+ OW ZH R e n/a 26 3643 3698 3736 N
+ OW ZH R s n/a 26 3643 3698 3736 N
+ OW ZH S b n/a 26 3631 3667 3709 N
+ OW ZH S e n/a 26 3616 3667 3709 N
+ OW ZH S s n/a 26 3616 3667 3709 N
+ OW ZH SH b n/a 26 3631 3667 3711 N
+ OW ZH SH e n/a 26 3616 3667 3711 N
+ OW ZH SH s n/a 26 3616 3667 3711 N
+ OW ZH SIL e n/a 26 3616 3685 3725 N
+ OW ZH SIL s n/a 26 3616 3683 3725 N
+ OW ZH T b n/a 26 3631 3667 3706 N
+ OW ZH T e n/a 26 3616 3667 3706 N
+ OW ZH T s n/a 26 3616 3667 3706 N
+ OW ZH TH b n/a 26 3631 3667 3710 N
+ OW ZH TH e n/a 26 3616 3667 3710 N
+ OW ZH TH s n/a 26 3616 3667 3710 N
+ OW ZH UH b n/a 26 3630 3704 3736 N
+ OW ZH UH e n/a 26 3616 3702 3736 N
+ OW ZH UH s n/a 26 3618 3704 3736 N
+ OW ZH UW e n/a 26 3616 3702 3735 N
+ OW ZH UW s n/a 26 3618 3704 3735 N
+ OW ZH V b n/a 26 3631 3676 3720 N
+ OW ZH V e n/a 26 3616 3677 3720 N
+ OW ZH V s n/a 26 3616 3677 3720 N
+ OW ZH W b n/a 26 3630 3676 3728 N
+ OW ZH W e n/a 26 3616 3677 3737 N
+ OW ZH W s n/a 26 3618 3677 3728 N
+ OW ZH Y b n/a 26 3630 3667 3707 N
+ OW ZH Y e n/a 26 3616 3667 3707 N
+ OW ZH Y s n/a 26 3618 3667 3707 N
+ OW ZH Z b n/a 26 3631 3665 3712 N
+ OW ZH Z e n/a 26 3616 3665 3712 N
+ OW ZH Z s n/a 26 3616 3665 3712 N
+ OW ZH ZH b n/a 26 3631 3665 3712 N
+ OW ZH ZH e n/a 26 3616 3665 3712 N
+ OW ZH ZH s n/a 26 3616 3665 3712 N
+ OY AA AA s n/a 27 3739 3747 3753 N
+ OY AA AE s n/a 27 3739 3747 3753 N
+ OY AA AH s n/a 27 3739 3747 3753 N
+ OY AA AO s n/a 27 3739 3747 3753 N
+ OY AA AW s n/a 27 3739 3747 3753 N
+ OY AA AY s n/a 27 3739 3747 3753 N
+ OY AA B s n/a 27 3739 3747 3751 N
+ OY AA CH s n/a 27 3739 3747 3751 N
+ OY AA D s n/a 27 3739 3747 3751 N
+ OY AA DH s n/a 27 3739 3747 3751 N
+ OY AA EH s n/a 27 3739 3747 3753 N
+ OY AA ER b n/a 27 3739 3747 3753 N
+ OY AA ER s n/a 27 3739 3747 3753 N
+ OY AA EY s n/a 27 3739 3747 3753 N
+ OY AA F s n/a 27 3739 3747 3752 N
+ OY AA G s n/a 27 3739 3747 3751 N
+ OY AA HH s n/a 27 3739 3747 3751 N
+ OY AA IH b n/a 27 3739 3747 3753 N
+ OY AA IH s n/a 27 3739 3747 3753 N
+ OY AA IY s n/a 27 3739 3747 3753 N
+ OY AA JH s n/a 27 3739 3747 3751 N
+ OY AA K b n/a 27 3739 3747 3751 N
+ OY AA K s n/a 27 3739 3747 3751 N
+ OY AA L b n/a 27 3739 3748 3750 N
+ OY AA L s n/a 27 3739 3748 3750 N
+ OY AA M i n/a 27 3741 3747 3755 N
+ OY AA M s n/a 27 3741 3747 3755 N
+ OY AA N b n/a 27 3741 3747 3755 N
+ OY AA N s n/a 27 3741 3747 3755 N
+ OY AA NG s n/a 27 3741 3747 3755 N
+ OY AA OW b n/a 27 3739 3747 3753 N
+ OY AA OW s n/a 27 3739 3747 3753 N
+ OY AA OY s n/a 27 3739 3747 3753 N
+ OY AA P s n/a 27 3739 3747 3751 N
+ OY AA R b n/a 27 3739 3748 3750 N
+ OY AA R s n/a 27 3739 3748 3750 N
+ OY AA S b n/a 27 3739 3747 3752 N
+ OY AA S s n/a 27 3739 3747 3752 N
+ OY AA SH s n/a 27 3739 3747 3752 N
+ OY AA SIL s n/a 27 3739 3747 3754 N
+ OY AA T i n/a 27 3739 3747 3751 N
+ OY AA T s n/a 27 3739 3747 3751 N
+ OY AA TH s n/a 27 3739 3747 3752 N
+ OY AA UH s n/a 27 3739 3747 3753 N
+ OY AA UW s n/a 27 3739 3747 3753 N
+ OY AA V s n/a 27 3739 3747 3751 N
+ OY AA W s n/a 27 3739 3747 3751 N
+ OY AA Y s n/a 27 3739 3747 3751 N
+ OY AA Z s n/a 27 3739 3747 3751 N
+ OY AA ZH s n/a 27 3739 3747 3751 N
+ OY AE AA s n/a 27 3739 3747 3753 N
+ OY AE AE s n/a 27 3739 3747 3753 N
+ OY AE AH s n/a 27 3739 3747 3753 N
+ OY AE AO s n/a 27 3739 3747 3753 N
+ OY AE AW s n/a 27 3739 3747 3753 N
+ OY AE AY s n/a 27 3739 3747 3753 N
+ OY AE B s n/a 27 3739 3747 3751 N
+ OY AE CH s n/a 27 3739 3747 3751 N
+ OY AE D s n/a 27 3739 3747 3751 N
+ OY AE DH s n/a 27 3739 3747 3751 N
+ OY AE EH s n/a 27 3739 3747 3753 N
+ OY AE ER b n/a 27 3739 3747 3753 N
+ OY AE ER s n/a 27 3739 3747 3753 N
+ OY AE EY s n/a 27 3739 3747 3753 N
+ OY AE F s n/a 27 3739 3747 3752 N
+ OY AE G s n/a 27 3739 3747 3751 N
+ OY AE HH s n/a 27 3739 3747 3751 N
+ OY AE IH b n/a 27 3739 3747 3753 N
+ OY AE IH s n/a 27 3739 3747 3753 N
+ OY AE IY s n/a 27 3739 3747 3753 N
+ OY AE JH s n/a 27 3739 3747 3751 N
+ OY AE K b n/a 27 3739 3747 3751 N
+ OY AE K s n/a 27 3739 3747 3751 N
+ OY AE L b n/a 27 3739 3748 3750 N
+ OY AE L s n/a 27 3739 3748 3750 N
+ OY AE M s n/a 27 3741 3747 3755 N
+ OY AE N b n/a 27 3741 3747 3755 N
+ OY AE N s n/a 27 3741 3747 3755 N
+ OY AE NG s n/a 27 3741 3747 3755 N
+ OY AE OW b n/a 27 3739 3747 3753 N
+ OY AE OW s n/a 27 3739 3747 3753 N
+ OY AE OY s n/a 27 3739 3747 3753 N
+ OY AE P s n/a 27 3739 3747 3751 N
+ OY AE R b n/a 27 3739 3748 3750 N
+ OY AE R s n/a 27 3739 3748 3750 N
+ OY AE S b n/a 27 3739 3747 3752 N
+ OY AE S s n/a 27 3739 3747 3752 N
+ OY AE SH s n/a 27 3739 3747 3752 N
+ OY AE SIL s n/a 27 3739 3747 3754 N
+ OY AE T s n/a 27 3739 3747 3751 N
+ OY AE TH s n/a 27 3739 3747 3752 N
+ OY AE UH s n/a 27 3739 3747 3753 N
+ OY AE UW s n/a 27 3739 3747 3753 N
+ OY AE V s n/a 27 3739 3747 3751 N
+ OY AE W s n/a 27 3739 3747 3751 N
+ OY AE Y s n/a 27 3739 3747 3751 N
+ OY AE Z i n/a 27 3739 3747 3751 N
+ OY AE Z s n/a 27 3739 3747 3751 N
+ OY AE ZH s n/a 27 3739 3747 3751 N
+ OY AH AA s n/a 27 3739 3747 3753 N
+ OY AH AE s n/a 27 3739 3747 3753 N
+ OY AH AH s n/a 27 3739 3747 3753 N
+ OY AH AO s n/a 27 3739 3747 3753 N
+ OY AH AW s n/a 27 3739 3747 3753 N
+ OY AH AY s n/a 27 3739 3747 3753 N
+ OY AH B s n/a 27 3739 3747 3751 N
+ OY AH CH s n/a 27 3739 3747 3751 N
+ OY AH D s n/a 27 3739 3747 3751 N
+ OY AH DH s n/a 27 3739 3747 3751 N
+ OY AH EH s n/a 27 3739 3747 3753 N
+ OY AH ER b n/a 27 3739 3747 3753 N
+ OY AH ER s n/a 27 3739 3747 3753 N
+ OY AH EY s n/a 27 3739 3747 3753 N
+ OY AH F s n/a 27 3739 3747 3752 N
+ OY AH G s n/a 27 3739 3747 3751 N
+ OY AH HH s n/a 27 3739 3747 3751 N
+ OY AH IH b n/a 27 3739 3747 3753 N
+ OY AH IH s n/a 27 3739 3747 3753 N
+ OY AH IY s n/a 27 3739 3747 3753 N
+ OY AH JH s n/a 27 3739 3747 3751 N
+ OY AH K b n/a 27 3739 3747 3751 N
+ OY AH K s n/a 27 3739 3747 3751 N
+ OY AH L b n/a 27 3739 3748 3750 N
+ OY AH L s n/a 27 3739 3748 3750 N
+ OY AH M s n/a 27 3741 3747 3755 N
+ OY AH N b n/a 27 3741 3747 3755 N
+ OY AH N s n/a 27 3741 3747 3755 N
+ OY AH NG s n/a 27 3741 3747 3755 N
+ OY AH OW b n/a 27 3739 3747 3753 N
+ OY AH OW s n/a 27 3739 3747 3753 N
+ OY AH OY s n/a 27 3739 3747 3753 N
+ OY AH P s n/a 27 3739 3747 3751 N
+ OY AH R b n/a 27 3739 3748 3750 N
+ OY AH R s n/a 27 3739 3748 3750 N
+ OY AH S b n/a 27 3739 3747 3752 N
+ OY AH S s n/a 27 3739 3747 3752 N
+ OY AH SH s n/a 27 3739 3747 3752 N
+ OY AH SIL s n/a 27 3739 3747 3754 N
+ OY AH T s n/a 27 3739 3747 3751 N
+ OY AH TH s n/a 27 3739 3747 3752 N
+ OY AH UH s n/a 27 3739 3747 3753 N
+ OY AH UW s n/a 27 3739 3747 3753 N
+ OY AH V s n/a 27 3739 3747 3751 N
+ OY AH W s n/a 27 3739 3747 3751 N
+ OY AH Y s n/a 27 3739 3747 3751 N
+ OY AH Z s n/a 27 3739 3747 3751 N
+ OY AH ZH s n/a 27 3739 3747 3751 N
+ OY AO AA s n/a 27 3739 3747 3753 N
+ OY AO AE s n/a 27 3739 3747 3753 N
+ OY AO AH s n/a 27 3739 3747 3753 N
+ OY AO AO s n/a 27 3739 3747 3753 N
+ OY AO AW s n/a 27 3739 3747 3753 N
+ OY AO AY s n/a 27 3739 3747 3753 N
+ OY AO B s n/a 27 3739 3747 3751 N
+ OY AO CH s n/a 27 3739 3747 3751 N
+ OY AO D s n/a 27 3739 3747 3751 N
+ OY AO DH s n/a 27 3739 3747 3751 N
+ OY AO EH s n/a 27 3739 3747 3753 N
+ OY AO ER b n/a 27 3739 3747 3753 N
+ OY AO ER s n/a 27 3739 3747 3753 N
+ OY AO EY s n/a 27 3739 3747 3753 N
+ OY AO F s n/a 27 3739 3747 3752 N
+ OY AO G s n/a 27 3739 3747 3751 N
+ OY AO HH s n/a 27 3739 3747 3751 N
+ OY AO IH b n/a 27 3739 3747 3753 N
+ OY AO IH s n/a 27 3739 3747 3753 N
+ OY AO IY s n/a 27 3739 3747 3753 N
+ OY AO JH s n/a 27 3739 3747 3751 N
+ OY AO K b n/a 27 3739 3747 3751 N
+ OY AO K s n/a 27 3739 3747 3751 N
+ OY AO L b n/a 27 3739 3748 3750 N
+ OY AO L s n/a 27 3739 3748 3750 N
+ OY AO M s n/a 27 3741 3747 3755 N
+ OY AO N b n/a 27 3741 3747 3755 N
+ OY AO N s n/a 27 3741 3747 3755 N
+ OY AO NG s n/a 27 3741 3747 3755 N
+ OY AO OW b n/a 27 3739 3747 3753 N
+ OY AO OW s n/a 27 3739 3747 3753 N
+ OY AO OY s n/a 27 3739 3747 3753 N
+ OY AO P s n/a 27 3739 3747 3751 N
+ OY AO R b n/a 27 3739 3748 3750 N
+ OY AO R s n/a 27 3739 3748 3750 N
+ OY AO S b n/a 27 3739 3747 3752 N
+ OY AO S s n/a 27 3739 3747 3752 N
+ OY AO SH s n/a 27 3739 3747 3752 N
+ OY AO SIL s n/a 27 3739 3747 3754 N
+ OY AO T s n/a 27 3739 3747 3751 N
+ OY AO TH s n/a 27 3739 3747 3752 N
+ OY AO UH s n/a 27 3739 3747 3753 N
+ OY AO UW s n/a 27 3739 3747 3753 N
+ OY AO V s n/a 27 3739 3747 3751 N
+ OY AO W s n/a 27 3739 3747 3751 N
+ OY AO Y s n/a 27 3739 3747 3751 N
+ OY AO Z s n/a 27 3739 3747 3751 N
+ OY AO ZH s n/a 27 3739 3747 3751 N
+ OY AW AA s n/a 27 3739 3747 3753 N
+ OY AW AE s n/a 27 3739 3747 3753 N
+ OY AW AH s n/a 27 3739 3747 3753 N
+ OY AW AO s n/a 27 3739 3747 3753 N
+ OY AW AW s n/a 27 3739 3747 3753 N
+ OY AW AY s n/a 27 3739 3747 3753 N
+ OY AW B s n/a 27 3739 3747 3751 N
+ OY AW CH s n/a 27 3739 3747 3751 N
+ OY AW D s n/a 27 3739 3747 3751 N
+ OY AW DH s n/a 27 3739 3747 3751 N
+ OY AW EH s n/a 27 3739 3747 3753 N
+ OY AW ER b n/a 27 3739 3747 3753 N
+ OY AW ER s n/a 27 3739 3747 3753 N
+ OY AW EY s n/a 27 3739 3747 3753 N
+ OY AW F s n/a 27 3739 3747 3752 N
+ OY AW G s n/a 27 3739 3747 3751 N
+ OY AW HH s n/a 27 3739 3747 3751 N
+ OY AW IH b n/a 27 3739 3747 3753 N
+ OY AW IH s n/a 27 3739 3747 3753 N
+ OY AW IY s n/a 27 3739 3747 3753 N
+ OY AW JH s n/a 27 3739 3747 3751 N
+ OY AW K b n/a 27 3739 3747 3751 N
+ OY AW K s n/a 27 3739 3747 3751 N
+ OY AW L b n/a 27 3739 3748 3750 N
+ OY AW L s n/a 27 3739 3748 3750 N
+ OY AW M s n/a 27 3741 3747 3755 N
+ OY AW N b n/a 27 3741 3747 3755 N
+ OY AW N s n/a 27 3741 3747 3755 N
+ OY AW NG s n/a 27 3741 3747 3755 N
+ OY AW OW b n/a 27 3739 3747 3753 N
+ OY AW OW s n/a 27 3739 3747 3753 N
+ OY AW OY s n/a 27 3739 3747 3753 N
+ OY AW P s n/a 27 3739 3747 3751 N
+ OY AW R b n/a 27 3739 3748 3750 N
+ OY AW R s n/a 27 3739 3748 3750 N
+ OY AW S b n/a 27 3739 3747 3752 N
+ OY AW S s n/a 27 3739 3747 3752 N
+ OY AW SH s n/a 27 3739 3747 3752 N
+ OY AW SIL s n/a 27 3739 3747 3754 N
+ OY AW T s n/a 27 3739 3747 3751 N
+ OY AW TH s n/a 27 3739 3747 3752 N
+ OY AW UH s n/a 27 3739 3747 3753 N
+ OY AW UW s n/a 27 3739 3747 3753 N
+ OY AW V s n/a 27 3739 3747 3751 N
+ OY AW W s n/a 27 3739 3747 3751 N
+ OY AW Y s n/a 27 3739 3747 3751 N
+ OY AW Z s n/a 27 3739 3747 3751 N
+ OY AW ZH s n/a 27 3739 3747 3751 N
+ OY AY AA s n/a 27 3739 3747 3753 N
+ OY AY AE s n/a 27 3739 3747 3753 N
+ OY AY AH s n/a 27 3739 3747 3753 N
+ OY AY AO s n/a 27 3739 3747 3753 N
+ OY AY AW s n/a 27 3739 3747 3753 N
+ OY AY AY s n/a 27 3739 3747 3753 N
+ OY AY B s n/a 27 3739 3747 3751 N
+ OY AY CH s n/a 27 3739 3747 3751 N
+ OY AY D i n/a 27 3739 3747 3751 N
+ OY AY D s n/a 27 3739 3747 3751 N
+ OY AY DH s n/a 27 3739 3747 3751 N
+ OY AY EH s n/a 27 3739 3747 3753 N
+ OY AY ER b n/a 27 3739 3747 3753 N
+ OY AY ER s n/a 27 3739 3747 3753 N
+ OY AY EY s n/a 27 3739 3747 3753 N
+ OY AY F s n/a 27 3739 3747 3752 N
+ OY AY G s n/a 27 3739 3747 3751 N
+ OY AY HH s n/a 27 3739 3747 3751 N
+ OY AY IH b n/a 27 3739 3747 3753 N
+ OY AY IH s n/a 27 3739 3747 3753 N
+ OY AY IY s n/a 27 3739 3747 3753 N
+ OY AY JH s n/a 27 3739 3747 3751 N
+ OY AY K b n/a 27 3739 3747 3751 N
+ OY AY K s n/a 27 3739 3747 3751 N
+ OY AY L b n/a 27 3739 3748 3750 N
+ OY AY L s n/a 27 3739 3748 3750 N
+ OY AY M s n/a 27 3741 3747 3755 N
+ OY AY N b n/a 27 3741 3747 3755 N
+ OY AY N s n/a 27 3741 3747 3755 N
+ OY AY NG s n/a 27 3741 3747 3755 N
+ OY AY OW b n/a 27 3739 3747 3753 N
+ OY AY OW s n/a 27 3739 3747 3753 N
+ OY AY OY s n/a 27 3739 3747 3753 N
+ OY AY P s n/a 27 3739 3747 3751 N
+ OY AY R b n/a 27 3739 3748 3750 N
+ OY AY R s n/a 27 3739 3748 3750 N
+ OY AY S b n/a 27 3739 3747 3752 N
+ OY AY S s n/a 27 3739 3747 3752 N
+ OY AY SH s n/a 27 3739 3747 3752 N
+ OY AY SIL s n/a 27 3739 3747 3754 N
+ OY AY T s n/a 27 3739 3747 3751 N
+ OY AY TH s n/a 27 3739 3747 3752 N
+ OY AY UH s n/a 27 3739 3747 3753 N
+ OY AY UW s n/a 27 3739 3747 3753 N
+ OY AY V s n/a 27 3739 3747 3751 N
+ OY AY W s n/a 27 3739 3747 3751 N
+ OY AY Y s n/a 27 3739 3747 3751 N
+ OY AY Z s n/a 27 3739 3747 3751 N
+ OY AY ZH s n/a 27 3739 3747 3751 N
+ OY B AA e n/a 27 3740 3749 3753 N
+ OY B AA i n/a 27 3740 3749 3753 N
+ OY B AA s n/a 27 3740 3749 3753 N
+ OY B AE e n/a 27 3740 3749 3753 N
+ OY B AE i n/a 27 3740 3749 3753 N
+ OY B AE s n/a 27 3740 3749 3753 N
+ OY B AH e n/a 27 3740 3749 3753 N
+ OY B AH i n/a 27 3740 3749 3753 N
+ OY B AH s n/a 27 3740 3749 3753 N
+ OY B AO e n/a 27 3740 3749 3753 N
+ OY B AO s n/a 27 3740 3749 3753 N
+ OY B AW e n/a 27 3740 3749 3753 N
+ OY B AW s n/a 27 3740 3749 3753 N
+ OY B AY e n/a 27 3740 3749 3753 N
+ OY B AY s n/a 27 3740 3749 3753 N
+ OY B B e n/a 27 3740 3749 3751 N
+ OY B B s n/a 27 3740 3749 3751 N
+ OY B CH e n/a 27 3740 3749 3751 N
+ OY B CH s n/a 27 3740 3749 3751 N
+ OY B D e n/a 27 3740 3749 3751 N
+ OY B D i n/a 27 3740 3749 3751 N
+ OY B D s n/a 27 3740 3749 3751 N
+ OY B DH e n/a 27 3740 3749 3751 N
+ OY B DH s n/a 27 3740 3749 3751 N
+ OY B EH e n/a 27 3740 3749 3753 N
+ OY B EH i n/a 27 3740 3749 3753 N
+ OY B EH s n/a 27 3740 3749 3753 N
+ OY B ER b n/a 27 3740 3749 3753 N
+ OY B ER e n/a 27 3740 3749 3753 N
+ OY B ER i n/a 27 3740 3749 3753 N
+ OY B ER s n/a 27 3740 3749 3753 N
+ OY B EY e n/a 27 3740 3749 3753 N
+ OY B EY s n/a 27 3740 3749 3753 N
+ OY B F e n/a 27 3740 3749 3752 N
+ OY B F i n/a 27 3740 3749 3752 N
+ OY B F s n/a 27 3740 3749 3752 N
+ OY B G e n/a 27 3740 3749 3751 N
+ OY B G i n/a 27 3740 3749 3751 N
+ OY B G s n/a 27 3740 3749 3751 N
+ OY B HH e n/a 27 3740 3749 3751 N
+ OY B HH i n/a 27 3740 3749 3751 N
+ OY B HH s n/a 27 3740 3749 3751 N
+ OY B IH b n/a 27 3740 3749 3753 N
+ OY B IH e n/a 27 3740 3749 3753 N
+ OY B IH i n/a 27 3740 3749 3753 N
+ OY B IH s n/a 27 3740 3749 3753 N
+ OY B IY e n/a 27 3740 3749 3753 N
+ OY B IY i n/a 27 3740 3749 3753 N
+ OY B IY s n/a 27 3740 3749 3753 N
+ OY B JH e n/a 27 3740 3749 3751 N
+ OY B JH s n/a 27 3740 3749 3751 N
+ OY B K b n/a 27 3740 3749 3751 N
+ OY B K e n/a 27 3740 3749 3751 N
+ OY B K i n/a 27 3740 3749 3751 N
+ OY B K s n/a 27 3740 3749 3751 N
+ OY B L b n/a 27 3740 3749 3750 N
+ OY B L e n/a 27 3740 3749 3750 N
+ OY B L i n/a 27 3740 3749 3750 N
+ OY B L s n/a 27 3740 3749 3750 N
+ OY B M e n/a 27 3741 3749 3755 N
+ OY B M i n/a 27 3741 3749 3755 N
+ OY B M s n/a 27 3741 3749 3755 N
+ OY B N b n/a 27 3741 3749 3755 N
+ OY B N e n/a 27 3741 3749 3755 N
+ OY B N i n/a 27 3741 3749 3755 N
+ OY B N s n/a 27 3741 3749 3755 N
+ OY B NG e n/a 27 3741 3749 3755 N
+ OY B NG s n/a 27 3741 3749 3755 N
+ OY B OW b n/a 27 3740 3749 3753 N
+ OY B OW e n/a 27 3740 3749 3753 N
+ OY B OW s n/a 27 3740 3749 3753 N
+ OY B OY e n/a 27 3740 3749 3753 N
+ OY B OY s n/a 27 3740 3749 3753 N
+ OY B P e n/a 27 3740 3749 3751 N
+ OY B P i n/a 27 3740 3749 3751 N
+ OY B P s n/a 27 3740 3749 3751 N
+ OY B R b n/a 27 3740 3749 3750 N
+ OY B R e n/a 27 3740 3749 3750 N
+ OY B R s n/a 27 3740 3749 3750 N
+ OY B S b n/a 27 3740 3749 3752 N
+ OY B S e n/a 27 3740 3749 3752 N
+ OY B S i n/a 27 3740 3749 3752 N
+ OY B S s n/a 27 3740 3749 3752 N
+ OY B SH e n/a 27 3740 3749 3752 N
+ OY B SH s n/a 27 3740 3749 3752 N
+ OY B SIL e n/a 27 3740 3749 3754 N
+ OY B SIL s n/a 27 3740 3749 3754 N
+ OY B T e n/a 27 3740 3749 3751 N
+ OY B T i n/a 27 3740 3749 3751 N
+ OY B T s n/a 27 3740 3749 3751 N
+ OY B TH e n/a 27 3740 3749 3752 N
+ OY B TH s n/a 27 3740 3749 3752 N
+ OY B UH e n/a 27 3740 3749 3753 N
+ OY B UH s n/a 27 3740 3749 3753 N
+ OY B UW e n/a 27 3740 3749 3753 N
+ OY B UW s n/a 27 3740 3749 3753 N
+ OY B V e n/a 27 3740 3749 3751 N
+ OY B V i n/a 27 3740 3749 3751 N
+ OY B V s n/a 27 3740 3749 3751 N
+ OY B W e n/a 27 3740 3749 3751 N
+ OY B W s n/a 27 3740 3749 3751 N
+ OY B Y e n/a 27 3740 3749 3751 N
+ OY B Y s n/a 27 3740 3749 3751 N
+ OY B Z e n/a 27 3740 3749 3751 N
+ OY B Z i n/a 27 3740 3749 3751 N
+ OY B Z s n/a 27 3740 3749 3751 N
+ OY B ZH e n/a 27 3740 3749 3751 N
+ OY B ZH i n/a 27 3740 3749 3751 N
+ OY B ZH s n/a 27 3740 3749 3751 N
+ OY CH AA e n/a 27 3743 3747 3753 N
+ OY CH AA s n/a 27 3743 3747 3753 N
+ OY CH AE e n/a 27 3743 3747 3753 N
+ OY CH AE s n/a 27 3743 3747 3753 N
+ OY CH AH e n/a 27 3743 3747 3753 N
+ OY CH AH s n/a 27 3743 3747 3753 N
+ OY CH AO e n/a 27 3743 3747 3753 N
+ OY CH AO s n/a 27 3743 3747 3753 N
+ OY CH AW e n/a 27 3743 3747 3753 N
+ OY CH AW s n/a 27 3743 3747 3753 N
+ OY CH AY e n/a 27 3743 3747 3753 N
+ OY CH AY s n/a 27 3743 3747 3753 N
+ OY CH B e n/a 27 3743 3747 3751 N
+ OY CH B s n/a 27 3743 3747 3751 N
+ OY CH CH e n/a 27 3743 3747 3751 N
+ OY CH CH s n/a 27 3743 3747 3751 N
+ OY CH D e n/a 27 3743 3747 3751 N
+ OY CH D i n/a 27 3743 3747 3751 N
+ OY CH D s n/a 27 3743 3747 3751 N
+ OY CH DH e n/a 27 3743 3747 3751 N
+ OY CH DH s n/a 27 3743 3747 3751 N
+ OY CH EH e n/a 27 3743 3747 3753 N
+ OY CH EH s n/a 27 3743 3747 3753 N
+ OY CH ER b n/a 27 3743 3747 3753 N
+ OY CH ER e n/a 27 3743 3747 3753 N
+ OY CH ER s n/a 27 3743 3747 3753 N
+ OY CH EY e n/a 27 3743 3747 3753 N
+ OY CH EY s n/a 27 3743 3747 3753 N
+ OY CH F e n/a 27 3743 3747 3752 N
+ OY CH F s n/a 27 3743 3747 3752 N
+ OY CH G e n/a 27 3743 3747 3751 N
+ OY CH G s n/a 27 3743 3747 3751 N
+ OY CH HH e n/a 27 3743 3747 3751 N
+ OY CH HH s n/a 27 3743 3747 3751 N
+ OY CH IH b n/a 27 3743 3747 3753 N
+ OY CH IH e n/a 27 3743 3747 3753 N
+ OY CH IH s n/a 27 3743 3747 3753 N
+ OY CH IY e n/a 27 3743 3747 3753 N
+ OY CH IY s n/a 27 3743 3747 3753 N
+ OY CH JH e n/a 27 3743 3747 3751 N
+ OY CH JH s n/a 27 3743 3747 3751 N
+ OY CH K b n/a 27 3743 3747 3751 N
+ OY CH K e n/a 27 3743 3747 3751 N
+ OY CH K s n/a 27 3743 3747 3751 N
+ OY CH L b n/a 27 3743 3748 3750 N
+ OY CH L e n/a 27 3743 3748 3750 N
+ OY CH L s n/a 27 3743 3748 3750 N
+ OY CH M e n/a 27 3743 3746 3755 N
+ OY CH M s n/a 27 3743 3746 3755 N
+ OY CH N b n/a 27 3743 3746 3755 N
+ OY CH N e n/a 27 3743 3746 3755 N
+ OY CH N i n/a 27 3743 3746 3755 N
+ OY CH N s n/a 27 3743 3746 3755 N
+ OY CH NG e n/a 27 3743 3746 3755 N
+ OY CH NG s n/a 27 3743 3746 3755 N
+ OY CH OW b n/a 27 3743 3747 3753 N
+ OY CH OW e n/a 27 3743 3747 3753 N
+ OY CH OW s n/a 27 3743 3747 3753 N
+ OY CH OY e n/a 27 3743 3747 3753 N
+ OY CH OY s n/a 27 3743 3747 3753 N
+ OY CH P e n/a 27 3743 3747 3751 N
+ OY CH P s n/a 27 3743 3747 3751 N
+ OY CH R b n/a 27 3743 3748 3750 N
+ OY CH R e n/a 27 3743 3748 3750 N
+ OY CH R s n/a 27 3743 3748 3750 N
+ OY CH S b n/a 27 3743 3747 3752 N
+ OY CH S e n/a 27 3743 3747 3752 N
+ OY CH S i n/a 27 3743 3747 3752 N
+ OY CH S s n/a 27 3743 3747 3752 N
+ OY CH SH e n/a 27 3743 3747 3752 N
+ OY CH SH s n/a 27 3743 3747 3752 N
+ OY CH SIL e n/a 27 3743 3747 3754 N
+ OY CH SIL s n/a 27 3743 3747 3754 N
+ OY CH T e n/a 27 3743 3747 3751 N
+ OY CH T s n/a 27 3743 3747 3751 N
+ OY CH TH e n/a 27 3743 3747 3752 N
+ OY CH TH s n/a 27 3743 3747 3752 N
+ OY CH UH e n/a 27 3743 3747 3753 N
+ OY CH UH s n/a 27 3743 3747 3753 N
+ OY CH UW e n/a 27 3743 3747 3753 N
+ OY CH UW s n/a 27 3743 3747 3753 N
+ OY CH V e n/a 27 3743 3747 3751 N
+ OY CH V s n/a 27 3743 3747 3751 N
+ OY CH W e n/a 27 3743 3747 3751 N
+ OY CH W s n/a 27 3743 3747 3751 N
+ OY CH Y e n/a 27 3743 3747 3751 N
+ OY CH Y s n/a 27 3743 3747 3751 N
+ OY CH Z e n/a 27 3743 3747 3751 N
+ OY CH Z i n/a 27 3743 3747 3751 N
+ OY CH Z s n/a 27 3743 3747 3751 N
+ OY CH ZH e n/a 27 3743 3747 3751 N
+ OY CH ZH s n/a 27 3743 3747 3751 N
+ OY D AA e n/a 27 3739 3747 3753 N
+ OY D AA i n/a 27 3739 3747 3753 N
+ OY D AA s n/a 27 3739 3747 3753 N
+ OY D AE e n/a 27 3739 3747 3753 N
+ OY D AE s n/a 27 3739 3747 3753 N
+ OY D AH e n/a 27 3739 3747 3753 N
+ OY D AH i n/a 27 3739 3747 3753 N
+ OY D AH s n/a 27 3739 3747 3753 N
+ OY D AO e n/a 27 3739 3747 3753 N
+ OY D AO s n/a 27 3739 3747 3753 N
+ OY D AW e n/a 27 3739 3747 3753 N
+ OY D AW s n/a 27 3739 3747 3753 N
+ OY D AY e n/a 27 3739 3747 3753 N
+ OY D AY s n/a 27 3739 3747 3753 N
+ OY D B e n/a 27 3739 3747 3751 N
+ OY D B i n/a 27 3739 3747 3751 N
+ OY D B s n/a 27 3739 3747 3751 N
+ OY D CH e n/a 27 3739 3747 3751 N
+ OY D CH i n/a 27 3739 3747 3751 N
+ OY D CH s n/a 27 3739 3747 3751 N
+ OY D D e n/a 27 3739 3747 3751 N
+ OY D D s n/a 27 3739 3747 3751 N
+ OY D DH e n/a 27 3739 3747 3751 N
+ OY D DH s n/a 27 3739 3747 3751 N
+ OY D EH e n/a 27 3739 3747 3753 N
+ OY D EH s n/a 27 3739 3747 3753 N
+ OY D ER b n/a 27 3739 3747 3753 N
+ OY D ER e n/a 27 3739 3747 3753 N
+ OY D ER s n/a 27 3739 3747 3753 N
+ OY D EY e n/a 27 3739 3747 3753 N
+ OY D EY s n/a 27 3739 3747 3753 N
+ OY D F e n/a 27 3739 3747 3752 N
+ OY D F s n/a 27 3739 3747 3752 N
+ OY D G e n/a 27 3739 3747 3751 N
+ OY D G i n/a 27 3739 3747 3751 N
+ OY D G s n/a 27 3739 3747 3751 N
+ OY D HH e n/a 27 3739 3747 3751 N
+ OY D HH s n/a 27 3739 3747 3751 N
+ OY D IH b n/a 27 3739 3747 3753 N
+ OY D IH e n/a 27 3739 3747 3753 N
+ OY D IH i n/a 27 3739 3747 3753 N
+ OY D IH s n/a 27 3739 3747 3753 N
+ OY D IY e n/a 27 3739 3747 3753 N
+ OY D IY s n/a 27 3739 3747 3753 N
+ OY D JH e n/a 27 3739 3747 3751 N
+ OY D JH i n/a 27 3739 3747 3751 N
+ OY D JH s n/a 27 3739 3747 3751 N
+ OY D K b n/a 27 3739 3747 3751 N
+ OY D K e n/a 27 3739 3747 3751 N
+ OY D K i n/a 27 3739 3747 3751 N
+ OY D K s n/a 27 3739 3747 3751 N
+ OY D L b n/a 27 3739 3748 3750 N
+ OY D L e n/a 27 3739 3748 3750 N
+ OY D L i n/a 27 3739 3748 3750 N
+ OY D L s n/a 27 3739 3748 3750 N
+ OY D M e n/a 27 3741 3747 3755 N
+ OY D M s n/a 27 3741 3747 3755 N
+ OY D N b n/a 27 3741 3747 3755 N
+ OY D N e n/a 27 3741 3747 3755 N
+ OY D N i n/a 27 3741 3747 3755 N
+ OY D N s n/a 27 3741 3747 3755 N
+ OY D NG e n/a 27 3741 3747 3755 N
+ OY D NG s n/a 27 3741 3747 3755 N
+ OY D OW b n/a 27 3739 3747 3753 N
+ OY D OW e n/a 27 3739 3747 3753 N
+ OY D OW s n/a 27 3739 3747 3753 N
+ OY D OY e n/a 27 3739 3747 3753 N
+ OY D OY s n/a 27 3739 3747 3753 N
+ OY D P e n/a 27 3739 3747 3751 N
+ OY D P s n/a 27 3739 3747 3751 N
+ OY D R b n/a 27 3739 3748 3750 N
+ OY D R e n/a 27 3739 3748 3750 N
+ OY D R i n/a 27 3739 3748 3750 N
+ OY D R s n/a 27 3739 3748 3750 N
+ OY D S b n/a 27 3739 3747 3752 N
+ OY D S e n/a 27 3739 3747 3752 N
+ OY D S i n/a 27 3739 3747 3752 N
+ OY D S s n/a 27 3739 3747 3752 N
+ OY D SH e n/a 27 3739 3747 3752 N
+ OY D SH i n/a 27 3739 3747 3752 N
+ OY D SH s n/a 27 3739 3747 3752 N
+ OY D SIL e n/a 27 3739 3747 3754 N
+ OY D SIL s n/a 27 3739 3747 3754 N
+ OY D T e n/a 27 3739 3747 3751 N
+ OY D T i n/a 27 3739 3747 3751 N
+ OY D T s n/a 27 3739 3747 3751 N
+ OY D TH e n/a 27 3739 3747 3752 N
+ OY D TH s n/a 27 3739 3747 3752 N
+ OY D UH e n/a 27 3739 3747 3753 N
+ OY D UH s n/a 27 3739 3747 3753 N
+ OY D UW e n/a 27 3739 3747 3753 N
+ OY D UW s n/a 27 3739 3747 3753 N
+ OY D V e n/a 27 3739 3747 3751 N
+ OY D V s n/a 27 3739 3747 3751 N
+ OY D W e n/a 27 3739 3747 3751 N
+ OY D W s n/a 27 3739 3747 3751 N
+ OY D Y e n/a 27 3739 3747 3751 N
+ OY D Y s n/a 27 3739 3747 3751 N
+ OY D Z e n/a 27 3739 3747 3751 N
+ OY D Z s n/a 27 3739 3747 3751 N
+ OY D ZH e n/a 27 3739 3747 3751 N
+ OY D ZH s n/a 27 3739 3747 3751 N
+ OY DH AA s n/a 27 3739 3747 3753 N
+ OY DH AE s n/a 27 3739 3747 3753 N
+ OY DH AH s n/a 27 3739 3747 3753 N
+ OY DH AO s n/a 27 3739 3747 3753 N
+ OY DH AW s n/a 27 3739 3747 3753 N
+ OY DH AY s n/a 27 3739 3747 3753 N
+ OY DH B s n/a 27 3739 3747 3751 N
+ OY DH CH s n/a 27 3739 3747 3751 N
+ OY DH D s n/a 27 3739 3747 3751 N
+ OY DH DH s n/a 27 3739 3747 3751 N
+ OY DH EH s n/a 27 3739 3747 3753 N
+ OY DH ER b n/a 27 3739 3747 3753 N
+ OY DH ER s n/a 27 3739 3747 3753 N
+ OY DH EY s n/a 27 3739 3747 3753 N
+ OY DH F s n/a 27 3739 3747 3752 N
+ OY DH G s n/a 27 3739 3747 3751 N
+ OY DH HH s n/a 27 3739 3747 3751 N
+ OY DH IH b n/a 27 3739 3747 3753 N
+ OY DH IH s n/a 27 3739 3747 3753 N
+ OY DH IY s n/a 27 3739 3747 3753 N
+ OY DH JH s n/a 27 3739 3747 3751 N
+ OY DH K b n/a 27 3739 3747 3751 N
+ OY DH K s n/a 27 3739 3747 3751 N
+ OY DH L b n/a 27 3739 3748 3750 N
+ OY DH L s n/a 27 3739 3748 3750 N
+ OY DH M s n/a 27 3741 3747 3755 N
+ OY DH N b n/a 27 3741 3747 3755 N
+ OY DH N s n/a 27 3741 3747 3755 N
+ OY DH NG s n/a 27 3741 3747 3755 N
+ OY DH OW b n/a 27 3739 3747 3753 N
+ OY DH OW s n/a 27 3739 3747 3753 N
+ OY DH OY s n/a 27 3739 3747 3753 N
+ OY DH P s n/a 27 3739 3747 3751 N
+ OY DH R b n/a 27 3739 3748 3750 N
+ OY DH R s n/a 27 3739 3748 3750 N
+ OY DH S b n/a 27 3739 3747 3752 N
+ OY DH S s n/a 27 3739 3747 3752 N
+ OY DH SH s n/a 27 3739 3747 3752 N
+ OY DH SIL s n/a 27 3739 3747 3754 N
+ OY DH T s n/a 27 3739 3747 3751 N
+ OY DH TH s n/a 27 3739 3747 3752 N
+ OY DH UH s n/a 27 3739 3747 3753 N
+ OY DH UW s n/a 27 3739 3747 3753 N
+ OY DH V s n/a 27 3739 3747 3751 N
+ OY DH W s n/a 27 3739 3747 3751 N
+ OY DH Y s n/a 27 3739 3747 3751 N
+ OY DH Z i n/a 27 3739 3747 3751 N
+ OY DH Z s n/a 27 3739 3747 3751 N
+ OY DH ZH s n/a 27 3739 3747 3751 N
+ OY EH AA s n/a 27 3739 3747 3753 N
+ OY EH AE s n/a 27 3739 3747 3753 N
+ OY EH AH s n/a 27 3739 3747 3753 N
+ OY EH AO s n/a 27 3739 3747 3753 N
+ OY EH AW s n/a 27 3739 3747 3753 N
+ OY EH AY s n/a 27 3739 3747 3753 N
+ OY EH B s n/a 27 3739 3747 3751 N
+ OY EH CH s n/a 27 3739 3747 3751 N
+ OY EH D s n/a 27 3739 3747 3751 N
+ OY EH DH s n/a 27 3739 3747 3751 N
+ OY EH EH s n/a 27 3739 3747 3753 N
+ OY EH ER b n/a 27 3739 3747 3753 N
+ OY EH ER s n/a 27 3739 3747 3753 N
+ OY EH EY s n/a 27 3739 3747 3753 N
+ OY EH F s n/a 27 3739 3747 3752 N
+ OY EH G s n/a 27 3739 3747 3751 N
+ OY EH HH s n/a 27 3739 3747 3751 N
+ OY EH IH b n/a 27 3739 3747 3753 N
+ OY EH IH s n/a 27 3739 3747 3753 N
+ OY EH IY s n/a 27 3739 3747 3753 N
+ OY EH JH s n/a 27 3739 3747 3751 N
+ OY EH K b n/a 27 3739 3747 3751 N
+ OY EH K s n/a 27 3739 3747 3751 N
+ OY EH L b n/a 27 3739 3748 3750 N
+ OY EH L s n/a 27 3739 3748 3750 N
+ OY EH M s n/a 27 3741 3747 3755 N
+ OY EH N b n/a 27 3741 3747 3755 N
+ OY EH N s n/a 27 3741 3747 3755 N
+ OY EH NG s n/a 27 3741 3747 3755 N
+ OY EH OW b n/a 27 3739 3747 3753 N
+ OY EH OW s n/a 27 3739 3747 3753 N
+ OY EH OY s n/a 27 3739 3747 3753 N
+ OY EH P s n/a 27 3739 3747 3751 N
+ OY EH R b n/a 27 3739 3748 3750 N
+ OY EH R s n/a 27 3739 3748 3750 N
+ OY EH S b n/a 27 3739 3747 3752 N
+ OY EH S s n/a 27 3739 3747 3752 N
+ OY EH SH s n/a 27 3739 3747 3752 N
+ OY EH SIL s n/a 27 3739 3747 3754 N
+ OY EH T s n/a 27 3739 3747 3751 N
+ OY EH TH s n/a 27 3739 3747 3752 N
+ OY EH UH s n/a 27 3739 3747 3753 N
+ OY EH UW s n/a 27 3739 3747 3753 N
+ OY EH V s n/a 27 3739 3747 3751 N
+ OY EH W s n/a 27 3739 3747 3751 N
+ OY EH Y s n/a 27 3739 3747 3751 N
+ OY EH Z s n/a 27 3739 3747 3751 N
+ OY EH ZH s n/a 27 3739 3747 3751 N
+ OY ER AA e n/a 27 3739 3747 3753 N
+ OY ER AA s n/a 27 3739 3747 3753 N
+ OY ER AE e n/a 27 3739 3747 3753 N
+ OY ER AE s n/a 27 3739 3747 3753 N
+ OY ER AH e n/a 27 3739 3747 3753 N
+ OY ER AH s n/a 27 3739 3747 3753 N
+ OY ER AO e n/a 27 3739 3747 3753 N
+ OY ER AO s n/a 27 3739 3747 3753 N
+ OY ER AW e n/a 27 3739 3747 3753 N
+ OY ER AW s n/a 27 3739 3747 3753 N
+ OY ER AY e n/a 27 3739 3747 3753 N
+ OY ER AY s n/a 27 3739 3747 3753 N
+ OY ER B e n/a 27 3739 3747 3751 N
+ OY ER B s n/a 27 3739 3747 3751 N
+ OY ER CH e n/a 27 3739 3747 3751 N
+ OY ER CH s n/a 27 3739 3747 3751 N
+ OY ER D e n/a 27 3739 3747 3751 N
+ OY ER D i n/a 27 3739 3747 3751 N
+ OY ER D s n/a 27 3739 3747 3751 N
+ OY ER DH e n/a 27 3739 3747 3751 N
+ OY ER DH s n/a 27 3739 3747 3751 N
+ OY ER EH e n/a 27 3739 3747 3753 N
+ OY ER EH s n/a 27 3739 3747 3753 N
+ OY ER ER b n/a 27 3739 3747 3753 N
+ OY ER ER e n/a 27 3739 3747 3753 N
+ OY ER ER s n/a 27 3739 3747 3753 N
+ OY ER EY e n/a 27 3739 3747 3753 N
+ OY ER EY s n/a 27 3739 3747 3753 N
+ OY ER F e n/a 27 3739 3747 3752 N
+ OY ER F s n/a 27 3739 3747 3752 N
+ OY ER G e n/a 27 3739 3747 3751 N
+ OY ER G s n/a 27 3739 3747 3751 N
+ OY ER HH e n/a 27 3739 3747 3751 N
+ OY ER HH s n/a 27 3739 3747 3751 N
+ OY ER IH b n/a 27 3739 3747 3753 N
+ OY ER IH e n/a 27 3739 3747 3753 N
+ OY ER IH s n/a 27 3739 3747 3753 N
+ OY ER IY e n/a 27 3739 3747 3753 N
+ OY ER IY s n/a 27 3739 3747 3753 N
+ OY ER JH e n/a 27 3739 3747 3751 N
+ OY ER JH s n/a 27 3739 3747 3751 N
+ OY ER K b n/a 27 3739 3747 3751 N
+ OY ER K e n/a 27 3739 3747 3751 N
+ OY ER K i n/a 27 3739 3747 3751 N
+ OY ER K s n/a 27 3739 3747 3751 N
+ OY ER L b n/a 27 3739 3748 3750 N
+ OY ER L e n/a 27 3739 3748 3750 N
+ OY ER L s n/a 27 3739 3748 3750 N
+ OY ER M e n/a 27 3741 3747 3755 N
+ OY ER M s n/a 27 3741 3747 3755 N
+ OY ER N b n/a 27 3741 3747 3755 N
+ OY ER N e n/a 27 3741 3747 3755 N
+ OY ER N s n/a 27 3741 3747 3755 N
+ OY ER NG e n/a 27 3741 3747 3755 N
+ OY ER NG s n/a 27 3741 3747 3755 N
+ OY ER OW b n/a 27 3739 3747 3753 N
+ OY ER OW e n/a 27 3739 3747 3753 N
+ OY ER OW i n/a 27 3739 3747 3753 N
+ OY ER OW s n/a 27 3739 3747 3753 N
+ OY ER OY e n/a 27 3739 3747 3753 N
+ OY ER OY s n/a 27 3739 3747 3753 N
+ OY ER P e n/a 27 3739 3747 3751 N
+ OY ER P s n/a 27 3739 3747 3751 N
+ OY ER R b n/a 27 3739 3748 3750 N
+ OY ER R e n/a 27 3739 3748 3750 N
+ OY ER R s n/a 27 3739 3748 3750 N
+ OY ER S b n/a 27 3739 3747 3752 N
+ OY ER S e n/a 27 3739 3747 3752 N
+ OY ER S s n/a 27 3739 3747 3752 N
+ OY ER SH e n/a 27 3739 3747 3752 N
+ OY ER SH s n/a 27 3739 3747 3752 N
+ OY ER SIL e n/a 27 3739 3747 3754 N
+ OY ER SIL s n/a 27 3739 3747 3754 N
+ OY ER T e n/a 27 3739 3747 3751 N
+ OY ER T s n/a 27 3739 3747 3751 N
+ OY ER TH e n/a 27 3739 3747 3752 N
+ OY ER TH s n/a 27 3739 3747 3752 N
+ OY ER UH e n/a 27 3739 3747 3753 N
+ OY ER UH s n/a 27 3739 3747 3753 N
+ OY ER UW e n/a 27 3739 3747 3753 N
+ OY ER UW s n/a 27 3739 3747 3753 N
+ OY ER V e n/a 27 3739 3747 3751 N
+ OY ER V s n/a 27 3739 3747 3751 N
+ OY ER W e n/a 27 3739 3747 3751 N
+ OY ER W s n/a 27 3739 3747 3751 N
+ OY ER Y e n/a 27 3739 3747 3751 N
+ OY ER Y s n/a 27 3739 3747 3751 N
+ OY ER Z e n/a 27 3739 3747 3751 N
+ OY ER Z s n/a 27 3739 3747 3751 N
+ OY ER ZH e n/a 27 3739 3747 3751 N
+ OY ER ZH s n/a 27 3739 3747 3751 N
+ OY EY AA s n/a 27 3739 3747 3753 N
+ OY EY AE s n/a 27 3739 3747 3753 N
+ OY EY AH s n/a 27 3739 3747 3753 N
+ OY EY AO s n/a 27 3739 3747 3753 N
+ OY EY AW s n/a 27 3739 3747 3753 N
+ OY EY AY s n/a 27 3739 3747 3753 N
+ OY EY B s n/a 27 3739 3747 3751 N
+ OY EY CH s n/a 27 3739 3747 3751 N
+ OY EY D s n/a 27 3739 3747 3751 N
+ OY EY DH s n/a 27 3739 3747 3751 N
+ OY EY EH s n/a 27 3739 3747 3753 N
+ OY EY ER b n/a 27 3739 3747 3753 N
+ OY EY ER s n/a 27 3739 3747 3753 N
+ OY EY EY s n/a 27 3739 3747 3753 N
+ OY EY F s n/a 27 3739 3747 3752 N
+ OY EY G s n/a 27 3739 3747 3751 N
+ OY EY HH s n/a 27 3739 3747 3751 N
+ OY EY IH b n/a 27 3739 3747 3753 N
+ OY EY IH s n/a 27 3739 3747 3753 N
+ OY EY IY s n/a 27 3739 3747 3753 N
+ OY EY JH s n/a 27 3739 3747 3751 N
+ OY EY K b n/a 27 3739 3747 3751 N
+ OY EY K s n/a 27 3739 3747 3751 N
+ OY EY L b n/a 27 3739 3748 3750 N
+ OY EY L i n/a 27 3739 3748 3750 N
+ OY EY L s n/a 27 3739 3748 3750 N
+ OY EY M s n/a 27 3741 3747 3755 N
+ OY EY N b n/a 27 3741 3747 3755 N
+ OY EY N s n/a 27 3741 3747 3755 N
+ OY EY NG s n/a 27 3741 3747 3755 N
+ OY EY OW b n/a 27 3739 3747 3753 N
+ OY EY OW s n/a 27 3739 3747 3753 N
+ OY EY OY s n/a 27 3739 3747 3753 N
+ OY EY P s n/a 27 3739 3747 3751 N
+ OY EY R b n/a 27 3739 3748 3750 N
+ OY EY R s n/a 27 3739 3748 3750 N
+ OY EY S b n/a 27 3739 3747 3752 N
+ OY EY S s n/a 27 3739 3747 3752 N
+ OY EY SH s n/a 27 3739 3747 3752 N
+ OY EY SIL s n/a 27 3739 3747 3754 N
+ OY EY T s n/a 27 3739 3747 3751 N
+ OY EY TH s n/a 27 3739 3747 3752 N
+ OY EY UH s n/a 27 3739 3747 3753 N
+ OY EY UW s n/a 27 3739 3747 3753 N
+ OY EY V s n/a 27 3739 3747 3751 N
+ OY EY W s n/a 27 3739 3747 3751 N
+ OY EY Y s n/a 27 3739 3747 3751 N
+ OY EY Z s n/a 27 3739 3747 3751 N
+ OY EY ZH s n/a 27 3739 3747 3751 N
+ OY F AA e n/a 27 3740 3749 3753 N
+ OY F AA s n/a 27 3740 3749 3753 N
+ OY F AE e n/a 27 3740 3749 3753 N
+ OY F AE s n/a 27 3740 3749 3753 N
+ OY F AH e n/a 27 3740 3749 3753 N
+ OY F AH i n/a 27 3740 3749 3753 N
+ OY F AH s n/a 27 3740 3749 3753 N
+ OY F AO e n/a 27 3740 3749 3753 N
+ OY F AO s n/a 27 3740 3749 3753 N
+ OY F AW e n/a 27 3740 3749 3753 N
+ OY F AW s n/a 27 3740 3749 3753 N
+ OY F AY e n/a 27 3740 3749 3753 N
+ OY F AY s n/a 27 3740 3749 3753 N
+ OY F B e n/a 27 3740 3749 3751 N
+ OY F B i n/a 27 3740 3749 3751 N
+ OY F B s n/a 27 3740 3749 3751 N
+ OY F CH e n/a 27 3740 3749 3751 N
+ OY F CH s n/a 27 3740 3749 3751 N
+ OY F D e n/a 27 3740 3749 3751 N
+ OY F D i n/a 27 3740 3749 3751 N
+ OY F D s n/a 27 3740 3749 3751 N
+ OY F DH e n/a 27 3740 3749 3751 N
+ OY F DH s n/a 27 3740 3749 3751 N
+ OY F EH e n/a 27 3740 3749 3753 N
+ OY F EH s n/a 27 3740 3749 3753 N
+ OY F ER b n/a 27 3740 3749 3753 N
+ OY F ER e n/a 27 3740 3749 3753 N
+ OY F ER i n/a 27 3740 3749 3753 N
+ OY F ER s n/a 27 3740 3749 3753 N
+ OY F EY e n/a 27 3740 3749 3753 N
+ OY F EY s n/a 27 3740 3749 3753 N
+ OY F F e n/a 27 3740 3749 3752 N
+ OY F F s n/a 27 3740 3749 3752 N
+ OY F G e n/a 27 3740 3749 3751 N
+ OY F G s n/a 27 3740 3749 3751 N
+ OY F HH e n/a 27 3740 3749 3751 N
+ OY F HH s n/a 27 3740 3749 3751 N
+ OY F IH b n/a 27 3740 3749 3753 N
+ OY F IH e n/a 27 3740 3749 3753 N
+ OY F IH s n/a 27 3740 3749 3753 N
+ OY F IY e n/a 27 3740 3749 3753 N
+ OY F IY s n/a 27 3740 3749 3753 N
+ OY F JH e n/a 27 3740 3749 3751 N
+ OY F JH s n/a 27 3740 3749 3751 N
+ OY F K b n/a 27 3740 3749 3751 N
+ OY F K e n/a 27 3740 3749 3751 N
+ OY F K i n/a 27 3740 3749 3751 N
+ OY F K s n/a 27 3740 3749 3751 N
+ OY F L b n/a 27 3740 3749 3750 N
+ OY F L e n/a 27 3740 3749 3750 N
+ OY F L i n/a 27 3740 3749 3750 N
+ OY F L s n/a 27 3740 3749 3750 N
+ OY F M e n/a 27 3741 3746 3755 N
+ OY F M s n/a 27 3741 3746 3755 N
+ OY F N b n/a 27 3741 3746 3755 N
+ OY F N e n/a 27 3741 3746 3755 N
+ OY F N i n/a 27 3741 3746 3755 N
+ OY F N s n/a 27 3741 3746 3755 N
+ OY F NG e n/a 27 3741 3746 3755 N
+ OY F NG s n/a 27 3741 3746 3755 N
+ OY F OW b n/a 27 3740 3749 3753 N
+ OY F OW e n/a 27 3740 3749 3753 N
+ OY F OW s n/a 27 3740 3749 3753 N
+ OY F OY e n/a 27 3740 3749 3753 N
+ OY F OY s n/a 27 3740 3749 3753 N
+ OY F P e n/a 27 3740 3749 3751 N
+ OY F P s n/a 27 3740 3749 3751 N
+ OY F R b n/a 27 3740 3749 3750 N
+ OY F R e n/a 27 3740 3749 3750 N
+ OY F R s n/a 27 3740 3749 3750 N
+ OY F S b n/a 27 3740 3749 3752 N
+ OY F S e n/a 27 3740 3749 3752 N
+ OY F S i n/a 27 3740 3749 3752 N
+ OY F S s n/a 27 3740 3749 3752 N
+ OY F SH e n/a 27 3740 3749 3752 N
+ OY F SH s n/a 27 3740 3749 3752 N
+ OY F SIL e n/a 27 3740 3749 3754 N
+ OY F SIL s n/a 27 3740 3749 3754 N
+ OY F T e n/a 27 3740 3749 3751 N
+ OY F T i n/a 27 3740 3749 3751 N
+ OY F T s n/a 27 3740 3749 3751 N
+ OY F TH e n/a 27 3740 3749 3752 N
+ OY F TH s n/a 27 3740 3749 3752 N
+ OY F UH e n/a 27 3740 3749 3753 N
+ OY F UH s n/a 27 3740 3749 3753 N
+ OY F UW e n/a 27 3740 3749 3753 N
+ OY F UW s n/a 27 3740 3749 3753 N
+ OY F V e n/a 27 3740 3749 3751 N
+ OY F V s n/a 27 3740 3749 3751 N
+ OY F W e n/a 27 3740 3749 3751 N
+ OY F W s n/a 27 3740 3749 3751 N
+ OY F Y e n/a 27 3740 3749 3751 N
+ OY F Y s n/a 27 3740 3749 3751 N
+ OY F Z e n/a 27 3740 3749 3751 N
+ OY F Z i n/a 27 3740 3749 3751 N
+ OY F Z s n/a 27 3740 3749 3751 N
+ OY F ZH e n/a 27 3740 3749 3751 N
+ OY F ZH s n/a 27 3740 3749 3751 N
+ OY G AA e n/a 27 3739 3747 3753 N
+ OY G AA s n/a 27 3739 3747 3753 N
+ OY G AE e n/a 27 3739 3747 3753 N
+ OY G AE s n/a 27 3739 3747 3753 N
+ OY G AH e n/a 27 3739 3747 3753 N
+ OY G AH i n/a 27 3739 3747 3753 N
+ OY G AH s n/a 27 3739 3747 3753 N
+ OY G AO e n/a 27 3739 3747 3753 N
+ OY G AO s n/a 27 3739 3747 3753 N
+ OY G AW e n/a 27 3739 3747 3753 N
+ OY G AW s n/a 27 3739 3747 3753 N
+ OY G AY e n/a 27 3739 3747 3753 N
+ OY G AY s n/a 27 3739 3747 3753 N
+ OY G B e n/a 27 3739 3747 3751 N
+ OY G B s n/a 27 3739 3747 3751 N
+ OY G CH e n/a 27 3739 3747 3751 N
+ OY G CH s n/a 27 3739 3747 3751 N
+ OY G D e n/a 27 3739 3747 3751 N
+ OY G D i n/a 27 3739 3747 3751 N
+ OY G D s n/a 27 3739 3747 3751 N
+ OY G DH e n/a 27 3739 3747 3751 N
+ OY G DH s n/a 27 3739 3747 3751 N
+ OY G EH e n/a 27 3739 3747 3753 N
+ OY G EH i n/a 27 3739 3747 3753 N
+ OY G EH s n/a 27 3739 3747 3753 N
+ OY G ER b n/a 27 3739 3747 3753 N
+ OY G ER e n/a 27 3739 3747 3753 N
+ OY G ER i n/a 27 3739 3747 3753 N
+ OY G ER s n/a 27 3739 3747 3753 N
+ OY G EY e n/a 27 3739 3747 3753 N
+ OY G EY s n/a 27 3739 3747 3753 N
+ OY G F e n/a 27 3739 3747 3752 N
+ OY G F s n/a 27 3739 3747 3752 N
+ OY G G e n/a 27 3739 3747 3751 N
+ OY G G s n/a 27 3739 3747 3751 N
+ OY G HH e n/a 27 3739 3747 3751 N
+ OY G HH s n/a 27 3739 3747 3751 N
+ OY G IH b n/a 27 3739 3747 3753 N
+ OY G IH e n/a 27 3739 3747 3753 N
+ OY G IH i n/a 27 3739 3747 3753 N
+ OY G IH s n/a 27 3739 3747 3753 N
+ OY G IY e n/a 27 3739 3747 3753 N
+ OY G IY s n/a 27 3739 3747 3753 N
+ OY G JH e n/a 27 3739 3747 3751 N
+ OY G JH s n/a 27 3739 3747 3751 N
+ OY G K b n/a 27 3739 3747 3751 N
+ OY G K e n/a 27 3739 3747 3751 N
+ OY G K i n/a 27 3739 3747 3751 N
+ OY G K s n/a 27 3739 3747 3751 N
+ OY G L b n/a 27 3739 3748 3750 N
+ OY G L e n/a 27 3739 3748 3750 N
+ OY G L i n/a 27 3739 3748 3750 N
+ OY G L s n/a 27 3739 3748 3750 N
+ OY G M e n/a 27 3741 3747 3755 N
+ OY G M s n/a 27 3741 3747 3755 N
+ OY G N b n/a 27 3741 3747 3755 N
+ OY G N e n/a 27 3741 3747 3755 N
+ OY G N i n/a 27 3741 3747 3755 N
+ OY G N s n/a 27 3741 3747 3755 N
+ OY G NG e n/a 27 3741 3747 3755 N
+ OY G NG s n/a 27 3741 3747 3755 N
+ OY G OW b n/a 27 3739 3747 3753 N
+ OY G OW e n/a 27 3739 3747 3753 N
+ OY G OW s n/a 27 3739 3747 3753 N
+ OY G OY e n/a 27 3739 3747 3753 N
+ OY G OY s n/a 27 3739 3747 3753 N
+ OY G P e n/a 27 3739 3747 3751 N
+ OY G P s n/a 27 3739 3747 3751 N
+ OY G R b n/a 27 3739 3748 3750 N
+ OY G R e n/a 27 3739 3748 3750 N
+ OY G R s n/a 27 3739 3748 3750 N
+ OY G S b n/a 27 3739 3747 3752 N
+ OY G S e n/a 27 3739 3747 3752 N
+ OY G S s n/a 27 3739 3747 3752 N
+ OY G SH e n/a 27 3739 3747 3752 N
+ OY G SH s n/a 27 3739 3747 3752 N
+ OY G SIL e n/a 27 3739 3747 3754 N
+ OY G SIL s n/a 27 3739 3747 3754 N
+ OY G T e n/a 27 3739 3747 3751 N
+ OY G T i n/a 27 3739 3747 3751 N
+ OY G T s n/a 27 3739 3747 3751 N
+ OY G TH e n/a 27 3739 3747 3752 N
+ OY G TH s n/a 27 3739 3747 3752 N
+ OY G UH e n/a 27 3739 3747 3753 N
+ OY G UH s n/a 27 3739 3747 3753 N
+ OY G UW e n/a 27 3739 3747 3753 N
+ OY G UW s n/a 27 3739 3747 3753 N
+ OY G V e n/a 27 3739 3747 3751 N
+ OY G V s n/a 27 3739 3747 3751 N
+ OY G W e n/a 27 3739 3747 3751 N
+ OY G W s n/a 27 3739 3747 3751 N
+ OY G Y e n/a 27 3739 3747 3751 N
+ OY G Y s n/a 27 3739 3747 3751 N
+ OY G Z e n/a 27 3739 3747 3751 N
+ OY G Z i n/a 27 3739 3747 3751 N
+ OY G Z s n/a 27 3739 3747 3751 N
+ OY G ZH e n/a 27 3739 3747 3751 N
+ OY G ZH s n/a 27 3739 3747 3751 N
+ OY HH AA e n/a 27 3739 3747 3753 N
+ OY HH AA s n/a 27 3739 3747 3753 N
+ OY HH AE e n/a 27 3739 3747 3753 N
+ OY HH AE s n/a 27 3739 3747 3753 N
+ OY HH AH e n/a 27 3739 3747 3753 N
+ OY HH AH s n/a 27 3739 3747 3753 N
+ OY HH AO e n/a 27 3739 3747 3753 N
+ OY HH AO s n/a 27 3739 3747 3753 N
+ OY HH AW e n/a 27 3739 3747 3753 N
+ OY HH AW s n/a 27 3739 3747 3753 N
+ OY HH AY e n/a 27 3739 3747 3753 N
+ OY HH AY s n/a 27 3739 3747 3753 N
+ OY HH B e n/a 27 3739 3747 3751 N
+ OY HH B i n/a 27 3739 3747 3751 N
+ OY HH B s n/a 27 3739 3747 3751 N
+ OY HH CH e n/a 27 3739 3747 3751 N
+ OY HH CH s n/a 27 3739 3747 3751 N
+ OY HH D e n/a 27 3739 3747 3751 N
+ OY HH D i n/a 27 3739 3747 3751 N
+ OY HH D s n/a 27 3739 3747 3751 N
+ OY HH DH e n/a 27 3739 3747 3751 N
+ OY HH DH s n/a 27 3739 3747 3751 N
+ OY HH EH e n/a 27 3739 3747 3753 N
+ OY HH EH s n/a 27 3739 3747 3753 N
+ OY HH ER b n/a 27 3739 3747 3753 N
+ OY HH ER e n/a 27 3739 3747 3753 N
+ OY HH ER i n/a 27 3739 3747 3753 N
+ OY HH ER s n/a 27 3739 3747 3753 N
+ OY HH EY e n/a 27 3739 3747 3753 N
+ OY HH EY s n/a 27 3739 3747 3753 N
+ OY HH F e n/a 27 3739 3747 3752 N
+ OY HH F s n/a 27 3739 3747 3752 N
+ OY HH G e n/a 27 3739 3747 3751 N
+ OY HH G s n/a 27 3739 3747 3751 N
+ OY HH HH e n/a 27 3739 3747 3751 N
+ OY HH HH i n/a 27 3739 3747 3751 N
+ OY HH HH s n/a 27 3739 3747 3751 N
+ OY HH IH b n/a 27 3739 3747 3753 N
+ OY HH IH e n/a 27 3739 3747 3753 N
+ OY HH IH i n/a 27 3739 3747 3753 N
+ OY HH IH s n/a 27 3739 3747 3753 N
+ OY HH IY e n/a 27 3739 3747 3753 N
+ OY HH IY s n/a 27 3739 3747 3753 N
+ OY HH JH e n/a 27 3739 3747 3751 N
+ OY HH JH s n/a 27 3739 3747 3751 N
+ OY HH K b n/a 27 3739 3747 3751 N
+ OY HH K e n/a 27 3739 3747 3751 N
+ OY HH K s n/a 27 3739 3747 3751 N
+ OY HH L b n/a 27 3739 3748 3750 N
+ OY HH L e n/a 27 3739 3748 3750 N
+ OY HH L i n/a 27 3739 3748 3750 N
+ OY HH L s n/a 27 3739 3748 3750 N
+ OY HH M e n/a 27 3741 3746 3755 N
+ OY HH M s n/a 27 3741 3746 3755 N
+ OY HH N b n/a 27 3741 3746 3755 N
+ OY HH N e n/a 27 3741 3746 3755 N
+ OY HH N i n/a 27 3741 3746 3755 N
+ OY HH N s n/a 27 3741 3746 3755 N
+ OY HH NG e n/a 27 3741 3746 3755 N
+ OY HH NG s n/a 27 3741 3746 3755 N
+ OY HH OW b n/a 27 3739 3747 3753 N
+ OY HH OW e n/a 27 3739 3747 3753 N
+ OY HH OW i n/a 27 3739 3747 3753 N
+ OY HH OW s n/a 27 3739 3747 3753 N
+ OY HH OY e n/a 27 3739 3747 3753 N
+ OY HH OY s n/a 27 3739 3747 3753 N
+ OY HH P e n/a 27 3739 3747 3751 N
+ OY HH P i n/a 27 3739 3747 3751 N
+ OY HH P s n/a 27 3739 3747 3751 N
+ OY HH R b n/a 27 3739 3748 3750 N
+ OY HH R e n/a 27 3739 3748 3750 N
+ OY HH R s n/a 27 3739 3748 3750 N
+ OY HH S b n/a 27 3739 3747 3752 N
+ OY HH S e n/a 27 3739 3747 3752 N
+ OY HH S i n/a 27 3739 3747 3752 N
+ OY HH S s n/a 27 3739 3747 3752 N
+ OY HH SH e n/a 27 3739 3747 3752 N
+ OY HH SH s n/a 27 3739 3747 3752 N
+ OY HH SIL e n/a 27 3739 3747 3754 N
+ OY HH SIL s n/a 27 3739 3747 3754 N
+ OY HH T e n/a 27 3739 3747 3751 N
+ OY HH T i n/a 27 3739 3747 3751 N
+ OY HH T s n/a 27 3739 3747 3751 N
+ OY HH TH e n/a 27 3739 3747 3752 N
+ OY HH TH s n/a 27 3739 3747 3752 N
+ OY HH UH e n/a 27 3739 3747 3753 N
+ OY HH UH s n/a 27 3739 3747 3753 N
+ OY HH UW e n/a 27 3739 3747 3753 N
+ OY HH UW s n/a 27 3739 3747 3753 N
+ OY HH V e n/a 27 3739 3747 3751 N
+ OY HH V i n/a 27 3739 3747 3751 N
+ OY HH V s n/a 27 3739 3747 3751 N
+ OY HH W e n/a 27 3739 3747 3751 N
+ OY HH W s n/a 27 3739 3747 3751 N
+ OY HH Y e n/a 27 3739 3747 3751 N
+ OY HH Y i n/a 27 3739 3747 3751 N
+ OY HH Y s n/a 27 3739 3747 3751 N
+ OY HH Z e n/a 27 3739 3747 3751 N
+ OY HH Z i n/a 27 3739 3747 3751 N
+ OY HH Z s n/a 27 3739 3747 3751 N
+ OY HH ZH e n/a 27 3739 3747 3751 N
+ OY HH ZH s n/a 27 3739 3747 3751 N
+ OY IH AA s n/a 27 3739 3747 3753 N
+ OY IH AE s n/a 27 3739 3747 3753 N
+ OY IH AH s n/a 27 3739 3747 3753 N
+ OY IH AO s n/a 27 3739 3747 3753 N
+ OY IH AW s n/a 27 3739 3747 3753 N
+ OY IH AY s n/a 27 3739 3747 3753 N
+ OY IH B s n/a 27 3739 3747 3751 N
+ OY IH CH s n/a 27 3739 3747 3751 N
+ OY IH D i n/a 27 3739 3747 3751 N
+ OY IH D s n/a 27 3739 3747 3751 N
+ OY IH DH s n/a 27 3739 3747 3751 N
+ OY IH EH s n/a 27 3739 3747 3753 N
+ OY IH ER b n/a 27 3739 3747 3753 N
+ OY IH ER s n/a 27 3739 3747 3753 N
+ OY IH EY s n/a 27 3739 3747 3753 N
+ OY IH F s n/a 27 3739 3747 3752 N
+ OY IH G s n/a 27 3739 3747 3751 N
+ OY IH HH s n/a 27 3739 3747 3751 N
+ OY IH IH b n/a 27 3739 3747 3753 N
+ OY IH IH s n/a 27 3739 3747 3753 N
+ OY IH IY s n/a 27 3739 3747 3753 N
+ OY IH JH s n/a 27 3739 3747 3751 N
+ OY IH K b n/a 27 3739 3747 3751 N
+ OY IH K s n/a 27 3739 3747 3751 N
+ OY IH L b n/a 27 3739 3748 3750 N
+ OY IH L s n/a 27 3739 3748 3750 N
+ OY IH M s n/a 27 3741 3747 3755 N
+ OY IH N b n/a 27 3741 3747 3755 N
+ OY IH N i n/a 27 3741 3747 3755 N
+ OY IH N s n/a 27 3741 3747 3755 N
+ OY IH NG s n/a 27 3741 3747 3755 N
+ OY IH OW b n/a 27 3739 3747 3753 N
+ OY IH OW s n/a 27 3739 3747 3753 N
+ OY IH OY s n/a 27 3739 3747 3753 N
+ OY IH P s n/a 27 3739 3747 3751 N
+ OY IH R b n/a 27 3739 3748 3750 N
+ OY IH R s n/a 27 3739 3748 3750 N
+ OY IH S b n/a 27 3739 3747 3752 N
+ OY IH S s n/a 27 3739 3747 3752 N
+ OY IH SH s n/a 27 3739 3747 3752 N
+ OY IH SIL s n/a 27 3739 3747 3754 N
+ OY IH T s n/a 27 3739 3747 3751 N
+ OY IH TH s n/a 27 3739 3747 3752 N
+ OY IH UH s n/a 27 3739 3747 3753 N
+ OY IH UW s n/a 27 3739 3747 3753 N
+ OY IH V s n/a 27 3739 3747 3751 N
+ OY IH W s n/a 27 3739 3747 3751 N
+ OY IH Y s n/a 27 3739 3747 3751 N
+ OY IH Z s n/a 27 3739 3747 3751 N
+ OY IH ZH s n/a 27 3739 3747 3751 N
+ OY IY AA e n/a 27 3739 3747 3753 N
+ OY IY AA s n/a 27 3739 3747 3753 N
+ OY IY AE e n/a 27 3739 3747 3753 N
+ OY IY AE s n/a 27 3739 3747 3753 N
+ OY IY AH e n/a 27 3739 3747 3753 N
+ OY IY AH s n/a 27 3739 3747 3753 N
+ OY IY AO e n/a 27 3739 3747 3753 N
+ OY IY AO s n/a 27 3739 3747 3753 N
+ OY IY AW e n/a 27 3739 3747 3753 N
+ OY IY AW s n/a 27 3739 3747 3753 N
+ OY IY AY e n/a 27 3739 3747 3753 N
+ OY IY AY s n/a 27 3739 3747 3753 N
+ OY IY B e n/a 27 3739 3747 3751 N
+ OY IY B s n/a 27 3739 3747 3751 N
+ OY IY CH e n/a 27 3739 3747 3751 N
+ OY IY CH s n/a 27 3739 3747 3751 N
+ OY IY D e n/a 27 3739 3747 3751 N
+ OY IY D i n/a 27 3739 3747 3751 N
+ OY IY D s n/a 27 3739 3747 3751 N
+ OY IY DH e n/a 27 3739 3747 3751 N
+ OY IY DH s n/a 27 3739 3747 3751 N
+ OY IY EH e n/a 27 3739 3747 3753 N
+ OY IY EH s n/a 27 3739 3747 3753 N
+ OY IY ER b n/a 27 3739 3747 3753 N
+ OY IY ER e n/a 27 3739 3747 3753 N
+ OY IY ER s n/a 27 3739 3747 3753 N
+ OY IY EY e n/a 27 3739 3747 3753 N
+ OY IY EY s n/a 27 3739 3747 3753 N
+ OY IY F e n/a 27 3739 3747 3752 N
+ OY IY F s n/a 27 3739 3747 3752 N
+ OY IY G e n/a 27 3739 3747 3751 N
+ OY IY G s n/a 27 3739 3747 3751 N
+ OY IY HH e n/a 27 3739 3747 3751 N
+ OY IY HH s n/a 27 3739 3747 3751 N
+ OY IY IH b n/a 27 3739 3747 3753 N
+ OY IY IH e n/a 27 3739 3747 3753 N
+ OY IY IH s n/a 27 3739 3747 3753 N
+ OY IY IY e n/a 27 3739 3747 3753 N
+ OY IY IY s n/a 27 3739 3747 3753 N
+ OY IY JH e n/a 27 3739 3747 3751 N
+ OY IY JH s n/a 27 3739 3747 3751 N
+ OY IY K b n/a 27 3739 3747 3751 N
+ OY IY K e n/a 27 3739 3747 3751 N
+ OY IY K s n/a 27 3739 3747 3751 N
+ OY IY L b n/a 27 3739 3748 3750 N
+ OY IY L e n/a 27 3739 3748 3750 N
+ OY IY L i n/a 27 3739 3748 3750 N
+ OY IY L s n/a 27 3739 3748 3750 N
+ OY IY M e n/a 27 3741 3747 3755 N
+ OY IY M s n/a 27 3741 3747 3755 N
+ OY IY N b n/a 27 3741 3747 3755 N
+ OY IY N e n/a 27 3741 3747 3755 N
+ OY IY N s n/a 27 3741 3747 3755 N
+ OY IY NG e n/a 27 3741 3747 3755 N
+ OY IY NG s n/a 27 3741 3747 3755 N
+ OY IY OW b n/a 27 3739 3747 3753 N
+ OY IY OW e n/a 27 3739 3747 3753 N
+ OY IY OW s n/a 27 3739 3747 3753 N
+ OY IY OY e n/a 27 3739 3747 3753 N
+ OY IY OY s n/a 27 3739 3747 3753 N
+ OY IY P e n/a 27 3739 3747 3751 N
+ OY IY P s n/a 27 3739 3747 3751 N
+ OY IY R b n/a 27 3739 3748 3750 N
+ OY IY R e n/a 27 3739 3748 3750 N
+ OY IY R s n/a 27 3739 3748 3750 N
+ OY IY S b n/a 27 3739 3747 3752 N
+ OY IY S e n/a 27 3739 3747 3752 N
+ OY IY S s n/a 27 3739 3747 3752 N
+ OY IY SH e n/a 27 3739 3747 3752 N
+ OY IY SH s n/a 27 3739 3747 3752 N
+ OY IY SIL e n/a 27 3739 3747 3754 N
+ OY IY SIL s n/a 27 3739 3747 3754 N
+ OY IY T e n/a 27 3739 3747 3751 N
+ OY IY T s n/a 27 3739 3747 3751 N
+ OY IY TH e n/a 27 3739 3747 3752 N
+ OY IY TH s n/a 27 3739 3747 3752 N
+ OY IY UH e n/a 27 3739 3747 3753 N
+ OY IY UH s n/a 27 3739 3747 3753 N
+ OY IY UW e n/a 27 3739 3747 3753 N
+ OY IY UW s n/a 27 3739 3747 3753 N
+ OY IY V e n/a 27 3739 3747 3751 N
+ OY IY V s n/a 27 3739 3747 3751 N
+ OY IY W e n/a 27 3739 3747 3751 N
+ OY IY W s n/a 27 3739 3747 3751 N
+ OY IY Y e n/a 27 3739 3747 3751 N
+ OY IY Y s n/a 27 3739 3747 3751 N
+ OY IY Z e n/a 27 3739 3747 3751 N
+ OY IY Z s n/a 27 3739 3747 3751 N
+ OY IY ZH e n/a 27 3739 3747 3751 N
+ OY IY ZH s n/a 27 3739 3747 3751 N
+ OY JH AA e n/a 27 3742 3747 3753 N
+ OY JH AA s n/a 27 3742 3747 3753 N
+ OY JH AE e n/a 27 3742 3747 3753 N
+ OY JH AE s n/a 27 3742 3747 3753 N
+ OY JH AH e n/a 27 3742 3747 3753 N
+ OY JH AH i n/a 27 3742 3747 3753 N
+ OY JH AH s n/a 27 3742 3747 3753 N
+ OY JH AO e n/a 27 3742 3747 3753 N
+ OY JH AO s n/a 27 3742 3747 3753 N
+ OY JH AW e n/a 27 3742 3747 3753 N
+ OY JH AW s n/a 27 3742 3747 3753 N
+ OY JH AY e n/a 27 3742 3747 3753 N
+ OY JH AY s n/a 27 3742 3747 3753 N
+ OY JH B e n/a 27 3742 3747 3751 N
+ OY JH B s n/a 27 3742 3747 3751 N
+ OY JH CH e n/a 27 3742 3747 3751 N
+ OY JH CH s n/a 27 3742 3747 3751 N
+ OY JH D e n/a 27 3742 3747 3751 N
+ OY JH D i n/a 27 3742 3747 3751 N
+ OY JH D s n/a 27 3742 3747 3751 N
+ OY JH DH e n/a 27 3742 3747 3751 N
+ OY JH DH s n/a 27 3742 3747 3751 N
+ OY JH EH e n/a 27 3742 3747 3753 N
+ OY JH EH s n/a 27 3742 3747 3753 N
+ OY JH ER b n/a 27 3742 3747 3753 N
+ OY JH ER e n/a 27 3742 3747 3753 N
+ OY JH ER s n/a 27 3742 3747 3753 N
+ OY JH EY e n/a 27 3742 3747 3753 N
+ OY JH EY s n/a 27 3742 3747 3753 N
+ OY JH F e n/a 27 3742 3747 3752 N
+ OY JH F i n/a 27 3742 3747 3752 N
+ OY JH F s n/a 27 3742 3747 3752 N
+ OY JH G e n/a 27 3742 3747 3751 N
+ OY JH G s n/a 27 3742 3747 3751 N
+ OY JH HH e n/a 27 3742 3747 3751 N
+ OY JH HH s n/a 27 3742 3747 3751 N
+ OY JH IH b n/a 27 3742 3747 3753 N
+ OY JH IH e n/a 27 3742 3747 3753 N
+ OY JH IH i n/a 27 3742 3747 3753 N
+ OY JH IH s n/a 27 3742 3747 3753 N
+ OY JH IY e n/a 27 3742 3747 3753 N
+ OY JH IY s n/a 27 3742 3747 3753 N
+ OY JH JH e n/a 27 3742 3747 3751 N
+ OY JH JH s n/a 27 3742 3747 3751 N
+ OY JH K b n/a 27 3742 3747 3751 N
+ OY JH K e n/a 27 3742 3747 3751 N
+ OY JH K s n/a 27 3742 3747 3751 N
+ OY JH L b n/a 27 3742 3748 3750 N
+ OY JH L e n/a 27 3742 3748 3750 N
+ OY JH L i n/a 27 3742 3748 3750 N
+ OY JH L s n/a 27 3742 3748 3750 N
+ OY JH M e n/a 27 3742 3747 3755 N
+ OY JH M i n/a 27 3742 3747 3755 N
+ OY JH M s n/a 27 3742 3747 3755 N
+ OY JH N b n/a 27 3742 3747 3755 N
+ OY JH N e n/a 27 3742 3747 3755 N
+ OY JH N i n/a 27 3742 3747 3755 N
+ OY JH N s n/a 27 3742 3747 3755 N
+ OY JH NG e n/a 27 3742 3747 3755 N
+ OY JH NG s n/a 27 3742 3747 3755 N
+ OY JH OW b n/a 27 3742 3747 3753 N
+ OY JH OW e n/a 27 3742 3747 3753 N
+ OY JH OW i n/a 27 3742 3747 3753 N
+ OY JH OW s n/a 27 3742 3747 3753 N
+ OY JH OY e n/a 27 3742 3747 3753 N
+ OY JH OY s n/a 27 3742 3747 3753 N
+ OY JH P e n/a 27 3742 3747 3751 N
+ OY JH P i n/a 27 3742 3747 3751 N
+ OY JH P s n/a 27 3742 3747 3751 N
+ OY JH R b n/a 27 3742 3748 3750 N
+ OY JH R e n/a 27 3742 3748 3750 N
+ OY JH R i n/a 27 3742 3748 3750 N
+ OY JH R s n/a 27 3742 3748 3750 N
+ OY JH S b n/a 27 3742 3747 3752 N
+ OY JH S e n/a 27 3742 3747 3752 N
+ OY JH S i n/a 27 3742 3747 3752 N
+ OY JH S s n/a 27 3742 3747 3752 N
+ OY JH SH e n/a 27 3742 3747 3752 N
+ OY JH SH s n/a 27 3742 3747 3752 N
+ OY JH SIL e n/a 27 3742 3747 3754 N
+ OY JH SIL s n/a 27 3742 3747 3754 N
+ OY JH T e n/a 27 3742 3747 3751 N
+ OY JH T s n/a 27 3742 3747 3751 N
+ OY JH TH e n/a 27 3742 3747 3752 N
+ OY JH TH i n/a 27 3742 3747 3752 N
+ OY JH TH s n/a 27 3742 3747 3752 N
+ OY JH UH e n/a 27 3742 3747 3753 N
+ OY JH UH s n/a 27 3742 3747 3753 N
+ OY JH UW e n/a 27 3742 3747 3753 N
+ OY JH UW s n/a 27 3742 3747 3753 N
+ OY JH V e n/a 27 3742 3747 3751 N
+ OY JH V s n/a 27 3742 3747 3751 N
+ OY JH W e n/a 27 3742 3747 3751 N
+ OY JH W s n/a 27 3742 3747 3751 N
+ OY JH Y e n/a 27 3742 3747 3751 N
+ OY JH Y s n/a 27 3742 3747 3751 N
+ OY JH Z e n/a 27 3742 3747 3751 N
+ OY JH Z i n/a 27 3742 3747 3751 N
+ OY JH Z s n/a 27 3742 3747 3751 N
+ OY JH ZH e n/a 27 3742 3747 3751 N
+ OY JH ZH s n/a 27 3742 3747 3751 N
+ OY K AA e n/a 27 3739 3747 3753 N
+ OY K AA i n/a 27 3739 3747 3753 N
+ OY K AA s n/a 27 3739 3747 3753 N
+ OY K AE e n/a 27 3739 3747 3753 N
+ OY K AE s n/a 27 3739 3747 3753 N
+ OY K AH e n/a 27 3739 3747 3753 N
+ OY K AH s n/a 27 3739 3747 3753 N
+ OY K AO e n/a 27 3739 3747 3753 N
+ OY K AO s n/a 27 3739 3747 3753 N
+ OY K AW e n/a 27 3739 3747 3753 N
+ OY K AW s n/a 27 3739 3747 3753 N
+ OY K AY e n/a 27 3739 3747 3753 N
+ OY K AY s n/a 27 3739 3747 3753 N
+ OY K B e n/a 27 3739 3747 3751 N
+ OY K B s n/a 27 3739 3747 3751 N
+ OY K CH e n/a 27 3739 3747 3751 N
+ OY K CH s n/a 27 3739 3747 3751 N
+ OY K D e n/a 27 3739 3747 3751 N
+ OY K D i n/a 27 3739 3747 3751 N
+ OY K D s n/a 27 3739 3747 3751 N
+ OY K DH e n/a 27 3739 3747 3751 N
+ OY K DH s n/a 27 3739 3747 3751 N
+ OY K EH e n/a 27 3739 3747 3753 N
+ OY K EH s n/a 27 3739 3747 3753 N
+ OY K ER b n/a 27 3739 3747 3753 N
+ OY K ER e n/a 27 3739 3747 3753 N
+ OY K ER i n/a 27 3739 3747 3753 N
+ OY K ER s n/a 27 3739 3747 3753 N
+ OY K EY e n/a 27 3739 3747 3753 N
+ OY K EY s n/a 27 3739 3747 3753 N
+ OY K F e n/a 27 3739 3747 3752 N
+ OY K F i n/a 27 3739 3747 3752 N
+ OY K F s n/a 27 3739 3747 3752 N
+ OY K G e n/a 27 3739 3747 3751 N
+ OY K G i n/a 27 3739 3747 3751 N
+ OY K G s n/a 27 3739 3747 3751 N
+ OY K HH e n/a 27 3739 3747 3751 N
+ OY K HH s n/a 27 3739 3747 3751 N
+ OY K IH b n/a 27 3739 3747 3753 N
+ OY K IH e n/a 27 3739 3747 3753 N
+ OY K IH i n/a 27 3739 3747 3753 N
+ OY K IH s n/a 27 3739 3747 3753 N
+ OY K IY e n/a 27 3739 3747 3753 N
+ OY K IY s n/a 27 3739 3747 3753 N
+ OY K JH e n/a 27 3739 3747 3751 N
+ OY K JH s n/a 27 3739 3747 3751 N
+ OY K K b n/a 27 3739 3747 3751 N
+ OY K K e n/a 27 3739 3747 3751 N
+ OY K K i n/a 27 3739 3747 3751 N
+ OY K K s n/a 27 3739 3747 3751 N
+ OY K L b n/a 27 3739 3748 3750 N
+ OY K L e n/a 27 3739 3748 3750 N
+ OY K L i n/a 27 3739 3748 3750 N
+ OY K L s n/a 27 3739 3748 3750 N
+ OY K M e n/a 27 3741 3746 3755 N
+ OY K M i n/a 27 3741 3746 3755 N
+ OY K M s n/a 27 3741 3746 3755 N
+ OY K N b n/a 27 3741 3746 3755 N
+ OY K N e n/a 27 3741 3746 3755 N
+ OY K N i n/a 27 3741 3746 3755 N
+ OY K N s n/a 27 3741 3746 3755 N
+ OY K NG e n/a 27 3741 3746 3755 N
+ OY K NG s n/a 27 3741 3746 3755 N
+ OY K OW b n/a 27 3739 3747 3753 N
+ OY K OW e n/a 27 3739 3747 3753 N
+ OY K OW i n/a 27 3739 3747 3753 N
+ OY K OW s n/a 27 3739 3747 3753 N
+ OY K OY e n/a 27 3739 3747 3753 N
+ OY K OY s n/a 27 3739 3747 3753 N
+ OY K P e n/a 27 3739 3747 3751 N
+ OY K P i n/a 27 3739 3747 3751 N
+ OY K P s n/a 27 3739 3747 3751 N
+ OY K R b n/a 27 3739 3748 3750 N
+ OY K R e n/a 27 3739 3748 3750 N
+ OY K R i n/a 27 3739 3748 3750 N
+ OY K R s n/a 27 3739 3748 3750 N
+ OY K S b n/a 27 3739 3747 3752 N
+ OY K S e n/a 27 3739 3747 3752 N
+ OY K S s n/a 27 3739 3747 3752 N
+ OY K SH e n/a 27 3739 3747 3752 N
+ OY K SH s n/a 27 3739 3747 3752 N
+ OY K SIL e n/a 27 3739 3747 3754 N
+ OY K SIL s n/a 27 3739 3747 3754 N
+ OY K T e n/a 27 3739 3747 3751 N
+ OY K T i n/a 27 3739 3747 3751 N
+ OY K T s n/a 27 3739 3747 3751 N
+ OY K TH e n/a 27 3739 3747 3752 N
+ OY K TH s n/a 27 3739 3747 3752 N
+ OY K UH e n/a 27 3739 3747 3753 N
+ OY K UH s n/a 27 3739 3747 3753 N
+ OY K UW e n/a 27 3739 3747 3753 N
+ OY K UW s n/a 27 3739 3747 3753 N
+ OY K V e n/a 27 3739 3747 3751 N
+ OY K V i n/a 27 3739 3747 3751 N
+ OY K V s n/a 27 3739 3747 3751 N
+ OY K W e n/a 27 3739 3747 3751 N
+ OY K W s n/a 27 3739 3747 3751 N
+ OY K Y e n/a 27 3739 3747 3751 N
+ OY K Y s n/a 27 3739 3747 3751 N
+ OY K Z e n/a 27 3739 3747 3751 N
+ OY K Z i n/a 27 3739 3747 3751 N
+ OY K Z s n/a 27 3739 3747 3751 N
+ OY K ZH e n/a 27 3739 3747 3751 N
+ OY K ZH s n/a 27 3739 3747 3751 N
+ OY L AA e n/a 27 3745 3747 3750 N
+ OY L AA s n/a 27 3745 3747 3750 N
+ OY L AE e n/a 27 3745 3747 3750 N
+ OY L AE s n/a 27 3745 3747 3750 N
+ OY L AH e n/a 27 3745 3747 3750 N
+ OY L AH i n/a 27 3745 3747 3750 N
+ OY L AH s n/a 27 3745 3747 3750 N
+ OY L AO e n/a 27 3745 3747 3750 N
+ OY L AO s n/a 27 3745 3747 3750 N
+ OY L AW e n/a 27 3745 3747 3750 N
+ OY L AW s n/a 27 3745 3747 3750 N
+ OY L AY e n/a 27 3745 3747 3750 N
+ OY L AY s n/a 27 3745 3747 3750 N
+ OY L B e n/a 27 3745 3747 3751 N
+ OY L B i n/a 27 3745 3747 3751 N
+ OY L B s n/a 27 3745 3747 3751 N
+ OY L CH e n/a 27 3745 3747 3751 N
+ OY L CH i n/a 27 3745 3747 3751 N
+ OY L CH s n/a 27 3745 3747 3751 N
+ OY L D e n/a 27 3745 3747 3751 N
+ OY L D i n/a 27 3745 3747 3751 N
+ OY L D s n/a 27 3745 3747 3751 N
+ OY L DH e n/a 27 3745 3747 3751 N
+ OY L DH s n/a 27 3745 3747 3751 N
+ OY L EH e n/a 27 3745 3747 3750 N
+ OY L EH s n/a 27 3745 3747 3750 N
+ OY L ER b n/a 27 3745 3747 3750 N
+ OY L ER e n/a 27 3745 3747 3750 N
+ OY L ER i n/a 27 3745 3747 3750 N
+ OY L ER s n/a 27 3745 3747 3750 N
+ OY L EY e n/a 27 3745 3747 3750 N
+ OY L EY s n/a 27 3745 3747 3750 N
+ OY L F e n/a 27 3745 3747 3752 N
+ OY L F s n/a 27 3745 3747 3752 N
+ OY L G e n/a 27 3745 3747 3751 N
+ OY L G i n/a 27 3745 3747 3751 N
+ OY L G s n/a 27 3745 3747 3751 N
+ OY L HH e n/a 27 3745 3747 3751 N
+ OY L HH s n/a 27 3745 3747 3751 N
+ OY L IH b n/a 27 3745 3747 3753 N
+ OY L IH e n/a 27 3745 3747 3753 N
+ OY L IH i n/a 27 3745 3747 3753 N
+ OY L IH s n/a 27 3745 3747 3753 N
+ OY L IY e n/a 27 3745 3747 3753 N
+ OY L IY i n/a 27 3745 3747 3753 N
+ OY L IY s n/a 27 3745 3747 3753 N
+ OY L JH e n/a 27 3745 3747 3751 N
+ OY L JH s n/a 27 3745 3747 3751 N
+ OY L K b n/a 27 3745 3747 3751 N
+ OY L K e n/a 27 3745 3747 3751 N
+ OY L K i n/a 27 3745 3747 3751 N
+ OY L K s n/a 27 3745 3747 3751 N
+ OY L L b n/a 27 3745 3748 3750 N
+ OY L L e n/a 27 3745 3748 3750 N
+ OY L L s n/a 27 3745 3748 3750 N
+ OY L M e n/a 27 3745 3747 3755 N
+ OY L M i n/a 27 3745 3747 3755 N
+ OY L M s n/a 27 3745 3747 3755 N
+ OY L N b n/a 27 3745 3747 3755 N
+ OY L N e n/a 27 3745 3747 3755 N
+ OY L N i n/a 27 3745 3747 3755 N
+ OY L N s n/a 27 3745 3747 3755 N
+ OY L NG e n/a 27 3745 3747 3755 N
+ OY L NG s n/a 27 3745 3747 3755 N
+ OY L OW b n/a 27 3745 3747 3750 N
+ OY L OW e n/a 27 3745 3747 3750 N
+ OY L OW i n/a 27 3745 3747 3750 N
+ OY L OW s n/a 27 3745 3747 3750 N
+ OY L OY e n/a 27 3745 3747 3750 N
+ OY L OY s n/a 27 3745 3747 3750 N
+ OY L P e n/a 27 3745 3747 3751 N
+ OY L P i n/a 27 3745 3747 3751 N
+ OY L P s n/a 27 3745 3747 3751 N
+ OY L R b n/a 27 3745 3748 3750 N
+ OY L R e n/a 27 3745 3748 3750 N
+ OY L R i n/a 27 3745 3748 3750 N
+ OY L R s n/a 27 3745 3748 3750 N
+ OY L S b n/a 27 3745 3747 3752 N
+ OY L S e n/a 27 3745 3747 3752 N
+ OY L S i n/a 27 3745 3747 3752 N
+ OY L S s n/a 27 3745 3747 3752 N
+ OY L SH e n/a 27 3745 3747 3752 N
+ OY L SH i n/a 27 3745 3747 3752 N
+ OY L SH s n/a 27 3745 3747 3752 N
+ OY L SIL e n/a 27 3745 3747 3754 N
+ OY L SIL s n/a 27 3745 3747 3754 N
+ OY L T e n/a 27 3745 3747 3751 N
+ OY L T i n/a 27 3745 3747 3751 N
+ OY L T s n/a 27 3745 3747 3751 N
+ OY L TH e n/a 27 3745 3747 3752 N
+ OY L TH i n/a 27 3745 3747 3752 N
+ OY L TH s n/a 27 3745 3747 3752 N
+ OY L UH e n/a 27 3745 3747 3753 N
+ OY L UH s n/a 27 3745 3747 3753 N
+ OY L UW e n/a 27 3745 3747 3753 N
+ OY L UW s n/a 27 3745 3747 3753 N
+ OY L V e n/a 27 3745 3747 3751 N
+ OY L V i n/a 27 3745 3747 3751 N
+ OY L V s n/a 27 3745 3747 3751 N
+ OY L W e n/a 27 3745 3747 3750 N
+ OY L W s n/a 27 3745 3747 3750 N
+ OY L Y e n/a 27 3745 3747 3751 N
+ OY L Y s n/a 27 3745 3747 3751 N
+ OY L Z e n/a 27 3745 3747 3751 N
+ OY L Z i n/a 27 3745 3747 3751 N
+ OY L Z s n/a 27 3745 3747 3751 N
+ OY L ZH e n/a 27 3745 3747 3751 N
+ OY L ZH s n/a 27 3745 3747 3751 N
+ OY M AA e n/a 27 3739 3749 3753 N
+ OY M AA s n/a 27 3739 3749 3753 N
+ OY M AE e n/a 27 3739 3749 3753 N
+ OY M AE s n/a 27 3739 3749 3753 N
+ OY M AH e n/a 27 3739 3749 3753 N
+ OY M AH i n/a 27 3739 3749 3753 N
+ OY M AH s n/a 27 3739 3749 3753 N
+ OY M AO e n/a 27 3739 3749 3753 N
+ OY M AO s n/a 27 3739 3749 3753 N
+ OY M AW e n/a 27 3739 3749 3753 N
+ OY M AW s n/a 27 3739 3749 3753 N
+ OY M AY e n/a 27 3739 3749 3753 N
+ OY M AY s n/a 27 3739 3749 3753 N
+ OY M B e n/a 27 3739 3749 3751 N
+ OY M B s n/a 27 3739 3749 3751 N
+ OY M CH e n/a 27 3739 3749 3751 N
+ OY M CH s n/a 27 3739 3749 3751 N
+ OY M D e n/a 27 3739 3749 3751 N
+ OY M D i n/a 27 3739 3749 3751 N
+ OY M D s n/a 27 3739 3749 3751 N
+ OY M DH e n/a 27 3739 3749 3751 N
+ OY M DH s n/a 27 3739 3749 3751 N
+ OY M EH e n/a 27 3739 3749 3753 N
+ OY M EH s n/a 27 3739 3749 3753 N
+ OY M ER b n/a 27 3739 3749 3753 N
+ OY M ER e n/a 27 3739 3749 3753 N
+ OY M ER i n/a 27 3739 3749 3753 N
+ OY M ER s n/a 27 3739 3749 3753 N
+ OY M EY e n/a 27 3739 3749 3753 N
+ OY M EY s n/a 27 3739 3749 3753 N
+ OY M F e n/a 27 3739 3749 3752 N
+ OY M F s n/a 27 3739 3749 3752 N
+ OY M G e n/a 27 3739 3749 3751 N
+ OY M G s n/a 27 3739 3749 3751 N
+ OY M HH e n/a 27 3739 3749 3751 N
+ OY M HH s n/a 27 3739 3749 3751 N
+ OY M IH b n/a 27 3739 3749 3753 N
+ OY M IH e n/a 27 3739 3749 3753 N
+ OY M IH s n/a 27 3739 3749 3753 N
+ OY M IY e n/a 27 3739 3749 3753 N
+ OY M IY s n/a 27 3739 3749 3753 N
+ OY M JH e n/a 27 3739 3749 3751 N
+ OY M JH s n/a 27 3739 3749 3751 N
+ OY M K b n/a 27 3739 3749 3751 N
+ OY M K e n/a 27 3739 3749 3751 N
+ OY M K i n/a 27 3739 3749 3751 N
+ OY M K s n/a 27 3739 3749 3751 N
+ OY M L b n/a 27 3739 3749 3750 N
+ OY M L e n/a 27 3739 3749 3750 N
+ OY M L i n/a 27 3739 3749 3750 N
+ OY M L s n/a 27 3739 3749 3750 N
+ OY M M e n/a 27 3741 3749 3755 N
+ OY M M s n/a 27 3741 3749 3755 N
+ OY M N b n/a 27 3741 3749 3755 N
+ OY M N e n/a 27 3741 3749 3755 N
+ OY M N i n/a 27 3741 3749 3755 N
+ OY M N s n/a 27 3741 3749 3755 N
+ OY M NG e n/a 27 3741 3749 3755 N
+ OY M NG s n/a 27 3741 3749 3755 N
+ OY M OW b n/a 27 3739 3749 3753 N
+ OY M OW e n/a 27 3739 3749 3753 N
+ OY M OW s n/a 27 3739 3749 3753 N
+ OY M OY e n/a 27 3739 3749 3753 N
+ OY M OY s n/a 27 3739 3749 3753 N
+ OY M P e n/a 27 3739 3749 3751 N
+ OY M P s n/a 27 3739 3749 3751 N
+ OY M R b n/a 27 3739 3749 3750 N
+ OY M R e n/a 27 3739 3749 3750 N
+ OY M R i n/a 27 3739 3749 3750 N
+ OY M R s n/a 27 3739 3749 3750 N
+ OY M S b n/a 27 3739 3749 3752 N
+ OY M S e n/a 27 3739 3749 3752 N
+ OY M S i n/a 27 3739 3749 3752 N
+ OY M S s n/a 27 3739 3749 3752 N
+ OY M SH e n/a 27 3739 3749 3752 N
+ OY M SH i n/a 27 3739 3749 3752 N
+ OY M SH s n/a 27 3739 3749 3752 N
+ OY M SIL e n/a 27 3739 3749 3754 N
+ OY M SIL s n/a 27 3739 3749 3754 N
+ OY M T e n/a 27 3739 3749 3751 N
+ OY M T i n/a 27 3739 3749 3751 N
+ OY M T s n/a 27 3739 3749 3751 N
+ OY M TH e n/a 27 3739 3749 3752 N
+ OY M TH s n/a 27 3739 3749 3752 N
+ OY M UH e n/a 27 3739 3749 3753 N
+ OY M UH s n/a 27 3739 3749 3753 N
+ OY M UW e n/a 27 3739 3749 3753 N
+ OY M UW s n/a 27 3739 3749 3753 N
+ OY M V e n/a 27 3739 3749 3751 N
+ OY M V s n/a 27 3739 3749 3751 N
+ OY M W e n/a 27 3739 3749 3751 N
+ OY M W s n/a 27 3739 3749 3751 N
+ OY M Y e n/a 27 3739 3749 3751 N
+ OY M Y s n/a 27 3739 3749 3751 N
+ OY M Z e n/a 27 3739 3749 3751 N
+ OY M Z i n/a 27 3739 3749 3751 N
+ OY M Z s n/a 27 3739 3749 3751 N
+ OY M ZH e n/a 27 3739 3749 3751 N
+ OY M ZH s n/a 27 3739 3749 3751 N
+ OY N AA e n/a 27 3744 3747 3753 N
+ OY N AA i n/a 27 3744 3747 3753 N
+ OY N AA s n/a 27 3744 3747 3753 N
+ OY N AE e n/a 27 3744 3747 3753 N
+ OY N AE i n/a 27 3744 3747 3753 N
+ OY N AE s n/a 27 3744 3747 3753 N
+ OY N AH e n/a 27 3744 3747 3753 N
+ OY N AH i n/a 27 3744 3747 3753 N
+ OY N AH s n/a 27 3744 3747 3753 N
+ OY N AO e n/a 27 3744 3747 3753 N
+ OY N AO s n/a 27 3744 3747 3753 N
+ OY N AW e n/a 27 3744 3747 3753 N
+ OY N AW s n/a 27 3744 3747 3753 N
+ OY N AY e n/a 27 3744 3747 3753 N
+ OY N AY s n/a 27 3744 3747 3753 N
+ OY N B e n/a 27 3744 3747 3751 N
+ OY N B s n/a 27 3744 3747 3751 N
+ OY N CH e n/a 27 3744 3747 3751 N
+ OY N CH s n/a 27 3744 3747 3751 N
+ OY N D e n/a 27 3744 3747 3751 N
+ OY N D i n/a 27 3744 3747 3751 N
+ OY N D s n/a 27 3744 3747 3751 N
+ OY N DH e n/a 27 3744 3747 3751 N
+ OY N DH s n/a 27 3744 3747 3751 N
+ OY N EH e n/a 27 3744 3747 3753 N
+ OY N EH s n/a 27 3744 3747 3753 N
+ OY N ER b n/a 27 3744 3747 3753 N
+ OY N ER e n/a 27 3744 3747 3753 N
+ OY N ER i n/a 27 3744 3747 3753 N
+ OY N ER s n/a 27 3744 3747 3753 N
+ OY N EY e n/a 27 3744 3747 3753 N
+ OY N EY s n/a 27 3744 3747 3753 N
+ OY N F e n/a 27 3744 3747 3752 N
+ OY N F i n/a 27 3744 3747 3752 N
+ OY N F s n/a 27 3744 3747 3752 N
+ OY N G e n/a 27 3744 3747 3751 N
+ OY N G s n/a 27 3744 3747 3751 N
+ OY N HH e n/a 27 3744 3747 3751 N
+ OY N HH s n/a 27 3744 3747 3751 N
+ OY N IH b n/a 27 3744 3747 3753 N
+ OY N IH e n/a 27 3744 3747 3753 N
+ OY N IH i n/a 27 3744 3747 3753 N
+ OY N IH s n/a 27 3744 3747 3753 N
+ OY N IY e n/a 27 3744 3747 3753 N
+ OY N IY s n/a 27 3744 3747 3753 N
+ OY N JH e n/a 27 3744 3747 3751 N
+ OY N JH s n/a 27 3744 3747 3751 N
+ OY N K b n/a 27 3744 3747 3751 N
+ OY N K e n/a 27 3744 3747 3751 N
+ OY N K s n/a 27 3744 3747 3751 N
+ OY N L b n/a 27 3744 3748 3750 N
+ OY N L e n/a 27 3744 3748 3750 N
+ OY N L i n/a 27 3744 3748 3750 N
+ OY N L s n/a 27 3744 3748 3750 N
+ OY N M e n/a 27 3744 3747 3755 N
+ OY N M i n/a 27 3744 3747 3755 N
+ OY N M s n/a 27 3744 3747 3755 N
+ OY N N b n/a 27 3744 3747 3755 N
+ OY N N e n/a 27 3744 3747 3755 N
+ OY N N i n/a 27 3744 3747 3755 N
+ OY N N s n/a 27 3744 3747 3755 N
+ OY N NG e n/a 27 3744 3747 3755 N
+ OY N NG s n/a 27 3744 3747 3755 N
+ OY N OW b n/a 27 3744 3747 3753 N
+ OY N OW e n/a 27 3744 3747 3753 N
+ OY N OW i n/a 27 3744 3747 3753 N
+ OY N OW s n/a 27 3744 3747 3753 N
+ OY N OY e n/a 27 3744 3747 3753 N
+ OY N OY s n/a 27 3744 3747 3753 N
+ OY N P e n/a 27 3744 3747 3751 N
+ OY N P s n/a 27 3744 3747 3751 N
+ OY N R b n/a 27 3744 3748 3750 N
+ OY N R e n/a 27 3744 3748 3750 N
+ OY N R i n/a 27 3744 3748 3750 N
+ OY N R s n/a 27 3744 3748 3750 N
+ OY N S b n/a 27 3744 3747 3752 N
+ OY N S e n/a 27 3744 3747 3752 N
+ OY N S i n/a 27 3744 3747 3752 N
+ OY N S s n/a 27 3744 3747 3752 N
+ OY N SH e n/a 27 3744 3747 3752 N
+ OY N SH s n/a 27 3744 3747 3752 N
+ OY N SIL e n/a 27 3744 3747 3754 N
+ OY N SIL s n/a 27 3744 3747 3754 N
+ OY N T e n/a 27 3744 3747 3751 N
+ OY N T i n/a 27 3744 3747 3751 N
+ OY N T s n/a 27 3744 3747 3751 N
+ OY N TH e n/a 27 3744 3747 3752 N
+ OY N TH s n/a 27 3744 3747 3752 N
+ OY N UH e n/a 27 3744 3747 3753 N
+ OY N UH s n/a 27 3744 3747 3753 N
+ OY N UW e n/a 27 3744 3747 3753 N
+ OY N UW s n/a 27 3744 3747 3753 N
+ OY N V e n/a 27 3744 3747 3751 N
+ OY N V s n/a 27 3744 3747 3751 N
+ OY N W e n/a 27 3744 3747 3751 N
+ OY N W s n/a 27 3744 3747 3751 N
+ OY N Y e n/a 27 3744 3747 3751 N
+ OY N Y s n/a 27 3744 3747 3751 N
+ OY N Z e n/a 27 3744 3747 3751 N
+ OY N Z i n/a 27 3744 3747 3751 N
+ OY N Z s n/a 27 3744 3747 3751 N
+ OY N ZH e n/a 27 3744 3747 3751 N
+ OY N ZH s n/a 27 3744 3747 3751 N
+ OY NG AA s n/a 27 3744 3747 3753 N
+ OY NG AE s n/a 27 3744 3747 3753 N
+ OY NG AH s n/a 27 3744 3747 3753 N
+ OY NG AO s n/a 27 3744 3747 3753 N
+ OY NG AW s n/a 27 3744 3747 3753 N
+ OY NG AY s n/a 27 3744 3747 3753 N
+ OY NG B s n/a 27 3744 3747 3751 N
+ OY NG CH s n/a 27 3744 3747 3751 N
+ OY NG D s n/a 27 3744 3747 3751 N
+ OY NG DH s n/a 27 3744 3747 3751 N
+ OY NG EH s n/a 27 3744 3747 3753 N
+ OY NG ER b n/a 27 3744 3747 3753 N
+ OY NG ER s n/a 27 3744 3747 3753 N
+ OY NG EY s n/a 27 3744 3747 3753 N
+ OY NG F s n/a 27 3744 3747 3752 N
+ OY NG G s n/a 27 3744 3747 3751 N
+ OY NG HH s n/a 27 3744 3747 3751 N
+ OY NG IH b n/a 27 3744 3747 3753 N
+ OY NG IH s n/a 27 3744 3747 3753 N
+ OY NG IY s n/a 27 3744 3747 3753 N
+ OY NG JH s n/a 27 3744 3747 3751 N
+ OY NG K b n/a 27 3744 3747 3751 N
+ OY NG K s n/a 27 3744 3747 3751 N
+ OY NG L b n/a 27 3744 3748 3750 N
+ OY NG L s n/a 27 3744 3748 3750 N
+ OY NG M s n/a 27 3744 3747 3755 N
+ OY NG N b n/a 27 3744 3747 3755 N
+ OY NG N s n/a 27 3744 3747 3755 N
+ OY NG NG s n/a 27 3744 3747 3755 N
+ OY NG OW b n/a 27 3744 3747 3753 N
+ OY NG OW s n/a 27 3744 3747 3753 N
+ OY NG OY s n/a 27 3744 3747 3753 N
+ OY NG P s n/a 27 3744 3747 3751 N
+ OY NG R b n/a 27 3744 3748 3750 N
+ OY NG R s n/a 27 3744 3748 3750 N
+ OY NG S b n/a 27 3744 3747 3752 N
+ OY NG S s n/a 27 3744 3747 3752 N
+ OY NG SH s n/a 27 3744 3747 3752 N
+ OY NG SIL s n/a 27 3744 3747 3754 N
+ OY NG T s n/a 27 3744 3747 3751 N
+ OY NG TH s n/a 27 3744 3747 3752 N
+ OY NG UH s n/a 27 3744 3747 3753 N
+ OY NG UW s n/a 27 3744 3747 3753 N
+ OY NG V s n/a 27 3744 3747 3751 N
+ OY NG W s n/a 27 3744 3747 3751 N
+ OY NG Y s n/a 27 3744 3747 3751 N
+ OY NG Z s n/a 27 3744 3747 3751 N
+ OY NG ZH s n/a 27 3744 3747 3751 N
+ OY OW AA e n/a 27 3739 3747 3753 N
+ OY OW AA s n/a 27 3739 3747 3753 N
+ OY OW AE e n/a 27 3739 3747 3753 N
+ OY OW AE s n/a 27 3739 3747 3753 N
+ OY OW AH e n/a 27 3739 3747 3753 N
+ OY OW AH s n/a 27 3739 3747 3753 N
+ OY OW AO e n/a 27 3739 3747 3753 N
+ OY OW AO s n/a 27 3739 3747 3753 N
+ OY OW AW e n/a 27 3739 3747 3753 N
+ OY OW AW s n/a 27 3739 3747 3753 N
+ OY OW AY e n/a 27 3739 3747 3753 N
+ OY OW AY s n/a 27 3739 3747 3753 N
+ OY OW B e n/a 27 3739 3747 3751 N
+ OY OW B s n/a 27 3739 3747 3751 N
+ OY OW CH e n/a 27 3739 3747 3751 N
+ OY OW CH s n/a 27 3739 3747 3751 N
+ OY OW D e n/a 27 3739 3747 3751 N
+ OY OW D s n/a 27 3739 3747 3751 N
+ OY OW DH e n/a 27 3739 3747 3751 N
+ OY OW DH s n/a 27 3739 3747 3751 N
+ OY OW EH e n/a 27 3739 3747 3753 N
+ OY OW EH s n/a 27 3739 3747 3753 N
+ OY OW ER b n/a 27 3739 3747 3753 N
+ OY OW ER e n/a 27 3739 3747 3753 N
+ OY OW ER s n/a 27 3739 3747 3753 N
+ OY OW EY e n/a 27 3739 3747 3753 N
+ OY OW EY s n/a 27 3739 3747 3753 N
+ OY OW F e n/a 27 3739 3747 3752 N
+ OY OW F s n/a 27 3739 3747 3752 N
+ OY OW G e n/a 27 3739 3747 3751 N
+ OY OW G s n/a 27 3739 3747 3751 N
+ OY OW HH e n/a 27 3739 3747 3751 N
+ OY OW HH s n/a 27 3739 3747 3751 N
+ OY OW IH b n/a 27 3739 3747 3753 N
+ OY OW IH e n/a 27 3739 3747 3753 N
+ OY OW IH s n/a 27 3739 3747 3753 N
+ OY OW IY e n/a 27 3739 3747 3753 N
+ OY OW IY s n/a 27 3739 3747 3753 N
+ OY OW JH e n/a 27 3739 3747 3751 N
+ OY OW JH s n/a 27 3739 3747 3751 N
+ OY OW K b n/a 27 3739 3747 3751 N
+ OY OW K e n/a 27 3739 3747 3751 N
+ OY OW K s n/a 27 3739 3747 3751 N
+ OY OW L b n/a 27 3739 3748 3750 N
+ OY OW L e n/a 27 3739 3748 3750 N
+ OY OW L s n/a 27 3739 3748 3750 N
+ OY OW M e n/a 27 3741 3747 3755 N
+ OY OW M s n/a 27 3741 3747 3755 N
+ OY OW N b n/a 27 3741 3747 3755 N
+ OY OW N e n/a 27 3741 3747 3755 N
+ OY OW N s n/a 27 3741 3747 3755 N
+ OY OW NG e n/a 27 3741 3747 3755 N
+ OY OW NG s n/a 27 3741 3747 3755 N
+ OY OW OW b n/a 27 3739 3747 3753 N
+ OY OW OW e n/a 27 3739 3747 3753 N
+ OY OW OW s n/a 27 3739 3747 3753 N
+ OY OW OY e n/a 27 3739 3747 3753 N
+ OY OW OY s n/a 27 3739 3747 3753 N
+ OY OW P e n/a 27 3739 3747 3751 N
+ OY OW P s n/a 27 3739 3747 3751 N
+ OY OW R b n/a 27 3739 3748 3750 N
+ OY OW R e n/a 27 3739 3748 3750 N
+ OY OW R s n/a 27 3739 3748 3750 N
+ OY OW S b n/a 27 3739 3747 3752 N
+ OY OW S e n/a 27 3739 3747 3752 N
+ OY OW S s n/a 27 3739 3747 3752 N
+ OY OW SH e n/a 27 3739 3747 3752 N
+ OY OW SH s n/a 27 3739 3747 3752 N
+ OY OW SIL e n/a 27 3739 3747 3754 N
+ OY OW SIL s n/a 27 3739 3747 3754 N
+ OY OW T e n/a 27 3739 3747 3751 N
+ OY OW T s n/a 27 3739 3747 3751 N
+ OY OW TH e n/a 27 3739 3747 3752 N
+ OY OW TH s n/a 27 3739 3747 3752 N
+ OY OW UH e n/a 27 3739 3747 3753 N
+ OY OW UH s n/a 27 3739 3747 3753 N
+ OY OW UW e n/a 27 3739 3747 3753 N
+ OY OW UW s n/a 27 3739 3747 3753 N
+ OY OW V e n/a 27 3739 3747 3751 N
+ OY OW V s n/a 27 3739 3747 3751 N
+ OY OW W e n/a 27 3739 3747 3751 N
+ OY OW W s n/a 27 3739 3747 3751 N
+ OY OW Y e n/a 27 3739 3747 3751 N
+ OY OW Y s n/a 27 3739 3747 3751 N
+ OY OW Z e n/a 27 3739 3747 3751 N
+ OY OW Z s n/a 27 3739 3747 3751 N
+ OY OW ZH e n/a 27 3739 3747 3751 N
+ OY OW ZH s n/a 27 3739 3747 3751 N
+ OY OY AA s n/a 27 3739 3747 3753 N
+ OY OY AE s n/a 27 3739 3747 3753 N
+ OY OY AH s n/a 27 3739 3747 3753 N
+ OY OY AO s n/a 27 3739 3747 3753 N
+ OY OY AW s n/a 27 3739 3747 3753 N
+ OY OY AY s n/a 27 3739 3747 3753 N
+ OY OY B s n/a 27 3739 3747 3751 N
+ OY OY CH s n/a 27 3739 3747 3751 N
+ OY OY D s n/a 27 3739 3747 3751 N
+ OY OY DH s n/a 27 3739 3747 3751 N
+ OY OY EH s n/a 27 3739 3747 3753 N
+ OY OY ER b n/a 27 3739 3747 3753 N
+ OY OY ER s n/a 27 3739 3747 3753 N
+ OY OY EY s n/a 27 3739 3747 3753 N
+ OY OY F s n/a 27 3739 3747 3752 N
+ OY OY G s n/a 27 3739 3747 3751 N
+ OY OY HH s n/a 27 3739 3747 3751 N
+ OY OY IH b n/a 27 3739 3747 3753 N
+ OY OY IH s n/a 27 3739 3747 3753 N
+ OY OY IY s n/a 27 3739 3747 3753 N
+ OY OY JH s n/a 27 3739 3747 3751 N
+ OY OY K b n/a 27 3739 3747 3751 N
+ OY OY K s n/a 27 3739 3747 3751 N
+ OY OY L b n/a 27 3739 3748 3750 N
+ OY OY L s n/a 27 3739 3748 3750 N
+ OY OY M s n/a 27 3741 3747 3755 N
+ OY OY N b n/a 27 3741 3747 3755 N
+ OY OY N s n/a 27 3741 3747 3755 N
+ OY OY NG s n/a 27 3741 3747 3755 N
+ OY OY OW b n/a 27 3739 3747 3753 N
+ OY OY OW s n/a 27 3739 3747 3753 N
+ OY OY OY s n/a 27 3739 3747 3753 N
+ OY OY P s n/a 27 3739 3747 3751 N
+ OY OY R b n/a 27 3739 3748 3750 N
+ OY OY R s n/a 27 3739 3748 3750 N
+ OY OY S b n/a 27 3739 3747 3752 N
+ OY OY S s n/a 27 3739 3747 3752 N
+ OY OY SH s n/a 27 3739 3747 3752 N
+ OY OY SIL s n/a 27 3739 3747 3754 N
+ OY OY T s n/a 27 3739 3747 3751 N
+ OY OY TH s n/a 27 3739 3747 3752 N
+ OY OY UH s n/a 27 3739 3747 3753 N
+ OY OY UW s n/a 27 3739 3747 3753 N
+ OY OY V s n/a 27 3739 3747 3751 N
+ OY OY W s n/a 27 3739 3747 3751 N
+ OY OY Y s n/a 27 3739 3747 3751 N
+ OY OY Z s n/a 27 3739 3747 3751 N
+ OY OY ZH s n/a 27 3739 3747 3751 N
+ OY P AA e n/a 27 3739 3749 3753 N
+ OY P AA s n/a 27 3739 3749 3753 N
+ OY P AE e n/a 27 3739 3749 3753 N
+ OY P AE s n/a 27 3739 3749 3753 N
+ OY P AH e n/a 27 3739 3749 3753 N
+ OY P AH s n/a 27 3739 3749 3753 N
+ OY P AO e n/a 27 3739 3749 3753 N
+ OY P AO s n/a 27 3739 3749 3753 N
+ OY P AW e n/a 27 3739 3749 3753 N
+ OY P AW s n/a 27 3739 3749 3753 N
+ OY P AY e n/a 27 3739 3749 3753 N
+ OY P AY s n/a 27 3739 3749 3753 N
+ OY P B e n/a 27 3739 3749 3751 N
+ OY P B s n/a 27 3739 3749 3751 N
+ OY P CH e n/a 27 3739 3749 3751 N
+ OY P CH s n/a 27 3739 3749 3751 N
+ OY P D e n/a 27 3739 3749 3751 N
+ OY P D s n/a 27 3739 3749 3751 N
+ OY P DH e n/a 27 3739 3749 3751 N
+ OY P DH s n/a 27 3739 3749 3751 N
+ OY P EH e n/a 27 3739 3749 3753 N
+ OY P EH s n/a 27 3739 3749 3753 N
+ OY P ER b n/a 27 3739 3749 3753 N
+ OY P ER e n/a 27 3739 3749 3753 N
+ OY P ER i n/a 27 3739 3749 3753 N
+ OY P ER s n/a 27 3739 3749 3753 N
+ OY P EY e n/a 27 3739 3749 3753 N
+ OY P EY s n/a 27 3739 3749 3753 N
+ OY P F e n/a 27 3739 3749 3752 N
+ OY P F s n/a 27 3739 3749 3752 N
+ OY P G e n/a 27 3739 3749 3751 N
+ OY P G s n/a 27 3739 3749 3751 N
+ OY P HH e n/a 27 3739 3749 3751 N
+ OY P HH s n/a 27 3739 3749 3751 N
+ OY P IH b n/a 27 3739 3749 3753 N
+ OY P IH e n/a 27 3739 3749 3753 N
+ OY P IH s n/a 27 3739 3749 3753 N
+ OY P IY e n/a 27 3739 3749 3753 N
+ OY P IY s n/a 27 3739 3749 3753 N
+ OY P JH e n/a 27 3739 3749 3751 N
+ OY P JH s n/a 27 3739 3749 3751 N
+ OY P K b n/a 27 3739 3749 3751 N
+ OY P K e n/a 27 3739 3749 3751 N
+ OY P K s n/a 27 3739 3749 3751 N
+ OY P L b n/a 27 3739 3749 3750 N
+ OY P L e n/a 27 3739 3749 3750 N
+ OY P L i n/a 27 3739 3749 3750 N
+ OY P L s n/a 27 3739 3749 3750 N
+ OY P M e n/a 27 3741 3746 3755 N
+ OY P M s n/a 27 3741 3746 3755 N
+ OY P N b n/a 27 3741 3746 3755 N
+ OY P N e n/a 27 3741 3746 3755 N
+ OY P N i n/a 27 3741 3746 3755 N
+ OY P N s n/a 27 3741 3746 3755 N
+ OY P NG e n/a 27 3741 3746 3755 N
+ OY P NG s n/a 27 3741 3746 3755 N
+ OY P OW b n/a 27 3739 3749 3753 N
+ OY P OW e n/a 27 3739 3749 3753 N
+ OY P OW s n/a 27 3739 3749 3753 N
+ OY P OY e n/a 27 3739 3749 3753 N
+ OY P OY s n/a 27 3739 3749 3753 N
+ OY P P e n/a 27 3739 3749 3751 N
+ OY P P i n/a 27 3739 3749 3751 N
+ OY P P s n/a 27 3739 3749 3751 N
+ OY P R b n/a 27 3739 3749 3750 N
+ OY P R e n/a 27 3739 3749 3750 N
+ OY P R i n/a 27 3739 3749 3750 N
+ OY P R s n/a 27 3739 3749 3750 N
+ OY P S b n/a 27 3739 3749 3752 N
+ OY P S e n/a 27 3739 3749 3752 N
+ OY P S i n/a 27 3739 3749 3752 N
+ OY P S s n/a 27 3739 3749 3752 N
+ OY P SH e n/a 27 3739 3749 3752 N
+ OY P SH s n/a 27 3739 3749 3752 N
+ OY P SIL e n/a 27 3739 3749 3754 N
+ OY P SIL s n/a 27 3739 3749 3754 N
+ OY P T e n/a 27 3739 3749 3751 N
+ OY P T i n/a 27 3739 3749 3751 N
+ OY P T s n/a 27 3739 3749 3751 N
+ OY P TH e n/a 27 3739 3749 3752 N
+ OY P TH i n/a 27 3739 3749 3752 N
+ OY P TH s n/a 27 3739 3749 3752 N
+ OY P UH e n/a 27 3739 3749 3753 N
+ OY P UH s n/a 27 3739 3749 3753 N
+ OY P UW e n/a 27 3739 3749 3753 N
+ OY P UW s n/a 27 3739 3749 3753 N
+ OY P V e n/a 27 3739 3749 3751 N
+ OY P V s n/a 27 3739 3749 3751 N
+ OY P W e n/a 27 3739 3749 3751 N
+ OY P W s n/a 27 3739 3749 3751 N
+ OY P Y e n/a 27 3739 3749 3751 N
+ OY P Y s n/a 27 3739 3749 3751 N
+ OY P Z e n/a 27 3739 3749 3751 N
+ OY P Z i n/a 27 3739 3749 3751 N
+ OY P Z s n/a 27 3739 3749 3751 N
+ OY P ZH e n/a 27 3739 3749 3751 N
+ OY P ZH s n/a 27 3739 3749 3751 N
+ OY R AA e n/a 27 3745 3747 3750 N
+ OY R AA i n/a 27 3745 3747 3750 N
+ OY R AA s n/a 27 3745 3747 3750 N
+ OY R AE e n/a 27 3745 3747 3750 N
+ OY R AE i n/a 27 3745 3747 3750 N
+ OY R AE s n/a 27 3745 3747 3750 N
+ OY R AH e n/a 27 3745 3747 3750 N
+ OY R AH i n/a 27 3745 3747 3750 N
+ OY R AH s n/a 27 3745 3747 3750 N
+ OY R AO e n/a 27 3745 3747 3750 N
+ OY R AO s n/a 27 3745 3747 3750 N
+ OY R AW e n/a 27 3745 3747 3750 N
+ OY R AW s n/a 27 3745 3747 3750 N
+ OY R AY e n/a 27 3745 3747 3750 N
+ OY R AY s n/a 27 3745 3747 3750 N
+ OY R B e n/a 27 3745 3747 3751 N
+ OY R B i n/a 27 3745 3747 3751 N
+ OY R B s n/a 27 3745 3747 3751 N
+ OY R CH e n/a 27 3745 3747 3751 N
+ OY R CH i n/a 27 3745 3747 3751 N
+ OY R CH s n/a 27 3745 3747 3751 N
+ OY R D e n/a 27 3745 3747 3751 N
+ OY R D i n/a 27 3745 3747 3751 N
+ OY R D s n/a 27 3745 3747 3751 N
+ OY R DH e n/a 27 3745 3747 3751 N
+ OY R DH i n/a 27 3745 3747 3751 N
+ OY R DH s n/a 27 3745 3747 3751 N
+ OY R EH e n/a 27 3745 3747 3750 N
+ OY R EH i n/a 27 3745 3747 3750 N
+ OY R EH s n/a 27 3745 3747 3750 N
+ OY R ER b n/a 27 3745 3747 3750 N
+ OY R ER e n/a 27 3745 3747 3750 N
+ OY R ER i n/a 27 3745 3747 3750 N
+ OY R ER s n/a 27 3745 3747 3750 N
+ OY R EY e n/a 27 3745 3747 3750 N
+ OY R EY s n/a 27 3745 3747 3750 N
+ OY R F e n/a 27 3745 3747 3752 N
+ OY R F s n/a 27 3745 3747 3752 N
+ OY R G e n/a 27 3745 3747 3751 N
+ OY R G i n/a 27 3745 3747 3751 N
+ OY R G s n/a 27 3745 3747 3751 N
+ OY R HH e n/a 27 3745 3747 3751 N
+ OY R HH i n/a 27 3745 3747 3751 N
+ OY R HH s n/a 27 3745 3747 3751 N
+ OY R IH b n/a 27 3745 3747 3753 N
+ OY R IH e n/a 27 3745 3747 3753 N
+ OY R IH i n/a 27 3745 3747 3753 N
+ OY R IH s n/a 27 3745 3747 3753 N
+ OY R IY e n/a 27 3745 3747 3753 N
+ OY R IY s n/a 27 3745 3747 3753 N
+ OY R JH e n/a 27 3745 3747 3751 N
+ OY R JH s n/a 27 3745 3747 3751 N
+ OY R K b n/a 27 3745 3747 3751 N
+ OY R K e n/a 27 3745 3747 3751 N
+ OY R K i n/a 27 3745 3747 3751 N
+ OY R K s n/a 27 3745 3747 3751 N
+ OY R L b n/a 27 3745 3748 3750 N
+ OY R L e n/a 27 3745 3748 3750 N
+ OY R L i n/a 27 3745 3748 3750 N
+ OY R L s n/a 27 3745 3748 3750 N
+ OY R M e n/a 27 3745 3747 3755 N
+ OY R M s n/a 27 3745 3747 3755 N
+ OY R N b n/a 27 3745 3747 3755 N
+ OY R N e n/a 27 3745 3747 3755 N
+ OY R N i n/a 27 3745 3747 3755 N
+ OY R N s n/a 27 3745 3747 3755 N
+ OY R NG e n/a 27 3745 3747 3755 N
+ OY R NG s n/a 27 3745 3747 3755 N
+ OY R OW b n/a 27 3745 3747 3750 N
+ OY R OW e n/a 27 3745 3747 3750 N
+ OY R OW s n/a 27 3745 3747 3750 N
+ OY R OY e n/a 27 3745 3747 3750 N
+ OY R OY s n/a 27 3745 3747 3750 N
+ OY R P e n/a 27 3745 3747 3751 N
+ OY R P s n/a 27 3745 3747 3751 N
+ OY R R b n/a 27 3745 3748 3750 N
+ OY R R e n/a 27 3745 3748 3750 N
+ OY R R i n/a 27 3745 3748 3750 N
+ OY R R s n/a 27 3745 3748 3750 N
+ OY R S b n/a 27 3745 3747 3752 N
+ OY R S e n/a 27 3745 3747 3752 N
+ OY R S i n/a 27 3745 3747 3752 N
+ OY R S s n/a 27 3745 3747 3752 N
+ OY R SH e n/a 27 3745 3747 3752 N
+ OY R SH i n/a 27 3745 3747 3752 N
+ OY R SH s n/a 27 3745 3747 3752 N
+ OY R SIL e n/a 27 3745 3747 3754 N
+ OY R SIL s n/a 27 3745 3747 3754 N
+ OY R T e n/a 27 3745 3747 3751 N
+ OY R T i n/a 27 3745 3747 3751 N
+ OY R T s n/a 27 3745 3747 3751 N
+ OY R TH e n/a 27 3745 3747 3752 N
+ OY R TH i n/a 27 3745 3747 3752 N
+ OY R TH s n/a 27 3745 3747 3752 N
+ OY R UH e n/a 27 3745 3747 3753 N
+ OY R UH s n/a 27 3745 3747 3753 N
+ OY R UW e n/a 27 3745 3747 3753 N
+ OY R UW i n/a 27 3745 3747 3753 N
+ OY R UW s n/a 27 3745 3747 3753 N
+ OY R V e n/a 27 3745 3747 3751 N
+ OY R V s n/a 27 3745 3747 3751 N
+ OY R W e n/a 27 3745 3747 3750 N
+ OY R W s n/a 27 3745 3747 3750 N
+ OY R Y e n/a 27 3745 3747 3751 N
+ OY R Y s n/a 27 3745 3747 3751 N
+ OY R Z e n/a 27 3745 3747 3751 N
+ OY R Z i n/a 27 3745 3747 3751 N
+ OY R Z s n/a 27 3745 3747 3751 N
+ OY R ZH e n/a 27 3745 3747 3751 N
+ OY R ZH s n/a 27 3745 3747 3751 N
+ OY S AA e n/a 27 3739 3747 3753 N
+ OY S AA s n/a 27 3739 3747 3753 N
+ OY S AE e n/a 27 3739 3747 3753 N
+ OY S AE i n/a 27 3739 3747 3753 N
+ OY S AE s n/a 27 3739 3747 3753 N
+ OY S AH e n/a 27 3739 3747 3753 N
+ OY S AH i n/a 27 3739 3747 3753 N
+ OY S AH s n/a 27 3739 3747 3753 N
+ OY S AO e n/a 27 3739 3747 3753 N
+ OY S AO s n/a 27 3739 3747 3753 N
+ OY S AW e n/a 27 3739 3747 3753 N
+ OY S AW s n/a 27 3739 3747 3753 N
+ OY S AY e n/a 27 3739 3747 3753 N
+ OY S AY s n/a 27 3739 3747 3753 N
+ OY S B e n/a 27 3739 3747 3751 N
+ OY S B i n/a 27 3739 3747 3751 N
+ OY S B s n/a 27 3739 3747 3751 N
+ OY S CH e n/a 27 3739 3747 3751 N
+ OY S CH s n/a 27 3739 3747 3751 N
+ OY S D e n/a 27 3739 3747 3751 N
+ OY S D i n/a 27 3739 3747 3751 N
+ OY S D s n/a 27 3739 3747 3751 N
+ OY S DH e n/a 27 3739 3747 3751 N
+ OY S DH s n/a 27 3739 3747 3751 N
+ OY S EH e n/a 27 3739 3747 3753 N
+ OY S EH s n/a 27 3739 3747 3753 N
+ OY S ER b n/a 27 3739 3747 3753 N
+ OY S ER e n/a 27 3739 3747 3753 N
+ OY S ER i n/a 27 3739 3747 3753 N
+ OY S ER s n/a 27 3739 3747 3753 N
+ OY S EY e n/a 27 3739 3747 3753 N
+ OY S EY s n/a 27 3739 3747 3753 N
+ OY S F e n/a 27 3739 3747 3752 N
+ OY S F i n/a 27 3739 3747 3752 N
+ OY S F s n/a 27 3739 3747 3752 N
+ OY S G e n/a 27 3739 3747 3751 N
+ OY S G s n/a 27 3739 3747 3751 N
+ OY S HH e n/a 27 3739 3747 3751 N
+ OY S HH s n/a 27 3739 3747 3751 N
+ OY S IH b n/a 27 3739 3747 3753 N
+ OY S IH e n/a 27 3739 3747 3753 N
+ OY S IH s n/a 27 3739 3747 3753 N
+ OY S IY e n/a 27 3739 3747 3753 N
+ OY S IY s n/a 27 3739 3747 3753 N
+ OY S JH e n/a 27 3739 3747 3751 N
+ OY S JH s n/a 27 3739 3747 3751 N
+ OY S K b n/a 27 3739 3747 3751 N
+ OY S K e n/a 27 3739 3747 3751 N
+ OY S K i n/a 27 3739 3747 3751 N
+ OY S K s n/a 27 3739 3747 3751 N
+ OY S L b n/a 27 3739 3748 3750 N
+ OY S L e n/a 27 3739 3748 3750 N
+ OY S L i n/a 27 3739 3748 3750 N
+ OY S L s n/a 27 3739 3748 3750 N
+ OY S M e n/a 27 3741 3746 3755 N
+ OY S M s n/a 27 3741 3746 3755 N
+ OY S N b n/a 27 3741 3746 3755 N
+ OY S N e n/a 27 3741 3746 3755 N
+ OY S N s n/a 27 3741 3746 3755 N
+ OY S NG e n/a 27 3741 3746 3755 N
+ OY S NG s n/a 27 3741 3746 3755 N
+ OY S OW b n/a 27 3739 3747 3753 N
+ OY S OW e n/a 27 3739 3747 3753 N
+ OY S OW s n/a 27 3739 3747 3753 N
+ OY S OY e n/a 27 3739 3747 3753 N
+ OY S OY s n/a 27 3739 3747 3753 N
+ OY S P e n/a 27 3739 3747 3751 N
+ OY S P s n/a 27 3739 3747 3751 N
+ OY S R b n/a 27 3739 3748 3750 N
+ OY S R e n/a 27 3739 3748 3750 N
+ OY S R i n/a 27 3739 3748 3750 N
+ OY S R s n/a 27 3739 3748 3750 N
+ OY S S b n/a 27 3739 3747 3752 N
+ OY S S e n/a 27 3739 3747 3752 N
+ OY S S i n/a 27 3739 3747 3752 N
+ OY S S s n/a 27 3739 3747 3752 N
+ OY S SH e n/a 27 3739 3747 3752 N
+ OY S SH s n/a 27 3739 3747 3752 N
+ OY S SIL e n/a 27 3739 3747 3754 N
+ OY S SIL s n/a 27 3739 3747 3754 N
+ OY S T e n/a 27 3739 3747 3751 N
+ OY S T i n/a 27 3739 3747 3751 N
+ OY S T s n/a 27 3739 3747 3751 N
+ OY S TH e n/a 27 3739 3747 3752 N
+ OY S TH s n/a 27 3739 3747 3752 N
+ OY S UH e n/a 27 3739 3747 3753 N
+ OY S UH s n/a 27 3739 3747 3753 N
+ OY S UW e n/a 27 3739 3747 3753 N
+ OY S UW i n/a 27 3739 3747 3753 N
+ OY S UW s n/a 27 3739 3747 3753 N
+ OY S V e n/a 27 3739 3747 3751 N
+ OY S V s n/a 27 3739 3747 3751 N
+ OY S W e n/a 27 3739 3747 3751 N
+ OY S W s n/a 27 3739 3747 3751 N
+ OY S Y e n/a 27 3739 3747 3751 N
+ OY S Y s n/a 27 3739 3747 3751 N
+ OY S Z e n/a 27 3739 3747 3751 N
+ OY S Z i n/a 27 3739 3747 3751 N
+ OY S Z s n/a 27 3739 3747 3751 N
+ OY S ZH e n/a 27 3739 3747 3751 N
+ OY S ZH s n/a 27 3739 3747 3751 N
+ OY SH AA e n/a 27 3739 3747 3753 N
+ OY SH AA s n/a 27 3739 3747 3753 N
+ OY SH AE e n/a 27 3739 3747 3753 N
+ OY SH AE s n/a 27 3739 3747 3753 N
+ OY SH AH e n/a 27 3739 3747 3753 N
+ OY SH AH s n/a 27 3739 3747 3753 N
+ OY SH AO e n/a 27 3739 3747 3753 N
+ OY SH AO s n/a 27 3739 3747 3753 N
+ OY SH AW e n/a 27 3739 3747 3753 N
+ OY SH AW s n/a 27 3739 3747 3753 N
+ OY SH AY e n/a 27 3739 3747 3753 N
+ OY SH AY s n/a 27 3739 3747 3753 N
+ OY SH B e n/a 27 3739 3747 3751 N
+ OY SH B s n/a 27 3739 3747 3751 N
+ OY SH CH e n/a 27 3739 3747 3751 N
+ OY SH CH i n/a 27 3739 3747 3751 N
+ OY SH CH s n/a 27 3739 3747 3751 N
+ OY SH D e n/a 27 3739 3747 3751 N
+ OY SH D s n/a 27 3739 3747 3751 N
+ OY SH DH e n/a 27 3739 3747 3751 N
+ OY SH DH s n/a 27 3739 3747 3751 N
+ OY SH EH e n/a 27 3739 3747 3753 N
+ OY SH EH s n/a 27 3739 3747 3753 N
+ OY SH ER b n/a 27 3739 3747 3753 N
+ OY SH ER e n/a 27 3739 3747 3753 N
+ OY SH ER i n/a 27 3739 3747 3753 N
+ OY SH ER s n/a 27 3739 3747 3753 N
+ OY SH EY e n/a 27 3739 3747 3753 N
+ OY SH EY s n/a 27 3739 3747 3753 N
+ OY SH F e n/a 27 3739 3747 3752 N
+ OY SH F i n/a 27 3739 3747 3752 N
+ OY SH F s n/a 27 3739 3747 3752 N
+ OY SH G e n/a 27 3739 3747 3751 N
+ OY SH G s n/a 27 3739 3747 3751 N
+ OY SH HH e n/a 27 3739 3747 3751 N
+ OY SH HH s n/a 27 3739 3747 3751 N
+ OY SH IH b n/a 27 3739 3747 3753 N
+ OY SH IH e n/a 27 3739 3747 3753 N
+ OY SH IH s n/a 27 3739 3747 3753 N
+ OY SH IY e n/a 27 3739 3747 3753 N
+ OY SH IY s n/a 27 3739 3747 3753 N
+ OY SH JH e n/a 27 3739 3747 3751 N
+ OY SH JH s n/a 27 3739 3747 3751 N
+ OY SH K b n/a 27 3739 3747 3751 N
+ OY SH K e n/a 27 3739 3747 3751 N
+ OY SH K i n/a 27 3739 3747 3751 N
+ OY SH K s n/a 27 3739 3747 3751 N
+ OY SH L b n/a 27 3739 3748 3750 N
+ OY SH L e n/a 27 3739 3748 3750 N
+ OY SH L s n/a 27 3739 3748 3750 N
+ OY SH M e n/a 27 3741 3746 3755 N
+ OY SH M s n/a 27 3741 3746 3755 N
+ OY SH N b n/a 27 3741 3746 3755 N
+ OY SH N e n/a 27 3741 3746 3755 N
+ OY SH N i n/a 27 3741 3746 3755 N
+ OY SH N s n/a 27 3741 3746 3755 N
+ OY SH NG e n/a 27 3741 3746 3755 N
+ OY SH NG s n/a 27 3741 3746 3755 N
+ OY SH OW b n/a 27 3739 3747 3753 N
+ OY SH OW e n/a 27 3739 3747 3753 N
+ OY SH OW s n/a 27 3739 3747 3753 N
+ OY SH OY e n/a 27 3739 3747 3753 N
+ OY SH OY s n/a 27 3739 3747 3753 N
+ OY SH P e n/a 27 3739 3747 3751 N
+ OY SH P s n/a 27 3739 3747 3751 N
+ OY SH R b n/a 27 3739 3748 3750 N
+ OY SH R e n/a 27 3739 3748 3750 N
+ OY SH R i n/a 27 3739 3748 3750 N
+ OY SH R s n/a 27 3739 3748 3750 N
+ OY SH S b n/a 27 3739 3747 3752 N
+ OY SH S e n/a 27 3739 3747 3752 N
+ OY SH S s n/a 27 3739 3747 3752 N
+ OY SH SH e n/a 27 3739 3747 3752 N
+ OY SH SH s n/a 27 3739 3747 3752 N
+ OY SH SIL e n/a 27 3739 3747 3754 N
+ OY SH SIL s n/a 27 3739 3747 3754 N
+ OY SH T e n/a 27 3739 3747 3751 N
+ OY SH T s n/a 27 3739 3747 3751 N
+ OY SH TH e n/a 27 3739 3747 3752 N
+ OY SH TH s n/a 27 3739 3747 3752 N
+ OY SH UH e n/a 27 3739 3747 3753 N
+ OY SH UH s n/a 27 3739 3747 3753 N
+ OY SH UW e n/a 27 3739 3747 3753 N
+ OY SH UW s n/a 27 3739 3747 3753 N
+ OY SH V e n/a 27 3739 3747 3751 N
+ OY SH V s n/a 27 3739 3747 3751 N
+ OY SH W e n/a 27 3739 3747 3751 N
+ OY SH W s n/a 27 3739 3747 3751 N
+ OY SH Y e n/a 27 3739 3747 3751 N
+ OY SH Y s n/a 27 3739 3747 3751 N
+ OY SH Z e n/a 27 3739 3747 3751 N
+ OY SH Z i n/a 27 3739 3747 3751 N
+ OY SH Z s n/a 27 3739 3747 3751 N
+ OY SH ZH e n/a 27 3739 3747 3751 N
+ OY SH ZH s n/a 27 3739 3747 3751 N
+ OY SIL AA s n/a 27 3739 3747 3753 N
+ OY SIL AE s n/a 27 3739 3747 3753 N
+ OY SIL AH s n/a 27 3739 3747 3753 N
+ OY SIL AO s n/a 27 3739 3747 3753 N
+ OY SIL AW s n/a 27 3739 3747 3753 N
+ OY SIL AY s n/a 27 3739 3747 3753 N
+ OY SIL B s n/a 27 3739 3747 3751 N
+ OY SIL CH s n/a 27 3739 3747 3751 N
+ OY SIL D s n/a 27 3739 3747 3751 N
+ OY SIL DH s n/a 27 3739 3747 3751 N
+ OY SIL EH s n/a 27 3739 3747 3753 N
+ OY SIL ER b n/a 27 3739 3747 3753 N
+ OY SIL ER s n/a 27 3739 3747 3753 N
+ OY SIL EY s n/a 27 3739 3747 3753 N
+ OY SIL F s n/a 27 3739 3747 3752 N
+ OY SIL G s n/a 27 3739 3747 3751 N
+ OY SIL HH s n/a 27 3739 3747 3751 N
+ OY SIL IH b n/a 27 3739 3747 3753 N
+ OY SIL IH s n/a 27 3739 3747 3753 N
+ OY SIL IY s n/a 27 3739 3747 3753 N
+ OY SIL JH s n/a 27 3739 3747 3751 N
+ OY SIL K b n/a 27 3739 3747 3751 N
+ OY SIL K s n/a 27 3739 3747 3751 N
+ OY SIL L b n/a 27 3739 3748 3750 N
+ OY SIL L s n/a 27 3739 3748 3750 N
+ OY SIL M s n/a 27 3741 3746 3755 N
+ OY SIL N b n/a 27 3741 3746 3755 N
+ OY SIL N s n/a 27 3741 3746 3755 N
+ OY SIL NG s n/a 27 3741 3746 3755 N
+ OY SIL OW b n/a 27 3739 3747 3753 N
+ OY SIL OW s n/a 27 3739 3747 3753 N
+ OY SIL OY s n/a 27 3739 3747 3753 N
+ OY SIL P s n/a 27 3739 3747 3751 N
+ OY SIL R b n/a 27 3739 3748 3750 N
+ OY SIL R s n/a 27 3739 3748 3750 N
+ OY SIL S b n/a 27 3739 3747 3752 N
+ OY SIL S s n/a 27 3739 3747 3752 N
+ OY SIL SH s n/a 27 3739 3747 3752 N
+ OY SIL SIL s n/a 27 3739 3747 3754 N
+ OY SIL T s n/a 27 3739 3747 3751 N
+ OY SIL TH s n/a 27 3739 3747 3752 N
+ OY SIL UH s n/a 27 3739 3747 3753 N
+ OY SIL UW s n/a 27 3739 3747 3753 N
+ OY SIL V s n/a 27 3739 3747 3751 N
+ OY SIL W s n/a 27 3739 3747 3751 N
+ OY SIL Y s n/a 27 3739 3747 3751 N
+ OY SIL Z s n/a 27 3739 3747 3751 N
+ OY SIL ZH s n/a 27 3739 3747 3751 N
+ OY T AA e n/a 27 3739 3747 3753 N
+ OY T AA i n/a 27 3739 3747 3753 N
+ OY T AA s n/a 27 3739 3747 3753 N
+ OY T AE e n/a 27 3739 3747 3753 N
+ OY T AE s n/a 27 3739 3747 3753 N
+ OY T AH e n/a 27 3739 3747 3753 N
+ OY T AH i n/a 27 3739 3747 3753 N
+ OY T AH s n/a 27 3739 3747 3753 N
+ OY T AO e n/a 27 3739 3747 3753 N
+ OY T AO s n/a 27 3739 3747 3753 N
+ OY T AW e n/a 27 3739 3747 3753 N
+ OY T AW s n/a 27 3739 3747 3753 N
+ OY T AY e n/a 27 3739 3747 3753 N
+ OY T AY s n/a 27 3739 3747 3753 N
+ OY T B e n/a 27 3739 3747 3751 N
+ OY T B i n/a 27 3739 3747 3751 N
+ OY T B s n/a 27 3739 3747 3751 N
+ OY T CH e n/a 27 3739 3747 3751 N
+ OY T CH i n/a 27 3739 3747 3751 N
+ OY T CH s n/a 27 3739 3747 3751 N
+ OY T D e n/a 27 3739 3747 3751 N
+ OY T D i n/a 27 3739 3747 3751 N
+ OY T D s n/a 27 3739 3747 3751 N
+ OY T DH e n/a 27 3739 3747 3751 N
+ OY T DH s n/a 27 3739 3747 3751 N
+ OY T EH e n/a 27 3739 3747 3753 N
+ OY T EH i n/a 27 3739 3747 3753 N
+ OY T EH s n/a 27 3739 3747 3753 N
+ OY T ER b n/a 27 3739 3747 3753 N
+ OY T ER e n/a 27 3739 3747 3753 N
+ OY T ER i n/a 27 3739 3747 3753 N
+ OY T ER s n/a 27 3739 3747 3753 N
+ OY T EY e n/a 27 3739 3747 3753 N
+ OY T EY s n/a 27 3739 3747 3753 N
+ OY T F e n/a 27 3739 3747 3752 N
+ OY T F i n/a 27 3739 3747 3752 N
+ OY T F s n/a 27 3739 3747 3752 N
+ OY T G e n/a 27 3739 3747 3751 N
+ OY T G s n/a 27 3739 3747 3751 N
+ OY T HH e n/a 27 3739 3747 3751 N
+ OY T HH s n/a 27 3739 3747 3751 N
+ OY T IH b n/a 27 3739 3747 3753 N
+ OY T IH e n/a 27 3739 3747 3753 N
+ OY T IH i n/a 27 3739 3747 3753 N
+ OY T IH s n/a 27 3739 3747 3753 N
+ OY T IY e n/a 27 3739 3747 3753 N
+ OY T IY s n/a 27 3739 3747 3753 N
+ OY T JH e n/a 27 3739 3747 3751 N
+ OY T JH s n/a 27 3739 3747 3751 N
+ OY T K b n/a 27 3739 3747 3751 N
+ OY T K e n/a 27 3739 3747 3751 N
+ OY T K i n/a 27 3739 3747 3751 N
+ OY T K s n/a 27 3739 3747 3751 N
+ OY T L b n/a 27 3739 3748 3750 N
+ OY T L e n/a 27 3739 3748 3750 N
+ OY T L i n/a 27 3739 3748 3750 N
+ OY T L s n/a 27 3739 3748 3750 N
+ OY T M e n/a 27 3741 3746 3755 N
+ OY T M i n/a 27 3741 3746 3755 N
+ OY T M s n/a 27 3741 3746 3755 N
+ OY T N b n/a 27 3741 3746 3755 N
+ OY T N e n/a 27 3741 3746 3755 N
+ OY T N i n/a 27 3741 3746 3755 N
+ OY T N s n/a 27 3741 3746 3755 N
+ OY T NG e n/a 27 3741 3746 3755 N
+ OY T NG s n/a 27 3741 3746 3755 N
+ OY T OW b n/a 27 3739 3747 3753 N
+ OY T OW e n/a 27 3739 3747 3753 N
+ OY T OW i n/a 27 3739 3747 3753 N
+ OY T OW s n/a 27 3739 3747 3753 N
+ OY T OY e n/a 27 3739 3747 3753 N
+ OY T OY s n/a 27 3739 3747 3753 N
+ OY T P e n/a 27 3739 3747 3751 N
+ OY T P s n/a 27 3739 3747 3751 N
+ OY T R b n/a 27 3739 3748 3750 N
+ OY T R e n/a 27 3739 3748 3750 N
+ OY T R s n/a 27 3739 3748 3750 N
+ OY T S b n/a 27 3739 3747 3752 N
+ OY T S e n/a 27 3739 3747 3752 N
+ OY T S i n/a 27 3739 3747 3752 N
+ OY T S s n/a 27 3739 3747 3752 N
+ OY T SH e n/a 27 3739 3747 3752 N
+ OY T SH i n/a 27 3739 3747 3752 N
+ OY T SH s n/a 27 3739 3747 3752 N
+ OY T SIL e n/a 27 3739 3747 3754 N
+ OY T SIL s n/a 27 3739 3747 3754 N
+ OY T T e n/a 27 3739 3747 3751 N
+ OY T T i n/a 27 3739 3747 3751 N
+ OY T T s n/a 27 3739 3747 3751 N
+ OY T TH e n/a 27 3739 3747 3752 N
+ OY T TH s n/a 27 3739 3747 3752 N
+ OY T UH e n/a 27 3739 3747 3753 N
+ OY T UH s n/a 27 3739 3747 3753 N
+ OY T UW e n/a 27 3739 3747 3753 N
+ OY T UW i n/a 27 3739 3747 3753 N
+ OY T UW s n/a 27 3739 3747 3753 N
+ OY T V e n/a 27 3739 3747 3751 N
+ OY T V i n/a 27 3739 3747 3751 N
+ OY T V s n/a 27 3739 3747 3751 N
+ OY T W e n/a 27 3739 3747 3751 N
+ OY T W s n/a 27 3739 3747 3751 N
+ OY T Y e n/a 27 3739 3747 3751 N
+ OY T Y s n/a 27 3739 3747 3751 N
+ OY T Z e n/a 27 3739 3747 3751 N
+ OY T Z i n/a 27 3739 3747 3751 N
+ OY T Z s n/a 27 3739 3747 3751 N
+ OY T ZH e n/a 27 3739 3747 3751 N
+ OY T ZH s n/a 27 3739 3747 3751 N
+ OY TH AA s n/a 27 3739 3747 3753 N
+ OY TH AE s n/a 27 3739 3747 3753 N
+ OY TH AH s n/a 27 3739 3747 3753 N
+ OY TH AO s n/a 27 3739 3747 3753 N
+ OY TH AW s n/a 27 3739 3747 3753 N
+ OY TH AY s n/a 27 3739 3747 3753 N
+ OY TH B s n/a 27 3739 3747 3751 N
+ OY TH CH s n/a 27 3739 3747 3751 N
+ OY TH D s n/a 27 3739 3747 3751 N
+ OY TH DH s n/a 27 3739 3747 3751 N
+ OY TH EH s n/a 27 3739 3747 3753 N
+ OY TH ER b n/a 27 3739 3747 3753 N
+ OY TH ER s n/a 27 3739 3747 3753 N
+ OY TH EY s n/a 27 3739 3747 3753 N
+ OY TH F s n/a 27 3739 3747 3752 N
+ OY TH G s n/a 27 3739 3747 3751 N
+ OY TH HH s n/a 27 3739 3747 3751 N
+ OY TH IH b n/a 27 3739 3747 3753 N
+ OY TH IH s n/a 27 3739 3747 3753 N
+ OY TH IY s n/a 27 3739 3747 3753 N
+ OY TH JH s n/a 27 3739 3747 3751 N
+ OY TH K b n/a 27 3739 3747 3751 N
+ OY TH K s n/a 27 3739 3747 3751 N
+ OY TH L b n/a 27 3739 3748 3750 N
+ OY TH L s n/a 27 3739 3748 3750 N
+ OY TH M s n/a 27 3741 3746 3755 N
+ OY TH N b n/a 27 3741 3746 3755 N
+ OY TH N s n/a 27 3741 3746 3755 N
+ OY TH NG s n/a 27 3741 3746 3755 N
+ OY TH OW b n/a 27 3739 3747 3753 N
+ OY TH OW s n/a 27 3739 3747 3753 N
+ OY TH OY s n/a 27 3739 3747 3753 N
+ OY TH P s n/a 27 3739 3747 3751 N
+ OY TH R b n/a 27 3739 3748 3750 N
+ OY TH R s n/a 27 3739 3748 3750 N
+ OY TH S b n/a 27 3739 3747 3752 N
+ OY TH S s n/a 27 3739 3747 3752 N
+ OY TH SH s n/a 27 3739 3747 3752 N
+ OY TH SIL s n/a 27 3739 3747 3754 N
+ OY TH T s n/a 27 3739 3747 3751 N
+ OY TH TH s n/a 27 3739 3747 3752 N
+ OY TH UH s n/a 27 3739 3747 3753 N
+ OY TH UW s n/a 27 3739 3747 3753 N
+ OY TH V s n/a 27 3739 3747 3751 N
+ OY TH W s n/a 27 3739 3747 3751 N
+ OY TH Y s n/a 27 3739 3747 3751 N
+ OY TH Z s n/a 27 3739 3747 3751 N
+ OY TH ZH s n/a 27 3739 3747 3751 N
+ OY UH AA s n/a 27 3739 3747 3753 N
+ OY UH AE s n/a 27 3739 3747 3753 N
+ OY UH AH s n/a 27 3739 3747 3753 N
+ OY UH AO s n/a 27 3739 3747 3753 N
+ OY UH AW s n/a 27 3739 3747 3753 N
+ OY UH AY s n/a 27 3739 3747 3753 N
+ OY UH B s n/a 27 3739 3747 3751 N
+ OY UH CH s n/a 27 3739 3747 3751 N
+ OY UH D s n/a 27 3739 3747 3751 N
+ OY UH DH s n/a 27 3739 3747 3751 N
+ OY UH EH s n/a 27 3739 3747 3753 N
+ OY UH ER b n/a 27 3739 3747 3753 N
+ OY UH ER s n/a 27 3739 3747 3753 N
+ OY UH EY s n/a 27 3739 3747 3753 N
+ OY UH F s n/a 27 3739 3747 3752 N
+ OY UH G s n/a 27 3739 3747 3751 N
+ OY UH HH s n/a 27 3739 3747 3751 N
+ OY UH IH b n/a 27 3739 3747 3753 N
+ OY UH IH s n/a 27 3739 3747 3753 N
+ OY UH IY s n/a 27 3739 3747 3753 N
+ OY UH JH s n/a 27 3739 3747 3751 N
+ OY UH K b n/a 27 3739 3747 3751 N
+ OY UH K s n/a 27 3739 3747 3751 N
+ OY UH L b n/a 27 3739 3748 3750 N
+ OY UH L s n/a 27 3739 3748 3750 N
+ OY UH M s n/a 27 3741 3747 3755 N
+ OY UH N b n/a 27 3741 3747 3755 N
+ OY UH N s n/a 27 3741 3747 3755 N
+ OY UH NG s n/a 27 3741 3747 3755 N
+ OY UH OW b n/a 27 3739 3747 3753 N
+ OY UH OW s n/a 27 3739 3747 3753 N
+ OY UH OY s n/a 27 3739 3747 3753 N
+ OY UH P s n/a 27 3739 3747 3751 N
+ OY UH R b n/a 27 3739 3748 3750 N
+ OY UH R s n/a 27 3739 3748 3750 N
+ OY UH S b n/a 27 3739 3747 3752 N
+ OY UH S s n/a 27 3739 3747 3752 N
+ OY UH SH s n/a 27 3739 3747 3752 N
+ OY UH SIL s n/a 27 3739 3747 3754 N
+ OY UH T s n/a 27 3739 3747 3751 N
+ OY UH TH s n/a 27 3739 3747 3752 N
+ OY UH UH s n/a 27 3739 3747 3753 N
+ OY UH UW s n/a 27 3739 3747 3753 N
+ OY UH V s n/a 27 3739 3747 3751 N
+ OY UH W s n/a 27 3739 3747 3751 N
+ OY UH Y s n/a 27 3739 3747 3751 N
+ OY UH Z s n/a 27 3739 3747 3751 N
+ OY UH ZH s n/a 27 3739 3747 3751 N
+ OY UW AA s n/a 27 3739 3747 3753 N
+ OY UW AE s n/a 27 3739 3747 3753 N
+ OY UW AH s n/a 27 3739 3747 3753 N
+ OY UW AO s n/a 27 3739 3747 3753 N
+ OY UW AW s n/a 27 3739 3747 3753 N
+ OY UW AY s n/a 27 3739 3747 3753 N
+ OY UW B s n/a 27 3739 3747 3751 N
+ OY UW CH s n/a 27 3739 3747 3751 N
+ OY UW D s n/a 27 3739 3747 3751 N
+ OY UW DH s n/a 27 3739 3747 3751 N
+ OY UW EH s n/a 27 3739 3747 3753 N
+ OY UW ER b n/a 27 3739 3747 3753 N
+ OY UW ER s n/a 27 3739 3747 3753 N
+ OY UW EY s n/a 27 3739 3747 3753 N
+ OY UW F s n/a 27 3739 3747 3752 N
+ OY UW G s n/a 27 3739 3747 3751 N
+ OY UW HH s n/a 27 3739 3747 3751 N
+ OY UW IH b n/a 27 3739 3747 3753 N
+ OY UW IH s n/a 27 3739 3747 3753 N
+ OY UW IY s n/a 27 3739 3747 3753 N
+ OY UW JH s n/a 27 3739 3747 3751 N
+ OY UW K b n/a 27 3739 3747 3751 N
+ OY UW K s n/a 27 3739 3747 3751 N
+ OY UW L b n/a 27 3739 3748 3750 N
+ OY UW L s n/a 27 3739 3748 3750 N
+ OY UW M s n/a 27 3741 3747 3755 N
+ OY UW N b n/a 27 3741 3747 3755 N
+ OY UW N s n/a 27 3741 3747 3755 N
+ OY UW NG s n/a 27 3741 3747 3755 N
+ OY UW OW b n/a 27 3739 3747 3753 N
+ OY UW OW s n/a 27 3739 3747 3753 N
+ OY UW OY s n/a 27 3739 3747 3753 N
+ OY UW P s n/a 27 3739 3747 3751 N
+ OY UW R b n/a 27 3739 3748 3750 N
+ OY UW R s n/a 27 3739 3748 3750 N
+ OY UW S b n/a 27 3739 3747 3752 N
+ OY UW S s n/a 27 3739 3747 3752 N
+ OY UW SH s n/a 27 3739 3747 3752 N
+ OY UW SIL s n/a 27 3739 3747 3754 N
+ OY UW T s n/a 27 3739 3747 3751 N
+ OY UW TH s n/a 27 3739 3747 3752 N
+ OY UW UH s n/a 27 3739 3747 3753 N
+ OY UW UW s n/a 27 3739 3747 3753 N
+ OY UW V s n/a 27 3739 3747 3751 N
+ OY UW W s n/a 27 3739 3747 3751 N
+ OY UW Y s n/a 27 3739 3747 3751 N
+ OY UW Z i n/a 27 3739 3747 3751 N
+ OY UW Z s n/a 27 3739 3747 3751 N
+ OY UW ZH s n/a 27 3739 3747 3751 N
+ OY V AA e n/a 27 3740 3749 3753 N
+ OY V AA s n/a 27 3740 3749 3753 N
+ OY V AE e n/a 27 3740 3749 3753 N
+ OY V AE s n/a 27 3740 3749 3753 N
+ OY V AH e n/a 27 3740 3749 3753 N
+ OY V AH i n/a 27 3740 3749 3753 N
+ OY V AH s n/a 27 3740 3749 3753 N
+ OY V AO e n/a 27 3740 3749 3753 N
+ OY V AO s n/a 27 3740 3749 3753 N
+ OY V AW e n/a 27 3740 3749 3753 N
+ OY V AW s n/a 27 3740 3749 3753 N
+ OY V AY e n/a 27 3740 3749 3753 N
+ OY V AY s n/a 27 3740 3749 3753 N
+ OY V B e n/a 27 3740 3749 3751 N
+ OY V B s n/a 27 3740 3749 3751 N
+ OY V CH e n/a 27 3740 3749 3751 N
+ OY V CH i n/a 27 3740 3749 3751 N
+ OY V CH s n/a 27 3740 3749 3751 N
+ OY V D e n/a 27 3740 3749 3751 N
+ OY V D i n/a 27 3740 3749 3751 N
+ OY V D s n/a 27 3740 3749 3751 N
+ OY V DH e n/a 27 3740 3749 3751 N
+ OY V DH s n/a 27 3740 3749 3751 N
+ OY V EH e n/a 27 3740 3749 3753 N
+ OY V EH s n/a 27 3740 3749 3753 N
+ OY V ER b n/a 27 3740 3749 3753 N
+ OY V ER e n/a 27 3740 3749 3753 N
+ OY V ER i n/a 27 3740 3749 3753 N
+ OY V ER s n/a 27 3740 3749 3753 N
+ OY V EY e n/a 27 3740 3749 3753 N
+ OY V EY s n/a 27 3740 3749 3753 N
+ OY V F e n/a 27 3740 3749 3752 N
+ OY V F s n/a 27 3740 3749 3752 N
+ OY V G e n/a 27 3740 3749 3751 N
+ OY V G i n/a 27 3740 3749 3751 N
+ OY V G s n/a 27 3740 3749 3751 N
+ OY V HH e n/a 27 3740 3749 3751 N
+ OY V HH s n/a 27 3740 3749 3751 N
+ OY V IH b n/a 27 3740 3749 3753 N
+ OY V IH e n/a 27 3740 3749 3753 N
+ OY V IH i n/a 27 3740 3749 3753 N
+ OY V IH s n/a 27 3740 3749 3753 N
+ OY V IY e n/a 27 3740 3749 3753 N
+ OY V IY s n/a 27 3740 3749 3753 N
+ OY V JH e n/a 27 3740 3749 3751 N
+ OY V JH s n/a 27 3740 3749 3751 N
+ OY V K b n/a 27 3740 3749 3751 N
+ OY V K e n/a 27 3740 3749 3751 N
+ OY V K s n/a 27 3740 3749 3751 N
+ OY V L b n/a 27 3740 3749 3750 N
+ OY V L e n/a 27 3740 3749 3750 N
+ OY V L i n/a 27 3740 3749 3750 N
+ OY V L s n/a 27 3740 3749 3750 N
+ OY V M e n/a 27 3741 3749 3755 N
+ OY V M s n/a 27 3741 3749 3755 N
+ OY V N b n/a 27 3741 3749 3755 N
+ OY V N e n/a 27 3741 3749 3755 N
+ OY V N i n/a 27 3741 3749 3755 N
+ OY V N s n/a 27 3741 3749 3755 N
+ OY V NG e n/a 27 3741 3749 3755 N
+ OY V NG s n/a 27 3741 3749 3755 N
+ OY V OW b n/a 27 3740 3749 3753 N
+ OY V OW e n/a 27 3740 3749 3753 N
+ OY V OW s n/a 27 3740 3749 3753 N
+ OY V OY e n/a 27 3740 3749 3753 N
+ OY V OY s n/a 27 3740 3749 3753 N
+ OY V P e n/a 27 3740 3749 3751 N
+ OY V P i n/a 27 3740 3749 3751 N
+ OY V P s n/a 27 3740 3749 3751 N
+ OY V R b n/a 27 3740 3749 3750 N
+ OY V R e n/a 27 3740 3749 3750 N
+ OY V R i n/a 27 3740 3749 3750 N
+ OY V R s n/a 27 3740 3749 3750 N
+ OY V S b n/a 27 3740 3749 3752 N
+ OY V S e n/a 27 3740 3749 3752 N
+ OY V S i n/a 27 3740 3749 3752 N
+ OY V S s n/a 27 3740 3749 3752 N
+ OY V SH e n/a 27 3740 3749 3752 N
+ OY V SH s n/a 27 3740 3749 3752 N
+ OY V SIL e n/a 27 3740 3749 3754 N
+ OY V SIL s n/a 27 3740 3749 3754 N
+ OY V T e n/a 27 3740 3749 3751 N
+ OY V T i n/a 27 3740 3749 3751 N
+ OY V T s n/a 27 3740 3749 3751 N
+ OY V TH e n/a 27 3740 3749 3752 N
+ OY V TH s n/a 27 3740 3749 3752 N
+ OY V UH e n/a 27 3740 3749 3753 N
+ OY V UH s n/a 27 3740 3749 3753 N
+ OY V UW e n/a 27 3740 3749 3753 N
+ OY V UW s n/a 27 3740 3749 3753 N
+ OY V V e n/a 27 3740 3749 3751 N
+ OY V V s n/a 27 3740 3749 3751 N
+ OY V W e n/a 27 3740 3749 3751 N
+ OY V W s n/a 27 3740 3749 3751 N
+ OY V Y e n/a 27 3740 3749 3751 N
+ OY V Y i n/a 27 3740 3749 3751 N
+ OY V Y s n/a 27 3740 3749 3751 N
+ OY V Z e n/a 27 3740 3749 3751 N
+ OY V Z i n/a 27 3740 3749 3751 N
+ OY V Z s n/a 27 3740 3749 3751 N
+ OY V ZH e n/a 27 3740 3749 3751 N
+ OY V ZH s n/a 27 3740 3749 3751 N
+ OY W AA e n/a 27 3739 3749 3753 N
+ OY W AA s n/a 27 3739 3749 3753 N
+ OY W AE e n/a 27 3739 3749 3753 N
+ OY W AE s n/a 27 3739 3749 3753 N
+ OY W AH e n/a 27 3739 3749 3753 N
+ OY W AH i n/a 27 3739 3749 3753 N
+ OY W AH s n/a 27 3739 3749 3753 N
+ OY W AO e n/a 27 3739 3749 3753 N
+ OY W AO s n/a 27 3739 3749 3753 N
+ OY W AW e n/a 27 3739 3749 3753 N
+ OY W AW s n/a 27 3739 3749 3753 N
+ OY W AY e n/a 27 3739 3749 3753 N
+ OY W AY s n/a 27 3739 3749 3753 N
+ OY W B e n/a 27 3739 3749 3751 N
+ OY W B s n/a 27 3739 3749 3751 N
+ OY W CH e n/a 27 3739 3749 3751 N
+ OY W CH i n/a 27 3739 3749 3751 N
+ OY W CH s n/a 27 3739 3749 3751 N
+ OY W D e n/a 27 3739 3749 3751 N
+ OY W D i n/a 27 3739 3749 3751 N
+ OY W D s n/a 27 3739 3749 3751 N
+ OY W DH e n/a 27 3739 3749 3751 N
+ OY W DH s n/a 27 3739 3749 3751 N
+ OY W EH e n/a 27 3739 3749 3753 N
+ OY W EH s n/a 27 3739 3749 3753 N
+ OY W ER b n/a 27 3739 3749 3753 N
+ OY W ER e n/a 27 3739 3749 3753 N
+ OY W ER i n/a 27 3739 3749 3753 N
+ OY W ER s n/a 27 3739 3749 3753 N
+ OY W EY e n/a 27 3739 3749 3753 N
+ OY W EY s n/a 27 3739 3749 3753 N
+ OY W F e n/a 27 3739 3749 3752 N
+ OY W F s n/a 27 3739 3749 3752 N
+ OY W G e n/a 27 3739 3749 3751 N
+ OY W G s n/a 27 3739 3749 3751 N
+ OY W HH e n/a 27 3739 3749 3751 N
+ OY W HH s n/a 27 3739 3749 3751 N
+ OY W IH b n/a 27 3739 3749 3753 N
+ OY W IH e n/a 27 3739 3749 3753 N
+ OY W IH s n/a 27 3739 3749 3753 N
+ OY W IY e n/a 27 3739 3749 3753 N
+ OY W IY s n/a 27 3739 3749 3753 N
+ OY W JH e n/a 27 3739 3749 3751 N
+ OY W JH s n/a 27 3739 3749 3751 N
+ OY W K b n/a 27 3739 3749 3751 N
+ OY W K e n/a 27 3739 3749 3751 N
+ OY W K s n/a 27 3739 3749 3751 N
+ OY W L b n/a 27 3739 3749 3750 N
+ OY W L e n/a 27 3739 3749 3750 N
+ OY W L s n/a 27 3739 3749 3750 N
+ OY W M e n/a 27 3741 3749 3755 N
+ OY W M s n/a 27 3741 3749 3755 N
+ OY W N b n/a 27 3741 3749 3755 N
+ OY W N e n/a 27 3741 3749 3755 N
+ OY W N i n/a 27 3741 3749 3755 N
+ OY W N s n/a 27 3741 3749 3755 N
+ OY W NG e n/a 27 3741 3749 3755 N
+ OY W NG s n/a 27 3741 3749 3755 N
+ OY W OW b n/a 27 3739 3749 3753 N
+ OY W OW e n/a 27 3739 3749 3753 N
+ OY W OW s n/a 27 3739 3749 3753 N
+ OY W OY e n/a 27 3739 3749 3753 N
+ OY W OY s n/a 27 3739 3749 3753 N
+ OY W P e n/a 27 3739 3749 3751 N
+ OY W P s n/a 27 3739 3749 3751 N
+ OY W R b n/a 27 3739 3749 3750 N
+ OY W R e n/a 27 3739 3749 3750 N
+ OY W R s n/a 27 3739 3749 3750 N
+ OY W S b n/a 27 3739 3749 3752 N
+ OY W S e n/a 27 3739 3749 3752 N
+ OY W S s n/a 27 3739 3749 3752 N
+ OY W SH e n/a 27 3739 3749 3752 N
+ OY W SH s n/a 27 3739 3749 3752 N
+ OY W SIL e n/a 27 3739 3749 3754 N
+ OY W SIL s n/a 27 3739 3749 3754 N
+ OY W T e n/a 27 3739 3749 3751 N
+ OY W T i n/a 27 3739 3749 3751 N
+ OY W T s n/a 27 3739 3749 3751 N
+ OY W TH e n/a 27 3739 3749 3752 N
+ OY W TH s n/a 27 3739 3749 3752 N
+ OY W UH e n/a 27 3739 3749 3753 N
+ OY W UH s n/a 27 3739 3749 3753 N
+ OY W UW e n/a 27 3739 3749 3753 N
+ OY W UW s n/a 27 3739 3749 3753 N
+ OY W V e n/a 27 3739 3749 3751 N
+ OY W V s n/a 27 3739 3749 3751 N
+ OY W W e n/a 27 3739 3749 3751 N
+ OY W W s n/a 27 3739 3749 3751 N
+ OY W Y e n/a 27 3739 3749 3751 N
+ OY W Y s n/a 27 3739 3749 3751 N
+ OY W Z e n/a 27 3739 3749 3751 N
+ OY W Z i n/a 27 3739 3749 3751 N
+ OY W Z s n/a 27 3739 3749 3751 N
+ OY W ZH e n/a 27 3739 3749 3751 N
+ OY W ZH s n/a 27 3739 3749 3751 N
+ OY Y AA e n/a 27 3745 3747 3753 N
+ OY Y AA s n/a 27 3745 3747 3753 N
+ OY Y AE e n/a 27 3745 3747 3753 N
+ OY Y AE s n/a 27 3745 3747 3753 N
+ OY Y AH e n/a 27 3745 3747 3753 N
+ OY Y AH s n/a 27 3745 3747 3753 N
+ OY Y AO e n/a 27 3745 3747 3753 N
+ OY Y AO s n/a 27 3745 3747 3753 N
+ OY Y AW e n/a 27 3745 3747 3753 N
+ OY Y AW s n/a 27 3745 3747 3753 N
+ OY Y AY e n/a 27 3745 3747 3753 N
+ OY Y AY s n/a 27 3745 3747 3753 N
+ OY Y B e n/a 27 3745 3747 3751 N
+ OY Y B s n/a 27 3745 3747 3751 N
+ OY Y CH e n/a 27 3745 3747 3751 N
+ OY Y CH s n/a 27 3745 3747 3751 N
+ OY Y D e n/a 27 3745 3747 3751 N
+ OY Y D s n/a 27 3745 3747 3751 N
+ OY Y DH e n/a 27 3745 3747 3751 N
+ OY Y DH s n/a 27 3745 3747 3751 N
+ OY Y EH e n/a 27 3745 3747 3753 N
+ OY Y EH s n/a 27 3745 3747 3753 N
+ OY Y ER b n/a 27 3745 3747 3753 N
+ OY Y ER e n/a 27 3745 3747 3753 N
+ OY Y ER s n/a 27 3745 3747 3753 N
+ OY Y EY e n/a 27 3745 3747 3753 N
+ OY Y EY s n/a 27 3745 3747 3753 N
+ OY Y F e n/a 27 3745 3747 3752 N
+ OY Y F s n/a 27 3745 3747 3752 N
+ OY Y G e n/a 27 3745 3747 3751 N
+ OY Y G s n/a 27 3745 3747 3751 N
+ OY Y HH e n/a 27 3745 3747 3751 N
+ OY Y HH s n/a 27 3745 3747 3751 N
+ OY Y IH b n/a 27 3745 3747 3753 N
+ OY Y IH e n/a 27 3745 3747 3753 N
+ OY Y IH s n/a 27 3745 3747 3753 N
+ OY Y IY e n/a 27 3745 3747 3753 N
+ OY Y IY s n/a 27 3745 3747 3753 N
+ OY Y JH e n/a 27 3745 3747 3751 N
+ OY Y JH s n/a 27 3745 3747 3751 N
+ OY Y K b n/a 27 3745 3747 3751 N
+ OY Y K e n/a 27 3745 3747 3751 N
+ OY Y K s n/a 27 3745 3747 3751 N
+ OY Y L b n/a 27 3745 3748 3750 N
+ OY Y L e n/a 27 3745 3748 3750 N
+ OY Y L s n/a 27 3745 3748 3750 N
+ OY Y M e n/a 27 3745 3747 3755 N
+ OY Y M s n/a 27 3745 3747 3755 N
+ OY Y N b n/a 27 3745 3747 3755 N
+ OY Y N e n/a 27 3745 3747 3755 N
+ OY Y N i n/a 27 3745 3747 3755 N
+ OY Y N s n/a 27 3745 3747 3755 N
+ OY Y NG e n/a 27 3745 3747 3755 N
+ OY Y NG s n/a 27 3745 3747 3755 N
+ OY Y OW b n/a 27 3745 3747 3753 N
+ OY Y OW e n/a 27 3745 3747 3753 N
+ OY Y OW s n/a 27 3745 3747 3753 N
+ OY Y OY e n/a 27 3745 3747 3753 N
+ OY Y OY s n/a 27 3745 3747 3753 N
+ OY Y P e n/a 27 3745 3747 3751 N
+ OY Y P s n/a 27 3745 3747 3751 N
+ OY Y R b n/a 27 3745 3748 3750 N
+ OY Y R e n/a 27 3745 3748 3750 N
+ OY Y R s n/a 27 3745 3748 3750 N
+ OY Y S b n/a 27 3745 3747 3752 N
+ OY Y S e n/a 27 3745 3747 3752 N
+ OY Y S s n/a 27 3745 3747 3752 N
+ OY Y SH e n/a 27 3745 3747 3752 N
+ OY Y SH s n/a 27 3745 3747 3752 N
+ OY Y SIL e n/a 27 3745 3747 3754 N
+ OY Y SIL s n/a 27 3745 3747 3754 N
+ OY Y T e n/a 27 3745 3747 3751 N
+ OY Y T s n/a 27 3745 3747 3751 N
+ OY Y TH e n/a 27 3745 3747 3752 N
+ OY Y TH s n/a 27 3745 3747 3752 N
+ OY Y UH e n/a 27 3745 3747 3753 N
+ OY Y UH s n/a 27 3745 3747 3753 N
+ OY Y UW e n/a 27 3745 3747 3753 N
+ OY Y UW s n/a 27 3745 3747 3753 N
+ OY Y V e n/a 27 3745 3747 3751 N
+ OY Y V s n/a 27 3745 3747 3751 N
+ OY Y W e n/a 27 3745 3747 3751 N
+ OY Y W s n/a 27 3745 3747 3751 N
+ OY Y Y e n/a 27 3745 3747 3751 N
+ OY Y Y s n/a 27 3745 3747 3751 N
+ OY Y Z e n/a 27 3745 3747 3751 N
+ OY Y Z s n/a 27 3745 3747 3751 N
+ OY Y ZH e n/a 27 3745 3747 3751 N
+ OY Y ZH s n/a 27 3745 3747 3751 N
+ OY Z AA e n/a 27 3739 3747 3753 N
+ OY Z AA s n/a 27 3739 3747 3753 N
+ OY Z AE e n/a 27 3739 3747 3753 N
+ OY Z AE s n/a 27 3739 3747 3753 N
+ OY Z AH e n/a 27 3739 3747 3753 N
+ OY Z AH i n/a 27 3739 3747 3753 N
+ OY Z AH s n/a 27 3739 3747 3753 N
+ OY Z AO e n/a 27 3739 3747 3753 N
+ OY Z AO s n/a 27 3739 3747 3753 N
+ OY Z AW e n/a 27 3739 3747 3753 N
+ OY Z AW s n/a 27 3739 3747 3753 N
+ OY Z AY e n/a 27 3739 3747 3753 N
+ OY Z AY s n/a 27 3739 3747 3753 N
+ OY Z B e n/a 27 3739 3747 3751 N
+ OY Z B s n/a 27 3739 3747 3751 N
+ OY Z CH e n/a 27 3739 3747 3751 N
+ OY Z CH s n/a 27 3739 3747 3751 N
+ OY Z D e n/a 27 3739 3747 3751 N
+ OY Z D i n/a 27 3739 3747 3751 N
+ OY Z D s n/a 27 3739 3747 3751 N
+ OY Z DH e n/a 27 3739 3747 3751 N
+ OY Z DH s n/a 27 3739 3747 3751 N
+ OY Z EH e n/a 27 3739 3747 3753 N
+ OY Z EH s n/a 27 3739 3747 3753 N
+ OY Z ER b n/a 27 3739 3747 3753 N
+ OY Z ER e n/a 27 3739 3747 3753 N
+ OY Z ER s n/a 27 3739 3747 3753 N
+ OY Z EY e n/a 27 3739 3747 3753 N
+ OY Z EY s n/a 27 3739 3747 3753 N
+ OY Z F e n/a 27 3739 3747 3752 N
+ OY Z F s n/a 27 3739 3747 3752 N
+ OY Z G e n/a 27 3739 3747 3751 N
+ OY Z G s n/a 27 3739 3747 3751 N
+ OY Z HH e n/a 27 3739 3747 3751 N
+ OY Z HH s n/a 27 3739 3747 3751 N
+ OY Z IH b n/a 27 3739 3747 3753 N
+ OY Z IH e n/a 27 3739 3747 3753 N
+ OY Z IH s n/a 27 3739 3747 3753 N
+ OY Z IY e n/a 27 3739 3747 3753 N
+ OY Z IY s n/a 27 3739 3747 3753 N
+ OY Z JH e n/a 27 3739 3747 3751 N
+ OY Z JH s n/a 27 3739 3747 3751 N
+ OY Z K b n/a 27 3739 3747 3751 N
+ OY Z K e n/a 27 3739 3747 3751 N
+ OY Z K s n/a 27 3739 3747 3751 N
+ OY Z L b n/a 27 3739 3748 3750 N
+ OY Z L e n/a 27 3739 3748 3750 N
+ OY Z L i n/a 27 3739 3748 3750 N
+ OY Z L s n/a 27 3739 3748 3750 N
+ OY Z M e n/a 27 3741 3747 3755 N
+ OY Z M s n/a 27 3741 3747 3755 N
+ OY Z N b n/a 27 3741 3747 3755 N
+ OY Z N e n/a 27 3741 3747 3755 N
+ OY Z N i n/a 27 3741 3747 3755 N
+ OY Z N s n/a 27 3741 3747 3755 N
+ OY Z NG e n/a 27 3741 3747 3755 N
+ OY Z NG s n/a 27 3741 3747 3755 N
+ OY Z OW b n/a 27 3739 3747 3753 N
+ OY Z OW e n/a 27 3739 3747 3753 N
+ OY Z OW s n/a 27 3739 3747 3753 N
+ OY Z OY e n/a 27 3739 3747 3753 N
+ OY Z OY s n/a 27 3739 3747 3753 N
+ OY Z P e n/a 27 3739 3747 3751 N
+ OY Z P s n/a 27 3739 3747 3751 N
+ OY Z R b n/a 27 3739 3748 3750 N
+ OY Z R e n/a 27 3739 3748 3750 N
+ OY Z R s n/a 27 3739 3748 3750 N
+ OY Z S b n/a 27 3739 3747 3752 N
+ OY Z S e n/a 27 3739 3747 3752 N
+ OY Z S s n/a 27 3739 3747 3752 N
+ OY Z SH e n/a 27 3739 3747 3752 N
+ OY Z SH s n/a 27 3739 3747 3752 N
+ OY Z SIL e n/a 27 3739 3747 3754 N
+ OY Z SIL s n/a 27 3739 3747 3754 N
+ OY Z T e n/a 27 3739 3747 3751 N
+ OY Z T s n/a 27 3739 3747 3751 N
+ OY Z TH e n/a 27 3739 3747 3752 N
+ OY Z TH s n/a 27 3739 3747 3752 N
+ OY Z UH e n/a 27 3739 3747 3753 N
+ OY Z UH s n/a 27 3739 3747 3753 N
+ OY Z UW e n/a 27 3739 3747 3753 N
+ OY Z UW s n/a 27 3739 3747 3753 N
+ OY Z V e n/a 27 3739 3747 3751 N
+ OY Z V s n/a 27 3739 3747 3751 N
+ OY Z W e n/a 27 3739 3747 3751 N
+ OY Z W s n/a 27 3739 3747 3751 N
+ OY Z Y e n/a 27 3739 3747 3751 N
+ OY Z Y s n/a 27 3739 3747 3751 N
+ OY Z Z e n/a 27 3739 3747 3751 N
+ OY Z Z s n/a 27 3739 3747 3751 N
+ OY Z ZH e n/a 27 3739 3747 3751 N
+ OY Z ZH s n/a 27 3739 3747 3751 N
+ OY ZH AA s n/a 27 3739 3747 3753 N
+ OY ZH AE s n/a 27 3739 3747 3753 N
+ OY ZH AH s n/a 27 3739 3747 3753 N
+ OY ZH AO s n/a 27 3739 3747 3753 N
+ OY ZH AW s n/a 27 3739 3747 3753 N
+ OY ZH AY s n/a 27 3739 3747 3753 N
+ OY ZH B s n/a 27 3739 3747 3751 N
+ OY ZH CH s n/a 27 3739 3747 3751 N
+ OY ZH D s n/a 27 3739 3747 3751 N
+ OY ZH DH s n/a 27 3739 3747 3751 N
+ OY ZH EH s n/a 27 3739 3747 3753 N
+ OY ZH ER b n/a 27 3739 3747 3753 N
+ OY ZH ER s n/a 27 3739 3747 3753 N
+ OY ZH EY s n/a 27 3739 3747 3753 N
+ OY ZH F s n/a 27 3739 3747 3752 N
+ OY ZH G s n/a 27 3739 3747 3751 N
+ OY ZH HH s n/a 27 3739 3747 3751 N
+ OY ZH IH b n/a 27 3739 3747 3753 N
+ OY ZH IH s n/a 27 3739 3747 3753 N
+ OY ZH IY s n/a 27 3739 3747 3753 N
+ OY ZH JH s n/a 27 3739 3747 3751 N
+ OY ZH K b n/a 27 3739 3747 3751 N
+ OY ZH K s n/a 27 3739 3747 3751 N
+ OY ZH L b n/a 27 3739 3748 3750 N
+ OY ZH L s n/a 27 3739 3748 3750 N
+ OY ZH M s n/a 27 3741 3747 3755 N
+ OY ZH N b n/a 27 3741 3747 3755 N
+ OY ZH N s n/a 27 3741 3747 3755 N
+ OY ZH NG s n/a 27 3741 3747 3755 N
+ OY ZH OW b n/a 27 3739 3747 3753 N
+ OY ZH OW s n/a 27 3739 3747 3753 N
+ OY ZH OY s n/a 27 3739 3747 3753 N
+ OY ZH P s n/a 27 3739 3747 3751 N
+ OY ZH R b n/a 27 3739 3748 3750 N
+ OY ZH R s n/a 27 3739 3748 3750 N
+ OY ZH S b n/a 27 3739 3747 3752 N
+ OY ZH S s n/a 27 3739 3747 3752 N
+ OY ZH SH s n/a 27 3739 3747 3752 N
+ OY ZH SIL s n/a 27 3739 3747 3754 N
+ OY ZH T s n/a 27 3739 3747 3751 N
+ OY ZH TH s n/a 27 3739 3747 3752 N
+ OY ZH UH s n/a 27 3739 3747 3753 N
+ OY ZH UW s n/a 27 3739 3747 3753 N
+ OY ZH V s n/a 27 3739 3747 3751 N
+ OY ZH W s n/a 27 3739 3747 3751 N
+ OY ZH Y s n/a 27 3739 3747 3751 N
+ OY ZH Z s n/a 27 3739 3747 3751 N
+ OY ZH ZH s n/a 27 3739 3747 3751 N
+ P AA AA b n/a 28 3769 3813 3831 N
+ P AA AA e n/a 28 3769 3813 3832 N
+ P AA AA i n/a 28 3771 3813 3830 N
+ P AA AA s n/a 28 3769 3813 3832 N
+ P AA AE b n/a 28 3769 3815 3825 N
+ P AA AE e n/a 28 3769 3784 3829 N
+ P AA AE i n/a 28 3771 3784 3825 N
+ P AA AE s n/a 28 3769 3784 3825 N
+ P AA AH b n/a 28 3769 3816 3832 N
+ P AA AH e n/a 28 3769 3784 3848 N
+ P AA AH i n/a 28 3771 3784 3848 N
+ P AA AH s n/a 28 3769 3784 3848 N
+ P AA AO b n/a 28 3769 3812 3835 N
+ P AA AO e n/a 28 3769 3813 3834 N
+ P AA AO i n/a 28 3771 3812 3835 N
+ P AA AO s n/a 28 3769 3812 3835 N
+ P AA AW b n/a 28 3769 3815 3826 N
+ P AA AW e n/a 28 3769 3784 3829 N
+ P AA AW i n/a 28 3771 3784 3826 N
+ P AA AW s n/a 28 3769 3784 3826 N
+ P AA AY b n/a 28 3769 3813 3831 N
+ P AA AY e n/a 28 3769 3813 3832 N
+ P AA AY i n/a 28 3771 3813 3831 N
+ P AA AY s n/a 28 3769 3813 3832 N
+ P AA B b n/a 28 3770 3815 3837 N
+ P AA B e n/a 28 3770 3784 3837 N
+ P AA B i n/a 28 3771 3784 3837 N
+ P AA B s n/a 28 3770 3784 3837 N
+ P AA CH e n/a 28 3770 3784 3837 N
+ P AA CH i n/a 28 3771 3784 3837 N
+ P AA CH s n/a 28 3770 3784 3837 N
+ P AA D b n/a 28 3770 3815 3837 N
+ P AA D e n/a 28 3770 3784 3837 N
+ P AA D i n/a 28 3771 3784 3837 N
+ P AA D s n/a 28 3770 3784 3837 N
+ P AA DH e n/a 28 3770 3784 3837 N
+ P AA DH s n/a 28 3770 3784 3837 N
+ P AA EH b n/a 28 3769 3815 3828 N
+ P AA EH e n/a 28 3769 3784 3829 N
+ P AA EH i n/a 28 3771 3784 3828 N
+ P AA EH s n/a 28 3769 3784 3828 N
+ P AA ER b n/a 28 3769 3809 3851 N
+ P AA ER e n/a 28 3769 3809 3849 N
+ P AA ER i n/a 28 3771 3809 3849 N
+ P AA ER s n/a 28 3769 3809 3849 N
+ P AA EY b n/a 28 3769 3815 3827 N
+ P AA EY e n/a 28 3769 3784 3829 N
+ P AA EY i n/a 28 3771 3784 3827 N
+ P AA EY s n/a 28 3769 3784 3827 N
+ P AA F b n/a 28 3770 3815 3837 N
+ P AA F e n/a 28 3770 3784 3837 N
+ P AA F i n/a 28 3771 3784 3837 N
+ P AA F s n/a 28 3770 3784 3837 N
+ P AA G b n/a 28 3770 3815 3837 N
+ P AA G e n/a 28 3770 3784 3837 N
+ P AA G i n/a 28 3771 3784 3837 N
+ P AA G s n/a 28 3770 3784 3837 N
+ P AA HH e n/a 28 3770 3784 3837 N
+ P AA HH i n/a 28 3771 3784 3837 N
+ P AA HH s n/a 28 3770 3784 3837 N
+ P AA IH b n/a 28 3769 3817 3820 N
+ P AA IH e n/a 28 3769 3784 3822 N
+ P AA IH i n/a 28 3771 3784 3822 N
+ P AA IH s n/a 28 3769 3784 3822 N
+ P AA IY b n/a 28 3769 3817 3821 N
+ P AA IY e n/a 28 3769 3784 3823 N
+ P AA IY i n/a 28 3771 3784 3823 N
+ P AA IY s n/a 28 3769 3784 3823 N
+ P AA JH e n/a 28 3770 3784 3837 N
+ P AA JH s n/a 28 3770 3784 3837 N
+ P AA K b n/a 28 3770 3815 3837 N
+ P AA K e n/a 28 3770 3784 3837 N
+ P AA K i n/a 28 3771 3784 3837 N
+ P AA K s n/a 28 3770 3784 3837 N
+ P AA L b n/a 28 3769 3809 3844 N
+ P AA L e n/a 28 3769 3809 3844 N
+ P AA L i n/a 28 3771 3809 3844 N
+ P AA L s n/a 28 3769 3809 3844 N
+ P AA M b n/a 28 3770 3815 3837 N
+ P AA M e n/a 28 3770 3784 3837 N
+ P AA M i n/a 28 3771 3784 3837 N
+ P AA M s n/a 28 3770 3784 3837 N
+ P AA N b n/a 28 3770 3815 3837 N
+ P AA N e n/a 28 3770 3784 3837 N
+ P AA N i n/a 28 3771 3784 3837 N
+ P AA N s n/a 28 3770 3784 3837 N
+ P AA NG e n/a 28 3770 3784 3837 N
+ P AA NG s n/a 28 3770 3784 3837 N
+ P AA OW b n/a 28 3769 3812 3832 N
+ P AA OW e n/a 28 3769 3813 3832 N
+ P AA OW i n/a 28 3771 3812 3832 N
+ P AA OW s n/a 28 3769 3812 3832 N
+ P AA OY b n/a 28 3769 3812 3835 N
+ P AA OY e n/a 28 3769 3813 3834 N
+ P AA OY s n/a 28 3769 3812 3835 N
+ P AA P e n/a 28 3770 3784 3837 N
+ P AA P s n/a 28 3770 3784 3837 N
+ P AA R b n/a 28 3769 3809 3853 N
+ P AA R e n/a 28 3769 3809 3852 N
+ P AA R i n/a 28 3771 3809 3852 N
+ P AA R s n/a 28 3769 3809 3852 N
+ P AA S b n/a 28 3770 3815 3842 N
+ P AA S e n/a 28 3770 3784 3842 N
+ P AA S i n/a 28 3771 3784 3842 N
+ P AA S s n/a 28 3770 3784 3842 N
+ P AA SH b n/a 28 3770 3815 3843 N
+ P AA SH e n/a 28 3770 3784 3843 N
+ P AA SH i n/a 28 3771 3784 3843 N
+ P AA SH s n/a 28 3770 3784 3843 N
+ P AA SIL e n/a 28 3770 3784 3840 N
+ P AA SIL s n/a 28 3770 3784 3840 N
+ P AA T e n/a 28 3770 3784 3837 N
+ P AA T i n/a 28 3771 3784 3837 N
+ P AA T s n/a 28 3770 3784 3837 N
+ P AA TH e n/a 28 3770 3784 3837 N
+ P AA TH i n/a 28 3771 3784 3837 N
+ P AA TH s n/a 28 3770 3784 3837 N
+ P AA UH b n/a 28 3769 3809 3836 N
+ P AA UH e n/a 28 3769 3809 3846 N
+ P AA UH s n/a 28 3769 3809 3846 N
+ P AA UW b n/a 28 3769 3812 3835 N
+ P AA UW e n/a 28 3769 3813 3835 N
+ P AA UW i n/a 28 3771 3812 3835 N
+ P AA UW s n/a 28 3769 3812 3835 N
+ P AA V b n/a 28 3770 3815 3837 N
+ P AA V e n/a 28 3770 3784 3837 N
+ P AA V s n/a 28 3770 3784 3837 N
+ P AA W b n/a 28 3769 3809 3832 N
+ P AA W e n/a 28 3769 3809 3846 N
+ P AA W i n/a 28 3771 3809 3846 N
+ P AA W s n/a 28 3769 3809 3846 N
+ P AA Y b n/a 28 3769 3817 3821 N
+ P AA Y e n/a 28 3769 3784 3823 N
+ P AA Y i n/a 28 3771 3784 3822 N
+ P AA Y s n/a 28 3769 3784 3823 N
+ P AA Z e n/a 28 3770 3784 3837 N
+ P AA Z i n/a 28 3771 3784 3837 N
+ P AA Z s n/a 28 3770 3784 3837 N
+ P AA ZH e n/a 28 3770 3784 3837 N
+ P AA ZH i n/a 28 3771 3784 3837 N
+ P AA ZH s n/a 28 3770 3784 3837 N
+ P AE AA b n/a 28 3769 3813 3831 N
+ P AE AA e n/a 28 3769 3813 3832 N
+ P AE AA s n/a 28 3769 3813 3832 N
+ P AE AE b n/a 28 3769 3815 3825 N
+ P AE AE e n/a 28 3769 3783 3829 N
+ P AE AE s n/a 28 3769 3783 3825 N
+ P AE AH b n/a 28 3769 3816 3832 N
+ P AE AH e n/a 28 3769 3783 3847 N
+ P AE AH i n/a 28 3767 3783 3847 N
+ P AE AH s n/a 28 3769 3783 3847 N
+ P AE AO b n/a 28 3769 3812 3835 N
+ P AE AO e n/a 28 3769 3813 3834 N
+ P AE AO i n/a 28 3767 3812 3835 N
+ P AE AO s n/a 28 3769 3812 3835 N
+ P AE AW b n/a 28 3769 3815 3826 N
+ P AE AW e n/a 28 3769 3783 3829 N
+ P AE AW i n/a 28 3767 3783 3826 N
+ P AE AW s n/a 28 3769 3783 3826 N
+ P AE AY b n/a 28 3769 3813 3831 N
+ P AE AY e n/a 28 3769 3813 3832 N
+ P AE AY i n/a 28 3767 3813 3831 N
+ P AE AY s n/a 28 3769 3813 3832 N
+ P AE B b n/a 28 3767 3815 3837 N
+ P AE B e n/a 28 3767 3783 3837 N
+ P AE B i n/a 28 3767 3783 3837 N
+ P AE B s n/a 28 3767 3783 3837 N
+ P AE CH e n/a 28 3767 3782 3838 N
+ P AE CH i n/a 28 3766 3782 3838 N
+ P AE CH s n/a 28 3767 3782 3838 N
+ P AE D b n/a 28 3767 3815 3837 N
+ P AE D e n/a 28 3767 3783 3837 N
+ P AE D i n/a 28 3767 3783 3837 N
+ P AE D s n/a 28 3767 3783 3837 N
+ P AE DH e n/a 28 3767 3783 3837 N
+ P AE DH s n/a 28 3767 3783 3837 N
+ P AE EH b n/a 28 3769 3815 3828 N
+ P AE EH e n/a 28 3769 3783 3829 N
+ P AE EH i n/a 28 3767 3783 3828 N
+ P AE EH s n/a 28 3769 3783 3828 N
+ P AE ER b n/a 28 3769 3808 3851 N
+ P AE ER e n/a 28 3769 3808 3849 N
+ P AE ER i n/a 28 3767 3808 3849 N
+ P AE ER s n/a 28 3769 3808 3849 N
+ P AE EY b n/a 28 3769 3815 3827 N
+ P AE EY e n/a 28 3769 3783 3829 N
+ P AE EY i n/a 28 3767 3783 3827 N
+ P AE EY s n/a 28 3769 3783 3827 N
+ P AE F b n/a 28 3767 3815 3838 N
+ P AE F e n/a 28 3767 3782 3838 N
+ P AE F i n/a 28 3767 3782 3838 N
+ P AE F s n/a 28 3767 3782 3838 N
+ P AE G b n/a 28 3767 3815 3837 N
+ P AE G e n/a 28 3767 3783 3837 N
+ P AE G i n/a 28 3767 3783 3837 N
+ P AE G s n/a 28 3767 3783 3837 N
+ P AE HH e n/a 28 3767 3782 3838 N
+ P AE HH i n/a 28 3767 3782 3838 N
+ P AE HH s n/a 28 3767 3782 3838 N
+ P AE IH b n/a 28 3769 3817 3820 N
+ P AE IH e n/a 28 3769 3783 3822 N
+ P AE IH i n/a 28 3767 3783 3822 N
+ P AE IH s n/a 28 3769 3783 3822 N
+ P AE IY b n/a 28 3769 3817 3821 N
+ P AE IY e n/a 28 3769 3783 3823 N
+ P AE IY i n/a 28 3767 3783 3823 N
+ P AE IY s n/a 28 3769 3783 3823 N
+ P AE JH e n/a 28 3767 3783 3837 N
+ P AE JH i n/a 28 3767 3783 3837 N
+ P AE JH s n/a 28 3767 3783 3837 N
+ P AE K b n/a 28 3767 3815 3838 N
+ P AE K e n/a 28 3767 3782 3838 N
+ P AE K i n/a 28 3766 3782 3838 N
+ P AE K s n/a 28 3767 3782 3838 N
+ P AE L b n/a 28 3769 3808 3844 N
+ P AE L e n/a 28 3769 3808 3844 N
+ P AE L i n/a 28 3767 3808 3844 N
+ P AE L s n/a 28 3769 3808 3844 N
+ P AE M b n/a 28 3767 3815 3837 N
+ P AE M e n/a 28 3767 3783 3837 N
+ P AE M i n/a 28 3767 3783 3837 N
+ P AE M s n/a 28 3767 3783 3837 N
+ P AE N b n/a 28 3767 3815 3837 N
+ P AE N e n/a 28 3767 3783 3837 N
+ P AE N i n/a 28 3767 3783 3837 N
+ P AE N s n/a 28 3767 3783 3837 N
+ P AE NG e n/a 28 3767 3783 3837 N
+ P AE NG s n/a 28 3767 3783 3837 N
+ P AE OW b n/a 28 3769 3812 3832 N
+ P AE OW e n/a 28 3769 3813 3832 N
+ P AE OW i n/a 28 3767 3812 3832 N
+ P AE OW s n/a 28 3769 3812 3832 N
+ P AE OY b n/a 28 3769 3812 3835 N
+ P AE OY e n/a 28 3769 3813 3834 N
+ P AE OY s n/a 28 3769 3812 3835 N
+ P AE P e n/a 28 3767 3782 3838 N
+ P AE P s n/a 28 3767 3782 3838 N
+ P AE R b n/a 28 3769 3808 3853 N
+ P AE R e n/a 28 3769 3808 3852 N
+ P AE R i n/a 28 3767 3808 3852 N
+ P AE R s n/a 28 3769 3808 3852 N
+ P AE S b n/a 28 3767 3815 3842 N
+ P AE S e n/a 28 3767 3782 3842 N
+ P AE S i n/a 28 3767 3782 3842 N
+ P AE S s n/a 28 3767 3782 3842 N
+ P AE SH b n/a 28 3767 3815 3843 N
+ P AE SH e n/a 28 3767 3782 3843 N
+ P AE SH i n/a 28 3767 3782 3843 N
+ P AE SH s n/a 28 3767 3782 3843 N
+ P AE SIL e n/a 28 3767 3787 3840 N
+ P AE SIL s n/a 28 3767 3787 3840 N
+ P AE T e n/a 28 3767 3782 3838 N
+ P AE T i n/a 28 3766 3782 3838 N
+ P AE T s n/a 28 3767 3782 3838 N
+ P AE TH e n/a 28 3767 3782 3838 N
+ P AE TH i n/a 28 3767 3782 3838 N
+ P AE TH s n/a 28 3767 3782 3838 N
+ P AE UH b n/a 28 3769 3808 3836 N
+ P AE UH e n/a 28 3769 3808 3846 N
+ P AE UH i n/a 28 3767 3808 3846 N
+ P AE UH s n/a 28 3769 3808 3846 N
+ P AE UW b n/a 28 3769 3812 3835 N
+ P AE UW e n/a 28 3769 3813 3835 N
+ P AE UW i n/a 28 3767 3812 3835 N
+ P AE UW s n/a 28 3769 3812 3835 N
+ P AE V b n/a 28 3767 3815 3837 N
+ P AE V e n/a 28 3767 3783 3837 N
+ P AE V s n/a 28 3767 3783 3837 N
+ P AE W b n/a 28 3769 3809 3832 N
+ P AE W e n/a 28 3769 3809 3846 N
+ P AE W i n/a 28 3767 3809 3846 N
+ P AE W s n/a 28 3769 3809 3846 N
+ P AE Y b n/a 28 3769 3817 3821 N
+ P AE Y e n/a 28 3769 3783 3823 N
+ P AE Y i n/a 28 3767 3783 3822 N
+ P AE Y s n/a 28 3769 3783 3823 N
+ P AE Z e n/a 28 3767 3783 3837 N
+ P AE Z s n/a 28 3767 3783 3837 N
+ P AE ZH e n/a 28 3767 3783 3837 N
+ P AE ZH s n/a 28 3767 3783 3837 N
+ P AH AA b n/a 28 3761 3813 3831 N
+ P AH AA e n/a 28 3769 3813 3832 N
+ P AH AA i n/a 28 3762 3813 3830 N
+ P AH AA s n/a 28 3761 3813 3832 N
+ P AH AE b n/a 28 3760 3815 3825 N
+ P AH AE e n/a 28 3769 3790 3829 N
+ P AH AE i n/a 28 3760 3789 3825 N
+ P AH AE s n/a 28 3760 3790 3825 N
+ P AH AH b n/a 28 3761 3816 3832 N
+ P AH AH e n/a 28 3769 3790 3848 N
+ P AH AH i n/a 28 3763 3791 3846 N
+ P AH AH s n/a 28 3761 3790 3848 N
+ P AH AO b n/a 28 3761 3812 3835 N
+ P AH AO e n/a 28 3769 3813 3834 N
+ P AH AO i n/a 28 3762 3812 3835 N
+ P AH AO s n/a 28 3761 3812 3835 N
+ P AH AW b n/a 28 3760 3815 3826 N
+ P AH AW e n/a 28 3769 3790 3829 N
+ P AH AW i n/a 28 3762 3789 3826 N
+ P AH AW s n/a 28 3760 3790 3826 N
+ P AH AY b n/a 28 3761 3813 3831 N
+ P AH AY e n/a 28 3769 3813 3832 N
+ P AH AY i n/a 28 3760 3813 3831 N
+ P AH AY s n/a 28 3761 3813 3832 N
+ P AH B b n/a 28 3760 3815 3837 N
+ P AH B e n/a 28 3769 3785 3837 N
+ P AH B i n/a 28 3763 3785 3837 N
+ P AH B s n/a 28 3760 3785 3837 N
+ P AH CH e n/a 28 3769 3785 3837 N
+ P AH CH i n/a 28 3763 3785 3837 N
+ P AH CH s n/a 28 3760 3785 3837 N
+ P AH D b n/a 28 3760 3815 3837 N
+ P AH D e n/a 28 3769 3785 3837 N
+ P AH D i n/a 28 3763 3785 3837 N
+ P AH D s n/a 28 3760 3785 3837 N
+ P AH DH e n/a 28 3770 3785 3837 N
+ P AH DH s n/a 28 3760 3785 3837 N
+ P AH EH b n/a 28 3760 3815 3828 N
+ P AH EH e n/a 28 3769 3790 3829 N
+ P AH EH i n/a 28 3760 3789 3828 N
+ P AH EH s n/a 28 3760 3790 3828 N
+ P AH ER b n/a 28 3761 3811 3851 N
+ P AH ER e n/a 28 3769 3810 3849 N
+ P AH ER i n/a 28 3763 3810 3849 N
+ P AH ER s n/a 28 3761 3810 3849 N
+ P AH EY b n/a 28 3760 3815 3827 N
+ P AH EY e n/a 28 3769 3790 3829 N
+ P AH EY i n/a 28 3760 3789 3827 N
+ P AH EY s n/a 28 3760 3790 3827 N
+ P AH F b n/a 28 3760 3815 3837 N
+ P AH F e n/a 28 3769 3785 3837 N
+ P AH F i n/a 28 3763 3785 3837 N
+ P AH F s n/a 28 3760 3785 3837 N
+ P AH G b n/a 28 3760 3815 3837 N
+ P AH G e n/a 28 3769 3785 3837 N
+ P AH G i n/a 28 3763 3785 3837 N
+ P AH G s n/a 28 3760 3785 3837 N
+ P AH HH e n/a 28 3769 3785 3839 N
+ P AH HH i n/a 28 3763 3785 3839 N
+ P AH HH s n/a 28 3760 3785 3839 N
+ P AH IH b n/a 28 3760 3817 3820 N
+ P AH IH e n/a 28 3769 3790 3822 N
+ P AH IH i n/a 28 3760 3788 3820 N
+ P AH IH s n/a 28 3760 3790 3822 N
+ P AH IY b n/a 28 3760 3817 3821 N
+ P AH IY e n/a 28 3769 3790 3823 N
+ P AH IY i n/a 28 3760 3788 3821 N
+ P AH IY s n/a 28 3760 3790 3823 N
+ P AH JH e n/a 28 3769 3785 3837 N
+ P AH JH i n/a 28 3763 3785 3837 N
+ P AH JH s n/a 28 3760 3785 3837 N
+ P AH K b n/a 28 3760 3815 3837 N
+ P AH K e n/a 28 3770 3785 3837 N
+ P AH K i n/a 28 3763 3785 3837 N
+ P AH K s n/a 28 3760 3785 3837 N
+ P AH L b n/a 28 3761 3810 3844 N
+ P AH L e n/a 28 3769 3810 3844 N
+ P AH L i n/a 28 3762 3810 3844 N
+ P AH L s n/a 28 3761 3810 3844 N
+ P AH M b n/a 28 3760 3815 3839 N
+ P AH M e n/a 28 3769 3785 3839 N
+ P AH M i n/a 28 3763 3785 3839 N
+ P AH M s n/a 28 3760 3785 3839 N
+ P AH N b n/a 28 3760 3815 3839 N
+ P AH N e n/a 28 3769 3785 3839 N
+ P AH N i n/a 28 3763 3785 3839 N
+ P AH N s n/a 28 3760 3785 3839 N
+ P AH NG e n/a 28 3769 3785 3839 N
+ P AH NG s n/a 28 3760 3785 3839 N
+ P AH OW b n/a 28 3761 3812 3832 N
+ P AH OW e n/a 28 3769 3813 3832 N
+ P AH OW i n/a 28 3762 3812 3832 N
+ P AH OW s n/a 28 3761 3812 3832 N
+ P AH OY b n/a 28 3761 3812 3835 N
+ P AH OY e n/a 28 3769 3813 3834 N
+ P AH OY i n/a 28 3761 3812 3835 N
+ P AH OY s n/a 28 3761 3812 3835 N
+ P AH P e n/a 28 3770 3785 3837 N
+ P AH P s n/a 28 3760 3785 3837 N
+ P AH R b n/a 28 3761 3811 3853 N
+ P AH R e n/a 28 3769 3811 3853 N
+ P AH R i n/a 28 3762 3811 3853 N
+ P AH R s n/a 28 3761 3811 3853 N
+ P AH S b n/a 28 3760 3815 3842 N
+ P AH S e n/a 28 3769 3785 3842 N
+ P AH S i n/a 28 3763 3785 3842 N
+ P AH S s n/a 28 3760 3785 3842 N
+ P AH SH b n/a 28 3760 3815 3843 N
+ P AH SH e n/a 28 3769 3785 3843 N
+ P AH SH i n/a 28 3763 3785 3843 N
+ P AH SH s n/a 28 3760 3785 3843 N
+ P AH SIL e n/a 28 3770 3787 3840 N
+ P AH SIL s n/a 28 3760 3787 3840 N
+ P AH T e n/a 28 3770 3785 3837 N
+ P AH T i n/a 28 3763 3785 3837 N
+ P AH T s n/a 28 3760 3785 3837 N
+ P AH TH e n/a 28 3770 3785 3837 N
+ P AH TH s n/a 28 3760 3785 3837 N
+ P AH UH b n/a 28 3761 3811 3836 N
+ P AH UH e n/a 28 3769 3811 3846 N
+ P AH UH i n/a 28 3761 3811 3846 N
+ P AH UH s n/a 28 3761 3811 3846 N
+ P AH UW b n/a 28 3761 3812 3835 N
+ P AH UW e n/a 28 3769 3813 3835 N
+ P AH UW i n/a 28 3761 3812 3835 N
+ P AH UW s n/a 28 3761 3812 3835 N
+ P AH V b n/a 28 3760 3815 3837 N
+ P AH V e n/a 28 3769 3785 3837 N
+ P AH V i n/a 28 3763 3785 3837 N
+ P AH V s n/a 28 3760 3785 3837 N
+ P AH W b n/a 28 3761 3809 3832 N
+ P AH W e n/a 28 3769 3809 3846 N
+ P AH W i n/a 28 3763 3809 3846 N
+ P AH W s n/a 28 3761 3809 3846 N
+ P AH Y b n/a 28 3760 3817 3821 N
+ P AH Y e n/a 28 3769 3790 3823 N
+ P AH Y i n/a 28 3760 3788 3821 N
+ P AH Y s n/a 28 3760 3790 3823 N
+ P AH Z e n/a 28 3769 3785 3837 N
+ P AH Z i n/a 28 3763 3785 3837 N
+ P AH Z s n/a 28 3760 3785 3837 N
+ P AH ZH e n/a 28 3769 3785 3837 N
+ P AH ZH s n/a 28 3760 3785 3837 N
+ P AO AA b n/a 28 3769 3813 3831 N
+ P AO AA e n/a 28 3769 3813 3832 N
+ P AO AA s n/a 28 3769 3813 3832 N
+ P AO AE b n/a 28 3769 3815 3825 N
+ P AO AE e n/a 28 3769 3784 3829 N
+ P AO AE i n/a 28 3771 3784 3825 N
+ P AO AE s n/a 28 3769 3784 3825 N
+ P AO AH b n/a 28 3769 3816 3832 N
+ P AO AH e n/a 28 3769 3784 3848 N
+ P AO AH i n/a 28 3771 3784 3848 N
+ P AO AH s n/a 28 3769 3784 3848 N
+ P AO AO b n/a 28 3769 3812 3835 N
+ P AO AO e n/a 28 3769 3813 3834 N
+ P AO AO i n/a 28 3771 3812 3835 N
+ P AO AO s n/a 28 3769 3812 3835 N
+ P AO AW b n/a 28 3769 3815 3826 N
+ P AO AW e n/a 28 3769 3784 3829 N
+ P AO AW s n/a 28 3769 3784 3826 N
+ P AO AY b n/a 28 3769 3813 3831 N
+ P AO AY e n/a 28 3769 3813 3832 N
+ P AO AY i n/a 28 3771 3813 3831 N
+ P AO AY s n/a 28 3769 3813 3832 N
+ P AO B b n/a 28 3770 3815 3837 N
+ P AO B e n/a 28 3770 3784 3837 N
+ P AO B s n/a 28 3770 3784 3837 N
+ P AO CH e n/a 28 3770 3784 3837 N
+ P AO CH s n/a 28 3770 3784 3837 N
+ P AO D b n/a 28 3770 3815 3837 N
+ P AO D e n/a 28 3770 3784 3837 N
+ P AO D s n/a 28 3770 3784 3837 N
+ P AO DH e n/a 28 3770 3784 3837 N
+ P AO DH s n/a 28 3770 3784 3837 N
+ P AO EH b n/a 28 3769 3815 3828 N
+ P AO EH e n/a 28 3769 3784 3829 N
+ P AO EH i n/a 28 3771 3784 3828 N
+ P AO EH s n/a 28 3769 3784 3828 N
+ P AO ER b n/a 28 3769 3809 3851 N
+ P AO ER e n/a 28 3769 3809 3849 N
+ P AO ER i n/a 28 3771 3809 3849 N
+ P AO ER s n/a 28 3769 3809 3849 N
+ P AO EY b n/a 28 3769 3815 3827 N
+ P AO EY e n/a 28 3769 3784 3829 N
+ P AO EY s n/a 28 3769 3784 3827 N
+ P AO F b n/a 28 3770 3815 3837 N
+ P AO F e n/a 28 3770 3784 3837 N
+ P AO F i n/a 28 3771 3784 3837 N
+ P AO F s n/a 28 3770 3784 3837 N
+ P AO G b n/a 28 3770 3815 3837 N
+ P AO G e n/a 28 3770 3784 3837 N
+ P AO G s n/a 28 3770 3784 3837 N
+ P AO HH e n/a 28 3770 3784 3837 N
+ P AO HH s n/a 28 3770 3784 3837 N
+ P AO IH b n/a 28 3769 3817 3820 N
+ P AO IH e n/a 28 3769 3784 3822 N
+ P AO IH i n/a 28 3771 3784 3822 N
+ P AO IH s n/a 28 3769 3784 3822 N
+ P AO IY b n/a 28 3769 3817 3821 N
+ P AO IY e n/a 28 3769 3784 3823 N
+ P AO IY i n/a 28 3771 3784 3823 N
+ P AO IY s n/a 28 3769 3784 3823 N
+ P AO JH e n/a 28 3770 3784 3837 N
+ P AO JH s n/a 28 3770 3784 3837 N
+ P AO K b n/a 28 3770 3815 3837 N
+ P AO K e n/a 28 3770 3784 3837 N
+ P AO K i n/a 28 3771 3784 3837 N
+ P AO K s n/a 28 3770 3784 3837 N
+ P AO L b n/a 28 3769 3809 3844 N
+ P AO L e n/a 28 3769 3809 3844 N
+ P AO L i n/a 28 3771 3809 3844 N
+ P AO L s n/a 28 3769 3809 3844 N
+ P AO M b n/a 28 3770 3815 3837 N
+ P AO M e n/a 28 3770 3784 3837 N
+ P AO M s n/a 28 3770 3784 3837 N
+ P AO N b n/a 28 3770 3815 3837 N
+ P AO N e n/a 28 3770 3784 3837 N
+ P AO N s n/a 28 3770 3784 3837 N
+ P AO NG e n/a 28 3770 3784 3837 N
+ P AO NG s n/a 28 3770 3784 3837 N
+ P AO OW b n/a 28 3769 3812 3832 N
+ P AO OW e n/a 28 3769 3813 3832 N
+ P AO OW s n/a 28 3769 3812 3832 N
+ P AO OY b n/a 28 3769 3812 3835 N
+ P AO OY e n/a 28 3769 3813 3834 N
+ P AO OY s n/a 28 3769 3812 3835 N
+ P AO P e n/a 28 3770 3784 3837 N
+ P AO P s n/a 28 3770 3784 3837 N
+ P AO R b n/a 28 3769 3809 3853 N
+ P AO R e n/a 28 3769 3809 3852 N
+ P AO R i n/a 28 3771 3809 3852 N
+ P AO R s n/a 28 3769 3809 3852 N
+ P AO S b n/a 28 3770 3815 3842 N
+ P AO S e n/a 28 3770 3784 3842 N
+ P AO S i n/a 28 3771 3784 3842 N
+ P AO S s n/a 28 3770 3784 3842 N
+ P AO SH b n/a 28 3770 3815 3843 N
+ P AO SH e n/a 28 3770 3784 3843 N
+ P AO SH i n/a 28 3771 3784 3843 N
+ P AO SH s n/a 28 3770 3784 3843 N
+ P AO SIL e n/a 28 3770 3784 3840 N
+ P AO SIL s n/a 28 3770 3784 3840 N
+ P AO T e n/a 28 3770 3784 3837 N
+ P AO T i n/a 28 3771 3784 3837 N
+ P AO T s n/a 28 3770 3784 3837 N
+ P AO TH e n/a 28 3770 3784 3837 N
+ P AO TH s n/a 28 3770 3784 3837 N
+ P AO UH b n/a 28 3769 3809 3836 N
+ P AO UH e n/a 28 3769 3809 3846 N
+ P AO UH s n/a 28 3769 3809 3846 N
+ P AO UW b n/a 28 3769 3812 3835 N
+ P AO UW e n/a 28 3769 3813 3835 N
+ P AO UW i n/a 28 3771 3812 3835 N
+ P AO UW s n/a 28 3769 3812 3835 N
+ P AO V b n/a 28 3770 3815 3837 N
+ P AO V e n/a 28 3770 3784 3837 N
+ P AO V s n/a 28 3770 3784 3837 N
+ P AO W b n/a 28 3769 3809 3832 N
+ P AO W e n/a 28 3769 3809 3846 N
+ P AO W s n/a 28 3769 3809 3846 N
+ P AO Y b n/a 28 3769 3817 3821 N
+ P AO Y e n/a 28 3769 3784 3823 N
+ P AO Y i n/a 28 3771 3784 3822 N
+ P AO Y s n/a 28 3769 3784 3823 N
+ P AO Z e n/a 28 3770 3784 3837 N
+ P AO Z s n/a 28 3770 3784 3837 N
+ P AO ZH e n/a 28 3770 3784 3837 N
+ P AO ZH s n/a 28 3770 3784 3837 N
+ P AW AA b n/a 28 3769 3813 3831 N
+ P AW AA s n/a 28 3769 3813 3832 N
+ P AW AE b n/a 28 3769 3815 3825 N
+ P AW AE s n/a 28 3769 3784 3825 N
+ P AW AH b n/a 28 3769 3816 3832 N
+ P AW AH i n/a 28 3771 3784 3848 N
+ P AW AH s n/a 28 3769 3784 3848 N
+ P AW AO b n/a 28 3769 3812 3835 N
+ P AW AO i n/a 28 3771 3812 3835 N
+ P AW AO s n/a 28 3769 3812 3835 N
+ P AW AW b n/a 28 3769 3815 3826 N
+ P AW AW s n/a 28 3769 3784 3826 N
+ P AW AY b n/a 28 3769 3813 3831 N
+ P AW AY s n/a 28 3769 3813 3832 N
+ P AW B b n/a 28 3770 3815 3837 N
+ P AW B s n/a 28 3770 3784 3837 N
+ P AW CH s n/a 28 3770 3784 3837 N
+ P AW D b n/a 28 3770 3815 3837 N
+ P AW D s n/a 28 3770 3784 3837 N
+ P AW DH s n/a 28 3770 3784 3837 N
+ P AW EH b n/a 28 3769 3815 3828 N
+ P AW EH i n/a 28 3771 3784 3828 N
+ P AW EH s n/a 28 3769 3784 3828 N
+ P AW ER b n/a 28 3769 3811 3851 N
+ P AW ER i n/a 28 3771 3811 3850 N
+ P AW ER s n/a 28 3769 3811 3850 N
+ P AW EY b n/a 28 3769 3815 3827 N
+ P AW EY s n/a 28 3769 3784 3827 N
+ P AW F b n/a 28 3770 3815 3837 N
+ P AW F s n/a 28 3770 3784 3837 N
+ P AW G b n/a 28 3770 3815 3837 N
+ P AW G s n/a 28 3770 3784 3837 N
+ P AW HH s n/a 28 3770 3784 3837 N
+ P AW IH b n/a 28 3769 3817 3820 N
+ P AW IH i n/a 28 3771 3784 3822 N
+ P AW IH s n/a 28 3769 3784 3822 N
+ P AW IY b n/a 28 3769 3817 3821 N
+ P AW IY s n/a 28 3769 3784 3823 N
+ P AW JH s n/a 28 3770 3784 3837 N
+ P AW K b n/a 28 3770 3815 3837 N
+ P AW K s n/a 28 3770 3784 3837 N
+ P AW L b n/a 28 3769 3810 3844 N
+ P AW L s n/a 28 3769 3810 3844 N
+ P AW M b n/a 28 3770 3815 3837 N
+ P AW M s n/a 28 3770 3784 3837 N
+ P AW N b n/a 28 3770 3815 3837 N
+ P AW N s n/a 28 3770 3784 3837 N
+ P AW NG s n/a 28 3770 3784 3837 N
+ P AW OW b n/a 28 3769 3812 3832 N
+ P AW OW s n/a 28 3769 3812 3832 N
+ P AW OY b n/a 28 3769 3812 3835 N
+ P AW OY s n/a 28 3769 3812 3835 N
+ P AW P s n/a 28 3770 3784 3837 N
+ P AW R b n/a 28 3769 3811 3853 N
+ P AW R s n/a 28 3769 3811 3853 N
+ P AW S b n/a 28 3770 3815 3842 N
+ P AW S s n/a 28 3770 3784 3842 N
+ P AW SH b n/a 28 3770 3815 3843 N
+ P AW SH s n/a 28 3770 3784 3843 N
+ P AW SIL s n/a 28 3770 3784 3840 N
+ P AW T i n/a 28 3771 3784 3837 N
+ P AW T s n/a 28 3770 3784 3837 N
+ P AW TH s n/a 28 3770 3784 3837 N
+ P AW UH b n/a 28 3769 3811 3836 N
+ P AW UH s n/a 28 3769 3811 3846 N
+ P AW UW b n/a 28 3769 3812 3835 N
+ P AW UW s n/a 28 3769 3812 3835 N
+ P AW V b n/a 28 3770 3815 3837 N
+ P AW V s n/a 28 3770 3784 3837 N
+ P AW W b n/a 28 3769 3809 3832 N
+ P AW W s n/a 28 3769 3809 3846 N
+ P AW Y b n/a 28 3769 3817 3821 N
+ P AW Y s n/a 28 3769 3784 3823 N
+ P AW Z s n/a 28 3770 3784 3837 N
+ P AW ZH s n/a 28 3770 3784 3837 N
+ P AY AA b n/a 28 3774 3813 3831 N
+ P AY AA e n/a 28 3774 3813 3832 N
+ P AY AA i n/a 28 3774 3813 3830 N
+ P AY AA s n/a 28 3774 3813 3832 N
+ P AY AE b n/a 28 3774 3815 3825 N
+ P AY AE e n/a 28 3774 3783 3829 N
+ P AY AE i n/a 28 3774 3783 3825 N
+ P AY AE s n/a 28 3774 3783 3825 N
+ P AY AH b n/a 28 3774 3816 3832 N
+ P AY AH e n/a 28 3774 3783 3847 N
+ P AY AH i n/a 28 3774 3783 3845 N
+ P AY AH s n/a 28 3774 3783 3847 N
+ P AY AO b n/a 28 3774 3812 3835 N
+ P AY AO e n/a 28 3774 3813 3834 N
+ P AY AO i n/a 28 3774 3812 3835 N
+ P AY AO s n/a 28 3774 3812 3835 N
+ P AY AW b n/a 28 3774 3815 3826 N
+ P AY AW e n/a 28 3774 3783 3829 N
+ P AY AW i n/a 28 3774 3783 3826 N
+ P AY AW s n/a 28 3774 3783 3826 N
+ P AY AY b n/a 28 3774 3813 3831 N
+ P AY AY e n/a 28 3774 3813 3832 N
+ P AY AY s n/a 28 3774 3813 3832 N
+ P AY B b n/a 28 3774 3815 3839 N
+ P AY B e n/a 28 3774 3786 3839 N
+ P AY B s n/a 28 3774 3786 3839 N
+ P AY CH e n/a 28 3774 3786 3839 N
+ P AY CH s n/a 28 3774 3786 3839 N
+ P AY D b n/a 28 3774 3815 3839 N
+ P AY D e n/a 28 3774 3786 3839 N
+ P AY D s n/a 28 3774 3786 3839 N
+ P AY DH e n/a 28 3774 3786 3839 N
+ P AY DH s n/a 28 3774 3786 3839 N
+ P AY EH b n/a 28 3774 3815 3828 N
+ P AY EH e n/a 28 3774 3783 3829 N
+ P AY EH i n/a 28 3774 3783 3828 N
+ P AY EH s n/a 28 3774 3783 3828 N
+ P AY ER b n/a 28 3774 3808 3851 N
+ P AY ER e n/a 28 3774 3808 3850 N
+ P AY ER i n/a 28 3774 3808 3850 N
+ P AY ER s n/a 28 3774 3808 3850 N
+ P AY EY b n/a 28 3774 3815 3827 N
+ P AY EY e n/a 28 3774 3783 3829 N
+ P AY EY i n/a 28 3774 3783 3827 N
+ P AY EY s n/a 28 3774 3783 3827 N
+ P AY F b n/a 28 3774 3815 3839 N
+ P AY F e n/a 28 3774 3786 3839 N
+ P AY F i n/a 28 3774 3786 3839 N
+ P AY F s n/a 28 3774 3786 3839 N
+ P AY G b n/a 28 3774 3815 3839 N
+ P AY G e n/a 28 3774 3786 3839 N
+ P AY G s n/a 28 3774 3786 3839 N
+ P AY HH e n/a 28 3774 3786 3839 N
+ P AY HH i n/a 28 3774 3786 3839 N
+ P AY HH s n/a 28 3774 3786 3839 N
+ P AY IH b n/a 28 3774 3817 3820 N
+ P AY IH e n/a 28 3774 3783 3822 N
+ P AY IH i n/a 28 3774 3783 3822 N
+ P AY IH s n/a 28 3774 3783 3822 N
+ P AY IY b n/a 28 3774 3817 3821 N
+ P AY IY e n/a 28 3774 3783 3823 N
+ P AY IY i n/a 28 3774 3783 3823 N
+ P AY IY s n/a 28 3774 3783 3823 N
+ P AY JH e n/a 28 3774 3786 3839 N
+ P AY JH s n/a 28 3774 3786 3839 N
+ P AY K b n/a 28 3774 3815 3839 N
+ P AY K e n/a 28 3774 3786 3839 N
+ P AY K i n/a 28 3774 3786 3839 N
+ P AY K s n/a 28 3774 3786 3839 N
+ P AY L b n/a 28 3774 3810 3844 N
+ P AY L e n/a 28 3774 3810 3844 N
+ P AY L i n/a 28 3774 3810 3844 N
+ P AY L s n/a 28 3774 3810 3844 N
+ P AY M b n/a 28 3774 3815 3839 N
+ P AY M e n/a 28 3774 3786 3839 N
+ P AY M s n/a 28 3774 3786 3839 N
+ P AY N b n/a 28 3774 3815 3839 N
+ P AY N e n/a 28 3774 3786 3839 N
+ P AY N i n/a 28 3774 3786 3839 N
+ P AY N s n/a 28 3774 3786 3839 N
+ P AY NG e n/a 28 3774 3786 3839 N
+ P AY NG s n/a 28 3774 3786 3839 N
+ P AY OW b n/a 28 3774 3812 3832 N
+ P AY OW e n/a 28 3774 3813 3832 N
+ P AY OW i n/a 28 3774 3812 3832 N
+ P AY OW s n/a 28 3774 3812 3832 N
+ P AY OY b n/a 28 3774 3812 3835 N
+ P AY OY e n/a 28 3774 3813 3834 N
+ P AY OY i n/a 28 3774 3812 3835 N
+ P AY OY s n/a 28 3774 3812 3835 N
+ P AY P e n/a 28 3774 3786 3839 N
+ P AY P i n/a 28 3774 3786 3839 N
+ P AY P s n/a 28 3774 3786 3839 N
+ P AY R b n/a 28 3774 3808 3853 N
+ P AY R e n/a 28 3774 3808 3853 N
+ P AY R i n/a 28 3774 3808 3853 N
+ P AY R s n/a 28 3774 3808 3853 N
+ P AY S b n/a 28 3774 3815 3842 N
+ P AY S e n/a 28 3774 3786 3842 N
+ P AY S i n/a 28 3774 3786 3842 N
+ P AY S s n/a 28 3774 3786 3842 N
+ P AY SH b n/a 28 3774 3815 3843 N
+ P AY SH e n/a 28 3774 3786 3843 N
+ P AY SH s n/a 28 3774 3786 3843 N
+ P AY SIL e n/a 28 3774 3786 3840 N
+ P AY SIL s n/a 28 3774 3786 3840 N
+ P AY T e n/a 28 3774 3786 3839 N
+ P AY T i n/a 28 3774 3786 3839 N
+ P AY T s n/a 28 3774 3786 3839 N
+ P AY TH e n/a 28 3774 3786 3839 N
+ P AY TH s n/a 28 3774 3786 3839 N
+ P AY UH b n/a 28 3774 3808 3836 N
+ P AY UH e n/a 28 3774 3808 3846 N
+ P AY UH s n/a 28 3774 3808 3846 N
+ P AY UW b n/a 28 3774 3812 3835 N
+ P AY UW e n/a 28 3774 3813 3835 N
+ P AY UW i n/a 28 3774 3812 3835 N
+ P AY UW s n/a 28 3774 3812 3835 N
+ P AY V b n/a 28 3774 3815 3839 N
+ P AY V e n/a 28 3774 3786 3839 N
+ P AY V s n/a 28 3774 3786 3839 N
+ P AY W b n/a 28 3774 3809 3832 N
+ P AY W e n/a 28 3774 3809 3846 N
+ P AY W s n/a 28 3774 3809 3846 N
+ P AY Y b n/a 28 3774 3817 3821 N
+ P AY Y e n/a 28 3774 3783 3823 N
+ P AY Y s n/a 28 3774 3783 3823 N
+ P AY Z e n/a 28 3774 3786 3839 N
+ P AY Z i n/a 28 3774 3786 3839 N
+ P AY Z s n/a 28 3774 3786 3839 N
+ P AY ZH e n/a 28 3774 3786 3839 N
+ P AY ZH s n/a 28 3774 3786 3839 N
+ P B AA b n/a 28 3779 3798 3831 N
+ P B AA i n/a 28 3779 3798 3831 N
+ P B AA s n/a 28 3779 3798 3832 N
+ P B AE b n/a 28 3779 3814 3825 N
+ P B AE s n/a 28 3779 3790 3825 N
+ P B AH b n/a 28 3779 3816 3832 N
+ P B AH i n/a 28 3779 3790 3848 N
+ P B AH s n/a 28 3779 3790 3848 N
+ P B AO b n/a 28 3779 3799 3835 N
+ P B AO s n/a 28 3779 3799 3835 N
+ P B AW b n/a 28 3779 3814 3826 N
+ P B AW s n/a 28 3779 3790 3826 N
+ P B AY b n/a 28 3779 3798 3831 N
+ P B AY s n/a 28 3779 3798 3832 N
+ P B B b n/a 28 3779 3814 3839 N
+ P B B s n/a 28 3779 3786 3839 N
+ P B CH s n/a 28 3779 3786 3839 N
+ P B D b n/a 28 3779 3814 3839 N
+ P B D s n/a 28 3779 3786 3839 N
+ P B DH s n/a 28 3779 3786 3839 N
+ P B EH b n/a 28 3779 3814 3828 N
+ P B EH s n/a 28 3779 3790 3828 N
+ P B ER b n/a 28 3779 3801 3851 N
+ P B ER s n/a 28 3779 3801 3849 N
+ P B EY b n/a 28 3779 3814 3827 N
+ P B EY i n/a 28 3779 3789 3827 N
+ P B EY s n/a 28 3779 3790 3827 N
+ P B F b n/a 28 3779 3814 3839 N
+ P B F s n/a 28 3779 3786 3839 N
+ P B G b n/a 28 3779 3814 3839 N
+ P B G s n/a 28 3779 3786 3839 N
+ P B HH s n/a 28 3779 3786 3839 N
+ P B IH b n/a 28 3780 3817 3820 N
+ P B IH i n/a 28 3780 3788 3820 N
+ P B IH s n/a 28 3780 3790 3822 N
+ P B IY b n/a 28 3779 3817 3821 N
+ P B IY i n/a 28 3779 3788 3821 N
+ P B IY s n/a 28 3779 3790 3823 N
+ P B JH s n/a 28 3779 3786 3839 N
+ P B K b n/a 28 3779 3814 3839 N
+ P B K s n/a 28 3779 3786 3839 N
+ P B L b n/a 28 3779 3800 3844 N
+ P B L i n/a 28 3779 3800 3844 N
+ P B L s n/a 28 3779 3800 3844 N
+ P B M b n/a 28 3779 3814 3839 N
+ P B M s n/a 28 3779 3786 3839 N
+ P B N b n/a 28 3779 3814 3839 N
+ P B N s n/a 28 3779 3786 3839 N
+ P B NG s n/a 28 3779 3786 3839 N
+ P B OW b n/a 28 3779 3799 3832 N
+ P B OW i n/a 28 3779 3799 3832 N
+ P B OW s n/a 28 3779 3799 3832 N
+ P B OY b n/a 28 3779 3799 3835 N
+ P B OY s n/a 28 3779 3799 3835 N
+ P B P s n/a 28 3779 3786 3839 N
+ P B R b n/a 28 3779 3801 3853 N
+ P B R i n/a 28 3779 3801 3853 N
+ P B R s n/a 28 3779 3801 3853 N
+ P B S b n/a 28 3779 3814 3842 N
+ P B S i n/a 28 3779 3786 3842 N
+ P B S s n/a 28 3779 3786 3842 N
+ P B SH b n/a 28 3779 3814 3843 N
+ P B SH s n/a 28 3779 3786 3843 N
+ P B SIL s n/a 28 3779 3787 3840 N
+ P B T s n/a 28 3779 3786 3839 N
+ P B TH s n/a 28 3779 3786 3839 N
+ P B UH b n/a 28 3779 3799 3836 N
+ P B UH s n/a 28 3779 3799 3846 N
+ P B UW b n/a 28 3779 3799 3835 N
+ P B UW s n/a 28 3779 3799 3835 N
+ P B V b n/a 28 3779 3814 3839 N
+ P B V s n/a 28 3779 3786 3839 N
+ P B W b n/a 28 3779 3800 3832 N
+ P B W s n/a 28 3779 3800 3846 N
+ P B Y b n/a 28 3779 3817 3821 N
+ P B Y s n/a 28 3779 3790 3823 N
+ P B Z s n/a 28 3779 3786 3839 N
+ P B ZH s n/a 28 3779 3786 3839 N
+ P CH AA b n/a 28 3777 3798 3831 N
+ P CH AA i n/a 28 3778 3798 3831 N
+ P CH AA s n/a 28 3777 3798 3832 N
+ P CH AE b n/a 28 3777 3814 3825 N
+ P CH AE i n/a 28 3778 3789 3825 N
+ P CH AE s n/a 28 3777 3790 3825 N
+ P CH AH b n/a 28 3777 3816 3832 N
+ P CH AH i n/a 28 3778 3790 3848 N
+ P CH AH s n/a 28 3777 3790 3848 N
+ P CH AO b n/a 28 3777 3799 3835 N
+ P CH AO s n/a 28 3777 3799 3835 N
+ P CH AW b n/a 28 3777 3814 3826 N
+ P CH AW s n/a 28 3777 3790 3826 N
+ P CH AY b n/a 28 3777 3798 3831 N
+ P CH AY s n/a 28 3777 3798 3832 N
+ P CH B b n/a 28 3777 3814 3839 N
+ P CH B s n/a 28 3777 3786 3839 N
+ P CH CH s n/a 28 3777 3786 3839 N
+ P CH D b n/a 28 3777 3814 3839 N
+ P CH D s n/a 28 3777 3786 3839 N
+ P CH DH s n/a 28 3777 3786 3839 N
+ P CH EH b n/a 28 3777 3814 3828 N
+ P CH EH s n/a 28 3777 3790 3828 N
+ P CH ER b n/a 28 3777 3801 3851 N
+ P CH ER i n/a 28 3778 3801 3849 N
+ P CH ER s n/a 28 3777 3801 3849 N
+ P CH EY b n/a 28 3777 3814 3827 N
+ P CH EY s n/a 28 3777 3790 3827 N
+ P CH F b n/a 28 3777 3814 3839 N
+ P CH F s n/a 28 3777 3786 3839 N
+ P CH G b n/a 28 3777 3814 3839 N
+ P CH G s n/a 28 3777 3786 3839 N
+ P CH HH s n/a 28 3777 3786 3839 N
+ P CH IH b n/a 28 3777 3817 3820 N
+ P CH IH i n/a 28 3778 3788 3820 N
+ P CH IH s n/a 28 3777 3790 3822 N
+ P CH IY b n/a 28 3777 3817 3821 N
+ P CH IY s n/a 28 3777 3790 3823 N
+ P CH JH s n/a 28 3777 3786 3839 N
+ P CH K b n/a 28 3777 3814 3839 N
+ P CH K s n/a 28 3777 3786 3839 N
+ P CH L b n/a 28 3777 3800 3844 N
+ P CH L i n/a 28 3778 3800 3844 N
+ P CH L s n/a 28 3777 3800 3844 N
+ P CH M b n/a 28 3777 3814 3839 N
+ P CH M s n/a 28 3777 3786 3839 N
+ P CH N b n/a 28 3777 3814 3839 N
+ P CH N s n/a 28 3777 3786 3839 N
+ P CH NG s n/a 28 3777 3786 3839 N
+ P CH OW b n/a 28 3777 3799 3832 N
+ P CH OW s n/a 28 3777 3799 3832 N
+ P CH OY b n/a 28 3777 3799 3835 N
+ P CH OY s n/a 28 3777 3799 3835 N
+ P CH P s n/a 28 3777 3786 3839 N
+ P CH R b n/a 28 3777 3801 3853 N
+ P CH R i n/a 28 3778 3801 3853 N
+ P CH R s n/a 28 3777 3801 3853 N
+ P CH S b n/a 28 3777 3814 3842 N
+ P CH S s n/a 28 3777 3786 3842 N
+ P CH SH b n/a 28 3777 3814 3843 N
+ P CH SH s n/a 28 3777 3786 3843 N
+ P CH SIL s n/a 28 3777 3787 3840 N
+ P CH T s n/a 28 3777 3786 3839 N
+ P CH TH s n/a 28 3777 3786 3839 N
+ P CH UH b n/a 28 3777 3799 3836 N
+ P CH UH s n/a 28 3777 3799 3846 N
+ P CH UW b n/a 28 3777 3799 3835 N
+ P CH UW s n/a 28 3777 3799 3835 N
+ P CH V b n/a 28 3777 3814 3839 N
+ P CH V s n/a 28 3777 3786 3839 N
+ P CH W b n/a 28 3777 3800 3832 N
+ P CH W s n/a 28 3777 3800 3846 N
+ P CH Y b n/a 28 3777 3817 3821 N
+ P CH Y s n/a 28 3777 3790 3823 N
+ P CH Z s n/a 28 3777 3786 3839 N
+ P CH ZH s n/a 28 3777 3786 3839 N
+ P D AA b n/a 28 3779 3798 3831 N
+ P D AA i n/a 28 3779 3798 3831 N
+ P D AA s n/a 28 3779 3798 3832 N
+ P D AE b n/a 28 3779 3814 3825 N
+ P D AE i n/a 28 3779 3789 3825 N
+ P D AE s n/a 28 3779 3790 3825 N
+ P D AH b n/a 28 3779 3816 3832 N
+ P D AH s n/a 28 3779 3790 3848 N
+ P D AO b n/a 28 3779 3799 3835 N
+ P D AO i n/a 28 3779 3799 3835 N
+ P D AO s n/a 28 3779 3799 3835 N
+ P D AW b n/a 28 3779 3814 3826 N
+ P D AW i n/a 28 3779 3789 3826 N
+ P D AW s n/a 28 3779 3790 3826 N
+ P D AY b n/a 28 3779 3798 3831 N
+ P D AY i n/a 28 3779 3798 3831 N
+ P D AY s n/a 28 3779 3798 3832 N
+ P D B b n/a 28 3779 3814 3839 N
+ P D B s n/a 28 3779 3786 3839 N
+ P D CH s n/a 28 3779 3786 3839 N
+ P D D b n/a 28 3779 3814 3839 N
+ P D D s n/a 28 3779 3786 3839 N
+ P D DH s n/a 28 3779 3786 3839 N
+ P D EH b n/a 28 3779 3814 3828 N
+ P D EH i n/a 28 3779 3789 3828 N
+ P D EH s n/a 28 3779 3790 3828 N
+ P D ER b n/a 28 3779 3801 3851 N
+ P D ER i n/a 28 3779 3801 3849 N
+ P D ER s n/a 28 3779 3801 3849 N
+ P D EY b n/a 28 3779 3814 3827 N
+ P D EY i n/a 28 3779 3789 3827 N
+ P D EY s n/a 28 3779 3790 3827 N
+ P D F b n/a 28 3779 3814 3839 N
+ P D F s n/a 28 3779 3786 3839 N
+ P D G b n/a 28 3779 3814 3839 N
+ P D G s n/a 28 3779 3786 3839 N
+ P D HH s n/a 28 3779 3786 3839 N
+ P D IH b n/a 28 3780 3817 3820 N
+ P D IH i n/a 28 3780 3788 3820 N
+ P D IH s n/a 28 3780 3790 3822 N
+ P D IY b n/a 28 3779 3818 3821 N
+ P D IY s n/a 28 3779 3790 3823 N
+ P D JH s n/a 28 3779 3786 3839 N
+ P D K b n/a 28 3779 3814 3839 N
+ P D K s n/a 28 3779 3786 3839 N
+ P D L b n/a 28 3779 3800 3844 N
+ P D L i n/a 28 3779 3800 3844 N
+ P D L s n/a 28 3779 3800 3844 N
+ P D M b n/a 28 3779 3814 3839 N
+ P D M s n/a 28 3779 3786 3839 N
+ P D N b n/a 28 3779 3814 3839 N
+ P D N s n/a 28 3779 3786 3839 N
+ P D NG s n/a 28 3779 3786 3839 N
+ P D OW b n/a 28 3779 3799 3832 N
+ P D OW i n/a 28 3779 3799 3832 N
+ P D OW s n/a 28 3779 3799 3832 N
+ P D OY b n/a 28 3779 3799 3835 N
+ P D OY i n/a 28 3779 3799 3835 N
+ P D OY s n/a 28 3779 3799 3835 N
+ P D P s n/a 28 3779 3786 3839 N
+ P D R b n/a 28 3779 3801 3853 N
+ P D R i n/a 28 3779 3801 3853 N
+ P D R s n/a 28 3779 3801 3853 N
+ P D S b n/a 28 3779 3814 3842 N
+ P D S s n/a 28 3779 3786 3842 N
+ P D SH b n/a 28 3779 3814 3843 N
+ P D SH s n/a 28 3779 3786 3843 N
+ P D SIL s n/a 28 3779 3787 3840 N
+ P D T s n/a 28 3779 3786 3839 N
+ P D TH s n/a 28 3779 3786 3839 N
+ P D UH b n/a 28 3779 3799 3836 N
+ P D UH s n/a 28 3779 3799 3846 N
+ P D UW b n/a 28 3779 3799 3835 N
+ P D UW i n/a 28 3779 3799 3835 N
+ P D UW s n/a 28 3779 3799 3835 N
+ P D V b n/a 28 3779 3814 3839 N
+ P D V s n/a 28 3779 3786 3839 N
+ P D W b n/a 28 3779 3800 3832 N
+ P D W s n/a 28 3779 3800 3846 N
+ P D Y b n/a 28 3779 3818 3821 N
+ P D Y s n/a 28 3779 3790 3823 N
+ P D Z s n/a 28 3779 3786 3839 N
+ P D ZH s n/a 28 3779 3786 3839 N
+ P DH AA b n/a 28 3780 3806 3831 N
+ P DH AA s n/a 28 3780 3803 3832 N
+ P DH AE b n/a 28 3780 3815 3825 N
+ P DH AE s n/a 28 3780 3790 3825 N
+ P DH AH b n/a 28 3780 3816 3832 N
+ P DH AH s n/a 28 3780 3790 3848 N
+ P DH AO b n/a 28 3780 3806 3835 N
+ P DH AO s n/a 28 3780 3804 3835 N
+ P DH AW b n/a 28 3780 3815 3826 N
+ P DH AW s n/a 28 3780 3790 3826 N
+ P DH AY b n/a 28 3780 3806 3831 N
+ P DH AY s n/a 28 3780 3803 3832 N
+ P DH B b n/a 28 3780 3815 3839 N
+ P DH B s n/a 28 3780 3786 3839 N
+ P DH CH s n/a 28 3780 3786 3839 N
+ P DH D b n/a 28 3780 3815 3839 N
+ P DH D s n/a 28 3780 3786 3839 N
+ P DH DH s n/a 28 3780 3786 3839 N
+ P DH EH b n/a 28 3780 3815 3828 N
+ P DH EH s n/a 28 3780 3790 3828 N
+ P DH ER b n/a 28 3780 3805 3851 N
+ P DH ER s n/a 28 3780 3804 3850 N
+ P DH EY b n/a 28 3780 3815 3827 N
+ P DH EY s n/a 28 3780 3790 3827 N
+ P DH F b n/a 28 3780 3815 3839 N
+ P DH F s n/a 28 3780 3786 3839 N
+ P DH G b n/a 28 3780 3815 3839 N
+ P DH G s n/a 28 3780 3786 3839 N
+ P DH HH s n/a 28 3780 3786 3839 N
+ P DH IH b n/a 28 3780 3817 3820 N
+ P DH IH s n/a 28 3780 3790 3822 N
+ P DH IY b n/a 28 3780 3817 3821 N
+ P DH IY s n/a 28 3780 3790 3823 N
+ P DH JH s n/a 28 3780 3786 3839 N
+ P DH K b n/a 28 3780 3815 3839 N
+ P DH K s n/a 28 3780 3786 3839 N
+ P DH L b n/a 28 3780 3806 3844 N
+ P DH L s n/a 28 3780 3804 3844 N
+ P DH M b n/a 28 3780 3815 3839 N
+ P DH M s n/a 28 3780 3786 3839 N
+ P DH N b n/a 28 3780 3815 3839 N
+ P DH N s n/a 28 3780 3786 3839 N
+ P DH NG s n/a 28 3780 3786 3839 N
+ P DH OW b n/a 28 3780 3806 3832 N
+ P DH OW s n/a 28 3780 3803 3832 N
+ P DH OY b n/a 28 3780 3806 3835 N
+ P DH OY s n/a 28 3780 3804 3835 N
+ P DH P s n/a 28 3780 3786 3839 N
+ P DH R b n/a 28 3780 3805 3853 N
+ P DH R s n/a 28 3780 3804 3853 N
+ P DH S b n/a 28 3780 3815 3842 N
+ P DH S s n/a 28 3780 3786 3842 N
+ P DH SH b n/a 28 3780 3815 3843 N
+ P DH SH s n/a 28 3780 3786 3843 N
+ P DH SIL s n/a 28 3780 3787 3840 N
+ P DH T s n/a 28 3780 3786 3839 N
+ P DH TH s n/a 28 3780 3786 3839 N
+ P DH UH b n/a 28 3780 3805 3836 N
+ P DH UH s n/a 28 3780 3804 3846 N
+ P DH UW b n/a 28 3780 3806 3835 N
+ P DH UW s n/a 28 3780 3804 3835 N
+ P DH V b n/a 28 3780 3815 3839 N
+ P DH V s n/a 28 3780 3786 3839 N
+ P DH W b n/a 28 3780 3805 3832 N
+ P DH W s n/a 28 3780 3804 3846 N
+ P DH Y b n/a 28 3780 3817 3821 N
+ P DH Y s n/a 28 3780 3790 3823 N
+ P DH Z s n/a 28 3780 3786 3839 N
+ P DH ZH s n/a 28 3780 3786 3839 N
+ P EH AA b n/a 28 3769 3813 3831 N
+ P EH AA e n/a 28 3769 3813 3832 N
+ P EH AA i n/a 28 3766 3813 3830 N
+ P EH AA s n/a 28 3769 3813 3832 N
+ P EH AE b n/a 28 3769 3815 3825 N
+ P EH AE e n/a 28 3769 3790 3829 N
+ P EH AE i n/a 28 3766 3789 3825 N
+ P EH AE s n/a 28 3769 3790 3825 N
+ P EH AH b n/a 28 3769 3816 3832 N
+ P EH AH e n/a 28 3769 3790 3848 N
+ P EH AH i n/a 28 3766 3790 3848 N
+ P EH AH s n/a 28 3769 3790 3848 N
+ P EH AO b n/a 28 3769 3812 3835 N
+ P EH AO e n/a 28 3769 3813 3834 N
+ P EH AO i n/a 28 3766 3812 3835 N
+ P EH AO s n/a 28 3769 3812 3835 N
+ P EH AW b n/a 28 3769 3815 3826 N
+ P EH AW e n/a 28 3769 3790 3829 N
+ P EH AW i n/a 28 3766 3789 3826 N
+ P EH AW s n/a 28 3769 3790 3826 N
+ P EH AY b n/a 28 3769 3813 3831 N
+ P EH AY e n/a 28 3769 3813 3832 N
+ P EH AY s n/a 28 3769 3813 3832 N
+ P EH B b n/a 28 3766 3815 3838 N
+ P EH B e n/a 28 3766 3783 3838 N
+ P EH B i n/a 28 3766 3783 3838 N
+ P EH B s n/a 28 3766 3783 3838 N
+ P EH CH e n/a 28 3766 3782 3838 N
+ P EH CH i n/a 28 3766 3782 3838 N
+ P EH CH s n/a 28 3766 3782 3838 N
+ P EH D b n/a 28 3766 3815 3838 N
+ P EH D e n/a 28 3766 3783 3838 N
+ P EH D i n/a 28 3766 3783 3838 N
+ P EH D s n/a 28 3766 3783 3838 N
+ P EH DH e n/a 28 3766 3783 3838 N
+ P EH DH s n/a 28 3766 3783 3838 N
+ P EH EH b n/a 28 3769 3815 3828 N
+ P EH EH e n/a 28 3769 3790 3829 N
+ P EH EH i n/a 28 3766 3789 3828 N
+ P EH EH s n/a 28 3769 3790 3828 N
+ P EH ER b n/a 28 3769 3808 3851 N
+ P EH ER e n/a 28 3769 3808 3849 N
+ P EH ER i n/a 28 3766 3808 3849 N
+ P EH ER s n/a 28 3769 3808 3849 N
+ P EH EY b n/a 28 3769 3815 3827 N
+ P EH EY e n/a 28 3769 3790 3829 N
+ P EH EY i n/a 28 3766 3789 3827 N
+ P EH EY s n/a 28 3769 3790 3827 N
+ P EH F b n/a 28 3766 3815 3838 N
+ P EH F e n/a 28 3766 3782 3838 N
+ P EH F i n/a 28 3766 3782 3838 N
+ P EH F s n/a 28 3766 3782 3838 N
+ P EH G b n/a 28 3766 3815 3838 N
+ P EH G e n/a 28 3766 3783 3838 N
+ P EH G s n/a 28 3766 3783 3838 N
+ P EH HH e n/a 28 3766 3782 3838 N
+ P EH HH i n/a 28 3766 3782 3838 N
+ P EH HH s n/a 28 3766 3782 3838 N
+ P EH IH b n/a 28 3769 3817 3820 N
+ P EH IH e n/a 28 3769 3790 3822 N
+ P EH IH i n/a 28 3766 3788 3819 N
+ P EH IH s n/a 28 3769 3790 3822 N
+ P EH IY b n/a 28 3769 3817 3821 N
+ P EH IY e n/a 28 3769 3790 3823 N
+ P EH IY i n/a 28 3766 3788 3821 N
+ P EH IY s n/a 28 3769 3790 3823 N
+ P EH JH e n/a 28 3766 3783 3838 N
+ P EH JH s n/a 28 3766 3783 3838 N
+ P EH K b n/a 28 3766 3815 3838 N
+ P EH K e n/a 28 3766 3782 3838 N
+ P EH K i n/a 28 3766 3782 3838 N
+ P EH K s n/a 28 3766 3782 3838 N
+ P EH L b n/a 28 3769 3810 3844 N
+ P EH L e n/a 28 3769 3810 3844 N
+ P EH L i n/a 28 3766 3810 3844 N
+ P EH L s n/a 28 3769 3810 3844 N
+ P EH M b n/a 28 3766 3815 3838 N
+ P EH M e n/a 28 3766 3783 3838 N
+ P EH M i n/a 28 3766 3783 3838 N
+ P EH M s n/a 28 3766 3783 3838 N
+ P EH N b n/a 28 3766 3815 3838 N
+ P EH N e n/a 28 3766 3783 3838 N
+ P EH N i n/a 28 3766 3783 3838 N
+ P EH N s n/a 28 3766 3783 3838 N
+ P EH NG e n/a 28 3766 3783 3838 N
+ P EH NG s n/a 28 3766 3783 3838 N
+ P EH OW b n/a 28 3769 3812 3832 N
+ P EH OW e n/a 28 3769 3813 3832 N
+ P EH OW i n/a 28 3766 3812 3832 N
+ P EH OW s n/a 28 3769 3812 3832 N
+ P EH OY b n/a 28 3769 3812 3835 N
+ P EH OY e n/a 28 3769 3813 3834 N
+ P EH OY i n/a 28 3766 3812 3835 N
+ P EH OY s n/a 28 3769 3812 3835 N
+ P EH P e n/a 28 3766 3782 3838 N
+ P EH P s n/a 28 3766 3782 3838 N
+ P EH R b n/a 28 3769 3808 3853 N
+ P EH R e n/a 28 3769 3808 3852 N
+ P EH R i n/a 28 3766 3808 3852 N
+ P EH R s n/a 28 3769 3808 3852 N
+ P EH S b n/a 28 3766 3815 3842 N
+ P EH S e n/a 28 3766 3782 3842 N
+ P EH S i n/a 28 3766 3782 3842 N
+ P EH S s n/a 28 3766 3782 3842 N
+ P EH SH b n/a 28 3766 3815 3843 N
+ P EH SH e n/a 28 3766 3782 3843 N
+ P EH SH i n/a 28 3766 3782 3843 N
+ P EH SH s n/a 28 3766 3782 3843 N
+ P EH SIL e n/a 28 3766 3787 3840 N
+ P EH SIL s n/a 28 3766 3787 3840 N
+ P EH T e n/a 28 3766 3782 3838 N
+ P EH T i n/a 28 3766 3782 3838 N
+ P EH T s n/a 28 3766 3782 3838 N
+ P EH TH e n/a 28 3766 3782 3838 N
+ P EH TH i n/a 28 3766 3782 3838 N
+ P EH TH s n/a 28 3766 3782 3838 N
+ P EH UH b n/a 28 3769 3808 3836 N
+ P EH UH e n/a 28 3769 3808 3846 N
+ P EH UH s n/a 28 3769 3808 3846 N
+ P EH UW b n/a 28 3769 3812 3835 N
+ P EH UW e n/a 28 3769 3813 3835 N
+ P EH UW i n/a 28 3766 3812 3835 N
+ P EH UW s n/a 28 3769 3812 3835 N
+ P EH V b n/a 28 3766 3815 3838 N
+ P EH V e n/a 28 3766 3783 3838 N
+ P EH V s n/a 28 3766 3783 3838 N
+ P EH W b n/a 28 3769 3809 3832 N
+ P EH W e n/a 28 3769 3809 3846 N
+ P EH W i n/a 28 3766 3809 3846 N
+ P EH W s n/a 28 3769 3809 3846 N
+ P EH Y b n/a 28 3769 3817 3821 N
+ P EH Y e n/a 28 3769 3790 3823 N
+ P EH Y i n/a 28 3766 3788 3821 N
+ P EH Y s n/a 28 3769 3790 3823 N
+ P EH Z e n/a 28 3766 3783 3838 N
+ P EH Z s n/a 28 3766 3783 3838 N
+ P EH ZH e n/a 28 3766 3783 3838 N
+ P EH ZH s n/a 28 3766 3783 3838 N
+ P ER AA b n/a 28 3758 3813 3831 N
+ P ER AA e n/a 28 3758 3813 3832 N
+ P ER AA i n/a 28 3759 3813 3830 N
+ P ER AA s n/a 28 3758 3813 3832 N
+ P ER AE b n/a 28 3758 3815 3825 N
+ P ER AE e n/a 28 3758 3790 3829 N
+ P ER AE i n/a 28 3759 3789 3825 N
+ P ER AE s n/a 28 3758 3790 3825 N
+ P ER AH b n/a 28 3758 3816 3832 N
+ P ER AH e n/a 28 3758 3790 3848 N
+ P ER AH i n/a 28 3759 3790 3848 N
+ P ER AH s n/a 28 3758 3790 3848 N
+ P ER AO b n/a 28 3758 3812 3835 N
+ P ER AO e n/a 28 3758 3813 3834 N
+ P ER AO i n/a 28 3759 3812 3835 N
+ P ER AO s n/a 28 3758 3812 3835 N
+ P ER AW b n/a 28 3758 3815 3826 N
+ P ER AW e n/a 28 3758 3790 3829 N
+ P ER AW i n/a 28 3759 3789 3826 N
+ P ER AW s n/a 28 3758 3790 3826 N
+ P ER AY b n/a 28 3758 3813 3831 N
+ P ER AY e n/a 28 3758 3813 3832 N
+ P ER AY i n/a 28 3759 3813 3831 N
+ P ER AY s n/a 28 3758 3813 3832 N
+ P ER B b n/a 28 3758 3815 3839 N
+ P ER B e n/a 28 3758 3787 3839 N
+ P ER B s n/a 28 3758 3787 3839 N
+ P ER CH e n/a 28 3758 3787 3839 N
+ P ER CH s n/a 28 3758 3787 3839 N
+ P ER D b n/a 28 3758 3815 3839 N
+ P ER D e n/a 28 3758 3787 3839 N
+ P ER D i n/a 28 3759 3787 3839 N
+ P ER D s n/a 28 3758 3787 3839 N
+ P ER DH e n/a 28 3758 3787 3839 N
+ P ER DH s n/a 28 3758 3787 3839 N
+ P ER EH b n/a 28 3758 3815 3828 N
+ P ER EH e n/a 28 3758 3790 3829 N
+ P ER EH i n/a 28 3759 3789 3828 N
+ P ER EH s n/a 28 3758 3790 3828 N
+ P ER ER b n/a 28 3758 3811 3851 N
+ P ER ER e n/a 28 3758 3810 3849 N
+ P ER ER i n/a 28 3759 3810 3849 N
+ P ER ER s n/a 28 3758 3810 3849 N
+ P ER EY b n/a 28 3758 3815 3827 N
+ P ER EY e n/a 28 3758 3790 3829 N
+ P ER EY i n/a 28 3759 3789 3827 N
+ P ER EY s n/a 28 3758 3790 3827 N
+ P ER F b n/a 28 3758 3815 3839 N
+ P ER F e n/a 28 3758 3787 3839 N
+ P ER F s n/a 28 3758 3787 3839 N
+ P ER G b n/a 28 3758 3815 3839 N
+ P ER G e n/a 28 3758 3787 3839 N
+ P ER G s n/a 28 3758 3787 3839 N
+ P ER HH e n/a 28 3758 3787 3839 N
+ P ER HH s n/a 28 3758 3787 3839 N
+ P ER IH b n/a 28 3758 3817 3820 N
+ P ER IH e n/a 28 3758 3790 3822 N
+ P ER IH i n/a 28 3759 3788 3820 N
+ P ER IH s n/a 28 3758 3790 3822 N
+ P ER IY b n/a 28 3758 3817 3821 N
+ P ER IY e n/a 28 3758 3790 3823 N
+ P ER IY i n/a 28 3759 3788 3821 N
+ P ER IY s n/a 28 3758 3790 3823 N
+ P ER JH e n/a 28 3758 3787 3839 N
+ P ER JH s n/a 28 3758 3787 3839 N
+ P ER K b n/a 28 3758 3815 3839 N
+ P ER K e n/a 28 3758 3787 3839 N
+ P ER K s n/a 28 3758 3787 3839 N
+ P ER L b n/a 28 3758 3810 3844 N
+ P ER L e n/a 28 3758 3810 3844 N
+ P ER L i n/a 28 3759 3810 3844 N
+ P ER L s n/a 28 3758 3810 3844 N
+ P ER M b n/a 28 3758 3815 3839 N
+ P ER M e n/a 28 3758 3787 3839 N
+ P ER M s n/a 28 3758 3787 3839 N
+ P ER N b n/a 28 3758 3815 3839 N
+ P ER N e n/a 28 3758 3787 3839 N
+ P ER N s n/a 28 3758 3787 3839 N
+ P ER NG e n/a 28 3758 3787 3839 N
+ P ER NG s n/a 28 3758 3787 3839 N
+ P ER OW b n/a 28 3758 3812 3832 N
+ P ER OW e n/a 28 3758 3813 3832 N
+ P ER OW i n/a 28 3759 3812 3832 N
+ P ER OW s n/a 28 3758 3812 3832 N
+ P ER OY b n/a 28 3758 3812 3835 N
+ P ER OY e n/a 28 3758 3813 3834 N
+ P ER OY i n/a 28 3759 3812 3835 N
+ P ER OY s n/a 28 3758 3812 3835 N
+ P ER P e n/a 28 3758 3787 3839 N
+ P ER P s n/a 28 3758 3787 3839 N
+ P ER R b n/a 28 3758 3811 3853 N
+ P ER R e n/a 28 3758 3811 3853 N
+ P ER R i n/a 28 3759 3811 3853 N
+ P ER R s n/a 28 3758 3811 3853 N
+ P ER S b n/a 28 3758 3815 3842 N
+ P ER S e n/a 28 3758 3787 3842 N
+ P ER S i n/a 28 3759 3787 3842 N
+ P ER S s n/a 28 3758 3787 3842 N
+ P ER SH b n/a 28 3758 3815 3843 N
+ P ER SH e n/a 28 3758 3787 3843 N
+ P ER SH s n/a 28 3758 3787 3843 N
+ P ER SIL e n/a 28 3758 3787 3840 N
+ P ER SIL s n/a 28 3758 3787 3840 N
+ P ER T e n/a 28 3758 3787 3839 N
+ P ER T i n/a 28 3759 3787 3839 N
+ P ER T s n/a 28 3758 3787 3839 N
+ P ER TH e n/a 28 3758 3787 3839 N
+ P ER TH s n/a 28 3758 3787 3839 N
+ P ER UH b n/a 28 3758 3811 3836 N
+ P ER UH e n/a 28 3758 3811 3846 N
+ P ER UH s n/a 28 3758 3811 3846 N
+ P ER UW b n/a 28 3758 3812 3835 N
+ P ER UW e n/a 28 3758 3813 3835 N
+ P ER UW i n/a 28 3759 3812 3835 N
+ P ER UW s n/a 28 3758 3812 3835 N
+ P ER V b n/a 28 3758 3815 3839 N
+ P ER V e n/a 28 3758 3787 3839 N
+ P ER V s n/a 28 3758 3787 3839 N
+ P ER W b n/a 28 3758 3809 3832 N
+ P ER W e n/a 28 3758 3809 3846 N
+ P ER W s n/a 28 3758 3809 3846 N
+ P ER Y b n/a 28 3758 3817 3821 N
+ P ER Y e n/a 28 3758 3790 3823 N
+ P ER Y i n/a 28 3759 3788 3821 N
+ P ER Y s n/a 28 3758 3790 3823 N
+ P ER Z e n/a 28 3758 3787 3839 N
+ P ER Z s n/a 28 3758 3787 3839 N
+ P ER ZH e n/a 28 3758 3787 3839 N
+ P ER ZH s n/a 28 3758 3787 3839 N
+ P EY AA b n/a 28 3772 3813 3831 N
+ P EY AA e n/a 28 3772 3813 3832 N
+ P EY AA i n/a 28 3773 3813 3830 N
+ P EY AA s n/a 28 3772 3813 3832 N
+ P EY AE b n/a 28 3772 3815 3825 N
+ P EY AE e n/a 28 3772 3794 3829 N
+ P EY AE i n/a 28 3773 3794 3825 N
+ P EY AE s n/a 28 3772 3794 3825 N
+ P EY AH b n/a 28 3772 3816 3832 N
+ P EY AH e n/a 28 3772 3794 3848 N
+ P EY AH i n/a 28 3773 3793 3845 N
+ P EY AH s n/a 28 3772 3794 3848 N
+ P EY AO b n/a 28 3772 3812 3835 N
+ P EY AO e n/a 28 3772 3813 3834 N
+ P EY AO i n/a 28 3773 3812 3835 N
+ P EY AO s n/a 28 3772 3812 3835 N
+ P EY AW b n/a 28 3772 3815 3826 N
+ P EY AW e n/a 28 3772 3794 3829 N
+ P EY AW s n/a 28 3772 3794 3826 N
+ P EY AY b n/a 28 3772 3813 3831 N
+ P EY AY e n/a 28 3772 3813 3832 N
+ P EY AY s n/a 28 3772 3813 3832 N
+ P EY B b n/a 28 3772 3815 3839 N
+ P EY B e n/a 28 3772 3786 3839 N
+ P EY B s n/a 28 3772 3786 3839 N
+ P EY CH e n/a 28 3772 3786 3839 N
+ P EY CH s n/a 28 3772 3786 3839 N
+ P EY D b n/a 28 3772 3815 3839 N
+ P EY D e n/a 28 3772 3786 3839 N
+ P EY D s n/a 28 3772 3786 3839 N
+ P EY DH e n/a 28 3772 3786 3839 N
+ P EY DH s n/a 28 3772 3786 3839 N
+ P EY EH b n/a 28 3772 3815 3828 N
+ P EY EH e n/a 28 3772 3794 3829 N
+ P EY EH i n/a 28 3773 3794 3828 N
+ P EY EH s n/a 28 3772 3794 3828 N
+ P EY ER b n/a 28 3772 3807 3851 N
+ P EY ER e n/a 28 3772 3807 3850 N
+ P EY ER i n/a 28 3773 3807 3850 N
+ P EY ER s n/a 28 3772 3807 3850 N
+ P EY EY b n/a 28 3772 3815 3827 N
+ P EY EY e n/a 28 3772 3794 3829 N
+ P EY EY i n/a 28 3773 3794 3827 N
+ P EY EY s n/a 28 3772 3794 3827 N
+ P EY F b n/a 28 3772 3815 3839 N
+ P EY F e n/a 28 3772 3786 3839 N
+ P EY F i n/a 28 3773 3786 3839 N
+ P EY F s n/a 28 3772 3786 3839 N
+ P EY G b n/a 28 3772 3815 3839 N
+ P EY G e n/a 28 3772 3786 3839 N
+ P EY G i n/a 28 3773 3786 3839 N
+ P EY G s n/a 28 3772 3786 3839 N
+ P EY HH e n/a 28 3772 3786 3839 N
+ P EY HH i n/a 28 3773 3786 3839 N
+ P EY HH s n/a 28 3772 3786 3839 N
+ P EY IH b n/a 28 3772 3817 3820 N
+ P EY IH e n/a 28 3772 3794 3822 N
+ P EY IH i n/a 28 3773 3794 3819 N
+ P EY IH s n/a 28 3772 3794 3822 N
+ P EY IY b n/a 28 3772 3817 3821 N
+ P EY IY e n/a 28 3772 3794 3823 N
+ P EY IY i n/a 28 3773 3794 3821 N
+ P EY IY s n/a 28 3772 3794 3823 N
+ P EY JH e n/a 28 3772 3786 3839 N
+ P EY JH s n/a 28 3772 3786 3839 N
+ P EY K b n/a 28 3772 3815 3839 N
+ P EY K e n/a 28 3772 3786 3839 N
+ P EY K i n/a 28 3773 3786 3839 N
+ P EY K s n/a 28 3772 3786 3839 N
+ P EY L b n/a 28 3772 3807 3844 N
+ P EY L e n/a 28 3772 3807 3844 N
+ P EY L i n/a 28 3773 3807 3844 N
+ P EY L s n/a 28 3772 3807 3844 N
+ P EY M b n/a 28 3772 3815 3839 N
+ P EY M e n/a 28 3772 3786 3839 N
+ P EY M i n/a 28 3773 3786 3839 N
+ P EY M s n/a 28 3772 3786 3839 N
+ P EY N b n/a 28 3772 3815 3839 N
+ P EY N e n/a 28 3772 3786 3839 N
+ P EY N i n/a 28 3773 3786 3839 N
+ P EY N s n/a 28 3772 3786 3839 N
+ P EY NG e n/a 28 3772 3786 3839 N
+ P EY NG s n/a 28 3772 3786 3839 N
+ P EY OW b n/a 28 3772 3812 3832 N
+ P EY OW e n/a 28 3772 3813 3832 N
+ P EY OW i n/a 28 3773 3812 3832 N
+ P EY OW s n/a 28 3772 3812 3832 N
+ P EY OY b n/a 28 3772 3812 3835 N
+ P EY OY e n/a 28 3772 3813 3834 N
+ P EY OY s n/a 28 3772 3812 3835 N
+ P EY P e n/a 28 3772 3786 3839 N
+ P EY P s n/a 28 3772 3786 3839 N
+ P EY R b n/a 28 3772 3807 3853 N
+ P EY R e n/a 28 3772 3807 3853 N
+ P EY R i n/a 28 3773 3807 3853 N
+ P EY R s n/a 28 3772 3807 3853 N
+ P EY S b n/a 28 3772 3815 3842 N
+ P EY S e n/a 28 3772 3786 3842 N
+ P EY S i n/a 28 3773 3786 3842 N
+ P EY S s n/a 28 3772 3786 3842 N
+ P EY SH b n/a 28 3772 3815 3843 N
+ P EY SH e n/a 28 3772 3786 3843 N
+ P EY SH i n/a 28 3773 3786 3843 N
+ P EY SH s n/a 28 3772 3786 3843 N
+ P EY SIL e n/a 28 3772 3786 3841 N
+ P EY SIL s n/a 28 3772 3786 3841 N
+ P EY T e n/a 28 3772 3786 3839 N
+ P EY T i n/a 28 3773 3786 3839 N
+ P EY T s n/a 28 3772 3786 3839 N
+ P EY TH e n/a 28 3772 3786 3839 N
+ P EY TH s n/a 28 3772 3786 3839 N
+ P EY UH b n/a 28 3772 3807 3836 N
+ P EY UH e n/a 28 3772 3807 3846 N
+ P EY UH s n/a 28 3772 3807 3846 N
+ P EY UW b n/a 28 3772 3812 3835 N
+ P EY UW e n/a 28 3772 3813 3835 N
+ P EY UW i n/a 28 3773 3812 3835 N
+ P EY UW s n/a 28 3772 3812 3835 N
+ P EY V b n/a 28 3772 3815 3839 N
+ P EY V e n/a 28 3772 3786 3839 N
+ P EY V i n/a 28 3773 3786 3839 N
+ P EY V s n/a 28 3772 3786 3839 N
+ P EY W b n/a 28 3772 3807 3832 N
+ P EY W e n/a 28 3772 3807 3846 N
+ P EY W i n/a 28 3773 3807 3845 N
+ P EY W s n/a 28 3772 3807 3846 N
+ P EY Y b n/a 28 3772 3817 3821 N
+ P EY Y e n/a 28 3772 3794 3823 N
+ P EY Y i n/a 28 3773 3794 3821 N
+ P EY Y s n/a 28 3772 3794 3823 N
+ P EY Z e n/a 28 3772 3786 3839 N
+ P EY Z s n/a 28 3772 3786 3839 N
+ P EY ZH e n/a 28 3772 3786 3839 N
+ P EY ZH s n/a 28 3772 3786 3839 N
+ P F AA b n/a 28 3780 3806 3831 N
+ P F AA i n/a 28 3780 3803 3831 N
+ P F AA s n/a 28 3780 3803 3832 N
+ P F AE b n/a 28 3780 3815 3825 N
+ P F AE i n/a 28 3780 3789 3825 N
+ P F AE s n/a 28 3780 3790 3825 N
+ P F AH b n/a 28 3780 3816 3832 N
+ P F AH i n/a 28 3780 3790 3848 N
+ P F AH s n/a 28 3780 3790 3848 N
+ P F AO b n/a 28 3780 3806 3835 N
+ P F AO i n/a 28 3780 3804 3835 N
+ P F AO s n/a 28 3780 3804 3835 N
+ P F AW b n/a 28 3780 3815 3826 N
+ P F AW i n/a 28 3780 3789 3826 N
+ P F AW s n/a 28 3780 3790 3826 N
+ P F AY b n/a 28 3780 3806 3831 N
+ P F AY s n/a 28 3780 3803 3832 N
+ P F B b n/a 28 3780 3815 3839 N
+ P F B s n/a 28 3780 3786 3839 N
+ P F CH s n/a 28 3780 3786 3839 N
+ P F D b n/a 28 3780 3815 3839 N
+ P F D s n/a 28 3780 3786 3839 N
+ P F DH s n/a 28 3780 3786 3839 N
+ P F EH b n/a 28 3780 3815 3828 N
+ P F EH i n/a 28 3780 3789 3828 N
+ P F EH s n/a 28 3780 3790 3828 N
+ P F ER b n/a 28 3780 3805 3851 N
+ P F ER i n/a 28 3780 3804 3850 N
+ P F ER s n/a 28 3780 3804 3850 N
+ P F EY b n/a 28 3780 3815 3827 N
+ P F EY s n/a 28 3780 3790 3827 N
+ P F F b n/a 28 3780 3815 3839 N
+ P F F s n/a 28 3780 3786 3839 N
+ P F G b n/a 28 3780 3815 3839 N
+ P F G i n/a 28 3780 3786 3839 N
+ P F G s n/a 28 3780 3786 3839 N
+ P F HH s n/a 28 3780 3786 3839 N
+ P F IH b n/a 28 3780 3817 3820 N
+ P F IH s n/a 28 3780 3790 3822 N
+ P F IY b n/a 28 3780 3817 3821 N
+ P F IY s n/a 28 3780 3790 3823 N
+ P F JH s n/a 28 3780 3786 3839 N
+ P F K b n/a 28 3780 3815 3839 N
+ P F K s n/a 28 3780 3786 3839 N
+ P F L b n/a 28 3780 3806 3844 N
+ P F L i n/a 28 3780 3804 3844 N
+ P F L s n/a 28 3780 3804 3844 N
+ P F M b n/a 28 3780 3815 3839 N
+ P F M s n/a 28 3780 3786 3839 N
+ P F N b n/a 28 3780 3815 3839 N
+ P F N s n/a 28 3780 3786 3839 N
+ P F NG s n/a 28 3780 3786 3839 N
+ P F OW b n/a 28 3780 3806 3832 N
+ P F OW s n/a 28 3780 3803 3832 N
+ P F OY b n/a 28 3780 3806 3835 N
+ P F OY i n/a 28 3780 3804 3835 N
+ P F OY s n/a 28 3780 3804 3835 N
+ P F P s n/a 28 3780 3786 3839 N
+ P F R b n/a 28 3780 3805 3853 N
+ P F R i n/a 28 3780 3804 3853 N
+ P F R s n/a 28 3780 3804 3853 N
+ P F S b n/a 28 3780 3815 3842 N
+ P F S i n/a 28 3780 3786 3842 N
+ P F S s n/a 28 3780 3786 3842 N
+ P F SH b n/a 28 3780 3815 3843 N
+ P F SH s n/a 28 3780 3786 3843 N
+ P F SIL s n/a 28 3780 3787 3840 N
+ P F T s n/a 28 3780 3786 3839 N
+ P F TH s n/a 28 3780 3786 3839 N
+ P F UH b n/a 28 3780 3805 3836 N
+ P F UH i n/a 28 3780 3804 3846 N
+ P F UH s n/a 28 3780 3804 3846 N
+ P F UW b n/a 28 3780 3806 3835 N
+ P F UW s n/a 28 3780 3804 3835 N
+ P F V b n/a 28 3780 3815 3839 N
+ P F V s n/a 28 3780 3786 3839 N
+ P F W b n/a 28 3780 3805 3832 N
+ P F W s n/a 28 3780 3804 3846 N
+ P F Y b n/a 28 3780 3817 3821 N
+ P F Y s n/a 28 3780 3790 3823 N
+ P F Z s n/a 28 3780 3786 3839 N
+ P F ZH s n/a 28 3780 3786 3839 N
+ P G AA b n/a 28 3779 3798 3831 N
+ P G AA s n/a 28 3779 3798 3832 N
+ P G AE b n/a 28 3779 3814 3825 N
+ P G AE i n/a 28 3779 3789 3825 N
+ P G AE s n/a 28 3779 3790 3825 N
+ P G AH b n/a 28 3779 3816 3832 N
+ P G AH i n/a 28 3779 3790 3848 N
+ P G AH s n/a 28 3779 3790 3848 N
+ P G AO b n/a 28 3779 3799 3835 N
+ P G AO s n/a 28 3779 3799 3835 N
+ P G AW b n/a 28 3779 3814 3826 N
+ P G AW s n/a 28 3779 3790 3826 N
+ P G AY b n/a 28 3779 3798 3831 N
+ P G AY i n/a 28 3779 3798 3831 N
+ P G AY s n/a 28 3779 3798 3832 N
+ P G B b n/a 28 3779 3814 3839 N
+ P G B s n/a 28 3779 3786 3839 N
+ P G CH s n/a 28 3779 3786 3839 N
+ P G D b n/a 28 3779 3814 3839 N
+ P G D s n/a 28 3779 3786 3839 N
+ P G DH s n/a 28 3779 3786 3839 N
+ P G EH b n/a 28 3779 3814 3828 N
+ P G EH s n/a 28 3779 3790 3828 N
+ P G ER b n/a 28 3779 3801 3851 N
+ P G ER s n/a 28 3779 3801 3849 N
+ P G EY b n/a 28 3779 3814 3827 N
+ P G EY i n/a 28 3779 3789 3827 N
+ P G EY s n/a 28 3779 3790 3827 N
+ P G F b n/a 28 3779 3814 3839 N
+ P G F s n/a 28 3779 3786 3839 N
+ P G G b n/a 28 3779 3814 3839 N
+ P G G s n/a 28 3779 3786 3839 N
+ P G HH s n/a 28 3779 3786 3839 N
+ P G IH b n/a 28 3780 3817 3820 N
+ P G IH i n/a 28 3780 3788 3820 N
+ P G IH s n/a 28 3780 3790 3822 N
+ P G IY b n/a 28 3779 3817 3821 N
+ P G IY s n/a 28 3779 3790 3823 N
+ P G JH s n/a 28 3779 3786 3839 N
+ P G K b n/a 28 3779 3814 3839 N
+ P G K s n/a 28 3779 3786 3839 N
+ P G L b n/a 28 3779 3800 3844 N
+ P G L i n/a 28 3779 3800 3844 N
+ P G L s n/a 28 3779 3800 3844 N
+ P G M b n/a 28 3779 3814 3839 N
+ P G M s n/a 28 3779 3786 3839 N
+ P G N b n/a 28 3779 3814 3839 N
+ P G N s n/a 28 3779 3786 3839 N
+ P G NG s n/a 28 3779 3786 3839 N
+ P G OW b n/a 28 3779 3799 3832 N
+ P G OW i n/a 28 3779 3799 3832 N
+ P G OW s n/a 28 3779 3799 3832 N
+ P G OY b n/a 28 3779 3799 3835 N
+ P G OY s n/a 28 3779 3799 3835 N
+ P G P s n/a 28 3779 3786 3839 N
+ P G R b n/a 28 3779 3801 3853 N
+ P G R i n/a 28 3779 3801 3853 N
+ P G R s n/a 28 3779 3801 3853 N
+ P G S b n/a 28 3779 3814 3842 N
+ P G S s n/a 28 3779 3786 3842 N
+ P G SH b n/a 28 3779 3814 3843 N
+ P G SH s n/a 28 3779 3786 3843 N
+ P G SIL s n/a 28 3779 3787 3840 N
+ P G T s n/a 28 3779 3786 3839 N
+ P G TH s n/a 28 3779 3786 3839 N
+ P G UH b n/a 28 3779 3799 3836 N
+ P G UH s n/a 28 3779 3799 3846 N
+ P G UW b n/a 28 3779 3799 3835 N
+ P G UW s n/a 28 3779 3799 3835 N
+ P G V b n/a 28 3779 3814 3839 N
+ P G V s n/a 28 3779 3786 3839 N
+ P G W b n/a 28 3779 3800 3832 N
+ P G W s n/a 28 3779 3800 3846 N
+ P G Y b n/a 28 3779 3817 3821 N
+ P G Y i n/a 28 3779 3788 3821 N
+ P G Y s n/a 28 3779 3790 3823 N
+ P G Z s n/a 28 3779 3786 3839 N
+ P G ZH s n/a 28 3779 3786 3839 N
+ P HH AA b n/a 28 3777 3798 3831 N
+ P HH AA s n/a 28 3777 3798 3832 N
+ P HH AE b n/a 28 3777 3814 3825 N
+ P HH AE s n/a 28 3777 3790 3825 N
+ P HH AH b n/a 28 3777 3816 3832 N
+ P HH AH s n/a 28 3777 3790 3848 N
+ P HH AO b n/a 28 3777 3799 3835 N
+ P HH AO s n/a 28 3777 3799 3835 N
+ P HH AW b n/a 28 3777 3814 3826 N
+ P HH AW s n/a 28 3777 3790 3826 N
+ P HH AY b n/a 28 3777 3798 3831 N
+ P HH AY s n/a 28 3777 3798 3832 N
+ P HH B b n/a 28 3777 3814 3839 N
+ P HH B s n/a 28 3777 3786 3839 N
+ P HH CH s n/a 28 3777 3786 3839 N
+ P HH D b n/a 28 3777 3814 3839 N
+ P HH D s n/a 28 3777 3786 3839 N
+ P HH DH s n/a 28 3777 3786 3839 N
+ P HH EH b n/a 28 3777 3814 3828 N
+ P HH EH s n/a 28 3777 3790 3828 N
+ P HH ER b n/a 28 3777 3801 3851 N
+ P HH ER s n/a 28 3777 3801 3849 N
+ P HH EY b n/a 28 3777 3814 3827 N
+ P HH EY s n/a 28 3777 3790 3827 N
+ P HH F b n/a 28 3777 3814 3839 N
+ P HH F s n/a 28 3777 3786 3839 N
+ P HH G b n/a 28 3777 3814 3839 N
+ P HH G s n/a 28 3777 3786 3839 N
+ P HH HH s n/a 28 3777 3786 3839 N
+ P HH IH b n/a 28 3777 3817 3820 N
+ P HH IH s n/a 28 3777 3790 3822 N
+ P HH IY b n/a 28 3777 3817 3821 N
+ P HH IY i n/a 28 3778 3788 3821 N
+ P HH IY s n/a 28 3777 3790 3823 N
+ P HH JH s n/a 28 3777 3786 3839 N
+ P HH K b n/a 28 3777 3814 3839 N
+ P HH K s n/a 28 3777 3786 3839 N
+ P HH L b n/a 28 3777 3800 3844 N
+ P HH L s n/a 28 3777 3800 3844 N
+ P HH M b n/a 28 3777 3814 3839 N
+ P HH M s n/a 28 3777 3786 3839 N
+ P HH N b n/a 28 3777 3814 3839 N
+ P HH N s n/a 28 3777 3786 3839 N
+ P HH NG s n/a 28 3777 3786 3839 N
+ P HH OW b n/a 28 3777 3799 3832 N
+ P HH OW s n/a 28 3777 3799 3832 N
+ P HH OY b n/a 28 3777 3799 3835 N
+ P HH OY s n/a 28 3777 3799 3835 N
+ P HH P s n/a 28 3777 3786 3839 N
+ P HH R b n/a 28 3777 3801 3853 N
+ P HH R s n/a 28 3777 3801 3853 N
+ P HH S b n/a 28 3777 3814 3842 N
+ P HH S s n/a 28 3777 3786 3842 N
+ P HH SH b n/a 28 3777 3814 3843 N
+ P HH SH s n/a 28 3777 3786 3843 N
+ P HH SIL s n/a 28 3777 3787 3840 N
+ P HH T s n/a 28 3777 3786 3839 N
+ P HH TH s n/a 28 3777 3786 3839 N
+ P HH UH b n/a 28 3777 3799 3836 N
+ P HH UH s n/a 28 3777 3799 3846 N
+ P HH UW b n/a 28 3777 3799 3835 N
+ P HH UW s n/a 28 3777 3799 3835 N
+ P HH V b n/a 28 3777 3814 3839 N
+ P HH V s n/a 28 3777 3786 3839 N
+ P HH W b n/a 28 3777 3800 3832 N
+ P HH W s n/a 28 3777 3800 3846 N
+ P HH Y b n/a 28 3777 3817 3821 N
+ P HH Y s n/a 28 3777 3790 3823 N
+ P HH Z s n/a 28 3777 3786 3839 N
+ P HH ZH s n/a 28 3777 3786 3839 N
+ P IH AA b n/a 28 3764 3812 3831 N
+ P IH AA e n/a 28 3768 3812 3832 N
+ P IH AA i n/a 28 3764 3812 3831 N
+ P IH AA s n/a 28 3764 3812 3832 N
+ P IH AE b n/a 28 3764 3815 3825 N
+ P IH AE e n/a 28 3768 3792 3829 N
+ P IH AE i n/a 28 3764 3789 3825 N
+ P IH AE s n/a 28 3764 3792 3825 N
+ P IH AH b n/a 28 3764 3816 3832 N
+ P IH AH e n/a 28 3768 3792 3848 N
+ P IH AH i n/a 28 3764 3792 3846 N
+ P IH AH s n/a 28 3764 3792 3848 N
+ P IH AO b n/a 28 3764 3812 3835 N
+ P IH AO e n/a 28 3768 3813 3834 N
+ P IH AO i n/a 28 3764 3812 3835 N
+ P IH AO s n/a 28 3764 3812 3835 N
+ P IH AW b n/a 28 3764 3815 3826 N
+ P IH AW e n/a 28 3768 3792 3829 N
+ P IH AW i n/a 28 3764 3789 3826 N
+ P IH AW s n/a 28 3764 3792 3826 N
+ P IH AY b n/a 28 3764 3812 3831 N
+ P IH AY e n/a 28 3768 3812 3832 N
+ P IH AY i n/a 28 3764 3812 3831 N
+ P IH AY s n/a 28 3764 3812 3832 N
+ P IH B b n/a 28 3764 3815 3839 N
+ P IH B e n/a 28 3768 3795 3839 N
+ P IH B i n/a 28 3764 3795 3839 N
+ P IH B s n/a 28 3764 3795 3839 N
+ P IH CH e n/a 28 3768 3795 3839 N
+ P IH CH i n/a 28 3764 3795 3839 N
+ P IH CH s n/a 28 3764 3795 3839 N
+ P IH D b n/a 28 3764 3815 3839 N
+ P IH D e n/a 28 3768 3795 3839 N
+ P IH D i n/a 28 3764 3795 3839 N
+ P IH D s n/a 28 3764 3795 3839 N
+ P IH DH e n/a 28 3768 3795 3839 N
+ P IH DH s n/a 28 3764 3795 3839 N
+ P IH EH b n/a 28 3764 3815 3828 N
+ P IH EH e n/a 28 3768 3792 3829 N
+ P IH EH i n/a 28 3764 3789 3828 N
+ P IH EH s n/a 28 3764 3792 3828 N
+ P IH ER b n/a 28 3764 3811 3851 N
+ P IH ER e n/a 28 3768 3810 3849 N
+ P IH ER i n/a 28 3764 3810 3849 N
+ P IH ER s n/a 28 3764 3810 3849 N
+ P IH EY b n/a 28 3764 3815 3827 N
+ P IH EY e n/a 28 3768 3792 3829 N
+ P IH EY i n/a 28 3764 3789 3827 N
+ P IH EY s n/a 28 3764 3792 3827 N
+ P IH F b n/a 28 3764 3815 3839 N
+ P IH F e n/a 28 3768 3795 3839 N
+ P IH F i n/a 28 3764 3795 3839 N
+ P IH F s n/a 28 3764 3795 3839 N
+ P IH G b n/a 28 3764 3815 3839 N
+ P IH G e n/a 28 3768 3795 3839 N
+ P IH G s n/a 28 3764 3795 3839 N
+ P IH HH e n/a 28 3768 3795 3839 N
+ P IH HH i n/a 28 3764 3795 3839 N
+ P IH HH s n/a 28 3764 3795 3839 N
+ P IH IH b n/a 28 3764 3817 3820 N
+ P IH IH e n/a 28 3768 3792 3822 N
+ P IH IH i n/a 28 3764 3788 3819 N
+ P IH IH s n/a 28 3764 3792 3822 N
+ P IH IY b n/a 28 3764 3817 3821 N
+ P IH IY e n/a 28 3768 3792 3823 N
+ P IH IY i n/a 28 3764 3788 3821 N
+ P IH IY s n/a 28 3764 3792 3823 N
+ P IH JH e n/a 28 3768 3795 3839 N
+ P IH JH i n/a 28 3764 3795 3839 N
+ P IH JH s n/a 28 3764 3795 3839 N
+ P IH K b n/a 28 3764 3815 3839 N
+ P IH K e n/a 28 3768 3795 3839 N
+ P IH K i n/a 28 3764 3795 3839 N
+ P IH K s n/a 28 3764 3795 3839 N
+ P IH L b n/a 28 3764 3810 3844 N
+ P IH L e n/a 28 3768 3810 3844 N
+ P IH L i n/a 28 3764 3810 3844 N
+ P IH L s n/a 28 3764 3810 3844 N
+ P IH M b n/a 28 3764 3815 3839 N
+ P IH M e n/a 28 3768 3795 3839 N
+ P IH M i n/a 28 3764 3795 3839 N
+ P IH M s n/a 28 3764 3795 3839 N
+ P IH N b n/a 28 3764 3815 3839 N
+ P IH N e n/a 28 3768 3795 3839 N
+ P IH N i n/a 28 3764 3795 3839 N
+ P IH N s n/a 28 3764 3795 3839 N
+ P IH NG e n/a 28 3768 3795 3839 N
+ P IH NG s n/a 28 3764 3795 3839 N
+ P IH OW b n/a 28 3764 3812 3832 N
+ P IH OW e n/a 28 3768 3813 3832 N
+ P IH OW i n/a 28 3764 3812 3832 N
+ P IH OW s n/a 28 3764 3812 3832 N
+ P IH OY b n/a 28 3764 3812 3835 N
+ P IH OY e n/a 28 3768 3813 3834 N
+ P IH OY i n/a 28 3764 3812 3835 N
+ P IH OY s n/a 28 3764 3812 3835 N
+ P IH P e n/a 28 3768 3795 3839 N
+ P IH P i n/a 28 3764 3795 3839 N
+ P IH P s n/a 28 3764 3795 3839 N
+ P IH R b n/a 28 3764 3811 3853 N
+ P IH R e n/a 28 3768 3811 3853 N
+ P IH R i n/a 28 3764 3811 3853 N
+ P IH R s n/a 28 3764 3811 3853 N
+ P IH S b n/a 28 3764 3815 3842 N
+ P IH S e n/a 28 3768 3795 3842 N
+ P IH S i n/a 28 3764 3795 3842 N
+ P IH S s n/a 28 3764 3795 3842 N
+ P IH SH b n/a 28 3764 3815 3843 N
+ P IH SH e n/a 28 3768 3795 3843 N
+ P IH SH i n/a 28 3764 3795 3843 N
+ P IH SH s n/a 28 3764 3795 3843 N
+ P IH SIL e n/a 28 3768 3795 3841 N
+ P IH SIL s n/a 28 3764 3795 3841 N
+ P IH T e n/a 28 3768 3795 3839 N
+ P IH T i n/a 28 3764 3795 3839 N
+ P IH T s n/a 28 3764 3795 3839 N
+ P IH TH e n/a 28 3768 3795 3839 N
+ P IH TH i n/a 28 3764 3795 3839 N
+ P IH TH s n/a 28 3764 3795 3839 N
+ P IH UH b n/a 28 3764 3811 3836 N
+ P IH UH e n/a 28 3768 3811 3846 N
+ P IH UH i n/a 28 3764 3811 3846 N
+ P IH UH s n/a 28 3764 3811 3846 N
+ P IH UW b n/a 28 3764 3812 3835 N
+ P IH UW e n/a 28 3768 3813 3835 N
+ P IH UW i n/a 28 3764 3812 3835 N
+ P IH UW s n/a 28 3764 3812 3835 N
+ P IH V b n/a 28 3764 3815 3839 N
+ P IH V e n/a 28 3768 3795 3839 N
+ P IH V s n/a 28 3764 3795 3839 N
+ P IH W b n/a 28 3764 3808 3832 N
+ P IH W e n/a 28 3768 3808 3846 N
+ P IH W i n/a 28 3764 3808 3846 N
+ P IH W s n/a 28 3764 3808 3846 N
+ P IH Y b n/a 28 3764 3817 3821 N
+ P IH Y e n/a 28 3768 3792 3823 N
+ P IH Y i n/a 28 3764 3788 3821 N
+ P IH Y s n/a 28 3764 3792 3823 N
+ P IH Z e n/a 28 3768 3795 3839 N
+ P IH Z i n/a 28 3764 3795 3839 N
+ P IH Z s n/a 28 3764 3795 3839 N
+ P IH ZH e n/a 28 3768 3795 3839 N
+ P IH ZH s n/a 28 3764 3795 3839 N
+ P IY AA b n/a 28 3772 3813 3831 N
+ P IY AA e n/a 28 3772 3813 3832 N
+ P IY AA i n/a 28 3772 3813 3831 N
+ P IY AA s n/a 28 3772 3813 3832 N
+ P IY AE b n/a 28 3772 3815 3825 N
+ P IY AE e n/a 28 3772 3794 3829 N
+ P IY AE i n/a 28 3772 3794 3825 N
+ P IY AE s n/a 28 3772 3794 3825 N
+ P IY AH b n/a 28 3772 3816 3832 N
+ P IY AH e n/a 28 3772 3794 3848 N
+ P IY AH i n/a 28 3773 3793 3845 N
+ P IY AH s n/a 28 3772 3794 3848 N
+ P IY AO b n/a 28 3772 3812 3835 N
+ P IY AO e n/a 28 3772 3813 3834 N
+ P IY AO i n/a 28 3772 3812 3835 N
+ P IY AO s n/a 28 3772 3812 3835 N
+ P IY AW b n/a 28 3772 3815 3826 N
+ P IY AW e n/a 28 3772 3794 3829 N
+ P IY AW i n/a 28 3772 3794 3826 N
+ P IY AW s n/a 28 3772 3794 3826 N
+ P IY AY b n/a 28 3772 3813 3831 N
+ P IY AY e n/a 28 3772 3813 3832 N
+ P IY AY i n/a 28 3772 3813 3831 N
+ P IY AY s n/a 28 3772 3813 3832 N
+ P IY B b n/a 28 3772 3815 3839 N
+ P IY B e n/a 28 3772 3794 3839 N
+ P IY B s n/a 28 3772 3794 3839 N
+ P IY CH e n/a 28 3772 3794 3839 N
+ P IY CH s n/a 28 3772 3794 3839 N
+ P IY D b n/a 28 3772 3815 3839 N
+ P IY D e n/a 28 3772 3794 3839 N
+ P IY D i n/a 28 3772 3794 3839 N
+ P IY D s n/a 28 3772 3794 3839 N
+ P IY DH e n/a 28 3772 3794 3839 N
+ P IY DH s n/a 28 3772 3794 3839 N
+ P IY EH b n/a 28 3772 3815 3828 N
+ P IY EH e n/a 28 3772 3794 3829 N
+ P IY EH i n/a 28 3772 3794 3828 N
+ P IY EH s n/a 28 3772 3794 3828 N
+ P IY ER b n/a 28 3772 3807 3851 N
+ P IY ER e n/a 28 3772 3807 3850 N
+ P IY ER i n/a 28 3773 3807 3850 N
+ P IY ER s n/a 28 3772 3807 3850 N
+ P IY EY b n/a 28 3772 3815 3827 N
+ P IY EY e n/a 28 3772 3794 3829 N
+ P IY EY i n/a 28 3772 3794 3827 N
+ P IY EY s n/a 28 3772 3794 3827 N
+ P IY F b n/a 28 3772 3815 3839 N
+ P IY F e n/a 28 3772 3794 3839 N
+ P IY F i n/a 28 3772 3794 3839 N
+ P IY F s n/a 28 3772 3794 3839 N
+ P IY G b n/a 28 3772 3815 3839 N
+ P IY G e n/a 28 3772 3794 3839 N
+ P IY G i n/a 28 3772 3794 3839 N
+ P IY G s n/a 28 3772 3794 3839 N
+ P IY HH e n/a 28 3772 3794 3839 N
+ P IY HH i n/a 28 3772 3794 3839 N
+ P IY HH s n/a 28 3772 3794 3839 N
+ P IY IH b n/a 28 3772 3817 3820 N
+ P IY IH e n/a 28 3772 3794 3822 N
+ P IY IH i n/a 28 3773 3794 3819 N
+ P IY IH s n/a 28 3772 3794 3822 N
+ P IY IY b n/a 28 3772 3817 3821 N
+ P IY IY e n/a 28 3772 3794 3823 N
+ P IY IY i n/a 28 3772 3794 3821 N
+ P IY IY s n/a 28 3772 3794 3823 N
+ P IY JH e n/a 28 3772 3794 3839 N
+ P IY JH s n/a 28 3772 3794 3839 N
+ P IY K b n/a 28 3772 3815 3839 N
+ P IY K e n/a 28 3772 3794 3839 N
+ P IY K i n/a 28 3772 3794 3839 N
+ P IY K s n/a 28 3772 3794 3839 N
+ P IY L b n/a 28 3772 3807 3844 N
+ P IY L e n/a 28 3772 3807 3844 N
+ P IY L i n/a 28 3772 3807 3844 N
+ P IY L s n/a 28 3772 3807 3844 N
+ P IY M b n/a 28 3772 3815 3839 N
+ P IY M e n/a 28 3772 3794 3839 N
+ P IY M i n/a 28 3772 3794 3839 N
+ P IY M s n/a 28 3772 3794 3839 N
+ P IY N b n/a 28 3772 3815 3839 N
+ P IY N e n/a 28 3772 3794 3839 N
+ P IY N i n/a 28 3772 3794 3839 N
+ P IY N s n/a 28 3772 3794 3839 N
+ P IY NG e n/a 28 3772 3794 3839 N
+ P IY NG s n/a 28 3772 3794 3839 N
+ P IY OW b n/a 28 3772 3812 3832 N
+ P IY OW e n/a 28 3772 3813 3832 N
+ P IY OW i n/a 28 3772 3812 3832 N
+ P IY OW s n/a 28 3772 3812 3832 N
+ P IY OY b n/a 28 3772 3812 3835 N
+ P IY OY e n/a 28 3772 3813 3834 N
+ P IY OY s n/a 28 3772 3812 3835 N
+ P IY P e n/a 28 3772 3794 3839 N
+ P IY P s n/a 28 3772 3794 3839 N
+ P IY R b n/a 28 3772 3807 3853 N
+ P IY R e n/a 28 3772 3807 3853 N
+ P IY R i n/a 28 3772 3807 3853 N
+ P IY R s n/a 28 3772 3807 3853 N
+ P IY S b n/a 28 3772 3815 3842 N
+ P IY S e n/a 28 3772 3794 3842 N
+ P IY S i n/a 28 3772 3794 3842 N
+ P IY S s n/a 28 3772 3794 3842 N
+ P IY SH b n/a 28 3772 3815 3843 N
+ P IY SH e n/a 28 3772 3794 3843 N
+ P IY SH s n/a 28 3772 3794 3843 N
+ P IY SIL e n/a 28 3772 3794 3841 N
+ P IY SIL s n/a 28 3772 3794 3841 N
+ P IY T e n/a 28 3772 3794 3839 N
+ P IY T i n/a 28 3772 3794 3839 N
+ P IY T s n/a 28 3772 3794 3839 N
+ P IY TH e n/a 28 3772 3794 3839 N
+ P IY TH s n/a 28 3772 3794 3839 N
+ P IY UH b n/a 28 3772 3807 3836 N
+ P IY UH e n/a 28 3772 3807 3846 N
+ P IY UH s n/a 28 3772 3807 3846 N
+ P IY UW b n/a 28 3772 3812 3835 N
+ P IY UW e n/a 28 3772 3813 3835 N
+ P IY UW i n/a 28 3772 3812 3835 N
+ P IY UW s n/a 28 3772 3812 3835 N
+ P IY V b n/a 28 3772 3815 3839 N
+ P IY V e n/a 28 3772 3794 3839 N
+ P IY V s n/a 28 3772 3794 3839 N
+ P IY W b n/a 28 3772 3807 3832 N
+ P IY W e n/a 28 3772 3807 3846 N
+ P IY W i n/a 28 3772 3807 3845 N
+ P IY W s n/a 28 3772 3807 3846 N
+ P IY Y b n/a 28 3772 3817 3821 N
+ P IY Y e n/a 28 3772 3794 3823 N
+ P IY Y i n/a 28 3772 3794 3821 N
+ P IY Y s n/a 28 3772 3794 3823 N
+ P IY Z e n/a 28 3772 3794 3839 N
+ P IY Z s n/a 28 3772 3794 3839 N
+ P IY ZH e n/a 28 3772 3794 3839 N
+ P IY ZH s n/a 28 3772 3794 3839 N
+ P JH AA b n/a 28 3777 3798 3831 N
+ P JH AA i n/a 28 3778 3798 3831 N
+ P JH AA s n/a 28 3777 3798 3832 N
+ P JH AE b n/a 28 3777 3814 3825 N
+ P JH AE i n/a 28 3778 3789 3825 N
+ P JH AE s n/a 28 3777 3790 3825 N
+ P JH AH b n/a 28 3777 3816 3832 N
+ P JH AH i n/a 28 3778 3790 3848 N
+ P JH AH s n/a 28 3777 3790 3848 N
+ P JH AO b n/a 28 3777 3799 3835 N
+ P JH AO i n/a 28 3778 3799 3835 N
+ P JH AO s n/a 28 3777 3799 3835 N
+ P JH AW b n/a 28 3777 3814 3826 N
+ P JH AW i n/a 28 3778 3789 3826 N
+ P JH AW s n/a 28 3777 3790 3826 N
+ P JH AY b n/a 28 3777 3798 3831 N
+ P JH AY s n/a 28 3777 3798 3832 N
+ P JH B b n/a 28 3777 3814 3839 N
+ P JH B s n/a 28 3777 3786 3839 N
+ P JH CH s n/a 28 3777 3786 3839 N
+ P JH D b n/a 28 3777 3814 3839 N
+ P JH D s n/a 28 3777 3786 3839 N
+ P JH DH s n/a 28 3777 3786 3839 N
+ P JH EH b n/a 28 3777 3814 3828 N
+ P JH EH s n/a 28 3777 3790 3828 N
+ P JH ER b n/a 28 3777 3801 3851 N
+ P JH ER s n/a 28 3777 3801 3849 N
+ P JH EY b n/a 28 3777 3814 3827 N
+ P JH EY s n/a 28 3777 3790 3827 N
+ P JH F b n/a 28 3777 3814 3839 N
+ P JH F s n/a 28 3777 3786 3839 N
+ P JH G b n/a 28 3777 3814 3839 N
+ P JH G s n/a 28 3777 3786 3839 N
+ P JH HH s n/a 28 3777 3786 3839 N
+ P JH IH b n/a 28 3777 3817 3820 N
+ P JH IH i n/a 28 3778 3788 3820 N
+ P JH IH s n/a 28 3777 3790 3822 N
+ P JH IY b n/a 28 3777 3817 3821 N
+ P JH IY s n/a 28 3777 3790 3823 N
+ P JH JH s n/a 28 3777 3786 3839 N
+ P JH K b n/a 28 3777 3814 3839 N
+ P JH K s n/a 28 3777 3786 3839 N
+ P JH L b n/a 28 3777 3800 3844 N
+ P JH L s n/a 28 3777 3800 3844 N
+ P JH M b n/a 28 3777 3814 3839 N
+ P JH M s n/a 28 3777 3786 3839 N
+ P JH N b n/a 28 3777 3814 3839 N
+ P JH N s n/a 28 3777 3786 3839 N
+ P JH NG s n/a 28 3777 3786 3839 N
+ P JH OW b n/a 28 3777 3799 3832 N
+ P JH OW i n/a 28 3778 3799 3832 N
+ P JH OW s n/a 28 3777 3799 3832 N
+ P JH OY b n/a 28 3777 3799 3835 N
+ P JH OY s n/a 28 3777 3799 3835 N
+ P JH P s n/a 28 3777 3786 3839 N
+ P JH R b n/a 28 3777 3801 3853 N
+ P JH R s n/a 28 3777 3801 3853 N
+ P JH S b n/a 28 3777 3814 3842 N
+ P JH S s n/a 28 3777 3786 3842 N
+ P JH SH b n/a 28 3777 3814 3843 N
+ P JH SH s n/a 28 3777 3786 3843 N
+ P JH SIL s n/a 28 3777 3787 3840 N
+ P JH T s n/a 28 3777 3786 3839 N
+ P JH TH s n/a 28 3777 3786 3839 N
+ P JH UH b n/a 28 3777 3799 3836 N
+ P JH UH s n/a 28 3777 3799 3846 N
+ P JH UW b n/a 28 3777 3799 3835 N
+ P JH UW s n/a 28 3777 3799 3835 N
+ P JH V b n/a 28 3777 3814 3839 N
+ P JH V s n/a 28 3777 3786 3839 N
+ P JH W b n/a 28 3777 3800 3832 N
+ P JH W s n/a 28 3777 3800 3846 N
+ P JH Y b n/a 28 3777 3817 3821 N
+ P JH Y s n/a 28 3777 3790 3823 N
+ P JH Z s n/a 28 3777 3786 3839 N
+ P JH ZH s n/a 28 3777 3786 3839 N
+ P K AA b n/a 28 3780 3798 3831 N
+ P K AA i n/a 28 3780 3798 3831 N
+ P K AA s n/a 28 3780 3798 3832 N
+ P K AE b n/a 28 3780 3814 3825 N
+ P K AE i n/a 28 3780 3789 3825 N
+ P K AE s n/a 28 3780 3790 3825 N
+ P K AH b n/a 28 3780 3816 3832 N
+ P K AH i n/a 28 3780 3790 3848 N
+ P K AH s n/a 28 3780 3790 3848 N
+ P K AO b n/a 28 3780 3799 3835 N
+ P K AO i n/a 28 3780 3799 3835 N
+ P K AO s n/a 28 3780 3799 3835 N
+ P K AW b n/a 28 3780 3814 3826 N
+ P K AW s n/a 28 3780 3790 3826 N
+ P K AY b n/a 28 3780 3798 3831 N
+ P K AY i n/a 28 3780 3798 3831 N
+ P K AY s n/a 28 3780 3798 3832 N
+ P K B b n/a 28 3780 3814 3839 N
+ P K B s n/a 28 3780 3786 3839 N
+ P K CH s n/a 28 3780 3786 3839 N
+ P K D b n/a 28 3780 3814 3839 N
+ P K D s n/a 28 3780 3786 3839 N
+ P K DH s n/a 28 3780 3786 3839 N
+ P K EH b n/a 28 3780 3814 3828 N
+ P K EH i n/a 28 3780 3789 3828 N
+ P K EH s n/a 28 3780 3790 3828 N
+ P K ER b n/a 28 3780 3801 3851 N
+ P K ER i n/a 28 3780 3801 3849 N
+ P K ER s n/a 28 3780 3801 3849 N
+ P K EY b n/a 28 3780 3814 3827 N
+ P K EY i n/a 28 3780 3789 3827 N
+ P K EY s n/a 28 3780 3790 3827 N
+ P K F b n/a 28 3780 3814 3839 N
+ P K F i n/a 28 3780 3786 3839 N
+ P K F s n/a 28 3780 3786 3839 N
+ P K G b n/a 28 3780 3814 3839 N
+ P K G s n/a 28 3780 3786 3839 N
+ P K HH s n/a 28 3780 3786 3839 N
+ P K IH b n/a 28 3780 3817 3820 N
+ P K IH i n/a 28 3780 3788 3820 N
+ P K IH s n/a 28 3780 3790 3822 N
+ P K IY b n/a 28 3779 3817 3821 N
+ P K IY i n/a 28 3779 3788 3821 N
+ P K IY s n/a 28 3779 3790 3823 N
+ P K JH s n/a 28 3780 3786 3839 N
+ P K K b n/a 28 3780 3814 3839 N
+ P K K s n/a 28 3780 3786 3839 N
+ P K L b n/a 28 3780 3800 3844 N
+ P K L i n/a 28 3780 3800 3844 N
+ P K L s n/a 28 3780 3800 3844 N
+ P K M b n/a 28 3780 3814 3839 N
+ P K M s n/a 28 3780 3786 3839 N
+ P K N b n/a 28 3780 3814 3839 N
+ P K N s n/a 28 3780 3786 3839 N
+ P K NG s n/a 28 3780 3786 3839 N
+ P K OW b n/a 28 3780 3799 3832 N
+ P K OW i n/a 28 3780 3799 3832 N
+ P K OW s n/a 28 3780 3799 3832 N
+ P K OY b n/a 28 3780 3799 3835 N
+ P K OY i n/a 28 3780 3799 3835 N
+ P K OY s n/a 28 3780 3799 3835 N
+ P K P s n/a 28 3780 3786 3839 N
+ P K R b n/a 28 3780 3801 3853 N
+ P K R i n/a 28 3780 3801 3853 N
+ P K R s n/a 28 3780 3801 3853 N
+ P K S b n/a 28 3780 3814 3842 N
+ P K S s n/a 28 3780 3786 3842 N
+ P K SH b n/a 28 3780 3814 3843 N
+ P K SH s n/a 28 3780 3786 3843 N
+ P K SIL s n/a 28 3780 3787 3840 N
+ P K T s n/a 28 3780 3786 3839 N
+ P K TH s n/a 28 3780 3786 3839 N
+ P K UH b n/a 28 3779 3799 3836 N
+ P K UH s n/a 28 3779 3799 3846 N
+ P K UW b n/a 28 3779 3799 3835 N
+ P K UW i n/a 28 3779 3799 3835 N
+ P K UW s n/a 28 3779 3799 3835 N
+ P K V b n/a 28 3780 3814 3839 N
+ P K V s n/a 28 3780 3786 3839 N
+ P K W b n/a 28 3780 3800 3832 N
+ P K W s n/a 28 3780 3800 3846 N
+ P K Y b n/a 28 3779 3817 3821 N
+ P K Y s n/a 28 3779 3790 3823 N
+ P K Z s n/a 28 3780 3786 3839 N
+ P K ZH s n/a 28 3780 3786 3839 N
+ P L AA b n/a 28 3756 3813 3831 N
+ P L AA e n/a 28 3756 3813 3832 N
+ P L AA i n/a 28 3756 3813 3830 N
+ P L AA s n/a 28 3756 3813 3832 N
+ P L AE b n/a 28 3756 3815 3825 N
+ P L AE e n/a 28 3756 3790 3829 N
+ P L AE i n/a 28 3756 3789 3825 N
+ P L AE s n/a 28 3756 3790 3825 N
+ P L AH b n/a 28 3756 3816 3832 N
+ P L AH e n/a 28 3756 3790 3848 N
+ P L AH i n/a 28 3756 3790 3848 N
+ P L AH s n/a 28 3756 3790 3848 N
+ P L AO b n/a 28 3756 3812 3835 N
+ P L AO e n/a 28 3756 3813 3834 N
+ P L AO i n/a 28 3756 3812 3835 N
+ P L AO s n/a 28 3756 3812 3835 N
+ P L AW b n/a 28 3756 3815 3826 N
+ P L AW e n/a 28 3756 3790 3829 N
+ P L AW i n/a 28 3756 3789 3826 N
+ P L AW s n/a 28 3756 3790 3826 N
+ P L AY b n/a 28 3756 3813 3831 N
+ P L AY e n/a 28 3756 3813 3832 N
+ P L AY i n/a 28 3756 3813 3831 N
+ P L AY s n/a 28 3756 3813 3832 N
+ P L B b n/a 28 3756 3815 3839 N
+ P L B e n/a 28 3756 3787 3839 N
+ P L B s n/a 28 3756 3787 3839 N
+ P L CH e n/a 28 3756 3787 3839 N
+ P L CH i n/a 28 3756 3787 3839 N
+ P L CH s n/a 28 3756 3787 3839 N
+ P L D b n/a 28 3756 3815 3839 N
+ P L D e n/a 28 3756 3787 3839 N
+ P L D i n/a 28 3756 3787 3839 N
+ P L D s n/a 28 3756 3787 3839 N
+ P L DH e n/a 28 3756 3787 3839 N
+ P L DH s n/a 28 3756 3787 3839 N
+ P L EH b n/a 28 3756 3815 3828 N
+ P L EH e n/a 28 3756 3790 3829 N
+ P L EH i n/a 28 3756 3789 3828 N
+ P L EH s n/a 28 3756 3790 3828 N
+ P L ER b n/a 28 3756 3811 3851 N
+ P L ER e n/a 28 3756 3811 3849 N
+ P L ER i n/a 28 3756 3811 3849 N
+ P L ER s n/a 28 3756 3811 3849 N
+ P L EY b n/a 28 3756 3815 3827 N
+ P L EY e n/a 28 3756 3790 3829 N
+ P L EY i n/a 28 3756 3789 3827 N
+ P L EY s n/a 28 3756 3790 3827 N
+ P L F b n/a 28 3756 3815 3839 N
+ P L F e n/a 28 3756 3787 3839 N
+ P L F i n/a 28 3756 3787 3839 N
+ P L F s n/a 28 3756 3787 3839 N
+ P L G b n/a 28 3756 3815 3839 N
+ P L G e n/a 28 3756 3787 3839 N
+ P L G s n/a 28 3756 3787 3839 N
+ P L HH e n/a 28 3756 3787 3839 N
+ P L HH s n/a 28 3756 3787 3839 N
+ P L IH b n/a 28 3756 3817 3820 N
+ P L IH e n/a 28 3756 3790 3822 N
+ P L IH i n/a 28 3756 3788 3819 N
+ P L IH s n/a 28 3756 3790 3822 N
+ P L IY b n/a 28 3756 3817 3821 N
+ P L IY e n/a 28 3756 3790 3823 N
+ P L IY i n/a 28 3756 3788 3821 N
+ P L IY s n/a 28 3756 3790 3823 N
+ P L JH e n/a 28 3756 3787 3839 N
+ P L JH s n/a 28 3756 3787 3839 N
+ P L K b n/a 28 3756 3815 3839 N
+ P L K e n/a 28 3756 3787 3839 N
+ P L K s n/a 28 3756 3787 3839 N
+ P L L b n/a 28 3756 3810 3844 N
+ P L L e n/a 28 3756 3810 3844 N
+ P L L i n/a 28 3756 3810 3844 N
+ P L L s n/a 28 3756 3810 3844 N
+ P L M b n/a 28 3756 3815 3839 N
+ P L M e n/a 28 3756 3787 3839 N
+ P L M i n/a 28 3756 3787 3839 N
+ P L M s n/a 28 3756 3787 3839 N
+ P L N b n/a 28 3756 3815 3839 N
+ P L N e n/a 28 3756 3787 3839 N
+ P L N s n/a 28 3756 3787 3839 N
+ P L NG e n/a 28 3756 3787 3839 N
+ P L NG s n/a 28 3756 3787 3839 N
+ P L OW b n/a 28 3756 3812 3832 N
+ P L OW e n/a 28 3756 3813 3832 N
+ P L OW i n/a 28 3756 3812 3832 N
+ P L OW s n/a 28 3756 3812 3832 N
+ P L OY b n/a 28 3756 3812 3835 N
+ P L OY e n/a 28 3756 3813 3834 N
+ P L OY i n/a 28 3756 3812 3835 N
+ P L OY s n/a 28 3756 3812 3835 N
+ P L P e n/a 28 3756 3787 3839 N
+ P L P s n/a 28 3756 3787 3839 N
+ P L R b n/a 28 3756 3811 3853 N
+ P L R e n/a 28 3756 3811 3852 N
+ P L R i n/a 28 3756 3811 3852 N
+ P L R s n/a 28 3756 3811 3852 N
+ P L S b n/a 28 3756 3815 3842 N
+ P L S e n/a 28 3756 3787 3842 N
+ P L S i n/a 28 3756 3787 3842 N
+ P L S s n/a 28 3756 3787 3842 N
+ P L SH b n/a 28 3756 3815 3843 N
+ P L SH e n/a 28 3756 3787 3843 N
+ P L SH s n/a 28 3756 3787 3843 N
+ P L SIL e n/a 28 3756 3787 3840 N
+ P L SIL s n/a 28 3756 3787 3840 N
+ P L T e n/a 28 3756 3787 3839 N
+ P L T i n/a 28 3756 3787 3839 N
+ P L T s n/a 28 3756 3787 3839 N
+ P L TH e n/a 28 3756 3787 3839 N
+ P L TH s n/a 28 3756 3787 3839 N
+ P L UH b n/a 28 3756 3811 3836 N
+ P L UH e n/a 28 3756 3811 3846 N
+ P L UH s n/a 28 3756 3811 3846 N
+ P L UW b n/a 28 3756 3812 3835 N
+ P L UW e n/a 28 3756 3813 3835 N
+ P L UW i n/a 28 3756 3812 3835 N
+ P L UW s n/a 28 3756 3812 3835 N
+ P L V b n/a 28 3756 3815 3839 N
+ P L V e n/a 28 3756 3787 3839 N
+ P L V s n/a 28 3756 3787 3839 N
+ P L W b n/a 28 3756 3809 3832 N
+ P L W e n/a 28 3756 3809 3846 N
+ P L W i n/a 28 3756 3809 3846 N
+ P L W s n/a 28 3756 3809 3846 N
+ P L Y b n/a 28 3756 3817 3821 N
+ P L Y e n/a 28 3756 3790 3823 N
+ P L Y s n/a 28 3756 3790 3823 N
+ P L Z e n/a 28 3756 3787 3839 N
+ P L Z s n/a 28 3756 3787 3839 N
+ P L ZH e n/a 28 3756 3787 3839 N
+ P L ZH s n/a 28 3756 3787 3839 N
+ P M AA b n/a 28 3775 3798 3831 N
+ P M AA e n/a 28 3775 3798 3832 N
+ P M AA i n/a 28 3776 3798 3831 N
+ P M AA s n/a 28 3775 3798 3832 N
+ P M AE b n/a 28 3775 3814 3825 N
+ P M AE e n/a 28 3775 3789 3829 N
+ P M AE i n/a 28 3776 3789 3825 N
+ P M AE s n/a 28 3775 3789 3825 N
+ P M AH b n/a 28 3775 3816 3832 N
+ P M AH e n/a 28 3775 3791 3848 N
+ P M AH i n/a 28 3776 3791 3848 N
+ P M AH s n/a 28 3775 3791 3848 N
+ P M AO b n/a 28 3775 3799 3835 N
+ P M AO e n/a 28 3775 3799 3834 N
+ P M AO i n/a 28 3776 3799 3835 N
+ P M AO s n/a 28 3775 3799 3835 N
+ P M AW b n/a 28 3775 3814 3826 N
+ P M AW e n/a 28 3775 3789 3829 N
+ P M AW i n/a 28 3776 3789 3826 N
+ P M AW s n/a 28 3775 3789 3826 N
+ P M AY b n/a 28 3775 3798 3831 N
+ P M AY e n/a 28 3775 3798 3832 N
+ P M AY i n/a 28 3776 3798 3831 N
+ P M AY s n/a 28 3775 3798 3832 N
+ P M B b n/a 28 3775 3814 3839 N
+ P M B e n/a 28 3775 3786 3839 N
+ P M B i n/a 28 3776 3786 3839 N
+ P M B s n/a 28 3775 3786 3839 N
+ P M CH e n/a 28 3775 3786 3839 N
+ P M CH i n/a 28 3776 3786 3839 N
+ P M CH s n/a 28 3775 3786 3839 N
+ P M D b n/a 28 3775 3814 3839 N
+ P M D e n/a 28 3775 3786 3839 N
+ P M D i n/a 28 3776 3786 3839 N
+ P M D s n/a 28 3775 3786 3839 N
+ P M DH e n/a 28 3775 3786 3839 N
+ P M DH s n/a 28 3775 3786 3839 N
+ P M EH b n/a 28 3775 3814 3828 N
+ P M EH e n/a 28 3775 3789 3829 N
+ P M EH i n/a 28 3776 3789 3828 N
+ P M EH s n/a 28 3775 3789 3828 N
+ P M ER b n/a 28 3775 3802 3851 N
+ P M ER e n/a 28 3775 3802 3849 N
+ P M ER i n/a 28 3776 3802 3849 N
+ P M ER s n/a 28 3775 3802 3849 N
+ P M EY b n/a 28 3775 3814 3827 N
+ P M EY e n/a 28 3775 3789 3829 N
+ P M EY i n/a 28 3776 3789 3827 N
+ P M EY s n/a 28 3775 3789 3827 N
+ P M F b n/a 28 3775 3814 3839 N
+ P M F e n/a 28 3775 3786 3839 N
+ P M F i n/a 28 3776 3786 3839 N
+ P M F s n/a 28 3775 3786 3839 N
+ P M G b n/a 28 3775 3814 3839 N
+ P M G e n/a 28 3775 3786 3839 N
+ P M G i n/a 28 3776 3786 3839 N
+ P M G s n/a 28 3775 3786 3839 N
+ P M HH e n/a 28 3775 3786 3839 N
+ P M HH i n/a 28 3776 3786 3839 N
+ P M HH s n/a 28 3775 3786 3839 N
+ P M IH b n/a 28 3775 3817 3820 N
+ P M IH e n/a 28 3775 3791 3822 N
+ P M IH i n/a 28 3776 3791 3820 N
+ P M IH s n/a 28 3775 3791 3822 N
+ P M IY b n/a 28 3775 3817 3821 N
+ P M IY e n/a 28 3775 3788 3823 N
+ P M IY i n/a 28 3776 3788 3821 N
+ P M IY s n/a 28 3775 3788 3823 N
+ P M JH e n/a 28 3775 3786 3839 N
+ P M JH s n/a 28 3775 3786 3839 N
+ P M K b n/a 28 3775 3814 3839 N
+ P M K e n/a 28 3775 3786 3839 N
+ P M K i n/a 28 3776 3786 3839 N
+ P M K s n/a 28 3775 3786 3839 N
+ P M L b n/a 28 3775 3800 3844 N
+ P M L e n/a 28 3775 3800 3844 N
+ P M L i n/a 28 3776 3800 3844 N
+ P M L s n/a 28 3775 3800 3844 N
+ P M M b n/a 28 3775 3814 3839 N
+ P M M e n/a 28 3775 3786 3839 N
+ P M M i n/a 28 3776 3786 3839 N
+ P M M s n/a 28 3775 3786 3839 N
+ P M N b n/a 28 3775 3814 3839 N
+ P M N e n/a 28 3775 3786 3839 N
+ P M N i n/a 28 3776 3786 3839 N
+ P M N s n/a 28 3775 3786 3839 N
+ P M NG e n/a 28 3775 3786 3839 N
+ P M NG s n/a 28 3775 3786 3839 N
+ P M OW b n/a 28 3775 3798 3832 N
+ P M OW e n/a 28 3775 3798 3832 N
+ P M OW i n/a 28 3776 3798 3832 N
+ P M OW s n/a 28 3775 3798 3832 N
+ P M OY b n/a 28 3775 3799 3835 N
+ P M OY e n/a 28 3775 3799 3834 N
+ P M OY i n/a 28 3776 3799 3835 N
+ P M OY s n/a 28 3775 3799 3835 N
+ P M P e n/a 28 3775 3786 3839 N
+ P M P i n/a 28 3776 3786 3839 N
+ P M P s n/a 28 3775 3786 3839 N
+ P M R b n/a 28 3775 3802 3853 N
+ P M R e n/a 28 3775 3802 3853 N
+ P M R i n/a 28 3776 3802 3853 N
+ P M R s n/a 28 3775 3802 3853 N
+ P M S b n/a 28 3775 3814 3842 N
+ P M S e n/a 28 3775 3786 3842 N
+ P M S i n/a 28 3776 3786 3842 N
+ P M S s n/a 28 3775 3786 3842 N
+ P M SH b n/a 28 3775 3814 3843 N
+ P M SH e n/a 28 3775 3786 3843 N
+ P M SH i n/a 28 3776 3786 3843 N
+ P M SH s n/a 28 3775 3786 3843 N
+ P M SIL e n/a 28 3775 3787 3840 N
+ P M SIL s n/a 28 3775 3787 3840 N
+ P M T e n/a 28 3775 3786 3839 N
+ P M T i n/a 28 3776 3786 3839 N
+ P M T s n/a 28 3775 3786 3839 N
+ P M TH e n/a 28 3775 3786 3839 N
+ P M TH i n/a 28 3776 3786 3839 N
+ P M TH s n/a 28 3775 3786 3839 N
+ P M UH b n/a 28 3775 3799 3836 N
+ P M UH e n/a 28 3775 3799 3846 N
+ P M UH i n/a 28 3776 3799 3846 N
+ P M UH s n/a 28 3775 3799 3846 N
+ P M UW b n/a 28 3775 3799 3835 N
+ P M UW e n/a 28 3775 3799 3835 N
+ P M UW i n/a 28 3776 3799 3835 N
+ P M UW s n/a 28 3775 3799 3835 N
+ P M V b n/a 28 3775 3814 3839 N
+ P M V e n/a 28 3775 3786 3839 N
+ P M V s n/a 28 3775 3786 3839 N
+ P M W b n/a 28 3775 3800 3832 N
+ P M W e n/a 28 3775 3800 3846 N
+ P M W s n/a 28 3775 3800 3846 N
+ P M Y b n/a 28 3775 3817 3821 N
+ P M Y e n/a 28 3775 3788 3823 N
+ P M Y i n/a 28 3776 3788 3821 N
+ P M Y s n/a 28 3775 3788 3823 N
+ P M Z e n/a 28 3775 3786 3839 N
+ P M Z i n/a 28 3776 3786 3839 N
+ P M Z s n/a 28 3775 3786 3839 N
+ P M ZH e n/a 28 3775 3786 3839 N
+ P M ZH s n/a 28 3775 3786 3839 N
+ P N AA b n/a 28 3775 3798 3831 N
+ P N AA i n/a 28 3776 3798 3831 N
+ P N AA s n/a 28 3775 3798 3832 N
+ P N AE b n/a 28 3775 3814 3825 N
+ P N AE i n/a 28 3776 3789 3825 N
+ P N AE s n/a 28 3775 3789 3825 N
+ P N AH b n/a 28 3775 3816 3832 N
+ P N AH i n/a 28 3776 3791 3848 N
+ P N AH s n/a 28 3775 3791 3848 N
+ P N AO b n/a 28 3775 3799 3835 N
+ P N AO i n/a 28 3776 3799 3835 N
+ P N AO s n/a 28 3775 3799 3835 N
+ P N AW b n/a 28 3775 3814 3826 N
+ P N AW i n/a 28 3776 3789 3826 N
+ P N AW s n/a 28 3775 3789 3826 N
+ P N AY b n/a 28 3775 3798 3831 N
+ P N AY i n/a 28 3776 3798 3831 N
+ P N AY s n/a 28 3775 3798 3832 N
+ P N B b n/a 28 3775 3814 3839 N
+ P N B s n/a 28 3775 3786 3839 N
+ P N CH s n/a 28 3775 3786 3839 N
+ P N D b n/a 28 3775 3814 3839 N
+ P N D s n/a 28 3775 3786 3839 N
+ P N DH s n/a 28 3775 3786 3839 N
+ P N EH b n/a 28 3775 3814 3828 N
+ P N EH i n/a 28 3776 3789 3828 N
+ P N EH s n/a 28 3775 3789 3828 N
+ P N ER b n/a 28 3775 3802 3851 N
+ P N ER i n/a 28 3776 3802 3849 N
+ P N ER s n/a 28 3775 3802 3849 N
+ P N EY b n/a 28 3775 3814 3827 N
+ P N EY i n/a 28 3776 3789 3827 N
+ P N EY s n/a 28 3775 3789 3827 N
+ P N F b n/a 28 3775 3814 3839 N
+ P N F s n/a 28 3775 3786 3839 N
+ P N G b n/a 28 3775 3814 3839 N
+ P N G s n/a 28 3775 3786 3839 N
+ P N HH i n/a 28 3776 3786 3839 N
+ P N HH s n/a 28 3775 3786 3839 N
+ P N IH b n/a 28 3775 3817 3820 N
+ P N IH i n/a 28 3776 3791 3820 N
+ P N IH s n/a 28 3775 3791 3822 N
+ P N IY b n/a 28 3775 3818 3821 N
+ P N IY i n/a 28 3776 3788 3821 N
+ P N IY s n/a 28 3775 3788 3823 N
+ P N JH s n/a 28 3775 3786 3839 N
+ P N K b n/a 28 3775 3814 3839 N
+ P N K s n/a 28 3775 3786 3839 N
+ P N L b n/a 28 3775 3800 3844 N
+ P N L i n/a 28 3776 3800 3844 N
+ P N L s n/a 28 3775 3800 3844 N
+ P N M b n/a 28 3775 3814 3839 N
+ P N M s n/a 28 3775 3786 3839 N
+ P N N b n/a 28 3775 3814 3839 N
+ P N N s n/a 28 3775 3786 3839 N
+ P N NG s n/a 28 3775 3786 3839 N
+ P N OW b n/a 28 3775 3798 3832 N
+ P N OW i n/a 28 3776 3798 3832 N
+ P N OW s n/a 28 3775 3798 3832 N
+ P N OY b n/a 28 3775 3799 3835 N
+ P N OY i n/a 28 3776 3799 3835 N
+ P N OY s n/a 28 3775 3799 3835 N
+ P N P s n/a 28 3775 3786 3839 N
+ P N R b n/a 28 3775 3802 3853 N
+ P N R i n/a 28 3776 3802 3853 N
+ P N R s n/a 28 3775 3802 3853 N
+ P N S b n/a 28 3775 3814 3842 N
+ P N S s n/a 28 3775 3786 3842 N
+ P N SH b n/a 28 3775 3814 3843 N
+ P N SH s n/a 28 3775 3786 3843 N
+ P N SIL s n/a 28 3775 3787 3840 N
+ P N T s n/a 28 3775 3786 3839 N
+ P N TH s n/a 28 3775 3786 3839 N
+ P N UH b n/a 28 3775 3799 3836 N
+ P N UH i n/a 28 3776 3799 3846 N
+ P N UH s n/a 28 3775 3799 3846 N
+ P N UW b n/a 28 3775 3799 3835 N
+ P N UW s n/a 28 3775 3799 3835 N
+ P N V b n/a 28 3775 3814 3839 N
+ P N V s n/a 28 3775 3786 3839 N
+ P N W b n/a 28 3775 3800 3832 N
+ P N W s n/a 28 3775 3800 3846 N
+ P N Y b n/a 28 3775 3818 3821 N
+ P N Y i n/a 28 3776 3788 3821 N
+ P N Y s n/a 28 3775 3788 3823 N
+ P N Z s n/a 28 3775 3786 3839 N
+ P N ZH s n/a 28 3775 3786 3839 N
+ P NG AA b n/a 28 3775 3798 3831 N
+ P NG AA s n/a 28 3775 3798 3832 N
+ P NG AE b n/a 28 3775 3814 3825 N
+ P NG AE s n/a 28 3775 3789 3825 N
+ P NG AH b n/a 28 3775 3816 3832 N
+ P NG AH s n/a 28 3775 3791 3848 N
+ P NG AO b n/a 28 3775 3799 3835 N
+ P NG AO i n/a 28 3776 3799 3835 N
+ P NG AO s n/a 28 3775 3799 3835 N
+ P NG AW b n/a 28 3775 3814 3826 N
+ P NG AW s n/a 28 3775 3789 3826 N
+ P NG AY b n/a 28 3775 3798 3831 N
+ P NG AY s n/a 28 3775 3798 3832 N
+ P NG B b n/a 28 3775 3814 3839 N
+ P NG B s n/a 28 3775 3786 3839 N
+ P NG CH s n/a 28 3775 3786 3839 N
+ P NG D b n/a 28 3775 3814 3839 N
+ P NG D s n/a 28 3775 3786 3839 N
+ P NG DH s n/a 28 3775 3786 3839 N
+ P NG EH b n/a 28 3775 3814 3828 N
+ P NG EH s n/a 28 3775 3789 3828 N
+ P NG ER b n/a 28 3775 3802 3851 N
+ P NG ER i n/a 28 3776 3802 3849 N
+ P NG ER s n/a 28 3775 3802 3849 N
+ P NG EY b n/a 28 3775 3814 3827 N
+ P NG EY s n/a 28 3775 3789 3827 N
+ P NG F b n/a 28 3775 3814 3839 N
+ P NG F s n/a 28 3775 3786 3839 N
+ P NG G b n/a 28 3775 3814 3839 N
+ P NG G s n/a 28 3775 3786 3839 N
+ P NG HH s n/a 28 3775 3786 3839 N
+ P NG IH b n/a 28 3775 3817 3820 N
+ P NG IH i n/a 28 3776 3791 3820 N
+ P NG IH s n/a 28 3775 3791 3822 N
+ P NG IY b n/a 28 3775 3817 3821 N
+ P NG IY s n/a 28 3775 3788 3823 N
+ P NG JH s n/a 28 3775 3786 3839 N
+ P NG K b n/a 28 3775 3814 3839 N
+ P NG K s n/a 28 3775 3786 3839 N
+ P NG L b n/a 28 3775 3800 3844 N
+ P NG L i n/a 28 3776 3800 3844 N
+ P NG L s n/a 28 3775 3800 3844 N
+ P NG M b n/a 28 3775 3814 3839 N
+ P NG M s n/a 28 3775 3786 3839 N
+ P NG N b n/a 28 3775 3814 3839 N
+ P NG N s n/a 28 3775 3786 3839 N
+ P NG NG s n/a 28 3775 3786 3839 N
+ P NG OW b n/a 28 3775 3798 3832 N
+ P NG OW s n/a 28 3775 3798 3832 N
+ P NG OY b n/a 28 3775 3799 3835 N
+ P NG OY s n/a 28 3775 3799 3835 N
+ P NG P s n/a 28 3775 3786 3839 N
+ P NG R b n/a 28 3775 3802 3853 N
+ P NG R s n/a 28 3775 3802 3853 N
+ P NG S b n/a 28 3775 3814 3842 N
+ P NG S s n/a 28 3775 3786 3842 N
+ P NG SH b n/a 28 3775 3814 3843 N
+ P NG SH s n/a 28 3775 3786 3843 N
+ P NG SIL s n/a 28 3775 3787 3840 N
+ P NG T s n/a 28 3775 3786 3839 N
+ P NG TH s n/a 28 3775 3786 3839 N
+ P NG UH b n/a 28 3775 3799 3836 N
+ P NG UH s n/a 28 3775 3799 3846 N
+ P NG UW b n/a 28 3775 3799 3835 N
+ P NG UW s n/a 28 3775 3799 3835 N
+ P NG V b n/a 28 3775 3814 3839 N
+ P NG V s n/a 28 3775 3786 3839 N
+ P NG W b n/a 28 3775 3800 3832 N
+ P NG W s n/a 28 3775 3800 3846 N
+ P NG Y b n/a 28 3775 3817 3821 N
+ P NG Y s n/a 28 3775 3788 3823 N
+ P NG Z s n/a 28 3775 3786 3839 N
+ P NG ZH s n/a 28 3775 3786 3839 N
+ P OW AA b n/a 28 3757 3813 3831 N
+ P OW AA e n/a 28 3756 3813 3832 N
+ P OW AA i n/a 28 3757 3813 3830 N
+ P OW AA s n/a 28 3757 3813 3832 N
+ P OW AE b n/a 28 3757 3815 3825 N
+ P OW AE e n/a 28 3756 3792 3829 N
+ P OW AE i n/a 28 3757 3792 3825 N
+ P OW AE s n/a 28 3757 3792 3825 N
+ P OW AH b n/a 28 3757 3816 3832 N
+ P OW AH e n/a 28 3756 3792 3848 N
+ P OW AH i n/a 28 3757 3792 3848 N
+ P OW AH s n/a 28 3757 3792 3848 N
+ P OW AO b n/a 28 3757 3812 3835 N
+ P OW AO e n/a 28 3756 3813 3834 N
+ P OW AO i n/a 28 3757 3812 3835 N
+ P OW AO s n/a 28 3757 3812 3835 N
+ P OW AW b n/a 28 3757 3815 3826 N
+ P OW AW e n/a 28 3756 3792 3829 N
+ P OW AW i n/a 28 3757 3792 3826 N
+ P OW AW s n/a 28 3757 3792 3826 N
+ P OW AY b n/a 28 3757 3813 3831 N
+ P OW AY e n/a 28 3756 3813 3832 N
+ P OW AY i n/a 28 3757 3813 3831 N
+ P OW AY s n/a 28 3757 3813 3832 N
+ P OW B b n/a 28 3757 3815 3839 N
+ P OW B e n/a 28 3756 3787 3839 N
+ P OW B i n/a 28 3757 3787 3839 N
+ P OW B s n/a 28 3757 3787 3839 N
+ P OW CH e n/a 28 3756 3787 3839 N
+ P OW CH s n/a 28 3757 3787 3839 N
+ P OW D b n/a 28 3757 3815 3839 N
+ P OW D e n/a 28 3757 3787 3839 N
+ P OW D s n/a 28 3757 3787 3839 N
+ P OW DH e n/a 28 3757 3787 3839 N
+ P OW DH s n/a 28 3757 3787 3839 N
+ P OW EH b n/a 28 3757 3815 3828 N
+ P OW EH e n/a 28 3756 3792 3829 N
+ P OW EH i n/a 28 3757 3792 3828 N
+ P OW EH s n/a 28 3757 3792 3828 N
+ P OW ER b n/a 28 3757 3811 3851 N
+ P OW ER e n/a 28 3756 3811 3850 N
+ P OW ER i n/a 28 3757 3811 3850 N
+ P OW ER s n/a 28 3757 3811 3850 N
+ P OW EY b n/a 28 3757 3815 3827 N
+ P OW EY e n/a 28 3756 3792 3829 N
+ P OW EY i n/a 28 3757 3792 3827 N
+ P OW EY s n/a 28 3757 3792 3827 N
+ P OW F b n/a 28 3757 3815 3839 N
+ P OW F e n/a 28 3756 3787 3839 N
+ P OW F i n/a 28 3757 3787 3839 N
+ P OW F s n/a 28 3757 3787 3839 N
+ P OW G b n/a 28 3757 3815 3839 N
+ P OW G e n/a 28 3756 3787 3839 N
+ P OW G s n/a 28 3757 3787 3839 N
+ P OW HH e n/a 28 3756 3787 3839 N
+ P OW HH s n/a 28 3757 3787 3839 N
+ P OW IH b n/a 28 3757 3817 3820 N
+ P OW IH e n/a 28 3756 3792 3822 N
+ P OW IH i n/a 28 3757 3792 3819 N
+ P OW IH s n/a 28 3757 3792 3822 N
+ P OW IY b n/a 28 3757 3817 3821 N
+ P OW IY e n/a 28 3756 3792 3823 N
+ P OW IY i n/a 28 3757 3792 3821 N
+ P OW IY s n/a 28 3757 3792 3823 N
+ P OW JH e n/a 28 3756 3787 3839 N
+ P OW JH i n/a 28 3757 3787 3839 N
+ P OW JH s n/a 28 3757 3787 3839 N
+ P OW K b n/a 28 3757 3815 3839 N
+ P OW K e n/a 28 3756 3787 3839 N
+ P OW K i n/a 28 3757 3787 3839 N
+ P OW K s n/a 28 3757 3787 3839 N
+ P OW L b n/a 28 3757 3810 3844 N
+ P OW L e n/a 28 3756 3810 3844 N
+ P OW L i n/a 28 3757 3810 3844 N
+ P OW L s n/a 28 3757 3810 3844 N
+ P OW M b n/a 28 3757 3815 3839 N
+ P OW M e n/a 28 3756 3787 3839 N
+ P OW M i n/a 28 3757 3787 3839 N
+ P OW M s n/a 28 3757 3787 3839 N
+ P OW N b n/a 28 3757 3815 3839 N
+ P OW N e n/a 28 3757 3787 3839 N
+ P OW N i n/a 28 3757 3787 3839 N
+ P OW N s n/a 28 3757 3787 3839 N
+ P OW NG e n/a 28 3756 3787 3839 N
+ P OW NG s n/a 28 3757 3787 3839 N
+ P OW OW b n/a 28 3757 3812 3832 N
+ P OW OW e n/a 28 3756 3813 3832 N
+ P OW OW i n/a 28 3757 3812 3832 N
+ P OW OW s n/a 28 3757 3812 3832 N
+ P OW OY b n/a 28 3757 3812 3835 N
+ P OW OY e n/a 28 3756 3813 3834 N
+ P OW OY i n/a 28 3757 3812 3835 N
+ P OW OY s n/a 28 3757 3812 3835 N
+ P OW P e n/a 28 3756 3787 3839 N
+ P OW P s n/a 28 3757 3787 3839 N
+ P OW R b n/a 28 3757 3811 3853 N
+ P OW R e n/a 28 3756 3811 3853 N
+ P OW R i n/a 28 3757 3811 3853 N
+ P OW R s n/a 28 3757 3811 3853 N
+ P OW S b n/a 28 3757 3815 3842 N
+ P OW S e n/a 28 3757 3787 3842 N
+ P OW S i n/a 28 3757 3787 3842 N
+ P OW S s n/a 28 3757 3787 3842 N
+ P OW SH b n/a 28 3757 3815 3843 N
+ P OW SH e n/a 28 3756 3787 3843 N
+ P OW SH s n/a 28 3757 3787 3843 N
+ P OW SIL e n/a 28 3756 3787 3840 N
+ P OW SIL s n/a 28 3757 3787 3840 N
+ P OW T e n/a 28 3757 3787 3839 N
+ P OW T i n/a 28 3757 3787 3839 N
+ P OW T s n/a 28 3757 3787 3839 N
+ P OW TH e n/a 28 3757 3787 3839 N
+ P OW TH i n/a 28 3757 3787 3839 N
+ P OW TH s n/a 28 3757 3787 3839 N
+ P OW UH b n/a 28 3757 3811 3836 N
+ P OW UH e n/a 28 3756 3811 3846 N
+ P OW UH i n/a 28 3757 3811 3846 N
+ P OW UH s n/a 28 3757 3811 3846 N
+ P OW UW b n/a 28 3757 3812 3835 N
+ P OW UW e n/a 28 3756 3813 3835 N
+ P OW UW i n/a 28 3757 3812 3835 N
+ P OW UW s n/a 28 3757 3812 3835 N
+ P OW V b n/a 28 3757 3815 3839 N
+ P OW V e n/a 28 3756 3787 3839 N
+ P OW V s n/a 28 3757 3787 3839 N
+ P OW W b n/a 28 3757 3809 3832 N
+ P OW W e n/a 28 3756 3809 3846 N
+ P OW W i n/a 28 3757 3809 3846 N
+ P OW W s n/a 28 3757 3809 3846 N
+ P OW Y b n/a 28 3757 3817 3821 N
+ P OW Y e n/a 28 3756 3792 3823 N
+ P OW Y i n/a 28 3757 3792 3821 N
+ P OW Y s n/a 28 3757 3792 3823 N
+ P OW Z e n/a 28 3757 3787 3839 N
+ P OW Z i n/a 28 3757 3787 3839 N
+ P OW Z s n/a 28 3757 3787 3839 N
+ P OW ZH e n/a 28 3756 3787 3839 N
+ P OW ZH s n/a 28 3757 3787 3839 N
+ P OY AA b n/a 28 3774 3813 3831 N
+ P OY AA e n/a 28 3774 3813 3832 N
+ P OY AA s n/a 28 3774 3813 3832 N
+ P OY AE b n/a 28 3774 3815 3825 N
+ P OY AE e n/a 28 3774 3783 3829 N
+ P OY AE i n/a 28 3774 3783 3825 N
+ P OY AE s n/a 28 3774 3783 3825 N
+ P OY AH b n/a 28 3774 3816 3832 N
+ P OY AH e n/a 28 3774 3783 3847 N
+ P OY AH i n/a 28 3774 3783 3845 N
+ P OY AH s n/a 28 3774 3783 3847 N
+ P OY AO b n/a 28 3774 3812 3835 N
+ P OY AO e n/a 28 3774 3813 3834 N
+ P OY AO s n/a 28 3774 3812 3835 N
+ P OY AW b n/a 28 3774 3815 3826 N
+ P OY AW e n/a 28 3774 3783 3829 N
+ P OY AW s n/a 28 3774 3783 3826 N
+ P OY AY b n/a 28 3774 3813 3831 N
+ P OY AY e n/a 28 3774 3813 3832 N
+ P OY AY s n/a 28 3774 3813 3832 N
+ P OY B b n/a 28 3774 3815 3839 N
+ P OY B e n/a 28 3774 3786 3839 N
+ P OY B s n/a 28 3774 3786 3839 N
+ P OY CH e n/a 28 3774 3786 3839 N
+ P OY CH s n/a 28 3774 3786 3839 N
+ P OY D b n/a 28 3774 3815 3839 N
+ P OY D e n/a 28 3774 3786 3839 N
+ P OY D s n/a 28 3774 3786 3839 N
+ P OY DH e n/a 28 3774 3786 3839 N
+ P OY DH s n/a 28 3774 3786 3839 N
+ P OY EH b n/a 28 3774 3815 3828 N
+ P OY EH e n/a 28 3774 3783 3829 N
+ P OY EH s n/a 28 3774 3783 3828 N
+ P OY ER b n/a 28 3774 3808 3851 N
+ P OY ER e n/a 28 3774 3808 3850 N
+ P OY ER s n/a 28 3774 3808 3850 N
+ P OY EY b n/a 28 3774 3815 3827 N
+ P OY EY e n/a 28 3774 3783 3829 N
+ P OY EY s n/a 28 3774 3783 3827 N
+ P OY F b n/a 28 3774 3815 3839 N
+ P OY F e n/a 28 3774 3786 3839 N
+ P OY F s n/a 28 3774 3786 3839 N
+ P OY G b n/a 28 3774 3815 3839 N
+ P OY G e n/a 28 3774 3786 3839 N
+ P OY G s n/a 28 3774 3786 3839 N
+ P OY HH e n/a 28 3774 3786 3839 N
+ P OY HH s n/a 28 3774 3786 3839 N
+ P OY IH b n/a 28 3774 3817 3820 N
+ P OY IH e n/a 28 3774 3783 3822 N
+ P OY IH s n/a 28 3774 3783 3822 N
+ P OY IY b n/a 28 3774 3817 3821 N
+ P OY IY e n/a 28 3774 3783 3823 N
+ P OY IY i n/a 28 3774 3783 3823 N
+ P OY IY s n/a 28 3774 3783 3823 N
+ P OY JH e n/a 28 3774 3786 3839 N
+ P OY JH s n/a 28 3774 3786 3839 N
+ P OY K b n/a 28 3774 3815 3839 N
+ P OY K e n/a 28 3774 3786 3839 N
+ P OY K s n/a 28 3774 3786 3839 N
+ P OY L b n/a 28 3774 3810 3844 N
+ P OY L e n/a 28 3774 3810 3844 N
+ P OY L s n/a 28 3774 3810 3844 N
+ P OY M b n/a 28 3774 3815 3839 N
+ P OY M e n/a 28 3774 3786 3839 N
+ P OY M s n/a 28 3774 3786 3839 N
+ P OY N b n/a 28 3774 3815 3839 N
+ P OY N e n/a 28 3774 3786 3839 N
+ P OY N s n/a 28 3774 3786 3839 N
+ P OY NG e n/a 28 3774 3786 3839 N
+ P OY NG s n/a 28 3774 3786 3839 N
+ P OY OW b n/a 28 3774 3812 3832 N
+ P OY OW e n/a 28 3774 3813 3832 N
+ P OY OW i n/a 28 3774 3812 3832 N
+ P OY OW s n/a 28 3774 3812 3832 N
+ P OY OY b n/a 28 3774 3812 3835 N
+ P OY OY e n/a 28 3774 3813 3834 N
+ P OY OY s n/a 28 3774 3812 3835 N
+ P OY P e n/a 28 3774 3786 3839 N
+ P OY P s n/a 28 3774 3786 3839 N
+ P OY R b n/a 28 3774 3808 3853 N
+ P OY R e n/a 28 3774 3808 3853 N
+ P OY R s n/a 28 3774 3808 3853 N
+ P OY S b n/a 28 3774 3815 3842 N
+ P OY S e n/a 28 3774 3786 3842 N
+ P OY S s n/a 28 3774 3786 3842 N
+ P OY SH b n/a 28 3774 3815 3843 N
+ P OY SH e n/a 28 3774 3786 3843 N
+ P OY SH s n/a 28 3774 3786 3843 N
+ P OY SIL e n/a 28 3774 3786 3840 N
+ P OY SIL s n/a 28 3774 3786 3840 N
+ P OY T e n/a 28 3774 3786 3839 N
+ P OY T s n/a 28 3774 3786 3839 N
+ P OY TH e n/a 28 3774 3786 3839 N
+ P OY TH s n/a 28 3774 3786 3839 N
+ P OY UH b n/a 28 3774 3808 3836 N
+ P OY UH e n/a 28 3774 3808 3846 N
+ P OY UH s n/a 28 3774 3808 3846 N
+ P OY UW b n/a 28 3774 3812 3835 N
+ P OY UW e n/a 28 3774 3813 3835 N
+ P OY UW s n/a 28 3774 3812 3835 N
+ P OY V b n/a 28 3774 3815 3839 N
+ P OY V e n/a 28 3774 3786 3839 N
+ P OY V s n/a 28 3774 3786 3839 N
+ P OY W b n/a 28 3774 3809 3832 N
+ P OY W e n/a 28 3774 3809 3846 N
+ P OY W s n/a 28 3774 3809 3846 N
+ P OY Y b n/a 28 3774 3817 3821 N
+ P OY Y e n/a 28 3774 3783 3823 N
+ P OY Y s n/a 28 3774 3783 3823 N
+ P OY Z e n/a 28 3774 3786 3839 N
+ P OY Z s n/a 28 3774 3786 3839 N
+ P OY ZH e n/a 28 3774 3786 3839 N
+ P OY ZH s n/a 28 3774 3786 3839 N
+ P P AA b n/a 28 3780 3798 3831 N
+ P P AA i n/a 28 3780 3798 3831 N
+ P P AA s n/a 28 3780 3798 3832 N
+ P P AE b n/a 28 3780 3814 3825 N
+ P P AE i n/a 28 3780 3789 3825 N
+ P P AE s n/a 28 3780 3790 3825 N
+ P P AH b n/a 28 3780 3816 3832 N
+ P P AH s n/a 28 3780 3790 3848 N
+ P P AO b n/a 28 3780 3799 3835 N
+ P P AO s n/a 28 3780 3799 3835 N
+ P P AW b n/a 28 3780 3814 3826 N
+ P P AW s n/a 28 3780 3790 3826 N
+ P P AY b n/a 28 3780 3798 3831 N
+ P P AY s n/a 28 3780 3798 3832 N
+ P P B b n/a 28 3780 3814 3839 N
+ P P B s n/a 28 3780 3786 3839 N
+ P P CH s n/a 28 3780 3786 3839 N
+ P P D b n/a 28 3780 3814 3839 N
+ P P D s n/a 28 3780 3786 3839 N
+ P P DH s n/a 28 3780 3786 3839 N
+ P P EH b n/a 28 3780 3814 3828 N
+ P P EH s n/a 28 3780 3790 3828 N
+ P P ER b n/a 28 3780 3801 3851 N
+ P P ER s n/a 28 3780 3801 3849 N
+ P P EY b n/a 28 3780 3814 3827 N
+ P P EY s n/a 28 3780 3790 3827 N
+ P P F b n/a 28 3780 3814 3839 N
+ P P F s n/a 28 3780 3786 3839 N
+ P P G b n/a 28 3780 3814 3839 N
+ P P G s n/a 28 3780 3786 3839 N
+ P P HH s n/a 28 3780 3786 3839 N
+ P P IH b n/a 28 3780 3817 3820 N
+ P P IH s n/a 28 3780 3790 3822 N
+ P P IY b n/a 28 3779 3817 3821 N
+ P P IY s n/a 28 3779 3790 3823 N
+ P P JH s n/a 28 3780 3786 3839 N
+ P P K b n/a 28 3780 3814 3839 N
+ P P K s n/a 28 3780 3786 3839 N
+ P P L b n/a 28 3780 3800 3844 N
+ P P L s n/a 28 3780 3800 3844 N
+ P P M b n/a 28 3780 3814 3839 N
+ P P M s n/a 28 3780 3786 3839 N
+ P P N b n/a 28 3780 3814 3839 N
+ P P N s n/a 28 3780 3786 3839 N
+ P P NG s n/a 28 3780 3786 3839 N
+ P P OW b n/a 28 3780 3799 3832 N
+ P P OW i n/a 28 3780 3799 3832 N
+ P P OW s n/a 28 3780 3799 3832 N
+ P P OY b n/a 28 3780 3799 3835 N
+ P P OY s n/a 28 3780 3799 3835 N
+ P P P s n/a 28 3780 3786 3839 N
+ P P R b n/a 28 3780 3801 3853 N
+ P P R s n/a 28 3780 3801 3853 N
+ P P S b n/a 28 3780 3814 3842 N
+ P P S s n/a 28 3780 3786 3842 N
+ P P SH b n/a 28 3780 3814 3843 N
+ P P SH s n/a 28 3780 3786 3843 N
+ P P SIL s n/a 28 3780 3787 3840 N
+ P P T s n/a 28 3780 3786 3839 N
+ P P TH s n/a 28 3780 3786 3839 N
+ P P UH b n/a 28 3779 3799 3836 N
+ P P UH s n/a 28 3779 3799 3846 N
+ P P UW b n/a 28 3779 3799 3835 N
+ P P UW s n/a 28 3779 3799 3835 N
+ P P V b n/a 28 3780 3814 3839 N
+ P P V s n/a 28 3780 3786 3839 N
+ P P W b n/a 28 3780 3800 3832 N
+ P P W s n/a 28 3780 3800 3846 N
+ P P Y b n/a 28 3779 3817 3821 N
+ P P Y s n/a 28 3779 3790 3823 N
+ P P Z s n/a 28 3780 3786 3839 N
+ P P ZH s n/a 28 3780 3786 3839 N
+ P R AA b n/a 28 3758 3813 3831 N
+ P R AA e n/a 28 3758 3813 3832 N
+ P R AA i n/a 28 3759 3813 3830 N
+ P R AA s n/a 28 3758 3813 3832 N
+ P R AE b n/a 28 3758 3815 3825 N
+ P R AE e n/a 28 3758 3790 3829 N
+ P R AE i n/a 28 3759 3789 3825 N
+ P R AE s n/a 28 3758 3790 3825 N
+ P R AH b n/a 28 3758 3816 3832 N
+ P R AH e n/a 28 3758 3790 3848 N
+ P R AH i n/a 28 3759 3790 3848 N
+ P R AH s n/a 28 3758 3790 3848 N
+ P R AO b n/a 28 3758 3812 3835 N
+ P R AO e n/a 28 3758 3813 3834 N
+ P R AO i n/a 28 3759 3812 3835 N
+ P R AO s n/a 28 3758 3812 3835 N
+ P R AW b n/a 28 3758 3815 3826 N
+ P R AW e n/a 28 3758 3790 3829 N
+ P R AW i n/a 28 3759 3789 3826 N
+ P R AW s n/a 28 3758 3790 3826 N
+ P R AY b n/a 28 3758 3813 3831 N
+ P R AY e n/a 28 3758 3813 3832 N
+ P R AY s n/a 28 3758 3813 3832 N
+ P R B b n/a 28 3758 3815 3839 N
+ P R B e n/a 28 3758 3787 3839 N
+ P R B s n/a 28 3758 3787 3839 N
+ P R CH e n/a 28 3758 3787 3839 N
+ P R CH s n/a 28 3758 3787 3839 N
+ P R D b n/a 28 3758 3815 3839 N
+ P R D e n/a 28 3758 3787 3839 N
+ P R D s n/a 28 3758 3787 3839 N
+ P R DH e n/a 28 3758 3787 3839 N
+ P R DH s n/a 28 3758 3787 3839 N
+ P R EH b n/a 28 3758 3815 3828 N
+ P R EH e n/a 28 3758 3790 3829 N
+ P R EH i n/a 28 3759 3789 3828 N
+ P R EH s n/a 28 3758 3790 3828 N
+ P R ER b n/a 28 3758 3811 3851 N
+ P R ER e n/a 28 3758 3811 3849 N
+ P R ER i n/a 28 3759 3811 3849 N
+ P R ER s n/a 28 3758 3811 3849 N
+ P R EY b n/a 28 3758 3815 3827 N
+ P R EY e n/a 28 3758 3790 3829 N
+ P R EY i n/a 28 3759 3789 3827 N
+ P R EY s n/a 28 3758 3790 3827 N
+ P R F b n/a 28 3758 3815 3839 N
+ P R F e n/a 28 3758 3787 3839 N
+ P R F i n/a 28 3759 3787 3839 N
+ P R F s n/a 28 3758 3787 3839 N
+ P R G b n/a 28 3758 3815 3839 N
+ P R G e n/a 28 3758 3787 3839 N
+ P R G s n/a 28 3758 3787 3839 N
+ P R HH e n/a 28 3758 3787 3839 N
+ P R HH s n/a 28 3758 3787 3839 N
+ P R IH b n/a 28 3758 3817 3820 N
+ P R IH e n/a 28 3758 3790 3822 N
+ P R IH i n/a 28 3759 3788 3819 N
+ P R IH s n/a 28 3758 3790 3822 N
+ P R IY b n/a 28 3758 3817 3821 N
+ P R IY e n/a 28 3758 3790 3823 N
+ P R IY i n/a 28 3759 3788 3821 N
+ P R IY s n/a 28 3758 3790 3823 N
+ P R JH e n/a 28 3758 3787 3839 N
+ P R JH s n/a 28 3758 3787 3839 N
+ P R K b n/a 28 3758 3815 3839 N
+ P R K e n/a 28 3758 3787 3839 N
+ P R K s n/a 28 3758 3787 3839 N
+ P R L b n/a 28 3758 3810 3844 N
+ P R L e n/a 28 3758 3810 3844 N
+ P R L i n/a 28 3759 3810 3844 N
+ P R L s n/a 28 3758 3810 3844 N
+ P R M b n/a 28 3758 3815 3839 N
+ P R M e n/a 28 3758 3787 3839 N
+ P R M i n/a 28 3759 3787 3839 N
+ P R M s n/a 28 3758 3787 3839 N
+ P R N b n/a 28 3758 3815 3839 N
+ P R N e n/a 28 3758 3787 3839 N
+ P R N i n/a 28 3759 3787 3839 N
+ P R N s n/a 28 3758 3787 3839 N
+ P R NG e n/a 28 3758 3787 3839 N
+ P R NG s n/a 28 3758 3787 3839 N
+ P R OW b n/a 28 3758 3812 3832 N
+ P R OW e n/a 28 3758 3813 3832 N
+ P R OW i n/a 28 3759 3812 3832 N
+ P R OW s n/a 28 3758 3812 3832 N
+ P R OY b n/a 28 3758 3812 3835 N
+ P R OY e n/a 28 3758 3813 3834 N
+ P R OY i n/a 28 3759 3812 3835 N
+ P R OY s n/a 28 3758 3812 3835 N
+ P R P e n/a 28 3758 3787 3839 N
+ P R P s n/a 28 3758 3787 3839 N
+ P R R b n/a 28 3758 3811 3853 N
+ P R R e n/a 28 3758 3811 3852 N
+ P R R i n/a 28 3759 3811 3852 N
+ P R R s n/a 28 3758 3811 3852 N
+ P R S b n/a 28 3758 3815 3842 N
+ P R S e n/a 28 3758 3787 3842 N
+ P R S i n/a 28 3759 3787 3842 N
+ P R S s n/a 28 3758 3787 3842 N
+ P R SH b n/a 28 3758 3815 3843 N
+ P R SH e n/a 28 3758 3787 3843 N
+ P R SH i n/a 28 3759 3787 3843 N
+ P R SH s n/a 28 3758 3787 3843 N
+ P R SIL e n/a 28 3758 3787 3840 N
+ P R SIL s n/a 28 3758 3787 3840 N
+ P R T e n/a 28 3758 3787 3839 N
+ P R T i n/a 28 3759 3787 3839 N
+ P R T s n/a 28 3758 3787 3839 N
+ P R TH e n/a 28 3758 3787 3839 N
+ P R TH s n/a 28 3758 3787 3839 N
+ P R UH b n/a 28 3758 3811 3836 N
+ P R UH e n/a 28 3758 3811 3846 N
+ P R UH i n/a 28 3759 3811 3846 N
+ P R UH s n/a 28 3758 3811 3846 N
+ P R UW b n/a 28 3758 3812 3835 N
+ P R UW e n/a 28 3758 3813 3835 N
+ P R UW i n/a 28 3759 3812 3835 N
+ P R UW s n/a 28 3758 3812 3835 N
+ P R V b n/a 28 3758 3815 3839 N
+ P R V e n/a 28 3758 3787 3839 N
+ P R V s n/a 28 3758 3787 3839 N
+ P R W b n/a 28 3758 3809 3832 N
+ P R W e n/a 28 3758 3809 3846 N
+ P R W s n/a 28 3758 3809 3846 N
+ P R Y b n/a 28 3758 3817 3821 N
+ P R Y e n/a 28 3758 3790 3823 N
+ P R Y i n/a 28 3759 3788 3821 N
+ P R Y s n/a 28 3758 3790 3823 N
+ P R Z e n/a 28 3758 3787 3839 N
+ P R Z s n/a 28 3758 3787 3839 N
+ P R ZH e n/a 28 3758 3787 3839 N
+ P R ZH s n/a 28 3758 3787 3839 N
+ P S AA b n/a 28 3777 3806 3831 N
+ P S AA e n/a 28 3777 3803 3832 N
+ P S AA i n/a 28 3778 3803 3833 N
+ P S AA s n/a 28 3777 3803 3832 N
+ P S AE b n/a 28 3777 3815 3825 N
+ P S AE e n/a 28 3777 3796 3829 N
+ P S AE i n/a 28 3778 3796 3824 N
+ P S AE s n/a 28 3777 3796 3825 N
+ P S AH b n/a 28 3777 3816 3832 N
+ P S AH e n/a 28 3777 3796 3848 N
+ P S AH i n/a 28 3778 3796 3848 N
+ P S AH s n/a 28 3777 3796 3848 N
+ P S AO b n/a 28 3777 3806 3835 N
+ P S AO e n/a 28 3777 3804 3835 N
+ P S AO i n/a 28 3778 3804 3834 N
+ P S AO s n/a 28 3777 3804 3835 N
+ P S AW b n/a 28 3777 3815 3826 N
+ P S AW e n/a 28 3777 3796 3829 N
+ P S AW i n/a 28 3778 3796 3824 N
+ P S AW s n/a 28 3777 3796 3826 N
+ P S AY b n/a 28 3777 3806 3831 N
+ P S AY e n/a 28 3777 3803 3832 N
+ P S AY i n/a 28 3778 3803 3833 N
+ P S AY s n/a 28 3777 3803 3832 N
+ P S B b n/a 28 3777 3815 3839 N
+ P S B e n/a 28 3777 3796 3839 N
+ P S B s n/a 28 3777 3796 3839 N
+ P S CH e n/a 28 3777 3796 3839 N
+ P S CH s n/a 28 3777 3796 3839 N
+ P S D b n/a 28 3777 3815 3839 N
+ P S D e n/a 28 3777 3796 3839 N
+ P S D i n/a 28 3778 3796 3839 N
+ P S D s n/a 28 3777 3796 3839 N
+ P S DH e n/a 28 3777 3796 3839 N
+ P S DH s n/a 28 3777 3796 3839 N
+ P S EH b n/a 28 3777 3815 3828 N
+ P S EH e n/a 28 3777 3796 3829 N
+ P S EH i n/a 28 3778 3796 3824 N
+ P S EH s n/a 28 3777 3796 3828 N
+ P S ER b n/a 28 3777 3805 3851 N
+ P S ER e n/a 28 3777 3804 3850 N
+ P S ER i n/a 28 3778 3804 3850 N
+ P S ER s n/a 28 3777 3804 3850 N
+ P S EY b n/a 28 3777 3815 3827 N
+ P S EY e n/a 28 3777 3796 3829 N
+ P S EY i n/a 28 3778 3796 3824 N
+ P S EY s n/a 28 3777 3796 3827 N
+ P S F b n/a 28 3777 3815 3839 N
+ P S F e n/a 28 3777 3796 3839 N
+ P S F s n/a 28 3777 3796 3839 N
+ P S G b n/a 28 3777 3815 3839 N
+ P S G e n/a 28 3777 3796 3839 N
+ P S G s n/a 28 3777 3796 3839 N
+ P S HH e n/a 28 3777 3796 3839 N
+ P S HH s n/a 28 3777 3796 3839 N
+ P S IH b n/a 28 3777 3817 3820 N
+ P S IH e n/a 28 3777 3797 3822 N
+ P S IH i n/a 28 3778 3797 3822 N
+ P S IH s n/a 28 3777 3797 3822 N
+ P S IY b n/a 28 3777 3817 3821 N
+ P S IY e n/a 28 3777 3797 3823 N
+ P S IY i n/a 28 3778 3797 3823 N
+ P S IY s n/a 28 3777 3797 3823 N
+ P S JH e n/a 28 3777 3796 3839 N
+ P S JH s n/a 28 3777 3796 3839 N
+ P S K b n/a 28 3777 3815 3839 N
+ P S K e n/a 28 3777 3796 3839 N
+ P S K i n/a 28 3778 3796 3839 N
+ P S K s n/a 28 3777 3796 3839 N
+ P S L b n/a 28 3777 3806 3846 N
+ P S L e n/a 28 3777 3804 3846 N
+ P S L i n/a 28 3778 3804 3846 N
+ P S L s n/a 28 3777 3804 3846 N
+ P S M b n/a 28 3777 3815 3839 N
+ P S M e n/a 28 3777 3796 3839 N
+ P S M s n/a 28 3777 3796 3839 N
+ P S N b n/a 28 3777 3815 3839 N
+ P S N e n/a 28 3777 3796 3839 N
+ P S N i n/a 28 3778 3796 3839 N
+ P S N s n/a 28 3777 3796 3839 N
+ P S NG e n/a 28 3777 3796 3839 N
+ P S NG s n/a 28 3777 3796 3839 N
+ P S OW b n/a 28 3777 3806 3835 N
+ P S OW e n/a 28 3777 3803 3835 N
+ P S OW i n/a 28 3778 3803 3833 N
+ P S OW s n/a 28 3777 3803 3835 N
+ P S OY b n/a 28 3777 3806 3835 N
+ P S OY e n/a 28 3777 3804 3835 N
+ P S OY i n/a 28 3778 3804 3834 N
+ P S OY s n/a 28 3777 3804 3835 N
+ P S P e n/a 28 3777 3796 3839 N
+ P S P s n/a 28 3777 3796 3839 N
+ P S R b n/a 28 3777 3805 3853 N
+ P S R e n/a 28 3777 3804 3850 N
+ P S R i n/a 28 3778 3804 3850 N
+ P S R s n/a 28 3777 3804 3850 N
+ P S S b n/a 28 3777 3815 3842 N
+ P S S e n/a 28 3777 3796 3842 N
+ P S S i n/a 28 3778 3796 3842 N
+ P S S s n/a 28 3777 3796 3842 N
+ P S SH b n/a 28 3777 3815 3843 N
+ P S SH e n/a 28 3777 3796 3843 N
+ P S SH s n/a 28 3777 3796 3843 N
+ P S SIL e n/a 28 3777 3796 3840 N
+ P S SIL s n/a 28 3777 3796 3840 N
+ P S T e n/a 28 3777 3796 3839 N
+ P S T i n/a 28 3778 3796 3839 N
+ P S T s n/a 28 3777 3796 3839 N
+ P S TH e n/a 28 3777 3796 3839 N
+ P S TH s n/a 28 3777 3796 3839 N
+ P S UH b n/a 28 3777 3805 3836 N
+ P S UH e n/a 28 3777 3804 3846 N
+ P S UH i n/a 28 3778 3804 3846 N
+ P S UH s n/a 28 3777 3804 3846 N
+ P S UW b n/a 28 3777 3806 3835 N
+ P S UW e n/a 28 3777 3804 3835 N
+ P S UW i n/a 28 3778 3804 3834 N
+ P S UW s n/a 28 3777 3804 3835 N
+ P S V b n/a 28 3777 3815 3839 N
+ P S V e n/a 28 3777 3796 3839 N
+ P S V s n/a 28 3777 3796 3839 N
+ P S W b n/a 28 3777 3805 3836 N
+ P S W e n/a 28 3777 3804 3846 N
+ P S W s n/a 28 3777 3804 3846 N
+ P S Y b n/a 28 3777 3817 3821 N
+ P S Y e n/a 28 3777 3797 3823 N
+ P S Y i n/a 28 3778 3797 3823 N
+ P S Y s n/a 28 3777 3797 3823 N
+ P S Z e n/a 28 3777 3796 3839 N
+ P S Z s n/a 28 3777 3796 3839 N
+ P S ZH e n/a 28 3777 3796 3839 N
+ P S ZH s n/a 28 3777 3796 3839 N
+ P SH AA b n/a 28 3777 3806 3831 N
+ P SH AA i n/a 28 3778 3803 3834 N
+ P SH AA s n/a 28 3777 3803 3832 N
+ P SH AE b n/a 28 3777 3815 3825 N
+ P SH AE i n/a 28 3778 3796 3824 N
+ P SH AE s n/a 28 3777 3796 3825 N
+ P SH AH b n/a 28 3777 3816 3832 N
+ P SH AH i n/a 28 3778 3796 3848 N
+ P SH AH s n/a 28 3777 3796 3848 N
+ P SH AO b n/a 28 3777 3806 3835 N
+ P SH AO s n/a 28 3777 3804 3835 N
+ P SH AW b n/a 28 3777 3815 3826 N
+ P SH AW s n/a 28 3777 3796 3826 N
+ P SH AY b n/a 28 3777 3806 3831 N
+ P SH AY s n/a 28 3777 3803 3832 N
+ P SH B b n/a 28 3777 3815 3839 N
+ P SH B s n/a 28 3777 3796 3839 N
+ P SH CH s n/a 28 3777 3796 3839 N
+ P SH D b n/a 28 3777 3815 3839 N
+ P SH D s n/a 28 3777 3796 3839 N
+ P SH DH s n/a 28 3777 3796 3839 N
+ P SH EH b n/a 28 3777 3815 3828 N
+ P SH EH s n/a 28 3777 3796 3828 N
+ P SH ER b n/a 28 3777 3805 3851 N
+ P SH ER s n/a 28 3777 3804 3850 N
+ P SH EY b n/a 28 3777 3815 3827 N
+ P SH EY s n/a 28 3777 3796 3827 N
+ P SH F b n/a 28 3777 3815 3839 N
+ P SH F s n/a 28 3777 3796 3839 N
+ P SH G b n/a 28 3777 3815 3839 N
+ P SH G s n/a 28 3777 3796 3839 N
+ P SH HH s n/a 28 3777 3796 3839 N
+ P SH IH b n/a 28 3777 3817 3820 N
+ P SH IH s n/a 28 3777 3797 3822 N
+ P SH IY b n/a 28 3777 3817 3821 N
+ P SH IY i n/a 28 3778 3797 3823 N
+ P SH IY s n/a 28 3777 3797 3823 N
+ P SH JH s n/a 28 3777 3796 3839 N
+ P SH K b n/a 28 3777 3815 3839 N
+ P SH K s n/a 28 3777 3796 3839 N
+ P SH L b n/a 28 3777 3806 3846 N
+ P SH L i n/a 28 3778 3804 3846 N
+ P SH L s n/a 28 3777 3804 3846 N
+ P SH M b n/a 28 3777 3815 3839 N
+ P SH M s n/a 28 3777 3796 3839 N
+ P SH N b n/a 28 3777 3815 3839 N
+ P SH N s n/a 28 3777 3796 3839 N
+ P SH NG s n/a 28 3777 3796 3839 N
+ P SH OW b n/a 28 3777 3806 3835 N
+ P SH OW s n/a 28 3777 3803 3835 N
+ P SH OY b n/a 28 3777 3806 3835 N
+ P SH OY i n/a 28 3778 3804 3834 N
+ P SH OY s n/a 28 3777 3804 3835 N
+ P SH P s n/a 28 3777 3796 3839 N
+ P SH R b n/a 28 3777 3805 3853 N
+ P SH R s n/a 28 3777 3804 3850 N
+ P SH S b n/a 28 3777 3815 3842 N
+ P SH S s n/a 28 3777 3796 3842 N
+ P SH SH b n/a 28 3777 3815 3843 N
+ P SH SH s n/a 28 3777 3796 3843 N
+ P SH SIL s n/a 28 3777 3796 3840 N
+ P SH T s n/a 28 3777 3796 3839 N
+ P SH TH s n/a 28 3777 3796 3839 N
+ P SH UH b n/a 28 3777 3805 3836 N
+ P SH UH s n/a 28 3777 3804 3846 N
+ P SH UW b n/a 28 3777 3806 3835 N
+ P SH UW s n/a 28 3777 3804 3835 N
+ P SH V b n/a 28 3777 3815 3839 N
+ P SH V s n/a 28 3777 3796 3839 N
+ P SH W b n/a 28 3777 3805 3836 N
+ P SH W s n/a 28 3777 3804 3846 N
+ P SH Y b n/a 28 3777 3817 3821 N
+ P SH Y s n/a 28 3777 3797 3823 N
+ P SH Z s n/a 28 3777 3796 3839 N
+ P SH ZH s n/a 28 3777 3796 3839 N
+ P SIL AA b n/a 28 3781 3798 3831 N
+ P SIL AA s n/a 28 3781 3798 3832 N
+ P SIL AE b n/a 28 3781 3814 3825 N
+ P SIL AE s n/a 28 3781 3790 3825 N
+ P SIL AH b n/a 28 3781 3816 3832 N
+ P SIL AH s n/a 28 3781 3790 3848 N
+ P SIL AO b n/a 28 3781 3799 3835 N
+ P SIL AO s n/a 28 3781 3799 3835 N
+ P SIL AW b n/a 28 3781 3814 3826 N
+ P SIL AW s n/a 28 3781 3790 3826 N
+ P SIL AY b n/a 28 3781 3798 3831 N
+ P SIL AY s n/a 28 3781 3798 3832 N
+ P SIL B b n/a 28 3781 3814 3839 N
+ P SIL B s n/a 28 3781 3786 3839 N
+ P SIL CH s n/a 28 3781 3786 3839 N
+ P SIL D b n/a 28 3781 3814 3839 N
+ P SIL D s n/a 28 3781 3786 3839 N
+ P SIL DH s n/a 28 3781 3786 3839 N
+ P SIL EH b n/a 28 3781 3814 3828 N
+ P SIL EH s n/a 28 3781 3790 3828 N
+ P SIL ER b n/a 28 3781 3801 3851 N
+ P SIL ER s n/a 28 3781 3801 3849 N
+ P SIL EY b n/a 28 3781 3814 3827 N
+ P SIL EY s n/a 28 3781 3790 3827 N
+ P SIL F b n/a 28 3781 3814 3839 N
+ P SIL F s n/a 28 3781 3786 3839 N
+ P SIL G b n/a 28 3781 3814 3839 N
+ P SIL G s n/a 28 3781 3786 3839 N
+ P SIL HH s n/a 28 3781 3786 3839 N
+ P SIL IH b n/a 28 3781 3818 3820 N
+ P SIL IH s n/a 28 3781 3790 3822 N
+ P SIL IY b n/a 28 3781 3818 3821 N
+ P SIL IY s n/a 28 3781 3790 3823 N
+ P SIL JH s n/a 28 3781 3786 3839 N
+ P SIL K b n/a 28 3781 3814 3839 N
+ P SIL K s n/a 28 3781 3786 3839 N
+ P SIL L b n/a 28 3781 3800 3844 N
+ P SIL L s n/a 28 3781 3800 3844 N
+ P SIL M b n/a 28 3781 3814 3839 N
+ P SIL M s n/a 28 3781 3786 3839 N
+ P SIL N b n/a 28 3781 3814 3839 N
+ P SIL N s n/a 28 3781 3786 3839 N
+ P SIL NG s n/a 28 3781 3786 3839 N
+ P SIL OW b n/a 28 3781 3799 3832 N
+ P SIL OW s n/a 28 3781 3799 3832 N
+ P SIL OY b n/a 28 3781 3799 3835 N
+ P SIL OY s n/a 28 3781 3799 3835 N
+ P SIL P s n/a 28 3781 3786 3839 N
+ P SIL R b n/a 28 3781 3801 3853 N
+ P SIL R s n/a 28 3781 3801 3853 N
+ P SIL S b n/a 28 3781 3814 3842 N
+ P SIL S s n/a 28 3781 3786 3842 N
+ P SIL SH b n/a 28 3781 3814 3843 N
+ P SIL SH s n/a 28 3781 3786 3843 N
+ P SIL SIL s n/a 28 3781 3787 3840 N
+ P SIL T s n/a 28 3781 3786 3839 N
+ P SIL TH s n/a 28 3781 3786 3839 N
+ P SIL UH b n/a 28 3781 3799 3836 N
+ P SIL UH s n/a 28 3781 3799 3846 N
+ P SIL UW b n/a 28 3781 3799 3835 N
+ P SIL UW s n/a 28 3781 3799 3835 N
+ P SIL V b n/a 28 3781 3814 3839 N
+ P SIL V s n/a 28 3781 3786 3839 N
+ P SIL W b n/a 28 3781 3800 3832 N
+ P SIL W s n/a 28 3781 3800 3846 N
+ P SIL Y b n/a 28 3781 3818 3821 N
+ P SIL Y s n/a 28 3781 3790 3823 N
+ P SIL Z s n/a 28 3781 3786 3839 N
+ P SIL ZH s n/a 28 3781 3786 3839 N
+ P T AA b n/a 28 3779 3798 3831 N
+ P T AA i n/a 28 3779 3798 3831 N
+ P T AA s n/a 28 3779 3798 3832 N
+ P T AE b n/a 28 3779 3814 3825 N
+ P T AE i n/a 28 3779 3789 3825 N
+ P T AE s n/a 28 3779 3790 3825 N
+ P T AH b n/a 28 3779 3816 3832 N
+ P T AH i n/a 28 3779 3790 3848 N
+ P T AH s n/a 28 3779 3790 3848 N
+ P T AO b n/a 28 3779 3799 3835 N
+ P T AO i n/a 28 3779 3799 3835 N
+ P T AO s n/a 28 3779 3799 3835 N
+ P T AW b n/a 28 3779 3814 3826 N
+ P T AW i n/a 28 3779 3789 3826 N
+ P T AW s n/a 28 3779 3790 3826 N
+ P T AY b n/a 28 3779 3798 3831 N
+ P T AY i n/a 28 3779 3798 3831 N
+ P T AY s n/a 28 3779 3798 3832 N
+ P T B b n/a 28 3779 3814 3839 N
+ P T B s n/a 28 3779 3786 3839 N
+ P T CH s n/a 28 3779 3786 3839 N
+ P T D b n/a 28 3779 3814 3839 N
+ P T D s n/a 28 3779 3786 3839 N
+ P T DH s n/a 28 3779 3786 3839 N
+ P T EH b n/a 28 3779 3814 3828 N
+ P T EH i n/a 28 3779 3789 3828 N
+ P T EH s n/a 28 3779 3790 3828 N
+ P T ER b n/a 28 3779 3801 3851 N
+ P T ER i n/a 28 3779 3801 3849 N
+ P T ER s n/a 28 3779 3801 3849 N
+ P T EY b n/a 28 3779 3814 3827 N
+ P T EY i n/a 28 3779 3789 3827 N
+ P T EY s n/a 28 3779 3790 3827 N
+ P T F b n/a 28 3779 3814 3839 N
+ P T F s n/a 28 3779 3786 3839 N
+ P T G b n/a 28 3779 3814 3839 N
+ P T G s n/a 28 3779 3786 3839 N
+ P T HH s n/a 28 3779 3786 3839 N
+ P T IH b n/a 28 3780 3817 3820 N
+ P T IH i n/a 28 3780 3788 3820 N
+ P T IH s n/a 28 3780 3790 3822 N
+ P T IY b n/a 28 3779 3818 3821 N
+ P T IY i n/a 28 3779 3788 3821 N
+ P T IY s n/a 28 3779 3790 3823 N
+ P T JH s n/a 28 3779 3786 3839 N
+ P T K b n/a 28 3779 3814 3839 N
+ P T K s n/a 28 3779 3786 3839 N
+ P T L b n/a 28 3779 3800 3844 N
+ P T L i n/a 28 3779 3800 3844 N
+ P T L s n/a 28 3779 3800 3844 N
+ P T M b n/a 28 3779 3814 3839 N
+ P T M s n/a 28 3779 3786 3839 N
+ P T N b n/a 28 3779 3814 3839 N
+ P T N s n/a 28 3779 3786 3839 N
+ P T NG s n/a 28 3779 3786 3839 N
+ P T OW b n/a 28 3779 3799 3832 N
+ P T OW i n/a 28 3779 3799 3832 N
+ P T OW s n/a 28 3779 3799 3832 N
+ P T OY b n/a 28 3779 3799 3835 N
+ P T OY s n/a 28 3779 3799 3835 N
+ P T P s n/a 28 3779 3786 3839 N
+ P T R b n/a 28 3779 3801 3853 N
+ P T R i n/a 28 3779 3801 3853 N
+ P T R s n/a 28 3779 3801 3853 N
+ P T S b n/a 28 3779 3814 3842 N
+ P T S s n/a 28 3779 3786 3842 N
+ P T SH b n/a 28 3779 3814 3843 N
+ P T SH s n/a 28 3779 3786 3843 N
+ P T SIL s n/a 28 3779 3787 3840 N
+ P T T s n/a 28 3779 3786 3839 N
+ P T TH s n/a 28 3779 3786 3839 N
+ P T UH b n/a 28 3779 3799 3836 N
+ P T UH i n/a 28 3779 3799 3846 N
+ P T UH s n/a 28 3779 3799 3846 N
+ P T UW b n/a 28 3779 3799 3835 N
+ P T UW i n/a 28 3779 3799 3835 N
+ P T UW s n/a 28 3779 3799 3835 N
+ P T V b n/a 28 3779 3814 3839 N
+ P T V s n/a 28 3779 3786 3839 N
+ P T W b n/a 28 3779 3800 3832 N
+ P T W s n/a 28 3779 3800 3846 N
+ P T Y b n/a 28 3779 3818 3821 N
+ P T Y i n/a 28 3779 3788 3821 N
+ P T Y s n/a 28 3779 3790 3823 N
+ P T Z s n/a 28 3779 3786 3839 N
+ P T ZH s n/a 28 3779 3786 3839 N
+ P TH AA b n/a 28 3780 3806 3831 N
+ P TH AA i n/a 28 3780 3803 3831 N
+ P TH AA s n/a 28 3780 3803 3832 N
+ P TH AE b n/a 28 3780 3815 3825 N
+ P TH AE s n/a 28 3780 3790 3825 N
+ P TH AH b n/a 28 3780 3816 3832 N
+ P TH AH s n/a 28 3780 3790 3848 N
+ P TH AO b n/a 28 3780 3806 3835 N
+ P TH AO i n/a 28 3780 3804 3835 N
+ P TH AO s n/a 28 3780 3804 3835 N
+ P TH AW b n/a 28 3780 3815 3826 N
+ P TH AW s n/a 28 3780 3790 3826 N
+ P TH AY b n/a 28 3780 3806 3831 N
+ P TH AY s n/a 28 3780 3803 3832 N
+ P TH B b n/a 28 3780 3815 3839 N
+ P TH B s n/a 28 3780 3786 3839 N
+ P TH CH s n/a 28 3780 3786 3839 N
+ P TH D b n/a 28 3780 3815 3839 N
+ P TH D s n/a 28 3780 3786 3839 N
+ P TH DH s n/a 28 3780 3786 3839 N
+ P TH EH b n/a 28 3780 3815 3828 N
+ P TH EH s n/a 28 3780 3790 3828 N
+ P TH ER b n/a 28 3780 3805 3851 N
+ P TH ER s n/a 28 3780 3804 3850 N
+ P TH EY b n/a 28 3780 3815 3827 N
+ P TH EY i n/a 28 3780 3789 3827 N
+ P TH EY s n/a 28 3780 3790 3827 N
+ P TH F b n/a 28 3780 3815 3839 N
+ P TH F s n/a 28 3780 3786 3839 N
+ P TH G b n/a 28 3780 3815 3839 N
+ P TH G s n/a 28 3780 3786 3839 N
+ P TH HH s n/a 28 3780 3786 3839 N
+ P TH IH b n/a 28 3780 3817 3820 N
+ P TH IH i n/a 28 3780 3788 3820 N
+ P TH IH s n/a 28 3780 3790 3822 N
+ P TH IY b n/a 28 3780 3817 3821 N
+ P TH IY i n/a 28 3780 3788 3821 N
+ P TH IY s n/a 28 3780 3790 3823 N
+ P TH JH s n/a 28 3780 3786 3839 N
+ P TH K b n/a 28 3780 3815 3839 N
+ P TH K s n/a 28 3780 3786 3839 N
+ P TH L b n/a 28 3780 3806 3844 N
+ P TH L i n/a 28 3780 3804 3844 N
+ P TH L s n/a 28 3780 3804 3844 N
+ P TH M b n/a 28 3780 3815 3839 N
+ P TH M s n/a 28 3780 3786 3839 N
+ P TH N b n/a 28 3780 3815 3839 N
+ P TH N s n/a 28 3780 3786 3839 N
+ P TH NG s n/a 28 3780 3786 3839 N
+ P TH OW b n/a 28 3780 3806 3832 N
+ P TH OW s n/a 28 3780 3803 3832 N
+ P TH OY b n/a 28 3780 3806 3835 N
+ P TH OY s n/a 28 3780 3804 3835 N
+ P TH P s n/a 28 3780 3786 3839 N
+ P TH R b n/a 28 3780 3805 3853 N
+ P TH R s n/a 28 3780 3804 3853 N
+ P TH S b n/a 28 3780 3815 3842 N
+ P TH S s n/a 28 3780 3786 3842 N
+ P TH SH b n/a 28 3780 3815 3843 N
+ P TH SH s n/a 28 3780 3786 3843 N
+ P TH SIL s n/a 28 3780 3787 3840 N
+ P TH T s n/a 28 3780 3786 3839 N
+ P TH TH s n/a 28 3780 3786 3839 N
+ P TH UH b n/a 28 3780 3805 3836 N
+ P TH UH s n/a 28 3780 3804 3846 N
+ P TH UW b n/a 28 3780 3806 3835 N
+ P TH UW s n/a 28 3780 3804 3835 N
+ P TH V b n/a 28 3780 3815 3839 N
+ P TH V s n/a 28 3780 3786 3839 N
+ P TH W b n/a 28 3780 3805 3832 N
+ P TH W s n/a 28 3780 3804 3846 N
+ P TH Y b n/a 28 3780 3817 3821 N
+ P TH Y s n/a 28 3780 3790 3823 N
+ P TH Z s n/a 28 3780 3786 3839 N
+ P TH ZH s n/a 28 3780 3786 3839 N
+ P UH AA b n/a 28 3765 3812 3831 N
+ P UH AA s n/a 28 3765 3812 3832 N
+ P UH AE b n/a 28 3765 3815 3825 N
+ P UH AE s n/a 28 3765 3792 3825 N
+ P UH AH b n/a 28 3765 3816 3832 N
+ P UH AH s n/a 28 3765 3792 3848 N
+ P UH AO b n/a 28 3765 3812 3835 N
+ P UH AO s n/a 28 3765 3812 3835 N
+ P UH AW b n/a 28 3765 3815 3826 N
+ P UH AW s n/a 28 3765 3792 3826 N
+ P UH AY b n/a 28 3765 3812 3831 N
+ P UH AY s n/a 28 3765 3812 3832 N
+ P UH B b n/a 28 3765 3815 3839 N
+ P UH B s n/a 28 3765 3795 3839 N
+ P UH CH s n/a 28 3765 3795 3839 N
+ P UH D b n/a 28 3765 3815 3839 N
+ P UH D i n/a 28 3765 3795 3839 N
+ P UH D s n/a 28 3765 3795 3839 N
+ P UH DH s n/a 28 3765 3795 3839 N
+ P UH EH b n/a 28 3765 3815 3828 N
+ P UH EH s n/a 28 3765 3792 3828 N
+ P UH ER b n/a 28 3765 3811 3851 N
+ P UH ER i n/a 28 3765 3811 3849 N
+ P UH ER s n/a 28 3765 3811 3849 N
+ P UH EY b n/a 28 3765 3815 3827 N
+ P UH EY s n/a 28 3765 3792 3827 N
+ P UH F b n/a 28 3765 3815 3839 N
+ P UH F s n/a 28 3765 3795 3839 N
+ P UH G b n/a 28 3765 3815 3839 N
+ P UH G s n/a 28 3765 3795 3839 N
+ P UH HH s n/a 28 3765 3795 3839 N
+ P UH IH b n/a 28 3765 3817 3820 N
+ P UH IH s n/a 28 3765 3792 3822 N
+ P UH IY b n/a 28 3765 3817 3821 N
+ P UH IY s n/a 28 3765 3792 3823 N
+ P UH JH s n/a 28 3765 3795 3839 N
+ P UH K b n/a 28 3765 3815 3839 N
+ P UH K s n/a 28 3765 3795 3839 N
+ P UH L b n/a 28 3765 3810 3844 N
+ P UH L s n/a 28 3765 3810 3844 N
+ P UH M b n/a 28 3765 3815 3839 N
+ P UH M s n/a 28 3765 3795 3839 N
+ P UH N b n/a 28 3765 3815 3839 N
+ P UH N s n/a 28 3765 3795 3839 N
+ P UH NG s n/a 28 3765 3795 3839 N
+ P UH OW b n/a 28 3765 3812 3832 N
+ P UH OW s n/a 28 3765 3812 3832 N
+ P UH OY b n/a 28 3765 3812 3835 N
+ P UH OY s n/a 28 3765 3812 3835 N
+ P UH P s n/a 28 3765 3795 3839 N
+ P UH R b n/a 28 3765 3811 3853 N
+ P UH R s n/a 28 3765 3811 3852 N
+ P UH S b n/a 28 3765 3815 3842 N
+ P UH S s n/a 28 3765 3795 3842 N
+ P UH SH b n/a 28 3765 3815 3843 N
+ P UH SH s n/a 28 3765 3795 3843 N
+ P UH SIL s n/a 28 3765 3795 3841 N
+ P UH T i n/a 28 3765 3795 3839 N
+ P UH T s n/a 28 3765 3795 3839 N
+ P UH TH s n/a 28 3765 3795 3839 N
+ P UH UH b n/a 28 3765 3811 3836 N
+ P UH UH s n/a 28 3765 3811 3846 N
+ P UH UW b n/a 28 3765 3812 3835 N
+ P UH UW s n/a 28 3765 3812 3835 N
+ P UH V b n/a 28 3765 3815 3839 N
+ P UH V s n/a 28 3765 3795 3839 N
+ P UH W b n/a 28 3765 3809 3832 N
+ P UH W s n/a 28 3765 3809 3846 N
+ P UH Y b n/a 28 3765 3817 3821 N
+ P UH Y s n/a 28 3765 3792 3823 N
+ P UH Z s n/a 28 3765 3795 3839 N
+ P UH ZH s n/a 28 3765 3795 3839 N
+ P UW AA b n/a 28 3765 3813 3831 N
+ P UW AA e n/a 28 3765 3813 3832 N
+ P UW AA i n/a 28 3765 3813 3831 N
+ P UW AA s n/a 28 3765 3813 3832 N
+ P UW AE b n/a 28 3765 3815 3825 N
+ P UW AE e n/a 28 3765 3794 3829 N
+ P UW AE i n/a 28 3765 3794 3825 N
+ P UW AE s n/a 28 3765 3794 3825 N
+ P UW AH b n/a 28 3765 3816 3832 N
+ P UW AH e n/a 28 3765 3794 3848 N
+ P UW AH i n/a 28 3765 3793 3848 N
+ P UW AH s n/a 28 3765 3794 3848 N
+ P UW AO b n/a 28 3765 3812 3835 N
+ P UW AO e n/a 28 3765 3813 3834 N
+ P UW AO i n/a 28 3765 3812 3835 N
+ P UW AO s n/a 28 3765 3812 3835 N
+ P UW AW b n/a 28 3765 3815 3826 N
+ P UW AW e n/a 28 3765 3794 3829 N
+ P UW AW s n/a 28 3765 3794 3826 N
+ P UW AY b n/a 28 3765 3813 3831 N
+ P UW AY e n/a 28 3765 3813 3832 N
+ P UW AY i n/a 28 3765 3813 3831 N
+ P UW AY s n/a 28 3765 3813 3832 N
+ P UW B b n/a 28 3765 3815 3839 N
+ P UW B e n/a 28 3765 3794 3839 N
+ P UW B s n/a 28 3765 3794 3839 N
+ P UW CH e n/a 28 3765 3794 3839 N
+ P UW CH s n/a 28 3765 3794 3839 N
+ P UW D b n/a 28 3765 3815 3839 N
+ P UW D e n/a 28 3765 3794 3839 N
+ P UW D i n/a 28 3765 3794 3839 N
+ P UW D s n/a 28 3765 3794 3839 N
+ P UW DH e n/a 28 3765 3794 3839 N
+ P UW DH s n/a 28 3765 3794 3839 N
+ P UW EH b n/a 28 3765 3815 3828 N
+ P UW EH e n/a 28 3765 3794 3829 N
+ P UW EH i n/a 28 3765 3794 3828 N
+ P UW EH s n/a 28 3765 3794 3828 N
+ P UW ER b n/a 28 3765 3807 3851 N
+ P UW ER e n/a 28 3765 3807 3850 N
+ P UW ER i n/a 28 3765 3807 3850 N
+ P UW ER s n/a 28 3765 3807 3850 N
+ P UW EY b n/a 28 3765 3815 3827 N
+ P UW EY e n/a 28 3765 3794 3829 N
+ P UW EY i n/a 28 3765 3794 3827 N
+ P UW EY s n/a 28 3765 3794 3827 N
+ P UW F b n/a 28 3765 3815 3839 N
+ P UW F e n/a 28 3765 3794 3839 N
+ P UW F s n/a 28 3765 3794 3839 N
+ P UW G b n/a 28 3765 3815 3839 N
+ P UW G e n/a 28 3765 3794 3839 N
+ P UW G s n/a 28 3765 3794 3839 N
+ P UW HH e n/a 28 3765 3794 3839 N
+ P UW HH i n/a 28 3765 3794 3839 N
+ P UW HH s n/a 28 3765 3794 3839 N
+ P UW IH b n/a 28 3765 3817 3820 N
+ P UW IH e n/a 28 3765 3794 3822 N
+ P UW IH i n/a 28 3765 3794 3820 N
+ P UW IH s n/a 28 3765 3794 3822 N
+ P UW IY b n/a 28 3765 3817 3821 N
+ P UW IY e n/a 28 3765 3794 3823 N
+ P UW IY i n/a 28 3765 3794 3821 N
+ P UW IY s n/a 28 3765 3794 3823 N
+ P UW JH e n/a 28 3765 3794 3839 N
+ P UW JH s n/a 28 3765 3794 3839 N
+ P UW K b n/a 28 3765 3815 3839 N
+ P UW K e n/a 28 3765 3794 3839 N
+ P UW K i n/a 28 3765 3794 3839 N
+ P UW K s n/a 28 3765 3794 3839 N
+ P UW L b n/a 28 3765 3807 3844 N
+ P UW L e n/a 28 3765 3807 3844 N
+ P UW L i n/a 28 3765 3807 3844 N
+ P UW L s n/a 28 3765 3807 3844 N
+ P UW M b n/a 28 3765 3815 3839 N
+ P UW M e n/a 28 3765 3794 3839 N
+ P UW M i n/a 28 3765 3794 3839 N
+ P UW M s n/a 28 3765 3794 3839 N
+ P UW N b n/a 28 3765 3815 3839 N
+ P UW N e n/a 28 3765 3794 3839 N
+ P UW N s n/a 28 3765 3794 3839 N
+ P UW NG e n/a 28 3765 3794 3839 N
+ P UW NG s n/a 28 3765 3794 3839 N
+ P UW OW b n/a 28 3765 3812 3832 N
+ P UW OW e n/a 28 3765 3813 3832 N
+ P UW OW i n/a 28 3765 3812 3832 N
+ P UW OW s n/a 28 3765 3812 3832 N
+ P UW OY b n/a 28 3765 3812 3835 N
+ P UW OY e n/a 28 3765 3813 3834 N
+ P UW OY i n/a 28 3765 3812 3835 N
+ P UW OY s n/a 28 3765 3812 3835 N
+ P UW P e n/a 28 3765 3794 3839 N
+ P UW P s n/a 28 3765 3794 3839 N
+ P UW R b n/a 28 3765 3807 3853 N
+ P UW R e n/a 28 3765 3807 3853 N
+ P UW R i n/a 28 3765 3807 3853 N
+ P UW R s n/a 28 3765 3807 3853 N
+ P UW S b n/a 28 3765 3815 3842 N
+ P UW S e n/a 28 3765 3794 3842 N
+ P UW S i n/a 28 3765 3794 3842 N
+ P UW S s n/a 28 3765 3794 3842 N
+ P UW SH b n/a 28 3765 3815 3843 N
+ P UW SH e n/a 28 3765 3794 3843 N
+ P UW SH s n/a 28 3765 3794 3843 N
+ P UW SIL e n/a 28 3765 3794 3841 N
+ P UW SIL s n/a 28 3765 3794 3841 N
+ P UW T e n/a 28 3765 3794 3839 N
+ P UW T i n/a 28 3765 3794 3839 N
+ P UW T s n/a 28 3765 3794 3839 N
+ P UW TH e n/a 28 3765 3794 3839 N
+ P UW TH s n/a 28 3765 3794 3839 N
+ P UW UH b n/a 28 3765 3807 3836 N
+ P UW UH e n/a 28 3765 3807 3846 N
+ P UW UH i n/a 28 3765 3807 3846 N
+ P UW UH s n/a 28 3765 3807 3846 N
+ P UW UW b n/a 28 3765 3812 3835 N
+ P UW UW e n/a 28 3765 3813 3835 N
+ P UW UW i n/a 28 3765 3812 3835 N
+ P UW UW s n/a 28 3765 3812 3835 N
+ P UW V b n/a 28 3765 3815 3839 N
+ P UW V e n/a 28 3765 3794 3839 N
+ P UW V s n/a 28 3765 3794 3839 N
+ P UW W b n/a 28 3765 3807 3832 N
+ P UW W e n/a 28 3765 3807 3846 N
+ P UW W i n/a 28 3765 3807 3846 N
+ P UW W s n/a 28 3765 3807 3846 N
+ P UW Y b n/a 28 3765 3817 3821 N
+ P UW Y e n/a 28 3765 3794 3823 N
+ P UW Y i n/a 28 3765 3794 3821 N
+ P UW Y s n/a 28 3765 3794 3823 N
+ P UW Z e n/a 28 3765 3794 3839 N
+ P UW Z s n/a 28 3765 3794 3839 N
+ P UW ZH e n/a 28 3765 3794 3839 N
+ P UW ZH s n/a 28 3765 3794 3839 N
+ P V AA b n/a 28 3780 3806 3831 N
+ P V AA s n/a 28 3780 3803 3832 N
+ P V AE b n/a 28 3780 3815 3825 N
+ P V AE s n/a 28 3780 3790 3825 N
+ P V AH b n/a 28 3780 3816 3832 N
+ P V AH i n/a 28 3780 3790 3848 N
+ P V AH s n/a 28 3780 3790 3848 N
+ P V AO b n/a 28 3780 3806 3835 N
+ P V AO i n/a 28 3780 3804 3835 N
+ P V AO s n/a 28 3780 3804 3835 N
+ P V AW b n/a 28 3780 3815 3826 N
+ P V AW s n/a 28 3780 3790 3826 N
+ P V AY b n/a 28 3780 3806 3831 N
+ P V AY s n/a 28 3780 3803 3832 N
+ P V B b n/a 28 3780 3815 3839 N
+ P V B s n/a 28 3780 3786 3839 N
+ P V CH s n/a 28 3780 3786 3839 N
+ P V D b n/a 28 3780 3815 3839 N
+ P V D s n/a 28 3780 3786 3839 N
+ P V DH s n/a 28 3780 3786 3839 N
+ P V EH b n/a 28 3780 3815 3828 N
+ P V EH s n/a 28 3780 3790 3828 N
+ P V ER b n/a 28 3780 3805 3851 N
+ P V ER s n/a 28 3780 3804 3850 N
+ P V EY b n/a 28 3780 3815 3827 N
+ P V EY s n/a 28 3780 3790 3827 N
+ P V F b n/a 28 3780 3815 3839 N
+ P V F s n/a 28 3780 3786 3839 N
+ P V G b n/a 28 3780 3815 3839 N
+ P V G s n/a 28 3780 3786 3839 N
+ P V HH s n/a 28 3780 3786 3839 N
+ P V IH b n/a 28 3780 3817 3820 N
+ P V IH s n/a 28 3780 3790 3822 N
+ P V IY b n/a 28 3780 3817 3821 N
+ P V IY i n/a 28 3780 3788 3821 N
+ P V IY s n/a 28 3780 3790 3823 N
+ P V JH s n/a 28 3780 3786 3839 N
+ P V K b n/a 28 3780 3815 3839 N
+ P V K s n/a 28 3780 3786 3839 N
+ P V L b n/a 28 3780 3806 3844 N
+ P V L s n/a 28 3780 3804 3844 N
+ P V M b n/a 28 3780 3815 3839 N
+ P V M s n/a 28 3780 3786 3839 N
+ P V N b n/a 28 3780 3815 3839 N
+ P V N s n/a 28 3780 3786 3839 N
+ P V NG s n/a 28 3780 3786 3839 N
+ P V OW b n/a 28 3780 3806 3832 N
+ P V OW s n/a 28 3780 3803 3832 N
+ P V OY b n/a 28 3780 3806 3835 N
+ P V OY s n/a 28 3780 3804 3835 N
+ P V P s n/a 28 3780 3786 3839 N
+ P V R b n/a 28 3780 3805 3853 N
+ P V R s n/a 28 3780 3804 3853 N
+ P V S b n/a 28 3780 3815 3842 N
+ P V S i n/a 28 3780 3786 3842 N
+ P V S s n/a 28 3780 3786 3842 N
+ P V SH b n/a 28 3780 3815 3843 N
+ P V SH s n/a 28 3780 3786 3843 N
+ P V SIL s n/a 28 3780 3787 3840 N
+ P V T s n/a 28 3780 3786 3839 N
+ P V TH s n/a 28 3780 3786 3839 N
+ P V UH b n/a 28 3780 3805 3836 N
+ P V UH s n/a 28 3780 3804 3846 N
+ P V UW b n/a 28 3780 3806 3835 N
+ P V UW s n/a 28 3780 3804 3835 N
+ P V V b n/a 28 3780 3815 3839 N
+ P V V s n/a 28 3780 3786 3839 N
+ P V W b n/a 28 3780 3805 3832 N
+ P V W s n/a 28 3780 3804 3846 N
+ P V Y b n/a 28 3780 3817 3821 N
+ P V Y s n/a 28 3780 3790 3823 N
+ P V Z s n/a 28 3780 3786 3839 N
+ P V ZH s n/a 28 3780 3786 3839 N
+ P W AA b n/a 28 3756 3813 3831 N
+ P W AA s n/a 28 3756 3813 3832 N
+ P W AE b n/a 28 3756 3815 3825 N
+ P W AE s n/a 28 3756 3790 3825 N
+ P W AH b n/a 28 3756 3816 3832 N
+ P W AH s n/a 28 3756 3790 3848 N
+ P W AO b n/a 28 3756 3812 3835 N
+ P W AO s n/a 28 3756 3812 3835 N
+ P W AW b n/a 28 3756 3815 3826 N
+ P W AW s n/a 28 3756 3790 3826 N
+ P W AY b n/a 28 3756 3813 3831 N
+ P W AY s n/a 28 3756 3813 3832 N
+ P W B b n/a 28 3756 3815 3839 N
+ P W B s n/a 28 3756 3787 3839 N
+ P W CH s n/a 28 3756 3787 3839 N
+ P W D b n/a 28 3756 3815 3839 N
+ P W D s n/a 28 3756 3787 3839 N
+ P W DH s n/a 28 3756 3787 3839 N
+ P W EH b n/a 28 3756 3815 3828 N
+ P W EH s n/a 28 3756 3790 3828 N
+ P W ER b n/a 28 3756 3811 3851 N
+ P W ER s n/a 28 3756 3811 3849 N
+ P W EY b n/a 28 3756 3815 3827 N
+ P W EY s n/a 28 3756 3790 3827 N
+ P W F b n/a 28 3756 3815 3839 N
+ P W F s n/a 28 3756 3787 3839 N
+ P W G b n/a 28 3756 3815 3839 N
+ P W G s n/a 28 3756 3787 3839 N
+ P W HH s n/a 28 3756 3787 3839 N
+ P W IH b n/a 28 3756 3817 3820 N
+ P W IH s n/a 28 3756 3790 3822 N
+ P W IY b n/a 28 3756 3817 3821 N
+ P W IY s n/a 28 3756 3790 3823 N
+ P W JH s n/a 28 3756 3787 3839 N
+ P W K b n/a 28 3756 3815 3839 N
+ P W K s n/a 28 3756 3787 3839 N
+ P W L b n/a 28 3756 3810 3844 N
+ P W L s n/a 28 3756 3810 3844 N
+ P W M b n/a 28 3756 3815 3839 N
+ P W M s n/a 28 3756 3787 3839 N
+ P W N b n/a 28 3756 3815 3839 N
+ P W N s n/a 28 3756 3787 3839 N
+ P W NG s n/a 28 3756 3787 3839 N
+ P W OW b n/a 28 3756 3812 3832 N
+ P W OW s n/a 28 3756 3812 3832 N
+ P W OY b n/a 28 3756 3812 3835 N
+ P W OY s n/a 28 3756 3812 3835 N
+ P W P s n/a 28 3756 3787 3839 N
+ P W R b n/a 28 3756 3811 3853 N
+ P W R s n/a 28 3756 3811 3852 N
+ P W S b n/a 28 3756 3815 3842 N
+ P W S s n/a 28 3756 3787 3842 N
+ P W SH b n/a 28 3756 3815 3843 N
+ P W SH s n/a 28 3756 3787 3843 N
+ P W SIL s n/a 28 3756 3787 3840 N
+ P W T s n/a 28 3756 3787 3839 N
+ P W TH s n/a 28 3756 3787 3839 N
+ P W UH b n/a 28 3756 3811 3836 N
+ P W UH s n/a 28 3756 3811 3846 N
+ P W UW b n/a 28 3756 3812 3835 N
+ P W UW s n/a 28 3756 3812 3835 N
+ P W V b n/a 28 3756 3815 3839 N
+ P W V s n/a 28 3756 3787 3839 N
+ P W W b n/a 28 3756 3809 3832 N
+ P W W s n/a 28 3756 3809 3846 N
+ P W Y b n/a 28 3756 3817 3821 N
+ P W Y s n/a 28 3756 3790 3823 N
+ P W Z s n/a 28 3756 3787 3839 N
+ P W ZH s n/a 28 3756 3787 3839 N
+ P Y AA b n/a 28 3772 3812 3831 N
+ P Y AA s n/a 28 3772 3812 3832 N
+ P Y AE b n/a 28 3772 3815 3825 N
+ P Y AE s n/a 28 3772 3792 3825 N
+ P Y AH b n/a 28 3772 3816 3832 N
+ P Y AH s n/a 28 3772 3792 3848 N
+ P Y AO b n/a 28 3772 3812 3835 N
+ P Y AO s n/a 28 3772 3812 3835 N
+ P Y AW b n/a 28 3772 3815 3826 N
+ P Y AW s n/a 28 3772 3792 3826 N
+ P Y AY b n/a 28 3772 3812 3831 N
+ P Y AY s n/a 28 3772 3812 3832 N
+ P Y B b n/a 28 3772 3815 3839 N
+ P Y B s n/a 28 3772 3795 3839 N
+ P Y CH s n/a 28 3772 3795 3839 N
+ P Y D b n/a 28 3772 3815 3839 N
+ P Y D s n/a 28 3772 3795 3839 N
+ P Y DH s n/a 28 3772 3795 3839 N
+ P Y EH b n/a 28 3772 3815 3828 N
+ P Y EH s n/a 28 3772 3792 3828 N
+ P Y ER b n/a 28 3772 3808 3851 N
+ P Y ER s n/a 28 3772 3808 3849 N
+ P Y EY b n/a 28 3772 3815 3827 N
+ P Y EY s n/a 28 3772 3792 3827 N
+ P Y F b n/a 28 3772 3815 3839 N
+ P Y F s n/a 28 3772 3795 3839 N
+ P Y G b n/a 28 3772 3815 3839 N
+ P Y G s n/a 28 3772 3795 3839 N
+ P Y HH s n/a 28 3772 3795 3839 N
+ P Y IH b n/a 28 3772 3817 3820 N
+ P Y IH s n/a 28 3772 3792 3822 N
+ P Y IY b n/a 28 3772 3817 3821 N
+ P Y IY s n/a 28 3772 3792 3823 N
+ P Y JH s n/a 28 3772 3795 3839 N
+ P Y K b n/a 28 3772 3815 3839 N
+ P Y K s n/a 28 3772 3795 3839 N
+ P Y L b n/a 28 3772 3810 3844 N
+ P Y L s n/a 28 3772 3810 3844 N
+ P Y M b n/a 28 3772 3815 3839 N
+ P Y M s n/a 28 3772 3795 3839 N
+ P Y N b n/a 28 3772 3815 3839 N
+ P Y N s n/a 28 3772 3795 3839 N
+ P Y NG s n/a 28 3772 3795 3839 N
+ P Y OW b n/a 28 3772 3812 3832 N
+ P Y OW i n/a 28 3772 3812 3832 N
+ P Y OW s n/a 28 3772 3812 3832 N
+ P Y OY b n/a 28 3772 3812 3835 N
+ P Y OY s n/a 28 3772 3812 3835 N
+ P Y P s n/a 28 3772 3795 3839 N
+ P Y R b n/a 28 3772 3808 3853 N
+ P Y R s n/a 28 3772 3808 3852 N
+ P Y S b n/a 28 3772 3815 3842 N
+ P Y S s n/a 28 3772 3795 3842 N
+ P Y SH b n/a 28 3772 3815 3843 N
+ P Y SH s n/a 28 3772 3795 3843 N
+ P Y SIL s n/a 28 3772 3795 3841 N
+ P Y T s n/a 28 3772 3795 3839 N
+ P Y TH s n/a 28 3772 3795 3839 N
+ P Y UH b n/a 28 3772 3808 3836 N
+ P Y UH s n/a 28 3772 3808 3846 N
+ P Y UW b n/a 28 3772 3812 3835 N
+ P Y UW s n/a 28 3772 3812 3835 N
+ P Y V b n/a 28 3772 3815 3839 N
+ P Y V s n/a 28 3772 3795 3839 N
+ P Y W b n/a 28 3772 3808 3832 N
+ P Y W s n/a 28 3772 3808 3846 N
+ P Y Y b n/a 28 3772 3817 3821 N
+ P Y Y s n/a 28 3772 3792 3823 N
+ P Y Z s n/a 28 3772 3795 3839 N
+ P Y ZH s n/a 28 3772 3795 3839 N
+ P Z AA b n/a 28 3777 3806 3831 N
+ P Z AA i n/a 28 3778 3803 3831 N
+ P Z AA s n/a 28 3777 3803 3832 N
+ P Z AE b n/a 28 3777 3815 3825 N
+ P Z AE i n/a 28 3778 3796 3825 N
+ P Z AE s n/a 28 3777 3796 3825 N
+ P Z AH b n/a 28 3777 3816 3832 N
+ P Z AH s n/a 28 3777 3796 3848 N
+ P Z AO b n/a 28 3777 3806 3835 N
+ P Z AO i n/a 28 3778 3804 3835 N
+ P Z AO s n/a 28 3777 3804 3835 N
+ P Z AW b n/a 28 3777 3815 3826 N
+ P Z AW s n/a 28 3777 3796 3826 N
+ P Z AY b n/a 28 3777 3806 3831 N
+ P Z AY s n/a 28 3777 3803 3832 N
+ P Z B b n/a 28 3777 3815 3839 N
+ P Z B s n/a 28 3777 3796 3839 N
+ P Z CH s n/a 28 3777 3796 3839 N
+ P Z D b n/a 28 3777 3815 3839 N
+ P Z D s n/a 28 3777 3796 3839 N
+ P Z DH s n/a 28 3777 3796 3839 N
+ P Z EH b n/a 28 3777 3815 3828 N
+ P Z EH s n/a 28 3777 3796 3828 N
+ P Z ER b n/a 28 3777 3805 3851 N
+ P Z ER i n/a 28 3778 3804 3850 N
+ P Z ER s n/a 28 3777 3804 3850 N
+ P Z EY b n/a 28 3777 3815 3827 N
+ P Z EY i n/a 28 3778 3796 3827 N
+ P Z EY s n/a 28 3777 3796 3827 N
+ P Z F b n/a 28 3777 3815 3839 N
+ P Z F s n/a 28 3777 3796 3839 N
+ P Z G b n/a 28 3777 3815 3839 N
+ P Z G s n/a 28 3777 3796 3839 N
+ P Z HH s n/a 28 3777 3796 3839 N
+ P Z IH b n/a 28 3777 3817 3820 N
+ P Z IH s n/a 28 3777 3797 3822 N
+ P Z IY b n/a 28 3777 3817 3821 N
+ P Z IY i n/a 28 3778 3797 3821 N
+ P Z IY s n/a 28 3777 3797 3823 N
+ P Z JH s n/a 28 3777 3796 3839 N
+ P Z K b n/a 28 3777 3815 3839 N
+ P Z K s n/a 28 3777 3796 3839 N
+ P Z L b n/a 28 3777 3806 3844 N
+ P Z L i n/a 28 3778 3804 3844 N
+ P Z L s n/a 28 3777 3804 3844 N
+ P Z M b n/a 28 3777 3815 3839 N
+ P Z M s n/a 28 3777 3796 3839 N
+ P Z N b n/a 28 3777 3815 3839 N
+ P Z N s n/a 28 3777 3796 3839 N
+ P Z NG s n/a 28 3777 3796 3839 N
+ P Z OW b n/a 28 3777 3806 3832 N
+ P Z OW s n/a 28 3777 3803 3832 N
+ P Z OY b n/a 28 3777 3806 3835 N
+ P Z OY s n/a 28 3777 3804 3835 N
+ P Z P s n/a 28 3777 3796 3839 N
+ P Z R b n/a 28 3777 3805 3853 N
+ P Z R i n/a 28 3778 3804 3853 N
+ P Z R s n/a 28 3777 3804 3853 N
+ P Z S b n/a 28 3777 3815 3842 N
+ P Z S s n/a 28 3777 3796 3842 N
+ P Z SH b n/a 28 3777 3815 3843 N
+ P Z SH s n/a 28 3777 3796 3843 N
+ P Z SIL s n/a 28 3777 3796 3840 N
+ P Z T s n/a 28 3777 3796 3839 N
+ P Z TH s n/a 28 3777 3796 3839 N
+ P Z UH b n/a 28 3777 3805 3836 N
+ P Z UH s n/a 28 3777 3804 3846 N
+ P Z UW b n/a 28 3777 3806 3835 N
+ P Z UW s n/a 28 3777 3804 3835 N
+ P Z V b n/a 28 3777 3815 3839 N
+ P Z V s n/a 28 3777 3796 3839 N
+ P Z W b n/a 28 3777 3805 3832 N
+ P Z W s n/a 28 3777 3804 3846 N
+ P Z Y b n/a 28 3777 3817 3821 N
+ P Z Y i n/a 28 3778 3797 3821 N
+ P Z Y s n/a 28 3777 3797 3823 N
+ P Z Z s n/a 28 3777 3796 3839 N
+ P Z ZH s n/a 28 3777 3796 3839 N
+ P ZH AA b n/a 28 3777 3806 3831 N
+ P ZH AA s n/a 28 3777 3803 3832 N
+ P ZH AE b n/a 28 3777 3815 3825 N
+ P ZH AE s n/a 28 3777 3796 3825 N
+ P ZH AH b n/a 28 3777 3816 3832 N
+ P ZH AH s n/a 28 3777 3796 3848 N
+ P ZH AO b n/a 28 3777 3806 3835 N
+ P ZH AO s n/a 28 3777 3804 3835 N
+ P ZH AW b n/a 28 3777 3815 3826 N
+ P ZH AW s n/a 28 3777 3796 3826 N
+ P ZH AY b n/a 28 3777 3806 3831 N
+ P ZH AY s n/a 28 3777 3803 3832 N
+ P ZH B b n/a 28 3777 3815 3839 N
+ P ZH B s n/a 28 3777 3796 3839 N
+ P ZH CH s n/a 28 3777 3796 3839 N
+ P ZH D b n/a 28 3777 3815 3839 N
+ P ZH D s n/a 28 3777 3796 3839 N
+ P ZH DH s n/a 28 3777 3796 3839 N
+ P ZH EH b n/a 28 3777 3815 3828 N
+ P ZH EH s n/a 28 3777 3796 3828 N
+ P ZH ER b n/a 28 3777 3805 3851 N
+ P ZH ER s n/a 28 3777 3804 3850 N
+ P ZH EY b n/a 28 3777 3815 3827 N
+ P ZH EY s n/a 28 3777 3796 3827 N
+ P ZH F b n/a 28 3777 3815 3839 N
+ P ZH F s n/a 28 3777 3796 3839 N
+ P ZH G b n/a 28 3777 3815 3839 N
+ P ZH G s n/a 28 3777 3796 3839 N
+ P ZH HH s n/a 28 3777 3796 3839 N
+ P ZH IH b n/a 28 3777 3817 3820 N
+ P ZH IH s n/a 28 3777 3797 3822 N
+ P ZH IY b n/a 28 3777 3817 3821 N
+ P ZH IY s n/a 28 3777 3797 3823 N
+ P ZH JH s n/a 28 3777 3796 3839 N
+ P ZH K b n/a 28 3777 3815 3839 N
+ P ZH K s n/a 28 3777 3796 3839 N
+ P ZH L b n/a 28 3777 3806 3844 N
+ P ZH L s n/a 28 3777 3804 3844 N
+ P ZH M b n/a 28 3777 3815 3839 N
+ P ZH M s n/a 28 3777 3796 3839 N
+ P ZH N b n/a 28 3777 3815 3839 N
+ P ZH N s n/a 28 3777 3796 3839 N
+ P ZH NG s n/a 28 3777 3796 3839 N
+ P ZH OW b n/a 28 3777 3806 3832 N
+ P ZH OW s n/a 28 3777 3803 3832 N
+ P ZH OY b n/a 28 3777 3806 3835 N
+ P ZH OY s n/a 28 3777 3804 3835 N
+ P ZH P s n/a 28 3777 3796 3839 N
+ P ZH R b n/a 28 3777 3805 3853 N
+ P ZH R s n/a 28 3777 3804 3853 N
+ P ZH S b n/a 28 3777 3815 3842 N
+ P ZH S s n/a 28 3777 3796 3842 N
+ P ZH SH b n/a 28 3777 3815 3843 N
+ P ZH SH s n/a 28 3777 3796 3843 N
+ P ZH SIL s n/a 28 3777 3796 3840 N
+ P ZH T s n/a 28 3777 3796 3839 N
+ P ZH TH s n/a 28 3777 3796 3839 N
+ P ZH UH b n/a 28 3777 3805 3836 N
+ P ZH UH s n/a 28 3777 3804 3846 N
+ P ZH UW b n/a 28 3777 3806 3835 N
+ P ZH UW s n/a 28 3777 3804 3835 N
+ P ZH V b n/a 28 3777 3815 3839 N
+ P ZH V s n/a 28 3777 3796 3839 N
+ P ZH W b n/a 28 3777 3805 3832 N
+ P ZH W s n/a 28 3777 3804 3846 N
+ P ZH Y b n/a 28 3777 3817 3821 N
+ P ZH Y s n/a 28 3777 3797 3823 N
+ P ZH Z s n/a 28 3777 3796 3839 N
+ P ZH ZH s n/a 28 3777 3796 3839 N
+ R AA AA b n/a 29 3917 3964 4069 N
+ R AA AA e n/a 29 3874 4003 4075 N
+ R AA AA i n/a 29 3874 4003 4069 N
+ R AA AA s n/a 29 3874 4003 4069 N
+ R AA AE b n/a 29 3917 3945 4058 N
+ R AA AE e n/a 29 3874 3999 4078 N
+ R AA AE i n/a 29 3874 4002 4057 N
+ R AA AE s n/a 29 3874 3999 4058 N
+ R AA AH b n/a 29 3917 3967 4079 N
+ R AA AH e n/a 29 3874 4003 4077 N
+ R AA AH i n/a 29 3874 4003 4080 N
+ R AA AH s n/a 29 3874 4003 4079 N
+ R AA AO b n/a 29 3917 3966 4069 N
+ R AA AO e n/a 29 3874 4003 4075 N
+ R AA AO i n/a 29 3874 4003 4069 N
+ R AA AO s n/a 29 3874 4003 4069 N
+ R AA AW b n/a 29 3917 3945 4058 N
+ R AA AW e n/a 29 3874 3999 4077 N
+ R AA AW i n/a 29 3874 4002 4057 N
+ R AA AW s n/a 29 3874 3999 4058 N
+ R AA AY b n/a 29 3917 3964 4067 N
+ R AA AY e n/a 29 3874 4003 4075 N
+ R AA AY i n/a 29 3874 4003 4067 N
+ R AA AY s n/a 29 3874 4003 4067 N
+ R AA B b n/a 29 3917 3995 4100 N
+ R AA B e n/a 29 3873 3995 4100 N
+ R AA B i n/a 29 3873 3995 4100 N
+ R AA B s n/a 29 3873 3995 4100 N
+ R AA CH e n/a 29 3869 3993 4095 N
+ R AA CH i n/a 29 3869 3993 4095 N
+ R AA CH s n/a 29 3869 3993 4095 N
+ R AA D b n/a 29 3917 3993 4097 N
+ R AA D e n/a 29 3869 3993 4097 N
+ R AA D i n/a 29 3869 3993 4097 N
+ R AA D s n/a 29 3869 3993 4097 N
+ R AA DH e n/a 29 3870 3994 4087 N
+ R AA DH i n/a 29 3870 3994 4087 N
+ R AA DH s n/a 29 3870 3994 4087 N
+ R AA EH b n/a 29 3917 3944 4056 N
+ R AA EH e n/a 29 3874 3999 4078 N
+ R AA EH i n/a 29 3874 4002 4056 N
+ R AA EH s n/a 29 3874 3999 4056 N
+ R AA ER e n/a 29 3874 4004 4082 N
+ R AA ER i n/a 29 3874 4004 4082 N
+ R AA ER s n/a 29 3874 4004 4082 N
+ R AA EY b n/a 29 3917 3946 4041 N
+ R AA EY e n/a 29 3874 3998 4040 N
+ R AA EY i n/a 29 3874 4001 4041 N
+ R AA EY s n/a 29 3874 3998 4041 N
+ R AA F b n/a 29 3917 3995 4102 N
+ R AA F e n/a 29 3873 3995 4102 N
+ R AA F i n/a 29 3873 3995 4102 N
+ R AA F s n/a 29 3873 3995 4102 N
+ R AA G b n/a 29 3917 3993 4097 N
+ R AA G e n/a 29 3869 3993 4097 N
+ R AA G i n/a 29 3869 3993 4097 N
+ R AA G s n/a 29 3869 3993 4097 N
+ R AA HH e n/a 29 3870 3991 4085 N
+ R AA HH i n/a 29 3870 3991 4085 N
+ R AA HH s n/a 29 3870 3991 4085 N
+ R AA IH b n/a 29 3917 3971 4045 N
+ R AA IH e n/a 29 3874 3999 4035 N
+ R AA IH i n/a 29 3874 3999 4035 N
+ R AA IH s n/a 29 3874 3999 4035 N
+ R AA IY b n/a 29 3917 3972 4051 N
+ R AA IY e n/a 29 3874 3998 4050 N
+ R AA IY i n/a 29 3874 3998 4037 N
+ R AA IY s n/a 29 3874 3998 4050 N
+ R AA JH e n/a 29 3869 3993 4097 N
+ R AA JH i n/a 29 3869 3993 4097 N
+ R AA JH s n/a 29 3869 3993 4097 N
+ R AA K b n/a 29 3917 3992 4096 N
+ R AA K e n/a 29 3868 3992 4096 N
+ R AA K i n/a 29 3868 3992 4096 N
+ R AA K s n/a 29 3868 3992 4096 N
+ R AA L e n/a 29 3871 4007 4104 N
+ R AA L i n/a 29 3871 4007 4104 N
+ R AA L s n/a 29 3871 4007 4104 N
+ R AA M e n/a 29 3873 4006 4107 N
+ R AA M i n/a 29 3872 4006 4106 N
+ R AA M s n/a 29 3873 4006 4107 N
+ R AA N b n/a 29 3917 3994 4086 N
+ R AA N e n/a 29 3870 3994 4086 N
+ R AA N i n/a 29 3870 3994 4086 N
+ R AA N s n/a 29 3870 3994 4086 N
+ R AA NG e n/a 29 3870 3994 4085 N
+ R AA NG s n/a 29 3870 3994 4085 N
+ R AA OW b n/a 29 3917 3968 4073 N
+ R AA OW e n/a 29 3874 4003 4075 N
+ R AA OW i n/a 29 3874 4003 4072 N
+ R AA OW s n/a 29 3874 4003 4073 N
+ R AA OY b n/a 29 3917 3966 4070 N
+ R AA OY e n/a 29 3874 4003 4075 N
+ R AA OY s n/a 29 3874 4003 4070 N
+ R AA P b n/a 29 3917 3995 4100 N
+ R AA P e n/a 29 3873 3995 4100 N
+ R AA P i n/a 29 3873 3995 4100 N
+ R AA P s n/a 29 3873 3995 4100 N
+ R AA R b n/a 29 3917 4008 4108 N
+ R AA R e n/a 29 3873 4008 4108 N
+ R AA R i n/a 29 3873 4008 4108 N
+ R AA R s n/a 29 3873 4008 4108 N
+ R AA S b n/a 29 3917 3991 4084 N
+ R AA S e n/a 29 3870 3991 4084 N
+ R AA S i n/a 29 3870 3991 4084 N
+ R AA S s n/a 29 3870 3991 4084 N
+ R AA SH e n/a 29 3870 3991 4084 N
+ R AA SH i n/a 29 3870 3991 4084 N
+ R AA SH s n/a 29 3870 3991 4084 N
+ R AA SIL e n/a 29 3871 3997 4109 N
+ R AA SIL s n/a 29 3871 3997 4109 N
+ R AA T b n/a 29 3917 3993 4095 N
+ R AA T e n/a 29 3869 3993 4095 N
+ R AA T i n/a 29 3869 3993 4095 N
+ R AA T s n/a 29 3869 3993 4095 N
+ R AA TH e n/a 29 3870 3991 4088 N
+ R AA TH i n/a 29 3870 3991 4088 N
+ R AA TH s n/a 29 3870 3991 4088 N
+ R AA UH b n/a 29 3917 3973 4048 N
+ R AA UH e n/a 29 3874 3999 4048 N
+ R AA UH s n/a 29 3874 3999 4048 N
+ R AA UW b n/a 29 3917 3973 4048 N
+ R AA UW e n/a 29 3874 3999 4048 N
+ R AA UW i n/a 29 3874 3999 4048 N
+ R AA UW s n/a 29 3874 3999 4048 N
+ R AA V e n/a 29 3873 3995 4101 N
+ R AA V i n/a 29 3873 3995 4101 N
+ R AA V s n/a 29 3873 3995 4101 N
+ R AA W b n/a 29 3917 4008 4108 N
+ R AA W e n/a 29 3873 4008 4108 N
+ R AA W i n/a 29 3873 4008 4108 N
+ R AA W s n/a 29 3873 4008 4108 N
+ R AA Y b n/a 29 3917 3998 4091 N
+ R AA Y e n/a 29 3870 3998 4091 N
+ R AA Y i n/a 29 3870 3998 4091 N
+ R AA Y s n/a 29 3870 3998 4091 N
+ R AA Z b n/a 29 3917 3994 4092 N
+ R AA Z e n/a 29 3871 3994 4092 N
+ R AA Z i n/a 29 3871 3994 4092 N
+ R AA Z s n/a 29 3871 3994 4092 N
+ R AA ZH e n/a 29 3871 3994 4092 N
+ R AA ZH i n/a 29 3871 3994 4092 N
+ R AA ZH s n/a 29 3871 3994 4092 N
+ R AE AA b n/a 29 3917 3964 4069 N
+ R AE AA e n/a 29 3882 4031 4075 N
+ R AE AA i n/a 29 3882 4031 4069 N
+ R AE AA s n/a 29 3882 4031 4069 N
+ R AE AE b n/a 29 3917 3945 4058 N
+ R AE AE e n/a 29 3880 4027 4078 N
+ R AE AE s n/a 29 3880 4027 4058 N
+ R AE AH b n/a 29 3917 3967 4079 N
+ R AE AH e n/a 29 3880 4026 4076 N
+ R AE AH i n/a 29 3880 4026 4081 N
+ R AE AH s n/a 29 3880 4026 4079 N
+ R AE AO b n/a 29 3917 3966 4069 N
+ R AE AO e n/a 29 3882 4031 4075 N
+ R AE AO i n/a 29 3882 4031 4069 N
+ R AE AO s n/a 29 3882 4031 4069 N
+ R AE AW b n/a 29 3917 3945 4058 N
+ R AE AW e n/a 29 3880 4027 4078 N
+ R AE AW i n/a 29 3882 4030 4057 N
+ R AE AW s n/a 29 3880 4027 4058 N
+ R AE AY b n/a 29 3917 3964 4067 N
+ R AE AY e n/a 29 3882 4031 4075 N
+ R AE AY i n/a 29 3882 4031 4067 N
+ R AE AY s n/a 29 3882 4031 4067 N
+ R AE B b n/a 29 3917 4014 4101 N
+ R AE B e n/a 29 3886 4014 4101 N
+ R AE B s n/a 29 3886 4014 4101 N
+ R AE CH e n/a 29 3887 4017 4094 N
+ R AE CH s n/a 29 3887 4017 4094 N
+ R AE D b n/a 29 3917 4017 4097 N
+ R AE D e n/a 29 3887 4017 4097 N
+ R AE D i n/a 29 3885 4023 4097 N
+ R AE D s n/a 29 3887 4017 4097 N
+ R AE DH e n/a 29 3889 4019 4089 N
+ R AE DH s n/a 29 3889 4019 4089 N
+ R AE EH b n/a 29 3917 3944 4056 N
+ R AE EH e n/a 29 3880 4027 4078 N
+ R AE EH s n/a 29 3880 4027 4056 N
+ R AE ER e n/a 29 3880 4026 4082 N
+ R AE ER i n/a 29 3880 4026 4082 N
+ R AE ER s n/a 29 3880 4026 4082 N
+ R AE EY b n/a 29 3917 3946 4041 N
+ R AE EY e n/a 29 3880 4027 4040 N
+ R AE EY i n/a 29 3882 4030 4041 N
+ R AE EY s n/a 29 3880 4027 4041 N
+ R AE F b n/a 29 3917 4014 4102 N
+ R AE F e n/a 29 3886 4014 4102 N
+ R AE F i n/a 29 3886 4014 4102 N
+ R AE F s n/a 29 3886 4014 4102 N
+ R AE G b n/a 29 3917 4017 4097 N
+ R AE G e n/a 29 3887 4017 4097 N
+ R AE G s n/a 29 3887 4017 4097 N
+ R AE HH e n/a 29 3888 4018 4085 N
+ R AE HH s n/a 29 3888 4018 4085 N
+ R AE IH b n/a 29 3917 3971 4045 N
+ R AE IH e n/a 29 3879 4029 4036 N
+ R AE IH i n/a 29 3880 4027 4034 N
+ R AE IH s n/a 29 3879 4029 4036 N
+ R AE IY b n/a 29 3917 3972 4051 N
+ R AE IY e n/a 29 3880 4033 4050 N
+ R AE IY i n/a 29 3880 4033 4039 N
+ R AE IY s n/a 29 3880 4033 4050 N
+ R AE JH e n/a 29 3887 4017 4097 N
+ R AE JH s n/a 29 3887 4017 4097 N
+ R AE K b n/a 29 3917 4017 4096 N
+ R AE K e n/a 29 3887 4017 4096 N
+ R AE K i n/a 29 3888 4017 4096 N
+ R AE K s n/a 29 3887 4017 4096 N
+ R AE L e n/a 29 3888 4016 4103 N
+ R AE L i n/a 29 3888 4016 4103 N
+ R AE L s n/a 29 3888 4016 4103 N
+ R AE M e n/a 29 3886 4014 4106 N
+ R AE M s n/a 29 3886 4014 4106 N
+ R AE N b n/a 29 3917 4017 4086 N
+ R AE N e n/a 29 3887 4017 4086 N
+ R AE N s n/a 29 3887 4017 4086 N
+ R AE NG e n/a 29 3887 4017 4085 N
+ R AE NG s n/a 29 3887 4017 4085 N
+ R AE OW b n/a 29 3917 3968 4073 N
+ R AE OW e n/a 29 3882 4031 4075 N
+ R AE OW i n/a 29 3882 4031 4072 N
+ R AE OW s n/a 29 3882 4031 4073 N
+ R AE OY b n/a 29 3917 3966 4070 N
+ R AE OY e n/a 29 3882 4031 4075 N
+ R AE OY s n/a 29 3882 4031 4070 N
+ R AE P b n/a 29 3917 4014 4100 N
+ R AE P e n/a 29 3886 4014 4100 N
+ R AE P s n/a 29 3886 4014 4100 N
+ R AE R b n/a 29 3917 4013 4105 N
+ R AE R e n/a 29 3886 4013 4105 N
+ R AE R s n/a 29 3886 4013 4105 N
+ R AE S b n/a 29 3917 4018 4084 N
+ R AE S e n/a 29 3887 4018 4084 N
+ R AE S s n/a 29 3887 4018 4084 N
+ R AE SH e n/a 29 3887 4018 4084 N
+ R AE SH s n/a 29 3887 4018 4084 N
+ R AE SIL e n/a 29 3884 4025 4110 N
+ R AE SIL s n/a 29 3884 4025 4110 N
+ R AE T b n/a 29 3917 4017 4094 N
+ R AE T e n/a 29 3887 4017 4094 N
+ R AE T i n/a 29 3885 4017 4094 N
+ R AE T s n/a 29 3887 4017 4094 N
+ R AE TH e n/a 29 3887 4018 4089 N
+ R AE TH s n/a 29 3887 4018 4089 N
+ R AE UH b n/a 29 3917 3973 4048 N
+ R AE UH e n/a 29 3879 4031 4048 N
+ R AE UH s n/a 29 3879 4031 4048 N
+ R AE UW b n/a 29 3917 3973 4048 N
+ R AE UW e n/a 29 3880 4031 4048 N
+ R AE UW i n/a 29 3880 4031 4048 N
+ R AE UW s n/a 29 3880 4031 4048 N
+ R AE V e n/a 29 3886 4014 4101 N
+ R AE V s n/a 29 3886 4014 4101 N
+ R AE W b n/a 29 3917 4013 4105 N
+ R AE W e n/a 29 3878 4013 4105 N
+ R AE W s n/a 29 3878 4013 4105 N
+ R AE Y b n/a 29 3917 4017 4091 N
+ R AE Y e n/a 29 3887 4017 4091 N
+ R AE Y i n/a 29 3887 4023 4091 N
+ R AE Y s n/a 29 3887 4017 4091 N
+ R AE Z b n/a 29 3917 4019 4090 N
+ R AE Z e n/a 29 3889 4019 4090 N
+ R AE Z i n/a 29 3885 4023 4090 N
+ R AE Z s n/a 29 3889 4019 4090 N
+ R AE ZH e n/a 29 3889 4019 4090 N
+ R AE ZH s n/a 29 3889 4019 4090 N
+ R AH AA b n/a 29 3922 3964 4069 N
+ R AH AA e n/a 29 3883 4031 4075 N
+ R AH AA i n/a 29 3883 4031 4069 N
+ R AH AA s n/a 29 3883 4031 4069 N
+ R AH AE b n/a 29 3923 3945 4058 N
+ R AH AE e n/a 29 3880 4027 4078 N
+ R AH AE i n/a 29 3883 4030 4057 N
+ R AH AE s n/a 29 3880 4027 4058 N
+ R AH AH b n/a 29 3922 3967 4079 N
+ R AH AH e n/a 29 3880 4026 4076 N
+ R AH AH i n/a 29 3880 4026 4080 N
+ R AH AH s n/a 29 3880 4026 4079 N
+ R AH AO b n/a 29 3922 3966 4069 N
+ R AH AO e n/a 29 3883 4031 4075 N
+ R AH AO i n/a 29 3883 4031 4069 N
+ R AH AO s n/a 29 3883 4031 4069 N
+ R AH AW b n/a 29 3923 3945 4058 N
+ R AH AW e n/a 29 3879 4027 4078 N
+ R AH AW i n/a 29 3883 4030 4057 N
+ R AH AW s n/a 29 3879 4027 4058 N
+ R AH AY b n/a 29 3922 3964 4067 N
+ R AH AY e n/a 29 3883 4031 4075 N
+ R AH AY i n/a 29 3883 4031 4067 N
+ R AH AY s n/a 29 3883 4031 4067 N
+ R AH B b n/a 29 3922 4014 4101 N
+ R AH B e n/a 29 3886 4014 4101 N
+ R AH B i n/a 29 3886 4014 4101 N
+ R AH B s n/a 29 3886 4014 4101 N
+ R AH CH e n/a 29 3887 4017 4094 N
+ R AH CH s n/a 29 3887 4017 4094 N
+ R AH D b n/a 29 3922 4017 4098 N
+ R AH D e n/a 29 3887 4017 4098 N
+ R AH D i n/a 29 3885 4023 4098 N
+ R AH D s n/a 29 3887 4017 4098 N
+ R AH DH e n/a 29 3889 4019 4089 N
+ R AH DH s n/a 29 3889 4019 4089 N
+ R AH EH b n/a 29 3923 3944 4056 N
+ R AH EH e n/a 29 3880 4027 4078 N
+ R AH EH i n/a 29 3883 4030 4054 N
+ R AH EH s n/a 29 3880 4027 4056 N
+ R AH ER e n/a 29 3880 4026 4082 N
+ R AH ER i n/a 29 3880 4026 4082 N
+ R AH ER s n/a 29 3880 4026 4082 N
+ R AH EY b n/a 29 3923 3946 4041 N
+ R AH EY e n/a 29 3879 4027 4040 N
+ R AH EY i n/a 29 3883 4030 4041 N
+ R AH EY s n/a 29 3879 4027 4041 N
+ R AH F b n/a 29 3922 4014 4102 N
+ R AH F e n/a 29 3886 4014 4102 N
+ R AH F s n/a 29 3886 4014 4102 N
+ R AH G b n/a 29 3922 4017 4098 N
+ R AH G e n/a 29 3887 4017 4097 N
+ R AH G i n/a 29 3888 4023 4098 N
+ R AH G s n/a 29 3887 4017 4098 N
+ R AH HH e n/a 29 3888 4018 4085 N
+ R AH HH s n/a 29 3888 4018 4085 N
+ R AH IH b n/a 29 3920 3971 4045 N
+ R AH IH e n/a 29 3879 4029 4036 N
+ R AH IH i n/a 29 3880 4027 4034 N
+ R AH IH s n/a 29 3879 4029 4036 N
+ R AH IY b n/a 29 3920 3972 4051 N
+ R AH IY e n/a 29 3879 4033 4050 N
+ R AH IY i n/a 29 3879 4033 4039 N
+ R AH IY s n/a 29 3879 4033 4050 N
+ R AH JH e n/a 29 3887 4017 4098 N
+ R AH JH s n/a 29 3887 4017 4098 N
+ R AH K b n/a 29 3922 4017 4096 N
+ R AH K e n/a 29 3887 4017 4096 N
+ R AH K s n/a 29 3887 4017 4096 N
+ R AH L e n/a 29 3888 4016 4103 N
+ R AH L s n/a 29 3888 4016 4103 N
+ R AH M e n/a 29 3886 4014 4106 N
+ R AH M s n/a 29 3886 4014 4106 N
+ R AH N b n/a 29 3922 4017 4086 N
+ R AH N e n/a 29 3887 4017 4086 N
+ R AH N s n/a 29 3887 4017 4086 N
+ R AH NG e n/a 29 3887 4017 4085 N
+ R AH NG s n/a 29 3887 4017 4085 N
+ R AH OW b n/a 29 3922 3968 4073 N
+ R AH OW e n/a 29 3883 4031 4075 N
+ R AH OW i n/a 29 3883 4031 4072 N
+ R AH OW s n/a 29 3883 4031 4073 N
+ R AH OY b n/a 29 3922 3966 4070 N
+ R AH OY e n/a 29 3883 4031 4075 N
+ R AH OY s n/a 29 3883 4031 4070 N
+ R AH P b n/a 29 3922 4014 4101 N
+ R AH P e n/a 29 3886 4014 4101 N
+ R AH P s n/a 29 3886 4014 4101 N
+ R AH R b n/a 29 3922 4013 4105 N
+ R AH R e n/a 29 3886 4013 4105 N
+ R AH R s n/a 29 3886 4013 4105 N
+ R AH S b n/a 29 3922 4018 4083 N
+ R AH S e n/a 29 3887 4018 4083 N
+ R AH S i n/a 29 3884 4018 4083 N
+ R AH S s n/a 29 3887 4018 4083 N
+ R AH SH e n/a 29 3887 4018 4083 N
+ R AH SH s n/a 29 3887 4018 4083 N
+ R AH SIL e n/a 29 3884 4024 4110 N
+ R AH SIL s n/a 29 3884 4024 4110 N
+ R AH T b n/a 29 3922 4017 4094 N
+ R AH T e n/a 29 3887 4017 4094 N
+ R AH T i n/a 29 3884 4017 4094 N
+ R AH T s n/a 29 3887 4017 4094 N
+ R AH TH e n/a 29 3887 4018 4089 N
+ R AH TH s n/a 29 3887 4018 4089 N
+ R AH UH b n/a 29 3922 3973 4048 N
+ R AH UH e n/a 29 3879 4031 4048 N
+ R AH UH s n/a 29 3879 4031 4048 N
+ R AH UW b n/a 29 3922 3973 4048 N
+ R AH UW e n/a 29 3879 4031 4048 N
+ R AH UW i n/a 29 3879 4031 4048 N
+ R AH UW s n/a 29 3879 4031 4048 N
+ R AH V e n/a 29 3886 4014 4101 N
+ R AH V s n/a 29 3886 4014 4101 N
+ R AH W b n/a 29 3922 4013 4105 N
+ R AH W e n/a 29 3878 4013 4105 N
+ R AH W s n/a 29 3878 4013 4105 N
+ R AH Y b n/a 29 3920 4017 4091 N
+ R AH Y e n/a 29 3887 4017 4091 N
+ R AH Y s n/a 29 3887 4017 4091 N
+ R AH Z b n/a 29 3922 4019 4090 N
+ R AH Z e n/a 29 3889 4019 4090 N
+ R AH Z i n/a 29 3885 4023 4090 N
+ R AH Z s n/a 29 3889 4019 4090 N
+ R AH ZH e n/a 29 3889 4019 4090 N
+ R AH ZH s n/a 29 3889 4019 4090 N
+ R AO AA b n/a 29 3917 3964 4069 N
+ R AO AA e n/a 29 3861 4003 4075 N
+ R AO AA i n/a 29 3857 4003 4069 N
+ R AO AA s n/a 29 3861 4003 4069 N
+ R AO AE b n/a 29 3917 3945 4058 N
+ R AO AE e n/a 29 3861 3999 4078 N
+ R AO AE i n/a 29 3857 4001 4057 N
+ R AO AE s n/a 29 3861 3999 4058 N
+ R AO AH b n/a 29 3917 3967 4079 N
+ R AO AH e n/a 29 3861 4002 4077 N
+ R AO AH i n/a 29 3861 4002 4080 N
+ R AO AH s n/a 29 3861 4002 4079 N
+ R AO AO b n/a 29 3917 3966 4069 N
+ R AO AO e n/a 29 3862 4003 4075 N
+ R AO AO i n/a 29 3857 4003 4069 N
+ R AO AO s n/a 29 3862 4003 4069 N
+ R AO AW b n/a 29 3917 3945 4058 N
+ R AO AW e n/a 29 3861 3999 4077 N
+ R AO AW i n/a 29 3857 4001 4057 N
+ R AO AW s n/a 29 3861 3999 4058 N
+ R AO AY b n/a 29 3917 3964 4067 N
+ R AO AY e n/a 29 3861 4003 4075 N
+ R AO AY i n/a 29 3857 4003 4067 N
+ R AO AY s n/a 29 3861 4003 4067 N
+ R AO B b n/a 29 3917 3995 4100 N
+ R AO B e n/a 29 3859 3995 4100 N
+ R AO B i n/a 29 3859 3995 4100 N
+ R AO B s n/a 29 3859 3995 4100 N
+ R AO CH e n/a 29 3867 3989 4093 N
+ R AO CH i n/a 29 3867 3989 4093 N
+ R AO CH s n/a 29 3867 3989 4093 N
+ R AO D b n/a 29 3917 3989 4099 N
+ R AO D e n/a 29 3867 3989 4099 N
+ R AO D i n/a 29 3867 3989 4099 N
+ R AO D s n/a 29 3867 3989 4099 N
+ R AO DH e n/a 29 3866 3988 4087 N
+ R AO DH i n/a 29 3866 3988 4087 N
+ R AO DH s n/a 29 3866 3988 4087 N
+ R AO EH b n/a 29 3917 3944 4056 N
+ R AO EH e n/a 29 3861 3998 4078 N
+ R AO EH i n/a 29 3857 4001 4056 N
+ R AO EH s n/a 29 3861 3998 4056 N
+ R AO ER e n/a 29 3862 4004 4082 N
+ R AO ER i n/a 29 3862 4004 4082 N
+ R AO ER s n/a 29 3862 4004 4082 N
+ R AO EY b n/a 29 3917 3946 4041 N
+ R AO EY e n/a 29 3861 3998 4040 N
+ R AO EY i n/a 29 3857 4001 4041 N
+ R AO EY s n/a 29 3861 3998 4041 N
+ R AO F b n/a 29 3917 3995 4102 N
+ R AO F e n/a 29 3859 3995 4102 N
+ R AO F i n/a 29 3859 3995 4102 N
+ R AO F s n/a 29 3859 3995 4102 N
+ R AO G b n/a 29 3917 3990 4093 N
+ R AO G e n/a 29 3864 3990 4093 N
+ R AO G i n/a 29 3864 3990 4093 N
+ R AO G s n/a 29 3864 3990 4093 N
+ R AO HH e n/a 29 3864 3985 4085 N
+ R AO HH i n/a 29 3864 3985 4085 N
+ R AO HH s n/a 29 3864 3985 4085 N
+ R AO IH b n/a 29 3917 3971 4045 N
+ R AO IH e n/a 29 3865 3998 4035 N
+ R AO IH i n/a 29 3865 3998 4035 N
+ R AO IH s n/a 29 3865 3998 4035 N
+ R AO IY b n/a 29 3917 3972 4051 N
+ R AO IY e n/a 29 3865 3998 4050 N
+ R AO IY i n/a 29 3865 3998 4037 N
+ R AO IY s n/a 29 3865 3998 4050 N
+ R AO JH e n/a 29 3867 3989 4099 N
+ R AO JH i n/a 29 3867 3989 4099 N
+ R AO JH s n/a 29 3867 3989 4099 N
+ R AO K b n/a 29 3917 3990 4096 N
+ R AO K e n/a 29 3864 3990 4096 N
+ R AO K i n/a 29 3864 3990 4096 N
+ R AO K s n/a 29 3864 3990 4096 N
+ R AO L e n/a 29 3861 4007 4104 N
+ R AO L i n/a 29 3861 4007 4104 N
+ R AO L s n/a 29 3861 4007 4104 N
+ R AO M e n/a 29 3859 4005 4107 N
+ R AO M i n/a 29 3860 4005 4107 N
+ R AO M s n/a 29 3859 4005 4107 N
+ R AO N b n/a 29 3917 3987 4086 N
+ R AO N e n/a 29 3866 3987 4086 N
+ R AO N i n/a 29 3866 3987 4086 N
+ R AO N s n/a 29 3866 3987 4086 N
+ R AO NG e n/a 29 3864 3985 4085 N
+ R AO NG i n/a 29 3863 3985 4085 N
+ R AO NG s n/a 29 3864 3985 4085 N
+ R AO OW b n/a 29 3917 3968 4073 N
+ R AO OW e n/a 29 3862 4003 4075 N
+ R AO OW i n/a 29 3857 4003 4072 N
+ R AO OW s n/a 29 3862 4003 4073 N
+ R AO OY b n/a 29 3917 3966 4070 N
+ R AO OY e n/a 29 3862 4003 4075 N
+ R AO OY i n/a 29 3857 4003 4070 N
+ R AO OY s n/a 29 3862 4003 4070 N
+ R AO P b n/a 29 3917 3995 4100 N
+ R AO P e n/a 29 3859 3995 4100 N
+ R AO P i n/a 29 3859 3995 4100 N
+ R AO P s n/a 29 3859 3995 4100 N
+ R AO R b n/a 29 3917 4008 4108 N
+ R AO R e n/a 29 3858 4008 4108 N
+ R AO R i n/a 29 3858 4008 4108 N
+ R AO R s n/a 29 3858 4008 4108 N
+ R AO S b n/a 29 3917 3986 4084 N
+ R AO S e n/a 29 3867 3986 4084 N
+ R AO S i n/a 29 3867 3986 4084 N
+ R AO S s n/a 29 3867 3986 4084 N
+ R AO SH e n/a 29 3867 3986 4084 N
+ R AO SH i n/a 29 3867 3986 4084 N
+ R AO SH s n/a 29 3867 3986 4084 N
+ R AO SIL e n/a 29 3863 4012 4109 N
+ R AO SIL s n/a 29 3863 4012 4109 N
+ R AO T b n/a 29 3917 3989 4093 N
+ R AO T e n/a 29 3867 3989 4093 N
+ R AO T i n/a 29 3867 3989 4093 N
+ R AO T s n/a 29 3867 3989 4093 N
+ R AO TH e n/a 29 3866 3988 4088 N
+ R AO TH i n/a 29 3866 3988 4088 N
+ R AO TH s n/a 29 3866 3988 4088 N
+ R AO UH b n/a 29 3917 3973 4048 N
+ R AO UH e n/a 29 3865 3998 4048 N
+ R AO UH s n/a 29 3865 3998 4048 N
+ R AO UW b n/a 29 3917 3973 4048 N
+ R AO UW e n/a 29 3865 3999 4048 N
+ R AO UW i n/a 29 3865 3999 4048 N
+ R AO UW s n/a 29 3865 3999 4048 N
+ R AO V e n/a 29 3859 3995 4101 N
+ R AO V i n/a 29 3859 3995 4101 N
+ R AO V s n/a 29 3859 3995 4101 N
+ R AO W b n/a 29 3917 4008 4108 N
+ R AO W e n/a 29 3860 4008 4108 N
+ R AO W i n/a 29 3860 4008 4108 N
+ R AO W s n/a 29 3860 4008 4108 N
+ R AO Y b n/a 29 3917 3998 4091 N
+ R AO Y e n/a 29 3867 3998 4091 N
+ R AO Y i n/a 29 3867 3998 4091 N
+ R AO Y s n/a 29 3867 3998 4091 N
+ R AO Z b n/a 29 3917 3985 4092 N
+ R AO Z e n/a 29 3865 3985 4092 N
+ R AO Z i n/a 29 3865 3985 4092 N
+ R AO Z s n/a 29 3865 3985 4092 N
+ R AO ZH e n/a 29 3865 3985 4092 N
+ R AO ZH i n/a 29 3865 3985 4092 N
+ R AO ZH s n/a 29 3865 3985 4092 N
+ R AW AA b n/a 29 3917 3964 4069 N
+ R AW AA e n/a 29 3875 4003 4075 N
+ R AW AA i n/a 29 3875 4003 4069 N
+ R AW AA s n/a 29 3875 4003 4069 N
+ R AW AE b n/a 29 3917 3945 4058 N
+ R AW AE e n/a 29 3875 3999 4078 N
+ R AW AE s n/a 29 3875 3999 4058 N
+ R AW AH b n/a 29 3917 3967 4079 N
+ R AW AH e n/a 29 3875 4003 4076 N
+ R AW AH i n/a 29 3875 4003 4080 N
+ R AW AH s n/a 29 3875 4003 4079 N
+ R AW AO b n/a 29 3917 3966 4069 N
+ R AW AO e n/a 29 3875 4003 4075 N
+ R AW AO s n/a 29 3875 4003 4069 N
+ R AW AW b n/a 29 3917 3945 4058 N
+ R AW AW e n/a 29 3875 3999 4077 N
+ R AW AW s n/a 29 3875 3999 4058 N
+ R AW AY b n/a 29 3917 3964 4067 N
+ R AW AY e n/a 29 3875 4003 4075 N
+ R AW AY i n/a 29 3875 4003 4067 N
+ R AW AY s n/a 29 3875 4003 4067 N
+ R AW B b n/a 29 3917 3995 4100 N
+ R AW B e n/a 29 3873 3995 4100 N
+ R AW B i n/a 29 3873 3995 4100 N
+ R AW B s n/a 29 3873 3995 4100 N
+ R AW CH e n/a 29 3869 3993 4095 N
+ R AW CH s n/a 29 3869 3993 4095 N
+ R AW D b n/a 29 3917 3993 4097 N
+ R AW D e n/a 29 3869 3993 4097 N
+ R AW D i n/a 29 3869 3993 4097 N
+ R AW D s n/a 29 3869 3993 4097 N
+ R AW DH e n/a 29 3875 3994 4087 N
+ R AW DH s n/a 29 3875 3994 4087 N
+ R AW EH b n/a 29 3917 3944 4056 N
+ R AW EH e n/a 29 3875 3999 4078 N
+ R AW EH i n/a 29 3875 4002 4053 N
+ R AW EH s n/a 29 3875 3999 4056 N
+ R AW ER e n/a 29 3875 4004 4082 N
+ R AW ER i n/a 29 3875 4004 4082 N
+ R AW ER s n/a 29 3875 4004 4082 N
+ R AW EY b n/a 29 3917 3946 4041 N
+ R AW EY e n/a 29 3875 3998 4040 N
+ R AW EY i n/a 29 3875 4001 4041 N
+ R AW EY s n/a 29 3875 3998 4041 N
+ R AW F b n/a 29 3917 3995 4102 N
+ R AW F e n/a 29 3873 3995 4102 N
+ R AW F i n/a 29 3873 3995 4102 N
+ R AW F s n/a 29 3873 3995 4102 N
+ R AW G b n/a 29 3917 3993 4097 N
+ R AW G e n/a 29 3869 3993 4097 N
+ R AW G s n/a 29 3869 3993 4097 N
+ R AW HH e n/a 29 3875 3991 4085 N
+ R AW HH s n/a 29 3875 3991 4085 N
+ R AW IH b n/a 29 3917 3971 4045 N
+ R AW IH e n/a 29 3875 3999 4035 N
+ R AW IH i n/a 29 3875 3999 4034 N
+ R AW IH s n/a 29 3875 3999 4035 N
+ R AW IY b n/a 29 3917 3972 4051 N
+ R AW IY e n/a 29 3875 3998 4050 N
+ R AW IY i n/a 29 3875 3998 4037 N
+ R AW IY s n/a 29 3875 3998 4050 N
+ R AW JH e n/a 29 3869 3993 4097 N
+ R AW JH s n/a 29 3869 3993 4097 N
+ R AW K b n/a 29 3917 3991 4096 N
+ R AW K e n/a 29 3868 3991 4096 N
+ R AW K i n/a 29 3868 3992 4096 N
+ R AW K s n/a 29 3868 3991 4096 N
+ R AW L e n/a 29 3875 4007 4104 N
+ R AW L i n/a 29 3875 4007 4104 N
+ R AW L s n/a 29 3875 4007 4104 N
+ R AW M e n/a 29 3873 4005 4107 N
+ R AW M s n/a 29 3873 4005 4107 N
+ R AW N b n/a 29 3917 3994 4086 N
+ R AW N e n/a 29 3875 3994 4086 N
+ R AW N s n/a 29 3875 3994 4086 N
+ R AW NG e n/a 29 3875 3994 4085 N
+ R AW NG s n/a 29 3875 3994 4085 N
+ R AW OW b n/a 29 3917 3968 4073 N
+ R AW OW e n/a 29 3875 4003 4075 N
+ R AW OW i n/a 29 3875 4003 4072 N
+ R AW OW s n/a 29 3875 4003 4073 N
+ R AW OY b n/a 29 3917 3966 4070 N
+ R AW OY e n/a 29 3875 4003 4075 N
+ R AW OY s n/a 29 3875 4003 4070 N
+ R AW P b n/a 29 3917 3995 4101 N
+ R AW P e n/a 29 3873 3995 4101 N
+ R AW P s n/a 29 3873 3995 4101 N
+ R AW R b n/a 29 3917 4008 4108 N
+ R AW R e n/a 29 3875 4008 4108 N
+ R AW R s n/a 29 3875 4008 4108 N
+ R AW S b n/a 29 3917 3991 4084 N
+ R AW S e n/a 29 3875 3991 4084 N
+ R AW S i n/a 29 3875 3991 4084 N
+ R AW S s n/a 29 3875 3991 4084 N
+ R AW SH e n/a 29 3875 3991 4084 N
+ R AW SH s n/a 29 3875 3991 4084 N
+ R AW SIL e n/a 29 3875 3997 4109 N
+ R AW SIL s n/a 29 3875 3997 4109 N
+ R AW T b n/a 29 3917 3993 4095 N
+ R AW T e n/a 29 3869 3993 4095 N
+ R AW T i n/a 29 3869 3993 4095 N
+ R AW T s n/a 29 3869 3993 4095 N
+ R AW TH e n/a 29 3875 3991 4088 N
+ R AW TH s n/a 29 3875 3991 4088 N
+ R AW UH b n/a 29 3917 3973 4048 N
+ R AW UH e n/a 29 3875 3999 4048 N
+ R AW UH s n/a 29 3875 3999 4048 N
+ R AW UW b n/a 29 3917 3973 4048 N
+ R AW UW e n/a 29 3875 3999 4048 N
+ R AW UW s n/a 29 3875 3999 4048 N
+ R AW V e n/a 29 3873 3995 4101 N
+ R AW V s n/a 29 3873 3995 4101 N
+ R AW W b n/a 29 3917 4008 4108 N
+ R AW W e n/a 29 3873 4008 4108 N
+ R AW W s n/a 29 3873 4008 4108 N
+ R AW Y b n/a 29 3917 3998 4091 N
+ R AW Y e n/a 29 3875 3998 4091 N
+ R AW Y s n/a 29 3875 3998 4091 N
+ R AW Z b n/a 29 3917 3991 4092 N
+ R AW Z e n/a 29 3875 3991 4092 N
+ R AW Z i n/a 29 3875 3991 4092 N
+ R AW Z s n/a 29 3875 3991 4092 N
+ R AW ZH e n/a 29 3875 3991 4092 N
+ R AW ZH s n/a 29 3875 3991 4092 N
+ R AY AA b n/a 29 3925 3964 4069 N
+ R AY AA e n/a 29 3883 4031 4075 N
+ R AY AA i n/a 29 3883 4031 4069 N
+ R AY AA s n/a 29 3883 4031 4069 N
+ R AY AE b n/a 29 3925 3945 4058 N
+ R AY AE e n/a 29 3880 4027 4078 N
+ R AY AE i n/a 29 3883 4030 4057 N
+ R AY AE s n/a 29 3880 4027 4058 N
+ R AY AH b n/a 29 3925 3967 4079 N
+ R AY AH e n/a 29 3881 4027 4076 N
+ R AY AH i n/a 29 3882 4027 4081 N
+ R AY AH s n/a 29 3881 4027 4079 N
+ R AY AO b n/a 29 3925 3966 4069 N
+ R AY AO e n/a 29 3883 4031 4075 N
+ R AY AO i n/a 29 3883 4031 4069 N
+ R AY AO s n/a 29 3883 4031 4069 N
+ R AY AW b n/a 29 3925 3945 4058 N
+ R AY AW e n/a 29 3880 4027 4078 N
+ R AY AW i n/a 29 3883 4030 4057 N
+ R AY AW s n/a 29 3880 4027 4058 N
+ R AY AY b n/a 29 3925 3964 4067 N
+ R AY AY e n/a 29 3883 4031 4075 N
+ R AY AY i n/a 29 3883 4031 4067 N
+ R AY AY s n/a 29 3883 4031 4067 N
+ R AY B b n/a 29 3925 4014 4101 N
+ R AY B e n/a 29 3889 4014 4101 N
+ R AY B i n/a 29 3889 4014 4101 N
+ R AY B s n/a 29 3889 4014 4101 N
+ R AY CH e n/a 29 3889 4017 4094 N
+ R AY CH s n/a 29 3889 4017 4094 N
+ R AY D b n/a 29 3925 4017 4098 N
+ R AY D e n/a 29 3889 4017 4098 N
+ R AY D i n/a 29 3885 4023 4098 N
+ R AY D s n/a 29 3889 4017 4098 N
+ R AY DH e n/a 29 3889 4019 4089 N
+ R AY DH s n/a 29 3889 4019 4089 N
+ R AY EH b n/a 29 3925 3944 4056 N
+ R AY EH e n/a 29 3880 4027 4078 N
+ R AY EH i n/a 29 3883 4030 4056 N
+ R AY EH s n/a 29 3880 4027 4056 N
+ R AY ER e n/a 29 3881 4026 4082 N
+ R AY ER i n/a 29 3882 4026 4082 N
+ R AY ER s n/a 29 3881 4026 4082 N
+ R AY EY b n/a 29 3925 3946 4041 N
+ R AY EY e n/a 29 3880 4027 4040 N
+ R AY EY i n/a 29 3883 4030 4041 N
+ R AY EY s n/a 29 3880 4027 4041 N
+ R AY F b n/a 29 3925 4014 4102 N
+ R AY F e n/a 29 3889 4014 4102 N
+ R AY F i n/a 29 3889 4014 4102 N
+ R AY F s n/a 29 3889 4014 4102 N
+ R AY G b n/a 29 3925 4017 4097 N
+ R AY G e n/a 29 3889 4017 4097 N
+ R AY G i n/a 29 3889 4023 4097 N
+ R AY G s n/a 29 3889 4017 4097 N
+ R AY HH e n/a 29 3889 4018 4085 N
+ R AY HH i n/a 29 3889 4018 4085 N
+ R AY HH s n/a 29 3889 4018 4085 N
+ R AY IH b n/a 29 3925 3971 4045 N
+ R AY IH e n/a 29 3881 4029 4036 N
+ R AY IH i n/a 29 3882 4027 4034 N
+ R AY IH s n/a 29 3881 4029 4036 N
+ R AY IY b n/a 29 3925 3972 4051 N
+ R AY IY e n/a 29 3880 4033 4050 N
+ R AY IY i n/a 29 3880 4033 4039 N
+ R AY IY s n/a 29 3880 4033 4050 N
+ R AY JH e n/a 29 3889 4017 4097 N
+ R AY JH i n/a 29 3889 4023 4097 N
+ R AY JH s n/a 29 3889 4017 4097 N
+ R AY K b n/a 29 3925 4017 4096 N
+ R AY K e n/a 29 3889 4017 4096 N
+ R AY K i n/a 29 3889 4017 4096 N
+ R AY K s n/a 29 3889 4017 4096 N
+ R AY L e n/a 29 3889 4016 4103 N
+ R AY L i n/a 29 3889 4016 4103 N
+ R AY L s n/a 29 3889 4016 4103 N
+ R AY M e n/a 29 3889 4014 4106 N
+ R AY M i n/a 29 3889 4014 4106 N
+ R AY M s n/a 29 3889 4014 4106 N
+ R AY N b n/a 29 3925 4017 4086 N
+ R AY N e n/a 29 3889 4017 4086 N
+ R AY N i n/a 29 3885 4023 4086 N
+ R AY N s n/a 29 3889 4017 4086 N
+ R AY NG e n/a 29 3889 4017 4085 N
+ R AY NG s n/a 29 3889 4017 4085 N
+ R AY OW b n/a 29 3925 3968 4073 N
+ R AY OW e n/a 29 3883 4031 4075 N
+ R AY OW i n/a 29 3883 4031 4072 N
+ R AY OW s n/a 29 3883 4031 4073 N
+ R AY OY b n/a 29 3925 3966 4070 N
+ R AY OY e n/a 29 3883 4031 4075 N
+ R AY OY i n/a 29 3883 4031 4070 N
+ R AY OY s n/a 29 3883 4031 4070 N
+ R AY P b n/a 29 3925 4014 4101 N
+ R AY P e n/a 29 3889 4014 4101 N
+ R AY P i n/a 29 3889 4014 4101 N
+ R AY P s n/a 29 3889 4014 4101 N
+ R AY R b n/a 29 3925 4013 4105 N
+ R AY R e n/a 29 3886 4013 4105 N
+ R AY R s n/a 29 3886 4013 4105 N
+ R AY S b n/a 29 3925 4018 4084 N
+ R AY S e n/a 29 3889 4018 4084 N
+ R AY S i n/a 29 3885 4018 4084 N
+ R AY S s n/a 29 3889 4018 4084 N
+ R AY SH e n/a 29 3889 4018 4084 N
+ R AY SH s n/a 29 3889 4018 4084 N
+ R AY SIL e n/a 29 3884 4025 4110 N
+ R AY SIL s n/a 29 3884 4025 4110 N
+ R AY T b n/a 29 3925 4017 4094 N
+ R AY T e n/a 29 3889 4017 4094 N
+ R AY T i n/a 29 3885 4017 4094 N
+ R AY T s n/a 29 3889 4017 4094 N
+ R AY TH e n/a 29 3889 4018 4089 N
+ R AY TH s n/a 29 3889 4018 4089 N
+ R AY UH b n/a 29 3925 3973 4048 N
+ R AY UH e n/a 29 3879 4031 4048 N
+ R AY UH s n/a 29 3879 4031 4048 N
+ R AY UW b n/a 29 3925 3973 4048 N
+ R AY UW e n/a 29 3880 4031 4048 N
+ R AY UW i n/a 29 3880 4031 4048 N
+ R AY UW s n/a 29 3880 4031 4048 N
+ R AY V e n/a 29 3889 4014 4101 N
+ R AY V s n/a 29 3889 4014 4101 N
+ R AY W b n/a 29 3925 4013 4105 N
+ R AY W e n/a 29 3878 4013 4105 N
+ R AY W i n/a 29 3878 4013 4105 N
+ R AY W s n/a 29 3878 4013 4105 N
+ R AY Y b n/a 29 3925 4017 4091 N
+ R AY Y e n/a 29 3889 4017 4091 N
+ R AY Y s n/a 29 3889 4017 4091 N
+ R AY Z b n/a 29 3925 4019 4090 N
+ R AY Z e n/a 29 3889 4019 4090 N
+ R AY Z i n/a 29 3885 4023 4090 N
+ R AY Z s n/a 29 3889 4019 4090 N
+ R AY ZH e n/a 29 3889 4019 4090 N
+ R AY ZH s n/a 29 3889 4019 4090 N
+ R B AA b n/a 29 3937 3964 4069 N
+ R B AA e n/a 29 3931 3964 4075 N
+ R B AA i n/a 29 3931 3965 4069 N
+ R B AA s n/a 29 3931 3964 4069 N
+ R B AE b n/a 29 3937 3945 4058 N
+ R B AE e n/a 29 3932 3940 4075 N
+ R B AE i n/a 29 3932 3940 4057 N
+ R B AE s n/a 29 3932 3940 4058 N
+ R B AH b n/a 29 3937 3967 4063 N
+ R B AH e n/a 29 3932 3961 4063 N
+ R B AH i n/a 29 3932 3961 4063 N
+ R B AH s n/a 29 3932 3961 4063 N
+ R B AO b n/a 29 3937 3966 4069 N
+ R B AO e n/a 29 3931 3966 4075 N
+ R B AO i n/a 29 3931 3965 4069 N
+ R B AO s n/a 29 3931 3966 4069 N
+ R B AW b n/a 29 3937 3945 4058 N
+ R B AW e n/a 29 3932 3940 4075 N
+ R B AW i n/a 29 3932 3940 4057 N
+ R B AW s n/a 29 3932 3940 4058 N
+ R B AY b n/a 29 3937 3964 4067 N
+ R B AY e n/a 29 3931 3964 4075 N
+ R B AY i n/a 29 3931 3965 4067 N
+ R B AY s n/a 29 3931 3964 4067 N
+ R B B b n/a 29 3937 3945 4101 N
+ R B B e n/a 29 3931 3940 4101 N
+ R B B s n/a 29 3931 3940 4101 N
+ R B CH e n/a 29 3931 3940 4095 N
+ R B CH s n/a 29 3931 3940 4095 N
+ R B D b n/a 29 3937 3945 4098 N
+ R B D e n/a 29 3931 3940 4098 N
+ R B D i n/a 29 3931 3940 4098 N
+ R B D s n/a 29 3931 3940 4098 N
+ R B DH e n/a 29 3931 3940 4087 N
+ R B DH s n/a 29 3931 3940 4087 N
+ R B EH b n/a 29 3937 3944 4056 N
+ R B EH e n/a 29 3932 3940 4063 N
+ R B EH i n/a 29 3932 3940 4053 N
+ R B EH s n/a 29 3932 3940 4056 N
+ R B ER e n/a 29 3931 3961 4063 N
+ R B ER i n/a 29 3931 3961 4063 N
+ R B ER s n/a 29 3931 3961 4063 N
+ R B EY b n/a 29 3937 3946 4041 N
+ R B EY e n/a 29 3932 3943 4040 N
+ R B EY i n/a 29 3932 3943 4041 N
+ R B EY s n/a 29 3932 3943 4041 N
+ R B F b n/a 29 3937 3945 4102 N
+ R B F e n/a 29 3931 3940 4102 N
+ R B F s n/a 29 3931 3940 4102 N
+ R B G b n/a 29 3937 3945 4098 N
+ R B G e n/a 29 3931 3940 4097 N
+ R B G s n/a 29 3931 3940 4098 N
+ R B HH e n/a 29 3931 3940 4085 N
+ R B HH s n/a 29 3931 3940 4085 N
+ R B IH b n/a 29 3936 3971 4045 N
+ R B IH e n/a 29 3933 3971 4045 N
+ R B IH i n/a 29 3933 3975 4046 N
+ R B IH s n/a 29 3933 3971 4045 N
+ R B IY b n/a 29 3936 3972 4051 N
+ R B IY e n/a 29 3933 3972 4050 N
+ R B IY i n/a 29 3933 3977 4052 N
+ R B IY s n/a 29 3933 3972 4050 N
+ R B JH e n/a 29 3931 3940 4098 N
+ R B JH s n/a 29 3931 3940 4098 N
+ R B K b n/a 29 3937 3945 4096 N
+ R B K e n/a 29 3931 3940 4096 N
+ R B K s n/a 29 3931 3940 4096 N
+ R B L e n/a 29 3931 3961 4103 N
+ R B L i n/a 29 3931 3961 4103 N
+ R B L s n/a 29 3931 3961 4103 N
+ R B M e n/a 29 3931 3940 4106 N
+ R B M s n/a 29 3931 3940 4106 N
+ R B N b n/a 29 3937 3945 4086 N
+ R B N e n/a 29 3931 3940 4086 N
+ R B N s n/a 29 3931 3940 4086 N
+ R B NG e n/a 29 3931 3940 4085 N
+ R B NG s n/a 29 3931 3940 4085 N
+ R B OW b n/a 29 3937 3968 4073 N
+ R B OW e n/a 29 3931 3969 4075 N
+ R B OW i n/a 29 3931 3969 4073 N
+ R B OW s n/a 29 3931 3969 4073 N
+ R B OY b n/a 29 3937 3966 4070 N
+ R B OY e n/a 29 3931 3966 4075 N
+ R B OY i n/a 29 3931 3966 4070 N
+ R B OY s n/a 29 3931 3966 4070 N
+ R B P b n/a 29 3937 3945 4101 N
+ R B P e n/a 29 3931 3940 4101 N
+ R B P s n/a 29 3931 3940 4101 N
+ R B R b n/a 29 3937 3967 4108 N
+ R B R e n/a 29 3931 3961 4108 N
+ R B R s n/a 29 3931 3961 4108 N
+ R B S b n/a 29 3937 3945 4083 N
+ R B S e n/a 29 3931 3940 4083 N
+ R B S s n/a 29 3931 3940 4083 N
+ R B SH e n/a 29 3931 3940 4083 N
+ R B SH s n/a 29 3931 3940 4083 N
+ R B SIL e n/a 29 3931 3940 4110 N
+ R B SIL s n/a 29 3931 3940 4110 N
+ R B T b n/a 29 3937 3945 4095 N
+ R B T e n/a 29 3931 3940 4095 N
+ R B T i n/a 29 3931 3940 4095 N
+ R B T s n/a 29 3931 3940 4095 N
+ R B TH e n/a 29 3931 3940 4088 N
+ R B TH s n/a 29 3931 3940 4088 N
+ R B UH b n/a 29 3936 3973 4048 N
+ R B UH e n/a 29 3933 3973 4048 N
+ R B UH i n/a 29 3933 3983 4048 N
+ R B UH s n/a 29 3933 3973 4048 N
+ R B UW b n/a 29 3936 3973 4048 N
+ R B UW e n/a 29 3933 3973 4048 N
+ R B UW i n/a 29 3933 3983 4048 N
+ R B UW s n/a 29 3933 3973 4048 N
+ R B V e n/a 29 3931 3940 4101 N
+ R B V s n/a 29 3931 3940 4101 N
+ R B W b n/a 29 3937 3967 4108 N
+ R B W e n/a 29 3931 3961 4108 N
+ R B W i n/a 29 3931 3961 4108 N
+ R B W s n/a 29 3931 3961 4108 N
+ R B Y b n/a 29 3936 3971 4091 N
+ R B Y e n/a 29 3933 3971 4091 N
+ R B Y s n/a 29 3933 3971 4091 N
+ R B Z b n/a 29 3937 3945 4092 N
+ R B Z e n/a 29 3931 3940 4092 N
+ R B Z i n/a 29 3931 3940 4092 N
+ R B Z s n/a 29 3931 3940 4092 N
+ R B ZH e n/a 29 3931 3940 4092 N
+ R B ZH s n/a 29 3931 3940 4092 N
+ R CH AA b n/a 29 3937 3964 4069 N
+ R CH AA e n/a 29 3895 3964 4075 N
+ R CH AA s n/a 29 3895 3964 4069 N
+ R CH AE b n/a 29 3936 3945 4058 N
+ R CH AE e n/a 29 3895 3940 4075 N
+ R CH AE s n/a 29 3895 3940 4058 N
+ R CH AH b n/a 29 3936 3954 4063 N
+ R CH AH e n/a 29 3901 3954 4061 N
+ R CH AH i n/a 29 3901 3951 4061 N
+ R CH AH s n/a 29 3901 3954 4061 N
+ R CH AO b n/a 29 3937 3966 4069 N
+ R CH AO e n/a 29 3895 3966 4075 N
+ R CH AO s n/a 29 3895 3966 4069 N
+ R CH AW b n/a 29 3936 3945 4058 N
+ R CH AW e n/a 29 3895 3940 4075 N
+ R CH AW s n/a 29 3895 3940 4058 N
+ R CH AY b n/a 29 3937 3964 4067 N
+ R CH AY e n/a 29 3895 3964 4075 N
+ R CH AY i n/a 29 3895 3959 4067 N
+ R CH AY s n/a 29 3895 3964 4067 N
+ R CH B b n/a 29 3937 3945 4101 N
+ R CH B e n/a 29 3895 3940 4101 N
+ R CH B s n/a 29 3895 3940 4101 N
+ R CH CH e n/a 29 3895 3940 4095 N
+ R CH CH s n/a 29 3895 3940 4095 N
+ R CH D b n/a 29 3937 3945 4098 N
+ R CH D e n/a 29 3895 3940 4098 N
+ R CH D s n/a 29 3895 3940 4098 N
+ R CH DH e n/a 29 3895 3940 4087 N
+ R CH DH s n/a 29 3895 3940 4087 N
+ R CH EH b n/a 29 3936 3944 4056 N
+ R CH EH e n/a 29 3895 3940 4061 N
+ R CH EH s n/a 29 3895 3940 4056 N
+ R CH ER e n/a 29 3901 3955 4061 N
+ R CH ER s n/a 29 3901 3955 4061 N
+ R CH EY b n/a 29 3936 3946 4041 N
+ R CH EY e n/a 29 3895 3942 4040 N
+ R CH EY s n/a 29 3895 3942 4041 N
+ R CH F b n/a 29 3937 3945 4102 N
+ R CH F e n/a 29 3895 3940 4102 N
+ R CH F s n/a 29 3895 3940 4102 N
+ R CH G b n/a 29 3937 3945 4098 N
+ R CH G e n/a 29 3895 3940 4097 N
+ R CH G s n/a 29 3895 3940 4098 N
+ R CH HH e n/a 29 3895 3940 4085 N
+ R CH HH s n/a 29 3895 3940 4085 N
+ R CH IH b n/a 29 3934 3970 4045 N
+ R CH IH e n/a 29 3901 3970 4045 N
+ R CH IH i n/a 29 3901 3975 4046 N
+ R CH IH s n/a 29 3901 3970 4045 N
+ R CH IY b n/a 29 3934 3972 4051 N
+ R CH IY e n/a 29 3901 3972 4050 N
+ R CH IY i n/a 29 3901 3976 4052 N
+ R CH IY s n/a 29 3901 3972 4050 N
+ R CH JH e n/a 29 3895 3940 4098 N
+ R CH JH s n/a 29 3895 3940 4098 N
+ R CH K b n/a 29 3937 3945 4096 N
+ R CH K e n/a 29 3895 3940 4096 N
+ R CH K s n/a 29 3895 3940 4096 N
+ R CH L e n/a 29 3895 3961 4103 N
+ R CH L s n/a 29 3895 3961 4103 N
+ R CH M e n/a 29 3895 3940 4106 N
+ R CH M s n/a 29 3895 3940 4106 N
+ R CH N b n/a 29 3937 3945 4086 N
+ R CH N e n/a 29 3895 3940 4086 N
+ R CH N s n/a 29 3895 3940 4086 N
+ R CH NG e n/a 29 3895 3940 4085 N
+ R CH NG s n/a 29 3895 3940 4085 N
+ R CH OW b n/a 29 3937 3968 4073 N
+ R CH OW e n/a 29 3895 3969 4075 N
+ R CH OW i n/a 29 3895 3957 4072 N
+ R CH OW s n/a 29 3895 3969 4073 N
+ R CH OY b n/a 29 3937 3966 4070 N
+ R CH OY e n/a 29 3895 3966 4075 N
+ R CH OY s n/a 29 3895 3966 4070 N
+ R CH P b n/a 29 3937 3945 4101 N
+ R CH P e n/a 29 3895 3940 4101 N
+ R CH P s n/a 29 3895 3940 4101 N
+ R CH R b n/a 29 3937 3967 4108 N
+ R CH R e n/a 29 3895 3961 4108 N
+ R CH R s n/a 29 3895 3961 4108 N
+ R CH S b n/a 29 3937 3945 4083 N
+ R CH S e n/a 29 3895 3940 4083 N
+ R CH S s n/a 29 3895 3940 4083 N
+ R CH SH e n/a 29 3895 3940 4083 N
+ R CH SH s n/a 29 3895 3940 4083 N
+ R CH SIL e n/a 29 3895 3940 4110 N
+ R CH SIL s n/a 29 3895 3940 4110 N
+ R CH T b n/a 29 3937 3945 4095 N
+ R CH T e n/a 29 3895 3940 4095 N
+ R CH T s n/a 29 3895 3940 4095 N
+ R CH TH e n/a 29 3895 3940 4088 N
+ R CH TH s n/a 29 3895 3940 4088 N
+ R CH UH b n/a 29 3935 3973 4048 N
+ R CH UH e n/a 29 3901 3973 4047 N
+ R CH UH s n/a 29 3901 3973 4047 N
+ R CH UW b n/a 29 3935 3973 4048 N
+ R CH UW e n/a 29 3901 3973 4047 N
+ R CH UW i n/a 29 3901 3982 4047 N
+ R CH UW s n/a 29 3901 3973 4047 N
+ R CH V e n/a 29 3895 3940 4101 N
+ R CH V s n/a 29 3895 3940 4101 N
+ R CH W b n/a 29 3937 3967 4108 N
+ R CH W e n/a 29 3895 3961 4108 N
+ R CH W s n/a 29 3895 3961 4108 N
+ R CH Y b n/a 29 3934 3970 4091 N
+ R CH Y e n/a 29 3901 3970 4091 N
+ R CH Y s n/a 29 3901 3970 4091 N
+ R CH Z b n/a 29 3937 3945 4092 N
+ R CH Z e n/a 29 3895 3940 4092 N
+ R CH Z s n/a 29 3895 3940 4092 N
+ R CH ZH e n/a 29 3895 3940 4092 N
+ R CH ZH s n/a 29 3895 3940 4092 N
+ R D AA b n/a 29 3937 3964 4069 N
+ R D AA i n/a 29 3915 3963 4069 N
+ R D AA s n/a 29 3915 3963 4069 N
+ R D AE b n/a 29 3937 3945 4058 N
+ R D AE i n/a 29 3915 3949 4057 N
+ R D AE s n/a 29 3915 3949 4058 N
+ R D AH b n/a 29 3937 3967 4063 N
+ R D AH i n/a 29 3916 3960 4064 N
+ R D AH s n/a 29 3916 3960 4064 N
+ R D AO b n/a 29 3937 3966 4070 N
+ R D AO i n/a 29 3915 3963 4070 N
+ R D AO s n/a 29 3915 3963 4070 N
+ R D AW b n/a 29 3937 3945 4058 N
+ R D AW i n/a 29 3915 3949 4057 N
+ R D AW s n/a 29 3915 3949 4058 N
+ R D AY b n/a 29 3937 3964 4067 N
+ R D AY i n/a 29 3915 3963 4068 N
+ R D AY s n/a 29 3915 3963 4067 N
+ R D B b n/a 29 3937 3945 4101 N
+ R D B s n/a 29 3915 3949 4101 N
+ R D CH s n/a 29 3915 3949 4095 N
+ R D D b n/a 29 3937 3945 4098 N
+ R D D s n/a 29 3915 3949 4098 N
+ R D DH s n/a 29 3915 3949 4087 N
+ R D EH b n/a 29 3937 3944 4056 N
+ R D EH i n/a 29 3916 3949 4054 N
+ R D EH s n/a 29 3916 3949 4056 N
+ R D ER s n/a 29 3916 3960 4064 N
+ R D EY b n/a 29 3937 3946 4041 N
+ R D EY i n/a 29 3915 3942 4041 N
+ R D EY s n/a 29 3915 3942 4041 N
+ R D F b n/a 29 3937 3945 4102 N
+ R D F s n/a 29 3915 3949 4102 N
+ R D G b n/a 29 3937 3945 4098 N
+ R D G s n/a 29 3915 3949 4098 N
+ R D HH s n/a 29 3915 3949 4085 N
+ R D IH b n/a 29 3936 3971 4045 N
+ R D IH i n/a 29 3916 3974 4046 N
+ R D IH s n/a 29 3916 3971 4045 N
+ R D IY b n/a 29 3936 3972 4051 N
+ R D IY i n/a 29 3916 3974 4052 N
+ R D IY s n/a 29 3916 3972 4049 N
+ R D JH s n/a 29 3915 3949 4098 N
+ R D K b n/a 29 3937 3945 4096 N
+ R D K i n/a 29 3915 3949 4096 N
+ R D K s n/a 29 3915 3949 4096 N
+ R D L s n/a 29 3915 3960 4103 N
+ R D M s n/a 29 3915 3949 4106 N
+ R D N b n/a 29 3937 3945 4086 N
+ R D N s n/a 29 3915 3949 4086 N
+ R D NG s n/a 29 3915 3949 4085 N
+ R D OW b n/a 29 3937 3968 4073 N
+ R D OW i n/a 29 3915 3963 4072 N
+ R D OW s n/a 29 3915 3963 4073 N
+ R D OY b n/a 29 3937 3966 4070 N
+ R D OY i n/a 29 3915 3963 4070 N
+ R D OY s n/a 29 3915 3963 4070 N
+ R D P b n/a 29 3937 3945 4101 N
+ R D P s n/a 29 3915 3949 4101 N
+ R D R b n/a 29 3937 3967 4108 N
+ R D R s n/a 29 3915 3960 4108 N
+ R D S b n/a 29 3937 3945 4083 N
+ R D S s n/a 29 3915 3949 4083 N
+ R D SH s n/a 29 3915 3949 4083 N
+ R D SIL s n/a 29 3915 3949 4110 N
+ R D T b n/a 29 3937 3945 4095 N
+ R D T s n/a 29 3915 3949 4095 N
+ R D TH s n/a 29 3915 3949 4088 N
+ R D UH b n/a 29 3936 3973 4048 N
+ R D UH s n/a 29 3916 3973 4047 N
+ R D UW b n/a 29 3936 3973 4048 N
+ R D UW i n/a 29 3916 3984 4047 N
+ R D UW s n/a 29 3916 3973 4047 N
+ R D V s n/a 29 3915 3949 4101 N
+ R D W b n/a 29 3937 3967 4108 N
+ R D W i n/a 29 3915 3960 4108 N
+ R D W s n/a 29 3915 3960 4108 N
+ R D Y b n/a 29 3936 3971 4091 N
+ R D Y s n/a 29 3916 3971 4091 N
+ R D Z b n/a 29 3937 3945 4092 N
+ R D Z i n/a 29 3915 3949 4092 N
+ R D Z s n/a 29 3915 3949 4092 N
+ R D ZH s n/a 29 3915 3949 4092 N
+ R DH AA b n/a 29 3937 3964 4069 N
+ R DH AA s n/a 29 3914 3963 4069 N
+ R DH AE b n/a 29 3937 3945 4058 N
+ R DH AE s n/a 29 3914 3949 4058 N
+ R DH AH b n/a 29 3937 3967 4063 N
+ R DH AH i n/a 29 3914 3960 4064 N
+ R DH AH s n/a 29 3914 3960 4064 N
+ R DH AO b n/a 29 3937 3966 4069 N
+ R DH AO s n/a 29 3913 3963 4069 N
+ R DH AW b n/a 29 3937 3945 4058 N
+ R DH AW s n/a 29 3914 3949 4058 N
+ R DH AY b n/a 29 3937 3964 4067 N
+ R DH AY s n/a 29 3914 3963 4067 N
+ R DH B b n/a 29 3937 3945 4101 N
+ R DH B s n/a 29 3914 3949 4101 N
+ R DH CH s n/a 29 3914 3949 4095 N
+ R DH D b n/a 29 3937 3945 4098 N
+ R DH D s n/a 29 3914 3949 4098 N
+ R DH DH s n/a 29 3914 3949 4087 N
+ R DH EH b n/a 29 3937 3944 4056 N
+ R DH EH s n/a 29 3914 3949 4056 N
+ R DH ER s n/a 29 3913 3960 4064 N
+ R DH EY b n/a 29 3937 3946 4041 N
+ R DH EY s n/a 29 3914 3942 4041 N
+ R DH F b n/a 29 3937 3945 4102 N
+ R DH F s n/a 29 3914 3949 4102 N
+ R DH G b n/a 29 3937 3945 4098 N
+ R DH G s n/a 29 3914 3949 4098 N
+ R DH HH s n/a 29 3914 3949 4085 N
+ R DH IH b n/a 29 3936 3971 4045 N
+ R DH IH i n/a 29 3914 3974 4046 N
+ R DH IH s n/a 29 3914 3971 4045 N
+ R DH IY b n/a 29 3936 3972 4051 N
+ R DH IY i n/a 29 3914 3976 4052 N
+ R DH IY s n/a 29 3914 3972 4051 N
+ R DH JH s n/a 29 3914 3949 4098 N
+ R DH K b n/a 29 3937 3945 4096 N
+ R DH K s n/a 29 3914 3949 4096 N
+ R DH L s n/a 29 3914 3960 4103 N
+ R DH M s n/a 29 3914 3949 4106 N
+ R DH N b n/a 29 3937 3945 4086 N
+ R DH N s n/a 29 3914 3949 4086 N
+ R DH NG s n/a 29 3914 3949 4085 N
+ R DH OW b n/a 29 3937 3968 4073 N
+ R DH OW s n/a 29 3913 3963 4073 N
+ R DH OY b n/a 29 3937 3966 4070 N
+ R DH OY s n/a 29 3913 3963 4070 N
+ R DH P b n/a 29 3937 3945 4101 N
+ R DH P s n/a 29 3914 3949 4101 N
+ R DH R b n/a 29 3937 3967 4108 N
+ R DH R s n/a 29 3914 3960 4108 N
+ R DH S b n/a 29 3937 3945 4083 N
+ R DH S s n/a 29 3914 3949 4083 N
+ R DH SH s n/a 29 3914 3949 4083 N
+ R DH SIL s n/a 29 3914 3949 4110 N
+ R DH T b n/a 29 3937 3945 4095 N
+ R DH T s n/a 29 3914 3949 4095 N
+ R DH TH s n/a 29 3914 3949 4088 N
+ R DH UH b n/a 29 3936 3973 4048 N
+ R DH UH s n/a 29 3913 3973 4047 N
+ R DH UW b n/a 29 3936 3973 4048 N
+ R DH UW s n/a 29 3913 3973 4047 N
+ R DH V s n/a 29 3914 3949 4101 N
+ R DH W b n/a 29 3937 3967 4108 N
+ R DH W s n/a 29 3913 3960 4108 N
+ R DH Y b n/a 29 3936 3971 4091 N
+ R DH Y s n/a 29 3914 3971 4091 N
+ R DH Z b n/a 29 3937 3945 4092 N
+ R DH Z s n/a 29 3914 3949 4092 N
+ R DH ZH s n/a 29 3914 3949 4092 N
+ R EH AA b n/a 29 3917 3964 4069 N
+ R EH AA e n/a 29 3882 4031 4075 N
+ R EH AA i n/a 29 3882 4031 4069 N
+ R EH AA s n/a 29 3882 4031 4069 N
+ R EH AE b n/a 29 3917 3945 4058 N
+ R EH AE e n/a 29 3880 4027 4078 N
+ R EH AE i n/a 29 3882 4030 4057 N
+ R EH AE s n/a 29 3880 4027 4058 N
+ R EH AH b n/a 29 3917 3967 4079 N
+ R EH AH e n/a 29 3880 4026 4076 N
+ R EH AH i n/a 29 3880 4026 4081 N
+ R EH AH s n/a 29 3880 4026 4079 N
+ R EH AO b n/a 29 3917 3966 4069 N
+ R EH AO e n/a 29 3882 4031 4075 N
+ R EH AO i n/a 29 3882 4031 4069 N
+ R EH AO s n/a 29 3882 4031 4069 N
+ R EH AW b n/a 29 3917 3945 4058 N
+ R EH AW e n/a 29 3879 4027 4078 N
+ R EH AW i n/a 29 3882 4030 4057 N
+ R EH AW s n/a 29 3879 4027 4058 N
+ R EH AY b n/a 29 3917 3964 4067 N
+ R EH AY e n/a 29 3882 4031 4075 N
+ R EH AY i n/a 29 3882 4031 4067 N
+ R EH AY s n/a 29 3882 4031 4067 N
+ R EH B b n/a 29 3917 4014 4101 N
+ R EH B e n/a 29 3886 4014 4101 N
+ R EH B i n/a 29 3886 4014 4101 N
+ R EH B s n/a 29 3886 4014 4101 N
+ R EH CH e n/a 29 3887 4017 4094 N
+ R EH CH i n/a 29 3887 4017 4094 N
+ R EH CH s n/a 29 3887 4017 4094 N
+ R EH D b n/a 29 3917 4017 4098 N
+ R EH D e n/a 29 3887 4017 4098 N
+ R EH D i n/a 29 3885 4023 4098 N
+ R EH D s n/a 29 3887 4017 4098 N
+ R EH DH e n/a 29 3889 4019 4089 N
+ R EH DH s n/a 29 3889 4019 4089 N
+ R EH EH b n/a 29 3917 3944 4056 N
+ R EH EH e n/a 29 3880 4027 4078 N
+ R EH EH i n/a 29 3882 4030 4054 N
+ R EH EH s n/a 29 3880 4027 4056 N
+ R EH ER e n/a 29 3880 4026 4082 N
+ R EH ER i n/a 29 3880 4026 4082 N
+ R EH ER s n/a 29 3880 4026 4082 N
+ R EH EY b n/a 29 3917 3946 4041 N
+ R EH EY e n/a 29 3879 4027 4040 N
+ R EH EY i n/a 29 3882 4030 4041 N
+ R EH EY s n/a 29 3879 4027 4041 N
+ R EH F b n/a 29 3917 4014 4102 N
+ R EH F e n/a 29 3886 4014 4102 N
+ R EH F i n/a 29 3886 4014 4102 N
+ R EH F s n/a 29 3886 4014 4102 N
+ R EH G b n/a 29 3917 4017 4098 N
+ R EH G e n/a 29 3887 4017 4097 N
+ R EH G i n/a 29 3888 4023 4098 N
+ R EH G s n/a 29 3887 4017 4098 N
+ R EH HH e n/a 29 3888 4018 4085 N
+ R EH HH i n/a 29 3888 4018 4085 N
+ R EH HH s n/a 29 3888 4018 4085 N
+ R EH IH b n/a 29 3917 3971 4045 N
+ R EH IH e n/a 29 3879 4029 4036 N
+ R EH IH i n/a 29 3880 4027 4034 N
+ R EH IH s n/a 29 3879 4029 4036 N
+ R EH IY b n/a 29 3917 3972 4051 N
+ R EH IY e n/a 29 3879 4033 4050 N
+ R EH IY i n/a 29 3879 4033 4039 N
+ R EH IY s n/a 29 3879 4033 4050 N
+ R EH JH e n/a 29 3887 4017 4098 N
+ R EH JH i n/a 29 3887 4023 4098 N
+ R EH JH s n/a 29 3887 4017 4098 N
+ R EH K b n/a 29 3917 4017 4096 N
+ R EH K e n/a 29 3887 4017 4096 N
+ R EH K i n/a 29 3888 4017 4096 N
+ R EH K s n/a 29 3887 4017 4096 N
+ R EH L e n/a 29 3888 4016 4103 N
+ R EH L i n/a 29 3888 4016 4103 N
+ R EH L s n/a 29 3888 4016 4103 N
+ R EH M e n/a 29 3886 4014 4106 N
+ R EH M i n/a 29 3886 4014 4106 N
+ R EH M s n/a 29 3886 4014 4106 N
+ R EH N b n/a 29 3917 4017 4086 N
+ R EH N e n/a 29 3887 4017 4086 N
+ R EH N i n/a 29 3884 4023 4086 N
+ R EH N s n/a 29 3887 4017 4086 N
+ R EH NG e n/a 29 3887 4017 4085 N
+ R EH NG s n/a 29 3887 4017 4085 N
+ R EH OW b n/a 29 3917 3968 4073 N
+ R EH OW e n/a 29 3882 4031 4075 N
+ R EH OW i n/a 29 3882 4031 4072 N
+ R EH OW s n/a 29 3882 4031 4073 N
+ R EH OY b n/a 29 3917 3966 4070 N
+ R EH OY e n/a 29 3882 4031 4075 N
+ R EH OY i n/a 29 3882 4031 4070 N
+ R EH OY s n/a 29 3882 4031 4070 N
+ R EH P b n/a 29 3917 4014 4101 N
+ R EH P e n/a 29 3886 4014 4101 N
+ R EH P i n/a 29 3886 4014 4101 N
+ R EH P s n/a 29 3886 4014 4101 N
+ R EH R b n/a 29 3917 4013 4105 N
+ R EH R e n/a 29 3886 4013 4105 N
+ R EH R s n/a 29 3886 4013 4105 N
+ R EH S b n/a 29 3917 4018 4083 N
+ R EH S e n/a 29 3887 4018 4083 N
+ R EH S i n/a 29 3885 4018 4083 N
+ R EH S s n/a 29 3887 4018 4083 N
+ R EH SH e n/a 29 3887 4018 4083 N
+ R EH SH i n/a 29 3887 4018 4083 N
+ R EH SH s n/a 29 3887 4018 4083 N
+ R EH SIL e n/a 29 3884 4025 4110 N
+ R EH SIL s n/a 29 3884 4025 4110 N
+ R EH T b n/a 29 3917 4017 4094 N
+ R EH T e n/a 29 3887 4017 4094 N
+ R EH T i n/a 29 3885 4017 4094 N
+ R EH T s n/a 29 3887 4017 4094 N
+ R EH TH e n/a 29 3887 4018 4089 N
+ R EH TH i n/a 29 3887 4018 4089 N
+ R EH TH s n/a 29 3887 4018 4089 N
+ R EH UH b n/a 29 3917 3973 4048 N
+ R EH UH e n/a 29 3879 4031 4048 N
+ R EH UH s n/a 29 3879 4031 4048 N
+ R EH UW b n/a 29 3917 3973 4048 N
+ R EH UW e n/a 29 3879 4031 4048 N
+ R EH UW i n/a 29 3879 4031 4048 N
+ R EH UW s n/a 29 3879 4031 4048 N
+ R EH V e n/a 29 3886 4014 4101 N
+ R EH V i n/a 29 3886 4014 4101 N
+ R EH V s n/a 29 3886 4014 4101 N
+ R EH W b n/a 29 3917 4013 4105 N
+ R EH W e n/a 29 3878 4013 4105 N
+ R EH W i n/a 29 3878 4013 4105 N
+ R EH W s n/a 29 3878 4013 4105 N
+ R EH Y b n/a 29 3917 4017 4091 N
+ R EH Y e n/a 29 3887 4017 4091 N
+ R EH Y i n/a 29 3887 4023 4091 N
+ R EH Y s n/a 29 3887 4017 4091 N
+ R EH Z b n/a 29 3917 4019 4090 N
+ R EH Z e n/a 29 3889 4019 4090 N
+ R EH Z i n/a 29 3885 4023 4090 N
+ R EH Z s n/a 29 3889 4019 4090 N
+ R EH ZH e n/a 29 3889 4019 4090 N
+ R EH ZH i n/a 29 3889 4023 4090 N
+ R EH ZH s n/a 29 3889 4019 4090 N
+ R ER AA b n/a 29 3922 3964 4069 N
+ R ER AA e n/a 29 3857 4003 4075 N
+ R ER AA i n/a 29 3857 4003 4069 N
+ R ER AA s n/a 29 3857 4003 4069 N
+ R ER AE b n/a 29 3923 3945 4058 N
+ R ER AE e n/a 29 3857 4000 4078 N
+ R ER AE i n/a 29 3857 4001 4057 N
+ R ER AE s n/a 29 3857 4000 4058 N
+ R ER AH b n/a 29 3923 3967 4079 N
+ R ER AH e n/a 29 3857 4002 4076 N
+ R ER AH i n/a 29 3857 4002 4080 N
+ R ER AH s n/a 29 3857 4002 4079 N
+ R ER AO b n/a 29 3922 3966 4069 N
+ R ER AO e n/a 29 3857 4003 4075 N
+ R ER AO i n/a 29 3857 4003 4069 N
+ R ER AO s n/a 29 3857 4003 4069 N
+ R ER AW b n/a 29 3923 3945 4058 N
+ R ER AW e n/a 29 3857 4000 4077 N
+ R ER AW s n/a 29 3857 4000 4058 N
+ R ER AY b n/a 29 3922 3964 4067 N
+ R ER AY e n/a 29 3857 4003 4075 N
+ R ER AY i n/a 29 3857 4003 4067 N
+ R ER AY s n/a 29 3857 4003 4067 N
+ R ER B b n/a 29 3922 3996 4100 N
+ R ER B e n/a 29 3857 3996 4100 N
+ R ER B i n/a 29 3857 3996 4100 N
+ R ER B s n/a 29 3857 3996 4100 N
+ R ER CH e n/a 29 3857 4010 4093 N
+ R ER CH s n/a 29 3857 4010 4093 N
+ R ER D b n/a 29 3922 4011 4099 N
+ R ER D e n/a 29 3857 4011 4099 N
+ R ER D i n/a 29 3857 4011 4098 N
+ R ER D s n/a 29 3857 4011 4099 N
+ R ER DH e n/a 29 3857 4011 4087 N
+ R ER DH s n/a 29 3857 4011 4087 N
+ R ER EH b n/a 29 3923 3944 4056 N
+ R ER EH e n/a 29 3857 4000 4078 N
+ R ER EH i n/a 29 3857 4001 4056 N
+ R ER EH s n/a 29 3857 4000 4056 N
+ R ER ER e n/a 29 3857 4004 4082 N
+ R ER ER s n/a 29 3857 4004 4082 N
+ R ER EY b n/a 29 3923 3946 4041 N
+ R ER EY e n/a 29 3857 4000 4040 N
+ R ER EY i n/a 29 3857 4001 4041 N
+ R ER EY s n/a 29 3857 4000 4041 N
+ R ER F b n/a 29 3922 3996 4102 N
+ R ER F e n/a 29 3857 3996 4102 N
+ R ER F s n/a 29 3857 3996 4102 N
+ R ER G b n/a 29 3922 4010 4093 N
+ R ER G e n/a 29 3857 4010 4093 N
+ R ER G s n/a 29 3857 4010 4093 N
+ R ER HH e n/a 29 3857 4011 4085 N
+ R ER HH s n/a 29 3857 4011 4085 N
+ R ER IH b n/a 29 3921 3971 4045 N
+ R ER IH e n/a 29 3857 4000 4036 N
+ R ER IH i n/a 29 3857 4000 4034 N
+ R ER IH s n/a 29 3857 4000 4036 N
+ R ER IY b n/a 29 3921 3972 4051 N
+ R ER IY e n/a 29 3857 4000 4050 N
+ R ER IY i n/a 29 3857 4000 4039 N
+ R ER IY s n/a 29 3857 4000 4050 N
+ R ER JH e n/a 29 3857 4010 4099 N
+ R ER JH s n/a 29 3857 4010 4099 N
+ R ER K b n/a 29 3922 4010 4096 N
+ R ER K e n/a 29 3857 4010 4096 N
+ R ER K s n/a 29 3857 4010 4096 N
+ R ER L e n/a 29 3857 4009 4103 N
+ R ER L s n/a 29 3857 4009 4103 N
+ R ER M e n/a 29 3857 4009 4106 N
+ R ER M s n/a 29 3857 4009 4106 N
+ R ER N b n/a 29 3922 4011 4086 N
+ R ER N e n/a 29 3857 4011 4086 N
+ R ER N i n/a 29 3857 4011 4086 N
+ R ER N s n/a 29 3857 4011 4086 N
+ R ER NG e n/a 29 3857 4011 4085 N
+ R ER NG s n/a 29 3857 4011 4085 N
+ R ER OW b n/a 29 3922 3968 4073 N
+ R ER OW e n/a 29 3857 4003 4075 N
+ R ER OW i n/a 29 3857 4003 4072 N
+ R ER OW s n/a 29 3857 4003 4073 N
+ R ER OY b n/a 29 3922 3966 4070 N
+ R ER OY e n/a 29 3857 4003 4075 N
+ R ER OY s n/a 29 3857 4003 4070 N
+ R ER P b n/a 29 3922 3996 4100 N
+ R ER P e n/a 29 3857 3996 4100 N
+ R ER P s n/a 29 3857 3996 4100 N
+ R ER R b n/a 29 3922 4009 4108 N
+ R ER R e n/a 29 3857 4009 4108 N
+ R ER R s n/a 29 3857 4009 4108 N
+ R ER S b n/a 29 3922 4010 4083 N
+ R ER S e n/a 29 3857 4010 4083 N
+ R ER S s n/a 29 3857 4010 4083 N
+ R ER SH e n/a 29 3857 4011 4083 N
+ R ER SH s n/a 29 3857 4011 4083 N
+ R ER SIL e n/a 29 3857 4011 4109 N
+ R ER SIL s n/a 29 3857 4011 4109 N
+ R ER T b n/a 29 3922 4010 4093 N
+ R ER T e n/a 29 3857 4010 4093 N
+ R ER T i n/a 29 3857 4010 4093 N
+ R ER T s n/a 29 3857 4010 4093 N
+ R ER TH e n/a 29 3857 4010 4088 N
+ R ER TH s n/a 29 3857 4010 4088 N
+ R ER UH b n/a 29 3922 3973 4048 N
+ R ER UH e n/a 29 3857 4000 4048 N
+ R ER UH s n/a 29 3857 4000 4048 N
+ R ER UW b n/a 29 3922 3973 4048 N
+ R ER UW e n/a 29 3857 4000 4048 N
+ R ER UW i n/a 29 3857 4000 4048 N
+ R ER UW s n/a 29 3857 4000 4048 N
+ R ER V e n/a 29 3857 3996 4101 N
+ R ER V s n/a 29 3857 3996 4101 N
+ R ER W b n/a 29 3922 4009 4108 N
+ R ER W e n/a 29 3857 4009 4108 N
+ R ER W s n/a 29 3857 4009 4108 N
+ R ER Y b n/a 29 3921 4000 4091 N
+ R ER Y e n/a 29 3857 4000 4091 N
+ R ER Y s n/a 29 3857 4000 4091 N
+ R ER Z b n/a 29 3922 4011 4092 N
+ R ER Z e n/a 29 3857 4011 4092 N
+ R ER Z i n/a 29 3857 4011 4092 N
+ R ER Z s n/a 29 3857 4011 4092 N
+ R ER ZH e n/a 29 3857 4011 4092 N
+ R ER ZH s n/a 29 3857 4011 4092 N
+ R EY AA b n/a 29 3924 3964 4069 N
+ R EY AA e n/a 29 3883 4031 4075 N
+ R EY AA i n/a 29 3883 4031 4069 N
+ R EY AA s n/a 29 3883 4031 4069 N
+ R EY AE b n/a 29 3924 3945 4058 N
+ R EY AE e n/a 29 3880 4027 4078 N
+ R EY AE s n/a 29 3880 4027 4058 N
+ R EY AH b n/a 29 3924 3967 4079 N
+ R EY AH e n/a 29 3880 4026 4076 N
+ R EY AH i n/a 29 3880 4026 4081 N
+ R EY AH s n/a 29 3880 4026 4079 N
+ R EY AO b n/a 29 3924 3966 4069 N
+ R EY AO e n/a 29 3883 4031 4075 N
+ R EY AO i n/a 29 3883 4031 4069 N
+ R EY AO s n/a 29 3883 4031 4069 N
+ R EY AW b n/a 29 3924 3945 4058 N
+ R EY AW e n/a 29 3879 4027 4078 N
+ R EY AW i n/a 29 3883 4030 4057 N
+ R EY AW s n/a 29 3879 4027 4058 N
+ R EY AY b n/a 29 3924 3964 4067 N
+ R EY AY e n/a 29 3883 4031 4075 N
+ R EY AY i n/a 29 3883 4031 4067 N
+ R EY AY s n/a 29 3883 4031 4067 N
+ R EY B b n/a 29 3924 4014 4101 N
+ R EY B e n/a 29 3886 4014 4101 N
+ R EY B s n/a 29 3886 4014 4101 N
+ R EY CH e n/a 29 3887 4017 4094 N
+ R EY CH s n/a 29 3887 4017 4094 N
+ R EY D b n/a 29 3924 4017 4098 N
+ R EY D e n/a 29 3887 4017 4098 N
+ R EY D s n/a 29 3887 4017 4098 N
+ R EY DH e n/a 29 3889 4019 4089 N
+ R EY DH s n/a 29 3889 4019 4089 N
+ R EY EH b n/a 29 3924 3944 4056 N
+ R EY EH e n/a 29 3880 4027 4078 N
+ R EY EH i n/a 29 3883 4030 4053 N
+ R EY EH s n/a 29 3880 4027 4056 N
+ R EY ER e n/a 29 3880 4026 4082 N
+ R EY ER i n/a 29 3880 4026 4082 N
+ R EY ER s n/a 29 3880 4026 4082 N
+ R EY EY b n/a 29 3924 3946 4041 N
+ R EY EY e n/a 29 3879 4027 4040 N
+ R EY EY s n/a 29 3879 4027 4041 N
+ R EY F b n/a 29 3924 4014 4102 N
+ R EY F e n/a 29 3886 4014 4102 N
+ R EY F s n/a 29 3886 4014 4102 N
+ R EY G b n/a 29 3924 4017 4098 N
+ R EY G e n/a 29 3887 4017 4097 N
+ R EY G s n/a 29 3887 4017 4098 N
+ R EY HH e n/a 29 3888 4018 4085 N
+ R EY HH s n/a 29 3888 4018 4085 N
+ R EY IH b n/a 29 3924 3971 4045 N
+ R EY IH e n/a 29 3879 4029 4036 N
+ R EY IH i n/a 29 3880 4027 4034 N
+ R EY IH s n/a 29 3879 4029 4036 N
+ R EY IY b n/a 29 3924 3972 4051 N
+ R EY IY e n/a 29 3879 4033 4050 N
+ R EY IY i n/a 29 3879 4033 4039 N
+ R EY IY s n/a 29 3879 4033 4050 N
+ R EY JH e n/a 29 3887 4017 4098 N
+ R EY JH s n/a 29 3887 4017 4098 N
+ R EY K b n/a 29 3924 4017 4096 N
+ R EY K e n/a 29 3887 4017 4096 N
+ R EY K s n/a 29 3887 4017 4096 N
+ R EY L e n/a 29 3888 4016 4103 N
+ R EY L s n/a 29 3888 4016 4103 N
+ R EY M e n/a 29 3886 4014 4106 N
+ R EY M s n/a 29 3886 4014 4106 N
+ R EY N b n/a 29 3924 4017 4086 N
+ R EY N e n/a 29 3887 4017 4086 N
+ R EY N s n/a 29 3887 4017 4086 N
+ R EY NG e n/a 29 3887 4017 4085 N
+ R EY NG s n/a 29 3887 4017 4085 N
+ R EY OW b n/a 29 3924 3968 4073 N
+ R EY OW e n/a 29 3883 4031 4075 N
+ R EY OW i n/a 29 3883 4031 4072 N
+ R EY OW s n/a 29 3883 4031 4073 N
+ R EY OY b n/a 29 3924 3966 4070 N
+ R EY OY e n/a 29 3883 4031 4075 N
+ R EY OY i n/a 29 3883 4031 4070 N
+ R EY OY s n/a 29 3883 4031 4070 N
+ R EY P b n/a 29 3924 4014 4100 N
+ R EY P e n/a 29 3886 4014 4100 N
+ R EY P s n/a 29 3886 4014 4100 N
+ R EY R b n/a 29 3924 4013 4105 N
+ R EY R e n/a 29 3886 4013 4105 N
+ R EY R s n/a 29 3886 4013 4105 N
+ R EY S b n/a 29 3924 4018 4083 N
+ R EY S e n/a 29 3887 4018 4083 N
+ R EY S s n/a 29 3887 4018 4083 N
+ R EY SH e n/a 29 3887 4018 4083 N
+ R EY SH s n/a 29 3887 4018 4083 N
+ R EY SIL e n/a 29 3884 4025 4110 N
+ R EY SIL s n/a 29 3884 4025 4110 N
+ R EY T b n/a 29 3924 4017 4094 N
+ R EY T e n/a 29 3887 4017 4094 N
+ R EY T i n/a 29 3885 4017 4094 N
+ R EY T s n/a 29 3887 4017 4094 N
+ R EY TH e n/a 29 3887 4018 4089 N
+ R EY TH s n/a 29 3887 4018 4089 N
+ R EY UH b n/a 29 3924 3973 4048 N
+ R EY UH e n/a 29 3879 4031 4048 N
+ R EY UH s n/a 29 3879 4031 4048 N
+ R EY UW b n/a 29 3924 3973 4048 N
+ R EY UW e n/a 29 3879 4031 4048 N
+ R EY UW i n/a 29 3879 4031 4048 N
+ R EY UW s n/a 29 3879 4031 4048 N
+ R EY V e n/a 29 3886 4014 4101 N
+ R EY V s n/a 29 3886 4014 4101 N
+ R EY W b n/a 29 3924 4013 4105 N
+ R EY W e n/a 29 3878 4013 4105 N
+ R EY W s n/a 29 3878 4013 4105 N
+ R EY Y b n/a 29 3924 4017 4091 N
+ R EY Y e n/a 29 3887 4017 4091 N
+ R EY Y i n/a 29 3887 4023 4091 N
+ R EY Y s n/a 29 3887 4017 4091 N
+ R EY Z b n/a 29 3924 4019 4090 N
+ R EY Z e n/a 29 3889 4019 4090 N
+ R EY Z i n/a 29 3885 4023 4090 N
+ R EY Z s n/a 29 3889 4019 4090 N
+ R EY ZH e n/a 29 3889 4019 4090 N
+ R EY ZH s n/a 29 3889 4019 4090 N
+ R F AA b n/a 29 3937 3964 4069 N
+ R F AA e n/a 29 3894 3964 4075 N
+ R F AA i n/a 29 3894 3959 4069 N
+ R F AA s n/a 29 3894 3964 4069 N
+ R F AE b n/a 29 3937 3945 4058 N
+ R F AE e n/a 29 3894 3941 4075 N
+ R F AE i n/a 29 3894 3941 4057 N
+ R F AE s n/a 29 3894 3941 4058 N
+ R F AH b n/a 29 3937 3952 4060 N
+ R F AH e n/a 29 3895 3952 4060 N
+ R F AH i n/a 29 3895 3952 4060 N
+ R F AH s n/a 29 3895 3952 4060 N
+ R F AO b n/a 29 3937 3966 4069 N
+ R F AO e n/a 29 3894 3966 4075 N
+ R F AO i n/a 29 3894 3959 4069 N
+ R F AO s n/a 29 3894 3966 4069 N
+ R F AW b n/a 29 3937 3945 4058 N
+ R F AW e n/a 29 3894 3941 4075 N
+ R F AW i n/a 29 3894 3941 4057 N
+ R F AW s n/a 29 3894 3941 4058 N
+ R F AY b n/a 29 3937 3964 4067 N
+ R F AY e n/a 29 3894 3964 4075 N
+ R F AY i n/a 29 3894 3959 4067 N
+ R F AY s n/a 29 3894 3964 4067 N
+ R F B b n/a 29 3937 3945 4101 N
+ R F B e n/a 29 3894 3941 4101 N
+ R F B s n/a 29 3894 3941 4101 N
+ R F CH e n/a 29 3894 3941 4095 N
+ R F CH s n/a 29 3894 3941 4095 N
+ R F D b n/a 29 3937 3945 4098 N
+ R F D e n/a 29 3894 3941 4098 N
+ R F D i n/a 29 3894 3941 4098 N
+ R F D s n/a 29 3894 3941 4098 N
+ R F DH e n/a 29 3894 3941 4087 N
+ R F DH s n/a 29 3894 3941 4087 N
+ R F EH b n/a 29 3937 3944 4056 N
+ R F EH e n/a 29 3894 3941 4060 N
+ R F EH i n/a 29 3894 3941 4053 N
+ R F EH s n/a 29 3894 3941 4056 N
+ R F ER e n/a 29 3896 3955 4061 N
+ R F ER i n/a 29 3896 3955 4061 N
+ R F ER s n/a 29 3896 3955 4061 N
+ R F EY b n/a 29 3937 3946 4041 N
+ R F EY e n/a 29 3894 3943 4040 N
+ R F EY i n/a 29 3894 3943 4041 N
+ R F EY s n/a 29 3894 3943 4041 N
+ R F F b n/a 29 3937 3945 4102 N
+ R F F e n/a 29 3894 3941 4102 N
+ R F F s n/a 29 3894 3941 4102 N
+ R F G b n/a 29 3937 3945 4098 N
+ R F G e n/a 29 3894 3941 4097 N
+ R F G s n/a 29 3894 3941 4098 N
+ R F HH e n/a 29 3894 3941 4085 N
+ R F HH s n/a 29 3894 3941 4085 N
+ R F IH b n/a 29 3936 3970 4045 N
+ R F IH e n/a 29 3902 3970 4045 N
+ R F IH i n/a 29 3902 3975 4046 N
+ R F IH s n/a 29 3902 3970 4045 N
+ R F IY b n/a 29 3936 3972 4051 N
+ R F IY e n/a 29 3902 3972 4051 N
+ R F IY i n/a 29 3902 3976 4052 N
+ R F IY s n/a 29 3902 3972 4051 N
+ R F JH e n/a 29 3894 3941 4098 N
+ R F JH s n/a 29 3894 3941 4098 N
+ R F K b n/a 29 3937 3945 4096 N
+ R F K e n/a 29 3894 3941 4096 N
+ R F K s n/a 29 3894 3941 4096 N
+ R F L e n/a 29 3894 3961 4103 N
+ R F L s n/a 29 3894 3961 4103 N
+ R F M e n/a 29 3894 3941 4106 N
+ R F M s n/a 29 3894 3941 4106 N
+ R F N b n/a 29 3937 3945 4086 N
+ R F N e n/a 29 3894 3941 4086 N
+ R F N s n/a 29 3894 3941 4086 N
+ R F NG e n/a 29 3894 3941 4085 N
+ R F NG s n/a 29 3894 3941 4085 N
+ R F OW b n/a 29 3937 3968 4073 N
+ R F OW e n/a 29 3894 3969 4075 N
+ R F OW i n/a 29 3894 3957 4073 N
+ R F OW s n/a 29 3894 3969 4073 N
+ R F OY b n/a 29 3937 3966 4070 N
+ R F OY e n/a 29 3894 3966 4075 N
+ R F OY i n/a 29 3894 3957 4070 N
+ R F OY s n/a 29 3894 3966 4070 N
+ R F P b n/a 29 3937 3945 4101 N
+ R F P e n/a 29 3894 3941 4101 N
+ R F P s n/a 29 3894 3941 4101 N
+ R F R b n/a 29 3937 3967 4108 N
+ R F R e n/a 29 3894 3961 4108 N
+ R F R s n/a 29 3894 3961 4108 N
+ R F S b n/a 29 3937 3945 4083 N
+ R F S e n/a 29 3894 3941 4083 N
+ R F S s n/a 29 3894 3941 4083 N
+ R F SH e n/a 29 3894 3941 4083 N
+ R F SH s n/a 29 3894 3941 4083 N
+ R F SIL e n/a 29 3894 3941 4110 N
+ R F SIL s n/a 29 3894 3941 4110 N
+ R F T b n/a 29 3937 3945 4095 N
+ R F T e n/a 29 3894 3941 4095 N
+ R F T s n/a 29 3894 3941 4095 N
+ R F TH e n/a 29 3894 3941 4088 N
+ R F TH s n/a 29 3894 3941 4088 N
+ R F UH b n/a 29 3936 3973 4048 N
+ R F UH e n/a 29 3902 3973 4047 N
+ R F UH s n/a 29 3902 3973 4047 N
+ R F UW b n/a 29 3936 3973 4048 N
+ R F UW e n/a 29 3902 3973 4047 N
+ R F UW i n/a 29 3902 3982 4047 N
+ R F UW s n/a 29 3902 3973 4047 N
+ R F V e n/a 29 3894 3941 4101 N
+ R F V s n/a 29 3894 3941 4101 N
+ R F W b n/a 29 3937 3967 4108 N
+ R F W e n/a 29 3894 3961 4108 N
+ R F W s n/a 29 3894 3961 4108 N
+ R F Y b n/a 29 3936 3970 4091 N
+ R F Y e n/a 29 3902 3970 4091 N
+ R F Y s n/a 29 3902 3970 4091 N
+ R F Z b n/a 29 3937 3945 4092 N
+ R F Z e n/a 29 3894 3941 4092 N
+ R F Z i n/a 29 3894 3941 4092 N
+ R F Z s n/a 29 3894 3941 4092 N
+ R F ZH e n/a 29 3894 3941 4092 N
+ R F ZH s n/a 29 3894 3941 4092 N
+ R G AA b n/a 29 3937 3964 4069 N
+ R G AA e n/a 29 3927 3964 4075 N
+ R G AA i n/a 29 3927 3965 4069 N
+ R G AA s n/a 29 3927 3964 4069 N
+ R G AE b n/a 29 3937 3945 4058 N
+ R G AE e n/a 29 3926 3940 4075 N
+ R G AE i n/a 29 3926 3940 4057 N
+ R G AE s n/a 29 3926 3940 4058 N
+ R G AH b n/a 29 3937 3967 4063 N
+ R G AH e n/a 29 3926 3961 4064 N
+ R G AH i n/a 29 3926 3961 4064 N
+ R G AH s n/a 29 3926 3961 4064 N
+ R G AO b n/a 29 3937 3966 4069 N
+ R G AO e n/a 29 3927 3966 4075 N
+ R G AO i n/a 29 3927 3965 4069 N
+ R G AO s n/a 29 3927 3966 4069 N
+ R G AW b n/a 29 3937 3945 4058 N
+ R G AW e n/a 29 3926 3940 4075 N
+ R G AW i n/a 29 3926 3940 4057 N
+ R G AW s n/a 29 3926 3940 4058 N
+ R G AY b n/a 29 3937 3964 4067 N
+ R G AY e n/a 29 3927 3964 4075 N
+ R G AY i n/a 29 3927 3965 4067 N
+ R G AY s n/a 29 3927 3964 4067 N
+ R G B b n/a 29 3937 3945 4101 N
+ R G B e n/a 29 3926 3940 4101 N
+ R G B s n/a 29 3926 3940 4101 N
+ R G CH e n/a 29 3926 3940 4095 N
+ R G CH s n/a 29 3926 3940 4095 N
+ R G D b n/a 29 3937 3945 4098 N
+ R G D e n/a 29 3926 3940 4098 N
+ R G D s n/a 29 3926 3940 4098 N
+ R G DH e n/a 29 3926 3940 4087 N
+ R G DH s n/a 29 3926 3940 4087 N
+ R G EH b n/a 29 3937 3944 4056 N
+ R G EH e n/a 29 3926 3940 4064 N
+ R G EH i n/a 29 3926 3940 4054 N
+ R G EH s n/a 29 3926 3940 4056 N
+ R G ER e n/a 29 3927 3961 4064 N
+ R G ER s n/a 29 3927 3961 4064 N
+ R G EY b n/a 29 3937 3946 4042 N
+ R G EY e n/a 29 3926 3942 4042 N
+ R G EY i n/a 29 3926 3942 4042 N
+ R G EY s n/a 29 3926 3942 4042 N
+ R G F b n/a 29 3937 3945 4102 N
+ R G F e n/a 29 3926 3940 4102 N
+ R G F s n/a 29 3926 3940 4102 N
+ R G G b n/a 29 3937 3945 4098 N
+ R G G e n/a 29 3926 3940 4097 N
+ R G G s n/a 29 3926 3940 4098 N
+ R G HH e n/a 29 3926 3940 4085 N
+ R G HH s n/a 29 3926 3940 4085 N
+ R G IH b n/a 29 3936 3971 4045 N
+ R G IH e n/a 29 3929 3971 4045 N
+ R G IH i n/a 29 3929 3975 4046 N
+ R G IH s n/a 29 3929 3971 4045 N
+ R G IY b n/a 29 3936 3972 4051 N
+ R G IY e n/a 29 3929 3972 4050 N
+ R G IY i n/a 29 3929 3977 4052 N
+ R G IY s n/a 29 3929 3972 4050 N
+ R G JH e n/a 29 3926 3940 4098 N
+ R G JH s n/a 29 3926 3940 4098 N
+ R G K b n/a 29 3937 3945 4096 N
+ R G K e n/a 29 3926 3940 4096 N
+ R G K s n/a 29 3926 3940 4096 N
+ R G L e n/a 29 3927 3960 4103 N
+ R G L i n/a 29 3927 3960 4103 N
+ R G L s n/a 29 3927 3960 4103 N
+ R G M e n/a 29 3926 3940 4106 N
+ R G M s n/a 29 3926 3940 4106 N
+ R G N b n/a 29 3937 3945 4086 N
+ R G N e n/a 29 3926 3940 4086 N
+ R G N s n/a 29 3926 3940 4086 N
+ R G NG e n/a 29 3926 3940 4085 N
+ R G NG s n/a 29 3926 3940 4085 N
+ R G OW b n/a 29 3937 3968 4073 N
+ R G OW e n/a 29 3927 3969 4075 N
+ R G OW i n/a 29 3927 3969 4072 N
+ R G OW s n/a 29 3927 3969 4073 N
+ R G OY b n/a 29 3937 3966 4070 N
+ R G OY e n/a 29 3927 3966 4075 N
+ R G OY i n/a 29 3927 3966 4070 N
+ R G OY s n/a 29 3927 3966 4070 N
+ R G P b n/a 29 3937 3945 4101 N
+ R G P e n/a 29 3926 3940 4101 N
+ R G P s n/a 29 3926 3940 4101 N
+ R G R b n/a 29 3937 3967 4108 N
+ R G R e n/a 29 3927 3960 4108 N
+ R G R s n/a 29 3927 3960 4108 N
+ R G S b n/a 29 3937 3945 4083 N
+ R G S e n/a 29 3926 3940 4083 N
+ R G S s n/a 29 3926 3940 4083 N
+ R G SH e n/a 29 3926 3940 4083 N
+ R G SH s n/a 29 3926 3940 4083 N
+ R G SIL e n/a 29 3926 3940 4110 N
+ R G SIL s n/a 29 3926 3940 4110 N
+ R G T b n/a 29 3937 3945 4095 N
+ R G T e n/a 29 3926 3940 4095 N
+ R G T s n/a 29 3926 3940 4095 N
+ R G TH e n/a 29 3926 3940 4088 N
+ R G TH s n/a 29 3926 3940 4088 N
+ R G UH b n/a 29 3936 3973 4048 N
+ R G UH e n/a 29 3929 3973 4048 N
+ R G UH i n/a 29 3929 3983 4048 N
+ R G UH s n/a 29 3929 3973 4048 N
+ R G UW b n/a 29 3936 3973 4048 N
+ R G UW e n/a 29 3929 3973 4048 N
+ R G UW i n/a 29 3929 3983 4048 N
+ R G UW s n/a 29 3929 3973 4048 N
+ R G V e n/a 29 3926 3940 4101 N
+ R G V i n/a 29 3926 3940 4101 N
+ R G V s n/a 29 3926 3940 4101 N
+ R G W b n/a 29 3937 3967 4108 N
+ R G W e n/a 29 3927 3960 4108 N
+ R G W s n/a 29 3927 3960 4108 N
+ R G Y b n/a 29 3936 3971 4091 N
+ R G Y e n/a 29 3929 3971 4091 N
+ R G Y s n/a 29 3929 3971 4091 N
+ R G Z b n/a 29 3937 3945 4092 N
+ R G Z e n/a 29 3926 3940 4092 N
+ R G Z i n/a 29 3926 3940 4092 N
+ R G Z s n/a 29 3926 3940 4092 N
+ R G ZH e n/a 29 3926 3940 4092 N
+ R G ZH s n/a 29 3926 3940 4092 N
+ R HH AA b n/a 29 3937 3964 4069 N
+ R HH AA i n/a 29 3895 3958 4069 N
+ R HH AA s n/a 29 3895 3964 4069 N
+ R HH AE b n/a 29 3937 3945 4058 N
+ R HH AE s n/a 29 3895 3940 4058 N
+ R HH AH b n/a 29 3937 3954 4063 N
+ R HH AH i n/a 29 3902 3954 4063 N
+ R HH AH s n/a 29 3902 3954 4063 N
+ R HH AO b n/a 29 3937 3966 4069 N
+ R HH AO i n/a 29 3895 3958 4069 N
+ R HH AO s n/a 29 3895 3966 4069 N
+ R HH AW b n/a 29 3937 3945 4058 N
+ R HH AW s n/a 29 3895 3940 4058 N
+ R HH AY b n/a 29 3937 3964 4067 N
+ R HH AY s n/a 29 3895 3964 4067 N
+ R HH B b n/a 29 3937 3945 4101 N
+ R HH B s n/a 29 3895 3940 4101 N
+ R HH CH s n/a 29 3895 3940 4095 N
+ R HH D b n/a 29 3937 3945 4098 N
+ R HH D s n/a 29 3895 3940 4098 N
+ R HH DH s n/a 29 3895 3940 4087 N
+ R HH EH b n/a 29 3937 3944 4056 N
+ R HH EH i n/a 29 3895 3940 4054 N
+ R HH EH s n/a 29 3895 3940 4056 N
+ R HH ER s n/a 29 3902 3955 4063 N
+ R HH EY b n/a 29 3937 3946 4041 N
+ R HH EY s n/a 29 3895 3942 4041 N
+ R HH F b n/a 29 3937 3945 4102 N
+ R HH F s n/a 29 3895 3940 4102 N
+ R HH G b n/a 29 3937 3945 4098 N
+ R HH G s n/a 29 3895 3940 4098 N
+ R HH HH s n/a 29 3895 3940 4085 N
+ R HH IH b n/a 29 3936 3970 4045 N
+ R HH IH i n/a 29 3899 3975 4046 N
+ R HH IH s n/a 29 3899 3970 4045 N
+ R HH IY b n/a 29 3936 3972 4051 N
+ R HH IY i n/a 29 3899 3976 4052 N
+ R HH IY s n/a 29 3899 3972 4050 N
+ R HH JH s n/a 29 3895 3940 4098 N
+ R HH K b n/a 29 3937 3945 4096 N
+ R HH K i n/a 29 3895 3940 4096 N
+ R HH K s n/a 29 3895 3940 4096 N
+ R HH L s n/a 29 3895 3961 4103 N
+ R HH M s n/a 29 3895 3940 4106 N
+ R HH N b n/a 29 3937 3945 4086 N
+ R HH N s n/a 29 3895 3940 4086 N
+ R HH NG s n/a 29 3895 3940 4085 N
+ R HH OW b n/a 29 3937 3968 4073 N
+ R HH OW i n/a 29 3895 3957 4072 N
+ R HH OW s n/a 29 3895 3969 4073 N
+ R HH OY b n/a 29 3937 3966 4070 N
+ R HH OY s n/a 29 3895 3966 4070 N
+ R HH P b n/a 29 3937 3945 4101 N
+ R HH P s n/a 29 3895 3940 4101 N
+ R HH R b n/a 29 3937 3967 4108 N
+ R HH R s n/a 29 3895 3961 4108 N
+ R HH S b n/a 29 3937 3945 4083 N
+ R HH S s n/a 29 3895 3940 4083 N
+ R HH SH s n/a 29 3895 3940 4083 N
+ R HH SIL s n/a 29 3895 3940 4110 N
+ R HH T b n/a 29 3937 3945 4095 N
+ R HH T s n/a 29 3895 3940 4095 N
+ R HH TH s n/a 29 3895 3940 4088 N
+ R HH UH b n/a 29 3936 3973 4048 N
+ R HH UH i n/a 29 3899 3982 4047 N
+ R HH UH s n/a 29 3899 3973 4047 N
+ R HH UW b n/a 29 3936 3973 4048 N
+ R HH UW i n/a 29 3900 3982 4047 N
+ R HH UW s n/a 29 3900 3973 4047 N
+ R HH V s n/a 29 3895 3940 4101 N
+ R HH W b n/a 29 3937 3967 4108 N
+ R HH W s n/a 29 3895 3961 4108 N
+ R HH Y b n/a 29 3936 3970 4091 N
+ R HH Y s n/a 29 3900 3970 4091 N
+ R HH Z b n/a 29 3937 3945 4092 N
+ R HH Z s n/a 29 3895 3940 4092 N
+ R HH ZH s n/a 29 3895 3940 4092 N
+ R IH AA b n/a 29 3922 3964 4069 N
+ R IH AA e n/a 29 3881 4031 4075 N
+ R IH AA i n/a 29 3876 4030 4069 N
+ R IH AA s n/a 29 3876 4031 4069 N
+ R IH AE b n/a 29 3923 3945 4058 N
+ R IH AE e n/a 29 3881 4028 4078 N
+ R IH AE i n/a 29 3876 4030 4057 N
+ R IH AE s n/a 29 3876 4028 4058 N
+ R IH AH b n/a 29 3923 3967 4079 N
+ R IH AH e n/a 29 3890 4028 4076 N
+ R IH AH i n/a 29 3890 4028 4081 N
+ R IH AH s n/a 29 3890 4028 4079 N
+ R IH AO b n/a 29 3922 3966 4069 N
+ R IH AO e n/a 29 3881 4031 4075 N
+ R IH AO i n/a 29 3877 4031 4069 N
+ R IH AO s n/a 29 3877 4031 4069 N
+ R IH AW b n/a 29 3923 3945 4058 N
+ R IH AW e n/a 29 3883 4028 4078 N
+ R IH AW i n/a 29 3876 4030 4057 N
+ R IH AW s n/a 29 3876 4028 4058 N
+ R IH AY b n/a 29 3922 3964 4067 N
+ R IH AY e n/a 29 3881 4031 4075 N
+ R IH AY i n/a 29 3876 4030 4067 N
+ R IH AY s n/a 29 3876 4031 4067 N
+ R IH B b n/a 29 3922 4015 4101 N
+ R IH B e n/a 29 3890 4015 4101 N
+ R IH B i n/a 29 3890 4015 4101 N
+ R IH B s n/a 29 3890 4015 4101 N
+ R IH CH e n/a 29 3891 4020 4094 N
+ R IH CH i n/a 29 3891 4020 4094 N
+ R IH CH s n/a 29 3891 4020 4094 N
+ R IH D b n/a 29 3922 4021 4098 N
+ R IH D e n/a 29 3891 4020 4098 N
+ R IH D i n/a 29 3891 4021 4098 N
+ R IH D s n/a 29 3891 4021 4098 N
+ R IH DH e n/a 29 3891 4021 4089 N
+ R IH DH s n/a 29 3891 4021 4089 N
+ R IH EH b n/a 29 3923 3944 4056 N
+ R IH EH e n/a 29 3881 4028 4078 N
+ R IH EH i n/a 29 3876 4030 4056 N
+ R IH EH s n/a 29 3876 4028 4056 N
+ R IH ER e n/a 29 3890 4028 4082 N
+ R IH ER i n/a 29 3890 4028 4082 N
+ R IH ER s n/a 29 3890 4028 4082 N
+ R IH EY b n/a 29 3923 3946 4041 N
+ R IH EY e n/a 29 3881 4028 4040 N
+ R IH EY i n/a 29 3876 4030 4041 N
+ R IH EY s n/a 29 3876 4028 4041 N
+ R IH F b n/a 29 3922 4015 4102 N
+ R IH F e n/a 29 3890 4015 4102 N
+ R IH F i n/a 29 3890 4015 4102 N
+ R IH F s n/a 29 3890 4015 4102 N
+ R IH G b n/a 29 3922 4021 4098 N
+ R IH G e n/a 29 3891 4020 4097 N
+ R IH G i n/a 29 3891 4021 4098 N
+ R IH G s n/a 29 3891 4021 4098 N
+ R IH HH e n/a 29 3891 4020 4085 N
+ R IH HH i n/a 29 3891 4020 4085 N
+ R IH HH s n/a 29 3891 4020 4085 N
+ R IH IH b n/a 29 3920 3971 4045 N
+ R IH IH e n/a 29 3890 4032 4036 N
+ R IH IH i n/a 29 3890 4032 4034 N
+ R IH IH s n/a 29 3890 4032 4036 N
+ R IH IY b n/a 29 3920 3972 4051 N
+ R IH IY e n/a 29 3890 4032 4049 N
+ R IH IY i n/a 29 3890 4032 4038 N
+ R IH IY s n/a 29 3890 4032 4049 N
+ R IH JH e n/a 29 3891 4020 4098 N
+ R IH JH i n/a 29 3891 4021 4098 N
+ R IH JH s n/a 29 3891 4021 4098 N
+ R IH K b n/a 29 3922 4020 4096 N
+ R IH K e n/a 29 3891 4020 4096 N
+ R IH K i n/a 29 3891 4020 4096 N
+ R IH K s n/a 29 3891 4020 4096 N
+ R IH L e n/a 29 3891 4022 4103 N
+ R IH L i n/a 29 3891 4022 4103 N
+ R IH L s n/a 29 3891 4022 4103 N
+ R IH M e n/a 29 3890 4015 4106 N
+ R IH M i n/a 29 3890 4015 4106 N
+ R IH M s n/a 29 3890 4015 4106 N
+ R IH N b n/a 29 3922 4021 4086 N
+ R IH N e n/a 29 3891 4020 4086 N
+ R IH N i n/a 29 3891 4021 4086 N
+ R IH N s n/a 29 3891 4021 4086 N
+ R IH NG e n/a 29 3891 4020 4085 N
+ R IH NG i n/a 29 3891 4021 4085 N
+ R IH NG s n/a 29 3891 4021 4085 N
+ R IH OW b n/a 29 3922 3968 4073 N
+ R IH OW e n/a 29 3883 4031 4075 N
+ R IH OW i n/a 29 3877 4031 4072 N
+ R IH OW s n/a 29 3877 4031 4073 N
+ R IH OY b n/a 29 3922 3966 4070 N
+ R IH OY e n/a 29 3881 4031 4075 N
+ R IH OY i n/a 29 3877 4031 4070 N
+ R IH OY s n/a 29 3877 4031 4070 N
+ R IH P b n/a 29 3922 4015 4101 N
+ R IH P e n/a 29 3890 4015 4101 N
+ R IH P i n/a 29 3890 4015 4101 N
+ R IH P s n/a 29 3890 4015 4101 N
+ R IH R b n/a 29 3922 4022 4105 N
+ R IH R e n/a 29 3892 4022 4105 N
+ R IH R s n/a 29 3892 4022 4105 N
+ R IH S b n/a 29 3922 4020 4083 N
+ R IH S e n/a 29 3891 4020 4083 N
+ R IH S i n/a 29 3891 4020 4083 N
+ R IH S s n/a 29 3891 4020 4083 N
+ R IH SH e n/a 29 3891 4020 4083 N
+ R IH SH i n/a 29 3891 4020 4083 N
+ R IH SH s n/a 29 3891 4020 4083 N
+ R IH SIL e n/a 29 3892 4024 4110 N
+ R IH SIL s n/a 29 3892 4024 4110 N
+ R IH T b n/a 29 3922 4020 4094 N
+ R IH T e n/a 29 3891 4020 4094 N
+ R IH T i n/a 29 3891 4020 4094 N
+ R IH T s n/a 29 3891 4020 4094 N
+ R IH TH e n/a 29 3891 4020 4089 N
+ R IH TH s n/a 29 3891 4020 4089 N
+ R IH UH b n/a 29 3922 3973 4048 N
+ R IH UH e n/a 29 3890 4032 4048 N
+ R IH UH s n/a 29 3890 4032 4048 N
+ R IH UW b n/a 29 3922 3973 4048 N
+ R IH UW e n/a 29 3890 4032 4048 N
+ R IH UW i n/a 29 3890 4032 4048 N
+ R IH UW s n/a 29 3890 4032 4048 N
+ R IH V e n/a 29 3890 4015 4101 N
+ R IH V i n/a 29 3890 4015 4101 N
+ R IH V s n/a 29 3890 4015 4101 N
+ R IH W b n/a 29 3922 4015 4105 N
+ R IH W e n/a 29 3890 4015 4105 N
+ R IH W i n/a 29 3890 4015 4105 N
+ R IH W s n/a 29 3890 4015 4105 N
+ R IH Y b n/a 29 3920 4021 4091 N
+ R IH Y e n/a 29 3891 4020 4091 N
+ R IH Y i n/a 29 3891 4021 4091 N
+ R IH Y s n/a 29 3891 4021 4091 N
+ R IH Z b n/a 29 3922 4021 4090 N
+ R IH Z e n/a 29 3891 4020 4090 N
+ R IH Z i n/a 29 3891 4021 4090 N
+ R IH Z s n/a 29 3891 4021 4090 N
+ R IH ZH e n/a 29 3891 4020 4090 N
+ R IH ZH s n/a 29 3891 4021 4090 N
+ R IY AA b n/a 29 3924 3964 4069 N
+ R IY AA e n/a 29 3881 4031 4075 N
+ R IY AA i n/a 29 3876 4030 4069 N
+ R IY AA s n/a 29 3876 4031 4069 N
+ R IY AE b n/a 29 3924 3945 4058 N
+ R IY AE e n/a 29 3881 4028 4078 N
+ R IY AE i n/a 29 3876 4030 4057 N
+ R IY AE s n/a 29 3876 4028 4058 N
+ R IY AH b n/a 29 3924 3967 4079 N
+ R IY AH e n/a 29 3890 4028 4076 N
+ R IY AH i n/a 29 3890 4028 4081 N
+ R IY AH s n/a 29 3890 4028 4079 N
+ R IY AO b n/a 29 3924 3966 4069 N
+ R IY AO e n/a 29 3881 4031 4075 N
+ R IY AO i n/a 29 3877 4031 4069 N
+ R IY AO s n/a 29 3877 4031 4069 N
+ R IY AW b n/a 29 3924 3945 4058 N
+ R IY AW e n/a 29 3883 4028 4078 N
+ R IY AW i n/a 29 3876 4030 4057 N
+ R IY AW s n/a 29 3876 4028 4058 N
+ R IY AY b n/a 29 3924 3964 4067 N
+ R IY AY e n/a 29 3881 4031 4075 N
+ R IY AY i n/a 29 3876 4030 4067 N
+ R IY AY s n/a 29 3876 4031 4067 N
+ R IY B b n/a 29 3924 4015 4101 N
+ R IY B e n/a 29 3890 4015 4101 N
+ R IY B s n/a 29 3890 4015 4101 N
+ R IY CH e n/a 29 3891 4020 4094 N
+ R IY CH i n/a 29 3891 4020 4094 N
+ R IY CH s n/a 29 3891 4020 4094 N
+ R IY D b n/a 29 3924 4021 4098 N
+ R IY D e n/a 29 3891 4020 4098 N
+ R IY D i n/a 29 3891 4021 4098 N
+ R IY D s n/a 29 3891 4021 4098 N
+ R IY DH e n/a 29 3891 4021 4089 N
+ R IY DH s n/a 29 3891 4021 4089 N
+ R IY EH b n/a 29 3924 3944 4056 N
+ R IY EH e n/a 29 3881 4028 4078 N
+ R IY EH i n/a 29 3876 4030 4056 N
+ R IY EH s n/a 29 3876 4028 4056 N
+ R IY ER e n/a 29 3890 4028 4082 N
+ R IY ER i n/a 29 3890 4028 4082 N
+ R IY ER s n/a 29 3890 4028 4082 N
+ R IY EY b n/a 29 3924 3946 4041 N
+ R IY EY e n/a 29 3881 4028 4040 N
+ R IY EY i n/a 29 3876 4030 4041 N
+ R IY EY s n/a 29 3876 4028 4041 N
+ R IY F b n/a 29 3924 4015 4102 N
+ R IY F e n/a 29 3890 4015 4102 N
+ R IY F i n/a 29 3890 4015 4102 N
+ R IY F s n/a 29 3890 4015 4102 N
+ R IY G b n/a 29 3924 4021 4098 N
+ R IY G e n/a 29 3891 4020 4097 N
+ R IY G s n/a 29 3891 4021 4098 N
+ R IY HH e n/a 29 3891 4020 4085 N
+ R IY HH i n/a 29 3891 4020 4085 N
+ R IY HH s n/a 29 3891 4020 4085 N
+ R IY IH b n/a 29 3924 3971 4045 N
+ R IY IH e n/a 29 3890 4032 4036 N
+ R IY IH i n/a 29 3890 4032 4034 N
+ R IY IH s n/a 29 3890 4032 4036 N
+ R IY IY b n/a 29 3924 3972 4051 N
+ R IY IY e n/a 29 3890 4032 4049 N
+ R IY IY i n/a 29 3890 4032 4038 N
+ R IY IY s n/a 29 3890 4032 4049 N
+ R IY JH e n/a 29 3891 4020 4098 N
+ R IY JH s n/a 29 3891 4021 4098 N
+ R IY K b n/a 29 3924 4020 4096 N
+ R IY K e n/a 29 3891 4020 4096 N
+ R IY K i n/a 29 3891 4020 4096 N
+ R IY K s n/a 29 3891 4020 4096 N
+ R IY L e n/a 29 3891 4022 4103 N
+ R IY L i n/a 29 3891 4022 4103 N
+ R IY L s n/a 29 3891 4022 4103 N
+ R IY M e n/a 29 3890 4015 4106 N
+ R IY M i n/a 29 3890 4015 4106 N
+ R IY M s n/a 29 3890 4015 4106 N
+ R IY N b n/a 29 3924 4021 4086 N
+ R IY N e n/a 29 3891 4020 4086 N
+ R IY N s n/a 29 3891 4021 4086 N
+ R IY NG e n/a 29 3891 4020 4085 N
+ R IY NG s n/a 29 3891 4021 4085 N
+ R IY OW b n/a 29 3924 3968 4073 N
+ R IY OW e n/a 29 3883 4031 4075 N
+ R IY OW i n/a 29 3877 4031 4072 N
+ R IY OW s n/a 29 3877 4031 4073 N
+ R IY OY b n/a 29 3924 3966 4070 N
+ R IY OY e n/a 29 3881 4031 4075 N
+ R IY OY i n/a 29 3877 4031 4070 N
+ R IY OY s n/a 29 3877 4031 4070 N
+ R IY P b n/a 29 3924 4015 4100 N
+ R IY P e n/a 29 3890 4015 4100 N
+ R IY P i n/a 29 3890 4015 4100 N
+ R IY P s n/a 29 3890 4015 4100 N
+ R IY R b n/a 29 3924 4022 4105 N
+ R IY R e n/a 29 3892 4022 4105 N
+ R IY R s n/a 29 3892 4022 4105 N
+ R IY S b n/a 29 3924 4020 4083 N
+ R IY S e n/a 29 3891 4020 4083 N
+ R IY S i n/a 29 3891 4020 4083 N
+ R IY S s n/a 29 3891 4020 4083 N
+ R IY SH e n/a 29 3891 4020 4083 N
+ R IY SH i n/a 29 3891 4020 4083 N
+ R IY SH s n/a 29 3891 4020 4083 N
+ R IY SIL e n/a 29 3892 4024 4110 N
+ R IY SIL s n/a 29 3892 4024 4110 N
+ R IY T b n/a 29 3924 4020 4094 N
+ R IY T e n/a 29 3891 4020 4094 N
+ R IY T i n/a 29 3891 4020 4094 N
+ R IY T s n/a 29 3891 4020 4094 N
+ R IY TH e n/a 29 3891 4020 4089 N
+ R IY TH s n/a 29 3891 4020 4089 N
+ R IY UH b n/a 29 3924 3973 4048 N
+ R IY UH e n/a 29 3890 4032 4048 N
+ R IY UH s n/a 29 3890 4032 4048 N
+ R IY UW b n/a 29 3924 3973 4048 N
+ R IY UW e n/a 29 3890 4032 4048 N
+ R IY UW i n/a 29 3890 4032 4048 N
+ R IY UW s n/a 29 3890 4032 4048 N
+ R IY V e n/a 29 3890 4015 4101 N
+ R IY V i n/a 29 3890 4015 4101 N
+ R IY V s n/a 29 3890 4015 4101 N
+ R IY W b n/a 29 3924 4015 4105 N
+ R IY W e n/a 29 3890 4015 4105 N
+ R IY W i n/a 29 3890 4015 4105 N
+ R IY W s n/a 29 3890 4015 4105 N
+ R IY Y b n/a 29 3924 4021 4091 N
+ R IY Y e n/a 29 3891 4020 4091 N
+ R IY Y s n/a 29 3891 4021 4091 N
+ R IY Z b n/a 29 3924 4021 4090 N
+ R IY Z e n/a 29 3891 4020 4090 N
+ R IY Z i n/a 29 3891 4021 4090 N
+ R IY Z s n/a 29 3891 4021 4090 N
+ R IY ZH e n/a 29 3891 4020 4090 N
+ R IY ZH s n/a 29 3891 4021 4090 N
+ R JH AA b n/a 29 3937 3964 4069 N
+ R JH AA s n/a 29 3929 3964 4069 N
+ R JH AE b n/a 29 3936 3945 4058 N
+ R JH AE s n/a 29 3929 3940 4058 N
+ R JH AH b n/a 29 3936 3967 4063 N
+ R JH AH i n/a 29 3929 3961 4064 N
+ R JH AH s n/a 29 3929 3961 4064 N
+ R JH AO b n/a 29 3937 3966 4069 N
+ R JH AO s n/a 29 3929 3966 4069 N
+ R JH AW b n/a 29 3936 3945 4058 N
+ R JH AW s n/a 29 3929 3940 4058 N
+ R JH AY b n/a 29 3937 3964 4067 N
+ R JH AY s n/a 29 3929 3964 4067 N
+ R JH B b n/a 29 3937 3945 4101 N
+ R JH B s n/a 29 3929 3940 4101 N
+ R JH CH s n/a 29 3929 3940 4095 N
+ R JH D b n/a 29 3937 3945 4098 N
+ R JH D s n/a 29 3929 3940 4098 N
+ R JH DH s n/a 29 3929 3940 4087 N
+ R JH EH b n/a 29 3936 3944 4056 N
+ R JH EH s n/a 29 3929 3940 4056 N
+ R JH ER s n/a 29 3929 3961 4064 N
+ R JH EY b n/a 29 3936 3946 4041 N
+ R JH EY s n/a 29 3929 3942 4041 N
+ R JH F b n/a 29 3937 3945 4102 N
+ R JH F s n/a 29 3929 3940 4102 N
+ R JH G b n/a 29 3937 3945 4098 N
+ R JH G s n/a 29 3929 3940 4098 N
+ R JH HH s n/a 29 3929 3940 4085 N
+ R JH IH b n/a 29 3934 3971 4045 N
+ R JH IH i n/a 29 3929 3975 4046 N
+ R JH IH s n/a 29 3929 3971 4045 N
+ R JH IY b n/a 29 3934 3972 4051 N
+ R JH IY i n/a 29 3929 3976 4052 N
+ R JH IY s n/a 29 3929 3972 4050 N
+ R JH JH s n/a 29 3929 3940 4098 N
+ R JH K b n/a 29 3937 3945 4096 N
+ R JH K s n/a 29 3929 3940 4096 N
+ R JH L s n/a 29 3929 3961 4103 N
+ R JH M s n/a 29 3929 3940 4106 N
+ R JH N b n/a 29 3937 3945 4086 N
+ R JH N s n/a 29 3929 3940 4086 N
+ R JH NG s n/a 29 3929 3940 4085 N
+ R JH OW b n/a 29 3937 3968 4073 N
+ R JH OW s n/a 29 3929 3969 4073 N
+ R JH OY b n/a 29 3937 3966 4070 N
+ R JH OY s n/a 29 3929 3966 4070 N
+ R JH P b n/a 29 3937 3945 4101 N
+ R JH P s n/a 29 3929 3940 4101 N
+ R JH R b n/a 29 3937 3967 4108 N
+ R JH R s n/a 29 3929 3961 4108 N
+ R JH S b n/a 29 3937 3945 4083 N
+ R JH S s n/a 29 3929 3940 4083 N
+ R JH SH s n/a 29 3929 3940 4083 N
+ R JH SIL s n/a 29 3929 3940 4110 N
+ R JH T b n/a 29 3937 3945 4095 N
+ R JH T s n/a 29 3929 3940 4095 N
+ R JH TH s n/a 29 3929 3940 4088 N
+ R JH UH b n/a 29 3935 3973 4048 N
+ R JH UH s n/a 29 3929 3973 4048 N
+ R JH UW b n/a 29 3935 3973 4048 N
+ R JH UW i n/a 29 3929 3983 4048 N
+ R JH UW s n/a 29 3929 3973 4048 N
+ R JH V s n/a 29 3929 3940 4101 N
+ R JH W b n/a 29 3937 3967 4108 N
+ R JH W s n/a 29 3929 3961 4108 N
+ R JH Y b n/a 29 3934 3971 4091 N
+ R JH Y s n/a 29 3929 3971 4091 N
+ R JH Z b n/a 29 3937 3945 4092 N
+ R JH Z s n/a 29 3929 3940 4092 N
+ R JH ZH s n/a 29 3929 3940 4092 N
+ R K AA b n/a 29 3937 3964 4071 N
+ R K AA e n/a 29 3897 3964 4075 N
+ R K AA i n/a 29 3897 3958 4071 N
+ R K AA s n/a 29 3897 3964 4071 N
+ R K AE b n/a 29 3937 3947 4058 N
+ R K AE e n/a 29 3893 3947 4075 N
+ R K AE i n/a 29 3893 3947 4059 N
+ R K AE s n/a 29 3893 3947 4058 N
+ R K AH b n/a 29 3937 3954 4066 N
+ R K AH e n/a 29 3903 3954 4066 N
+ R K AH i n/a 29 3903 3953 4066 N
+ R K AH s n/a 29 3903 3954 4066 N
+ R K AO b n/a 29 3937 3966 4071 N
+ R K AO e n/a 29 3897 3966 4075 N
+ R K AO i n/a 29 3897 3958 4071 N
+ R K AO s n/a 29 3897 3966 4071 N
+ R K AW b n/a 29 3937 3947 4059 N
+ R K AW e n/a 29 3893 3947 4075 N
+ R K AW i n/a 29 3893 3947 4059 N
+ R K AW s n/a 29 3893 3947 4059 N
+ R K AY b n/a 29 3937 3964 4068 N
+ R K AY e n/a 29 3897 3964 4075 N
+ R K AY i n/a 29 3897 3959 4068 N
+ R K AY s n/a 29 3897 3964 4068 N
+ R K B b n/a 29 3937 3947 4101 N
+ R K B e n/a 29 3893 3947 4101 N
+ R K B s n/a 29 3893 3947 4101 N
+ R K CH e n/a 29 3893 3947 4095 N
+ R K CH s n/a 29 3893 3947 4095 N
+ R K D b n/a 29 3937 3947 4098 N
+ R K D e n/a 29 3893 3947 4098 N
+ R K D s n/a 29 3893 3947 4098 N
+ R K DH e n/a 29 3893 3947 4087 N
+ R K DH s n/a 29 3893 3947 4087 N
+ R K EH b n/a 29 3937 3947 4056 N
+ R K EH e n/a 29 3893 3947 4066 N
+ R K EH i n/a 29 3893 3947 4055 N
+ R K EH s n/a 29 3893 3947 4056 N
+ R K ER e n/a 29 3903 3955 4066 N
+ R K ER s n/a 29 3903 3955 4066 N
+ R K EY b n/a 29 3937 3949 4042 N
+ R K EY e n/a 29 3893 3949 4042 N
+ R K EY i n/a 29 3893 3950 4040 N
+ R K EY s n/a 29 3893 3949 4042 N
+ R K F b n/a 29 3937 3947 4102 N
+ R K F e n/a 29 3893 3947 4102 N
+ R K F s n/a 29 3893 3947 4102 N
+ R K G b n/a 29 3937 3947 4098 N
+ R K G e n/a 29 3893 3947 4097 N
+ R K G s n/a 29 3893 3947 4098 N
+ R K HH e n/a 29 3893 3947 4085 N
+ R K HH s n/a 29 3893 3947 4085 N
+ R K IH b n/a 29 3936 3970 4045 N
+ R K IH e n/a 29 3899 3970 4045 N
+ R K IH i n/a 29 3899 3978 4043 N
+ R K IH s n/a 29 3899 3970 4045 N
+ R K IY b n/a 29 3936 3972 4051 N
+ R K IY e n/a 29 3899 3972 4050 N
+ R K IY i n/a 29 3899 3979 4050 N
+ R K IY s n/a 29 3899 3972 4050 N
+ R K JH e n/a 29 3893 3947 4098 N
+ R K JH s n/a 29 3893 3947 4098 N
+ R K K b n/a 29 3937 3947 4096 N
+ R K K e n/a 29 3893 3947 4096 N
+ R K K i n/a 29 3893 3947 4096 N
+ R K K s n/a 29 3893 3947 4096 N
+ R K L e n/a 29 3897 3961 4103 N
+ R K L s n/a 29 3897 3961 4103 N
+ R K M e n/a 29 3893 3947 4106 N
+ R K M i n/a 29 3893 3947 4106 N
+ R K M s n/a 29 3893 3947 4106 N
+ R K N b n/a 29 3937 3947 4086 N
+ R K N e n/a 29 3893 3947 4086 N
+ R K N s n/a 29 3893 3947 4086 N
+ R K NG e n/a 29 3893 3947 4085 N
+ R K NG s n/a 29 3893 3947 4085 N
+ R K OW b n/a 29 3937 3968 4074 N
+ R K OW e n/a 29 3897 3969 4075 N
+ R K OW i n/a 29 3897 3957 4074 N
+ R K OW s n/a 29 3897 3969 4074 N
+ R K OY b n/a 29 3937 3966 4071 N
+ R K OY e n/a 29 3897 3966 4075 N
+ R K OY i n/a 29 3897 3957 4071 N
+ R K OY s n/a 29 3897 3966 4071 N
+ R K P b n/a 29 3937 3947 4101 N
+ R K P e n/a 29 3893 3947 4101 N
+ R K P i n/a 29 3893 3947 4101 N
+ R K P s n/a 29 3893 3947 4101 N
+ R K R b n/a 29 3937 3967 4108 N
+ R K R e n/a 29 3897 3961 4108 N
+ R K R s n/a 29 3897 3961 4108 N
+ R K S b n/a 29 3937 3947 4083 N
+ R K S e n/a 29 3893 3947 4083 N
+ R K S s n/a 29 3893 3947 4083 N
+ R K SH e n/a 29 3893 3947 4083 N
+ R K SH s n/a 29 3893 3947 4083 N
+ R K SIL e n/a 29 3893 3947 4110 N
+ R K SIL s n/a 29 3893 3947 4110 N
+ R K T b n/a 29 3937 3947 4095 N
+ R K T e n/a 29 3893 3947 4095 N
+ R K T i n/a 29 3893 3947 4095 N
+ R K T s n/a 29 3893 3947 4095 N
+ R K TH e n/a 29 3893 3947 4088 N
+ R K TH s n/a 29 3893 3947 4088 N
+ R K UH b n/a 29 3936 3973 4048 N
+ R K UH e n/a 29 3900 3973 4047 N
+ R K UH i n/a 29 3900 3982 4047 N
+ R K UH s n/a 29 3900 3973 4047 N
+ R K UW b n/a 29 3936 3973 4048 N
+ R K UW e n/a 29 3900 3973 4047 N
+ R K UW i n/a 29 3900 3982 4047 N
+ R K UW s n/a 29 3900 3973 4047 N
+ R K V e n/a 29 3893 3947 4101 N
+ R K V s n/a 29 3893 3947 4101 N
+ R K W b n/a 29 3937 3967 4108 N
+ R K W e n/a 29 3897 3961 4108 N
+ R K W i n/a 29 3897 3953 4108 N
+ R K W s n/a 29 3897 3961 4108 N
+ R K Y b n/a 29 3936 3970 4091 N
+ R K Y e n/a 29 3900 3970 4091 N
+ R K Y i n/a 29 3900 3978 4091 N
+ R K Y s n/a 29 3900 3970 4091 N
+ R K Z b n/a 29 3937 3947 4092 N
+ R K Z e n/a 29 3893 3947 4092 N
+ R K Z i n/a 29 3893 3947 4092 N
+ R K Z s n/a 29 3893 3947 4092 N
+ R K ZH e n/a 29 3893 3947 4092 N
+ R K ZH s n/a 29 3893 3947 4092 N
+ R L AA b n/a 29 3917 3964 4069 N
+ R L AA e n/a 29 3917 3964 4075 N
+ R L AA i n/a 29 3928 3965 4069 N
+ R L AA s n/a 29 3917 3964 4069 N
+ R L AE b n/a 29 3917 3945 4058 N
+ R L AE e n/a 29 3917 3940 4075 N
+ R L AE i n/a 29 3928 3940 4057 N
+ R L AE s n/a 29 3917 3940 4058 N
+ R L AH b n/a 29 3917 3967 4063 N
+ R L AH e n/a 29 3917 3961 4064 N
+ R L AH i n/a 29 3928 3961 4064 N
+ R L AH s n/a 29 3917 3961 4064 N
+ R L AO b n/a 29 3917 3966 4069 N
+ R L AO e n/a 29 3917 3966 4075 N
+ R L AO i n/a 29 3928 3965 4069 N
+ R L AO s n/a 29 3917 3966 4069 N
+ R L AW b n/a 29 3917 3945 4058 N
+ R L AW e n/a 29 3917 3940 4075 N
+ R L AW s n/a 29 3917 3940 4058 N
+ R L AY b n/a 29 3917 3964 4067 N
+ R L AY e n/a 29 3917 3964 4075 N
+ R L AY i n/a 29 3928 3965 4067 N
+ R L AY s n/a 29 3917 3964 4067 N
+ R L B b n/a 29 3917 3945 4100 N
+ R L B e n/a 29 3917 3940 4100 N
+ R L B s n/a 29 3917 3940 4100 N
+ R L CH e n/a 29 3917 3940 4095 N
+ R L CH s n/a 29 3917 3940 4095 N
+ R L D b n/a 29 3917 3945 4098 N
+ R L D e n/a 29 3917 3940 4098 N
+ R L D i n/a 29 3928 3940 4098 N
+ R L D s n/a 29 3917 3940 4098 N
+ R L DH e n/a 29 3917 3940 4087 N
+ R L DH s n/a 29 3917 3940 4087 N
+ R L EH b n/a 29 3917 3944 4056 N
+ R L EH e n/a 29 3917 3940 4064 N
+ R L EH i n/a 29 3928 3940 4056 N
+ R L EH s n/a 29 3917 3940 4056 N
+ R L ER e n/a 29 3917 3961 4064 N
+ R L ER s n/a 29 3917 3961 4064 N
+ R L EY b n/a 29 3917 3946 4041 N
+ R L EY e n/a 29 3917 3942 4040 N
+ R L EY i n/a 29 3928 3942 4041 N
+ R L EY s n/a 29 3917 3942 4041 N
+ R L F b n/a 29 3917 3945 4102 N
+ R L F e n/a 29 3917 3940 4102 N
+ R L F s n/a 29 3917 3940 4102 N
+ R L G b n/a 29 3917 3945 4098 N
+ R L G e n/a 29 3917 3940 4097 N
+ R L G s n/a 29 3917 3940 4098 N
+ R L HH e n/a 29 3917 3940 4085 N
+ R L HH i n/a 29 3928 3940 4085 N
+ R L HH s n/a 29 3917 3940 4085 N
+ R L IH b n/a 29 3917 3971 4045 N
+ R L IH e n/a 29 3917 3971 4045 N
+ R L IH i n/a 29 3928 3975 4046 N
+ R L IH s n/a 29 3917 3971 4045 N
+ R L IY b n/a 29 3917 3972 4051 N
+ R L IY e n/a 29 3917 3972 4050 N
+ R L IY i n/a 29 3928 3977 4052 N
+ R L IY s n/a 29 3917 3972 4050 N
+ R L JH e n/a 29 3917 3940 4098 N
+ R L JH s n/a 29 3917 3940 4098 N
+ R L K b n/a 29 3917 3945 4096 N
+ R L K e n/a 29 3917 3940 4096 N
+ R L K s n/a 29 3917 3940 4096 N
+ R L L e n/a 29 3917 3961 4104 N
+ R L L s n/a 29 3917 3961 4104 N
+ R L M e n/a 29 3917 3940 4107 N
+ R L M s n/a 29 3917 3940 4107 N
+ R L N b n/a 29 3917 3945 4086 N
+ R L N e n/a 29 3917 3940 4086 N
+ R L N s n/a 29 3917 3940 4086 N
+ R L NG e n/a 29 3917 3940 4085 N
+ R L NG s n/a 29 3917 3940 4085 N
+ R L OW b n/a 29 3917 3968 4073 N
+ R L OW e n/a 29 3917 3969 4075 N
+ R L OW i n/a 29 3928 3969 4072 N
+ R L OW s n/a 29 3917 3969 4073 N
+ R L OY b n/a 29 3917 3966 4070 N
+ R L OY e n/a 29 3917 3966 4075 N
+ R L OY i n/a 29 3928 3966 4070 N
+ R L OY s n/a 29 3917 3966 4070 N
+ R L P b n/a 29 3917 3945 4101 N
+ R L P e n/a 29 3917 3940 4101 N
+ R L P s n/a 29 3917 3940 4101 N
+ R L R b n/a 29 3917 3967 4108 N
+ R L R e n/a 29 3917 3961 4108 N
+ R L R s n/a 29 3917 3961 4108 N
+ R L S b n/a 29 3917 3945 4083 N
+ R L S e n/a 29 3917 3940 4083 N
+ R L S s n/a 29 3917 3940 4083 N
+ R L SH e n/a 29 3917 3940 4083 N
+ R L SH s n/a 29 3917 3940 4083 N
+ R L SIL e n/a 29 3917 3940 4109 N
+ R L SIL s n/a 29 3917 3940 4109 N
+ R L T b n/a 29 3917 3945 4095 N
+ R L T e n/a 29 3917 3940 4095 N
+ R L T s n/a 29 3917 3940 4095 N
+ R L TH e n/a 29 3917 3940 4088 N
+ R L TH s n/a 29 3917 3940 4088 N
+ R L UH b n/a 29 3917 3973 4048 N
+ R L UH e n/a 29 3917 3973 4048 N
+ R L UH s n/a 29 3917 3973 4048 N
+ R L UW b n/a 29 3917 3973 4048 N
+ R L UW e n/a 29 3917 3973 4048 N
+ R L UW i n/a 29 3928 3983 4048 N
+ R L UW s n/a 29 3917 3973 4048 N
+ R L V e n/a 29 3917 3940 4101 N
+ R L V s n/a 29 3917 3940 4101 N
+ R L W b n/a 29 3917 3967 4108 N
+ R L W e n/a 29 3917 3961 4108 N
+ R L W s n/a 29 3917 3961 4108 N
+ R L Y b n/a 29 3917 3971 4091 N
+ R L Y e n/a 29 3917 3971 4091 N
+ R L Y s n/a 29 3917 3971 4091 N
+ R L Z b n/a 29 3917 3945 4092 N
+ R L Z e n/a 29 3917 3940 4092 N
+ R L Z s n/a 29 3917 3940 4092 N
+ R L ZH e n/a 29 3917 3940 4092 N
+ R L ZH s n/a 29 3917 3940 4092 N
+ R M AA b n/a 29 3918 3964 4069 N
+ R M AA e n/a 29 3918 3964 4075 N
+ R M AA i n/a 29 3931 3965 4069 N
+ R M AA s n/a 29 3918 3964 4069 N
+ R M AE b n/a 29 3918 3945 4058 N
+ R M AE e n/a 29 3918 3940 4075 N
+ R M AE i n/a 29 3928 3940 4057 N
+ R M AE s n/a 29 3918 3940 4058 N
+ R M AH b n/a 29 3918 3967 4063 N
+ R M AH e n/a 29 3918 3962 4064 N
+ R M AH i n/a 29 3928 3962 4064 N
+ R M AH s n/a 29 3918 3962 4064 N
+ R M AO b n/a 29 3918 3966 4069 N
+ R M AO e n/a 29 3918 3966 4075 N
+ R M AO s n/a 29 3918 3966 4069 N
+ R M AW b n/a 29 3918 3945 4058 N
+ R M AW e n/a 29 3918 3940 4075 N
+ R M AW i n/a 29 3928 3940 4057 N
+ R M AW s n/a 29 3918 3940 4058 N
+ R M AY b n/a 29 3918 3964 4067 N
+ R M AY e n/a 29 3918 3964 4075 N
+ R M AY i n/a 29 3931 3965 4067 N
+ R M AY s n/a 29 3918 3964 4067 N
+ R M B b n/a 29 3918 3945 4101 N
+ R M B e n/a 29 3918 3940 4101 N
+ R M B s n/a 29 3918 3940 4101 N
+ R M CH e n/a 29 3918 3940 4095 N
+ R M CH s n/a 29 3918 3940 4095 N
+ R M D b n/a 29 3918 3945 4098 N
+ R M D e n/a 29 3918 3940 4098 N
+ R M D s n/a 29 3918 3940 4098 N
+ R M DH e n/a 29 3918 3940 4087 N
+ R M DH s n/a 29 3918 3940 4087 N
+ R M EH b n/a 29 3918 3944 4056 N
+ R M EH e n/a 29 3918 3940 4064 N
+ R M EH i n/a 29 3928 3940 4053 N
+ R M EH s n/a 29 3918 3940 4056 N
+ R M ER e n/a 29 3918 3962 4064 N
+ R M ER s n/a 29 3918 3962 4064 N
+ R M EY b n/a 29 3918 3946 4041 N
+ R M EY e n/a 29 3918 3943 4040 N
+ R M EY i n/a 29 3928 3943 4041 N
+ R M EY s n/a 29 3918 3943 4041 N
+ R M F b n/a 29 3918 3945 4102 N
+ R M F e n/a 29 3918 3940 4102 N
+ R M F s n/a 29 3918 3940 4102 N
+ R M G b n/a 29 3918 3945 4098 N
+ R M G e n/a 29 3918 3940 4097 N
+ R M G s n/a 29 3918 3940 4098 N
+ R M HH e n/a 29 3918 3940 4085 N
+ R M HH s n/a 29 3918 3940 4085 N
+ R M IH b n/a 29 3919 3971 4045 N
+ R M IH e n/a 29 3919 3971 4045 N
+ R M IH i n/a 29 3928 3975 4046 N
+ R M IH s n/a 29 3919 3971 4045 N
+ R M IY b n/a 29 3919 3972 4051 N
+ R M IY e n/a 29 3919 3972 4050 N
+ R M IY i n/a 29 3928 3977 4051 N
+ R M IY s n/a 29 3919 3972 4050 N
+ R M JH e n/a 29 3918 3940 4098 N
+ R M JH s n/a 29 3918 3940 4098 N
+ R M K b n/a 29 3918 3945 4096 N
+ R M K e n/a 29 3918 3940 4096 N
+ R M K s n/a 29 3918 3940 4096 N
+ R M L e n/a 29 3918 3962 4103 N
+ R M L s n/a 29 3918 3962 4103 N
+ R M M e n/a 29 3918 3940 4106 N
+ R M M s n/a 29 3918 3940 4106 N
+ R M N b n/a 29 3918 3945 4086 N
+ R M N e n/a 29 3918 3940 4086 N
+ R M N s n/a 29 3918 3940 4086 N
+ R M NG e n/a 29 3918 3940 4085 N
+ R M NG s n/a 29 3918 3940 4085 N
+ R M OW b n/a 29 3918 3968 4073 N
+ R M OW e n/a 29 3918 3969 4075 N
+ R M OW i n/a 29 3931 3969 4073 N
+ R M OW s n/a 29 3918 3969 4073 N
+ R M OY b n/a 29 3918 3966 4070 N
+ R M OY e n/a 29 3918 3966 4075 N
+ R M OY i n/a 29 3931 3966 4070 N
+ R M OY s n/a 29 3918 3966 4070 N
+ R M P b n/a 29 3918 3945 4101 N
+ R M P e n/a 29 3918 3940 4101 N
+ R M P s n/a 29 3918 3940 4101 N
+ R M R b n/a 29 3918 3967 4108 N
+ R M R e n/a 29 3918 3962 4108 N
+ R M R s n/a 29 3918 3962 4108 N
+ R M S b n/a 29 3918 3945 4083 N
+ R M S e n/a 29 3918 3940 4083 N
+ R M S s n/a 29 3918 3940 4083 N
+ R M SH e n/a 29 3918 3940 4083 N
+ R M SH s n/a 29 3918 3940 4083 N
+ R M SIL e n/a 29 3918 3940 4110 N
+ R M SIL s n/a 29 3918 3940 4110 N
+ R M T b n/a 29 3918 3945 4095 N
+ R M T e n/a 29 3918 3940 4095 N
+ R M T s n/a 29 3918 3940 4095 N
+ R M TH e n/a 29 3918 3940 4088 N
+ R M TH s n/a 29 3918 3940 4088 N
+ R M UH b n/a 29 3919 3973 4048 N
+ R M UH e n/a 29 3919 3973 4048 N
+ R M UH s n/a 29 3919 3973 4048 N
+ R M UW b n/a 29 3919 3973 4048 N
+ R M UW e n/a 29 3919 3973 4048 N
+ R M UW s n/a 29 3919 3973 4048 N
+ R M V e n/a 29 3918 3940 4101 N
+ R M V s n/a 29 3918 3940 4101 N
+ R M W b n/a 29 3918 3967 4108 N
+ R M W e n/a 29 3918 3962 4108 N
+ R M W s n/a 29 3918 3962 4108 N
+ R M Y b n/a 29 3919 3971 4091 N
+ R M Y e n/a 29 3919 3971 4091 N
+ R M Y s n/a 29 3919 3971 4091 N
+ R M Z b n/a 29 3918 3945 4092 N
+ R M Z e n/a 29 3918 3940 4092 N
+ R M Z i n/a 29 3928 3940 4092 N
+ R M Z s n/a 29 3918 3940 4092 N
+ R M ZH e n/a 29 3918 3940 4092 N
+ R M ZH s n/a 29 3918 3940 4092 N
+ R N AA b n/a 29 3918 3964 4069 N
+ R N AA i n/a 29 3896 3963 4069 N
+ R N AA s n/a 29 3896 3963 4069 N
+ R N AE b n/a 29 3918 3945 4058 N
+ R N AE i n/a 29 3896 3949 4057 N
+ R N AE s n/a 29 3896 3949 4058 N
+ R N AH b n/a 29 3918 3967 4063 N
+ R N AH i n/a 29 3905 3962 4065 N
+ R N AH s n/a 29 3905 3962 4065 N
+ R N AO b n/a 29 3918 3966 4070 N
+ R N AO i n/a 29 3896 3963 4070 N
+ R N AO s n/a 29 3896 3963 4070 N
+ R N AW b n/a 29 3918 3945 4058 N
+ R N AW s n/a 29 3896 3949 4058 N
+ R N AY b n/a 29 3918 3964 4067 N
+ R N AY i n/a 29 3896 3963 4068 N
+ R N AY s n/a 29 3896 3963 4067 N
+ R N B b n/a 29 3918 3945 4101 N
+ R N B s n/a 29 3896 3949 4101 N
+ R N CH s n/a 29 3896 3949 4095 N
+ R N D b n/a 29 3918 3945 4098 N
+ R N D i n/a 29 3896 3949 4098 N
+ R N D s n/a 29 3896 3949 4098 N
+ R N DH s n/a 29 3896 3949 4087 N
+ R N EH b n/a 29 3918 3944 4056 N
+ R N EH i n/a 29 3896 3949 4054 N
+ R N EH s n/a 29 3896 3949 4056 N
+ R N ER s n/a 29 3905 3962 4065 N
+ R N EY b n/a 29 3918 3946 4041 N
+ R N EY i n/a 29 3896 3942 4041 N
+ R N EY s n/a 29 3896 3942 4041 N
+ R N F b n/a 29 3918 3945 4102 N
+ R N F s n/a 29 3896 3949 4102 N
+ R N G b n/a 29 3918 3945 4098 N
+ R N G s n/a 29 3896 3949 4098 N
+ R N HH s n/a 29 3896 3949 4085 N
+ R N IH b n/a 29 3919 3971 4045 N
+ R N IH i n/a 29 3905 3975 4046 N
+ R N IH s n/a 29 3905 3971 4045 N
+ R N IY b n/a 29 3919 3972 4051 N
+ R N IY i n/a 29 3905 3975 4052 N
+ R N IY s n/a 29 3905 3972 4049 N
+ R N JH s n/a 29 3896 3949 4098 N
+ R N K b n/a 29 3918 3945 4096 N
+ R N K s n/a 29 3896 3949 4096 N
+ R N L s n/a 29 3896 3962 4103 N
+ R N M i n/a 29 3896 3949 4106 N
+ R N M s n/a 29 3896 3949 4106 N
+ R N N b n/a 29 3918 3945 4086 N
+ R N N s n/a 29 3896 3949 4086 N
+ R N NG s n/a 29 3896 3949 4085 N
+ R N OW b n/a 29 3918 3968 4073 N
+ R N OW i n/a 29 3896 3963 4072 N
+ R N OW s n/a 29 3896 3963 4073 N
+ R N OY b n/a 29 3918 3966 4070 N
+ R N OY i n/a 29 3896 3963 4070 N
+ R N OY s n/a 29 3896 3963 4070 N
+ R N P b n/a 29 3918 3945 4101 N
+ R N P s n/a 29 3896 3949 4101 N
+ R N R b n/a 29 3918 3967 4108 N
+ R N R s n/a 29 3896 3962 4108 N
+ R N S b n/a 29 3918 3945 4083 N
+ R N S s n/a 29 3896 3949 4083 N
+ R N SH s n/a 29 3896 3949 4083 N
+ R N SIL s n/a 29 3896 3949 4110 N
+ R N T b n/a 29 3918 3945 4095 N
+ R N T s n/a 29 3896 3949 4095 N
+ R N TH s n/a 29 3896 3949 4088 N
+ R N UH b n/a 29 3919 3973 4048 N
+ R N UH s n/a 29 3905 3973 4047 N
+ R N UW b n/a 29 3919 3973 4048 N
+ R N UW i n/a 29 3905 3984 4047 N
+ R N UW s n/a 29 3905 3973 4047 N
+ R N V s n/a 29 3896 3949 4101 N
+ R N W b n/a 29 3918 3967 4108 N
+ R N W s n/a 29 3896 3962 4108 N
+ R N Y b n/a 29 3919 3971 4091 N
+ R N Y s n/a 29 3905 3971 4091 N
+ R N Z b n/a 29 3918 3945 4092 N
+ R N Z s n/a 29 3896 3949 4092 N
+ R N ZH s n/a 29 3896 3949 4092 N
+ R NG AA b n/a 29 3918 3964 4069 N
+ R NG AA i n/a 29 3927 3965 4069 N
+ R NG AA s n/a 29 3918 3964 4069 N
+ R NG AE b n/a 29 3918 3945 4058 N
+ R NG AE s n/a 29 3918 3940 4058 N
+ R NG AH b n/a 29 3918 3967 4063 N
+ R NG AH i n/a 29 3926 3962 4064 N
+ R NG AH s n/a 29 3918 3962 4064 N
+ R NG AO b n/a 29 3918 3966 4069 N
+ R NG AO s n/a 29 3918 3966 4069 N
+ R NG AW b n/a 29 3918 3945 4058 N
+ R NG AW s n/a 29 3918 3940 4058 N
+ R NG AY b n/a 29 3918 3964 4067 N
+ R NG AY i n/a 29 3927 3965 4067 N
+ R NG AY s n/a 29 3918 3964 4067 N
+ R NG B b n/a 29 3918 3945 4101 N
+ R NG B s n/a 29 3918 3940 4101 N
+ R NG CH s n/a 29 3918 3940 4095 N
+ R NG D b n/a 29 3918 3945 4098 N
+ R NG D s n/a 29 3918 3940 4098 N
+ R NG DH s n/a 29 3918 3940 4087 N
+ R NG EH b n/a 29 3918 3944 4056 N
+ R NG EH i n/a 29 3926 3940 4054 N
+ R NG EH s n/a 29 3918 3940 4056 N
+ R NG ER s n/a 29 3918 3962 4064 N
+ R NG EY b n/a 29 3918 3946 4042 N
+ R NG EY i n/a 29 3926 3942 4042 N
+ R NG EY s n/a 29 3918 3942 4042 N
+ R NG F b n/a 29 3918 3945 4102 N
+ R NG F s n/a 29 3918 3940 4102 N
+ R NG G b n/a 29 3918 3945 4098 N
+ R NG G s n/a 29 3918 3940 4098 N
+ R NG HH s n/a 29 3918 3940 4085 N
+ R NG IH b n/a 29 3919 3971 4045 N
+ R NG IH s n/a 29 3919 3971 4045 N
+ R NG IY b n/a 29 3919 3972 4051 N
+ R NG IY s n/a 29 3919 3972 4050 N
+ R NG JH s n/a 29 3918 3940 4098 N
+ R NG K b n/a 29 3918 3945 4096 N
+ R NG K s n/a 29 3918 3940 4096 N
+ R NG L s n/a 29 3918 3962 4103 N
+ R NG M s n/a 29 3918 3940 4106 N
+ R NG N b n/a 29 3918 3945 4086 N
+ R NG N s n/a 29 3918 3940 4086 N
+ R NG NG s n/a 29 3918 3940 4085 N
+ R NG OW b n/a 29 3918 3968 4073 N
+ R NG OW s n/a 29 3918 3969 4073 N
+ R NG OY b n/a 29 3918 3966 4070 N
+ R NG OY s n/a 29 3918 3966 4070 N
+ R NG P b n/a 29 3918 3945 4101 N
+ R NG P s n/a 29 3918 3940 4101 N
+ R NG R b n/a 29 3918 3967 4108 N
+ R NG R s n/a 29 3918 3962 4108 N
+ R NG S b n/a 29 3918 3945 4083 N
+ R NG S s n/a 29 3918 3940 4083 N
+ R NG SH s n/a 29 3918 3940 4083 N
+ R NG SIL s n/a 29 3918 3940 4110 N
+ R NG T b n/a 29 3918 3945 4095 N
+ R NG T s n/a 29 3918 3940 4095 N
+ R NG TH s n/a 29 3918 3940 4088 N
+ R NG UH b n/a 29 3919 3973 4048 N
+ R NG UH s n/a 29 3919 3973 4048 N
+ R NG UW b n/a 29 3919 3973 4048 N
+ R NG UW i n/a 29 3928 3983 4048 N
+ R NG UW s n/a 29 3919 3973 4048 N
+ R NG V s n/a 29 3918 3940 4101 N
+ R NG W b n/a 29 3918 3967 4108 N
+ R NG W s n/a 29 3918 3962 4108 N
+ R NG Y b n/a 29 3919 3971 4091 N
+ R NG Y s n/a 29 3919 3971 4091 N
+ R NG Z b n/a 29 3918 3945 4092 N
+ R NG Z i n/a 29 3926 3940 4092 N
+ R NG Z s n/a 29 3918 3940 4092 N
+ R NG ZH s n/a 29 3918 3940 4092 N
+ R OW AA b n/a 29 3917 3964 4069 N
+ R OW AA e n/a 29 3857 4003 4075 N
+ R OW AA i n/a 29 3857 4003 4069 N
+ R OW AA s n/a 29 3857 4003 4069 N
+ R OW AE b n/a 29 3917 3945 4058 N
+ R OW AE e n/a 29 3857 4000 4078 N
+ R OW AE i n/a 29 3857 4001 4057 N
+ R OW AE s n/a 29 3857 4000 4058 N
+ R OW AH b n/a 29 3917 3967 4079 N
+ R OW AH e n/a 29 3857 4002 4076 N
+ R OW AH i n/a 29 3857 4002 4081 N
+ R OW AH s n/a 29 3857 4002 4079 N
+ R OW AO b n/a 29 3917 3966 4069 N
+ R OW AO e n/a 29 3857 4003 4075 N
+ R OW AO i n/a 29 3857 4003 4069 N
+ R OW AO s n/a 29 3857 4003 4069 N
+ R OW AW b n/a 29 3917 3945 4058 N
+ R OW AW e n/a 29 3857 4000 4077 N
+ R OW AW i n/a 29 3857 4001 4057 N
+ R OW AW s n/a 29 3857 4000 4058 N
+ R OW AY b n/a 29 3917 3964 4067 N
+ R OW AY e n/a 29 3857 4003 4075 N
+ R OW AY i n/a 29 3857 4003 4067 N
+ R OW AY s n/a 29 3857 4003 4067 N
+ R OW B b n/a 29 3917 3995 4100 N
+ R OW B e n/a 29 3857 3995 4100 N
+ R OW B s n/a 29 3857 3995 4100 N
+ R OW CH e n/a 29 3857 3989 4093 N
+ R OW CH s n/a 29 3857 3989 4093 N
+ R OW D b n/a 29 3917 3989 4099 N
+ R OW D e n/a 29 3857 3989 4099 N
+ R OW D s n/a 29 3857 3989 4099 N
+ R OW DH e n/a 29 3857 3987 4087 N
+ R OW DH s n/a 29 3857 3987 4087 N
+ R OW EH b n/a 29 3917 3944 4056 N
+ R OW EH e n/a 29 3857 3998 4078 N
+ R OW EH i n/a 29 3857 4001 4056 N
+ R OW EH s n/a 29 3857 3998 4056 N
+ R OW ER e n/a 29 3857 4004 4082 N
+ R OW ER s n/a 29 3857 4004 4082 N
+ R OW EY b n/a 29 3917 3946 4041 N
+ R OW EY e n/a 29 3857 3998 4040 N
+ R OW EY i n/a 29 3857 4001 4041 N
+ R OW EY s n/a 29 3857 3998 4041 N
+ R OW F b n/a 29 3917 3995 4102 N
+ R OW F e n/a 29 3857 3995 4102 N
+ R OW F s n/a 29 3857 3995 4102 N
+ R OW G b n/a 29 3917 3990 4093 N
+ R OW G e n/a 29 3857 3990 4093 N
+ R OW G s n/a 29 3857 3990 4093 N
+ R OW HH e n/a 29 3857 3985 4085 N
+ R OW HH s n/a 29 3857 3985 4085 N
+ R OW IH b n/a 29 3917 3971 4045 N
+ R OW IH e n/a 29 3857 3998 4035 N
+ R OW IH i n/a 29 3857 3998 4034 N
+ R OW IH s n/a 29 3857 3998 4035 N
+ R OW IY b n/a 29 3917 3972 4051 N
+ R OW IY e n/a 29 3857 3998 4050 N
+ R OW IY i n/a 29 3857 3998 4039 N
+ R OW IY s n/a 29 3857 3998 4050 N
+ R OW JH e n/a 29 3857 3989 4099 N
+ R OW JH s n/a 29 3857 3989 4099 N
+ R OW K b n/a 29 3917 3990 4096 N
+ R OW K e n/a 29 3857 3990 4096 N
+ R OW K s n/a 29 3857 3990 4096 N
+ R OW L e n/a 29 3857 4007 4104 N
+ R OW L s n/a 29 3857 4007 4104 N
+ R OW M e n/a 29 3857 4005 4107 N
+ R OW M s n/a 29 3857 4005 4107 N
+ R OW N b n/a 29 3917 3987 4086 N
+ R OW N e n/a 29 3857 3987 4086 N
+ R OW N s n/a 29 3857 3987 4086 N
+ R OW NG e n/a 29 3857 3985 4085 N
+ R OW NG s n/a 29 3857 3985 4085 N
+ R OW OW b n/a 29 3917 3968 4073 N
+ R OW OW e n/a 29 3857 4003 4075 N
+ R OW OW i n/a 29 3857 4003 4072 N
+ R OW OW s n/a 29 3857 4003 4073 N
+ R OW OY b n/a 29 3917 3966 4070 N
+ R OW OY e n/a 29 3857 4003 4075 N
+ R OW OY s n/a 29 3857 4003 4070 N
+ R OW P b n/a 29 3917 3995 4100 N
+ R OW P e n/a 29 3857 3995 4100 N
+ R OW P s n/a 29 3857 3995 4100 N
+ R OW R b n/a 29 3917 4008 4108 N
+ R OW R e n/a 29 3857 4008 4108 N
+ R OW R s n/a 29 3857 4008 4108 N
+ R OW S b n/a 29 3917 3986 4083 N
+ R OW S e n/a 29 3857 3986 4083 N
+ R OW S i n/a 29 3857 3986 4083 N
+ R OW S s n/a 29 3857 3986 4083 N
+ R OW SH e n/a 29 3857 3986 4083 N
+ R OW SH s n/a 29 3857 3986 4083 N
+ R OW SIL e n/a 29 3857 4012 4109 N
+ R OW SIL s n/a 29 3857 4012 4109 N
+ R OW T b n/a 29 3917 3989 4093 N
+ R OW T e n/a 29 3857 3989 4093 N
+ R OW T s n/a 29 3857 3989 4093 N
+ R OW TH e n/a 29 3857 3988 4088 N
+ R OW TH s n/a 29 3857 3988 4088 N
+ R OW UH b n/a 29 3917 3973 4048 N
+ R OW UH e n/a 29 3857 3998 4048 N
+ R OW UH i n/a 29 3857 3998 4048 N
+ R OW UH s n/a 29 3857 3998 4048 N
+ R OW UW b n/a 29 3917 3973 4048 N
+ R OW UW e n/a 29 3857 4000 4048 N
+ R OW UW i n/a 29 3857 4000 4048 N
+ R OW UW s n/a 29 3857 4000 4048 N
+ R OW V e n/a 29 3857 3995 4101 N
+ R OW V s n/a 29 3857 3995 4101 N
+ R OW W b n/a 29 3917 4008 4108 N
+ R OW W e n/a 29 3857 4008 4108 N
+ R OW W s n/a 29 3857 4008 4108 N
+ R OW Y b n/a 29 3917 3998 4091 N
+ R OW Y e n/a 29 3857 3998 4091 N
+ R OW Y s n/a 29 3857 3998 4091 N
+ R OW Z b n/a 29 3917 3985 4092 N
+ R OW Z e n/a 29 3857 3985 4092 N
+ R OW Z i n/a 29 3857 3985 4092 N
+ R OW Z s n/a 29 3857 3985 4092 N
+ R OW ZH e n/a 29 3857 3985 4092 N
+ R OW ZH s n/a 29 3857 3985 4092 N
+ R OY AA b n/a 29 3925 3964 4069 N
+ R OY AA e n/a 29 3883 4031 4075 N
+ R OY AA s n/a 29 3883 4031 4069 N
+ R OY AE b n/a 29 3925 3945 4058 N
+ R OY AE e n/a 29 3880 4027 4078 N
+ R OY AE s n/a 29 3880 4027 4058 N
+ R OY AH b n/a 29 3925 3967 4079 N
+ R OY AH e n/a 29 3881 4027 4076 N
+ R OY AH i n/a 29 3882 4027 4081 N
+ R OY AH s n/a 29 3881 4027 4079 N
+ R OY AO b n/a 29 3925 3966 4069 N
+ R OY AO e n/a 29 3883 4031 4075 N
+ R OY AO i n/a 29 3883 4031 4069 N
+ R OY AO s n/a 29 3883 4031 4069 N
+ R OY AW b n/a 29 3925 3945 4058 N
+ R OY AW e n/a 29 3880 4027 4078 N
+ R OY AW s n/a 29 3880 4027 4058 N
+ R OY AY b n/a 29 3925 3964 4067 N
+ R OY AY e n/a 29 3883 4031 4075 N
+ R OY AY i n/a 29 3883 4031 4067 N
+ R OY AY s n/a 29 3883 4031 4067 N
+ R OY B b n/a 29 3925 4014 4101 N
+ R OY B e n/a 29 3889 4014 4101 N
+ R OY B s n/a 29 3889 4014 4101 N
+ R OY CH e n/a 29 3889 4017 4093 N
+ R OY CH s n/a 29 3889 4017 4093 N
+ R OY D b n/a 29 3925 4017 4099 N
+ R OY D e n/a 29 3889 4017 4099 N
+ R OY D i n/a 29 3885 4023 4099 N
+ R OY D s n/a 29 3889 4017 4099 N
+ R OY DH e n/a 29 3889 4019 4089 N
+ R OY DH s n/a 29 3889 4019 4089 N
+ R OY EH b n/a 29 3925 3944 4056 N
+ R OY EH e n/a 29 3880 4027 4078 N
+ R OY EH i n/a 29 3883 4030 4056 N
+ R OY EH s n/a 29 3880 4027 4056 N
+ R OY ER e n/a 29 3881 4026 4082 N
+ R OY ER s n/a 29 3881 4026 4082 N
+ R OY EY b n/a 29 3925 3946 4041 N
+ R OY EY e n/a 29 3880 4027 4040 N
+ R OY EY i n/a 29 3883 4030 4041 N
+ R OY EY s n/a 29 3880 4027 4041 N
+ R OY F b n/a 29 3925 4014 4102 N
+ R OY F e n/a 29 3889 4014 4102 N
+ R OY F s n/a 29 3889 4014 4102 N
+ R OY G b n/a 29 3925 4017 4093 N
+ R OY G e n/a 29 3889 4017 4093 N
+ R OY G s n/a 29 3889 4017 4093 N
+ R OY HH e n/a 29 3889 4018 4085 N
+ R OY HH s n/a 29 3889 4018 4085 N
+ R OY IH b n/a 29 3925 3971 4045 N
+ R OY IH e n/a 29 3881 4029 4036 N
+ R OY IH i n/a 29 3882 4027 4034 N
+ R OY IH s n/a 29 3881 4029 4036 N
+ R OY IY b n/a 29 3925 3972 4051 N
+ R OY IY e n/a 29 3880 4033 4050 N
+ R OY IY i n/a 29 3880 4033 4037 N
+ R OY IY s n/a 29 3880 4033 4050 N
+ R OY JH e n/a 29 3889 4017 4099 N
+ R OY JH s n/a 29 3889 4017 4099 N
+ R OY K b n/a 29 3925 4017 4096 N
+ R OY K e n/a 29 3889 4017 4096 N
+ R OY K s n/a 29 3889 4017 4096 N
+ R OY L e n/a 29 3889 4016 4103 N
+ R OY L s n/a 29 3889 4016 4103 N
+ R OY M e n/a 29 3889 4014 4106 N
+ R OY M s n/a 29 3889 4014 4106 N
+ R OY N b n/a 29 3925 4017 4086 N
+ R OY N e n/a 29 3889 4017 4086 N
+ R OY N s n/a 29 3889 4017 4086 N
+ R OY NG e n/a 29 3889 4017 4085 N
+ R OY NG s n/a 29 3889 4017 4085 N
+ R OY OW b n/a 29 3925 3968 4073 N
+ R OY OW e n/a 29 3883 4031 4075 N
+ R OY OW i n/a 29 3883 4031 4072 N
+ R OY OW s n/a 29 3883 4031 4073 N
+ R OY OY b n/a 29 3925 3966 4070 N
+ R OY OY e n/a 29 3883 4031 4075 N
+ R OY OY s n/a 29 3883 4031 4070 N
+ R OY P b n/a 29 3925 4014 4100 N
+ R OY P e n/a 29 3889 4014 4100 N
+ R OY P s n/a 29 3889 4014 4100 N
+ R OY R b n/a 29 3925 4013 4105 N
+ R OY R e n/a 29 3886 4013 4105 N
+ R OY R s n/a 29 3886 4013 4105 N
+ R OY S b n/a 29 3925 4018 4084 N
+ R OY S e n/a 29 3889 4018 4084 N
+ R OY S s n/a 29 3889 4018 4084 N
+ R OY SH e n/a 29 3889 4018 4084 N
+ R OY SH s n/a 29 3889 4018 4084 N
+ R OY SIL e n/a 29 3884 4025 4110 N
+ R OY SIL s n/a 29 3884 4025 4110 N
+ R OY T b n/a 29 3925 4017 4093 N
+ R OY T e n/a 29 3889 4017 4093 N
+ R OY T i n/a 29 3885 4017 4093 N
+ R OY T s n/a 29 3889 4017 4093 N
+ R OY TH e n/a 29 3889 4018 4089 N
+ R OY TH s n/a 29 3889 4018 4089 N
+ R OY UH b n/a 29 3925 3973 4048 N
+ R OY UH e n/a 29 3879 4031 4048 N
+ R OY UH s n/a 29 3879 4031 4048 N
+ R OY UW b n/a 29 3925 3973 4048 N
+ R OY UW e n/a 29 3880 4031 4048 N
+ R OY UW s n/a 29 3880 4031 4048 N
+ R OY V e n/a 29 3889 4014 4101 N
+ R OY V s n/a 29 3889 4014 4101 N
+ R OY W b n/a 29 3925 4013 4105 N
+ R OY W e n/a 29 3878 4013 4105 N
+ R OY W s n/a 29 3878 4013 4105 N
+ R OY Y b n/a 29 3925 4017 4091 N
+ R OY Y e n/a 29 3889 4017 4091 N
+ R OY Y s n/a 29 3889 4017 4091 N
+ R OY Z b n/a 29 3925 4019 4090 N
+ R OY Z e n/a 29 3889 4019 4090 N
+ R OY Z i n/a 29 3885 4023 4090 N
+ R OY Z s n/a 29 3889 4019 4090 N
+ R OY ZH e n/a 29 3889 4019 4090 N
+ R OY ZH s n/a 29 3889 4019 4090 N
+ R P AA b n/a 29 3937 3964 4071 N
+ R P AA e n/a 29 3898 3964 4075 N
+ R P AA i n/a 29 3898 3958 4071 N
+ R P AA s n/a 29 3898 3964 4071 N
+ R P AE b n/a 29 3937 3947 4058 N
+ R P AE e n/a 29 3893 3947 4075 N
+ R P AE i n/a 29 3893 3947 4059 N
+ R P AE s n/a 29 3893 3947 4058 N
+ R P AH b n/a 29 3937 3954 4060 N
+ R P AH e n/a 29 3903 3954 4060 N
+ R P AH i n/a 29 3903 3953 4062 N
+ R P AH s n/a 29 3903 3954 4060 N
+ R P AO b n/a 29 3937 3966 4071 N
+ R P AO e n/a 29 3898 3966 4075 N
+ R P AO i n/a 29 3898 3958 4071 N
+ R P AO s n/a 29 3898 3966 4071 N
+ R P AW b n/a 29 3937 3947 4059 N
+ R P AW e n/a 29 3893 3947 4075 N
+ R P AW i n/a 29 3893 3947 4059 N
+ R P AW s n/a 29 3893 3947 4059 N
+ R P AY b n/a 29 3937 3964 4068 N
+ R P AY e n/a 29 3898 3964 4075 N
+ R P AY i n/a 29 3898 3959 4068 N
+ R P AY s n/a 29 3898 3964 4068 N
+ R P B b n/a 29 3937 3947 4101 N
+ R P B e n/a 29 3893 3947 4101 N
+ R P B s n/a 29 3893 3947 4101 N
+ R P CH e n/a 29 3893 3947 4095 N
+ R P CH s n/a 29 3893 3947 4095 N
+ R P D b n/a 29 3937 3947 4098 N
+ R P D e n/a 29 3893 3947 4098 N
+ R P D i n/a 29 3893 3947 4098 N
+ R P D s n/a 29 3893 3947 4098 N
+ R P DH e n/a 29 3893 3947 4087 N
+ R P DH s n/a 29 3893 3947 4087 N
+ R P EH b n/a 29 3937 3947 4056 N
+ R P EH e n/a 29 3893 3947 4060 N
+ R P EH i n/a 29 3893 3947 4055 N
+ R P EH s n/a 29 3893 3947 4056 N
+ R P ER e n/a 29 3903 3955 4060 N
+ R P ER s n/a 29 3903 3955 4060 N
+ R P EY b n/a 29 3937 3949 4041 N
+ R P EY e n/a 29 3893 3949 4041 N
+ R P EY i n/a 29 3893 3950 4040 N
+ R P EY s n/a 29 3893 3949 4041 N
+ R P F b n/a 29 3937 3947 4102 N
+ R P F e n/a 29 3893 3947 4102 N
+ R P F s n/a 29 3893 3947 4102 N
+ R P G b n/a 29 3937 3947 4098 N
+ R P G e n/a 29 3893 3947 4097 N
+ R P G i n/a 29 3893 3947 4098 N
+ R P G s n/a 29 3893 3947 4098 N
+ R P HH e n/a 29 3893 3947 4085 N
+ R P HH s n/a 29 3893 3947 4085 N
+ R P IH b n/a 29 3936 3970 4045 N
+ R P IH e n/a 29 3904 3970 4045 N
+ R P IH i n/a 29 3904 3978 4044 N
+ R P IH s n/a 29 3904 3970 4045 N
+ R P IY b n/a 29 3936 3972 4051 N
+ R P IY e n/a 29 3904 3972 4050 N
+ R P IY i n/a 29 3904 3979 4050 N
+ R P IY s n/a 29 3904 3972 4050 N
+ R P JH e n/a 29 3893 3947 4098 N
+ R P JH s n/a 29 3893 3947 4098 N
+ R P K b n/a 29 3937 3947 4096 N
+ R P K e n/a 29 3893 3947 4096 N
+ R P K s n/a 29 3893 3947 4096 N
+ R P L e n/a 29 3898 3961 4103 N
+ R P L s n/a 29 3898 3961 4103 N
+ R P M e n/a 29 3893 3947 4106 N
+ R P M s n/a 29 3893 3947 4106 N
+ R P N b n/a 29 3937 3947 4086 N
+ R P N e n/a 29 3893 3947 4086 N
+ R P N s n/a 29 3893 3947 4086 N
+ R P NG e n/a 29 3893 3947 4085 N
+ R P NG s n/a 29 3893 3947 4085 N
+ R P OW b n/a 29 3937 3968 4074 N
+ R P OW e n/a 29 3897 3969 4075 N
+ R P OW i n/a 29 3897 3957 4074 N
+ R P OW s n/a 29 3897 3969 4074 N
+ R P OY b n/a 29 3937 3966 4071 N
+ R P OY e n/a 29 3897 3966 4075 N
+ R P OY i n/a 29 3897 3957 4071 N
+ R P OY s n/a 29 3897 3966 4071 N
+ R P P b n/a 29 3937 3947 4101 N
+ R P P e n/a 29 3893 3947 4101 N
+ R P P s n/a 29 3893 3947 4101 N
+ R P R b n/a 29 3937 3967 4108 N
+ R P R e n/a 29 3898 3961 4108 N
+ R P R s n/a 29 3898 3961 4108 N
+ R P S b n/a 29 3937 3947 4083 N
+ R P S e n/a 29 3893 3947 4083 N
+ R P S s n/a 29 3893 3947 4083 N
+ R P SH e n/a 29 3893 3947 4083 N
+ R P SH s n/a 29 3893 3947 4083 N
+ R P SIL e n/a 29 3893 3947 4110 N
+ R P SIL s n/a 29 3893 3947 4110 N
+ R P T b n/a 29 3937 3947 4095 N
+ R P T e n/a 29 3893 3947 4095 N
+ R P T s n/a 29 3893 3947 4095 N
+ R P TH e n/a 29 3893 3947 4088 N
+ R P TH s n/a 29 3893 3947 4088 N
+ R P UH b n/a 29 3936 3973 4048 N
+ R P UH e n/a 29 3899 3973 4047 N
+ R P UH i n/a 29 3899 3982 4047 N
+ R P UH s n/a 29 3899 3973 4047 N
+ R P UW b n/a 29 3936 3973 4048 N
+ R P UW e n/a 29 3900 3973 4047 N
+ R P UW i n/a 29 3900 3982 4047 N
+ R P UW s n/a 29 3900 3973 4047 N
+ R P V e n/a 29 3893 3947 4101 N
+ R P V s n/a 29 3893 3947 4101 N
+ R P W b n/a 29 3937 3967 4108 N
+ R P W e n/a 29 3898 3961 4108 N
+ R P W s n/a 29 3898 3961 4108 N
+ R P Y b n/a 29 3936 3970 4091 N
+ R P Y e n/a 29 3904 3970 4091 N
+ R P Y s n/a 29 3904 3970 4091 N
+ R P Z b n/a 29 3937 3947 4092 N
+ R P Z e n/a 29 3893 3947 4092 N
+ R P Z i n/a 29 3893 3947 4092 N
+ R P Z s n/a 29 3893 3947 4092 N
+ R P ZH e n/a 29 3893 3947 4092 N
+ R P ZH s n/a 29 3893 3947 4092 N
+ R R AA b n/a 29 3922 3964 4069 N
+ R R AA e n/a 29 3922 3964 4075 N
+ R R AA s n/a 29 3922 3964 4069 N
+ R R AE b n/a 29 3923 3945 4058 N
+ R R AE e n/a 29 3923 3940 4075 N
+ R R AE s n/a 29 3923 3940 4058 N
+ R R AH b n/a 29 3923 3967 4063 N
+ R R AH e n/a 29 3923 3961 4064 N
+ R R AH s n/a 29 3923 3961 4064 N
+ R R AO b n/a 29 3922 3966 4069 N
+ R R AO e n/a 29 3922 3966 4075 N
+ R R AO s n/a 29 3922 3966 4069 N
+ R R AW b n/a 29 3923 3945 4058 N
+ R R AW e n/a 29 3923 3940 4075 N
+ R R AW s n/a 29 3923 3940 4058 N
+ R R AY b n/a 29 3922 3964 4067 N
+ R R AY e n/a 29 3922 3964 4075 N
+ R R AY s n/a 29 3922 3964 4067 N
+ R R B b n/a 29 3922 3945 4100 N
+ R R B e n/a 29 3922 3940 4100 N
+ R R B s n/a 29 3922 3940 4100 N
+ R R CH e n/a 29 3922 3940 4095 N
+ R R CH s n/a 29 3922 3940 4095 N
+ R R D b n/a 29 3922 3945 4098 N
+ R R D e n/a 29 3922 3940 4098 N
+ R R D s n/a 29 3922 3940 4098 N
+ R R DH e n/a 29 3922 3940 4087 N
+ R R DH s n/a 29 3922 3940 4087 N
+ R R EH b n/a 29 3923 3944 4056 N
+ R R EH e n/a 29 3923 3940 4064 N
+ R R EH s n/a 29 3923 3940 4056 N
+ R R ER e n/a 29 3922 3961 4064 N
+ R R ER s n/a 29 3922 3961 4064 N
+ R R EY b n/a 29 3923 3946 4041 N
+ R R EY e n/a 29 3923 3942 4040 N
+ R R EY s n/a 29 3923 3942 4041 N
+ R R F b n/a 29 3922 3945 4102 N
+ R R F e n/a 29 3922 3940 4102 N
+ R R F s n/a 29 3922 3940 4102 N
+ R R G b n/a 29 3922 3945 4098 N
+ R R G e n/a 29 3922 3940 4097 N
+ R R G s n/a 29 3922 3940 4098 N
+ R R HH e n/a 29 3922 3940 4085 N
+ R R HH s n/a 29 3922 3940 4085 N
+ R R IH b n/a 29 3921 3971 4045 N
+ R R IH e n/a 29 3921 3971 4045 N
+ R R IH s n/a 29 3921 3971 4045 N
+ R R IY b n/a 29 3921 3972 4051 N
+ R R IY e n/a 29 3921 3972 4050 N
+ R R IY s n/a 29 3921 3972 4050 N
+ R R JH e n/a 29 3922 3940 4098 N
+ R R JH s n/a 29 3922 3940 4098 N
+ R R K b n/a 29 3922 3945 4096 N
+ R R K e n/a 29 3922 3940 4096 N
+ R R K s n/a 29 3922 3940 4096 N
+ R R L e n/a 29 3922 3961 4104 N
+ R R L s n/a 29 3922 3961 4104 N
+ R R M e n/a 29 3922 3940 4107 N
+ R R M s n/a 29 3922 3940 4107 N
+ R R N b n/a 29 3922 3945 4086 N
+ R R N e n/a 29 3922 3940 4086 N
+ R R N s n/a 29 3922 3940 4086 N
+ R R NG e n/a 29 3922 3940 4085 N
+ R R NG s n/a 29 3922 3940 4085 N
+ R R OW b n/a 29 3922 3968 4073 N
+ R R OW e n/a 29 3922 3969 4075 N
+ R R OW s n/a 29 3922 3969 4073 N
+ R R OY b n/a 29 3922 3966 4070 N
+ R R OY e n/a 29 3922 3966 4075 N
+ R R OY s n/a 29 3922 3966 4070 N
+ R R P b n/a 29 3922 3945 4101 N
+ R R P e n/a 29 3922 3940 4101 N
+ R R P s n/a 29 3922 3940 4101 N
+ R R R b n/a 29 3922 3967 4108 N
+ R R R e n/a 29 3922 3961 4108 N
+ R R R s n/a 29 3922 3961 4108 N
+ R R S b n/a 29 3922 3945 4083 N
+ R R S e n/a 29 3922 3940 4083 N
+ R R S s n/a 29 3922 3940 4083 N
+ R R SH e n/a 29 3922 3940 4083 N
+ R R SH s n/a 29 3922 3940 4083 N
+ R R SIL e n/a 29 3922 3940 4109 N
+ R R SIL s n/a 29 3922 3940 4109 N
+ R R T b n/a 29 3922 3945 4095 N
+ R R T e n/a 29 3922 3940 4095 N
+ R R T s n/a 29 3922 3940 4095 N
+ R R TH e n/a 29 3922 3940 4088 N
+ R R TH s n/a 29 3922 3940 4088 N
+ R R UH b n/a 29 3922 3973 4048 N
+ R R UH e n/a 29 3922 3973 4048 N
+ R R UH s n/a 29 3922 3973 4048 N
+ R R UW b n/a 29 3922 3973 4048 N
+ R R UW e n/a 29 3922 3973 4048 N
+ R R UW i n/a 29 3928 3983 4048 N
+ R R UW s n/a 29 3922 3973 4048 N
+ R R V e n/a 29 3922 3940 4101 N
+ R R V s n/a 29 3922 3940 4101 N
+ R R W b n/a 29 3922 3967 4108 N
+ R R W e n/a 29 3922 3961 4108 N
+ R R W s n/a 29 3922 3961 4108 N
+ R R Y b n/a 29 3921 3971 4091 N
+ R R Y e n/a 29 3921 3971 4091 N
+ R R Y s n/a 29 3921 3971 4091 N
+ R R Z b n/a 29 3922 3945 4092 N
+ R R Z e n/a 29 3922 3940 4092 N
+ R R Z s n/a 29 3922 3940 4092 N
+ R R ZH e n/a 29 3922 3940 4092 N
+ R R ZH s n/a 29 3922 3940 4092 N
+ R S AA b n/a 29 3935 3964 4069 N
+ R S AA i n/a 29 3912 3957 4069 N
+ R S AA s n/a 29 3912 3963 4069 N
+ R S AE b n/a 29 3935 3945 4058 N
+ R S AE i n/a 29 3912 3949 4057 N
+ R S AE s n/a 29 3912 3949 4058 N
+ R S AH b n/a 29 3935 3954 4063 N
+ R S AH i n/a 29 3912 3954 4063 N
+ R S AH s n/a 29 3912 3954 4063 N
+ R S AO b n/a 29 3935 3966 4069 N
+ R S AO i n/a 29 3912 3957 4069 N
+ R S AO s n/a 29 3912 3963 4069 N
+ R S AW b n/a 29 3935 3945 4058 N
+ R S AW s n/a 29 3912 3949 4058 N
+ R S AY b n/a 29 3935 3964 4067 N
+ R S AY i n/a 29 3912 3957 4068 N
+ R S AY s n/a 29 3912 3963 4067 N
+ R S B b n/a 29 3935 3945 4101 N
+ R S B s n/a 29 3912 3949 4101 N
+ R S CH s n/a 29 3912 3949 4095 N
+ R S D b n/a 29 3935 3945 4098 N
+ R S D s n/a 29 3912 3949 4098 N
+ R S DH s n/a 29 3912 3949 4087 N
+ R S EH b n/a 29 3935 3944 4056 N
+ R S EH i n/a 29 3912 3949 4054 N
+ R S EH s n/a 29 3912 3949 4056 N
+ R S ER s n/a 29 3912 3955 4063 N
+ R S EY b n/a 29 3935 3946 4041 N
+ R S EY i n/a 29 3912 3942 4041 N
+ R S EY s n/a 29 3912 3942 4041 N
+ R S F b n/a 29 3935 3945 4102 N
+ R S F s n/a 29 3912 3949 4102 N
+ R S G b n/a 29 3935 3945 4098 N
+ R S G s n/a 29 3912 3949 4098 N
+ R S HH s n/a 29 3912 3949 4085 N
+ R S IH b n/a 29 3934 3970 4045 N
+ R S IH i n/a 29 3913 3974 4046 N
+ R S IH s n/a 29 3913 3970 4045 N
+ R S IY b n/a 29 3934 3970 4051 N
+ R S IY i n/a 29 3914 3976 4052 N
+ R S IY s n/a 29 3914 3970 4051 N
+ R S JH s n/a 29 3912 3949 4098 N
+ R S K b n/a 29 3935 3945 4096 N
+ R S K s n/a 29 3912 3949 4096 N
+ R S L s n/a 29 3912 3960 4103 N
+ R S M s n/a 29 3912 3949 4106 N
+ R S N b n/a 29 3935 3945 4086 N
+ R S N s n/a 29 3912 3949 4086 N
+ R S NG s n/a 29 3912 3949 4085 N
+ R S OW b n/a 29 3935 3968 4073 N
+ R S OW i n/a 29 3912 3957 4072 N
+ R S OW s n/a 29 3912 3963 4073 N
+ R S OY b n/a 29 3935 3966 4070 N
+ R S OY i n/a 29 3912 3957 4070 N
+ R S OY s n/a 29 3912 3963 4070 N
+ R S P b n/a 29 3935 3945 4101 N
+ R S P s n/a 29 3912 3949 4101 N
+ R S R b n/a 29 3935 3967 4108 N
+ R S R s n/a 29 3912 3960 4108 N
+ R S S b n/a 29 3935 3945 4083 N
+ R S S s n/a 29 3912 3949 4083 N
+ R S SH s n/a 29 3912 3949 4083 N
+ R S SIL s n/a 29 3912 3949 4110 N
+ R S T b n/a 29 3935 3945 4095 N
+ R S T s n/a 29 3912 3949 4095 N
+ R S TH s n/a 29 3912 3949 4088 N
+ R S UH b n/a 29 3935 3973 4048 N
+ R S UH s n/a 29 3913 3973 4047 N
+ R S UW b n/a 29 3935 3973 4048 N
+ R S UW i n/a 29 3913 3984 4047 N
+ R S UW s n/a 29 3913 3973 4047 N
+ R S V s n/a 29 3912 3949 4101 N
+ R S W b n/a 29 3935 3967 4108 N
+ R S W s n/a 29 3912 3960 4108 N
+ R S Y b n/a 29 3934 3970 4091 N
+ R S Y s n/a 29 3913 3970 4091 N
+ R S Z b n/a 29 3935 3945 4092 N
+ R S Z s n/a 29 3912 3949 4092 N
+ R S ZH s n/a 29 3912 3949 4092 N
+ R SH AA b n/a 29 3935 3964 4069 N
+ R SH AA i n/a 29 3895 3958 4069 N
+ R SH AA s n/a 29 3895 3964 4069 N
+ R SH AE b n/a 29 3935 3945 4058 N
+ R SH AE i n/a 29 3895 3941 4057 N
+ R SH AE s n/a 29 3895 3941 4058 N
+ R SH AH b n/a 29 3935 3954 4063 N
+ R SH AH i n/a 29 3901 3954 4063 N
+ R SH AH s n/a 29 3901 3954 4063 N
+ R SH AO b n/a 29 3935 3966 4069 N
+ R SH AO i n/a 29 3895 3958 4069 N
+ R SH AO s n/a 29 3895 3966 4069 N
+ R SH AW b n/a 29 3935 3945 4058 N
+ R SH AW i n/a 29 3895 3941 4057 N
+ R SH AW s n/a 29 3895 3941 4058 N
+ R SH AY b n/a 29 3935 3964 4067 N
+ R SH AY i n/a 29 3895 3959 4067 N
+ R SH AY s n/a 29 3895 3964 4067 N
+ R SH B b n/a 29 3935 3945 4101 N
+ R SH B s n/a 29 3895 3941 4101 N
+ R SH CH s n/a 29 3895 3941 4095 N
+ R SH D b n/a 29 3935 3945 4098 N
+ R SH D i n/a 29 3895 3941 4098 N
+ R SH D s n/a 29 3895 3941 4098 N
+ R SH DH s n/a 29 3895 3941 4087 N
+ R SH EH b n/a 29 3935 3944 4056 N
+ R SH EH i n/a 29 3895 3941 4054 N
+ R SH EH s n/a 29 3895 3941 4056 N
+ R SH ER i n/a 29 3901 3955 4063 N
+ R SH ER s n/a 29 3901 3955 4063 N
+ R SH EY b n/a 29 3935 3946 4041 N
+ R SH EY i n/a 29 3895 3942 4041 N
+ R SH EY s n/a 29 3895 3942 4041 N
+ R SH F b n/a 29 3935 3945 4102 N
+ R SH F s n/a 29 3895 3941 4102 N
+ R SH G b n/a 29 3935 3945 4098 N
+ R SH G s n/a 29 3895 3941 4098 N
+ R SH HH s n/a 29 3895 3941 4085 N
+ R SH IH b n/a 29 3934 3970 4045 N
+ R SH IH i n/a 29 3901 3974 4046 N
+ R SH IH s n/a 29 3901 3970 4045 N
+ R SH IY b n/a 29 3934 3970 4051 N
+ R SH IY i n/a 29 3901 3976 4052 N
+ R SH IY s n/a 29 3901 3970 4051 N
+ R SH JH s n/a 29 3895 3941 4098 N
+ R SH K b n/a 29 3935 3945 4096 N
+ R SH K s n/a 29 3895 3941 4096 N
+ R SH L s n/a 29 3895 3961 4103 N
+ R SH M s n/a 29 3895 3941 4106 N
+ R SH N b n/a 29 3935 3945 4086 N
+ R SH N s n/a 29 3895 3941 4086 N
+ R SH NG s n/a 29 3895 3941 4085 N
+ R SH OW b n/a 29 3935 3968 4073 N
+ R SH OW i n/a 29 3895 3957 4072 N
+ R SH OW s n/a 29 3895 3969 4073 N
+ R SH OY b n/a 29 3935 3966 4070 N
+ R SH OY i n/a 29 3895 3957 4070 N
+ R SH OY s n/a 29 3895 3966 4070 N
+ R SH P b n/a 29 3935 3945 4101 N
+ R SH P s n/a 29 3895 3941 4101 N
+ R SH R b n/a 29 3935 3967 4108 N
+ R SH R s n/a 29 3895 3961 4108 N
+ R SH S b n/a 29 3935 3945 4083 N
+ R SH S s n/a 29 3895 3941 4083 N
+ R SH SH s n/a 29 3895 3941 4083 N
+ R SH SIL s n/a 29 3895 3941 4110 N
+ R SH T b n/a 29 3935 3945 4095 N
+ R SH T s n/a 29 3895 3941 4095 N
+ R SH TH s n/a 29 3895 3941 4088 N
+ R SH UH b n/a 29 3935 3973 4048 N
+ R SH UH i n/a 29 3901 3982 4047 N
+ R SH UH s n/a 29 3901 3973 4047 N
+ R SH UW b n/a 29 3935 3973 4048 N
+ R SH UW i n/a 29 3901 3982 4047 N
+ R SH UW s n/a 29 3901 3973 4047 N
+ R SH V s n/a 29 3895 3941 4101 N
+ R SH W b n/a 29 3935 3967 4108 N
+ R SH W s n/a 29 3895 3961 4108 N
+ R SH Y b n/a 29 3934 3970 4091 N
+ R SH Y s n/a 29 3901 3970 4091 N
+ R SH Z b n/a 29 3935 3945 4092 N
+ R SH Z i n/a 29 3895 3941 4092 N
+ R SH Z s n/a 29 3895 3941 4092 N
+ R SH ZH s n/a 29 3895 3941 4092 N
+ R SIL AA b n/a 29 3939 3964 4069 N
+ R SIL AA s n/a 29 3895 3964 4069 N
+ R SIL AE b n/a 29 3939 3945 4058 N
+ R SIL AE s n/a 29 3895 3940 4058 N
+ R SIL AH b n/a 29 3939 3954 4063 N
+ R SIL AH s n/a 29 3902 3954 4063 N
+ R SIL AO b n/a 29 3939 3966 4069 N
+ R SIL AO s n/a 29 3895 3966 4069 N
+ R SIL AW b n/a 29 3939 3945 4058 N
+ R SIL AW s n/a 29 3895 3940 4058 N
+ R SIL AY b n/a 29 3939 3964 4067 N
+ R SIL AY s n/a 29 3895 3964 4067 N
+ R SIL B b n/a 29 3939 3945 4101 N
+ R SIL B s n/a 29 3895 3940 4101 N
+ R SIL CH s n/a 29 3895 3940 4095 N
+ R SIL D b n/a 29 3939 3945 4098 N
+ R SIL D s n/a 29 3895 3940 4098 N
+ R SIL DH s n/a 29 3895 3940 4087 N
+ R SIL EH b n/a 29 3938 3944 4056 N
+ R SIL EH s n/a 29 3895 3940 4056 N
+ R SIL ER s n/a 29 3902 3955 4063 N
+ R SIL EY b n/a 29 3938 3946 4041 N
+ R SIL EY s n/a 29 3895 3942 4041 N
+ R SIL F b n/a 29 3939 3945 4102 N
+ R SIL F s n/a 29 3895 3940 4102 N
+ R SIL G b n/a 29 3939 3945 4098 N
+ R SIL G s n/a 29 3895 3940 4098 N
+ R SIL HH s n/a 29 3895 3940 4085 N
+ R SIL IH b n/a 29 3938 3970 4045 N
+ R SIL IH s n/a 29 3899 3970 4045 N
+ R SIL IY b n/a 29 3938 3972 4051 N
+ R SIL IY s n/a 29 3899 3972 4050 N
+ R SIL JH s n/a 29 3895 3940 4098 N
+ R SIL K b n/a 29 3939 3945 4096 N
+ R SIL K s n/a 29 3895 3940 4096 N
+ R SIL L s n/a 29 3895 3961 4103 N
+ R SIL M s n/a 29 3895 3940 4106 N
+ R SIL N b n/a 29 3939 3945 4086 N
+ R SIL N s n/a 29 3895 3940 4086 N
+ R SIL NG s n/a 29 3895 3940 4085 N
+ R SIL OW b n/a 29 3939 3968 4073 N
+ R SIL OW s n/a 29 3895 3969 4073 N
+ R SIL OY b n/a 29 3939 3966 4070 N
+ R SIL OY s n/a 29 3895 3966 4070 N
+ R SIL P b n/a 29 3939 3945 4101 N
+ R SIL P s n/a 29 3895 3940 4101 N
+ R SIL R b n/a 29 3939 3967 4108 N
+ R SIL R s n/a 29 3895 3961 4108 N
+ R SIL S b n/a 29 3939 3945 4083 N
+ R SIL S s n/a 29 3895 3940 4083 N
+ R SIL SH s n/a 29 3895 3940 4083 N
+ R SIL SIL s n/a 29 3895 3940 4110 N
+ R SIL T b n/a 29 3939 3945 4095 N
+ R SIL T s n/a 29 3895 3940 4095 N
+ R SIL TH s n/a 29 3895 3940 4088 N
+ R SIL UH b n/a 29 3939 3973 4048 N
+ R SIL UH s n/a 29 3899 3973 4047 N
+ R SIL UW b n/a 29 3939 3973 4048 N
+ R SIL UW s n/a 29 3900 3973 4047 N
+ R SIL V s n/a 29 3895 3940 4101 N
+ R SIL W b n/a 29 3939 3967 4108 N
+ R SIL W s n/a 29 3895 3961 4108 N
+ R SIL Y b n/a 29 3938 3970 4091 N
+ R SIL Y s n/a 29 3900 3970 4091 N
+ R SIL Z b n/a 29 3939 3945 4092 N
+ R SIL Z s n/a 29 3895 3940 4092 N
+ R SIL ZH s n/a 29 3895 3940 4092 N
+ R T AA b n/a 29 3937 3964 4071 N
+ R T AA e n/a 29 3908 3963 4075 N
+ R T AA i n/a 29 3908 3956 4071 N
+ R T AA s n/a 29 3908 3963 4071 N
+ R T AE b n/a 29 3937 3945 4058 N
+ R T AE e n/a 29 3909 3948 4075 N
+ R T AE i n/a 29 3909 3948 4059 N
+ R T AE s n/a 29 3909 3948 4058 N
+ R T AH b n/a 29 3937 3954 4064 N
+ R T AH e n/a 29 3909 3954 4064 N
+ R T AH i n/a 29 3909 3951 4066 N
+ R T AH s n/a 29 3909 3954 4064 N
+ R T AO b n/a 29 3937 3966 4070 N
+ R T AO e n/a 29 3906 3963 4075 N
+ R T AO i n/a 29 3906 3957 4070 N
+ R T AO s n/a 29 3906 3963 4070 N
+ R T AW b n/a 29 3937 3945 4059 N
+ R T AW e n/a 29 3908 3948 4075 N
+ R T AW i n/a 29 3908 3948 4059 N
+ R T AW s n/a 29 3908 3948 4059 N
+ R T AY b n/a 29 3937 3964 4067 N
+ R T AY e n/a 29 3908 3963 4075 N
+ R T AY i n/a 29 3908 3956 4068 N
+ R T AY s n/a 29 3908 3963 4067 N
+ R T B b n/a 29 3937 3945 4101 N
+ R T B e n/a 29 3909 3950 4101 N
+ R T B s n/a 29 3909 3950 4101 N
+ R T CH e n/a 29 3909 3950 4095 N
+ R T CH s n/a 29 3909 3950 4095 N
+ R T D b n/a 29 3937 3945 4098 N
+ R T D e n/a 29 3909 3950 4098 N
+ R T D s n/a 29 3909 3950 4098 N
+ R T DH e n/a 29 3909 3950 4087 N
+ R T DH s n/a 29 3909 3950 4087 N
+ R T EH b n/a 29 3937 3944 4056 N
+ R T EH e n/a 29 3909 3950 4064 N
+ R T EH i n/a 29 3909 3950 4055 N
+ R T EH s n/a 29 3909 3950 4056 N
+ R T ER e n/a 29 3908 3955 4064 N
+ R T ER i n/a 29 3908 3951 4066 N
+ R T ER s n/a 29 3908 3955 4064 N
+ R T EY b n/a 29 3937 3949 4041 N
+ R T EY e n/a 29 3907 3949 4041 N
+ R T EY i n/a 29 3907 3950 4040 N
+ R T EY s n/a 29 3907 3949 4041 N
+ R T F b n/a 29 3937 3945 4102 N
+ R T F e n/a 29 3909 3950 4102 N
+ R T F s n/a 29 3909 3950 4102 N
+ R T G b n/a 29 3937 3945 4098 N
+ R T G e n/a 29 3909 3950 4097 N
+ R T G s n/a 29 3909 3950 4098 N
+ R T HH e n/a 29 3909 3950 4085 N
+ R T HH i n/a 29 3909 3950 4085 N
+ R T HH s n/a 29 3909 3950 4085 N
+ R T IH b n/a 29 3936 3970 4045 N
+ R T IH e n/a 29 3910 3970 4045 N
+ R T IH i n/a 29 3910 3980 4043 N
+ R T IH s n/a 29 3910 3970 4045 N
+ R T IY b n/a 29 3936 3972 4051 N
+ R T IY e n/a 29 3910 3972 4049 N
+ R T IY i n/a 29 3910 3981 4049 N
+ R T IY s n/a 29 3910 3972 4049 N
+ R T JH e n/a 29 3909 3950 4098 N
+ R T JH s n/a 29 3909 3950 4098 N
+ R T K b n/a 29 3937 3945 4096 N
+ R T K e n/a 29 3909 3950 4096 N
+ R T K s n/a 29 3909 3950 4096 N
+ R T L e n/a 29 3908 3960 4103 N
+ R T L i n/a 29 3908 3951 4103 N
+ R T L s n/a 29 3908 3960 4103 N
+ R T M e n/a 29 3909 3950 4106 N
+ R T M s n/a 29 3909 3950 4106 N
+ R T N b n/a 29 3937 3945 4086 N
+ R T N e n/a 29 3909 3950 4086 N
+ R T N s n/a 29 3909 3950 4086 N
+ R T NG e n/a 29 3909 3950 4085 N
+ R T NG s n/a 29 3909 3950 4085 N
+ R T OW b n/a 29 3937 3968 4073 N
+ R T OW e n/a 29 3908 3963 4075 N
+ R T OW i n/a 29 3908 3956 4074 N
+ R T OW s n/a 29 3908 3963 4073 N
+ R T OY b n/a 29 3937 3966 4070 N
+ R T OY e n/a 29 3906 3963 4075 N
+ R T OY i n/a 29 3906 3957 4070 N
+ R T OY s n/a 29 3906 3963 4070 N
+ R T P b n/a 29 3937 3945 4101 N
+ R T P e n/a 29 3909 3950 4101 N
+ R T P s n/a 29 3909 3950 4101 N
+ R T R b n/a 29 3937 3967 4108 N
+ R T R e n/a 29 3908 3960 4108 N
+ R T R s n/a 29 3908 3960 4108 N
+ R T S b n/a 29 3937 3945 4083 N
+ R T S e n/a 29 3909 3950 4083 N
+ R T S s n/a 29 3909 3950 4083 N
+ R T SH e n/a 29 3909 3950 4083 N
+ R T SH s n/a 29 3909 3950 4083 N
+ R T SIL e n/a 29 3909 3950 4110 N
+ R T SIL s n/a 29 3909 3950 4110 N
+ R T T b n/a 29 3937 3945 4095 N
+ R T T e n/a 29 3909 3950 4095 N
+ R T T s n/a 29 3909 3950 4095 N
+ R T TH e n/a 29 3909 3950 4088 N
+ R T TH s n/a 29 3909 3950 4088 N
+ R T UH b n/a 29 3936 3973 4048 N
+ R T UH e n/a 29 3910 3973 4047 N
+ R T UH i n/a 29 3910 3984 4047 N
+ R T UH s n/a 29 3910 3973 4047 N
+ R T UW b n/a 29 3936 3973 4048 N
+ R T UW e n/a 29 3911 3973 4047 N
+ R T UW i n/a 29 3911 3984 4047 N
+ R T UW s n/a 29 3911 3973 4047 N
+ R T V e n/a 29 3909 3950 4101 N
+ R T V s n/a 29 3909 3950 4101 N
+ R T W b n/a 29 3937 3967 4108 N
+ R T W e n/a 29 3908 3960 4108 N
+ R T W s n/a 29 3908 3960 4108 N
+ R T Y b n/a 29 3936 3970 4091 N
+ R T Y e n/a 29 3910 3970 4091 N
+ R T Y s n/a 29 3910 3970 4091 N
+ R T Z b n/a 29 3937 3945 4092 N
+ R T Z e n/a 29 3909 3950 4092 N
+ R T Z i n/a 29 3909 3950 4092 N
+ R T Z s n/a 29 3909 3950 4092 N
+ R T ZH e n/a 29 3909 3950 4092 N
+ R T ZH s n/a 29 3909 3950 4092 N
+ R TH AA b n/a 29 3937 3964 4069 N
+ R TH AA i n/a 29 3912 3957 4069 N
+ R TH AA s n/a 29 3912 3963 4069 N
+ R TH AE b n/a 29 3937 3945 4058 N
+ R TH AE i n/a 29 3912 3949 4057 N
+ R TH AE s n/a 29 3912 3949 4058 N
+ R TH AH b n/a 29 3937 3954 4063 N
+ R TH AH i n/a 29 3912 3954 4063 N
+ R TH AH s n/a 29 3912 3954 4063 N
+ R TH AO b n/a 29 3937 3966 4069 N
+ R TH AO i n/a 29 3912 3957 4069 N
+ R TH AO s n/a 29 3912 3963 4069 N
+ R TH AW b n/a 29 3937 3945 4058 N
+ R TH AW s n/a 29 3912 3949 4058 N
+ R TH AY b n/a 29 3937 3964 4067 N
+ R TH AY i n/a 29 3912 3957 4067 N
+ R TH AY s n/a 29 3912 3963 4067 N
+ R TH B b n/a 29 3937 3945 4101 N
+ R TH B s n/a 29 3912 3949 4101 N
+ R TH CH s n/a 29 3912 3949 4095 N
+ R TH D b n/a 29 3937 3945 4098 N
+ R TH D s n/a 29 3912 3949 4098 N
+ R TH DH s n/a 29 3912 3949 4087 N
+ R TH EH b n/a 29 3937 3944 4056 N
+ R TH EH i n/a 29 3912 3949 4053 N
+ R TH EH s n/a 29 3912 3949 4056 N
+ R TH ER s n/a 29 3912 3955 4063 N
+ R TH EY b n/a 29 3937 3946 4041 N
+ R TH EY i n/a 29 3912 3942 4041 N
+ R TH EY s n/a 29 3912 3942 4041 N
+ R TH F b n/a 29 3937 3945 4102 N
+ R TH F s n/a 29 3912 3949 4102 N
+ R TH G b n/a 29 3937 3945 4098 N
+ R TH G s n/a 29 3912 3949 4098 N
+ R TH HH s n/a 29 3912 3949 4085 N
+ R TH IH b n/a 29 3936 3970 4045 N
+ R TH IH i n/a 29 3914 3974 4046 N
+ R TH IH s n/a 29 3914 3970 4045 N
+ R TH IY b n/a 29 3936 3972 4051 N
+ R TH IY i n/a 29 3914 3976 4052 N
+ R TH IY s n/a 29 3914 3972 4051 N
+ R TH JH s n/a 29 3912 3949 4098 N
+ R TH K b n/a 29 3937 3945 4096 N
+ R TH K s n/a 29 3912 3949 4096 N
+ R TH L s n/a 29 3912 3960 4103 N
+ R TH M s n/a 29 3912 3949 4106 N
+ R TH N b n/a 29 3937 3945 4086 N
+ R TH N s n/a 29 3912 3949 4086 N
+ R TH NG s n/a 29 3912 3949 4085 N
+ R TH OW b n/a 29 3937 3968 4073 N
+ R TH OW i n/a 29 3912 3957 4072 N
+ R TH OW s n/a 29 3912 3963 4073 N
+ R TH OY b n/a 29 3937 3966 4070 N
+ R TH OY i n/a 29 3912 3957 4070 N
+ R TH OY s n/a 29 3912 3963 4070 N
+ R TH P b n/a 29 3937 3945 4101 N
+ R TH P s n/a 29 3912 3949 4101 N
+ R TH R b n/a 29 3937 3967 4108 N
+ R TH R s n/a 29 3912 3960 4108 N
+ R TH S b n/a 29 3937 3945 4083 N
+ R TH S s n/a 29 3912 3949 4083 N
+ R TH SH s n/a 29 3912 3949 4083 N
+ R TH SIL s n/a 29 3912 3949 4110 N
+ R TH T b n/a 29 3937 3945 4095 N
+ R TH T s n/a 29 3912 3949 4095 N
+ R TH TH s n/a 29 3912 3949 4088 N
+ R TH UH b n/a 29 3936 3973 4048 N
+ R TH UH s n/a 29 3913 3973 4047 N
+ R TH UW b n/a 29 3936 3973 4048 N
+ R TH UW i n/a 29 3913 3984 4047 N
+ R TH UW s n/a 29 3913 3973 4047 N
+ R TH V s n/a 29 3912 3949 4101 N
+ R TH W b n/a 29 3937 3967 4108 N
+ R TH W s n/a 29 3912 3960 4108 N
+ R TH Y b n/a 29 3936 3970 4091 N
+ R TH Y s n/a 29 3914 3970 4091 N
+ R TH Z b n/a 29 3937 3945 4092 N
+ R TH Z s n/a 29 3912 3949 4092 N
+ R TH ZH s n/a 29 3912 3949 4092 N
+ R UH AA b n/a 29 3918 3964 4069 N
+ R UH AA e n/a 29 3854 4003 4075 N
+ R UH AA i n/a 29 3854 4003 4069 N
+ R UH AA s n/a 29 3854 4003 4069 N
+ R UH AE b n/a 29 3918 3945 4058 N
+ R UH AE e n/a 29 3854 4004 4078 N
+ R UH AE i n/a 29 3854 4004 4057 N
+ R UH AE s n/a 29 3854 4004 4058 N
+ R UH AH b n/a 29 3918 3967 4079 N
+ R UH AH e n/a 29 3854 4004 4076 N
+ R UH AH i n/a 29 3854 4004 4081 N
+ R UH AH s n/a 29 3854 4004 4079 N
+ R UH AO b n/a 29 3918 3966 4069 N
+ R UH AO e n/a 29 3854 4003 4075 N
+ R UH AO i n/a 29 3854 4003 4069 N
+ R UH AO s n/a 29 3854 4003 4069 N
+ R UH AW b n/a 29 3918 3945 4058 N
+ R UH AW e n/a 29 3854 4004 4077 N
+ R UH AW s n/a 29 3854 4004 4058 N
+ R UH AY b n/a 29 3918 3964 4067 N
+ R UH AY e n/a 29 3854 4003 4075 N
+ R UH AY i n/a 29 3854 4003 4067 N
+ R UH AY s n/a 29 3854 4003 4067 N
+ R UH B b n/a 29 3918 3996 4100 N
+ R UH B e n/a 29 3855 3996 4100 N
+ R UH B i n/a 29 3855 3996 4100 N
+ R UH B s n/a 29 3855 3996 4100 N
+ R UH CH e n/a 29 3856 4010 4093 N
+ R UH CH i n/a 29 3854 4010 4093 N
+ R UH CH s n/a 29 3856 4010 4093 N
+ R UH D b n/a 29 3918 4011 4099 N
+ R UH D e n/a 29 3856 4011 4099 N
+ R UH D i n/a 29 3854 4011 4098 N
+ R UH D s n/a 29 3856 4011 4099 N
+ R UH DH e n/a 29 3856 4011 4087 N
+ R UH DH s n/a 29 3856 4011 4087 N
+ R UH EH b n/a 29 3918 3944 4056 N
+ R UH EH e n/a 29 3854 4004 4078 N
+ R UH EH i n/a 29 3854 4004 4056 N
+ R UH EH s n/a 29 3854 4004 4056 N
+ R UH ER e n/a 29 3854 4004 4082 N
+ R UH ER i n/a 29 3854 4004 4082 N
+ R UH ER s n/a 29 3854 4004 4082 N
+ R UH EY b n/a 29 3918 3946 4041 N
+ R UH EY e n/a 29 3854 4004 4040 N
+ R UH EY i n/a 29 3854 4004 4041 N
+ R UH EY s n/a 29 3854 4004 4041 N
+ R UH F b n/a 29 3918 3996 4102 N
+ R UH F e n/a 29 3855 3996 4102 N
+ R UH F i n/a 29 3855 3996 4102 N
+ R UH F s n/a 29 3855 3996 4102 N
+ R UH G b n/a 29 3918 4010 4093 N
+ R UH G e n/a 29 3856 4010 4093 N
+ R UH G i n/a 29 3854 4010 4093 N
+ R UH G s n/a 29 3856 4010 4093 N
+ R UH HH e n/a 29 3856 4011 4085 N
+ R UH HH i n/a 29 3854 4011 4085 N
+ R UH HH s n/a 29 3856 4011 4085 N
+ R UH IH b n/a 29 3919 3971 4045 N
+ R UH IH e n/a 29 3854 4000 4036 N
+ R UH IH i n/a 29 3854 4000 4034 N
+ R UH IH s n/a 29 3854 4000 4036 N
+ R UH IY b n/a 29 3919 3972 4051 N
+ R UH IY e n/a 29 3854 4000 4050 N
+ R UH IY i n/a 29 3854 4000 4039 N
+ R UH IY s n/a 29 3854 4000 4050 N
+ R UH JH e n/a 29 3856 4010 4099 N
+ R UH JH s n/a 29 3856 4010 4099 N
+ R UH K b n/a 29 3918 4010 4096 N
+ R UH K e n/a 29 3856 4010 4096 N
+ R UH K i n/a 29 3854 4010 4096 N
+ R UH K s n/a 29 3856 4010 4096 N
+ R UH L e n/a 29 3855 4009 4103 N
+ R UH L i n/a 29 3854 4011 4103 N
+ R UH L s n/a 29 3855 4009 4103 N
+ R UH M e n/a 29 3855 4009 4106 N
+ R UH M i n/a 29 3855 4009 4107 N
+ R UH M s n/a 29 3855 4009 4106 N
+ R UH N b n/a 29 3918 4011 4086 N
+ R UH N e n/a 29 3856 4011 4086 N
+ R UH N i n/a 29 3854 4011 4086 N
+ R UH N s n/a 29 3856 4011 4086 N
+ R UH NG e n/a 29 3856 4011 4085 N
+ R UH NG s n/a 29 3856 4011 4085 N
+ R UH OW b n/a 29 3918 3968 4073 N
+ R UH OW e n/a 29 3854 4003 4075 N
+ R UH OW i n/a 29 3854 4003 4072 N
+ R UH OW s n/a 29 3854 4003 4073 N
+ R UH OY b n/a 29 3918 3966 4070 N
+ R UH OY e n/a 29 3854 4003 4075 N
+ R UH OY i n/a 29 3854 4003 4070 N
+ R UH OY s n/a 29 3854 4003 4070 N
+ R UH P b n/a 29 3918 3996 4100 N
+ R UH P e n/a 29 3855 3996 4100 N
+ R UH P i n/a 29 3855 3996 4100 N
+ R UH P s n/a 29 3855 3996 4100 N
+ R UH R b n/a 29 3918 4009 4108 N
+ R UH R e n/a 29 3855 4009 4108 N
+ R UH R s n/a 29 3855 4009 4108 N
+ R UH S b n/a 29 3918 4010 4083 N
+ R UH S e n/a 29 3856 4010 4083 N
+ R UH S i n/a 29 3854 4010 4083 N
+ R UH S s n/a 29 3856 4010 4083 N
+ R UH SH e n/a 29 3856 4011 4083 N
+ R UH SH i n/a 29 3854 4011 4083 N
+ R UH SH s n/a 29 3856 4011 4083 N
+ R UH SIL e n/a 29 3856 4011 4110 N
+ R UH SIL s n/a 29 3856 4011 4110 N
+ R UH T b n/a 29 3918 4010 4093 N
+ R UH T e n/a 29 3856 4010 4093 N
+ R UH T i n/a 29 3854 4010 4093 N
+ R UH T s n/a 29 3856 4010 4093 N
+ R UH TH e n/a 29 3856 4010 4088 N
+ R UH TH i n/a 29 3854 4010 4088 N
+ R UH TH s n/a 29 3856 4010 4088 N
+ R UH UH b n/a 29 3919 3973 4048 N
+ R UH UH e n/a 29 3854 4000 4048 N
+ R UH UH s n/a 29 3854 4000 4048 N
+ R UH UW b n/a 29 3919 3973 4048 N
+ R UH UW e n/a 29 3854 4000 4048 N
+ R UH UW i n/a 29 3854 4000 4048 N
+ R UH UW s n/a 29 3854 4000 4048 N
+ R UH V e n/a 29 3855 3996 4101 N
+ R UH V i n/a 29 3855 3996 4101 N
+ R UH V s n/a 29 3855 3996 4101 N
+ R UH W b n/a 29 3918 4009 4108 N
+ R UH W e n/a 29 3855 4009 4108 N
+ R UH W s n/a 29 3855 4009 4108 N
+ R UH Y b n/a 29 3919 4000 4091 N
+ R UH Y e n/a 29 3856 4000 4091 N
+ R UH Y s n/a 29 3856 4000 4091 N
+ R UH Z b n/a 29 3918 4011 4092 N
+ R UH Z e n/a 29 3856 4011 4092 N
+ R UH Z i n/a 29 3854 4011 4092 N
+ R UH Z s n/a 29 3856 4011 4092 N
+ R UH ZH e n/a 29 3856 4011 4092 N
+ R UH ZH i n/a 29 3854 4011 4092 N
+ R UH ZH s n/a 29 3856 4011 4092 N
+ R UW AA b n/a 29 3918 3964 4069 N
+ R UW AA e n/a 29 3862 4003 4075 N
+ R UW AA i n/a 29 3854 4003 4069 N
+ R UW AA s n/a 29 3862 4003 4069 N
+ R UW AE b n/a 29 3918 3945 4058 N
+ R UW AE e n/a 29 3862 4004 4078 N
+ R UW AE i n/a 29 3854 4004 4057 N
+ R UW AE s n/a 29 3862 4004 4058 N
+ R UW AH b n/a 29 3918 3967 4079 N
+ R UW AH e n/a 29 3862 4004 4077 N
+ R UW AH i n/a 29 3862 4004 4081 N
+ R UW AH s n/a 29 3862 4004 4079 N
+ R UW AO b n/a 29 3918 3966 4069 N
+ R UW AO e n/a 29 3862 4003 4075 N
+ R UW AO i n/a 29 3854 4003 4069 N
+ R UW AO s n/a 29 3862 4003 4069 N
+ R UW AW b n/a 29 3918 3945 4058 N
+ R UW AW e n/a 29 3862 4004 4077 N
+ R UW AW s n/a 29 3862 4004 4058 N
+ R UW AY b n/a 29 3918 3964 4067 N
+ R UW AY e n/a 29 3862 4003 4075 N
+ R UW AY s n/a 29 3862 4003 4067 N
+ R UW B b n/a 29 3918 3995 4100 N
+ R UW B e n/a 29 3858 3995 4100 N
+ R UW B i n/a 29 3858 3995 4100 N
+ R UW B s n/a 29 3858 3995 4100 N
+ R UW CH e n/a 29 3858 3989 4093 N
+ R UW CH s n/a 29 3858 3989 4093 N
+ R UW D b n/a 29 3918 3989 4099 N
+ R UW D e n/a 29 3858 3989 4099 N
+ R UW D i n/a 29 3858 3989 4098 N
+ R UW D s n/a 29 3858 3989 4099 N
+ R UW DH e n/a 29 3858 3987 4087 N
+ R UW DH s n/a 29 3858 3987 4087 N
+ R UW EH b n/a 29 3918 3944 4056 N
+ R UW EH e n/a 29 3862 4004 4078 N
+ R UW EH i n/a 29 3854 4004 4056 N
+ R UW EH s n/a 29 3862 4004 4056 N
+ R UW ER e n/a 29 3862 4004 4082 N
+ R UW ER i n/a 29 3862 4004 4082 N
+ R UW ER s n/a 29 3862 4004 4082 N
+ R UW EY b n/a 29 3918 3946 4041 N
+ R UW EY e n/a 29 3862 4004 4040 N
+ R UW EY i n/a 29 3854 4004 4041 N
+ R UW EY s n/a 29 3862 4004 4041 N
+ R UW F b n/a 29 3918 3995 4102 N
+ R UW F e n/a 29 3858 3995 4102 N
+ R UW F s n/a 29 3858 3995 4102 N
+ R UW G b n/a 29 3918 3990 4093 N
+ R UW G e n/a 29 3858 3990 4093 N
+ R UW G i n/a 29 3858 3990 4093 N
+ R UW G s n/a 29 3858 3990 4093 N
+ R UW HH e n/a 29 3858 3985 4085 N
+ R UW HH i n/a 29 3858 3985 4085 N
+ R UW HH s n/a 29 3858 3985 4085 N
+ R UW IH b n/a 29 3919 3971 4045 N
+ R UW IH e n/a 29 3862 3998 4035 N
+ R UW IH i n/a 29 3862 3998 4035 N
+ R UW IH s n/a 29 3862 3998 4035 N
+ R UW IY b n/a 29 3919 3972 4051 N
+ R UW IY e n/a 29 3862 3998 4050 N
+ R UW IY i n/a 29 3854 3998 4037 N
+ R UW IY s n/a 29 3862 3998 4050 N
+ R UW JH e n/a 29 3858 3989 4099 N
+ R UW JH i n/a 29 3858 3989 4098 N
+ R UW JH s n/a 29 3858 3989 4099 N
+ R UW K b n/a 29 3918 3990 4096 N
+ R UW K e n/a 29 3858 3990 4096 N
+ R UW K i n/a 29 3858 3990 4096 N
+ R UW K s n/a 29 3858 3990 4096 N
+ R UW L e n/a 29 3858 4007 4104 N
+ R UW L i n/a 29 3858 4007 4104 N
+ R UW L s n/a 29 3858 4007 4104 N
+ R UW M e n/a 29 3858 4005 4107 N
+ R UW M i n/a 29 3858 4005 4107 N
+ R UW M s n/a 29 3858 4005 4107 N
+ R UW N b n/a 29 3918 3987 4086 N
+ R UW N e n/a 29 3858 3987 4086 N
+ R UW N i n/a 29 3858 3987 4086 N
+ R UW N s n/a 29 3858 3987 4086 N
+ R UW NG e n/a 29 3858 3985 4085 N
+ R UW NG s n/a 29 3858 3985 4085 N
+ R UW OW b n/a 29 3918 3968 4073 N
+ R UW OW e n/a 29 3862 4003 4075 N
+ R UW OW i n/a 29 3854 4003 4072 N
+ R UW OW s n/a 29 3862 4003 4073 N
+ R UW OY b n/a 29 3918 3966 4070 N
+ R UW OY e n/a 29 3862 4003 4075 N
+ R UW OY s n/a 29 3862 4003 4070 N
+ R UW P b n/a 29 3918 3995 4100 N
+ R UW P e n/a 29 3858 3995 4100 N
+ R UW P s n/a 29 3858 3995 4100 N
+ R UW R b n/a 29 3918 4008 4108 N
+ R UW R e n/a 29 3858 4008 4108 N
+ R UW R s n/a 29 3858 4008 4108 N
+ R UW S b n/a 29 3918 3986 4083 N
+ R UW S e n/a 29 3858 3986 4083 N
+ R UW S i n/a 29 3858 3986 4083 N
+ R UW S s n/a 29 3858 3986 4083 N
+ R UW SH e n/a 29 3858 3986 4083 N
+ R UW SH s n/a 29 3858 3986 4083 N
+ R UW SIL e n/a 29 3862 4012 4110 N
+ R UW SIL s n/a 29 3862 4012 4110 N
+ R UW T b n/a 29 3918 3989 4093 N
+ R UW T e n/a 29 3858 3989 4093 N
+ R UW T s n/a 29 3858 3989 4093 N
+ R UW TH e n/a 29 3858 3988 4088 N
+ R UW TH s n/a 29 3858 3988 4088 N
+ R UW UH b n/a 29 3919 3973 4048 N
+ R UW UH e n/a 29 3862 3998 4048 N
+ R UW UH i n/a 29 3854 3998 4048 N
+ R UW UH s n/a 29 3862 3998 4048 N
+ R UW UW b n/a 29 3919 3973 4048 N
+ R UW UW e n/a 29 3862 4000 4048 N
+ R UW UW i n/a 29 3854 4000 4048 N
+ R UW UW s n/a 29 3862 4000 4048 N
+ R UW V e n/a 29 3858 3995 4101 N
+ R UW V s n/a 29 3858 3995 4101 N
+ R UW W b n/a 29 3918 4008 4108 N
+ R UW W e n/a 29 3858 4008 4108 N
+ R UW W s n/a 29 3858 4008 4108 N
+ R UW Y b n/a 29 3919 3998 4091 N
+ R UW Y e n/a 29 3858 3998 4091 N
+ R UW Y s n/a 29 3858 3998 4091 N
+ R UW Z b n/a 29 3918 3985 4092 N
+ R UW Z e n/a 29 3858 3985 4092 N
+ R UW Z i n/a 29 3858 3985 4092 N
+ R UW Z s n/a 29 3858 3985 4092 N
+ R UW ZH e n/a 29 3858 3985 4092 N
+ R UW ZH s n/a 29 3858 3985 4092 N
+ R V AA b n/a 29 3937 3964 4069 N
+ R V AA e n/a 29 3931 3964 4075 N
+ R V AA i n/a 29 3931 3965 4069 N
+ R V AA s n/a 29 3931 3964 4069 N
+ R V AE b n/a 29 3937 3945 4058 N
+ R V AE e n/a 29 3930 3940 4075 N
+ R V AE i n/a 29 3930 3940 4057 N
+ R V AE s n/a 29 3930 3940 4058 N
+ R V AH b n/a 29 3937 3967 4063 N
+ R V AH e n/a 29 3930 3961 4065 N
+ R V AH i n/a 29 3930 3961 4065 N
+ R V AH s n/a 29 3930 3961 4065 N
+ R V AO b n/a 29 3937 3966 4069 N
+ R V AO e n/a 29 3931 3966 4075 N
+ R V AO i n/a 29 3931 3965 4069 N
+ R V AO s n/a 29 3931 3966 4069 N
+ R V AW b n/a 29 3937 3945 4058 N
+ R V AW e n/a 29 3930 3940 4075 N
+ R V AW s n/a 29 3930 3940 4058 N
+ R V AY b n/a 29 3937 3964 4067 N
+ R V AY e n/a 29 3931 3964 4075 N
+ R V AY i n/a 29 3931 3965 4067 N
+ R V AY s n/a 29 3931 3964 4067 N
+ R V B b n/a 29 3937 3945 4101 N
+ R V B e n/a 29 3930 3940 4101 N
+ R V B s n/a 29 3930 3940 4101 N
+ R V CH e n/a 29 3930 3940 4095 N
+ R V CH s n/a 29 3930 3940 4095 N
+ R V D b n/a 29 3937 3945 4098 N
+ R V D e n/a 29 3930 3940 4098 N
+ R V D s n/a 29 3930 3940 4098 N
+ R V DH e n/a 29 3930 3940 4087 N
+ R V DH s n/a 29 3930 3940 4087 N
+ R V EH b n/a 29 3937 3944 4056 N
+ R V EH e n/a 29 3930 3940 4065 N
+ R V EH i n/a 29 3930 3940 4053 N
+ R V EH s n/a 29 3930 3940 4056 N
+ R V ER e n/a 29 3931 3961 4065 N
+ R V ER i n/a 29 3931 3961 4065 N
+ R V ER s n/a 29 3931 3961 4065 N
+ R V EY b n/a 29 3937 3946 4041 N
+ R V EY e n/a 29 3930 3943 4040 N
+ R V EY i n/a 29 3930 3943 4041 N
+ R V EY s n/a 29 3930 3943 4041 N
+ R V F b n/a 29 3937 3945 4102 N
+ R V F e n/a 29 3930 3940 4102 N
+ R V F s n/a 29 3930 3940 4102 N
+ R V G b n/a 29 3937 3945 4098 N
+ R V G e n/a 29 3930 3940 4097 N
+ R V G s n/a 29 3930 3940 4098 N
+ R V HH e n/a 29 3930 3940 4085 N
+ R V HH s n/a 29 3930 3940 4085 N
+ R V IH b n/a 29 3936 3971 4045 N
+ R V IH e n/a 29 3930 3971 4045 N
+ R V IH i n/a 29 3930 3975 4046 N
+ R V IH s n/a 29 3930 3971 4045 N
+ R V IY b n/a 29 3936 3972 4051 N
+ R V IY e n/a 29 3930 3972 4051 N
+ R V IY i n/a 29 3930 3977 4052 N
+ R V IY s n/a 29 3930 3972 4051 N
+ R V JH e n/a 29 3930 3940 4098 N
+ R V JH s n/a 29 3930 3940 4098 N
+ R V K b n/a 29 3937 3945 4096 N
+ R V K e n/a 29 3930 3940 4096 N
+ R V K s n/a 29 3930 3940 4096 N
+ R V L e n/a 29 3931 3961 4103 N
+ R V L s n/a 29 3931 3961 4103 N
+ R V M e n/a 29 3930 3940 4106 N
+ R V M s n/a 29 3930 3940 4106 N
+ R V N b n/a 29 3937 3945 4086 N
+ R V N e n/a 29 3930 3940 4086 N
+ R V N s n/a 29 3930 3940 4086 N
+ R V NG e n/a 29 3930 3940 4085 N
+ R V NG s n/a 29 3930 3940 4085 N
+ R V OW b n/a 29 3937 3968 4073 N
+ R V OW e n/a 29 3931 3969 4075 N
+ R V OW i n/a 29 3931 3969 4073 N
+ R V OW s n/a 29 3931 3969 4073 N
+ R V OY b n/a 29 3937 3966 4070 N
+ R V OY e n/a 29 3931 3966 4075 N
+ R V OY i n/a 29 3931 3966 4070 N
+ R V OY s n/a 29 3931 3966 4070 N
+ R V P b n/a 29 3937 3945 4101 N
+ R V P e n/a 29 3930 3940 4101 N
+ R V P s n/a 29 3930 3940 4101 N
+ R V R b n/a 29 3937 3967 4108 N
+ R V R e n/a 29 3931 3961 4108 N
+ R V R s n/a 29 3931 3961 4108 N
+ R V S b n/a 29 3937 3945 4083 N
+ R V S e n/a 29 3930 3940 4083 N
+ R V S s n/a 29 3930 3940 4083 N
+ R V SH e n/a 29 3930 3940 4083 N
+ R V SH s n/a 29 3930 3940 4083 N
+ R V SIL e n/a 29 3930 3940 4110 N
+ R V SIL s n/a 29 3930 3940 4110 N
+ R V T b n/a 29 3937 3945 4095 N
+ R V T e n/a 29 3930 3940 4095 N
+ R V T s n/a 29 3930 3940 4095 N
+ R V TH e n/a 29 3930 3940 4088 N
+ R V TH s n/a 29 3930 3940 4088 N
+ R V UH b n/a 29 3936 3973 4048 N
+ R V UH e n/a 29 3930 3973 4048 N
+ R V UH s n/a 29 3930 3973 4048 N
+ R V UW b n/a 29 3936 3973 4048 N
+ R V UW e n/a 29 3930 3973 4048 N
+ R V UW i n/a 29 3930 3983 4048 N
+ R V UW s n/a 29 3930 3973 4048 N
+ R V V e n/a 29 3930 3940 4101 N
+ R V V s n/a 29 3930 3940 4101 N
+ R V W b n/a 29 3937 3967 4108 N
+ R V W e n/a 29 3931 3961 4108 N
+ R V W s n/a 29 3931 3961 4108 N
+ R V Y b n/a 29 3936 3971 4091 N
+ R V Y e n/a 29 3930 3971 4091 N
+ R V Y s n/a 29 3930 3971 4091 N
+ R V Z b n/a 29 3937 3945 4092 N
+ R V Z e n/a 29 3930 3940 4092 N
+ R V Z i n/a 29 3930 3940 4092 N
+ R V Z s n/a 29 3930 3940 4092 N
+ R V ZH e n/a 29 3930 3940 4092 N
+ R V ZH s n/a 29 3930 3940 4092 N
+ R W AA b n/a 29 3917 3964 4069 N
+ R W AA s n/a 29 3917 3964 4069 N
+ R W AE b n/a 29 3917 3945 4058 N
+ R W AE s n/a 29 3917 3940 4058 N
+ R W AH b n/a 29 3917 3967 4063 N
+ R W AH s n/a 29 3917 3961 4065 N
+ R W AO b n/a 29 3917 3966 4069 N
+ R W AO s n/a 29 3917 3966 4069 N
+ R W AW b n/a 29 3917 3945 4058 N
+ R W AW s n/a 29 3917 3940 4058 N
+ R W AY b n/a 29 3917 3964 4067 N
+ R W AY i n/a 29 3931 3965 4067 N
+ R W AY s n/a 29 3917 3964 4067 N
+ R W B b n/a 29 3917 3945 4100 N
+ R W B s n/a 29 3917 3940 4100 N
+ R W CH s n/a 29 3917 3940 4093 N
+ R W D b n/a 29 3917 3945 4099 N
+ R W D s n/a 29 3917 3940 4099 N
+ R W DH s n/a 29 3917 3940 4087 N
+ R W EH b n/a 29 3917 3944 4056 N
+ R W EH s n/a 29 3917 3940 4056 N
+ R W ER s n/a 29 3917 3961 4065 N
+ R W EY b n/a 29 3917 3946 4041 N
+ R W EY s n/a 29 3917 3943 4041 N
+ R W F b n/a 29 3917 3945 4102 N
+ R W F s n/a 29 3917 3940 4102 N
+ R W G b n/a 29 3917 3945 4093 N
+ R W G s n/a 29 3917 3940 4093 N
+ R W HH s n/a 29 3917 3940 4085 N
+ R W IH b n/a 29 3917 3971 4045 N
+ R W IH s n/a 29 3917 3971 4045 N
+ R W IY b n/a 29 3917 3972 4051 N
+ R W IY s n/a 29 3917 3972 4050 N
+ R W JH s n/a 29 3917 3940 4099 N
+ R W K b n/a 29 3917 3945 4096 N
+ R W K s n/a 29 3917 3940 4096 N
+ R W L s n/a 29 3917 3961 4103 N
+ R W M s n/a 29 3917 3940 4106 N
+ R W N b n/a 29 3917 3945 4086 N
+ R W N s n/a 29 3917 3940 4086 N
+ R W NG s n/a 29 3917 3940 4085 N
+ R W OW b n/a 29 3917 3968 4073 N
+ R W OW s n/a 29 3917 3969 4073 N
+ R W OY b n/a 29 3917 3966 4070 N
+ R W OY s n/a 29 3917 3966 4070 N
+ R W P b n/a 29 3917 3945 4100 N
+ R W P s n/a 29 3917 3940 4100 N
+ R W R b n/a 29 3917 3967 4108 N
+ R W R s n/a 29 3917 3961 4108 N
+ R W S b n/a 29 3917 3945 4083 N
+ R W S s n/a 29 3917 3940 4083 N
+ R W SH s n/a 29 3917 3940 4083 N
+ R W SIL s n/a 29 3917 3940 4109 N
+ R W T b n/a 29 3917 3945 4093 N
+ R W T s n/a 29 3917 3940 4093 N
+ R W TH s n/a 29 3917 3940 4088 N
+ R W UH b n/a 29 3917 3973 4048 N
+ R W UH s n/a 29 3917 3973 4048 N
+ R W UW b n/a 29 3917 3973 4048 N
+ R W UW s n/a 29 3917 3973 4048 N
+ R W V s n/a 29 3917 3940 4101 N
+ R W W b n/a 29 3917 3967 4108 N
+ R W W s n/a 29 3917 3961 4108 N
+ R W Y b n/a 29 3917 3971 4091 N
+ R W Y s n/a 29 3917 3971 4091 N
+ R W Z b n/a 29 3917 3945 4092 N
+ R W Z s n/a 29 3917 3940 4092 N
+ R W ZH s n/a 29 3917 3940 4092 N
+ R Y AA b n/a 29 3925 3964 4069 N
+ R Y AA e n/a 29 3925 3964 4075 N
+ R Y AA s n/a 29 3925 3964 4069 N
+ R Y AE b n/a 29 3925 3945 4058 N
+ R Y AE e n/a 29 3925 3940 4075 N
+ R Y AE s n/a 29 3925 3940 4058 N
+ R Y AH b n/a 29 3925 3967 4063 N
+ R Y AH e n/a 29 3925 3961 4064 N
+ R Y AH s n/a 29 3925 3961 4064 N
+ R Y AO b n/a 29 3925 3966 4069 N
+ R Y AO e n/a 29 3925 3966 4075 N
+ R Y AO s n/a 29 3925 3966 4069 N
+ R Y AW b n/a 29 3925 3945 4058 N
+ R Y AW e n/a 29 3925 3940 4075 N
+ R Y AW s n/a 29 3925 3940 4058 N
+ R Y AY b n/a 29 3925 3964 4067 N
+ R Y AY e n/a 29 3925 3964 4075 N
+ R Y AY s n/a 29 3925 3964 4067 N
+ R Y B b n/a 29 3925 3945 4101 N
+ R Y B e n/a 29 3925 3940 4101 N
+ R Y B s n/a 29 3925 3940 4101 N
+ R Y CH e n/a 29 3925 3940 4094 N
+ R Y CH s n/a 29 3925 3940 4094 N
+ R Y D b n/a 29 3925 3945 4098 N
+ R Y D e n/a 29 3925 3940 4098 N
+ R Y D s n/a 29 3925 3940 4098 N
+ R Y DH e n/a 29 3925 3940 4089 N
+ R Y DH s n/a 29 3925 3940 4089 N
+ R Y EH b n/a 29 3925 3944 4056 N
+ R Y EH e n/a 29 3925 3940 4064 N
+ R Y EH s n/a 29 3925 3940 4056 N
+ R Y ER e n/a 29 3925 3961 4064 N
+ R Y ER s n/a 29 3925 3961 4064 N
+ R Y EY b n/a 29 3925 3946 4041 N
+ R Y EY e n/a 29 3925 3942 4040 N
+ R Y EY s n/a 29 3925 3942 4041 N
+ R Y F b n/a 29 3925 3945 4102 N
+ R Y F e n/a 29 3925 3940 4102 N
+ R Y F s n/a 29 3925 3940 4102 N
+ R Y G b n/a 29 3925 3945 4098 N
+ R Y G e n/a 29 3925 3940 4097 N
+ R Y G s n/a 29 3925 3940 4098 N
+ R Y HH e n/a 29 3925 3940 4085 N
+ R Y HH s n/a 29 3925 3940 4085 N
+ R Y IH b n/a 29 3925 3971 4045 N
+ R Y IH e n/a 29 3925 3971 4045 N
+ R Y IH s n/a 29 3925 3971 4045 N
+ R Y IY b n/a 29 3925 3972 4051 N
+ R Y IY e n/a 29 3925 3972 4049 N
+ R Y IY s n/a 29 3925 3972 4049 N
+ R Y JH e n/a 29 3925 3940 4098 N
+ R Y JH s n/a 29 3925 3940 4098 N
+ R Y K b n/a 29 3925 3945 4096 N
+ R Y K e n/a 29 3925 3940 4096 N
+ R Y K s n/a 29 3925 3940 4096 N
+ R Y L e n/a 29 3925 3961 4103 N
+ R Y L s n/a 29 3925 3961 4103 N
+ R Y M e n/a 29 3925 3940 4106 N
+ R Y M s n/a 29 3925 3940 4106 N
+ R Y N b n/a 29 3925 3945 4086 N
+ R Y N e n/a 29 3925 3940 4086 N
+ R Y N s n/a 29 3925 3940 4086 N
+ R Y NG e n/a 29 3925 3940 4085 N
+ R Y NG s n/a 29 3925 3940 4085 N
+ R Y OW b n/a 29 3925 3968 4073 N
+ R Y OW e n/a 29 3925 3969 4075 N
+ R Y OW s n/a 29 3925 3969 4073 N
+ R Y OY b n/a 29 3925 3966 4070 N
+ R Y OY e n/a 29 3925 3966 4075 N
+ R Y OY s n/a 29 3925 3966 4070 N
+ R Y P b n/a 29 3925 3945 4101 N
+ R Y P e n/a 29 3925 3940 4101 N
+ R Y P s n/a 29 3925 3940 4101 N
+ R Y R b n/a 29 3925 3967 4105 N
+ R Y R e n/a 29 3925 3961 4105 N
+ R Y R s n/a 29 3925 3961 4105 N
+ R Y S b n/a 29 3925 3945 4083 N
+ R Y S e n/a 29 3925 3940 4083 N
+ R Y S s n/a 29 3925 3940 4083 N
+ R Y SH e n/a 29 3925 3940 4083 N
+ R Y SH s n/a 29 3925 3940 4083 N
+ R Y SIL e n/a 29 3925 3940 4110 N
+ R Y SIL s n/a 29 3925 3940 4110 N
+ R Y T b n/a 29 3925 3945 4094 N
+ R Y T e n/a 29 3925 3940 4094 N
+ R Y T s n/a 29 3925 3940 4094 N
+ R Y TH e n/a 29 3925 3940 4089 N
+ R Y TH s n/a 29 3925 3940 4089 N
+ R Y UH b n/a 29 3925 3973 4048 N
+ R Y UH e n/a 29 3925 3973 4048 N
+ R Y UH s n/a 29 3925 3973 4048 N
+ R Y UW b n/a 29 3925 3973 4048 N
+ R Y UW e n/a 29 3925 3973 4048 N
+ R Y UW s n/a 29 3925 3973 4048 N
+ R Y V e n/a 29 3925 3940 4101 N
+ R Y V s n/a 29 3925 3940 4101 N
+ R Y W b n/a 29 3925 3967 4105 N
+ R Y W e n/a 29 3925 3961 4105 N
+ R Y W s n/a 29 3925 3961 4105 N
+ R Y Y b n/a 29 3925 3971 4091 N
+ R Y Y e n/a 29 3925 3971 4091 N
+ R Y Y s n/a 29 3925 3971 4091 N
+ R Y Z b n/a 29 3925 3945 4090 N
+ R Y Z e n/a 29 3925 3940 4090 N
+ R Y Z s n/a 29 3925 3940 4090 N
+ R Y ZH e n/a 29 3925 3940 4090 N
+ R Y ZH s n/a 29 3925 3940 4090 N
+ R Z AA b n/a 29 3935 3964 4069 N
+ R Z AA e n/a 29 3914 3963 4075 N
+ R Z AA i n/a 29 3914 3963 4069 N
+ R Z AA s n/a 29 3914 3963 4069 N
+ R Z AE b n/a 29 3935 3945 4058 N
+ R Z AE e n/a 29 3914 3949 4075 N
+ R Z AE i n/a 29 3914 3949 4057 N
+ R Z AE s n/a 29 3914 3949 4058 N
+ R Z AH b n/a 29 3935 3967 4063 N
+ R Z AH e n/a 29 3913 3960 4065 N
+ R Z AH i n/a 29 3913 3960 4065 N
+ R Z AH s n/a 29 3913 3960 4065 N
+ R Z AO b n/a 29 3935 3966 4069 N
+ R Z AO e n/a 29 3913 3963 4075 N
+ R Z AO s n/a 29 3913 3963 4069 N
+ R Z AW b n/a 29 3935 3945 4058 N
+ R Z AW e n/a 29 3914 3949 4075 N
+ R Z AW s n/a 29 3914 3949 4058 N
+ R Z AY b n/a 29 3935 3964 4067 N
+ R Z AY e n/a 29 3914 3963 4075 N
+ R Z AY i n/a 29 3914 3963 4068 N
+ R Z AY s n/a 29 3914 3963 4067 N
+ R Z B b n/a 29 3935 3945 4101 N
+ R Z B e n/a 29 3914 3949 4101 N
+ R Z B s n/a 29 3914 3949 4101 N
+ R Z CH e n/a 29 3914 3949 4095 N
+ R Z CH s n/a 29 3914 3949 4095 N
+ R Z D b n/a 29 3935 3945 4098 N
+ R Z D e n/a 29 3914 3949 4098 N
+ R Z D s n/a 29 3914 3949 4098 N
+ R Z DH e n/a 29 3914 3949 4087 N
+ R Z DH s n/a 29 3914 3949 4087 N
+ R Z EH b n/a 29 3935 3944 4056 N
+ R Z EH e n/a 29 3913 3949 4065 N
+ R Z EH s n/a 29 3913 3949 4056 N
+ R Z ER e n/a 29 3913 3960 4065 N
+ R Z ER s n/a 29 3913 3960 4065 N
+ R Z EY b n/a 29 3935 3946 4041 N
+ R Z EY e n/a 29 3914 3942 4040 N
+ R Z EY i n/a 29 3914 3942 4041 N
+ R Z EY s n/a 29 3914 3942 4041 N
+ R Z F b n/a 29 3935 3945 4102 N
+ R Z F e n/a 29 3914 3949 4102 N
+ R Z F i n/a 29 3914 3949 4102 N
+ R Z F s n/a 29 3914 3949 4102 N
+ R Z G b n/a 29 3935 3945 4098 N
+ R Z G e n/a 29 3914 3949 4097 N
+ R Z G s n/a 29 3914 3949 4098 N
+ R Z HH e n/a 29 3914 3949 4085 N
+ R Z HH s n/a 29 3914 3949 4085 N
+ R Z IH b n/a 29 3934 3970 4045 N
+ R Z IH e n/a 29 3913 3970 4045 N
+ R Z IH i n/a 29 3913 3974 4046 N
+ R Z IH s n/a 29 3913 3970 4045 N
+ R Z IY b n/a 29 3934 3970 4051 N
+ R Z IY e n/a 29 3914 3970 4051 N
+ R Z IY i n/a 29 3914 3976 4052 N
+ R Z IY s n/a 29 3914 3970 4051 N
+ R Z JH e n/a 29 3914 3949 4098 N
+ R Z JH s n/a 29 3914 3949 4098 N
+ R Z K b n/a 29 3935 3945 4096 N
+ R Z K e n/a 29 3914 3949 4096 N
+ R Z K s n/a 29 3914 3949 4096 N
+ R Z L e n/a 29 3914 3960 4103 N
+ R Z L s n/a 29 3914 3960 4103 N
+ R Z M e n/a 29 3914 3949 4106 N
+ R Z M s n/a 29 3914 3949 4106 N
+ R Z N b n/a 29 3935 3945 4086 N
+ R Z N e n/a 29 3914 3949 4086 N
+ R Z N s n/a 29 3914 3949 4086 N
+ R Z NG e n/a 29 3914 3949 4085 N
+ R Z NG s n/a 29 3914 3949 4085 N
+ R Z OW b n/a 29 3935 3968 4073 N
+ R Z OW e n/a 29 3913 3963 4075 N
+ R Z OW i n/a 29 3913 3963 4072 N
+ R Z OW s n/a 29 3913 3963 4073 N
+ R Z OY b n/a 29 3935 3966 4070 N
+ R Z OY e n/a 29 3913 3963 4075 N
+ R Z OY s n/a 29 3913 3963 4070 N
+ R Z P b n/a 29 3935 3945 4101 N
+ R Z P e n/a 29 3914 3949 4101 N
+ R Z P s n/a 29 3914 3949 4101 N
+ R Z R b n/a 29 3935 3967 4108 N
+ R Z R e n/a 29 3914 3960 4108 N
+ R Z R s n/a 29 3914 3960 4108 N
+ R Z S b n/a 29 3935 3945 4083 N
+ R Z S e n/a 29 3914 3949 4083 N
+ R Z S s n/a 29 3914 3949 4083 N
+ R Z SH e n/a 29 3914 3949 4083 N
+ R Z SH s n/a 29 3914 3949 4083 N
+ R Z SIL e n/a 29 3914 3949 4110 N
+ R Z SIL s n/a 29 3914 3949 4110 N
+ R Z T b n/a 29 3935 3945 4095 N
+ R Z T e n/a 29 3914 3949 4095 N
+ R Z T s n/a 29 3914 3949 4095 N
+ R Z TH e n/a 29 3914 3949 4088 N
+ R Z TH s n/a 29 3914 3949 4088 N
+ R Z UH b n/a 29 3935 3973 4048 N
+ R Z UH e n/a 29 3913 3973 4047 N
+ R Z UH s n/a 29 3913 3973 4047 N
+ R Z UW b n/a 29 3935 3973 4048 N
+ R Z UW e n/a 29 3913 3973 4047 N
+ R Z UW i n/a 29 3913 3984 4047 N
+ R Z UW s n/a 29 3913 3973 4047 N
+ R Z V e n/a 29 3914 3949 4101 N
+ R Z V s n/a 29 3914 3949 4101 N
+ R Z W b n/a 29 3935 3967 4108 N
+ R Z W e n/a 29 3913 3960 4108 N
+ R Z W s n/a 29 3913 3960 4108 N
+ R Z Y b n/a 29 3934 3970 4091 N
+ R Z Y e n/a 29 3914 3970 4091 N
+ R Z Y s n/a 29 3914 3970 4091 N
+ R Z Z b n/a 29 3935 3945 4092 N
+ R Z Z e n/a 29 3914 3949 4092 N
+ R Z Z s n/a 29 3914 3949 4092 N
+ R Z ZH e n/a 29 3914 3949 4092 N
+ R Z ZH s n/a 29 3914 3949 4092 N
+ R ZH AA b n/a 29 3935 3964 4069 N
+ R ZH AA s n/a 29 3930 3964 4069 N
+ R ZH AE b n/a 29 3935 3945 4058 N
+ R ZH AE s n/a 29 3930 3940 4058 N
+ R ZH AH b n/a 29 3935 3967 4063 N
+ R ZH AH s n/a 29 3930 3961 4064 N
+ R ZH AO b n/a 29 3935 3966 4069 N
+ R ZH AO s n/a 29 3930 3966 4069 N
+ R ZH AW b n/a 29 3935 3945 4058 N
+ R ZH AW s n/a 29 3930 3940 4058 N
+ R ZH AY b n/a 29 3935 3964 4067 N
+ R ZH AY s n/a 29 3930 3964 4067 N
+ R ZH B b n/a 29 3935 3945 4101 N
+ R ZH B s n/a 29 3930 3940 4101 N
+ R ZH CH s n/a 29 3930 3940 4095 N
+ R ZH D b n/a 29 3935 3945 4098 N
+ R ZH D s n/a 29 3930 3940 4098 N
+ R ZH DH s n/a 29 3930 3940 4087 N
+ R ZH EH b n/a 29 3935 3944 4056 N
+ R ZH EH s n/a 29 3930 3940 4056 N
+ R ZH ER s n/a 29 3930 3961 4064 N
+ R ZH EY b n/a 29 3935 3946 4041 N
+ R ZH EY s n/a 29 3930 3942 4041 N
+ R ZH F b n/a 29 3935 3945 4102 N
+ R ZH F s n/a 29 3930 3940 4102 N
+ R ZH G b n/a 29 3935 3945 4098 N
+ R ZH G s n/a 29 3930 3940 4098 N
+ R ZH HH s n/a 29 3930 3940 4085 N
+ R ZH IH b n/a 29 3934 3970 4045 N
+ R ZH IH s n/a 29 3930 3970 4045 N
+ R ZH IY b n/a 29 3934 3970 4051 N
+ R ZH IY s n/a 29 3930 3970 4051 N
+ R ZH JH s n/a 29 3930 3940 4098 N
+ R ZH K b n/a 29 3935 3945 4096 N
+ R ZH K s n/a 29 3930 3940 4096 N
+ R ZH L s n/a 29 3930 3961 4103 N
+ R ZH M s n/a 29 3930 3940 4106 N
+ R ZH N b n/a 29 3935 3945 4086 N
+ R ZH N s n/a 29 3930 3940 4086 N
+ R ZH NG s n/a 29 3930 3940 4085 N
+ R ZH OW b n/a 29 3935 3968 4073 N
+ R ZH OW s n/a 29 3930 3969 4073 N
+ R ZH OY b n/a 29 3935 3966 4070 N
+ R ZH OY s n/a 29 3930 3966 4070 N
+ R ZH P b n/a 29 3935 3945 4101 N
+ R ZH P s n/a 29 3930 3940 4101 N
+ R ZH R b n/a 29 3935 3967 4108 N
+ R ZH R s n/a 29 3930 3961 4108 N
+ R ZH S b n/a 29 3935 3945 4083 N
+ R ZH S s n/a 29 3930 3940 4083 N
+ R ZH SH s n/a 29 3930 3940 4083 N
+ R ZH SIL s n/a 29 3930 3940 4110 N
+ R ZH T b n/a 29 3935 3945 4095 N
+ R ZH T s n/a 29 3930 3940 4095 N
+ R ZH TH s n/a 29 3930 3940 4088 N
+ R ZH UH b n/a 29 3935 3973 4048 N
+ R ZH UH s n/a 29 3930 3973 4048 N
+ R ZH UW b n/a 29 3935 3973 4048 N
+ R ZH UW s n/a 29 3930 3973 4048 N
+ R ZH V s n/a 29 3930 3940 4101 N
+ R ZH W b n/a 29 3935 3967 4108 N
+ R ZH W s n/a 29 3930 3961 4108 N
+ R ZH Y b n/a 29 3934 3970 4091 N
+ R ZH Y s n/a 29 3930 3970 4091 N
+ R ZH Z b n/a 29 3935 3945 4092 N
+ R ZH Z s n/a 29 3930 3940 4092 N
+ R ZH ZH s n/a 29 3930 3940 4092 N
+ S AA AA b n/a 30 4114 4197 4232 N
+ S AA AA e n/a 30 4114 4197 4233 N
+ S AA AA i n/a 30 4114 4197 4232 N
+ S AA AA s n/a 30 4114 4197 4232 N
+ S AA AE b n/a 30 4114 4197 4229 N
+ S AA AE e n/a 30 4114 4197 4231 N
+ S AA AE i n/a 30 4114 4197 4229 N
+ S AA AE s n/a 30 4114 4197 4229 N
+ S AA AH b n/a 30 4114 4197 4235 N
+ S AA AH e n/a 30 4114 4197 4244 N
+ S AA AH i n/a 30 4114 4197 4243 N
+ S AA AH s n/a 30 4114 4197 4244 N
+ S AA AO b n/a 30 4114 4197 4234 N
+ S AA AO e n/a 30 4114 4197 4233 N
+ S AA AO i n/a 30 4114 4197 4234 N
+ S AA AO s n/a 30 4114 4197 4234 N
+ S AA AW b n/a 30 4114 4197 4229 N
+ S AA AW e n/a 30 4114 4197 4231 N
+ S AA AW s n/a 30 4114 4197 4229 N
+ S AA AY b n/a 30 4114 4197 4232 N
+ S AA AY e n/a 30 4114 4197 4233 N
+ S AA AY i n/a 30 4114 4197 4232 N
+ S AA AY s n/a 30 4114 4197 4232 N
+ S AA B b n/a 30 4114 4149 4225 N
+ S AA B e n/a 30 4114 4149 4225 N
+ S AA B i n/a 30 4114 4149 4225 N
+ S AA B s n/a 30 4114 4149 4225 N
+ S AA CH e n/a 30 4114 4149 4219 N
+ S AA CH i n/a 30 4114 4149 4219 N
+ S AA CH s n/a 30 4114 4149 4219 N
+ S AA D b n/a 30 4114 4149 4223 N
+ S AA D e n/a 30 4114 4149 4219 N
+ S AA D i n/a 30 4114 4149 4219 N
+ S AA D s n/a 30 4114 4149 4219 N
+ S AA DH e n/a 30 4114 4149 4212 N
+ S AA DH s n/a 30 4114 4149 4212 N
+ S AA EH b n/a 30 4114 4197 4226 N
+ S AA EH e n/a 30 4114 4197 4231 N
+ S AA EH i n/a 30 4114 4197 4228 N
+ S AA EH s n/a 30 4114 4197 4226 N
+ S AA ER b n/a 30 4114 4197 4245 N
+ S AA ER e n/a 30 4114 4197 4246 N
+ S AA ER i n/a 30 4114 4197 4245 N
+ S AA ER s n/a 30 4114 4197 4245 N
+ S AA EY b n/a 30 4114 4197 4230 N
+ S AA EY e n/a 30 4114 4197 4231 N
+ S AA EY i n/a 30 4114 4197 4230 N
+ S AA EY s n/a 30 4114 4197 4230 N
+ S AA F b n/a 30 4114 4149 4214 N
+ S AA F e n/a 30 4114 4149 4214 N
+ S AA F i n/a 30 4114 4149 4214 N
+ S AA F s n/a 30 4114 4149 4214 N
+ S AA G e n/a 30 4114 4149 4208 N
+ S AA G i n/a 30 4114 4149 4208 N
+ S AA G s n/a 30 4114 4149 4208 N
+ S AA HH b n/a 30 4114 4149 4213 N
+ S AA HH e n/a 30 4114 4149 4213 N
+ S AA HH i n/a 30 4114 4149 4213 N
+ S AA HH s n/a 30 4114 4149 4213 N
+ S AA IH b n/a 30 4114 4197 4239 N
+ S AA IH e n/a 30 4114 4197 4240 N
+ S AA IH i n/a 30 4114 4197 4240 N
+ S AA IH s n/a 30 4114 4197 4240 N
+ S AA IY b n/a 30 4114 4197 4247 N
+ S AA IY e n/a 30 4114 4197 4247 N
+ S AA IY i n/a 30 4114 4197 4247 N
+ S AA IY s n/a 30 4114 4197 4247 N
+ S AA JH b n/a 30 4114 4149 4223 N
+ S AA JH e n/a 30 4114 4149 4219 N
+ S AA JH i n/a 30 4114 4149 4219 N
+ S AA JH s n/a 30 4114 4149 4219 N
+ S AA K b n/a 30 4114 4149 4208 N
+ S AA K e n/a 30 4114 4149 4208 N
+ S AA K i n/a 30 4114 4149 4208 N
+ S AA K s n/a 30 4114 4149 4208 N
+ S AA L b n/a 30 4114 4149 4204 N
+ S AA L e n/a 30 4114 4149 4204 N
+ S AA L i n/a 30 4114 4149 4204 N
+ S AA L s n/a 30 4114 4149 4204 N
+ S AA M b n/a 30 4114 4149 4206 N
+ S AA M e n/a 30 4114 4149 4206 N
+ S AA M i n/a 30 4114 4149 4206 N
+ S AA M s n/a 30 4114 4149 4206 N
+ S AA N b n/a 30 4114 4149 4216 N
+ S AA N e n/a 30 4114 4149 4216 N
+ S AA N i n/a 30 4114 4149 4216 N
+ S AA N s n/a 30 4114 4149 4216 N
+ S AA NG e n/a 30 4114 4149 4204 N
+ S AA NG s n/a 30 4114 4149 4204 N
+ S AA OW b n/a 30 4114 4197 4236 N
+ S AA OW e n/a 30 4114 4197 4233 N
+ S AA OW i n/a 30 4114 4197 4236 N
+ S AA OW s n/a 30 4114 4197 4236 N
+ S AA OY b n/a 30 4114 4197 4234 N
+ S AA OY e n/a 30 4114 4197 4233 N
+ S AA OY i n/a 30 4114 4197 4234 N
+ S AA OY s n/a 30 4114 4197 4234 N
+ S AA P b n/a 30 4114 4149 4225 N
+ S AA P e n/a 30 4114 4149 4225 N
+ S AA P i n/a 30 4114 4149 4225 N
+ S AA P s n/a 30 4114 4149 4225 N
+ S AA R b n/a 30 4114 4149 4205 N
+ S AA R e n/a 30 4114 4149 4205 N
+ S AA R i n/a 30 4114 4149 4205 N
+ S AA R s n/a 30 4114 4149 4205 N
+ S AA S b n/a 30 4114 4149 4215 N
+ S AA S e n/a 30 4114 4149 4215 N
+ S AA S s n/a 30 4114 4149 4215 N
+ S AA SH b n/a 30 4114 4149 4213 N
+ S AA SH e n/a 30 4114 4149 4213 N
+ S AA SH s n/a 30 4114 4149 4213 N
+ S AA SIL e n/a 30 4114 4176 4211 N
+ S AA SIL s n/a 30 4114 4176 4211 N
+ S AA T b n/a 30 4114 4149 4223 N
+ S AA T e n/a 30 4114 4149 4219 N
+ S AA T i n/a 30 4114 4149 4219 N
+ S AA T s n/a 30 4114 4149 4219 N
+ S AA TH b n/a 30 4114 4149 4212 N
+ S AA TH e n/a 30 4114 4149 4212 N
+ S AA TH i n/a 30 4114 4149 4212 N
+ S AA TH s n/a 30 4114 4149 4212 N
+ S AA UH b n/a 30 4114 4197 4242 N
+ S AA UH e n/a 30 4114 4197 4242 N
+ S AA UH i n/a 30 4114 4197 4242 N
+ S AA UH s n/a 30 4114 4197 4242 N
+ S AA UW b n/a 30 4114 4197 4242 N
+ S AA UW e n/a 30 4114 4197 4242 N
+ S AA UW i n/a 30 4114 4197 4242 N
+ S AA UW s n/a 30 4114 4197 4242 N
+ S AA V b n/a 30 4114 4149 4216 N
+ S AA V e n/a 30 4114 4149 4216 N
+ S AA V i n/a 30 4114 4149 4216 N
+ S AA V s n/a 30 4114 4149 4216 N
+ S AA W b n/a 30 4114 4149 4209 N
+ S AA W e n/a 30 4114 4149 4209 N
+ S AA W i n/a 30 4114 4149 4209 N
+ S AA W s n/a 30 4114 4149 4209 N
+ S AA Y b n/a 30 4114 4149 4217 N
+ S AA Y e n/a 30 4114 4149 4217 N
+ S AA Y i n/a 30 4114 4149 4217 N
+ S AA Y s n/a 30 4114 4149 4217 N
+ S AA Z e n/a 30 4114 4149 4211 N
+ S AA Z s n/a 30 4114 4149 4211 N
+ S AA ZH e n/a 30 4114 4149 4216 N
+ S AA ZH s n/a 30 4114 4149 4216 N
+ S AE AA b n/a 30 4112 4198 4232 N
+ S AE AA e n/a 30 4112 4198 4233 N
+ S AE AA i n/a 30 4112 4198 4232 N
+ S AE AA s n/a 30 4112 4198 4232 N
+ S AE AE b n/a 30 4112 4198 4229 N
+ S AE AE e n/a 30 4112 4198 4231 N
+ S AE AE i n/a 30 4112 4198 4229 N
+ S AE AE s n/a 30 4112 4198 4229 N
+ S AE AH b n/a 30 4112 4198 4235 N
+ S AE AH e n/a 30 4112 4198 4244 N
+ S AE AH i n/a 30 4112 4198 4243 N
+ S AE AH s n/a 30 4112 4198 4244 N
+ S AE AO b n/a 30 4112 4198 4234 N
+ S AE AO e n/a 30 4112 4198 4233 N
+ S AE AO i n/a 30 4112 4198 4234 N
+ S AE AO s n/a 30 4112 4198 4234 N
+ S AE AW b n/a 30 4112 4198 4229 N
+ S AE AW e n/a 30 4112 4198 4231 N
+ S AE AW s n/a 30 4112 4198 4229 N
+ S AE AY b n/a 30 4112 4198 4232 N
+ S AE AY e n/a 30 4112 4198 4233 N
+ S AE AY i n/a 30 4112 4198 4232 N
+ S AE AY s n/a 30 4112 4198 4232 N
+ S AE B b n/a 30 4112 4150 4225 N
+ S AE B e n/a 30 4112 4150 4225 N
+ S AE B i n/a 30 4112 4150 4225 N
+ S AE B s n/a 30 4112 4150 4225 N
+ S AE CH e n/a 30 4112 4150 4219 N
+ S AE CH i n/a 30 4112 4150 4219 N
+ S AE CH s n/a 30 4112 4150 4219 N
+ S AE D b n/a 30 4112 4150 4223 N
+ S AE D e n/a 30 4112 4150 4219 N
+ S AE D i n/a 30 4112 4150 4219 N
+ S AE D s n/a 30 4112 4150 4219 N
+ S AE DH e n/a 30 4112 4150 4212 N
+ S AE DH s n/a 30 4112 4150 4212 N
+ S AE EH b n/a 30 4112 4198 4226 N
+ S AE EH e n/a 30 4112 4198 4231 N
+ S AE EH i n/a 30 4112 4198 4229 N
+ S AE EH s n/a 30 4112 4198 4226 N
+ S AE ER b n/a 30 4112 4198 4245 N
+ S AE ER e n/a 30 4112 4198 4246 N
+ S AE ER i n/a 30 4112 4198 4245 N
+ S AE ER s n/a 30 4112 4198 4245 N
+ S AE EY b n/a 30 4112 4198 4230 N
+ S AE EY e n/a 30 4112 4198 4231 N
+ S AE EY i n/a 30 4112 4198 4230 N
+ S AE EY s n/a 30 4112 4198 4230 N
+ S AE F b n/a 30 4112 4150 4214 N
+ S AE F e n/a 30 4112 4150 4214 N
+ S AE F i n/a 30 4112 4150 4214 N
+ S AE F s n/a 30 4112 4150 4214 N
+ S AE G e n/a 30 4112 4150 4208 N
+ S AE G i n/a 30 4112 4150 4208 N
+ S AE G s n/a 30 4112 4150 4208 N
+ S AE HH b n/a 30 4112 4150 4213 N
+ S AE HH e n/a 30 4112 4150 4213 N
+ S AE HH i n/a 30 4112 4150 4213 N
+ S AE HH s n/a 30 4112 4150 4213 N
+ S AE IH b n/a 30 4112 4198 4239 N
+ S AE IH e n/a 30 4112 4198 4240 N
+ S AE IH i n/a 30 4112 4198 4239 N
+ S AE IH s n/a 30 4112 4198 4240 N
+ S AE IY b n/a 30 4112 4198 4247 N
+ S AE IY e n/a 30 4112 4198 4247 N
+ S AE IY i n/a 30 4112 4198 4247 N
+ S AE IY s n/a 30 4112 4198 4247 N
+ S AE JH b n/a 30 4112 4150 4223 N
+ S AE JH e n/a 30 4112 4150 4219 N
+ S AE JH i n/a 30 4112 4150 4219 N
+ S AE JH s n/a 30 4112 4150 4219 N
+ S AE K b n/a 30 4112 4150 4208 N
+ S AE K e n/a 30 4112 4150 4208 N
+ S AE K i n/a 30 4112 4150 4208 N
+ S AE K s n/a 30 4112 4150 4208 N
+ S AE L b n/a 30 4112 4150 4204 N
+ S AE L e n/a 30 4112 4150 4204 N
+ S AE L i n/a 30 4112 4150 4204 N
+ S AE L s n/a 30 4112 4150 4204 N
+ S AE M b n/a 30 4112 4150 4206 N
+ S AE M e n/a 30 4112 4150 4206 N
+ S AE M i n/a 30 4112 4150 4206 N
+ S AE M s n/a 30 4112 4150 4206 N
+ S AE N b n/a 30 4112 4150 4216 N
+ S AE N e n/a 30 4112 4150 4216 N
+ S AE N i n/a 30 4112 4150 4216 N
+ S AE N s n/a 30 4112 4150 4216 N
+ S AE NG e n/a 30 4112 4150 4204 N
+ S AE NG s n/a 30 4112 4150 4204 N
+ S AE OW b n/a 30 4112 4198 4236 N
+ S AE OW e n/a 30 4112 4198 4233 N
+ S AE OW i n/a 30 4112 4198 4236 N
+ S AE OW s n/a 30 4112 4198 4236 N
+ S AE OY b n/a 30 4112 4198 4234 N
+ S AE OY e n/a 30 4112 4198 4233 N
+ S AE OY s n/a 30 4112 4198 4234 N
+ S AE P b n/a 30 4112 4150 4225 N
+ S AE P e n/a 30 4112 4150 4225 N
+ S AE P i n/a 30 4112 4150 4225 N
+ S AE P s n/a 30 4112 4150 4225 N
+ S AE R b n/a 30 4112 4150 4205 N
+ S AE R e n/a 30 4112 4150 4205 N
+ S AE R i n/a 30 4112 4150 4205 N
+ S AE R s n/a 30 4112 4150 4205 N
+ S AE S b n/a 30 4112 4150 4215 N
+ S AE S e n/a 30 4112 4150 4215 N
+ S AE S s n/a 30 4112 4150 4215 N
+ S AE SH b n/a 30 4112 4150 4213 N
+ S AE SH e n/a 30 4112 4150 4213 N
+ S AE SH s n/a 30 4112 4150 4213 N
+ S AE SIL e n/a 30 4113 4176 4211 N
+ S AE SIL s n/a 30 4113 4176 4211 N
+ S AE T b n/a 30 4112 4150 4223 N
+ S AE T e n/a 30 4112 4150 4219 N
+ S AE T i n/a 30 4112 4150 4219 N
+ S AE T s n/a 30 4112 4150 4219 N
+ S AE TH b n/a 30 4112 4150 4212 N
+ S AE TH e n/a 30 4112 4150 4212 N
+ S AE TH i n/a 30 4112 4150 4212 N
+ S AE TH s n/a 30 4112 4150 4212 N
+ S AE UH b n/a 30 4112 4198 4242 N
+ S AE UH e n/a 30 4112 4198 4242 N
+ S AE UH s n/a 30 4112 4198 4242 N
+ S AE UW b n/a 30 4112 4198 4242 N
+ S AE UW e n/a 30 4112 4198 4242 N
+ S AE UW i n/a 30 4112 4198 4242 N
+ S AE UW s n/a 30 4112 4198 4242 N
+ S AE V b n/a 30 4112 4150 4216 N
+ S AE V e n/a 30 4112 4150 4216 N
+ S AE V s n/a 30 4112 4150 4216 N
+ S AE W b n/a 30 4112 4150 4209 N
+ S AE W e n/a 30 4112 4150 4209 N
+ S AE W i n/a 30 4112 4150 4209 N
+ S AE W s n/a 30 4112 4150 4209 N
+ S AE Y b n/a 30 4112 4150 4217 N
+ S AE Y e n/a 30 4112 4150 4217 N
+ S AE Y i n/a 30 4112 4150 4217 N
+ S AE Y s n/a 30 4112 4150 4217 N
+ S AE Z e n/a 30 4112 4150 4211 N
+ S AE Z s n/a 30 4112 4150 4211 N
+ S AE ZH e n/a 30 4112 4150 4216 N
+ S AE ZH i n/a 30 4112 4150 4216 N
+ S AE ZH s n/a 30 4112 4150 4216 N
+ S AH AA b n/a 30 4122 4188 4232 N
+ S AH AA e n/a 30 4124 4194 4233 N
+ S AH AA i n/a 30 4121 4194 4232 N
+ S AH AA s n/a 30 4124 4194 4232 N
+ S AH AE b n/a 30 4122 4187 4229 N
+ S AH AE e n/a 30 4124 4194 4231 N
+ S AH AE i n/a 30 4121 4194 4229 N
+ S AH AE s n/a 30 4124 4194 4229 N
+ S AH AH b n/a 30 4122 4188 4235 N
+ S AH AH e n/a 30 4124 4194 4244 N
+ S AH AH i n/a 30 4121 4194 4243 N
+ S AH AH s n/a 30 4124 4194 4244 N
+ S AH AO b n/a 30 4122 4188 4234 N
+ S AH AO e n/a 30 4124 4194 4233 N
+ S AH AO i n/a 30 4121 4194 4234 N
+ S AH AO s n/a 30 4124 4194 4234 N
+ S AH AW b n/a 30 4122 4187 4229 N
+ S AH AW e n/a 30 4124 4194 4231 N
+ S AH AW i n/a 30 4121 4194 4229 N
+ S AH AW s n/a 30 4124 4194 4229 N
+ S AH AY b n/a 30 4122 4188 4232 N
+ S AH AY e n/a 30 4124 4194 4233 N
+ S AH AY i n/a 30 4121 4194 4232 N
+ S AH AY s n/a 30 4124 4194 4232 N
+ S AH B b n/a 30 4122 4156 4224 N
+ S AH B e n/a 30 4124 4156 4225 N
+ S AH B i n/a 30 4121 4156 4224 N
+ S AH B s n/a 30 4124 4156 4224 N
+ S AH CH e n/a 30 4124 4155 4218 N
+ S AH CH i n/a 30 4121 4155 4218 N
+ S AH CH s n/a 30 4124 4155 4218 N
+ S AH D b n/a 30 4122 4156 4223 N
+ S AH D e n/a 30 4124 4152 4218 N
+ S AH D i n/a 30 4124 4152 4218 N
+ S AH D s n/a 30 4124 4152 4218 N
+ S AH DH e n/a 30 4124 4154 4212 N
+ S AH DH s n/a 30 4124 4154 4212 N
+ S AH EH b n/a 30 4122 4187 4226 N
+ S AH EH e n/a 30 4124 4194 4231 N
+ S AH EH i n/a 30 4121 4194 4226 N
+ S AH EH s n/a 30 4124 4194 4226 N
+ S AH ER b n/a 30 4122 4188 4245 N
+ S AH ER e n/a 30 4124 4194 4246 N
+ S AH ER i n/a 30 4121 4194 4245 N
+ S AH ER s n/a 30 4124 4194 4245 N
+ S AH EY b n/a 30 4122 4187 4230 N
+ S AH EY e n/a 30 4124 4194 4231 N
+ S AH EY i n/a 30 4121 4194 4230 N
+ S AH EY s n/a 30 4124 4194 4230 N
+ S AH F b n/a 30 4122 4155 4214 N
+ S AH F e n/a 30 4124 4155 4214 N
+ S AH F i n/a 30 4121 4155 4214 N
+ S AH F s n/a 30 4124 4155 4214 N
+ S AH G e n/a 30 4124 4155 4208 N
+ S AH G i n/a 30 4121 4155 4207 N
+ S AH G s n/a 30 4124 4155 4207 N
+ S AH HH b n/a 30 4122 4155 4213 N
+ S AH HH e n/a 30 4124 4155 4213 N
+ S AH HH i n/a 30 4121 4155 4213 N
+ S AH HH s n/a 30 4124 4155 4213 N
+ S AH IH b n/a 30 4122 4187 4239 N
+ S AH IH e n/a 30 4124 4194 4240 N
+ S AH IH i n/a 30 4121 4194 4239 N
+ S AH IH s n/a 30 4124 4194 4240 N
+ S AH IY b n/a 30 4122 4187 4247 N
+ S AH IY e n/a 30 4124 4194 4247 N
+ S AH IY i n/a 30 4121 4194 4247 N
+ S AH IY s n/a 30 4124 4194 4247 N
+ S AH JH b n/a 30 4122 4155 4223 N
+ S AH JH e n/a 30 4124 4155 4218 N
+ S AH JH s n/a 30 4124 4155 4218 N
+ S AH K b n/a 30 4122 4155 4207 N
+ S AH K e n/a 30 4124 4155 4208 N
+ S AH K i n/a 30 4121 4155 4207 N
+ S AH K s n/a 30 4124 4155 4207 N
+ S AH L b n/a 30 4122 4154 4204 N
+ S AH L e n/a 30 4124 4154 4204 N
+ S AH L i n/a 30 4121 4154 4204 N
+ S AH L s n/a 30 4124 4154 4204 N
+ S AH M b n/a 30 4122 4156 4206 N
+ S AH M e n/a 30 4124 4156 4206 N
+ S AH M i n/a 30 4121 4156 4206 N
+ S AH M s n/a 30 4124 4156 4206 N
+ S AH N b n/a 30 4122 4156 4216 N
+ S AH N e n/a 30 4124 4152 4216 N
+ S AH N i n/a 30 4124 4152 4216 N
+ S AH N s n/a 30 4124 4152 4216 N
+ S AH NG e n/a 30 4124 4155 4204 N
+ S AH NG s n/a 30 4124 4155 4204 N
+ S AH OW b n/a 30 4122 4188 4236 N
+ S AH OW e n/a 30 4124 4194 4233 N
+ S AH OW i n/a 30 4121 4194 4236 N
+ S AH OW s n/a 30 4124 4194 4236 N
+ S AH OY b n/a 30 4122 4188 4234 N
+ S AH OY e n/a 30 4124 4194 4233 N
+ S AH OY i n/a 30 4121 4194 4234 N
+ S AH OY s n/a 30 4124 4194 4234 N
+ S AH P b n/a 30 4122 4156 4224 N
+ S AH P e n/a 30 4124 4156 4225 N
+ S AH P i n/a 30 4121 4156 4224 N
+ S AH P s n/a 30 4124 4156 4224 N
+ S AH R b n/a 30 4122 4153 4205 N
+ S AH R e n/a 30 4124 4153 4205 N
+ S AH R i n/a 30 4121 4153 4205 N
+ S AH R s n/a 30 4124 4153 4205 N
+ S AH S b n/a 30 4122 4155 4215 N
+ S AH S e n/a 30 4124 4152 4215 N
+ S AH S i n/a 30 4121 4152 4215 N
+ S AH S s n/a 30 4124 4152 4215 N
+ S AH SH b n/a 30 4122 4155 4213 N
+ S AH SH e n/a 30 4124 4155 4213 N
+ S AH SH i n/a 30 4121 4155 4213 N
+ S AH SH s n/a 30 4124 4155 4213 N
+ S AH SIL e n/a 30 4125 4176 4211 N
+ S AH SIL s n/a 30 4125 4176 4211 N
+ S AH T b n/a 30 4122 4156 4223 N
+ S AH T e n/a 30 4124 4152 4218 N
+ S AH T i n/a 30 4123 4152 4218 N
+ S AH T s n/a 30 4124 4152 4218 N
+ S AH TH b n/a 30 4122 4154 4212 N
+ S AH TH e n/a 30 4124 4154 4212 N
+ S AH TH i n/a 30 4121 4154 4212 N
+ S AH TH s n/a 30 4124 4154 4212 N
+ S AH UH b n/a 30 4122 4187 4242 N
+ S AH UH e n/a 30 4124 4194 4242 N
+ S AH UH s n/a 30 4124 4194 4242 N
+ S AH UW b n/a 30 4122 4187 4242 N
+ S AH UW e n/a 30 4124 4194 4242 N
+ S AH UW i n/a 30 4121 4194 4242 N
+ S AH UW s n/a 30 4124 4194 4242 N
+ S AH V b n/a 30 4122 4155 4216 N
+ S AH V e n/a 30 4124 4155 4216 N
+ S AH V i n/a 30 4121 4155 4216 N
+ S AH V s n/a 30 4124 4155 4216 N
+ S AH W b n/a 30 4122 4155 4209 N
+ S AH W e n/a 30 4124 4155 4209 N
+ S AH W i n/a 30 4121 4155 4209 N
+ S AH W s n/a 30 4124 4155 4209 N
+ S AH Y b n/a 30 4122 4155 4217 N
+ S AH Y e n/a 30 4124 4155 4217 N
+ S AH Y i n/a 30 4121 4155 4217 N
+ S AH Y s n/a 30 4124 4155 4217 N
+ S AH Z e n/a 30 4124 4152 4211 N
+ S AH Z i n/a 30 4121 4152 4211 N
+ S AH Z s n/a 30 4124 4152 4211 N
+ S AH ZH e n/a 30 4124 4155 4216 N
+ S AH ZH i n/a 30 4121 4155 4216 N
+ S AH ZH s n/a 30 4124 4155 4216 N
+ S AO AA b n/a 30 4114 4197 4232 N
+ S AO AA e n/a 30 4114 4197 4233 N
+ S AO AA s n/a 30 4114 4197 4232 N
+ S AO AE b n/a 30 4114 4197 4229 N
+ S AO AE e n/a 30 4114 4197 4231 N
+ S AO AE i n/a 30 4114 4197 4229 N
+ S AO AE s n/a 30 4114 4197 4229 N
+ S AO AH b n/a 30 4114 4197 4235 N
+ S AO AH e n/a 30 4114 4197 4244 N
+ S AO AH i n/a 30 4114 4197 4243 N
+ S AO AH s n/a 30 4114 4197 4244 N
+ S AO AO b n/a 30 4114 4197 4234 N
+ S AO AO e n/a 30 4114 4197 4233 N
+ S AO AO i n/a 30 4114 4197 4234 N
+ S AO AO s n/a 30 4114 4197 4234 N
+ S AO AW b n/a 30 4114 4197 4229 N
+ S AO AW e n/a 30 4114 4197 4231 N
+ S AO AW s n/a 30 4114 4197 4229 N
+ S AO AY b n/a 30 4114 4197 4232 N
+ S AO AY e n/a 30 4114 4197 4233 N
+ S AO AY i n/a 30 4114 4197 4232 N
+ S AO AY s n/a 30 4114 4197 4232 N
+ S AO B b n/a 30 4114 4149 4225 N
+ S AO B e n/a 30 4114 4149 4225 N
+ S AO B i n/a 30 4114 4149 4225 N
+ S AO B s n/a 30 4114 4149 4225 N
+ S AO CH e n/a 30 4114 4149 4219 N
+ S AO CH i n/a 30 4114 4149 4219 N
+ S AO CH s n/a 30 4114 4149 4219 N
+ S AO D b n/a 30 4114 4149 4223 N
+ S AO D e n/a 30 4114 4149 4219 N
+ S AO D i n/a 30 4114 4149 4219 N
+ S AO D s n/a 30 4114 4149 4219 N
+ S AO DH e n/a 30 4114 4149 4212 N
+ S AO DH s n/a 30 4114 4149 4212 N
+ S AO EH b n/a 30 4114 4197 4226 N
+ S AO EH e n/a 30 4114 4197 4231 N
+ S AO EH i n/a 30 4114 4197 4228 N
+ S AO EH s n/a 30 4114 4197 4226 N
+ S AO ER b n/a 30 4114 4197 4245 N
+ S AO ER e n/a 30 4114 4197 4246 N
+ S AO ER i n/a 30 4114 4197 4245 N
+ S AO ER s n/a 30 4114 4197 4245 N
+ S AO EY b n/a 30 4114 4197 4230 N
+ S AO EY e n/a 30 4114 4197 4231 N
+ S AO EY i n/a 30 4114 4197 4230 N
+ S AO EY s n/a 30 4114 4197 4230 N
+ S AO F b n/a 30 4114 4149 4214 N
+ S AO F e n/a 30 4114 4149 4214 N
+ S AO F i n/a 30 4114 4149 4214 N
+ S AO F s n/a 30 4114 4149 4214 N
+ S AO G e n/a 30 4114 4149 4208 N
+ S AO G s n/a 30 4114 4149 4208 N
+ S AO HH b n/a 30 4114 4149 4213 N
+ S AO HH e n/a 30 4114 4149 4213 N
+ S AO HH i n/a 30 4114 4149 4213 N
+ S AO HH s n/a 30 4114 4149 4213 N
+ S AO IH b n/a 30 4114 4197 4239 N
+ S AO IH e n/a 30 4114 4197 4240 N
+ S AO IH i n/a 30 4114 4197 4240 N
+ S AO IH s n/a 30 4114 4197 4240 N
+ S AO IY b n/a 30 4114 4197 4247 N
+ S AO IY e n/a 30 4114 4197 4247 N
+ S AO IY i n/a 30 4114 4197 4247 N
+ S AO IY s n/a 30 4114 4197 4247 N
+ S AO JH b n/a 30 4114 4149 4223 N
+ S AO JH e n/a 30 4114 4149 4219 N
+ S AO JH s n/a 30 4114 4149 4219 N
+ S AO K b n/a 30 4114 4149 4208 N
+ S AO K e n/a 30 4114 4149 4208 N
+ S AO K i n/a 30 4114 4149 4208 N
+ S AO K s n/a 30 4114 4149 4208 N
+ S AO L b n/a 30 4114 4149 4204 N
+ S AO L e n/a 30 4114 4149 4204 N
+ S AO L i n/a 30 4114 4149 4204 N
+ S AO L s n/a 30 4114 4149 4204 N
+ S AO M b n/a 30 4114 4149 4206 N
+ S AO M e n/a 30 4114 4149 4206 N
+ S AO M i n/a 30 4114 4149 4206 N
+ S AO M s n/a 30 4114 4149 4206 N
+ S AO N b n/a 30 4114 4149 4216 N
+ S AO N e n/a 30 4114 4149 4216 N
+ S AO N i n/a 30 4114 4149 4216 N
+ S AO N s n/a 30 4114 4149 4216 N
+ S AO NG e n/a 30 4114 4149 4204 N
+ S AO NG s n/a 30 4114 4149 4204 N
+ S AO OW b n/a 30 4114 4197 4236 N
+ S AO OW e n/a 30 4114 4197 4233 N
+ S AO OW i n/a 30 4114 4197 4236 N
+ S AO OW s n/a 30 4114 4197 4236 N
+ S AO OY b n/a 30 4114 4197 4234 N
+ S AO OY e n/a 30 4114 4197 4233 N
+ S AO OY s n/a 30 4114 4197 4234 N
+ S AO P b n/a 30 4114 4149 4225 N
+ S AO P e n/a 30 4114 4149 4225 N
+ S AO P i n/a 30 4114 4149 4225 N
+ S AO P s n/a 30 4114 4149 4225 N
+ S AO R b n/a 30 4114 4149 4205 N
+ S AO R e n/a 30 4114 4149 4205 N
+ S AO R i n/a 30 4114 4149 4205 N
+ S AO R s n/a 30 4114 4149 4205 N
+ S AO S b n/a 30 4114 4149 4215 N
+ S AO S e n/a 30 4114 4149 4215 N
+ S AO S s n/a 30 4114 4149 4215 N
+ S AO SH b n/a 30 4114 4149 4213 N
+ S AO SH e n/a 30 4114 4149 4213 N
+ S AO SH s n/a 30 4114 4149 4213 N
+ S AO SIL e n/a 30 4114 4176 4211 N
+ S AO SIL s n/a 30 4114 4176 4211 N
+ S AO T b n/a 30 4114 4149 4223 N
+ S AO T e n/a 30 4114 4149 4219 N
+ S AO T i n/a 30 4114 4149 4219 N
+ S AO T s n/a 30 4114 4149 4219 N
+ S AO TH b n/a 30 4114 4149 4212 N
+ S AO TH e n/a 30 4114 4149 4212 N
+ S AO TH i n/a 30 4114 4149 4212 N
+ S AO TH s n/a 30 4114 4149 4212 N
+ S AO UH b n/a 30 4114 4197 4242 N
+ S AO UH e n/a 30 4114 4197 4242 N
+ S AO UH s n/a 30 4114 4197 4242 N
+ S AO UW b n/a 30 4114 4197 4242 N
+ S AO UW e n/a 30 4114 4197 4242 N
+ S AO UW i n/a 30 4114 4197 4242 N
+ S AO UW s n/a 30 4114 4197 4242 N
+ S AO V b n/a 30 4114 4149 4216 N
+ S AO V e n/a 30 4114 4149 4216 N
+ S AO V s n/a 30 4114 4149 4216 N
+ S AO W b n/a 30 4114 4149 4209 N
+ S AO W e n/a 30 4114 4149 4209 N
+ S AO W i n/a 30 4114 4149 4209 N
+ S AO W s n/a 30 4114 4149 4209 N
+ S AO Y b n/a 30 4114 4149 4217 N
+ S AO Y e n/a 30 4114 4149 4217 N
+ S AO Y i n/a 30 4114 4149 4217 N
+ S AO Y s n/a 30 4114 4149 4217 N
+ S AO Z e n/a 30 4114 4149 4211 N
+ S AO Z s n/a 30 4114 4149 4211 N
+ S AO ZH e n/a 30 4114 4149 4216 N
+ S AO ZH s n/a 30 4114 4149 4216 N
+ S AW AA b n/a 30 4116 4195 4232 N
+ S AW AA e n/a 30 4116 4195 4233 N
+ S AW AA s n/a 30 4116 4195 4232 N
+ S AW AE b n/a 30 4116 4195 4229 N
+ S AW AE e n/a 30 4116 4195 4231 N
+ S AW AE s n/a 30 4116 4195 4229 N
+ S AW AH b n/a 30 4116 4195 4235 N
+ S AW AH e n/a 30 4116 4195 4244 N
+ S AW AH i n/a 30 4116 4197 4243 N
+ S AW AH s n/a 30 4116 4195 4244 N
+ S AW AO b n/a 30 4116 4195 4234 N
+ S AW AO e n/a 30 4116 4195 4233 N
+ S AW AO s n/a 30 4116 4195 4234 N
+ S AW AW b n/a 30 4116 4195 4229 N
+ S AW AW e n/a 30 4116 4195 4231 N
+ S AW AW i n/a 30 4116 4197 4229 N
+ S AW AW s n/a 30 4116 4195 4229 N
+ S AW AY b n/a 30 4116 4195 4232 N
+ S AW AY e n/a 30 4116 4195 4233 N
+ S AW AY s n/a 30 4116 4195 4232 N
+ S AW B b n/a 30 4116 4156 4225 N
+ S AW B e n/a 30 4116 4149 4225 N
+ S AW B i n/a 30 4116 4149 4225 N
+ S AW B s n/a 30 4116 4149 4225 N
+ S AW CH e n/a 30 4116 4149 4220 N
+ S AW CH i n/a 30 4116 4149 4220 N
+ S AW CH s n/a 30 4116 4149 4220 N
+ S AW D b n/a 30 4116 4156 4222 N
+ S AW D e n/a 30 4116 4149 4220 N
+ S AW D i n/a 30 4116 4149 4220 N
+ S AW D s n/a 30 4116 4149 4220 N
+ S AW DH e n/a 30 4116 4149 4212 N
+ S AW DH s n/a 30 4116 4149 4212 N
+ S AW EH b n/a 30 4116 4195 4226 N
+ S AW EH e n/a 30 4116 4195 4231 N
+ S AW EH s n/a 30 4116 4195 4226 N
+ S AW ER b n/a 30 4116 4195 4245 N
+ S AW ER e n/a 30 4116 4195 4246 N
+ S AW ER i n/a 30 4116 4197 4245 N
+ S AW ER s n/a 30 4116 4195 4245 N
+ S AW EY b n/a 30 4116 4195 4230 N
+ S AW EY e n/a 30 4116 4195 4231 N
+ S AW EY i n/a 30 4116 4197 4230 N
+ S AW EY s n/a 30 4116 4195 4230 N
+ S AW F b n/a 30 4116 4155 4214 N
+ S AW F e n/a 30 4116 4149 4214 N
+ S AW F i n/a 30 4116 4149 4214 N
+ S AW F s n/a 30 4116 4149 4214 N
+ S AW G e n/a 30 4116 4149 4208 N
+ S AW G i n/a 30 4116 4149 4208 N
+ S AW G s n/a 30 4116 4149 4208 N
+ S AW HH b n/a 30 4116 4155 4213 N
+ S AW HH e n/a 30 4116 4149 4213 N
+ S AW HH i n/a 30 4116 4149 4213 N
+ S AW HH s n/a 30 4116 4149 4213 N
+ S AW IH b n/a 30 4116 4195 4239 N
+ S AW IH e n/a 30 4116 4195 4240 N
+ S AW IH i n/a 30 4116 4197 4240 N
+ S AW IH s n/a 30 4116 4195 4240 N
+ S AW IY b n/a 30 4116 4195 4247 N
+ S AW IY e n/a 30 4116 4195 4247 N
+ S AW IY i n/a 30 4116 4197 4247 N
+ S AW IY s n/a 30 4116 4195 4247 N
+ S AW JH b n/a 30 4116 4155 4222 N
+ S AW JH e n/a 30 4116 4149 4220 N
+ S AW JH s n/a 30 4116 4149 4220 N
+ S AW K b n/a 30 4116 4155 4208 N
+ S AW K e n/a 30 4116 4149 4208 N
+ S AW K i n/a 30 4116 4149 4208 N
+ S AW K s n/a 30 4116 4149 4208 N
+ S AW L b n/a 30 4116 4154 4204 N
+ S AW L e n/a 30 4116 4149 4204 N
+ S AW L i n/a 30 4116 4149 4204 N
+ S AW L s n/a 30 4116 4149 4204 N
+ S AW M b n/a 30 4116 4156 4206 N
+ S AW M e n/a 30 4116 4149 4206 N
+ S AW M i n/a 30 4116 4149 4206 N
+ S AW M s n/a 30 4116 4149 4206 N
+ S AW N b n/a 30 4116 4156 4216 N
+ S AW N e n/a 30 4116 4149 4216 N
+ S AW N i n/a 30 4116 4149 4216 N
+ S AW N s n/a 30 4116 4149 4216 N
+ S AW NG e n/a 30 4116 4149 4204 N
+ S AW NG s n/a 30 4116 4149 4204 N
+ S AW OW b n/a 30 4116 4195 4236 N
+ S AW OW e n/a 30 4116 4195 4233 N
+ S AW OW i n/a 30 4116 4197 4236 N
+ S AW OW s n/a 30 4116 4195 4236 N
+ S AW OY b n/a 30 4116 4195 4234 N
+ S AW OY e n/a 30 4116 4195 4233 N
+ S AW OY s n/a 30 4116 4195 4234 N
+ S AW P b n/a 30 4116 4156 4225 N
+ S AW P e n/a 30 4116 4149 4225 N
+ S AW P i n/a 30 4116 4149 4225 N
+ S AW P s n/a 30 4116 4149 4225 N
+ S AW R b n/a 30 4116 4153 4205 N
+ S AW R e n/a 30 4116 4149 4205 N
+ S AW R i n/a 30 4116 4149 4205 N
+ S AW R s n/a 30 4116 4149 4205 N
+ S AW S b n/a 30 4116 4155 4215 N
+ S AW S e n/a 30 4116 4149 4215 N
+ S AW S s n/a 30 4116 4149 4215 N
+ S AW SH b n/a 30 4116 4155 4213 N
+ S AW SH e n/a 30 4116 4149 4213 N
+ S AW SH s n/a 30 4116 4149 4213 N
+ S AW SIL e n/a 30 4116 4176 4211 N
+ S AW SIL s n/a 30 4116 4176 4211 N
+ S AW T b n/a 30 4116 4156 4222 N
+ S AW T e n/a 30 4116 4149 4220 N
+ S AW T i n/a 30 4116 4149 4220 N
+ S AW T s n/a 30 4116 4149 4220 N
+ S AW TH b n/a 30 4116 4154 4212 N
+ S AW TH e n/a 30 4116 4149 4212 N
+ S AW TH s n/a 30 4116 4149 4212 N
+ S AW UH b n/a 30 4116 4195 4242 N
+ S AW UH e n/a 30 4116 4195 4242 N
+ S AW UH s n/a 30 4116 4195 4242 N
+ S AW UW b n/a 30 4116 4195 4242 N
+ S AW UW e n/a 30 4116 4195 4242 N
+ S AW UW i n/a 30 4116 4197 4242 N
+ S AW UW s n/a 30 4116 4195 4242 N
+ S AW V b n/a 30 4116 4155 4216 N
+ S AW V e n/a 30 4116 4149 4216 N
+ S AW V s n/a 30 4116 4149 4216 N
+ S AW W b n/a 30 4116 4155 4209 N
+ S AW W e n/a 30 4116 4149 4209 N
+ S AW W i n/a 30 4116 4149 4209 N
+ S AW W s n/a 30 4116 4149 4209 N
+ S AW Y b n/a 30 4116 4155 4217 N
+ S AW Y e n/a 30 4116 4149 4217 N
+ S AW Y i n/a 30 4116 4149 4217 N
+ S AW Y s n/a 30 4116 4149 4217 N
+ S AW Z e n/a 30 4116 4149 4211 N
+ S AW Z s n/a 30 4116 4149 4211 N
+ S AW ZH e n/a 30 4116 4149 4216 N
+ S AW ZH s n/a 30 4116 4149 4216 N
+ S AY AA b n/a 30 4130 4190 4232 N
+ S AY AA e n/a 30 4130 4190 4233 N
+ S AY AA i n/a 30 4130 4190 4232 N
+ S AY AA s n/a 30 4130 4190 4232 N
+ S AY AE b n/a 30 4130 4190 4229 N
+ S AY AE e n/a 30 4130 4190 4231 N
+ S AY AE i n/a 30 4130 4190 4229 N
+ S AY AE s n/a 30 4130 4190 4229 N
+ S AY AH b n/a 30 4130 4190 4235 N
+ S AY AH e n/a 30 4130 4190 4244 N
+ S AY AH i n/a 30 4130 4190 4241 N
+ S AY AH s n/a 30 4130 4190 4244 N
+ S AY AO b n/a 30 4130 4190 4234 N
+ S AY AO e n/a 30 4130 4190 4233 N
+ S AY AO i n/a 30 4130 4190 4234 N
+ S AY AO s n/a 30 4130 4190 4234 N
+ S AY AW b n/a 30 4130 4190 4229 N
+ S AY AW e n/a 30 4130 4190 4231 N
+ S AY AW s n/a 30 4130 4190 4229 N
+ S AY AY b n/a 30 4130 4190 4232 N
+ S AY AY e n/a 30 4130 4190 4233 N
+ S AY AY i n/a 30 4130 4190 4232 N
+ S AY AY s n/a 30 4130 4190 4232 N
+ S AY B b n/a 30 4130 4163 4225 N
+ S AY B e n/a 30 4130 4163 4225 N
+ S AY B i n/a 30 4130 4163 4225 N
+ S AY B s n/a 30 4130 4163 4225 N
+ S AY CH e n/a 30 4130 4163 4222 N
+ S AY CH s n/a 30 4130 4163 4222 N
+ S AY D b n/a 30 4130 4163 4222 N
+ S AY D e n/a 30 4130 4163 4222 N
+ S AY D i n/a 30 4130 4163 4222 N
+ S AY D s n/a 30 4130 4163 4222 N
+ S AY DH e n/a 30 4130 4163 4212 N
+ S AY DH s n/a 30 4130 4163 4212 N
+ S AY EH b n/a 30 4130 4190 4227 N
+ S AY EH e n/a 30 4130 4190 4231 N
+ S AY EH i n/a 30 4130 4190 4228 N
+ S AY EH s n/a 30 4130 4190 4227 N
+ S AY ER b n/a 30 4130 4190 4245 N
+ S AY ER e n/a 30 4130 4190 4246 N
+ S AY ER i n/a 30 4130 4190 4245 N
+ S AY ER s n/a 30 4130 4190 4245 N
+ S AY EY b n/a 30 4130 4190 4230 N
+ S AY EY e n/a 30 4130 4190 4231 N
+ S AY EY i n/a 30 4130 4190 4230 N
+ S AY EY s n/a 30 4130 4190 4230 N
+ S AY F b n/a 30 4130 4163 4214 N
+ S AY F e n/a 30 4130 4163 4214 N
+ S AY F i n/a 30 4130 4163 4214 N
+ S AY F s n/a 30 4130 4163 4214 N
+ S AY G e n/a 30 4130 4163 4208 N
+ S AY G i n/a 30 4130 4163 4208 N
+ S AY G s n/a 30 4130 4163 4208 N
+ S AY HH b n/a 30 4130 4163 4213 N
+ S AY HH e n/a 30 4130 4163 4213 N
+ S AY HH s n/a 30 4130 4163 4213 N
+ S AY IH b n/a 30 4130 4190 4239 N
+ S AY IH e n/a 30 4130 4190 4241 N
+ S AY IH i n/a 30 4130 4190 4241 N
+ S AY IH s n/a 30 4130 4190 4241 N
+ S AY IY b n/a 30 4130 4190 4247 N
+ S AY IY e n/a 30 4130 4190 4247 N
+ S AY IY i n/a 30 4130 4190 4247 N
+ S AY IY s n/a 30 4130 4190 4247 N
+ S AY JH b n/a 30 4130 4163 4222 N
+ S AY JH e n/a 30 4130 4163 4222 N
+ S AY JH s n/a 30 4130 4163 4222 N
+ S AY K b n/a 30 4130 4163 4208 N
+ S AY K e n/a 30 4130 4163 4208 N
+ S AY K i n/a 30 4130 4163 4208 N
+ S AY K s n/a 30 4130 4163 4208 N
+ S AY L b n/a 30 4130 4163 4204 N
+ S AY L e n/a 30 4130 4163 4204 N
+ S AY L i n/a 30 4130 4163 4204 N
+ S AY L s n/a 30 4130 4163 4204 N
+ S AY M b n/a 30 4130 4163 4206 N
+ S AY M e n/a 30 4130 4163 4206 N
+ S AY M i n/a 30 4130 4163 4206 N
+ S AY M s n/a 30 4130 4163 4206 N
+ S AY N b n/a 30 4130 4163 4216 N
+ S AY N e n/a 30 4130 4163 4216 N
+ S AY N i n/a 30 4130 4163 4216 N
+ S AY N s n/a 30 4130 4163 4216 N
+ S AY NG e n/a 30 4130 4163 4204 N
+ S AY NG s n/a 30 4130 4163 4204 N
+ S AY OW b n/a 30 4130 4190 4236 N
+ S AY OW e n/a 30 4130 4190 4233 N
+ S AY OW i n/a 30 4130 4190 4236 N
+ S AY OW s n/a 30 4130 4190 4236 N
+ S AY OY b n/a 30 4130 4190 4234 N
+ S AY OY e n/a 30 4130 4190 4233 N
+ S AY OY s n/a 30 4130 4190 4234 N
+ S AY P b n/a 30 4130 4163 4225 N
+ S AY P e n/a 30 4130 4163 4225 N
+ S AY P i n/a 30 4130 4163 4225 N
+ S AY P s n/a 30 4130 4163 4225 N
+ S AY R b n/a 30 4130 4163 4205 N
+ S AY R e n/a 30 4130 4163 4205 N
+ S AY R i n/a 30 4130 4163 4205 N
+ S AY R s n/a 30 4130 4163 4205 N
+ S AY S b n/a 30 4130 4163 4215 N
+ S AY S e n/a 30 4130 4163 4215 N
+ S AY S i n/a 30 4130 4163 4215 N
+ S AY S s n/a 30 4130 4163 4215 N
+ S AY SH b n/a 30 4130 4163 4213 N
+ S AY SH e n/a 30 4130 4163 4213 N
+ S AY SH s n/a 30 4130 4163 4213 N
+ S AY SIL e n/a 30 4128 4174 4210 N
+ S AY SIL s n/a 30 4128 4174 4210 N
+ S AY T b n/a 30 4130 4163 4222 N
+ S AY T e n/a 30 4130 4163 4222 N
+ S AY T i n/a 30 4130 4163 4222 N
+ S AY T s n/a 30 4130 4163 4222 N
+ S AY TH b n/a 30 4130 4163 4212 N
+ S AY TH e n/a 30 4130 4163 4212 N
+ S AY TH s n/a 30 4130 4163 4212 N
+ S AY UH b n/a 30 4130 4190 4242 N
+ S AY UH e n/a 30 4130 4190 4242 N
+ S AY UH s n/a 30 4130 4190 4242 N
+ S AY UW b n/a 30 4130 4190 4242 N
+ S AY UW e n/a 30 4130 4190 4242 N
+ S AY UW s n/a 30 4130 4190 4242 N
+ S AY V b n/a 30 4130 4163 4216 N
+ S AY V e n/a 30 4130 4163 4216 N
+ S AY V i n/a 30 4130 4163 4216 N
+ S AY V s n/a 30 4130 4163 4216 N
+ S AY W b n/a 30 4130 4163 4209 N
+ S AY W e n/a 30 4130 4163 4209 N
+ S AY W i n/a 30 4130 4163 4209 N
+ S AY W s n/a 30 4130 4163 4209 N
+ S AY Y b n/a 30 4130 4163 4217 N
+ S AY Y e n/a 30 4130 4163 4217 N
+ S AY Y s n/a 30 4130 4163 4217 N
+ S AY Z e n/a 30 4130 4163 4210 N
+ S AY Z s n/a 30 4130 4163 4210 N
+ S AY ZH e n/a 30 4130 4163 4216 N
+ S AY ZH s n/a 30 4130 4163 4216 N
+ S B AA b n/a 30 4139 4183 4232 N
+ S B AA i n/a 30 4139 4183 4232 N
+ S B AA s n/a 30 4139 4183 4232 N
+ S B AE b n/a 30 4139 4183 4229 N
+ S B AE s n/a 30 4139 4183 4229 N
+ S B AH b n/a 30 4139 4183 4235 N
+ S B AH i n/a 30 4139 4183 4243 N
+ S B AH s n/a 30 4139 4183 4244 N
+ S B AO b n/a 30 4139 4183 4234 N
+ S B AO i n/a 30 4139 4183 4234 N
+ S B AO s n/a 30 4139 4183 4234 N
+ S B AW b n/a 30 4139 4183 4229 N
+ S B AW s n/a 30 4139 4183 4229 N
+ S B AY b n/a 30 4139 4183 4232 N
+ S B AY i n/a 30 4139 4183 4232 N
+ S B AY s n/a 30 4139 4183 4232 N
+ S B B b n/a 30 4139 4166 4224 N
+ S B B i n/a 30 4139 4169 4224 N
+ S B B s n/a 30 4139 4169 4224 N
+ S B CH s n/a 30 4139 4169 4218 N
+ S B D b n/a 30 4139 4166 4223 N
+ S B D s n/a 30 4139 4166 4218 N
+ S B DH s n/a 30 4139 4168 4212 N
+ S B EH b n/a 30 4139 4183 4226 N
+ S B EH i n/a 30 4139 4183 4229 N
+ S B EH s n/a 30 4139 4183 4226 N
+ S B ER b n/a 30 4139 4183 4245 N
+ S B ER i n/a 30 4139 4183 4245 N
+ S B ER s n/a 30 4139 4183 4245 N
+ S B EY b n/a 30 4139 4183 4230 N
+ S B EY i n/a 30 4139 4183 4230 N
+ S B EY s n/a 30 4139 4183 4230 N
+ S B F b n/a 30 4139 4168 4214 N
+ S B F s n/a 30 4139 4169 4214 N
+ S B G s n/a 30 4139 4170 4207 N
+ S B HH b n/a 30 4139 4168 4213 N
+ S B HH s n/a 30 4139 4169 4213 N
+ S B IH b n/a 30 4139 4183 4239 N
+ S B IH i n/a 30 4139 4183 4239 N
+ S B IH s n/a 30 4139 4183 4240 N
+ S B IY b n/a 30 4139 4183 4247 N
+ S B IY i n/a 30 4139 4183 4247 N
+ S B IY s n/a 30 4139 4183 4247 N
+ S B JH b n/a 30 4139 4168 4223 N
+ S B JH s n/a 30 4139 4169 4218 N
+ S B K b n/a 30 4139 4168 4207 N
+ S B K i n/a 30 4139 4170 4207 N
+ S B K s n/a 30 4139 4170 4207 N
+ S B L b n/a 30 4139 4167 4204 N
+ S B L i n/a 30 4139 4169 4204 N
+ S B L s n/a 30 4139 4169 4204 N
+ S B M b n/a 30 4139 4166 4206 N
+ S B M s n/a 30 4139 4169 4206 N
+ S B N b n/a 30 4139 4166 4216 N
+ S B N s n/a 30 4139 4166 4216 N
+ S B NG s n/a 30 4139 4170 4204 N
+ S B OW b n/a 30 4139 4183 4236 N
+ S B OW i n/a 30 4139 4183 4236 N
+ S B OW s n/a 30 4139 4183 4236 N
+ S B OY b n/a 30 4139 4183 4234 N
+ S B OY i n/a 30 4139 4183 4234 N
+ S B OY s n/a 30 4139 4183 4234 N
+ S B P b n/a 30 4139 4166 4224 N
+ S B P i n/a 30 4139 4169 4224 N
+ S B P s n/a 30 4139 4169 4224 N
+ S B R b n/a 30 4139 4167 4205 N
+ S B R s n/a 30 4139 4170 4205 N
+ S B S b n/a 30 4139 4168 4215 N
+ S B S s n/a 30 4139 4168 4215 N
+ S B SH b n/a 30 4139 4168 4213 N
+ S B SH s n/a 30 4139 4169 4213 N
+ S B SIL s n/a 30 4139 4176 4211 N
+ S B T b n/a 30 4139 4166 4223 N
+ S B T i n/a 30 4139 4166 4218 N
+ S B T s n/a 30 4139 4166 4218 N
+ S B TH b n/a 30 4139 4168 4212 N
+ S B TH s n/a 30 4139 4168 4212 N
+ S B UH b n/a 30 4139 4183 4242 N
+ S B UH s n/a 30 4139 4183 4242 N
+ S B UW b n/a 30 4139 4183 4242 N
+ S B UW s n/a 30 4139 4183 4242 N
+ S B V b n/a 30 4139 4168 4216 N
+ S B V s n/a 30 4139 4169 4216 N
+ S B W b n/a 30 4139 4168 4209 N
+ S B W s n/a 30 4139 4170 4209 N
+ S B Y b n/a 30 4139 4168 4217 N
+ S B Y s n/a 30 4139 4169 4217 N
+ S B Z s n/a 30 4139 4168 4211 N
+ S B ZH s n/a 30 4139 4169 4216 N
+ S CH AA b n/a 30 4140 4183 4232 N
+ S CH AA e n/a 30 4140 4183 4233 N
+ S CH AA s n/a 30 4140 4183 4232 N
+ S CH AE b n/a 30 4140 4183 4229 N
+ S CH AE e n/a 30 4140 4183 4231 N
+ S CH AE s n/a 30 4140 4183 4229 N
+ S CH AH b n/a 30 4140 4183 4235 N
+ S CH AH e n/a 30 4140 4183 4244 N
+ S CH AH s n/a 30 4140 4183 4244 N
+ S CH AO b n/a 30 4140 4183 4234 N
+ S CH AO e n/a 30 4140 4183 4233 N
+ S CH AO s n/a 30 4140 4183 4234 N
+ S CH AW b n/a 30 4140 4183 4229 N
+ S CH AW e n/a 30 4140 4183 4231 N
+ S CH AW s n/a 30 4140 4183 4229 N
+ S CH AY b n/a 30 4140 4183 4232 N
+ S CH AY e n/a 30 4140 4183 4233 N
+ S CH AY i n/a 30 4140 4183 4232 N
+ S CH AY s n/a 30 4140 4183 4232 N
+ S CH B b n/a 30 4140 4166 4224 N
+ S CH B e n/a 30 4140 4169 4225 N
+ S CH B s n/a 30 4140 4169 4224 N
+ S CH CH e n/a 30 4140 4169 4218 N
+ S CH CH s n/a 30 4140 4169 4218 N
+ S CH D b n/a 30 4140 4166 4223 N
+ S CH D e n/a 30 4140 4166 4218 N
+ S CH D s n/a 30 4140 4166 4218 N
+ S CH DH e n/a 30 4140 4167 4212 N
+ S CH DH s n/a 30 4140 4168 4212 N
+ S CH EH b n/a 30 4140 4183 4226 N
+ S CH EH e n/a 30 4140 4183 4231 N
+ S CH EH s n/a 30 4140 4183 4226 N
+ S CH ER b n/a 30 4140 4183 4245 N
+ S CH ER e n/a 30 4140 4183 4246 N
+ S CH ER s n/a 30 4140 4183 4245 N
+ S CH EY b n/a 30 4140 4183 4230 N
+ S CH EY e n/a 30 4140 4183 4231 N
+ S CH EY s n/a 30 4140 4183 4230 N
+ S CH F b n/a 30 4140 4168 4214 N
+ S CH F e n/a 30 4140 4169 4214 N
+ S CH F s n/a 30 4140 4169 4214 N
+ S CH G e n/a 30 4140 4170 4208 N
+ S CH G s n/a 30 4140 4170 4207 N
+ S CH HH b n/a 30 4140 4168 4213 N
+ S CH HH e n/a 30 4140 4169 4213 N
+ S CH HH s n/a 30 4140 4169 4213 N
+ S CH IH b n/a 30 4140 4183 4239 N
+ S CH IH e n/a 30 4140 4183 4240 N
+ S CH IH s n/a 30 4140 4183 4240 N
+ S CH IY b n/a 30 4140 4183 4247 N
+ S CH IY e n/a 30 4140 4183 4247 N
+ S CH IY i n/a 30 4140 4183 4247 N
+ S CH IY s n/a 30 4140 4183 4247 N
+ S CH JH b n/a 30 4140 4168 4223 N
+ S CH JH e n/a 30 4140 4169 4218 N
+ S CH JH s n/a 30 4140 4169 4218 N
+ S CH K b n/a 30 4140 4168 4207 N
+ S CH K e n/a 30 4140 4170 4208 N
+ S CH K s n/a 30 4140 4170 4207 N
+ S CH L b n/a 30 4140 4167 4204 N
+ S CH L e n/a 30 4140 4169 4204 N
+ S CH L s n/a 30 4140 4169 4204 N
+ S CH M b n/a 30 4140 4166 4206 N
+ S CH M e n/a 30 4140 4169 4206 N
+ S CH M s n/a 30 4140 4169 4206 N
+ S CH N b n/a 30 4140 4166 4216 N
+ S CH N e n/a 30 4140 4166 4216 N
+ S CH N s n/a 30 4140 4166 4216 N
+ S CH NG e n/a 30 4140 4170 4204 N
+ S CH NG s n/a 30 4140 4170 4204 N
+ S CH OW b n/a 30 4140 4183 4236 N
+ S CH OW e n/a 30 4140 4183 4233 N
+ S CH OW s n/a 30 4140 4183 4236 N
+ S CH OY b n/a 30 4140 4183 4234 N
+ S CH OY e n/a 30 4140 4183 4233 N
+ S CH OY s n/a 30 4140 4183 4234 N
+ S CH P b n/a 30 4140 4166 4224 N
+ S CH P e n/a 30 4140 4169 4225 N
+ S CH P s n/a 30 4140 4169 4224 N
+ S CH R b n/a 30 4140 4167 4205 N
+ S CH R e n/a 30 4140 4170 4205 N
+ S CH R s n/a 30 4140 4170 4205 N
+ S CH S b n/a 30 4140 4168 4215 N
+ S CH S e n/a 30 4140 4167 4215 N
+ S CH S s n/a 30 4140 4168 4215 N
+ S CH SH b n/a 30 4140 4168 4213 N
+ S CH SH e n/a 30 4140 4169 4213 N
+ S CH SH s n/a 30 4140 4169 4213 N
+ S CH SIL e n/a 30 4140 4177 4211 N
+ S CH SIL s n/a 30 4140 4177 4211 N
+ S CH T b n/a 30 4140 4166 4223 N
+ S CH T e n/a 30 4140 4166 4218 N
+ S CH T i n/a 30 4140 4166 4218 N
+ S CH T s n/a 30 4140 4166 4218 N
+ S CH TH b n/a 30 4140 4168 4212 N
+ S CH TH e n/a 30 4140 4167 4212 N
+ S CH TH s n/a 30 4140 4168 4212 N
+ S CH UH b n/a 30 4140 4183 4242 N
+ S CH UH e n/a 30 4140 4183 4242 N
+ S CH UH s n/a 30 4140 4183 4242 N
+ S CH UW b n/a 30 4140 4183 4242 N
+ S CH UW e n/a 30 4140 4183 4242 N
+ S CH UW s n/a 30 4140 4183 4242 N
+ S CH V b n/a 30 4140 4168 4216 N
+ S CH V e n/a 30 4140 4169 4216 N
+ S CH V s n/a 30 4140 4169 4216 N
+ S CH W b n/a 30 4140 4168 4209 N
+ S CH W e n/a 30 4140 4170 4209 N
+ S CH W s n/a 30 4140 4170 4209 N
+ S CH Y b n/a 30 4140 4168 4217 N
+ S CH Y e n/a 30 4140 4169 4217 N
+ S CH Y s n/a 30 4140 4169 4217 N
+ S CH Z e n/a 30 4140 4167 4211 N
+ S CH Z s n/a 30 4140 4168 4211 N
+ S CH ZH e n/a 30 4140 4169 4216 N
+ S CH ZH s n/a 30 4140 4169 4216 N
+ S D AA b n/a 30 4135 4179 4232 N
+ S D AA e n/a 30 4135 4186 4233 N
+ S D AA s n/a 30 4135 4179 4232 N
+ S D AE b n/a 30 4135 4179 4229 N
+ S D AE e n/a 30 4135 4186 4231 N
+ S D AE i n/a 30 4135 4179 4229 N
+ S D AE s n/a 30 4135 4179 4229 N
+ S D AH b n/a 30 4135 4179 4235 N
+ S D AH e n/a 30 4135 4186 4244 N
+ S D AH i n/a 30 4135 4179 4243 N
+ S D AH s n/a 30 4135 4179 4244 N
+ S D AO b n/a 30 4135 4180 4234 N
+ S D AO e n/a 30 4135 4186 4233 N
+ S D AO i n/a 30 4135 4180 4234 N
+ S D AO s n/a 30 4135 4180 4234 N
+ S D AW b n/a 30 4135 4179 4229 N
+ S D AW e n/a 30 4135 4186 4231 N
+ S D AW s n/a 30 4135 4179 4229 N
+ S D AY b n/a 30 4135 4179 4232 N
+ S D AY e n/a 30 4135 4186 4233 N
+ S D AY i n/a 30 4135 4179 4232 N
+ S D AY s n/a 30 4135 4179 4232 N
+ S D B b n/a 30 4135 4166 4224 N
+ S D B e n/a 30 4135 4169 4225 N
+ S D B s n/a 30 4135 4169 4224 N
+ S D CH e n/a 30 4135 4169 4218 N
+ S D CH s n/a 30 4135 4169 4218 N
+ S D D b n/a 30 4135 4166 4223 N
+ S D D e n/a 30 4135 4166 4218 N
+ S D D s n/a 30 4135 4166 4218 N
+ S D DH e n/a 30 4135 4167 4212 N
+ S D DH s n/a 30 4135 4168 4212 N
+ S D EH b n/a 30 4135 4179 4226 N
+ S D EH e n/a 30 4135 4186 4231 N
+ S D EH i n/a 30 4135 4179 4226 N
+ S D EH s n/a 30 4135 4179 4226 N
+ S D ER b n/a 30 4135 4180 4245 N
+ S D ER e n/a 30 4135 4186 4246 N
+ S D ER i n/a 30 4135 4180 4245 N
+ S D ER s n/a 30 4135 4180 4245 N
+ S D EY b n/a 30 4135 4179 4230 N
+ S D EY e n/a 30 4135 4186 4231 N
+ S D EY s n/a 30 4135 4179 4230 N
+ S D F b n/a 30 4135 4168 4214 N
+ S D F e n/a 30 4135 4169 4214 N
+ S D F s n/a 30 4135 4169 4214 N
+ S D G e n/a 30 4135 4170 4208 N
+ S D G s n/a 30 4135 4170 4207 N
+ S D HH b n/a 30 4135 4168 4213 N
+ S D HH e n/a 30 4135 4169 4213 N
+ S D HH s n/a 30 4135 4169 4213 N
+ S D IH b n/a 30 4135 4181 4239 N
+ S D IH e n/a 30 4135 4186 4240 N
+ S D IH i n/a 30 4135 4181 4239 N
+ S D IH s n/a 30 4135 4181 4240 N
+ S D IY b n/a 30 4135 4181 4247 N
+ S D IY e n/a 30 4135 4186 4247 N
+ S D IY i n/a 30 4135 4181 4247 N
+ S D IY s n/a 30 4135 4181 4247 N
+ S D JH b n/a 30 4135 4168 4223 N
+ S D JH e n/a 30 4135 4169 4218 N
+ S D JH s n/a 30 4135 4169 4218 N
+ S D K b n/a 30 4135 4168 4207 N
+ S D K e n/a 30 4135 4170 4208 N
+ S D K i n/a 30 4135 4170 4207 N
+ S D K s n/a 30 4135 4170 4207 N
+ S D L b n/a 30 4135 4167 4204 N
+ S D L e n/a 30 4135 4169 4204 N
+ S D L i n/a 30 4135 4169 4204 N
+ S D L s n/a 30 4135 4169 4204 N
+ S D M b n/a 30 4135 4166 4206 N
+ S D M e n/a 30 4135 4169 4206 N
+ S D M i n/a 30 4135 4169 4206 N
+ S D M s n/a 30 4135 4169 4206 N
+ S D N b n/a 30 4135 4166 4216 N
+ S D N e n/a 30 4135 4166 4216 N
+ S D N i n/a 30 4135 4166 4216 N
+ S D N s n/a 30 4135 4166 4216 N
+ S D NG e n/a 30 4135 4170 4204 N
+ S D NG s n/a 30 4135 4170 4204 N
+ S D OW b n/a 30 4135 4180 4236 N
+ S D OW e n/a 30 4135 4186 4233 N
+ S D OW i n/a 30 4135 4180 4236 N
+ S D OW s n/a 30 4135 4180 4236 N
+ S D OY b n/a 30 4135 4180 4234 N
+ S D OY e n/a 30 4135 4186 4233 N
+ S D OY s n/a 30 4135 4180 4234 N
+ S D P b n/a 30 4135 4166 4224 N
+ S D P e n/a 30 4135 4169 4225 N
+ S D P i n/a 30 4135 4169 4224 N
+ S D P s n/a 30 4135 4169 4224 N
+ S D R b n/a 30 4135 4167 4205 N
+ S D R e n/a 30 4135 4170 4205 N
+ S D R s n/a 30 4135 4170 4205 N
+ S D S b n/a 30 4135 4168 4215 N
+ S D S e n/a 30 4135 4167 4215 N
+ S D S s n/a 30 4135 4168 4215 N
+ S D SH b n/a 30 4135 4168 4213 N
+ S D SH e n/a 30 4135 4169 4213 N
+ S D SH s n/a 30 4135 4169 4213 N
+ S D SIL e n/a 30 4135 4178 4211 N
+ S D SIL s n/a 30 4135 4178 4211 N
+ S D T b n/a 30 4135 4166 4223 N
+ S D T e n/a 30 4135 4166 4218 N
+ S D T i n/a 30 4135 4166 4218 N
+ S D T s n/a 30 4135 4166 4218 N
+ S D TH b n/a 30 4135 4168 4212 N
+ S D TH e n/a 30 4135 4167 4212 N
+ S D TH s n/a 30 4135 4168 4212 N
+ S D UH b n/a 30 4135 4181 4242 N
+ S D UH e n/a 30 4135 4186 4242 N
+ S D UH s n/a 30 4135 4181 4242 N
+ S D UW b n/a 30 4135 4181 4242 N
+ S D UW e n/a 30 4135 4186 4242 N
+ S D UW s n/a 30 4135 4181 4242 N
+ S D V b n/a 30 4135 4168 4216 N
+ S D V e n/a 30 4135 4169 4216 N
+ S D V s n/a 30 4135 4169 4216 N
+ S D W b n/a 30 4135 4168 4209 N
+ S D W e n/a 30 4135 4170 4209 N
+ S D W i n/a 30 4135 4170 4209 N
+ S D W s n/a 30 4135 4170 4209 N
+ S D Y b n/a 30 4135 4168 4217 N
+ S D Y e n/a 30 4135 4169 4217 N
+ S D Y s n/a 30 4135 4169 4217 N
+ S D Z e n/a 30 4135 4167 4211 N
+ S D Z s n/a 30 4135 4168 4211 N
+ S D ZH e n/a 30 4135 4169 4216 N
+ S D ZH s n/a 30 4135 4169 4216 N
+ S DH AA b n/a 30 4135 4179 4232 N
+ S DH AA e n/a 30 4135 4179 4233 N
+ S DH AA s n/a 30 4135 4179 4232 N
+ S DH AE b n/a 30 4135 4179 4229 N
+ S DH AE e n/a 30 4135 4179 4231 N
+ S DH AE s n/a 30 4135 4179 4229 N
+ S DH AH b n/a 30 4135 4179 4235 N
+ S DH AH e n/a 30 4135 4179 4244 N
+ S DH AH i n/a 30 4135 4179 4243 N
+ S DH AH s n/a 30 4135 4179 4244 N
+ S DH AO b n/a 30 4135 4180 4234 N
+ S DH AO e n/a 30 4135 4180 4233 N
+ S DH AO s n/a 30 4135 4180 4234 N
+ S DH AW b n/a 30 4135 4179 4229 N
+ S DH AW e n/a 30 4135 4179 4231 N
+ S DH AW s n/a 30 4135 4179 4229 N
+ S DH AY b n/a 30 4135 4179 4232 N
+ S DH AY e n/a 30 4135 4179 4233 N
+ S DH AY s n/a 30 4135 4179 4232 N
+ S DH B b n/a 30 4135 4166 4224 N
+ S DH B e n/a 30 4135 4169 4225 N
+ S DH B s n/a 30 4135 4169 4224 N
+ S DH CH e n/a 30 4135 4169 4218 N
+ S DH CH s n/a 30 4135 4169 4218 N
+ S DH D b n/a 30 4135 4166 4223 N
+ S DH D e n/a 30 4135 4166 4218 N
+ S DH D s n/a 30 4135 4166 4218 N
+ S DH DH e n/a 30 4135 4167 4212 N
+ S DH DH s n/a 30 4135 4168 4212 N
+ S DH EH b n/a 30 4135 4179 4226 N
+ S DH EH e n/a 30 4135 4179 4231 N
+ S DH EH s n/a 30 4135 4179 4226 N
+ S DH ER b n/a 30 4135 4180 4245 N
+ S DH ER e n/a 30 4135 4180 4246 N
+ S DH ER s n/a 30 4135 4180 4245 N
+ S DH EY b n/a 30 4135 4179 4230 N
+ S DH EY e n/a 30 4135 4179 4231 N
+ S DH EY s n/a 30 4135 4179 4230 N
+ S DH F b n/a 30 4135 4168 4214 N
+ S DH F e n/a 30 4135 4169 4214 N
+ S DH F s n/a 30 4135 4169 4214 N
+ S DH G e n/a 30 4135 4170 4208 N
+ S DH G s n/a 30 4135 4170 4207 N
+ S DH HH b n/a 30 4135 4168 4213 N
+ S DH HH e n/a 30 4135 4169 4213 N
+ S DH HH s n/a 30 4135 4169 4213 N
+ S DH IH b n/a 30 4135 4181 4239 N
+ S DH IH e n/a 30 4135 4181 4240 N
+ S DH IH s n/a 30 4135 4181 4240 N
+ S DH IY b n/a 30 4135 4181 4247 N
+ S DH IY e n/a 30 4135 4181 4247 N
+ S DH IY s n/a 30 4135 4181 4247 N
+ S DH JH b n/a 30 4135 4168 4223 N
+ S DH JH e n/a 30 4135 4169 4218 N
+ S DH JH s n/a 30 4135 4169 4218 N
+ S DH K b n/a 30 4135 4168 4207 N
+ S DH K e n/a 30 4135 4170 4208 N
+ S DH K s n/a 30 4135 4170 4207 N
+ S DH L b n/a 30 4135 4167 4204 N
+ S DH L e n/a 30 4135 4169 4204 N
+ S DH L s n/a 30 4135 4169 4204 N
+ S DH M b n/a 30 4135 4166 4206 N
+ S DH M e n/a 30 4135 4169 4206 N
+ S DH M i n/a 30 4135 4169 4206 N
+ S DH M s n/a 30 4135 4169 4206 N
+ S DH N b n/a 30 4135 4166 4216 N
+ S DH N e n/a 30 4135 4166 4216 N
+ S DH N s n/a 30 4135 4166 4216 N
+ S DH NG e n/a 30 4135 4170 4204 N
+ S DH NG s n/a 30 4135 4170 4204 N
+ S DH OW b n/a 30 4135 4180 4236 N
+ S DH OW e n/a 30 4135 4180 4233 N
+ S DH OW s n/a 30 4135 4180 4236 N
+ S DH OY b n/a 30 4135 4180 4234 N
+ S DH OY e n/a 30 4135 4180 4233 N
+ S DH OY s n/a 30 4135 4180 4234 N
+ S DH P b n/a 30 4135 4166 4224 N
+ S DH P e n/a 30 4135 4169 4225 N
+ S DH P s n/a 30 4135 4169 4224 N
+ S DH R b n/a 30 4135 4167 4205 N
+ S DH R e n/a 30 4135 4170 4205 N
+ S DH R s n/a 30 4135 4170 4205 N
+ S DH S b n/a 30 4135 4168 4215 N
+ S DH S e n/a 30 4135 4167 4215 N
+ S DH S s n/a 30 4135 4168 4215 N
+ S DH SH b n/a 30 4135 4168 4213 N
+ S DH SH e n/a 30 4135 4169 4213 N
+ S DH SH s n/a 30 4135 4169 4213 N
+ S DH SIL e n/a 30 4135 4178 4211 N
+ S DH SIL s n/a 30 4135 4178 4211 N
+ S DH T b n/a 30 4135 4166 4223 N
+ S DH T e n/a 30 4135 4166 4218 N
+ S DH T s n/a 30 4135 4166 4218 N
+ S DH TH b n/a 30 4135 4168 4212 N
+ S DH TH e n/a 30 4135 4167 4212 N
+ S DH TH s n/a 30 4135 4168 4212 N
+ S DH UH b n/a 30 4135 4181 4242 N
+ S DH UH e n/a 30 4135 4181 4242 N
+ S DH UH s n/a 30 4135 4181 4242 N
+ S DH UW b n/a 30 4135 4181 4242 N
+ S DH UW e n/a 30 4135 4181 4242 N
+ S DH UW s n/a 30 4135 4181 4242 N
+ S DH V b n/a 30 4135 4168 4216 N
+ S DH V e n/a 30 4135 4169 4216 N
+ S DH V s n/a 30 4135 4169 4216 N
+ S DH W b n/a 30 4135 4168 4209 N
+ S DH W e n/a 30 4135 4170 4209 N
+ S DH W s n/a 30 4135 4170 4209 N
+ S DH Y b n/a 30 4135 4168 4217 N
+ S DH Y e n/a 30 4135 4169 4217 N
+ S DH Y s n/a 30 4135 4169 4217 N
+ S DH Z e n/a 30 4135 4167 4211 N
+ S DH Z s n/a 30 4135 4168 4211 N
+ S DH ZH e n/a 30 4135 4169 4216 N
+ S DH ZH s n/a 30 4135 4169 4216 N
+ S EH AA b n/a 30 4111 4188 4232 N
+ S EH AA e n/a 30 4111 4198 4233 N
+ S EH AA i n/a 30 4111 4198 4232 N
+ S EH AA s n/a 30 4111 4198 4232 N
+ S EH AE b n/a 30 4111 4188 4229 N
+ S EH AE e n/a 30 4111 4198 4231 N
+ S EH AE i n/a 30 4111 4198 4229 N
+ S EH AE s n/a 30 4111 4198 4229 N
+ S EH AH b n/a 30 4111 4188 4235 N
+ S EH AH e n/a 30 4111 4198 4244 N
+ S EH AH i n/a 30 4111 4198 4243 N
+ S EH AH s n/a 30 4111 4198 4244 N
+ S EH AO b n/a 30 4111 4188 4234 N
+ S EH AO e n/a 30 4111 4198 4233 N
+ S EH AO i n/a 30 4111 4198 4234 N
+ S EH AO s n/a 30 4111 4198 4234 N
+ S EH AW b n/a 30 4111 4188 4229 N
+ S EH AW e n/a 30 4111 4198 4231 N
+ S EH AW i n/a 30 4111 4198 4229 N
+ S EH AW s n/a 30 4111 4198 4229 N
+ S EH AY b n/a 30 4111 4188 4232 N
+ S EH AY e n/a 30 4111 4198 4233 N
+ S EH AY i n/a 30 4111 4198 4232 N
+ S EH AY s n/a 30 4111 4198 4232 N
+ S EH B b n/a 30 4111 4156 4224 N
+ S EH B e n/a 30 4111 4151 4225 N
+ S EH B i n/a 30 4111 4151 4224 N
+ S EH B s n/a 30 4111 4151 4224 N
+ S EH CH e n/a 30 4111 4151 4218 N
+ S EH CH i n/a 30 4111 4152 4218 N
+ S EH CH s n/a 30 4111 4151 4218 N
+ S EH D b n/a 30 4111 4156 4223 N
+ S EH D e n/a 30 4111 4151 4218 N
+ S EH D i n/a 30 4111 4151 4218 N
+ S EH D s n/a 30 4111 4151 4218 N
+ S EH DH e n/a 30 4111 4151 4212 N
+ S EH DH i n/a 30 4111 4151 4212 N
+ S EH DH s n/a 30 4111 4151 4212 N
+ S EH EH b n/a 30 4111 4188 4226 N
+ S EH EH e n/a 30 4111 4198 4231 N
+ S EH EH i n/a 30 4111 4198 4226 N
+ S EH EH s n/a 30 4111 4198 4226 N
+ S EH ER b n/a 30 4111 4188 4245 N
+ S EH ER e n/a 30 4111 4198 4246 N
+ S EH ER i n/a 30 4111 4198 4245 N
+ S EH ER s n/a 30 4111 4198 4245 N
+ S EH EY b n/a 30 4111 4188 4230 N
+ S EH EY e n/a 30 4111 4198 4231 N
+ S EH EY i n/a 30 4111 4198 4230 N
+ S EH EY s n/a 30 4111 4198 4230 N
+ S EH F b n/a 30 4111 4155 4214 N
+ S EH F e n/a 30 4111 4151 4214 N
+ S EH F i n/a 30 4111 4151 4214 N
+ S EH F s n/a 30 4111 4151 4214 N
+ S EH G e n/a 30 4111 4151 4208 N
+ S EH G i n/a 30 4111 4151 4207 N
+ S EH G s n/a 30 4111 4151 4207 N
+ S EH HH b n/a 30 4111 4155 4213 N
+ S EH HH e n/a 30 4111 4151 4213 N
+ S EH HH i n/a 30 4111 4151 4213 N
+ S EH HH s n/a 30 4111 4151 4213 N
+ S EH IH b n/a 30 4111 4187 4239 N
+ S EH IH e n/a 30 4111 4198 4240 N
+ S EH IH i n/a 30 4111 4198 4239 N
+ S EH IH s n/a 30 4111 4198 4240 N
+ S EH IY b n/a 30 4111 4187 4247 N
+ S EH IY e n/a 30 4111 4198 4247 N
+ S EH IY i n/a 30 4111 4198 4247 N
+ S EH IY s n/a 30 4111 4198 4247 N
+ S EH JH b n/a 30 4111 4155 4223 N
+ S EH JH e n/a 30 4111 4151 4218 N
+ S EH JH s n/a 30 4111 4151 4218 N
+ S EH K b n/a 30 4111 4155 4207 N
+ S EH K e n/a 30 4111 4151 4208 N
+ S EH K i n/a 30 4111 4151 4207 N
+ S EH K s n/a 30 4111 4151 4207 N
+ S EH L b n/a 30 4111 4154 4204 N
+ S EH L e n/a 30 4111 4151 4204 N
+ S EH L i n/a 30 4111 4151 4204 N
+ S EH L s n/a 30 4111 4151 4204 N
+ S EH M b n/a 30 4111 4156 4206 N
+ S EH M e n/a 30 4111 4151 4206 N
+ S EH M i n/a 30 4111 4151 4206 N
+ S EH M s n/a 30 4111 4151 4206 N
+ S EH N b n/a 30 4111 4156 4216 N
+ S EH N e n/a 30 4111 4151 4216 N
+ S EH N i n/a 30 4111 4151 4216 N
+ S EH N s n/a 30 4111 4151 4216 N
+ S EH NG e n/a 30 4111 4151 4204 N
+ S EH NG s n/a 30 4111 4151 4204 N
+ S EH OW b n/a 30 4111 4188 4236 N
+ S EH OW e n/a 30 4111 4198 4233 N
+ S EH OW i n/a 30 4111 4198 4236 N
+ S EH OW s n/a 30 4111 4198 4236 N
+ S EH OY b n/a 30 4111 4188 4234 N
+ S EH OY e n/a 30 4111 4198 4233 N
+ S EH OY s n/a 30 4111 4198 4234 N
+ S EH P b n/a 30 4111 4156 4224 N
+ S EH P e n/a 30 4111 4151 4225 N
+ S EH P i n/a 30 4111 4151 4224 N
+ S EH P s n/a 30 4111 4151 4224 N
+ S EH R b n/a 30 4111 4153 4205 N
+ S EH R e n/a 30 4111 4151 4205 N
+ S EH R i n/a 30 4111 4151 4205 N
+ S EH R s n/a 30 4111 4151 4205 N
+ S EH S b n/a 30 4111 4155 4215 N
+ S EH S e n/a 30 4111 4151 4215 N
+ S EH S i n/a 30 4111 4151 4215 N
+ S EH S s n/a 30 4111 4151 4215 N
+ S EH SH b n/a 30 4111 4155 4213 N
+ S EH SH e n/a 30 4111 4151 4213 N
+ S EH SH s n/a 30 4111 4151 4213 N
+ S EH SIL e n/a 30 4113 4176 4211 N
+ S EH SIL s n/a 30 4113 4176 4211 N
+ S EH T b n/a 30 4111 4156 4223 N
+ S EH T e n/a 30 4111 4151 4218 N
+ S EH T i n/a 30 4111 4151 4218 N
+ S EH T s n/a 30 4111 4151 4218 N
+ S EH TH b n/a 30 4111 4154 4212 N
+ S EH TH e n/a 30 4111 4151 4212 N
+ S EH TH i n/a 30 4111 4151 4212 N
+ S EH TH s n/a 30 4111 4151 4212 N
+ S EH UH b n/a 30 4111 4187 4242 N
+ S EH UH e n/a 30 4111 4198 4242 N
+ S EH UH s n/a 30 4111 4198 4242 N
+ S EH UW b n/a 30 4111 4187 4242 N
+ S EH UW e n/a 30 4111 4198 4242 N
+ S EH UW i n/a 30 4111 4198 4242 N
+ S EH UW s n/a 30 4111 4198 4242 N
+ S EH V b n/a 30 4111 4155 4216 N
+ S EH V e n/a 30 4111 4151 4216 N
+ S EH V i n/a 30 4111 4151 4216 N
+ S EH V s n/a 30 4111 4151 4216 N
+ S EH W b n/a 30 4111 4155 4209 N
+ S EH W e n/a 30 4111 4151 4209 N
+ S EH W i n/a 30 4111 4151 4209 N
+ S EH W s n/a 30 4111 4151 4209 N
+ S EH Y b n/a 30 4111 4155 4217 N
+ S EH Y e n/a 30 4111 4151 4217 N
+ S EH Y i n/a 30 4111 4152 4217 N
+ S EH Y s n/a 30 4111 4151 4217 N
+ S EH Z e n/a 30 4111 4151 4211 N
+ S EH Z s n/a 30 4111 4151 4211 N
+ S EH ZH e n/a 30 4111 4151 4216 N
+ S EH ZH i n/a 30 4111 4152 4216 N
+ S EH ZH s n/a 30 4111 4151 4216 N
+ S ER AA b n/a 30 4131 4203 4232 N
+ S ER AA e n/a 30 4132 4203 4233 N
+ S ER AA i n/a 30 4131 4203 4232 N
+ S ER AA s n/a 30 4131 4203 4232 N
+ S ER AE b n/a 30 4131 4203 4229 N
+ S ER AE e n/a 30 4132 4203 4231 N
+ S ER AE i n/a 30 4131 4203 4229 N
+ S ER AE s n/a 30 4131 4203 4229 N
+ S ER AH b n/a 30 4131 4203 4235 N
+ S ER AH e n/a 30 4132 4202 4244 N
+ S ER AH i n/a 30 4131 4202 4243 N
+ S ER AH s n/a 30 4131 4202 4244 N
+ S ER AO b n/a 30 4131 4203 4234 N
+ S ER AO e n/a 30 4132 4203 4233 N
+ S ER AO i n/a 30 4131 4203 4234 N
+ S ER AO s n/a 30 4131 4203 4234 N
+ S ER AW b n/a 30 4131 4203 4229 N
+ S ER AW e n/a 30 4132 4203 4231 N
+ S ER AW s n/a 30 4131 4203 4229 N
+ S ER AY b n/a 30 4131 4203 4232 N
+ S ER AY e n/a 30 4132 4203 4233 N
+ S ER AY i n/a 30 4131 4203 4232 N
+ S ER AY s n/a 30 4131 4203 4232 N
+ S ER B b n/a 30 4131 4165 4224 N
+ S ER B e n/a 30 4132 4165 4225 N
+ S ER B i n/a 30 4131 4165 4224 N
+ S ER B s n/a 30 4131 4165 4224 N
+ S ER CH e n/a 30 4132 4165 4220 N
+ S ER CH s n/a 30 4131 4165 4220 N
+ S ER D b n/a 30 4132 4165 4223 N
+ S ER D e n/a 30 4132 4165 4220 N
+ S ER D i n/a 30 4132 4164 4220 N
+ S ER D s n/a 30 4132 4165 4220 N
+ S ER DH e n/a 30 4132 4165 4212 N
+ S ER DH s n/a 30 4131 4165 4212 N
+ S ER EH b n/a 30 4131 4203 4226 N
+ S ER EH e n/a 30 4132 4203 4231 N
+ S ER EH i n/a 30 4131 4203 4229 N
+ S ER EH s n/a 30 4131 4203 4226 N
+ S ER ER b n/a 30 4131 4203 4245 N
+ S ER ER e n/a 30 4132 4202 4246 N
+ S ER ER i n/a 30 4131 4202 4245 N
+ S ER ER s n/a 30 4131 4202 4245 N
+ S ER EY b n/a 30 4131 4203 4230 N
+ S ER EY e n/a 30 4132 4203 4231 N
+ S ER EY i n/a 30 4131 4203 4230 N
+ S ER EY s n/a 30 4131 4203 4230 N
+ S ER F b n/a 30 4131 4165 4214 N
+ S ER F e n/a 30 4132 4165 4214 N
+ S ER F i n/a 30 4131 4165 4214 N
+ S ER F s n/a 30 4131 4165 4214 N
+ S ER G e n/a 30 4132 4165 4208 N
+ S ER G s n/a 30 4131 4165 4207 N
+ S ER HH b n/a 30 4131 4165 4213 N
+ S ER HH e n/a 30 4132 4165 4213 N
+ S ER HH i n/a 30 4131 4165 4213 N
+ S ER HH s n/a 30 4131 4165 4213 N
+ S ER IH b n/a 30 4131 4203 4239 N
+ S ER IH e n/a 30 4132 4202 4240 N
+ S ER IH i n/a 30 4131 4202 4240 N
+ S ER IH s n/a 30 4131 4202 4240 N
+ S ER IY b n/a 30 4131 4203 4247 N
+ S ER IY e n/a 30 4132 4203 4247 N
+ S ER IY i n/a 30 4131 4203 4247 N
+ S ER IY s n/a 30 4131 4203 4247 N
+ S ER JH b n/a 30 4131 4165 4223 N
+ S ER JH e n/a 30 4132 4165 4220 N
+ S ER JH s n/a 30 4131 4165 4220 N
+ S ER K b n/a 30 4131 4165 4207 N
+ S ER K e n/a 30 4132 4165 4208 N
+ S ER K i n/a 30 4131 4165 4207 N
+ S ER K s n/a 30 4131 4165 4207 N
+ S ER L b n/a 30 4131 4165 4204 N
+ S ER L e n/a 30 4132 4165 4204 N
+ S ER L i n/a 30 4131 4165 4204 N
+ S ER L s n/a 30 4131 4165 4204 N
+ S ER M b n/a 30 4131 4165 4206 N
+ S ER M e n/a 30 4132 4165 4206 N
+ S ER M i n/a 30 4131 4165 4206 N
+ S ER M s n/a 30 4131 4165 4206 N
+ S ER N b n/a 30 4132 4165 4216 N
+ S ER N e n/a 30 4132 4165 4216 N
+ S ER N i n/a 30 4132 4164 4216 N
+ S ER N s n/a 30 4132 4165 4216 N
+ S ER NG e n/a 30 4132 4165 4204 N
+ S ER NG s n/a 30 4131 4165 4204 N
+ S ER OW b n/a 30 4131 4203 4236 N
+ S ER OW e n/a 30 4132 4203 4233 N
+ S ER OW i n/a 30 4131 4203 4236 N
+ S ER OW s n/a 30 4131 4203 4236 N
+ S ER OY b n/a 30 4131 4203 4234 N
+ S ER OY e n/a 30 4132 4203 4233 N
+ S ER OY s n/a 30 4131 4203 4234 N
+ S ER P b n/a 30 4131 4165 4224 N
+ S ER P e n/a 30 4132 4165 4225 N
+ S ER P i n/a 30 4131 4165 4224 N
+ S ER P s n/a 30 4131 4165 4224 N
+ S ER R b n/a 30 4131 4165 4205 N
+ S ER R e n/a 30 4132 4165 4205 N
+ S ER R i n/a 30 4131 4165 4205 N
+ S ER R s n/a 30 4131 4165 4205 N
+ S ER S b n/a 30 4132 4165 4215 N
+ S ER S e n/a 30 4132 4165 4215 N
+ S ER S s n/a 30 4132 4165 4215 N
+ S ER SH b n/a 30 4131 4165 4213 N
+ S ER SH e n/a 30 4132 4165 4213 N
+ S ER SH s n/a 30 4131 4165 4213 N
+ S ER SIL e n/a 30 4132 4177 4211 N
+ S ER SIL s n/a 30 4131 4177 4211 N
+ S ER T b n/a 30 4132 4165 4223 N
+ S ER T e n/a 30 4132 4165 4220 N
+ S ER T i n/a 30 4132 4164 4220 N
+ S ER T s n/a 30 4132 4165 4220 N
+ S ER TH b n/a 30 4131 4165 4212 N
+ S ER TH e n/a 30 4132 4165 4212 N
+ S ER TH s n/a 30 4131 4165 4212 N
+ S ER UH b n/a 30 4131 4203 4242 N
+ S ER UH e n/a 30 4132 4203 4242 N
+ S ER UH s n/a 30 4131 4203 4242 N
+ S ER UW b n/a 30 4131 4203 4242 N
+ S ER UW e n/a 30 4132 4203 4242 N
+ S ER UW i n/a 30 4131 4203 4242 N
+ S ER UW s n/a 30 4131 4203 4242 N
+ S ER V b n/a 30 4131 4165 4216 N
+ S ER V e n/a 30 4132 4165 4216 N
+ S ER V s n/a 30 4131 4165 4216 N
+ S ER W b n/a 30 4131 4165 4209 N
+ S ER W e n/a 30 4132 4165 4209 N
+ S ER W i n/a 30 4131 4165 4209 N
+ S ER W s n/a 30 4131 4165 4209 N
+ S ER Y b n/a 30 4131 4165 4217 N
+ S ER Y e n/a 30 4132 4165 4217 N
+ S ER Y s n/a 30 4131 4165 4217 N
+ S ER Z e n/a 30 4132 4165 4211 N
+ S ER Z s n/a 30 4132 4165 4211 N
+ S ER ZH e n/a 30 4132 4165 4216 N
+ S ER ZH s n/a 30 4131 4165 4216 N
+ S EY AA b n/a 30 4127 4192 4232 N
+ S EY AA e n/a 30 4127 4192 4233 N
+ S EY AA i n/a 30 4127 4192 4232 N
+ S EY AA s n/a 30 4127 4192 4232 N
+ S EY AE b n/a 30 4127 4192 4229 N
+ S EY AE e n/a 30 4127 4192 4231 N
+ S EY AE i n/a 30 4127 4192 4229 N
+ S EY AE s n/a 30 4127 4192 4229 N
+ S EY AH b n/a 30 4127 4192 4235 N
+ S EY AH e n/a 30 4127 4192 4244 N
+ S EY AH i n/a 30 4127 4192 4241 N
+ S EY AH s n/a 30 4127 4192 4244 N
+ S EY AO b n/a 30 4127 4192 4234 N
+ S EY AO e n/a 30 4127 4192 4233 N
+ S EY AO i n/a 30 4127 4192 4234 N
+ S EY AO s n/a 30 4127 4192 4234 N
+ S EY AW b n/a 30 4127 4192 4229 N
+ S EY AW e n/a 30 4127 4192 4231 N
+ S EY AW s n/a 30 4127 4192 4229 N
+ S EY AY b n/a 30 4127 4192 4232 N
+ S EY AY e n/a 30 4127 4192 4233 N
+ S EY AY i n/a 30 4127 4192 4232 N
+ S EY AY s n/a 30 4127 4192 4232 N
+ S EY B b n/a 30 4127 4162 4224 N
+ S EY B e n/a 30 4127 4162 4225 N
+ S EY B i n/a 30 4127 4162 4224 N
+ S EY B s n/a 30 4127 4162 4224 N
+ S EY CH e n/a 30 4127 4162 4222 N
+ S EY CH s n/a 30 4127 4162 4222 N
+ S EY D b n/a 30 4127 4161 4223 N
+ S EY D e n/a 30 4127 4161 4222 N
+ S EY D i n/a 30 4127 4161 4222 N
+ S EY D s n/a 30 4127 4161 4222 N
+ S EY DH e n/a 30 4127 4162 4212 N
+ S EY DH s n/a 30 4127 4162 4212 N
+ S EY EH b n/a 30 4127 4192 4227 N
+ S EY EH e n/a 30 4127 4192 4231 N
+ S EY EH i n/a 30 4127 4192 4227 N
+ S EY EH s n/a 30 4127 4192 4227 N
+ S EY ER b n/a 30 4127 4192 4245 N
+ S EY ER e n/a 30 4127 4192 4246 N
+ S EY ER i n/a 30 4127 4192 4245 N
+ S EY ER s n/a 30 4127 4192 4245 N
+ S EY EY b n/a 30 4127 4192 4230 N
+ S EY EY e n/a 30 4127 4192 4231 N
+ S EY EY i n/a 30 4127 4192 4230 N
+ S EY EY s n/a 30 4127 4192 4230 N
+ S EY F b n/a 30 4127 4162 4214 N
+ S EY F e n/a 30 4127 4162 4214 N
+ S EY F i n/a 30 4127 4162 4214 N
+ S EY F s n/a 30 4127 4162 4214 N
+ S EY G e n/a 30 4127 4162 4208 N
+ S EY G s n/a 30 4127 4162 4207 N
+ S EY HH b n/a 30 4127 4162 4213 N
+ S EY HH e n/a 30 4127 4162 4213 N
+ S EY HH i n/a 30 4127 4162 4213 N
+ S EY HH s n/a 30 4127 4162 4213 N
+ S EY IH b n/a 30 4127 4192 4239 N
+ S EY IH e n/a 30 4127 4192 4241 N
+ S EY IH i n/a 30 4127 4192 4241 N
+ S EY IH s n/a 30 4127 4192 4241 N
+ S EY IY b n/a 30 4127 4192 4247 N
+ S EY IY e n/a 30 4127 4192 4247 N
+ S EY IY i n/a 30 4127 4192 4247 N
+ S EY IY s n/a 30 4127 4192 4247 N
+ S EY JH b n/a 30 4127 4162 4223 N
+ S EY JH e n/a 30 4127 4162 4222 N
+ S EY JH s n/a 30 4127 4162 4222 N
+ S EY K b n/a 30 4127 4162 4207 N
+ S EY K e n/a 30 4127 4162 4208 N
+ S EY K i n/a 30 4127 4162 4207 N
+ S EY K s n/a 30 4127 4162 4207 N
+ S EY L b n/a 30 4127 4162 4204 N
+ S EY L e n/a 30 4127 4162 4204 N
+ S EY L i n/a 30 4127 4162 4204 N
+ S EY L s n/a 30 4127 4162 4204 N
+ S EY M b n/a 30 4127 4162 4206 N
+ S EY M e n/a 30 4127 4162 4206 N
+ S EY M i n/a 30 4127 4162 4206 N
+ S EY M s n/a 30 4127 4162 4206 N
+ S EY N b n/a 30 4127 4161 4216 N
+ S EY N e n/a 30 4127 4161 4216 N
+ S EY N i n/a 30 4127 4161 4216 N
+ S EY N s n/a 30 4127 4161 4216 N
+ S EY NG e n/a 30 4127 4162 4204 N
+ S EY NG s n/a 30 4127 4162 4204 N
+ S EY OW b n/a 30 4127 4192 4236 N
+ S EY OW e n/a 30 4127 4192 4233 N
+ S EY OW i n/a 30 4127 4192 4236 N
+ S EY OW s n/a 30 4127 4192 4236 N
+ S EY OY b n/a 30 4127 4192 4234 N
+ S EY OY e n/a 30 4127 4192 4233 N
+ S EY OY s n/a 30 4127 4192 4234 N
+ S EY P b n/a 30 4127 4162 4224 N
+ S EY P e n/a 30 4127 4162 4225 N
+ S EY P i n/a 30 4127 4162 4224 N
+ S EY P s n/a 30 4127 4162 4224 N
+ S EY R b n/a 30 4127 4162 4205 N
+ S EY R e n/a 30 4127 4162 4205 N
+ S EY R s n/a 30 4127 4162 4205 N
+ S EY S b n/a 30 4127 4162 4215 N
+ S EY S e n/a 30 4127 4162 4215 N
+ S EY S s n/a 30 4127 4162 4215 N
+ S EY SH b n/a 30 4127 4162 4213 N
+ S EY SH e n/a 30 4127 4162 4213 N
+ S EY SH i n/a 30 4127 4162 4213 N
+ S EY SH s n/a 30 4127 4162 4213 N
+ S EY SIL e n/a 30 4128 4174 4210 N
+ S EY SIL s n/a 30 4128 4174 4210 N
+ S EY T b n/a 30 4127 4161 4223 N
+ S EY T e n/a 30 4127 4161 4222 N
+ S EY T i n/a 30 4127 4161 4222 N
+ S EY T s n/a 30 4127 4161 4222 N
+ S EY TH b n/a 30 4127 4162 4212 N
+ S EY TH e n/a 30 4127 4162 4212 N
+ S EY TH s n/a 30 4127 4162 4212 N
+ S EY UH b n/a 30 4127 4192 4242 N
+ S EY UH e n/a 30 4127 4192 4242 N
+ S EY UH s n/a 30 4127 4192 4242 N
+ S EY UW b n/a 30 4127 4192 4242 N
+ S EY UW e n/a 30 4127 4192 4242 N
+ S EY UW i n/a 30 4127 4192 4242 N
+ S EY UW s n/a 30 4127 4192 4242 N
+ S EY V b n/a 30 4127 4162 4216 N
+ S EY V e n/a 30 4127 4162 4216 N
+ S EY V i n/a 30 4127 4162 4216 N
+ S EY V s n/a 30 4127 4162 4216 N
+ S EY W b n/a 30 4127 4162 4209 N
+ S EY W e n/a 30 4127 4162 4209 N
+ S EY W i n/a 30 4127 4162 4209 N
+ S EY W s n/a 30 4127 4162 4209 N
+ S EY Y b n/a 30 4127 4162 4217 N
+ S EY Y e n/a 30 4127 4162 4217 N
+ S EY Y i n/a 30 4127 4162 4217 N
+ S EY Y s n/a 30 4127 4162 4217 N
+ S EY Z e n/a 30 4127 4162 4210 N
+ S EY Z s n/a 30 4127 4162 4210 N
+ S EY ZH e n/a 30 4127 4162 4216 N
+ S EY ZH s n/a 30 4127 4162 4216 N
+ S F AA b n/a 30 4138 4183 4232 N
+ S F AA e n/a 30 4138 4183 4233 N
+ S F AA i n/a 30 4138 4183 4232 N
+ S F AA s n/a 30 4138 4183 4232 N
+ S F AE b n/a 30 4138 4183 4229 N
+ S F AE e n/a 30 4138 4183 4231 N
+ S F AE s n/a 30 4138 4183 4229 N
+ S F AH b n/a 30 4138 4183 4235 N
+ S F AH e n/a 30 4138 4183 4244 N
+ S F AH i n/a 30 4138 4183 4243 N
+ S F AH s n/a 30 4138 4183 4244 N
+ S F AO b n/a 30 4138 4183 4234 N
+ S F AO e n/a 30 4138 4183 4233 N
+ S F AO s n/a 30 4138 4183 4234 N
+ S F AW b n/a 30 4138 4183 4229 N
+ S F AW e n/a 30 4138 4183 4231 N
+ S F AW s n/a 30 4138 4183 4229 N
+ S F AY b n/a 30 4138 4183 4232 N
+ S F AY e n/a 30 4138 4183 4233 N
+ S F AY i n/a 30 4138 4183 4232 N
+ S F AY s n/a 30 4138 4183 4232 N
+ S F B b n/a 30 4138 4166 4224 N
+ S F B e n/a 30 4138 4169 4225 N
+ S F B i n/a 30 4138 4169 4224 N
+ S F B s n/a 30 4138 4169 4224 N
+ S F CH e n/a 30 4138 4169 4218 N
+ S F CH s n/a 30 4138 4169 4218 N
+ S F D b n/a 30 4138 4166 4223 N
+ S F D e n/a 30 4138 4166 4218 N
+ S F D s n/a 30 4138 4166 4218 N
+ S F DH e n/a 30 4138 4167 4212 N
+ S F DH s n/a 30 4138 4168 4212 N
+ S F EH b n/a 30 4138 4183 4226 N
+ S F EH e n/a 30 4138 4183 4231 N
+ S F EH i n/a 30 4138 4183 4226 N
+ S F EH s n/a 30 4138 4183 4226 N
+ S F ER b n/a 30 4138 4183 4245 N
+ S F ER e n/a 30 4138 4183 4246 N
+ S F ER s n/a 30 4138 4183 4245 N
+ S F EY b n/a 30 4138 4183 4230 N
+ S F EY e n/a 30 4138 4183 4231 N
+ S F EY i n/a 30 4138 4183 4230 N
+ S F EY s n/a 30 4138 4183 4230 N
+ S F F b n/a 30 4138 4168 4214 N
+ S F F e n/a 30 4138 4169 4214 N
+ S F F s n/a 30 4138 4169 4214 N
+ S F G e n/a 30 4138 4170 4208 N
+ S F G s n/a 30 4138 4170 4207 N
+ S F HH b n/a 30 4138 4168 4213 N
+ S F HH e n/a 30 4138 4169 4213 N
+ S F HH s n/a 30 4138 4169 4213 N
+ S F IH b n/a 30 4138 4183 4239 N
+ S F IH e n/a 30 4138 4183 4240 N
+ S F IH i n/a 30 4138 4183 4239 N
+ S F IH s n/a 30 4138 4183 4240 N
+ S F IY b n/a 30 4138 4183 4247 N
+ S F IY e n/a 30 4138 4183 4247 N
+ S F IY i n/a 30 4138 4183 4247 N
+ S F IY s n/a 30 4138 4183 4247 N
+ S F JH b n/a 30 4138 4168 4223 N
+ S F JH e n/a 30 4138 4169 4218 N
+ S F JH s n/a 30 4138 4169 4218 N
+ S F K b n/a 30 4138 4168 4207 N
+ S F K e n/a 30 4138 4170 4208 N
+ S F K i n/a 30 4138 4170 4207 N
+ S F K s n/a 30 4138 4170 4207 N
+ S F L b n/a 30 4138 4167 4204 N
+ S F L e n/a 30 4138 4169 4204 N
+ S F L s n/a 30 4138 4169 4204 N
+ S F M b n/a 30 4138 4166 4206 N
+ S F M e n/a 30 4138 4169 4206 N
+ S F M i n/a 30 4138 4169 4206 N
+ S F M s n/a 30 4138 4169 4206 N
+ S F N b n/a 30 4138 4166 4216 N
+ S F N e n/a 30 4138 4166 4216 N
+ S F N i n/a 30 4138 4166 4216 N
+ S F N s n/a 30 4138 4166 4216 N
+ S F NG e n/a 30 4138 4170 4204 N
+ S F NG s n/a 30 4138 4170 4204 N
+ S F OW b n/a 30 4138 4183 4236 N
+ S F OW e n/a 30 4138 4183 4233 N
+ S F OW i n/a 30 4138 4183 4236 N
+ S F OW s n/a 30 4138 4183 4236 N
+ S F OY b n/a 30 4138 4183 4234 N
+ S F OY e n/a 30 4138 4183 4233 N
+ S F OY s n/a 30 4138 4183 4234 N
+ S F P b n/a 30 4138 4166 4224 N
+ S F P e n/a 30 4138 4169 4225 N
+ S F P i n/a 30 4138 4169 4224 N
+ S F P s n/a 30 4138 4169 4224 N
+ S F R b n/a 30 4138 4167 4205 N
+ S F R e n/a 30 4138 4170 4205 N
+ S F R s n/a 30 4138 4170 4205 N
+ S F S b n/a 30 4138 4168 4215 N
+ S F S e n/a 30 4138 4167 4215 N
+ S F S s n/a 30 4138 4168 4215 N
+ S F SH b n/a 30 4138 4168 4213 N
+ S F SH e n/a 30 4138 4169 4213 N
+ S F SH s n/a 30 4138 4169 4213 N
+ S F SIL e n/a 30 4138 4177 4211 N
+ S F SIL s n/a 30 4138 4177 4211 N
+ S F T b n/a 30 4138 4166 4223 N
+ S F T e n/a 30 4138 4166 4218 N
+ S F T i n/a 30 4138 4166 4218 N
+ S F T s n/a 30 4138 4166 4218 N
+ S F TH b n/a 30 4138 4168 4212 N
+ S F TH e n/a 30 4138 4167 4212 N
+ S F TH s n/a 30 4138 4168 4212 N
+ S F UH b n/a 30 4138 4183 4242 N
+ S F UH e n/a 30 4138 4183 4242 N
+ S F UH s n/a 30 4138 4183 4242 N
+ S F UW b n/a 30 4138 4183 4242 N
+ S F UW e n/a 30 4138 4183 4242 N
+ S F UW s n/a 30 4138 4183 4242 N
+ S F V b n/a 30 4138 4168 4216 N
+ S F V e n/a 30 4138 4169 4216 N
+ S F V s n/a 30 4138 4169 4216 N
+ S F W b n/a 30 4138 4168 4209 N
+ S F W e n/a 30 4138 4170 4209 N
+ S F W i n/a 30 4138 4170 4209 N
+ S F W s n/a 30 4138 4170 4209 N
+ S F Y b n/a 30 4138 4168 4217 N
+ S F Y e n/a 30 4138 4169 4217 N
+ S F Y s n/a 30 4138 4169 4217 N
+ S F Z e n/a 30 4138 4167 4211 N
+ S F Z s n/a 30 4138 4168 4211 N
+ S F ZH e n/a 30 4138 4169 4216 N
+ S F ZH s n/a 30 4138 4169 4216 N
+ S G AA b n/a 30 4143 4182 4232 N
+ S G AA s n/a 30 4143 4182 4232 N
+ S G AE b n/a 30 4143 4182 4229 N
+ S G AE s n/a 30 4143 4182 4229 N
+ S G AH b n/a 30 4143 4182 4235 N
+ S G AH i n/a 30 4143 4182 4243 N
+ S G AH s n/a 30 4143 4182 4244 N
+ S G AO b n/a 30 4143 4182 4234 N
+ S G AO i n/a 30 4143 4182 4234 N
+ S G AO s n/a 30 4143 4182 4234 N
+ S G AW b n/a 30 4143 4182 4229 N
+ S G AW s n/a 30 4143 4182 4229 N
+ S G AY b n/a 30 4143 4182 4232 N
+ S G AY s n/a 30 4143 4182 4232 N
+ S G B b n/a 30 4144 4173 4224 N
+ S G B s n/a 30 4144 4173 4224 N
+ S G CH s n/a 30 4144 4172 4218 N
+ S G D b n/a 30 4144 4172 4223 N
+ S G D s n/a 30 4144 4172 4218 N
+ S G DH s n/a 30 4143 4171 4212 N
+ S G EH b n/a 30 4143 4182 4226 N
+ S G EH s n/a 30 4143 4182 4226 N
+ S G ER b n/a 30 4143 4182 4245 N
+ S G ER s n/a 30 4143 4182 4245 N
+ S G EY b n/a 30 4143 4182 4230 N
+ S G EY s n/a 30 4143 4182 4230 N
+ S G F b n/a 30 4143 4171 4214 N
+ S G F s n/a 30 4143 4171 4214 N
+ S G G s n/a 30 4143 4171 4207 N
+ S G HH b n/a 30 4143 4171 4213 N
+ S G HH s n/a 30 4143 4171 4213 N
+ S G IH b n/a 30 4143 4182 4239 N
+ S G IH i n/a 30 4143 4182 4239 N
+ S G IH s n/a 30 4143 4182 4240 N
+ S G IY b n/a 30 4143 4182 4247 N
+ S G IY i n/a 30 4143 4182 4247 N
+ S G IY s n/a 30 4143 4182 4247 N
+ S G JH b n/a 30 4144 4172 4223 N
+ S G JH s n/a 30 4144 4172 4218 N
+ S G K b n/a 30 4143 4171 4207 N
+ S G K i n/a 30 4143 4171 4207 N
+ S G K s n/a 30 4143 4171 4207 N
+ S G L b n/a 30 4143 4171 4204 N
+ S G L i n/a 30 4143 4171 4204 N
+ S G L s n/a 30 4143 4171 4204 N
+ S G M b n/a 30 4143 4173 4206 N
+ S G M s n/a 30 4143 4173 4206 N
+ S G N b n/a 30 4143 4172 4216 N
+ S G N s n/a 30 4143 4172 4216 N
+ S G NG s n/a 30 4143 4171 4204 N
+ S G OW b n/a 30 4143 4182 4236 N
+ S G OW s n/a 30 4143 4182 4236 N
+ S G OY b n/a 30 4143 4182 4234 N
+ S G OY s n/a 30 4143 4182 4234 N
+ S G P b n/a 30 4144 4173 4224 N
+ S G P i n/a 30 4144 4173 4224 N
+ S G P s n/a 30 4144 4173 4224 N
+ S G R b n/a 30 4143 4171 4205 N
+ S G R s n/a 30 4143 4171 4205 N
+ S G S b n/a 30 4143 4171 4215 N
+ S G S s n/a 30 4143 4171 4215 N
+ S G SH b n/a 30 4143 4172 4213 N
+ S G SH s n/a 30 4143 4172 4213 N
+ S G SIL s n/a 30 4143 4177 4211 N
+ S G T b n/a 30 4144 4172 4223 N
+ S G T i n/a 30 4144 4172 4218 N
+ S G T s n/a 30 4144 4172 4218 N
+ S G TH b n/a 30 4143 4171 4212 N
+ S G TH s n/a 30 4143 4171 4212 N
+ S G UH b n/a 30 4143 4182 4242 N
+ S G UH s n/a 30 4143 4182 4242 N
+ S G UW b n/a 30 4143 4182 4242 N
+ S G UW s n/a 30 4143 4182 4242 N
+ S G V b n/a 30 4143 4171 4216 N
+ S G V s n/a 30 4143 4171 4216 N
+ S G W b n/a 30 4143 4171 4209 N
+ S G W i n/a 30 4143 4171 4209 N
+ S G W s n/a 30 4143 4171 4209 N
+ S G Y b n/a 30 4143 4172 4217 N
+ S G Y s n/a 30 4143 4172 4217 N
+ S G Z s n/a 30 4143 4171 4211 N
+ S G ZH s n/a 30 4143 4172 4216 N
+ S HH AA b n/a 30 4139 4183 4232 N
+ S HH AA s n/a 30 4139 4183 4232 N
+ S HH AE b n/a 30 4139 4183 4229 N
+ S HH AE s n/a 30 4139 4183 4229 N
+ S HH AH b n/a 30 4139 4183 4235 N
+ S HH AH s n/a 30 4139 4183 4244 N
+ S HH AO b n/a 30 4139 4183 4234 N
+ S HH AO s n/a 30 4139 4183 4234 N
+ S HH AW b n/a 30 4139 4183 4229 N
+ S HH AW s n/a 30 4139 4183 4229 N
+ S HH AY b n/a 30 4139 4183 4232 N
+ S HH AY s n/a 30 4139 4183 4232 N
+ S HH B b n/a 30 4139 4166 4224 N
+ S HH B s n/a 30 4139 4169 4224 N
+ S HH CH s n/a 30 4139 4169 4218 N
+ S HH D b n/a 30 4139 4166 4223 N
+ S HH D s n/a 30 4139 4166 4218 N
+ S HH DH s n/a 30 4139 4168 4212 N
+ S HH EH b n/a 30 4139 4183 4226 N
+ S HH EH s n/a 30 4139 4183 4226 N
+ S HH ER b n/a 30 4139 4183 4245 N
+ S HH ER s n/a 30 4139 4183 4245 N
+ S HH EY b n/a 30 4139 4183 4230 N
+ S HH EY s n/a 30 4139 4183 4230 N
+ S HH F b n/a 30 4139 4168 4214 N
+ S HH F s n/a 30 4139 4169 4214 N
+ S HH G s n/a 30 4139 4170 4207 N
+ S HH HH b n/a 30 4139 4168 4213 N
+ S HH HH s n/a 30 4139 4169 4213 N
+ S HH IH b n/a 30 4139 4183 4239 N
+ S HH IH s n/a 30 4139 4183 4240 N
+ S HH IY b n/a 30 4139 4183 4247 N
+ S HH IY s n/a 30 4139 4183 4247 N
+ S HH JH b n/a 30 4139 4168 4223 N
+ S HH JH s n/a 30 4139 4169 4218 N
+ S HH K b n/a 30 4139 4168 4207 N
+ S HH K s n/a 30 4139 4170 4207 N
+ S HH L b n/a 30 4139 4167 4204 N
+ S HH L s n/a 30 4139 4169 4204 N
+ S HH M b n/a 30 4139 4166 4206 N
+ S HH M s n/a 30 4139 4169 4206 N
+ S HH N b n/a 30 4139 4166 4216 N
+ S HH N s n/a 30 4139 4166 4216 N
+ S HH NG s n/a 30 4139 4170 4204 N
+ S HH OW b n/a 30 4139 4183 4236 N
+ S HH OW s n/a 30 4139 4183 4236 N
+ S HH OY b n/a 30 4139 4183 4234 N
+ S HH OY s n/a 30 4139 4183 4234 N
+ S HH P b n/a 30 4139 4166 4224 N
+ S HH P s n/a 30 4139 4169 4224 N
+ S HH R b n/a 30 4139 4167 4205 N
+ S HH R s n/a 30 4139 4170 4205 N
+ S HH S b n/a 30 4139 4168 4215 N
+ S HH S s n/a 30 4139 4168 4215 N
+ S HH SH b n/a 30 4139 4168 4213 N
+ S HH SH s n/a 30 4139 4169 4213 N
+ S HH SIL s n/a 30 4139 4177 4211 N
+ S HH T b n/a 30 4139 4166 4223 N
+ S HH T s n/a 30 4139 4166 4218 N
+ S HH TH b n/a 30 4139 4168 4212 N
+ S HH TH s n/a 30 4139 4168 4212 N
+ S HH UH b n/a 30 4139 4183 4242 N
+ S HH UH s n/a 30 4139 4183 4242 N
+ S HH UW b n/a 30 4139 4183 4242 N
+ S HH UW s n/a 30 4139 4183 4242 N
+ S HH V b n/a 30 4139 4168 4216 N
+ S HH V s n/a 30 4139 4169 4216 N
+ S HH W b n/a 30 4139 4168 4209 N
+ S HH W s n/a 30 4139 4170 4209 N
+ S HH Y b n/a 30 4139 4168 4217 N
+ S HH Y s n/a 30 4139 4169 4217 N
+ S HH Z s n/a 30 4139 4168 4211 N
+ S HH ZH s n/a 30 4139 4169 4216 N
+ S IH AA b n/a 30 4120 4188 4232 N
+ S IH AA e n/a 30 4120 4189 4233 N
+ S IH AA i n/a 30 4120 4188 4232 N
+ S IH AA s n/a 30 4120 4189 4232 N
+ S IH AE b n/a 30 4118 4187 4229 N
+ S IH AE e n/a 30 4120 4189 4231 N
+ S IH AE i n/a 30 4118 4187 4229 N
+ S IH AE s n/a 30 4118 4189 4229 N
+ S IH AH b n/a 30 4120 4188 4235 N
+ S IH AH e n/a 30 4120 4189 4244 N
+ S IH AH i n/a 30 4120 4189 4243 N
+ S IH AH s n/a 30 4120 4189 4244 N
+ S IH AO b n/a 30 4120 4188 4234 N
+ S IH AO e n/a 30 4120 4189 4233 N
+ S IH AO i n/a 30 4120 4188 4234 N
+ S IH AO s n/a 30 4120 4189 4234 N
+ S IH AW b n/a 30 4120 4187 4229 N
+ S IH AW e n/a 30 4120 4189 4231 N
+ S IH AW i n/a 30 4120 4187 4229 N
+ S IH AW s n/a 30 4120 4189 4229 N
+ S IH AY b n/a 30 4118 4188 4232 N
+ S IH AY e n/a 30 4120 4189 4233 N
+ S IH AY i n/a 30 4118 4188 4232 N
+ S IH AY s n/a 30 4118 4189 4232 N
+ S IH B b n/a 30 4118 4160 4224 N
+ S IH B e n/a 30 4120 4160 4225 N
+ S IH B i n/a 30 4118 4160 4224 N
+ S IH B s n/a 30 4118 4160 4224 N
+ S IH CH e n/a 30 4120 4160 4221 N
+ S IH CH i n/a 30 4118 4159 4221 N
+ S IH CH s n/a 30 4118 4160 4221 N
+ S IH D b n/a 30 4120 4160 4223 N
+ S IH D e n/a 30 4120 4160 4222 N
+ S IH D i n/a 30 4119 4159 4222 N
+ S IH D s n/a 30 4120 4160 4222 N
+ S IH DH e n/a 30 4120 4158 4212 N
+ S IH DH s n/a 30 4120 4158 4212 N
+ S IH EH b n/a 30 4118 4187 4226 N
+ S IH EH e n/a 30 4120 4189 4231 N
+ S IH EH i n/a 30 4118 4187 4226 N
+ S IH EH s n/a 30 4118 4189 4226 N
+ S IH ER b n/a 30 4120 4188 4245 N
+ S IH ER e n/a 30 4120 4189 4246 N
+ S IH ER i n/a 30 4120 4189 4245 N
+ S IH ER s n/a 30 4120 4189 4245 N
+ S IH EY b n/a 30 4118 4187 4230 N
+ S IH EY e n/a 30 4120 4189 4231 N
+ S IH EY i n/a 30 4118 4187 4230 N
+ S IH EY s n/a 30 4118 4189 4230 N
+ S IH F b n/a 30 4120 4158 4214 N
+ S IH F e n/a 30 4120 4158 4214 N
+ S IH F i n/a 30 4120 4158 4214 N
+ S IH F s n/a 30 4120 4158 4214 N
+ S IH G e n/a 30 4120 4158 4208 N
+ S IH G i n/a 30 4120 4158 4207 N
+ S IH G s n/a 30 4120 4158 4207 N
+ S IH HH b n/a 30 4120 4158 4213 N
+ S IH HH e n/a 30 4120 4158 4213 N
+ S IH HH i n/a 30 4120 4158 4213 N
+ S IH HH s n/a 30 4120 4158 4213 N
+ S IH IH b n/a 30 4120 4187 4239 N
+ S IH IH e n/a 30 4120 4189 4241 N
+ S IH IH i n/a 30 4120 4189 4239 N
+ S IH IH s n/a 30 4120 4189 4241 N
+ S IH IY b n/a 30 4118 4187 4247 N
+ S IH IY e n/a 30 4120 4189 4247 N
+ S IH IY i n/a 30 4118 4187 4247 N
+ S IH IY s n/a 30 4118 4189 4247 N
+ S IH JH b n/a 30 4118 4160 4223 N
+ S IH JH e n/a 30 4120 4160 4221 N
+ S IH JH i n/a 30 4118 4159 4221 N
+ S IH JH s n/a 30 4118 4160 4221 N
+ S IH K b n/a 30 4120 4158 4207 N
+ S IH K e n/a 30 4120 4158 4208 N
+ S IH K i n/a 30 4120 4158 4207 N
+ S IH K s n/a 30 4120 4158 4207 N
+ S IH L b n/a 30 4120 4158 4204 N
+ S IH L e n/a 30 4120 4158 4204 N
+ S IH L i n/a 30 4120 4158 4204 N
+ S IH L s n/a 30 4120 4158 4204 N
+ S IH M b n/a 30 4118 4160 4206 N
+ S IH M e n/a 30 4120 4160 4206 N
+ S IH M i n/a 30 4118 4160 4206 N
+ S IH M s n/a 30 4118 4160 4206 N
+ S IH N b n/a 30 4120 4160 4216 N
+ S IH N e n/a 30 4120 4160 4216 N
+ S IH N i n/a 30 4119 4160 4216 N
+ S IH N s n/a 30 4120 4160 4216 N
+ S IH NG e n/a 30 4120 4158 4204 N
+ S IH NG s n/a 30 4120 4158 4204 N
+ S IH OW b n/a 30 4120 4188 4236 N
+ S IH OW e n/a 30 4120 4189 4233 N
+ S IH OW i n/a 30 4120 4188 4236 N
+ S IH OW s n/a 30 4120 4189 4236 N
+ S IH OY b n/a 30 4118 4188 4234 N
+ S IH OY e n/a 30 4120 4189 4233 N
+ S IH OY s n/a 30 4118 4189 4234 N
+ S IH P b n/a 30 4118 4160 4224 N
+ S IH P e n/a 30 4120 4160 4225 N
+ S IH P i n/a 30 4118 4160 4224 N
+ S IH P s n/a 30 4118 4160 4224 N
+ S IH R b n/a 30 4120 4158 4205 N
+ S IH R e n/a 30 4120 4158 4205 N
+ S IH R i n/a 30 4120 4158 4205 N
+ S IH R s n/a 30 4120 4158 4205 N
+ S IH S b n/a 30 4120 4160 4215 N
+ S IH S e n/a 30 4120 4160 4215 N
+ S IH S i n/a 30 4120 4160 4215 N
+ S IH S s n/a 30 4120 4160 4215 N
+ S IH SH b n/a 30 4118 4160 4213 N
+ S IH SH e n/a 30 4120 4160 4213 N
+ S IH SH i n/a 30 4118 4160 4213 N
+ S IH SH s n/a 30 4118 4160 4213 N
+ S IH SIL e n/a 30 4125 4175 4210 N
+ S IH SIL s n/a 30 4125 4175 4210 N
+ S IH T b n/a 30 4120 4160 4223 N
+ S IH T e n/a 30 4120 4160 4221 N
+ S IH T i n/a 30 4119 4159 4221 N
+ S IH T s n/a 30 4120 4160 4221 N
+ S IH TH b n/a 30 4120 4158 4212 N
+ S IH TH e n/a 30 4120 4158 4212 N
+ S IH TH i n/a 30 4120 4158 4212 N
+ S IH TH s n/a 30 4120 4158 4212 N
+ S IH UH b n/a 30 4120 4187 4242 N
+ S IH UH e n/a 30 4120 4189 4242 N
+ S IH UH i n/a 30 4120 4187 4239 N
+ S IH UH s n/a 30 4120 4189 4242 N
+ S IH UW b n/a 30 4120 4187 4242 N
+ S IH UW e n/a 30 4120 4189 4242 N
+ S IH UW i n/a 30 4120 4187 4242 N
+ S IH UW s n/a 30 4120 4189 4242 N
+ S IH V b n/a 30 4120 4158 4216 N
+ S IH V e n/a 30 4120 4158 4216 N
+ S IH V i n/a 30 4120 4158 4216 N
+ S IH V s n/a 30 4120 4158 4216 N
+ S IH W b n/a 30 4120 4158 4209 N
+ S IH W e n/a 30 4120 4158 4209 N
+ S IH W i n/a 30 4120 4158 4209 N
+ S IH W s n/a 30 4120 4158 4209 N
+ S IH Y b n/a 30 4118 4160 4217 N
+ S IH Y e n/a 30 4120 4160 4217 N
+ S IH Y i n/a 30 4118 4160 4217 N
+ S IH Y s n/a 30 4118 4160 4217 N
+ S IH Z e n/a 30 4120 4160 4210 N
+ S IH Z s n/a 30 4120 4160 4210 N
+ S IH ZH e n/a 30 4120 4160 4216 N
+ S IH ZH i n/a 30 4118 4160 4216 N
+ S IH ZH s n/a 30 4118 4160 4216 N
+ S IY AA b n/a 30 4126 4193 4232 N
+ S IY AA e n/a 30 4126 4193 4233 N
+ S IY AA i n/a 30 4126 4193 4232 N
+ S IY AA s n/a 30 4126 4193 4232 N
+ S IY AE b n/a 30 4126 4191 4229 N
+ S IY AE e n/a 30 4126 4191 4231 N
+ S IY AE i n/a 30 4126 4191 4229 N
+ S IY AE s n/a 30 4126 4191 4229 N
+ S IY AH b n/a 30 4126 4191 4235 N
+ S IY AH e n/a 30 4126 4191 4244 N
+ S IY AH i n/a 30 4126 4191 4241 N
+ S IY AH s n/a 30 4126 4191 4244 N
+ S IY AO b n/a 30 4126 4193 4234 N
+ S IY AO e n/a 30 4126 4193 4233 N
+ S IY AO i n/a 30 4126 4193 4234 N
+ S IY AO s n/a 30 4126 4193 4234 N
+ S IY AW b n/a 30 4126 4191 4229 N
+ S IY AW e n/a 30 4126 4191 4231 N
+ S IY AW i n/a 30 4126 4191 4229 N
+ S IY AW s n/a 30 4126 4191 4229 N
+ S IY AY b n/a 30 4126 4193 4232 N
+ S IY AY e n/a 30 4126 4193 4233 N
+ S IY AY i n/a 30 4126 4193 4232 N
+ S IY AY s n/a 30 4126 4193 4232 N
+ S IY B b n/a 30 4126 4162 4224 N
+ S IY B e n/a 30 4126 4162 4225 N
+ S IY B i n/a 30 4126 4162 4224 N
+ S IY B s n/a 30 4126 4162 4224 N
+ S IY CH e n/a 30 4126 4162 4222 N
+ S IY CH i n/a 30 4126 4162 4222 N
+ S IY CH s n/a 30 4126 4162 4222 N
+ S IY D b n/a 30 4126 4161 4223 N
+ S IY D e n/a 30 4126 4161 4222 N
+ S IY D i n/a 30 4126 4161 4222 N
+ S IY D s n/a 30 4126 4161 4222 N
+ S IY DH e n/a 30 4126 4162 4212 N
+ S IY DH s n/a 30 4126 4162 4212 N
+ S IY EH b n/a 30 4126 4191 4227 N
+ S IY EH e n/a 30 4126 4191 4231 N
+ S IY EH i n/a 30 4126 4191 4227 N
+ S IY EH s n/a 30 4126 4191 4227 N
+ S IY ER b n/a 30 4126 4193 4245 N
+ S IY ER e n/a 30 4126 4193 4246 N
+ S IY ER i n/a 30 4126 4193 4245 N
+ S IY ER s n/a 30 4126 4193 4245 N
+ S IY EY b n/a 30 4126 4191 4230 N
+ S IY EY e n/a 30 4126 4191 4231 N
+ S IY EY i n/a 30 4126 4191 4230 N
+ S IY EY s n/a 30 4126 4191 4230 N
+ S IY F b n/a 30 4126 4162 4214 N
+ S IY F e n/a 30 4126 4162 4214 N
+ S IY F i n/a 30 4126 4162 4214 N
+ S IY F s n/a 30 4126 4162 4214 N
+ S IY G e n/a 30 4126 4162 4208 N
+ S IY G i n/a 30 4126 4162 4207 N
+ S IY G s n/a 30 4126 4162 4207 N
+ S IY HH b n/a 30 4126 4162 4213 N
+ S IY HH e n/a 30 4126 4162 4213 N
+ S IY HH i n/a 30 4126 4162 4213 N
+ S IY HH s n/a 30 4126 4162 4213 N
+ S IY IH b n/a 30 4126 4191 4239 N
+ S IY IH e n/a 30 4126 4191 4241 N
+ S IY IH i n/a 30 4126 4191 4241 N
+ S IY IH s n/a 30 4126 4191 4241 N
+ S IY IY b n/a 30 4126 4191 4247 N
+ S IY IY e n/a 30 4126 4191 4247 N
+ S IY IY i n/a 30 4126 4191 4247 N
+ S IY IY s n/a 30 4126 4191 4247 N
+ S IY JH b n/a 30 4126 4162 4223 N
+ S IY JH e n/a 30 4126 4162 4222 N
+ S IY JH i n/a 30 4126 4162 4222 N
+ S IY JH s n/a 30 4126 4162 4222 N
+ S IY K b n/a 30 4126 4162 4207 N
+ S IY K e n/a 30 4126 4162 4208 N
+ S IY K i n/a 30 4126 4162 4207 N
+ S IY K s n/a 30 4126 4162 4207 N
+ S IY L b n/a 30 4126 4162 4204 N
+ S IY L e n/a 30 4126 4162 4204 N
+ S IY L i n/a 30 4126 4162 4204 N
+ S IY L s n/a 30 4126 4162 4204 N
+ S IY M b n/a 30 4126 4162 4206 N
+ S IY M e n/a 30 4126 4162 4206 N
+ S IY M i n/a 30 4126 4162 4206 N
+ S IY M s n/a 30 4126 4162 4206 N
+ S IY N b n/a 30 4126 4161 4216 N
+ S IY N e n/a 30 4126 4161 4216 N
+ S IY N i n/a 30 4126 4161 4216 N
+ S IY N s n/a 30 4126 4161 4216 N
+ S IY NG e n/a 30 4126 4162 4204 N
+ S IY NG s n/a 30 4126 4162 4204 N
+ S IY OW b n/a 30 4126 4193 4236 N
+ S IY OW e n/a 30 4126 4193 4233 N
+ S IY OW i n/a 30 4126 4193 4236 N
+ S IY OW s n/a 30 4126 4193 4236 N
+ S IY OY b n/a 30 4126 4193 4234 N
+ S IY OY e n/a 30 4126 4193 4233 N
+ S IY OY s n/a 30 4126 4193 4234 N
+ S IY P b n/a 30 4126 4162 4224 N
+ S IY P e n/a 30 4126 4162 4225 N
+ S IY P i n/a 30 4126 4162 4224 N
+ S IY P s n/a 30 4126 4162 4224 N
+ S IY R b n/a 30 4126 4162 4205 N
+ S IY R e n/a 30 4126 4162 4205 N
+ S IY R s n/a 30 4126 4162 4205 N
+ S IY S b n/a 30 4126 4162 4215 N
+ S IY S e n/a 30 4126 4162 4215 N
+ S IY S s n/a 30 4126 4162 4215 N
+ S IY SH b n/a 30 4126 4162 4213 N
+ S IY SH e n/a 30 4126 4162 4213 N
+ S IY SH s n/a 30 4126 4162 4213 N
+ S IY SIL e n/a 30 4126 4174 4210 N
+ S IY SIL s n/a 30 4126 4174 4210 N
+ S IY T b n/a 30 4126 4161 4223 N
+ S IY T e n/a 30 4126 4161 4222 N
+ S IY T i n/a 30 4126 4161 4222 N
+ S IY T s n/a 30 4126 4161 4222 N
+ S IY TH b n/a 30 4126 4162 4212 N
+ S IY TH e n/a 30 4126 4162 4212 N
+ S IY TH i n/a 30 4126 4162 4212 N
+ S IY TH s n/a 30 4126 4162 4212 N
+ S IY UH b n/a 30 4126 4193 4242 N
+ S IY UH e n/a 30 4126 4193 4242 N
+ S IY UH s n/a 30 4126 4193 4242 N
+ S IY UW b n/a 30 4126 4193 4242 N
+ S IY UW e n/a 30 4126 4193 4242 N
+ S IY UW i n/a 30 4126 4193 4242 N
+ S IY UW s n/a 30 4126 4193 4242 N
+ S IY V b n/a 30 4126 4162 4216 N
+ S IY V e n/a 30 4126 4162 4216 N
+ S IY V s n/a 30 4126 4162 4216 N
+ S IY W b n/a 30 4126 4162 4209 N
+ S IY W e n/a 30 4126 4162 4209 N
+ S IY W i n/a 30 4126 4162 4209 N
+ S IY W s n/a 30 4126 4162 4209 N
+ S IY Y b n/a 30 4126 4162 4217 N
+ S IY Y e n/a 30 4126 4162 4217 N
+ S IY Y s n/a 30 4126 4162 4217 N
+ S IY Z e n/a 30 4126 4162 4210 N
+ S IY Z s n/a 30 4126 4162 4210 N
+ S IY ZH e n/a 30 4126 4162 4216 N
+ S IY ZH s n/a 30 4126 4162 4216 N
+ S JH AA b n/a 30 4140 4183 4232 N
+ S JH AA s n/a 30 4140 4183 4232 N
+ S JH AE b n/a 30 4140 4183 4229 N
+ S JH AE s n/a 30 4140 4183 4229 N
+ S JH AH b n/a 30 4140 4183 4235 N
+ S JH AH i n/a 30 4140 4183 4243 N
+ S JH AH s n/a 30 4140 4183 4244 N
+ S JH AO b n/a 30 4140 4183 4234 N
+ S JH AO s n/a 30 4140 4183 4234 N
+ S JH AW b n/a 30 4140 4183 4229 N
+ S JH AW s n/a 30 4140 4183 4229 N
+ S JH AY b n/a 30 4140 4183 4232 N
+ S JH AY i n/a 30 4140 4183 4232 N
+ S JH AY s n/a 30 4140 4183 4232 N
+ S JH B b n/a 30 4140 4166 4224 N
+ S JH B s n/a 30 4140 4169 4224 N
+ S JH CH s n/a 30 4140 4169 4218 N
+ S JH D b n/a 30 4140 4166 4223 N
+ S JH D s n/a 30 4140 4166 4218 N
+ S JH DH s n/a 30 4140 4168 4212 N
+ S JH EH b n/a 30 4140 4183 4226 N
+ S JH EH s n/a 30 4140 4183 4226 N
+ S JH ER b n/a 30 4140 4183 4245 N
+ S JH ER s n/a 30 4140 4183 4245 N
+ S JH EY b n/a 30 4140 4183 4230 N
+ S JH EY s n/a 30 4140 4183 4230 N
+ S JH F b n/a 30 4140 4168 4214 N
+ S JH F s n/a 30 4140 4169 4214 N
+ S JH G s n/a 30 4140 4170 4207 N
+ S JH HH b n/a 30 4140 4168 4213 N
+ S JH HH s n/a 30 4140 4169 4213 N
+ S JH IH b n/a 30 4140 4183 4239 N
+ S JH IH i n/a 30 4140 4183 4239 N
+ S JH IH s n/a 30 4140 4183 4240 N
+ S JH IY b n/a 30 4140 4183 4247 N
+ S JH IY i n/a 30 4140 4183 4247 N
+ S JH IY s n/a 30 4140 4183 4247 N
+ S JH JH b n/a 30 4140 4168 4223 N
+ S JH JH s n/a 30 4140 4169 4218 N
+ S JH K b n/a 30 4140 4168 4207 N
+ S JH K i n/a 30 4140 4170 4207 N
+ S JH K s n/a 30 4140 4170 4207 N
+ S JH L b n/a 30 4140 4167 4204 N
+ S JH L s n/a 30 4140 4169 4204 N
+ S JH M b n/a 30 4140 4166 4206 N
+ S JH M s n/a 30 4140 4169 4206 N
+ S JH N b n/a 30 4140 4166 4216 N
+ S JH N s n/a 30 4140 4166 4216 N
+ S JH NG s n/a 30 4140 4170 4204 N
+ S JH OW b n/a 30 4140 4183 4236 N
+ S JH OW s n/a 30 4140 4183 4236 N
+ S JH OY b n/a 30 4140 4183 4234 N
+ S JH OY s n/a 30 4140 4183 4234 N
+ S JH P b n/a 30 4140 4166 4224 N
+ S JH P s n/a 30 4140 4169 4224 N
+ S JH R b n/a 30 4140 4167 4205 N
+ S JH R s n/a 30 4140 4170 4205 N
+ S JH S b n/a 30 4140 4168 4215 N
+ S JH S s n/a 30 4140 4168 4215 N
+ S JH SH b n/a 30 4140 4168 4213 N
+ S JH SH s n/a 30 4140 4169 4213 N
+ S JH SIL s n/a 30 4140 4176 4211 N
+ S JH T b n/a 30 4140 4166 4223 N
+ S JH T i n/a 30 4140 4166 4218 N
+ S JH T s n/a 30 4140 4166 4218 N
+ S JH TH b n/a 30 4140 4168 4212 N
+ S JH TH s n/a 30 4140 4168 4212 N
+ S JH UH b n/a 30 4140 4183 4242 N
+ S JH UH s n/a 30 4140 4183 4242 N
+ S JH UW b n/a 30 4140 4183 4242 N
+ S JH UW s n/a 30 4140 4183 4242 N
+ S JH V b n/a 30 4140 4168 4216 N
+ S JH V s n/a 30 4140 4169 4216 N
+ S JH W b n/a 30 4140 4168 4209 N
+ S JH W s n/a 30 4140 4170 4209 N
+ S JH Y b n/a 30 4140 4168 4217 N
+ S JH Y s n/a 30 4140 4169 4217 N
+ S JH Z s n/a 30 4140 4168 4211 N
+ S JH ZH s n/a 30 4140 4169 4216 N
+ S K AA b n/a 30 4143 4182 4232 N
+ S K AA e n/a 30 4143 4182 4233 N
+ S K AA i n/a 30 4143 4182 4232 N
+ S K AA s n/a 30 4143 4182 4232 N
+ S K AE b n/a 30 4143 4182 4229 N
+ S K AE e n/a 30 4143 4182 4231 N
+ S K AE i n/a 30 4143 4182 4229 N
+ S K AE s n/a 30 4143 4182 4229 N
+ S K AH b n/a 30 4143 4182 4235 N
+ S K AH e n/a 30 4143 4182 4244 N
+ S K AH i n/a 30 4143 4182 4243 N
+ S K AH s n/a 30 4143 4182 4244 N
+ S K AO b n/a 30 4143 4182 4234 N
+ S K AO e n/a 30 4143 4182 4233 N
+ S K AO i n/a 30 4143 4182 4234 N
+ S K AO s n/a 30 4143 4182 4234 N
+ S K AW b n/a 30 4143 4182 4229 N
+ S K AW e n/a 30 4143 4182 4231 N
+ S K AW i n/a 30 4143 4182 4229 N
+ S K AW s n/a 30 4143 4182 4229 N
+ S K AY b n/a 30 4143 4182 4232 N
+ S K AY e n/a 30 4143 4182 4233 N
+ S K AY i n/a 30 4143 4182 4232 N
+ S K AY s n/a 30 4143 4182 4232 N
+ S K B b n/a 30 4144 4173 4224 N
+ S K B e n/a 30 4144 4173 4225 N
+ S K B i n/a 30 4144 4173 4224 N
+ S K B s n/a 30 4144 4173 4224 N
+ S K CH e n/a 30 4144 4172 4222 N
+ S K CH i n/a 30 4144 4172 4222 N
+ S K CH s n/a 30 4144 4172 4222 N
+ S K D b n/a 30 4144 4172 4223 N
+ S K D e n/a 30 4144 4172 4222 N
+ S K D i n/a 30 4144 4172 4222 N
+ S K D s n/a 30 4144 4172 4222 N
+ S K DH e n/a 30 4143 4171 4212 N
+ S K DH s n/a 30 4143 4171 4212 N
+ S K EH b n/a 30 4143 4182 4226 N
+ S K EH e n/a 30 4143 4182 4231 N
+ S K EH i n/a 30 4143 4182 4226 N
+ S K EH s n/a 30 4143 4182 4226 N
+ S K ER b n/a 30 4143 4182 4245 N
+ S K ER e n/a 30 4143 4182 4246 N
+ S K ER i n/a 30 4143 4182 4245 N
+ S K ER s n/a 30 4143 4182 4245 N
+ S K EY b n/a 30 4143 4182 4230 N
+ S K EY e n/a 30 4143 4182 4231 N
+ S K EY i n/a 30 4143 4182 4230 N
+ S K EY s n/a 30 4143 4182 4230 N
+ S K F b n/a 30 4143 4171 4214 N
+ S K F e n/a 30 4143 4171 4214 N
+ S K F i n/a 30 4143 4171 4214 N
+ S K F s n/a 30 4143 4171 4214 N
+ S K G e n/a 30 4143 4171 4208 N
+ S K G i n/a 30 4143 4171 4207 N
+ S K G s n/a 30 4143 4171 4207 N
+ S K HH b n/a 30 4143 4171 4213 N
+ S K HH e n/a 30 4143 4171 4213 N
+ S K HH i n/a 30 4143 4171 4213 N
+ S K HH s n/a 30 4143 4171 4213 N
+ S K IH b n/a 30 4143 4182 4239 N
+ S K IH e n/a 30 4143 4182 4240 N
+ S K IH i n/a 30 4143 4182 4239 N
+ S K IH s n/a 30 4143 4182 4240 N
+ S K IY b n/a 30 4143 4182 4247 N
+ S K IY e n/a 30 4143 4182 4247 N
+ S K IY i n/a 30 4143 4182 4247 N
+ S K IY s n/a 30 4143 4182 4247 N
+ S K JH b n/a 30 4144 4172 4223 N
+ S K JH e n/a 30 4144 4172 4222 N
+ S K JH i n/a 30 4144 4172 4222 N
+ S K JH s n/a 30 4144 4172 4222 N
+ S K K b n/a 30 4143 4171 4207 N
+ S K K e n/a 30 4143 4171 4208 N
+ S K K i n/a 30 4143 4171 4207 N
+ S K K s n/a 30 4143 4171 4207 N
+ S K L b n/a 30 4143 4171 4204 N
+ S K L e n/a 30 4143 4171 4204 N
+ S K L i n/a 30 4143 4171 4204 N
+ S K L s n/a 30 4143 4171 4204 N
+ S K M b n/a 30 4143 4173 4206 N
+ S K M e n/a 30 4143 4173 4206 N
+ S K M i n/a 30 4143 4173 4206 N
+ S K M s n/a 30 4143 4173 4206 N
+ S K N b n/a 30 4143 4172 4216 N
+ S K N e n/a 30 4143 4172 4216 N
+ S K N i n/a 30 4143 4172 4216 N
+ S K N s n/a 30 4143 4172 4216 N
+ S K NG e n/a 30 4143 4171 4204 N
+ S K NG s n/a 30 4143 4171 4204 N
+ S K OW b n/a 30 4143 4182 4236 N
+ S K OW e n/a 30 4143 4182 4233 N
+ S K OW i n/a 30 4143 4182 4236 N
+ S K OW s n/a 30 4143 4182 4236 N
+ S K OY b n/a 30 4143 4182 4234 N
+ S K OY e n/a 30 4143 4182 4233 N
+ S K OY s n/a 30 4143 4182 4234 N
+ S K P b n/a 30 4144 4173 4224 N
+ S K P e n/a 30 4144 4173 4225 N
+ S K P i n/a 30 4144 4173 4224 N
+ S K P s n/a 30 4144 4173 4224 N
+ S K R b n/a 30 4143 4171 4205 N
+ S K R e n/a 30 4143 4171 4205 N
+ S K R i n/a 30 4143 4171 4205 N
+ S K R s n/a 30 4143 4171 4205 N
+ S K S b n/a 30 4143 4171 4215 N
+ S K S e n/a 30 4143 4171 4215 N
+ S K S i n/a 30 4143 4171 4215 N
+ S K S s n/a 30 4143 4171 4215 N
+ S K SH b n/a 30 4143 4172 4213 N
+ S K SH e n/a 30 4143 4172 4213 N
+ S K SH s n/a 30 4143 4172 4213 N
+ S K SIL e n/a 30 4143 4177 4211 N
+ S K SIL s n/a 30 4143 4177 4211 N
+ S K T b n/a 30 4144 4172 4223 N
+ S K T e n/a 30 4144 4172 4222 N
+ S K T i n/a 30 4144 4172 4222 N
+ S K T s n/a 30 4144 4172 4222 N
+ S K TH b n/a 30 4143 4171 4212 N
+ S K TH e n/a 30 4143 4171 4212 N
+ S K TH i n/a 30 4143 4171 4212 N
+ S K TH s n/a 30 4143 4171 4212 N
+ S K UH b n/a 30 4143 4182 4242 N
+ S K UH e n/a 30 4143 4182 4242 N
+ S K UH s n/a 30 4143 4182 4242 N
+ S K UW b n/a 30 4143 4182 4242 N
+ S K UW e n/a 30 4143 4182 4242 N
+ S K UW i n/a 30 4143 4182 4242 N
+ S K UW s n/a 30 4143 4182 4242 N
+ S K V b n/a 30 4143 4171 4216 N
+ S K V e n/a 30 4143 4171 4216 N
+ S K V i n/a 30 4143 4171 4216 N
+ S K V s n/a 30 4143 4171 4216 N
+ S K W b n/a 30 4143 4171 4209 N
+ S K W e n/a 30 4143 4171 4209 N
+ S K W i n/a 30 4143 4171 4209 N
+ S K W s n/a 30 4143 4171 4209 N
+ S K Y b n/a 30 4143 4172 4217 N
+ S K Y e n/a 30 4143 4172 4217 N
+ S K Y i n/a 30 4143 4172 4217 N
+ S K Y s n/a 30 4143 4172 4217 N
+ S K Z e n/a 30 4143 4171 4211 N
+ S K Z s n/a 30 4143 4171 4211 N
+ S K ZH e n/a 30 4143 4172 4216 N
+ S K ZH s n/a 30 4143 4172 4216 N
+ S L AA b n/a 30 4117 4195 4232 N
+ S L AA e n/a 30 4117 4195 4233 N
+ S L AA i n/a 30 4117 4197 4232 N
+ S L AA s n/a 30 4117 4195 4232 N
+ S L AE b n/a 30 4117 4195 4229 N
+ S L AE e n/a 30 4117 4195 4231 N
+ S L AE i n/a 30 4117 4197 4229 N
+ S L AE s n/a 30 4117 4195 4229 N
+ S L AH b n/a 30 4117 4195 4235 N
+ S L AH e n/a 30 4117 4195 4244 N
+ S L AH i n/a 30 4117 4197 4243 N
+ S L AH s n/a 30 4117 4195 4244 N
+ S L AO b n/a 30 4117 4195 4234 N
+ S L AO e n/a 30 4117 4195 4233 N
+ S L AO i n/a 30 4117 4197 4234 N
+ S L AO s n/a 30 4117 4195 4234 N
+ S L AW b n/a 30 4117 4195 4229 N
+ S L AW e n/a 30 4117 4195 4231 N
+ S L AW i n/a 30 4117 4197 4229 N
+ S L AW s n/a 30 4117 4195 4229 N
+ S L AY b n/a 30 4117 4195 4232 N
+ S L AY e n/a 30 4117 4195 4233 N
+ S L AY i n/a 30 4117 4197 4232 N
+ S L AY s n/a 30 4117 4195 4232 N
+ S L B b n/a 30 4117 4156 4224 N
+ S L B e n/a 30 4117 4149 4225 N
+ S L B i n/a 30 4117 4149 4224 N
+ S L B s n/a 30 4117 4149 4224 N
+ S L CH e n/a 30 4117 4149 4218 N
+ S L CH s n/a 30 4117 4149 4218 N
+ S L D b n/a 30 4117 4156 4223 N
+ S L D e n/a 30 4117 4149 4218 N
+ S L D i n/a 30 4117 4149 4218 N
+ S L D s n/a 30 4117 4149 4218 N
+ S L DH e n/a 30 4117 4149 4212 N
+ S L DH s n/a 30 4117 4149 4212 N
+ S L EH b n/a 30 4117 4195 4226 N
+ S L EH e n/a 30 4117 4195 4231 N
+ S L EH i n/a 30 4117 4197 4226 N
+ S L EH s n/a 30 4117 4195 4226 N
+ S L ER b n/a 30 4117 4195 4245 N
+ S L ER e n/a 30 4117 4195 4246 N
+ S L ER i n/a 30 4117 4197 4245 N
+ S L ER s n/a 30 4117 4195 4245 N
+ S L EY b n/a 30 4117 4195 4230 N
+ S L EY e n/a 30 4117 4195 4231 N
+ S L EY i n/a 30 4117 4197 4230 N
+ S L EY s n/a 30 4117 4195 4230 N
+ S L F b n/a 30 4117 4155 4214 N
+ S L F e n/a 30 4117 4149 4214 N
+ S L F i n/a 30 4117 4149 4214 N
+ S L F s n/a 30 4117 4149 4214 N
+ S L G e n/a 30 4117 4149 4208 N
+ S L G i n/a 30 4117 4149 4207 N
+ S L G s n/a 30 4117 4149 4207 N
+ S L HH b n/a 30 4117 4155 4213 N
+ S L HH e n/a 30 4117 4149 4213 N
+ S L HH i n/a 30 4117 4149 4213 N
+ S L HH s n/a 30 4117 4149 4213 N
+ S L IH b n/a 30 4117 4195 4239 N
+ S L IH e n/a 30 4117 4195 4240 N
+ S L IH i n/a 30 4117 4197 4240 N
+ S L IH s n/a 30 4117 4195 4240 N
+ S L IY b n/a 30 4117 4195 4247 N
+ S L IY e n/a 30 4117 4195 4247 N
+ S L IY i n/a 30 4117 4197 4247 N
+ S L IY s n/a 30 4117 4195 4247 N
+ S L JH b n/a 30 4117 4155 4223 N
+ S L JH e n/a 30 4117 4149 4218 N
+ S L JH s n/a 30 4117 4149 4218 N
+ S L K b n/a 30 4117 4155 4207 N
+ S L K e n/a 30 4117 4149 4208 N
+ S L K i n/a 30 4117 4149 4207 N
+ S L K s n/a 30 4117 4149 4207 N
+ S L L b n/a 30 4117 4154 4204 N
+ S L L e n/a 30 4117 4149 4204 N
+ S L L i n/a 30 4117 4149 4204 N
+ S L L s n/a 30 4117 4149 4204 N
+ S L M b n/a 30 4117 4156 4206 N
+ S L M e n/a 30 4117 4149 4206 N
+ S L M i n/a 30 4117 4149 4206 N
+ S L M s n/a 30 4117 4149 4206 N
+ S L N b n/a 30 4117 4156 4216 N
+ S L N e n/a 30 4117 4149 4216 N
+ S L N i n/a 30 4117 4149 4216 N
+ S L N s n/a 30 4117 4149 4216 N
+ S L NG e n/a 30 4117 4149 4204 N
+ S L NG s n/a 30 4117 4149 4204 N
+ S L OW b n/a 30 4117 4195 4238 N
+ S L OW e n/a 30 4117 4195 4238 N
+ S L OW i n/a 30 4117 4197 4238 N
+ S L OW s n/a 30 4117 4195 4238 N
+ S L OY b n/a 30 4117 4195 4234 N
+ S L OY e n/a 30 4117 4195 4233 N
+ S L OY s n/a 30 4117 4195 4234 N
+ S L P b n/a 30 4117 4156 4224 N
+ S L P e n/a 30 4117 4149 4225 N
+ S L P i n/a 30 4117 4149 4224 N
+ S L P s n/a 30 4117 4149 4224 N
+ S L R b n/a 30 4117 4153 4205 N
+ S L R e n/a 30 4117 4149 4205 N
+ S L R s n/a 30 4117 4149 4205 N
+ S L S b n/a 30 4117 4155 4215 N
+ S L S e n/a 30 4117 4149 4215 N
+ S L S s n/a 30 4117 4149 4215 N
+ S L SH b n/a 30 4117 4155 4213 N
+ S L SH e n/a 30 4117 4149 4213 N
+ S L SH s n/a 30 4117 4149 4213 N
+ S L SIL e n/a 30 4117 4176 4211 N
+ S L SIL s n/a 30 4117 4176 4211 N
+ S L T b n/a 30 4117 4156 4223 N
+ S L T e n/a 30 4117 4149 4218 N
+ S L T i n/a 30 4117 4149 4218 N
+ S L T s n/a 30 4117 4149 4218 N
+ S L TH b n/a 30 4117 4154 4212 N
+ S L TH e n/a 30 4117 4149 4212 N
+ S L TH i n/a 30 4117 4149 4212 N
+ S L TH s n/a 30 4117 4149 4212 N
+ S L UH b n/a 30 4117 4195 4242 N
+ S L UH e n/a 30 4117 4195 4242 N
+ S L UH s n/a 30 4117 4195 4242 N
+ S L UW b n/a 30 4117 4195 4242 N
+ S L UW e n/a 30 4117 4195 4242 N
+ S L UW s n/a 30 4117 4195 4242 N
+ S L V b n/a 30 4117 4155 4216 N
+ S L V e n/a 30 4117 4149 4216 N
+ S L V s n/a 30 4117 4149 4216 N
+ S L W b n/a 30 4117 4155 4209 N
+ S L W e n/a 30 4117 4149 4209 N
+ S L W i n/a 30 4117 4149 4209 N
+ S L W s n/a 30 4117 4149 4209 N
+ S L Y b n/a 30 4117 4155 4217 N
+ S L Y e n/a 30 4117 4149 4217 N
+ S L Y s n/a 30 4117 4149 4217 N
+ S L Z e n/a 30 4117 4149 4211 N
+ S L Z s n/a 30 4117 4149 4211 N
+ S L ZH e n/a 30 4117 4149 4216 N
+ S L ZH s n/a 30 4117 4149 4216 N
+ S M AA b n/a 30 4148 4188 4232 N
+ S M AA i n/a 30 4148 4200 4232 N
+ S M AA s n/a 30 4148 4200 4232 N
+ S M AE b n/a 30 4148 4188 4229 N
+ S M AE i n/a 30 4148 4200 4229 N
+ S M AE s n/a 30 4148 4200 4229 N
+ S M AH b n/a 30 4148 4188 4235 N
+ S M AH i n/a 30 4148 4199 4243 N
+ S M AH s n/a 30 4148 4199 4244 N
+ S M AO b n/a 30 4148 4188 4234 N
+ S M AO s n/a 30 4148 4200 4234 N
+ S M AW b n/a 30 4148 4188 4229 N
+ S M AW i n/a 30 4148 4200 4229 N
+ S M AW s n/a 30 4148 4200 4229 N
+ S M AY b n/a 30 4148 4188 4232 N
+ S M AY i n/a 30 4148 4200 4232 N
+ S M AY s n/a 30 4148 4200 4232 N
+ S M B b n/a 30 4148 4156 4224 N
+ S M B i n/a 30 4148 4156 4224 N
+ S M B s n/a 30 4148 4156 4224 N
+ S M CH s n/a 30 4148 4155 4218 N
+ S M D b n/a 30 4148 4156 4223 N
+ S M D i n/a 30 4148 4156 4218 N
+ S M D s n/a 30 4148 4156 4218 N
+ S M DH s n/a 30 4148 4154 4212 N
+ S M EH b n/a 30 4148 4188 4226 N
+ S M EH i n/a 30 4148 4200 4228 N
+ S M EH s n/a 30 4148 4200 4226 N
+ S M ER b n/a 30 4148 4188 4245 N
+ S M ER i n/a 30 4148 4199 4245 N
+ S M ER s n/a 30 4148 4199 4245 N
+ S M EY b n/a 30 4148 4188 4230 N
+ S M EY i n/a 30 4148 4200 4230 N
+ S M EY s n/a 30 4148 4200 4230 N
+ S M F b n/a 30 4148 4155 4214 N
+ S M F i n/a 30 4148 4155 4214 N
+ S M F s n/a 30 4148 4155 4214 N
+ S M G i n/a 30 4148 4155 4207 N
+ S M G s n/a 30 4148 4155 4207 N
+ S M HH b n/a 30 4148 4155 4213 N
+ S M HH i n/a 30 4148 4155 4213 N
+ S M HH s n/a 30 4148 4155 4213 N
+ S M IH b n/a 30 4148 4187 4239 N
+ S M IH i n/a 30 4148 4201 4239 N
+ S M IH s n/a 30 4148 4201 4240 N
+ S M IY b n/a 30 4148 4187 4247 N
+ S M IY i n/a 30 4148 4201 4247 N
+ S M IY s n/a 30 4148 4201 4247 N
+ S M JH b n/a 30 4148 4155 4223 N
+ S M JH s n/a 30 4148 4155 4218 N
+ S M K b n/a 30 4148 4155 4207 N
+ S M K i n/a 30 4148 4155 4207 N
+ S M K s n/a 30 4148 4155 4207 N
+ S M L b n/a 30 4148 4154 4204 N
+ S M L i n/a 30 4148 4154 4204 N
+ S M L s n/a 30 4148 4154 4204 N
+ S M M b n/a 30 4148 4156 4206 N
+ S M M s n/a 30 4148 4156 4206 N
+ S M N b n/a 30 4148 4156 4216 N
+ S M N s n/a 30 4148 4156 4216 N
+ S M NG s n/a 30 4148 4155 4204 N
+ S M OW b n/a 30 4148 4188 4236 N
+ S M OW i n/a 30 4148 4200 4236 N
+ S M OW s n/a 30 4148 4200 4236 N
+ S M OY b n/a 30 4148 4188 4234 N
+ S M OY s n/a 30 4148 4200 4234 N
+ S M P b n/a 30 4148 4156 4224 N
+ S M P i n/a 30 4148 4156 4224 N
+ S M P s n/a 30 4148 4156 4224 N
+ S M R b n/a 30 4148 4153 4205 N
+ S M R s n/a 30 4148 4153 4205 N
+ S M S b n/a 30 4148 4155 4215 N
+ S M S s n/a 30 4148 4155 4215 N
+ S M SH b n/a 30 4148 4155 4213 N
+ S M SH s n/a 30 4148 4155 4213 N
+ S M SIL s n/a 30 4148 4176 4211 N
+ S M T b n/a 30 4148 4156 4223 N
+ S M T i n/a 30 4148 4156 4218 N
+ S M T s n/a 30 4148 4156 4218 N
+ S M TH b n/a 30 4148 4154 4212 N
+ S M TH s n/a 30 4148 4154 4212 N
+ S M UH b n/a 30 4148 4187 4242 N
+ S M UH s n/a 30 4148 4201 4242 N
+ S M UW b n/a 30 4148 4187 4242 N
+ S M UW i n/a 30 4148 4201 4242 N
+ S M UW s n/a 30 4148 4201 4242 N
+ S M V b n/a 30 4148 4155 4216 N
+ S M V s n/a 30 4148 4155 4216 N
+ S M W b n/a 30 4148 4155 4209 N
+ S M W s n/a 30 4148 4155 4209 N
+ S M Y b n/a 30 4148 4155 4217 N
+ S M Y s n/a 30 4148 4155 4217 N
+ S M Z s n/a 30 4148 4155 4211 N
+ S M ZH s n/a 30 4148 4155 4216 N
+ S N AA b n/a 30 4145 4200 4232 N
+ S N AA e n/a 30 4145 4200 4233 N
+ S N AA i n/a 30 4145 4200 4232 N
+ S N AA s n/a 30 4145 4200 4232 N
+ S N AE b n/a 30 4145 4200 4229 N
+ S N AE e n/a 30 4145 4200 4231 N
+ S N AE i n/a 30 4145 4200 4229 N
+ S N AE s n/a 30 4145 4200 4229 N
+ S N AH b n/a 30 4145 4200 4235 N
+ S N AH e n/a 30 4145 4199 4244 N
+ S N AH i n/a 30 4145 4199 4243 N
+ S N AH s n/a 30 4145 4199 4244 N
+ S N AO b n/a 30 4145 4200 4234 N
+ S N AO e n/a 30 4145 4200 4233 N
+ S N AO i n/a 30 4145 4200 4234 N
+ S N AO s n/a 30 4145 4200 4234 N
+ S N AW b n/a 30 4145 4200 4229 N
+ S N AW e n/a 30 4145 4200 4231 N
+ S N AW i n/a 30 4145 4200 4229 N
+ S N AW s n/a 30 4145 4200 4229 N
+ S N AY b n/a 30 4145 4200 4232 N
+ S N AY e n/a 30 4145 4200 4233 N
+ S N AY i n/a 30 4145 4200 4232 N
+ S N AY s n/a 30 4145 4200 4232 N
+ S N B b n/a 30 4145 4157 4224 N
+ S N B e n/a 30 4145 4157 4225 N
+ S N B i n/a 30 4145 4157 4224 N
+ S N B s n/a 30 4145 4157 4224 N
+ S N CH e n/a 30 4145 4157 4218 N
+ S N CH i n/a 30 4145 4157 4218 N
+ S N CH s n/a 30 4145 4157 4218 N
+ S N D b n/a 30 4145 4157 4223 N
+ S N D e n/a 30 4145 4157 4218 N
+ S N D i n/a 30 4145 4157 4218 N
+ S N D s n/a 30 4145 4157 4218 N
+ S N DH e n/a 30 4145 4157 4212 N
+ S N DH s n/a 30 4145 4157 4212 N
+ S N EH b n/a 30 4145 4200 4226 N
+ S N EH e n/a 30 4145 4200 4231 N
+ S N EH i n/a 30 4145 4200 4226 N
+ S N EH s n/a 30 4145 4200 4226 N
+ S N ER b n/a 30 4145 4199 4245 N
+ S N ER e n/a 30 4145 4199 4246 N
+ S N ER i n/a 30 4145 4199 4245 N
+ S N ER s n/a 30 4145 4199 4245 N
+ S N EY b n/a 30 4145 4200 4230 N
+ S N EY e n/a 30 4145 4200 4231 N
+ S N EY i n/a 30 4145 4200 4230 N
+ S N EY s n/a 30 4145 4200 4230 N
+ S N F b n/a 30 4145 4157 4214 N
+ S N F e n/a 30 4145 4157 4214 N
+ S N F i n/a 30 4145 4157 4214 N
+ S N F s n/a 30 4145 4157 4214 N
+ S N G e n/a 30 4145 4157 4208 N
+ S N G i n/a 30 4145 4157 4207 N
+ S N G s n/a 30 4145 4157 4207 N
+ S N HH b n/a 30 4145 4157 4213 N
+ S N HH e n/a 30 4145 4157 4213 N
+ S N HH i n/a 30 4145 4157 4213 N
+ S N HH s n/a 30 4145 4157 4213 N
+ S N IH b n/a 30 4145 4201 4239 N
+ S N IH e n/a 30 4145 4201 4240 N
+ S N IH i n/a 30 4145 4201 4239 N
+ S N IH s n/a 30 4145 4201 4240 N
+ S N IY b n/a 30 4145 4201 4247 N
+ S N IY e n/a 30 4145 4201 4247 N
+ S N IY i n/a 30 4145 4201 4247 N
+ S N IY s n/a 30 4145 4201 4247 N
+ S N JH b n/a 30 4145 4157 4223 N
+ S N JH e n/a 30 4145 4157 4218 N
+ S N JH s n/a 30 4145 4157 4218 N
+ S N K b n/a 30 4145 4157 4207 N
+ S N K e n/a 30 4145 4157 4208 N
+ S N K i n/a 30 4145 4157 4207 N
+ S N K s n/a 30 4145 4157 4207 N
+ S N L b n/a 30 4145 4157 4204 N
+ S N L e n/a 30 4145 4157 4204 N
+ S N L i n/a 30 4145 4157 4204 N
+ S N L s n/a 30 4145 4157 4204 N
+ S N M b n/a 30 4145 4157 4206 N
+ S N M e n/a 30 4145 4157 4206 N
+ S N M i n/a 30 4145 4157 4206 N
+ S N M s n/a 30 4145 4157 4206 N
+ S N N b n/a 30 4145 4157 4216 N
+ S N N e n/a 30 4145 4157 4216 N
+ S N N i n/a 30 4145 4157 4216 N
+ S N N s n/a 30 4145 4157 4216 N
+ S N NG e n/a 30 4145 4157 4204 N
+ S N NG s n/a 30 4145 4157 4204 N
+ S N OW b n/a 30 4145 4200 4236 N
+ S N OW e n/a 30 4145 4200 4233 N
+ S N OW i n/a 30 4145 4200 4236 N
+ S N OW s n/a 30 4145 4200 4236 N
+ S N OY b n/a 30 4145 4200 4234 N
+ S N OY e n/a 30 4145 4200 4233 N
+ S N OY s n/a 30 4145 4200 4234 N
+ S N P b n/a 30 4145 4157 4224 N
+ S N P e n/a 30 4145 4157 4225 N
+ S N P i n/a 30 4145 4157 4224 N
+ S N P s n/a 30 4145 4157 4224 N
+ S N R b n/a 30 4145 4157 4205 N
+ S N R e n/a 30 4145 4157 4205 N
+ S N R i n/a 30 4145 4157 4205 N
+ S N R s n/a 30 4145 4157 4205 N
+ S N S b n/a 30 4145 4157 4215 N
+ S N S e n/a 30 4145 4157 4215 N
+ S N S s n/a 30 4145 4157 4215 N
+ S N SH b n/a 30 4145 4157 4213 N
+ S N SH e n/a 30 4145 4157 4213 N
+ S N SH i n/a 30 4145 4157 4213 N
+ S N SH s n/a 30 4145 4157 4213 N
+ S N SIL e n/a 30 4146 4178 4211 N
+ S N SIL s n/a 30 4146 4178 4211 N
+ S N T b n/a 30 4145 4157 4223 N
+ S N T e n/a 30 4145 4157 4218 N
+ S N T i n/a 30 4145 4157 4218 N
+ S N T s n/a 30 4145 4157 4218 N
+ S N TH b n/a 30 4145 4157 4212 N
+ S N TH e n/a 30 4145 4157 4212 N
+ S N TH s n/a 30 4145 4157 4212 N
+ S N UH b n/a 30 4145 4201 4242 N
+ S N UH e n/a 30 4145 4201 4242 N
+ S N UH s n/a 30 4145 4201 4242 N
+ S N UW b n/a 30 4145 4201 4242 N
+ S N UW e n/a 30 4145 4201 4242 N
+ S N UW i n/a 30 4145 4201 4242 N
+ S N UW s n/a 30 4145 4201 4242 N
+ S N V b n/a 30 4145 4157 4216 N
+ S N V e n/a 30 4145 4157 4216 N
+ S N V i n/a 30 4145 4157 4216 N
+ S N V s n/a 30 4145 4157 4216 N
+ S N W b n/a 30 4145 4157 4209 N
+ S N W e n/a 30 4145 4157 4209 N
+ S N W i n/a 30 4145 4157 4209 N
+ S N W s n/a 30 4145 4157 4209 N
+ S N Y b n/a 30 4145 4157 4217 N
+ S N Y e n/a 30 4145 4157 4217 N
+ S N Y i n/a 30 4145 4157 4217 N
+ S N Y s n/a 30 4145 4157 4217 N
+ S N Z e n/a 30 4145 4157 4211 N
+ S N Z s n/a 30 4145 4157 4211 N
+ S N ZH e n/a 30 4145 4157 4216 N
+ S N ZH s n/a 30 4145 4157 4216 N
+ S NG AA b n/a 30 4147 4188 4232 N
+ S NG AA e n/a 30 4147 4200 4233 N
+ S NG AA i n/a 30 4147 4200 4232 N
+ S NG AA s n/a 30 4147 4200 4232 N
+ S NG AE b n/a 30 4147 4188 4229 N
+ S NG AE e n/a 30 4147 4200 4231 N
+ S NG AE i n/a 30 4147 4200 4229 N
+ S NG AE s n/a 30 4147 4200 4229 N
+ S NG AH b n/a 30 4147 4188 4235 N
+ S NG AH e n/a 30 4147 4199 4244 N
+ S NG AH i n/a 30 4147 4199 4243 N
+ S NG AH s n/a 30 4147 4199 4244 N
+ S NG AO b n/a 30 4147 4188 4234 N
+ S NG AO e n/a 30 4147 4200 4233 N
+ S NG AO i n/a 30 4147 4200 4234 N
+ S NG AO s n/a 30 4147 4200 4234 N
+ S NG AW b n/a 30 4147 4188 4229 N
+ S NG AW e n/a 30 4147 4200 4231 N
+ S NG AW s n/a 30 4147 4200 4229 N
+ S NG AY b n/a 30 4147 4188 4232 N
+ S NG AY e n/a 30 4147 4200 4233 N
+ S NG AY i n/a 30 4147 4200 4232 N
+ S NG AY s n/a 30 4147 4200 4232 N
+ S NG B b n/a 30 4147 4156 4224 N
+ S NG B e n/a 30 4147 4156 4225 N
+ S NG B s n/a 30 4147 4156 4224 N
+ S NG CH e n/a 30 4147 4155 4218 N
+ S NG CH s n/a 30 4147 4155 4218 N
+ S NG D b n/a 30 4147 4156 4223 N
+ S NG D e n/a 30 4147 4156 4218 N
+ S NG D s n/a 30 4147 4156 4218 N
+ S NG DH e n/a 30 4147 4154 4212 N
+ S NG DH s n/a 30 4147 4154 4212 N
+ S NG EH b n/a 30 4147 4188 4226 N
+ S NG EH e n/a 30 4147 4200 4231 N
+ S NG EH i n/a 30 4147 4200 4226 N
+ S NG EH s n/a 30 4147 4200 4226 N
+ S NG ER b n/a 30 4147 4188 4245 N
+ S NG ER e n/a 30 4147 4199 4246 N
+ S NG ER s n/a 30 4147 4199 4245 N
+ S NG EY b n/a 30 4147 4188 4230 N
+ S NG EY e n/a 30 4147 4200 4231 N
+ S NG EY s n/a 30 4147 4200 4230 N
+ S NG F b n/a 30 4147 4155 4214 N
+ S NG F e n/a 30 4147 4155 4214 N
+ S NG F i n/a 30 4147 4155 4214 N
+ S NG F s n/a 30 4147 4155 4214 N
+ S NG G e n/a 30 4147 4155 4208 N
+ S NG G s n/a 30 4147 4155 4207 N
+ S NG HH b n/a 30 4147 4155 4213 N
+ S NG HH e n/a 30 4147 4155 4213 N
+ S NG HH s n/a 30 4147 4155 4213 N
+ S NG IH b n/a 30 4147 4187 4239 N
+ S NG IH e n/a 30 4147 4201 4240 N
+ S NG IH s n/a 30 4147 4201 4240 N
+ S NG IY b n/a 30 4147 4187 4247 N
+ S NG IY e n/a 30 4147 4201 4247 N
+ S NG IY s n/a 30 4147 4201 4247 N
+ S NG JH b n/a 30 4147 4155 4223 N
+ S NG JH e n/a 30 4147 4155 4218 N
+ S NG JH s n/a 30 4147 4155 4218 N
+ S NG K b n/a 30 4147 4155 4207 N
+ S NG K e n/a 30 4147 4155 4208 N
+ S NG K s n/a 30 4147 4155 4207 N
+ S NG L b n/a 30 4147 4154 4204 N
+ S NG L e n/a 30 4147 4154 4204 N
+ S NG L s n/a 30 4147 4154 4204 N
+ S NG M b n/a 30 4147 4156 4206 N
+ S NG M e n/a 30 4147 4156 4206 N
+ S NG M s n/a 30 4147 4156 4206 N
+ S NG N b n/a 30 4147 4156 4216 N
+ S NG N e n/a 30 4147 4156 4216 N
+ S NG N s n/a 30 4147 4156 4216 N
+ S NG NG e n/a 30 4147 4155 4204 N
+ S NG NG s n/a 30 4147 4155 4204 N
+ S NG OW b n/a 30 4147 4188 4236 N
+ S NG OW e n/a 30 4147 4200 4233 N
+ S NG OW s n/a 30 4147 4200 4236 N
+ S NG OY b n/a 30 4147 4188 4234 N
+ S NG OY e n/a 30 4147 4200 4233 N
+ S NG OY s n/a 30 4147 4200 4234 N
+ S NG P b n/a 30 4147 4156 4224 N
+ S NG P e n/a 30 4147 4156 4225 N
+ S NG P i n/a 30 4147 4156 4224 N
+ S NG P s n/a 30 4147 4156 4224 N
+ S NG R b n/a 30 4147 4153 4205 N
+ S NG R e n/a 30 4147 4153 4205 N
+ S NG R s n/a 30 4147 4153 4205 N
+ S NG S b n/a 30 4147 4155 4215 N
+ S NG S e n/a 30 4147 4155 4215 N
+ S NG S s n/a 30 4147 4155 4215 N
+ S NG SH b n/a 30 4147 4155 4213 N
+ S NG SH e n/a 30 4147 4155 4213 N
+ S NG SH s n/a 30 4147 4155 4213 N
+ S NG SIL e n/a 30 4147 4177 4211 N
+ S NG SIL s n/a 30 4147 4177 4211 N
+ S NG T b n/a 30 4147 4156 4223 N
+ S NG T e n/a 30 4147 4156 4218 N
+ S NG T i n/a 30 4147 4156 4218 N
+ S NG T s n/a 30 4147 4156 4218 N
+ S NG TH b n/a 30 4147 4154 4212 N
+ S NG TH e n/a 30 4147 4154 4212 N
+ S NG TH s n/a 30 4147 4154 4212 N
+ S NG UH b n/a 30 4147 4187 4242 N
+ S NG UH e n/a 30 4147 4201 4242 N
+ S NG UH s n/a 30 4147 4201 4242 N
+ S NG UW b n/a 30 4147 4187 4242 N
+ S NG UW e n/a 30 4147 4201 4242 N
+ S NG UW i n/a 30 4147 4201 4242 N
+ S NG UW s n/a 30 4147 4201 4242 N
+ S NG V b n/a 30 4147 4155 4216 N
+ S NG V e n/a 30 4147 4155 4216 N
+ S NG V s n/a 30 4147 4155 4216 N
+ S NG W b n/a 30 4147 4155 4209 N
+ S NG W e n/a 30 4147 4155 4209 N
+ S NG W s n/a 30 4147 4155 4209 N
+ S NG Y b n/a 30 4147 4155 4217 N
+ S NG Y e n/a 30 4147 4155 4217 N
+ S NG Y s n/a 30 4147 4155 4217 N
+ S NG Z e n/a 30 4147 4155 4211 N
+ S NG Z s n/a 30 4147 4155 4211 N
+ S NG ZH e n/a 30 4147 4155 4216 N
+ S NG ZH s n/a 30 4147 4155 4216 N
+ S OW AA b n/a 30 4115 4188 4232 N
+ S OW AA e n/a 30 4115 4196 4233 N
+ S OW AA i n/a 30 4115 4194 4232 N
+ S OW AA s n/a 30 4115 4196 4232 N
+ S OW AE b n/a 30 4115 4188 4229 N
+ S OW AE e n/a 30 4115 4196 4231 N
+ S OW AE i n/a 30 4115 4194 4229 N
+ S OW AE s n/a 30 4115 4196 4229 N
+ S OW AH b n/a 30 4115 4188 4235 N
+ S OW AH e n/a 30 4115 4196 4244 N
+ S OW AH i n/a 30 4115 4194 4243 N
+ S OW AH s n/a 30 4115 4196 4244 N
+ S OW AO b n/a 30 4115 4188 4234 N
+ S OW AO e n/a 30 4115 4196 4233 N
+ S OW AO i n/a 30 4115 4194 4234 N
+ S OW AO s n/a 30 4115 4196 4234 N
+ S OW AW b n/a 30 4115 4188 4229 N
+ S OW AW e n/a 30 4115 4196 4231 N
+ S OW AW i n/a 30 4115 4194 4229 N
+ S OW AW s n/a 30 4115 4196 4229 N
+ S OW AY b n/a 30 4115 4188 4232 N
+ S OW AY e n/a 30 4115 4196 4233 N
+ S OW AY i n/a 30 4115 4194 4232 N
+ S OW AY s n/a 30 4115 4196 4232 N
+ S OW B b n/a 30 4115 4153 4224 N
+ S OW B e n/a 30 4115 4153 4225 N
+ S OW B i n/a 30 4115 4153 4224 N
+ S OW B s n/a 30 4115 4153 4224 N
+ S OW CH e n/a 30 4115 4153 4220 N
+ S OW CH i n/a 30 4115 4153 4220 N
+ S OW CH s n/a 30 4115 4153 4220 N
+ S OW D b n/a 30 4115 4153 4223 N
+ S OW D e n/a 30 4115 4153 4220 N
+ S OW D s n/a 30 4115 4153 4220 N
+ S OW DH e n/a 30 4115 4153 4212 N
+ S OW DH s n/a 30 4115 4153 4212 N
+ S OW EH b n/a 30 4115 4188 4226 N
+ S OW EH e n/a 30 4115 4196 4231 N
+ S OW EH i n/a 30 4115 4194 4226 N
+ S OW EH s n/a 30 4115 4196 4226 N
+ S OW ER b n/a 30 4115 4188 4245 N
+ S OW ER e n/a 30 4115 4196 4246 N
+ S OW ER i n/a 30 4115 4194 4245 N
+ S OW ER s n/a 30 4115 4196 4245 N
+ S OW EY b n/a 30 4115 4188 4230 N
+ S OW EY e n/a 30 4115 4196 4231 N
+ S OW EY i n/a 30 4115 4194 4230 N
+ S OW EY s n/a 30 4115 4196 4230 N
+ S OW F b n/a 30 4115 4153 4214 N
+ S OW F e n/a 30 4115 4153 4214 N
+ S OW F i n/a 30 4115 4153 4214 N
+ S OW F s n/a 30 4115 4153 4214 N
+ S OW G e n/a 30 4115 4153 4208 N
+ S OW G s n/a 30 4115 4153 4207 N
+ S OW HH b n/a 30 4115 4153 4213 N
+ S OW HH e n/a 30 4115 4153 4213 N
+ S OW HH s n/a 30 4115 4153 4213 N
+ S OW IH b n/a 30 4115 4187 4239 N
+ S OW IH e n/a 30 4115 4196 4240 N
+ S OW IH i n/a 30 4115 4194 4240 N
+ S OW IH s n/a 30 4115 4196 4240 N
+ S OW IY b n/a 30 4115 4187 4247 N
+ S OW IY e n/a 30 4115 4196 4247 N
+ S OW IY i n/a 30 4115 4194 4247 N
+ S OW IY s n/a 30 4115 4196 4247 N
+ S OW JH b n/a 30 4115 4153 4223 N
+ S OW JH e n/a 30 4115 4153 4220 N
+ S OW JH s n/a 30 4115 4153 4220 N
+ S OW K b n/a 30 4115 4153 4207 N
+ S OW K e n/a 30 4115 4153 4208 N
+ S OW K i n/a 30 4115 4153 4207 N
+ S OW K s n/a 30 4115 4153 4207 N
+ S OW L b n/a 30 4115 4153 4204 N
+ S OW L e n/a 30 4115 4153 4204 N
+ S OW L i n/a 30 4115 4153 4204 N
+ S OW L s n/a 30 4115 4153 4204 N
+ S OW M b n/a 30 4115 4153 4206 N
+ S OW M e n/a 30 4115 4153 4206 N
+ S OW M i n/a 30 4115 4153 4206 N
+ S OW M s n/a 30 4115 4153 4206 N
+ S OW N b n/a 30 4115 4153 4216 N
+ S OW N e n/a 30 4115 4153 4216 N
+ S OW N i n/a 30 4115 4153 4216 N
+ S OW N s n/a 30 4115 4153 4216 N
+ S OW NG e n/a 30 4115 4153 4204 N
+ S OW NG s n/a 30 4115 4153 4204 N
+ S OW OW b n/a 30 4115 4188 4236 N
+ S OW OW e n/a 30 4115 4196 4233 N
+ S OW OW i n/a 30 4115 4194 4236 N
+ S OW OW s n/a 30 4115 4196 4236 N
+ S OW OY b n/a 30 4115 4188 4234 N
+ S OW OY e n/a 30 4115 4196 4233 N
+ S OW OY i n/a 30 4115 4194 4234 N
+ S OW OY s n/a 30 4115 4196 4234 N
+ S OW P b n/a 30 4115 4153 4224 N
+ S OW P e n/a 30 4115 4153 4225 N
+ S OW P i n/a 30 4115 4153 4224 N
+ S OW P s n/a 30 4115 4153 4224 N
+ S OW R b n/a 30 4115 4153 4205 N
+ S OW R e n/a 30 4115 4153 4205 N
+ S OW R i n/a 30 4115 4153 4205 N
+ S OW R s n/a 30 4115 4153 4205 N
+ S OW S b n/a 30 4115 4153 4215 N
+ S OW S e n/a 30 4115 4153 4215 N
+ S OW S s n/a 30 4115 4153 4215 N
+ S OW SH b n/a 30 4115 4153 4213 N
+ S OW SH e n/a 30 4115 4153 4213 N
+ S OW SH s n/a 30 4115 4153 4213 N
+ S OW SIL e n/a 30 4115 4176 4211 N
+ S OW SIL s n/a 30 4115 4176 4211 N
+ S OW T b n/a 30 4115 4153 4223 N
+ S OW T e n/a 30 4115 4153 4220 N
+ S OW T i n/a 30 4115 4153 4220 N
+ S OW T s n/a 30 4115 4153 4220 N
+ S OW TH b n/a 30 4115 4153 4212 N
+ S OW TH e n/a 30 4115 4153 4212 N
+ S OW TH s n/a 30 4115 4153 4212 N
+ S OW UH b n/a 30 4115 4187 4242 N
+ S OW UH e n/a 30 4115 4196 4242 N
+ S OW UH i n/a 30 4115 4194 4242 N
+ S OW UH s n/a 30 4115 4196 4242 N
+ S OW UW b n/a 30 4115 4187 4242 N
+ S OW UW e n/a 30 4115 4196 4242 N
+ S OW UW i n/a 30 4115 4194 4242 N
+ S OW UW s n/a 30 4115 4196 4242 N
+ S OW V b n/a 30 4115 4153 4216 N
+ S OW V e n/a 30 4115 4153 4216 N
+ S OW V s n/a 30 4115 4153 4216 N
+ S OW W b n/a 30 4115 4153 4209 N
+ S OW W e n/a 30 4115 4153 4209 N
+ S OW W i n/a 30 4115 4153 4209 N
+ S OW W s n/a 30 4115 4153 4209 N
+ S OW Y b n/a 30 4115 4153 4217 N
+ S OW Y e n/a 30 4115 4153 4217 N
+ S OW Y i n/a 30 4115 4153 4217 N
+ S OW Y s n/a 30 4115 4153 4217 N
+ S OW Z e n/a 30 4115 4153 4211 N
+ S OW Z s n/a 30 4115 4153 4211 N
+ S OW ZH e n/a 30 4115 4153 4216 N
+ S OW ZH s n/a 30 4115 4153 4216 N
+ S OY AA b n/a 30 4130 4190 4232 N
+ S OY AA e n/a 30 4130 4190 4233 N
+ S OY AA s n/a 30 4130 4190 4232 N
+ S OY AE b n/a 30 4130 4190 4229 N
+ S OY AE e n/a 30 4130 4190 4231 N
+ S OY AE s n/a 30 4130 4190 4229 N
+ S OY AH b n/a 30 4130 4190 4235 N
+ S OY AH e n/a 30 4130 4190 4244 N
+ S OY AH i n/a 30 4130 4190 4241 N
+ S OY AH s n/a 30 4130 4190 4244 N
+ S OY AO b n/a 30 4130 4190 4234 N
+ S OY AO e n/a 30 4130 4190 4233 N
+ S OY AO i n/a 30 4130 4190 4234 N
+ S OY AO s n/a 30 4130 4190 4234 N
+ S OY AW b n/a 30 4130 4190 4229 N
+ S OY AW e n/a 30 4130 4190 4231 N
+ S OY AW s n/a 30 4130 4190 4229 N
+ S OY AY b n/a 30 4130 4190 4232 N
+ S OY AY e n/a 30 4130 4190 4233 N
+ S OY AY s n/a 30 4130 4190 4232 N
+ S OY B b n/a 30 4130 4163 4225 N
+ S OY B e n/a 30 4130 4163 4225 N
+ S OY B s n/a 30 4130 4163 4225 N
+ S OY CH e n/a 30 4130 4163 4222 N
+ S OY CH i n/a 30 4130 4163 4222 N
+ S OY CH s n/a 30 4130 4163 4222 N
+ S OY D b n/a 30 4130 4163 4222 N
+ S OY D e n/a 30 4130 4163 4222 N
+ S OY D s n/a 30 4130 4163 4222 N
+ S OY DH e n/a 30 4130 4163 4212 N
+ S OY DH s n/a 30 4130 4163 4212 N
+ S OY EH b n/a 30 4130 4190 4227 N
+ S OY EH e n/a 30 4130 4190 4231 N
+ S OY EH s n/a 30 4130 4190 4227 N
+ S OY ER b n/a 30 4130 4190 4245 N
+ S OY ER e n/a 30 4130 4190 4246 N
+ S OY ER i n/a 30 4130 4190 4245 N
+ S OY ER s n/a 30 4130 4190 4245 N
+ S OY EY b n/a 30 4130 4190 4230 N
+ S OY EY e n/a 30 4130 4190 4231 N
+ S OY EY i n/a 30 4130 4190 4230 N
+ S OY EY s n/a 30 4130 4190 4230 N
+ S OY F b n/a 30 4130 4163 4214 N
+ S OY F e n/a 30 4130 4163 4214 N
+ S OY F i n/a 30 4130 4163 4214 N
+ S OY F s n/a 30 4130 4163 4214 N
+ S OY G e n/a 30 4130 4163 4208 N
+ S OY G s n/a 30 4130 4163 4208 N
+ S OY HH b n/a 30 4130 4163 4213 N
+ S OY HH e n/a 30 4130 4163 4213 N
+ S OY HH s n/a 30 4130 4163 4213 N
+ S OY IH b n/a 30 4130 4190 4239 N
+ S OY IH e n/a 30 4130 4190 4241 N
+ S OY IH i n/a 30 4130 4190 4241 N
+ S OY IH s n/a 30 4130 4190 4241 N
+ S OY IY b n/a 30 4130 4190 4247 N
+ S OY IY e n/a 30 4130 4190 4247 N
+ S OY IY i n/a 30 4130 4190 4247 N
+ S OY IY s n/a 30 4130 4190 4247 N
+ S OY JH b n/a 30 4130 4163 4222 N
+ S OY JH e n/a 30 4130 4163 4222 N
+ S OY JH i n/a 30 4130 4163 4222 N
+ S OY JH s n/a 30 4130 4163 4222 N
+ S OY K b n/a 30 4130 4163 4208 N
+ S OY K e n/a 30 4130 4163 4208 N
+ S OY K i n/a 30 4130 4163 4208 N
+ S OY K s n/a 30 4130 4163 4208 N
+ S OY L b n/a 30 4130 4163 4204 N
+ S OY L e n/a 30 4130 4163 4204 N
+ S OY L i n/a 30 4130 4163 4204 N
+ S OY L s n/a 30 4130 4163 4204 N
+ S OY M b n/a 30 4130 4163 4206 N
+ S OY M e n/a 30 4130 4163 4206 N
+ S OY M i n/a 30 4130 4163 4206 N
+ S OY M s n/a 30 4130 4163 4206 N
+ S OY N b n/a 30 4130 4163 4216 N
+ S OY N e n/a 30 4130 4163 4216 N
+ S OY N s n/a 30 4130 4163 4216 N
+ S OY NG e n/a 30 4130 4163 4204 N
+ S OY NG s n/a 30 4130 4163 4204 N
+ S OY OW b n/a 30 4130 4190 4236 N
+ S OY OW e n/a 30 4130 4190 4233 N
+ S OY OW i n/a 30 4130 4190 4236 N
+ S OY OW s n/a 30 4130 4190 4236 N
+ S OY OY b n/a 30 4130 4190 4234 N
+ S OY OY e n/a 30 4130 4190 4233 N
+ S OY OY s n/a 30 4130 4190 4234 N
+ S OY P b n/a 30 4130 4163 4225 N
+ S OY P e n/a 30 4130 4163 4225 N
+ S OY P s n/a 30 4130 4163 4225 N
+ S OY R b n/a 30 4130 4163 4205 N
+ S OY R e n/a 30 4130 4163 4205 N
+ S OY R s n/a 30 4130 4163 4205 N
+ S OY S b n/a 30 4130 4163 4215 N
+ S OY S e n/a 30 4130 4163 4215 N
+ S OY S s n/a 30 4130 4163 4215 N
+ S OY SH b n/a 30 4130 4163 4213 N
+ S OY SH e n/a 30 4130 4163 4213 N
+ S OY SH s n/a 30 4130 4163 4213 N
+ S OY SIL e n/a 30 4128 4174 4210 N
+ S OY SIL s n/a 30 4128 4174 4210 N
+ S OY T b n/a 30 4130 4163 4222 N
+ S OY T e n/a 30 4130 4163 4222 N
+ S OY T i n/a 30 4130 4163 4222 N
+ S OY T s n/a 30 4130 4163 4222 N
+ S OY TH b n/a 30 4130 4163 4212 N
+ S OY TH e n/a 30 4130 4163 4212 N
+ S OY TH s n/a 30 4130 4163 4212 N
+ S OY UH b n/a 30 4130 4190 4242 N
+ S OY UH e n/a 30 4130 4190 4242 N
+ S OY UH s n/a 30 4130 4190 4242 N
+ S OY UW b n/a 30 4130 4190 4242 N
+ S OY UW e n/a 30 4130 4190 4242 N
+ S OY UW s n/a 30 4130 4190 4242 N
+ S OY V b n/a 30 4130 4163 4216 N
+ S OY V e n/a 30 4130 4163 4216 N
+ S OY V s n/a 30 4130 4163 4216 N
+ S OY W b n/a 30 4130 4163 4209 N
+ S OY W e n/a 30 4130 4163 4209 N
+ S OY W i n/a 30 4130 4163 4209 N
+ S OY W s n/a 30 4130 4163 4209 N
+ S OY Y b n/a 30 4130 4163 4217 N
+ S OY Y e n/a 30 4130 4163 4217 N
+ S OY Y s n/a 30 4130 4163 4217 N
+ S OY Z e n/a 30 4130 4163 4210 N
+ S OY Z s n/a 30 4130 4163 4210 N
+ S OY ZH e n/a 30 4130 4163 4216 N
+ S OY ZH s n/a 30 4130 4163 4216 N
+ S P AA b n/a 30 4139 4183 4232 N
+ S P AA e n/a 30 4139 4183 4233 N
+ S P AA i n/a 30 4139 4183 4232 N
+ S P AA s n/a 30 4139 4183 4232 N
+ S P AE b n/a 30 4139 4183 4229 N
+ S P AE e n/a 30 4139 4183 4231 N
+ S P AE i n/a 30 4139 4183 4229 N
+ S P AE s n/a 30 4139 4183 4229 N
+ S P AH b n/a 30 4139 4183 4235 N
+ S P AH e n/a 30 4139 4183 4244 N
+ S P AH i n/a 30 4139 4183 4243 N
+ S P AH s n/a 30 4139 4183 4244 N
+ S P AO b n/a 30 4139 4183 4234 N
+ S P AO e n/a 30 4139 4183 4233 N
+ S P AO i n/a 30 4139 4183 4234 N
+ S P AO s n/a 30 4139 4183 4234 N
+ S P AW b n/a 30 4139 4183 4229 N
+ S P AW e n/a 30 4139 4183 4231 N
+ S P AW s n/a 30 4139 4183 4229 N
+ S P AY b n/a 30 4139 4183 4232 N
+ S P AY e n/a 30 4139 4183 4233 N
+ S P AY i n/a 30 4139 4183 4232 N
+ S P AY s n/a 30 4139 4183 4232 N
+ S P B b n/a 30 4139 4166 4224 N
+ S P B e n/a 30 4139 4169 4225 N
+ S P B i n/a 30 4139 4169 4224 N
+ S P B s n/a 30 4139 4169 4224 N
+ S P CH e n/a 30 4139 4169 4222 N
+ S P CH s n/a 30 4139 4169 4222 N
+ S P D b n/a 30 4139 4166 4223 N
+ S P D e n/a 30 4139 4166 4222 N
+ S P D s n/a 30 4139 4166 4222 N
+ S P DH e n/a 30 4139 4167 4212 N
+ S P DH s n/a 30 4139 4168 4212 N
+ S P EH b n/a 30 4139 4183 4226 N
+ S P EH e n/a 30 4139 4183 4231 N
+ S P EH i n/a 30 4139 4183 4229 N
+ S P EH s n/a 30 4139 4183 4226 N
+ S P ER b n/a 30 4139 4183 4245 N
+ S P ER e n/a 30 4139 4183 4246 N
+ S P ER i n/a 30 4139 4183 4245 N
+ S P ER s n/a 30 4139 4183 4245 N
+ S P EY b n/a 30 4139 4183 4230 N
+ S P EY e n/a 30 4139 4183 4231 N
+ S P EY i n/a 30 4139 4183 4230 N
+ S P EY s n/a 30 4139 4183 4230 N
+ S P F b n/a 30 4139 4168 4214 N
+ S P F e n/a 30 4139 4169 4214 N
+ S P F s n/a 30 4139 4169 4214 N
+ S P G e n/a 30 4139 4170 4208 N
+ S P G i n/a 30 4139 4170 4207 N
+ S P G s n/a 30 4139 4170 4207 N
+ S P HH b n/a 30 4139 4168 4213 N
+ S P HH e n/a 30 4139 4169 4213 N
+ S P HH i n/a 30 4139 4169 4213 N
+ S P HH s n/a 30 4139 4169 4213 N
+ S P IH b n/a 30 4139 4183 4239 N
+ S P IH e n/a 30 4139 4183 4240 N
+ S P IH i n/a 30 4139 4183 4239 N
+ S P IH s n/a 30 4139 4183 4240 N
+ S P IY b n/a 30 4139 4183 4247 N
+ S P IY e n/a 30 4139 4183 4247 N
+ S P IY i n/a 30 4139 4183 4247 N
+ S P IY s n/a 30 4139 4183 4247 N
+ S P JH b n/a 30 4139 4168 4223 N
+ S P JH e n/a 30 4139 4169 4222 N
+ S P JH s n/a 30 4139 4169 4222 N
+ S P K b n/a 30 4139 4168 4207 N
+ S P K e n/a 30 4139 4170 4208 N
+ S P K i n/a 30 4139 4170 4207 N
+ S P K s n/a 30 4139 4170 4207 N
+ S P L b n/a 30 4139 4167 4204 N
+ S P L e n/a 30 4139 4169 4204 N
+ S P L i n/a 30 4139 4169 4204 N
+ S P L s n/a 30 4139 4169 4204 N
+ S P M b n/a 30 4139 4166 4206 N
+ S P M e n/a 30 4139 4169 4206 N
+ S P M i n/a 30 4139 4169 4206 N
+ S P M s n/a 30 4139 4169 4206 N
+ S P N b n/a 30 4139 4166 4216 N
+ S P N e n/a 30 4139 4166 4216 N
+ S P N s n/a 30 4139 4166 4216 N
+ S P NG e n/a 30 4139 4170 4204 N
+ S P NG s n/a 30 4139 4170 4204 N
+ S P OW b n/a 30 4139 4183 4236 N
+ S P OW e n/a 30 4139 4183 4233 N
+ S P OW i n/a 30 4139 4183 4236 N
+ S P OW s n/a 30 4139 4183 4236 N
+ S P OY b n/a 30 4139 4183 4234 N
+ S P OY e n/a 30 4139 4183 4233 N
+ S P OY i n/a 30 4139 4183 4234 N
+ S P OY s n/a 30 4139 4183 4234 N
+ S P P b n/a 30 4139 4166 4224 N
+ S P P e n/a 30 4139 4169 4225 N
+ S P P i n/a 30 4139 4169 4224 N
+ S P P s n/a 30 4139 4169 4224 N
+ S P R b n/a 30 4139 4167 4205 N
+ S P R e n/a 30 4139 4170 4205 N
+ S P R s n/a 30 4139 4170 4205 N
+ S P S b n/a 30 4139 4168 4215 N
+ S P S e n/a 30 4139 4167 4215 N
+ S P S s n/a 30 4139 4168 4215 N
+ S P SH b n/a 30 4139 4168 4213 N
+ S P SH e n/a 30 4139 4169 4213 N
+ S P SH s n/a 30 4139 4169 4213 N
+ S P SIL e n/a 30 4139 4177 4211 N
+ S P SIL s n/a 30 4139 4177 4211 N
+ S P T b n/a 30 4139 4166 4223 N
+ S P T e n/a 30 4139 4166 4222 N
+ S P T i n/a 30 4139 4166 4222 N
+ S P T s n/a 30 4139 4166 4222 N
+ S P TH b n/a 30 4139 4168 4212 N
+ S P TH e n/a 30 4139 4167 4212 N
+ S P TH s n/a 30 4139 4168 4212 N
+ S P UH b n/a 30 4139 4183 4242 N
+ S P UH e n/a 30 4139 4183 4242 N
+ S P UH s n/a 30 4139 4183 4242 N
+ S P UW b n/a 30 4139 4183 4242 N
+ S P UW e n/a 30 4139 4183 4242 N
+ S P UW i n/a 30 4139 4183 4242 N
+ S P UW s n/a 30 4139 4183 4242 N
+ S P V b n/a 30 4139 4168 4216 N
+ S P V e n/a 30 4139 4169 4216 N
+ S P V s n/a 30 4139 4169 4216 N
+ S P W b n/a 30 4139 4168 4209 N
+ S P W e n/a 30 4139 4170 4209 N
+ S P W i n/a 30 4139 4170 4209 N
+ S P W s n/a 30 4139 4170 4209 N
+ S P Y b n/a 30 4139 4168 4217 N
+ S P Y e n/a 30 4139 4169 4217 N
+ S P Y i n/a 30 4139 4169 4217 N
+ S P Y s n/a 30 4139 4169 4217 N
+ S P Z e n/a 30 4139 4167 4211 N
+ S P Z s n/a 30 4139 4168 4211 N
+ S P ZH e n/a 30 4139 4169 4216 N
+ S P ZH s n/a 30 4139 4169 4216 N
+ S R AA b n/a 30 4132 4203 4232 N
+ S R AA e n/a 30 4132 4203 4233 N
+ S R AA i n/a 30 4132 4203 4232 N
+ S R AA s n/a 30 4132 4203 4232 N
+ S R AE b n/a 30 4132 4203 4229 N
+ S R AE e n/a 30 4132 4203 4231 N
+ S R AE i n/a 30 4132 4203 4229 N
+ S R AE s n/a 30 4132 4203 4229 N
+ S R AH b n/a 30 4132 4203 4235 N
+ S R AH e n/a 30 4132 4202 4244 N
+ S R AH i n/a 30 4132 4202 4243 N
+ S R AH s n/a 30 4132 4202 4244 N
+ S R AO b n/a 30 4132 4203 4234 N
+ S R AO e n/a 30 4132 4203 4233 N
+ S R AO i n/a 30 4132 4203 4234 N
+ S R AO s n/a 30 4132 4203 4234 N
+ S R AW b n/a 30 4132 4203 4229 N
+ S R AW e n/a 30 4132 4203 4231 N
+ S R AW s n/a 30 4132 4203 4229 N
+ S R AY b n/a 30 4132 4203 4232 N
+ S R AY e n/a 30 4132 4203 4233 N
+ S R AY i n/a 30 4132 4203 4232 N
+ S R AY s n/a 30 4132 4203 4232 N
+ S R B b n/a 30 4132 4165 4224 N
+ S R B e n/a 30 4132 4165 4225 N
+ S R B i n/a 30 4132 4165 4224 N
+ S R B s n/a 30 4132 4165 4224 N
+ S R CH e n/a 30 4132 4165 4220 N
+ S R CH s n/a 30 4132 4165 4220 N
+ S R D b n/a 30 4132 4165 4223 N
+ S R D e n/a 30 4132 4165 4220 N
+ S R D i n/a 30 4132 4164 4220 N
+ S R D s n/a 30 4132 4165 4220 N
+ S R DH e n/a 30 4132 4165 4212 N
+ S R DH s n/a 30 4132 4165 4212 N
+ S R EH b n/a 30 4132 4203 4226 N
+ S R EH e n/a 30 4132 4203 4231 N
+ S R EH i n/a 30 4132 4203 4226 N
+ S R EH s n/a 30 4132 4203 4226 N
+ S R ER b n/a 30 4132 4203 4245 N
+ S R ER e n/a 30 4132 4202 4246 N
+ S R ER i n/a 30 4132 4202 4245 N
+ S R ER s n/a 30 4132 4202 4245 N
+ S R EY b n/a 30 4132 4203 4230 N
+ S R EY e n/a 30 4132 4203 4231 N
+ S R EY i n/a 30 4132 4203 4230 N
+ S R EY s n/a 30 4132 4203 4230 N
+ S R F b n/a 30 4132 4165 4214 N
+ S R F e n/a 30 4132 4165 4214 N
+ S R F i n/a 30 4132 4165 4214 N
+ S R F s n/a 30 4132 4165 4214 N
+ S R G e n/a 30 4132 4165 4208 N
+ S R G i n/a 30 4132 4165 4207 N
+ S R G s n/a 30 4132 4165 4207 N
+ S R HH b n/a 30 4132 4165 4213 N
+ S R HH e n/a 30 4132 4165 4213 N
+ S R HH i n/a 30 4132 4165 4213 N
+ S R HH s n/a 30 4132 4165 4213 N
+ S R IH b n/a 30 4132 4203 4239 N
+ S R IH e n/a 30 4132 4202 4240 N
+ S R IH i n/a 30 4132 4202 4240 N
+ S R IH s n/a 30 4132 4202 4240 N
+ S R IY b n/a 30 4132 4203 4247 N
+ S R IY e n/a 30 4132 4203 4247 N
+ S R IY i n/a 30 4132 4203 4247 N
+ S R IY s n/a 30 4132 4203 4247 N
+ S R JH b n/a 30 4132 4165 4223 N
+ S R JH e n/a 30 4132 4165 4220 N
+ S R JH s n/a 30 4132 4165 4220 N
+ S R K b n/a 30 4132 4165 4207 N
+ S R K e n/a 30 4132 4165 4208 N
+ S R K i n/a 30 4132 4165 4207 N
+ S R K s n/a 30 4132 4165 4207 N
+ S R L b n/a 30 4132 4165 4204 N
+ S R L e n/a 30 4132 4165 4204 N
+ S R L i n/a 30 4132 4165 4204 N
+ S R L s n/a 30 4132 4165 4204 N
+ S R M b n/a 30 4132 4165 4206 N
+ S R M e n/a 30 4132 4165 4206 N
+ S R M i n/a 30 4132 4165 4206 N
+ S R M s n/a 30 4132 4165 4206 N
+ S R N b n/a 30 4132 4165 4216 N
+ S R N e n/a 30 4132 4165 4216 N
+ S R N i n/a 30 4132 4164 4216 N
+ S R N s n/a 30 4132 4165 4216 N
+ S R NG e n/a 30 4132 4165 4204 N
+ S R NG s n/a 30 4132 4165 4204 N
+ S R OW b n/a 30 4132 4203 4236 N
+ S R OW e n/a 30 4132 4203 4233 N
+ S R OW i n/a 30 4132 4203 4236 N
+ S R OW s n/a 30 4132 4203 4236 N
+ S R OY b n/a 30 4132 4203 4234 N
+ S R OY e n/a 30 4132 4203 4233 N
+ S R OY s n/a 30 4132 4203 4234 N
+ S R P b n/a 30 4132 4165 4224 N
+ S R P e n/a 30 4132 4165 4225 N
+ S R P i n/a 30 4132 4165 4224 N
+ S R P s n/a 30 4132 4165 4224 N
+ S R R b n/a 30 4132 4165 4205 N
+ S R R e n/a 30 4132 4165 4205 N
+ S R R i n/a 30 4132 4165 4205 N
+ S R R s n/a 30 4132 4165 4205 N
+ S R S b n/a 30 4132 4165 4215 N
+ S R S e n/a 30 4132 4165 4215 N
+ S R S s n/a 30 4132 4165 4215 N
+ S R SH b n/a 30 4132 4165 4213 N
+ S R SH e n/a 30 4132 4165 4213 N
+ S R SH i n/a 30 4132 4165 4213 N
+ S R SH s n/a 30 4132 4165 4213 N
+ S R SIL e n/a 30 4132 4177 4211 N
+ S R SIL s n/a 30 4132 4177 4211 N
+ S R T b n/a 30 4132 4165 4223 N
+ S R T e n/a 30 4132 4165 4220 N
+ S R T i n/a 30 4132 4164 4220 N
+ S R T s n/a 30 4132 4165 4220 N
+ S R TH b n/a 30 4132 4165 4212 N
+ S R TH e n/a 30 4132 4165 4212 N
+ S R TH s n/a 30 4132 4165 4212 N
+ S R UH b n/a 30 4132 4203 4242 N
+ S R UH e n/a 30 4132 4203 4242 N
+ S R UH i n/a 30 4132 4203 4242 N
+ S R UH s n/a 30 4132 4203 4242 N
+ S R UW b n/a 30 4132 4203 4242 N
+ S R UW e n/a 30 4132 4203 4242 N
+ S R UW i n/a 30 4132 4203 4242 N
+ S R UW s n/a 30 4132 4203 4242 N
+ S R V b n/a 30 4132 4165 4216 N
+ S R V e n/a 30 4132 4165 4216 N
+ S R V i n/a 30 4132 4165 4216 N
+ S R V s n/a 30 4132 4165 4216 N
+ S R W b n/a 30 4132 4165 4209 N
+ S R W e n/a 30 4132 4165 4209 N
+ S R W i n/a 30 4132 4165 4209 N
+ S R W s n/a 30 4132 4165 4209 N
+ S R Y b n/a 30 4132 4165 4217 N
+ S R Y e n/a 30 4132 4165 4217 N
+ S R Y s n/a 30 4132 4165 4217 N
+ S R Z e n/a 30 4132 4165 4211 N
+ S R Z s n/a 30 4132 4165 4211 N
+ S R ZH e n/a 30 4132 4165 4216 N
+ S R ZH s n/a 30 4132 4165 4216 N
+ S S AA b n/a 30 4137 4179 4232 N
+ S S AA e n/a 30 4137 4186 4233 N
+ S S AA s n/a 30 4137 4179 4232 N
+ S S AE b n/a 30 4137 4179 4229 N
+ S S AE e n/a 30 4137 4186 4231 N
+ S S AE s n/a 30 4137 4179 4229 N
+ S S AH b n/a 30 4137 4179 4235 N
+ S S AH e n/a 30 4137 4186 4244 N
+ S S AH s n/a 30 4137 4179 4244 N
+ S S AO b n/a 30 4137 4180 4234 N
+ S S AO e n/a 30 4137 4186 4233 N
+ S S AO s n/a 30 4137 4180 4234 N
+ S S AW b n/a 30 4137 4179 4229 N
+ S S AW e n/a 30 4137 4186 4231 N
+ S S AW s n/a 30 4137 4179 4229 N
+ S S AY b n/a 30 4137 4179 4232 N
+ S S AY e n/a 30 4137 4186 4233 N
+ S S AY s n/a 30 4137 4179 4232 N
+ S S B b n/a 30 4137 4166 4224 N
+ S S B e n/a 30 4137 4169 4225 N
+ S S B s n/a 30 4137 4169 4224 N
+ S S CH e n/a 30 4137 4169 4218 N
+ S S CH i n/a 30 4137 4169 4218 N
+ S S CH s n/a 30 4137 4169 4218 N
+ S S D b n/a 30 4138 4166 4223 N
+ S S D e n/a 30 4138 4166 4218 N
+ S S D s n/a 30 4138 4166 4218 N
+ S S DH e n/a 30 4138 4167 4212 N
+ S S DH s n/a 30 4138 4168 4212 N
+ S S EH b n/a 30 4137 4179 4226 N
+ S S EH e n/a 30 4137 4186 4231 N
+ S S EH s n/a 30 4137 4179 4226 N
+ S S ER b n/a 30 4137 4180 4245 N
+ S S ER e n/a 30 4137 4186 4246 N
+ S S ER i n/a 30 4137 4180 4245 N
+ S S ER s n/a 30 4137 4180 4245 N
+ S S EY b n/a 30 4137 4179 4230 N
+ S S EY e n/a 30 4137 4186 4231 N
+ S S EY s n/a 30 4137 4179 4230 N
+ S S F b n/a 30 4137 4168 4214 N
+ S S F e n/a 30 4137 4169 4214 N
+ S S F s n/a 30 4137 4169 4214 N
+ S S G e n/a 30 4137 4170 4208 N
+ S S G s n/a 30 4137 4170 4207 N
+ S S HH b n/a 30 4137 4168 4213 N
+ S S HH e n/a 30 4137 4169 4213 N
+ S S HH s n/a 30 4137 4169 4213 N
+ S S IH b n/a 30 4137 4181 4239 N
+ S S IH e n/a 30 4137 4186 4240 N
+ S S IH i n/a 30 4137 4181 4239 N
+ S S IH s n/a 30 4137 4181 4240 N
+ S S IY b n/a 30 4137 4181 4247 N
+ S S IY e n/a 30 4137 4186 4247 N
+ S S IY i n/a 30 4137 4181 4247 N
+ S S IY s n/a 30 4137 4181 4247 N
+ S S JH b n/a 30 4137 4168 4223 N
+ S S JH e n/a 30 4137 4169 4218 N
+ S S JH s n/a 30 4137 4169 4218 N
+ S S K b n/a 30 4137 4168 4207 N
+ S S K e n/a 30 4137 4170 4208 N
+ S S K i n/a 30 4137 4170 4207 N
+ S S K s n/a 30 4137 4170 4207 N
+ S S L b n/a 30 4137 4167 4204 N
+ S S L e n/a 30 4137 4169 4204 N
+ S S L s n/a 30 4137 4169 4204 N
+ S S M b n/a 30 4137 4166 4206 N
+ S S M e n/a 30 4137 4169 4206 N
+ S S M s n/a 30 4137 4169 4206 N
+ S S N b n/a 30 4138 4166 4216 N
+ S S N e n/a 30 4138 4166 4216 N
+ S S N s n/a 30 4138 4166 4216 N
+ S S NG e n/a 30 4137 4170 4204 N
+ S S NG s n/a 30 4137 4170 4204 N
+ S S OW b n/a 30 4137 4180 4236 N
+ S S OW e n/a 30 4137 4186 4233 N
+ S S OW s n/a 30 4137 4180 4236 N
+ S S OY b n/a 30 4137 4180 4234 N
+ S S OY e n/a 30 4137 4186 4233 N
+ S S OY s n/a 30 4137 4180 4234 N
+ S S P b n/a 30 4137 4166 4224 N
+ S S P e n/a 30 4137 4169 4225 N
+ S S P i n/a 30 4137 4169 4224 N
+ S S P s n/a 30 4137 4169 4224 N
+ S S R b n/a 30 4137 4167 4205 N
+ S S R e n/a 30 4137 4170 4205 N
+ S S R i n/a 30 4137 4170 4205 N
+ S S R s n/a 30 4137 4170 4205 N
+ S S S b n/a 30 4138 4168 4215 N
+ S S S e n/a 30 4138 4167 4215 N
+ S S S s n/a 30 4138 4168 4215 N
+ S S SH b n/a 30 4137 4168 4213 N
+ S S SH e n/a 30 4137 4169 4213 N
+ S S SH s n/a 30 4137 4169 4213 N
+ S S SIL e n/a 30 4137 4178 4211 N
+ S S SIL s n/a 30 4137 4178 4211 N
+ S S T b n/a 30 4138 4166 4223 N
+ S S T e n/a 30 4138 4166 4218 N
+ S S T i n/a 30 4138 4166 4218 N
+ S S T s n/a 30 4138 4166 4218 N
+ S S TH b n/a 30 4138 4168 4212 N
+ S S TH e n/a 30 4138 4167 4212 N
+ S S TH s n/a 30 4138 4168 4212 N
+ S S UH b n/a 30 4137 4181 4242 N
+ S S UH e n/a 30 4137 4186 4242 N
+ S S UH s n/a 30 4137 4181 4242 N
+ S S UW b n/a 30 4137 4181 4242 N
+ S S UW e n/a 30 4137 4186 4242 N
+ S S UW s n/a 30 4137 4181 4242 N
+ S S V b n/a 30 4137 4168 4216 N
+ S S V e n/a 30 4137 4169 4216 N
+ S S V s n/a 30 4137 4169 4216 N
+ S S W b n/a 30 4137 4168 4209 N
+ S S W e n/a 30 4137 4170 4209 N
+ S S W s n/a 30 4137 4170 4209 N
+ S S Y b n/a 30 4137 4168 4217 N
+ S S Y e n/a 30 4137 4169 4217 N
+ S S Y s n/a 30 4137 4169 4217 N
+ S S Z e n/a 30 4138 4167 4211 N
+ S S Z s n/a 30 4138 4168 4211 N
+ S S ZH e n/a 30 4137 4169 4216 N
+ S S ZH s n/a 30 4137 4169 4216 N
+ S SH AA b n/a 30 4140 4183 4232 N
+ S SH AA s n/a 30 4140 4183 4232 N
+ S SH AE b n/a 30 4140 4183 4229 N
+ S SH AE s n/a 30 4140 4183 4229 N
+ S SH AH b n/a 30 4140 4183 4235 N
+ S SH AH s n/a 30 4140 4183 4244 N
+ S SH AO b n/a 30 4140 4183 4234 N
+ S SH AO s n/a 30 4140 4183 4234 N
+ S SH AW b n/a 30 4140 4183 4229 N
+ S SH AW s n/a 30 4140 4183 4229 N
+ S SH AY b n/a 30 4140 4183 4232 N
+ S SH AY s n/a 30 4140 4183 4232 N
+ S SH B b n/a 30 4140 4166 4224 N
+ S SH B s n/a 30 4140 4169 4224 N
+ S SH CH s n/a 30 4140 4169 4218 N
+ S SH D b n/a 30 4140 4166 4223 N
+ S SH D s n/a 30 4140 4166 4218 N
+ S SH DH s n/a 30 4140 4168 4212 N
+ S SH EH b n/a 30 4140 4183 4226 N
+ S SH EH s n/a 30 4140 4183 4226 N
+ S SH ER b n/a 30 4140 4183 4245 N
+ S SH ER i n/a 30 4140 4183 4245 N
+ S SH ER s n/a 30 4140 4183 4245 N
+ S SH EY b n/a 30 4140 4183 4230 N
+ S SH EY s n/a 30 4140 4183 4230 N
+ S SH F b n/a 30 4140 4168 4214 N
+ S SH F s n/a 30 4140 4169 4214 N
+ S SH G s n/a 30 4140 4170 4207 N
+ S SH HH b n/a 30 4140 4168 4213 N
+ S SH HH s n/a 30 4140 4169 4213 N
+ S SH IH b n/a 30 4140 4183 4239 N
+ S SH IH s n/a 30 4140 4183 4240 N
+ S SH IY b n/a 30 4140 4183 4247 N
+ S SH IY s n/a 30 4140 4183 4247 N
+ S SH JH b n/a 30 4140 4168 4223 N
+ S SH JH s n/a 30 4140 4169 4218 N
+ S SH K b n/a 30 4140 4168 4207 N
+ S SH K s n/a 30 4140 4170 4207 N
+ S SH L b n/a 30 4140 4167 4204 N
+ S SH L s n/a 30 4140 4169 4204 N
+ S SH M b n/a 30 4140 4166 4206 N
+ S SH M s n/a 30 4140 4169 4206 N
+ S SH N b n/a 30 4140 4166 4216 N
+ S SH N s n/a 30 4140 4166 4216 N
+ S SH NG s n/a 30 4140 4170 4204 N
+ S SH OW b n/a 30 4140 4183 4236 N
+ S SH OW s n/a 30 4140 4183 4236 N
+ S SH OY b n/a 30 4140 4183 4234 N
+ S SH OY s n/a 30 4140 4183 4234 N
+ S SH P b n/a 30 4140 4166 4224 N
+ S SH P s n/a 30 4140 4169 4224 N
+ S SH R b n/a 30 4140 4167 4205 N
+ S SH R s n/a 30 4140 4170 4205 N
+ S SH S b n/a 30 4140 4168 4215 N
+ S SH S s n/a 30 4140 4168 4215 N
+ S SH SH b n/a 30 4140 4168 4213 N
+ S SH SH s n/a 30 4140 4169 4213 N
+ S SH SIL s n/a 30 4140 4177 4211 N
+ S SH T b n/a 30 4140 4166 4223 N
+ S SH T i n/a 30 4140 4166 4218 N
+ S SH T s n/a 30 4140 4166 4218 N
+ S SH TH b n/a 30 4140 4168 4212 N
+ S SH TH s n/a 30 4140 4168 4212 N
+ S SH UH b n/a 30 4140 4183 4242 N
+ S SH UH s n/a 30 4140 4183 4242 N
+ S SH UW b n/a 30 4140 4183 4242 N
+ S SH UW s n/a 30 4140 4183 4242 N
+ S SH V b n/a 30 4140 4168 4216 N
+ S SH V s n/a 30 4140 4169 4216 N
+ S SH W b n/a 30 4140 4168 4209 N
+ S SH W s n/a 30 4140 4170 4209 N
+ S SH Y b n/a 30 4140 4168 4217 N
+ S SH Y s n/a 30 4140 4169 4217 N
+ S SH Z s n/a 30 4140 4168 4211 N
+ S SH ZH s n/a 30 4140 4169 4216 N
+ S SIL AA b n/a 30 4142 4185 4232 N
+ S SIL AA s n/a 30 4142 4185 4232 N
+ S SIL AE b n/a 30 4142 4185 4229 N
+ S SIL AE s n/a 30 4142 4185 4229 N
+ S SIL AH b n/a 30 4142 4185 4235 N
+ S SIL AH s n/a 30 4142 4185 4244 N
+ S SIL AO b n/a 30 4142 4185 4234 N
+ S SIL AO s n/a 30 4142 4185 4234 N
+ S SIL AW b n/a 30 4141 4184 4229 N
+ S SIL AW s n/a 30 4141 4184 4229 N
+ S SIL AY b n/a 30 4142 4185 4232 N
+ S SIL AY s n/a 30 4142 4185 4232 N
+ S SIL B b n/a 30 4142 4166 4224 N
+ S SIL B s n/a 30 4142 4169 4224 N
+ S SIL CH s n/a 30 4142 4169 4218 N
+ S SIL D b n/a 30 4142 4166 4223 N
+ S SIL D s n/a 30 4142 4166 4218 N
+ S SIL DH s n/a 30 4142 4168 4212 N
+ S SIL EH b n/a 30 4142 4185 4227 N
+ S SIL EH s n/a 30 4142 4185 4227 N
+ S SIL ER b n/a 30 4142 4185 4245 N
+ S SIL ER s n/a 30 4142 4185 4245 N
+ S SIL EY b n/a 30 4142 4185 4230 N
+ S SIL EY s n/a 30 4142 4185 4230 N
+ S SIL F b n/a 30 4142 4168 4214 N
+ S SIL F s n/a 30 4142 4169 4214 N
+ S SIL G s n/a 30 4142 4170 4207 N
+ S SIL HH b n/a 30 4142 4168 4213 N
+ S SIL HH s n/a 30 4142 4169 4213 N
+ S SIL IH b n/a 30 4142 4185 4239 N
+ S SIL IH s n/a 30 4142 4185 4240 N
+ S SIL IY b n/a 30 4142 4185 4247 N
+ S SIL IY s n/a 30 4142 4185 4247 N
+ S SIL JH b n/a 30 4142 4168 4223 N
+ S SIL JH s n/a 30 4142 4169 4218 N
+ S SIL K b n/a 30 4142 4168 4207 N
+ S SIL K s n/a 30 4142 4170 4207 N
+ S SIL L b n/a 30 4142 4168 4204 N
+ S SIL L s n/a 30 4142 4169 4204 N
+ S SIL M b n/a 30 4142 4166 4206 N
+ S SIL M s n/a 30 4142 4169 4206 N
+ S SIL N b n/a 30 4142 4166 4216 N
+ S SIL N s n/a 30 4142 4166 4216 N
+ S SIL NG s n/a 30 4142 4170 4204 N
+ S SIL OW b n/a 30 4141 4184 4237 N
+ S SIL OW s n/a 30 4141 4184 4237 N
+ S SIL OY b n/a 30 4142 4185 4234 N
+ S SIL OY s n/a 30 4142 4185 4234 N
+ S SIL P b n/a 30 4142 4166 4224 N
+ S SIL P s n/a 30 4142 4169 4224 N
+ S SIL R b n/a 30 4142 4168 4205 N
+ S SIL R s n/a 30 4142 4170 4205 N
+ S SIL S b n/a 30 4142 4168 4215 N
+ S SIL S s n/a 30 4142 4168 4215 N
+ S SIL SH b n/a 30 4142 4168 4213 N
+ S SIL SH s n/a 30 4142 4169 4213 N
+ S SIL SIL s n/a 30 4142 4177 4211 N
+ S SIL T b n/a 30 4142 4166 4223 N
+ S SIL T s n/a 30 4142 4166 4218 N
+ S SIL TH b n/a 30 4142 4168 4212 N
+ S SIL TH s n/a 30 4142 4168 4212 N
+ S SIL UH b n/a 30 4142 4185 4242 N
+ S SIL UH s n/a 30 4142 4185 4242 N
+ S SIL UW b n/a 30 4142 4185 4242 N
+ S SIL UW s n/a 30 4142 4185 4242 N
+ S SIL V b n/a 30 4142 4168 4216 N
+ S SIL V s n/a 30 4142 4169 4216 N
+ S SIL W b n/a 30 4141 4168 4209 N
+ S SIL W s n/a 30 4141 4170 4209 N
+ S SIL Y b n/a 30 4142 4168 4217 N
+ S SIL Y s n/a 30 4142 4169 4217 N
+ S SIL Z s n/a 30 4142 4168 4211 N
+ S SIL ZH s n/a 30 4142 4169 4216 N
+ S T AA b n/a 30 4134 4179 4232 N
+ S T AA e n/a 30 4133 4186 4233 N
+ S T AA i n/a 30 4134 4179 4232 N
+ S T AA s n/a 30 4134 4179 4232 N
+ S T AE b n/a 30 4134 4179 4229 N
+ S T AE e n/a 30 4133 4186 4231 N
+ S T AE i n/a 30 4134 4179 4229 N
+ S T AE s n/a 30 4134 4179 4229 N
+ S T AH b n/a 30 4134 4179 4235 N
+ S T AH e n/a 30 4133 4186 4244 N
+ S T AH i n/a 30 4134 4179 4243 N
+ S T AH s n/a 30 4134 4179 4244 N
+ S T AO b n/a 30 4134 4180 4234 N
+ S T AO e n/a 30 4133 4186 4233 N
+ S T AO i n/a 30 4134 4180 4234 N
+ S T AO s n/a 30 4134 4180 4234 N
+ S T AW b n/a 30 4134 4179 4229 N
+ S T AW e n/a 30 4133 4186 4231 N
+ S T AW i n/a 30 4134 4179 4229 N
+ S T AW s n/a 30 4134 4179 4229 N
+ S T AY b n/a 30 4134 4179 4232 N
+ S T AY e n/a 30 4133 4186 4233 N
+ S T AY i n/a 30 4134 4179 4232 N
+ S T AY s n/a 30 4134 4179 4232 N
+ S T B b n/a 30 4134 4166 4224 N
+ S T B e n/a 30 4133 4169 4225 N
+ S T B i n/a 30 4134 4169 4224 N
+ S T B s n/a 30 4134 4169 4224 N
+ S T CH e n/a 30 4133 4169 4222 N
+ S T CH i n/a 30 4134 4169 4222 N
+ S T CH s n/a 30 4134 4169 4222 N
+ S T D b n/a 30 4134 4166 4223 N
+ S T D e n/a 30 4134 4166 4222 N
+ S T D i n/a 30 4134 4166 4222 N
+ S T D s n/a 30 4134 4166 4222 N
+ S T DH e n/a 30 4134 4167 4212 N
+ S T DH s n/a 30 4134 4168 4212 N
+ S T EH b n/a 30 4134 4179 4226 N
+ S T EH e n/a 30 4133 4186 4231 N
+ S T EH i n/a 30 4134 4179 4226 N
+ S T EH s n/a 30 4134 4179 4226 N
+ S T ER b n/a 30 4134 4180 4245 N
+ S T ER e n/a 30 4133 4186 4246 N
+ S T ER i n/a 30 4134 4180 4245 N
+ S T ER s n/a 30 4134 4180 4245 N
+ S T EY b n/a 30 4134 4179 4230 N
+ S T EY e n/a 30 4133 4186 4231 N
+ S T EY i n/a 30 4134 4179 4230 N
+ S T EY s n/a 30 4134 4179 4230 N
+ S T F b n/a 30 4134 4168 4214 N
+ S T F e n/a 30 4133 4169 4214 N
+ S T F i n/a 30 4134 4169 4214 N
+ S T F s n/a 30 4134 4169 4214 N
+ S T G e n/a 30 4133 4170 4208 N
+ S T G i n/a 30 4134 4170 4207 N
+ S T G s n/a 30 4134 4170 4207 N
+ S T HH b n/a 30 4134 4168 4213 N
+ S T HH e n/a 30 4133 4169 4213 N
+ S T HH i n/a 30 4134 4169 4213 N
+ S T HH s n/a 30 4134 4169 4213 N
+ S T IH b n/a 30 4134 4181 4239 N
+ S T IH e n/a 30 4133 4186 4240 N
+ S T IH i n/a 30 4134 4181 4239 N
+ S T IH s n/a 30 4134 4181 4240 N
+ S T IY b n/a 30 4134 4181 4247 N
+ S T IY e n/a 30 4133 4186 4247 N
+ S T IY i n/a 30 4134 4181 4247 N
+ S T IY s n/a 30 4134 4181 4247 N
+ S T JH b n/a 30 4134 4168 4223 N
+ S T JH e n/a 30 4133 4169 4222 N
+ S T JH i n/a 30 4134 4169 4222 N
+ S T JH s n/a 30 4134 4169 4222 N
+ S T K b n/a 30 4134 4168 4207 N
+ S T K e n/a 30 4133 4170 4208 N
+ S T K i n/a 30 4134 4170 4207 N
+ S T K s n/a 30 4134 4170 4207 N
+ S T L b n/a 30 4134 4167 4204 N
+ S T L e n/a 30 4133 4169 4204 N
+ S T L i n/a 30 4134 4169 4204 N
+ S T L s n/a 30 4134 4169 4204 N
+ S T M b n/a 30 4134 4166 4206 N
+ S T M e n/a 30 4133 4169 4206 N
+ S T M i n/a 30 4134 4169 4206 N
+ S T M s n/a 30 4134 4169 4206 N
+ S T N b n/a 30 4134 4166 4216 N
+ S T N e n/a 30 4134 4166 4216 N
+ S T N i n/a 30 4134 4166 4216 N
+ S T N s n/a 30 4134 4166 4216 N
+ S T NG e n/a 30 4133 4170 4204 N
+ S T NG s n/a 30 4134 4170 4204 N
+ S T OW b n/a 30 4134 4180 4236 N
+ S T OW e n/a 30 4133 4186 4233 N
+ S T OW i n/a 30 4134 4180 4236 N
+ S T OW s n/a 30 4134 4180 4236 N
+ S T OY b n/a 30 4134 4180 4234 N
+ S T OY e n/a 30 4133 4186 4233 N
+ S T OY s n/a 30 4134 4180 4234 N
+ S T P b n/a 30 4134 4166 4224 N
+ S T P e n/a 30 4133 4169 4225 N
+ S T P i n/a 30 4134 4169 4224 N
+ S T P s n/a 30 4134 4169 4224 N
+ S T R b n/a 30 4134 4167 4205 N
+ S T R e n/a 30 4133 4170 4205 N
+ S T R i n/a 30 4134 4170 4205 N
+ S T R s n/a 30 4134 4170 4205 N
+ S T S b n/a 30 4134 4168 4215 N
+ S T S e n/a 30 4134 4167 4215 N
+ S T S i n/a 30 4134 4168 4215 N
+ S T S s n/a 30 4134 4168 4215 N
+ S T SH b n/a 30 4134 4168 4213 N
+ S T SH e n/a 30 4133 4169 4213 N
+ S T SH i n/a 30 4134 4169 4213 N
+ S T SH s n/a 30 4134 4169 4213 N
+ S T SIL e n/a 30 4134 4178 4211 N
+ S T SIL s n/a 30 4134 4178 4211 N
+ S T T b n/a 30 4134 4166 4223 N
+ S T T e n/a 30 4134 4166 4222 N
+ S T T i n/a 30 4134 4166 4222 N
+ S T T s n/a 30 4134 4166 4222 N
+ S T TH b n/a 30 4134 4168 4212 N
+ S T TH e n/a 30 4134 4167 4212 N
+ S T TH s n/a 30 4134 4168 4212 N
+ S T UH b n/a 30 4134 4181 4242 N
+ S T UH e n/a 30 4133 4186 4242 N
+ S T UH i n/a 30 4134 4181 4239 N
+ S T UH s n/a 30 4134 4181 4242 N
+ S T UW b n/a 30 4134 4181 4242 N
+ S T UW e n/a 30 4133 4186 4242 N
+ S T UW i n/a 30 4134 4181 4242 N
+ S T UW s n/a 30 4134 4181 4242 N
+ S T V b n/a 30 4134 4168 4216 N
+ S T V e n/a 30 4133 4169 4216 N
+ S T V i n/a 30 4134 4169 4216 N
+ S T V s n/a 30 4134 4169 4216 N
+ S T W b n/a 30 4134 4168 4209 N
+ S T W e n/a 30 4133 4170 4209 N
+ S T W i n/a 30 4134 4170 4209 N
+ S T W s n/a 30 4134 4170 4209 N
+ S T Y b n/a 30 4134 4168 4217 N
+ S T Y e n/a 30 4133 4169 4217 N
+ S T Y i n/a 30 4134 4169 4217 N
+ S T Y s n/a 30 4134 4169 4217 N
+ S T Z e n/a 30 4134 4167 4211 N
+ S T Z i n/a 30 4134 4168 4211 N
+ S T Z s n/a 30 4134 4168 4211 N
+ S T ZH e n/a 30 4133 4169 4216 N
+ S T ZH s n/a 30 4134 4169 4216 N
+ S TH AA b n/a 30 4138 4179 4232 N
+ S TH AA e n/a 30 4138 4179 4233 N
+ S TH AA s n/a 30 4138 4179 4232 N
+ S TH AE b n/a 30 4138 4179 4229 N
+ S TH AE e n/a 30 4138 4179 4231 N
+ S TH AE s n/a 30 4138 4179 4229 N
+ S TH AH b n/a 30 4138 4179 4235 N
+ S TH AH e n/a 30 4138 4179 4244 N
+ S TH AH i n/a 30 4138 4179 4243 N
+ S TH AH s n/a 30 4138 4179 4244 N
+ S TH AO b n/a 30 4138 4180 4234 N
+ S TH AO e n/a 30 4138 4180 4233 N
+ S TH AO i n/a 30 4138 4180 4234 N
+ S TH AO s n/a 30 4138 4180 4234 N
+ S TH AW b n/a 30 4138 4179 4229 N
+ S TH AW e n/a 30 4138 4179 4231 N
+ S TH AW i n/a 30 4138 4179 4229 N
+ S TH AW s n/a 30 4138 4179 4229 N
+ S TH AY b n/a 30 4138 4179 4232 N
+ S TH AY e n/a 30 4138 4179 4233 N
+ S TH AY i n/a 30 4138 4179 4232 N
+ S TH AY s n/a 30 4138 4179 4232 N
+ S TH B b n/a 30 4138 4166 4224 N
+ S TH B e n/a 30 4138 4169 4225 N
+ S TH B s n/a 30 4138 4169 4224 N
+ S TH CH e n/a 30 4138 4169 4218 N
+ S TH CH i n/a 30 4138 4169 4218 N
+ S TH CH s n/a 30 4138 4169 4218 N
+ S TH D b n/a 30 4138 4166 4223 N
+ S TH D e n/a 30 4138 4166 4218 N
+ S TH D s n/a 30 4138 4166 4218 N
+ S TH DH e n/a 30 4138 4167 4212 N
+ S TH DH s n/a 30 4138 4168 4212 N
+ S TH EH b n/a 30 4138 4179 4226 N
+ S TH EH e n/a 30 4138 4179 4231 N
+ S TH EH i n/a 30 4138 4179 4226 N
+ S TH EH s n/a 30 4138 4179 4226 N
+ S TH ER b n/a 30 4138 4180 4245 N
+ S TH ER e n/a 30 4138 4180 4246 N
+ S TH ER s n/a 30 4138 4180 4245 N
+ S TH EY b n/a 30 4138 4179 4230 N
+ S TH EY e n/a 30 4138 4179 4231 N
+ S TH EY i n/a 30 4138 4179 4230 N
+ S TH EY s n/a 30 4138 4179 4230 N
+ S TH F b n/a 30 4138 4168 4214 N
+ S TH F e n/a 30 4138 4169 4214 N
+ S TH F s n/a 30 4138 4169 4214 N
+ S TH G e n/a 30 4138 4170 4208 N
+ S TH G s n/a 30 4138 4170 4207 N
+ S TH HH b n/a 30 4138 4168 4213 N
+ S TH HH e n/a 30 4138 4169 4213 N
+ S TH HH s n/a 30 4138 4169 4213 N
+ S TH IH b n/a 30 4138 4181 4239 N
+ S TH IH e n/a 30 4138 4181 4240 N
+ S TH IH s n/a 30 4138 4181 4240 N
+ S TH IY b n/a 30 4138 4181 4247 N
+ S TH IY e n/a 30 4138 4181 4247 N
+ S TH IY i n/a 30 4138 4181 4247 N
+ S TH IY s n/a 30 4138 4181 4247 N
+ S TH JH b n/a 30 4138 4168 4223 N
+ S TH JH e n/a 30 4138 4169 4218 N
+ S TH JH s n/a 30 4138 4169 4218 N
+ S TH K b n/a 30 4138 4168 4207 N
+ S TH K e n/a 30 4138 4170 4208 N
+ S TH K i n/a 30 4138 4170 4207 N
+ S TH K s n/a 30 4138 4170 4207 N
+ S TH L b n/a 30 4138 4167 4204 N
+ S TH L e n/a 30 4138 4169 4204 N
+ S TH L s n/a 30 4138 4169 4204 N
+ S TH M b n/a 30 4138 4166 4206 N
+ S TH M e n/a 30 4138 4169 4206 N
+ S TH M s n/a 30 4138 4169 4206 N
+ S TH N b n/a 30 4138 4166 4216 N
+ S TH N e n/a 30 4138 4166 4216 N
+ S TH N s n/a 30 4138 4166 4216 N
+ S TH NG e n/a 30 4138 4170 4204 N
+ S TH NG s n/a 30 4138 4170 4204 N
+ S TH OW b n/a 30 4138 4180 4236 N
+ S TH OW e n/a 30 4138 4180 4233 N
+ S TH OW i n/a 30 4138 4180 4236 N
+ S TH OW s n/a 30 4138 4180 4236 N
+ S TH OY b n/a 30 4138 4180 4234 N
+ S TH OY e n/a 30 4138 4180 4233 N
+ S TH OY s n/a 30 4138 4180 4234 N
+ S TH P b n/a 30 4138 4166 4224 N
+ S TH P e n/a 30 4138 4169 4225 N
+ S TH P i n/a 30 4138 4169 4224 N
+ S TH P s n/a 30 4138 4169 4224 N
+ S TH R b n/a 30 4138 4167 4205 N
+ S TH R e n/a 30 4138 4170 4205 N
+ S TH R s n/a 30 4138 4170 4205 N
+ S TH S b n/a 30 4138 4168 4215 N
+ S TH S e n/a 30 4138 4167 4215 N
+ S TH S s n/a 30 4138 4168 4215 N
+ S TH SH b n/a 30 4138 4168 4213 N
+ S TH SH e n/a 30 4138 4169 4213 N
+ S TH SH s n/a 30 4138 4169 4213 N
+ S TH SIL e n/a 30 4138 4178 4211 N
+ S TH SIL s n/a 30 4138 4178 4211 N
+ S TH T b n/a 30 4138 4166 4223 N
+ S TH T e n/a 30 4138 4166 4218 N
+ S TH T i n/a 30 4138 4166 4218 N
+ S TH T s n/a 30 4138 4166 4218 N
+ S TH TH b n/a 30 4138 4168 4212 N
+ S TH TH e n/a 30 4138 4167 4212 N
+ S TH TH s n/a 30 4138 4168 4212 N
+ S TH UH b n/a 30 4138 4181 4242 N
+ S TH UH e n/a 30 4138 4181 4242 N
+ S TH UH s n/a 30 4138 4181 4242 N
+ S TH UW b n/a 30 4138 4181 4242 N
+ S TH UW e n/a 30 4138 4181 4242 N
+ S TH UW s n/a 30 4138 4181 4242 N
+ S TH V b n/a 30 4138 4168 4216 N
+ S TH V e n/a 30 4138 4169 4216 N
+ S TH V s n/a 30 4138 4169 4216 N
+ S TH W b n/a 30 4138 4168 4209 N
+ S TH W e n/a 30 4138 4170 4209 N
+ S TH W s n/a 30 4138 4170 4209 N
+ S TH Y b n/a 30 4138 4168 4217 N
+ S TH Y e n/a 30 4138 4169 4217 N
+ S TH Y s n/a 30 4138 4169 4217 N
+ S TH Z e n/a 30 4138 4167 4211 N
+ S TH Z s n/a 30 4138 4168 4211 N
+ S TH ZH e n/a 30 4138 4169 4216 N
+ S TH ZH s n/a 30 4138 4169 4216 N
+ S UH AA b n/a 30 4129 4188 4232 N
+ S UH AA e n/a 30 4129 4189 4233 N
+ S UH AA i n/a 30 4129 4188 4232 N
+ S UH AA s n/a 30 4129 4189 4232 N
+ S UH AE b n/a 30 4129 4188 4229 N
+ S UH AE e n/a 30 4129 4189 4231 N
+ S UH AE s n/a 30 4129 4189 4229 N
+ S UH AH b n/a 30 4129 4188 4235 N
+ S UH AH e n/a 30 4129 4189 4244 N
+ S UH AH i n/a 30 4129 4189 4243 N
+ S UH AH s n/a 30 4129 4189 4244 N
+ S UH AO b n/a 30 4129 4188 4234 N
+ S UH AO e n/a 30 4129 4189 4233 N
+ S UH AO i n/a 30 4129 4188 4234 N
+ S UH AO s n/a 30 4129 4189 4234 N
+ S UH AW b n/a 30 4129 4188 4229 N
+ S UH AW e n/a 30 4129 4189 4231 N
+ S UH AW s n/a 30 4129 4189 4229 N
+ S UH AY b n/a 30 4129 4188 4232 N
+ S UH AY e n/a 30 4129 4189 4233 N
+ S UH AY s n/a 30 4129 4189 4232 N
+ S UH B b n/a 30 4129 4160 4224 N
+ S UH B e n/a 30 4129 4160 4225 N
+ S UH B s n/a 30 4129 4160 4224 N
+ S UH CH e n/a 30 4129 4160 4222 N
+ S UH CH s n/a 30 4129 4160 4222 N
+ S UH D b n/a 30 4129 4160 4223 N
+ S UH D e n/a 30 4129 4160 4222 N
+ S UH D s n/a 30 4129 4160 4222 N
+ S UH DH e n/a 30 4129 4158 4212 N
+ S UH DH s n/a 30 4129 4158 4212 N
+ S UH EH b n/a 30 4129 4188 4226 N
+ S UH EH e n/a 30 4129 4189 4231 N
+ S UH EH i n/a 30 4129 4188 4226 N
+ S UH EH s n/a 30 4129 4189 4226 N
+ S UH ER b n/a 30 4129 4188 4245 N
+ S UH ER e n/a 30 4129 4189 4246 N
+ S UH ER s n/a 30 4129 4189 4245 N
+ S UH EY b n/a 30 4129 4188 4230 N
+ S UH EY e n/a 30 4129 4189 4231 N
+ S UH EY s n/a 30 4129 4189 4230 N
+ S UH F b n/a 30 4129 4158 4214 N
+ S UH F e n/a 30 4129 4158 4214 N
+ S UH F s n/a 30 4129 4158 4214 N
+ S UH G e n/a 30 4129 4158 4208 N
+ S UH G s n/a 30 4129 4158 4207 N
+ S UH HH b n/a 30 4129 4158 4213 N
+ S UH HH e n/a 30 4129 4158 4213 N
+ S UH HH s n/a 30 4129 4158 4213 N
+ S UH IH b n/a 30 4129 4187 4239 N
+ S UH IH e n/a 30 4129 4189 4241 N
+ S UH IH i n/a 30 4129 4189 4241 N
+ S UH IH s n/a 30 4129 4189 4241 N
+ S UH IY b n/a 30 4129 4187 4247 N
+ S UH IY e n/a 30 4129 4189 4247 N
+ S UH IY i n/a 30 4129 4187 4247 N
+ S UH IY s n/a 30 4129 4189 4247 N
+ S UH JH b n/a 30 4129 4160 4223 N
+ S UH JH e n/a 30 4129 4160 4222 N
+ S UH JH s n/a 30 4129 4160 4222 N
+ S UH K b n/a 30 4129 4158 4207 N
+ S UH K e n/a 30 4129 4158 4208 N
+ S UH K i n/a 30 4129 4158 4207 N
+ S UH K s n/a 30 4129 4158 4207 N
+ S UH L b n/a 30 4129 4158 4204 N
+ S UH L e n/a 30 4129 4158 4204 N
+ S UH L s n/a 30 4129 4158 4204 N
+ S UH M b n/a 30 4129 4160 4206 N
+ S UH M e n/a 30 4129 4160 4206 N
+ S UH M i n/a 30 4129 4160 4206 N
+ S UH M s n/a 30 4129 4160 4206 N
+ S UH N b n/a 30 4129 4160 4216 N
+ S UH N e n/a 30 4129 4160 4216 N
+ S UH N i n/a 30 4129 4160 4216 N
+ S UH N s n/a 30 4129 4160 4216 N
+ S UH NG e n/a 30 4129 4158 4204 N
+ S UH NG s n/a 30 4129 4158 4204 N
+ S UH OW b n/a 30 4129 4188 4236 N
+ S UH OW e n/a 30 4129 4189 4233 N
+ S UH OW s n/a 30 4129 4189 4236 N
+ S UH OY b n/a 30 4129 4188 4234 N
+ S UH OY e n/a 30 4129 4189 4233 N
+ S UH OY s n/a 30 4129 4189 4234 N
+ S UH P b n/a 30 4129 4160 4224 N
+ S UH P e n/a 30 4129 4160 4225 N
+ S UH P s n/a 30 4129 4160 4224 N
+ S UH R b n/a 30 4129 4158 4205 N
+ S UH R e n/a 30 4129 4158 4205 N
+ S UH R s n/a 30 4129 4158 4205 N
+ S UH S b n/a 30 4129 4160 4215 N
+ S UH S e n/a 30 4129 4160 4215 N
+ S UH S s n/a 30 4129 4160 4215 N
+ S UH SH b n/a 30 4129 4160 4213 N
+ S UH SH e n/a 30 4129 4160 4213 N
+ S UH SH s n/a 30 4129 4160 4213 N
+ S UH SIL e n/a 30 4129 4177 4210 N
+ S UH SIL s n/a 30 4129 4177 4210 N
+ S UH T b n/a 30 4129 4160 4223 N
+ S UH T e n/a 30 4129 4160 4222 N
+ S UH T i n/a 30 4129 4159 4222 N
+ S UH T s n/a 30 4129 4160 4222 N
+ S UH TH b n/a 30 4129 4158 4212 N
+ S UH TH e n/a 30 4129 4158 4212 N
+ S UH TH s n/a 30 4129 4158 4212 N
+ S UH UH b n/a 30 4129 4187 4242 N
+ S UH UH e n/a 30 4129 4189 4242 N
+ S UH UH s n/a 30 4129 4189 4242 N
+ S UH UW b n/a 30 4129 4187 4242 N
+ S UH UW e n/a 30 4129 4189 4242 N
+ S UH UW s n/a 30 4129 4189 4242 N
+ S UH V b n/a 30 4129 4158 4216 N
+ S UH V e n/a 30 4129 4158 4216 N
+ S UH V s n/a 30 4129 4158 4216 N
+ S UH W b n/a 30 4129 4158 4209 N
+ S UH W e n/a 30 4129 4158 4209 N
+ S UH W s n/a 30 4129 4158 4209 N
+ S UH Y b n/a 30 4129 4160 4217 N
+ S UH Y e n/a 30 4129 4160 4217 N
+ S UH Y s n/a 30 4129 4160 4217 N
+ S UH Z e n/a 30 4129 4160 4210 N
+ S UH Z s n/a 30 4129 4160 4210 N
+ S UH ZH e n/a 30 4129 4160 4216 N
+ S UH ZH s n/a 30 4129 4160 4216 N
+ S UW AA b n/a 30 4129 4193 4232 N
+ S UW AA e n/a 30 4129 4193 4233 N
+ S UW AA i n/a 30 4129 4193 4232 N
+ S UW AA s n/a 30 4129 4193 4232 N
+ S UW AE b n/a 30 4129 4193 4229 N
+ S UW AE e n/a 30 4129 4193 4231 N
+ S UW AE i n/a 30 4129 4193 4229 N
+ S UW AE s n/a 30 4129 4193 4229 N
+ S UW AH b n/a 30 4129 4193 4235 N
+ S UW AH e n/a 30 4129 4193 4244 N
+ S UW AH i n/a 30 4129 4193 4243 N
+ S UW AH s n/a 30 4129 4193 4244 N
+ S UW AO b n/a 30 4129 4193 4234 N
+ S UW AO e n/a 30 4129 4193 4233 N
+ S UW AO i n/a 30 4129 4193 4234 N
+ S UW AO s n/a 30 4129 4193 4234 N
+ S UW AW b n/a 30 4129 4193 4229 N
+ S UW AW e n/a 30 4129 4193 4231 N
+ S UW AW s n/a 30 4129 4193 4229 N
+ S UW AY b n/a 30 4129 4193 4232 N
+ S UW AY e n/a 30 4129 4193 4233 N
+ S UW AY i n/a 30 4129 4193 4232 N
+ S UW AY s n/a 30 4129 4193 4232 N
+ S UW B b n/a 30 4129 4162 4224 N
+ S UW B e n/a 30 4129 4162 4225 N
+ S UW B i n/a 30 4129 4162 4224 N
+ S UW B s n/a 30 4129 4162 4224 N
+ S UW CH e n/a 30 4129 4162 4222 N
+ S UW CH i n/a 30 4129 4162 4222 N
+ S UW CH s n/a 30 4129 4162 4222 N
+ S UW D b n/a 30 4129 4161 4223 N
+ S UW D e n/a 30 4129 4161 4222 N
+ S UW D i n/a 30 4129 4161 4222 N
+ S UW D s n/a 30 4129 4161 4222 N
+ S UW DH e n/a 30 4129 4162 4212 N
+ S UW DH s n/a 30 4129 4162 4212 N
+ S UW EH b n/a 30 4129 4193 4226 N
+ S UW EH e n/a 30 4129 4193 4231 N
+ S UW EH i n/a 30 4129 4193 4226 N
+ S UW EH s n/a 30 4129 4193 4226 N
+ S UW ER b n/a 30 4129 4193 4245 N
+ S UW ER e n/a 30 4129 4193 4246 N
+ S UW ER i n/a 30 4129 4193 4245 N
+ S UW ER s n/a 30 4129 4193 4245 N
+ S UW EY b n/a 30 4129 4193 4230 N
+ S UW EY e n/a 30 4129 4193 4231 N
+ S UW EY i n/a 30 4129 4193 4230 N
+ S UW EY s n/a 30 4129 4193 4230 N
+ S UW F b n/a 30 4129 4162 4214 N
+ S UW F e n/a 30 4129 4162 4214 N
+ S UW F i n/a 30 4129 4162 4214 N
+ S UW F s n/a 30 4129 4162 4214 N
+ S UW G e n/a 30 4129 4162 4208 N
+ S UW G s n/a 30 4129 4162 4207 N
+ S UW HH b n/a 30 4129 4162 4213 N
+ S UW HH e n/a 30 4129 4162 4213 N
+ S UW HH i n/a 30 4129 4162 4213 N
+ S UW HH s n/a 30 4129 4162 4213 N
+ S UW IH b n/a 30 4129 4193 4239 N
+ S UW IH e n/a 30 4129 4193 4241 N
+ S UW IH i n/a 30 4129 4193 4241 N
+ S UW IH s n/a 30 4129 4193 4241 N
+ S UW IY b n/a 30 4129 4193 4247 N
+ S UW IY e n/a 30 4129 4193 4247 N
+ S UW IY i n/a 30 4129 4193 4247 N
+ S UW IY s n/a 30 4129 4193 4247 N
+ S UW JH b n/a 30 4129 4162 4223 N
+ S UW JH e n/a 30 4129 4162 4222 N
+ S UW JH s n/a 30 4129 4162 4222 N
+ S UW K b n/a 30 4129 4162 4207 N
+ S UW K e n/a 30 4129 4162 4208 N
+ S UW K i n/a 30 4129 4162 4207 N
+ S UW K s n/a 30 4129 4162 4207 N
+ S UW L b n/a 30 4129 4162 4204 N
+ S UW L e n/a 30 4129 4162 4204 N
+ S UW L i n/a 30 4129 4162 4204 N
+ S UW L s n/a 30 4129 4162 4204 N
+ S UW M b n/a 30 4129 4162 4206 N
+ S UW M e n/a 30 4129 4162 4206 N
+ S UW M i n/a 30 4129 4162 4206 N
+ S UW M s n/a 30 4129 4162 4206 N
+ S UW N b n/a 30 4129 4161 4216 N
+ S UW N e n/a 30 4129 4161 4216 N
+ S UW N i n/a 30 4129 4161 4216 N
+ S UW N s n/a 30 4129 4161 4216 N
+ S UW NG e n/a 30 4129 4162 4204 N
+ S UW NG s n/a 30 4129 4162 4204 N
+ S UW OW b n/a 30 4129 4193 4236 N
+ S UW OW e n/a 30 4129 4193 4233 N
+ S UW OW i n/a 30 4129 4193 4236 N
+ S UW OW s n/a 30 4129 4193 4236 N
+ S UW OY b n/a 30 4129 4193 4234 N
+ S UW OY e n/a 30 4129 4193 4233 N
+ S UW OY s n/a 30 4129 4193 4234 N
+ S UW P b n/a 30 4129 4162 4224 N
+ S UW P e n/a 30 4129 4162 4225 N
+ S UW P i n/a 30 4129 4162 4224 N
+ S UW P s n/a 30 4129 4162 4224 N
+ S UW R b n/a 30 4129 4162 4205 N
+ S UW R e n/a 30 4129 4162 4205 N
+ S UW R s n/a 30 4129 4162 4205 N
+ S UW S b n/a 30 4129 4162 4215 N
+ S UW S e n/a 30 4129 4162 4215 N
+ S UW S i n/a 30 4129 4162 4215 N
+ S UW S s n/a 30 4129 4162 4215 N
+ S UW SH b n/a 30 4129 4162 4213 N
+ S UW SH e n/a 30 4129 4162 4213 N
+ S UW SH i n/a 30 4129 4162 4213 N
+ S UW SH s n/a 30 4129 4162 4213 N
+ S UW SIL e n/a 30 4129 4177 4210 N
+ S UW SIL s n/a 30 4129 4177 4210 N
+ S UW T b n/a 30 4129 4161 4223 N
+ S UW T e n/a 30 4129 4161 4222 N
+ S UW T i n/a 30 4129 4161 4222 N
+ S UW T s n/a 30 4129 4161 4222 N
+ S UW TH b n/a 30 4129 4162 4212 N
+ S UW TH e n/a 30 4129 4162 4212 N
+ S UW TH s n/a 30 4129 4162 4212 N
+ S UW UH b n/a 30 4129 4193 4242 N
+ S UW UH e n/a 30 4129 4193 4242 N
+ S UW UH s n/a 30 4129 4193 4242 N
+ S UW UW b n/a 30 4129 4193 4242 N
+ S UW UW e n/a 30 4129 4193 4242 N
+ S UW UW i n/a 30 4129 4193 4242 N
+ S UW UW s n/a 30 4129 4193 4242 N
+ S UW V b n/a 30 4129 4162 4216 N
+ S UW V e n/a 30 4129 4162 4216 N
+ S UW V s n/a 30 4129 4162 4216 N
+ S UW W b n/a 30 4129 4162 4209 N
+ S UW W e n/a 30 4129 4162 4209 N
+ S UW W i n/a 30 4129 4162 4209 N
+ S UW W s n/a 30 4129 4162 4209 N
+ S UW Y b n/a 30 4129 4162 4217 N
+ S UW Y e n/a 30 4129 4162 4217 N
+ S UW Y i n/a 30 4129 4162 4217 N
+ S UW Y s n/a 30 4129 4162 4217 N
+ S UW Z e n/a 30 4129 4162 4210 N
+ S UW Z s n/a 30 4129 4162 4210 N
+ S UW ZH e n/a 30 4129 4162 4216 N
+ S UW ZH s n/a 30 4129 4162 4216 N
+ S V AA b n/a 30 4136 4183 4232 N
+ S V AA e n/a 30 4136 4183 4233 N
+ S V AA s n/a 30 4136 4183 4232 N
+ S V AE b n/a 30 4136 4183 4229 N
+ S V AE e n/a 30 4136 4183 4231 N
+ S V AE i n/a 30 4136 4183 4229 N
+ S V AE s n/a 30 4136 4183 4229 N
+ S V AH b n/a 30 4136 4183 4235 N
+ S V AH e n/a 30 4136 4183 4244 N
+ S V AH i n/a 30 4136 4183 4243 N
+ S V AH s n/a 30 4136 4183 4244 N
+ S V AO b n/a 30 4136 4183 4234 N
+ S V AO e n/a 30 4136 4183 4233 N
+ S V AO s n/a 30 4136 4183 4234 N
+ S V AW b n/a 30 4136 4183 4229 N
+ S V AW e n/a 30 4136 4183 4231 N
+ S V AW s n/a 30 4136 4183 4229 N
+ S V AY b n/a 30 4136 4183 4232 N
+ S V AY e n/a 30 4136 4183 4233 N
+ S V AY i n/a 30 4136 4183 4232 N
+ S V AY s n/a 30 4136 4183 4232 N
+ S V B b n/a 30 4136 4166 4224 N
+ S V B e n/a 30 4136 4169 4225 N
+ S V B s n/a 30 4136 4169 4224 N
+ S V CH e n/a 30 4136 4169 4218 N
+ S V CH s n/a 30 4136 4169 4218 N
+ S V D b n/a 30 4136 4166 4223 N
+ S V D e n/a 30 4136 4166 4218 N
+ S V D s n/a 30 4136 4166 4218 N
+ S V DH e n/a 30 4136 4167 4212 N
+ S V DH s n/a 30 4136 4168 4212 N
+ S V EH b n/a 30 4136 4183 4226 N
+ S V EH e n/a 30 4136 4183 4231 N
+ S V EH i n/a 30 4136 4183 4226 N
+ S V EH s n/a 30 4136 4183 4226 N
+ S V ER b n/a 30 4136 4183 4245 N
+ S V ER e n/a 30 4136 4183 4246 N
+ S V ER s n/a 30 4136 4183 4245 N
+ S V EY b n/a 30 4136 4183 4230 N
+ S V EY e n/a 30 4136 4183 4231 N
+ S V EY s n/a 30 4136 4183 4230 N
+ S V F b n/a 30 4136 4168 4214 N
+ S V F e n/a 30 4136 4169 4214 N
+ S V F s n/a 30 4136 4169 4214 N
+ S V G e n/a 30 4136 4170 4208 N
+ S V G s n/a 30 4136 4170 4207 N
+ S V HH b n/a 30 4136 4168 4213 N
+ S V HH e n/a 30 4136 4169 4213 N
+ S V HH s n/a 30 4136 4169 4213 N
+ S V IH b n/a 30 4136 4183 4239 N
+ S V IH e n/a 30 4136 4183 4240 N
+ S V IH i n/a 30 4136 4183 4239 N
+ S V IH s n/a 30 4136 4183 4240 N
+ S V IY b n/a 30 4136 4183 4247 N
+ S V IY e n/a 30 4136 4183 4247 N
+ S V IY i n/a 30 4136 4183 4247 N
+ S V IY s n/a 30 4136 4183 4247 N
+ S V JH b n/a 30 4136 4168 4223 N
+ S V JH e n/a 30 4136 4169 4218 N
+ S V JH s n/a 30 4136 4169 4218 N
+ S V K b n/a 30 4136 4168 4207 N
+ S V K e n/a 30 4136 4170 4208 N
+ S V K i n/a 30 4136 4170 4207 N
+ S V K s n/a 30 4136 4170 4207 N
+ S V L b n/a 30 4136 4167 4204 N
+ S V L e n/a 30 4136 4169 4204 N
+ S V L s n/a 30 4136 4169 4204 N
+ S V M b n/a 30 4136 4166 4206 N
+ S V M e n/a 30 4136 4169 4206 N
+ S V M s n/a 30 4136 4169 4206 N
+ S V N b n/a 30 4136 4166 4216 N
+ S V N e n/a 30 4136 4166 4216 N
+ S V N s n/a 30 4136 4166 4216 N
+ S V NG e n/a 30 4136 4170 4204 N
+ S V NG s n/a 30 4136 4170 4204 N
+ S V OW b n/a 30 4136 4183 4236 N
+ S V OW e n/a 30 4136 4183 4233 N
+ S V OW s n/a 30 4136 4183 4236 N
+ S V OY b n/a 30 4136 4183 4234 N
+ S V OY e n/a 30 4136 4183 4233 N
+ S V OY s n/a 30 4136 4183 4234 N
+ S V P b n/a 30 4136 4166 4224 N
+ S V P e n/a 30 4136 4169 4225 N
+ S V P i n/a 30 4136 4169 4224 N
+ S V P s n/a 30 4136 4169 4224 N
+ S V R b n/a 30 4136 4167 4205 N
+ S V R e n/a 30 4136 4170 4205 N
+ S V R s n/a 30 4136 4170 4205 N
+ S V S b n/a 30 4136 4168 4215 N
+ S V S e n/a 30 4136 4167 4215 N
+ S V S s n/a 30 4136 4168 4215 N
+ S V SH b n/a 30 4136 4168 4213 N
+ S V SH e n/a 30 4136 4169 4213 N
+ S V SH s n/a 30 4136 4169 4213 N
+ S V SIL e n/a 30 4136 4176 4211 N
+ S V SIL s n/a 30 4136 4176 4211 N
+ S V T b n/a 30 4136 4166 4223 N
+ S V T e n/a 30 4136 4166 4218 N
+ S V T i n/a 30 4136 4166 4218 N
+ S V T s n/a 30 4136 4166 4218 N
+ S V TH b n/a 30 4136 4168 4212 N
+ S V TH e n/a 30 4136 4167 4212 N
+ S V TH s n/a 30 4136 4168 4212 N
+ S V UH b n/a 30 4136 4183 4242 N
+ S V UH e n/a 30 4136 4183 4242 N
+ S V UH s n/a 30 4136 4183 4242 N
+ S V UW b n/a 30 4136 4183 4242 N
+ S V UW e n/a 30 4136 4183 4242 N
+ S V UW s n/a 30 4136 4183 4242 N
+ S V V b n/a 30 4136 4168 4216 N
+ S V V e n/a 30 4136 4169 4216 N
+ S V V s n/a 30 4136 4169 4216 N
+ S V W b n/a 30 4136 4168 4209 N
+ S V W e n/a 30 4136 4170 4209 N
+ S V W s n/a 30 4136 4170 4209 N
+ S V Y b n/a 30 4136 4168 4217 N
+ S V Y e n/a 30 4136 4169 4217 N
+ S V Y s n/a 30 4136 4169 4217 N
+ S V Z e n/a 30 4136 4167 4211 N
+ S V Z s n/a 30 4136 4168 4211 N
+ S V ZH e n/a 30 4136 4169 4216 N
+ S V ZH s n/a 30 4136 4169 4216 N
+ S W AA b n/a 30 4115 4196 4232 N
+ S W AA e n/a 30 4115 4196 4233 N
+ S W AA s n/a 30 4115 4196 4232 N
+ S W AE b n/a 30 4115 4196 4229 N
+ S W AE e n/a 30 4115 4196 4231 N
+ S W AE s n/a 30 4115 4196 4229 N
+ S W AH b n/a 30 4115 4196 4235 N
+ S W AH e n/a 30 4115 4196 4244 N
+ S W AH s n/a 30 4115 4196 4244 N
+ S W AO b n/a 30 4115 4196 4234 N
+ S W AO e n/a 30 4115 4196 4233 N
+ S W AO s n/a 30 4115 4196 4234 N
+ S W AW b n/a 30 4115 4196 4229 N
+ S W AW e n/a 30 4115 4196 4231 N
+ S W AW s n/a 30 4115 4196 4229 N
+ S W AY b n/a 30 4115 4196 4232 N
+ S W AY e n/a 30 4115 4196 4233 N
+ S W AY s n/a 30 4115 4196 4232 N
+ S W B b n/a 30 4115 4153 4224 N
+ S W B e n/a 30 4115 4153 4225 N
+ S W B s n/a 30 4115 4153 4224 N
+ S W CH e n/a 30 4115 4153 4218 N
+ S W CH s n/a 30 4115 4153 4218 N
+ S W D b n/a 30 4115 4153 4223 N
+ S W D e n/a 30 4115 4153 4218 N
+ S W D s n/a 30 4115 4153 4218 N
+ S W DH e n/a 30 4115 4153 4212 N
+ S W DH s n/a 30 4115 4153 4212 N
+ S W EH b n/a 30 4115 4196 4226 N
+ S W EH e n/a 30 4115 4196 4231 N
+ S W EH s n/a 30 4115 4196 4226 N
+ S W ER b n/a 30 4115 4196 4245 N
+ S W ER e n/a 30 4115 4196 4246 N
+ S W ER s n/a 30 4115 4196 4245 N
+ S W EY b n/a 30 4115 4196 4230 N
+ S W EY e n/a 30 4115 4196 4231 N
+ S W EY s n/a 30 4115 4196 4230 N
+ S W F b n/a 30 4115 4153 4214 N
+ S W F e n/a 30 4115 4153 4214 N
+ S W F s n/a 30 4115 4153 4214 N
+ S W G e n/a 30 4115 4153 4208 N
+ S W G s n/a 30 4115 4153 4207 N
+ S W HH b n/a 30 4115 4153 4213 N
+ S W HH e n/a 30 4115 4153 4213 N
+ S W HH s n/a 30 4115 4153 4213 N
+ S W IH b n/a 30 4115 4196 4239 N
+ S W IH e n/a 30 4115 4196 4240 N
+ S W IH s n/a 30 4115 4196 4240 N
+ S W IY b n/a 30 4115 4196 4247 N
+ S W IY e n/a 30 4115 4196 4247 N
+ S W IY s n/a 30 4115 4196 4247 N
+ S W JH b n/a 30 4115 4153 4223 N
+ S W JH e n/a 30 4115 4153 4218 N
+ S W JH s n/a 30 4115 4153 4218 N
+ S W K b n/a 30 4115 4153 4207 N
+ S W K e n/a 30 4115 4153 4208 N
+ S W K i n/a 30 4115 4153 4207 N
+ S W K s n/a 30 4115 4153 4207 N
+ S W L b n/a 30 4115 4153 4204 N
+ S W L e n/a 30 4115 4153 4204 N
+ S W L s n/a 30 4115 4153 4204 N
+ S W M b n/a 30 4115 4153 4206 N
+ S W M e n/a 30 4115 4153 4206 N
+ S W M s n/a 30 4115 4153 4206 N
+ S W N b n/a 30 4115 4153 4216 N
+ S W N e n/a 30 4115 4153 4216 N
+ S W N s n/a 30 4115 4153 4216 N
+ S W NG e n/a 30 4115 4153 4204 N
+ S W NG s n/a 30 4115 4153 4204 N
+ S W OW b n/a 30 4115 4196 4238 N
+ S W OW e n/a 30 4115 4196 4238 N
+ S W OW s n/a 30 4115 4196 4238 N
+ S W OY b n/a 30 4115 4196 4234 N
+ S W OY e n/a 30 4115 4196 4233 N
+ S W OY s n/a 30 4115 4196 4234 N
+ S W P b n/a 30 4115 4153 4224 N
+ S W P e n/a 30 4115 4153 4225 N
+ S W P s n/a 30 4115 4153 4224 N
+ S W R b n/a 30 4115 4153 4205 N
+ S W R e n/a 30 4115 4153 4205 N
+ S W R s n/a 30 4115 4153 4205 N
+ S W S b n/a 30 4115 4153 4215 N
+ S W S e n/a 30 4115 4153 4215 N
+ S W S s n/a 30 4115 4153 4215 N
+ S W SH b n/a 30 4115 4153 4213 N
+ S W SH e n/a 30 4115 4153 4213 N
+ S W SH s n/a 30 4115 4153 4213 N
+ S W SIL e n/a 30 4115 4176 4211 N
+ S W SIL s n/a 30 4115 4176 4211 N
+ S W T b n/a 30 4115 4153 4223 N
+ S W T e n/a 30 4115 4153 4218 N
+ S W T s n/a 30 4115 4153 4218 N
+ S W TH b n/a 30 4115 4153 4212 N
+ S W TH e n/a 30 4115 4153 4212 N
+ S W TH s n/a 30 4115 4153 4212 N
+ S W UH b n/a 30 4115 4196 4242 N
+ S W UH e n/a 30 4115 4196 4242 N
+ S W UH s n/a 30 4115 4196 4242 N
+ S W UW b n/a 30 4115 4196 4242 N
+ S W UW e n/a 30 4115 4196 4242 N
+ S W UW s n/a 30 4115 4196 4242 N
+ S W V b n/a 30 4115 4153 4216 N
+ S W V e n/a 30 4115 4153 4216 N
+ S W V s n/a 30 4115 4153 4216 N
+ S W W b n/a 30 4115 4153 4209 N
+ S W W e n/a 30 4115 4153 4209 N
+ S W W s n/a 30 4115 4153 4209 N
+ S W Y b n/a 30 4115 4153 4217 N
+ S W Y e n/a 30 4115 4153 4217 N
+ S W Y s n/a 30 4115 4153 4217 N
+ S W Z e n/a 30 4115 4153 4211 N
+ S W Z s n/a 30 4115 4153 4211 N
+ S W ZH e n/a 30 4115 4153 4216 N
+ S W ZH s n/a 30 4115 4153 4216 N
+ S Y AA b n/a 30 4126 4188 4232 N
+ S Y AA s n/a 30 4126 4189 4232 N
+ S Y AE b n/a 30 4126 4188 4229 N
+ S Y AE s n/a 30 4126 4189 4229 N
+ S Y AH b n/a 30 4126 4188 4235 N
+ S Y AH s n/a 30 4126 4189 4244 N
+ S Y AO b n/a 30 4126 4188 4234 N
+ S Y AO s n/a 30 4126 4189 4234 N
+ S Y AW b n/a 30 4126 4188 4229 N
+ S Y AW s n/a 30 4126 4189 4229 N
+ S Y AY b n/a 30 4126 4188 4232 N
+ S Y AY s n/a 30 4126 4189 4232 N
+ S Y B b n/a 30 4126 4160 4224 N
+ S Y B s n/a 30 4126 4160 4224 N
+ S Y CH s n/a 30 4126 4160 4222 N
+ S Y D b n/a 30 4126 4160 4223 N
+ S Y D s n/a 30 4126 4160 4222 N
+ S Y DH s n/a 30 4126 4158 4212 N
+ S Y EH b n/a 30 4126 4188 4227 N
+ S Y EH s n/a 30 4126 4189 4227 N
+ S Y ER b n/a 30 4126 4188 4245 N
+ S Y ER s n/a 30 4126 4189 4245 N
+ S Y EY b n/a 30 4126 4188 4230 N
+ S Y EY s n/a 30 4126 4189 4230 N
+ S Y F b n/a 30 4126 4158 4214 N
+ S Y F s n/a 30 4126 4158 4214 N
+ S Y G s n/a 30 4126 4158 4207 N
+ S Y HH b n/a 30 4126 4158 4213 N
+ S Y HH s n/a 30 4126 4158 4213 N
+ S Y IH b n/a 30 4126 4187 4239 N
+ S Y IH s n/a 30 4126 4189 4241 N
+ S Y IY b n/a 30 4126 4187 4247 N
+ S Y IY i n/a 30 4126 4187 4247 N
+ S Y IY s n/a 30 4126 4189 4247 N
+ S Y JH b n/a 30 4126 4160 4223 N
+ S Y JH s n/a 30 4126 4160 4222 N
+ S Y K b n/a 30 4126 4158 4207 N
+ S Y K s n/a 30 4126 4158 4207 N
+ S Y L b n/a 30 4126 4158 4204 N
+ S Y L s n/a 30 4126 4158 4204 N
+ S Y M b n/a 30 4126 4160 4206 N
+ S Y M s n/a 30 4126 4160 4206 N
+ S Y N b n/a 30 4126 4160 4216 N
+ S Y N s n/a 30 4126 4160 4216 N
+ S Y NG s n/a 30 4126 4158 4204 N
+ S Y OW b n/a 30 4126 4188 4236 N
+ S Y OW s n/a 30 4126 4189 4236 N
+ S Y OY b n/a 30 4126 4188 4234 N
+ S Y OY s n/a 30 4126 4189 4234 N
+ S Y P b n/a 30 4126 4160 4224 N
+ S Y P s n/a 30 4126 4160 4224 N
+ S Y R b n/a 30 4126 4158 4205 N
+ S Y R s n/a 30 4126 4158 4205 N
+ S Y S b n/a 30 4126 4160 4215 N
+ S Y S s n/a 30 4126 4160 4215 N
+ S Y SH b n/a 30 4126 4160 4213 N
+ S Y SH s n/a 30 4126 4160 4213 N
+ S Y SIL s n/a 30 4126 4175 4210 N
+ S Y T b n/a 30 4126 4160 4223 N
+ S Y T s n/a 30 4126 4160 4222 N
+ S Y TH b n/a 30 4126 4158 4212 N
+ S Y TH s n/a 30 4126 4158 4212 N
+ S Y UH b n/a 30 4126 4187 4242 N
+ S Y UH s n/a 30 4126 4189 4242 N
+ S Y UW b n/a 30 4126 4187 4242 N
+ S Y UW s n/a 30 4126 4189 4242 N
+ S Y V b n/a 30 4126 4158 4216 N
+ S Y V s n/a 30 4126 4158 4216 N
+ S Y W b n/a 30 4126 4158 4209 N
+ S Y W s n/a 30 4126 4158 4209 N
+ S Y Y b n/a 30 4126 4160 4217 N
+ S Y Y s n/a 30 4126 4160 4217 N
+ S Y Z s n/a 30 4126 4160 4210 N
+ S Y ZH s n/a 30 4126 4160 4216 N
+ S Z AA b n/a 30 4137 4179 4232 N
+ S Z AA s n/a 30 4137 4179 4232 N
+ S Z AE b n/a 30 4137 4179 4229 N
+ S Z AE s n/a 30 4137 4179 4229 N
+ S Z AH b n/a 30 4137 4179 4235 N
+ S Z AH i n/a 30 4137 4179 4243 N
+ S Z AH s n/a 30 4137 4179 4244 N
+ S Z AO b n/a 30 4137 4180 4234 N
+ S Z AO i n/a 30 4137 4180 4234 N
+ S Z AO s n/a 30 4137 4180 4234 N
+ S Z AW b n/a 30 4137 4179 4229 N
+ S Z AW s n/a 30 4137 4179 4229 N
+ S Z AY b n/a 30 4137 4179 4232 N
+ S Z AY s n/a 30 4137 4179 4232 N
+ S Z B b n/a 30 4137 4166 4224 N
+ S Z B s n/a 30 4137 4169 4224 N
+ S Z CH s n/a 30 4137 4169 4218 N
+ S Z D b n/a 30 4137 4166 4223 N
+ S Z D s n/a 30 4137 4166 4218 N
+ S Z DH s n/a 30 4137 4168 4212 N
+ S Z EH b n/a 30 4137 4179 4226 N
+ S Z EH s n/a 30 4137 4179 4226 N
+ S Z ER b n/a 30 4137 4180 4245 N
+ S Z ER s n/a 30 4137 4180 4245 N
+ S Z EY b n/a 30 4137 4179 4230 N
+ S Z EY s n/a 30 4137 4179 4230 N
+ S Z F b n/a 30 4137 4168 4214 N
+ S Z F s n/a 30 4137 4169 4214 N
+ S Z G s n/a 30 4137 4170 4207 N
+ S Z HH b n/a 30 4137 4168 4213 N
+ S Z HH s n/a 30 4137 4169 4213 N
+ S Z IH b n/a 30 4137 4181 4239 N
+ S Z IH s n/a 30 4137 4181 4240 N
+ S Z IY b n/a 30 4137 4181 4247 N
+ S Z IY s n/a 30 4137 4181 4247 N
+ S Z JH b n/a 30 4137 4168 4223 N
+ S Z JH s n/a 30 4137 4169 4218 N
+ S Z K b n/a 30 4137 4168 4207 N
+ S Z K s n/a 30 4137 4170 4207 N
+ S Z L b n/a 30 4137 4167 4204 N
+ S Z L s n/a 30 4137 4169 4204 N
+ S Z M b n/a 30 4137 4166 4206 N
+ S Z M s n/a 30 4137 4169 4206 N
+ S Z N b n/a 30 4137 4166 4216 N
+ S Z N s n/a 30 4137 4166 4216 N
+ S Z NG s n/a 30 4137 4170 4204 N
+ S Z OW b n/a 30 4137 4180 4236 N
+ S Z OW s n/a 30 4137 4180 4236 N
+ S Z OY b n/a 30 4137 4180 4234 N
+ S Z OY s n/a 30 4137 4180 4234 N
+ S Z P b n/a 30 4137 4166 4224 N
+ S Z P s n/a 30 4137 4169 4224 N
+ S Z R b n/a 30 4137 4167 4205 N
+ S Z R s n/a 30 4137 4170 4205 N
+ S Z S b n/a 30 4137 4168 4215 N
+ S Z S s n/a 30 4137 4168 4215 N
+ S Z SH b n/a 30 4137 4168 4213 N
+ S Z SH s n/a 30 4137 4169 4213 N
+ S Z SIL s n/a 30 4137 4178 4211 N
+ S Z T b n/a 30 4137 4166 4223 N
+ S Z T i n/a 30 4137 4166 4218 N
+ S Z T s n/a 30 4137 4166 4218 N
+ S Z TH b n/a 30 4137 4168 4212 N
+ S Z TH s n/a 30 4137 4168 4212 N
+ S Z UH b n/a 30 4137 4181 4242 N
+ S Z UH s n/a 30 4137 4181 4242 N
+ S Z UW b n/a 30 4137 4181 4242 N
+ S Z UW s n/a 30 4137 4181 4242 N
+ S Z V b n/a 30 4137 4168 4216 N
+ S Z V s n/a 30 4137 4169 4216 N
+ S Z W b n/a 30 4137 4168 4209 N
+ S Z W s n/a 30 4137 4170 4209 N
+ S Z Y b n/a 30 4137 4168 4217 N
+ S Z Y s n/a 30 4137 4169 4217 N
+ S Z Z s n/a 30 4137 4168 4211 N
+ S Z ZH s n/a 30 4137 4169 4216 N
+ S ZH AA b n/a 30 4140 4183 4232 N
+ S ZH AA s n/a 30 4140 4183 4232 N
+ S ZH AE b n/a 30 4140 4183 4229 N
+ S ZH AE s n/a 30 4140 4183 4229 N
+ S ZH AH b n/a 30 4140 4183 4235 N
+ S ZH AH s n/a 30 4140 4183 4244 N
+ S ZH AO b n/a 30 4140 4183 4234 N
+ S ZH AO s n/a 30 4140 4183 4234 N
+ S ZH AW b n/a 30 4140 4183 4229 N
+ S ZH AW s n/a 30 4140 4183 4229 N
+ S ZH AY b n/a 30 4140 4183 4232 N
+ S ZH AY s n/a 30 4140 4183 4232 N
+ S ZH B b n/a 30 4140 4166 4224 N
+ S ZH B s n/a 30 4140 4169 4224 N
+ S ZH CH s n/a 30 4140 4169 4218 N
+ S ZH D b n/a 30 4140 4166 4223 N
+ S ZH D s n/a 30 4140 4166 4218 N
+ S ZH DH s n/a 30 4140 4168 4212 N
+ S ZH EH b n/a 30 4140 4183 4226 N
+ S ZH EH s n/a 30 4140 4183 4226 N
+ S ZH ER b n/a 30 4140 4183 4245 N
+ S ZH ER s n/a 30 4140 4183 4245 N
+ S ZH EY b n/a 30 4140 4183 4230 N
+ S ZH EY s n/a 30 4140 4183 4230 N
+ S ZH F b n/a 30 4140 4168 4214 N
+ S ZH F s n/a 30 4140 4169 4214 N
+ S ZH G s n/a 30 4140 4170 4207 N
+ S ZH HH b n/a 30 4140 4168 4213 N
+ S ZH HH s n/a 30 4140 4169 4213 N
+ S ZH IH b n/a 30 4140 4183 4239 N
+ S ZH IH s n/a 30 4140 4183 4240 N
+ S ZH IY b n/a 30 4140 4183 4247 N
+ S ZH IY s n/a 30 4140 4183 4247 N
+ S ZH JH b n/a 30 4140 4168 4223 N
+ S ZH JH s n/a 30 4140 4169 4218 N
+ S ZH K b n/a 30 4140 4168 4207 N
+ S ZH K i n/a 30 4140 4170 4207 N
+ S ZH K s n/a 30 4140 4170 4207 N
+ S ZH L b n/a 30 4140 4167 4204 N
+ S ZH L s n/a 30 4140 4169 4204 N
+ S ZH M b n/a 30 4140 4166 4206 N
+ S ZH M s n/a 30 4140 4169 4206 N
+ S ZH N b n/a 30 4140 4166 4216 N
+ S ZH N s n/a 30 4140 4166 4216 N
+ S ZH NG s n/a 30 4140 4170 4204 N
+ S ZH OW b n/a 30 4140 4183 4236 N
+ S ZH OW s n/a 30 4140 4183 4236 N
+ S ZH OY b n/a 30 4140 4183 4234 N
+ S ZH OY s n/a 30 4140 4183 4234 N
+ S ZH P b n/a 30 4140 4166 4224 N
+ S ZH P s n/a 30 4140 4169 4224 N
+ S ZH R b n/a 30 4140 4167 4205 N
+ S ZH R s n/a 30 4140 4170 4205 N
+ S ZH S b n/a 30 4140 4168 4215 N
+ S ZH S s n/a 30 4140 4168 4215 N
+ S ZH SH b n/a 30 4140 4168 4213 N
+ S ZH SH s n/a 30 4140 4169 4213 N
+ S ZH SIL s n/a 30 4140 4176 4211 N
+ S ZH T b n/a 30 4140 4166 4223 N
+ S ZH T s n/a 30 4140 4166 4218 N
+ S ZH TH b n/a 30 4140 4168 4212 N
+ S ZH TH s n/a 30 4140 4168 4212 N
+ S ZH UH b n/a 30 4140 4183 4242 N
+ S ZH UH s n/a 30 4140 4183 4242 N
+ S ZH UW b n/a 30 4140 4183 4242 N
+ S ZH UW s n/a 30 4140 4183 4242 N
+ S ZH V b n/a 30 4140 4168 4216 N
+ S ZH V s n/a 30 4140 4169 4216 N
+ S ZH W b n/a 30 4140 4168 4209 N
+ S ZH W s n/a 30 4140 4170 4209 N
+ S ZH Y b n/a 30 4140 4168 4217 N
+ S ZH Y s n/a 30 4140 4169 4217 N
+ S ZH Z s n/a 30 4140 4168 4211 N
+ S ZH ZH s n/a 30 4140 4169 4216 N
+ SH AA AA b n/a 31 4260 4265 4288 N
+ SH AA AA e n/a 31 4259 4270 4288 N
+ SH AA AA i n/a 31 4259 4270 4288 N
+ SH AA AA s n/a 31 4259 4270 4288 N
+ SH AA AE b n/a 31 4260 4265 4289 N
+ SH AA AE e n/a 31 4259 4270 4289 N
+ SH AA AE i n/a 31 4259 4270 4289 N
+ SH AA AE s n/a 31 4259 4270 4289 N
+ SH AA AH b n/a 31 4260 4265 4289 N
+ SH AA AH e n/a 31 4259 4270 4279 N
+ SH AA AH i n/a 31 4259 4270 4279 N
+ SH AA AH s n/a 31 4259 4270 4279 N
+ SH AA AO b n/a 31 4260 4265 4290 N
+ SH AA AO e n/a 31 4259 4270 4290 N
+ SH AA AO i n/a 31 4259 4270 4290 N
+ SH AA AO s n/a 31 4259 4270 4290 N
+ SH AA AW b n/a 31 4260 4265 4289 N
+ SH AA AW e n/a 31 4259 4270 4289 N
+ SH AA AW i n/a 31 4259 4270 4289 N
+ SH AA AW s n/a 31 4259 4270 4289 N
+ SH AA AY b n/a 31 4260 4265 4288 N
+ SH AA AY e n/a 31 4259 4270 4288 N
+ SH AA AY s n/a 31 4259 4270 4288 N
+ SH AA B b n/a 31 4260 4265 4283 N
+ SH AA B e n/a 31 4259 4270 4283 N
+ SH AA B i n/a 31 4259 4270 4283 N
+ SH AA B s n/a 31 4259 4270 4283 N
+ SH AA CH b n/a 31 4260 4265 4282 N
+ SH AA CH e n/a 31 4259 4270 4282 N
+ SH AA CH i n/a 31 4259 4270 4282 N
+ SH AA CH s n/a 31 4259 4270 4282 N
+ SH AA D e n/a 31 4259 4270 4284 N
+ SH AA D s n/a 31 4259 4270 4284 N
+ SH AA DH e n/a 31 4259 4270 4284 N
+ SH AA DH s n/a 31 4259 4270 4284 N
+ SH AA EH b n/a 31 4260 4265 4287 N
+ SH AA EH e n/a 31 4259 4270 4279 N
+ SH AA EH i n/a 31 4259 4270 4279 N
+ SH AA EH s n/a 31 4259 4270 4279 N
+ SH AA ER b n/a 31 4260 4265 4285 N
+ SH AA ER e n/a 31 4259 4270 4285 N
+ SH AA ER i n/a 31 4259 4270 4285 N
+ SH AA ER s n/a 31 4259 4270 4285 N
+ SH AA EY b n/a 31 4260 4266 4287 N
+ SH AA EY e n/a 31 4259 4270 4287 N
+ SH AA EY s n/a 31 4259 4270 4287 N
+ SH AA F e n/a 31 4259 4270 4283 N
+ SH AA F i n/a 31 4259 4270 4283 N
+ SH AA F s n/a 31 4259 4270 4283 N
+ SH AA G e n/a 31 4259 4270 4283 N
+ SH AA G i n/a 31 4259 4270 4283 N
+ SH AA G s n/a 31 4259 4270 4283 N
+ SH AA HH e n/a 31 4259 4270 4282 N
+ SH AA HH i n/a 31 4259 4270 4282 N
+ SH AA HH s n/a 31 4259 4270 4282 N
+ SH AA IH b n/a 31 4260 4265 4287 N
+ SH AA IH e n/a 31 4259 4270 4279 N
+ SH AA IH i n/a 31 4259 4270 4279 N
+ SH AA IH s n/a 31 4259 4270 4279 N
+ SH AA IY b n/a 31 4260 4266 4278 N
+ SH AA IY e n/a 31 4259 4270 4278 N
+ SH AA IY i n/a 31 4259 4270 4278 N
+ SH AA IY s n/a 31 4259 4270 4278 N
+ SH AA JH e n/a 31 4259 4270 4283 N
+ SH AA JH s n/a 31 4259 4270 4283 N
+ SH AA K b n/a 31 4260 4265 4283 N
+ SH AA K e n/a 31 4259 4270 4283 N
+ SH AA K i n/a 31 4259 4270 4283 N
+ SH AA K s n/a 31 4259 4270 4283 N
+ SH AA L b n/a 31 4260 4265 4283 N
+ SH AA L e n/a 31 4259 4270 4283 N
+ SH AA L i n/a 31 4259 4270 4283 N
+ SH AA L s n/a 31 4259 4270 4283 N
+ SH AA M b n/a 31 4260 4265 4283 N
+ SH AA M e n/a 31 4259 4270 4283 N
+ SH AA M i n/a 31 4259 4270 4283 N
+ SH AA M s n/a 31 4259 4270 4283 N
+ SH AA N b n/a 31 4260 4265 4279 N
+ SH AA N e n/a 31 4259 4270 4279 N
+ SH AA N s n/a 31 4259 4270 4279 N
+ SH AA NG e n/a 31 4259 4270 4283 N
+ SH AA NG s n/a 31 4259 4270 4283 N
+ SH AA OW b n/a 31 4260 4265 4288 N
+ SH AA OW e n/a 31 4259 4270 4288 N
+ SH AA OW i n/a 31 4259 4270 4290 N
+ SH AA OW s n/a 31 4259 4270 4288 N
+ SH AA OY b n/a 31 4260 4265 4290 N
+ SH AA OY e n/a 31 4259 4270 4290 N
+ SH AA OY s n/a 31 4259 4270 4290 N
+ SH AA P e n/a 31 4259 4270 4283 N
+ SH AA P s n/a 31 4259 4270 4283 N
+ SH AA R b n/a 31 4260 4265 4283 N
+ SH AA R e n/a 31 4259 4270 4283 N
+ SH AA R i n/a 31 4259 4270 4283 N
+ SH AA R s n/a 31 4259 4270 4283 N
+ SH AA S e n/a 31 4259 4270 4284 N
+ SH AA S i n/a 31 4259 4270 4284 N
+ SH AA S s n/a 31 4259 4270 4284 N
+ SH AA SH e n/a 31 4259 4270 4282 N
+ SH AA SH i n/a 31 4259 4270 4282 N
+ SH AA SH s n/a 31 4259 4270 4282 N
+ SH AA SIL e n/a 31 4259 4271 4282 N
+ SH AA SIL s n/a 31 4259 4271 4282 N
+ SH AA T b n/a 31 4260 4265 4284 N
+ SH AA T e n/a 31 4259 4270 4284 N
+ SH AA T i n/a 31 4259 4270 4284 N
+ SH AA T s n/a 31 4259 4270 4284 N
+ SH AA TH e n/a 31 4259 4270 4284 N
+ SH AA TH s n/a 31 4259 4270 4284 N
+ SH AA UH b n/a 31 4260 4265 4285 N
+ SH AA UH e n/a 31 4259 4270 4280 N
+ SH AA UH s n/a 31 4259 4270 4280 N
+ SH AA UW b n/a 31 4260 4265 4286 N
+ SH AA UW e n/a 31 4259 4270 4286 N
+ SH AA UW i n/a 31 4259 4270 4286 N
+ SH AA UW s n/a 31 4259 4270 4286 N
+ SH AA V b n/a 31 4260 4265 4283 N
+ SH AA V e n/a 31 4259 4270 4283 N
+ SH AA V i n/a 31 4259 4270 4283 N
+ SH AA V s n/a 31 4259 4270 4283 N
+ SH AA W b n/a 31 4260 4265 4283 N
+ SH AA W e n/a 31 4259 4270 4283 N
+ SH AA W s n/a 31 4259 4270 4283 N
+ SH AA Y b n/a 31 4260 4266 4278 N
+ SH AA Y e n/a 31 4259 4270 4278 N
+ SH AA Y i n/a 31 4259 4270 4278 N
+ SH AA Y s n/a 31 4259 4270 4278 N
+ SH AA Z e n/a 31 4259 4270 4284 N
+ SH AA Z s n/a 31 4259 4270 4284 N
+ SH AA ZH e n/a 31 4259 4270 4283 N
+ SH AA ZH s n/a 31 4259 4270 4283 N
+ SH AE AA b n/a 31 4260 4265 4288 N
+ SH AE AA e n/a 31 4258 4270 4288 N
+ SH AE AA i n/a 31 4258 4270 4288 N
+ SH AE AA s n/a 31 4258 4270 4288 N
+ SH AE AE b n/a 31 4260 4265 4289 N
+ SH AE AE e n/a 31 4258 4270 4289 N
+ SH AE AE s n/a 31 4258 4270 4289 N
+ SH AE AH b n/a 31 4260 4265 4289 N
+ SH AE AH e n/a 31 4258 4270 4279 N
+ SH AE AH i n/a 31 4258 4270 4279 N
+ SH AE AH s n/a 31 4258 4270 4279 N
+ SH AE AO b n/a 31 4260 4265 4290 N
+ SH AE AO e n/a 31 4258 4270 4290 N
+ SH AE AO i n/a 31 4258 4270 4290 N
+ SH AE AO s n/a 31 4258 4270 4290 N
+ SH AE AW b n/a 31 4260 4265 4289 N
+ SH AE AW e n/a 31 4258 4270 4289 N
+ SH AE AW i n/a 31 4258 4270 4289 N
+ SH AE AW s n/a 31 4258 4270 4289 N
+ SH AE AY b n/a 31 4260 4265 4288 N
+ SH AE AY e n/a 31 4258 4270 4288 N
+ SH AE AY i n/a 31 4258 4270 4288 N
+ SH AE AY s n/a 31 4258 4270 4288 N
+ SH AE B b n/a 31 4260 4265 4283 N
+ SH AE B e n/a 31 4258 4270 4283 N
+ SH AE B i n/a 31 4258 4270 4283 N
+ SH AE B s n/a 31 4258 4270 4283 N
+ SH AE CH b n/a 31 4260 4265 4282 N
+ SH AE CH e n/a 31 4258 4270 4282 N
+ SH AE CH s n/a 31 4258 4270 4282 N
+ SH AE D e n/a 31 4258 4270 4284 N
+ SH AE D i n/a 31 4258 4270 4284 N
+ SH AE D s n/a 31 4258 4270 4284 N
+ SH AE DH e n/a 31 4258 4270 4284 N
+ SH AE DH s n/a 31 4258 4270 4284 N
+ SH AE EH b n/a 31 4260 4265 4287 N
+ SH AE EH e n/a 31 4258 4270 4279 N
+ SH AE EH i n/a 31 4258 4270 4279 N
+ SH AE EH s n/a 31 4258 4270 4279 N
+ SH AE ER b n/a 31 4260 4265 4285 N
+ SH AE ER e n/a 31 4258 4270 4285 N
+ SH AE ER i n/a 31 4258 4270 4285 N
+ SH AE ER s n/a 31 4258 4270 4285 N
+ SH AE EY b n/a 31 4260 4266 4287 N
+ SH AE EY e n/a 31 4258 4270 4287 N
+ SH AE EY i n/a 31 4258 4270 4287 N
+ SH AE EY s n/a 31 4258 4270 4287 N
+ SH AE F e n/a 31 4258 4270 4283 N
+ SH AE F i n/a 31 4258 4270 4283 N
+ SH AE F s n/a 31 4258 4270 4283 N
+ SH AE G e n/a 31 4258 4270 4283 N
+ SH AE G i n/a 31 4258 4270 4283 N
+ SH AE G s n/a 31 4258 4270 4283 N
+ SH AE HH e n/a 31 4258 4270 4282 N
+ SH AE HH s n/a 31 4258 4270 4282 N
+ SH AE IH b n/a 31 4260 4265 4287 N
+ SH AE IH e n/a 31 4258 4270 4279 N
+ SH AE IH i n/a 31 4258 4270 4279 N
+ SH AE IH s n/a 31 4258 4270 4279 N
+ SH AE IY b n/a 31 4260 4266 4278 N
+ SH AE IY e n/a 31 4258 4270 4278 N
+ SH AE IY i n/a 31 4258 4270 4278 N
+ SH AE IY s n/a 31 4258 4270 4278 N
+ SH AE JH e n/a 31 4258 4270 4283 N
+ SH AE JH i n/a 31 4258 4270 4283 N
+ SH AE JH s n/a 31 4258 4270 4283 N
+ SH AE K b n/a 31 4260 4265 4283 N
+ SH AE K e n/a 31 4258 4270 4283 N
+ SH AE K i n/a 31 4258 4270 4283 N
+ SH AE K s n/a 31 4258 4270 4283 N
+ SH AE L b n/a 31 4260 4265 4283 N
+ SH AE L e n/a 31 4258 4270 4283 N
+ SH AE L i n/a 31 4258 4270 4283 N
+ SH AE L s n/a 31 4258 4270 4283 N
+ SH AE M b n/a 31 4260 4265 4283 N
+ SH AE M e n/a 31 4258 4270 4283 N
+ SH AE M i n/a 31 4258 4270 4283 N
+ SH AE M s n/a 31 4258 4270 4283 N
+ SH AE N b n/a 31 4260 4265 4279 N
+ SH AE N e n/a 31 4258 4270 4279 N
+ SH AE N i n/a 31 4258 4270 4279 N
+ SH AE N s n/a 31 4258 4270 4279 N
+ SH AE NG e n/a 31 4258 4270 4283 N
+ SH AE NG s n/a 31 4258 4270 4283 N
+ SH AE OW b n/a 31 4260 4265 4288 N
+ SH AE OW e n/a 31 4258 4270 4288 N
+ SH AE OW i n/a 31 4258 4270 4290 N
+ SH AE OW s n/a 31 4258 4270 4288 N
+ SH AE OY b n/a 31 4260 4265 4290 N
+ SH AE OY e n/a 31 4258 4270 4290 N
+ SH AE OY s n/a 31 4258 4270 4290 N
+ SH AE P e n/a 31 4258 4270 4283 N
+ SH AE P i n/a 31 4258 4270 4283 N
+ SH AE P s n/a 31 4258 4270 4283 N
+ SH AE R b n/a 31 4260 4265 4283 N
+ SH AE R e n/a 31 4258 4270 4283 N
+ SH AE R i n/a 31 4258 4270 4283 N
+ SH AE R s n/a 31 4258 4270 4283 N
+ SH AE S e n/a 31 4258 4270 4284 N
+ SH AE S s n/a 31 4258 4270 4284 N
+ SH AE SH e n/a 31 4258 4270 4282 N
+ SH AE SH s n/a 31 4258 4270 4282 N
+ SH AE SIL e n/a 31 4259 4271 4282 N
+ SH AE SIL s n/a 31 4259 4271 4282 N
+ SH AE T b n/a 31 4260 4265 4284 N
+ SH AE T e n/a 31 4258 4270 4284 N
+ SH AE T i n/a 31 4258 4270 4284 N
+ SH AE T s n/a 31 4258 4270 4284 N
+ SH AE TH e n/a 31 4258 4270 4284 N
+ SH AE TH s n/a 31 4258 4270 4284 N
+ SH AE UH b n/a 31 4260 4265 4285 N
+ SH AE UH e n/a 31 4258 4270 4280 N
+ SH AE UH i n/a 31 4258 4270 4280 N
+ SH AE UH s n/a 31 4258 4270 4280 N
+ SH AE UW b n/a 31 4260 4265 4286 N
+ SH AE UW e n/a 31 4258 4270 4286 N
+ SH AE UW i n/a 31 4258 4270 4286 N
+ SH AE UW s n/a 31 4258 4270 4286 N
+ SH AE V b n/a 31 4260 4265 4283 N
+ SH AE V e n/a 31 4258 4270 4283 N
+ SH AE V i n/a 31 4258 4270 4283 N
+ SH AE V s n/a 31 4258 4270 4283 N
+ SH AE W b n/a 31 4260 4265 4283 N
+ SH AE W e n/a 31 4258 4270 4283 N
+ SH AE W i n/a 31 4258 4270 4283 N
+ SH AE W s n/a 31 4258 4270 4283 N
+ SH AE Y b n/a 31 4260 4266 4278 N
+ SH AE Y e n/a 31 4258 4270 4278 N
+ SH AE Y s n/a 31 4258 4270 4278 N
+ SH AE Z e n/a 31 4258 4270 4284 N
+ SH AE Z s n/a 31 4258 4270 4284 N
+ SH AE ZH e n/a 31 4258 4270 4283 N
+ SH AE ZH s n/a 31 4258 4270 4283 N
+ SH AH AA b n/a 31 4260 4265 4288 N
+ SH AH AA e n/a 31 4260 4271 4288 N
+ SH AH AA i n/a 31 4260 4271 4288 N
+ SH AH AA s n/a 31 4260 4271 4288 N
+ SH AH AE b n/a 31 4260 4265 4289 N
+ SH AH AE e n/a 31 4260 4271 4289 N
+ SH AH AE i n/a 31 4260 4271 4289 N
+ SH AH AE s n/a 31 4260 4271 4289 N
+ SH AH AH b n/a 31 4260 4265 4288 N
+ SH AH AH e n/a 31 4259 4270 4279 N
+ SH AH AH i n/a 31 4259 4270 4279 N
+ SH AH AH s n/a 31 4259 4270 4279 N
+ SH AH AO b n/a 31 4260 4265 4290 N
+ SH AH AO e n/a 31 4260 4271 4290 N
+ SH AH AO i n/a 31 4260 4271 4290 N
+ SH AH AO s n/a 31 4260 4271 4290 N
+ SH AH AW b n/a 31 4260 4265 4289 N
+ SH AH AW e n/a 31 4259 4271 4289 N
+ SH AH AW s n/a 31 4259 4271 4289 N
+ SH AH AY b n/a 31 4260 4265 4288 N
+ SH AH AY e n/a 31 4259 4271 4288 N
+ SH AH AY i n/a 31 4259 4271 4288 N
+ SH AH AY s n/a 31 4259 4271 4288 N
+ SH AH B b n/a 31 4260 4265 4283 N
+ SH AH B e n/a 31 4259 4270 4283 N
+ SH AH B i n/a 31 4259 4270 4283 N
+ SH AH B s n/a 31 4259 4270 4283 N
+ SH AH CH b n/a 31 4260 4265 4282 N
+ SH AH CH e n/a 31 4259 4270 4282 N
+ SH AH CH i n/a 31 4259 4270 4282 N
+ SH AH CH s n/a 31 4259 4270 4282 N
+ SH AH D e n/a 31 4259 4270 4284 N
+ SH AH D i n/a 31 4259 4270 4284 N
+ SH AH D s n/a 31 4259 4270 4284 N
+ SH AH DH e n/a 31 4259 4270 4284 N
+ SH AH DH s n/a 31 4259 4270 4284 N
+ SH AH EH b n/a 31 4260 4265 4287 N
+ SH AH EH e n/a 31 4259 4271 4279 N
+ SH AH EH i n/a 31 4259 4271 4279 N
+ SH AH EH s n/a 31 4259 4271 4279 N
+ SH AH ER b n/a 31 4260 4265 4285 N
+ SH AH ER e n/a 31 4260 4270 4285 N
+ SH AH ER i n/a 31 4260 4270 4285 N
+ SH AH ER s n/a 31 4260 4270 4285 N
+ SH AH EY b n/a 31 4260 4266 4287 N
+ SH AH EY e n/a 31 4260 4271 4287 N
+ SH AH EY i n/a 31 4260 4271 4287 N
+ SH AH EY s n/a 31 4260 4271 4287 N
+ SH AH F e n/a 31 4259 4270 4283 N
+ SH AH F i n/a 31 4259 4270 4283 N
+ SH AH F s n/a 31 4259 4270 4283 N
+ SH AH G e n/a 31 4259 4270 4283 N
+ SH AH G s n/a 31 4259 4270 4283 N
+ SH AH HH e n/a 31 4259 4270 4282 N
+ SH AH HH s n/a 31 4259 4270 4282 N
+ SH AH IH b n/a 31 4260 4265 4287 N
+ SH AH IH e n/a 31 4259 4270 4280 N
+ SH AH IH i n/a 31 4259 4270 4280 N
+ SH AH IH s n/a 31 4259 4270 4280 N
+ SH AH IY b n/a 31 4260 4266 4278 N
+ SH AH IY e n/a 31 4260 4271 4278 N
+ SH AH IY i n/a 31 4260 4271 4278 N
+ SH AH IY s n/a 31 4260 4271 4278 N
+ SH AH JH e n/a 31 4259 4270 4283 N
+ SH AH JH s n/a 31 4259 4270 4283 N
+ SH AH K b n/a 31 4260 4265 4283 N
+ SH AH K e n/a 31 4259 4270 4283 N
+ SH AH K i n/a 31 4259 4270 4283 N
+ SH AH K s n/a 31 4259 4270 4283 N
+ SH AH L b n/a 31 4260 4265 4283 N
+ SH AH L e n/a 31 4259 4270 4283 N
+ SH AH L i n/a 31 4259 4270 4283 N
+ SH AH L s n/a 31 4259 4270 4283 N
+ SH AH M b n/a 31 4260 4265 4283 N
+ SH AH M e n/a 31 4259 4270 4283 N
+ SH AH M i n/a 31 4259 4270 4283 N
+ SH AH M s n/a 31 4259 4270 4283 N
+ SH AH N b n/a 31 4260 4265 4279 N
+ SH AH N e n/a 31 4259 4270 4279 N
+ SH AH N i n/a 31 4259 4270 4279 N
+ SH AH N s n/a 31 4259 4270 4279 N
+ SH AH NG e n/a 31 4259 4270 4283 N
+ SH AH NG s n/a 31 4259 4270 4283 N
+ SH AH OW b n/a 31 4260 4265 4288 N
+ SH AH OW e n/a 31 4260 4271 4288 N
+ SH AH OW i n/a 31 4260 4271 4290 N
+ SH AH OW s n/a 31 4260 4271 4288 N
+ SH AH OY b n/a 31 4260 4265 4290 N
+ SH AH OY e n/a 31 4260 4271 4290 N
+ SH AH OY s n/a 31 4260 4271 4290 N
+ SH AH P e n/a 31 4259 4270 4283 N
+ SH AH P s n/a 31 4259 4270 4283 N
+ SH AH R b n/a 31 4260 4265 4283 N
+ SH AH R e n/a 31 4259 4270 4283 N
+ SH AH R i n/a 31 4259 4270 4283 N
+ SH AH R s n/a 31 4259 4270 4283 N
+ SH AH S e n/a 31 4259 4270 4284 N
+ SH AH S s n/a 31 4259 4270 4284 N
+ SH AH SH e n/a 31 4259 4270 4282 N
+ SH AH SH s n/a 31 4259 4270 4282 N
+ SH AH SIL e n/a 31 4259 4271 4282 N
+ SH AH SIL s n/a 31 4259 4271 4282 N
+ SH AH T b n/a 31 4260 4265 4284 N
+ SH AH T e n/a 31 4259 4270 4284 N
+ SH AH T i n/a 31 4259 4270 4284 N
+ SH AH T s n/a 31 4259 4270 4284 N
+ SH AH TH e n/a 31 4259 4270 4284 N
+ SH AH TH s n/a 31 4259 4270 4284 N
+ SH AH UH b n/a 31 4260 4265 4285 N
+ SH AH UH e n/a 31 4260 4271 4280 N
+ SH AH UH i n/a 31 4260 4271 4280 N
+ SH AH UH s n/a 31 4260 4271 4280 N
+ SH AH UW b n/a 31 4260 4265 4286 N
+ SH AH UW e n/a 31 4260 4271 4286 N
+ SH AH UW i n/a 31 4260 4271 4286 N
+ SH AH UW s n/a 31 4260 4271 4286 N
+ SH AH V b n/a 31 4260 4265 4283 N
+ SH AH V e n/a 31 4259 4270 4283 N
+ SH AH V i n/a 31 4259 4270 4283 N
+ SH AH V s n/a 31 4259 4270 4283 N
+ SH AH W b n/a 31 4260 4265 4283 N
+ SH AH W e n/a 31 4260 4270 4283 N
+ SH AH W i n/a 31 4260 4270 4283 N
+ SH AH W s n/a 31 4260 4270 4283 N
+ SH AH Y b n/a 31 4260 4266 4278 N
+ SH AH Y e n/a 31 4259 4270 4278 N
+ SH AH Y s n/a 31 4259 4270 4278 N
+ SH AH Z e n/a 31 4259 4270 4284 N
+ SH AH Z s n/a 31 4259 4270 4284 N
+ SH AH ZH e n/a 31 4259 4270 4283 N
+ SH AH ZH s n/a 31 4259 4270 4283 N
+ SH AO AA b n/a 31 4260 4265 4288 N
+ SH AO AA e n/a 31 4259 4270 4288 N
+ SH AO AA i n/a 31 4259 4270 4288 N
+ SH AO AA s n/a 31 4259 4270 4288 N
+ SH AO AE b n/a 31 4260 4265 4289 N
+ SH AO AE e n/a 31 4259 4270 4289 N
+ SH AO AE i n/a 31 4259 4270 4289 N
+ SH AO AE s n/a 31 4259 4270 4289 N
+ SH AO AH b n/a 31 4260 4265 4289 N
+ SH AO AH e n/a 31 4259 4270 4279 N
+ SH AO AH i n/a 31 4259 4270 4279 N
+ SH AO AH s n/a 31 4259 4270 4279 N
+ SH AO AO b n/a 31 4260 4265 4290 N
+ SH AO AO e n/a 31 4259 4270 4290 N
+ SH AO AO i n/a 31 4259 4270 4290 N
+ SH AO AO s n/a 31 4259 4270 4290 N
+ SH AO AW b n/a 31 4260 4265 4289 N
+ SH AO AW e n/a 31 4259 4270 4289 N
+ SH AO AW s n/a 31 4259 4270 4289 N
+ SH AO AY b n/a 31 4260 4265 4288 N
+ SH AO AY e n/a 31 4259 4270 4288 N
+ SH AO AY i n/a 31 4259 4270 4288 N
+ SH AO AY s n/a 31 4259 4270 4288 N
+ SH AO B b n/a 31 4260 4265 4283 N
+ SH AO B e n/a 31 4259 4270 4283 N
+ SH AO B i n/a 31 4259 4270 4283 N
+ SH AO B s n/a 31 4259 4270 4283 N
+ SH AO CH b n/a 31 4260 4265 4282 N
+ SH AO CH e n/a 31 4259 4270 4282 N
+ SH AO CH s n/a 31 4259 4270 4282 N
+ SH AO D e n/a 31 4259 4270 4284 N
+ SH AO D s n/a 31 4259 4270 4284 N
+ SH AO DH e n/a 31 4259 4270 4284 N
+ SH AO DH s n/a 31 4259 4270 4284 N
+ SH AO EH b n/a 31 4260 4265 4287 N
+ SH AO EH e n/a 31 4259 4270 4279 N
+ SH AO EH i n/a 31 4259 4270 4279 N
+ SH AO EH s n/a 31 4259 4270 4279 N
+ SH AO ER b n/a 31 4260 4265 4285 N
+ SH AO ER e n/a 31 4259 4270 4285 N
+ SH AO ER i n/a 31 4259 4270 4285 N
+ SH AO ER s n/a 31 4259 4270 4285 N
+ SH AO EY b n/a 31 4260 4266 4287 N
+ SH AO EY e n/a 31 4259 4270 4287 N
+ SH AO EY s n/a 31 4259 4270 4287 N
+ SH AO F e n/a 31 4259 4270 4283 N
+ SH AO F s n/a 31 4259 4270 4283 N
+ SH AO G e n/a 31 4259 4270 4283 N
+ SH AO G s n/a 31 4259 4270 4283 N
+ SH AO HH e n/a 31 4259 4270 4282 N
+ SH AO HH s n/a 31 4259 4270 4282 N
+ SH AO IH b n/a 31 4260 4265 4287 N
+ SH AO IH e n/a 31 4259 4270 4279 N
+ SH AO IH i n/a 31 4259 4270 4279 N
+ SH AO IH s n/a 31 4259 4270 4279 N
+ SH AO IY b n/a 31 4260 4266 4278 N
+ SH AO IY e n/a 31 4259 4270 4278 N
+ SH AO IY i n/a 31 4259 4270 4278 N
+ SH AO IY s n/a 31 4259 4270 4278 N
+ SH AO JH e n/a 31 4259 4270 4283 N
+ SH AO JH s n/a 31 4259 4270 4283 N
+ SH AO K b n/a 31 4260 4265 4283 N
+ SH AO K e n/a 31 4259 4270 4283 N
+ SH AO K i n/a 31 4259 4270 4283 N
+ SH AO K s n/a 31 4259 4270 4283 N
+ SH AO L b n/a 31 4260 4265 4283 N
+ SH AO L e n/a 31 4259 4270 4283 N
+ SH AO L s n/a 31 4259 4270 4283 N
+ SH AO M b n/a 31 4260 4265 4283 N
+ SH AO M e n/a 31 4259 4270 4283 N
+ SH AO M i n/a 31 4259 4270 4283 N
+ SH AO M s n/a 31 4259 4270 4283 N
+ SH AO N b n/a 31 4260 4265 4279 N
+ SH AO N e n/a 31 4259 4270 4279 N
+ SH AO N s n/a 31 4259 4270 4279 N
+ SH AO NG e n/a 31 4259 4270 4283 N
+ SH AO NG s n/a 31 4259 4270 4283 N
+ SH AO OW b n/a 31 4260 4265 4288 N
+ SH AO OW e n/a 31 4259 4270 4288 N
+ SH AO OW s n/a 31 4259 4270 4288 N
+ SH AO OY b n/a 31 4260 4265 4290 N
+ SH AO OY e n/a 31 4259 4270 4290 N
+ SH AO OY s n/a 31 4259 4270 4290 N
+ SH AO P e n/a 31 4259 4270 4283 N
+ SH AO P s n/a 31 4259 4270 4283 N
+ SH AO R b n/a 31 4260 4265 4283 N
+ SH AO R e n/a 31 4259 4270 4283 N
+ SH AO R s n/a 31 4259 4270 4283 N
+ SH AO S e n/a 31 4259 4270 4284 N
+ SH AO S s n/a 31 4259 4270 4284 N
+ SH AO SH e n/a 31 4259 4270 4282 N
+ SH AO SH s n/a 31 4259 4270 4282 N
+ SH AO SIL e n/a 31 4259 4271 4282 N
+ SH AO SIL s n/a 31 4259 4271 4282 N
+ SH AO T b n/a 31 4260 4265 4284 N
+ SH AO T e n/a 31 4259 4270 4284 N
+ SH AO T i n/a 31 4259 4270 4284 N
+ SH AO T s n/a 31 4259 4270 4284 N
+ SH AO TH e n/a 31 4259 4270 4284 N
+ SH AO TH s n/a 31 4259 4270 4284 N
+ SH AO UH b n/a 31 4260 4265 4285 N
+ SH AO UH e n/a 31 4259 4270 4280 N
+ SH AO UH s n/a 31 4259 4270 4280 N
+ SH AO UW b n/a 31 4260 4265 4286 N
+ SH AO UW e n/a 31 4259 4270 4286 N
+ SH AO UW s n/a 31 4259 4270 4286 N
+ SH AO V b n/a 31 4260 4265 4283 N
+ SH AO V e n/a 31 4259 4270 4283 N
+ SH AO V s n/a 31 4259 4270 4283 N
+ SH AO W b n/a 31 4260 4265 4283 N
+ SH AO W e n/a 31 4259 4270 4283 N
+ SH AO W i n/a 31 4259 4270 4283 N
+ SH AO W s n/a 31 4259 4270 4283 N
+ SH AO Y b n/a 31 4260 4266 4278 N
+ SH AO Y e n/a 31 4259 4270 4278 N
+ SH AO Y s n/a 31 4259 4270 4278 N
+ SH AO Z e n/a 31 4259 4270 4284 N
+ SH AO Z i n/a 31 4259 4270 4284 N
+ SH AO Z s n/a 31 4259 4270 4284 N
+ SH AO ZH e n/a 31 4259 4270 4283 N
+ SH AO ZH s n/a 31 4259 4270 4283 N
+ SH AW AA b n/a 31 4261 4267 4288 N
+ SH AW AA e n/a 31 4261 4275 4288 N
+ SH AW AA i n/a 31 4261 4275 4288 N
+ SH AW AA s n/a 31 4261 4275 4288 N
+ SH AW AE b n/a 31 4261 4267 4289 N
+ SH AW AE e n/a 31 4261 4275 4289 N
+ SH AW AE s n/a 31 4261 4275 4289 N
+ SH AW AH b n/a 31 4261 4267 4289 N
+ SH AW AH e n/a 31 4261 4275 4279 N
+ SH AW AH i n/a 31 4261 4275 4279 N
+ SH AW AH s n/a 31 4261 4275 4279 N
+ SH AW AO b n/a 31 4261 4267 4290 N
+ SH AW AO e n/a 31 4261 4275 4290 N
+ SH AW AO s n/a 31 4261 4275 4290 N
+ SH AW AW b n/a 31 4261 4267 4289 N
+ SH AW AW e n/a 31 4261 4275 4289 N
+ SH AW AW s n/a 31 4261 4275 4289 N
+ SH AW AY b n/a 31 4261 4266 4288 N
+ SH AW AY e n/a 31 4261 4275 4288 N
+ SH AW AY s n/a 31 4261 4275 4288 N
+ SH AW B b n/a 31 4261 4267 4283 N
+ SH AW B e n/a 31 4261 4275 4283 N
+ SH AW B s n/a 31 4261 4275 4283 N
+ SH AW CH b n/a 31 4261 4267 4282 N
+ SH AW CH e n/a 31 4261 4274 4282 N
+ SH AW CH s n/a 31 4261 4274 4282 N
+ SH AW D e n/a 31 4261 4275 4284 N
+ SH AW D s n/a 31 4261 4275 4284 N
+ SH AW DH e n/a 31 4261 4275 4284 N
+ SH AW DH s n/a 31 4261 4275 4284 N
+ SH AW EH b n/a 31 4261 4267 4287 N
+ SH AW EH e n/a 31 4261 4275 4279 N
+ SH AW EH i n/a 31 4261 4275 4279 N
+ SH AW EH s n/a 31 4261 4275 4279 N
+ SH AW ER b n/a 31 4261 4267 4285 N
+ SH AW ER e n/a 31 4261 4275 4285 N
+ SH AW ER i n/a 31 4261 4275 4285 N
+ SH AW ER s n/a 31 4261 4275 4285 N
+ SH AW EY b n/a 31 4261 4266 4287 N
+ SH AW EY e n/a 31 4261 4275 4287 N
+ SH AW EY i n/a 31 4261 4275 4287 N
+ SH AW EY s n/a 31 4261 4275 4287 N
+ SH AW F e n/a 31 4261 4275 4283 N
+ SH AW F s n/a 31 4261 4275 4283 N
+ SH AW G e n/a 31 4261 4275 4283 N
+ SH AW G s n/a 31 4261 4275 4283 N
+ SH AW HH e n/a 31 4261 4275 4282 N
+ SH AW HH s n/a 31 4261 4275 4282 N
+ SH AW IH b n/a 31 4261 4267 4287 N
+ SH AW IH e n/a 31 4261 4275 4280 N
+ SH AW IH i n/a 31 4261 4275 4280 N
+ SH AW IH s n/a 31 4261 4275 4280 N
+ SH AW IY b n/a 31 4261 4266 4278 N
+ SH AW IY e n/a 31 4261 4275 4278 N
+ SH AW IY i n/a 31 4261 4275 4278 N
+ SH AW IY s n/a 31 4261 4275 4278 N
+ SH AW JH e n/a 31 4261 4274 4283 N
+ SH AW JH s n/a 31 4261 4274 4283 N
+ SH AW K b n/a 31 4261 4267 4283 N
+ SH AW K e n/a 31 4261 4275 4283 N
+ SH AW K s n/a 31 4261 4275 4283 N
+ SH AW L b n/a 31 4261 4267 4283 N
+ SH AW L e n/a 31 4261 4275 4283 N
+ SH AW L s n/a 31 4261 4275 4283 N
+ SH AW M b n/a 31 4261 4267 4283 N
+ SH AW M e n/a 31 4261 4275 4283 N
+ SH AW M s n/a 31 4261 4275 4283 N
+ SH AW N b n/a 31 4261 4267 4279 N
+ SH AW N e n/a 31 4261 4275 4279 N
+ SH AW N s n/a 31 4261 4275 4279 N
+ SH AW NG e n/a 31 4261 4275 4283 N
+ SH AW NG s n/a 31 4261 4275 4283 N
+ SH AW OW b n/a 31 4261 4267 4288 N
+ SH AW OW e n/a 31 4261 4275 4288 N
+ SH AW OW i n/a 31 4261 4275 4290 N
+ SH AW OW s n/a 31 4261 4275 4288 N
+ SH AW OY b n/a 31 4261 4266 4290 N
+ SH AW OY e n/a 31 4261 4275 4290 N
+ SH AW OY s n/a 31 4261 4275 4290 N
+ SH AW P e n/a 31 4261 4275 4283 N
+ SH AW P s n/a 31 4261 4275 4283 N
+ SH AW R b n/a 31 4261 4267 4283 N
+ SH AW R e n/a 31 4261 4275 4283 N
+ SH AW R s n/a 31 4261 4275 4283 N
+ SH AW S e n/a 31 4261 4275 4284 N
+ SH AW S s n/a 31 4261 4275 4284 N
+ SH AW SH e n/a 31 4261 4274 4282 N
+ SH AW SH s n/a 31 4261 4274 4282 N
+ SH AW SIL e n/a 31 4261 4274 4282 N
+ SH AW SIL s n/a 31 4261 4274 4282 N
+ SH AW T b n/a 31 4261 4267 4284 N
+ SH AW T e n/a 31 4261 4275 4284 N
+ SH AW T i n/a 31 4261 4275 4284 N
+ SH AW T s n/a 31 4261 4275 4284 N
+ SH AW TH e n/a 31 4261 4275 4284 N
+ SH AW TH s n/a 31 4261 4275 4284 N
+ SH AW UH b n/a 31 4261 4267 4285 N
+ SH AW UH e n/a 31 4261 4275 4280 N
+ SH AW UH s n/a 31 4261 4275 4280 N
+ SH AW UW b n/a 31 4261 4267 4286 N
+ SH AW UW e n/a 31 4261 4275 4286 N
+ SH AW UW s n/a 31 4261 4275 4286 N
+ SH AW V b n/a 31 4261 4267 4283 N
+ SH AW V e n/a 31 4261 4275 4283 N
+ SH AW V s n/a 31 4261 4275 4283 N
+ SH AW W b n/a 31 4261 4267 4283 N
+ SH AW W e n/a 31 4261 4275 4283 N
+ SH AW W i n/a 31 4261 4275 4283 N
+ SH AW W s n/a 31 4261 4275 4283 N
+ SH AW Y b n/a 31 4261 4266 4278 N
+ SH AW Y e n/a 31 4261 4274 4278 N
+ SH AW Y s n/a 31 4261 4274 4278 N
+ SH AW Z e n/a 31 4261 4275 4284 N
+ SH AW Z s n/a 31 4261 4275 4284 N
+ SH AW ZH e n/a 31 4261 4274 4283 N
+ SH AW ZH s n/a 31 4261 4274 4283 N
+ SH AY AA b n/a 31 4255 4267 4288 N
+ SH AY AA e n/a 31 4255 4275 4288 N
+ SH AY AA i n/a 31 4255 4275 4288 N
+ SH AY AA s n/a 31 4255 4275 4288 N
+ SH AY AE b n/a 31 4255 4267 4289 N
+ SH AY AE e n/a 31 4255 4275 4289 N
+ SH AY AE i n/a 31 4255 4275 4289 N
+ SH AY AE s n/a 31 4255 4275 4289 N
+ SH AY AH b n/a 31 4254 4267 4289 N
+ SH AY AH e n/a 31 4254 4275 4281 N
+ SH AY AH i n/a 31 4254 4275 4281 N
+ SH AY AH s n/a 31 4254 4275 4281 N
+ SH AY AO b n/a 31 4255 4267 4290 N
+ SH AY AO e n/a 31 4255 4275 4290 N
+ SH AY AO s n/a 31 4255 4275 4290 N
+ SH AY AW b n/a 31 4255 4267 4289 N
+ SH AY AW e n/a 31 4255 4275 4289 N
+ SH AY AW i n/a 31 4255 4275 4289 N
+ SH AY AW s n/a 31 4255 4275 4289 N
+ SH AY AY b n/a 31 4255 4266 4288 N
+ SH AY AY e n/a 31 4255 4275 4288 N
+ SH AY AY i n/a 31 4255 4275 4288 N
+ SH AY AY s n/a 31 4255 4275 4288 N
+ SH AY B b n/a 31 4255 4267 4283 N
+ SH AY B e n/a 31 4255 4275 4283 N
+ SH AY B s n/a 31 4255 4275 4283 N
+ SH AY CH b n/a 31 4255 4267 4282 N
+ SH AY CH e n/a 31 4255 4274 4282 N
+ SH AY CH s n/a 31 4255 4274 4282 N
+ SH AY D e n/a 31 4255 4275 4284 N
+ SH AY D s n/a 31 4255 4275 4284 N
+ SH AY DH e n/a 31 4255 4275 4284 N
+ SH AY DH s n/a 31 4255 4275 4284 N
+ SH AY EH b n/a 31 4255 4267 4287 N
+ SH AY EH e n/a 31 4255 4275 4281 N
+ SH AY EH s n/a 31 4255 4275 4281 N
+ SH AY ER b n/a 31 4254 4267 4285 N
+ SH AY ER e n/a 31 4254 4275 4285 N
+ SH AY ER i n/a 31 4254 4275 4285 N
+ SH AY ER s n/a 31 4254 4275 4285 N
+ SH AY EY b n/a 31 4255 4266 4287 N
+ SH AY EY e n/a 31 4255 4275 4287 N
+ SH AY EY i n/a 31 4255 4275 4287 N
+ SH AY EY s n/a 31 4255 4275 4287 N
+ SH AY F e n/a 31 4255 4275 4283 N
+ SH AY F s n/a 31 4255 4275 4283 N
+ SH AY G e n/a 31 4255 4275 4283 N
+ SH AY G s n/a 31 4255 4275 4283 N
+ SH AY HH e n/a 31 4255 4275 4282 N
+ SH AY HH i n/a 31 4255 4275 4282 N
+ SH AY HH s n/a 31 4255 4275 4282 N
+ SH AY IH b n/a 31 4255 4267 4287 N
+ SH AY IH e n/a 31 4255 4275 4281 N
+ SH AY IH i n/a 31 4255 4275 4281 N
+ SH AY IH s n/a 31 4255 4275 4281 N
+ SH AY IY b n/a 31 4255 4266 4278 N
+ SH AY IY e n/a 31 4255 4275 4278 N
+ SH AY IY s n/a 31 4255 4275 4278 N
+ SH AY JH e n/a 31 4255 4274 4283 N
+ SH AY JH s n/a 31 4255 4274 4283 N
+ SH AY K b n/a 31 4255 4267 4283 N
+ SH AY K e n/a 31 4255 4275 4283 N
+ SH AY K s n/a 31 4255 4275 4283 N
+ SH AY L b n/a 31 4255 4267 4283 N
+ SH AY L e n/a 31 4255 4275 4283 N
+ SH AY L s n/a 31 4255 4275 4283 N
+ SH AY M b n/a 31 4255 4267 4283 N
+ SH AY M e n/a 31 4255 4275 4283 N
+ SH AY M i n/a 31 4255 4275 4283 N
+ SH AY M s n/a 31 4255 4275 4283 N
+ SH AY N b n/a 31 4255 4267 4281 N
+ SH AY N e n/a 31 4255 4275 4281 N
+ SH AY N i n/a 31 4255 4275 4281 N
+ SH AY N s n/a 31 4255 4275 4281 N
+ SH AY NG e n/a 31 4255 4275 4283 N
+ SH AY NG s n/a 31 4255 4275 4283 N
+ SH AY OW b n/a 31 4255 4267 4288 N
+ SH AY OW e n/a 31 4255 4275 4288 N
+ SH AY OW s n/a 31 4255 4275 4288 N
+ SH AY OY b n/a 31 4255 4266 4290 N
+ SH AY OY e n/a 31 4255 4275 4290 N
+ SH AY OY s n/a 31 4255 4275 4290 N
+ SH AY P e n/a 31 4255 4275 4283 N
+ SH AY P s n/a 31 4255 4275 4283 N
+ SH AY R b n/a 31 4255 4267 4283 N
+ SH AY R e n/a 31 4255 4275 4283 N
+ SH AY R s n/a 31 4255 4275 4283 N
+ SH AY S e n/a 31 4255 4275 4284 N
+ SH AY S s n/a 31 4255 4275 4284 N
+ SH AY SH e n/a 31 4255 4274 4282 N
+ SH AY SH s n/a 31 4255 4274 4282 N
+ SH AY SIL e n/a 31 4255 4274 4282 N
+ SH AY SIL s n/a 31 4255 4274 4282 N
+ SH AY T b n/a 31 4255 4267 4284 N
+ SH AY T e n/a 31 4255 4275 4284 N
+ SH AY T s n/a 31 4255 4275 4284 N
+ SH AY TH e n/a 31 4255 4275 4284 N
+ SH AY TH s n/a 31 4255 4275 4284 N
+ SH AY UH b n/a 31 4255 4267 4285 N
+ SH AY UH e n/a 31 4255 4275 4281 N
+ SH AY UH s n/a 31 4255 4275 4281 N
+ SH AY UW b n/a 31 4255 4267 4286 N
+ SH AY UW e n/a 31 4255 4275 4286 N
+ SH AY UW s n/a 31 4255 4275 4286 N
+ SH AY V b n/a 31 4255 4267 4283 N
+ SH AY V e n/a 31 4255 4275 4283 N
+ SH AY V s n/a 31 4255 4275 4283 N
+ SH AY W b n/a 31 4255 4267 4283 N
+ SH AY W e n/a 31 4255 4275 4283 N
+ SH AY W s n/a 31 4255 4275 4283 N
+ SH AY Y b n/a 31 4255 4266 4278 N
+ SH AY Y e n/a 31 4255 4274 4278 N
+ SH AY Y s n/a 31 4255 4274 4278 N
+ SH AY Z e n/a 31 4255 4275 4284 N
+ SH AY Z s n/a 31 4255 4275 4284 N
+ SH AY ZH e n/a 31 4255 4274 4283 N
+ SH AY ZH s n/a 31 4255 4274 4283 N
+ SH B AA b n/a 31 4248 4265 4288 N
+ SH B AA e n/a 31 4248 4272 4288 N
+ SH B AA s n/a 31 4248 4272 4288 N
+ SH B AE b n/a 31 4248 4265 4289 N
+ SH B AE e n/a 31 4248 4272 4289 N
+ SH B AE s n/a 31 4248 4272 4289 N
+ SH B AH b n/a 31 4248 4265 4288 N
+ SH B AH e n/a 31 4248 4272 4279 N
+ SH B AH i n/a 31 4248 4272 4279 N
+ SH B AH s n/a 31 4248 4272 4279 N
+ SH B AO b n/a 31 4248 4265 4290 N
+ SH B AO e n/a 31 4248 4272 4290 N
+ SH B AO s n/a 31 4248 4272 4290 N
+ SH B AW b n/a 31 4248 4265 4289 N
+ SH B AW e n/a 31 4248 4272 4289 N
+ SH B AW s n/a 31 4248 4272 4289 N
+ SH B AY b n/a 31 4248 4265 4288 N
+ SH B AY e n/a 31 4248 4272 4288 N
+ SH B AY i n/a 31 4248 4272 4288 N
+ SH B AY s n/a 31 4248 4272 4288 N
+ SH B B b n/a 31 4248 4265 4283 N
+ SH B B e n/a 31 4248 4272 4283 N
+ SH B B s n/a 31 4248 4272 4283 N
+ SH B CH b n/a 31 4248 4265 4282 N
+ SH B CH e n/a 31 4248 4272 4282 N
+ SH B CH s n/a 31 4248 4272 4282 N
+ SH B D e n/a 31 4248 4272 4284 N
+ SH B D s n/a 31 4248 4272 4284 N
+ SH B DH e n/a 31 4248 4272 4284 N
+ SH B DH s n/a 31 4248 4272 4284 N
+ SH B EH b n/a 31 4248 4265 4287 N
+ SH B EH e n/a 31 4248 4272 4279 N
+ SH B EH s n/a 31 4248 4272 4279 N
+ SH B ER b n/a 31 4248 4265 4285 N
+ SH B ER e n/a 31 4248 4272 4285 N
+ SH B ER i n/a 31 4248 4272 4285 N
+ SH B ER s n/a 31 4248 4272 4285 N
+ SH B EY b n/a 31 4248 4266 4287 N
+ SH B EY e n/a 31 4248 4272 4287 N
+ SH B EY s n/a 31 4248 4272 4287 N
+ SH B F e n/a 31 4248 4272 4283 N
+ SH B F s n/a 31 4248 4272 4283 N
+ SH B G e n/a 31 4248 4272 4283 N
+ SH B G s n/a 31 4248 4272 4283 N
+ SH B HH e n/a 31 4248 4272 4282 N
+ SH B HH s n/a 31 4248 4272 4282 N
+ SH B IH b n/a 31 4248 4265 4287 N
+ SH B IH e n/a 31 4248 4272 4280 N
+ SH B IH s n/a 31 4248 4272 4280 N
+ SH B IY b n/a 31 4248 4266 4278 N
+ SH B IY e n/a 31 4248 4272 4278 N
+ SH B IY i n/a 31 4248 4272 4278 N
+ SH B IY s n/a 31 4248 4272 4278 N
+ SH B JH e n/a 31 4248 4272 4283 N
+ SH B JH s n/a 31 4248 4272 4283 N
+ SH B K b n/a 31 4248 4265 4283 N
+ SH B K e n/a 31 4248 4272 4283 N
+ SH B K s n/a 31 4248 4272 4283 N
+ SH B L b n/a 31 4248 4265 4283 N
+ SH B L e n/a 31 4248 4272 4283 N
+ SH B L s n/a 31 4248 4272 4283 N
+ SH B M b n/a 31 4248 4265 4283 N
+ SH B M e n/a 31 4248 4272 4283 N
+ SH B M i n/a 31 4248 4272 4283 N
+ SH B M s n/a 31 4248 4272 4283 N
+ SH B N b n/a 31 4248 4265 4279 N
+ SH B N e n/a 31 4248 4272 4279 N
+ SH B N s n/a 31 4248 4272 4279 N
+ SH B NG e n/a 31 4248 4272 4283 N
+ SH B NG s n/a 31 4248 4272 4283 N
+ SH B OW b n/a 31 4248 4265 4288 N
+ SH B OW e n/a 31 4248 4272 4288 N
+ SH B OW s n/a 31 4248 4272 4288 N
+ SH B OY b n/a 31 4248 4265 4290 N
+ SH B OY e n/a 31 4248 4272 4290 N
+ SH B OY s n/a 31 4248 4272 4290 N
+ SH B P e n/a 31 4248 4272 4283 N
+ SH B P s n/a 31 4248 4272 4283 N
+ SH B R b n/a 31 4248 4265 4283 N
+ SH B R e n/a 31 4248 4272 4283 N
+ SH B R s n/a 31 4248 4272 4283 N
+ SH B S e n/a 31 4248 4272 4284 N
+ SH B S s n/a 31 4248 4272 4284 N
+ SH B SH e n/a 31 4248 4272 4282 N
+ SH B SH s n/a 31 4248 4272 4282 N
+ SH B SIL e n/a 31 4248 4272 4282 N
+ SH B SIL s n/a 31 4248 4272 4282 N
+ SH B T b n/a 31 4248 4265 4284 N
+ SH B T e n/a 31 4248 4272 4284 N
+ SH B T s n/a 31 4248 4272 4284 N
+ SH B TH e n/a 31 4248 4272 4284 N
+ SH B TH s n/a 31 4248 4272 4284 N
+ SH B UH b n/a 31 4248 4265 4285 N
+ SH B UH e n/a 31 4248 4272 4280 N
+ SH B UH s n/a 31 4248 4272 4280 N
+ SH B UW b n/a 31 4248 4265 4286 N
+ SH B UW e n/a 31 4248 4272 4286 N
+ SH B UW s n/a 31 4248 4272 4286 N
+ SH B V b n/a 31 4248 4265 4283 N
+ SH B V e n/a 31 4248 4272 4283 N
+ SH B V s n/a 31 4248 4272 4283 N
+ SH B W b n/a 31 4248 4265 4283 N
+ SH B W e n/a 31 4248 4272 4283 N
+ SH B W s n/a 31 4248 4272 4283 N
+ SH B Y b n/a 31 4248 4266 4278 N
+ SH B Y e n/a 31 4248 4272 4278 N
+ SH B Y s n/a 31 4248 4272 4278 N
+ SH B Z e n/a 31 4248 4272 4284 N
+ SH B Z s n/a 31 4248 4272 4284 N
+ SH B ZH e n/a 31 4248 4272 4283 N
+ SH B ZH s n/a 31 4248 4272 4283 N
+ SH CH AA b n/a 31 4250 4265 4288 N
+ SH CH AA s n/a 31 4250 4272 4288 N
+ SH CH AE b n/a 31 4250 4265 4289 N
+ SH CH AE s n/a 31 4250 4272 4289 N
+ SH CH AH b n/a 31 4250 4265 4288 N
+ SH CH AH s n/a 31 4250 4272 4279 N
+ SH CH AO b n/a 31 4250 4265 4290 N
+ SH CH AO s n/a 31 4250 4272 4290 N
+ SH CH AW b n/a 31 4250 4265 4289 N
+ SH CH AW s n/a 31 4250 4272 4289 N
+ SH CH AY b n/a 31 4250 4265 4288 N
+ SH CH AY s n/a 31 4250 4272 4288 N
+ SH CH B b n/a 31 4250 4265 4283 N
+ SH CH B s n/a 31 4250 4272 4283 N
+ SH CH CH b n/a 31 4250 4265 4282 N
+ SH CH CH s n/a 31 4250 4272 4282 N
+ SH CH D s n/a 31 4250 4272 4284 N
+ SH CH DH s n/a 31 4250 4272 4284 N
+ SH CH EH b n/a 31 4250 4265 4287 N
+ SH CH EH s n/a 31 4250 4272 4279 N
+ SH CH ER b n/a 31 4250 4265 4285 N
+ SH CH ER s n/a 31 4250 4272 4285 N
+ SH CH EY b n/a 31 4250 4266 4287 N
+ SH CH EY s n/a 31 4250 4272 4287 N
+ SH CH F s n/a 31 4250 4272 4283 N
+ SH CH G s n/a 31 4250 4272 4283 N
+ SH CH HH s n/a 31 4250 4272 4282 N
+ SH CH IH b n/a 31 4250 4265 4287 N
+ SH CH IH s n/a 31 4250 4272 4280 N
+ SH CH IY b n/a 31 4250 4266 4278 N
+ SH CH IY s n/a 31 4250 4272 4278 N
+ SH CH JH s n/a 31 4250 4272 4283 N
+ SH CH K b n/a 31 4250 4265 4283 N
+ SH CH K s n/a 31 4250 4272 4283 N
+ SH CH L b n/a 31 4250 4265 4283 N
+ SH CH L s n/a 31 4250 4272 4283 N
+ SH CH M b n/a 31 4250 4265 4283 N
+ SH CH M s n/a 31 4250 4272 4283 N
+ SH CH N b n/a 31 4250 4265 4279 N
+ SH CH N s n/a 31 4250 4272 4279 N
+ SH CH NG s n/a 31 4250 4272 4283 N
+ SH CH OW b n/a 31 4250 4265 4288 N
+ SH CH OW s n/a 31 4250 4272 4288 N
+ SH CH OY b n/a 31 4250 4265 4290 N
+ SH CH OY s n/a 31 4250 4272 4290 N
+ SH CH P s n/a 31 4250 4272 4283 N
+ SH CH R b n/a 31 4250 4265 4283 N
+ SH CH R s n/a 31 4250 4272 4283 N
+ SH CH S s n/a 31 4250 4272 4284 N
+ SH CH SH s n/a 31 4250 4272 4282 N
+ SH CH SIL s n/a 31 4250 4272 4282 N
+ SH CH T b n/a 31 4250 4265 4284 N
+ SH CH T s n/a 31 4250 4272 4284 N
+ SH CH TH s n/a 31 4250 4272 4284 N
+ SH CH UH b n/a 31 4250 4265 4285 N
+ SH CH UH s n/a 31 4250 4272 4280 N
+ SH CH UW b n/a 31 4250 4265 4286 N
+ SH CH UW s n/a 31 4250 4272 4286 N
+ SH CH V b n/a 31 4250 4265 4283 N
+ SH CH V s n/a 31 4250 4272 4283 N
+ SH CH W b n/a 31 4250 4265 4283 N
+ SH CH W s n/a 31 4250 4272 4283 N
+ SH CH Y b n/a 31 4250 4266 4278 N
+ SH CH Y s n/a 31 4250 4272 4278 N
+ SH CH Z s n/a 31 4250 4272 4284 N
+ SH CH ZH s n/a 31 4250 4272 4283 N
+ SH D AA b n/a 31 4249 4265 4288 N
+ SH D AA i n/a 31 4249 4273 4288 N
+ SH D AA s n/a 31 4249 4273 4288 N
+ SH D AE b n/a 31 4249 4265 4289 N
+ SH D AE s n/a 31 4249 4273 4289 N
+ SH D AH b n/a 31 4249 4265 4288 N
+ SH D AH i n/a 31 4249 4273 4279 N
+ SH D AH s n/a 31 4249 4273 4279 N
+ SH D AO b n/a 31 4249 4265 4290 N
+ SH D AO i n/a 31 4249 4273 4290 N
+ SH D AO s n/a 31 4249 4273 4290 N
+ SH D AW b n/a 31 4249 4265 4289 N
+ SH D AW s n/a 31 4249 4273 4289 N
+ SH D AY b n/a 31 4249 4268 4288 N
+ SH D AY i n/a 31 4249 4273 4288 N
+ SH D AY s n/a 31 4249 4273 4288 N
+ SH D B b n/a 31 4249 4265 4283 N
+ SH D B s n/a 31 4249 4273 4283 N
+ SH D CH b n/a 31 4249 4265 4282 N
+ SH D CH s n/a 31 4249 4273 4282 N
+ SH D D s n/a 31 4249 4273 4284 N
+ SH D DH s n/a 31 4249 4273 4284 N
+ SH D EH b n/a 31 4249 4265 4287 N
+ SH D EH i n/a 31 4249 4273 4279 N
+ SH D EH s n/a 31 4249 4273 4279 N
+ SH D ER b n/a 31 4249 4265 4285 N
+ SH D ER i n/a 31 4249 4273 4285 N
+ SH D ER s n/a 31 4249 4273 4285 N
+ SH D EY b n/a 31 4249 4268 4287 N
+ SH D EY i n/a 31 4249 4273 4287 N
+ SH D EY s n/a 31 4249 4273 4287 N
+ SH D F s n/a 31 4249 4273 4283 N
+ SH D G s n/a 31 4249 4273 4283 N
+ SH D HH s n/a 31 4249 4273 4282 N
+ SH D IH b n/a 31 4249 4265 4287 N
+ SH D IH i n/a 31 4249 4273 4280 N
+ SH D IH s n/a 31 4249 4273 4280 N
+ SH D IY b n/a 31 4249 4268 4278 N
+ SH D IY i n/a 31 4249 4273 4278 N
+ SH D IY s n/a 31 4249 4273 4278 N
+ SH D JH s n/a 31 4249 4273 4283 N
+ SH D K b n/a 31 4249 4265 4283 N
+ SH D K s n/a 31 4249 4273 4283 N
+ SH D L b n/a 31 4249 4265 4283 N
+ SH D L i n/a 31 4249 4273 4283 N
+ SH D L s n/a 31 4249 4273 4283 N
+ SH D M b n/a 31 4249 4265 4283 N
+ SH D M i n/a 31 4249 4273 4283 N
+ SH D M s n/a 31 4249 4273 4283 N
+ SH D N b n/a 31 4249 4265 4279 N
+ SH D N s n/a 31 4249 4273 4279 N
+ SH D NG s n/a 31 4249 4273 4283 N
+ SH D OW b n/a 31 4249 4265 4288 N
+ SH D OW i n/a 31 4249 4273 4290 N
+ SH D OW s n/a 31 4249 4273 4288 N
+ SH D OY b n/a 31 4249 4268 4290 N
+ SH D OY s n/a 31 4249 4273 4290 N
+ SH D P s n/a 31 4249 4273 4283 N
+ SH D R b n/a 31 4249 4265 4283 N
+ SH D R s n/a 31 4249 4273 4283 N
+ SH D S s n/a 31 4249 4273 4284 N
+ SH D SH s n/a 31 4249 4273 4282 N
+ SH D SIL s n/a 31 4249 4273 4282 N
+ SH D T b n/a 31 4249 4265 4284 N
+ SH D T s n/a 31 4249 4273 4284 N
+ SH D TH s n/a 31 4249 4273 4284 N
+ SH D UH b n/a 31 4249 4265 4285 N
+ SH D UH s n/a 31 4249 4273 4280 N
+ SH D UW b n/a 31 4249 4265 4286 N
+ SH D UW i n/a 31 4249 4273 4286 N
+ SH D UW s n/a 31 4249 4273 4286 N
+ SH D V b n/a 31 4249 4265 4283 N
+ SH D V s n/a 31 4249 4273 4283 N
+ SH D W b n/a 31 4249 4265 4283 N
+ SH D W s n/a 31 4249 4273 4283 N
+ SH D Y b n/a 31 4249 4268 4278 N
+ SH D Y s n/a 31 4249 4273 4278 N
+ SH D Z s n/a 31 4249 4273 4284 N
+ SH D ZH s n/a 31 4249 4273 4283 N
+ SH DH AA b n/a 31 4250 4265 4288 N
+ SH DH AA s n/a 31 4250 4272 4288 N
+ SH DH AE b n/a 31 4250 4265 4289 N
+ SH DH AE s n/a 31 4250 4272 4289 N
+ SH DH AH b n/a 31 4250 4265 4288 N
+ SH DH AH s n/a 31 4250 4272 4279 N
+ SH DH AO b n/a 31 4250 4265 4290 N
+ SH DH AO s n/a 31 4250 4272 4290 N
+ SH DH AW b n/a 31 4250 4265 4289 N
+ SH DH AW s n/a 31 4250 4272 4289 N
+ SH DH AY b n/a 31 4250 4265 4288 N
+ SH DH AY s n/a 31 4250 4272 4288 N
+ SH DH B b n/a 31 4250 4265 4283 N
+ SH DH B s n/a 31 4250 4272 4283 N
+ SH DH CH b n/a 31 4250 4265 4282 N
+ SH DH CH s n/a 31 4250 4272 4282 N
+ SH DH D s n/a 31 4250 4272 4284 N
+ SH DH DH s n/a 31 4250 4272 4284 N
+ SH DH EH b n/a 31 4250 4265 4287 N
+ SH DH EH s n/a 31 4250 4272 4279 N
+ SH DH ER b n/a 31 4250 4265 4285 N
+ SH DH ER s n/a 31 4250 4272 4285 N
+ SH DH EY b n/a 31 4250 4266 4287 N
+ SH DH EY s n/a 31 4250 4272 4287 N
+ SH DH F s n/a 31 4250 4272 4283 N
+ SH DH G s n/a 31 4250 4272 4283 N
+ SH DH HH s n/a 31 4250 4272 4282 N
+ SH DH IH b n/a 31 4250 4265 4287 N
+ SH DH IH s n/a 31 4250 4272 4280 N
+ SH DH IY b n/a 31 4250 4266 4278 N
+ SH DH IY s n/a 31 4250 4272 4278 N
+ SH DH JH s n/a 31 4250 4272 4283 N
+ SH DH K b n/a 31 4250 4265 4283 N
+ SH DH K s n/a 31 4250 4272 4283 N
+ SH DH L b n/a 31 4250 4265 4283 N
+ SH DH L s n/a 31 4250 4272 4283 N
+ SH DH M b n/a 31 4250 4265 4283 N
+ SH DH M s n/a 31 4250 4272 4283 N
+ SH DH N b n/a 31 4250 4265 4279 N
+ SH DH N s n/a 31 4250 4272 4279 N
+ SH DH NG s n/a 31 4250 4272 4283 N
+ SH DH OW b n/a 31 4250 4265 4288 N
+ SH DH OW s n/a 31 4250 4272 4288 N
+ SH DH OY b n/a 31 4250 4265 4290 N
+ SH DH OY s n/a 31 4250 4272 4290 N
+ SH DH P s n/a 31 4250 4272 4283 N
+ SH DH R b n/a 31 4250 4265 4283 N
+ SH DH R s n/a 31 4250 4272 4283 N
+ SH DH S s n/a 31 4250 4272 4284 N
+ SH DH SH s n/a 31 4250 4272 4282 N
+ SH DH SIL s n/a 31 4250 4272 4282 N
+ SH DH T b n/a 31 4250 4265 4284 N
+ SH DH T s n/a 31 4250 4272 4284 N
+ SH DH TH s n/a 31 4250 4272 4284 N
+ SH DH UH b n/a 31 4250 4265 4285 N
+ SH DH UH s n/a 31 4250 4272 4280 N
+ SH DH UW b n/a 31 4250 4265 4286 N
+ SH DH UW s n/a 31 4250 4272 4286 N
+ SH DH V b n/a 31 4250 4265 4283 N
+ SH DH V s n/a 31 4250 4272 4283 N
+ SH DH W b n/a 31 4250 4265 4283 N
+ SH DH W s n/a 31 4250 4272 4283 N
+ SH DH Y b n/a 31 4250 4266 4278 N
+ SH DH Y s n/a 31 4250 4272 4278 N
+ SH DH Z s n/a 31 4250 4272 4284 N
+ SH DH ZH s n/a 31 4250 4272 4283 N
+ SH EH AA b n/a 31 4260 4265 4288 N
+ SH EH AA e n/a 31 4260 4270 4288 N
+ SH EH AA i n/a 31 4260 4270 4288 N
+ SH EH AA s n/a 31 4260 4270 4288 N
+ SH EH AE b n/a 31 4260 4265 4289 N
+ SH EH AE e n/a 31 4260 4270 4289 N
+ SH EH AE i n/a 31 4260 4270 4289 N
+ SH EH AE s n/a 31 4260 4270 4289 N
+ SH EH AH b n/a 31 4260 4265 4288 N
+ SH EH AH e n/a 31 4258 4270 4279 N
+ SH EH AH i n/a 31 4258 4270 4279 N
+ SH EH AH s n/a 31 4258 4270 4279 N
+ SH EH AO b n/a 31 4260 4265 4290 N
+ SH EH AO e n/a 31 4260 4270 4290 N
+ SH EH AO i n/a 31 4260 4270 4290 N
+ SH EH AO s n/a 31 4260 4270 4290 N
+ SH EH AW b n/a 31 4260 4265 4289 N
+ SH EH AW e n/a 31 4258 4270 4289 N
+ SH EH AW s n/a 31 4258 4270 4289 N
+ SH EH AY b n/a 31 4260 4265 4288 N
+ SH EH AY e n/a 31 4258 4270 4288 N
+ SH EH AY i n/a 31 4258 4270 4288 N
+ SH EH AY s n/a 31 4258 4270 4288 N
+ SH EH B b n/a 31 4260 4265 4283 N
+ SH EH B e n/a 31 4258 4270 4283 N
+ SH EH B i n/a 31 4258 4270 4283 N
+ SH EH B s n/a 31 4258 4270 4283 N
+ SH EH CH b n/a 31 4260 4265 4282 N
+ SH EH CH e n/a 31 4258 4270 4282 N
+ SH EH CH s n/a 31 4258 4270 4282 N
+ SH EH D e n/a 31 4258 4270 4284 N
+ SH EH D s n/a 31 4258 4270 4284 N
+ SH EH DH e n/a 31 4258 4270 4284 N
+ SH EH DH s n/a 31 4258 4270 4284 N
+ SH EH EH b n/a 31 4260 4265 4287 N
+ SH EH EH e n/a 31 4258 4270 4279 N
+ SH EH EH i n/a 31 4258 4270 4279 N
+ SH EH EH s n/a 31 4258 4270 4279 N
+ SH EH ER b n/a 31 4260 4265 4285 N
+ SH EH ER e n/a 31 4258 4270 4285 N
+ SH EH ER i n/a 31 4258 4270 4285 N
+ SH EH ER s n/a 31 4258 4270 4285 N
+ SH EH EY b n/a 31 4260 4266 4287 N
+ SH EH EY e n/a 31 4260 4270 4287 N
+ SH EH EY s n/a 31 4260 4270 4287 N
+ SH EH F e n/a 31 4258 4270 4283 N
+ SH EH F s n/a 31 4258 4270 4283 N
+ SH EH G e n/a 31 4258 4270 4283 N
+ SH EH G s n/a 31 4258 4270 4283 N
+ SH EH HH e n/a 31 4258 4270 4282 N
+ SH EH HH s n/a 31 4258 4270 4282 N
+ SH EH IH b n/a 31 4260 4265 4287 N
+ SH EH IH e n/a 31 4258 4270 4280 N
+ SH EH IH i n/a 31 4258 4270 4280 N
+ SH EH IH s n/a 31 4258 4270 4280 N
+ SH EH IY b n/a 31 4260 4266 4278 N
+ SH EH IY e n/a 31 4260 4270 4278 N
+ SH EH IY i n/a 31 4260 4270 4278 N
+ SH EH IY s n/a 31 4260 4270 4278 N
+ SH EH JH e n/a 31 4258 4270 4283 N
+ SH EH JH s n/a 31 4258 4270 4283 N
+ SH EH K b n/a 31 4260 4265 4283 N
+ SH EH K e n/a 31 4258 4270 4283 N
+ SH EH K i n/a 31 4258 4270 4283 N
+ SH EH K s n/a 31 4258 4270 4283 N
+ SH EH L b n/a 31 4260 4265 4283 N
+ SH EH L e n/a 31 4258 4270 4283 N
+ SH EH L i n/a 31 4258 4270 4283 N
+ SH EH L s n/a 31 4258 4270 4283 N
+ SH EH M b n/a 31 4260 4265 4283 N
+ SH EH M e n/a 31 4258 4270 4283 N
+ SH EH M i n/a 31 4258 4270 4283 N
+ SH EH M s n/a 31 4258 4270 4283 N
+ SH EH N b n/a 31 4260 4265 4279 N
+ SH EH N e n/a 31 4258 4270 4279 N
+ SH EH N i n/a 31 4258 4270 4279 N
+ SH EH N s n/a 31 4258 4270 4279 N
+ SH EH NG e n/a 31 4258 4270 4283 N
+ SH EH NG s n/a 31 4258 4270 4283 N
+ SH EH OW b n/a 31 4260 4265 4288 N
+ SH EH OW e n/a 31 4258 4270 4288 N
+ SH EH OW i n/a 31 4258 4270 4290 N
+ SH EH OW s n/a 31 4258 4270 4288 N
+ SH EH OY b n/a 31 4260 4265 4290 N
+ SH EH OY e n/a 31 4258 4270 4290 N
+ SH EH OY s n/a 31 4258 4270 4290 N
+ SH EH P e n/a 31 4258 4270 4283 N
+ SH EH P i n/a 31 4258 4270 4283 N
+ SH EH P s n/a 31 4258 4270 4283 N
+ SH EH R b n/a 31 4260 4265 4283 N
+ SH EH R e n/a 31 4258 4270 4283 N
+ SH EH R i n/a 31 4258 4270 4283 N
+ SH EH R s n/a 31 4258 4270 4283 N
+ SH EH S e n/a 31 4258 4270 4284 N
+ SH EH S s n/a 31 4258 4270 4284 N
+ SH EH SH e n/a 31 4258 4270 4282 N
+ SH EH SH s n/a 31 4258 4270 4282 N
+ SH EH SIL e n/a 31 4258 4271 4282 N
+ SH EH SIL s n/a 31 4258 4271 4282 N
+ SH EH T b n/a 31 4260 4265 4284 N
+ SH EH T e n/a 31 4258 4270 4284 N
+ SH EH T i n/a 31 4258 4270 4284 N
+ SH EH T s n/a 31 4258 4270 4284 N
+ SH EH TH e n/a 31 4258 4270 4284 N
+ SH EH TH s n/a 31 4258 4270 4284 N
+ SH EH UH b n/a 31 4260 4265 4285 N
+ SH EH UH e n/a 31 4258 4270 4280 N
+ SH EH UH i n/a 31 4258 4270 4280 N
+ SH EH UH s n/a 31 4258 4270 4280 N
+ SH EH UW b n/a 31 4260 4265 4286 N
+ SH EH UW e n/a 31 4260 4270 4286 N
+ SH EH UW i n/a 31 4260 4270 4286 N
+ SH EH UW s n/a 31 4260 4270 4286 N
+ SH EH V b n/a 31 4260 4265 4283 N
+ SH EH V e n/a 31 4258 4270 4283 N
+ SH EH V i n/a 31 4258 4270 4283 N
+ SH EH V s n/a 31 4258 4270 4283 N
+ SH EH W b n/a 31 4260 4265 4283 N
+ SH EH W e n/a 31 4258 4270 4283 N
+ SH EH W i n/a 31 4258 4270 4283 N
+ SH EH W s n/a 31 4258 4270 4283 N
+ SH EH Y b n/a 31 4260 4266 4278 N
+ SH EH Y e n/a 31 4258 4270 4278 N
+ SH EH Y i n/a 31 4258 4270 4278 N
+ SH EH Y s n/a 31 4258 4270 4278 N
+ SH EH Z e n/a 31 4258 4270 4284 N
+ SH EH Z s n/a 31 4258 4270 4284 N
+ SH EH ZH e n/a 31 4258 4270 4283 N
+ SH EH ZH s n/a 31 4258 4270 4283 N
+ SH ER AA b n/a 31 4263 4265 4288 N
+ SH ER AA e n/a 31 4263 4271 4288 N
+ SH ER AA i n/a 31 4263 4271 4288 N
+ SH ER AA s n/a 31 4263 4271 4288 N
+ SH ER AE b n/a 31 4263 4266 4289 N
+ SH ER AE e n/a 31 4263 4271 4289 N
+ SH ER AE i n/a 31 4263 4271 4289 N
+ SH ER AE s n/a 31 4263 4271 4289 N
+ SH ER AH b n/a 31 4263 4266 4288 N
+ SH ER AH e n/a 31 4263 4271 4279 N
+ SH ER AH i n/a 31 4263 4271 4279 N
+ SH ER AH s n/a 31 4263 4271 4279 N
+ SH ER AO b n/a 31 4263 4265 4290 N
+ SH ER AO e n/a 31 4263 4271 4290 N
+ SH ER AO i n/a 31 4263 4271 4290 N
+ SH ER AO s n/a 31 4263 4271 4290 N
+ SH ER AW b n/a 31 4263 4266 4289 N
+ SH ER AW e n/a 31 4263 4271 4289 N
+ SH ER AW i n/a 31 4263 4271 4289 N
+ SH ER AW s n/a 31 4263 4271 4289 N
+ SH ER AY b n/a 31 4263 4265 4288 N
+ SH ER AY e n/a 31 4263 4271 4288 N
+ SH ER AY i n/a 31 4263 4271 4288 N
+ SH ER AY s n/a 31 4263 4271 4288 N
+ SH ER B b n/a 31 4263 4266 4283 N
+ SH ER B e n/a 31 4263 4271 4283 N
+ SH ER B i n/a 31 4263 4271 4283 N
+ SH ER B s n/a 31 4263 4271 4283 N
+ SH ER CH b n/a 31 4263 4266 4282 N
+ SH ER CH e n/a 31 4263 4271 4282 N
+ SH ER CH s n/a 31 4263 4271 4282 N
+ SH ER D e n/a 31 4263 4271 4284 N
+ SH ER D s n/a 31 4263 4271 4284 N
+ SH ER DH e n/a 31 4263 4271 4284 N
+ SH ER DH s n/a 31 4263 4271 4284 N
+ SH ER EH b n/a 31 4263 4266 4287 N
+ SH ER EH e n/a 31 4263 4271 4279 N
+ SH ER EH i n/a 31 4263 4271 4279 N
+ SH ER EH s n/a 31 4263 4271 4279 N
+ SH ER ER b n/a 31 4263 4265 4285 N
+ SH ER ER e n/a 31 4263 4271 4285 N
+ SH ER ER i n/a 31 4263 4271 4285 N
+ SH ER ER s n/a 31 4263 4271 4285 N
+ SH ER EY b n/a 31 4263 4266 4287 N
+ SH ER EY e n/a 31 4263 4271 4287 N
+ SH ER EY i n/a 31 4263 4271 4287 N
+ SH ER EY s n/a 31 4263 4271 4287 N
+ SH ER F e n/a 31 4263 4271 4283 N
+ SH ER F i n/a 31 4263 4271 4283 N
+ SH ER F s n/a 31 4263 4271 4283 N
+ SH ER G e n/a 31 4263 4271 4283 N
+ SH ER G s n/a 31 4263 4271 4283 N
+ SH ER HH e n/a 31 4263 4271 4282 N
+ SH ER HH i n/a 31 4263 4271 4282 N
+ SH ER HH s n/a 31 4263 4271 4282 N
+ SH ER IH b n/a 31 4263 4266 4287 N
+ SH ER IH e n/a 31 4263 4271 4280 N
+ SH ER IH i n/a 31 4263 4271 4280 N
+ SH ER IH s n/a 31 4263 4271 4280 N
+ SH ER IY b n/a 31 4263 4266 4278 N
+ SH ER IY e n/a 31 4263 4271 4278 N
+ SH ER IY i n/a 31 4263 4271 4278 N
+ SH ER IY s n/a 31 4263 4271 4278 N
+ SH ER JH e n/a 31 4263 4271 4283 N
+ SH ER JH s n/a 31 4263 4271 4283 N
+ SH ER K b n/a 31 4263 4266 4283 N
+ SH ER K e n/a 31 4263 4271 4283 N
+ SH ER K i n/a 31 4263 4271 4283 N
+ SH ER K s n/a 31 4263 4271 4283 N
+ SH ER L b n/a 31 4263 4265 4283 N
+ SH ER L e n/a 31 4263 4271 4283 N
+ SH ER L s n/a 31 4263 4271 4283 N
+ SH ER M b n/a 31 4263 4266 4283 N
+ SH ER M e n/a 31 4263 4271 4283 N
+ SH ER M i n/a 31 4263 4271 4283 N
+ SH ER M s n/a 31 4263 4271 4283 N
+ SH ER N b n/a 31 4263 4266 4279 N
+ SH ER N e n/a 31 4263 4271 4279 N
+ SH ER N i n/a 31 4263 4271 4279 N
+ SH ER N s n/a 31 4263 4271 4279 N
+ SH ER NG e n/a 31 4263 4271 4283 N
+ SH ER NG s n/a 31 4263 4271 4283 N
+ SH ER OW b n/a 31 4263 4265 4288 N
+ SH ER OW e n/a 31 4263 4271 4288 N
+ SH ER OW i n/a 31 4263 4271 4290 N
+ SH ER OW s n/a 31 4263 4271 4288 N
+ SH ER OY b n/a 31 4263 4265 4290 N
+ SH ER OY e n/a 31 4263 4271 4290 N
+ SH ER OY s n/a 31 4263 4271 4290 N
+ SH ER P e n/a 31 4263 4271 4283 N
+ SH ER P s n/a 31 4263 4271 4283 N
+ SH ER R b n/a 31 4263 4265 4283 N
+ SH ER R e n/a 31 4263 4271 4283 N
+ SH ER R s n/a 31 4263 4271 4283 N
+ SH ER S e n/a 31 4263 4271 4284 N
+ SH ER S s n/a 31 4263 4271 4284 N
+ SH ER SH e n/a 31 4263 4271 4282 N
+ SH ER SH s n/a 31 4263 4271 4282 N
+ SH ER SIL e n/a 31 4263 4271 4282 N
+ SH ER SIL s n/a 31 4263 4271 4282 N
+ SH ER T b n/a 31 4263 4266 4284 N
+ SH ER T e n/a 31 4263 4271 4284 N
+ SH ER T i n/a 31 4263 4271 4284 N
+ SH ER T s n/a 31 4263 4271 4284 N
+ SH ER TH e n/a 31 4263 4271 4284 N
+ SH ER TH s n/a 31 4263 4271 4284 N
+ SH ER UH b n/a 31 4263 4265 4285 N
+ SH ER UH e n/a 31 4263 4271 4280 N
+ SH ER UH s n/a 31 4263 4271 4280 N
+ SH ER UW b n/a 31 4263 4265 4286 N
+ SH ER UW e n/a 31 4263 4271 4286 N
+ SH ER UW i n/a 31 4263 4271 4286 N
+ SH ER UW s n/a 31 4263 4271 4286 N
+ SH ER V b n/a 31 4263 4266 4283 N
+ SH ER V e n/a 31 4263 4271 4283 N
+ SH ER V s n/a 31 4263 4271 4283 N
+ SH ER W b n/a 31 4263 4265 4283 N
+ SH ER W e n/a 31 4263 4271 4283 N
+ SH ER W i n/a 31 4263 4271 4283 N
+ SH ER W s n/a 31 4263 4271 4283 N
+ SH ER Y b n/a 31 4263 4266 4278 N
+ SH ER Y e n/a 31 4263 4271 4278 N
+ SH ER Y i n/a 31 4263 4271 4278 N
+ SH ER Y s n/a 31 4263 4271 4278 N
+ SH ER Z e n/a 31 4263 4271 4284 N
+ SH ER Z s n/a 31 4263 4271 4284 N
+ SH ER ZH e n/a 31 4263 4271 4283 N
+ SH ER ZH s n/a 31 4263 4271 4283 N
+ SH EY AA b n/a 31 4257 4267 4288 N
+ SH EY AA e n/a 31 4257 4276 4288 N
+ SH EY AA i n/a 31 4257 4276 4288 N
+ SH EY AA s n/a 31 4257 4276 4288 N
+ SH EY AE b n/a 31 4257 4267 4289 N
+ SH EY AE e n/a 31 4257 4277 4289 N
+ SH EY AE s n/a 31 4257 4277 4289 N
+ SH EY AH b n/a 31 4257 4267 4288 N
+ SH EY AH e n/a 31 4257 4277 4281 N
+ SH EY AH i n/a 31 4257 4277 4281 N
+ SH EY AH s n/a 31 4257 4277 4281 N
+ SH EY AO b n/a 31 4257 4267 4290 N
+ SH EY AO e n/a 31 4257 4276 4290 N
+ SH EY AO s n/a 31 4257 4276 4290 N
+ SH EY AW b n/a 31 4257 4267 4289 N
+ SH EY AW e n/a 31 4257 4277 4289 N
+ SH EY AW i n/a 31 4257 4277 4289 N
+ SH EY AW s n/a 31 4257 4277 4289 N
+ SH EY AY b n/a 31 4256 4266 4288 N
+ SH EY AY e n/a 31 4256 4276 4288 N
+ SH EY AY s n/a 31 4256 4276 4288 N
+ SH EY B b n/a 31 4257 4267 4283 N
+ SH EY B e n/a 31 4257 4277 4283 N
+ SH EY B s n/a 31 4257 4277 4283 N
+ SH EY CH b n/a 31 4257 4267 4282 N
+ SH EY CH e n/a 31 4257 4277 4282 N
+ SH EY CH s n/a 31 4257 4277 4282 N
+ SH EY D e n/a 31 4257 4277 4284 N
+ SH EY D i n/a 31 4257 4277 4284 N
+ SH EY D s n/a 31 4257 4277 4284 N
+ SH EY DH e n/a 31 4257 4277 4284 N
+ SH EY DH s n/a 31 4257 4277 4284 N
+ SH EY EH b n/a 31 4257 4267 4287 N
+ SH EY EH e n/a 31 4257 4277 4281 N
+ SH EY EH i n/a 31 4257 4277 4281 N
+ SH EY EH s n/a 31 4257 4277 4281 N
+ SH EY ER b n/a 31 4257 4267 4285 N
+ SH EY ER e n/a 31 4257 4276 4285 N
+ SH EY ER i n/a 31 4257 4276 4285 N
+ SH EY ER s n/a 31 4257 4276 4285 N
+ SH EY EY b n/a 31 4256 4266 4287 N
+ SH EY EY e n/a 31 4256 4277 4287 N
+ SH EY EY i n/a 31 4256 4277 4287 N
+ SH EY EY s n/a 31 4256 4277 4287 N
+ SH EY F e n/a 31 4257 4277 4283 N
+ SH EY F s n/a 31 4257 4277 4283 N
+ SH EY G e n/a 31 4257 4277 4283 N
+ SH EY G s n/a 31 4257 4277 4283 N
+ SH EY HH e n/a 31 4257 4277 4282 N
+ SH EY HH s n/a 31 4257 4277 4282 N
+ SH EY IH b n/a 31 4257 4267 4287 N
+ SH EY IH e n/a 31 4257 4277 4281 N
+ SH EY IH i n/a 31 4257 4277 4281 N
+ SH EY IH s n/a 31 4257 4277 4281 N
+ SH EY IY b n/a 31 4256 4266 4278 N
+ SH EY IY e n/a 31 4256 4277 4278 N
+ SH EY IY i n/a 31 4256 4277 4278 N
+ SH EY IY s n/a 31 4256 4277 4278 N
+ SH EY JH e n/a 31 4257 4277 4283 N
+ SH EY JH i n/a 31 4257 4277 4283 N
+ SH EY JH s n/a 31 4257 4277 4283 N
+ SH EY K b n/a 31 4257 4267 4283 N
+ SH EY K e n/a 31 4257 4277 4283 N
+ SH EY K s n/a 31 4257 4277 4283 N
+ SH EY L b n/a 31 4257 4267 4283 N
+ SH EY L e n/a 31 4257 4276 4283 N
+ SH EY L s n/a 31 4257 4276 4283 N
+ SH EY M b n/a 31 4257 4267 4283 N
+ SH EY M e n/a 31 4257 4277 4283 N
+ SH EY M s n/a 31 4257 4277 4283 N
+ SH EY N b n/a 31 4257 4267 4281 N
+ SH EY N e n/a 31 4257 4277 4281 N
+ SH EY N i n/a 31 4257 4277 4281 N
+ SH EY N s n/a 31 4257 4277 4281 N
+ SH EY NG e n/a 31 4257 4277 4283 N
+ SH EY NG s n/a 31 4257 4277 4283 N
+ SH EY OW b n/a 31 4257 4267 4288 N
+ SH EY OW e n/a 31 4257 4276 4288 N
+ SH EY OW i n/a 31 4257 4276 4290 N
+ SH EY OW s n/a 31 4257 4276 4288 N
+ SH EY OY b n/a 31 4256 4266 4290 N
+ SH EY OY e n/a 31 4256 4276 4290 N
+ SH EY OY s n/a 31 4256 4276 4290 N
+ SH EY P e n/a 31 4257 4277 4283 N
+ SH EY P s n/a 31 4257 4277 4283 N
+ SH EY R b n/a 31 4257 4267 4283 N
+ SH EY R e n/a 31 4257 4276 4283 N
+ SH EY R i n/a 31 4257 4276 4283 N
+ SH EY R s n/a 31 4257 4276 4283 N
+ SH EY S e n/a 31 4257 4277 4284 N
+ SH EY S s n/a 31 4257 4277 4284 N
+ SH EY SH e n/a 31 4257 4277 4282 N
+ SH EY SH s n/a 31 4257 4277 4282 N
+ SH EY SIL e n/a 31 4257 4277 4282 N
+ SH EY SIL s n/a 31 4257 4277 4282 N
+ SH EY T b n/a 31 4257 4267 4284 N
+ SH EY T e n/a 31 4257 4277 4284 N
+ SH EY T s n/a 31 4257 4277 4284 N
+ SH EY TH e n/a 31 4257 4277 4284 N
+ SH EY TH s n/a 31 4257 4277 4284 N
+ SH EY UH b n/a 31 4257 4267 4285 N
+ SH EY UH e n/a 31 4257 4276 4281 N
+ SH EY UH s n/a 31 4257 4276 4281 N
+ SH EY UW b n/a 31 4257 4267 4286 N
+ SH EY UW e n/a 31 4257 4276 4286 N
+ SH EY UW s n/a 31 4257 4276 4286 N
+ SH EY V b n/a 31 4257 4267 4283 N
+ SH EY V e n/a 31 4257 4277 4283 N
+ SH EY V s n/a 31 4257 4277 4283 N
+ SH EY W b n/a 31 4257 4267 4283 N
+ SH EY W e n/a 31 4257 4276 4283 N
+ SH EY W s n/a 31 4257 4276 4283 N
+ SH EY Y b n/a 31 4256 4266 4278 N
+ SH EY Y e n/a 31 4256 4277 4278 N
+ SH EY Y i n/a 31 4256 4277 4278 N
+ SH EY Y s n/a 31 4256 4277 4278 N
+ SH EY Z e n/a 31 4257 4277 4284 N
+ SH EY Z s n/a 31 4257 4277 4284 N
+ SH EY ZH e n/a 31 4257 4277 4283 N
+ SH EY ZH s n/a 31 4257 4277 4283 N
+ SH F AA b n/a 31 4248 4265 4288 N
+ SH F AA i n/a 31 4248 4272 4288 N
+ SH F AA s n/a 31 4248 4272 4288 N
+ SH F AE b n/a 31 4248 4265 4289 N
+ SH F AE s n/a 31 4248 4272 4289 N
+ SH F AH b n/a 31 4248 4265 4288 N
+ SH F AH s n/a 31 4248 4272 4279 N
+ SH F AO b n/a 31 4248 4265 4290 N
+ SH F AO i n/a 31 4248 4272 4290 N
+ SH F AO s n/a 31 4248 4272 4290 N
+ SH F AW b n/a 31 4248 4265 4289 N
+ SH F AW s n/a 31 4248 4272 4289 N
+ SH F AY b n/a 31 4248 4265 4288 N
+ SH F AY i n/a 31 4248 4272 4288 N
+ SH F AY s n/a 31 4248 4272 4288 N
+ SH F B b n/a 31 4248 4265 4283 N
+ SH F B s n/a 31 4248 4272 4283 N
+ SH F CH b n/a 31 4248 4265 4282 N
+ SH F CH s n/a 31 4248 4272 4282 N
+ SH F D s n/a 31 4248 4272 4284 N
+ SH F DH s n/a 31 4248 4272 4284 N
+ SH F EH b n/a 31 4248 4265 4287 N
+ SH F EH s n/a 31 4248 4272 4279 N
+ SH F ER b n/a 31 4248 4265 4285 N
+ SH F ER i n/a 31 4248 4272 4285 N
+ SH F ER s n/a 31 4248 4272 4285 N
+ SH F EY b n/a 31 4248 4266 4287 N
+ SH F EY s n/a 31 4248 4272 4287 N
+ SH F F s n/a 31 4248 4272 4283 N
+ SH F G s n/a 31 4248 4272 4283 N
+ SH F HH s n/a 31 4248 4272 4282 N
+ SH F IH b n/a 31 4248 4265 4287 N
+ SH F IH i n/a 31 4248 4272 4280 N
+ SH F IH s n/a 31 4248 4272 4280 N
+ SH F IY b n/a 31 4248 4266 4278 N
+ SH F IY s n/a 31 4248 4272 4278 N
+ SH F JH s n/a 31 4248 4272 4283 N
+ SH F K b n/a 31 4248 4265 4283 N
+ SH F K s n/a 31 4248 4272 4283 N
+ SH F L b n/a 31 4248 4265 4283 N
+ SH F L s n/a 31 4248 4272 4283 N
+ SH F M b n/a 31 4248 4265 4283 N
+ SH F M s n/a 31 4248 4272 4283 N
+ SH F N b n/a 31 4248 4265 4279 N
+ SH F N i n/a 31 4248 4272 4279 N
+ SH F N s n/a 31 4248 4272 4279 N
+ SH F NG s n/a 31 4248 4272 4283 N
+ SH F OW b n/a 31 4248 4265 4288 N
+ SH F OW s n/a 31 4248 4272 4288 N
+ SH F OY b n/a 31 4248 4265 4290 N
+ SH F OY s n/a 31 4248 4272 4290 N
+ SH F P s n/a 31 4248 4272 4283 N
+ SH F R b n/a 31 4248 4265 4283 N
+ SH F R s n/a 31 4248 4272 4283 N
+ SH F S s n/a 31 4248 4272 4284 N
+ SH F SH s n/a 31 4248 4272 4282 N
+ SH F SIL s n/a 31 4248 4272 4282 N
+ SH F T b n/a 31 4248 4265 4284 N
+ SH F T s n/a 31 4248 4272 4284 N
+ SH F TH s n/a 31 4248 4272 4284 N
+ SH F UH b n/a 31 4248 4265 4285 N
+ SH F UH s n/a 31 4248 4272 4280 N
+ SH F UW b n/a 31 4248 4265 4286 N
+ SH F UW i n/a 31 4248 4272 4286 N
+ SH F UW s n/a 31 4248 4272 4286 N
+ SH F V b n/a 31 4248 4265 4283 N
+ SH F V s n/a 31 4248 4272 4283 N
+ SH F W b n/a 31 4248 4265 4283 N
+ SH F W s n/a 31 4248 4272 4283 N
+ SH F Y b n/a 31 4248 4266 4278 N
+ SH F Y s n/a 31 4248 4272 4278 N
+ SH F Z s n/a 31 4248 4272 4284 N
+ SH F ZH s n/a 31 4248 4272 4283 N
+ SH G AA b n/a 31 4248 4265 4288 N
+ SH G AA i n/a 31 4248 4272 4288 N
+ SH G AA s n/a 31 4248 4272 4288 N
+ SH G AE b n/a 31 4248 4265 4289 N
+ SH G AE s n/a 31 4248 4272 4289 N
+ SH G AH b n/a 31 4248 4265 4288 N
+ SH G AH i n/a 31 4248 4272 4279 N
+ SH G AH s n/a 31 4248 4272 4279 N
+ SH G AO b n/a 31 4248 4265 4290 N
+ SH G AO i n/a 31 4248 4272 4290 N
+ SH G AO s n/a 31 4248 4272 4290 N
+ SH G AW b n/a 31 4248 4265 4289 N
+ SH G AW s n/a 31 4248 4272 4289 N
+ SH G AY b n/a 31 4248 4265 4288 N
+ SH G AY s n/a 31 4248 4272 4288 N
+ SH G B b n/a 31 4248 4265 4283 N
+ SH G B s n/a 31 4248 4272 4283 N
+ SH G CH b n/a 31 4248 4265 4282 N
+ SH G CH s n/a 31 4248 4272 4282 N
+ SH G D s n/a 31 4248 4272 4284 N
+ SH G DH s n/a 31 4248 4272 4284 N
+ SH G EH b n/a 31 4248 4265 4287 N
+ SH G EH i n/a 31 4248 4272 4279 N
+ SH G EH s n/a 31 4248 4272 4279 N
+ SH G ER b n/a 31 4248 4265 4285 N
+ SH G ER s n/a 31 4248 4272 4285 N
+ SH G EY b n/a 31 4248 4266 4287 N
+ SH G EY i n/a 31 4248 4272 4287 N
+ SH G EY s n/a 31 4248 4272 4287 N
+ SH G F s n/a 31 4248 4272 4283 N
+ SH G G s n/a 31 4248 4272 4283 N
+ SH G HH s n/a 31 4248 4272 4282 N
+ SH G IH b n/a 31 4248 4265 4287 N
+ SH G IH i n/a 31 4248 4272 4280 N
+ SH G IH s n/a 31 4248 4272 4280 N
+ SH G IY b n/a 31 4248 4266 4278 N
+ SH G IY s n/a 31 4248 4272 4278 N
+ SH G JH s n/a 31 4248 4272 4283 N
+ SH G K b n/a 31 4248 4265 4283 N
+ SH G K s n/a 31 4248 4272 4283 N
+ SH G L b n/a 31 4248 4265 4283 N
+ SH G L s n/a 31 4248 4272 4283 N
+ SH G M b n/a 31 4248 4265 4283 N
+ SH G M s n/a 31 4248 4272 4283 N
+ SH G N b n/a 31 4248 4265 4279 N
+ SH G N i n/a 31 4248 4272 4279 N
+ SH G N s n/a 31 4248 4272 4279 N
+ SH G NG s n/a 31 4248 4272 4283 N
+ SH G OW b n/a 31 4248 4265 4288 N
+ SH G OW s n/a 31 4248 4272 4288 N
+ SH G OY b n/a 31 4248 4265 4290 N
+ SH G OY s n/a 31 4248 4272 4290 N
+ SH G P s n/a 31 4248 4272 4283 N
+ SH G R b n/a 31 4248 4265 4283 N
+ SH G R s n/a 31 4248 4272 4283 N
+ SH G S s n/a 31 4248 4272 4284 N
+ SH G SH s n/a 31 4248 4272 4282 N
+ SH G SIL s n/a 31 4248 4272 4282 N
+ SH G T b n/a 31 4248 4265 4284 N
+ SH G T s n/a 31 4248 4272 4284 N
+ SH G TH s n/a 31 4248 4272 4284 N
+ SH G UH b n/a 31 4248 4265 4285 N
+ SH G UH s n/a 31 4248 4272 4280 N
+ SH G UW b n/a 31 4248 4265 4286 N
+ SH G UW s n/a 31 4248 4272 4286 N
+ SH G V b n/a 31 4248 4265 4283 N
+ SH G V s n/a 31 4248 4272 4283 N
+ SH G W b n/a 31 4248 4265 4283 N
+ SH G W s n/a 31 4248 4272 4283 N
+ SH G Y b n/a 31 4248 4266 4278 N
+ SH G Y s n/a 31 4248 4272 4278 N
+ SH G Z s n/a 31 4248 4272 4284 N
+ SH G ZH s n/a 31 4248 4272 4283 N
+ SH HH AA b n/a 31 4248 4265 4288 N
+ SH HH AA s n/a 31 4248 4272 4288 N
+ SH HH AE b n/a 31 4248 4265 4289 N
+ SH HH AE s n/a 31 4248 4272 4289 N
+ SH HH AH b n/a 31 4248 4265 4288 N
+ SH HH AH s n/a 31 4248 4272 4279 N
+ SH HH AO b n/a 31 4248 4265 4290 N
+ SH HH AO s n/a 31 4248 4272 4290 N
+ SH HH AW b n/a 31 4248 4265 4289 N
+ SH HH AW s n/a 31 4248 4272 4289 N
+ SH HH AY b n/a 31 4248 4265 4288 N
+ SH HH AY s n/a 31 4248 4272 4288 N
+ SH HH B b n/a 31 4248 4265 4283 N
+ SH HH B s n/a 31 4248 4272 4283 N
+ SH HH CH b n/a 31 4248 4265 4282 N
+ SH HH CH s n/a 31 4248 4272 4282 N
+ SH HH D s n/a 31 4248 4272 4284 N
+ SH HH DH s n/a 31 4248 4272 4284 N
+ SH HH EH b n/a 31 4248 4265 4287 N
+ SH HH EH s n/a 31 4248 4272 4279 N
+ SH HH ER b n/a 31 4248 4265 4285 N
+ SH HH ER s n/a 31 4248 4272 4285 N
+ SH HH EY b n/a 31 4248 4266 4287 N
+ SH HH EY s n/a 31 4248 4272 4287 N
+ SH HH F s n/a 31 4248 4272 4283 N
+ SH HH G s n/a 31 4248 4272 4283 N
+ SH HH HH s n/a 31 4248 4272 4282 N
+ SH HH IH b n/a 31 4248 4265 4287 N
+ SH HH IH s n/a 31 4248 4272 4280 N
+ SH HH IY b n/a 31 4248 4266 4278 N
+ SH HH IY s n/a 31 4248 4272 4278 N
+ SH HH JH s n/a 31 4248 4272 4283 N
+ SH HH K b n/a 31 4248 4265 4283 N
+ SH HH K s n/a 31 4248 4272 4283 N
+ SH HH L b n/a 31 4248 4265 4283 N
+ SH HH L s n/a 31 4248 4272 4283 N
+ SH HH M b n/a 31 4248 4265 4283 N
+ SH HH M s n/a 31 4248 4272 4283 N
+ SH HH N b n/a 31 4248 4265 4279 N
+ SH HH N s n/a 31 4248 4272 4279 N
+ SH HH NG s n/a 31 4248 4272 4283 N
+ SH HH OW b n/a 31 4248 4265 4288 N
+ SH HH OW s n/a 31 4248 4272 4288 N
+ SH HH OY b n/a 31 4248 4265 4290 N
+ SH HH OY s n/a 31 4248 4272 4290 N
+ SH HH P s n/a 31 4248 4272 4283 N
+ SH HH R b n/a 31 4248 4265 4283 N
+ SH HH R s n/a 31 4248 4272 4283 N
+ SH HH S s n/a 31 4248 4272 4284 N
+ SH HH SH s n/a 31 4248 4272 4282 N
+ SH HH SIL s n/a 31 4248 4272 4282 N
+ SH HH T b n/a 31 4248 4265 4284 N
+ SH HH T s n/a 31 4248 4272 4284 N
+ SH HH TH s n/a 31 4248 4272 4284 N
+ SH HH UH b n/a 31 4248 4265 4285 N
+ SH HH UH s n/a 31 4248 4272 4280 N
+ SH HH UW b n/a 31 4248 4265 4286 N
+ SH HH UW s n/a 31 4248 4272 4286 N
+ SH HH V b n/a 31 4248 4265 4283 N
+ SH HH V s n/a 31 4248 4272 4283 N
+ SH HH W b n/a 31 4248 4265 4283 N
+ SH HH W s n/a 31 4248 4272 4283 N
+ SH HH Y b n/a 31 4248 4266 4278 N
+ SH HH Y s n/a 31 4248 4272 4278 N
+ SH HH Z s n/a 31 4248 4272 4284 N
+ SH HH ZH s n/a 31 4248 4272 4283 N
+ SH IH AA b n/a 31 4255 4265 4288 N
+ SH IH AA e n/a 31 4255 4276 4288 N
+ SH IH AA i n/a 31 4255 4276 4288 N
+ SH IH AA s n/a 31 4255 4276 4288 N
+ SH IH AE b n/a 31 4255 4265 4289 N
+ SH IH AE e n/a 31 4255 4276 4289 N
+ SH IH AE i n/a 31 4255 4276 4289 N
+ SH IH AE s n/a 31 4255 4276 4289 N
+ SH IH AH b n/a 31 4254 4265 4288 N
+ SH IH AH e n/a 31 4254 4276 4281 N
+ SH IH AH i n/a 31 4254 4276 4281 N
+ SH IH AH s n/a 31 4254 4276 4281 N
+ SH IH AO b n/a 31 4255 4265 4290 N
+ SH IH AO e n/a 31 4255 4276 4290 N
+ SH IH AO i n/a 31 4255 4276 4290 N
+ SH IH AO s n/a 31 4255 4276 4290 N
+ SH IH AW b n/a 31 4254 4265 4289 N
+ SH IH AW e n/a 31 4254 4276 4289 N
+ SH IH AW s n/a 31 4254 4276 4289 N
+ SH IH AY b n/a 31 4254 4265 4288 N
+ SH IH AY e n/a 31 4254 4276 4288 N
+ SH IH AY i n/a 31 4254 4276 4288 N
+ SH IH AY s n/a 31 4254 4276 4288 N
+ SH IH B b n/a 31 4255 4265 4283 N
+ SH IH B e n/a 31 4255 4275 4283 N
+ SH IH B i n/a 31 4255 4275 4283 N
+ SH IH B s n/a 31 4255 4275 4283 N
+ SH IH CH b n/a 31 4255 4265 4282 N
+ SH IH CH e n/a 31 4255 4274 4282 N
+ SH IH CH i n/a 31 4255 4274 4282 N
+ SH IH CH s n/a 31 4255 4274 4282 N
+ SH IH D e n/a 31 4255 4275 4284 N
+ SH IH D i n/a 31 4255 4275 4284 N
+ SH IH D s n/a 31 4255 4275 4284 N
+ SH IH DH e n/a 31 4255 4275 4284 N
+ SH IH DH s n/a 31 4255 4275 4284 N
+ SH IH EH b n/a 31 4255 4265 4287 N
+ SH IH EH e n/a 31 4255 4276 4281 N
+ SH IH EH i n/a 31 4255 4276 4281 N
+ SH IH EH s n/a 31 4255 4276 4281 N
+ SH IH ER b n/a 31 4254 4265 4285 N
+ SH IH ER e n/a 31 4254 4276 4285 N
+ SH IH ER i n/a 31 4254 4276 4285 N
+ SH IH ER s n/a 31 4254 4276 4285 N
+ SH IH EY b n/a 31 4254 4266 4287 N
+ SH IH EY e n/a 31 4254 4276 4287 N
+ SH IH EY i n/a 31 4254 4276 4287 N
+ SH IH EY s n/a 31 4254 4276 4287 N
+ SH IH F e n/a 31 4255 4275 4283 N
+ SH IH F i n/a 31 4255 4275 4283 N
+ SH IH F s n/a 31 4255 4275 4283 N
+ SH IH G e n/a 31 4255 4275 4283 N
+ SH IH G s n/a 31 4255 4275 4283 N
+ SH IH HH e n/a 31 4255 4275 4282 N
+ SH IH HH s n/a 31 4255 4275 4282 N
+ SH IH IH b n/a 31 4255 4265 4287 N
+ SH IH IH e n/a 31 4255 4276 4281 N
+ SH IH IH i n/a 31 4255 4276 4281 N
+ SH IH IH s n/a 31 4255 4276 4281 N
+ SH IH IY b n/a 31 4254 4266 4278 N
+ SH IH IY e n/a 31 4254 4276 4278 N
+ SH IH IY i n/a 31 4254 4276 4278 N
+ SH IH IY s n/a 31 4254 4276 4278 N
+ SH IH JH e n/a 31 4255 4274 4283 N
+ SH IH JH s n/a 31 4255 4274 4283 N
+ SH IH K b n/a 31 4255 4265 4283 N
+ SH IH K e n/a 31 4255 4275 4283 N
+ SH IH K i n/a 31 4255 4275 4283 N
+ SH IH K s n/a 31 4255 4275 4283 N
+ SH IH L b n/a 31 4255 4265 4283 N
+ SH IH L e n/a 31 4255 4275 4283 N
+ SH IH L i n/a 31 4255 4275 4283 N
+ SH IH L s n/a 31 4255 4275 4283 N
+ SH IH M b n/a 31 4255 4265 4283 N
+ SH IH M e n/a 31 4255 4275 4283 N
+ SH IH M i n/a 31 4255 4275 4283 N
+ SH IH M s n/a 31 4255 4275 4283 N
+ SH IH N b n/a 31 4255 4265 4281 N
+ SH IH N e n/a 31 4255 4275 4281 N
+ SH IH N i n/a 31 4255 4275 4281 N
+ SH IH N s n/a 31 4255 4275 4281 N
+ SH IH NG e n/a 31 4255 4275 4283 N
+ SH IH NG s n/a 31 4255 4275 4283 N
+ SH IH OW b n/a 31 4254 4265 4288 N
+ SH IH OW e n/a 31 4254 4276 4288 N
+ SH IH OW i n/a 31 4254 4276 4290 N
+ SH IH OW s n/a 31 4254 4276 4288 N
+ SH IH OY b n/a 31 4254 4265 4290 N
+ SH IH OY e n/a 31 4254 4276 4290 N
+ SH IH OY s n/a 31 4254 4276 4290 N
+ SH IH P e n/a 31 4255 4275 4283 N
+ SH IH P i n/a 31 4255 4275 4283 N
+ SH IH P s n/a 31 4255 4275 4283 N
+ SH IH R b n/a 31 4255 4265 4283 N
+ SH IH R e n/a 31 4255 4275 4283 N
+ SH IH R i n/a 31 4255 4275 4283 N
+ SH IH R s n/a 31 4255 4275 4283 N
+ SH IH S e n/a 31 4255 4275 4284 N
+ SH IH S i n/a 31 4255 4275 4284 N
+ SH IH S s n/a 31 4255 4275 4284 N
+ SH IH SH e n/a 31 4255 4274 4282 N
+ SH IH SH s n/a 31 4255 4274 4282 N
+ SH IH SIL e n/a 31 4255 4274 4282 N
+ SH IH SIL s n/a 31 4255 4274 4282 N
+ SH IH T b n/a 31 4255 4265 4284 N
+ SH IH T e n/a 31 4255 4275 4284 N
+ SH IH T i n/a 31 4255 4275 4284 N
+ SH IH T s n/a 31 4255 4275 4284 N
+ SH IH TH e n/a 31 4255 4275 4284 N
+ SH IH TH s n/a 31 4255 4275 4284 N
+ SH IH UH b n/a 31 4255 4265 4285 N
+ SH IH UH e n/a 31 4255 4276 4281 N
+ SH IH UH s n/a 31 4255 4276 4281 N
+ SH IH UW b n/a 31 4254 4265 4286 N
+ SH IH UW e n/a 31 4254 4276 4286 N
+ SH IH UW i n/a 31 4254 4276 4286 N
+ SH IH UW s n/a 31 4254 4276 4286 N
+ SH IH V b n/a 31 4255 4265 4283 N
+ SH IH V e n/a 31 4255 4275 4283 N
+ SH IH V s n/a 31 4255 4275 4283 N
+ SH IH W b n/a 31 4255 4265 4283 N
+ SH IH W e n/a 31 4255 4275 4283 N
+ SH IH W i n/a 31 4255 4275 4283 N
+ SH IH W s n/a 31 4255 4275 4283 N
+ SH IH Y b n/a 31 4255 4266 4278 N
+ SH IH Y e n/a 31 4255 4274 4278 N
+ SH IH Y i n/a 31 4255 4274 4278 N
+ SH IH Y s n/a 31 4255 4274 4278 N
+ SH IH Z e n/a 31 4255 4275 4284 N
+ SH IH Z s n/a 31 4255 4275 4284 N
+ SH IH ZH e n/a 31 4255 4274 4283 N
+ SH IH ZH s n/a 31 4255 4274 4283 N
+ SH IY AA b n/a 31 4256 4267 4288 N
+ SH IY AA e n/a 31 4256 4277 4288 N
+ SH IY AA i n/a 31 4256 4277 4288 N
+ SH IY AA s n/a 31 4256 4277 4288 N
+ SH IY AE b n/a 31 4256 4267 4289 N
+ SH IY AE e n/a 31 4256 4277 4289 N
+ SH IY AE i n/a 31 4256 4277 4289 N
+ SH IY AE s n/a 31 4256 4277 4289 N
+ SH IY AH b n/a 31 4256 4267 4288 N
+ SH IY AH e n/a 31 4256 4277 4281 N
+ SH IY AH i n/a 31 4256 4277 4281 N
+ SH IY AH s n/a 31 4256 4277 4281 N
+ SH IY AO b n/a 31 4256 4267 4290 N
+ SH IY AO e n/a 31 4256 4277 4290 N
+ SH IY AO i n/a 31 4256 4277 4290 N
+ SH IY AO s n/a 31 4256 4277 4290 N
+ SH IY AW b n/a 31 4256 4267 4289 N
+ SH IY AW e n/a 31 4256 4277 4289 N
+ SH IY AW s n/a 31 4256 4277 4289 N
+ SH IY AY b n/a 31 4256 4266 4288 N
+ SH IY AY e n/a 31 4256 4277 4288 N
+ SH IY AY s n/a 31 4256 4277 4288 N
+ SH IY B b n/a 31 4256 4267 4283 N
+ SH IY B e n/a 31 4256 4277 4283 N
+ SH IY B s n/a 31 4256 4277 4283 N
+ SH IY CH b n/a 31 4256 4267 4282 N
+ SH IY CH e n/a 31 4256 4277 4282 N
+ SH IY CH s n/a 31 4256 4277 4282 N
+ SH IY D e n/a 31 4256 4277 4284 N
+ SH IY D s n/a 31 4256 4277 4284 N
+ SH IY DH e n/a 31 4256 4277 4284 N
+ SH IY DH s n/a 31 4256 4277 4284 N
+ SH IY EH b n/a 31 4256 4267 4287 N
+ SH IY EH e n/a 31 4256 4277 4281 N
+ SH IY EH i n/a 31 4256 4277 4281 N
+ SH IY EH s n/a 31 4256 4277 4281 N
+ SH IY ER b n/a 31 4256 4267 4285 N
+ SH IY ER e n/a 31 4256 4277 4285 N
+ SH IY ER i n/a 31 4256 4277 4285 N
+ SH IY ER s n/a 31 4256 4277 4285 N
+ SH IY EY b n/a 31 4256 4266 4287 N
+ SH IY EY e n/a 31 4256 4277 4287 N
+ SH IY EY i n/a 31 4256 4277 4287 N
+ SH IY EY s n/a 31 4256 4277 4287 N
+ SH IY F e n/a 31 4256 4277 4283 N
+ SH IY F s n/a 31 4256 4277 4283 N
+ SH IY G e n/a 31 4256 4277 4283 N
+ SH IY G s n/a 31 4256 4277 4283 N
+ SH IY HH e n/a 31 4256 4277 4282 N
+ SH IY HH s n/a 31 4256 4277 4282 N
+ SH IY IH b n/a 31 4256 4267 4287 N
+ SH IY IH e n/a 31 4256 4277 4281 N
+ SH IY IH i n/a 31 4256 4277 4281 N
+ SH IY IH s n/a 31 4256 4277 4281 N
+ SH IY IY b n/a 31 4256 4266 4278 N
+ SH IY IY e n/a 31 4256 4277 4278 N
+ SH IY IY i n/a 31 4256 4277 4278 N
+ SH IY IY s n/a 31 4256 4277 4278 N
+ SH IY JH e n/a 31 4256 4277 4283 N
+ SH IY JH s n/a 31 4256 4277 4283 N
+ SH IY K b n/a 31 4256 4267 4283 N
+ SH IY K e n/a 31 4256 4277 4283 N
+ SH IY K i n/a 31 4256 4277 4283 N
+ SH IY K s n/a 31 4256 4277 4283 N
+ SH IY L b n/a 31 4256 4267 4283 N
+ SH IY L e n/a 31 4256 4277 4283 N
+ SH IY L s n/a 31 4256 4277 4283 N
+ SH IY M b n/a 31 4256 4267 4283 N
+ SH IY M e n/a 31 4256 4277 4283 N
+ SH IY M i n/a 31 4256 4277 4283 N
+ SH IY M s n/a 31 4256 4277 4283 N
+ SH IY N b n/a 31 4256 4267 4281 N
+ SH IY N e n/a 31 4256 4277 4281 N
+ SH IY N i n/a 31 4256 4277 4281 N
+ SH IY N s n/a 31 4256 4277 4281 N
+ SH IY NG e n/a 31 4256 4277 4283 N
+ SH IY NG s n/a 31 4256 4277 4283 N
+ SH IY OW b n/a 31 4256 4267 4288 N
+ SH IY OW e n/a 31 4256 4277 4288 N
+ SH IY OW i n/a 31 4256 4277 4290 N
+ SH IY OW s n/a 31 4256 4277 4288 N
+ SH IY OY b n/a 31 4256 4266 4290 N
+ SH IY OY e n/a 31 4256 4277 4290 N
+ SH IY OY s n/a 31 4256 4277 4290 N
+ SH IY P e n/a 31 4256 4277 4283 N
+ SH IY P s n/a 31 4256 4277 4283 N
+ SH IY R b n/a 31 4256 4267 4283 N
+ SH IY R e n/a 31 4256 4277 4283 N
+ SH IY R s n/a 31 4256 4277 4283 N
+ SH IY S e n/a 31 4256 4277 4284 N
+ SH IY S s n/a 31 4256 4277 4284 N
+ SH IY SH e n/a 31 4256 4277 4282 N
+ SH IY SH s n/a 31 4256 4277 4282 N
+ SH IY SIL e n/a 31 4256 4277 4282 N
+ SH IY SIL s n/a 31 4256 4277 4282 N
+ SH IY T b n/a 31 4256 4267 4284 N
+ SH IY T e n/a 31 4256 4277 4284 N
+ SH IY T i n/a 31 4256 4277 4284 N
+ SH IY T s n/a 31 4256 4277 4284 N
+ SH IY TH e n/a 31 4256 4277 4284 N
+ SH IY TH s n/a 31 4256 4277 4284 N
+ SH IY UH b n/a 31 4256 4267 4285 N
+ SH IY UH e n/a 31 4256 4277 4281 N
+ SH IY UH s n/a 31 4256 4277 4281 N
+ SH IY UW b n/a 31 4256 4267 4286 N
+ SH IY UW e n/a 31 4256 4277 4286 N
+ SH IY UW i n/a 31 4256 4277 4286 N
+ SH IY UW s n/a 31 4256 4277 4286 N
+ SH IY V b n/a 31 4256 4267 4283 N
+ SH IY V e n/a 31 4256 4277 4283 N
+ SH IY V s n/a 31 4256 4277 4283 N
+ SH IY W b n/a 31 4256 4267 4283 N
+ SH IY W e n/a 31 4256 4277 4283 N
+ SH IY W s n/a 31 4256 4277 4283 N
+ SH IY Y b n/a 31 4256 4266 4278 N
+ SH IY Y e n/a 31 4256 4277 4278 N
+ SH IY Y i n/a 31 4256 4277 4278 N
+ SH IY Y s n/a 31 4256 4277 4278 N
+ SH IY Z e n/a 31 4256 4277 4284 N
+ SH IY Z s n/a 31 4256 4277 4284 N
+ SH IY ZH e n/a 31 4256 4277 4283 N
+ SH IY ZH s n/a 31 4256 4277 4283 N
+ SH JH AA b n/a 31 4250 4265 4288 N
+ SH JH AA s n/a 31 4250 4272 4288 N
+ SH JH AE b n/a 31 4250 4265 4289 N
+ SH JH AE s n/a 31 4250 4272 4289 N
+ SH JH AH b n/a 31 4250 4265 4288 N
+ SH JH AH s n/a 31 4250 4272 4279 N
+ SH JH AO b n/a 31 4250 4265 4290 N
+ SH JH AO s n/a 31 4250 4272 4290 N
+ SH JH AW b n/a 31 4250 4265 4289 N
+ SH JH AW s n/a 31 4250 4272 4289 N
+ SH JH AY b n/a 31 4250 4265 4288 N
+ SH JH AY s n/a 31 4250 4272 4288 N
+ SH JH B b n/a 31 4250 4265 4283 N
+ SH JH B s n/a 31 4250 4272 4283 N
+ SH JH CH b n/a 31 4250 4265 4282 N
+ SH JH CH s n/a 31 4250 4272 4282 N
+ SH JH D s n/a 31 4250 4272 4284 N
+ SH JH DH s n/a 31 4250 4272 4284 N
+ SH JH EH b n/a 31 4250 4265 4287 N
+ SH JH EH s n/a 31 4250 4272 4279 N
+ SH JH ER b n/a 31 4250 4265 4285 N
+ SH JH ER s n/a 31 4250 4272 4285 N
+ SH JH EY b n/a 31 4250 4266 4287 N
+ SH JH EY s n/a 31 4250 4272 4287 N
+ SH JH F s n/a 31 4250 4272 4283 N
+ SH JH G s n/a 31 4250 4272 4283 N
+ SH JH HH s n/a 31 4250 4272 4282 N
+ SH JH IH b n/a 31 4250 4265 4287 N
+ SH JH IH i n/a 31 4250 4272 4280 N
+ SH JH IH s n/a 31 4250 4272 4280 N
+ SH JH IY b n/a 31 4250 4266 4278 N
+ SH JH IY s n/a 31 4250 4272 4278 N
+ SH JH JH s n/a 31 4250 4272 4283 N
+ SH JH K b n/a 31 4250 4265 4283 N
+ SH JH K s n/a 31 4250 4272 4283 N
+ SH JH L b n/a 31 4250 4265 4283 N
+ SH JH L s n/a 31 4250 4272 4283 N
+ SH JH M b n/a 31 4250 4265 4283 N
+ SH JH M s n/a 31 4250 4272 4283 N
+ SH JH N b n/a 31 4250 4265 4279 N
+ SH JH N s n/a 31 4250 4272 4279 N
+ SH JH NG s n/a 31 4250 4272 4283 N
+ SH JH OW b n/a 31 4250 4265 4288 N
+ SH JH OW s n/a 31 4250 4272 4288 N
+ SH JH OY b n/a 31 4250 4265 4290 N
+ SH JH OY s n/a 31 4250 4272 4290 N
+ SH JH P s n/a 31 4250 4272 4283 N
+ SH JH R b n/a 31 4250 4265 4283 N
+ SH JH R s n/a 31 4250 4272 4283 N
+ SH JH S s n/a 31 4250 4272 4284 N
+ SH JH SH s n/a 31 4250 4272 4282 N
+ SH JH SIL s n/a 31 4250 4272 4282 N
+ SH JH T b n/a 31 4250 4265 4284 N
+ SH JH T s n/a 31 4250 4272 4284 N
+ SH JH TH s n/a 31 4250 4272 4284 N
+ SH JH UH b n/a 31 4250 4265 4285 N
+ SH JH UH s n/a 31 4250 4272 4280 N
+ SH JH UW b n/a 31 4250 4265 4286 N
+ SH JH UW s n/a 31 4250 4272 4286 N
+ SH JH V b n/a 31 4250 4265 4283 N
+ SH JH V s n/a 31 4250 4272 4283 N
+ SH JH W b n/a 31 4250 4265 4283 N
+ SH JH W s n/a 31 4250 4272 4283 N
+ SH JH Y b n/a 31 4250 4266 4278 N
+ SH JH Y s n/a 31 4250 4272 4278 N
+ SH JH Z s n/a 31 4250 4272 4284 N
+ SH JH ZH s n/a 31 4250 4272 4283 N
+ SH K AA b n/a 31 4248 4265 4288 N
+ SH K AA e n/a 31 4248 4272 4288 N
+ SH K AA i n/a 31 4248 4272 4288 N
+ SH K AA s n/a 31 4248 4272 4288 N
+ SH K AE b n/a 31 4248 4265 4289 N
+ SH K AE e n/a 31 4248 4272 4289 N
+ SH K AE i n/a 31 4248 4272 4289 N
+ SH K AE s n/a 31 4248 4272 4289 N
+ SH K AH b n/a 31 4248 4265 4288 N
+ SH K AH e n/a 31 4248 4272 4279 N
+ SH K AH i n/a 31 4248 4272 4279 N
+ SH K AH s n/a 31 4248 4272 4279 N
+ SH K AO b n/a 31 4248 4265 4290 N
+ SH K AO e n/a 31 4248 4272 4290 N
+ SH K AO i n/a 31 4248 4272 4290 N
+ SH K AO s n/a 31 4248 4272 4290 N
+ SH K AW b n/a 31 4248 4265 4289 N
+ SH K AW e n/a 31 4248 4272 4289 N
+ SH K AW s n/a 31 4248 4272 4289 N
+ SH K AY b n/a 31 4248 4265 4288 N
+ SH K AY e n/a 31 4248 4272 4288 N
+ SH K AY i n/a 31 4248 4272 4288 N
+ SH K AY s n/a 31 4248 4272 4288 N
+ SH K B b n/a 31 4248 4265 4283 N
+ SH K B e n/a 31 4248 4272 4283 N
+ SH K B s n/a 31 4248 4272 4283 N
+ SH K CH b n/a 31 4248 4265 4282 N
+ SH K CH e n/a 31 4248 4272 4282 N
+ SH K CH s n/a 31 4248 4272 4282 N
+ SH K D e n/a 31 4248 4272 4284 N
+ SH K D s n/a 31 4248 4272 4284 N
+ SH K DH e n/a 31 4248 4272 4284 N
+ SH K DH s n/a 31 4248 4272 4284 N
+ SH K EH b n/a 31 4248 4265 4287 N
+ SH K EH e n/a 31 4248 4272 4279 N
+ SH K EH i n/a 31 4248 4272 4279 N
+ SH K EH s n/a 31 4248 4272 4279 N
+ SH K ER b n/a 31 4248 4265 4285 N
+ SH K ER e n/a 31 4248 4272 4285 N
+ SH K ER i n/a 31 4248 4272 4285 N
+ SH K ER s n/a 31 4248 4272 4285 N
+ SH K EY b n/a 31 4248 4266 4287 N
+ SH K EY e n/a 31 4248 4272 4287 N
+ SH K EY i n/a 31 4248 4272 4287 N
+ SH K EY s n/a 31 4248 4272 4287 N
+ SH K F e n/a 31 4248 4272 4283 N
+ SH K F s n/a 31 4248 4272 4283 N
+ SH K G e n/a 31 4248 4272 4283 N
+ SH K G s n/a 31 4248 4272 4283 N
+ SH K HH e n/a 31 4248 4272 4282 N
+ SH K HH s n/a 31 4248 4272 4282 N
+ SH K IH b n/a 31 4248 4265 4287 N
+ SH K IH e n/a 31 4248 4272 4280 N
+ SH K IH i n/a 31 4248 4272 4280 N
+ SH K IH s n/a 31 4248 4272 4280 N
+ SH K IY b n/a 31 4248 4266 4278 N
+ SH K IY e n/a 31 4248 4272 4278 N
+ SH K IY i n/a 31 4248 4272 4278 N
+ SH K IY s n/a 31 4248 4272 4278 N
+ SH K JH e n/a 31 4248 4272 4283 N
+ SH K JH s n/a 31 4248 4272 4283 N
+ SH K K b n/a 31 4248 4265 4283 N
+ SH K K e n/a 31 4248 4272 4283 N
+ SH K K s n/a 31 4248 4272 4283 N
+ SH K L b n/a 31 4248 4265 4283 N
+ SH K L e n/a 31 4248 4272 4283 N
+ SH K L s n/a 31 4248 4272 4283 N
+ SH K M b n/a 31 4248 4265 4283 N
+ SH K M e n/a 31 4248 4272 4283 N
+ SH K M i n/a 31 4248 4272 4283 N
+ SH K M s n/a 31 4248 4272 4283 N
+ SH K N b n/a 31 4248 4265 4279 N
+ SH K N e n/a 31 4248 4272 4279 N
+ SH K N i n/a 31 4248 4272 4279 N
+ SH K N s n/a 31 4248 4272 4279 N
+ SH K NG e n/a 31 4248 4272 4283 N
+ SH K NG s n/a 31 4248 4272 4283 N
+ SH K OW b n/a 31 4248 4265 4288 N
+ SH K OW e n/a 31 4248 4272 4288 N
+ SH K OW i n/a 31 4248 4272 4290 N
+ SH K OW s n/a 31 4248 4272 4288 N
+ SH K OY b n/a 31 4248 4265 4290 N
+ SH K OY e n/a 31 4248 4272 4290 N
+ SH K OY s n/a 31 4248 4272 4290 N
+ SH K P e n/a 31 4248 4272 4283 N
+ SH K P i n/a 31 4248 4272 4283 N
+ SH K P s n/a 31 4248 4272 4283 N
+ SH K R b n/a 31 4248 4265 4283 N
+ SH K R e n/a 31 4248 4272 4283 N
+ SH K R s n/a 31 4248 4272 4283 N
+ SH K S e n/a 31 4248 4272 4284 N
+ SH K S s n/a 31 4248 4272 4284 N
+ SH K SH e n/a 31 4248 4272 4282 N
+ SH K SH s n/a 31 4248 4272 4282 N
+ SH K SIL e n/a 31 4248 4272 4282 N
+ SH K SIL s n/a 31 4248 4272 4282 N
+ SH K T b n/a 31 4248 4265 4284 N
+ SH K T e n/a 31 4248 4272 4284 N
+ SH K T i n/a 31 4248 4272 4284 N
+ SH K T s n/a 31 4248 4272 4284 N
+ SH K TH e n/a 31 4248 4272 4284 N
+ SH K TH s n/a 31 4248 4272 4284 N
+ SH K UH b n/a 31 4248 4265 4285 N
+ SH K UH e n/a 31 4248 4272 4280 N
+ SH K UH s n/a 31 4248 4272 4280 N
+ SH K UW b n/a 31 4248 4265 4286 N
+ SH K UW e n/a 31 4248 4272 4286 N
+ SH K UW i n/a 31 4248 4272 4285 N
+ SH K UW s n/a 31 4248 4272 4286 N
+ SH K V b n/a 31 4248 4265 4283 N
+ SH K V e n/a 31 4248 4272 4283 N
+ SH K V s n/a 31 4248 4272 4283 N
+ SH K W b n/a 31 4248 4265 4283 N
+ SH K W e n/a 31 4248 4272 4283 N
+ SH K W s n/a 31 4248 4272 4283 N
+ SH K Y b n/a 31 4248 4266 4278 N
+ SH K Y e n/a 31 4248 4272 4278 N
+ SH K Y i n/a 31 4248 4272 4278 N
+ SH K Y s n/a 31 4248 4272 4278 N
+ SH K Z e n/a 31 4248 4272 4284 N
+ SH K Z s n/a 31 4248 4272 4284 N
+ SH K ZH e n/a 31 4248 4272 4283 N
+ SH K ZH s n/a 31 4248 4272 4283 N
+ SH L AA b n/a 31 4262 4265 4288 N
+ SH L AA e n/a 31 4262 4270 4288 N
+ SH L AA i n/a 31 4262 4270 4288 N
+ SH L AA s n/a 31 4262 4270 4288 N
+ SH L AE b n/a 31 4262 4265 4289 N
+ SH L AE e n/a 31 4262 4270 4289 N
+ SH L AE i n/a 31 4262 4270 4289 N
+ SH L AE s n/a 31 4262 4270 4289 N
+ SH L AH b n/a 31 4262 4265 4288 N
+ SH L AH e n/a 31 4262 4270 4279 N
+ SH L AH i n/a 31 4262 4270 4279 N
+ SH L AH s n/a 31 4262 4270 4279 N
+ SH L AO b n/a 31 4262 4265 4290 N
+ SH L AO e n/a 31 4262 4270 4290 N
+ SH L AO i n/a 31 4262 4270 4290 N
+ SH L AO s n/a 31 4262 4270 4290 N
+ SH L AW b n/a 31 4262 4265 4289 N
+ SH L AW e n/a 31 4262 4270 4289 N
+ SH L AW s n/a 31 4262 4270 4289 N
+ SH L AY b n/a 31 4262 4265 4288 N
+ SH L AY e n/a 31 4262 4270 4288 N
+ SH L AY i n/a 31 4262 4270 4288 N
+ SH L AY s n/a 31 4262 4270 4288 N
+ SH L B b n/a 31 4262 4265 4283 N
+ SH L B e n/a 31 4262 4270 4283 N
+ SH L B s n/a 31 4262 4270 4283 N
+ SH L CH b n/a 31 4262 4265 4282 N
+ SH L CH e n/a 31 4262 4270 4282 N
+ SH L CH s n/a 31 4262 4270 4282 N
+ SH L D e n/a 31 4262 4270 4284 N
+ SH L D s n/a 31 4262 4270 4284 N
+ SH L DH e n/a 31 4262 4270 4284 N
+ SH L DH s n/a 31 4262 4270 4284 N
+ SH L EH b n/a 31 4262 4265 4287 N
+ SH L EH e n/a 31 4262 4270 4279 N
+ SH L EH i n/a 31 4262 4270 4279 N
+ SH L EH s n/a 31 4262 4270 4279 N
+ SH L ER b n/a 31 4262 4265 4285 N
+ SH L ER e n/a 31 4262 4270 4285 N
+ SH L ER i n/a 31 4262 4270 4285 N
+ SH L ER s n/a 31 4262 4270 4285 N
+ SH L EY b n/a 31 4262 4266 4287 N
+ SH L EY e n/a 31 4262 4270 4287 N
+ SH L EY s n/a 31 4262 4270 4287 N
+ SH L F e n/a 31 4262 4270 4283 N
+ SH L F s n/a 31 4262 4270 4283 N
+ SH L G e n/a 31 4262 4270 4283 N
+ SH L G s n/a 31 4262 4270 4283 N
+ SH L HH e n/a 31 4262 4270 4282 N
+ SH L HH s n/a 31 4262 4270 4282 N
+ SH L IH b n/a 31 4262 4265 4287 N
+ SH L IH e n/a 31 4262 4270 4280 N
+ SH L IH i n/a 31 4262 4270 4280 N
+ SH L IH s n/a 31 4262 4270 4280 N
+ SH L IY b n/a 31 4262 4266 4278 N
+ SH L IY e n/a 31 4262 4270 4278 N
+ SH L IY s n/a 31 4262 4270 4278 N
+ SH L JH e n/a 31 4262 4270 4283 N
+ SH L JH s n/a 31 4262 4270 4283 N
+ SH L K b n/a 31 4262 4265 4283 N
+ SH L K e n/a 31 4262 4270 4283 N
+ SH L K s n/a 31 4262 4270 4283 N
+ SH L L b n/a 31 4262 4265 4283 N
+ SH L L e n/a 31 4262 4270 4283 N
+ SH L L i n/a 31 4262 4270 4283 N
+ SH L L s n/a 31 4262 4270 4283 N
+ SH L M b n/a 31 4262 4265 4283 N
+ SH L M e n/a 31 4262 4270 4283 N
+ SH L M i n/a 31 4262 4270 4283 N
+ SH L M s n/a 31 4262 4270 4283 N
+ SH L N b n/a 31 4262 4265 4279 N
+ SH L N e n/a 31 4262 4270 4279 N
+ SH L N s n/a 31 4262 4270 4279 N
+ SH L NG e n/a 31 4262 4270 4283 N
+ SH L NG s n/a 31 4262 4270 4283 N
+ SH L OW b n/a 31 4262 4265 4288 N
+ SH L OW e n/a 31 4262 4270 4288 N
+ SH L OW s n/a 31 4262 4270 4288 N
+ SH L OY b n/a 31 4262 4265 4290 N
+ SH L OY e n/a 31 4262 4270 4290 N
+ SH L OY i n/a 31 4262 4270 4290 N
+ SH L OY s n/a 31 4262 4270 4290 N
+ SH L P e n/a 31 4262 4270 4283 N
+ SH L P s n/a 31 4262 4270 4283 N
+ SH L R b n/a 31 4262 4265 4283 N
+ SH L R e n/a 31 4262 4270 4283 N
+ SH L R s n/a 31 4262 4270 4283 N
+ SH L S e n/a 31 4262 4270 4284 N
+ SH L S s n/a 31 4262 4270 4284 N
+ SH L SH e n/a 31 4262 4270 4282 N
+ SH L SH s n/a 31 4262 4270 4282 N
+ SH L SIL e n/a 31 4262 4271 4282 N
+ SH L SIL s n/a 31 4262 4271 4282 N
+ SH L T b n/a 31 4262 4265 4284 N
+ SH L T e n/a 31 4262 4270 4284 N
+ SH L T i n/a 31 4262 4270 4284 N
+ SH L T s n/a 31 4262 4270 4284 N
+ SH L TH e n/a 31 4262 4270 4284 N
+ SH L TH s n/a 31 4262 4270 4284 N
+ SH L UH b n/a 31 4262 4265 4285 N
+ SH L UH e n/a 31 4262 4270 4280 N
+ SH L UH s n/a 31 4262 4270 4280 N
+ SH L UW b n/a 31 4262 4265 4286 N
+ SH L UW e n/a 31 4262 4270 4286 N
+ SH L UW i n/a 31 4262 4270 4286 N
+ SH L UW s n/a 31 4262 4270 4286 N
+ SH L V b n/a 31 4262 4265 4283 N
+ SH L V e n/a 31 4262 4270 4283 N
+ SH L V s n/a 31 4262 4270 4283 N
+ SH L W b n/a 31 4262 4265 4283 N
+ SH L W e n/a 31 4262 4270 4283 N
+ SH L W s n/a 31 4262 4270 4283 N
+ SH L Y b n/a 31 4262 4266 4278 N
+ SH L Y e n/a 31 4262 4270 4278 N
+ SH L Y s n/a 31 4262 4270 4278 N
+ SH L Z e n/a 31 4262 4270 4284 N
+ SH L Z s n/a 31 4262 4270 4284 N
+ SH L ZH e n/a 31 4262 4270 4283 N
+ SH L ZH s n/a 31 4262 4270 4283 N
+ SH M AA b n/a 31 4251 4265 4288 N
+ SH M AA s n/a 31 4251 4272 4288 N
+ SH M AE b n/a 31 4251 4265 4289 N
+ SH M AE i n/a 31 4251 4272 4289 N
+ SH M AE s n/a 31 4251 4272 4289 N
+ SH M AH b n/a 31 4251 4265 4288 N
+ SH M AH i n/a 31 4251 4272 4279 N
+ SH M AH s n/a 31 4251 4272 4279 N
+ SH M AO b n/a 31 4251 4265 4290 N
+ SH M AO i n/a 31 4251 4272 4290 N
+ SH M AO s n/a 31 4251 4272 4290 N
+ SH M AW b n/a 31 4251 4265 4289 N
+ SH M AW s n/a 31 4251 4272 4289 N
+ SH M AY b n/a 31 4251 4265 4288 N
+ SH M AY i n/a 31 4251 4272 4288 N
+ SH M AY s n/a 31 4251 4272 4288 N
+ SH M B b n/a 31 4251 4265 4283 N
+ SH M B s n/a 31 4251 4272 4283 N
+ SH M CH b n/a 31 4251 4265 4282 N
+ SH M CH s n/a 31 4251 4272 4282 N
+ SH M D s n/a 31 4251 4272 4284 N
+ SH M DH s n/a 31 4251 4272 4284 N
+ SH M EH b n/a 31 4251 4265 4287 N
+ SH M EH i n/a 31 4251 4272 4279 N
+ SH M EH s n/a 31 4251 4272 4279 N
+ SH M ER b n/a 31 4251 4265 4285 N
+ SH M ER i n/a 31 4251 4272 4285 N
+ SH M ER s n/a 31 4251 4272 4285 N
+ SH M EY b n/a 31 4251 4266 4287 N
+ SH M EY s n/a 31 4251 4272 4287 N
+ SH M F s n/a 31 4251 4272 4283 N
+ SH M G s n/a 31 4251 4272 4283 N
+ SH M HH s n/a 31 4251 4272 4282 N
+ SH M IH b n/a 31 4251 4265 4287 N
+ SH M IH i n/a 31 4251 4272 4280 N
+ SH M IH s n/a 31 4251 4272 4280 N
+ SH M IY b n/a 31 4251 4266 4278 N
+ SH M IY i n/a 31 4251 4272 4278 N
+ SH M IY s n/a 31 4251 4272 4278 N
+ SH M JH s n/a 31 4251 4272 4283 N
+ SH M K b n/a 31 4251 4265 4283 N
+ SH M K s n/a 31 4251 4272 4283 N
+ SH M L b n/a 31 4251 4265 4283 N
+ SH M L s n/a 31 4251 4272 4283 N
+ SH M M b n/a 31 4251 4265 4283 N
+ SH M M s n/a 31 4251 4272 4283 N
+ SH M N b n/a 31 4251 4265 4279 N
+ SH M N s n/a 31 4251 4272 4279 N
+ SH M NG s n/a 31 4251 4272 4283 N
+ SH M OW b n/a 31 4251 4265 4288 N
+ SH M OW i n/a 31 4251 4272 4290 N
+ SH M OW s n/a 31 4251 4272 4288 N
+ SH M OY b n/a 31 4251 4265 4290 N
+ SH M OY s n/a 31 4251 4272 4290 N
+ SH M P s n/a 31 4251 4272 4283 N
+ SH M R b n/a 31 4251 4265 4283 N
+ SH M R s n/a 31 4251 4272 4283 N
+ SH M S s n/a 31 4251 4272 4284 N
+ SH M SH s n/a 31 4251 4272 4282 N
+ SH M SIL s n/a 31 4251 4272 4282 N
+ SH M T b n/a 31 4251 4265 4284 N
+ SH M T s n/a 31 4251 4272 4284 N
+ SH M TH s n/a 31 4251 4272 4284 N
+ SH M UH b n/a 31 4251 4265 4285 N
+ SH M UH s n/a 31 4251 4272 4280 N
+ SH M UW b n/a 31 4251 4265 4286 N
+ SH M UW i n/a 31 4251 4272 4286 N
+ SH M UW s n/a 31 4251 4272 4286 N
+ SH M V b n/a 31 4251 4265 4283 N
+ SH M V s n/a 31 4251 4272 4283 N
+ SH M W b n/a 31 4251 4265 4283 N
+ SH M W s n/a 31 4251 4272 4283 N
+ SH M Y b n/a 31 4251 4266 4278 N
+ SH M Y s n/a 31 4251 4272 4278 N
+ SH M Z s n/a 31 4251 4272 4284 N
+ SH M ZH s n/a 31 4251 4272 4283 N
+ SH N AA b n/a 31 4252 4265 4288 N
+ SH N AA e n/a 31 4252 4273 4288 N
+ SH N AA i n/a 31 4252 4273 4288 N
+ SH N AA s n/a 31 4252 4273 4288 N
+ SH N AE b n/a 31 4252 4265 4289 N
+ SH N AE e n/a 31 4252 4273 4289 N
+ SH N AE i n/a 31 4252 4273 4289 N
+ SH N AE s n/a 31 4252 4273 4289 N
+ SH N AH b n/a 31 4252 4265 4288 N
+ SH N AH e n/a 31 4252 4273 4279 N
+ SH N AH i n/a 31 4252 4273 4279 N
+ SH N AH s n/a 31 4252 4273 4279 N
+ SH N AO b n/a 31 4252 4265 4290 N
+ SH N AO e n/a 31 4252 4273 4290 N
+ SH N AO i n/a 31 4252 4273 4290 N
+ SH N AO s n/a 31 4252 4273 4290 N
+ SH N AW b n/a 31 4252 4265 4289 N
+ SH N AW e n/a 31 4252 4273 4289 N
+ SH N AW s n/a 31 4252 4273 4289 N
+ SH N AY b n/a 31 4252 4268 4288 N
+ SH N AY e n/a 31 4252 4273 4288 N
+ SH N AY i n/a 31 4252 4273 4288 N
+ SH N AY s n/a 31 4252 4273 4288 N
+ SH N B b n/a 31 4252 4265 4283 N
+ SH N B e n/a 31 4252 4273 4283 N
+ SH N B s n/a 31 4252 4273 4283 N
+ SH N CH b n/a 31 4252 4265 4282 N
+ SH N CH e n/a 31 4252 4273 4282 N
+ SH N CH s n/a 31 4252 4273 4282 N
+ SH N D e n/a 31 4252 4273 4284 N
+ SH N D s n/a 31 4252 4273 4284 N
+ SH N DH e n/a 31 4252 4273 4284 N
+ SH N DH s n/a 31 4252 4273 4284 N
+ SH N EH b n/a 31 4252 4265 4287 N
+ SH N EH e n/a 31 4252 4273 4279 N
+ SH N EH i n/a 31 4252 4273 4279 N
+ SH N EH s n/a 31 4252 4273 4279 N
+ SH N ER b n/a 31 4252 4265 4285 N
+ SH N ER e n/a 31 4252 4273 4285 N
+ SH N ER i n/a 31 4252 4273 4285 N
+ SH N ER s n/a 31 4252 4273 4285 N
+ SH N EY b n/a 31 4252 4268 4287 N
+ SH N EY e n/a 31 4252 4273 4287 N
+ SH N EY i n/a 31 4252 4273 4287 N
+ SH N EY s n/a 31 4252 4273 4287 N
+ SH N F e n/a 31 4252 4273 4283 N
+ SH N F s n/a 31 4252 4273 4283 N
+ SH N G e n/a 31 4252 4273 4283 N
+ SH N G s n/a 31 4252 4273 4283 N
+ SH N HH e n/a 31 4252 4273 4282 N
+ SH N HH s n/a 31 4252 4273 4282 N
+ SH N IH b n/a 31 4252 4265 4287 N
+ SH N IH e n/a 31 4252 4273 4280 N
+ SH N IH i n/a 31 4252 4273 4280 N
+ SH N IH s n/a 31 4252 4273 4280 N
+ SH N IY b n/a 31 4252 4268 4278 N
+ SH N IY e n/a 31 4252 4273 4278 N
+ SH N IY i n/a 31 4252 4273 4278 N
+ SH N IY s n/a 31 4252 4273 4278 N
+ SH N JH e n/a 31 4252 4273 4283 N
+ SH N JH s n/a 31 4252 4273 4283 N
+ SH N K b n/a 31 4252 4265 4283 N
+ SH N K e n/a 31 4252 4273 4283 N
+ SH N K s n/a 31 4252 4273 4283 N
+ SH N L b n/a 31 4252 4265 4283 N
+ SH N L e n/a 31 4252 4273 4283 N
+ SH N L i n/a 31 4252 4273 4283 N
+ SH N L s n/a 31 4252 4273 4283 N
+ SH N M b n/a 31 4252 4265 4283 N
+ SH N M e n/a 31 4252 4273 4283 N
+ SH N M i n/a 31 4252 4273 4283 N
+ SH N M s n/a 31 4252 4273 4283 N
+ SH N N b n/a 31 4252 4265 4279 N
+ SH N N e n/a 31 4252 4273 4279 N
+ SH N N i n/a 31 4252 4273 4279 N
+ SH N N s n/a 31 4252 4273 4279 N
+ SH N NG e n/a 31 4252 4273 4283 N
+ SH N NG s n/a 31 4252 4273 4283 N
+ SH N OW b n/a 31 4252 4265 4288 N
+ SH N OW e n/a 31 4252 4273 4288 N
+ SH N OW i n/a 31 4252 4273 4290 N
+ SH N OW s n/a 31 4252 4273 4288 N
+ SH N OY b n/a 31 4252 4268 4290 N
+ SH N OY e n/a 31 4252 4273 4290 N
+ SH N OY i n/a 31 4252 4273 4290 N
+ SH N OY s n/a 31 4252 4273 4290 N
+ SH N P e n/a 31 4252 4273 4283 N
+ SH N P s n/a 31 4252 4273 4283 N
+ SH N R b n/a 31 4252 4265 4283 N
+ SH N R e n/a 31 4252 4273 4283 N
+ SH N R i n/a 31 4252 4273 4283 N
+ SH N R s n/a 31 4252 4273 4283 N
+ SH N S e n/a 31 4252 4273 4284 N
+ SH N S s n/a 31 4252 4273 4284 N
+ SH N SH e n/a 31 4252 4273 4282 N
+ SH N SH s n/a 31 4252 4273 4282 N
+ SH N SIL e n/a 31 4252 4273 4282 N
+ SH N SIL s n/a 31 4252 4273 4282 N
+ SH N T b n/a 31 4252 4265 4284 N
+ SH N T e n/a 31 4252 4273 4284 N
+ SH N T i n/a 31 4252 4273 4284 N
+ SH N T s n/a 31 4252 4273 4284 N
+ SH N TH e n/a 31 4252 4273 4284 N
+ SH N TH s n/a 31 4252 4273 4284 N
+ SH N UH b n/a 31 4252 4265 4285 N
+ SH N UH e n/a 31 4252 4273 4280 N
+ SH N UH i n/a 31 4252 4273 4280 N
+ SH N UH s n/a 31 4252 4273 4280 N
+ SH N UW b n/a 31 4252 4265 4286 N
+ SH N UW e n/a 31 4252 4273 4286 N
+ SH N UW i n/a 31 4252 4273 4286 N
+ SH N UW s n/a 31 4252 4273 4286 N
+ SH N V b n/a 31 4252 4265 4283 N
+ SH N V e n/a 31 4252 4273 4283 N
+ SH N V i n/a 31 4252 4273 4283 N
+ SH N V s n/a 31 4252 4273 4283 N
+ SH N W b n/a 31 4252 4265 4283 N
+ SH N W e n/a 31 4252 4273 4283 N
+ SH N W i n/a 31 4252 4273 4283 N
+ SH N W s n/a 31 4252 4273 4283 N
+ SH N Y b n/a 31 4252 4268 4278 N
+ SH N Y e n/a 31 4252 4273 4278 N
+ SH N Y i n/a 31 4252 4273 4278 N
+ SH N Y s n/a 31 4252 4273 4278 N
+ SH N Z e n/a 31 4252 4273 4284 N
+ SH N Z s n/a 31 4252 4273 4284 N
+ SH N ZH e n/a 31 4252 4273 4283 N
+ SH N ZH s n/a 31 4252 4273 4283 N
+ SH NG AA b n/a 31 4251 4265 4288 N
+ SH NG AA i n/a 31 4251 4272 4288 N
+ SH NG AA s n/a 31 4251 4272 4288 N
+ SH NG AE b n/a 31 4251 4265 4289 N
+ SH NG AE s n/a 31 4251 4272 4289 N
+ SH NG AH b n/a 31 4251 4265 4288 N
+ SH NG AH i n/a 31 4251 4272 4279 N
+ SH NG AH s n/a 31 4251 4272 4279 N
+ SH NG AO b n/a 31 4251 4265 4290 N
+ SH NG AO i n/a 31 4251 4272 4290 N
+ SH NG AO s n/a 31 4251 4272 4290 N
+ SH NG AW b n/a 31 4251 4265 4289 N
+ SH NG AW s n/a 31 4251 4272 4289 N
+ SH NG AY b n/a 31 4251 4265 4288 N
+ SH NG AY s n/a 31 4251 4272 4288 N
+ SH NG B b n/a 31 4251 4265 4283 N
+ SH NG B s n/a 31 4251 4272 4283 N
+ SH NG CH b n/a 31 4251 4265 4282 N
+ SH NG CH s n/a 31 4251 4272 4282 N
+ SH NG D s n/a 31 4251 4272 4284 N
+ SH NG DH s n/a 31 4251 4272 4284 N
+ SH NG EH b n/a 31 4251 4265 4287 N
+ SH NG EH i n/a 31 4251 4272 4279 N
+ SH NG EH s n/a 31 4251 4272 4279 N
+ SH NG ER b n/a 31 4251 4265 4285 N
+ SH NG ER s n/a 31 4251 4272 4285 N
+ SH NG EY b n/a 31 4251 4266 4287 N
+ SH NG EY s n/a 31 4251 4272 4287 N
+ SH NG F s n/a 31 4251 4272 4283 N
+ SH NG G s n/a 31 4251 4272 4283 N
+ SH NG HH s n/a 31 4251 4272 4282 N
+ SH NG IH b n/a 31 4251 4265 4287 N
+ SH NG IH i n/a 31 4251 4272 4280 N
+ SH NG IH s n/a 31 4251 4272 4280 N
+ SH NG IY b n/a 31 4251 4266 4278 N
+ SH NG IY s n/a 31 4251 4272 4278 N
+ SH NG JH s n/a 31 4251 4272 4283 N
+ SH NG K b n/a 31 4251 4265 4283 N
+ SH NG K s n/a 31 4251 4272 4283 N
+ SH NG L b n/a 31 4251 4265 4283 N
+ SH NG L s n/a 31 4251 4272 4283 N
+ SH NG M b n/a 31 4251 4265 4283 N
+ SH NG M s n/a 31 4251 4272 4283 N
+ SH NG N b n/a 31 4251 4265 4279 N
+ SH NG N s n/a 31 4251 4272 4279 N
+ SH NG NG s n/a 31 4251 4272 4283 N
+ SH NG OW b n/a 31 4251 4265 4288 N
+ SH NG OW i n/a 31 4251 4272 4290 N
+ SH NG OW s n/a 31 4251 4272 4288 N
+ SH NG OY b n/a 31 4251 4265 4290 N
+ SH NG OY s n/a 31 4251 4272 4290 N
+ SH NG P s n/a 31 4251 4272 4283 N
+ SH NG R b n/a 31 4251 4265 4283 N
+ SH NG R s n/a 31 4251 4272 4283 N
+ SH NG S s n/a 31 4251 4272 4284 N
+ SH NG SH s n/a 31 4251 4272 4282 N
+ SH NG SIL s n/a 31 4251 4272 4282 N
+ SH NG T b n/a 31 4251 4265 4284 N
+ SH NG T i n/a 31 4251 4272 4284 N
+ SH NG T s n/a 31 4251 4272 4284 N
+ SH NG TH s n/a 31 4251 4272 4284 N
+ SH NG UH b n/a 31 4251 4265 4285 N
+ SH NG UH s n/a 31 4251 4272 4280 N
+ SH NG UW b n/a 31 4251 4265 4286 N
+ SH NG UW s n/a 31 4251 4272 4286 N
+ SH NG V b n/a 31 4251 4265 4283 N
+ SH NG V s n/a 31 4251 4272 4283 N
+ SH NG W b n/a 31 4251 4265 4283 N
+ SH NG W s n/a 31 4251 4272 4283 N
+ SH NG Y b n/a 31 4251 4266 4278 N
+ SH NG Y i n/a 31 4251 4272 4278 N
+ SH NG Y s n/a 31 4251 4272 4278 N
+ SH NG Z s n/a 31 4251 4272 4284 N
+ SH NG ZH s n/a 31 4251 4272 4283 N
+ SH OW AA b n/a 31 4261 4267 4288 N
+ SH OW AA e n/a 31 4261 4275 4288 N
+ SH OW AA i n/a 31 4261 4275 4288 N
+ SH OW AA s n/a 31 4261 4275 4288 N
+ SH OW AE b n/a 31 4261 4267 4289 N
+ SH OW AE e n/a 31 4261 4275 4289 N
+ SH OW AE i n/a 31 4261 4275 4289 N
+ SH OW AE s n/a 31 4261 4275 4289 N
+ SH OW AH b n/a 31 4261 4267 4288 N
+ SH OW AH e n/a 31 4261 4275 4279 N
+ SH OW AH i n/a 31 4261 4275 4279 N
+ SH OW AH s n/a 31 4261 4275 4279 N
+ SH OW AO b n/a 31 4261 4267 4290 N
+ SH OW AO e n/a 31 4261 4275 4290 N
+ SH OW AO s n/a 31 4261 4275 4290 N
+ SH OW AW b n/a 31 4261 4267 4289 N
+ SH OW AW e n/a 31 4261 4275 4289 N
+ SH OW AW s n/a 31 4261 4275 4289 N
+ SH OW AY b n/a 31 4261 4266 4288 N
+ SH OW AY e n/a 31 4261 4275 4288 N
+ SH OW AY s n/a 31 4261 4275 4288 N
+ SH OW B b n/a 31 4261 4267 4283 N
+ SH OW B e n/a 31 4261 4275 4283 N
+ SH OW B i n/a 31 4261 4275 4283 N
+ SH OW B s n/a 31 4261 4275 4283 N
+ SH OW CH b n/a 31 4261 4267 4282 N
+ SH OW CH e n/a 31 4261 4274 4282 N
+ SH OW CH s n/a 31 4261 4274 4282 N
+ SH OW D e n/a 31 4261 4275 4284 N
+ SH OW D s n/a 31 4261 4275 4284 N
+ SH OW DH e n/a 31 4261 4275 4284 N
+ SH OW DH s n/a 31 4261 4275 4284 N
+ SH OW EH b n/a 31 4261 4267 4287 N
+ SH OW EH e n/a 31 4261 4275 4279 N
+ SH OW EH i n/a 31 4261 4275 4279 N
+ SH OW EH s n/a 31 4261 4275 4279 N
+ SH OW ER b n/a 31 4261 4267 4285 N
+ SH OW ER e n/a 31 4261 4275 4285 N
+ SH OW ER i n/a 31 4261 4275 4285 N
+ SH OW ER s n/a 31 4261 4275 4285 N
+ SH OW EY b n/a 31 4261 4266 4287 N
+ SH OW EY e n/a 31 4261 4275 4287 N
+ SH OW EY i n/a 31 4261 4275 4287 N
+ SH OW EY s n/a 31 4261 4275 4287 N
+ SH OW F e n/a 31 4261 4275 4283 N
+ SH OW F s n/a 31 4261 4275 4283 N
+ SH OW G e n/a 31 4261 4275 4283 N
+ SH OW G s n/a 31 4261 4275 4283 N
+ SH OW HH e n/a 31 4261 4275 4282 N
+ SH OW HH s n/a 31 4261 4275 4282 N
+ SH OW IH b n/a 31 4261 4267 4287 N
+ SH OW IH e n/a 31 4261 4275 4280 N
+ SH OW IH i n/a 31 4261 4275 4280 N
+ SH OW IH s n/a 31 4261 4275 4280 N
+ SH OW IY b n/a 31 4261 4266 4278 N
+ SH OW IY e n/a 31 4261 4275 4278 N
+ SH OW IY i n/a 31 4261 4275 4278 N
+ SH OW IY s n/a 31 4261 4275 4278 N
+ SH OW JH e n/a 31 4261 4274 4283 N
+ SH OW JH s n/a 31 4261 4274 4283 N
+ SH OW K b n/a 31 4261 4267 4283 N
+ SH OW K e n/a 31 4261 4275 4283 N
+ SH OW K i n/a 31 4261 4275 4283 N
+ SH OW K s n/a 31 4261 4275 4283 N
+ SH OW L b n/a 31 4261 4267 4283 N
+ SH OW L e n/a 31 4261 4275 4283 N
+ SH OW L s n/a 31 4261 4275 4283 N
+ SH OW M b n/a 31 4261 4267 4283 N
+ SH OW M e n/a 31 4261 4275 4283 N
+ SH OW M i n/a 31 4261 4275 4283 N
+ SH OW M s n/a 31 4261 4275 4283 N
+ SH OW N b n/a 31 4261 4267 4279 N
+ SH OW N e n/a 31 4261 4275 4279 N
+ SH OW N i n/a 31 4261 4275 4279 N
+ SH OW N s n/a 31 4261 4275 4279 N
+ SH OW NG e n/a 31 4261 4275 4283 N
+ SH OW NG s n/a 31 4261 4275 4283 N
+ SH OW OW b n/a 31 4261 4267 4288 N
+ SH OW OW e n/a 31 4261 4275 4288 N
+ SH OW OW i n/a 31 4261 4275 4290 N
+ SH OW OW s n/a 31 4261 4275 4288 N
+ SH OW OY b n/a 31 4261 4266 4290 N
+ SH OW OY e n/a 31 4261 4275 4290 N
+ SH OW OY s n/a 31 4261 4275 4290 N
+ SH OW P e n/a 31 4261 4275 4283 N
+ SH OW P s n/a 31 4261 4275 4283 N
+ SH OW R b n/a 31 4261 4267 4283 N
+ SH OW R e n/a 31 4261 4275 4283 N
+ SH OW R s n/a 31 4261 4275 4283 N
+ SH OW S e n/a 31 4261 4275 4284 N
+ SH OW S s n/a 31 4261 4275 4284 N
+ SH OW SH e n/a 31 4261 4274 4282 N
+ SH OW SH s n/a 31 4261 4274 4282 N
+ SH OW SIL e n/a 31 4261 4274 4282 N
+ SH OW SIL s n/a 31 4261 4274 4282 N
+ SH OW T b n/a 31 4261 4267 4284 N
+ SH OW T e n/a 31 4261 4275 4284 N
+ SH OW T i n/a 31 4261 4275 4284 N
+ SH OW T s n/a 31 4261 4275 4284 N
+ SH OW TH e n/a 31 4261 4275 4284 N
+ SH OW TH s n/a 31 4261 4275 4284 N
+ SH OW UH b n/a 31 4261 4267 4285 N
+ SH OW UH e n/a 31 4261 4275 4280 N
+ SH OW UH i n/a 31 4261 4275 4280 N
+ SH OW UH s n/a 31 4261 4275 4280 N
+ SH OW UW b n/a 31 4261 4267 4286 N
+ SH OW UW e n/a 31 4261 4275 4286 N
+ SH OW UW i n/a 31 4261 4275 4286 N
+ SH OW UW s n/a 31 4261 4275 4286 N
+ SH OW V b n/a 31 4261 4267 4283 N
+ SH OW V e n/a 31 4261 4275 4283 N
+ SH OW V s n/a 31 4261 4275 4283 N
+ SH OW W b n/a 31 4261 4267 4283 N
+ SH OW W e n/a 31 4261 4275 4283 N
+ SH OW W s n/a 31 4261 4275 4283 N
+ SH OW Y b n/a 31 4261 4266 4278 N
+ SH OW Y e n/a 31 4261 4274 4278 N
+ SH OW Y i n/a 31 4261 4274 4278 N
+ SH OW Y s n/a 31 4261 4274 4278 N
+ SH OW Z e n/a 31 4261 4275 4284 N
+ SH OW Z s n/a 31 4261 4275 4284 N
+ SH OW ZH e n/a 31 4261 4274 4283 N
+ SH OW ZH s n/a 31 4261 4274 4283 N
+ SH OY AA b n/a 31 4255 4267 4288 N
+ SH OY AA e n/a 31 4255 4275 4288 N
+ SH OY AA s n/a 31 4255 4275 4288 N
+ SH OY AE b n/a 31 4255 4267 4289 N
+ SH OY AE e n/a 31 4255 4275 4289 N
+ SH OY AE s n/a 31 4255 4275 4289 N
+ SH OY AH b n/a 31 4254 4267 4289 N
+ SH OY AH e n/a 31 4254 4275 4281 N
+ SH OY AH i n/a 31 4254 4275 4281 N
+ SH OY AH s n/a 31 4254 4275 4281 N
+ SH OY AO b n/a 31 4255 4267 4290 N
+ SH OY AO e n/a 31 4255 4275 4290 N
+ SH OY AO s n/a 31 4255 4275 4290 N
+ SH OY AW b n/a 31 4255 4267 4289 N
+ SH OY AW e n/a 31 4255 4275 4289 N
+ SH OY AW s n/a 31 4255 4275 4289 N
+ SH OY AY b n/a 31 4255 4266 4288 N
+ SH OY AY e n/a 31 4255 4275 4288 N
+ SH OY AY s n/a 31 4255 4275 4288 N
+ SH OY B b n/a 31 4255 4267 4283 N
+ SH OY B e n/a 31 4255 4275 4283 N
+ SH OY B s n/a 31 4255 4275 4283 N
+ SH OY CH b n/a 31 4255 4267 4282 N
+ SH OY CH e n/a 31 4255 4274 4282 N
+ SH OY CH s n/a 31 4255 4274 4282 N
+ SH OY D e n/a 31 4255 4275 4284 N
+ SH OY D s n/a 31 4255 4275 4284 N
+ SH OY DH e n/a 31 4255 4275 4284 N
+ SH OY DH s n/a 31 4255 4275 4284 N
+ SH OY EH b n/a 31 4255 4267 4287 N
+ SH OY EH e n/a 31 4255 4275 4281 N
+ SH OY EH s n/a 31 4255 4275 4281 N
+ SH OY ER b n/a 31 4254 4267 4285 N
+ SH OY ER e n/a 31 4254 4275 4285 N
+ SH OY ER i n/a 31 4254 4275 4285 N
+ SH OY ER s n/a 31 4254 4275 4285 N
+ SH OY EY b n/a 31 4255 4266 4287 N
+ SH OY EY e n/a 31 4255 4275 4287 N
+ SH OY EY s n/a 31 4255 4275 4287 N
+ SH OY F e n/a 31 4255 4275 4283 N
+ SH OY F s n/a 31 4255 4275 4283 N
+ SH OY G e n/a 31 4255 4275 4283 N
+ SH OY G s n/a 31 4255 4275 4283 N
+ SH OY HH e n/a 31 4255 4275 4282 N
+ SH OY HH s n/a 31 4255 4275 4282 N
+ SH OY IH b n/a 31 4255 4267 4287 N
+ SH OY IH e n/a 31 4255 4275 4281 N
+ SH OY IH i n/a 31 4255 4275 4281 N
+ SH OY IH s n/a 31 4255 4275 4281 N
+ SH OY IY b n/a 31 4255 4266 4278 N
+ SH OY IY e n/a 31 4255 4275 4278 N
+ SH OY IY s n/a 31 4255 4275 4278 N
+ SH OY JH e n/a 31 4255 4274 4283 N
+ SH OY JH s n/a 31 4255 4274 4283 N
+ SH OY K b n/a 31 4255 4267 4283 N
+ SH OY K e n/a 31 4255 4275 4283 N
+ SH OY K s n/a 31 4255 4275 4283 N
+ SH OY L b n/a 31 4255 4267 4283 N
+ SH OY L e n/a 31 4255 4275 4283 N
+ SH OY L s n/a 31 4255 4275 4283 N
+ SH OY M b n/a 31 4255 4267 4283 N
+ SH OY M e n/a 31 4255 4275 4283 N
+ SH OY M s n/a 31 4255 4275 4283 N
+ SH OY N b n/a 31 4255 4267 4281 N
+ SH OY N e n/a 31 4255 4275 4281 N
+ SH OY N i n/a 31 4255 4275 4281 N
+ SH OY N s n/a 31 4255 4275 4281 N
+ SH OY NG e n/a 31 4255 4275 4283 N
+ SH OY NG s n/a 31 4255 4275 4283 N
+ SH OY OW b n/a 31 4255 4267 4288 N
+ SH OY OW e n/a 31 4255 4275 4288 N
+ SH OY OW s n/a 31 4255 4275 4288 N
+ SH OY OY b n/a 31 4255 4266 4290 N
+ SH OY OY e n/a 31 4255 4275 4290 N
+ SH OY OY s n/a 31 4255 4275 4290 N
+ SH OY P e n/a 31 4255 4275 4283 N
+ SH OY P s n/a 31 4255 4275 4283 N
+ SH OY R b n/a 31 4255 4267 4283 N
+ SH OY R e n/a 31 4255 4275 4283 N
+ SH OY R s n/a 31 4255 4275 4283 N
+ SH OY S e n/a 31 4255 4275 4284 N
+ SH OY S s n/a 31 4255 4275 4284 N
+ SH OY SH e n/a 31 4255 4274 4282 N
+ SH OY SH s n/a 31 4255 4274 4282 N
+ SH OY SIL e n/a 31 4255 4274 4282 N
+ SH OY SIL s n/a 31 4255 4274 4282 N
+ SH OY T b n/a 31 4255 4267 4284 N
+ SH OY T e n/a 31 4255 4275 4284 N
+ SH OY T s n/a 31 4255 4275 4284 N
+ SH OY TH e n/a 31 4255 4275 4284 N
+ SH OY TH s n/a 31 4255 4275 4284 N
+ SH OY UH b n/a 31 4255 4267 4285 N
+ SH OY UH e n/a 31 4255 4275 4281 N
+ SH OY UH s n/a 31 4255 4275 4281 N
+ SH OY UW b n/a 31 4255 4267 4286 N
+ SH OY UW e n/a 31 4255 4275 4286 N
+ SH OY UW s n/a 31 4255 4275 4286 N
+ SH OY V b n/a 31 4255 4267 4283 N
+ SH OY V e n/a 31 4255 4275 4283 N
+ SH OY V s n/a 31 4255 4275 4283 N
+ SH OY W b n/a 31 4255 4267 4283 N
+ SH OY W e n/a 31 4255 4275 4283 N
+ SH OY W s n/a 31 4255 4275 4283 N
+ SH OY Y b n/a 31 4255 4266 4278 N
+ SH OY Y e n/a 31 4255 4274 4278 N
+ SH OY Y s n/a 31 4255 4274 4278 N
+ SH OY Z e n/a 31 4255 4275 4284 N
+ SH OY Z s n/a 31 4255 4275 4284 N
+ SH OY ZH e n/a 31 4255 4274 4283 N
+ SH OY ZH s n/a 31 4255 4274 4283 N
+ SH P AA b n/a 31 4248 4265 4288 N
+ SH P AA i n/a 31 4248 4272 4288 N
+ SH P AA s n/a 31 4248 4272 4288 N
+ SH P AE b n/a 31 4248 4265 4289 N
+ SH P AE s n/a 31 4248 4272 4289 N
+ SH P AH b n/a 31 4248 4265 4288 N
+ SH P AH i n/a 31 4248 4272 4279 N
+ SH P AH s n/a 31 4248 4272 4279 N
+ SH P AO b n/a 31 4248 4265 4290 N
+ SH P AO i n/a 31 4248 4272 4290 N
+ SH P AO s n/a 31 4248 4272 4290 N
+ SH P AW b n/a 31 4248 4265 4289 N
+ SH P AW s n/a 31 4248 4272 4289 N
+ SH P AY b n/a 31 4248 4265 4288 N
+ SH P AY i n/a 31 4248 4272 4288 N
+ SH P AY s n/a 31 4248 4272 4288 N
+ SH P B b n/a 31 4248 4265 4283 N
+ SH P B s n/a 31 4248 4272 4283 N
+ SH P CH b n/a 31 4248 4265 4282 N
+ SH P CH s n/a 31 4248 4272 4282 N
+ SH P D s n/a 31 4248 4272 4284 N
+ SH P DH s n/a 31 4248 4272 4284 N
+ SH P EH b n/a 31 4248 4265 4287 N
+ SH P EH s n/a 31 4248 4272 4279 N
+ SH P ER b n/a 31 4248 4265 4285 N
+ SH P ER i n/a 31 4248 4272 4285 N
+ SH P ER s n/a 31 4248 4272 4285 N
+ SH P EY b n/a 31 4248 4266 4287 N
+ SH P EY i n/a 31 4248 4272 4287 N
+ SH P EY s n/a 31 4248 4272 4287 N
+ SH P F s n/a 31 4248 4272 4283 N
+ SH P G s n/a 31 4248 4272 4283 N
+ SH P HH s n/a 31 4248 4272 4282 N
+ SH P IH b n/a 31 4248 4265 4287 N
+ SH P IH i n/a 31 4248 4272 4280 N
+ SH P IH s n/a 31 4248 4272 4280 N
+ SH P IY b n/a 31 4248 4266 4278 N
+ SH P IY i n/a 31 4248 4272 4278 N
+ SH P IY s n/a 31 4248 4272 4278 N
+ SH P JH s n/a 31 4248 4272 4283 N
+ SH P K b n/a 31 4248 4265 4283 N
+ SH P K s n/a 31 4248 4272 4283 N
+ SH P L b n/a 31 4248 4265 4283 N
+ SH P L s n/a 31 4248 4272 4283 N
+ SH P M b n/a 31 4248 4265 4283 N
+ SH P M s n/a 31 4248 4272 4283 N
+ SH P N b n/a 31 4248 4265 4279 N
+ SH P N i n/a 31 4248 4272 4279 N
+ SH P N s n/a 31 4248 4272 4279 N
+ SH P NG s n/a 31 4248 4272 4283 N
+ SH P OW b n/a 31 4248 4265 4288 N
+ SH P OW s n/a 31 4248 4272 4288 N
+ SH P OY b n/a 31 4248 4265 4290 N
+ SH P OY s n/a 31 4248 4272 4290 N
+ SH P P s n/a 31 4248 4272 4283 N
+ SH P R b n/a 31 4248 4265 4283 N
+ SH P R s n/a 31 4248 4272 4283 N
+ SH P S s n/a 31 4248 4272 4284 N
+ SH P SH s n/a 31 4248 4272 4282 N
+ SH P SIL s n/a 31 4248 4272 4282 N
+ SH P T b n/a 31 4248 4265 4284 N
+ SH P T s n/a 31 4248 4272 4284 N
+ SH P TH s n/a 31 4248 4272 4284 N
+ SH P UH b n/a 31 4248 4265 4285 N
+ SH P UH i n/a 31 4248 4272 4280 N
+ SH P UH s n/a 31 4248 4272 4280 N
+ SH P UW b n/a 31 4248 4265 4286 N
+ SH P UW i n/a 31 4248 4272 4286 N
+ SH P UW s n/a 31 4248 4272 4286 N
+ SH P V b n/a 31 4248 4265 4283 N
+ SH P V s n/a 31 4248 4272 4283 N
+ SH P W b n/a 31 4248 4265 4283 N
+ SH P W s n/a 31 4248 4272 4283 N
+ SH P Y b n/a 31 4248 4266 4278 N
+ SH P Y s n/a 31 4248 4272 4278 N
+ SH P Z s n/a 31 4248 4272 4284 N
+ SH P ZH s n/a 31 4248 4272 4283 N
+ SH R AA b n/a 31 4263 4265 4288 N
+ SH R AA e n/a 31 4263 4271 4288 N
+ SH R AA i n/a 31 4263 4271 4288 N
+ SH R AA s n/a 31 4263 4271 4288 N
+ SH R AE b n/a 31 4263 4266 4289 N
+ SH R AE e n/a 31 4263 4271 4289 N
+ SH R AE i n/a 31 4263 4271 4289 N
+ SH R AE s n/a 31 4263 4271 4289 N
+ SH R AH b n/a 31 4263 4266 4288 N
+ SH R AH e n/a 31 4263 4271 4279 N
+ SH R AH i n/a 31 4263 4271 4279 N
+ SH R AH s n/a 31 4263 4271 4279 N
+ SH R AO b n/a 31 4263 4265 4290 N
+ SH R AO e n/a 31 4263 4271 4290 N
+ SH R AO i n/a 31 4263 4271 4290 N
+ SH R AO s n/a 31 4263 4271 4290 N
+ SH R AW b n/a 31 4263 4266 4289 N
+ SH R AW e n/a 31 4263 4271 4289 N
+ SH R AW i n/a 31 4263 4271 4289 N
+ SH R AW s n/a 31 4263 4271 4289 N
+ SH R AY b n/a 31 4263 4265 4288 N
+ SH R AY e n/a 31 4263 4271 4288 N
+ SH R AY i n/a 31 4263 4271 4288 N
+ SH R AY s n/a 31 4263 4271 4288 N
+ SH R B b n/a 31 4263 4266 4283 N
+ SH R B e n/a 31 4263 4271 4283 N
+ SH R B i n/a 31 4263 4271 4283 N
+ SH R B s n/a 31 4263 4271 4283 N
+ SH R CH b n/a 31 4263 4266 4282 N
+ SH R CH e n/a 31 4263 4271 4282 N
+ SH R CH i n/a 31 4263 4271 4282 N
+ SH R CH s n/a 31 4263 4271 4282 N
+ SH R D e n/a 31 4263 4271 4284 N
+ SH R D s n/a 31 4263 4271 4284 N
+ SH R DH e n/a 31 4263 4271 4284 N
+ SH R DH s n/a 31 4263 4271 4284 N
+ SH R EH b n/a 31 4263 4266 4287 N
+ SH R EH e n/a 31 4263 4271 4279 N
+ SH R EH i n/a 31 4263 4271 4279 N
+ SH R EH s n/a 31 4263 4271 4279 N
+ SH R ER b n/a 31 4263 4265 4285 N
+ SH R ER e n/a 31 4263 4271 4285 N
+ SH R ER i n/a 31 4263 4271 4285 N
+ SH R ER s n/a 31 4263 4271 4285 N
+ SH R EY b n/a 31 4263 4266 4287 N
+ SH R EY e n/a 31 4263 4271 4287 N
+ SH R EY i n/a 31 4263 4271 4287 N
+ SH R EY s n/a 31 4263 4271 4287 N
+ SH R F e n/a 31 4263 4271 4283 N
+ SH R F i n/a 31 4263 4271 4283 N
+ SH R F s n/a 31 4263 4271 4283 N
+ SH R G e n/a 31 4263 4271 4283 N
+ SH R G s n/a 31 4263 4271 4283 N
+ SH R HH e n/a 31 4263 4271 4282 N
+ SH R HH s n/a 31 4263 4271 4282 N
+ SH R IH b n/a 31 4263 4266 4287 N
+ SH R IH e n/a 31 4263 4271 4280 N
+ SH R IH i n/a 31 4263 4271 4280 N
+ SH R IH s n/a 31 4263 4271 4280 N
+ SH R IY b n/a 31 4263 4266 4278 N
+ SH R IY e n/a 31 4263 4271 4278 N
+ SH R IY i n/a 31 4263 4271 4278 N
+ SH R IY s n/a 31 4263 4271 4278 N
+ SH R JH e n/a 31 4263 4271 4283 N
+ SH R JH s n/a 31 4263 4271 4283 N
+ SH R K b n/a 31 4263 4266 4283 N
+ SH R K e n/a 31 4263 4271 4283 N
+ SH R K i n/a 31 4263 4271 4283 N
+ SH R K s n/a 31 4263 4271 4283 N
+ SH R L b n/a 31 4263 4265 4283 N
+ SH R L e n/a 31 4263 4271 4283 N
+ SH R L i n/a 31 4263 4271 4283 N
+ SH R L s n/a 31 4263 4271 4283 N
+ SH R M b n/a 31 4263 4266 4283 N
+ SH R M e n/a 31 4263 4271 4283 N
+ SH R M i n/a 31 4263 4271 4283 N
+ SH R M s n/a 31 4263 4271 4283 N
+ SH R N b n/a 31 4263 4266 4279 N
+ SH R N e n/a 31 4263 4271 4279 N
+ SH R N i n/a 31 4263 4271 4279 N
+ SH R N s n/a 31 4263 4271 4279 N
+ SH R NG e n/a 31 4263 4271 4283 N
+ SH R NG s n/a 31 4263 4271 4283 N
+ SH R OW b n/a 31 4263 4265 4288 N
+ SH R OW e n/a 31 4263 4271 4288 N
+ SH R OW s n/a 31 4263 4271 4288 N
+ SH R OY b n/a 31 4263 4265 4290 N
+ SH R OY e n/a 31 4263 4271 4290 N
+ SH R OY s n/a 31 4263 4271 4290 N
+ SH R P e n/a 31 4263 4271 4283 N
+ SH R P i n/a 31 4263 4271 4283 N
+ SH R P s n/a 31 4263 4271 4283 N
+ SH R R b n/a 31 4263 4265 4283 N
+ SH R R e n/a 31 4263 4271 4283 N
+ SH R R s n/a 31 4263 4271 4283 N
+ SH R S e n/a 31 4263 4271 4284 N
+ SH R S s n/a 31 4263 4271 4284 N
+ SH R SH e n/a 31 4263 4271 4282 N
+ SH R SH s n/a 31 4263 4271 4282 N
+ SH R SIL e n/a 31 4263 4271 4282 N
+ SH R SIL s n/a 31 4263 4271 4282 N
+ SH R T b n/a 31 4263 4266 4284 N
+ SH R T e n/a 31 4263 4271 4284 N
+ SH R T i n/a 31 4263 4271 4284 N
+ SH R T s n/a 31 4263 4271 4284 N
+ SH R TH e n/a 31 4263 4271 4284 N
+ SH R TH s n/a 31 4263 4271 4284 N
+ SH R UH b n/a 31 4263 4265 4285 N
+ SH R UH e n/a 31 4263 4271 4280 N
+ SH R UH s n/a 31 4263 4271 4280 N
+ SH R UW b n/a 31 4263 4265 4286 N
+ SH R UW e n/a 31 4263 4271 4286 N
+ SH R UW i n/a 31 4263 4271 4286 N
+ SH R UW s n/a 31 4263 4271 4286 N
+ SH R V b n/a 31 4263 4266 4283 N
+ SH R V e n/a 31 4263 4271 4283 N
+ SH R V s n/a 31 4263 4271 4283 N
+ SH R W b n/a 31 4263 4265 4283 N
+ SH R W e n/a 31 4263 4271 4283 N
+ SH R W s n/a 31 4263 4271 4283 N
+ SH R Y b n/a 31 4263 4266 4278 N
+ SH R Y e n/a 31 4263 4271 4278 N
+ SH R Y i n/a 31 4263 4271 4278 N
+ SH R Y s n/a 31 4263 4271 4278 N
+ SH R Z e n/a 31 4263 4271 4284 N
+ SH R Z s n/a 31 4263 4271 4284 N
+ SH R ZH e n/a 31 4263 4271 4283 N
+ SH R ZH s n/a 31 4263 4271 4283 N
+ SH S AA b n/a 31 4250 4265 4288 N
+ SH S AA e n/a 31 4250 4272 4288 N
+ SH S AA s n/a 31 4250 4272 4288 N
+ SH S AE b n/a 31 4250 4265 4289 N
+ SH S AE e n/a 31 4250 4272 4289 N
+ SH S AE s n/a 31 4250 4272 4289 N
+ SH S AH b n/a 31 4250 4265 4288 N
+ SH S AH e n/a 31 4250 4272 4279 N
+ SH S AH s n/a 31 4250 4272 4279 N
+ SH S AO b n/a 31 4250 4265 4290 N
+ SH S AO e n/a 31 4250 4272 4290 N
+ SH S AO s n/a 31 4250 4272 4290 N
+ SH S AW b n/a 31 4250 4265 4289 N
+ SH S AW e n/a 31 4250 4272 4289 N
+ SH S AW s n/a 31 4250 4272 4289 N
+ SH S AY b n/a 31 4250 4268 4288 N
+ SH S AY e n/a 31 4250 4272 4288 N
+ SH S AY i n/a 31 4250 4272 4288 N
+ SH S AY s n/a 31 4250 4272 4288 N
+ SH S B b n/a 31 4250 4265 4283 N
+ SH S B e n/a 31 4250 4272 4283 N
+ SH S B s n/a 31 4250 4272 4283 N
+ SH S CH b n/a 31 4250 4265 4282 N
+ SH S CH e n/a 31 4250 4272 4282 N
+ SH S CH s n/a 31 4250 4272 4282 N
+ SH S D e n/a 31 4250 4272 4284 N
+ SH S D s n/a 31 4250 4272 4284 N
+ SH S DH e n/a 31 4250 4272 4284 N
+ SH S DH s n/a 31 4250 4272 4284 N
+ SH S EH b n/a 31 4250 4265 4287 N
+ SH S EH e n/a 31 4250 4272 4279 N
+ SH S EH s n/a 31 4250 4272 4279 N
+ SH S ER b n/a 31 4250 4265 4285 N
+ SH S ER e n/a 31 4250 4272 4285 N
+ SH S ER i n/a 31 4250 4272 4285 N
+ SH S ER s n/a 31 4250 4272 4285 N
+ SH S EY b n/a 31 4250 4268 4287 N
+ SH S EY e n/a 31 4250 4272 4287 N
+ SH S EY i n/a 31 4250 4272 4287 N
+ SH S EY s n/a 31 4250 4272 4287 N
+ SH S F e n/a 31 4250 4272 4283 N
+ SH S F s n/a 31 4250 4272 4283 N
+ SH S G e n/a 31 4250 4272 4283 N
+ SH S G s n/a 31 4250 4272 4283 N
+ SH S HH e n/a 31 4250 4272 4282 N
+ SH S HH s n/a 31 4250 4272 4282 N
+ SH S IH b n/a 31 4250 4265 4287 N
+ SH S IH e n/a 31 4250 4272 4280 N
+ SH S IH i n/a 31 4250 4272 4280 N
+ SH S IH s n/a 31 4250 4272 4280 N
+ SH S IY b n/a 31 4250 4268 4278 N
+ SH S IY e n/a 31 4250 4272 4278 N
+ SH S IY s n/a 31 4250 4272 4278 N
+ SH S JH e n/a 31 4250 4272 4283 N
+ SH S JH s n/a 31 4250 4272 4283 N
+ SH S K b n/a 31 4250 4265 4283 N
+ SH S K e n/a 31 4250 4272 4283 N
+ SH S K s n/a 31 4250 4272 4283 N
+ SH S L b n/a 31 4250 4265 4283 N
+ SH S L e n/a 31 4250 4272 4283 N
+ SH S L s n/a 31 4250 4272 4283 N
+ SH S M b n/a 31 4250 4265 4283 N
+ SH S M e n/a 31 4250 4272 4283 N
+ SH S M s n/a 31 4250 4272 4283 N
+ SH S N b n/a 31 4250 4265 4279 N
+ SH S N e n/a 31 4250 4272 4279 N
+ SH S N s n/a 31 4250 4272 4279 N
+ SH S NG e n/a 31 4250 4272 4283 N
+ SH S NG s n/a 31 4250 4272 4283 N
+ SH S OW b n/a 31 4250 4265 4288 N
+ SH S OW e n/a 31 4250 4272 4288 N
+ SH S OW s n/a 31 4250 4272 4288 N
+ SH S OY b n/a 31 4250 4268 4290 N
+ SH S OY e n/a 31 4250 4272 4290 N
+ SH S OY s n/a 31 4250 4272 4290 N
+ SH S P e n/a 31 4250 4272 4283 N
+ SH S P s n/a 31 4250 4272 4283 N
+ SH S R b n/a 31 4250 4265 4283 N
+ SH S R e n/a 31 4250 4272 4283 N
+ SH S R s n/a 31 4250 4272 4283 N
+ SH S S e n/a 31 4250 4272 4284 N
+ SH S S s n/a 31 4250 4272 4284 N
+ SH S SH e n/a 31 4250 4272 4282 N
+ SH S SH s n/a 31 4250 4272 4282 N
+ SH S SIL e n/a 31 4250 4272 4282 N
+ SH S SIL s n/a 31 4250 4272 4282 N
+ SH S T b n/a 31 4250 4265 4284 N
+ SH S T e n/a 31 4250 4272 4284 N
+ SH S T s n/a 31 4250 4272 4284 N
+ SH S TH e n/a 31 4250 4272 4284 N
+ SH S TH s n/a 31 4250 4272 4284 N
+ SH S UH b n/a 31 4250 4265 4285 N
+ SH S UH e n/a 31 4250 4272 4280 N
+ SH S UH s n/a 31 4250 4272 4280 N
+ SH S UW b n/a 31 4250 4265 4286 N
+ SH S UW e n/a 31 4250 4272 4286 N
+ SH S UW i n/a 31 4250 4272 4286 N
+ SH S UW s n/a 31 4250 4272 4286 N
+ SH S V b n/a 31 4250 4265 4283 N
+ SH S V e n/a 31 4250 4272 4283 N
+ SH S V s n/a 31 4250 4272 4283 N
+ SH S W b n/a 31 4250 4265 4283 N
+ SH S W e n/a 31 4250 4272 4283 N
+ SH S W s n/a 31 4250 4272 4283 N
+ SH S Y b n/a 31 4250 4268 4278 N
+ SH S Y e n/a 31 4250 4272 4278 N
+ SH S Y s n/a 31 4250 4272 4278 N
+ SH S Z e n/a 31 4250 4272 4284 N
+ SH S Z s n/a 31 4250 4272 4284 N
+ SH S ZH e n/a 31 4250 4272 4283 N
+ SH S ZH s n/a 31 4250 4272 4283 N
+ SH SH AA b n/a 31 4250 4265 4288 N
+ SH SH AA s n/a 31 4250 4272 4288 N
+ SH SH AE b n/a 31 4250 4265 4289 N
+ SH SH AE s n/a 31 4250 4272 4289 N
+ SH SH AH b n/a 31 4250 4265 4288 N
+ SH SH AH s n/a 31 4250 4272 4279 N
+ SH SH AO b n/a 31 4250 4265 4290 N
+ SH SH AO s n/a 31 4250 4272 4290 N
+ SH SH AW b n/a 31 4250 4265 4289 N
+ SH SH AW s n/a 31 4250 4272 4289 N
+ SH SH AY b n/a 31 4250 4265 4288 N
+ SH SH AY s n/a 31 4250 4272 4288 N
+ SH SH B b n/a 31 4250 4265 4283 N
+ SH SH B s n/a 31 4250 4272 4283 N
+ SH SH CH b n/a 31 4250 4265 4282 N
+ SH SH CH s n/a 31 4250 4272 4282 N
+ SH SH D s n/a 31 4250 4272 4284 N
+ SH SH DH s n/a 31 4250 4272 4284 N
+ SH SH EH b n/a 31 4250 4265 4287 N
+ SH SH EH s n/a 31 4250 4272 4279 N
+ SH SH ER b n/a 31 4250 4265 4285 N
+ SH SH ER s n/a 31 4250 4272 4285 N
+ SH SH EY b n/a 31 4250 4266 4287 N
+ SH SH EY s n/a 31 4250 4272 4287 N
+ SH SH F s n/a 31 4250 4272 4283 N
+ SH SH G s n/a 31 4250 4272 4283 N
+ SH SH HH s n/a 31 4250 4272 4282 N
+ SH SH IH b n/a 31 4250 4265 4287 N
+ SH SH IH s n/a 31 4250 4272 4280 N
+ SH SH IY b n/a 31 4250 4266 4278 N
+ SH SH IY i n/a 31 4250 4272 4278 N
+ SH SH IY s n/a 31 4250 4272 4278 N
+ SH SH JH s n/a 31 4250 4272 4283 N
+ SH SH K b n/a 31 4250 4265 4283 N
+ SH SH K s n/a 31 4250 4272 4283 N
+ SH SH L b n/a 31 4250 4265 4283 N
+ SH SH L s n/a 31 4250 4272 4283 N
+ SH SH M b n/a 31 4250 4265 4283 N
+ SH SH M s n/a 31 4250 4272 4283 N
+ SH SH N b n/a 31 4250 4265 4279 N
+ SH SH N s n/a 31 4250 4272 4279 N
+ SH SH NG s n/a 31 4250 4272 4283 N
+ SH SH OW b n/a 31 4250 4265 4288 N
+ SH SH OW s n/a 31 4250 4272 4288 N
+ SH SH OY b n/a 31 4250 4265 4290 N
+ SH SH OY s n/a 31 4250 4272 4290 N
+ SH SH P s n/a 31 4250 4272 4283 N
+ SH SH R b n/a 31 4250 4265 4283 N
+ SH SH R s n/a 31 4250 4272 4283 N
+ SH SH S s n/a 31 4250 4272 4284 N
+ SH SH SH s n/a 31 4250 4272 4282 N
+ SH SH SIL s n/a 31 4250 4272 4282 N
+ SH SH T b n/a 31 4250 4265 4284 N
+ SH SH T s n/a 31 4250 4272 4284 N
+ SH SH TH s n/a 31 4250 4272 4284 N
+ SH SH UH b n/a 31 4250 4265 4285 N
+ SH SH UH s n/a 31 4250 4272 4280 N
+ SH SH UW b n/a 31 4250 4265 4286 N
+ SH SH UW s n/a 31 4250 4272 4286 N
+ SH SH V b n/a 31 4250 4265 4283 N
+ SH SH V s n/a 31 4250 4272 4283 N
+ SH SH W b n/a 31 4250 4265 4283 N
+ SH SH W s n/a 31 4250 4272 4283 N
+ SH SH Y b n/a 31 4250 4266 4278 N
+ SH SH Y s n/a 31 4250 4272 4278 N
+ SH SH Z s n/a 31 4250 4272 4284 N
+ SH SH ZH s n/a 31 4250 4272 4283 N
+ SH SIL AA b n/a 31 4253 4265 4288 N
+ SH SIL AA s n/a 31 4253 4272 4288 N
+ SH SIL AE b n/a 31 4253 4265 4289 N
+ SH SIL AE s n/a 31 4253 4272 4289 N
+ SH SIL AH b n/a 31 4253 4265 4288 N
+ SH SIL AH s n/a 31 4253 4272 4279 N
+ SH SIL AO b n/a 31 4253 4265 4290 N
+ SH SIL AO s n/a 31 4253 4272 4290 N
+ SH SIL AW b n/a 31 4253 4265 4289 N
+ SH SIL AW s n/a 31 4253 4272 4289 N
+ SH SIL AY b n/a 31 4253 4269 4288 N
+ SH SIL AY s n/a 31 4253 4272 4288 N
+ SH SIL B b n/a 31 4253 4265 4283 N
+ SH SIL B s n/a 31 4253 4272 4283 N
+ SH SIL CH b n/a 31 4253 4265 4282 N
+ SH SIL CH s n/a 31 4253 4272 4282 N
+ SH SIL D s n/a 31 4253 4272 4284 N
+ SH SIL DH s n/a 31 4253 4272 4284 N
+ SH SIL EH b n/a 31 4253 4265 4287 N
+ SH SIL EH s n/a 31 4253 4272 4279 N
+ SH SIL ER b n/a 31 4253 4265 4285 N
+ SH SIL ER s n/a 31 4253 4272 4285 N
+ SH SIL EY b n/a 31 4253 4269 4287 N
+ SH SIL EY s n/a 31 4253 4272 4287 N
+ SH SIL F s n/a 31 4253 4272 4283 N
+ SH SIL G s n/a 31 4253 4272 4283 N
+ SH SIL HH s n/a 31 4253 4272 4282 N
+ SH SIL IH b n/a 31 4253 4265 4287 N
+ SH SIL IH s n/a 31 4253 4272 4280 N
+ SH SIL IY b n/a 31 4253 4269 4278 N
+ SH SIL IY s n/a 31 4253 4272 4278 N
+ SH SIL JH s n/a 31 4253 4272 4283 N
+ SH SIL K b n/a 31 4253 4265 4283 N
+ SH SIL K s n/a 31 4253 4272 4283 N
+ SH SIL L b n/a 31 4253 4265 4283 N
+ SH SIL L s n/a 31 4253 4272 4283 N
+ SH SIL M b n/a 31 4253 4265 4283 N
+ SH SIL M s n/a 31 4253 4272 4283 N
+ SH SIL N b n/a 31 4253 4265 4279 N
+ SH SIL N s n/a 31 4253 4272 4279 N
+ SH SIL NG s n/a 31 4253 4272 4283 N
+ SH SIL OW b n/a 31 4253 4265 4288 N
+ SH SIL OW s n/a 31 4253 4272 4288 N
+ SH SIL OY b n/a 31 4253 4269 4290 N
+ SH SIL OY s n/a 31 4253 4272 4290 N
+ SH SIL P s n/a 31 4253 4272 4283 N
+ SH SIL R b n/a 31 4253 4265 4283 N
+ SH SIL R s n/a 31 4253 4272 4283 N
+ SH SIL S s n/a 31 4253 4272 4284 N
+ SH SIL SH s n/a 31 4253 4272 4282 N
+ SH SIL SIL s n/a 31 4253 4272 4282 N
+ SH SIL T b n/a 31 4253 4265 4284 N
+ SH SIL T s n/a 31 4253 4272 4284 N
+ SH SIL TH s n/a 31 4253 4272 4284 N
+ SH SIL UH b n/a 31 4253 4265 4285 N
+ SH SIL UH s n/a 31 4253 4272 4280 N
+ SH SIL UW b n/a 31 4253 4265 4286 N
+ SH SIL UW s n/a 31 4253 4272 4286 N
+ SH SIL V b n/a 31 4253 4265 4283 N
+ SH SIL V s n/a 31 4253 4272 4283 N
+ SH SIL W b n/a 31 4253 4265 4283 N
+ SH SIL W s n/a 31 4253 4272 4283 N
+ SH SIL Y b n/a 31 4253 4269 4278 N
+ SH SIL Y s n/a 31 4253 4272 4278 N
+ SH SIL Z s n/a 31 4253 4272 4284 N
+ SH SIL ZH s n/a 31 4253 4272 4283 N
+ SH T AA b n/a 31 4249 4265 4288 N
+ SH T AA e n/a 31 4249 4273 4288 N
+ SH T AA i n/a 31 4249 4273 4288 N
+ SH T AA s n/a 31 4249 4273 4288 N
+ SH T AE b n/a 31 4249 4265 4289 N
+ SH T AE e n/a 31 4249 4273 4289 N
+ SH T AE i n/a 31 4249 4273 4289 N
+ SH T AE s n/a 31 4249 4273 4289 N
+ SH T AH b n/a 31 4249 4265 4288 N
+ SH T AH e n/a 31 4249 4273 4279 N
+ SH T AH i n/a 31 4249 4273 4279 N
+ SH T AH s n/a 31 4249 4273 4279 N
+ SH T AO b n/a 31 4249 4265 4290 N
+ SH T AO e n/a 31 4249 4273 4290 N
+ SH T AO i n/a 31 4249 4273 4290 N
+ SH T AO s n/a 31 4249 4273 4290 N
+ SH T AW b n/a 31 4249 4265 4289 N
+ SH T AW e n/a 31 4249 4273 4289 N
+ SH T AW s n/a 31 4249 4273 4289 N
+ SH T AY b n/a 31 4249 4268 4288 N
+ SH T AY e n/a 31 4249 4273 4288 N
+ SH T AY i n/a 31 4249 4273 4288 N
+ SH T AY s n/a 31 4249 4273 4288 N
+ SH T B b n/a 31 4249 4265 4283 N
+ SH T B e n/a 31 4249 4273 4283 N
+ SH T B s n/a 31 4249 4273 4283 N
+ SH T CH b n/a 31 4249 4265 4282 N
+ SH T CH e n/a 31 4249 4273 4282 N
+ SH T CH s n/a 31 4249 4273 4282 N
+ SH T D e n/a 31 4249 4273 4284 N
+ SH T D s n/a 31 4249 4273 4284 N
+ SH T DH e n/a 31 4249 4273 4284 N
+ SH T DH s n/a 31 4249 4273 4284 N
+ SH T EH b n/a 31 4249 4265 4287 N
+ SH T EH e n/a 31 4249 4273 4279 N
+ SH T EH i n/a 31 4249 4273 4279 N
+ SH T EH s n/a 31 4249 4273 4279 N
+ SH T ER b n/a 31 4249 4265 4285 N
+ SH T ER e n/a 31 4249 4273 4285 N
+ SH T ER i n/a 31 4249 4273 4285 N
+ SH T ER s n/a 31 4249 4273 4285 N
+ SH T EY b n/a 31 4249 4268 4287 N
+ SH T EY e n/a 31 4249 4273 4287 N
+ SH T EY i n/a 31 4249 4273 4287 N
+ SH T EY s n/a 31 4249 4273 4287 N
+ SH T F e n/a 31 4249 4273 4283 N
+ SH T F s n/a 31 4249 4273 4283 N
+ SH T G e n/a 31 4249 4273 4283 N
+ SH T G s n/a 31 4249 4273 4283 N
+ SH T HH e n/a 31 4249 4273 4282 N
+ SH T HH s n/a 31 4249 4273 4282 N
+ SH T IH b n/a 31 4249 4265 4287 N
+ SH T IH e n/a 31 4249 4273 4280 N
+ SH T IH i n/a 31 4249 4273 4280 N
+ SH T IH s n/a 31 4249 4273 4280 N
+ SH T IY b n/a 31 4249 4268 4278 N
+ SH T IY e n/a 31 4249 4273 4278 N
+ SH T IY s n/a 31 4249 4273 4278 N
+ SH T JH e n/a 31 4249 4273 4283 N
+ SH T JH s n/a 31 4249 4273 4283 N
+ SH T K b n/a 31 4249 4265 4283 N
+ SH T K e n/a 31 4249 4273 4283 N
+ SH T K s n/a 31 4249 4273 4283 N
+ SH T L b n/a 31 4249 4265 4283 N
+ SH T L e n/a 31 4249 4273 4283 N
+ SH T L s n/a 31 4249 4273 4283 N
+ SH T M b n/a 31 4249 4265 4283 N
+ SH T M e n/a 31 4249 4273 4283 N
+ SH T M s n/a 31 4249 4273 4283 N
+ SH T N b n/a 31 4249 4265 4279 N
+ SH T N e n/a 31 4249 4273 4279 N
+ SH T N s n/a 31 4249 4273 4279 N
+ SH T NG e n/a 31 4249 4273 4283 N
+ SH T NG s n/a 31 4249 4273 4283 N
+ SH T OW b n/a 31 4249 4265 4288 N
+ SH T OW e n/a 31 4249 4273 4288 N
+ SH T OW i n/a 31 4249 4273 4290 N
+ SH T OW s n/a 31 4249 4273 4288 N
+ SH T OY b n/a 31 4249 4268 4290 N
+ SH T OY e n/a 31 4249 4273 4290 N
+ SH T OY s n/a 31 4249 4273 4290 N
+ SH T P e n/a 31 4249 4273 4283 N
+ SH T P s n/a 31 4249 4273 4283 N
+ SH T R b n/a 31 4249 4265 4283 N
+ SH T R e n/a 31 4249 4273 4283 N
+ SH T R s n/a 31 4249 4273 4283 N
+ SH T S e n/a 31 4249 4273 4284 N
+ SH T S s n/a 31 4249 4273 4284 N
+ SH T SH e n/a 31 4249 4273 4282 N
+ SH T SH s n/a 31 4249 4273 4282 N
+ SH T SIL e n/a 31 4249 4273 4282 N
+ SH T SIL s n/a 31 4249 4273 4282 N
+ SH T T b n/a 31 4249 4265 4284 N
+ SH T T e n/a 31 4249 4273 4284 N
+ SH T T s n/a 31 4249 4273 4284 N
+ SH T TH e n/a 31 4249 4273 4284 N
+ SH T TH s n/a 31 4249 4273 4284 N
+ SH T UH b n/a 31 4249 4265 4285 N
+ SH T UH e n/a 31 4249 4273 4280 N
+ SH T UH i n/a 31 4249 4273 4280 N
+ SH T UH s n/a 31 4249 4273 4280 N
+ SH T UW b n/a 31 4249 4265 4286 N
+ SH T UW e n/a 31 4249 4273 4286 N
+ SH T UW s n/a 31 4249 4273 4286 N
+ SH T V b n/a 31 4249 4265 4283 N
+ SH T V e n/a 31 4249 4273 4283 N
+ SH T V s n/a 31 4249 4273 4283 N
+ SH T W b n/a 31 4249 4265 4283 N
+ SH T W e n/a 31 4249 4273 4283 N
+ SH T W s n/a 31 4249 4273 4283 N
+ SH T Y b n/a 31 4249 4268 4278 N
+ SH T Y e n/a 31 4249 4273 4278 N
+ SH T Y s n/a 31 4249 4273 4278 N
+ SH T Z e n/a 31 4249 4273 4284 N
+ SH T Z s n/a 31 4249 4273 4284 N
+ SH T ZH e n/a 31 4249 4273 4283 N
+ SH T ZH s n/a 31 4249 4273 4283 N
+ SH TH AA b n/a 31 4249 4265 4288 N
+ SH TH AA s n/a 31 4249 4272 4288 N
+ SH TH AE b n/a 31 4249 4265 4289 N
+ SH TH AE s n/a 31 4249 4272 4289 N
+ SH TH AH b n/a 31 4249 4265 4288 N
+ SH TH AH s n/a 31 4249 4272 4279 N
+ SH TH AO b n/a 31 4249 4265 4290 N
+ SH TH AO i n/a 31 4249 4272 4290 N
+ SH TH AO s n/a 31 4249 4272 4290 N
+ SH TH AW b n/a 31 4249 4265 4289 N
+ SH TH AW s n/a 31 4249 4272 4289 N
+ SH TH AY b n/a 31 4249 4265 4288 N
+ SH TH AY i n/a 31 4249 4272 4288 N
+ SH TH AY s n/a 31 4249 4272 4288 N
+ SH TH B b n/a 31 4249 4265 4283 N
+ SH TH B s n/a 31 4249 4272 4283 N
+ SH TH CH b n/a 31 4249 4265 4282 N
+ SH TH CH s n/a 31 4249 4272 4282 N
+ SH TH D s n/a 31 4249 4272 4284 N
+ SH TH DH s n/a 31 4249 4272 4284 N
+ SH TH EH b n/a 31 4249 4265 4287 N
+ SH TH EH s n/a 31 4249 4272 4279 N
+ SH TH ER b n/a 31 4249 4265 4285 N
+ SH TH ER s n/a 31 4249 4272 4285 N
+ SH TH EY b n/a 31 4249 4266 4287 N
+ SH TH EY i n/a 31 4249 4272 4287 N
+ SH TH EY s n/a 31 4249 4272 4287 N
+ SH TH F s n/a 31 4249 4272 4283 N
+ SH TH G s n/a 31 4249 4272 4283 N
+ SH TH HH s n/a 31 4249 4272 4282 N
+ SH TH IH b n/a 31 4249 4265 4287 N
+ SH TH IH s n/a 31 4249 4272 4280 N
+ SH TH IY b n/a 31 4249 4266 4278 N
+ SH TH IY i n/a 31 4249 4272 4278 N
+ SH TH IY s n/a 31 4249 4272 4278 N
+ SH TH JH s n/a 31 4249 4272 4283 N
+ SH TH K b n/a 31 4249 4265 4283 N
+ SH TH K s n/a 31 4249 4272 4283 N
+ SH TH L b n/a 31 4249 4265 4283 N
+ SH TH L s n/a 31 4249 4272 4283 N
+ SH TH M b n/a 31 4249 4265 4283 N
+ SH TH M s n/a 31 4249 4272 4283 N
+ SH TH N b n/a 31 4249 4265 4279 N
+ SH TH N s n/a 31 4249 4272 4279 N
+ SH TH NG s n/a 31 4249 4272 4283 N
+ SH TH OW b n/a 31 4249 4265 4288 N
+ SH TH OW s n/a 31 4249 4272 4288 N
+ SH TH OY b n/a 31 4249 4265 4290 N
+ SH TH OY s n/a 31 4249 4272 4290 N
+ SH TH P s n/a 31 4249 4272 4283 N
+ SH TH R b n/a 31 4249 4265 4283 N
+ SH TH R s n/a 31 4249 4272 4283 N
+ SH TH S s n/a 31 4249 4272 4284 N
+ SH TH SH s n/a 31 4249 4272 4282 N
+ SH TH SIL s n/a 31 4249 4272 4282 N
+ SH TH T b n/a 31 4249 4265 4284 N
+ SH TH T s n/a 31 4249 4272 4284 N
+ SH TH TH s n/a 31 4249 4272 4284 N
+ SH TH UH b n/a 31 4249 4265 4285 N
+ SH TH UH i n/a 31 4249 4272 4280 N
+ SH TH UH s n/a 31 4249 4272 4280 N
+ SH TH UW b n/a 31 4249 4265 4286 N
+ SH TH UW s n/a 31 4249 4272 4286 N
+ SH TH V b n/a 31 4249 4265 4283 N
+ SH TH V s n/a 31 4249 4272 4283 N
+ SH TH W b n/a 31 4249 4265 4283 N
+ SH TH W s n/a 31 4249 4272 4283 N
+ SH TH Y b n/a 31 4249 4266 4278 N
+ SH TH Y s n/a 31 4249 4272 4278 N
+ SH TH Z s n/a 31 4249 4272 4284 N
+ SH TH ZH s n/a 31 4249 4272 4283 N
+ SH UH AA b n/a 31 4263 4265 4288 N
+ SH UH AA e n/a 31 4263 4275 4288 N
+ SH UH AA i n/a 31 4263 4275 4288 N
+ SH UH AA s n/a 31 4263 4275 4288 N
+ SH UH AE b n/a 31 4263 4265 4289 N
+ SH UH AE e n/a 31 4263 4275 4289 N
+ SH UH AE i n/a 31 4263 4275 4289 N
+ SH UH AE s n/a 31 4263 4275 4289 N
+ SH UH AH b n/a 31 4263 4265 4288 N
+ SH UH AH e n/a 31 4263 4275 4281 N
+ SH UH AH i n/a 31 4263 4275 4281 N
+ SH UH AH s n/a 31 4263 4275 4281 N
+ SH UH AO b n/a 31 4263 4265 4290 N
+ SH UH AO e n/a 31 4263 4275 4290 N
+ SH UH AO i n/a 31 4263 4275 4290 N
+ SH UH AO s n/a 31 4263 4275 4290 N
+ SH UH AW b n/a 31 4263 4265 4289 N
+ SH UH AW e n/a 31 4263 4275 4289 N
+ SH UH AW s n/a 31 4263 4275 4289 N
+ SH UH AY b n/a 31 4263 4265 4288 N
+ SH UH AY e n/a 31 4263 4275 4288 N
+ SH UH AY s n/a 31 4263 4275 4288 N
+ SH UH B b n/a 31 4263 4265 4283 N
+ SH UH B e n/a 31 4263 4275 4283 N
+ SH UH B i n/a 31 4263 4275 4283 N
+ SH UH B s n/a 31 4263 4275 4283 N
+ SH UH CH b n/a 31 4263 4265 4282 N
+ SH UH CH e n/a 31 4263 4274 4282 N
+ SH UH CH s n/a 31 4263 4274 4282 N
+ SH UH D e n/a 31 4263 4275 4284 N
+ SH UH D i n/a 31 4263 4275 4284 N
+ SH UH D s n/a 31 4263 4275 4284 N
+ SH UH DH e n/a 31 4263 4275 4284 N
+ SH UH DH s n/a 31 4263 4275 4284 N
+ SH UH EH b n/a 31 4263 4265 4287 N
+ SH UH EH e n/a 31 4263 4275 4281 N
+ SH UH EH s n/a 31 4263 4275 4281 N
+ SH UH ER b n/a 31 4263 4265 4285 N
+ SH UH ER e n/a 31 4263 4275 4285 N
+ SH UH ER i n/a 31 4263 4275 4285 N
+ SH UH ER s n/a 31 4263 4275 4285 N
+ SH UH EY b n/a 31 4263 4266 4287 N
+ SH UH EY e n/a 31 4263 4275 4287 N
+ SH UH EY i n/a 31 4263 4275 4287 N
+ SH UH EY s n/a 31 4263 4275 4287 N
+ SH UH F e n/a 31 4263 4275 4283 N
+ SH UH F i n/a 31 4263 4275 4283 N
+ SH UH F s n/a 31 4263 4275 4283 N
+ SH UH G e n/a 31 4263 4275 4283 N
+ SH UH G s n/a 31 4263 4275 4283 N
+ SH UH HH e n/a 31 4263 4275 4282 N
+ SH UH HH s n/a 31 4263 4275 4282 N
+ SH UH IH b n/a 31 4263 4265 4287 N
+ SH UH IH e n/a 31 4263 4275 4281 N
+ SH UH IH i n/a 31 4263 4275 4281 N
+ SH UH IH s n/a 31 4263 4275 4281 N
+ SH UH IY b n/a 31 4263 4266 4278 N
+ SH UH IY e n/a 31 4263 4275 4278 N
+ SH UH IY i n/a 31 4263 4275 4278 N
+ SH UH IY s n/a 31 4263 4275 4278 N
+ SH UH JH e n/a 31 4263 4274 4283 N
+ SH UH JH s n/a 31 4263 4274 4283 N
+ SH UH K b n/a 31 4263 4265 4283 N
+ SH UH K e n/a 31 4263 4275 4283 N
+ SH UH K i n/a 31 4263 4275 4283 N
+ SH UH K s n/a 31 4263 4275 4283 N
+ SH UH L b n/a 31 4263 4265 4283 N
+ SH UH L e n/a 31 4263 4275 4283 N
+ SH UH L s n/a 31 4263 4275 4283 N
+ SH UH M b n/a 31 4263 4265 4283 N
+ SH UH M e n/a 31 4263 4275 4283 N
+ SH UH M i n/a 31 4263 4275 4283 N
+ SH UH M s n/a 31 4263 4275 4283 N
+ SH UH N b n/a 31 4263 4265 4281 N
+ SH UH N e n/a 31 4263 4275 4281 N
+ SH UH N i n/a 31 4263 4275 4281 N
+ SH UH N s n/a 31 4263 4275 4281 N
+ SH UH NG e n/a 31 4263 4275 4283 N
+ SH UH NG s n/a 31 4263 4275 4283 N
+ SH UH OW b n/a 31 4263 4265 4288 N
+ SH UH OW e n/a 31 4263 4275 4288 N
+ SH UH OW i n/a 31 4263 4275 4290 N
+ SH UH OW s n/a 31 4263 4275 4288 N
+ SH UH OY b n/a 31 4263 4265 4290 N
+ SH UH OY e n/a 31 4263 4275 4290 N
+ SH UH OY s n/a 31 4263 4275 4290 N
+ SH UH P e n/a 31 4263 4275 4283 N
+ SH UH P i n/a 31 4263 4275 4283 N
+ SH UH P s n/a 31 4263 4275 4283 N
+ SH UH R b n/a 31 4263 4265 4283 N
+ SH UH R e n/a 31 4263 4275 4283 N
+ SH UH R s n/a 31 4263 4275 4283 N
+ SH UH S e n/a 31 4263 4275 4284 N
+ SH UH S s n/a 31 4263 4275 4284 N
+ SH UH SH e n/a 31 4263 4274 4282 N
+ SH UH SH s n/a 31 4263 4274 4282 N
+ SH UH SIL e n/a 31 4263 4274 4282 N
+ SH UH SIL s n/a 31 4263 4274 4282 N
+ SH UH T b n/a 31 4263 4265 4284 N
+ SH UH T e n/a 31 4263 4275 4284 N
+ SH UH T i n/a 31 4263 4275 4284 N
+ SH UH T s n/a 31 4263 4275 4284 N
+ SH UH TH e n/a 31 4263 4275 4284 N
+ SH UH TH s n/a 31 4263 4275 4284 N
+ SH UH UH b n/a 31 4263 4265 4285 N
+ SH UH UH e n/a 31 4263 4275 4281 N
+ SH UH UH s n/a 31 4263 4275 4281 N
+ SH UH UW b n/a 31 4263 4265 4286 N
+ SH UH UW e n/a 31 4263 4275 4286 N
+ SH UH UW s n/a 31 4263 4275 4286 N
+ SH UH V b n/a 31 4263 4265 4283 N
+ SH UH V e n/a 31 4263 4275 4283 N
+ SH UH V s n/a 31 4263 4275 4283 N
+ SH UH W b n/a 31 4263 4265 4283 N
+ SH UH W e n/a 31 4263 4275 4283 N
+ SH UH W i n/a 31 4263 4275 4283 N
+ SH UH W s n/a 31 4263 4275 4283 N
+ SH UH Y b n/a 31 4263 4266 4278 N
+ SH UH Y e n/a 31 4263 4274 4278 N
+ SH UH Y s n/a 31 4263 4274 4278 N
+ SH UH Z e n/a 31 4263 4275 4284 N
+ SH UH Z s n/a 31 4263 4275 4284 N
+ SH UH ZH e n/a 31 4263 4274 4283 N
+ SH UH ZH s n/a 31 4263 4274 4283 N
+ SH UW AA b n/a 31 4264 4267 4288 N
+ SH UW AA e n/a 31 4264 4277 4288 N
+ SH UW AA i n/a 31 4264 4277 4288 N
+ SH UW AA s n/a 31 4264 4277 4288 N
+ SH UW AE b n/a 31 4264 4267 4289 N
+ SH UW AE e n/a 31 4264 4277 4289 N
+ SH UW AE s n/a 31 4264 4277 4289 N
+ SH UW AH b n/a 31 4264 4267 4288 N
+ SH UW AH e n/a 31 4264 4277 4281 N
+ SH UW AH i n/a 31 4264 4277 4281 N
+ SH UW AH s n/a 31 4264 4277 4281 N
+ SH UW AO b n/a 31 4264 4267 4290 N
+ SH UW AO e n/a 31 4264 4277 4290 N
+ SH UW AO s n/a 31 4264 4277 4290 N
+ SH UW AW b n/a 31 4264 4267 4289 N
+ SH UW AW e n/a 31 4264 4277 4289 N
+ SH UW AW s n/a 31 4264 4277 4289 N
+ SH UW AY b n/a 31 4264 4266 4288 N
+ SH UW AY e n/a 31 4264 4277 4288 N
+ SH UW AY i n/a 31 4264 4277 4288 N
+ SH UW AY s n/a 31 4264 4277 4288 N
+ SH UW B b n/a 31 4264 4267 4283 N
+ SH UW B e n/a 31 4264 4277 4283 N
+ SH UW B s n/a 31 4264 4277 4283 N
+ SH UW CH b n/a 31 4264 4267 4282 N
+ SH UW CH e n/a 31 4264 4277 4282 N
+ SH UW CH s n/a 31 4264 4277 4282 N
+ SH UW D e n/a 31 4264 4277 4284 N
+ SH UW D s n/a 31 4264 4277 4284 N
+ SH UW DH e n/a 31 4264 4277 4284 N
+ SH UW DH s n/a 31 4264 4277 4284 N
+ SH UW EH b n/a 31 4264 4267 4287 N
+ SH UW EH e n/a 31 4264 4277 4281 N
+ SH UW EH i n/a 31 4264 4277 4281 N
+ SH UW EH s n/a 31 4264 4277 4281 N
+ SH UW ER b n/a 31 4264 4267 4285 N
+ SH UW ER e n/a 31 4264 4277 4285 N
+ SH UW ER i n/a 31 4264 4277 4285 N
+ SH UW ER s n/a 31 4264 4277 4285 N
+ SH UW EY b n/a 31 4264 4266 4287 N
+ SH UW EY e n/a 31 4264 4277 4287 N
+ SH UW EY i n/a 31 4264 4277 4287 N
+ SH UW EY s n/a 31 4264 4277 4287 N
+ SH UW F e n/a 31 4264 4277 4283 N
+ SH UW F s n/a 31 4264 4277 4283 N
+ SH UW G e n/a 31 4264 4277 4283 N
+ SH UW G s n/a 31 4264 4277 4283 N
+ SH UW HH e n/a 31 4264 4277 4282 N
+ SH UW HH s n/a 31 4264 4277 4282 N
+ SH UW IH b n/a 31 4264 4267 4287 N
+ SH UW IH e n/a 31 4264 4277 4281 N
+ SH UW IH i n/a 31 4264 4277 4281 N
+ SH UW IH s n/a 31 4264 4277 4281 N
+ SH UW IY b n/a 31 4264 4266 4278 N
+ SH UW IY e n/a 31 4264 4277 4278 N
+ SH UW IY i n/a 31 4264 4277 4278 N
+ SH UW IY s n/a 31 4264 4277 4278 N
+ SH UW JH e n/a 31 4264 4277 4283 N
+ SH UW JH s n/a 31 4264 4277 4283 N
+ SH UW K b n/a 31 4264 4267 4283 N
+ SH UW K e n/a 31 4264 4277 4283 N
+ SH UW K s n/a 31 4264 4277 4283 N
+ SH UW L b n/a 31 4264 4267 4283 N
+ SH UW L e n/a 31 4264 4277 4283 N
+ SH UW L s n/a 31 4264 4277 4283 N
+ SH UW M b n/a 31 4264 4267 4283 N
+ SH UW M e n/a 31 4264 4277 4283 N
+ SH UW M i n/a 31 4264 4277 4283 N
+ SH UW M s n/a 31 4264 4277 4283 N
+ SH UW N b n/a 31 4264 4267 4281 N
+ SH UW N e n/a 31 4264 4277 4281 N
+ SH UW N i n/a 31 4264 4277 4281 N
+ SH UW N s n/a 31 4264 4277 4281 N
+ SH UW NG e n/a 31 4264 4277 4283 N
+ SH UW NG s n/a 31 4264 4277 4283 N
+ SH UW OW b n/a 31 4264 4267 4288 N
+ SH UW OW e n/a 31 4264 4277 4288 N
+ SH UW OW s n/a 31 4264 4277 4288 N
+ SH UW OY b n/a 31 4264 4266 4290 N
+ SH UW OY e n/a 31 4264 4277 4290 N
+ SH UW OY s n/a 31 4264 4277 4290 N
+ SH UW P e n/a 31 4264 4277 4283 N
+ SH UW P s n/a 31 4264 4277 4283 N
+ SH UW R b n/a 31 4264 4267 4283 N
+ SH UW R e n/a 31 4264 4277 4283 N
+ SH UW R s n/a 31 4264 4277 4283 N
+ SH UW S e n/a 31 4264 4277 4284 N
+ SH UW S i n/a 31 4264 4277 4284 N
+ SH UW S s n/a 31 4264 4277 4284 N
+ SH UW SH e n/a 31 4264 4277 4282 N
+ SH UW SH s n/a 31 4264 4277 4282 N
+ SH UW SIL e n/a 31 4264 4277 4282 N
+ SH UW SIL s n/a 31 4264 4277 4282 N
+ SH UW T b n/a 31 4264 4267 4284 N
+ SH UW T e n/a 31 4264 4277 4284 N
+ SH UW T i n/a 31 4264 4277 4284 N
+ SH UW T s n/a 31 4264 4277 4284 N
+ SH UW TH e n/a 31 4264 4277 4284 N
+ SH UW TH s n/a 31 4264 4277 4284 N
+ SH UW UH b n/a 31 4264 4267 4285 N
+ SH UW UH e n/a 31 4264 4277 4281 N
+ SH UW UH s n/a 31 4264 4277 4281 N
+ SH UW UW b n/a 31 4264 4267 4286 N
+ SH UW UW e n/a 31 4264 4277 4286 N
+ SH UW UW s n/a 31 4264 4277 4286 N
+ SH UW V b n/a 31 4264 4267 4283 N
+ SH UW V e n/a 31 4264 4277 4283 N
+ SH UW V s n/a 31 4264 4277 4283 N
+ SH UW W b n/a 31 4264 4267 4283 N
+ SH UW W e n/a 31 4264 4277 4283 N
+ SH UW W s n/a 31 4264 4277 4283 N
+ SH UW Y b n/a 31 4264 4266 4278 N
+ SH UW Y e n/a 31 4264 4277 4278 N
+ SH UW Y s n/a 31 4264 4277 4278 N
+ SH UW Z e n/a 31 4264 4277 4284 N
+ SH UW Z s n/a 31 4264 4277 4284 N
+ SH UW ZH e n/a 31 4264 4277 4283 N
+ SH UW ZH s n/a 31 4264 4277 4283 N
+ SH V AA b n/a 31 4248 4265 4288 N
+ SH V AA s n/a 31 4248 4272 4288 N
+ SH V AE b n/a 31 4248 4265 4289 N
+ SH V AE s n/a 31 4248 4272 4289 N
+ SH V AH b n/a 31 4248 4265 4288 N
+ SH V AH s n/a 31 4248 4272 4279 N
+ SH V AO b n/a 31 4248 4265 4290 N
+ SH V AO s n/a 31 4248 4272 4290 N
+ SH V AW b n/a 31 4248 4265 4289 N
+ SH V AW s n/a 31 4248 4272 4289 N
+ SH V AY b n/a 31 4248 4265 4288 N
+ SH V AY s n/a 31 4248 4272 4288 N
+ SH V B b n/a 31 4248 4265 4283 N
+ SH V B s n/a 31 4248 4272 4283 N
+ SH V CH b n/a 31 4248 4265 4282 N
+ SH V CH s n/a 31 4248 4272 4282 N
+ SH V D s n/a 31 4248 4272 4284 N
+ SH V DH s n/a 31 4248 4272 4284 N
+ SH V EH b n/a 31 4248 4265 4287 N
+ SH V EH s n/a 31 4248 4272 4279 N
+ SH V ER b n/a 31 4248 4265 4285 N
+ SH V ER s n/a 31 4248 4272 4285 N
+ SH V EY b n/a 31 4248 4266 4287 N
+ SH V EY s n/a 31 4248 4272 4287 N
+ SH V F s n/a 31 4248 4272 4283 N
+ SH V G s n/a 31 4248 4272 4283 N
+ SH V HH s n/a 31 4248 4272 4282 N
+ SH V IH b n/a 31 4248 4265 4287 N
+ SH V IH i n/a 31 4248 4272 4280 N
+ SH V IH s n/a 31 4248 4272 4280 N
+ SH V IY b n/a 31 4248 4266 4278 N
+ SH V IY s n/a 31 4248 4272 4278 N
+ SH V JH s n/a 31 4248 4272 4283 N
+ SH V K b n/a 31 4248 4265 4283 N
+ SH V K s n/a 31 4248 4272 4283 N
+ SH V L b n/a 31 4248 4265 4283 N
+ SH V L s n/a 31 4248 4272 4283 N
+ SH V M b n/a 31 4248 4265 4283 N
+ SH V M s n/a 31 4248 4272 4283 N
+ SH V N b n/a 31 4248 4265 4279 N
+ SH V N s n/a 31 4248 4272 4279 N
+ SH V NG s n/a 31 4248 4272 4283 N
+ SH V OW b n/a 31 4248 4265 4288 N
+ SH V OW s n/a 31 4248 4272 4288 N
+ SH V OY b n/a 31 4248 4265 4290 N
+ SH V OY s n/a 31 4248 4272 4290 N
+ SH V P s n/a 31 4248 4272 4283 N
+ SH V R b n/a 31 4248 4265 4283 N
+ SH V R s n/a 31 4248 4272 4283 N
+ SH V S s n/a 31 4248 4272 4284 N
+ SH V SH s n/a 31 4248 4272 4282 N
+ SH V SIL s n/a 31 4248 4272 4282 N
+ SH V T b n/a 31 4248 4265 4284 N
+ SH V T s n/a 31 4248 4272 4284 N
+ SH V TH s n/a 31 4248 4272 4284 N
+ SH V UH b n/a 31 4248 4265 4285 N
+ SH V UH s n/a 31 4248 4272 4280 N
+ SH V UW b n/a 31 4248 4265 4286 N
+ SH V UW s n/a 31 4248 4272 4286 N
+ SH V V b n/a 31 4248 4265 4283 N
+ SH V V s n/a 31 4248 4272 4283 N
+ SH V W b n/a 31 4248 4265 4283 N
+ SH V W s n/a 31 4248 4272 4283 N
+ SH V Y b n/a 31 4248 4266 4278 N
+ SH V Y s n/a 31 4248 4272 4278 N
+ SH V Z s n/a 31 4248 4272 4284 N
+ SH V ZH s n/a 31 4248 4272 4283 N
+ SH W AA b n/a 31 4262 4265 4288 N
+ SH W AA s n/a 31 4262 4270 4288 N
+ SH W AE b n/a 31 4262 4265 4289 N
+ SH W AE s n/a 31 4262 4270 4289 N
+ SH W AH b n/a 31 4262 4265 4288 N
+ SH W AH s n/a 31 4262 4270 4279 N
+ SH W AO b n/a 31 4262 4265 4290 N
+ SH W AO s n/a 31 4262 4270 4290 N
+ SH W AW b n/a 31 4262 4265 4289 N
+ SH W AW s n/a 31 4262 4270 4289 N
+ SH W AY b n/a 31 4262 4265 4288 N
+ SH W AY s n/a 31 4262 4270 4288 N
+ SH W B b n/a 31 4262 4265 4283 N
+ SH W B s n/a 31 4262 4270 4283 N
+ SH W CH b n/a 31 4262 4265 4282 N
+ SH W CH s n/a 31 4262 4270 4282 N
+ SH W D s n/a 31 4262 4270 4284 N
+ SH W DH s n/a 31 4262 4270 4284 N
+ SH W EH b n/a 31 4262 4265 4287 N
+ SH W EH s n/a 31 4262 4270 4279 N
+ SH W ER b n/a 31 4262 4265 4285 N
+ SH W ER s n/a 31 4262 4270 4285 N
+ SH W EY b n/a 31 4262 4266 4287 N
+ SH W EY s n/a 31 4262 4270 4287 N
+ SH W F s n/a 31 4262 4270 4283 N
+ SH W G s n/a 31 4262 4270 4283 N
+ SH W HH s n/a 31 4262 4270 4282 N
+ SH W IH b n/a 31 4262 4265 4287 N
+ SH W IH s n/a 31 4262 4270 4280 N
+ SH W IY b n/a 31 4262 4266 4278 N
+ SH W IY s n/a 31 4262 4270 4278 N
+ SH W JH s n/a 31 4262 4270 4283 N
+ SH W K b n/a 31 4262 4265 4283 N
+ SH W K s n/a 31 4262 4270 4283 N
+ SH W L b n/a 31 4262 4265 4283 N
+ SH W L s n/a 31 4262 4270 4283 N
+ SH W M b n/a 31 4262 4265 4283 N
+ SH W M s n/a 31 4262 4270 4283 N
+ SH W N b n/a 31 4262 4265 4279 N
+ SH W N s n/a 31 4262 4270 4279 N
+ SH W NG s n/a 31 4262 4270 4283 N
+ SH W OW b n/a 31 4262 4265 4288 N
+ SH W OW s n/a 31 4262 4270 4288 N
+ SH W OY b n/a 31 4262 4265 4290 N
+ SH W OY s n/a 31 4262 4270 4290 N
+ SH W P s n/a 31 4262 4270 4283 N
+ SH W R b n/a 31 4262 4265 4283 N
+ SH W R s n/a 31 4262 4270 4283 N
+ SH W S s n/a 31 4262 4270 4284 N
+ SH W SH s n/a 31 4262 4270 4282 N
+ SH W SIL s n/a 31 4262 4271 4282 N
+ SH W T b n/a 31 4262 4265 4284 N
+ SH W T s n/a 31 4262 4270 4284 N
+ SH W TH s n/a 31 4262 4270 4284 N
+ SH W UH b n/a 31 4262 4265 4285 N
+ SH W UH s n/a 31 4262 4270 4280 N
+ SH W UW b n/a 31 4262 4265 4286 N
+ SH W UW s n/a 31 4262 4270 4286 N
+ SH W V b n/a 31 4262 4265 4283 N
+ SH W V s n/a 31 4262 4270 4283 N
+ SH W W b n/a 31 4262 4265 4283 N
+ SH W W s n/a 31 4262 4270 4283 N
+ SH W Y b n/a 31 4262 4266 4278 N
+ SH W Y s n/a 31 4262 4270 4278 N
+ SH W Z s n/a 31 4262 4270 4284 N
+ SH W ZH s n/a 31 4262 4270 4283 N
+ SH Y AA b n/a 31 4255 4265 4288 N
+ SH Y AA s n/a 31 4255 4275 4288 N
+ SH Y AE b n/a 31 4255 4265 4289 N
+ SH Y AE s n/a 31 4255 4275 4289 N
+ SH Y AH b n/a 31 4254 4265 4288 N
+ SH Y AH s n/a 31 4254 4275 4281 N
+ SH Y AO b n/a 31 4255 4265 4290 N
+ SH Y AO s n/a 31 4255 4275 4290 N
+ SH Y AW b n/a 31 4254 4265 4289 N
+ SH Y AW s n/a 31 4254 4275 4289 N
+ SH Y AY b n/a 31 4254 4265 4288 N
+ SH Y AY s n/a 31 4254 4275 4288 N
+ SH Y B b n/a 31 4255 4265 4283 N
+ SH Y B s n/a 31 4255 4275 4283 N
+ SH Y CH b n/a 31 4255 4265 4282 N
+ SH Y CH s n/a 31 4255 4274 4282 N
+ SH Y D s n/a 31 4255 4275 4284 N
+ SH Y DH s n/a 31 4255 4275 4284 N
+ SH Y EH b n/a 31 4255 4265 4287 N
+ SH Y EH s n/a 31 4255 4275 4281 N
+ SH Y ER b n/a 31 4254 4265 4285 N
+ SH Y ER s n/a 31 4254 4275 4285 N
+ SH Y EY b n/a 31 4254 4266 4287 N
+ SH Y EY s n/a 31 4254 4275 4287 N
+ SH Y F s n/a 31 4255 4275 4283 N
+ SH Y G s n/a 31 4255 4275 4283 N
+ SH Y HH s n/a 31 4255 4275 4282 N
+ SH Y IH b n/a 31 4255 4265 4287 N
+ SH Y IH s n/a 31 4255 4275 4281 N
+ SH Y IY b n/a 31 4254 4266 4278 N
+ SH Y IY s n/a 31 4254 4275 4278 N
+ SH Y JH s n/a 31 4255 4274 4283 N
+ SH Y K b n/a 31 4255 4265 4283 N
+ SH Y K s n/a 31 4255 4275 4283 N
+ SH Y L b n/a 31 4255 4265 4283 N
+ SH Y L s n/a 31 4255 4275 4283 N
+ SH Y M b n/a 31 4255 4265 4283 N
+ SH Y M s n/a 31 4255 4275 4283 N
+ SH Y N b n/a 31 4255 4265 4281 N
+ SH Y N s n/a 31 4255 4275 4281 N
+ SH Y NG s n/a 31 4255 4275 4283 N
+ SH Y OW b n/a 31 4254 4265 4288 N
+ SH Y OW s n/a 31 4254 4275 4288 N
+ SH Y OY b n/a 31 4254 4265 4290 N
+ SH Y OY s n/a 31 4254 4275 4290 N
+ SH Y P s n/a 31 4255 4275 4283 N
+ SH Y R b n/a 31 4255 4265 4283 N
+ SH Y R s n/a 31 4255 4275 4283 N
+ SH Y S s n/a 31 4255 4275 4284 N
+ SH Y SH s n/a 31 4255 4274 4282 N
+ SH Y SIL s n/a 31 4255 4274 4282 N
+ SH Y T b n/a 31 4255 4265 4284 N
+ SH Y T s n/a 31 4255 4275 4284 N
+ SH Y TH s n/a 31 4255 4275 4284 N
+ SH Y UH b n/a 31 4255 4265 4285 N
+ SH Y UH s n/a 31 4255 4275 4281 N
+ SH Y UW b n/a 31 4254 4265 4286 N
+ SH Y UW s n/a 31 4254 4275 4286 N
+ SH Y V b n/a 31 4255 4265 4283 N
+ SH Y V s n/a 31 4255 4275 4283 N
+ SH Y W b n/a 31 4255 4265 4283 N
+ SH Y W s n/a 31 4255 4275 4283 N
+ SH Y Y b n/a 31 4255 4266 4278 N
+ SH Y Y s n/a 31 4255 4274 4278 N
+ SH Y Z s n/a 31 4255 4275 4284 N
+ SH Y ZH s n/a 31 4255 4274 4283 N
+ SH Z AA b n/a 31 4250 4265 4288 N
+ SH Z AA e n/a 31 4250 4272 4288 N
+ SH Z AA s n/a 31 4250 4272 4288 N
+ SH Z AE b n/a 31 4250 4265 4289 N
+ SH Z AE e n/a 31 4250 4272 4289 N
+ SH Z AE s n/a 31 4250 4272 4289 N
+ SH Z AH b n/a 31 4250 4265 4288 N
+ SH Z AH e n/a 31 4250 4272 4279 N
+ SH Z AH i n/a 31 4250 4272 4279 N
+ SH Z AH s n/a 31 4250 4272 4279 N
+ SH Z AO b n/a 31 4250 4265 4290 N
+ SH Z AO e n/a 31 4250 4272 4290 N
+ SH Z AO s n/a 31 4250 4272 4290 N
+ SH Z AW b n/a 31 4250 4265 4289 N
+ SH Z AW e n/a 31 4250 4272 4289 N
+ SH Z AW s n/a 31 4250 4272 4289 N
+ SH Z AY b n/a 31 4250 4268 4288 N
+ SH Z AY e n/a 31 4250 4272 4288 N
+ SH Z AY s n/a 31 4250 4272 4288 N
+ SH Z B b n/a 31 4250 4265 4283 N
+ SH Z B e n/a 31 4250 4272 4283 N
+ SH Z B s n/a 31 4250 4272 4283 N
+ SH Z CH b n/a 31 4250 4265 4282 N
+ SH Z CH e n/a 31 4250 4272 4282 N
+ SH Z CH s n/a 31 4250 4272 4282 N
+ SH Z D e n/a 31 4250 4272 4284 N
+ SH Z D s n/a 31 4250 4272 4284 N
+ SH Z DH e n/a 31 4250 4272 4284 N
+ SH Z DH s n/a 31 4250 4272 4284 N
+ SH Z EH b n/a 31 4250 4265 4287 N
+ SH Z EH e n/a 31 4250 4272 4279 N
+ SH Z EH s n/a 31 4250 4272 4279 N
+ SH Z ER b n/a 31 4250 4265 4285 N
+ SH Z ER e n/a 31 4250 4272 4285 N
+ SH Z ER s n/a 31 4250 4272 4285 N
+ SH Z EY b n/a 31 4250 4268 4287 N
+ SH Z EY e n/a 31 4250 4272 4287 N
+ SH Z EY s n/a 31 4250 4272 4287 N
+ SH Z F e n/a 31 4250 4272 4283 N
+ SH Z F s n/a 31 4250 4272 4283 N
+ SH Z G e n/a 31 4250 4272 4283 N
+ SH Z G s n/a 31 4250 4272 4283 N
+ SH Z HH e n/a 31 4250 4272 4282 N
+ SH Z HH s n/a 31 4250 4272 4282 N
+ SH Z IH b n/a 31 4250 4265 4287 N
+ SH Z IH e n/a 31 4250 4272 4280 N
+ SH Z IH s n/a 31 4250 4272 4280 N
+ SH Z IY b n/a 31 4250 4268 4278 N
+ SH Z IY e n/a 31 4250 4272 4278 N
+ SH Z IY s n/a 31 4250 4272 4278 N
+ SH Z JH e n/a 31 4250 4272 4283 N
+ SH Z JH s n/a 31 4250 4272 4283 N
+ SH Z K b n/a 31 4250 4265 4283 N
+ SH Z K e n/a 31 4250 4272 4283 N
+ SH Z K s n/a 31 4250 4272 4283 N
+ SH Z L b n/a 31 4250 4265 4283 N
+ SH Z L e n/a 31 4250 4272 4283 N
+ SH Z L s n/a 31 4250 4272 4283 N
+ SH Z M b n/a 31 4250 4265 4283 N
+ SH Z M e n/a 31 4250 4272 4283 N
+ SH Z M s n/a 31 4250 4272 4283 N
+ SH Z N b n/a 31 4250 4265 4279 N
+ SH Z N e n/a 31 4250 4272 4279 N
+ SH Z N s n/a 31 4250 4272 4279 N
+ SH Z NG e n/a 31 4250 4272 4283 N
+ SH Z NG s n/a 31 4250 4272 4283 N
+ SH Z OW b n/a 31 4250 4265 4288 N
+ SH Z OW e n/a 31 4250 4272 4288 N
+ SH Z OW s n/a 31 4250 4272 4288 N
+ SH Z OY b n/a 31 4250 4268 4290 N
+ SH Z OY e n/a 31 4250 4272 4290 N
+ SH Z OY s n/a 31 4250 4272 4290 N
+ SH Z P e n/a 31 4250 4272 4283 N
+ SH Z P s n/a 31 4250 4272 4283 N
+ SH Z R b n/a 31 4250 4265 4283 N
+ SH Z R e n/a 31 4250 4272 4283 N
+ SH Z R s n/a 31 4250 4272 4283 N
+ SH Z S e n/a 31 4250 4272 4284 N
+ SH Z S s n/a 31 4250 4272 4284 N
+ SH Z SH e n/a 31 4250 4272 4282 N
+ SH Z SH s n/a 31 4250 4272 4282 N
+ SH Z SIL e n/a 31 4250 4272 4282 N
+ SH Z SIL s n/a 31 4250 4272 4282 N
+ SH Z T b n/a 31 4250 4265 4284 N
+ SH Z T e n/a 31 4250 4272 4284 N
+ SH Z T s n/a 31 4250 4272 4284 N
+ SH Z TH e n/a 31 4250 4272 4284 N
+ SH Z TH s n/a 31 4250 4272 4284 N
+ SH Z UH b n/a 31 4250 4265 4285 N
+ SH Z UH e n/a 31 4250 4272 4280 N
+ SH Z UH s n/a 31 4250 4272 4280 N
+ SH Z UW b n/a 31 4250 4265 4286 N
+ SH Z UW e n/a 31 4250 4272 4286 N
+ SH Z UW s n/a 31 4250 4272 4286 N
+ SH Z V b n/a 31 4250 4265 4283 N
+ SH Z V e n/a 31 4250 4272 4283 N
+ SH Z V s n/a 31 4250 4272 4283 N
+ SH Z W b n/a 31 4250 4265 4283 N
+ SH Z W e n/a 31 4250 4272 4283 N
+ SH Z W s n/a 31 4250 4272 4283 N
+ SH Z Y b n/a 31 4250 4268 4278 N
+ SH Z Y e n/a 31 4250 4272 4278 N
+ SH Z Y s n/a 31 4250 4272 4278 N
+ SH Z Z e n/a 31 4250 4272 4284 N
+ SH Z Z s n/a 31 4250 4272 4284 N
+ SH Z ZH e n/a 31 4250 4272 4283 N
+ SH Z ZH s n/a 31 4250 4272 4283 N
+ SH ZH AA b n/a 31 4250 4265 4288 N
+ SH ZH AA s n/a 31 4250 4272 4288 N
+ SH ZH AE b n/a 31 4250 4265 4289 N
+ SH ZH AE s n/a 31 4250 4272 4289 N
+ SH ZH AH b n/a 31 4250 4265 4288 N
+ SH ZH AH s n/a 31 4250 4272 4279 N
+ SH ZH AO b n/a 31 4250 4265 4290 N
+ SH ZH AO s n/a 31 4250 4272 4290 N
+ SH ZH AW b n/a 31 4250 4265 4289 N
+ SH ZH AW s n/a 31 4250 4272 4289 N
+ SH ZH AY b n/a 31 4250 4265 4288 N
+ SH ZH AY s n/a 31 4250 4272 4288 N
+ SH ZH B b n/a 31 4250 4265 4283 N
+ SH ZH B s n/a 31 4250 4272 4283 N
+ SH ZH CH b n/a 31 4250 4265 4282 N
+ SH ZH CH s n/a 31 4250 4272 4282 N
+ SH ZH D s n/a 31 4250 4272 4284 N
+ SH ZH DH s n/a 31 4250 4272 4284 N
+ SH ZH EH b n/a 31 4250 4265 4287 N
+ SH ZH EH s n/a 31 4250 4272 4279 N
+ SH ZH ER b n/a 31 4250 4265 4285 N
+ SH ZH ER s n/a 31 4250 4272 4285 N
+ SH ZH EY b n/a 31 4250 4266 4287 N
+ SH ZH EY s n/a 31 4250 4272 4287 N
+ SH ZH F s n/a 31 4250 4272 4283 N
+ SH ZH G s n/a 31 4250 4272 4283 N
+ SH ZH HH s n/a 31 4250 4272 4282 N
+ SH ZH IH b n/a 31 4250 4265 4287 N
+ SH ZH IH s n/a 31 4250 4272 4280 N
+ SH ZH IY b n/a 31 4250 4266 4278 N
+ SH ZH IY s n/a 31 4250 4272 4278 N
+ SH ZH JH s n/a 31 4250 4272 4283 N
+ SH ZH K b n/a 31 4250 4265 4283 N
+ SH ZH K s n/a 31 4250 4272 4283 N
+ SH ZH L b n/a 31 4250 4265 4283 N
+ SH ZH L s n/a 31 4250 4272 4283 N
+ SH ZH M b n/a 31 4250 4265 4283 N
+ SH ZH M s n/a 31 4250 4272 4283 N
+ SH ZH N b n/a 31 4250 4265 4279 N
+ SH ZH N s n/a 31 4250 4272 4279 N
+ SH ZH NG s n/a 31 4250 4272 4283 N
+ SH ZH OW b n/a 31 4250 4265 4288 N
+ SH ZH OW s n/a 31 4250 4272 4288 N
+ SH ZH OY b n/a 31 4250 4265 4290 N
+ SH ZH OY s n/a 31 4250 4272 4290 N
+ SH ZH P s n/a 31 4250 4272 4283 N
+ SH ZH R b n/a 31 4250 4265 4283 N
+ SH ZH R s n/a 31 4250 4272 4283 N
+ SH ZH S s n/a 31 4250 4272 4284 N
+ SH ZH SH s n/a 31 4250 4272 4282 N
+ SH ZH SIL s n/a 31 4250 4272 4282 N
+ SH ZH T b n/a 31 4250 4265 4284 N
+ SH ZH T s n/a 31 4250 4272 4284 N
+ SH ZH TH s n/a 31 4250 4272 4284 N
+ SH ZH UH b n/a 31 4250 4265 4285 N
+ SH ZH UH s n/a 31 4250 4272 4280 N
+ SH ZH UW b n/a 31 4250 4265 4286 N
+ SH ZH UW s n/a 31 4250 4272 4286 N
+ SH ZH V b n/a 31 4250 4265 4283 N
+ SH ZH V s n/a 31 4250 4272 4283 N
+ SH ZH W b n/a 31 4250 4265 4283 N
+ SH ZH W s n/a 31 4250 4272 4283 N
+ SH ZH Y b n/a 31 4250 4266 4278 N
+ SH ZH Y s n/a 31 4250 4272 4278 N
+ SH ZH Z s n/a 31 4250 4272 4284 N
+ SH ZH ZH s n/a 31 4250 4272 4283 N
+ T AA AA b n/a 33 4302 4420 4500 N
+ T AA AA e n/a 33 4302 4385 4496 N
+ T AA AA i n/a 33 4302 4431 4500 N
+ T AA AA s n/a 33 4302 4431 4500 N
+ T AA AE b n/a 33 4302 4420 4502 N
+ T AA AE e n/a 33 4302 4384 4517 N
+ T AA AE i n/a 33 4302 4432 4502 N
+ T AA AE s n/a 33 4302 4431 4502 N
+ T AA AH b n/a 33 4303 4416 4473 N
+ T AA AH e n/a 33 4303 4385 4520 N
+ T AA AH i n/a 33 4303 4451 4524 N
+ T AA AH s n/a 33 4303 4451 4520 N
+ T AA AO b n/a 33 4302 4420 4501 N
+ T AA AO e n/a 33 4302 4385 4496 N
+ T AA AO i n/a 33 4302 4431 4501 N
+ T AA AO s n/a 33 4302 4431 4501 N
+ T AA AW b n/a 33 4302 4420 4502 N
+ T AA AW e n/a 33 4302 4384 4520 N
+ T AA AW i n/a 33 4302 4432 4502 N
+ T AA AW s n/a 33 4302 4431 4502 N
+ T AA AY b n/a 33 4302 4420 4500 N
+ T AA AY e n/a 33 4302 4385 4496 N
+ T AA AY i n/a 33 4302 4431 4500 N
+ T AA AY s n/a 33 4302 4431 4500 N
+ T AA B b n/a 33 4297 4396 4548 N
+ T AA B e n/a 33 4297 4396 4548 N
+ T AA B i n/a 33 4297 4396 4548 N
+ T AA B s n/a 33 4297 4396 4548 N
+ T AA CH e n/a 33 4297 4394 4548 N
+ T AA CH i n/a 33 4297 4394 4548 N
+ T AA CH s n/a 33 4297 4394 4548 N
+ T AA D e n/a 33 4297 4396 4548 N
+ T AA D i n/a 33 4297 4396 4548 N
+ T AA D s n/a 33 4297 4396 4548 N
+ T AA DH e n/a 33 4297 4395 4547 N
+ T AA DH i n/a 33 4297 4395 4547 N
+ T AA DH s n/a 33 4297 4395 4547 N
+ T AA EH b n/a 33 4302 4415 4502 N
+ T AA EH e n/a 33 4302 4384 4517 N
+ T AA EH i n/a 33 4302 4432 4502 N
+ T AA EH s n/a 33 4302 4431 4502 N
+ T AA ER b n/a 33 4303 4417 4490 N
+ T AA ER e n/a 33 4303 4385 4488 N
+ T AA ER i n/a 33 4304 4453 4488 N
+ T AA ER s n/a 33 4303 4453 4488 N
+ T AA EY b n/a 33 4302 4415 4503 N
+ T AA EY e n/a 33 4302 4384 4517 N
+ T AA EY i n/a 33 4302 4432 4503 N
+ T AA EY s n/a 33 4302 4431 4503 N
+ T AA F b n/a 33 4302 4394 4539 N
+ T AA F e n/a 33 4302 4394 4539 N
+ T AA F i n/a 33 4302 4394 4539 N
+ T AA F s n/a 33 4302 4394 4539 N
+ T AA G b n/a 33 4297 4396 4548 N
+ T AA G e n/a 33 4297 4396 4548 N
+ T AA G i n/a 33 4297 4396 4548 N
+ T AA G s n/a 33 4297 4396 4548 N
+ T AA HH e n/a 33 4302 4397 4554 N
+ T AA HH i n/a 33 4302 4397 4554 N
+ T AA HH s n/a 33 4302 4397 4554 N
+ T AA IH b n/a 33 4303 4416 4472 N
+ T AA IH e n/a 33 4303 4384 4515 N
+ T AA IH i n/a 33 4303 4456 4512 N
+ T AA IH s n/a 33 4303 4456 4515 N
+ T AA IY b n/a 33 4302 4415 4511 N
+ T AA IY e n/a 33 4302 4384 4510 N
+ T AA IY i n/a 33 4302 4455 4510 N
+ T AA IY s n/a 33 4302 4455 4511 N
+ T AA JH e n/a 33 4297 4396 4548 N
+ T AA JH s n/a 33 4297 4396 4548 N
+ T AA K e n/a 33 4297 4394 4548 N
+ T AA K i n/a 33 4297 4394 4548 N
+ T AA K s n/a 33 4297 4394 4548 N
+ T AA L b n/a 33 4302 4425 4494 N
+ T AA L e n/a 33 4302 4390 4561 N
+ T AA L i n/a 33 4302 4434 4494 N
+ T AA L s n/a 33 4302 4434 4494 N
+ T AA M b n/a 33 4302 4396 4566 N
+ T AA M e n/a 33 4302 4396 4566 N
+ T AA M i n/a 33 4302 4396 4566 N
+ T AA M s n/a 33 4302 4396 4566 N
+ T AA N b n/a 33 4297 4396 4566 N
+ T AA N e n/a 33 4297 4396 4566 N
+ T AA N i n/a 33 4297 4396 4566 N
+ T AA N s n/a 33 4297 4396 4566 N
+ T AA NG b n/a 33 4302 4396 4566 N
+ T AA NG e n/a 33 4302 4396 4566 N
+ T AA NG s n/a 33 4302 4396 4566 N
+ T AA OW b n/a 33 4302 4417 4491 N
+ T AA OW e n/a 33 4302 4385 4493 N
+ T AA OW i n/a 33 4302 4431 4493 N
+ T AA OW s n/a 33 4302 4431 4493 N
+ T AA OY b n/a 33 4302 4420 4501 N
+ T AA OY e n/a 33 4302 4385 4496 N
+ T AA OY s n/a 33 4302 4431 4501 N
+ T AA P e n/a 33 4297 4394 4547 N
+ T AA P i n/a 33 4297 4394 4547 N
+ T AA P s n/a 33 4297 4394 4547 N
+ T AA R b n/a 33 4302 4424 4481 N
+ T AA R e n/a 33 4302 4390 4562 N
+ T AA R i n/a 33 4302 4430 4481 N
+ T AA R s n/a 33 4302 4431 4481 N
+ T AA S b n/a 33 4297 4394 4539 N
+ T AA S e n/a 33 4297 4394 4539 N
+ T AA S i n/a 33 4297 4394 4539 N
+ T AA S s n/a 33 4297 4394 4539 N
+ T AA SH b n/a 33 4302 4394 4540 N
+ T AA SH e n/a 33 4302 4394 4540 N
+ T AA SH s n/a 33 4302 4394 4540 N
+ T AA SIL e n/a 33 4302 4445 4556 N
+ T AA SIL s n/a 33 4302 4445 4556 N
+ T AA T b n/a 33 4297 4395 4547 N
+ T AA T e n/a 33 4297 4395 4547 N
+ T AA T s n/a 33 4297 4395 4547 N
+ T AA TH e n/a 33 4297 4394 4539 N
+ T AA TH s n/a 33 4297 4394 4539 N
+ T AA UH b n/a 33 4302 4417 4475 N
+ T AA UH e n/a 33 4302 4384 4475 N
+ T AA UH i n/a 33 4302 4461 4475 N
+ T AA UH s n/a 33 4302 4461 4475 N
+ T AA UW b n/a 33 4302 4417 4480 N
+ T AA UW e n/a 33 4302 4384 4480 N
+ T AA UW i n/a 33 4302 4461 4480 N
+ T AA UW s n/a 33 4302 4461 4480 N
+ T AA V b n/a 33 4302 4396 4548 N
+ T AA V e n/a 33 4302 4396 4548 N
+ T AA V i n/a 33 4302 4396 4548 N
+ T AA V s n/a 33 4302 4396 4548 N
+ T AA W b n/a 33 4302 4425 4483 N
+ T AA W e n/a 33 4302 4390 4563 N
+ T AA W i n/a 33 4302 4434 4482 N
+ T AA W s n/a 33 4302 4434 4483 N
+ T AA Y b n/a 33 4302 4425 4511 N
+ T AA Y e n/a 33 4302 4383 4509 N
+ T AA Y i n/a 33 4302 4455 4510 N
+ T AA Y s n/a 33 4302 4455 4511 N
+ T AA Z b n/a 33 4297 4396 4548 N
+ T AA Z e n/a 33 4297 4396 4548 N
+ T AA Z i n/a 33 4297 4396 4548 N
+ T AA Z s n/a 33 4297 4396 4548 N
+ T AA ZH e n/a 33 4302 4396 4548 N
+ T AA ZH s n/a 33 4302 4396 4548 N
+ T AE AA b n/a 33 4312 4420 4500 N
+ T AE AA e n/a 33 4312 4386 4496 N
+ T AE AA i n/a 33 4313 4432 4500 N
+ T AE AA s n/a 33 4312 4432 4500 N
+ T AE AE b n/a 33 4312 4420 4502 N
+ T AE AE e n/a 33 4312 4387 4517 N
+ T AE AE i n/a 33 4313 4432 4502 N
+ T AE AE s n/a 33 4312 4431 4502 N
+ T AE AH b n/a 33 4312 4416 4473 N
+ T AE AH e n/a 33 4312 4387 4519 N
+ T AE AH i n/a 33 4313 4451 4524 N
+ T AE AH s n/a 33 4312 4451 4519 N
+ T AE AO b n/a 33 4312 4420 4501 N
+ T AE AO e n/a 33 4312 4386 4496 N
+ T AE AO i n/a 33 4313 4432 4501 N
+ T AE AO s n/a 33 4312 4432 4501 N
+ T AE AW b n/a 33 4312 4420 4502 N
+ T AE AW e n/a 33 4312 4387 4519 N
+ T AE AW i n/a 33 4313 4432 4502 N
+ T AE AW s n/a 33 4312 4431 4502 N
+ T AE AY b n/a 33 4312 4420 4500 N
+ T AE AY e n/a 33 4312 4386 4495 N
+ T AE AY i n/a 33 4313 4432 4500 N
+ T AE AY s n/a 33 4312 4432 4500 N
+ T AE B b n/a 33 4306 4400 4545 N
+ T AE B e n/a 33 4306 4400 4545 N
+ T AE B i n/a 33 4306 4400 4545 N
+ T AE B s n/a 33 4306 4400 4545 N
+ T AE CH e n/a 33 4305 4400 4543 N
+ T AE CH i n/a 33 4305 4400 4543 N
+ T AE CH s n/a 33 4305 4400 4543 N
+ T AE D e n/a 33 4306 4400 4545 N
+ T AE D i n/a 33 4306 4400 4545 N
+ T AE D s n/a 33 4306 4400 4545 N
+ T AE DH e n/a 33 4308 4398 4542 N
+ T AE DH i n/a 33 4308 4398 4542 N
+ T AE DH s n/a 33 4308 4398 4542 N
+ T AE EH b n/a 33 4312 4415 4502 N
+ T AE EH e n/a 33 4312 4387 4517 N
+ T AE EH i n/a 33 4313 4432 4502 N
+ T AE EH s n/a 33 4312 4431 4502 N
+ T AE ER b n/a 33 4312 4417 4490 N
+ T AE ER e n/a 33 4312 4387 4488 N
+ T AE ER i n/a 33 4313 4452 4488 N
+ T AE ER s n/a 33 4312 4452 4488 N
+ T AE EY b n/a 33 4312 4415 4503 N
+ T AE EY e n/a 33 4312 4387 4517 N
+ T AE EY i n/a 33 4313 4432 4503 N
+ T AE EY s n/a 33 4312 4431 4503 N
+ T AE F b n/a 33 4306 4401 4537 N
+ T AE F e n/a 33 4306 4401 4537 N
+ T AE F i n/a 33 4306 4401 4537 N
+ T AE F s n/a 33 4306 4401 4537 N
+ T AE G b n/a 33 4305 4400 4545 N
+ T AE G e n/a 33 4305 4400 4545 N
+ T AE G s n/a 33 4305 4400 4545 N
+ T AE HH e n/a 33 4310 4382 4554 N
+ T AE HH i n/a 33 4313 4382 4554 N
+ T AE HH s n/a 33 4310 4382 4554 N
+ T AE IH b n/a 33 4312 4416 4472 N
+ T AE IH e n/a 33 4312 4379 4514 N
+ T AE IH i n/a 33 4313 4458 4515 N
+ T AE IH s n/a 33 4312 4458 4514 N
+ T AE IY b n/a 33 4312 4415 4508 N
+ T AE IY e n/a 33 4312 4379 4510 N
+ T AE IY i n/a 33 4313 4455 4508 N
+ T AE IY s n/a 33 4312 4455 4508 N
+ T AE JH e n/a 33 4305 4400 4543 N
+ T AE JH s n/a 33 4305 4400 4543 N
+ T AE K e n/a 33 4305 4400 4545 N
+ T AE K i n/a 33 4306 4400 4545 N
+ T AE K s n/a 33 4305 4400 4545 N
+ T AE L b n/a 33 4298 4425 4494 N
+ T AE L e n/a 33 4298 4388 4561 N
+ T AE L i n/a 33 4298 4433 4494 N
+ T AE L s n/a 33 4298 4433 4494 N
+ T AE M b n/a 33 4310 4393 4566 N
+ T AE M e n/a 33 4310 4393 4566 N
+ T AE M i n/a 33 4313 4393 4566 N
+ T AE M s n/a 33 4310 4393 4566 N
+ T AE N b n/a 33 4310 4393 4566 N
+ T AE N e n/a 33 4310 4393 4566 N
+ T AE N i n/a 33 4313 4393 4566 N
+ T AE N s n/a 33 4310 4393 4566 N
+ T AE NG b n/a 33 4310 4393 4566 N
+ T AE NG e n/a 33 4310 4393 4566 N
+ T AE NG s n/a 33 4310 4393 4566 N
+ T AE OW b n/a 33 4312 4417 4491 N
+ T AE OW e n/a 33 4312 4386 4493 N
+ T AE OW i n/a 33 4313 4432 4492 N
+ T AE OW s n/a 33 4312 4432 4493 N
+ T AE OY b n/a 33 4312 4420 4501 N
+ T AE OY e n/a 33 4312 4386 4495 N
+ T AE OY s n/a 33 4312 4432 4501 N
+ T AE P e n/a 33 4306 4400 4545 N
+ T AE P s n/a 33 4306 4400 4545 N
+ T AE R b n/a 33 4298 4424 4481 N
+ T AE R e n/a 33 4298 4388 4562 N
+ T AE R i n/a 33 4298 4430 4481 N
+ T AE R s n/a 33 4298 4430 4481 N
+ T AE S b n/a 33 4306 4401 4537 N
+ T AE S e n/a 33 4306 4401 4537 N
+ T AE S i n/a 33 4306 4401 4537 N
+ T AE S s n/a 33 4306 4401 4537 N
+ T AE SH b n/a 33 4305 4405 4540 N
+ T AE SH e n/a 33 4305 4405 4540 N
+ T AE SH i n/a 33 4305 4405 4540 N
+ T AE SH s n/a 33 4305 4405 4540 N
+ T AE SIL e n/a 33 4311 4444 4557 N
+ T AE SIL s n/a 33 4311 4444 4557 N
+ T AE T b n/a 33 4306 4400 4545 N
+ T AE T e n/a 33 4306 4400 4545 N
+ T AE T i n/a 33 4306 4400 4545 N
+ T AE T s n/a 33 4306 4400 4545 N
+ T AE TH e n/a 33 4307 4401 4537 N
+ T AE TH i n/a 33 4307 4401 4537 N
+ T AE TH s n/a 33 4307 4401 4537 N
+ T AE UH b n/a 33 4312 4417 4475 N
+ T AE UH e n/a 33 4312 4387 4475 N
+ T AE UH i n/a 33 4313 4461 4475 N
+ T AE UH s n/a 33 4312 4461 4475 N
+ T AE UW b n/a 33 4312 4417 4480 N
+ T AE UW e n/a 33 4312 4386 4480 N
+ T AE UW i n/a 33 4313 4461 4480 N
+ T AE UW s n/a 33 4312 4461 4480 N
+ T AE V b n/a 33 4305 4400 4543 N
+ T AE V e n/a 33 4305 4400 4543 N
+ T AE V i n/a 33 4306 4400 4543 N
+ T AE V s n/a 33 4305 4400 4543 N
+ T AE W b n/a 33 4298 4425 4483 N
+ T AE W e n/a 33 4298 4388 4563 N
+ T AE W i n/a 33 4298 4433 4482 N
+ T AE W s n/a 33 4298 4433 4483 N
+ T AE Y b n/a 33 4312 4425 4508 N
+ T AE Y e n/a 33 4312 4383 4509 N
+ T AE Y i n/a 33 4313 4455 4508 N
+ T AE Y s n/a 33 4312 4455 4508 N
+ T AE Z b n/a 33 4305 4400 4543 N
+ T AE Z e n/a 33 4305 4400 4543 N
+ T AE Z i n/a 33 4306 4400 4543 N
+ T AE Z s n/a 33 4305 4400 4543 N
+ T AE ZH e n/a 33 4305 4400 4543 N
+ T AE ZH s n/a 33 4305 4400 4543 N
+ T AH AA b n/a 33 4339 4420 4500 N
+ T AH AA e n/a 33 4318 4386 4496 N
+ T AH AA i n/a 33 4327 4432 4500 N
+ T AH AA s n/a 33 4339 4432 4500 N
+ T AH AE b n/a 33 4339 4420 4502 N
+ T AH AE e n/a 33 4317 4387 4517 N
+ T AH AE i n/a 33 4327 4432 4502 N
+ T AH AE s n/a 33 4339 4431 4502 N
+ T AH AH b n/a 33 4339 4415 4475 N
+ T AH AH e n/a 33 4317 4387 4519 N
+ T AH AH i n/a 33 4325 4449 4524 N
+ T AH AH s n/a 33 4339 4449 4519 N
+ T AH AO b n/a 33 4339 4420 4501 N
+ T AH AO e n/a 33 4318 4386 4496 N
+ T AH AO i n/a 33 4327 4432 4501 N
+ T AH AO s n/a 33 4339 4432 4501 N
+ T AH AW b n/a 33 4339 4420 4502 N
+ T AH AW e n/a 33 4317 4387 4519 N
+ T AH AW i n/a 33 4327 4432 4502 N
+ T AH AW s n/a 33 4339 4431 4502 N
+ T AH AY b n/a 33 4339 4420 4500 N
+ T AH AY e n/a 33 4318 4386 4495 N
+ T AH AY i n/a 33 4327 4432 4500 N
+ T AH AY s n/a 33 4339 4432 4500 N
+ T AH B b n/a 33 4339 4399 4543 N
+ T AH B e n/a 33 4307 4399 4543 N
+ T AH B i n/a 33 4328 4399 4543 N
+ T AH B s n/a 33 4339 4399 4543 N
+ T AH CH e n/a 33 4307 4399 4543 N
+ T AH CH i n/a 33 4328 4399 4543 N
+ T AH CH s n/a 33 4339 4399 4543 N
+ T AH D e n/a 33 4307 4399 4543 N
+ T AH D i n/a 33 4328 4399 4543 N
+ T AH D s n/a 33 4328 4399 4543 N
+ T AH DH e n/a 33 4309 4398 4541 N
+ T AH DH s n/a 33 4339 4398 4541 N
+ T AH EH b n/a 33 4339 4415 4502 N
+ T AH EH e n/a 33 4317 4387 4517 N
+ T AH EH i n/a 33 4327 4432 4502 N
+ T AH EH s n/a 33 4339 4431 4502 N
+ T AH ER b n/a 33 4339 4417 4490 N
+ T AH ER e n/a 33 4318 4387 4488 N
+ T AH ER i n/a 33 4331 4454 4488 N
+ T AH ER s n/a 33 4339 4454 4488 N
+ T AH EY b n/a 33 4339 4415 4503 N
+ T AH EY e n/a 33 4317 4387 4517 N
+ T AH EY i n/a 33 4327 4432 4503 N
+ T AH EY s n/a 33 4339 4431 4503 N
+ T AH F b n/a 33 4339 4401 4535 N
+ T AH F e n/a 33 4307 4401 4535 N
+ T AH F i n/a 33 4328 4401 4535 N
+ T AH F s n/a 33 4339 4401 4535 N
+ T AH G b n/a 33 4339 4399 4543 N
+ T AH G e n/a 33 4307 4399 4543 N
+ T AH G i n/a 33 4328 4399 4543 N
+ T AH G s n/a 33 4339 4399 4543 N
+ T AH HH e n/a 33 4315 4382 4554 N
+ T AH HH i n/a 33 4328 4382 4554 N
+ T AH HH s n/a 33 4339 4382 4554 N
+ T AH IH b n/a 33 4339 4415 4472 N
+ T AH IH e n/a 33 4317 4379 4514 N
+ T AH IH i n/a 33 4327 4459 4513 N
+ T AH IH s n/a 33 4339 4459 4514 N
+ T AH IY b n/a 33 4339 4415 4508 N
+ T AH IY e n/a 33 4317 4379 4510 N
+ T AH IY i n/a 33 4329 4455 4510 N
+ T AH IY s n/a 33 4339 4455 4508 N
+ T AH JH e n/a 33 4307 4399 4543 N
+ T AH JH s n/a 33 4339 4399 4543 N
+ T AH K e n/a 33 4307 4399 4543 N
+ T AH K i n/a 33 4328 4399 4543 N
+ T AH K s n/a 33 4339 4399 4543 N
+ T AH L b n/a 33 4340 4425 4494 N
+ T AH L e n/a 33 4300 4388 4561 N
+ T AH L i n/a 33 4331 4433 4494 N
+ T AH L s n/a 33 4340 4433 4494 N
+ T AH M b n/a 33 4339 4393 4566 N
+ T AH M e n/a 33 4314 4393 4566 N
+ T AH M i n/a 33 4328 4393 4566 N
+ T AH M s n/a 33 4339 4393 4566 N
+ T AH N b n/a 33 4328 4393 4566 N
+ T AH N e n/a 33 4314 4393 4566 N
+ T AH N i n/a 33 4328 4393 4566 N
+ T AH N s n/a 33 4328 4393 4566 N
+ T AH NG b n/a 33 4339 4393 4566 N
+ T AH NG e n/a 33 4314 4393 4566 N
+ T AH NG s n/a 33 4339 4393 4566 N
+ T AH OW b n/a 33 4339 4417 4491 N
+ T AH OW e n/a 33 4318 4386 4493 N
+ T AH OW i n/a 33 4327 4432 4491 N
+ T AH OW s n/a 33 4339 4432 4493 N
+ T AH OY b n/a 33 4339 4420 4501 N
+ T AH OY e n/a 33 4318 4386 4495 N
+ T AH OY i n/a 33 4327 4432 4501 N
+ T AH OY s n/a 33 4339 4432 4501 N
+ T AH P e n/a 33 4307 4399 4543 N
+ T AH P i n/a 33 4328 4399 4543 N
+ T AH P s n/a 33 4339 4399 4543 N
+ T AH R b n/a 33 4340 4424 4481 N
+ T AH R e n/a 33 4299 4388 4562 N
+ T AH R i n/a 33 4327 4430 4481 N
+ T AH R s n/a 33 4340 4430 4481 N
+ T AH S b n/a 33 4333 4401 4532 N
+ T AH S e n/a 33 4307 4401 4532 N
+ T AH S i n/a 33 4333 4401 4532 N
+ T AH S s n/a 33 4333 4401 4532 N
+ T AH SH b n/a 33 4339 4405 4540 N
+ T AH SH e n/a 33 4305 4405 4540 N
+ T AH SH i n/a 33 4328 4405 4540 N
+ T AH SH s n/a 33 4339 4405 4540 N
+ T AH SIL e n/a 33 4314 4444 4557 N
+ T AH SIL s n/a 33 4339 4444 4557 N
+ T AH T b n/a 33 4328 4399 4543 N
+ T AH T e n/a 33 4307 4399 4543 N
+ T AH T i n/a 33 4328 4399 4543 N
+ T AH T s n/a 33 4328 4399 4543 N
+ T AH TH e n/a 33 4309 4401 4532 N
+ T AH TH i n/a 33 4328 4401 4532 N
+ T AH TH s n/a 33 4339 4401 4532 N
+ T AH UH b n/a 33 4339 4417 4475 N
+ T AH UH e n/a 33 4318 4387 4475 N
+ T AH UH i n/a 33 4327 4461 4475 N
+ T AH UH s n/a 33 4339 4461 4475 N
+ T AH UW b n/a 33 4339 4417 4480 N
+ T AH UW e n/a 33 4318 4386 4480 N
+ T AH UW i n/a 33 4327 4461 4480 N
+ T AH UW s n/a 33 4339 4461 4480 N
+ T AH V b n/a 33 4339 4399 4543 N
+ T AH V e n/a 33 4307 4399 4543 N
+ T AH V i n/a 33 4328 4399 4543 N
+ T AH V s n/a 33 4339 4399 4543 N
+ T AH W b n/a 33 4340 4425 4483 N
+ T AH W e n/a 33 4300 4391 4563 N
+ T AH W i n/a 33 4331 4433 4482 N
+ T AH W s n/a 33 4340 4433 4483 N
+ T AH Y b n/a 33 4339 4425 4508 N
+ T AH Y e n/a 33 4316 4383 4509 N
+ T AH Y i n/a 33 4329 4459 4510 N
+ T AH Y s n/a 33 4339 4459 4508 N
+ T AH Z b n/a 33 4333 4399 4543 N
+ T AH Z e n/a 33 4307 4399 4543 N
+ T AH Z i n/a 33 4333 4399 4543 N
+ T AH Z s n/a 33 4333 4399 4543 N
+ T AH ZH e n/a 33 4307 4399 4543 N
+ T AH ZH s n/a 33 4339 4399 4543 N
+ T AO AA b n/a 33 4302 4420 4500 N
+ T AO AA e n/a 33 4302 4385 4496 N
+ T AO AA i n/a 33 4302 4431 4500 N
+ T AO AA s n/a 33 4302 4431 4500 N
+ T AO AE b n/a 33 4302 4420 4502 N
+ T AO AE e n/a 33 4302 4384 4517 N
+ T AO AE s n/a 33 4302 4431 4502 N
+ T AO AH b n/a 33 4303 4416 4473 N
+ T AO AH e n/a 33 4303 4385 4520 N
+ T AO AH i n/a 33 4303 4451 4524 N
+ T AO AH s n/a 33 4303 4451 4520 N
+ T AO AO b n/a 33 4302 4420 4501 N
+ T AO AO e n/a 33 4302 4385 4496 N
+ T AO AO s n/a 33 4302 4431 4501 N
+ T AO AW b n/a 33 4302 4420 4502 N
+ T AO AW e n/a 33 4302 4384 4520 N
+ T AO AW s n/a 33 4302 4431 4502 N
+ T AO AY b n/a 33 4302 4420 4500 N
+ T AO AY e n/a 33 4302 4385 4496 N
+ T AO AY i n/a 33 4302 4431 4500 N
+ T AO AY s n/a 33 4302 4431 4500 N
+ T AO B b n/a 33 4297 4396 4548 N
+ T AO B e n/a 33 4297 4396 4548 N
+ T AO B s n/a 33 4297 4396 4548 N
+ T AO CH e n/a 33 4297 4394 4548 N
+ T AO CH s n/a 33 4297 4394 4548 N
+ T AO D e n/a 33 4297 4396 4548 N
+ T AO D s n/a 33 4297 4396 4548 N
+ T AO DH e n/a 33 4297 4395 4547 N
+ T AO DH s n/a 33 4297 4395 4547 N
+ T AO EH b n/a 33 4302 4415 4502 N
+ T AO EH e n/a 33 4302 4384 4517 N
+ T AO EH i n/a 33 4302 4432 4502 N
+ T AO EH s n/a 33 4302 4431 4502 N
+ T AO ER b n/a 33 4303 4417 4490 N
+ T AO ER e n/a 33 4303 4385 4488 N
+ T AO ER i n/a 33 4304 4453 4488 N
+ T AO ER s n/a 33 4303 4453 4488 N
+ T AO EY b n/a 33 4302 4415 4503 N
+ T AO EY e n/a 33 4302 4384 4517 N
+ T AO EY i n/a 33 4302 4432 4503 N
+ T AO EY s n/a 33 4302 4431 4503 N
+ T AO F b n/a 33 4302 4394 4539 N
+ T AO F e n/a 33 4302 4394 4539 N
+ T AO F i n/a 33 4302 4394 4539 N
+ T AO F s n/a 33 4302 4394 4539 N
+ T AO G b n/a 33 4297 4396 4548 N
+ T AO G e n/a 33 4297 4396 4548 N
+ T AO G s n/a 33 4297 4396 4548 N
+ T AO HH e n/a 33 4302 4397 4554 N
+ T AO HH s n/a 33 4302 4397 4554 N
+ T AO IH b n/a 33 4303 4416 4472 N
+ T AO IH e n/a 33 4303 4384 4515 N
+ T AO IH i n/a 33 4303 4456 4513 N
+ T AO IH s n/a 33 4303 4456 4515 N
+ T AO IY b n/a 33 4302 4415 4511 N
+ T AO IY e n/a 33 4302 4384 4510 N
+ T AO IY i n/a 33 4302 4455 4510 N
+ T AO IY s n/a 33 4302 4455 4511 N
+ T AO JH e n/a 33 4297 4396 4548 N
+ T AO JH s n/a 33 4297 4396 4548 N
+ T AO K e n/a 33 4297 4394 4548 N
+ T AO K i n/a 33 4297 4394 4548 N
+ T AO K s n/a 33 4297 4394 4548 N
+ T AO L b n/a 33 4302 4425 4494 N
+ T AO L e n/a 33 4302 4390 4561 N
+ T AO L i n/a 33 4302 4434 4494 N
+ T AO L s n/a 33 4302 4434 4494 N
+ T AO M b n/a 33 4302 4396 4566 N
+ T AO M e n/a 33 4302 4396 4566 N
+ T AO M s n/a 33 4302 4396 4566 N
+ T AO N b n/a 33 4297 4396 4566 N
+ T AO N e n/a 33 4297 4396 4566 N
+ T AO N i n/a 33 4297 4396 4566 N
+ T AO N s n/a 33 4297 4396 4566 N
+ T AO NG b n/a 33 4302 4396 4566 N
+ T AO NG e n/a 33 4302 4396 4566 N
+ T AO NG s n/a 33 4302 4396 4566 N
+ T AO OW b n/a 33 4302 4417 4491 N
+ T AO OW e n/a 33 4302 4385 4493 N
+ T AO OW i n/a 33 4302 4431 4493 N
+ T AO OW s n/a 33 4302 4431 4493 N
+ T AO OY b n/a 33 4302 4420 4501 N
+ T AO OY e n/a 33 4302 4385 4496 N
+ T AO OY i n/a 33 4302 4431 4501 N
+ T AO OY s n/a 33 4302 4431 4501 N
+ T AO P e n/a 33 4297 4394 4547 N
+ T AO P s n/a 33 4297 4394 4547 N
+ T AO R b n/a 33 4302 4424 4481 N
+ T AO R e n/a 33 4302 4390 4562 N
+ T AO R i n/a 33 4302 4430 4481 N
+ T AO R s n/a 33 4302 4431 4481 N
+ T AO S b n/a 33 4297 4394 4539 N
+ T AO S e n/a 33 4297 4394 4539 N
+ T AO S i n/a 33 4297 4394 4539 N
+ T AO S s n/a 33 4297 4394 4539 N
+ T AO SH b n/a 33 4302 4394 4540 N
+ T AO SH e n/a 33 4302 4394 4540 N
+ T AO SH s n/a 33 4302 4394 4540 N
+ T AO SIL e n/a 33 4302 4445 4556 N
+ T AO SIL s n/a 33 4302 4445 4556 N
+ T AO T b n/a 33 4297 4395 4547 N
+ T AO T e n/a 33 4297 4395 4547 N
+ T AO T s n/a 33 4297 4395 4547 N
+ T AO TH e n/a 33 4297 4394 4539 N
+ T AO TH s n/a 33 4297 4394 4539 N
+ T AO UH b n/a 33 4302 4417 4475 N
+ T AO UH e n/a 33 4302 4384 4475 N
+ T AO UH s n/a 33 4302 4461 4475 N
+ T AO UW b n/a 33 4302 4417 4480 N
+ T AO UW e n/a 33 4302 4384 4480 N
+ T AO UW s n/a 33 4302 4461 4480 N
+ T AO V b n/a 33 4302 4396 4548 N
+ T AO V e n/a 33 4302 4396 4548 N
+ T AO V s n/a 33 4302 4396 4548 N
+ T AO W b n/a 33 4302 4425 4483 N
+ T AO W e n/a 33 4302 4390 4563 N
+ T AO W i n/a 33 4302 4434 4482 N
+ T AO W s n/a 33 4302 4434 4483 N
+ T AO Y b n/a 33 4302 4425 4511 N
+ T AO Y e n/a 33 4302 4383 4509 N
+ T AO Y i n/a 33 4302 4455 4510 N
+ T AO Y s n/a 33 4302 4455 4511 N
+ T AO Z b n/a 33 4297 4396 4548 N
+ T AO Z e n/a 33 4297 4396 4548 N
+ T AO Z i n/a 33 4297 4396 4548 N
+ T AO Z s n/a 33 4297 4396 4548 N
+ T AO ZH e n/a 33 4302 4396 4548 N
+ T AO ZH s n/a 33 4302 4396 4548 N
+ T AW AA b n/a 33 4301 4420 4500 N
+ T AW AA e n/a 33 4301 4385 4496 N
+ T AW AA s n/a 33 4301 4432 4500 N
+ T AW AE b n/a 33 4301 4420 4502 N
+ T AW AE e n/a 33 4301 4384 4517 N
+ T AW AE i n/a 33 4301 4432 4502 N
+ T AW AE s n/a 33 4301 4431 4502 N
+ T AW AH b n/a 33 4303 4416 4473 N
+ T AW AH e n/a 33 4303 4385 4520 N
+ T AW AH i n/a 33 4304 4451 4524 N
+ T AW AH s n/a 33 4303 4451 4520 N
+ T AW AO b n/a 33 4301 4420 4501 N
+ T AW AO e n/a 33 4301 4385 4496 N
+ T AW AO s n/a 33 4301 4432 4501 N
+ T AW AW b n/a 33 4301 4420 4502 N
+ T AW AW e n/a 33 4301 4384 4520 N
+ T AW AW i n/a 33 4301 4432 4502 N
+ T AW AW s n/a 33 4301 4431 4502 N
+ T AW AY b n/a 33 4301 4420 4500 N
+ T AW AY e n/a 33 4301 4385 4495 N
+ T AW AY s n/a 33 4301 4432 4500 N
+ T AW B b n/a 33 4301 4396 4548 N
+ T AW B e n/a 33 4301 4396 4548 N
+ T AW B i n/a 33 4301 4396 4548 N
+ T AW B s n/a 33 4301 4396 4548 N
+ T AW CH e n/a 33 4301 4394 4548 N
+ T AW CH s n/a 33 4301 4394 4548 N
+ T AW D e n/a 33 4296 4396 4548 N
+ T AW D i n/a 33 4296 4396 4548 N
+ T AW D s n/a 33 4296 4396 4548 N
+ T AW DH e n/a 33 4296 4395 4547 N
+ T AW DH s n/a 33 4296 4395 4547 N
+ T AW EH b n/a 33 4301 4415 4502 N
+ T AW EH e n/a 33 4301 4384 4517 N
+ T AW EH i n/a 33 4301 4432 4502 N
+ T AW EH s n/a 33 4301 4431 4502 N
+ T AW ER b n/a 33 4303 4417 4490 N
+ T AW ER e n/a 33 4303 4385 4487 N
+ T AW ER i n/a 33 4304 4453 4487 N
+ T AW ER s n/a 33 4303 4453 4487 N
+ T AW EY b n/a 33 4301 4415 4503 N
+ T AW EY e n/a 33 4301 4384 4517 N
+ T AW EY i n/a 33 4301 4432 4503 N
+ T AW EY s n/a 33 4301 4431 4503 N
+ T AW F b n/a 33 4301 4394 4539 N
+ T AW F e n/a 33 4301 4394 4539 N
+ T AW F i n/a 33 4301 4394 4539 N
+ T AW F s n/a 33 4301 4394 4539 N
+ T AW G b n/a 33 4301 4396 4548 N
+ T AW G e n/a 33 4301 4396 4548 N
+ T AW G i n/a 33 4301 4396 4548 N
+ T AW G s n/a 33 4301 4396 4548 N
+ T AW HH e n/a 33 4301 4397 4554 N
+ T AW HH i n/a 33 4301 4397 4554 N
+ T AW HH s n/a 33 4301 4397 4554 N
+ T AW IH b n/a 33 4303 4416 4472 N
+ T AW IH e n/a 33 4303 4384 4515 N
+ T AW IH i n/a 33 4304 4456 4512 N
+ T AW IH s n/a 33 4303 4456 4515 N
+ T AW IY b n/a 33 4301 4415 4511 N
+ T AW IY e n/a 33 4301 4384 4510 N
+ T AW IY i n/a 33 4301 4455 4510 N
+ T AW IY s n/a 33 4301 4455 4511 N
+ T AW JH e n/a 33 4301 4396 4548 N
+ T AW JH i n/a 33 4301 4396 4548 N
+ T AW JH s n/a 33 4301 4396 4548 N
+ T AW K e n/a 33 4301 4394 4548 N
+ T AW K i n/a 33 4301 4394 4548 N
+ T AW K s n/a 33 4301 4394 4548 N
+ T AW L b n/a 33 4301 4425 4494 N
+ T AW L e n/a 33 4301 4390 4561 N
+ T AW L i n/a 33 4301 4434 4494 N
+ T AW L s n/a 33 4301 4434 4494 N
+ T AW M b n/a 33 4301 4396 4566 N
+ T AW M e n/a 33 4301 4396 4566 N
+ T AW M i n/a 33 4301 4396 4566 N
+ T AW M s n/a 33 4301 4396 4566 N
+ T AW N b n/a 33 4296 4396 4566 N
+ T AW N e n/a 33 4296 4396 4566 N
+ T AW N i n/a 33 4296 4396 4566 N
+ T AW N s n/a 33 4296 4396 4566 N
+ T AW NG b n/a 33 4301 4396 4566 N
+ T AW NG e n/a 33 4301 4396 4566 N
+ T AW NG s n/a 33 4301 4396 4566 N
+ T AW OW b n/a 33 4301 4417 4491 N
+ T AW OW e n/a 33 4301 4385 4493 N
+ T AW OW i n/a 33 4301 4432 4492 N
+ T AW OW s n/a 33 4301 4432 4493 N
+ T AW OY b n/a 33 4301 4420 4501 N
+ T AW OY e n/a 33 4301 4385 4495 N
+ T AW OY s n/a 33 4301 4432 4501 N
+ T AW P e n/a 33 4301 4394 4547 N
+ T AW P i n/a 33 4301 4394 4547 N
+ T AW P s n/a 33 4301 4394 4547 N
+ T AW R b n/a 33 4301 4424 4481 N
+ T AW R e n/a 33 4301 4390 4562 N
+ T AW R i n/a 33 4301 4431 4481 N
+ T AW R s n/a 33 4301 4431 4481 N
+ T AW S b n/a 33 4296 4394 4539 N
+ T AW S e n/a 33 4296 4394 4539 N
+ T AW S i n/a 33 4296 4394 4539 N
+ T AW S s n/a 33 4296 4394 4539 N
+ T AW SH b n/a 33 4301 4394 4540 N
+ T AW SH e n/a 33 4301 4394 4540 N
+ T AW SH i n/a 33 4301 4394 4540 N
+ T AW SH s n/a 33 4301 4394 4540 N
+ T AW SIL e n/a 33 4301 4445 4556 N
+ T AW SIL s n/a 33 4301 4445 4556 N
+ T AW T b n/a 33 4296 4395 4547 N
+ T AW T e n/a 33 4296 4395 4547 N
+ T AW T i n/a 33 4296 4395 4547 N
+ T AW T s n/a 33 4296 4395 4547 N
+ T AW TH e n/a 33 4296 4394 4539 N
+ T AW TH s n/a 33 4296 4394 4539 N
+ T AW UH b n/a 33 4301 4417 4475 N
+ T AW UH e n/a 33 4301 4384 4475 N
+ T AW UH s n/a 33 4301 4461 4475 N
+ T AW UW b n/a 33 4301 4417 4479 N
+ T AW UW e n/a 33 4301 4384 4479 N
+ T AW UW i n/a 33 4301 4461 4480 N
+ T AW UW s n/a 33 4301 4461 4479 N
+ T AW V b n/a 33 4301 4396 4548 N
+ T AW V e n/a 33 4301 4396 4548 N
+ T AW V i n/a 33 4301 4396 4548 N
+ T AW V s n/a 33 4301 4396 4548 N
+ T AW W b n/a 33 4301 4425 4483 N
+ T AW W e n/a 33 4301 4390 4563 N
+ T AW W i n/a 33 4301 4434 4482 N
+ T AW W s n/a 33 4301 4434 4483 N
+ T AW Y b n/a 33 4301 4425 4511 N
+ T AW Y e n/a 33 4301 4383 4509 N
+ T AW Y i n/a 33 4301 4455 4510 N
+ T AW Y s n/a 33 4301 4455 4511 N
+ T AW Z b n/a 33 4296 4396 4548 N
+ T AW Z e n/a 33 4296 4396 4548 N
+ T AW Z i n/a 33 4296 4396 4548 N
+ T AW Z s n/a 33 4296 4396 4548 N
+ T AW ZH e n/a 33 4301 4396 4548 N
+ T AW ZH s n/a 33 4301 4396 4548 N
+ T AY AA b n/a 33 4345 4420 4500 N
+ T AY AA e n/a 33 4349 4387 4496 N
+ T AY AA i n/a 33 4348 4431 4500 N
+ T AY AA s n/a 33 4344 4431 4500 N
+ T AY AE b n/a 33 4345 4420 4502 N
+ T AY AE e n/a 33 4349 4380 4517 N
+ T AY AE i n/a 33 4350 4432 4502 N
+ T AY AE s n/a 33 4344 4431 4502 N
+ T AY AH b n/a 33 4345 4416 4473 N
+ T AY AH e n/a 33 4349 4380 4517 N
+ T AY AH i n/a 33 4348 4458 4524 N
+ T AY AH s n/a 33 4344 4458 4517 N
+ T AY AO b n/a 33 4345 4420 4501 N
+ T AY AO e n/a 33 4349 4387 4496 N
+ T AY AO i n/a 33 4348 4431 4501 N
+ T AY AO s n/a 33 4344 4431 4501 N
+ T AY AW b n/a 33 4345 4420 4502 N
+ T AY AW e n/a 33 4349 4380 4519 N
+ T AY AW i n/a 33 4348 4432 4502 N
+ T AY AW s n/a 33 4344 4431 4502 N
+ T AY AY b n/a 33 4345 4420 4500 N
+ T AY AY e n/a 33 4349 4386 4496 N
+ T AY AY s n/a 33 4344 4431 4500 N
+ T AY B b n/a 33 4346 4403 4544 N
+ T AY B e n/a 33 4346 4403 4544 N
+ T AY B i n/a 33 4346 4403 4544 N
+ T AY B s n/a 33 4346 4403 4544 N
+ T AY CH e n/a 33 4346 4403 4544 N
+ T AY CH s n/a 33 4346 4403 4544 N
+ T AY D e n/a 33 4346 4403 4544 N
+ T AY D i n/a 33 4346 4403 4544 N
+ T AY D s n/a 33 4346 4403 4544 N
+ T AY DH e n/a 33 4351 4403 4544 N
+ T AY DH s n/a 33 4351 4403 4544 N
+ T AY EH b n/a 33 4345 4415 4502 N
+ T AY EH e n/a 33 4349 4380 4517 N
+ T AY EH i n/a 33 4350 4432 4502 N
+ T AY EH s n/a 33 4344 4431 4502 N
+ T AY ER b n/a 33 4345 4417 4490 N
+ T AY ER e n/a 33 4349 4387 4487 N
+ T AY ER i n/a 33 4348 4448 4487 N
+ T AY ER s n/a 33 4344 4448 4487 N
+ T AY EY b n/a 33 4345 4415 4503 N
+ T AY EY e n/a 33 4349 4380 4517 N
+ T AY EY i n/a 33 4350 4432 4503 N
+ T AY EY s n/a 33 4344 4431 4503 N
+ T AY F b n/a 33 4351 4403 4535 N
+ T AY F e n/a 33 4351 4403 4535 N
+ T AY F i n/a 33 4346 4403 4535 N
+ T AY F s n/a 33 4351 4403 4535 N
+ T AY G b n/a 33 4346 4403 4544 N
+ T AY G e n/a 33 4346 4403 4544 N
+ T AY G i n/a 33 4346 4403 4544 N
+ T AY G s n/a 33 4346 4403 4544 N
+ T AY HH e n/a 33 4349 4382 4554 N
+ T AY HH i n/a 33 4346 4382 4554 N
+ T AY HH s n/a 33 4349 4382 4554 N
+ T AY IH b n/a 33 4345 4416 4472 N
+ T AY IH e n/a 33 4349 4380 4516 N
+ T AY IH i n/a 33 4348 4458 4516 N
+ T AY IH s n/a 33 4344 4458 4516 N
+ T AY IY b n/a 33 4345 4415 4508 N
+ T AY IY e n/a 33 4349 4380 4510 N
+ T AY IY i n/a 33 4350 4455 4508 N
+ T AY IY s n/a 33 4344 4455 4508 N
+ T AY JH e n/a 33 4346 4403 4544 N
+ T AY JH s n/a 33 4346 4403 4544 N
+ T AY K e n/a 33 4346 4403 4544 N
+ T AY K i n/a 33 4346 4403 4544 N
+ T AY K s n/a 33 4346 4403 4544 N
+ T AY L b n/a 33 4345 4425 4494 N
+ T AY L e n/a 33 4349 4392 4561 N
+ T AY L i n/a 33 4346 4433 4494 N
+ T AY L s n/a 33 4344 4433 4494 N
+ T AY M b n/a 33 4349 4392 4565 N
+ T AY M e n/a 33 4349 4392 4565 N
+ T AY M i n/a 33 4346 4392 4565 N
+ T AY M s n/a 33 4349 4392 4565 N
+ T AY N b n/a 33 4349 4392 4565 N
+ T AY N e n/a 33 4349 4392 4565 N
+ T AY N i n/a 33 4346 4392 4565 N
+ T AY N s n/a 33 4349 4392 4565 N
+ T AY NG b n/a 33 4349 4392 4565 N
+ T AY NG e n/a 33 4349 4392 4565 N
+ T AY NG s n/a 33 4349 4392 4565 N
+ T AY OW b n/a 33 4345 4417 4491 N
+ T AY OW e n/a 33 4349 4387 4493 N
+ T AY OW i n/a 33 4348 4431 4493 N
+ T AY OW s n/a 33 4344 4431 4493 N
+ T AY OY b n/a 33 4345 4420 4501 N
+ T AY OY e n/a 33 4349 4386 4496 N
+ T AY OY s n/a 33 4344 4431 4501 N
+ T AY P e n/a 33 4346 4403 4544 N
+ T AY P i n/a 33 4346 4403 4544 N
+ T AY P s n/a 33 4346 4403 4544 N
+ T AY R b n/a 33 4345 4424 4481 N
+ T AY R e n/a 33 4349 4392 4562 N
+ T AY R i n/a 33 4346 4430 4481 N
+ T AY R s n/a 33 4344 4430 4481 N
+ T AY S b n/a 33 4351 4403 4537 N
+ T AY S e n/a 33 4351 4403 4537 N
+ T AY S i n/a 33 4346 4403 4537 N
+ T AY S s n/a 33 4351 4403 4537 N
+ T AY SH b n/a 33 4351 4403 4540 N
+ T AY SH e n/a 33 4351 4403 4540 N
+ T AY SH i n/a 33 4346 4403 4540 N
+ T AY SH s n/a 33 4351 4403 4540 N
+ T AY SIL e n/a 33 4350 4446 4559 N
+ T AY SIL s n/a 33 4350 4446 4559 N
+ T AY T b n/a 33 4346 4403 4544 N
+ T AY T e n/a 33 4346 4403 4544 N
+ T AY T i n/a 33 4346 4403 4544 N
+ T AY T s n/a 33 4346 4403 4544 N
+ T AY TH e n/a 33 4351 4403 4537 N
+ T AY TH s n/a 33 4351 4403 4537 N
+ T AY UH b n/a 33 4345 4417 4475 N
+ T AY UH e n/a 33 4349 4387 4475 N
+ T AY UH s n/a 33 4344 4461 4475 N
+ T AY UW b n/a 33 4345 4417 4480 N
+ T AY UW e n/a 33 4349 4387 4480 N
+ T AY UW i n/a 33 4347 4461 4480 N
+ T AY UW s n/a 33 4344 4461 4480 N
+ T AY V b n/a 33 4351 4403 4544 N
+ T AY V e n/a 33 4351 4403 4544 N
+ T AY V s n/a 33 4351 4403 4544 N
+ T AY W b n/a 33 4345 4425 4483 N
+ T AY W e n/a 33 4349 4392 4562 N
+ T AY W i n/a 33 4346 4433 4482 N
+ T AY W s n/a 33 4344 4433 4483 N
+ T AY Y b n/a 33 4345 4425 4508 N
+ T AY Y e n/a 33 4349 4383 4509 N
+ T AY Y i n/a 33 4350 4455 4508 N
+ T AY Y s n/a 33 4344 4455 4508 N
+ T AY Z b n/a 33 4351 4403 4544 N
+ T AY Z e n/a 33 4351 4403 4544 N
+ T AY Z i n/a 33 4346 4403 4544 N
+ T AY Z s n/a 33 4351 4403 4544 N
+ T AY ZH e n/a 33 4351 4403 4544 N
+ T AY ZH s n/a 33 4351 4403 4544 N
+ T B AA b n/a 33 4357 4408 4500 N
+ T B AA e n/a 33 4357 4408 4496 N
+ T B AA s n/a 33 4357 4408 4500 N
+ T B AE b n/a 33 4357 4409 4502 N
+ T B AE e n/a 33 4357 4409 4517 N
+ T B AE i n/a 33 4357 4409 4502 N
+ T B AE s n/a 33 4357 4409 4502 N
+ T B AH b n/a 33 4357 4406 4474 N
+ T B AH e n/a 33 4357 4406 4518 N
+ T B AH i n/a 33 4357 4406 4504 N
+ T B AH s n/a 33 4357 4406 4506 N
+ T B AO b n/a 33 4357 4408 4501 N
+ T B AO e n/a 33 4357 4408 4496 N
+ T B AO s n/a 33 4357 4408 4501 N
+ T B AW b n/a 33 4357 4409 4502 N
+ T B AW e n/a 33 4357 4409 4518 N
+ T B AW s n/a 33 4357 4409 4502 N
+ T B AY b n/a 33 4357 4408 4500 N
+ T B AY e n/a 33 4357 4408 4496 N
+ T B AY i n/a 33 4357 4408 4500 N
+ T B AY s n/a 33 4357 4408 4500 N
+ T B B b n/a 33 4357 4409 4552 N
+ T B B e n/a 33 4357 4436 4552 N
+ T B B s n/a 33 4357 4436 4552 N
+ T B CH e n/a 33 4357 4436 4552 N
+ T B CH s n/a 33 4357 4436 4552 N
+ T B D e n/a 33 4357 4436 4552 N
+ T B D s n/a 33 4357 4436 4552 N
+ T B DH e n/a 33 4357 4436 4552 N
+ T B DH s n/a 33 4357 4436 4552 N
+ T B EH b n/a 33 4357 4409 4502 N
+ T B EH e n/a 33 4357 4409 4517 N
+ T B EH i n/a 33 4357 4409 4502 N
+ T B EH s n/a 33 4357 4409 4502 N
+ T B ER b n/a 33 4358 4408 4490 N
+ T B ER e n/a 33 4358 4408 4488 N
+ T B ER i n/a 33 4358 4408 4488 N
+ T B ER s n/a 33 4358 4408 4488 N
+ T B EY b n/a 33 4357 4409 4503 N
+ T B EY e n/a 33 4357 4409 4517 N
+ T B EY i n/a 33 4357 4409 4503 N
+ T B EY s n/a 33 4357 4409 4503 N
+ T B F b n/a 33 4357 4409 4552 N
+ T B F e n/a 33 4357 4438 4552 N
+ T B F s n/a 33 4357 4438 4552 N
+ T B G b n/a 33 4357 4409 4552 N
+ T B G e n/a 33 4357 4436 4552 N
+ T B G s n/a 33 4357 4436 4552 N
+ T B HH e n/a 33 4357 4437 4554 N
+ T B HH s n/a 33 4357 4437 4554 N
+ T B IH b n/a 33 4357 4406 4472 N
+ T B IH e n/a 33 4357 4406 4506 N
+ T B IH s n/a 33 4357 4406 4506 N
+ T B IY b n/a 33 4357 4409 4508 N
+ T B IY e n/a 33 4357 4409 4510 N
+ T B IY s n/a 33 4357 4409 4508 N
+ T B JH e n/a 33 4357 4436 4552 N
+ T B JH s n/a 33 4357 4436 4552 N
+ T B K e n/a 33 4357 4436 4552 N
+ T B K s n/a 33 4357 4436 4552 N
+ T B L b n/a 33 4357 4425 4494 N
+ T B L e n/a 33 4357 4423 4561 N
+ T B L s n/a 33 4357 4423 4494 N
+ T B M b n/a 33 4357 4409 4565 N
+ T B M e n/a 33 4357 4434 4565 N
+ T B M s n/a 33 4357 4434 4565 N
+ T B N b n/a 33 4357 4409 4565 N
+ T B N e n/a 33 4357 4434 4565 N
+ T B N s n/a 33 4357 4434 4565 N
+ T B NG b n/a 33 4357 4409 4565 N
+ T B NG e n/a 33 4357 4434 4565 N
+ T B NG s n/a 33 4357 4434 4565 N
+ T B OW b n/a 33 4357 4408 4491 N
+ T B OW e n/a 33 4357 4408 4493 N
+ T B OW s n/a 33 4357 4408 4493 N
+ T B OY b n/a 33 4357 4408 4501 N
+ T B OY e n/a 33 4357 4408 4496 N
+ T B OY s n/a 33 4357 4408 4501 N
+ T B P e n/a 33 4357 4436 4552 N
+ T B P s n/a 33 4357 4436 4552 N
+ T B R b n/a 33 4364 4424 4481 N
+ T B R e n/a 33 4364 4424 4562 N
+ T B R i n/a 33 4364 4424 4481 N
+ T B R s n/a 33 4364 4424 4481 N
+ T B S b n/a 33 4357 4409 4532 N
+ T B S e n/a 33 4357 4438 4532 N
+ T B S i n/a 33 4357 4438 4532 N
+ T B S s n/a 33 4357 4438 4532 N
+ T B SH b n/a 33 4357 4409 4540 N
+ T B SH e n/a 33 4357 4438 4540 N
+ T B SH s n/a 33 4357 4438 4540 N
+ T B SIL e n/a 33 4357 4428 4558 N
+ T B SIL s n/a 33 4357 4428 4558 N
+ T B T b n/a 33 4357 4409 4552 N
+ T B T e n/a 33 4357 4436 4552 N
+ T B T s n/a 33 4357 4436 4552 N
+ T B TH e n/a 33 4357 4438 4552 N
+ T B TH s n/a 33 4357 4438 4552 N
+ T B UH b n/a 33 4357 4408 4475 N
+ T B UH e n/a 33 4357 4408 4475 N
+ T B UH i n/a 33 4356 4408 4475 N
+ T B UH s n/a 33 4357 4408 4475 N
+ T B UW b n/a 33 4357 4407 4479 N
+ T B UW e n/a 33 4357 4407 4479 N
+ T B UW i n/a 33 4356 4407 4479 N
+ T B UW s n/a 33 4357 4407 4479 N
+ T B V b n/a 33 4357 4409 4552 N
+ T B V e n/a 33 4357 4436 4552 N
+ T B V s n/a 33 4357 4436 4552 N
+ T B W b n/a 33 4357 4425 4483 N
+ T B W e n/a 33 4357 4423 4563 N
+ T B W s n/a 33 4357 4423 4483 N
+ T B Y b n/a 33 4357 4425 4508 N
+ T B Y e n/a 33 4357 4425 4509 N
+ T B Y s n/a 33 4357 4425 4508 N
+ T B Z b n/a 33 4357 4409 4552 N
+ T B Z e n/a 33 4357 4436 4552 N
+ T B Z s n/a 33 4357 4436 4552 N
+ T B ZH e n/a 33 4357 4436 4552 N
+ T B ZH s n/a 33 4357 4436 4552 N
+ T CH AA b n/a 33 4360 4408 4500 N
+ T CH AA e n/a 33 4353 4466 4498 N
+ T CH AA s n/a 33 4360 4466 4500 N
+ T CH AE b n/a 33 4361 4409 4502 N
+ T CH AE e n/a 33 4353 4466 4527 N
+ T CH AE s n/a 33 4361 4466 4502 N
+ T CH AH b n/a 33 4360 4406 4474 N
+ T CH AH e n/a 33 4353 4466 4528 N
+ T CH AH i n/a 33 4360 4466 4530 N
+ T CH AH s n/a 33 4360 4466 4529 N
+ T CH AO b n/a 33 4360 4408 4501 N
+ T CH AO e n/a 33 4353 4466 4498 N
+ T CH AO s n/a 33 4360 4466 4501 N
+ T CH AW b n/a 33 4361 4409 4502 N
+ T CH AW e n/a 33 4353 4466 4527 N
+ T CH AW s n/a 33 4361 4466 4502 N
+ T CH AY b n/a 33 4360 4408 4500 N
+ T CH AY e n/a 33 4353 4467 4496 N
+ T CH AY i n/a 33 4360 4467 4500 N
+ T CH AY s n/a 33 4360 4467 4500 N
+ T CH B b n/a 33 4360 4409 4551 N
+ T CH B e n/a 33 4353 4441 4551 N
+ T CH B i n/a 33 4360 4441 4551 N
+ T CH B s n/a 33 4360 4441 4551 N
+ T CH CH e n/a 33 4353 4441 4550 N
+ T CH CH s n/a 33 4360 4441 4550 N
+ T CH D e n/a 33 4355 4439 4551 N
+ T CH D s n/a 33 4360 4439 4551 N
+ T CH DH e n/a 33 4355 4439 4551 N
+ T CH DH s n/a 33 4360 4439 4551 N
+ T CH EH b n/a 33 4361 4409 4502 N
+ T CH EH e n/a 33 4353 4466 4527 N
+ T CH EH i n/a 33 4361 4466 4502 N
+ T CH EH s n/a 33 4361 4466 4502 N
+ T CH ER b n/a 33 4364 4408 4490 N
+ T CH ER e n/a 33 4364 4470 4488 N
+ T CH ER i n/a 33 4364 4470 4485 N
+ T CH ER s n/a 33 4364 4470 4488 N
+ T CH EY b n/a 33 4361 4409 4503 N
+ T CH EY e n/a 33 4353 4467 4527 N
+ T CH EY s n/a 33 4361 4467 4503 N
+ T CH F b n/a 33 4360 4409 4549 N
+ T CH F e n/a 33 4353 4442 4549 N
+ T CH F s n/a 33 4360 4442 4549 N
+ T CH G b n/a 33 4360 4409 4549 N
+ T CH G e n/a 33 4353 4441 4549 N
+ T CH G s n/a 33 4360 4441 4549 N
+ T CH HH e n/a 33 4353 4442 4555 N
+ T CH HH s n/a 33 4360 4442 4555 N
+ T CH IH b n/a 33 4360 4406 4472 N
+ T CH IH e n/a 33 4353 4466 4506 N
+ T CH IH i n/a 33 4360 4466 4507 N
+ T CH IH s n/a 33 4360 4466 4506 N
+ T CH IY b n/a 33 4361 4409 4508 N
+ T CH IY e n/a 33 4353 4467 4510 N
+ T CH IY i n/a 33 4361 4467 4508 N
+ T CH IY s n/a 33 4361 4467 4508 N
+ T CH JH e n/a 33 4353 4441 4550 N
+ T CH JH s n/a 33 4360 4441 4550 N
+ T CH K e n/a 33 4353 4441 4549 N
+ T CH K s n/a 33 4360 4441 4549 N
+ T CH L b n/a 33 4360 4425 4494 N
+ T CH L e n/a 33 4353 4443 4564 N
+ T CH L i n/a 33 4360 4443 4494 N
+ T CH L s n/a 33 4360 4443 4494 N
+ T CH M b n/a 33 4360 4409 4567 N
+ T CH M e n/a 33 4353 4443 4567 N
+ T CH M s n/a 33 4360 4443 4567 N
+ T CH N b n/a 33 4360 4409 4567 N
+ T CH N e n/a 33 4355 4443 4567 N
+ T CH N s n/a 33 4360 4443 4567 N
+ T CH NG b n/a 33 4360 4409 4567 N
+ T CH NG e n/a 33 4353 4443 4567 N
+ T CH NG s n/a 33 4360 4443 4567 N
+ T CH OW b n/a 33 4360 4408 4491 N
+ T CH OW e n/a 33 4353 4466 4493 N
+ T CH OW i n/a 33 4360 4466 4491 N
+ T CH OW s n/a 33 4360 4466 4493 N
+ T CH OY b n/a 33 4360 4408 4501 N
+ T CH OY e n/a 33 4353 4467 4496 N
+ T CH OY s n/a 33 4360 4467 4501 N
+ T CH P e n/a 33 4353 4441 4551 N
+ T CH P s n/a 33 4360 4441 4551 N
+ T CH R b n/a 33 4364 4424 4481 N
+ T CH R e n/a 33 4362 4470 4564 N
+ T CH R i n/a 33 4364 4470 4481 N
+ T CH R s n/a 33 4364 4470 4481 N
+ T CH S b n/a 33 4360 4409 4536 N
+ T CH S e n/a 33 4354 4440 4536 N
+ T CH S s n/a 33 4360 4440 4536 N
+ T CH SH b n/a 33 4360 4409 4540 N
+ T CH SH e n/a 33 4353 4442 4540 N
+ T CH SH s n/a 33 4360 4442 4540 N
+ T CH SIL e n/a 33 4360 4428 4558 N
+ T CH SIL s n/a 33 4360 4428 4558 N
+ T CH T b n/a 33 4360 4409 4550 N
+ T CH T e n/a 33 4355 4439 4550 N
+ T CH T s n/a 33 4360 4439 4550 N
+ T CH TH e n/a 33 4355 4439 4551 N
+ T CH TH s n/a 33 4360 4439 4551 N
+ T CH UH b n/a 33 4360 4408 4475 N
+ T CH UH e n/a 33 4353 4466 4475 N
+ T CH UH s n/a 33 4360 4466 4475 N
+ T CH UW b n/a 33 4360 4407 4479 N
+ T CH UW e n/a 33 4353 4466 4479 N
+ T CH UW s n/a 33 4360 4466 4479 N
+ T CH V b n/a 33 4360 4409 4551 N
+ T CH V e n/a 33 4353 4442 4551 N
+ T CH V s n/a 33 4360 4442 4551 N
+ T CH W b n/a 33 4360 4425 4483 N
+ T CH W e n/a 33 4353 4443 4564 N
+ T CH W s n/a 33 4360 4443 4483 N
+ T CH Y b n/a 33 4361 4425 4508 N
+ T CH Y e n/a 33 4353 4455 4508 N
+ T CH Y s n/a 33 4361 4455 4508 N
+ T CH Z b n/a 33 4360 4409 4551 N
+ T CH Z e n/a 33 4354 4439 4551 N
+ T CH Z s n/a 33 4360 4439 4551 N
+ T CH ZH e n/a 33 4353 4442 4551 N
+ T CH ZH s n/a 33 4360 4442 4551 N
+ T D AA b n/a 33 4369 4408 4500 N
+ T D AA e n/a 33 4369 4408 4496 N
+ T D AA i n/a 33 4369 4408 4500 N
+ T D AA s n/a 33 4369 4408 4500 N
+ T D AE b n/a 33 4369 4409 4502 N
+ T D AE e n/a 33 4369 4409 4517 N
+ T D AE i n/a 33 4369 4409 4502 N
+ T D AE s n/a 33 4369 4409 4502 N
+ T D AH b n/a 33 4369 4406 4474 N
+ T D AH e n/a 33 4369 4406 4518 N
+ T D AH i n/a 33 4369 4406 4505 N
+ T D AH s n/a 33 4369 4406 4506 N
+ T D AO b n/a 33 4369 4408 4501 N
+ T D AO e n/a 33 4369 4408 4496 N
+ T D AO s n/a 33 4369 4408 4501 N
+ T D AW b n/a 33 4369 4409 4502 N
+ T D AW e n/a 33 4369 4409 4518 N
+ T D AW i n/a 33 4369 4409 4502 N
+ T D AW s n/a 33 4369 4409 4502 N
+ T D AY b n/a 33 4369 4408 4500 N
+ T D AY e n/a 33 4369 4408 4496 N
+ T D AY i n/a 33 4369 4408 4500 N
+ T D AY s n/a 33 4369 4408 4500 N
+ T D B b n/a 33 4369 4409 4552 N
+ T D B e n/a 33 4369 4436 4552 N
+ T D B s n/a 33 4369 4436 4552 N
+ T D CH e n/a 33 4369 4436 4552 N
+ T D CH s n/a 33 4369 4436 4552 N
+ T D D e n/a 33 4369 4436 4552 N
+ T D D s n/a 33 4369 4436 4552 N
+ T D DH e n/a 33 4369 4436 4552 N
+ T D DH s n/a 33 4369 4436 4552 N
+ T D EH b n/a 33 4369 4409 4502 N
+ T D EH e n/a 33 4369 4409 4517 N
+ T D EH i n/a 33 4369 4409 4502 N
+ T D EH s n/a 33 4369 4409 4502 N
+ T D ER b n/a 33 4369 4408 4490 N
+ T D ER e n/a 33 4369 4408 4488 N
+ T D ER i n/a 33 4369 4408 4488 N
+ T D ER s n/a 33 4369 4408 4488 N
+ T D EY b n/a 33 4369 4409 4503 N
+ T D EY e n/a 33 4369 4409 4517 N
+ T D EY i n/a 33 4369 4409 4503 N
+ T D EY s n/a 33 4369 4409 4503 N
+ T D F b n/a 33 4369 4409 4552 N
+ T D F e n/a 33 4369 4438 4552 N
+ T D F s n/a 33 4369 4438 4552 N
+ T D G b n/a 33 4369 4409 4552 N
+ T D G e n/a 33 4369 4436 4552 N
+ T D G s n/a 33 4369 4436 4552 N
+ T D HH e n/a 33 4369 4437 4554 N
+ T D HH s n/a 33 4369 4437 4554 N
+ T D IH b n/a 33 4369 4406 4472 N
+ T D IH e n/a 33 4369 4406 4506 N
+ T D IH s n/a 33 4369 4406 4506 N
+ T D IY b n/a 33 4369 4409 4508 N
+ T D IY e n/a 33 4369 4409 4510 N
+ T D IY s n/a 33 4369 4409 4508 N
+ T D JH e n/a 33 4369 4436 4552 N
+ T D JH s n/a 33 4369 4436 4552 N
+ T D K e n/a 33 4369 4436 4552 N
+ T D K s n/a 33 4369 4436 4552 N
+ T D L b n/a 33 4369 4426 4494 N
+ T D L e n/a 33 4369 4423 4561 N
+ T D L s n/a 33 4369 4423 4494 N
+ T D M b n/a 33 4369 4409 4565 N
+ T D M e n/a 33 4369 4434 4565 N
+ T D M s n/a 33 4369 4434 4565 N
+ T D N b n/a 33 4369 4409 4565 N
+ T D N e n/a 33 4369 4434 4565 N
+ T D N s n/a 33 4369 4434 4565 N
+ T D NG b n/a 33 4369 4409 4565 N
+ T D NG e n/a 33 4369 4434 4565 N
+ T D NG s n/a 33 4369 4434 4565 N
+ T D OW b n/a 33 4369 4408 4491 N
+ T D OW e n/a 33 4369 4408 4493 N
+ T D OW s n/a 33 4369 4408 4493 N
+ T D OY b n/a 33 4369 4408 4501 N
+ T D OY e n/a 33 4369 4408 4496 N
+ T D OY s n/a 33 4369 4408 4501 N
+ T D P e n/a 33 4369 4436 4552 N
+ T D P s n/a 33 4369 4436 4552 N
+ T D R b n/a 33 4369 4426 4481 N
+ T D R e n/a 33 4369 4423 4562 N
+ T D R i n/a 33 4369 4426 4481 N
+ T D R s n/a 33 4369 4426 4481 N
+ T D S b n/a 33 4369 4409 4534 N
+ T D S e n/a 33 4369 4438 4534 N
+ T D S i n/a 33 4369 4438 4534 N
+ T D S s n/a 33 4369 4438 4534 N
+ T D SH b n/a 33 4369 4409 4540 N
+ T D SH e n/a 33 4369 4438 4540 N
+ T D SH s n/a 33 4369 4438 4540 N
+ T D SIL e n/a 33 4369 4429 4558 N
+ T D SIL s n/a 33 4369 4429 4558 N
+ T D T b n/a 33 4369 4409 4552 N
+ T D T e n/a 33 4369 4436 4552 N
+ T D T s n/a 33 4369 4436 4552 N
+ T D TH e n/a 33 4369 4438 4552 N
+ T D TH s n/a 33 4369 4438 4552 N
+ T D UH b n/a 33 4369 4408 4475 N
+ T D UH e n/a 33 4369 4408 4475 N
+ T D UH s n/a 33 4369 4408 4475 N
+ T D UW b n/a 33 4369 4407 4479 N
+ T D UW e n/a 33 4369 4407 4479 N
+ T D UW s n/a 33 4369 4407 4479 N
+ T D V b n/a 33 4369 4409 4552 N
+ T D V e n/a 33 4369 4436 4552 N
+ T D V s n/a 33 4369 4436 4552 N
+ T D W b n/a 33 4369 4426 4483 N
+ T D W e n/a 33 4369 4423 4563 N
+ T D W s n/a 33 4369 4423 4483 N
+ T D Y b n/a 33 4369 4426 4508 N
+ T D Y e n/a 33 4369 4426 4509 N
+ T D Y s n/a 33 4369 4426 4508 N
+ T D Z b n/a 33 4369 4409 4552 N
+ T D Z e n/a 33 4369 4436 4552 N
+ T D Z s n/a 33 4369 4436 4552 N
+ T D ZH e n/a 33 4369 4436 4552 N
+ T D ZH s n/a 33 4369 4436 4552 N
+ T DH AA b n/a 33 4359 4420 4500 N
+ T DH AA s n/a 33 4359 4420 4500 N
+ T DH AE b n/a 33 4359 4420 4502 N
+ T DH AE s n/a 33 4359 4420 4502 N
+ T DH AH b n/a 33 4359 4419 4476 N
+ T DH AH s n/a 33 4359 4419 4506 N
+ T DH AO b n/a 33 4359 4420 4501 N
+ T DH AO s n/a 33 4359 4420 4501 N
+ T DH AW b n/a 33 4359 4420 4502 N
+ T DH AW s n/a 33 4359 4420 4502 N
+ T DH AY b n/a 33 4359 4420 4500 N
+ T DH AY s n/a 33 4359 4420 4500 N
+ T DH B b n/a 33 4359 4418 4552 N
+ T DH B s n/a 33 4359 4436 4552 N
+ T DH CH s n/a 33 4359 4436 4552 N
+ T DH D s n/a 33 4359 4436 4552 N
+ T DH DH s n/a 33 4359 4436 4552 N
+ T DH EH b n/a 33 4359 4418 4502 N
+ T DH EH s n/a 33 4359 4418 4502 N
+ T DH ER b n/a 33 4364 4418 4490 N
+ T DH ER s n/a 33 4364 4418 4488 N
+ T DH EY b n/a 33 4359 4418 4503 N
+ T DH EY s n/a 33 4359 4418 4503 N
+ T DH F b n/a 33 4359 4418 4552 N
+ T DH F s n/a 33 4359 4438 4552 N
+ T DH G b n/a 33 4359 4418 4552 N
+ T DH G s n/a 33 4359 4436 4552 N
+ T DH HH s n/a 33 4359 4437 4554 N
+ T DH IH b n/a 33 4359 4419 4472 N
+ T DH IH s n/a 33 4359 4419 4506 N
+ T DH IY b n/a 33 4359 4418 4508 N
+ T DH IY s n/a 33 4359 4418 4508 N
+ T DH JH s n/a 33 4359 4436 4552 N
+ T DH K s n/a 33 4359 4436 4552 N
+ T DH L b n/a 33 4359 4425 4494 N
+ T DH L s n/a 33 4359 4423 4494 N
+ T DH M b n/a 33 4359 4418 4565 N
+ T DH M s n/a 33 4359 4434 4565 N
+ T DH N b n/a 33 4359 4418 4565 N
+ T DH N s n/a 33 4359 4434 4565 N
+ T DH NG b n/a 33 4359 4418 4565 N
+ T DH NG s n/a 33 4359 4434 4565 N
+ T DH OW b n/a 33 4359 4418 4491 N
+ T DH OW s n/a 33 4359 4418 4493 N
+ T DH OY b n/a 33 4359 4420 4501 N
+ T DH OY s n/a 33 4359 4420 4501 N
+ T DH P s n/a 33 4359 4436 4552 N
+ T DH R b n/a 33 4364 4424 4481 N
+ T DH R s n/a 33 4364 4424 4481 N
+ T DH S b n/a 33 4359 4418 4532 N
+ T DH S s n/a 33 4359 4438 4532 N
+ T DH SH b n/a 33 4359 4418 4540 N
+ T DH SH s n/a 33 4359 4438 4540 N
+ T DH SIL s n/a 33 4359 4428 4558 N
+ T DH T b n/a 33 4359 4418 4552 N
+ T DH T s n/a 33 4359 4436 4552 N
+ T DH TH s n/a 33 4359 4438 4552 N
+ T DH UH b n/a 33 4359 4418 4476 N
+ T DH UH s n/a 33 4359 4418 4476 N
+ T DH UW b n/a 33 4359 4418 4479 N
+ T DH UW s n/a 33 4359 4418 4479 N
+ T DH V b n/a 33 4359 4418 4552 N
+ T DH V s n/a 33 4359 4436 4552 N
+ T DH W b n/a 33 4359 4425 4483 N
+ T DH W s n/a 33 4359 4423 4483 N
+ T DH Y b n/a 33 4359 4425 4508 N
+ T DH Y s n/a 33 4359 4425 4508 N
+ T DH Z b n/a 33 4359 4418 4552 N
+ T DH Z s n/a 33 4359 4436 4552 N
+ T DH ZH s n/a 33 4359 4436 4552 N
+ T EH AA b n/a 33 4341 4420 4500 N
+ T EH AA e n/a 33 4312 4386 4496 N
+ T EH AA i n/a 33 4335 4432 4500 N
+ T EH AA s n/a 33 4341 4432 4500 N
+ T EH AE b n/a 33 4341 4420 4502 N
+ T EH AE e n/a 33 4312 4387 4517 N
+ T EH AE i n/a 33 4335 4432 4502 N
+ T EH AE s n/a 33 4341 4431 4502 N
+ T EH AH b n/a 33 4341 4415 4475 N
+ T EH AH e n/a 33 4312 4387 4519 N
+ T EH AH i n/a 33 4335 4450 4524 N
+ T EH AH s n/a 33 4341 4450 4519 N
+ T EH AO b n/a 33 4341 4420 4501 N
+ T EH AO e n/a 33 4312 4386 4496 N
+ T EH AO i n/a 33 4335 4432 4501 N
+ T EH AO s n/a 33 4341 4432 4501 N
+ T EH AW b n/a 33 4341 4420 4502 N
+ T EH AW e n/a 33 4312 4387 4519 N
+ T EH AW s n/a 33 4341 4431 4502 N
+ T EH AY b n/a 33 4341 4420 4500 N
+ T EH AY e n/a 33 4312 4386 4495 N
+ T EH AY i n/a 33 4335 4432 4500 N
+ T EH AY s n/a 33 4341 4432 4500 N
+ T EH B b n/a 33 4341 4399 4545 N
+ T EH B e n/a 33 4306 4399 4545 N
+ T EH B i n/a 33 4335 4399 4545 N
+ T EH B s n/a 33 4341 4399 4545 N
+ T EH CH e n/a 33 4305 4399 4545 N
+ T EH CH i n/a 33 4335 4399 4545 N
+ T EH CH s n/a 33 4341 4399 4545 N
+ T EH D e n/a 33 4306 4399 4545 N
+ T EH D i n/a 33 4335 4399 4545 N
+ T EH D s n/a 33 4335 4399 4545 N
+ T EH DH e n/a 33 4308 4398 4545 N
+ T EH DH s n/a 33 4341 4398 4545 N
+ T EH EH b n/a 33 4341 4415 4502 N
+ T EH EH e n/a 33 4312 4387 4517 N
+ T EH EH i n/a 33 4335 4432 4502 N
+ T EH EH s n/a 33 4341 4431 4502 N
+ T EH ER b n/a 33 4341 4417 4490 N
+ T EH ER e n/a 33 4312 4387 4488 N
+ T EH ER i n/a 33 4335 4452 4488 N
+ T EH ER s n/a 33 4341 4452 4488 N
+ T EH EY b n/a 33 4341 4415 4503 N
+ T EH EY e n/a 33 4312 4387 4517 N
+ T EH EY i n/a 33 4335 4432 4503 N
+ T EH EY s n/a 33 4341 4431 4503 N
+ T EH F b n/a 33 4341 4401 4535 N
+ T EH F e n/a 33 4306 4401 4535 N
+ T EH F i n/a 33 4335 4401 4535 N
+ T EH F s n/a 33 4341 4401 4535 N
+ T EH G b n/a 33 4341 4399 4545 N
+ T EH G e n/a 33 4305 4399 4545 N
+ T EH G s n/a 33 4341 4399 4545 N
+ T EH HH e n/a 33 4310 4382 4554 N
+ T EH HH i n/a 33 4335 4382 4554 N
+ T EH HH s n/a 33 4341 4382 4554 N
+ T EH IH b n/a 33 4341 4415 4472 N
+ T EH IH e n/a 33 4312 4379 4514 N
+ T EH IH i n/a 33 4335 4458 4514 N
+ T EH IH s n/a 33 4341 4458 4514 N
+ T EH IY b n/a 33 4341 4415 4508 N
+ T EH IY e n/a 33 4312 4379 4510 N
+ T EH IY i n/a 33 4335 4455 4510 N
+ T EH IY s n/a 33 4341 4455 4508 N
+ T EH JH e n/a 33 4305 4399 4545 N
+ T EH JH i n/a 33 4335 4399 4545 N
+ T EH JH s n/a 33 4341 4399 4545 N
+ T EH K e n/a 33 4305 4399 4545 N
+ T EH K i n/a 33 4335 4399 4545 N
+ T EH K s n/a 33 4341 4399 4545 N
+ T EH L b n/a 33 4341 4425 4494 N
+ T EH L e n/a 33 4298 4388 4561 N
+ T EH L i n/a 33 4335 4433 4494 N
+ T EH L s n/a 33 4341 4433 4494 N
+ T EH M b n/a 33 4341 4393 4566 N
+ T EH M e n/a 33 4310 4393 4566 N
+ T EH M i n/a 33 4335 4393 4566 N
+ T EH M s n/a 33 4341 4393 4566 N
+ T EH N b n/a 33 4335 4393 4566 N
+ T EH N e n/a 33 4310 4393 4566 N
+ T EH N i n/a 33 4335 4393 4566 N
+ T EH N s n/a 33 4335 4393 4566 N
+ T EH NG b n/a 33 4341 4393 4566 N
+ T EH NG e n/a 33 4310 4393 4566 N
+ T EH NG s n/a 33 4341 4393 4566 N
+ T EH OW b n/a 33 4341 4417 4491 N
+ T EH OW e n/a 33 4312 4386 4493 N
+ T EH OW i n/a 33 4335 4432 4491 N
+ T EH OW s n/a 33 4341 4432 4493 N
+ T EH OY b n/a 33 4341 4420 4501 N
+ T EH OY e n/a 33 4312 4386 4495 N
+ T EH OY i n/a 33 4335 4432 4501 N
+ T EH OY s n/a 33 4341 4432 4501 N
+ T EH P e n/a 33 4306 4399 4545 N
+ T EH P i n/a 33 4335 4399 4545 N
+ T EH P s n/a 33 4341 4399 4545 N
+ T EH R b n/a 33 4341 4424 4481 N
+ T EH R e n/a 33 4298 4388 4562 N
+ T EH R i n/a 33 4335 4430 4481 N
+ T EH R s n/a 33 4341 4430 4481 N
+ T EH S b n/a 33 4333 4401 4532 N
+ T EH S e n/a 33 4306 4401 4532 N
+ T EH S i n/a 33 4333 4401 4532 N
+ T EH S s n/a 33 4333 4401 4532 N
+ T EH SH b n/a 33 4341 4405 4540 N
+ T EH SH e n/a 33 4305 4405 4540 N
+ T EH SH i n/a 33 4332 4405 4540 N
+ T EH SH s n/a 33 4341 4405 4540 N
+ T EH SIL e n/a 33 4311 4444 4557 N
+ T EH SIL s n/a 33 4341 4444 4557 N
+ T EH T b n/a 33 4335 4399 4545 N
+ T EH T e n/a 33 4306 4399 4545 N
+ T EH T i n/a 33 4335 4399 4545 N
+ T EH T s n/a 33 4335 4399 4545 N
+ T EH TH e n/a 33 4307 4401 4532 N
+ T EH TH s n/a 33 4341 4401 4532 N
+ T EH UH b n/a 33 4341 4417 4475 N
+ T EH UH e n/a 33 4312 4387 4475 N
+ T EH UH i n/a 33 4335 4461 4475 N
+ T EH UH s n/a 33 4341 4461 4475 N
+ T EH UW b n/a 33 4341 4417 4480 N
+ T EH UW e n/a 33 4312 4386 4480 N
+ T EH UW i n/a 33 4335 4461 4480 N
+ T EH UW s n/a 33 4341 4461 4480 N
+ T EH V b n/a 33 4341 4399 4545 N
+ T EH V e n/a 33 4305 4399 4545 N
+ T EH V i n/a 33 4335 4399 4545 N
+ T EH V s n/a 33 4341 4399 4545 N
+ T EH W b n/a 33 4341 4425 4483 N
+ T EH W e n/a 33 4298 4388 4563 N
+ T EH W i n/a 33 4335 4433 4482 N
+ T EH W s n/a 33 4341 4433 4483 N
+ T EH Y b n/a 33 4341 4425 4508 N
+ T EH Y e n/a 33 4312 4383 4509 N
+ T EH Y i n/a 33 4335 4455 4510 N
+ T EH Y s n/a 33 4341 4455 4508 N
+ T EH Z b n/a 33 4333 4399 4545 N
+ T EH Z e n/a 33 4305 4399 4545 N
+ T EH Z i n/a 33 4333 4399 4545 N
+ T EH Z s n/a 33 4333 4399 4545 N
+ T EH ZH e n/a 33 4305 4399 4545 N
+ T EH ZH s n/a 33 4341 4399 4545 N
+ T ER AA b n/a 33 4338 4420 4500 N
+ T ER AA e n/a 33 4291 4386 4496 N
+ T ER AA i n/a 33 4338 4432 4500 N
+ T ER AA s n/a 33 4338 4432 4500 N
+ T ER AE b n/a 33 4338 4420 4502 N
+ T ER AE e n/a 33 4291 4387 4517 N
+ T ER AE i n/a 33 4338 4432 4502 N
+ T ER AE s n/a 33 4338 4431 4502 N
+ T ER AH b n/a 33 4338 4417 4473 N
+ T ER AH e n/a 33 4291 4387 4518 N
+ T ER AH i n/a 33 4337 4449 4523 N
+ T ER AH s n/a 33 4338 4449 4518 N
+ T ER AO b n/a 33 4338 4420 4501 N
+ T ER AO e n/a 33 4291 4386 4496 N
+ T ER AO i n/a 33 4338 4432 4501 N
+ T ER AO s n/a 33 4338 4432 4501 N
+ T ER AW b n/a 33 4338 4420 4502 N
+ T ER AW e n/a 33 4291 4387 4519 N
+ T ER AW i n/a 33 4338 4432 4502 N
+ T ER AW s n/a 33 4338 4431 4502 N
+ T ER AY b n/a 33 4338 4420 4500 N
+ T ER AY e n/a 33 4291 4386 4496 N
+ T ER AY i n/a 33 4338 4432 4500 N
+ T ER AY s n/a 33 4338 4432 4500 N
+ T ER B b n/a 33 4338 4399 4553 N
+ T ER B e n/a 33 4291 4399 4553 N
+ T ER B i n/a 33 4338 4399 4553 N
+ T ER B s n/a 33 4338 4399 4553 N
+ T ER CH e n/a 33 4291 4399 4553 N
+ T ER CH s n/a 33 4338 4399 4553 N
+ T ER D e n/a 33 4291 4399 4553 N
+ T ER D s n/a 33 4328 4399 4553 N
+ T ER DH e n/a 33 4292 4398 4553 N
+ T ER DH s n/a 33 4338 4398 4553 N
+ T ER EH b n/a 33 4338 4417 4502 N
+ T ER EH e n/a 33 4291 4387 4517 N
+ T ER EH i n/a 33 4338 4432 4502 N
+ T ER EH s n/a 33 4338 4431 4502 N
+ T ER ER b n/a 33 4338 4417 4490 N
+ T ER ER e n/a 33 4291 4387 4488 N
+ T ER ER i n/a 33 4337 4454 4488 N
+ T ER ER s n/a 33 4338 4454 4488 N
+ T ER EY b n/a 33 4338 4417 4503 N
+ T ER EY e n/a 33 4291 4387 4517 N
+ T ER EY i n/a 33 4338 4432 4503 N
+ T ER EY s n/a 33 4338 4431 4503 N
+ T ER F b n/a 33 4338 4401 4553 N
+ T ER F e n/a 33 4291 4401 4553 N
+ T ER F i n/a 33 4338 4401 4553 N
+ T ER F s n/a 33 4338 4401 4553 N
+ T ER G b n/a 33 4338 4399 4553 N
+ T ER G e n/a 33 4291 4399 4553 N
+ T ER G s n/a 33 4338 4399 4553 N
+ T ER HH e n/a 33 4291 4399 4554 N
+ T ER HH i n/a 33 4338 4399 4554 N
+ T ER HH s n/a 33 4338 4399 4554 N
+ T ER IH b n/a 33 4338 4417 4472 N
+ T ER IH e n/a 33 4291 4387 4515 N
+ T ER IH i n/a 33 4338 4461 4513 N
+ T ER IH s n/a 33 4338 4461 4515 N
+ T ER IY b n/a 33 4338 4417 4511 N
+ T ER IY e n/a 33 4291 4387 4510 N
+ T ER IY i n/a 33 4338 4462 4510 N
+ T ER IY s n/a 33 4338 4462 4511 N
+ T ER JH e n/a 33 4291 4399 4553 N
+ T ER JH s n/a 33 4338 4399 4553 N
+ T ER K e n/a 33 4291 4399 4553 N
+ T ER K i n/a 33 4338 4399 4553 N
+ T ER K s n/a 33 4338 4399 4553 N
+ T ER L b n/a 33 4338 4425 4494 N
+ T ER L e n/a 33 4291 4390 4561 N
+ T ER L i n/a 33 4338 4433 4494 N
+ T ER L s n/a 33 4338 4433 4494 N
+ T ER M b n/a 33 4338 4399 4566 N
+ T ER M e n/a 33 4291 4399 4566 N
+ T ER M i n/a 33 4338 4399 4566 N
+ T ER M s n/a 33 4338 4399 4566 N
+ T ER N b n/a 33 4328 4399 4566 N
+ T ER N e n/a 33 4291 4399 4566 N
+ T ER N i n/a 33 4328 4399 4566 N
+ T ER N s n/a 33 4328 4399 4566 N
+ T ER NG b n/a 33 4338 4399 4566 N
+ T ER NG e n/a 33 4291 4399 4566 N
+ T ER NG s n/a 33 4338 4399 4566 N
+ T ER OW b n/a 33 4338 4417 4491 N
+ T ER OW e n/a 33 4291 4386 4493 N
+ T ER OW i n/a 33 4338 4432 4491 N
+ T ER OW s n/a 33 4338 4432 4493 N
+ T ER OY b n/a 33 4338 4420 4501 N
+ T ER OY e n/a 33 4291 4386 4496 N
+ T ER OY s n/a 33 4338 4432 4501 N
+ T ER P e n/a 33 4291 4399 4553 N
+ T ER P i n/a 33 4338 4399 4553 N
+ T ER P s n/a 33 4338 4399 4553 N
+ T ER R b n/a 33 4338 4424 4481 N
+ T ER R e n/a 33 4291 4390 4562 N
+ T ER R i n/a 33 4338 4430 4481 N
+ T ER R s n/a 33 4338 4431 4481 N
+ T ER S b n/a 33 4332 4401 4538 N
+ T ER S e n/a 33 4291 4401 4538 N
+ T ER S i n/a 33 4332 4401 4538 N
+ T ER S s n/a 33 4332 4401 4538 N
+ T ER SH b n/a 33 4338 4405 4540 N
+ T ER SH e n/a 33 4291 4405 4540 N
+ T ER SH i n/a 33 4338 4405 4540 N
+ T ER SH s n/a 33 4338 4405 4540 N
+ T ER SIL e n/a 33 4292 4446 4558 N
+ T ER SIL s n/a 33 4338 4446 4558 N
+ T ER T b n/a 33 4328 4399 4553 N
+ T ER T e n/a 33 4292 4399 4553 N
+ T ER T s n/a 33 4328 4399 4553 N
+ T ER TH e n/a 33 4291 4401 4553 N
+ T ER TH s n/a 33 4338 4401 4553 N
+ T ER UH b n/a 33 4338 4417 4475 N
+ T ER UH e n/a 33 4291 4387 4475 N
+ T ER UH i n/a 33 4338 4461 4475 N
+ T ER UH s n/a 33 4338 4461 4475 N
+ T ER UW b n/a 33 4338 4417 4480 N
+ T ER UW e n/a 33 4291 4386 4480 N
+ T ER UW i n/a 33 4338 4461 4480 N
+ T ER UW s n/a 33 4338 4461 4480 N
+ T ER V b n/a 33 4338 4399 4553 N
+ T ER V e n/a 33 4291 4399 4553 N
+ T ER V i n/a 33 4338 4399 4553 N
+ T ER V s n/a 33 4338 4399 4553 N
+ T ER W b n/a 33 4338 4425 4483 N
+ T ER W e n/a 33 4291 4390 4563 N
+ T ER W i n/a 33 4338 4433 4482 N
+ T ER W s n/a 33 4338 4433 4483 N
+ T ER Y b n/a 33 4338 4425 4511 N
+ T ER Y e n/a 33 4291 4383 4509 N
+ T ER Y i n/a 33 4338 4462 4510 N
+ T ER Y s n/a 33 4338 4462 4511 N
+ T ER Z b n/a 33 4332 4399 4553 N
+ T ER Z e n/a 33 4292 4399 4553 N
+ T ER Z i n/a 33 4332 4399 4553 N
+ T ER Z s n/a 33 4332 4399 4553 N
+ T ER ZH e n/a 33 4291 4399 4553 N
+ T ER ZH s n/a 33 4338 4399 4553 N
+ T EY AA b n/a 33 4345 4420 4500 N
+ T EY AA e n/a 33 4349 4387 4496 N
+ T EY AA i n/a 33 4347 4432 4500 N
+ T EY AA s n/a 33 4344 4432 4500 N
+ T EY AE b n/a 33 4345 4420 4502 N
+ T EY AE e n/a 33 4349 4380 4517 N
+ T EY AE i n/a 33 4350 4432 4502 N
+ T EY AE s n/a 33 4344 4431 4502 N
+ T EY AH b n/a 33 4345 4416 4473 N
+ T EY AH e n/a 33 4349 4380 4517 N
+ T EY AH i n/a 33 4347 4457 4521 N
+ T EY AH s n/a 33 4344 4457 4517 N
+ T EY AO b n/a 33 4345 4420 4501 N
+ T EY AO e n/a 33 4349 4387 4496 N
+ T EY AO i n/a 33 4347 4432 4501 N
+ T EY AO s n/a 33 4344 4432 4501 N
+ T EY AW b n/a 33 4345 4420 4502 N
+ T EY AW e n/a 33 4349 4380 4519 N
+ T EY AW i n/a 33 4347 4432 4502 N
+ T EY AW s n/a 33 4344 4431 4502 N
+ T EY AY b n/a 33 4345 4420 4500 N
+ T EY AY e n/a 33 4349 4386 4495 N
+ T EY AY i n/a 33 4350 4432 4500 N
+ T EY AY s n/a 33 4344 4432 4500 N
+ T EY B b n/a 33 4350 4402 4546 N
+ T EY B e n/a 33 4350 4402 4546 N
+ T EY B i n/a 33 4346 4402 4546 N
+ T EY B s n/a 33 4350 4402 4546 N
+ T EY CH e n/a 33 4350 4402 4546 N
+ T EY CH s n/a 33 4350 4402 4546 N
+ T EY D e n/a 33 4351 4402 4546 N
+ T EY D s n/a 33 4351 4402 4546 N
+ T EY DH e n/a 33 4351 4402 4546 N
+ T EY DH s n/a 33 4351 4402 4546 N
+ T EY EH b n/a 33 4345 4415 4502 N
+ T EY EH e n/a 33 4349 4380 4517 N
+ T EY EH i n/a 33 4350 4432 4502 N
+ T EY EH s n/a 33 4344 4431 4502 N
+ T EY ER b n/a 33 4345 4417 4490 N
+ T EY ER e n/a 33 4349 4387 4487 N
+ T EY ER i n/a 33 4347 4448 4487 N
+ T EY ER s n/a 33 4344 4448 4487 N
+ T EY EY b n/a 33 4345 4415 4503 N
+ T EY EY e n/a 33 4349 4380 4517 N
+ T EY EY i n/a 33 4350 4432 4503 N
+ T EY EY s n/a 33 4344 4431 4503 N
+ T EY F b n/a 33 4350 4402 4535 N
+ T EY F e n/a 33 4350 4402 4535 N
+ T EY F i n/a 33 4346 4402 4535 N
+ T EY F s n/a 33 4350 4402 4535 N
+ T EY G b n/a 33 4350 4402 4546 N
+ T EY G e n/a 33 4350 4402 4546 N
+ T EY G i n/a 33 4346 4402 4546 N
+ T EY G s n/a 33 4350 4402 4546 N
+ T EY HH e n/a 33 4350 4383 4554 N
+ T EY HH i n/a 33 4346 4383 4554 N
+ T EY HH s n/a 33 4350 4383 4554 N
+ T EY IH b n/a 33 4345 4416 4472 N
+ T EY IH e n/a 33 4349 4380 4516 N
+ T EY IH i n/a 33 4347 4457 4516 N
+ T EY IH s n/a 33 4344 4457 4516 N
+ T EY IY b n/a 33 4345 4415 4508 N
+ T EY IY e n/a 33 4349 4380 4510 N
+ T EY IY i n/a 33 4350 4455 4508 N
+ T EY IY s n/a 33 4344 4455 4508 N
+ T EY JH e n/a 33 4350 4402 4546 N
+ T EY JH i n/a 33 4346 4402 4546 N
+ T EY JH s n/a 33 4350 4402 4546 N
+ T EY K e n/a 33 4351 4402 4546 N
+ T EY K i n/a 33 4346 4402 4546 N
+ T EY K s n/a 33 4351 4402 4546 N
+ T EY L b n/a 33 4345 4425 4494 N
+ T EY L e n/a 33 4349 4392 4561 N
+ T EY L i n/a 33 4346 4433 4494 N
+ T EY L s n/a 33 4344 4433 4494 N
+ T EY M b n/a 33 4350 4392 4565 N
+ T EY M e n/a 33 4350 4392 4565 N
+ T EY M i n/a 33 4346 4392 4565 N
+ T EY M s n/a 33 4350 4392 4565 N
+ T EY N b n/a 33 4350 4392 4565 N
+ T EY N e n/a 33 4350 4392 4565 N
+ T EY N i n/a 33 4346 4392 4565 N
+ T EY N s n/a 33 4350 4392 4565 N
+ T EY NG b n/a 33 4350 4392 4565 N
+ T EY NG e n/a 33 4350 4392 4565 N
+ T EY NG s n/a 33 4350 4392 4565 N
+ T EY OW b n/a 33 4345 4417 4491 N
+ T EY OW e n/a 33 4349 4387 4493 N
+ T EY OW i n/a 33 4347 4432 4492 N
+ T EY OW s n/a 33 4344 4432 4493 N
+ T EY OY b n/a 33 4345 4420 4501 N
+ T EY OY e n/a 33 4349 4386 4495 N
+ T EY OY s n/a 33 4344 4432 4501 N
+ T EY P e n/a 33 4351 4402 4546 N
+ T EY P i n/a 33 4346 4402 4546 N
+ T EY P s n/a 33 4351 4402 4546 N
+ T EY R b n/a 33 4345 4424 4481 N
+ T EY R e n/a 33 4349 4392 4562 N
+ T EY R i n/a 33 4346 4430 4481 N
+ T EY R s n/a 33 4344 4430 4481 N
+ T EY S b n/a 33 4351 4402 4533 N
+ T EY S e n/a 33 4351 4402 4533 N
+ T EY S i n/a 33 4346 4402 4533 N
+ T EY S s n/a 33 4351 4402 4533 N
+ T EY SH b n/a 33 4350 4402 4540 N
+ T EY SH e n/a 33 4350 4402 4540 N
+ T EY SH i n/a 33 4346 4402 4540 N
+ T EY SH s n/a 33 4350 4402 4540 N
+ T EY SIL e n/a 33 4350 4446 4559 N
+ T EY SIL s n/a 33 4350 4446 4559 N
+ T EY T b n/a 33 4351 4402 4546 N
+ T EY T e n/a 33 4351 4402 4546 N
+ T EY T s n/a 33 4351 4402 4546 N
+ T EY TH e n/a 33 4351 4402 4533 N
+ T EY TH i n/a 33 4346 4402 4533 N
+ T EY TH s n/a 33 4351 4402 4533 N
+ T EY UH b n/a 33 4345 4417 4475 N
+ T EY UH e n/a 33 4349 4387 4475 N
+ T EY UH s n/a 33 4344 4461 4475 N
+ T EY UW b n/a 33 4345 4417 4480 N
+ T EY UW e n/a 33 4349 4387 4480 N
+ T EY UW i n/a 33 4347 4461 4480 N
+ T EY UW s n/a 33 4344 4461 4480 N
+ T EY V b n/a 33 4350 4402 4546 N
+ T EY V e n/a 33 4350 4402 4546 N
+ T EY V s n/a 33 4350 4402 4546 N
+ T EY W b n/a 33 4345 4425 4483 N
+ T EY W e n/a 33 4349 4392 4562 N
+ T EY W i n/a 33 4346 4433 4482 N
+ T EY W s n/a 33 4344 4433 4483 N
+ T EY Y b n/a 33 4345 4425 4508 N
+ T EY Y e n/a 33 4349 4383 4509 N
+ T EY Y i n/a 33 4350 4455 4508 N
+ T EY Y s n/a 33 4344 4455 4508 N
+ T EY Z b n/a 33 4351 4402 4546 N
+ T EY Z e n/a 33 4351 4402 4546 N
+ T EY Z i n/a 33 4346 4402 4546 N
+ T EY Z s n/a 33 4351 4402 4546 N
+ T EY ZH e n/a 33 4350 4402 4546 N
+ T EY ZH s n/a 33 4350 4402 4546 N
+ T F AA b n/a 33 4357 4420 4500 N
+ T F AA e n/a 33 4357 4466 4498 N
+ T F AA i n/a 33 4357 4466 4500 N
+ T F AA s n/a 33 4357 4466 4500 N
+ T F AE b n/a 33 4357 4420 4502 N
+ T F AE e n/a 33 4357 4466 4527 N
+ T F AE i n/a 33 4357 4466 4502 N
+ T F AE s n/a 33 4357 4466 4502 N
+ T F AH b n/a 33 4357 4419 4476 N
+ T F AH e n/a 33 4357 4466 4528 N
+ T F AH i n/a 33 4357 4466 4530 N
+ T F AH s n/a 33 4357 4466 4529 N
+ T F AO b n/a 33 4357 4420 4501 N
+ T F AO e n/a 33 4357 4466 4498 N
+ T F AO i n/a 33 4357 4466 4501 N
+ T F AO s n/a 33 4357 4466 4501 N
+ T F AW b n/a 33 4357 4420 4502 N
+ T F AW e n/a 33 4357 4466 4527 N
+ T F AW s n/a 33 4357 4466 4502 N
+ T F AY b n/a 33 4357 4420 4500 N
+ T F AY e n/a 33 4357 4467 4496 N
+ T F AY i n/a 33 4357 4467 4500 N
+ T F AY s n/a 33 4357 4467 4500 N
+ T F B b n/a 33 4357 4418 4551 N
+ T F B e n/a 33 4357 4441 4551 N
+ T F B i n/a 33 4357 4441 4551 N
+ T F B s n/a 33 4357 4441 4551 N
+ T F CH e n/a 33 4357 4441 4550 N
+ T F CH s n/a 33 4357 4441 4550 N
+ T F D e n/a 33 4357 4439 4551 N
+ T F D i n/a 33 4357 4439 4551 N
+ T F D s n/a 33 4357 4439 4551 N
+ T F DH e n/a 33 4357 4439 4551 N
+ T F DH s n/a 33 4357 4439 4551 N
+ T F EH b n/a 33 4357 4418 4502 N
+ T F EH e n/a 33 4357 4466 4527 N
+ T F EH i n/a 33 4357 4466 4502 N
+ T F EH s n/a 33 4357 4466 4502 N
+ T F ER b n/a 33 4358 4419 4490 N
+ T F ER e n/a 33 4358 4470 4488 N
+ T F ER i n/a 33 4358 4470 4485 N
+ T F ER s n/a 33 4358 4470 4488 N
+ T F EY b n/a 33 4357 4418 4503 N
+ T F EY e n/a 33 4357 4467 4527 N
+ T F EY i n/a 33 4357 4467 4503 N
+ T F EY s n/a 33 4357 4467 4503 N
+ T F F b n/a 33 4357 4418 4549 N
+ T F F e n/a 33 4357 4442 4549 N
+ T F F s n/a 33 4357 4442 4549 N
+ T F G b n/a 33 4357 4418 4549 N
+ T F G e n/a 33 4357 4441 4549 N
+ T F G s n/a 33 4357 4441 4549 N
+ T F HH e n/a 33 4357 4442 4555 N
+ T F HH i n/a 33 4357 4442 4555 N
+ T F HH s n/a 33 4357 4442 4555 N
+ T F IH b n/a 33 4357 4419 4472 N
+ T F IH e n/a 33 4357 4466 4506 N
+ T F IH i n/a 33 4356 4466 4507 N
+ T F IH s n/a 33 4357 4466 4506 N
+ T F IY b n/a 33 4357 4418 4511 N
+ T F IY e n/a 33 4357 4467 4511 N
+ T F IY i n/a 33 4356 4467 4511 N
+ T F IY s n/a 33 4357 4467 4511 N
+ T F JH e n/a 33 4357 4441 4550 N
+ T F JH s n/a 33 4357 4441 4550 N
+ T F K e n/a 33 4357 4441 4549 N
+ T F K i n/a 33 4357 4441 4549 N
+ T F K s n/a 33 4357 4441 4549 N
+ T F L b n/a 33 4357 4425 4494 N
+ T F L e n/a 33 4357 4443 4564 N
+ T F L i n/a 33 4357 4443 4494 N
+ T F L s n/a 33 4357 4443 4494 N
+ T F M b n/a 33 4357 4418 4567 N
+ T F M e n/a 33 4357 4443 4567 N
+ T F M i n/a 33 4357 4443 4567 N
+ T F M s n/a 33 4357 4443 4567 N
+ T F N b n/a 33 4357 4418 4567 N
+ T F N e n/a 33 4357 4443 4567 N
+ T F N i n/a 33 4357 4443 4567 N
+ T F N s n/a 33 4357 4443 4567 N
+ T F NG b n/a 33 4357 4418 4567 N
+ T F NG e n/a 33 4357 4443 4567 N
+ T F NG s n/a 33 4357 4443 4567 N
+ T F OW b n/a 33 4357 4418 4491 N
+ T F OW e n/a 33 4357 4466 4493 N
+ T F OW i n/a 33 4357 4466 4491 N
+ T F OW s n/a 33 4357 4466 4493 N
+ T F OY b n/a 33 4357 4420 4501 N
+ T F OY e n/a 33 4357 4467 4496 N
+ T F OY s n/a 33 4357 4467 4501 N
+ T F P e n/a 33 4357 4441 4551 N
+ T F P i n/a 33 4357 4441 4551 N
+ T F P s n/a 33 4357 4441 4551 N
+ T F R b n/a 33 4364 4424 4481 N
+ T F R e n/a 33 4364 4470 4564 N
+ T F R i n/a 33 4363 4470 4481 N
+ T F R s n/a 33 4364 4470 4481 N
+ T F S b n/a 33 4357 4418 4536 N
+ T F S e n/a 33 4357 4440 4536 N
+ T F S i n/a 33 4357 4440 4536 N
+ T F S s n/a 33 4357 4440 4536 N
+ T F SH b n/a 33 4357 4418 4540 N
+ T F SH e n/a 33 4357 4442 4540 N
+ T F SH s n/a 33 4357 4442 4540 N
+ T F SIL e n/a 33 4357 4428 4558 N
+ T F SIL s n/a 33 4357 4428 4558 N
+ T F T b n/a 33 4357 4418 4550 N
+ T F T e n/a 33 4357 4439 4550 N
+ T F T s n/a 33 4357 4439 4550 N
+ T F TH e n/a 33 4357 4439 4551 N
+ T F TH s n/a 33 4357 4439 4551 N
+ T F UH b n/a 33 4357 4418 4476 N
+ T F UH e n/a 33 4357 4466 4476 N
+ T F UH s n/a 33 4357 4466 4476 N
+ T F UW b n/a 33 4357 4418 4479 N
+ T F UW e n/a 33 4357 4466 4479 N
+ T F UW s n/a 33 4357 4466 4479 N
+ T F V b n/a 33 4357 4418 4551 N
+ T F V e n/a 33 4357 4442 4551 N
+ T F V s n/a 33 4357 4442 4551 N
+ T F W b n/a 33 4357 4425 4483 N
+ T F W e n/a 33 4357 4443 4564 N
+ T F W i n/a 33 4357 4443 4482 N
+ T F W s n/a 33 4357 4443 4483 N
+ T F Y b n/a 33 4357 4425 4511 N
+ T F Y e n/a 33 4357 4455 4508 N
+ T F Y s n/a 33 4357 4455 4511 N
+ T F Z b n/a 33 4357 4418 4551 N
+ T F Z e n/a 33 4357 4439 4551 N
+ T F Z s n/a 33 4357 4439 4551 N
+ T F ZH e n/a 33 4357 4442 4551 N
+ T F ZH s n/a 33 4357 4442 4551 N
+ T G AA b n/a 33 4359 4408 4500 N
+ T G AA e n/a 33 4352 4408 4496 N
+ T G AA s n/a 33 4359 4408 4500 N
+ T G AE b n/a 33 4359 4409 4502 N
+ T G AE e n/a 33 4352 4409 4517 N
+ T G AE i n/a 33 4361 4409 4502 N
+ T G AE s n/a 33 4359 4409 4502 N
+ T G AH b n/a 33 4359 4406 4474 N
+ T G AH e n/a 33 4352 4406 4518 N
+ T G AH i n/a 33 4361 4406 4505 N
+ T G AH s n/a 33 4359 4406 4506 N
+ T G AO b n/a 33 4359 4408 4501 N
+ T G AO e n/a 33 4352 4408 4496 N
+ T G AO i n/a 33 4360 4408 4501 N
+ T G AO s n/a 33 4359 4408 4501 N
+ T G AW b n/a 33 4359 4409 4502 N
+ T G AW e n/a 33 4352 4409 4518 N
+ T G AW i n/a 33 4361 4409 4502 N
+ T G AW s n/a 33 4359 4409 4502 N
+ T G AY b n/a 33 4359 4408 4500 N
+ T G AY e n/a 33 4352 4408 4496 N
+ T G AY i n/a 33 4360 4408 4500 N
+ T G AY s n/a 33 4359 4408 4500 N
+ T G B b n/a 33 4359 4409 4552 N
+ T G B e n/a 33 4355 4436 4552 N
+ T G B s n/a 33 4359 4436 4552 N
+ T G CH e n/a 33 4355 4436 4552 N
+ T G CH s n/a 33 4359 4436 4552 N
+ T G D e n/a 33 4355 4436 4552 N
+ T G D s n/a 33 4359 4436 4552 N
+ T G DH e n/a 33 4355 4436 4552 N
+ T G DH s n/a 33 4359 4436 4552 N
+ T G EH b n/a 33 4359 4409 4502 N
+ T G EH e n/a 33 4352 4409 4517 N
+ T G EH i n/a 33 4361 4409 4502 N
+ T G EH s n/a 33 4359 4409 4502 N
+ T G ER b n/a 33 4364 4408 4490 N
+ T G ER e n/a 33 4364 4408 4488 N
+ T G ER i n/a 33 4364 4408 4488 N
+ T G ER s n/a 33 4364 4408 4488 N
+ T G EY b n/a 33 4359 4409 4503 N
+ T G EY e n/a 33 4352 4409 4517 N
+ T G EY i n/a 33 4361 4409 4503 N
+ T G EY s n/a 33 4359 4409 4503 N
+ T G F b n/a 33 4359 4409 4552 N
+ T G F e n/a 33 4352 4438 4552 N
+ T G F s n/a 33 4359 4438 4552 N
+ T G G b n/a 33 4359 4409 4552 N
+ T G G e n/a 33 4355 4436 4552 N
+ T G G s n/a 33 4359 4436 4552 N
+ T G HH e n/a 33 4352 4437 4554 N
+ T G HH s n/a 33 4359 4437 4554 N
+ T G IH b n/a 33 4359 4406 4472 N
+ T G IH e n/a 33 4352 4406 4506 N
+ T G IH s n/a 33 4359 4406 4506 N
+ T G IY b n/a 33 4359 4409 4508 N
+ T G IY e n/a 33 4352 4409 4510 N
+ T G IY i n/a 33 4361 4409 4508 N
+ T G IY s n/a 33 4359 4409 4508 N
+ T G JH e n/a 33 4355 4436 4552 N
+ T G JH s n/a 33 4359 4436 4552 N
+ T G K e n/a 33 4355 4436 4552 N
+ T G K s n/a 33 4359 4436 4552 N
+ T G L b n/a 33 4359 4425 4494 N
+ T G L e n/a 33 4352 4423 4561 N
+ T G L s n/a 33 4359 4423 4494 N
+ T G M b n/a 33 4359 4409 4565 N
+ T G M e n/a 33 4352 4434 4565 N
+ T G M s n/a 33 4359 4434 4565 N
+ T G N b n/a 33 4359 4409 4565 N
+ T G N e n/a 33 4355 4434 4565 N
+ T G N s n/a 33 4359 4434 4565 N
+ T G NG b n/a 33 4359 4409 4565 N
+ T G NG e n/a 33 4352 4434 4565 N
+ T G NG s n/a 33 4359 4434 4565 N
+ T G OW b n/a 33 4359 4408 4491 N
+ T G OW e n/a 33 4352 4408 4493 N
+ T G OW s n/a 33 4359 4408 4493 N
+ T G OY b n/a 33 4359 4408 4501 N
+ T G OY e n/a 33 4352 4408 4496 N
+ T G OY s n/a 33 4359 4408 4501 N
+ T G P e n/a 33 4355 4436 4552 N
+ T G P s n/a 33 4359 4436 4552 N
+ T G R b n/a 33 4364 4424 4481 N
+ T G R e n/a 33 4362 4424 4562 N
+ T G R s n/a 33 4364 4424 4481 N
+ T G S b n/a 33 4359 4409 4532 N
+ T G S e n/a 33 4354 4438 4532 N
+ T G S i n/a 33 4354 4438 4532 N
+ T G S s n/a 33 4359 4438 4532 N
+ T G SH b n/a 33 4359 4409 4540 N
+ T G SH e n/a 33 4352 4438 4540 N
+ T G SH s n/a 33 4359 4438 4540 N
+ T G SIL e n/a 33 4359 4428 4558 N
+ T G SIL s n/a 33 4359 4428 4558 N
+ T G T b n/a 33 4359 4409 4552 N
+ T G T e n/a 33 4355 4436 4552 N
+ T G T s n/a 33 4359 4436 4552 N
+ T G TH e n/a 33 4355 4438 4552 N
+ T G TH s n/a 33 4359 4438 4552 N
+ T G UH b n/a 33 4359 4408 4475 N
+ T G UH e n/a 33 4352 4408 4475 N
+ T G UH s n/a 33 4359 4408 4475 N
+ T G UW b n/a 33 4359 4407 4479 N
+ T G UW e n/a 33 4352 4407 4479 N
+ T G UW s n/a 33 4359 4407 4479 N
+ T G V b n/a 33 4359 4409 4552 N
+ T G V e n/a 33 4352 4436 4552 N
+ T G V s n/a 33 4359 4436 4552 N
+ T G W b n/a 33 4359 4425 4483 N
+ T G W e n/a 33 4352 4423 4563 N
+ T G W s n/a 33 4359 4423 4483 N
+ T G Y b n/a 33 4359 4425 4508 N
+ T G Y e n/a 33 4352 4425 4509 N
+ T G Y s n/a 33 4359 4425 4508 N
+ T G Z b n/a 33 4359 4409 4552 N
+ T G Z e n/a 33 4354 4436 4552 N
+ T G Z s n/a 33 4359 4436 4552 N
+ T G ZH e n/a 33 4352 4436 4552 N
+ T G ZH s n/a 33 4359 4436 4552 N
+ T HH AA b n/a 33 4359 4408 4500 N
+ T HH AA e n/a 33 4352 4466 4498 N
+ T HH AA s n/a 33 4359 4466 4500 N
+ T HH AE b n/a 33 4359 4409 4502 N
+ T HH AE e n/a 33 4352 4466 4527 N
+ T HH AE s n/a 33 4359 4466 4502 N
+ T HH AH b n/a 33 4359 4406 4474 N
+ T HH AH e n/a 33 4352 4466 4528 N
+ T HH AH s n/a 33 4359 4466 4529 N
+ T HH AO b n/a 33 4359 4408 4501 N
+ T HH AO e n/a 33 4352 4466 4498 N
+ T HH AO s n/a 33 4359 4466 4501 N
+ T HH AW b n/a 33 4359 4409 4502 N
+ T HH AW e n/a 33 4352 4466 4527 N
+ T HH AW s n/a 33 4359 4466 4502 N
+ T HH AY b n/a 33 4359 4408 4500 N
+ T HH AY e n/a 33 4352 4467 4496 N
+ T HH AY s n/a 33 4359 4467 4500 N
+ T HH B b n/a 33 4359 4409 4551 N
+ T HH B e n/a 33 4355 4441 4551 N
+ T HH B s n/a 33 4359 4441 4551 N
+ T HH CH e n/a 33 4355 4441 4550 N
+ T HH CH s n/a 33 4359 4441 4550 N
+ T HH D e n/a 33 4355 4439 4551 N
+ T HH D s n/a 33 4359 4439 4551 N
+ T HH DH e n/a 33 4355 4439 4551 N
+ T HH DH s n/a 33 4359 4439 4551 N
+ T HH EH b n/a 33 4359 4409 4502 N
+ T HH EH e n/a 33 4352 4466 4527 N
+ T HH EH s n/a 33 4359 4466 4502 N
+ T HH ER b n/a 33 4364 4408 4490 N
+ T HH ER e n/a 33 4364 4470 4488 N
+ T HH ER s n/a 33 4364 4470 4488 N
+ T HH EY b n/a 33 4359 4409 4503 N
+ T HH EY e n/a 33 4352 4467 4527 N
+ T HH EY s n/a 33 4359 4467 4503 N
+ T HH F b n/a 33 4359 4409 4549 N
+ T HH F e n/a 33 4352 4442 4549 N
+ T HH F s n/a 33 4359 4442 4549 N
+ T HH G b n/a 33 4359 4409 4549 N
+ T HH G e n/a 33 4355 4441 4549 N
+ T HH G s n/a 33 4359 4441 4549 N
+ T HH HH e n/a 33 4352 4442 4555 N
+ T HH HH s n/a 33 4359 4442 4555 N
+ T HH IH b n/a 33 4359 4406 4472 N
+ T HH IH e n/a 33 4352 4466 4506 N
+ T HH IH s n/a 33 4359 4466 4506 N
+ T HH IY b n/a 33 4359 4409 4508 N
+ T HH IY e n/a 33 4352 4467 4510 N
+ T HH IY s n/a 33 4359 4467 4508 N
+ T HH JH e n/a 33 4355 4441 4550 N
+ T HH JH s n/a 33 4359 4441 4550 N
+ T HH K e n/a 33 4355 4441 4549 N
+ T HH K s n/a 33 4359 4441 4549 N
+ T HH L b n/a 33 4359 4425 4494 N
+ T HH L e n/a 33 4352 4443 4564 N
+ T HH L s n/a 33 4359 4443 4494 N
+ T HH M b n/a 33 4359 4409 4567 N
+ T HH M e n/a 33 4352 4443 4567 N
+ T HH M i n/a 33 4360 4443 4567 N
+ T HH M s n/a 33 4359 4443 4567 N
+ T HH N b n/a 33 4359 4409 4567 N
+ T HH N e n/a 33 4355 4443 4567 N
+ T HH N s n/a 33 4359 4443 4567 N
+ T HH NG b n/a 33 4359 4409 4567 N
+ T HH NG e n/a 33 4352 4443 4567 N
+ T HH NG s n/a 33 4359 4443 4567 N
+ T HH OW b n/a 33 4359 4408 4491 N
+ T HH OW e n/a 33 4352 4466 4493 N
+ T HH OW s n/a 33 4359 4466 4493 N
+ T HH OY b n/a 33 4359 4408 4501 N
+ T HH OY e n/a 33 4352 4467 4496 N
+ T HH OY s n/a 33 4359 4467 4501 N
+ T HH P e n/a 33 4355 4441 4551 N
+ T HH P i n/a 33 4360 4441 4551 N
+ T HH P s n/a 33 4359 4441 4551 N
+ T HH R b n/a 33 4364 4424 4481 N
+ T HH R e n/a 33 4362 4470 4564 N
+ T HH R s n/a 33 4364 4470 4481 N
+ T HH S b n/a 33 4359 4409 4535 N
+ T HH S e n/a 33 4354 4440 4535 N
+ T HH S s n/a 33 4359 4440 4535 N
+ T HH SH b n/a 33 4359 4409 4540 N
+ T HH SH e n/a 33 4352 4442 4540 N
+ T HH SH s n/a 33 4359 4442 4540 N
+ T HH SIL e n/a 33 4359 4428 4558 N
+ T HH SIL s n/a 33 4359 4428 4558 N
+ T HH T b n/a 33 4359 4409 4550 N
+ T HH T e n/a 33 4355 4439 4550 N
+ T HH T s n/a 33 4359 4439 4550 N
+ T HH TH e n/a 33 4355 4439 4551 N
+ T HH TH s n/a 33 4359 4439 4551 N
+ T HH UH b n/a 33 4359 4408 4475 N
+ T HH UH e n/a 33 4352 4466 4475 N
+ T HH UH s n/a 33 4359 4466 4475 N
+ T HH UW b n/a 33 4359 4407 4479 N
+ T HH UW e n/a 33 4352 4466 4479 N
+ T HH UW s n/a 33 4359 4466 4479 N
+ T HH V b n/a 33 4359 4409 4551 N
+ T HH V e n/a 33 4352 4442 4551 N
+ T HH V s n/a 33 4359 4442 4551 N
+ T HH W b n/a 33 4359 4425 4483 N
+ T HH W e n/a 33 4352 4443 4564 N
+ T HH W s n/a 33 4359 4443 4483 N
+ T HH Y b n/a 33 4359 4425 4508 N
+ T HH Y e n/a 33 4352 4455 4508 N
+ T HH Y s n/a 33 4359 4455 4508 N
+ T HH Z b n/a 33 4359 4409 4551 N
+ T HH Z e n/a 33 4354 4439 4551 N
+ T HH Z s n/a 33 4359 4439 4551 N
+ T HH ZH e n/a 33 4352 4442 4551 N
+ T HH ZH s n/a 33 4359 4442 4551 N
+ T IH AA b n/a 33 4339 4420 4500 N
+ T IH AA e n/a 33 4322 4386 4496 N
+ T IH AA i n/a 33 4326 4432 4500 N
+ T IH AA s n/a 33 4339 4432 4500 N
+ T IH AE b n/a 33 4339 4420 4502 N
+ T IH AE e n/a 33 4322 4387 4517 N
+ T IH AE i n/a 33 4326 4432 4502 N
+ T IH AE s n/a 33 4339 4431 4502 N
+ T IH AH b n/a 33 4339 4415 4475 N
+ T IH AH e n/a 33 4322 4387 4519 N
+ T IH AH i n/a 33 4325 4450 4522 N
+ T IH AH s n/a 33 4339 4450 4519 N
+ T IH AO b n/a 33 4339 4420 4501 N
+ T IH AO e n/a 33 4322 4386 4496 N
+ T IH AO i n/a 33 4326 4432 4501 N
+ T IH AO s n/a 33 4339 4432 4501 N
+ T IH AW b n/a 33 4339 4420 4502 N
+ T IH AW e n/a 33 4322 4387 4519 N
+ T IH AW i n/a 33 4326 4432 4502 N
+ T IH AW s n/a 33 4339 4431 4502 N
+ T IH AY b n/a 33 4339 4420 4500 N
+ T IH AY e n/a 33 4322 4386 4496 N
+ T IH AY i n/a 33 4326 4432 4500 N
+ T IH AY s n/a 33 4339 4432 4500 N
+ T IH B b n/a 33 4339 4399 4546 N
+ T IH B e n/a 33 4319 4399 4546 N
+ T IH B i n/a 33 4328 4399 4546 N
+ T IH B s n/a 33 4339 4399 4546 N
+ T IH CH e n/a 33 4320 4399 4546 N
+ T IH CH i n/a 33 4328 4399 4546 N
+ T IH CH s n/a 33 4339 4399 4546 N
+ T IH D e n/a 33 4320 4399 4546 N
+ T IH D i n/a 33 4328 4399 4546 N
+ T IH D s n/a 33 4328 4399 4546 N
+ T IH DH e n/a 33 4319 4399 4546 N
+ T IH DH s n/a 33 4339 4399 4546 N
+ T IH EH b n/a 33 4339 4415 4502 N
+ T IH EH e n/a 33 4322 4387 4517 N
+ T IH EH i n/a 33 4326 4432 4502 N
+ T IH EH s n/a 33 4339 4431 4502 N
+ T IH ER b n/a 33 4339 4417 4490 N
+ T IH ER e n/a 33 4322 4387 4489 N
+ T IH ER i n/a 33 4326 4461 4490 N
+ T IH ER s n/a 33 4339 4461 4489 N
+ T IH EY b n/a 33 4339 4415 4503 N
+ T IH EY e n/a 33 4322 4387 4517 N
+ T IH EY i n/a 33 4326 4432 4503 N
+ T IH EY s n/a 33 4339 4431 4503 N
+ T IH F b n/a 33 4339 4404 4535 N
+ T IH F e n/a 33 4319 4404 4535 N
+ T IH F i n/a 33 4328 4404 4535 N
+ T IH F s n/a 33 4339 4404 4535 N
+ T IH G b n/a 33 4339 4399 4546 N
+ T IH G e n/a 33 4320 4399 4546 N
+ T IH G i n/a 33 4328 4399 4546 N
+ T IH G s n/a 33 4339 4399 4546 N
+ T IH HH e n/a 33 4322 4382 4554 N
+ T IH HH i n/a 33 4328 4382 4554 N
+ T IH HH s n/a 33 4339 4382 4554 N
+ T IH IH b n/a 33 4339 4415 4472 N
+ T IH IH e n/a 33 4322 4381 4516 N
+ T IH IH i n/a 33 4329 4457 4516 N
+ T IH IH s n/a 33 4339 4457 4516 N
+ T IH IY b n/a 33 4339 4415 4508 N
+ T IH IY e n/a 33 4322 4381 4510 N
+ T IH IY i n/a 33 4329 4455 4510 N
+ T IH IY s n/a 33 4339 4455 4508 N
+ T IH JH e n/a 33 4320 4399 4546 N
+ T IH JH i n/a 33 4328 4399 4546 N
+ T IH JH s n/a 33 4339 4399 4546 N
+ T IH K e n/a 33 4320 4399 4546 N
+ T IH K i n/a 33 4328 4399 4546 N
+ T IH K s n/a 33 4339 4399 4546 N
+ T IH L b n/a 33 4340 4425 4494 N
+ T IH L e n/a 33 4323 4389 4561 N
+ T IH L i n/a 33 4326 4444 4494 N
+ T IH L s n/a 33 4340 4444 4494 N
+ T IH M b n/a 33 4339 4392 4565 N
+ T IH M e n/a 33 4322 4392 4565 N
+ T IH M i n/a 33 4328 4392 4565 N
+ T IH M s n/a 33 4339 4392 4565 N
+ T IH N b n/a 33 4328 4392 4565 N
+ T IH N e n/a 33 4322 4392 4565 N
+ T IH N i n/a 33 4328 4392 4565 N
+ T IH N s n/a 33 4328 4392 4565 N
+ T IH NG b n/a 33 4339 4392 4565 N
+ T IH NG e n/a 33 4322 4392 4565 N
+ T IH NG s n/a 33 4339 4392 4565 N
+ T IH OW b n/a 33 4339 4417 4491 N
+ T IH OW e n/a 33 4322 4386 4493 N
+ T IH OW i n/a 33 4326 4432 4491 N
+ T IH OW s n/a 33 4339 4432 4493 N
+ T IH OY b n/a 33 4339 4420 4501 N
+ T IH OY e n/a 33 4322 4386 4496 N
+ T IH OY i n/a 33 4326 4432 4501 N
+ T IH OY s n/a 33 4339 4432 4501 N
+ T IH P e n/a 33 4319 4399 4546 N
+ T IH P i n/a 33 4328 4399 4546 N
+ T IH P s n/a 33 4339 4399 4546 N
+ T IH R b n/a 33 4340 4424 4481 N
+ T IH R e n/a 33 4323 4389 4562 N
+ T IH R i n/a 33 4326 4430 4481 N
+ T IH R s n/a 33 4340 4430 4481 N
+ T IH S b n/a 33 4334 4404 4533 N
+ T IH S e n/a 33 4319 4404 4533 N
+ T IH S i n/a 33 4334 4404 4533 N
+ T IH S s n/a 33 4334 4404 4533 N
+ T IH SH b n/a 33 4339 4405 4540 N
+ T IH SH e n/a 33 4320 4405 4540 N
+ T IH SH i n/a 33 4328 4405 4540 N
+ T IH SH s n/a 33 4339 4405 4540 N
+ T IH SIL e n/a 33 4321 4444 4559 N
+ T IH SIL s n/a 33 4339 4444 4559 N
+ T IH T b n/a 33 4328 4399 4546 N
+ T IH T e n/a 33 4319 4399 4546 N
+ T IH T i n/a 33 4328 4399 4546 N
+ T IH T s n/a 33 4328 4399 4546 N
+ T IH TH e n/a 33 4319 4404 4533 N
+ T IH TH s n/a 33 4339 4404 4533 N
+ T IH UH b n/a 33 4339 4417 4475 N
+ T IH UH e n/a 33 4322 4387 4475 N
+ T IH UH i n/a 33 4330 4461 4475 N
+ T IH UH s n/a 33 4339 4461 4475 N
+ T IH UW b n/a 33 4339 4417 4480 N
+ T IH UW e n/a 33 4322 4386 4480 N
+ T IH UW i n/a 33 4330 4461 4480 N
+ T IH UW s n/a 33 4339 4461 4480 N
+ T IH V b n/a 33 4339 4399 4546 N
+ T IH V e n/a 33 4320 4399 4546 N
+ T IH V i n/a 33 4328 4399 4546 N
+ T IH V s n/a 33 4339 4399 4546 N
+ T IH W b n/a 33 4340 4425 4483 N
+ T IH W e n/a 33 4323 4389 4560 N
+ T IH W i n/a 33 4326 4447 4483 N
+ T IH W s n/a 33 4340 4447 4483 N
+ T IH Y b n/a 33 4339 4425 4508 N
+ T IH Y e n/a 33 4322 4383 4509 N
+ T IH Y i n/a 33 4329 4455 4510 N
+ T IH Y s n/a 33 4339 4455 4508 N
+ T IH Z b n/a 33 4334 4399 4546 N
+ T IH Z e n/a 33 4320 4399 4546 N
+ T IH Z i n/a 33 4334 4399 4546 N
+ T IH Z s n/a 33 4334 4399 4546 N
+ T IH ZH e n/a 33 4320 4399 4546 N
+ T IH ZH s n/a 33 4339 4399 4546 N
+ T IY AA b n/a 33 4343 4420 4500 N
+ T IY AA e n/a 33 4344 4387 4496 N
+ T IY AA i n/a 33 4343 4432 4500 N
+ T IY AA s n/a 33 4343 4432 4500 N
+ T IY AE b n/a 33 4343 4420 4502 N
+ T IY AE e n/a 33 4344 4380 4517 N
+ T IY AE i n/a 33 4343 4432 4502 N
+ T IY AE s n/a 33 4343 4431 4502 N
+ T IY AH b n/a 33 4343 4416 4473 N
+ T IY AH e n/a 33 4344 4380 4517 N
+ T IY AH i n/a 33 4343 4457 4521 N
+ T IY AH s n/a 33 4343 4457 4517 N
+ T IY AO b n/a 33 4343 4420 4501 N
+ T IY AO e n/a 33 4344 4387 4496 N
+ T IY AO i n/a 33 4343 4432 4501 N
+ T IY AO s n/a 33 4343 4432 4501 N
+ T IY AW b n/a 33 4343 4420 4502 N
+ T IY AW e n/a 33 4344 4380 4519 N
+ T IY AW i n/a 33 4343 4432 4502 N
+ T IY AW s n/a 33 4343 4431 4502 N
+ T IY AY b n/a 33 4343 4420 4500 N
+ T IY AY e n/a 33 4344 4386 4496 N
+ T IY AY i n/a 33 4343 4432 4500 N
+ T IY AY s n/a 33 4343 4432 4500 N
+ T IY B b n/a 33 4343 4402 4546 N
+ T IY B e n/a 33 4344 4402 4546 N
+ T IY B i n/a 33 4344 4402 4546 N
+ T IY B s n/a 33 4343 4402 4546 N
+ T IY CH e n/a 33 4344 4402 4546 N
+ T IY CH s n/a 33 4343 4402 4546 N
+ T IY D e n/a 33 4344 4402 4546 N
+ T IY D s n/a 33 4343 4402 4546 N
+ T IY DH e n/a 33 4344 4402 4546 N
+ T IY DH s n/a 33 4343 4402 4546 N
+ T IY EH b n/a 33 4343 4415 4502 N
+ T IY EH e n/a 33 4344 4380 4517 N
+ T IY EH i n/a 33 4343 4432 4502 N
+ T IY EH s n/a 33 4343 4431 4502 N
+ T IY ER b n/a 33 4343 4417 4490 N
+ T IY ER e n/a 33 4344 4387 4489 N
+ T IY ER i n/a 33 4343 4461 4490 N
+ T IY ER s n/a 33 4343 4461 4489 N
+ T IY EY b n/a 33 4343 4415 4503 N
+ T IY EY e n/a 33 4344 4380 4517 N
+ T IY EY i n/a 33 4343 4432 4503 N
+ T IY EY s n/a 33 4343 4431 4503 N
+ T IY F b n/a 33 4343 4402 4535 N
+ T IY F e n/a 33 4344 4402 4535 N
+ T IY F i n/a 33 4344 4402 4535 N
+ T IY F s n/a 33 4343 4402 4535 N
+ T IY G b n/a 33 4343 4402 4546 N
+ T IY G e n/a 33 4344 4402 4546 N
+ T IY G s n/a 33 4343 4402 4546 N
+ T IY HH e n/a 33 4344 4383 4554 N
+ T IY HH i n/a 33 4344 4383 4554 N
+ T IY HH s n/a 33 4343 4383 4554 N
+ T IY IH b n/a 33 4343 4416 4472 N
+ T IY IH e n/a 33 4344 4380 4516 N
+ T IY IH i n/a 33 4344 4457 4516 N
+ T IY IH s n/a 33 4343 4457 4516 N
+ T IY IY b n/a 33 4343 4415 4508 N
+ T IY IY e n/a 33 4344 4380 4510 N
+ T IY IY i n/a 33 4344 4455 4508 N
+ T IY IY s n/a 33 4343 4455 4508 N
+ T IY JH e n/a 33 4344 4402 4546 N
+ T IY JH i n/a 33 4344 4402 4546 N
+ T IY JH s n/a 33 4343 4402 4546 N
+ T IY K e n/a 33 4344 4402 4546 N
+ T IY K i n/a 33 4344 4402 4546 N
+ T IY K s n/a 33 4343 4402 4546 N
+ T IY L b n/a 33 4343 4425 4494 N
+ T IY L e n/a 33 4344 4389 4561 N
+ T IY L i n/a 33 4343 4444 4494 N
+ T IY L s n/a 33 4343 4444 4494 N
+ T IY M b n/a 33 4343 4392 4565 N
+ T IY M e n/a 33 4344 4392 4565 N
+ T IY M i n/a 33 4344 4392 4565 N
+ T IY M s n/a 33 4343 4392 4565 N
+ T IY N b n/a 33 4343 4392 4565 N
+ T IY N e n/a 33 4344 4392 4565 N
+ T IY N i n/a 33 4344 4392 4565 N
+ T IY N s n/a 33 4343 4392 4565 N
+ T IY NG b n/a 33 4343 4392 4565 N
+ T IY NG e n/a 33 4344 4392 4565 N
+ T IY NG s n/a 33 4343 4392 4565 N
+ T IY OW b n/a 33 4343 4417 4491 N
+ T IY OW e n/a 33 4344 4387 4493 N
+ T IY OW i n/a 33 4343 4432 4492 N
+ T IY OW s n/a 33 4343 4432 4493 N
+ T IY OY b n/a 33 4343 4420 4501 N
+ T IY OY e n/a 33 4344 4386 4496 N
+ T IY OY s n/a 33 4343 4432 4501 N
+ T IY P e n/a 33 4344 4402 4546 N
+ T IY P i n/a 33 4344 4402 4546 N
+ T IY P s n/a 33 4343 4402 4546 N
+ T IY R b n/a 33 4343 4424 4481 N
+ T IY R e n/a 33 4344 4389 4562 N
+ T IY R i n/a 33 4343 4430 4481 N
+ T IY R s n/a 33 4343 4430 4481 N
+ T IY S b n/a 33 4343 4402 4534 N
+ T IY S e n/a 33 4344 4402 4534 N
+ T IY S i n/a 33 4344 4402 4534 N
+ T IY S s n/a 33 4343 4402 4534 N
+ T IY SH b n/a 33 4343 4402 4540 N
+ T IY SH e n/a 33 4344 4402 4540 N
+ T IY SH s n/a 33 4343 4402 4540 N
+ T IY SIL e n/a 33 4343 4446 4559 N
+ T IY SIL s n/a 33 4343 4446 4559 N
+ T IY T b n/a 33 4343 4402 4546 N
+ T IY T e n/a 33 4344 4402 4546 N
+ T IY T s n/a 33 4343 4402 4546 N
+ T IY TH e n/a 33 4344 4402 4534 N
+ T IY TH s n/a 33 4343 4402 4534 N
+ T IY UH b n/a 33 4343 4417 4475 N
+ T IY UH e n/a 33 4344 4387 4475 N
+ T IY UH i n/a 33 4344 4461 4475 N
+ T IY UH s n/a 33 4343 4461 4475 N
+ T IY UW b n/a 33 4343 4417 4480 N
+ T IY UW e n/a 33 4344 4387 4480 N
+ T IY UW i n/a 33 4344 4461 4480 N
+ T IY UW s n/a 33 4343 4461 4480 N
+ T IY V b n/a 33 4343 4402 4546 N
+ T IY V e n/a 33 4344 4402 4546 N
+ T IY V i n/a 33 4344 4402 4546 N
+ T IY V s n/a 33 4343 4402 4546 N
+ T IY W b n/a 33 4343 4425 4483 N
+ T IY W e n/a 33 4344 4389 4560 N
+ T IY W i n/a 33 4343 4447 4483 N
+ T IY W s n/a 33 4343 4447 4483 N
+ T IY Y b n/a 33 4343 4425 4508 N
+ T IY Y e n/a 33 4344 4383 4509 N
+ T IY Y i n/a 33 4344 4455 4508 N
+ T IY Y s n/a 33 4343 4455 4508 N
+ T IY Z b n/a 33 4343 4402 4546 N
+ T IY Z e n/a 33 4344 4402 4546 N
+ T IY Z i n/a 33 4344 4402 4546 N
+ T IY Z s n/a 33 4343 4402 4546 N
+ T IY ZH e n/a 33 4344 4402 4546 N
+ T IY ZH s n/a 33 4343 4402 4546 N
+ T JH AA b n/a 33 4360 4408 4500 N
+ T JH AA s n/a 33 4360 4408 4500 N
+ T JH AE b n/a 33 4361 4409 4502 N
+ T JH AE s n/a 33 4361 4409 4502 N
+ T JH AH b n/a 33 4360 4406 4474 N
+ T JH AH i n/a 33 4360 4406 4504 N
+ T JH AH s n/a 33 4360 4406 4506 N
+ T JH AO b n/a 33 4360 4408 4501 N
+ T JH AO i n/a 33 4360 4408 4501 N
+ T JH AO s n/a 33 4360 4408 4501 N
+ T JH AW b n/a 33 4361 4409 4502 N
+ T JH AW i n/a 33 4361 4409 4502 N
+ T JH AW s n/a 33 4361 4409 4502 N
+ T JH AY b n/a 33 4360 4408 4500 N
+ T JH AY s n/a 33 4360 4408 4500 N
+ T JH B b n/a 33 4360 4409 4552 N
+ T JH B s n/a 33 4360 4436 4552 N
+ T JH CH s n/a 33 4360 4436 4552 N
+ T JH D s n/a 33 4360 4436 4552 N
+ T JH DH s n/a 33 4360 4436 4552 N
+ T JH EH b n/a 33 4361 4409 4502 N
+ T JH EH i n/a 33 4361 4409 4502 N
+ T JH EH s n/a 33 4361 4409 4502 N
+ T JH ER b n/a 33 4364 4408 4490 N
+ T JH ER s n/a 33 4364 4408 4488 N
+ T JH EY b n/a 33 4361 4409 4503 N
+ T JH EY s n/a 33 4361 4409 4503 N
+ T JH F b n/a 33 4360 4409 4552 N
+ T JH F s n/a 33 4360 4438 4552 N
+ T JH G b n/a 33 4360 4409 4552 N
+ T JH G s n/a 33 4360 4436 4552 N
+ T JH HH s n/a 33 4360 4437 4554 N
+ T JH IH b n/a 33 4360 4406 4472 N
+ T JH IH s n/a 33 4360 4406 4506 N
+ T JH IY b n/a 33 4361 4409 4508 N
+ T JH IY s n/a 33 4361 4409 4508 N
+ T JH JH s n/a 33 4360 4436 4552 N
+ T JH K s n/a 33 4360 4436 4552 N
+ T JH L b n/a 33 4360 4425 4494 N
+ T JH L s n/a 33 4360 4423 4494 N
+ T JH M b n/a 33 4360 4409 4565 N
+ T JH M s n/a 33 4360 4434 4565 N
+ T JH N b n/a 33 4360 4409 4565 N
+ T JH N s n/a 33 4360 4434 4565 N
+ T JH NG b n/a 33 4360 4409 4565 N
+ T JH NG s n/a 33 4360 4434 4565 N
+ T JH OW b n/a 33 4360 4408 4491 N
+ T JH OW s n/a 33 4360 4408 4493 N
+ T JH OY b n/a 33 4360 4408 4501 N
+ T JH OY s n/a 33 4360 4408 4501 N
+ T JH P s n/a 33 4360 4436 4552 N
+ T JH R b n/a 33 4364 4424 4481 N
+ T JH R s n/a 33 4364 4424 4481 N
+ T JH S b n/a 33 4360 4409 4532 N
+ T JH S s n/a 33 4360 4438 4532 N
+ T JH SH b n/a 33 4360 4409 4540 N
+ T JH SH s n/a 33 4360 4438 4540 N
+ T JH SIL s n/a 33 4360 4428 4558 N
+ T JH T b n/a 33 4360 4409 4552 N
+ T JH T s n/a 33 4360 4436 4552 N
+ T JH TH s n/a 33 4360 4438 4552 N
+ T JH UH b n/a 33 4360 4408 4475 N
+ T JH UH s n/a 33 4360 4408 4475 N
+ T JH UW b n/a 33 4360 4407 4479 N
+ T JH UW s n/a 33 4360 4407 4479 N
+ T JH V b n/a 33 4360 4409 4552 N
+ T JH V s n/a 33 4360 4436 4552 N
+ T JH W b n/a 33 4360 4425 4483 N
+ T JH W s n/a 33 4360 4423 4483 N
+ T JH Y b n/a 33 4361 4425 4508 N
+ T JH Y s n/a 33 4361 4425 4508 N
+ T JH Z b n/a 33 4360 4409 4552 N
+ T JH Z s n/a 33 4360 4436 4552 N
+ T JH ZH s n/a 33 4360 4436 4552 N
+ T K AA b n/a 33 4366 4408 4500 N
+ T K AA e n/a 33 4365 4468 4498 N
+ T K AA i n/a 33 4367 4468 4500 N
+ T K AA s n/a 33 4366 4468 4500 N
+ T K AE b n/a 33 4366 4409 4502 N
+ T K AE e n/a 33 4365 4468 4527 N
+ T K AE i n/a 33 4367 4468 4502 N
+ T K AE s n/a 33 4366 4468 4502 N
+ T K AH b n/a 33 4366 4406 4474 N
+ T K AH e n/a 33 4365 4468 4528 N
+ T K AH i n/a 33 4367 4468 4530 N
+ T K AH s n/a 33 4366 4468 4529 N
+ T K AO b n/a 33 4366 4408 4501 N
+ T K AO e n/a 33 4365 4468 4498 N
+ T K AO i n/a 33 4367 4468 4501 N
+ T K AO s n/a 33 4366 4468 4501 N
+ T K AW b n/a 33 4366 4409 4502 N
+ T K AW e n/a 33 4365 4468 4527 N
+ T K AW i n/a 33 4367 4468 4502 N
+ T K AW s n/a 33 4366 4468 4502 N
+ T K AY b n/a 33 4366 4408 4500 N
+ T K AY e n/a 33 4365 4468 4496 N
+ T K AY i n/a 33 4367 4468 4500 N
+ T K AY s n/a 33 4366 4468 4500 N
+ T K B b n/a 33 4366 4409 4551 N
+ T K B e n/a 33 4365 4441 4551 N
+ T K B s n/a 33 4366 4441 4551 N
+ T K CH e n/a 33 4365 4441 4550 N
+ T K CH s n/a 33 4366 4441 4550 N
+ T K D e n/a 33 4365 4441 4551 N
+ T K D s n/a 33 4365 4441 4551 N
+ T K DH e n/a 33 4365 4441 4551 N
+ T K DH s n/a 33 4365 4441 4551 N
+ T K EH b n/a 33 4366 4409 4502 N
+ T K EH e n/a 33 4365 4468 4527 N
+ T K EH i n/a 33 4367 4468 4502 N
+ T K EH s n/a 33 4366 4468 4502 N
+ T K ER b n/a 33 4366 4408 4490 N
+ T K ER e n/a 33 4365 4470 4488 N
+ T K ER i n/a 33 4367 4470 4485 N
+ T K ER s n/a 33 4366 4470 4488 N
+ T K EY b n/a 33 4366 4409 4503 N
+ T K EY e n/a 33 4365 4468 4527 N
+ T K EY i n/a 33 4367 4468 4503 N
+ T K EY s n/a 33 4366 4468 4503 N
+ T K F b n/a 33 4366 4409 4549 N
+ T K F e n/a 33 4365 4442 4549 N
+ T K F i n/a 33 4367 4442 4549 N
+ T K F s n/a 33 4366 4442 4549 N
+ T K G b n/a 33 4366 4409 4549 N
+ T K G e n/a 33 4365 4441 4549 N
+ T K G s n/a 33 4366 4441 4549 N
+ T K HH e n/a 33 4365 4442 4555 N
+ T K HH s n/a 33 4366 4442 4555 N
+ T K IH b n/a 33 4366 4406 4472 N
+ T K IH e n/a 33 4365 4468 4506 N
+ T K IH i n/a 33 4367 4468 4507 N
+ T K IH s n/a 33 4366 4468 4506 N
+ T K IY b n/a 33 4366 4409 4508 N
+ T K IY e n/a 33 4365 4468 4510 N
+ T K IY i n/a 33 4367 4468 4508 N
+ T K IY s n/a 33 4366 4468 4508 N
+ T K JH e n/a 33 4365 4441 4550 N
+ T K JH s n/a 33 4366 4441 4550 N
+ T K K e n/a 33 4365 4441 4549 N
+ T K K s n/a 33 4366 4441 4549 N
+ T K L b n/a 33 4366 4425 4494 N
+ T K L e n/a 33 4365 4443 4564 N
+ T K L i n/a 33 4367 4443 4494 N
+ T K L s n/a 33 4366 4443 4494 N
+ T K M b n/a 33 4366 4409 4567 N
+ T K M e n/a 33 4365 4443 4567 N
+ T K M i n/a 33 4367 4443 4567 N
+ T K M s n/a 33 4366 4443 4567 N
+ T K N b n/a 33 4365 4409 4567 N
+ T K N e n/a 33 4365 4443 4567 N
+ T K N i n/a 33 4365 4443 4567 N
+ T K N s n/a 33 4365 4443 4567 N
+ T K NG b n/a 33 4366 4409 4567 N
+ T K NG e n/a 33 4365 4443 4567 N
+ T K NG s n/a 33 4366 4443 4567 N
+ T K OW b n/a 33 4366 4408 4491 N
+ T K OW e n/a 33 4365 4468 4493 N
+ T K OW i n/a 33 4367 4468 4491 N
+ T K OW s n/a 33 4366 4468 4493 N
+ T K OY b n/a 33 4366 4408 4501 N
+ T K OY e n/a 33 4365 4468 4496 N
+ T K OY i n/a 33 4367 4468 4501 N
+ T K OY s n/a 33 4366 4468 4501 N
+ T K P e n/a 33 4365 4441 4551 N
+ T K P s n/a 33 4366 4441 4551 N
+ T K R b n/a 33 4366 4424 4481 N
+ T K R e n/a 33 4365 4470 4564 N
+ T K R i n/a 33 4367 4470 4481 N
+ T K R s n/a 33 4366 4470 4481 N
+ T K S b n/a 33 4365 4409 4535 N
+ T K S e n/a 33 4365 4442 4535 N
+ T K S i n/a 33 4365 4442 4535 N
+ T K S s n/a 33 4365 4442 4535 N
+ T K SH b n/a 33 4366 4409 4540 N
+ T K SH e n/a 33 4365 4442 4540 N
+ T K SH s n/a 33 4366 4442 4540 N
+ T K SIL e n/a 33 4366 4428 4558 N
+ T K SIL s n/a 33 4366 4428 4558 N
+ T K T b n/a 33 4365 4409 4550 N
+ T K T e n/a 33 4365 4441 4550 N
+ T K T s n/a 33 4365 4441 4550 N
+ T K TH e n/a 33 4365 4441 4551 N
+ T K TH s n/a 33 4365 4441 4551 N
+ T K UH b n/a 33 4366 4408 4475 N
+ T K UH e n/a 33 4365 4468 4475 N
+ T K UH i n/a 33 4367 4468 4475 N
+ T K UH s n/a 33 4366 4468 4475 N
+ T K UW b n/a 33 4366 4407 4479 N
+ T K UW e n/a 33 4365 4468 4479 N
+ T K UW i n/a 33 4367 4468 4479 N
+ T K UW s n/a 33 4366 4468 4479 N
+ T K V b n/a 33 4366 4409 4551 N
+ T K V e n/a 33 4365 4442 4551 N
+ T K V s n/a 33 4366 4442 4551 N
+ T K W b n/a 33 4366 4425 4483 N
+ T K W e n/a 33 4365 4443 4564 N
+ T K W i n/a 33 4367 4443 4482 N
+ T K W s n/a 33 4366 4443 4483 N
+ T K Y b n/a 33 4366 4425 4508 N
+ T K Y e n/a 33 4365 4455 4508 N
+ T K Y i n/a 33 4367 4455 4508 N
+ T K Y s n/a 33 4366 4455 4508 N
+ T K Z b n/a 33 4365 4409 4551 N
+ T K Z e n/a 33 4365 4442 4551 N
+ T K Z s n/a 33 4365 4442 4551 N
+ T K ZH e n/a 33 4365 4442 4551 N
+ T K ZH s n/a 33 4366 4442 4551 N
+ T L AA b n/a 33 4342 4421 4500 N
+ T L AA e n/a 33 4294 4431 4496 N
+ T L AA i n/a 33 4342 4431 4500 N
+ T L AA s n/a 33 4342 4431 4500 N
+ T L AE b n/a 33 4342 4421 4502 N
+ T L AE e n/a 33 4294 4431 4517 N
+ T L AE i n/a 33 4342 4432 4502 N
+ T L AE s n/a 33 4342 4431 4502 N
+ T L AH b n/a 33 4342 4421 4476 N
+ T L AH e n/a 33 4294 4460 4520 N
+ T L AH i n/a 33 4342 4460 4525 N
+ T L AH s n/a 33 4342 4460 4520 N
+ T L AO b n/a 33 4342 4421 4501 N
+ T L AO e n/a 33 4294 4431 4496 N
+ T L AO i n/a 33 4342 4431 4501 N
+ T L AO s n/a 33 4342 4431 4501 N
+ T L AW b n/a 33 4342 4421 4502 N
+ T L AW e n/a 33 4294 4431 4520 N
+ T L AW i n/a 33 4342 4432 4502 N
+ T L AW s n/a 33 4342 4431 4502 N
+ T L AY b n/a 33 4342 4421 4500 N
+ T L AY e n/a 33 4294 4431 4496 N
+ T L AY i n/a 33 4342 4431 4500 N
+ T L AY s n/a 33 4342 4431 4500 N
+ T L B b n/a 33 4342 4421 4553 N
+ T L B e n/a 33 4294 4434 4553 N
+ T L B i n/a 33 4342 4434 4553 N
+ T L B s n/a 33 4342 4434 4553 N
+ T L CH e n/a 33 4294 4435 4553 N
+ T L CH i n/a 33 4342 4435 4553 N
+ T L CH s n/a 33 4342 4435 4553 N
+ T L D e n/a 33 4294 4434 4553 N
+ T L D i n/a 33 4342 4434 4553 N
+ T L D s n/a 33 4342 4434 4553 N
+ T L DH e n/a 33 4294 4434 4553 N
+ T L DH s n/a 33 4342 4434 4553 N
+ T L EH b n/a 33 4342 4421 4502 N
+ T L EH e n/a 33 4294 4431 4517 N
+ T L EH i n/a 33 4342 4432 4502 N
+ T L EH s n/a 33 4342 4431 4502 N
+ T L ER b n/a 33 4342 4421 4490 N
+ T L ER e n/a 33 4294 4454 4489 N
+ T L ER i n/a 33 4342 4454 4489 N
+ T L ER s n/a 33 4342 4454 4489 N
+ T L EY b n/a 33 4342 4421 4503 N
+ T L EY e n/a 33 4294 4431 4517 N
+ T L EY i n/a 33 4342 4432 4503 N
+ T L EY s n/a 33 4342 4431 4503 N
+ T L F b n/a 33 4342 4421 4553 N
+ T L F e n/a 33 4294 4435 4553 N
+ T L F i n/a 33 4342 4435 4553 N
+ T L F s n/a 33 4342 4435 4553 N
+ T L G b n/a 33 4342 4421 4553 N
+ T L G e n/a 33 4294 4434 4553 N
+ T L G i n/a 33 4342 4434 4553 N
+ T L G s n/a 33 4342 4434 4553 N
+ T L HH e n/a 33 4294 4435 4554 N
+ T L HH i n/a 33 4342 4435 4554 N
+ T L HH s n/a 33 4342 4435 4554 N
+ T L IH b n/a 33 4342 4421 4472 N
+ T L IH e n/a 33 4294 4460 4515 N
+ T L IH i n/a 33 4342 4460 4513 N
+ T L IH s n/a 33 4342 4460 4515 N
+ T L IY b n/a 33 4342 4421 4511 N
+ T L IY e n/a 33 4294 4460 4511 N
+ T L IY i n/a 33 4342 4460 4511 N
+ T L IY s n/a 33 4342 4460 4511 N
+ T L JH e n/a 33 4294 4434 4553 N
+ T L JH s n/a 33 4342 4434 4553 N
+ T L K e n/a 33 4294 4435 4553 N
+ T L K i n/a 33 4342 4435 4553 N
+ T L K s n/a 33 4342 4435 4553 N
+ T L L b n/a 33 4342 4425 4494 N
+ T L L e n/a 33 4294 4434 4561 N
+ T L L i n/a 33 4342 4434 4494 N
+ T L L s n/a 33 4342 4434 4494 N
+ T L M b n/a 33 4342 4421 4566 N
+ T L M e n/a 33 4294 4434 4566 N
+ T L M i n/a 33 4342 4434 4566 N
+ T L M s n/a 33 4342 4434 4566 N
+ T L N b n/a 33 4342 4421 4566 N
+ T L N e n/a 33 4294 4434 4566 N
+ T L N i n/a 33 4342 4434 4566 N
+ T L N s n/a 33 4342 4434 4566 N
+ T L NG b n/a 33 4342 4421 4566 N
+ T L NG e n/a 33 4294 4434 4566 N
+ T L NG s n/a 33 4342 4434 4566 N
+ T L OW b n/a 33 4342 4421 4491 N
+ T L OW e n/a 33 4294 4431 4493 N
+ T L OW i n/a 33 4342 4431 4491 N
+ T L OW s n/a 33 4342 4431 4493 N
+ T L OY b n/a 33 4342 4421 4501 N
+ T L OY e n/a 33 4294 4431 4496 N
+ T L OY i n/a 33 4342 4431 4501 N
+ T L OY s n/a 33 4342 4431 4501 N
+ T L P e n/a 33 4294 4435 4553 N
+ T L P i n/a 33 4342 4435 4553 N
+ T L P s n/a 33 4342 4435 4553 N
+ T L R b n/a 33 4342 4424 4481 N
+ T L R e n/a 33 4294 4431 4562 N
+ T L R i n/a 33 4342 4430 4481 N
+ T L R s n/a 33 4342 4431 4481 N
+ T L S b n/a 33 4342 4421 4538 N
+ T L S e n/a 33 4294 4435 4538 N
+ T L S i n/a 33 4342 4435 4538 N
+ T L S s n/a 33 4342 4435 4538 N
+ T L SH b n/a 33 4342 4421 4540 N
+ T L SH e n/a 33 4294 4435 4540 N
+ T L SH i n/a 33 4342 4435 4540 N
+ T L SH s n/a 33 4342 4435 4540 N
+ T L SIL e n/a 33 4294 4428 4556 N
+ T L SIL s n/a 33 4342 4428 4556 N
+ T L T b n/a 33 4342 4421 4553 N
+ T L T e n/a 33 4294 4435 4553 N
+ T L T s n/a 33 4342 4435 4553 N
+ T L TH e n/a 33 4294 4435 4553 N
+ T L TH s n/a 33 4342 4435 4553 N
+ T L UH b n/a 33 4342 4421 4476 N
+ T L UH e n/a 33 4294 4460 4476 N
+ T L UH i n/a 33 4342 4460 4477 N
+ T L UH s n/a 33 4342 4460 4476 N
+ T L UW b n/a 33 4342 4421 4479 N
+ T L UW e n/a 33 4294 4460 4479 N
+ T L UW i n/a 33 4342 4460 4479 N
+ T L UW s n/a 33 4342 4460 4479 N
+ T L V b n/a 33 4342 4421 4553 N
+ T L V e n/a 33 4294 4434 4553 N
+ T L V i n/a 33 4342 4434 4553 N
+ T L V s n/a 33 4342 4434 4553 N
+ T L W b n/a 33 4342 4425 4483 N
+ T L W e n/a 33 4294 4434 4563 N
+ T L W i n/a 33 4342 4434 4482 N
+ T L W s n/a 33 4342 4434 4483 N
+ T L Y b n/a 33 4342 4425 4511 N
+ T L Y e n/a 33 4294 4459 4509 N
+ T L Y i n/a 33 4342 4460 4511 N
+ T L Y s n/a 33 4342 4459 4511 N
+ T L Z b n/a 33 4342 4421 4553 N
+ T L Z e n/a 33 4294 4434 4553 N
+ T L Z i n/a 33 4342 4434 4553 N
+ T L Z s n/a 33 4342 4434 4553 N
+ T L ZH e n/a 33 4294 4434 4553 N
+ T L ZH s n/a 33 4342 4434 4553 N
+ T M AA b n/a 33 4376 4410 4500 N
+ T M AA e n/a 33 4374 4422 4496 N
+ T M AA s n/a 33 4376 4410 4500 N
+ T M AE b n/a 33 4376 4411 4502 N
+ T M AE e n/a 33 4374 4422 4517 N
+ T M AE i n/a 33 4377 4411 4502 N
+ T M AE s n/a 33 4376 4411 4502 N
+ T M AH b n/a 33 4376 4413 4473 N
+ T M AH e n/a 33 4374 4422 4518 N
+ T M AH i n/a 33 4377 4413 4504 N
+ T M AH s n/a 33 4376 4413 4506 N
+ T M AO b n/a 33 4376 4410 4501 N
+ T M AO e n/a 33 4374 4422 4496 N
+ T M AO i n/a 33 4377 4410 4501 N
+ T M AO s n/a 33 4376 4410 4501 N
+ T M AW b n/a 33 4376 4411 4502 N
+ T M AW e n/a 33 4374 4422 4518 N
+ T M AW i n/a 33 4377 4411 4502 N
+ T M AW s n/a 33 4376 4411 4502 N
+ T M AY b n/a 33 4376 4410 4500 N
+ T M AY e n/a 33 4374 4422 4496 N
+ T M AY i n/a 33 4377 4410 4500 N
+ T M AY s n/a 33 4376 4410 4500 N
+ T M B b n/a 33 4371 4411 4552 N
+ T M B e n/a 33 4371 4436 4552 N
+ T M B s n/a 33 4371 4436 4552 N
+ T M CH e n/a 33 4371 4436 4552 N
+ T M CH s n/a 33 4371 4436 4552 N
+ T M D e n/a 33 4371 4436 4552 N
+ T M D s n/a 33 4371 4436 4552 N
+ T M DH e n/a 33 4371 4436 4552 N
+ T M DH s n/a 33 4371 4436 4552 N
+ T M EH b n/a 33 4376 4411 4502 N
+ T M EH e n/a 33 4374 4422 4517 N
+ T M EH i n/a 33 4377 4411 4502 N
+ T M EH s n/a 33 4376 4411 4502 N
+ T M ER b n/a 33 4376 4414 4490 N
+ T M ER e n/a 33 4374 4422 4489 N
+ T M ER i n/a 33 4378 4414 4489 N
+ T M ER s n/a 33 4376 4414 4489 N
+ T M EY b n/a 33 4376 4411 4503 N
+ T M EY e n/a 33 4374 4422 4517 N
+ T M EY i n/a 33 4377 4411 4503 N
+ T M EY s n/a 33 4376 4411 4503 N
+ T M F b n/a 33 4372 4411 4552 N
+ T M F e n/a 33 4372 4438 4552 N
+ T M F s n/a 33 4372 4438 4552 N
+ T M G b n/a 33 4371 4411 4552 N
+ T M G e n/a 33 4371 4436 4552 N
+ T M G s n/a 33 4371 4436 4552 N
+ T M HH e n/a 33 4373 4437 4554 N
+ T M HH s n/a 33 4373 4437 4554 N
+ T M IH b n/a 33 4376 4413 4472 N
+ T M IH e n/a 33 4374 4422 4506 N
+ T M IH i n/a 33 4377 4412 4505 N
+ T M IH s n/a 33 4376 4413 4506 N
+ T M IY b n/a 33 4376 4412 4508 N
+ T M IY e n/a 33 4374 4422 4510 N
+ T M IY i n/a 33 4376 4412 4508 N
+ T M IY s n/a 33 4376 4412 4508 N
+ T M JH e n/a 33 4371 4436 4552 N
+ T M JH s n/a 33 4371 4436 4552 N
+ T M K e n/a 33 4371 4436 4552 N
+ T M K s n/a 33 4371 4436 4552 N
+ T M L b n/a 33 4375 4425 4494 N
+ T M L e n/a 33 4375 4423 4561 N
+ T M L s n/a 33 4375 4423 4494 N
+ T M M b n/a 33 4374 4411 4565 N
+ T M M e n/a 33 4374 4434 4565 N
+ T M M i n/a 33 4374 4434 4565 N
+ T M M s n/a 33 4374 4434 4565 N
+ T M N b n/a 33 4374 4411 4565 N
+ T M N e n/a 33 4374 4434 4565 N
+ T M N s n/a 33 4374 4434 4565 N
+ T M NG b n/a 33 4374 4411 4565 N
+ T M NG e n/a 33 4374 4434 4565 N
+ T M NG s n/a 33 4374 4434 4565 N
+ T M OW b n/a 33 4376 4413 4491 N
+ T M OW e n/a 33 4374 4422 4493 N
+ T M OW i n/a 33 4377 4413 4491 N
+ T M OW s n/a 33 4376 4413 4493 N
+ T M OY b n/a 33 4376 4410 4501 N
+ T M OY e n/a 33 4374 4422 4496 N
+ T M OY s n/a 33 4376 4410 4501 N
+ T M P e n/a 33 4371 4436 4552 N
+ T M P s n/a 33 4371 4436 4552 N
+ T M R b n/a 33 4376 4424 4481 N
+ T M R e n/a 33 4375 4424 4562 N
+ T M R i n/a 33 4378 4424 4481 N
+ T M R s n/a 33 4376 4424 4481 N
+ T M S b n/a 33 4372 4411 4532 N
+ T M S e n/a 33 4372 4438 4532 N
+ T M S i n/a 33 4372 4438 4532 N
+ T M S s n/a 33 4372 4438 4532 N
+ T M SH b n/a 33 4372 4411 4540 N
+ T M SH e n/a 33 4372 4438 4540 N
+ T M SH s n/a 33 4372 4438 4540 N
+ T M SIL e n/a 33 4373 4428 4558 N
+ T M SIL s n/a 33 4373 4428 4558 N
+ T M T b n/a 33 4371 4411 4552 N
+ T M T e n/a 33 4371 4436 4552 N
+ T M T s n/a 33 4371 4436 4552 N
+ T M TH e n/a 33 4372 4438 4552 N
+ T M TH s n/a 33 4372 4438 4552 N
+ T M UH b n/a 33 4376 4413 4475 N
+ T M UH e n/a 33 4374 4422 4475 N
+ T M UH s n/a 33 4376 4413 4475 N
+ T M UW b n/a 33 4376 4413 4479 N
+ T M UW e n/a 33 4374 4422 4479 N
+ T M UW i n/a 33 4377 4413 4479 N
+ T M UW s n/a 33 4376 4413 4479 N
+ T M V b n/a 33 4371 4411 4552 N
+ T M V e n/a 33 4371 4436 4552 N
+ T M V s n/a 33 4371 4436 4552 N
+ T M W b n/a 33 4374 4425 4483 N
+ T M W e n/a 33 4374 4423 4562 N
+ T M W i n/a 33 4374 4423 4482 N
+ T M W s n/a 33 4374 4423 4483 N
+ T M Y b n/a 33 4374 4425 4508 N
+ T M Y e n/a 33 4374 4425 4509 N
+ T M Y s n/a 33 4374 4425 4508 N
+ T M Z b n/a 33 4371 4411 4552 N
+ T M Z e n/a 33 4371 4436 4552 N
+ T M Z s n/a 33 4371 4436 4552 N
+ T M ZH e n/a 33 4371 4436 4552 N
+ T M ZH s n/a 33 4371 4436 4552 N
+ T N AA b n/a 33 4376 4410 4500 N
+ T N AA e n/a 33 4374 4422 4496 N
+ T N AA i n/a 33 4377 4410 4500 N
+ T N AA s n/a 33 4376 4410 4500 N
+ T N AE b n/a 33 4376 4411 4502 N
+ T N AE e n/a 33 4374 4422 4517 N
+ T N AE i n/a 33 4377 4411 4502 N
+ T N AE s n/a 33 4376 4411 4502 N
+ T N AH b n/a 33 4376 4413 4473 N
+ T N AH e n/a 33 4374 4422 4518 N
+ T N AH i n/a 33 4377 4413 4504 N
+ T N AH s n/a 33 4376 4413 4506 N
+ T N AO b n/a 33 4376 4410 4501 N
+ T N AO e n/a 33 4374 4422 4496 N
+ T N AO i n/a 33 4377 4410 4501 N
+ T N AO s n/a 33 4376 4410 4501 N
+ T N AW b n/a 33 4376 4411 4502 N
+ T N AW e n/a 33 4374 4422 4518 N
+ T N AW i n/a 33 4377 4411 4502 N
+ T N AW s n/a 33 4376 4411 4502 N
+ T N AY b n/a 33 4376 4410 4500 N
+ T N AY e n/a 33 4374 4422 4496 N
+ T N AY i n/a 33 4377 4410 4500 N
+ T N AY s n/a 33 4376 4410 4500 N
+ T N B b n/a 33 4371 4411 4552 N
+ T N B e n/a 33 4371 4436 4552 N
+ T N B i n/a 33 4371 4436 4552 N
+ T N B s n/a 33 4371 4436 4552 N
+ T N CH e n/a 33 4371 4436 4552 N
+ T N CH i n/a 33 4371 4436 4552 N
+ T N CH s n/a 33 4371 4436 4552 N
+ T N D e n/a 33 4371 4436 4552 N
+ T N D i n/a 33 4371 4436 4552 N
+ T N D s n/a 33 4371 4436 4552 N
+ T N DH e n/a 33 4371 4436 4552 N
+ T N DH s n/a 33 4371 4436 4552 N
+ T N EH b n/a 33 4376 4411 4502 N
+ T N EH e n/a 33 4374 4422 4517 N
+ T N EH i n/a 33 4377 4411 4502 N
+ T N EH s n/a 33 4376 4411 4502 N
+ T N ER b n/a 33 4376 4414 4490 N
+ T N ER e n/a 33 4374 4422 4489 N
+ T N ER i n/a 33 4378 4414 4489 N
+ T N ER s n/a 33 4376 4414 4489 N
+ T N EY b n/a 33 4376 4411 4503 N
+ T N EY e n/a 33 4374 4422 4517 N
+ T N EY i n/a 33 4377 4411 4503 N
+ T N EY s n/a 33 4376 4411 4503 N
+ T N F b n/a 33 4372 4411 4552 N
+ T N F e n/a 33 4372 4438 4552 N
+ T N F i n/a 33 4372 4438 4552 N
+ T N F s n/a 33 4372 4438 4552 N
+ T N G b n/a 33 4371 4411 4552 N
+ T N G e n/a 33 4371 4436 4552 N
+ T N G i n/a 33 4371 4436 4552 N
+ T N G s n/a 33 4371 4436 4552 N
+ T N HH e n/a 33 4373 4437 4554 N
+ T N HH i n/a 33 4373 4437 4554 N
+ T N HH s n/a 33 4373 4437 4554 N
+ T N IH b n/a 33 4376 4413 4472 N
+ T N IH e n/a 33 4374 4422 4506 N
+ T N IH i n/a 33 4377 4412 4505 N
+ T N IH s n/a 33 4376 4413 4506 N
+ T N IY b n/a 33 4376 4412 4508 N
+ T N IY e n/a 33 4374 4422 4510 N
+ T N IY i n/a 33 4376 4412 4508 N
+ T N IY s n/a 33 4376 4412 4508 N
+ T N JH e n/a 33 4371 4436 4552 N
+ T N JH i n/a 33 4371 4436 4552 N
+ T N JH s n/a 33 4371 4436 4552 N
+ T N K e n/a 33 4371 4436 4552 N
+ T N K i n/a 33 4371 4436 4552 N
+ T N K s n/a 33 4371 4436 4552 N
+ T N L b n/a 33 4375 4427 4494 N
+ T N L e n/a 33 4375 4423 4561 N
+ T N L i n/a 33 4375 4423 4494 N
+ T N L s n/a 33 4375 4423 4494 N
+ T N M b n/a 33 4374 4411 4565 N
+ T N M e n/a 33 4374 4434 4565 N
+ T N M i n/a 33 4374 4434 4565 N
+ T N M s n/a 33 4374 4434 4565 N
+ T N N b n/a 33 4374 4411 4565 N
+ T N N e n/a 33 4374 4434 4565 N
+ T N N i n/a 33 4374 4434 4565 N
+ T N N s n/a 33 4374 4434 4565 N
+ T N NG b n/a 33 4374 4411 4565 N
+ T N NG e n/a 33 4374 4434 4565 N
+ T N NG s n/a 33 4374 4434 4565 N
+ T N OW b n/a 33 4376 4413 4491 N
+ T N OW e n/a 33 4374 4422 4493 N
+ T N OW i n/a 33 4377 4413 4491 N
+ T N OW s n/a 33 4376 4413 4493 N
+ T N OY b n/a 33 4376 4410 4501 N
+ T N OY e n/a 33 4374 4422 4496 N
+ T N OY i n/a 33 4377 4410 4501 N
+ T N OY s n/a 33 4376 4410 4501 N
+ T N P e n/a 33 4371 4436 4552 N
+ T N P i n/a 33 4371 4436 4552 N
+ T N P s n/a 33 4371 4436 4552 N
+ T N R b n/a 33 4376 4427 4481 N
+ T N R e n/a 33 4375 4423 4562 N
+ T N R i n/a 33 4378 4427 4481 N
+ T N R s n/a 33 4376 4427 4481 N
+ T N S b n/a 33 4372 4411 4534 N
+ T N S e n/a 33 4372 4438 4534 N
+ T N S i n/a 33 4372 4438 4534 N
+ T N S s n/a 33 4372 4438 4534 N
+ T N SH b n/a 33 4372 4411 4540 N
+ T N SH e n/a 33 4372 4438 4540 N
+ T N SH i n/a 33 4372 4438 4540 N
+ T N SH s n/a 33 4372 4438 4540 N
+ T N SIL e n/a 33 4373 4429 4558 N
+ T N SIL s n/a 33 4373 4429 4558 N
+ T N T b n/a 33 4371 4411 4552 N
+ T N T e n/a 33 4371 4436 4552 N
+ T N T i n/a 33 4371 4436 4552 N
+ T N T s n/a 33 4371 4436 4552 N
+ T N TH e n/a 33 4372 4438 4552 N
+ T N TH i n/a 33 4372 4438 4552 N
+ T N TH s n/a 33 4372 4438 4552 N
+ T N UH b n/a 33 4376 4413 4475 N
+ T N UH e n/a 33 4374 4422 4475 N
+ T N UH i n/a 33 4377 4413 4475 N
+ T N UH s n/a 33 4376 4413 4475 N
+ T N UW b n/a 33 4376 4413 4479 N
+ T N UW e n/a 33 4374 4422 4479 N
+ T N UW i n/a 33 4377 4413 4479 N
+ T N UW s n/a 33 4376 4413 4479 N
+ T N V b n/a 33 4371 4411 4552 N
+ T N V e n/a 33 4371 4436 4552 N
+ T N V i n/a 33 4371 4436 4552 N
+ T N V s n/a 33 4371 4436 4552 N
+ T N W b n/a 33 4374 4427 4483 N
+ T N W e n/a 33 4374 4423 4562 N
+ T N W i n/a 33 4374 4423 4482 N
+ T N W s n/a 33 4374 4423 4483 N
+ T N Y b n/a 33 4374 4425 4508 N
+ T N Y e n/a 33 4374 4425 4509 N
+ T N Y i n/a 33 4374 4425 4508 N
+ T N Y s n/a 33 4374 4425 4508 N
+ T N Z b n/a 33 4371 4411 4552 N
+ T N Z e n/a 33 4371 4436 4552 N
+ T N Z i n/a 33 4371 4436 4552 N
+ T N Z s n/a 33 4371 4436 4552 N
+ T N ZH e n/a 33 4371 4436 4552 N
+ T N ZH s n/a 33 4371 4436 4552 N
+ T NG AA b n/a 33 4376 4410 4500 N
+ T NG AA s n/a 33 4376 4410 4500 N
+ T NG AE b n/a 33 4376 4411 4502 N
+ T NG AE s n/a 33 4376 4411 4502 N
+ T NG AH b n/a 33 4376 4413 4473 N
+ T NG AH i n/a 33 4377 4413 4505 N
+ T NG AH s n/a 33 4376 4413 4506 N
+ T NG AO b n/a 33 4376 4410 4501 N
+ T NG AO s n/a 33 4376 4410 4501 N
+ T NG AW b n/a 33 4376 4411 4502 N
+ T NG AW i n/a 33 4377 4411 4502 N
+ T NG AW s n/a 33 4376 4411 4502 N
+ T NG AY b n/a 33 4376 4410 4500 N
+ T NG AY i n/a 33 4377 4410 4500 N
+ T NG AY s n/a 33 4376 4410 4500 N
+ T NG B b n/a 33 4371 4411 4552 N
+ T NG B s n/a 33 4371 4436 4552 N
+ T NG CH s n/a 33 4371 4436 4552 N
+ T NG D s n/a 33 4371 4436 4552 N
+ T NG DH s n/a 33 4371 4436 4552 N
+ T NG EH b n/a 33 4376 4411 4502 N
+ T NG EH s n/a 33 4376 4411 4502 N
+ T NG ER b n/a 33 4376 4414 4490 N
+ T NG ER i n/a 33 4378 4414 4489 N
+ T NG ER s n/a 33 4376 4414 4489 N
+ T NG EY b n/a 33 4376 4411 4503 N
+ T NG EY s n/a 33 4376 4411 4503 N
+ T NG F b n/a 33 4372 4411 4552 N
+ T NG F s n/a 33 4372 4438 4552 N
+ T NG G b n/a 33 4371 4411 4552 N
+ T NG G s n/a 33 4371 4436 4552 N
+ T NG HH s n/a 33 4373 4437 4554 N
+ T NG IH b n/a 33 4376 4413 4472 N
+ T NG IH i n/a 33 4377 4412 4505 N
+ T NG IH s n/a 33 4376 4413 4506 N
+ T NG IY b n/a 33 4376 4412 4508 N
+ T NG IY s n/a 33 4376 4412 4508 N
+ T NG JH s n/a 33 4371 4436 4552 N
+ T NG K s n/a 33 4371 4436 4552 N
+ T NG L b n/a 33 4375 4425 4494 N
+ T NG L s n/a 33 4375 4423 4494 N
+ T NG M b n/a 33 4374 4411 4565 N
+ T NG M s n/a 33 4374 4434 4565 N
+ T NG N b n/a 33 4374 4411 4565 N
+ T NG N s n/a 33 4374 4434 4565 N
+ T NG NG b n/a 33 4374 4411 4565 N
+ T NG NG s n/a 33 4374 4434 4565 N
+ T NG OW b n/a 33 4376 4413 4491 N
+ T NG OW i n/a 33 4377 4413 4491 N
+ T NG OW s n/a 33 4376 4413 4493 N
+ T NG OY b n/a 33 4376 4410 4501 N
+ T NG OY s n/a 33 4376 4410 4501 N
+ T NG P s n/a 33 4371 4436 4552 N
+ T NG R b n/a 33 4376 4424 4481 N
+ T NG R i n/a 33 4378 4424 4481 N
+ T NG R s n/a 33 4376 4424 4481 N
+ T NG S b n/a 33 4372 4411 4532 N
+ T NG S i n/a 33 4372 4438 4532 N
+ T NG S s n/a 33 4372 4438 4532 N
+ T NG SH b n/a 33 4372 4411 4540 N
+ T NG SH s n/a 33 4372 4438 4540 N
+ T NG SIL s n/a 33 4373 4428 4558 N
+ T NG T b n/a 33 4371 4411 4552 N
+ T NG T s n/a 33 4371 4436 4552 N
+ T NG TH s n/a 33 4372 4438 4552 N
+ T NG UH b n/a 33 4376 4413 4475 N
+ T NG UH s n/a 33 4376 4413 4475 N
+ T NG UW b n/a 33 4376 4413 4479 N
+ T NG UW i n/a 33 4377 4413 4479 N
+ T NG UW s n/a 33 4376 4413 4479 N
+ T NG V b n/a 33 4371 4411 4552 N
+ T NG V s n/a 33 4371 4436 4552 N
+ T NG W b n/a 33 4374 4425 4483 N
+ T NG W s n/a 33 4374 4423 4483 N
+ T NG Y b n/a 33 4374 4425 4508 N
+ T NG Y s n/a 33 4374 4425 4508 N
+ T NG Z b n/a 33 4371 4411 4552 N
+ T NG Z s n/a 33 4371 4436 4552 N
+ T NG ZH s n/a 33 4371 4436 4552 N
+ T OW AA b n/a 33 4336 4420 4500 N
+ T OW AA e n/a 33 4295 4387 4496 N
+ T OW AA i n/a 33 4327 4431 4500 N
+ T OW AA s n/a 33 4336 4431 4500 N
+ T OW AE b n/a 33 4336 4420 4502 N
+ T OW AE e n/a 33 4295 4387 4517 N
+ T OW AE i n/a 33 4327 4432 4502 N
+ T OW AE s n/a 33 4336 4431 4502 N
+ T OW AH b n/a 33 4336 4416 4473 N
+ T OW AH e n/a 33 4295 4387 4518 N
+ T OW AH i n/a 33 4324 4449 4523 N
+ T OW AH s n/a 33 4336 4449 4518 N
+ T OW AO b n/a 33 4336 4420 4501 N
+ T OW AO e n/a 33 4295 4387 4496 N
+ T OW AO i n/a 33 4327 4431 4501 N
+ T OW AO s n/a 33 4336 4431 4501 N
+ T OW AW b n/a 33 4336 4420 4502 N
+ T OW AW e n/a 33 4295 4387 4519 N
+ T OW AW i n/a 33 4328 4432 4502 N
+ T OW AW s n/a 33 4336 4431 4502 N
+ T OW AY b n/a 33 4336 4420 4500 N
+ T OW AY e n/a 33 4295 4386 4496 N
+ T OW AY i n/a 33 4327 4431 4500 N
+ T OW AY s n/a 33 4336 4431 4500 N
+ T OW B b n/a 33 4336 4403 4553 N
+ T OW B e n/a 33 4295 4403 4553 N
+ T OW B i n/a 33 4328 4403 4553 N
+ T OW B s n/a 33 4336 4403 4553 N
+ T OW CH e n/a 33 4295 4403 4553 N
+ T OW CH i n/a 33 4328 4403 4553 N
+ T OW CH s n/a 33 4336 4403 4553 N
+ T OW D e n/a 33 4295 4403 4553 N
+ T OW D s n/a 33 4328 4403 4553 N
+ T OW DH e n/a 33 4295 4403 4553 N
+ T OW DH s n/a 33 4336 4403 4553 N
+ T OW EH b n/a 33 4336 4415 4502 N
+ T OW EH e n/a 33 4295 4387 4517 N
+ T OW EH i n/a 33 4327 4432 4502 N
+ T OW EH s n/a 33 4336 4431 4502 N
+ T OW ER b n/a 33 4336 4417 4490 N
+ T OW ER e n/a 33 4295 4387 4487 N
+ T OW ER i n/a 33 4324 4453 4487 N
+ T OW ER s n/a 33 4336 4453 4487 N
+ T OW EY b n/a 33 4336 4415 4503 N
+ T OW EY e n/a 33 4295 4387 4517 N
+ T OW EY i n/a 33 4327 4432 4503 N
+ T OW EY s n/a 33 4336 4431 4503 N
+ T OW F b n/a 33 4336 4403 4553 N
+ T OW F e n/a 33 4295 4403 4553 N
+ T OW F i n/a 33 4328 4403 4553 N
+ T OW F s n/a 33 4336 4403 4553 N
+ T OW G b n/a 33 4336 4403 4553 N
+ T OW G e n/a 33 4295 4403 4553 N
+ T OW G i n/a 33 4328 4403 4553 N
+ T OW G s n/a 33 4336 4403 4553 N
+ T OW HH e n/a 33 4295 4403 4554 N
+ T OW HH i n/a 33 4328 4403 4554 N
+ T OW HH s n/a 33 4336 4403 4554 N
+ T OW IH b n/a 33 4336 4416 4472 N
+ T OW IH e n/a 33 4295 4387 4515 N
+ T OW IH i n/a 33 4324 4456 4512 N
+ T OW IH s n/a 33 4336 4456 4515 N
+ T OW IY b n/a 33 4336 4415 4511 N
+ T OW IY e n/a 33 4295 4387 4510 N
+ T OW IY i n/a 33 4330 4455 4510 N
+ T OW IY s n/a 33 4336 4455 4511 N
+ T OW JH e n/a 33 4295 4403 4553 N
+ T OW JH s n/a 33 4336 4403 4553 N
+ T OW K e n/a 33 4295 4403 4553 N
+ T OW K i n/a 33 4328 4403 4553 N
+ T OW K s n/a 33 4336 4403 4553 N
+ T OW L b n/a 33 4336 4425 4494 N
+ T OW L e n/a 33 4295 4390 4561 N
+ T OW L i n/a 33 4331 4434 4494 N
+ T OW L s n/a 33 4336 4434 4494 N
+ T OW M b n/a 33 4336 4403 4566 N
+ T OW M e n/a 33 4295 4403 4566 N
+ T OW M i n/a 33 4328 4403 4566 N
+ T OW M s n/a 33 4336 4403 4566 N
+ T OW N b n/a 33 4328 4403 4566 N
+ T OW N e n/a 33 4295 4403 4566 N
+ T OW N i n/a 33 4328 4403 4566 N
+ T OW N s n/a 33 4328 4403 4566 N
+ T OW NG b n/a 33 4336 4403 4566 N
+ T OW NG e n/a 33 4295 4403 4566 N
+ T OW NG s n/a 33 4336 4403 4566 N
+ T OW OW b n/a 33 4336 4417 4491 N
+ T OW OW e n/a 33 4295 4387 4493 N
+ T OW OW i n/a 33 4328 4431 4493 N
+ T OW OW s n/a 33 4336 4431 4493 N
+ T OW OY b n/a 33 4336 4420 4501 N
+ T OW OY e n/a 33 4295 4386 4496 N
+ T OW OY s n/a 33 4336 4431 4501 N
+ T OW P e n/a 33 4295 4403 4553 N
+ T OW P i n/a 33 4328 4403 4553 N
+ T OW P s n/a 33 4336 4403 4553 N
+ T OW R b n/a 33 4336 4424 4481 N
+ T OW R e n/a 33 4295 4390 4562 N
+ T OW R i n/a 33 4327 4430 4481 N
+ T OW R s n/a 33 4336 4431 4481 N
+ T OW S b n/a 33 4333 4403 4538 N
+ T OW S e n/a 33 4295 4403 4538 N
+ T OW S i n/a 33 4333 4403 4538 N
+ T OW S s n/a 33 4333 4403 4538 N
+ T OW SH b n/a 33 4336 4403 4540 N
+ T OW SH e n/a 33 4295 4403 4540 N
+ T OW SH s n/a 33 4336 4403 4540 N
+ T OW SIL e n/a 33 4295 4446 4558 N
+ T OW SIL s n/a 33 4336 4446 4558 N
+ T OW T b n/a 33 4328 4403 4553 N
+ T OW T e n/a 33 4295 4403 4553 N
+ T OW T i n/a 33 4328 4403 4553 N
+ T OW T s n/a 33 4328 4403 4553 N
+ T OW TH e n/a 33 4295 4403 4553 N
+ T OW TH s n/a 33 4336 4403 4553 N
+ T OW UH b n/a 33 4336 4417 4475 N
+ T OW UH e n/a 33 4295 4387 4475 N
+ T OW UH s n/a 33 4336 4461 4475 N
+ T OW UW b n/a 33 4336 4417 4479 N
+ T OW UW e n/a 33 4295 4387 4479 N
+ T OW UW i n/a 33 4328 4461 4480 N
+ T OW UW s n/a 33 4336 4461 4479 N
+ T OW V b n/a 33 4336 4403 4553 N
+ T OW V e n/a 33 4295 4403 4553 N
+ T OW V i n/a 33 4328 4403 4553 N
+ T OW V s n/a 33 4336 4403 4553 N
+ T OW W b n/a 33 4336 4425 4483 N
+ T OW W e n/a 33 4295 4390 4563 N
+ T OW W i n/a 33 4331 4434 4482 N
+ T OW W s n/a 33 4336 4434 4483 N
+ T OW Y b n/a 33 4336 4425 4511 N
+ T OW Y e n/a 33 4295 4383 4509 N
+ T OW Y i n/a 33 4330 4455 4510 N
+ T OW Y s n/a 33 4336 4455 4511 N
+ T OW Z b n/a 33 4333 4403 4553 N
+ T OW Z e n/a 33 4295 4403 4553 N
+ T OW Z i n/a 33 4333 4403 4553 N
+ T OW Z s n/a 33 4333 4403 4553 N
+ T OW ZH e n/a 33 4295 4403 4553 N
+ T OW ZH s n/a 33 4336 4403 4553 N
+ T OY AA b n/a 33 4345 4420 4500 N
+ T OY AA e n/a 33 4349 4387 4496 N
+ T OY AA i n/a 33 4348 4431 4500 N
+ T OY AA s n/a 33 4344 4431 4500 N
+ T OY AE b n/a 33 4345 4420 4502 N
+ T OY AE e n/a 33 4349 4380 4517 N
+ T OY AE i n/a 33 4350 4432 4502 N
+ T OY AE s n/a 33 4344 4431 4502 N
+ T OY AH b n/a 33 4345 4416 4473 N
+ T OY AH e n/a 33 4349 4380 4517 N
+ T OY AH i n/a 33 4348 4458 4524 N
+ T OY AH s n/a 33 4344 4458 4517 N
+ T OY AO b n/a 33 4345 4420 4501 N
+ T OY AO e n/a 33 4349 4387 4496 N
+ T OY AO s n/a 33 4344 4431 4501 N
+ T OY AW b n/a 33 4345 4420 4502 N
+ T OY AW e n/a 33 4349 4380 4519 N
+ T OY AW s n/a 33 4344 4431 4502 N
+ T OY AY b n/a 33 4345 4420 4500 N
+ T OY AY e n/a 33 4349 4386 4496 N
+ T OY AY s n/a 33 4344 4431 4500 N
+ T OY B b n/a 33 4346 4403 4544 N
+ T OY B e n/a 33 4346 4403 4544 N
+ T OY B s n/a 33 4346 4403 4544 N
+ T OY CH e n/a 33 4346 4403 4544 N
+ T OY CH s n/a 33 4346 4403 4544 N
+ T OY D e n/a 33 4346 4403 4544 N
+ T OY D s n/a 33 4346 4403 4544 N
+ T OY DH e n/a 33 4351 4403 4544 N
+ T OY DH s n/a 33 4351 4403 4544 N
+ T OY EH b n/a 33 4345 4415 4502 N
+ T OY EH e n/a 33 4349 4380 4517 N
+ T OY EH s n/a 33 4344 4431 4502 N
+ T OY ER b n/a 33 4345 4417 4490 N
+ T OY ER e n/a 33 4349 4387 4487 N
+ T OY ER i n/a 33 4348 4448 4487 N
+ T OY ER s n/a 33 4344 4448 4487 N
+ T OY EY b n/a 33 4345 4415 4503 N
+ T OY EY e n/a 33 4349 4380 4517 N
+ T OY EY i n/a 33 4350 4432 4503 N
+ T OY EY s n/a 33 4344 4431 4503 N
+ T OY F b n/a 33 4351 4403 4535 N
+ T OY F e n/a 33 4351 4403 4535 N
+ T OY F s n/a 33 4351 4403 4535 N
+ T OY G b n/a 33 4346 4403 4544 N
+ T OY G e n/a 33 4346 4403 4544 N
+ T OY G i n/a 33 4346 4403 4544 N
+ T OY G s n/a 33 4346 4403 4544 N
+ T OY HH e n/a 33 4349 4382 4554 N
+ T OY HH s n/a 33 4349 4382 4554 N
+ T OY IH b n/a 33 4345 4416 4472 N
+ T OY IH e n/a 33 4349 4380 4516 N
+ T OY IH i n/a 33 4348 4458 4516 N
+ T OY IH s n/a 33 4344 4458 4516 N
+ T OY IY b n/a 33 4345 4415 4508 N
+ T OY IY e n/a 33 4349 4380 4510 N
+ T OY IY i n/a 33 4350 4455 4508 N
+ T OY IY s n/a 33 4344 4455 4508 N
+ T OY JH e n/a 33 4346 4403 4544 N
+ T OY JH s n/a 33 4346 4403 4544 N
+ T OY K e n/a 33 4346 4403 4544 N
+ T OY K i n/a 33 4346 4403 4544 N
+ T OY K s n/a 33 4346 4403 4544 N
+ T OY L b n/a 33 4345 4425 4494 N
+ T OY L e n/a 33 4349 4392 4561 N
+ T OY L i n/a 33 4346 4433 4494 N
+ T OY L s n/a 33 4344 4433 4494 N
+ T OY M b n/a 33 4349 4392 4565 N
+ T OY M e n/a 33 4349 4392 4565 N
+ T OY M s n/a 33 4349 4392 4565 N
+ T OY N b n/a 33 4349 4392 4565 N
+ T OY N e n/a 33 4349 4392 4565 N
+ T OY N i n/a 33 4346 4392 4565 N
+ T OY N s n/a 33 4349 4392 4565 N
+ T OY NG b n/a 33 4349 4392 4565 N
+ T OY NG e n/a 33 4349 4392 4565 N
+ T OY NG s n/a 33 4349 4392 4565 N
+ T OY OW b n/a 33 4345 4417 4491 N
+ T OY OW e n/a 33 4349 4387 4493 N
+ T OY OW i n/a 33 4348 4431 4493 N
+ T OY OW s n/a 33 4344 4431 4493 N
+ T OY OY b n/a 33 4345 4420 4501 N
+ T OY OY e n/a 33 4349 4386 4496 N
+ T OY OY s n/a 33 4344 4431 4501 N
+ T OY P e n/a 33 4346 4403 4544 N
+ T OY P s n/a 33 4346 4403 4544 N
+ T OY R b n/a 33 4345 4424 4481 N
+ T OY R e n/a 33 4349 4392 4562 N
+ T OY R i n/a 33 4346 4430 4481 N
+ T OY R s n/a 33 4344 4430 4481 N
+ T OY S b n/a 33 4351 4403 4537 N
+ T OY S e n/a 33 4351 4403 4537 N
+ T OY S i n/a 33 4346 4403 4537 N
+ T OY S s n/a 33 4351 4403 4537 N
+ T OY SH b n/a 33 4351 4403 4540 N
+ T OY SH e n/a 33 4351 4403 4540 N
+ T OY SH s n/a 33 4351 4403 4540 N
+ T OY SIL e n/a 33 4350 4446 4559 N
+ T OY SIL s n/a 33 4350 4446 4559 N
+ T OY T b n/a 33 4346 4403 4544 N
+ T OY T e n/a 33 4346 4403 4544 N
+ T OY T s n/a 33 4346 4403 4544 N
+ T OY TH e n/a 33 4351 4403 4537 N
+ T OY TH s n/a 33 4351 4403 4537 N
+ T OY UH b n/a 33 4345 4417 4475 N
+ T OY UH e n/a 33 4349 4387 4475 N
+ T OY UH s n/a 33 4344 4461 4475 N
+ T OY UW b n/a 33 4345 4417 4480 N
+ T OY UW e n/a 33 4349 4387 4480 N
+ T OY UW s n/a 33 4344 4461 4480 N
+ T OY V b n/a 33 4351 4403 4544 N
+ T OY V e n/a 33 4351 4403 4544 N
+ T OY V s n/a 33 4351 4403 4544 N
+ T OY W b n/a 33 4345 4425 4483 N
+ T OY W e n/a 33 4349 4392 4562 N
+ T OY W i n/a 33 4346 4433 4482 N
+ T OY W s n/a 33 4344 4433 4483 N
+ T OY Y b n/a 33 4345 4425 4508 N
+ T OY Y e n/a 33 4349 4383 4509 N
+ T OY Y i n/a 33 4350 4455 4508 N
+ T OY Y s n/a 33 4344 4455 4508 N
+ T OY Z b n/a 33 4351 4403 4544 N
+ T OY Z e n/a 33 4351 4403 4544 N
+ T OY Z i n/a 33 4346 4403 4544 N
+ T OY Z s n/a 33 4351 4403 4544 N
+ T OY ZH e n/a 33 4351 4403 4544 N
+ T OY ZH s n/a 33 4351 4403 4544 N
+ T P AA b n/a 33 4366 4408 4500 N
+ T P AA e n/a 33 4365 4468 4498 N
+ T P AA i n/a 33 4367 4468 4500 N
+ T P AA s n/a 33 4366 4468 4500 N
+ T P AE b n/a 33 4366 4409 4502 N
+ T P AE e n/a 33 4365 4468 4527 N
+ T P AE i n/a 33 4367 4468 4502 N
+ T P AE s n/a 33 4366 4468 4502 N
+ T P AH b n/a 33 4366 4406 4474 N
+ T P AH e n/a 33 4365 4468 4528 N
+ T P AH i n/a 33 4367 4468 4530 N
+ T P AH s n/a 33 4366 4468 4529 N
+ T P AO b n/a 33 4366 4408 4501 N
+ T P AO e n/a 33 4365 4468 4498 N
+ T P AO i n/a 33 4367 4468 4501 N
+ T P AO s n/a 33 4366 4468 4501 N
+ T P AW b n/a 33 4366 4409 4502 N
+ T P AW e n/a 33 4365 4468 4527 N
+ T P AW i n/a 33 4367 4468 4502 N
+ T P AW s n/a 33 4366 4468 4502 N
+ T P AY b n/a 33 4366 4408 4500 N
+ T P AY e n/a 33 4365 4468 4496 N
+ T P AY i n/a 33 4367 4468 4500 N
+ T P AY s n/a 33 4366 4468 4500 N
+ T P B b n/a 33 4366 4409 4551 N
+ T P B e n/a 33 4365 4441 4551 N
+ T P B s n/a 33 4366 4441 4551 N
+ T P CH e n/a 33 4365 4441 4550 N
+ T P CH i n/a 33 4367 4441 4550 N
+ T P CH s n/a 33 4366 4441 4550 N
+ T P D e n/a 33 4365 4441 4551 N
+ T P D s n/a 33 4365 4441 4551 N
+ T P DH e n/a 33 4365 4441 4551 N
+ T P DH s n/a 33 4365 4441 4551 N
+ T P EH b n/a 33 4366 4409 4502 N
+ T P EH e n/a 33 4365 4468 4527 N
+ T P EH i n/a 33 4367 4468 4502 N
+ T P EH s n/a 33 4366 4468 4502 N
+ T P ER b n/a 33 4366 4408 4490 N
+ T P ER e n/a 33 4365 4470 4488 N
+ T P ER i n/a 33 4367 4470 4485 N
+ T P ER s n/a 33 4366 4470 4488 N
+ T P EY b n/a 33 4366 4409 4503 N
+ T P EY e n/a 33 4365 4468 4527 N
+ T P EY i n/a 33 4367 4468 4503 N
+ T P EY s n/a 33 4366 4468 4503 N
+ T P F b n/a 33 4366 4409 4549 N
+ T P F e n/a 33 4365 4442 4549 N
+ T P F i n/a 33 4367 4442 4549 N
+ T P F s n/a 33 4366 4442 4549 N
+ T P G b n/a 33 4366 4409 4549 N
+ T P G e n/a 33 4365 4441 4549 N
+ T P G s n/a 33 4366 4441 4549 N
+ T P HH e n/a 33 4365 4442 4555 N
+ T P HH i n/a 33 4367 4442 4555 N
+ T P HH s n/a 33 4366 4442 4555 N
+ T P IH b n/a 33 4366 4406 4472 N
+ T P IH e n/a 33 4365 4468 4506 N
+ T P IH i n/a 33 4367 4468 4507 N
+ T P IH s n/a 33 4366 4468 4506 N
+ T P IY b n/a 33 4366 4409 4508 N
+ T P IY e n/a 33 4365 4468 4510 N
+ T P IY i n/a 33 4367 4468 4508 N
+ T P IY s n/a 33 4366 4468 4508 N
+ T P JH e n/a 33 4365 4441 4550 N
+ T P JH s n/a 33 4366 4441 4550 N
+ T P K e n/a 33 4365 4441 4549 N
+ T P K s n/a 33 4366 4441 4549 N
+ T P L b n/a 33 4366 4425 4494 N
+ T P L e n/a 33 4365 4443 4564 N
+ T P L i n/a 33 4367 4443 4494 N
+ T P L s n/a 33 4366 4443 4494 N
+ T P M b n/a 33 4366 4409 4567 N
+ T P M e n/a 33 4365 4443 4567 N
+ T P M i n/a 33 4367 4443 4567 N
+ T P M s n/a 33 4366 4443 4567 N
+ T P N b n/a 33 4365 4409 4567 N
+ T P N e n/a 33 4365 4443 4567 N
+ T P N i n/a 33 4367 4443 4567 N
+ T P N s n/a 33 4365 4443 4567 N
+ T P NG b n/a 33 4366 4409 4567 N
+ T P NG e n/a 33 4365 4443 4567 N
+ T P NG s n/a 33 4366 4443 4567 N
+ T P OW b n/a 33 4366 4408 4491 N
+ T P OW e n/a 33 4365 4468 4493 N
+ T P OW i n/a 33 4367 4468 4491 N
+ T P OW s n/a 33 4366 4468 4493 N
+ T P OY b n/a 33 4366 4408 4501 N
+ T P OY e n/a 33 4365 4468 4496 N
+ T P OY s n/a 33 4366 4468 4501 N
+ T P P e n/a 33 4365 4441 4551 N
+ T P P s n/a 33 4366 4441 4551 N
+ T P R b n/a 33 4366 4424 4481 N
+ T P R e n/a 33 4365 4470 4564 N
+ T P R i n/a 33 4367 4470 4481 N
+ T P R s n/a 33 4366 4470 4481 N
+ T P S b n/a 33 4365 4409 4536 N
+ T P S e n/a 33 4365 4442 4536 N
+ T P S i n/a 33 4367 4442 4536 N
+ T P S s n/a 33 4365 4442 4536 N
+ T P SH b n/a 33 4366 4409 4540 N
+ T P SH e n/a 33 4365 4442 4540 N
+ T P SH s n/a 33 4366 4442 4540 N
+ T P SIL e n/a 33 4366 4428 4558 N
+ T P SIL s n/a 33 4366 4428 4558 N
+ T P T b n/a 33 4365 4409 4550 N
+ T P T e n/a 33 4365 4441 4550 N
+ T P T s n/a 33 4365 4441 4550 N
+ T P TH e n/a 33 4365 4441 4551 N
+ T P TH s n/a 33 4365 4441 4551 N
+ T P UH b n/a 33 4366 4408 4475 N
+ T P UH e n/a 33 4365 4468 4475 N
+ T P UH s n/a 33 4366 4468 4475 N
+ T P UW b n/a 33 4366 4407 4479 N
+ T P UW e n/a 33 4365 4468 4479 N
+ T P UW i n/a 33 4367 4468 4479 N
+ T P UW s n/a 33 4366 4468 4479 N
+ T P V b n/a 33 4366 4409 4551 N
+ T P V e n/a 33 4365 4442 4551 N
+ T P V s n/a 33 4366 4442 4551 N
+ T P W b n/a 33 4366 4425 4483 N
+ T P W e n/a 33 4365 4443 4564 N
+ T P W s n/a 33 4366 4443 4483 N
+ T P Y b n/a 33 4366 4425 4508 N
+ T P Y e n/a 33 4365 4455 4508 N
+ T P Y s n/a 33 4366 4455 4508 N
+ T P Z b n/a 33 4365 4409 4551 N
+ T P Z e n/a 33 4365 4442 4551 N
+ T P Z i n/a 33 4367 4442 4551 N
+ T P Z s n/a 33 4365 4442 4551 N
+ T P ZH e n/a 33 4365 4442 4551 N
+ T P ZH s n/a 33 4366 4442 4551 N
+ T R AA b n/a 33 4338 4420 4500 N
+ T R AA e n/a 33 4291 4431 4496 N
+ T R AA i n/a 33 4336 4431 4500 N
+ T R AA s n/a 33 4338 4431 4500 N
+ T R AE b n/a 33 4338 4420 4502 N
+ T R AE e n/a 33 4291 4431 4517 N
+ T R AE i n/a 33 4336 4432 4502 N
+ T R AE s n/a 33 4338 4431 4502 N
+ T R AH b n/a 33 4338 4417 4473 N
+ T R AH e n/a 33 4291 4449 4520 N
+ T R AH i n/a 33 4337 4449 4523 N
+ T R AH s n/a 33 4338 4449 4520 N
+ T R AO b n/a 33 4338 4420 4501 N
+ T R AO e n/a 33 4291 4431 4496 N
+ T R AO i n/a 33 4336 4431 4501 N
+ T R AO s n/a 33 4338 4431 4501 N
+ T R AW b n/a 33 4338 4420 4502 N
+ T R AW e n/a 33 4291 4431 4520 N
+ T R AW s n/a 33 4338 4431 4502 N
+ T R AY b n/a 33 4338 4420 4500 N
+ T R AY e n/a 33 4291 4431 4496 N
+ T R AY i n/a 33 4337 4431 4500 N
+ T R AY s n/a 33 4338 4431 4500 N
+ T R B b n/a 33 4338 4417 4553 N
+ T R B e n/a 33 4291 4433 4553 N
+ T R B i n/a 33 4337 4433 4553 N
+ T R B s n/a 33 4338 4433 4553 N
+ T R CH e n/a 33 4291 4435 4553 N
+ T R CH i n/a 33 4337 4435 4553 N
+ T R CH s n/a 33 4338 4435 4553 N
+ T R D e n/a 33 4291 4433 4553 N
+ T R D s n/a 33 4328 4433 4553 N
+ T R DH e n/a 33 4292 4433 4553 N
+ T R DH s n/a 33 4338 4433 4553 N
+ T R EH b n/a 33 4338 4417 4502 N
+ T R EH e n/a 33 4291 4431 4517 N
+ T R EH i n/a 33 4337 4432 4502 N
+ T R EH s n/a 33 4338 4431 4502 N
+ T R ER b n/a 33 4338 4417 4490 N
+ T R ER e n/a 33 4291 4453 4487 N
+ T R ER i n/a 33 4337 4453 4487 N
+ T R ER s n/a 33 4338 4453 4487 N
+ T R EY b n/a 33 4338 4417 4503 N
+ T R EY e n/a 33 4291 4431 4517 N
+ T R EY i n/a 33 4336 4432 4503 N
+ T R EY s n/a 33 4338 4431 4503 N
+ T R F b n/a 33 4338 4417 4553 N
+ T R F e n/a 33 4291 4435 4553 N
+ T R F i n/a 33 4337 4435 4553 N
+ T R F s n/a 33 4338 4435 4553 N
+ T R G b n/a 33 4338 4417 4553 N
+ T R G e n/a 33 4291 4433 4553 N
+ T R G i n/a 33 4337 4433 4553 N
+ T R G s n/a 33 4338 4433 4553 N
+ T R HH e n/a 33 4291 4435 4554 N
+ T R HH i n/a 33 4337 4435 4554 N
+ T R HH s n/a 33 4338 4435 4554 N
+ T R IH b n/a 33 4338 4417 4472 N
+ T R IH e n/a 33 4291 4456 4515 N
+ T R IH i n/a 33 4337 4456 4512 N
+ T R IH s n/a 33 4338 4456 4515 N
+ T R IY b n/a 33 4338 4417 4511 N
+ T R IY e n/a 33 4291 4462 4510 N
+ T R IY i n/a 33 4337 4462 4510 N
+ T R IY s n/a 33 4338 4462 4511 N
+ T R JH e n/a 33 4291 4433 4553 N
+ T R JH i n/a 33 4337 4433 4553 N
+ T R JH s n/a 33 4338 4433 4553 N
+ T R K e n/a 33 4291 4435 4553 N
+ T R K i n/a 33 4337 4435 4553 N
+ T R K s n/a 33 4338 4435 4553 N
+ T R L b n/a 33 4338 4425 4494 N
+ T R L e n/a 33 4291 4433 4561 N
+ T R L i n/a 33 4337 4433 4494 N
+ T R L s n/a 33 4338 4433 4494 N
+ T R M b n/a 33 4338 4417 4566 N
+ T R M e n/a 33 4291 4433 4566 N
+ T R M i n/a 33 4337 4433 4566 N
+ T R M s n/a 33 4338 4433 4566 N
+ T R N b n/a 33 4328 4417 4566 N
+ T R N e n/a 33 4291 4433 4566 N
+ T R N i n/a 33 4328 4433 4566 N
+ T R N s n/a 33 4328 4433 4566 N
+ T R NG b n/a 33 4338 4417 4566 N
+ T R NG e n/a 33 4291 4433 4566 N
+ T R NG s n/a 33 4338 4433 4566 N
+ T R OW b n/a 33 4338 4417 4491 N
+ T R OW e n/a 33 4291 4431 4493 N
+ T R OW i n/a 33 4337 4431 4491 N
+ T R OW s n/a 33 4338 4431 4493 N
+ T R OY b n/a 33 4338 4420 4501 N
+ T R OY e n/a 33 4291 4431 4496 N
+ T R OY s n/a 33 4338 4431 4501 N
+ T R P e n/a 33 4291 4435 4553 N
+ T R P s n/a 33 4338 4435 4553 N
+ T R R b n/a 33 4338 4424 4481 N
+ T R R e n/a 33 4291 4431 4562 N
+ T R R i n/a 33 4337 4430 4481 N
+ T R R s n/a 33 4338 4431 4481 N
+ T R S b n/a 33 4332 4417 4538 N
+ T R S e n/a 33 4291 4435 4538 N
+ T R S i n/a 33 4332 4435 4538 N
+ T R S s n/a 33 4332 4435 4538 N
+ T R SH b n/a 33 4338 4417 4540 N
+ T R SH e n/a 33 4291 4435 4540 N
+ T R SH i n/a 33 4337 4435 4540 N
+ T R SH s n/a 33 4338 4435 4540 N
+ T R SIL e n/a 33 4292 4429 4556 N
+ T R SIL s n/a 33 4338 4429 4556 N
+ T R T b n/a 33 4328 4417 4553 N
+ T R T e n/a 33 4292 4435 4553 N
+ T R T i n/a 33 4328 4435 4553 N
+ T R T s n/a 33 4328 4435 4553 N
+ T R TH e n/a 33 4291 4435 4553 N
+ T R TH i n/a 33 4337 4435 4553 N
+ T R TH s n/a 33 4338 4435 4553 N
+ T R UH b n/a 33 4338 4417 4475 N
+ T R UH e n/a 33 4291 4461 4475 N
+ T R UH i n/a 33 4337 4461 4475 N
+ T R UH s n/a 33 4338 4461 4475 N
+ T R UW b n/a 33 4338 4417 4479 N
+ T R UW e n/a 33 4291 4461 4479 N
+ T R UW i n/a 33 4337 4461 4479 N
+ T R UW s n/a 33 4338 4461 4479 N
+ T R V b n/a 33 4338 4417 4553 N
+ T R V e n/a 33 4291 4433 4553 N
+ T R V i n/a 33 4337 4433 4553 N
+ T R V s n/a 33 4338 4433 4553 N
+ T R W b n/a 33 4338 4425 4483 N
+ T R W e n/a 33 4291 4433 4563 N
+ T R W i n/a 33 4337 4433 4482 N
+ T R W s n/a 33 4338 4433 4483 N
+ T R Y b n/a 33 4338 4425 4511 N
+ T R Y e n/a 33 4291 4455 4509 N
+ T R Y i n/a 33 4337 4455 4510 N
+ T R Y s n/a 33 4338 4455 4511 N
+ T R Z b n/a 33 4332 4417 4553 N
+ T R Z e n/a 33 4292 4433 4553 N
+ T R Z i n/a 33 4332 4433 4553 N
+ T R Z s n/a 33 4332 4433 4553 N
+ T R ZH e n/a 33 4291 4433 4553 N
+ T R ZH s n/a 33 4338 4433 4553 N
+ T S AA b n/a 33 4359 4420 4500 N
+ T S AA e n/a 33 4352 4464 4498 N
+ T S AA i n/a 33 4360 4464 4499 N
+ T S AA s n/a 33 4359 4464 4500 N
+ T S AE b n/a 33 4359 4420 4529 N
+ T S AE e n/a 33 4352 4465 4527 N
+ T S AE i n/a 33 4361 4463 4526 N
+ T S AE s n/a 33 4359 4465 4529 N
+ T S AH b n/a 33 4359 4419 4476 N
+ T S AH e n/a 33 4352 4465 4528 N
+ T S AH i n/a 33 4361 4465 4531 N
+ T S AH s n/a 33 4359 4465 4529 N
+ T S AO b n/a 33 4359 4420 4501 N
+ T S AO e n/a 33 4352 4464 4498 N
+ T S AO i n/a 33 4360 4464 4497 N
+ T S AO s n/a 33 4359 4464 4501 N
+ T S AW b n/a 33 4359 4420 4529 N
+ T S AW e n/a 33 4352 4465 4527 N
+ T S AW i n/a 33 4361 4463 4526 N
+ T S AW s n/a 33 4359 4465 4529 N
+ T S AY b n/a 33 4359 4420 4500 N
+ T S AY e n/a 33 4352 4464 4496 N
+ T S AY i n/a 33 4360 4464 4499 N
+ T S AY s n/a 33 4359 4464 4500 N
+ T S B b n/a 33 4359 4418 4551 N
+ T S B e n/a 33 4355 4441 4551 N
+ T S B i n/a 33 4360 4441 4551 N
+ T S B s n/a 33 4359 4441 4551 N
+ T S CH e n/a 33 4355 4441 4550 N
+ T S CH i n/a 33 4360 4441 4550 N
+ T S CH s n/a 33 4359 4441 4550 N
+ T S D e n/a 33 4354 4439 4551 N
+ T S D i n/a 33 4360 4439 4551 N
+ T S D s n/a 33 4359 4439 4551 N
+ T S DH e n/a 33 4354 4439 4551 N
+ T S DH i n/a 33 4360 4439 4551 N
+ T S DH s n/a 33 4359 4439 4551 N
+ T S EH b n/a 33 4359 4418 4529 N
+ T S EH e n/a 33 4352 4465 4527 N
+ T S EH i n/a 33 4361 4463 4526 N
+ T S EH s n/a 33 4359 4465 4529 N
+ T S ER b n/a 33 4364 4418 4490 N
+ T S ER e n/a 33 4364 4471 4488 N
+ T S ER i n/a 33 4363 4471 4486 N
+ T S ER s n/a 33 4364 4471 4488 N
+ T S EY b n/a 33 4359 4418 4529 N
+ T S EY e n/a 33 4352 4465 4527 N
+ T S EY i n/a 33 4361 4463 4526 N
+ T S EY s n/a 33 4359 4465 4529 N
+ T S F b n/a 33 4359 4418 4549 N
+ T S F e n/a 33 4352 4442 4549 N
+ T S F i n/a 33 4360 4442 4549 N
+ T S F s n/a 33 4359 4442 4549 N
+ T S G b n/a 33 4359 4418 4549 N
+ T S G e n/a 33 4355 4441 4549 N
+ T S G i n/a 33 4360 4441 4549 N
+ T S G s n/a 33 4359 4441 4549 N
+ T S HH e n/a 33 4352 4442 4555 N
+ T S HH i n/a 33 4360 4442 4555 N
+ T S HH s n/a 33 4359 4442 4555 N
+ T S IH b n/a 33 4359 4419 4472 N
+ T S IH e n/a 33 4352 4466 4506 N
+ T S IH i n/a 33 4361 4466 4507 N
+ T S IH s n/a 33 4359 4466 4506 N
+ T S IY b n/a 33 4359 4418 4511 N
+ T S IY e n/a 33 4352 4467 4511 N
+ T S IY i n/a 33 4361 4467 4511 N
+ T S IY s n/a 33 4359 4467 4511 N
+ T S JH e n/a 33 4355 4441 4550 N
+ T S JH s n/a 33 4359 4441 4550 N
+ T S K e n/a 33 4355 4441 4549 N
+ T S K i n/a 33 4360 4441 4549 N
+ T S K s n/a 33 4359 4441 4549 N
+ T S L b n/a 33 4359 4425 4494 N
+ T S L e n/a 33 4352 4443 4564 N
+ T S L i n/a 33 4360 4443 4494 N
+ T S L s n/a 33 4359 4443 4494 N
+ T S M b n/a 33 4359 4418 4567 N
+ T S M e n/a 33 4352 4443 4567 N
+ T S M i n/a 33 4360 4443 4567 N
+ T S M s n/a 33 4359 4443 4567 N
+ T S N b n/a 33 4359 4418 4567 N
+ T S N e n/a 33 4352 4443 4567 N
+ T S N i n/a 33 4360 4443 4567 N
+ T S N s n/a 33 4359 4443 4567 N
+ T S NG b n/a 33 4359 4418 4567 N
+ T S NG e n/a 33 4352 4443 4567 N
+ T S NG s n/a 33 4359 4443 4567 N
+ T S OW b n/a 33 4359 4418 4491 N
+ T S OW e n/a 33 4352 4464 4493 N
+ T S OW i n/a 33 4360 4464 4492 N
+ T S OW s n/a 33 4359 4464 4493 N
+ T S OY b n/a 33 4359 4420 4501 N
+ T S OY e n/a 33 4352 4464 4496 N
+ T S OY i n/a 33 4360 4464 4497 N
+ T S OY s n/a 33 4359 4464 4501 N
+ T S P e n/a 33 4355 4441 4551 N
+ T S P i n/a 33 4360 4441 4551 N
+ T S P s n/a 33 4359 4441 4551 N
+ T S R b n/a 33 4364 4424 4481 N
+ T S R e n/a 33 4362 4469 4564 N
+ T S R i n/a 33 4362 4469 4484 N
+ T S R s n/a 33 4364 4469 4481 N
+ T S S b n/a 33 4359 4418 4536 N
+ T S S e n/a 33 4354 4440 4536 N
+ T S S i n/a 33 4354 4440 4536 N
+ T S S s n/a 33 4359 4440 4536 N
+ T S SH b n/a 33 4359 4418 4540 N
+ T S SH e n/a 33 4352 4442 4540 N
+ T S SH s n/a 33 4359 4442 4540 N
+ T S SIL e n/a 33 4359 4428 4558 N
+ T S SIL s n/a 33 4359 4428 4558 N
+ T S T b n/a 33 4359 4418 4550 N
+ T S T e n/a 33 4355 4439 4550 N
+ T S T i n/a 33 4360 4439 4550 N
+ T S T s n/a 33 4359 4439 4550 N
+ T S TH e n/a 33 4354 4439 4551 N
+ T S TH i n/a 33 4360 4439 4551 N
+ T S TH s n/a 33 4359 4439 4551 N
+ T S UH b n/a 33 4359 4418 4476 N
+ T S UH e n/a 33 4352 4466 4476 N
+ T S UH i n/a 33 4360 4466 4477 N
+ T S UH s n/a 33 4359 4466 4476 N
+ T S UW b n/a 33 4359 4418 4479 N
+ T S UW e n/a 33 4352 4466 4479 N
+ T S UW i n/a 33 4360 4466 4478 N
+ T S UW s n/a 33 4359 4466 4479 N
+ T S V b n/a 33 4359 4418 4551 N
+ T S V e n/a 33 4352 4442 4551 N
+ T S V i n/a 33 4360 4442 4551 N
+ T S V s n/a 33 4359 4442 4551 N
+ T S W b n/a 33 4359 4425 4481 N
+ T S W e n/a 33 4352 4443 4564 N
+ T S W i n/a 33 4360 4443 4482 N
+ T S W s n/a 33 4359 4443 4481 N
+ T S Y b n/a 33 4359 4425 4511 N
+ T S Y e n/a 33 4352 4455 4508 N
+ T S Y i n/a 33 4361 4455 4511 N
+ T S Y s n/a 33 4359 4455 4511 N
+ T S Z b n/a 33 4359 4418 4551 N
+ T S Z e n/a 33 4354 4439 4551 N
+ T S Z s n/a 33 4359 4439 4551 N
+ T S ZH e n/a 33 4352 4442 4551 N
+ T S ZH s n/a 33 4359 4442 4551 N
+ T SH AA b n/a 33 4360 4420 4500 N
+ T SH AA e n/a 33 4353 4464 4498 N
+ T SH AA i n/a 33 4360 4464 4499 N
+ T SH AA s n/a 33 4360 4464 4500 N
+ T SH AE b n/a 33 4361 4420 4529 N
+ T SH AE e n/a 33 4353 4465 4527 N
+ T SH AE i n/a 33 4361 4463 4526 N
+ T SH AE s n/a 33 4361 4465 4529 N
+ T SH AH b n/a 33 4360 4419 4476 N
+ T SH AH e n/a 33 4353 4465 4528 N
+ T SH AH i n/a 33 4360 4465 4530 N
+ T SH AH s n/a 33 4360 4465 4529 N
+ T SH AO b n/a 33 4360 4420 4501 N
+ T SH AO e n/a 33 4353 4464 4498 N
+ T SH AO i n/a 33 4360 4464 4497 N
+ T SH AO s n/a 33 4360 4464 4501 N
+ T SH AW b n/a 33 4361 4420 4529 N
+ T SH AW e n/a 33 4353 4465 4527 N
+ T SH AW s n/a 33 4361 4465 4529 N
+ T SH AY b n/a 33 4360 4420 4500 N
+ T SH AY e n/a 33 4353 4464 4496 N
+ T SH AY s n/a 33 4360 4464 4500 N
+ T SH B b n/a 33 4360 4418 4551 N
+ T SH B e n/a 33 4353 4441 4551 N
+ T SH B s n/a 33 4360 4441 4551 N
+ T SH CH e n/a 33 4353 4441 4550 N
+ T SH CH s n/a 33 4360 4441 4550 N
+ T SH D e n/a 33 4355 4439 4551 N
+ T SH D s n/a 33 4360 4439 4551 N
+ T SH DH e n/a 33 4355 4439 4551 N
+ T SH DH s n/a 33 4360 4439 4551 N
+ T SH EH b n/a 33 4361 4418 4529 N
+ T SH EH e n/a 33 4353 4465 4527 N
+ T SH EH i n/a 33 4361 4463 4526 N
+ T SH EH s n/a 33 4361 4465 4529 N
+ T SH ER b n/a 33 4364 4418 4490 N
+ T SH ER e n/a 33 4364 4471 4488 N
+ T SH ER s n/a 33 4364 4471 4488 N
+ T SH EY b n/a 33 4361 4418 4529 N
+ T SH EY e n/a 33 4353 4465 4527 N
+ T SH EY i n/a 33 4361 4463 4526 N
+ T SH EY s n/a 33 4361 4465 4529 N
+ T SH F b n/a 33 4360 4418 4549 N
+ T SH F e n/a 33 4353 4442 4549 N
+ T SH F s n/a 33 4360 4442 4549 N
+ T SH G b n/a 33 4360 4418 4549 N
+ T SH G e n/a 33 4353 4441 4549 N
+ T SH G s n/a 33 4360 4441 4549 N
+ T SH HH e n/a 33 4353 4442 4555 N
+ T SH HH s n/a 33 4360 4442 4555 N
+ T SH IH b n/a 33 4360 4419 4472 N
+ T SH IH e n/a 33 4353 4466 4506 N
+ T SH IH i n/a 33 4360 4466 4507 N
+ T SH IH s n/a 33 4360 4466 4506 N
+ T SH IY b n/a 33 4361 4418 4511 N
+ T SH IY e n/a 33 4353 4467 4511 N
+ T SH IY i n/a 33 4361 4467 4511 N
+ T SH IY s n/a 33 4361 4467 4511 N
+ T SH JH e n/a 33 4353 4441 4550 N
+ T SH JH s n/a 33 4360 4441 4550 N
+ T SH K e n/a 33 4353 4441 4549 N
+ T SH K s n/a 33 4360 4441 4549 N
+ T SH L b n/a 33 4360 4425 4494 N
+ T SH L e n/a 33 4353 4443 4564 N
+ T SH L s n/a 33 4360 4443 4494 N
+ T SH M b n/a 33 4360 4418 4567 N
+ T SH M e n/a 33 4353 4443 4567 N
+ T SH M s n/a 33 4360 4443 4567 N
+ T SH N b n/a 33 4360 4418 4567 N
+ T SH N e n/a 33 4355 4443 4567 N
+ T SH N s n/a 33 4360 4443 4567 N
+ T SH NG b n/a 33 4360 4418 4567 N
+ T SH NG e n/a 33 4353 4443 4567 N
+ T SH NG s n/a 33 4360 4443 4567 N
+ T SH OW b n/a 33 4360 4418 4491 N
+ T SH OW e n/a 33 4353 4464 4493 N
+ T SH OW i n/a 33 4360 4464 4491 N
+ T SH OW s n/a 33 4360 4464 4493 N
+ T SH OY b n/a 33 4360 4420 4501 N
+ T SH OY e n/a 33 4353 4464 4496 N
+ T SH OY s n/a 33 4360 4464 4501 N
+ T SH P e n/a 33 4353 4441 4551 N
+ T SH P s n/a 33 4360 4441 4551 N
+ T SH R b n/a 33 4364 4424 4481 N
+ T SH R e n/a 33 4362 4469 4564 N
+ T SH R i n/a 33 4363 4469 4484 N
+ T SH R s n/a 33 4364 4469 4481 N
+ T SH S b n/a 33 4360 4418 4536 N
+ T SH S e n/a 33 4354 4440 4536 N
+ T SH S i n/a 33 4354 4440 4536 N
+ T SH S s n/a 33 4360 4440 4536 N
+ T SH SH b n/a 33 4360 4418 4540 N
+ T SH SH e n/a 33 4353 4442 4540 N
+ T SH SH s n/a 33 4360 4442 4540 N
+ T SH SIL e n/a 33 4360 4428 4558 N
+ T SH SIL s n/a 33 4360 4428 4558 N
+ T SH T b n/a 33 4360 4418 4550 N
+ T SH T e n/a 33 4355 4439 4550 N
+ T SH T s n/a 33 4360 4439 4550 N
+ T SH TH e n/a 33 4355 4439 4551 N
+ T SH TH s n/a 33 4360 4439 4551 N
+ T SH UH b n/a 33 4360 4418 4476 N
+ T SH UH e n/a 33 4353 4466 4476 N
+ T SH UH s n/a 33 4360 4466 4476 N
+ T SH UW b n/a 33 4360 4418 4479 N
+ T SH UW e n/a 33 4353 4466 4479 N
+ T SH UW i n/a 33 4360 4466 4478 N
+ T SH UW s n/a 33 4360 4466 4479 N
+ T SH V b n/a 33 4360 4418 4551 N
+ T SH V e n/a 33 4353 4442 4551 N
+ T SH V s n/a 33 4360 4442 4551 N
+ T SH W b n/a 33 4360 4425 4481 N
+ T SH W e n/a 33 4353 4443 4564 N
+ T SH W s n/a 33 4360 4443 4481 N
+ T SH Y b n/a 33 4361 4425 4511 N
+ T SH Y e n/a 33 4353 4455 4508 N
+ T SH Y s n/a 33 4361 4455 4511 N
+ T SH Z b n/a 33 4360 4418 4551 N
+ T SH Z e n/a 33 4354 4439 4551 N
+ T SH Z s n/a 33 4360 4439 4551 N
+ T SH ZH e n/a 33 4353 4442 4551 N
+ T SH ZH s n/a 33 4360 4442 4551 N
+ T SIL AA b n/a 33 4370 4408 4500 N
+ T SIL AA s n/a 33 4370 4466 4500 N
+ T SIL AE b n/a 33 4370 4409 4502 N
+ T SIL AE s n/a 33 4370 4466 4502 N
+ T SIL AH b n/a 33 4370 4406 4474 N
+ T SIL AH s n/a 33 4370 4466 4529 N
+ T SIL AO b n/a 33 4370 4408 4501 N
+ T SIL AO s n/a 33 4370 4466 4501 N
+ T SIL AW b n/a 33 4370 4409 4502 N
+ T SIL AW s n/a 33 4370 4466 4502 N
+ T SIL AY b n/a 33 4370 4408 4500 N
+ T SIL AY s n/a 33 4370 4467 4500 N
+ T SIL B b n/a 33 4370 4409 4551 N
+ T SIL B s n/a 33 4370 4441 4551 N
+ T SIL CH s n/a 33 4370 4441 4550 N
+ T SIL D s n/a 33 4370 4439 4551 N
+ T SIL DH s n/a 33 4370 4439 4551 N
+ T SIL EH b n/a 33 4370 4409 4502 N
+ T SIL EH s n/a 33 4370 4466 4502 N
+ T SIL ER b n/a 33 4370 4408 4490 N
+ T SIL ER s n/a 33 4370 4470 4488 N
+ T SIL EY b n/a 33 4370 4409 4503 N
+ T SIL EY s n/a 33 4370 4467 4503 N
+ T SIL F b n/a 33 4370 4409 4549 N
+ T SIL F s n/a 33 4370 4442 4549 N
+ T SIL G b n/a 33 4370 4409 4549 N
+ T SIL G s n/a 33 4370 4441 4549 N
+ T SIL HH s n/a 33 4370 4442 4555 N
+ T SIL IH b n/a 33 4370 4406 4472 N
+ T SIL IH s n/a 33 4370 4466 4506 N
+ T SIL IY b n/a 33 4370 4409 4508 N
+ T SIL IY s n/a 33 4370 4467 4508 N
+ T SIL JH s n/a 33 4370 4441 4550 N
+ T SIL K s n/a 33 4370 4441 4549 N
+ T SIL L b n/a 33 4370 4425 4494 N
+ T SIL L s n/a 33 4370 4443 4494 N
+ T SIL M b n/a 33 4370 4409 4567 N
+ T SIL M s n/a 33 4370 4443 4567 N
+ T SIL N b n/a 33 4370 4409 4567 N
+ T SIL N s n/a 33 4370 4443 4567 N
+ T SIL NG b n/a 33 4370 4409 4567 N
+ T SIL NG s n/a 33 4370 4443 4567 N
+ T SIL OW b n/a 33 4370 4408 4491 N
+ T SIL OW s n/a 33 4370 4466 4493 N
+ T SIL OY b n/a 33 4370 4408 4501 N
+ T SIL OY s n/a 33 4370 4467 4501 N
+ T SIL P s n/a 33 4370 4441 4551 N
+ T SIL R b n/a 33 4370 4424 4481 N
+ T SIL R s n/a 33 4370 4470 4481 N
+ T SIL S b n/a 33 4370 4409 4535 N
+ T SIL S s n/a 33 4370 4440 4535 N
+ T SIL SH b n/a 33 4370 4409 4540 N
+ T SIL SH s n/a 33 4370 4442 4540 N
+ T SIL SIL s n/a 33 4370 4428 4558 N
+ T SIL T b n/a 33 4370 4409 4550 N
+ T SIL T s n/a 33 4370 4439 4550 N
+ T SIL TH s n/a 33 4370 4439 4551 N
+ T SIL UH b n/a 33 4370 4408 4475 N
+ T SIL UH s n/a 33 4370 4466 4475 N
+ T SIL UW b n/a 33 4370 4407 4479 N
+ T SIL UW s n/a 33 4370 4466 4479 N
+ T SIL V b n/a 33 4370 4409 4551 N
+ T SIL V s n/a 33 4370 4442 4551 N
+ T SIL W b n/a 33 4370 4425 4483 N
+ T SIL W s n/a 33 4370 4443 4483 N
+ T SIL Y b n/a 33 4370 4425 4508 N
+ T SIL Y s n/a 33 4370 4455 4508 N
+ T SIL Z b n/a 33 4370 4409 4551 N
+ T SIL Z s n/a 33 4370 4439 4551 N
+ T SIL ZH s n/a 33 4370 4442 4551 N
+ T T AA b n/a 33 4368 4408 4500 N
+ T T AA e n/a 33 4368 4468 4498 N
+ T T AA s n/a 33 4368 4468 4500 N
+ T T AE b n/a 33 4368 4409 4502 N
+ T T AE e n/a 33 4368 4468 4527 N
+ T T AE s n/a 33 4368 4468 4502 N
+ T T AH b n/a 33 4368 4406 4474 N
+ T T AH e n/a 33 4368 4468 4528 N
+ T T AH i n/a 33 4368 4468 4531 N
+ T T AH s n/a 33 4368 4468 4529 N
+ T T AO b n/a 33 4368 4408 4501 N
+ T T AO e n/a 33 4368 4468 4498 N
+ T T AO s n/a 33 4368 4468 4501 N
+ T T AW b n/a 33 4368 4409 4502 N
+ T T AW e n/a 33 4368 4468 4527 N
+ T T AW i n/a 33 4368 4468 4502 N
+ T T AW s n/a 33 4368 4468 4502 N
+ T T AY b n/a 33 4368 4408 4500 N
+ T T AY e n/a 33 4368 4468 4496 N
+ T T AY i n/a 33 4368 4468 4500 N
+ T T AY s n/a 33 4368 4468 4500 N
+ T T B b n/a 33 4368 4409 4551 N
+ T T B e n/a 33 4368 4441 4551 N
+ T T B s n/a 33 4368 4441 4551 N
+ T T CH e n/a 33 4368 4441 4550 N
+ T T CH s n/a 33 4368 4441 4550 N
+ T T D e n/a 33 4368 4441 4551 N
+ T T D s n/a 33 4368 4441 4551 N
+ T T DH e n/a 33 4368 4441 4551 N
+ T T DH s n/a 33 4368 4441 4551 N
+ T T EH b n/a 33 4368 4409 4502 N
+ T T EH e n/a 33 4368 4468 4527 N
+ T T EH s n/a 33 4368 4468 4502 N
+ T T ER b n/a 33 4369 4408 4490 N
+ T T ER e n/a 33 4369 4470 4488 N
+ T T ER i n/a 33 4369 4470 4486 N
+ T T ER s n/a 33 4369 4470 4488 N
+ T T EY b n/a 33 4368 4409 4503 N
+ T T EY e n/a 33 4368 4468 4527 N
+ T T EY i n/a 33 4368 4468 4503 N
+ T T EY s n/a 33 4368 4468 4503 N
+ T T F b n/a 33 4368 4409 4549 N
+ T T F e n/a 33 4368 4442 4549 N
+ T T F i n/a 33 4368 4442 4549 N
+ T T F s n/a 33 4368 4442 4549 N
+ T T G b n/a 33 4368 4409 4549 N
+ T T G e n/a 33 4368 4441 4549 N
+ T T G s n/a 33 4368 4441 4549 N
+ T T HH e n/a 33 4368 4442 4555 N
+ T T HH s n/a 33 4368 4442 4555 N
+ T T IH b n/a 33 4368 4406 4472 N
+ T T IH e n/a 33 4368 4468 4506 N
+ T T IH i n/a 33 4368 4468 4507 N
+ T T IH s n/a 33 4368 4468 4506 N
+ T T IY b n/a 33 4368 4409 4508 N
+ T T IY e n/a 33 4368 4468 4510 N
+ T T IY i n/a 33 4368 4468 4508 N
+ T T IY s n/a 33 4368 4468 4508 N
+ T T JH e n/a 33 4368 4441 4550 N
+ T T JH s n/a 33 4368 4441 4550 N
+ T T K e n/a 33 4368 4441 4549 N
+ T T K s n/a 33 4368 4441 4549 N
+ T T L b n/a 33 4368 4426 4494 N
+ T T L e n/a 33 4368 4443 4564 N
+ T T L s n/a 33 4368 4443 4494 N
+ T T M b n/a 33 4368 4409 4567 N
+ T T M e n/a 33 4368 4443 4567 N
+ T T M s n/a 33 4368 4443 4567 N
+ T T N b n/a 33 4368 4409 4567 N
+ T T N e n/a 33 4368 4443 4567 N
+ T T N s n/a 33 4368 4443 4567 N
+ T T NG b n/a 33 4368 4409 4567 N
+ T T NG e n/a 33 4368 4443 4567 N
+ T T NG s n/a 33 4368 4443 4567 N
+ T T OW b n/a 33 4368 4408 4491 N
+ T T OW e n/a 33 4368 4468 4493 N
+ T T OW s n/a 33 4368 4468 4493 N
+ T T OY b n/a 33 4368 4408 4501 N
+ T T OY e n/a 33 4368 4468 4496 N
+ T T OY s n/a 33 4368 4468 4501 N
+ T T P e n/a 33 4368 4441 4551 N
+ T T P s n/a 33 4368 4441 4551 N
+ T T R b n/a 33 4369 4426 4481 N
+ T T R e n/a 33 4369 4470 4564 N
+ T T R i n/a 33 4369 4470 4481 N
+ T T R s n/a 33 4369 4470 4481 N
+ T T S b n/a 33 4368 4409 4536 N
+ T T S e n/a 33 4368 4442 4536 N
+ T T S s n/a 33 4368 4442 4536 N
+ T T SH b n/a 33 4368 4409 4540 N
+ T T SH e n/a 33 4368 4442 4540 N
+ T T SH s n/a 33 4368 4442 4540 N
+ T T SIL e n/a 33 4368 4429 4558 N
+ T T SIL s n/a 33 4368 4429 4558 N
+ T T T b n/a 33 4368 4409 4550 N
+ T T T e n/a 33 4368 4441 4550 N
+ T T T s n/a 33 4368 4441 4550 N
+ T T TH e n/a 33 4368 4441 4551 N
+ T T TH s n/a 33 4368 4441 4551 N
+ T T UH b n/a 33 4368 4408 4475 N
+ T T UH e n/a 33 4368 4468 4475 N
+ T T UH s n/a 33 4368 4468 4475 N
+ T T UW b n/a 33 4368 4407 4479 N
+ T T UW e n/a 33 4368 4468 4479 N
+ T T UW i n/a 33 4368 4468 4479 N
+ T T UW s n/a 33 4368 4468 4479 N
+ T T V b n/a 33 4368 4409 4551 N
+ T T V e n/a 33 4368 4442 4551 N
+ T T V s n/a 33 4368 4442 4551 N
+ T T W b n/a 33 4368 4426 4483 N
+ T T W e n/a 33 4368 4443 4564 N
+ T T W s n/a 33 4368 4443 4483 N
+ T T Y b n/a 33 4368 4426 4508 N
+ T T Y e n/a 33 4368 4455 4508 N
+ T T Y s n/a 33 4368 4455 4508 N
+ T T Z b n/a 33 4368 4409 4551 N
+ T T Z e n/a 33 4368 4442 4551 N
+ T T Z s n/a 33 4368 4442 4551 N
+ T T ZH e n/a 33 4368 4442 4551 N
+ T T ZH s n/a 33 4368 4442 4551 N
+ T TH AA b n/a 33 4359 4420 4500 N
+ T TH AA e n/a 33 4352 4466 4498 N
+ T TH AA s n/a 33 4359 4466 4500 N
+ T TH AE b n/a 33 4359 4420 4502 N
+ T TH AE e n/a 33 4352 4466 4527 N
+ T TH AE s n/a 33 4359 4466 4502 N
+ T TH AH b n/a 33 4359 4419 4476 N
+ T TH AH e n/a 33 4352 4466 4528 N
+ T TH AH i n/a 33 4361 4466 4531 N
+ T TH AH s n/a 33 4359 4466 4529 N
+ T TH AO b n/a 33 4359 4420 4501 N
+ T TH AO e n/a 33 4352 4466 4498 N
+ T TH AO s n/a 33 4359 4466 4501 N
+ T TH AW b n/a 33 4359 4420 4502 N
+ T TH AW e n/a 33 4352 4466 4527 N
+ T TH AW i n/a 33 4361 4466 4502 N
+ T TH AW s n/a 33 4359 4466 4502 N
+ T TH AY b n/a 33 4359 4420 4500 N
+ T TH AY e n/a 33 4352 4467 4496 N
+ T TH AY s n/a 33 4359 4467 4500 N
+ T TH B b n/a 33 4359 4418 4551 N
+ T TH B e n/a 33 4355 4441 4551 N
+ T TH B s n/a 33 4359 4441 4551 N
+ T TH CH e n/a 33 4355 4441 4550 N
+ T TH CH s n/a 33 4359 4441 4550 N
+ T TH D e n/a 33 4354 4439 4551 N
+ T TH D s n/a 33 4359 4439 4551 N
+ T TH DH e n/a 33 4354 4439 4551 N
+ T TH DH s n/a 33 4359 4439 4551 N
+ T TH EH b n/a 33 4359 4418 4502 N
+ T TH EH e n/a 33 4352 4466 4527 N
+ T TH EH s n/a 33 4359 4466 4502 N
+ T TH ER b n/a 33 4364 4418 4490 N
+ T TH ER e n/a 33 4364 4470 4488 N
+ T TH ER s n/a 33 4364 4470 4488 N
+ T TH EY b n/a 33 4359 4418 4503 N
+ T TH EY e n/a 33 4352 4467 4527 N
+ T TH EY i n/a 33 4361 4467 4503 N
+ T TH EY s n/a 33 4359 4467 4503 N
+ T TH F b n/a 33 4359 4418 4549 N
+ T TH F e n/a 33 4352 4442 4549 N
+ T TH F s n/a 33 4359 4442 4549 N
+ T TH G b n/a 33 4359 4418 4549 N
+ T TH G e n/a 33 4355 4441 4549 N
+ T TH G s n/a 33 4359 4441 4549 N
+ T TH HH e n/a 33 4352 4442 4555 N
+ T TH HH s n/a 33 4359 4442 4555 N
+ T TH IH b n/a 33 4359 4419 4472 N
+ T TH IH e n/a 33 4352 4466 4506 N
+ T TH IH s n/a 33 4359 4466 4506 N
+ T TH IY b n/a 33 4359 4418 4511 N
+ T TH IY e n/a 33 4352 4467 4511 N
+ T TH IY s n/a 33 4359 4467 4511 N
+ T TH JH e n/a 33 4355 4441 4550 N
+ T TH JH s n/a 33 4359 4441 4550 N
+ T TH K e n/a 33 4355 4441 4549 N
+ T TH K s n/a 33 4359 4441 4549 N
+ T TH L b n/a 33 4359 4425 4494 N
+ T TH L e n/a 33 4352 4443 4564 N
+ T TH L s n/a 33 4359 4443 4494 N
+ T TH M b n/a 33 4359 4418 4567 N
+ T TH M e n/a 33 4352 4443 4567 N
+ T TH M s n/a 33 4359 4443 4567 N
+ T TH N b n/a 33 4359 4418 4567 N
+ T TH N e n/a 33 4352 4443 4567 N
+ T TH N s n/a 33 4359 4443 4567 N
+ T TH NG b n/a 33 4359 4418 4567 N
+ T TH NG e n/a 33 4352 4443 4567 N
+ T TH NG s n/a 33 4359 4443 4567 N
+ T TH OW b n/a 33 4359 4418 4491 N
+ T TH OW e n/a 33 4352 4466 4493 N
+ T TH OW s n/a 33 4359 4466 4493 N
+ T TH OY b n/a 33 4359 4420 4501 N
+ T TH OY e n/a 33 4352 4467 4496 N
+ T TH OY s n/a 33 4359 4467 4501 N
+ T TH P e n/a 33 4355 4441 4551 N
+ T TH P s n/a 33 4359 4441 4551 N
+ T TH R b n/a 33 4364 4424 4481 N
+ T TH R e n/a 33 4362 4470 4564 N
+ T TH R i n/a 33 4362 4470 4481 N
+ T TH R s n/a 33 4364 4470 4481 N
+ T TH S b n/a 33 4359 4418 4536 N
+ T TH S e n/a 33 4354 4440 4536 N
+ T TH S s n/a 33 4359 4440 4536 N
+ T TH SH b n/a 33 4359 4418 4540 N
+ T TH SH e n/a 33 4352 4442 4540 N
+ T TH SH s n/a 33 4359 4442 4540 N
+ T TH SIL e n/a 33 4359 4428 4558 N
+ T TH SIL s n/a 33 4359 4428 4558 N
+ T TH T b n/a 33 4359 4418 4550 N
+ T TH T e n/a 33 4355 4439 4550 N
+ T TH T s n/a 33 4359 4439 4550 N
+ T TH TH e n/a 33 4354 4439 4551 N
+ T TH TH s n/a 33 4359 4439 4551 N
+ T TH UH b n/a 33 4359 4418 4476 N
+ T TH UH e n/a 33 4352 4466 4476 N
+ T TH UH s n/a 33 4359 4466 4476 N
+ T TH UW b n/a 33 4359 4418 4479 N
+ T TH UW e n/a 33 4352 4466 4479 N
+ T TH UW s n/a 33 4359 4466 4479 N
+ T TH V b n/a 33 4359 4418 4551 N
+ T TH V e n/a 33 4352 4442 4551 N
+ T TH V s n/a 33 4359 4442 4551 N
+ T TH W b n/a 33 4359 4425 4483 N
+ T TH W e n/a 33 4352 4443 4564 N
+ T TH W s n/a 33 4359 4443 4483 N
+ T TH Y b n/a 33 4359 4425 4511 N
+ T TH Y e n/a 33 4352 4455 4508 N
+ T TH Y s n/a 33 4359 4455 4511 N
+ T TH Z b n/a 33 4359 4418 4551 N
+ T TH Z e n/a 33 4354 4439 4551 N
+ T TH Z s n/a 33 4359 4439 4551 N
+ T TH ZH e n/a 33 4352 4442 4551 N
+ T TH ZH s n/a 33 4359 4442 4551 N
+ T UH AA b n/a 33 4338 4420 4500 N
+ T UH AA e n/a 33 4299 4386 4496 N
+ T UH AA i n/a 33 4331 4431 4500 N
+ T UH AA s n/a 33 4338 4431 4500 N
+ T UH AE b n/a 33 4338 4420 4502 N
+ T UH AE e n/a 33 4299 4387 4517 N
+ T UH AE s n/a 33 4338 4431 4502 N
+ T UH AH b n/a 33 4338 4415 4475 N
+ T UH AH e n/a 33 4299 4387 4519 N
+ T UH AH i n/a 33 4324 4450 4523 N
+ T UH AH s n/a 33 4338 4450 4519 N
+ T UH AO b n/a 33 4338 4420 4501 N
+ T UH AO e n/a 33 4299 4386 4496 N
+ T UH AO i n/a 33 4331 4431 4501 N
+ T UH AO s n/a 33 4338 4431 4501 N
+ T UH AW b n/a 33 4338 4420 4502 N
+ T UH AW e n/a 33 4299 4387 4519 N
+ T UH AW s n/a 33 4338 4431 4502 N
+ T UH AY b n/a 33 4338 4420 4500 N
+ T UH AY e n/a 33 4299 4386 4496 N
+ T UH AY s n/a 33 4338 4431 4500 N
+ T UH B b n/a 33 4338 4399 4553 N
+ T UH B e n/a 33 4299 4399 4553 N
+ T UH B i n/a 33 4331 4399 4553 N
+ T UH B s n/a 33 4338 4399 4553 N
+ T UH CH e n/a 33 4299 4399 4553 N
+ T UH CH s n/a 33 4338 4399 4553 N
+ T UH D e n/a 33 4296 4399 4553 N
+ T UH D i n/a 33 4331 4399 4553 N
+ T UH D s n/a 33 4331 4399 4553 N
+ T UH DH e n/a 33 4296 4399 4553 N
+ T UH DH s n/a 33 4338 4399 4553 N
+ T UH EH b n/a 33 4338 4415 4502 N
+ T UH EH e n/a 33 4299 4387 4517 N
+ T UH EH s n/a 33 4338 4431 4502 N
+ T UH ER b n/a 33 4338 4417 4490 N
+ T UH ER e n/a 33 4299 4387 4488 N
+ T UH ER i n/a 33 4324 4462 4488 N
+ T UH ER s n/a 33 4338 4462 4488 N
+ T UH EY b n/a 33 4338 4415 4503 N
+ T UH EY e n/a 33 4299 4387 4517 N
+ T UH EY s n/a 33 4338 4431 4503 N
+ T UH F b n/a 33 4338 4404 4553 N
+ T UH F e n/a 33 4299 4404 4553 N
+ T UH F i n/a 33 4331 4404 4553 N
+ T UH F s n/a 33 4338 4404 4553 N
+ T UH G b n/a 33 4338 4399 4553 N
+ T UH G e n/a 33 4299 4399 4553 N
+ T UH G i n/a 33 4331 4399 4553 N
+ T UH G s n/a 33 4338 4399 4553 N
+ T UH HH e n/a 33 4299 4399 4554 N
+ T UH HH i n/a 33 4331 4399 4554 N
+ T UH HH s n/a 33 4338 4399 4554 N
+ T UH IH b n/a 33 4338 4415 4472 N
+ T UH IH e n/a 33 4299 4387 4514 N
+ T UH IH i n/a 33 4324 4456 4512 N
+ T UH IH s n/a 33 4338 4456 4514 N
+ T UH IY b n/a 33 4338 4415 4508 N
+ T UH IY e n/a 33 4299 4387 4510 N
+ T UH IY s n/a 33 4338 4455 4508 N
+ T UH JH e n/a 33 4299 4399 4553 N
+ T UH JH s n/a 33 4338 4399 4553 N
+ T UH K e n/a 33 4299 4399 4553 N
+ T UH K i n/a 33 4331 4399 4553 N
+ T UH K s n/a 33 4338 4399 4553 N
+ T UH L b n/a 33 4338 4425 4494 N
+ T UH L e n/a 33 4300 4389 4561 N
+ T UH L i n/a 33 4331 4446 4494 N
+ T UH L s n/a 33 4338 4446 4494 N
+ T UH M b n/a 33 4338 4399 4566 N
+ T UH M e n/a 33 4299 4399 4566 N
+ T UH M i n/a 33 4331 4399 4566 N
+ T UH M s n/a 33 4338 4399 4566 N
+ T UH N b n/a 33 4331 4399 4566 N
+ T UH N e n/a 33 4296 4399 4566 N
+ T UH N i n/a 33 4331 4399 4566 N
+ T UH N s n/a 33 4331 4399 4566 N
+ T UH NG b n/a 33 4338 4399 4566 N
+ T UH NG e n/a 33 4299 4399 4566 N
+ T UH NG s n/a 33 4338 4399 4566 N
+ T UH OW b n/a 33 4338 4417 4491 N
+ T UH OW e n/a 33 4299 4386 4493 N
+ T UH OW s n/a 33 4338 4431 4493 N
+ T UH OY b n/a 33 4338 4420 4501 N
+ T UH OY e n/a 33 4299 4386 4496 N
+ T UH OY s n/a 33 4338 4431 4501 N
+ T UH P e n/a 33 4299 4399 4553 N
+ T UH P i n/a 33 4331 4399 4553 N
+ T UH P s n/a 33 4338 4399 4553 N
+ T UH R b n/a 33 4338 4424 4481 N
+ T UH R e n/a 33 4299 4389 4562 N
+ T UH R i n/a 33 4331 4430 4481 N
+ T UH R s n/a 33 4338 4431 4481 N
+ T UH S b n/a 33 4333 4404 4538 N
+ T UH S e n/a 33 4296 4404 4538 N
+ T UH S i n/a 33 4333 4404 4538 N
+ T UH S s n/a 33 4333 4404 4538 N
+ T UH SH b n/a 33 4338 4405 4540 N
+ T UH SH e n/a 33 4299 4405 4540 N
+ T UH SH s n/a 33 4338 4405 4540 N
+ T UH SIL e n/a 33 4299 4446 4558 N
+ T UH SIL s n/a 33 4338 4446 4558 N
+ T UH T b n/a 33 4331 4399 4553 N
+ T UH T e n/a 33 4296 4399 4553 N
+ T UH T s n/a 33 4331 4399 4553 N
+ T UH TH e n/a 33 4296 4404 4553 N
+ T UH TH s n/a 33 4338 4404 4553 N
+ T UH UH b n/a 33 4338 4417 4475 N
+ T UH UH e n/a 33 4299 4387 4475 N
+ T UH UH s n/a 33 4338 4461 4475 N
+ T UH UW b n/a 33 4338 4417 4480 N
+ T UH UW e n/a 33 4299 4386 4480 N
+ T UH UW s n/a 33 4338 4461 4480 N
+ T UH V b n/a 33 4338 4399 4553 N
+ T UH V e n/a 33 4299 4399 4553 N
+ T UH V s n/a 33 4338 4399 4553 N
+ T UH W b n/a 33 4338 4425 4483 N
+ T UH W e n/a 33 4299 4389 4560 N
+ T UH W i n/a 33 4331 4447 4483 N
+ T UH W s n/a 33 4338 4447 4483 N
+ T UH Y b n/a 33 4338 4425 4508 N
+ T UH Y e n/a 33 4299 4383 4509 N
+ T UH Y s n/a 33 4338 4455 4508 N
+ T UH Z b n/a 33 4333 4399 4553 N
+ T UH Z e n/a 33 4296 4399 4553 N
+ T UH Z s n/a 33 4333 4399 4553 N
+ T UH ZH e n/a 33 4299 4399 4553 N
+ T UH ZH s n/a 33 4338 4399 4553 N
+ T UW AA b n/a 33 4341 4420 4500 N
+ T UW AA e n/a 33 4293 4387 4496 N
+ T UW AA i n/a 33 4330 4431 4500 N
+ T UW AA s n/a 33 4341 4431 4500 N
+ T UW AE b n/a 33 4341 4420 4502 N
+ T UW AE e n/a 33 4293 4387 4517 N
+ T UW AE i n/a 33 4330 4432 4502 N
+ T UW AE s n/a 33 4341 4431 4502 N
+ T UW AH b n/a 33 4341 4416 4473 N
+ T UW AH e n/a 33 4293 4387 4519 N
+ T UW AH i n/a 33 4330 4448 4523 N
+ T UW AH s n/a 33 4341 4448 4519 N
+ T UW AO b n/a 33 4341 4420 4501 N
+ T UW AO e n/a 33 4293 4387 4496 N
+ T UW AO i n/a 33 4330 4431 4501 N
+ T UW AO s n/a 33 4341 4431 4501 N
+ T UW AW b n/a 33 4341 4420 4502 N
+ T UW AW e n/a 33 4293 4387 4519 N
+ T UW AW i n/a 33 4330 4432 4502 N
+ T UW AW s n/a 33 4341 4431 4502 N
+ T UW AY b n/a 33 4341 4420 4500 N
+ T UW AY e n/a 33 4293 4386 4496 N
+ T UW AY s n/a 33 4341 4431 4500 N
+ T UW B b n/a 33 4341 4402 4553 N
+ T UW B e n/a 33 4293 4402 4553 N
+ T UW B i n/a 33 4330 4402 4553 N
+ T UW B s n/a 33 4341 4402 4553 N
+ T UW CH e n/a 33 4293 4402 4553 N
+ T UW CH s n/a 33 4341 4402 4553 N
+ T UW D e n/a 33 4293 4402 4553 N
+ T UW D i n/a 33 4330 4402 4553 N
+ T UW D s n/a 33 4330 4402 4553 N
+ T UW DH e n/a 33 4293 4402 4553 N
+ T UW DH s n/a 33 4341 4402 4553 N
+ T UW EH b n/a 33 4341 4415 4502 N
+ T UW EH e n/a 33 4293 4387 4517 N
+ T UW EH i n/a 33 4330 4432 4502 N
+ T UW EH s n/a 33 4341 4431 4502 N
+ T UW ER b n/a 33 4341 4417 4490 N
+ T UW ER e n/a 33 4293 4387 4487 N
+ T UW ER i n/a 33 4330 4462 4487 N
+ T UW ER s n/a 33 4341 4462 4487 N
+ T UW EY b n/a 33 4341 4415 4503 N
+ T UW EY e n/a 33 4293 4387 4517 N
+ T UW EY i n/a 33 4330 4432 4503 N
+ T UW EY s n/a 33 4341 4431 4503 N
+ T UW F b n/a 33 4341 4402 4553 N
+ T UW F e n/a 33 4293 4402 4553 N
+ T UW F i n/a 33 4330 4402 4553 N
+ T UW F s n/a 33 4341 4402 4553 N
+ T UW G b n/a 33 4341 4402 4553 N
+ T UW G e n/a 33 4293 4402 4553 N
+ T UW G i n/a 33 4330 4402 4553 N
+ T UW G s n/a 33 4341 4402 4553 N
+ T UW HH e n/a 33 4293 4402 4554 N
+ T UW HH s n/a 33 4341 4402 4554 N
+ T UW IH b n/a 33 4341 4416 4472 N
+ T UW IH e n/a 33 4293 4387 4515 N
+ T UW IH i n/a 33 4330 4455 4513 N
+ T UW IH s n/a 33 4341 4455 4515 N
+ T UW IY b n/a 33 4341 4415 4511 N
+ T UW IY e n/a 33 4293 4387 4510 N
+ T UW IY i n/a 33 4330 4455 4510 N
+ T UW IY s n/a 33 4341 4455 4511 N
+ T UW JH e n/a 33 4293 4402 4553 N
+ T UW JH s n/a 33 4341 4402 4553 N
+ T UW K e n/a 33 4293 4402 4553 N
+ T UW K i n/a 33 4330 4402 4553 N
+ T UW K s n/a 33 4341 4402 4553 N
+ T UW L b n/a 33 4341 4425 4494 N
+ T UW L e n/a 33 4293 4389 4561 N
+ T UW L i n/a 33 4331 4446 4494 N
+ T UW L s n/a 33 4341 4446 4494 N
+ T UW M b n/a 33 4341 4402 4566 N
+ T UW M e n/a 33 4293 4402 4566 N
+ T UW M i n/a 33 4330 4402 4566 N
+ T UW M s n/a 33 4341 4402 4566 N
+ T UW N b n/a 33 4330 4402 4566 N
+ T UW N e n/a 33 4293 4402 4566 N
+ T UW N i n/a 33 4330 4402 4566 N
+ T UW N s n/a 33 4330 4402 4566 N
+ T UW NG b n/a 33 4341 4402 4566 N
+ T UW NG e n/a 33 4293 4402 4566 N
+ T UW NG s n/a 33 4341 4402 4566 N
+ T UW OW b n/a 33 4341 4417 4491 N
+ T UW OW e n/a 33 4293 4387 4493 N
+ T UW OW i n/a 33 4330 4431 4493 N
+ T UW OW s n/a 33 4341 4431 4493 N
+ T UW OY b n/a 33 4341 4420 4501 N
+ T UW OY e n/a 33 4293 4386 4496 N
+ T UW OY i n/a 33 4330 4431 4501 N
+ T UW OY s n/a 33 4341 4431 4501 N
+ T UW P e n/a 33 4293 4402 4553 N
+ T UW P s n/a 33 4341 4402 4553 N
+ T UW R b n/a 33 4341 4424 4481 N
+ T UW R e n/a 33 4293 4389 4562 N
+ T UW R i n/a 33 4330 4430 4481 N
+ T UW R s n/a 33 4341 4431 4481 N
+ T UW S b n/a 33 4334 4402 4538 N
+ T UW S e n/a 33 4293 4402 4538 N
+ T UW S i n/a 33 4334 4402 4538 N
+ T UW S s n/a 33 4334 4402 4538 N
+ T UW SH b n/a 33 4341 4402 4540 N
+ T UW SH e n/a 33 4293 4402 4540 N
+ T UW SH s n/a 33 4341 4402 4540 N
+ T UW SIL e n/a 33 4293 4446 4558 N
+ T UW SIL s n/a 33 4341 4446 4558 N
+ T UW T b n/a 33 4330 4402 4553 N
+ T UW T e n/a 33 4293 4402 4553 N
+ T UW T s n/a 33 4330 4402 4553 N
+ T UW TH e n/a 33 4293 4402 4553 N
+ T UW TH s n/a 33 4341 4402 4553 N
+ T UW UH b n/a 33 4341 4417 4475 N
+ T UW UH e n/a 33 4293 4387 4475 N
+ T UW UH i n/a 33 4330 4461 4475 N
+ T UW UH s n/a 33 4341 4461 4475 N
+ T UW UW b n/a 33 4341 4417 4479 N
+ T UW UW e n/a 33 4293 4387 4479 N
+ T UW UW i n/a 33 4330 4461 4480 N
+ T UW UW s n/a 33 4341 4461 4479 N
+ T UW V b n/a 33 4341 4402 4553 N
+ T UW V e n/a 33 4293 4402 4553 N
+ T UW V i n/a 33 4330 4402 4553 N
+ T UW V s n/a 33 4341 4402 4553 N
+ T UW W b n/a 33 4341 4425 4483 N
+ T UW W e n/a 33 4293 4389 4560 N
+ T UW W i n/a 33 4331 4447 4483 N
+ T UW W s n/a 33 4341 4447 4483 N
+ T UW Y b n/a 33 4341 4425 4511 N
+ T UW Y e n/a 33 4293 4383 4509 N
+ T UW Y i n/a 33 4330 4455 4510 N
+ T UW Y s n/a 33 4341 4455 4511 N
+ T UW Z b n/a 33 4334 4402 4553 N
+ T UW Z e n/a 33 4293 4402 4553 N
+ T UW Z i n/a 33 4334 4402 4553 N
+ T UW Z s n/a 33 4334 4402 4553 N
+ T UW ZH e n/a 33 4293 4402 4553 N
+ T UW ZH s n/a 33 4341 4402 4553 N
+ T V AA b n/a 33 4357 4420 4500 N
+ T V AA e n/a 33 4357 4422 4496 N
+ T V AA s n/a 33 4357 4420 4500 N
+ T V AE b n/a 33 4357 4420 4502 N
+ T V AE e n/a 33 4357 4422 4517 N
+ T V AE s n/a 33 4357 4420 4502 N
+ T V AH b n/a 33 4357 4419 4476 N
+ T V AH e n/a 33 4357 4422 4518 N
+ T V AH i n/a 33 4357 4419 4505 N
+ T V AH s n/a 33 4357 4419 4506 N
+ T V AO b n/a 33 4357 4420 4501 N
+ T V AO e n/a 33 4357 4422 4496 N
+ T V AO s n/a 33 4357 4420 4501 N
+ T V AW b n/a 33 4357 4420 4502 N
+ T V AW e n/a 33 4357 4422 4518 N
+ T V AW s n/a 33 4357 4420 4502 N
+ T V AY b n/a 33 4357 4420 4500 N
+ T V AY e n/a 33 4357 4422 4496 N
+ T V AY i n/a 33 4357 4420 4500 N
+ T V AY s n/a 33 4357 4420 4500 N
+ T V B b n/a 33 4357 4418 4552 N
+ T V B e n/a 33 4357 4436 4552 N
+ T V B s n/a 33 4357 4436 4552 N
+ T V CH e n/a 33 4357 4436 4552 N
+ T V CH s n/a 33 4357 4436 4552 N
+ T V D e n/a 33 4357 4436 4552 N
+ T V D s n/a 33 4357 4436 4552 N
+ T V DH e n/a 33 4357 4436 4552 N
+ T V DH s n/a 33 4357 4436 4552 N
+ T V EH b n/a 33 4357 4418 4502 N
+ T V EH e n/a 33 4357 4422 4517 N
+ T V EH i n/a 33 4357 4418 4502 N
+ T V EH s n/a 33 4357 4418 4502 N
+ T V ER b n/a 33 4358 4419 4490 N
+ T V ER e n/a 33 4358 4422 4488 N
+ T V ER s n/a 33 4358 4419 4488 N
+ T V EY b n/a 33 4357 4418 4503 N
+ T V EY e n/a 33 4357 4422 4517 N
+ T V EY i n/a 33 4357 4418 4503 N
+ T V EY s n/a 33 4357 4418 4503 N
+ T V F b n/a 33 4357 4418 4552 N
+ T V F e n/a 33 4357 4438 4552 N
+ T V F s n/a 33 4357 4438 4552 N
+ T V G b n/a 33 4357 4418 4552 N
+ T V G e n/a 33 4357 4436 4552 N
+ T V G s n/a 33 4357 4436 4552 N
+ T V HH e n/a 33 4357 4437 4554 N
+ T V HH s n/a 33 4357 4437 4554 N
+ T V IH b n/a 33 4357 4419 4472 N
+ T V IH e n/a 33 4357 4422 4506 N
+ T V IH i n/a 33 4356 4419 4505 N
+ T V IH s n/a 33 4357 4419 4506 N
+ T V IY b n/a 33 4357 4418 4508 N
+ T V IY e n/a 33 4357 4422 4511 N
+ T V IY s n/a 33 4357 4418 4508 N
+ T V JH e n/a 33 4357 4436 4552 N
+ T V JH s n/a 33 4357 4436 4552 N
+ T V K e n/a 33 4357 4436 4552 N
+ T V K s n/a 33 4357 4436 4552 N
+ T V L b n/a 33 4357 4425 4494 N
+ T V L e n/a 33 4357 4423 4561 N
+ T V L s n/a 33 4357 4423 4494 N
+ T V M b n/a 33 4357 4418 4565 N
+ T V M e n/a 33 4357 4434 4565 N
+ T V M s n/a 33 4357 4434 4565 N
+ T V N b n/a 33 4357 4418 4565 N
+ T V N e n/a 33 4357 4434 4565 N
+ T V N s n/a 33 4357 4434 4565 N
+ T V NG b n/a 33 4357 4418 4565 N
+ T V NG e n/a 33 4357 4434 4565 N
+ T V NG s n/a 33 4357 4434 4565 N
+ T V OW b n/a 33 4357 4418 4491 N
+ T V OW e n/a 33 4357 4422 4493 N
+ T V OW i n/a 33 4357 4418 4491 N
+ T V OW s n/a 33 4357 4418 4493 N
+ T V OY b n/a 33 4357 4420 4501 N
+ T V OY e n/a 33 4357 4422 4496 N
+ T V OY s n/a 33 4357 4420 4501 N
+ T V P e n/a 33 4357 4436 4552 N
+ T V P s n/a 33 4357 4436 4552 N
+ T V R b n/a 33 4364 4424 4481 N
+ T V R e n/a 33 4364 4424 4562 N
+ T V R i n/a 33 4363 4424 4481 N
+ T V R s n/a 33 4364 4424 4481 N
+ T V S b n/a 33 4357 4418 4532 N
+ T V S e n/a 33 4357 4438 4532 N
+ T V S s n/a 33 4357 4438 4532 N
+ T V SH b n/a 33 4357 4418 4540 N
+ T V SH e n/a 33 4357 4438 4540 N
+ T V SH s n/a 33 4357 4438 4540 N
+ T V SIL e n/a 33 4357 4428 4558 N
+ T V SIL s n/a 33 4357 4428 4558 N
+ T V T b n/a 33 4357 4418 4552 N
+ T V T e n/a 33 4357 4436 4552 N
+ T V T s n/a 33 4357 4436 4552 N
+ T V TH e n/a 33 4357 4438 4552 N
+ T V TH s n/a 33 4357 4438 4552 N
+ T V UH b n/a 33 4357 4418 4476 N
+ T V UH e n/a 33 4357 4422 4476 N
+ T V UH s n/a 33 4357 4418 4476 N
+ T V UW b n/a 33 4357 4418 4479 N
+ T V UW e n/a 33 4357 4422 4479 N
+ T V UW s n/a 33 4357 4418 4479 N
+ T V V b n/a 33 4357 4418 4552 N
+ T V V e n/a 33 4357 4436 4552 N
+ T V V s n/a 33 4357 4436 4552 N
+ T V W b n/a 33 4357 4425 4483 N
+ T V W e n/a 33 4357 4423 4563 N
+ T V W s n/a 33 4357 4423 4483 N
+ T V Y b n/a 33 4357 4425 4508 N
+ T V Y e n/a 33 4357 4425 4509 N
+ T V Y s n/a 33 4357 4425 4508 N
+ T V Z b n/a 33 4357 4418 4552 N
+ T V Z e n/a 33 4357 4436 4552 N
+ T V Z s n/a 33 4357 4436 4552 N
+ T V ZH e n/a 33 4357 4436 4552 N
+ T V ZH s n/a 33 4357 4436 4552 N
+ T W AA b n/a 33 4342 4421 4500 N
+ T W AA s n/a 33 4342 4431 4500 N
+ T W AE b n/a 33 4342 4421 4502 N
+ T W AE s n/a 33 4342 4431 4502 N
+ T W AH b n/a 33 4342 4421 4476 N
+ T W AH s n/a 33 4342 4460 4520 N
+ T W AO b n/a 33 4342 4421 4501 N
+ T W AO s n/a 33 4342 4431 4501 N
+ T W AW b n/a 33 4342 4421 4502 N
+ T W AW s n/a 33 4342 4431 4502 N
+ T W AY b n/a 33 4342 4421 4500 N
+ T W AY s n/a 33 4342 4431 4500 N
+ T W B b n/a 33 4342 4421 4553 N
+ T W B s n/a 33 4342 4434 4553 N
+ T W CH s n/a 33 4342 4435 4553 N
+ T W D s n/a 33 4342 4434 4553 N
+ T W DH s n/a 33 4342 4434 4553 N
+ T W EH b n/a 33 4342 4421 4502 N
+ T W EH s n/a 33 4342 4431 4502 N
+ T W ER b n/a 33 4342 4421 4490 N
+ T W ER s n/a 33 4342 4454 4489 N
+ T W EY b n/a 33 4342 4421 4503 N
+ T W EY s n/a 33 4342 4431 4503 N
+ T W F b n/a 33 4342 4421 4553 N
+ T W F s n/a 33 4342 4435 4553 N
+ T W G b n/a 33 4342 4421 4553 N
+ T W G s n/a 33 4342 4434 4553 N
+ T W HH s n/a 33 4342 4435 4554 N
+ T W IH b n/a 33 4342 4421 4472 N
+ T W IH s n/a 33 4342 4460 4515 N
+ T W IY b n/a 33 4342 4421 4511 N
+ T W IY i n/a 33 4342 4460 4511 N
+ T W IY s n/a 33 4342 4460 4511 N
+ T W JH s n/a 33 4342 4434 4553 N
+ T W K s n/a 33 4342 4435 4553 N
+ T W L b n/a 33 4342 4425 4494 N
+ T W L s n/a 33 4342 4434 4494 N
+ T W M b n/a 33 4342 4421 4566 N
+ T W M s n/a 33 4342 4434 4566 N
+ T W N b n/a 33 4342 4421 4566 N
+ T W N s n/a 33 4342 4434 4566 N
+ T W NG b n/a 33 4342 4421 4566 N
+ T W NG s n/a 33 4342 4434 4566 N
+ T W OW b n/a 33 4342 4421 4491 N
+ T W OW s n/a 33 4342 4431 4493 N
+ T W OY b n/a 33 4342 4421 4501 N
+ T W OY s n/a 33 4342 4431 4501 N
+ T W P s n/a 33 4342 4435 4553 N
+ T W R b n/a 33 4342 4424 4481 N
+ T W R s n/a 33 4342 4431 4481 N
+ T W S b n/a 33 4342 4421 4538 N
+ T W S s n/a 33 4342 4435 4538 N
+ T W SH b n/a 33 4342 4421 4540 N
+ T W SH s n/a 33 4342 4435 4540 N
+ T W SIL s n/a 33 4342 4428 4556 N
+ T W T b n/a 33 4342 4421 4553 N
+ T W T s n/a 33 4342 4435 4553 N
+ T W TH s n/a 33 4342 4435 4553 N
+ T W UH b n/a 33 4342 4421 4476 N
+ T W UH s n/a 33 4342 4460 4476 N
+ T W UW b n/a 33 4342 4421 4479 N
+ T W UW s n/a 33 4342 4460 4479 N
+ T W V b n/a 33 4342 4421 4553 N
+ T W V s n/a 33 4342 4434 4553 N
+ T W W b n/a 33 4342 4425 4483 N
+ T W W s n/a 33 4342 4434 4483 N
+ T W Y b n/a 33 4342 4425 4511 N
+ T W Y s n/a 33 4342 4459 4511 N
+ T W Z b n/a 33 4342 4421 4553 N
+ T W Z s n/a 33 4342 4434 4553 N
+ T W ZH s n/a 33 4342 4434 4553 N
+ T Y AA b n/a 33 4343 4420 4500 N
+ T Y AA s n/a 33 4343 4432 4500 N
+ T Y AE b n/a 33 4343 4420 4502 N
+ T Y AE s n/a 33 4343 4431 4502 N
+ T Y AH b n/a 33 4343 4415 4473 N
+ T Y AH s n/a 33 4343 4457 4519 N
+ T Y AO b n/a 33 4343 4420 4501 N
+ T Y AO s n/a 33 4343 4432 4501 N
+ T Y AW b n/a 33 4343 4420 4502 N
+ T Y AW s n/a 33 4343 4431 4502 N
+ T Y AY b n/a 33 4343 4420 4500 N
+ T Y AY s n/a 33 4343 4432 4500 N
+ T Y B b n/a 33 4343 4415 4546 N
+ T Y B s n/a 33 4343 4446 4546 N
+ T Y CH s n/a 33 4343 4446 4546 N
+ T Y D s n/a 33 4343 4446 4546 N
+ T Y DH s n/a 33 4343 4446 4546 N
+ T Y EH b n/a 33 4343 4415 4502 N
+ T Y EH s n/a 33 4343 4431 4502 N
+ T Y ER b n/a 33 4343 4417 4490 N
+ T Y ER s n/a 33 4343 4461 4489 N
+ T Y EY b n/a 33 4343 4415 4503 N
+ T Y EY s n/a 33 4343 4431 4503 N
+ T Y F b n/a 33 4343 4415 4535 N
+ T Y F s n/a 33 4343 4446 4535 N
+ T Y G b n/a 33 4343 4415 4546 N
+ T Y G s n/a 33 4343 4446 4546 N
+ T Y HH s n/a 33 4343 4446 4554 N
+ T Y IH b n/a 33 4343 4415 4472 N
+ T Y IH i n/a 33 4344 4457 4516 N
+ T Y IH s n/a 33 4343 4457 4516 N
+ T Y IY b n/a 33 4343 4415 4508 N
+ T Y IY s n/a 33 4343 4455 4508 N
+ T Y JH s n/a 33 4343 4446 4546 N
+ T Y K s n/a 33 4343 4446 4546 N
+ T Y L b n/a 33 4343 4425 4494 N
+ T Y L s n/a 33 4343 4444 4494 N
+ T Y M b n/a 33 4343 4415 4565 N
+ T Y M s n/a 33 4343 4446 4565 N
+ T Y N b n/a 33 4343 4415 4565 N
+ T Y N s n/a 33 4343 4446 4565 N
+ T Y NG b n/a 33 4343 4415 4565 N
+ T Y NG s n/a 33 4343 4446 4565 N
+ T Y OW b n/a 33 4343 4417 4491 N
+ T Y OW s n/a 33 4343 4432 4493 N
+ T Y OY b n/a 33 4343 4420 4501 N
+ T Y OY s n/a 33 4343 4432 4501 N
+ T Y P s n/a 33 4343 4446 4546 N
+ T Y R b n/a 33 4343 4424 4481 N
+ T Y R s n/a 33 4343 4430 4481 N
+ T Y S b n/a 33 4343 4415 4533 N
+ T Y S s n/a 33 4343 4446 4533 N
+ T Y SH b n/a 33 4343 4415 4540 N
+ T Y SH s n/a 33 4343 4446 4540 N
+ T Y SIL s n/a 33 4343 4428 4559 N
+ T Y T b n/a 33 4343 4415 4546 N
+ T Y T s n/a 33 4343 4446 4546 N
+ T Y TH s n/a 33 4343 4446 4533 N
+ T Y UH b n/a 33 4343 4417 4475 N
+ T Y UH s n/a 33 4343 4461 4475 N
+ T Y UW b n/a 33 4343 4417 4479 N
+ T Y UW s n/a 33 4343 4461 4479 N
+ T Y V b n/a 33 4343 4415 4546 N
+ T Y V s n/a 33 4343 4446 4546 N
+ T Y W b n/a 33 4343 4425 4483 N
+ T Y W s n/a 33 4343 4447 4483 N
+ T Y Y b n/a 33 4343 4425 4508 N
+ T Y Y s n/a 33 4343 4455 4508 N
+ T Y Z b n/a 33 4343 4415 4546 N
+ T Y Z s n/a 33 4343 4446 4546 N
+ T Y ZH s n/a 33 4343 4446 4546 N
+ T Z AA b n/a 33 4359 4420 4500 N
+ T Z AA e n/a 33 4352 4422 4496 N
+ T Z AA s n/a 33 4359 4420 4500 N
+ T Z AE b n/a 33 4359 4420 4502 N
+ T Z AE e n/a 33 4352 4422 4517 N
+ T Z AE s n/a 33 4359 4420 4502 N
+ T Z AH b n/a 33 4359 4419 4476 N
+ T Z AH e n/a 33 4352 4422 4518 N
+ T Z AH i n/a 33 4361 4419 4505 N
+ T Z AH s n/a 33 4359 4419 4506 N
+ T Z AO b n/a 33 4359 4420 4501 N
+ T Z AO e n/a 33 4352 4422 4496 N
+ T Z AO s n/a 33 4359 4420 4501 N
+ T Z AW b n/a 33 4359 4420 4502 N
+ T Z AW e n/a 33 4352 4422 4518 N
+ T Z AW i n/a 33 4361 4420 4502 N
+ T Z AW s n/a 33 4359 4420 4502 N
+ T Z AY b n/a 33 4359 4420 4500 N
+ T Z AY e n/a 33 4352 4422 4496 N
+ T Z AY i n/a 33 4360 4420 4500 N
+ T Z AY s n/a 33 4359 4420 4500 N
+ T Z B b n/a 33 4359 4418 4552 N
+ T Z B e n/a 33 4355 4436 4552 N
+ T Z B s n/a 33 4359 4436 4552 N
+ T Z CH e n/a 33 4355 4436 4552 N
+ T Z CH s n/a 33 4359 4436 4552 N
+ T Z D e n/a 33 4354 4436 4552 N
+ T Z D s n/a 33 4359 4436 4552 N
+ T Z DH e n/a 33 4354 4436 4552 N
+ T Z DH s n/a 33 4359 4436 4552 N
+ T Z EH b n/a 33 4359 4418 4502 N
+ T Z EH e n/a 33 4352 4422 4517 N
+ T Z EH i n/a 33 4361 4418 4502 N
+ T Z EH s n/a 33 4359 4418 4502 N
+ T Z ER b n/a 33 4364 4418 4490 N
+ T Z ER e n/a 33 4364 4422 4488 N
+ T Z ER i n/a 33 4363 4418 4488 N
+ T Z ER s n/a 33 4364 4418 4488 N
+ T Z EY b n/a 33 4359 4418 4503 N
+ T Z EY e n/a 33 4352 4422 4517 N
+ T Z EY s n/a 33 4359 4418 4503 N
+ T Z F b n/a 33 4359 4418 4552 N
+ T Z F e n/a 33 4352 4438 4552 N
+ T Z F s n/a 33 4359 4438 4552 N
+ T Z G b n/a 33 4359 4418 4552 N
+ T Z G e n/a 33 4355 4436 4552 N
+ T Z G s n/a 33 4359 4436 4552 N
+ T Z HH e n/a 33 4352 4437 4554 N
+ T Z HH s n/a 33 4359 4437 4554 N
+ T Z IH b n/a 33 4359 4419 4472 N
+ T Z IH e n/a 33 4352 4422 4506 N
+ T Z IH i n/a 33 4361 4419 4505 N
+ T Z IH s n/a 33 4359 4419 4506 N
+ T Z IY b n/a 33 4359 4418 4508 N
+ T Z IY e n/a 33 4352 4422 4511 N
+ T Z IY i n/a 33 4361 4418 4508 N
+ T Z IY s n/a 33 4359 4418 4508 N
+ T Z JH e n/a 33 4355 4436 4552 N
+ T Z JH s n/a 33 4359 4436 4552 N
+ T Z K e n/a 33 4355 4436 4552 N
+ T Z K s n/a 33 4359 4436 4552 N
+ T Z L b n/a 33 4359 4425 4494 N
+ T Z L e n/a 33 4352 4423 4561 N
+ T Z L i n/a 33 4360 4423 4494 N
+ T Z L s n/a 33 4359 4423 4494 N
+ T Z M b n/a 33 4359 4418 4565 N
+ T Z M e n/a 33 4352 4434 4565 N
+ T Z M s n/a 33 4359 4434 4565 N
+ T Z N b n/a 33 4359 4418 4565 N
+ T Z N e n/a 33 4352 4434 4565 N
+ T Z N s n/a 33 4359 4434 4565 N
+ T Z NG b n/a 33 4359 4418 4565 N
+ T Z NG e n/a 33 4352 4434 4565 N
+ T Z NG s n/a 33 4359 4434 4565 N
+ T Z OW b n/a 33 4359 4418 4491 N
+ T Z OW e n/a 33 4352 4422 4493 N
+ T Z OW s n/a 33 4359 4418 4493 N
+ T Z OY b n/a 33 4359 4420 4501 N
+ T Z OY e n/a 33 4352 4422 4496 N
+ T Z OY s n/a 33 4359 4420 4501 N
+ T Z P e n/a 33 4355 4436 4552 N
+ T Z P s n/a 33 4359 4436 4552 N
+ T Z R b n/a 33 4364 4424 4481 N
+ T Z R e n/a 33 4362 4424 4562 N
+ T Z R i n/a 33 4362 4424 4481 N
+ T Z R s n/a 33 4364 4424 4481 N
+ T Z S b n/a 33 4359 4418 4532 N
+ T Z S e n/a 33 4354 4438 4532 N
+ T Z S i n/a 33 4354 4438 4532 N
+ T Z S s n/a 33 4359 4438 4532 N
+ T Z SH b n/a 33 4359 4418 4540 N
+ T Z SH e n/a 33 4352 4438 4540 N
+ T Z SH s n/a 33 4359 4438 4540 N
+ T Z SIL e n/a 33 4359 4428 4558 N
+ T Z SIL s n/a 33 4359 4428 4558 N
+ T Z T b n/a 33 4359 4418 4552 N
+ T Z T e n/a 33 4355 4436 4552 N
+ T Z T s n/a 33 4359 4436 4552 N
+ T Z TH e n/a 33 4354 4438 4552 N
+ T Z TH s n/a 33 4359 4438 4552 N
+ T Z UH b n/a 33 4359 4418 4476 N
+ T Z UH e n/a 33 4352 4422 4476 N
+ T Z UH s n/a 33 4359 4418 4476 N
+ T Z UW b n/a 33 4359 4418 4479 N
+ T Z UW e n/a 33 4352 4422 4479 N
+ T Z UW s n/a 33 4359 4418 4479 N
+ T Z V b n/a 33 4359 4418 4552 N
+ T Z V e n/a 33 4352 4436 4552 N
+ T Z V s n/a 33 4359 4436 4552 N
+ T Z W b n/a 33 4359 4425 4483 N
+ T Z W e n/a 33 4352 4423 4563 N
+ T Z W s n/a 33 4359 4423 4483 N
+ T Z Y b n/a 33 4359 4425 4508 N
+ T Z Y e n/a 33 4352 4425 4509 N
+ T Z Y s n/a 33 4359 4425 4508 N
+ T Z Z b n/a 33 4359 4418 4552 N
+ T Z Z e n/a 33 4354 4436 4552 N
+ T Z Z s n/a 33 4359 4436 4552 N
+ T Z ZH e n/a 33 4352 4436 4552 N
+ T Z ZH s n/a 33 4359 4436 4552 N
+ T ZH AA b n/a 33 4360 4420 4500 N
+ T ZH AA s n/a 33 4360 4420 4500 N
+ T ZH AE b n/a 33 4361 4420 4502 N
+ T ZH AE s n/a 33 4361 4420 4502 N
+ T ZH AH b n/a 33 4360 4419 4476 N
+ T ZH AH s n/a 33 4360 4419 4506 N
+ T ZH AO b n/a 33 4360 4420 4501 N
+ T ZH AO s n/a 33 4360 4420 4501 N
+ T ZH AW b n/a 33 4361 4420 4502 N
+ T ZH AW s n/a 33 4361 4420 4502 N
+ T ZH AY b n/a 33 4360 4420 4500 N
+ T ZH AY s n/a 33 4360 4420 4500 N
+ T ZH B b n/a 33 4360 4418 4552 N
+ T ZH B s n/a 33 4360 4436 4552 N
+ T ZH CH s n/a 33 4360 4436 4552 N
+ T ZH D s n/a 33 4360 4436 4552 N
+ T ZH DH s n/a 33 4360 4436 4552 N
+ T ZH EH b n/a 33 4361 4418 4502 N
+ T ZH EH s n/a 33 4361 4418 4502 N
+ T ZH ER b n/a 33 4364 4418 4490 N
+ T ZH ER s n/a 33 4364 4418 4488 N
+ T ZH EY b n/a 33 4361 4418 4503 N
+ T ZH EY s n/a 33 4361 4418 4503 N
+ T ZH F b n/a 33 4360 4418 4552 N
+ T ZH F s n/a 33 4360 4438 4552 N
+ T ZH G b n/a 33 4360 4418 4552 N
+ T ZH G s n/a 33 4360 4436 4552 N
+ T ZH HH s n/a 33 4360 4437 4554 N
+ T ZH IH b n/a 33 4360 4419 4472 N
+ T ZH IH s n/a 33 4360 4419 4506 N
+ T ZH IY b n/a 33 4361 4418 4508 N
+ T ZH IY s n/a 33 4361 4418 4508 N
+ T ZH JH s n/a 33 4360 4436 4552 N
+ T ZH K s n/a 33 4360 4436 4552 N
+ T ZH L b n/a 33 4360 4425 4494 N
+ T ZH L s n/a 33 4360 4423 4494 N
+ T ZH M b n/a 33 4360 4418 4565 N
+ T ZH M s n/a 33 4360 4434 4565 N
+ T ZH N b n/a 33 4360 4418 4565 N
+ T ZH N s n/a 33 4360 4434 4565 N
+ T ZH NG b n/a 33 4360 4418 4565 N
+ T ZH NG s n/a 33 4360 4434 4565 N
+ T ZH OW b n/a 33 4360 4418 4491 N
+ T ZH OW s n/a 33 4360 4418 4493 N
+ T ZH OY b n/a 33 4360 4420 4501 N
+ T ZH OY s n/a 33 4360 4420 4501 N
+ T ZH P s n/a 33 4360 4436 4552 N
+ T ZH R b n/a 33 4364 4424 4481 N
+ T ZH R s n/a 33 4364 4424 4481 N
+ T ZH S b n/a 33 4360 4418 4532 N
+ T ZH S s n/a 33 4360 4438 4532 N
+ T ZH SH b n/a 33 4360 4418 4540 N
+ T ZH SH s n/a 33 4360 4438 4540 N
+ T ZH SIL s n/a 33 4360 4428 4558 N
+ T ZH T b n/a 33 4360 4418 4552 N
+ T ZH T s n/a 33 4360 4436 4552 N
+ T ZH TH s n/a 33 4360 4438 4552 N
+ T ZH UH b n/a 33 4360 4418 4476 N
+ T ZH UH s n/a 33 4360 4418 4476 N
+ T ZH UW b n/a 33 4360 4418 4479 N
+ T ZH UW s n/a 33 4360 4418 4479 N
+ T ZH V b n/a 33 4360 4418 4552 N
+ T ZH V s n/a 33 4360 4436 4552 N
+ T ZH W b n/a 33 4360 4425 4483 N
+ T ZH W s n/a 33 4360 4423 4483 N
+ T ZH Y b n/a 33 4361 4425 4508 N
+ T ZH Y s n/a 33 4361 4425 4508 N
+ T ZH Z b n/a 33 4360 4418 4552 N
+ T ZH Z s n/a 33 4360 4436 4552 N
+ T ZH ZH s n/a 33 4360 4436 4552 N
+ TH AA AA b n/a 34 4568 4584 4598 N
+ TH AA AA e n/a 34 4568 4585 4598 N
+ TH AA AA i n/a 34 4568 4584 4598 N
+ TH AA AE b n/a 34 4568 4584 4600 N
+ TH AA AE e n/a 34 4568 4585 4600 N
+ TH AA AH b n/a 34 4568 4584 4598 N
+ TH AA AH e n/a 34 4568 4585 4600 N
+ TH AA AH i n/a 34 4568 4584 4600 N
+ TH AA AO b n/a 34 4568 4584 4598 N
+ TH AA AO e n/a 34 4568 4585 4598 N
+ TH AA AO i n/a 34 4568 4584 4598 N
+ TH AA AW b n/a 34 4568 4584 4599 N
+ TH AA AW e n/a 34 4568 4585 4599 N
+ TH AA AY b n/a 34 4568 4584 4598 N
+ TH AA AY e n/a 34 4568 4585 4598 N
+ TH AA B e n/a 34 4568 4585 4592 N
+ TH AA CH e n/a 34 4568 4585 4592 N
+ TH AA D e n/a 34 4568 4585 4592 N
+ TH AA D i n/a 34 4568 4584 4592 N
+ TH AA DH e n/a 34 4568 4585 4596 N
+ TH AA EH b n/a 34 4568 4584 4600 N
+ TH AA EH e n/a 34 4568 4585 4600 N
+ TH AA ER b n/a 34 4568 4584 4601 N
+ TH AA ER e n/a 34 4568 4585 4601 N
+ TH AA ER i n/a 34 4568 4584 4601 N
+ TH AA EY b n/a 34 4568 4584 4600 N
+ TH AA EY e n/a 34 4568 4585 4600 N
+ TH AA EY i n/a 34 4568 4584 4600 N
+ TH AA F e n/a 34 4568 4585 4596 N
+ TH AA F i n/a 34 4568 4584 4596 N
+ TH AA G e n/a 34 4568 4585 4592 N
+ TH AA HH e n/a 34 4568 4585 4596 N
+ TH AA IH b n/a 34 4568 4584 4604 N
+ TH AA IH e n/a 34 4568 4585 4604 N
+ TH AA IH i n/a 34 4568 4584 4602 N
+ TH AA IY b n/a 34 4568 4584 4604 N
+ TH AA IY e n/a 34 4568 4585 4604 N
+ TH AA IY i n/a 34 4568 4584 4604 N
+ TH AA JH e n/a 34 4568 4585 4592 N
+ TH AA K e n/a 34 4568 4585 4592 N
+ TH AA L b n/a 34 4568 4584 4593 N
+ TH AA L e n/a 34 4568 4585 4593 N
+ TH AA L i n/a 34 4568 4584 4593 N
+ TH AA M e n/a 34 4568 4585 4593 N
+ TH AA M i n/a 34 4568 4584 4593 N
+ TH AA N e n/a 34 4568 4585 4593 N
+ TH AA N i n/a 34 4568 4584 4593 N
+ TH AA NG e n/a 34 4568 4585 4593 N
+ TH AA OW b n/a 34 4568 4584 4600 N
+ TH AA OW e n/a 34 4568 4585 4600 N
+ TH AA OW i n/a 34 4568 4584 4600 N
+ TH AA OY e n/a 34 4568 4585 4598 N
+ TH AA P e n/a 34 4568 4585 4592 N
+ TH AA R b n/a 34 4568 4584 4597 N
+ TH AA R e n/a 34 4568 4585 4597 N
+ TH AA R i n/a 34 4568 4584 4597 N
+ TH AA S b n/a 34 4568 4584 4596 N
+ TH AA S e n/a 34 4568 4585 4596 N
+ TH AA S i n/a 34 4568 4584 4596 N
+ TH AA SH e n/a 34 4568 4585 4596 N
+ TH AA SIL e n/a 34 4568 4585 4591 N
+ TH AA T e n/a 34 4568 4585 4592 N
+ TH AA TH e n/a 34 4568 4585 4596 N
+ TH AA UH b n/a 34 4568 4584 4604 N
+ TH AA UH e n/a 34 4568 4585 4604 N
+ TH AA UW b n/a 34 4568 4584 4604 N
+ TH AA UW e n/a 34 4568 4585 4604 N
+ TH AA V e n/a 34 4568 4585 4596 N
+ TH AA W b n/a 34 4568 4584 4594 N
+ TH AA W e n/a 34 4568 4585 4594 N
+ TH AA W i n/a 34 4568 4584 4594 N
+ TH AA Y b n/a 34 4568 4584 4593 N
+ TH AA Y e n/a 34 4568 4585 4593 N
+ TH AA Z e n/a 34 4568 4585 4596 N
+ TH AA ZH e n/a 34 4568 4585 4596 N
+ TH AE AA b n/a 34 4571 4584 4598 N
+ TH AE AA e n/a 34 4569 4585 4598 N
+ TH AE AA i n/a 34 4569 4584 4598 N
+ TH AE AE b n/a 34 4571 4584 4600 N
+ TH AE AE e n/a 34 4569 4585 4600 N
+ TH AE AH b n/a 34 4571 4584 4598 N
+ TH AE AH e n/a 34 4569 4585 4600 N
+ TH AE AH i n/a 34 4569 4584 4600 N
+ TH AE AO b n/a 34 4571 4584 4598 N
+ TH AE AO e n/a 34 4569 4585 4598 N
+ TH AE AW b n/a 34 4571 4584 4599 N
+ TH AE AW e n/a 34 4569 4585 4599 N
+ TH AE AY b n/a 34 4571 4584 4598 N
+ TH AE AY e n/a 34 4569 4585 4598 N
+ TH AE AY i n/a 34 4569 4584 4598 N
+ TH AE B e n/a 34 4569 4585 4592 N
+ TH AE B i n/a 34 4569 4584 4592 N
+ TH AE CH e n/a 34 4569 4585 4592 N
+ TH AE D e n/a 34 4569 4585 4592 N
+ TH AE DH e n/a 34 4569 4585 4596 N
+ TH AE EH b n/a 34 4571 4584 4600 N
+ TH AE EH e n/a 34 4569 4585 4600 N
+ TH AE EH i n/a 34 4569 4584 4600 N
+ TH AE ER b n/a 34 4571 4584 4601 N
+ TH AE ER e n/a 34 4569 4585 4601 N
+ TH AE ER i n/a 34 4569 4584 4601 N
+ TH AE EY b n/a 34 4571 4584 4600 N
+ TH AE EY e n/a 34 4569 4585 4600 N
+ TH AE EY i n/a 34 4569 4584 4600 N
+ TH AE F e n/a 34 4569 4585 4596 N
+ TH AE F i n/a 34 4569 4584 4596 N
+ TH AE G e n/a 34 4569 4585 4592 N
+ TH AE G i n/a 34 4569 4584 4592 N
+ TH AE HH e n/a 34 4569 4585 4596 N
+ TH AE IH b n/a 34 4571 4584 4604 N
+ TH AE IH e n/a 34 4569 4585 4604 N
+ TH AE IH i n/a 34 4569 4584 4602 N
+ TH AE IY b n/a 34 4571 4584 4604 N
+ TH AE IY e n/a 34 4569 4585 4604 N
+ TH AE IY i n/a 34 4569 4584 4604 N
+ TH AE JH e n/a 34 4569 4585 4592 N
+ TH AE JH i n/a 34 4569 4584 4592 N
+ TH AE K e n/a 34 4569 4585 4592 N
+ TH AE K i n/a 34 4569 4584 4592 N
+ TH AE L b n/a 34 4571 4584 4593 N
+ TH AE L e n/a 34 4569 4585 4593 N
+ TH AE L i n/a 34 4569 4584 4593 N
+ TH AE M e n/a 34 4569 4585 4593 N
+ TH AE M i n/a 34 4569 4584 4593 N
+ TH AE N e n/a 34 4569 4585 4593 N
+ TH AE NG e n/a 34 4569 4585 4593 N
+ TH AE OW b n/a 34 4571 4584 4600 N
+ TH AE OW e n/a 34 4569 4585 4600 N
+ TH AE OW i n/a 34 4569 4584 4600 N
+ TH AE OY e n/a 34 4569 4585 4598 N
+ TH AE P e n/a 34 4569 4585 4592 N
+ TH AE R b n/a 34 4571 4584 4597 N
+ TH AE R e n/a 34 4569 4585 4597 N
+ TH AE R i n/a 34 4569 4584 4597 N
+ TH AE S b n/a 34 4571 4584 4596 N
+ TH AE S e n/a 34 4569 4585 4596 N
+ TH AE S i n/a 34 4569 4584 4596 N
+ TH AE SH e n/a 34 4569 4585 4596 N
+ TH AE SH i n/a 34 4569 4584 4596 N
+ TH AE SIL e n/a 34 4569 4585 4591 N
+ TH AE T e n/a 34 4569 4585 4592 N
+ TH AE T i n/a 34 4569 4584 4592 N
+ TH AE TH e n/a 34 4569 4585 4596 N
+ TH AE UH b n/a 34 4571 4584 4604 N
+ TH AE UH e n/a 34 4569 4585 4604 N
+ TH AE UH i n/a 34 4569 4584 4602 N
+ TH AE UW b n/a 34 4571 4584 4604 N
+ TH AE UW e n/a 34 4569 4585 4604 N
+ TH AE V e n/a 34 4569 4585 4596 N
+ TH AE W b n/a 34 4571 4584 4594 N
+ TH AE W e n/a 34 4569 4585 4594 N
+ TH AE W i n/a 34 4569 4584 4594 N
+ TH AE Y b n/a 34 4571 4584 4593 N
+ TH AE Y e n/a 34 4569 4585 4593 N
+ TH AE Y i n/a 34 4569 4584 4593 N
+ TH AE Z e n/a 34 4569 4585 4596 N
+ TH AE ZH e n/a 34 4569 4585 4596 N
+ TH AH AA b n/a 34 4573 4583 4598 N
+ TH AH AA e n/a 34 4569 4585 4598 N
+ TH AH AA i n/a 34 4569 4583 4598 N
+ TH AH AE b n/a 34 4573 4583 4600 N
+ TH AH AE e n/a 34 4569 4585 4600 N
+ TH AH AE i n/a 34 4569 4583 4600 N
+ TH AH AH b n/a 34 4573 4583 4598 N
+ TH AH AH e n/a 34 4569 4585 4600 N
+ TH AH AH i n/a 34 4569 4584 4600 N
+ TH AH AO b n/a 34 4573 4583 4598 N
+ TH AH AO e n/a 34 4569 4585 4598 N
+ TH AH AO i n/a 34 4569 4583 4598 N
+ TH AH AW b n/a 34 4573 4583 4599 N
+ TH AH AW e n/a 34 4569 4585 4599 N
+ TH AH AY b n/a 34 4573 4583 4598 N
+ TH AH AY e n/a 34 4569 4585 4598 N
+ TH AH AY i n/a 34 4569 4583 4598 N
+ TH AH B e n/a 34 4569 4585 4592 N
+ TH AH B i n/a 34 4569 4583 4592 N
+ TH AH CH e n/a 34 4569 4585 4592 N
+ TH AH D e n/a 34 4569 4585 4592 N
+ TH AH DH e n/a 34 4569 4585 4596 N
+ TH AH EH b n/a 34 4573 4583 4600 N
+ TH AH EH e n/a 34 4569 4585 4600 N
+ TH AH EH i n/a 34 4569 4583 4600 N
+ TH AH ER b n/a 34 4573 4583 4601 N
+ TH AH ER e n/a 34 4569 4585 4601 N
+ TH AH ER i n/a 34 4569 4584 4601 N
+ TH AH EY b n/a 34 4573 4583 4600 N
+ TH AH EY e n/a 34 4569 4585 4600 N
+ TH AH EY i n/a 34 4569 4583 4600 N
+ TH AH F e n/a 34 4569 4585 4596 N
+ TH AH F i n/a 34 4569 4583 4596 N
+ TH AH G e n/a 34 4569 4585 4592 N
+ TH AH HH e n/a 34 4569 4585 4596 N
+ TH AH IH b n/a 34 4573 4583 4602 N
+ TH AH IH e n/a 34 4568 4585 4604 N
+ TH AH IH i n/a 34 4568 4584 4602 N
+ TH AH IY b n/a 34 4573 4583 4604 N
+ TH AH IY e n/a 34 4569 4585 4604 N
+ TH AH IY i n/a 34 4569 4583 4604 N
+ TH AH JH e n/a 34 4569 4585 4592 N
+ TH AH K e n/a 34 4569 4585 4592 N
+ TH AH L b n/a 34 4573 4583 4593 N
+ TH AH L e n/a 34 4569 4585 4593 N
+ TH AH M e n/a 34 4569 4585 4593 N
+ TH AH M i n/a 34 4569 4583 4593 N
+ TH AH N e n/a 34 4569 4585 4593 N
+ TH AH N i n/a 34 4569 4583 4593 N
+ TH AH NG e n/a 34 4569 4585 4593 N
+ TH AH OW b n/a 34 4573 4583 4600 N
+ TH AH OW e n/a 34 4569 4585 4600 N
+ TH AH OW i n/a 34 4569 4583 4600 N
+ TH AH OY e n/a 34 4569 4585 4598 N
+ TH AH P e n/a 34 4569 4585 4592 N
+ TH AH R b n/a 34 4573 4583 4597 N
+ TH AH R e n/a 34 4569 4585 4597 N
+ TH AH R i n/a 34 4569 4583 4597 N
+ TH AH S b n/a 34 4573 4583 4596 N
+ TH AH S e n/a 34 4569 4585 4596 N
+ TH AH S i n/a 34 4569 4583 4596 N
+ TH AH SH e n/a 34 4569 4585 4596 N
+ TH AH SIL e n/a 34 4569 4585 4591 N
+ TH AH T e n/a 34 4569 4585 4592 N
+ TH AH TH e n/a 34 4569 4585 4596 N
+ TH AH UH b n/a 34 4573 4583 4602 N
+ TH AH UH e n/a 34 4569 4585 4604 N
+ TH AH UW b n/a 34 4573 4583 4604 N
+ TH AH UW e n/a 34 4569 4585 4604 N
+ TH AH UW i n/a 34 4569 4583 4604 N
+ TH AH V e n/a 34 4569 4585 4596 N
+ TH AH V i n/a 34 4569 4583 4596 N
+ TH AH W b n/a 34 4573 4583 4594 N
+ TH AH W e n/a 34 4569 4585 4594 N
+ TH AH W i n/a 34 4569 4583 4594 N
+ TH AH Y b n/a 34 4573 4583 4593 N
+ TH AH Y e n/a 34 4569 4585 4593 N
+ TH AH Y i n/a 34 4569 4583 4593 N
+ TH AH Z e n/a 34 4569 4585 4596 N
+ TH AH ZH e n/a 34 4569 4585 4596 N
+ TH AO AA b n/a 34 4568 4584 4598 N
+ TH AO AA e n/a 34 4568 4586 4598 N
+ TH AO AE b n/a 34 4568 4584 4600 N
+ TH AO AE e n/a 34 4568 4586 4600 N
+ TH AO AH b n/a 34 4568 4584 4598 N
+ TH AO AH e n/a 34 4568 4586 4600 N
+ TH AO AH i n/a 34 4568 4584 4600 N
+ TH AO AO b n/a 34 4568 4584 4598 N
+ TH AO AO e n/a 34 4568 4586 4598 N
+ TH AO AO i n/a 34 4568 4584 4598 N
+ TH AO AW b n/a 34 4568 4584 4599 N
+ TH AO AW e n/a 34 4568 4586 4599 N
+ TH AO AY b n/a 34 4568 4584 4598 N
+ TH AO AY e n/a 34 4568 4586 4598 N
+ TH AO B e n/a 34 4568 4586 4592 N
+ TH AO B i n/a 34 4568 4584 4592 N
+ TH AO CH e n/a 34 4568 4586 4592 N
+ TH AO CH i n/a 34 4568 4584 4592 N
+ TH AO D e n/a 34 4568 4586 4592 N
+ TH AO DH e n/a 34 4568 4586 4596 N
+ TH AO EH b n/a 34 4568 4584 4600 N
+ TH AO EH e n/a 34 4568 4586 4600 N
+ TH AO EH i n/a 34 4568 4584 4600 N
+ TH AO ER b n/a 34 4568 4584 4601 N
+ TH AO ER e n/a 34 4568 4586 4601 N
+ TH AO ER i n/a 34 4568 4584 4601 N
+ TH AO EY b n/a 34 4568 4584 4600 N
+ TH AO EY e n/a 34 4568 4586 4600 N
+ TH AO F e n/a 34 4568 4586 4596 N
+ TH AO F i n/a 34 4568 4584 4596 N
+ TH AO G e n/a 34 4568 4586 4592 N
+ TH AO G i n/a 34 4568 4584 4592 N
+ TH AO HH e n/a 34 4568 4586 4596 N
+ TH AO IH b n/a 34 4568 4584 4604 N
+ TH AO IH e n/a 34 4568 4586 4604 N
+ TH AO IH i n/a 34 4568 4584 4602 N
+ TH AO IY b n/a 34 4568 4584 4604 N
+ TH AO IY e n/a 34 4568 4586 4604 N
+ TH AO IY i n/a 34 4568 4584 4604 N
+ TH AO JH e n/a 34 4568 4586 4592 N
+ TH AO K e n/a 34 4568 4586 4592 N
+ TH AO K i n/a 34 4568 4584 4592 N
+ TH AO L b n/a 34 4568 4584 4593 N
+ TH AO L e n/a 34 4568 4586 4593 N
+ TH AO L i n/a 34 4568 4584 4593 N
+ TH AO M e n/a 34 4568 4586 4593 N
+ TH AO M i n/a 34 4568 4584 4593 N
+ TH AO N e n/a 34 4568 4586 4593 N
+ TH AO N i n/a 34 4568 4584 4593 N
+ TH AO NG e n/a 34 4568 4586 4593 N
+ TH AO OW b n/a 34 4568 4584 4600 N
+ TH AO OW e n/a 34 4568 4586 4600 N
+ TH AO OW i n/a 34 4568 4584 4600 N
+ TH AO OY e n/a 34 4568 4586 4598 N
+ TH AO P e n/a 34 4568 4586 4592 N
+ TH AO R b n/a 34 4568 4584 4597 N
+ TH AO R e n/a 34 4568 4586 4597 N
+ TH AO R i n/a 34 4568 4584 4597 N
+ TH AO S b n/a 34 4568 4584 4596 N
+ TH AO S e n/a 34 4568 4586 4596 N
+ TH AO S i n/a 34 4568 4584 4596 N
+ TH AO SH e n/a 34 4568 4586 4596 N
+ TH AO SIL e n/a 34 4568 4585 4591 N
+ TH AO T e n/a 34 4568 4586 4592 N
+ TH AO T i n/a 34 4568 4584 4592 N
+ TH AO TH e n/a 34 4568 4586 4596 N
+ TH AO UH b n/a 34 4568 4584 4604 N
+ TH AO UH e n/a 34 4568 4586 4604 N
+ TH AO UW b n/a 34 4568 4584 4604 N
+ TH AO UW e n/a 34 4568 4586 4604 N
+ TH AO V e n/a 34 4568 4586 4596 N
+ TH AO W b n/a 34 4568 4584 4594 N
+ TH AO W e n/a 34 4568 4586 4594 N
+ TH AO W i n/a 34 4568 4584 4594 N
+ TH AO Y b n/a 34 4568 4584 4593 N
+ TH AO Y e n/a 34 4568 4586 4593 N
+ TH AO Z e n/a 34 4568 4586 4596 N
+ TH AO ZH e n/a 34 4568 4586 4596 N
+ TH AW AA b n/a 34 4570 4584 4598 N
+ TH AW AA e n/a 34 4570 4585 4598 N
+ TH AW AE b n/a 34 4570 4584 4600 N
+ TH AW AE e n/a 34 4570 4585 4600 N
+ TH AW AH b n/a 34 4570 4584 4598 N
+ TH AW AH e n/a 34 4570 4585 4600 N
+ TH AW AH i n/a 34 4570 4584 4600 N
+ TH AW AO b n/a 34 4570 4584 4598 N
+ TH AW AO e n/a 34 4570 4585 4598 N
+ TH AW AW b n/a 34 4570 4584 4599 N
+ TH AW AW e n/a 34 4570 4585 4599 N
+ TH AW AY b n/a 34 4570 4584 4598 N
+ TH AW AY e n/a 34 4570 4585 4598 N
+ TH AW B e n/a 34 4570 4585 4592 N
+ TH AW B i n/a 34 4570 4584 4592 N
+ TH AW CH e n/a 34 4570 4585 4592 N
+ TH AW D e n/a 34 4570 4585 4592 N
+ TH AW D i n/a 34 4570 4584 4592 N
+ TH AW DH e n/a 34 4570 4585 4596 N
+ TH AW EH b n/a 34 4570 4584 4600 N
+ TH AW EH e n/a 34 4570 4585 4600 N
+ TH AW ER b n/a 34 4570 4584 4601 N
+ TH AW ER e n/a 34 4570 4585 4601 N
+ TH AW ER i n/a 34 4570 4584 4601 N
+ TH AW EY b n/a 34 4570 4584 4600 N
+ TH AW EY e n/a 34 4570 4585 4600 N
+ TH AW F e n/a 34 4570 4585 4596 N
+ TH AW F i n/a 34 4570 4584 4596 N
+ TH AW G e n/a 34 4570 4585 4592 N
+ TH AW G i n/a 34 4570 4584 4592 N
+ TH AW HH e n/a 34 4570 4585 4596 N
+ TH AW HH i n/a 34 4570 4584 4596 N
+ TH AW IH b n/a 34 4570 4584 4604 N
+ TH AW IH e n/a 34 4570 4585 4604 N
+ TH AW IH i n/a 34 4570 4584 4602 N
+ TH AW IY b n/a 34 4570 4584 4604 N
+ TH AW IY e n/a 34 4570 4585 4604 N
+ TH AW IY i n/a 34 4570 4584 4604 N
+ TH AW JH e n/a 34 4570 4585 4592 N
+ TH AW K e n/a 34 4570 4585 4592 N
+ TH AW L b n/a 34 4570 4584 4593 N
+ TH AW L e n/a 34 4570 4585 4593 N
+ TH AW L i n/a 34 4570 4584 4593 N
+ TH AW M e n/a 34 4570 4585 4593 N
+ TH AW M i n/a 34 4570 4584 4593 N
+ TH AW N e n/a 34 4570 4585 4593 N
+ TH AW NG e n/a 34 4570 4585 4593 N
+ TH AW OW b n/a 34 4570 4584 4600 N
+ TH AW OW e n/a 34 4570 4585 4600 N
+ TH AW OW i n/a 34 4570 4584 4600 N
+ TH AW OY e n/a 34 4570 4585 4598 N
+ TH AW P e n/a 34 4570 4585 4592 N
+ TH AW P i n/a 34 4570 4584 4592 N
+ TH AW R b n/a 34 4570 4584 4597 N
+ TH AW R e n/a 34 4570 4585 4597 N
+ TH AW R i n/a 34 4570 4584 4597 N
+ TH AW S b n/a 34 4570 4584 4596 N
+ TH AW S e n/a 34 4570 4585 4596 N
+ TH AW S i n/a 34 4570 4584 4596 N
+ TH AW SH e n/a 34 4570 4585 4596 N
+ TH AW SIL e n/a 34 4570 4585 4591 N
+ TH AW T e n/a 34 4570 4585 4592 N
+ TH AW TH e n/a 34 4570 4585 4596 N
+ TH AW UH b n/a 34 4570 4584 4604 N
+ TH AW UH e n/a 34 4570 4585 4604 N
+ TH AW UW b n/a 34 4570 4584 4604 N
+ TH AW UW e n/a 34 4570 4585 4604 N
+ TH AW V e n/a 34 4570 4585 4596 N
+ TH AW W b n/a 34 4570 4584 4594 N
+ TH AW W e n/a 34 4570 4585 4594 N
+ TH AW W i n/a 34 4570 4584 4594 N
+ TH AW Y b n/a 34 4570 4584 4593 N
+ TH AW Y e n/a 34 4570 4585 4593 N
+ TH AW Z e n/a 34 4570 4585 4596 N
+ TH AW ZH e n/a 34 4570 4585 4596 N
+ TH AY AA b n/a 34 4572 4584 4598 N
+ TH AY AA e n/a 34 4572 4586 4598 N
+ TH AY AA i n/a 34 4572 4584 4598 N
+ TH AY AE b n/a 34 4572 4584 4600 N
+ TH AY AE e n/a 34 4572 4586 4600 N
+ TH AY AH b n/a 34 4572 4584 4598 N
+ TH AY AH e n/a 34 4572 4586 4600 N
+ TH AY AH i n/a 34 4572 4584 4600 N
+ TH AY AO b n/a 34 4572 4584 4598 N
+ TH AY AO e n/a 34 4572 4586 4598 N
+ TH AY AW b n/a 34 4572 4584 4599 N
+ TH AY AW e n/a 34 4572 4586 4599 N
+ TH AY AW i n/a 34 4572 4584 4599 N
+ TH AY AY b n/a 34 4572 4584 4598 N
+ TH AY AY e n/a 34 4572 4586 4598 N
+ TH AY B e n/a 34 4572 4586 4592 N
+ TH AY CH e n/a 34 4572 4586 4592 N
+ TH AY D e n/a 34 4572 4586 4592 N
+ TH AY DH e n/a 34 4572 4586 4596 N
+ TH AY EH b n/a 34 4572 4584 4600 N
+ TH AY EH e n/a 34 4572 4586 4600 N
+ TH AY EH i n/a 34 4572 4584 4600 N
+ TH AY ER b n/a 34 4572 4584 4601 N
+ TH AY ER e n/a 34 4572 4586 4601 N
+ TH AY EY b n/a 34 4572 4584 4600 N
+ TH AY EY e n/a 34 4572 4586 4600 N
+ TH AY F e n/a 34 4572 4586 4596 N
+ TH AY G e n/a 34 4572 4586 4592 N
+ TH AY HH e n/a 34 4572 4586 4596 N
+ TH AY IH b n/a 34 4572 4584 4604 N
+ TH AY IH e n/a 34 4572 4586 4604 N
+ TH AY IY b n/a 34 4572 4584 4604 N
+ TH AY IY e n/a 34 4572 4586 4604 N
+ TH AY JH e n/a 34 4572 4586 4592 N
+ TH AY K e n/a 34 4572 4586 4592 N
+ TH AY L b n/a 34 4572 4584 4593 N
+ TH AY L e n/a 34 4572 4586 4593 N
+ TH AY L i n/a 34 4572 4584 4593 N
+ TH AY M e n/a 34 4572 4586 4593 N
+ TH AY N e n/a 34 4572 4586 4593 N
+ TH AY NG e n/a 34 4572 4586 4593 N
+ TH AY OW b n/a 34 4572 4584 4600 N
+ TH AY OW e n/a 34 4572 4586 4600 N
+ TH AY OY e n/a 34 4572 4586 4598 N
+ TH AY P e n/a 34 4572 4586 4592 N
+ TH AY R b n/a 34 4572 4584 4597 N
+ TH AY R e n/a 34 4572 4586 4597 N
+ TH AY S b n/a 34 4572 4584 4596 N
+ TH AY S e n/a 34 4572 4586 4596 N
+ TH AY S i n/a 34 4572 4584 4596 N
+ TH AY SH e n/a 34 4572 4586 4596 N
+ TH AY SIL e n/a 34 4572 4586 4591 N
+ TH AY T e n/a 34 4572 4586 4592 N
+ TH AY TH e n/a 34 4572 4586 4596 N
+ TH AY UH b n/a 34 4572 4584 4604 N
+ TH AY UH e n/a 34 4572 4586 4604 N
+ TH AY UW b n/a 34 4572 4584 4604 N
+ TH AY UW e n/a 34 4572 4586 4604 N
+ TH AY V e n/a 34 4572 4586 4596 N
+ TH AY W b n/a 34 4572 4584 4594 N
+ TH AY W e n/a 34 4572 4586 4594 N
+ TH AY Y b n/a 34 4572 4584 4593 N
+ TH AY Y e n/a 34 4572 4586 4593 N
+ TH AY Z e n/a 34 4572 4586 4596 N
+ TH AY ZH e n/a 34 4572 4586 4596 N
+ TH B AA b n/a 34 4574 4581 4598 N
+ TH B AE b n/a 34 4574 4581 4600 N
+ TH B AH b n/a 34 4574 4581 4598 N
+ TH B AO b n/a 34 4574 4581 4598 N
+ TH B AW b n/a 34 4574 4581 4599 N
+ TH B AY b n/a 34 4574 4581 4598 N
+ TH B EH b n/a 34 4574 4581 4600 N
+ TH B ER b n/a 34 4574 4581 4601 N
+ TH B EY b n/a 34 4574 4581 4600 N
+ TH B IH b n/a 34 4574 4581 4602 N
+ TH B IY b n/a 34 4574 4581 4604 N
+ TH B IY i n/a 34 4574 4581 4604 N
+ TH B L b n/a 34 4574 4582 4593 N
+ TH B OW b n/a 34 4574 4581 4600 N
+ TH B R b n/a 34 4574 4582 4597 N
+ TH B S b n/a 34 4574 4581 4596 N
+ TH B UH b n/a 34 4574 4581 4602 N
+ TH B UW b n/a 34 4574 4581 4604 N
+ TH B W b n/a 34 4574 4581 4594 N
+ TH B Y b n/a 34 4574 4581 4593 N
+ TH CH AA b n/a 34 4574 4581 4598 N
+ TH CH AE b n/a 34 4574 4581 4600 N
+ TH CH AH b n/a 34 4574 4581 4598 N
+ TH CH AO b n/a 34 4574 4581 4598 N
+ TH CH AW b n/a 34 4574 4581 4599 N
+ TH CH AY b n/a 34 4574 4581 4598 N
+ TH CH AY i n/a 34 4574 4581 4598 N
+ TH CH EH b n/a 34 4574 4581 4600 N
+ TH CH ER b n/a 34 4574 4581 4601 N
+ TH CH EY b n/a 34 4574 4581 4600 N
+ TH CH IH b n/a 34 4574 4581 4602 N
+ TH CH IY b n/a 34 4574 4581 4604 N
+ TH CH IY i n/a 34 4574 4581 4604 N
+ TH CH L b n/a 34 4574 4582 4593 N
+ TH CH OW b n/a 34 4574 4581 4600 N
+ TH CH R b n/a 34 4574 4582 4597 N
+ TH CH S b n/a 34 4574 4581 4596 N
+ TH CH UH b n/a 34 4574 4581 4602 N
+ TH CH UW b n/a 34 4574 4581 4604 N
+ TH CH W b n/a 34 4574 4581 4594 N
+ TH CH Y b n/a 34 4574 4581 4593 N
+ TH D AA b n/a 34 4576 4581 4598 N
+ TH D AA e n/a 34 4576 4581 4598 N
+ TH D AE b n/a 34 4576 4581 4600 N
+ TH D AE e n/a 34 4576 4581 4600 N
+ TH D AH b n/a 34 4576 4581 4598 N
+ TH D AH e n/a 34 4576 4581 4600 N
+ TH D AH i n/a 34 4576 4581 4600 N
+ TH D AO b n/a 34 4576 4581 4598 N
+ TH D AO e n/a 34 4576 4581 4598 N
+ TH D AW b n/a 34 4576 4581 4599 N
+ TH D AW e n/a 34 4576 4581 4599 N
+ TH D AY b n/a 34 4576 4581 4598 N
+ TH D AY e n/a 34 4576 4581 4598 N
+ TH D B e n/a 34 4576 4581 4592 N
+ TH D CH e n/a 34 4576 4581 4592 N
+ TH D D e n/a 34 4576 4581 4592 N
+ TH D DH e n/a 34 4576 4581 4596 N
+ TH D EH b n/a 34 4576 4581 4600 N
+ TH D EH e n/a 34 4576 4581 4600 N
+ TH D ER b n/a 34 4576 4581 4601 N
+ TH D ER e n/a 34 4576 4581 4601 N
+ TH D ER i n/a 34 4576 4581 4601 N
+ TH D EY b n/a 34 4576 4581 4600 N
+ TH D EY e n/a 34 4576 4581 4600 N
+ TH D F e n/a 34 4576 4581 4596 N
+ TH D G e n/a 34 4576 4581 4592 N
+ TH D HH e n/a 34 4576 4581 4596 N
+ TH D IH b n/a 34 4576 4581 4602 N
+ TH D IH e n/a 34 4576 4581 4604 N
+ TH D IY b n/a 34 4576 4581 4604 N
+ TH D IY e n/a 34 4576 4581 4604 N
+ TH D JH e n/a 34 4576 4581 4592 N
+ TH D K e n/a 34 4576 4581 4592 N
+ TH D L b n/a 34 4576 4582 4593 N
+ TH D L e n/a 34 4576 4582 4593 N
+ TH D M e n/a 34 4576 4581 4593 N
+ TH D N e n/a 34 4576 4581 4593 N
+ TH D NG e n/a 34 4576 4581 4593 N
+ TH D OW b n/a 34 4576 4581 4600 N
+ TH D OW e n/a 34 4576 4581 4600 N
+ TH D OY e n/a 34 4576 4581 4598 N
+ TH D P e n/a 34 4576 4581 4592 N
+ TH D R b n/a 34 4576 4582 4597 N
+ TH D R e n/a 34 4576 4582 4597 N
+ TH D R i n/a 34 4576 4582 4597 N
+ TH D S b n/a 34 4576 4581 4596 N
+ TH D S e n/a 34 4576 4581 4596 N
+ TH D S i n/a 34 4576 4581 4596 N
+ TH D SH e n/a 34 4576 4581 4596 N
+ TH D SIL e n/a 34 4576 4581 4591 N
+ TH D T e n/a 34 4576 4581 4592 N
+ TH D TH e n/a 34 4576 4581 4596 N
+ TH D UH b n/a 34 4576 4581 4602 N
+ TH D UH e n/a 34 4576 4581 4604 N
+ TH D UW b n/a 34 4576 4581 4604 N
+ TH D UW e n/a 34 4576 4581 4604 N
+ TH D V e n/a 34 4576 4581 4596 N
+ TH D W b n/a 34 4576 4581 4594 N
+ TH D W e n/a 34 4576 4581 4594 N
+ TH D W i n/a 34 4576 4581 4594 N
+ TH D Y b n/a 34 4576 4581 4593 N
+ TH D Y e n/a 34 4576 4581 4593 N
+ TH D Z e n/a 34 4576 4581 4596 N
+ TH D ZH e n/a 34 4576 4581 4596 N
+ TH DH AA b n/a 34 4574 4581 4598 N
+ TH DH AE b n/a 34 4574 4581 4600 N
+ TH DH AH b n/a 34 4574 4581 4598 N
+ TH DH AO b n/a 34 4574 4581 4598 N
+ TH DH AW b n/a 34 4574 4581 4599 N
+ TH DH AY b n/a 34 4574 4581 4598 N
+ TH DH EH b n/a 34 4574 4581 4600 N
+ TH DH ER b n/a 34 4574 4581 4601 N
+ TH DH EY b n/a 34 4574 4581 4600 N
+ TH DH IH b n/a 34 4574 4581 4602 N
+ TH DH IY b n/a 34 4574 4581 4604 N
+ TH DH L b n/a 34 4574 4582 4593 N
+ TH DH OW b n/a 34 4574 4581 4600 N
+ TH DH R b n/a 34 4574 4582 4597 N
+ TH DH S b n/a 34 4574 4581 4596 N
+ TH DH UH b n/a 34 4574 4581 4602 N
+ TH DH UW b n/a 34 4574 4581 4604 N
+ TH DH W b n/a 34 4574 4581 4594 N
+ TH DH Y b n/a 34 4574 4581 4593 N
+ TH EH AA b n/a 34 4573 4583 4598 N
+ TH EH AA e n/a 34 4569 4585 4598 N
+ TH EH AA i n/a 34 4569 4584 4598 N
+ TH EH AE b n/a 34 4573 4583 4600 N
+ TH EH AE e n/a 34 4569 4585 4600 N
+ TH EH AE i n/a 34 4569 4584 4600 N
+ TH EH AH b n/a 34 4573 4583 4598 N
+ TH EH AH e n/a 34 4569 4585 4600 N
+ TH EH AH i n/a 34 4569 4584 4600 N
+ TH EH AO b n/a 34 4573 4583 4598 N
+ TH EH AO e n/a 34 4569 4585 4598 N
+ TH EH AO i n/a 34 4569 4584 4598 N
+ TH EH AW b n/a 34 4573 4583 4599 N
+ TH EH AW e n/a 34 4569 4585 4599 N
+ TH EH AW i n/a 34 4569 4584 4599 N
+ TH EH AY b n/a 34 4573 4583 4598 N
+ TH EH AY e n/a 34 4569 4585 4598 N
+ TH EH AY i n/a 34 4569 4584 4598 N
+ TH EH B e n/a 34 4569 4585 4592 N
+ TH EH B i n/a 34 4569 4584 4592 N
+ TH EH CH e n/a 34 4569 4585 4592 N
+ TH EH D e n/a 34 4569 4585 4592 N
+ TH EH D i n/a 34 4569 4584 4592 N
+ TH EH DH e n/a 34 4569 4585 4596 N
+ TH EH EH b n/a 34 4573 4583 4600 N
+ TH EH EH e n/a 34 4569 4585 4600 N
+ TH EH EH i n/a 34 4569 4584 4600 N
+ TH EH ER b n/a 34 4573 4583 4601 N
+ TH EH ER e n/a 34 4569 4585 4601 N
+ TH EH ER i n/a 34 4569 4584 4601 N
+ TH EH EY b n/a 34 4573 4583 4600 N
+ TH EH EY e n/a 34 4569 4585 4600 N
+ TH EH EY i n/a 34 4569 4584 4600 N
+ TH EH F e n/a 34 4569 4585 4596 N
+ TH EH G e n/a 34 4569 4585 4592 N
+ TH EH HH e n/a 34 4569 4585 4596 N
+ TH EH IH b n/a 34 4573 4583 4602 N
+ TH EH IH e n/a 34 4569 4585 4604 N
+ TH EH IH i n/a 34 4569 4584 4602 N
+ TH EH IY b n/a 34 4573 4583 4604 N
+ TH EH IY e n/a 34 4569 4585 4604 N
+ TH EH IY i n/a 34 4569 4584 4604 N
+ TH EH JH e n/a 34 4569 4585 4592 N
+ TH EH K e n/a 34 4569 4585 4592 N
+ TH EH K i n/a 34 4569 4584 4592 N
+ TH EH L b n/a 34 4573 4583 4593 N
+ TH EH L e n/a 34 4569 4585 4593 N
+ TH EH L i n/a 34 4569 4584 4593 N
+ TH EH M e n/a 34 4569 4585 4593 N
+ TH EH M i n/a 34 4569 4584 4593 N
+ TH EH N e n/a 34 4569 4585 4593 N
+ TH EH N i n/a 34 4569 4584 4593 N
+ TH EH NG e n/a 34 4569 4585 4593 N
+ TH EH OW b n/a 34 4573 4583 4600 N
+ TH EH OW e n/a 34 4569 4585 4600 N
+ TH EH OW i n/a 34 4569 4584 4600 N
+ TH EH OY e n/a 34 4569 4585 4598 N
+ TH EH P e n/a 34 4569 4585 4592 N
+ TH EH P i n/a 34 4569 4584 4592 N
+ TH EH R b n/a 34 4573 4583 4597 N
+ TH EH R e n/a 34 4569 4585 4597 N
+ TH EH R i n/a 34 4569 4584 4597 N
+ TH EH S b n/a 34 4573 4583 4596 N
+ TH EH S e n/a 34 4569 4585 4596 N
+ TH EH S i n/a 34 4569 4584 4596 N
+ TH EH SH e n/a 34 4569 4585 4596 N
+ TH EH SH i n/a 34 4569 4584 4596 N
+ TH EH SIL e n/a 34 4569 4585 4591 N
+ TH EH T e n/a 34 4569 4585 4592 N
+ TH EH T i n/a 34 4569 4584 4592 N
+ TH EH TH e n/a 34 4569 4585 4596 N
+ TH EH UH b n/a 34 4573 4583 4602 N
+ TH EH UH e n/a 34 4569 4585 4604 N
+ TH EH UW b n/a 34 4573 4583 4604 N
+ TH EH UW e n/a 34 4569 4585 4604 N
+ TH EH UW i n/a 34 4569 4584 4604 N
+ TH EH V e n/a 34 4569 4585 4596 N
+ TH EH V i n/a 34 4569 4584 4596 N
+ TH EH W b n/a 34 4573 4583 4594 N
+ TH EH W e n/a 34 4569 4585 4594 N
+ TH EH W i n/a 34 4569 4584 4594 N
+ TH EH Y b n/a 34 4573 4583 4593 N
+ TH EH Y e n/a 34 4569 4585 4593 N
+ TH EH Y i n/a 34 4569 4584 4593 N
+ TH EH Z e n/a 34 4569 4585 4596 N
+ TH EH ZH e n/a 34 4569 4585 4596 N
+ TH ER AA b n/a 34 4571 4583 4598 N
+ TH ER AA e n/a 34 4571 4586 4598 N
+ TH ER AA i n/a 34 4571 4583 4598 N
+ TH ER AE b n/a 34 4571 4583 4600 N
+ TH ER AE e n/a 34 4571 4586 4600 N
+ TH ER AH b n/a 34 4571 4583 4598 N
+ TH ER AH e n/a 34 4571 4586 4600 N
+ TH ER AH i n/a 34 4571 4584 4600 N
+ TH ER AO b n/a 34 4571 4583 4598 N
+ TH ER AO e n/a 34 4571 4586 4598 N
+ TH ER AO i n/a 34 4571 4583 4598 N
+ TH ER AW b n/a 34 4571 4583 4599 N
+ TH ER AW e n/a 34 4571 4586 4599 N
+ TH ER AY b n/a 34 4571 4583 4598 N
+ TH ER AY e n/a 34 4571 4586 4598 N
+ TH ER B e n/a 34 4571 4586 4592 N
+ TH ER B i n/a 34 4571 4583 4592 N
+ TH ER CH e n/a 34 4571 4586 4592 N
+ TH ER D e n/a 34 4571 4586 4592 N
+ TH ER D i n/a 34 4571 4583 4592 N
+ TH ER DH e n/a 34 4571 4586 4596 N
+ TH ER EH b n/a 34 4571 4583 4600 N
+ TH ER EH e n/a 34 4571 4586 4600 N
+ TH ER ER b n/a 34 4571 4583 4601 N
+ TH ER ER e n/a 34 4571 4586 4601 N
+ TH ER ER i n/a 34 4571 4584 4601 N
+ TH ER EY b n/a 34 4571 4583 4600 N
+ TH ER EY e n/a 34 4571 4586 4600 N
+ TH ER F e n/a 34 4571 4586 4596 N
+ TH ER F i n/a 34 4571 4583 4596 N
+ TH ER G e n/a 34 4571 4586 4592 N
+ TH ER HH e n/a 34 4571 4586 4596 N
+ TH ER IH b n/a 34 4571 4583 4602 N
+ TH ER IH e n/a 34 4571 4586 4604 N
+ TH ER IH i n/a 34 4571 4584 4602 N
+ TH ER IY b n/a 34 4571 4583 4604 N
+ TH ER IY e n/a 34 4571 4586 4604 N
+ TH ER IY i n/a 34 4571 4583 4604 N
+ TH ER JH e n/a 34 4571 4586 4592 N
+ TH ER K e n/a 34 4571 4586 4592 N
+ TH ER K i n/a 34 4571 4583 4592 N
+ TH ER L b n/a 34 4571 4583 4593 N
+ TH ER L e n/a 34 4571 4586 4593 N
+ TH ER L i n/a 34 4571 4583 4593 N
+ TH ER M e n/a 34 4571 4586 4593 N
+ TH ER M i n/a 34 4571 4583 4593 N
+ TH ER N e n/a 34 4571 4586 4593 N
+ TH ER N i n/a 34 4571 4583 4593 N
+ TH ER NG e n/a 34 4571 4586 4593 N
+ TH ER OW b n/a 34 4571 4583 4600 N
+ TH ER OW e n/a 34 4571 4586 4600 N
+ TH ER OW i n/a 34 4571 4583 4600 N
+ TH ER OY e n/a 34 4571 4586 4598 N
+ TH ER P e n/a 34 4571 4586 4592 N
+ TH ER P i n/a 34 4571 4583 4592 N
+ TH ER R b n/a 34 4571 4583 4597 N
+ TH ER R e n/a 34 4571 4586 4597 N
+ TH ER R i n/a 34 4571 4583 4597 N
+ TH ER S b n/a 34 4571 4583 4596 N
+ TH ER S e n/a 34 4571 4586 4596 N
+ TH ER S i n/a 34 4571 4583 4596 N
+ TH ER SH e n/a 34 4571 4586 4596 N
+ TH ER SH i n/a 34 4571 4583 4596 N
+ TH ER SIL e n/a 34 4571 4586 4591 N
+ TH ER T e n/a 34 4571 4586 4592 N
+ TH ER T i n/a 34 4571 4583 4592 N
+ TH ER TH e n/a 34 4571 4586 4596 N
+ TH ER UH b n/a 34 4571 4583 4602 N
+ TH ER UH e n/a 34 4571 4586 4604 N
+ TH ER UW b n/a 34 4571 4583 4604 N
+ TH ER UW e n/a 34 4571 4586 4604 N
+ TH ER V e n/a 34 4571 4586 4596 N
+ TH ER W b n/a 34 4571 4583 4594 N
+ TH ER W e n/a 34 4571 4586 4594 N
+ TH ER W i n/a 34 4571 4583 4594 N
+ TH ER Y b n/a 34 4571 4583 4593 N
+ TH ER Y e n/a 34 4571 4586 4593 N
+ TH ER Z e n/a 34 4571 4586 4596 N
+ TH ER ZH e n/a 34 4571 4586 4596 N
+ TH EY AA b n/a 34 4572 4583 4598 N
+ TH EY AA e n/a 34 4572 4586 4598 N
+ TH EY AA i n/a 34 4572 4584 4598 N
+ TH EY AE b n/a 34 4572 4583 4600 N
+ TH EY AE e n/a 34 4572 4586 4600 N
+ TH EY AE i n/a 34 4572 4584 4600 N
+ TH EY AH b n/a 34 4572 4583 4598 N
+ TH EY AH e n/a 34 4572 4586 4600 N
+ TH EY AH i n/a 34 4572 4584 4600 N
+ TH EY AO b n/a 34 4572 4583 4598 N
+ TH EY AO e n/a 34 4572 4586 4598 N
+ TH EY AW b n/a 34 4572 4583 4599 N
+ TH EY AW e n/a 34 4572 4586 4599 N
+ TH EY AY b n/a 34 4572 4583 4598 N
+ TH EY AY e n/a 34 4572 4586 4598 N
+ TH EY B e n/a 34 4572 4586 4592 N
+ TH EY CH e n/a 34 4572 4586 4592 N
+ TH EY D e n/a 34 4572 4586 4592 N
+ TH EY DH e n/a 34 4572 4586 4596 N
+ TH EY EH b n/a 34 4572 4583 4600 N
+ TH EY EH e n/a 34 4572 4586 4600 N
+ TH EY ER b n/a 34 4572 4583 4601 N
+ TH EY ER e n/a 34 4572 4586 4601 N
+ TH EY ER i n/a 34 4572 4584 4601 N
+ TH EY EY b n/a 34 4572 4583 4600 N
+ TH EY EY e n/a 34 4572 4586 4600 N
+ TH EY F e n/a 34 4572 4586 4596 N
+ TH EY F i n/a 34 4572 4584 4596 N
+ TH EY G e n/a 34 4572 4586 4592 N
+ TH EY HH e n/a 34 4572 4586 4596 N
+ TH EY IH b n/a 34 4572 4583 4602 N
+ TH EY IH e n/a 34 4572 4586 4604 N
+ TH EY IH i n/a 34 4572 4584 4602 N
+ TH EY IY b n/a 34 4572 4583 4604 N
+ TH EY IY e n/a 34 4572 4586 4604 N
+ TH EY IY i n/a 34 4572 4584 4604 N
+ TH EY JH e n/a 34 4572 4586 4592 N
+ TH EY K e n/a 34 4572 4586 4592 N
+ TH EY K i n/a 34 4572 4584 4592 N
+ TH EY L b n/a 34 4572 4583 4593 N
+ TH EY L e n/a 34 4572 4586 4593 N
+ TH EY L i n/a 34 4572 4584 4593 N
+ TH EY M e n/a 34 4572 4586 4593 N
+ TH EY N e n/a 34 4572 4586 4593 N
+ TH EY N i n/a 34 4572 4584 4593 N
+ TH EY NG e n/a 34 4572 4586 4593 N
+ TH EY OW b n/a 34 4572 4583 4600 N
+ TH EY OW e n/a 34 4572 4586 4600 N
+ TH EY OY e n/a 34 4572 4586 4598 N
+ TH EY P e n/a 34 4572 4586 4592 N
+ TH EY R b n/a 34 4572 4583 4597 N
+ TH EY R e n/a 34 4572 4586 4597 N
+ TH EY R i n/a 34 4572 4584 4597 N
+ TH EY S b n/a 34 4572 4583 4596 N
+ TH EY S e n/a 34 4572 4586 4596 N
+ TH EY S i n/a 34 4572 4584 4596 N
+ TH EY SH e n/a 34 4572 4586 4596 N
+ TH EY SIL e n/a 34 4572 4586 4591 N
+ TH EY T e n/a 34 4572 4586 4592 N
+ TH EY T i n/a 34 4572 4584 4592 N
+ TH EY TH e n/a 34 4572 4586 4596 N
+ TH EY UH b n/a 34 4572 4583 4602 N
+ TH EY UH e n/a 34 4572 4586 4604 N
+ TH EY UW b n/a 34 4572 4583 4604 N
+ TH EY UW e n/a 34 4572 4586 4604 N
+ TH EY V e n/a 34 4572 4586 4596 N
+ TH EY W b n/a 34 4572 4583 4594 N
+ TH EY W e n/a 34 4572 4586 4594 N
+ TH EY W i n/a 34 4572 4584 4594 N
+ TH EY Y b n/a 34 4572 4583 4593 N
+ TH EY Y e n/a 34 4572 4586 4593 N
+ TH EY Z e n/a 34 4572 4586 4596 N
+ TH EY ZH e n/a 34 4572 4586 4596 N
+ TH F AA b n/a 34 4574 4581 4598 N
+ TH F AA e n/a 34 4574 4581 4598 N
+ TH F AE b n/a 34 4574 4581 4600 N
+ TH F AE e n/a 34 4574 4581 4600 N
+ TH F AE i n/a 34 4574 4581 4600 N
+ TH F AH b n/a 34 4574 4581 4598 N
+ TH F AH e n/a 34 4574 4581 4600 N
+ TH F AH i n/a 34 4574 4581 4600 N
+ TH F AO b n/a 34 4574 4581 4598 N
+ TH F AO e n/a 34 4574 4581 4598 N
+ TH F AO i n/a 34 4574 4581 4598 N
+ TH F AW b n/a 34 4574 4581 4599 N
+ TH F AW e n/a 34 4574 4581 4599 N
+ TH F AY b n/a 34 4574 4581 4598 N
+ TH F AY e n/a 34 4574 4581 4598 N
+ TH F AY i n/a 34 4574 4581 4598 N
+ TH F B e n/a 34 4574 4581 4592 N
+ TH F CH e n/a 34 4574 4581 4592 N
+ TH F D e n/a 34 4574 4581 4592 N
+ TH F DH e n/a 34 4574 4581 4596 N
+ TH F EH b n/a 34 4574 4581 4600 N
+ TH F EH e n/a 34 4574 4581 4600 N
+ TH F EH i n/a 34 4574 4581 4600 N
+ TH F ER b n/a 34 4574 4581 4601 N
+ TH F ER e n/a 34 4574 4581 4601 N
+ TH F EY b n/a 34 4574 4581 4600 N
+ TH F EY e n/a 34 4574 4581 4600 N
+ TH F EY i n/a 34 4574 4581 4600 N
+ TH F F e n/a 34 4574 4581 4596 N
+ TH F G e n/a 34 4574 4581 4592 N
+ TH F HH e n/a 34 4574 4581 4596 N
+ TH F IH b n/a 34 4574 4581 4602 N
+ TH F IH e n/a 34 4574 4581 4604 N
+ TH F IH i n/a 34 4574 4581 4602 N
+ TH F IY b n/a 34 4574 4581 4604 N
+ TH F IY e n/a 34 4574 4581 4604 N
+ TH F IY i n/a 34 4574 4581 4604 N
+ TH F JH e n/a 34 4574 4581 4592 N
+ TH F K e n/a 34 4574 4581 4592 N
+ TH F L b n/a 34 4574 4582 4593 N
+ TH F L e n/a 34 4574 4582 4593 N
+ TH F L i n/a 34 4574 4582 4593 N
+ TH F M e n/a 34 4574 4581 4593 N
+ TH F N e n/a 34 4574 4581 4593 N
+ TH F NG e n/a 34 4574 4581 4593 N
+ TH F OW b n/a 34 4574 4581 4600 N
+ TH F OW e n/a 34 4574 4581 4600 N
+ TH F OY e n/a 34 4574 4581 4598 N
+ TH F P e n/a 34 4574 4581 4592 N
+ TH F R b n/a 34 4574 4582 4597 N
+ TH F R e n/a 34 4574 4582 4597 N
+ TH F R i n/a 34 4574 4582 4597 N
+ TH F S b n/a 34 4574 4581 4596 N
+ TH F S e n/a 34 4574 4581 4596 N
+ TH F S i n/a 34 4574 4581 4596 N
+ TH F SH e n/a 34 4574 4581 4596 N
+ TH F SIL e n/a 34 4574 4581 4591 N
+ TH F T e n/a 34 4574 4581 4592 N
+ TH F TH e n/a 34 4574 4581 4596 N
+ TH F UH b n/a 34 4574 4581 4602 N
+ TH F UH e n/a 34 4574 4581 4604 N
+ TH F UW b n/a 34 4574 4581 4604 N
+ TH F UW e n/a 34 4574 4581 4604 N
+ TH F V e n/a 34 4574 4581 4596 N
+ TH F W b n/a 34 4574 4581 4594 N
+ TH F W e n/a 34 4574 4581 4594 N
+ TH F Y b n/a 34 4574 4581 4593 N
+ TH F Y e n/a 34 4574 4581 4593 N
+ TH F Z e n/a 34 4574 4581 4596 N
+ TH F ZH e n/a 34 4574 4581 4596 N
+ TH G AA b n/a 34 4574 4581 4598 N
+ TH G AE b n/a 34 4574 4581 4600 N
+ TH G AH b n/a 34 4574 4581 4598 N
+ TH G AO b n/a 34 4574 4581 4598 N
+ TH G AO i n/a 34 4574 4581 4598 N
+ TH G AW b n/a 34 4574 4581 4599 N
+ TH G AY b n/a 34 4574 4581 4598 N
+ TH G EH b n/a 34 4574 4581 4600 N
+ TH G ER b n/a 34 4574 4581 4601 N
+ TH G EY b n/a 34 4574 4581 4600 N
+ TH G IH b n/a 34 4574 4581 4602 N
+ TH G IY b n/a 34 4574 4581 4604 N
+ TH G L b n/a 34 4574 4582 4593 N
+ TH G OW b n/a 34 4574 4581 4600 N
+ TH G OW i n/a 34 4574 4581 4600 N
+ TH G R b n/a 34 4574 4582 4597 N
+ TH G S b n/a 34 4574 4581 4596 N
+ TH G UH b n/a 34 4574 4581 4602 N
+ TH G UW b n/a 34 4574 4581 4604 N
+ TH G W b n/a 34 4574 4581 4594 N
+ TH G Y b n/a 34 4574 4581 4593 N
+ TH HH AA b n/a 34 4574 4581 4598 N
+ TH HH AE b n/a 34 4574 4581 4600 N
+ TH HH AH b n/a 34 4574 4581 4598 N
+ TH HH AO b n/a 34 4574 4581 4598 N
+ TH HH AW b n/a 34 4574 4581 4599 N
+ TH HH AY b n/a 34 4574 4581 4598 N
+ TH HH EH b n/a 34 4574 4581 4600 N
+ TH HH ER b n/a 34 4574 4581 4601 N
+ TH HH EY b n/a 34 4574 4581 4600 N
+ TH HH IH b n/a 34 4574 4581 4602 N
+ TH HH IY b n/a 34 4574 4581 4604 N
+ TH HH L b n/a 34 4574 4582 4593 N
+ TH HH OW b n/a 34 4574 4581 4600 N
+ TH HH R b n/a 34 4574 4582 4597 N
+ TH HH S b n/a 34 4574 4581 4596 N
+ TH HH UH b n/a 34 4574 4581 4602 N
+ TH HH UW b n/a 34 4574 4581 4604 N
+ TH HH W b n/a 34 4574 4581 4594 N
+ TH HH Y b n/a 34 4574 4581 4593 N
+ TH IH AA b n/a 34 4573 4589 4598 N
+ TH IH AA e n/a 34 4573 4589 4598 N
+ TH IH AA i n/a 34 4573 4589 4598 N
+ TH IH AE b n/a 34 4573 4589 4600 N
+ TH IH AE e n/a 34 4573 4589 4600 N
+ TH IH AE i n/a 34 4573 4589 4600 N
+ TH IH AH b n/a 34 4573 4589 4598 N
+ TH IH AH e n/a 34 4573 4589 4600 N
+ TH IH AH i n/a 34 4573 4589 4600 N
+ TH IH AO b n/a 34 4573 4589 4598 N
+ TH IH AO e n/a 34 4573 4589 4598 N
+ TH IH AO i n/a 34 4573 4589 4598 N
+ TH IH AW b n/a 34 4573 4589 4599 N
+ TH IH AW e n/a 34 4573 4589 4599 N
+ TH IH AW i n/a 34 4573 4589 4599 N
+ TH IH AY b n/a 34 4573 4589 4598 N
+ TH IH AY e n/a 34 4573 4589 4598 N
+ TH IH AY i n/a 34 4573 4589 4598 N
+ TH IH B e n/a 34 4573 4587 4592 N
+ TH IH B i n/a 34 4573 4587 4592 N
+ TH IH CH e n/a 34 4573 4587 4592 N
+ TH IH D e n/a 34 4573 4587 4592 N
+ TH IH D i n/a 34 4573 4587 4592 N
+ TH IH DH e n/a 34 4573 4588 4595 N
+ TH IH EH b n/a 34 4573 4589 4600 N
+ TH IH EH e n/a 34 4573 4589 4600 N
+ TH IH EH i n/a 34 4573 4589 4600 N
+ TH IH ER b n/a 34 4573 4589 4601 N
+ TH IH ER e n/a 34 4573 4589 4601 N
+ TH IH ER i n/a 34 4573 4589 4601 N
+ TH IH EY b n/a 34 4573 4589 4600 N
+ TH IH EY e n/a 34 4573 4589 4600 N
+ TH IH EY i n/a 34 4573 4589 4600 N
+ TH IH F e n/a 34 4573 4587 4596 N
+ TH IH F i n/a 34 4573 4587 4596 N
+ TH IH G e n/a 34 4573 4587 4592 N
+ TH IH G i n/a 34 4573 4587 4592 N
+ TH IH HH e n/a 34 4573 4589 4596 N
+ TH IH HH i n/a 34 4573 4589 4596 N
+ TH IH IH b n/a 34 4573 4589 4603 N
+ TH IH IH e n/a 34 4573 4589 4603 N
+ TH IH IH i n/a 34 4573 4589 4603 N
+ TH IH IY b n/a 34 4573 4589 4604 N
+ TH IH IY e n/a 34 4573 4589 4604 N
+ TH IH IY i n/a 34 4573 4589 4604 N
+ TH IH JH e n/a 34 4573 4587 4592 N
+ TH IH K e n/a 34 4573 4587 4592 N
+ TH IH K i n/a 34 4573 4587 4592 N
+ TH IH L b n/a 34 4573 4587 4593 N
+ TH IH L e n/a 34 4573 4587 4593 N
+ TH IH M e n/a 34 4573 4587 4593 N
+ TH IH M i n/a 34 4573 4587 4593 N
+ TH IH N e n/a 34 4573 4587 4593 N
+ TH IH N i n/a 34 4573 4587 4593 N
+ TH IH NG e n/a 34 4573 4587 4593 N
+ TH IH OW b n/a 34 4573 4589 4600 N
+ TH IH OW e n/a 34 4573 4589 4600 N
+ TH IH OW i n/a 34 4573 4589 4600 N
+ TH IH OY e n/a 34 4573 4589 4598 N
+ TH IH P e n/a 34 4573 4587 4592 N
+ TH IH R b n/a 34 4573 4587 4597 N
+ TH IH R e n/a 34 4573 4587 4597 N
+ TH IH R i n/a 34 4573 4587 4597 N
+ TH IH S b n/a 34 4573 4587 4596 N
+ TH IH S e n/a 34 4573 4587 4596 N
+ TH IH S i n/a 34 4573 4587 4596 N
+ TH IH SH e n/a 34 4573 4587 4596 N
+ TH IH SIL e n/a 34 4573 4587 4592 N
+ TH IH T e n/a 34 4573 4587 4592 N
+ TH IH T i n/a 34 4573 4587 4592 N
+ TH IH TH e n/a 34 4573 4588 4596 N
+ TH IH UH b n/a 34 4573 4589 4603 N
+ TH IH UH e n/a 34 4573 4589 4603 N
+ TH IH UH i n/a 34 4573 4589 4603 N
+ TH IH UW b n/a 34 4573 4589 4604 N
+ TH IH UW e n/a 34 4573 4589 4604 N
+ TH IH V e n/a 34 4573 4587 4596 N
+ TH IH V i n/a 34 4573 4587 4596 N
+ TH IH W b n/a 34 4573 4587 4594 N
+ TH IH W e n/a 34 4573 4587 4594 N
+ TH IH W i n/a 34 4573 4587 4594 N
+ TH IH Y b n/a 34 4573 4587 4593 N
+ TH IH Y e n/a 34 4573 4587 4593 N
+ TH IH Y i n/a 34 4573 4587 4593 N
+ TH IH Z e n/a 34 4573 4587 4595 N
+ TH IH ZH e n/a 34 4573 4587 4596 N
+ TH IY AA b n/a 34 4578 4590 4598 N
+ TH IY AA e n/a 34 4578 4590 4598 N
+ TH IY AA i n/a 34 4578 4590 4598 N
+ TH IY AE b n/a 34 4578 4590 4600 N
+ TH IY AE e n/a 34 4578 4590 4600 N
+ TH IY AE i n/a 34 4578 4590 4600 N
+ TH IY AH b n/a 34 4578 4590 4598 N
+ TH IY AH e n/a 34 4578 4590 4600 N
+ TH IY AH i n/a 34 4578 4590 4600 N
+ TH IY AO b n/a 34 4578 4590 4598 N
+ TH IY AO e n/a 34 4578 4590 4598 N
+ TH IY AO i n/a 34 4578 4590 4598 N
+ TH IY AW b n/a 34 4578 4590 4599 N
+ TH IY AW e n/a 34 4578 4590 4599 N
+ TH IY AY b n/a 34 4578 4590 4598 N
+ TH IY AY e n/a 34 4578 4590 4598 N
+ TH IY B e n/a 34 4578 4590 4592 N
+ TH IY B i n/a 34 4578 4590 4592 N
+ TH IY CH e n/a 34 4578 4590 4592 N
+ TH IY D e n/a 34 4578 4590 4592 N
+ TH IY D i n/a 34 4578 4590 4592 N
+ TH IY DH e n/a 34 4578 4590 4595 N
+ TH IY EH b n/a 34 4578 4590 4600 N
+ TH IY EH e n/a 34 4578 4590 4600 N
+ TH IY EH i n/a 34 4578 4590 4600 N
+ TH IY ER b n/a 34 4578 4590 4601 N
+ TH IY ER e n/a 34 4578 4590 4601 N
+ TH IY ER i n/a 34 4578 4590 4601 N
+ TH IY EY b n/a 34 4578 4590 4600 N
+ TH IY EY e n/a 34 4578 4590 4600 N
+ TH IY F e n/a 34 4578 4590 4596 N
+ TH IY G e n/a 34 4578 4590 4592 N
+ TH IY HH e n/a 34 4578 4590 4596 N
+ TH IY IH b n/a 34 4578 4590 4603 N
+ TH IY IH e n/a 34 4578 4590 4603 N
+ TH IY IH i n/a 34 4578 4590 4603 N
+ TH IY IY b n/a 34 4578 4590 4604 N
+ TH IY IY e n/a 34 4578 4590 4604 N
+ TH IY IY i n/a 34 4578 4590 4604 N
+ TH IY JH e n/a 34 4578 4590 4592 N
+ TH IY K e n/a 34 4578 4590 4592 N
+ TH IY L b n/a 34 4578 4590 4593 N
+ TH IY L e n/a 34 4578 4590 4593 N
+ TH IY L i n/a 34 4578 4590 4593 N
+ TH IY M e n/a 34 4578 4590 4593 N
+ TH IY M i n/a 34 4578 4590 4593 N
+ TH IY N e n/a 34 4578 4590 4593 N
+ TH IY N i n/a 34 4578 4590 4593 N
+ TH IY NG e n/a 34 4578 4590 4593 N
+ TH IY OW b n/a 34 4578 4590 4600 N
+ TH IY OW e n/a 34 4578 4590 4600 N
+ TH IY OY e n/a 34 4578 4590 4598 N
+ TH IY P e n/a 34 4578 4590 4592 N
+ TH IY R b n/a 34 4578 4590 4597 N
+ TH IY R e n/a 34 4578 4590 4597 N
+ TH IY R i n/a 34 4578 4590 4597 N
+ TH IY S b n/a 34 4578 4590 4596 N
+ TH IY S e n/a 34 4578 4590 4596 N
+ TH IY S i n/a 34 4578 4590 4596 N
+ TH IY SH e n/a 34 4578 4590 4596 N
+ TH IY SIL e n/a 34 4578 4590 4591 N
+ TH IY T e n/a 34 4578 4590 4592 N
+ TH IY T i n/a 34 4578 4590 4592 N
+ TH IY TH e n/a 34 4578 4590 4596 N
+ TH IY UH b n/a 34 4578 4590 4603 N
+ TH IY UH e n/a 34 4578 4590 4603 N
+ TH IY UW b n/a 34 4578 4590 4604 N
+ TH IY UW e n/a 34 4578 4590 4604 N
+ TH IY V e n/a 34 4578 4590 4596 N
+ TH IY W b n/a 34 4578 4590 4594 N
+ TH IY W e n/a 34 4578 4590 4594 N
+ TH IY W i n/a 34 4578 4590 4594 N
+ TH IY Y b n/a 34 4578 4590 4593 N
+ TH IY Y e n/a 34 4578 4590 4593 N
+ TH IY Z e n/a 34 4578 4590 4595 N
+ TH IY ZH e n/a 34 4578 4590 4596 N
+ TH JH AA b n/a 34 4574 4581 4598 N
+ TH JH AE b n/a 34 4574 4581 4600 N
+ TH JH AH b n/a 34 4574 4581 4598 N
+ TH JH AO b n/a 34 4574 4581 4598 N
+ TH JH AW b n/a 34 4574 4581 4599 N
+ TH JH AY b n/a 34 4574 4581 4598 N
+ TH JH EH b n/a 34 4574 4581 4600 N
+ TH JH ER b n/a 34 4574 4581 4601 N
+ TH JH EY b n/a 34 4574 4581 4600 N
+ TH JH IH b n/a 34 4574 4581 4602 N
+ TH JH IY b n/a 34 4574 4581 4604 N
+ TH JH L b n/a 34 4574 4582 4593 N
+ TH JH OW b n/a 34 4574 4581 4600 N
+ TH JH R b n/a 34 4574 4582 4597 N
+ TH JH S b n/a 34 4574 4581 4596 N
+ TH JH UH b n/a 34 4574 4581 4602 N
+ TH JH UW b n/a 34 4574 4581 4604 N
+ TH JH W b n/a 34 4574 4581 4594 N
+ TH JH Y b n/a 34 4574 4581 4593 N
+ TH K AA b n/a 34 4574 4581 4598 N
+ TH K AA e n/a 34 4574 4581 4598 N
+ TH K AE b n/a 34 4574 4581 4600 N
+ TH K AE e n/a 34 4574 4581 4600 N
+ TH K AH b n/a 34 4574 4581 4598 N
+ TH K AH e n/a 34 4574 4581 4600 N
+ TH K AH i n/a 34 4574 4581 4600 N
+ TH K AO b n/a 34 4574 4581 4598 N
+ TH K AO e n/a 34 4574 4581 4598 N
+ TH K AO i n/a 34 4574 4581 4598 N
+ TH K AW b n/a 34 4574 4581 4599 N
+ TH K AW e n/a 34 4574 4581 4599 N
+ TH K AY b n/a 34 4574 4581 4598 N
+ TH K AY e n/a 34 4574 4581 4598 N
+ TH K B e n/a 34 4574 4581 4592 N
+ TH K CH e n/a 34 4574 4581 4592 N
+ TH K D e n/a 34 4574 4581 4592 N
+ TH K DH e n/a 34 4574 4581 4596 N
+ TH K EH b n/a 34 4574 4581 4600 N
+ TH K EH e n/a 34 4574 4581 4600 N
+ TH K ER b n/a 34 4574 4581 4601 N
+ TH K ER e n/a 34 4574 4581 4601 N
+ TH K ER i n/a 34 4574 4581 4601 N
+ TH K EY b n/a 34 4574 4581 4600 N
+ TH K EY e n/a 34 4574 4581 4600 N
+ TH K F e n/a 34 4574 4581 4596 N
+ TH K G e n/a 34 4574 4581 4592 N
+ TH K HH e n/a 34 4574 4581 4596 N
+ TH K IH b n/a 34 4574 4581 4602 N
+ TH K IH e n/a 34 4574 4581 4604 N
+ TH K IY b n/a 34 4574 4581 4604 N
+ TH K IY e n/a 34 4574 4581 4604 N
+ TH K IY i n/a 34 4574 4581 4604 N
+ TH K JH e n/a 34 4574 4581 4592 N
+ TH K K e n/a 34 4574 4581 4592 N
+ TH K L b n/a 34 4574 4582 4593 N
+ TH K L e n/a 34 4574 4582 4593 N
+ TH K M e n/a 34 4574 4581 4593 N
+ TH K N e n/a 34 4574 4581 4593 N
+ TH K NG e n/a 34 4574 4581 4593 N
+ TH K OW b n/a 34 4574 4581 4600 N
+ TH K OW e n/a 34 4574 4581 4600 N
+ TH K OW i n/a 34 4574 4581 4600 N
+ TH K OY e n/a 34 4574 4581 4598 N
+ TH K P e n/a 34 4574 4581 4592 N
+ TH K R b n/a 34 4574 4582 4597 N
+ TH K R e n/a 34 4574 4582 4597 N
+ TH K R i n/a 34 4574 4582 4597 N
+ TH K S b n/a 34 4574 4581 4596 N
+ TH K S e n/a 34 4574 4581 4596 N
+ TH K S i n/a 34 4574 4581 4596 N
+ TH K SH e n/a 34 4574 4581 4596 N
+ TH K SIL e n/a 34 4574 4581 4591 N
+ TH K T e n/a 34 4574 4581 4592 N
+ TH K TH e n/a 34 4574 4581 4596 N
+ TH K UH b n/a 34 4574 4581 4602 N
+ TH K UH e n/a 34 4574 4581 4604 N
+ TH K UW b n/a 34 4574 4581 4604 N
+ TH K UW e n/a 34 4574 4581 4604 N
+ TH K V e n/a 34 4574 4581 4596 N
+ TH K W b n/a 34 4574 4581 4594 N
+ TH K W e n/a 34 4574 4581 4594 N
+ TH K Y b n/a 34 4574 4581 4593 N
+ TH K Y e n/a 34 4574 4581 4593 N
+ TH K Z e n/a 34 4574 4581 4596 N
+ TH K ZH e n/a 34 4574 4581 4596 N
+ TH L AA b n/a 34 4570 4583 4598 N
+ TH L AA e n/a 34 4570 4585 4598 N
+ TH L AA i n/a 34 4570 4584 4598 N
+ TH L AE b n/a 34 4570 4583 4600 N
+ TH L AE e n/a 34 4570 4585 4600 N
+ TH L AH b n/a 34 4570 4583 4598 N
+ TH L AH e n/a 34 4570 4585 4600 N
+ TH L AH i n/a 34 4570 4584 4600 N
+ TH L AO b n/a 34 4570 4583 4598 N
+ TH L AO e n/a 34 4570 4585 4598 N
+ TH L AO i n/a 34 4570 4584 4598 N
+ TH L AW b n/a 34 4570 4583 4599 N
+ TH L AW e n/a 34 4570 4585 4599 N
+ TH L AY b n/a 34 4570 4583 4598 N
+ TH L AY e n/a 34 4570 4585 4598 N
+ TH L AY i n/a 34 4570 4584 4598 N
+ TH L B e n/a 34 4570 4585 4592 N
+ TH L CH e n/a 34 4570 4585 4592 N
+ TH L D e n/a 34 4570 4585 4592 N
+ TH L D i n/a 34 4570 4584 4592 N
+ TH L DH e n/a 34 4570 4585 4596 N
+ TH L EH b n/a 34 4570 4583 4600 N
+ TH L EH e n/a 34 4570 4585 4600 N
+ TH L EH i n/a 34 4570 4584 4600 N
+ TH L ER b n/a 34 4570 4583 4601 N
+ TH L ER e n/a 34 4570 4585 4601 N
+ TH L ER i n/a 34 4570 4584 4601 N
+ TH L EY b n/a 34 4570 4583 4600 N
+ TH L EY e n/a 34 4570 4585 4600 N
+ TH L EY i n/a 34 4570 4584 4600 N
+ TH L F e n/a 34 4570 4585 4596 N
+ TH L F i n/a 34 4570 4584 4596 N
+ TH L G e n/a 34 4570 4585 4592 N
+ TH L HH e n/a 34 4570 4585 4596 N
+ TH L IH b n/a 34 4570 4583 4602 N
+ TH L IH e n/a 34 4570 4585 4604 N
+ TH L IH i n/a 34 4570 4584 4602 N
+ TH L IY b n/a 34 4570 4583 4604 N
+ TH L IY e n/a 34 4570 4585 4604 N
+ TH L IY i n/a 34 4570 4584 4604 N
+ TH L JH e n/a 34 4570 4585 4592 N
+ TH L K e n/a 34 4570 4585 4592 N
+ TH L K i n/a 34 4570 4584 4592 N
+ TH L L b n/a 34 4570 4583 4593 N
+ TH L L e n/a 34 4570 4585 4593 N
+ TH L M e n/a 34 4570 4585 4593 N
+ TH L N e n/a 34 4570 4585 4593 N
+ TH L NG e n/a 34 4570 4585 4593 N
+ TH L OW b n/a 34 4570 4583 4600 N
+ TH L OW e n/a 34 4570 4585 4600 N
+ TH L OW i n/a 34 4570 4584 4600 N
+ TH L OY e n/a 34 4570 4585 4598 N
+ TH L P e n/a 34 4570 4585 4592 N
+ TH L R b n/a 34 4570 4583 4597 N
+ TH L R e n/a 34 4570 4585 4597 N
+ TH L R i n/a 34 4570 4584 4597 N
+ TH L S b n/a 34 4570 4583 4596 N
+ TH L S e n/a 34 4570 4585 4596 N
+ TH L S i n/a 34 4570 4584 4596 N
+ TH L SH e n/a 34 4570 4585 4596 N
+ TH L SIL e n/a 34 4570 4585 4591 N
+ TH L T e n/a 34 4570 4585 4592 N
+ TH L T i n/a 34 4570 4584 4592 N
+ TH L TH e n/a 34 4570 4585 4596 N
+ TH L UH b n/a 34 4570 4583 4602 N
+ TH L UH e n/a 34 4570 4585 4604 N
+ TH L UW b n/a 34 4570 4583 4604 N
+ TH L UW e n/a 34 4570 4585 4604 N
+ TH L UW i n/a 34 4570 4584 4604 N
+ TH L V e n/a 34 4570 4585 4596 N
+ TH L V i n/a 34 4570 4584 4596 N
+ TH L W b n/a 34 4570 4583 4594 N
+ TH L W e n/a 34 4570 4585 4594 N
+ TH L W i n/a 34 4570 4584 4594 N
+ TH L Y b n/a 34 4570 4583 4593 N
+ TH L Y e n/a 34 4570 4585 4593 N
+ TH L Y i n/a 34 4570 4584 4593 N
+ TH L Z e n/a 34 4570 4585 4596 N
+ TH L ZH e n/a 34 4570 4585 4596 N
+ TH M AA b n/a 34 4577 4581 4598 N
+ TH M AA e n/a 34 4577 4581 4598 N
+ TH M AE b n/a 34 4577 4581 4600 N
+ TH M AE e n/a 34 4577 4581 4600 N
+ TH M AH b n/a 34 4577 4581 4598 N
+ TH M AH e n/a 34 4577 4581 4600 N
+ TH M AH i n/a 34 4577 4580 4600 N
+ TH M AO b n/a 34 4577 4581 4598 N
+ TH M AO e n/a 34 4577 4581 4598 N
+ TH M AW b n/a 34 4577 4581 4599 N
+ TH M AW e n/a 34 4577 4581 4599 N
+ TH M AY b n/a 34 4577 4581 4598 N
+ TH M AY e n/a 34 4577 4581 4598 N
+ TH M B e n/a 34 4577 4581 4592 N
+ TH M CH e n/a 34 4577 4581 4592 N
+ TH M D e n/a 34 4577 4581 4592 N
+ TH M DH e n/a 34 4577 4581 4596 N
+ TH M EH b n/a 34 4577 4581 4600 N
+ TH M EH e n/a 34 4577 4581 4600 N
+ TH M ER b n/a 34 4577 4581 4601 N
+ TH M ER e n/a 34 4577 4581 4601 N
+ TH M EY b n/a 34 4577 4581 4600 N
+ TH M EY e n/a 34 4577 4581 4600 N
+ TH M F e n/a 34 4577 4581 4596 N
+ TH M G e n/a 34 4577 4581 4592 N
+ TH M HH e n/a 34 4577 4581 4596 N
+ TH M IH b n/a 34 4577 4581 4602 N
+ TH M IH e n/a 34 4577 4581 4604 N
+ TH M IH i n/a 34 4577 4580 4602 N
+ TH M IY b n/a 34 4577 4581 4604 N
+ TH M IY e n/a 34 4577 4581 4604 N
+ TH M JH e n/a 34 4577 4581 4592 N
+ TH M K e n/a 34 4577 4581 4592 N
+ TH M L b n/a 34 4577 4582 4593 N
+ TH M L e n/a 34 4577 4582 4593 N
+ TH M M e n/a 34 4577 4581 4593 N
+ TH M N e n/a 34 4577 4581 4593 N
+ TH M NG e n/a 34 4577 4581 4593 N
+ TH M OW b n/a 34 4577 4581 4600 N
+ TH M OW e n/a 34 4577 4581 4600 N
+ TH M OY e n/a 34 4577 4581 4598 N
+ TH M P e n/a 34 4577 4581 4592 N
+ TH M R b n/a 34 4577 4582 4597 N
+ TH M R e n/a 34 4577 4582 4597 N
+ TH M R i n/a 34 4577 4580 4597 N
+ TH M S b n/a 34 4577 4581 4596 N
+ TH M S e n/a 34 4577 4581 4596 N
+ TH M SH e n/a 34 4577 4581 4596 N
+ TH M SIL e n/a 34 4577 4581 4591 N
+ TH M T e n/a 34 4577 4581 4592 N
+ TH M TH e n/a 34 4577 4581 4596 N
+ TH M UH b n/a 34 4577 4581 4602 N
+ TH M UH e n/a 34 4577 4581 4604 N
+ TH M UW b n/a 34 4577 4581 4604 N
+ TH M UW e n/a 34 4577 4581 4604 N
+ TH M V e n/a 34 4577 4581 4596 N
+ TH M W b n/a 34 4577 4581 4594 N
+ TH M W e n/a 34 4577 4581 4594 N
+ TH M Y b n/a 34 4577 4581 4593 N
+ TH M Y e n/a 34 4577 4581 4593 N
+ TH M Z e n/a 34 4577 4581 4596 N
+ TH M ZH e n/a 34 4577 4581 4596 N
+ TH N AA b n/a 34 4577 4581 4598 N
+ TH N AA e n/a 34 4577 4581 4598 N
+ TH N AA i n/a 34 4577 4580 4598 N
+ TH N AE b n/a 34 4577 4581 4600 N
+ TH N AE e n/a 34 4577 4581 4600 N
+ TH N AH b n/a 34 4577 4581 4598 N
+ TH N AH e n/a 34 4577 4581 4600 N
+ TH N AH i n/a 34 4577 4580 4600 N
+ TH N AO b n/a 34 4577 4581 4598 N
+ TH N AO e n/a 34 4577 4581 4598 N
+ TH N AO i n/a 34 4577 4580 4598 N
+ TH N AW b n/a 34 4577 4581 4599 N
+ TH N AW e n/a 34 4577 4581 4599 N
+ TH N AW i n/a 34 4577 4580 4599 N
+ TH N AY b n/a 34 4577 4581 4598 N
+ TH N AY e n/a 34 4577 4581 4598 N
+ TH N B e n/a 34 4577 4581 4592 N
+ TH N CH e n/a 34 4577 4581 4592 N
+ TH N D e n/a 34 4577 4581 4592 N
+ TH N DH e n/a 34 4577 4581 4596 N
+ TH N EH b n/a 34 4577 4581 4600 N
+ TH N EH e n/a 34 4577 4581 4600 N
+ TH N EH i n/a 34 4577 4580 4600 N
+ TH N ER b n/a 34 4577 4581 4601 N
+ TH N ER e n/a 34 4577 4581 4601 N
+ TH N ER i n/a 34 4577 4580 4601 N
+ TH N EY b n/a 34 4577 4581 4600 N
+ TH N EY e n/a 34 4577 4581 4600 N
+ TH N EY i n/a 34 4577 4580 4600 N
+ TH N F e n/a 34 4577 4581 4596 N
+ TH N G e n/a 34 4577 4581 4592 N
+ TH N HH e n/a 34 4577 4581 4596 N
+ TH N IH b n/a 34 4577 4581 4602 N
+ TH N IH e n/a 34 4577 4581 4604 N
+ TH N IH i n/a 34 4577 4580 4602 N
+ TH N IY b n/a 34 4577 4581 4604 N
+ TH N IY e n/a 34 4577 4581 4604 N
+ TH N IY i n/a 34 4577 4580 4604 N
+ TH N JH e n/a 34 4577 4581 4592 N
+ TH N K e n/a 34 4577 4581 4592 N
+ TH N L b n/a 34 4577 4582 4593 N
+ TH N L e n/a 34 4577 4582 4593 N
+ TH N L i n/a 34 4577 4580 4593 N
+ TH N M e n/a 34 4577 4581 4593 N
+ TH N N e n/a 34 4577 4581 4593 N
+ TH N N i n/a 34 4577 4580 4593 N
+ TH N NG e n/a 34 4577 4581 4593 N
+ TH N OW b n/a 34 4577 4581 4600 N
+ TH N OW e n/a 34 4577 4581 4600 N
+ TH N OY e n/a 34 4577 4581 4598 N
+ TH N P e n/a 34 4577 4581 4592 N
+ TH N R b n/a 34 4577 4582 4597 N
+ TH N R e n/a 34 4577 4582 4597 N
+ TH N R i n/a 34 4577 4580 4597 N
+ TH N S b n/a 34 4577 4581 4596 N
+ TH N S e n/a 34 4577 4581 4596 N
+ TH N S i n/a 34 4577 4580 4596 N
+ TH N SH e n/a 34 4577 4581 4596 N
+ TH N SIL e n/a 34 4577 4581 4591 N
+ TH N T e n/a 34 4577 4581 4592 N
+ TH N TH e n/a 34 4577 4581 4596 N
+ TH N UH b n/a 34 4577 4581 4602 N
+ TH N UH e n/a 34 4577 4581 4604 N
+ TH N UW b n/a 34 4577 4581 4604 N
+ TH N UW e n/a 34 4577 4581 4604 N
+ TH N UW i n/a 34 4577 4580 4604 N
+ TH N V e n/a 34 4577 4581 4596 N
+ TH N W b n/a 34 4577 4581 4594 N
+ TH N W e n/a 34 4577 4581 4594 N
+ TH N W i n/a 34 4577 4580 4594 N
+ TH N Y b n/a 34 4577 4581 4593 N
+ TH N Y e n/a 34 4577 4581 4593 N
+ TH N Z e n/a 34 4577 4581 4596 N
+ TH N ZH e n/a 34 4577 4581 4596 N
+ TH NG AA b n/a 34 4577 4581 4598 N
+ TH NG AA e n/a 34 4577 4581 4598 N
+ TH NG AE b n/a 34 4577 4581 4600 N
+ TH NG AE e n/a 34 4577 4581 4600 N
+ TH NG AH b n/a 34 4577 4581 4598 N
+ TH NG AH e n/a 34 4577 4581 4600 N
+ TH NG AH i n/a 34 4577 4580 4600 N
+ TH NG AO b n/a 34 4577 4581 4598 N
+ TH NG AO e n/a 34 4577 4581 4598 N
+ TH NG AW b n/a 34 4577 4581 4599 N
+ TH NG AW e n/a 34 4577 4581 4599 N
+ TH NG AY b n/a 34 4577 4581 4598 N
+ TH NG AY e n/a 34 4577 4581 4598 N
+ TH NG B e n/a 34 4577 4581 4592 N
+ TH NG CH e n/a 34 4577 4581 4592 N
+ TH NG D e n/a 34 4577 4581 4592 N
+ TH NG DH e n/a 34 4577 4581 4596 N
+ TH NG EH b n/a 34 4577 4581 4600 N
+ TH NG EH e n/a 34 4577 4581 4600 N
+ TH NG ER b n/a 34 4577 4581 4601 N
+ TH NG ER e n/a 34 4577 4581 4601 N
+ TH NG EY b n/a 34 4577 4581 4600 N
+ TH NG EY e n/a 34 4577 4581 4600 N
+ TH NG F e n/a 34 4577 4581 4596 N
+ TH NG G e n/a 34 4577 4581 4592 N
+ TH NG HH e n/a 34 4577 4581 4596 N
+ TH NG IH b n/a 34 4577 4581 4602 N
+ TH NG IH e n/a 34 4577 4581 4604 N
+ TH NG IY b n/a 34 4577 4581 4604 N
+ TH NG IY e n/a 34 4577 4581 4604 N
+ TH NG IY i n/a 34 4577 4580 4604 N
+ TH NG JH e n/a 34 4577 4581 4592 N
+ TH NG K e n/a 34 4577 4581 4592 N
+ TH NG L b n/a 34 4577 4582 4593 N
+ TH NG L e n/a 34 4577 4582 4593 N
+ TH NG M e n/a 34 4577 4581 4593 N
+ TH NG N e n/a 34 4577 4581 4593 N
+ TH NG N i n/a 34 4577 4580 4593 N
+ TH NG NG e n/a 34 4577 4581 4593 N
+ TH NG OW b n/a 34 4577 4581 4600 N
+ TH NG OW e n/a 34 4577 4581 4600 N
+ TH NG OY e n/a 34 4577 4581 4598 N
+ TH NG P e n/a 34 4577 4581 4592 N
+ TH NG R b n/a 34 4577 4582 4597 N
+ TH NG R e n/a 34 4577 4582 4597 N
+ TH NG S b n/a 34 4577 4581 4596 N
+ TH NG S e n/a 34 4577 4581 4596 N
+ TH NG S i n/a 34 4577 4580 4596 N
+ TH NG SH e n/a 34 4577 4581 4596 N
+ TH NG SIL e n/a 34 4577 4581 4591 N
+ TH NG T e n/a 34 4577 4581 4592 N
+ TH NG TH e n/a 34 4577 4581 4596 N
+ TH NG UH b n/a 34 4577 4581 4602 N
+ TH NG UH e n/a 34 4577 4581 4604 N
+ TH NG UW b n/a 34 4577 4581 4604 N
+ TH NG UW e n/a 34 4577 4581 4604 N
+ TH NG V e n/a 34 4577 4581 4596 N
+ TH NG W b n/a 34 4577 4581 4594 N
+ TH NG W e n/a 34 4577 4581 4594 N
+ TH NG W i n/a 34 4577 4580 4594 N
+ TH NG Y b n/a 34 4577 4581 4593 N
+ TH NG Y e n/a 34 4577 4581 4593 N
+ TH NG Z e n/a 34 4577 4581 4596 N
+ TH NG ZH e n/a 34 4577 4581 4596 N
+ TH OW AA b n/a 34 4570 4583 4598 N
+ TH OW AA e n/a 34 4570 4586 4598 N
+ TH OW AE b n/a 34 4570 4583 4600 N
+ TH OW AE e n/a 34 4570 4586 4600 N
+ TH OW AE i n/a 34 4570 4584 4600 N
+ TH OW AH b n/a 34 4570 4583 4598 N
+ TH OW AH e n/a 34 4570 4586 4600 N
+ TH OW AH i n/a 34 4570 4584 4600 N
+ TH OW AO b n/a 34 4570 4583 4598 N
+ TH OW AO e n/a 34 4570 4586 4598 N
+ TH OW AO i n/a 34 4570 4584 4598 N
+ TH OW AW b n/a 34 4570 4583 4599 N
+ TH OW AW e n/a 34 4570 4586 4599 N
+ TH OW AW i n/a 34 4570 4584 4599 N
+ TH OW AY b n/a 34 4570 4583 4598 N
+ TH OW AY e n/a 34 4570 4586 4598 N
+ TH OW AY i n/a 34 4570 4584 4598 N
+ TH OW B e n/a 34 4570 4586 4592 N
+ TH OW CH e n/a 34 4570 4586 4592 N
+ TH OW D e n/a 34 4570 4586 4592 N
+ TH OW DH e n/a 34 4570 4586 4596 N
+ TH OW EH b n/a 34 4570 4583 4600 N
+ TH OW EH e n/a 34 4570 4586 4600 N
+ TH OW EH i n/a 34 4570 4584 4600 N
+ TH OW ER b n/a 34 4570 4583 4601 N
+ TH OW ER e n/a 34 4570 4586 4601 N
+ TH OW ER i n/a 34 4570 4584 4601 N
+ TH OW EY b n/a 34 4570 4583 4600 N
+ TH OW EY e n/a 34 4570 4586 4600 N
+ TH OW F e n/a 34 4570 4586 4596 N
+ TH OW G e n/a 34 4570 4586 4592 N
+ TH OW HH e n/a 34 4570 4586 4596 N
+ TH OW IH b n/a 34 4570 4583 4602 N
+ TH OW IH e n/a 34 4570 4586 4604 N
+ TH OW IH i n/a 34 4570 4584 4602 N
+ TH OW IY b n/a 34 4570 4583 4604 N
+ TH OW IY e n/a 34 4570 4586 4604 N
+ TH OW IY i n/a 34 4570 4584 4604 N
+ TH OW JH e n/a 34 4570 4586 4592 N
+ TH OW K e n/a 34 4570 4586 4592 N
+ TH OW K i n/a 34 4570 4584 4592 N
+ TH OW L b n/a 34 4570 4583 4593 N
+ TH OW L e n/a 34 4570 4586 4593 N
+ TH OW L i n/a 34 4570 4584 4593 N
+ TH OW M e n/a 34 4570 4586 4593 N
+ TH OW N e n/a 34 4570 4586 4593 N
+ TH OW NG e n/a 34 4570 4586 4593 N
+ TH OW OW b n/a 34 4570 4583 4600 N
+ TH OW OW e n/a 34 4570 4586 4600 N
+ TH OW OW i n/a 34 4570 4584 4600 N
+ TH OW OY e n/a 34 4570 4586 4598 N
+ TH OW P e n/a 34 4570 4586 4592 N
+ TH OW R b n/a 34 4570 4583 4597 N
+ TH OW R e n/a 34 4570 4586 4597 N
+ TH OW R i n/a 34 4570 4584 4597 N
+ TH OW S b n/a 34 4570 4583 4596 N
+ TH OW S e n/a 34 4570 4586 4596 N
+ TH OW S i n/a 34 4570 4584 4596 N
+ TH OW SH e n/a 34 4570 4586 4596 N
+ TH OW SIL e n/a 34 4570 4585 4591 N
+ TH OW T e n/a 34 4570 4586 4592 N
+ TH OW TH e n/a 34 4570 4586 4596 N
+ TH OW UH b n/a 34 4570 4583 4602 N
+ TH OW UH e n/a 34 4570 4586 4604 N
+ TH OW UW b n/a 34 4570 4583 4604 N
+ TH OW UW e n/a 34 4570 4586 4604 N
+ TH OW V e n/a 34 4570 4586 4596 N
+ TH OW W b n/a 34 4570 4583 4594 N
+ TH OW W e n/a 34 4570 4586 4594 N
+ TH OW Y b n/a 34 4570 4583 4593 N
+ TH OW Y e n/a 34 4570 4586 4593 N
+ TH OW Z e n/a 34 4570 4586 4596 N
+ TH OW ZH e n/a 34 4570 4586 4596 N
+ TH OY AA b n/a 34 4572 4584 4598 N
+ TH OY AA e n/a 34 4572 4586 4598 N
+ TH OY AE b n/a 34 4572 4584 4600 N
+ TH OY AE e n/a 34 4572 4586 4600 N
+ TH OY AH b n/a 34 4572 4584 4598 N
+ TH OY AH e n/a 34 4572 4586 4600 N
+ TH OY AH i n/a 34 4572 4584 4600 N
+ TH OY AO b n/a 34 4572 4584 4598 N
+ TH OY AO e n/a 34 4572 4586 4598 N
+ TH OY AW b n/a 34 4572 4584 4599 N
+ TH OY AW e n/a 34 4572 4586 4599 N
+ TH OY AY b n/a 34 4572 4584 4598 N
+ TH OY AY e n/a 34 4572 4586 4598 N
+ TH OY B e n/a 34 4572 4586 4592 N
+ TH OY CH e n/a 34 4572 4586 4592 N
+ TH OY D e n/a 34 4572 4586 4592 N
+ TH OY DH e n/a 34 4572 4586 4596 N
+ TH OY EH b n/a 34 4572 4584 4600 N
+ TH OY EH e n/a 34 4572 4586 4600 N
+ TH OY ER b n/a 34 4572 4584 4601 N
+ TH OY ER e n/a 34 4572 4586 4601 N
+ TH OY ER i n/a 34 4572 4584 4601 N
+ TH OY EY b n/a 34 4572 4584 4600 N
+ TH OY EY e n/a 34 4572 4586 4600 N
+ TH OY F e n/a 34 4572 4586 4596 N
+ TH OY G e n/a 34 4572 4586 4592 N
+ TH OY HH e n/a 34 4572 4586 4596 N
+ TH OY IH b n/a 34 4572 4584 4604 N
+ TH OY IH e n/a 34 4572 4586 4604 N
+ TH OY IY b n/a 34 4572 4584 4604 N
+ TH OY IY e n/a 34 4572 4586 4604 N
+ TH OY JH e n/a 34 4572 4586 4592 N
+ TH OY K e n/a 34 4572 4586 4592 N
+ TH OY L b n/a 34 4572 4584 4593 N
+ TH OY L e n/a 34 4572 4586 4593 N
+ TH OY M e n/a 34 4572 4586 4593 N
+ TH OY N e n/a 34 4572 4586 4593 N
+ TH OY NG e n/a 34 4572 4586 4593 N
+ TH OY OW b n/a 34 4572 4584 4600 N
+ TH OY OW e n/a 34 4572 4586 4600 N
+ TH OY OW i n/a 34 4572 4584 4600 N
+ TH OY OY e n/a 34 4572 4586 4598 N
+ TH OY P e n/a 34 4572 4586 4592 N
+ TH OY R b n/a 34 4572 4584 4597 N
+ TH OY R e n/a 34 4572 4586 4597 N
+ TH OY R i n/a 34 4572 4584 4597 N
+ TH OY S b n/a 34 4572 4584 4596 N
+ TH OY S e n/a 34 4572 4586 4596 N
+ TH OY SH e n/a 34 4572 4586 4596 N
+ TH OY SIL e n/a 34 4572 4586 4591 N
+ TH OY T e n/a 34 4572 4586 4592 N
+ TH OY TH e n/a 34 4572 4586 4596 N
+ TH OY UH b n/a 34 4572 4584 4604 N
+ TH OY UH e n/a 34 4572 4586 4604 N
+ TH OY UW b n/a 34 4572 4584 4604 N
+ TH OY UW e n/a 34 4572 4586 4604 N
+ TH OY V e n/a 34 4572 4586 4596 N
+ TH OY W b n/a 34 4572 4584 4594 N
+ TH OY W e n/a 34 4572 4586 4594 N
+ TH OY Y b n/a 34 4572 4584 4593 N
+ TH OY Y e n/a 34 4572 4586 4593 N
+ TH OY Z e n/a 34 4572 4586 4596 N
+ TH OY ZH e n/a 34 4572 4586 4596 N
+ TH P AA b n/a 34 4574 4581 4598 N
+ TH P AA e n/a 34 4574 4581 4598 N
+ TH P AE b n/a 34 4574 4581 4600 N
+ TH P AE e n/a 34 4574 4581 4600 N
+ TH P AH b n/a 34 4574 4581 4598 N
+ TH P AH e n/a 34 4574 4581 4600 N
+ TH P AH i n/a 34 4574 4581 4600 N
+ TH P AO b n/a 34 4574 4581 4598 N
+ TH P AO e n/a 34 4574 4581 4598 N
+ TH P AO i n/a 34 4574 4581 4598 N
+ TH P AW b n/a 34 4574 4581 4599 N
+ TH P AW e n/a 34 4574 4581 4599 N
+ TH P AY b n/a 34 4574 4581 4598 N
+ TH P AY e n/a 34 4574 4581 4598 N
+ TH P B e n/a 34 4574 4581 4592 N
+ TH P CH e n/a 34 4574 4581 4592 N
+ TH P D e n/a 34 4574 4581 4592 N
+ TH P DH e n/a 34 4574 4581 4596 N
+ TH P EH b n/a 34 4574 4581 4600 N
+ TH P EH e n/a 34 4574 4581 4600 N
+ TH P ER b n/a 34 4574 4581 4601 N
+ TH P ER e n/a 34 4574 4581 4601 N
+ TH P ER i n/a 34 4574 4581 4601 N
+ TH P EY b n/a 34 4574 4581 4600 N
+ TH P EY e n/a 34 4574 4581 4600 N
+ TH P F e n/a 34 4574 4581 4596 N
+ TH P G e n/a 34 4574 4581 4592 N
+ TH P HH e n/a 34 4574 4581 4596 N
+ TH P IH b n/a 34 4574 4581 4602 N
+ TH P IH e n/a 34 4574 4581 4604 N
+ TH P IY b n/a 34 4574 4581 4604 N
+ TH P IY e n/a 34 4574 4581 4604 N
+ TH P JH e n/a 34 4574 4581 4592 N
+ TH P K e n/a 34 4574 4581 4592 N
+ TH P L b n/a 34 4574 4582 4593 N
+ TH P L e n/a 34 4574 4582 4593 N
+ TH P M e n/a 34 4574 4581 4593 N
+ TH P N e n/a 34 4574 4581 4593 N
+ TH P NG e n/a 34 4574 4581 4593 N
+ TH P OW b n/a 34 4574 4581 4600 N
+ TH P OW e n/a 34 4574 4581 4600 N
+ TH P OY e n/a 34 4574 4581 4598 N
+ TH P P e n/a 34 4574 4581 4592 N
+ TH P R b n/a 34 4574 4582 4597 N
+ TH P R e n/a 34 4574 4582 4597 N
+ TH P S b n/a 34 4574 4581 4596 N
+ TH P S e n/a 34 4574 4581 4596 N
+ TH P S i n/a 34 4574 4581 4596 N
+ TH P SH e n/a 34 4574 4581 4596 N
+ TH P SIL e n/a 34 4574 4581 4591 N
+ TH P T e n/a 34 4574 4581 4592 N
+ TH P TH e n/a 34 4574 4581 4596 N
+ TH P UH b n/a 34 4574 4581 4602 N
+ TH P UH e n/a 34 4574 4581 4604 N
+ TH P UW b n/a 34 4574 4581 4604 N
+ TH P UW e n/a 34 4574 4581 4604 N
+ TH P V e n/a 34 4574 4581 4596 N
+ TH P W b n/a 34 4574 4581 4594 N
+ TH P W e n/a 34 4574 4581 4594 N
+ TH P Y b n/a 34 4574 4581 4593 N
+ TH P Y e n/a 34 4574 4581 4593 N
+ TH P Z e n/a 34 4574 4581 4596 N
+ TH P Z i n/a 34 4574 4581 4596 N
+ TH P ZH e n/a 34 4574 4581 4596 N
+ TH R AA b n/a 34 4571 4583 4598 N
+ TH R AA e n/a 34 4571 4586 4598 N
+ TH R AA i n/a 34 4571 4584 4598 N
+ TH R AE b n/a 34 4571 4583 4600 N
+ TH R AE e n/a 34 4571 4586 4600 N
+ TH R AE i n/a 34 4571 4584 4600 N
+ TH R AH b n/a 34 4571 4583 4598 N
+ TH R AH e n/a 34 4571 4586 4600 N
+ TH R AH i n/a 34 4571 4584 4600 N
+ TH R AO b n/a 34 4571 4583 4598 N
+ TH R AO e n/a 34 4571 4586 4598 N
+ TH R AO i n/a 34 4571 4584 4598 N
+ TH R AW b n/a 34 4571 4583 4599 N
+ TH R AW e n/a 34 4571 4586 4599 N
+ TH R AW i n/a 34 4571 4584 4599 N
+ TH R AY b n/a 34 4571 4583 4598 N
+ TH R AY e n/a 34 4571 4586 4598 N
+ TH R AY i n/a 34 4571 4584 4598 N
+ TH R B e n/a 34 4571 4586 4592 N
+ TH R B i n/a 34 4571 4584 4592 N
+ TH R CH e n/a 34 4571 4586 4592 N
+ TH R D e n/a 34 4571 4586 4592 N
+ TH R DH e n/a 34 4571 4586 4596 N
+ TH R EH b n/a 34 4571 4583 4600 N
+ TH R EH e n/a 34 4571 4586 4600 N
+ TH R EH i n/a 34 4571 4584 4600 N
+ TH R ER b n/a 34 4571 4583 4601 N
+ TH R ER e n/a 34 4571 4586 4601 N
+ TH R ER i n/a 34 4571 4584 4601 N
+ TH R EY b n/a 34 4571 4583 4600 N
+ TH R EY e n/a 34 4571 4586 4600 N
+ TH R F e n/a 34 4571 4586 4596 N
+ TH R F i n/a 34 4571 4584 4596 N
+ TH R G e n/a 34 4571 4586 4592 N
+ TH R G i n/a 34 4571 4584 4592 N
+ TH R HH e n/a 34 4571 4586 4596 N
+ TH R HH i n/a 34 4571 4584 4596 N
+ TH R IH b n/a 34 4571 4583 4602 N
+ TH R IH e n/a 34 4571 4586 4604 N
+ TH R IH i n/a 34 4571 4584 4602 N
+ TH R IY b n/a 34 4571 4583 4604 N
+ TH R IY e n/a 34 4571 4586 4604 N
+ TH R IY i n/a 34 4571 4584 4604 N
+ TH R JH e n/a 34 4571 4586 4592 N
+ TH R K e n/a 34 4571 4586 4592 N
+ TH R K i n/a 34 4571 4584 4592 N
+ TH R L b n/a 34 4571 4583 4593 N
+ TH R L e n/a 34 4571 4586 4593 N
+ TH R L i n/a 34 4571 4584 4593 N
+ TH R M e n/a 34 4571 4586 4593 N
+ TH R M i n/a 34 4571 4584 4593 N
+ TH R N e n/a 34 4571 4586 4593 N
+ TH R NG e n/a 34 4571 4586 4593 N
+ TH R OW b n/a 34 4571 4583 4600 N
+ TH R OW e n/a 34 4571 4586 4600 N
+ TH R OW i n/a 34 4571 4584 4600 N
+ TH R OY e n/a 34 4571 4586 4598 N
+ TH R P e n/a 34 4571 4586 4592 N
+ TH R P i n/a 34 4571 4584 4592 N
+ TH R R b n/a 34 4571 4583 4597 N
+ TH R R e n/a 34 4571 4586 4597 N
+ TH R R i n/a 34 4571 4584 4597 N
+ TH R S b n/a 34 4571 4583 4596 N
+ TH R S e n/a 34 4571 4586 4596 N
+ TH R S i n/a 34 4571 4584 4596 N
+ TH R SH e n/a 34 4571 4586 4596 N
+ TH R SIL e n/a 34 4571 4586 4591 N
+ TH R T e n/a 34 4571 4586 4592 N
+ TH R TH e n/a 34 4571 4586 4596 N
+ TH R UH b n/a 34 4571 4583 4602 N
+ TH R UH e n/a 34 4571 4586 4604 N
+ TH R UH i n/a 34 4571 4584 4602 N
+ TH R UW b n/a 34 4571 4583 4604 N
+ TH R UW e n/a 34 4571 4586 4604 N
+ TH R V e n/a 34 4571 4586 4596 N
+ TH R V i n/a 34 4571 4584 4596 N
+ TH R W b n/a 34 4571 4583 4594 N
+ TH R W e n/a 34 4571 4586 4594 N
+ TH R W i n/a 34 4571 4584 4594 N
+ TH R Y b n/a 34 4571 4583 4593 N
+ TH R Y e n/a 34 4571 4586 4593 N
+ TH R Z e n/a 34 4571 4586 4596 N
+ TH R ZH e n/a 34 4571 4586 4596 N
+ TH S AA b n/a 34 4574 4581 4598 N
+ TH S AA e n/a 34 4574 4581 4598 N
+ TH S AE b n/a 34 4574 4581 4600 N
+ TH S AE e n/a 34 4574 4581 4600 N
+ TH S AH b n/a 34 4574 4581 4598 N
+ TH S AH e n/a 34 4574 4581 4600 N
+ TH S AH i n/a 34 4574 4581 4600 N
+ TH S AO b n/a 34 4574 4581 4598 N
+ TH S AO e n/a 34 4574 4581 4598 N
+ TH S AW b n/a 34 4574 4581 4599 N
+ TH S AW e n/a 34 4574 4581 4599 N
+ TH S AY b n/a 34 4574 4581 4598 N
+ TH S AY e n/a 34 4574 4581 4598 N
+ TH S B e n/a 34 4574 4581 4592 N
+ TH S CH e n/a 34 4574 4581 4592 N
+ TH S D e n/a 34 4574 4581 4592 N
+ TH S DH e n/a 34 4574 4581 4596 N
+ TH S EH b n/a 34 4574 4581 4600 N
+ TH S EH e n/a 34 4574 4581 4600 N
+ TH S EH i n/a 34 4574 4581 4600 N
+ TH S ER b n/a 34 4574 4581 4601 N
+ TH S ER e n/a 34 4574 4581 4601 N
+ TH S ER i n/a 34 4574 4581 4601 N
+ TH S EY b n/a 34 4574 4581 4600 N
+ TH S EY e n/a 34 4574 4581 4600 N
+ TH S F e n/a 34 4574 4581 4596 N
+ TH S G e n/a 34 4574 4581 4592 N
+ TH S HH e n/a 34 4574 4581 4596 N
+ TH S IH b n/a 34 4574 4581 4602 N
+ TH S IH e n/a 34 4574 4581 4604 N
+ TH S IH i n/a 34 4574 4581 4602 N
+ TH S IY b n/a 34 4574 4581 4604 N
+ TH S IY e n/a 34 4574 4581 4604 N
+ TH S IY i n/a 34 4574 4581 4604 N
+ TH S JH e n/a 34 4574 4581 4592 N
+ TH S K e n/a 34 4574 4581 4592 N
+ TH S L b n/a 34 4574 4582 4593 N
+ TH S L e n/a 34 4574 4582 4593 N
+ TH S M e n/a 34 4574 4581 4593 N
+ TH S M i n/a 34 4574 4581 4593 N
+ TH S N e n/a 34 4574 4581 4593 N
+ TH S NG e n/a 34 4574 4581 4593 N
+ TH S OW b n/a 34 4574 4581 4600 N
+ TH S OW e n/a 34 4574 4581 4600 N
+ TH S OY e n/a 34 4574 4581 4598 N
+ TH S P e n/a 34 4574 4581 4592 N
+ TH S R b n/a 34 4574 4582 4597 N
+ TH S R e n/a 34 4574 4582 4597 N
+ TH S R i n/a 34 4574 4582 4597 N
+ TH S S b n/a 34 4574 4581 4596 N
+ TH S S e n/a 34 4574 4581 4596 N
+ TH S S i n/a 34 4574 4581 4596 N
+ TH S SH e n/a 34 4574 4581 4596 N
+ TH S SIL e n/a 34 4574 4581 4591 N
+ TH S T e n/a 34 4574 4581 4592 N
+ TH S TH e n/a 34 4574 4581 4596 N
+ TH S UH b n/a 34 4574 4581 4602 N
+ TH S UH e n/a 34 4574 4581 4604 N
+ TH S UH i n/a 34 4574 4581 4602 N
+ TH S UW b n/a 34 4574 4581 4604 N
+ TH S UW e n/a 34 4574 4581 4604 N
+ TH S V e n/a 34 4574 4581 4596 N
+ TH S W b n/a 34 4574 4581 4594 N
+ TH S W e n/a 34 4574 4581 4594 N
+ TH S W i n/a 34 4574 4581 4594 N
+ TH S Y b n/a 34 4574 4581 4593 N
+ TH S Y e n/a 34 4574 4581 4593 N
+ TH S Z e n/a 34 4574 4581 4596 N
+ TH S ZH e n/a 34 4574 4581 4596 N
+ TH SH AA b n/a 34 4574 4581 4598 N
+ TH SH AE b n/a 34 4574 4581 4600 N
+ TH SH AH b n/a 34 4574 4581 4598 N
+ TH SH AO b n/a 34 4574 4581 4598 N
+ TH SH AW b n/a 34 4574 4581 4599 N
+ TH SH AY b n/a 34 4574 4581 4598 N
+ TH SH EH b n/a 34 4574 4581 4600 N
+ TH SH ER b n/a 34 4574 4581 4601 N
+ TH SH EY b n/a 34 4574 4581 4600 N
+ TH SH IH b n/a 34 4574 4581 4602 N
+ TH SH IY b n/a 34 4574 4581 4604 N
+ TH SH L b n/a 34 4574 4582 4593 N
+ TH SH OW b n/a 34 4574 4581 4600 N
+ TH SH R b n/a 34 4574 4582 4597 N
+ TH SH S b n/a 34 4574 4581 4596 N
+ TH SH UH b n/a 34 4574 4581 4602 N
+ TH SH UW b n/a 34 4574 4581 4604 N
+ TH SH W b n/a 34 4574 4581 4594 N
+ TH SH Y b n/a 34 4574 4581 4593 N
+ TH SIL AA b n/a 34 4575 4582 4598 N
+ TH SIL AE b n/a 34 4575 4582 4600 N
+ TH SIL AH b n/a 34 4575 4582 4598 N
+ TH SIL AO b n/a 34 4575 4582 4598 N
+ TH SIL AW b n/a 34 4575 4582 4599 N
+ TH SIL AY b n/a 34 4575 4582 4598 N
+ TH SIL EH b n/a 34 4575 4582 4600 N
+ TH SIL ER b n/a 34 4575 4582 4601 N
+ TH SIL EY b n/a 34 4575 4582 4600 N
+ TH SIL IH b n/a 34 4575 4582 4602 N
+ TH SIL IY b n/a 34 4575 4582 4604 N
+ TH SIL L b n/a 34 4575 4582 4593 N
+ TH SIL OW b n/a 34 4575 4582 4600 N
+ TH SIL R b n/a 34 4575 4582 4597 N
+ TH SIL S b n/a 34 4575 4582 4596 N
+ TH SIL UH b n/a 34 4575 4582 4602 N
+ TH SIL UW b n/a 34 4575 4582 4604 N
+ TH SIL W b n/a 34 4575 4582 4594 N
+ TH SIL Y b n/a 34 4575 4582 4593 N
+ TH T AA b n/a 34 4576 4581 4598 N
+ TH T AA e n/a 34 4576 4581 4598 N
+ TH T AE b n/a 34 4576 4581 4600 N
+ TH T AE e n/a 34 4576 4581 4600 N
+ TH T AH b n/a 34 4576 4581 4598 N
+ TH T AH e n/a 34 4576 4581 4600 N
+ TH T AO b n/a 34 4576 4581 4598 N
+ TH T AO e n/a 34 4576 4581 4598 N
+ TH T AW b n/a 34 4576 4581 4599 N
+ TH T AW e n/a 34 4576 4581 4599 N
+ TH T AY b n/a 34 4576 4581 4598 N
+ TH T AY e n/a 34 4576 4581 4598 N
+ TH T B e n/a 34 4576 4581 4592 N
+ TH T CH e n/a 34 4576 4581 4592 N
+ TH T D e n/a 34 4576 4581 4592 N
+ TH T DH e n/a 34 4576 4581 4596 N
+ TH T EH b n/a 34 4576 4581 4600 N
+ TH T EH e n/a 34 4576 4581 4600 N
+ TH T ER b n/a 34 4576 4581 4601 N
+ TH T ER e n/a 34 4576 4581 4601 N
+ TH T EY b n/a 34 4576 4581 4600 N
+ TH T EY e n/a 34 4576 4581 4600 N
+ TH T F e n/a 34 4576 4581 4596 N
+ TH T G e n/a 34 4576 4581 4592 N
+ TH T HH e n/a 34 4576 4581 4596 N
+ TH T IH b n/a 34 4576 4581 4602 N
+ TH T IH e n/a 34 4576 4581 4604 N
+ TH T IY b n/a 34 4576 4581 4604 N
+ TH T IY e n/a 34 4576 4581 4604 N
+ TH T JH e n/a 34 4576 4581 4592 N
+ TH T K e n/a 34 4576 4581 4592 N
+ TH T L b n/a 34 4576 4582 4593 N
+ TH T L e n/a 34 4576 4582 4593 N
+ TH T M e n/a 34 4576 4581 4593 N
+ TH T N e n/a 34 4576 4581 4593 N
+ TH T NG e n/a 34 4576 4581 4593 N
+ TH T OW b n/a 34 4576 4581 4600 N
+ TH T OW e n/a 34 4576 4581 4600 N
+ TH T OY e n/a 34 4576 4581 4598 N
+ TH T P e n/a 34 4576 4581 4592 N
+ TH T R b n/a 34 4576 4582 4597 N
+ TH T R e n/a 34 4576 4582 4597 N
+ TH T R i n/a 34 4576 4582 4597 N
+ TH T S b n/a 34 4576 4581 4596 N
+ TH T S e n/a 34 4576 4581 4596 N
+ TH T S i n/a 34 4576 4581 4596 N
+ TH T SH e n/a 34 4576 4581 4596 N
+ TH T SIL e n/a 34 4576 4581 4591 N
+ TH T T e n/a 34 4576 4581 4592 N
+ TH T TH e n/a 34 4576 4581 4596 N
+ TH T UH b n/a 34 4576 4581 4602 N
+ TH T UH e n/a 34 4576 4581 4604 N
+ TH T UW b n/a 34 4576 4581 4604 N
+ TH T UW e n/a 34 4576 4581 4604 N
+ TH T V e n/a 34 4576 4581 4596 N
+ TH T W b n/a 34 4576 4581 4594 N
+ TH T W e n/a 34 4576 4581 4594 N
+ TH T Y b n/a 34 4576 4581 4593 N
+ TH T Y e n/a 34 4576 4581 4593 N
+ TH T Z e n/a 34 4576 4581 4596 N
+ TH T ZH e n/a 34 4576 4581 4596 N
+ TH TH AA b n/a 34 4574 4581 4598 N
+ TH TH AE b n/a 34 4574 4581 4600 N
+ TH TH AH b n/a 34 4574 4581 4598 N
+ TH TH AO b n/a 34 4574 4581 4598 N
+ TH TH AW b n/a 34 4574 4581 4599 N
+ TH TH AY b n/a 34 4574 4581 4598 N
+ TH TH EH b n/a 34 4574 4581 4600 N
+ TH TH ER b n/a 34 4574 4581 4601 N
+ TH TH EY b n/a 34 4574 4581 4600 N
+ TH TH IH b n/a 34 4574 4581 4602 N
+ TH TH IY b n/a 34 4574 4581 4604 N
+ TH TH L b n/a 34 4574 4582 4593 N
+ TH TH OW b n/a 34 4574 4581 4600 N
+ TH TH R b n/a 34 4574 4582 4597 N
+ TH TH S b n/a 34 4574 4581 4596 N
+ TH TH UH b n/a 34 4574 4581 4602 N
+ TH TH UW b n/a 34 4574 4581 4604 N
+ TH TH W b n/a 34 4574 4581 4594 N
+ TH TH Y b n/a 34 4574 4581 4593 N
+ TH UH AA b n/a 34 4573 4589 4598 N
+ TH UH AA e n/a 34 4573 4589 4598 N
+ TH UH AE b n/a 34 4573 4589 4600 N
+ TH UH AE e n/a 34 4573 4589 4600 N
+ TH UH AH b n/a 34 4573 4589 4598 N
+ TH UH AH e n/a 34 4573 4589 4600 N
+ TH UH AO b n/a 34 4573 4589 4598 N
+ TH UH AO e n/a 34 4573 4589 4598 N
+ TH UH AW b n/a 34 4573 4589 4599 N
+ TH UH AW e n/a 34 4573 4589 4599 N
+ TH UH AY b n/a 34 4573 4589 4598 N
+ TH UH AY e n/a 34 4573 4589 4598 N
+ TH UH B e n/a 34 4573 4587 4592 N
+ TH UH CH e n/a 34 4573 4587 4592 N
+ TH UH D e n/a 34 4573 4587 4592 N
+ TH UH DH e n/a 34 4573 4588 4595 N
+ TH UH EH b n/a 34 4573 4589 4600 N
+ TH UH EH e n/a 34 4573 4589 4600 N
+ TH UH ER b n/a 34 4573 4589 4601 N
+ TH UH ER e n/a 34 4573 4589 4601 N
+ TH UH EY b n/a 34 4573 4589 4600 N
+ TH UH EY e n/a 34 4573 4589 4600 N
+ TH UH F e n/a 34 4573 4587 4596 N
+ TH UH G e n/a 34 4573 4587 4592 N
+ TH UH HH e n/a 34 4573 4589 4596 N
+ TH UH IH b n/a 34 4573 4589 4603 N
+ TH UH IH e n/a 34 4573 4589 4603 N
+ TH UH IY b n/a 34 4573 4589 4604 N
+ TH UH IY e n/a 34 4573 4589 4604 N
+ TH UH JH e n/a 34 4573 4587 4592 N
+ TH UH K e n/a 34 4573 4587 4592 N
+ TH UH L b n/a 34 4573 4587 4593 N
+ TH UH L e n/a 34 4573 4587 4593 N
+ TH UH M e n/a 34 4573 4587 4593 N
+ TH UH N e n/a 34 4573 4587 4593 N
+ TH UH NG e n/a 34 4573 4587 4593 N
+ TH UH OW b n/a 34 4573 4589 4600 N
+ TH UH OW e n/a 34 4573 4589 4600 N
+ TH UH OY e n/a 34 4573 4589 4598 N
+ TH UH P e n/a 34 4573 4587 4592 N
+ TH UH R b n/a 34 4573 4587 4597 N
+ TH UH R e n/a 34 4573 4587 4597 N
+ TH UH S b n/a 34 4573 4587 4596 N
+ TH UH S e n/a 34 4573 4587 4596 N
+ TH UH SH e n/a 34 4573 4587 4596 N
+ TH UH SIL e n/a 34 4573 4587 4592 N
+ TH UH T e n/a 34 4573 4587 4592 N
+ TH UH TH e n/a 34 4573 4588 4596 N
+ TH UH UH b n/a 34 4573 4589 4603 N
+ TH UH UH e n/a 34 4573 4589 4603 N
+ TH UH UW b n/a 34 4573 4589 4604 N
+ TH UH UW e n/a 34 4573 4589 4604 N
+ TH UH V e n/a 34 4573 4587 4596 N
+ TH UH W b n/a 34 4573 4587 4594 N
+ TH UH W e n/a 34 4573 4587 4594 N
+ TH UH Y b n/a 34 4573 4587 4593 N
+ TH UH Y e n/a 34 4573 4587 4593 N
+ TH UH Z e n/a 34 4573 4587 4595 N
+ TH UH ZH e n/a 34 4573 4587 4596 N
+ TH UW AA b n/a 34 4579 4590 4598 N
+ TH UW AA e n/a 34 4579 4590 4598 N
+ TH UW AA i n/a 34 4579 4590 4598 N
+ TH UW AE b n/a 34 4579 4590 4600 N
+ TH UW AE e n/a 34 4579 4590 4600 N
+ TH UW AE i n/a 34 4579 4590 4600 N
+ TH UW AH b n/a 34 4579 4590 4598 N
+ TH UW AH e n/a 34 4579 4590 4600 N
+ TH UW AH i n/a 34 4579 4590 4600 N
+ TH UW AO b n/a 34 4579 4590 4598 N
+ TH UW AO e n/a 34 4579 4590 4598 N
+ TH UW AW b n/a 34 4579 4590 4599 N
+ TH UW AW e n/a 34 4579 4590 4599 N
+ TH UW AY b n/a 34 4579 4590 4598 N
+ TH UW AY e n/a 34 4579 4590 4598 N
+ TH UW AY i n/a 34 4579 4590 4598 N
+ TH UW B e n/a 34 4579 4590 4592 N
+ TH UW B i n/a 34 4579 4590 4592 N
+ TH UW CH e n/a 34 4579 4590 4592 N
+ TH UW D e n/a 34 4579 4590 4592 N
+ TH UW DH e n/a 34 4579 4590 4595 N
+ TH UW EH b n/a 34 4579 4590 4600 N
+ TH UW EH e n/a 34 4579 4590 4600 N
+ TH UW EH i n/a 34 4579 4590 4600 N
+ TH UW ER b n/a 34 4579 4590 4601 N
+ TH UW ER e n/a 34 4579 4590 4601 N
+ TH UW ER i n/a 34 4579 4590 4601 N
+ TH UW EY b n/a 34 4579 4590 4600 N
+ TH UW EY e n/a 34 4579 4590 4600 N
+ TH UW EY i n/a 34 4579 4590 4600 N
+ TH UW F e n/a 34 4579 4590 4596 N
+ TH UW F i n/a 34 4579 4590 4596 N
+ TH UW G e n/a 34 4579 4590 4592 N
+ TH UW HH e n/a 34 4579 4590 4596 N
+ TH UW IH b n/a 34 4579 4590 4603 N
+ TH UW IH e n/a 34 4579 4590 4603 N
+ TH UW IH i n/a 34 4579 4590 4603 N
+ TH UW IY b n/a 34 4579 4590 4604 N
+ TH UW IY e n/a 34 4579 4590 4604 N
+ TH UW IY i n/a 34 4579 4590 4604 N
+ TH UW JH e n/a 34 4579 4590 4592 N
+ TH UW K e n/a 34 4579 4590 4592 N
+ TH UW L b n/a 34 4579 4590 4593 N
+ TH UW L e n/a 34 4579 4590 4593 N
+ TH UW L i n/a 34 4579 4590 4593 N
+ TH UW M e n/a 34 4579 4590 4593 N
+ TH UW M i n/a 34 4579 4590 4593 N
+ TH UW N e n/a 34 4579 4590 4593 N
+ TH UW N i n/a 34 4579 4590 4593 N
+ TH UW NG e n/a 34 4579 4590 4593 N
+ TH UW OW b n/a 34 4579 4590 4600 N
+ TH UW OW e n/a 34 4579 4590 4600 N
+ TH UW OW i n/a 34 4579 4590 4600 N
+ TH UW OY e n/a 34 4579 4590 4598 N
+ TH UW P e n/a 34 4579 4590 4592 N
+ TH UW P i n/a 34 4579 4590 4592 N
+ TH UW R b n/a 34 4579 4590 4597 N
+ TH UW R e n/a 34 4579 4590 4597 N
+ TH UW R i n/a 34 4579 4590 4597 N
+ TH UW S b n/a 34 4579 4590 4596 N
+ TH UW S e n/a 34 4579 4590 4596 N
+ TH UW S i n/a 34 4579 4590 4596 N
+ TH UW SH e n/a 34 4579 4590 4596 N
+ TH UW SH i n/a 34 4579 4590 4596 N
+ TH UW SIL e n/a 34 4579 4590 4591 N
+ TH UW T e n/a 34 4579 4590 4592 N
+ TH UW T i n/a 34 4579 4590 4592 N
+ TH UW TH e n/a 34 4579 4590 4596 N
+ TH UW UH b n/a 34 4579 4590 4603 N
+ TH UW UH e n/a 34 4579 4590 4603 N
+ TH UW UW b n/a 34 4579 4590 4604 N
+ TH UW UW e n/a 34 4579 4590 4604 N
+ TH UW V e n/a 34 4579 4590 4596 N
+ TH UW W b n/a 34 4579 4590 4594 N
+ TH UW W e n/a 34 4579 4590 4594 N
+ TH UW W i n/a 34 4579 4590 4594 N
+ TH UW Y b n/a 34 4579 4590 4593 N
+ TH UW Y e n/a 34 4579 4590 4593 N
+ TH UW Z e n/a 34 4579 4590 4595 N
+ TH UW ZH e n/a 34 4579 4590 4596 N
+ TH V AA b n/a 34 4574 4581 4598 N
+ TH V AA e n/a 34 4574 4581 4598 N
+ TH V AE b n/a 34 4574 4581 4600 N
+ TH V AE e n/a 34 4574 4581 4600 N
+ TH V AH b n/a 34 4574 4581 4598 N
+ TH V AH e n/a 34 4574 4581 4600 N
+ TH V AO b n/a 34 4574 4581 4598 N
+ TH V AO e n/a 34 4574 4581 4598 N
+ TH V AW b n/a 34 4574 4581 4599 N
+ TH V AW e n/a 34 4574 4581 4599 N
+ TH V AY b n/a 34 4574 4581 4598 N
+ TH V AY e n/a 34 4574 4581 4598 N
+ TH V B e n/a 34 4574 4581 4592 N
+ TH V CH e n/a 34 4574 4581 4592 N
+ TH V D e n/a 34 4574 4581 4592 N
+ TH V DH e n/a 34 4574 4581 4596 N
+ TH V EH b n/a 34 4574 4581 4600 N
+ TH V EH e n/a 34 4574 4581 4600 N
+ TH V ER b n/a 34 4574 4581 4601 N
+ TH V ER e n/a 34 4574 4581 4601 N
+ TH V EY b n/a 34 4574 4581 4600 N
+ TH V EY e n/a 34 4574 4581 4600 N
+ TH V F e n/a 34 4574 4581 4596 N
+ TH V G e n/a 34 4574 4581 4592 N
+ TH V HH e n/a 34 4574 4581 4596 N
+ TH V IH b n/a 34 4574 4581 4602 N
+ TH V IH e n/a 34 4574 4581 4604 N
+ TH V IY b n/a 34 4574 4581 4604 N
+ TH V IY e n/a 34 4574 4581 4604 N
+ TH V JH e n/a 34 4574 4581 4592 N
+ TH V K e n/a 34 4574 4581 4592 N
+ TH V L b n/a 34 4574 4582 4593 N
+ TH V L e n/a 34 4574 4582 4593 N
+ TH V M e n/a 34 4574 4581 4593 N
+ TH V N e n/a 34 4574 4581 4593 N
+ TH V NG e n/a 34 4574 4581 4593 N
+ TH V OW b n/a 34 4574 4581 4600 N
+ TH V OW e n/a 34 4574 4581 4600 N
+ TH V OY e n/a 34 4574 4581 4598 N
+ TH V P e n/a 34 4574 4581 4592 N
+ TH V R b n/a 34 4574 4582 4597 N
+ TH V R e n/a 34 4574 4582 4597 N
+ TH V R i n/a 34 4574 4582 4597 N
+ TH V S b n/a 34 4574 4581 4596 N
+ TH V S e n/a 34 4574 4581 4596 N
+ TH V SH e n/a 34 4574 4581 4596 N
+ TH V SIL e n/a 34 4574 4581 4591 N
+ TH V T e n/a 34 4574 4581 4592 N
+ TH V TH e n/a 34 4574 4581 4596 N
+ TH V UH b n/a 34 4574 4581 4602 N
+ TH V UH e n/a 34 4574 4581 4604 N
+ TH V UW b n/a 34 4574 4581 4604 N
+ TH V UW e n/a 34 4574 4581 4604 N
+ TH V V e n/a 34 4574 4581 4596 N
+ TH V W b n/a 34 4574 4581 4594 N
+ TH V W e n/a 34 4574 4581 4594 N
+ TH V Y b n/a 34 4574 4581 4593 N
+ TH V Y e n/a 34 4574 4581 4593 N
+ TH V Z e n/a 34 4574 4581 4596 N
+ TH V ZH e n/a 34 4574 4581 4596 N
+ TH W AA b n/a 34 4570 4583 4598 N
+ TH W AE b n/a 34 4570 4583 4600 N
+ TH W AH b n/a 34 4570 4583 4598 N
+ TH W AO b n/a 34 4570 4583 4598 N
+ TH W AW b n/a 34 4570 4583 4599 N
+ TH W AY b n/a 34 4570 4583 4598 N
+ TH W EH b n/a 34 4570 4583 4600 N
+ TH W ER b n/a 34 4570 4583 4601 N
+ TH W EY b n/a 34 4570 4583 4600 N
+ TH W IH b n/a 34 4570 4583 4602 N
+ TH W IY b n/a 34 4570 4583 4604 N
+ TH W L b n/a 34 4570 4583 4593 N
+ TH W OW b n/a 34 4570 4583 4600 N
+ TH W R b n/a 34 4570 4583 4597 N
+ TH W S b n/a 34 4570 4583 4596 N
+ TH W UH b n/a 34 4570 4583 4602 N
+ TH W UW b n/a 34 4570 4583 4604 N
+ TH W W b n/a 34 4570 4583 4594 N
+ TH W Y b n/a 34 4570 4583 4593 N
+ TH Y AA b n/a 34 4571 4589 4598 N
+ TH Y AE b n/a 34 4571 4589 4600 N
+ TH Y AH b n/a 34 4571 4589 4598 N
+ TH Y AO b n/a 34 4571 4589 4598 N
+ TH Y AW b n/a 34 4571 4589 4599 N
+ TH Y AY b n/a 34 4571 4589 4598 N
+ TH Y EH b n/a 34 4571 4589 4600 N
+ TH Y ER b n/a 34 4571 4589 4601 N
+ TH Y EY b n/a 34 4571 4589 4600 N
+ TH Y IH b n/a 34 4571 4589 4603 N
+ TH Y IY b n/a 34 4571 4589 4604 N
+ TH Y L b n/a 34 4571 4587 4593 N
+ TH Y OW b n/a 34 4571 4589 4600 N
+ TH Y R b n/a 34 4571 4587 4597 N
+ TH Y S b n/a 34 4571 4587 4596 N
+ TH Y UH b n/a 34 4571 4589 4603 N
+ TH Y UW b n/a 34 4571 4589 4604 N
+ TH Y W b n/a 34 4571 4587 4594 N
+ TH Y Y b n/a 34 4571 4587 4593 N
+ TH Z AA b n/a 34 4574 4581 4598 N
+ TH Z AE b n/a 34 4574 4581 4600 N
+ TH Z AH b n/a 34 4574 4581 4598 N
+ TH Z AO b n/a 34 4574 4581 4598 N
+ TH Z AW b n/a 34 4574 4581 4599 N
+ TH Z AY b n/a 34 4574 4581 4598 N
+ TH Z EH b n/a 34 4574 4581 4600 N
+ TH Z ER b n/a 34 4574 4581 4601 N
+ TH Z EY b n/a 34 4574 4581 4600 N
+ TH Z IH b n/a 34 4574 4581 4602 N
+ TH Z IY b n/a 34 4574 4581 4604 N
+ TH Z L b n/a 34 4574 4582 4593 N
+ TH Z OW b n/a 34 4574 4581 4600 N
+ TH Z R b n/a 34 4574 4582 4597 N
+ TH Z S b n/a 34 4574 4581 4596 N
+ TH Z UH b n/a 34 4574 4581 4602 N
+ TH Z UW b n/a 34 4574 4581 4604 N
+ TH Z W b n/a 34 4574 4581 4594 N
+ TH Z Y b n/a 34 4574 4581 4593 N
+ TH ZH AA b n/a 34 4574 4581 4598 N
+ TH ZH AE b n/a 34 4574 4581 4600 N
+ TH ZH AH b n/a 34 4574 4581 4598 N
+ TH ZH AO b n/a 34 4574 4581 4598 N
+ TH ZH AW b n/a 34 4574 4581 4599 N
+ TH ZH AY b n/a 34 4574 4581 4598 N
+ TH ZH EH b n/a 34 4574 4581 4600 N
+ TH ZH ER b n/a 34 4574 4581 4601 N
+ TH ZH EY b n/a 34 4574 4581 4600 N
+ TH ZH IH b n/a 34 4574 4581 4602 N
+ TH ZH IY b n/a 34 4574 4581 4604 N
+ TH ZH L b n/a 34 4574 4582 4593 N
+ TH ZH OW b n/a 34 4574 4581 4600 N
+ TH ZH R b n/a 34 4574 4582 4597 N
+ TH ZH S b n/a 34 4574 4581 4596 N
+ TH ZH UH b n/a 34 4574 4581 4602 N
+ TH ZH UW b n/a 34 4574 4581 4604 N
+ TH ZH W b n/a 34 4574 4581 4594 N
+ TH ZH Y b n/a 34 4574 4581 4593 N
+ UH AA B b n/a 35 4613 4627 4639 N
+ UH AA D b n/a 35 4613 4627 4639 N
+ UH AA K b n/a 35 4619 4624 4644 N
+ UH AA L b n/a 35 4619 4633 4635 N
+ UH AA R b n/a 35 4619 4632 4635 N
+ UH AE B b n/a 35 4612 4627 4639 N
+ UH AE D b n/a 35 4612 4627 4639 N
+ UH AE K b n/a 35 4612 4624 4644 N
+ UH AE L b n/a 35 4612 4634 4635 N
+ UH AE R b n/a 35 4612 4632 4635 N
+ UH AE R i n/a 35 4612 4632 4635 N
+ UH AH B b n/a 35 4612 4627 4639 N
+ UH AH D b n/a 35 4612 4627 4639 N
+ UH AH K b n/a 35 4612 4624 4644 N
+ UH AH K i n/a 35 4612 4624 4644 N
+ UH AH L b n/a 35 4612 4634 4635 N
+ UH AH R b n/a 35 4612 4632 4635 N
+ UH AO B b n/a 35 4613 4630 4639 N
+ UH AO D b n/a 35 4613 4630 4639 N
+ UH AO K b n/a 35 4619 4624 4644 N
+ UH AO L b n/a 35 4619 4633 4635 N
+ UH AO R b n/a 35 4619 4632 4635 N
+ UH AW B b n/a 35 4613 4627 4639 N
+ UH AW D b n/a 35 4613 4627 4639 N
+ UH AW K b n/a 35 4619 4624 4644 N
+ UH AW L b n/a 35 4619 4632 4635 N
+ UH AW R b n/a 35 4619 4632 4635 N
+ UH AY B b n/a 35 4612 4627 4639 N
+ UH AY D b n/a 35 4612 4627 4639 N
+ UH AY D i n/a 35 4612 4627 4639 N
+ UH AY K b n/a 35 4612 4624 4644 N
+ UH AY K i n/a 35 4612 4624 4644 N
+ UH AY L b n/a 35 4612 4634 4636 N
+ UH AY R b n/a 35 4612 4634 4636 N
+ UH B B b n/a 35 4614 4628 4641 N
+ UH B CH i n/a 35 4614 4621 4641 N
+ UH B D b n/a 35 4614 4628 4641 N
+ UH B D i n/a 35 4614 4628 4641 N
+ UH B G i n/a 35 4614 4628 4643 N
+ UH B K b n/a 35 4614 4624 4643 N
+ UH B K i n/a 35 4614 4624 4643 N
+ UH B L b n/a 35 4616 4631 4638 N
+ UH B L i n/a 35 4616 4631 4638 N
+ UH B M i n/a 35 4614 4625 4637 N
+ UH B N i n/a 35 4614 4621 4642 N
+ UH B R b n/a 35 4612 4633 4635 N
+ UH B R i n/a 35 4612 4633 4635 N
+ UH B S i n/a 35 4614 4621 4642 N
+ UH B SH i n/a 35 4614 4621 4642 N
+ UH B T i n/a 35 4614 4621 4642 N
+ UH B Z i n/a 35 4614 4621 4642 N
+ UH CH B b n/a 35 4607 4626 4639 N
+ UH CH D b n/a 35 4607 4626 4639 N
+ UH CH K b n/a 35 4606 4624 4644 N
+ UH CH K i n/a 35 4606 4624 4644 N
+ UH CH L b n/a 35 4608 4633 4636 N
+ UH CH L i n/a 35 4608 4633 4636 N
+ UH CH M i n/a 35 4607 4625 4637 N
+ UH CH N i n/a 35 4607 4623 4639 N
+ UH CH NG i n/a 35 4607 4623 4637 N
+ UH CH R b n/a 35 4608 4632 4636 N
+ UH CH R i n/a 35 4608 4632 4636 N
+ UH CH S i n/a 35 4607 4623 4639 N
+ UH D B b n/a 35 4614 4629 4640 N
+ UH D D b n/a 35 4614 4629 4640 N
+ UH D K b n/a 35 4614 4624 4643 N
+ UH D L b n/a 35 4616 4633 4635 N
+ UH D L i n/a 35 4616 4633 4635 N
+ UH D N i n/a 35 4614 4622 4640 N
+ UH D R b n/a 35 4612 4633 4635 N
+ UH D R i n/a 35 4612 4633 4635 N
+ UH DH B b n/a 35 4612 4629 4639 N
+ UH DH D b n/a 35 4612 4629 4639 N
+ UH DH K b n/a 35 4612 4623 4643 N
+ UH DH L b n/a 35 4612 4633 4635 N
+ UH DH R b n/a 35 4612 4633 4635 N
+ UH EH B b n/a 35 4612 4627 4639 N
+ UH EH D b n/a 35 4612 4627 4639 N
+ UH EH K b n/a 35 4612 4624 4644 N
+ UH EH L b n/a 35 4612 4634 4635 N
+ UH EH R b n/a 35 4612 4632 4635 N
+ UH ER B b n/a 35 4613 4630 4639 N
+ UH ER D b n/a 35 4613 4630 4639 N
+ UH ER K b n/a 35 4619 4624 4644 N
+ UH ER K i n/a 35 4619 4624 4644 N
+ UH ER L b n/a 35 4619 4633 4635 N
+ UH ER L i n/a 35 4619 4633 4635 N
+ UH ER R b n/a 35 4619 4632 4635 N
+ UH ER R i n/a 35 4619 4632 4635 N
+ UH EY B b n/a 35 4612 4627 4639 N
+ UH EY D b n/a 35 4612 4627 4639 N
+ UH EY K b n/a 35 4612 4624 4644 N
+ UH EY L b n/a 35 4612 4634 4636 N
+ UH EY R b n/a 35 4612 4634 4636 N
+ UH F B b n/a 35 4614 4627 4642 N
+ UH F D b n/a 35 4614 4627 4642 N
+ UH F G i n/a 35 4614 4627 4645 N
+ UH F K b n/a 35 4614 4621 4645 N
+ UH F K i n/a 35 4614 4621 4645 N
+ UH F L b n/a 35 4616 4631 4638 N
+ UH F L i n/a 35 4616 4631 4638 N
+ UH F R b n/a 35 4608 4632 4635 N
+ UH F R i n/a 35 4608 4632 4635 N
+ UH F T i n/a 35 4614 4621 4642 N
+ UH G B b n/a 35 4620 4628 4640 N
+ UH G D b n/a 35 4620 4628 4640 N
+ UH G D i n/a 35 4620 4628 4640 N
+ UH G K b n/a 35 4620 4624 4643 N
+ UH G K i n/a 35 4620 4624 4643 N
+ UH G L b n/a 35 4620 4634 4635 N
+ UH G L i n/a 35 4620 4634 4635 N
+ UH G N i n/a 35 4620 4622 4640 N
+ UH G P i n/a 35 4620 4625 4640 N
+ UH G R b n/a 35 4612 4634 4635 N
+ UH G R i n/a 35 4612 4634 4635 N
+ UH G S i n/a 35 4620 4622 4640 N
+ UH G T i n/a 35 4620 4622 4640 N
+ UH G Z i n/a 35 4620 4622 4640 N
+ UH HH B b n/a 35 4609 4628 4640 N
+ UH HH B i n/a 35 4609 4628 4640 N
+ UH HH D b n/a 35 4609 4628 4640 N
+ UH HH D i n/a 35 4609 4628 4640 N
+ UH HH DH i n/a 35 4609 4624 4637 N
+ UH HH F i n/a 35 4609 4624 4637 N
+ UH HH G i n/a 35 4609 4628 4645 N
+ UH HH K b n/a 35 4609 4624 4643 N
+ UH HH K i n/a 35 4609 4624 4643 N
+ UH HH L b n/a 35 4609 4633 4635 N
+ UH HH L i n/a 35 4609 4633 4635 N
+ UH HH M i n/a 35 4609 4625 4637 N
+ UH HH N i n/a 35 4609 4624 4640 N
+ UH HH R b n/a 35 4608 4632 4635 N
+ UH HH R i n/a 35 4608 4632 4635 N
+ UH HH S i n/a 35 4609 4624 4640 N
+ UH HH SH i n/a 35 4609 4624 4640 N
+ UH HH T i n/a 35 4609 4624 4640 N
+ UH HH V i n/a 35 4609 4624 4637 N
+ UH IH B b n/a 35 4612 4627 4639 N
+ UH IH D b n/a 35 4612 4627 4639 N
+ UH IH K b n/a 35 4612 4624 4644 N
+ UH IH L b n/a 35 4612 4634 4635 N
+ UH IH R b n/a 35 4612 4632 4635 N
+ UH IH R i n/a 35 4612 4632 4635 N
+ UH IH S i n/a 35 4612 4622 4639 N
+ UH IY B b n/a 35 4612 4627 4639 N
+ UH IY D b n/a 35 4612 4627 4639 N
+ UH IY K b n/a 35 4612 4624 4644 N
+ UH IY L b n/a 35 4612 4634 4636 N
+ UH IY L i n/a 35 4612 4634 4636 N
+ UH IY R b n/a 35 4612 4634 4636 N
+ UH IY R i n/a 35 4612 4634 4636 N
+ UH IY SH i n/a 35 4612 4622 4639 N
+ UH JH B b n/a 35 4612 4626 4639 N
+ UH JH D b n/a 35 4612 4626 4639 N
+ UH JH K b n/a 35 4612 4624 4644 N
+ UH JH K i n/a 35 4612 4624 4644 N
+ UH JH L b n/a 35 4612 4633 4636 N
+ UH JH L i n/a 35 4612 4633 4636 N
+ UH JH N i n/a 35 4612 4622 4639 N
+ UH JH NG i n/a 35 4612 4623 4637 N
+ UH JH R b n/a 35 4612 4634 4636 N
+ UH JH R i n/a 35 4612 4634 4636 N
+ UH K B b n/a 35 4610 4627 4639 N
+ UH K B i n/a 35 4610 4627 4639 N
+ UH K D b n/a 35 4610 4627 4639 N
+ UH K D i n/a 35 4610 4627 4639 N
+ UH K DH i n/a 35 4610 4623 4637 N
+ UH K K b n/a 35 4610 4624 4644 N
+ UH K K i n/a 35 4610 4624 4644 N
+ UH K L b n/a 35 4610 4633 4635 N
+ UH K L i n/a 35 4610 4633 4635 N
+ UH K M i n/a 35 4610 4625 4637 N
+ UH K N i n/a 35 4610 4623 4639 N
+ UH K R b n/a 35 4610 4632 4635 N
+ UH K R i n/a 35 4610 4632 4635 N
+ UH K S i n/a 35 4610 4623 4639 N
+ UH K SH i n/a 35 4610 4623 4639 N
+ UH K T i n/a 35 4610 4624 4639 N
+ UH L B b n/a 35 4613 4627 4639 N
+ UH L B i n/a 35 4613 4627 4639 N
+ UH L D b n/a 35 4613 4627 4639 N
+ UH L D i n/a 35 4613 4627 4639 N
+ UH L G i n/a 35 4613 4627 4644 N
+ UH L K b n/a 35 4618 4623 4644 N
+ UH L K i n/a 35 4618 4623 4644 N
+ UH L L b n/a 35 4619 4633 4635 N
+ UH L L i n/a 35 4619 4633 4635 N
+ UH L M i n/a 35 4619 4623 4637 N
+ UH L N i n/a 35 4619 4623 4639 N
+ UH L NG i n/a 35 4619 4623 4637 N
+ UH L R b n/a 35 4619 4632 4635 N
+ UH L R i n/a 35 4619 4632 4635 N
+ UH L S i n/a 35 4619 4623 4639 N
+ UH L SH i n/a 35 4619 4623 4639 N
+ UH L T i n/a 35 4618 4623 4639 N
+ UH L V i n/a 35 4619 4623 4637 N
+ UH M B b n/a 35 4614 4626 4642 N
+ UH M D b n/a 35 4614 4626 4642 N
+ UH M D i n/a 35 4614 4626 4642 N
+ UH M HH i n/a 35 4614 4621 4637 N
+ UH M K b n/a 35 4614 4624 4644 N
+ UH M K i n/a 35 4614 4624 4644 N
+ UH M L b n/a 35 4616 4631 4638 N
+ UH M L i n/a 35 4616 4631 4638 N
+ UH M M i n/a 35 4614 4625 4637 N
+ UH M N i n/a 35 4614 4621 4642 N
+ UH M R b n/a 35 4612 4632 4635 N
+ UH M R i n/a 35 4612 4632 4635 N
+ UH M SH i n/a 35 4614 4621 4642 N
+ UH M TH i n/a 35 4614 4621 4637 N
+ UH N B b n/a 35 4612 4629 4640 N
+ UH N D b n/a 35 4612 4629 4640 N
+ UH N D i n/a 35 4612 4629 4640 N
+ UH N K b n/a 35 4612 4624 4643 N
+ UH N K i n/a 35 4612 4624 4643 N
+ UH N L b n/a 35 4612 4633 4636 N
+ UH N L i n/a 35 4612 4633 4636 N
+ UH N M i n/a 35 4612 4625 4637 N
+ UH N R b n/a 35 4612 4634 4636 N
+ UH N R i n/a 35 4612 4634 4636 N
+ UH N SH i n/a 35 4612 4622 4640 N
+ UH N T i n/a 35 4612 4622 4640 N
+ UH NG B b n/a 35 4612 4627 4639 N
+ UH NG D b n/a 35 4612 4627 4639 N
+ UH NG K b n/a 35 4612 4624 4644 N
+ UH NG L b n/a 35 4612 4633 4635 N
+ UH NG R b n/a 35 4612 4632 4635 N
+ UH NG R i n/a 35 4612 4632 4635 N
+ UH OW B b n/a 35 4613 4630 4639 N
+ UH OW D b n/a 35 4613 4630 4639 N
+ UH OW K b n/a 35 4619 4624 4644 N
+ UH OW L b n/a 35 4619 4632 4635 N
+ UH OW R b n/a 35 4619 4632 4635 N
+ UH OW R i n/a 35 4619 4632 4635 N
+ UH OY B b n/a 35 4612 4630 4639 N
+ UH OY D b n/a 35 4612 4630 4639 N
+ UH OY K b n/a 35 4612 4624 4644 N
+ UH OY L b n/a 35 4612 4634 4636 N
+ UH OY R b n/a 35 4612 4634 4636 N
+ UH P B b n/a 35 4615 4627 4641 N
+ UH P CH i n/a 35 4615 4621 4641 N
+ UH P D b n/a 35 4615 4627 4641 N
+ UH P D i n/a 35 4615 4627 4641 N
+ UH P K b n/a 35 4615 4621 4644 N
+ UH P L b n/a 35 4616 4631 4638 N
+ UH P L i n/a 35 4616 4631 4638 N
+ UH P N i n/a 35 4615 4621 4642 N
+ UH P R b n/a 35 4608 4632 4635 N
+ UH P R i n/a 35 4608 4632 4635 N
+ UH P S i n/a 35 4615 4621 4642 N
+ UH P SH i n/a 35 4615 4621 4642 N
+ UH P T i n/a 35 4615 4621 4642 N
+ UH R AA e n/a 35 4619 4633 4635 N
+ UH R AE e n/a 35 4619 4623 4637 N
+ UH R AH e n/a 35 4619 4623 4637 N
+ UH R AO e n/a 35 4619 4633 4635 N
+ UH R AW e n/a 35 4619 4623 4637 N
+ UH R AY e n/a 35 4619 4633 4635 N
+ UH R B b n/a 35 4613 4627 4639 N
+ UH R B e n/a 35 4613 4627 4639 N
+ UH R B i n/a 35 4613 4627 4639 N
+ UH R CH e n/a 35 4619 4623 4639 N
+ UH R D b n/a 35 4613 4627 4639 N
+ UH R D e n/a 35 4613 4627 4639 N
+ UH R D i n/a 35 4613 4627 4639 N
+ UH R DH e n/a 35 4619 4623 4637 N
+ UH R EH e n/a 35 4619 4623 4637 N
+ UH R ER e n/a 35 4619 4632 4635 N
+ UH R EY e n/a 35 4619 4623 4637 N
+ UH R F e n/a 35 4619 4623 4637 N
+ UH R F i n/a 35 4619 4623 4637 N
+ UH R G e n/a 35 4613 4627 4644 N
+ UH R G i n/a 35 4613 4627 4644 N
+ UH R HH e n/a 35 4619 4623 4637 N
+ UH R IH e n/a 35 4619 4623 4637 N
+ UH R IY e n/a 35 4619 4623 4637 N
+ UH R JH e n/a 35 4619 4623 4639 N
+ UH R K b n/a 35 4619 4623 4644 N
+ UH R K e n/a 35 4619 4623 4644 N
+ UH R K i n/a 35 4619 4623 4644 N
+ UH R L b n/a 35 4619 4633 4635 N
+ UH R L e n/a 35 4619 4633 4635 N
+ UH R L i n/a 35 4619 4633 4635 N
+ UH R M e n/a 35 4619 4623 4637 N
+ UH R M i n/a 35 4619 4623 4637 N
+ UH R N e n/a 35 4619 4623 4639 N
+ UH R N i n/a 35 4619 4623 4639 N
+ UH R NG e n/a 35 4619 4623 4637 N
+ UH R OW e n/a 35 4619 4633 4635 N
+ UH R OY e n/a 35 4619 4633 4635 N
+ UH R P e n/a 35 4619 4623 4639 N
+ UH R R b n/a 35 4619 4632 4635 N
+ UH R R e n/a 35 4619 4632 4635 N
+ UH R R i n/a 35 4619 4632 4635 N
+ UH R S e n/a 35 4619 4623 4639 N
+ UH R S i n/a 35 4619 4623 4639 N
+ UH R SH e n/a 35 4619 4623 4639 N
+ UH R SIL e n/a 35 4619 4623 4637 N
+ UH R T e n/a 35 4619 4623 4639 N
+ UH R T i n/a 35 4619 4623 4639 N
+ UH R TH e n/a 35 4619 4623 4637 N
+ UH R UH e n/a 35 4619 4633 4635 N
+ UH R UW e n/a 35 4619 4633 4635 N
+ UH R V e n/a 35 4619 4623 4637 N
+ UH R W e n/a 35 4619 4633 4635 N
+ UH R Y e n/a 35 4619 4623 4637 N
+ UH R Z e n/a 35 4619 4623 4639 N
+ UH R Z i n/a 35 4619 4623 4639 N
+ UH R ZH e n/a 35 4619 4623 4639 N
+ UH S AA e n/a 35 4608 4633 4635 N
+ UH S AE e n/a 35 4608 4622 4637 N
+ UH S AH e n/a 35 4608 4622 4637 N
+ UH S AO e n/a 35 4608 4633 4635 N
+ UH S AW e n/a 35 4608 4622 4637 N
+ UH S AY e n/a 35 4608 4633 4635 N
+ UH S B b n/a 35 4606 4629 4639 N
+ UH S B e n/a 35 4606 4629 4639 N
+ UH S CH e n/a 35 4605 4622 4639 N
+ UH S D b n/a 35 4605 4629 4639 N
+ UH S D e n/a 35 4605 4629 4639 N
+ UH S DH e n/a 35 4606 4622 4637 N
+ UH S EH e n/a 35 4608 4622 4637 N
+ UH S ER e n/a 35 4608 4632 4635 N
+ UH S EY e n/a 35 4608 4622 4637 N
+ UH S F e n/a 35 4606 4622 4637 N
+ UH S G e n/a 35 4605 4629 4645 N
+ UH S HH e n/a 35 4605 4622 4637 N
+ UH S IH e n/a 35 4608 4622 4637 N
+ UH S IY e n/a 35 4608 4622 4637 N
+ UH S JH e n/a 35 4605 4622 4639 N
+ UH S K b n/a 35 4605 4622 4645 N
+ UH S K e n/a 35 4605 4622 4645 N
+ UH S K i n/a 35 4605 4622 4645 N
+ UH S L b n/a 35 4608 4633 4635 N
+ UH S L e n/a 35 4608 4633 4635 N
+ UH S M e n/a 35 4606 4622 4637 N
+ UH S N e n/a 35 4606 4622 4639 N
+ UH S N i n/a 35 4606 4622 4639 N
+ UH S NG e n/a 35 4605 4622 4637 N
+ UH S OW e n/a 35 4608 4633 4635 N
+ UH S OY e n/a 35 4608 4633 4635 N
+ UH S P e n/a 35 4606 4622 4639 N
+ UH S P i n/a 35 4606 4622 4639 N
+ UH S R b n/a 35 4608 4632 4635 N
+ UH S R e n/a 35 4608 4632 4635 N
+ UH S R i n/a 35 4608 4632 4635 N
+ UH S S e n/a 35 4605 4622 4639 N
+ UH S SH e n/a 35 4605 4622 4639 N
+ UH S SIL e n/a 35 4605 4622 4637 N
+ UH S T e n/a 35 4605 4622 4639 N
+ UH S T i n/a 35 4605 4622 4639 N
+ UH S TH e n/a 35 4605 4622 4637 N
+ UH S UH e n/a 35 4608 4633 4635 N
+ UH S UW e n/a 35 4608 4633 4635 N
+ UH S V e n/a 35 4606 4622 4637 N
+ UH S W e n/a 35 4608 4633 4635 N
+ UH S Y e n/a 35 4608 4622 4637 N
+ UH S Z e n/a 35 4606 4622 4639 N
+ UH S ZH e n/a 35 4605 4622 4639 N
+ UH SH B b n/a 35 4607 4626 4639 N
+ UH SH D b n/a 35 4607 4626 4639 N
+ UH SH D i n/a 35 4607 4626 4639 N
+ UH SH F i n/a 35 4607 4623 4637 N
+ UH SH G i n/a 35 4607 4626 4645 N
+ UH SH K b n/a 35 4606 4623 4645 N
+ UH SH K i n/a 35 4606 4623 4645 N
+ UH SH L b n/a 35 4608 4633 4636 N
+ UH SH L i n/a 35 4608 4633 4636 N
+ UH SH R b n/a 35 4608 4632 4635 N
+ UH SH R i n/a 35 4608 4632 4635 N
+ UH SIL B b n/a 35 4607 4627 4639 N
+ UH SIL D b n/a 35 4607 4627 4639 N
+ UH SIL K b n/a 35 4606 4624 4643 N
+ UH SIL L b n/a 35 4608 4633 4635 N
+ UH SIL R b n/a 35 4608 4632 4635 N
+ UH T B b n/a 35 4606 4629 4640 N
+ UH T B i n/a 35 4606 4629 4640 N
+ UH T D b n/a 35 4605 4629 4640 N
+ UH T D i n/a 35 4605 4629 4640 N
+ UH T JH i n/a 35 4606 4622 4640 N
+ UH T K b n/a 35 4606 4622 4645 N
+ UH T K i n/a 35 4606 4622 4645 N
+ UH T L b n/a 35 4608 4633 4635 N
+ UH T L i n/a 35 4608 4633 4635 N
+ UH T N i n/a 35 4606 4622 4640 N
+ UH T R b n/a 35 4608 4632 4635 N
+ UH T R i n/a 35 4608 4632 4635 N
+ UH T SH i n/a 35 4606 4622 4640 N
+ UH T T i n/a 35 4605 4622 4640 N
+ UH TH B b n/a 35 4606 4629 4639 N
+ UH TH D b n/a 35 4605 4629 4639 N
+ UH TH K b n/a 35 4605 4622 4645 N
+ UH TH L b n/a 35 4608 4633 4635 N
+ UH TH R b n/a 35 4608 4632 4635 N
+ UH TH R i n/a 35 4608 4632 4635 N
+ UH UH B b n/a 35 4613 4630 4639 N
+ UH UH D b n/a 35 4613 4630 4639 N
+ UH UH K b n/a 35 4619 4624 4644 N
+ UH UH L b n/a 35 4619 4633 4635 N
+ UH UH R b n/a 35 4619 4632 4635 N
+ UH UW B b n/a 35 4613 4630 4639 N
+ UH UW D b n/a 35 4613 4630 4639 N
+ UH UW K b n/a 35 4619 4624 4644 N
+ UH UW L b n/a 35 4619 4632 4635 N
+ UH UW L i n/a 35 4619 4632 4635 N
+ UH UW R b n/a 35 4619 4632 4635 N
+ UH UW R i n/a 35 4619 4632 4635 N
+ UH V B b n/a 35 4614 4626 4642 N
+ UH V D b n/a 35 4614 4626 4642 N
+ UH V K b n/a 35 4614 4623 4644 N
+ UH V L b n/a 35 4616 4631 4638 N
+ UH V L i n/a 35 4616 4631 4638 N
+ UH V M i n/a 35 4614 4625 4637 N
+ UH V R b n/a 35 4612 4632 4635 N
+ UH V R i n/a 35 4612 4632 4635 N
+ UH V T i n/a 35 4614 4621 4642 N
+ UH W B b n/a 35 4613 4630 4641 N
+ UH W D b n/a 35 4613 4630 4641 N
+ UH W D i n/a 35 4613 4630 4641 N
+ UH W F i n/a 35 4617 4621 4637 N
+ UH W G i n/a 35 4613 4630 4644 N
+ UH W K b n/a 35 4618 4624 4644 N
+ UH W L b n/a 35 4619 4632 4638 N
+ UH W L i n/a 35 4619 4632 4638 N
+ UH W M i n/a 35 4617 4625 4637 N
+ UH W N i n/a 35 4618 4621 4641 N
+ UH W P i n/a 35 4617 4625 4641 N
+ UH W R b n/a 35 4617 4632 4635 N
+ UH W R i n/a 35 4617 4632 4635 N
+ UH W S i n/a 35 4618 4621 4641 N
+ UH W SH i n/a 35 4618 4621 4641 N
+ UH W Z i n/a 35 4618 4621 4641 N
+ UH Y AA e n/a 35 4611 4634 4636 N
+ UH Y AE e n/a 35 4612 4622 4637 N
+ UH Y AH e n/a 35 4612 4622 4637 N
+ UH Y AO e n/a 35 4611 4634 4636 N
+ UH Y AW e n/a 35 4612 4622 4637 N
+ UH Y AY e n/a 35 4611 4634 4636 N
+ UH Y B b n/a 35 4612 4626 4639 N
+ UH Y B e n/a 35 4612 4626 4639 N
+ UH Y CH e n/a 35 4612 4622 4639 N
+ UH Y D b n/a 35 4612 4626 4639 N
+ UH Y D e n/a 35 4612 4626 4639 N
+ UH Y D i n/a 35 4612 4626 4639 N
+ UH Y DH e n/a 35 4612 4622 4637 N
+ UH Y EH e n/a 35 4612 4622 4637 N
+ UH Y ER e n/a 35 4611 4634 4636 N
+ UH Y EY e n/a 35 4612 4622 4637 N
+ UH Y F e n/a 35 4612 4622 4637 N
+ UH Y G e n/a 35 4612 4626 4644 N
+ UH Y HH e n/a 35 4612 4622 4637 N
+ UH Y IH e n/a 35 4612 4622 4637 N
+ UH Y IH i n/a 35 4612 4622 4637 N
+ UH Y IY e n/a 35 4612 4622 4637 N
+ UH Y JH e n/a 35 4612 4622 4639 N
+ UH Y K b n/a 35 4612 4624 4644 N
+ UH Y K e n/a 35 4612 4624 4644 N
+ UH Y K i n/a 35 4612 4624 4644 N
+ UH Y L b n/a 35 4611 4634 4636 N
+ UH Y L e n/a 35 4611 4634 4636 N
+ UH Y M e n/a 35 4612 4625 4637 N
+ UH Y N e n/a 35 4612 4622 4639 N
+ UH Y NG e n/a 35 4612 4624 4637 N
+ UH Y NG i n/a 35 4612 4624 4637 N
+ UH Y OW e n/a 35 4611 4634 4636 N
+ UH Y OY e n/a 35 4611 4634 4636 N
+ UH Y P e n/a 35 4612 4625 4639 N
+ UH Y R b n/a 35 4611 4634 4636 N
+ UH Y R e n/a 35 4611 4634 4636 N
+ UH Y R i n/a 35 4611 4634 4636 N
+ UH Y S e n/a 35 4612 4622 4639 N
+ UH Y SH e n/a 35 4612 4622 4639 N
+ UH Y SIL e n/a 35 4612 4622 4637 N
+ UH Y T e n/a 35 4612 4622 4639 N
+ UH Y TH e n/a 35 4612 4622 4637 N
+ UH Y UH e n/a 35 4611 4634 4636 N
+ UH Y UW e n/a 35 4611 4634 4636 N
+ UH Y V e n/a 35 4612 4622 4637 N
+ UH Y W e n/a 35 4611 4634 4636 N
+ UH Y Y e n/a 35 4612 4622 4637 N
+ UH Y Z e n/a 35 4612 4622 4639 N
+ UH Y ZH e n/a 35 4612 4622 4639 N
+ UH Z B b n/a 35 4612 4629 4639 N
+ UH Z D b n/a 35 4612 4629 4639 N
+ UH Z F i n/a 35 4612 4622 4637 N
+ UH Z G i n/a 35 4612 4629 4643 N
+ UH Z K b n/a 35 4612 4623 4643 N
+ UH Z K i n/a 35 4612 4623 4643 N
+ UH Z L b n/a 35 4612 4633 4635 N
+ UH Z L i n/a 35 4612 4633 4635 N
+ UH Z N i n/a 35 4612 4622 4639 N
+ UH Z R b n/a 35 4612 4633 4635 N
+ UH Z R i n/a 35 4612 4633 4635 N
+ UH Z Z i n/a 35 4612 4622 4639 N
+ UH ZH B b n/a 35 4612 4626 4639 N
+ UH ZH D b n/a 35 4612 4626 4639 N
+ UH ZH K b n/a 35 4612 4623 4644 N
+ UH ZH L b n/a 35 4612 4633 4636 N
+ UH ZH R b n/a 35 4612 4632 4635 N
+ UH ZH R i n/a 35 4612 4632 4635 N
+ UW AA AA e n/a 36 4651 4682 4739 N
+ UW AA AA i n/a 36 4651 4682 4739 N
+ UW AA AA s n/a 36 4651 4682 4739 N
+ UW AA AE e n/a 36 4651 4682 4743 N
+ UW AA AE s n/a 36 4651 4682 4743 N
+ UW AA AH b n/a 36 4651 4682 4740 N
+ UW AA AH e n/a 36 4651 4682 4740 N
+ UW AA AH i n/a 36 4651 4682 4742 N
+ UW AA AH s n/a 36 4651 4682 4740 N
+ UW AA AO e n/a 36 4651 4682 4739 N
+ UW AA AO s n/a 36 4651 4682 4739 N
+ UW AA AW e n/a 36 4651 4682 4743 N
+ UW AA AW s n/a 36 4651 4682 4743 N
+ UW AA AY e n/a 36 4651 4682 4739 N
+ UW AA AY s n/a 36 4651 4682 4739 N
+ UW AA B b n/a 36 4651 4683 4715 N
+ UW AA B e n/a 36 4651 4683 4715 N
+ UW AA B s n/a 36 4651 4683 4715 N
+ UW AA CH b n/a 36 4651 4683 4717 N
+ UW AA CH e n/a 36 4651 4683 4717 N
+ UW AA CH i n/a 36 4651 4683 4717 N
+ UW AA CH s n/a 36 4651 4683 4717 N
+ UW AA D b n/a 36 4651 4685 4717 N
+ UW AA D e n/a 36 4651 4685 4717 N
+ UW AA D s n/a 36 4651 4685 4717 N
+ UW AA DH e n/a 36 4651 4685 4719 N
+ UW AA DH s n/a 36 4651 4685 4719 N
+ UW AA EH e n/a 36 4651 4682 4743 N
+ UW AA EH s n/a 36 4651 4682 4743 N
+ UW AA ER b n/a 36 4651 4682 4739 N
+ UW AA ER e n/a 36 4651 4682 4739 N
+ UW AA ER i n/a 36 4651 4682 4741 N
+ UW AA ER s n/a 36 4651 4682 4739 N
+ UW AA EY b n/a 36 4651 4682 4743 N
+ UW AA EY e n/a 36 4651 4682 4743 N
+ UW AA EY s n/a 36 4651 4682 4743 N
+ UW AA F b n/a 36 4651 4682 4734 N
+ UW AA F e n/a 36 4651 4682 4734 N
+ UW AA F s n/a 36 4651 4682 4734 N
+ UW AA G b n/a 36 4651 4683 4715 N
+ UW AA G e n/a 36 4651 4683 4715 N
+ UW AA G s n/a 36 4651 4683 4715 N
+ UW AA HH e n/a 36 4651 4682 4731 N
+ UW AA HH s n/a 36 4651 4682 4731 N
+ UW AA IH b n/a 36 4651 4682 4745 N
+ UW AA IH e n/a 36 4651 4682 4745 N
+ UW AA IH s n/a 36 4651 4682 4745 N
+ UW AA IY b n/a 36 4651 4682 4745 N
+ UW AA IY e n/a 36 4651 4682 4745 N
+ UW AA IY i n/a 36 4651 4682 4745 N
+ UW AA IY s n/a 36 4651 4682 4745 N
+ UW AA JH e n/a 36 4651 4683 4717 N
+ UW AA JH i n/a 36 4651 4683 4717 N
+ UW AA JH s n/a 36 4651 4683 4717 N
+ UW AA K b n/a 36 4651 4683 4715 N
+ UW AA K e n/a 36 4651 4683 4715 N
+ UW AA K s n/a 36 4651 4683 4715 N
+ UW AA L b n/a 36 4651 4682 4737 N
+ UW AA L e n/a 36 4651 4682 4729 N
+ UW AA L i n/a 36 4651 4682 4737 N
+ UW AA L s n/a 36 4651 4682 4737 N
+ UW AA M b n/a 36 4651 4682 4726 N
+ UW AA M e n/a 36 4651 4682 4726 N
+ UW AA M s n/a 36 4651 4682 4726 N
+ UW AA N b n/a 36 4651 4685 4725 N
+ UW AA N e n/a 36 4651 4685 4725 N
+ UW AA N i n/a 36 4651 4685 4725 N
+ UW AA N s n/a 36 4651 4685 4725 N
+ UW AA NG b n/a 36 4651 4682 4726 N
+ UW AA NG e n/a 36 4651 4682 4726 N
+ UW AA NG i n/a 36 4651 4682 4726 N
+ UW AA NG s n/a 36 4651 4682 4726 N
+ UW AA OW e n/a 36 4651 4682 4739 N
+ UW AA OW s n/a 36 4651 4682 4739 N
+ UW AA OY e n/a 36 4651 4682 4739 N
+ UW AA OY s n/a 36 4651 4682 4739 N
+ UW AA P b n/a 36 4651 4683 4715 N
+ UW AA P e n/a 36 4651 4683 4715 N
+ UW AA P s n/a 36 4651 4683 4715 N
+ UW AA R e n/a 36 4651 4682 4729 N
+ UW AA R s n/a 36 4651 4682 4738 N
+ UW AA S b n/a 36 4651 4685 4721 N
+ UW AA S e n/a 36 4651 4685 4721 N
+ UW AA S s n/a 36 4651 4685 4721 N
+ UW AA SH e n/a 36 4651 4685 4735 N
+ UW AA SH s n/a 36 4651 4685 4735 N
+ UW AA SIL e n/a 36 4651 4682 4733 N
+ UW AA SIL s n/a 36 4651 4682 4733 N
+ UW AA T b n/a 36 4651 4685 4717 N
+ UW AA T e n/a 36 4651 4685 4717 N
+ UW AA T i n/a 36 4651 4685 4717 N
+ UW AA T s n/a 36 4651 4685 4717 N
+ UW AA TH e n/a 36 4651 4685 4722 N
+ UW AA TH s n/a 36 4651 4685 4722 N
+ UW AA UH e n/a 36 4651 4682 4739 N
+ UW AA UH s n/a 36 4651 4682 4739 N
+ UW AA UW b n/a 36 4651 4682 4739 N
+ UW AA UW e n/a 36 4651 4682 4739 N
+ UW AA UW s n/a 36 4651 4682 4739 N
+ UW AA V b n/a 36 4651 4682 4729 N
+ UW AA V e n/a 36 4651 4682 4729 N
+ UW AA V s n/a 36 4651 4682 4729 N
+ UW AA W b n/a 36 4651 4682 4739 N
+ UW AA W e n/a 36 4651 4682 4732 N
+ UW AA W s n/a 36 4651 4682 4739 N
+ UW AA Y b n/a 36 4651 4682 4745 N
+ UW AA Y e n/a 36 4651 4682 4736 N
+ UW AA Y s n/a 36 4651 4682 4745 N
+ UW AA Z b n/a 36 4651 4685 4723 N
+ UW AA Z e n/a 36 4651 4685 4723 N
+ UW AA Z i n/a 36 4651 4685 4723 N
+ UW AA Z s n/a 36 4651 4685 4723 N
+ UW AA ZH e n/a 36 4651 4685 4735 N
+ UW AA ZH s n/a 36 4651 4685 4735 N
+ UW AE AA e n/a 36 4664 4710 4739 N
+ UW AE AA s n/a 36 4664 4710 4739 N
+ UW AE AE e n/a 36 4664 4710 4743 N
+ UW AE AE s n/a 36 4664 4710 4743 N
+ UW AE AH b n/a 36 4664 4710 4740 N
+ UW AE AH e n/a 36 4664 4710 4740 N
+ UW AE AH s n/a 36 4664 4710 4740 N
+ UW AE AO e n/a 36 4664 4710 4739 N
+ UW AE AO s n/a 36 4664 4710 4739 N
+ UW AE AW e n/a 36 4664 4710 4743 N
+ UW AE AW s n/a 36 4664 4710 4743 N
+ UW AE AY e n/a 36 4664 4710 4739 N
+ UW AE AY s n/a 36 4664 4710 4739 N
+ UW AE B b n/a 36 4668 4683 4715 N
+ UW AE B e n/a 36 4668 4683 4715 N
+ UW AE B i n/a 36 4668 4683 4715 N
+ UW AE B s n/a 36 4668 4683 4715 N
+ UW AE CH b n/a 36 4667 4683 4718 N
+ UW AE CH e n/a 36 4667 4683 4718 N
+ UW AE CH s n/a 36 4667 4683 4718 N
+ UW AE D b n/a 36 4667 4685 4718 N
+ UW AE D e n/a 36 4667 4685 4718 N
+ UW AE D s n/a 36 4667 4685 4718 N
+ UW AE DH e n/a 36 4667 4685 4719 N
+ UW AE DH s n/a 36 4667 4685 4719 N
+ UW AE EH e n/a 36 4664 4710 4743 N
+ UW AE EH s n/a 36 4664 4710 4743 N
+ UW AE ER b n/a 36 4664 4710 4739 N
+ UW AE ER e n/a 36 4664 4710 4739 N
+ UW AE ER s n/a 36 4664 4710 4739 N
+ UW AE EY b n/a 36 4664 4710 4743 N
+ UW AE EY e n/a 36 4664 4710 4743 N
+ UW AE EY s n/a 36 4664 4710 4743 N
+ UW AE F b n/a 36 4668 4682 4734 N
+ UW AE F e n/a 36 4668 4682 4734 N
+ UW AE F s n/a 36 4668 4682 4734 N
+ UW AE G b n/a 36 4667 4683 4715 N
+ UW AE G e n/a 36 4667 4683 4715 N
+ UW AE G s n/a 36 4667 4683 4715 N
+ UW AE HH e n/a 36 4667 4683 4731 N
+ UW AE HH s n/a 36 4667 4683 4731 N
+ UW AE IH b n/a 36 4664 4710 4745 N
+ UW AE IH e n/a 36 4664 4710 4745 N
+ UW AE IH s n/a 36 4664 4710 4745 N
+ UW AE IY b n/a 36 4664 4710 4745 N
+ UW AE IY e n/a 36 4664 4710 4745 N
+ UW AE IY s n/a 36 4664 4710 4745 N
+ UW AE JH e n/a 36 4667 4683 4718 N
+ UW AE JH s n/a 36 4667 4683 4717 N
+ UW AE K b n/a 36 4667 4683 4715 N
+ UW AE K e n/a 36 4667 4683 4715 N
+ UW AE K s n/a 36 4667 4683 4715 N
+ UW AE L b n/a 36 4664 4709 4737 N
+ UW AE L e n/a 36 4664 4709 4729 N
+ UW AE L i n/a 36 4665 4709 4737 N
+ UW AE L s n/a 36 4664 4709 4737 N
+ UW AE M b n/a 36 4668 4683 4726 N
+ UW AE M e n/a 36 4668 4683 4726 N
+ UW AE M s n/a 36 4668 4683 4726 N
+ UW AE N b n/a 36 4667 4685 4725 N
+ UW AE N e n/a 36 4667 4685 4725 N
+ UW AE N s n/a 36 4667 4685 4725 N
+ UW AE NG b n/a 36 4667 4683 4726 N
+ UW AE NG e n/a 36 4667 4683 4726 N
+ UW AE NG s n/a 36 4667 4683 4726 N
+ UW AE OW e n/a 36 4664 4710 4739 N
+ UW AE OW s n/a 36 4664 4710 4739 N
+ UW AE OY e n/a 36 4664 4710 4739 N
+ UW AE OY s n/a 36 4664 4710 4739 N
+ UW AE P b n/a 36 4668 4683 4715 N
+ UW AE P e n/a 36 4668 4683 4715 N
+ UW AE P s n/a 36 4668 4683 4715 N
+ UW AE R e n/a 36 4664 4709 4729 N
+ UW AE R s n/a 36 4664 4709 4738 N
+ UW AE S b n/a 36 4667 4685 4721 N
+ UW AE S e n/a 36 4667 4685 4721 N
+ UW AE S s n/a 36 4667 4685 4721 N
+ UW AE SH e n/a 36 4667 4685 4735 N
+ UW AE SH s n/a 36 4667 4685 4735 N
+ UW AE SIL e n/a 36 4667 4682 4733 N
+ UW AE SIL s n/a 36 4667 4682 4733 N
+ UW AE T b n/a 36 4667 4685 4718 N
+ UW AE T e n/a 36 4667 4685 4718 N
+ UW AE T s n/a 36 4667 4685 4718 N
+ UW AE TH e n/a 36 4667 4685 4722 N
+ UW AE TH s n/a 36 4667 4685 4722 N
+ UW AE UH e n/a 36 4664 4710 4739 N
+ UW AE UH s n/a 36 4664 4710 4739 N
+ UW AE UW b n/a 36 4664 4710 4739 N
+ UW AE UW e n/a 36 4664 4710 4739 N
+ UW AE UW s n/a 36 4664 4710 4739 N
+ UW AE V b n/a 36 4668 4683 4729 N
+ UW AE V e n/a 36 4668 4683 4729 N
+ UW AE V s n/a 36 4668 4683 4729 N
+ UW AE W b n/a 36 4664 4709 4739 N
+ UW AE W e n/a 36 4664 4709 4732 N
+ UW AE W s n/a 36 4664 4709 4739 N
+ UW AE Y b n/a 36 4664 4702 4745 N
+ UW AE Y e n/a 36 4664 4702 4736 N
+ UW AE Y s n/a 36 4664 4702 4745 N
+ UW AE Z b n/a 36 4667 4685 4723 N
+ UW AE Z e n/a 36 4667 4685 4723 N
+ UW AE Z s n/a 36 4667 4685 4723 N
+ UW AE ZH e n/a 36 4667 4685 4735 N
+ UW AE ZH s n/a 36 4667 4685 4735 N
+ UW AH AA s n/a 36 4664 4710 4739 N
+ UW AH AE s n/a 36 4664 4710 4743 N
+ UW AH AH b n/a 36 4664 4710 4740 N
+ UW AH AH s n/a 36 4664 4710 4740 N
+ UW AH AO s n/a 36 4664 4710 4739 N
+ UW AH AW s n/a 36 4664 4710 4743 N
+ UW AH AY s n/a 36 4664 4710 4739 N
+ UW AH B b n/a 36 4668 4683 4715 N
+ UW AH B s n/a 36 4668 4683 4715 N
+ UW AH CH b n/a 36 4667 4683 4718 N
+ UW AH CH s n/a 36 4667 4683 4718 N
+ UW AH D b n/a 36 4667 4685 4718 N
+ UW AH D s n/a 36 4667 4685 4718 N
+ UW AH DH s n/a 36 4667 4685 4719 N
+ UW AH EH s n/a 36 4664 4710 4743 N
+ UW AH ER b n/a 36 4664 4710 4739 N
+ UW AH ER s n/a 36 4664 4710 4739 N
+ UW AH EY b n/a 36 4664 4710 4743 N
+ UW AH EY s n/a 36 4664 4710 4743 N
+ UW AH F b n/a 36 4668 4682 4734 N
+ UW AH F s n/a 36 4668 4682 4734 N
+ UW AH G b n/a 36 4667 4683 4715 N
+ UW AH G s n/a 36 4667 4683 4715 N
+ UW AH HH s n/a 36 4667 4683 4731 N
+ UW AH IH b n/a 36 4664 4710 4745 N
+ UW AH IH s n/a 36 4664 4710 4745 N
+ UW AH IY b n/a 36 4664 4710 4745 N
+ UW AH IY s n/a 36 4664 4710 4745 N
+ UW AH JH s n/a 36 4667 4683 4717 N
+ UW AH K b n/a 36 4667 4683 4715 N
+ UW AH K s n/a 36 4667 4683 4715 N
+ UW AH L b n/a 36 4664 4709 4737 N
+ UW AH L s n/a 36 4664 4709 4737 N
+ UW AH M b n/a 36 4668 4683 4726 N
+ UW AH M s n/a 36 4668 4683 4726 N
+ UW AH N b n/a 36 4667 4685 4725 N
+ UW AH N s n/a 36 4667 4685 4725 N
+ UW AH NG b n/a 36 4667 4683 4726 N
+ UW AH NG s n/a 36 4667 4683 4726 N
+ UW AH OW s n/a 36 4664 4710 4739 N
+ UW AH OY s n/a 36 4664 4710 4739 N
+ UW AH P b n/a 36 4668 4683 4715 N
+ UW AH P s n/a 36 4668 4683 4715 N
+ UW AH R s n/a 36 4664 4709 4738 N
+ UW AH S b n/a 36 4667 4685 4721 N
+ UW AH S s n/a 36 4667 4685 4721 N
+ UW AH SH s n/a 36 4667 4685 4735 N
+ UW AH SIL s n/a 36 4667 4682 4733 N
+ UW AH T b n/a 36 4667 4685 4718 N
+ UW AH T s n/a 36 4667 4685 4718 N
+ UW AH TH s n/a 36 4667 4685 4722 N
+ UW AH UH s n/a 36 4664 4710 4739 N
+ UW AH UW b n/a 36 4664 4710 4739 N
+ UW AH UW i n/a 36 4665 4710 4739 N
+ UW AH UW s n/a 36 4664 4710 4739 N
+ UW AH V b n/a 36 4668 4683 4729 N
+ UW AH V s n/a 36 4668 4683 4729 N
+ UW AH W b n/a 36 4664 4709 4739 N
+ UW AH W s n/a 36 4664 4709 4739 N
+ UW AH Y b n/a 36 4664 4702 4745 N
+ UW AH Y s n/a 36 4664 4702 4745 N
+ UW AH Z b n/a 36 4667 4685 4723 N
+ UW AH Z s n/a 36 4667 4685 4723 N
+ UW AH ZH s n/a 36 4667 4685 4735 N
+ UW AO AA s n/a 36 4651 4682 4739 N
+ UW AO AE s n/a 36 4651 4682 4743 N
+ UW AO AH b n/a 36 4651 4682 4740 N
+ UW AO AH s n/a 36 4651 4682 4740 N
+ UW AO AO s n/a 36 4651 4682 4739 N
+ UW AO AW s n/a 36 4651 4682 4743 N
+ UW AO AY s n/a 36 4651 4682 4739 N
+ UW AO B b n/a 36 4651 4683 4715 N
+ UW AO B s n/a 36 4651 4683 4715 N
+ UW AO CH b n/a 36 4651 4683 4717 N
+ UW AO CH s n/a 36 4651 4683 4717 N
+ UW AO D b n/a 36 4651 4685 4717 N
+ UW AO D s n/a 36 4651 4685 4717 N
+ UW AO DH s n/a 36 4651 4685 4719 N
+ UW AO EH s n/a 36 4651 4682 4743 N
+ UW AO ER b n/a 36 4651 4682 4739 N
+ UW AO ER s n/a 36 4651 4682 4739 N
+ UW AO EY b n/a 36 4651 4682 4743 N
+ UW AO EY s n/a 36 4651 4682 4743 N
+ UW AO F b n/a 36 4651 4682 4734 N
+ UW AO F s n/a 36 4651 4682 4734 N
+ UW AO G b n/a 36 4651 4683 4715 N
+ UW AO G s n/a 36 4651 4683 4715 N
+ UW AO HH s n/a 36 4651 4682 4731 N
+ UW AO IH b n/a 36 4651 4682 4745 N
+ UW AO IH s n/a 36 4651 4682 4745 N
+ UW AO IY b n/a 36 4651 4682 4745 N
+ UW AO IY s n/a 36 4651 4682 4745 N
+ UW AO JH s n/a 36 4651 4683 4717 N
+ UW AO K b n/a 36 4651 4683 4715 N
+ UW AO K s n/a 36 4651 4683 4715 N
+ UW AO L b n/a 36 4651 4682 4737 N
+ UW AO L s n/a 36 4651 4682 4737 N
+ UW AO M b n/a 36 4651 4682 4726 N
+ UW AO M s n/a 36 4651 4682 4726 N
+ UW AO N b n/a 36 4651 4685 4725 N
+ UW AO N s n/a 36 4651 4685 4725 N
+ UW AO NG b n/a 36 4651 4682 4726 N
+ UW AO NG s n/a 36 4651 4682 4726 N
+ UW AO OW s n/a 36 4651 4682 4739 N
+ UW AO OY s n/a 36 4651 4682 4739 N
+ UW AO P b n/a 36 4651 4683 4715 N
+ UW AO P s n/a 36 4651 4683 4715 N
+ UW AO R s n/a 36 4651 4682 4738 N
+ UW AO S b n/a 36 4651 4685 4721 N
+ UW AO S s n/a 36 4651 4685 4721 N
+ UW AO SH s n/a 36 4651 4685 4735 N
+ UW AO SIL s n/a 36 4651 4682 4733 N
+ UW AO T b n/a 36 4651 4685 4717 N
+ UW AO T s n/a 36 4651 4685 4717 N
+ UW AO TH s n/a 36 4651 4685 4722 N
+ UW AO UH s n/a 36 4651 4682 4739 N
+ UW AO UW b n/a 36 4651 4682 4739 N
+ UW AO UW s n/a 36 4651 4682 4739 N
+ UW AO V b n/a 36 4651 4682 4729 N
+ UW AO V s n/a 36 4651 4682 4729 N
+ UW AO W b n/a 36 4651 4682 4739 N
+ UW AO W s n/a 36 4651 4682 4739 N
+ UW AO Y b n/a 36 4651 4682 4745 N
+ UW AO Y s n/a 36 4651 4682 4745 N
+ UW AO Z b n/a 36 4651 4685 4723 N
+ UW AO Z s n/a 36 4651 4685 4723 N
+ UW AO ZH s n/a 36 4651 4685 4735 N
+ UW AW AA s n/a 36 4651 4683 4739 N
+ UW AW AE s n/a 36 4651 4683 4743 N
+ UW AW AH b n/a 36 4651 4683 4740 N
+ UW AW AH s n/a 36 4651 4683 4740 N
+ UW AW AO s n/a 36 4651 4683 4739 N
+ UW AW AW s n/a 36 4651 4683 4743 N
+ UW AW AY s n/a 36 4651 4683 4739 N
+ UW AW B b n/a 36 4651 4683 4715 N
+ UW AW B s n/a 36 4651 4683 4715 N
+ UW AW CH b n/a 36 4651 4683 4717 N
+ UW AW CH s n/a 36 4651 4683 4717 N
+ UW AW D b n/a 36 4651 4685 4717 N
+ UW AW D i n/a 36 4651 4685 4716 N
+ UW AW D s n/a 36 4651 4685 4717 N
+ UW AW DH s n/a 36 4651 4685 4719 N
+ UW AW EH s n/a 36 4651 4683 4743 N
+ UW AW ER b n/a 36 4651 4683 4739 N
+ UW AW ER s n/a 36 4651 4683 4739 N
+ UW AW EY b n/a 36 4651 4683 4743 N
+ UW AW EY s n/a 36 4651 4683 4743 N
+ UW AW F b n/a 36 4651 4682 4734 N
+ UW AW F s n/a 36 4651 4682 4734 N
+ UW AW G b n/a 36 4651 4683 4715 N
+ UW AW G s n/a 36 4651 4683 4715 N
+ UW AW HH s n/a 36 4651 4683 4731 N
+ UW AW IH b n/a 36 4651 4683 4745 N
+ UW AW IH s n/a 36 4651 4683 4745 N
+ UW AW IY b n/a 36 4651 4683 4745 N
+ UW AW IY s n/a 36 4651 4683 4745 N
+ UW AW JH s n/a 36 4651 4683 4717 N
+ UW AW K b n/a 36 4651 4683 4715 N
+ UW AW K s n/a 36 4651 4683 4715 N
+ UW AW L b n/a 36 4651 4683 4737 N
+ UW AW L s n/a 36 4651 4683 4737 N
+ UW AW M b n/a 36 4651 4683 4726 N
+ UW AW M s n/a 36 4651 4683 4726 N
+ UW AW N b n/a 36 4651 4685 4725 N
+ UW AW N i n/a 36 4651 4685 4725 N
+ UW AW N s n/a 36 4651 4685 4725 N
+ UW AW NG b n/a 36 4651 4683 4726 N
+ UW AW NG s n/a 36 4651 4683 4726 N
+ UW AW OW s n/a 36 4651 4683 4739 N
+ UW AW OY s n/a 36 4651 4683 4739 N
+ UW AW P b n/a 36 4651 4683 4715 N
+ UW AW P s n/a 36 4651 4683 4715 N
+ UW AW R s n/a 36 4651 4683 4738 N
+ UW AW S b n/a 36 4651 4685 4721 N
+ UW AW S s n/a 36 4651 4685 4721 N
+ UW AW SH s n/a 36 4651 4685 4735 N
+ UW AW SIL s n/a 36 4651 4682 4733 N
+ UW AW T b n/a 36 4651 4685 4717 N
+ UW AW T s n/a 36 4651 4685 4717 N
+ UW AW TH s n/a 36 4651 4685 4722 N
+ UW AW UH s n/a 36 4651 4683 4739 N
+ UW AW UW b n/a 36 4651 4683 4739 N
+ UW AW UW s n/a 36 4651 4683 4739 N
+ UW AW V b n/a 36 4651 4683 4729 N
+ UW AW V s n/a 36 4651 4683 4729 N
+ UW AW W b n/a 36 4651 4683 4739 N
+ UW AW W s n/a 36 4651 4683 4739 N
+ UW AW Y b n/a 36 4651 4683 4745 N
+ UW AW Y s n/a 36 4651 4683 4745 N
+ UW AW Z b n/a 36 4651 4685 4723 N
+ UW AW Z i n/a 36 4651 4685 4723 N
+ UW AW Z s n/a 36 4651 4685 4723 N
+ UW AW ZH s n/a 36 4651 4685 4735 N
+ UW AY AA e n/a 36 4664 4710 4739 N
+ UW AY AA s n/a 36 4664 4710 4739 N
+ UW AY AE e n/a 36 4664 4710 4743 N
+ UW AY AE s n/a 36 4664 4710 4743 N
+ UW AY AH b n/a 36 4664 4710 4740 N
+ UW AY AH e n/a 36 4664 4710 4740 N
+ UW AY AH s n/a 36 4664 4710 4740 N
+ UW AY AO e n/a 36 4664 4710 4739 N
+ UW AY AO s n/a 36 4664 4710 4739 N
+ UW AY AW e n/a 36 4664 4710 4743 N
+ UW AY AW s n/a 36 4664 4710 4743 N
+ UW AY AY e n/a 36 4664 4710 4739 N
+ UW AY AY s n/a 36 4664 4710 4739 N
+ UW AY B b n/a 36 4668 4683 4715 N
+ UW AY B e n/a 36 4668 4683 4715 N
+ UW AY B s n/a 36 4668 4683 4715 N
+ UW AY CH b n/a 36 4667 4683 4718 N
+ UW AY CH e n/a 36 4667 4683 4718 N
+ UW AY CH s n/a 36 4667 4683 4718 N
+ UW AY D b n/a 36 4667 4691 4718 N
+ UW AY D e n/a 36 4667 4691 4718 N
+ UW AY D s n/a 36 4667 4691 4718 N
+ UW AY DH e n/a 36 4667 4691 4719 N
+ UW AY DH s n/a 36 4667 4691 4719 N
+ UW AY EH e n/a 36 4664 4710 4743 N
+ UW AY EH s n/a 36 4664 4710 4743 N
+ UW AY ER b n/a 36 4664 4710 4739 N
+ UW AY ER e n/a 36 4664 4710 4739 N
+ UW AY ER s n/a 36 4664 4710 4739 N
+ UW AY EY b n/a 36 4664 4710 4743 N
+ UW AY EY e n/a 36 4664 4710 4743 N
+ UW AY EY s n/a 36 4664 4710 4743 N
+ UW AY F b n/a 36 4668 4682 4734 N
+ UW AY F e n/a 36 4668 4682 4734 N
+ UW AY F s n/a 36 4668 4682 4734 N
+ UW AY G b n/a 36 4667 4683 4714 N
+ UW AY G e n/a 36 4667 4683 4714 N
+ UW AY G i n/a 36 4667 4683 4714 N
+ UW AY G s n/a 36 4667 4683 4714 N
+ UW AY HH e n/a 36 4667 4682 4731 N
+ UW AY HH s n/a 36 4667 4682 4731 N
+ UW AY IH b n/a 36 4664 4710 4745 N
+ UW AY IH e n/a 36 4664 4710 4745 N
+ UW AY IH s n/a 36 4664 4710 4745 N
+ UW AY IY b n/a 36 4664 4710 4745 N
+ UW AY IY e n/a 36 4664 4710 4745 N
+ UW AY IY s n/a 36 4664 4710 4745 N
+ UW AY JH e n/a 36 4667 4683 4718 N
+ UW AY JH s n/a 36 4667 4683 4717 N
+ UW AY K b n/a 36 4667 4683 4714 N
+ UW AY K e n/a 36 4667 4683 4714 N
+ UW AY K s n/a 36 4667 4683 4714 N
+ UW AY L b n/a 36 4664 4709 4737 N
+ UW AY L e n/a 36 4664 4709 4729 N
+ UW AY L i n/a 36 4665 4709 4737 N
+ UW AY L s n/a 36 4664 4709 4737 N
+ UW AY M b n/a 36 4668 4682 4726 N
+ UW AY M e n/a 36 4668 4682 4726 N
+ UW AY M s n/a 36 4668 4682 4726 N
+ UW AY N b n/a 36 4667 4692 4725 N
+ UW AY N e n/a 36 4667 4692 4725 N
+ UW AY N s n/a 36 4667 4692 4725 N
+ UW AY NG b n/a 36 4667 4682 4726 N
+ UW AY NG e n/a 36 4667 4682 4726 N
+ UW AY NG s n/a 36 4667 4682 4726 N
+ UW AY OW e n/a 36 4664 4710 4739 N
+ UW AY OW s n/a 36 4664 4710 4739 N
+ UW AY OY e n/a 36 4664 4710 4739 N
+ UW AY OY s n/a 36 4664 4710 4739 N
+ UW AY P b n/a 36 4668 4683 4715 N
+ UW AY P e n/a 36 4668 4683 4715 N
+ UW AY P s n/a 36 4668 4683 4715 N
+ UW AY R e n/a 36 4664 4709 4729 N
+ UW AY R i n/a 36 4665 4709 4738 N
+ UW AY R s n/a 36 4664 4709 4738 N
+ UW AY S b n/a 36 4667 4689 4721 N
+ UW AY S e n/a 36 4667 4689 4721 N
+ UW AY S i n/a 36 4667 4689 4721 N
+ UW AY S s n/a 36 4667 4689 4721 N
+ UW AY SH e n/a 36 4667 4685 4735 N
+ UW AY SH s n/a 36 4667 4685 4735 N
+ UW AY SIL e n/a 36 4667 4682 4733 N
+ UW AY SIL s n/a 36 4667 4682 4733 N
+ UW AY T b n/a 36 4667 4691 4718 N
+ UW AY T e n/a 36 4667 4691 4718 N
+ UW AY T s n/a 36 4667 4691 4718 N
+ UW AY TH e n/a 36 4667 4691 4722 N
+ UW AY TH i n/a 36 4667 4691 4721 N
+ UW AY TH s n/a 36 4667 4691 4722 N
+ UW AY UH e n/a 36 4664 4710 4739 N
+ UW AY UH s n/a 36 4664 4710 4739 N
+ UW AY UW b n/a 36 4664 4710 4739 N
+ UW AY UW e n/a 36 4664 4710 4739 N
+ UW AY UW s n/a 36 4664 4710 4739 N
+ UW AY V b n/a 36 4668 4682 4729 N
+ UW AY V e n/a 36 4668 4682 4729 N
+ UW AY V s n/a 36 4668 4682 4729 N
+ UW AY W b n/a 36 4664 4709 4739 N
+ UW AY W e n/a 36 4664 4709 4732 N
+ UW AY W s n/a 36 4664 4709 4739 N
+ UW AY Y b n/a 36 4664 4702 4745 N
+ UW AY Y e n/a 36 4664 4702 4736 N
+ UW AY Y s n/a 36 4664 4702 4745 N
+ UW AY Z b n/a 36 4667 4689 4723 N
+ UW AY Z e n/a 36 4667 4689 4723 N
+ UW AY Z i n/a 36 4667 4689 4723 N
+ UW AY Z s n/a 36 4667 4689 4723 N
+ UW AY ZH e n/a 36 4667 4685 4735 N
+ UW AY ZH s n/a 36 4667 4685 4735 N
+ UW B AA e n/a 36 4652 4710 4739 N
+ UW B AA i n/a 36 4652 4710 4739 N
+ UW B AA s n/a 36 4652 4710 4739 N
+ UW B AE e n/a 36 4652 4710 4743 N
+ UW B AE s n/a 36 4652 4710 4743 N
+ UW B AH b n/a 36 4652 4710 4740 N
+ UW B AH e n/a 36 4652 4710 4740 N
+ UW B AH s n/a 36 4652 4710 4740 N
+ UW B AO e n/a 36 4652 4710 4739 N
+ UW B AO s n/a 36 4652 4710 4739 N
+ UW B AW e n/a 36 4652 4710 4743 N
+ UW B AW s n/a 36 4652 4710 4743 N
+ UW B AY e n/a 36 4652 4710 4739 N
+ UW B AY s n/a 36 4652 4710 4739 N
+ UW B B b n/a 36 4652 4684 4715 N
+ UW B B e n/a 36 4652 4684 4715 N
+ UW B B i n/a 36 4652 4684 4715 N
+ UW B B s n/a 36 4652 4684 4715 N
+ UW B CH b n/a 36 4652 4684 4720 N
+ UW B CH e n/a 36 4652 4684 4720 N
+ UW B CH i n/a 36 4652 4684 4720 N
+ UW B CH s n/a 36 4652 4684 4720 N
+ UW B D b n/a 36 4652 4684 4720 N
+ UW B D e n/a 36 4652 4684 4720 N
+ UW B D i n/a 36 4652 4684 4720 N
+ UW B D s n/a 36 4652 4684 4720 N
+ UW B DH e n/a 36 4652 4684 4720 N
+ UW B DH i n/a 36 4652 4684 4720 N
+ UW B DH s n/a 36 4652 4684 4720 N
+ UW B EH e n/a 36 4652 4710 4743 N
+ UW B EH s n/a 36 4652 4710 4743 N
+ UW B ER b n/a 36 4652 4710 4739 N
+ UW B ER e n/a 36 4652 4710 4739 N
+ UW B ER i n/a 36 4652 4710 4741 N
+ UW B ER s n/a 36 4652 4710 4739 N
+ UW B EY b n/a 36 4652 4710 4743 N
+ UW B EY e n/a 36 4652 4710 4743 N
+ UW B EY s n/a 36 4652 4710 4743 N
+ UW B F b n/a 36 4652 4684 4734 N
+ UW B F e n/a 36 4652 4684 4734 N
+ UW B F i n/a 36 4652 4684 4734 N
+ UW B F s n/a 36 4652 4684 4734 N
+ UW B G b n/a 36 4652 4684 4715 N
+ UW B G e n/a 36 4652 4684 4715 N
+ UW B G i n/a 36 4652 4684 4715 N
+ UW B G s n/a 36 4652 4684 4715 N
+ UW B HH e n/a 36 4652 4684 4730 N
+ UW B HH i n/a 36 4652 4684 4730 N
+ UW B HH s n/a 36 4652 4684 4730 N
+ UW B IH b n/a 36 4652 4710 4745 N
+ UW B IH e n/a 36 4652 4710 4745 N
+ UW B IH i n/a 36 4652 4710 4745 N
+ UW B IH s n/a 36 4652 4710 4745 N
+ UW B IY b n/a 36 4652 4710 4745 N
+ UW B IY e n/a 36 4652 4710 4745 N
+ UW B IY i n/a 36 4652 4710 4745 N
+ UW B IY s n/a 36 4652 4710 4745 N
+ UW B JH e n/a 36 4652 4684 4720 N
+ UW B JH i n/a 36 4652 4684 4720 N
+ UW B JH s n/a 36 4652 4684 4720 N
+ UW B K b n/a 36 4652 4684 4715 N
+ UW B K e n/a 36 4652 4684 4715 N
+ UW B K i n/a 36 4652 4684 4715 N
+ UW B K s n/a 36 4652 4684 4715 N
+ UW B L b n/a 36 4652 4709 4737 N
+ UW B L e n/a 36 4652 4709 4729 N
+ UW B L i n/a 36 4652 4709 4737 N
+ UW B L s n/a 36 4652 4709 4737 N
+ UW B M b n/a 36 4652 4684 4726 N
+ UW B M e n/a 36 4652 4684 4726 N
+ UW B M i n/a 36 4652 4684 4726 N
+ UW B M s n/a 36 4652 4684 4726 N
+ UW B N b n/a 36 4652 4684 4725 N
+ UW B N e n/a 36 4652 4684 4725 N
+ UW B N i n/a 36 4652 4684 4725 N
+ UW B N s n/a 36 4652 4684 4725 N
+ UW B NG b n/a 36 4652 4684 4726 N
+ UW B NG e n/a 36 4652 4684 4726 N
+ UW B NG s n/a 36 4652 4684 4726 N
+ UW B OW e n/a 36 4652 4710 4739 N
+ UW B OW i n/a 36 4652 4710 4739 N
+ UW B OW s n/a 36 4652 4710 4739 N
+ UW B OY e n/a 36 4652 4710 4739 N
+ UW B OY s n/a 36 4652 4710 4739 N
+ UW B P b n/a 36 4652 4684 4715 N
+ UW B P e n/a 36 4652 4684 4715 N
+ UW B P i n/a 36 4652 4684 4715 N
+ UW B P s n/a 36 4652 4684 4715 N
+ UW B R e n/a 36 4652 4709 4729 N
+ UW B R i n/a 36 4652 4709 4738 N
+ UW B R s n/a 36 4652 4709 4738 N
+ UW B S b n/a 36 4652 4685 4721 N
+ UW B S e n/a 36 4652 4685 4721 N
+ UW B S i n/a 36 4652 4685 4721 N
+ UW B S s n/a 36 4652 4685 4721 N
+ UW B SH e n/a 36 4652 4685 4735 N
+ UW B SH i n/a 36 4652 4685 4735 N
+ UW B SH s n/a 36 4652 4685 4735 N
+ UW B SIL e n/a 36 4652 4684 4733 N
+ UW B SIL s n/a 36 4652 4684 4733 N
+ UW B T b n/a 36 4652 4684 4720 N
+ UW B T e n/a 36 4652 4684 4720 N
+ UW B T i n/a 36 4652 4684 4720 N
+ UW B T s n/a 36 4652 4684 4720 N
+ UW B TH e n/a 36 4652 4684 4722 N
+ UW B TH i n/a 36 4652 4684 4721 N
+ UW B TH s n/a 36 4652 4684 4722 N
+ UW B UH e n/a 36 4652 4710 4739 N
+ UW B UH s n/a 36 4652 4710 4739 N
+ UW B UW b n/a 36 4652 4710 4739 N
+ UW B UW e n/a 36 4652 4710 4739 N
+ UW B UW s n/a 36 4652 4710 4739 N
+ UW B V b n/a 36 4652 4684 4729 N
+ UW B V e n/a 36 4652 4684 4729 N
+ UW B V i n/a 36 4652 4684 4727 N
+ UW B V s n/a 36 4652 4684 4729 N
+ UW B W b n/a 36 4652 4709 4739 N
+ UW B W e n/a 36 4652 4709 4732 N
+ UW B W i n/a 36 4652 4709 4742 N
+ UW B W s n/a 36 4652 4709 4739 N
+ UW B Y b n/a 36 4652 4702 4745 N
+ UW B Y e n/a 36 4652 4702 4736 N
+ UW B Y i n/a 36 4652 4702 4745 N
+ UW B Y s n/a 36 4652 4702 4745 N
+ UW B Z b n/a 36 4652 4685 4723 N
+ UW B Z e n/a 36 4652 4685 4723 N
+ UW B Z i n/a 36 4652 4685 4723 N
+ UW B Z s n/a 36 4652 4685 4723 N
+ UW B ZH e n/a 36 4652 4685 4735 N
+ UW B ZH i n/a 36 4652 4685 4735 N
+ UW B ZH s n/a 36 4652 4685 4735 N
+ UW CH AA e n/a 36 4659 4713 4739 N
+ UW CH AA i n/a 36 4658 4712 4739 N
+ UW CH AA s n/a 36 4659 4712 4739 N
+ UW CH AE e n/a 36 4659 4711 4743 N
+ UW CH AE i n/a 36 4658 4712 4744 N
+ UW CH AE s n/a 36 4659 4711 4743 N
+ UW CH AH b n/a 36 4657 4711 4740 N
+ UW CH AH e n/a 36 4657 4711 4740 N
+ UW CH AH i n/a 36 4658 4712 4742 N
+ UW CH AH s n/a 36 4657 4711 4740 N
+ UW CH AO e n/a 36 4659 4713 4739 N
+ UW CH AO s n/a 36 4659 4713 4739 N
+ UW CH AW e n/a 36 4659 4711 4743 N
+ UW CH AW s n/a 36 4659 4711 4743 N
+ UW CH AY e n/a 36 4659 4713 4739 N
+ UW CH AY s n/a 36 4659 4712 4739 N
+ UW CH B b n/a 36 4657 4698 4715 N
+ UW CH B e n/a 36 4657 4698 4715 N
+ UW CH B i n/a 36 4657 4698 4715 N
+ UW CH B s n/a 36 4657 4698 4715 N
+ UW CH CH b n/a 36 4657 4702 4717 N
+ UW CH CH e n/a 36 4657 4702 4717 N
+ UW CH CH i n/a 36 4657 4702 4716 N
+ UW CH CH s n/a 36 4657 4702 4717 N
+ UW CH D b n/a 36 4662 4688 4717 N
+ UW CH D e n/a 36 4662 4688 4717 N
+ UW CH D i n/a 36 4661 4688 4716 N
+ UW CH D s n/a 36 4662 4688 4717 N
+ UW CH DH e n/a 36 4662 4688 4719 N
+ UW CH DH s n/a 36 4662 4688 4719 N
+ UW CH EH e n/a 36 4659 4711 4744 N
+ UW CH EH i n/a 36 4658 4712 4744 N
+ UW CH EH s n/a 36 4659 4711 4744 N
+ UW CH ER b n/a 36 4657 4713 4739 N
+ UW CH ER e n/a 36 4657 4713 4739 N
+ UW CH ER i n/a 36 4659 4713 4741 N
+ UW CH ER s n/a 36 4657 4713 4739 N
+ UW CH EY b n/a 36 4659 4711 4744 N
+ UW CH EY e n/a 36 4659 4711 4744 N
+ UW CH EY i n/a 36 4658 4712 4744 N
+ UW CH EY s n/a 36 4659 4711 4744 N
+ UW CH F b n/a 36 4657 4698 4734 N
+ UW CH F e n/a 36 4657 4698 4734 N
+ UW CH F s n/a 36 4657 4698 4734 N
+ UW CH G b n/a 36 4657 4698 4715 N
+ UW CH G e n/a 36 4657 4698 4715 N
+ UW CH G i n/a 36 4657 4698 4715 N
+ UW CH G s n/a 36 4657 4698 4715 N
+ UW CH HH e n/a 36 4659 4697 4731 N
+ UW CH HH s n/a 36 4659 4697 4731 N
+ UW CH IH b n/a 36 4657 4711 4745 N
+ UW CH IH e n/a 36 4657 4711 4745 N
+ UW CH IH i n/a 36 4658 4712 4745 N
+ UW CH IH s n/a 36 4657 4711 4745 N
+ UW CH IY b n/a 36 4659 4711 4745 N
+ UW CH IY e n/a 36 4659 4711 4745 N
+ UW CH IY i n/a 36 4658 4712 4745 N
+ UW CH IY s n/a 36 4659 4711 4745 N
+ UW CH JH e n/a 36 4657 4702 4717 N
+ UW CH JH i n/a 36 4657 4702 4716 N
+ UW CH JH s n/a 36 4657 4702 4717 N
+ UW CH K b n/a 36 4657 4698 4715 N
+ UW CH K e n/a 36 4657 4698 4715 N
+ UW CH K i n/a 36 4657 4698 4715 N
+ UW CH K s n/a 36 4657 4698 4715 N
+ UW CH L b n/a 36 4659 4711 4740 N
+ UW CH L e n/a 36 4659 4711 4729 N
+ UW CH L i n/a 36 4658 4712 4742 N
+ UW CH L s n/a 36 4659 4711 4740 N
+ UW CH M b n/a 36 4657 4697 4728 N
+ UW CH M e n/a 36 4657 4697 4728 N
+ UW CH M i n/a 36 4657 4697 4728 N
+ UW CH M s n/a 36 4657 4697 4728 N
+ UW CH N b n/a 36 4662 4688 4725 N
+ UW CH N e n/a 36 4662 4688 4725 N
+ UW CH N i n/a 36 4662 4688 4725 N
+ UW CH N s n/a 36 4662 4688 4725 N
+ UW CH NG b n/a 36 4657 4697 4728 N
+ UW CH NG e n/a 36 4657 4697 4728 N
+ UW CH NG i n/a 36 4657 4697 4728 N
+ UW CH NG s n/a 36 4657 4697 4728 N
+ UW CH OW e n/a 36 4659 4713 4739 N
+ UW CH OW i n/a 36 4658 4713 4739 N
+ UW CH OW s n/a 36 4659 4713 4739 N
+ UW CH OY e n/a 36 4659 4713 4739 N
+ UW CH OY s n/a 36 4659 4713 4739 N
+ UW CH P b n/a 36 4657 4698 4715 N
+ UW CH P e n/a 36 4657 4698 4715 N
+ UW CH P s n/a 36 4657 4698 4715 N
+ UW CH R e n/a 36 4659 4711 4729 N
+ UW CH R s n/a 36 4659 4711 4740 N
+ UW CH S b n/a 36 4662 4688 4722 N
+ UW CH S e n/a 36 4662 4688 4722 N
+ UW CH S i n/a 36 4661 4688 4722 N
+ UW CH S s n/a 36 4662 4688 4722 N
+ UW CH SH e n/a 36 4657 4702 4735 N
+ UW CH SH s n/a 36 4657 4702 4735 N
+ UW CH SIL e n/a 36 4667 4703 4733 N
+ UW CH SIL s n/a 36 4667 4703 4733 N
+ UW CH T b n/a 36 4662 4688 4717 N
+ UW CH T e n/a 36 4662 4688 4717 N
+ UW CH T i n/a 36 4661 4688 4716 N
+ UW CH T s n/a 36 4662 4688 4717 N
+ UW CH TH e n/a 36 4662 4688 4722 N
+ UW CH TH s n/a 36 4662 4688 4722 N
+ UW CH UH e n/a 36 4659 4713 4739 N
+ UW CH UH s n/a 36 4659 4713 4739 N
+ UW CH UW b n/a 36 4659 4713 4739 N
+ UW CH UW e n/a 36 4659 4713 4739 N
+ UW CH UW s n/a 36 4659 4713 4739 N
+ UW CH V b n/a 36 4657 4698 4728 N
+ UW CH V e n/a 36 4657 4698 4728 N
+ UW CH V s n/a 36 4657 4698 4728 N
+ UW CH W b n/a 36 4659 4713 4739 N
+ UW CH W e n/a 36 4659 4713 4732 N
+ UW CH W s n/a 36 4659 4713 4739 N
+ UW CH Y b n/a 36 4659 4711 4745 N
+ UW CH Y e n/a 36 4659 4711 4736 N
+ UW CH Y s n/a 36 4659 4711 4745 N
+ UW CH Z b n/a 36 4662 4688 4723 N
+ UW CH Z e n/a 36 4662 4688 4723 N
+ UW CH Z i n/a 36 4661 4688 4723 N
+ UW CH Z s n/a 36 4662 4688 4723 N
+ UW CH ZH e n/a 36 4657 4702 4735 N
+ UW CH ZH s n/a 36 4657 4702 4735 N
+ UW D AA e n/a 36 4664 4710 4739 N
+ UW D AA i n/a 36 4665 4710 4739 N
+ UW D AA s n/a 36 4664 4710 4739 N
+ UW D AE e n/a 36 4664 4710 4743 N
+ UW D AE i n/a 36 4665 4710 4744 N
+ UW D AE s n/a 36 4664 4710 4743 N
+ UW D AH b n/a 36 4664 4710 4740 N
+ UW D AH e n/a 36 4664 4710 4740 N
+ UW D AH i n/a 36 4665 4710 4742 N
+ UW D AH s n/a 36 4664 4710 4740 N
+ UW D AO e n/a 36 4664 4710 4739 N
+ UW D AO i n/a 36 4665 4710 4739 N
+ UW D AO s n/a 36 4664 4710 4739 N
+ UW D AW e n/a 36 4664 4710 4743 N
+ UW D AW s n/a 36 4664 4710 4743 N
+ UW D AY e n/a 36 4664 4710 4739 N
+ UW D AY i n/a 36 4665 4710 4739 N
+ UW D AY s n/a 36 4664 4710 4739 N
+ UW D B b n/a 36 4660 4698 4715 N
+ UW D B e n/a 36 4660 4698 4715 N
+ UW D B i n/a 36 4660 4698 4715 N
+ UW D B s n/a 36 4660 4698 4715 N
+ UW D CH b n/a 36 4660 4702 4717 N
+ UW D CH e n/a 36 4660 4702 4717 N
+ UW D CH i n/a 36 4660 4702 4716 N
+ UW D CH s n/a 36 4660 4702 4717 N
+ UW D D b n/a 36 4660 4691 4717 N
+ UW D D e n/a 36 4660 4691 4717 N
+ UW D D i n/a 36 4660 4691 4716 N
+ UW D D s n/a 36 4660 4691 4717 N
+ UW D DH e n/a 36 4660 4691 4719 N
+ UW D DH s n/a 36 4660 4691 4719 N
+ UW D EH e n/a 36 4664 4710 4743 N
+ UW D EH i n/a 36 4665 4710 4744 N
+ UW D EH s n/a 36 4664 4710 4743 N
+ UW D ER b n/a 36 4664 4710 4739 N
+ UW D ER e n/a 36 4664 4710 4739 N
+ UW D ER i n/a 36 4665 4710 4741 N
+ UW D ER s n/a 36 4664 4710 4739 N
+ UW D EY b n/a 36 4664 4710 4743 N
+ UW D EY e n/a 36 4664 4710 4743 N
+ UW D EY i n/a 36 4665 4710 4744 N
+ UW D EY s n/a 36 4664 4710 4743 N
+ UW D F b n/a 36 4660 4698 4734 N
+ UW D F e n/a 36 4660 4698 4734 N
+ UW D F i n/a 36 4660 4698 4734 N
+ UW D F s n/a 36 4660 4698 4734 N
+ UW D G b n/a 36 4660 4698 4715 N
+ UW D G e n/a 36 4660 4698 4715 N
+ UW D G i n/a 36 4660 4698 4715 N
+ UW D G s n/a 36 4660 4698 4715 N
+ UW D HH e n/a 36 4660 4697 4731 N
+ UW D HH i n/a 36 4660 4697 4731 N
+ UW D HH s n/a 36 4660 4697 4731 N
+ UW D IH b n/a 36 4664 4710 4745 N
+ UW D IH e n/a 36 4664 4710 4745 N
+ UW D IH i n/a 36 4665 4710 4745 N
+ UW D IH s n/a 36 4664 4710 4745 N
+ UW D IY b n/a 36 4664 4710 4745 N
+ UW D IY e n/a 36 4664 4710 4745 N
+ UW D IY i n/a 36 4665 4710 4745 N
+ UW D IY s n/a 36 4664 4710 4745 N
+ UW D JH e n/a 36 4660 4702 4717 N
+ UW D JH i n/a 36 4660 4702 4716 N
+ UW D JH s n/a 36 4660 4702 4717 N
+ UW D K b n/a 36 4660 4698 4715 N
+ UW D K e n/a 36 4660 4698 4715 N
+ UW D K i n/a 36 4660 4698 4715 N
+ UW D K s n/a 36 4660 4698 4715 N
+ UW D L b n/a 36 4664 4709 4737 N
+ UW D L e n/a 36 4664 4709 4729 N
+ UW D L i n/a 36 4665 4709 4737 N
+ UW D L s n/a 36 4664 4709 4737 N
+ UW D M b n/a 36 4660 4697 4728 N
+ UW D M e n/a 36 4660 4697 4728 N
+ UW D M i n/a 36 4660 4697 4728 N
+ UW D M s n/a 36 4660 4697 4728 N
+ UW D N b n/a 36 4660 4692 4725 N
+ UW D N e n/a 36 4660 4692 4724 N
+ UW D N i n/a 36 4660 4692 4725 N
+ UW D N s n/a 36 4660 4692 4725 N
+ UW D NG b n/a 36 4660 4697 4728 N
+ UW D NG e n/a 36 4660 4697 4728 N
+ UW D NG s n/a 36 4660 4697 4728 N
+ UW D OW e n/a 36 4664 4710 4739 N
+ UW D OW i n/a 36 4665 4710 4739 N
+ UW D OW s n/a 36 4664 4710 4739 N
+ UW D OY e n/a 36 4664 4710 4739 N
+ UW D OY s n/a 36 4664 4710 4739 N
+ UW D P b n/a 36 4660 4698 4715 N
+ UW D P e n/a 36 4660 4698 4715 N
+ UW D P i n/a 36 4660 4698 4715 N
+ UW D P s n/a 36 4660 4698 4715 N
+ UW D R e n/a 36 4664 4709 4729 N
+ UW D R i n/a 36 4665 4709 4738 N
+ UW D R s n/a 36 4664 4709 4738 N
+ UW D S b n/a 36 4660 4689 4722 N
+ UW D S e n/a 36 4660 4689 4722 N
+ UW D S i n/a 36 4660 4689 4722 N
+ UW D S s n/a 36 4660 4689 4722 N
+ UW D SH e n/a 36 4660 4702 4735 N
+ UW D SH i n/a 36 4660 4702 4735 N
+ UW D SH s n/a 36 4660 4702 4735 N
+ UW D SIL e n/a 36 4667 4703 4733 N
+ UW D SIL s n/a 36 4667 4703 4733 N
+ UW D T b n/a 36 4660 4691 4717 N
+ UW D T e n/a 36 4660 4691 4717 N
+ UW D T i n/a 36 4660 4691 4716 N
+ UW D T s n/a 36 4660 4691 4717 N
+ UW D TH e n/a 36 4660 4691 4722 N
+ UW D TH i n/a 36 4660 4691 4721 N
+ UW D TH s n/a 36 4660 4691 4722 N
+ UW D UH e n/a 36 4664 4710 4739 N
+ UW D UH i n/a 36 4665 4710 4741 N
+ UW D UH s n/a 36 4664 4710 4739 N
+ UW D UW b n/a 36 4664 4710 4739 N
+ UW D UW e n/a 36 4664 4710 4739 N
+ UW D UW s n/a 36 4664 4710 4739 N
+ UW D V b n/a 36 4660 4698 4729 N
+ UW D V e n/a 36 4660 4698 4729 N
+ UW D V i n/a 36 4660 4698 4727 N
+ UW D V s n/a 36 4660 4698 4729 N
+ UW D W b n/a 36 4664 4709 4739 N
+ UW D W e n/a 36 4664 4709 4732 N
+ UW D W i n/a 36 4665 4709 4742 N
+ UW D W s n/a 36 4664 4709 4739 N
+ UW D Y b n/a 36 4664 4702 4745 N
+ UW D Y e n/a 36 4664 4702 4736 N
+ UW D Y i n/a 36 4665 4702 4745 N
+ UW D Y s n/a 36 4664 4702 4745 N
+ UW D Z b n/a 36 4660 4689 4723 N
+ UW D Z e n/a 36 4660 4689 4723 N
+ UW D Z i n/a 36 4660 4689 4723 N
+ UW D Z s n/a 36 4660 4689 4723 N
+ UW D ZH e n/a 36 4660 4702 4735 N
+ UW D ZH s n/a 36 4660 4702 4735 N
+ UW DH AA s n/a 36 4664 4710 4739 N
+ UW DH AE s n/a 36 4664 4710 4743 N
+ UW DH AH b n/a 36 4664 4710 4740 N
+ UW DH AH s n/a 36 4664 4710 4740 N
+ UW DH AO s n/a 36 4664 4710 4739 N
+ UW DH AW s n/a 36 4664 4710 4743 N
+ UW DH AY s n/a 36 4664 4710 4739 N
+ UW DH B b n/a 36 4668 4683 4715 N
+ UW DH B s n/a 36 4668 4683 4715 N
+ UW DH CH b n/a 36 4667 4683 4717 N
+ UW DH CH s n/a 36 4667 4683 4717 N
+ UW DH D b n/a 36 4667 4691 4717 N
+ UW DH D s n/a 36 4667 4691 4717 N
+ UW DH DH s n/a 36 4667 4691 4719 N
+ UW DH EH s n/a 36 4664 4710 4743 N
+ UW DH ER b n/a 36 4664 4710 4739 N
+ UW DH ER s n/a 36 4664 4710 4739 N
+ UW DH EY b n/a 36 4664 4710 4743 N
+ UW DH EY s n/a 36 4664 4710 4743 N
+ UW DH F b n/a 36 4668 4682 4734 N
+ UW DH F s n/a 36 4668 4682 4734 N
+ UW DH G b n/a 36 4667 4683 4715 N
+ UW DH G s n/a 36 4667 4683 4715 N
+ UW DH HH s n/a 36 4667 4683 4731 N
+ UW DH IH b n/a 36 4664 4710 4745 N
+ UW DH IH i n/a 36 4665 4710 4745 N
+ UW DH IH s n/a 36 4664 4710 4745 N
+ UW DH IY b n/a 36 4664 4710 4745 N
+ UW DH IY s n/a 36 4664 4710 4745 N
+ UW DH JH s n/a 36 4667 4683 4717 N
+ UW DH K b n/a 36 4667 4683 4715 N
+ UW DH K s n/a 36 4667 4683 4715 N
+ UW DH L b n/a 36 4664 4709 4737 N
+ UW DH L s n/a 36 4664 4709 4737 N
+ UW DH M b n/a 36 4668 4683 4728 N
+ UW DH M s n/a 36 4668 4683 4728 N
+ UW DH N b n/a 36 4667 4692 4725 N
+ UW DH N s n/a 36 4667 4692 4725 N
+ UW DH NG b n/a 36 4667 4683 4728 N
+ UW DH NG s n/a 36 4667 4683 4728 N
+ UW DH OW s n/a 36 4664 4710 4739 N
+ UW DH OY s n/a 36 4664 4710 4739 N
+ UW DH P b n/a 36 4668 4683 4715 N
+ UW DH P s n/a 36 4668 4683 4715 N
+ UW DH R s n/a 36 4664 4709 4738 N
+ UW DH S b n/a 36 4667 4689 4722 N
+ UW DH S s n/a 36 4667 4689 4722 N
+ UW DH SH s n/a 36 4667 4685 4735 N
+ UW DH SIL s n/a 36 4667 4682 4733 N
+ UW DH T b n/a 36 4667 4691 4717 N
+ UW DH T s n/a 36 4667 4691 4717 N
+ UW DH TH s n/a 36 4667 4691 4722 N
+ UW DH UH s n/a 36 4664 4710 4739 N
+ UW DH UW b n/a 36 4664 4710 4739 N
+ UW DH UW s n/a 36 4664 4710 4739 N
+ UW DH V b n/a 36 4668 4683 4729 N
+ UW DH V s n/a 36 4668 4683 4729 N
+ UW DH W b n/a 36 4664 4709 4739 N
+ UW DH W s n/a 36 4664 4709 4739 N
+ UW DH Y b n/a 36 4664 4702 4745 N
+ UW DH Y s n/a 36 4664 4702 4745 N
+ UW DH Z b n/a 36 4667 4689 4723 N
+ UW DH Z s n/a 36 4667 4689 4723 N
+ UW DH ZH s n/a 36 4667 4685 4735 N
+ UW EH AA e n/a 36 4664 4710 4739 N
+ UW EH AA s n/a 36 4664 4710 4739 N
+ UW EH AE e n/a 36 4664 4710 4743 N
+ UW EH AE s n/a 36 4664 4710 4743 N
+ UW EH AH b n/a 36 4664 4710 4740 N
+ UW EH AH e n/a 36 4664 4710 4740 N
+ UW EH AH s n/a 36 4664 4710 4740 N
+ UW EH AO e n/a 36 4664 4710 4739 N
+ UW EH AO s n/a 36 4664 4710 4739 N
+ UW EH AW e n/a 36 4664 4710 4743 N
+ UW EH AW s n/a 36 4664 4710 4743 N
+ UW EH AY e n/a 36 4664 4710 4739 N
+ UW EH AY s n/a 36 4664 4710 4739 N
+ UW EH B b n/a 36 4668 4683 4715 N
+ UW EH B e n/a 36 4668 4683 4715 N
+ UW EH B s n/a 36 4668 4683 4715 N
+ UW EH CH b n/a 36 4667 4683 4718 N
+ UW EH CH e n/a 36 4667 4683 4718 N
+ UW EH CH s n/a 36 4667 4683 4718 N
+ UW EH D b n/a 36 4667 4685 4718 N
+ UW EH D e n/a 36 4667 4685 4718 N
+ UW EH D s n/a 36 4667 4685 4718 N
+ UW EH DH e n/a 36 4667 4685 4719 N
+ UW EH DH s n/a 36 4667 4685 4719 N
+ UW EH EH e n/a 36 4664 4710 4743 N
+ UW EH EH s n/a 36 4664 4710 4743 N
+ UW EH ER b n/a 36 4664 4710 4739 N
+ UW EH ER e n/a 36 4664 4710 4739 N
+ UW EH ER s n/a 36 4664 4710 4739 N
+ UW EH EY b n/a 36 4664 4710 4743 N
+ UW EH EY e n/a 36 4664 4710 4743 N
+ UW EH EY s n/a 36 4664 4710 4743 N
+ UW EH F b n/a 36 4668 4682 4734 N
+ UW EH F e n/a 36 4668 4682 4734 N
+ UW EH F s n/a 36 4668 4682 4734 N
+ UW EH G b n/a 36 4667 4683 4715 N
+ UW EH G e n/a 36 4667 4683 4715 N
+ UW EH G s n/a 36 4667 4683 4715 N
+ UW EH HH e n/a 36 4667 4683 4731 N
+ UW EH HH s n/a 36 4667 4683 4731 N
+ UW EH IH b n/a 36 4664 4710 4745 N
+ UW EH IH e n/a 36 4664 4710 4745 N
+ UW EH IH s n/a 36 4664 4710 4745 N
+ UW EH IY b n/a 36 4664 4710 4745 N
+ UW EH IY e n/a 36 4664 4710 4745 N
+ UW EH IY s n/a 36 4664 4710 4745 N
+ UW EH JH e n/a 36 4667 4683 4718 N
+ UW EH JH s n/a 36 4667 4683 4717 N
+ UW EH K b n/a 36 4667 4683 4715 N
+ UW EH K e n/a 36 4667 4683 4715 N
+ UW EH K s n/a 36 4667 4683 4715 N
+ UW EH L b n/a 36 4664 4709 4737 N
+ UW EH L e n/a 36 4664 4709 4729 N
+ UW EH L s n/a 36 4664 4709 4737 N
+ UW EH M b n/a 36 4668 4683 4726 N
+ UW EH M e n/a 36 4668 4683 4726 N
+ UW EH M s n/a 36 4668 4683 4726 N
+ UW EH N b n/a 36 4667 4685 4725 N
+ UW EH N e n/a 36 4667 4685 4725 N
+ UW EH N s n/a 36 4667 4685 4725 N
+ UW EH NG b n/a 36 4667 4683 4726 N
+ UW EH NG e n/a 36 4667 4683 4726 N
+ UW EH NG s n/a 36 4667 4683 4726 N
+ UW EH OW e n/a 36 4664 4710 4739 N
+ UW EH OW s n/a 36 4664 4710 4739 N
+ UW EH OY e n/a 36 4664 4710 4739 N
+ UW EH OY s n/a 36 4664 4710 4739 N
+ UW EH P b n/a 36 4668 4683 4715 N
+ UW EH P e n/a 36 4668 4683 4715 N
+ UW EH P s n/a 36 4668 4683 4715 N
+ UW EH R e n/a 36 4664 4709 4729 N
+ UW EH R s n/a 36 4664 4709 4738 N
+ UW EH S b n/a 36 4667 4685 4721 N
+ UW EH S e n/a 36 4667 4685 4721 N
+ UW EH S s n/a 36 4667 4685 4721 N
+ UW EH SH e n/a 36 4667 4685 4735 N
+ UW EH SH s n/a 36 4667 4685 4735 N
+ UW EH SIL e n/a 36 4667 4682 4733 N
+ UW EH SIL s n/a 36 4667 4682 4733 N
+ UW EH T b n/a 36 4667 4685 4718 N
+ UW EH T e n/a 36 4667 4685 4718 N
+ UW EH T s n/a 36 4667 4685 4718 N
+ UW EH TH e n/a 36 4667 4685 4722 N
+ UW EH TH s n/a 36 4667 4685 4722 N
+ UW EH UH e n/a 36 4664 4710 4739 N
+ UW EH UH s n/a 36 4664 4710 4739 N
+ UW EH UW b n/a 36 4664 4710 4739 N
+ UW EH UW e n/a 36 4664 4710 4739 N
+ UW EH UW s n/a 36 4664 4710 4739 N
+ UW EH V b n/a 36 4668 4683 4729 N
+ UW EH V e n/a 36 4668 4683 4729 N
+ UW EH V s n/a 36 4668 4683 4729 N
+ UW EH W b n/a 36 4664 4709 4739 N
+ UW EH W e n/a 36 4664 4709 4732 N
+ UW EH W s n/a 36 4664 4709 4739 N
+ UW EH Y b n/a 36 4664 4702 4745 N
+ UW EH Y e n/a 36 4664 4702 4736 N
+ UW EH Y s n/a 36 4664 4702 4745 N
+ UW EH Z b n/a 36 4667 4685 4723 N
+ UW EH Z e n/a 36 4667 4685 4723 N
+ UW EH Z s n/a 36 4667 4685 4723 N
+ UW EH ZH e n/a 36 4667 4685 4735 N
+ UW EH ZH s n/a 36 4667 4685 4735 N
+ UW ER AA e n/a 36 4648 4680 4739 N
+ UW ER AA s n/a 36 4648 4680 4739 N
+ UW ER AE e n/a 36 4648 4680 4743 N
+ UW ER AE s n/a 36 4648 4680 4743 N
+ UW ER AH b n/a 36 4648 4680 4740 N
+ UW ER AH e n/a 36 4648 4680 4740 N
+ UW ER AH s n/a 36 4648 4680 4740 N
+ UW ER AO e n/a 36 4648 4680 4739 N
+ UW ER AO s n/a 36 4648 4680 4739 N
+ UW ER AW e n/a 36 4648 4680 4743 N
+ UW ER AW s n/a 36 4648 4680 4743 N
+ UW ER AY e n/a 36 4648 4680 4739 N
+ UW ER AY s n/a 36 4648 4680 4739 N
+ UW ER B b n/a 36 4648 4679 4715 N
+ UW ER B e n/a 36 4648 4679 4715 N
+ UW ER B i n/a 36 4648 4679 4715 N
+ UW ER B s n/a 36 4648 4679 4715 N
+ UW ER CH b n/a 36 4648 4679 4717 N
+ UW ER CH e n/a 36 4648 4679 4717 N
+ UW ER CH i n/a 36 4649 4679 4717 N
+ UW ER CH s n/a 36 4648 4679 4717 N
+ UW ER D b n/a 36 4649 4687 4717 N
+ UW ER D e n/a 36 4649 4687 4717 N
+ UW ER D i n/a 36 4649 4687 4716 N
+ UW ER D s n/a 36 4649 4687 4717 N
+ UW ER DH e n/a 36 4649 4687 4719 N
+ UW ER DH s n/a 36 4649 4687 4719 N
+ UW ER EH e n/a 36 4648 4680 4743 N
+ UW ER EH s n/a 36 4648 4680 4743 N
+ UW ER ER b n/a 36 4648 4680 4739 N
+ UW ER ER e n/a 36 4648 4680 4739 N
+ UW ER ER s n/a 36 4648 4680 4739 N
+ UW ER EY b n/a 36 4648 4680 4743 N
+ UW ER EY e n/a 36 4648 4680 4743 N
+ UW ER EY s n/a 36 4648 4680 4743 N
+ UW ER F b n/a 36 4648 4679 4734 N
+ UW ER F e n/a 36 4648 4679 4734 N
+ UW ER F s n/a 36 4648 4679 4734 N
+ UW ER G b n/a 36 4648 4679 4715 N
+ UW ER G e n/a 36 4648 4679 4715 N
+ UW ER G i n/a 36 4649 4679 4715 N
+ UW ER G s n/a 36 4648 4679 4715 N
+ UW ER HH e n/a 36 4648 4679 4731 N
+ UW ER HH s n/a 36 4648 4679 4731 N
+ UW ER IH b n/a 36 4648 4680 4745 N
+ UW ER IH e n/a 36 4648 4680 4745 N
+ UW ER IH s n/a 36 4648 4680 4745 N
+ UW ER IY b n/a 36 4648 4680 4745 N
+ UW ER IY e n/a 36 4648 4680 4745 N
+ UW ER IY i n/a 36 4646 4680 4745 N
+ UW ER IY s n/a 36 4648 4680 4745 N
+ UW ER JH e n/a 36 4648 4679 4717 N
+ UW ER JH i n/a 36 4649 4679 4717 N
+ UW ER JH s n/a 36 4648 4679 4717 N
+ UW ER K b n/a 36 4648 4679 4715 N
+ UW ER K e n/a 36 4648 4679 4715 N
+ UW ER K i n/a 36 4649 4679 4715 N
+ UW ER K s n/a 36 4648 4679 4715 N
+ UW ER L b n/a 36 4648 4679 4737 N
+ UW ER L e n/a 36 4648 4679 4729 N
+ UW ER L i n/a 36 4646 4681 4737 N
+ UW ER L s n/a 36 4648 4679 4737 N
+ UW ER M b n/a 36 4647 4679 4726 N
+ UW ER M e n/a 36 4648 4679 4726 N
+ UW ER M s n/a 36 4647 4679 4726 N
+ UW ER N b n/a 36 4647 4687 4725 N
+ UW ER N e n/a 36 4649 4687 4725 N
+ UW ER N i n/a 36 4647 4687 4725 N
+ UW ER N s n/a 36 4647 4687 4725 N
+ UW ER NG b n/a 36 4647 4679 4726 N
+ UW ER NG e n/a 36 4648 4679 4726 N
+ UW ER NG s n/a 36 4647 4679 4726 N
+ UW ER OW e n/a 36 4648 4680 4739 N
+ UW ER OW i n/a 36 4646 4680 4739 N
+ UW ER OW s n/a 36 4648 4680 4739 N
+ UW ER OY e n/a 36 4648 4680 4739 N
+ UW ER OY s n/a 36 4648 4680 4739 N
+ UW ER P b n/a 36 4648 4679 4715 N
+ UW ER P e n/a 36 4648 4679 4715 N
+ UW ER P i n/a 36 4648 4679 4715 N
+ UW ER P s n/a 36 4648 4679 4715 N
+ UW ER R e n/a 36 4648 4679 4729 N
+ UW ER R s n/a 36 4648 4679 4738 N
+ UW ER S b n/a 36 4649 4687 4721 N
+ UW ER S e n/a 36 4649 4687 4721 N
+ UW ER S i n/a 36 4649 4687 4721 N
+ UW ER S s n/a 36 4649 4687 4721 N
+ UW ER SH e n/a 36 4648 4679 4735 N
+ UW ER SH i n/a 36 4649 4679 4735 N
+ UW ER SH s n/a 36 4648 4679 4735 N
+ UW ER SIL e n/a 36 4648 4679 4733 N
+ UW ER SIL s n/a 36 4648 4679 4733 N
+ UW ER T b n/a 36 4649 4687 4717 N
+ UW ER T e n/a 36 4649 4687 4717 N
+ UW ER T i n/a 36 4649 4687 4717 N
+ UW ER T s n/a 36 4649 4687 4717 N
+ UW ER TH e n/a 36 4649 4687 4722 N
+ UW ER TH s n/a 36 4649 4687 4722 N
+ UW ER UH e n/a 36 4648 4680 4739 N
+ UW ER UH s n/a 36 4648 4680 4739 N
+ UW ER UW b n/a 36 4648 4680 4739 N
+ UW ER UW e n/a 36 4648 4680 4739 N
+ UW ER UW s n/a 36 4648 4680 4739 N
+ UW ER V b n/a 36 4648 4679 4729 N
+ UW ER V e n/a 36 4648 4679 4729 N
+ UW ER V i n/a 36 4649 4679 4727 N
+ UW ER V s n/a 36 4648 4679 4729 N
+ UW ER W b n/a 36 4648 4680 4739 N
+ UW ER W e n/a 36 4648 4680 4732 N
+ UW ER W s n/a 36 4648 4680 4739 N
+ UW ER Y b n/a 36 4648 4680 4745 N
+ UW ER Y e n/a 36 4648 4680 4736 N
+ UW ER Y s n/a 36 4648 4680 4745 N
+ UW ER Z b n/a 36 4649 4687 4723 N
+ UW ER Z e n/a 36 4649 4687 4723 N
+ UW ER Z i n/a 36 4649 4687 4723 N
+ UW ER Z s n/a 36 4649 4687 4723 N
+ UW ER ZH e n/a 36 4648 4679 4735 N
+ UW ER ZH s n/a 36 4648 4679 4735 N
+ UW EY AA e n/a 36 4664 4710 4739 N
+ UW EY AA s n/a 36 4664 4710 4739 N
+ UW EY AE e n/a 36 4664 4710 4743 N
+ UW EY AE s n/a 36 4664 4710 4743 N
+ UW EY AH b n/a 36 4664 4710 4740 N
+ UW EY AH e n/a 36 4664 4710 4740 N
+ UW EY AH i n/a 36 4665 4710 4742 N
+ UW EY AH s n/a 36 4664 4710 4740 N
+ UW EY AO e n/a 36 4664 4710 4739 N
+ UW EY AO s n/a 36 4664 4710 4739 N
+ UW EY AW e n/a 36 4664 4710 4743 N
+ UW EY AW s n/a 36 4664 4710 4743 N
+ UW EY AY e n/a 36 4664 4710 4739 N
+ UW EY AY s n/a 36 4664 4710 4739 N
+ UW EY B b n/a 36 4668 4683 4715 N
+ UW EY B e n/a 36 4668 4683 4715 N
+ UW EY B s n/a 36 4668 4683 4715 N
+ UW EY CH b n/a 36 4667 4683 4718 N
+ UW EY CH e n/a 36 4667 4683 4718 N
+ UW EY CH i n/a 36 4667 4683 4718 N
+ UW EY CH s n/a 36 4667 4683 4718 N
+ UW EY D b n/a 36 4667 4691 4718 N
+ UW EY D e n/a 36 4667 4691 4718 N
+ UW EY D s n/a 36 4667 4691 4718 N
+ UW EY DH e n/a 36 4667 4691 4719 N
+ UW EY DH s n/a 36 4667 4691 4719 N
+ UW EY EH e n/a 36 4664 4710 4743 N
+ UW EY EH s n/a 36 4664 4710 4743 N
+ UW EY ER b n/a 36 4664 4710 4739 N
+ UW EY ER e n/a 36 4664 4710 4739 N
+ UW EY ER s n/a 36 4664 4710 4739 N
+ UW EY EY b n/a 36 4664 4710 4743 N
+ UW EY EY e n/a 36 4664 4710 4743 N
+ UW EY EY s n/a 36 4664 4710 4743 N
+ UW EY F b n/a 36 4668 4682 4734 N
+ UW EY F e n/a 36 4668 4682 4734 N
+ UW EY F s n/a 36 4668 4682 4734 N
+ UW EY G b n/a 36 4667 4683 4714 N
+ UW EY G e n/a 36 4667 4683 4714 N
+ UW EY G s n/a 36 4667 4683 4714 N
+ UW EY HH e n/a 36 4667 4683 4731 N
+ UW EY HH s n/a 36 4667 4683 4731 N
+ UW EY IH b n/a 36 4664 4710 4745 N
+ UW EY IH e n/a 36 4664 4710 4745 N
+ UW EY IH s n/a 36 4664 4710 4745 N
+ UW EY IY b n/a 36 4664 4710 4745 N
+ UW EY IY e n/a 36 4664 4710 4745 N
+ UW EY IY s n/a 36 4664 4710 4745 N
+ UW EY JH e n/a 36 4667 4683 4718 N
+ UW EY JH s n/a 36 4667 4683 4717 N
+ UW EY K b n/a 36 4667 4683 4714 N
+ UW EY K e n/a 36 4667 4683 4714 N
+ UW EY K s n/a 36 4667 4683 4714 N
+ UW EY L b n/a 36 4664 4709 4737 N
+ UW EY L e n/a 36 4664 4709 4729 N
+ UW EY L s n/a 36 4664 4709 4737 N
+ UW EY M b n/a 36 4668 4683 4726 N
+ UW EY M e n/a 36 4668 4683 4726 N
+ UW EY M s n/a 36 4668 4683 4726 N
+ UW EY N b n/a 36 4667 4692 4725 N
+ UW EY N e n/a 36 4667 4692 4725 N
+ UW EY N s n/a 36 4667 4692 4725 N
+ UW EY NG b n/a 36 4667 4683 4726 N
+ UW EY NG e n/a 36 4667 4683 4726 N
+ UW EY NG s n/a 36 4667 4683 4726 N
+ UW EY OW e n/a 36 4664 4710 4739 N
+ UW EY OW s n/a 36 4664 4710 4739 N
+ UW EY OY e n/a 36 4664 4710 4739 N
+ UW EY OY s n/a 36 4664 4710 4739 N
+ UW EY P b n/a 36 4668 4683 4715 N
+ UW EY P e n/a 36 4668 4683 4715 N
+ UW EY P s n/a 36 4668 4683 4715 N
+ UW EY R e n/a 36 4664 4709 4729 N
+ UW EY R s n/a 36 4664 4709 4738 N
+ UW EY S b n/a 36 4667 4689 4721 N
+ UW EY S e n/a 36 4667 4689 4721 N
+ UW EY S s n/a 36 4667 4689 4721 N
+ UW EY SH e n/a 36 4667 4685 4735 N
+ UW EY SH s n/a 36 4667 4685 4735 N
+ UW EY SIL e n/a 36 4667 4682 4733 N
+ UW EY SIL s n/a 36 4667 4682 4733 N
+ UW EY T b n/a 36 4667 4691 4718 N
+ UW EY T e n/a 36 4667 4691 4718 N
+ UW EY T s n/a 36 4667 4691 4718 N
+ UW EY TH e n/a 36 4667 4691 4722 N
+ UW EY TH s n/a 36 4667 4691 4722 N
+ UW EY UH e n/a 36 4664 4710 4739 N
+ UW EY UH s n/a 36 4664 4710 4739 N
+ UW EY UW b n/a 36 4664 4710 4739 N
+ UW EY UW e n/a 36 4664 4710 4739 N
+ UW EY UW s n/a 36 4664 4710 4739 N
+ UW EY V b n/a 36 4668 4683 4729 N
+ UW EY V e n/a 36 4668 4683 4729 N
+ UW EY V s n/a 36 4668 4683 4729 N
+ UW EY W b n/a 36 4664 4709 4739 N
+ UW EY W e n/a 36 4664 4709 4732 N
+ UW EY W s n/a 36 4664 4709 4739 N
+ UW EY Y b n/a 36 4664 4702 4745 N
+ UW EY Y e n/a 36 4664 4702 4736 N
+ UW EY Y s n/a 36 4664 4702 4745 N
+ UW EY Z b n/a 36 4667 4689 4723 N
+ UW EY Z e n/a 36 4667 4689 4723 N
+ UW EY Z i n/a 36 4667 4689 4723 N
+ UW EY Z s n/a 36 4667 4689 4723 N
+ UW EY ZH e n/a 36 4667 4685 4735 N
+ UW EY ZH s n/a 36 4667 4685 4735 N
+ UW F AA e n/a 36 4654 4705 4739 N
+ UW F AA s n/a 36 4656 4705 4739 N
+ UW F AE e n/a 36 4654 4705 4743 N
+ UW F AE i n/a 36 4656 4705 4744 N
+ UW F AE s n/a 36 4656 4705 4743 N
+ UW F AH b n/a 36 4656 4705 4740 N
+ UW F AH e n/a 36 4654 4705 4740 N
+ UW F AH i n/a 36 4656 4705 4742 N
+ UW F AH s n/a 36 4656 4705 4740 N
+ UW F AO e n/a 36 4654 4705 4739 N
+ UW F AO i n/a 36 4656 4705 4739 N
+ UW F AO s n/a 36 4656 4705 4739 N
+ UW F AW e n/a 36 4654 4705 4743 N
+ UW F AW s n/a 36 4656 4705 4743 N
+ UW F AY e n/a 36 4654 4705 4739 N
+ UW F AY s n/a 36 4656 4705 4739 N
+ UW F B b n/a 36 4656 4684 4715 N
+ UW F B e n/a 36 4654 4684 4715 N
+ UW F B i n/a 36 4656 4684 4715 N
+ UW F B s n/a 36 4656 4684 4715 N
+ UW F CH b n/a 36 4656 4684 4720 N
+ UW F CH e n/a 36 4654 4684 4720 N
+ UW F CH i n/a 36 4656 4684 4720 N
+ UW F CH s n/a 36 4656 4684 4720 N
+ UW F D b n/a 36 4656 4684 4720 N
+ UW F D e n/a 36 4656 4684 4720 N
+ UW F D i n/a 36 4656 4684 4720 N
+ UW F D s n/a 36 4656 4684 4720 N
+ UW F DH e n/a 36 4656 4684 4720 N
+ UW F DH s n/a 36 4656 4684 4720 N
+ UW F EH e n/a 36 4654 4705 4743 N
+ UW F EH s n/a 36 4656 4705 4743 N
+ UW F ER b n/a 36 4656 4705 4739 N
+ UW F ER e n/a 36 4654 4705 4739 N
+ UW F ER s n/a 36 4656 4705 4739 N
+ UW F EY b n/a 36 4656 4705 4743 N
+ UW F EY e n/a 36 4654 4705 4743 N
+ UW F EY s n/a 36 4656 4705 4743 N
+ UW F F b n/a 36 4656 4684 4734 N
+ UW F F e n/a 36 4654 4684 4734 N
+ UW F F s n/a 36 4656 4684 4734 N
+ UW F G b n/a 36 4656 4684 4715 N
+ UW F G e n/a 36 4654 4684 4715 N
+ UW F G s n/a 36 4656 4684 4715 N
+ UW F HH e n/a 36 4654 4684 4730 N
+ UW F HH i n/a 36 4656 4684 4730 N
+ UW F HH s n/a 36 4656 4684 4730 N
+ UW F IH b n/a 36 4656 4705 4745 N
+ UW F IH e n/a 36 4654 4705 4745 N
+ UW F IH s n/a 36 4656 4705 4745 N
+ UW F IY b n/a 36 4656 4705 4745 N
+ UW F IY e n/a 36 4654 4705 4745 N
+ UW F IY i n/a 36 4656 4705 4745 N
+ UW F IY s n/a 36 4656 4705 4745 N
+ UW F JH e n/a 36 4654 4684 4720 N
+ UW F JH i n/a 36 4656 4684 4720 N
+ UW F JH s n/a 36 4656 4684 4720 N
+ UW F K b n/a 36 4656 4684 4715 N
+ UW F K e n/a 36 4654 4684 4715 N
+ UW F K i n/a 36 4656 4684 4715 N
+ UW F K s n/a 36 4656 4684 4715 N
+ UW F L b n/a 36 4656 4705 4737 N
+ UW F L e n/a 36 4654 4705 4729 N
+ UW F L i n/a 36 4653 4706 4737 N
+ UW F L s n/a 36 4656 4705 4737 N
+ UW F M b n/a 36 4656 4684 4726 N
+ UW F M e n/a 36 4654 4684 4726 N
+ UW F M i n/a 36 4656 4684 4726 N
+ UW F M s n/a 36 4656 4684 4726 N
+ UW F N b n/a 36 4656 4684 4725 N
+ UW F N e n/a 36 4656 4684 4725 N
+ UW F N i n/a 36 4656 4684 4725 N
+ UW F N s n/a 36 4656 4684 4725 N
+ UW F NG b n/a 36 4656 4684 4726 N
+ UW F NG e n/a 36 4654 4684 4726 N
+ UW F NG i n/a 36 4656 4684 4726 N
+ UW F NG s n/a 36 4656 4684 4726 N
+ UW F OW e n/a 36 4654 4705 4739 N
+ UW F OW i n/a 36 4656 4705 4739 N
+ UW F OW s n/a 36 4656 4705 4739 N
+ UW F OY e n/a 36 4654 4705 4739 N
+ UW F OY s n/a 36 4656 4705 4739 N
+ UW F P b n/a 36 4656 4684 4715 N
+ UW F P e n/a 36 4654 4684 4715 N
+ UW F P s n/a 36 4656 4684 4715 N
+ UW F R e n/a 36 4654 4705 4729 N
+ UW F R i n/a 36 4653 4707 4738 N
+ UW F R s n/a 36 4656 4705 4738 N
+ UW F S b n/a 36 4656 4686 4721 N
+ UW F S e n/a 36 4656 4686 4721 N
+ UW F S i n/a 36 4656 4686 4721 N
+ UW F S s n/a 36 4656 4686 4721 N
+ UW F SH e n/a 36 4654 4686 4735 N
+ UW F SH i n/a 36 4656 4686 4735 N
+ UW F SH s n/a 36 4656 4686 4735 N
+ UW F SIL e n/a 36 4656 4684 4733 N
+ UW F SIL s n/a 36 4656 4684 4733 N
+ UW F T b n/a 36 4656 4684 4720 N
+ UW F T e n/a 36 4656 4684 4720 N
+ UW F T i n/a 36 4656 4684 4720 N
+ UW F T s n/a 36 4656 4684 4720 N
+ UW F TH e n/a 36 4656 4684 4722 N
+ UW F TH i n/a 36 4656 4684 4721 N
+ UW F TH s n/a 36 4656 4684 4722 N
+ UW F UH e n/a 36 4654 4705 4739 N
+ UW F UH s n/a 36 4656 4705 4739 N
+ UW F UW b n/a 36 4656 4705 4739 N
+ UW F UW e n/a 36 4654 4705 4739 N
+ UW F UW i n/a 36 4656 4705 4739 N
+ UW F UW s n/a 36 4656 4705 4739 N
+ UW F V b n/a 36 4656 4684 4729 N
+ UW F V e n/a 36 4654 4684 4729 N
+ UW F V s n/a 36 4656 4684 4729 N
+ UW F W b n/a 36 4656 4705 4739 N
+ UW F W e n/a 36 4654 4705 4732 N
+ UW F W s n/a 36 4656 4705 4739 N
+ UW F Y b n/a 36 4656 4705 4745 N
+ UW F Y e n/a 36 4654 4705 4736 N
+ UW F Y s n/a 36 4656 4705 4745 N
+ UW F Z b n/a 36 4656 4686 4723 N
+ UW F Z e n/a 36 4656 4686 4723 N
+ UW F Z i n/a 36 4656 4686 4723 N
+ UW F Z s n/a 36 4656 4686 4723 N
+ UW F ZH e n/a 36 4654 4686 4735 N
+ UW F ZH s n/a 36 4656 4686 4735 N
+ UW G AA e n/a 36 4652 4710 4739 N
+ UW G AA i n/a 36 4652 4710 4739 N
+ UW G AA s n/a 36 4652 4710 4739 N
+ UW G AE e n/a 36 4652 4710 4743 N
+ UW G AE i n/a 36 4652 4710 4744 N
+ UW G AE s n/a 36 4652 4710 4743 N
+ UW G AH b n/a 36 4652 4710 4740 N
+ UW G AH e n/a 36 4652 4710 4740 N
+ UW G AH i n/a 36 4652 4710 4742 N
+ UW G AH s n/a 36 4652 4710 4740 N
+ UW G AO e n/a 36 4652 4710 4739 N
+ UW G AO s n/a 36 4652 4710 4739 N
+ UW G AW e n/a 36 4652 4710 4743 N
+ UW G AW s n/a 36 4652 4710 4743 N
+ UW G AY e n/a 36 4652 4710 4739 N
+ UW G AY s n/a 36 4652 4710 4739 N
+ UW G B b n/a 36 4652 4683 4715 N
+ UW G B e n/a 36 4652 4683 4715 N
+ UW G B i n/a 36 4652 4683 4715 N
+ UW G B s n/a 36 4652 4683 4715 N
+ UW G CH b n/a 36 4652 4683 4717 N
+ UW G CH e n/a 36 4652 4683 4717 N
+ UW G CH i n/a 36 4652 4683 4716 N
+ UW G CH s n/a 36 4652 4683 4717 N
+ UW G D b n/a 36 4652 4685 4717 N
+ UW G D e n/a 36 4652 4685 4717 N
+ UW G D i n/a 36 4652 4685 4716 N
+ UW G D s n/a 36 4652 4685 4717 N
+ UW G DH e n/a 36 4652 4685 4719 N
+ UW G DH s n/a 36 4652 4685 4719 N
+ UW G EH e n/a 36 4652 4710 4743 N
+ UW G EH s n/a 36 4652 4710 4743 N
+ UW G ER b n/a 36 4652 4710 4739 N
+ UW G ER e n/a 36 4652 4710 4739 N
+ UW G ER i n/a 36 4652 4710 4741 N
+ UW G ER s n/a 36 4652 4710 4739 N
+ UW G EY b n/a 36 4652 4710 4743 N
+ UW G EY e n/a 36 4652 4710 4743 N
+ UW G EY s n/a 36 4652 4710 4743 N
+ UW G F b n/a 36 4652 4682 4734 N
+ UW G F e n/a 36 4652 4682 4734 N
+ UW G F i n/a 36 4652 4682 4734 N
+ UW G F s n/a 36 4652 4682 4734 N
+ UW G G b n/a 36 4652 4683 4715 N
+ UW G G e n/a 36 4652 4683 4715 N
+ UW G G i n/a 36 4652 4683 4715 N
+ UW G G s n/a 36 4652 4683 4715 N
+ UW G HH e n/a 36 4652 4683 4731 N
+ UW G HH s n/a 36 4652 4683 4731 N
+ UW G IH b n/a 36 4652 4710 4745 N
+ UW G IH e n/a 36 4652 4710 4745 N
+ UW G IH s n/a 36 4652 4710 4745 N
+ UW G IY b n/a 36 4652 4710 4745 N
+ UW G IY e n/a 36 4652 4710 4745 N
+ UW G IY i n/a 36 4652 4710 4745 N
+ UW G IY s n/a 36 4652 4710 4745 N
+ UW G JH e n/a 36 4652 4683 4717 N
+ UW G JH i n/a 36 4652 4683 4716 N
+ UW G JH s n/a 36 4652 4683 4717 N
+ UW G K b n/a 36 4652 4683 4715 N
+ UW G K e n/a 36 4652 4683 4715 N
+ UW G K i n/a 36 4652 4683 4715 N
+ UW G K s n/a 36 4652 4683 4715 N
+ UW G L b n/a 36 4652 4709 4737 N
+ UW G L e n/a 36 4652 4709 4729 N
+ UW G L i n/a 36 4652 4709 4737 N
+ UW G L s n/a 36 4652 4709 4737 N
+ UW G M b n/a 36 4652 4683 4726 N
+ UW G M e n/a 36 4652 4683 4726 N
+ UW G M i n/a 36 4652 4683 4726 N
+ UW G M s n/a 36 4652 4683 4726 N
+ UW G N b n/a 36 4652 4685 4725 N
+ UW G N e n/a 36 4652 4685 4724 N
+ UW G N i n/a 36 4652 4685 4725 N
+ UW G N s n/a 36 4652 4685 4725 N
+ UW G NG b n/a 36 4652 4683 4726 N
+ UW G NG e n/a 36 4652 4683 4726 N
+ UW G NG s n/a 36 4652 4683 4726 N
+ UW G OW e n/a 36 4652 4710 4739 N
+ UW G OW s n/a 36 4652 4710 4739 N
+ UW G OY e n/a 36 4652 4710 4739 N
+ UW G OY s n/a 36 4652 4710 4739 N
+ UW G P b n/a 36 4652 4683 4715 N
+ UW G P e n/a 36 4652 4683 4715 N
+ UW G P i n/a 36 4652 4683 4715 N
+ UW G P s n/a 36 4652 4683 4715 N
+ UW G R e n/a 36 4652 4709 4729 N
+ UW G R i n/a 36 4652 4709 4738 N
+ UW G R s n/a 36 4652 4709 4738 N
+ UW G S b n/a 36 4652 4685 4721 N
+ UW G S e n/a 36 4652 4685 4721 N
+ UW G S i n/a 36 4652 4685 4721 N
+ UW G S s n/a 36 4652 4685 4721 N
+ UW G SH e n/a 36 4652 4685 4735 N
+ UW G SH i n/a 36 4652 4685 4735 N
+ UW G SH s n/a 36 4652 4685 4735 N
+ UW G SIL e n/a 36 4652 4682 4733 N
+ UW G SIL s n/a 36 4652 4682 4733 N
+ UW G T b n/a 36 4652 4685 4717 N
+ UW G T e n/a 36 4652 4685 4717 N
+ UW G T i n/a 36 4652 4685 4716 N
+ UW G T s n/a 36 4652 4685 4717 N
+ UW G TH e n/a 36 4652 4685 4722 N
+ UW G TH i n/a 36 4652 4685 4721 N
+ UW G TH s n/a 36 4652 4685 4722 N
+ UW G UH e n/a 36 4652 4710 4739 N
+ UW G UH s n/a 36 4652 4710 4739 N
+ UW G UW b n/a 36 4652 4710 4739 N
+ UW G UW e n/a 36 4652 4710 4739 N
+ UW G UW s n/a 36 4652 4710 4739 N
+ UW G V b n/a 36 4652 4683 4729 N
+ UW G V e n/a 36 4652 4683 4729 N
+ UW G V i n/a 36 4652 4683 4727 N
+ UW G V s n/a 36 4652 4683 4729 N
+ UW G W b n/a 36 4652 4709 4739 N
+ UW G W e n/a 36 4652 4709 4732 N
+ UW G W s n/a 36 4652 4709 4739 N
+ UW G Y b n/a 36 4652 4702 4745 N
+ UW G Y e n/a 36 4652 4702 4736 N
+ UW G Y s n/a 36 4652 4702 4745 N
+ UW G Z b n/a 36 4652 4685 4723 N
+ UW G Z e n/a 36 4652 4685 4723 N
+ UW G Z i n/a 36 4652 4685 4723 N
+ UW G Z s n/a 36 4652 4685 4723 N
+ UW G ZH e n/a 36 4652 4685 4735 N
+ UW G ZH s n/a 36 4652 4685 4735 N
+ UW HH AA e n/a 36 4654 4705 4739 N
+ UW HH AA i n/a 36 4654 4705 4739 N
+ UW HH AA s n/a 36 4654 4705 4739 N
+ UW HH AE e n/a 36 4654 4705 4743 N
+ UW HH AE s n/a 36 4654 4705 4743 N
+ UW HH AH b n/a 36 4654 4705 4740 N
+ UW HH AH e n/a 36 4654 4705 4740 N
+ UW HH AH i n/a 36 4654 4705 4742 N
+ UW HH AH s n/a 36 4654 4705 4740 N
+ UW HH AO e n/a 36 4654 4705 4739 N
+ UW HH AO s n/a 36 4654 4705 4739 N
+ UW HH AW e n/a 36 4654 4705 4743 N
+ UW HH AW s n/a 36 4654 4705 4743 N
+ UW HH AY e n/a 36 4654 4705 4739 N
+ UW HH AY s n/a 36 4654 4705 4739 N
+ UW HH B b n/a 36 4654 4683 4715 N
+ UW HH B e n/a 36 4654 4683 4715 N
+ UW HH B i n/a 36 4654 4683 4715 N
+ UW HH B s n/a 36 4654 4683 4715 N
+ UW HH CH b n/a 36 4654 4683 4717 N
+ UW HH CH e n/a 36 4654 4683 4717 N
+ UW HH CH i n/a 36 4654 4683 4716 N
+ UW HH CH s n/a 36 4654 4683 4717 N
+ UW HH D b n/a 36 4655 4686 4717 N
+ UW HH D e n/a 36 4655 4686 4717 N
+ UW HH D i n/a 36 4655 4686 4716 N
+ UW HH D s n/a 36 4655 4686 4717 N
+ UW HH DH e n/a 36 4655 4686 4719 N
+ UW HH DH s n/a 36 4655 4686 4719 N
+ UW HH EH e n/a 36 4654 4705 4743 N
+ UW HH EH i n/a 36 4654 4705 4744 N
+ UW HH EH s n/a 36 4654 4705 4743 N
+ UW HH ER b n/a 36 4654 4705 4739 N
+ UW HH ER e n/a 36 4654 4705 4739 N
+ UW HH ER i n/a 36 4654 4707 4741 N
+ UW HH ER s n/a 36 4654 4705 4739 N
+ UW HH EY b n/a 36 4654 4705 4743 N
+ UW HH EY e n/a 36 4654 4705 4743 N
+ UW HH EY s n/a 36 4654 4705 4743 N
+ UW HH F b n/a 36 4654 4682 4734 N
+ UW HH F e n/a 36 4654 4682 4734 N
+ UW HH F i n/a 36 4654 4682 4734 N
+ UW HH F s n/a 36 4654 4682 4734 N
+ UW HH G b n/a 36 4654 4683 4715 N
+ UW HH G e n/a 36 4654 4683 4715 N
+ UW HH G i n/a 36 4654 4683 4715 N
+ UW HH G s n/a 36 4654 4683 4715 N
+ UW HH HH e n/a 36 4654 4683 4730 N
+ UW HH HH s n/a 36 4654 4683 4730 N
+ UW HH IH b n/a 36 4654 4705 4745 N
+ UW HH IH e n/a 36 4654 4705 4745 N
+ UW HH IH i n/a 36 4654 4705 4745 N
+ UW HH IH s n/a 36 4654 4705 4745 N
+ UW HH IY b n/a 36 4654 4705 4745 N
+ UW HH IY e n/a 36 4654 4705 4745 N
+ UW HH IY i n/a 36 4654 4705 4745 N
+ UW HH IY s n/a 36 4654 4705 4745 N
+ UW HH JH e n/a 36 4654 4683 4717 N
+ UW HH JH i n/a 36 4654 4683 4716 N
+ UW HH JH s n/a 36 4654 4683 4717 N
+ UW HH K b n/a 36 4654 4683 4715 N
+ UW HH K e n/a 36 4654 4683 4715 N
+ UW HH K i n/a 36 4654 4683 4715 N
+ UW HH K s n/a 36 4654 4683 4715 N
+ UW HH L b n/a 36 4654 4705 4737 N
+ UW HH L e n/a 36 4654 4705 4729 N
+ UW HH L i n/a 36 4653 4706 4737 N
+ UW HH L s n/a 36 4654 4705 4737 N
+ UW HH M b n/a 36 4654 4683 4726 N
+ UW HH M e n/a 36 4654 4683 4726 N
+ UW HH M i n/a 36 4654 4683 4726 N
+ UW HH M s n/a 36 4654 4683 4726 N
+ UW HH N b n/a 36 4655 4686 4725 N
+ UW HH N e n/a 36 4655 4686 4725 N
+ UW HH N i n/a 36 4655 4686 4725 N
+ UW HH N s n/a 36 4655 4686 4725 N
+ UW HH NG b n/a 36 4654 4683 4726 N
+ UW HH NG e n/a 36 4654 4683 4726 N
+ UW HH NG i n/a 36 4654 4683 4726 N
+ UW HH NG s n/a 36 4654 4683 4726 N
+ UW HH OW e n/a 36 4654 4705 4739 N
+ UW HH OW s n/a 36 4654 4705 4739 N
+ UW HH OY e n/a 36 4654 4705 4739 N
+ UW HH OY s n/a 36 4654 4705 4739 N
+ UW HH P b n/a 36 4654 4683 4715 N
+ UW HH P e n/a 36 4654 4683 4715 N
+ UW HH P i n/a 36 4654 4683 4715 N
+ UW HH P s n/a 36 4654 4683 4715 N
+ UW HH R e n/a 36 4654 4705 4729 N
+ UW HH R i n/a 36 4653 4707 4738 N
+ UW HH R s n/a 36 4654 4705 4738 N
+ UW HH S b n/a 36 4655 4686 4721 N
+ UW HH S e n/a 36 4655 4686 4721 N
+ UW HH S i n/a 36 4655 4686 4721 N
+ UW HH S s n/a 36 4655 4686 4721 N
+ UW HH SH e n/a 36 4654 4686 4735 N
+ UW HH SH i n/a 36 4654 4686 4735 N
+ UW HH SH s n/a 36 4654 4686 4735 N
+ UW HH SIL e n/a 36 4656 4682 4733 N
+ UW HH SIL s n/a 36 4656 4682 4733 N
+ UW HH T b n/a 36 4655 4686 4717 N
+ UW HH T e n/a 36 4655 4686 4717 N
+ UW HH T i n/a 36 4655 4686 4716 N
+ UW HH T s n/a 36 4655 4686 4717 N
+ UW HH TH e n/a 36 4655 4686 4722 N
+ UW HH TH i n/a 36 4655 4686 4721 N
+ UW HH TH s n/a 36 4655 4686 4722 N
+ UW HH UH e n/a 36 4654 4705 4739 N
+ UW HH UH s n/a 36 4654 4705 4739 N
+ UW HH UW b n/a 36 4654 4705 4739 N
+ UW HH UW e n/a 36 4654 4705 4739 N
+ UW HH UW s n/a 36 4654 4705 4739 N
+ UW HH V b n/a 36 4654 4683 4729 N
+ UW HH V e n/a 36 4654 4683 4729 N
+ UW HH V i n/a 36 4654 4683 4727 N
+ UW HH V s n/a 36 4654 4683 4729 N
+ UW HH W b n/a 36 4654 4705 4739 N
+ UW HH W e n/a 36 4654 4705 4732 N
+ UW HH W i n/a 36 4654 4706 4742 N
+ UW HH W s n/a 36 4654 4705 4739 N
+ UW HH Y b n/a 36 4654 4705 4745 N
+ UW HH Y e n/a 36 4654 4705 4736 N
+ UW HH Y i n/a 36 4654 4705 4745 N
+ UW HH Y s n/a 36 4654 4705 4745 N
+ UW HH Z b n/a 36 4655 4686 4723 N
+ UW HH Z e n/a 36 4655 4686 4723 N
+ UW HH Z i n/a 36 4655 4686 4723 N
+ UW HH Z s n/a 36 4655 4686 4723 N
+ UW HH ZH e n/a 36 4654 4686 4735 N
+ UW HH ZH i n/a 36 4654 4686 4735 N
+ UW HH ZH s n/a 36 4654 4686 4735 N
+ UW IH AA s n/a 36 4672 4710 4739 N
+ UW IH AE s n/a 36 4673 4710 4743 N
+ UW IH AH b n/a 36 4673 4710 4740 N
+ UW IH AH s n/a 36 4673 4710 4740 N
+ UW IH AO s n/a 36 4672 4710 4739 N
+ UW IH AW s n/a 36 4672 4710 4743 N
+ UW IH AY s n/a 36 4673 4710 4739 N
+ UW IH B b n/a 36 4676 4683 4715 N
+ UW IH B s n/a 36 4676 4683 4715 N
+ UW IH CH b n/a 36 4670 4683 4718 N
+ UW IH CH s n/a 36 4670 4683 4718 N
+ UW IH D b n/a 36 4670 4685 4718 N
+ UW IH D s n/a 36 4670 4685 4718 N
+ UW IH DH s n/a 36 4669 4685 4719 N
+ UW IH EH s n/a 36 4673 4710 4743 N
+ UW IH ER b n/a 36 4672 4710 4739 N
+ UW IH ER s n/a 36 4672 4710 4739 N
+ UW IH EY b n/a 36 4673 4710 4743 N
+ UW IH EY s n/a 36 4673 4710 4743 N
+ UW IH F b n/a 36 4676 4682 4734 N
+ UW IH F s n/a 36 4676 4682 4734 N
+ UW IH G b n/a 36 4675 4683 4715 N
+ UW IH G s n/a 36 4675 4683 4715 N
+ UW IH HH s n/a 36 4676 4683 4731 N
+ UW IH IH b n/a 36 4673 4710 4745 N
+ UW IH IH s n/a 36 4673 4710 4745 N
+ UW IH IY b n/a 36 4673 4710 4745 N
+ UW IH IY s n/a 36 4673 4710 4745 N
+ UW IH JH s n/a 36 4670 4683 4717 N
+ UW IH K b n/a 36 4675 4683 4715 N
+ UW IH K s n/a 36 4675 4683 4715 N
+ UW IH L b n/a 36 4674 4709 4737 N
+ UW IH L s n/a 36 4674 4709 4737 N
+ UW IH M b n/a 36 4674 4683 4726 N
+ UW IH M s n/a 36 4674 4683 4726 N
+ UW IH N b n/a 36 4671 4685 4724 N
+ UW IH N s n/a 36 4671 4685 4724 N
+ UW IH NG b n/a 36 4675 4683 4726 N
+ UW IH NG s n/a 36 4675 4683 4726 N
+ UW IH OW s n/a 36 4672 4710 4739 N
+ UW IH OY s n/a 36 4673 4710 4739 N
+ UW IH P b n/a 36 4676 4683 4715 N
+ UW IH P s n/a 36 4676 4683 4715 N
+ UW IH R s n/a 36 4674 4709 4738 N
+ UW IH S b n/a 36 4670 4685 4721 N
+ UW IH S s n/a 36 4670 4685 4721 N
+ UW IH SH s n/a 36 4670 4685 4735 N
+ UW IH SIL s n/a 36 4677 4682 4733 N
+ UW IH T b n/a 36 4670 4685 4718 N
+ UW IH T s n/a 36 4670 4685 4718 N
+ UW IH TH s n/a 36 4670 4685 4722 N
+ UW IH UH s n/a 36 4672 4710 4739 N
+ UW IH UW b n/a 36 4672 4710 4739 N
+ UW IH UW s n/a 36 4672 4710 4739 N
+ UW IH V b n/a 36 4676 4683 4729 N
+ UW IH V s n/a 36 4676 4683 4729 N
+ UW IH W b n/a 36 4672 4709 4739 N
+ UW IH W s n/a 36 4672 4709 4739 N
+ UW IH Y b n/a 36 4677 4702 4745 N
+ UW IH Y s n/a 36 4677 4702 4745 N
+ UW IH Z b n/a 36 4669 4685 4723 N
+ UW IH Z s n/a 36 4669 4685 4723 N
+ UW IH ZH s n/a 36 4669 4685 4735 N
+ UW IY AA e n/a 36 4672 4710 4739 N
+ UW IY AA i n/a 36 4672 4710 4739 N
+ UW IY AA s n/a 36 4672 4710 4739 N
+ UW IY AE e n/a 36 4673 4710 4743 N
+ UW IY AE s n/a 36 4673 4710 4743 N
+ UW IY AH b n/a 36 4673 4710 4740 N
+ UW IY AH e n/a 36 4673 4710 4740 N
+ UW IY AH i n/a 36 4672 4710 4742 N
+ UW IY AH s n/a 36 4673 4710 4740 N
+ UW IY AO e n/a 36 4672 4710 4739 N
+ UW IY AO s n/a 36 4672 4710 4739 N
+ UW IY AW e n/a 36 4672 4710 4743 N
+ UW IY AW s n/a 36 4672 4710 4743 N
+ UW IY AY e n/a 36 4673 4710 4739 N
+ UW IY AY s n/a 36 4673 4710 4739 N
+ UW IY B b n/a 36 4676 4683 4715 N
+ UW IY B e n/a 36 4676 4683 4715 N
+ UW IY B i n/a 36 4676 4683 4715 N
+ UW IY B s n/a 36 4676 4683 4715 N
+ UW IY CH b n/a 36 4670 4683 4718 N
+ UW IY CH e n/a 36 4670 4683 4718 N
+ UW IY CH i n/a 36 4670 4683 4718 N
+ UW IY CH s n/a 36 4670 4683 4718 N
+ UW IY D b n/a 36 4670 4691 4718 N
+ UW IY D e n/a 36 4670 4691 4718 N
+ UW IY D i n/a 36 4670 4691 4718 N
+ UW IY D s n/a 36 4670 4691 4718 N
+ UW IY DH e n/a 36 4669 4691 4719 N
+ UW IY DH s n/a 36 4669 4691 4719 N
+ UW IY EH e n/a 36 4673 4710 4743 N
+ UW IY EH s n/a 36 4673 4710 4743 N
+ UW IY ER b n/a 36 4672 4710 4739 N
+ UW IY ER e n/a 36 4672 4710 4739 N
+ UW IY ER s n/a 36 4672 4710 4739 N
+ UW IY EY b n/a 36 4673 4710 4743 N
+ UW IY EY e n/a 36 4673 4710 4743 N
+ UW IY EY s n/a 36 4673 4710 4743 N
+ UW IY F b n/a 36 4676 4682 4734 N
+ UW IY F e n/a 36 4676 4682 4734 N
+ UW IY F s n/a 36 4676 4682 4734 N
+ UW IY G b n/a 36 4675 4683 4714 N
+ UW IY G e n/a 36 4675 4683 4714 N
+ UW IY G s n/a 36 4675 4683 4714 N
+ UW IY HH e n/a 36 4676 4683 4731 N
+ UW IY HH s n/a 36 4676 4683 4731 N
+ UW IY IH b n/a 36 4673 4710 4745 N
+ UW IY IH e n/a 36 4673 4710 4745 N
+ UW IY IH s n/a 36 4673 4710 4745 N
+ UW IY IY b n/a 36 4673 4710 4745 N
+ UW IY IY e n/a 36 4673 4710 4745 N
+ UW IY IY s n/a 36 4673 4710 4745 N
+ UW IY JH e n/a 36 4670 4683 4718 N
+ UW IY JH i n/a 36 4670 4683 4717 N
+ UW IY JH s n/a 36 4670 4683 4717 N
+ UW IY K b n/a 36 4675 4683 4714 N
+ UW IY K e n/a 36 4675 4683 4714 N
+ UW IY K i n/a 36 4675 4683 4714 N
+ UW IY K s n/a 36 4675 4683 4714 N
+ UW IY L b n/a 36 4674 4709 4737 N
+ UW IY L e n/a 36 4674 4709 4729 N
+ UW IY L i n/a 36 4674 4709 4737 N
+ UW IY L s n/a 36 4674 4709 4737 N
+ UW IY M b n/a 36 4674 4683 4726 N
+ UW IY M e n/a 36 4674 4683 4726 N
+ UW IY M i n/a 36 4674 4683 4726 N
+ UW IY M s n/a 36 4674 4683 4726 N
+ UW IY N b n/a 36 4671 4692 4724 N
+ UW IY N e n/a 36 4671 4692 4724 N
+ UW IY N i n/a 36 4671 4692 4724 N
+ UW IY N s n/a 36 4671 4692 4724 N
+ UW IY NG b n/a 36 4675 4683 4726 N
+ UW IY NG e n/a 36 4675 4683 4726 N
+ UW IY NG s n/a 36 4675 4683 4726 N
+ UW IY OW e n/a 36 4672 4710 4739 N
+ UW IY OW s n/a 36 4672 4710 4739 N
+ UW IY OY e n/a 36 4673 4710 4739 N
+ UW IY OY s n/a 36 4673 4710 4739 N
+ UW IY P b n/a 36 4676 4683 4715 N
+ UW IY P e n/a 36 4676 4683 4715 N
+ UW IY P i n/a 36 4676 4683 4715 N
+ UW IY P s n/a 36 4676 4683 4715 N
+ UW IY R e n/a 36 4674 4709 4729 N
+ UW IY R s n/a 36 4674 4709 4738 N
+ UW IY S b n/a 36 4670 4689 4721 N
+ UW IY S e n/a 36 4670 4689 4721 N
+ UW IY S i n/a 36 4669 4689 4721 N
+ UW IY S s n/a 36 4670 4689 4721 N
+ UW IY SH e n/a 36 4670 4685 4735 N
+ UW IY SH s n/a 36 4670 4685 4735 N
+ UW IY SIL e n/a 36 4677 4682 4733 N
+ UW IY SIL s n/a 36 4677 4682 4733 N
+ UW IY T b n/a 36 4670 4691 4718 N
+ UW IY T e n/a 36 4670 4691 4718 N
+ UW IY T i n/a 36 4670 4691 4718 N
+ UW IY T s n/a 36 4670 4691 4718 N
+ UW IY TH e n/a 36 4670 4691 4722 N
+ UW IY TH s n/a 36 4670 4691 4722 N
+ UW IY UH e n/a 36 4672 4710 4739 N
+ UW IY UH s n/a 36 4672 4710 4739 N
+ UW IY UW b n/a 36 4672 4710 4739 N
+ UW IY UW e n/a 36 4672 4710 4739 N
+ UW IY UW s n/a 36 4672 4710 4739 N
+ UW IY V b n/a 36 4676 4683 4729 N
+ UW IY V e n/a 36 4676 4683 4729 N
+ UW IY V i n/a 36 4675 4683 4727 N
+ UW IY V s n/a 36 4676 4683 4729 N
+ UW IY W b n/a 36 4672 4709 4739 N
+ UW IY W e n/a 36 4672 4709 4732 N
+ UW IY W s n/a 36 4672 4709 4739 N
+ UW IY Y b n/a 36 4677 4702 4745 N
+ UW IY Y e n/a 36 4677 4702 4736 N
+ UW IY Y s n/a 36 4677 4702 4745 N
+ UW IY Z b n/a 36 4669 4689 4723 N
+ UW IY Z e n/a 36 4669 4689 4723 N
+ UW IY Z i n/a 36 4669 4689 4723 N
+ UW IY Z s n/a 36 4669 4689 4723 N
+ UW IY ZH e n/a 36 4669 4685 4735 N
+ UW IY ZH s n/a 36 4669 4685 4735 N
+ UW JH AA e n/a 36 4664 4710 4739 N
+ UW JH AA i n/a 36 4665 4710 4739 N
+ UW JH AA s n/a 36 4664 4710 4739 N
+ UW JH AE e n/a 36 4664 4710 4743 N
+ UW JH AE i n/a 36 4665 4710 4744 N
+ UW JH AE s n/a 36 4664 4710 4743 N
+ UW JH AH b n/a 36 4664 4710 4740 N
+ UW JH AH e n/a 36 4664 4710 4740 N
+ UW JH AH i n/a 36 4665 4710 4742 N
+ UW JH AH s n/a 36 4664 4710 4740 N
+ UW JH AO e n/a 36 4664 4710 4739 N
+ UW JH AO s n/a 36 4664 4710 4739 N
+ UW JH AW e n/a 36 4664 4710 4743 N
+ UW JH AW s n/a 36 4664 4710 4743 N
+ UW JH AY e n/a 36 4664 4710 4739 N
+ UW JH AY s n/a 36 4664 4710 4739 N
+ UW JH B b n/a 36 4660 4698 4715 N
+ UW JH B e n/a 36 4660 4698 4715 N
+ UW JH B i n/a 36 4660 4698 4715 N
+ UW JH B s n/a 36 4660 4698 4715 N
+ UW JH CH b n/a 36 4660 4702 4717 N
+ UW JH CH e n/a 36 4660 4702 4717 N
+ UW JH CH s n/a 36 4660 4702 4717 N
+ UW JH D b n/a 36 4660 4688 4717 N
+ UW JH D e n/a 36 4660 4688 4717 N
+ UW JH D i n/a 36 4660 4688 4716 N
+ UW JH D s n/a 36 4660 4688 4717 N
+ UW JH DH e n/a 36 4660 4688 4719 N
+ UW JH DH s n/a 36 4660 4688 4719 N
+ UW JH EH e n/a 36 4664 4710 4744 N
+ UW JH EH i n/a 36 4665 4710 4744 N
+ UW JH EH s n/a 36 4664 4710 4744 N
+ UW JH ER b n/a 36 4664 4710 4739 N
+ UW JH ER e n/a 36 4664 4710 4739 N
+ UW JH ER i n/a 36 4665 4710 4741 N
+ UW JH ER s n/a 36 4664 4710 4739 N
+ UW JH EY b n/a 36 4664 4710 4744 N
+ UW JH EY e n/a 36 4664 4710 4744 N
+ UW JH EY i n/a 36 4665 4710 4744 N
+ UW JH EY s n/a 36 4664 4710 4744 N
+ UW JH F b n/a 36 4660 4698 4734 N
+ UW JH F e n/a 36 4660 4698 4734 N
+ UW JH F i n/a 36 4660 4698 4734 N
+ UW JH F s n/a 36 4660 4698 4734 N
+ UW JH G b n/a 36 4660 4698 4715 N
+ UW JH G e n/a 36 4660 4698 4715 N
+ UW JH G i n/a 36 4660 4698 4715 N
+ UW JH G s n/a 36 4660 4698 4715 N
+ UW JH HH e n/a 36 4660 4697 4731 N
+ UW JH HH s n/a 36 4660 4697 4731 N
+ UW JH IH b n/a 36 4664 4710 4745 N
+ UW JH IH e n/a 36 4664 4710 4745 N
+ UW JH IH i n/a 36 4665 4710 4745 N
+ UW JH IH s n/a 36 4664 4710 4745 N
+ UW JH IY b n/a 36 4664 4710 4745 N
+ UW JH IY e n/a 36 4664 4710 4745 N
+ UW JH IY i n/a 36 4665 4710 4745 N
+ UW JH IY s n/a 36 4664 4710 4745 N
+ UW JH JH e n/a 36 4660 4702 4717 N
+ UW JH JH i n/a 36 4660 4702 4716 N
+ UW JH JH s n/a 36 4660 4702 4717 N
+ UW JH K b n/a 36 4660 4698 4715 N
+ UW JH K e n/a 36 4660 4698 4715 N
+ UW JH K i n/a 36 4660 4698 4715 N
+ UW JH K s n/a 36 4660 4698 4715 N
+ UW JH L b n/a 36 4664 4709 4740 N
+ UW JH L e n/a 36 4664 4709 4729 N
+ UW JH L i n/a 36 4665 4709 4742 N
+ UW JH L s n/a 36 4664 4709 4740 N
+ UW JH M b n/a 36 4660 4697 4728 N
+ UW JH M e n/a 36 4660 4697 4728 N
+ UW JH M i n/a 36 4660 4697 4728 N
+ UW JH M s n/a 36 4660 4697 4728 N
+ UW JH N b n/a 36 4660 4688 4725 N
+ UW JH N e n/a 36 4660 4688 4725 N
+ UW JH N i n/a 36 4660 4688 4725 N
+ UW JH N s n/a 36 4660 4688 4725 N
+ UW JH NG b n/a 36 4660 4697 4728 N
+ UW JH NG e n/a 36 4660 4697 4728 N
+ UW JH NG s n/a 36 4660 4697 4728 N
+ UW JH OW e n/a 36 4664 4710 4739 N
+ UW JH OW i n/a 36 4665 4710 4739 N
+ UW JH OW s n/a 36 4664 4710 4739 N
+ UW JH OY e n/a 36 4664 4710 4739 N
+ UW JH OY s n/a 36 4664 4710 4739 N
+ UW JH P b n/a 36 4660 4698 4715 N
+ UW JH P e n/a 36 4660 4698 4715 N
+ UW JH P i n/a 36 4660 4698 4715 N
+ UW JH P s n/a 36 4660 4698 4715 N
+ UW JH R e n/a 36 4664 4709 4729 N
+ UW JH R i n/a 36 4665 4709 4742 N
+ UW JH R s n/a 36 4664 4709 4740 N
+ UW JH S b n/a 36 4660 4688 4722 N
+ UW JH S e n/a 36 4660 4688 4722 N
+ UW JH S i n/a 36 4660 4688 4722 N
+ UW JH S s n/a 36 4660 4688 4722 N
+ UW JH SH e n/a 36 4660 4702 4735 N
+ UW JH SH s n/a 36 4660 4702 4735 N
+ UW JH SIL e n/a 36 4667 4703 4733 N
+ UW JH SIL s n/a 36 4667 4703 4733 N
+ UW JH T b n/a 36 4660 4688 4717 N
+ UW JH T e n/a 36 4660 4688 4717 N
+ UW JH T i n/a 36 4660 4688 4716 N
+ UW JH T s n/a 36 4660 4688 4717 N
+ UW JH TH e n/a 36 4660 4688 4722 N
+ UW JH TH s n/a 36 4660 4688 4722 N
+ UW JH UH e n/a 36 4664 4710 4739 N
+ UW JH UH s n/a 36 4664 4710 4739 N
+ UW JH UW b n/a 36 4664 4710 4739 N
+ UW JH UW e n/a 36 4664 4710 4739 N
+ UW JH UW s n/a 36 4664 4710 4739 N
+ UW JH V b n/a 36 4660 4698 4728 N
+ UW JH V e n/a 36 4660 4698 4728 N
+ UW JH V i n/a 36 4660 4698 4728 N
+ UW JH V s n/a 36 4660 4698 4728 N
+ UW JH W b n/a 36 4664 4709 4739 N
+ UW JH W e n/a 36 4664 4709 4732 N
+ UW JH W i n/a 36 4665 4709 4742 N
+ UW JH W s n/a 36 4664 4709 4739 N
+ UW JH Y b n/a 36 4664 4702 4745 N
+ UW JH Y e n/a 36 4664 4702 4736 N
+ UW JH Y s n/a 36 4664 4702 4745 N
+ UW JH Z b n/a 36 4660 4688 4723 N
+ UW JH Z e n/a 36 4660 4688 4723 N
+ UW JH Z i n/a 36 4660 4688 4723 N
+ UW JH Z s n/a 36 4660 4688 4723 N
+ UW JH ZH e n/a 36 4660 4702 4735 N
+ UW JH ZH s n/a 36 4660 4702 4735 N
+ UW K AA e n/a 36 4654 4705 4739 N
+ UW K AA i n/a 36 4656 4706 4739 N
+ UW K AA s n/a 36 4656 4705 4739 N
+ UW K AE e n/a 36 4654 4705 4743 N
+ UW K AE i n/a 36 4656 4706 4744 N
+ UW K AE s n/a 36 4656 4705 4743 N
+ UW K AH b n/a 36 4656 4705 4741 N
+ UW K AH e n/a 36 4654 4705 4741 N
+ UW K AH i n/a 36 4656 4706 4742 N
+ UW K AH s n/a 36 4656 4705 4741 N
+ UW K AO e n/a 36 4654 4705 4739 N
+ UW K AO s n/a 36 4656 4705 4739 N
+ UW K AW e n/a 36 4654 4705 4743 N
+ UW K AW s n/a 36 4656 4705 4743 N
+ UW K AY e n/a 36 4654 4705 4739 N
+ UW K AY s n/a 36 4656 4705 4739 N
+ UW K B b n/a 36 4656 4683 4715 N
+ UW K B e n/a 36 4654 4683 4715 N
+ UW K B i n/a 36 4656 4683 4715 N
+ UW K B s n/a 36 4656 4683 4715 N
+ UW K CH b n/a 36 4656 4683 4717 N
+ UW K CH e n/a 36 4654 4683 4717 N
+ UW K CH i n/a 36 4656 4683 4716 N
+ UW K CH s n/a 36 4656 4683 4717 N
+ UW K D b n/a 36 4656 4686 4717 N
+ UW K D e n/a 36 4656 4686 4717 N
+ UW K D i n/a 36 4656 4686 4716 N
+ UW K D s n/a 36 4656 4686 4717 N
+ UW K DH e n/a 36 4656 4686 4719 N
+ UW K DH s n/a 36 4656 4686 4719 N
+ UW K EH e n/a 36 4654 4705 4743 N
+ UW K EH i n/a 36 4656 4706 4744 N
+ UW K EH s n/a 36 4656 4705 4743 N
+ UW K ER b n/a 36 4656 4705 4741 N
+ UW K ER e n/a 36 4654 4705 4741 N
+ UW K ER i n/a 36 4656 4707 4741 N
+ UW K ER s n/a 36 4656 4705 4741 N
+ UW K EY b n/a 36 4656 4705 4743 N
+ UW K EY e n/a 36 4654 4705 4743 N
+ UW K EY i n/a 36 4656 4706 4744 N
+ UW K EY s n/a 36 4656 4705 4743 N
+ UW K F b n/a 36 4656 4682 4734 N
+ UW K F e n/a 36 4654 4682 4734 N
+ UW K F i n/a 36 4656 4682 4734 N
+ UW K F s n/a 36 4656 4682 4734 N
+ UW K G b n/a 36 4656 4683 4715 N
+ UW K G e n/a 36 4654 4683 4715 N
+ UW K G i n/a 36 4656 4683 4715 N
+ UW K G s n/a 36 4656 4683 4715 N
+ UW K HH e n/a 36 4654 4683 4731 N
+ UW K HH i n/a 36 4656 4683 4731 N
+ UW K HH s n/a 36 4656 4683 4731 N
+ UW K IH b n/a 36 4656 4705 4745 N
+ UW K IH e n/a 36 4654 4705 4745 N
+ UW K IH i n/a 36 4656 4706 4745 N
+ UW K IH s n/a 36 4656 4705 4745 N
+ UW K IY b n/a 36 4656 4705 4745 N
+ UW K IY e n/a 36 4654 4705 4745 N
+ UW K IY i n/a 36 4656 4706 4745 N
+ UW K IY s n/a 36 4656 4705 4745 N
+ UW K JH e n/a 36 4654 4683 4717 N
+ UW K JH i n/a 36 4656 4683 4716 N
+ UW K JH s n/a 36 4656 4683 4717 N
+ UW K K b n/a 36 4656 4683 4715 N
+ UW K K e n/a 36 4654 4683 4715 N
+ UW K K i n/a 36 4656 4683 4715 N
+ UW K K s n/a 36 4656 4683 4715 N
+ UW K L b n/a 36 4656 4705 4737 N
+ UW K L e n/a 36 4654 4705 4729 N
+ UW K L i n/a 36 4653 4706 4737 N
+ UW K L s n/a 36 4656 4705 4737 N
+ UW K M b n/a 36 4656 4683 4726 N
+ UW K M e n/a 36 4654 4683 4726 N
+ UW K M i n/a 36 4656 4683 4726 N
+ UW K M s n/a 36 4656 4683 4726 N
+ UW K N b n/a 36 4656 4686 4725 N
+ UW K N e n/a 36 4656 4686 4725 N
+ UW K N i n/a 36 4656 4686 4725 N
+ UW K N s n/a 36 4656 4686 4725 N
+ UW K NG b n/a 36 4656 4683 4726 N
+ UW K NG e n/a 36 4654 4683 4726 N
+ UW K NG i n/a 36 4656 4683 4726 N
+ UW K NG s n/a 36 4656 4683 4726 N
+ UW K OW e n/a 36 4654 4705 4739 N
+ UW K OW i n/a 36 4656 4706 4739 N
+ UW K OW s n/a 36 4656 4705 4739 N
+ UW K OY e n/a 36 4654 4705 4739 N
+ UW K OY s n/a 36 4656 4705 4739 N
+ UW K P b n/a 36 4656 4683 4715 N
+ UW K P e n/a 36 4654 4683 4715 N
+ UW K P i n/a 36 4656 4683 4715 N
+ UW K P s n/a 36 4656 4683 4715 N
+ UW K R e n/a 36 4654 4705 4729 N
+ UW K R i n/a 36 4653 4707 4738 N
+ UW K R s n/a 36 4656 4705 4738 N
+ UW K S b n/a 36 4656 4686 4721 N
+ UW K S e n/a 36 4656 4686 4721 N
+ UW K S i n/a 36 4656 4686 4721 N
+ UW K S s n/a 36 4656 4686 4721 N
+ UW K SH e n/a 36 4654 4686 4735 N
+ UW K SH i n/a 36 4656 4686 4735 N
+ UW K SH s n/a 36 4656 4686 4735 N
+ UW K SIL e n/a 36 4656 4682 4733 N
+ UW K SIL s n/a 36 4656 4682 4733 N
+ UW K T b n/a 36 4656 4686 4717 N
+ UW K T e n/a 36 4656 4686 4717 N
+ UW K T i n/a 36 4656 4686 4716 N
+ UW K T s n/a 36 4656 4686 4717 N
+ UW K TH e n/a 36 4656 4686 4722 N
+ UW K TH i n/a 36 4656 4686 4721 N
+ UW K TH s n/a 36 4656 4686 4722 N
+ UW K UH e n/a 36 4654 4705 4741 N
+ UW K UH s n/a 36 4656 4705 4741 N
+ UW K UW b n/a 36 4656 4705 4739 N
+ UW K UW e n/a 36 4654 4705 4739 N
+ UW K UW s n/a 36 4656 4705 4739 N
+ UW K V b n/a 36 4656 4683 4729 N
+ UW K V e n/a 36 4654 4683 4729 N
+ UW K V i n/a 36 4656 4683 4727 N
+ UW K V s n/a 36 4656 4683 4729 N
+ UW K W b n/a 36 4656 4705 4741 N
+ UW K W e n/a 36 4654 4705 4732 N
+ UW K W i n/a 36 4656 4706 4742 N
+ UW K W s n/a 36 4656 4705 4741 N
+ UW K Y b n/a 36 4656 4705 4745 N
+ UW K Y e n/a 36 4654 4705 4736 N
+ UW K Y i n/a 36 4656 4706 4745 N
+ UW K Y s n/a 36 4656 4705 4745 N
+ UW K Z b n/a 36 4656 4686 4723 N
+ UW K Z e n/a 36 4656 4686 4723 N
+ UW K Z i n/a 36 4656 4686 4723 N
+ UW K Z s n/a 36 4656 4686 4723 N
+ UW K ZH e n/a 36 4654 4686 4735 N
+ UW K ZH s n/a 36 4656 4686 4735 N
+ UW L AA e n/a 36 4651 4682 4739 N
+ UW L AA i n/a 36 4651 4682 4739 N
+ UW L AA s n/a 36 4651 4682 4739 N
+ UW L AE e n/a 36 4651 4682 4743 N
+ UW L AE i n/a 36 4651 4682 4744 N
+ UW L AE s n/a 36 4651 4682 4743 N
+ UW L AH b n/a 36 4651 4682 4740 N
+ UW L AH e n/a 36 4651 4682 4740 N
+ UW L AH i n/a 36 4651 4682 4740 N
+ UW L AH s n/a 36 4651 4682 4740 N
+ UW L AO e n/a 36 4651 4682 4739 N
+ UW L AO i n/a 36 4651 4682 4739 N
+ UW L AO s n/a 36 4651 4682 4739 N
+ UW L AW e n/a 36 4651 4682 4743 N
+ UW L AW i n/a 36 4651 4682 4743 N
+ UW L AW s n/a 36 4651 4682 4743 N
+ UW L AY e n/a 36 4651 4682 4739 N
+ UW L AY i n/a 36 4651 4682 4739 N
+ UW L AY s n/a 36 4651 4682 4739 N
+ UW L B b n/a 36 4650 4683 4715 N
+ UW L B e n/a 36 4650 4683 4715 N
+ UW L B i n/a 36 4650 4683 4715 N
+ UW L B s n/a 36 4650 4683 4715 N
+ UW L CH b n/a 36 4650 4683 4717 N
+ UW L CH e n/a 36 4650 4683 4717 N
+ UW L CH i n/a 36 4650 4683 4717 N
+ UW L CH s n/a 36 4650 4683 4717 N
+ UW L D b n/a 36 4650 4685 4717 N
+ UW L D e n/a 36 4650 4685 4717 N
+ UW L D i n/a 36 4650 4685 4716 N
+ UW L D s n/a 36 4650 4685 4717 N
+ UW L DH e n/a 36 4650 4685 4719 N
+ UW L DH i n/a 36 4650 4685 4719 N
+ UW L DH s n/a 36 4650 4685 4719 N
+ UW L EH e n/a 36 4651 4682 4743 N
+ UW L EH i n/a 36 4651 4682 4744 N
+ UW L EH s n/a 36 4651 4682 4743 N
+ UW L ER b n/a 36 4651 4682 4739 N
+ UW L ER e n/a 36 4651 4682 4739 N
+ UW L ER i n/a 36 4651 4682 4741 N
+ UW L ER s n/a 36 4651 4682 4739 N
+ UW L EY b n/a 36 4651 4682 4743 N
+ UW L EY e n/a 36 4651 4682 4743 N
+ UW L EY i n/a 36 4651 4682 4744 N
+ UW L EY s n/a 36 4651 4682 4743 N
+ UW L F b n/a 36 4650 4682 4734 N
+ UW L F e n/a 36 4650 4682 4734 N
+ UW L F i n/a 36 4650 4682 4734 N
+ UW L F s n/a 36 4650 4682 4734 N
+ UW L G b n/a 36 4650 4683 4715 N
+ UW L G e n/a 36 4650 4683 4715 N
+ UW L G i n/a 36 4650 4683 4715 N
+ UW L G s n/a 36 4650 4683 4715 N
+ UW L HH e n/a 36 4650 4682 4731 N
+ UW L HH s n/a 36 4650 4682 4731 N
+ UW L IH b n/a 36 4651 4682 4745 N
+ UW L IH e n/a 36 4651 4682 4745 N
+ UW L IH i n/a 36 4651 4682 4745 N
+ UW L IH s n/a 36 4651 4682 4745 N
+ UW L IY b n/a 36 4651 4682 4745 N
+ UW L IY e n/a 36 4651 4682 4745 N
+ UW L IY i n/a 36 4651 4682 4745 N
+ UW L IY s n/a 36 4651 4682 4745 N
+ UW L JH e n/a 36 4650 4683 4717 N
+ UW L JH i n/a 36 4650 4683 4717 N
+ UW L JH s n/a 36 4650 4683 4717 N
+ UW L K b n/a 36 4650 4683 4715 N
+ UW L K e n/a 36 4650 4683 4715 N
+ UW L K i n/a 36 4650 4683 4715 N
+ UW L K s n/a 36 4650 4683 4715 N
+ UW L L b n/a 36 4650 4682 4737 N
+ UW L L e n/a 36 4650 4682 4729 N
+ UW L L i n/a 36 4650 4682 4737 N
+ UW L L s n/a 36 4650 4682 4737 N
+ UW L M b n/a 36 4650 4682 4726 N
+ UW L M e n/a 36 4650 4682 4726 N
+ UW L M i n/a 36 4650 4682 4726 N
+ UW L M s n/a 36 4650 4682 4726 N
+ UW L N b n/a 36 4650 4685 4725 N
+ UW L N e n/a 36 4650 4685 4725 N
+ UW L N i n/a 36 4650 4685 4725 N
+ UW L N s n/a 36 4650 4685 4725 N
+ UW L NG b n/a 36 4650 4682 4726 N
+ UW L NG e n/a 36 4650 4682 4726 N
+ UW L NG i n/a 36 4650 4682 4726 N
+ UW L NG s n/a 36 4650 4682 4726 N
+ UW L OW e n/a 36 4651 4682 4739 N
+ UW L OW i n/a 36 4651 4682 4739 N
+ UW L OW s n/a 36 4651 4682 4739 N
+ UW L OY e n/a 36 4651 4682 4739 N
+ UW L OY s n/a 36 4651 4682 4739 N
+ UW L P b n/a 36 4650 4683 4715 N
+ UW L P e n/a 36 4650 4683 4715 N
+ UW L P i n/a 36 4650 4683 4715 N
+ UW L P s n/a 36 4650 4683 4715 N
+ UW L R e n/a 36 4650 4682 4729 N
+ UW L R i n/a 36 4650 4682 4738 N
+ UW L R s n/a 36 4650 4682 4738 N
+ UW L S b n/a 36 4650 4685 4721 N
+ UW L S e n/a 36 4650 4685 4721 N
+ UW L S i n/a 36 4650 4685 4721 N
+ UW L S s n/a 36 4650 4685 4721 N
+ UW L SH e n/a 36 4650 4685 4735 N
+ UW L SH i n/a 36 4650 4685 4735 N
+ UW L SH s n/a 36 4650 4685 4735 N
+ UW L SIL e n/a 36 4650 4682 4733 N
+ UW L SIL s n/a 36 4650 4682 4733 N
+ UW L T b n/a 36 4650 4685 4717 N
+ UW L T e n/a 36 4650 4685 4717 N
+ UW L T i n/a 36 4650 4685 4717 N
+ UW L T s n/a 36 4650 4685 4717 N
+ UW L TH e n/a 36 4650 4685 4722 N
+ UW L TH i n/a 36 4650 4685 4721 N
+ UW L TH s n/a 36 4650 4685 4722 N
+ UW L UH e n/a 36 4651 4682 4739 N
+ UW L UH s n/a 36 4651 4682 4739 N
+ UW L UW b n/a 36 4651 4682 4739 N
+ UW L UW e n/a 36 4651 4682 4739 N
+ UW L UW i n/a 36 4651 4682 4739 N
+ UW L UW s n/a 36 4651 4682 4739 N
+ UW L V b n/a 36 4650 4682 4729 N
+ UW L V e n/a 36 4650 4682 4729 N
+ UW L V i n/a 36 4650 4682 4727 N
+ UW L V s n/a 36 4650 4682 4729 N
+ UW L W b n/a 36 4650 4682 4739 N
+ UW L W e n/a 36 4650 4682 4732 N
+ UW L W i n/a 36 4650 4682 4741 N
+ UW L W s n/a 36 4650 4682 4739 N
+ UW L Y b n/a 36 4650 4682 4745 N
+ UW L Y e n/a 36 4650 4682 4736 N
+ UW L Y i n/a 36 4650 4682 4745 N
+ UW L Y s n/a 36 4650 4682 4745 N
+ UW L Z b n/a 36 4650 4685 4723 N
+ UW L Z e n/a 36 4650 4685 4723 N
+ UW L Z i n/a 36 4650 4685 4723 N
+ UW L Z s n/a 36 4650 4685 4723 N
+ UW L ZH e n/a 36 4650 4685 4735 N
+ UW L ZH i n/a 36 4650 4685 4735 N
+ UW L ZH s n/a 36 4650 4685 4735 N
+ UW M AA e n/a 36 4651 4710 4739 N
+ UW M AA s n/a 36 4651 4710 4739 N
+ UW M AE e n/a 36 4651 4710 4743 N
+ UW M AE i n/a 36 4651 4710 4744 N
+ UW M AE s n/a 36 4651 4710 4743 N
+ UW M AH b n/a 36 4651 4710 4740 N
+ UW M AH e n/a 36 4651 4710 4740 N
+ UW M AH i n/a 36 4651 4710 4742 N
+ UW M AH s n/a 36 4651 4710 4740 N
+ UW M AO e n/a 36 4651 4710 4739 N
+ UW M AO s n/a 36 4651 4710 4739 N
+ UW M AW e n/a 36 4651 4710 4743 N
+ UW M AW s n/a 36 4651 4710 4743 N
+ UW M AY e n/a 36 4651 4710 4739 N
+ UW M AY s n/a 36 4651 4710 4739 N
+ UW M B b n/a 36 4651 4684 4715 N
+ UW M B e n/a 36 4651 4684 4715 N
+ UW M B i n/a 36 4651 4684 4715 N
+ UW M B s n/a 36 4651 4684 4715 N
+ UW M CH b n/a 36 4651 4684 4720 N
+ UW M CH e n/a 36 4651 4684 4720 N
+ UW M CH i n/a 36 4651 4684 4720 N
+ UW M CH s n/a 36 4651 4684 4720 N
+ UW M D b n/a 36 4651 4684 4720 N
+ UW M D e n/a 36 4651 4684 4720 N
+ UW M D i n/a 36 4651 4684 4720 N
+ UW M D s n/a 36 4651 4684 4720 N
+ UW M DH e n/a 36 4651 4684 4720 N
+ UW M DH i n/a 36 4651 4684 4720 N
+ UW M DH s n/a 36 4651 4684 4720 N
+ UW M EH e n/a 36 4651 4710 4743 N
+ UW M EH s n/a 36 4651 4710 4743 N
+ UW M ER b n/a 36 4651 4710 4739 N
+ UW M ER e n/a 36 4651 4710 4739 N
+ UW M ER i n/a 36 4651 4710 4741 N
+ UW M ER s n/a 36 4651 4710 4739 N
+ UW M EY b n/a 36 4651 4710 4743 N
+ UW M EY e n/a 36 4651 4710 4743 N
+ UW M EY s n/a 36 4651 4710 4743 N
+ UW M F b n/a 36 4651 4684 4734 N
+ UW M F e n/a 36 4651 4684 4734 N
+ UW M F i n/a 36 4651 4684 4734 N
+ UW M F s n/a 36 4651 4684 4734 N
+ UW M G b n/a 36 4651 4684 4715 N
+ UW M G e n/a 36 4651 4684 4715 N
+ UW M G i n/a 36 4651 4684 4715 N
+ UW M G s n/a 36 4651 4684 4715 N
+ UW M HH e n/a 36 4651 4684 4730 N
+ UW M HH i n/a 36 4651 4684 4730 N
+ UW M HH s n/a 36 4651 4684 4730 N
+ UW M IH b n/a 36 4651 4710 4745 N
+ UW M IH e n/a 36 4651 4710 4745 N
+ UW M IH i n/a 36 4651 4710 4745 N
+ UW M IH s n/a 36 4651 4710 4745 N
+ UW M IY b n/a 36 4651 4710 4745 N
+ UW M IY e n/a 36 4651 4710 4745 N
+ UW M IY i n/a 36 4651 4710 4745 N
+ UW M IY s n/a 36 4651 4710 4745 N
+ UW M JH e n/a 36 4651 4684 4720 N
+ UW M JH i n/a 36 4651 4684 4720 N
+ UW M JH s n/a 36 4651 4684 4720 N
+ UW M K b n/a 36 4651 4684 4715 N
+ UW M K e n/a 36 4651 4684 4715 N
+ UW M K i n/a 36 4651 4684 4715 N
+ UW M K s n/a 36 4651 4684 4715 N
+ UW M L b n/a 36 4651 4709 4737 N
+ UW M L e n/a 36 4651 4709 4729 N
+ UW M L i n/a 36 4651 4709 4737 N
+ UW M L s n/a 36 4651 4709 4737 N
+ UW M M b n/a 36 4651 4684 4726 N
+ UW M M e n/a 36 4651 4684 4726 N
+ UW M M i n/a 36 4651 4684 4726 N
+ UW M M s n/a 36 4651 4684 4726 N
+ UW M N b n/a 36 4651 4684 4725 N
+ UW M N e n/a 36 4651 4684 4725 N
+ UW M N i n/a 36 4651 4684 4725 N
+ UW M N s n/a 36 4651 4684 4725 N
+ UW M NG b n/a 36 4651 4684 4726 N
+ UW M NG e n/a 36 4651 4684 4726 N
+ UW M NG i n/a 36 4651 4684 4726 N
+ UW M NG s n/a 36 4651 4684 4726 N
+ UW M OW e n/a 36 4651 4710 4739 N
+ UW M OW s n/a 36 4651 4710 4739 N
+ UW M OY e n/a 36 4651 4710 4739 N
+ UW M OY s n/a 36 4651 4710 4739 N
+ UW M P b n/a 36 4651 4684 4715 N
+ UW M P e n/a 36 4651 4684 4715 N
+ UW M P s n/a 36 4651 4684 4715 N
+ UW M R e n/a 36 4651 4709 4729 N
+ UW M R i n/a 36 4651 4709 4738 N
+ UW M R s n/a 36 4651 4709 4738 N
+ UW M S b n/a 36 4651 4685 4721 N
+ UW M S e n/a 36 4651 4685 4721 N
+ UW M S i n/a 36 4651 4685 4721 N
+ UW M S s n/a 36 4651 4685 4721 N
+ UW M SH e n/a 36 4651 4685 4735 N
+ UW M SH i n/a 36 4651 4685 4735 N
+ UW M SH s n/a 36 4651 4685 4735 N
+ UW M SIL e n/a 36 4651 4684 4733 N
+ UW M SIL s n/a 36 4651 4684 4733 N
+ UW M T b n/a 36 4651 4684 4720 N
+ UW M T e n/a 36 4651 4684 4720 N
+ UW M T i n/a 36 4651 4684 4720 N
+ UW M T s n/a 36 4651 4684 4720 N
+ UW M TH e n/a 36 4651 4684 4722 N
+ UW M TH i n/a 36 4651 4684 4721 N
+ UW M TH s n/a 36 4651 4684 4722 N
+ UW M UH e n/a 36 4651 4710 4739 N
+ UW M UH s n/a 36 4651 4710 4739 N
+ UW M UW b n/a 36 4651 4710 4739 N
+ UW M UW e n/a 36 4651 4710 4739 N
+ UW M UW s n/a 36 4651 4710 4739 N
+ UW M V b n/a 36 4651 4684 4729 N
+ UW M V e n/a 36 4651 4684 4729 N
+ UW M V i n/a 36 4651 4684 4727 N
+ UW M V s n/a 36 4651 4684 4729 N
+ UW M W b n/a 36 4651 4709 4739 N
+ UW M W e n/a 36 4651 4709 4732 N
+ UW M W i n/a 36 4651 4709 4742 N
+ UW M W s n/a 36 4651 4709 4739 N
+ UW M Y b n/a 36 4651 4702 4745 N
+ UW M Y e n/a 36 4651 4702 4736 N
+ UW M Y s n/a 36 4651 4702 4745 N
+ UW M Z b n/a 36 4651 4685 4723 N
+ UW M Z e n/a 36 4651 4685 4723 N
+ UW M Z i n/a 36 4651 4685 4723 N
+ UW M Z s n/a 36 4651 4685 4723 N
+ UW M ZH e n/a 36 4651 4685 4735 N
+ UW M ZH s n/a 36 4651 4685 4735 N
+ UW N AA e n/a 36 4666 4710 4739 N
+ UW N AA i n/a 36 4666 4710 4739 N
+ UW N AA s n/a 36 4666 4710 4739 N
+ UW N AE e n/a 36 4666 4710 4743 N
+ UW N AE s n/a 36 4666 4710 4743 N
+ UW N AH b n/a 36 4666 4710 4740 N
+ UW N AH e n/a 36 4666 4710 4740 N
+ UW N AH i n/a 36 4666 4710 4742 N
+ UW N AH s n/a 36 4666 4710 4740 N
+ UW N AO e n/a 36 4666 4710 4739 N
+ UW N AO i n/a 36 4666 4710 4739 N
+ UW N AO s n/a 36 4666 4710 4739 N
+ UW N AW e n/a 36 4666 4710 4743 N
+ UW N AW s n/a 36 4666 4710 4743 N
+ UW N AY e n/a 36 4666 4710 4739 N
+ UW N AY i n/a 36 4666 4710 4739 N
+ UW N AY s n/a 36 4666 4710 4739 N
+ UW N B b n/a 36 4666 4698 4715 N
+ UW N B e n/a 36 4666 4698 4715 N
+ UW N B i n/a 36 4666 4698 4715 N
+ UW N B s n/a 36 4666 4698 4715 N
+ UW N CH b n/a 36 4666 4702 4717 N
+ UW N CH e n/a 36 4666 4702 4717 N
+ UW N CH i n/a 36 4666 4702 4716 N
+ UW N CH s n/a 36 4666 4702 4717 N
+ UW N D b n/a 36 4668 4691 4717 N
+ UW N D e n/a 36 4668 4691 4717 N
+ UW N D i n/a 36 4668 4691 4716 N
+ UW N D s n/a 36 4668 4691 4717 N
+ UW N DH e n/a 36 4668 4691 4719 N
+ UW N DH s n/a 36 4668 4691 4719 N
+ UW N EH e n/a 36 4666 4710 4743 N
+ UW N EH i n/a 36 4666 4710 4744 N
+ UW N EH s n/a 36 4666 4710 4743 N
+ UW N ER b n/a 36 4666 4710 4739 N
+ UW N ER e n/a 36 4666 4710 4739 N
+ UW N ER i n/a 36 4666 4710 4741 N
+ UW N ER s n/a 36 4666 4710 4739 N
+ UW N EY b n/a 36 4666 4710 4743 N
+ UW N EY e n/a 36 4666 4710 4743 N
+ UW N EY i n/a 36 4666 4710 4744 N
+ UW N EY s n/a 36 4666 4710 4743 N
+ UW N F b n/a 36 4666 4698 4734 N
+ UW N F e n/a 36 4666 4698 4734 N
+ UW N F i n/a 36 4666 4698 4734 N
+ UW N F s n/a 36 4666 4698 4734 N
+ UW N G b n/a 36 4666 4698 4715 N
+ UW N G e n/a 36 4666 4698 4715 N
+ UW N G i n/a 36 4666 4698 4715 N
+ UW N G s n/a 36 4666 4698 4715 N
+ UW N HH e n/a 36 4666 4697 4731 N
+ UW N HH i n/a 36 4666 4697 4731 N
+ UW N HH s n/a 36 4666 4697 4731 N
+ UW N IH b n/a 36 4666 4710 4745 N
+ UW N IH e n/a 36 4666 4710 4745 N
+ UW N IH i n/a 36 4666 4710 4745 N
+ UW N IH s n/a 36 4666 4710 4745 N
+ UW N IY b n/a 36 4666 4710 4745 N
+ UW N IY e n/a 36 4666 4710 4745 N
+ UW N IY i n/a 36 4666 4710 4745 N
+ UW N IY s n/a 36 4666 4710 4745 N
+ UW N JH e n/a 36 4666 4702 4717 N
+ UW N JH i n/a 36 4666 4702 4716 N
+ UW N JH s n/a 36 4666 4702 4717 N
+ UW N K b n/a 36 4666 4698 4715 N
+ UW N K e n/a 36 4666 4698 4715 N
+ UW N K i n/a 36 4666 4698 4715 N
+ UW N K s n/a 36 4666 4698 4715 N
+ UW N L b n/a 36 4666 4709 4737 N
+ UW N L e n/a 36 4666 4709 4729 N
+ UW N L i n/a 36 4666 4709 4737 N
+ UW N L s n/a 36 4666 4709 4737 N
+ UW N M b n/a 36 4666 4697 4728 N
+ UW N M e n/a 36 4666 4697 4728 N
+ UW N M i n/a 36 4666 4697 4728 N
+ UW N M s n/a 36 4666 4697 4728 N
+ UW N N b n/a 36 4668 4692 4725 N
+ UW N N e n/a 36 4668 4692 4725 N
+ UW N N i n/a 36 4668 4692 4725 N
+ UW N N s n/a 36 4668 4692 4725 N
+ UW N NG b n/a 36 4666 4697 4728 N
+ UW N NG e n/a 36 4666 4697 4728 N
+ UW N NG s n/a 36 4666 4697 4728 N
+ UW N OW e n/a 36 4666 4710 4739 N
+ UW N OW i n/a 36 4666 4710 4739 N
+ UW N OW s n/a 36 4666 4710 4739 N
+ UW N OY e n/a 36 4666 4710 4739 N
+ UW N OY s n/a 36 4666 4710 4739 N
+ UW N P b n/a 36 4666 4698 4715 N
+ UW N P e n/a 36 4666 4698 4715 N
+ UW N P i n/a 36 4666 4698 4715 N
+ UW N P s n/a 36 4666 4698 4715 N
+ UW N R e n/a 36 4666 4709 4729 N
+ UW N R i n/a 36 4666 4709 4738 N
+ UW N R s n/a 36 4666 4709 4738 N
+ UW N S b n/a 36 4668 4689 4722 N
+ UW N S e n/a 36 4668 4689 4722 N
+ UW N S i n/a 36 4668 4689 4722 N
+ UW N S s n/a 36 4668 4689 4722 N
+ UW N SH e n/a 36 4666 4702 4735 N
+ UW N SH i n/a 36 4666 4702 4735 N
+ UW N SH s n/a 36 4666 4702 4735 N
+ UW N SIL e n/a 36 4666 4703 4733 N
+ UW N SIL s n/a 36 4666 4703 4733 N
+ UW N T b n/a 36 4668 4691 4717 N
+ UW N T e n/a 36 4668 4691 4717 N
+ UW N T i n/a 36 4668 4691 4716 N
+ UW N T s n/a 36 4668 4691 4717 N
+ UW N TH e n/a 36 4668 4691 4722 N
+ UW N TH i n/a 36 4668 4691 4721 N
+ UW N TH s n/a 36 4668 4691 4722 N
+ UW N UH e n/a 36 4666 4710 4739 N
+ UW N UH s n/a 36 4666 4710 4739 N
+ UW N UW b n/a 36 4666 4710 4739 N
+ UW N UW e n/a 36 4666 4710 4739 N
+ UW N UW s n/a 36 4666 4710 4739 N
+ UW N V b n/a 36 4666 4698 4729 N
+ UW N V e n/a 36 4666 4698 4729 N
+ UW N V i n/a 36 4666 4698 4727 N
+ UW N V s n/a 36 4666 4698 4729 N
+ UW N W b n/a 36 4666 4709 4739 N
+ UW N W e n/a 36 4666 4709 4732 N
+ UW N W i n/a 36 4666 4709 4742 N
+ UW N W s n/a 36 4666 4709 4739 N
+ UW N Y b n/a 36 4666 4702 4745 N
+ UW N Y e n/a 36 4666 4702 4736 N
+ UW N Y i n/a 36 4666 4702 4745 N
+ UW N Y s n/a 36 4666 4702 4745 N
+ UW N Z b n/a 36 4668 4689 4723 N
+ UW N Z e n/a 36 4668 4689 4723 N
+ UW N Z i n/a 36 4668 4689 4723 N
+ UW N Z s n/a 36 4668 4689 4723 N
+ UW N ZH e n/a 36 4666 4702 4735 N
+ UW N ZH s n/a 36 4666 4702 4735 N
+ UW NG AA e n/a 36 4651 4710 4739 N
+ UW NG AA s n/a 36 4651 4710 4739 N
+ UW NG AE e n/a 36 4651 4710 4743 N
+ UW NG AE s n/a 36 4651 4710 4743 N
+ UW NG AH b n/a 36 4651 4710 4740 N
+ UW NG AH e n/a 36 4651 4710 4740 N
+ UW NG AH s n/a 36 4651 4710 4740 N
+ UW NG AO e n/a 36 4651 4710 4739 N
+ UW NG AO s n/a 36 4651 4710 4739 N
+ UW NG AW e n/a 36 4651 4710 4743 N
+ UW NG AW s n/a 36 4651 4710 4743 N
+ UW NG AY e n/a 36 4651 4710 4739 N
+ UW NG AY s n/a 36 4651 4710 4739 N
+ UW NG B b n/a 36 4651 4683 4715 N
+ UW NG B e n/a 36 4651 4683 4715 N
+ UW NG B s n/a 36 4651 4683 4715 N
+ UW NG CH b n/a 36 4651 4683 4717 N
+ UW NG CH e n/a 36 4651 4683 4717 N
+ UW NG CH s n/a 36 4651 4683 4717 N
+ UW NG D b n/a 36 4651 4685 4717 N
+ UW NG D e n/a 36 4651 4685 4717 N
+ UW NG D s n/a 36 4651 4685 4717 N
+ UW NG DH e n/a 36 4651 4685 4719 N
+ UW NG DH s n/a 36 4651 4685 4719 N
+ UW NG EH e n/a 36 4651 4710 4743 N
+ UW NG EH s n/a 36 4651 4710 4743 N
+ UW NG ER b n/a 36 4651 4710 4739 N
+ UW NG ER e n/a 36 4651 4710 4739 N
+ UW NG ER s n/a 36 4651 4710 4739 N
+ UW NG EY b n/a 36 4651 4710 4743 N
+ UW NG EY e n/a 36 4651 4710 4743 N
+ UW NG EY s n/a 36 4651 4710 4743 N
+ UW NG F b n/a 36 4651 4682 4734 N
+ UW NG F e n/a 36 4651 4682 4734 N
+ UW NG F s n/a 36 4651 4682 4734 N
+ UW NG G b n/a 36 4651 4683 4715 N
+ UW NG G e n/a 36 4651 4683 4715 N
+ UW NG G s n/a 36 4651 4683 4715 N
+ UW NG HH e n/a 36 4651 4683 4731 N
+ UW NG HH s n/a 36 4651 4683 4731 N
+ UW NG IH b n/a 36 4651 4710 4745 N
+ UW NG IH e n/a 36 4651 4710 4745 N
+ UW NG IH s n/a 36 4651 4710 4745 N
+ UW NG IY b n/a 36 4651 4710 4745 N
+ UW NG IY e n/a 36 4651 4710 4745 N
+ UW NG IY s n/a 36 4651 4710 4745 N
+ UW NG JH e n/a 36 4651 4683 4717 N
+ UW NG JH s n/a 36 4651 4683 4717 N
+ UW NG K b n/a 36 4651 4683 4715 N
+ UW NG K e n/a 36 4651 4683 4715 N
+ UW NG K s n/a 36 4651 4683 4715 N
+ UW NG L b n/a 36 4651 4709 4737 N
+ UW NG L e n/a 36 4651 4709 4729 N
+ UW NG L s n/a 36 4651 4709 4737 N
+ UW NG M b n/a 36 4651 4683 4726 N
+ UW NG M e n/a 36 4651 4683 4726 N
+ UW NG M s n/a 36 4651 4683 4726 N
+ UW NG N b n/a 36 4651 4685 4725 N
+ UW NG N e n/a 36 4651 4685 4725 N
+ UW NG N s n/a 36 4651 4685 4725 N
+ UW NG NG b n/a 36 4651 4683 4726 N
+ UW NG NG e n/a 36 4651 4683 4726 N
+ UW NG NG s n/a 36 4651 4683 4726 N
+ UW NG OW e n/a 36 4651 4710 4739 N
+ UW NG OW s n/a 36 4651 4710 4739 N
+ UW NG OY e n/a 36 4651 4710 4739 N
+ UW NG OY s n/a 36 4651 4710 4739 N
+ UW NG P b n/a 36 4651 4683 4715 N
+ UW NG P e n/a 36 4651 4683 4715 N
+ UW NG P s n/a 36 4651 4683 4715 N
+ UW NG R e n/a 36 4651 4709 4729 N
+ UW NG R s n/a 36 4651 4709 4738 N
+ UW NG S b n/a 36 4651 4685 4721 N
+ UW NG S e n/a 36 4651 4685 4721 N
+ UW NG S s n/a 36 4651 4685 4721 N
+ UW NG SH e n/a 36 4651 4685 4735 N
+ UW NG SH s n/a 36 4651 4685 4735 N
+ UW NG SIL e n/a 36 4651 4682 4733 N
+ UW NG SIL s n/a 36 4651 4682 4733 N
+ UW NG T b n/a 36 4651 4685 4717 N
+ UW NG T e n/a 36 4651 4685 4717 N
+ UW NG T s n/a 36 4651 4685 4717 N
+ UW NG TH e n/a 36 4651 4685 4722 N
+ UW NG TH i n/a 36 4651 4685 4721 N
+ UW NG TH s n/a 36 4651 4685 4722 N
+ UW NG UH e n/a 36 4651 4710 4739 N
+ UW NG UH s n/a 36 4651 4710 4739 N
+ UW NG UW b n/a 36 4651 4710 4739 N
+ UW NG UW e n/a 36 4651 4710 4739 N
+ UW NG UW s n/a 36 4651 4710 4739 N
+ UW NG V b n/a 36 4651 4683 4729 N
+ UW NG V e n/a 36 4651 4683 4729 N
+ UW NG V i n/a 36 4651 4683 4727 N
+ UW NG V s n/a 36 4651 4683 4729 N
+ UW NG W b n/a 36 4651 4709 4739 N
+ UW NG W e n/a 36 4651 4709 4732 N
+ UW NG W s n/a 36 4651 4709 4739 N
+ UW NG Y b n/a 36 4651 4702 4745 N
+ UW NG Y e n/a 36 4651 4702 4736 N
+ UW NG Y s n/a 36 4651 4702 4745 N
+ UW NG Z b n/a 36 4651 4685 4723 N
+ UW NG Z e n/a 36 4651 4685 4723 N
+ UW NG Z s n/a 36 4651 4685 4723 N
+ UW NG ZH e n/a 36 4651 4685 4735 N
+ UW NG ZH s n/a 36 4651 4685 4735 N
+ UW OW AA s n/a 36 4651 4682 4739 N
+ UW OW AE s n/a 36 4651 4682 4743 N
+ UW OW AH b n/a 36 4651 4682 4740 N
+ UW OW AH s n/a 36 4651 4682 4740 N
+ UW OW AO s n/a 36 4651 4682 4739 N
+ UW OW AW s n/a 36 4651 4682 4743 N
+ UW OW AY s n/a 36 4651 4682 4739 N
+ UW OW B b n/a 36 4651 4683 4715 N
+ UW OW B s n/a 36 4651 4683 4715 N
+ UW OW CH b n/a 36 4651 4683 4717 N
+ UW OW CH s n/a 36 4651 4683 4717 N
+ UW OW D b n/a 36 4651 4685 4717 N
+ UW OW D s n/a 36 4651 4685 4717 N
+ UW OW DH s n/a 36 4651 4685 4719 N
+ UW OW EH s n/a 36 4651 4682 4743 N
+ UW OW ER b n/a 36 4651 4682 4739 N
+ UW OW ER s n/a 36 4651 4682 4739 N
+ UW OW EY b n/a 36 4651 4682 4743 N
+ UW OW EY s n/a 36 4651 4682 4743 N
+ UW OW F b n/a 36 4651 4682 4734 N
+ UW OW F s n/a 36 4651 4682 4734 N
+ UW OW G b n/a 36 4651 4683 4715 N
+ UW OW G s n/a 36 4651 4683 4715 N
+ UW OW HH s n/a 36 4651 4682 4731 N
+ UW OW IH b n/a 36 4651 4682 4745 N
+ UW OW IH s n/a 36 4651 4682 4745 N
+ UW OW IY b n/a 36 4651 4682 4745 N
+ UW OW IY s n/a 36 4651 4682 4745 N
+ UW OW JH s n/a 36 4651 4683 4717 N
+ UW OW K b n/a 36 4651 4683 4715 N
+ UW OW K s n/a 36 4651 4683 4715 N
+ UW OW L b n/a 36 4651 4682 4737 N
+ UW OW L s n/a 36 4651 4682 4737 N
+ UW OW M b n/a 36 4651 4682 4726 N
+ UW OW M s n/a 36 4651 4682 4726 N
+ UW OW N b n/a 36 4651 4685 4725 N
+ UW OW N s n/a 36 4651 4685 4725 N
+ UW OW NG b n/a 36 4651 4682 4726 N
+ UW OW NG s n/a 36 4651 4682 4726 N
+ UW OW OW s n/a 36 4651 4682 4739 N
+ UW OW OY s n/a 36 4651 4682 4739 N
+ UW OW P b n/a 36 4651 4683 4715 N
+ UW OW P s n/a 36 4651 4683 4715 N
+ UW OW R s n/a 36 4651 4682 4738 N
+ UW OW S b n/a 36 4651 4685 4721 N
+ UW OW S i n/a 36 4651 4685 4721 N
+ UW OW S s n/a 36 4651 4685 4721 N
+ UW OW SH s n/a 36 4651 4685 4735 N
+ UW OW SIL s n/a 36 4651 4682 4733 N
+ UW OW T b n/a 36 4651 4685 4717 N
+ UW OW T s n/a 36 4651 4685 4717 N
+ UW OW TH s n/a 36 4651 4685 4722 N
+ UW OW UH s n/a 36 4651 4682 4739 N
+ UW OW UW b n/a 36 4651 4682 4739 N
+ UW OW UW s n/a 36 4651 4682 4739 N
+ UW OW V b n/a 36 4651 4682 4729 N
+ UW OW V s n/a 36 4651 4682 4729 N
+ UW OW W b n/a 36 4651 4682 4739 N
+ UW OW W s n/a 36 4651 4682 4739 N
+ UW OW Y b n/a 36 4651 4682 4745 N
+ UW OW Y s n/a 36 4651 4682 4745 N
+ UW OW Z b n/a 36 4651 4685 4723 N
+ UW OW Z s n/a 36 4651 4685 4723 N
+ UW OW ZH s n/a 36 4651 4685 4735 N
+ UW OY AA e n/a 36 4664 4710 4739 N
+ UW OY AA s n/a 36 4664 4710 4739 N
+ UW OY AE e n/a 36 4664 4710 4743 N
+ UW OY AE s n/a 36 4664 4710 4743 N
+ UW OY AH b n/a 36 4664 4710 4740 N
+ UW OY AH e n/a 36 4664 4710 4740 N
+ UW OY AH s n/a 36 4664 4710 4740 N
+ UW OY AO e n/a 36 4664 4710 4739 N
+ UW OY AO s n/a 36 4664 4710 4739 N
+ UW OY AW e n/a 36 4664 4710 4743 N
+ UW OY AW s n/a 36 4664 4710 4743 N
+ UW OY AY e n/a 36 4664 4710 4739 N
+ UW OY AY s n/a 36 4664 4710 4739 N
+ UW OY B b n/a 36 4668 4683 4715 N
+ UW OY B e n/a 36 4668 4683 4715 N
+ UW OY B s n/a 36 4668 4683 4715 N
+ UW OY CH b n/a 36 4667 4683 4718 N
+ UW OY CH e n/a 36 4667 4683 4718 N
+ UW OY CH s n/a 36 4667 4683 4718 N
+ UW OY D b n/a 36 4667 4691 4718 N
+ UW OY D e n/a 36 4667 4691 4718 N
+ UW OY D s n/a 36 4667 4691 4718 N
+ UW OY DH e n/a 36 4667 4691 4719 N
+ UW OY DH s n/a 36 4667 4691 4719 N
+ UW OY EH e n/a 36 4664 4710 4743 N
+ UW OY EH s n/a 36 4664 4710 4743 N
+ UW OY ER b n/a 36 4664 4710 4739 N
+ UW OY ER e n/a 36 4664 4710 4739 N
+ UW OY ER s n/a 36 4664 4710 4739 N
+ UW OY EY b n/a 36 4664 4710 4743 N
+ UW OY EY e n/a 36 4664 4710 4743 N
+ UW OY EY s n/a 36 4664 4710 4743 N
+ UW OY F b n/a 36 4668 4682 4734 N
+ UW OY F e n/a 36 4668 4682 4734 N
+ UW OY F s n/a 36 4668 4682 4734 N
+ UW OY G b n/a 36 4667 4683 4714 N
+ UW OY G e n/a 36 4667 4683 4714 N
+ UW OY G s n/a 36 4667 4683 4714 N
+ UW OY HH e n/a 36 4667 4682 4731 N
+ UW OY HH s n/a 36 4667 4682 4731 N
+ UW OY IH b n/a 36 4664 4710 4745 N
+ UW OY IH e n/a 36 4664 4710 4745 N
+ UW OY IH s n/a 36 4664 4710 4745 N
+ UW OY IY b n/a 36 4664 4710 4745 N
+ UW OY IY e n/a 36 4664 4710 4745 N
+ UW OY IY s n/a 36 4664 4710 4745 N
+ UW OY JH e n/a 36 4667 4683 4718 N
+ UW OY JH s n/a 36 4667 4683 4717 N
+ UW OY K b n/a 36 4667 4683 4714 N
+ UW OY K e n/a 36 4667 4683 4714 N
+ UW OY K s n/a 36 4667 4683 4714 N
+ UW OY L b n/a 36 4664 4709 4737 N
+ UW OY L e n/a 36 4664 4709 4729 N
+ UW OY L s n/a 36 4664 4709 4737 N
+ UW OY M b n/a 36 4668 4682 4726 N
+ UW OY M e n/a 36 4668 4682 4726 N
+ UW OY M s n/a 36 4668 4682 4726 N
+ UW OY N b n/a 36 4667 4692 4725 N
+ UW OY N e n/a 36 4667 4692 4725 N
+ UW OY N s n/a 36 4667 4692 4725 N
+ UW OY NG b n/a 36 4667 4682 4726 N
+ UW OY NG e n/a 36 4667 4682 4726 N
+ UW OY NG s n/a 36 4667 4682 4726 N
+ UW OY OW e n/a 36 4664 4710 4739 N
+ UW OY OW s n/a 36 4664 4710 4739 N
+ UW OY OY e n/a 36 4664 4710 4739 N
+ UW OY OY s n/a 36 4664 4710 4739 N
+ UW OY P b n/a 36 4668 4683 4715 N
+ UW OY P e n/a 36 4668 4683 4715 N
+ UW OY P s n/a 36 4668 4683 4715 N
+ UW OY R e n/a 36 4664 4709 4729 N
+ UW OY R s n/a 36 4664 4709 4738 N
+ UW OY S b n/a 36 4667 4689 4721 N
+ UW OY S e n/a 36 4667 4689 4721 N
+ UW OY S i n/a 36 4667 4689 4721 N
+ UW OY S s n/a 36 4667 4689 4721 N
+ UW OY SH e n/a 36 4667 4685 4735 N
+ UW OY SH s n/a 36 4667 4685 4735 N
+ UW OY SIL e n/a 36 4667 4682 4733 N
+ UW OY SIL s n/a 36 4667 4682 4733 N
+ UW OY T b n/a 36 4667 4691 4718 N
+ UW OY T e n/a 36 4667 4691 4718 N
+ UW OY T s n/a 36 4667 4691 4718 N
+ UW OY TH e n/a 36 4667 4691 4722 N
+ UW OY TH s n/a 36 4667 4691 4722 N
+ UW OY UH e n/a 36 4664 4710 4739 N
+ UW OY UH s n/a 36 4664 4710 4739 N
+ UW OY UW b n/a 36 4664 4710 4739 N
+ UW OY UW e n/a 36 4664 4710 4739 N
+ UW OY UW s n/a 36 4664 4710 4739 N
+ UW OY V b n/a 36 4668 4682 4729 N
+ UW OY V e n/a 36 4668 4682 4729 N
+ UW OY V s n/a 36 4668 4682 4729 N
+ UW OY W b n/a 36 4664 4709 4739 N
+ UW OY W e n/a 36 4664 4709 4732 N
+ UW OY W s n/a 36 4664 4709 4739 N
+ UW OY Y b n/a 36 4664 4702 4745 N
+ UW OY Y e n/a 36 4664 4702 4736 N
+ UW OY Y s n/a 36 4664 4702 4745 N
+ UW OY Z b n/a 36 4667 4689 4723 N
+ UW OY Z e n/a 36 4667 4689 4723 N
+ UW OY Z i n/a 36 4667 4689 4723 N
+ UW OY Z s n/a 36 4667 4689 4723 N
+ UW OY ZH e n/a 36 4667 4685 4735 N
+ UW OY ZH s n/a 36 4667 4685 4735 N
+ UW P AA e n/a 36 4654 4705 4739 N
+ UW P AA i n/a 36 4656 4705 4739 N
+ UW P AA s n/a 36 4656 4705 4739 N
+ UW P AE e n/a 36 4654 4705 4743 N
+ UW P AE s n/a 36 4656 4705 4743 N
+ UW P AH b n/a 36 4656 4705 4741 N
+ UW P AH e n/a 36 4654 4705 4741 N
+ UW P AH i n/a 36 4656 4705 4742 N
+ UW P AH s n/a 36 4656 4705 4741 N
+ UW P AO e n/a 36 4654 4705 4739 N
+ UW P AO s n/a 36 4656 4705 4739 N
+ UW P AW e n/a 36 4654 4705 4743 N
+ UW P AW s n/a 36 4656 4705 4743 N
+ UW P AY e n/a 36 4654 4705 4739 N
+ UW P AY s n/a 36 4656 4705 4739 N
+ UW P B b n/a 36 4656 4684 4715 N
+ UW P B e n/a 36 4654 4684 4715 N
+ UW P B i n/a 36 4656 4684 4715 N
+ UW P B s n/a 36 4656 4684 4715 N
+ UW P CH b n/a 36 4656 4684 4720 N
+ UW P CH e n/a 36 4654 4684 4720 N
+ UW P CH i n/a 36 4656 4684 4720 N
+ UW P CH s n/a 36 4656 4684 4720 N
+ UW P D b n/a 36 4656 4684 4720 N
+ UW P D e n/a 36 4656 4684 4720 N
+ UW P D i n/a 36 4656 4684 4720 N
+ UW P D s n/a 36 4656 4684 4720 N
+ UW P DH e n/a 36 4656 4684 4720 N
+ UW P DH s n/a 36 4656 4684 4720 N
+ UW P EH e n/a 36 4654 4705 4743 N
+ UW P EH s n/a 36 4656 4705 4743 N
+ UW P ER b n/a 36 4656 4705 4741 N
+ UW P ER e n/a 36 4654 4705 4741 N
+ UW P ER i n/a 36 4656 4707 4741 N
+ UW P ER s n/a 36 4656 4705 4741 N
+ UW P EY b n/a 36 4656 4705 4743 N
+ UW P EY e n/a 36 4654 4705 4743 N
+ UW P EY s n/a 36 4656 4705 4743 N
+ UW P F b n/a 36 4656 4684 4734 N
+ UW P F e n/a 36 4654 4684 4734 N
+ UW P F i n/a 36 4656 4684 4734 N
+ UW P F s n/a 36 4656 4684 4734 N
+ UW P G b n/a 36 4656 4684 4715 N
+ UW P G e n/a 36 4654 4684 4715 N
+ UW P G i n/a 36 4656 4684 4715 N
+ UW P G s n/a 36 4656 4684 4715 N
+ UW P HH e n/a 36 4654 4684 4731 N
+ UW P HH i n/a 36 4656 4684 4731 N
+ UW P HH s n/a 36 4656 4684 4731 N
+ UW P IH b n/a 36 4656 4705 4745 N
+ UW P IH e n/a 36 4654 4705 4745 N
+ UW P IH i n/a 36 4656 4705 4745 N
+ UW P IH s n/a 36 4656 4705 4745 N
+ UW P IY b n/a 36 4656 4705 4745 N
+ UW P IY e n/a 36 4654 4705 4745 N
+ UW P IY i n/a 36 4656 4705 4745 N
+ UW P IY s n/a 36 4656 4705 4745 N
+ UW P JH e n/a 36 4654 4684 4720 N
+ UW P JH s n/a 36 4656 4684 4720 N
+ UW P K b n/a 36 4656 4684 4715 N
+ UW P K e n/a 36 4654 4684 4715 N
+ UW P K i n/a 36 4656 4684 4715 N
+ UW P K s n/a 36 4656 4684 4715 N
+ UW P L b n/a 36 4656 4705 4737 N
+ UW P L e n/a 36 4654 4705 4729 N
+ UW P L i n/a 36 4653 4706 4737 N
+ UW P L s n/a 36 4656 4705 4737 N
+ UW P M b n/a 36 4656 4684 4726 N
+ UW P M e n/a 36 4654 4684 4726 N
+ UW P M i n/a 36 4656 4684 4726 N
+ UW P M s n/a 36 4656 4684 4726 N
+ UW P N b n/a 36 4656 4684 4725 N
+ UW P N e n/a 36 4656 4684 4725 N
+ UW P N i n/a 36 4656 4684 4725 N
+ UW P N s n/a 36 4656 4684 4725 N
+ UW P NG b n/a 36 4656 4684 4726 N
+ UW P NG e n/a 36 4654 4684 4726 N
+ UW P NG i n/a 36 4656 4684 4726 N
+ UW P NG s n/a 36 4656 4684 4726 N
+ UW P OW e n/a 36 4654 4705 4739 N
+ UW P OW s n/a 36 4656 4705 4739 N
+ UW P OY e n/a 36 4654 4705 4739 N
+ UW P OY s n/a 36 4656 4705 4739 N
+ UW P P b n/a 36 4656 4684 4715 N
+ UW P P e n/a 36 4654 4684 4715 N
+ UW P P i n/a 36 4656 4684 4715 N
+ UW P P s n/a 36 4656 4684 4715 N
+ UW P R e n/a 36 4654 4705 4729 N
+ UW P R i n/a 36 4653 4707 4738 N
+ UW P R s n/a 36 4656 4705 4738 N
+ UW P S b n/a 36 4656 4686 4721 N
+ UW P S e n/a 36 4656 4686 4721 N
+ UW P S i n/a 36 4656 4686 4721 N
+ UW P S s n/a 36 4656 4686 4721 N
+ UW P SH e n/a 36 4654 4686 4735 N
+ UW P SH s n/a 36 4656 4686 4735 N
+ UW P SIL e n/a 36 4656 4684 4733 N
+ UW P SIL s n/a 36 4656 4684 4733 N
+ UW P T b n/a 36 4656 4684 4720 N
+ UW P T e n/a 36 4656 4684 4720 N
+ UW P T i n/a 36 4656 4684 4720 N
+ UW P T s n/a 36 4656 4684 4720 N
+ UW P TH e n/a 36 4656 4684 4722 N
+ UW P TH i n/a 36 4656 4684 4721 N
+ UW P TH s n/a 36 4656 4684 4722 N
+ UW P UH e n/a 36 4654 4705 4741 N
+ UW P UH s n/a 36 4656 4705 4741 N
+ UW P UW b n/a 36 4656 4705 4739 N
+ UW P UW e n/a 36 4654 4705 4739 N
+ UW P UW s n/a 36 4656 4705 4739 N
+ UW P V b n/a 36 4656 4684 4729 N
+ UW P V e n/a 36 4654 4684 4729 N
+ UW P V i n/a 36 4656 4684 4727 N
+ UW P V s n/a 36 4656 4684 4729 N
+ UW P W b n/a 36 4656 4705 4741 N
+ UW P W e n/a 36 4654 4705 4732 N
+ UW P W s n/a 36 4656 4705 4741 N
+ UW P Y b n/a 36 4656 4705 4745 N
+ UW P Y e n/a 36 4654 4705 4736 N
+ UW P Y i n/a 36 4656 4705 4745 N
+ UW P Y s n/a 36 4656 4705 4745 N
+ UW P Z b n/a 36 4656 4686 4723 N
+ UW P Z e n/a 36 4656 4686 4723 N
+ UW P Z i n/a 36 4656 4686 4723 N
+ UW P Z s n/a 36 4656 4686 4723 N
+ UW P ZH e n/a 36 4654 4686 4735 N
+ UW P ZH s n/a 36 4656 4686 4735 N
+ UW R AA e n/a 36 4648 4680 4739 N
+ UW R AA i n/a 36 4646 4680 4739 N
+ UW R AA s n/a 36 4648 4680 4739 N
+ UW R AE e n/a 36 4648 4680 4743 N
+ UW R AE i n/a 36 4646 4680 4744 N
+ UW R AE s n/a 36 4648 4680 4743 N
+ UW R AH b n/a 36 4648 4680 4740 N
+ UW R AH e n/a 36 4648 4680 4740 N
+ UW R AH i n/a 36 4646 4680 4740 N
+ UW R AH s n/a 36 4648 4680 4740 N
+ UW R AO e n/a 36 4648 4680 4739 N
+ UW R AO i n/a 36 4646 4680 4739 N
+ UW R AO s n/a 36 4648 4680 4739 N
+ UW R AW e n/a 36 4648 4680 4743 N
+ UW R AW i n/a 36 4646 4680 4743 N
+ UW R AW s n/a 36 4648 4680 4743 N
+ UW R AY e n/a 36 4648 4680 4739 N
+ UW R AY s n/a 36 4648 4680 4739 N
+ UW R B b n/a 36 4648 4679 4715 N
+ UW R B e n/a 36 4648 4679 4715 N
+ UW R B i n/a 36 4648 4679 4715 N
+ UW R B s n/a 36 4648 4679 4715 N
+ UW R CH b n/a 36 4648 4679 4717 N
+ UW R CH e n/a 36 4648 4679 4717 N
+ UW R CH i n/a 36 4649 4679 4717 N
+ UW R CH s n/a 36 4648 4679 4717 N
+ UW R D b n/a 36 4649 4687 4717 N
+ UW R D e n/a 36 4649 4687 4717 N
+ UW R D i n/a 36 4649 4687 4716 N
+ UW R D s n/a 36 4649 4687 4717 N
+ UW R DH e n/a 36 4649 4687 4719 N
+ UW R DH i n/a 36 4649 4687 4719 N
+ UW R DH s n/a 36 4649 4687 4719 N
+ UW R EH e n/a 36 4648 4680 4743 N
+ UW R EH i n/a 36 4646 4680 4744 N
+ UW R EH s n/a 36 4648 4680 4743 N
+ UW R ER b n/a 36 4648 4680 4739 N
+ UW R ER e n/a 36 4648 4680 4739 N
+ UW R ER i n/a 36 4646 4680 4741 N
+ UW R ER s n/a 36 4648 4680 4739 N
+ UW R EY b n/a 36 4648 4680 4743 N
+ UW R EY e n/a 36 4648 4680 4743 N
+ UW R EY i n/a 36 4646 4680 4744 N
+ UW R EY s n/a 36 4648 4680 4743 N
+ UW R F b n/a 36 4648 4679 4734 N
+ UW R F e n/a 36 4648 4679 4734 N
+ UW R F i n/a 36 4649 4679 4734 N
+ UW R F s n/a 36 4648 4679 4734 N
+ UW R G b n/a 36 4648 4679 4715 N
+ UW R G e n/a 36 4648 4679 4715 N
+ UW R G i n/a 36 4649 4679 4715 N
+ UW R G s n/a 36 4648 4679 4715 N
+ UW R HH e n/a 36 4648 4679 4731 N
+ UW R HH i n/a 36 4649 4679 4731 N
+ UW R HH s n/a 36 4648 4679 4731 N
+ UW R IH b n/a 36 4648 4680 4745 N
+ UW R IH e n/a 36 4648 4680 4745 N
+ UW R IH i n/a 36 4646 4680 4745 N
+ UW R IH s n/a 36 4648 4680 4745 N
+ UW R IY b n/a 36 4648 4680 4745 N
+ UW R IY e n/a 36 4648 4680 4745 N
+ UW R IY i n/a 36 4646 4680 4745 N
+ UW R IY s n/a 36 4648 4680 4745 N
+ UW R JH e n/a 36 4648 4679 4717 N
+ UW R JH i n/a 36 4649 4679 4717 N
+ UW R JH s n/a 36 4648 4679 4717 N
+ UW R K b n/a 36 4648 4679 4715 N
+ UW R K e n/a 36 4648 4679 4715 N
+ UW R K i n/a 36 4649 4679 4715 N
+ UW R K s n/a 36 4648 4679 4715 N
+ UW R L b n/a 36 4648 4679 4737 N
+ UW R L e n/a 36 4648 4679 4729 N
+ UW R L i n/a 36 4646 4681 4737 N
+ UW R L s n/a 36 4648 4679 4737 N
+ UW R M b n/a 36 4647 4679 4726 N
+ UW R M e n/a 36 4648 4679 4726 N
+ UW R M i n/a 36 4647 4678 4726 N
+ UW R M s n/a 36 4647 4679 4726 N
+ UW R N b n/a 36 4647 4687 4725 N
+ UW R N e n/a 36 4649 4687 4725 N
+ UW R N i n/a 36 4647 4687 4725 N
+ UW R N s n/a 36 4647 4687 4725 N
+ UW R NG b n/a 36 4647 4679 4726 N
+ UW R NG e n/a 36 4648 4679 4726 N
+ UW R NG i n/a 36 4647 4678 4726 N
+ UW R NG s n/a 36 4647 4679 4726 N
+ UW R OW e n/a 36 4648 4680 4739 N
+ UW R OW i n/a 36 4646 4680 4739 N
+ UW R OW s n/a 36 4648 4680 4739 N
+ UW R OY e n/a 36 4648 4680 4739 N
+ UW R OY s n/a 36 4648 4680 4739 N
+ UW R P b n/a 36 4648 4679 4715 N
+ UW R P e n/a 36 4648 4679 4715 N
+ UW R P i n/a 36 4648 4679 4715 N
+ UW R P s n/a 36 4648 4679 4715 N
+ UW R R e n/a 36 4648 4679 4729 N
+ UW R R i n/a 36 4646 4681 4738 N
+ UW R R s n/a 36 4648 4679 4738 N
+ UW R S b n/a 36 4649 4687 4721 N
+ UW R S e n/a 36 4649 4687 4721 N
+ UW R S i n/a 36 4649 4687 4721 N
+ UW R S s n/a 36 4649 4687 4721 N
+ UW R SH e n/a 36 4648 4679 4735 N
+ UW R SH i n/a 36 4649 4679 4735 N
+ UW R SH s n/a 36 4648 4679 4735 N
+ UW R SIL e n/a 36 4648 4679 4733 N
+ UW R SIL s n/a 36 4648 4679 4733 N
+ UW R T b n/a 36 4649 4687 4717 N
+ UW R T e n/a 36 4649 4687 4717 N
+ UW R T i n/a 36 4649 4687 4717 N
+ UW R T s n/a 36 4649 4687 4717 N
+ UW R TH e n/a 36 4649 4687 4722 N
+ UW R TH i n/a 36 4649 4687 4721 N
+ UW R TH s n/a 36 4649 4687 4722 N
+ UW R UH e n/a 36 4648 4680 4739 N
+ UW R UH s n/a 36 4648 4680 4739 N
+ UW R UW b n/a 36 4648 4680 4739 N
+ UW R UW e n/a 36 4648 4680 4739 N
+ UW R UW s n/a 36 4648 4680 4739 N
+ UW R V b n/a 36 4648 4679 4729 N
+ UW R V e n/a 36 4648 4679 4729 N
+ UW R V i n/a 36 4649 4679 4727 N
+ UW R V s n/a 36 4648 4679 4729 N
+ UW R W b n/a 36 4648 4680 4739 N
+ UW R W e n/a 36 4648 4680 4732 N
+ UW R W i n/a 36 4646 4680 4741 N
+ UW R W s n/a 36 4648 4680 4739 N
+ UW R Y b n/a 36 4648 4680 4745 N
+ UW R Y e n/a 36 4648 4680 4736 N
+ UW R Y i n/a 36 4646 4680 4745 N
+ UW R Y s n/a 36 4648 4680 4745 N
+ UW R Z b n/a 36 4649 4687 4723 N
+ UW R Z e n/a 36 4649 4687 4723 N
+ UW R Z i n/a 36 4649 4687 4723 N
+ UW R Z s n/a 36 4649 4687 4723 N
+ UW R ZH e n/a 36 4648 4679 4735 N
+ UW R ZH i n/a 36 4649 4679 4735 N
+ UW R ZH s n/a 36 4648 4679 4735 N
+ UW S AA e n/a 36 4659 4713 4739 N
+ UW S AA i n/a 36 4659 4712 4739 N
+ UW S AA s n/a 36 4659 4712 4739 N
+ UW S AE e n/a 36 4659 4711 4743 N
+ UW S AE i n/a 36 4659 4712 4744 N
+ UW S AE s n/a 36 4659 4711 4743 N
+ UW S AH b n/a 36 4657 4711 4740 N
+ UW S AH e n/a 36 4657 4711 4740 N
+ UW S AH i n/a 36 4659 4713 4742 N
+ UW S AH s n/a 36 4657 4711 4740 N
+ UW S AO e n/a 36 4659 4713 4739 N
+ UW S AO i n/a 36 4659 4713 4739 N
+ UW S AO s n/a 36 4659 4713 4739 N
+ UW S AW e n/a 36 4659 4711 4743 N
+ UW S AW s n/a 36 4659 4711 4743 N
+ UW S AY e n/a 36 4659 4713 4739 N
+ UW S AY s n/a 36 4659 4712 4739 N
+ UW S B b n/a 36 4657 4698 4715 N
+ UW S B e n/a 36 4657 4698 4715 N
+ UW S B i n/a 36 4657 4698 4715 N
+ UW S B s n/a 36 4657 4698 4715 N
+ UW S CH b n/a 36 4657 4702 4717 N
+ UW S CH e n/a 36 4657 4702 4717 N
+ UW S CH i n/a 36 4657 4702 4716 N
+ UW S CH s n/a 36 4657 4702 4717 N
+ UW S D b n/a 36 4663 4690 4717 N
+ UW S D e n/a 36 4663 4690 4717 N
+ UW S D i n/a 36 4663 4691 4716 N
+ UW S D s n/a 36 4663 4690 4717 N
+ UW S DH e n/a 36 4663 4690 4719 N
+ UW S DH i n/a 36 4663 4691 4719 N
+ UW S DH s n/a 36 4663 4690 4719 N
+ UW S EH e n/a 36 4659 4711 4743 N
+ UW S EH i n/a 36 4659 4713 4744 N
+ UW S EH s n/a 36 4659 4711 4743 N
+ UW S ER b n/a 36 4657 4713 4739 N
+ UW S ER e n/a 36 4657 4713 4739 N
+ UW S ER i n/a 36 4659 4713 4741 N
+ UW S ER s n/a 36 4657 4713 4739 N
+ UW S EY b n/a 36 4659 4711 4743 N
+ UW S EY e n/a 36 4659 4711 4743 N
+ UW S EY i n/a 36 4659 4712 4744 N
+ UW S EY s n/a 36 4659 4711 4743 N
+ UW S F b n/a 36 4657 4698 4734 N
+ UW S F e n/a 36 4657 4698 4734 N
+ UW S F i n/a 36 4657 4698 4734 N
+ UW S F s n/a 36 4657 4698 4734 N
+ UW S G b n/a 36 4657 4698 4715 N
+ UW S G e n/a 36 4657 4698 4715 N
+ UW S G i n/a 36 4657 4698 4715 N
+ UW S G s n/a 36 4657 4698 4715 N
+ UW S HH e n/a 36 4659 4697 4731 N
+ UW S HH i n/a 36 4659 4697 4731 N
+ UW S HH s n/a 36 4659 4697 4731 N
+ UW S IH b n/a 36 4657 4711 4745 N
+ UW S IH e n/a 36 4657 4711 4745 N
+ UW S IH i n/a 36 4659 4713 4745 N
+ UW S IH s n/a 36 4657 4711 4745 N
+ UW S IY b n/a 36 4659 4711 4745 N
+ UW S IY e n/a 36 4659 4711 4745 N
+ UW S IY i n/a 36 4659 4712 4745 N
+ UW S IY s n/a 36 4659 4711 4745 N
+ UW S JH e n/a 36 4657 4702 4717 N
+ UW S JH i n/a 36 4657 4702 4716 N
+ UW S JH s n/a 36 4657 4702 4717 N
+ UW S K b n/a 36 4657 4698 4715 N
+ UW S K e n/a 36 4657 4698 4715 N
+ UW S K i n/a 36 4657 4698 4715 N
+ UW S K s n/a 36 4657 4698 4715 N
+ UW S L b n/a 36 4659 4711 4737 N
+ UW S L e n/a 36 4659 4711 4729 N
+ UW S L i n/a 36 4659 4713 4737 N
+ UW S L s n/a 36 4659 4711 4737 N
+ UW S M b n/a 36 4657 4697 4728 N
+ UW S M e n/a 36 4657 4697 4728 N
+ UW S M i n/a 36 4657 4697 4728 N
+ UW S M s n/a 36 4657 4697 4728 N
+ UW S N b n/a 36 4663 4692 4725 N
+ UW S N e n/a 36 4663 4692 4725 N
+ UW S N i n/a 36 4663 4692 4725 N
+ UW S N s n/a 36 4663 4692 4725 N
+ UW S NG b n/a 36 4657 4697 4728 N
+ UW S NG e n/a 36 4657 4697 4728 N
+ UW S NG i n/a 36 4657 4697 4728 N
+ UW S NG s n/a 36 4657 4697 4728 N
+ UW S OW e n/a 36 4659 4713 4739 N
+ UW S OW i n/a 36 4659 4713 4739 N
+ UW S OW s n/a 36 4659 4713 4739 N
+ UW S OY e n/a 36 4659 4713 4739 N
+ UW S OY s n/a 36 4659 4713 4739 N
+ UW S P b n/a 36 4657 4698 4715 N
+ UW S P e n/a 36 4657 4698 4715 N
+ UW S P i n/a 36 4657 4698 4715 N
+ UW S P s n/a 36 4657 4698 4715 N
+ UW S R e n/a 36 4659 4711 4729 N
+ UW S R i n/a 36 4659 4713 4738 N
+ UW S R s n/a 36 4659 4711 4738 N
+ UW S S b n/a 36 4663 4690 4722 N
+ UW S S e n/a 36 4663 4690 4722 N
+ UW S S i n/a 36 4663 4691 4722 N
+ UW S S s n/a 36 4663 4690 4722 N
+ UW S SH e n/a 36 4657 4702 4735 N
+ UW S SH i n/a 36 4657 4702 4735 N
+ UW S SH s n/a 36 4657 4702 4735 N
+ UW S SIL e n/a 36 4667 4703 4733 N
+ UW S SIL s n/a 36 4667 4703 4733 N
+ UW S T b n/a 36 4663 4690 4717 N
+ UW S T e n/a 36 4663 4690 4717 N
+ UW S T i n/a 36 4663 4691 4716 N
+ UW S T s n/a 36 4663 4690 4717 N
+ UW S TH e n/a 36 4663 4690 4722 N
+ UW S TH i n/a 36 4663 4691 4721 N
+ UW S TH s n/a 36 4663 4690 4722 N
+ UW S UH e n/a 36 4659 4713 4739 N
+ UW S UH i n/a 36 4659 4713 4741 N
+ UW S UH s n/a 36 4659 4713 4739 N
+ UW S UW b n/a 36 4659 4713 4739 N
+ UW S UW e n/a 36 4659 4713 4739 N
+ UW S UW s n/a 36 4659 4713 4739 N
+ UW S V b n/a 36 4657 4698 4729 N
+ UW S V e n/a 36 4657 4698 4729 N
+ UW S V i n/a 36 4657 4698 4727 N
+ UW S V s n/a 36 4657 4698 4729 N
+ UW S W b n/a 36 4659 4713 4739 N
+ UW S W e n/a 36 4659 4713 4732 N
+ UW S W i n/a 36 4659 4713 4742 N
+ UW S W s n/a 36 4659 4713 4739 N
+ UW S Y b n/a 36 4659 4711 4745 N
+ UW S Y e n/a 36 4659 4711 4736 N
+ UW S Y i n/a 36 4659 4711 4745 N
+ UW S Y s n/a 36 4659 4711 4745 N
+ UW S Z b n/a 36 4663 4690 4723 N
+ UW S Z e n/a 36 4663 4690 4723 N
+ UW S Z i n/a 36 4663 4691 4723 N
+ UW S Z s n/a 36 4663 4690 4723 N
+ UW S ZH e n/a 36 4657 4702 4735 N
+ UW S ZH i n/a 36 4657 4702 4735 N
+ UW S ZH s n/a 36 4657 4702 4735 N
+ UW SH AA e n/a 36 4659 4713 4739 N
+ UW SH AA s n/a 36 4659 4712 4739 N
+ UW SH AE e n/a 36 4659 4711 4743 N
+ UW SH AE i n/a 36 4658 4712 4744 N
+ UW SH AE s n/a 36 4659 4711 4743 N
+ UW SH AH b n/a 36 4657 4711 4740 N
+ UW SH AH e n/a 36 4657 4711 4740 N
+ UW SH AH i n/a 36 4658 4712 4742 N
+ UW SH AH s n/a 36 4657 4711 4740 N
+ UW SH AO e n/a 36 4659 4713 4739 N
+ UW SH AO s n/a 36 4659 4713 4739 N
+ UW SH AW e n/a 36 4659 4711 4743 N
+ UW SH AW s n/a 36 4659 4711 4743 N
+ UW SH AY e n/a 36 4659 4713 4739 N
+ UW SH AY s n/a 36 4659 4712 4739 N
+ UW SH B b n/a 36 4657 4698 4715 N
+ UW SH B e n/a 36 4657 4698 4715 N
+ UW SH B i n/a 36 4657 4698 4715 N
+ UW SH B s n/a 36 4657 4698 4715 N
+ UW SH CH b n/a 36 4657 4702 4717 N
+ UW SH CH e n/a 36 4657 4702 4717 N
+ UW SH CH i n/a 36 4657 4702 4716 N
+ UW SH CH s n/a 36 4657 4702 4717 N
+ UW SH D b n/a 36 4663 4688 4717 N
+ UW SH D e n/a 36 4663 4688 4717 N
+ UW SH D i n/a 36 4661 4688 4716 N
+ UW SH D s n/a 36 4663 4688 4717 N
+ UW SH DH e n/a 36 4663 4688 4719 N
+ UW SH DH s n/a 36 4663 4688 4719 N
+ UW SH EH e n/a 36 4659 4711 4744 N
+ UW SH EH s n/a 36 4659 4711 4744 N
+ UW SH ER b n/a 36 4657 4713 4739 N
+ UW SH ER e n/a 36 4657 4713 4739 N
+ UW SH ER i n/a 36 4659 4713 4741 N
+ UW SH ER s n/a 36 4657 4713 4739 N
+ UW SH EY b n/a 36 4659 4711 4744 N
+ UW SH EY e n/a 36 4659 4711 4744 N
+ UW SH EY s n/a 36 4659 4711 4744 N
+ UW SH F b n/a 36 4657 4698 4734 N
+ UW SH F e n/a 36 4657 4698 4734 N
+ UW SH F i n/a 36 4657 4698 4734 N
+ UW SH F s n/a 36 4657 4698 4734 N
+ UW SH G b n/a 36 4657 4698 4715 N
+ UW SH G e n/a 36 4657 4698 4715 N
+ UW SH G i n/a 36 4657 4698 4715 N
+ UW SH G s n/a 36 4657 4698 4715 N
+ UW SH HH e n/a 36 4659 4697 4731 N
+ UW SH HH i n/a 36 4658 4697 4731 N
+ UW SH HH s n/a 36 4659 4697 4731 N
+ UW SH IH b n/a 36 4657 4711 4745 N
+ UW SH IH e n/a 36 4657 4711 4745 N
+ UW SH IH i n/a 36 4658 4712 4745 N
+ UW SH IH s n/a 36 4657 4711 4745 N
+ UW SH IY b n/a 36 4659 4711 4745 N
+ UW SH IY e n/a 36 4659 4711 4745 N
+ UW SH IY i n/a 36 4658 4712 4745 N
+ UW SH IY s n/a 36 4659 4711 4745 N
+ UW SH JH e n/a 36 4657 4702 4717 N
+ UW SH JH i n/a 36 4657 4702 4716 N
+ UW SH JH s n/a 36 4657 4702 4717 N
+ UW SH K b n/a 36 4657 4698 4715 N
+ UW SH K e n/a 36 4657 4698 4715 N
+ UW SH K i n/a 36 4657 4698 4715 N
+ UW SH K s n/a 36 4657 4698 4715 N
+ UW SH L b n/a 36 4659 4711 4740 N
+ UW SH L e n/a 36 4659 4711 4729 N
+ UW SH L i n/a 36 4658 4712 4742 N
+ UW SH L s n/a 36 4659 4711 4740 N
+ UW SH M b n/a 36 4657 4697 4728 N
+ UW SH M e n/a 36 4657 4697 4728 N
+ UW SH M i n/a 36 4657 4697 4728 N
+ UW SH M s n/a 36 4657 4697 4728 N
+ UW SH N b n/a 36 4663 4688 4725 N
+ UW SH N e n/a 36 4663 4688 4725 N
+ UW SH N i n/a 36 4663 4688 4725 N
+ UW SH N s n/a 36 4663 4688 4725 N
+ UW SH NG b n/a 36 4657 4697 4728 N
+ UW SH NG e n/a 36 4657 4697 4728 N
+ UW SH NG s n/a 36 4657 4697 4728 N
+ UW SH OW e n/a 36 4659 4713 4739 N
+ UW SH OW s n/a 36 4659 4713 4739 N
+ UW SH OY e n/a 36 4659 4713 4739 N
+ UW SH OY s n/a 36 4659 4713 4739 N
+ UW SH P b n/a 36 4657 4698 4715 N
+ UW SH P e n/a 36 4657 4698 4715 N
+ UW SH P i n/a 36 4657 4698 4715 N
+ UW SH P s n/a 36 4657 4698 4715 N
+ UW SH R e n/a 36 4659 4711 4729 N
+ UW SH R i n/a 36 4659 4712 4742 N
+ UW SH R s n/a 36 4659 4711 4740 N
+ UW SH S b n/a 36 4663 4688 4722 N
+ UW SH S e n/a 36 4663 4688 4722 N
+ UW SH S i n/a 36 4661 4688 4722 N
+ UW SH S s n/a 36 4663 4688 4722 N
+ UW SH SH e n/a 36 4657 4702 4735 N
+ UW SH SH i n/a 36 4657 4702 4735 N
+ UW SH SH s n/a 36 4657 4702 4735 N
+ UW SH SIL e n/a 36 4667 4703 4733 N
+ UW SH SIL s n/a 36 4667 4703 4733 N
+ UW SH T b n/a 36 4663 4688 4717 N
+ UW SH T e n/a 36 4663 4688 4717 N
+ UW SH T i n/a 36 4661 4688 4716 N
+ UW SH T s n/a 36 4663 4688 4717 N
+ UW SH TH e n/a 36 4663 4688 4722 N
+ UW SH TH i n/a 36 4661 4688 4721 N
+ UW SH TH s n/a 36 4663 4688 4722 N
+ UW SH UH e n/a 36 4659 4713 4739 N
+ UW SH UH s n/a 36 4659 4713 4739 N
+ UW SH UW b n/a 36 4659 4713 4739 N
+ UW SH UW e n/a 36 4659 4713 4739 N
+ UW SH UW s n/a 36 4659 4713 4739 N
+ UW SH V b n/a 36 4657 4698 4728 N
+ UW SH V e n/a 36 4657 4698 4728 N
+ UW SH V i n/a 36 4657 4698 4728 N
+ UW SH V s n/a 36 4657 4698 4728 N
+ UW SH W b n/a 36 4659 4713 4739 N
+ UW SH W e n/a 36 4659 4713 4732 N
+ UW SH W i n/a 36 4658 4713 4742 N
+ UW SH W s n/a 36 4659 4713 4739 N
+ UW SH Y b n/a 36 4659 4711 4745 N
+ UW SH Y e n/a 36 4659 4711 4736 N
+ UW SH Y s n/a 36 4659 4711 4745 N
+ UW SH Z b n/a 36 4663 4688 4723 N
+ UW SH Z e n/a 36 4663 4688 4723 N
+ UW SH Z i n/a 36 4661 4688 4723 N
+ UW SH Z s n/a 36 4663 4688 4723 N
+ UW SH ZH e n/a 36 4657 4702 4735 N
+ UW SH ZH s n/a 36 4657 4702 4735 N
+ UW SIL AA s n/a 36 4656 4705 4739 N
+ UW SIL AE s n/a 36 4656 4705 4743 N
+ UW SIL AH b n/a 36 4655 4705 4740 N
+ UW SIL AH s n/a 36 4656 4705 4740 N
+ UW SIL AO s n/a 36 4656 4705 4739 N
+ UW SIL AW s n/a 36 4656 4705 4743 N
+ UW SIL AY s n/a 36 4656 4705 4739 N
+ UW SIL B b n/a 36 4655 4683 4715 N
+ UW SIL B s n/a 36 4656 4683 4715 N
+ UW SIL CH b n/a 36 4655 4683 4717 N
+ UW SIL CH s n/a 36 4656 4683 4717 N
+ UW SIL D b n/a 36 4656 4686 4717 N
+ UW SIL D s n/a 36 4656 4686 4717 N
+ UW SIL DH s n/a 36 4656 4686 4719 N
+ UW SIL EH s n/a 36 4656 4705 4743 N
+ UW SIL ER b n/a 36 4655 4705 4739 N
+ UW SIL ER s n/a 36 4656 4705 4739 N
+ UW SIL EY b n/a 36 4655 4705 4743 N
+ UW SIL EY s n/a 36 4656 4705 4743 N
+ UW SIL F b n/a 36 4655 4682 4734 N
+ UW SIL F s n/a 36 4656 4682 4734 N
+ UW SIL G b n/a 36 4655 4683 4715 N
+ UW SIL G s n/a 36 4656 4683 4715 N
+ UW SIL HH s n/a 36 4656 4683 4731 N
+ UW SIL IH b n/a 36 4655 4705 4745 N
+ UW SIL IH s n/a 36 4656 4705 4745 N
+ UW SIL IY b n/a 36 4655 4705 4745 N
+ UW SIL IY s n/a 36 4656 4705 4745 N
+ UW SIL JH s n/a 36 4656 4683 4717 N
+ UW SIL K b n/a 36 4655 4683 4715 N
+ UW SIL K s n/a 36 4656 4683 4715 N
+ UW SIL L b n/a 36 4655 4705 4737 N
+ UW SIL L s n/a 36 4656 4705 4737 N
+ UW SIL M b n/a 36 4655 4683 4726 N
+ UW SIL M s n/a 36 4656 4683 4726 N
+ UW SIL N b n/a 36 4656 4686 4725 N
+ UW SIL N s n/a 36 4656 4686 4725 N
+ UW SIL NG b n/a 36 4655 4683 4726 N
+ UW SIL NG s n/a 36 4656 4683 4726 N
+ UW SIL OW s n/a 36 4656 4705 4739 N
+ UW SIL OY s n/a 36 4656 4705 4739 N
+ UW SIL P b n/a 36 4655 4683 4715 N
+ UW SIL P s n/a 36 4656 4683 4715 N
+ UW SIL R s n/a 36 4656 4705 4738 N
+ UW SIL S b n/a 36 4656 4686 4721 N
+ UW SIL S s n/a 36 4656 4686 4721 N
+ UW SIL SH s n/a 36 4656 4686 4735 N
+ UW SIL SIL s n/a 36 4656 4682 4733 N
+ UW SIL T b n/a 36 4656 4686 4717 N
+ UW SIL T s n/a 36 4656 4686 4717 N
+ UW SIL TH s n/a 36 4656 4686 4722 N
+ UW SIL UH s n/a 36 4656 4705 4739 N
+ UW SIL UW b n/a 36 4655 4705 4739 N
+ UW SIL UW s n/a 36 4656 4705 4739 N
+ UW SIL V b n/a 36 4655 4683 4729 N
+ UW SIL V s n/a 36 4656 4683 4729 N
+ UW SIL W b n/a 36 4655 4705 4739 N
+ UW SIL W s n/a 36 4656 4705 4739 N
+ UW SIL Y b n/a 36 4655 4705 4745 N
+ UW SIL Y s n/a 36 4656 4705 4745 N
+ UW SIL Z b n/a 36 4656 4686 4723 N
+ UW SIL Z s n/a 36 4656 4686 4723 N
+ UW SIL ZH s n/a 36 4656 4686 4735 N
+ UW T AA e n/a 36 4659 4713 4739 N
+ UW T AA i n/a 36 4658 4712 4739 N
+ UW T AA s n/a 36 4659 4712 4739 N
+ UW T AE e n/a 36 4659 4713 4743 N
+ UW T AE i n/a 36 4658 4712 4744 N
+ UW T AE s n/a 36 4659 4712 4743 N
+ UW T AH b n/a 36 4658 4712 4741 N
+ UW T AH e n/a 36 4658 4713 4741 N
+ UW T AH i n/a 36 4658 4712 4742 N
+ UW T AH s n/a 36 4658 4712 4741 N
+ UW T AO e n/a 36 4659 4713 4739 N
+ UW T AO i n/a 36 4658 4713 4739 N
+ UW T AO s n/a 36 4659 4713 4739 N
+ UW T AW e n/a 36 4659 4713 4743 N
+ UW T AW s n/a 36 4659 4712 4743 N
+ UW T AY e n/a 36 4659 4713 4739 N
+ UW T AY s n/a 36 4659 4712 4739 N
+ UW T B b n/a 36 4657 4698 4715 N
+ UW T B e n/a 36 4657 4698 4715 N
+ UW T B i n/a 36 4657 4698 4715 N
+ UW T B s n/a 36 4657 4698 4715 N
+ UW T CH b n/a 36 4657 4702 4717 N
+ UW T CH e n/a 36 4657 4702 4717 N
+ UW T CH i n/a 36 4657 4702 4716 N
+ UW T CH s n/a 36 4657 4702 4717 N
+ UW T D b n/a 36 4662 4690 4717 N
+ UW T D e n/a 36 4662 4690 4717 N
+ UW T D i n/a 36 4661 4691 4716 N
+ UW T D s n/a 36 4662 4690 4717 N
+ UW T DH e n/a 36 4662 4690 4719 N
+ UW T DH i n/a 36 4661 4691 4719 N
+ UW T DH s n/a 36 4662 4690 4719 N
+ UW T EH e n/a 36 4659 4713 4743 N
+ UW T EH i n/a 36 4658 4712 4744 N
+ UW T EH s n/a 36 4659 4712 4743 N
+ UW T ER b n/a 36 4658 4713 4741 N
+ UW T ER e n/a 36 4658 4713 4741 N
+ UW T ER i n/a 36 4659 4713 4741 N
+ UW T ER s n/a 36 4658 4713 4741 N
+ UW T EY b n/a 36 4659 4712 4743 N
+ UW T EY e n/a 36 4659 4713 4743 N
+ UW T EY s n/a 36 4659 4712 4743 N
+ UW T F b n/a 36 4657 4698 4734 N
+ UW T F e n/a 36 4657 4698 4734 N
+ UW T F i n/a 36 4657 4698 4734 N
+ UW T F s n/a 36 4657 4698 4734 N
+ UW T G b n/a 36 4657 4698 4715 N
+ UW T G e n/a 36 4657 4698 4715 N
+ UW T G i n/a 36 4657 4698 4715 N
+ UW T G s n/a 36 4657 4698 4715 N
+ UW T HH e n/a 36 4659 4696 4731 N
+ UW T HH i n/a 36 4658 4696 4731 N
+ UW T HH s n/a 36 4659 4696 4731 N
+ UW T IH b n/a 36 4658 4712 4745 N
+ UW T IH e n/a 36 4658 4713 4745 N
+ UW T IH i n/a 36 4658 4712 4745 N
+ UW T IH s n/a 36 4658 4712 4745 N
+ UW T IY b n/a 36 4659 4712 4745 N
+ UW T IY e n/a 36 4659 4713 4745 N
+ UW T IY i n/a 36 4658 4712 4745 N
+ UW T IY s n/a 36 4659 4712 4745 N
+ UW T JH e n/a 36 4657 4702 4717 N
+ UW T JH i n/a 36 4657 4702 4716 N
+ UW T JH s n/a 36 4657 4702 4717 N
+ UW T K b n/a 36 4657 4698 4715 N
+ UW T K e n/a 36 4657 4698 4715 N
+ UW T K i n/a 36 4657 4698 4715 N
+ UW T K s n/a 36 4657 4698 4715 N
+ UW T L b n/a 36 4659 4711 4737 N
+ UW T L e n/a 36 4659 4711 4729 N
+ UW T L i n/a 36 4658 4712 4737 N
+ UW T L s n/a 36 4659 4711 4737 N
+ UW T M b n/a 36 4657 4697 4728 N
+ UW T M e n/a 36 4657 4697 4728 N
+ UW T M i n/a 36 4657 4697 4728 N
+ UW T M s n/a 36 4657 4697 4728 N
+ UW T N b n/a 36 4662 4692 4724 N
+ UW T N e n/a 36 4662 4692 4725 N
+ UW T N i n/a 36 4662 4692 4724 N
+ UW T N s n/a 36 4662 4692 4724 N
+ UW T NG b n/a 36 4657 4697 4728 N
+ UW T NG e n/a 36 4657 4697 4728 N
+ UW T NG i n/a 36 4657 4697 4728 N
+ UW T NG s n/a 36 4657 4697 4728 N
+ UW T OW e n/a 36 4659 4713 4739 N
+ UW T OW s n/a 36 4659 4713 4739 N
+ UW T OY e n/a 36 4659 4713 4739 N
+ UW T OY s n/a 36 4659 4713 4739 N
+ UW T P b n/a 36 4657 4698 4715 N
+ UW T P e n/a 36 4657 4698 4715 N
+ UW T P i n/a 36 4657 4698 4715 N
+ UW T P s n/a 36 4657 4698 4715 N
+ UW T R e n/a 36 4659 4711 4729 N
+ UW T R i n/a 36 4659 4712 4738 N
+ UW T R s n/a 36 4659 4711 4738 N
+ UW T S b n/a 36 4662 4690 4722 N
+ UW T S e n/a 36 4662 4690 4722 N
+ UW T S i n/a 36 4661 4691 4722 N
+ UW T S s n/a 36 4662 4690 4722 N
+ UW T SH e n/a 36 4657 4702 4735 N
+ UW T SH i n/a 36 4657 4702 4735 N
+ UW T SH s n/a 36 4657 4702 4735 N
+ UW T SIL e n/a 36 4667 4703 4733 N
+ UW T SIL s n/a 36 4667 4703 4733 N
+ UW T T b n/a 36 4662 4690 4717 N
+ UW T T e n/a 36 4662 4690 4717 N
+ UW T T i n/a 36 4661 4691 4716 N
+ UW T T s n/a 36 4662 4690 4717 N
+ UW T TH e n/a 36 4662 4690 4722 N
+ UW T TH i n/a 36 4661 4691 4721 N
+ UW T TH s n/a 36 4662 4690 4722 N
+ UW T UH e n/a 36 4659 4713 4741 N
+ UW T UH s n/a 36 4659 4713 4741 N
+ UW T UW b n/a 36 4659 4713 4739 N
+ UW T UW e n/a 36 4659 4713 4739 N
+ UW T UW s n/a 36 4659 4713 4739 N
+ UW T V b n/a 36 4657 4698 4729 N
+ UW T V e n/a 36 4657 4698 4729 N
+ UW T V i n/a 36 4657 4698 4727 N
+ UW T V s n/a 36 4657 4698 4729 N
+ UW T W b n/a 36 4659 4713 4741 N
+ UW T W e n/a 36 4659 4713 4732 N
+ UW T W s n/a 36 4659 4713 4741 N
+ UW T Y b n/a 36 4659 4711 4745 N
+ UW T Y e n/a 36 4659 4711 4736 N
+ UW T Y s n/a 36 4659 4711 4745 N
+ UW T Z b n/a 36 4662 4690 4723 N
+ UW T Z e n/a 36 4662 4690 4723 N
+ UW T Z i n/a 36 4661 4691 4723 N
+ UW T Z s n/a 36 4662 4690 4723 N
+ UW T ZH e n/a 36 4657 4702 4735 N
+ UW T ZH i n/a 36 4657 4702 4735 N
+ UW T ZH s n/a 36 4657 4702 4735 N
+ UW TH AA e n/a 36 4659 4713 4739 N
+ UW TH AA s n/a 36 4659 4712 4739 N
+ UW TH AE e n/a 36 4659 4711 4743 N
+ UW TH AE s n/a 36 4659 4711 4743 N
+ UW TH AH b n/a 36 4657 4711 4740 N
+ UW TH AH e n/a 36 4657 4711 4740 N
+ UW TH AH s n/a 36 4657 4711 4740 N
+ UW TH AO e n/a 36 4659 4713 4739 N
+ UW TH AO s n/a 36 4659 4713 4739 N
+ UW TH AW e n/a 36 4659 4711 4743 N
+ UW TH AW s n/a 36 4659 4711 4743 N
+ UW TH AY e n/a 36 4659 4713 4739 N
+ UW TH AY s n/a 36 4659 4712 4739 N
+ UW TH B b n/a 36 4657 4683 4715 N
+ UW TH B e n/a 36 4657 4683 4715 N
+ UW TH B s n/a 36 4657 4683 4715 N
+ UW TH CH b n/a 36 4657 4683 4717 N
+ UW TH CH e n/a 36 4657 4683 4717 N
+ UW TH CH s n/a 36 4657 4683 4717 N
+ UW TH D b n/a 36 4663 4690 4717 N
+ UW TH D e n/a 36 4663 4690 4717 N
+ UW TH D s n/a 36 4663 4690 4717 N
+ UW TH DH e n/a 36 4663 4690 4719 N
+ UW TH DH s n/a 36 4663 4690 4719 N
+ UW TH EH e n/a 36 4659 4711 4743 N
+ UW TH EH s n/a 36 4659 4711 4743 N
+ UW TH ER b n/a 36 4657 4713 4739 N
+ UW TH ER e n/a 36 4657 4713 4739 N
+ UW TH ER s n/a 36 4657 4713 4739 N
+ UW TH EY b n/a 36 4659 4711 4743 N
+ UW TH EY e n/a 36 4659 4711 4743 N
+ UW TH EY s n/a 36 4659 4711 4743 N
+ UW TH F b n/a 36 4657 4682 4734 N
+ UW TH F e n/a 36 4657 4682 4734 N
+ UW TH F s n/a 36 4657 4682 4734 N
+ UW TH G b n/a 36 4657 4683 4715 N
+ UW TH G e n/a 36 4657 4683 4715 N
+ UW TH G s n/a 36 4657 4683 4715 N
+ UW TH HH e n/a 36 4659 4683 4731 N
+ UW TH HH s n/a 36 4659 4683 4731 N
+ UW TH IH b n/a 36 4657 4711 4745 N
+ UW TH IH e n/a 36 4657 4711 4745 N
+ UW TH IH s n/a 36 4657 4711 4745 N
+ UW TH IY b n/a 36 4659 4711 4745 N
+ UW TH IY e n/a 36 4659 4711 4745 N
+ UW TH IY s n/a 36 4659 4711 4745 N
+ UW TH JH e n/a 36 4657 4683 4717 N
+ UW TH JH s n/a 36 4657 4683 4717 N
+ UW TH K b n/a 36 4657 4683 4715 N
+ UW TH K e n/a 36 4657 4683 4715 N
+ UW TH K s n/a 36 4657 4683 4715 N
+ UW TH L b n/a 36 4659 4711 4737 N
+ UW TH L e n/a 36 4659 4711 4729 N
+ UW TH L i n/a 36 4658 4712 4737 N
+ UW TH L s n/a 36 4659 4711 4737 N
+ UW TH M b n/a 36 4657 4683 4728 N
+ UW TH M e n/a 36 4657 4683 4728 N
+ UW TH M i n/a 36 4657 4683 4728 N
+ UW TH M s n/a 36 4657 4683 4728 N
+ UW TH N b n/a 36 4663 4692 4725 N
+ UW TH N e n/a 36 4663 4692 4725 N
+ UW TH N i n/a 36 4663 4692 4725 N
+ UW TH N s n/a 36 4663 4692 4725 N
+ UW TH NG b n/a 36 4657 4683 4728 N
+ UW TH NG e n/a 36 4657 4683 4728 N
+ UW TH NG s n/a 36 4657 4683 4728 N
+ UW TH OW e n/a 36 4659 4713 4739 N
+ UW TH OW s n/a 36 4659 4713 4739 N
+ UW TH OY e n/a 36 4659 4713 4739 N
+ UW TH OY s n/a 36 4659 4713 4739 N
+ UW TH P b n/a 36 4657 4683 4715 N
+ UW TH P e n/a 36 4657 4683 4715 N
+ UW TH P s n/a 36 4657 4683 4715 N
+ UW TH R e n/a 36 4659 4711 4729 N
+ UW TH R i n/a 36 4659 4712 4738 N
+ UW TH R s n/a 36 4659 4711 4738 N
+ UW TH S b n/a 36 4663 4690 4722 N
+ UW TH S e n/a 36 4663 4690 4722 N
+ UW TH S s n/a 36 4663 4690 4722 N
+ UW TH SH e n/a 36 4657 4686 4735 N
+ UW TH SH s n/a 36 4657 4686 4735 N
+ UW TH SIL e n/a 36 4667 4682 4733 N
+ UW TH SIL s n/a 36 4667 4682 4733 N
+ UW TH T b n/a 36 4663 4690 4717 N
+ UW TH T e n/a 36 4663 4690 4717 N
+ UW TH T i n/a 36 4661 4691 4716 N
+ UW TH T s n/a 36 4663 4690 4717 N
+ UW TH TH e n/a 36 4663 4690 4722 N
+ UW TH TH s n/a 36 4663 4690 4722 N
+ UW TH UH e n/a 36 4659 4713 4739 N
+ UW TH UH s n/a 36 4659 4713 4739 N
+ UW TH UW b n/a 36 4659 4713 4739 N
+ UW TH UW e n/a 36 4659 4713 4739 N
+ UW TH UW s n/a 36 4659 4713 4739 N
+ UW TH V b n/a 36 4657 4683 4729 N
+ UW TH V e n/a 36 4657 4683 4729 N
+ UW TH V i n/a 36 4657 4683 4727 N
+ UW TH V s n/a 36 4657 4683 4729 N
+ UW TH W b n/a 36 4659 4713 4739 N
+ UW TH W e n/a 36 4659 4713 4732 N
+ UW TH W s n/a 36 4659 4713 4739 N
+ UW TH Y b n/a 36 4659 4711 4745 N
+ UW TH Y e n/a 36 4659 4711 4736 N
+ UW TH Y i n/a 36 4658 4711 4745 N
+ UW TH Y s n/a 36 4659 4711 4745 N
+ UW TH Z b n/a 36 4663 4690 4723 N
+ UW TH Z e n/a 36 4663 4690 4723 N
+ UW TH Z i n/a 36 4661 4691 4723 N
+ UW TH Z s n/a 36 4663 4690 4723 N
+ UW TH ZH e n/a 36 4657 4686 4735 N
+ UW TH ZH i n/a 36 4657 4686 4735 N
+ UW TH ZH s n/a 36 4657 4686 4735 N
+ UW UH AA s n/a 36 4651 4682 4739 N
+ UW UH AE s n/a 36 4651 4682 4743 N
+ UW UH AH b n/a 36 4651 4682 4740 N
+ UW UH AH s n/a 36 4651 4682 4740 N
+ UW UH AO s n/a 36 4651 4682 4739 N
+ UW UH AW s n/a 36 4651 4682 4743 N
+ UW UH AY s n/a 36 4651 4682 4739 N
+ UW UH B b n/a 36 4651 4683 4715 N
+ UW UH B s n/a 36 4651 4683 4715 N
+ UW UH CH b n/a 36 4651 4683 4717 N
+ UW UH CH s n/a 36 4651 4683 4717 N
+ UW UH D b n/a 36 4651 4685 4717 N
+ UW UH D s n/a 36 4651 4685 4717 N
+ UW UH DH s n/a 36 4651 4685 4719 N
+ UW UH EH s n/a 36 4651 4682 4743 N
+ UW UH ER b n/a 36 4651 4682 4739 N
+ UW UH ER s n/a 36 4651 4682 4739 N
+ UW UH EY b n/a 36 4651 4682 4743 N
+ UW UH EY s n/a 36 4651 4682 4743 N
+ UW UH F b n/a 36 4651 4682 4734 N
+ UW UH F s n/a 36 4651 4682 4734 N
+ UW UH G b n/a 36 4651 4683 4715 N
+ UW UH G s n/a 36 4651 4683 4715 N
+ UW UH HH s n/a 36 4651 4682 4731 N
+ UW UH IH b n/a 36 4651 4682 4745 N
+ UW UH IH s n/a 36 4651 4682 4745 N
+ UW UH IY b n/a 36 4651 4682 4745 N
+ UW UH IY s n/a 36 4651 4682 4745 N
+ UW UH JH s n/a 36 4651 4683 4717 N
+ UW UH K b n/a 36 4651 4683 4715 N
+ UW UH K s n/a 36 4651 4683 4715 N
+ UW UH L b n/a 36 4651 4682 4737 N
+ UW UH L s n/a 36 4651 4682 4737 N
+ UW UH M b n/a 36 4651 4682 4726 N
+ UW UH M s n/a 36 4651 4682 4726 N
+ UW UH N b n/a 36 4651 4685 4724 N
+ UW UH N s n/a 36 4651 4685 4724 N
+ UW UH NG b n/a 36 4651 4682 4726 N
+ UW UH NG s n/a 36 4651 4682 4726 N
+ UW UH OW s n/a 36 4651 4682 4739 N
+ UW UH OY s n/a 36 4651 4682 4739 N
+ UW UH P b n/a 36 4651 4683 4715 N
+ UW UH P s n/a 36 4651 4683 4715 N
+ UW UH R s n/a 36 4651 4682 4738 N
+ UW UH S b n/a 36 4651 4685 4721 N
+ UW UH S s n/a 36 4651 4685 4721 N
+ UW UH SH s n/a 36 4651 4685 4735 N
+ UW UH SIL s n/a 36 4651 4682 4733 N
+ UW UH T b n/a 36 4651 4685 4717 N
+ UW UH T s n/a 36 4651 4685 4717 N
+ UW UH TH s n/a 36 4651 4685 4722 N
+ UW UH UH s n/a 36 4651 4682 4739 N
+ UW UH UW b n/a 36 4651 4682 4739 N
+ UW UH UW s n/a 36 4651 4682 4739 N
+ UW UH V b n/a 36 4651 4682 4729 N
+ UW UH V s n/a 36 4651 4682 4729 N
+ UW UH W b n/a 36 4651 4682 4739 N
+ UW UH W s n/a 36 4651 4682 4739 N
+ UW UH Y b n/a 36 4651 4682 4745 N
+ UW UH Y s n/a 36 4651 4682 4745 N
+ UW UH Z b n/a 36 4651 4685 4723 N
+ UW UH Z s n/a 36 4651 4685 4723 N
+ UW UH ZH s n/a 36 4651 4685 4735 N
+ UW UW AA e n/a 36 4651 4682 4739 N
+ UW UW AA s n/a 36 4651 4682 4739 N
+ UW UW AE e n/a 36 4651 4682 4743 N
+ UW UW AE s n/a 36 4651 4682 4743 N
+ UW UW AH b n/a 36 4651 4682 4740 N
+ UW UW AH e n/a 36 4651 4682 4740 N
+ UW UW AH s n/a 36 4651 4682 4740 N
+ UW UW AO e n/a 36 4651 4682 4739 N
+ UW UW AO s n/a 36 4651 4682 4739 N
+ UW UW AW e n/a 36 4651 4682 4743 N
+ UW UW AW s n/a 36 4651 4682 4743 N
+ UW UW AY e n/a 36 4651 4682 4739 N
+ UW UW AY s n/a 36 4651 4682 4739 N
+ UW UW B b n/a 36 4651 4683 4715 N
+ UW UW B e n/a 36 4651 4683 4715 N
+ UW UW B s n/a 36 4651 4683 4715 N
+ UW UW CH b n/a 36 4651 4683 4717 N
+ UW UW CH e n/a 36 4651 4683 4717 N
+ UW UW CH s n/a 36 4651 4683 4717 N
+ UW UW D b n/a 36 4651 4685 4717 N
+ UW UW D e n/a 36 4651 4685 4717 N
+ UW UW D s n/a 36 4651 4685 4717 N
+ UW UW DH e n/a 36 4651 4685 4719 N
+ UW UW DH s n/a 36 4651 4685 4719 N
+ UW UW EH e n/a 36 4651 4682 4743 N
+ UW UW EH s n/a 36 4651 4682 4743 N
+ UW UW ER b n/a 36 4651 4682 4739 N
+ UW UW ER e n/a 36 4651 4682 4739 N
+ UW UW ER s n/a 36 4651 4682 4739 N
+ UW UW EY b n/a 36 4651 4682 4743 N
+ UW UW EY e n/a 36 4651 4682 4743 N
+ UW UW EY s n/a 36 4651 4682 4743 N
+ UW UW F b n/a 36 4651 4682 4734 N
+ UW UW F e n/a 36 4651 4682 4734 N
+ UW UW F s n/a 36 4651 4682 4734 N
+ UW UW G b n/a 36 4651 4683 4715 N
+ UW UW G e n/a 36 4651 4683 4715 N
+ UW UW G s n/a 36 4651 4683 4715 N
+ UW UW HH e n/a 36 4651 4682 4731 N
+ UW UW HH s n/a 36 4651 4682 4731 N
+ UW UW IH b n/a 36 4651 4682 4745 N
+ UW UW IH e n/a 36 4651 4682 4745 N
+ UW UW IH s n/a 36 4651 4682 4745 N
+ UW UW IY b n/a 36 4651 4682 4745 N
+ UW UW IY e n/a 36 4651 4682 4745 N
+ UW UW IY s n/a 36 4651 4682 4745 N
+ UW UW JH e n/a 36 4651 4683 4717 N
+ UW UW JH s n/a 36 4651 4683 4717 N
+ UW UW K b n/a 36 4651 4683 4715 N
+ UW UW K e n/a 36 4651 4683 4715 N
+ UW UW K s n/a 36 4651 4683 4715 N
+ UW UW L b n/a 36 4651 4682 4737 N
+ UW UW L e n/a 36 4651 4682 4729 N
+ UW UW L s n/a 36 4651 4682 4737 N
+ UW UW M b n/a 36 4651 4682 4726 N
+ UW UW M e n/a 36 4651 4682 4726 N
+ UW UW M s n/a 36 4651 4682 4726 N
+ UW UW N b n/a 36 4651 4685 4724 N
+ UW UW N e n/a 36 4651 4685 4724 N
+ UW UW N s n/a 36 4651 4685 4724 N
+ UW UW NG b n/a 36 4651 4682 4726 N
+ UW UW NG e n/a 36 4651 4682 4726 N
+ UW UW NG s n/a 36 4651 4682 4726 N
+ UW UW OW e n/a 36 4651 4682 4739 N
+ UW UW OW i n/a 36 4651 4682 4739 N
+ UW UW OW s n/a 36 4651 4682 4739 N
+ UW UW OY e n/a 36 4651 4682 4739 N
+ UW UW OY s n/a 36 4651 4682 4739 N
+ UW UW P b n/a 36 4651 4683 4715 N
+ UW UW P e n/a 36 4651 4683 4715 N
+ UW UW P s n/a 36 4651 4683 4715 N
+ UW UW R e n/a 36 4651 4682 4729 N
+ UW UW R s n/a 36 4651 4682 4738 N
+ UW UW S b n/a 36 4651 4685 4721 N
+ UW UW S e n/a 36 4651 4685 4721 N
+ UW UW S s n/a 36 4651 4685 4721 N
+ UW UW SH e n/a 36 4651 4685 4735 N
+ UW UW SH s n/a 36 4651 4685 4735 N
+ UW UW SIL e n/a 36 4651 4682 4733 N
+ UW UW SIL s n/a 36 4651 4682 4733 N
+ UW UW T b n/a 36 4651 4685 4717 N
+ UW UW T e n/a 36 4651 4685 4717 N
+ UW UW T s n/a 36 4651 4685 4717 N
+ UW UW TH e n/a 36 4651 4685 4722 N
+ UW UW TH s n/a 36 4651 4685 4722 N
+ UW UW UH e n/a 36 4651 4682 4739 N
+ UW UW UH s n/a 36 4651 4682 4739 N
+ UW UW UW b n/a 36 4651 4682 4739 N
+ UW UW UW e n/a 36 4651 4682 4739 N
+ UW UW UW s n/a 36 4651 4682 4739 N
+ UW UW V b n/a 36 4651 4682 4729 N
+ UW UW V e n/a 36 4651 4682 4729 N
+ UW UW V s n/a 36 4651 4682 4729 N
+ UW UW W b n/a 36 4651 4682 4739 N
+ UW UW W e n/a 36 4651 4682 4732 N
+ UW UW W s n/a 36 4651 4682 4739 N
+ UW UW Y b n/a 36 4651 4682 4745 N
+ UW UW Y e n/a 36 4651 4682 4736 N
+ UW UW Y s n/a 36 4651 4682 4745 N
+ UW UW Z b n/a 36 4651 4685 4723 N
+ UW UW Z e n/a 36 4651 4685 4723 N
+ UW UW Z s n/a 36 4651 4685 4723 N
+ UW UW ZH e n/a 36 4651 4685 4735 N
+ UW UW ZH s n/a 36 4651 4685 4735 N
+ UW V AA e n/a 36 4651 4710 4739 N
+ UW V AA s n/a 36 4651 4710 4739 N
+ UW V AE e n/a 36 4651 4710 4743 N
+ UW V AE i n/a 36 4651 4710 4744 N
+ UW V AE s n/a 36 4651 4710 4743 N
+ UW V AH b n/a 36 4651 4710 4740 N
+ UW V AH e n/a 36 4651 4710 4740 N
+ UW V AH s n/a 36 4651 4710 4740 N
+ UW V AO e n/a 36 4651 4710 4739 N
+ UW V AO i n/a 36 4651 4710 4739 N
+ UW V AO s n/a 36 4651 4710 4739 N
+ UW V AW e n/a 36 4651 4710 4743 N
+ UW V AW s n/a 36 4651 4710 4743 N
+ UW V AY e n/a 36 4651 4710 4739 N
+ UW V AY s n/a 36 4651 4710 4739 N
+ UW V B b n/a 36 4651 4684 4715 N
+ UW V B e n/a 36 4651 4684 4715 N
+ UW V B s n/a 36 4651 4684 4715 N
+ UW V CH b n/a 36 4651 4684 4720 N
+ UW V CH e n/a 36 4651 4684 4720 N
+ UW V CH i n/a 36 4651 4684 4720 N
+ UW V CH s n/a 36 4651 4684 4720 N
+ UW V D b n/a 36 4651 4684 4720 N
+ UW V D e n/a 36 4651 4684 4720 N
+ UW V D i n/a 36 4651 4684 4720 N
+ UW V D s n/a 36 4651 4684 4720 N
+ UW V DH e n/a 36 4651 4684 4720 N
+ UW V DH s n/a 36 4651 4684 4720 N
+ UW V EH e n/a 36 4651 4710 4743 N
+ UW V EH i n/a 36 4651 4710 4744 N
+ UW V EH s n/a 36 4651 4710 4743 N
+ UW V ER b n/a 36 4651 4710 4739 N
+ UW V ER e n/a 36 4651 4710 4739 N
+ UW V ER s n/a 36 4651 4710 4739 N
+ UW V EY b n/a 36 4651 4710 4743 N
+ UW V EY e n/a 36 4651 4710 4743 N
+ UW V EY s n/a 36 4651 4710 4743 N
+ UW V F b n/a 36 4651 4684 4734 N
+ UW V F e n/a 36 4651 4684 4734 N
+ UW V F s n/a 36 4651 4684 4734 N
+ UW V G b n/a 36 4651 4684 4715 N
+ UW V G e n/a 36 4651 4684 4715 N
+ UW V G s n/a 36 4651 4684 4715 N
+ UW V HH e n/a 36 4651 4684 4730 N
+ UW V HH s n/a 36 4651 4684 4730 N
+ UW V IH b n/a 36 4651 4710 4745 N
+ UW V IH e n/a 36 4651 4710 4745 N
+ UW V IH s n/a 36 4651 4710 4745 N
+ UW V IY b n/a 36 4651 4710 4745 N
+ UW V IY e n/a 36 4651 4710 4745 N
+ UW V IY s n/a 36 4651 4710 4745 N
+ UW V JH e n/a 36 4651 4684 4720 N
+ UW V JH s n/a 36 4651 4684 4720 N
+ UW V K b n/a 36 4651 4684 4715 N
+ UW V K e n/a 36 4651 4684 4715 N
+ UW V K i n/a 36 4651 4684 4715 N
+ UW V K s n/a 36 4651 4684 4715 N
+ UW V L b n/a 36 4651 4709 4737 N
+ UW V L e n/a 36 4651 4709 4729 N
+ UW V L i n/a 36 4651 4709 4737 N
+ UW V L s n/a 36 4651 4709 4737 N
+ UW V M b n/a 36 4651 4684 4726 N
+ UW V M e n/a 36 4651 4684 4726 N
+ UW V M s n/a 36 4651 4684 4726 N
+ UW V N b n/a 36 4651 4684 4725 N
+ UW V N e n/a 36 4651 4684 4725 N
+ UW V N s n/a 36 4651 4684 4725 N
+ UW V NG b n/a 36 4651 4684 4726 N
+ UW V NG e n/a 36 4651 4684 4726 N
+ UW V NG s n/a 36 4651 4684 4726 N
+ UW V OW e n/a 36 4651 4710 4739 N
+ UW V OW i n/a 36 4651 4710 4739 N
+ UW V OW s n/a 36 4651 4710 4739 N
+ UW V OY e n/a 36 4651 4710 4739 N
+ UW V OY s n/a 36 4651 4710 4739 N
+ UW V P b n/a 36 4651 4684 4715 N
+ UW V P e n/a 36 4651 4684 4715 N
+ UW V P s n/a 36 4651 4684 4715 N
+ UW V R e n/a 36 4651 4709 4729 N
+ UW V R s n/a 36 4651 4709 4738 N
+ UW V S b n/a 36 4651 4685 4721 N
+ UW V S e n/a 36 4651 4685 4721 N
+ UW V S i n/a 36 4651 4685 4721 N
+ UW V S s n/a 36 4651 4685 4721 N
+ UW V SH e n/a 36 4651 4685 4735 N
+ UW V SH i n/a 36 4651 4685 4735 N
+ UW V SH s n/a 36 4651 4685 4735 N
+ UW V SIL e n/a 36 4651 4684 4733 N
+ UW V SIL s n/a 36 4651 4684 4733 N
+ UW V T b n/a 36 4651 4684 4720 N
+ UW V T e n/a 36 4651 4684 4720 N
+ UW V T i n/a 36 4651 4684 4720 N
+ UW V T s n/a 36 4651 4684 4720 N
+ UW V TH e n/a 36 4651 4684 4722 N
+ UW V TH s n/a 36 4651 4684 4722 N
+ UW V UH e n/a 36 4651 4710 4739 N
+ UW V UH s n/a 36 4651 4710 4739 N
+ UW V UW b n/a 36 4651 4710 4739 N
+ UW V UW e n/a 36 4651 4710 4739 N
+ UW V UW s n/a 36 4651 4710 4739 N
+ UW V V b n/a 36 4651 4684 4729 N
+ UW V V e n/a 36 4651 4684 4729 N
+ UW V V i n/a 36 4651 4684 4727 N
+ UW V V s n/a 36 4651 4684 4729 N
+ UW V W b n/a 36 4651 4709 4739 N
+ UW V W e n/a 36 4651 4709 4732 N
+ UW V W s n/a 36 4651 4709 4739 N
+ UW V Y b n/a 36 4651 4702 4745 N
+ UW V Y e n/a 36 4651 4702 4736 N
+ UW V Y s n/a 36 4651 4702 4745 N
+ UW V Z b n/a 36 4651 4685 4723 N
+ UW V Z e n/a 36 4651 4685 4723 N
+ UW V Z i n/a 36 4651 4685 4723 N
+ UW V Z s n/a 36 4651 4685 4723 N
+ UW V ZH e n/a 36 4651 4685 4735 N
+ UW V ZH s n/a 36 4651 4685 4735 N
+ UW W AA e n/a 36 4651 4684 4739 N
+ UW W AA s n/a 36 4651 4684 4739 N
+ UW W AE e n/a 36 4651 4684 4743 N
+ UW W AE s n/a 36 4651 4684 4743 N
+ UW W AH b n/a 36 4651 4684 4740 N
+ UW W AH e n/a 36 4651 4684 4740 N
+ UW W AH i n/a 36 4651 4684 4742 N
+ UW W AH s n/a 36 4651 4684 4740 N
+ UW W AO e n/a 36 4651 4684 4739 N
+ UW W AO s n/a 36 4651 4684 4739 N
+ UW W AW e n/a 36 4651 4684 4743 N
+ UW W AW s n/a 36 4651 4684 4743 N
+ UW W AY e n/a 36 4651 4684 4739 N
+ UW W AY s n/a 36 4651 4684 4739 N
+ UW W B b n/a 36 4651 4684 4715 N
+ UW W B e n/a 36 4651 4684 4715 N
+ UW W B i n/a 36 4651 4684 4715 N
+ UW W B s n/a 36 4651 4684 4715 N
+ UW W CH b n/a 36 4651 4684 4720 N
+ UW W CH e n/a 36 4651 4684 4720 N
+ UW W CH s n/a 36 4651 4684 4720 N
+ UW W D b n/a 36 4651 4684 4720 N
+ UW W D e n/a 36 4651 4684 4720 N
+ UW W D i n/a 36 4651 4684 4720 N
+ UW W D s n/a 36 4651 4684 4720 N
+ UW W DH e n/a 36 4651 4684 4720 N
+ UW W DH s n/a 36 4651 4684 4720 N
+ UW W EH e n/a 36 4651 4684 4743 N
+ UW W EH s n/a 36 4651 4684 4743 N
+ UW W ER b n/a 36 4651 4684 4739 N
+ UW W ER e n/a 36 4651 4684 4739 N
+ UW W ER i n/a 36 4651 4684 4741 N
+ UW W ER s n/a 36 4651 4684 4739 N
+ UW W EY b n/a 36 4651 4684 4743 N
+ UW W EY e n/a 36 4651 4684 4743 N
+ UW W EY s n/a 36 4651 4684 4743 N
+ UW W F b n/a 36 4651 4684 4734 N
+ UW W F e n/a 36 4651 4684 4734 N
+ UW W F i n/a 36 4651 4684 4734 N
+ UW W F s n/a 36 4651 4684 4734 N
+ UW W G b n/a 36 4651 4684 4715 N
+ UW W G e n/a 36 4651 4684 4715 N
+ UW W G i n/a 36 4651 4684 4715 N
+ UW W G s n/a 36 4651 4684 4715 N
+ UW W HH e n/a 36 4651 4684 4730 N
+ UW W HH s n/a 36 4651 4684 4730 N
+ UW W IH b n/a 36 4651 4684 4745 N
+ UW W IH e n/a 36 4651 4684 4745 N
+ UW W IH i n/a 36 4651 4684 4745 N
+ UW W IH s n/a 36 4651 4684 4745 N
+ UW W IY b n/a 36 4651 4684 4745 N
+ UW W IY e n/a 36 4651 4684 4745 N
+ UW W IY s n/a 36 4651 4684 4745 N
+ UW W JH e n/a 36 4651 4684 4720 N
+ UW W JH s n/a 36 4651 4684 4720 N
+ UW W K b n/a 36 4651 4684 4715 N
+ UW W K e n/a 36 4651 4684 4715 N
+ UW W K i n/a 36 4651 4684 4715 N
+ UW W K s n/a 36 4651 4684 4715 N
+ UW W L b n/a 36 4651 4684 4737 N
+ UW W L e n/a 36 4651 4684 4729 N
+ UW W L i n/a 36 4651 4684 4737 N
+ UW W L s n/a 36 4651 4684 4737 N
+ UW W M b n/a 36 4651 4684 4726 N
+ UW W M e n/a 36 4651 4684 4726 N
+ UW W M i n/a 36 4651 4684 4726 N
+ UW W M s n/a 36 4651 4684 4726 N
+ UW W N b n/a 36 4651 4684 4725 N
+ UW W N e n/a 36 4651 4684 4725 N
+ UW W N i n/a 36 4651 4684 4725 N
+ UW W N s n/a 36 4651 4684 4725 N
+ UW W NG b n/a 36 4651 4684 4726 N
+ UW W NG e n/a 36 4651 4684 4726 N
+ UW W NG i n/a 36 4651 4684 4726 N
+ UW W NG s n/a 36 4651 4684 4726 N
+ UW W OW e n/a 36 4651 4684 4739 N
+ UW W OW s n/a 36 4651 4684 4739 N
+ UW W OY e n/a 36 4651 4684 4739 N
+ UW W OY s n/a 36 4651 4684 4739 N
+ UW W P b n/a 36 4651 4684 4715 N
+ UW W P e n/a 36 4651 4684 4715 N
+ UW W P i n/a 36 4651 4684 4715 N
+ UW W P s n/a 36 4651 4684 4715 N
+ UW W R e n/a 36 4651 4684 4729 N
+ UW W R s n/a 36 4651 4684 4738 N
+ UW W S b n/a 36 4651 4685 4721 N
+ UW W S e n/a 36 4651 4685 4721 N
+ UW W S i n/a 36 4651 4685 4721 N
+ UW W S s n/a 36 4651 4685 4721 N
+ UW W SH e n/a 36 4651 4685 4735 N
+ UW W SH i n/a 36 4651 4685 4735 N
+ UW W SH s n/a 36 4651 4685 4735 N
+ UW W SIL e n/a 36 4651 4684 4733 N
+ UW W SIL s n/a 36 4651 4684 4733 N
+ UW W T b n/a 36 4651 4684 4720 N
+ UW W T e n/a 36 4651 4684 4720 N
+ UW W T i n/a 36 4651 4684 4720 N
+ UW W T s n/a 36 4651 4684 4720 N
+ UW W TH e n/a 36 4651 4684 4722 N
+ UW W TH s n/a 36 4651 4684 4722 N
+ UW W UH e n/a 36 4651 4684 4739 N
+ UW W UH s n/a 36 4651 4684 4739 N
+ UW W UW b n/a 36 4651 4684 4739 N
+ UW W UW e n/a 36 4651 4684 4739 N
+ UW W UW i n/a 36 4651 4684 4739 N
+ UW W UW s n/a 36 4651 4684 4739 N
+ UW W V b n/a 36 4651 4684 4729 N
+ UW W V e n/a 36 4651 4684 4729 N
+ UW W V s n/a 36 4651 4684 4729 N
+ UW W W b n/a 36 4651 4684 4739 N
+ UW W W e n/a 36 4651 4684 4732 N
+ UW W W s n/a 36 4651 4684 4739 N
+ UW W Y b n/a 36 4651 4684 4745 N
+ UW W Y e n/a 36 4651 4684 4736 N
+ UW W Y s n/a 36 4651 4684 4745 N
+ UW W Z b n/a 36 4651 4685 4723 N
+ UW W Z e n/a 36 4651 4685 4723 N
+ UW W Z i n/a 36 4651 4685 4723 N
+ UW W Z s n/a 36 4651 4685 4723 N
+ UW W ZH e n/a 36 4651 4685 4735 N
+ UW W ZH s n/a 36 4651 4685 4735 N
+ UW Y AA e n/a 36 4672 4708 4739 N
+ UW Y AA i n/a 36 4672 4708 4739 N
+ UW Y AA s n/a 36 4672 4708 4739 N
+ UW Y AE e n/a 36 4673 4710 4743 N
+ UW Y AE i n/a 36 4672 4710 4744 N
+ UW Y AE s n/a 36 4673 4710 4743 N
+ UW Y AH b n/a 36 4673 4710 4740 N
+ UW Y AH e n/a 36 4673 4710 4740 N
+ UW Y AH i n/a 36 4672 4710 4742 N
+ UW Y AH s n/a 36 4673 4710 4740 N
+ UW Y AO e n/a 36 4672 4708 4739 N
+ UW Y AO i n/a 36 4672 4708 4739 N
+ UW Y AO s n/a 36 4672 4708 4739 N
+ UW Y AW e n/a 36 4672 4710 4743 N
+ UW Y AW i n/a 36 4672 4710 4743 N
+ UW Y AW s n/a 36 4672 4710 4743 N
+ UW Y AY e n/a 36 4673 4708 4739 N
+ UW Y AY i n/a 36 4672 4708 4739 N
+ UW Y AY s n/a 36 4673 4708 4739 N
+ UW Y B b n/a 36 4676 4700 4715 N
+ UW Y B e n/a 36 4676 4700 4715 N
+ UW Y B i n/a 36 4676 4700 4715 N
+ UW Y B s n/a 36 4676 4700 4715 N
+ UW Y CH b n/a 36 4670 4702 4718 N
+ UW Y CH e n/a 36 4670 4702 4718 N
+ UW Y CH i n/a 36 4670 4702 4718 N
+ UW Y CH s n/a 36 4670 4702 4718 N
+ UW Y D b n/a 36 4670 4694 4718 N
+ UW Y D e n/a 36 4670 4694 4718 N
+ UW Y D i n/a 36 4670 4694 4718 N
+ UW Y D s n/a 36 4670 4694 4718 N
+ UW Y DH e n/a 36 4669 4691 4719 N
+ UW Y DH i n/a 36 4669 4691 4719 N
+ UW Y DH s n/a 36 4669 4691 4719 N
+ UW Y EH e n/a 36 4673 4710 4744 N
+ UW Y EH i n/a 36 4672 4710 4744 N
+ UW Y EH s n/a 36 4673 4710 4744 N
+ UW Y ER b n/a 36 4672 4708 4739 N
+ UW Y ER e n/a 36 4672 4708 4739 N
+ UW Y ER i n/a 36 4672 4708 4741 N
+ UW Y ER s n/a 36 4672 4708 4739 N
+ UW Y EY b n/a 36 4673 4710 4744 N
+ UW Y EY e n/a 36 4673 4710 4744 N
+ UW Y EY i n/a 36 4672 4710 4744 N
+ UW Y EY s n/a 36 4673 4710 4744 N
+ UW Y F b n/a 36 4676 4699 4734 N
+ UW Y F e n/a 36 4676 4699 4734 N
+ UW Y F i n/a 36 4675 4699 4734 N
+ UW Y F s n/a 36 4676 4699 4734 N
+ UW Y G b n/a 36 4675 4699 4714 N
+ UW Y G e n/a 36 4675 4699 4714 N
+ UW Y G i n/a 36 4675 4699 4714 N
+ UW Y G s n/a 36 4675 4699 4714 N
+ UW Y HH e n/a 36 4676 4701 4731 N
+ UW Y HH i n/a 36 4676 4701 4731 N
+ UW Y HH s n/a 36 4676 4701 4731 N
+ UW Y IH b n/a 36 4673 4710 4745 N
+ UW Y IH e n/a 36 4673 4710 4745 N
+ UW Y IH i n/a 36 4673 4710 4745 N
+ UW Y IH s n/a 36 4673 4710 4745 N
+ UW Y IY b n/a 36 4673 4710 4745 N
+ UW Y IY e n/a 36 4673 4710 4745 N
+ UW Y IY i n/a 36 4673 4710 4745 N
+ UW Y IY s n/a 36 4673 4710 4745 N
+ UW Y JH e n/a 36 4670 4702 4718 N
+ UW Y JH i n/a 36 4670 4702 4717 N
+ UW Y JH s n/a 36 4670 4702 4717 N
+ UW Y K b n/a 36 4675 4699 4714 N
+ UW Y K e n/a 36 4675 4699 4714 N
+ UW Y K i n/a 36 4675 4699 4714 N
+ UW Y K s n/a 36 4675 4699 4714 N
+ UW Y L b n/a 36 4674 4709 4740 N
+ UW Y L e n/a 36 4674 4709 4729 N
+ UW Y L i n/a 36 4674 4709 4742 N
+ UW Y L s n/a 36 4674 4709 4740 N
+ UW Y M b n/a 36 4674 4700 4728 N
+ UW Y M e n/a 36 4674 4700 4728 N
+ UW Y M i n/a 36 4674 4700 4728 N
+ UW Y M s n/a 36 4674 4700 4728 N
+ UW Y N b n/a 36 4671 4695 4724 N
+ UW Y N e n/a 36 4671 4695 4724 N
+ UW Y N i n/a 36 4671 4695 4724 N
+ UW Y N s n/a 36 4671 4695 4724 N
+ UW Y NG b n/a 36 4675 4701 4728 N
+ UW Y NG e n/a 36 4675 4701 4728 N
+ UW Y NG i n/a 36 4675 4701 4728 N
+ UW Y NG s n/a 36 4675 4701 4728 N
+ UW Y OW e n/a 36 4672 4708 4739 N
+ UW Y OW i n/a 36 4672 4708 4739 N
+ UW Y OW s n/a 36 4672 4708 4739 N
+ UW Y OY e n/a 36 4673 4708 4739 N
+ UW Y OY i n/a 36 4672 4708 4739 N
+ UW Y OY s n/a 36 4673 4708 4739 N
+ UW Y P b n/a 36 4676 4699 4715 N
+ UW Y P e n/a 36 4676 4699 4715 N
+ UW Y P i n/a 36 4676 4699 4715 N
+ UW Y P s n/a 36 4676 4699 4715 N
+ UW Y R e n/a 36 4674 4709 4729 N
+ UW Y R i n/a 36 4674 4709 4742 N
+ UW Y R s n/a 36 4674 4709 4740 N
+ UW Y S b n/a 36 4670 4693 4722 N
+ UW Y S e n/a 36 4670 4693 4722 N
+ UW Y S i n/a 36 4669 4693 4722 N
+ UW Y S s n/a 36 4670 4693 4722 N
+ UW Y SH e n/a 36 4670 4702 4735 N
+ UW Y SH i n/a 36 4669 4702 4735 N
+ UW Y SH s n/a 36 4670 4702 4735 N
+ UW Y SIL e n/a 36 4677 4704 4733 N
+ UW Y SIL s n/a 36 4677 4704 4733 N
+ UW Y T b n/a 36 4670 4694 4718 N
+ UW Y T e n/a 36 4670 4694 4718 N
+ UW Y T i n/a 36 4670 4694 4718 N
+ UW Y T s n/a 36 4670 4694 4718 N
+ UW Y TH e n/a 36 4670 4693 4722 N
+ UW Y TH i n/a 36 4669 4693 4721 N
+ UW Y TH s n/a 36 4670 4693 4722 N
+ UW Y UH e n/a 36 4672 4708 4739 N
+ UW Y UH i n/a 36 4672 4708 4741 N
+ UW Y UH s n/a 36 4672 4708 4739 N
+ UW Y UW b n/a 36 4672 4708 4739 N
+ UW Y UW e n/a 36 4672 4708 4739 N
+ UW Y UW i n/a 36 4672 4708 4739 N
+ UW Y UW s n/a 36 4672 4708 4739 N
+ UW Y V b n/a 36 4676 4699 4728 N
+ UW Y V e n/a 36 4676 4699 4728 N
+ UW Y V i n/a 36 4675 4699 4728 N
+ UW Y V s n/a 36 4676 4699 4728 N
+ UW Y W b n/a 36 4672 4708 4739 N
+ UW Y W e n/a 36 4672 4708 4732 N
+ UW Y W i n/a 36 4672 4708 4742 N
+ UW Y W s n/a 36 4672 4708 4739 N
+ UW Y Y b n/a 36 4677 4702 4745 N
+ UW Y Y e n/a 36 4677 4702 4736 N
+ UW Y Y i n/a 36 4677 4702 4745 N
+ UW Y Y s n/a 36 4677 4702 4745 N
+ UW Y Z b n/a 36 4669 4689 4723 N
+ UW Y Z e n/a 36 4669 4689 4723 N
+ UW Y Z i n/a 36 4669 4689 4723 N
+ UW Y Z s n/a 36 4669 4689 4723 N
+ UW Y ZH e n/a 36 4669 4702 4735 N
+ UW Y ZH i n/a 36 4669 4702 4735 N
+ UW Y ZH s n/a 36 4669 4702 4735 N
+ UW Z AA e n/a 36 4664 4710 4739 N
+ UW Z AA i n/a 36 4665 4710 4739 N
+ UW Z AA s n/a 36 4664 4710 4739 N
+ UW Z AE e n/a 36 4664 4710 4743 N
+ UW Z AE s n/a 36 4664 4710 4743 N
+ UW Z AH b n/a 36 4664 4710 4740 N
+ UW Z AH e n/a 36 4664 4710 4740 N
+ UW Z AH s n/a 36 4664 4710 4740 N
+ UW Z AO e n/a 36 4664 4710 4739 N
+ UW Z AO s n/a 36 4664 4710 4739 N
+ UW Z AW e n/a 36 4664 4710 4743 N
+ UW Z AW s n/a 36 4664 4710 4743 N
+ UW Z AY e n/a 36 4664 4710 4739 N
+ UW Z AY i n/a 36 4665 4710 4739 N
+ UW Z AY s n/a 36 4664 4710 4739 N
+ UW Z B b n/a 36 4668 4698 4715 N
+ UW Z B e n/a 36 4668 4698 4715 N
+ UW Z B i n/a 36 4668 4698 4715 N
+ UW Z B s n/a 36 4668 4698 4715 N
+ UW Z CH b n/a 36 4667 4702 4717 N
+ UW Z CH e n/a 36 4667 4702 4717 N
+ UW Z CH s n/a 36 4667 4702 4717 N
+ UW Z D b n/a 36 4667 4691 4717 N
+ UW Z D e n/a 36 4667 4691 4717 N
+ UW Z D i n/a 36 4667 4691 4716 N
+ UW Z D s n/a 36 4667 4691 4717 N
+ UW Z DH e n/a 36 4667 4691 4719 N
+ UW Z DH s n/a 36 4667 4691 4719 N
+ UW Z EH e n/a 36 4664 4710 4743 N
+ UW Z EH s n/a 36 4664 4710 4743 N
+ UW Z ER b n/a 36 4664 4710 4739 N
+ UW Z ER e n/a 36 4664 4710 4739 N
+ UW Z ER s n/a 36 4664 4710 4739 N
+ UW Z EY b n/a 36 4664 4710 4743 N
+ UW Z EY e n/a 36 4664 4710 4743 N
+ UW Z EY s n/a 36 4664 4710 4743 N
+ UW Z F b n/a 36 4668 4698 4734 N
+ UW Z F e n/a 36 4668 4698 4734 N
+ UW Z F i n/a 36 4668 4698 4734 N
+ UW Z F s n/a 36 4668 4698 4734 N
+ UW Z G b n/a 36 4667 4698 4715 N
+ UW Z G e n/a 36 4667 4698 4715 N
+ UW Z G i n/a 36 4667 4698 4715 N
+ UW Z G s n/a 36 4667 4698 4715 N
+ UW Z HH e n/a 36 4667 4697 4731 N
+ UW Z HH i n/a 36 4667 4697 4731 N
+ UW Z HH s n/a 36 4667 4697 4731 N
+ UW Z IH b n/a 36 4664 4710 4745 N
+ UW Z IH e n/a 36 4664 4710 4745 N
+ UW Z IH i n/a 36 4665 4710 4745 N
+ UW Z IH s n/a 36 4664 4710 4745 N
+ UW Z IY b n/a 36 4664 4710 4745 N
+ UW Z IY e n/a 36 4664 4710 4745 N
+ UW Z IY s n/a 36 4664 4710 4745 N
+ UW Z JH e n/a 36 4667 4702 4717 N
+ UW Z JH i n/a 36 4667 4702 4716 N
+ UW Z JH s n/a 36 4667 4702 4717 N
+ UW Z K b n/a 36 4667 4698 4715 N
+ UW Z K e n/a 36 4667 4698 4715 N
+ UW Z K i n/a 36 4667 4698 4715 N
+ UW Z K s n/a 36 4667 4698 4715 N
+ UW Z L b n/a 36 4664 4709 4737 N
+ UW Z L e n/a 36 4664 4709 4729 N
+ UW Z L i n/a 36 4665 4709 4737 N
+ UW Z L s n/a 36 4664 4709 4737 N
+ UW Z M b n/a 36 4668 4697 4728 N
+ UW Z M e n/a 36 4668 4697 4728 N
+ UW Z M i n/a 36 4668 4697 4728 N
+ UW Z M s n/a 36 4668 4697 4728 N
+ UW Z N b n/a 36 4667 4692 4725 N
+ UW Z N e n/a 36 4667 4692 4725 N
+ UW Z N i n/a 36 4667 4692 4725 N
+ UW Z N s n/a 36 4667 4692 4725 N
+ UW Z NG b n/a 36 4667 4697 4728 N
+ UW Z NG e n/a 36 4667 4697 4728 N
+ UW Z NG s n/a 36 4667 4697 4728 N
+ UW Z OW e n/a 36 4664 4710 4739 N
+ UW Z OW i n/a 36 4665 4710 4739 N
+ UW Z OW s n/a 36 4664 4710 4739 N
+ UW Z OY e n/a 36 4664 4710 4739 N
+ UW Z OY s n/a 36 4664 4710 4739 N
+ UW Z P b n/a 36 4668 4698 4715 N
+ UW Z P e n/a 36 4668 4698 4715 N
+ UW Z P i n/a 36 4668 4698 4715 N
+ UW Z P s n/a 36 4668 4698 4715 N
+ UW Z R e n/a 36 4664 4709 4729 N
+ UW Z R i n/a 36 4665 4709 4738 N
+ UW Z R s n/a 36 4664 4709 4738 N
+ UW Z S b n/a 36 4667 4689 4722 N
+ UW Z S e n/a 36 4667 4689 4722 N
+ UW Z S i n/a 36 4667 4689 4722 N
+ UW Z S s n/a 36 4667 4689 4722 N
+ UW Z SH e n/a 36 4667 4702 4735 N
+ UW Z SH i n/a 36 4667 4702 4735 N
+ UW Z SH s n/a 36 4667 4702 4735 N
+ UW Z SIL e n/a 36 4667 4703 4733 N
+ UW Z SIL s n/a 36 4667 4703 4733 N
+ UW Z T b n/a 36 4667 4691 4717 N
+ UW Z T e n/a 36 4667 4691 4717 N
+ UW Z T i n/a 36 4667 4691 4716 N
+ UW Z T s n/a 36 4667 4691 4717 N
+ UW Z TH e n/a 36 4667 4691 4722 N
+ UW Z TH i n/a 36 4667 4691 4721 N
+ UW Z TH s n/a 36 4667 4691 4722 N
+ UW Z UH e n/a 36 4664 4710 4739 N
+ UW Z UH s n/a 36 4664 4710 4739 N
+ UW Z UW b n/a 36 4664 4710 4739 N
+ UW Z UW e n/a 36 4664 4710 4739 N
+ UW Z UW s n/a 36 4664 4710 4739 N
+ UW Z V b n/a 36 4668 4698 4729 N
+ UW Z V e n/a 36 4668 4698 4729 N
+ UW Z V i n/a 36 4668 4698 4727 N
+ UW Z V s n/a 36 4668 4698 4729 N
+ UW Z W b n/a 36 4664 4709 4739 N
+ UW Z W e n/a 36 4664 4709 4732 N
+ UW Z W s n/a 36 4664 4709 4739 N
+ UW Z Y b n/a 36 4664 4702 4745 N
+ UW Z Y e n/a 36 4664 4702 4736 N
+ UW Z Y i n/a 36 4665 4702 4745 N
+ UW Z Y s n/a 36 4664 4702 4745 N
+ UW Z Z b n/a 36 4667 4689 4723 N
+ UW Z Z e n/a 36 4667 4689 4723 N
+ UW Z Z i n/a 36 4667 4689 4723 N
+ UW Z Z s n/a 36 4667 4689 4723 N
+ UW Z ZH e n/a 36 4667 4702 4735 N
+ UW Z ZH s n/a 36 4667 4702 4735 N
+ UW ZH AA e n/a 36 4664 4710 4739 N
+ UW ZH AA s n/a 36 4664 4710 4739 N
+ UW ZH AE e n/a 36 4664 4710 4743 N
+ UW ZH AE s n/a 36 4664 4710 4743 N
+ UW ZH AH b n/a 36 4664 4710 4740 N
+ UW ZH AH e n/a 36 4664 4710 4740 N
+ UW ZH AH i n/a 36 4665 4710 4742 N
+ UW ZH AH s n/a 36 4664 4710 4740 N
+ UW ZH AO e n/a 36 4664 4710 4739 N
+ UW ZH AO s n/a 36 4664 4710 4739 N
+ UW ZH AW e n/a 36 4664 4710 4743 N
+ UW ZH AW s n/a 36 4664 4710 4743 N
+ UW ZH AY e n/a 36 4664 4710 4739 N
+ UW ZH AY s n/a 36 4664 4710 4739 N
+ UW ZH B b n/a 36 4668 4698 4715 N
+ UW ZH B e n/a 36 4668 4698 4715 N
+ UW ZH B s n/a 36 4668 4698 4715 N
+ UW ZH CH b n/a 36 4667 4702 4717 N
+ UW ZH CH e n/a 36 4667 4702 4717 N
+ UW ZH CH s n/a 36 4667 4702 4717 N
+ UW ZH D b n/a 36 4667 4688 4717 N
+ UW ZH D e n/a 36 4667 4688 4717 N
+ UW ZH D s n/a 36 4667 4688 4717 N
+ UW ZH DH e n/a 36 4667 4688 4719 N
+ UW ZH DH s n/a 36 4667 4688 4719 N
+ UW ZH EH e n/a 36 4664 4710 4744 N
+ UW ZH EH s n/a 36 4664 4710 4744 N
+ UW ZH ER b n/a 36 4664 4710 4739 N
+ UW ZH ER e n/a 36 4664 4710 4739 N
+ UW ZH ER s n/a 36 4664 4710 4739 N
+ UW ZH EY b n/a 36 4664 4710 4744 N
+ UW ZH EY e n/a 36 4664 4710 4744 N
+ UW ZH EY s n/a 36 4664 4710 4744 N
+ UW ZH F b n/a 36 4668 4698 4734 N
+ UW ZH F e n/a 36 4668 4698 4734 N
+ UW ZH F s n/a 36 4668 4698 4734 N
+ UW ZH G b n/a 36 4667 4698 4715 N
+ UW ZH G e n/a 36 4667 4698 4715 N
+ UW ZH G s n/a 36 4667 4698 4715 N
+ UW ZH HH e n/a 36 4667 4697 4731 N
+ UW ZH HH i n/a 36 4667 4697 4731 N
+ UW ZH HH s n/a 36 4667 4697 4731 N
+ UW ZH IH b n/a 36 4664 4710 4745 N
+ UW ZH IH e n/a 36 4664 4710 4745 N
+ UW ZH IH i n/a 36 4665 4710 4745 N
+ UW ZH IH s n/a 36 4664 4710 4745 N
+ UW ZH IY b n/a 36 4664 4710 4745 N
+ UW ZH IY e n/a 36 4664 4710 4745 N
+ UW ZH IY s n/a 36 4664 4710 4745 N
+ UW ZH JH e n/a 36 4667 4702 4717 N
+ UW ZH JH s n/a 36 4667 4702 4717 N
+ UW ZH K b n/a 36 4667 4698 4715 N
+ UW ZH K e n/a 36 4667 4698 4715 N
+ UW ZH K i n/a 36 4667 4698 4715 N
+ UW ZH K s n/a 36 4667 4698 4715 N
+ UW ZH L b n/a 36 4664 4709 4740 N
+ UW ZH L e n/a 36 4664 4709 4729 N
+ UW ZH L s n/a 36 4664 4709 4740 N
+ UW ZH M b n/a 36 4668 4697 4728 N
+ UW ZH M e n/a 36 4668 4697 4728 N
+ UW ZH M s n/a 36 4668 4697 4728 N
+ UW ZH N b n/a 36 4667 4688 4725 N
+ UW ZH N e n/a 36 4667 4688 4725 N
+ UW ZH N s n/a 36 4667 4688 4725 N
+ UW ZH NG b n/a 36 4667 4697 4728 N
+ UW ZH NG e n/a 36 4667 4697 4728 N
+ UW ZH NG s n/a 36 4667 4697 4728 N
+ UW ZH OW e n/a 36 4664 4710 4739 N
+ UW ZH OW s n/a 36 4664 4710 4739 N
+ UW ZH OY e n/a 36 4664 4710 4739 N
+ UW ZH OY s n/a 36 4664 4710 4739 N
+ UW ZH P b n/a 36 4668 4698 4715 N
+ UW ZH P e n/a 36 4668 4698 4715 N
+ UW ZH P s n/a 36 4668 4698 4715 N
+ UW ZH R e n/a 36 4664 4709 4729 N
+ UW ZH R s n/a 36 4664 4709 4740 N
+ UW ZH S b n/a 36 4667 4688 4722 N
+ UW ZH S e n/a 36 4667 4688 4722 N
+ UW ZH S i n/a 36 4667 4688 4722 N
+ UW ZH S s n/a 36 4667 4688 4722 N
+ UW ZH SH e n/a 36 4667 4702 4735 N
+ UW ZH SH s n/a 36 4667 4702 4735 N
+ UW ZH SIL e n/a 36 4667 4703 4733 N
+ UW ZH SIL s n/a 36 4667 4703 4733 N
+ UW ZH T b n/a 36 4667 4688 4717 N
+ UW ZH T e n/a 36 4667 4688 4717 N
+ UW ZH T s n/a 36 4667 4688 4717 N
+ UW ZH TH e n/a 36 4667 4688 4722 N
+ UW ZH TH s n/a 36 4667 4688 4722 N
+ UW ZH UH e n/a 36 4664 4710 4739 N
+ UW ZH UH s n/a 36 4664 4710 4739 N
+ UW ZH UW b n/a 36 4664 4710 4739 N
+ UW ZH UW e n/a 36 4664 4710 4739 N
+ UW ZH UW s n/a 36 4664 4710 4739 N
+ UW ZH V b n/a 36 4668 4698 4728 N
+ UW ZH V e n/a 36 4668 4698 4728 N
+ UW ZH V s n/a 36 4668 4698 4728 N
+ UW ZH W b n/a 36 4664 4709 4739 N
+ UW ZH W e n/a 36 4664 4709 4732 N
+ UW ZH W s n/a 36 4664 4709 4739 N
+ UW ZH Y b n/a 36 4664 4702 4745 N
+ UW ZH Y e n/a 36 4664 4702 4736 N
+ UW ZH Y s n/a 36 4664 4702 4745 N
+ UW ZH Z b n/a 36 4667 4688 4723 N
+ UW ZH Z e n/a 36 4667 4688 4723 N
+ UW ZH Z s n/a 36 4667 4688 4723 N
+ UW ZH ZH e n/a 36 4667 4702 4735 N
+ UW ZH ZH s n/a 36 4667 4702 4735 N
+ V AA AA b n/a 37 4753 4773 4796 N
+ V AA AA e n/a 37 4753 4773 4796 N
+ V AA AA i n/a 37 4753 4773 4796 N
+ V AA AA s n/a 37 4753 4773 4796 N
+ V AA AE b n/a 37 4753 4772 4803 N
+ V AA AE e n/a 37 4753 4772 4804 N
+ V AA AE s n/a 37 4753 4772 4803 N
+ V AA AH b n/a 37 4753 4771 4798 N
+ V AA AH e n/a 37 4753 4771 4798 N
+ V AA AH i n/a 37 4753 4771 4811 N
+ V AA AH s n/a 37 4753 4771 4798 N
+ V AA AO b n/a 37 4753 4773 4797 N
+ V AA AO e n/a 37 4753 4773 4797 N
+ V AA AO i n/a 37 4753 4773 4797 N
+ V AA AO s n/a 37 4753 4773 4797 N
+ V AA AW b n/a 37 4753 4772 4803 N
+ V AA AW e n/a 37 4753 4772 4804 N
+ V AA AW i n/a 37 4753 4772 4803 N
+ V AA AW s n/a 37 4753 4772 4803 N
+ V AA AY b n/a 37 4753 4773 4796 N
+ V AA AY e n/a 37 4753 4773 4796 N
+ V AA AY i n/a 37 4753 4773 4796 N
+ V AA AY s n/a 37 4753 4773 4796 N
+ V AA B e n/a 37 4753 4786 4824 N
+ V AA B s n/a 37 4753 4786 4817 N
+ V AA CH b n/a 37 4753 4786 4821 N
+ V AA CH e n/a 37 4753 4786 4821 N
+ V AA CH i n/a 37 4753 4786 4821 N
+ V AA CH s n/a 37 4753 4786 4821 N
+ V AA D b n/a 37 4753 4786 4817 N
+ V AA D e n/a 37 4753 4786 4824 N
+ V AA D i n/a 37 4753 4786 4817 N
+ V AA D s n/a 37 4753 4786 4817 N
+ V AA DH e n/a 37 4753 4794 4824 N
+ V AA DH s n/a 37 4753 4794 4818 N
+ V AA EH b n/a 37 4753 4772 4802 N
+ V AA EH e n/a 37 4753 4772 4804 N
+ V AA EH i n/a 37 4753 4772 4803 N
+ V AA EH s n/a 37 4753 4772 4802 N
+ V AA ER b n/a 37 4753 4778 4801 N
+ V AA ER e n/a 37 4753 4778 4801 N
+ V AA ER i n/a 37 4753 4778 4801 N
+ V AA ER s n/a 37 4753 4778 4801 N
+ V AA EY b n/a 37 4753 4772 4802 N
+ V AA EY e n/a 37 4753 4772 4804 N
+ V AA EY i n/a 37 4753 4772 4805 N
+ V AA EY s n/a 37 4753 4772 4802 N
+ V AA F e n/a 37 4753 4786 4819 N
+ V AA F s n/a 37 4753 4786 4819 N
+ V AA G e n/a 37 4753 4786 4824 N
+ V AA G i n/a 37 4753 4786 4817 N
+ V AA G s n/a 37 4753 4786 4817 N
+ V AA HH e n/a 37 4753 4786 4821 N
+ V AA HH s n/a 37 4753 4786 4821 N
+ V AA IH b n/a 37 4753 4772 4806 N
+ V AA IH e n/a 37 4753 4772 4807 N
+ V AA IH i n/a 37 4753 4772 4809 N
+ V AA IH s n/a 37 4753 4772 4806 N
+ V AA IY b n/a 37 4753 4772 4810 N
+ V AA IY e n/a 37 4753 4772 4810 N
+ V AA IY i n/a 37 4753 4772 4810 N
+ V AA IY s n/a 37 4753 4772 4810 N
+ V AA JH e n/a 37 4753 4786 4824 N
+ V AA JH s n/a 37 4753 4786 4817 N
+ V AA K b n/a 37 4753 4786 4815 N
+ V AA K e n/a 37 4753 4786 4815 N
+ V AA K i n/a 37 4753 4786 4815 N
+ V AA K s n/a 37 4753 4786 4815 N
+ V AA L b n/a 37 4753 4795 4828 N
+ V AA L e n/a 37 4753 4795 4828 N
+ V AA L i n/a 37 4753 4795 4828 N
+ V AA L s n/a 37 4753 4795 4828 N
+ V AA M e n/a 37 4753 4786 4825 N
+ V AA M s n/a 37 4753 4786 4825 N
+ V AA N e n/a 37 4753 4786 4825 N
+ V AA N i n/a 37 4753 4786 4825 N
+ V AA N s n/a 37 4753 4786 4825 N
+ V AA NG e n/a 37 4753 4786 4825 N
+ V AA NG s n/a 37 4753 4786 4825 N
+ V AA OW b n/a 37 4753 4773 4797 N
+ V AA OW e n/a 37 4753 4773 4797 N
+ V AA OW i n/a 37 4753 4773 4797 N
+ V AA OW s n/a 37 4753 4773 4797 N
+ V AA OY b n/a 37 4753 4773 4797 N
+ V AA OY e n/a 37 4753 4773 4797 N
+ V AA OY i n/a 37 4753 4773 4797 N
+ V AA OY s n/a 37 4753 4773 4797 N
+ V AA P b n/a 37 4753 4786 4815 N
+ V AA P e n/a 37 4753 4786 4815 N
+ V AA P s n/a 37 4753 4786 4815 N
+ V AA R b n/a 37 4753 4778 4827 N
+ V AA R e n/a 37 4753 4778 4829 N
+ V AA R i n/a 37 4753 4778 4827 N
+ V AA R s n/a 37 4753 4778 4827 N
+ V AA S b n/a 37 4753 4786 4819 N
+ V AA S e n/a 37 4753 4786 4819 N
+ V AA S i n/a 37 4753 4786 4819 N
+ V AA S s n/a 37 4753 4786 4819 N
+ V AA SH e n/a 37 4753 4786 4819 N
+ V AA SH i n/a 37 4753 4786 4819 N
+ V AA SH s n/a 37 4753 4786 4819 N
+ V AA SIL e n/a 37 4753 4786 4815 N
+ V AA SIL s n/a 37 4753 4786 4815 N
+ V AA T b n/a 37 4753 4786 4815 N
+ V AA T e n/a 37 4753 4786 4815 N
+ V AA T s n/a 37 4753 4786 4815 N
+ V AA TH e n/a 37 4753 4786 4821 N
+ V AA TH s n/a 37 4753 4786 4821 N
+ V AA UH b n/a 37 4753 4773 4798 N
+ V AA UH e n/a 37 4753 4773 4798 N
+ V AA UH s n/a 37 4753 4773 4798 N
+ V AA UW b n/a 37 4753 4773 4797 N
+ V AA UW e n/a 37 4753 4773 4797 N
+ V AA UW i n/a 37 4753 4773 4797 N
+ V AA UW s n/a 37 4753 4773 4797 N
+ V AA V e n/a 37 4753 4786 4824 N
+ V AA V s n/a 37 4753 4786 4818 N
+ V AA W b n/a 37 4753 4795 4828 N
+ V AA W e n/a 37 4753 4795 4828 N
+ V AA W i n/a 37 4753 4795 4828 N
+ V AA W s n/a 37 4753 4795 4828 N
+ V AA Y b n/a 37 4753 4786 4826 N
+ V AA Y e n/a 37 4753 4786 4826 N
+ V AA Y s n/a 37 4753 4786 4826 N
+ V AA Z b n/a 37 4753 4786 4818 N
+ V AA Z e n/a 37 4753 4786 4824 N
+ V AA Z i n/a 37 4753 4786 4818 N
+ V AA Z s n/a 37 4753 4786 4818 N
+ V AA ZH e n/a 37 4753 4786 4824 N
+ V AA ZH s n/a 37 4753 4786 4818 N
+ V AE AA b n/a 37 4759 4770 4796 N
+ V AE AA e n/a 37 4759 4770 4796 N
+ V AE AA i n/a 37 4759 4770 4796 N
+ V AE AA s n/a 37 4759 4770 4796 N
+ V AE AE b n/a 37 4759 4770 4803 N
+ V AE AE e n/a 37 4759 4770 4804 N
+ V AE AE s n/a 37 4759 4770 4803 N
+ V AE AH b n/a 37 4759 4770 4798 N
+ V AE AH e n/a 37 4759 4770 4798 N
+ V AE AH i n/a 37 4759 4770 4811 N
+ V AE AH s n/a 37 4759 4770 4798 N
+ V AE AO b n/a 37 4759 4770 4797 N
+ V AE AO e n/a 37 4759 4770 4797 N
+ V AE AO i n/a 37 4759 4770 4797 N
+ V AE AO s n/a 37 4759 4770 4797 N
+ V AE AW b n/a 37 4759 4770 4803 N
+ V AE AW e n/a 37 4759 4770 4804 N
+ V AE AW i n/a 37 4759 4770 4803 N
+ V AE AW s n/a 37 4759 4770 4803 N
+ V AE AY b n/a 37 4759 4770 4796 N
+ V AE AY e n/a 37 4759 4770 4796 N
+ V AE AY s n/a 37 4759 4770 4796 N
+ V AE B e n/a 37 4760 4794 4824 N
+ V AE B s n/a 37 4760 4794 4817 N
+ V AE CH b n/a 37 4760 4789 4821 N
+ V AE CH e n/a 37 4760 4789 4821 N
+ V AE CH s n/a 37 4760 4789 4821 N
+ V AE D b n/a 37 4760 4794 4817 N
+ V AE D e n/a 37 4760 4794 4824 N
+ V AE D i n/a 37 4760 4794 4817 N
+ V AE D s n/a 37 4760 4794 4817 N
+ V AE DH e n/a 37 4759 4794 4824 N
+ V AE DH s n/a 37 4759 4794 4818 N
+ V AE EH b n/a 37 4759 4770 4802 N
+ V AE EH e n/a 37 4759 4770 4804 N
+ V AE EH i n/a 37 4759 4770 4803 N
+ V AE EH s n/a 37 4759 4770 4802 N
+ V AE ER b n/a 37 4761 4767 4799 N
+ V AE ER e n/a 37 4761 4767 4799 N
+ V AE ER i n/a 37 4761 4767 4799 N
+ V AE ER s n/a 37 4761 4767 4799 N
+ V AE EY b n/a 37 4759 4770 4802 N
+ V AE EY e n/a 37 4759 4770 4804 N
+ V AE EY i n/a 37 4759 4770 4805 N
+ V AE EY s n/a 37 4759 4770 4802 N
+ V AE F e n/a 37 4760 4789 4819 N
+ V AE F s n/a 37 4760 4789 4819 N
+ V AE G e n/a 37 4760 4794 4824 N
+ V AE G i n/a 37 4760 4794 4817 N
+ V AE G s n/a 37 4760 4794 4817 N
+ V AE HH e n/a 37 4760 4789 4821 N
+ V AE HH s n/a 37 4760 4789 4821 N
+ V AE IH b n/a 37 4759 4770 4806 N
+ V AE IH e n/a 37 4759 4770 4807 N
+ V AE IH i n/a 37 4759 4770 4809 N
+ V AE IH s n/a 37 4759 4770 4806 N
+ V AE IY b n/a 37 4760 4770 4810 N
+ V AE IY e n/a 37 4760 4770 4810 N
+ V AE IY i n/a 37 4760 4770 4810 N
+ V AE IY s n/a 37 4760 4770 4810 N
+ V AE JH e n/a 37 4760 4794 4824 N
+ V AE JH s n/a 37 4760 4794 4817 N
+ V AE K b n/a 37 4760 4789 4815 N
+ V AE K e n/a 37 4760 4789 4815 N
+ V AE K i n/a 37 4760 4789 4815 N
+ V AE K s n/a 37 4760 4789 4815 N
+ V AE L b n/a 37 4759 4795 4828 N
+ V AE L e n/a 37 4759 4795 4828 N
+ V AE L i n/a 37 4759 4795 4828 N
+ V AE L s n/a 37 4759 4795 4828 N
+ V AE M e n/a 37 4759 4794 4825 N
+ V AE M i n/a 37 4759 4794 4825 N
+ V AE M s n/a 37 4759 4794 4825 N
+ V AE N e n/a 37 4759 4794 4825 N
+ V AE N i n/a 37 4759 4794 4825 N
+ V AE N s n/a 37 4759 4794 4825 N
+ V AE NG e n/a 37 4759 4794 4825 N
+ V AE NG s n/a 37 4759 4794 4825 N
+ V AE OW b n/a 37 4759 4770 4797 N
+ V AE OW e n/a 37 4759 4770 4797 N
+ V AE OW i n/a 37 4759 4770 4797 N
+ V AE OW s n/a 37 4759 4770 4797 N
+ V AE OY b n/a 37 4759 4770 4797 N
+ V AE OY e n/a 37 4759 4770 4797 N
+ V AE OY s n/a 37 4759 4770 4797 N
+ V AE P b n/a 37 4760 4789 4815 N
+ V AE P e n/a 37 4760 4789 4815 N
+ V AE P s n/a 37 4760 4789 4815 N
+ V AE R b n/a 37 4761 4767 4827 N
+ V AE R e n/a 37 4761 4767 4829 N
+ V AE R i n/a 37 4761 4767 4827 N
+ V AE R s n/a 37 4761 4767 4827 N
+ V AE S b n/a 37 4760 4788 4819 N
+ V AE S e n/a 37 4760 4788 4819 N
+ V AE S i n/a 37 4760 4788 4819 N
+ V AE S s n/a 37 4760 4788 4819 N
+ V AE SH e n/a 37 4760 4788 4819 N
+ V AE SH s n/a 37 4760 4788 4819 N
+ V AE SIL e n/a 37 4760 4789 4815 N
+ V AE SIL s n/a 37 4760 4789 4815 N
+ V AE T b n/a 37 4760 4789 4815 N
+ V AE T e n/a 37 4760 4789 4815 N
+ V AE T i n/a 37 4760 4789 4815 N
+ V AE T s n/a 37 4760 4789 4815 N
+ V AE TH e n/a 37 4760 4789 4821 N
+ V AE TH s n/a 37 4760 4789 4821 N
+ V AE UH b n/a 37 4759 4770 4798 N
+ V AE UH e n/a 37 4759 4770 4798 N
+ V AE UH s n/a 37 4759 4770 4798 N
+ V AE UW b n/a 37 4760 4770 4797 N
+ V AE UW e n/a 37 4760 4770 4797 N
+ V AE UW s n/a 37 4760 4770 4797 N
+ V AE V e n/a 37 4759 4794 4824 N
+ V AE V s n/a 37 4759 4794 4818 N
+ V AE W b n/a 37 4759 4795 4828 N
+ V AE W e n/a 37 4759 4795 4828 N
+ V AE W s n/a 37 4759 4795 4828 N
+ V AE Y b n/a 37 4760 4793 4826 N
+ V AE Y e n/a 37 4760 4793 4826 N
+ V AE Y i n/a 37 4760 4793 4826 N
+ V AE Y s n/a 37 4760 4793 4826 N
+ V AE Z b n/a 37 4759 4794 4818 N
+ V AE Z e n/a 37 4759 4794 4824 N
+ V AE Z i n/a 37 4759 4794 4818 N
+ V AE Z s n/a 37 4759 4794 4818 N
+ V AE ZH e n/a 37 4759 4794 4824 N
+ V AE ZH s n/a 37 4759 4794 4818 N
+ V AH AA b n/a 37 4753 4773 4796 N
+ V AH AA e n/a 37 4753 4773 4796 N
+ V AH AA i n/a 37 4753 4773 4796 N
+ V AH AA s n/a 37 4753 4773 4796 N
+ V AH AE b n/a 37 4750 4776 4803 N
+ V AH AE e n/a 37 4750 4771 4804 N
+ V AH AE i n/a 37 4750 4775 4803 N
+ V AH AE s n/a 37 4750 4775 4803 N
+ V AH AH b n/a 37 4750 4776 4798 N
+ V AH AH e n/a 37 4749 4771 4798 N
+ V AH AH i n/a 37 4750 4775 4811 N
+ V AH AH s n/a 37 4750 4775 4798 N
+ V AH AO b n/a 37 4753 4773 4797 N
+ V AH AO e n/a 37 4753 4773 4797 N
+ V AH AO i n/a 37 4753 4773 4797 N
+ V AH AO s n/a 37 4753 4773 4797 N
+ V AH AW b n/a 37 4750 4776 4803 N
+ V AH AW e n/a 37 4750 4771 4804 N
+ V AH AW i n/a 37 4750 4775 4803 N
+ V AH AW s n/a 37 4750 4775 4803 N
+ V AH AY b n/a 37 4753 4773 4796 N
+ V AH AY e n/a 37 4753 4773 4796 N
+ V AH AY i n/a 37 4753 4773 4796 N
+ V AH AY s n/a 37 4753 4773 4796 N
+ V AH B e n/a 37 4748 4792 4824 N
+ V AH B i n/a 37 4748 4791 4817 N
+ V AH B s n/a 37 4748 4792 4817 N
+ V AH CH b n/a 37 4746 4787 4821 N
+ V AH CH e n/a 37 4746 4787 4821 N
+ V AH CH s n/a 37 4746 4787 4821 N
+ V AH D b n/a 37 4748 4792 4817 N
+ V AH D e n/a 37 4748 4792 4824 N
+ V AH D i n/a 37 4749 4791 4817 N
+ V AH D s n/a 37 4748 4792 4817 N
+ V AH DH e n/a 37 4747 4791 4822 N
+ V AH DH s n/a 37 4747 4791 4818 N
+ V AH EH b n/a 37 4750 4776 4802 N
+ V AH EH e n/a 37 4750 4771 4804 N
+ V AH EH i n/a 37 4750 4775 4803 N
+ V AH EH s n/a 37 4750 4775 4802 N
+ V AH ER b n/a 37 4752 4768 4800 N
+ V AH ER e n/a 37 4752 4768 4800 N
+ V AH ER i n/a 37 4752 4768 4799 N
+ V AH ER s n/a 37 4752 4768 4800 N
+ V AH EY b n/a 37 4750 4776 4802 N
+ V AH EY e n/a 37 4750 4771 4804 N
+ V AH EY i n/a 37 4750 4775 4805 N
+ V AH EY s n/a 37 4750 4775 4802 N
+ V AH F e n/a 37 4746 4787 4819 N
+ V AH F s n/a 37 4746 4787 4819 N
+ V AH G e n/a 37 4748 4792 4824 N
+ V AH G i n/a 37 4748 4791 4817 N
+ V AH G s n/a 37 4748 4792 4817 N
+ V AH HH e n/a 37 4746 4788 4821 N
+ V AH HH s n/a 37 4746 4788 4821 N
+ V AH IH b n/a 37 4750 4776 4806 N
+ V AH IH e n/a 37 4750 4775 4807 N
+ V AH IH i n/a 37 4750 4774 4809 N
+ V AH IH s n/a 37 4750 4775 4806 N
+ V AH IY b n/a 37 4750 4776 4810 N
+ V AH IY e n/a 37 4750 4775 4810 N
+ V AH IY i n/a 37 4750 4774 4810 N
+ V AH IY s n/a 37 4750 4775 4810 N
+ V AH JH e n/a 37 4748 4792 4824 N
+ V AH JH i n/a 37 4748 4791 4817 N
+ V AH JH s n/a 37 4748 4792 4817 N
+ V AH K b n/a 37 4746 4787 4813 N
+ V AH K e n/a 37 4746 4787 4813 N
+ V AH K i n/a 37 4746 4787 4813 N
+ V AH K s n/a 37 4746 4787 4813 N
+ V AH L b n/a 37 4753 4795 4828 N
+ V AH L e n/a 37 4753 4795 4828 N
+ V AH L i n/a 37 4753 4795 4828 N
+ V AH L s n/a 37 4753 4795 4828 N
+ V AH M e n/a 37 4748 4792 4825 N
+ V AH M i n/a 37 4748 4792 4825 N
+ V AH M s n/a 37 4748 4792 4825 N
+ V AH N e n/a 37 4748 4792 4825 N
+ V AH N s n/a 37 4748 4792 4825 N
+ V AH NG e n/a 37 4748 4792 4825 N
+ V AH NG s n/a 37 4748 4792 4825 N
+ V AH OW b n/a 37 4753 4773 4797 N
+ V AH OW e n/a 37 4753 4773 4797 N
+ V AH OW i n/a 37 4753 4773 4797 N
+ V AH OW s n/a 37 4753 4773 4797 N
+ V AH OY b n/a 37 4753 4773 4797 N
+ V AH OY e n/a 37 4753 4773 4797 N
+ V AH OY i n/a 37 4753 4773 4797 N
+ V AH OY s n/a 37 4753 4773 4797 N
+ V AH P b n/a 37 4746 4787 4813 N
+ V AH P e n/a 37 4746 4787 4813 N
+ V AH P i n/a 37 4746 4787 4813 N
+ V AH P s n/a 37 4746 4787 4813 N
+ V AH R b n/a 37 4752 4768 4827 N
+ V AH R e n/a 37 4752 4768 4829 N
+ V AH R i n/a 37 4752 4768 4827 N
+ V AH R s n/a 37 4752 4768 4827 N
+ V AH S b n/a 37 4746 4788 4819 N
+ V AH S e n/a 37 4746 4788 4819 N
+ V AH S i n/a 37 4746 4788 4819 N
+ V AH S s n/a 37 4746 4788 4819 N
+ V AH SH e n/a 37 4746 4788 4819 N
+ V AH SH s n/a 37 4746 4788 4819 N
+ V AH SIL e n/a 37 4749 4787 4814 N
+ V AH SIL s n/a 37 4749 4787 4814 N
+ V AH T b n/a 37 4746 4787 4813 N
+ V AH T e n/a 37 4746 4787 4813 N
+ V AH T i n/a 37 4746 4787 4813 N
+ V AH T s n/a 37 4746 4787 4813 N
+ V AH TH e n/a 37 4746 4787 4821 N
+ V AH TH s n/a 37 4746 4787 4821 N
+ V AH UH b n/a 37 4753 4773 4798 N
+ V AH UH e n/a 37 4753 4773 4798 N
+ V AH UH i n/a 37 4753 4773 4798 N
+ V AH UH s n/a 37 4753 4773 4798 N
+ V AH UW b n/a 37 4753 4773 4797 N
+ V AH UW e n/a 37 4753 4773 4797 N
+ V AH UW i n/a 37 4753 4773 4797 N
+ V AH UW s n/a 37 4753 4773 4797 N
+ V AH V e n/a 37 4748 4791 4824 N
+ V AH V s n/a 37 4748 4791 4818 N
+ V AH W b n/a 37 4753 4795 4828 N
+ V AH W e n/a 37 4753 4795 4828 N
+ V AH W i n/a 37 4753 4795 4828 N
+ V AH W s n/a 37 4753 4795 4828 N
+ V AH Y b n/a 37 4750 4793 4826 N
+ V AH Y e n/a 37 4750 4793 4826 N
+ V AH Y i n/a 37 4750 4793 4826 N
+ V AH Y s n/a 37 4750 4793 4826 N
+ V AH Z b n/a 37 4747 4791 4818 N
+ V AH Z e n/a 37 4747 4791 4824 N
+ V AH Z i n/a 37 4747 4791 4818 N
+ V AH Z s n/a 37 4747 4791 4818 N
+ V AH ZH e n/a 37 4748 4791 4824 N
+ V AH ZH s n/a 37 4748 4791 4818 N
+ V AO AA b n/a 37 4753 4773 4796 N
+ V AO AA e n/a 37 4753 4773 4796 N
+ V AO AA s n/a 37 4753 4773 4796 N
+ V AO AE b n/a 37 4753 4772 4803 N
+ V AO AE e n/a 37 4753 4772 4804 N
+ V AO AE s n/a 37 4753 4772 4803 N
+ V AO AH b n/a 37 4753 4771 4798 N
+ V AO AH e n/a 37 4753 4771 4798 N
+ V AO AH i n/a 37 4753 4771 4811 N
+ V AO AH s n/a 37 4753 4771 4798 N
+ V AO AO b n/a 37 4753 4773 4797 N
+ V AO AO e n/a 37 4753 4773 4797 N
+ V AO AO s n/a 37 4753 4773 4797 N
+ V AO AW b n/a 37 4753 4772 4803 N
+ V AO AW e n/a 37 4753 4772 4804 N
+ V AO AW s n/a 37 4753 4772 4803 N
+ V AO AY b n/a 37 4753 4773 4796 N
+ V AO AY e n/a 37 4753 4773 4796 N
+ V AO AY s n/a 37 4753 4773 4796 N
+ V AO B e n/a 37 4753 4786 4824 N
+ V AO B s n/a 37 4753 4786 4817 N
+ V AO CH b n/a 37 4753 4786 4821 N
+ V AO CH e n/a 37 4753 4786 4821 N
+ V AO CH s n/a 37 4753 4786 4821 N
+ V AO D b n/a 37 4753 4786 4817 N
+ V AO D e n/a 37 4753 4786 4824 N
+ V AO D s n/a 37 4753 4786 4817 N
+ V AO DH e n/a 37 4753 4794 4824 N
+ V AO DH s n/a 37 4753 4794 4818 N
+ V AO EH b n/a 37 4753 4772 4802 N
+ V AO EH e n/a 37 4753 4772 4804 N
+ V AO EH s n/a 37 4753 4772 4802 N
+ V AO ER b n/a 37 4753 4778 4801 N
+ V AO ER e n/a 37 4753 4778 4801 N
+ V AO ER i n/a 37 4753 4778 4801 N
+ V AO ER s n/a 37 4753 4778 4801 N
+ V AO EY b n/a 37 4753 4772 4802 N
+ V AO EY e n/a 37 4753 4772 4804 N
+ V AO EY s n/a 37 4753 4772 4802 N
+ V AO F e n/a 37 4753 4786 4819 N
+ V AO F s n/a 37 4753 4786 4819 N
+ V AO G e n/a 37 4753 4786 4824 N
+ V AO G s n/a 37 4753 4786 4817 N
+ V AO HH e n/a 37 4753 4786 4821 N
+ V AO HH i n/a 37 4753 4786 4821 N
+ V AO HH s n/a 37 4753 4786 4821 N
+ V AO IH b n/a 37 4753 4772 4806 N
+ V AO IH e n/a 37 4753 4772 4807 N
+ V AO IH i n/a 37 4753 4772 4809 N
+ V AO IH s n/a 37 4753 4772 4806 N
+ V AO IY b n/a 37 4753 4772 4810 N
+ V AO IY e n/a 37 4753 4772 4810 N
+ V AO IY s n/a 37 4753 4772 4810 N
+ V AO JH e n/a 37 4753 4786 4824 N
+ V AO JH s n/a 37 4753 4786 4817 N
+ V AO K b n/a 37 4753 4786 4815 N
+ V AO K e n/a 37 4753 4786 4815 N
+ V AO K s n/a 37 4753 4786 4815 N
+ V AO L b n/a 37 4753 4795 4828 N
+ V AO L e n/a 37 4753 4795 4828 N
+ V AO L i n/a 37 4753 4795 4828 N
+ V AO L s n/a 37 4753 4795 4828 N
+ V AO M e n/a 37 4753 4786 4825 N
+ V AO M s n/a 37 4753 4786 4825 N
+ V AO N e n/a 37 4753 4786 4825 N
+ V AO N i n/a 37 4753 4786 4825 N
+ V AO N s n/a 37 4753 4786 4825 N
+ V AO NG e n/a 37 4753 4786 4825 N
+ V AO NG s n/a 37 4753 4786 4825 N
+ V AO OW b n/a 37 4753 4773 4797 N
+ V AO OW e n/a 37 4753 4773 4797 N
+ V AO OW i n/a 37 4753 4773 4797 N
+ V AO OW s n/a 37 4753 4773 4797 N
+ V AO OY b n/a 37 4753 4773 4797 N
+ V AO OY e n/a 37 4753 4773 4797 N
+ V AO OY s n/a 37 4753 4773 4797 N
+ V AO P b n/a 37 4753 4786 4815 N
+ V AO P e n/a 37 4753 4786 4815 N
+ V AO P s n/a 37 4753 4786 4815 N
+ V AO R b n/a 37 4753 4778 4827 N
+ V AO R e n/a 37 4753 4778 4829 N
+ V AO R s n/a 37 4753 4778 4827 N
+ V AO S b n/a 37 4753 4786 4819 N
+ V AO S e n/a 37 4753 4786 4819 N
+ V AO S i n/a 37 4753 4786 4819 N
+ V AO S s n/a 37 4753 4786 4819 N
+ V AO SH e n/a 37 4753 4786 4819 N
+ V AO SH s n/a 37 4753 4786 4819 N
+ V AO SIL e n/a 37 4753 4786 4815 N
+ V AO SIL s n/a 37 4753 4786 4815 N
+ V AO T b n/a 37 4753 4786 4815 N
+ V AO T e n/a 37 4753 4786 4815 N
+ V AO T s n/a 37 4753 4786 4815 N
+ V AO TH e n/a 37 4753 4786 4821 N
+ V AO TH s n/a 37 4753 4786 4821 N
+ V AO UH b n/a 37 4753 4773 4798 N
+ V AO UH e n/a 37 4753 4773 4798 N
+ V AO UH s n/a 37 4753 4773 4798 N
+ V AO UW b n/a 37 4753 4773 4797 N
+ V AO UW e n/a 37 4753 4773 4797 N
+ V AO UW s n/a 37 4753 4773 4797 N
+ V AO V e n/a 37 4753 4786 4824 N
+ V AO V s n/a 37 4753 4786 4818 N
+ V AO W b n/a 37 4753 4795 4828 N
+ V AO W e n/a 37 4753 4795 4828 N
+ V AO W s n/a 37 4753 4795 4828 N
+ V AO Y b n/a 37 4753 4786 4826 N
+ V AO Y e n/a 37 4753 4786 4826 N
+ V AO Y s n/a 37 4753 4786 4826 N
+ V AO Z b n/a 37 4753 4786 4818 N
+ V AO Z e n/a 37 4753 4786 4824 N
+ V AO Z i n/a 37 4753 4786 4818 N
+ V AO Z s n/a 37 4753 4786 4818 N
+ V AO ZH e n/a 37 4753 4786 4824 N
+ V AO ZH s n/a 37 4753 4786 4818 N
+ V AW AA b n/a 37 4756 4773 4796 N
+ V AW AA s n/a 37 4756 4773 4796 N
+ V AW AE b n/a 37 4756 4772 4803 N
+ V AW AE s n/a 37 4756 4772 4803 N
+ V AW AH b n/a 37 4756 4771 4798 N
+ V AW AH s n/a 37 4756 4771 4798 N
+ V AW AO b n/a 37 4756 4773 4797 N
+ V AW AO s n/a 37 4756 4773 4797 N
+ V AW AW b n/a 37 4756 4772 4803 N
+ V AW AW s n/a 37 4756 4772 4803 N
+ V AW AY b n/a 37 4756 4773 4796 N
+ V AW AY s n/a 37 4756 4773 4796 N
+ V AW B s n/a 37 4756 4786 4817 N
+ V AW CH b n/a 37 4756 4786 4821 N
+ V AW CH s n/a 37 4756 4786 4821 N
+ V AW D b n/a 37 4756 4786 4817 N
+ V AW D s n/a 37 4756 4786 4817 N
+ V AW DH s n/a 37 4756 4792 4818 N
+ V AW EH b n/a 37 4756 4772 4802 N
+ V AW EH s n/a 37 4756 4772 4802 N
+ V AW ER b n/a 37 4754 4778 4801 N
+ V AW ER i n/a 37 4754 4778 4801 N
+ V AW ER s n/a 37 4754 4778 4801 N
+ V AW EY b n/a 37 4756 4772 4802 N
+ V AW EY s n/a 37 4756 4772 4802 N
+ V AW F s n/a 37 4756 4786 4819 N
+ V AW G s n/a 37 4756 4786 4817 N
+ V AW HH s n/a 37 4756 4786 4821 N
+ V AW IH b n/a 37 4756 4772 4806 N
+ V AW IH i n/a 37 4756 4772 4809 N
+ V AW IH s n/a 37 4756 4772 4806 N
+ V AW IY b n/a 37 4756 4772 4810 N
+ V AW IY i n/a 37 4756 4772 4810 N
+ V AW IY s n/a 37 4756 4772 4810 N
+ V AW JH s n/a 37 4756 4786 4817 N
+ V AW K b n/a 37 4756 4786 4815 N
+ V AW K s n/a 37 4756 4786 4815 N
+ V AW L b n/a 37 4756 4795 4828 N
+ V AW L s n/a 37 4756 4795 4828 N
+ V AW M s n/a 37 4756 4786 4825 N
+ V AW N s n/a 37 4756 4786 4825 N
+ V AW NG s n/a 37 4756 4786 4825 N
+ V AW OW b n/a 37 4756 4773 4797 N
+ V AW OW s n/a 37 4756 4773 4797 N
+ V AW OY b n/a 37 4756 4773 4797 N
+ V AW OY s n/a 37 4756 4773 4797 N
+ V AW P b n/a 37 4756 4786 4815 N
+ V AW P s n/a 37 4756 4786 4815 N
+ V AW R b n/a 37 4754 4778 4827 N
+ V AW R s n/a 37 4754 4778 4827 N
+ V AW S b n/a 37 4756 4786 4819 N
+ V AW S s n/a 37 4756 4786 4819 N
+ V AW SH s n/a 37 4756 4786 4819 N
+ V AW SIL s n/a 37 4756 4786 4815 N
+ V AW T b n/a 37 4756 4786 4815 N
+ V AW T s n/a 37 4756 4786 4815 N
+ V AW TH s n/a 37 4756 4786 4821 N
+ V AW UH b n/a 37 4756 4773 4798 N
+ V AW UH s n/a 37 4756 4773 4798 N
+ V AW UW b n/a 37 4756 4773 4797 N
+ V AW UW s n/a 37 4756 4773 4797 N
+ V AW V s n/a 37 4756 4786 4818 N
+ V AW W b n/a 37 4756 4795 4828 N
+ V AW W s n/a 37 4756 4795 4828 N
+ V AW Y b n/a 37 4756 4786 4826 N
+ V AW Y s n/a 37 4756 4786 4826 N
+ V AW Z b n/a 37 4756 4786 4818 N
+ V AW Z s n/a 37 4756 4786 4818 N
+ V AW ZH s n/a 37 4756 4786 4818 N
+ V AY AA b n/a 37 4764 4773 4796 N
+ V AY AA e n/a 37 4764 4773 4796 N
+ V AY AA s n/a 37 4764 4773 4796 N
+ V AY AE b n/a 37 4764 4782 4803 N
+ V AY AE e n/a 37 4764 4782 4804 N
+ V AY AE i n/a 37 4764 4782 4803 N
+ V AY AE s n/a 37 4764 4782 4803 N
+ V AY AH b n/a 37 4764 4782 4798 N
+ V AY AH e n/a 37 4764 4782 4798 N
+ V AY AH i n/a 37 4764 4782 4812 N
+ V AY AH s n/a 37 4764 4782 4798 N
+ V AY AO b n/a 37 4764 4773 4797 N
+ V AY AO e n/a 37 4764 4773 4797 N
+ V AY AO i n/a 37 4764 4773 4797 N
+ V AY AO s n/a 37 4764 4773 4797 N
+ V AY AW b n/a 37 4764 4782 4803 N
+ V AY AW e n/a 37 4764 4782 4804 N
+ V AY AW s n/a 37 4764 4782 4803 N
+ V AY AY b n/a 37 4764 4773 4796 N
+ V AY AY e n/a 37 4764 4773 4796 N
+ V AY AY s n/a 37 4764 4773 4796 N
+ V AY B e n/a 37 4764 4783 4824 N
+ V AY B i n/a 37 4764 4783 4817 N
+ V AY B s n/a 37 4764 4783 4817 N
+ V AY CH b n/a 37 4764 4783 4821 N
+ V AY CH e n/a 37 4764 4783 4821 N
+ V AY CH s n/a 37 4764 4783 4821 N
+ V AY D b n/a 37 4764 4783 4817 N
+ V AY D e n/a 37 4764 4783 4824 N
+ V AY D i n/a 37 4764 4783 4817 N
+ V AY D s n/a 37 4764 4783 4817 N
+ V AY DH e n/a 37 4764 4783 4824 N
+ V AY DH s n/a 37 4764 4783 4818 N
+ V AY EH b n/a 37 4764 4782 4802 N
+ V AY EH e n/a 37 4764 4782 4804 N
+ V AY EH i n/a 37 4764 4782 4803 N
+ V AY EH s n/a 37 4764 4782 4802 N
+ V AY ER b n/a 37 4764 4767 4799 N
+ V AY ER e n/a 37 4764 4767 4799 N
+ V AY ER i n/a 37 4764 4767 4799 N
+ V AY ER s n/a 37 4764 4767 4799 N
+ V AY EY b n/a 37 4764 4782 4802 N
+ V AY EY e n/a 37 4764 4782 4804 N
+ V AY EY i n/a 37 4764 4782 4805 N
+ V AY EY s n/a 37 4764 4782 4802 N
+ V AY F e n/a 37 4764 4783 4819 N
+ V AY F i n/a 37 4764 4783 4819 N
+ V AY F s n/a 37 4764 4783 4819 N
+ V AY G e n/a 37 4764 4783 4824 N
+ V AY G i n/a 37 4764 4783 4817 N
+ V AY G s n/a 37 4764 4783 4817 N
+ V AY HH e n/a 37 4764 4783 4821 N
+ V AY HH s n/a 37 4764 4783 4821 N
+ V AY IH b n/a 37 4764 4782 4806 N
+ V AY IH e n/a 37 4764 4782 4807 N
+ V AY IH i n/a 37 4764 4782 4809 N
+ V AY IH s n/a 37 4764 4782 4806 N
+ V AY IY b n/a 37 4764 4782 4810 N
+ V AY IY e n/a 37 4764 4782 4810 N
+ V AY IY i n/a 37 4764 4782 4810 N
+ V AY IY s n/a 37 4764 4782 4810 N
+ V AY JH e n/a 37 4764 4783 4824 N
+ V AY JH s n/a 37 4764 4783 4817 N
+ V AY K b n/a 37 4764 4783 4815 N
+ V AY K e n/a 37 4764 4783 4815 N
+ V AY K i n/a 37 4764 4783 4815 N
+ V AY K s n/a 37 4764 4783 4815 N
+ V AY L b n/a 37 4764 4783 4828 N
+ V AY L e n/a 37 4764 4783 4828 N
+ V AY L i n/a 37 4764 4783 4828 N
+ V AY L s n/a 37 4764 4783 4828 N
+ V AY M e n/a 37 4764 4783 4825 N
+ V AY M s n/a 37 4764 4783 4825 N
+ V AY N e n/a 37 4764 4783 4825 N
+ V AY N s n/a 37 4764 4783 4825 N
+ V AY NG e n/a 37 4764 4783 4825 N
+ V AY NG s n/a 37 4764 4783 4825 N
+ V AY OW b n/a 37 4764 4773 4797 N
+ V AY OW e n/a 37 4764 4773 4797 N
+ V AY OW i n/a 37 4764 4773 4797 N
+ V AY OW s n/a 37 4764 4773 4797 N
+ V AY OY b n/a 37 4764 4773 4797 N
+ V AY OY e n/a 37 4764 4773 4797 N
+ V AY OY s n/a 37 4764 4773 4797 N
+ V AY P b n/a 37 4764 4783 4815 N
+ V AY P e n/a 37 4764 4783 4815 N
+ V AY P i n/a 37 4764 4783 4815 N
+ V AY P s n/a 37 4764 4783 4815 N
+ V AY R b n/a 37 4764 4783 4827 N
+ V AY R e n/a 37 4764 4783 4829 N
+ V AY R i n/a 37 4764 4783 4827 N
+ V AY R s n/a 37 4764 4783 4827 N
+ V AY S b n/a 37 4764 4783 4819 N
+ V AY S e n/a 37 4764 4783 4819 N
+ V AY S i n/a 37 4764 4783 4819 N
+ V AY S s n/a 37 4764 4783 4819 N
+ V AY SH e n/a 37 4764 4783 4819 N
+ V AY SH s n/a 37 4764 4783 4819 N
+ V AY SIL e n/a 37 4764 4783 4815 N
+ V AY SIL s n/a 37 4764 4783 4815 N
+ V AY T b n/a 37 4764 4783 4815 N
+ V AY T e n/a 37 4764 4783 4815 N
+ V AY T i n/a 37 4764 4783 4815 N
+ V AY T s n/a 37 4764 4783 4815 N
+ V AY TH e n/a 37 4764 4783 4821 N
+ V AY TH i n/a 37 4764 4783 4821 N
+ V AY TH s n/a 37 4764 4783 4821 N
+ V AY UH b n/a 37 4764 4773 4798 N
+ V AY UH e n/a 37 4764 4773 4798 N
+ V AY UH s n/a 37 4764 4773 4798 N
+ V AY UW b n/a 37 4764 4773 4797 N
+ V AY UW e n/a 37 4764 4773 4797 N
+ V AY UW s n/a 37 4764 4773 4797 N
+ V AY V e n/a 37 4764 4783 4824 N
+ V AY V s n/a 37 4764 4783 4818 N
+ V AY W b n/a 37 4764 4783 4828 N
+ V AY W e n/a 37 4764 4783 4828 N
+ V AY W i n/a 37 4764 4783 4828 N
+ V AY W s n/a 37 4764 4783 4828 N
+ V AY Y b n/a 37 4764 4783 4826 N
+ V AY Y e n/a 37 4764 4783 4826 N
+ V AY Y i n/a 37 4764 4783 4826 N
+ V AY Y s n/a 37 4764 4783 4826 N
+ V AY Z b n/a 37 4764 4783 4818 N
+ V AY Z e n/a 37 4764 4783 4824 N
+ V AY Z i n/a 37 4764 4783 4818 N
+ V AY Z s n/a 37 4764 4783 4818 N
+ V AY ZH e n/a 37 4764 4783 4824 N
+ V AY ZH s n/a 37 4764 4783 4818 N
+ V B AA b n/a 37 4757 4780 4796 N
+ V B AA i n/a 37 4757 4780 4796 N
+ V B AA s n/a 37 4757 4780 4796 N
+ V B AE b n/a 37 4757 4779 4803 N
+ V B AE s n/a 37 4757 4779 4803 N
+ V B AH b n/a 37 4757 4779 4798 N
+ V B AH s n/a 37 4757 4779 4798 N
+ V B AO b n/a 37 4757 4780 4797 N
+ V B AO s n/a 37 4757 4780 4797 N
+ V B AW b n/a 37 4757 4779 4803 N
+ V B AW s n/a 37 4757 4779 4803 N
+ V B AY b n/a 37 4757 4780 4796 N
+ V B AY s n/a 37 4757 4780 4796 N
+ V B B s n/a 37 4757 4786 4817 N
+ V B CH b n/a 37 4757 4786 4821 N
+ V B CH s n/a 37 4757 4786 4821 N
+ V B D b n/a 37 4757 4786 4817 N
+ V B D s n/a 37 4757 4786 4817 N
+ V B DH s n/a 37 4757 4792 4818 N
+ V B EH b n/a 37 4757 4779 4802 N
+ V B EH s n/a 37 4757 4779 4802 N
+ V B ER b n/a 37 4757 4780 4800 N
+ V B ER i n/a 37 4757 4780 4800 N
+ V B ER s n/a 37 4757 4780 4800 N
+ V B EY b n/a 37 4757 4779 4802 N
+ V B EY s n/a 37 4757 4779 4802 N
+ V B F s n/a 37 4757 4786 4819 N
+ V B G s n/a 37 4757 4786 4817 N
+ V B HH s n/a 37 4757 4786 4821 N
+ V B IH b n/a 37 4757 4779 4806 N
+ V B IH i n/a 37 4757 4779 4806 N
+ V B IH s n/a 37 4757 4779 4806 N
+ V B IY b n/a 37 4757 4779 4810 N
+ V B IY i n/a 37 4757 4779 4810 N
+ V B IY s n/a 37 4757 4779 4810 N
+ V B JH s n/a 37 4757 4786 4817 N
+ V B K b n/a 37 4757 4786 4813 N
+ V B K s n/a 37 4757 4786 4813 N
+ V B L b n/a 37 4757 4795 4828 N
+ V B L s n/a 37 4757 4795 4828 N
+ V B M s n/a 37 4757 4786 4825 N
+ V B N s n/a 37 4757 4786 4825 N
+ V B NG s n/a 37 4757 4786 4825 N
+ V B OW b n/a 37 4757 4780 4797 N
+ V B OW s n/a 37 4757 4780 4797 N
+ V B OY b n/a 37 4757 4780 4797 N
+ V B OY s n/a 37 4757 4780 4797 N
+ V B P b n/a 37 4757 4786 4813 N
+ V B P s n/a 37 4757 4786 4813 N
+ V B R b n/a 37 4757 4780 4827 N
+ V B R s n/a 37 4757 4780 4827 N
+ V B S b n/a 37 4757 4786 4819 N
+ V B S s n/a 37 4757 4786 4819 N
+ V B SH s n/a 37 4757 4786 4819 N
+ V B SIL s n/a 37 4757 4786 4816 N
+ V B T b n/a 37 4757 4786 4813 N
+ V B T s n/a 37 4757 4786 4813 N
+ V B TH s n/a 37 4757 4786 4821 N
+ V B UH b n/a 37 4757 4780 4798 N
+ V B UH s n/a 37 4757 4780 4798 N
+ V B UW b n/a 37 4757 4780 4797 N
+ V B UW s n/a 37 4757 4780 4797 N
+ V B V s n/a 37 4757 4786 4818 N
+ V B W b n/a 37 4757 4795 4828 N
+ V B W s n/a 37 4757 4795 4828 N
+ V B Y b n/a 37 4757 4786 4826 N
+ V B Y s n/a 37 4757 4786 4826 N
+ V B Z b n/a 37 4757 4786 4818 N
+ V B Z s n/a 37 4757 4786 4818 N
+ V B ZH s n/a 37 4757 4786 4818 N
+ V CH AA b n/a 37 4757 4780 4796 N
+ V CH AA s n/a 37 4757 4780 4796 N
+ V CH AE b n/a 37 4757 4779 4803 N
+ V CH AE s n/a 37 4757 4779 4803 N
+ V CH AH b n/a 37 4757 4779 4798 N
+ V CH AH s n/a 37 4757 4779 4798 N
+ V CH AO b n/a 37 4757 4780 4797 N
+ V CH AO s n/a 37 4757 4780 4797 N
+ V CH AW b n/a 37 4757 4779 4803 N
+ V CH AW s n/a 37 4757 4779 4803 N
+ V CH AY b n/a 37 4757 4780 4796 N
+ V CH AY s n/a 37 4757 4780 4796 N
+ V CH B s n/a 37 4757 4786 4817 N
+ V CH CH b n/a 37 4757 4786 4821 N
+ V CH CH s n/a 37 4757 4786 4821 N
+ V CH D b n/a 37 4757 4786 4817 N
+ V CH D s n/a 37 4757 4786 4817 N
+ V CH DH s n/a 37 4757 4792 4818 N
+ V CH EH b n/a 37 4757 4779 4802 N
+ V CH EH s n/a 37 4757 4779 4802 N
+ V CH ER b n/a 37 4757 4780 4800 N
+ V CH ER s n/a 37 4757 4780 4800 N
+ V CH EY b n/a 37 4757 4779 4802 N
+ V CH EY s n/a 37 4757 4779 4802 N
+ V CH F s n/a 37 4757 4786 4819 N
+ V CH G s n/a 37 4757 4786 4817 N
+ V CH HH s n/a 37 4757 4786 4821 N
+ V CH IH b n/a 37 4757 4779 4806 N
+ V CH IH s n/a 37 4757 4779 4806 N
+ V CH IY b n/a 37 4757 4779 4810 N
+ V CH IY s n/a 37 4757 4779 4810 N
+ V CH JH s n/a 37 4757 4786 4817 N
+ V CH K b n/a 37 4757 4786 4813 N
+ V CH K s n/a 37 4757 4786 4813 N
+ V CH L b n/a 37 4757 4795 4828 N
+ V CH L s n/a 37 4757 4795 4828 N
+ V CH M s n/a 37 4757 4786 4825 N
+ V CH N s n/a 37 4757 4786 4825 N
+ V CH NG s n/a 37 4757 4786 4825 N
+ V CH OW b n/a 37 4757 4780 4797 N
+ V CH OW s n/a 37 4757 4780 4797 N
+ V CH OY b n/a 37 4757 4780 4797 N
+ V CH OY s n/a 37 4757 4780 4797 N
+ V CH P b n/a 37 4757 4786 4813 N
+ V CH P s n/a 37 4757 4786 4813 N
+ V CH R b n/a 37 4757 4780 4827 N
+ V CH R s n/a 37 4757 4780 4827 N
+ V CH S b n/a 37 4757 4786 4819 N
+ V CH S s n/a 37 4757 4786 4819 N
+ V CH SH s n/a 37 4757 4786 4819 N
+ V CH SIL s n/a 37 4757 4786 4816 N
+ V CH T b n/a 37 4757 4786 4813 N
+ V CH T s n/a 37 4757 4786 4813 N
+ V CH TH s n/a 37 4757 4786 4821 N
+ V CH UH b n/a 37 4757 4780 4798 N
+ V CH UH s n/a 37 4757 4780 4798 N
+ V CH UW b n/a 37 4757 4780 4797 N
+ V CH UW s n/a 37 4757 4780 4797 N
+ V CH V s n/a 37 4757 4786 4818 N
+ V CH W b n/a 37 4757 4795 4828 N
+ V CH W s n/a 37 4757 4795 4828 N
+ V CH Y b n/a 37 4757 4786 4826 N
+ V CH Y s n/a 37 4757 4786 4826 N
+ V CH Z b n/a 37 4757 4786 4818 N
+ V CH Z s n/a 37 4757 4786 4818 N
+ V CH ZH s n/a 37 4757 4786 4818 N
+ V D AA b n/a 37 4757 4780 4796 N
+ V D AA i n/a 37 4757 4780 4796 N
+ V D AA s n/a 37 4757 4780 4796 N
+ V D AE b n/a 37 4757 4779 4803 N
+ V D AE i n/a 37 4757 4779 4803 N
+ V D AE s n/a 37 4757 4779 4803 N
+ V D AH b n/a 37 4757 4779 4798 N
+ V D AH i n/a 37 4757 4779 4812 N
+ V D AH s n/a 37 4757 4779 4798 N
+ V D AO b n/a 37 4757 4780 4797 N
+ V D AO i n/a 37 4757 4780 4797 N
+ V D AO s n/a 37 4757 4780 4797 N
+ V D AW b n/a 37 4757 4779 4803 N
+ V D AW s n/a 37 4757 4779 4803 N
+ V D AY b n/a 37 4757 4780 4796 N
+ V D AY i n/a 37 4757 4780 4796 N
+ V D AY s n/a 37 4757 4780 4796 N
+ V D B s n/a 37 4757 4786 4817 N
+ V D CH b n/a 37 4757 4786 4821 N
+ V D CH s n/a 37 4757 4786 4821 N
+ V D D b n/a 37 4757 4786 4817 N
+ V D D s n/a 37 4757 4786 4817 N
+ V D DH s n/a 37 4757 4792 4818 N
+ V D EH b n/a 37 4757 4779 4802 N
+ V D EH i n/a 37 4757 4779 4803 N
+ V D EH s n/a 37 4757 4779 4802 N
+ V D ER b n/a 37 4757 4780 4800 N
+ V D ER i n/a 37 4757 4780 4800 N
+ V D ER s n/a 37 4757 4780 4800 N
+ V D EY b n/a 37 4757 4779 4802 N
+ V D EY s n/a 37 4757 4779 4802 N
+ V D F s n/a 37 4757 4786 4819 N
+ V D G s n/a 37 4757 4786 4817 N
+ V D HH s n/a 37 4757 4786 4821 N
+ V D IH b n/a 37 4757 4779 4806 N
+ V D IH i n/a 37 4757 4779 4806 N
+ V D IH s n/a 37 4757 4779 4806 N
+ V D IY b n/a 37 4757 4779 4810 N
+ V D IY i n/a 37 4757 4779 4810 N
+ V D IY s n/a 37 4757 4779 4810 N
+ V D JH s n/a 37 4757 4786 4817 N
+ V D K b n/a 37 4757 4786 4813 N
+ V D K s n/a 37 4757 4786 4813 N
+ V D L b n/a 37 4757 4795 4828 N
+ V D L s n/a 37 4757 4795 4828 N
+ V D M s n/a 37 4757 4786 4825 N
+ V D N s n/a 37 4757 4786 4825 N
+ V D NG s n/a 37 4757 4786 4825 N
+ V D OW b n/a 37 4757 4780 4797 N
+ V D OW i n/a 37 4757 4780 4797 N
+ V D OW s n/a 37 4757 4780 4797 N
+ V D OY b n/a 37 4757 4780 4797 N
+ V D OY s n/a 37 4757 4780 4797 N
+ V D P b n/a 37 4757 4786 4813 N
+ V D P s n/a 37 4757 4786 4813 N
+ V D R b n/a 37 4757 4780 4827 N
+ V D R i n/a 37 4757 4780 4827 N
+ V D R s n/a 37 4757 4780 4827 N
+ V D S b n/a 37 4757 4786 4819 N
+ V D S s n/a 37 4757 4786 4819 N
+ V D SH s n/a 37 4757 4786 4819 N
+ V D SIL s n/a 37 4757 4786 4816 N
+ V D T b n/a 37 4757 4786 4813 N
+ V D T s n/a 37 4757 4786 4813 N
+ V D TH s n/a 37 4757 4786 4821 N
+ V D UH b n/a 37 4757 4780 4798 N
+ V D UH s n/a 37 4757 4780 4798 N
+ V D UW b n/a 37 4757 4780 4797 N
+ V D UW s n/a 37 4757 4780 4797 N
+ V D V s n/a 37 4757 4786 4818 N
+ V D W b n/a 37 4757 4795 4828 N
+ V D W s n/a 37 4757 4795 4828 N
+ V D Y b n/a 37 4757 4786 4826 N
+ V D Y i n/a 37 4757 4786 4826 N
+ V D Y s n/a 37 4757 4786 4826 N
+ V D Z b n/a 37 4757 4786 4818 N
+ V D Z s n/a 37 4757 4786 4818 N
+ V D ZH s n/a 37 4757 4786 4818 N
+ V DH AA b n/a 37 4757 4780 4796 N
+ V DH AA s n/a 37 4757 4780 4796 N
+ V DH AE b n/a 37 4757 4779 4803 N
+ V DH AE s n/a 37 4757 4779 4803 N
+ V DH AH b n/a 37 4757 4779 4798 N
+ V DH AH s n/a 37 4757 4779 4798 N
+ V DH AO b n/a 37 4757 4780 4797 N
+ V DH AO s n/a 37 4757 4780 4797 N
+ V DH AW b n/a 37 4757 4779 4803 N
+ V DH AW s n/a 37 4757 4779 4803 N
+ V DH AY b n/a 37 4757 4780 4796 N
+ V DH AY s n/a 37 4757 4780 4796 N
+ V DH B s n/a 37 4757 4786 4817 N
+ V DH CH b n/a 37 4757 4786 4821 N
+ V DH CH s n/a 37 4757 4786 4821 N
+ V DH D b n/a 37 4757 4786 4817 N
+ V DH D s n/a 37 4757 4786 4817 N
+ V DH DH s n/a 37 4757 4792 4818 N
+ V DH EH b n/a 37 4757 4779 4802 N
+ V DH EH s n/a 37 4757 4779 4802 N
+ V DH ER b n/a 37 4757 4780 4800 N
+ V DH ER s n/a 37 4757 4780 4800 N
+ V DH EY b n/a 37 4757 4779 4802 N
+ V DH EY s n/a 37 4757 4779 4802 N
+ V DH F s n/a 37 4757 4786 4819 N
+ V DH G s n/a 37 4757 4786 4817 N
+ V DH HH s n/a 37 4757 4786 4821 N
+ V DH IH b n/a 37 4757 4779 4806 N
+ V DH IH s n/a 37 4757 4779 4806 N
+ V DH IY b n/a 37 4757 4779 4810 N
+ V DH IY s n/a 37 4757 4779 4810 N
+ V DH JH s n/a 37 4757 4786 4817 N
+ V DH K b n/a 37 4757 4786 4813 N
+ V DH K s n/a 37 4757 4786 4813 N
+ V DH L b n/a 37 4757 4795 4828 N
+ V DH L s n/a 37 4757 4795 4828 N
+ V DH M s n/a 37 4757 4786 4825 N
+ V DH N s n/a 37 4757 4786 4825 N
+ V DH NG s n/a 37 4757 4786 4825 N
+ V DH OW b n/a 37 4757 4780 4797 N
+ V DH OW s n/a 37 4757 4780 4797 N
+ V DH OY b n/a 37 4757 4780 4797 N
+ V DH OY s n/a 37 4757 4780 4797 N
+ V DH P b n/a 37 4757 4786 4813 N
+ V DH P s n/a 37 4757 4786 4813 N
+ V DH R b n/a 37 4757 4780 4827 N
+ V DH R s n/a 37 4757 4780 4827 N
+ V DH S b n/a 37 4757 4786 4819 N
+ V DH S s n/a 37 4757 4786 4819 N
+ V DH SH s n/a 37 4757 4786 4819 N
+ V DH SIL s n/a 37 4757 4786 4816 N
+ V DH T b n/a 37 4757 4786 4813 N
+ V DH T s n/a 37 4757 4786 4813 N
+ V DH TH s n/a 37 4757 4786 4821 N
+ V DH UH b n/a 37 4757 4780 4798 N
+ V DH UH s n/a 37 4757 4780 4798 N
+ V DH UW b n/a 37 4757 4780 4797 N
+ V DH UW s n/a 37 4757 4780 4797 N
+ V DH V s n/a 37 4757 4786 4818 N
+ V DH W b n/a 37 4757 4795 4828 N
+ V DH W s n/a 37 4757 4795 4828 N
+ V DH Y b n/a 37 4757 4786 4826 N
+ V DH Y s n/a 37 4757 4786 4826 N
+ V DH Z b n/a 37 4757 4786 4818 N
+ V DH Z s n/a 37 4757 4786 4818 N
+ V DH ZH s n/a 37 4757 4786 4818 N
+ V EH AA b n/a 37 4759 4770 4796 N
+ V EH AA e n/a 37 4759 4770 4796 N
+ V EH AA i n/a 37 4759 4770 4796 N
+ V EH AA s n/a 37 4759 4770 4796 N
+ V EH AE b n/a 37 4759 4770 4803 N
+ V EH AE e n/a 37 4759 4770 4804 N
+ V EH AE i n/a 37 4759 4770 4803 N
+ V EH AE s n/a 37 4759 4770 4803 N
+ V EH AH b n/a 37 4759 4770 4798 N
+ V EH AH e n/a 37 4759 4770 4798 N
+ V EH AH i n/a 37 4759 4770 4811 N
+ V EH AH s n/a 37 4759 4770 4798 N
+ V EH AO b n/a 37 4759 4770 4797 N
+ V EH AO e n/a 37 4759 4770 4797 N
+ V EH AO i n/a 37 4759 4770 4797 N
+ V EH AO s n/a 37 4759 4770 4797 N
+ V EH AW b n/a 37 4759 4770 4803 N
+ V EH AW e n/a 37 4759 4770 4804 N
+ V EH AW s n/a 37 4759 4770 4803 N
+ V EH AY b n/a 37 4759 4770 4796 N
+ V EH AY e n/a 37 4759 4770 4796 N
+ V EH AY i n/a 37 4759 4770 4796 N
+ V EH AY s n/a 37 4759 4770 4796 N
+ V EH B e n/a 37 4760 4792 4824 N
+ V EH B s n/a 37 4760 4792 4817 N
+ V EH CH b n/a 37 4760 4788 4821 N
+ V EH CH e n/a 37 4760 4788 4821 N
+ V EH CH i n/a 37 4760 4788 4821 N
+ V EH CH s n/a 37 4760 4788 4821 N
+ V EH D b n/a 37 4760 4792 4817 N
+ V EH D e n/a 37 4760 4792 4824 N
+ V EH D i n/a 37 4760 4791 4817 N
+ V EH D s n/a 37 4760 4792 4817 N
+ V EH DH e n/a 37 4759 4791 4822 N
+ V EH DH s n/a 37 4759 4791 4818 N
+ V EH EH b n/a 37 4759 4770 4802 N
+ V EH EH e n/a 37 4759 4770 4804 N
+ V EH EH i n/a 37 4759 4770 4803 N
+ V EH EH s n/a 37 4759 4770 4802 N
+ V EH ER b n/a 37 4761 4767 4799 N
+ V EH ER e n/a 37 4761 4767 4799 N
+ V EH ER i n/a 37 4761 4767 4799 N
+ V EH ER s n/a 37 4761 4767 4799 N
+ V EH EY b n/a 37 4759 4770 4802 N
+ V EH EY e n/a 37 4759 4770 4804 N
+ V EH EY i n/a 37 4759 4770 4805 N
+ V EH EY s n/a 37 4759 4770 4802 N
+ V EH F e n/a 37 4760 4788 4819 N
+ V EH F s n/a 37 4760 4788 4819 N
+ V EH G e n/a 37 4760 4792 4824 N
+ V EH G i n/a 37 4760 4791 4817 N
+ V EH G s n/a 37 4760 4792 4817 N
+ V EH HH e n/a 37 4760 4788 4821 N
+ V EH HH s n/a 37 4760 4788 4821 N
+ V EH IH b n/a 37 4759 4770 4806 N
+ V EH IH e n/a 37 4759 4770 4807 N
+ V EH IH i n/a 37 4759 4770 4809 N
+ V EH IH s n/a 37 4759 4770 4806 N
+ V EH IY b n/a 37 4760 4770 4810 N
+ V EH IY e n/a 37 4760 4770 4810 N
+ V EH IY i n/a 37 4760 4770 4810 N
+ V EH IY s n/a 37 4760 4770 4810 N
+ V EH JH e n/a 37 4760 4792 4824 N
+ V EH JH i n/a 37 4760 4791 4817 N
+ V EH JH s n/a 37 4760 4792 4817 N
+ V EH K b n/a 37 4760 4788 4813 N
+ V EH K e n/a 37 4760 4788 4813 N
+ V EH K i n/a 37 4760 4788 4813 N
+ V EH K s n/a 37 4760 4788 4813 N
+ V EH L b n/a 37 4759 4795 4828 N
+ V EH L e n/a 37 4759 4795 4828 N
+ V EH L i n/a 37 4759 4795 4828 N
+ V EH L s n/a 37 4759 4795 4828 N
+ V EH M e n/a 37 4759 4792 4825 N
+ V EH M i n/a 37 4759 4792 4825 N
+ V EH M s n/a 37 4759 4792 4825 N
+ V EH N e n/a 37 4759 4792 4825 N
+ V EH N i n/a 37 4759 4792 4825 N
+ V EH N s n/a 37 4759 4792 4825 N
+ V EH NG e n/a 37 4759 4792 4825 N
+ V EH NG s n/a 37 4759 4792 4825 N
+ V EH OW b n/a 37 4759 4770 4797 N
+ V EH OW e n/a 37 4759 4770 4797 N
+ V EH OW i n/a 37 4759 4770 4797 N
+ V EH OW s n/a 37 4759 4770 4797 N
+ V EH OY b n/a 37 4759 4770 4797 N
+ V EH OY e n/a 37 4759 4770 4797 N
+ V EH OY i n/a 37 4759 4770 4797 N
+ V EH OY s n/a 37 4759 4770 4797 N
+ V EH P b n/a 37 4760 4788 4813 N
+ V EH P e n/a 37 4760 4788 4813 N
+ V EH P s n/a 37 4760 4788 4813 N
+ V EH R b n/a 37 4761 4767 4827 N
+ V EH R e n/a 37 4761 4767 4829 N
+ V EH R i n/a 37 4761 4767 4827 N
+ V EH R s n/a 37 4761 4767 4827 N
+ V EH S b n/a 37 4760 4788 4819 N
+ V EH S e n/a 37 4760 4788 4819 N
+ V EH S i n/a 37 4760 4788 4819 N
+ V EH S s n/a 37 4760 4788 4819 N
+ V EH SH e n/a 37 4760 4788 4819 N
+ V EH SH s n/a 37 4760 4788 4819 N
+ V EH SIL e n/a 37 4760 4788 4814 N
+ V EH SIL s n/a 37 4760 4788 4814 N
+ V EH T b n/a 37 4760 4788 4813 N
+ V EH T e n/a 37 4760 4788 4813 N
+ V EH T i n/a 37 4760 4788 4813 N
+ V EH T s n/a 37 4760 4788 4813 N
+ V EH TH e n/a 37 4760 4788 4821 N
+ V EH TH s n/a 37 4760 4788 4821 N
+ V EH UH b n/a 37 4759 4770 4798 N
+ V EH UH e n/a 37 4759 4770 4798 N
+ V EH UH i n/a 37 4759 4770 4798 N
+ V EH UH s n/a 37 4759 4770 4798 N
+ V EH UW b n/a 37 4760 4770 4797 N
+ V EH UW e n/a 37 4760 4770 4797 N
+ V EH UW i n/a 37 4760 4770 4797 N
+ V EH UW s n/a 37 4760 4770 4797 N
+ V EH V e n/a 37 4759 4791 4824 N
+ V EH V s n/a 37 4759 4791 4818 N
+ V EH W b n/a 37 4759 4795 4828 N
+ V EH W e n/a 37 4759 4795 4828 N
+ V EH W i n/a 37 4759 4795 4828 N
+ V EH W s n/a 37 4759 4795 4828 N
+ V EH Y b n/a 37 4760 4793 4826 N
+ V EH Y e n/a 37 4760 4793 4826 N
+ V EH Y i n/a 37 4760 4793 4826 N
+ V EH Y s n/a 37 4760 4793 4826 N
+ V EH Z b n/a 37 4759 4791 4818 N
+ V EH Z e n/a 37 4759 4791 4824 N
+ V EH Z i n/a 37 4759 4791 4818 N
+ V EH Z s n/a 37 4759 4791 4818 N
+ V EH ZH e n/a 37 4759 4791 4824 N
+ V EH ZH s n/a 37 4759 4791 4818 N
+ V ER AA b n/a 37 4751 4773 4796 N
+ V ER AA e n/a 37 4751 4773 4796 N
+ V ER AA i n/a 37 4751 4773 4796 N
+ V ER AA s n/a 37 4751 4773 4796 N
+ V ER AE b n/a 37 4751 4777 4803 N
+ V ER AE e n/a 37 4751 4777 4804 N
+ V ER AE i n/a 37 4751 4777 4803 N
+ V ER AE s n/a 37 4751 4777 4803 N
+ V ER AH b n/a 37 4751 4777 4798 N
+ V ER AH e n/a 37 4751 4777 4798 N
+ V ER AH i n/a 37 4751 4777 4812 N
+ V ER AH s n/a 37 4751 4777 4798 N
+ V ER AO b n/a 37 4751 4773 4797 N
+ V ER AO e n/a 37 4751 4773 4797 N
+ V ER AO i n/a 37 4751 4773 4797 N
+ V ER AO s n/a 37 4751 4773 4797 N
+ V ER AW b n/a 37 4751 4777 4803 N
+ V ER AW e n/a 37 4751 4777 4804 N
+ V ER AW i n/a 37 4751 4777 4803 N
+ V ER AW s n/a 37 4751 4777 4803 N
+ V ER AY b n/a 37 4751 4773 4796 N
+ V ER AY e n/a 37 4751 4773 4796 N
+ V ER AY i n/a 37 4751 4773 4796 N
+ V ER AY s n/a 37 4751 4773 4796 N
+ V ER B e n/a 37 4751 4790 4824 N
+ V ER B s n/a 37 4751 4790 4817 N
+ V ER CH b n/a 37 4751 4790 4821 N
+ V ER CH e n/a 37 4751 4790 4821 N
+ V ER CH s n/a 37 4751 4790 4821 N
+ V ER D b n/a 37 4751 4790 4817 N
+ V ER D e n/a 37 4751 4790 4824 N
+ V ER D i n/a 37 4751 4790 4817 N
+ V ER D s n/a 37 4751 4790 4817 N
+ V ER DH e n/a 37 4751 4792 4824 N
+ V ER DH s n/a 37 4751 4792 4818 N
+ V ER EH b n/a 37 4751 4777 4802 N
+ V ER EH e n/a 37 4751 4777 4804 N
+ V ER EH i n/a 37 4751 4777 4803 N
+ V ER EH s n/a 37 4751 4777 4802 N
+ V ER ER b n/a 37 4751 4778 4801 N
+ V ER ER e n/a 37 4751 4778 4801 N
+ V ER ER i n/a 37 4751 4778 4801 N
+ V ER ER s n/a 37 4751 4778 4801 N
+ V ER EY b n/a 37 4751 4777 4802 N
+ V ER EY e n/a 37 4751 4777 4804 N
+ V ER EY i n/a 37 4751 4777 4805 N
+ V ER EY s n/a 37 4751 4777 4802 N
+ V ER F e n/a 37 4751 4790 4819 N
+ V ER F s n/a 37 4751 4790 4819 N
+ V ER G e n/a 37 4751 4790 4824 N
+ V ER G s n/a 37 4751 4790 4817 N
+ V ER HH e n/a 37 4751 4790 4821 N
+ V ER HH s n/a 37 4751 4790 4821 N
+ V ER IH b n/a 37 4751 4777 4806 N
+ V ER IH e n/a 37 4751 4777 4807 N
+ V ER IH i n/a 37 4751 4777 4809 N
+ V ER IH s n/a 37 4751 4777 4806 N
+ V ER IY b n/a 37 4751 4777 4810 N
+ V ER IY e n/a 37 4751 4777 4810 N
+ V ER IY i n/a 37 4751 4777 4810 N
+ V ER IY s n/a 37 4751 4777 4810 N
+ V ER JH e n/a 37 4751 4790 4824 N
+ V ER JH s n/a 37 4751 4790 4817 N
+ V ER K b n/a 37 4751 4790 4813 N
+ V ER K e n/a 37 4751 4790 4813 N
+ V ER K s n/a 37 4751 4790 4813 N
+ V ER L b n/a 37 4751 4795 4828 N
+ V ER L e n/a 37 4751 4795 4828 N
+ V ER L i n/a 37 4751 4795 4828 N
+ V ER L s n/a 37 4751 4795 4828 N
+ V ER M e n/a 37 4751 4790 4825 N
+ V ER M s n/a 37 4751 4790 4825 N
+ V ER N e n/a 37 4751 4790 4825 N
+ V ER N s n/a 37 4751 4790 4825 N
+ V ER NG e n/a 37 4751 4790 4825 N
+ V ER NG s n/a 37 4751 4790 4825 N
+ V ER OW b n/a 37 4751 4773 4797 N
+ V ER OW e n/a 37 4751 4773 4797 N
+ V ER OW i n/a 37 4751 4773 4797 N
+ V ER OW s n/a 37 4751 4773 4797 N
+ V ER OY b n/a 37 4751 4773 4797 N
+ V ER OY e n/a 37 4751 4773 4797 N
+ V ER OY i n/a 37 4751 4773 4797 N
+ V ER OY s n/a 37 4751 4773 4797 N
+ V ER P b n/a 37 4751 4790 4813 N
+ V ER P e n/a 37 4751 4790 4813 N
+ V ER P s n/a 37 4751 4790 4813 N
+ V ER R b n/a 37 4751 4778 4827 N
+ V ER R e n/a 37 4751 4778 4829 N
+ V ER R i n/a 37 4751 4778 4827 N
+ V ER R s n/a 37 4751 4778 4827 N
+ V ER S b n/a 37 4751 4790 4819 N
+ V ER S e n/a 37 4751 4790 4819 N
+ V ER S s n/a 37 4751 4790 4819 N
+ V ER SH e n/a 37 4751 4790 4819 N
+ V ER SH s n/a 37 4751 4790 4819 N
+ V ER SIL e n/a 37 4751 4790 4816 N
+ V ER SIL s n/a 37 4751 4790 4816 N
+ V ER T b n/a 37 4751 4790 4813 N
+ V ER T e n/a 37 4751 4790 4813 N
+ V ER T i n/a 37 4751 4790 4813 N
+ V ER T s n/a 37 4751 4790 4813 N
+ V ER TH e n/a 37 4751 4790 4821 N
+ V ER TH s n/a 37 4751 4790 4821 N
+ V ER UH b n/a 37 4751 4773 4798 N
+ V ER UH e n/a 37 4751 4773 4798 N
+ V ER UH i n/a 37 4751 4773 4798 N
+ V ER UH s n/a 37 4751 4773 4798 N
+ V ER UW b n/a 37 4751 4773 4797 N
+ V ER UW e n/a 37 4751 4773 4797 N
+ V ER UW s n/a 37 4751 4773 4797 N
+ V ER V e n/a 37 4751 4790 4824 N
+ V ER V s n/a 37 4751 4790 4818 N
+ V ER W b n/a 37 4751 4795 4828 N
+ V ER W e n/a 37 4751 4795 4828 N
+ V ER W i n/a 37 4751 4795 4828 N
+ V ER W s n/a 37 4751 4795 4828 N
+ V ER Y b n/a 37 4751 4790 4826 N
+ V ER Y e n/a 37 4751 4790 4826 N
+ V ER Y i n/a 37 4751 4790 4826 N
+ V ER Y s n/a 37 4751 4790 4826 N
+ V ER Z b n/a 37 4751 4790 4818 N
+ V ER Z e n/a 37 4751 4790 4824 N
+ V ER Z i n/a 37 4751 4790 4818 N
+ V ER Z s n/a 37 4751 4790 4818 N
+ V ER ZH e n/a 37 4751 4790 4824 N
+ V ER ZH s n/a 37 4751 4790 4818 N
+ V EY AA b n/a 37 4766 4773 4796 N
+ V EY AA e n/a 37 4766 4773 4796 N
+ V EY AA i n/a 37 4766 4773 4796 N
+ V EY AA s n/a 37 4766 4773 4796 N
+ V EY AE b n/a 37 4766 4781 4803 N
+ V EY AE e n/a 37 4766 4781 4804 N
+ V EY AE i n/a 37 4766 4781 4803 N
+ V EY AE s n/a 37 4766 4781 4803 N
+ V EY AH b n/a 37 4766 4781 4798 N
+ V EY AH e n/a 37 4766 4781 4798 N
+ V EY AH i n/a 37 4766 4781 4812 N
+ V EY AH s n/a 37 4766 4781 4798 N
+ V EY AO b n/a 37 4766 4773 4797 N
+ V EY AO e n/a 37 4766 4773 4797 N
+ V EY AO i n/a 37 4766 4773 4797 N
+ V EY AO s n/a 37 4766 4773 4797 N
+ V EY AW b n/a 37 4766 4781 4803 N
+ V EY AW e n/a 37 4766 4781 4804 N
+ V EY AW s n/a 37 4766 4781 4803 N
+ V EY AY b n/a 37 4766 4773 4796 N
+ V EY AY e n/a 37 4766 4773 4796 N
+ V EY AY i n/a 37 4766 4773 4796 N
+ V EY AY s n/a 37 4766 4773 4796 N
+ V EY B e n/a 37 4766 4785 4823 N
+ V EY B i n/a 37 4766 4785 4817 N
+ V EY B s n/a 37 4766 4785 4817 N
+ V EY CH b n/a 37 4766 4785 4821 N
+ V EY CH e n/a 37 4766 4785 4821 N
+ V EY CH s n/a 37 4766 4785 4821 N
+ V EY D b n/a 37 4766 4785 4817 N
+ V EY D e n/a 37 4766 4785 4823 N
+ V EY D i n/a 37 4766 4785 4817 N
+ V EY D s n/a 37 4766 4785 4817 N
+ V EY DH e n/a 37 4766 4785 4823 N
+ V EY DH s n/a 37 4766 4785 4818 N
+ V EY EH b n/a 37 4766 4781 4802 N
+ V EY EH e n/a 37 4766 4781 4804 N
+ V EY EH i n/a 37 4766 4781 4803 N
+ V EY EH s n/a 37 4766 4781 4802 N
+ V EY ER b n/a 37 4766 4769 4800 N
+ V EY ER e n/a 37 4766 4769 4800 N
+ V EY ER i n/a 37 4766 4769 4800 N
+ V EY ER s n/a 37 4766 4769 4800 N
+ V EY EY b n/a 37 4766 4781 4802 N
+ V EY EY e n/a 37 4766 4781 4804 N
+ V EY EY i n/a 37 4766 4781 4805 N
+ V EY EY s n/a 37 4766 4781 4802 N
+ V EY F e n/a 37 4766 4785 4819 N
+ V EY F s n/a 37 4766 4785 4819 N
+ V EY G e n/a 37 4766 4785 4823 N
+ V EY G s n/a 37 4766 4785 4817 N
+ V EY HH e n/a 37 4766 4785 4821 N
+ V EY HH i n/a 37 4766 4785 4821 N
+ V EY HH s n/a 37 4766 4785 4821 N
+ V EY IH b n/a 37 4766 4781 4806 N
+ V EY IH e n/a 37 4766 4781 4806 N
+ V EY IH i n/a 37 4766 4781 4809 N
+ V EY IH s n/a 37 4766 4781 4806 N
+ V EY IY b n/a 37 4766 4781 4810 N
+ V EY IY e n/a 37 4766 4781 4810 N
+ V EY IY i n/a 37 4766 4781 4810 N
+ V EY IY s n/a 37 4766 4781 4810 N
+ V EY JH e n/a 37 4766 4785 4823 N
+ V EY JH s n/a 37 4766 4785 4817 N
+ V EY K b n/a 37 4766 4785 4813 N
+ V EY K e n/a 37 4766 4785 4813 N
+ V EY K s n/a 37 4766 4785 4813 N
+ V EY L b n/a 37 4766 4785 4828 N
+ V EY L e n/a 37 4766 4785 4828 N
+ V EY L i n/a 37 4766 4785 4828 N
+ V EY L s n/a 37 4766 4785 4828 N
+ V EY M e n/a 37 4766 4785 4825 N
+ V EY M i n/a 37 4766 4785 4825 N
+ V EY M s n/a 37 4766 4785 4825 N
+ V EY N e n/a 37 4766 4785 4825 N
+ V EY N i n/a 37 4766 4785 4825 N
+ V EY N s n/a 37 4766 4785 4825 N
+ V EY NG e n/a 37 4766 4785 4825 N
+ V EY NG s n/a 37 4766 4785 4825 N
+ V EY OW b n/a 37 4766 4773 4797 N
+ V EY OW e n/a 37 4766 4773 4797 N
+ V EY OW i n/a 37 4766 4773 4797 N
+ V EY OW s n/a 37 4766 4773 4797 N
+ V EY OY b n/a 37 4766 4773 4797 N
+ V EY OY e n/a 37 4766 4773 4797 N
+ V EY OY s n/a 37 4766 4773 4797 N
+ V EY P b n/a 37 4766 4785 4813 N
+ V EY P e n/a 37 4766 4785 4813 N
+ V EY P s n/a 37 4766 4785 4813 N
+ V EY R b n/a 37 4766 4785 4827 N
+ V EY R e n/a 37 4766 4785 4829 N
+ V EY R i n/a 37 4766 4785 4827 N
+ V EY R s n/a 37 4766 4785 4827 N
+ V EY S b n/a 37 4766 4785 4819 N
+ V EY S e n/a 37 4766 4785 4819 N
+ V EY S i n/a 37 4766 4785 4819 N
+ V EY S s n/a 37 4766 4785 4819 N
+ V EY SH e n/a 37 4766 4785 4819 N
+ V EY SH s n/a 37 4766 4785 4819 N
+ V EY SIL e n/a 37 4766 4785 4816 N
+ V EY SIL s n/a 37 4766 4785 4816 N
+ V EY T b n/a 37 4766 4785 4813 N
+ V EY T e n/a 37 4766 4785 4813 N
+ V EY T i n/a 37 4766 4785 4813 N
+ V EY T s n/a 37 4766 4785 4813 N
+ V EY TH e n/a 37 4766 4785 4821 N
+ V EY TH s n/a 37 4766 4785 4821 N
+ V EY UH b n/a 37 4766 4773 4798 N
+ V EY UH e n/a 37 4766 4773 4798 N
+ V EY UH s n/a 37 4766 4773 4798 N
+ V EY UW b n/a 37 4766 4773 4797 N
+ V EY UW e n/a 37 4766 4773 4797 N
+ V EY UW s n/a 37 4766 4773 4797 N
+ V EY V e n/a 37 4766 4785 4823 N
+ V EY V i n/a 37 4766 4785 4818 N
+ V EY V s n/a 37 4766 4785 4818 N
+ V EY W b n/a 37 4766 4785 4828 N
+ V EY W e n/a 37 4766 4785 4828 N
+ V EY W s n/a 37 4766 4785 4828 N
+ V EY Y b n/a 37 4766 4785 4826 N
+ V EY Y e n/a 37 4766 4785 4826 N
+ V EY Y i n/a 37 4766 4785 4826 N
+ V EY Y s n/a 37 4766 4785 4826 N
+ V EY Z b n/a 37 4766 4785 4818 N
+ V EY Z e n/a 37 4766 4785 4823 N
+ V EY Z i n/a 37 4766 4785 4818 N
+ V EY Z s n/a 37 4766 4785 4818 N
+ V EY ZH e n/a 37 4766 4785 4823 N
+ V EY ZH s n/a 37 4766 4785 4818 N
+ V F AA b n/a 37 4757 4780 4796 N
+ V F AA s n/a 37 4757 4780 4796 N
+ V F AE b n/a 37 4757 4779 4803 N
+ V F AE i n/a 37 4757 4779 4803 N
+ V F AE s n/a 37 4757 4779 4803 N
+ V F AH b n/a 37 4757 4779 4798 N
+ V F AH i n/a 37 4757 4779 4812 N
+ V F AH s n/a 37 4757 4779 4798 N
+ V F AO b n/a 37 4757 4780 4797 N
+ V F AO s n/a 37 4757 4780 4797 N
+ V F AW b n/a 37 4757 4779 4803 N
+ V F AW s n/a 37 4757 4779 4803 N
+ V F AY b n/a 37 4757 4780 4796 N
+ V F AY s n/a 37 4757 4780 4796 N
+ V F B s n/a 37 4757 4786 4817 N
+ V F CH b n/a 37 4757 4786 4821 N
+ V F CH s n/a 37 4757 4786 4821 N
+ V F D b n/a 37 4757 4786 4817 N
+ V F D s n/a 37 4757 4786 4817 N
+ V F DH s n/a 37 4757 4792 4818 N
+ V F EH b n/a 37 4757 4779 4802 N
+ V F EH s n/a 37 4757 4779 4802 N
+ V F ER b n/a 37 4757 4780 4800 N
+ V F ER s n/a 37 4757 4780 4800 N
+ V F EY b n/a 37 4757 4779 4802 N
+ V F EY s n/a 37 4757 4779 4802 N
+ V F F s n/a 37 4757 4786 4819 N
+ V F G s n/a 37 4757 4786 4817 N
+ V F HH s n/a 37 4757 4786 4821 N
+ V F IH b n/a 37 4757 4779 4806 N
+ V F IH s n/a 37 4757 4779 4806 N
+ V F IY b n/a 37 4757 4779 4810 N
+ V F IY s n/a 37 4757 4779 4810 N
+ V F JH s n/a 37 4757 4786 4817 N
+ V F K b n/a 37 4757 4786 4813 N
+ V F K s n/a 37 4757 4786 4813 N
+ V F L b n/a 37 4757 4795 4828 N
+ V F L s n/a 37 4757 4795 4828 N
+ V F M s n/a 37 4757 4786 4825 N
+ V F N s n/a 37 4757 4786 4825 N
+ V F NG s n/a 37 4757 4786 4825 N
+ V F OW b n/a 37 4757 4780 4797 N
+ V F OW s n/a 37 4757 4780 4797 N
+ V F OY b n/a 37 4757 4780 4797 N
+ V F OY s n/a 37 4757 4780 4797 N
+ V F P b n/a 37 4757 4786 4813 N
+ V F P s n/a 37 4757 4786 4813 N
+ V F R b n/a 37 4757 4780 4827 N
+ V F R s n/a 37 4757 4780 4827 N
+ V F S b n/a 37 4757 4786 4819 N
+ V F S s n/a 37 4757 4786 4819 N
+ V F SH s n/a 37 4757 4786 4819 N
+ V F SIL s n/a 37 4757 4786 4816 N
+ V F T b n/a 37 4757 4786 4813 N
+ V F T s n/a 37 4757 4786 4813 N
+ V F TH s n/a 37 4757 4786 4821 N
+ V F UH b n/a 37 4757 4780 4798 N
+ V F UH s n/a 37 4757 4780 4798 N
+ V F UW b n/a 37 4757 4780 4797 N
+ V F UW s n/a 37 4757 4780 4797 N
+ V F V s n/a 37 4757 4786 4818 N
+ V F W b n/a 37 4757 4795 4828 N
+ V F W s n/a 37 4757 4795 4828 N
+ V F Y b n/a 37 4757 4786 4826 N
+ V F Y s n/a 37 4757 4786 4826 N
+ V F Z b n/a 37 4757 4786 4818 N
+ V F Z s n/a 37 4757 4786 4818 N
+ V F ZH s n/a 37 4757 4786 4818 N
+ V G AA b n/a 37 4757 4780 4796 N
+ V G AA e n/a 37 4757 4780 4796 N
+ V G AA s n/a 37 4757 4780 4796 N
+ V G AE b n/a 37 4757 4779 4803 N
+ V G AE e n/a 37 4757 4779 4804 N
+ V G AE s n/a 37 4757 4779 4803 N
+ V G AH b n/a 37 4757 4779 4798 N
+ V G AH e n/a 37 4757 4779 4798 N
+ V G AH i n/a 37 4757 4779 4812 N
+ V G AH s n/a 37 4757 4779 4798 N
+ V G AO b n/a 37 4757 4780 4797 N
+ V G AO e n/a 37 4757 4780 4797 N
+ V G AO s n/a 37 4757 4780 4797 N
+ V G AW b n/a 37 4757 4779 4803 N
+ V G AW e n/a 37 4757 4779 4804 N
+ V G AW s n/a 37 4757 4779 4803 N
+ V G AY b n/a 37 4757 4780 4796 N
+ V G AY e n/a 37 4757 4780 4796 N
+ V G AY s n/a 37 4757 4780 4796 N
+ V G B e n/a 37 4757 4786 4824 N
+ V G B s n/a 37 4757 4786 4817 N
+ V G CH b n/a 37 4757 4786 4821 N
+ V G CH e n/a 37 4757 4786 4821 N
+ V G CH s n/a 37 4757 4786 4821 N
+ V G D b n/a 37 4757 4786 4817 N
+ V G D e n/a 37 4757 4786 4824 N
+ V G D s n/a 37 4757 4786 4817 N
+ V G DH e n/a 37 4757 4792 4824 N
+ V G DH s n/a 37 4757 4792 4818 N
+ V G EH b n/a 37 4757 4779 4802 N
+ V G EH e n/a 37 4757 4779 4804 N
+ V G EH s n/a 37 4757 4779 4802 N
+ V G ER b n/a 37 4757 4780 4800 N
+ V G ER e n/a 37 4757 4780 4800 N
+ V G ER s n/a 37 4757 4780 4800 N
+ V G EY b n/a 37 4757 4779 4802 N
+ V G EY e n/a 37 4757 4779 4804 N
+ V G EY s n/a 37 4757 4779 4802 N
+ V G F e n/a 37 4757 4786 4819 N
+ V G F s n/a 37 4757 4786 4819 N
+ V G G e n/a 37 4757 4786 4824 N
+ V G G s n/a 37 4757 4786 4817 N
+ V G HH e n/a 37 4757 4786 4821 N
+ V G HH s n/a 37 4757 4786 4821 N
+ V G IH b n/a 37 4757 4779 4806 N
+ V G IH e n/a 37 4757 4779 4807 N
+ V G IH s n/a 37 4757 4779 4806 N
+ V G IY b n/a 37 4757 4779 4810 N
+ V G IY e n/a 37 4757 4779 4810 N
+ V G IY i n/a 37 4757 4779 4810 N
+ V G IY s n/a 37 4757 4779 4810 N
+ V G JH e n/a 37 4757 4786 4824 N
+ V G JH s n/a 37 4757 4786 4817 N
+ V G K b n/a 37 4757 4786 4813 N
+ V G K e n/a 37 4757 4786 4813 N
+ V G K s n/a 37 4757 4786 4813 N
+ V G L b n/a 37 4757 4795 4828 N
+ V G L e n/a 37 4757 4795 4828 N
+ V G L s n/a 37 4757 4795 4828 N
+ V G M e n/a 37 4757 4786 4825 N
+ V G M s n/a 37 4757 4786 4825 N
+ V G N e n/a 37 4757 4786 4825 N
+ V G N s n/a 37 4757 4786 4825 N
+ V G NG e n/a 37 4757 4786 4825 N
+ V G NG s n/a 37 4757 4786 4825 N
+ V G OW b n/a 37 4757 4780 4797 N
+ V G OW e n/a 37 4757 4780 4797 N
+ V G OW s n/a 37 4757 4780 4797 N
+ V G OY b n/a 37 4757 4780 4797 N
+ V G OY e n/a 37 4757 4780 4797 N
+ V G OY s n/a 37 4757 4780 4797 N
+ V G P b n/a 37 4757 4786 4813 N
+ V G P e n/a 37 4757 4786 4813 N
+ V G P s n/a 37 4757 4786 4813 N
+ V G R b n/a 37 4757 4780 4827 N
+ V G R e n/a 37 4757 4780 4829 N
+ V G R s n/a 37 4757 4780 4827 N
+ V G S b n/a 37 4757 4786 4819 N
+ V G S e n/a 37 4757 4786 4819 N
+ V G S s n/a 37 4757 4786 4819 N
+ V G SH e n/a 37 4757 4786 4819 N
+ V G SH s n/a 37 4757 4786 4819 N
+ V G SIL e n/a 37 4757 4786 4816 N
+ V G SIL s n/a 37 4757 4786 4816 N
+ V G T b n/a 37 4757 4786 4813 N
+ V G T e n/a 37 4757 4786 4813 N
+ V G T s n/a 37 4757 4786 4813 N
+ V G TH e n/a 37 4757 4786 4821 N
+ V G TH s n/a 37 4757 4786 4821 N
+ V G UH b n/a 37 4757 4780 4798 N
+ V G UH e n/a 37 4757 4780 4798 N
+ V G UH s n/a 37 4757 4780 4798 N
+ V G UW b n/a 37 4757 4780 4797 N
+ V G UW e n/a 37 4757 4780 4797 N
+ V G UW s n/a 37 4757 4780 4797 N
+ V G V e n/a 37 4757 4786 4824 N
+ V G V s n/a 37 4757 4786 4818 N
+ V G W b n/a 37 4757 4795 4828 N
+ V G W e n/a 37 4757 4795 4828 N
+ V G W s n/a 37 4757 4795 4828 N
+ V G Y b n/a 37 4757 4786 4826 N
+ V G Y e n/a 37 4757 4786 4826 N
+ V G Y s n/a 37 4757 4786 4826 N
+ V G Z b n/a 37 4757 4786 4818 N
+ V G Z e n/a 37 4757 4786 4824 N
+ V G Z s n/a 37 4757 4786 4818 N
+ V G ZH e n/a 37 4757 4786 4824 N
+ V G ZH s n/a 37 4757 4786 4818 N
+ V HH AA b n/a 37 4757 4780 4796 N
+ V HH AA e n/a 37 4757 4780 4796 N
+ V HH AA s n/a 37 4757 4780 4796 N
+ V HH AE b n/a 37 4757 4779 4803 N
+ V HH AE e n/a 37 4757 4779 4804 N
+ V HH AE i n/a 37 4757 4779 4803 N
+ V HH AE s n/a 37 4757 4779 4803 N
+ V HH AH b n/a 37 4757 4779 4798 N
+ V HH AH e n/a 37 4757 4779 4798 N
+ V HH AH s n/a 37 4757 4779 4798 N
+ V HH AO b n/a 37 4757 4780 4797 N
+ V HH AO e n/a 37 4757 4780 4797 N
+ V HH AO s n/a 37 4757 4780 4797 N
+ V HH AW b n/a 37 4757 4779 4803 N
+ V HH AW e n/a 37 4757 4779 4804 N
+ V HH AW s n/a 37 4757 4779 4803 N
+ V HH AY b n/a 37 4757 4780 4796 N
+ V HH AY e n/a 37 4757 4780 4796 N
+ V HH AY s n/a 37 4757 4780 4796 N
+ V HH B e n/a 37 4757 4786 4824 N
+ V HH B s n/a 37 4757 4786 4817 N
+ V HH CH b n/a 37 4757 4786 4821 N
+ V HH CH e n/a 37 4757 4786 4821 N
+ V HH CH s n/a 37 4757 4786 4821 N
+ V HH D b n/a 37 4757 4786 4817 N
+ V HH D e n/a 37 4757 4786 4824 N
+ V HH D s n/a 37 4757 4786 4817 N
+ V HH DH e n/a 37 4757 4792 4824 N
+ V HH DH s n/a 37 4757 4792 4818 N
+ V HH EH b n/a 37 4757 4779 4802 N
+ V HH EH e n/a 37 4757 4779 4804 N
+ V HH EH s n/a 37 4757 4779 4802 N
+ V HH ER b n/a 37 4757 4780 4800 N
+ V HH ER e n/a 37 4757 4780 4800 N
+ V HH ER s n/a 37 4757 4780 4800 N
+ V HH EY b n/a 37 4757 4779 4802 N
+ V HH EY e n/a 37 4757 4779 4804 N
+ V HH EY s n/a 37 4757 4779 4802 N
+ V HH F e n/a 37 4757 4786 4819 N
+ V HH F s n/a 37 4757 4786 4819 N
+ V HH G e n/a 37 4757 4786 4824 N
+ V HH G s n/a 37 4757 4786 4817 N
+ V HH HH e n/a 37 4757 4786 4821 N
+ V HH HH s n/a 37 4757 4786 4821 N
+ V HH IH b n/a 37 4757 4779 4806 N
+ V HH IH e n/a 37 4757 4779 4807 N
+ V HH IH s n/a 37 4757 4779 4806 N
+ V HH IY b n/a 37 4757 4779 4810 N
+ V HH IY e n/a 37 4757 4779 4810 N
+ V HH IY s n/a 37 4757 4779 4810 N
+ V HH JH e n/a 37 4757 4786 4824 N
+ V HH JH s n/a 37 4757 4786 4817 N
+ V HH K b n/a 37 4757 4786 4813 N
+ V HH K e n/a 37 4757 4786 4813 N
+ V HH K s n/a 37 4757 4786 4813 N
+ V HH L b n/a 37 4757 4795 4828 N
+ V HH L e n/a 37 4757 4795 4828 N
+ V HH L s n/a 37 4757 4795 4828 N
+ V HH M e n/a 37 4757 4786 4825 N
+ V HH M s n/a 37 4757 4786 4825 N
+ V HH N e n/a 37 4757 4786 4825 N
+ V HH N s n/a 37 4757 4786 4825 N
+ V HH NG e n/a 37 4757 4786 4825 N
+ V HH NG s n/a 37 4757 4786 4825 N
+ V HH OW b n/a 37 4757 4780 4797 N
+ V HH OW e n/a 37 4757 4780 4797 N
+ V HH OW s n/a 37 4757 4780 4797 N
+ V HH OY b n/a 37 4757 4780 4797 N
+ V HH OY e n/a 37 4757 4780 4797 N
+ V HH OY s n/a 37 4757 4780 4797 N
+ V HH P b n/a 37 4757 4786 4813 N
+ V HH P e n/a 37 4757 4786 4813 N
+ V HH P s n/a 37 4757 4786 4813 N
+ V HH R b n/a 37 4757 4780 4827 N
+ V HH R e n/a 37 4757 4780 4829 N
+ V HH R s n/a 37 4757 4780 4827 N
+ V HH S b n/a 37 4757 4786 4819 N
+ V HH S e n/a 37 4757 4786 4819 N
+ V HH S s n/a 37 4757 4786 4819 N
+ V HH SH e n/a 37 4757 4786 4819 N
+ V HH SH s n/a 37 4757 4786 4819 N
+ V HH SIL e n/a 37 4757 4786 4816 N
+ V HH SIL s n/a 37 4757 4786 4816 N
+ V HH T b n/a 37 4757 4786 4813 N
+ V HH T e n/a 37 4757 4786 4813 N
+ V HH T s n/a 37 4757 4786 4813 N
+ V HH TH e n/a 37 4757 4786 4821 N
+ V HH TH s n/a 37 4757 4786 4821 N
+ V HH UH b n/a 37 4757 4780 4798 N
+ V HH UH e n/a 37 4757 4780 4798 N
+ V HH UH s n/a 37 4757 4780 4798 N
+ V HH UW b n/a 37 4757 4780 4797 N
+ V HH UW e n/a 37 4757 4780 4797 N
+ V HH UW s n/a 37 4757 4780 4797 N
+ V HH V e n/a 37 4757 4786 4824 N
+ V HH V s n/a 37 4757 4786 4818 N
+ V HH W b n/a 37 4757 4795 4828 N
+ V HH W e n/a 37 4757 4795 4828 N
+ V HH W s n/a 37 4757 4795 4828 N
+ V HH Y b n/a 37 4757 4786 4826 N
+ V HH Y e n/a 37 4757 4786 4826 N
+ V HH Y s n/a 37 4757 4786 4826 N
+ V HH Z b n/a 37 4757 4786 4818 N
+ V HH Z e n/a 37 4757 4786 4824 N
+ V HH Z s n/a 37 4757 4786 4818 N
+ V HH ZH e n/a 37 4757 4786 4824 N
+ V HH ZH s n/a 37 4757 4786 4818 N
+ V IH AA b n/a 37 4762 4773 4796 N
+ V IH AA e n/a 37 4762 4773 4796 N
+ V IH AA i n/a 37 4762 4773 4796 N
+ V IH AA s n/a 37 4762 4773 4796 N
+ V IH AE b n/a 37 4763 4776 4803 N
+ V IH AE e n/a 37 4763 4774 4804 N
+ V IH AE i n/a 37 4763 4774 4803 N
+ V IH AE s n/a 37 4763 4774 4803 N
+ V IH AH b n/a 37 4762 4776 4798 N
+ V IH AH e n/a 37 4762 4774 4798 N
+ V IH AH i n/a 37 4762 4774 4812 N
+ V IH AH s n/a 37 4762 4774 4798 N
+ V IH AO b n/a 37 4762 4773 4797 N
+ V IH AO e n/a 37 4762 4773 4797 N
+ V IH AO i n/a 37 4762 4773 4797 N
+ V IH AO s n/a 37 4762 4773 4797 N
+ V IH AW b n/a 37 4763 4776 4803 N
+ V IH AW e n/a 37 4763 4774 4804 N
+ V IH AW i n/a 37 4763 4774 4803 N
+ V IH AW s n/a 37 4763 4774 4803 N
+ V IH AY b n/a 37 4762 4773 4796 N
+ V IH AY e n/a 37 4762 4773 4796 N
+ V IH AY i n/a 37 4762 4773 4796 N
+ V IH AY s n/a 37 4762 4773 4796 N
+ V IH B e n/a 37 4763 4793 4823 N
+ V IH B i n/a 37 4763 4793 4817 N
+ V IH B s n/a 37 4763 4793 4817 N
+ V IH CH b n/a 37 4763 4784 4821 N
+ V IH CH e n/a 37 4763 4784 4821 N
+ V IH CH s n/a 37 4763 4784 4821 N
+ V IH D b n/a 37 4763 4793 4817 N
+ V IH D e n/a 37 4763 4793 4823 N
+ V IH D i n/a 37 4763 4793 4817 N
+ V IH D s n/a 37 4763 4793 4817 N
+ V IH DH e n/a 37 4763 4793 4823 N
+ V IH DH s n/a 37 4763 4793 4818 N
+ V IH EH b n/a 37 4763 4776 4802 N
+ V IH EH e n/a 37 4763 4774 4804 N
+ V IH EH i n/a 37 4763 4774 4803 N
+ V IH EH s n/a 37 4763 4774 4802 N
+ V IH ER b n/a 37 4762 4769 4800 N
+ V IH ER e n/a 37 4762 4769 4800 N
+ V IH ER i n/a 37 4762 4769 4800 N
+ V IH ER s n/a 37 4762 4769 4800 N
+ V IH EY b n/a 37 4763 4776 4802 N
+ V IH EY e n/a 37 4763 4774 4804 N
+ V IH EY i n/a 37 4763 4774 4805 N
+ V IH EY s n/a 37 4763 4774 4802 N
+ V IH F e n/a 37 4763 4784 4819 N
+ V IH F s n/a 37 4763 4784 4819 N
+ V IH G e n/a 37 4763 4793 4824 N
+ V IH G s n/a 37 4763 4793 4817 N
+ V IH HH e n/a 37 4763 4784 4821 N
+ V IH HH i n/a 37 4763 4784 4821 N
+ V IH HH s n/a 37 4763 4784 4821 N
+ V IH IH b n/a 37 4763 4776 4806 N
+ V IH IH e n/a 37 4763 4774 4807 N
+ V IH IH i n/a 37 4763 4774 4809 N
+ V IH IH s n/a 37 4763 4774 4806 N
+ V IH IY b n/a 37 4763 4776 4810 N
+ V IH IY e n/a 37 4763 4774 4810 N
+ V IH IY i n/a 37 4763 4774 4810 N
+ V IH IY s n/a 37 4763 4774 4810 N
+ V IH JH e n/a 37 4763 4793 4823 N
+ V IH JH i n/a 37 4763 4793 4817 N
+ V IH JH s n/a 37 4763 4793 4817 N
+ V IH K b n/a 37 4763 4784 4813 N
+ V IH K e n/a 37 4763 4784 4813 N
+ V IH K i n/a 37 4763 4784 4813 N
+ V IH K s n/a 37 4763 4784 4813 N
+ V IH L b n/a 37 4762 4795 4828 N
+ V IH L e n/a 37 4762 4795 4828 N
+ V IH L i n/a 37 4762 4795 4828 N
+ V IH L s n/a 37 4762 4795 4828 N
+ V IH M e n/a 37 4763 4793 4825 N
+ V IH M s n/a 37 4763 4793 4825 N
+ V IH N e n/a 37 4763 4793 4825 N
+ V IH N i n/a 37 4763 4793 4825 N
+ V IH N s n/a 37 4763 4793 4825 N
+ V IH NG e n/a 37 4763 4793 4825 N
+ V IH NG s n/a 37 4763 4793 4825 N
+ V IH OW b n/a 37 4762 4773 4797 N
+ V IH OW e n/a 37 4762 4773 4797 N
+ V IH OW i n/a 37 4762 4773 4797 N
+ V IH OW s n/a 37 4762 4773 4797 N
+ V IH OY b n/a 37 4762 4773 4797 N
+ V IH OY e n/a 37 4762 4773 4797 N
+ V IH OY i n/a 37 4762 4773 4797 N
+ V IH OY s n/a 37 4762 4773 4797 N
+ V IH P b n/a 37 4763 4784 4813 N
+ V IH P e n/a 37 4763 4784 4813 N
+ V IH P s n/a 37 4763 4784 4813 N
+ V IH R b n/a 37 4762 4769 4827 N
+ V IH R e n/a 37 4762 4769 4829 N
+ V IH R i n/a 37 4762 4769 4827 N
+ V IH R s n/a 37 4762 4769 4827 N
+ V IH S b n/a 37 4763 4784 4819 N
+ V IH S e n/a 37 4763 4784 4819 N
+ V IH S s n/a 37 4763 4784 4819 N
+ V IH SH e n/a 37 4763 4784 4819 N
+ V IH SH s n/a 37 4763 4784 4819 N
+ V IH SIL e n/a 37 4763 4784 4816 N
+ V IH SIL s n/a 37 4763 4784 4816 N
+ V IH T b n/a 37 4763 4784 4813 N
+ V IH T e n/a 37 4763 4784 4813 N
+ V IH T i n/a 37 4763 4784 4813 N
+ V IH T s n/a 37 4763 4784 4813 N
+ V IH TH e n/a 37 4763 4784 4821 N
+ V IH TH s n/a 37 4763 4784 4821 N
+ V IH UH b n/a 37 4762 4773 4798 N
+ V IH UH e n/a 37 4762 4773 4798 N
+ V IH UH s n/a 37 4762 4773 4798 N
+ V IH UW b n/a 37 4762 4773 4797 N
+ V IH UW e n/a 37 4762 4773 4797 N
+ V IH UW i n/a 37 4762 4773 4797 N
+ V IH UW s n/a 37 4762 4773 4797 N
+ V IH V e n/a 37 4763 4793 4823 N
+ V IH V s n/a 37 4763 4793 4818 N
+ V IH W b n/a 37 4762 4795 4828 N
+ V IH W e n/a 37 4762 4795 4828 N
+ V IH W i n/a 37 4762 4795 4828 N
+ V IH W s n/a 37 4762 4795 4828 N
+ V IH Y b n/a 37 4763 4793 4826 N
+ V IH Y e n/a 37 4763 4793 4826 N
+ V IH Y i n/a 37 4763 4793 4826 N
+ V IH Y s n/a 37 4763 4793 4826 N
+ V IH Z b n/a 37 4763 4793 4818 N
+ V IH Z e n/a 37 4763 4793 4823 N
+ V IH Z i n/a 37 4763 4793 4818 N
+ V IH Z s n/a 37 4763 4793 4818 N
+ V IH ZH e n/a 37 4763 4793 4823 N
+ V IH ZH s n/a 37 4763 4793 4818 N
+ V IY AA b n/a 37 4765 4773 4796 N
+ V IY AA e n/a 37 4765 4773 4796 N
+ V IY AA i n/a 37 4765 4773 4796 N
+ V IY AA s n/a 37 4765 4773 4796 N
+ V IY AE b n/a 37 4765 4781 4803 N
+ V IY AE e n/a 37 4765 4781 4804 N
+ V IY AE i n/a 37 4765 4781 4803 N
+ V IY AE s n/a 37 4765 4781 4803 N
+ V IY AH b n/a 37 4765 4781 4798 N
+ V IY AH e n/a 37 4765 4781 4798 N
+ V IY AH i n/a 37 4765 4781 4812 N
+ V IY AH s n/a 37 4765 4781 4798 N
+ V IY AO b n/a 37 4765 4773 4797 N
+ V IY AO e n/a 37 4765 4773 4797 N
+ V IY AO s n/a 37 4765 4773 4797 N
+ V IY AW b n/a 37 4765 4781 4803 N
+ V IY AW e n/a 37 4765 4781 4804 N
+ V IY AW i n/a 37 4765 4781 4803 N
+ V IY AW s n/a 37 4765 4781 4803 N
+ V IY AY b n/a 37 4765 4773 4796 N
+ V IY AY e n/a 37 4765 4773 4796 N
+ V IY AY i n/a 37 4765 4773 4796 N
+ V IY AY s n/a 37 4765 4773 4796 N
+ V IY B e n/a 37 4765 4785 4823 N
+ V IY B s n/a 37 4765 4785 4817 N
+ V IY CH b n/a 37 4765 4785 4821 N
+ V IY CH e n/a 37 4765 4785 4821 N
+ V IY CH s n/a 37 4765 4785 4821 N
+ V IY D b n/a 37 4765 4785 4817 N
+ V IY D e n/a 37 4765 4785 4823 N
+ V IY D i n/a 37 4765 4785 4817 N
+ V IY D s n/a 37 4765 4785 4817 N
+ V IY DH e n/a 37 4765 4785 4823 N
+ V IY DH s n/a 37 4765 4785 4818 N
+ V IY EH b n/a 37 4765 4781 4802 N
+ V IY EH e n/a 37 4765 4781 4804 N
+ V IY EH i n/a 37 4765 4781 4803 N
+ V IY EH s n/a 37 4765 4781 4802 N
+ V IY ER b n/a 37 4765 4769 4800 N
+ V IY ER e n/a 37 4765 4769 4800 N
+ V IY ER i n/a 37 4765 4769 4800 N
+ V IY ER s n/a 37 4765 4769 4800 N
+ V IY EY b n/a 37 4765 4781 4802 N
+ V IY EY e n/a 37 4765 4781 4804 N
+ V IY EY i n/a 37 4765 4781 4805 N
+ V IY EY s n/a 37 4765 4781 4802 N
+ V IY F e n/a 37 4765 4785 4819 N
+ V IY F i n/a 37 4765 4785 4819 N
+ V IY F s n/a 37 4765 4785 4819 N
+ V IY G e n/a 37 4765 4785 4823 N
+ V IY G s n/a 37 4765 4785 4817 N
+ V IY HH e n/a 37 4765 4785 4821 N
+ V IY HH i n/a 37 4765 4785 4821 N
+ V IY HH s n/a 37 4765 4785 4821 N
+ V IY IH b n/a 37 4765 4781 4806 N
+ V IY IH e n/a 37 4765 4781 4806 N
+ V IY IH i n/a 37 4765 4781 4808 N
+ V IY IH s n/a 37 4765 4781 4806 N
+ V IY IY b n/a 37 4765 4781 4810 N
+ V IY IY e n/a 37 4765 4781 4810 N
+ V IY IY i n/a 37 4765 4781 4810 N
+ V IY IY s n/a 37 4765 4781 4810 N
+ V IY JH e n/a 37 4765 4785 4823 N
+ V IY JH s n/a 37 4765 4785 4817 N
+ V IY K b n/a 37 4765 4785 4813 N
+ V IY K e n/a 37 4765 4785 4813 N
+ V IY K i n/a 37 4765 4785 4813 N
+ V IY K s n/a 37 4765 4785 4813 N
+ V IY L b n/a 37 4765 4785 4828 N
+ V IY L e n/a 37 4765 4785 4828 N
+ V IY L i n/a 37 4765 4785 4828 N
+ V IY L s n/a 37 4765 4785 4828 N
+ V IY M e n/a 37 4765 4785 4825 N
+ V IY M i n/a 37 4765 4785 4825 N
+ V IY M s n/a 37 4765 4785 4825 N
+ V IY N e n/a 37 4765 4785 4825 N
+ V IY N i n/a 37 4765 4785 4825 N
+ V IY N s n/a 37 4765 4785 4825 N
+ V IY NG e n/a 37 4765 4785 4825 N
+ V IY NG s n/a 37 4765 4785 4825 N
+ V IY OW b n/a 37 4765 4773 4797 N
+ V IY OW e n/a 37 4765 4773 4797 N
+ V IY OW i n/a 37 4765 4773 4797 N
+ V IY OW s n/a 37 4765 4773 4797 N
+ V IY OY b n/a 37 4765 4773 4797 N
+ V IY OY e n/a 37 4765 4773 4797 N
+ V IY OY s n/a 37 4765 4773 4797 N
+ V IY P b n/a 37 4765 4785 4813 N
+ V IY P e n/a 37 4765 4785 4813 N
+ V IY P i n/a 37 4765 4785 4813 N
+ V IY P s n/a 37 4765 4785 4813 N
+ V IY R b n/a 37 4765 4785 4827 N
+ V IY R e n/a 37 4765 4785 4829 N
+ V IY R i n/a 37 4765 4785 4827 N
+ V IY R s n/a 37 4765 4785 4827 N
+ V IY S b n/a 37 4765 4785 4819 N
+ V IY S e n/a 37 4765 4785 4819 N
+ V IY S i n/a 37 4765 4785 4819 N
+ V IY S s n/a 37 4765 4785 4819 N
+ V IY SH e n/a 37 4765 4785 4819 N
+ V IY SH s n/a 37 4765 4785 4819 N
+ V IY SIL e n/a 37 4765 4785 4816 N
+ V IY SIL s n/a 37 4765 4785 4816 N
+ V IY T b n/a 37 4765 4785 4813 N
+ V IY T e n/a 37 4765 4785 4813 N
+ V IY T i n/a 37 4765 4785 4813 N
+ V IY T s n/a 37 4765 4785 4813 N
+ V IY TH e n/a 37 4765 4785 4821 N
+ V IY TH i n/a 37 4765 4785 4821 N
+ V IY TH s n/a 37 4765 4785 4821 N
+ V IY UH b n/a 37 4765 4773 4798 N
+ V IY UH e n/a 37 4765 4773 4798 N
+ V IY UH s n/a 37 4765 4773 4798 N
+ V IY UW b n/a 37 4765 4773 4797 N
+ V IY UW e n/a 37 4765 4773 4797 N
+ V IY UW s n/a 37 4765 4773 4797 N
+ V IY V e n/a 37 4765 4785 4823 N
+ V IY V s n/a 37 4765 4785 4818 N
+ V IY W b n/a 37 4765 4785 4828 N
+ V IY W e n/a 37 4765 4785 4828 N
+ V IY W i n/a 37 4765 4785 4828 N
+ V IY W s n/a 37 4765 4785 4828 N
+ V IY Y b n/a 37 4765 4785 4826 N
+ V IY Y e n/a 37 4765 4785 4826 N
+ V IY Y i n/a 37 4765 4785 4826 N
+ V IY Y s n/a 37 4765 4785 4826 N
+ V IY Z b n/a 37 4765 4785 4818 N
+ V IY Z e n/a 37 4765 4785 4823 N
+ V IY Z i n/a 37 4765 4785 4818 N
+ V IY Z s n/a 37 4765 4785 4818 N
+ V IY ZH e n/a 37 4765 4785 4823 N
+ V IY ZH s n/a 37 4765 4785 4818 N
+ V JH AA b n/a 37 4757 4780 4796 N
+ V JH AA e n/a 37 4757 4780 4796 N
+ V JH AA s n/a 37 4757 4780 4796 N
+ V JH AE b n/a 37 4757 4779 4803 N
+ V JH AE e n/a 37 4757 4779 4804 N
+ V JH AE s n/a 37 4757 4779 4803 N
+ V JH AH b n/a 37 4757 4779 4798 N
+ V JH AH e n/a 37 4757 4779 4798 N
+ V JH AH s n/a 37 4757 4779 4798 N
+ V JH AO b n/a 37 4757 4780 4797 N
+ V JH AO e n/a 37 4757 4780 4797 N
+ V JH AO s n/a 37 4757 4780 4797 N
+ V JH AW b n/a 37 4757 4779 4803 N
+ V JH AW e n/a 37 4757 4779 4804 N
+ V JH AW s n/a 37 4757 4779 4803 N
+ V JH AY b n/a 37 4757 4780 4796 N
+ V JH AY e n/a 37 4757 4780 4796 N
+ V JH AY s n/a 37 4757 4780 4796 N
+ V JH B e n/a 37 4757 4786 4824 N
+ V JH B s n/a 37 4757 4786 4817 N
+ V JH CH b n/a 37 4757 4786 4821 N
+ V JH CH e n/a 37 4757 4786 4821 N
+ V JH CH s n/a 37 4757 4786 4821 N
+ V JH D b n/a 37 4757 4786 4817 N
+ V JH D e n/a 37 4757 4786 4824 N
+ V JH D s n/a 37 4757 4786 4817 N
+ V JH DH e n/a 37 4757 4792 4824 N
+ V JH DH s n/a 37 4757 4792 4818 N
+ V JH EH b n/a 37 4757 4779 4802 N
+ V JH EH e n/a 37 4757 4779 4804 N
+ V JH EH s n/a 37 4757 4779 4802 N
+ V JH ER b n/a 37 4757 4780 4800 N
+ V JH ER e n/a 37 4757 4780 4800 N
+ V JH ER s n/a 37 4757 4780 4800 N
+ V JH EY b n/a 37 4757 4779 4802 N
+ V JH EY e n/a 37 4757 4779 4804 N
+ V JH EY s n/a 37 4757 4779 4802 N
+ V JH F e n/a 37 4757 4786 4819 N
+ V JH F s n/a 37 4757 4786 4819 N
+ V JH G e n/a 37 4757 4786 4824 N
+ V JH G s n/a 37 4757 4786 4817 N
+ V JH HH e n/a 37 4757 4786 4821 N
+ V JH HH s n/a 37 4757 4786 4821 N
+ V JH IH b n/a 37 4757 4779 4806 N
+ V JH IH e n/a 37 4757 4779 4807 N
+ V JH IH i n/a 37 4757 4779 4806 N
+ V JH IH s n/a 37 4757 4779 4806 N
+ V JH IY b n/a 37 4757 4779 4810 N
+ V JH IY e n/a 37 4757 4779 4810 N
+ V JH IY i n/a 37 4757 4779 4810 N
+ V JH IY s n/a 37 4757 4779 4810 N
+ V JH JH e n/a 37 4757 4786 4824 N
+ V JH JH s n/a 37 4757 4786 4817 N
+ V JH K b n/a 37 4757 4786 4813 N
+ V JH K e n/a 37 4757 4786 4813 N
+ V JH K s n/a 37 4757 4786 4813 N
+ V JH L b n/a 37 4757 4795 4828 N
+ V JH L e n/a 37 4757 4795 4828 N
+ V JH L s n/a 37 4757 4795 4828 N
+ V JH M e n/a 37 4757 4786 4825 N
+ V JH M s n/a 37 4757 4786 4825 N
+ V JH N e n/a 37 4757 4786 4825 N
+ V JH N s n/a 37 4757 4786 4825 N
+ V JH NG e n/a 37 4757 4786 4825 N
+ V JH NG s n/a 37 4757 4786 4825 N
+ V JH OW b n/a 37 4757 4780 4797 N
+ V JH OW e n/a 37 4757 4780 4797 N
+ V JH OW s n/a 37 4757 4780 4797 N
+ V JH OY b n/a 37 4757 4780 4797 N
+ V JH OY e n/a 37 4757 4780 4797 N
+ V JH OY s n/a 37 4757 4780 4797 N
+ V JH P b n/a 37 4757 4786 4813 N
+ V JH P e n/a 37 4757 4786 4813 N
+ V JH P s n/a 37 4757 4786 4813 N
+ V JH R b n/a 37 4757 4780 4827 N
+ V JH R e n/a 37 4757 4780 4829 N
+ V JH R s n/a 37 4757 4780 4827 N
+ V JH S b n/a 37 4757 4786 4819 N
+ V JH S e n/a 37 4757 4786 4819 N
+ V JH S s n/a 37 4757 4786 4819 N
+ V JH SH e n/a 37 4757 4786 4819 N
+ V JH SH s n/a 37 4757 4786 4819 N
+ V JH SIL e n/a 37 4757 4786 4816 N
+ V JH SIL s n/a 37 4757 4786 4816 N
+ V JH T b n/a 37 4757 4786 4813 N
+ V JH T e n/a 37 4757 4786 4813 N
+ V JH T s n/a 37 4757 4786 4813 N
+ V JH TH e n/a 37 4757 4786 4821 N
+ V JH TH s n/a 37 4757 4786 4821 N
+ V JH UH b n/a 37 4757 4780 4798 N
+ V JH UH e n/a 37 4757 4780 4798 N
+ V JH UH s n/a 37 4757 4780 4798 N
+ V JH UW b n/a 37 4757 4780 4797 N
+ V JH UW e n/a 37 4757 4780 4797 N
+ V JH UW s n/a 37 4757 4780 4797 N
+ V JH V e n/a 37 4757 4786 4824 N
+ V JH V s n/a 37 4757 4786 4818 N
+ V JH W b n/a 37 4757 4795 4828 N
+ V JH W e n/a 37 4757 4795 4828 N
+ V JH W s n/a 37 4757 4795 4828 N
+ V JH Y b n/a 37 4757 4786 4826 N
+ V JH Y e n/a 37 4757 4786 4826 N
+ V JH Y s n/a 37 4757 4786 4826 N
+ V JH Z b n/a 37 4757 4786 4818 N
+ V JH Z e n/a 37 4757 4786 4824 N
+ V JH Z s n/a 37 4757 4786 4818 N
+ V JH ZH e n/a 37 4757 4786 4824 N
+ V JH ZH s n/a 37 4757 4786 4818 N
+ V K AA b n/a 37 4757 4780 4796 N
+ V K AA i n/a 37 4757 4780 4796 N
+ V K AA s n/a 37 4757 4780 4796 N
+ V K AE b n/a 37 4757 4779 4803 N
+ V K AE i n/a 37 4757 4779 4803 N
+ V K AE s n/a 37 4757 4779 4803 N
+ V K AH b n/a 37 4757 4779 4798 N
+ V K AH i n/a 37 4757 4779 4812 N
+ V K AH s n/a 37 4757 4779 4798 N
+ V K AO b n/a 37 4757 4780 4797 N
+ V K AO s n/a 37 4757 4780 4797 N
+ V K AW b n/a 37 4757 4779 4803 N
+ V K AW s n/a 37 4757 4779 4803 N
+ V K AY b n/a 37 4757 4780 4796 N
+ V K AY i n/a 37 4757 4780 4796 N
+ V K AY s n/a 37 4757 4780 4796 N
+ V K B s n/a 37 4757 4786 4817 N
+ V K CH b n/a 37 4757 4786 4821 N
+ V K CH s n/a 37 4757 4786 4821 N
+ V K D b n/a 37 4757 4786 4817 N
+ V K D s n/a 37 4757 4786 4817 N
+ V K DH s n/a 37 4757 4792 4818 N
+ V K EH b n/a 37 4757 4779 4802 N
+ V K EH i n/a 37 4757 4779 4803 N
+ V K EH s n/a 37 4757 4779 4802 N
+ V K ER b n/a 37 4757 4780 4800 N
+ V K ER i n/a 37 4757 4780 4800 N
+ V K ER s n/a 37 4757 4780 4800 N
+ V K EY b n/a 37 4757 4779 4802 N
+ V K EY i n/a 37 4757 4779 4805 N
+ V K EY s n/a 37 4757 4779 4802 N
+ V K F s n/a 37 4757 4786 4819 N
+ V K G s n/a 37 4757 4786 4817 N
+ V K HH s n/a 37 4757 4786 4821 N
+ V K IH b n/a 37 4757 4779 4806 N
+ V K IH i n/a 37 4757 4779 4806 N
+ V K IH s n/a 37 4757 4779 4806 N
+ V K IY b n/a 37 4757 4779 4810 N
+ V K IY i n/a 37 4757 4779 4810 N
+ V K IY s n/a 37 4757 4779 4810 N
+ V K JH s n/a 37 4757 4786 4817 N
+ V K K b n/a 37 4757 4786 4813 N
+ V K K s n/a 37 4757 4786 4813 N
+ V K L b n/a 37 4757 4795 4828 N
+ V K L s n/a 37 4757 4795 4828 N
+ V K M s n/a 37 4757 4786 4825 N
+ V K N s n/a 37 4757 4786 4825 N
+ V K NG s n/a 37 4757 4786 4825 N
+ V K OW b n/a 37 4757 4780 4797 N
+ V K OW s n/a 37 4757 4780 4797 N
+ V K OY b n/a 37 4757 4780 4797 N
+ V K OY i n/a 37 4757 4780 4797 N
+ V K OY s n/a 37 4757 4780 4797 N
+ V K P b n/a 37 4757 4786 4813 N
+ V K P s n/a 37 4757 4786 4813 N
+ V K R b n/a 37 4757 4780 4827 N
+ V K R s n/a 37 4757 4780 4827 N
+ V K S b n/a 37 4757 4786 4819 N
+ V K S s n/a 37 4757 4786 4819 N
+ V K SH s n/a 37 4757 4786 4819 N
+ V K SIL s n/a 37 4757 4786 4816 N
+ V K T b n/a 37 4757 4786 4813 N
+ V K T s n/a 37 4757 4786 4813 N
+ V K TH s n/a 37 4757 4786 4821 N
+ V K UH b n/a 37 4757 4780 4798 N
+ V K UH s n/a 37 4757 4780 4798 N
+ V K UW b n/a 37 4757 4780 4797 N
+ V K UW s n/a 37 4757 4780 4797 N
+ V K V s n/a 37 4757 4786 4818 N
+ V K W b n/a 37 4757 4795 4828 N
+ V K W s n/a 37 4757 4795 4828 N
+ V K Y b n/a 37 4757 4786 4826 N
+ V K Y i n/a 37 4757 4786 4826 N
+ V K Y s n/a 37 4757 4786 4826 N
+ V K Z b n/a 37 4757 4786 4818 N
+ V K Z i n/a 37 4757 4786 4818 N
+ V K Z s n/a 37 4757 4786 4818 N
+ V K ZH s n/a 37 4757 4786 4818 N
+ V L AA b n/a 37 4755 4773 4796 N
+ V L AA e n/a 37 4755 4773 4796 N
+ V L AA i n/a 37 4755 4773 4796 N
+ V L AA s n/a 37 4755 4773 4796 N
+ V L AE b n/a 37 4755 4772 4803 N
+ V L AE e n/a 37 4755 4772 4804 N
+ V L AE i n/a 37 4755 4772 4803 N
+ V L AE s n/a 37 4755 4772 4803 N
+ V L AH b n/a 37 4755 4772 4798 N
+ V L AH e n/a 37 4755 4772 4798 N
+ V L AH i n/a 37 4755 4772 4811 N
+ V L AH s n/a 37 4755 4772 4798 N
+ V L AO b n/a 37 4755 4773 4797 N
+ V L AO e n/a 37 4755 4773 4797 N
+ V L AO i n/a 37 4755 4773 4797 N
+ V L AO s n/a 37 4755 4773 4797 N
+ V L AW b n/a 37 4755 4772 4803 N
+ V L AW e n/a 37 4755 4772 4804 N
+ V L AW s n/a 37 4755 4772 4803 N
+ V L AY b n/a 37 4755 4773 4796 N
+ V L AY e n/a 37 4755 4773 4796 N
+ V L AY i n/a 37 4755 4773 4796 N
+ V L AY s n/a 37 4755 4773 4796 N
+ V L B e n/a 37 4755 4786 4824 N
+ V L B s n/a 37 4755 4786 4821 N
+ V L CH b n/a 37 4755 4786 4821 N
+ V L CH e n/a 37 4755 4786 4821 N
+ V L CH s n/a 37 4755 4786 4821 N
+ V L D b n/a 37 4755 4786 4821 N
+ V L D e n/a 37 4755 4786 4824 N
+ V L D i n/a 37 4755 4786 4821 N
+ V L D s n/a 37 4755 4786 4821 N
+ V L DH e n/a 37 4755 4792 4824 N
+ V L DH s n/a 37 4755 4792 4821 N
+ V L EH b n/a 37 4755 4772 4802 N
+ V L EH e n/a 37 4755 4772 4804 N
+ V L EH i n/a 37 4755 4772 4803 N
+ V L EH s n/a 37 4755 4772 4802 N
+ V L ER b n/a 37 4755 4778 4801 N
+ V L ER e n/a 37 4755 4778 4801 N
+ V L ER i n/a 37 4755 4778 4801 N
+ V L ER s n/a 37 4755 4778 4801 N
+ V L EY b n/a 37 4755 4772 4802 N
+ V L EY e n/a 37 4755 4772 4804 N
+ V L EY i n/a 37 4755 4772 4805 N
+ V L EY s n/a 37 4755 4772 4802 N
+ V L F e n/a 37 4755 4786 4821 N
+ V L F s n/a 37 4755 4786 4821 N
+ V L G e n/a 37 4755 4786 4824 N
+ V L G i n/a 37 4755 4786 4821 N
+ V L G s n/a 37 4755 4786 4821 N
+ V L HH e n/a 37 4755 4786 4821 N
+ V L HH i n/a 37 4755 4786 4821 N
+ V L HH s n/a 37 4755 4786 4821 N
+ V L IH b n/a 37 4755 4772 4806 N
+ V L IH e n/a 37 4755 4772 4807 N
+ V L IH i n/a 37 4755 4772 4809 N
+ V L IH s n/a 37 4755 4772 4806 N
+ V L IY b n/a 37 4755 4772 4810 N
+ V L IY e n/a 37 4755 4772 4810 N
+ V L IY i n/a 37 4755 4772 4810 N
+ V L IY s n/a 37 4755 4772 4810 N
+ V L JH e n/a 37 4755 4786 4824 N
+ V L JH s n/a 37 4755 4786 4821 N
+ V L K b n/a 37 4755 4786 4813 N
+ V L K e n/a 37 4755 4786 4813 N
+ V L K s n/a 37 4755 4786 4813 N
+ V L L b n/a 37 4755 4795 4828 N
+ V L L e n/a 37 4755 4795 4828 N
+ V L L s n/a 37 4755 4795 4828 N
+ V L M e n/a 37 4755 4786 4825 N
+ V L M i n/a 37 4755 4786 4825 N
+ V L M s n/a 37 4755 4786 4825 N
+ V L N e n/a 37 4755 4786 4825 N
+ V L N s n/a 37 4755 4786 4825 N
+ V L NG e n/a 37 4755 4786 4825 N
+ V L NG s n/a 37 4755 4786 4825 N
+ V L OW b n/a 37 4755 4773 4797 N
+ V L OW e n/a 37 4755 4773 4797 N
+ V L OW i n/a 37 4755 4773 4797 N
+ V L OW s n/a 37 4755 4773 4797 N
+ V L OY b n/a 37 4755 4773 4797 N
+ V L OY e n/a 37 4755 4773 4797 N
+ V L OY s n/a 37 4755 4773 4797 N
+ V L P b n/a 37 4755 4786 4813 N
+ V L P e n/a 37 4755 4786 4813 N
+ V L P s n/a 37 4755 4786 4813 N
+ V L R b n/a 37 4755 4778 4827 N
+ V L R e n/a 37 4755 4778 4829 N
+ V L R i n/a 37 4755 4778 4827 N
+ V L R s n/a 37 4755 4778 4827 N
+ V L S b n/a 37 4755 4786 4820 N
+ V L S e n/a 37 4755 4786 4820 N
+ V L S s n/a 37 4755 4786 4820 N
+ V L SH e n/a 37 4755 4786 4820 N
+ V L SH s n/a 37 4755 4786 4820 N
+ V L SIL e n/a 37 4755 4786 4816 N
+ V L SIL s n/a 37 4755 4786 4816 N
+ V L T b n/a 37 4755 4786 4813 N
+ V L T e n/a 37 4755 4786 4813 N
+ V L T s n/a 37 4755 4786 4813 N
+ V L TH e n/a 37 4755 4786 4821 N
+ V L TH i n/a 37 4755 4786 4821 N
+ V L TH s n/a 37 4755 4786 4821 N
+ V L UH b n/a 37 4755 4773 4798 N
+ V L UH e n/a 37 4755 4773 4798 N
+ V L UH s n/a 37 4755 4773 4798 N
+ V L UW b n/a 37 4755 4773 4797 N
+ V L UW e n/a 37 4755 4773 4797 N
+ V L UW i n/a 37 4755 4773 4797 N
+ V L UW s n/a 37 4755 4773 4797 N
+ V L V e n/a 37 4755 4786 4824 N
+ V L V s n/a 37 4755 4786 4821 N
+ V L W b n/a 37 4755 4795 4828 N
+ V L W e n/a 37 4755 4795 4828 N
+ V L W i n/a 37 4755 4795 4828 N
+ V L W s n/a 37 4755 4795 4828 N
+ V L Y b n/a 37 4755 4786 4826 N
+ V L Y e n/a 37 4755 4786 4826 N
+ V L Y i n/a 37 4755 4786 4826 N
+ V L Y s n/a 37 4755 4786 4826 N
+ V L Z b n/a 37 4755 4786 4820 N
+ V L Z e n/a 37 4755 4786 4824 N
+ V L Z i n/a 37 4755 4786 4820 N
+ V L Z s n/a 37 4755 4786 4820 N
+ V L ZH e n/a 37 4755 4786 4824 N
+ V L ZH s n/a 37 4755 4786 4820 N
+ V M AA b n/a 37 4758 4780 4796 N
+ V M AA e n/a 37 4758 4780 4796 N
+ V M AA i n/a 37 4758 4780 4796 N
+ V M AA s n/a 37 4758 4780 4796 N
+ V M AE b n/a 37 4758 4779 4803 N
+ V M AE e n/a 37 4758 4779 4804 N
+ V M AE s n/a 37 4758 4779 4803 N
+ V M AH b n/a 37 4758 4779 4798 N
+ V M AH e n/a 37 4758 4779 4798 N
+ V M AH i n/a 37 4758 4779 4812 N
+ V M AH s n/a 37 4758 4779 4798 N
+ V M AO b n/a 37 4758 4780 4797 N
+ V M AO e n/a 37 4758 4780 4797 N
+ V M AO s n/a 37 4758 4780 4797 N
+ V M AW b n/a 37 4758 4779 4803 N
+ V M AW e n/a 37 4758 4779 4804 N
+ V M AW s n/a 37 4758 4779 4803 N
+ V M AY b n/a 37 4758 4780 4796 N
+ V M AY e n/a 37 4758 4780 4796 N
+ V M AY s n/a 37 4758 4780 4796 N
+ V M B e n/a 37 4758 4786 4824 N
+ V M B s n/a 37 4758 4786 4817 N
+ V M CH b n/a 37 4758 4786 4821 N
+ V M CH e n/a 37 4758 4786 4821 N
+ V M CH s n/a 37 4758 4786 4821 N
+ V M D b n/a 37 4758 4786 4817 N
+ V M D e n/a 37 4758 4786 4824 N
+ V M D s n/a 37 4758 4786 4817 N
+ V M DH e n/a 37 4758 4792 4824 N
+ V M DH s n/a 37 4758 4792 4818 N
+ V M EH b n/a 37 4758 4779 4802 N
+ V M EH e n/a 37 4758 4779 4804 N
+ V M EH i n/a 37 4758 4779 4803 N
+ V M EH s n/a 37 4758 4779 4802 N
+ V M ER b n/a 37 4758 4780 4800 N
+ V M ER e n/a 37 4758 4780 4800 N
+ V M ER i n/a 37 4758 4780 4800 N
+ V M ER s n/a 37 4758 4780 4800 N
+ V M EY b n/a 37 4758 4779 4802 N
+ V M EY e n/a 37 4758 4779 4804 N
+ V M EY s n/a 37 4758 4779 4802 N
+ V M F e n/a 37 4758 4786 4819 N
+ V M F s n/a 37 4758 4786 4819 N
+ V M G e n/a 37 4758 4786 4824 N
+ V M G s n/a 37 4758 4786 4817 N
+ V M HH e n/a 37 4758 4786 4821 N
+ V M HH s n/a 37 4758 4786 4821 N
+ V M IH b n/a 37 4758 4779 4806 N
+ V M IH e n/a 37 4758 4779 4807 N
+ V M IH i n/a 37 4758 4779 4806 N
+ V M IH s n/a 37 4758 4779 4806 N
+ V M IY b n/a 37 4758 4779 4810 N
+ V M IY e n/a 37 4758 4779 4810 N
+ V M IY i n/a 37 4758 4779 4810 N
+ V M IY s n/a 37 4758 4779 4810 N
+ V M JH e n/a 37 4758 4786 4824 N
+ V M JH s n/a 37 4758 4786 4817 N
+ V M K b n/a 37 4758 4786 4813 N
+ V M K e n/a 37 4758 4786 4813 N
+ V M K s n/a 37 4758 4786 4813 N
+ V M L b n/a 37 4758 4795 4828 N
+ V M L e n/a 37 4758 4795 4828 N
+ V M L s n/a 37 4758 4795 4828 N
+ V M M e n/a 37 4758 4786 4825 N
+ V M M s n/a 37 4758 4786 4825 N
+ V M N e n/a 37 4758 4786 4825 N
+ V M N s n/a 37 4758 4786 4825 N
+ V M NG e n/a 37 4758 4786 4825 N
+ V M NG s n/a 37 4758 4786 4825 N
+ V M OW b n/a 37 4758 4780 4797 N
+ V M OW e n/a 37 4758 4780 4797 N
+ V M OW s n/a 37 4758 4780 4797 N
+ V M OY b n/a 37 4758 4780 4797 N
+ V M OY e n/a 37 4758 4780 4797 N
+ V M OY s n/a 37 4758 4780 4797 N
+ V M P b n/a 37 4758 4786 4813 N
+ V M P e n/a 37 4758 4786 4813 N
+ V M P s n/a 37 4758 4786 4813 N
+ V M R b n/a 37 4758 4780 4827 N
+ V M R e n/a 37 4758 4780 4829 N
+ V M R s n/a 37 4758 4780 4827 N
+ V M S b n/a 37 4758 4786 4819 N
+ V M S e n/a 37 4758 4786 4819 N
+ V M S s n/a 37 4758 4786 4819 N
+ V M SH e n/a 37 4758 4786 4819 N
+ V M SH s n/a 37 4758 4786 4819 N
+ V M SIL e n/a 37 4758 4786 4816 N
+ V M SIL s n/a 37 4758 4786 4816 N
+ V M T b n/a 37 4758 4786 4813 N
+ V M T e n/a 37 4758 4786 4813 N
+ V M T s n/a 37 4758 4786 4813 N
+ V M TH e n/a 37 4758 4786 4821 N
+ V M TH s n/a 37 4758 4786 4821 N
+ V M UH b n/a 37 4758 4780 4798 N
+ V M UH e n/a 37 4758 4780 4798 N
+ V M UH s n/a 37 4758 4780 4798 N
+ V M UW b n/a 37 4758 4780 4797 N
+ V M UW e n/a 37 4758 4780 4797 N
+ V M UW i n/a 37 4758 4780 4797 N
+ V M UW s n/a 37 4758 4780 4797 N
+ V M V e n/a 37 4758 4786 4824 N
+ V M V s n/a 37 4758 4786 4818 N
+ V M W b n/a 37 4758 4795 4828 N
+ V M W e n/a 37 4758 4795 4828 N
+ V M W s n/a 37 4758 4795 4828 N
+ V M Y b n/a 37 4758 4786 4826 N
+ V M Y e n/a 37 4758 4786 4826 N
+ V M Y s n/a 37 4758 4786 4826 N
+ V M Z b n/a 37 4758 4786 4818 N
+ V M Z e n/a 37 4758 4786 4824 N
+ V M Z s n/a 37 4758 4786 4818 N
+ V M ZH e n/a 37 4758 4786 4824 N
+ V M ZH s n/a 37 4758 4786 4818 N
+ V N AA b n/a 37 4758 4780 4796 N
+ V N AA i n/a 37 4758 4780 4796 N
+ V N AA s n/a 37 4758 4780 4796 N
+ V N AE b n/a 37 4758 4779 4803 N
+ V N AE i n/a 37 4758 4779 4803 N
+ V N AE s n/a 37 4758 4779 4803 N
+ V N AH b n/a 37 4758 4779 4798 N
+ V N AH i n/a 37 4758 4779 4812 N
+ V N AH s n/a 37 4758 4779 4798 N
+ V N AO b n/a 37 4758 4780 4797 N
+ V N AO i n/a 37 4758 4780 4797 N
+ V N AO s n/a 37 4758 4780 4797 N
+ V N AW b n/a 37 4758 4779 4803 N
+ V N AW s n/a 37 4758 4779 4803 N
+ V N AY b n/a 37 4758 4780 4796 N
+ V N AY i n/a 37 4758 4780 4796 N
+ V N AY s n/a 37 4758 4780 4796 N
+ V N B s n/a 37 4758 4786 4817 N
+ V N CH b n/a 37 4758 4786 4821 N
+ V N CH s n/a 37 4758 4786 4821 N
+ V N D b n/a 37 4758 4786 4817 N
+ V N D s n/a 37 4758 4786 4817 N
+ V N DH s n/a 37 4758 4792 4818 N
+ V N EH b n/a 37 4758 4779 4802 N
+ V N EH i n/a 37 4758 4779 4803 N
+ V N EH s n/a 37 4758 4779 4802 N
+ V N ER b n/a 37 4758 4780 4800 N
+ V N ER i n/a 37 4758 4780 4800 N
+ V N ER s n/a 37 4758 4780 4800 N
+ V N EY b n/a 37 4758 4779 4802 N
+ V N EY i n/a 37 4758 4779 4805 N
+ V N EY s n/a 37 4758 4779 4802 N
+ V N F s n/a 37 4758 4786 4819 N
+ V N G s n/a 37 4758 4786 4817 N
+ V N HH i n/a 37 4758 4786 4821 N
+ V N HH s n/a 37 4758 4786 4821 N
+ V N IH b n/a 37 4758 4779 4806 N
+ V N IH i n/a 37 4758 4779 4806 N
+ V N IH s n/a 37 4758 4779 4806 N
+ V N IY b n/a 37 4758 4779 4810 N
+ V N IY i n/a 37 4758 4779 4810 N
+ V N IY s n/a 37 4758 4779 4810 N
+ V N JH s n/a 37 4758 4786 4817 N
+ V N K b n/a 37 4758 4786 4813 N
+ V N K s n/a 37 4758 4786 4813 N
+ V N L b n/a 37 4758 4795 4828 N
+ V N L i n/a 37 4758 4795 4828 N
+ V N L s n/a 37 4758 4795 4828 N
+ V N M s n/a 37 4758 4786 4825 N
+ V N N s n/a 37 4758 4786 4825 N
+ V N NG s n/a 37 4758 4786 4825 N
+ V N OW b n/a 37 4758 4780 4797 N
+ V N OW i n/a 37 4758 4780 4797 N
+ V N OW s n/a 37 4758 4780 4797 N
+ V N OY b n/a 37 4758 4780 4797 N
+ V N OY i n/a 37 4758 4780 4797 N
+ V N OY s n/a 37 4758 4780 4797 N
+ V N P b n/a 37 4758 4786 4813 N
+ V N P s n/a 37 4758 4786 4813 N
+ V N R b n/a 37 4758 4780 4827 N
+ V N R i n/a 37 4758 4780 4827 N
+ V N R s n/a 37 4758 4780 4827 N
+ V N S b n/a 37 4758 4786 4819 N
+ V N S s n/a 37 4758 4786 4819 N
+ V N SH s n/a 37 4758 4786 4819 N
+ V N SIL s n/a 37 4758 4786 4816 N
+ V N T b n/a 37 4758 4786 4813 N
+ V N T s n/a 37 4758 4786 4813 N
+ V N TH s n/a 37 4758 4786 4821 N
+ V N UH b n/a 37 4758 4780 4798 N
+ V N UH i n/a 37 4758 4780 4798 N
+ V N UH s n/a 37 4758 4780 4798 N
+ V N UW b n/a 37 4758 4780 4797 N
+ V N UW s n/a 37 4758 4780 4797 N
+ V N V s n/a 37 4758 4786 4818 N
+ V N W b n/a 37 4758 4795 4828 N
+ V N W s n/a 37 4758 4795 4828 N
+ V N Y b n/a 37 4758 4786 4826 N
+ V N Y i n/a 37 4758 4786 4826 N
+ V N Y s n/a 37 4758 4786 4826 N
+ V N Z b n/a 37 4758 4786 4818 N
+ V N Z s n/a 37 4758 4786 4818 N
+ V N ZH s n/a 37 4758 4786 4818 N
+ V NG AA b n/a 37 4758 4780 4796 N
+ V NG AA i n/a 37 4758 4780 4796 N
+ V NG AA s n/a 37 4758 4780 4796 N
+ V NG AE b n/a 37 4758 4779 4803 N
+ V NG AE s n/a 37 4758 4779 4803 N
+ V NG AH b n/a 37 4758 4779 4798 N
+ V NG AH s n/a 37 4758 4779 4798 N
+ V NG AO b n/a 37 4758 4780 4797 N
+ V NG AO s n/a 37 4758 4780 4797 N
+ V NG AW b n/a 37 4758 4779 4803 N
+ V NG AW s n/a 37 4758 4779 4803 N
+ V NG AY b n/a 37 4758 4780 4796 N
+ V NG AY s n/a 37 4758 4780 4796 N
+ V NG B s n/a 37 4758 4786 4817 N
+ V NG CH b n/a 37 4758 4786 4821 N
+ V NG CH s n/a 37 4758 4786 4821 N
+ V NG D b n/a 37 4758 4786 4817 N
+ V NG D s n/a 37 4758 4786 4817 N
+ V NG DH s n/a 37 4758 4792 4818 N
+ V NG EH b n/a 37 4758 4779 4802 N
+ V NG EH s n/a 37 4758 4779 4802 N
+ V NG ER b n/a 37 4758 4780 4800 N
+ V NG ER s n/a 37 4758 4780 4800 N
+ V NG EY b n/a 37 4758 4779 4802 N
+ V NG EY i n/a 37 4758 4779 4805 N
+ V NG EY s n/a 37 4758 4779 4802 N
+ V NG F s n/a 37 4758 4786 4819 N
+ V NG G s n/a 37 4758 4786 4817 N
+ V NG HH s n/a 37 4758 4786 4821 N
+ V NG IH b n/a 37 4758 4779 4806 N
+ V NG IH i n/a 37 4758 4779 4806 N
+ V NG IH s n/a 37 4758 4779 4806 N
+ V NG IY b n/a 37 4758 4779 4810 N
+ V NG IY s n/a 37 4758 4779 4810 N
+ V NG JH s n/a 37 4758 4786 4817 N
+ V NG K b n/a 37 4758 4786 4813 N
+ V NG K s n/a 37 4758 4786 4813 N
+ V NG L b n/a 37 4758 4795 4828 N
+ V NG L s n/a 37 4758 4795 4828 N
+ V NG M s n/a 37 4758 4786 4825 N
+ V NG N s n/a 37 4758 4786 4825 N
+ V NG NG s n/a 37 4758 4786 4825 N
+ V NG OW b n/a 37 4758 4780 4797 N
+ V NG OW s n/a 37 4758 4780 4797 N
+ V NG OY b n/a 37 4758 4780 4797 N
+ V NG OY s n/a 37 4758 4780 4797 N
+ V NG P b n/a 37 4758 4786 4813 N
+ V NG P s n/a 37 4758 4786 4813 N
+ V NG R b n/a 37 4758 4780 4827 N
+ V NG R s n/a 37 4758 4780 4827 N
+ V NG S b n/a 37 4758 4786 4819 N
+ V NG S s n/a 37 4758 4786 4819 N
+ V NG SH s n/a 37 4758 4786 4819 N
+ V NG SIL s n/a 37 4758 4786 4816 N
+ V NG T b n/a 37 4758 4786 4813 N
+ V NG T s n/a 37 4758 4786 4813 N
+ V NG TH s n/a 37 4758 4786 4821 N
+ V NG UH b n/a 37 4758 4780 4798 N
+ V NG UH s n/a 37 4758 4780 4798 N
+ V NG UW b n/a 37 4758 4780 4797 N
+ V NG UW s n/a 37 4758 4780 4797 N
+ V NG V s n/a 37 4758 4786 4818 N
+ V NG W b n/a 37 4758 4795 4828 N
+ V NG W s n/a 37 4758 4795 4828 N
+ V NG Y b n/a 37 4758 4786 4826 N
+ V NG Y i n/a 37 4758 4786 4826 N
+ V NG Y s n/a 37 4758 4786 4826 N
+ V NG Z b n/a 37 4758 4786 4818 N
+ V NG Z s n/a 37 4758 4786 4818 N
+ V NG ZH s n/a 37 4758 4786 4818 N
+ V OW AA b n/a 37 4756 4773 4796 N
+ V OW AA e n/a 37 4756 4773 4796 N
+ V OW AA i n/a 37 4756 4773 4796 N
+ V OW AA s n/a 37 4756 4773 4796 N
+ V OW AE b n/a 37 4756 4772 4803 N
+ V OW AE e n/a 37 4756 4772 4804 N
+ V OW AE i n/a 37 4756 4772 4803 N
+ V OW AE s n/a 37 4756 4772 4803 N
+ V OW AH b n/a 37 4756 4772 4798 N
+ V OW AH e n/a 37 4756 4772 4798 N
+ V OW AH i n/a 37 4756 4772 4811 N
+ V OW AH s n/a 37 4756 4772 4798 N
+ V OW AO b n/a 37 4756 4773 4797 N
+ V OW AO e n/a 37 4756 4773 4797 N
+ V OW AO i n/a 37 4756 4773 4797 N
+ V OW AO s n/a 37 4756 4773 4797 N
+ V OW AW b n/a 37 4756 4772 4803 N
+ V OW AW e n/a 37 4756 4772 4804 N
+ V OW AW s n/a 37 4756 4772 4803 N
+ V OW AY b n/a 37 4756 4773 4796 N
+ V OW AY e n/a 37 4756 4773 4796 N
+ V OW AY i n/a 37 4756 4773 4796 N
+ V OW AY s n/a 37 4756 4773 4796 N
+ V OW B e n/a 37 4756 4786 4824 N
+ V OW B s n/a 37 4756 4786 4817 N
+ V OW CH b n/a 37 4756 4786 4821 N
+ V OW CH e n/a 37 4756 4786 4821 N
+ V OW CH s n/a 37 4756 4786 4821 N
+ V OW D b n/a 37 4756 4786 4817 N
+ V OW D e n/a 37 4756 4786 4824 N
+ V OW D i n/a 37 4756 4786 4817 N
+ V OW D s n/a 37 4756 4786 4817 N
+ V OW DH e n/a 37 4756 4792 4824 N
+ V OW DH s n/a 37 4756 4792 4818 N
+ V OW EH b n/a 37 4756 4772 4802 N
+ V OW EH e n/a 37 4756 4772 4804 N
+ V OW EH i n/a 37 4756 4772 4803 N
+ V OW EH s n/a 37 4756 4772 4802 N
+ V OW ER b n/a 37 4754 4778 4801 N
+ V OW ER e n/a 37 4754 4778 4801 N
+ V OW ER i n/a 37 4754 4778 4801 N
+ V OW ER s n/a 37 4754 4778 4801 N
+ V OW EY b n/a 37 4756 4772 4802 N
+ V OW EY e n/a 37 4756 4772 4804 N
+ V OW EY i n/a 37 4756 4772 4805 N
+ V OW EY s n/a 37 4756 4772 4802 N
+ V OW F e n/a 37 4756 4786 4819 N
+ V OW F s n/a 37 4756 4786 4819 N
+ V OW G e n/a 37 4756 4786 4824 N
+ V OW G s n/a 37 4756 4786 4817 N
+ V OW HH e n/a 37 4756 4786 4821 N
+ V OW HH s n/a 37 4756 4786 4821 N
+ V OW IH b n/a 37 4756 4772 4806 N
+ V OW IH e n/a 37 4756 4772 4807 N
+ V OW IH i n/a 37 4756 4772 4809 N
+ V OW IH s n/a 37 4756 4772 4806 N
+ V OW IY b n/a 37 4756 4772 4810 N
+ V OW IY e n/a 37 4756 4772 4810 N
+ V OW IY i n/a 37 4756 4772 4810 N
+ V OW IY s n/a 37 4756 4772 4810 N
+ V OW JH e n/a 37 4756 4786 4824 N
+ V OW JH s n/a 37 4756 4786 4817 N
+ V OW K b n/a 37 4756 4786 4813 N
+ V OW K e n/a 37 4756 4786 4813 N
+ V OW K i n/a 37 4756 4786 4813 N
+ V OW K s n/a 37 4756 4786 4813 N
+ V OW L b n/a 37 4756 4795 4828 N
+ V OW L e n/a 37 4756 4795 4828 N
+ V OW L i n/a 37 4756 4795 4828 N
+ V OW L s n/a 37 4756 4795 4828 N
+ V OW M e n/a 37 4756 4786 4825 N
+ V OW M i n/a 37 4756 4786 4825 N
+ V OW M s n/a 37 4756 4786 4825 N
+ V OW N e n/a 37 4756 4786 4825 N
+ V OW N i n/a 37 4756 4786 4825 N
+ V OW N s n/a 37 4756 4786 4825 N
+ V OW NG e n/a 37 4756 4786 4825 N
+ V OW NG s n/a 37 4756 4786 4825 N
+ V OW OW b n/a 37 4756 4773 4797 N
+ V OW OW e n/a 37 4756 4773 4797 N
+ V OW OW i n/a 37 4756 4773 4797 N
+ V OW OW s n/a 37 4756 4773 4797 N
+ V OW OY b n/a 37 4756 4773 4797 N
+ V OW OY e n/a 37 4756 4773 4797 N
+ V OW OY i n/a 37 4756 4773 4797 N
+ V OW OY s n/a 37 4756 4773 4797 N
+ V OW P b n/a 37 4756 4786 4813 N
+ V OW P e n/a 37 4756 4786 4813 N
+ V OW P s n/a 37 4756 4786 4813 N
+ V OW R b n/a 37 4754 4778 4827 N
+ V OW R e n/a 37 4754 4778 4829 N
+ V OW R i n/a 37 4754 4778 4827 N
+ V OW R s n/a 37 4754 4778 4827 N
+ V OW S b n/a 37 4756 4786 4819 N
+ V OW S e n/a 37 4756 4786 4819 N
+ V OW S i n/a 37 4756 4786 4819 N
+ V OW S s n/a 37 4756 4786 4819 N
+ V OW SH e n/a 37 4756 4786 4819 N
+ V OW SH s n/a 37 4756 4786 4819 N
+ V OW SIL e n/a 37 4756 4786 4816 N
+ V OW SIL s n/a 37 4756 4786 4816 N
+ V OW T b n/a 37 4756 4786 4813 N
+ V OW T e n/a 37 4756 4786 4813 N
+ V OW T s n/a 37 4756 4786 4813 N
+ V OW TH e n/a 37 4756 4786 4821 N
+ V OW TH s n/a 37 4756 4786 4821 N
+ V OW UH b n/a 37 4756 4773 4798 N
+ V OW UH e n/a 37 4756 4773 4798 N
+ V OW UH s n/a 37 4756 4773 4798 N
+ V OW UW b n/a 37 4756 4773 4797 N
+ V OW UW e n/a 37 4756 4773 4797 N
+ V OW UW s n/a 37 4756 4773 4797 N
+ V OW V e n/a 37 4756 4786 4824 N
+ V OW V i n/a 37 4756 4786 4818 N
+ V OW V s n/a 37 4756 4786 4818 N
+ V OW W b n/a 37 4756 4795 4828 N
+ V OW W e n/a 37 4756 4795 4828 N
+ V OW W s n/a 37 4756 4795 4828 N
+ V OW Y b n/a 37 4756 4786 4826 N
+ V OW Y e n/a 37 4756 4786 4826 N
+ V OW Y i n/a 37 4756 4786 4826 N
+ V OW Y s n/a 37 4756 4786 4826 N
+ V OW Z b n/a 37 4756 4786 4818 N
+ V OW Z e n/a 37 4756 4786 4824 N
+ V OW Z i n/a 37 4756 4786 4818 N
+ V OW Z s n/a 37 4756 4786 4818 N
+ V OW ZH e n/a 37 4756 4786 4824 N
+ V OW ZH s n/a 37 4756 4786 4818 N
+ V OY AA b n/a 37 4764 4773 4796 N
+ V OY AA s n/a 37 4764 4773 4796 N
+ V OY AE b n/a 37 4764 4782 4803 N
+ V OY AE i n/a 37 4764 4782 4803 N
+ V OY AE s n/a 37 4764 4782 4803 N
+ V OY AH b n/a 37 4764 4782 4798 N
+ V OY AH i n/a 37 4764 4782 4812 N
+ V OY AH s n/a 37 4764 4782 4798 N
+ V OY AO b n/a 37 4764 4773 4797 N
+ V OY AO s n/a 37 4764 4773 4797 N
+ V OY AW b n/a 37 4764 4782 4803 N
+ V OY AW s n/a 37 4764 4782 4803 N
+ V OY AY b n/a 37 4764 4773 4796 N
+ V OY AY s n/a 37 4764 4773 4796 N
+ V OY B s n/a 37 4764 4783 4817 N
+ V OY CH b n/a 37 4764 4783 4821 N
+ V OY CH s n/a 37 4764 4783 4821 N
+ V OY D b n/a 37 4764 4783 4817 N
+ V OY D s n/a 37 4764 4783 4817 N
+ V OY DH s n/a 37 4764 4783 4818 N
+ V OY EH b n/a 37 4764 4782 4802 N
+ V OY EH s n/a 37 4764 4782 4802 N
+ V OY ER b n/a 37 4764 4767 4799 N
+ V OY ER s n/a 37 4764 4767 4799 N
+ V OY EY b n/a 37 4764 4782 4802 N
+ V OY EY s n/a 37 4764 4782 4802 N
+ V OY F s n/a 37 4764 4783 4819 N
+ V OY G s n/a 37 4764 4783 4817 N
+ V OY HH s n/a 37 4764 4783 4821 N
+ V OY IH b n/a 37 4764 4782 4806 N
+ V OY IH i n/a 37 4764 4782 4809 N
+ V OY IH s n/a 37 4764 4782 4806 N
+ V OY IY b n/a 37 4764 4782 4810 N
+ V OY IY s n/a 37 4764 4782 4810 N
+ V OY JH s n/a 37 4764 4783 4817 N
+ V OY K b n/a 37 4764 4783 4815 N
+ V OY K s n/a 37 4764 4783 4815 N
+ V OY L b n/a 37 4764 4783 4828 N
+ V OY L s n/a 37 4764 4783 4828 N
+ V OY M s n/a 37 4764 4783 4825 N
+ V OY N s n/a 37 4764 4783 4825 N
+ V OY NG s n/a 37 4764 4783 4825 N
+ V OY OW b n/a 37 4764 4773 4797 N
+ V OY OW s n/a 37 4764 4773 4797 N
+ V OY OY b n/a 37 4764 4773 4797 N
+ V OY OY s n/a 37 4764 4773 4797 N
+ V OY P b n/a 37 4764 4783 4815 N
+ V OY P s n/a 37 4764 4783 4815 N
+ V OY R b n/a 37 4764 4783 4827 N
+ V OY R s n/a 37 4764 4783 4827 N
+ V OY S b n/a 37 4764 4783 4819 N
+ V OY S s n/a 37 4764 4783 4819 N
+ V OY SH s n/a 37 4764 4783 4819 N
+ V OY SIL s n/a 37 4764 4783 4815 N
+ V OY T b n/a 37 4764 4783 4815 N
+ V OY T s n/a 37 4764 4783 4815 N
+ V OY TH s n/a 37 4764 4783 4821 N
+ V OY UH b n/a 37 4764 4773 4798 N
+ V OY UH s n/a 37 4764 4773 4798 N
+ V OY UW b n/a 37 4764 4773 4797 N
+ V OY UW s n/a 37 4764 4773 4797 N
+ V OY V s n/a 37 4764 4783 4818 N
+ V OY W b n/a 37 4764 4783 4828 N
+ V OY W s n/a 37 4764 4783 4828 N
+ V OY Y b n/a 37 4764 4783 4826 N
+ V OY Y s n/a 37 4764 4783 4826 N
+ V OY Z b n/a 37 4764 4783 4818 N
+ V OY Z s n/a 37 4764 4783 4818 N
+ V OY ZH s n/a 37 4764 4783 4818 N
+ V P AA b n/a 37 4757 4780 4796 N
+ V P AA e n/a 37 4757 4780 4796 N
+ V P AA s n/a 37 4757 4780 4796 N
+ V P AE b n/a 37 4757 4779 4803 N
+ V P AE e n/a 37 4757 4779 4804 N
+ V P AE s n/a 37 4757 4779 4803 N
+ V P AH b n/a 37 4757 4779 4798 N
+ V P AH e n/a 37 4757 4779 4798 N
+ V P AH s n/a 37 4757 4779 4798 N
+ V P AO b n/a 37 4757 4780 4797 N
+ V P AO e n/a 37 4757 4780 4797 N
+ V P AO s n/a 37 4757 4780 4797 N
+ V P AW b n/a 37 4757 4779 4803 N
+ V P AW e n/a 37 4757 4779 4804 N
+ V P AW s n/a 37 4757 4779 4803 N
+ V P AY b n/a 37 4757 4780 4796 N
+ V P AY e n/a 37 4757 4780 4796 N
+ V P AY i n/a 37 4757 4780 4796 N
+ V P AY s n/a 37 4757 4780 4796 N
+ V P B e n/a 37 4757 4786 4824 N
+ V P B s n/a 37 4757 4786 4817 N
+ V P CH b n/a 37 4757 4786 4821 N
+ V P CH e n/a 37 4757 4786 4821 N
+ V P CH s n/a 37 4757 4786 4821 N
+ V P D b n/a 37 4757 4786 4817 N
+ V P D e n/a 37 4757 4786 4824 N
+ V P D s n/a 37 4757 4786 4817 N
+ V P DH e n/a 37 4757 4792 4824 N
+ V P DH s n/a 37 4757 4792 4818 N
+ V P EH b n/a 37 4757 4779 4802 N
+ V P EH e n/a 37 4757 4779 4804 N
+ V P EH s n/a 37 4757 4779 4802 N
+ V P ER b n/a 37 4757 4780 4800 N
+ V P ER e n/a 37 4757 4780 4800 N
+ V P ER s n/a 37 4757 4780 4800 N
+ V P EY b n/a 37 4757 4779 4802 N
+ V P EY e n/a 37 4757 4779 4804 N
+ V P EY s n/a 37 4757 4779 4802 N
+ V P F e n/a 37 4757 4786 4819 N
+ V P F s n/a 37 4757 4786 4819 N
+ V P G e n/a 37 4757 4786 4824 N
+ V P G s n/a 37 4757 4786 4817 N
+ V P HH e n/a 37 4757 4786 4821 N
+ V P HH s n/a 37 4757 4786 4821 N
+ V P IH b n/a 37 4757 4779 4806 N
+ V P IH e n/a 37 4757 4779 4807 N
+ V P IH i n/a 37 4757 4779 4806 N
+ V P IH s n/a 37 4757 4779 4806 N
+ V P IY b n/a 37 4757 4779 4810 N
+ V P IY e n/a 37 4757 4779 4810 N
+ V P IY s n/a 37 4757 4779 4810 N
+ V P JH e n/a 37 4757 4786 4824 N
+ V P JH s n/a 37 4757 4786 4817 N
+ V P K b n/a 37 4757 4786 4813 N
+ V P K e n/a 37 4757 4786 4813 N
+ V P K s n/a 37 4757 4786 4813 N
+ V P L b n/a 37 4757 4795 4828 N
+ V P L e n/a 37 4757 4795 4828 N
+ V P L s n/a 37 4757 4795 4828 N
+ V P M e n/a 37 4757 4786 4825 N
+ V P M s n/a 37 4757 4786 4825 N
+ V P N e n/a 37 4757 4786 4825 N
+ V P N s n/a 37 4757 4786 4825 N
+ V P NG e n/a 37 4757 4786 4825 N
+ V P NG s n/a 37 4757 4786 4825 N
+ V P OW b n/a 37 4757 4780 4797 N
+ V P OW e n/a 37 4757 4780 4797 N
+ V P OW s n/a 37 4757 4780 4797 N
+ V P OY b n/a 37 4757 4780 4797 N
+ V P OY e n/a 37 4757 4780 4797 N
+ V P OY s n/a 37 4757 4780 4797 N
+ V P P b n/a 37 4757 4786 4813 N
+ V P P e n/a 37 4757 4786 4813 N
+ V P P s n/a 37 4757 4786 4813 N
+ V P R b n/a 37 4757 4780 4827 N
+ V P R e n/a 37 4757 4780 4829 N
+ V P R s n/a 37 4757 4780 4827 N
+ V P S b n/a 37 4757 4786 4819 N
+ V P S e n/a 37 4757 4786 4819 N
+ V P S i n/a 37 4757 4786 4819 N
+ V P S s n/a 37 4757 4786 4819 N
+ V P SH e n/a 37 4757 4786 4819 N
+ V P SH s n/a 37 4757 4786 4819 N
+ V P SIL e n/a 37 4757 4786 4816 N
+ V P SIL s n/a 37 4757 4786 4816 N
+ V P T b n/a 37 4757 4786 4813 N
+ V P T e n/a 37 4757 4786 4813 N
+ V P T s n/a 37 4757 4786 4813 N
+ V P TH e n/a 37 4757 4786 4821 N
+ V P TH s n/a 37 4757 4786 4821 N
+ V P UH b n/a 37 4757 4780 4798 N
+ V P UH e n/a 37 4757 4780 4798 N
+ V P UH s n/a 37 4757 4780 4798 N
+ V P UW b n/a 37 4757 4780 4797 N
+ V P UW e n/a 37 4757 4780 4797 N
+ V P UW s n/a 37 4757 4780 4797 N
+ V P V e n/a 37 4757 4786 4824 N
+ V P V s n/a 37 4757 4786 4818 N
+ V P W b n/a 37 4757 4795 4828 N
+ V P W e n/a 37 4757 4795 4828 N
+ V P W s n/a 37 4757 4795 4828 N
+ V P Y b n/a 37 4757 4786 4826 N
+ V P Y e n/a 37 4757 4786 4826 N
+ V P Y s n/a 37 4757 4786 4826 N
+ V P Z b n/a 37 4757 4786 4818 N
+ V P Z e n/a 37 4757 4786 4824 N
+ V P Z s n/a 37 4757 4786 4818 N
+ V P ZH e n/a 37 4757 4786 4824 N
+ V P ZH s n/a 37 4757 4786 4818 N
+ V R AA b n/a 37 4751 4773 4796 N
+ V R AA e n/a 37 4751 4773 4796 N
+ V R AA i n/a 37 4751 4773 4796 N
+ V R AA s n/a 37 4751 4773 4796 N
+ V R AE b n/a 37 4751 4777 4803 N
+ V R AE e n/a 37 4751 4777 4804 N
+ V R AE i n/a 37 4751 4777 4803 N
+ V R AE s n/a 37 4751 4777 4803 N
+ V R AH b n/a 37 4751 4777 4798 N
+ V R AH e n/a 37 4751 4777 4798 N
+ V R AH i n/a 37 4751 4777 4812 N
+ V R AH s n/a 37 4751 4777 4798 N
+ V R AO b n/a 37 4751 4773 4797 N
+ V R AO e n/a 37 4751 4773 4797 N
+ V R AO i n/a 37 4751 4773 4797 N
+ V R AO s n/a 37 4751 4773 4797 N
+ V R AW b n/a 37 4751 4777 4803 N
+ V R AW e n/a 37 4751 4777 4804 N
+ V R AW s n/a 37 4751 4777 4803 N
+ V R AY b n/a 37 4751 4773 4796 N
+ V R AY e n/a 37 4751 4773 4796 N
+ V R AY s n/a 37 4751 4773 4796 N
+ V R B e n/a 37 4751 4790 4824 N
+ V R B s n/a 37 4751 4790 4817 N
+ V R CH b n/a 37 4751 4790 4821 N
+ V R CH e n/a 37 4751 4790 4821 N
+ V R CH s n/a 37 4751 4790 4821 N
+ V R D b n/a 37 4751 4790 4817 N
+ V R D e n/a 37 4751 4790 4824 N
+ V R D i n/a 37 4751 4790 4817 N
+ V R D s n/a 37 4751 4790 4817 N
+ V R DH e n/a 37 4751 4792 4824 N
+ V R DH s n/a 37 4751 4792 4818 N
+ V R EH b n/a 37 4751 4777 4802 N
+ V R EH e n/a 37 4751 4777 4804 N
+ V R EH i n/a 37 4751 4777 4803 N
+ V R EH s n/a 37 4751 4777 4802 N
+ V R ER b n/a 37 4751 4778 4801 N
+ V R ER e n/a 37 4751 4778 4801 N
+ V R ER i n/a 37 4751 4778 4801 N
+ V R ER s n/a 37 4751 4778 4801 N
+ V R EY b n/a 37 4751 4777 4802 N
+ V R EY e n/a 37 4751 4777 4804 N
+ V R EY i n/a 37 4751 4777 4805 N
+ V R EY s n/a 37 4751 4777 4802 N
+ V R F e n/a 37 4751 4790 4819 N
+ V R F s n/a 37 4751 4790 4819 N
+ V R G e n/a 37 4751 4790 4824 N
+ V R G s n/a 37 4751 4790 4817 N
+ V R HH e n/a 37 4751 4790 4821 N
+ V R HH s n/a 37 4751 4790 4821 N
+ V R IH b n/a 37 4751 4777 4806 N
+ V R IH e n/a 37 4751 4777 4807 N
+ V R IH i n/a 37 4751 4777 4809 N
+ V R IH s n/a 37 4751 4777 4806 N
+ V R IY b n/a 37 4751 4777 4810 N
+ V R IY e n/a 37 4751 4777 4810 N
+ V R IY i n/a 37 4751 4777 4810 N
+ V R IY s n/a 37 4751 4777 4810 N
+ V R JH e n/a 37 4751 4790 4824 N
+ V R JH s n/a 37 4751 4790 4817 N
+ V R K b n/a 37 4751 4790 4813 N
+ V R K e n/a 37 4751 4790 4813 N
+ V R K s n/a 37 4751 4790 4813 N
+ V R L b n/a 37 4751 4795 4828 N
+ V R L e n/a 37 4751 4795 4828 N
+ V R L i n/a 37 4751 4795 4828 N
+ V R L s n/a 37 4751 4795 4828 N
+ V R M e n/a 37 4751 4790 4825 N
+ V R M s n/a 37 4751 4790 4825 N
+ V R N e n/a 37 4751 4790 4825 N
+ V R N s n/a 37 4751 4790 4825 N
+ V R NG e n/a 37 4751 4790 4825 N
+ V R NG s n/a 37 4751 4790 4825 N
+ V R OW b n/a 37 4751 4773 4797 N
+ V R OW e n/a 37 4751 4773 4797 N
+ V R OW i n/a 37 4751 4773 4797 N
+ V R OW s n/a 37 4751 4773 4797 N
+ V R OY b n/a 37 4751 4773 4797 N
+ V R OY e n/a 37 4751 4773 4797 N
+ V R OY i n/a 37 4751 4773 4797 N
+ V R OY s n/a 37 4751 4773 4797 N
+ V R P b n/a 37 4751 4790 4813 N
+ V R P e n/a 37 4751 4790 4813 N
+ V R P s n/a 37 4751 4790 4813 N
+ V R R b n/a 37 4751 4778 4827 N
+ V R R e n/a 37 4751 4778 4829 N
+ V R R s n/a 37 4751 4778 4827 N
+ V R S b n/a 37 4751 4790 4819 N
+ V R S e n/a 37 4751 4790 4819 N
+ V R S s n/a 37 4751 4790 4819 N
+ V R SH e n/a 37 4751 4790 4819 N
+ V R SH s n/a 37 4751 4790 4819 N
+ V R SIL e n/a 37 4751 4790 4816 N
+ V R SIL s n/a 37 4751 4790 4816 N
+ V R T b n/a 37 4751 4790 4813 N
+ V R T e n/a 37 4751 4790 4813 N
+ V R T s n/a 37 4751 4790 4813 N
+ V R TH e n/a 37 4751 4790 4821 N
+ V R TH s n/a 37 4751 4790 4821 N
+ V R UH b n/a 37 4751 4773 4798 N
+ V R UH e n/a 37 4751 4773 4798 N
+ V R UH s n/a 37 4751 4773 4798 N
+ V R UW b n/a 37 4751 4773 4797 N
+ V R UW e n/a 37 4751 4773 4797 N
+ V R UW i n/a 37 4751 4773 4797 N
+ V R UW s n/a 37 4751 4773 4797 N
+ V R V e n/a 37 4751 4790 4824 N
+ V R V s n/a 37 4751 4790 4818 N
+ V R W b n/a 37 4751 4795 4828 N
+ V R W e n/a 37 4751 4795 4828 N
+ V R W s n/a 37 4751 4795 4828 N
+ V R Y b n/a 37 4751 4790 4826 N
+ V R Y e n/a 37 4751 4790 4826 N
+ V R Y i n/a 37 4751 4790 4826 N
+ V R Y s n/a 37 4751 4790 4826 N
+ V R Z b n/a 37 4751 4790 4818 N
+ V R Z e n/a 37 4751 4790 4824 N
+ V R Z i n/a 37 4751 4790 4818 N
+ V R Z s n/a 37 4751 4790 4818 N
+ V R ZH e n/a 37 4751 4790 4824 N
+ V R ZH s n/a 37 4751 4790 4818 N
+ V S AA b n/a 37 4757 4780 4796 N
+ V S AA e n/a 37 4757 4780 4796 N
+ V S AA i n/a 37 4757 4780 4796 N
+ V S AA s n/a 37 4757 4780 4796 N
+ V S AE b n/a 37 4757 4779 4803 N
+ V S AE e n/a 37 4757 4779 4804 N
+ V S AE i n/a 37 4757 4779 4803 N
+ V S AE s n/a 37 4757 4779 4803 N
+ V S AH b n/a 37 4757 4779 4798 N
+ V S AH e n/a 37 4757 4779 4798 N
+ V S AH i n/a 37 4757 4779 4812 N
+ V S AH s n/a 37 4757 4779 4798 N
+ V S AO b n/a 37 4757 4780 4797 N
+ V S AO e n/a 37 4757 4780 4797 N
+ V S AO i n/a 37 4757 4780 4797 N
+ V S AO s n/a 37 4757 4780 4797 N
+ V S AW b n/a 37 4757 4779 4803 N
+ V S AW e n/a 37 4757 4779 4804 N
+ V S AW s n/a 37 4757 4779 4803 N
+ V S AY b n/a 37 4757 4780 4796 N
+ V S AY e n/a 37 4757 4780 4796 N
+ V S AY s n/a 37 4757 4780 4796 N
+ V S B e n/a 37 4757 4786 4824 N
+ V S B s n/a 37 4757 4786 4817 N
+ V S CH b n/a 37 4757 4786 4821 N
+ V S CH e n/a 37 4757 4786 4821 N
+ V S CH s n/a 37 4757 4786 4821 N
+ V S D b n/a 37 4757 4786 4817 N
+ V S D e n/a 37 4757 4786 4824 N
+ V S D s n/a 37 4757 4786 4817 N
+ V S DH e n/a 37 4757 4792 4824 N
+ V S DH s n/a 37 4757 4792 4818 N
+ V S EH b n/a 37 4757 4779 4802 N
+ V S EH e n/a 37 4757 4779 4804 N
+ V S EH i n/a 37 4757 4779 4803 N
+ V S EH s n/a 37 4757 4779 4802 N
+ V S ER b n/a 37 4757 4780 4800 N
+ V S ER e n/a 37 4757 4780 4800 N
+ V S ER i n/a 37 4757 4780 4800 N
+ V S ER s n/a 37 4757 4780 4800 N
+ V S EY b n/a 37 4757 4779 4802 N
+ V S EY e n/a 37 4757 4779 4804 N
+ V S EY i n/a 37 4757 4779 4805 N
+ V S EY s n/a 37 4757 4779 4802 N
+ V S F e n/a 37 4757 4786 4819 N
+ V S F s n/a 37 4757 4786 4819 N
+ V S G e n/a 37 4757 4786 4824 N
+ V S G s n/a 37 4757 4786 4817 N
+ V S HH e n/a 37 4757 4786 4821 N
+ V S HH s n/a 37 4757 4786 4821 N
+ V S IH b n/a 37 4757 4779 4806 N
+ V S IH e n/a 37 4757 4779 4807 N
+ V S IH i n/a 37 4757 4779 4806 N
+ V S IH s n/a 37 4757 4779 4806 N
+ V S IY b n/a 37 4757 4779 4810 N
+ V S IY e n/a 37 4757 4779 4810 N
+ V S IY i n/a 37 4757 4779 4810 N
+ V S IY s n/a 37 4757 4779 4810 N
+ V S JH e n/a 37 4757 4786 4824 N
+ V S JH s n/a 37 4757 4786 4817 N
+ V S K b n/a 37 4757 4786 4813 N
+ V S K e n/a 37 4757 4786 4813 N
+ V S K s n/a 37 4757 4786 4813 N
+ V S L b n/a 37 4757 4795 4828 N
+ V S L e n/a 37 4757 4795 4828 N
+ V S L s n/a 37 4757 4795 4828 N
+ V S M e n/a 37 4757 4786 4825 N
+ V S M s n/a 37 4757 4786 4825 N
+ V S N e n/a 37 4757 4786 4825 N
+ V S N s n/a 37 4757 4786 4825 N
+ V S NG e n/a 37 4757 4786 4825 N
+ V S NG s n/a 37 4757 4786 4825 N
+ V S OW b n/a 37 4757 4780 4797 N
+ V S OW e n/a 37 4757 4780 4797 N
+ V S OW i n/a 37 4757 4780 4797 N
+ V S OW s n/a 37 4757 4780 4797 N
+ V S OY b n/a 37 4757 4780 4797 N
+ V S OY e n/a 37 4757 4780 4797 N
+ V S OY s n/a 37 4757 4780 4797 N
+ V S P b n/a 37 4757 4786 4813 N
+ V S P e n/a 37 4757 4786 4813 N
+ V S P s n/a 37 4757 4786 4813 N
+ V S R b n/a 37 4757 4780 4827 N
+ V S R e n/a 37 4757 4780 4829 N
+ V S R s n/a 37 4757 4780 4827 N
+ V S S b n/a 37 4757 4786 4819 N
+ V S S e n/a 37 4757 4786 4819 N
+ V S S s n/a 37 4757 4786 4819 N
+ V S SH e n/a 37 4757 4786 4819 N
+ V S SH s n/a 37 4757 4786 4819 N
+ V S SIL e n/a 37 4757 4786 4816 N
+ V S SIL s n/a 37 4757 4786 4816 N
+ V S T b n/a 37 4757 4786 4813 N
+ V S T e n/a 37 4757 4786 4813 N
+ V S T s n/a 37 4757 4786 4813 N
+ V S TH e n/a 37 4757 4786 4821 N
+ V S TH s n/a 37 4757 4786 4821 N
+ V S UH b n/a 37 4757 4780 4798 N
+ V S UH e n/a 37 4757 4780 4798 N
+ V S UH s n/a 37 4757 4780 4798 N
+ V S UW b n/a 37 4757 4780 4797 N
+ V S UW e n/a 37 4757 4780 4797 N
+ V S UW i n/a 37 4757 4780 4797 N
+ V S UW s n/a 37 4757 4780 4797 N
+ V S V e n/a 37 4757 4786 4824 N
+ V S V s n/a 37 4757 4786 4818 N
+ V S W b n/a 37 4757 4795 4828 N
+ V S W e n/a 37 4757 4795 4828 N
+ V S W s n/a 37 4757 4795 4828 N
+ V S Y b n/a 37 4757 4786 4826 N
+ V S Y e n/a 37 4757 4786 4826 N
+ V S Y i n/a 37 4757 4786 4826 N
+ V S Y s n/a 37 4757 4786 4826 N
+ V S Z b n/a 37 4757 4786 4818 N
+ V S Z e n/a 37 4757 4786 4824 N
+ V S Z s n/a 37 4757 4786 4818 N
+ V S ZH e n/a 37 4757 4786 4824 N
+ V S ZH s n/a 37 4757 4786 4818 N
+ V SH AA b n/a 37 4757 4780 4796 N
+ V SH AA e n/a 37 4757 4780 4796 N
+ V SH AA i n/a 37 4757 4780 4796 N
+ V SH AA s n/a 37 4757 4780 4796 N
+ V SH AE b n/a 37 4757 4779 4803 N
+ V SH AE e n/a 37 4757 4779 4804 N
+ V SH AE s n/a 37 4757 4779 4803 N
+ V SH AH b n/a 37 4757 4779 4798 N
+ V SH AH e n/a 37 4757 4779 4798 N
+ V SH AH s n/a 37 4757 4779 4798 N
+ V SH AO b n/a 37 4757 4780 4797 N
+ V SH AO e n/a 37 4757 4780 4797 N
+ V SH AO s n/a 37 4757 4780 4797 N
+ V SH AW b n/a 37 4757 4779 4803 N
+ V SH AW e n/a 37 4757 4779 4804 N
+ V SH AW s n/a 37 4757 4779 4803 N
+ V SH AY b n/a 37 4757 4780 4796 N
+ V SH AY e n/a 37 4757 4780 4796 N
+ V SH AY i n/a 37 4757 4780 4796 N
+ V SH AY s n/a 37 4757 4780 4796 N
+ V SH B e n/a 37 4757 4786 4824 N
+ V SH B s n/a 37 4757 4786 4817 N
+ V SH CH b n/a 37 4757 4786 4821 N
+ V SH CH e n/a 37 4757 4786 4821 N
+ V SH CH s n/a 37 4757 4786 4821 N
+ V SH D b n/a 37 4757 4786 4817 N
+ V SH D e n/a 37 4757 4786 4824 N
+ V SH D s n/a 37 4757 4786 4817 N
+ V SH DH e n/a 37 4757 4792 4824 N
+ V SH DH s n/a 37 4757 4792 4818 N
+ V SH EH b n/a 37 4757 4779 4802 N
+ V SH EH e n/a 37 4757 4779 4804 N
+ V SH EH i n/a 37 4757 4779 4803 N
+ V SH EH s n/a 37 4757 4779 4802 N
+ V SH ER b n/a 37 4757 4780 4800 N
+ V SH ER e n/a 37 4757 4780 4800 N
+ V SH ER s n/a 37 4757 4780 4800 N
+ V SH EY b n/a 37 4757 4779 4802 N
+ V SH EY e n/a 37 4757 4779 4804 N
+ V SH EY s n/a 37 4757 4779 4802 N
+ V SH F e n/a 37 4757 4786 4819 N
+ V SH F s n/a 37 4757 4786 4819 N
+ V SH G e n/a 37 4757 4786 4824 N
+ V SH G s n/a 37 4757 4786 4817 N
+ V SH HH e n/a 37 4757 4786 4821 N
+ V SH HH s n/a 37 4757 4786 4821 N
+ V SH IH b n/a 37 4757 4779 4806 N
+ V SH IH e n/a 37 4757 4779 4807 N
+ V SH IH i n/a 37 4757 4779 4806 N
+ V SH IH s n/a 37 4757 4779 4806 N
+ V SH IY b n/a 37 4757 4779 4810 N
+ V SH IY e n/a 37 4757 4779 4810 N
+ V SH IY i n/a 37 4757 4779 4810 N
+ V SH IY s n/a 37 4757 4779 4810 N
+ V SH JH e n/a 37 4757 4786 4824 N
+ V SH JH s n/a 37 4757 4786 4817 N
+ V SH K b n/a 37 4757 4786 4813 N
+ V SH K e n/a 37 4757 4786 4813 N
+ V SH K s n/a 37 4757 4786 4813 N
+ V SH L b n/a 37 4757 4795 4828 N
+ V SH L e n/a 37 4757 4795 4828 N
+ V SH L s n/a 37 4757 4795 4828 N
+ V SH M e n/a 37 4757 4786 4825 N
+ V SH M s n/a 37 4757 4786 4825 N
+ V SH N e n/a 37 4757 4786 4825 N
+ V SH N s n/a 37 4757 4786 4825 N
+ V SH NG e n/a 37 4757 4786 4825 N
+ V SH NG s n/a 37 4757 4786 4825 N
+ V SH OW b n/a 37 4757 4780 4797 N
+ V SH OW e n/a 37 4757 4780 4797 N
+ V SH OW s n/a 37 4757 4780 4797 N
+ V SH OY b n/a 37 4757 4780 4797 N
+ V SH OY e n/a 37 4757 4780 4797 N
+ V SH OY s n/a 37 4757 4780 4797 N
+ V SH P b n/a 37 4757 4786 4813 N
+ V SH P e n/a 37 4757 4786 4813 N
+ V SH P s n/a 37 4757 4786 4813 N
+ V SH R b n/a 37 4757 4780 4827 N
+ V SH R e n/a 37 4757 4780 4829 N
+ V SH R s n/a 37 4757 4780 4827 N
+ V SH S b n/a 37 4757 4786 4819 N
+ V SH S e n/a 37 4757 4786 4819 N
+ V SH S s n/a 37 4757 4786 4819 N
+ V SH SH e n/a 37 4757 4786 4819 N
+ V SH SH s n/a 37 4757 4786 4819 N
+ V SH SIL e n/a 37 4757 4786 4816 N
+ V SH SIL s n/a 37 4757 4786 4816 N
+ V SH T b n/a 37 4757 4786 4813 N
+ V SH T e n/a 37 4757 4786 4813 N
+ V SH T s n/a 37 4757 4786 4813 N
+ V SH TH e n/a 37 4757 4786 4821 N
+ V SH TH s n/a 37 4757 4786 4821 N
+ V SH UH b n/a 37 4757 4780 4798 N
+ V SH UH e n/a 37 4757 4780 4798 N
+ V SH UH s n/a 37 4757 4780 4798 N
+ V SH UW b n/a 37 4757 4780 4797 N
+ V SH UW e n/a 37 4757 4780 4797 N
+ V SH UW s n/a 37 4757 4780 4797 N
+ V SH V e n/a 37 4757 4786 4824 N
+ V SH V s n/a 37 4757 4786 4818 N
+ V SH W b n/a 37 4757 4795 4828 N
+ V SH W e n/a 37 4757 4795 4828 N
+ V SH W s n/a 37 4757 4795 4828 N
+ V SH Y b n/a 37 4757 4786 4826 N
+ V SH Y e n/a 37 4757 4786 4826 N
+ V SH Y s n/a 37 4757 4786 4826 N
+ V SH Z b n/a 37 4757 4786 4818 N
+ V SH Z e n/a 37 4757 4786 4824 N
+ V SH Z s n/a 37 4757 4786 4818 N
+ V SH ZH e n/a 37 4757 4786 4824 N
+ V SH ZH s n/a 37 4757 4786 4818 N
+ V SIL AA b n/a 37 4757 4780 4796 N
+ V SIL AA s n/a 37 4757 4780 4796 N
+ V SIL AE b n/a 37 4757 4779 4803 N
+ V SIL AE s n/a 37 4757 4779 4803 N
+ V SIL AH b n/a 37 4757 4779 4798 N
+ V SIL AH s n/a 37 4757 4779 4798 N
+ V SIL AO b n/a 37 4757 4780 4797 N
+ V SIL AO s n/a 37 4757 4780 4797 N
+ V SIL AW b n/a 37 4757 4779 4803 N
+ V SIL AW s n/a 37 4757 4779 4803 N
+ V SIL AY b n/a 37 4757 4780 4796 N
+ V SIL AY s n/a 37 4757 4780 4796 N
+ V SIL B s n/a 37 4757 4786 4817 N
+ V SIL CH b n/a 37 4757 4786 4821 N
+ V SIL CH s n/a 37 4757 4786 4821 N
+ V SIL D b n/a 37 4757 4786 4817 N
+ V SIL D s n/a 37 4757 4786 4817 N
+ V SIL DH s n/a 37 4757 4792 4818 N
+ V SIL EH b n/a 37 4757 4779 4802 N
+ V SIL EH s n/a 37 4757 4779 4802 N
+ V SIL ER b n/a 37 4757 4780 4800 N
+ V SIL ER s n/a 37 4757 4780 4800 N
+ V SIL EY b n/a 37 4757 4779 4802 N
+ V SIL EY s n/a 37 4757 4779 4802 N
+ V SIL F s n/a 37 4757 4786 4819 N
+ V SIL G s n/a 37 4757 4786 4817 N
+ V SIL HH s n/a 37 4757 4786 4821 N
+ V SIL IH b n/a 37 4757 4779 4806 N
+ V SIL IH s n/a 37 4757 4779 4806 N
+ V SIL IY b n/a 37 4757 4779 4810 N
+ V SIL IY s n/a 37 4757 4779 4810 N
+ V SIL JH s n/a 37 4757 4786 4817 N
+ V SIL K b n/a 37 4757 4786 4813 N
+ V SIL K s n/a 37 4757 4786 4813 N
+ V SIL L b n/a 37 4757 4795 4828 N
+ V SIL L s n/a 37 4757 4795 4828 N
+ V SIL M s n/a 37 4757 4786 4825 N
+ V SIL N s n/a 37 4757 4786 4825 N
+ V SIL NG s n/a 37 4757 4786 4825 N
+ V SIL OW b n/a 37 4757 4780 4797 N
+ V SIL OW s n/a 37 4757 4780 4797 N
+ V SIL OY b n/a 37 4757 4780 4797 N
+ V SIL OY s n/a 37 4757 4780 4797 N
+ V SIL P b n/a 37 4757 4786 4813 N
+ V SIL P s n/a 37 4757 4786 4813 N
+ V SIL R b n/a 37 4757 4780 4827 N
+ V SIL R s n/a 37 4757 4780 4827 N
+ V SIL S b n/a 37 4757 4786 4819 N
+ V SIL S s n/a 37 4757 4786 4819 N
+ V SIL SH s n/a 37 4757 4786 4819 N
+ V SIL SIL s n/a 37 4757 4786 4816 N
+ V SIL T b n/a 37 4757 4786 4813 N
+ V SIL T s n/a 37 4757 4786 4813 N
+ V SIL TH s n/a 37 4757 4786 4821 N
+ V SIL UH b n/a 37 4757 4780 4798 N
+ V SIL UH s n/a 37 4757 4780 4798 N
+ V SIL UW b n/a 37 4757 4780 4797 N
+ V SIL UW s n/a 37 4757 4780 4797 N
+ V SIL V s n/a 37 4757 4786 4818 N
+ V SIL W b n/a 37 4757 4795 4828 N
+ V SIL W s n/a 37 4757 4795 4828 N
+ V SIL Y b n/a 37 4757 4786 4826 N
+ V SIL Y s n/a 37 4757 4786 4826 N
+ V SIL Z b n/a 37 4757 4786 4818 N
+ V SIL Z s n/a 37 4757 4786 4818 N
+ V SIL ZH s n/a 37 4757 4786 4818 N
+ V T AA b n/a 37 4757 4780 4796 N
+ V T AA e n/a 37 4757 4780 4796 N
+ V T AA i n/a 37 4757 4780 4796 N
+ V T AA s n/a 37 4757 4780 4796 N
+ V T AE b n/a 37 4757 4779 4803 N
+ V T AE e n/a 37 4757 4779 4804 N
+ V T AE i n/a 37 4757 4779 4803 N
+ V T AE s n/a 37 4757 4779 4803 N
+ V T AH b n/a 37 4757 4779 4798 N
+ V T AH e n/a 37 4757 4779 4798 N
+ V T AH i n/a 37 4757 4779 4812 N
+ V T AH s n/a 37 4757 4779 4798 N
+ V T AO b n/a 37 4757 4780 4797 N
+ V T AO e n/a 37 4757 4780 4797 N
+ V T AO s n/a 37 4757 4780 4797 N
+ V T AW b n/a 37 4757 4779 4803 N
+ V T AW e n/a 37 4757 4779 4804 N
+ V T AW s n/a 37 4757 4779 4803 N
+ V T AY b n/a 37 4757 4780 4796 N
+ V T AY e n/a 37 4757 4780 4796 N
+ V T AY s n/a 37 4757 4780 4796 N
+ V T B e n/a 37 4757 4786 4824 N
+ V T B s n/a 37 4757 4786 4817 N
+ V T CH b n/a 37 4757 4786 4821 N
+ V T CH e n/a 37 4757 4786 4821 N
+ V T CH s n/a 37 4757 4786 4821 N
+ V T D b n/a 37 4757 4786 4817 N
+ V T D e n/a 37 4757 4786 4824 N
+ V T D s n/a 37 4757 4786 4817 N
+ V T DH e n/a 37 4757 4792 4824 N
+ V T DH s n/a 37 4757 4792 4818 N
+ V T EH b n/a 37 4757 4779 4802 N
+ V T EH e n/a 37 4757 4779 4804 N
+ V T EH i n/a 37 4757 4779 4803 N
+ V T EH s n/a 37 4757 4779 4802 N
+ V T ER b n/a 37 4757 4780 4800 N
+ V T ER e n/a 37 4757 4780 4800 N
+ V T ER i n/a 37 4757 4780 4800 N
+ V T ER s n/a 37 4757 4780 4800 N
+ V T EY b n/a 37 4757 4779 4802 N
+ V T EY e n/a 37 4757 4779 4804 N
+ V T EY i n/a 37 4757 4779 4805 N
+ V T EY s n/a 37 4757 4779 4802 N
+ V T F e n/a 37 4757 4786 4819 N
+ V T F s n/a 37 4757 4786 4819 N
+ V T G e n/a 37 4757 4786 4824 N
+ V T G s n/a 37 4757 4786 4817 N
+ V T HH e n/a 37 4757 4786 4821 N
+ V T HH s n/a 37 4757 4786 4821 N
+ V T IH b n/a 37 4757 4779 4806 N
+ V T IH e n/a 37 4757 4779 4807 N
+ V T IH i n/a 37 4757 4779 4806 N
+ V T IH s n/a 37 4757 4779 4806 N
+ V T IY b n/a 37 4757 4779 4810 N
+ V T IY e n/a 37 4757 4779 4810 N
+ V T IY i n/a 37 4757 4779 4810 N
+ V T IY s n/a 37 4757 4779 4810 N
+ V T JH e n/a 37 4757 4786 4824 N
+ V T JH s n/a 37 4757 4786 4817 N
+ V T K b n/a 37 4757 4786 4813 N
+ V T K e n/a 37 4757 4786 4813 N
+ V T K s n/a 37 4757 4786 4813 N
+ V T L b n/a 37 4757 4795 4828 N
+ V T L e n/a 37 4757 4795 4828 N
+ V T L s n/a 37 4757 4795 4828 N
+ V T M e n/a 37 4757 4786 4825 N
+ V T M s n/a 37 4757 4786 4825 N
+ V T N e n/a 37 4757 4786 4825 N
+ V T N s n/a 37 4757 4786 4825 N
+ V T NG e n/a 37 4757 4786 4825 N
+ V T NG s n/a 37 4757 4786 4825 N
+ V T OW b n/a 37 4757 4780 4797 N
+ V T OW e n/a 37 4757 4780 4797 N
+ V T OW i n/a 37 4757 4780 4797 N
+ V T OW s n/a 37 4757 4780 4797 N
+ V T OY b n/a 37 4757 4780 4797 N
+ V T OY e n/a 37 4757 4780 4797 N
+ V T OY s n/a 37 4757 4780 4797 N
+ V T P b n/a 37 4757 4786 4813 N
+ V T P e n/a 37 4757 4786 4813 N
+ V T P s n/a 37 4757 4786 4813 N
+ V T R b n/a 37 4757 4780 4827 N
+ V T R e n/a 37 4757 4780 4829 N
+ V T R s n/a 37 4757 4780 4827 N
+ V T S b n/a 37 4757 4786 4819 N
+ V T S e n/a 37 4757 4786 4819 N
+ V T S s n/a 37 4757 4786 4819 N
+ V T SH e n/a 37 4757 4786 4819 N
+ V T SH s n/a 37 4757 4786 4819 N
+ V T SIL e n/a 37 4757 4786 4816 N
+ V T SIL s n/a 37 4757 4786 4816 N
+ V T T b n/a 37 4757 4786 4813 N
+ V T T e n/a 37 4757 4786 4813 N
+ V T T s n/a 37 4757 4786 4813 N
+ V T TH e n/a 37 4757 4786 4821 N
+ V T TH s n/a 37 4757 4786 4821 N
+ V T UH b n/a 37 4757 4780 4798 N
+ V T UH e n/a 37 4757 4780 4798 N
+ V T UH s n/a 37 4757 4780 4798 N
+ V T UW b n/a 37 4757 4780 4797 N
+ V T UW e n/a 37 4757 4780 4797 N
+ V T UW s n/a 37 4757 4780 4797 N
+ V T V e n/a 37 4757 4786 4824 N
+ V T V s n/a 37 4757 4786 4818 N
+ V T W b n/a 37 4757 4795 4828 N
+ V T W e n/a 37 4757 4795 4828 N
+ V T W s n/a 37 4757 4795 4828 N
+ V T Y b n/a 37 4757 4786 4826 N
+ V T Y e n/a 37 4757 4786 4826 N
+ V T Y i n/a 37 4757 4786 4826 N
+ V T Y s n/a 37 4757 4786 4826 N
+ V T Z b n/a 37 4757 4786 4818 N
+ V T Z e n/a 37 4757 4786 4824 N
+ V T Z i n/a 37 4757 4786 4818 N
+ V T Z s n/a 37 4757 4786 4818 N
+ V T ZH e n/a 37 4757 4786 4824 N
+ V T ZH s n/a 37 4757 4786 4818 N
+ V TH AA b n/a 37 4757 4780 4796 N
+ V TH AA s n/a 37 4757 4780 4796 N
+ V TH AE b n/a 37 4757 4779 4803 N
+ V TH AE s n/a 37 4757 4779 4803 N
+ V TH AH b n/a 37 4757 4779 4798 N
+ V TH AH i n/a 37 4757 4779 4812 N
+ V TH AH s n/a 37 4757 4779 4798 N
+ V TH AO b n/a 37 4757 4780 4797 N
+ V TH AO s n/a 37 4757 4780 4797 N
+ V TH AW b n/a 37 4757 4779 4803 N
+ V TH AW s n/a 37 4757 4779 4803 N
+ V TH AY b n/a 37 4757 4780 4796 N
+ V TH AY s n/a 37 4757 4780 4796 N
+ V TH B s n/a 37 4757 4786 4817 N
+ V TH CH b n/a 37 4757 4786 4821 N
+ V TH CH s n/a 37 4757 4786 4821 N
+ V TH D b n/a 37 4757 4786 4817 N
+ V TH D s n/a 37 4757 4786 4817 N
+ V TH DH s n/a 37 4757 4792 4818 N
+ V TH EH b n/a 37 4757 4779 4802 N
+ V TH EH i n/a 37 4757 4779 4803 N
+ V TH EH s n/a 37 4757 4779 4802 N
+ V TH ER b n/a 37 4757 4780 4800 N
+ V TH ER s n/a 37 4757 4780 4800 N
+ V TH EY b n/a 37 4757 4779 4802 N
+ V TH EY i n/a 37 4757 4779 4805 N
+ V TH EY s n/a 37 4757 4779 4802 N
+ V TH F s n/a 37 4757 4786 4819 N
+ V TH G s n/a 37 4757 4786 4817 N
+ V TH HH s n/a 37 4757 4786 4821 N
+ V TH IH b n/a 37 4757 4779 4806 N
+ V TH IH i n/a 37 4757 4779 4806 N
+ V TH IH s n/a 37 4757 4779 4806 N
+ V TH IY b n/a 37 4757 4779 4810 N
+ V TH IY i n/a 37 4757 4779 4810 N
+ V TH IY s n/a 37 4757 4779 4810 N
+ V TH JH s n/a 37 4757 4786 4817 N
+ V TH K b n/a 37 4757 4786 4813 N
+ V TH K s n/a 37 4757 4786 4813 N
+ V TH L b n/a 37 4757 4795 4828 N
+ V TH L s n/a 37 4757 4795 4828 N
+ V TH M s n/a 37 4757 4786 4825 N
+ V TH N s n/a 37 4757 4786 4825 N
+ V TH NG s n/a 37 4757 4786 4825 N
+ V TH OW b n/a 37 4757 4780 4797 N
+ V TH OW s n/a 37 4757 4780 4797 N
+ V TH OY b n/a 37 4757 4780 4797 N
+ V TH OY s n/a 37 4757 4780 4797 N
+ V TH P b n/a 37 4757 4786 4813 N
+ V TH P s n/a 37 4757 4786 4813 N
+ V TH R b n/a 37 4757 4780 4827 N
+ V TH R s n/a 37 4757 4780 4827 N
+ V TH S b n/a 37 4757 4786 4819 N
+ V TH S s n/a 37 4757 4786 4819 N
+ V TH SH s n/a 37 4757 4786 4819 N
+ V TH SIL s n/a 37 4757 4786 4816 N
+ V TH T b n/a 37 4757 4786 4813 N
+ V TH T s n/a 37 4757 4786 4813 N
+ V TH TH s n/a 37 4757 4786 4821 N
+ V TH UH b n/a 37 4757 4780 4798 N
+ V TH UH s n/a 37 4757 4780 4798 N
+ V TH UW b n/a 37 4757 4780 4797 N
+ V TH UW s n/a 37 4757 4780 4797 N
+ V TH V s n/a 37 4757 4786 4818 N
+ V TH W b n/a 37 4757 4795 4828 N
+ V TH W s n/a 37 4757 4795 4828 N
+ V TH Y b n/a 37 4757 4786 4826 N
+ V TH Y i n/a 37 4757 4786 4826 N
+ V TH Y s n/a 37 4757 4786 4826 N
+ V TH Z b n/a 37 4757 4786 4818 N
+ V TH Z s n/a 37 4757 4786 4818 N
+ V TH ZH s n/a 37 4757 4786 4818 N
+ V UH AA b n/a 37 4756 4773 4796 N
+ V UH AA s n/a 37 4756 4773 4796 N
+ V UH AE b n/a 37 4756 4772 4803 N
+ V UH AE s n/a 37 4756 4772 4803 N
+ V UH AH b n/a 37 4756 4772 4798 N
+ V UH AH s n/a 37 4756 4772 4798 N
+ V UH AO b n/a 37 4756 4773 4797 N
+ V UH AO s n/a 37 4756 4773 4797 N
+ V UH AW b n/a 37 4756 4772 4803 N
+ V UH AW s n/a 37 4756 4772 4803 N
+ V UH AY b n/a 37 4756 4773 4796 N
+ V UH AY s n/a 37 4756 4773 4796 N
+ V UH B s n/a 37 4756 4787 4817 N
+ V UH CH b n/a 37 4756 4787 4821 N
+ V UH CH s n/a 37 4756 4787 4821 N
+ V UH D b n/a 37 4756 4787 4817 N
+ V UH D s n/a 37 4756 4787 4817 N
+ V UH DH s n/a 37 4756 4793 4818 N
+ V UH EH b n/a 37 4756 4772 4802 N
+ V UH EH s n/a 37 4756 4772 4802 N
+ V UH ER b n/a 37 4756 4778 4801 N
+ V UH ER i n/a 37 4756 4778 4801 N
+ V UH ER s n/a 37 4756 4778 4801 N
+ V UH EY b n/a 37 4756 4772 4802 N
+ V UH EY s n/a 37 4756 4772 4802 N
+ V UH F s n/a 37 4756 4787 4819 N
+ V UH G s n/a 37 4756 4787 4817 N
+ V UH HH s n/a 37 4756 4787 4821 N
+ V UH IH b n/a 37 4756 4772 4806 N
+ V UH IH s n/a 37 4756 4772 4806 N
+ V UH IY b n/a 37 4756 4772 4810 N
+ V UH IY s n/a 37 4756 4772 4810 N
+ V UH JH s n/a 37 4756 4787 4817 N
+ V UH K b n/a 37 4756 4787 4813 N
+ V UH K s n/a 37 4756 4787 4813 N
+ V UH L b n/a 37 4756 4795 4828 N
+ V UH L s n/a 37 4756 4795 4828 N
+ V UH M s n/a 37 4756 4787 4825 N
+ V UH N s n/a 37 4756 4787 4825 N
+ V UH NG s n/a 37 4756 4787 4825 N
+ V UH OW b n/a 37 4756 4773 4797 N
+ V UH OW s n/a 37 4756 4773 4797 N
+ V UH OY b n/a 37 4756 4773 4797 N
+ V UH OY s n/a 37 4756 4773 4797 N
+ V UH P b n/a 37 4756 4787 4813 N
+ V UH P s n/a 37 4756 4787 4813 N
+ V UH R b n/a 37 4756 4778 4827 N
+ V UH R s n/a 37 4756 4778 4827 N
+ V UH S b n/a 37 4756 4787 4819 N
+ V UH S s n/a 37 4756 4787 4819 N
+ V UH SH s n/a 37 4756 4787 4819 N
+ V UH SIL s n/a 37 4756 4787 4816 N
+ V UH T b n/a 37 4756 4787 4813 N
+ V UH T s n/a 37 4756 4787 4813 N
+ V UH TH s n/a 37 4756 4787 4821 N
+ V UH UH b n/a 37 4756 4773 4798 N
+ V UH UH s n/a 37 4756 4773 4798 N
+ V UH UW b n/a 37 4756 4773 4797 N
+ V UH UW s n/a 37 4756 4773 4797 N
+ V UH V s n/a 37 4756 4787 4818 N
+ V UH W b n/a 37 4756 4795 4828 N
+ V UH W s n/a 37 4756 4795 4828 N
+ V UH Y b n/a 37 4756 4787 4826 N
+ V UH Y s n/a 37 4756 4787 4826 N
+ V UH Z b n/a 37 4756 4787 4818 N
+ V UH Z i n/a 37 4756 4787 4818 N
+ V UH Z s n/a 37 4756 4787 4818 N
+ V UH ZH s n/a 37 4756 4787 4818 N
+ V UW AA b n/a 37 4756 4773 4796 N
+ V UW AA e n/a 37 4756 4773 4796 N
+ V UW AA i n/a 37 4756 4773 4796 N
+ V UW AA s n/a 37 4756 4773 4796 N
+ V UW AE b n/a 37 4756 4772 4803 N
+ V UW AE e n/a 37 4756 4772 4804 N
+ V UW AE i n/a 37 4756 4772 4803 N
+ V UW AE s n/a 37 4756 4772 4803 N
+ V UW AH b n/a 37 4756 4772 4798 N
+ V UW AH e n/a 37 4756 4772 4798 N
+ V UW AH i n/a 37 4756 4772 4812 N
+ V UW AH s n/a 37 4756 4772 4798 N
+ V UW AO b n/a 37 4756 4773 4797 N
+ V UW AO e n/a 37 4756 4773 4797 N
+ V UW AO s n/a 37 4756 4773 4797 N
+ V UW AW b n/a 37 4756 4772 4803 N
+ V UW AW e n/a 37 4756 4772 4804 N
+ V UW AW s n/a 37 4756 4772 4803 N
+ V UW AY b n/a 37 4756 4773 4796 N
+ V UW AY e n/a 37 4756 4773 4796 N
+ V UW AY s n/a 37 4756 4773 4796 N
+ V UW B e n/a 37 4756 4786 4823 N
+ V UW B i n/a 37 4756 4786 4817 N
+ V UW B s n/a 37 4756 4786 4817 N
+ V UW CH b n/a 37 4756 4786 4821 N
+ V UW CH e n/a 37 4756 4786 4821 N
+ V UW CH s n/a 37 4756 4786 4821 N
+ V UW D b n/a 37 4756 4786 4817 N
+ V UW D e n/a 37 4756 4786 4823 N
+ V UW D i n/a 37 4756 4786 4817 N
+ V UW D s n/a 37 4756 4786 4817 N
+ V UW DH e n/a 37 4756 4793 4823 N
+ V UW DH s n/a 37 4756 4793 4818 N
+ V UW EH b n/a 37 4756 4772 4802 N
+ V UW EH e n/a 37 4756 4772 4804 N
+ V UW EH i n/a 37 4756 4772 4803 N
+ V UW EH s n/a 37 4756 4772 4802 N
+ V UW ER b n/a 37 4756 4778 4801 N
+ V UW ER e n/a 37 4756 4778 4801 N
+ V UW ER i n/a 37 4756 4778 4801 N
+ V UW ER s n/a 37 4756 4778 4801 N
+ V UW EY b n/a 37 4756 4772 4802 N
+ V UW EY e n/a 37 4756 4772 4804 N
+ V UW EY i n/a 37 4756 4772 4805 N
+ V UW EY s n/a 37 4756 4772 4802 N
+ V UW F e n/a 37 4756 4786 4819 N
+ V UW F s n/a 37 4756 4786 4819 N
+ V UW G e n/a 37 4756 4786 4823 N
+ V UW G s n/a 37 4756 4786 4817 N
+ V UW HH e n/a 37 4756 4786 4821 N
+ V UW HH s n/a 37 4756 4786 4821 N
+ V UW IH b n/a 37 4756 4772 4806 N
+ V UW IH e n/a 37 4756 4772 4806 N
+ V UW IH i n/a 37 4756 4772 4809 N
+ V UW IH s n/a 37 4756 4772 4806 N
+ V UW IY b n/a 37 4756 4772 4810 N
+ V UW IY e n/a 37 4756 4772 4810 N
+ V UW IY i n/a 37 4756 4772 4810 N
+ V UW IY s n/a 37 4756 4772 4810 N
+ V UW JH e n/a 37 4756 4786 4823 N
+ V UW JH s n/a 37 4756 4786 4817 N
+ V UW K b n/a 37 4756 4786 4813 N
+ V UW K e n/a 37 4756 4786 4813 N
+ V UW K s n/a 37 4756 4786 4813 N
+ V UW L b n/a 37 4756 4795 4828 N
+ V UW L e n/a 37 4756 4795 4828 N
+ V UW L i n/a 37 4756 4795 4828 N
+ V UW L s n/a 37 4756 4795 4828 N
+ V UW M e n/a 37 4756 4786 4825 N
+ V UW M i n/a 37 4756 4786 4825 N
+ V UW M s n/a 37 4756 4786 4825 N
+ V UW N e n/a 37 4756 4786 4825 N
+ V UW N s n/a 37 4756 4786 4825 N
+ V UW NG e n/a 37 4756 4786 4825 N
+ V UW NG s n/a 37 4756 4786 4825 N
+ V UW OW b n/a 37 4756 4773 4797 N
+ V UW OW e n/a 37 4756 4773 4797 N
+ V UW OW i n/a 37 4756 4773 4797 N
+ V UW OW s n/a 37 4756 4773 4797 N
+ V UW OY b n/a 37 4756 4773 4797 N
+ V UW OY e n/a 37 4756 4773 4797 N
+ V UW OY s n/a 37 4756 4773 4797 N
+ V UW P b n/a 37 4756 4786 4813 N
+ V UW P e n/a 37 4756 4786 4813 N
+ V UW P s n/a 37 4756 4786 4813 N
+ V UW R b n/a 37 4756 4778 4827 N
+ V UW R e n/a 37 4756 4778 4829 N
+ V UW R i n/a 37 4756 4778 4827 N
+ V UW R s n/a 37 4756 4778 4827 N
+ V UW S b n/a 37 4756 4786 4819 N
+ V UW S e n/a 37 4756 4786 4819 N
+ V UW S i n/a 37 4756 4786 4819 N
+ V UW S s n/a 37 4756 4786 4819 N
+ V UW SH e n/a 37 4756 4786 4819 N
+ V UW SH s n/a 37 4756 4786 4819 N
+ V UW SIL e n/a 37 4756 4786 4816 N
+ V UW SIL s n/a 37 4756 4786 4816 N
+ V UW T b n/a 37 4756 4786 4813 N
+ V UW T e n/a 37 4756 4786 4813 N
+ V UW T i n/a 37 4756 4786 4813 N
+ V UW T s n/a 37 4756 4786 4813 N
+ V UW TH e n/a 37 4756 4786 4821 N
+ V UW TH s n/a 37 4756 4786 4821 N
+ V UW UH b n/a 37 4756 4773 4798 N
+ V UW UH e n/a 37 4756 4773 4798 N
+ V UW UH s n/a 37 4756 4773 4798 N
+ V UW UW b n/a 37 4756 4773 4797 N
+ V UW UW e n/a 37 4756 4773 4797 N
+ V UW UW s n/a 37 4756 4773 4797 N
+ V UW V e n/a 37 4756 4786 4823 N
+ V UW V s n/a 37 4756 4786 4818 N
+ V UW W b n/a 37 4756 4795 4828 N
+ V UW W e n/a 37 4756 4795 4828 N
+ V UW W i n/a 37 4756 4795 4828 N
+ V UW W s n/a 37 4756 4795 4828 N
+ V UW Y b n/a 37 4756 4786 4826 N
+ V UW Y e n/a 37 4756 4786 4826 N
+ V UW Y i n/a 37 4756 4786 4826 N
+ V UW Y s n/a 37 4756 4786 4826 N
+ V UW Z b n/a 37 4756 4786 4818 N
+ V UW Z e n/a 37 4756 4786 4823 N
+ V UW Z i n/a 37 4756 4786 4818 N
+ V UW Z s n/a 37 4756 4786 4818 N
+ V UW ZH e n/a 37 4756 4786 4823 N
+ V UW ZH s n/a 37 4756 4786 4818 N
+ V V AA b n/a 37 4757 4780 4796 N
+ V V AA s n/a 37 4757 4780 4796 N
+ V V AE b n/a 37 4757 4779 4803 N
+ V V AE s n/a 37 4757 4779 4803 N
+ V V AH b n/a 37 4757 4779 4798 N
+ V V AH s n/a 37 4757 4779 4798 N
+ V V AO b n/a 37 4757 4780 4797 N
+ V V AO s n/a 37 4757 4780 4797 N
+ V V AW b n/a 37 4757 4779 4803 N
+ V V AW s n/a 37 4757 4779 4803 N
+ V V AY b n/a 37 4757 4780 4796 N
+ V V AY s n/a 37 4757 4780 4796 N
+ V V B s n/a 37 4757 4786 4817 N
+ V V CH b n/a 37 4757 4786 4821 N
+ V V CH s n/a 37 4757 4786 4821 N
+ V V D b n/a 37 4757 4786 4817 N
+ V V D s n/a 37 4757 4786 4817 N
+ V V DH s n/a 37 4757 4792 4818 N
+ V V EH b n/a 37 4757 4779 4802 N
+ V V EH i n/a 37 4757 4779 4803 N
+ V V EH s n/a 37 4757 4779 4802 N
+ V V ER b n/a 37 4757 4780 4800 N
+ V V ER i n/a 37 4757 4780 4800 N
+ V V ER s n/a 37 4757 4780 4800 N
+ V V EY b n/a 37 4757 4779 4802 N
+ V V EY s n/a 37 4757 4779 4802 N
+ V V F s n/a 37 4757 4786 4819 N
+ V V G s n/a 37 4757 4786 4817 N
+ V V HH s n/a 37 4757 4786 4821 N
+ V V IH b n/a 37 4757 4779 4806 N
+ V V IH s n/a 37 4757 4779 4806 N
+ V V IY b n/a 37 4757 4779 4810 N
+ V V IY s n/a 37 4757 4779 4810 N
+ V V JH s n/a 37 4757 4786 4817 N
+ V V K b n/a 37 4757 4786 4813 N
+ V V K s n/a 37 4757 4786 4813 N
+ V V L b n/a 37 4757 4795 4828 N
+ V V L s n/a 37 4757 4795 4828 N
+ V V M s n/a 37 4757 4786 4825 N
+ V V N s n/a 37 4757 4786 4825 N
+ V V NG s n/a 37 4757 4786 4825 N
+ V V OW b n/a 37 4757 4780 4797 N
+ V V OW s n/a 37 4757 4780 4797 N
+ V V OY b n/a 37 4757 4780 4797 N
+ V V OY s n/a 37 4757 4780 4797 N
+ V V P b n/a 37 4757 4786 4813 N
+ V V P s n/a 37 4757 4786 4813 N
+ V V R b n/a 37 4757 4780 4827 N
+ V V R s n/a 37 4757 4780 4827 N
+ V V S b n/a 37 4757 4786 4819 N
+ V V S s n/a 37 4757 4786 4819 N
+ V V SH s n/a 37 4757 4786 4819 N
+ V V SIL s n/a 37 4757 4786 4816 N
+ V V T b n/a 37 4757 4786 4813 N
+ V V T s n/a 37 4757 4786 4813 N
+ V V TH s n/a 37 4757 4786 4821 N
+ V V UH b n/a 37 4757 4780 4798 N
+ V V UH s n/a 37 4757 4780 4798 N
+ V V UW b n/a 37 4757 4780 4797 N
+ V V UW s n/a 37 4757 4780 4797 N
+ V V V s n/a 37 4757 4786 4818 N
+ V V W b n/a 37 4757 4795 4828 N
+ V V W s n/a 37 4757 4795 4828 N
+ V V Y b n/a 37 4757 4786 4826 N
+ V V Y s n/a 37 4757 4786 4826 N
+ V V Z b n/a 37 4757 4786 4818 N
+ V V Z s n/a 37 4757 4786 4818 N
+ V V ZH s n/a 37 4757 4786 4818 N
+ V W AA b n/a 37 4755 4773 4796 N
+ V W AA s n/a 37 4755 4773 4796 N
+ V W AE b n/a 37 4755 4772 4803 N
+ V W AE s n/a 37 4755 4772 4803 N
+ V W AH b n/a 37 4755 4772 4798 N
+ V W AH s n/a 37 4755 4772 4798 N
+ V W AO b n/a 37 4755 4773 4797 N
+ V W AO s n/a 37 4755 4773 4797 N
+ V W AW b n/a 37 4755 4772 4803 N
+ V W AW s n/a 37 4755 4772 4803 N
+ V W AY b n/a 37 4755 4773 4796 N
+ V W AY s n/a 37 4755 4773 4796 N
+ V W B s n/a 37 4755 4786 4821 N
+ V W CH b n/a 37 4755 4786 4821 N
+ V W CH s n/a 37 4755 4786 4821 N
+ V W D b n/a 37 4755 4786 4821 N
+ V W D s n/a 37 4755 4786 4821 N
+ V W DH s n/a 37 4755 4792 4821 N
+ V W EH b n/a 37 4755 4772 4802 N
+ V W EH s n/a 37 4755 4772 4802 N
+ V W ER b n/a 37 4755 4778 4801 N
+ V W ER s n/a 37 4755 4778 4801 N
+ V W EY b n/a 37 4755 4772 4802 N
+ V W EY s n/a 37 4755 4772 4802 N
+ V W F s n/a 37 4755 4786 4821 N
+ V W G s n/a 37 4755 4786 4821 N
+ V W HH s n/a 37 4755 4786 4821 N
+ V W IH b n/a 37 4755 4772 4806 N
+ V W IH s n/a 37 4755 4772 4806 N
+ V W IY b n/a 37 4755 4772 4810 N
+ V W IY s n/a 37 4755 4772 4810 N
+ V W JH s n/a 37 4755 4786 4821 N
+ V W K b n/a 37 4755 4786 4813 N
+ V W K s n/a 37 4755 4786 4813 N
+ V W L b n/a 37 4755 4795 4828 N
+ V W L s n/a 37 4755 4795 4828 N
+ V W M s n/a 37 4755 4786 4825 N
+ V W N s n/a 37 4755 4786 4825 N
+ V W NG s n/a 37 4755 4786 4825 N
+ V W OW b n/a 37 4755 4773 4797 N
+ V W OW s n/a 37 4755 4773 4797 N
+ V W OY b n/a 37 4755 4773 4797 N
+ V W OY s n/a 37 4755 4773 4797 N
+ V W P b n/a 37 4755 4786 4813 N
+ V W P s n/a 37 4755 4786 4813 N
+ V W R b n/a 37 4755 4778 4827 N
+ V W R s n/a 37 4755 4778 4827 N
+ V W S b n/a 37 4755 4786 4820 N
+ V W S s n/a 37 4755 4786 4820 N
+ V W SH s n/a 37 4755 4786 4820 N
+ V W SIL s n/a 37 4755 4786 4816 N
+ V W T b n/a 37 4755 4786 4813 N
+ V W T s n/a 37 4755 4786 4813 N
+ V W TH s n/a 37 4755 4786 4821 N
+ V W UH b n/a 37 4755 4773 4798 N
+ V W UH s n/a 37 4755 4773 4798 N
+ V W UW b n/a 37 4755 4773 4797 N
+ V W UW s n/a 37 4755 4773 4797 N
+ V W V s n/a 37 4755 4786 4821 N
+ V W W b n/a 37 4755 4795 4828 N
+ V W W s n/a 37 4755 4795 4828 N
+ V W Y b n/a 37 4755 4786 4826 N
+ V W Y s n/a 37 4755 4786 4826 N
+ V W Z b n/a 37 4755 4786 4820 N
+ V W Z s n/a 37 4755 4786 4820 N
+ V W ZH s n/a 37 4755 4786 4820 N
+ V Y AA b n/a 37 4762 4773 4796 N
+ V Y AA s n/a 37 4762 4773 4796 N
+ V Y AE b n/a 37 4763 4781 4803 N
+ V Y AE s n/a 37 4763 4781 4803 N
+ V Y AH b n/a 37 4762 4781 4798 N
+ V Y AH s n/a 37 4762 4781 4798 N
+ V Y AO b n/a 37 4762 4773 4797 N
+ V Y AO s n/a 37 4762 4773 4797 N
+ V Y AW b n/a 37 4763 4781 4803 N
+ V Y AW s n/a 37 4763 4781 4803 N
+ V Y AY b n/a 37 4762 4773 4796 N
+ V Y AY s n/a 37 4762 4773 4796 N
+ V Y B s n/a 37 4763 4784 4817 N
+ V Y CH b n/a 37 4763 4784 4821 N
+ V Y CH s n/a 37 4763 4784 4821 N
+ V Y D b n/a 37 4763 4784 4817 N
+ V Y D s n/a 37 4763 4784 4817 N
+ V Y DH s n/a 37 4763 4784 4818 N
+ V Y EH b n/a 37 4763 4781 4802 N
+ V Y EH s n/a 37 4763 4781 4802 N
+ V Y ER b n/a 37 4762 4767 4800 N
+ V Y ER s n/a 37 4762 4767 4800 N
+ V Y EY b n/a 37 4763 4781 4802 N
+ V Y EY s n/a 37 4763 4781 4802 N
+ V Y F s n/a 37 4763 4784 4819 N
+ V Y G s n/a 37 4763 4784 4817 N
+ V Y HH s n/a 37 4763 4784 4821 N
+ V Y IH b n/a 37 4763 4781 4806 N
+ V Y IH s n/a 37 4763 4781 4806 N
+ V Y IY b n/a 37 4763 4781 4810 N
+ V Y IY s n/a 37 4763 4781 4810 N
+ V Y JH s n/a 37 4763 4784 4817 N
+ V Y K b n/a 37 4763 4784 4813 N
+ V Y K s n/a 37 4763 4784 4813 N
+ V Y L b n/a 37 4762 4784 4828 N
+ V Y L s n/a 37 4762 4784 4828 N
+ V Y M s n/a 37 4763 4784 4825 N
+ V Y N s n/a 37 4763 4784 4825 N
+ V Y NG s n/a 37 4763 4784 4825 N
+ V Y OW b n/a 37 4762 4773 4797 N
+ V Y OW s n/a 37 4762 4773 4797 N
+ V Y OY b n/a 37 4762 4773 4797 N
+ V Y OY s n/a 37 4762 4773 4797 N
+ V Y P b n/a 37 4763 4784 4813 N
+ V Y P s n/a 37 4763 4784 4813 N
+ V Y R b n/a 37 4762 4784 4827 N
+ V Y R s n/a 37 4762 4784 4827 N
+ V Y S b n/a 37 4763 4784 4819 N
+ V Y S s n/a 37 4763 4784 4819 N
+ V Y SH s n/a 37 4763 4784 4819 N
+ V Y SIL s n/a 37 4763 4784 4816 N
+ V Y T b n/a 37 4763 4784 4813 N
+ V Y T s n/a 37 4763 4784 4813 N
+ V Y TH s n/a 37 4763 4784 4821 N
+ V Y UH b n/a 37 4762 4773 4798 N
+ V Y UH s n/a 37 4762 4773 4798 N
+ V Y UW b n/a 37 4762 4773 4797 N
+ V Y UW s n/a 37 4762 4773 4797 N
+ V Y V s n/a 37 4763 4784 4818 N
+ V Y W b n/a 37 4762 4784 4828 N
+ V Y W s n/a 37 4762 4784 4828 N
+ V Y Y b n/a 37 4763 4784 4826 N
+ V Y Y s n/a 37 4763 4784 4826 N
+ V Y Z b n/a 37 4763 4784 4818 N
+ V Y Z s n/a 37 4763 4784 4818 N
+ V Y ZH s n/a 37 4763 4784 4818 N
+ V Z AA b n/a 37 4757 4780 4796 N
+ V Z AA i n/a 37 4757 4780 4796 N
+ V Z AA s n/a 37 4757 4780 4796 N
+ V Z AE b n/a 37 4757 4779 4803 N
+ V Z AE i n/a 37 4757 4779 4803 N
+ V Z AE s n/a 37 4757 4779 4803 N
+ V Z AH b n/a 37 4757 4779 4798 N
+ V Z AH i n/a 37 4757 4779 4812 N
+ V Z AH s n/a 37 4757 4779 4798 N
+ V Z AO b n/a 37 4757 4780 4797 N
+ V Z AO i n/a 37 4757 4780 4797 N
+ V Z AO s n/a 37 4757 4780 4797 N
+ V Z AW b n/a 37 4757 4779 4803 N
+ V Z AW i n/a 37 4757 4779 4803 N
+ V Z AW s n/a 37 4757 4779 4803 N
+ V Z AY b n/a 37 4757 4780 4796 N
+ V Z AY s n/a 37 4757 4780 4796 N
+ V Z B s n/a 37 4757 4786 4817 N
+ V Z CH b n/a 37 4757 4786 4821 N
+ V Z CH s n/a 37 4757 4786 4821 N
+ V Z D b n/a 37 4757 4786 4817 N
+ V Z D s n/a 37 4757 4786 4817 N
+ V Z DH s n/a 37 4757 4792 4818 N
+ V Z EH b n/a 37 4757 4779 4802 N
+ V Z EH i n/a 37 4757 4779 4803 N
+ V Z EH s n/a 37 4757 4779 4802 N
+ V Z ER b n/a 37 4757 4780 4800 N
+ V Z ER i n/a 37 4757 4780 4800 N
+ V Z ER s n/a 37 4757 4780 4800 N
+ V Z EY b n/a 37 4757 4779 4802 N
+ V Z EY s n/a 37 4757 4779 4802 N
+ V Z F s n/a 37 4757 4786 4819 N
+ V Z G s n/a 37 4757 4786 4817 N
+ V Z HH s n/a 37 4757 4786 4821 N
+ V Z IH b n/a 37 4757 4779 4806 N
+ V Z IH i n/a 37 4757 4779 4806 N
+ V Z IH s n/a 37 4757 4779 4806 N
+ V Z IY b n/a 37 4757 4779 4810 N
+ V Z IY i n/a 37 4757 4779 4810 N
+ V Z IY s n/a 37 4757 4779 4810 N
+ V Z JH s n/a 37 4757 4786 4817 N
+ V Z K b n/a 37 4757 4786 4813 N
+ V Z K s n/a 37 4757 4786 4813 N
+ V Z L b n/a 37 4757 4795 4828 N
+ V Z L s n/a 37 4757 4795 4828 N
+ V Z M s n/a 37 4757 4786 4825 N
+ V Z N s n/a 37 4757 4786 4825 N
+ V Z NG s n/a 37 4757 4786 4825 N
+ V Z OW b n/a 37 4757 4780 4797 N
+ V Z OW i n/a 37 4757 4780 4797 N
+ V Z OW s n/a 37 4757 4780 4797 N
+ V Z OY b n/a 37 4757 4780 4797 N
+ V Z OY s n/a 37 4757 4780 4797 N
+ V Z P b n/a 37 4757 4786 4813 N
+ V Z P s n/a 37 4757 4786 4813 N
+ V Z R b n/a 37 4757 4780 4827 N
+ V Z R s n/a 37 4757 4780 4827 N
+ V Z S b n/a 37 4757 4786 4819 N
+ V Z S s n/a 37 4757 4786 4819 N
+ V Z SH s n/a 37 4757 4786 4819 N
+ V Z SIL s n/a 37 4757 4786 4816 N
+ V Z T b n/a 37 4757 4786 4813 N
+ V Z T s n/a 37 4757 4786 4813 N
+ V Z TH s n/a 37 4757 4786 4821 N
+ V Z UH b n/a 37 4757 4780 4798 N
+ V Z UH s n/a 37 4757 4780 4798 N
+ V Z UW b n/a 37 4757 4780 4797 N
+ V Z UW s n/a 37 4757 4780 4797 N
+ V Z V s n/a 37 4757 4786 4818 N
+ V Z W b n/a 37 4757 4795 4828 N
+ V Z W s n/a 37 4757 4795 4828 N
+ V Z Y b n/a 37 4757 4786 4826 N
+ V Z Y s n/a 37 4757 4786 4826 N
+ V Z Z b n/a 37 4757 4786 4818 N
+ V Z Z s n/a 37 4757 4786 4818 N
+ V Z ZH s n/a 37 4757 4786 4818 N
+ V ZH AA b n/a 37 4757 4780 4796 N
+ V ZH AA s n/a 37 4757 4780 4796 N
+ V ZH AE b n/a 37 4757 4779 4803 N
+ V ZH AE s n/a 37 4757 4779 4803 N
+ V ZH AH b n/a 37 4757 4779 4798 N
+ V ZH AH s n/a 37 4757 4779 4798 N
+ V ZH AO b n/a 37 4757 4780 4797 N
+ V ZH AO s n/a 37 4757 4780 4797 N
+ V ZH AW b n/a 37 4757 4779 4803 N
+ V ZH AW s n/a 37 4757 4779 4803 N
+ V ZH AY b n/a 37 4757 4780 4796 N
+ V ZH AY s n/a 37 4757 4780 4796 N
+ V ZH B s n/a 37 4757 4786 4817 N
+ V ZH CH b n/a 37 4757 4786 4821 N
+ V ZH CH s n/a 37 4757 4786 4821 N
+ V ZH D b n/a 37 4757 4786 4817 N
+ V ZH D s n/a 37 4757 4786 4817 N
+ V ZH DH s n/a 37 4757 4792 4818 N
+ V ZH EH b n/a 37 4757 4779 4802 N
+ V ZH EH s n/a 37 4757 4779 4802 N
+ V ZH ER b n/a 37 4757 4780 4800 N
+ V ZH ER s n/a 37 4757 4780 4800 N
+ V ZH EY b n/a 37 4757 4779 4802 N
+ V ZH EY s n/a 37 4757 4779 4802 N
+ V ZH F s n/a 37 4757 4786 4819 N
+ V ZH G s n/a 37 4757 4786 4817 N
+ V ZH HH s n/a 37 4757 4786 4821 N
+ V ZH IH b n/a 37 4757 4779 4806 N
+ V ZH IH s n/a 37 4757 4779 4806 N
+ V ZH IY b n/a 37 4757 4779 4810 N
+ V ZH IY s n/a 37 4757 4779 4810 N
+ V ZH JH s n/a 37 4757 4786 4817 N
+ V ZH K b n/a 37 4757 4786 4813 N
+ V ZH K s n/a 37 4757 4786 4813 N
+ V ZH L b n/a 37 4757 4795 4828 N
+ V ZH L s n/a 37 4757 4795 4828 N
+ V ZH M s n/a 37 4757 4786 4825 N
+ V ZH N s n/a 37 4757 4786 4825 N
+ V ZH NG s n/a 37 4757 4786 4825 N
+ V ZH OW b n/a 37 4757 4780 4797 N
+ V ZH OW s n/a 37 4757 4780 4797 N
+ V ZH OY b n/a 37 4757 4780 4797 N
+ V ZH OY s n/a 37 4757 4780 4797 N
+ V ZH P b n/a 37 4757 4786 4813 N
+ V ZH P s n/a 37 4757 4786 4813 N
+ V ZH R b n/a 37 4757 4780 4827 N
+ V ZH R s n/a 37 4757 4780 4827 N
+ V ZH S b n/a 37 4757 4786 4819 N
+ V ZH S s n/a 37 4757 4786 4819 N
+ V ZH SH s n/a 37 4757 4786 4819 N
+ V ZH SIL s n/a 37 4757 4786 4816 N
+ V ZH T b n/a 37 4757 4786 4813 N
+ V ZH T s n/a 37 4757 4786 4813 N
+ V ZH TH s n/a 37 4757 4786 4821 N
+ V ZH UH b n/a 37 4757 4780 4798 N
+ V ZH UH s n/a 37 4757 4780 4798 N
+ V ZH UW b n/a 37 4757 4780 4797 N
+ V ZH UW s n/a 37 4757 4780 4797 N
+ V ZH V s n/a 37 4757 4786 4818 N
+ V ZH W b n/a 37 4757 4795 4828 N
+ V ZH W s n/a 37 4757 4795 4828 N
+ V ZH Y b n/a 37 4757 4786 4826 N
+ V ZH Y s n/a 37 4757 4786 4826 N
+ V ZH Z b n/a 37 4757 4786 4818 N
+ V ZH Z s n/a 37 4757 4786 4818 N
+ V ZH ZH s n/a 37 4757 4786 4818 N
+ W AA AA b n/a 38 4858 4910 4947 N
+ W AA AA e n/a 38 4858 4910 4947 N
+ W AA AA i n/a 38 4861 4910 4947 N
+ W AA AA s n/a 38 4858 4910 4947 N
+ W AA AE b n/a 38 4858 4883 4930 N
+ W AA AE e n/a 38 4858 4883 4930 N
+ W AA AE s n/a 38 4858 4883 4930 N
+ W AA AH b n/a 38 4858 4906 4934 N
+ W AA AH e n/a 38 4858 4906 4934 N
+ W AA AH i n/a 38 4861 4905 4937 N
+ W AA AH s n/a 38 4858 4906 4934 N
+ W AA AO b n/a 38 4858 4919 4951 N
+ W AA AO e n/a 38 4858 4919 4951 N
+ W AA AO i n/a 38 4861 4919 4951 N
+ W AA AO s n/a 38 4858 4919 4951 N
+ W AA AW b n/a 38 4858 4883 4930 N
+ W AA AW e n/a 38 4858 4883 4930 N
+ W AA AW s n/a 38 4858 4883 4930 N
+ W AA AY b n/a 38 4858 4912 4946 N
+ W AA AY e n/a 38 4858 4912 4946 N
+ W AA AY i n/a 38 4861 4912 4946 N
+ W AA AY s n/a 38 4858 4912 4946 N
+ W AA B e n/a 38 4858 4880 4930 N
+ W AA B i n/a 38 4861 4880 4930 N
+ W AA B s n/a 38 4858 4880 4930 N
+ W AA CH e n/a 38 4858 4880 4930 N
+ W AA CH s n/a 38 4858 4880 4930 N
+ W AA D e n/a 38 4858 4880 4930 N
+ W AA D s n/a 38 4858 4880 4930 N
+ W AA DH e n/a 38 4858 4880 4930 N
+ W AA DH s n/a 38 4858 4880 4930 N
+ W AA EH b n/a 38 4858 4883 4930 N
+ W AA EH e n/a 38 4858 4883 4930 N
+ W AA EH i n/a 38 4861 4883 4930 N
+ W AA EH s n/a 38 4858 4883 4930 N
+ W AA ER b n/a 38 4858 4917 4949 N
+ W AA ER e n/a 38 4858 4917 4949 N
+ W AA ER i n/a 38 4861 4917 4949 N
+ W AA ER s n/a 38 4858 4917 4949 N
+ W AA EY b n/a 38 4858 4883 4933 N
+ W AA EY e n/a 38 4858 4883 4933 N
+ W AA EY i n/a 38 4861 4883 4933 N
+ W AA EY s n/a 38 4858 4883 4933 N
+ W AA F b n/a 38 4858 4880 4930 N
+ W AA F e n/a 38 4858 4880 4930 N
+ W AA F s n/a 38 4858 4880 4930 N
+ W AA G e n/a 38 4858 4880 4930 N
+ W AA G s n/a 38 4858 4880 4930 N
+ W AA HH e n/a 38 4858 4880 4930 N
+ W AA HH s n/a 38 4858 4880 4930 N
+ W AA IH b n/a 38 4859 4892 4925 N
+ W AA IH e n/a 38 4859 4892 4925 N
+ W AA IH i n/a 38 4861 4892 4925 N
+ W AA IH s n/a 38 4859 4892 4925 N
+ W AA IY b n/a 38 4859 4895 4926 N
+ W AA IY e n/a 38 4859 4895 4926 N
+ W AA IY i n/a 38 4861 4896 4928 N
+ W AA IY s n/a 38 4859 4895 4926 N
+ W AA JH e n/a 38 4858 4880 4930 N
+ W AA JH s n/a 38 4858 4880 4930 N
+ W AA K b n/a 38 4858 4880 4930 N
+ W AA K e n/a 38 4858 4880 4930 N
+ W AA K s n/a 38 4858 4880 4930 N
+ W AA L e n/a 38 4858 4910 4949 N
+ W AA L s n/a 38 4858 4910 4949 N
+ W AA M b n/a 38 4858 4880 4930 N
+ W AA M e n/a 38 4858 4880 4930 N
+ W AA M s n/a 38 4858 4880 4930 N
+ W AA N b n/a 38 4858 4880 4930 N
+ W AA N e n/a 38 4858 4880 4930 N
+ W AA N s n/a 38 4858 4880 4930 N
+ W AA NG e n/a 38 4858 4880 4930 N
+ W AA NG s n/a 38 4858 4880 4930 N
+ W AA OW b n/a 38 4858 4920 4952 N
+ W AA OW e n/a 38 4858 4920 4952 N
+ W AA OW s n/a 38 4858 4920 4952 N
+ W AA OY b n/a 38 4858 4920 4952 N
+ W AA OY e n/a 38 4858 4920 4952 N
+ W AA OY s n/a 38 4858 4920 4952 N
+ W AA P e n/a 38 4858 4880 4930 N
+ W AA P s n/a 38 4858 4880 4930 N
+ W AA R e n/a 38 4858 4910 4949 N
+ W AA R s n/a 38 4858 4910 4949 N
+ W AA S b n/a 38 4858 4880 4930 N
+ W AA S e n/a 38 4858 4880 4930 N
+ W AA S s n/a 38 4858 4880 4930 N
+ W AA SH e n/a 38 4858 4880 4930 N
+ W AA SH s n/a 38 4858 4880 4930 N
+ W AA SIL e n/a 38 4858 4880 4930 N
+ W AA SIL s n/a 38 4858 4880 4930 N
+ W AA T e n/a 38 4858 4880 4930 N
+ W AA T s n/a 38 4858 4880 4930 N
+ W AA TH e n/a 38 4858 4880 4930 N
+ W AA TH s n/a 38 4858 4880 4930 N
+ W AA UH b n/a 38 4859 4880 4941 N
+ W AA UH e n/a 38 4859 4880 4941 N
+ W AA UH i n/a 38 4861 4880 4941 N
+ W AA UH s n/a 38 4859 4880 4941 N
+ W AA UW b n/a 38 4859 4880 4952 N
+ W AA UW e n/a 38 4859 4880 4952 N
+ W AA UW s n/a 38 4859 4880 4952 N
+ W AA V e n/a 38 4858 4880 4930 N
+ W AA V s n/a 38 4858 4880 4930 N
+ W AA W e n/a 38 4858 4917 4949 N
+ W AA W s n/a 38 4858 4917 4949 N
+ W AA Y b n/a 38 4859 4895 4926 N
+ W AA Y e n/a 38 4859 4895 4926 N
+ W AA Y s n/a 38 4859 4895 4926 N
+ W AA Z e n/a 38 4858 4880 4930 N
+ W AA Z s n/a 38 4858 4880 4930 N
+ W AA ZH e n/a 38 4858 4880 4930 N
+ W AA ZH s n/a 38 4858 4880 4930 N
+ W AE AA b n/a 38 4863 4910 4947 N
+ W AE AA i n/a 38 4863 4910 4947 N
+ W AE AA s n/a 38 4863 4910 4947 N
+ W AE AE b n/a 38 4865 4883 4930 N
+ W AE AE s n/a 38 4865 4883 4930 N
+ W AE AH b n/a 38 4863 4903 4934 N
+ W AE AH i n/a 38 4867 4907 4937 N
+ W AE AH s n/a 38 4863 4903 4934 N
+ W AE AO b n/a 38 4864 4919 4951 N
+ W AE AO i n/a 38 4864 4919 4951 N
+ W AE AO s n/a 38 4864 4919 4951 N
+ W AE AW b n/a 38 4865 4883 4930 N
+ W AE AW s n/a 38 4865 4883 4930 N
+ W AE AY b n/a 38 4863 4912 4946 N
+ W AE AY s n/a 38 4863 4912 4946 N
+ W AE B s n/a 38 4865 4880 4930 N
+ W AE CH s n/a 38 4865 4880 4930 N
+ W AE D s n/a 38 4865 4880 4930 N
+ W AE DH s n/a 38 4865 4880 4930 N
+ W AE EH b n/a 38 4865 4883 4930 N
+ W AE EH i n/a 38 4866 4883 4930 N
+ W AE EH s n/a 38 4865 4883 4930 N
+ W AE ER b n/a 38 4862 4917 4949 N
+ W AE ER i n/a 38 4862 4917 4949 N
+ W AE ER s n/a 38 4862 4917 4949 N
+ W AE EY b n/a 38 4865 4883 4933 N
+ W AE EY s n/a 38 4865 4883 4933 N
+ W AE F b n/a 38 4865 4880 4930 N
+ W AE F s n/a 38 4865 4880 4930 N
+ W AE G s n/a 38 4865 4880 4930 N
+ W AE HH s n/a 38 4865 4880 4930 N
+ W AE IH b n/a 38 4865 4892 4925 N
+ W AE IH i n/a 38 4867 4892 4925 N
+ W AE IH s n/a 38 4865 4892 4925 N
+ W AE IY b n/a 38 4865 4895 4926 N
+ W AE IY s n/a 38 4865 4895 4926 N
+ W AE JH s n/a 38 4865 4880 4930 N
+ W AE K b n/a 38 4865 4880 4930 N
+ W AE K s n/a 38 4865 4880 4930 N
+ W AE L s n/a 38 4863 4910 4949 N
+ W AE M b n/a 38 4865 4880 4930 N
+ W AE M s n/a 38 4865 4880 4930 N
+ W AE N b n/a 38 4865 4880 4930 N
+ W AE N s n/a 38 4865 4880 4930 N
+ W AE NG s n/a 38 4865 4880 4930 N
+ W AE OW b n/a 38 4862 4920 4952 N
+ W AE OW i n/a 38 4863 4920 4952 N
+ W AE OW s n/a 38 4862 4920 4952 N
+ W AE OY b n/a 38 4864 4920 4952 N
+ W AE OY s n/a 38 4864 4920 4952 N
+ W AE P s n/a 38 4865 4880 4930 N
+ W AE R s n/a 38 4862 4910 4949 N
+ W AE S b n/a 38 4865 4880 4930 N
+ W AE S s n/a 38 4865 4880 4930 N
+ W AE SH s n/a 38 4865 4880 4930 N
+ W AE SIL s n/a 38 4865 4880 4930 N
+ W AE T s n/a 38 4865 4880 4930 N
+ W AE TH s n/a 38 4865 4880 4930 N
+ W AE UH b n/a 38 4862 4880 4941 N
+ W AE UH s n/a 38 4862 4880 4941 N
+ W AE UW b n/a 38 4862 4880 4952 N
+ W AE UW s n/a 38 4862 4880 4952 N
+ W AE V s n/a 38 4865 4880 4930 N
+ W AE W s n/a 38 4862 4917 4949 N
+ W AE Y b n/a 38 4865 4895 4926 N
+ W AE Y s n/a 38 4865 4895 4926 N
+ W AE Z s n/a 38 4865 4880 4930 N
+ W AE ZH s n/a 38 4865 4880 4930 N
+ W AH AA b n/a 38 4863 4910 4947 N
+ W AH AA i n/a 38 4863 4910 4947 N
+ W AH AA s n/a 38 4863 4910 4947 N
+ W AH AE b n/a 38 4865 4883 4930 N
+ W AH AE i n/a 38 4866 4883 4930 N
+ W AH AE s n/a 38 4865 4883 4930 N
+ W AH AH b n/a 38 4863 4903 4934 N
+ W AH AH i n/a 38 4867 4907 4944 N
+ W AH AH s n/a 38 4863 4903 4934 N
+ W AH AO b n/a 38 4864 4919 4951 N
+ W AH AO i n/a 38 4864 4919 4951 N
+ W AH AO s n/a 38 4864 4919 4951 N
+ W AH AW b n/a 38 4865 4883 4930 N
+ W AH AW s n/a 38 4865 4883 4930 N
+ W AH AY b n/a 38 4863 4912 4946 N
+ W AH AY i n/a 38 4863 4912 4946 N
+ W AH AY s n/a 38 4863 4912 4946 N
+ W AH B s n/a 38 4865 4880 4930 N
+ W AH CH s n/a 38 4865 4880 4930 N
+ W AH D s n/a 38 4865 4880 4930 N
+ W AH DH s n/a 38 4865 4880 4930 N
+ W AH EH b n/a 38 4865 4883 4930 N
+ W AH EH i n/a 38 4866 4883 4930 N
+ W AH EH s n/a 38 4865 4883 4930 N
+ W AH ER b n/a 38 4862 4916 4948 N
+ W AH ER i n/a 38 4862 4916 4948 N
+ W AH ER s n/a 38 4862 4916 4948 N
+ W AH EY b n/a 38 4865 4883 4933 N
+ W AH EY i n/a 38 4866 4883 4933 N
+ W AH EY s n/a 38 4865 4883 4933 N
+ W AH F b n/a 38 4865 4880 4930 N
+ W AH F s n/a 38 4865 4880 4930 N
+ W AH G s n/a 38 4865 4880 4930 N
+ W AH HH s n/a 38 4865 4880 4930 N
+ W AH IH b n/a 38 4865 4893 4925 N
+ W AH IH i n/a 38 4867 4893 4925 N
+ W AH IH s n/a 38 4865 4893 4925 N
+ W AH IY b n/a 38 4865 4895 4926 N
+ W AH IY i n/a 38 4866 4896 4928 N
+ W AH IY s n/a 38 4865 4895 4926 N
+ W AH JH s n/a 38 4865 4880 4930 N
+ W AH K b n/a 38 4865 4880 4930 N
+ W AH K s n/a 38 4865 4880 4930 N
+ W AH L s n/a 38 4863 4910 4948 N
+ W AH M b n/a 38 4865 4880 4930 N
+ W AH M s n/a 38 4865 4880 4930 N
+ W AH N b n/a 38 4865 4880 4930 N
+ W AH N s n/a 38 4865 4880 4930 N
+ W AH NG s n/a 38 4865 4880 4930 N
+ W AH OW b n/a 38 4862 4920 4952 N
+ W AH OW i n/a 38 4863 4920 4952 N
+ W AH OW s n/a 38 4862 4920 4952 N
+ W AH OY b n/a 38 4864 4920 4952 N
+ W AH OY s n/a 38 4864 4920 4952 N
+ W AH P s n/a 38 4865 4880 4930 N
+ W AH R s n/a 38 4862 4910 4948 N
+ W AH S b n/a 38 4865 4880 4930 N
+ W AH S i n/a 38 4866 4880 4930 N
+ W AH S s n/a 38 4865 4880 4930 N
+ W AH SH s n/a 38 4865 4880 4930 N
+ W AH SIL s n/a 38 4865 4880 4930 N
+ W AH T s n/a 38 4865 4880 4930 N
+ W AH TH s n/a 38 4865 4880 4930 N
+ W AH UH b n/a 38 4862 4880 4944 N
+ W AH UH i n/a 38 4863 4880 4944 N
+ W AH UH s n/a 38 4862 4880 4944 N
+ W AH UW b n/a 38 4862 4880 4952 N
+ W AH UW s n/a 38 4862 4880 4952 N
+ W AH V s n/a 38 4865 4880 4930 N
+ W AH W s n/a 38 4862 4916 4948 N
+ W AH Y b n/a 38 4865 4895 4926 N
+ W AH Y s n/a 38 4865 4895 4926 N
+ W AH Z s n/a 38 4865 4880 4930 N
+ W AH ZH s n/a 38 4865 4880 4930 N
+ W AO AA b n/a 38 4858 4910 4947 N
+ W AO AA i n/a 38 4861 4910 4947 N
+ W AO AA s n/a 38 4858 4910 4947 N
+ W AO AE b n/a 38 4858 4883 4930 N
+ W AO AE s n/a 38 4858 4883 4930 N
+ W AO AH b n/a 38 4858 4906 4934 N
+ W AO AH i n/a 38 4861 4905 4937 N
+ W AO AH s n/a 38 4858 4906 4934 N
+ W AO AO b n/a 38 4858 4919 4951 N
+ W AO AO i n/a 38 4861 4919 4951 N
+ W AO AO s n/a 38 4858 4919 4951 N
+ W AO AW b n/a 38 4858 4883 4930 N
+ W AO AW s n/a 38 4858 4883 4930 N
+ W AO AY b n/a 38 4858 4912 4946 N
+ W AO AY s n/a 38 4858 4912 4946 N
+ W AO B s n/a 38 4858 4880 4930 N
+ W AO CH s n/a 38 4858 4880 4930 N
+ W AO D s n/a 38 4858 4880 4930 N
+ W AO DH s n/a 38 4858 4880 4930 N
+ W AO EH b n/a 38 4858 4883 4930 N
+ W AO EH s n/a 38 4858 4883 4930 N
+ W AO ER b n/a 38 4858 4917 4949 N
+ W AO ER s n/a 38 4858 4917 4949 N
+ W AO EY b n/a 38 4858 4883 4933 N
+ W AO EY s n/a 38 4858 4883 4933 N
+ W AO F b n/a 38 4858 4880 4930 N
+ W AO F s n/a 38 4858 4880 4930 N
+ W AO G s n/a 38 4858 4880 4930 N
+ W AO HH s n/a 38 4858 4880 4930 N
+ W AO IH b n/a 38 4859 4892 4925 N
+ W AO IH i n/a 38 4861 4892 4925 N
+ W AO IH s n/a 38 4859 4892 4925 N
+ W AO IY b n/a 38 4859 4895 4926 N
+ W AO IY s n/a 38 4859 4895 4926 N
+ W AO JH s n/a 38 4858 4880 4930 N
+ W AO K b n/a 38 4858 4880 4930 N
+ W AO K s n/a 38 4858 4880 4930 N
+ W AO L s n/a 38 4858 4910 4949 N
+ W AO M b n/a 38 4858 4880 4930 N
+ W AO M s n/a 38 4858 4880 4930 N
+ W AO N b n/a 38 4858 4880 4930 N
+ W AO N s n/a 38 4858 4880 4930 N
+ W AO NG s n/a 38 4858 4880 4930 N
+ W AO OW b n/a 38 4858 4920 4952 N
+ W AO OW s n/a 38 4858 4920 4952 N
+ W AO OY b n/a 38 4858 4920 4952 N
+ W AO OY s n/a 38 4858 4920 4952 N
+ W AO P s n/a 38 4858 4880 4930 N
+ W AO R s n/a 38 4858 4910 4949 N
+ W AO S b n/a 38 4858 4880 4930 N
+ W AO S s n/a 38 4858 4880 4930 N
+ W AO SH s n/a 38 4858 4880 4930 N
+ W AO SIL s n/a 38 4858 4880 4930 N
+ W AO T s n/a 38 4858 4880 4930 N
+ W AO TH s n/a 38 4858 4880 4930 N
+ W AO UH b n/a 38 4859 4880 4941 N
+ W AO UH s n/a 38 4859 4880 4941 N
+ W AO UW b n/a 38 4859 4880 4952 N
+ W AO UW s n/a 38 4859 4880 4952 N
+ W AO V s n/a 38 4858 4880 4930 N
+ W AO W s n/a 38 4858 4917 4949 N
+ W AO Y b n/a 38 4859 4895 4926 N
+ W AO Y s n/a 38 4859 4895 4926 N
+ W AO Z s n/a 38 4858 4880 4930 N
+ W AO ZH s n/a 38 4858 4880 4930 N
+ W AW AA b n/a 38 4858 4910 4947 N
+ W AW AA e n/a 38 4858 4910 4947 N
+ W AW AA s n/a 38 4858 4910 4947 N
+ W AW AE b n/a 38 4858 4883 4930 N
+ W AW AE e n/a 38 4858 4883 4930 N
+ W AW AE s n/a 38 4858 4883 4930 N
+ W AW AH b n/a 38 4858 4906 4934 N
+ W AW AH e n/a 38 4858 4906 4934 N
+ W AW AH i n/a 38 4861 4906 4937 N
+ W AW AH s n/a 38 4858 4906 4934 N
+ W AW AO b n/a 38 4858 4919 4951 N
+ W AW AO e n/a 38 4858 4919 4951 N
+ W AW AO s n/a 38 4858 4919 4951 N
+ W AW AW b n/a 38 4858 4883 4930 N
+ W AW AW e n/a 38 4858 4883 4930 N
+ W AW AW i n/a 38 4861 4883 4930 N
+ W AW AW s n/a 38 4858 4883 4930 N
+ W AW AY b n/a 38 4858 4912 4946 N
+ W AW AY e n/a 38 4858 4912 4946 N
+ W AW AY s n/a 38 4858 4912 4946 N
+ W AW B e n/a 38 4858 4881 4930 N
+ W AW B s n/a 38 4858 4881 4930 N
+ W AW CH e n/a 38 4858 4881 4930 N
+ W AW CH s n/a 38 4858 4881 4930 N
+ W AW D e n/a 38 4858 4881 4930 N
+ W AW D s n/a 38 4858 4881 4930 N
+ W AW DH e n/a 38 4858 4881 4930 N
+ W AW DH s n/a 38 4858 4881 4930 N
+ W AW EH b n/a 38 4858 4883 4930 N
+ W AW EH e n/a 38 4858 4883 4930 N
+ W AW EH i n/a 38 4861 4883 4930 N
+ W AW EH s n/a 38 4858 4883 4930 N
+ W AW ER b n/a 38 4858 4916 4948 N
+ W AW ER e n/a 38 4858 4916 4948 N
+ W AW ER i n/a 38 4861 4916 4949 N
+ W AW ER s n/a 38 4858 4916 4948 N
+ W AW EY b n/a 38 4858 4883 4933 N
+ W AW EY e n/a 38 4858 4883 4933 N
+ W AW EY s n/a 38 4858 4883 4933 N
+ W AW F b n/a 38 4858 4881 4930 N
+ W AW F e n/a 38 4858 4881 4930 N
+ W AW F s n/a 38 4858 4881 4930 N
+ W AW G e n/a 38 4858 4881 4930 N
+ W AW G s n/a 38 4858 4881 4930 N
+ W AW HH e n/a 38 4858 4881 4930 N
+ W AW HH s n/a 38 4858 4881 4930 N
+ W AW IH b n/a 38 4859 4893 4925 N
+ W AW IH e n/a 38 4859 4893 4925 N
+ W AW IH s n/a 38 4859 4893 4925 N
+ W AW IY b n/a 38 4859 4895 4926 N
+ W AW IY e n/a 38 4859 4895 4926 N
+ W AW IY i n/a 38 4861 4896 4928 N
+ W AW IY s n/a 38 4859 4895 4926 N
+ W AW JH e n/a 38 4858 4881 4930 N
+ W AW JH s n/a 38 4858 4881 4930 N
+ W AW K b n/a 38 4858 4881 4930 N
+ W AW K e n/a 38 4858 4881 4930 N
+ W AW K s n/a 38 4858 4881 4930 N
+ W AW L e n/a 38 4858 4910 4948 N
+ W AW L s n/a 38 4858 4910 4948 N
+ W AW M b n/a 38 4858 4881 4930 N
+ W AW M e n/a 38 4858 4881 4930 N
+ W AW M s n/a 38 4858 4881 4930 N
+ W AW N b n/a 38 4858 4881 4930 N
+ W AW N e n/a 38 4858 4881 4930 N
+ W AW N s n/a 38 4858 4881 4930 N
+ W AW NG e n/a 38 4858 4881 4930 N
+ W AW NG s n/a 38 4858 4881 4930 N
+ W AW OW b n/a 38 4858 4920 4952 N
+ W AW OW e n/a 38 4858 4920 4952 N
+ W AW OW s n/a 38 4858 4920 4952 N
+ W AW OY b n/a 38 4858 4920 4952 N
+ W AW OY e n/a 38 4858 4920 4952 N
+ W AW OY s n/a 38 4858 4920 4952 N
+ W AW P e n/a 38 4858 4881 4930 N
+ W AW P s n/a 38 4858 4881 4930 N
+ W AW R e n/a 38 4858 4910 4948 N
+ W AW R s n/a 38 4858 4910 4948 N
+ W AW S b n/a 38 4858 4881 4930 N
+ W AW S e n/a 38 4858 4881 4930 N
+ W AW S s n/a 38 4858 4881 4930 N
+ W AW SH e n/a 38 4858 4881 4930 N
+ W AW SH s n/a 38 4858 4881 4930 N
+ W AW SIL e n/a 38 4858 4881 4930 N
+ W AW SIL s n/a 38 4858 4881 4930 N
+ W AW T e n/a 38 4858 4881 4930 N
+ W AW T s n/a 38 4858 4881 4930 N
+ W AW TH e n/a 38 4858 4881 4930 N
+ W AW TH s n/a 38 4858 4881 4930 N
+ W AW UH b n/a 38 4859 4881 4941 N
+ W AW UH e n/a 38 4859 4881 4941 N
+ W AW UH s n/a 38 4859 4881 4941 N
+ W AW UW b n/a 38 4859 4881 4952 N
+ W AW UW e n/a 38 4859 4881 4952 N
+ W AW UW s n/a 38 4859 4881 4952 N
+ W AW V e n/a 38 4858 4881 4930 N
+ W AW V s n/a 38 4858 4881 4930 N
+ W AW W e n/a 38 4858 4916 4948 N
+ W AW W s n/a 38 4858 4916 4948 N
+ W AW Y b n/a 38 4859 4895 4926 N
+ W AW Y e n/a 38 4859 4895 4926 N
+ W AW Y s n/a 38 4859 4895 4926 N
+ W AW Z e n/a 38 4858 4881 4930 N
+ W AW Z s n/a 38 4858 4881 4930 N
+ W AW ZH e n/a 38 4858 4881 4930 N
+ W AW ZH s n/a 38 4858 4881 4930 N
+ W AY AA b n/a 38 4878 4910 4947 N
+ W AY AA i n/a 38 4878 4910 4947 N
+ W AY AA s n/a 38 4878 4910 4947 N
+ W AY AE b n/a 38 4878 4884 4930 N
+ W AY AE s n/a 38 4878 4884 4930 N
+ W AY AH b n/a 38 4878 4907 4940 N
+ W AY AH i n/a 38 4878 4907 4937 N
+ W AY AH s n/a 38 4878 4907 4940 N
+ W AY AO b n/a 38 4878 4919 4951 N
+ W AY AO i n/a 38 4878 4919 4951 N
+ W AY AO s n/a 38 4878 4919 4951 N
+ W AY AW b n/a 38 4878 4884 4930 N
+ W AY AW s n/a 38 4878 4884 4930 N
+ W AY AY b n/a 38 4878 4912 4946 N
+ W AY AY i n/a 38 4878 4912 4946 N
+ W AY AY s n/a 38 4878 4912 4946 N
+ W AY B s n/a 38 4878 4881 4930 N
+ W AY CH s n/a 38 4878 4881 4930 N
+ W AY D s n/a 38 4878 4881 4930 N
+ W AY DH s n/a 38 4878 4881 4930 N
+ W AY EH b n/a 38 4878 4884 4930 N
+ W AY EH i n/a 38 4878 4884 4930 N
+ W AY EH s n/a 38 4878 4884 4930 N
+ W AY ER b n/a 38 4878 4916 4948 N
+ W AY ER i n/a 38 4878 4916 4949 N
+ W AY ER s n/a 38 4878 4916 4948 N
+ W AY EY b n/a 38 4878 4883 4933 N
+ W AY EY i n/a 38 4878 4883 4933 N
+ W AY EY s n/a 38 4878 4883 4933 N
+ W AY F b n/a 38 4878 4881 4930 N
+ W AY F s n/a 38 4878 4881 4930 N
+ W AY G s n/a 38 4878 4881 4930 N
+ W AY HH s n/a 38 4878 4881 4930 N
+ W AY IH b n/a 38 4878 4892 4925 N
+ W AY IH i n/a 38 4878 4892 4925 N
+ W AY IH s n/a 38 4878 4892 4925 N
+ W AY IY b n/a 38 4878 4895 4926 N
+ W AY IY i n/a 38 4878 4896 4928 N
+ W AY IY s n/a 38 4878 4895 4926 N
+ W AY JH s n/a 38 4878 4881 4930 N
+ W AY K b n/a 38 4878 4881 4930 N
+ W AY K s n/a 38 4878 4881 4930 N
+ W AY L s n/a 38 4878 4910 4948 N
+ W AY M b n/a 38 4878 4881 4930 N
+ W AY M s n/a 38 4878 4881 4930 N
+ W AY N b n/a 38 4878 4881 4930 N
+ W AY N s n/a 38 4878 4881 4930 N
+ W AY NG s n/a 38 4878 4881 4930 N
+ W AY OW b n/a 38 4878 4920 4952 N
+ W AY OW i n/a 38 4878 4920 4952 N
+ W AY OW s n/a 38 4878 4920 4952 N
+ W AY OY b n/a 38 4878 4920 4952 N
+ W AY OY s n/a 38 4878 4920 4952 N
+ W AY P s n/a 38 4878 4881 4930 N
+ W AY R s n/a 38 4878 4910 4948 N
+ W AY S b n/a 38 4878 4881 4930 N
+ W AY S s n/a 38 4878 4881 4930 N
+ W AY SH s n/a 38 4878 4881 4930 N
+ W AY SIL s n/a 38 4878 4881 4930 N
+ W AY T s n/a 38 4878 4881 4930 N
+ W AY TH s n/a 38 4878 4881 4930 N
+ W AY UH b n/a 38 4878 4881 4941 N
+ W AY UH i n/a 38 4878 4881 4941 N
+ W AY UH s n/a 38 4878 4881 4941 N
+ W AY UW b n/a 38 4878 4881 4952 N
+ W AY UW i n/a 38 4878 4881 4952 N
+ W AY UW s n/a 38 4878 4881 4952 N
+ W AY V s n/a 38 4878 4881 4930 N
+ W AY W s n/a 38 4878 4916 4948 N
+ W AY Y b n/a 38 4878 4895 4926 N
+ W AY Y s n/a 38 4878 4895 4926 N
+ W AY Z s n/a 38 4878 4881 4930 N
+ W AY ZH s n/a 38 4878 4881 4930 N
+ W B AA b n/a 38 4830 4910 4947 N
+ W B AA i n/a 38 4855 4910 4947 N
+ W B AA s n/a 38 4830 4910 4947 N
+ W B AE b n/a 38 4830 4884 4930 N
+ W B AE s n/a 38 4830 4884 4930 N
+ W B AH b n/a 38 4830 4901 4935 N
+ W B AH i n/a 38 4855 4906 4938 N
+ W B AH s n/a 38 4830 4901 4935 N
+ W B AO b n/a 38 4830 4919 4951 N
+ W B AO s n/a 38 4830 4919 4951 N
+ W B AW b n/a 38 4830 4884 4930 N
+ W B AW s n/a 38 4830 4884 4930 N
+ W B AY b n/a 38 4830 4912 4946 N
+ W B AY i n/a 38 4855 4912 4946 N
+ W B AY s n/a 38 4830 4912 4946 N
+ W B B s n/a 38 4830 4880 4930 N
+ W B CH s n/a 38 4830 4880 4930 N
+ W B D s n/a 38 4830 4880 4930 N
+ W B DH s n/a 38 4830 4880 4930 N
+ W B EH b n/a 38 4830 4884 4930 N
+ W B EH i n/a 38 4855 4884 4930 N
+ W B EH s n/a 38 4830 4884 4930 N
+ W B ER b n/a 38 4830 4916 4948 N
+ W B ER i n/a 38 4855 4916 4949 N
+ W B ER s n/a 38 4830 4916 4948 N
+ W B EY b n/a 38 4830 4883 4933 N
+ W B EY i n/a 38 4855 4883 4933 N
+ W B EY s n/a 38 4830 4883 4933 N
+ W B F b n/a 38 4830 4880 4930 N
+ W B F s n/a 38 4830 4880 4930 N
+ W B G s n/a 38 4830 4880 4930 N
+ W B HH s n/a 38 4830 4880 4930 N
+ W B IH b n/a 38 4851 4890 4925 N
+ W B IH i n/a 38 4855 4890 4925 N
+ W B IH s n/a 38 4851 4890 4925 N
+ W B IY b n/a 38 4851 4895 4926 N
+ W B IY i n/a 38 4855 4896 4928 N
+ W B IY s n/a 38 4851 4895 4926 N
+ W B JH s n/a 38 4830 4880 4930 N
+ W B K b n/a 38 4830 4880 4930 N
+ W B K s n/a 38 4830 4880 4930 N
+ W B L s n/a 38 4830 4910 4948 N
+ W B M b n/a 38 4830 4880 4930 N
+ W B M s n/a 38 4830 4880 4930 N
+ W B N b n/a 38 4830 4880 4930 N
+ W B N s n/a 38 4830 4880 4930 N
+ W B NG s n/a 38 4830 4880 4930 N
+ W B OW b n/a 38 4830 4920 4952 N
+ W B OW i n/a 38 4855 4920 4952 N
+ W B OW s n/a 38 4830 4920 4952 N
+ W B OY b n/a 38 4830 4920 4952 N
+ W B OY s n/a 38 4830 4920 4952 N
+ W B P s n/a 38 4830 4880 4930 N
+ W B R s n/a 38 4830 4910 4948 N
+ W B S b n/a 38 4830 4880 4930 N
+ W B S s n/a 38 4830 4880 4930 N
+ W B SH s n/a 38 4830 4880 4930 N
+ W B SIL s n/a 38 4830 4880 4930 N
+ W B T s n/a 38 4830 4880 4930 N
+ W B TH s n/a 38 4830 4880 4930 N
+ W B UH b n/a 38 4851 4880 4941 N
+ W B UH s n/a 38 4851 4880 4941 N
+ W B UW b n/a 38 4851 4880 4952 N
+ W B UW s n/a 38 4851 4880 4952 N
+ W B V s n/a 38 4830 4880 4930 N
+ W B W s n/a 38 4830 4916 4948 N
+ W B Y b n/a 38 4851 4895 4926 N
+ W B Y s n/a 38 4851 4895 4926 N
+ W B Z s n/a 38 4830 4880 4930 N
+ W B ZH s n/a 38 4830 4880 4930 N
+ W CH AA b n/a 38 4837 4910 4947 N
+ W CH AA i n/a 38 4846 4909 4947 N
+ W CH AA s n/a 38 4837 4910 4947 N
+ W CH AE b n/a 38 4837 4884 4930 N
+ W CH AE s n/a 38 4837 4884 4930 N
+ W CH AH b n/a 38 4837 4900 4942 N
+ W CH AH i n/a 38 4846 4900 4943 N
+ W CH AH s n/a 38 4837 4900 4942 N
+ W CH AO b n/a 38 4837 4919 4951 N
+ W CH AO i n/a 38 4846 4921 4951 N
+ W CH AO s n/a 38 4837 4919 4951 N
+ W CH AW b n/a 38 4837 4884 4930 N
+ W CH AW s n/a 38 4837 4884 4930 N
+ W CH AY b n/a 38 4837 4912 4946 N
+ W CH AY i n/a 38 4846 4911 4946 N
+ W CH AY s n/a 38 4837 4912 4946 N
+ W CH B s n/a 38 4837 4879 4930 N
+ W CH CH s n/a 38 4837 4879 4930 N
+ W CH D s n/a 38 4837 4879 4930 N
+ W CH DH s n/a 38 4837 4879 4930 N
+ W CH EH b n/a 38 4837 4884 4930 N
+ W CH EH i n/a 38 4846 4884 4930 N
+ W CH EH s n/a 38 4837 4884 4930 N
+ W CH ER b n/a 38 4837 4915 4948 N
+ W CH ER i n/a 38 4846 4915 4949 N
+ W CH ER s n/a 38 4837 4915 4948 N
+ W CH EY b n/a 38 4837 4883 4933 N
+ W CH EY i n/a 38 4846 4883 4933 N
+ W CH EY s n/a 38 4837 4883 4933 N
+ W CH F b n/a 38 4837 4879 4930 N
+ W CH F s n/a 38 4837 4879 4930 N
+ W CH G s n/a 38 4837 4879 4930 N
+ W CH HH s n/a 38 4837 4879 4930 N
+ W CH IH b n/a 38 4844 4889 4923 N
+ W CH IH s n/a 38 4844 4889 4923 N
+ W CH IY b n/a 38 4844 4898 4927 N
+ W CH IY s n/a 38 4844 4898 4927 N
+ W CH JH s n/a 38 4837 4879 4930 N
+ W CH K b n/a 38 4837 4879 4930 N
+ W CH K s n/a 38 4837 4879 4930 N
+ W CH L s n/a 38 4837 4910 4948 N
+ W CH M b n/a 38 4837 4879 4930 N
+ W CH M s n/a 38 4837 4879 4930 N
+ W CH N b n/a 38 4837 4879 4930 N
+ W CH N s n/a 38 4837 4879 4930 N
+ W CH NG s n/a 38 4837 4879 4930 N
+ W CH OW b n/a 38 4837 4920 4952 N
+ W CH OW s n/a 38 4837 4920 4952 N
+ W CH OY b n/a 38 4837 4920 4952 N
+ W CH OY s n/a 38 4837 4920 4952 N
+ W CH P s n/a 38 4837 4879 4930 N
+ W CH R s n/a 38 4837 4910 4948 N
+ W CH S b n/a 38 4837 4879 4930 N
+ W CH S s n/a 38 4837 4879 4930 N
+ W CH SH s n/a 38 4837 4879 4930 N
+ W CH SIL s n/a 38 4837 4879 4930 N
+ W CH T s n/a 38 4837 4879 4930 N
+ W CH TH s n/a 38 4837 4879 4930 N
+ W CH UH b n/a 38 4844 4879 4941 N
+ W CH UH i n/a 38 4846 4879 4941 N
+ W CH UH s n/a 38 4844 4879 4941 N
+ W CH UW b n/a 38 4844 4879 4952 N
+ W CH UW s n/a 38 4844 4879 4952 N
+ W CH V s n/a 38 4837 4879 4930 N
+ W CH W s n/a 38 4837 4915 4948 N
+ W CH Y b n/a 38 4844 4898 4927 N
+ W CH Y s n/a 38 4844 4898 4927 N
+ W CH Z s n/a 38 4837 4879 4930 N
+ W CH ZH s n/a 38 4837 4879 4930 N
+ W D AA b n/a 38 4831 4910 4947 N
+ W D AA i n/a 38 4854 4910 4947 N
+ W D AA s n/a 38 4831 4910 4947 N
+ W D AE b n/a 38 4831 4884 4930 N
+ W D AE i n/a 38 4854 4884 4930 N
+ W D AE s n/a 38 4831 4884 4930 N
+ W D AH b n/a 38 4833 4901 4935 N
+ W D AH i n/a 38 4854 4908 4939 N
+ W D AH s n/a 38 4833 4901 4935 N
+ W D AO b n/a 38 4831 4919 4951 N
+ W D AO i n/a 38 4854 4919 4951 N
+ W D AO s n/a 38 4831 4919 4951 N
+ W D AW b n/a 38 4831 4884 4930 N
+ W D AW s n/a 38 4831 4884 4930 N
+ W D AY b n/a 38 4831 4912 4946 N
+ W D AY i n/a 38 4854 4912 4946 N
+ W D AY s n/a 38 4831 4912 4946 N
+ W D B s n/a 38 4833 4880 4930 N
+ W D CH s n/a 38 4833 4880 4930 N
+ W D D s n/a 38 4833 4880 4930 N
+ W D DH s n/a 38 4833 4880 4930 N
+ W D EH b n/a 38 4833 4884 4930 N
+ W D EH i n/a 38 4854 4884 4930 N
+ W D EH s n/a 38 4833 4884 4930 N
+ W D ER b n/a 38 4833 4916 4948 N
+ W D ER i n/a 38 4854 4916 4949 N
+ W D ER s n/a 38 4833 4916 4948 N
+ W D EY b n/a 38 4833 4883 4933 N
+ W D EY i n/a 38 4854 4883 4933 N
+ W D EY s n/a 38 4833 4883 4933 N
+ W D F b n/a 38 4833 4880 4930 N
+ W D F s n/a 38 4833 4880 4930 N
+ W D G s n/a 38 4833 4880 4930 N
+ W D HH s n/a 38 4833 4880 4930 N
+ W D IH b n/a 38 4854 4890 4922 N
+ W D IH i n/a 38 4854 4890 4924 N
+ W D IH s n/a 38 4854 4890 4922 N
+ W D IY b n/a 38 4855 4895 4926 N
+ W D IY i n/a 38 4854 4896 4928 N
+ W D IY s n/a 38 4855 4895 4926 N
+ W D JH s n/a 38 4833 4880 4930 N
+ W D K b n/a 38 4833 4880 4930 N
+ W D K s n/a 38 4833 4880 4930 N
+ W D L s n/a 38 4833 4910 4948 N
+ W D M b n/a 38 4833 4880 4930 N
+ W D M s n/a 38 4833 4880 4930 N
+ W D N b n/a 38 4833 4880 4930 N
+ W D N s n/a 38 4833 4880 4930 N
+ W D NG s n/a 38 4833 4880 4930 N
+ W D OW b n/a 38 4833 4920 4952 N
+ W D OW i n/a 38 4854 4920 4952 N
+ W D OW s n/a 38 4833 4920 4952 N
+ W D OY b n/a 38 4831 4920 4952 N
+ W D OY s n/a 38 4831 4920 4952 N
+ W D P s n/a 38 4833 4880 4930 N
+ W D R s n/a 38 4833 4910 4948 N
+ W D S b n/a 38 4833 4880 4930 N
+ W D S s n/a 38 4833 4880 4930 N
+ W D SH s n/a 38 4833 4880 4930 N
+ W D SIL s n/a 38 4833 4880 4930 N
+ W D T s n/a 38 4833 4880 4930 N
+ W D TH s n/a 38 4833 4880 4930 N
+ W D UH b n/a 38 4854 4880 4941 N
+ W D UH i n/a 38 4854 4880 4941 N
+ W D UH s n/a 38 4854 4880 4941 N
+ W D UW b n/a 38 4854 4880 4952 N
+ W D UW s n/a 38 4854 4880 4952 N
+ W D V s n/a 38 4833 4880 4930 N
+ W D W s n/a 38 4833 4916 4948 N
+ W D Y b n/a 38 4855 4895 4926 N
+ W D Y s n/a 38 4855 4895 4926 N
+ W D Z s n/a 38 4833 4880 4930 N
+ W D ZH s n/a 38 4833 4880 4930 N
+ W DH AA b n/a 38 4831 4910 4947 N
+ W DH AA s n/a 38 4831 4910 4947 N
+ W DH AE b n/a 38 4831 4884 4930 N
+ W DH AE s n/a 38 4831 4884 4930 N
+ W DH AH b n/a 38 4833 4903 4934 N
+ W DH AH s n/a 38 4833 4903 4934 N
+ W DH AO b n/a 38 4831 4919 4951 N
+ W DH AO s n/a 38 4831 4919 4951 N
+ W DH AW b n/a 38 4831 4884 4930 N
+ W DH AW s n/a 38 4831 4884 4930 N
+ W DH AY b n/a 38 4831 4912 4946 N
+ W DH AY s n/a 38 4831 4912 4946 N
+ W DH B s n/a 38 4833 4880 4930 N
+ W DH CH s n/a 38 4833 4880 4930 N
+ W DH D s n/a 38 4833 4880 4930 N
+ W DH DH s n/a 38 4833 4880 4930 N
+ W DH EH b n/a 38 4833 4884 4930 N
+ W DH EH s n/a 38 4833 4884 4930 N
+ W DH ER b n/a 38 4833 4916 4948 N
+ W DH ER s n/a 38 4833 4916 4948 N
+ W DH EY b n/a 38 4833 4883 4933 N
+ W DH EY i n/a 38 4853 4883 4933 N
+ W DH EY s n/a 38 4833 4883 4933 N
+ W DH F b n/a 38 4833 4880 4930 N
+ W DH F s n/a 38 4833 4880 4930 N
+ W DH G s n/a 38 4833 4880 4930 N
+ W DH HH s n/a 38 4833 4880 4930 N
+ W DH IH b n/a 38 4852 4889 4923 N
+ W DH IH s n/a 38 4852 4889 4923 N
+ W DH IY b n/a 38 4853 4895 4926 N
+ W DH IY s n/a 38 4853 4895 4926 N
+ W DH JH s n/a 38 4833 4880 4930 N
+ W DH K b n/a 38 4833 4880 4930 N
+ W DH K s n/a 38 4833 4880 4930 N
+ W DH L s n/a 38 4833 4910 4948 N
+ W DH M b n/a 38 4833 4880 4930 N
+ W DH M s n/a 38 4833 4880 4930 N
+ W DH N b n/a 38 4833 4880 4930 N
+ W DH N s n/a 38 4833 4880 4930 N
+ W DH NG s n/a 38 4833 4880 4930 N
+ W DH OW b n/a 38 4833 4920 4952 N
+ W DH OW s n/a 38 4833 4920 4952 N
+ W DH OY b n/a 38 4831 4920 4952 N
+ W DH OY s n/a 38 4831 4920 4952 N
+ W DH P s n/a 38 4833 4880 4930 N
+ W DH R s n/a 38 4833 4910 4948 N
+ W DH S b n/a 38 4833 4880 4930 N
+ W DH S s n/a 38 4833 4880 4930 N
+ W DH SH s n/a 38 4833 4880 4930 N
+ W DH SIL s n/a 38 4833 4880 4930 N
+ W DH T s n/a 38 4833 4880 4930 N
+ W DH TH s n/a 38 4833 4880 4930 N
+ W DH UH b n/a 38 4853 4880 4941 N
+ W DH UH s n/a 38 4853 4880 4941 N
+ W DH UW b n/a 38 4853 4880 4952 N
+ W DH UW s n/a 38 4853 4880 4952 N
+ W DH V s n/a 38 4833 4880 4930 N
+ W DH W s n/a 38 4833 4916 4948 N
+ W DH Y b n/a 38 4853 4895 4926 N
+ W DH Y s n/a 38 4853 4895 4926 N
+ W DH Z s n/a 38 4833 4880 4930 N
+ W DH ZH s n/a 38 4833 4880 4930 N
+ W EH AA b n/a 38 4863 4910 4947 N
+ W EH AA s n/a 38 4863 4910 4947 N
+ W EH AE b n/a 38 4865 4883 4930 N
+ W EH AE s n/a 38 4865 4883 4930 N
+ W EH AH b n/a 38 4863 4903 4934 N
+ W EH AH i n/a 38 4867 4907 4944 N
+ W EH AH s n/a 38 4863 4903 4934 N
+ W EH AO b n/a 38 4864 4919 4951 N
+ W EH AO s n/a 38 4864 4919 4951 N
+ W EH AW b n/a 38 4865 4883 4930 N
+ W EH AW s n/a 38 4865 4883 4930 N
+ W EH AY b n/a 38 4863 4912 4946 N
+ W EH AY s n/a 38 4863 4912 4946 N
+ W EH B s n/a 38 4865 4880 4930 N
+ W EH CH s n/a 38 4865 4880 4930 N
+ W EH D s n/a 38 4865 4880 4930 N
+ W EH DH s n/a 38 4865 4880 4930 N
+ W EH EH b n/a 38 4865 4883 4930 N
+ W EH EH i n/a 38 4866 4883 4930 N
+ W EH EH s n/a 38 4865 4883 4930 N
+ W EH ER b n/a 38 4862 4916 4948 N
+ W EH ER i n/a 38 4862 4916 4948 N
+ W EH ER s n/a 38 4862 4916 4948 N
+ W EH EY b n/a 38 4865 4883 4933 N
+ W EH EY i n/a 38 4866 4883 4933 N
+ W EH EY s n/a 38 4865 4883 4933 N
+ W EH F b n/a 38 4865 4880 4930 N
+ W EH F s n/a 38 4865 4880 4930 N
+ W EH G s n/a 38 4865 4880 4930 N
+ W EH HH s n/a 38 4865 4880 4930 N
+ W EH IH b n/a 38 4865 4892 4925 N
+ W EH IH i n/a 38 4867 4892 4925 N
+ W EH IH s n/a 38 4865 4892 4925 N
+ W EH IY b n/a 38 4865 4895 4926 N
+ W EH IY s n/a 38 4865 4895 4926 N
+ W EH JH s n/a 38 4865 4880 4930 N
+ W EH K b n/a 38 4865 4880 4930 N
+ W EH K s n/a 38 4865 4880 4930 N
+ W EH L s n/a 38 4863 4910 4948 N
+ W EH M b n/a 38 4865 4880 4930 N
+ W EH M s n/a 38 4865 4880 4930 N
+ W EH N b n/a 38 4865 4880 4930 N
+ W EH N s n/a 38 4865 4880 4930 N
+ W EH NG s n/a 38 4865 4880 4930 N
+ W EH OW b n/a 38 4862 4920 4952 N
+ W EH OW s n/a 38 4862 4920 4952 N
+ W EH OY b n/a 38 4864 4920 4952 N
+ W EH OY s n/a 38 4864 4920 4952 N
+ W EH P s n/a 38 4865 4880 4930 N
+ W EH R s n/a 38 4862 4910 4948 N
+ W EH S b n/a 38 4865 4880 4930 N
+ W EH S i n/a 38 4866 4880 4930 N
+ W EH S s n/a 38 4865 4880 4930 N
+ W EH SH s n/a 38 4865 4880 4930 N
+ W EH SIL s n/a 38 4865 4880 4930 N
+ W EH T s n/a 38 4865 4880 4930 N
+ W EH TH s n/a 38 4865 4880 4930 N
+ W EH UH b n/a 38 4862 4880 4944 N
+ W EH UH s n/a 38 4862 4880 4944 N
+ W EH UW b n/a 38 4862 4880 4952 N
+ W EH UW s n/a 38 4862 4880 4952 N
+ W EH V s n/a 38 4865 4880 4930 N
+ W EH W s n/a 38 4862 4916 4948 N
+ W EH Y b n/a 38 4865 4895 4926 N
+ W EH Y s n/a 38 4865 4895 4926 N
+ W EH Z s n/a 38 4865 4880 4930 N
+ W EH ZH s n/a 38 4865 4880 4930 N
+ W ER AA b n/a 38 4869 4910 4947 N
+ W ER AA i n/a 38 4869 4910 4947 N
+ W ER AA s n/a 38 4869 4910 4947 N
+ W ER AE b n/a 38 4869 4883 4930 N
+ W ER AE i n/a 38 4869 4883 4930 N
+ W ER AE s n/a 38 4869 4883 4930 N
+ W ER AH b n/a 38 4869 4906 4937 N
+ W ER AH i n/a 38 4869 4906 4937 N
+ W ER AH s n/a 38 4869 4906 4937 N
+ W ER AO b n/a 38 4869 4919 4951 N
+ W ER AO i n/a 38 4869 4919 4951 N
+ W ER AO s n/a 38 4869 4919 4951 N
+ W ER AW b n/a 38 4869 4883 4930 N
+ W ER AW i n/a 38 4869 4883 4930 N
+ W ER AW s n/a 38 4869 4883 4930 N
+ W ER AY b n/a 38 4869 4912 4946 N
+ W ER AY i n/a 38 4869 4912 4946 N
+ W ER AY s n/a 38 4869 4912 4946 N
+ W ER B s n/a 38 4869 4880 4930 N
+ W ER CH s n/a 38 4869 4880 4930 N
+ W ER D s n/a 38 4869 4880 4930 N
+ W ER DH s n/a 38 4869 4880 4930 N
+ W ER EH b n/a 38 4869 4883 4930 N
+ W ER EH i n/a 38 4869 4883 4930 N
+ W ER EH s n/a 38 4869 4883 4930 N
+ W ER ER b n/a 38 4870 4917 4948 N
+ W ER ER i n/a 38 4868 4917 4949 N
+ W ER ER s n/a 38 4870 4917 4948 N
+ W ER EY b n/a 38 4869 4883 4933 N
+ W ER EY i n/a 38 4869 4883 4933 N
+ W ER EY s n/a 38 4869 4883 4933 N
+ W ER F b n/a 38 4869 4880 4930 N
+ W ER F s n/a 38 4869 4880 4930 N
+ W ER G s n/a 38 4869 4880 4930 N
+ W ER HH s n/a 38 4869 4880 4930 N
+ W ER IH b n/a 38 4868 4893 4925 N
+ W ER IH i n/a 38 4868 4893 4925 N
+ W ER IH s n/a 38 4868 4893 4925 N
+ W ER IY b n/a 38 4868 4895 4926 N
+ W ER IY i n/a 38 4868 4896 4928 N
+ W ER IY s n/a 38 4868 4895 4926 N
+ W ER JH s n/a 38 4869 4880 4930 N
+ W ER K b n/a 38 4869 4880 4930 N
+ W ER K s n/a 38 4869 4880 4930 N
+ W ER L s n/a 38 4869 4910 4948 N
+ W ER M b n/a 38 4869 4880 4930 N
+ W ER M s n/a 38 4869 4880 4930 N
+ W ER N b n/a 38 4869 4880 4930 N
+ W ER N s n/a 38 4869 4880 4930 N
+ W ER NG s n/a 38 4869 4880 4930 N
+ W ER OW b n/a 38 4869 4920 4952 N
+ W ER OW i n/a 38 4869 4920 4952 N
+ W ER OW s n/a 38 4869 4920 4952 N
+ W ER OY b n/a 38 4869 4920 4952 N
+ W ER OY s n/a 38 4869 4920 4952 N
+ W ER P s n/a 38 4869 4880 4930 N
+ W ER R s n/a 38 4870 4910 4948 N
+ W ER S b n/a 38 4869 4880 4930 N
+ W ER S s n/a 38 4869 4880 4930 N
+ W ER SH s n/a 38 4869 4880 4930 N
+ W ER SIL s n/a 38 4869 4880 4930 N
+ W ER T s n/a 38 4869 4880 4930 N
+ W ER TH s n/a 38 4869 4880 4930 N
+ W ER UH b n/a 38 4869 4880 4941 N
+ W ER UH i n/a 38 4869 4880 4941 N
+ W ER UH s n/a 38 4869 4880 4941 N
+ W ER UW b n/a 38 4869 4880 4952 N
+ W ER UW s n/a 38 4869 4880 4952 N
+ W ER V s n/a 38 4869 4880 4930 N
+ W ER W s n/a 38 4869 4917 4948 N
+ W ER Y b n/a 38 4868 4895 4926 N
+ W ER Y s n/a 38 4868 4895 4926 N
+ W ER Z s n/a 38 4869 4880 4930 N
+ W ER ZH s n/a 38 4869 4880 4930 N
+ W EY AA b n/a 38 4877 4910 4947 N
+ W EY AA i n/a 38 4877 4910 4947 N
+ W EY AA s n/a 38 4877 4910 4947 N
+ W EY AE b n/a 38 4877 4884 4930 N
+ W EY AE i n/a 38 4877 4884 4930 N
+ W EY AE s n/a 38 4877 4884 4930 N
+ W EY AH b n/a 38 4877 4907 4940 N
+ W EY AH i n/a 38 4877 4907 4937 N
+ W EY AH s n/a 38 4877 4907 4940 N
+ W EY AO b n/a 38 4877 4919 4951 N
+ W EY AO i n/a 38 4877 4919 4951 N
+ W EY AO s n/a 38 4877 4919 4951 N
+ W EY AW b n/a 38 4877 4884 4930 N
+ W EY AW s n/a 38 4877 4884 4930 N
+ W EY AY b n/a 38 4877 4912 4946 N
+ W EY AY i n/a 38 4877 4912 4946 N
+ W EY AY s n/a 38 4877 4912 4946 N
+ W EY B s n/a 38 4877 4881 4930 N
+ W EY CH s n/a 38 4877 4881 4930 N
+ W EY D s n/a 38 4877 4881 4930 N
+ W EY DH s n/a 38 4877 4881 4930 N
+ W EY EH b n/a 38 4877 4884 4930 N
+ W EY EH i n/a 38 4877 4884 4930 N
+ W EY EH s n/a 38 4877 4884 4930 N
+ W EY ER b n/a 38 4877 4918 4949 N
+ W EY ER i n/a 38 4877 4918 4949 N
+ W EY ER s n/a 38 4877 4918 4949 N
+ W EY EY b n/a 38 4877 4883 4933 N
+ W EY EY i n/a 38 4877 4883 4933 N
+ W EY EY s n/a 38 4877 4883 4933 N
+ W EY F b n/a 38 4877 4881 4930 N
+ W EY F s n/a 38 4877 4881 4930 N
+ W EY G s n/a 38 4877 4881 4930 N
+ W EY HH s n/a 38 4877 4881 4930 N
+ W EY IH b n/a 38 4877 4892 4925 N
+ W EY IH i n/a 38 4877 4892 4925 N
+ W EY IH s n/a 38 4877 4892 4925 N
+ W EY IY b n/a 38 4877 4895 4926 N
+ W EY IY s n/a 38 4877 4895 4926 N
+ W EY JH s n/a 38 4877 4881 4930 N
+ W EY K b n/a 38 4877 4881 4930 N
+ W EY K s n/a 38 4877 4881 4930 N
+ W EY L s n/a 38 4877 4910 4949 N
+ W EY M b n/a 38 4877 4881 4930 N
+ W EY M s n/a 38 4877 4881 4930 N
+ W EY N b n/a 38 4877 4881 4930 N
+ W EY N s n/a 38 4877 4881 4930 N
+ W EY NG s n/a 38 4877 4881 4930 N
+ W EY OW b n/a 38 4877 4920 4952 N
+ W EY OW s n/a 38 4877 4920 4952 N
+ W EY OY b n/a 38 4877 4920 4952 N
+ W EY OY s n/a 38 4877 4920 4952 N
+ W EY P s n/a 38 4877 4881 4930 N
+ W EY R s n/a 38 4877 4910 4949 N
+ W EY S b n/a 38 4877 4881 4930 N
+ W EY S s n/a 38 4877 4881 4930 N
+ W EY SH s n/a 38 4877 4881 4930 N
+ W EY SIL s n/a 38 4877 4881 4930 N
+ W EY T s n/a 38 4877 4881 4930 N
+ W EY TH s n/a 38 4877 4881 4930 N
+ W EY UH b n/a 38 4877 4881 4941 N
+ W EY UH i n/a 38 4877 4881 4941 N
+ W EY UH s n/a 38 4877 4881 4941 N
+ W EY UW b n/a 38 4877 4881 4952 N
+ W EY UW i n/a 38 4877 4881 4952 N
+ W EY UW s n/a 38 4877 4881 4952 N
+ W EY V s n/a 38 4877 4881 4930 N
+ W EY W s n/a 38 4877 4918 4949 N
+ W EY Y b n/a 38 4877 4895 4926 N
+ W EY Y s n/a 38 4877 4895 4926 N
+ W EY Z s n/a 38 4877 4881 4930 N
+ W EY ZH s n/a 38 4877 4881 4930 N
+ W F AA b n/a 38 4834 4910 4947 N
+ W F AA i n/a 38 4849 4909 4947 N
+ W F AA s n/a 38 4834 4910 4947 N
+ W F AE b n/a 38 4834 4886 4930 N
+ W F AE s n/a 38 4834 4886 4930 N
+ W F AH b n/a 38 4834 4899 4942 N
+ W F AH s n/a 38 4834 4899 4942 N
+ W F AO b n/a 38 4834 4919 4951 N
+ W F AO s n/a 38 4834 4919 4951 N
+ W F AW b n/a 38 4834 4886 4930 N
+ W F AW s n/a 38 4834 4886 4930 N
+ W F AY b n/a 38 4834 4912 4946 N
+ W F AY s n/a 38 4834 4912 4946 N
+ W F B s n/a 38 4834 4879 4930 N
+ W F CH s n/a 38 4834 4879 4930 N
+ W F D s n/a 38 4834 4879 4930 N
+ W F DH s n/a 38 4834 4879 4930 N
+ W F EH b n/a 38 4834 4886 4930 N
+ W F EH i n/a 38 4851 4886 4930 N
+ W F EH s n/a 38 4834 4886 4930 N
+ W F ER b n/a 38 4836 4915 4948 N
+ W F ER i n/a 38 4851 4915 4949 N
+ W F ER s n/a 38 4836 4915 4948 N
+ W F EY b n/a 38 4834 4886 4933 N
+ W F EY i n/a 38 4851 4886 4933 N
+ W F EY s n/a 38 4834 4886 4933 N
+ W F F b n/a 38 4834 4879 4930 N
+ W F F s n/a 38 4834 4879 4930 N
+ W F G s n/a 38 4834 4879 4930 N
+ W F HH s n/a 38 4834 4879 4930 N
+ W F IH b n/a 38 4851 4889 4923 N
+ W F IH i n/a 38 4851 4888 4924 N
+ W F IH s n/a 38 4851 4889 4923 N
+ W F IY b n/a 38 4851 4897 4927 N
+ W F IY i n/a 38 4851 4897 4927 N
+ W F IY s n/a 38 4851 4897 4927 N
+ W F JH s n/a 38 4834 4879 4930 N
+ W F K b n/a 38 4834 4879 4930 N
+ W F K s n/a 38 4834 4879 4930 N
+ W F L s n/a 38 4836 4910 4948 N
+ W F M b n/a 38 4834 4879 4930 N
+ W F M s n/a 38 4834 4879 4930 N
+ W F N b n/a 38 4834 4879 4930 N
+ W F N s n/a 38 4834 4879 4930 N
+ W F NG s n/a 38 4834 4879 4930 N
+ W F OW b n/a 38 4834 4920 4952 N
+ W F OW i n/a 38 4851 4920 4952 N
+ W F OW s n/a 38 4834 4920 4952 N
+ W F OY b n/a 38 4834 4920 4952 N
+ W F OY s n/a 38 4834 4920 4952 N
+ W F P s n/a 38 4834 4879 4930 N
+ W F R s n/a 38 4836 4910 4948 N
+ W F S b n/a 38 4834 4879 4930 N
+ W F S s n/a 38 4834 4879 4930 N
+ W F SH s n/a 38 4834 4879 4930 N
+ W F SIL s n/a 38 4834 4879 4930 N
+ W F T s n/a 38 4834 4879 4930 N
+ W F TH s n/a 38 4834 4879 4930 N
+ W F UH b n/a 38 4851 4879 4941 N
+ W F UH s n/a 38 4851 4879 4941 N
+ W F UW b n/a 38 4851 4879 4952 N
+ W F UW s n/a 38 4851 4879 4952 N
+ W F V s n/a 38 4834 4879 4930 N
+ W F W s n/a 38 4836 4915 4948 N
+ W F Y b n/a 38 4851 4897 4927 N
+ W F Y s n/a 38 4851 4897 4927 N
+ W F Z s n/a 38 4834 4879 4930 N
+ W F ZH s n/a 38 4834 4879 4930 N
+ W G AA b n/a 38 4849 4910 4947 N
+ W G AA i n/a 38 4849 4910 4947 N
+ W G AA s n/a 38 4849 4910 4947 N
+ W G AE b n/a 38 4849 4884 4930 N
+ W G AE i n/a 38 4849 4884 4930 N
+ W G AE s n/a 38 4849 4884 4930 N
+ W G AH b n/a 38 4851 4901 4935 N
+ W G AH i n/a 38 4850 4908 4938 N
+ W G AH s n/a 38 4851 4901 4935 N
+ W G AO b n/a 38 4849 4919 4951 N
+ W G AO i n/a 38 4849 4919 4951 N
+ W G AO s n/a 38 4849 4919 4951 N
+ W G AW b n/a 38 4849 4884 4930 N
+ W G AW s n/a 38 4849 4884 4930 N
+ W G AY b n/a 38 4849 4914 4946 N
+ W G AY i n/a 38 4849 4914 4945 N
+ W G AY s n/a 38 4849 4914 4946 N
+ W G B s n/a 38 4851 4880 4930 N
+ W G CH s n/a 38 4851 4880 4930 N
+ W G D s n/a 38 4851 4880 4930 N
+ W G DH s n/a 38 4851 4880 4930 N
+ W G EH b n/a 38 4851 4884 4930 N
+ W G EH i n/a 38 4850 4884 4930 N
+ W G EH s n/a 38 4851 4884 4930 N
+ W G ER b n/a 38 4851 4916 4948 N
+ W G ER i n/a 38 4850 4916 4949 N
+ W G ER s n/a 38 4851 4916 4948 N
+ W G EY b n/a 38 4851 4883 4933 N
+ W G EY i n/a 38 4850 4883 4933 N
+ W G EY s n/a 38 4851 4883 4933 N
+ W G F b n/a 38 4851 4880 4930 N
+ W G F s n/a 38 4851 4880 4930 N
+ W G G s n/a 38 4851 4880 4930 N
+ W G HH s n/a 38 4851 4880 4930 N
+ W G IH b n/a 38 4851 4890 4925 N
+ W G IH i n/a 38 4850 4890 4925 N
+ W G IH s n/a 38 4851 4890 4925 N
+ W G IY b n/a 38 4851 4895 4926 N
+ W G IY i n/a 38 4850 4896 4928 N
+ W G IY s n/a 38 4851 4895 4926 N
+ W G JH s n/a 38 4851 4880 4930 N
+ W G K b n/a 38 4851 4880 4930 N
+ W G K s n/a 38 4851 4880 4930 N
+ W G L s n/a 38 4851 4910 4948 N
+ W G M b n/a 38 4851 4880 4930 N
+ W G M s n/a 38 4851 4880 4930 N
+ W G N b n/a 38 4851 4880 4930 N
+ W G N s n/a 38 4851 4880 4930 N
+ W G NG s n/a 38 4851 4880 4930 N
+ W G OW b n/a 38 4851 4920 4952 N
+ W G OW i n/a 38 4850 4921 4952 N
+ W G OW s n/a 38 4851 4920 4952 N
+ W G OY b n/a 38 4849 4920 4952 N
+ W G OY s n/a 38 4849 4920 4952 N
+ W G P s n/a 38 4851 4880 4930 N
+ W G R s n/a 38 4851 4910 4948 N
+ W G S b n/a 38 4851 4880 4930 N
+ W G S s n/a 38 4851 4880 4930 N
+ W G SH s n/a 38 4851 4880 4930 N
+ W G SIL s n/a 38 4851 4880 4930 N
+ W G T s n/a 38 4851 4880 4930 N
+ W G TH s n/a 38 4851 4880 4930 N
+ W G UH b n/a 38 4851 4880 4941 N
+ W G UH i n/a 38 4850 4880 4941 N
+ W G UH s n/a 38 4851 4880 4941 N
+ W G UW b n/a 38 4851 4880 4952 N
+ W G UW s n/a 38 4851 4880 4952 N
+ W G V s n/a 38 4851 4880 4930 N
+ W G W s n/a 38 4851 4916 4948 N
+ W G Y b n/a 38 4851 4895 4926 N
+ W G Y s n/a 38 4851 4895 4926 N
+ W G Z s n/a 38 4851 4880 4930 N
+ W G ZH s n/a 38 4851 4880 4930 N
+ W HH AA b n/a 38 4834 4910 4947 N
+ W HH AA i n/a 38 4834 4909 4947 N
+ W HH AA s n/a 38 4834 4910 4947 N
+ W HH AE b n/a 38 4834 4884 4930 N
+ W HH AE i n/a 38 4833 4884 4930 N
+ W HH AE s n/a 38 4834 4884 4930 N
+ W HH AH b n/a 38 4834 4914 4936 N
+ W HH AH i n/a 38 4832 4914 4934 N
+ W HH AH s n/a 38 4834 4914 4936 N
+ W HH AO b n/a 38 4834 4919 4951 N
+ W HH AO i n/a 38 4834 4921 4951 N
+ W HH AO s n/a 38 4834 4919 4951 N
+ W HH AW b n/a 38 4834 4884 4930 N
+ W HH AW s n/a 38 4834 4884 4930 N
+ W HH AY b n/a 38 4834 4912 4946 N
+ W HH AY i n/a 38 4834 4912 4946 N
+ W HH AY s n/a 38 4834 4912 4946 N
+ W HH B s n/a 38 4834 4879 4930 N
+ W HH CH s n/a 38 4834 4879 4930 N
+ W HH D s n/a 38 4834 4879 4930 N
+ W HH DH s n/a 38 4834 4879 4930 N
+ W HH EH b n/a 38 4834 4884 4930 N
+ W HH EH i n/a 38 4833 4884 4930 N
+ W HH EH s n/a 38 4834 4884 4930 N
+ W HH ER b n/a 38 4836 4915 4948 N
+ W HH ER i n/a 38 4832 4915 4949 N
+ W HH ER s n/a 38 4836 4915 4948 N
+ W HH EY b n/a 38 4834 4883 4933 N
+ W HH EY i n/a 38 4833 4883 4933 N
+ W HH EY s n/a 38 4834 4883 4933 N
+ W HH F b n/a 38 4834 4879 4930 N
+ W HH F s n/a 38 4834 4879 4930 N
+ W HH G s n/a 38 4834 4879 4930 N
+ W HH HH s n/a 38 4834 4879 4930 N
+ W HH IH b n/a 38 4844 4889 4923 N
+ W HH IH i n/a 38 4855 4890 4923 N
+ W HH IH s n/a 38 4844 4889 4923 N
+ W HH IY b n/a 38 4844 4897 4927 N
+ W HH IY i n/a 38 4855 4897 4927 N
+ W HH IY s n/a 38 4844 4897 4927 N
+ W HH JH s n/a 38 4834 4879 4930 N
+ W HH K b n/a 38 4834 4879 4930 N
+ W HH K s n/a 38 4834 4879 4930 N
+ W HH L s n/a 38 4836 4910 4948 N
+ W HH M b n/a 38 4834 4879 4930 N
+ W HH M s n/a 38 4834 4879 4930 N
+ W HH N b n/a 38 4834 4879 4930 N
+ W HH N s n/a 38 4834 4879 4930 N
+ W HH NG s n/a 38 4834 4879 4930 N
+ W HH OW b n/a 38 4834 4920 4952 N
+ W HH OW i n/a 38 4834 4920 4952 N
+ W HH OW s n/a 38 4834 4920 4952 N
+ W HH OY b n/a 38 4834 4920 4952 N
+ W HH OY s n/a 38 4834 4920 4952 N
+ W HH P s n/a 38 4834 4879 4930 N
+ W HH R s n/a 38 4836 4910 4948 N
+ W HH S b n/a 38 4834 4879 4930 N
+ W HH S s n/a 38 4834 4879 4930 N
+ W HH SH s n/a 38 4834 4879 4930 N
+ W HH SIL s n/a 38 4834 4879 4930 N
+ W HH T s n/a 38 4834 4879 4930 N
+ W HH TH s n/a 38 4834 4879 4930 N
+ W HH UH b n/a 38 4844 4879 4941 N
+ W HH UH i n/a 38 4855 4879 4941 N
+ W HH UH s n/a 38 4844 4879 4941 N
+ W HH UW b n/a 38 4844 4879 4952 N
+ W HH UW i n/a 38 4855 4879 4952 N
+ W HH UW s n/a 38 4844 4879 4952 N
+ W HH V s n/a 38 4834 4879 4930 N
+ W HH W s n/a 38 4836 4915 4948 N
+ W HH Y b n/a 38 4844 4897 4927 N
+ W HH Y s n/a 38 4844 4897 4927 N
+ W HH Z s n/a 38 4834 4879 4930 N
+ W HH ZH s n/a 38 4834 4879 4930 N
+ W IH AA b n/a 38 4863 4910 4947 N
+ W IH AA i n/a 38 4863 4910 4947 N
+ W IH AA s n/a 38 4863 4910 4947 N
+ W IH AE b n/a 38 4865 4883 4930 N
+ W IH AE i n/a 38 4867 4883 4930 N
+ W IH AE s n/a 38 4865 4883 4930 N
+ W IH AH b n/a 38 4863 4903 4935 N
+ W IH AH i n/a 38 4867 4906 4944 N
+ W IH AH s n/a 38 4863 4903 4935 N
+ W IH AO b n/a 38 4864 4919 4951 N
+ W IH AO i n/a 38 4864 4919 4951 N
+ W IH AO s n/a 38 4864 4919 4951 N
+ W IH AW b n/a 38 4865 4883 4930 N
+ W IH AW s n/a 38 4865 4883 4930 N
+ W IH AY b n/a 38 4863 4912 4946 N
+ W IH AY i n/a 38 4863 4912 4946 N
+ W IH AY s n/a 38 4863 4912 4946 N
+ W IH B s n/a 38 4865 4880 4930 N
+ W IH CH s n/a 38 4865 4880 4930 N
+ W IH D s n/a 38 4865 4880 4930 N
+ W IH DH s n/a 38 4865 4880 4930 N
+ W IH EH b n/a 38 4865 4883 4930 N
+ W IH EH i n/a 38 4867 4883 4930 N
+ W IH EH s n/a 38 4865 4883 4930 N
+ W IH ER b n/a 38 4862 4916 4948 N
+ W IH ER i n/a 38 4862 4916 4948 N
+ W IH ER s n/a 38 4862 4916 4948 N
+ W IH EY b n/a 38 4865 4883 4933 N
+ W IH EY i n/a 38 4867 4883 4933 N
+ W IH EY s n/a 38 4865 4883 4933 N
+ W IH F b n/a 38 4865 4880 4930 N
+ W IH F s n/a 38 4865 4880 4930 N
+ W IH G s n/a 38 4865 4880 4930 N
+ W IH HH s n/a 38 4865 4880 4930 N
+ W IH IH b n/a 38 4865 4893 4925 N
+ W IH IH i n/a 38 4867 4893 4925 N
+ W IH IH s n/a 38 4865 4893 4925 N
+ W IH IY b n/a 38 4865 4895 4926 N
+ W IH IY s n/a 38 4865 4895 4926 N
+ W IH JH s n/a 38 4865 4880 4930 N
+ W IH K b n/a 38 4865 4880 4930 N
+ W IH K s n/a 38 4865 4880 4930 N
+ W IH L s n/a 38 4863 4910 4948 N
+ W IH M b n/a 38 4865 4880 4930 N
+ W IH M s n/a 38 4865 4880 4930 N
+ W IH N b n/a 38 4865 4880 4930 N
+ W IH N s n/a 38 4865 4880 4930 N
+ W IH NG s n/a 38 4865 4880 4930 N
+ W IH OW b n/a 38 4862 4920 4952 N
+ W IH OW s n/a 38 4862 4920 4952 N
+ W IH OY b n/a 38 4864 4920 4952 N
+ W IH OY s n/a 38 4864 4920 4952 N
+ W IH P s n/a 38 4865 4880 4930 N
+ W IH R s n/a 38 4862 4910 4948 N
+ W IH S b n/a 38 4865 4880 4930 N
+ W IH S s n/a 38 4865 4880 4930 N
+ W IH SH s n/a 38 4865 4880 4930 N
+ W IH SIL s n/a 38 4865 4880 4930 N
+ W IH T s n/a 38 4865 4880 4930 N
+ W IH TH s n/a 38 4865 4880 4930 N
+ W IH UH b n/a 38 4862 4880 4944 N
+ W IH UH i n/a 38 4864 4880 4944 N
+ W IH UH s n/a 38 4862 4880 4944 N
+ W IH UW b n/a 38 4862 4880 4952 N
+ W IH UW s n/a 38 4862 4880 4952 N
+ W IH V s n/a 38 4865 4880 4930 N
+ W IH W s n/a 38 4862 4916 4948 N
+ W IH Y b n/a 38 4865 4895 4926 N
+ W IH Y s n/a 38 4865 4895 4926 N
+ W IH Z s n/a 38 4865 4880 4930 N
+ W IH ZH s n/a 38 4865 4880 4930 N
+ W IY AA b n/a 38 4875 4910 4947 N
+ W IY AA e n/a 38 4875 4910 4947 N
+ W IY AA i n/a 38 4875 4910 4947 N
+ W IY AA s n/a 38 4875 4910 4947 N
+ W IY AE b n/a 38 4875 4884 4930 N
+ W IY AE e n/a 38 4875 4884 4930 N
+ W IY AE i n/a 38 4875 4884 4930 N
+ W IY AE s n/a 38 4875 4884 4930 N
+ W IY AH b n/a 38 4874 4908 4939 N
+ W IY AH e n/a 38 4874 4908 4939 N
+ W IY AH i n/a 38 4875 4906 4937 N
+ W IY AH s n/a 38 4874 4908 4939 N
+ W IY AO b n/a 38 4875 4919 4951 N
+ W IY AO e n/a 38 4875 4919 4951 N
+ W IY AO i n/a 38 4875 4919 4951 N
+ W IY AO s n/a 38 4875 4919 4951 N
+ W IY AW b n/a 38 4875 4884 4930 N
+ W IY AW e n/a 38 4875 4884 4930 N
+ W IY AW s n/a 38 4875 4884 4930 N
+ W IY AY b n/a 38 4875 4912 4946 N
+ W IY AY e n/a 38 4875 4912 4946 N
+ W IY AY i n/a 38 4875 4912 4946 N
+ W IY AY s n/a 38 4875 4912 4946 N
+ W IY B e n/a 38 4875 4881 4930 N
+ W IY B s n/a 38 4875 4881 4930 N
+ W IY CH e n/a 38 4875 4881 4930 N
+ W IY CH s n/a 38 4875 4881 4930 N
+ W IY D e n/a 38 4875 4881 4930 N
+ W IY D s n/a 38 4875 4881 4930 N
+ W IY DH e n/a 38 4875 4881 4930 N
+ W IY DH s n/a 38 4875 4881 4930 N
+ W IY EH b n/a 38 4875 4884 4930 N
+ W IY EH e n/a 38 4875 4884 4930 N
+ W IY EH i n/a 38 4875 4884 4930 N
+ W IY EH s n/a 38 4875 4884 4930 N
+ W IY ER b n/a 38 4875 4918 4949 N
+ W IY ER e n/a 38 4875 4918 4949 N
+ W IY ER i n/a 38 4875 4918 4949 N
+ W IY ER s n/a 38 4875 4918 4949 N
+ W IY EY b n/a 38 4875 4883 4933 N
+ W IY EY e n/a 38 4875 4883 4933 N
+ W IY EY i n/a 38 4875 4883 4933 N
+ W IY EY s n/a 38 4875 4883 4933 N
+ W IY F b n/a 38 4875 4881 4930 N
+ W IY F e n/a 38 4875 4881 4930 N
+ W IY F s n/a 38 4875 4881 4930 N
+ W IY G e n/a 38 4875 4881 4930 N
+ W IY G s n/a 38 4875 4881 4930 N
+ W IY HH e n/a 38 4875 4881 4930 N
+ W IY HH s n/a 38 4875 4881 4930 N
+ W IY IH b n/a 38 4876 4892 4925 N
+ W IY IH e n/a 38 4876 4892 4925 N
+ W IY IH i n/a 38 4876 4892 4925 N
+ W IY IH s n/a 38 4876 4892 4925 N
+ W IY IY b n/a 38 4876 4895 4926 N
+ W IY IY e n/a 38 4876 4895 4926 N
+ W IY IY i n/a 38 4876 4896 4928 N
+ W IY IY s n/a 38 4876 4895 4926 N
+ W IY JH e n/a 38 4875 4881 4930 N
+ W IY JH s n/a 38 4875 4881 4930 N
+ W IY K b n/a 38 4875 4881 4930 N
+ W IY K e n/a 38 4875 4881 4930 N
+ W IY K s n/a 38 4875 4881 4930 N
+ W IY L e n/a 38 4875 4910 4949 N
+ W IY L s n/a 38 4875 4910 4949 N
+ W IY M b n/a 38 4875 4881 4930 N
+ W IY M e n/a 38 4875 4881 4930 N
+ W IY M s n/a 38 4875 4881 4930 N
+ W IY N b n/a 38 4875 4881 4930 N
+ W IY N e n/a 38 4875 4881 4930 N
+ W IY N s n/a 38 4875 4881 4930 N
+ W IY NG e n/a 38 4875 4881 4930 N
+ W IY NG s n/a 38 4875 4881 4930 N
+ W IY OW b n/a 38 4875 4920 4952 N
+ W IY OW e n/a 38 4875 4920 4952 N
+ W IY OW s n/a 38 4875 4920 4952 N
+ W IY OY b n/a 38 4875 4920 4952 N
+ W IY OY e n/a 38 4875 4920 4952 N
+ W IY OY s n/a 38 4875 4920 4952 N
+ W IY P e n/a 38 4875 4881 4930 N
+ W IY P s n/a 38 4875 4881 4930 N
+ W IY R e n/a 38 4875 4910 4949 N
+ W IY R s n/a 38 4875 4910 4949 N
+ W IY S b n/a 38 4875 4881 4930 N
+ W IY S e n/a 38 4875 4881 4930 N
+ W IY S s n/a 38 4875 4881 4930 N
+ W IY SH e n/a 38 4875 4881 4930 N
+ W IY SH s n/a 38 4875 4881 4930 N
+ W IY SIL e n/a 38 4875 4881 4930 N
+ W IY SIL s n/a 38 4875 4881 4930 N
+ W IY T e n/a 38 4875 4881 4930 N
+ W IY T s n/a 38 4875 4881 4930 N
+ W IY TH e n/a 38 4875 4881 4930 N
+ W IY TH s n/a 38 4875 4881 4930 N
+ W IY UH b n/a 38 4874 4881 4941 N
+ W IY UH e n/a 38 4874 4881 4941 N
+ W IY UH i n/a 38 4876 4881 4941 N
+ W IY UH s n/a 38 4874 4881 4941 N
+ W IY UW b n/a 38 4876 4881 4952 N
+ W IY UW e n/a 38 4876 4881 4952 N
+ W IY UW i n/a 38 4876 4881 4952 N
+ W IY UW s n/a 38 4876 4881 4952 N
+ W IY V e n/a 38 4875 4881 4930 N
+ W IY V s n/a 38 4875 4881 4930 N
+ W IY W e n/a 38 4875 4918 4949 N
+ W IY W s n/a 38 4875 4918 4949 N
+ W IY Y b n/a 38 4876 4895 4926 N
+ W IY Y e n/a 38 4876 4895 4926 N
+ W IY Y s n/a 38 4876 4895 4926 N
+ W IY Z e n/a 38 4875 4881 4930 N
+ W IY Z s n/a 38 4875 4881 4930 N
+ W IY ZH e n/a 38 4875 4881 4930 N
+ W IY ZH s n/a 38 4875 4881 4930 N
+ W JH AA b n/a 38 4837 4910 4947 N
+ W JH AA i n/a 38 4853 4910 4947 N
+ W JH AA s n/a 38 4837 4910 4947 N
+ W JH AE b n/a 38 4837 4884 4930 N
+ W JH AE i n/a 38 4853 4884 4930 N
+ W JH AE s n/a 38 4837 4884 4930 N
+ W JH AH b n/a 38 4837 4901 4935 N
+ W JH AH s n/a 38 4837 4901 4935 N
+ W JH AO b n/a 38 4837 4919 4951 N
+ W JH AO i n/a 38 4853 4919 4951 N
+ W JH AO s n/a 38 4837 4919 4951 N
+ W JH AW b n/a 38 4837 4884 4930 N
+ W JH AW s n/a 38 4837 4884 4930 N
+ W JH AY b n/a 38 4837 4912 4946 N
+ W JH AY i n/a 38 4853 4912 4946 N
+ W JH AY s n/a 38 4837 4912 4946 N
+ W JH B s n/a 38 4837 4880 4930 N
+ W JH CH s n/a 38 4837 4880 4930 N
+ W JH D s n/a 38 4837 4880 4930 N
+ W JH DH s n/a 38 4837 4880 4930 N
+ W JH EH b n/a 38 4837 4884 4930 N
+ W JH EH i n/a 38 4853 4884 4930 N
+ W JH EH s n/a 38 4837 4884 4930 N
+ W JH ER b n/a 38 4837 4916 4948 N
+ W JH ER i n/a 38 4852 4916 4949 N
+ W JH ER s n/a 38 4837 4916 4948 N
+ W JH EY b n/a 38 4837 4883 4933 N
+ W JH EY i n/a 38 4853 4883 4933 N
+ W JH EY s n/a 38 4837 4883 4933 N
+ W JH F b n/a 38 4837 4880 4930 N
+ W JH F s n/a 38 4837 4880 4930 N
+ W JH G s n/a 38 4837 4880 4930 N
+ W JH HH s n/a 38 4837 4880 4930 N
+ W JH IH b n/a 38 4844 4889 4925 N
+ W JH IH i n/a 38 4852 4888 4925 N
+ W JH IH s n/a 38 4844 4889 4925 N
+ W JH IY b n/a 38 4844 4895 4926 N
+ W JH IY s n/a 38 4844 4895 4926 N
+ W JH JH s n/a 38 4837 4880 4930 N
+ W JH K b n/a 38 4837 4880 4930 N
+ W JH K s n/a 38 4837 4880 4930 N
+ W JH L s n/a 38 4837 4910 4948 N
+ W JH M b n/a 38 4837 4880 4930 N
+ W JH M s n/a 38 4837 4880 4930 N
+ W JH N b n/a 38 4837 4880 4930 N
+ W JH N s n/a 38 4837 4880 4930 N
+ W JH NG s n/a 38 4837 4880 4930 N
+ W JH OW b n/a 38 4837 4920 4952 N
+ W JH OW s n/a 38 4837 4920 4952 N
+ W JH OY b n/a 38 4837 4920 4952 N
+ W JH OY s n/a 38 4837 4920 4952 N
+ W JH P s n/a 38 4837 4880 4930 N
+ W JH R s n/a 38 4837 4910 4948 N
+ W JH S b n/a 38 4837 4880 4930 N
+ W JH S s n/a 38 4837 4880 4930 N
+ W JH SH s n/a 38 4837 4880 4930 N
+ W JH SIL s n/a 38 4837 4880 4930 N
+ W JH T s n/a 38 4837 4880 4930 N
+ W JH TH s n/a 38 4837 4880 4930 N
+ W JH UH b n/a 38 4844 4880 4941 N
+ W JH UH i n/a 38 4853 4880 4941 N
+ W JH UH s n/a 38 4844 4880 4941 N
+ W JH UW b n/a 38 4844 4880 4952 N
+ W JH UW s n/a 38 4844 4880 4952 N
+ W JH V s n/a 38 4837 4880 4930 N
+ W JH W s n/a 38 4837 4916 4948 N
+ W JH Y b n/a 38 4844 4895 4926 N
+ W JH Y s n/a 38 4844 4895 4926 N
+ W JH Z s n/a 38 4837 4880 4930 N
+ W JH ZH s n/a 38 4837 4880 4930 N
+ W K AA b n/a 38 4849 4910 4947 N
+ W K AA i n/a 38 4849 4909 4947 N
+ W K AA s n/a 38 4849 4910 4947 N
+ W K AE b n/a 38 4849 4886 4932 N
+ W K AE i n/a 38 4849 4885 4931 N
+ W K AE s n/a 38 4849 4886 4932 N
+ W K AH b n/a 38 4851 4899 4942 N
+ W K AH i n/a 38 4847 4900 4943 N
+ W K AH s n/a 38 4851 4899 4942 N
+ W K AO b n/a 38 4849 4919 4951 N
+ W K AO i n/a 38 4849 4921 4951 N
+ W K AO s n/a 38 4849 4919 4951 N
+ W K AW b n/a 38 4849 4886 4932 N
+ W K AW i n/a 38 4849 4885 4931 N
+ W K AW s n/a 38 4849 4886 4932 N
+ W K AY b n/a 38 4849 4914 4946 N
+ W K AY i n/a 38 4849 4913 4945 N
+ W K AY s n/a 38 4849 4914 4946 N
+ W K B s n/a 38 4851 4879 4931 N
+ W K CH s n/a 38 4851 4879 4931 N
+ W K D i n/a 38 4848 4879 4932 N
+ W K D s n/a 38 4851 4879 4931 N
+ W K DH s n/a 38 4851 4879 4931 N
+ W K EH b n/a 38 4851 4886 4931 N
+ W K EH i n/a 38 4848 4885 4932 N
+ W K EH s n/a 38 4851 4886 4931 N
+ W K ER b n/a 38 4851 4915 4948 N
+ W K ER i n/a 38 4848 4915 4950 N
+ W K ER s n/a 38 4851 4915 4948 N
+ W K EY b n/a 38 4851 4886 4933 N
+ W K EY i n/a 38 4848 4885 4933 N
+ W K EY s n/a 38 4851 4886 4933 N
+ W K F b n/a 38 4851 4879 4931 N
+ W K F s n/a 38 4851 4879 4931 N
+ W K G s n/a 38 4851 4879 4931 N
+ W K HH s n/a 38 4851 4879 4931 N
+ W K IH b n/a 38 4851 4888 4922 N
+ W K IH i n/a 38 4847 4887 4924 N
+ W K IH s n/a 38 4851 4888 4922 N
+ W K IY b n/a 38 4851 4897 4927 N
+ W K IY i n/a 38 4847 4898 4927 N
+ W K IY s n/a 38 4851 4897 4927 N
+ W K JH s n/a 38 4851 4879 4931 N
+ W K K b n/a 38 4851 4879 4931 N
+ W K K s n/a 38 4851 4879 4931 N
+ W K L s n/a 38 4851 4910 4948 N
+ W K M b n/a 38 4851 4879 4931 N
+ W K M s n/a 38 4851 4879 4931 N
+ W K N b n/a 38 4851 4879 4931 N
+ W K N s n/a 38 4851 4879 4931 N
+ W K NG s n/a 38 4851 4879 4931 N
+ W K OW b n/a 38 4851 4920 4952 N
+ W K OW i n/a 38 4848 4921 4952 N
+ W K OW s n/a 38 4851 4920 4952 N
+ W K OY b n/a 38 4849 4920 4952 N
+ W K OY i n/a 38 4849 4921 4952 N
+ W K OY s n/a 38 4849 4920 4952 N
+ W K P s n/a 38 4851 4879 4931 N
+ W K R s n/a 38 4851 4910 4948 N
+ W K S b n/a 38 4851 4879 4931 N
+ W K S s n/a 38 4851 4879 4931 N
+ W K SH s n/a 38 4851 4879 4931 N
+ W K SIL s n/a 38 4851 4879 4931 N
+ W K T i n/a 38 4848 4879 4932 N
+ W K T s n/a 38 4851 4879 4931 N
+ W K TH s n/a 38 4851 4879 4931 N
+ W K UH b n/a 38 4851 4879 4941 N
+ W K UH i n/a 38 4848 4879 4941 N
+ W K UH s n/a 38 4851 4879 4941 N
+ W K UW b n/a 38 4851 4879 4952 N
+ W K UW i n/a 38 4848 4879 4952 N
+ W K UW s n/a 38 4851 4879 4952 N
+ W K V s n/a 38 4851 4879 4931 N
+ W K W s n/a 38 4851 4915 4948 N
+ W K Y b n/a 38 4851 4897 4927 N
+ W K Y i n/a 38 4847 4898 4927 N
+ W K Y s n/a 38 4851 4897 4927 N
+ W K Z s n/a 38 4851 4879 4931 N
+ W K ZH s n/a 38 4851 4879 4931 N
+ W L AA b n/a 38 4858 4910 4947 N
+ W L AA i n/a 38 4861 4910 4947 N
+ W L AA s n/a 38 4858 4910 4947 N
+ W L AE b n/a 38 4858 4883 4930 N
+ W L AE i n/a 38 4861 4883 4930 N
+ W L AE s n/a 38 4858 4883 4930 N
+ W L AH b n/a 38 4858 4906 4935 N
+ W L AH i n/a 38 4861 4905 4938 N
+ W L AH s n/a 38 4858 4906 4935 N
+ W L AO b n/a 38 4858 4919 4951 N
+ W L AO i n/a 38 4861 4919 4951 N
+ W L AO s n/a 38 4858 4919 4951 N
+ W L AW b n/a 38 4858 4883 4930 N
+ W L AW s n/a 38 4858 4883 4930 N
+ W L AY b n/a 38 4858 4912 4946 N
+ W L AY i n/a 38 4861 4912 4946 N
+ W L AY s n/a 38 4858 4912 4946 N
+ W L B s n/a 38 4858 4880 4930 N
+ W L CH s n/a 38 4858 4880 4930 N
+ W L D s n/a 38 4858 4880 4930 N
+ W L DH s n/a 38 4858 4880 4930 N
+ W L EH b n/a 38 4858 4883 4930 N
+ W L EH i n/a 38 4861 4883 4930 N
+ W L EH s n/a 38 4858 4883 4930 N
+ W L ER b n/a 38 4858 4916 4948 N
+ W L ER i n/a 38 4861 4916 4949 N
+ W L ER s n/a 38 4858 4916 4948 N
+ W L EY b n/a 38 4858 4883 4933 N
+ W L EY i n/a 38 4861 4883 4933 N
+ W L EY s n/a 38 4858 4883 4933 N
+ W L F b n/a 38 4858 4880 4930 N
+ W L F s n/a 38 4858 4880 4930 N
+ W L G s n/a 38 4858 4880 4930 N
+ W L HH s n/a 38 4858 4880 4930 N
+ W L IH b n/a 38 4859 4893 4925 N
+ W L IH i n/a 38 4861 4893 4925 N
+ W L IH s n/a 38 4859 4893 4925 N
+ W L IY b n/a 38 4859 4895 4926 N
+ W L IY i n/a 38 4861 4896 4928 N
+ W L IY s n/a 38 4859 4895 4926 N
+ W L JH s n/a 38 4858 4880 4930 N
+ W L K b n/a 38 4858 4880 4930 N
+ W L K s n/a 38 4858 4880 4930 N
+ W L L s n/a 38 4858 4910 4948 N
+ W L M b n/a 38 4858 4880 4930 N
+ W L M s n/a 38 4858 4880 4930 N
+ W L N b n/a 38 4858 4880 4930 N
+ W L N s n/a 38 4858 4880 4930 N
+ W L NG s n/a 38 4858 4880 4930 N
+ W L OW b n/a 38 4858 4920 4952 N
+ W L OW i n/a 38 4861 4920 4952 N
+ W L OW s n/a 38 4858 4920 4952 N
+ W L OY b n/a 38 4858 4920 4952 N
+ W L OY s n/a 38 4858 4920 4952 N
+ W L P s n/a 38 4858 4880 4930 N
+ W L R s n/a 38 4858 4910 4948 N
+ W L S b n/a 38 4858 4880 4930 N
+ W L S s n/a 38 4858 4880 4930 N
+ W L SH s n/a 38 4858 4880 4930 N
+ W L SIL s n/a 38 4858 4880 4930 N
+ W L T s n/a 38 4858 4880 4930 N
+ W L TH s n/a 38 4858 4880 4930 N
+ W L UH b n/a 38 4859 4880 4941 N
+ W L UH i n/a 38 4861 4880 4941 N
+ W L UH s n/a 38 4859 4880 4941 N
+ W L UW b n/a 38 4859 4880 4952 N
+ W L UW s n/a 38 4859 4880 4952 N
+ W L V s n/a 38 4858 4880 4930 N
+ W L W s n/a 38 4858 4916 4948 N
+ W L Y b n/a 38 4859 4895 4926 N
+ W L Y s n/a 38 4859 4895 4926 N
+ W L Z s n/a 38 4858 4880 4930 N
+ W L ZH s n/a 38 4858 4880 4930 N
+ W M AA b n/a 38 4872 4910 4947 N
+ W M AA i n/a 38 4872 4910 4947 N
+ W M AA s n/a 38 4872 4910 4947 N
+ W M AE b n/a 38 4872 4884 4930 N
+ W M AE s n/a 38 4872 4884 4930 N
+ W M AH b n/a 38 4872 4902 4935 N
+ W M AH i n/a 38 4872 4906 4937 N
+ W M AH s n/a 38 4872 4902 4935 N
+ W M AO b n/a 38 4872 4919 4951 N
+ W M AO s n/a 38 4872 4919 4951 N
+ W M AW b n/a 38 4872 4884 4930 N
+ W M AW s n/a 38 4872 4884 4930 N
+ W M AY b n/a 38 4872 4912 4946 N
+ W M AY i n/a 38 4872 4912 4946 N
+ W M AY s n/a 38 4872 4912 4946 N
+ W M B s n/a 38 4872 4880 4930 N
+ W M CH s n/a 38 4872 4880 4930 N
+ W M D s n/a 38 4872 4880 4930 N
+ W M DH s n/a 38 4872 4880 4930 N
+ W M EH b n/a 38 4872 4884 4930 N
+ W M EH i n/a 38 4872 4884 4930 N
+ W M EH s n/a 38 4872 4884 4930 N
+ W M ER b n/a 38 4872 4916 4948 N
+ W M ER i n/a 38 4872 4916 4949 N
+ W M ER s n/a 38 4872 4916 4948 N
+ W M EY b n/a 38 4872 4883 4933 N
+ W M EY i n/a 38 4872 4883 4933 N
+ W M EY s n/a 38 4872 4883 4933 N
+ W M F b n/a 38 4872 4880 4930 N
+ W M F s n/a 38 4872 4880 4930 N
+ W M G s n/a 38 4872 4880 4930 N
+ W M HH s n/a 38 4872 4880 4930 N
+ W M IH b n/a 38 4873 4894 4925 N
+ W M IH i n/a 38 4873 4894 4925 N
+ W M IH s n/a 38 4873 4894 4925 N
+ W M IY b n/a 38 4873 4895 4926 N
+ W M IY i n/a 38 4873 4896 4928 N
+ W M IY s n/a 38 4873 4895 4926 N
+ W M JH s n/a 38 4872 4880 4930 N
+ W M K b n/a 38 4872 4880 4930 N
+ W M K s n/a 38 4872 4880 4930 N
+ W M L s n/a 38 4872 4910 4948 N
+ W M M b n/a 38 4872 4880 4930 N
+ W M M s n/a 38 4872 4880 4930 N
+ W M N b n/a 38 4872 4880 4930 N
+ W M N s n/a 38 4872 4880 4930 N
+ W M NG s n/a 38 4872 4880 4930 N
+ W M OW b n/a 38 4872 4920 4952 N
+ W M OW i n/a 38 4872 4920 4952 N
+ W M OW s n/a 38 4872 4920 4952 N
+ W M OY b n/a 38 4872 4920 4952 N
+ W M OY s n/a 38 4872 4920 4952 N
+ W M P s n/a 38 4872 4880 4930 N
+ W M R s n/a 38 4872 4910 4948 N
+ W M S b n/a 38 4872 4880 4930 N
+ W M S s n/a 38 4872 4880 4930 N
+ W M SH s n/a 38 4872 4880 4930 N
+ W M SIL s n/a 38 4872 4880 4930 N
+ W M T s n/a 38 4872 4880 4930 N
+ W M TH s n/a 38 4872 4880 4930 N
+ W M UH b n/a 38 4873 4880 4941 N
+ W M UH i n/a 38 4873 4880 4941 N
+ W M UH s n/a 38 4873 4880 4941 N
+ W M UW b n/a 38 4873 4880 4952 N
+ W M UW s n/a 38 4873 4880 4952 N
+ W M V s n/a 38 4872 4880 4930 N
+ W M W s n/a 38 4872 4916 4948 N
+ W M Y b n/a 38 4873 4895 4926 N
+ W M Y s n/a 38 4873 4895 4926 N
+ W M Z s n/a 38 4872 4880 4930 N
+ W M ZH s n/a 38 4872 4880 4930 N
+ W N AA b n/a 38 4871 4910 4947 N
+ W N AA i n/a 38 4871 4910 4947 N
+ W N AA s n/a 38 4871 4910 4947 N
+ W N AE b n/a 38 4871 4884 4930 N
+ W N AE i n/a 38 4871 4884 4930 N
+ W N AE s n/a 38 4871 4884 4930 N
+ W N AH b n/a 38 4871 4902 4935 N
+ W N AH i n/a 38 4871 4907 4937 N
+ W N AH s n/a 38 4871 4902 4935 N
+ W N AO b n/a 38 4871 4919 4951 N
+ W N AO i n/a 38 4871 4919 4951 N
+ W N AO s n/a 38 4871 4919 4951 N
+ W N AW b n/a 38 4871 4884 4930 N
+ W N AW i n/a 38 4871 4884 4930 N
+ W N AW s n/a 38 4871 4884 4930 N
+ W N AY b n/a 38 4871 4912 4946 N
+ W N AY i n/a 38 4871 4912 4946 N
+ W N AY s n/a 38 4871 4912 4946 N
+ W N B s n/a 38 4871 4880 4930 N
+ W N CH s n/a 38 4871 4880 4930 N
+ W N D s n/a 38 4871 4880 4930 N
+ W N DH s n/a 38 4871 4880 4930 N
+ W N EH b n/a 38 4871 4884 4930 N
+ W N EH i n/a 38 4871 4884 4930 N
+ W N EH s n/a 38 4871 4884 4930 N
+ W N ER b n/a 38 4871 4916 4948 N
+ W N ER i n/a 38 4871 4916 4949 N
+ W N ER s n/a 38 4871 4916 4948 N
+ W N EY b n/a 38 4871 4883 4933 N
+ W N EY i n/a 38 4871 4883 4933 N
+ W N EY s n/a 38 4871 4883 4933 N
+ W N F b n/a 38 4871 4880 4930 N
+ W N F s n/a 38 4871 4880 4930 N
+ W N G s n/a 38 4871 4880 4930 N
+ W N HH s n/a 38 4871 4880 4930 N
+ W N IH b n/a 38 4873 4894 4925 N
+ W N IH i n/a 38 4873 4894 4925 N
+ W N IH s n/a 38 4873 4894 4925 N
+ W N IY b n/a 38 4873 4895 4926 N
+ W N IY i n/a 38 4873 4896 4928 N
+ W N IY s n/a 38 4873 4895 4926 N
+ W N JH s n/a 38 4871 4880 4930 N
+ W N K b n/a 38 4871 4880 4930 N
+ W N K s n/a 38 4871 4880 4930 N
+ W N L s n/a 38 4871 4910 4948 N
+ W N M b n/a 38 4871 4880 4930 N
+ W N M s n/a 38 4871 4880 4930 N
+ W N N b n/a 38 4871 4880 4930 N
+ W N N s n/a 38 4871 4880 4930 N
+ W N NG s n/a 38 4871 4880 4930 N
+ W N OW b n/a 38 4871 4920 4952 N
+ W N OW i n/a 38 4871 4920 4952 N
+ W N OW s n/a 38 4871 4920 4952 N
+ W N OY b n/a 38 4871 4920 4952 N
+ W N OY s n/a 38 4871 4920 4952 N
+ W N P s n/a 38 4871 4880 4930 N
+ W N R i n/a 38 4871 4910 4949 N
+ W N R s n/a 38 4871 4910 4948 N
+ W N S b n/a 38 4871 4880 4930 N
+ W N S s n/a 38 4871 4880 4930 N
+ W N SH s n/a 38 4871 4880 4930 N
+ W N SIL s n/a 38 4871 4880 4930 N
+ W N T s n/a 38 4871 4880 4930 N
+ W N TH s n/a 38 4871 4880 4930 N
+ W N UH b n/a 38 4873 4880 4941 N
+ W N UH i n/a 38 4873 4880 4941 N
+ W N UH s n/a 38 4873 4880 4941 N
+ W N UW b n/a 38 4873 4880 4952 N
+ W N UW i n/a 38 4873 4880 4952 N
+ W N UW s n/a 38 4873 4880 4952 N
+ W N V s n/a 38 4871 4880 4930 N
+ W N W s n/a 38 4871 4916 4948 N
+ W N Y b n/a 38 4873 4895 4926 N
+ W N Y s n/a 38 4873 4895 4926 N
+ W N Z s n/a 38 4871 4880 4930 N
+ W N ZH s n/a 38 4871 4880 4930 N
+ W NG AA b n/a 38 4872 4910 4947 N
+ W NG AA i n/a 38 4872 4910 4947 N
+ W NG AA s n/a 38 4872 4910 4947 N
+ W NG AE b n/a 38 4872 4884 4930 N
+ W NG AE s n/a 38 4872 4884 4930 N
+ W NG AH b n/a 38 4872 4902 4935 N
+ W NG AH i n/a 38 4872 4907 4937 N
+ W NG AH s n/a 38 4872 4902 4935 N
+ W NG AO b n/a 38 4872 4919 4951 N
+ W NG AO i n/a 38 4872 4919 4951 N
+ W NG AO s n/a 38 4872 4919 4951 N
+ W NG AW b n/a 38 4872 4884 4930 N
+ W NG AW s n/a 38 4872 4884 4930 N
+ W NG AY b n/a 38 4872 4914 4946 N
+ W NG AY s n/a 38 4872 4914 4946 N
+ W NG B s n/a 38 4872 4880 4930 N
+ W NG CH s n/a 38 4872 4880 4930 N
+ W NG D s n/a 38 4872 4880 4930 N
+ W NG DH s n/a 38 4872 4880 4930 N
+ W NG EH b n/a 38 4872 4884 4930 N
+ W NG EH i n/a 38 4872 4884 4930 N
+ W NG EH s n/a 38 4872 4884 4930 N
+ W NG ER b n/a 38 4872 4916 4948 N
+ W NG ER i n/a 38 4872 4916 4950 N
+ W NG ER s n/a 38 4872 4916 4948 N
+ W NG EY b n/a 38 4872 4883 4933 N
+ W NG EY i n/a 38 4872 4883 4933 N
+ W NG EY s n/a 38 4872 4883 4933 N
+ W NG F b n/a 38 4872 4880 4930 N
+ W NG F s n/a 38 4872 4880 4930 N
+ W NG G s n/a 38 4872 4880 4930 N
+ W NG HH s n/a 38 4872 4880 4930 N
+ W NG IH b n/a 38 4873 4894 4925 N
+ W NG IH i n/a 38 4873 4894 4925 N
+ W NG IH s n/a 38 4873 4894 4925 N
+ W NG IY b n/a 38 4873 4895 4926 N
+ W NG IY i n/a 38 4873 4896 4928 N
+ W NG IY s n/a 38 4873 4895 4926 N
+ W NG JH s n/a 38 4872 4880 4930 N
+ W NG K b n/a 38 4872 4880 4930 N
+ W NG K s n/a 38 4872 4880 4930 N
+ W NG L s n/a 38 4872 4910 4948 N
+ W NG M b n/a 38 4872 4880 4930 N
+ W NG M s n/a 38 4872 4880 4930 N
+ W NG N b n/a 38 4872 4880 4930 N
+ W NG N s n/a 38 4872 4880 4930 N
+ W NG NG s n/a 38 4872 4880 4930 N
+ W NG OW b n/a 38 4872 4920 4952 N
+ W NG OW s n/a 38 4872 4920 4952 N
+ W NG OY b n/a 38 4872 4920 4952 N
+ W NG OY s n/a 38 4872 4920 4952 N
+ W NG P s n/a 38 4872 4880 4930 N
+ W NG R s n/a 38 4872 4910 4948 N
+ W NG S b n/a 38 4872 4880 4930 N
+ W NG S s n/a 38 4872 4880 4930 N
+ W NG SH s n/a 38 4872 4880 4930 N
+ W NG SIL s n/a 38 4872 4880 4930 N
+ W NG T s n/a 38 4872 4880 4930 N
+ W NG TH s n/a 38 4872 4880 4930 N
+ W NG UH b n/a 38 4873 4880 4941 N
+ W NG UH i n/a 38 4873 4880 4941 N
+ W NG UH s n/a 38 4873 4880 4941 N
+ W NG UW b n/a 38 4873 4880 4952 N
+ W NG UW s n/a 38 4873 4880 4952 N
+ W NG V s n/a 38 4872 4880 4930 N
+ W NG W s n/a 38 4872 4916 4948 N
+ W NG Y b n/a 38 4873 4895 4926 N
+ W NG Y s n/a 38 4873 4895 4926 N
+ W NG Z s n/a 38 4872 4880 4930 N
+ W NG ZH s n/a 38 4872 4880 4930 N
+ W OW AA b n/a 38 4858 4910 4947 N
+ W OW AA i n/a 38 4861 4910 4947 N
+ W OW AA s n/a 38 4858 4910 4947 N
+ W OW AE b n/a 38 4858 4883 4930 N
+ W OW AE s n/a 38 4858 4883 4930 N
+ W OW AH b n/a 38 4858 4906 4934 N
+ W OW AH i n/a 38 4861 4906 4937 N
+ W OW AH s n/a 38 4858 4906 4934 N
+ W OW AO b n/a 38 4858 4919 4951 N
+ W OW AO i n/a 38 4861 4919 4951 N
+ W OW AO s n/a 38 4858 4919 4951 N
+ W OW AW b n/a 38 4858 4883 4930 N
+ W OW AW s n/a 38 4858 4883 4930 N
+ W OW AY b n/a 38 4858 4912 4946 N
+ W OW AY i n/a 38 4861 4912 4946 N
+ W OW AY s n/a 38 4858 4912 4946 N
+ W OW B s n/a 38 4858 4881 4930 N
+ W OW CH s n/a 38 4858 4881 4930 N
+ W OW D s n/a 38 4858 4881 4930 N
+ W OW DH s n/a 38 4858 4881 4930 N
+ W OW EH b n/a 38 4858 4883 4930 N
+ W OW EH i n/a 38 4861 4883 4930 N
+ W OW EH s n/a 38 4858 4883 4930 N
+ W OW ER b n/a 38 4858 4916 4948 N
+ W OW ER i n/a 38 4861 4916 4949 N
+ W OW ER s n/a 38 4858 4916 4948 N
+ W OW EY b n/a 38 4858 4883 4933 N
+ W OW EY i n/a 38 4861 4883 4933 N
+ W OW EY s n/a 38 4858 4883 4933 N
+ W OW F b n/a 38 4858 4881 4930 N
+ W OW F s n/a 38 4858 4881 4930 N
+ W OW G s n/a 38 4858 4881 4930 N
+ W OW HH s n/a 38 4858 4881 4930 N
+ W OW IH b n/a 38 4859 4893 4925 N
+ W OW IH i n/a 38 4861 4893 4925 N
+ W OW IH s n/a 38 4859 4893 4925 N
+ W OW IY b n/a 38 4859 4895 4926 N
+ W OW IY i n/a 38 4861 4896 4928 N
+ W OW IY s n/a 38 4859 4895 4926 N
+ W OW JH s n/a 38 4858 4881 4930 N
+ W OW K b n/a 38 4858 4881 4930 N
+ W OW K s n/a 38 4858 4881 4930 N
+ W OW L s n/a 38 4858 4910 4948 N
+ W OW M b n/a 38 4858 4881 4930 N
+ W OW M s n/a 38 4858 4881 4930 N
+ W OW N b n/a 38 4858 4881 4930 N
+ W OW N s n/a 38 4858 4881 4930 N
+ W OW NG s n/a 38 4858 4881 4930 N
+ W OW OW b n/a 38 4858 4920 4952 N
+ W OW OW s n/a 38 4858 4920 4952 N
+ W OW OY b n/a 38 4858 4920 4952 N
+ W OW OY s n/a 38 4858 4920 4952 N
+ W OW P s n/a 38 4858 4881 4930 N
+ W OW R s n/a 38 4858 4910 4948 N
+ W OW S b n/a 38 4858 4881 4930 N
+ W OW S s n/a 38 4858 4881 4930 N
+ W OW SH s n/a 38 4858 4881 4930 N
+ W OW SIL s n/a 38 4858 4881 4930 N
+ W OW T s n/a 38 4858 4881 4930 N
+ W OW TH s n/a 38 4858 4881 4930 N
+ W OW UH b n/a 38 4859 4881 4941 N
+ W OW UH i n/a 38 4861 4881 4941 N
+ W OW UH s n/a 38 4859 4881 4941 N
+ W OW UW b n/a 38 4859 4881 4952 N
+ W OW UW s n/a 38 4859 4881 4952 N
+ W OW V s n/a 38 4858 4881 4930 N
+ W OW W s n/a 38 4858 4916 4948 N
+ W OW Y b n/a 38 4859 4895 4926 N
+ W OW Y s n/a 38 4859 4895 4926 N
+ W OW Z s n/a 38 4858 4881 4930 N
+ W OW ZH s n/a 38 4858 4881 4930 N
+ W OY AA b n/a 38 4878 4910 4947 N
+ W OY AA s n/a 38 4878 4910 4947 N
+ W OY AE b n/a 38 4878 4884 4930 N
+ W OY AE s n/a 38 4878 4884 4930 N
+ W OY AH b n/a 38 4878 4907 4940 N
+ W OY AH s n/a 38 4878 4907 4940 N
+ W OY AO b n/a 38 4878 4919 4951 N
+ W OY AO s n/a 38 4878 4919 4951 N
+ W OY AW b n/a 38 4878 4884 4930 N
+ W OY AW s n/a 38 4878 4884 4930 N
+ W OY AY b n/a 38 4878 4912 4946 N
+ W OY AY s n/a 38 4878 4912 4946 N
+ W OY B s n/a 38 4878 4881 4930 N
+ W OY CH s n/a 38 4878 4881 4930 N
+ W OY D s n/a 38 4878 4881 4930 N
+ W OY DH s n/a 38 4878 4881 4930 N
+ W OY EH b n/a 38 4878 4884 4930 N
+ W OY EH s n/a 38 4878 4884 4930 N
+ W OY ER b n/a 38 4878 4916 4948 N
+ W OY ER s n/a 38 4878 4916 4948 N
+ W OY EY b n/a 38 4878 4883 4933 N
+ W OY EY s n/a 38 4878 4883 4933 N
+ W OY F b n/a 38 4878 4881 4930 N
+ W OY F s n/a 38 4878 4881 4930 N
+ W OY G s n/a 38 4878 4881 4930 N
+ W OY HH s n/a 38 4878 4881 4930 N
+ W OY IH b n/a 38 4878 4892 4925 N
+ W OY IH s n/a 38 4878 4892 4925 N
+ W OY IY b n/a 38 4878 4895 4926 N
+ W OY IY s n/a 38 4878 4895 4926 N
+ W OY JH s n/a 38 4878 4881 4930 N
+ W OY K b n/a 38 4878 4881 4930 N
+ W OY K s n/a 38 4878 4881 4930 N
+ W OY L s n/a 38 4878 4910 4948 N
+ W OY M b n/a 38 4878 4881 4930 N
+ W OY M s n/a 38 4878 4881 4930 N
+ W OY N b n/a 38 4878 4881 4930 N
+ W OY N s n/a 38 4878 4881 4930 N
+ W OY NG s n/a 38 4878 4881 4930 N
+ W OY OW b n/a 38 4878 4920 4952 N
+ W OY OW s n/a 38 4878 4920 4952 N
+ W OY OY b n/a 38 4878 4920 4952 N
+ W OY OY s n/a 38 4878 4920 4952 N
+ W OY P s n/a 38 4878 4881 4930 N
+ W OY R s n/a 38 4878 4910 4948 N
+ W OY S b n/a 38 4878 4881 4930 N
+ W OY S s n/a 38 4878 4881 4930 N
+ W OY SH s n/a 38 4878 4881 4930 N
+ W OY SIL s n/a 38 4878 4881 4930 N
+ W OY T s n/a 38 4878 4881 4930 N
+ W OY TH s n/a 38 4878 4881 4930 N
+ W OY UH b n/a 38 4878 4881 4941 N
+ W OY UH s n/a 38 4878 4881 4941 N
+ W OY UW b n/a 38 4878 4881 4952 N
+ W OY UW s n/a 38 4878 4881 4952 N
+ W OY V s n/a 38 4878 4881 4930 N
+ W OY W s n/a 38 4878 4916 4948 N
+ W OY Y b n/a 38 4878 4895 4926 N
+ W OY Y s n/a 38 4878 4895 4926 N
+ W OY Z s n/a 38 4878 4881 4930 N
+ W OY ZH s n/a 38 4878 4881 4930 N
+ W P AA b n/a 38 4834 4910 4947 N
+ W P AA i n/a 38 4849 4909 4947 N
+ W P AA s n/a 38 4834 4910 4947 N
+ W P AE b n/a 38 4834 4884 4930 N
+ W P AE s n/a 38 4834 4884 4930 N
+ W P AH b n/a 38 4834 4899 4942 N
+ W P AH s n/a 38 4834 4899 4942 N
+ W P AO b n/a 38 4834 4919 4951 N
+ W P AO i n/a 38 4849 4921 4951 N
+ W P AO s n/a 38 4834 4919 4951 N
+ W P AW b n/a 38 4834 4884 4930 N
+ W P AW s n/a 38 4834 4884 4930 N
+ W P AY b n/a 38 4834 4912 4946 N
+ W P AY i n/a 38 4849 4911 4946 N
+ W P AY s n/a 38 4834 4912 4946 N
+ W P B s n/a 38 4834 4879 4930 N
+ W P CH s n/a 38 4834 4879 4930 N
+ W P D s n/a 38 4834 4879 4930 N
+ W P DH s n/a 38 4834 4879 4930 N
+ W P EH b n/a 38 4834 4884 4930 N
+ W P EH i n/a 38 4851 4884 4931 N
+ W P EH s n/a 38 4834 4884 4930 N
+ W P ER b n/a 38 4836 4915 4948 N
+ W P ER i n/a 38 4851 4915 4949 N
+ W P ER s n/a 38 4836 4915 4948 N
+ W P EY b n/a 38 4834 4883 4933 N
+ W P EY i n/a 38 4851 4883 4933 N
+ W P EY s n/a 38 4834 4883 4933 N
+ W P F b n/a 38 4834 4879 4930 N
+ W P F s n/a 38 4834 4879 4930 N
+ W P G s n/a 38 4834 4879 4930 N
+ W P HH s n/a 38 4834 4879 4930 N
+ W P IH b n/a 38 4851 4889 4923 N
+ W P IH i n/a 38 4851 4888 4924 N
+ W P IH s n/a 38 4851 4889 4923 N
+ W P IY b n/a 38 4851 4897 4927 N
+ W P IY i n/a 38 4851 4898 4927 N
+ W P IY s n/a 38 4851 4897 4927 N
+ W P JH s n/a 38 4834 4879 4930 N
+ W P K b n/a 38 4834 4879 4930 N
+ W P K s n/a 38 4834 4879 4930 N
+ W P L s n/a 38 4836 4910 4948 N
+ W P M b n/a 38 4834 4879 4930 N
+ W P M s n/a 38 4834 4879 4930 N
+ W P N b n/a 38 4834 4879 4930 N
+ W P N s n/a 38 4834 4879 4930 N
+ W P NG s n/a 38 4834 4879 4930 N
+ W P OW b n/a 38 4834 4920 4952 N
+ W P OW i n/a 38 4851 4920 4952 N
+ W P OW s n/a 38 4834 4920 4952 N
+ W P OY b n/a 38 4834 4920 4952 N
+ W P OY s n/a 38 4834 4920 4952 N
+ W P P s n/a 38 4834 4879 4930 N
+ W P R s n/a 38 4836 4910 4948 N
+ W P S b n/a 38 4834 4879 4930 N
+ W P S s n/a 38 4834 4879 4930 N
+ W P SH s n/a 38 4834 4879 4930 N
+ W P SIL s n/a 38 4834 4879 4930 N
+ W P T s n/a 38 4834 4879 4930 N
+ W P TH s n/a 38 4834 4879 4930 N
+ W P UH b n/a 38 4851 4879 4941 N
+ W P UH i n/a 38 4851 4879 4941 N
+ W P UH s n/a 38 4851 4879 4941 N
+ W P UW b n/a 38 4851 4879 4952 N
+ W P UW s n/a 38 4851 4879 4952 N
+ W P V s n/a 38 4834 4879 4930 N
+ W P W s n/a 38 4836 4915 4948 N
+ W P Y b n/a 38 4851 4897 4927 N
+ W P Y s n/a 38 4851 4897 4927 N
+ W P Z s n/a 38 4834 4879 4930 N
+ W P ZH s n/a 38 4834 4879 4930 N
+ W R AA b n/a 38 4869 4910 4947 N
+ W R AA i n/a 38 4869 4910 4947 N
+ W R AA s n/a 38 4869 4910 4947 N
+ W R AE b n/a 38 4869 4883 4930 N
+ W R AE i n/a 38 4869 4883 4930 N
+ W R AE s n/a 38 4869 4883 4930 N
+ W R AH b n/a 38 4868 4905 4938 N
+ W R AH i n/a 38 4868 4905 4938 N
+ W R AH s n/a 38 4868 4905 4938 N
+ W R AO b n/a 38 4869 4919 4951 N
+ W R AO i n/a 38 4869 4919 4951 N
+ W R AO s n/a 38 4869 4919 4951 N
+ W R AW b n/a 38 4869 4883 4930 N
+ W R AW s n/a 38 4869 4883 4930 N
+ W R AY b n/a 38 4869 4912 4946 N
+ W R AY i n/a 38 4869 4912 4946 N
+ W R AY s n/a 38 4869 4912 4946 N
+ W R B s n/a 38 4869 4880 4930 N
+ W R CH s n/a 38 4869 4880 4930 N
+ W R D s n/a 38 4869 4880 4930 N
+ W R DH s n/a 38 4869 4880 4930 N
+ W R EH b n/a 38 4869 4883 4930 N
+ W R EH i n/a 38 4869 4883 4930 N
+ W R EH s n/a 38 4869 4883 4930 N
+ W R ER b n/a 38 4870 4917 4948 N
+ W R ER i n/a 38 4870 4917 4949 N
+ W R ER s n/a 38 4870 4917 4948 N
+ W R EY b n/a 38 4869 4883 4933 N
+ W R EY i n/a 38 4869 4883 4933 N
+ W R EY s n/a 38 4869 4883 4933 N
+ W R F b n/a 38 4869 4880 4930 N
+ W R F s n/a 38 4869 4880 4930 N
+ W R G s n/a 38 4869 4880 4930 N
+ W R HH s n/a 38 4869 4880 4930 N
+ W R IH b n/a 38 4868 4893 4925 N
+ W R IH i n/a 38 4868 4893 4925 N
+ W R IH s n/a 38 4868 4893 4925 N
+ W R IY b n/a 38 4868 4895 4926 N
+ W R IY i n/a 38 4868 4896 4928 N
+ W R IY s n/a 38 4868 4895 4926 N
+ W R JH s n/a 38 4869 4880 4930 N
+ W R K b n/a 38 4869 4880 4930 N
+ W R K s n/a 38 4869 4880 4930 N
+ W R L s n/a 38 4869 4910 4948 N
+ W R M b n/a 38 4869 4880 4930 N
+ W R M s n/a 38 4869 4880 4930 N
+ W R N b n/a 38 4869 4880 4930 N
+ W R N s n/a 38 4869 4880 4930 N
+ W R NG s n/a 38 4869 4880 4930 N
+ W R OW b n/a 38 4869 4920 4952 N
+ W R OW s n/a 38 4869 4920 4952 N
+ W R OY b n/a 38 4869 4920 4952 N
+ W R OY s n/a 38 4869 4920 4952 N
+ W R P s n/a 38 4869 4880 4930 N
+ W R R s n/a 38 4870 4910 4948 N
+ W R S b n/a 38 4869 4880 4930 N
+ W R S s n/a 38 4869 4880 4930 N
+ W R SH s n/a 38 4869 4880 4930 N
+ W R SIL s n/a 38 4869 4880 4930 N
+ W R T s n/a 38 4869 4880 4930 N
+ W R TH s n/a 38 4869 4880 4930 N
+ W R UH b n/a 38 4869 4880 4941 N
+ W R UH i n/a 38 4869 4880 4941 N
+ W R UH s n/a 38 4869 4880 4941 N
+ W R UW b n/a 38 4869 4880 4952 N
+ W R UW i n/a 38 4869 4880 4952 N
+ W R UW s n/a 38 4869 4880 4952 N
+ W R V s n/a 38 4869 4880 4930 N
+ W R W s n/a 38 4869 4917 4948 N
+ W R Y b n/a 38 4868 4895 4926 N
+ W R Y s n/a 38 4868 4895 4926 N
+ W R Z s n/a 38 4869 4880 4930 N
+ W R ZH s n/a 38 4869 4880 4930 N
+ W S AA b n/a 38 4845 4910 4947 N
+ W S AA i n/a 38 4845 4909 4947 N
+ W S AA s n/a 38 4845 4910 4947 N
+ W S AE b n/a 38 4845 4886 4930 N
+ W S AE i n/a 38 4845 4886 4930 N
+ W S AE s n/a 38 4845 4886 4930 N
+ W S AH b n/a 38 4845 4899 4942 N
+ W S AH i n/a 38 4845 4903 4944 N
+ W S AH s n/a 38 4845 4899 4942 N
+ W S AO b n/a 38 4845 4919 4951 N
+ W S AO i n/a 38 4845 4921 4951 N
+ W S AO s n/a 38 4845 4919 4951 N
+ W S AW b n/a 38 4845 4886 4930 N
+ W S AW i n/a 38 4845 4886 4930 N
+ W S AW s n/a 38 4845 4886 4930 N
+ W S AY b n/a 38 4845 4912 4946 N
+ W S AY i n/a 38 4845 4911 4946 N
+ W S AY s n/a 38 4845 4912 4946 N
+ W S B s n/a 38 4845 4879 4930 N
+ W S CH s n/a 38 4845 4879 4930 N
+ W S D s n/a 38 4845 4879 4930 N
+ W S DH s n/a 38 4845 4879 4930 N
+ W S EH b n/a 38 4845 4886 4930 N
+ W S EH i n/a 38 4845 4886 4930 N
+ W S EH s n/a 38 4845 4886 4930 N
+ W S ER b n/a 38 4845 4915 4950 N
+ W S ER i n/a 38 4845 4915 4950 N
+ W S ER s n/a 38 4845 4915 4950 N
+ W S EY b n/a 38 4845 4886 4933 N
+ W S EY i n/a 38 4845 4886 4933 N
+ W S EY s n/a 38 4845 4886 4933 N
+ W S F b n/a 38 4845 4879 4930 N
+ W S F s n/a 38 4845 4879 4930 N
+ W S G s n/a 38 4845 4879 4930 N
+ W S HH s n/a 38 4845 4879 4930 N
+ W S IH b n/a 38 4846 4888 4922 N
+ W S IH i n/a 38 4846 4888 4924 N
+ W S IH s n/a 38 4846 4888 4922 N
+ W S IY b n/a 38 4846 4898 4927 N
+ W S IY i n/a 38 4846 4898 4927 N
+ W S IY s n/a 38 4846 4898 4927 N
+ W S JH s n/a 38 4845 4879 4930 N
+ W S K b n/a 38 4845 4879 4930 N
+ W S K s n/a 38 4845 4879 4930 N
+ W S L s n/a 38 4845 4910 4950 N
+ W S M b n/a 38 4845 4879 4930 N
+ W S M s n/a 38 4845 4879 4930 N
+ W S N b n/a 38 4845 4879 4930 N
+ W S N s n/a 38 4845 4879 4930 N
+ W S NG s n/a 38 4845 4879 4930 N
+ W S OW b n/a 38 4845 4920 4952 N
+ W S OW i n/a 38 4845 4920 4952 N
+ W S OW s n/a 38 4845 4920 4952 N
+ W S OY b n/a 38 4845 4920 4952 N
+ W S OY i n/a 38 4845 4920 4952 N
+ W S OY s n/a 38 4845 4920 4952 N
+ W S P s n/a 38 4845 4879 4930 N
+ W S R s n/a 38 4845 4910 4950 N
+ W S S b n/a 38 4845 4879 4930 N
+ W S S s n/a 38 4845 4879 4930 N
+ W S SH s n/a 38 4845 4879 4930 N
+ W S SIL s n/a 38 4845 4879 4930 N
+ W S T s n/a 38 4845 4879 4930 N
+ W S TH s n/a 38 4845 4879 4930 N
+ W S UH b n/a 38 4846 4879 4941 N
+ W S UH i n/a 38 4846 4879 4941 N
+ W S UH s n/a 38 4846 4879 4941 N
+ W S UW b n/a 38 4846 4879 4952 N
+ W S UW i n/a 38 4846 4879 4952 N
+ W S UW s n/a 38 4846 4879 4952 N
+ W S V s n/a 38 4845 4879 4930 N
+ W S W s n/a 38 4845 4915 4950 N
+ W S Y b n/a 38 4846 4898 4927 N
+ W S Y s n/a 38 4846 4898 4927 N
+ W S Z s n/a 38 4845 4879 4930 N
+ W S ZH s n/a 38 4845 4879 4930 N
+ W SH AA b n/a 38 4845 4910 4947 N
+ W SH AA i n/a 38 4846 4909 4947 N
+ W SH AA s n/a 38 4846 4910 4947 N
+ W SH AE b n/a 38 4845 4886 4930 N
+ W SH AE i n/a 38 4846 4886 4930 N
+ W SH AE s n/a 38 4846 4886 4930 N
+ W SH AH b n/a 38 4845 4899 4942 N
+ W SH AH s n/a 38 4846 4899 4942 N
+ W SH AO b n/a 38 4845 4919 4951 N
+ W SH AO i n/a 38 4846 4921 4951 N
+ W SH AO s n/a 38 4846 4919 4951 N
+ W SH AW b n/a 38 4845 4886 4930 N
+ W SH AW s n/a 38 4846 4886 4930 N
+ W SH AY b n/a 38 4845 4912 4946 N
+ W SH AY i n/a 38 4846 4911 4946 N
+ W SH AY s n/a 38 4846 4912 4946 N
+ W SH B s n/a 38 4846 4879 4930 N
+ W SH CH s n/a 38 4846 4879 4930 N
+ W SH D s n/a 38 4846 4879 4930 N
+ W SH DH s n/a 38 4846 4879 4930 N
+ W SH EH b n/a 38 4845 4886 4930 N
+ W SH EH i n/a 38 4846 4886 4930 N
+ W SH EH s n/a 38 4846 4886 4930 N
+ W SH ER b n/a 38 4845 4915 4949 N
+ W SH ER i n/a 38 4846 4915 4949 N
+ W SH ER s n/a 38 4846 4915 4949 N
+ W SH EY b n/a 38 4845 4886 4933 N
+ W SH EY i n/a 38 4846 4886 4933 N
+ W SH EY s n/a 38 4846 4886 4933 N
+ W SH F b n/a 38 4845 4879 4930 N
+ W SH F s n/a 38 4846 4879 4930 N
+ W SH G s n/a 38 4846 4879 4930 N
+ W SH HH s n/a 38 4846 4879 4930 N
+ W SH IH b n/a 38 4844 4888 4923 N
+ W SH IH i n/a 38 4846 4888 4924 N
+ W SH IH s n/a 38 4844 4888 4923 N
+ W SH IY b n/a 38 4844 4898 4927 N
+ W SH IY i n/a 38 4846 4898 4927 N
+ W SH IY s n/a 38 4844 4898 4927 N
+ W SH JH s n/a 38 4846 4879 4930 N
+ W SH K b n/a 38 4845 4879 4930 N
+ W SH K s n/a 38 4846 4879 4930 N
+ W SH L s n/a 38 4846 4910 4949 N
+ W SH M b n/a 38 4845 4879 4930 N
+ W SH M s n/a 38 4846 4879 4930 N
+ W SH N b n/a 38 4845 4879 4930 N
+ W SH N s n/a 38 4846 4879 4930 N
+ W SH NG s n/a 38 4846 4879 4930 N
+ W SH OW b n/a 38 4845 4920 4952 N
+ W SH OW i n/a 38 4846 4920 4952 N
+ W SH OW s n/a 38 4846 4920 4952 N
+ W SH OY b n/a 38 4845 4920 4952 N
+ W SH OY s n/a 38 4846 4920 4952 N
+ W SH P s n/a 38 4846 4879 4930 N
+ W SH R s n/a 38 4846 4910 4949 N
+ W SH S b n/a 38 4845 4879 4930 N
+ W SH S s n/a 38 4846 4879 4930 N
+ W SH SH s n/a 38 4846 4879 4930 N
+ W SH SIL s n/a 38 4846 4879 4930 N
+ W SH T s n/a 38 4846 4879 4930 N
+ W SH TH s n/a 38 4846 4879 4930 N
+ W SH UH b n/a 38 4844 4879 4941 N
+ W SH UH i n/a 38 4846 4879 4941 N
+ W SH UH s n/a 38 4844 4879 4941 N
+ W SH UW b n/a 38 4844 4879 4952 N
+ W SH UW s n/a 38 4844 4879 4952 N
+ W SH V s n/a 38 4846 4879 4930 N
+ W SH W s n/a 38 4846 4915 4949 N
+ W SH Y b n/a 38 4844 4898 4927 N
+ W SH Y s n/a 38 4844 4898 4927 N
+ W SH Z s n/a 38 4846 4879 4930 N
+ W SH ZH s n/a 38 4846 4879 4930 N
+ W SIL AA b n/a 38 4838 4910 4947 N
+ W SIL AA s n/a 38 4838 4910 4947 N
+ W SIL AE b n/a 38 4838 4886 4930 N
+ W SIL AE s n/a 38 4838 4886 4930 N
+ W SIL AH b n/a 38 4840 4904 4936 N
+ W SIL AH s n/a 38 4840 4904 4936 N
+ W SIL AO b n/a 38 4838 4919 4951 N
+ W SIL AO s n/a 38 4838 4919 4951 N
+ W SIL AW b n/a 38 4838 4886 4930 N
+ W SIL AW s n/a 38 4838 4886 4930 N
+ W SIL AY b n/a 38 4840 4911 4946 N
+ W SIL AY s n/a 38 4840 4911 4946 N
+ W SIL B s n/a 38 4838 4879 4930 N
+ W SIL CH s n/a 38 4838 4879 4930 N
+ W SIL D s n/a 38 4838 4879 4930 N
+ W SIL DH s n/a 38 4838 4879 4930 N
+ W SIL EH b n/a 38 4839 4886 4930 N
+ W SIL EH s n/a 38 4839 4886 4930 N
+ W SIL ER b n/a 38 4838 4915 4950 N
+ W SIL ER s n/a 38 4838 4915 4950 N
+ W SIL EY b n/a 38 4838 4886 4933 N
+ W SIL EY s n/a 38 4838 4886 4933 N
+ W SIL F b n/a 38 4838 4879 4930 N
+ W SIL F s n/a 38 4838 4879 4930 N
+ W SIL G s n/a 38 4838 4879 4930 N
+ W SIL HH s n/a 38 4838 4879 4930 N
+ W SIL IH b n/a 38 4842 4891 4923 N
+ W SIL IH s n/a 38 4842 4891 4923 N
+ W SIL IY b n/a 38 4841 4897 4927 N
+ W SIL IY s n/a 38 4841 4897 4927 N
+ W SIL JH s n/a 38 4838 4879 4930 N
+ W SIL K b n/a 38 4838 4879 4930 N
+ W SIL K s n/a 38 4838 4879 4930 N
+ W SIL L s n/a 38 4838 4910 4950 N
+ W SIL M b n/a 38 4838 4879 4930 N
+ W SIL M s n/a 38 4838 4879 4930 N
+ W SIL N b n/a 38 4838 4879 4930 N
+ W SIL N s n/a 38 4838 4879 4930 N
+ W SIL NG s n/a 38 4838 4879 4930 N
+ W SIL OW b n/a 38 4838 4920 4952 N
+ W SIL OW s n/a 38 4838 4920 4952 N
+ W SIL OY b n/a 38 4840 4920 4952 N
+ W SIL OY s n/a 38 4840 4920 4952 N
+ W SIL P s n/a 38 4838 4879 4930 N
+ W SIL R s n/a 38 4838 4910 4950 N
+ W SIL S b n/a 38 4838 4879 4930 N
+ W SIL S s n/a 38 4838 4879 4930 N
+ W SIL SH s n/a 38 4838 4879 4930 N
+ W SIL SIL s n/a 38 4838 4879 4930 N
+ W SIL T s n/a 38 4838 4879 4930 N
+ W SIL TH s n/a 38 4838 4879 4930 N
+ W SIL UH b n/a 38 4838 4879 4941 N
+ W SIL UH s n/a 38 4838 4879 4941 N
+ W SIL UW b n/a 38 4838 4879 4952 N
+ W SIL UW s n/a 38 4838 4879 4952 N
+ W SIL V s n/a 38 4838 4879 4930 N
+ W SIL W s n/a 38 4838 4915 4950 N
+ W SIL Y b n/a 38 4841 4897 4927 N
+ W SIL Y s n/a 38 4841 4897 4927 N
+ W SIL Z s n/a 38 4838 4879 4930 N
+ W SIL ZH s n/a 38 4838 4879 4930 N
+ W T AA b n/a 38 4834 4910 4947 N
+ W T AA i n/a 38 4849 4909 4947 N
+ W T AA s n/a 38 4834 4910 4947 N
+ W T AE b n/a 38 4836 4884 4930 N
+ W T AE i n/a 38 4844 4882 4931 N
+ W T AE s n/a 38 4836 4884 4930 N
+ W T AH b n/a 38 4835 4901 4937 N
+ W T AH i n/a 38 4844 4901 4937 N
+ W T AH s n/a 38 4835 4901 4937 N
+ W T AO b n/a 38 4834 4919 4951 N
+ W T AO i n/a 38 4849 4921 4951 N
+ W T AO s n/a 38 4834 4919 4951 N
+ W T AW b n/a 38 4836 4884 4930 N
+ W T AW i n/a 38 4849 4879 4931 N
+ W T AW s n/a 38 4836 4884 4930 N
+ W T AY b n/a 38 4834 4912 4946 N
+ W T AY i n/a 38 4844 4911 4945 N
+ W T AY s n/a 38 4834 4912 4946 N
+ W T B i n/a 38 4851 4879 4931 N
+ W T B s n/a 38 4836 4879 4930 N
+ W T CH s n/a 38 4836 4879 4930 N
+ W T D s n/a 38 4836 4879 4930 N
+ W T DH s n/a 38 4836 4879 4930 N
+ W T EH b n/a 38 4836 4884 4930 N
+ W T EH i n/a 38 4844 4882 4931 N
+ W T EH s n/a 38 4836 4884 4930 N
+ W T ER b n/a 38 4836 4916 4948 N
+ W T ER i n/a 38 4851 4916 4949 N
+ W T ER s n/a 38 4836 4916 4948 N
+ W T EY b n/a 38 4836 4883 4933 N
+ W T EY i n/a 38 4844 4882 4933 N
+ W T EY s n/a 38 4836 4883 4933 N
+ W T F b n/a 38 4836 4879 4930 N
+ W T F s n/a 38 4836 4879 4930 N
+ W T G s n/a 38 4836 4879 4930 N
+ W T HH s n/a 38 4836 4879 4930 N
+ W T IH b n/a 38 4852 4889 4922 N
+ W T IH i n/a 38 4844 4888 4924 N
+ W T IH s n/a 38 4852 4889 4922 N
+ W T IY b n/a 38 4853 4895 4926 N
+ W T IY i n/a 38 4843 4898 4929 N
+ W T IY s n/a 38 4853 4895 4926 N
+ W T JH s n/a 38 4836 4879 4930 N
+ W T K b n/a 38 4836 4879 4930 N
+ W T K s n/a 38 4836 4879 4930 N
+ W T L s n/a 38 4836 4910 4948 N
+ W T M b n/a 38 4836 4879 4930 N
+ W T M s n/a 38 4836 4879 4930 N
+ W T N b n/a 38 4836 4879 4930 N
+ W T N s n/a 38 4836 4879 4930 N
+ W T NG s n/a 38 4836 4879 4930 N
+ W T OW b n/a 38 4834 4920 4952 N
+ W T OW i n/a 38 4851 4920 4952 N
+ W T OW s n/a 38 4834 4920 4952 N
+ W T OY b n/a 38 4834 4920 4952 N
+ W T OY s n/a 38 4834 4920 4952 N
+ W T P s n/a 38 4836 4879 4930 N
+ W T R s n/a 38 4836 4910 4948 N
+ W T S b n/a 38 4836 4879 4930 N
+ W T S s n/a 38 4836 4879 4930 N
+ W T SH s n/a 38 4836 4879 4930 N
+ W T SIL s n/a 38 4836 4879 4930 N
+ W T T s n/a 38 4836 4879 4930 N
+ W T TH s n/a 38 4836 4879 4930 N
+ W T UH b n/a 38 4853 4879 4941 N
+ W T UH i n/a 38 4851 4879 4941 N
+ W T UH s n/a 38 4853 4879 4941 N
+ W T UW b n/a 38 4853 4879 4952 N
+ W T UW i n/a 38 4851 4879 4952 N
+ W T UW s n/a 38 4853 4879 4952 N
+ W T V s n/a 38 4836 4879 4930 N
+ W T W s n/a 38 4836 4916 4948 N
+ W T Y b n/a 38 4853 4895 4926 N
+ W T Y s n/a 38 4853 4895 4926 N
+ W T Z s n/a 38 4836 4879 4930 N
+ W T ZH s n/a 38 4836 4879 4930 N
+ W TH AA b n/a 38 4834 4910 4947 N
+ W TH AA i n/a 38 4845 4909 4947 N
+ W TH AA s n/a 38 4834 4910 4947 N
+ W TH AE b n/a 38 4834 4886 4930 N
+ W TH AE i n/a 38 4845 4886 4930 N
+ W TH AE s n/a 38 4834 4886 4930 N
+ W TH AH b n/a 38 4834 4899 4942 N
+ W TH AH i n/a 38 4845 4903 4944 N
+ W TH AH s n/a 38 4834 4899 4942 N
+ W TH AO b n/a 38 4834 4919 4951 N
+ W TH AO i n/a 38 4845 4921 4951 N
+ W TH AO s n/a 38 4834 4919 4951 N
+ W TH AW b n/a 38 4834 4886 4930 N
+ W TH AW s n/a 38 4834 4886 4930 N
+ W TH AY b n/a 38 4834 4912 4946 N
+ W TH AY i n/a 38 4845 4911 4946 N
+ W TH AY s n/a 38 4834 4912 4946 N
+ W TH B s n/a 38 4834 4879 4930 N
+ W TH CH s n/a 38 4834 4879 4930 N
+ W TH D s n/a 38 4834 4879 4930 N
+ W TH DH s n/a 38 4834 4879 4930 N
+ W TH EH b n/a 38 4834 4886 4930 N
+ W TH EH i n/a 38 4845 4886 4930 N
+ W TH EH s n/a 38 4834 4886 4930 N
+ W TH ER b n/a 38 4836 4915 4948 N
+ W TH ER i n/a 38 4845 4915 4949 N
+ W TH ER s n/a 38 4836 4915 4948 N
+ W TH EY b n/a 38 4834 4886 4933 N
+ W TH EY i n/a 38 4845 4886 4933 N
+ W TH EY s n/a 38 4834 4886 4933 N
+ W TH F b n/a 38 4834 4879 4930 N
+ W TH F s n/a 38 4834 4879 4930 N
+ W TH G s n/a 38 4834 4879 4930 N
+ W TH HH s n/a 38 4834 4879 4930 N
+ W TH IH b n/a 38 4845 4889 4923 N
+ W TH IH i n/a 38 4846 4888 4924 N
+ W TH IH s n/a 38 4845 4889 4923 N
+ W TH IY b n/a 38 4845 4898 4927 N
+ W TH IY i n/a 38 4846 4898 4927 N
+ W TH IY s n/a 38 4845 4898 4927 N
+ W TH JH s n/a 38 4834 4879 4930 N
+ W TH K b n/a 38 4834 4879 4930 N
+ W TH K s n/a 38 4834 4879 4930 N
+ W TH L s n/a 38 4836 4910 4948 N
+ W TH M b n/a 38 4834 4879 4930 N
+ W TH M s n/a 38 4834 4879 4930 N
+ W TH N b n/a 38 4834 4879 4930 N
+ W TH N s n/a 38 4834 4879 4930 N
+ W TH NG s n/a 38 4834 4879 4930 N
+ W TH OW b n/a 38 4834 4920 4952 N
+ W TH OW i n/a 38 4845 4920 4952 N
+ W TH OW s n/a 38 4834 4920 4952 N
+ W TH OY b n/a 38 4834 4920 4952 N
+ W TH OY s n/a 38 4834 4920 4952 N
+ W TH P s n/a 38 4834 4879 4930 N
+ W TH R s n/a 38 4836 4910 4948 N
+ W TH S b n/a 38 4834 4879 4930 N
+ W TH S s n/a 38 4834 4879 4930 N
+ W TH SH s n/a 38 4834 4879 4930 N
+ W TH SIL s n/a 38 4834 4879 4930 N
+ W TH T s n/a 38 4834 4879 4930 N
+ W TH TH s n/a 38 4834 4879 4930 N
+ W TH UH b n/a 38 4845 4879 4941 N
+ W TH UH i n/a 38 4846 4879 4941 N
+ W TH UH s n/a 38 4845 4879 4941 N
+ W TH UW b n/a 38 4845 4879 4952 N
+ W TH UW s n/a 38 4845 4879 4952 N
+ W TH V s n/a 38 4834 4879 4930 N
+ W TH W s n/a 38 4836 4915 4948 N
+ W TH Y b n/a 38 4845 4898 4927 N
+ W TH Y s n/a 38 4845 4898 4927 N
+ W TH Z s n/a 38 4834 4879 4930 N
+ W TH ZH s n/a 38 4834 4879 4930 N
+ W UH AA b n/a 38 4860 4910 4947 N
+ W UH AA s n/a 38 4860 4910 4947 N
+ W UH AE b n/a 38 4860 4883 4930 N
+ W UH AE s n/a 38 4860 4883 4930 N
+ W UH AH b n/a 38 4860 4905 4935 N
+ W UH AH s n/a 38 4860 4905 4935 N
+ W UH AO b n/a 38 4860 4919 4951 N
+ W UH AO s n/a 38 4860 4919 4951 N
+ W UH AW b n/a 38 4860 4883 4930 N
+ W UH AW s n/a 38 4860 4883 4930 N
+ W UH AY b n/a 38 4860 4912 4946 N
+ W UH AY s n/a 38 4860 4912 4946 N
+ W UH B s n/a 38 4860 4880 4930 N
+ W UH CH s n/a 38 4860 4880 4930 N
+ W UH D s n/a 38 4860 4880 4930 N
+ W UH DH s n/a 38 4860 4880 4930 N
+ W UH EH b n/a 38 4860 4883 4930 N
+ W UH EH s n/a 38 4860 4883 4930 N
+ W UH ER b n/a 38 4860 4916 4948 N
+ W UH ER s n/a 38 4860 4916 4948 N
+ W UH EY b n/a 38 4860 4883 4933 N
+ W UH EY s n/a 38 4860 4883 4933 N
+ W UH F b n/a 38 4860 4880 4930 N
+ W UH F s n/a 38 4860 4880 4930 N
+ W UH G s n/a 38 4860 4880 4930 N
+ W UH HH s n/a 38 4860 4880 4930 N
+ W UH IH b n/a 38 4860 4893 4925 N
+ W UH IH s n/a 38 4860 4893 4925 N
+ W UH IY b n/a 38 4860 4895 4926 N
+ W UH IY s n/a 38 4860 4895 4926 N
+ W UH JH s n/a 38 4860 4880 4930 N
+ W UH K b n/a 38 4860 4880 4930 N
+ W UH K s n/a 38 4860 4880 4930 N
+ W UH L s n/a 38 4860 4910 4948 N
+ W UH M b n/a 38 4860 4880 4930 N
+ W UH M s n/a 38 4860 4880 4930 N
+ W UH N b n/a 38 4860 4880 4930 N
+ W UH N s n/a 38 4860 4880 4930 N
+ W UH NG s n/a 38 4860 4880 4930 N
+ W UH OW b n/a 38 4860 4920 4952 N
+ W UH OW s n/a 38 4860 4920 4952 N
+ W UH OY b n/a 38 4860 4920 4952 N
+ W UH OY s n/a 38 4860 4920 4952 N
+ W UH P s n/a 38 4860 4880 4930 N
+ W UH R s n/a 38 4860 4910 4948 N
+ W UH S b n/a 38 4860 4880 4930 N
+ W UH S s n/a 38 4860 4880 4930 N
+ W UH SH s n/a 38 4860 4880 4930 N
+ W UH SIL s n/a 38 4860 4880 4930 N
+ W UH T s n/a 38 4860 4880 4930 N
+ W UH TH s n/a 38 4860 4880 4930 N
+ W UH UH b n/a 38 4860 4880 4944 N
+ W UH UH s n/a 38 4860 4880 4944 N
+ W UH UW b n/a 38 4860 4880 4952 N
+ W UH UW s n/a 38 4860 4880 4952 N
+ W UH V s n/a 38 4860 4880 4930 N
+ W UH W s n/a 38 4860 4916 4948 N
+ W UH Y b n/a 38 4860 4895 4926 N
+ W UH Y s n/a 38 4860 4895 4926 N
+ W UH Z s n/a 38 4860 4880 4930 N
+ W UH ZH s n/a 38 4860 4880 4930 N
+ W UW AA b n/a 38 4860 4910 4947 N
+ W UW AA e n/a 38 4860 4910 4947 N
+ W UW AA i n/a 38 4860 4910 4947 N
+ W UW AA s n/a 38 4860 4910 4947 N
+ W UW AE b n/a 38 4860 4883 4930 N
+ W UW AE e n/a 38 4860 4883 4930 N
+ W UW AE s n/a 38 4860 4883 4930 N
+ W UW AH b n/a 38 4860 4905 4935 N
+ W UW AH e n/a 38 4860 4905 4935 N
+ W UW AH i n/a 38 4860 4905 4937 N
+ W UW AH s n/a 38 4860 4905 4935 N
+ W UW AO b n/a 38 4860 4919 4951 N
+ W UW AO e n/a 38 4860 4919 4951 N
+ W UW AO s n/a 38 4860 4919 4951 N
+ W UW AW b n/a 38 4860 4883 4930 N
+ W UW AW e n/a 38 4860 4883 4930 N
+ W UW AW s n/a 38 4860 4883 4930 N
+ W UW AY b n/a 38 4860 4912 4946 N
+ W UW AY e n/a 38 4860 4912 4946 N
+ W UW AY i n/a 38 4860 4912 4946 N
+ W UW AY s n/a 38 4860 4912 4946 N
+ W UW B e n/a 38 4860 4881 4930 N
+ W UW B s n/a 38 4860 4881 4930 N
+ W UW CH e n/a 38 4860 4881 4930 N
+ W UW CH s n/a 38 4860 4881 4930 N
+ W UW D e n/a 38 4860 4881 4930 N
+ W UW D s n/a 38 4860 4881 4930 N
+ W UW DH e n/a 38 4860 4881 4930 N
+ W UW DH s n/a 38 4860 4881 4930 N
+ W UW EH b n/a 38 4860 4883 4930 N
+ W UW EH e n/a 38 4860 4883 4930 N
+ W UW EH i n/a 38 4860 4883 4930 N
+ W UW EH s n/a 38 4860 4883 4930 N
+ W UW ER b n/a 38 4860 4917 4949 N
+ W UW ER e n/a 38 4860 4917 4949 N
+ W UW ER i n/a 38 4860 4917 4949 N
+ W UW ER s n/a 38 4860 4917 4949 N
+ W UW EY b n/a 38 4860 4883 4933 N
+ W UW EY e n/a 38 4860 4883 4933 N
+ W UW EY i n/a 38 4860 4883 4933 N
+ W UW EY s n/a 38 4860 4883 4933 N
+ W UW F b n/a 38 4860 4881 4930 N
+ W UW F e n/a 38 4860 4881 4930 N
+ W UW F s n/a 38 4860 4881 4930 N
+ W UW G e n/a 38 4860 4881 4930 N
+ W UW G s n/a 38 4860 4881 4930 N
+ W UW HH e n/a 38 4860 4881 4930 N
+ W UW HH s n/a 38 4860 4881 4930 N
+ W UW IH b n/a 38 4860 4892 4925 N
+ W UW IH e n/a 38 4860 4892 4925 N
+ W UW IH i n/a 38 4860 4892 4925 N
+ W UW IH s n/a 38 4860 4892 4925 N
+ W UW IY b n/a 38 4860 4895 4926 N
+ W UW IY e n/a 38 4860 4895 4926 N
+ W UW IY i n/a 38 4860 4896 4928 N
+ W UW IY s n/a 38 4860 4895 4926 N
+ W UW JH e n/a 38 4860 4881 4930 N
+ W UW JH s n/a 38 4860 4881 4930 N
+ W UW K b n/a 38 4860 4881 4930 N
+ W UW K e n/a 38 4860 4881 4930 N
+ W UW K s n/a 38 4860 4881 4930 N
+ W UW L e n/a 38 4860 4910 4949 N
+ W UW L s n/a 38 4860 4910 4949 N
+ W UW M b n/a 38 4860 4881 4930 N
+ W UW M e n/a 38 4860 4881 4930 N
+ W UW M s n/a 38 4860 4881 4930 N
+ W UW N b n/a 38 4860 4881 4930 N
+ W UW N e n/a 38 4860 4881 4930 N
+ W UW N s n/a 38 4860 4881 4930 N
+ W UW NG e n/a 38 4860 4881 4930 N
+ W UW NG s n/a 38 4860 4881 4930 N
+ W UW OW b n/a 38 4860 4920 4952 N
+ W UW OW e n/a 38 4860 4920 4952 N
+ W UW OW s n/a 38 4860 4920 4952 N
+ W UW OY b n/a 38 4860 4920 4952 N
+ W UW OY e n/a 38 4860 4920 4952 N
+ W UW OY s n/a 38 4860 4920 4952 N
+ W UW P e n/a 38 4860 4881 4930 N
+ W UW P s n/a 38 4860 4881 4930 N
+ W UW R e n/a 38 4860 4910 4949 N
+ W UW R s n/a 38 4860 4910 4949 N
+ W UW S b n/a 38 4860 4881 4930 N
+ W UW S e n/a 38 4860 4881 4930 N
+ W UW S s n/a 38 4860 4881 4930 N
+ W UW SH e n/a 38 4860 4881 4930 N
+ W UW SH s n/a 38 4860 4881 4930 N
+ W UW SIL e n/a 38 4860 4881 4930 N
+ W UW SIL s n/a 38 4860 4881 4930 N
+ W UW T e n/a 38 4860 4881 4930 N
+ W UW T s n/a 38 4860 4881 4930 N
+ W UW TH e n/a 38 4860 4881 4930 N
+ W UW TH s n/a 38 4860 4881 4930 N
+ W UW UH b n/a 38 4860 4881 4941 N
+ W UW UH e n/a 38 4860 4881 4941 N
+ W UW UH i n/a 38 4860 4881 4941 N
+ W UW UH s n/a 38 4860 4881 4941 N
+ W UW UW b n/a 38 4860 4881 4952 N
+ W UW UW e n/a 38 4860 4881 4952 N
+ W UW UW s n/a 38 4860 4881 4952 N
+ W UW V e n/a 38 4860 4881 4930 N
+ W UW V s n/a 38 4860 4881 4930 N
+ W UW W e n/a 38 4860 4917 4949 N
+ W UW W s n/a 38 4860 4917 4949 N
+ W UW Y b n/a 38 4860 4895 4926 N
+ W UW Y e n/a 38 4860 4895 4926 N
+ W UW Y s n/a 38 4860 4895 4926 N
+ W UW Z e n/a 38 4860 4881 4930 N
+ W UW Z s n/a 38 4860 4881 4930 N
+ W UW ZH e n/a 38 4860 4881 4930 N
+ W UW ZH s n/a 38 4860 4881 4930 N
+ W V AA b n/a 38 4830 4910 4947 N
+ W V AA i n/a 38 4853 4910 4947 N
+ W V AA s n/a 38 4830 4910 4947 N
+ W V AE b n/a 38 4830 4884 4930 N
+ W V AE i n/a 38 4853 4884 4930 N
+ W V AE s n/a 38 4830 4884 4930 N
+ W V AH b n/a 38 4830 4903 4934 N
+ W V AH i n/a 38 4853 4906 4940 N
+ W V AH s n/a 38 4830 4903 4934 N
+ W V AO b n/a 38 4830 4919 4951 N
+ W V AO s n/a 38 4830 4919 4951 N
+ W V AW b n/a 38 4830 4884 4930 N
+ W V AW s n/a 38 4830 4884 4930 N
+ W V AY b n/a 38 4830 4912 4946 N
+ W V AY s n/a 38 4830 4912 4946 N
+ W V B s n/a 38 4830 4880 4930 N
+ W V CH s n/a 38 4830 4880 4930 N
+ W V D s n/a 38 4830 4880 4930 N
+ W V DH s n/a 38 4830 4880 4930 N
+ W V EH b n/a 38 4830 4884 4930 N
+ W V EH i n/a 38 4853 4884 4930 N
+ W V EH s n/a 38 4830 4884 4930 N
+ W V ER b n/a 38 4830 4916 4948 N
+ W V ER s n/a 38 4830 4916 4948 N
+ W V EY b n/a 38 4830 4883 4933 N
+ W V EY i n/a 38 4853 4883 4933 N
+ W V EY s n/a 38 4830 4883 4933 N
+ W V F b n/a 38 4830 4880 4930 N
+ W V F s n/a 38 4830 4880 4930 N
+ W V G s n/a 38 4830 4880 4930 N
+ W V HH s n/a 38 4830 4880 4930 N
+ W V IH b n/a 38 4853 4889 4925 N
+ W V IH s n/a 38 4853 4889 4925 N
+ W V IY b n/a 38 4853 4895 4926 N
+ W V IY s n/a 38 4853 4895 4926 N
+ W V JH s n/a 38 4830 4880 4930 N
+ W V K b n/a 38 4830 4880 4930 N
+ W V K s n/a 38 4830 4880 4930 N
+ W V L s n/a 38 4830 4910 4948 N
+ W V M b n/a 38 4830 4880 4930 N
+ W V M s n/a 38 4830 4880 4930 N
+ W V N b n/a 38 4830 4880 4930 N
+ W V N s n/a 38 4830 4880 4930 N
+ W V NG s n/a 38 4830 4880 4930 N
+ W V OW b n/a 38 4830 4920 4952 N
+ W V OW s n/a 38 4830 4920 4952 N
+ W V OY b n/a 38 4830 4920 4952 N
+ W V OY s n/a 38 4830 4920 4952 N
+ W V P s n/a 38 4830 4880 4930 N
+ W V R s n/a 38 4830 4910 4948 N
+ W V S b n/a 38 4830 4880 4930 N
+ W V S s n/a 38 4830 4880 4930 N
+ W V SH s n/a 38 4830 4880 4930 N
+ W V SIL s n/a 38 4830 4880 4930 N
+ W V T s n/a 38 4830 4880 4930 N
+ W V TH s n/a 38 4830 4880 4930 N
+ W V UH b n/a 38 4853 4880 4941 N
+ W V UH s n/a 38 4853 4880 4941 N
+ W V UW b n/a 38 4853 4880 4952 N
+ W V UW s n/a 38 4853 4880 4952 N
+ W V V s n/a 38 4830 4880 4930 N
+ W V W s n/a 38 4830 4916 4948 N
+ W V Y b n/a 38 4853 4895 4926 N
+ W V Y s n/a 38 4853 4895 4926 N
+ W V Z s n/a 38 4830 4880 4930 N
+ W V ZH s n/a 38 4830 4880 4930 N
+ W W AA b n/a 38 4858 4910 4947 N
+ W W AA s n/a 38 4858 4910 4947 N
+ W W AE b n/a 38 4858 4883 4930 N
+ W W AE s n/a 38 4858 4883 4930 N
+ W W AH b n/a 38 4858 4906 4935 N
+ W W AH s n/a 38 4858 4906 4935 N
+ W W AO b n/a 38 4858 4919 4951 N
+ W W AO s n/a 38 4858 4919 4951 N
+ W W AW b n/a 38 4858 4883 4930 N
+ W W AW s n/a 38 4858 4883 4930 N
+ W W AY b n/a 38 4858 4912 4946 N
+ W W AY s n/a 38 4858 4912 4946 N
+ W W B s n/a 38 4858 4880 4930 N
+ W W CH s n/a 38 4858 4880 4930 N
+ W W D s n/a 38 4858 4880 4930 N
+ W W DH s n/a 38 4858 4880 4930 N
+ W W EH b n/a 38 4858 4883 4930 N
+ W W EH s n/a 38 4858 4883 4930 N
+ W W ER b n/a 38 4858 4916 4948 N
+ W W ER s n/a 38 4858 4916 4948 N
+ W W EY b n/a 38 4858 4883 4933 N
+ W W EY s n/a 38 4858 4883 4933 N
+ W W F b n/a 38 4858 4880 4930 N
+ W W F s n/a 38 4858 4880 4930 N
+ W W G s n/a 38 4858 4880 4930 N
+ W W HH s n/a 38 4858 4880 4930 N
+ W W IH b n/a 38 4859 4893 4925 N
+ W W IH s n/a 38 4859 4893 4925 N
+ W W IY b n/a 38 4859 4895 4926 N
+ W W IY s n/a 38 4859 4895 4926 N
+ W W JH s n/a 38 4858 4880 4930 N
+ W W K b n/a 38 4858 4880 4930 N
+ W W K s n/a 38 4858 4880 4930 N
+ W W L s n/a 38 4858 4910 4948 N
+ W W M b n/a 38 4858 4880 4930 N
+ W W M s n/a 38 4858 4880 4930 N
+ W W N b n/a 38 4858 4880 4930 N
+ W W N s n/a 38 4858 4880 4930 N
+ W W NG s n/a 38 4858 4880 4930 N
+ W W OW b n/a 38 4858 4920 4952 N
+ W W OW s n/a 38 4858 4920 4952 N
+ W W OY b n/a 38 4858 4920 4952 N
+ W W OY s n/a 38 4858 4920 4952 N
+ W W P s n/a 38 4858 4880 4930 N
+ W W R s n/a 38 4858 4910 4948 N
+ W W S b n/a 38 4858 4880 4930 N
+ W W S s n/a 38 4858 4880 4930 N
+ W W SH s n/a 38 4858 4880 4930 N
+ W W SIL s n/a 38 4858 4880 4930 N
+ W W T s n/a 38 4858 4880 4930 N
+ W W TH s n/a 38 4858 4880 4930 N
+ W W UH b n/a 38 4859 4880 4941 N
+ W W UH s n/a 38 4859 4880 4941 N
+ W W UW b n/a 38 4859 4880 4952 N
+ W W UW s n/a 38 4859 4880 4952 N
+ W W V s n/a 38 4858 4880 4930 N
+ W W W s n/a 38 4858 4916 4948 N
+ W W Y b n/a 38 4859 4895 4926 N
+ W W Y s n/a 38 4859 4895 4926 N
+ W W Z s n/a 38 4858 4880 4930 N
+ W W ZH s n/a 38 4858 4880 4930 N
+ W Y AA b n/a 38 4875 4910 4947 N
+ W Y AA s n/a 38 4875 4910 4947 N
+ W Y AE b n/a 38 4875 4884 4930 N
+ W Y AE s n/a 38 4875 4884 4930 N
+ W Y AH b n/a 38 4874 4908 4939 N
+ W Y AH s n/a 38 4874 4908 4939 N
+ W Y AO b n/a 38 4875 4919 4951 N
+ W Y AO s n/a 38 4875 4919 4951 N
+ W Y AW b n/a 38 4875 4884 4930 N
+ W Y AW s n/a 38 4875 4884 4930 N
+ W Y AY b n/a 38 4875 4912 4946 N
+ W Y AY s n/a 38 4875 4912 4946 N
+ W Y B s n/a 38 4875 4880 4930 N
+ W Y CH s n/a 38 4875 4880 4930 N
+ W Y D s n/a 38 4875 4880 4930 N
+ W Y DH s n/a 38 4875 4880 4930 N
+ W Y EH b n/a 38 4875 4884 4930 N
+ W Y EH i n/a 38 4875 4884 4930 N
+ W Y EH s n/a 38 4875 4884 4930 N
+ W Y ER b n/a 38 4875 4916 4948 N
+ W Y ER s n/a 38 4875 4916 4948 N
+ W Y EY b n/a 38 4875 4883 4933 N
+ W Y EY s n/a 38 4875 4883 4933 N
+ W Y F b n/a 38 4875 4880 4930 N
+ W Y F s n/a 38 4875 4880 4930 N
+ W Y G s n/a 38 4875 4880 4930 N
+ W Y HH s n/a 38 4875 4880 4930 N
+ W Y IH b n/a 38 4876 4892 4925 N
+ W Y IH s n/a 38 4876 4892 4925 N
+ W Y IY b n/a 38 4876 4895 4926 N
+ W Y IY s n/a 38 4876 4895 4926 N
+ W Y JH s n/a 38 4875 4880 4930 N
+ W Y K b n/a 38 4875 4880 4930 N
+ W Y K s n/a 38 4875 4880 4930 N
+ W Y L s n/a 38 4875 4910 4948 N
+ W Y M b n/a 38 4875 4880 4930 N
+ W Y M s n/a 38 4875 4880 4930 N
+ W Y N b n/a 38 4875 4880 4930 N
+ W Y N s n/a 38 4875 4880 4930 N
+ W Y NG s n/a 38 4875 4880 4930 N
+ W Y OW b n/a 38 4875 4920 4952 N
+ W Y OW s n/a 38 4875 4920 4952 N
+ W Y OY b n/a 38 4875 4920 4952 N
+ W Y OY s n/a 38 4875 4920 4952 N
+ W Y P s n/a 38 4875 4880 4930 N
+ W Y R s n/a 38 4875 4910 4948 N
+ W Y S b n/a 38 4875 4880 4930 N
+ W Y S s n/a 38 4875 4880 4930 N
+ W Y SH s n/a 38 4875 4880 4930 N
+ W Y SIL s n/a 38 4875 4880 4930 N
+ W Y T s n/a 38 4875 4880 4930 N
+ W Y TH s n/a 38 4875 4880 4930 N
+ W Y UH b n/a 38 4874 4880 4941 N
+ W Y UH s n/a 38 4874 4880 4941 N
+ W Y UW b n/a 38 4876 4880 4952 N
+ W Y UW s n/a 38 4876 4880 4952 N
+ W Y V s n/a 38 4875 4880 4930 N
+ W Y W s n/a 38 4875 4916 4948 N
+ W Y Y b n/a 38 4876 4895 4926 N
+ W Y Y s n/a 38 4876 4895 4926 N
+ W Y Z s n/a 38 4875 4880 4930 N
+ W Y ZH s n/a 38 4875 4880 4930 N
+ W Z AA b n/a 38 4856 4910 4947 N
+ W Z AA i n/a 38 4856 4910 4947 N
+ W Z AA s n/a 38 4856 4910 4947 N
+ W Z AE b n/a 38 4856 4884 4930 N
+ W Z AE i n/a 38 4856 4884 4930 N
+ W Z AE s n/a 38 4856 4884 4930 N
+ W Z AH b n/a 38 4856 4903 4935 N
+ W Z AH i n/a 38 4856 4907 4940 N
+ W Z AH s n/a 38 4856 4903 4935 N
+ W Z AO b n/a 38 4856 4919 4951 N
+ W Z AO i n/a 38 4856 4919 4951 N
+ W Z AO s n/a 38 4856 4919 4951 N
+ W Z AW b n/a 38 4856 4884 4930 N
+ W Z AW s n/a 38 4856 4884 4930 N
+ W Z AY b n/a 38 4856 4912 4946 N
+ W Z AY i n/a 38 4856 4912 4946 N
+ W Z AY s n/a 38 4856 4912 4946 N
+ W Z B s n/a 38 4856 4879 4930 N
+ W Z CH s n/a 38 4856 4879 4930 N
+ W Z D s n/a 38 4856 4879 4930 N
+ W Z DH s n/a 38 4856 4879 4930 N
+ W Z EH b n/a 38 4856 4884 4930 N
+ W Z EH i n/a 38 4856 4884 4930 N
+ W Z EH s n/a 38 4856 4884 4930 N
+ W Z ER b n/a 38 4857 4915 4950 N
+ W Z ER i n/a 38 4857 4915 4950 N
+ W Z ER s n/a 38 4857 4915 4950 N
+ W Z EY b n/a 38 4856 4883 4933 N
+ W Z EY i n/a 38 4856 4883 4933 N
+ W Z EY s n/a 38 4856 4883 4933 N
+ W Z F b n/a 38 4856 4879 4930 N
+ W Z F s n/a 38 4856 4879 4930 N
+ W Z G s n/a 38 4856 4879 4930 N
+ W Z HH s n/a 38 4856 4879 4930 N
+ W Z IH b n/a 38 4857 4888 4922 N
+ W Z IH i n/a 38 4857 4888 4924 N
+ W Z IH s n/a 38 4857 4888 4922 N
+ W Z IY b n/a 38 4857 4895 4926 N
+ W Z IY i n/a 38 4857 4896 4928 N
+ W Z IY s n/a 38 4857 4895 4926 N
+ W Z JH s n/a 38 4856 4879 4930 N
+ W Z K b n/a 38 4856 4879 4930 N
+ W Z K s n/a 38 4856 4879 4930 N
+ W Z L s n/a 38 4856 4910 4950 N
+ W Z M b n/a 38 4856 4879 4930 N
+ W Z M s n/a 38 4856 4879 4930 N
+ W Z N b n/a 38 4856 4879 4930 N
+ W Z N s n/a 38 4856 4879 4930 N
+ W Z NG s n/a 38 4856 4879 4930 N
+ W Z OW b n/a 38 4856 4920 4952 N
+ W Z OW i n/a 38 4856 4920 4952 N
+ W Z OW s n/a 38 4856 4920 4952 N
+ W Z OY b n/a 38 4856 4920 4952 N
+ W Z OY s n/a 38 4856 4920 4952 N
+ W Z P s n/a 38 4856 4879 4930 N
+ W Z R s n/a 38 4857 4910 4950 N
+ W Z S b n/a 38 4856 4879 4930 N
+ W Z S s n/a 38 4856 4879 4930 N
+ W Z SH s n/a 38 4856 4879 4930 N
+ W Z SIL s n/a 38 4856 4879 4930 N
+ W Z T s n/a 38 4856 4879 4930 N
+ W Z TH s n/a 38 4856 4879 4930 N
+ W Z UH b n/a 38 4857 4879 4941 N
+ W Z UH i n/a 38 4857 4879 4941 N
+ W Z UH s n/a 38 4857 4879 4941 N
+ W Z UW b n/a 38 4857 4879 4952 N
+ W Z UW s n/a 38 4857 4879 4952 N
+ W Z V s n/a 38 4856 4879 4930 N
+ W Z W s n/a 38 4856 4915 4950 N
+ W Z Y b n/a 38 4857 4895 4926 N
+ W Z Y i n/a 38 4857 4896 4928 N
+ W Z Y s n/a 38 4857 4895 4926 N
+ W Z Z s n/a 38 4856 4879 4930 N
+ W Z ZH s n/a 38 4856 4879 4930 N
+ W ZH AA b n/a 38 4857 4910 4947 N
+ W ZH AA i n/a 38 4857 4910 4947 N
+ W ZH AA s n/a 38 4857 4910 4947 N
+ W ZH AE b n/a 38 4857 4884 4930 N
+ W ZH AE s n/a 38 4857 4884 4930 N
+ W ZH AH b n/a 38 4857 4903 4935 N
+ W ZH AH i n/a 38 4857 4907 4940 N
+ W ZH AH s n/a 38 4857 4903 4935 N
+ W ZH AO b n/a 38 4857 4919 4951 N
+ W ZH AO s n/a 38 4857 4919 4951 N
+ W ZH AW b n/a 38 4857 4884 4930 N
+ W ZH AW s n/a 38 4857 4884 4930 N
+ W ZH AY b n/a 38 4857 4912 4946 N
+ W ZH AY s n/a 38 4857 4912 4946 N
+ W ZH B s n/a 38 4857 4879 4930 N
+ W ZH CH s n/a 38 4857 4879 4930 N
+ W ZH D s n/a 38 4857 4879 4930 N
+ W ZH DH s n/a 38 4857 4879 4930 N
+ W ZH EH b n/a 38 4857 4884 4930 N
+ W ZH EH s n/a 38 4857 4884 4930 N
+ W ZH ER b n/a 38 4857 4915 4949 N
+ W ZH ER s n/a 38 4857 4915 4949 N
+ W ZH EY b n/a 38 4857 4883 4933 N
+ W ZH EY i n/a 38 4857 4883 4933 N
+ W ZH EY s n/a 38 4857 4883 4933 N
+ W ZH F b n/a 38 4857 4879 4930 N
+ W ZH F s n/a 38 4857 4879 4930 N
+ W ZH G s n/a 38 4857 4879 4930 N
+ W ZH HH s n/a 38 4857 4879 4930 N
+ W ZH IH b n/a 38 4857 4888 4925 N
+ W ZH IH i n/a 38 4857 4888 4925 N
+ W ZH IH s n/a 38 4857 4888 4925 N
+ W ZH IY b n/a 38 4857 4895 4926 N
+ W ZH IY s n/a 38 4857 4895 4926 N
+ W ZH JH s n/a 38 4857 4879 4930 N
+ W ZH K b n/a 38 4857 4879 4930 N
+ W ZH K s n/a 38 4857 4879 4930 N
+ W ZH L s n/a 38 4857 4910 4949 N
+ W ZH M b n/a 38 4857 4879 4930 N
+ W ZH M s n/a 38 4857 4879 4930 N
+ W ZH N b n/a 38 4857 4879 4930 N
+ W ZH N s n/a 38 4857 4879 4930 N
+ W ZH NG s n/a 38 4857 4879 4930 N
+ W ZH OW b n/a 38 4857 4920 4952 N
+ W ZH OW s n/a 38 4857 4920 4952 N
+ W ZH OY b n/a 38 4857 4920 4952 N
+ W ZH OY s n/a 38 4857 4920 4952 N
+ W ZH P s n/a 38 4857 4879 4930 N
+ W ZH R s n/a 38 4857 4910 4949 N
+ W ZH S b n/a 38 4857 4879 4930 N
+ W ZH S s n/a 38 4857 4879 4930 N
+ W ZH SH s n/a 38 4857 4879 4930 N
+ W ZH SIL s n/a 38 4857 4879 4930 N
+ W ZH T s n/a 38 4857 4879 4930 N
+ W ZH TH s n/a 38 4857 4879 4930 N
+ W ZH UH b n/a 38 4857 4879 4941 N
+ W ZH UH s n/a 38 4857 4879 4941 N
+ W ZH UW b n/a 38 4857 4879 4952 N
+ W ZH UW s n/a 38 4857 4879 4952 N
+ W ZH V s n/a 38 4857 4879 4930 N
+ W ZH W s n/a 38 4857 4915 4949 N
+ W ZH Y b n/a 38 4857 4895 4926 N
+ W ZH Y s n/a 38 4857 4895 4926 N
+ W ZH Z s n/a 38 4857 4879 4930 N
+ W ZH ZH s n/a 38 4857 4879 4930 N
+ Y AA AA b n/a 39 4963 4988 4992 N
+ Y AA AA i n/a 39 4964 4988 4990 N
+ Y AA AE b n/a 39 4963 4988 4991 N
+ Y AA AE i n/a 39 4964 4988 4990 N
+ Y AA AH b n/a 39 4963 4988 4992 N
+ Y AA AH i n/a 39 4964 4988 4990 N
+ Y AA AO b n/a 39 4963 4982 4993 N
+ Y AA AO i n/a 39 4964 4982 4993 N
+ Y AA AW b n/a 39 4963 4988 4992 N
+ Y AA AY b n/a 39 4963 4988 4991 N
+ Y AA D i n/a 39 4964 4988 4990 N
+ Y AA EH b n/a 39 4963 4988 4991 N
+ Y AA EH i n/a 39 4964 4988 4990 N
+ Y AA ER b n/a 39 4963 4980 5002 N
+ Y AA EY b n/a 39 4963 4988 4991 N
+ Y AA EY i n/a 39 4964 4988 4990 N
+ Y AA G b n/a 39 4963 4988 4991 N
+ Y AA IH b n/a 39 4963 4980 4998 N
+ Y AA IY b n/a 39 4963 4980 4998 N
+ Y AA JH b n/a 39 4963 4988 4991 N
+ Y AA JH i n/a 39 4964 4988 4990 N
+ Y AA K b n/a 39 4963 4988 4991 N
+ Y AA L i n/a 39 4964 4988 4990 N
+ Y AA M b n/a 39 4963 4988 4991 N
+ Y AA M i n/a 39 4964 4988 4990 N
+ Y AA OW b n/a 39 4963 4979 4999 N
+ Y AA OW i n/a 39 4964 4979 4999 N
+ Y AA OY b n/a 39 4963 4980 4999 N
+ Y AA P b n/a 39 4963 4988 4991 N
+ Y AA T i n/a 39 4964 4988 4990 N
+ Y AA UH b n/a 39 4963 4982 5001 N
+ Y AA UH i n/a 39 4964 4982 5001 N
+ Y AA UW b n/a 39 4963 4979 4997 N
+ Y AA UW i n/a 39 4964 4979 4997 N
+ Y AA W b n/a 39 4963 4982 4999 N
+ Y AE AA b n/a 39 4967 4988 4992 N
+ Y AE AE b n/a 39 4967 4988 4991 N
+ Y AE AH b n/a 39 4967 4988 4992 N
+ Y AE AO b n/a 39 4965 4982 4993 N
+ Y AE AW b n/a 39 4967 4988 4992 N
+ Y AE AY b n/a 39 4967 4988 4991 N
+ Y AE EH b n/a 39 4967 4988 4991 N
+ Y AE ER b n/a 39 4965 4980 5002 N
+ Y AE EY b n/a 39 4967 4988 4991 N
+ Y AE G b n/a 39 4967 4988 4991 N
+ Y AE IH b n/a 39 4967 4980 4998 N
+ Y AE IY b n/a 39 4967 4980 4998 N
+ Y AE JH b n/a 39 4967 4988 4991 N
+ Y AE K b n/a 39 4967 4988 4991 N
+ Y AE M b n/a 39 4967 4988 4991 N
+ Y AE OW b n/a 39 4965 4981 4999 N
+ Y AE OY b n/a 39 4965 4980 4999 N
+ Y AE P b n/a 39 4967 4988 4991 N
+ Y AE UH b n/a 39 4965 4982 5001 N
+ Y AE UW b n/a 39 4965 4981 4997 N
+ Y AE W b n/a 39 4965 4982 4999 N
+ Y AH AA b n/a 39 4967 4988 4992 N
+ Y AH AA i n/a 39 4967 4988 4990 N
+ Y AH AE b n/a 39 4967 4988 4991 N
+ Y AH AH b n/a 39 4967 4988 4992 N
+ Y AH AH i n/a 39 4967 4988 4990 N
+ Y AH AO b n/a 39 4967 4982 4993 N
+ Y AH AO i n/a 39 4967 4982 4993 N
+ Y AH AW b n/a 39 4967 4988 4992 N
+ Y AH AY b n/a 39 4967 4988 4991 N
+ Y AH AY i n/a 39 4967 4988 4990 N
+ Y AH EH b n/a 39 4967 4988 4991 N
+ Y AH EH i n/a 39 4967 4988 4990 N
+ Y AH ER b n/a 39 4967 4980 5002 N
+ Y AH EY b n/a 39 4967 4988 4991 N
+ Y AH EY i n/a 39 4967 4988 4990 N
+ Y AH G b n/a 39 4967 4988 4991 N
+ Y AH IH b n/a 39 4967 4980 4998 N
+ Y AH IY b n/a 39 4967 4980 4998 N
+ Y AH JH b n/a 39 4967 4988 4991 N
+ Y AH K b n/a 39 4967 4988 4991 N
+ Y AH M b n/a 39 4967 4988 4991 N
+ Y AH N i n/a 39 4967 4988 4990 N
+ Y AH OW b n/a 39 4967 4981 4999 N
+ Y AH OY b n/a 39 4967 4980 4999 N
+ Y AH P b n/a 39 4967 4988 4991 N
+ Y AH UH b n/a 39 4967 4982 5001 N
+ Y AH UH i n/a 39 4967 4982 5001 N
+ Y AH UW b n/a 39 4967 4981 4997 N
+ Y AH UW i n/a 39 4967 4981 4997 N
+ Y AH W b n/a 39 4967 4982 4999 N
+ Y AO AA b n/a 39 4963 4988 4992 N
+ Y AO AA e n/a 39 4963 4988 4990 N
+ Y AO AE b n/a 39 4963 4988 4991 N
+ Y AO AE e n/a 39 4963 4988 4990 N
+ Y AO AH b n/a 39 4963 4988 4992 N
+ Y AO AH e n/a 39 4963 4988 4990 N
+ Y AO AO b n/a 39 4963 4982 4993 N
+ Y AO AO e n/a 39 4963 4982 4993 N
+ Y AO AW b n/a 39 4963 4988 4992 N
+ Y AO AW e n/a 39 4963 4988 4990 N
+ Y AO AY b n/a 39 4963 4988 4991 N
+ Y AO AY e n/a 39 4963 4988 4990 N
+ Y AO B e n/a 39 4963 4988 4990 N
+ Y AO CH e n/a 39 4963 4988 4990 N
+ Y AO D e n/a 39 4963 4988 4990 N
+ Y AO DH e n/a 39 4963 4988 4990 N
+ Y AO EH b n/a 39 4963 4988 4991 N
+ Y AO EH e n/a 39 4963 4988 4990 N
+ Y AO ER b n/a 39 4963 4980 5002 N
+ Y AO ER e n/a 39 4963 4980 5002 N
+ Y AO ER i n/a 39 4964 4982 5002 N
+ Y AO EY b n/a 39 4963 4988 4991 N
+ Y AO EY e n/a 39 4963 4988 4990 N
+ Y AO F e n/a 39 4963 4988 4990 N
+ Y AO G b n/a 39 4963 4988 4991 N
+ Y AO G e n/a 39 4963 4988 4990 N
+ Y AO HH e n/a 39 4963 4988 4990 N
+ Y AO IH b n/a 39 4963 4980 4998 N
+ Y AO IH e n/a 39 4963 4980 4990 N
+ Y AO IY b n/a 39 4963 4980 4998 N
+ Y AO IY e n/a 39 4963 4980 4990 N
+ Y AO JH b n/a 39 4963 4988 4991 N
+ Y AO JH e n/a 39 4963 4988 4990 N
+ Y AO K b n/a 39 4963 4988 4991 N
+ Y AO K e n/a 39 4963 4988 4990 N
+ Y AO L e n/a 39 4963 4988 4990 N
+ Y AO M b n/a 39 4963 4988 4991 N
+ Y AO M e n/a 39 4963 4988 4990 N
+ Y AO N e n/a 39 4963 4988 4990 N
+ Y AO NG e n/a 39 4963 4988 4990 N
+ Y AO OW b n/a 39 4963 4979 4999 N
+ Y AO OW e n/a 39 4963 4979 4999 N
+ Y AO OY b n/a 39 4963 4980 4999 N
+ Y AO OY e n/a 39 4963 4980 4999 N
+ Y AO P b n/a 39 4963 4988 4991 N
+ Y AO P e n/a 39 4963 4988 4990 N
+ Y AO R e n/a 39 4963 4988 4990 N
+ Y AO S e n/a 39 4963 4988 4990 N
+ Y AO SH e n/a 39 4963 4988 4990 N
+ Y AO SIL e n/a 39 4963 4988 4990 N
+ Y AO T e n/a 39 4963 4988 4990 N
+ Y AO TH e n/a 39 4963 4988 4990 N
+ Y AO UH b n/a 39 4963 4982 5001 N
+ Y AO UH e n/a 39 4963 4982 5001 N
+ Y AO UW b n/a 39 4963 4979 4997 N
+ Y AO UW e n/a 39 4963 4979 4997 N
+ Y AO UW i n/a 39 4964 4979 4997 N
+ Y AO V e n/a 39 4963 4988 4990 N
+ Y AO W b n/a 39 4963 4982 4999 N
+ Y AO W e n/a 39 4963 4982 4999 N
+ Y AO Y e n/a 39 4963 4982 4990 N
+ Y AO Z e n/a 39 4963 4988 4990 N
+ Y AO Z i n/a 39 4964 4988 4990 N
+ Y AO ZH e n/a 39 4963 4988 4990 N
+ Y AW AA b n/a 39 4963 4988 4992 N
+ Y AW AA i n/a 39 4963 4988 4990 N
+ Y AW AE b n/a 39 4963 4988 4991 N
+ Y AW AH b n/a 39 4963 4988 4992 N
+ Y AW AO b n/a 39 4963 4982 4993 N
+ Y AW AW b n/a 39 4963 4988 4992 N
+ Y AW AY b n/a 39 4963 4988 4991 N
+ Y AW EH b n/a 39 4963 4988 4991 N
+ Y AW ER b n/a 39 4963 4980 5002 N
+ Y AW EY b n/a 39 4963 4988 4991 N
+ Y AW G b n/a 39 4963 4988 4991 N
+ Y AW IH b n/a 39 4963 4980 4998 N
+ Y AW IY b n/a 39 4963 4980 4998 N
+ Y AW JH b n/a 39 4963 4988 4991 N
+ Y AW K b n/a 39 4963 4988 4991 N
+ Y AW M b n/a 39 4963 4988 4991 N
+ Y AW OW b n/a 39 4963 4979 4999 N
+ Y AW OW i n/a 39 4963 4979 4999 N
+ Y AW OY b n/a 39 4963 4980 4999 N
+ Y AW P b n/a 39 4963 4988 4991 N
+ Y AW UH b n/a 39 4963 4982 5001 N
+ Y AW UW b n/a 39 4963 4979 4997 N
+ Y AW UW i n/a 39 4963 4979 4997 N
+ Y AW W b n/a 39 4963 4982 4999 N
+ Y AY AA b n/a 39 4967 4988 4992 N
+ Y AY AE b n/a 39 4967 4988 4991 N
+ Y AY AE i n/a 39 4967 4988 4990 N
+ Y AY AH b n/a 39 4967 4988 4992 N
+ Y AY AH i n/a 39 4967 4988 4990 N
+ Y AY AO b n/a 39 4965 4982 4993 N
+ Y AY AO i n/a 39 4965 4982 4993 N
+ Y AY AW b n/a 39 4967 4988 4992 N
+ Y AY AY b n/a 39 4967 4988 4991 N
+ Y AY EH b n/a 39 4967 4988 4991 N
+ Y AY EH i n/a 39 4967 4988 4990 N
+ Y AY ER b n/a 39 4965 4980 5002 N
+ Y AY EY b n/a 39 4967 4988 4991 N
+ Y AY G b n/a 39 4967 4988 4991 N
+ Y AY IH b n/a 39 4967 4980 4998 N
+ Y AY IY b n/a 39 4967 4980 4998 N
+ Y AY IY i n/a 39 4967 4980 4990 N
+ Y AY JH b n/a 39 4967 4988 4991 N
+ Y AY K b n/a 39 4967 4988 4991 N
+ Y AY M b n/a 39 4967 4988 4991 N
+ Y AY OW b n/a 39 4965 4981 4999 N
+ Y AY OW i n/a 39 4965 4981 4999 N
+ Y AY OY b n/a 39 4965 4980 4999 N
+ Y AY P b n/a 39 4967 4988 4991 N
+ Y AY UH b n/a 39 4965 4982 5001 N
+ Y AY UW b n/a 39 4965 4981 4997 N
+ Y AY UW i n/a 39 4965 4981 4997 N
+ Y AY W b n/a 39 4965 4982 4999 N
+ Y B AA b n/a 39 4961 4988 4992 N
+ Y B AA e n/a 39 4961 4988 4997 N
+ Y B AA i n/a 39 4961 4988 4997 N
+ Y B AE b n/a 39 4961 4988 4991 N
+ Y B AE e n/a 39 4961 4988 4998 N
+ Y B AH b n/a 39 4961 4988 4992 N
+ Y B AH e n/a 39 4961 4988 4999 N
+ Y B AH i n/a 39 4961 4988 4999 N
+ Y B AO b n/a 39 4961 4983 4993 N
+ Y B AO e n/a 39 4961 4983 4993 N
+ Y B AO i n/a 39 4961 4983 4993 N
+ Y B AW b n/a 39 4961 4988 4992 N
+ Y B AW e n/a 39 4961 4988 4999 N
+ Y B AY b n/a 39 4961 4988 4991 N
+ Y B AY e n/a 39 4961 4988 4999 N
+ Y B B e n/a 39 4961 4988 4999 N
+ Y B CH e n/a 39 4961 4988 4999 N
+ Y B D e n/a 39 4961 4988 4999 N
+ Y B DH e n/a 39 4961 4988 4999 N
+ Y B EH b n/a 39 4961 4988 4991 N
+ Y B EH e n/a 39 4961 4988 4999 N
+ Y B EH i n/a 39 4961 4988 4999 N
+ Y B ER b n/a 39 4961 4980 5002 N
+ Y B ER e n/a 39 4961 4980 5002 N
+ Y B ER i n/a 39 4961 4983 5002 N
+ Y B EY b n/a 39 4961 4988 4991 N
+ Y B EY e n/a 39 4961 4988 4998 N
+ Y B F e n/a 39 4961 4988 4999 N
+ Y B G b n/a 39 4961 4988 4991 N
+ Y B G e n/a 39 4961 4988 4999 N
+ Y B HH e n/a 39 4961 4988 4999 N
+ Y B IH b n/a 39 4961 4980 4998 N
+ Y B IH e n/a 39 4961 4980 4998 N
+ Y B IY b n/a 39 4961 4980 4998 N
+ Y B IY e n/a 39 4961 4980 4998 N
+ Y B JH b n/a 39 4961 4988 4991 N
+ Y B JH e n/a 39 4961 4988 4999 N
+ Y B K b n/a 39 4961 4988 4991 N
+ Y B K e n/a 39 4961 4988 4999 N
+ Y B L e n/a 39 4961 4988 4999 N
+ Y B M b n/a 39 4961 4988 4991 N
+ Y B M e n/a 39 4961 4988 4999 N
+ Y B N e n/a 39 4961 4988 4999 N
+ Y B NG e n/a 39 4961 4988 4999 N
+ Y B OW b n/a 39 4961 4981 4999 N
+ Y B OW e n/a 39 4961 4981 4999 N
+ Y B OY b n/a 39 4961 4980 4999 N
+ Y B OY e n/a 39 4961 4980 4999 N
+ Y B P b n/a 39 4961 4988 4991 N
+ Y B P e n/a 39 4961 4988 4999 N
+ Y B R e n/a 39 4961 4988 4999 N
+ Y B S e n/a 39 4961 4988 4999 N
+ Y B SH e n/a 39 4961 4988 4999 N
+ Y B SIL e n/a 39 4961 4988 4999 N
+ Y B T e n/a 39 4961 4988 4999 N
+ Y B TH e n/a 39 4961 4988 4999 N
+ Y B UH b n/a 39 4961 4983 5001 N
+ Y B UH e n/a 39 4961 4983 5001 N
+ Y B UH i n/a 39 4961 4983 5001 N
+ Y B UW b n/a 39 4961 4981 4997 N
+ Y B UW e n/a 39 4961 4981 4997 N
+ Y B UW i n/a 39 4961 4981 4997 N
+ Y B V e n/a 39 4961 4988 4999 N
+ Y B W b n/a 39 4961 4983 4999 N
+ Y B W e n/a 39 4961 4983 4999 N
+ Y B Y e n/a 39 4961 4983 5002 N
+ Y B Z e n/a 39 4961 4988 4999 N
+ Y B ZH e n/a 39 4961 4988 4999 N
+ Y CH AA b n/a 39 4955 4977 4992 N
+ Y CH AA i n/a 39 4955 4973 4995 N
+ Y CH AE b n/a 39 4955 4977 4991 N
+ Y CH AH b n/a 39 4955 4977 4992 N
+ Y CH AO b n/a 39 4955 4973 4993 N
+ Y CH AW b n/a 39 4955 4974 4992 N
+ Y CH AY b n/a 39 4955 4977 4991 N
+ Y CH EH b n/a 39 4955 4977 4991 N
+ Y CH ER b n/a 39 4955 4972 5002 N
+ Y CH ER i n/a 39 4955 4972 5002 N
+ Y CH EY b n/a 39 4955 4977 4991 N
+ Y CH G b n/a 39 4955 4977 4991 N
+ Y CH IH b n/a 39 4955 4974 4998 N
+ Y CH IY b n/a 39 4955 4974 4998 N
+ Y CH JH b n/a 39 4955 4977 4991 N
+ Y CH K b n/a 39 4955 4977 4991 N
+ Y CH M b n/a 39 4955 4977 4991 N
+ Y CH OW b n/a 39 4955 4974 4999 N
+ Y CH OY b n/a 39 4955 4978 4999 N
+ Y CH P b n/a 39 4955 4977 4991 N
+ Y CH UH b n/a 39 4955 4973 5000 N
+ Y CH UW b n/a 39 4955 4974 4994 N
+ Y CH UW i n/a 39 4955 4974 4994 N
+ Y CH W b n/a 39 4955 4973 4999 N
+ Y D AA b n/a 39 4959 4988 4992 N
+ Y D AA i n/a 39 4958 4988 4995 N
+ Y D AE b n/a 39 4960 4988 4991 N
+ Y D AH b n/a 39 4960 4988 4992 N
+ Y D AH i n/a 39 4960 4988 4999 N
+ Y D AO b n/a 39 4959 4983 4993 N
+ Y D AO i n/a 39 4958 4983 4993 N
+ Y D AW b n/a 39 4960 4988 4992 N
+ Y D AY b n/a 39 4959 4988 4991 N
+ Y D AY i n/a 39 4958 4988 4999 N
+ Y D EH b n/a 39 4960 4988 4991 N
+ Y D EH i n/a 39 4960 4988 4999 N
+ Y D ER b n/a 39 4959 4980 5002 N
+ Y D ER i n/a 39 4958 4983 5002 N
+ Y D EY b n/a 39 4960 4988 4991 N
+ Y D G b n/a 39 4960 4988 4991 N
+ Y D IH b n/a 39 4960 4976 4998 N
+ Y D IH i n/a 39 4960 4972 4998 N
+ Y D IY b n/a 39 4960 4976 4998 N
+ Y D IY i n/a 39 4960 4976 4998 N
+ Y D JH b n/a 39 4960 4988 4991 N
+ Y D K b n/a 39 4960 4988 4991 N
+ Y D M b n/a 39 4960 4988 4991 N
+ Y D OW b n/a 39 4959 4981 4999 N
+ Y D OW i n/a 39 4958 4981 4999 N
+ Y D OY b n/a 39 4959 4980 4999 N
+ Y D P b n/a 39 4960 4988 4991 N
+ Y D UH b n/a 39 4959 4972 5001 N
+ Y D UH i n/a 39 4958 4972 5001 N
+ Y D UW b n/a 39 4959 4975 4994 N
+ Y D UW i n/a 39 4958 4974 4994 N
+ Y D W b n/a 39 4959 4983 4999 N
+ Y DH AA b n/a 39 4958 4988 4992 N
+ Y DH AE b n/a 39 4958 4988 4991 N
+ Y DH AH b n/a 39 4958 4988 4992 N
+ Y DH AO b n/a 39 4958 4983 4993 N
+ Y DH AW b n/a 39 4958 4988 4992 N
+ Y DH AY b n/a 39 4958 4988 4991 N
+ Y DH EH b n/a 39 4958 4988 4991 N
+ Y DH ER b n/a 39 4958 4980 5002 N
+ Y DH ER i n/a 39 4958 4983 5002 N
+ Y DH EY b n/a 39 4958 4988 4991 N
+ Y DH G b n/a 39 4958 4988 4991 N
+ Y DH IH b n/a 39 4958 4976 4998 N
+ Y DH IY b n/a 39 4958 4976 4998 N
+ Y DH JH b n/a 39 4958 4988 4991 N
+ Y DH K b n/a 39 4958 4988 4991 N
+ Y DH M b n/a 39 4958 4988 4991 N
+ Y DH OW b n/a 39 4958 4981 4999 N
+ Y DH OY b n/a 39 4958 4980 4999 N
+ Y DH P b n/a 39 4958 4988 4991 N
+ Y DH UH b n/a 39 4958 4972 5001 N
+ Y DH UW b n/a 39 4958 4976 4997 N
+ Y DH UW i n/a 39 4958 4976 4997 N
+ Y DH W b n/a 39 4958 4983 4999 N
+ Y EH AA b n/a 39 4967 4988 4992 N
+ Y EH AE b n/a 39 4967 4988 4991 N
+ Y EH AH b n/a 39 4967 4988 4992 N
+ Y EH AH i n/a 39 4967 4988 4990 N
+ Y EH AO b n/a 39 4967 4982 4993 N
+ Y EH AW b n/a 39 4967 4988 4992 N
+ Y EH AY b n/a 39 4967 4988 4991 N
+ Y EH EH b n/a 39 4967 4988 4991 N
+ Y EH EH i n/a 39 4967 4988 4990 N
+ Y EH ER b n/a 39 4967 4980 5002 N
+ Y EH EY b n/a 39 4967 4988 4991 N
+ Y EH G b n/a 39 4967 4988 4991 N
+ Y EH IH b n/a 39 4967 4980 4998 N
+ Y EH IY b n/a 39 4967 4980 4998 N
+ Y EH JH b n/a 39 4967 4988 4991 N
+ Y EH K b n/a 39 4967 4988 4991 N
+ Y EH M b n/a 39 4967 4988 4991 N
+ Y EH OW b n/a 39 4967 4981 4999 N
+ Y EH OY b n/a 39 4967 4980 4999 N
+ Y EH OY i n/a 39 4967 4980 4999 N
+ Y EH P b n/a 39 4967 4988 4991 N
+ Y EH UH b n/a 39 4967 4982 5001 N
+ Y EH UH i n/a 39 4967 4982 5001 N
+ Y EH UW b n/a 39 4967 4981 4997 N
+ Y EH W b n/a 39 4967 4982 4999 N
+ Y ER AA b n/a 39 4965 4988 4992 N
+ Y ER AA i n/a 39 4964 4988 4990 N
+ Y ER AE b n/a 39 4965 4988 4991 N
+ Y ER AE i n/a 39 4964 4988 4990 N
+ Y ER AH b n/a 39 4965 4988 4992 N
+ Y ER AH i n/a 39 4964 4988 4990 N
+ Y ER AO b n/a 39 4965 4982 4993 N
+ Y ER AO i n/a 39 4964 4982 4993 N
+ Y ER AW b n/a 39 4965 4988 4992 N
+ Y ER AY b n/a 39 4965 4988 4991 N
+ Y ER EH b n/a 39 4965 4988 4991 N
+ Y ER ER b n/a 39 4965 4980 5002 N
+ Y ER EY b n/a 39 4965 4988 4991 N
+ Y ER G b n/a 39 4965 4988 4991 N
+ Y ER IH b n/a 39 4965 4980 4998 N
+ Y ER IH i n/a 39 4964 4982 4990 N
+ Y ER IY b n/a 39 4965 4980 4998 N
+ Y ER JH b n/a 39 4965 4988 4991 N
+ Y ER K b n/a 39 4965 4988 4991 N
+ Y ER M b n/a 39 4965 4988 4991 N
+ Y ER OW b n/a 39 4965 4979 4999 N
+ Y ER OY b n/a 39 4965 4980 4999 N
+ Y ER P b n/a 39 4965 4988 4991 N
+ Y ER UH b n/a 39 4965 4982 5001 N
+ Y ER UW b n/a 39 4965 4979 4997 N
+ Y ER UW i n/a 39 4964 4979 4997 N
+ Y ER W b n/a 39 4965 4982 4999 N
+ Y EY AA b n/a 39 4967 4988 4992 N
+ Y EY AA i n/a 39 4967 4988 4990 N
+ Y EY AE b n/a 39 4967 4988 4991 N
+ Y EY AH b n/a 39 4967 4988 4992 N
+ Y EY AH i n/a 39 4967 4988 4990 N
+ Y EY AO b n/a 39 4967 4982 4993 N
+ Y EY AW b n/a 39 4967 4988 4992 N
+ Y EY AY b n/a 39 4967 4988 4991 N
+ Y EY EH b n/a 39 4967 4988 4991 N
+ Y EY ER b n/a 39 4967 4980 5002 N
+ Y EY EY b n/a 39 4967 4988 4991 N
+ Y EY EY i n/a 39 4967 4988 4990 N
+ Y EY G b n/a 39 4967 4988 4991 N
+ Y EY IH b n/a 39 4967 4980 4998 N
+ Y EY IH i n/a 39 4967 4982 4990 N
+ Y EY IY b n/a 39 4967 4980 4998 N
+ Y EY IY i n/a 39 4967 4980 4990 N
+ Y EY JH b n/a 39 4967 4988 4991 N
+ Y EY K b n/a 39 4967 4988 4991 N
+ Y EY M b n/a 39 4967 4988 4991 N
+ Y EY OW b n/a 39 4967 4981 4999 N
+ Y EY OW i n/a 39 4967 4981 4999 N
+ Y EY OY b n/a 39 4967 4980 4999 N
+ Y EY P b n/a 39 4967 4988 4991 N
+ Y EY S i n/a 39 4967 4988 4990 N
+ Y EY UH b n/a 39 4967 4982 5001 N
+ Y EY UW b n/a 39 4967 4981 4997 N
+ Y EY UW i n/a 39 4967 4981 4997 N
+ Y EY W b n/a 39 4967 4982 4999 N
+ Y F AA b n/a 39 4954 4977 4992 N
+ Y F AA i n/a 39 4954 4972 4992 N
+ Y F AE b n/a 39 4954 4977 4991 N
+ Y F AE i n/a 39 4954 4973 4992 N
+ Y F AH b n/a 39 4954 4977 4992 N
+ Y F AH i n/a 39 4954 4973 4992 N
+ Y F AO b n/a 39 4954 4972 4993 N
+ Y F AO i n/a 39 4954 4972 4993 N
+ Y F AW b n/a 39 4954 4974 4992 N
+ Y F AY b n/a 39 4954 4977 4991 N
+ Y F EH b n/a 39 4954 4977 4991 N
+ Y F EH i n/a 39 4954 4973 4992 N
+ Y F ER b n/a 39 4954 4972 5002 N
+ Y F ER i n/a 39 4954 4972 5002 N
+ Y F EY b n/a 39 4954 4977 4991 N
+ Y F G b n/a 39 4954 4977 4991 N
+ Y F IH b n/a 39 4954 4974 4998 N
+ Y F IY b n/a 39 4954 4974 4998 N
+ Y F JH b n/a 39 4954 4977 4991 N
+ Y F K b n/a 39 4954 4977 4991 N
+ Y F M b n/a 39 4954 4977 4991 N
+ Y F OW b n/a 39 4954 4974 4999 N
+ Y F OW i n/a 39 4954 4974 4999 N
+ Y F OY b n/a 39 4954 4978 4999 N
+ Y F P b n/a 39 4954 4977 4991 N
+ Y F UH b n/a 39 4954 4972 5000 N
+ Y F UH i n/a 39 4954 4972 5000 N
+ Y F UW b n/a 39 4954 4974 4995 N
+ Y F UW i n/a 39 4954 4974 4994 N
+ Y F W b n/a 39 4954 4972 4999 N
+ Y G AA b n/a 39 4960 4988 4992 N
+ Y G AA i n/a 39 4960 4988 4997 N
+ Y G AE b n/a 39 4960 4988 4991 N
+ Y G AH b n/a 39 4960 4988 4992 N
+ Y G AH i n/a 39 4960 4988 4999 N
+ Y G AO b n/a 39 4960 4983 4993 N
+ Y G AW b n/a 39 4960 4988 4992 N
+ Y G AY b n/a 39 4960 4988 4991 N
+ Y G EH b n/a 39 4960 4988 4991 N
+ Y G ER b n/a 39 4960 4980 5002 N
+ Y G ER i n/a 39 4960 4983 5002 N
+ Y G EY b n/a 39 4960 4988 4991 N
+ Y G G b n/a 39 4960 4988 4991 N
+ Y G IH b n/a 39 4960 4980 4998 N
+ Y G IY b n/a 39 4960 4980 4998 N
+ Y G IY i n/a 39 4960 4980 4998 N
+ Y G JH b n/a 39 4960 4988 4991 N
+ Y G K b n/a 39 4960 4988 4991 N
+ Y G M b n/a 39 4960 4988 4991 N
+ Y G OW b n/a 39 4960 4981 4999 N
+ Y G OW i n/a 39 4960 4981 4999 N
+ Y G OY b n/a 39 4960 4980 4999 N
+ Y G P b n/a 39 4960 4988 4991 N
+ Y G UH b n/a 39 4960 4983 5001 N
+ Y G UH i n/a 39 4960 4983 5001 N
+ Y G UW b n/a 39 4960 4981 4997 N
+ Y G UW i n/a 39 4960 4981 4997 N
+ Y G W b n/a 39 4960 4983 4999 N
+ Y HH AA b n/a 39 4955 4977 4992 N
+ Y HH AA i n/a 39 4955 4973 4990 N
+ Y HH AE b n/a 39 4955 4977 4991 N
+ Y HH AH b n/a 39 4955 4977 4992 N
+ Y HH AH i n/a 39 4955 4972 4990 N
+ Y HH AO b n/a 39 4955 4973 4993 N
+ Y HH AW b n/a 39 4955 4974 4992 N
+ Y HH AY b n/a 39 4955 4977 4991 N
+ Y HH EH b n/a 39 4955 4977 4991 N
+ Y HH EH i n/a 39 4955 4972 4990 N
+ Y HH ER b n/a 39 4955 4972 5002 N
+ Y HH ER i n/a 39 4955 4972 5002 N
+ Y HH EY b n/a 39 4955 4977 4991 N
+ Y HH G b n/a 39 4955 4977 4991 N
+ Y HH IH b n/a 39 4955 4974 4998 N
+ Y HH IY b n/a 39 4955 4974 4998 N
+ Y HH JH b n/a 39 4955 4977 4991 N
+ Y HH K b n/a 39 4955 4977 4991 N
+ Y HH M b n/a 39 4955 4977 4991 N
+ Y HH OW b n/a 39 4955 4974 4999 N
+ Y HH OW i n/a 39 4955 4974 4999 N
+ Y HH OY b n/a 39 4955 4978 4999 N
+ Y HH P b n/a 39 4955 4977 4991 N
+ Y HH UH b n/a 39 4955 4973 5000 N
+ Y HH UH i n/a 39 4955 4973 5000 N
+ Y HH UW b n/a 39 4955 4974 4994 N
+ Y HH UW i n/a 39 4955 4974 4994 N
+ Y HH W b n/a 39 4955 4973 4999 N
+ Y IH AA b n/a 39 4968 4988 4992 N
+ Y IH AA i n/a 39 4968 4988 4990 N
+ Y IH AE b n/a 39 4968 4988 4991 N
+ Y IH AE i n/a 39 4968 4988 4990 N
+ Y IH AH b n/a 39 4968 4988 4992 N
+ Y IH AH i n/a 39 4968 4988 4990 N
+ Y IH AO b n/a 39 4968 4982 4993 N
+ Y IH AO i n/a 39 4968 4982 4993 N
+ Y IH AW b n/a 39 4968 4988 4992 N
+ Y IH AY b n/a 39 4968 4988 4991 N
+ Y IH EH b n/a 39 4968 4988 4991 N
+ Y IH EH i n/a 39 4968 4988 4990 N
+ Y IH ER b n/a 39 4968 4980 5002 N
+ Y IH EY b n/a 39 4968 4988 4991 N
+ Y IH G b n/a 39 4968 4988 4991 N
+ Y IH IH b n/a 39 4968 4980 4998 N
+ Y IH IY b n/a 39 4968 4980 4998 N
+ Y IH JH b n/a 39 4968 4988 4991 N
+ Y IH K b n/a 39 4968 4988 4991 N
+ Y IH M b n/a 39 4968 4988 4991 N
+ Y IH N i n/a 39 4968 4988 4990 N
+ Y IH OW b n/a 39 4968 4981 4999 N
+ Y IH OW i n/a 39 4968 4981 4999 N
+ Y IH OY b n/a 39 4968 4980 4999 N
+ Y IH P b n/a 39 4968 4988 4991 N
+ Y IH UH b n/a 39 4968 4982 5001 N
+ Y IH UW b n/a 39 4968 4981 4997 N
+ Y IH UW i n/a 39 4968 4981 4997 N
+ Y IH W b n/a 39 4968 4982 4999 N
+ Y IH Y i n/a 39 4968 4982 4990 N
+ Y IY AA b n/a 39 4968 4988 4992 N
+ Y IY AA i n/a 39 4968 4988 4990 N
+ Y IY AE b n/a 39 4968 4988 4991 N
+ Y IY AH b n/a 39 4968 4988 4992 N
+ Y IY AH i n/a 39 4968 4988 4990 N
+ Y IY AO b n/a 39 4968 4982 4993 N
+ Y IY AW b n/a 39 4968 4988 4992 N
+ Y IY AY b n/a 39 4968 4988 4991 N
+ Y IY EH b n/a 39 4968 4988 4991 N
+ Y IY EH i n/a 39 4968 4988 4990 N
+ Y IY ER b n/a 39 4968 4980 5002 N
+ Y IY EY b n/a 39 4968 4988 4991 N
+ Y IY G b n/a 39 4968 4988 4991 N
+ Y IY IH b n/a 39 4968 4980 4998 N
+ Y IY IH i n/a 39 4968 4982 4990 N
+ Y IY IY b n/a 39 4968 4980 4998 N
+ Y IY IY i n/a 39 4968 4980 4990 N
+ Y IY JH b n/a 39 4968 4988 4991 N
+ Y IY K b n/a 39 4968 4988 4991 N
+ Y IY M b n/a 39 4968 4988 4991 N
+ Y IY OW b n/a 39 4968 4981 4999 N
+ Y IY OW i n/a 39 4968 4981 4999 N
+ Y IY OY b n/a 39 4968 4980 4999 N
+ Y IY P b n/a 39 4968 4988 4991 N
+ Y IY UH b n/a 39 4968 4982 5001 N
+ Y IY UW b n/a 39 4968 4981 4997 N
+ Y IY UW i n/a 39 4968 4981 4997 N
+ Y IY W b n/a 39 4968 4982 4999 N
+ Y JH AA b n/a 39 4958 4988 4992 N
+ Y JH AA i n/a 39 4958 4988 4997 N
+ Y JH AE b n/a 39 4958 4988 4991 N
+ Y JH AE i n/a 39 4958 4988 4998 N
+ Y JH AH b n/a 39 4958 4988 4992 N
+ Y JH AH i n/a 39 4958 4988 4999 N
+ Y JH AO b n/a 39 4958 4983 4993 N
+ Y JH AW b n/a 39 4958 4988 4992 N
+ Y JH AY b n/a 39 4958 4988 4991 N
+ Y JH EH b n/a 39 4958 4988 4991 N
+ Y JH ER b n/a 39 4958 4980 5002 N
+ Y JH ER i n/a 39 4958 4983 5002 N
+ Y JH EY b n/a 39 4958 4988 4991 N
+ Y JH G b n/a 39 4958 4988 4991 N
+ Y JH IH b n/a 39 4958 4980 4998 N
+ Y JH IY b n/a 39 4958 4980 4998 N
+ Y JH JH b n/a 39 4958 4988 4991 N
+ Y JH K b n/a 39 4958 4988 4991 N
+ Y JH M b n/a 39 4958 4988 4991 N
+ Y JH OW b n/a 39 4958 4981 4999 N
+ Y JH OW i n/a 39 4958 4981 4999 N
+ Y JH OY b n/a 39 4958 4980 4999 N
+ Y JH P b n/a 39 4958 4988 4991 N
+ Y JH UH b n/a 39 4958 4983 5001 N
+ Y JH UW b n/a 39 4958 4981 4997 N
+ Y JH UW i n/a 39 4958 4981 4997 N
+ Y JH W b n/a 39 4958 4983 4999 N
+ Y K AA b n/a 39 4957 4977 4992 N
+ Y K AA e n/a 39 4957 4977 4994 N
+ Y K AA i n/a 39 4957 4973 4995 N
+ Y K AE b n/a 39 4957 4977 4991 N
+ Y K AE e n/a 39 4957 4977 4998 N
+ Y K AH b n/a 39 4957 4977 4992 N
+ Y K AH e n/a 39 4957 4977 4999 N
+ Y K AH i n/a 39 4957 4973 4999 N
+ Y K AO b n/a 39 4957 4973 4993 N
+ Y K AO e n/a 39 4957 4973 4993 N
+ Y K AO i n/a 39 4957 4973 4993 N
+ Y K AW b n/a 39 4957 4974 4992 N
+ Y K AW e n/a 39 4957 4974 4999 N
+ Y K AY b n/a 39 4957 4977 4991 N
+ Y K AY e n/a 39 4957 4977 4999 N
+ Y K B e n/a 39 4957 4977 4999 N
+ Y K CH e n/a 39 4957 4977 4999 N
+ Y K D e n/a 39 4957 4977 4999 N
+ Y K DH e n/a 39 4957 4977 4999 N
+ Y K EH b n/a 39 4957 4977 4991 N
+ Y K EH e n/a 39 4957 4977 4999 N
+ Y K EH i n/a 39 4957 4973 4999 N
+ Y K ER b n/a 39 4957 4973 5002 N
+ Y K ER e n/a 39 4957 4973 5002 N
+ Y K ER i n/a 39 4956 4973 5001 N
+ Y K EY b n/a 39 4957 4977 4991 N
+ Y K EY e n/a 39 4957 4977 4998 N
+ Y K F e n/a 39 4957 4977 4999 N
+ Y K G b n/a 39 4957 4977 4991 N
+ Y K G e n/a 39 4957 4977 4999 N
+ Y K HH e n/a 39 4957 4977 4999 N
+ Y K IH b n/a 39 4957 4974 4998 N
+ Y K IH e n/a 39 4957 4974 4998 N
+ Y K IH i n/a 39 4956 4973 4998 N
+ Y K IY b n/a 39 4957 4974 4998 N
+ Y K IY e n/a 39 4957 4974 4998 N
+ Y K JH b n/a 39 4957 4977 4991 N
+ Y K JH e n/a 39 4957 4977 4999 N
+ Y K K b n/a 39 4957 4977 4991 N
+ Y K K e n/a 39 4957 4977 4999 N
+ Y K L e n/a 39 4957 4977 4999 N
+ Y K M b n/a 39 4957 4977 4991 N
+ Y K M e n/a 39 4957 4977 4999 N
+ Y K N e n/a 39 4957 4977 4999 N
+ Y K NG e n/a 39 4957 4977 4999 N
+ Y K OW b n/a 39 4957 4974 4999 N
+ Y K OW e n/a 39 4957 4974 4999 N
+ Y K OW i n/a 39 4957 4974 4999 N
+ Y K OY b n/a 39 4957 4978 4999 N
+ Y K OY e n/a 39 4957 4978 4999 N
+ Y K P b n/a 39 4957 4977 4991 N
+ Y K P e n/a 39 4957 4977 4999 N
+ Y K R e n/a 39 4957 4977 4999 N
+ Y K R i n/a 39 4956 4973 4999 N
+ Y K S e n/a 39 4957 4977 4999 N
+ Y K SH e n/a 39 4957 4977 4999 N
+ Y K SIL e n/a 39 4957 4977 4999 N
+ Y K T e n/a 39 4957 4977 4999 N
+ Y K TH e n/a 39 4957 4977 4999 N
+ Y K UH b n/a 39 4957 4973 5000 N
+ Y K UH e n/a 39 4957 4973 5000 N
+ Y K UH i n/a 39 4956 4973 5000 N
+ Y K UW b n/a 39 4957 4974 4994 N
+ Y K UW e n/a 39 4957 4974 4994 N
+ Y K UW i n/a 39 4957 4974 4994 N
+ Y K V e n/a 39 4957 4977 4999 N
+ Y K W b n/a 39 4957 4973 4999 N
+ Y K W e n/a 39 4957 4973 4999 N
+ Y K Y e n/a 39 4957 4974 5000 N
+ Y K Z e n/a 39 4957 4977 4999 N
+ Y K ZH e n/a 39 4957 4977 4999 N
+ Y L AA b n/a 39 4963 4989 4992 N
+ Y L AA i n/a 39 4964 4989 4990 N
+ Y L AE b n/a 39 4963 4989 4991 N
+ Y L AE i n/a 39 4964 4989 4990 N
+ Y L AH b n/a 39 4963 4988 4992 N
+ Y L AH i n/a 39 4964 4989 4990 N
+ Y L AO b n/a 39 4963 4989 4993 N
+ Y L AO i n/a 39 4964 4989 4993 N
+ Y L AW b n/a 39 4963 4989 4992 N
+ Y L AW i n/a 39 4964 4989 4990 N
+ Y L AY b n/a 39 4963 4989 4991 N
+ Y L EH b n/a 39 4963 4988 4991 N
+ Y L EH i n/a 39 4964 4989 4990 N
+ Y L ER b n/a 39 4963 4989 5002 N
+ Y L ER i n/a 39 4964 4989 5002 N
+ Y L EY b n/a 39 4963 4989 4991 N
+ Y L EY i n/a 39 4964 4989 4990 N
+ Y L G b n/a 39 4963 4989 4991 N
+ Y L IH b n/a 39 4963 4980 4998 N
+ Y L IH i n/a 39 4964 4982 4990 N
+ Y L IY b n/a 39 4963 4980 4998 N
+ Y L IY i n/a 39 4964 4980 4990 N
+ Y L JH b n/a 39 4963 4989 4991 N
+ Y L K b n/a 39 4963 4989 4991 N
+ Y L M b n/a 39 4963 4989 4991 N
+ Y L OW b n/a 39 4963 4989 4999 N
+ Y L OW i n/a 39 4964 4989 4999 N
+ Y L OY b n/a 39 4963 4989 4999 N
+ Y L P b n/a 39 4963 4989 4991 N
+ Y L UH b n/a 39 4963 4982 5001 N
+ Y L UH i n/a 39 4964 4982 5001 N
+ Y L UW b n/a 39 4963 4979 4997 N
+ Y L UW i n/a 39 4964 4979 4997 N
+ Y L W b n/a 39 4963 4989 4999 N
+ Y L Y i n/a 39 4964 4982 4990 N
+ Y M AA b n/a 39 4969 4984 4992 N
+ Y M AA i n/a 39 4971 4984 4992 N
+ Y M AE b n/a 39 4969 4985 4991 N
+ Y M AE i n/a 39 4971 4984 4992 N
+ Y M AH b n/a 39 4969 4984 4992 N
+ Y M AH i n/a 39 4971 4984 4992 N
+ Y M AO b n/a 39 4969 4984 4993 N
+ Y M AO i n/a 39 4971 4984 4993 N
+ Y M AW b n/a 39 4969 4987 4992 N
+ Y M AY b n/a 39 4969 4987 4991 N
+ Y M EH b n/a 39 4969 4985 4991 N
+ Y M ER b n/a 39 4969 4987 5002 N
+ Y M ER i n/a 39 4971 4987 5002 N
+ Y M EY b n/a 39 4969 4987 4991 N
+ Y M EY i n/a 39 4971 4987 4992 N
+ Y M G b n/a 39 4969 4985 4991 N
+ Y M IH b n/a 39 4969 4985 4998 N
+ Y M IY b n/a 39 4969 4987 4998 N
+ Y M JH b n/a 39 4969 4985 4991 N
+ Y M K b n/a 39 4969 4985 4991 N
+ Y M M b n/a 39 4969 4985 4991 N
+ Y M OW b n/a 39 4969 4987 4999 N
+ Y M OW i n/a 39 4971 4987 4999 N
+ Y M OY b n/a 39 4969 4987 4999 N
+ Y M P b n/a 39 4969 4985 4991 N
+ Y M UH b n/a 39 4969 4984 5001 N
+ Y M UH i n/a 39 4971 4984 5001 N
+ Y M UW b n/a 39 4969 4987 4997 N
+ Y M UW i n/a 39 4971 4987 4996 N
+ Y M W b n/a 39 4969 4984 4999 N
+ Y N AA b n/a 39 4969 4984 4992 N
+ Y N AA e n/a 39 4969 4984 4990 N
+ Y N AA i n/a 39 4970 4984 4990 N
+ Y N AE b n/a 39 4969 4985 4991 N
+ Y N AE e n/a 39 4969 4985 4990 N
+ Y N AE i n/a 39 4970 4985 4990 N
+ Y N AH b n/a 39 4969 4984 4992 N
+ Y N AH e n/a 39 4969 4985 4990 N
+ Y N AH i n/a 39 4970 4985 4990 N
+ Y N AO b n/a 39 4969 4984 4993 N
+ Y N AO e n/a 39 4969 4984 4993 N
+ Y N AO i n/a 39 4970 4984 4993 N
+ Y N AW b n/a 39 4969 4987 4992 N
+ Y N AW e n/a 39 4969 4987 4990 N
+ Y N AY b n/a 39 4969 4987 4991 N
+ Y N AY e n/a 39 4969 4987 4990 N
+ Y N B e n/a 39 4969 4985 4990 N
+ Y N CH e n/a 39 4969 4985 4990 N
+ Y N D e n/a 39 4969 4985 4990 N
+ Y N DH e n/a 39 4969 4985 4990 N
+ Y N EH b n/a 39 4969 4985 4991 N
+ Y N EH e n/a 39 4969 4985 4990 N
+ Y N EH i n/a 39 4970 4985 4990 N
+ Y N ER b n/a 39 4969 4987 5002 N
+ Y N ER e n/a 39 4969 4987 5002 N
+ Y N ER i n/a 39 4970 4986 5002 N
+ Y N EY b n/a 39 4969 4987 4991 N
+ Y N EY e n/a 39 4969 4987 4990 N
+ Y N EY i n/a 39 4970 4986 4990 N
+ Y N F e n/a 39 4969 4985 4990 N
+ Y N G b n/a 39 4969 4985 4991 N
+ Y N G e n/a 39 4969 4985 4990 N
+ Y N HH e n/a 39 4969 4985 4990 N
+ Y N IH b n/a 39 4969 4985 4998 N
+ Y N IH e n/a 39 4969 4985 4990 N
+ Y N IH i n/a 39 4970 4985 4990 N
+ Y N IY b n/a 39 4969 4987 4998 N
+ Y N IY e n/a 39 4969 4987 4990 N
+ Y N IY i n/a 39 4970 4986 4990 N
+ Y N JH b n/a 39 4969 4985 4991 N
+ Y N JH e n/a 39 4969 4985 4990 N
+ Y N K b n/a 39 4969 4985 4991 N
+ Y N K e n/a 39 4969 4985 4990 N
+ Y N L e n/a 39 4969 4984 4990 N
+ Y N M b n/a 39 4969 4985 4991 N
+ Y N M e n/a 39 4969 4985 4990 N
+ Y N N e n/a 39 4969 4985 4990 N
+ Y N NG e n/a 39 4969 4985 4990 N
+ Y N NG i n/a 39 4970 4985 4990 N
+ Y N OW b n/a 39 4969 4987 4999 N
+ Y N OW e n/a 39 4969 4987 4999 N
+ Y N OW i n/a 39 4970 4986 4999 N
+ Y N OY b n/a 39 4969 4987 4999 N
+ Y N OY e n/a 39 4969 4987 4999 N
+ Y N P b n/a 39 4969 4985 4991 N
+ Y N P e n/a 39 4969 4985 4990 N
+ Y N R e n/a 39 4969 4984 4990 N
+ Y N S e n/a 39 4969 4985 4990 N
+ Y N SH e n/a 39 4969 4985 4990 N
+ Y N SIL e n/a 39 4969 4985 4990 N
+ Y N T e n/a 39 4969 4985 4990 N
+ Y N TH e n/a 39 4969 4985 4990 N
+ Y N UH b n/a 39 4969 4984 5001 N
+ Y N UH e n/a 39 4969 4984 5001 N
+ Y N UH i n/a 39 4970 4984 5001 N
+ Y N UW b n/a 39 4969 4987 4997 N
+ Y N UW e n/a 39 4969 4987 4997 N
+ Y N UW i n/a 39 4970 4986 4996 N
+ Y N V e n/a 39 4969 4985 4990 N
+ Y N W b n/a 39 4969 4984 4999 N
+ Y N W e n/a 39 4969 4984 4999 N
+ Y N Y e n/a 39 4969 4985 4990 N
+ Y N Z e n/a 39 4969 4985 4990 N
+ Y N ZH e n/a 39 4969 4985 4990 N
+ Y NG AA b n/a 39 4969 4984 4992 N
+ Y NG AE b n/a 39 4969 4985 4991 N
+ Y NG AE i n/a 39 4970 4985 4990 N
+ Y NG AH b n/a 39 4969 4984 4992 N
+ Y NG AH i n/a 39 4970 4985 4990 N
+ Y NG AO b n/a 39 4969 4984 4993 N
+ Y NG AO i n/a 39 4970 4984 4993 N
+ Y NG AW b n/a 39 4969 4987 4992 N
+ Y NG AY b n/a 39 4969 4987 4991 N
+ Y NG EH b n/a 39 4969 4985 4991 N
+ Y NG EH i n/a 39 4970 4985 4990 N
+ Y NG ER b n/a 39 4969 4987 5002 N
+ Y NG EY b n/a 39 4969 4987 4991 N
+ Y NG G b n/a 39 4969 4985 4991 N
+ Y NG IH b n/a 39 4969 4985 4998 N
+ Y NG IY b n/a 39 4969 4987 4998 N
+ Y NG JH b n/a 39 4969 4985 4991 N
+ Y NG K b n/a 39 4969 4985 4991 N
+ Y NG M b n/a 39 4969 4985 4991 N
+ Y NG OW b n/a 39 4969 4987 4999 N
+ Y NG OY b n/a 39 4969 4987 4999 N
+ Y NG P b n/a 39 4969 4985 4991 N
+ Y NG UH b n/a 39 4969 4984 5001 N
+ Y NG UW b n/a 39 4969 4987 4997 N
+ Y NG UW i n/a 39 4970 4986 4996 N
+ Y NG W b n/a 39 4969 4984 4999 N
+ Y OW AA b n/a 39 4963 4988 4992 N
+ Y OW AA i n/a 39 4963 4988 4990 N
+ Y OW AE b n/a 39 4963 4988 4991 N
+ Y OW AH b n/a 39 4963 4988 4992 N
+ Y OW AH i n/a 39 4964 4988 4990 N
+ Y OW AO b n/a 39 4963 4982 4993 N
+ Y OW AO i n/a 39 4963 4982 4993 N
+ Y OW AW b n/a 39 4963 4988 4992 N
+ Y OW AY b n/a 39 4963 4988 4991 N
+ Y OW EH b n/a 39 4963 4988 4991 N
+ Y OW EH i n/a 39 4963 4988 4990 N
+ Y OW ER b n/a 39 4963 4980 5002 N
+ Y OW ER i n/a 39 4964 4982 5002 N
+ Y OW EY b n/a 39 4963 4988 4991 N
+ Y OW EY i n/a 39 4963 4988 4990 N
+ Y OW G b n/a 39 4963 4988 4991 N
+ Y OW IH b n/a 39 4963 4980 4998 N
+ Y OW IY b n/a 39 4963 4980 4998 N
+ Y OW IY i n/a 39 4963 4980 4990 N
+ Y OW JH b n/a 39 4963 4988 4991 N
+ Y OW K b n/a 39 4963 4988 4991 N
+ Y OW M b n/a 39 4963 4988 4991 N
+ Y OW N i n/a 39 4963 4988 4990 N
+ Y OW OW b n/a 39 4963 4979 4999 N
+ Y OW OW i n/a 39 4963 4979 4999 N
+ Y OW OY b n/a 39 4963 4980 4999 N
+ Y OW P b n/a 39 4963 4988 4991 N
+ Y OW UH b n/a 39 4963 4982 5001 N
+ Y OW UH i n/a 39 4963 4982 5001 N
+ Y OW UW b n/a 39 4963 4979 4997 N
+ Y OW UW i n/a 39 4963 4979 4997 N
+ Y OW W b n/a 39 4963 4982 4999 N
+ Y OY AA b n/a 39 4967 4988 4992 N
+ Y OY AE b n/a 39 4967 4988 4991 N
+ Y OY AH b n/a 39 4967 4988 4992 N
+ Y OY AH i n/a 39 4967 4988 4990 N
+ Y OY AO b n/a 39 4965 4982 4993 N
+ Y OY AW b n/a 39 4967 4988 4992 N
+ Y OY AY b n/a 39 4967 4988 4991 N
+ Y OY EH b n/a 39 4967 4988 4991 N
+ Y OY ER b n/a 39 4965 4980 5002 N
+ Y OY EY b n/a 39 4967 4988 4991 N
+ Y OY G b n/a 39 4967 4988 4991 N
+ Y OY IH b n/a 39 4967 4980 4998 N
+ Y OY IY b n/a 39 4967 4980 4998 N
+ Y OY JH b n/a 39 4967 4988 4991 N
+ Y OY K b n/a 39 4967 4988 4991 N
+ Y OY M b n/a 39 4967 4988 4991 N
+ Y OY OW b n/a 39 4965 4981 4999 N
+ Y OY OY b n/a 39 4965 4980 4999 N
+ Y OY P b n/a 39 4967 4988 4991 N
+ Y OY UH b n/a 39 4965 4982 5001 N
+ Y OY UW b n/a 39 4965 4981 4997 N
+ Y OY UW i n/a 39 4965 4981 4997 N
+ Y OY W b n/a 39 4965 4982 4999 N
+ Y P AA b n/a 39 4954 4977 4992 N
+ Y P AA i n/a 39 4953 4973 4995 N
+ Y P AE b n/a 39 4954 4977 4991 N
+ Y P AH b n/a 39 4954 4977 4992 N
+ Y P AH i n/a 39 4953 4973 4999 N
+ Y P AO b n/a 39 4954 4973 4993 N
+ Y P AO i n/a 39 4953 4973 4993 N
+ Y P AW b n/a 39 4954 4974 4992 N
+ Y P AY b n/a 39 4954 4977 4991 N
+ Y P EH b n/a 39 4954 4977 4991 N
+ Y P EH i n/a 39 4953 4973 4999 N
+ Y P ER b n/a 39 4954 4972 5002 N
+ Y P ER i n/a 39 4953 4972 5002 N
+ Y P EY b n/a 39 4954 4977 4991 N
+ Y P G b n/a 39 4954 4977 4991 N
+ Y P IH b n/a 39 4954 4974 4998 N
+ Y P IY b n/a 39 4954 4974 4998 N
+ Y P JH b n/a 39 4954 4977 4991 N
+ Y P K b n/a 39 4954 4977 4991 N
+ Y P M b n/a 39 4954 4977 4991 N
+ Y P OW b n/a 39 4954 4974 4999 N
+ Y P OY b n/a 39 4954 4978 4999 N
+ Y P P b n/a 39 4954 4977 4991 N
+ Y P UH b n/a 39 4954 4973 5000 N
+ Y P UH i n/a 39 4953 4973 5000 N
+ Y P UW b n/a 39 4954 4974 4994 N
+ Y P UW i n/a 39 4953 4974 4994 N
+ Y P W b n/a 39 4954 4973 4999 N
+ Y R AA b n/a 39 4965 4988 4992 N
+ Y R AA i n/a 39 4964 4988 4990 N
+ Y R AE b n/a 39 4965 4988 4991 N
+ Y R AE i n/a 39 4964 4988 4990 N
+ Y R AH b n/a 39 4965 4988 4992 N
+ Y R AH i n/a 39 4964 4988 4990 N
+ Y R AO b n/a 39 4965 4982 4993 N
+ Y R AO i n/a 39 4964 4982 4993 N
+ Y R AW b n/a 39 4965 4988 4992 N
+ Y R AY b n/a 39 4965 4988 4991 N
+ Y R EH b n/a 39 4965 4988 4991 N
+ Y R EH i n/a 39 4964 4988 4990 N
+ Y R ER b n/a 39 4965 4980 5002 N
+ Y R ER i n/a 39 4964 4982 5002 N
+ Y R EY b n/a 39 4965 4988 4991 N
+ Y R G b n/a 39 4965 4988 4991 N
+ Y R IH b n/a 39 4965 4980 4998 N
+ Y R IH i n/a 39 4964 4982 4990 N
+ Y R IY b n/a 39 4965 4980 4998 N
+ Y R JH b n/a 39 4965 4988 4991 N
+ Y R K b n/a 39 4965 4988 4991 N
+ Y R M b n/a 39 4965 4988 4991 N
+ Y R OW b n/a 39 4965 4979 4999 N
+ Y R OW i n/a 39 4964 4979 4999 N
+ Y R OY b n/a 39 4965 4980 4999 N
+ Y R P b n/a 39 4965 4988 4991 N
+ Y R UH b n/a 39 4965 4982 5001 N
+ Y R UH i n/a 39 4964 4982 5001 N
+ Y R UW b n/a 39 4965 4979 4997 N
+ Y R UW i n/a 39 4964 4979 4997 N
+ Y R W b n/a 39 4965 4982 4999 N
+ Y S AA b n/a 39 4955 4977 4992 N
+ Y S AA i n/a 39 4955 4972 4990 N
+ Y S AE b n/a 39 4955 4977 4991 N
+ Y S AE i n/a 39 4955 4972 4990 N
+ Y S AH b n/a 39 4955 4977 4992 N
+ Y S AH i n/a 39 4955 4972 4990 N
+ Y S AO b n/a 39 4955 4972 4993 N
+ Y S AW b n/a 39 4955 4975 4992 N
+ Y S AY b n/a 39 4955 4977 4991 N
+ Y S EH b n/a 39 4955 4977 4991 N
+ Y S EH i n/a 39 4955 4972 4990 N
+ Y S ER b n/a 39 4955 4972 5002 N
+ Y S ER i n/a 39 4955 4972 5002 N
+ Y S EY b n/a 39 4955 4977 4991 N
+ Y S EY i n/a 39 4955 4977 4990 N
+ Y S G b n/a 39 4955 4977 4991 N
+ Y S IH b n/a 39 4955 4976 4998 N
+ Y S IY b n/a 39 4955 4976 4998 N
+ Y S JH b n/a 39 4955 4977 4991 N
+ Y S K b n/a 39 4955 4977 4991 N
+ Y S M b n/a 39 4955 4977 4991 N
+ Y S OW b n/a 39 4955 4975 4999 N
+ Y S OW i n/a 39 4955 4975 4999 N
+ Y S OY b n/a 39 4955 4978 4999 N
+ Y S P b n/a 39 4955 4977 4991 N
+ Y S UH b n/a 39 4955 4972 5000 N
+ Y S UW b n/a 39 4955 4975 4994 N
+ Y S UW i n/a 39 4955 4975 4994 N
+ Y S W b n/a 39 4955 4972 4999 N
+ Y SH AA b n/a 39 4955 4977 4992 N
+ Y SH AA i n/a 39 4955 4973 4990 N
+ Y SH AE b n/a 39 4955 4977 4991 N
+ Y SH AH b n/a 39 4955 4977 4992 N
+ Y SH AH i n/a 39 4955 4972 4990 N
+ Y SH AO b n/a 39 4955 4973 4993 N
+ Y SH AW b n/a 39 4955 4974 4992 N
+ Y SH AY b n/a 39 4955 4977 4991 N
+ Y SH EH b n/a 39 4955 4977 4991 N
+ Y SH ER b n/a 39 4955 4972 5002 N
+ Y SH ER i n/a 39 4955 4972 5002 N
+ Y SH EY b n/a 39 4955 4977 4991 N
+ Y SH G b n/a 39 4955 4977 4991 N
+ Y SH IH b n/a 39 4955 4974 4998 N
+ Y SH IH i n/a 39 4955 4972 4990 N
+ Y SH IY b n/a 39 4955 4974 4998 N
+ Y SH JH b n/a 39 4955 4977 4991 N
+ Y SH K b n/a 39 4955 4977 4991 N
+ Y SH M b n/a 39 4955 4977 4991 N
+ Y SH OW b n/a 39 4955 4974 4999 N
+ Y SH OW i n/a 39 4955 4974 4999 N
+ Y SH OY b n/a 39 4955 4978 4999 N
+ Y SH P b n/a 39 4955 4977 4991 N
+ Y SH UH b n/a 39 4955 4973 5000 N
+ Y SH UW b n/a 39 4955 4974 4994 N
+ Y SH UW i n/a 39 4955 4974 4994 N
+ Y SH W b n/a 39 4955 4973 4999 N
+ Y SIL AA b n/a 39 4962 4977 4992 N
+ Y SIL AE b n/a 39 4962 4977 4991 N
+ Y SIL AH b n/a 39 4962 4977 4992 N
+ Y SIL AO b n/a 39 4962 4978 4993 N
+ Y SIL AW b n/a 39 4962 4977 4992 N
+ Y SIL AY b n/a 39 4962 4977 4991 N
+ Y SIL EH b n/a 39 4962 4977 4991 N
+ Y SIL ER b n/a 39 4962 4978 5002 N
+ Y SIL EY b n/a 39 4962 4977 4991 N
+ Y SIL G b n/a 39 4962 4977 4991 N
+ Y SIL IH b n/a 39 4962 4978 4998 N
+ Y SIL IY b n/a 39 4962 4978 4998 N
+ Y SIL JH b n/a 39 4962 4977 4991 N
+ Y SIL K b n/a 39 4962 4977 4991 N
+ Y SIL M b n/a 39 4962 4977 4991 N
+ Y SIL OW b n/a 39 4962 4978 4999 N
+ Y SIL OY b n/a 39 4962 4978 4999 N
+ Y SIL P b n/a 39 4962 4977 4991 N
+ Y SIL UH b n/a 39 4962 4978 5000 N
+ Y SIL UW b n/a 39 4962 4978 4995 N
+ Y SIL W b n/a 39 4962 4978 4999 N
+ Y T AA b n/a 39 4960 4977 4992 N
+ Y T AA i n/a 39 4960 4972 4995 N
+ Y T AE b n/a 39 4960 4977 4991 N
+ Y T AH b n/a 39 4960 4977 4992 N
+ Y T AH i n/a 39 4960 4972 4999 N
+ Y T AO b n/a 39 4959 4972 4993 N
+ Y T AW b n/a 39 4960 4975 4992 N
+ Y T AY b n/a 39 4960 4977 4991 N
+ Y T EH b n/a 39 4960 4977 4991 N
+ Y T EH i n/a 39 4960 4972 4999 N
+ Y T ER b n/a 39 4959 4972 5002 N
+ Y T ER i n/a 39 4958 4972 5002 N
+ Y T EY b n/a 39 4960 4977 4991 N
+ Y T EY i n/a 39 4960 4977 4998 N
+ Y T G b n/a 39 4960 4977 4991 N
+ Y T IH b n/a 39 4960 4976 4998 N
+ Y T IH i n/a 39 4960 4972 4998 N
+ Y T IY b n/a 39 4960 4976 4998 N
+ Y T JH b n/a 39 4960 4977 4991 N
+ Y T K b n/a 39 4960 4977 4991 N
+ Y T M b n/a 39 4960 4977 4991 N
+ Y T OW b n/a 39 4959 4975 4999 N
+ Y T OW i n/a 39 4958 4974 4999 N
+ Y T OY b n/a 39 4959 4978 4999 N
+ Y T P b n/a 39 4960 4977 4991 N
+ Y T UH b n/a 39 4959 4972 5000 N
+ Y T UH i n/a 39 4959 4972 5000 N
+ Y T UW b n/a 39 4959 4975 4994 N
+ Y T UW i n/a 39 4958 4974 4994 N
+ Y T W b n/a 39 4959 4972 4999 N
+ Y TH AA b n/a 39 4955 4977 4992 N
+ Y TH AE b n/a 39 4955 4977 4991 N
+ Y TH AH b n/a 39 4955 4977 4992 N
+ Y TH AH i n/a 39 4955 4972 4990 N
+ Y TH AO b n/a 39 4955 4972 4993 N
+ Y TH AW b n/a 39 4955 4976 4992 N
+ Y TH AY b n/a 39 4955 4977 4991 N
+ Y TH EH b n/a 39 4955 4977 4991 N
+ Y TH ER b n/a 39 4955 4972 5002 N
+ Y TH EY b n/a 39 4955 4977 4991 N
+ Y TH G b n/a 39 4955 4977 4991 N
+ Y TH IH b n/a 39 4955 4976 4998 N
+ Y TH IY b n/a 39 4955 4976 4998 N
+ Y TH JH b n/a 39 4955 4977 4991 N
+ Y TH K b n/a 39 4955 4977 4991 N
+ Y TH M b n/a 39 4955 4977 4991 N
+ Y TH OW b n/a 39 4955 4976 4999 N
+ Y TH OY b n/a 39 4955 4978 4999 N
+ Y TH P b n/a 39 4955 4977 4991 N
+ Y TH UH b n/a 39 4955 4972 5000 N
+ Y TH UW b n/a 39 4955 4976 4994 N
+ Y TH UW i n/a 39 4955 4976 4994 N
+ Y TH W b n/a 39 4955 4972 4999 N
+ Y UH AA b n/a 39 4966 4988 4992 N
+ Y UH AE b n/a 39 4966 4988 4991 N
+ Y UH AH b n/a 39 4966 4988 4992 N
+ Y UH AO b n/a 39 4966 4982 4993 N
+ Y UH AW b n/a 39 4966 4988 4992 N
+ Y UH AY b n/a 39 4966 4988 4991 N
+ Y UH EH b n/a 39 4966 4988 4991 N
+ Y UH ER b n/a 39 4966 4980 5002 N
+ Y UH EY b n/a 39 4966 4988 4991 N
+ Y UH G b n/a 39 4966 4988 4991 N
+ Y UH IH b n/a 39 4966 4980 4998 N
+ Y UH IY b n/a 39 4966 4980 4998 N
+ Y UH JH b n/a 39 4966 4988 4991 N
+ Y UH K b n/a 39 4966 4988 4991 N
+ Y UH M b n/a 39 4966 4988 4991 N
+ Y UH OW b n/a 39 4966 4981 4999 N
+ Y UH OY b n/a 39 4966 4980 4999 N
+ Y UH P b n/a 39 4966 4988 4991 N
+ Y UH UH b n/a 39 4966 4982 5001 N
+ Y UH UW b n/a 39 4966 4981 4997 N
+ Y UH W b n/a 39 4966 4982 4999 N
+ Y UW AA b n/a 39 4966 4988 4992 N
+ Y UW AA i n/a 39 4963 4988 4990 N
+ Y UW AE b n/a 39 4966 4988 4991 N
+ Y UW AH b n/a 39 4966 4988 4992 N
+ Y UW AH i n/a 39 4964 4988 4990 N
+ Y UW AO b n/a 39 4966 4982 4993 N
+ Y UW AO i n/a 39 4963 4982 4993 N
+ Y UW AW b n/a 39 4966 4988 4992 N
+ Y UW AY b n/a 39 4966 4988 4991 N
+ Y UW EH b n/a 39 4966 4988 4991 N
+ Y UW EH i n/a 39 4963 4988 4990 N
+ Y UW ER b n/a 39 4966 4980 5002 N
+ Y UW ER i n/a 39 4964 4982 5002 N
+ Y UW EY b n/a 39 4966 4988 4991 N
+ Y UW EY i n/a 39 4963 4988 4990 N
+ Y UW G b n/a 39 4966 4988 4991 N
+ Y UW IH b n/a 39 4966 4980 4998 N
+ Y UW IY b n/a 39 4966 4980 4998 N
+ Y UW IY i n/a 39 4963 4980 4990 N
+ Y UW JH b n/a 39 4966 4988 4991 N
+ Y UW K b n/a 39 4966 4988 4991 N
+ Y UW M b n/a 39 4966 4988 4991 N
+ Y UW OW b n/a 39 4966 4981 4999 N
+ Y UW OW i n/a 39 4963 4979 4999 N
+ Y UW OY b n/a 39 4966 4980 4999 N
+ Y UW P b n/a 39 4966 4988 4991 N
+ Y UW UH b n/a 39 4966 4982 5001 N
+ Y UW UW b n/a 39 4966 4981 4997 N
+ Y UW UW i n/a 39 4963 4979 4997 N
+ Y UW W b n/a 39 4966 4982 4999 N
+ Y V AA b n/a 39 4961 4988 4992 N
+ Y V AA i n/a 39 4961 4988 4992 N
+ Y V AE b n/a 39 4961 4988 4991 N
+ Y V AH b n/a 39 4961 4988 4992 N
+ Y V AH i n/a 39 4961 4988 4992 N
+ Y V AO b n/a 39 4961 4983 4993 N
+ Y V AO i n/a 39 4961 4983 4993 N
+ Y V AW b n/a 39 4961 4988 4992 N
+ Y V AW i n/a 39 4961 4988 4992 N
+ Y V AY b n/a 39 4961 4988 4991 N
+ Y V EH b n/a 39 4961 4988 4991 N
+ Y V EH i n/a 39 4961 4988 4992 N
+ Y V ER b n/a 39 4961 4980 5002 N
+ Y V ER i n/a 39 4961 4983 5002 N
+ Y V EY b n/a 39 4961 4988 4991 N
+ Y V G b n/a 39 4961 4988 4991 N
+ Y V IH b n/a 39 4961 4980 4998 N
+ Y V IH i n/a 39 4961 4983 4992 N
+ Y V IY b n/a 39 4961 4980 4998 N
+ Y V JH b n/a 39 4961 4988 4991 N
+ Y V K b n/a 39 4961 4988 4991 N
+ Y V M b n/a 39 4961 4988 4991 N
+ Y V OW b n/a 39 4961 4981 4999 N
+ Y V OY b n/a 39 4961 4980 4999 N
+ Y V P b n/a 39 4961 4988 4991 N
+ Y V UH b n/a 39 4961 4983 5001 N
+ Y V UH i n/a 39 4961 4983 5001 N
+ Y V UW b n/a 39 4961 4981 4997 N
+ Y V UW i n/a 39 4961 4980 4997 N
+ Y V W b n/a 39 4961 4983 4999 N
+ Y W AA b n/a 39 4963 4989 4992 N
+ Y W AE b n/a 39 4963 4989 4991 N
+ Y W AH b n/a 39 4963 4988 4992 N
+ Y W AO b n/a 39 4963 4989 4993 N
+ Y W AW b n/a 39 4963 4989 4992 N
+ Y W AY b n/a 39 4963 4989 4991 N
+ Y W EH b n/a 39 4963 4988 4991 N
+ Y W ER b n/a 39 4963 4989 5002 N
+ Y W EY b n/a 39 4963 4989 4991 N
+ Y W G b n/a 39 4963 4989 4991 N
+ Y W IH b n/a 39 4963 4980 4998 N
+ Y W IY b n/a 39 4963 4980 4998 N
+ Y W IY i n/a 39 4964 4980 4990 N
+ Y W JH b n/a 39 4963 4989 4991 N
+ Y W K b n/a 39 4963 4989 4991 N
+ Y W M b n/a 39 4963 4989 4991 N
+ Y W OW b n/a 39 4963 4989 4999 N
+ Y W OY b n/a 39 4963 4989 4999 N
+ Y W P b n/a 39 4963 4989 4991 N
+ Y W UH b n/a 39 4963 4982 5001 N
+ Y W UW b n/a 39 4963 4979 4997 N
+ Y W UW i n/a 39 4964 4979 4997 N
+ Y W W b n/a 39 4963 4989 4999 N
+ Y Y AA b n/a 39 4968 4988 4992 N
+ Y Y AA i n/a 39 4968 4988 4990 N
+ Y Y AE b n/a 39 4968 4988 4991 N
+ Y Y AH b n/a 39 4968 4988 4992 N
+ Y Y AH i n/a 39 4968 4988 4990 N
+ Y Y AO b n/a 39 4968 4982 4993 N
+ Y Y AW b n/a 39 4968 4988 4992 N
+ Y Y AY b n/a 39 4968 4988 4991 N
+ Y Y EH b n/a 39 4968 4988 4991 N
+ Y Y ER b n/a 39 4968 4980 5002 N
+ Y Y EY b n/a 39 4968 4988 4991 N
+ Y Y G b n/a 39 4968 4988 4991 N
+ Y Y IH b n/a 39 4968 4980 4998 N
+ Y Y IY b n/a 39 4968 4980 4998 N
+ Y Y JH b n/a 39 4968 4988 4991 N
+ Y Y K b n/a 39 4968 4988 4991 N
+ Y Y M b n/a 39 4968 4988 4991 N
+ Y Y OW b n/a 39 4968 4981 4999 N
+ Y Y OY b n/a 39 4968 4980 4999 N
+ Y Y P b n/a 39 4968 4988 4991 N
+ Y Y UH b n/a 39 4968 4982 5001 N
+ Y Y UW b n/a 39 4968 4981 4997 N
+ Y Y W b n/a 39 4968 4982 4999 N
+ Y Z AA b n/a 39 4958 4988 4992 N
+ Y Z AA i n/a 39 4958 4988 4990 N
+ Y Z AE b n/a 39 4958 4988 4991 N
+ Y Z AH b n/a 39 4958 4988 4992 N
+ Y Z AH i n/a 39 4958 4988 4990 N
+ Y Z AO b n/a 39 4958 4983 4993 N
+ Y Z AW b n/a 39 4958 4988 4992 N
+ Y Z AY b n/a 39 4958 4988 4991 N
+ Y Z EH b n/a 39 4958 4988 4991 N
+ Y Z ER b n/a 39 4958 4980 5002 N
+ Y Z ER i n/a 39 4958 4983 5002 N
+ Y Z EY b n/a 39 4958 4988 4991 N
+ Y Z G b n/a 39 4958 4988 4991 N
+ Y Z IH b n/a 39 4958 4976 4998 N
+ Y Z IY b n/a 39 4958 4976 4998 N
+ Y Z JH b n/a 39 4958 4988 4991 N
+ Y Z K b n/a 39 4958 4988 4991 N
+ Y Z M b n/a 39 4958 4988 4991 N
+ Y Z OW b n/a 39 4958 4981 4999 N
+ Y Z OW i n/a 39 4958 4981 4999 N
+ Y Z OY b n/a 39 4958 4980 4999 N
+ Y Z P b n/a 39 4958 4988 4991 N
+ Y Z UH b n/a 39 4958 4972 5001 N
+ Y Z UW b n/a 39 4958 4975 4994 N
+ Y Z UW i n/a 39 4958 4975 4994 N
+ Y Z W b n/a 39 4958 4983 4999 N
+ Y ZH AA b n/a 39 4958 4988 4992 N
+ Y ZH AE b n/a 39 4958 4988 4991 N
+ Y ZH AH b n/a 39 4958 4988 4992 N
+ Y ZH AH i n/a 39 4958 4988 4990 N
+ Y ZH AO b n/a 39 4958 4983 4993 N
+ Y ZH AW b n/a 39 4958 4988 4992 N
+ Y ZH AY b n/a 39 4958 4988 4991 N
+ Y ZH EH b n/a 39 4958 4988 4991 N
+ Y ZH ER b n/a 39 4958 4980 5002 N
+ Y ZH ER i n/a 39 4958 4983 5002 N
+ Y ZH EY b n/a 39 4958 4988 4991 N
+ Y ZH G b n/a 39 4958 4988 4991 N
+ Y ZH IH b n/a 39 4958 4980 4998 N
+ Y ZH IY b n/a 39 4958 4980 4998 N
+ Y ZH JH b n/a 39 4958 4988 4991 N
+ Y ZH K b n/a 39 4958 4988 4991 N
+ Y ZH M b n/a 39 4958 4988 4991 N
+ Y ZH OW b n/a 39 4958 4981 4999 N
+ Y ZH OY b n/a 39 4958 4980 4999 N
+ Y ZH P b n/a 39 4958 4988 4991 N
+ Y ZH UH b n/a 39 4958 4983 5001 N
+ Y ZH UW b n/a 39 4958 4981 4997 N
+ Y ZH W b n/a 39 4958 4983 4999 N
+ Z AA AA b n/a 40 5013 5057 5095 N
+ Z AA AA e n/a 40 5013 5057 5096 N
+ Z AA AA i n/a 40 5013 5057 5095 N
+ Z AA AE b n/a 40 5013 5057 5104 N
+ Z AA AE e n/a 40 5013 5057 5105 N
+ Z AA AH b n/a 40 5013 5057 5108 N
+ Z AA AH e n/a 40 5013 5057 5108 N
+ Z AA AH i n/a 40 5013 5057 5103 N
+ Z AA AO b n/a 40 5013 5057 5095 N
+ Z AA AO e n/a 40 5013 5057 5096 N
+ Z AA AO i n/a 40 5013 5057 5095 N
+ Z AA AW b n/a 40 5013 5057 5104 N
+ Z AA AW e n/a 40 5013 5057 5104 N
+ Z AA AY b n/a 40 5013 5057 5094 N
+ Z AA AY e n/a 40 5013 5057 5096 N
+ Z AA AY i n/a 40 5013 5057 5094 N
+ Z AA B b n/a 40 5013 5030 5091 N
+ Z AA B e n/a 40 5013 5030 5091 N
+ Z AA B i n/a 40 5013 5030 5091 N
+ Z AA CH e n/a 40 5013 5041 5089 N
+ Z AA D b n/a 40 5013 5030 5089 N
+ Z AA D e n/a 40 5013 5030 5089 N
+ Z AA D i n/a 40 5013 5030 5089 N
+ Z AA DH e n/a 40 5013 5031 5072 N
+ Z AA EH b n/a 40 5013 5057 5104 N
+ Z AA EH e n/a 40 5013 5057 5106 N
+ Z AA EH i n/a 40 5013 5057 5104 N
+ Z AA ER b n/a 40 5013 5057 5110 N
+ Z AA ER e n/a 40 5013 5057 5111 N
+ Z AA ER i n/a 40 5013 5057 5110 N
+ Z AA EY b n/a 40 5013 5057 5104 N
+ Z AA EY e n/a 40 5013 5057 5106 N
+ Z AA EY i n/a 40 5013 5057 5104 N
+ Z AA F e n/a 40 5013 5041 5078 N
+ Z AA G e n/a 40 5013 5030 5093 N
+ Z AA G i n/a 40 5013 5030 5093 N
+ Z AA HH b n/a 40 5013 5039 5075 N
+ Z AA HH e n/a 40 5013 5039 5075 N
+ Z AA IH b n/a 40 5013 5057 5099 N
+ Z AA IH e n/a 40 5013 5057 5098 N
+ Z AA IH i n/a 40 5013 5057 5099 N
+ Z AA IY b n/a 40 5013 5057 5101 N
+ Z AA IY e n/a 40 5013 5057 5098 N
+ Z AA IY i n/a 40 5013 5057 5101 N
+ Z AA JH e n/a 40 5013 5034 5089 N
+ Z AA K b n/a 40 5013 5042 5092 N
+ Z AA K e n/a 40 5013 5042 5092 N
+ Z AA K i n/a 40 5013 5042 5092 N
+ Z AA L b n/a 40 5013 5030 5114 N
+ Z AA L e n/a 40 5013 5030 5114 N
+ Z AA L i n/a 40 5013 5030 5114 N
+ Z AA M b n/a 40 5013 5030 5112 N
+ Z AA M e n/a 40 5013 5030 5112 N
+ Z AA M i n/a 40 5013 5030 5112 N
+ Z AA N b n/a 40 5013 5030 5113 N
+ Z AA N e n/a 40 5013 5030 5113 N
+ Z AA N i n/a 40 5013 5030 5113 N
+ Z AA NG e n/a 40 5013 5030 5112 N
+ Z AA OW b n/a 40 5013 5057 5095 N
+ Z AA OW e n/a 40 5013 5057 5096 N
+ Z AA OW i n/a 40 5013 5057 5095 N
+ Z AA OY e n/a 40 5013 5057 5096 N
+ Z AA OY i n/a 40 5013 5057 5094 N
+ Z AA P e n/a 40 5013 5041 5090 N
+ Z AA R b n/a 40 5013 5037 5116 N
+ Z AA R e n/a 40 5013 5037 5116 N
+ Z AA R i n/a 40 5013 5037 5116 N
+ Z AA S e n/a 40 5013 5039 5072 N
+ Z AA SH e n/a 40 5013 5035 5077 N
+ Z AA SIL e n/a 40 5013 5043 5083 N
+ Z AA T e n/a 40 5013 5041 5089 N
+ Z AA T i n/a 40 5013 5041 5089 N
+ Z AA TH e n/a 40 5013 5039 5072 N
+ Z AA UH b n/a 40 5013 5057 5099 N
+ Z AA UH e n/a 40 5013 5057 5098 N
+ Z AA UW b n/a 40 5013 5057 5097 N
+ Z AA UW e n/a 40 5013 5057 5097 N
+ Z AA UW i n/a 40 5013 5057 5097 N
+ Z AA V b n/a 40 5013 5030 5072 N
+ Z AA V e n/a 40 5013 5030 5072 N
+ Z AA V i n/a 40 5013 5030 5072 N
+ Z AA W b n/a 40 5013 5036 5115 N
+ Z AA W e n/a 40 5013 5036 5115 N
+ Z AA W i n/a 40 5013 5036 5115 N
+ Z AA Y b n/a 40 5013 5035 5076 N
+ Z AA Y e n/a 40 5013 5035 5076 N
+ Z AA Y i n/a 40 5013 5035 5076 N
+ Z AA Z b n/a 40 5013 5030 5072 N
+ Z AA Z e n/a 40 5013 5030 5072 N
+ Z AA ZH e n/a 40 5013 5034 5072 N
+ Z AE AA b n/a 40 5011 5063 5095 N
+ Z AE AA e n/a 40 5011 5063 5095 N
+ Z AE AA i n/a 40 5011 5063 5095 N
+ Z AE AE b n/a 40 5011 5060 5104 N
+ Z AE AE e n/a 40 5011 5060 5105 N
+ Z AE AE i n/a 40 5011 5060 5104 N
+ Z AE AH b n/a 40 5011 5060 5107 N
+ Z AE AH e n/a 40 5011 5060 5107 N
+ Z AE AH i n/a 40 5011 5060 5103 N
+ Z AE AO b n/a 40 5011 5060 5095 N
+ Z AE AO e n/a 40 5011 5063 5095 N
+ Z AE AO i n/a 40 5011 5060 5095 N
+ Z AE AW b n/a 40 5011 5060 5104 N
+ Z AE AW e n/a 40 5011 5060 5104 N
+ Z AE AY b n/a 40 5011 5063 5094 N
+ Z AE AY e n/a 40 5011 5063 5094 N
+ Z AE AY i n/a 40 5011 5063 5094 N
+ Z AE B b n/a 40 5011 5031 5091 N
+ Z AE B e n/a 40 5011 5031 5091 N
+ Z AE B i n/a 40 5011 5031 5091 N
+ Z AE CH e n/a 40 5012 5041 5089 N
+ Z AE D b n/a 40 5011 5031 5089 N
+ Z AE D e n/a 40 5011 5031 5089 N
+ Z AE D i n/a 40 5011 5031 5089 N
+ Z AE DH e n/a 40 5011 5031 5073 N
+ Z AE EH b n/a 40 5011 5060 5104 N
+ Z AE EH e n/a 40 5011 5060 5106 N
+ Z AE EH i n/a 40 5011 5060 5104 N
+ Z AE ER b n/a 40 5011 5060 5110 N
+ Z AE ER e n/a 40 5011 5063 5111 N
+ Z AE ER i n/a 40 5011 5060 5110 N
+ Z AE EY b n/a 40 5011 5060 5104 N
+ Z AE EY e n/a 40 5011 5060 5106 N
+ Z AE EY i n/a 40 5011 5060 5104 N
+ Z AE F e n/a 40 5012 5041 5078 N
+ Z AE G e n/a 40 5011 5031 5093 N
+ Z AE HH b n/a 40 5012 5038 5075 N
+ Z AE HH e n/a 40 5012 5038 5075 N
+ Z AE IH b n/a 40 5011 5060 5099 N
+ Z AE IH e n/a 40 5011 5060 5099 N
+ Z AE IH i n/a 40 5011 5060 5099 N
+ Z AE IY b n/a 40 5011 5060 5101 N
+ Z AE IY e n/a 40 5011 5060 5099 N
+ Z AE IY i n/a 40 5011 5060 5101 N
+ Z AE JH e n/a 40 5012 5034 5089 N
+ Z AE K b n/a 40 5012 5042 5092 N
+ Z AE K e n/a 40 5012 5042 5092 N
+ Z AE K i n/a 40 5012 5042 5092 N
+ Z AE L b n/a 40 5011 5031 5114 N
+ Z AE L e n/a 40 5011 5031 5114 N
+ Z AE L i n/a 40 5011 5031 5114 N
+ Z AE M b n/a 40 5011 5031 5112 N
+ Z AE M e n/a 40 5011 5031 5112 N
+ Z AE M i n/a 40 5011 5031 5112 N
+ Z AE N b n/a 40 5011 5031 5113 N
+ Z AE N e n/a 40 5011 5031 5113 N
+ Z AE N i n/a 40 5011 5031 5113 N
+ Z AE NG e n/a 40 5011 5031 5112 N
+ Z AE OW b n/a 40 5011 5060 5095 N
+ Z AE OW e n/a 40 5011 5063 5095 N
+ Z AE OW i n/a 40 5011 5060 5095 N
+ Z AE OY e n/a 40 5011 5063 5094 N
+ Z AE P e n/a 40 5012 5041 5090 N
+ Z AE P i n/a 40 5012 5041 5090 N
+ Z AE R b n/a 40 5011 5037 5116 N
+ Z AE R e n/a 40 5011 5037 5116 N
+ Z AE R i n/a 40 5011 5037 5116 N
+ Z AE S e n/a 40 5012 5038 5071 N
+ Z AE SH e n/a 40 5012 5035 5077 N
+ Z AE SIL e n/a 40 5011 5044 5084 N
+ Z AE T e n/a 40 5012 5041 5089 N
+ Z AE T i n/a 40 5012 5041 5089 N
+ Z AE TH e n/a 40 5012 5038 5073 N
+ Z AE UH b n/a 40 5011 5060 5099 N
+ Z AE UH e n/a 40 5011 5063 5099 N
+ Z AE UW b n/a 40 5011 5060 5097 N
+ Z AE UW e n/a 40 5011 5063 5097 N
+ Z AE UW i n/a 40 5011 5060 5097 N
+ Z AE V b n/a 40 5011 5031 5074 N
+ Z AE V e n/a 40 5011 5031 5074 N
+ Z AE W b n/a 40 5011 5036 5115 N
+ Z AE W e n/a 40 5011 5036 5115 N
+ Z AE W i n/a 40 5011 5036 5115 N
+ Z AE Y b n/a 40 5012 5035 5076 N
+ Z AE Y e n/a 40 5012 5035 5076 N
+ Z AE Y i n/a 40 5012 5035 5076 N
+ Z AE Z b n/a 40 5011 5031 5074 N
+ Z AE Z e n/a 40 5011 5031 5074 N
+ Z AE ZH e n/a 40 5012 5034 5074 N
+ Z AH AA b n/a 40 5016 5063 5095 N
+ Z AH AA e n/a 40 5016 5063 5095 N
+ Z AH AA i n/a 40 5016 5063 5095 N
+ Z AH AE b n/a 40 5016 5062 5104 N
+ Z AH AE e n/a 40 5016 5061 5106 N
+ Z AH AE i n/a 40 5016 5062 5104 N
+ Z AH AH b n/a 40 5016 5062 5107 N
+ Z AH AH e n/a 40 5016 5061 5107 N
+ Z AH AH i n/a 40 5015 5060 5103 N
+ Z AH AO b n/a 40 5016 5062 5095 N
+ Z AH AO e n/a 40 5016 5063 5095 N
+ Z AH AO i n/a 40 5016 5062 5095 N
+ Z AH AW b n/a 40 5016 5062 5104 N
+ Z AH AW e n/a 40 5016 5061 5104 N
+ Z AH AY b n/a 40 5016 5063 5094 N
+ Z AH AY e n/a 40 5016 5063 5094 N
+ Z AH AY i n/a 40 5016 5063 5094 N
+ Z AH B b n/a 40 5015 5030 5091 N
+ Z AH B e n/a 40 5016 5030 5091 N
+ Z AH B i n/a 40 5015 5030 5091 N
+ Z AH CH e n/a 40 5014 5041 5088 N
+ Z AH D b n/a 40 5015 5030 5086 N
+ Z AH D e n/a 40 5016 5030 5086 N
+ Z AH D i n/a 40 5015 5030 5088 N
+ Z AH DH e n/a 40 5016 5031 5073 N
+ Z AH EH b n/a 40 5016 5062 5104 N
+ Z AH EH e n/a 40 5016 5061 5106 N
+ Z AH EH i n/a 40 5016 5062 5104 N
+ Z AH ER b n/a 40 5016 5062 5110 N
+ Z AH ER e n/a 40 5016 5063 5111 N
+ Z AH ER i n/a 40 5015 5060 5110 N
+ Z AH EY b n/a 40 5016 5062 5104 N
+ Z AH EY e n/a 40 5016 5061 5106 N
+ Z AH EY i n/a 40 5016 5062 5104 N
+ Z AH F e n/a 40 5014 5041 5078 N
+ Z AH G e n/a 40 5016 5030 5093 N
+ Z AH HH b n/a 40 5014 5039 5075 N
+ Z AH HH e n/a 40 5014 5039 5075 N
+ Z AH IH b n/a 40 5016 5062 5100 N
+ Z AH IH e n/a 40 5016 5061 5099 N
+ Z AH IH i n/a 40 5016 5062 5100 N
+ Z AH IY b n/a 40 5016 5062 5101 N
+ Z AH IY e n/a 40 5016 5061 5098 N
+ Z AH IY i n/a 40 5016 5062 5101 N
+ Z AH JH e n/a 40 5016 5034 5086 N
+ Z AH K b n/a 40 5014 5042 5092 N
+ Z AH K e n/a 40 5014 5042 5092 N
+ Z AH K i n/a 40 5014 5042 5092 N
+ Z AH L b n/a 40 5016 5030 5114 N
+ Z AH L e n/a 40 5016 5030 5114 N
+ Z AH L i n/a 40 5016 5030 5114 N
+ Z AH M b n/a 40 5015 5030 5112 N
+ Z AH M e n/a 40 5016 5030 5112 N
+ Z AH M i n/a 40 5015 5030 5112 N
+ Z AH N b n/a 40 5015 5030 5113 N
+ Z AH N e n/a 40 5016 5030 5113 N
+ Z AH N i n/a 40 5015 5030 5113 N
+ Z AH NG e n/a 40 5016 5030 5112 N
+ Z AH OW b n/a 40 5016 5062 5095 N
+ Z AH OW e n/a 40 5016 5063 5095 N
+ Z AH OW i n/a 40 5016 5062 5095 N
+ Z AH OY e n/a 40 5016 5063 5094 N
+ Z AH P e n/a 40 5014 5041 5090 N
+ Z AH R b n/a 40 5016 5037 5116 N
+ Z AH R e n/a 40 5016 5037 5116 N
+ Z AH R i n/a 40 5016 5037 5116 N
+ Z AH S e n/a 40 5014 5039 5071 N
+ Z AH SH e n/a 40 5014 5035 5077 N
+ Z AH SIL e n/a 40 5017 5044 5084 N
+ Z AH T e n/a 40 5014 5041 5088 N
+ Z AH T i n/a 40 5014 5041 5088 N
+ Z AH TH e n/a 40 5014 5039 5073 N
+ Z AH UH b n/a 40 5016 5062 5100 N
+ Z AH UH e n/a 40 5016 5063 5099 N
+ Z AH UH i n/a 40 5016 5062 5100 N
+ Z AH UW b n/a 40 5016 5062 5097 N
+ Z AH UW e n/a 40 5016 5063 5097 N
+ Z AH UW i n/a 40 5016 5062 5097 N
+ Z AH V b n/a 40 5015 5030 5074 N
+ Z AH V e n/a 40 5016 5030 5074 N
+ Z AH W b n/a 40 5016 5036 5115 N
+ Z AH W e n/a 40 5016 5036 5115 N
+ Z AH W i n/a 40 5016 5036 5115 N
+ Z AH Y b n/a 40 5015 5035 5076 N
+ Z AH Y e n/a 40 5016 5035 5076 N
+ Z AH Y i n/a 40 5015 5035 5076 N
+ Z AH Z b n/a 40 5015 5030 5074 N
+ Z AH Z e n/a 40 5016 5030 5074 N
+ Z AH ZH e n/a 40 5016 5034 5074 N
+ Z AO AA b n/a 40 5013 5057 5095 N
+ Z AO AA e n/a 40 5013 5057 5096 N
+ Z AO AA i n/a 40 5013 5057 5095 N
+ Z AO AE b n/a 40 5013 5057 5104 N
+ Z AO AE e n/a 40 5013 5057 5105 N
+ Z AO AE i n/a 40 5013 5057 5104 N
+ Z AO AH b n/a 40 5013 5057 5108 N
+ Z AO AH e n/a 40 5013 5057 5108 N
+ Z AO AH i n/a 40 5013 5057 5102 N
+ Z AO AO b n/a 40 5013 5057 5095 N
+ Z AO AO e n/a 40 5013 5057 5096 N
+ Z AO AW b n/a 40 5013 5057 5104 N
+ Z AO AW e n/a 40 5013 5057 5104 N
+ Z AO AY b n/a 40 5013 5057 5094 N
+ Z AO AY e n/a 40 5013 5057 5096 N
+ Z AO B b n/a 40 5013 5030 5091 N
+ Z AO B e n/a 40 5013 5030 5091 N
+ Z AO B i n/a 40 5013 5030 5091 N
+ Z AO CH e n/a 40 5013 5041 5089 N
+ Z AO CH i n/a 40 5013 5041 5089 N
+ Z AO D b n/a 40 5013 5030 5089 N
+ Z AO D e n/a 40 5013 5030 5089 N
+ Z AO D i n/a 40 5013 5030 5089 N
+ Z AO DH e n/a 40 5013 5031 5072 N
+ Z AO EH b n/a 40 5013 5057 5104 N
+ Z AO EH e n/a 40 5013 5057 5106 N
+ Z AO ER b n/a 40 5013 5057 5110 N
+ Z AO ER e n/a 40 5013 5057 5111 N
+ Z AO ER i n/a 40 5013 5057 5110 N
+ Z AO EY b n/a 40 5013 5057 5104 N
+ Z AO EY e n/a 40 5013 5057 5106 N
+ Z AO EY i n/a 40 5013 5057 5104 N
+ Z AO F e n/a 40 5013 5041 5078 N
+ Z AO G e n/a 40 5013 5030 5093 N
+ Z AO HH b n/a 40 5013 5039 5075 N
+ Z AO HH e n/a 40 5013 5039 5075 N
+ Z AO IH b n/a 40 5013 5057 5099 N
+ Z AO IH e n/a 40 5013 5057 5098 N
+ Z AO IH i n/a 40 5013 5057 5099 N
+ Z AO IY b n/a 40 5013 5057 5101 N
+ Z AO IY e n/a 40 5013 5057 5098 N
+ Z AO IY i n/a 40 5013 5057 5101 N
+ Z AO JH e n/a 40 5013 5034 5089 N
+ Z AO K b n/a 40 5013 5042 5092 N
+ Z AO K e n/a 40 5013 5042 5092 N
+ Z AO L b n/a 40 5013 5030 5114 N
+ Z AO L e n/a 40 5013 5030 5114 N
+ Z AO L i n/a 40 5013 5030 5114 N
+ Z AO M b n/a 40 5013 5030 5112 N
+ Z AO M e n/a 40 5013 5030 5112 N
+ Z AO M i n/a 40 5013 5030 5112 N
+ Z AO N b n/a 40 5013 5030 5113 N
+ Z AO N e n/a 40 5013 5030 5113 N
+ Z AO N i n/a 40 5013 5030 5113 N
+ Z AO NG e n/a 40 5013 5030 5112 N
+ Z AO OW b n/a 40 5013 5057 5095 N
+ Z AO OW e n/a 40 5013 5057 5096 N
+ Z AO OY e n/a 40 5013 5057 5096 N
+ Z AO P e n/a 40 5013 5041 5090 N
+ Z AO R b n/a 40 5013 5037 5116 N
+ Z AO R e n/a 40 5013 5037 5116 N
+ Z AO S e n/a 40 5013 5039 5072 N
+ Z AO S i n/a 40 5013 5039 5072 N
+ Z AO SH e n/a 40 5013 5035 5077 N
+ Z AO SIL e n/a 40 5013 5043 5082 N
+ Z AO T e n/a 40 5013 5041 5089 N
+ Z AO TH e n/a 40 5013 5039 5072 N
+ Z AO UH b n/a 40 5013 5057 5099 N
+ Z AO UH e n/a 40 5013 5057 5098 N
+ Z AO UW b n/a 40 5013 5057 5097 N
+ Z AO UW e n/a 40 5013 5057 5097 N
+ Z AO V b n/a 40 5013 5030 5072 N
+ Z AO V e n/a 40 5013 5030 5072 N
+ Z AO W b n/a 40 5013 5036 5115 N
+ Z AO W e n/a 40 5013 5036 5115 N
+ Z AO W i n/a 40 5013 5036 5115 N
+ Z AO Y b n/a 40 5013 5035 5076 N
+ Z AO Y e n/a 40 5013 5035 5076 N
+ Z AO Z b n/a 40 5013 5030 5072 N
+ Z AO Z e n/a 40 5013 5030 5072 N
+ Z AO ZH e n/a 40 5013 5034 5072 N
+ Z AW AA b n/a 40 5019 5057 5095 N
+ Z AW AA e n/a 40 5019 5057 5095 N
+ Z AW AE b n/a 40 5019 5057 5104 N
+ Z AW AE e n/a 40 5019 5057 5105 N
+ Z AW AH b n/a 40 5019 5057 5107 N
+ Z AW AH e n/a 40 5019 5057 5107 N
+ Z AW AH i n/a 40 5019 5057 5103 N
+ Z AW AO b n/a 40 5019 5057 5095 N
+ Z AW AO e n/a 40 5019 5057 5095 N
+ Z AW AW b n/a 40 5019 5057 5104 N
+ Z AW AW e n/a 40 5019 5057 5104 N
+ Z AW AY b n/a 40 5019 5057 5094 N
+ Z AW AY e n/a 40 5019 5057 5094 N
+ Z AW B b n/a 40 5019 5030 5091 N
+ Z AW B e n/a 40 5019 5030 5091 N
+ Z AW CH e n/a 40 5019 5041 5089 N
+ Z AW D b n/a 40 5019 5030 5089 N
+ Z AW D e n/a 40 5019 5030 5089 N
+ Z AW D i n/a 40 5019 5030 5089 N
+ Z AW DH e n/a 40 5019 5031 5073 N
+ Z AW EH b n/a 40 5019 5057 5104 N
+ Z AW EH e n/a 40 5019 5057 5106 N
+ Z AW ER b n/a 40 5019 5057 5110 N
+ Z AW ER e n/a 40 5019 5057 5111 N
+ Z AW ER i n/a 40 5019 5057 5110 N
+ Z AW EY b n/a 40 5019 5057 5104 N
+ Z AW EY e n/a 40 5019 5057 5106 N
+ Z AW F e n/a 40 5019 5041 5078 N
+ Z AW F i n/a 40 5019 5041 5078 N
+ Z AW G e n/a 40 5019 5030 5093 N
+ Z AW HH b n/a 40 5019 5039 5075 N
+ Z AW HH e n/a 40 5019 5039 5075 N
+ Z AW IH b n/a 40 5019 5057 5099 N
+ Z AW IH e n/a 40 5019 5057 5099 N
+ Z AW IH i n/a 40 5019 5057 5099 N
+ Z AW IY b n/a 40 5019 5057 5101 N
+ Z AW IY e n/a 40 5019 5057 5099 N
+ Z AW IY i n/a 40 5019 5057 5101 N
+ Z AW JH e n/a 40 5019 5034 5089 N
+ Z AW K b n/a 40 5019 5042 5092 N
+ Z AW K e n/a 40 5019 5042 5092 N
+ Z AW L b n/a 40 5019 5030 5114 N
+ Z AW L e n/a 40 5019 5030 5114 N
+ Z AW L i n/a 40 5019 5030 5114 N
+ Z AW M b n/a 40 5019 5030 5112 N
+ Z AW M e n/a 40 5019 5030 5112 N
+ Z AW M i n/a 40 5019 5030 5112 N
+ Z AW N b n/a 40 5019 5030 5113 N
+ Z AW N e n/a 40 5019 5030 5113 N
+ Z AW NG e n/a 40 5019 5030 5112 N
+ Z AW OW b n/a 40 5019 5057 5095 N
+ Z AW OW e n/a 40 5019 5057 5095 N
+ Z AW OW i n/a 40 5019 5057 5095 N
+ Z AW OY e n/a 40 5019 5057 5094 N
+ Z AW P e n/a 40 5019 5041 5090 N
+ Z AW R b n/a 40 5019 5037 5116 N
+ Z AW R e n/a 40 5019 5037 5116 N
+ Z AW S e n/a 40 5019 5039 5071 N
+ Z AW SH e n/a 40 5019 5035 5077 N
+ Z AW SIL e n/a 40 5019 5043 5084 N
+ Z AW T e n/a 40 5019 5041 5089 N
+ Z AW T i n/a 40 5019 5041 5089 N
+ Z AW TH e n/a 40 5019 5039 5073 N
+ Z AW UH b n/a 40 5019 5057 5099 N
+ Z AW UH e n/a 40 5019 5057 5099 N
+ Z AW UW b n/a 40 5019 5057 5097 N
+ Z AW UW e n/a 40 5019 5057 5097 N
+ Z AW V b n/a 40 5019 5030 5074 N
+ Z AW V e n/a 40 5019 5030 5074 N
+ Z AW W b n/a 40 5019 5036 5115 N
+ Z AW W e n/a 40 5019 5036 5115 N
+ Z AW Y b n/a 40 5019 5035 5076 N
+ Z AW Y e n/a 40 5019 5035 5076 N
+ Z AW Z b n/a 40 5019 5030 5074 N
+ Z AW Z e n/a 40 5019 5030 5074 N
+ Z AW ZH e n/a 40 5019 5034 5074 N
+ Z AY AA b n/a 40 5029 5065 5095 N
+ Z AY AA e n/a 40 5029 5065 5096 N
+ Z AY AA i n/a 40 5029 5065 5095 N
+ Z AY AE b n/a 40 5029 5065 5104 N
+ Z AY AE e n/a 40 5029 5065 5105 N
+ Z AY AE i n/a 40 5029 5065 5104 N
+ Z AY AH b n/a 40 5029 5065 5109 N
+ Z AY AH e n/a 40 5029 5065 5109 N
+ Z AY AH i n/a 40 5029 5065 5103 N
+ Z AY AO b n/a 40 5029 5065 5095 N
+ Z AY AO e n/a 40 5029 5065 5096 N
+ Z AY AW b n/a 40 5029 5065 5104 N
+ Z AY AW e n/a 40 5029 5065 5104 N
+ Z AY AY b n/a 40 5029 5065 5094 N
+ Z AY AY e n/a 40 5029 5065 5096 N
+ Z AY AY i n/a 40 5029 5065 5094 N
+ Z AY B b n/a 40 5029 5050 5091 N
+ Z AY B e n/a 40 5029 5050 5091 N
+ Z AY CH e n/a 40 5029 5050 5089 N
+ Z AY D b n/a 40 5029 5050 5089 N
+ Z AY D e n/a 40 5029 5050 5089 N
+ Z AY D i n/a 40 5029 5050 5089 N
+ Z AY DH e n/a 40 5029 5050 5072 N
+ Z AY EH b n/a 40 5029 5065 5104 N
+ Z AY EH e n/a 40 5029 5065 5106 N
+ Z AY EH i n/a 40 5029 5065 5104 N
+ Z AY ER b n/a 40 5029 5065 5110 N
+ Z AY ER e n/a 40 5029 5065 5111 N
+ Z AY ER i n/a 40 5029 5065 5110 N
+ Z AY EY b n/a 40 5029 5065 5104 N
+ Z AY EY e n/a 40 5029 5065 5106 N
+ Z AY EY i n/a 40 5029 5065 5104 N
+ Z AY F e n/a 40 5029 5050 5078 N
+ Z AY G e n/a 40 5029 5050 5093 N
+ Z AY G i n/a 40 5029 5050 5093 N
+ Z AY HH b n/a 40 5029 5050 5075 N
+ Z AY HH e n/a 40 5029 5050 5075 N
+ Z AY HH i n/a 40 5029 5050 5075 N
+ Z AY IH b n/a 40 5029 5065 5099 N
+ Z AY IH e n/a 40 5029 5065 5098 N
+ Z AY IH i n/a 40 5029 5065 5099 N
+ Z AY IY b n/a 40 5029 5065 5101 N
+ Z AY IY e n/a 40 5029 5065 5098 N
+ Z AY IY i n/a 40 5029 5065 5101 N
+ Z AY JH e n/a 40 5029 5050 5089 N
+ Z AY K b n/a 40 5029 5050 5092 N
+ Z AY K e n/a 40 5029 5050 5092 N
+ Z AY K i n/a 40 5029 5050 5092 N
+ Z AY L b n/a 40 5029 5050 5114 N
+ Z AY L e n/a 40 5029 5050 5114 N
+ Z AY L i n/a 40 5029 5050 5114 N
+ Z AY M b n/a 40 5029 5050 5112 N
+ Z AY M e n/a 40 5029 5050 5112 N
+ Z AY M i n/a 40 5029 5050 5112 N
+ Z AY N b n/a 40 5029 5050 5113 N
+ Z AY N e n/a 40 5029 5050 5113 N
+ Z AY N i n/a 40 5029 5050 5113 N
+ Z AY NG e n/a 40 5029 5050 5112 N
+ Z AY OW b n/a 40 5029 5065 5095 N
+ Z AY OW e n/a 40 5029 5065 5096 N
+ Z AY OW i n/a 40 5029 5065 5095 N
+ Z AY OY e n/a 40 5029 5065 5096 N
+ Z AY OY i n/a 40 5029 5065 5094 N
+ Z AY P e n/a 40 5029 5050 5090 N
+ Z AY R b n/a 40 5029 5050 5116 N
+ Z AY R e n/a 40 5029 5050 5116 N
+ Z AY S e n/a 40 5029 5050 5072 N
+ Z AY SH e n/a 40 5029 5050 5077 N
+ Z AY SH i n/a 40 5029 5050 5077 N
+ Z AY SIL e n/a 40 5029 5050 5083 N
+ Z AY T e n/a 40 5029 5050 5089 N
+ Z AY TH e n/a 40 5029 5050 5072 N
+ Z AY UH b n/a 40 5029 5065 5099 N
+ Z AY UH e n/a 40 5029 5065 5098 N
+ Z AY UW b n/a 40 5029 5065 5097 N
+ Z AY UW e n/a 40 5029 5065 5097 N
+ Z AY V b n/a 40 5029 5050 5072 N
+ Z AY V e n/a 40 5029 5050 5072 N
+ Z AY W b n/a 40 5029 5050 5115 N
+ Z AY W e n/a 40 5029 5050 5115 N
+ Z AY Y b n/a 40 5029 5050 5076 N
+ Z AY Y e n/a 40 5029 5050 5076 N
+ Z AY Z b n/a 40 5029 5050 5072 N
+ Z AY Z e n/a 40 5029 5050 5072 N
+ Z AY ZH e n/a 40 5029 5050 5072 N
+ Z B AA b n/a 40 5005 5070 5095 N
+ Z B AA e n/a 40 5005 5070 5096 N
+ Z B AA i n/a 40 5005 5070 5095 N
+ Z B AE b n/a 40 5005 5070 5104 N
+ Z B AE e n/a 40 5005 5070 5105 N
+ Z B AH b n/a 40 5005 5070 5109 N
+ Z B AH e n/a 40 5005 5070 5109 N
+ Z B AH i n/a 40 5005 5070 5103 N
+ Z B AO b n/a 40 5005 5070 5095 N
+ Z B AO e n/a 40 5005 5070 5096 N
+ Z B AO i n/a 40 5005 5070 5095 N
+ Z B AW b n/a 40 5005 5070 5104 N
+ Z B AW e n/a 40 5005 5070 5104 N
+ Z B AY b n/a 40 5005 5070 5094 N
+ Z B AY e n/a 40 5005 5070 5096 N
+ Z B B b n/a 40 5005 5068 5091 N
+ Z B B e n/a 40 5005 5068 5091 N
+ Z B B i n/a 40 5005 5068 5091 N
+ Z B CH e n/a 40 5005 5068 5088 N
+ Z B D b n/a 40 5005 5068 5086 N
+ Z B D e n/a 40 5005 5068 5086 N
+ Z B DH e n/a 40 5005 5068 5072 N
+ Z B EH b n/a 40 5005 5070 5104 N
+ Z B EH e n/a 40 5005 5070 5106 N
+ Z B ER b n/a 40 5005 5070 5110 N
+ Z B ER e n/a 40 5005 5070 5111 N
+ Z B ER i n/a 40 5005 5070 5110 N
+ Z B EY b n/a 40 5005 5070 5104 N
+ Z B EY e n/a 40 5005 5070 5106 N
+ Z B F e n/a 40 5005 5068 5078 N
+ Z B G e n/a 40 5005 5068 5093 N
+ Z B HH b n/a 40 5005 5068 5075 N
+ Z B HH e n/a 40 5005 5068 5075 N
+ Z B IH b n/a 40 5005 5070 5100 N
+ Z B IH e n/a 40 5005 5070 5098 N
+ Z B IH i n/a 40 5005 5070 5100 N
+ Z B IY b n/a 40 5005 5070 5101 N
+ Z B IY e n/a 40 5005 5070 5098 N
+ Z B IY i n/a 40 5005 5070 5101 N
+ Z B JH e n/a 40 5005 5068 5086 N
+ Z B K b n/a 40 5005 5068 5092 N
+ Z B K e n/a 40 5005 5068 5092 N
+ Z B L b n/a 40 5005 5068 5114 N
+ Z B L e n/a 40 5005 5068 5114 N
+ Z B M b n/a 40 5005 5068 5112 N
+ Z B M e n/a 40 5005 5068 5112 N
+ Z B M i n/a 40 5005 5068 5112 N
+ Z B N b n/a 40 5005 5068 5113 N
+ Z B N e n/a 40 5005 5068 5113 N
+ Z B NG e n/a 40 5005 5068 5112 N
+ Z B OW b n/a 40 5005 5070 5095 N
+ Z B OW e n/a 40 5005 5070 5096 N
+ Z B OY e n/a 40 5005 5070 5096 N
+ Z B P e n/a 40 5005 5068 5090 N
+ Z B R b n/a 40 5005 5068 5116 N
+ Z B R e n/a 40 5005 5068 5116 N
+ Z B S e n/a 40 5005 5068 5072 N
+ Z B SH e n/a 40 5005 5068 5077 N
+ Z B SIL e n/a 40 5005 5068 5082 N
+ Z B T e n/a 40 5005 5068 5088 N
+ Z B TH e n/a 40 5005 5068 5072 N
+ Z B UH b n/a 40 5005 5070 5100 N
+ Z B UH e n/a 40 5005 5070 5098 N
+ Z B UH i n/a 40 5005 5070 5100 N
+ Z B UW b n/a 40 5005 5070 5097 N
+ Z B UW e n/a 40 5005 5070 5097 N
+ Z B UW i n/a 40 5005 5070 5097 N
+ Z B V b n/a 40 5005 5068 5072 N
+ Z B V e n/a 40 5005 5068 5072 N
+ Z B W b n/a 40 5005 5068 5115 N
+ Z B W e n/a 40 5005 5068 5115 N
+ Z B Y b n/a 40 5005 5068 5076 N
+ Z B Y e n/a 40 5005 5068 5076 N
+ Z B Z b n/a 40 5005 5068 5072 N
+ Z B Z e n/a 40 5005 5068 5072 N
+ Z B Z i n/a 40 5005 5068 5072 N
+ Z B ZH e n/a 40 5005 5068 5072 N
+ Z CH AA b n/a 40 5004 5070 5095 N
+ Z CH AA e n/a 40 5004 5070 5096 N
+ Z CH AE b n/a 40 5004 5070 5104 N
+ Z CH AE e n/a 40 5004 5070 5105 N
+ Z CH AH b n/a 40 5004 5070 5109 N
+ Z CH AH e n/a 40 5004 5070 5109 N
+ Z CH AO b n/a 40 5004 5070 5095 N
+ Z CH AO e n/a 40 5004 5070 5096 N
+ Z CH AW b n/a 40 5004 5070 5104 N
+ Z CH AW e n/a 40 5004 5070 5104 N
+ Z CH AY b n/a 40 5004 5070 5094 N
+ Z CH AY e n/a 40 5004 5070 5096 N
+ Z CH B b n/a 40 5004 5068 5091 N
+ Z CH B e n/a 40 5004 5068 5091 N
+ Z CH CH e n/a 40 5004 5068 5088 N
+ Z CH D b n/a 40 5004 5068 5086 N
+ Z CH D e n/a 40 5004 5068 5086 N
+ Z CH DH e n/a 40 5004 5068 5072 N
+ Z CH EH b n/a 40 5004 5070 5104 N
+ Z CH EH e n/a 40 5004 5070 5106 N
+ Z CH ER b n/a 40 5004 5070 5110 N
+ Z CH ER e n/a 40 5004 5070 5111 N
+ Z CH ER i n/a 40 5004 5070 5110 N
+ Z CH EY b n/a 40 5004 5070 5104 N
+ Z CH EY e n/a 40 5004 5070 5106 N
+ Z CH F e n/a 40 5004 5068 5078 N
+ Z CH G e n/a 40 5004 5068 5093 N
+ Z CH HH b n/a 40 5004 5068 5075 N
+ Z CH HH e n/a 40 5004 5068 5075 N
+ Z CH IH b n/a 40 5004 5070 5100 N
+ Z CH IH e n/a 40 5004 5070 5098 N
+ Z CH IY b n/a 40 5004 5070 5101 N
+ Z CH IY e n/a 40 5004 5070 5098 N
+ Z CH JH e n/a 40 5004 5068 5086 N
+ Z CH K b n/a 40 5004 5068 5092 N
+ Z CH K e n/a 40 5004 5068 5092 N
+ Z CH L b n/a 40 5004 5068 5114 N
+ Z CH L e n/a 40 5004 5068 5114 N
+ Z CH M b n/a 40 5004 5068 5112 N
+ Z CH M e n/a 40 5004 5068 5112 N
+ Z CH N b n/a 40 5004 5068 5113 N
+ Z CH N e n/a 40 5004 5068 5113 N
+ Z CH NG e n/a 40 5004 5068 5112 N
+ Z CH OW b n/a 40 5004 5070 5095 N
+ Z CH OW e n/a 40 5004 5070 5096 N
+ Z CH OY e n/a 40 5004 5070 5096 N
+ Z CH P e n/a 40 5004 5068 5090 N
+ Z CH R b n/a 40 5004 5068 5116 N
+ Z CH R e n/a 40 5004 5068 5116 N
+ Z CH S e n/a 40 5004 5068 5072 N
+ Z CH SH e n/a 40 5004 5068 5077 N
+ Z CH SIL e n/a 40 5004 5068 5082 N
+ Z CH T e n/a 40 5004 5068 5088 N
+ Z CH TH e n/a 40 5004 5068 5072 N
+ Z CH UH b n/a 40 5004 5070 5100 N
+ Z CH UH e n/a 40 5004 5070 5098 N
+ Z CH UW b n/a 40 5004 5070 5097 N
+ Z CH UW e n/a 40 5004 5070 5097 N
+ Z CH V b n/a 40 5004 5068 5072 N
+ Z CH V e n/a 40 5004 5068 5072 N
+ Z CH W b n/a 40 5004 5068 5115 N
+ Z CH W e n/a 40 5004 5068 5115 N
+ Z CH Y b n/a 40 5004 5068 5076 N
+ Z CH Y e n/a 40 5004 5068 5076 N
+ Z CH Z b n/a 40 5004 5068 5072 N
+ Z CH Z e n/a 40 5004 5068 5072 N
+ Z CH ZH e n/a 40 5004 5068 5072 N
+ Z D AA b n/a 40 5003 5070 5095 N
+ Z D AA e n/a 40 5003 5069 5096 N
+ Z D AA i n/a 40 5003 5070 5095 N
+ Z D AE b n/a 40 5003 5070 5104 N
+ Z D AE e n/a 40 5003 5069 5105 N
+ Z D AH b n/a 40 5003 5070 5107 N
+ Z D AH e n/a 40 5003 5069 5107 N
+ Z D AH i n/a 40 5003 5070 5102 N
+ Z D AO b n/a 40 5003 5070 5095 N
+ Z D AO e n/a 40 5003 5069 5096 N
+ Z D AO i n/a 40 5003 5070 5095 N
+ Z D AW b n/a 40 5003 5070 5104 N
+ Z D AW e n/a 40 5003 5069 5104 N
+ Z D AY b n/a 40 5003 5070 5094 N
+ Z D AY e n/a 40 5003 5069 5096 N
+ Z D AY i n/a 40 5003 5070 5094 N
+ Z D B b n/a 40 5003 5068 5091 N
+ Z D B e n/a 40 5003 5068 5091 N
+ Z D B i n/a 40 5003 5068 5091 N
+ Z D CH e n/a 40 5003 5068 5088 N
+ Z D D b n/a 40 5003 5068 5086 N
+ Z D D e n/a 40 5003 5068 5086 N
+ Z D D i n/a 40 5003 5068 5088 N
+ Z D DH e n/a 40 5003 5068 5072 N
+ Z D DH i n/a 40 5003 5068 5072 N
+ Z D EH b n/a 40 5003 5070 5104 N
+ Z D EH e n/a 40 5003 5069 5106 N
+ Z D EH i n/a 40 5003 5070 5104 N
+ Z D ER b n/a 40 5003 5070 5110 N
+ Z D ER e n/a 40 5003 5069 5111 N
+ Z D ER i n/a 40 5003 5070 5110 N
+ Z D EY b n/a 40 5003 5070 5104 N
+ Z D EY e n/a 40 5003 5069 5106 N
+ Z D EY i n/a 40 5003 5070 5104 N
+ Z D F e n/a 40 5003 5068 5078 N
+ Z D G e n/a 40 5003 5068 5093 N
+ Z D HH b n/a 40 5003 5068 5075 N
+ Z D HH e n/a 40 5003 5068 5075 N
+ Z D HH i n/a 40 5003 5068 5075 N
+ Z D IH b n/a 40 5003 5070 5100 N
+ Z D IH e n/a 40 5003 5069 5098 N
+ Z D IH i n/a 40 5003 5070 5100 N
+ Z D IY b n/a 40 5003 5070 5101 N
+ Z D IY e n/a 40 5003 5069 5098 N
+ Z D IY i n/a 40 5003 5070 5101 N
+ Z D JH e n/a 40 5003 5068 5086 N
+ Z D K b n/a 40 5003 5068 5092 N
+ Z D K e n/a 40 5003 5068 5092 N
+ Z D L b n/a 40 5003 5068 5114 N
+ Z D L e n/a 40 5003 5068 5114 N
+ Z D L i n/a 40 5003 5068 5114 N
+ Z D M b n/a 40 5003 5068 5112 N
+ Z D M e n/a 40 5003 5068 5112 N
+ Z D M i n/a 40 5003 5068 5112 N
+ Z D N b n/a 40 5003 5068 5113 N
+ Z D N e n/a 40 5003 5068 5113 N
+ Z D N i n/a 40 5003 5068 5113 N
+ Z D NG e n/a 40 5003 5068 5112 N
+ Z D OW b n/a 40 5003 5070 5095 N
+ Z D OW e n/a 40 5003 5069 5096 N
+ Z D OY e n/a 40 5003 5069 5096 N
+ Z D P e n/a 40 5003 5068 5090 N
+ Z D P i n/a 40 5003 5068 5090 N
+ Z D R b n/a 40 5003 5068 5116 N
+ Z D R e n/a 40 5003 5068 5116 N
+ Z D R i n/a 40 5003 5068 5116 N
+ Z D S e n/a 40 5003 5068 5072 N
+ Z D SH e n/a 40 5003 5068 5077 N
+ Z D SIL e n/a 40 5003 5067 5081 N
+ Z D T e n/a 40 5003 5068 5088 N
+ Z D T i n/a 40 5003 5068 5088 N
+ Z D TH e n/a 40 5003 5068 5072 N
+ Z D UH b n/a 40 5003 5070 5100 N
+ Z D UH e n/a 40 5003 5069 5098 N
+ Z D UW b n/a 40 5003 5070 5097 N
+ Z D UW e n/a 40 5003 5069 5097 N
+ Z D UW i n/a 40 5003 5070 5097 N
+ Z D V b n/a 40 5003 5068 5072 N
+ Z D V e n/a 40 5003 5068 5072 N
+ Z D V i n/a 40 5003 5068 5072 N
+ Z D W b n/a 40 5003 5068 5115 N
+ Z D W e n/a 40 5003 5068 5115 N
+ Z D W i n/a 40 5003 5068 5115 N
+ Z D Y b n/a 40 5003 5068 5076 N
+ Z D Y e n/a 40 5003 5068 5076 N
+ Z D Z b n/a 40 5003 5068 5072 N
+ Z D Z e n/a 40 5003 5068 5072 N
+ Z D ZH e n/a 40 5003 5068 5072 N
+ Z DH AA b n/a 40 5004 5070 5095 N
+ Z DH AA e n/a 40 5004 5070 5096 N
+ Z DH AE b n/a 40 5004 5070 5104 N
+ Z DH AE e n/a 40 5004 5070 5105 N
+ Z DH AH b n/a 40 5004 5070 5109 N
+ Z DH AH e n/a 40 5004 5070 5109 N
+ Z DH AH i n/a 40 5004 5070 5103 N
+ Z DH AO b n/a 40 5004 5070 5095 N
+ Z DH AO e n/a 40 5004 5070 5096 N
+ Z DH AW b n/a 40 5004 5070 5104 N
+ Z DH AW e n/a 40 5004 5070 5104 N
+ Z DH AY b n/a 40 5004 5070 5094 N
+ Z DH AY e n/a 40 5004 5070 5096 N
+ Z DH B b n/a 40 5004 5055 5091 N
+ Z DH B e n/a 40 5004 5055 5091 N
+ Z DH CH e n/a 40 5004 5055 5088 N
+ Z DH D b n/a 40 5004 5055 5086 N
+ Z DH D e n/a 40 5004 5055 5086 N
+ Z DH DH e n/a 40 5004 5055 5072 N
+ Z DH EH b n/a 40 5004 5070 5104 N
+ Z DH EH e n/a 40 5004 5070 5106 N
+ Z DH ER b n/a 40 5004 5070 5110 N
+ Z DH ER e n/a 40 5004 5070 5111 N
+ Z DH EY b n/a 40 5004 5070 5104 N
+ Z DH EY e n/a 40 5004 5070 5106 N
+ Z DH F e n/a 40 5004 5055 5078 N
+ Z DH G e n/a 40 5004 5055 5093 N
+ Z DH HH b n/a 40 5004 5055 5075 N
+ Z DH HH e n/a 40 5004 5055 5075 N
+ Z DH IH b n/a 40 5004 5070 5100 N
+ Z DH IH e n/a 40 5004 5070 5098 N
+ Z DH IY b n/a 40 5004 5070 5101 N
+ Z DH IY e n/a 40 5004 5070 5098 N
+ Z DH JH e n/a 40 5004 5055 5086 N
+ Z DH K b n/a 40 5004 5055 5092 N
+ Z DH K e n/a 40 5004 5055 5092 N
+ Z DH L b n/a 40 5004 5055 5114 N
+ Z DH L e n/a 40 5004 5055 5114 N
+ Z DH M b n/a 40 5004 5055 5112 N
+ Z DH M e n/a 40 5004 5055 5112 N
+ Z DH N b n/a 40 5004 5055 5113 N
+ Z DH N e n/a 40 5004 5055 5113 N
+ Z DH NG e n/a 40 5004 5055 5112 N
+ Z DH OW b n/a 40 5004 5070 5095 N
+ Z DH OW e n/a 40 5004 5070 5096 N
+ Z DH OY e n/a 40 5004 5070 5096 N
+ Z DH P e n/a 40 5004 5055 5090 N
+ Z DH R b n/a 40 5004 5055 5116 N
+ Z DH R e n/a 40 5004 5055 5116 N
+ Z DH S e n/a 40 5004 5055 5072 N
+ Z DH SH e n/a 40 5004 5055 5077 N
+ Z DH SIL e n/a 40 5004 5055 5082 N
+ Z DH T e n/a 40 5004 5055 5088 N
+ Z DH T i n/a 40 5004 5055 5088 N
+ Z DH TH e n/a 40 5004 5055 5072 N
+ Z DH UH b n/a 40 5004 5070 5100 N
+ Z DH UH e n/a 40 5004 5070 5098 N
+ Z DH UW b n/a 40 5004 5070 5097 N
+ Z DH UW e n/a 40 5004 5070 5097 N
+ Z DH V b n/a 40 5004 5055 5072 N
+ Z DH V e n/a 40 5004 5055 5072 N
+ Z DH W b n/a 40 5004 5055 5115 N
+ Z DH W e n/a 40 5004 5055 5115 N
+ Z DH Y b n/a 40 5004 5055 5076 N
+ Z DH Y e n/a 40 5004 5055 5076 N
+ Z DH Z b n/a 40 5004 5055 5072 N
+ Z DH Z e n/a 40 5004 5055 5072 N
+ Z DH ZH e n/a 40 5004 5055 5072 N
+ Z EH AA b n/a 40 5011 5063 5095 N
+ Z EH AA e n/a 40 5011 5063 5095 N
+ Z EH AA i n/a 40 5011 5063 5095 N
+ Z EH AE b n/a 40 5011 5060 5104 N
+ Z EH AE e n/a 40 5011 5060 5106 N
+ Z EH AE i n/a 40 5011 5060 5104 N
+ Z EH AH b n/a 40 5011 5060 5107 N
+ Z EH AH e n/a 40 5011 5060 5107 N
+ Z EH AH i n/a 40 5011 5060 5103 N
+ Z EH AO b n/a 40 5011 5060 5095 N
+ Z EH AO e n/a 40 5011 5063 5095 N
+ Z EH AW b n/a 40 5011 5060 5104 N
+ Z EH AW e n/a 40 5011 5060 5104 N
+ Z EH AW i n/a 40 5011 5060 5104 N
+ Z EH AY b n/a 40 5011 5063 5094 N
+ Z EH AY e n/a 40 5011 5063 5094 N
+ Z EH AY i n/a 40 5011 5063 5094 N
+ Z EH B b n/a 40 5011 5030 5091 N
+ Z EH B e n/a 40 5011 5030 5091 N
+ Z EH B i n/a 40 5011 5030 5091 N
+ Z EH CH e n/a 40 5012 5041 5088 N
+ Z EH D b n/a 40 5011 5030 5086 N
+ Z EH D e n/a 40 5011 5030 5086 N
+ Z EH D i n/a 40 5011 5030 5088 N
+ Z EH DH e n/a 40 5011 5031 5073 N
+ Z EH EH b n/a 40 5011 5060 5104 N
+ Z EH EH e n/a 40 5011 5060 5106 N
+ Z EH EH i n/a 40 5011 5060 5104 N
+ Z EH ER b n/a 40 5011 5060 5110 N
+ Z EH ER e n/a 40 5011 5063 5111 N
+ Z EH ER i n/a 40 5011 5060 5110 N
+ Z EH EY b n/a 40 5011 5060 5104 N
+ Z EH EY e n/a 40 5011 5060 5106 N
+ Z EH EY i n/a 40 5011 5060 5104 N
+ Z EH F e n/a 40 5012 5041 5078 N
+ Z EH G e n/a 40 5011 5030 5093 N
+ Z EH HH b n/a 40 5012 5038 5075 N
+ Z EH HH e n/a 40 5012 5038 5075 N
+ Z EH IH b n/a 40 5011 5060 5100 N
+ Z EH IH e n/a 40 5011 5060 5099 N
+ Z EH IH i n/a 40 5011 5060 5100 N
+ Z EH IY b n/a 40 5011 5060 5101 N
+ Z EH IY e n/a 40 5011 5060 5098 N
+ Z EH IY i n/a 40 5011 5060 5101 N
+ Z EH JH e n/a 40 5012 5034 5086 N
+ Z EH JH i n/a 40 5012 5034 5088 N
+ Z EH K b n/a 40 5012 5042 5092 N
+ Z EH K e n/a 40 5012 5042 5092 N
+ Z EH K i n/a 40 5012 5042 5092 N
+ Z EH L b n/a 40 5011 5030 5114 N
+ Z EH L e n/a 40 5011 5030 5114 N
+ Z EH L i n/a 40 5011 5030 5114 N
+ Z EH M b n/a 40 5011 5030 5112 N
+ Z EH M e n/a 40 5011 5030 5112 N
+ Z EH M i n/a 40 5011 5030 5112 N
+ Z EH N b n/a 40 5011 5030 5113 N
+ Z EH N e n/a 40 5011 5030 5113 N
+ Z EH N i n/a 40 5011 5030 5113 N
+ Z EH NG e n/a 40 5011 5030 5112 N
+ Z EH OW b n/a 40 5011 5060 5095 N
+ Z EH OW e n/a 40 5011 5063 5095 N
+ Z EH OW i n/a 40 5011 5060 5095 N
+ Z EH OY e n/a 40 5011 5063 5094 N
+ Z EH P e n/a 40 5012 5041 5090 N
+ Z EH P i n/a 40 5012 5041 5090 N
+ Z EH R b n/a 40 5011 5037 5116 N
+ Z EH R e n/a 40 5011 5037 5116 N
+ Z EH R i n/a 40 5011 5037 5116 N
+ Z EH S e n/a 40 5012 5039 5071 N
+ Z EH SH e n/a 40 5012 5035 5077 N
+ Z EH SIL e n/a 40 5011 5044 5084 N
+ Z EH T e n/a 40 5012 5041 5088 N
+ Z EH TH e n/a 40 5012 5039 5073 N
+ Z EH UH b n/a 40 5011 5060 5100 N
+ Z EH UH e n/a 40 5011 5063 5099 N
+ Z EH UW b n/a 40 5011 5060 5097 N
+ Z EH UW e n/a 40 5011 5063 5097 N
+ Z EH UW i n/a 40 5011 5060 5097 N
+ Z EH V b n/a 40 5011 5030 5074 N
+ Z EH V e n/a 40 5011 5030 5074 N
+ Z EH V i n/a 40 5011 5030 5074 N
+ Z EH W b n/a 40 5011 5036 5115 N
+ Z EH W e n/a 40 5011 5036 5115 N
+ Z EH Y b n/a 40 5012 5035 5076 N
+ Z EH Y e n/a 40 5012 5035 5076 N
+ Z EH Z b n/a 40 5011 5030 5074 N
+ Z EH Z e n/a 40 5011 5030 5074 N
+ Z EH Z i n/a 40 5011 5030 5074 N
+ Z EH ZH e n/a 40 5012 5034 5074 N
+ Z ER AA b n/a 40 5025 5066 5095 N
+ Z ER AA e n/a 40 5025 5066 5096 N
+ Z ER AA i n/a 40 5025 5066 5095 N
+ Z ER AE b n/a 40 5025 5066 5104 N
+ Z ER AE e n/a 40 5025 5066 5105 N
+ Z ER AE i n/a 40 5025 5066 5104 N
+ Z ER AH b n/a 40 5025 5066 5109 N
+ Z ER AH e n/a 40 5025 5066 5109 N
+ Z ER AH i n/a 40 5025 5066 5102 N
+ Z ER AO b n/a 40 5025 5066 5095 N
+ Z ER AO e n/a 40 5025 5066 5096 N
+ Z ER AO i n/a 40 5025 5066 5095 N
+ Z ER AW b n/a 40 5025 5066 5104 N
+ Z ER AW e n/a 40 5025 5066 5104 N
+ Z ER AY b n/a 40 5025 5066 5094 N
+ Z ER AY e n/a 40 5025 5066 5096 N
+ Z ER AY i n/a 40 5025 5066 5094 N
+ Z ER B b n/a 40 5025 5045 5091 N
+ Z ER B e n/a 40 5025 5045 5091 N
+ Z ER B i n/a 40 5025 5045 5091 N
+ Z ER CH e n/a 40 5025 5045 5088 N
+ Z ER D b n/a 40 5025 5045 5086 N
+ Z ER D e n/a 40 5025 5045 5086 N
+ Z ER D i n/a 40 5025 5045 5088 N
+ Z ER DH e n/a 40 5025 5045 5072 N
+ Z ER EH b n/a 40 5025 5066 5104 N
+ Z ER EH e n/a 40 5025 5066 5106 N
+ Z ER EH i n/a 40 5025 5066 5104 N
+ Z ER ER b n/a 40 5025 5066 5110 N
+ Z ER ER e n/a 40 5025 5066 5111 N
+ Z ER ER i n/a 40 5025 5066 5110 N
+ Z ER EY b n/a 40 5025 5066 5104 N
+ Z ER EY e n/a 40 5025 5066 5106 N
+ Z ER EY i n/a 40 5025 5066 5104 N
+ Z ER F e n/a 40 5025 5045 5078 N
+ Z ER F i n/a 40 5025 5045 5078 N
+ Z ER G e n/a 40 5025 5045 5093 N
+ Z ER HH b n/a 40 5025 5045 5075 N
+ Z ER HH e n/a 40 5025 5045 5075 N
+ Z ER HH i n/a 40 5025 5045 5075 N
+ Z ER IH b n/a 40 5025 5066 5100 N
+ Z ER IH e n/a 40 5025 5066 5098 N
+ Z ER IH i n/a 40 5025 5066 5100 N
+ Z ER IY b n/a 40 5025 5066 5101 N
+ Z ER IY e n/a 40 5025 5066 5098 N
+ Z ER IY i n/a 40 5025 5066 5101 N
+ Z ER JH e n/a 40 5025 5045 5086 N
+ Z ER K b n/a 40 5025 5045 5092 N
+ Z ER K e n/a 40 5025 5045 5092 N
+ Z ER K i n/a 40 5025 5045 5092 N
+ Z ER L b n/a 40 5025 5045 5114 N
+ Z ER L e n/a 40 5025 5045 5114 N
+ Z ER L i n/a 40 5025 5045 5114 N
+ Z ER M b n/a 40 5025 5045 5112 N
+ Z ER M e n/a 40 5025 5045 5112 N
+ Z ER M i n/a 40 5025 5045 5112 N
+ Z ER N b n/a 40 5025 5045 5113 N
+ Z ER N e n/a 40 5025 5045 5113 N
+ Z ER N i n/a 40 5025 5045 5113 N
+ Z ER NG e n/a 40 5025 5045 5112 N
+ Z ER OW b n/a 40 5025 5066 5095 N
+ Z ER OW e n/a 40 5025 5066 5096 N
+ Z ER OY e n/a 40 5025 5066 5096 N
+ Z ER P e n/a 40 5025 5045 5090 N
+ Z ER P i n/a 40 5025 5045 5090 N
+ Z ER R b n/a 40 5025 5045 5116 N
+ Z ER R e n/a 40 5025 5045 5116 N
+ Z ER S e n/a 40 5025 5046 5072 N
+ Z ER SH e n/a 40 5025 5045 5077 N
+ Z ER SIL e n/a 40 5026 5046 5080 N
+ Z ER T e n/a 40 5025 5046 5088 N
+ Z ER T i n/a 40 5025 5046 5088 N
+ Z ER TH e n/a 40 5025 5046 5072 N
+ Z ER UH b n/a 40 5025 5066 5100 N
+ Z ER UH e n/a 40 5025 5066 5098 N
+ Z ER UH i n/a 40 5025 5066 5100 N
+ Z ER UW b n/a 40 5025 5066 5097 N
+ Z ER UW e n/a 40 5025 5066 5097 N
+ Z ER UW i n/a 40 5025 5066 5097 N
+ Z ER V b n/a 40 5025 5045 5072 N
+ Z ER V e n/a 40 5025 5045 5072 N
+ Z ER V i n/a 40 5025 5045 5072 N
+ Z ER W b n/a 40 5025 5045 5115 N
+ Z ER W e n/a 40 5025 5045 5115 N
+ Z ER W i n/a 40 5025 5045 5115 N
+ Z ER Y b n/a 40 5025 5045 5076 N
+ Z ER Y e n/a 40 5025 5045 5076 N
+ Z ER Z b n/a 40 5025 5045 5072 N
+ Z ER Z e n/a 40 5025 5045 5072 N
+ Z ER ZH e n/a 40 5025 5045 5072 N
+ Z EY AA b n/a 40 5027 5064 5095 N
+ Z EY AA e n/a 40 5027 5064 5095 N
+ Z EY AA i n/a 40 5027 5064 5095 N
+ Z EY AE b n/a 40 5027 5064 5104 N
+ Z EY AE e n/a 40 5027 5064 5105 N
+ Z EY AE i n/a 40 5027 5064 5104 N
+ Z EY AH b n/a 40 5027 5064 5109 N
+ Z EY AH e n/a 40 5027 5064 5109 N
+ Z EY AH i n/a 40 5027 5064 5103 N
+ Z EY AO b n/a 40 5027 5064 5095 N
+ Z EY AO e n/a 40 5027 5064 5095 N
+ Z EY AW b n/a 40 5027 5064 5104 N
+ Z EY AW e n/a 40 5027 5064 5104 N
+ Z EY AW i n/a 40 5027 5064 5104 N
+ Z EY AY b n/a 40 5027 5064 5094 N
+ Z EY AY e n/a 40 5027 5064 5094 N
+ Z EY AY i n/a 40 5027 5064 5094 N
+ Z EY B b n/a 40 5027 5047 5091 N
+ Z EY B e n/a 40 5027 5047 5091 N
+ Z EY B i n/a 40 5027 5047 5091 N
+ Z EY CH e n/a 40 5027 5049 5088 N
+ Z EY D b n/a 40 5027 5047 5086 N
+ Z EY D e n/a 40 5027 5047 5086 N
+ Z EY D i n/a 40 5027 5047 5088 N
+ Z EY DH e n/a 40 5027 5047 5073 N
+ Z EY EH b n/a 40 5027 5064 5104 N
+ Z EY EH e n/a 40 5027 5064 5106 N
+ Z EY EH i n/a 40 5027 5064 5104 N
+ Z EY ER b n/a 40 5027 5064 5110 N
+ Z EY ER e n/a 40 5027 5064 5111 N
+ Z EY ER i n/a 40 5027 5064 5110 N
+ Z EY EY b n/a 40 5027 5064 5104 N
+ Z EY EY e n/a 40 5027 5064 5106 N
+ Z EY EY i n/a 40 5027 5064 5104 N
+ Z EY F e n/a 40 5027 5049 5078 N
+ Z EY F i n/a 40 5027 5049 5078 N
+ Z EY G e n/a 40 5027 5047 5093 N
+ Z EY HH b n/a 40 5027 5049 5075 N
+ Z EY HH e n/a 40 5027 5049 5075 N
+ Z EY HH i n/a 40 5027 5049 5075 N
+ Z EY IH b n/a 40 5027 5064 5100 N
+ Z EY IH e n/a 40 5027 5064 5098 N
+ Z EY IH i n/a 40 5027 5064 5100 N
+ Z EY IY b n/a 40 5027 5064 5101 N
+ Z EY IY e n/a 40 5027 5064 5098 N
+ Z EY IY i n/a 40 5027 5064 5101 N
+ Z EY JH e n/a 40 5027 5047 5086 N
+ Z EY K b n/a 40 5027 5049 5092 N
+ Z EY K e n/a 40 5027 5049 5092 N
+ Z EY L b n/a 40 5027 5047 5114 N
+ Z EY L e n/a 40 5027 5047 5114 N
+ Z EY L i n/a 40 5027 5047 5114 N
+ Z EY M b n/a 40 5027 5047 5112 N
+ Z EY M e n/a 40 5027 5047 5112 N
+ Z EY M i n/a 40 5027 5047 5112 N
+ Z EY N b n/a 40 5027 5047 5113 N
+ Z EY N e n/a 40 5027 5047 5113 N
+ Z EY N i n/a 40 5027 5047 5113 N
+ Z EY NG e n/a 40 5027 5047 5112 N
+ Z EY OW b n/a 40 5027 5064 5095 N
+ Z EY OW e n/a 40 5027 5064 5095 N
+ Z EY OW i n/a 40 5027 5064 5095 N
+ Z EY OY e n/a 40 5027 5064 5094 N
+ Z EY P e n/a 40 5027 5049 5090 N
+ Z EY R b n/a 40 5027 5048 5116 N
+ Z EY R e n/a 40 5027 5048 5116 N
+ Z EY S e n/a 40 5027 5049 5071 N
+ Z EY SH e n/a 40 5027 5049 5077 N
+ Z EY SIL e n/a 40 5028 5049 5085 N
+ Z EY T e n/a 40 5027 5049 5088 N
+ Z EY T i n/a 40 5027 5049 5088 N
+ Z EY TH e n/a 40 5027 5049 5073 N
+ Z EY UH b n/a 40 5027 5064 5100 N
+ Z EY UH e n/a 40 5027 5064 5098 N
+ Z EY UW b n/a 40 5027 5064 5097 N
+ Z EY UW e n/a 40 5027 5064 5097 N
+ Z EY UW i n/a 40 5027 5064 5097 N
+ Z EY V b n/a 40 5027 5047 5074 N
+ Z EY V e n/a 40 5027 5047 5074 N
+ Z EY W b n/a 40 5027 5048 5115 N
+ Z EY W e n/a 40 5027 5048 5115 N
+ Z EY W i n/a 40 5027 5048 5115 N
+ Z EY Y b n/a 40 5027 5047 5076 N
+ Z EY Y e n/a 40 5027 5047 5076 N
+ Z EY Z b n/a 40 5027 5047 5074 N
+ Z EY Z e n/a 40 5027 5047 5074 N
+ Z EY ZH e n/a 40 5027 5047 5074 N
+ Z F AA b n/a 40 5004 5070 5095 N
+ Z F AA e n/a 40 5004 5070 5096 N
+ Z F AE b n/a 40 5004 5070 5104 N
+ Z F AE e n/a 40 5004 5070 5105 N
+ Z F AH b n/a 40 5004 5070 5109 N
+ Z F AH e n/a 40 5004 5070 5109 N
+ Z F AO b n/a 40 5004 5070 5095 N
+ Z F AO e n/a 40 5004 5070 5096 N
+ Z F AW b n/a 40 5004 5070 5104 N
+ Z F AW e n/a 40 5004 5070 5104 N
+ Z F AY b n/a 40 5004 5070 5094 N
+ Z F AY e n/a 40 5004 5070 5096 N
+ Z F B b n/a 40 5004 5055 5091 N
+ Z F B e n/a 40 5004 5055 5091 N
+ Z F CH e n/a 40 5004 5055 5088 N
+ Z F D b n/a 40 5004 5055 5086 N
+ Z F D e n/a 40 5004 5055 5086 N
+ Z F DH e n/a 40 5004 5055 5072 N
+ Z F EH b n/a 40 5004 5070 5104 N
+ Z F EH e n/a 40 5004 5070 5106 N
+ Z F ER b n/a 40 5004 5070 5110 N
+ Z F ER e n/a 40 5004 5070 5111 N
+ Z F EY b n/a 40 5004 5070 5104 N
+ Z F EY e n/a 40 5004 5070 5106 N
+ Z F F e n/a 40 5004 5055 5078 N
+ Z F G e n/a 40 5004 5055 5093 N
+ Z F HH b n/a 40 5004 5055 5075 N
+ Z F HH e n/a 40 5004 5055 5075 N
+ Z F IH b n/a 40 5004 5070 5100 N
+ Z F IH e n/a 40 5004 5070 5098 N
+ Z F IH i n/a 40 5004 5070 5100 N
+ Z F IY b n/a 40 5004 5070 5101 N
+ Z F IY e n/a 40 5004 5070 5098 N
+ Z F JH e n/a 40 5004 5055 5086 N
+ Z F K b n/a 40 5004 5055 5092 N
+ Z F K e n/a 40 5004 5055 5092 N
+ Z F L b n/a 40 5004 5055 5114 N
+ Z F L e n/a 40 5004 5055 5114 N
+ Z F M b n/a 40 5004 5055 5112 N
+ Z F M e n/a 40 5004 5055 5112 N
+ Z F N b n/a 40 5004 5055 5113 N
+ Z F N e n/a 40 5004 5055 5113 N
+ Z F NG e n/a 40 5004 5055 5112 N
+ Z F OW b n/a 40 5004 5070 5095 N
+ Z F OW e n/a 40 5004 5070 5096 N
+ Z F OY e n/a 40 5004 5070 5096 N
+ Z F P e n/a 40 5004 5055 5090 N
+ Z F R b n/a 40 5004 5055 5116 N
+ Z F R e n/a 40 5004 5055 5116 N
+ Z F S e n/a 40 5004 5055 5072 N
+ Z F SH e n/a 40 5004 5055 5077 N
+ Z F SIL e n/a 40 5004 5055 5082 N
+ Z F T e n/a 40 5004 5055 5088 N
+ Z F TH e n/a 40 5004 5055 5072 N
+ Z F UH b n/a 40 5004 5070 5100 N
+ Z F UH e n/a 40 5004 5070 5098 N
+ Z F UW b n/a 40 5004 5070 5097 N
+ Z F UW e n/a 40 5004 5070 5097 N
+ Z F V b n/a 40 5004 5055 5072 N
+ Z F V e n/a 40 5004 5055 5072 N
+ Z F W b n/a 40 5004 5055 5115 N
+ Z F W e n/a 40 5004 5055 5115 N
+ Z F Y b n/a 40 5004 5055 5076 N
+ Z F Y e n/a 40 5004 5055 5076 N
+ Z F Z b n/a 40 5004 5055 5072 N
+ Z F Z e n/a 40 5004 5055 5072 N
+ Z F ZH e n/a 40 5004 5055 5072 N
+ Z G AA b n/a 40 5004 5070 5095 N
+ Z G AA e n/a 40 5004 5070 5096 N
+ Z G AA i n/a 40 5004 5070 5095 N
+ Z G AE b n/a 40 5004 5070 5104 N
+ Z G AE e n/a 40 5004 5070 5105 N
+ Z G AE i n/a 40 5004 5070 5104 N
+ Z G AH b n/a 40 5004 5070 5109 N
+ Z G AH e n/a 40 5004 5070 5109 N
+ Z G AH i n/a 40 5004 5070 5103 N
+ Z G AO b n/a 40 5004 5070 5095 N
+ Z G AO e n/a 40 5004 5070 5096 N
+ Z G AO i n/a 40 5004 5070 5095 N
+ Z G AW b n/a 40 5004 5070 5104 N
+ Z G AW e n/a 40 5004 5070 5104 N
+ Z G AY b n/a 40 5004 5070 5094 N
+ Z G AY e n/a 40 5004 5070 5096 N
+ Z G AY i n/a 40 5004 5070 5094 N
+ Z G B b n/a 40 5004 5068 5091 N
+ Z G B e n/a 40 5004 5068 5091 N
+ Z G B i n/a 40 5004 5068 5091 N
+ Z G CH e n/a 40 5004 5068 5088 N
+ Z G D b n/a 40 5004 5068 5086 N
+ Z G D e n/a 40 5004 5068 5086 N
+ Z G D i n/a 40 5004 5068 5088 N
+ Z G DH e n/a 40 5004 5068 5072 N
+ Z G EH b n/a 40 5004 5070 5104 N
+ Z G EH e n/a 40 5004 5070 5106 N
+ Z G EH i n/a 40 5004 5070 5104 N
+ Z G ER b n/a 40 5004 5070 5110 N
+ Z G ER e n/a 40 5004 5070 5111 N
+ Z G ER i n/a 40 5004 5070 5110 N
+ Z G EY b n/a 40 5004 5070 5104 N
+ Z G EY e n/a 40 5004 5070 5106 N
+ Z G F e n/a 40 5004 5068 5078 N
+ Z G F i n/a 40 5004 5068 5078 N
+ Z G G e n/a 40 5004 5068 5093 N
+ Z G HH b n/a 40 5004 5068 5075 N
+ Z G HH e n/a 40 5004 5068 5075 N
+ Z G HH i n/a 40 5004 5068 5075 N
+ Z G IH b n/a 40 5004 5070 5100 N
+ Z G IH e n/a 40 5004 5070 5098 N
+ Z G IH i n/a 40 5004 5070 5100 N
+ Z G IY b n/a 40 5004 5070 5101 N
+ Z G IY e n/a 40 5004 5070 5098 N
+ Z G IY i n/a 40 5004 5070 5101 N
+ Z G JH e n/a 40 5004 5068 5086 N
+ Z G K b n/a 40 5004 5068 5092 N
+ Z G K e n/a 40 5004 5068 5092 N
+ Z G L b n/a 40 5004 5068 5114 N
+ Z G L e n/a 40 5004 5068 5114 N
+ Z G L i n/a 40 5004 5068 5114 N
+ Z G M b n/a 40 5004 5068 5112 N
+ Z G M e n/a 40 5004 5068 5112 N
+ Z G M i n/a 40 5004 5068 5112 N
+ Z G N b n/a 40 5004 5068 5113 N
+ Z G N e n/a 40 5004 5068 5113 N
+ Z G NG e n/a 40 5004 5068 5112 N
+ Z G OW b n/a 40 5004 5070 5095 N
+ Z G OW e n/a 40 5004 5070 5096 N
+ Z G OW i n/a 40 5004 5070 5095 N
+ Z G OY e n/a 40 5004 5070 5096 N
+ Z G P e n/a 40 5004 5068 5090 N
+ Z G R b n/a 40 5004 5068 5116 N
+ Z G R e n/a 40 5004 5068 5116 N
+ Z G S e n/a 40 5004 5068 5072 N
+ Z G SH e n/a 40 5004 5068 5077 N
+ Z G SIL e n/a 40 5004 5068 5081 N
+ Z G T e n/a 40 5004 5068 5088 N
+ Z G TH e n/a 40 5004 5068 5072 N
+ Z G UH b n/a 40 5004 5070 5100 N
+ Z G UH e n/a 40 5004 5070 5098 N
+ Z G UW b n/a 40 5004 5070 5097 N
+ Z G UW e n/a 40 5004 5070 5097 N
+ Z G UW i n/a 40 5004 5070 5097 N
+ Z G V b n/a 40 5004 5068 5072 N
+ Z G V e n/a 40 5004 5068 5072 N
+ Z G W b n/a 40 5004 5068 5115 N
+ Z G W e n/a 40 5004 5068 5115 N
+ Z G W i n/a 40 5004 5068 5115 N
+ Z G Y b n/a 40 5004 5068 5076 N
+ Z G Y e n/a 40 5004 5068 5076 N
+ Z G Z b n/a 40 5004 5068 5072 N
+ Z G Z e n/a 40 5004 5068 5072 N
+ Z G ZH e n/a 40 5004 5068 5072 N
+ Z HH AA b n/a 40 5004 5070 5095 N
+ Z HH AA e n/a 40 5004 5070 5096 N
+ Z HH AE b n/a 40 5004 5070 5104 N
+ Z HH AE e n/a 40 5004 5070 5105 N
+ Z HH AH b n/a 40 5004 5070 5109 N
+ Z HH AH e n/a 40 5004 5070 5109 N
+ Z HH AO b n/a 40 5004 5070 5095 N
+ Z HH AO e n/a 40 5004 5070 5096 N
+ Z HH AW b n/a 40 5004 5070 5104 N
+ Z HH AW e n/a 40 5004 5070 5104 N
+ Z HH AY b n/a 40 5004 5070 5094 N
+ Z HH AY e n/a 40 5004 5070 5096 N
+ Z HH B b n/a 40 5004 5054 5091 N
+ Z HH B e n/a 40 5004 5054 5091 N
+ Z HH CH e n/a 40 5004 5054 5088 N
+ Z HH D b n/a 40 5004 5054 5086 N
+ Z HH D e n/a 40 5004 5054 5086 N
+ Z HH DH e n/a 40 5004 5054 5072 N
+ Z HH EH b n/a 40 5004 5070 5104 N
+ Z HH EH e n/a 40 5004 5070 5106 N
+ Z HH ER b n/a 40 5004 5070 5110 N
+ Z HH ER e n/a 40 5004 5070 5111 N
+ Z HH EY b n/a 40 5004 5070 5104 N
+ Z HH EY e n/a 40 5004 5070 5106 N
+ Z HH F e n/a 40 5004 5054 5078 N
+ Z HH G e n/a 40 5004 5054 5093 N
+ Z HH HH b n/a 40 5004 5054 5075 N
+ Z HH HH e n/a 40 5004 5054 5075 N
+ Z HH IH b n/a 40 5004 5070 5100 N
+ Z HH IH e n/a 40 5004 5070 5098 N
+ Z HH IY b n/a 40 5004 5070 5101 N
+ Z HH IY e n/a 40 5004 5070 5098 N
+ Z HH JH e n/a 40 5004 5054 5086 N
+ Z HH K b n/a 40 5004 5054 5092 N
+ Z HH K e n/a 40 5004 5054 5092 N
+ Z HH L b n/a 40 5004 5054 5114 N
+ Z HH L e n/a 40 5004 5054 5114 N
+ Z HH M b n/a 40 5004 5054 5112 N
+ Z HH M e n/a 40 5004 5054 5112 N
+ Z HH N b n/a 40 5004 5054 5113 N
+ Z HH N e n/a 40 5004 5054 5113 N
+ Z HH NG e n/a 40 5004 5054 5112 N
+ Z HH OW b n/a 40 5004 5070 5095 N
+ Z HH OW e n/a 40 5004 5070 5096 N
+ Z HH OY e n/a 40 5004 5070 5096 N
+ Z HH P e n/a 40 5004 5054 5090 N
+ Z HH R b n/a 40 5004 5054 5116 N
+ Z HH R e n/a 40 5004 5054 5116 N
+ Z HH S e n/a 40 5004 5054 5072 N
+ Z HH SH e n/a 40 5004 5054 5077 N
+ Z HH SIL e n/a 40 5004 5054 5082 N
+ Z HH T e n/a 40 5004 5054 5088 N
+ Z HH TH e n/a 40 5004 5054 5072 N
+ Z HH UH b n/a 40 5004 5070 5100 N
+ Z HH UH e n/a 40 5004 5070 5098 N
+ Z HH UW b n/a 40 5004 5070 5097 N
+ Z HH UW e n/a 40 5004 5070 5097 N
+ Z HH V b n/a 40 5004 5054 5072 N
+ Z HH V e n/a 40 5004 5054 5072 N
+ Z HH W b n/a 40 5004 5054 5115 N
+ Z HH W e n/a 40 5004 5054 5115 N
+ Z HH Y b n/a 40 5004 5054 5076 N
+ Z HH Y e n/a 40 5004 5054 5076 N
+ Z HH Z b n/a 40 5004 5054 5072 N
+ Z HH Z e n/a 40 5004 5054 5072 N
+ Z HH ZH e n/a 40 5004 5054 5072 N
+ Z IH AA b n/a 40 5023 5063 5095 N
+ Z IH AA e n/a 40 5023 5063 5095 N
+ Z IH AA i n/a 40 5023 5063 5095 N
+ Z IH AE b n/a 40 5023 5062 5104 N
+ Z IH AE e n/a 40 5023 5062 5106 N
+ Z IH AE i n/a 40 5023 5062 5104 N
+ Z IH AH b n/a 40 5023 5062 5107 N
+ Z IH AH e n/a 40 5023 5062 5107 N
+ Z IH AH i n/a 40 5023 5062 5102 N
+ Z IH AO b n/a 40 5023 5062 5095 N
+ Z IH AO e n/a 40 5023 5063 5095 N
+ Z IH AO i n/a 40 5023 5062 5095 N
+ Z IH AW b n/a 40 5023 5062 5104 N
+ Z IH AW e n/a 40 5023 5062 5104 N
+ Z IH AW i n/a 40 5023 5062 5104 N
+ Z IH AY b n/a 40 5023 5063 5094 N
+ Z IH AY e n/a 40 5023 5063 5094 N
+ Z IH AY i n/a 40 5023 5063 5094 N
+ Z IH B b n/a 40 5022 5032 5091 N
+ Z IH B e n/a 40 5022 5032 5091 N
+ Z IH B i n/a 40 5022 5032 5091 N
+ Z IH CH e n/a 40 5020 5040 5087 N
+ Z IH D b n/a 40 5022 5033 5086 N
+ Z IH D e n/a 40 5022 5033 5086 N
+ Z IH D i n/a 40 5022 5033 5087 N
+ Z IH DH e n/a 40 5022 5033 5073 N
+ Z IH EH b n/a 40 5023 5062 5104 N
+ Z IH EH e n/a 40 5023 5062 5106 N
+ Z IH EH i n/a 40 5023 5062 5104 N
+ Z IH ER b n/a 40 5023 5062 5110 N
+ Z IH ER e n/a 40 5023 5063 5111 N
+ Z IH ER i n/a 40 5023 5062 5110 N
+ Z IH EY b n/a 40 5023 5062 5104 N
+ Z IH EY e n/a 40 5023 5062 5106 N
+ Z IH EY i n/a 40 5023 5062 5104 N
+ Z IH F e n/a 40 5020 5040 5078 N
+ Z IH G e n/a 40 5022 5032 5093 N
+ Z IH HH b n/a 40 5020 5038 5075 N
+ Z IH HH e n/a 40 5020 5038 5075 N
+ Z IH HH i n/a 40 5020 5038 5075 N
+ Z IH IH b n/a 40 5023 5062 5100 N
+ Z IH IH e n/a 40 5023 5062 5099 N
+ Z IH IH i n/a 40 5023 5062 5100 N
+ Z IH IY b n/a 40 5023 5062 5101 N
+ Z IH IY e n/a 40 5023 5062 5098 N
+ Z IH IY i n/a 40 5023 5062 5101 N
+ Z IH JH e n/a 40 5022 5034 5086 N
+ Z IH K b n/a 40 5020 5042 5092 N
+ Z IH K e n/a 40 5020 5042 5092 N
+ Z IH K i n/a 40 5020 5042 5092 N
+ Z IH L b n/a 40 5023 5032 5114 N
+ Z IH L e n/a 40 5023 5032 5114 N
+ Z IH L i n/a 40 5023 5032 5114 N
+ Z IH M b n/a 40 5023 5032 5112 N
+ Z IH M e n/a 40 5023 5032 5112 N
+ Z IH M i n/a 40 5023 5032 5112 N
+ Z IH N b n/a 40 5023 5032 5113 N
+ Z IH N e n/a 40 5023 5032 5113 N
+ Z IH N i n/a 40 5023 5032 5113 N
+ Z IH NG e n/a 40 5023 5032 5112 N
+ Z IH OW b n/a 40 5023 5062 5095 N
+ Z IH OW e n/a 40 5023 5063 5095 N
+ Z IH OW i n/a 40 5023 5062 5095 N
+ Z IH OY e n/a 40 5023 5063 5094 N
+ Z IH P e n/a 40 5020 5040 5090 N
+ Z IH R b n/a 40 5023 5037 5116 N
+ Z IH R e n/a 40 5023 5037 5116 N
+ Z IH R i n/a 40 5023 5037 5116 N
+ Z IH S e n/a 40 5020 5038 5071 N
+ Z IH SH e n/a 40 5020 5035 5077 N
+ Z IH SIL e n/a 40 5024 5044 5084 N
+ Z IH T e n/a 40 5020 5040 5087 N
+ Z IH T i n/a 40 5020 5040 5087 N
+ Z IH TH e n/a 40 5020 5038 5072 N
+ Z IH UH b n/a 40 5023 5062 5100 N
+ Z IH UH e n/a 40 5023 5063 5099 N
+ Z IH UW b n/a 40 5023 5062 5097 N
+ Z IH UW e n/a 40 5023 5063 5097 N
+ Z IH UW i n/a 40 5023 5062 5097 N
+ Z IH V b n/a 40 5022 5032 5074 N
+ Z IH V e n/a 40 5022 5032 5074 N
+ Z IH V i n/a 40 5022 5032 5074 N
+ Z IH W b n/a 40 5023 5036 5115 N
+ Z IH W e n/a 40 5023 5036 5115 N
+ Z IH W i n/a 40 5023 5036 5115 N
+ Z IH Y b n/a 40 5022 5035 5076 N
+ Z IH Y e n/a 40 5022 5035 5076 N
+ Z IH Z b n/a 40 5022 5033 5074 N
+ Z IH Z e n/a 40 5022 5033 5074 N
+ Z IH Z i n/a 40 5022 5033 5074 N
+ Z IH ZH e n/a 40 5022 5034 5074 N
+ Z IY AA b n/a 40 5027 5064 5095 N
+ Z IY AA e n/a 40 5027 5064 5095 N
+ Z IY AA i n/a 40 5027 5064 5095 N
+ Z IY AE b n/a 40 5027 5064 5104 N
+ Z IY AE e n/a 40 5027 5064 5105 N
+ Z IY AE i n/a 40 5027 5064 5104 N
+ Z IY AH b n/a 40 5027 5064 5109 N
+ Z IY AH e n/a 40 5027 5064 5109 N
+ Z IY AH i n/a 40 5027 5064 5100 N
+ Z IY AO b n/a 40 5027 5064 5095 N
+ Z IY AO e n/a 40 5027 5064 5095 N
+ Z IY AO i n/a 40 5027 5064 5095 N
+ Z IY AW b n/a 40 5027 5064 5104 N
+ Z IY AW e n/a 40 5027 5064 5104 N
+ Z IY AW i n/a 40 5027 5064 5104 N
+ Z IY AY b n/a 40 5027 5064 5094 N
+ Z IY AY e n/a 40 5027 5064 5094 N
+ Z IY AY i n/a 40 5027 5064 5094 N
+ Z IY B b n/a 40 5027 5047 5091 N
+ Z IY B e n/a 40 5027 5047 5091 N
+ Z IY B i n/a 40 5027 5047 5091 N
+ Z IY CH e n/a 40 5028 5049 5087 N
+ Z IY D b n/a 40 5027 5047 5086 N
+ Z IY D e n/a 40 5027 5047 5086 N
+ Z IY D i n/a 40 5027 5047 5087 N
+ Z IY DH e n/a 40 5027 5047 5073 N
+ Z IY EH b n/a 40 5027 5064 5104 N
+ Z IY EH e n/a 40 5027 5064 5106 N
+ Z IY EH i n/a 40 5027 5064 5104 N
+ Z IY ER b n/a 40 5027 5064 5110 N
+ Z IY ER e n/a 40 5027 5064 5111 N
+ Z IY ER i n/a 40 5027 5064 5110 N
+ Z IY EY b n/a 40 5027 5064 5104 N
+ Z IY EY e n/a 40 5027 5064 5106 N
+ Z IY EY i n/a 40 5027 5064 5104 N
+ Z IY F e n/a 40 5028 5049 5078 N
+ Z IY F i n/a 40 5028 5049 5078 N
+ Z IY G e n/a 40 5027 5047 5093 N
+ Z IY G i n/a 40 5027 5047 5093 N
+ Z IY HH b n/a 40 5028 5049 5075 N
+ Z IY HH e n/a 40 5028 5049 5075 N
+ Z IY IH b n/a 40 5027 5064 5100 N
+ Z IY IH e n/a 40 5027 5064 5098 N
+ Z IY IH i n/a 40 5027 5064 5100 N
+ Z IY IY b n/a 40 5027 5064 5101 N
+ Z IY IY e n/a 40 5027 5064 5098 N
+ Z IY IY i n/a 40 5027 5064 5101 N
+ Z IY JH e n/a 40 5027 5047 5086 N
+ Z IY K b n/a 40 5028 5049 5092 N
+ Z IY K e n/a 40 5028 5049 5092 N
+ Z IY K i n/a 40 5028 5049 5092 N
+ Z IY L b n/a 40 5027 5047 5114 N
+ Z IY L e n/a 40 5027 5047 5114 N
+ Z IY L i n/a 40 5027 5047 5114 N
+ Z IY M b n/a 40 5027 5047 5112 N
+ Z IY M e n/a 40 5027 5047 5112 N
+ Z IY M i n/a 40 5027 5047 5112 N
+ Z IY N b n/a 40 5027 5047 5113 N
+ Z IY N e n/a 40 5027 5047 5113 N
+ Z IY N i n/a 40 5027 5047 5113 N
+ Z IY NG e n/a 40 5027 5047 5112 N
+ Z IY OW b n/a 40 5027 5064 5095 N
+ Z IY OW e n/a 40 5027 5064 5095 N
+ Z IY OW i n/a 40 5027 5064 5095 N
+ Z IY OY e n/a 40 5027 5064 5094 N
+ Z IY P e n/a 40 5028 5049 5090 N
+ Z IY R b n/a 40 5027 5048 5116 N
+ Z IY R e n/a 40 5027 5048 5116 N
+ Z IY R i n/a 40 5027 5048 5116 N
+ Z IY S e n/a 40 5028 5049 5071 N
+ Z IY S i n/a 40 5028 5049 5071 N
+ Z IY SH e n/a 40 5028 5049 5077 N
+ Z IY SIL e n/a 40 5028 5049 5085 N
+ Z IY T e n/a 40 5028 5049 5087 N
+ Z IY T i n/a 40 5028 5049 5087 N
+ Z IY TH e n/a 40 5028 5049 5072 N
+ Z IY UH b n/a 40 5027 5064 5100 N
+ Z IY UH e n/a 40 5027 5064 5098 N
+ Z IY UW b n/a 40 5027 5064 5097 N
+ Z IY UW e n/a 40 5027 5064 5097 N
+ Z IY UW i n/a 40 5027 5064 5097 N
+ Z IY V b n/a 40 5027 5047 5074 N
+ Z IY V e n/a 40 5027 5047 5074 N
+ Z IY V i n/a 40 5027 5047 5074 N
+ Z IY W b n/a 40 5027 5048 5115 N
+ Z IY W e n/a 40 5027 5048 5115 N
+ Z IY W i n/a 40 5027 5048 5115 N
+ Z IY Y b n/a 40 5027 5047 5076 N
+ Z IY Y e n/a 40 5027 5047 5076 N
+ Z IY Z b n/a 40 5027 5047 5074 N
+ Z IY Z e n/a 40 5027 5047 5074 N
+ Z IY ZH e n/a 40 5027 5047 5074 N
+ Z JH AA b n/a 40 5004 5070 5095 N
+ Z JH AA e n/a 40 5004 5070 5096 N
+ Z JH AE b n/a 40 5004 5070 5104 N
+ Z JH AE e n/a 40 5004 5070 5105 N
+ Z JH AH b n/a 40 5004 5070 5109 N
+ Z JH AH e n/a 40 5004 5070 5109 N
+ Z JH AH i n/a 40 5004 5070 5103 N
+ Z JH AO b n/a 40 5004 5070 5095 N
+ Z JH AO e n/a 40 5004 5070 5096 N
+ Z JH AW b n/a 40 5004 5070 5104 N
+ Z JH AW e n/a 40 5004 5070 5104 N
+ Z JH AY b n/a 40 5004 5070 5094 N
+ Z JH AY e n/a 40 5004 5070 5096 N
+ Z JH B b n/a 40 5004 5068 5091 N
+ Z JH B e n/a 40 5004 5068 5091 N
+ Z JH CH e n/a 40 5004 5068 5088 N
+ Z JH D b n/a 40 5004 5068 5086 N
+ Z JH D e n/a 40 5004 5068 5086 N
+ Z JH DH e n/a 40 5004 5068 5072 N
+ Z JH EH b n/a 40 5004 5070 5104 N
+ Z JH EH e n/a 40 5004 5070 5106 N
+ Z JH ER b n/a 40 5004 5070 5110 N
+ Z JH ER e n/a 40 5004 5070 5111 N
+ Z JH EY b n/a 40 5004 5070 5104 N
+ Z JH EY e n/a 40 5004 5070 5106 N
+ Z JH F e n/a 40 5004 5068 5078 N
+ Z JH G e n/a 40 5004 5068 5093 N
+ Z JH HH b n/a 40 5004 5068 5075 N
+ Z JH HH e n/a 40 5004 5068 5075 N
+ Z JH IH b n/a 40 5004 5070 5100 N
+ Z JH IH e n/a 40 5004 5070 5098 N
+ Z JH IY b n/a 40 5004 5070 5101 N
+ Z JH IY e n/a 40 5004 5070 5098 N
+ Z JH JH e n/a 40 5004 5068 5086 N
+ Z JH K b n/a 40 5004 5068 5092 N
+ Z JH K e n/a 40 5004 5068 5092 N
+ Z JH L b n/a 40 5004 5068 5114 N
+ Z JH L e n/a 40 5004 5068 5114 N
+ Z JH M b n/a 40 5004 5068 5112 N
+ Z JH M e n/a 40 5004 5068 5112 N
+ Z JH N b n/a 40 5004 5068 5113 N
+ Z JH N e n/a 40 5004 5068 5113 N
+ Z JH NG e n/a 40 5004 5068 5112 N
+ Z JH OW b n/a 40 5004 5070 5095 N
+ Z JH OW e n/a 40 5004 5070 5096 N
+ Z JH OY e n/a 40 5004 5070 5096 N
+ Z JH P e n/a 40 5004 5068 5090 N
+ Z JH R b n/a 40 5004 5068 5116 N
+ Z JH R e n/a 40 5004 5068 5116 N
+ Z JH S e n/a 40 5004 5068 5072 N
+ Z JH SH e n/a 40 5004 5068 5077 N
+ Z JH SIL e n/a 40 5004 5068 5082 N
+ Z JH T e n/a 40 5004 5068 5088 N
+ Z JH TH e n/a 40 5004 5068 5072 N
+ Z JH UH b n/a 40 5004 5070 5100 N
+ Z JH UH e n/a 40 5004 5070 5098 N
+ Z JH UW b n/a 40 5004 5070 5097 N
+ Z JH UW e n/a 40 5004 5070 5097 N
+ Z JH V b n/a 40 5004 5068 5072 N
+ Z JH V e n/a 40 5004 5068 5072 N
+ Z JH W b n/a 40 5004 5068 5115 N
+ Z JH W e n/a 40 5004 5068 5115 N
+ Z JH Y b n/a 40 5004 5068 5076 N
+ Z JH Y e n/a 40 5004 5068 5076 N
+ Z JH Z b n/a 40 5004 5068 5072 N
+ Z JH Z e n/a 40 5004 5068 5072 N
+ Z JH ZH e n/a 40 5004 5068 5072 N
+ Z K AA b n/a 40 5004 5070 5095 N
+ Z K AA e n/a 40 5004 5070 5096 N
+ Z K AE b n/a 40 5004 5070 5104 N
+ Z K AE e n/a 40 5004 5070 5105 N
+ Z K AH b n/a 40 5004 5070 5109 N
+ Z K AH e n/a 40 5004 5070 5109 N
+ Z K AO b n/a 40 5004 5070 5095 N
+ Z K AO e n/a 40 5004 5070 5096 N
+ Z K AW b n/a 40 5004 5070 5104 N
+ Z K AW e n/a 40 5004 5070 5104 N
+ Z K AY b n/a 40 5004 5070 5094 N
+ Z K AY e n/a 40 5004 5070 5096 N
+ Z K AY i n/a 40 5004 5070 5094 N
+ Z K B b n/a 40 5004 5068 5091 N
+ Z K B e n/a 40 5004 5068 5091 N
+ Z K CH e n/a 40 5004 5068 5088 N
+ Z K D b n/a 40 5004 5068 5086 N
+ Z K D e n/a 40 5004 5068 5086 N
+ Z K DH e n/a 40 5004 5068 5072 N
+ Z K EH b n/a 40 5004 5070 5104 N
+ Z K EH e n/a 40 5004 5070 5106 N
+ Z K ER b n/a 40 5004 5070 5110 N
+ Z K ER e n/a 40 5004 5070 5111 N
+ Z K EY b n/a 40 5004 5070 5104 N
+ Z K EY e n/a 40 5004 5070 5106 N
+ Z K F e n/a 40 5004 5068 5078 N
+ Z K G e n/a 40 5004 5068 5093 N
+ Z K G i n/a 40 5004 5068 5093 N
+ Z K HH b n/a 40 5004 5068 5075 N
+ Z K HH e n/a 40 5004 5068 5075 N
+ Z K IH b n/a 40 5004 5070 5100 N
+ Z K IH e n/a 40 5004 5070 5098 N
+ Z K IH i n/a 40 5004 5070 5100 N
+ Z K IY b n/a 40 5004 5070 5101 N
+ Z K IY e n/a 40 5004 5070 5098 N
+ Z K IY i n/a 40 5004 5070 5101 N
+ Z K JH e n/a 40 5004 5068 5086 N
+ Z K K b n/a 40 5004 5068 5092 N
+ Z K K e n/a 40 5004 5068 5092 N
+ Z K L b n/a 40 5004 5068 5114 N
+ Z K L e n/a 40 5004 5068 5114 N
+ Z K M b n/a 40 5004 5068 5112 N
+ Z K M e n/a 40 5004 5068 5112 N
+ Z K N b n/a 40 5004 5068 5113 N
+ Z K N e n/a 40 5004 5068 5113 N
+ Z K NG e n/a 40 5004 5068 5112 N
+ Z K OW b n/a 40 5004 5070 5095 N
+ Z K OW e n/a 40 5004 5070 5096 N
+ Z K OW i n/a 40 5004 5070 5095 N
+ Z K OY e n/a 40 5004 5070 5096 N
+ Z K P e n/a 40 5004 5068 5090 N
+ Z K R b n/a 40 5004 5068 5116 N
+ Z K R e n/a 40 5004 5068 5116 N
+ Z K S e n/a 40 5004 5068 5072 N
+ Z K SH e n/a 40 5004 5068 5077 N
+ Z K SIL e n/a 40 5004 5068 5081 N
+ Z K T e n/a 40 5004 5068 5088 N
+ Z K T i n/a 40 5004 5068 5088 N
+ Z K TH e n/a 40 5004 5068 5072 N
+ Z K UH b n/a 40 5004 5070 5100 N
+ Z K UH e n/a 40 5004 5070 5098 N
+ Z K UW b n/a 40 5004 5070 5097 N
+ Z K UW e n/a 40 5004 5070 5097 N
+ Z K V b n/a 40 5004 5068 5072 N
+ Z K V e n/a 40 5004 5068 5072 N
+ Z K W b n/a 40 5004 5068 5115 N
+ Z K W e n/a 40 5004 5068 5115 N
+ Z K W i n/a 40 5004 5068 5115 N
+ Z K Y b n/a 40 5004 5068 5076 N
+ Z K Y e n/a 40 5004 5068 5076 N
+ Z K Z b n/a 40 5004 5068 5072 N
+ Z K Z e n/a 40 5004 5068 5072 N
+ Z K ZH e n/a 40 5004 5068 5072 N
+ Z L AA b n/a 40 5010 5059 5095 N
+ Z L AA e n/a 40 5010 5059 5096 N
+ Z L AA i n/a 40 5010 5059 5095 N
+ Z L AE b n/a 40 5010 5059 5104 N
+ Z L AE e n/a 40 5010 5059 5105 N
+ Z L AE i n/a 40 5010 5059 5104 N
+ Z L AH b n/a 40 5010 5059 5108 N
+ Z L AH e n/a 40 5010 5059 5108 N
+ Z L AH i n/a 40 5010 5059 5103 N
+ Z L AO b n/a 40 5010 5059 5095 N
+ Z L AO e n/a 40 5010 5059 5096 N
+ Z L AW b n/a 40 5010 5059 5104 N
+ Z L AW e n/a 40 5010 5059 5104 N
+ Z L AY b n/a 40 5010 5059 5094 N
+ Z L AY e n/a 40 5010 5059 5096 N
+ Z L AY i n/a 40 5010 5059 5094 N
+ Z L B b n/a 40 5010 5054 5091 N
+ Z L B e n/a 40 5010 5054 5091 N
+ Z L B i n/a 40 5010 5054 5091 N
+ Z L CH e n/a 40 5010 5054 5088 N
+ Z L D b n/a 40 5010 5054 5086 N
+ Z L D e n/a 40 5010 5054 5086 N
+ Z L D i n/a 40 5010 5054 5088 N
+ Z L DH e n/a 40 5010 5054 5072 N
+ Z L EH b n/a 40 5010 5059 5104 N
+ Z L EH e n/a 40 5010 5059 5106 N
+ Z L EH i n/a 40 5010 5059 5104 N
+ Z L ER b n/a 40 5010 5059 5110 N
+ Z L ER e n/a 40 5010 5059 5111 N
+ Z L ER i n/a 40 5010 5059 5110 N
+ Z L EY b n/a 40 5010 5059 5104 N
+ Z L EY e n/a 40 5010 5059 5106 N
+ Z L F e n/a 40 5010 5054 5078 N
+ Z L F i n/a 40 5010 5054 5078 N
+ Z L G e n/a 40 5010 5054 5093 N
+ Z L G i n/a 40 5010 5054 5093 N
+ Z L HH b n/a 40 5010 5054 5075 N
+ Z L HH e n/a 40 5010 5054 5075 N
+ Z L HH i n/a 40 5010 5054 5075 N
+ Z L IH b n/a 40 5010 5059 5100 N
+ Z L IH e n/a 40 5010 5059 5098 N
+ Z L IH i n/a 40 5010 5059 5100 N
+ Z L IY b n/a 40 5010 5059 5101 N
+ Z L IY e n/a 40 5010 5059 5098 N
+ Z L IY i n/a 40 5010 5059 5101 N
+ Z L JH e n/a 40 5010 5054 5086 N
+ Z L K b n/a 40 5010 5054 5092 N
+ Z L K e n/a 40 5010 5054 5092 N
+ Z L K i n/a 40 5010 5054 5092 N
+ Z L L b n/a 40 5010 5054 5114 N
+ Z L L e n/a 40 5010 5054 5114 N
+ Z L L i n/a 40 5010 5054 5114 N
+ Z L M b n/a 40 5010 5054 5112 N
+ Z L M e n/a 40 5010 5054 5112 N
+ Z L M i n/a 40 5010 5054 5112 N
+ Z L N b n/a 40 5010 5054 5113 N
+ Z L N e n/a 40 5010 5054 5113 N
+ Z L N i n/a 40 5010 5054 5113 N
+ Z L NG e n/a 40 5010 5054 5112 N
+ Z L OW b n/a 40 5010 5059 5095 N
+ Z L OW e n/a 40 5010 5059 5096 N
+ Z L OW i n/a 40 5010 5059 5095 N
+ Z L OY e n/a 40 5010 5059 5096 N
+ Z L P e n/a 40 5010 5054 5090 N
+ Z L P i n/a 40 5010 5054 5090 N
+ Z L R b n/a 40 5010 5054 5116 N
+ Z L R e n/a 40 5010 5054 5116 N
+ Z L R i n/a 40 5010 5054 5116 N
+ Z L S e n/a 40 5010 5054 5072 N
+ Z L SH e n/a 40 5010 5054 5077 N
+ Z L SIL e n/a 40 5010 5054 5082 N
+ Z L T e n/a 40 5010 5054 5088 N
+ Z L T i n/a 40 5010 5054 5088 N
+ Z L TH e n/a 40 5010 5054 5072 N
+ Z L UH b n/a 40 5010 5059 5100 N
+ Z L UH e n/a 40 5010 5059 5098 N
+ Z L UW b n/a 40 5010 5059 5097 N
+ Z L UW e n/a 40 5010 5059 5097 N
+ Z L V b n/a 40 5010 5054 5072 N
+ Z L V e n/a 40 5010 5054 5072 N
+ Z L V i n/a 40 5010 5054 5072 N
+ Z L W b n/a 40 5010 5054 5115 N
+ Z L W e n/a 40 5010 5054 5115 N
+ Z L W i n/a 40 5010 5054 5115 N
+ Z L Y b n/a 40 5010 5054 5076 N
+ Z L Y e n/a 40 5010 5054 5076 N
+ Z L Z b n/a 40 5010 5054 5072 N
+ Z L Z e n/a 40 5010 5054 5072 N
+ Z L ZH e n/a 40 5010 5054 5072 N
+ Z M AA b n/a 40 5009 5056 5095 N
+ Z M AA e n/a 40 5009 5056 5096 N
+ Z M AA i n/a 40 5009 5056 5095 N
+ Z M AE b n/a 40 5009 5056 5104 N
+ Z M AE e n/a 40 5009 5056 5105 N
+ Z M AH b n/a 40 5009 5056 5109 N
+ Z M AH e n/a 40 5009 5056 5109 N
+ Z M AH i n/a 40 5009 5056 5103 N
+ Z M AO b n/a 40 5009 5056 5095 N
+ Z M AO e n/a 40 5009 5056 5096 N
+ Z M AW b n/a 40 5009 5056 5104 N
+ Z M AW e n/a 40 5009 5056 5104 N
+ Z M AY b n/a 40 5009 5056 5094 N
+ Z M AY e n/a 40 5009 5056 5096 N
+ Z M B b n/a 40 5009 5051 5091 N
+ Z M B e n/a 40 5009 5051 5091 N
+ Z M B i n/a 40 5009 5051 5091 N
+ Z M CH e n/a 40 5009 5051 5088 N
+ Z M D b n/a 40 5009 5051 5086 N
+ Z M D e n/a 40 5009 5051 5086 N
+ Z M D i n/a 40 5009 5051 5088 N
+ Z M DH e n/a 40 5009 5051 5072 N
+ Z M EH b n/a 40 5009 5056 5104 N
+ Z M EH e n/a 40 5009 5056 5106 N
+ Z M EH i n/a 40 5009 5056 5104 N
+ Z M ER b n/a 40 5009 5056 5110 N
+ Z M ER e n/a 40 5009 5056 5111 N
+ Z M ER i n/a 40 5009 5056 5110 N
+ Z M EY b n/a 40 5009 5056 5104 N
+ Z M EY e n/a 40 5009 5056 5106 N
+ Z M F e n/a 40 5009 5051 5078 N
+ Z M F i n/a 40 5009 5051 5078 N
+ Z M G e n/a 40 5009 5051 5093 N
+ Z M HH b n/a 40 5009 5051 5075 N
+ Z M HH e n/a 40 5009 5051 5075 N
+ Z M IH b n/a 40 5009 5056 5100 N
+ Z M IH e n/a 40 5009 5056 5098 N
+ Z M IH i n/a 40 5009 5056 5100 N
+ Z M IY b n/a 40 5009 5056 5101 N
+ Z M IY e n/a 40 5009 5056 5098 N
+ Z M IY i n/a 40 5009 5056 5101 N
+ Z M JH e n/a 40 5009 5051 5086 N
+ Z M K b n/a 40 5009 5051 5092 N
+ Z M K e n/a 40 5009 5051 5092 N
+ Z M L b n/a 40 5009 5051 5114 N
+ Z M L e n/a 40 5009 5051 5114 N
+ Z M L i n/a 40 5009 5051 5114 N
+ Z M M b n/a 40 5009 5051 5112 N
+ Z M M e n/a 40 5009 5051 5112 N
+ Z M M i n/a 40 5009 5051 5112 N
+ Z M N b n/a 40 5009 5051 5113 N
+ Z M N e n/a 40 5009 5051 5113 N
+ Z M N i n/a 40 5009 5051 5113 N
+ Z M NG e n/a 40 5009 5051 5112 N
+ Z M OW b n/a 40 5009 5056 5095 N
+ Z M OW e n/a 40 5009 5056 5096 N
+ Z M OW i n/a 40 5009 5056 5095 N
+ Z M OY e n/a 40 5009 5056 5096 N
+ Z M P e n/a 40 5009 5051 5090 N
+ Z M R b n/a 40 5009 5052 5116 N
+ Z M R e n/a 40 5009 5052 5116 N
+ Z M S e n/a 40 5009 5051 5072 N
+ Z M SH e n/a 40 5009 5051 5077 N
+ Z M SIL e n/a 40 5007 5051 5079 N
+ Z M T e n/a 40 5009 5051 5088 N
+ Z M T i n/a 40 5009 5051 5088 N
+ Z M TH e n/a 40 5009 5051 5072 N
+ Z M UH b n/a 40 5009 5056 5100 N
+ Z M UH e n/a 40 5009 5056 5098 N
+ Z M UW b n/a 40 5009 5056 5097 N
+ Z M UW e n/a 40 5009 5056 5097 N
+ Z M V b n/a 40 5009 5051 5072 N
+ Z M V e n/a 40 5009 5051 5072 N
+ Z M V i n/a 40 5009 5051 5072 N
+ Z M W b n/a 40 5009 5052 5115 N
+ Z M W e n/a 40 5009 5052 5115 N
+ Z M W i n/a 40 5009 5052 5115 N
+ Z M Y b n/a 40 5009 5051 5076 N
+ Z M Y e n/a 40 5009 5051 5076 N
+ Z M Z b n/a 40 5009 5051 5072 N
+ Z M Z e n/a 40 5009 5051 5072 N
+ Z M ZH e n/a 40 5009 5051 5072 N
+ Z N AA b n/a 40 5006 5056 5095 N
+ Z N AA e n/a 40 5006 5056 5096 N
+ Z N AA i n/a 40 5006 5056 5095 N
+ Z N AE b n/a 40 5006 5056 5104 N
+ Z N AE e n/a 40 5006 5056 5105 N
+ Z N AE i n/a 40 5006 5056 5104 N
+ Z N AH b n/a 40 5006 5056 5109 N
+ Z N AH e n/a 40 5006 5056 5109 N
+ Z N AH i n/a 40 5006 5056 5102 N
+ Z N AO b n/a 40 5006 5056 5095 N
+ Z N AO e n/a 40 5006 5056 5096 N
+ Z N AO i n/a 40 5006 5056 5095 N
+ Z N AW b n/a 40 5006 5056 5104 N
+ Z N AW e n/a 40 5006 5056 5104 N
+ Z N AY b n/a 40 5006 5056 5094 N
+ Z N AY e n/a 40 5006 5056 5096 N
+ Z N AY i n/a 40 5006 5056 5094 N
+ Z N B b n/a 40 5006 5051 5091 N
+ Z N B e n/a 40 5006 5051 5091 N
+ Z N B i n/a 40 5006 5051 5091 N
+ Z N CH e n/a 40 5006 5051 5088 N
+ Z N D b n/a 40 5006 5051 5086 N
+ Z N D e n/a 40 5006 5051 5086 N
+ Z N D i n/a 40 5006 5051 5088 N
+ Z N DH e n/a 40 5006 5051 5072 N
+ Z N EH b n/a 40 5006 5056 5104 N
+ Z N EH e n/a 40 5006 5056 5106 N
+ Z N EH i n/a 40 5006 5056 5104 N
+ Z N ER b n/a 40 5006 5056 5110 N
+ Z N ER e n/a 40 5006 5056 5111 N
+ Z N ER i n/a 40 5006 5056 5110 N
+ Z N EY b n/a 40 5006 5056 5104 N
+ Z N EY e n/a 40 5006 5056 5106 N
+ Z N EY i n/a 40 5006 5056 5104 N
+ Z N F e n/a 40 5006 5051 5078 N
+ Z N F i n/a 40 5006 5051 5078 N
+ Z N G e n/a 40 5006 5051 5093 N
+ Z N G i n/a 40 5006 5051 5093 N
+ Z N HH b n/a 40 5006 5051 5075 N
+ Z N HH e n/a 40 5006 5051 5075 N
+ Z N HH i n/a 40 5006 5051 5075 N
+ Z N IH b n/a 40 5006 5056 5100 N
+ Z N IH e n/a 40 5006 5056 5098 N
+ Z N IH i n/a 40 5006 5056 5100 N
+ Z N IY b n/a 40 5006 5056 5101 N
+ Z N IY e n/a 40 5006 5056 5098 N
+ Z N IY i n/a 40 5006 5056 5101 N
+ Z N JH e n/a 40 5006 5051 5086 N
+ Z N JH i n/a 40 5006 5051 5088 N
+ Z N K b n/a 40 5006 5051 5092 N
+ Z N K e n/a 40 5006 5051 5092 N
+ Z N K i n/a 40 5006 5051 5092 N
+ Z N L b n/a 40 5006 5051 5114 N
+ Z N L e n/a 40 5006 5051 5114 N
+ Z N L i n/a 40 5006 5051 5114 N
+ Z N M b n/a 40 5006 5051 5112 N
+ Z N M e n/a 40 5006 5051 5112 N
+ Z N M i n/a 40 5006 5051 5112 N
+ Z N N b n/a 40 5006 5051 5113 N
+ Z N N e n/a 40 5006 5051 5113 N
+ Z N N i n/a 40 5006 5051 5113 N
+ Z N NG e n/a 40 5006 5051 5112 N
+ Z N OW b n/a 40 5006 5056 5095 N
+ Z N OW e n/a 40 5006 5056 5096 N
+ Z N OW i n/a 40 5006 5056 5095 N
+ Z N OY e n/a 40 5006 5056 5096 N
+ Z N OY i n/a 40 5006 5056 5094 N
+ Z N P e n/a 40 5006 5051 5090 N
+ Z N P i n/a 40 5006 5051 5090 N
+ Z N R b n/a 40 5006 5052 5116 N
+ Z N R e n/a 40 5006 5052 5116 N
+ Z N R i n/a 40 5006 5052 5116 N
+ Z N S e n/a 40 5006 5051 5072 N
+ Z N SH e n/a 40 5006 5051 5077 N
+ Z N SIL e n/a 40 5007 5053 5079 N
+ Z N T e n/a 40 5006 5051 5088 N
+ Z N T i n/a 40 5006 5051 5088 N
+ Z N TH e n/a 40 5006 5051 5072 N
+ Z N UH b n/a 40 5006 5056 5100 N
+ Z N UH e n/a 40 5006 5056 5098 N
+ Z N UW b n/a 40 5006 5056 5097 N
+ Z N UW e n/a 40 5006 5056 5097 N
+ Z N UW i n/a 40 5006 5056 5097 N
+ Z N V b n/a 40 5006 5051 5072 N
+ Z N V e n/a 40 5006 5051 5072 N
+ Z N V i n/a 40 5006 5051 5072 N
+ Z N W b n/a 40 5006 5052 5115 N
+ Z N W e n/a 40 5006 5052 5115 N
+ Z N W i n/a 40 5006 5052 5115 N
+ Z N Y b n/a 40 5006 5051 5076 N
+ Z N Y e n/a 40 5006 5051 5076 N
+ Z N Y i n/a 40 5006 5051 5076 N
+ Z N Z b n/a 40 5006 5051 5072 N
+ Z N Z e n/a 40 5006 5051 5072 N
+ Z N ZH e n/a 40 5006 5051 5072 N
+ Z NG AA b n/a 40 5008 5056 5095 N
+ Z NG AA e n/a 40 5008 5056 5096 N
+ Z NG AA i n/a 40 5008 5056 5095 N
+ Z NG AE b n/a 40 5008 5056 5104 N
+ Z NG AE e n/a 40 5008 5056 5105 N
+ Z NG AH b n/a 40 5008 5056 5109 N
+ Z NG AH e n/a 40 5008 5056 5109 N
+ Z NG AH i n/a 40 5008 5056 5103 N
+ Z NG AO b n/a 40 5008 5056 5095 N
+ Z NG AO e n/a 40 5008 5056 5096 N
+ Z NG AW b n/a 40 5008 5056 5104 N
+ Z NG AW e n/a 40 5008 5056 5104 N
+ Z NG AY b n/a 40 5008 5056 5094 N
+ Z NG AY e n/a 40 5008 5056 5096 N
+ Z NG AY i n/a 40 5008 5056 5094 N
+ Z NG B b n/a 40 5008 5048 5091 N
+ Z NG B e n/a 40 5008 5048 5091 N
+ Z NG B i n/a 40 5008 5048 5091 N
+ Z NG CH e n/a 40 5008 5048 5088 N
+ Z NG D b n/a 40 5008 5048 5086 N
+ Z NG D e n/a 40 5008 5048 5086 N
+ Z NG D i n/a 40 5008 5048 5088 N
+ Z NG DH e n/a 40 5008 5048 5072 N
+ Z NG EH b n/a 40 5008 5056 5104 N
+ Z NG EH e n/a 40 5008 5056 5106 N
+ Z NG ER b n/a 40 5008 5056 5110 N
+ Z NG ER e n/a 40 5008 5056 5111 N
+ Z NG EY b n/a 40 5008 5056 5104 N
+ Z NG EY e n/a 40 5008 5056 5106 N
+ Z NG F e n/a 40 5008 5048 5078 N
+ Z NG F i n/a 40 5008 5048 5078 N
+ Z NG G e n/a 40 5008 5048 5093 N
+ Z NG G i n/a 40 5008 5048 5093 N
+ Z NG HH b n/a 40 5008 5048 5075 N
+ Z NG HH e n/a 40 5008 5048 5075 N
+ Z NG HH i n/a 40 5008 5048 5075 N
+ Z NG IH b n/a 40 5008 5056 5100 N
+ Z NG IH e n/a 40 5008 5056 5098 N
+ Z NG IH i n/a 40 5008 5056 5100 N
+ Z NG IY b n/a 40 5008 5056 5101 N
+ Z NG IY e n/a 40 5008 5056 5098 N
+ Z NG IY i n/a 40 5008 5056 5101 N
+ Z NG JH e n/a 40 5008 5048 5086 N
+ Z NG K b n/a 40 5008 5048 5092 N
+ Z NG K e n/a 40 5008 5048 5092 N
+ Z NG L b n/a 40 5008 5048 5114 N
+ Z NG L e n/a 40 5008 5048 5114 N
+ Z NG L i n/a 40 5008 5048 5114 N
+ Z NG M b n/a 40 5008 5048 5112 N
+ Z NG M e n/a 40 5008 5048 5112 N
+ Z NG M i n/a 40 5008 5048 5112 N
+ Z NG N b n/a 40 5008 5048 5113 N
+ Z NG N e n/a 40 5008 5048 5113 N
+ Z NG NG e n/a 40 5008 5048 5112 N
+ Z NG OW b n/a 40 5008 5056 5095 N
+ Z NG OW e n/a 40 5008 5056 5096 N
+ Z NG OY e n/a 40 5008 5056 5096 N
+ Z NG P e n/a 40 5008 5048 5090 N
+ Z NG P i n/a 40 5008 5048 5090 N
+ Z NG R b n/a 40 5008 5048 5116 N
+ Z NG R e n/a 40 5008 5048 5116 N
+ Z NG R i n/a 40 5008 5048 5116 N
+ Z NG S e n/a 40 5008 5048 5072 N
+ Z NG SH e n/a 40 5008 5048 5077 N
+ Z NG SIL e n/a 40 5008 5053 5079 N
+ Z NG T e n/a 40 5008 5048 5088 N
+ Z NG T i n/a 40 5008 5048 5088 N
+ Z NG TH e n/a 40 5008 5048 5072 N
+ Z NG UH b n/a 40 5008 5056 5100 N
+ Z NG UH e n/a 40 5008 5056 5098 N
+ Z NG UW b n/a 40 5008 5056 5097 N
+ Z NG UW e n/a 40 5008 5056 5097 N
+ Z NG UW i n/a 40 5008 5056 5097 N
+ Z NG V b n/a 40 5008 5048 5072 N
+ Z NG V e n/a 40 5008 5048 5072 N
+ Z NG V i n/a 40 5008 5048 5072 N
+ Z NG W b n/a 40 5008 5048 5115 N
+ Z NG W e n/a 40 5008 5048 5115 N
+ Z NG W i n/a 40 5008 5048 5115 N
+ Z NG Y b n/a 40 5008 5048 5076 N
+ Z NG Y e n/a 40 5008 5048 5076 N
+ Z NG Z b n/a 40 5008 5048 5072 N
+ Z NG Z e n/a 40 5008 5048 5072 N
+ Z NG ZH e n/a 40 5008 5048 5072 N
+ Z OW AA b n/a 40 5018 5058 5095 N
+ Z OW AA e n/a 40 5018 5058 5096 N
+ Z OW AA i n/a 40 5018 5058 5095 N
+ Z OW AE b n/a 40 5018 5058 5104 N
+ Z OW AE e n/a 40 5018 5058 5105 N
+ Z OW AE i n/a 40 5018 5058 5104 N
+ Z OW AH b n/a 40 5018 5058 5109 N
+ Z OW AH e n/a 40 5018 5058 5109 N
+ Z OW AH i n/a 40 5018 5058 5102 N
+ Z OW AO b n/a 40 5018 5058 5095 N
+ Z OW AO e n/a 40 5018 5058 5096 N
+ Z OW AW b n/a 40 5018 5058 5104 N
+ Z OW AW e n/a 40 5018 5058 5104 N
+ Z OW AY b n/a 40 5018 5058 5094 N
+ Z OW AY e n/a 40 5018 5058 5096 N
+ Z OW AY i n/a 40 5018 5058 5094 N
+ Z OW B b n/a 40 5018 5030 5091 N
+ Z OW B e n/a 40 5018 5030 5091 N
+ Z OW B i n/a 40 5018 5030 5091 N
+ Z OW CH e n/a 40 5018 5041 5088 N
+ Z OW D b n/a 40 5018 5030 5086 N
+ Z OW D e n/a 40 5018 5030 5086 N
+ Z OW D i n/a 40 5018 5030 5088 N
+ Z OW DH e n/a 40 5018 5031 5072 N
+ Z OW EH b n/a 40 5018 5058 5104 N
+ Z OW EH e n/a 40 5018 5058 5106 N
+ Z OW EH i n/a 40 5018 5058 5104 N
+ Z OW ER b n/a 40 5018 5058 5110 N
+ Z OW ER e n/a 40 5018 5058 5111 N
+ Z OW ER i n/a 40 5018 5058 5110 N
+ Z OW EY b n/a 40 5018 5058 5104 N
+ Z OW EY e n/a 40 5018 5058 5106 N
+ Z OW EY i n/a 40 5018 5058 5104 N
+ Z OW F e n/a 40 5018 5041 5078 N
+ Z OW G e n/a 40 5018 5030 5093 N
+ Z OW G i n/a 40 5018 5030 5093 N
+ Z OW HH b n/a 40 5018 5039 5075 N
+ Z OW HH e n/a 40 5018 5039 5075 N
+ Z OW HH i n/a 40 5018 5039 5075 N
+ Z OW IH b n/a 40 5018 5058 5100 N
+ Z OW IH e n/a 40 5018 5058 5098 N
+ Z OW IH i n/a 40 5018 5058 5100 N
+ Z OW IY b n/a 40 5018 5058 5101 N
+ Z OW IY e n/a 40 5018 5058 5098 N
+ Z OW IY i n/a 40 5018 5058 5101 N
+ Z OW JH e n/a 40 5018 5034 5086 N
+ Z OW K b n/a 40 5018 5042 5092 N
+ Z OW K e n/a 40 5018 5042 5092 N
+ Z OW K i n/a 40 5018 5042 5092 N
+ Z OW L b n/a 40 5018 5030 5114 N
+ Z OW L e n/a 40 5018 5030 5114 N
+ Z OW L i n/a 40 5018 5030 5114 N
+ Z OW M b n/a 40 5018 5030 5112 N
+ Z OW M e n/a 40 5018 5030 5112 N
+ Z OW M i n/a 40 5018 5030 5112 N
+ Z OW N b n/a 40 5018 5030 5113 N
+ Z OW N e n/a 40 5018 5030 5113 N
+ Z OW N i n/a 40 5018 5030 5113 N
+ Z OW NG e n/a 40 5018 5030 5112 N
+ Z OW OW b n/a 40 5018 5058 5095 N
+ Z OW OW e n/a 40 5018 5058 5096 N
+ Z OW OW i n/a 40 5018 5058 5095 N
+ Z OW OY e n/a 40 5018 5058 5096 N
+ Z OW OY i n/a 40 5018 5058 5094 N
+ Z OW P e n/a 40 5018 5041 5090 N
+ Z OW P i n/a 40 5018 5041 5090 N
+ Z OW R b n/a 40 5018 5037 5116 N
+ Z OW R e n/a 40 5018 5037 5116 N
+ Z OW R i n/a 40 5018 5037 5116 N
+ Z OW S e n/a 40 5018 5039 5072 N
+ Z OW S i n/a 40 5018 5039 5072 N
+ Z OW SH e n/a 40 5018 5035 5077 N
+ Z OW SIL e n/a 40 5018 5043 5082 N
+ Z OW T e n/a 40 5018 5041 5088 N
+ Z OW T i n/a 40 5018 5041 5088 N
+ Z OW TH e n/a 40 5018 5039 5072 N
+ Z OW UH b n/a 40 5018 5058 5100 N
+ Z OW UH e n/a 40 5018 5058 5098 N
+ Z OW UW b n/a 40 5018 5058 5097 N
+ Z OW UW e n/a 40 5018 5058 5097 N
+ Z OW UW i n/a 40 5018 5058 5097 N
+ Z OW V b n/a 40 5018 5030 5072 N
+ Z OW V e n/a 40 5018 5030 5072 N
+ Z OW V i n/a 40 5018 5030 5072 N
+ Z OW W b n/a 40 5018 5036 5115 N
+ Z OW W e n/a 40 5018 5036 5115 N
+ Z OW W i n/a 40 5018 5036 5115 N
+ Z OW Y b n/a 40 5018 5035 5076 N
+ Z OW Y e n/a 40 5018 5035 5076 N
+ Z OW Z b n/a 40 5018 5030 5072 N
+ Z OW Z e n/a 40 5018 5030 5072 N
+ Z OW ZH e n/a 40 5018 5034 5072 N
+ Z OY AA b n/a 40 5029 5065 5095 N
+ Z OY AA e n/a 40 5029 5065 5096 N
+ Z OY AE b n/a 40 5029 5065 5104 N
+ Z OY AE e n/a 40 5029 5065 5105 N
+ Z OY AE i n/a 40 5029 5065 5104 N
+ Z OY AH b n/a 40 5029 5065 5109 N
+ Z OY AH e n/a 40 5029 5065 5109 N
+ Z OY AH i n/a 40 5029 5065 5103 N
+ Z OY AO b n/a 40 5029 5065 5095 N
+ Z OY AO e n/a 40 5029 5065 5096 N
+ Z OY AW b n/a 40 5029 5065 5104 N
+ Z OY AW e n/a 40 5029 5065 5104 N
+ Z OY AY b n/a 40 5029 5065 5094 N
+ Z OY AY e n/a 40 5029 5065 5096 N
+ Z OY B b n/a 40 5029 5050 5091 N
+ Z OY B e n/a 40 5029 5050 5091 N
+ Z OY CH e n/a 40 5029 5050 5089 N
+ Z OY D b n/a 40 5029 5050 5089 N
+ Z OY D e n/a 40 5029 5050 5089 N
+ Z OY D i n/a 40 5029 5050 5089 N
+ Z OY DH e n/a 40 5029 5050 5072 N
+ Z OY EH b n/a 40 5029 5065 5104 N
+ Z OY EH e n/a 40 5029 5065 5106 N
+ Z OY EH i n/a 40 5029 5065 5104 N
+ Z OY ER b n/a 40 5029 5065 5110 N
+ Z OY ER e n/a 40 5029 5065 5111 N
+ Z OY ER i n/a 40 5029 5065 5110 N
+ Z OY EY b n/a 40 5029 5065 5104 N
+ Z OY EY e n/a 40 5029 5065 5106 N
+ Z OY F e n/a 40 5029 5050 5078 N
+ Z OY G e n/a 40 5029 5050 5093 N
+ Z OY HH b n/a 40 5029 5050 5075 N
+ Z OY HH e n/a 40 5029 5050 5075 N
+ Z OY IH b n/a 40 5029 5065 5099 N
+ Z OY IH e n/a 40 5029 5065 5098 N
+ Z OY IH i n/a 40 5029 5065 5099 N
+ Z OY IY b n/a 40 5029 5065 5101 N
+ Z OY IY e n/a 40 5029 5065 5098 N
+ Z OY IY i n/a 40 5029 5065 5101 N
+ Z OY JH e n/a 40 5029 5050 5089 N
+ Z OY K b n/a 40 5029 5050 5092 N
+ Z OY K e n/a 40 5029 5050 5092 N
+ Z OY L b n/a 40 5029 5050 5114 N
+ Z OY L e n/a 40 5029 5050 5114 N
+ Z OY L i n/a 40 5029 5050 5114 N
+ Z OY M b n/a 40 5029 5050 5112 N
+ Z OY M e n/a 40 5029 5050 5112 N
+ Z OY N b n/a 40 5029 5050 5113 N
+ Z OY N e n/a 40 5029 5050 5113 N
+ Z OY NG e n/a 40 5029 5050 5112 N
+ Z OY OW b n/a 40 5029 5065 5095 N
+ Z OY OW e n/a 40 5029 5065 5096 N
+ Z OY OY e n/a 40 5029 5065 5096 N
+ Z OY P e n/a 40 5029 5050 5090 N
+ Z OY R b n/a 40 5029 5050 5116 N
+ Z OY R e n/a 40 5029 5050 5116 N
+ Z OY S e n/a 40 5029 5050 5072 N
+ Z OY S i n/a 40 5029 5050 5072 N
+ Z OY SH e n/a 40 5029 5050 5077 N
+ Z OY SIL e n/a 40 5029 5050 5083 N
+ Z OY T e n/a 40 5029 5050 5089 N
+ Z OY TH e n/a 40 5029 5050 5072 N
+ Z OY UH b n/a 40 5029 5065 5099 N
+ Z OY UH e n/a 40 5029 5065 5098 N
+ Z OY UW b n/a 40 5029 5065 5097 N
+ Z OY UW e n/a 40 5029 5065 5097 N
+ Z OY V b n/a 40 5029 5050 5072 N
+ Z OY V e n/a 40 5029 5050 5072 N
+ Z OY W b n/a 40 5029 5050 5115 N
+ Z OY W e n/a 40 5029 5050 5115 N
+ Z OY W i n/a 40 5029 5050 5115 N
+ Z OY Y b n/a 40 5029 5050 5076 N
+ Z OY Y e n/a 40 5029 5050 5076 N
+ Z OY Z b n/a 40 5029 5050 5072 N
+ Z OY Z e n/a 40 5029 5050 5072 N
+ Z OY ZH e n/a 40 5029 5050 5072 N
+ Z P AA b n/a 40 5004 5070 5095 N
+ Z P AA e n/a 40 5004 5070 5096 N
+ Z P AE b n/a 40 5004 5070 5104 N
+ Z P AE e n/a 40 5004 5070 5105 N
+ Z P AH b n/a 40 5004 5070 5109 N
+ Z P AH e n/a 40 5004 5070 5109 N
+ Z P AH i n/a 40 5004 5070 5103 N
+ Z P AO b n/a 40 5004 5070 5095 N
+ Z P AO e n/a 40 5004 5070 5096 N
+ Z P AW b n/a 40 5004 5070 5104 N
+ Z P AW e n/a 40 5004 5070 5104 N
+ Z P AY b n/a 40 5004 5070 5094 N
+ Z P AY e n/a 40 5004 5070 5096 N
+ Z P B b n/a 40 5004 5068 5091 N
+ Z P B e n/a 40 5004 5068 5091 N
+ Z P CH e n/a 40 5004 5068 5088 N
+ Z P D b n/a 40 5004 5068 5086 N
+ Z P D e n/a 40 5004 5068 5086 N
+ Z P DH e n/a 40 5004 5068 5072 N
+ Z P EH b n/a 40 5004 5070 5104 N
+ Z P EH e n/a 40 5004 5070 5106 N
+ Z P ER b n/a 40 5004 5070 5110 N
+ Z P ER e n/a 40 5004 5070 5111 N
+ Z P EY b n/a 40 5004 5070 5104 N
+ Z P EY e n/a 40 5004 5070 5106 N
+ Z P F e n/a 40 5004 5068 5078 N
+ Z P G e n/a 40 5004 5068 5093 N
+ Z P HH b n/a 40 5004 5068 5075 N
+ Z P HH e n/a 40 5004 5068 5075 N
+ Z P IH b n/a 40 5004 5070 5100 N
+ Z P IH e n/a 40 5004 5070 5098 N
+ Z P IH i n/a 40 5004 5070 5100 N
+ Z P IY b n/a 40 5004 5070 5101 N
+ Z P IY e n/a 40 5004 5070 5098 N
+ Z P JH e n/a 40 5004 5068 5086 N
+ Z P K b n/a 40 5004 5068 5092 N
+ Z P K e n/a 40 5004 5068 5092 N
+ Z P L b n/a 40 5004 5068 5114 N
+ Z P L e n/a 40 5004 5068 5114 N
+ Z P M b n/a 40 5004 5068 5112 N
+ Z P M e n/a 40 5004 5068 5112 N
+ Z P N b n/a 40 5004 5068 5113 N
+ Z P N e n/a 40 5004 5068 5113 N
+ Z P NG e n/a 40 5004 5068 5112 N
+ Z P OW b n/a 40 5004 5070 5095 N
+ Z P OW e n/a 40 5004 5070 5096 N
+ Z P OY e n/a 40 5004 5070 5096 N
+ Z P P e n/a 40 5004 5068 5090 N
+ Z P R b n/a 40 5004 5068 5116 N
+ Z P R e n/a 40 5004 5068 5116 N
+ Z P S e n/a 40 5004 5068 5072 N
+ Z P SH e n/a 40 5004 5068 5077 N
+ Z P SIL e n/a 40 5004 5068 5082 N
+ Z P T e n/a 40 5004 5068 5088 N
+ Z P TH e n/a 40 5004 5068 5072 N
+ Z P UH b n/a 40 5004 5070 5100 N
+ Z P UH e n/a 40 5004 5070 5098 N
+ Z P UW b n/a 40 5004 5070 5097 N
+ Z P UW e n/a 40 5004 5070 5097 N
+ Z P UW i n/a 40 5004 5070 5097 N
+ Z P V b n/a 40 5004 5068 5072 N
+ Z P V e n/a 40 5004 5068 5072 N
+ Z P W b n/a 40 5004 5068 5115 N
+ Z P W e n/a 40 5004 5068 5115 N
+ Z P Y b n/a 40 5004 5068 5076 N
+ Z P Y e n/a 40 5004 5068 5076 N
+ Z P Z b n/a 40 5004 5068 5072 N
+ Z P Z e n/a 40 5004 5068 5072 N
+ Z P ZH e n/a 40 5004 5068 5072 N
+ Z R AA b n/a 40 5025 5066 5095 N
+ Z R AA e n/a 40 5025 5066 5096 N
+ Z R AA i n/a 40 5025 5066 5095 N
+ Z R AE b n/a 40 5025 5066 5104 N
+ Z R AE e n/a 40 5025 5066 5105 N
+ Z R AE i n/a 40 5025 5066 5104 N
+ Z R AH b n/a 40 5025 5066 5109 N
+ Z R AH e n/a 40 5025 5066 5109 N
+ Z R AH i n/a 40 5025 5066 5103 N
+ Z R AO b n/a 40 5025 5066 5095 N
+ Z R AO e n/a 40 5025 5066 5096 N
+ Z R AW b n/a 40 5025 5066 5104 N
+ Z R AW e n/a 40 5025 5066 5104 N
+ Z R AY b n/a 40 5025 5066 5094 N
+ Z R AY e n/a 40 5025 5066 5096 N
+ Z R B b n/a 40 5025 5045 5091 N
+ Z R B e n/a 40 5025 5045 5091 N
+ Z R B i n/a 40 5025 5045 5091 N
+ Z R CH e n/a 40 5025 5045 5088 N
+ Z R D b n/a 40 5025 5045 5086 N
+ Z R D e n/a 40 5025 5045 5086 N
+ Z R D i n/a 40 5025 5045 5088 N
+ Z R DH e n/a 40 5025 5045 5072 N
+ Z R EH b n/a 40 5025 5066 5104 N
+ Z R EH e n/a 40 5025 5066 5106 N
+ Z R EH i n/a 40 5025 5066 5104 N
+ Z R ER b n/a 40 5025 5066 5110 N
+ Z R ER e n/a 40 5025 5066 5111 N
+ Z R ER i n/a 40 5025 5066 5110 N
+ Z R EY b n/a 40 5025 5066 5104 N
+ Z R EY e n/a 40 5025 5066 5106 N
+ Z R EY i n/a 40 5025 5066 5104 N
+ Z R F e n/a 40 5025 5045 5078 N
+ Z R F i n/a 40 5025 5045 5078 N
+ Z R G e n/a 40 5025 5045 5093 N
+ Z R HH b n/a 40 5025 5045 5075 N
+ Z R HH e n/a 40 5025 5045 5075 N
+ Z R HH i n/a 40 5025 5045 5075 N
+ Z R IH b n/a 40 5025 5066 5100 N
+ Z R IH e n/a 40 5025 5066 5098 N
+ Z R IH i n/a 40 5025 5066 5100 N
+ Z R IY b n/a 40 5025 5066 5101 N
+ Z R IY e n/a 40 5025 5066 5098 N
+ Z R IY i n/a 40 5025 5066 5101 N
+ Z R JH e n/a 40 5025 5045 5086 N
+ Z R K b n/a 40 5025 5045 5092 N
+ Z R K e n/a 40 5025 5045 5092 N
+ Z R L b n/a 40 5025 5045 5114 N
+ Z R L e n/a 40 5025 5045 5114 N
+ Z R L i n/a 40 5025 5045 5114 N
+ Z R M b n/a 40 5025 5045 5112 N
+ Z R M e n/a 40 5025 5045 5112 N
+ Z R M i n/a 40 5025 5045 5112 N
+ Z R N b n/a 40 5025 5045 5113 N
+ Z R N e n/a 40 5025 5045 5113 N
+ Z R N i n/a 40 5025 5045 5113 N
+ Z R NG e n/a 40 5025 5045 5112 N
+ Z R OW b n/a 40 5025 5066 5095 N
+ Z R OW e n/a 40 5025 5066 5096 N
+ Z R OW i n/a 40 5025 5066 5095 N
+ Z R OY e n/a 40 5025 5066 5096 N
+ Z R P e n/a 40 5025 5045 5090 N
+ Z R R b n/a 40 5025 5045 5116 N
+ Z R R e n/a 40 5025 5045 5116 N
+ Z R S e n/a 40 5025 5046 5072 N
+ Z R SH e n/a 40 5025 5045 5077 N
+ Z R SIL e n/a 40 5026 5046 5080 N
+ Z R T e n/a 40 5025 5046 5088 N
+ Z R T i n/a 40 5025 5046 5088 N
+ Z R TH e n/a 40 5025 5046 5072 N
+ Z R UH b n/a 40 5025 5066 5100 N
+ Z R UH e n/a 40 5025 5066 5098 N
+ Z R UW b n/a 40 5025 5066 5097 N
+ Z R UW e n/a 40 5025 5066 5097 N
+ Z R UW i n/a 40 5025 5066 5097 N
+ Z R V b n/a 40 5025 5045 5072 N
+ Z R V e n/a 40 5025 5045 5072 N
+ Z R V i n/a 40 5025 5045 5072 N
+ Z R W b n/a 40 5025 5045 5115 N
+ Z R W e n/a 40 5025 5045 5115 N
+ Z R W i n/a 40 5025 5045 5115 N
+ Z R Y b n/a 40 5025 5045 5076 N
+ Z R Y e n/a 40 5025 5045 5076 N
+ Z R Z b n/a 40 5025 5045 5072 N
+ Z R Z e n/a 40 5025 5045 5072 N
+ Z R ZH e n/a 40 5025 5045 5072 N
+ Z S AA b n/a 40 5004 5070 5095 N
+ Z S AA e n/a 40 5004 5070 5096 N
+ Z S AE b n/a 40 5004 5070 5104 N
+ Z S AE e n/a 40 5004 5070 5105 N
+ Z S AH b n/a 40 5004 5070 5109 N
+ Z S AH e n/a 40 5004 5070 5109 N
+ Z S AO b n/a 40 5004 5070 5095 N
+ Z S AO e n/a 40 5004 5070 5096 N
+ Z S AW b n/a 40 5004 5070 5104 N
+ Z S AW e n/a 40 5004 5070 5104 N
+ Z S AY b n/a 40 5004 5070 5094 N
+ Z S AY e n/a 40 5004 5070 5096 N
+ Z S B b n/a 40 5004 5055 5091 N
+ Z S B e n/a 40 5004 5055 5091 N
+ Z S CH e n/a 40 5004 5055 5088 N
+ Z S D b n/a 40 5004 5055 5086 N
+ Z S D e n/a 40 5004 5055 5086 N
+ Z S DH e n/a 40 5004 5055 5072 N
+ Z S EH b n/a 40 5004 5070 5104 N
+ Z S EH e n/a 40 5004 5070 5106 N
+ Z S ER b n/a 40 5004 5070 5110 N
+ Z S ER e n/a 40 5004 5070 5111 N
+ Z S EY b n/a 40 5004 5070 5104 N
+ Z S EY e n/a 40 5004 5070 5106 N
+ Z S EY i n/a 40 5004 5070 5104 N
+ Z S F e n/a 40 5004 5055 5078 N
+ Z S G e n/a 40 5004 5055 5093 N
+ Z S HH b n/a 40 5004 5055 5075 N
+ Z S HH e n/a 40 5004 5055 5075 N
+ Z S HH i n/a 40 5004 5055 5075 N
+ Z S IH b n/a 40 5004 5070 5100 N
+ Z S IH e n/a 40 5004 5070 5098 N
+ Z S IY b n/a 40 5004 5070 5101 N
+ Z S IY e n/a 40 5004 5070 5098 N
+ Z S JH e n/a 40 5004 5055 5086 N
+ Z S K b n/a 40 5004 5055 5092 N
+ Z S K e n/a 40 5004 5055 5092 N
+ Z S L b n/a 40 5004 5055 5114 N
+ Z S L e n/a 40 5004 5055 5114 N
+ Z S M b n/a 40 5004 5055 5112 N
+ Z S M e n/a 40 5004 5055 5112 N
+ Z S N b n/a 40 5004 5055 5113 N
+ Z S N e n/a 40 5004 5055 5113 N
+ Z S NG e n/a 40 5004 5055 5112 N
+ Z S OW b n/a 40 5004 5070 5095 N
+ Z S OW e n/a 40 5004 5070 5096 N
+ Z S OY e n/a 40 5004 5070 5096 N
+ Z S P e n/a 40 5004 5055 5090 N
+ Z S R b n/a 40 5004 5055 5116 N
+ Z S R e n/a 40 5004 5055 5116 N
+ Z S S e n/a 40 5004 5055 5072 N
+ Z S SH e n/a 40 5004 5055 5077 N
+ Z S SIL e n/a 40 5004 5055 5081 N
+ Z S T e n/a 40 5004 5055 5088 N
+ Z S TH e n/a 40 5004 5055 5072 N
+ Z S UH b n/a 40 5004 5070 5100 N
+ Z S UH e n/a 40 5004 5070 5098 N
+ Z S UW b n/a 40 5004 5070 5097 N
+ Z S UW e n/a 40 5004 5070 5097 N
+ Z S V b n/a 40 5004 5055 5072 N
+ Z S V e n/a 40 5004 5055 5072 N
+ Z S W b n/a 40 5004 5055 5115 N
+ Z S W e n/a 40 5004 5055 5115 N
+ Z S Y b n/a 40 5004 5055 5076 N
+ Z S Y e n/a 40 5004 5055 5076 N
+ Z S Z b n/a 40 5004 5055 5072 N
+ Z S Z e n/a 40 5004 5055 5072 N
+ Z S ZH e n/a 40 5004 5055 5072 N
+ Z SH AA b n/a 40 5004 5070 5095 N
+ Z SH AA e n/a 40 5004 5070 5096 N
+ Z SH AE b n/a 40 5004 5070 5104 N
+ Z SH AE e n/a 40 5004 5070 5105 N
+ Z SH AH b n/a 40 5004 5070 5109 N
+ Z SH AH e n/a 40 5004 5070 5109 N
+ Z SH AO b n/a 40 5004 5070 5095 N
+ Z SH AO e n/a 40 5004 5070 5096 N
+ Z SH AW b n/a 40 5004 5070 5104 N
+ Z SH AW e n/a 40 5004 5070 5104 N
+ Z SH AY b n/a 40 5004 5070 5094 N
+ Z SH AY e n/a 40 5004 5070 5096 N
+ Z SH B b n/a 40 5004 5055 5091 N
+ Z SH B e n/a 40 5004 5055 5091 N
+ Z SH CH e n/a 40 5004 5055 5088 N
+ Z SH D b n/a 40 5004 5055 5086 N
+ Z SH D e n/a 40 5004 5055 5086 N
+ Z SH DH e n/a 40 5004 5055 5072 N
+ Z SH EH b n/a 40 5004 5070 5104 N
+ Z SH EH e n/a 40 5004 5070 5106 N
+ Z SH ER b n/a 40 5004 5070 5110 N
+ Z SH ER e n/a 40 5004 5070 5111 N
+ Z SH EY b n/a 40 5004 5070 5104 N
+ Z SH EY e n/a 40 5004 5070 5106 N
+ Z SH F e n/a 40 5004 5055 5078 N
+ Z SH G e n/a 40 5004 5055 5093 N
+ Z SH HH b n/a 40 5004 5055 5075 N
+ Z SH HH e n/a 40 5004 5055 5075 N
+ Z SH IH b n/a 40 5004 5070 5100 N
+ Z SH IH e n/a 40 5004 5070 5098 N
+ Z SH IY b n/a 40 5004 5070 5101 N
+ Z SH IY e n/a 40 5004 5070 5098 N
+ Z SH JH e n/a 40 5004 5055 5086 N
+ Z SH K b n/a 40 5004 5055 5092 N
+ Z SH K e n/a 40 5004 5055 5092 N
+ Z SH L b n/a 40 5004 5055 5114 N
+ Z SH L e n/a 40 5004 5055 5114 N
+ Z SH M b n/a 40 5004 5055 5112 N
+ Z SH M e n/a 40 5004 5055 5112 N
+ Z SH N b n/a 40 5004 5055 5113 N
+ Z SH N e n/a 40 5004 5055 5113 N
+ Z SH NG e n/a 40 5004 5055 5112 N
+ Z SH OW b n/a 40 5004 5070 5095 N
+ Z SH OW e n/a 40 5004 5070 5096 N
+ Z SH OY e n/a 40 5004 5070 5096 N
+ Z SH P e n/a 40 5004 5055 5090 N
+ Z SH R b n/a 40 5004 5055 5116 N
+ Z SH R e n/a 40 5004 5055 5116 N
+ Z SH S e n/a 40 5004 5055 5072 N
+ Z SH SH e n/a 40 5004 5055 5077 N
+ Z SH SIL e n/a 40 5004 5055 5082 N
+ Z SH T e n/a 40 5004 5055 5088 N
+ Z SH TH e n/a 40 5004 5055 5072 N
+ Z SH UH b n/a 40 5004 5070 5100 N
+ Z SH UH e n/a 40 5004 5070 5098 N
+ Z SH UW b n/a 40 5004 5070 5097 N
+ Z SH UW e n/a 40 5004 5070 5097 N
+ Z SH V b n/a 40 5004 5055 5072 N
+ Z SH V e n/a 40 5004 5055 5072 N
+ Z SH W b n/a 40 5004 5055 5115 N
+ Z SH W e n/a 40 5004 5055 5115 N
+ Z SH Y b n/a 40 5004 5055 5076 N
+ Z SH Y e n/a 40 5004 5055 5076 N
+ Z SH Z b n/a 40 5004 5055 5072 N
+ Z SH Z e n/a 40 5004 5055 5072 N
+ Z SH ZH e n/a 40 5004 5055 5072 N
+ Z SIL AA b n/a 40 5004 5070 5095 N
+ Z SIL AE b n/a 40 5004 5070 5104 N
+ Z SIL AH b n/a 40 5004 5070 5109 N
+ Z SIL AO b n/a 40 5004 5070 5095 N
+ Z SIL AW b n/a 40 5004 5070 5104 N
+ Z SIL AY b n/a 40 5004 5070 5094 N
+ Z SIL B b n/a 40 5004 5054 5091 N
+ Z SIL D b n/a 40 5004 5054 5086 N
+ Z SIL EH b n/a 40 5004 5070 5104 N
+ Z SIL ER b n/a 40 5004 5070 5110 N
+ Z SIL EY b n/a 40 5004 5070 5104 N
+ Z SIL HH b n/a 40 5004 5054 5075 N
+ Z SIL IH b n/a 40 5004 5070 5100 N
+ Z SIL IY b n/a 40 5004 5070 5101 N
+ Z SIL K b n/a 40 5004 5054 5092 N
+ Z SIL L b n/a 40 5004 5054 5114 N
+ Z SIL M b n/a 40 5004 5054 5112 N
+ Z SIL N b n/a 40 5004 5054 5113 N
+ Z SIL OW b n/a 40 5004 5070 5095 N
+ Z SIL R b n/a 40 5004 5054 5116 N
+ Z SIL UH b n/a 40 5004 5070 5100 N
+ Z SIL UW b n/a 40 5004 5070 5097 N
+ Z SIL V b n/a 40 5004 5054 5072 N
+ Z SIL W b n/a 40 5004 5054 5115 N
+ Z SIL Y b n/a 40 5004 5054 5076 N
+ Z SIL Z b n/a 40 5004 5054 5072 N
+ Z T AA b n/a 40 5003 5070 5095 N
+ Z T AA e n/a 40 5003 5069 5096 N
+ Z T AA i n/a 40 5003 5070 5095 N
+ Z T AE b n/a 40 5003 5070 5104 N
+ Z T AE e n/a 40 5003 5069 5105 N
+ Z T AH b n/a 40 5003 5070 5109 N
+ Z T AH e n/a 40 5003 5069 5109 N
+ Z T AH i n/a 40 5003 5070 5102 N
+ Z T AO b n/a 40 5003 5070 5095 N
+ Z T AO e n/a 40 5003 5069 5096 N
+ Z T AO i n/a 40 5003 5070 5095 N
+ Z T AW b n/a 40 5003 5070 5104 N
+ Z T AW e n/a 40 5003 5069 5104 N
+ Z T AY b n/a 40 5003 5070 5094 N
+ Z T AY e n/a 40 5003 5069 5096 N
+ Z T B b n/a 40 5003 5068 5091 N
+ Z T B e n/a 40 5003 5068 5091 N
+ Z T CH e n/a 40 5003 5068 5088 N
+ Z T D b n/a 40 5003 5068 5086 N
+ Z T D e n/a 40 5003 5068 5086 N
+ Z T DH e n/a 40 5003 5068 5072 N
+ Z T EH b n/a 40 5003 5070 5104 N
+ Z T EH e n/a 40 5003 5069 5106 N
+ Z T ER b n/a 40 5003 5070 5110 N
+ Z T ER e n/a 40 5003 5069 5111 N
+ Z T ER i n/a 40 5003 5070 5110 N
+ Z T EY b n/a 40 5003 5070 5104 N
+ Z T EY e n/a 40 5003 5069 5106 N
+ Z T F e n/a 40 5003 5068 5078 N
+ Z T G e n/a 40 5003 5068 5093 N
+ Z T HH b n/a 40 5003 5068 5075 N
+ Z T HH e n/a 40 5003 5068 5075 N
+ Z T IH b n/a 40 5003 5070 5100 N
+ Z T IH e n/a 40 5003 5069 5098 N
+ Z T IH i n/a 40 5003 5070 5100 N
+ Z T IY b n/a 40 5003 5070 5101 N
+ Z T IY e n/a 40 5003 5069 5098 N
+ Z T IY i n/a 40 5003 5070 5101 N
+ Z T JH e n/a 40 5003 5068 5086 N
+ Z T K b n/a 40 5003 5068 5092 N
+ Z T K e n/a 40 5003 5068 5092 N
+ Z T L b n/a 40 5003 5068 5114 N
+ Z T L e n/a 40 5003 5068 5114 N
+ Z T L i n/a 40 5003 5068 5114 N
+ Z T M b n/a 40 5003 5068 5112 N
+ Z T M e n/a 40 5003 5068 5112 N
+ Z T M i n/a 40 5003 5068 5112 N
+ Z T N b n/a 40 5003 5068 5113 N
+ Z T N e n/a 40 5003 5068 5113 N
+ Z T NG e n/a 40 5003 5068 5112 N
+ Z T OW b n/a 40 5003 5070 5095 N
+ Z T OW e n/a 40 5003 5069 5096 N
+ Z T OW i n/a 40 5003 5070 5095 N
+ Z T OY e n/a 40 5003 5069 5096 N
+ Z T P e n/a 40 5003 5068 5090 N
+ Z T R b n/a 40 5003 5068 5116 N
+ Z T R e n/a 40 5003 5068 5116 N
+ Z T S e n/a 40 5003 5068 5072 N
+ Z T SH e n/a 40 5003 5068 5077 N
+ Z T SH i n/a 40 5003 5068 5077 N
+ Z T SIL e n/a 40 5003 5067 5081 N
+ Z T T e n/a 40 5003 5068 5088 N
+ Z T T i n/a 40 5003 5068 5088 N
+ Z T TH e n/a 40 5003 5068 5072 N
+ Z T UH b n/a 40 5003 5070 5100 N
+ Z T UH e n/a 40 5003 5069 5098 N
+ Z T UW b n/a 40 5003 5070 5097 N
+ Z T UW e n/a 40 5003 5069 5097 N
+ Z T UW i n/a 40 5003 5070 5097 N
+ Z T V b n/a 40 5003 5068 5072 N
+ Z T V e n/a 40 5003 5068 5072 N
+ Z T W b n/a 40 5003 5068 5115 N
+ Z T W e n/a 40 5003 5068 5115 N
+ Z T Y b n/a 40 5003 5068 5076 N
+ Z T Y e n/a 40 5003 5068 5076 N
+ Z T Z b n/a 40 5003 5068 5072 N
+ Z T Z e n/a 40 5003 5068 5072 N
+ Z T ZH e n/a 40 5003 5068 5072 N
+ Z TH AA b n/a 40 5004 5070 5095 N
+ Z TH AA e n/a 40 5004 5070 5096 N
+ Z TH AE b n/a 40 5004 5070 5104 N
+ Z TH AE e n/a 40 5004 5070 5105 N
+ Z TH AH b n/a 40 5004 5070 5109 N
+ Z TH AH e n/a 40 5004 5070 5109 N
+ Z TH AO b n/a 40 5004 5070 5095 N
+ Z TH AO e n/a 40 5004 5070 5096 N
+ Z TH AW b n/a 40 5004 5070 5104 N
+ Z TH AW e n/a 40 5004 5070 5104 N
+ Z TH AY b n/a 40 5004 5070 5094 N
+ Z TH AY e n/a 40 5004 5070 5096 N
+ Z TH B b n/a 40 5004 5055 5091 N
+ Z TH B e n/a 40 5004 5055 5091 N
+ Z TH CH e n/a 40 5004 5055 5088 N
+ Z TH D b n/a 40 5004 5055 5086 N
+ Z TH D e n/a 40 5004 5055 5086 N
+ Z TH DH e n/a 40 5004 5055 5072 N
+ Z TH EH b n/a 40 5004 5070 5104 N
+ Z TH EH e n/a 40 5004 5070 5106 N
+ Z TH ER b n/a 40 5004 5070 5110 N
+ Z TH ER e n/a 40 5004 5070 5111 N
+ Z TH EY b n/a 40 5004 5070 5104 N
+ Z TH EY e n/a 40 5004 5070 5106 N
+ Z TH F e n/a 40 5004 5055 5078 N
+ Z TH G e n/a 40 5004 5055 5093 N
+ Z TH HH b n/a 40 5004 5055 5075 N
+ Z TH HH e n/a 40 5004 5055 5075 N
+ Z TH IH b n/a 40 5004 5070 5100 N
+ Z TH IH e n/a 40 5004 5070 5098 N
+ Z TH IY b n/a 40 5004 5070 5101 N
+ Z TH IY e n/a 40 5004 5070 5098 N
+ Z TH JH e n/a 40 5004 5055 5086 N
+ Z TH K b n/a 40 5004 5055 5092 N
+ Z TH K e n/a 40 5004 5055 5092 N
+ Z TH L b n/a 40 5004 5055 5114 N
+ Z TH L e n/a 40 5004 5055 5114 N
+ Z TH M b n/a 40 5004 5055 5112 N
+ Z TH M e n/a 40 5004 5055 5112 N
+ Z TH N b n/a 40 5004 5055 5113 N
+ Z TH N e n/a 40 5004 5055 5113 N
+ Z TH NG e n/a 40 5004 5055 5112 N
+ Z TH OW b n/a 40 5004 5070 5095 N
+ Z TH OW e n/a 40 5004 5070 5096 N
+ Z TH OY e n/a 40 5004 5070 5096 N
+ Z TH P e n/a 40 5004 5055 5090 N
+ Z TH R b n/a 40 5004 5055 5116 N
+ Z TH R e n/a 40 5004 5055 5116 N
+ Z TH S e n/a 40 5004 5055 5072 N
+ Z TH SH e n/a 40 5004 5055 5077 N
+ Z TH SIL e n/a 40 5004 5055 5082 N
+ Z TH T e n/a 40 5004 5055 5088 N
+ Z TH TH e n/a 40 5004 5055 5072 N
+ Z TH UH b n/a 40 5004 5070 5100 N
+ Z TH UH e n/a 40 5004 5070 5098 N
+ Z TH UW b n/a 40 5004 5070 5097 N
+ Z TH UW e n/a 40 5004 5070 5097 N
+ Z TH V b n/a 40 5004 5055 5072 N
+ Z TH V e n/a 40 5004 5055 5072 N
+ Z TH W b n/a 40 5004 5055 5115 N
+ Z TH W e n/a 40 5004 5055 5115 N
+ Z TH Y b n/a 40 5004 5055 5076 N
+ Z TH Y e n/a 40 5004 5055 5076 N
+ Z TH Z b n/a 40 5004 5055 5072 N
+ Z TH Z e n/a 40 5004 5055 5072 N
+ Z TH ZH e n/a 40 5004 5055 5072 N
+ Z UH AA b n/a 40 5023 5063 5095 N
+ Z UH AA e n/a 40 5023 5063 5096 N
+ Z UH AE b n/a 40 5023 5060 5104 N
+ Z UH AE e n/a 40 5023 5060 5106 N
+ Z UH AH b n/a 40 5023 5060 5109 N
+ Z UH AH e n/a 40 5023 5060 5109 N
+ Z UH AH i n/a 40 5023 5060 5102 N
+ Z UH AO b n/a 40 5023 5060 5095 N
+ Z UH AO e n/a 40 5023 5063 5096 N
+ Z UH AW b n/a 40 5023 5060 5104 N
+ Z UH AW e n/a 40 5023 5060 5104 N
+ Z UH AY b n/a 40 5023 5063 5094 N
+ Z UH AY e n/a 40 5023 5063 5096 N
+ Z UH B b n/a 40 5022 5034 5091 N
+ Z UH B e n/a 40 5022 5034 5091 N
+ Z UH CH e n/a 40 5021 5040 5087 N
+ Z UH D b n/a 40 5022 5034 5086 N
+ Z UH D e n/a 40 5022 5034 5086 N
+ Z UH DH e n/a 40 5022 5033 5072 N
+ Z UH EH b n/a 40 5023 5060 5104 N
+ Z UH EH e n/a 40 5023 5060 5106 N
+ Z UH ER b n/a 40 5023 5060 5110 N
+ Z UH ER e n/a 40 5023 5063 5111 N
+ Z UH EY b n/a 40 5023 5060 5104 N
+ Z UH EY e n/a 40 5023 5060 5106 N
+ Z UH F e n/a 40 5021 5040 5078 N
+ Z UH G e n/a 40 5022 5034 5093 N
+ Z UH HH b n/a 40 5021 5038 5075 N
+ Z UH HH e n/a 40 5021 5038 5075 N
+ Z UH IH b n/a 40 5023 5060 5100 N
+ Z UH IH e n/a 40 5023 5060 5098 N
+ Z UH IY b n/a 40 5023 5060 5101 N
+ Z UH IY e n/a 40 5023 5060 5098 N
+ Z UH IY i n/a 40 5023 5060 5101 N
+ Z UH JH e n/a 40 5022 5034 5086 N
+ Z UH K b n/a 40 5021 5042 5092 N
+ Z UH K e n/a 40 5021 5042 5092 N
+ Z UH L b n/a 40 5023 5034 5114 N
+ Z UH L e n/a 40 5023 5034 5114 N
+ Z UH M b n/a 40 5023 5034 5112 N
+ Z UH M e n/a 40 5023 5034 5112 N
+ Z UH N b n/a 40 5023 5034 5113 N
+ Z UH N e n/a 40 5023 5034 5113 N
+ Z UH NG e n/a 40 5023 5034 5112 N
+ Z UH OW b n/a 40 5023 5060 5095 N
+ Z UH OW e n/a 40 5023 5063 5096 N
+ Z UH OY e n/a 40 5023 5063 5096 N
+ Z UH P e n/a 40 5021 5040 5090 N
+ Z UH R b n/a 40 5023 5037 5116 N
+ Z UH R e n/a 40 5023 5037 5116 N
+ Z UH S e n/a 40 5021 5038 5072 N
+ Z UH SH e n/a 40 5021 5035 5077 N
+ Z UH SIL e n/a 40 5024 5044 5082 N
+ Z UH T e n/a 40 5021 5040 5087 N
+ Z UH TH e n/a 40 5021 5038 5072 N
+ Z UH UH b n/a 40 5023 5060 5100 N
+ Z UH UH e n/a 40 5023 5063 5098 N
+ Z UH UW b n/a 40 5023 5060 5097 N
+ Z UH UW e n/a 40 5023 5063 5097 N
+ Z UH V b n/a 40 5022 5034 5072 N
+ Z UH V e n/a 40 5022 5034 5072 N
+ Z UH W b n/a 40 5023 5036 5115 N
+ Z UH W e n/a 40 5023 5036 5115 N
+ Z UH Y b n/a 40 5022 5035 5076 N
+ Z UH Y e n/a 40 5022 5035 5076 N
+ Z UH Z b n/a 40 5022 5034 5072 N
+ Z UH Z e n/a 40 5022 5034 5072 N
+ Z UH ZH e n/a 40 5022 5034 5072 N
+ Z UW AA b n/a 40 5021 5064 5095 N
+ Z UW AA e n/a 40 5021 5064 5096 N
+ Z UW AA i n/a 40 5021 5064 5095 N
+ Z UW AE b n/a 40 5021 5064 5104 N
+ Z UW AE e n/a 40 5021 5064 5105 N
+ Z UW AE i n/a 40 5021 5064 5104 N
+ Z UW AH b n/a 40 5021 5064 5109 N
+ Z UW AH e n/a 40 5021 5064 5109 N
+ Z UW AH i n/a 40 5021 5064 5100 N
+ Z UW AO b n/a 40 5021 5064 5095 N
+ Z UW AO e n/a 40 5021 5064 5096 N
+ Z UW AO i n/a 40 5021 5064 5095 N
+ Z UW AW b n/a 40 5021 5064 5104 N
+ Z UW AW e n/a 40 5021 5064 5104 N
+ Z UW AW i n/a 40 5021 5064 5104 N
+ Z UW AY b n/a 40 5021 5064 5094 N
+ Z UW AY e n/a 40 5021 5064 5096 N
+ Z UW B b n/a 40 5021 5034 5091 N
+ Z UW B e n/a 40 5021 5034 5091 N
+ Z UW B i n/a 40 5021 5034 5091 N
+ Z UW CH e n/a 40 5021 5040 5087 N
+ Z UW D b n/a 40 5021 5034 5086 N
+ Z UW D e n/a 40 5021 5034 5086 N
+ Z UW D i n/a 40 5021 5034 5087 N
+ Z UW DH e n/a 40 5021 5033 5072 N
+ Z UW EH b n/a 40 5021 5064 5104 N
+ Z UW EH e n/a 40 5021 5064 5106 N
+ Z UW EH i n/a 40 5021 5064 5104 N
+ Z UW ER b n/a 40 5021 5064 5110 N
+ Z UW ER e n/a 40 5021 5064 5111 N
+ Z UW ER i n/a 40 5021 5064 5110 N
+ Z UW EY b n/a 40 5021 5064 5104 N
+ Z UW EY e n/a 40 5021 5064 5106 N
+ Z UW EY i n/a 40 5021 5064 5104 N
+ Z UW F e n/a 40 5021 5040 5078 N
+ Z UW G e n/a 40 5021 5034 5093 N
+ Z UW G i n/a 40 5021 5034 5093 N
+ Z UW HH b n/a 40 5021 5038 5075 N
+ Z UW HH e n/a 40 5021 5038 5075 N
+ Z UW IH b n/a 40 5021 5064 5100 N
+ Z UW IH e n/a 40 5021 5064 5098 N
+ Z UW IH i n/a 40 5021 5064 5100 N
+ Z UW IY b n/a 40 5021 5064 5101 N
+ Z UW IY e n/a 40 5021 5064 5098 N
+ Z UW IY i n/a 40 5021 5064 5101 N
+ Z UW JH e n/a 40 5021 5034 5086 N
+ Z UW K b n/a 40 5021 5042 5092 N
+ Z UW K e n/a 40 5021 5042 5092 N
+ Z UW K i n/a 40 5021 5042 5092 N
+ Z UW L b n/a 40 5021 5034 5114 N
+ Z UW L e n/a 40 5021 5034 5114 N
+ Z UW L i n/a 40 5021 5034 5114 N
+ Z UW M b n/a 40 5021 5034 5112 N
+ Z UW M e n/a 40 5021 5034 5112 N
+ Z UW M i n/a 40 5021 5034 5112 N
+ Z UW N b n/a 40 5021 5034 5113 N
+ Z UW N e n/a 40 5021 5034 5113 N
+ Z UW N i n/a 40 5021 5034 5113 N
+ Z UW NG e n/a 40 5021 5034 5112 N
+ Z UW OW b n/a 40 5021 5064 5095 N
+ Z UW OW e n/a 40 5021 5064 5096 N
+ Z UW OW i n/a 40 5021 5064 5095 N
+ Z UW OY e n/a 40 5021 5064 5096 N
+ Z UW P e n/a 40 5021 5040 5090 N
+ Z UW P i n/a 40 5021 5040 5090 N
+ Z UW R b n/a 40 5021 5037 5116 N
+ Z UW R e n/a 40 5021 5037 5116 N
+ Z UW R i n/a 40 5021 5037 5116 N
+ Z UW S e n/a 40 5021 5038 5072 N
+ Z UW S i n/a 40 5021 5038 5072 N
+ Z UW SH e n/a 40 5021 5035 5077 N
+ Z UW SIL e n/a 40 5024 5044 5079 N
+ Z UW T e n/a 40 5021 5040 5087 N
+ Z UW T i n/a 40 5021 5040 5087 N
+ Z UW TH e n/a 40 5021 5038 5072 N
+ Z UW UH b n/a 40 5021 5064 5100 N
+ Z UW UH e n/a 40 5021 5064 5098 N
+ Z UW UW b n/a 40 5021 5064 5097 N
+ Z UW UW e n/a 40 5021 5064 5097 N
+ Z UW UW i n/a 40 5021 5064 5097 N
+ Z UW V b n/a 40 5021 5034 5072 N
+ Z UW V e n/a 40 5021 5034 5072 N
+ Z UW W b n/a 40 5021 5036 5115 N
+ Z UW W e n/a 40 5021 5036 5115 N
+ Z UW W i n/a 40 5021 5036 5115 N
+ Z UW Y b n/a 40 5021 5035 5076 N
+ Z UW Y e n/a 40 5021 5035 5076 N
+ Z UW Y i n/a 40 5021 5035 5076 N
+ Z UW Z b n/a 40 5021 5034 5072 N
+ Z UW Z e n/a 40 5021 5034 5072 N
+ Z UW ZH e n/a 40 5021 5034 5072 N
+ Z V AA b n/a 40 5005 5070 5095 N
+ Z V AA e n/a 40 5005 5070 5096 N
+ Z V AE b n/a 40 5005 5070 5104 N
+ Z V AE e n/a 40 5005 5070 5105 N
+ Z V AH b n/a 40 5005 5070 5109 N
+ Z V AH e n/a 40 5005 5070 5109 N
+ Z V AH i n/a 40 5005 5070 5103 N
+ Z V AO b n/a 40 5005 5070 5095 N
+ Z V AO e n/a 40 5005 5070 5096 N
+ Z V AW b n/a 40 5005 5070 5104 N
+ Z V AW e n/a 40 5005 5070 5104 N
+ Z V AY b n/a 40 5005 5070 5094 N
+ Z V AY e n/a 40 5005 5070 5096 N
+ Z V B b n/a 40 5005 5055 5091 N
+ Z V B e n/a 40 5005 5055 5091 N
+ Z V CH e n/a 40 5005 5055 5088 N
+ Z V D b n/a 40 5005 5055 5086 N
+ Z V D e n/a 40 5005 5055 5086 N
+ Z V D i n/a 40 5005 5055 5088 N
+ Z V DH e n/a 40 5005 5055 5072 N
+ Z V EH b n/a 40 5005 5070 5104 N
+ Z V EH e n/a 40 5005 5070 5106 N
+ Z V ER b n/a 40 5005 5070 5110 N
+ Z V ER e n/a 40 5005 5070 5111 N
+ Z V EY b n/a 40 5005 5070 5104 N
+ Z V EY e n/a 40 5005 5070 5106 N
+ Z V F e n/a 40 5005 5055 5078 N
+ Z V G e n/a 40 5005 5055 5093 N
+ Z V HH b n/a 40 5005 5055 5075 N
+ Z V HH e n/a 40 5005 5055 5075 N
+ Z V IH b n/a 40 5005 5070 5100 N
+ Z V IH e n/a 40 5005 5070 5098 N
+ Z V IH i n/a 40 5005 5070 5100 N
+ Z V IY b n/a 40 5005 5070 5101 N
+ Z V IY e n/a 40 5005 5070 5098 N
+ Z V IY i n/a 40 5005 5070 5101 N
+ Z V JH e n/a 40 5005 5055 5086 N
+ Z V K b n/a 40 5005 5055 5092 N
+ Z V K e n/a 40 5005 5055 5092 N
+ Z V L b n/a 40 5005 5055 5114 N
+ Z V L e n/a 40 5005 5055 5114 N
+ Z V M b n/a 40 5005 5055 5112 N
+ Z V M e n/a 40 5005 5055 5112 N
+ Z V N b n/a 40 5005 5055 5113 N
+ Z V N e n/a 40 5005 5055 5113 N
+ Z V NG e n/a 40 5005 5055 5112 N
+ Z V OW b n/a 40 5005 5070 5095 N
+ Z V OW e n/a 40 5005 5070 5096 N
+ Z V OY e n/a 40 5005 5070 5096 N
+ Z V P e n/a 40 5005 5055 5090 N
+ Z V R b n/a 40 5005 5055 5116 N
+ Z V R e n/a 40 5005 5055 5116 N
+ Z V S e n/a 40 5005 5055 5072 N
+ Z V SH e n/a 40 5005 5055 5077 N
+ Z V SIL e n/a 40 5003 5055 5082 N
+ Z V T e n/a 40 5005 5055 5088 N
+ Z V T i n/a 40 5005 5055 5088 N
+ Z V TH e n/a 40 5005 5055 5072 N
+ Z V UH b n/a 40 5005 5070 5100 N
+ Z V UH e n/a 40 5005 5070 5098 N
+ Z V UW b n/a 40 5005 5070 5097 N
+ Z V UW e n/a 40 5005 5070 5097 N
+ Z V V b n/a 40 5005 5055 5072 N
+ Z V V e n/a 40 5005 5055 5072 N
+ Z V W b n/a 40 5005 5055 5115 N
+ Z V W e n/a 40 5005 5055 5115 N
+ Z V Y b n/a 40 5005 5055 5076 N
+ Z V Y e n/a 40 5005 5055 5076 N
+ Z V Z b n/a 40 5005 5055 5072 N
+ Z V Z e n/a 40 5005 5055 5072 N
+ Z V ZH e n/a 40 5005 5055 5072 N
+ Z W AA b n/a 40 5010 5059 5095 N
+ Z W AE b n/a 40 5010 5059 5104 N
+ Z W AH b n/a 40 5010 5059 5108 N
+ Z W AO b n/a 40 5010 5059 5095 N
+ Z W AW b n/a 40 5010 5059 5104 N
+ Z W AY b n/a 40 5010 5059 5094 N
+ Z W B b n/a 40 5010 5054 5091 N
+ Z W D b n/a 40 5010 5054 5086 N
+ Z W EH b n/a 40 5010 5059 5104 N
+ Z W ER b n/a 40 5010 5059 5110 N
+ Z W EY b n/a 40 5010 5059 5104 N
+ Z W HH b n/a 40 5010 5054 5075 N
+ Z W IH b n/a 40 5010 5059 5100 N
+ Z W IY b n/a 40 5010 5059 5101 N
+ Z W K b n/a 40 5010 5054 5092 N
+ Z W L b n/a 40 5010 5054 5114 N
+ Z W M b n/a 40 5010 5054 5112 N
+ Z W N b n/a 40 5010 5054 5113 N
+ Z W OW b n/a 40 5010 5059 5095 N
+ Z W R b n/a 40 5010 5054 5116 N
+ Z W UH b n/a 40 5010 5059 5100 N
+ Z W UW b n/a 40 5010 5059 5097 N
+ Z W V b n/a 40 5010 5054 5072 N
+ Z W W b n/a 40 5010 5054 5115 N
+ Z W Y b n/a 40 5010 5054 5076 N
+ Z W Z b n/a 40 5010 5054 5072 N
+ Z Y AA b n/a 40 5010 5063 5095 N
+ Z Y AA e n/a 40 5010 5063 5095 N
+ Z Y AE b n/a 40 5010 5060 5104 N
+ Z Y AE e n/a 40 5010 5060 5105 N
+ Z Y AH b n/a 40 5010 5060 5109 N
+ Z Y AH e n/a 40 5010 5060 5109 N
+ Z Y AO b n/a 40 5010 5060 5095 N
+ Z Y AO e n/a 40 5010 5063 5095 N
+ Z Y AW b n/a 40 5010 5060 5104 N
+ Z Y AW e n/a 40 5010 5060 5104 N
+ Z Y AY b n/a 40 5010 5063 5094 N
+ Z Y AY e n/a 40 5010 5063 5094 N
+ Z Y B b n/a 40 5010 5054 5091 N
+ Z Y B e n/a 40 5010 5054 5091 N
+ Z Y CH e n/a 40 5010 5054 5087 N
+ Z Y D b n/a 40 5010 5054 5086 N
+ Z Y D e n/a 40 5010 5054 5086 N
+ Z Y DH e n/a 40 5010 5054 5073 N
+ Z Y EH b n/a 40 5010 5060 5104 N
+ Z Y EH e n/a 40 5010 5060 5106 N
+ Z Y ER b n/a 40 5010 5060 5110 N
+ Z Y ER e n/a 40 5010 5063 5111 N
+ Z Y EY b n/a 40 5010 5060 5104 N
+ Z Y EY e n/a 40 5010 5060 5106 N
+ Z Y F e n/a 40 5010 5054 5078 N
+ Z Y G e n/a 40 5010 5054 5093 N
+ Z Y HH b n/a 40 5010 5054 5075 N
+ Z Y HH e n/a 40 5010 5054 5075 N
+ Z Y IH b n/a 40 5010 5060 5100 N
+ Z Y IH e n/a 40 5010 5060 5099 N
+ Z Y IY b n/a 40 5010 5060 5101 N
+ Z Y IY e n/a 40 5010 5060 5098 N
+ Z Y JH e n/a 40 5010 5054 5086 N
+ Z Y K b n/a 40 5010 5054 5092 N
+ Z Y K e n/a 40 5010 5054 5092 N
+ Z Y L b n/a 40 5010 5054 5114 N
+ Z Y L e n/a 40 5010 5054 5114 N
+ Z Y M b n/a 40 5010 5054 5112 N
+ Z Y M e n/a 40 5010 5054 5112 N
+ Z Y N b n/a 40 5010 5054 5113 N
+ Z Y N e n/a 40 5010 5054 5113 N
+ Z Y NG e n/a 40 5010 5054 5112 N
+ Z Y OW b n/a 40 5010 5060 5095 N
+ Z Y OW e n/a 40 5010 5063 5095 N
+ Z Y OY e n/a 40 5010 5063 5094 N
+ Z Y P e n/a 40 5010 5054 5090 N
+ Z Y R b n/a 40 5010 5054 5116 N
+ Z Y R e n/a 40 5010 5054 5116 N
+ Z Y S e n/a 40 5010 5054 5071 N
+ Z Y SH e n/a 40 5010 5054 5077 N
+ Z Y SIL e n/a 40 5010 5054 5085 N
+ Z Y T e n/a 40 5010 5054 5087 N
+ Z Y TH e n/a 40 5010 5054 5072 N
+ Z Y UH b n/a 40 5010 5060 5100 N
+ Z Y UH e n/a 40 5010 5063 5099 N
+ Z Y UW b n/a 40 5010 5060 5097 N
+ Z Y UW e n/a 40 5010 5063 5097 N
+ Z Y V b n/a 40 5010 5054 5074 N
+ Z Y V e n/a 40 5010 5054 5074 N
+ Z Y W b n/a 40 5010 5054 5115 N
+ Z Y W e n/a 40 5010 5054 5115 N
+ Z Y Y b n/a 40 5010 5054 5076 N
+ Z Y Y e n/a 40 5010 5054 5076 N
+ Z Y Z b n/a 40 5010 5054 5074 N
+ Z Y Z e n/a 40 5010 5054 5074 N
+ Z Y ZH e n/a 40 5010 5054 5074 N
+ Z Z AA b n/a 40 5004 5070 5095 N
+ Z Z AA e n/a 40 5004 5070 5096 N
+ Z Z AE b n/a 40 5004 5070 5104 N
+ Z Z AE e n/a 40 5004 5070 5105 N
+ Z Z AH b n/a 40 5004 5070 5109 N
+ Z Z AH e n/a 40 5004 5070 5109 N
+ Z Z AO b n/a 40 5004 5070 5095 N
+ Z Z AO e n/a 40 5004 5070 5096 N
+ Z Z AW b n/a 40 5004 5070 5104 N
+ Z Z AW e n/a 40 5004 5070 5104 N
+ Z Z AY b n/a 40 5004 5070 5094 N
+ Z Z AY e n/a 40 5004 5070 5096 N
+ Z Z B b n/a 40 5004 5055 5091 N
+ Z Z B e n/a 40 5004 5055 5091 N
+ Z Z CH e n/a 40 5004 5055 5088 N
+ Z Z D b n/a 40 5004 5055 5086 N
+ Z Z D e n/a 40 5004 5055 5086 N
+ Z Z DH e n/a 40 5004 5055 5072 N
+ Z Z EH b n/a 40 5004 5070 5104 N
+ Z Z EH e n/a 40 5004 5070 5106 N
+ Z Z ER b n/a 40 5004 5070 5110 N
+ Z Z ER e n/a 40 5004 5070 5111 N
+ Z Z EY b n/a 40 5004 5070 5104 N
+ Z Z EY e n/a 40 5004 5070 5106 N
+ Z Z F e n/a 40 5004 5055 5078 N
+ Z Z G e n/a 40 5004 5055 5093 N
+ Z Z HH b n/a 40 5004 5055 5075 N
+ Z Z HH e n/a 40 5004 5055 5075 N
+ Z Z IH b n/a 40 5004 5070 5100 N
+ Z Z IH e n/a 40 5004 5070 5098 N
+ Z Z IH i n/a 40 5004 5070 5100 N
+ Z Z IY b n/a 40 5004 5070 5101 N
+ Z Z IY e n/a 40 5004 5070 5098 N
+ Z Z JH e n/a 40 5004 5055 5086 N
+ Z Z K b n/a 40 5004 5055 5092 N
+ Z Z K e n/a 40 5004 5055 5092 N
+ Z Z L b n/a 40 5004 5055 5114 N
+ Z Z L e n/a 40 5004 5055 5114 N
+ Z Z M b n/a 40 5004 5055 5112 N
+ Z Z M e n/a 40 5004 5055 5112 N
+ Z Z N b n/a 40 5004 5055 5113 N
+ Z Z N e n/a 40 5004 5055 5113 N
+ Z Z NG e n/a 40 5004 5055 5112 N
+ Z Z OW b n/a 40 5004 5070 5095 N
+ Z Z OW e n/a 40 5004 5070 5096 N
+ Z Z OY e n/a 40 5004 5070 5096 N
+ Z Z P e n/a 40 5004 5055 5090 N
+ Z Z R b n/a 40 5004 5055 5116 N
+ Z Z R e n/a 40 5004 5055 5116 N
+ Z Z S e n/a 40 5004 5055 5072 N
+ Z Z SH e n/a 40 5004 5055 5077 N
+ Z Z SIL e n/a 40 5004 5055 5081 N
+ Z Z T e n/a 40 5004 5055 5088 N
+ Z Z TH e n/a 40 5004 5055 5072 N
+ Z Z UH b n/a 40 5004 5070 5100 N
+ Z Z UH e n/a 40 5004 5070 5098 N
+ Z Z UW b n/a 40 5004 5070 5097 N
+ Z Z UW e n/a 40 5004 5070 5097 N
+ Z Z V b n/a 40 5004 5055 5072 N
+ Z Z V e n/a 40 5004 5055 5072 N
+ Z Z W b n/a 40 5004 5055 5115 N
+ Z Z W e n/a 40 5004 5055 5115 N
+ Z Z Y b n/a 40 5004 5055 5076 N
+ Z Z Y e n/a 40 5004 5055 5076 N
+ Z Z Z b n/a 40 5004 5055 5072 N
+ Z Z Z e n/a 40 5004 5055 5072 N
+ Z Z ZH e n/a 40 5004 5055 5072 N
+ Z ZH AA b n/a 40 5004 5070 5095 N
+ Z ZH AE b n/a 40 5004 5070 5104 N
+ Z ZH AH b n/a 40 5004 5070 5109 N
+ Z ZH AO b n/a 40 5004 5070 5095 N
+ Z ZH AW b n/a 40 5004 5070 5104 N
+ Z ZH AY b n/a 40 5004 5070 5094 N
+ Z ZH B b n/a 40 5004 5055 5091 N
+ Z ZH D b n/a 40 5004 5055 5086 N
+ Z ZH EH b n/a 40 5004 5070 5104 N
+ Z ZH ER b n/a 40 5004 5070 5110 N
+ Z ZH EY b n/a 40 5004 5070 5104 N
+ Z ZH HH b n/a 40 5004 5055 5075 N
+ Z ZH IH b n/a 40 5004 5070 5100 N
+ Z ZH IY b n/a 40 5004 5070 5101 N
+ Z ZH K b n/a 40 5004 5055 5092 N
+ Z ZH L b n/a 40 5004 5055 5114 N
+ Z ZH M b n/a 40 5004 5055 5112 N
+ Z ZH N b n/a 40 5004 5055 5113 N
+ Z ZH OW b n/a 40 5004 5070 5095 N
+ Z ZH R b n/a 40 5004 5055 5116 N
+ Z ZH UH b n/a 40 5004 5070 5100 N
+ Z ZH UW b n/a 40 5004 5070 5097 N
+ Z ZH V b n/a 40 5004 5055 5072 N
+ Z ZH W b n/a 40 5004 5055 5115 N
+ Z ZH Y b n/a 40 5004 5055 5076 N
+ Z ZH Z b n/a 40 5004 5055 5072 N
+ ZH AA AA b n/a 41 5117 5121 5124 N
+ ZH AA AA e n/a 41 5117 5121 5124 N
+ ZH AA AA i n/a 41 5117 5121 5124 N
+ ZH AA AE b n/a 41 5117 5121 5124 N
+ ZH AA AE e n/a 41 5117 5121 5124 N
+ ZH AA AH b n/a 41 5117 5121 5124 N
+ ZH AA AH e n/a 41 5117 5121 5124 N
+ ZH AA AH i n/a 41 5117 5121 5124 N
+ ZH AA AO b n/a 41 5117 5121 5123 N
+ ZH AA AO e n/a 41 5117 5121 5123 N
+ ZH AA AW b n/a 41 5117 5121 5124 N
+ ZH AA AW e n/a 41 5117 5121 5124 N
+ ZH AA AY b n/a 41 5117 5121 5124 N
+ ZH AA AY e n/a 41 5117 5121 5124 N
+ ZH AA B e n/a 41 5117 5121 5125 N
+ ZH AA CH e n/a 41 5117 5121 5125 N
+ ZH AA D e n/a 41 5117 5121 5125 N
+ ZH AA D i n/a 41 5117 5121 5125 N
+ ZH AA DH e n/a 41 5117 5121 5125 N
+ ZH AA EH b n/a 41 5117 5121 5124 N
+ ZH AA EH e n/a 41 5117 5121 5124 N
+ ZH AA EH i n/a 41 5117 5121 5124 N
+ ZH AA ER b n/a 41 5117 5121 5123 N
+ ZH AA ER e n/a 41 5117 5121 5123 N
+ ZH AA ER i n/a 41 5117 5121 5123 N
+ ZH AA EY b n/a 41 5117 5121 5124 N
+ ZH AA EY e n/a 41 5117 5121 5124 N
+ ZH AA F e n/a 41 5117 5121 5125 N
+ ZH AA G e n/a 41 5117 5121 5125 N
+ ZH AA HH e n/a 41 5117 5121 5125 N
+ ZH AA IH b n/a 41 5117 5121 5124 N
+ ZH AA IH e n/a 41 5117 5121 5124 N
+ ZH AA IH i n/a 41 5117 5121 5124 N
+ ZH AA IY b n/a 41 5117 5121 5124 N
+ ZH AA IY e n/a 41 5117 5121 5124 N
+ ZH AA IY i n/a 41 5117 5121 5124 N
+ ZH AA JH e n/a 41 5117 5121 5125 N
+ ZH AA K e n/a 41 5117 5121 5125 N
+ ZH AA K i n/a 41 5117 5121 5125 N
+ ZH AA L e n/a 41 5117 5121 5125 N
+ ZH AA M e n/a 41 5117 5121 5125 N
+ ZH AA N e n/a 41 5117 5121 5125 N
+ ZH AA NG e n/a 41 5117 5121 5125 N
+ ZH AA OW b n/a 41 5117 5121 5125 N
+ ZH AA OW e n/a 41 5117 5121 5125 N
+ ZH AA OY e n/a 41 5117 5121 5123 N
+ ZH AA P e n/a 41 5117 5121 5125 N
+ ZH AA R e n/a 41 5117 5121 5125 N
+ ZH AA S e n/a 41 5117 5121 5125 N
+ ZH AA S i n/a 41 5117 5121 5125 N
+ ZH AA SH e n/a 41 5117 5121 5125 N
+ ZH AA SIL e n/a 41 5117 5121 5125 N
+ ZH AA T e n/a 41 5117 5121 5125 N
+ ZH AA TH e n/a 41 5117 5121 5125 N
+ ZH AA UH b n/a 41 5117 5121 5123 N
+ ZH AA UH e n/a 41 5117 5121 5123 N
+ ZH AA UW b n/a 41 5117 5121 5125 N
+ ZH AA UW e n/a 41 5117 5121 5125 N
+ ZH AA V e n/a 41 5117 5121 5125 N
+ ZH AA W b n/a 41 5117 5121 5125 N
+ ZH AA W e n/a 41 5117 5121 5125 N
+ ZH AA Y e n/a 41 5117 5121 5125 N
+ ZH AA Z e n/a 41 5117 5121 5125 N
+ ZH AA ZH e n/a 41 5117 5121 5125 N
+ ZH AE AA b n/a 41 5117 5121 5124 N
+ ZH AE AE b n/a 41 5117 5121 5124 N
+ ZH AE AH b n/a 41 5117 5121 5124 N
+ ZH AE AH i n/a 41 5117 5121 5124 N
+ ZH AE AO b n/a 41 5117 5121 5123 N
+ ZH AE AW b n/a 41 5117 5121 5124 N
+ ZH AE AY b n/a 41 5117 5121 5124 N
+ ZH AE EH b n/a 41 5117 5121 5124 N
+ ZH AE ER b n/a 41 5117 5121 5123 N
+ ZH AE ER i n/a 41 5117 5121 5123 N
+ ZH AE EY b n/a 41 5117 5121 5124 N
+ ZH AE IH b n/a 41 5117 5121 5124 N
+ ZH AE IH i n/a 41 5117 5121 5124 N
+ ZH AE IY b n/a 41 5117 5121 5124 N
+ ZH AE M i n/a 41 5117 5121 5125 N
+ ZH AE OW b n/a 41 5117 5121 5125 N
+ ZH AE UH b n/a 41 5117 5121 5123 N
+ ZH AE UW b n/a 41 5117 5121 5125 N
+ ZH AE W b n/a 41 5117 5121 5125 N
+ ZH AE W i n/a 41 5117 5121 5125 N
+ ZH AH AA b n/a 41 5118 5121 5124 N
+ ZH AH AE b n/a 41 5118 5121 5124 N
+ ZH AH AH b n/a 41 5118 5121 5124 N
+ ZH AH AO b n/a 41 5118 5121 5123 N
+ ZH AH AW b n/a 41 5118 5121 5124 N
+ ZH AH AY b n/a 41 5118 5121 5124 N
+ ZH AH EH b n/a 41 5118 5121 5124 N
+ ZH AH EH i n/a 41 5118 5121 5124 N
+ ZH AH ER b n/a 41 5118 5121 5123 N
+ ZH AH EY b n/a 41 5118 5121 5124 N
+ ZH AH EY i n/a 41 5118 5121 5124 N
+ ZH AH IH b n/a 41 5118 5121 5124 N
+ ZH AH IH i n/a 41 5118 5121 5124 N
+ ZH AH IY b n/a 41 5118 5121 5124 N
+ ZH AH IY i n/a 41 5118 5121 5124 N
+ ZH AH OW b n/a 41 5118 5121 5125 N
+ ZH AH OW i n/a 41 5118 5121 5125 N
+ ZH AH UH b n/a 41 5118 5121 5123 N
+ ZH AH UW b n/a 41 5118 5121 5125 N
+ ZH AH UW i n/a 41 5118 5121 5125 N
+ ZH AH W b n/a 41 5118 5121 5125 N
+ ZH AO AA b n/a 41 5117 5121 5124 N
+ ZH AO AE b n/a 41 5117 5121 5124 N
+ ZH AO AH b n/a 41 5117 5121 5124 N
+ ZH AO AO b n/a 41 5117 5121 5123 N
+ ZH AO AW b n/a 41 5117 5121 5124 N
+ ZH AO AY b n/a 41 5117 5121 5124 N
+ ZH AO EH b n/a 41 5117 5121 5124 N
+ ZH AO ER b n/a 41 5117 5121 5123 N
+ ZH AO EY b n/a 41 5117 5121 5124 N
+ ZH AO IH b n/a 41 5117 5121 5124 N
+ ZH AO IY b n/a 41 5117 5121 5124 N
+ ZH AO IY i n/a 41 5117 5121 5124 N
+ ZH AO OW b n/a 41 5117 5121 5125 N
+ ZH AO UH b n/a 41 5117 5121 5123 N
+ ZH AO UW b n/a 41 5117 5121 5125 N
+ ZH AO W b n/a 41 5117 5121 5125 N
+ ZH AW AA b n/a 41 5119 5121 5124 N
+ ZH AW AE b n/a 41 5119 5121 5124 N
+ ZH AW AH b n/a 41 5119 5121 5124 N
+ ZH AW AO b n/a 41 5119 5121 5123 N
+ ZH AW AW b n/a 41 5119 5121 5124 N
+ ZH AW AY b n/a 41 5119 5121 5124 N
+ ZH AW EH b n/a 41 5119 5121 5124 N
+ ZH AW ER b n/a 41 5119 5121 5123 N
+ ZH AW EY b n/a 41 5119 5121 5124 N
+ ZH AW IH b n/a 41 5119 5121 5124 N
+ ZH AW IY b n/a 41 5119 5121 5124 N
+ ZH AW OW b n/a 41 5119 5121 5125 N
+ ZH AW UH b n/a 41 5119 5121 5123 N
+ ZH AW UW b n/a 41 5119 5121 5125 N
+ ZH AW W b n/a 41 5119 5121 5125 N
+ ZH AY AA b n/a 41 5120 5121 5124 N
+ ZH AY AE b n/a 41 5120 5121 5124 N
+ ZH AY AH b n/a 41 5120 5121 5124 N
+ ZH AY AO b n/a 41 5120 5121 5123 N
+ ZH AY AW b n/a 41 5120 5121 5124 N
+ ZH AY AY b n/a 41 5120 5121 5124 N
+ ZH AY EH b n/a 41 5120 5121 5124 N
+ ZH AY ER b n/a 41 5120 5121 5123 N
+ ZH AY EY b n/a 41 5120 5121 5124 N
+ ZH AY IH b n/a 41 5120 5121 5124 N
+ ZH AY IY b n/a 41 5120 5121 5124 N
+ ZH AY OW b n/a 41 5120 5121 5125 N
+ ZH AY UH b n/a 41 5120 5121 5123 N
+ ZH AY UW b n/a 41 5120 5121 5125 N
+ ZH AY W b n/a 41 5120 5121 5125 N
+ ZH B AA b n/a 41 5119 5121 5124 N
+ ZH B AE b n/a 41 5119 5121 5124 N
+ ZH B AH b n/a 41 5119 5121 5124 N
+ ZH B AO b n/a 41 5119 5121 5123 N
+ ZH B AW b n/a 41 5119 5121 5124 N
+ ZH B AY b n/a 41 5119 5121 5124 N
+ ZH B EH b n/a 41 5119 5121 5124 N
+ ZH B ER b n/a 41 5119 5121 5123 N
+ ZH B EY b n/a 41 5119 5121 5124 N
+ ZH B IH b n/a 41 5119 5121 5124 N
+ ZH B IY b n/a 41 5119 5121 5124 N
+ ZH B OW b n/a 41 5119 5121 5125 N
+ ZH B UH b n/a 41 5119 5121 5123 N
+ ZH B UW b n/a 41 5119 5121 5125 N
+ ZH B W b n/a 41 5119 5121 5125 N
+ ZH CH AA b n/a 41 5119 5121 5124 N
+ ZH CH AE b n/a 41 5119 5121 5124 N
+ ZH CH AH b n/a 41 5119 5121 5124 N
+ ZH CH AO b n/a 41 5119 5121 5123 N
+ ZH CH AW b n/a 41 5119 5121 5124 N
+ ZH CH AY b n/a 41 5119 5121 5124 N
+ ZH CH EH b n/a 41 5119 5121 5124 N
+ ZH CH ER b n/a 41 5119 5121 5123 N
+ ZH CH EY b n/a 41 5119 5121 5124 N
+ ZH CH IH b n/a 41 5119 5121 5124 N
+ ZH CH IY b n/a 41 5119 5121 5124 N
+ ZH CH OW b n/a 41 5119 5121 5125 N
+ ZH CH UH b n/a 41 5119 5121 5123 N
+ ZH CH UW b n/a 41 5119 5121 5125 N
+ ZH CH W b n/a 41 5119 5121 5125 N
+ ZH D AA b n/a 41 5119 5121 5124 N
+ ZH D AE b n/a 41 5119 5121 5124 N
+ ZH D AH b n/a 41 5119 5121 5124 N
+ ZH D AH i n/a 41 5119 5121 5124 N
+ ZH D AO b n/a 41 5119 5121 5123 N
+ ZH D AW b n/a 41 5119 5121 5124 N
+ ZH D AY b n/a 41 5119 5121 5124 N
+ ZH D EH b n/a 41 5119 5121 5124 N
+ ZH D ER b n/a 41 5119 5121 5123 N
+ ZH D EY b n/a 41 5119 5121 5124 N
+ ZH D IH b n/a 41 5119 5121 5124 N
+ ZH D IY b n/a 41 5119 5121 5124 N
+ ZH D OW b n/a 41 5119 5121 5125 N
+ ZH D UH b n/a 41 5119 5121 5123 N
+ ZH D UW b n/a 41 5119 5121 5125 N
+ ZH D W b n/a 41 5119 5121 5125 N
+ ZH DH AA b n/a 41 5119 5121 5124 N
+ ZH DH AE b n/a 41 5119 5121 5124 N
+ ZH DH AH b n/a 41 5119 5121 5124 N
+ ZH DH AO b n/a 41 5119 5121 5123 N
+ ZH DH AW b n/a 41 5119 5121 5124 N
+ ZH DH AY b n/a 41 5119 5121 5124 N
+ ZH DH EH b n/a 41 5119 5121 5124 N
+ ZH DH ER b n/a 41 5119 5121 5123 N
+ ZH DH EY b n/a 41 5119 5121 5124 N
+ ZH DH IH b n/a 41 5119 5121 5124 N
+ ZH DH IY b n/a 41 5119 5121 5124 N
+ ZH DH OW b n/a 41 5119 5121 5125 N
+ ZH DH UH b n/a 41 5119 5121 5123 N
+ ZH DH UW b n/a 41 5119 5121 5125 N
+ ZH DH W b n/a 41 5119 5121 5125 N
+ ZH EH AA b n/a 41 5117 5121 5124 N
+ ZH EH AA e n/a 41 5117 5121 5124 N
+ ZH EH AA i n/a 41 5117 5121 5124 N
+ ZH EH AE b n/a 41 5117 5121 5124 N
+ ZH EH AE e n/a 41 5117 5121 5124 N
+ ZH EH AH b n/a 41 5117 5121 5124 N
+ ZH EH AH e n/a 41 5117 5121 5124 N
+ ZH EH AO b n/a 41 5117 5121 5123 N
+ ZH EH AO e n/a 41 5117 5121 5123 N
+ ZH EH AO i n/a 41 5117 5121 5123 N
+ ZH EH AW b n/a 41 5117 5121 5124 N
+ ZH EH AW e n/a 41 5117 5121 5124 N
+ ZH EH AY b n/a 41 5117 5121 5124 N
+ ZH EH AY e n/a 41 5117 5121 5124 N
+ ZH EH B e n/a 41 5117 5121 5125 N
+ ZH EH CH e n/a 41 5117 5121 5125 N
+ ZH EH D e n/a 41 5117 5121 5125 N
+ ZH EH DH e n/a 41 5117 5121 5125 N
+ ZH EH EH b n/a 41 5117 5121 5124 N
+ ZH EH EH e n/a 41 5117 5121 5124 N
+ ZH EH ER b n/a 41 5117 5121 5123 N
+ ZH EH ER e n/a 41 5117 5121 5123 N
+ ZH EH ER i n/a 41 5117 5121 5123 N
+ ZH EH EY b n/a 41 5117 5121 5124 N
+ ZH EH EY e n/a 41 5117 5121 5124 N
+ ZH EH F e n/a 41 5117 5121 5125 N
+ ZH EH G e n/a 41 5117 5121 5125 N
+ ZH EH HH e n/a 41 5117 5121 5125 N
+ ZH EH IH b n/a 41 5117 5121 5124 N
+ ZH EH IH e n/a 41 5117 5121 5124 N
+ ZH EH IH i n/a 41 5117 5121 5124 N
+ ZH EH IY b n/a 41 5117 5121 5124 N
+ ZH EH IY e n/a 41 5117 5121 5124 N
+ ZH EH JH e n/a 41 5117 5121 5125 N
+ ZH EH K e n/a 41 5117 5121 5125 N
+ ZH EH L e n/a 41 5117 5121 5125 N
+ ZH EH M e n/a 41 5117 5121 5125 N
+ ZH EH N e n/a 41 5117 5121 5125 N
+ ZH EH NG e n/a 41 5117 5121 5125 N
+ ZH EH OW b n/a 41 5117 5121 5125 N
+ ZH EH OW e n/a 41 5117 5121 5125 N
+ ZH EH OY e n/a 41 5117 5121 5123 N
+ ZH EH P e n/a 41 5117 5121 5125 N
+ ZH EH R e n/a 41 5117 5121 5125 N
+ ZH EH S e n/a 41 5117 5121 5125 N
+ ZH EH SH e n/a 41 5117 5121 5125 N
+ ZH EH SIL e n/a 41 5117 5121 5125 N
+ ZH EH T e n/a 41 5117 5121 5125 N
+ ZH EH TH e n/a 41 5117 5121 5125 N
+ ZH EH UH b n/a 41 5117 5121 5123 N
+ ZH EH UH e n/a 41 5117 5121 5123 N
+ ZH EH UH i n/a 41 5117 5121 5123 N
+ ZH EH UW b n/a 41 5117 5121 5125 N
+ ZH EH UW e n/a 41 5117 5121 5125 N
+ ZH EH UW i n/a 41 5117 5121 5125 N
+ ZH EH V e n/a 41 5117 5121 5125 N
+ ZH EH W b n/a 41 5117 5121 5125 N
+ ZH EH W e n/a 41 5117 5121 5125 N
+ ZH EH Y e n/a 41 5117 5121 5125 N
+ ZH EH Z e n/a 41 5117 5121 5125 N
+ ZH EH ZH e n/a 41 5117 5121 5125 N
+ ZH ER AA b n/a 41 5119 5121 5124 N
+ ZH ER AE b n/a 41 5119 5121 5124 N
+ ZH ER AH b n/a 41 5119 5121 5124 N
+ ZH ER AH i n/a 41 5119 5121 5124 N
+ ZH ER AO b n/a 41 5119 5121 5123 N
+ ZH ER AW b n/a 41 5119 5121 5124 N
+ ZH ER AY b n/a 41 5119 5121 5124 N
+ ZH ER EH b n/a 41 5119 5121 5124 N
+ ZH ER EH i n/a 41 5119 5121 5124 N
+ ZH ER ER b n/a 41 5119 5121 5123 N
+ ZH ER EY b n/a 41 5119 5121 5124 N
+ ZH ER EY i n/a 41 5119 5121 5124 N
+ ZH ER IH b n/a 41 5119 5121 5124 N
+ ZH ER IH i n/a 41 5119 5121 5124 N
+ ZH ER IY b n/a 41 5119 5121 5124 N
+ ZH ER OW b n/a 41 5119 5121 5125 N
+ ZH ER UH b n/a 41 5119 5121 5123 N
+ ZH ER UW b n/a 41 5119 5121 5125 N
+ ZH ER W b n/a 41 5119 5121 5125 N
+ ZH EY AA b n/a 41 5120 5122 5124 N
+ ZH EY AA e n/a 41 5120 5122 5124 N
+ ZH EY AA i n/a 41 5120 5122 5124 N
+ ZH EY AE b n/a 41 5120 5122 5124 N
+ ZH EY AE e n/a 41 5120 5122 5124 N
+ ZH EY AH b n/a 41 5120 5122 5124 N
+ ZH EY AH e n/a 41 5120 5122 5124 N
+ ZH EY AH i n/a 41 5120 5122 5124 N
+ ZH EY AO b n/a 41 5120 5122 5123 N
+ ZH EY AO e n/a 41 5120 5122 5123 N
+ ZH EY AW b n/a 41 5120 5122 5124 N
+ ZH EY AW e n/a 41 5120 5122 5124 N
+ ZH EY AY b n/a 41 5120 5122 5124 N
+ ZH EY AY e n/a 41 5120 5122 5124 N
+ ZH EY B e n/a 41 5120 5122 5125 N
+ ZH EY CH e n/a 41 5120 5122 5125 N
+ ZH EY D e n/a 41 5120 5122 5125 N
+ ZH EY DH e n/a 41 5120 5122 5125 N
+ ZH EY EH b n/a 41 5120 5122 5124 N
+ ZH EY EH e n/a 41 5120 5122 5124 N
+ ZH EY ER b n/a 41 5120 5121 5123 N
+ ZH EY ER e n/a 41 5120 5121 5123 N
+ ZH EY ER i n/a 41 5120 5121 5123 N
+ ZH EY EY b n/a 41 5120 5122 5124 N
+ ZH EY EY e n/a 41 5120 5122 5124 N
+ ZH EY F e n/a 41 5120 5122 5125 N
+ ZH EY G e n/a 41 5120 5122 5125 N
+ ZH EY HH e n/a 41 5120 5122 5125 N
+ ZH EY IH b n/a 41 5120 5122 5124 N
+ ZH EY IH e n/a 41 5120 5122 5124 N
+ ZH EY IH i n/a 41 5120 5122 5124 N
+ ZH EY IY b n/a 41 5120 5122 5124 N
+ ZH EY IY e n/a 41 5120 5122 5124 N
+ ZH EY IY i n/a 41 5120 5122 5124 N
+ ZH EY JH e n/a 41 5120 5122 5125 N
+ ZH EY K e n/a 41 5120 5122 5125 N
+ ZH EY L e n/a 41 5120 5122 5125 N
+ ZH EY M e n/a 41 5120 5122 5125 N
+ ZH EY N e n/a 41 5120 5122 5125 N
+ ZH EY N i n/a 41 5120 5122 5125 N
+ ZH EY NG e n/a 41 5120 5122 5125 N
+ ZH EY OW b n/a 41 5120 5122 5125 N
+ ZH EY OW e n/a 41 5120 5122 5125 N
+ ZH EY OY e n/a 41 5120 5122 5123 N
+ ZH EY P e n/a 41 5120 5122 5125 N
+ ZH EY R e n/a 41 5120 5121 5125 N
+ ZH EY S e n/a 41 5120 5122 5125 N
+ ZH EY SH e n/a 41 5120 5122 5125 N
+ ZH EY SIL e n/a 41 5120 5122 5125 N
+ ZH EY T e n/a 41 5120 5122 5125 N
+ ZH EY TH e n/a 41 5120 5122 5125 N
+ ZH EY UH b n/a 41 5120 5122 5123 N
+ ZH EY UH e n/a 41 5120 5122 5123 N
+ ZH EY UW b n/a 41 5120 5122 5125 N
+ ZH EY UW e n/a 41 5120 5122 5125 N
+ ZH EY UW i n/a 41 5120 5122 5125 N
+ ZH EY V e n/a 41 5120 5122 5125 N
+ ZH EY W b n/a 41 5120 5122 5125 N
+ ZH EY W e n/a 41 5120 5122 5125 N
+ ZH EY Y e n/a 41 5120 5122 5125 N
+ ZH EY Y i n/a 41 5120 5122 5125 N
+ ZH EY Z e n/a 41 5120 5122 5125 N
+ ZH EY ZH e n/a 41 5120 5122 5125 N
+ ZH F AA b n/a 41 5119 5121 5124 N
+ ZH F AE b n/a 41 5119 5121 5124 N
+ ZH F AH b n/a 41 5119 5121 5124 N
+ ZH F AO b n/a 41 5119 5121 5123 N
+ ZH F AW b n/a 41 5119 5121 5124 N
+ ZH F AY b n/a 41 5119 5121 5124 N
+ ZH F EH b n/a 41 5119 5121 5124 N
+ ZH F ER b n/a 41 5119 5121 5123 N
+ ZH F EY b n/a 41 5119 5121 5124 N
+ ZH F IH b n/a 41 5119 5121 5124 N
+ ZH F IY b n/a 41 5119 5121 5124 N
+ ZH F OW b n/a 41 5119 5121 5125 N
+ ZH F UH b n/a 41 5119 5121 5123 N
+ ZH F UW b n/a 41 5119 5121 5125 N
+ ZH F W b n/a 41 5119 5121 5125 N
+ ZH G AA b n/a 41 5119 5121 5124 N
+ ZH G AE b n/a 41 5119 5121 5124 N
+ ZH G AH b n/a 41 5119 5121 5124 N
+ ZH G AO b n/a 41 5119 5121 5123 N
+ ZH G AW b n/a 41 5119 5121 5124 N
+ ZH G AY b n/a 41 5119 5121 5124 N
+ ZH G EH b n/a 41 5119 5121 5124 N
+ ZH G ER b n/a 41 5119 5121 5123 N
+ ZH G ER i n/a 41 5119 5121 5123 N
+ ZH G EY b n/a 41 5119 5121 5124 N
+ ZH G IH b n/a 41 5119 5121 5124 N
+ ZH G IY b n/a 41 5119 5121 5124 N
+ ZH G OW b n/a 41 5119 5121 5125 N
+ ZH G UH b n/a 41 5119 5121 5123 N
+ ZH G UW b n/a 41 5119 5121 5125 N
+ ZH G UW i n/a 41 5119 5121 5125 N
+ ZH G W b n/a 41 5119 5121 5125 N
+ ZH HH AA b n/a 41 5119 5121 5124 N
+ ZH HH AE b n/a 41 5119 5121 5124 N
+ ZH HH AH b n/a 41 5119 5121 5124 N
+ ZH HH AO b n/a 41 5119 5121 5123 N
+ ZH HH AW b n/a 41 5119 5121 5124 N
+ ZH HH AY b n/a 41 5119 5121 5124 N
+ ZH HH EH b n/a 41 5119 5121 5124 N
+ ZH HH ER b n/a 41 5119 5121 5123 N
+ ZH HH EY b n/a 41 5119 5121 5124 N
+ ZH HH IH b n/a 41 5119 5121 5124 N
+ ZH HH IY b n/a 41 5119 5121 5124 N
+ ZH HH OW b n/a 41 5119 5121 5125 N
+ ZH HH UH b n/a 41 5119 5121 5123 N
+ ZH HH UW b n/a 41 5119 5121 5125 N
+ ZH HH W b n/a 41 5119 5121 5125 N
+ ZH IH AA b n/a 41 5118 5122 5124 N
+ ZH IH AE b n/a 41 5118 5122 5124 N
+ ZH IH AH b n/a 41 5118 5122 5124 N
+ ZH IH AH i n/a 41 5118 5122 5124 N
+ ZH IH AO b n/a 41 5118 5122 5123 N
+ ZH IH AW b n/a 41 5118 5122 5124 N
+ ZH IH AY b n/a 41 5118 5122 5124 N
+ ZH IH EH b n/a 41 5118 5122 5124 N
+ ZH IH EH i n/a 41 5118 5122 5124 N
+ ZH IH ER b n/a 41 5118 5121 5123 N
+ ZH IH EY b n/a 41 5118 5122 5124 N
+ ZH IH EY i n/a 41 5118 5122 5124 N
+ ZH IH IH b n/a 41 5118 5122 5124 N
+ ZH IH IH i n/a 41 5118 5122 5124 N
+ ZH IH IY b n/a 41 5118 5122 5124 N
+ ZH IH IY i n/a 41 5118 5122 5124 N
+ ZH IH N i n/a 41 5118 5122 5125 N
+ ZH IH OW b n/a 41 5118 5122 5125 N
+ ZH IH OW i n/a 41 5118 5122 5125 N
+ ZH IH UH b n/a 41 5118 5122 5123 N
+ ZH IH UW b n/a 41 5118 5122 5125 N
+ ZH IH UW i n/a 41 5118 5122 5125 N
+ ZH IH W b n/a 41 5118 5122 5125 N
+ ZH IH W i n/a 41 5118 5122 5125 N
+ ZH IY AA b n/a 41 5120 5122 5124 N
+ ZH IY AA e n/a 41 5120 5122 5124 N
+ ZH IY AA i n/a 41 5120 5122 5124 N
+ ZH IY AE b n/a 41 5120 5122 5124 N
+ ZH IY AE e n/a 41 5120 5122 5124 N
+ ZH IY AH b n/a 41 5120 5122 5124 N
+ ZH IY AH e n/a 41 5120 5122 5124 N
+ ZH IY AH i n/a 41 5120 5122 5124 N
+ ZH IY AO b n/a 41 5120 5122 5123 N
+ ZH IY AO e n/a 41 5120 5122 5123 N
+ ZH IY AW b n/a 41 5120 5122 5124 N
+ ZH IY AW e n/a 41 5120 5122 5124 N
+ ZH IY AY b n/a 41 5120 5122 5124 N
+ ZH IY AY e n/a 41 5120 5122 5124 N
+ ZH IY B e n/a 41 5120 5122 5125 N
+ ZH IY CH e n/a 41 5120 5122 5125 N
+ ZH IY D e n/a 41 5120 5122 5125 N
+ ZH IY DH e n/a 41 5120 5122 5125 N
+ ZH IY EH b n/a 41 5120 5122 5124 N
+ ZH IY EH e n/a 41 5120 5122 5124 N
+ ZH IY ER b n/a 41 5120 5121 5123 N
+ ZH IY ER e n/a 41 5120 5121 5123 N
+ ZH IY ER i n/a 41 5120 5121 5123 N
+ ZH IY EY b n/a 41 5120 5122 5124 N
+ ZH IY EY e n/a 41 5120 5122 5124 N
+ ZH IY F e n/a 41 5120 5122 5125 N
+ ZH IY G e n/a 41 5120 5122 5125 N
+ ZH IY HH e n/a 41 5120 5122 5125 N
+ ZH IY IH b n/a 41 5120 5122 5124 N
+ ZH IY IH e n/a 41 5120 5122 5124 N
+ ZH IY IY b n/a 41 5120 5122 5124 N
+ ZH IY IY e n/a 41 5120 5122 5124 N
+ ZH IY JH e n/a 41 5120 5122 5125 N
+ ZH IY K e n/a 41 5120 5122 5125 N
+ ZH IY L e n/a 41 5120 5122 5125 N
+ ZH IY M e n/a 41 5120 5122 5125 N
+ ZH IY N e n/a 41 5120 5122 5125 N
+ ZH IY NG e n/a 41 5120 5122 5125 N
+ ZH IY OW b n/a 41 5120 5122 5125 N
+ ZH IY OW e n/a 41 5120 5122 5125 N
+ ZH IY OW i n/a 41 5120 5122 5125 N
+ ZH IY OY e n/a 41 5120 5122 5123 N
+ ZH IY P e n/a 41 5120 5122 5125 N
+ ZH IY R e n/a 41 5120 5121 5125 N
+ ZH IY S e n/a 41 5120 5122 5125 N
+ ZH IY SH e n/a 41 5120 5122 5125 N
+ ZH IY SIL e n/a 41 5120 5122 5125 N
+ ZH IY T e n/a 41 5120 5122 5125 N
+ ZH IY TH e n/a 41 5120 5122 5125 N
+ ZH IY UH b n/a 41 5120 5122 5123 N
+ ZH IY UH e n/a 41 5120 5122 5123 N
+ ZH IY UH i n/a 41 5120 5122 5123 N
+ ZH IY UW b n/a 41 5120 5122 5125 N
+ ZH IY UW e n/a 41 5120 5122 5125 N
+ ZH IY V e n/a 41 5120 5122 5125 N
+ ZH IY W b n/a 41 5120 5122 5125 N
+ ZH IY W e n/a 41 5120 5122 5125 N
+ ZH IY Y e n/a 41 5120 5122 5125 N
+ ZH IY Z e n/a 41 5120 5122 5125 N
+ ZH IY ZH e n/a 41 5120 5122 5125 N
+ ZH JH AA b n/a 41 5119 5121 5124 N
+ ZH JH AE b n/a 41 5119 5121 5124 N
+ ZH JH AH b n/a 41 5119 5121 5124 N
+ ZH JH AO b n/a 41 5119 5121 5123 N
+ ZH JH AW b n/a 41 5119 5121 5124 N
+ ZH JH AY b n/a 41 5119 5121 5124 N
+ ZH JH EH b n/a 41 5119 5121 5124 N
+ ZH JH ER b n/a 41 5119 5121 5123 N
+ ZH JH EY b n/a 41 5119 5121 5124 N
+ ZH JH IH b n/a 41 5119 5121 5124 N
+ ZH JH IY b n/a 41 5119 5121 5124 N
+ ZH JH OW b n/a 41 5119 5121 5125 N
+ ZH JH UH b n/a 41 5119 5121 5123 N
+ ZH JH UW b n/a 41 5119 5121 5125 N
+ ZH JH W b n/a 41 5119 5121 5125 N
+ ZH K AA b n/a 41 5119 5121 5124 N
+ ZH K AE b n/a 41 5119 5121 5124 N
+ ZH K AH b n/a 41 5119 5121 5124 N
+ ZH K AO b n/a 41 5119 5121 5123 N
+ ZH K AW b n/a 41 5119 5121 5124 N
+ ZH K AY b n/a 41 5119 5121 5124 N
+ ZH K EH b n/a 41 5119 5121 5124 N
+ ZH K ER b n/a 41 5119 5121 5123 N
+ ZH K ER i n/a 41 5119 5121 5123 N
+ ZH K EY b n/a 41 5119 5121 5124 N
+ ZH K IH b n/a 41 5119 5121 5124 N
+ ZH K IY b n/a 41 5119 5121 5124 N
+ ZH K OW b n/a 41 5119 5121 5125 N
+ ZH K UH b n/a 41 5119 5121 5123 N
+ ZH K UW b n/a 41 5119 5121 5125 N
+ ZH K W b n/a 41 5119 5121 5125 N
+ ZH L AA b n/a 41 5117 5121 5124 N
+ ZH L AE b n/a 41 5117 5121 5124 N
+ ZH L AH b n/a 41 5117 5121 5124 N
+ ZH L AO b n/a 41 5117 5121 5123 N
+ ZH L AW b n/a 41 5117 5121 5124 N
+ ZH L AY b n/a 41 5117 5121 5124 N
+ ZH L EH b n/a 41 5117 5121 5124 N
+ ZH L ER b n/a 41 5117 5121 5123 N
+ ZH L EY b n/a 41 5117 5121 5124 N
+ ZH L IH b n/a 41 5117 5121 5124 N
+ ZH L IY b n/a 41 5117 5121 5124 N
+ ZH L IY i n/a 41 5117 5121 5124 N
+ ZH L OW b n/a 41 5117 5121 5125 N
+ ZH L UH b n/a 41 5117 5121 5123 N
+ ZH L UW b n/a 41 5117 5121 5125 N
+ ZH L W b n/a 41 5117 5121 5125 N
+ ZH M AA b n/a 41 5119 5121 5124 N
+ ZH M AE b n/a 41 5119 5121 5124 N
+ ZH M AH b n/a 41 5119 5121 5124 N
+ ZH M AO b n/a 41 5119 5121 5123 N
+ ZH M AW b n/a 41 5119 5121 5124 N
+ ZH M AY b n/a 41 5119 5121 5124 N
+ ZH M EH b n/a 41 5119 5121 5124 N
+ ZH M ER b n/a 41 5119 5121 5123 N
+ ZH M EY b n/a 41 5119 5121 5124 N
+ ZH M IH b n/a 41 5119 5121 5124 N
+ ZH M IY b n/a 41 5119 5121 5124 N
+ ZH M OW b n/a 41 5119 5121 5125 N
+ ZH M UH b n/a 41 5119 5121 5123 N
+ ZH M UW b n/a 41 5119 5121 5125 N
+ ZH M W b n/a 41 5119 5121 5125 N
+ ZH N AA b n/a 41 5119 5121 5124 N
+ ZH N AA i n/a 41 5119 5121 5124 N
+ ZH N AE b n/a 41 5119 5121 5124 N
+ ZH N AH b n/a 41 5119 5121 5124 N
+ ZH N AH i n/a 41 5119 5121 5124 N
+ ZH N AO b n/a 41 5119 5121 5123 N
+ ZH N AW b n/a 41 5119 5121 5124 N
+ ZH N AY b n/a 41 5119 5121 5124 N
+ ZH N EH b n/a 41 5119 5121 5124 N
+ ZH N EH i n/a 41 5119 5121 5124 N
+ ZH N ER b n/a 41 5119 5121 5123 N
+ ZH N ER i n/a 41 5119 5121 5123 N
+ ZH N EY b n/a 41 5119 5121 5124 N
+ ZH N IH b n/a 41 5119 5121 5124 N
+ ZH N IY b n/a 41 5119 5121 5124 N
+ ZH N IY i n/a 41 5119 5121 5124 N
+ ZH N OW b n/a 41 5119 5121 5125 N
+ ZH N UH b n/a 41 5119 5121 5123 N
+ ZH N UH i n/a 41 5119 5121 5123 N
+ ZH N UW b n/a 41 5119 5121 5125 N
+ ZH N W b n/a 41 5119 5121 5125 N
+ ZH NG AA b n/a 41 5119 5121 5124 N
+ ZH NG AE b n/a 41 5119 5121 5124 N
+ ZH NG AH b n/a 41 5119 5121 5124 N
+ ZH NG AO b n/a 41 5119 5121 5123 N
+ ZH NG AW b n/a 41 5119 5121 5124 N
+ ZH NG AY b n/a 41 5119 5121 5124 N
+ ZH NG EH b n/a 41 5119 5121 5124 N
+ ZH NG ER b n/a 41 5119 5121 5123 N
+ ZH NG EY b n/a 41 5119 5121 5124 N
+ ZH NG IH b n/a 41 5119 5121 5124 N
+ ZH NG IY b n/a 41 5119 5121 5124 N
+ ZH NG OW b n/a 41 5119 5121 5125 N
+ ZH NG UH b n/a 41 5119 5121 5123 N
+ ZH NG UW b n/a 41 5119 5121 5125 N
+ ZH NG UW i n/a 41 5119 5121 5125 N
+ ZH NG W b n/a 41 5119 5121 5125 N
+ ZH OW AA b n/a 41 5119 5121 5124 N
+ ZH OW AA e n/a 41 5119 5121 5124 N
+ ZH OW AE b n/a 41 5119 5121 5124 N
+ ZH OW AE e n/a 41 5119 5121 5124 N
+ ZH OW AH b n/a 41 5119 5121 5124 N
+ ZH OW AH e n/a 41 5119 5121 5124 N
+ ZH OW AH i n/a 41 5119 5121 5124 N
+ ZH OW AO b n/a 41 5119 5121 5123 N
+ ZH OW AO e n/a 41 5119 5121 5123 N
+ ZH OW AO i n/a 41 5119 5121 5123 N
+ ZH OW AW b n/a 41 5119 5121 5124 N
+ ZH OW AW e n/a 41 5119 5121 5124 N
+ ZH OW AY b n/a 41 5119 5121 5124 N
+ ZH OW AY e n/a 41 5119 5121 5124 N
+ ZH OW B e n/a 41 5119 5121 5125 N
+ ZH OW CH e n/a 41 5119 5121 5125 N
+ ZH OW CH i n/a 41 5119 5121 5125 N
+ ZH OW D e n/a 41 5119 5121 5125 N
+ ZH OW DH e n/a 41 5119 5121 5125 N
+ ZH OW EH b n/a 41 5119 5121 5124 N
+ ZH OW EH e n/a 41 5119 5121 5124 N
+ ZH OW ER b n/a 41 5119 5121 5123 N
+ ZH OW ER e n/a 41 5119 5121 5123 N
+ ZH OW ER i n/a 41 5119 5121 5123 N
+ ZH OW EY b n/a 41 5119 5121 5124 N
+ ZH OW EY e n/a 41 5119 5121 5124 N
+ ZH OW EY i n/a 41 5119 5121 5124 N
+ ZH OW F e n/a 41 5119 5121 5125 N
+ ZH OW G e n/a 41 5119 5121 5125 N
+ ZH OW HH e n/a 41 5119 5121 5125 N
+ ZH OW IH b n/a 41 5119 5121 5124 N
+ ZH OW IH e n/a 41 5119 5121 5124 N
+ ZH OW IH i n/a 41 5119 5121 5124 N
+ ZH OW IY b n/a 41 5119 5121 5124 N
+ ZH OW IY e n/a 41 5119 5121 5124 N
+ ZH OW JH e n/a 41 5119 5121 5125 N
+ ZH OW K e n/a 41 5119 5121 5125 N
+ ZH OW L e n/a 41 5119 5121 5125 N
+ ZH OW M e n/a 41 5119 5121 5125 N
+ ZH OW N e n/a 41 5119 5121 5125 N
+ ZH OW N i n/a 41 5119 5121 5125 N
+ ZH OW NG e n/a 41 5119 5121 5125 N
+ ZH OW OW b n/a 41 5119 5121 5125 N
+ ZH OW OW e n/a 41 5119 5121 5125 N
+ ZH OW OY e n/a 41 5119 5121 5123 N
+ ZH OW P e n/a 41 5119 5121 5125 N
+ ZH OW R e n/a 41 5119 5121 5125 N
+ ZH OW S e n/a 41 5119 5121 5125 N
+ ZH OW SH e n/a 41 5119 5121 5125 N
+ ZH OW SIL e n/a 41 5119 5121 5125 N
+ ZH OW T e n/a 41 5119 5121 5125 N
+ ZH OW TH e n/a 41 5119 5121 5125 N
+ ZH OW UH b n/a 41 5119 5121 5123 N
+ ZH OW UH e n/a 41 5119 5121 5123 N
+ ZH OW UW b n/a 41 5119 5121 5125 N
+ ZH OW UW e n/a 41 5119 5121 5125 N
+ ZH OW V e n/a 41 5119 5121 5125 N
+ ZH OW W b n/a 41 5119 5121 5125 N
+ ZH OW W e n/a 41 5119 5121 5125 N
+ ZH OW Y e n/a 41 5119 5121 5125 N
+ ZH OW Y i n/a 41 5119 5121 5125 N
+ ZH OW Z e n/a 41 5119 5121 5125 N
+ ZH OW ZH e n/a 41 5119 5121 5125 N
+ ZH OY AA b n/a 41 5120 5121 5124 N
+ ZH OY AE b n/a 41 5120 5121 5124 N
+ ZH OY AH b n/a 41 5120 5121 5124 N
+ ZH OY AO b n/a 41 5120 5121 5123 N
+ ZH OY AW b n/a 41 5120 5121 5124 N
+ ZH OY AY b n/a 41 5120 5121 5124 N
+ ZH OY EH b n/a 41 5120 5121 5124 N
+ ZH OY ER b n/a 41 5120 5121 5123 N
+ ZH OY EY b n/a 41 5120 5121 5124 N
+ ZH OY EY i n/a 41 5120 5121 5124 N
+ ZH OY IH b n/a 41 5120 5121 5124 N
+ ZH OY IY b n/a 41 5120 5121 5124 N
+ ZH OY OW b n/a 41 5120 5121 5125 N
+ ZH OY UH b n/a 41 5120 5121 5123 N
+ ZH OY UW b n/a 41 5120 5121 5125 N
+ ZH OY W b n/a 41 5120 5121 5125 N
+ ZH P AA b n/a 41 5119 5121 5124 N
+ ZH P AE b n/a 41 5119 5121 5124 N
+ ZH P AH b n/a 41 5119 5121 5124 N
+ ZH P AO b n/a 41 5119 5121 5123 N
+ ZH P AW b n/a 41 5119 5121 5124 N
+ ZH P AY b n/a 41 5119 5121 5124 N
+ ZH P EH b n/a 41 5119 5121 5124 N
+ ZH P ER b n/a 41 5119 5121 5123 N
+ ZH P EY b n/a 41 5119 5121 5124 N
+ ZH P IH b n/a 41 5119 5121 5124 N
+ ZH P IH i n/a 41 5119 5121 5124 N
+ ZH P IY b n/a 41 5119 5121 5124 N
+ ZH P OW b n/a 41 5119 5121 5125 N
+ ZH P UH b n/a 41 5119 5121 5123 N
+ ZH P UW b n/a 41 5119 5121 5125 N
+ ZH P W b n/a 41 5119 5121 5125 N
+ ZH R AA b n/a 41 5119 5121 5124 N
+ ZH R AA e n/a 41 5119 5121 5124 N
+ ZH R AE b n/a 41 5119 5121 5124 N
+ ZH R AE e n/a 41 5119 5121 5124 N
+ ZH R AH b n/a 41 5119 5121 5124 N
+ ZH R AH e n/a 41 5119 5121 5124 N
+ ZH R AH i n/a 41 5119 5121 5124 N
+ ZH R AO b n/a 41 5119 5121 5123 N
+ ZH R AO e n/a 41 5119 5121 5123 N
+ ZH R AW b n/a 41 5119 5121 5124 N
+ ZH R AW e n/a 41 5119 5121 5124 N
+ ZH R AY b n/a 41 5119 5121 5124 N
+ ZH R AY e n/a 41 5119 5121 5124 N
+ ZH R B e n/a 41 5119 5121 5125 N
+ ZH R CH e n/a 41 5119 5121 5125 N
+ ZH R D e n/a 41 5119 5121 5125 N
+ ZH R DH e n/a 41 5119 5121 5125 N
+ ZH R EH b n/a 41 5119 5121 5124 N
+ ZH R EH e n/a 41 5119 5121 5124 N
+ ZH R EH i n/a 41 5119 5121 5124 N
+ ZH R ER b n/a 41 5119 5121 5123 N
+ ZH R ER e n/a 41 5119 5121 5123 N
+ ZH R EY b n/a 41 5119 5121 5124 N
+ ZH R EY e n/a 41 5119 5121 5124 N
+ ZH R F e n/a 41 5119 5121 5125 N
+ ZH R G e n/a 41 5119 5121 5125 N
+ ZH R HH e n/a 41 5119 5121 5125 N
+ ZH R IH b n/a 41 5119 5121 5124 N
+ ZH R IH e n/a 41 5119 5121 5124 N
+ ZH R IY b n/a 41 5119 5121 5124 N
+ ZH R IY e n/a 41 5119 5121 5124 N
+ ZH R IY i n/a 41 5119 5121 5124 N
+ ZH R JH e n/a 41 5119 5121 5125 N
+ ZH R K e n/a 41 5119 5121 5125 N
+ ZH R L e n/a 41 5119 5121 5125 N
+ ZH R M e n/a 41 5119 5121 5125 N
+ ZH R N e n/a 41 5119 5121 5125 N
+ ZH R NG e n/a 41 5119 5121 5125 N
+ ZH R OW b n/a 41 5119 5121 5125 N
+ ZH R OW e n/a 41 5119 5121 5125 N
+ ZH R OY e n/a 41 5119 5121 5123 N
+ ZH R P e n/a 41 5119 5121 5125 N
+ ZH R R e n/a 41 5119 5121 5125 N
+ ZH R S e n/a 41 5119 5121 5125 N
+ ZH R SH e n/a 41 5119 5121 5125 N
+ ZH R SIL e n/a 41 5119 5121 5125 N
+ ZH R T e n/a 41 5119 5121 5125 N
+ ZH R TH e n/a 41 5119 5121 5125 N
+ ZH R UH b n/a 41 5119 5121 5123 N
+ ZH R UH e n/a 41 5119 5121 5123 N
+ ZH R UW b n/a 41 5119 5121 5125 N
+ ZH R UW e n/a 41 5119 5121 5125 N
+ ZH R V e n/a 41 5119 5121 5125 N
+ ZH R W b n/a 41 5119 5121 5125 N
+ ZH R W e n/a 41 5119 5121 5125 N
+ ZH R W i n/a 41 5119 5121 5125 N
+ ZH R Y e n/a 41 5119 5121 5125 N
+ ZH R Z e n/a 41 5119 5121 5125 N
+ ZH R ZH e n/a 41 5119 5121 5125 N
+ ZH S AA b n/a 41 5119 5121 5124 N
+ ZH S AA i n/a 41 5119 5121 5124 N
+ ZH S AE b n/a 41 5119 5121 5124 N
+ ZH S AH b n/a 41 5119 5121 5124 N
+ ZH S AO b n/a 41 5119 5121 5123 N
+ ZH S AW b n/a 41 5119 5121 5124 N
+ ZH S AY b n/a 41 5119 5121 5124 N
+ ZH S EH b n/a 41 5119 5121 5124 N
+ ZH S ER b n/a 41 5119 5121 5123 N
+ ZH S EY b n/a 41 5119 5121 5124 N
+ ZH S IH b n/a 41 5119 5121 5124 N
+ ZH S IH i n/a 41 5119 5121 5124 N
+ ZH S IY b n/a 41 5119 5121 5124 N
+ ZH S IY i n/a 41 5119 5121 5124 N
+ ZH S OW b n/a 41 5119 5121 5125 N
+ ZH S UH b n/a 41 5119 5121 5123 N
+ ZH S UW b n/a 41 5119 5121 5125 N
+ ZH S W b n/a 41 5119 5121 5125 N
+ ZH SH AA b n/a 41 5119 5121 5124 N
+ ZH SH AE b n/a 41 5119 5121 5124 N
+ ZH SH AH b n/a 41 5119 5121 5124 N
+ ZH SH AO b n/a 41 5119 5121 5123 N
+ ZH SH AW b n/a 41 5119 5121 5124 N
+ ZH SH AY b n/a 41 5119 5121 5124 N
+ ZH SH EH b n/a 41 5119 5121 5124 N
+ ZH SH ER b n/a 41 5119 5121 5123 N
+ ZH SH EY b n/a 41 5119 5121 5124 N
+ ZH SH IH b n/a 41 5119 5121 5124 N
+ ZH SH IY b n/a 41 5119 5121 5124 N
+ ZH SH OW b n/a 41 5119 5121 5125 N
+ ZH SH UH b n/a 41 5119 5121 5123 N
+ ZH SH UW b n/a 41 5119 5121 5125 N
+ ZH SH W b n/a 41 5119 5121 5125 N
+ ZH SIL AA b n/a 41 5119 5121 5124 N
+ ZH SIL AE b n/a 41 5119 5121 5124 N
+ ZH SIL AH b n/a 41 5119 5121 5124 N
+ ZH SIL AO b n/a 41 5119 5121 5123 N
+ ZH SIL AW b n/a 41 5119 5121 5124 N
+ ZH SIL AY b n/a 41 5119 5121 5124 N
+ ZH SIL EH b n/a 41 5119 5121 5124 N
+ ZH SIL ER b n/a 41 5119 5121 5123 N
+ ZH SIL EY b n/a 41 5119 5121 5124 N
+ ZH SIL IH b n/a 41 5119 5121 5124 N
+ ZH SIL IY b n/a 41 5119 5121 5124 N
+ ZH SIL OW b n/a 41 5119 5121 5125 N
+ ZH SIL UH b n/a 41 5119 5121 5123 N
+ ZH SIL UW b n/a 41 5119 5121 5125 N
+ ZH SIL W b n/a 41 5119 5121 5125 N
+ ZH T AA b n/a 41 5119 5121 5124 N
+ ZH T AE b n/a 41 5119 5121 5124 N
+ ZH T AH b n/a 41 5119 5121 5124 N
+ ZH T AO b n/a 41 5119 5121 5123 N
+ ZH T AW b n/a 41 5119 5121 5124 N
+ ZH T AY b n/a 41 5119 5121 5124 N
+ ZH T EH b n/a 41 5119 5121 5124 N
+ ZH T ER b n/a 41 5119 5121 5123 N
+ ZH T EY b n/a 41 5119 5121 5124 N
+ ZH T IH b n/a 41 5119 5121 5124 N
+ ZH T IY b n/a 41 5119 5121 5124 N
+ ZH T OW b n/a 41 5119 5121 5125 N
+ ZH T UH b n/a 41 5119 5121 5123 N
+ ZH T UW b n/a 41 5119 5121 5125 N
+ ZH T W b n/a 41 5119 5121 5125 N
+ ZH TH AA b n/a 41 5119 5121 5124 N
+ ZH TH AE b n/a 41 5119 5121 5124 N
+ ZH TH AH b n/a 41 5119 5121 5124 N
+ ZH TH AO b n/a 41 5119 5121 5123 N
+ ZH TH AW b n/a 41 5119 5121 5124 N
+ ZH TH AY b n/a 41 5119 5121 5124 N
+ ZH TH EH b n/a 41 5119 5121 5124 N
+ ZH TH ER b n/a 41 5119 5121 5123 N
+ ZH TH EY b n/a 41 5119 5121 5124 N
+ ZH TH IH b n/a 41 5119 5121 5124 N
+ ZH TH IY b n/a 41 5119 5121 5124 N
+ ZH TH OW b n/a 41 5119 5121 5125 N
+ ZH TH UH b n/a 41 5119 5121 5123 N
+ ZH TH UW b n/a 41 5119 5121 5125 N
+ ZH TH W b n/a 41 5119 5121 5125 N
+ ZH UH AA b n/a 41 5117 5122 5124 N
+ ZH UH AE b n/a 41 5117 5122 5124 N
+ ZH UH AH b n/a 41 5117 5122 5124 N
+ ZH UH AO b n/a 41 5117 5122 5123 N
+ ZH UH AW b n/a 41 5117 5122 5124 N
+ ZH UH AY b n/a 41 5117 5122 5124 N
+ ZH UH EH b n/a 41 5117 5122 5124 N
+ ZH UH ER b n/a 41 5117 5121 5123 N
+ ZH UH EY b n/a 41 5117 5122 5124 N
+ ZH UH IH b n/a 41 5117 5122 5124 N
+ ZH UH IY b n/a 41 5117 5122 5124 N
+ ZH UH OW b n/a 41 5117 5122 5125 N
+ ZH UH UH b n/a 41 5117 5122 5123 N
+ ZH UH UW b n/a 41 5117 5122 5125 N
+ ZH UH W b n/a 41 5117 5122 5125 N
+ ZH UW AA b n/a 41 5119 5122 5124 N
+ ZH UW AA e n/a 41 5119 5122 5124 N
+ ZH UW AE b n/a 41 5119 5122 5124 N
+ ZH UW AE e n/a 41 5119 5122 5124 N
+ ZH UW AH b n/a 41 5119 5122 5124 N
+ ZH UW AH e n/a 41 5119 5122 5124 N
+ ZH UW AH i n/a 41 5119 5122 5124 N
+ ZH UW AO b n/a 41 5119 5122 5123 N
+ ZH UW AO e n/a 41 5119 5122 5123 N
+ ZH UW AW b n/a 41 5119 5122 5124 N
+ ZH UW AW e n/a 41 5119 5122 5124 N
+ ZH UW AY b n/a 41 5119 5122 5124 N
+ ZH UW AY e n/a 41 5119 5122 5124 N
+ ZH UW B e n/a 41 5119 5122 5125 N
+ ZH UW CH e n/a 41 5119 5122 5125 N
+ ZH UW D e n/a 41 5119 5122 5125 N
+ ZH UW DH e n/a 41 5119 5122 5125 N
+ ZH UW EH b n/a 41 5119 5122 5124 N
+ ZH UW EH e n/a 41 5119 5122 5124 N
+ ZH UW ER b n/a 41 5119 5121 5123 N
+ ZH UW ER e n/a 41 5119 5121 5123 N
+ ZH UW ER i n/a 41 5119 5121 5123 N
+ ZH UW EY b n/a 41 5119 5122 5124 N
+ ZH UW EY e n/a 41 5119 5122 5124 N
+ ZH UW F e n/a 41 5119 5122 5125 N
+ ZH UW G e n/a 41 5119 5122 5125 N
+ ZH UW HH e n/a 41 5119 5122 5125 N
+ ZH UW IH b n/a 41 5119 5122 5124 N
+ ZH UW IH e n/a 41 5119 5122 5124 N
+ ZH UW IY b n/a 41 5119 5122 5124 N
+ ZH UW IY e n/a 41 5119 5122 5124 N
+ ZH UW IY i n/a 41 5119 5122 5124 N
+ ZH UW JH e n/a 41 5119 5122 5125 N
+ ZH UW K e n/a 41 5119 5122 5125 N
+ ZH UW K i n/a 41 5119 5122 5125 N
+ ZH UW L e n/a 41 5119 5122 5125 N
+ ZH UW M e n/a 41 5119 5122 5125 N
+ ZH UW N e n/a 41 5119 5122 5125 N
+ ZH UW NG e n/a 41 5119 5122 5125 N
+ ZH UW OW b n/a 41 5119 5122 5125 N
+ ZH UW OW e n/a 41 5119 5122 5125 N
+ ZH UW OW i n/a 41 5119 5122 5125 N
+ ZH UW OY e n/a 41 5119 5122 5123 N
+ ZH UW P e n/a 41 5119 5122 5125 N
+ ZH UW R e n/a 41 5119 5121 5125 N
+ ZH UW S e n/a 41 5119 5122 5125 N
+ ZH UW SH e n/a 41 5119 5122 5125 N
+ ZH UW SIL e n/a 41 5119 5122 5125 N
+ ZH UW T e n/a 41 5119 5122 5125 N
+ ZH UW TH e n/a 41 5119 5122 5125 N
+ ZH UW UH b n/a 41 5119 5122 5123 N
+ ZH UW UH e n/a 41 5119 5122 5123 N
+ ZH UW UW b n/a 41 5119 5122 5125 N
+ ZH UW UW e n/a 41 5119 5122 5125 N
+ ZH UW UW i n/a 41 5119 5122 5125 N
+ ZH UW V e n/a 41 5119 5122 5125 N
+ ZH UW W b n/a 41 5119 5122 5125 N
+ ZH UW W e n/a 41 5119 5122 5125 N
+ ZH UW W i n/a 41 5119 5122 5125 N
+ ZH UW Y e n/a 41 5119 5122 5125 N
+ ZH UW Z e n/a 41 5119 5122 5125 N
+ ZH UW ZH e n/a 41 5119 5122 5125 N
+ ZH V AA b n/a 41 5119 5121 5124 N
+ ZH V AE b n/a 41 5119 5121 5124 N
+ ZH V AH b n/a 41 5119 5121 5124 N
+ ZH V AO b n/a 41 5119 5121 5123 N
+ ZH V AW b n/a 41 5119 5121 5124 N
+ ZH V AY b n/a 41 5119 5121 5124 N
+ ZH V EH b n/a 41 5119 5121 5124 N
+ ZH V ER b n/a 41 5119 5121 5123 N
+ ZH V EY b n/a 41 5119 5121 5124 N
+ ZH V IH b n/a 41 5119 5121 5124 N
+ ZH V IY b n/a 41 5119 5121 5124 N
+ ZH V OW b n/a 41 5119 5121 5125 N
+ ZH V UH b n/a 41 5119 5121 5123 N
+ ZH V UW b n/a 41 5119 5121 5125 N
+ ZH V W b n/a 41 5119 5121 5125 N
+ ZH W AA b n/a 41 5117 5121 5124 N
+ ZH W AE b n/a 41 5117 5121 5124 N
+ ZH W AH b n/a 41 5117 5121 5124 N
+ ZH W AO b n/a 41 5117 5121 5123 N
+ ZH W AW b n/a 41 5117 5121 5124 N
+ ZH W AY b n/a 41 5117 5121 5124 N
+ ZH W EH b n/a 41 5117 5121 5124 N
+ ZH W ER b n/a 41 5117 5121 5123 N
+ ZH W EY b n/a 41 5117 5121 5124 N
+ ZH W IH b n/a 41 5117 5121 5124 N
+ ZH W IY b n/a 41 5117 5121 5124 N
+ ZH W OW b n/a 41 5117 5121 5125 N
+ ZH W UH b n/a 41 5117 5121 5123 N
+ ZH W UW b n/a 41 5117 5121 5125 N
+ ZH W W b n/a 41 5117 5121 5125 N
+ ZH Y AA b n/a 41 5117 5122 5124 N
+ ZH Y AE b n/a 41 5117 5122 5124 N
+ ZH Y AH b n/a 41 5117 5122 5124 N
+ ZH Y AO b n/a 41 5117 5122 5123 N
+ ZH Y AW b n/a 41 5117 5122 5124 N
+ ZH Y AY b n/a 41 5117 5122 5124 N
+ ZH Y EH b n/a 41 5117 5122 5124 N
+ ZH Y ER b n/a 41 5117 5121 5123 N
+ ZH Y EY b n/a 41 5117 5122 5124 N
+ ZH Y IH b n/a 41 5117 5122 5124 N
+ ZH Y IY b n/a 41 5117 5122 5124 N
+ ZH Y OW b n/a 41 5117 5122 5125 N
+ ZH Y UH b n/a 41 5117 5122 5123 N
+ ZH Y UW b n/a 41 5117 5122 5125 N
+ ZH Y W b n/a 41 5117 5122 5125 N
+ ZH Z AA b n/a 41 5119 5121 5124 N
+ ZH Z AE b n/a 41 5119 5121 5124 N
+ ZH Z AH b n/a 41 5119 5121 5124 N
+ ZH Z AO b n/a 41 5119 5121 5123 N
+ ZH Z AW b n/a 41 5119 5121 5124 N
+ ZH Z AY b n/a 41 5119 5121 5124 N
+ ZH Z EH b n/a 41 5119 5121 5124 N
+ ZH Z ER b n/a 41 5119 5121 5123 N
+ ZH Z EY b n/a 41 5119 5121 5124 N
+ ZH Z IH b n/a 41 5119 5121 5124 N
+ ZH Z IY b n/a 41 5119 5121 5124 N
+ ZH Z OW b n/a 41 5119 5121 5125 N
+ ZH Z UH b n/a 41 5119 5121 5123 N
+ ZH Z UW b n/a 41 5119 5121 5125 N
+ ZH Z W b n/a 41 5119 5121 5125 N
+ ZH ZH AA b n/a 41 5119 5121 5124 N
+ ZH ZH AE b n/a 41 5119 5121 5124 N
+ ZH ZH AH b n/a 41 5119 5121 5124 N
+ ZH ZH AO b n/a 41 5119 5121 5123 N
+ ZH ZH AW b n/a 41 5119 5121 5124 N
+ ZH ZH AY b n/a 41 5119 5121 5124 N
+ ZH ZH EH b n/a 41 5119 5121 5124 N
+ ZH ZH ER b n/a 41 5119 5121 5123 N
+ ZH ZH EY b n/a 41 5119 5121 5124 N
+ ZH ZH IH b n/a 41 5119 5121 5124 N
+ ZH ZH IY b n/a 41 5119 5121 5124 N
+ ZH ZH OW b n/a 41 5119 5121 5125 N
+ ZH ZH UH b n/a 41 5119 5121 5123 N
+ ZH ZH UW b n/a 41 5119 5121 5125 N
+ ZH ZH W b n/a 41 5119 5121 5125 N
diff --git a/dom/media/webspeech/recognition/models/en-US/means b/dom/media/webspeech/recognition/models/en-US/means
new file mode 100644
index 000000000..fc841a443
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/means
Binary files differ
diff --git a/dom/media/webspeech/recognition/models/en-US/mixture_weights b/dom/media/webspeech/recognition/models/en-US/mixture_weights
new file mode 100644
index 000000000..83deb0d2c
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/mixture_weights
Binary files differ
diff --git a/dom/media/webspeech/recognition/models/en-US/noisedict b/dom/media/webspeech/recognition/models/en-US/noisedict
new file mode 100644
index 000000000..620e140a9
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/noisedict
@@ -0,0 +1,5 @@
+<s> SIL
+</s> SIL
+<sil> SIL
+[NOISE] +NSN+
+[SPEECH] +SPN+
diff --git a/dom/media/webspeech/recognition/models/en-US/sendump b/dom/media/webspeech/recognition/models/en-US/sendump
new file mode 100644
index 000000000..727b0ffd2
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/sendump
Binary files differ
diff --git a/dom/media/webspeech/recognition/models/en-US/transition_matrices b/dom/media/webspeech/recognition/models/en-US/transition_matrices
new file mode 100644
index 000000000..e5171640e
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/transition_matrices
Binary files differ
diff --git a/dom/media/webspeech/recognition/models/en-US/variances b/dom/media/webspeech/recognition/models/en-US/variances
new file mode 100644
index 000000000..925094cd2
--- /dev/null
+++ b/dom/media/webspeech/recognition/models/en-US/variances
Binary files differ
diff --git a/dom/media/webspeech/recognition/moz.build b/dom/media/webspeech/recognition/moz.build
new file mode 100644
index 000000000..0a26021b0
--- /dev/null
+++ b/dom/media/webspeech/recognition/moz.build
@@ -0,0 +1,88 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+MOCHITEST_MANIFESTS += ['test/mochitest.ini']
+
+XPIDL_MODULE = 'dom_webspeechrecognition'
+
+XPIDL_SOURCES = [
+ 'nsISpeechRecognitionService.idl'
+]
+
+EXPORTS.mozilla.dom += [
+ 'SpeechGrammar.h',
+ 'SpeechGrammarList.h',
+ 'SpeechRecognition.h',
+ 'SpeechRecognitionAlternative.h',
+ 'SpeechRecognitionResult.h',
+ 'SpeechRecognitionResultList.h',
+ 'SpeechStreamListener.h',
+]
+
+if CONFIG['MOZ_WEBSPEECH_TEST_BACKEND']:
+ EXPORTS.mozilla.dom += [
+ 'test/FakeSpeechRecognitionService.h',
+ ]
+
+if CONFIG['MOZ_WEBSPEECH_POCKETSPHINX']:
+ EXPORTS.mozilla.dom += [
+ 'PocketSphinxSpeechRecognitionService.h',
+ ]
+
+UNIFIED_SOURCES += [
+ 'endpointer.cc',
+ 'energy_endpointer.cc',
+ 'energy_endpointer_params.cc',
+ 'SpeechGrammar.cpp',
+ 'SpeechGrammarList.cpp',
+ 'SpeechRecognition.cpp',
+ 'SpeechRecognitionAlternative.cpp',
+ 'SpeechRecognitionResult.cpp',
+ 'SpeechRecognitionResultList.cpp',
+ 'SpeechStreamListener.cpp',
+]
+
+if CONFIG['MOZ_WEBSPEECH_TEST_BACKEND']:
+ UNIFIED_SOURCES += [
+ 'test/FakeSpeechRecognitionService.cpp',
+ ]
+
+if CONFIG['MOZ_WEBSPEECH_POCKETSPHINX']:
+ UNIFIED_SOURCES += [
+ 'PocketSphinxSpeechRecognitionService.cpp',
+ ]
+
+LOCAL_INCLUDES += [
+ '/dom/base',
+ '/media/sphinxbase',
+]
+
+if CONFIG['MOZ_WEBSPEECH_POCKETSPHINX']:
+ LOCAL_INCLUDES += [
+ '/media/pocketsphinx',
+ ]
+
+if CONFIG['MOZ_WEBSPEECH_MODELS']:
+ FINAL_TARGET_FILES.models.dict += [
+ 'models/dict/en-US.dic',
+ 'models/dict/en-US.dic.dmp',
+ ]
+ FINAL_TARGET_FILES.models['en-US'] += [
+ 'models/en-US/feat.params',
+ 'models/en-US/mdef',
+ 'models/en-US/means',
+ 'models/en-US/mixture_weights',
+ 'models/en-US/noisedict',
+ 'models/en-US/sendump',
+ 'models/en-US/transition_matrices',
+ 'models/en-US/variances',
+ ]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/webspeech/recognition/nsISpeechRecognitionService.idl b/dom/media/webspeech/recognition/nsISpeechRecognitionService.idl
new file mode 100644
index 000000000..a43d277da
--- /dev/null
+++ b/dom/media/webspeech/recognition/nsISpeechRecognitionService.idl
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+%{C++
+#include "mozilla/WeakPtr.h"
+
+namespace mozilla {
+class AudioSegment;
+namespace dom {
+class SpeechRecognition;
+class SpeechRecognitionResultList;
+class SpeechGrammarList;
+class SpeechGrammar;
+}
+}
+%}
+
+native SpeechRecognitionWeakPtr(mozilla::WeakPtr<mozilla::dom::SpeechRecognition>);
+[ptr] native AudioSegmentPtr(mozilla::AudioSegment);
+[ptr] native SpeechGrammarPtr(mozilla::dom::SpeechGrammar);
+[ptr] native SpeechGrammarListPtr(mozilla::dom::SpeechGrammarList);
+
+[uuid(6fcb6ee8-a6db-49ba-9f06-355d7ee18ea7)]
+interface nsISpeechGrammarCompilationCallback : nsISupports {
+ void grammarCompilationEnd(in SpeechGrammarPtr grammarObject, in boolean success);
+};
+
+[uuid(8e97f287-f322-44e8-8888-8344fa408ef8)]
+interface nsISpeechRecognitionService : nsISupports {
+ void initialize(in SpeechRecognitionWeakPtr aSpeechRecognition);
+ void processAudioSegment(in AudioSegmentPtr aAudioSegment, in long aSampleRate);
+ void validateAndSetGrammarList(in SpeechGrammarPtr aSpeechGrammar, in nsISpeechGrammarCompilationCallback aCallback);
+ void soundEnd();
+ void abort();
+};
+
+%{C++
+#define NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "@mozilla.org/webspeech/service;1?name="
+%}
diff --git a/dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.cpp b/dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.cpp
new file mode 100644
index 000000000..97bf4b998
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.cpp
@@ -0,0 +1,119 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsThreadUtils.h"
+
+#include "FakeSpeechRecognitionService.h"
+#include "MediaPrefs.h"
+
+#include "SpeechRecognition.h"
+#include "SpeechRecognitionAlternative.h"
+#include "SpeechRecognitionResult.h"
+#include "SpeechRecognitionResultList.h"
+#include "nsIObserverService.h"
+#include "mozilla/Services.h"
+
+namespace mozilla {
+
+using namespace dom;
+
+NS_IMPL_ISUPPORTS(FakeSpeechRecognitionService, nsISpeechRecognitionService, nsIObserver)
+
+FakeSpeechRecognitionService::FakeSpeechRecognitionService()
+{
+}
+
+FakeSpeechRecognitionService::~FakeSpeechRecognitionService()
+{
+}
+
+NS_IMETHODIMP
+FakeSpeechRecognitionService::Initialize(WeakPtr<SpeechRecognition> aSpeechRecognition)
+{
+ mRecognition = aSpeechRecognition;
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->AddObserver(this, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC, false);
+ obs->AddObserver(this, SPEECH_RECOGNITION_TEST_END_TOPIC, false);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeSpeechRecognitionService::ProcessAudioSegment(AudioSegment* aAudioSegment, int32_t aSampleRate)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeSpeechRecognitionService::SoundEnd()
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeSpeechRecognitionService::ValidateAndSetGrammarList(mozilla::dom::SpeechGrammar*, nsISpeechGrammarCompilationCallback*)
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeSpeechRecognitionService::Abort()
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeSpeechRecognitionService::Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData)
+{
+ MOZ_ASSERT(MediaPrefs::WebSpeechFakeRecognitionService(),
+ "Got request to fake recognition service event, but "
+ TEST_PREFERENCE_FAKE_RECOGNITION_SERVICE " is not set");
+
+ if (!strcmp(aTopic, SPEECH_RECOGNITION_TEST_END_TOPIC)) {
+ nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+ obs->RemoveObserver(this, SPEECH_RECOGNITION_TEST_EVENT_REQUEST_TOPIC);
+ obs->RemoveObserver(this, SPEECH_RECOGNITION_TEST_END_TOPIC);
+
+ return NS_OK;
+ }
+
+ const nsDependentString eventName = nsDependentString(aData);
+
+ if (eventName.EqualsLiteral("EVENT_RECOGNITIONSERVICE_ERROR")) {
+ mRecognition->DispatchError(SpeechRecognition::EVENT_RECOGNITIONSERVICE_ERROR,
+ SpeechRecognitionErrorCode::Network, // TODO different codes?
+ NS_LITERAL_STRING("RECOGNITIONSERVICE_ERROR test event"));
+
+ } else if (eventName.EqualsLiteral("EVENT_RECOGNITIONSERVICE_FINAL_RESULT")) {
+ RefPtr<SpeechEvent> event =
+ new SpeechEvent(mRecognition,
+ SpeechRecognition::EVENT_RECOGNITIONSERVICE_FINAL_RESULT);
+
+ event->mRecognitionResultList = BuildMockResultList();
+ NS_DispatchToMainThread(event);
+ }
+
+ return NS_OK;
+}
+
+SpeechRecognitionResultList*
+FakeSpeechRecognitionService::BuildMockResultList()
+{
+ SpeechRecognitionResultList* resultList = new SpeechRecognitionResultList(mRecognition);
+ SpeechRecognitionResult* result = new SpeechRecognitionResult(mRecognition);
+ if (0 < mRecognition->MaxAlternatives()) {
+ SpeechRecognitionAlternative* alternative = new SpeechRecognitionAlternative(mRecognition);
+
+ alternative->mTranscript = NS_LITERAL_STRING("Mock final result");
+ alternative->mConfidence = 0.0f;
+
+ result->mItems.AppendElement(alternative);
+ }
+ resultList->mItems.AppendElement(result);
+
+ return resultList;
+}
+
+} // namespace mozilla
diff --git a/dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.h b/dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.h
new file mode 100644
index 000000000..9b850d4d0
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/FakeSpeechRecognitionService.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_FakeSpeechRecognitionService_h
+#define mozilla_dom_FakeSpeechRecognitionService_h
+
+#include "nsCOMPtr.h"
+#include "nsIObserver.h"
+#include "nsISpeechRecognitionService.h"
+
+#define NS_FAKE_SPEECH_RECOGNITION_SERVICE_CID \
+ {0x48c345e7, 0x9929, 0x4f9a, {0xa5, 0x63, 0xf4, 0x78, 0x22, 0x2d, 0xab, 0xcd}};
+
+namespace mozilla {
+
+class FakeSpeechRecognitionService : public nsISpeechRecognitionService,
+ public nsIObserver
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISPEECHRECOGNITIONSERVICE
+ NS_DECL_NSIOBSERVER
+
+ FakeSpeechRecognitionService();
+
+private:
+ virtual ~FakeSpeechRecognitionService();
+
+ WeakPtr<dom::SpeechRecognition> mRecognition;
+ dom::SpeechRecognitionResultList* BuildMockResultList();
+};
+
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/recognition/test/head.js b/dom/media/webspeech/recognition/test/head.js
new file mode 100644
index 000000000..b5aa2d612
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/head.js
@@ -0,0 +1,181 @@
+"use strict";
+
+const DEFAULT_AUDIO_SAMPLE_FILE = "hello.ogg";
+const SPEECH_RECOGNITION_TEST_REQUEST_EVENT_TOPIC = "SpeechRecognitionTest:RequestEvent";
+const SPEECH_RECOGNITION_TEST_END_TOPIC = "SpeechRecognitionTest:End";
+
+var errorCodes = {
+ NO_SPEECH : "no-speech",
+ ABORTED : "aborted",
+ AUDIO_CAPTURE : "audio-capture",
+ NETWORK : "network",
+ NOT_ALLOWED : "not-allowed",
+ SERVICE_NOT_ALLOWED : "service-not-allowed",
+ BAD_GRAMMAR : "bad-grammar",
+ LANGUAGE_NOT_SUPPORTED : "language-not-supported"
+};
+
+var Services = SpecialPowers.Cu.import("resource://gre/modules/Services.jsm").Services;
+
+function EventManager(sr) {
+ var self = this;
+ var nEventsExpected = 0;
+ self.eventsReceived = [];
+
+ var allEvents = [
+ "audiostart",
+ "soundstart",
+ "speechstart",
+ "speechend",
+ "soundend",
+ "audioend",
+ "result",
+ "nomatch",
+ "error",
+ "start",
+ "end"
+ ];
+
+ var eventDependencies = {
+ "speechend": "speechstart",
+ "soundend": "soundstart",
+ "audioend": "audiostart"
+ };
+
+ var isDone = false;
+
+ // set up grammar
+ var sgl = new SpeechGrammarList();
+ sgl.addFromString("#JSGF V1.0; grammar test; public <simple> = hello ;", 1);
+ sr.grammars = sgl;
+
+ // AUDIO_DATA events are asynchronous,
+ // so we queue events requested while they are being
+ // issued to make them seem synchronous
+ var isSendingAudioData = false;
+ var queuedEventRequests = [];
+
+ // register default handlers
+ for (var i = 0; i < allEvents.length; i++) {
+ (function (eventName) {
+ sr["on" + eventName] = function (evt) {
+ var message = "unexpected event: " + eventName;
+ if (eventName == "error") {
+ message += " -- " + evt.message;
+ }
+
+ ok(false, message);
+ if (self.doneFunc && !isDone) {
+ isDone = true;
+ self.doneFunc();
+ }
+ };
+ })(allEvents[i]);
+ }
+
+ self.expect = function EventManager_expect(eventName, cb) {
+ nEventsExpected++;
+
+ sr["on" + eventName] = function(evt) {
+ self.eventsReceived.push(eventName);
+ ok(true, "received event " + eventName);
+
+ var dep = eventDependencies[eventName];
+ if (dep) {
+ ok(self.eventsReceived.indexOf(dep) >= 0,
+ eventName + " must come after " + dep);
+ }
+
+ cb && cb(evt, sr);
+ if (self.doneFunc && !isDone &&
+ nEventsExpected === self.eventsReceived.length) {
+ isDone = true;
+ self.doneFunc();
+ }
+ }
+ }
+
+ self.start = function EventManager_start() {
+ isSendingAudioData = true;
+ var audioTag = document.createElement("audio");
+ audioTag.src = self.audioSampleFile;
+
+ var stream = audioTag.mozCaptureStreamUntilEnded();
+ audioTag.addEventListener("ended", function() {
+ info("Sample stream ended, requesting queued events");
+ isSendingAudioData = false;
+ while (queuedEventRequests.length) {
+ self.requestFSMEvent(queuedEventRequests.shift());
+ }
+ });
+
+ audioTag.play();
+ sr.start(stream);
+ }
+
+ self.requestFSMEvent = function EventManager_requestFSMEvent(eventName) {
+ if (isSendingAudioData) {
+ info("Queuing event " + eventName + " until we're done sending audio data");
+ queuedEventRequests.push(eventName);
+ return;
+ }
+
+ info("requesting " + eventName);
+ Services.obs.notifyObservers(null,
+ SPEECH_RECOGNITION_TEST_REQUEST_EVENT_TOPIC,
+ eventName);
+ }
+
+ self.requestTestEnd = function EventManager_requestTestEnd() {
+ Services.obs.notifyObservers(null, SPEECH_RECOGNITION_TEST_END_TOPIC, null);
+ }
+}
+
+function buildResultCallback(transcript) {
+ return (function(evt) {
+ is(evt.results[0][0].transcript, transcript, "expect correct transcript");
+ });
+}
+
+function buildErrorCallback(errcode) {
+ return (function(err) {
+ is(err.error, errcode, "expect correct error code");
+ });
+}
+
+function performTest(options) {
+ var prefs = options.prefs;
+
+ prefs.unshift(
+ ["media.webspeech.recognition.enable", true],
+ ["media.webspeech.test.enable", true]
+ );
+
+ SpecialPowers.pushPrefEnv({set: prefs}, function() {
+ var sr = new SpeechRecognition();
+ var em = new EventManager(sr);
+
+ for (var eventName in options.expectedEvents) {
+ var cb = options.expectedEvents[eventName];
+ em.expect(eventName, cb);
+ }
+
+ em.doneFunc = function() {
+ em.requestTestEnd();
+ if (options.doneFunc) {
+ options.doneFunc();
+ }
+ }
+
+ em.audioSampleFile = DEFAULT_AUDIO_SAMPLE_FILE;
+ if (options.audioSampleFile) {
+ em.audioSampleFile = options.audioSampleFile;
+ }
+
+ em.start();
+
+ for (var i = 0; i < options.eventsToRequest.length; i++) {
+ em.requestFSMEvent(options.eventsToRequest[i]);
+ }
+ });
+}
diff --git a/dom/media/webspeech/recognition/test/hello.ogg b/dom/media/webspeech/recognition/test/hello.ogg
new file mode 100644
index 000000000..7a8092606
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/hello.ogg
Binary files differ
diff --git a/dom/media/webspeech/recognition/test/hello.ogg^headers^ b/dom/media/webspeech/recognition/test/hello.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/hello.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/webspeech/recognition/test/mochitest.ini b/dom/media/webspeech/recognition/test/mochitest.ini
new file mode 100644
index 000000000..0e5a7a8ed
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/mochitest.ini
@@ -0,0 +1,21 @@
+[DEFAULT]
+tags=msg
+subsuite = media
+support-files =
+ head.js
+ hello.ogg
+ hello.ogg^headers^
+ silence.ogg
+ silence.ogg^headers^
+[test_abort.html]
+skip-if = toolkit == 'android' # bug 1037287
+[test_audio_capture_error.html]
+[test_call_start_from_end_handler.html]
+tags=capturestream
+skip-if = (android_version == '18' && debug) # bug 967606
+[test_nested_eventloop.html]
+skip-if = toolkit == 'android'
+[test_preference_enable.html]
+[test_recognition_service_error.html]
+[test_success_without_recognition_service.html]
+[test_timeout.html]
diff --git a/dom/media/webspeech/recognition/test/silence.ogg b/dom/media/webspeech/recognition/test/silence.ogg
new file mode 100644
index 000000000..e6da3a502
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/silence.ogg
Binary files differ
diff --git a/dom/media/webspeech/recognition/test/silence.ogg^headers^ b/dom/media/webspeech/recognition/test/silence.ogg^headers^
new file mode 100644
index 000000000..4030ea1d3
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/silence.ogg^headers^
@@ -0,0 +1 @@
+Cache-Control: no-store
diff --git a/dom/media/webspeech/recognition/test/test_abort.html b/dom/media/webspeech/recognition/test/test_abort.html
new file mode 100644
index 000000000..ae9a29964
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_abort.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Call abort from inside handlers</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ // Abort inside event handlers, should't get a
+ // result after that
+
+ var nextEventIdx = 0;
+ var eventsToAbortOn = [
+ "start",
+ "audiostart",
+ "speechstart",
+ "speechend",
+ "audioend"
+ ];
+
+ function doNextTest() {
+ var nextEvent = eventsToAbortOn[nextEventIdx];
+ var expectedEvents = {
+ "start": null,
+ "audiostart": null,
+ "audioend": null,
+ "end": null
+ };
+
+ if (nextEventIdx >= eventsToAbortOn.indexOf("speechstart")) {
+ expectedEvents["speechstart"] = null;
+ }
+
+ if (nextEventIdx >= eventsToAbortOn.indexOf("speechend")) {
+ expectedEvents["speechend"] = null;
+ }
+
+ info("Aborting on " + nextEvent);
+ expectedEvents[nextEvent] = function(evt, sr) {
+ sr.abort();
+ };
+
+ nextEventIdx++;
+
+ performTest({
+ eventsToRequest: [],
+ expectedEvents: expectedEvents,
+ doneFunc: (nextEventIdx < eventsToAbortOn.length) ? doNextTest : SimpleTest.finish,
+ prefs: [["media.webspeech.test.fake_fsm_events", true], ["media.webspeech.test.fake_recognition_service", true]]
+ });
+ }
+
+ doNextTest();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_audio_capture_error.html b/dom/media/webspeech/recognition/test/test_audio_capture_error.html
new file mode 100644
index 000000000..6869f4c9b
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_audio_capture_error.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Behavior on audio error</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ performTest({
+ eventsToRequest: ['EVENT_AUDIO_ERROR'],
+ expectedEvents: {
+ 'start': null,
+ 'audiostart': null,
+ 'speechstart': null,
+ 'speechend': null,
+ 'audioend': null,
+ 'error': buildErrorCallback(errorCodes.AUDIO_CAPTURE),
+ 'end': null
+ },
+ doneFunc: SimpleTest.finish,
+ prefs: [["media.webspeech.test.fake_fsm_events", true], ["media.webspeech.test.fake_recognition_service", true]]
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html b/dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html
new file mode 100644
index 000000000..c8da267fc
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Restart recognition from end handler</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ function createAudioStream() {
+ var audioTag = document.createElement("audio");
+ audioTag.src = DEFAULT_AUDIO_SAMPLE_FILE;
+
+ var stream = audioTag.mozCaptureStreamUntilEnded();
+ audioTag.play();
+
+ return stream;
+ }
+
+ var done = false;
+ function endHandler(evt, sr) {
+ if (done) {
+ SimpleTest.finish();
+ return;
+ }
+
+ try {
+ var stream = createAudioStream();
+ sr.start(stream); // shouldn't fail
+ } catch (err) {
+ ok(false, "Failed to start() from end() callback");
+ }
+
+ // calling start() may cause some callbacks to fire, but we're
+ // no longer interested in them, except for onend, which is where
+ // we'll conclude the test.
+ sr.onstart = null;
+ sr.onaudiostart = null;
+ sr.onspeechstart = null;
+ sr.onspeechend = null;
+ sr.onaudioend = null;
+ sr.onresult = null;
+
+ // FIXME(ggp) the state transition caused by start() is async,
+ // but abort() is sync (see bug 1055093). until we normalize
+ // state transitions, we need to setTimeout here to make sure
+ // abort() finds the speech recognition object in the correct
+ // state (namely, STATE_STARTING).
+ setTimeout(function() {
+ sr.abort();
+ done = true;
+ });
+
+ info("Successfully start() from end() callback");
+ }
+
+ function expectExceptionHandler(evt, sr) {
+ try {
+ sr.start(createAudioStream());
+ } catch (err) {
+ is(err.name, "InvalidStateError");
+ return;
+ }
+
+ ok(false, "Calling start() didn't raise InvalidStateError");
+ }
+
+ performTest({
+ eventsToRequest: [
+ 'EVENT_RECOGNITIONSERVICE_FINAL_RESULT'
+ ],
+ expectedEvents: {
+ 'start': expectExceptionHandler,
+ 'audiostart': expectExceptionHandler,
+ 'speechstart': expectExceptionHandler,
+ 'speechend': expectExceptionHandler,
+ 'audioend': expectExceptionHandler,
+ 'result': buildResultCallback("Mock final result"),
+ 'end': endHandler,
+ },
+ prefs: [["media.webspeech.test.fake_fsm_events", true], ["media.webspeech.test.fake_recognition_service", true]]
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_nested_eventloop.html b/dom/media/webspeech/recognition/test/test_nested_eventloop.html
new file mode 100644
index 000000000..bdbed6524
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_nested_eventloop.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Spin the event loop from inside a callback</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ /*
+ * window.showModalDialog() can be used to spin the event loop, causing
+ * queued SpeechEvents (such as those created by calls to start(), stop()
+ * or abort()) to be processed immediately.
+ * When this is done from inside DOM event handlers, it is possible to
+ * cause reentrancy in our C++ code, which we should be able to withstand.
+ */
+ function abortAndSpinEventLoop(evt, sr) {
+ sr.abort();
+ SpecialPowers.spinEventLoop(window);
+ }
+ function doneFunc() {
+ // Trigger gc now and wait some time to make sure this test gets the blame
+ // for any assertions caused by showModalDialog
+ //
+ // NB - The assertions should be gone, but this looks too scary to touch
+ // during batch cleanup.
+ var count = 0, GC_COUNT = 4;
+
+ function triggerGCOrFinish() {
+ SpecialPowers.gc();
+ count++;
+
+ if (count == GC_COUNT) {
+ SimpleTest.finish();
+ }
+ }
+
+ for (var i = 0; i < GC_COUNT; i++) {
+ setTimeout(triggerGCOrFinish, 0);
+ }
+ }
+
+ /*
+ * We start by performing a normal start, then abort from the audiostart
+ * callback and force the EVENT_ABORT to be processed while still inside
+ * the event handler. This causes the recording to stop, which raises
+ * the audioend and (later on) end events.
+ * Then, we abort (once again spinning the event loop) from the audioend
+ * handler, attempting to cause a re-entry into the abort code. This second
+ * call should be ignored, and we get the end callback and finish.
+ */
+
+ performTest({
+ eventsToRequest: [],
+ expectedEvents: {
+ "audiostart": abortAndSpinEventLoop,
+ "audioend": abortAndSpinEventLoop,
+ "end": null
+ },
+ doneFunc: doneFunc,
+ prefs: [["media.webspeech.test.fake_fsm_events", true],
+ ["media.webspeech.test.fake_recognition_service", true]]
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_preference_enable.html b/dom/media/webspeech/recognition/test/test_preference_enable.html
new file mode 100644
index 000000000..0946566a3
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_preference_enable.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- No objects should be visible with preference disabled</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ SpecialPowers.pushPrefEnv({
+ set: [["media.webspeech.recognition.enable", false]]
+ }, function() {
+ var objects = [
+ "SpeechRecognition",
+ "SpeechGrammar",
+ "SpeechRecognitionResult",
+ "SpeechRecognitionResultList",
+ "SpeechRecognitionAlternative"
+ ];
+
+ for (var i = 0; i < objects.length; i++) {
+ is(window[objects[i]], undefined,
+ objects[i] + " should be undefined with pref off");
+ }
+
+ SimpleTest.finish();
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_recognition_service_error.html b/dom/media/webspeech/recognition/test/test_recognition_service_error.html
new file mode 100644
index 000000000..e7e9fb7ca
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_recognition_service_error.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Behavior on recognition service error</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ performTest({
+ eventsToRequest: [
+ 'EVENT_RECOGNITIONSERVICE_ERROR'
+ ],
+ expectedEvents: {
+ 'start': null,
+ 'audiostart': null,
+ 'speechstart': null,
+ 'speechend': null,
+ 'audioend': null,
+ 'error': buildErrorCallback(errorCodes.NETWORK),
+ 'end': null
+ },
+ doneFunc: SimpleTest.finish,
+ prefs: [["media.webspeech.test.fake_fsm_events", true], ["media.webspeech.test.fake_recognition_service", true]]
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_success_without_recognition_service.html b/dom/media/webspeech/recognition/test/test_success_without_recognition_service.html
new file mode 100644
index 000000000..9ecf00f4b
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_success_without_recognition_service.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Success with fake recognition service</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ performTest({
+ eventsToRequest: [
+ 'EVENT_RECOGNITIONSERVICE_FINAL_RESULT'
+ ],
+ expectedEvents: {
+ 'start': null,
+ 'audiostart': null,
+ 'speechstart': null,
+ 'speechend': null,
+ 'audioend': null,
+ 'result': buildResultCallback("Mock final result"),
+ 'end': null
+ },
+ doneFunc:SimpleTest.finish,
+ prefs: [["media.webspeech.test.fake_fsm_events", true], ["media.webspeech.test.fake_recognition_service", true]]
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/recognition/test/test_timeout.html b/dom/media/webspeech/recognition/test/test_timeout.html
new file mode 100644
index 000000000..009964406
--- /dev/null
+++ b/dom/media/webspeech/recognition/test/test_timeout.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295 -- Timeout for user speech</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript" src="head.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="text/javascript">
+ SimpleTest.waitForExplicitFinish();
+
+ performTest({
+ eventsToRequest: [],
+ expectedEvents: {
+ "start": null,
+ "audiostart": null,
+ "audioend": null,
+ "error": buildErrorCallback(errorCodes.NO_SPEECH),
+ "end": null
+ },
+ doneFunc: SimpleTest.finish,
+ audioSampleFile: "silence.ogg",
+ prefs: [["media.webspeech.test.fake_fsm_events", true], ["media.webspeech.test.fake_recognition_service", true]]
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/SpeechSynthesis.cpp b/dom/media/webspeech/synth/SpeechSynthesis.cpp
new file mode 100644
index 000000000..f00a1064a
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesis.cpp
@@ -0,0 +1,333 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupportsPrimitives.h"
+#include "nsSpeechTask.h"
+#include "mozilla/Logging.h"
+
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/dom/Element.h"
+
+#include "mozilla/dom/SpeechSynthesisBinding.h"
+#include "SpeechSynthesis.h"
+#include "nsSynthVoiceRegistry.h"
+#include "nsIDocument.h"
+
+#undef LOG
+mozilla::LogModule*
+GetSpeechSynthLog()
+{
+ static mozilla::LazyLogModule sLog("SpeechSynthesis");
+
+ return sLog;
+}
+#define LOG(type, msg) MOZ_LOG(GetSpeechSynthLog(), type, msg)
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_CLASS(SpeechSynthesis)
+
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(SpeechSynthesis, DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mCurrentTask)
+ NS_IMPL_CYCLE_COLLECTION_UNLINK(mSpeechQueue)
+ tmp->mVoiceCache.Clear();
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(SpeechSynthesis, DOMEventTargetHelper)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCurrentTask)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSpeechQueue)
+ for (auto iter = tmp->mVoiceCache.Iter(); !iter.Done(); iter.Next()) {
+ SpeechSynthesisVoice* voice = iter.UserData();
+ cb.NoteXPCOMChild(voice);
+ }
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SpeechSynthesis)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+ NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(SpeechSynthesis, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SpeechSynthesis, DOMEventTargetHelper)
+
+SpeechSynthesis::SpeechSynthesis(nsPIDOMWindowInner* aParent)
+ : DOMEventTargetHelper(aParent)
+ , mHoldQueue(false)
+ , mInnerID(aParent->WindowID())
+{
+ MOZ_ASSERT(aParent->IsInnerWindow());
+ MOZ_ASSERT(NS_IsMainThread());
+
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ if (obs) {
+ obs->AddObserver(this, "inner-window-destroyed", true);
+ obs->AddObserver(this, "synth-voices-changed", true);
+ }
+
+}
+
+SpeechSynthesis::~SpeechSynthesis()
+{
+}
+
+JSObject*
+SpeechSynthesis::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechSynthesisBinding::Wrap(aCx, this, aGivenProto);
+}
+
+bool
+SpeechSynthesis::Pending() const
+{
+ switch (mSpeechQueue.Length()) {
+ case 0:
+ return false;
+
+ case 1:
+ return mSpeechQueue.ElementAt(0)->GetState() == SpeechSynthesisUtterance::STATE_PENDING;
+
+ default:
+ return true;
+ }
+}
+
+bool
+SpeechSynthesis::Speaking() const
+{
+ if (!mSpeechQueue.IsEmpty() &&
+ mSpeechQueue.ElementAt(0)->GetState() == SpeechSynthesisUtterance::STATE_SPEAKING) {
+ return true;
+ }
+
+ // Returns global speaking state if global queue is enabled. Or false.
+ return nsSynthVoiceRegistry::GetInstance()->IsSpeaking();
+}
+
+bool
+SpeechSynthesis::Paused() const
+{
+ return mHoldQueue || (mCurrentTask && mCurrentTask->IsPrePaused()) ||
+ (!mSpeechQueue.IsEmpty() && mSpeechQueue.ElementAt(0)->IsPaused());
+}
+
+bool
+SpeechSynthesis::HasEmptyQueue() const
+{
+ return mSpeechQueue.Length() == 0;
+}
+
+bool SpeechSynthesis::HasVoices() const
+{
+ uint32_t voiceCount = mVoiceCache.Count();
+ if (voiceCount == 0) {
+ nsresult rv = nsSynthVoiceRegistry::GetInstance()->GetVoiceCount(&voiceCount);
+ if(NS_WARN_IF(NS_FAILED(rv))) {
+ return false;
+ }
+ }
+
+ return voiceCount != 0;
+}
+
+void
+SpeechSynthesis::Speak(SpeechSynthesisUtterance& aUtterance)
+{
+ if (aUtterance.mState != SpeechSynthesisUtterance::STATE_NONE) {
+ // XXX: Should probably raise an error
+ return;
+ }
+
+ mSpeechQueue.AppendElement(&aUtterance);
+ aUtterance.mState = SpeechSynthesisUtterance::STATE_PENDING;
+
+ // If we only have one item in the queue, we aren't pre-paused, and
+ // we have voices available, speak it.
+ if (mSpeechQueue.Length() == 1 && !mCurrentTask && !mHoldQueue && HasVoices()) {
+ AdvanceQueue();
+ }
+}
+
+void
+SpeechSynthesis::AdvanceQueue()
+{
+ LOG(LogLevel::Debug,
+ ("SpeechSynthesis::AdvanceQueue length=%d", mSpeechQueue.Length()));
+
+ if (mSpeechQueue.IsEmpty()) {
+ return;
+ }
+
+ RefPtr<SpeechSynthesisUtterance> utterance = mSpeechQueue.ElementAt(0);
+
+ nsAutoString docLang;
+ nsCOMPtr<nsPIDOMWindowInner> window = GetOwner();
+ nsIDocument* doc = window ? window->GetExtantDoc() : nullptr;
+
+ if (doc) {
+ Element* elm = doc->GetHtmlElement();
+
+ if (elm) {
+ elm->GetLang(docLang);
+ }
+ }
+
+ mCurrentTask =
+ nsSynthVoiceRegistry::GetInstance()->SpeakUtterance(*utterance, docLang);
+
+ if (mCurrentTask) {
+ mCurrentTask->SetSpeechSynthesis(this);
+ }
+
+ return;
+}
+
+void
+SpeechSynthesis::Cancel()
+{
+ if (!mSpeechQueue.IsEmpty() &&
+ mSpeechQueue.ElementAt(0)->GetState() == SpeechSynthesisUtterance::STATE_SPEAKING) {
+ // Remove all queued utterances except for current one, we will remove it
+ // in OnEnd
+ mSpeechQueue.RemoveElementsAt(1, mSpeechQueue.Length() - 1);
+ } else {
+ mSpeechQueue.Clear();
+ }
+
+ if (mCurrentTask) {
+ mCurrentTask->Cancel();
+ }
+}
+
+void
+SpeechSynthesis::Pause()
+{
+ if (Paused()) {
+ return;
+ }
+
+ if (mCurrentTask && !mSpeechQueue.IsEmpty() &&
+ mSpeechQueue.ElementAt(0)->GetState() != SpeechSynthesisUtterance::STATE_ENDED) {
+ mCurrentTask->Pause();
+ } else {
+ mHoldQueue = true;
+ }
+}
+
+void
+SpeechSynthesis::Resume()
+{
+ if (!Paused()) {
+ return;
+ }
+
+ if (mCurrentTask) {
+ mCurrentTask->Resume();
+ } else {
+ mHoldQueue = false;
+ AdvanceQueue();
+ }
+}
+
+void
+SpeechSynthesis::OnEnd(const nsSpeechTask* aTask)
+{
+ MOZ_ASSERT(mCurrentTask == aTask);
+
+ if (!mSpeechQueue.IsEmpty()) {
+ mSpeechQueue.RemoveElementAt(0);
+ }
+
+ mCurrentTask = nullptr;
+ AdvanceQueue();
+}
+
+void
+SpeechSynthesis::GetVoices(nsTArray< RefPtr<SpeechSynthesisVoice> >& aResult)
+{
+ aResult.Clear();
+ uint32_t voiceCount = 0;
+
+ nsresult rv = nsSynthVoiceRegistry::GetInstance()->GetVoiceCount(&voiceCount);
+ if(NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ nsISupports* voiceParent = NS_ISUPPORTS_CAST(nsIObserver*, this);
+
+ for (uint32_t i = 0; i < voiceCount; i++) {
+ nsAutoString uri;
+ rv = nsSynthVoiceRegistry::GetInstance()->GetVoice(i, uri);
+
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Failed to retrieve voice from registry");
+ continue;
+ }
+
+ SpeechSynthesisVoice* voice = mVoiceCache.GetWeak(uri);
+
+ if (!voice) {
+ voice = new SpeechSynthesisVoice(voiceParent, uri);
+ }
+
+ aResult.AppendElement(voice);
+ }
+
+ mVoiceCache.Clear();
+
+ for (uint32_t i = 0; i < aResult.Length(); i++) {
+ SpeechSynthesisVoice* voice = aResult[i];
+ mVoiceCache.Put(voice->mUri, voice);
+ }
+}
+
+// For testing purposes, allows us to cancel the current task that is
+// misbehaving, and flush the queue.
+void
+SpeechSynthesis::ForceEnd()
+{
+ if (mCurrentTask) {
+ mCurrentTask->ForceEnd();
+ }
+}
+
+NS_IMETHODIMP
+SpeechSynthesis::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+
+ if (strcmp(aTopic, "inner-window-destroyed") == 0) {
+ nsCOMPtr<nsISupportsPRUint64> wrapper = do_QueryInterface(aSubject);
+ NS_ENSURE_TRUE(wrapper, NS_ERROR_FAILURE);
+
+ uint64_t innerID;
+ nsresult rv = wrapper->GetData(&innerID);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (innerID == mInnerID) {
+ Cancel();
+
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ if (obs) {
+ obs->RemoveObserver(this, "inner-window-destroyed");
+ }
+ }
+ } else if (strcmp(aTopic, "synth-voices-changed") == 0) {
+ LOG(LogLevel::Debug, ("SpeechSynthesis::onvoiceschanged"));
+ DispatchTrustedEvent(NS_LITERAL_STRING("voiceschanged"));
+ // If we have a pending item, and voices become available, speak it.
+ if (!mCurrentTask && !mHoldQueue && HasVoices()) {
+ AdvanceQueue();
+ }
+ }
+
+ return NS_OK;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/SpeechSynthesis.h b/dom/media/webspeech/synth/SpeechSynthesis.h
new file mode 100644
index 000000000..3a528cbf5
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesis.h
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechSynthesis_h
+#define mozilla_dom_SpeechSynthesis_h
+
+#include "nsCOMPtr.h"
+#include "nsIObserver.h"
+#include "nsRefPtrHashtable.h"
+#include "nsString.h"
+#include "nsWeakReference.h"
+#include "nsWrapperCache.h"
+#include "js/TypeDecls.h"
+
+#include "SpeechSynthesisUtterance.h"
+#include "SpeechSynthesisVoice.h"
+
+class nsIDOMWindow;
+
+namespace mozilla {
+namespace dom {
+
+class nsSpeechTask;
+
+class SpeechSynthesis final : public DOMEventTargetHelper
+ , public nsIObserver
+ , public nsSupportsWeakReference
+{
+public:
+ explicit SpeechSynthesis(nsPIDOMWindowInner* aParent);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SpeechSynthesis, DOMEventTargetHelper)
+ NS_DECL_NSIOBSERVER
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ bool Pending() const;
+
+ bool Speaking() const;
+
+ bool Paused() const;
+
+ bool HasEmptyQueue() const;
+
+ void Speak(SpeechSynthesisUtterance& aUtterance);
+
+ void Cancel();
+
+ void Pause();
+
+ void Resume();
+
+ void OnEnd(const nsSpeechTask* aTask);
+
+ void GetVoices(nsTArray< RefPtr<SpeechSynthesisVoice> >& aResult);
+
+ void ForceEnd();
+
+ IMPL_EVENT_HANDLER(voiceschanged)
+
+private:
+ virtual ~SpeechSynthesis();
+
+ void AdvanceQueue();
+
+ bool HasVoices() const;
+
+ nsTArray<RefPtr<SpeechSynthesisUtterance> > mSpeechQueue;
+
+ RefPtr<nsSpeechTask> mCurrentTask;
+
+ nsRefPtrHashtable<nsStringHashKey, SpeechSynthesisVoice> mVoiceCache;
+
+ bool mHoldQueue;
+
+ uint64_t mInnerID;
+};
+
+} // namespace dom
+} // namespace mozilla
+#endif
diff --git a/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp b/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
new file mode 100644
index 000000000..c7d80a5a1
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
@@ -0,0 +1,178 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsGkAtoms.h"
+
+#include "mozilla/dom/SpeechSynthesisEvent.h"
+#include "mozilla/dom/SpeechSynthesisUtteranceBinding.h"
+#include "SpeechSynthesisUtterance.h"
+#include "SpeechSynthesisVoice.h"
+
+#include <stdlib.h>
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(SpeechSynthesisUtterance,
+ DOMEventTargetHelper, mVoice);
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SpeechSynthesisUtterance)
+NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
+
+NS_IMPL_ADDREF_INHERITED(SpeechSynthesisUtterance, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SpeechSynthesisUtterance, DOMEventTargetHelper)
+
+SpeechSynthesisUtterance::SpeechSynthesisUtterance(nsPIDOMWindowInner* aOwnerWindow,
+ const nsAString& text)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mText(text)
+ , mVolume(1)
+ , mRate(1)
+ , mPitch(1)
+ , mState(STATE_NONE)
+ , mPaused(false)
+{
+}
+
+SpeechSynthesisUtterance::~SpeechSynthesisUtterance() {}
+
+JSObject*
+SpeechSynthesisUtterance::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechSynthesisUtteranceBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports*
+SpeechSynthesisUtterance::GetParentObject() const
+{
+ return GetOwner();
+}
+
+already_AddRefed<SpeechSynthesisUtterance>
+SpeechSynthesisUtterance::Constructor(GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ return Constructor(aGlobal, EmptyString(), aRv);
+}
+
+already_AddRefed<SpeechSynthesisUtterance>
+SpeechSynthesisUtterance::Constructor(GlobalObject& aGlobal,
+ const nsAString& aText,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports());
+
+ if (!win) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ }
+
+ MOZ_ASSERT(win->IsInnerWindow());
+ RefPtr<SpeechSynthesisUtterance> object =
+ new SpeechSynthesisUtterance(win, aText);
+ return object.forget();
+}
+
+void
+SpeechSynthesisUtterance::GetText(nsString& aResult) const
+{
+ aResult = mText;
+}
+
+void
+SpeechSynthesisUtterance::SetText(const nsAString& aText)
+{
+ mText = aText;
+}
+
+void
+SpeechSynthesisUtterance::GetLang(nsString& aResult) const
+{
+ aResult = mLang;
+}
+
+void
+SpeechSynthesisUtterance::SetLang(const nsAString& aLang)
+{
+ mLang = aLang;
+}
+
+SpeechSynthesisVoice*
+SpeechSynthesisUtterance::GetVoice() const
+{
+ return mVoice;
+}
+
+void
+SpeechSynthesisUtterance::SetVoice(SpeechSynthesisVoice* aVoice)
+{
+ mVoice = aVoice;
+}
+
+float
+SpeechSynthesisUtterance::Volume() const
+{
+ return mVolume;
+}
+
+void
+SpeechSynthesisUtterance::SetVolume(float aVolume)
+{
+ mVolume = std::max<float>(std::min<float>(aVolume, 1), 0);
+}
+
+float
+SpeechSynthesisUtterance::Rate() const
+{
+ return mRate;
+}
+
+void
+SpeechSynthesisUtterance::SetRate(float aRate)
+{
+ mRate = std::max<float>(std::min<float>(aRate, 10), 0.1f);
+}
+
+float
+SpeechSynthesisUtterance::Pitch() const
+{
+ return mPitch;
+}
+
+void
+SpeechSynthesisUtterance::SetPitch(float aPitch)
+{
+ mPitch = std::max<float>(std::min<float>(aPitch, 2), 0);
+}
+
+void
+SpeechSynthesisUtterance::GetChosenVoiceURI(nsString& aResult) const
+{
+ aResult = mChosenVoiceURI;
+}
+
+void
+SpeechSynthesisUtterance::DispatchSpeechSynthesisEvent(const nsAString& aEventType,
+ uint32_t aCharIndex,
+ float aElapsedTime,
+ const nsAString& aName)
+{
+ SpeechSynthesisEventInit init;
+ init.mBubbles = false;
+ init.mCancelable = false;
+ init.mUtterance = this;
+ init.mCharIndex = aCharIndex;
+ init.mElapsedTime = aElapsedTime;
+ init.mName = aName;
+
+ RefPtr<SpeechSynthesisEvent> event =
+ SpeechSynthesisEvent::Constructor(this, aEventType, init);
+ DispatchTrustedEvent(event);
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/SpeechSynthesisUtterance.h b/dom/media/webspeech/synth/SpeechSynthesisUtterance.h
new file mode 100644
index 000000000..e2b6840a1
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesisUtterance.h
@@ -0,0 +1,124 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechSynthesisUtterance_h
+#define mozilla_dom_SpeechSynthesisUtterance_h
+
+#include "mozilla/DOMEventTargetHelper.h"
+#include "nsCOMPtr.h"
+#include "nsString.h"
+#include "js/TypeDecls.h"
+
+#include "nsSpeechTask.h"
+
+namespace mozilla {
+namespace dom {
+
+class SpeechSynthesisVoice;
+class SpeechSynthesis;
+class nsSynthVoiceRegistry;
+
+class SpeechSynthesisUtterance final : public DOMEventTargetHelper
+{
+ friend class SpeechSynthesis;
+ friend class nsSpeechTask;
+ friend class nsSynthVoiceRegistry;
+
+public:
+ SpeechSynthesisUtterance(nsPIDOMWindowInner* aOwnerWindow, const nsAString& aText);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SpeechSynthesisUtterance,
+ DOMEventTargetHelper)
+ NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper)
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ static
+ already_AddRefed<SpeechSynthesisUtterance> Constructor(GlobalObject& aGlobal,
+ ErrorResult& aRv);
+ static
+ already_AddRefed<SpeechSynthesisUtterance> Constructor(GlobalObject& aGlobal,
+ const nsAString& aText,
+ ErrorResult& aRv);
+
+ void GetText(nsString& aResult) const;
+
+ void SetText(const nsAString& aText);
+
+ void GetLang(nsString& aResult) const;
+
+ void SetLang(const nsAString& aLang);
+
+ SpeechSynthesisVoice* GetVoice() const;
+
+ void SetVoice(SpeechSynthesisVoice* aVoice);
+
+ float Volume() const;
+
+ void SetVolume(float aVolume);
+
+ float Rate() const;
+
+ void SetRate(float aRate);
+
+ float Pitch() const;
+
+ void SetPitch(float aPitch);
+
+ void GetChosenVoiceURI(nsString& aResult) const;
+
+ enum {
+ STATE_NONE,
+ STATE_PENDING,
+ STATE_SPEAKING,
+ STATE_ENDED
+ };
+
+ uint32_t GetState() { return mState; }
+
+ bool IsPaused() { return mPaused; }
+
+ IMPL_EVENT_HANDLER(start)
+ IMPL_EVENT_HANDLER(end)
+ IMPL_EVENT_HANDLER(error)
+ IMPL_EVENT_HANDLER(pause)
+ IMPL_EVENT_HANDLER(resume)
+ IMPL_EVENT_HANDLER(mark)
+ IMPL_EVENT_HANDLER(boundary)
+
+private:
+ virtual ~SpeechSynthesisUtterance();
+
+ void DispatchSpeechSynthesisEvent(const nsAString& aEventType,
+ uint32_t aCharIndex,
+ float aElapsedTime, const nsAString& aName);
+
+ nsString mText;
+
+ nsString mLang;
+
+ float mVolume;
+
+ float mRate;
+
+ float mPitch;
+
+ nsString mChosenVoiceURI;
+
+ uint32_t mState;
+
+ bool mPaused;
+
+ RefPtr<SpeechSynthesisVoice> mVoice;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/SpeechSynthesisVoice.cpp b/dom/media/webspeech/synth/SpeechSynthesisVoice.cpp
new file mode 100644
index 000000000..8c8f72284
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesisVoice.cpp
@@ -0,0 +1,94 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechSynthesis.h"
+#include "nsSynthVoiceRegistry.h"
+#include "mozilla/dom/SpeechSynthesisVoiceBinding.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SpeechSynthesisVoice, mParent)
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechSynthesisVoice)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechSynthesisVoice)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechSynthesisVoice)
+ NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+ NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+SpeechSynthesisVoice::SpeechSynthesisVoice(nsISupports* aParent,
+ const nsAString& aUri)
+ : mParent(aParent)
+ , mUri(aUri)
+{
+}
+
+SpeechSynthesisVoice::~SpeechSynthesisVoice()
+{
+}
+
+JSObject*
+SpeechSynthesisVoice::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechSynthesisVoiceBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports*
+SpeechSynthesisVoice::GetParentObject() const
+{
+ return mParent;
+}
+
+void
+SpeechSynthesisVoice::GetVoiceURI(nsString& aRetval) const
+{
+ aRetval = mUri;
+}
+
+void
+SpeechSynthesisVoice::GetName(nsString& aRetval) const
+{
+ DebugOnly<nsresult> rv =
+ nsSynthVoiceRegistry::GetInstance()->GetVoiceName(mUri, aRetval);
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
+ "Failed to get SpeechSynthesisVoice.name");
+}
+
+void
+SpeechSynthesisVoice::GetLang(nsString& aRetval) const
+{
+ DebugOnly<nsresult> rv =
+ nsSynthVoiceRegistry::GetInstance()->GetVoiceLang(mUri, aRetval);
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
+ "Failed to get SpeechSynthesisVoice.lang");
+}
+
+bool
+SpeechSynthesisVoice::LocalService() const
+{
+ bool isLocal;
+ DebugOnly<nsresult> rv =
+ nsSynthVoiceRegistry::GetInstance()->IsLocalVoice(mUri, &isLocal);
+ NS_WARNING_ASSERTION(
+ NS_SUCCEEDED(rv), "Failed to get SpeechSynthesisVoice.localService");
+
+ return isLocal;
+}
+
+bool
+SpeechSynthesisVoice::Default() const
+{
+ bool isDefault;
+ DebugOnly<nsresult> rv =
+ nsSynthVoiceRegistry::GetInstance()->IsDefaultVoice(mUri, &isDefault);
+ NS_WARNING_ASSERTION(
+ NS_SUCCEEDED(rv), "Failed to get SpeechSynthesisVoice.default");
+
+ return isDefault;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/SpeechSynthesisVoice.h b/dom/media/webspeech/synth/SpeechSynthesisVoice.h
new file mode 100644
index 000000000..5c3c651e2
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesisVoice.h
@@ -0,0 +1,60 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechSynthesisVoice_h
+#define mozilla_dom_SpeechSynthesisVoice_h
+
+#include "nsCOMPtr.h"
+#include "nsString.h"
+#include "nsWrapperCache.h"
+#include "js/TypeDecls.h"
+
+#include "nsISpeechService.h"
+
+namespace mozilla {
+namespace dom {
+
+class nsSynthVoiceRegistry;
+class SpeechSynthesis;
+
+class SpeechSynthesisVoice final : public nsISupports,
+ public nsWrapperCache
+{
+ friend class nsSynthVoiceRegistry;
+ friend class SpeechSynthesis;
+
+public:
+ SpeechSynthesisVoice(nsISupports* aParent, const nsAString& aUri);
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(SpeechSynthesisVoice)
+
+ nsISupports* GetParentObject() const;
+
+ JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+ void GetVoiceURI(nsString& aRetval) const;
+
+ void GetName(nsString& aRetval) const;
+
+ void GetLang(nsString& aRetval) const;
+
+ bool LocalService() const;
+
+ bool Default() const;
+
+private:
+ virtual ~SpeechSynthesisVoice();
+
+ nsCOMPtr<nsISupports> mParent;
+
+ nsString mUri;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerModule.cpp b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerModule.cpp
new file mode 100644
index 000000000..bc80eb06e
--- /dev/null
+++ b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerModule.cpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ModuleUtils.h"
+#include "nsIClassInfoImpl.h"
+
+#include "OSXSpeechSynthesizerService.h"
+
+using namespace mozilla::dom;
+
+#define OSXSPEECHSYNTHESIZERSERVICE_CID \
+ {0x914e73b4, 0x6337, 0x4bef, {0x97, 0xf3, 0x4d, 0x06, 0x9e, 0x05, 0x3a, 0x12}}
+
+#define OSXSPEECHSYNTHESIZERSERVICE_CONTRACTID "@mozilla.org/synthsystem;1"
+
+// Defines OSXSpeechSynthesizerServiceConstructor
+NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(OSXSpeechSynthesizerService,
+ OSXSpeechSynthesizerService::GetInstanceForService)
+
+// Defines kOSXSERVICE_CID
+NS_DEFINE_NAMED_CID(OSXSPEECHSYNTHESIZERSERVICE_CID);
+
+static const mozilla::Module::CIDEntry kCIDs[] = {
+ { &kOSXSPEECHSYNTHESIZERSERVICE_CID, true, nullptr, OSXSpeechSynthesizerServiceConstructor },
+ { nullptr }
+};
+
+static const mozilla::Module::ContractIDEntry kContracts[] = {
+ { OSXSPEECHSYNTHESIZERSERVICE_CONTRACTID, &kOSXSPEECHSYNTHESIZERSERVICE_CID },
+ { nullptr }
+};
+
+static const mozilla::Module::CategoryEntry kCategories[] = {
+ { "speech-synth-started", "OSX Speech Synth", OSXSPEECHSYNTHESIZERSERVICE_CONTRACTID },
+ { nullptr }
+};
+
+static void
+UnloadOSXSpeechSynthesizerModule()
+{
+ OSXSpeechSynthesizerService::Shutdown();
+}
+
+static const mozilla::Module kModule = {
+ mozilla::Module::kVersion,
+ kCIDs,
+ kContracts,
+ kCategories,
+ nullptr,
+ nullptr,
+ UnloadOSXSpeechSynthesizerModule
+};
+
+NSMODULE_DEFN(osxsynth) = &kModule;
diff --git a/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.h b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.h
new file mode 100644
index 000000000..18f52e59e
--- /dev/null
+++ b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_OsxSpeechSynthesizerService_h
+#define mozilla_dom_OsxSpeechSynthesizerService_h
+
+#include "nsISpeechService.h"
+#include "nsIObserver.h"
+#include "mozilla/StaticPtr.h"
+
+namespace mozilla {
+namespace dom {
+
+class OSXSpeechSynthesizerService final : public nsISpeechService
+ , public nsIObserver
+{
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSISPEECHSERVICE
+ NS_DECL_NSIOBSERVER
+
+ bool Init();
+
+ static OSXSpeechSynthesizerService* GetInstance();
+ static already_AddRefed<OSXSpeechSynthesizerService> GetInstanceForService();
+ static void Shutdown();
+
+private:
+ OSXSpeechSynthesizerService();
+ virtual ~OSXSpeechSynthesizerService();
+
+ bool RegisterVoices();
+
+ bool mInitialized;
+ static mozilla::StaticRefPtr<OSXSpeechSynthesizerService> sSingleton;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.mm b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.mm
new file mode 100644
index 000000000..df6c5eaa0
--- /dev/null
+++ b/dom/media/webspeech/synth/cocoa/OSXSpeechSynthesizerService.mm
@@ -0,0 +1,499 @@
+/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 sw=2 et tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.h"
+#include "nsServiceManagerUtils.h"
+#include "nsObjCExceptions.h"
+#include "nsCocoaUtils.h"
+#include "nsThreadUtils.h"
+#include "mozilla/dom/nsSynthVoiceRegistry.h"
+#include "mozilla/dom/nsSpeechTask.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/Assertions.h"
+#include "OSXSpeechSynthesizerService.h"
+
+#import <Cocoa/Cocoa.h>
+
+// We can escape the default delimiters ("[[" and "]]") by temporarily
+// changing the delimiters just before they appear, and changing them back
+// just after.
+#define DLIM_ESCAPE_START "[[dlim (( ))]]"
+#define DLIM_ESCAPE_END "((dlim [[ ]]))"
+
+using namespace mozilla;
+
+class SpeechTaskCallback final : public nsISpeechTaskCallback
+{
+public:
+ SpeechTaskCallback(nsISpeechTask* aTask,
+ NSSpeechSynthesizer* aSynth,
+ const nsTArray<size_t>& aOffsets)
+ : mTask(aTask)
+ , mSpeechSynthesizer(aSynth)
+ , mOffsets(aOffsets)
+ {
+ mStartingTime = TimeStamp::Now();
+ }
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(SpeechTaskCallback, nsISpeechTaskCallback)
+
+ NS_DECL_NSISPEECHTASKCALLBACK
+
+ void OnWillSpeakWord(uint32_t aIndex);
+ void OnError(uint32_t aIndex);
+ void OnDidFinishSpeaking();
+
+private:
+ virtual ~SpeechTaskCallback()
+ {
+ [mSpeechSynthesizer release];
+ }
+
+ float GetTimeDurationFromStart();
+
+ nsCOMPtr<nsISpeechTask> mTask;
+ NSSpeechSynthesizer* mSpeechSynthesizer;
+ TimeStamp mStartingTime;
+ uint32_t mCurrentIndex;
+ nsTArray<size_t> mOffsets;
+};
+
+NS_IMPL_CYCLE_COLLECTION(SpeechTaskCallback, mTask);
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechTaskCallback)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechTaskCallback)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTaskCallback)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechTaskCallback)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechTaskCallback)
+
+NS_IMETHODIMP
+SpeechTaskCallback::OnCancel()
+{
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ [mSpeechSynthesizer stopSpeaking];
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+SpeechTaskCallback::OnPause()
+{
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ [mSpeechSynthesizer pauseSpeakingAtBoundary:NSSpeechImmediateBoundary];
+ if (!mTask) {
+ // When calling pause() on child porcess, it may not receive end event
+ // from chrome process yet.
+ return NS_ERROR_FAILURE;
+ }
+ mTask->DispatchPause(GetTimeDurationFromStart(), mCurrentIndex);
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+SpeechTaskCallback::OnResume()
+{
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ [mSpeechSynthesizer continueSpeaking];
+ if (!mTask) {
+ // When calling resume() on child porcess, it may not receive end event
+ // from chrome process yet.
+ return NS_ERROR_FAILURE;
+ }
+ mTask->DispatchResume(GetTimeDurationFromStart(), mCurrentIndex);
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+SpeechTaskCallback::OnVolumeChanged(float aVolume)
+{
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ [mSpeechSynthesizer setObject:[NSNumber numberWithFloat:aVolume]
+ forProperty:NSSpeechVolumeProperty error:nil];
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+float
+SpeechTaskCallback::GetTimeDurationFromStart()
+{
+ TimeDuration duration = TimeStamp::Now() - mStartingTime;
+ return duration.ToMilliseconds();
+}
+
+void
+SpeechTaskCallback::OnWillSpeakWord(uint32_t aIndex)
+{
+ mCurrentIndex = aIndex < mOffsets.Length() ? mOffsets[aIndex] : mCurrentIndex;
+ if (!mTask) {
+ return;
+ }
+ mTask->DispatchBoundary(NS_LITERAL_STRING("word"),
+ GetTimeDurationFromStart(), mCurrentIndex);
+}
+
+void
+SpeechTaskCallback::OnError(uint32_t aIndex)
+{
+ if (!mTask) {
+ return;
+ }
+ mTask->DispatchError(GetTimeDurationFromStart(), aIndex);
+}
+
+void
+SpeechTaskCallback::OnDidFinishSpeaking()
+{
+ mTask->DispatchEnd(GetTimeDurationFromStart(), mCurrentIndex);
+ // no longer needed
+ [mSpeechSynthesizer setDelegate:nil];
+ mTask = nullptr;
+}
+
+@interface SpeechDelegate : NSObject<NSSpeechSynthesizerDelegate>
+{
+@private
+ SpeechTaskCallback* mCallback;
+}
+
+ - (id)initWithCallback:(SpeechTaskCallback*)aCallback;
+@end
+
+@implementation SpeechDelegate
+- (id)initWithCallback:(SpeechTaskCallback*)aCallback
+{
+ [super init];
+ mCallback = aCallback;
+ return self;
+}
+
+- (void)speechSynthesizer:(NSSpeechSynthesizer *)aSender
+ willSpeakWord:(NSRange)aRange ofString:(NSString*)aString
+{
+ mCallback->OnWillSpeakWord(aRange.location);
+}
+
+- (void)speechSynthesizer:(NSSpeechSynthesizer *)aSender
+ didFinishSpeaking:(BOOL)aFinishedSpeaking
+{
+ mCallback->OnDidFinishSpeaking();
+}
+
+- (void)speechSynthesizer:(NSSpeechSynthesizer*)aSender
+ didEncounterErrorAtIndex:(NSUInteger)aCharacterIndex
+ ofString:(NSString*)aString
+ message:(NSString*)aMessage
+{
+ mCallback->OnError(aCharacterIndex);
+}
+@end
+
+namespace mozilla {
+namespace dom {
+
+struct OSXVoice
+{
+ OSXVoice() : mIsDefault(false)
+ {
+ }
+
+ nsString mUri;
+ nsString mName;
+ nsString mLocale;
+ bool mIsDefault;
+};
+
+class RegisterVoicesRunnable final : public Runnable
+{
+public:
+ RegisterVoicesRunnable(OSXSpeechSynthesizerService* aSpeechService,
+ nsTArray<OSXVoice>& aList)
+ : mSpeechService(aSpeechService)
+ , mVoices(aList)
+ {
+ }
+
+ NS_IMETHOD Run() override;
+
+private:
+ ~RegisterVoicesRunnable()
+ {
+ }
+
+ // This runnable always use sync mode. It is unnecesarry to reference object
+ OSXSpeechSynthesizerService* mSpeechService;
+ nsTArray<OSXVoice>& mVoices;
+};
+
+NS_IMETHODIMP
+RegisterVoicesRunnable::Run()
+{
+ nsresult rv;
+ nsCOMPtr<nsISynthVoiceRegistry> registry =
+ do_GetService(NS_SYNTHVOICEREGISTRY_CONTRACTID, &rv);
+ if (!registry) {
+ return rv;
+ }
+
+ for (OSXVoice voice : mVoices) {
+ rv = registry->AddVoice(mSpeechService, voice.mUri, voice.mName, voice.mLocale, true, false);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ continue;
+ }
+
+ if (voice.mIsDefault) {
+ registry->SetDefaultVoice(voice.mUri, true);
+ }
+ }
+
+ registry->NotifyVoicesChanged();
+
+ return NS_OK;
+}
+
+class EnumVoicesRunnable final : public Runnable
+{
+public:
+ explicit EnumVoicesRunnable(OSXSpeechSynthesizerService* aSpeechService)
+ : mSpeechService(aSpeechService)
+ {
+ }
+
+ NS_IMETHOD Run() override;
+
+private:
+ ~EnumVoicesRunnable()
+ {
+ }
+
+ RefPtr<OSXSpeechSynthesizerService> mSpeechService;
+};
+
+NS_IMETHODIMP
+EnumVoicesRunnable::Run()
+{
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ AutoTArray<OSXVoice, 64> list;
+
+ NSArray* voices = [NSSpeechSynthesizer availableVoices];
+ NSString* defaultVoice = [NSSpeechSynthesizer defaultVoice];
+
+ for (NSString* voice in voices) {
+ OSXVoice item;
+
+ NSDictionary* attr = [NSSpeechSynthesizer attributesForVoice:voice];
+
+ nsAutoString identifier;
+ nsCocoaUtils::GetStringForNSString([attr objectForKey:NSVoiceIdentifier],
+ identifier);
+
+ nsCocoaUtils::GetStringForNSString([attr objectForKey:NSVoiceName], item.mName);
+
+ nsCocoaUtils::GetStringForNSString(
+ [attr objectForKey:NSVoiceLocaleIdentifier], item.mLocale);
+ item.mLocale.ReplaceChar('_', '-');
+
+ item.mUri.AssignLiteral("urn:moz-tts:osx:");
+ item.mUri.Append(identifier);
+
+ if ([voice isEqualToString:defaultVoice]) {
+ item.mIsDefault = true;
+ }
+
+ list.AppendElement(item);
+ }
+
+ RefPtr<RegisterVoicesRunnable> runnable = new RegisterVoicesRunnable(mSpeechService, list);
+ NS_DispatchToMainThread(runnable, NS_DISPATCH_SYNC);
+
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+StaticRefPtr<OSXSpeechSynthesizerService> OSXSpeechSynthesizerService::sSingleton;
+
+NS_INTERFACE_MAP_BEGIN(OSXSpeechSynthesizerService)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechService)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechService)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_ADDREF(OSXSpeechSynthesizerService)
+NS_IMPL_RELEASE(OSXSpeechSynthesizerService)
+
+OSXSpeechSynthesizerService::OSXSpeechSynthesizerService()
+ : mInitialized(false)
+{
+}
+
+OSXSpeechSynthesizerService::~OSXSpeechSynthesizerService()
+{
+}
+
+bool
+OSXSpeechSynthesizerService::Init()
+{
+ if (Preferences::GetBool("media.webspeech.synth.test") ||
+ !Preferences::GetBool("media.webspeech.synth.enabled")) {
+ // When test is enabled, we shouldn't add OS backend (Bug 1160844)
+ return false;
+ }
+
+ nsCOMPtr<nsIThread> thread;
+ if (NS_FAILED(NS_NewNamedThread("SpeechWorker", getter_AddRefs(thread)))) {
+ return false;
+ }
+
+ // Get all the voices and register in the SynthVoiceRegistry
+ nsCOMPtr<nsIRunnable> runnable = new EnumVoicesRunnable(this);
+ thread->Dispatch(runnable, NS_DISPATCH_NORMAL);
+
+ mInitialized = true;
+ return true;
+}
+
+NS_IMETHODIMP
+OSXSpeechSynthesizerService::Speak(const nsAString& aText,
+ const nsAString& aUri,
+ float aVolume,
+ float aRate,
+ float aPitch,
+ nsISpeechTask* aTask)
+{
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ MOZ_ASSERT(StringBeginsWith(aUri, NS_LITERAL_STRING("urn:moz-tts:osx:")),
+ "OSXSpeechSynthesizerService doesn't allow this voice URI");
+
+ NSSpeechSynthesizer* synth = [[NSSpeechSynthesizer alloc] init];
+ // strlen("urn:moz-tts:osx:") == 16
+ NSString* identifier = nsCocoaUtils::ToNSString(Substring(aUri, 16));
+ [synth setVoice:identifier];
+
+ // default rate is 180-220
+ [synth setObject:[NSNumber numberWithInt:aRate * 200]
+ forProperty:NSSpeechRateProperty error:nil];
+ // volume allows 0.0-1.0
+ [synth setObject:[NSNumber numberWithFloat:aVolume]
+ forProperty:NSSpeechVolumeProperty error:nil];
+ // Use default pitch value to calculate this
+ NSNumber* defaultPitch =
+ [synth objectForProperty:NSSpeechPitchBaseProperty error:nil];
+ if (defaultPitch) {
+ int newPitch = [defaultPitch intValue] * (aPitch / 2 + 0.5);
+ [synth setObject:[NSNumber numberWithInt:newPitch]
+ forProperty:NSSpeechPitchBaseProperty error:nil];
+ }
+
+ nsAutoString escapedText;
+ // We need to map the the offsets from the given text to the escaped text.
+ // The index of the offsets array is the position in the escaped text,
+ // the element value is the position in the user-supplied text.
+ nsTArray<size_t> offsets;
+ offsets.SetCapacity(aText.Length());
+
+ // This loop looks for occurances of "[[" or "]]", escapes them, and
+ // populates the offsets array to supply a map to the original offsets.
+ for (size_t i = 0; i < aText.Length(); i++) {
+ if (aText.Length() > i + 1 &&
+ ((aText[i] == ']' && aText[i+1] == ']') ||
+ (aText[i] == '[' && aText[i+1] == '['))) {
+ escapedText.AppendLiteral(DLIM_ESCAPE_START);
+ offsets.AppendElements(strlen(DLIM_ESCAPE_START));
+ escapedText.Append(aText[i]);
+ offsets.AppendElement(i);
+ escapedText.Append(aText[++i]);
+ offsets.AppendElement(i);
+ escapedText.AppendLiteral(DLIM_ESCAPE_END);
+ offsets.AppendElements(strlen(DLIM_ESCAPE_END));
+ } else {
+ escapedText.Append(aText[i]);
+ offsets.AppendElement(i);
+ }
+ }
+
+ RefPtr<SpeechTaskCallback> callback = new SpeechTaskCallback(aTask, synth, offsets);
+ nsresult rv = aTask->Setup(callback, 0, 0, 0);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ SpeechDelegate* delegate = [[SpeechDelegate alloc] initWithCallback:callback];
+ [synth setDelegate:delegate];
+ [delegate release ];
+
+ NSString* text = nsCocoaUtils::ToNSString(escapedText);
+ BOOL success = [synth startSpeakingString:text];
+ NS_ENSURE_TRUE(success, NS_ERROR_FAILURE);
+
+ aTask->DispatchStart();
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
+
+NS_IMETHODIMP
+OSXSpeechSynthesizerService::GetServiceType(SpeechServiceType* aServiceType)
+{
+ *aServiceType = nsISpeechService::SERVICETYPE_INDIRECT_AUDIO;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+OSXSpeechSynthesizerService::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ return NS_OK;
+}
+
+OSXSpeechSynthesizerService*
+OSXSpeechSynthesizerService::GetInstance()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (XRE_GetProcessType() != GeckoProcessType_Default) {
+ return nullptr;
+ }
+
+ if (!sSingleton) {
+ RefPtr<OSXSpeechSynthesizerService> speechService =
+ new OSXSpeechSynthesizerService();
+ if (speechService->Init()) {
+ sSingleton = speechService;
+ }
+ }
+ return sSingleton;
+}
+
+already_AddRefed<OSXSpeechSynthesizerService>
+OSXSpeechSynthesizerService::GetInstanceForService()
+{
+ RefPtr<OSXSpeechSynthesizerService> speechService = GetInstance();
+ return speechService.forget();
+}
+
+void
+OSXSpeechSynthesizerService::Shutdown()
+{
+ if (!sSingleton) {
+ return;
+ }
+ sSingleton = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/cocoa/moz.build b/dom/media/webspeech/synth/cocoa/moz.build
new file mode 100644
index 000000000..b48680c7a
--- /dev/null
+++ b/dom/media/webspeech/synth/cocoa/moz.build
@@ -0,0 +1,12 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+SOURCES += [
+ 'OSXSpeechSynthesizerModule.cpp',
+ 'OSXSpeechSynthesizerService.mm'
+]
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/webspeech/synth/crashtests/1230428.html b/dom/media/webspeech/synth/crashtests/1230428.html
new file mode 100644
index 000000000..40fa00071
--- /dev/null
+++ b/dom/media/webspeech/synth/crashtests/1230428.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<script type="application/javascript">
+function f()
+{
+ if (speechSynthesis.getVoices().length == 0) {
+ // No synthesis backend to test this
+ document.documentElement.removeAttribute('class');
+ return;
+ }
+
+ var s = new SpeechSynthesisUtterance("hello world");
+ s.onerror = () => {
+ // No synthesis backend to test this
+ document.documentElement.removeAttribute('class');
+ return;
+ }
+ s.onend = () => {
+ document.documentElement.removeAttribute('class');
+ };
+ speechSynthesis.speak(s);
+ speechSynthesis.cancel();
+ speechSynthesis.pause();
+ speechSynthesis.resume();
+}
+ </script>
+</head>
+<body onload="f();">
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/crashtests/crashtests.list b/dom/media/webspeech/synth/crashtests/crashtests.list
new file mode 100644
index 000000000..07e931c92
--- /dev/null
+++ b/dom/media/webspeech/synth/crashtests/crashtests.list
@@ -0,0 +1 @@
+skip-if(!cocoaWidget) pref(media.webspeech.synth.enabled,true) load 1230428.html # bug 1230428
diff --git a/dom/media/webspeech/synth/ipc/PSpeechSynthesis.ipdl b/dom/media/webspeech/synth/ipc/PSpeechSynthesis.ipdl
new file mode 100644
index 000000000..7b66034e4
--- /dev/null
+++ b/dom/media/webspeech/synth/ipc/PSpeechSynthesis.ipdl
@@ -0,0 +1,49 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PContent;
+include protocol PSpeechSynthesisRequest;
+
+namespace mozilla {
+namespace dom {
+
+struct RemoteVoice {
+ nsString voiceURI;
+ nsString name;
+ nsString lang;
+ bool localService;
+ bool queued;
+};
+
+sync protocol PSpeechSynthesis
+{
+ manager PContent;
+ manages PSpeechSynthesisRequest;
+
+child:
+
+ async VoiceAdded(RemoteVoice aVoice);
+
+ async VoiceRemoved(nsString aUri);
+
+ async SetDefaultVoice(nsString aUri, bool aIsDefault);
+
+ async IsSpeakingChanged(bool aIsSpeaking);
+
+ async NotifyVoicesChanged();
+
+parent:
+ async __delete__();
+
+ async PSpeechSynthesisRequest(nsString aText, nsString aUri, nsString aLang,
+ float aVolume, float aRate, float aPitch);
+
+ sync ReadVoicesAndState() returns (RemoteVoice[] aVoices,
+ nsString[] aDefaults, bool aIsSpeaking);
+};
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/ipc/PSpeechSynthesisRequest.ipdl b/dom/media/webspeech/synth/ipc/PSpeechSynthesisRequest.ipdl
new file mode 100644
index 000000000..9ffea29f5
--- /dev/null
+++ b/dom/media/webspeech/synth/ipc/PSpeechSynthesisRequest.ipdl
@@ -0,0 +1,46 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+include protocol PSpeechSynthesis;
+
+namespace mozilla {
+namespace dom {
+
+async protocol PSpeechSynthesisRequest
+{
+ manager PSpeechSynthesis;
+
+ parent:
+
+ async __delete__();
+
+ async Pause();
+
+ async Resume();
+
+ async Cancel();
+
+ async ForceEnd();
+
+ async SetAudioOutputVolume(float aVolume);
+
+ child:
+
+ async OnEnd(bool aIsError, float aElapsedTime, uint32_t aCharIndex);
+
+ async OnStart(nsString aUri);
+
+ async OnPause(float aElapsedTime, uint32_t aCharIndex);
+
+ async OnResume(float aElapsedTime, uint32_t aCharIndex);
+
+ async OnBoundary(nsString aName, float aElapsedTime, uint32_t aCharIndex);
+
+ async OnMark(nsString aName, float aElapsedTime, uint32_t aCharIndex);
+};
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp b/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp
new file mode 100644
index 000000000..d1cb8bf0e
--- /dev/null
+++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.cpp
@@ -0,0 +1,213 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechSynthesisChild.h"
+#include "nsSynthVoiceRegistry.h"
+
+namespace mozilla {
+namespace dom {
+
+SpeechSynthesisChild::SpeechSynthesisChild()
+{
+ MOZ_COUNT_CTOR(SpeechSynthesisChild);
+}
+
+SpeechSynthesisChild::~SpeechSynthesisChild()
+{
+ MOZ_COUNT_DTOR(SpeechSynthesisChild);
+}
+
+bool
+SpeechSynthesisChild::RecvVoiceAdded(const RemoteVoice& aVoice)
+{
+ nsSynthVoiceRegistry::RecvAddVoice(aVoice);
+ return true;
+}
+
+bool
+SpeechSynthesisChild::RecvVoiceRemoved(const nsString& aUri)
+{
+ nsSynthVoiceRegistry::RecvRemoveVoice(aUri);
+ return true;
+}
+
+bool
+SpeechSynthesisChild::RecvSetDefaultVoice(const nsString& aUri,
+ const bool& aIsDefault)
+{
+ nsSynthVoiceRegistry::RecvSetDefaultVoice(aUri, aIsDefault);
+ return true;
+}
+
+bool
+SpeechSynthesisChild::RecvIsSpeakingChanged(const bool& aIsSpeaking)
+{
+ nsSynthVoiceRegistry::RecvIsSpeakingChanged(aIsSpeaking);
+ return true;
+}
+
+bool
+SpeechSynthesisChild::RecvNotifyVoicesChanged()
+{
+ nsSynthVoiceRegistry::RecvNotifyVoicesChanged();
+ return true;
+}
+
+PSpeechSynthesisRequestChild*
+SpeechSynthesisChild::AllocPSpeechSynthesisRequestChild(const nsString& aText,
+ const nsString& aLang,
+ const nsString& aUri,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch)
+{
+ MOZ_CRASH("Caller is supposed to manually construct a request!");
+}
+
+bool
+SpeechSynthesisChild::DeallocPSpeechSynthesisRequestChild(PSpeechSynthesisRequestChild* aActor)
+{
+ delete aActor;
+ return true;
+}
+
+// SpeechSynthesisRequestChild
+
+SpeechSynthesisRequestChild::SpeechSynthesisRequestChild(SpeechTaskChild* aTask)
+ : mTask(aTask)
+{
+ mTask->mActor = this;
+ MOZ_COUNT_CTOR(SpeechSynthesisRequestChild);
+}
+
+SpeechSynthesisRequestChild::~SpeechSynthesisRequestChild()
+{
+ MOZ_COUNT_DTOR(SpeechSynthesisRequestChild);
+}
+
+bool
+SpeechSynthesisRequestChild::RecvOnStart(const nsString& aUri)
+{
+ mTask->DispatchStartImpl(aUri);
+ return true;
+}
+
+bool
+SpeechSynthesisRequestChild::RecvOnEnd(const bool& aIsError,
+ const float& aElapsedTime,
+ const uint32_t& aCharIndex)
+{
+ SpeechSynthesisRequestChild* actor = mTask->mActor;
+ mTask->mActor = nullptr;
+
+ if (aIsError) {
+ mTask->DispatchErrorImpl(aElapsedTime, aCharIndex);
+ } else {
+ mTask->DispatchEndImpl(aElapsedTime, aCharIndex);
+ }
+
+ actor->Send__delete__(actor);
+
+ return true;
+}
+
+bool
+SpeechSynthesisRequestChild::RecvOnPause(const float& aElapsedTime,
+ const uint32_t& aCharIndex)
+{
+ mTask->DispatchPauseImpl(aElapsedTime, aCharIndex);
+ return true;
+}
+
+bool
+SpeechSynthesisRequestChild::RecvOnResume(const float& aElapsedTime,
+ const uint32_t& aCharIndex)
+{
+ mTask->DispatchResumeImpl(aElapsedTime, aCharIndex);
+ return true;
+}
+
+bool
+SpeechSynthesisRequestChild::RecvOnBoundary(const nsString& aName,
+ const float& aElapsedTime,
+ const uint32_t& aCharIndex)
+{
+ mTask->DispatchBoundaryImpl(aName, aElapsedTime, aCharIndex);
+ return true;
+}
+
+bool
+SpeechSynthesisRequestChild::RecvOnMark(const nsString& aName,
+ const float& aElapsedTime,
+ const uint32_t& aCharIndex)
+{
+ mTask->DispatchMarkImpl(aName, aElapsedTime, aCharIndex);
+ return true;
+}
+
+// SpeechTaskChild
+
+SpeechTaskChild::SpeechTaskChild(SpeechSynthesisUtterance* aUtterance)
+ : nsSpeechTask(aUtterance)
+{
+}
+
+NS_IMETHODIMP
+SpeechTaskChild::Setup(nsISpeechTaskCallback* aCallback,
+ uint32_t aChannels, uint32_t aRate, uint8_t argc)
+{
+ MOZ_CRASH("Should never be called from child");
+}
+
+NS_IMETHODIMP
+SpeechTaskChild::SendAudio(JS::Handle<JS::Value> aData, JS::Handle<JS::Value> aLandmarks,
+ JSContext* aCx)
+{
+ MOZ_CRASH("Should never be called from child");
+}
+
+NS_IMETHODIMP
+SpeechTaskChild::SendAudioNative(int16_t* aData, uint32_t aDataLen)
+{
+ MOZ_CRASH("Should never be called from child");
+}
+
+void
+SpeechTaskChild::Pause()
+{
+ MOZ_ASSERT(mActor);
+ mActor->SendPause();
+}
+
+void
+SpeechTaskChild::Resume()
+{
+ MOZ_ASSERT(mActor);
+ mActor->SendResume();
+}
+
+void
+SpeechTaskChild::Cancel()
+{
+ MOZ_ASSERT(mActor);
+ mActor->SendCancel();
+}
+
+void
+SpeechTaskChild::ForceEnd()
+{
+ MOZ_ASSERT(mActor);
+ mActor->SendForceEnd();
+}
+
+void
+SpeechTaskChild::SetAudioOutputVolume(float aVolume)
+{
+ if (mActor) {
+ mActor->SendSetAudioOutputVolume(aVolume);
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.h b/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.h
new file mode 100644
index 000000000..01e9ffbdd
--- /dev/null
+++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisChild.h
@@ -0,0 +1,106 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechSynthesisChild_h
+#define mozilla_dom_SpeechSynthesisChild_h
+
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/PSpeechSynthesisChild.h"
+#include "mozilla/dom/PSpeechSynthesisRequestChild.h"
+#include "nsSpeechTask.h"
+
+namespace mozilla {
+namespace dom {
+
+class nsSynthVoiceRegistry;
+class SpeechSynthesisRequestChild;
+class SpeechTaskChild;
+
+class SpeechSynthesisChild : public PSpeechSynthesisChild
+{
+ friend class nsSynthVoiceRegistry;
+
+public:
+ bool RecvVoiceAdded(const RemoteVoice& aVoice) override;
+
+ bool RecvVoiceRemoved(const nsString& aUri) override;
+
+ bool RecvSetDefaultVoice(const nsString& aUri, const bool& aIsDefault) override;
+
+ bool RecvIsSpeakingChanged(const bool& aIsSpeaking) override;
+
+ bool RecvNotifyVoicesChanged() override;
+
+protected:
+ SpeechSynthesisChild();
+ virtual ~SpeechSynthesisChild();
+
+ PSpeechSynthesisRequestChild* AllocPSpeechSynthesisRequestChild(const nsString& aLang,
+ const nsString& aUri,
+ const nsString& aText,
+ const float& aVolume,
+ const float& aPitch,
+ const float& aRate) override;
+ bool DeallocPSpeechSynthesisRequestChild(PSpeechSynthesisRequestChild* aActor) override;
+};
+
+class SpeechSynthesisRequestChild : public PSpeechSynthesisRequestChild
+{
+public:
+ explicit SpeechSynthesisRequestChild(SpeechTaskChild* aTask);
+ virtual ~SpeechSynthesisRequestChild();
+
+protected:
+ bool RecvOnStart(const nsString& aUri) override;
+
+ bool RecvOnEnd(const bool& aIsError,
+ const float& aElapsedTime,
+ const uint32_t& aCharIndex) override;
+
+ bool RecvOnPause(const float& aElapsedTime, const uint32_t& aCharIndex) override;
+
+ bool RecvOnResume(const float& aElapsedTime, const uint32_t& aCharIndex) override;
+
+ bool RecvOnBoundary(const nsString& aName, const float& aElapsedTime,
+ const uint32_t& aCharIndex) override;
+
+ bool RecvOnMark(const nsString& aName, const float& aElapsedTime,
+ const uint32_t& aCharIndex) override;
+
+ RefPtr<SpeechTaskChild> mTask;
+};
+
+class SpeechTaskChild : public nsSpeechTask
+{
+ friend class SpeechSynthesisRequestChild;
+public:
+
+ explicit SpeechTaskChild(SpeechSynthesisUtterance* aUtterance);
+
+ NS_IMETHOD Setup(nsISpeechTaskCallback* aCallback,
+ uint32_t aChannels, uint32_t aRate, uint8_t argc) override;
+
+ NS_IMETHOD SendAudio(JS::Handle<JS::Value> aData, JS::Handle<JS::Value> aLandmarks,
+ JSContext* aCx) override;
+
+ NS_IMETHOD SendAudioNative(int16_t* aData, uint32_t aDataLen) override;
+
+ void Pause() override;
+
+ void Resume() override;
+
+ void Cancel() override;
+
+ void ForceEnd() override;
+
+ void SetAudioOutputVolume(float aVolume) override;
+
+private:
+ SpeechSynthesisRequestChild* mActor;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp
new file mode 100644
index 000000000..8dc70e872
--- /dev/null
+++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.cpp
@@ -0,0 +1,234 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechSynthesisParent.h"
+#include "nsSynthVoiceRegistry.h"
+
+namespace mozilla {
+namespace dom {
+
+SpeechSynthesisParent::SpeechSynthesisParent()
+{
+ MOZ_COUNT_CTOR(SpeechSynthesisParent);
+}
+
+SpeechSynthesisParent::~SpeechSynthesisParent()
+{
+ MOZ_COUNT_DTOR(SpeechSynthesisParent);
+}
+
+void
+SpeechSynthesisParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ // Implement me! Bug 1005141
+}
+
+bool
+SpeechSynthesisParent::RecvReadVoicesAndState(InfallibleTArray<RemoteVoice>* aVoices,
+ InfallibleTArray<nsString>* aDefaults,
+ bool* aIsSpeaking)
+{
+ nsSynthVoiceRegistry::GetInstance()->SendVoicesAndState(aVoices, aDefaults,
+ aIsSpeaking);
+ return true;
+}
+
+PSpeechSynthesisRequestParent*
+SpeechSynthesisParent::AllocPSpeechSynthesisRequestParent(const nsString& aText,
+ const nsString& aLang,
+ const nsString& aUri,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch)
+{
+ RefPtr<SpeechTaskParent> task = new SpeechTaskParent(aVolume, aText);
+ SpeechSynthesisRequestParent* actor = new SpeechSynthesisRequestParent(task);
+ return actor;
+}
+
+bool
+SpeechSynthesisParent::DeallocPSpeechSynthesisRequestParent(PSpeechSynthesisRequestParent* aActor)
+{
+ delete aActor;
+ return true;
+}
+
+bool
+SpeechSynthesisParent::RecvPSpeechSynthesisRequestConstructor(PSpeechSynthesisRequestParent* aActor,
+ const nsString& aText,
+ const nsString& aLang,
+ const nsString& aUri,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch)
+{
+ MOZ_ASSERT(aActor);
+ SpeechSynthesisRequestParent* actor =
+ static_cast<SpeechSynthesisRequestParent*>(aActor);
+ nsSynthVoiceRegistry::GetInstance()->Speak(aText, aLang, aUri, aVolume, aRate,
+ aPitch, actor->mTask);
+ return true;
+}
+
+// SpeechSynthesisRequestParent
+
+SpeechSynthesisRequestParent::SpeechSynthesisRequestParent(SpeechTaskParent* aTask)
+ : mTask(aTask)
+{
+ mTask->mActor = this;
+ MOZ_COUNT_CTOR(SpeechSynthesisRequestParent);
+}
+
+SpeechSynthesisRequestParent::~SpeechSynthesisRequestParent()
+{
+ if (mTask) {
+ mTask->mActor = nullptr;
+ // If we still have a task, cancel it.
+ mTask->Cancel();
+ }
+ MOZ_COUNT_DTOR(SpeechSynthesisRequestParent);
+}
+
+void
+SpeechSynthesisRequestParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ // Implement me! Bug 1005141
+}
+
+bool
+SpeechSynthesisRequestParent::RecvPause()
+{
+ MOZ_ASSERT(mTask);
+ mTask->Pause();
+ return true;
+}
+
+bool
+SpeechSynthesisRequestParent::Recv__delete__()
+{
+ MOZ_ASSERT(mTask);
+ mTask->mActor = nullptr;
+ mTask = nullptr;
+ return true;
+}
+
+bool
+SpeechSynthesisRequestParent::RecvResume()
+{
+ MOZ_ASSERT(mTask);
+ mTask->Resume();
+ return true;
+}
+
+bool
+SpeechSynthesisRequestParent::RecvCancel()
+{
+ MOZ_ASSERT(mTask);
+ mTask->Cancel();
+ return true;
+}
+
+bool
+SpeechSynthesisRequestParent::RecvForceEnd()
+{
+ MOZ_ASSERT(mTask);
+ mTask->ForceEnd();
+ return true;
+}
+
+bool
+SpeechSynthesisRequestParent::RecvSetAudioOutputVolume(const float& aVolume)
+{
+ MOZ_ASSERT(mTask);
+ mTask->SetAudioOutputVolume(aVolume);
+ return true;
+}
+
+// SpeechTaskParent
+
+nsresult
+SpeechTaskParent::DispatchStartImpl(const nsAString& aUri)
+{
+ MOZ_ASSERT(mActor);
+ if(NS_WARN_IF(!(mActor->SendOnStart(nsString(aUri))))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+SpeechTaskParent::DispatchEndImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mActor) {
+ // Child is already gone.
+ return NS_OK;
+ }
+
+ if(NS_WARN_IF(!(mActor->SendOnEnd(false, aElapsedTime, aCharIndex)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+SpeechTaskParent::DispatchPauseImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mActor);
+ if(NS_WARN_IF(!(mActor->SendOnPause(aElapsedTime, aCharIndex)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+SpeechTaskParent::DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mActor);
+ if(NS_WARN_IF(!(mActor->SendOnResume(aElapsedTime, aCharIndex)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+SpeechTaskParent::DispatchErrorImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mActor);
+ if(NS_WARN_IF(!(mActor->SendOnEnd(true, aElapsedTime, aCharIndex)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+SpeechTaskParent::DispatchBoundaryImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mActor);
+ if(NS_WARN_IF(!(mActor->SendOnBoundary(nsString(aName), aElapsedTime, aCharIndex)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+nsresult
+SpeechTaskParent::DispatchMarkImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mActor);
+ if(NS_WARN_IF(!(mActor->SendOnMark(nsString(aName), aElapsedTime, aCharIndex)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h
new file mode 100644
index 000000000..2edd7e28e
--- /dev/null
+++ b/dom/media/webspeech/synth/ipc/SpeechSynthesisParent.h
@@ -0,0 +1,108 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechSynthesisParent_h
+#define mozilla_dom_SpeechSynthesisParent_h
+
+#include "mozilla/dom/PSpeechSynthesisParent.h"
+#include "mozilla/dom/PSpeechSynthesisRequestParent.h"
+#include "nsSpeechTask.h"
+
+namespace mozilla {
+namespace dom {
+
+class ContentParent;
+class SpeechTaskParent;
+class SpeechSynthesisRequestParent;
+
+class SpeechSynthesisParent : public PSpeechSynthesisParent
+{
+ friend class ContentParent;
+ friend class SpeechSynthesisRequestParent;
+
+public:
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ bool RecvReadVoicesAndState(InfallibleTArray<RemoteVoice>* aVoices,
+ InfallibleTArray<nsString>* aDefaults,
+ bool* aIsSpeaking) override;
+
+protected:
+ SpeechSynthesisParent();
+ virtual ~SpeechSynthesisParent();
+ PSpeechSynthesisRequestParent* AllocPSpeechSynthesisRequestParent(const nsString& aText,
+ const nsString& aLang,
+ const nsString& aUri,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch)
+ override;
+
+ bool DeallocPSpeechSynthesisRequestParent(PSpeechSynthesisRequestParent* aActor) override;
+
+ bool RecvPSpeechSynthesisRequestConstructor(PSpeechSynthesisRequestParent* aActor,
+ const nsString& aText,
+ const nsString& aLang,
+ const nsString& aUri,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch) override;
+};
+
+class SpeechSynthesisRequestParent : public PSpeechSynthesisRequestParent
+{
+public:
+ explicit SpeechSynthesisRequestParent(SpeechTaskParent* aTask);
+ virtual ~SpeechSynthesisRequestParent();
+
+ RefPtr<SpeechTaskParent> mTask;
+
+protected:
+
+ void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ bool RecvPause() override;
+
+ bool RecvResume() override;
+
+ bool RecvCancel() override;
+
+ bool RecvForceEnd() override;
+
+ bool RecvSetAudioOutputVolume(const float& aVolume) override;
+
+ bool Recv__delete__() override;
+};
+
+class SpeechTaskParent : public nsSpeechTask
+{
+ friend class SpeechSynthesisRequestParent;
+public:
+ SpeechTaskParent(float aVolume, const nsAString& aUtterance)
+ : nsSpeechTask(aVolume, aUtterance) {}
+
+ nsresult DispatchStartImpl(const nsAString& aUri);
+
+ nsresult DispatchEndImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ nsresult DispatchPauseImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ nsresult DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ nsresult DispatchErrorImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ nsresult DispatchBoundaryImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex);
+
+ nsresult DispatchMarkImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex);
+
+private:
+ SpeechSynthesisRequestParent* mActor;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/moz.build b/dom/media/webspeech/synth/moz.build
new file mode 100644
index 000000000..bb26515af
--- /dev/null
+++ b/dom/media/webspeech/synth/moz.build
@@ -0,0 +1,70 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+if CONFIG['MOZ_WEBSPEECH']:
+ MOCHITEST_MANIFESTS += [
+ 'test/mochitest.ini',
+ 'test/startup/mochitest.ini',
+ ]
+
+ XPIDL_MODULE = 'dom_webspeechsynth'
+
+ XPIDL_SOURCES += [
+ 'nsISpeechService.idl',
+ 'nsISynthVoiceRegistry.idl'
+ ]
+
+ EXPORTS.mozilla.dom += [
+ 'ipc/SpeechSynthesisChild.h',
+ 'ipc/SpeechSynthesisParent.h',
+ 'nsSpeechTask.h',
+ 'nsSynthVoiceRegistry.h',
+ 'SpeechSynthesis.h',
+ 'SpeechSynthesisUtterance.h',
+ 'SpeechSynthesisVoice.h',
+ ]
+
+ UNIFIED_SOURCES += [
+ 'ipc/SpeechSynthesisChild.cpp',
+ 'ipc/SpeechSynthesisParent.cpp',
+ 'nsSpeechTask.cpp',
+ 'nsSynthVoiceRegistry.cpp',
+ 'SpeechSynthesis.cpp',
+ 'SpeechSynthesisUtterance.cpp',
+ 'SpeechSynthesisVoice.cpp',
+ ]
+
+ if CONFIG['MOZ_WEBSPEECH_TEST_BACKEND']:
+ UNIFIED_SOURCES += [
+ 'test/FakeSynthModule.cpp',
+ 'test/nsFakeSynthServices.cpp'
+ ]
+
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
+ DIRS += ['windows']
+
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
+ DIRS += ['cocoa']
+
+ if CONFIG['MOZ_SYNTH_SPEECHD']:
+ DIRS += ['speechd']
+
+ if CONFIG['MOZ_SYNTH_PICO']:
+ DIRS += ['pico']
+
+IPDL_SOURCES += [
+ 'ipc/PSpeechSynthesis.ipdl',
+ 'ipc/PSpeechSynthesisRequest.ipdl',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
+LOCAL_INCLUDES += [
+ 'ipc',
+]
+
+if CONFIG['GNU_CXX']:
+ CXXFLAGS += ['-Wno-error=shadow']
diff --git a/dom/media/webspeech/synth/nsISpeechService.idl b/dom/media/webspeech/synth/nsISpeechService.idl
new file mode 100644
index 000000000..710686f1e
--- /dev/null
+++ b/dom/media/webspeech/synth/nsISpeechService.idl
@@ -0,0 +1,173 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+typedef unsigned short SpeechServiceType;
+
+/**
+ * A callback is implemented by the service. For direct audio services, it is
+ * required to implement these, although it could be helpful to use the
+ * cancel method for shutting down the speech resources.
+ */
+[scriptable, uuid(c576de0c-8a3d-4570-be7e-9876d3e5bed2)]
+interface nsISpeechTaskCallback : nsISupports
+{
+ /**
+ * The user or application has paused the speech.
+ */
+ void onPause();
+
+ /**
+ * The user or application has resumed the speech.
+ */
+ void onResume();
+
+ /**
+ * The user or application has canceled the speech.
+ */
+ void onCancel();
+
+ /**
+ * The user or application has changed the volume of this speech.
+ * This is only used on indirect audio service type.
+ */
+ void onVolumeChanged(in float aVolume);
+};
+
+
+/**
+ * A task is associated with a single utterance. It is provided by the browser
+ * to the service in the speak() method.
+ */
+[scriptable, builtinclass, uuid(ad59949c-2437-4b35-8eeb-d760caab75c5)]
+interface nsISpeechTask : nsISupports
+{
+ /**
+ * Prepare browser for speech.
+ *
+ * @param aCallback callback object for mid-speech operations.
+ * @param aChannels number of audio channels. Only required
+ * in direct audio services
+ * @param aRate audio rate. Only required in direct audio services
+ */
+ [optional_argc] void setup(in nsISpeechTaskCallback aCallback,
+ [optional] in uint32_t aChannels,
+ [optional] in uint32_t aRate);
+
+ /**
+ * Send audio data to browser.
+ *
+ * @param aData an Int16Array with PCM-16 audio data.
+ * @param aLandmarks an array of sample offset and landmark pairs.
+ * Used for emiting boundary and mark events.
+ */
+ [implicit_jscontext]
+ void sendAudio(in jsval aData, in jsval aLandmarks);
+
+ [noscript]
+ void sendAudioNative([array, size_is(aDataLen)] in short aData, in unsigned long aDataLen);
+
+ /**
+ * Dispatch start event.
+ */
+ void dispatchStart();
+
+ /**
+ * Dispatch end event.
+ *
+ * @param aElapsedTime time in seconds since speech has started.
+ * @param aCharIndex offset of spoken characters.
+ */
+ void dispatchEnd(in float aElapsedTime, in unsigned long aCharIndex);
+
+ /**
+ * Dispatch pause event.
+ *
+ * @param aElapsedTime time in seconds since speech has started.
+ * @param aCharIndex offset of spoken characters.
+ */
+ void dispatchPause(in float aElapsedTime, in unsigned long aCharIndex);
+
+ /**
+ * Dispatch resume event.
+ *
+ * @param aElapsedTime time in seconds since speech has started.
+ * @param aCharIndex offset of spoken characters.
+ */
+ void dispatchResume(in float aElapsedTime, in unsigned long aCharIndex);
+
+ /**
+ * Dispatch error event.
+ *
+ * @param aElapsedTime time in seconds since speech has started.
+ * @param aCharIndex offset of spoken characters.
+ */
+ void dispatchError(in float aElapsedTime, in unsigned long aCharIndex);
+
+ /**
+ * Dispatch boundary event.
+ *
+ * @param aName name of boundary, 'word' or 'sentence'
+ * @param aElapsedTime time in seconds since speech has started.
+ * @param aCharIndex offset of spoken characters.
+ */
+ void dispatchBoundary(in DOMString aName, in float aElapsedTime,
+ in unsigned long aCharIndex);
+
+ /**
+ * Dispatch mark event.
+ *
+ * @param aName mark identifier.
+ * @param aElapsedTime time in seconds since speech has started.
+ * @param aCharIndex offset of spoken characters.
+ */
+ void dispatchMark(in DOMString aName, in float aElapsedTime, in unsigned long aCharIndex);
+};
+
+/**
+ * The main interface of a speech synthesis service.
+ *
+ * A service's speak method could be implemented in two ways:
+ * 1. Indirect audio - the service is responsible for outputting audio.
+ * The service calls the nsISpeechTask.dispatch* methods directly. Starting
+ * with dispatchStart() and ending with dispatchEnd or dispatchError().
+ *
+ * 2. Direct audio - the service provides us with PCM-16 data, and we output it.
+ * The service does not call the dispatch task methods directly. Instead,
+ * audio information is provided at setup(), and audio data is sent with
+ * sendAudio(). The utterance is terminated with an empty sendAudio().
+ */
+[scriptable, uuid(9b7d59db-88ff-43d0-b6ee-9f63d042d08f)]
+interface nsISpeechService : nsISupports
+{
+ /**
+ * Speak the given text using the voice identified byu the given uri. See
+ * W3C Speech API spec for information about pitch and rate.
+ * https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#utterance-attributes
+ *
+ * @param aText text to utter.
+ * @param aUri unique voice identifier.
+ * @param aVolume volume to speak voice in. Only relevant for indirect audio.
+ * @param aRate rate to speak voice in.
+ * @param aPitch pitch to speak voice in.
+ * @param aTask task instance for utterance, used for sending events or audio
+ * data back to browser.
+ */
+ void speak(in DOMString aText, in DOMString aUri,
+ in float aVolume, in float aRate, in float aPitch,
+ in nsISpeechTask aTask);
+
+ const SpeechServiceType SERVICETYPE_DIRECT_AUDIO = 1;
+ const SpeechServiceType SERVICETYPE_INDIRECT_AUDIO = 2;
+
+ readonly attribute SpeechServiceType serviceType;
+};
+
+%{C++
+// This is the service category speech services could use to start up as
+// a component.
+#define NS_SPEECH_SYNTH_STARTED "speech-synth-started"
+%}
diff --git a/dom/media/webspeech/synth/nsISynthVoiceRegistry.idl b/dom/media/webspeech/synth/nsISynthVoiceRegistry.idl
new file mode 100644
index 000000000..cc0a5e1c6
--- /dev/null
+++ b/dom/media/webspeech/synth/nsISynthVoiceRegistry.idl
@@ -0,0 +1,77 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+interface nsISpeechService;
+
+[scriptable, builtinclass, uuid(5d7a0b38-77e5-4ee5-897c-ce5db9b85d44)]
+interface nsISynthVoiceRegistry : nsISupports
+{
+ /**
+ * Register a speech synthesis voice.
+ *
+ * @param aService the service that provides this voice.
+ * @param aUri a unique identifier for this voice.
+ * @param aName human-readable name for this voice.
+ * @param aLang a BCP 47 language tag.
+ * @param aLocalService true if service does not require network.
+ * @param aQueuesUtterances true if voice only speaks one utterance at a time
+ */
+ void addVoice(in nsISpeechService aService, in DOMString aUri,
+ in DOMString aName, in DOMString aLang,
+ in boolean aLocalService, in boolean aQueuesUtterances);
+
+ /**
+ * Remove a speech synthesis voice.
+ *
+ * @param aService the service that was used to add the voice.
+ * @param aUri a unique identifier of an existing voice.
+ */
+ void removeVoice(in nsISpeechService aService, in DOMString aUri);
+
+ /**
+ * Notify content of voice availability changes. This allows content
+ * to be notified of voice catalog changes in real time.
+ */
+ void notifyVoicesChanged();
+
+ /**
+ * Set a voice as default.
+ *
+ * @param aUri a unique identifier of an existing voice.
+ * @param aIsDefault true if this voice should be toggled as default.
+ */
+ void setDefaultVoice(in DOMString aUri, in boolean aIsDefault);
+
+ readonly attribute uint32_t voiceCount;
+
+ AString getVoice(in uint32_t aIndex);
+
+ bool isDefaultVoice(in DOMString aUri);
+
+ bool isLocalVoice(in DOMString aUri);
+
+ AString getVoiceLang(in DOMString aUri);
+
+ AString getVoiceName(in DOMString aUri);
+};
+
+%{C++
+#define NS_SYNTHVOICEREGISTRY_CID \
+ { /* {7090524d-5574-4492-a77f-d8d558ced59d} */ \
+ 0x7090524d, \
+ 0x5574, \
+ 0x4492, \
+ { 0xa7, 0x7f, 0xd8, 0xd5, 0x58, 0xce, 0xd5, 0x9d } \
+ }
+
+#define NS_SYNTHVOICEREGISTRY_CONTRACTID \
+ "@mozilla.org/synth-voice-registry;1"
+
+#define NS_SYNTHVOICEREGISTRY_CLASSNAME \
+ "Speech Synthesis Voice Registry"
+
+%}
diff --git a/dom/media/webspeech/synth/nsSpeechTask.cpp b/dom/media/webspeech/synth/nsSpeechTask.cpp
new file mode 100644
index 000000000..d687f5122
--- /dev/null
+++ b/dom/media/webspeech/synth/nsSpeechTask.cpp
@@ -0,0 +1,783 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "AudioChannelAgent.h"
+#include "AudioChannelService.h"
+#include "AudioSegment.h"
+#include "MediaStreamListener.h"
+#include "nsSpeechTask.h"
+#include "nsSynthVoiceRegistry.h"
+#include "SharedBuffer.h"
+#include "SpeechSynthesis.h"
+
+// GetCurrentTime is defined in winbase.h as zero argument macro forwarding to
+// GetTickCount() and conflicts with nsSpeechTask::GetCurrentTime().
+#ifdef GetCurrentTime
+#undef GetCurrentTime
+#endif
+
+#undef LOG
+extern mozilla::LogModule* GetSpeechSynthLog();
+#define LOG(type, msg) MOZ_LOG(GetSpeechSynthLog(), type, msg)
+
+#define AUDIO_TRACK 1
+
+namespace mozilla {
+namespace dom {
+
+class SynthStreamListener : public MediaStreamListener
+{
+public:
+ explicit SynthStreamListener(nsSpeechTask* aSpeechTask,
+ MediaStream* aStream) :
+ mSpeechTask(aSpeechTask),
+ mStream(aStream),
+ mStarted(false)
+ {
+ }
+
+ void DoNotifyStarted()
+ {
+ if (mSpeechTask) {
+ mSpeechTask->DispatchStartInner();
+ }
+ }
+
+ void DoNotifyFinished()
+ {
+ if (mSpeechTask) {
+ mSpeechTask->DispatchEndInner(mSpeechTask->GetCurrentTime(),
+ mSpeechTask->GetCurrentCharOffset());
+ }
+ }
+
+ void NotifyEvent(MediaStreamGraph* aGraph,
+ MediaStreamGraphEvent event) override
+ {
+ switch (event) {
+ case MediaStreamGraphEvent::EVENT_FINISHED:
+ {
+ if (!mStarted) {
+ mStarted = true;
+ nsCOMPtr<nsIRunnable> startRunnable =
+ NewRunnableMethod(this, &SynthStreamListener::DoNotifyStarted);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(startRunnable.forget());
+ }
+
+ nsCOMPtr<nsIRunnable> endRunnable =
+ NewRunnableMethod(this, &SynthStreamListener::DoNotifyFinished);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(endRunnable.forget());
+ }
+ break;
+ case MediaStreamGraphEvent::EVENT_REMOVED:
+ mSpeechTask = nullptr;
+ // Dereference MediaStream to destroy safety
+ mStream = nullptr;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void NotifyBlockingChanged(MediaStreamGraph* aGraph, Blocking aBlocked) override
+ {
+ if (aBlocked == MediaStreamListener::UNBLOCKED && !mStarted) {
+ mStarted = true;
+ nsCOMPtr<nsIRunnable> event =
+ NewRunnableMethod(this, &SynthStreamListener::DoNotifyStarted);
+ aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
+ }
+ }
+
+private:
+ // Raw pointer; if we exist, the stream exists,
+ // and 'mSpeechTask' exclusively owns it and therefor exists as well.
+ nsSpeechTask* mSpeechTask;
+ // This is KungFuDeathGrip for MediaStream
+ RefPtr<MediaStream> mStream;
+
+ bool mStarted;
+};
+
+// nsSpeechTask
+
+NS_IMPL_CYCLE_COLLECTION(nsSpeechTask, mSpeechSynthesis, mUtterance, mCallback);
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSpeechTask)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechTask)
+ NS_INTERFACE_MAP_ENTRY(nsIAudioChannelAgentCallback)
+ NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTask)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(nsSpeechTask)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(nsSpeechTask)
+
+nsSpeechTask::nsSpeechTask(SpeechSynthesisUtterance* aUtterance)
+ : mUtterance(aUtterance)
+ , mInited(false)
+ , mPrePaused(false)
+ , mPreCanceled(false)
+ , mCallback(nullptr)
+ , mIndirectAudio(false)
+{
+ mText = aUtterance->mText;
+ mVolume = aUtterance->Volume();
+}
+
+nsSpeechTask::nsSpeechTask(float aVolume, const nsAString& aText)
+ : mUtterance(nullptr)
+ , mVolume(aVolume)
+ , mText(aText)
+ , mInited(false)
+ , mPrePaused(false)
+ , mPreCanceled(false)
+ , mCallback(nullptr)
+ , mIndirectAudio(false)
+{
+}
+
+nsSpeechTask::~nsSpeechTask()
+{
+ LOG(LogLevel::Debug, ("~nsSpeechTask"));
+ if (mStream) {
+ if (!mStream->IsDestroyed()) {
+ mStream->Destroy();
+ }
+
+ // This will finally destroyed by SynthStreamListener becasue
+ // MediaStream::Destroy() is async.
+ mStream = nullptr;
+ }
+
+ if (mPort) {
+ mPort->Destroy();
+ mPort = nullptr;
+ }
+}
+
+void
+nsSpeechTask::InitDirectAudio()
+{
+ mStream = MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER,
+ AudioChannel::Normal)->
+ CreateSourceStream();
+ mIndirectAudio = false;
+ mInited = true;
+}
+
+void
+nsSpeechTask::InitIndirectAudio()
+{
+ mIndirectAudio = true;
+ mInited = true;
+}
+
+void
+nsSpeechTask::SetChosenVoiceURI(const nsAString& aUri)
+{
+ mChosenVoiceURI = aUri;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::Setup(nsISpeechTaskCallback* aCallback,
+ uint32_t aChannels, uint32_t aRate, uint8_t argc)
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ LOG(LogLevel::Debug, ("nsSpeechTask::Setup"));
+
+ mCallback = aCallback;
+
+ if (mIndirectAudio) {
+ MOZ_ASSERT(!mStream);
+ if (argc > 0) {
+ NS_WARNING("Audio info arguments in Setup() are ignored for indirect audio services.");
+ }
+ return NS_OK;
+ }
+
+ // mStream is set up in Init() that should be called before this.
+ MOZ_ASSERT(mStream);
+
+ mStream->AddListener(new SynthStreamListener(this, mStream));
+
+ // XXX: Support more than one channel
+ if(NS_WARN_IF(!(aChannels == 1))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mChannels = aChannels;
+
+ AudioSegment* segment = new AudioSegment();
+ mStream->AddAudioTrack(AUDIO_TRACK, aRate, 0, segment);
+ mStream->AddAudioOutput(this);
+ mStream->SetAudioOutputVolume(this, mVolume);
+
+ return NS_OK;
+}
+
+static RefPtr<mozilla::SharedBuffer>
+makeSamples(int16_t* aData, uint32_t aDataLen)
+{
+ RefPtr<mozilla::SharedBuffer> samples =
+ SharedBuffer::Create(aDataLen * sizeof(int16_t));
+ int16_t* frames = static_cast<int16_t*>(samples->Data());
+
+ for (uint32_t i = 0; i < aDataLen; i++) {
+ frames[i] = aData[i];
+ }
+
+ return samples;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::SendAudio(JS::Handle<JS::Value> aData, JS::Handle<JS::Value> aLandmarks,
+ JSContext* aCx)
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ if(NS_WARN_IF(!(mStream))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(mStream->IsDestroyed())) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(!(mChannels))) {
+ return NS_ERROR_FAILURE;
+ }
+ if(NS_WARN_IF(!(aData.isObject()))) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
+ if (mIndirectAudio) {
+ NS_WARNING("Can't call SendAudio from an indirect audio speech service.");
+ return NS_ERROR_FAILURE;
+ }
+
+ JS::Rooted<JSObject*> darray(aCx, &aData.toObject());
+ JSAutoCompartment ac(aCx, darray);
+
+ JS::Rooted<JSObject*> tsrc(aCx, nullptr);
+
+ // Allow either Int16Array or plain JS Array
+ if (JS_IsInt16Array(darray)) {
+ tsrc = darray;
+ } else {
+ bool isArray;
+ if (!JS_IsArrayObject(aCx, darray, &isArray)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ if (isArray) {
+ tsrc = JS_NewInt16ArrayFromArray(aCx, darray);
+ }
+ }
+
+ if (!tsrc) {
+ return NS_ERROR_DOM_TYPE_MISMATCH_ERR;
+ }
+
+ uint32_t dataLen = JS_GetTypedArrayLength(tsrc);
+ RefPtr<mozilla::SharedBuffer> samples;
+ {
+ JS::AutoCheckCannotGC nogc;
+ bool isShared;
+ int16_t* data = JS_GetInt16ArrayData(tsrc, &isShared, nogc);
+ if (isShared) {
+ // Must opt in to using shared data.
+ return NS_ERROR_DOM_TYPE_MISMATCH_ERR;
+ }
+ samples = makeSamples(data, dataLen);
+ }
+ SendAudioImpl(samples, dataLen);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::SendAudioNative(int16_t* aData, uint32_t aDataLen)
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ if(NS_WARN_IF(!(mStream))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(mStream->IsDestroyed())) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(!(mChannels))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (mIndirectAudio) {
+ NS_WARNING("Can't call SendAudio from an indirect audio speech service.");
+ return NS_ERROR_FAILURE;
+ }
+
+ RefPtr<mozilla::SharedBuffer> samples = makeSamples(aData, aDataLen);
+ SendAudioImpl(samples, aDataLen);
+
+ return NS_OK;
+}
+
+void
+nsSpeechTask::SendAudioImpl(RefPtr<mozilla::SharedBuffer>& aSamples, uint32_t aDataLen)
+{
+ if (aDataLen == 0) {
+ mStream->EndAllTrackAndFinish();
+ return;
+ }
+
+ AudioSegment segment;
+ AutoTArray<const int16_t*, 1> channelData;
+ channelData.AppendElement(static_cast<int16_t*>(aSamples->Data()));
+ segment.AppendFrames(aSamples.forget(), channelData, aDataLen,
+ PRINCIPAL_HANDLE_NONE);
+ mStream->AppendToTrack(1, &segment);
+ mStream->AdvanceKnownTracksTime(STREAM_TIME_MAX);
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchStart()
+{
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchStart() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ return DispatchStartInner();
+}
+
+nsresult
+nsSpeechTask::DispatchStartInner()
+{
+ nsSynthVoiceRegistry::GetInstance()->SetIsSpeaking(true);
+ return DispatchStartImpl();
+}
+
+nsresult
+nsSpeechTask::DispatchStartImpl()
+{
+ return DispatchStartImpl(mChosenVoiceURI);
+}
+
+nsresult
+nsSpeechTask::DispatchStartImpl(const nsAString& aUri)
+{
+ LOG(LogLevel::Debug, ("nsSpeechTask::DispatchStart"));
+
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(!(mUtterance->mState == SpeechSynthesisUtterance::STATE_PENDING))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ CreateAudioChannelAgent();
+
+ mUtterance->mState = SpeechSynthesisUtterance::STATE_SPEAKING;
+ mUtterance->mChosenVoiceURI = aUri;
+ mUtterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("start"), 0, 0,
+ EmptyString());
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchEnd(float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchEnd() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ return DispatchEndInner(aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchEndInner(float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mPreCanceled) {
+ nsSynthVoiceRegistry::GetInstance()->SpeakNext();
+ }
+
+ return DispatchEndImpl(aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchEndImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ LOG(LogLevel::Debug, ("nsSpeechTask::DispatchEnd\n"));
+
+ DestroyAudioChannelAgent();
+
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(mUtterance->mState == SpeechSynthesisUtterance::STATE_ENDED)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ // XXX: This should not be here, but it prevents a crash in MSG.
+ if (mStream) {
+ mStream->Destroy();
+ }
+
+ RefPtr<SpeechSynthesisUtterance> utterance = mUtterance;
+
+ if (mSpeechSynthesis) {
+ mSpeechSynthesis->OnEnd(this);
+ }
+
+ if (utterance->mState == SpeechSynthesisUtterance::STATE_PENDING) {
+ utterance->mState = SpeechSynthesisUtterance::STATE_NONE;
+ } else {
+ utterance->mState = SpeechSynthesisUtterance::STATE_ENDED;
+ utterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("end"),
+ aCharIndex, aElapsedTime,
+ EmptyString());
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchPause(float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchPause() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ return DispatchPauseImpl(aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchPauseImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ LOG(LogLevel::Debug, ("nsSpeechTask::DispatchPause"));
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(mUtterance->mPaused)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(mUtterance->mState == SpeechSynthesisUtterance::STATE_ENDED)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mUtterance->mPaused = true;
+ if (mUtterance->mState == SpeechSynthesisUtterance::STATE_SPEAKING) {
+ mUtterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("pause"),
+ aCharIndex, aElapsedTime,
+ EmptyString());
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchResume(float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchResume() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ return DispatchResumeImpl(aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ LOG(LogLevel::Debug, ("nsSpeechTask::DispatchResume"));
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(!(mUtterance->mPaused))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(mUtterance->mState == SpeechSynthesisUtterance::STATE_ENDED)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mUtterance->mPaused = false;
+ if (mUtterance->mState == SpeechSynthesisUtterance::STATE_SPEAKING) {
+ mUtterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("resume"),
+ aCharIndex, aElapsedTime,
+ EmptyString());
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchError(float aElapsedTime, uint32_t aCharIndex)
+{
+ LOG(LogLevel::Debug, ("nsSpeechTask::DispatchError"));
+
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchError() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ if (!mPreCanceled) {
+ nsSynthVoiceRegistry::GetInstance()->SpeakNext();
+ }
+
+ return DispatchErrorImpl(aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchErrorImpl(float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(mUtterance->mState == SpeechSynthesisUtterance::STATE_ENDED)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ if (mSpeechSynthesis) {
+ mSpeechSynthesis->OnEnd(this);
+ }
+
+ mUtterance->mState = SpeechSynthesisUtterance::STATE_ENDED;
+ mUtterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("error"),
+ aCharIndex, aElapsedTime,
+ EmptyString());
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchBoundary(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchBoundary() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ return DispatchBoundaryImpl(aName, aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchBoundaryImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(!(mUtterance->mState == SpeechSynthesisUtterance::STATE_SPEAKING))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mUtterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("boundary"),
+ aCharIndex, aElapsedTime,
+ aName);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::DispatchMark(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex)
+{
+ if (!mIndirectAudio) {
+ NS_WARNING("Can't call DispatchMark() from a direct audio speech service");
+ return NS_ERROR_FAILURE;
+ }
+
+ return DispatchMarkImpl(aName, aElapsedTime, aCharIndex);
+}
+
+nsresult
+nsSpeechTask::DispatchMarkImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex)
+{
+ MOZ_ASSERT(mUtterance);
+ if(NS_WARN_IF(!(mUtterance->mState == SpeechSynthesisUtterance::STATE_SPEAKING))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mUtterance->DispatchSpeechSynthesisEvent(NS_LITERAL_STRING("mark"),
+ aCharIndex, aElapsedTime,
+ aName);
+ return NS_OK;
+}
+
+void
+nsSpeechTask::Pause()
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ if (mCallback) {
+ DebugOnly<nsresult> rv = mCallback->OnPause();
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Unable to call onPause() callback");
+ }
+
+ if (mStream) {
+ mStream->Suspend();
+ }
+
+ if (!mInited) {
+ mPrePaused = true;
+ }
+
+ if (!mIndirectAudio) {
+ DispatchPauseImpl(GetCurrentTime(), GetCurrentCharOffset());
+ }
+}
+
+void
+nsSpeechTask::Resume()
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ if (mCallback) {
+ DebugOnly<nsresult> rv = mCallback->OnResume();
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
+ "Unable to call onResume() callback");
+ }
+
+ if (mStream) {
+ mStream->Resume();
+ }
+
+ if (mPrePaused) {
+ mPrePaused = false;
+ nsSynthVoiceRegistry::GetInstance()->ResumeQueue();
+ }
+
+ if (!mIndirectAudio) {
+ DispatchResumeImpl(GetCurrentTime(), GetCurrentCharOffset());
+ }
+}
+
+void
+nsSpeechTask::Cancel()
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ LOG(LogLevel::Debug, ("nsSpeechTask::Cancel"));
+
+ if (mCallback) {
+ DebugOnly<nsresult> rv = mCallback->OnCancel();
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
+ "Unable to call onCancel() callback");
+ }
+
+ if (mStream) {
+ mStream->Suspend();
+ }
+
+ if (!mInited) {
+ mPreCanceled = true;
+ }
+
+ if (!mIndirectAudio) {
+ DispatchEndInner(GetCurrentTime(), GetCurrentCharOffset());
+ }
+}
+
+void
+nsSpeechTask::ForceEnd()
+{
+ if (mStream) {
+ mStream->Suspend();
+ }
+
+ if (!mInited) {
+ mPreCanceled = true;
+ }
+
+ DispatchEndInner(GetCurrentTime(), GetCurrentCharOffset());
+}
+
+float
+nsSpeechTask::GetCurrentTime()
+{
+ return mStream ? (float)(mStream->GetCurrentTime() / 1000000.0) : 0;
+}
+
+uint32_t
+nsSpeechTask::GetCurrentCharOffset()
+{
+ return mStream && mStream->IsFinished() ? mText.Length() : 0;
+}
+
+void
+nsSpeechTask::SetSpeechSynthesis(SpeechSynthesis* aSpeechSynthesis)
+{
+ mSpeechSynthesis = aSpeechSynthesis;
+}
+
+void
+nsSpeechTask::CreateAudioChannelAgent()
+{
+ if (!mUtterance) {
+ return;
+ }
+
+ if (mAudioChannelAgent) {
+ mAudioChannelAgent->NotifyStoppedPlaying();
+ }
+
+ mAudioChannelAgent = new AudioChannelAgent();
+ mAudioChannelAgent->InitWithWeakCallback(mUtterance->GetOwner(),
+ static_cast<int32_t>(AudioChannelService::GetDefaultAudioChannel()),
+ this);
+
+ AudioPlaybackConfig config;
+ nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config,
+ AudioChannelService::AudibleState::eAudible);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return;
+ }
+
+ WindowVolumeChanged(config.mVolume, config.mMuted);
+ WindowSuspendChanged(config.mSuspend);
+}
+
+void
+nsSpeechTask::DestroyAudioChannelAgent()
+{
+ if (mAudioChannelAgent) {
+ mAudioChannelAgent->NotifyStoppedPlaying();
+ mAudioChannelAgent = nullptr;
+ }
+}
+
+NS_IMETHODIMP
+nsSpeechTask::WindowVolumeChanged(float aVolume, bool aMuted)
+{
+ SetAudioOutputVolume(aMuted ? 0.0 : mVolume * aVolume);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::WindowSuspendChanged(nsSuspendedTypes aSuspend)
+{
+ if (!mUtterance) {
+ return NS_OK;
+ }
+
+ if (aSuspend == nsISuspendedTypes::NONE_SUSPENDED &&
+ mUtterance->mPaused) {
+ Resume();
+ } else if (aSuspend != nsISuspendedTypes::NONE_SUSPENDED &&
+ !mUtterance->mPaused) {
+ Pause();
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSpeechTask::WindowAudioCaptureChanged(bool aCapture)
+{
+ // This is not supported yet.
+ return NS_OK;
+}
+
+void
+nsSpeechTask::SetAudioOutputVolume(float aVolume)
+{
+ if (mStream && !mStream->IsDestroyed()) {
+ mStream->SetAudioOutputVolume(this, aVolume);
+ }
+ if (mIndirectAudio) {
+ mCallback->OnVolumeChanged(aVolume);
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/nsSpeechTask.h b/dom/media/webspeech/synth/nsSpeechTask.h
new file mode 100644
index 000000000..c2c5dba84
--- /dev/null
+++ b/dom/media/webspeech/synth/nsSpeechTask.h
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_nsSpeechTask_h
+#define mozilla_dom_nsSpeechTask_h
+
+#include "MediaStreamGraph.h"
+#include "SpeechSynthesisUtterance.h"
+#include "nsIAudioChannelAgent.h"
+#include "nsISpeechService.h"
+
+namespace mozilla {
+
+class SharedBuffer;
+
+namespace dom {
+
+class SpeechSynthesisUtterance;
+class SpeechSynthesis;
+class SynthStreamListener;
+
+class nsSpeechTask : public nsISpeechTask
+ , public nsIAudioChannelAgentCallback
+ , public nsSupportsWeakReference
+{
+ friend class SynthStreamListener;
+
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsSpeechTask, nsISpeechTask)
+
+ NS_DECL_NSISPEECHTASK
+ NS_DECL_NSIAUDIOCHANNELAGENTCALLBACK
+
+ explicit nsSpeechTask(SpeechSynthesisUtterance* aUtterance);
+ nsSpeechTask(float aVolume, const nsAString& aText);
+
+ virtual void Pause();
+
+ virtual void Resume();
+
+ virtual void Cancel();
+
+ virtual void ForceEnd();
+
+ float GetCurrentTime();
+
+ uint32_t GetCurrentCharOffset();
+
+ void SetSpeechSynthesis(SpeechSynthesis* aSpeechSynthesis);
+
+ void InitDirectAudio();
+ void InitIndirectAudio();
+
+ void SetChosenVoiceURI(const nsAString& aUri);
+
+ virtual void SetAudioOutputVolume(float aVolume);
+
+ bool IsPreCanceled()
+ {
+ return mPreCanceled;
+ };
+
+ bool IsPrePaused()
+ {
+ return mPrePaused;
+ }
+
+protected:
+ virtual ~nsSpeechTask();
+
+ nsresult DispatchStartImpl();
+
+ virtual nsresult DispatchStartImpl(const nsAString& aUri);
+
+ virtual nsresult DispatchEndImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ virtual nsresult DispatchPauseImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ virtual nsresult DispatchResumeImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ virtual nsresult DispatchErrorImpl(float aElapsedTime, uint32_t aCharIndex);
+
+ virtual nsresult DispatchBoundaryImpl(const nsAString& aName,
+ float aElapsedTime,
+ uint32_t aCharIndex);
+
+ virtual nsresult DispatchMarkImpl(const nsAString& aName,
+ float aElapsedTime, uint32_t aCharIndex);
+
+ RefPtr<SpeechSynthesisUtterance> mUtterance;
+
+ float mVolume;
+
+ nsString mText;
+
+ bool mInited;
+
+ bool mPrePaused;
+
+ bool mPreCanceled;
+
+private:
+ void End();
+
+ void SendAudioImpl(RefPtr<mozilla::SharedBuffer>& aSamples, uint32_t aDataLen);
+
+ nsresult DispatchStartInner();
+
+ nsresult DispatchEndInner(float aElapsedTime, uint32_t aCharIndex);
+
+ void CreateAudioChannelAgent();
+
+ void DestroyAudioChannelAgent();
+
+ RefPtr<SourceMediaStream> mStream;
+
+ RefPtr<MediaInputPort> mPort;
+
+ nsCOMPtr<nsISpeechTaskCallback> mCallback;
+
+ nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent;
+
+ uint32_t mChannels;
+
+ RefPtr<SpeechSynthesis> mSpeechSynthesis;
+
+ bool mIndirectAudio;
+
+ nsString mChosenVoiceURI;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp b/dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp
new file mode 100644
index 000000000..b593479e3
--- /dev/null
+++ b/dom/media/webspeech/synth/nsSynthVoiceRegistry.cpp
@@ -0,0 +1,835 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsILocaleService.h"
+#include "nsISpeechService.h"
+#include "nsServiceManagerUtils.h"
+#include "nsCategoryManagerUtils.h"
+
+#include "MediaPrefs.h"
+#include "SpeechSynthesisUtterance.h"
+#include "SpeechSynthesisVoice.h"
+#include "nsSynthVoiceRegistry.h"
+#include "nsSpeechTask.h"
+#include "AudioChannelService.h"
+
+#include "nsString.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/dom/ContentChild.h"
+#include "mozilla/dom/ContentParent.h"
+#include "mozilla/Unused.h"
+
+#include "SpeechSynthesisChild.h"
+#include "SpeechSynthesisParent.h"
+
+#undef LOG
+extern mozilla::LogModule* GetSpeechSynthLog();
+#define LOG(type, msg) MOZ_LOG(GetSpeechSynthLog(), type, msg)
+
+namespace {
+
+void
+GetAllSpeechSynthActors(InfallibleTArray<mozilla::dom::SpeechSynthesisParent*>& aActors)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ MOZ_ASSERT(aActors.IsEmpty());
+
+ AutoTArray<mozilla::dom::ContentParent*, 20> contentActors;
+ mozilla::dom::ContentParent::GetAll(contentActors);
+
+ for (uint32_t contentIndex = 0;
+ contentIndex < contentActors.Length();
+ ++contentIndex) {
+ MOZ_ASSERT(contentActors[contentIndex]);
+
+ AutoTArray<mozilla::dom::PSpeechSynthesisParent*, 5> speechsynthActors;
+ contentActors[contentIndex]->ManagedPSpeechSynthesisParent(speechsynthActors);
+
+ for (uint32_t speechsynthIndex = 0;
+ speechsynthIndex < speechsynthActors.Length();
+ ++speechsynthIndex) {
+ MOZ_ASSERT(speechsynthActors[speechsynthIndex]);
+
+ mozilla::dom::SpeechSynthesisParent* actor =
+ static_cast<mozilla::dom::SpeechSynthesisParent*>(speechsynthActors[speechsynthIndex]);
+ aActors.AppendElement(actor);
+ }
+ }
+}
+
+} // namespace
+
+namespace mozilla {
+namespace dom {
+
+// VoiceData
+
+class VoiceData final
+{
+private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~VoiceData() {}
+
+public:
+ VoiceData(nsISpeechService* aService, const nsAString& aUri,
+ const nsAString& aName, const nsAString& aLang,
+ bool aIsLocal, bool aQueuesUtterances)
+ : mService(aService)
+ , mUri(aUri)
+ , mName(aName)
+ , mLang(aLang)
+ , mIsLocal(aIsLocal)
+ , mIsQueued(aQueuesUtterances) {}
+
+ NS_INLINE_DECL_REFCOUNTING(VoiceData)
+
+ nsCOMPtr<nsISpeechService> mService;
+
+ nsString mUri;
+
+ nsString mName;
+
+ nsString mLang;
+
+ bool mIsLocal;
+
+ bool mIsQueued;
+};
+
+// GlobalQueueItem
+
+class GlobalQueueItem final
+{
+private:
+ // Private destructor, to discourage deletion outside of Release():
+ ~GlobalQueueItem() {}
+
+public:
+ GlobalQueueItem(VoiceData* aVoice, nsSpeechTask* aTask, const nsAString& aText,
+ const float& aVolume, const float& aRate, const float& aPitch)
+ : mVoice(aVoice)
+ , mTask(aTask)
+ , mText(aText)
+ , mVolume(aVolume)
+ , mRate(aRate)
+ , mPitch(aPitch) {}
+
+ NS_INLINE_DECL_REFCOUNTING(GlobalQueueItem)
+
+ RefPtr<VoiceData> mVoice;
+
+ RefPtr<nsSpeechTask> mTask;
+
+ nsString mText;
+
+ float mVolume;
+
+ float mRate;
+
+ float mPitch;
+
+ bool mIsLocal;
+};
+
+// nsSynthVoiceRegistry
+
+static StaticRefPtr<nsSynthVoiceRegistry> gSynthVoiceRegistry;
+
+NS_IMPL_ISUPPORTS(nsSynthVoiceRegistry, nsISynthVoiceRegistry)
+
+nsSynthVoiceRegistry::nsSynthVoiceRegistry()
+ : mSpeechSynthChild(nullptr)
+ , mUseGlobalQueue(false)
+ , mIsSpeaking(false)
+{
+ if (XRE_IsContentProcess()) {
+
+ mSpeechSynthChild = new SpeechSynthesisChild();
+ ContentChild::GetSingleton()->SendPSpeechSynthesisConstructor(mSpeechSynthChild);
+
+ InfallibleTArray<RemoteVoice> voices;
+ InfallibleTArray<nsString> defaults;
+ bool isSpeaking;
+
+ mSpeechSynthChild->SendReadVoicesAndState(&voices, &defaults, &isSpeaking);
+
+ for (uint32_t i = 0; i < voices.Length(); ++i) {
+ RemoteVoice voice = voices[i];
+ AddVoiceImpl(nullptr, voice.voiceURI(),
+ voice.name(), voice.lang(),
+ voice.localService(), voice.queued());
+ }
+
+ for (uint32_t i = 0; i < defaults.Length(); ++i) {
+ SetDefaultVoice(defaults[i], true);
+ }
+
+ mIsSpeaking = isSpeaking;
+ }
+}
+
+nsSynthVoiceRegistry::~nsSynthVoiceRegistry()
+{
+ LOG(LogLevel::Debug, ("~nsSynthVoiceRegistry"));
+
+ // mSpeechSynthChild's lifecycle is managed by the Content protocol.
+ mSpeechSynthChild = nullptr;
+
+ mUriVoiceMap.Clear();
+}
+
+nsSynthVoiceRegistry*
+nsSynthVoiceRegistry::GetInstance()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!gSynthVoiceRegistry) {
+ gSynthVoiceRegistry = new nsSynthVoiceRegistry();
+ if (XRE_IsParentProcess()) {
+ // Start up all speech synth services.
+ NS_CreateServicesFromCategory(NS_SPEECH_SYNTH_STARTED, nullptr,
+ NS_SPEECH_SYNTH_STARTED);
+ }
+ }
+
+ return gSynthVoiceRegistry;
+}
+
+already_AddRefed<nsSynthVoiceRegistry>
+nsSynthVoiceRegistry::GetInstanceForService()
+{
+ RefPtr<nsSynthVoiceRegistry> registry = GetInstance();
+
+ return registry.forget();
+}
+
+void
+nsSynthVoiceRegistry::Shutdown()
+{
+ LOG(LogLevel::Debug, ("[%s] nsSynthVoiceRegistry::Shutdown()",
+ (XRE_IsContentProcess()) ? "Content" : "Default"));
+ gSynthVoiceRegistry = nullptr;
+}
+
+void
+nsSynthVoiceRegistry::SendVoicesAndState(InfallibleTArray<RemoteVoice>* aVoices,
+ InfallibleTArray<nsString>* aDefaults,
+ bool* aIsSpeaking)
+{
+ for (uint32_t i=0; i < mVoices.Length(); ++i) {
+ RefPtr<VoiceData> voice = mVoices[i];
+
+ aVoices->AppendElement(RemoteVoice(voice->mUri, voice->mName, voice->mLang,
+ voice->mIsLocal, voice->mIsQueued));
+ }
+
+ for (uint32_t i=0; i < mDefaultVoices.Length(); ++i) {
+ aDefaults->AppendElement(mDefaultVoices[i]->mUri);
+ }
+
+ *aIsSpeaking = IsSpeaking();
+}
+
+void
+nsSynthVoiceRegistry::RecvRemoveVoice(const nsAString& aUri)
+{
+ // If we dont have a local instance of the registry yet, we will recieve current
+ // voices at contruction time.
+ if(!gSynthVoiceRegistry) {
+ return;
+ }
+
+ gSynthVoiceRegistry->RemoveVoice(nullptr, aUri);
+}
+
+void
+nsSynthVoiceRegistry::RecvAddVoice(const RemoteVoice& aVoice)
+{
+ // If we dont have a local instance of the registry yet, we will recieve current
+ // voices at contruction time.
+ if(!gSynthVoiceRegistry) {
+ return;
+ }
+
+ gSynthVoiceRegistry->AddVoiceImpl(nullptr, aVoice.voiceURI(),
+ aVoice.name(), aVoice.lang(),
+ aVoice.localService(), aVoice.queued());
+}
+
+void
+nsSynthVoiceRegistry::RecvSetDefaultVoice(const nsAString& aUri, bool aIsDefault)
+{
+ // If we dont have a local instance of the registry yet, we will recieve current
+ // voices at contruction time.
+ if(!gSynthVoiceRegistry) {
+ return;
+ }
+
+ gSynthVoiceRegistry->SetDefaultVoice(aUri, aIsDefault);
+}
+
+void
+nsSynthVoiceRegistry::RecvIsSpeakingChanged(bool aIsSpeaking)
+{
+ // If we dont have a local instance of the registry yet, we will get the
+ // speaking state on construction.
+ if(!gSynthVoiceRegistry) {
+ return;
+ }
+
+ gSynthVoiceRegistry->mIsSpeaking = aIsSpeaking;
+}
+
+void
+nsSynthVoiceRegistry::RecvNotifyVoicesChanged()
+{
+ // If we dont have a local instance of the registry yet, we don't care.
+ if(!gSynthVoiceRegistry) {
+ return;
+ }
+
+ gSynthVoiceRegistry->NotifyVoicesChanged();
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::AddVoice(nsISpeechService* aService,
+ const nsAString& aUri,
+ const nsAString& aName,
+ const nsAString& aLang,
+ bool aLocalService,
+ bool aQueuesUtterances)
+{
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::AddVoice uri='%s' name='%s' lang='%s' local=%s queued=%s",
+ NS_ConvertUTF16toUTF8(aUri).get(), NS_ConvertUTF16toUTF8(aName).get(),
+ NS_ConvertUTF16toUTF8(aLang).get(),
+ aLocalService ? "true" : "false",
+ aQueuesUtterances ? "true" : "false"));
+
+ if(NS_WARN_IF(XRE_IsContentProcess())) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ return AddVoiceImpl(aService, aUri, aName, aLang, aLocalService, aQueuesUtterances);
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::RemoveVoice(nsISpeechService* aService,
+ const nsAString& aUri)
+{
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::RemoveVoice uri='%s' (%s)",
+ NS_ConvertUTF16toUTF8(aUri).get(),
+ (XRE_IsContentProcess()) ? "child" : "parent"));
+
+ bool found = false;
+ VoiceData* retval = mUriVoiceMap.GetWeak(aUri, &found);
+
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ if(NS_WARN_IF(!(aService == retval->mService))) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
+ mVoices.RemoveElement(retval);
+ mDefaultVoices.RemoveElement(retval);
+ mUriVoiceMap.Remove(aUri);
+
+ if (retval->mIsQueued && !MediaPrefs::WebSpeechForceGlobal()) {
+ // Check if this is the last queued voice, and disable the global queue if
+ // it is.
+ bool queued = false;
+ for (uint32_t i = 0; i < mVoices.Length(); i++) {
+ VoiceData* voice = mVoices[i];
+ if (voice->mIsQueued) {
+ queued = true;
+ break;
+ }
+ }
+ if (!queued) {
+ mUseGlobalQueue = false;
+ }
+ }
+
+ nsTArray<SpeechSynthesisParent*> ssplist;
+ GetAllSpeechSynthActors(ssplist);
+
+ for (uint32_t i = 0; i < ssplist.Length(); ++i)
+ Unused << ssplist[i]->SendVoiceRemoved(nsString(aUri));
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::NotifyVoicesChanged()
+{
+ if (XRE_IsParentProcess()) {
+ nsTArray<SpeechSynthesisParent*> ssplist;
+ GetAllSpeechSynthActors(ssplist);
+
+ for (uint32_t i = 0; i < ssplist.Length(); ++i)
+ Unused << ssplist[i]->SendNotifyVoicesChanged();
+ }
+
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ if(NS_WARN_IF(!(obs))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ obs->NotifyObservers(nullptr, "synth-voices-changed", nullptr);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::SetDefaultVoice(const nsAString& aUri,
+ bool aIsDefault)
+{
+ bool found = false;
+ VoiceData* retval = mUriVoiceMap.GetWeak(aUri, &found);
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mDefaultVoices.RemoveElement(retval);
+
+ LOG(LogLevel::Debug, ("nsSynthVoiceRegistry::SetDefaultVoice %s %s",
+ NS_ConvertUTF16toUTF8(aUri).get(),
+ aIsDefault ? "true" : "false"));
+
+ if (aIsDefault) {
+ mDefaultVoices.AppendElement(retval);
+ }
+
+ if (XRE_IsParentProcess()) {
+ nsTArray<SpeechSynthesisParent*> ssplist;
+ GetAllSpeechSynthActors(ssplist);
+
+ for (uint32_t i = 0; i < ssplist.Length(); ++i) {
+ Unused << ssplist[i]->SendSetDefaultVoice(nsString(aUri), aIsDefault);
+ }
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::GetVoiceCount(uint32_t* aRetval)
+{
+ *aRetval = mVoices.Length();
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::GetVoice(uint32_t aIndex, nsAString& aRetval)
+{
+ if(NS_WARN_IF(!(aIndex < mVoices.Length()))) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
+ aRetval = mVoices[aIndex]->mUri;
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::IsDefaultVoice(const nsAString& aUri, bool* aRetval)
+{
+ bool found;
+ VoiceData* voice = mUriVoiceMap.GetWeak(aUri, &found);
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ for (int32_t i = mDefaultVoices.Length(); i > 0; ) {
+ VoiceData* defaultVoice = mDefaultVoices[--i];
+
+ if (voice->mLang.Equals(defaultVoice->mLang)) {
+ *aRetval = voice == defaultVoice;
+ return NS_OK;
+ }
+ }
+
+ *aRetval = false;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::IsLocalVoice(const nsAString& aUri, bool* aRetval)
+{
+ bool found;
+ VoiceData* voice = mUriVoiceMap.GetWeak(aUri, &found);
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ *aRetval = voice->mIsLocal;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::GetVoiceLang(const nsAString& aUri, nsAString& aRetval)
+{
+ bool found;
+ VoiceData* voice = mUriVoiceMap.GetWeak(aUri, &found);
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ aRetval = voice->mLang;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSynthVoiceRegistry::GetVoiceName(const nsAString& aUri, nsAString& aRetval)
+{
+ bool found;
+ VoiceData* voice = mUriVoiceMap.GetWeak(aUri, &found);
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ aRetval = voice->mName;
+ return NS_OK;
+}
+
+nsresult
+nsSynthVoiceRegistry::AddVoiceImpl(nsISpeechService* aService,
+ const nsAString& aUri,
+ const nsAString& aName,
+ const nsAString& aLang,
+ bool aLocalService,
+ bool aQueuesUtterances)
+{
+ bool found = false;
+ mUriVoiceMap.GetWeak(aUri, &found);
+ if(NS_WARN_IF(found)) {
+ return NS_ERROR_INVALID_ARG;
+ }
+
+ RefPtr<VoiceData> voice = new VoiceData(aService, aUri, aName, aLang,
+ aLocalService, aQueuesUtterances);
+
+ mVoices.AppendElement(voice);
+ mUriVoiceMap.Put(aUri, voice);
+ mUseGlobalQueue |= aQueuesUtterances;
+
+ nsTArray<SpeechSynthesisParent*> ssplist;
+ GetAllSpeechSynthActors(ssplist);
+
+ if (!ssplist.IsEmpty()) {
+ mozilla::dom::RemoteVoice ssvoice(nsString(aUri),
+ nsString(aName),
+ nsString(aLang),
+ aLocalService,
+ aQueuesUtterances);
+
+ for (uint32_t i = 0; i < ssplist.Length(); ++i) {
+ Unused << ssplist[i]->SendVoiceAdded(ssvoice);
+ }
+ }
+
+ return NS_OK;
+}
+
+bool
+nsSynthVoiceRegistry::FindVoiceByLang(const nsAString& aLang,
+ VoiceData** aRetval)
+{
+ nsAString::const_iterator dashPos, start, end;
+ aLang.BeginReading(start);
+ aLang.EndReading(end);
+
+ while (true) {
+ nsAutoString langPrefix(Substring(start, end));
+
+ for (int32_t i = mDefaultVoices.Length(); i > 0; ) {
+ VoiceData* voice = mDefaultVoices[--i];
+
+ if (StringBeginsWith(voice->mLang, langPrefix)) {
+ *aRetval = voice;
+ return true;
+ }
+ }
+
+ for (int32_t i = mVoices.Length(); i > 0; ) {
+ VoiceData* voice = mVoices[--i];
+
+ if (StringBeginsWith(voice->mLang, langPrefix)) {
+ *aRetval = voice;
+ return true;
+ }
+ }
+
+ dashPos = end;
+ end = start;
+
+ if (!RFindInReadable(NS_LITERAL_STRING("-"), end, dashPos)) {
+ break;
+ }
+ }
+
+ return false;
+}
+
+VoiceData*
+nsSynthVoiceRegistry::FindBestMatch(const nsAString& aUri,
+ const nsAString& aLang)
+{
+ if (mVoices.IsEmpty()) {
+ return nullptr;
+ }
+
+ bool found = false;
+ VoiceData* retval = mUriVoiceMap.GetWeak(aUri, &found);
+
+ if (found) {
+ LOG(LogLevel::Debug, ("nsSynthVoiceRegistry::FindBestMatch - Matched URI"));
+ return retval;
+ }
+
+ // Try finding a match for given voice.
+ if (!aLang.IsVoid() && !aLang.IsEmpty()) {
+ if (FindVoiceByLang(aLang, &retval)) {
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::FindBestMatch - Matched language (%s ~= %s)",
+ NS_ConvertUTF16toUTF8(aLang).get(),
+ NS_ConvertUTF16toUTF8(retval->mLang).get()));
+
+ return retval;
+ }
+ }
+
+ // Try UI language.
+ nsresult rv;
+ nsCOMPtr<nsILocaleService> localeService = do_GetService(NS_LOCALESERVICE_CONTRACTID, &rv);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return nullptr;
+ }
+
+ nsAutoString uiLang;
+ rv = localeService->GetLocaleComponentForUserAgent(uiLang);
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return nullptr;
+ }
+
+ if (FindVoiceByLang(uiLang, &retval)) {
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::FindBestMatch - Matched UI language (%s ~= %s)",
+ NS_ConvertUTF16toUTF8(uiLang).get(),
+ NS_ConvertUTF16toUTF8(retval->mLang).get()));
+
+ return retval;
+ }
+
+ // Try en-US, the language of locale "C"
+ if (FindVoiceByLang(NS_LITERAL_STRING("en-US"), &retval)) {
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::FindBestMatch - Matched C locale language (en-US ~= %s)",
+ NS_ConvertUTF16toUTF8(retval->mLang).get()));
+
+ return retval;
+ }
+
+ // The top default voice is better than nothing...
+ if (!mDefaultVoices.IsEmpty()) {
+ return mDefaultVoices.LastElement();
+ }
+
+ return nullptr;
+}
+
+already_AddRefed<nsSpeechTask>
+nsSynthVoiceRegistry::SpeakUtterance(SpeechSynthesisUtterance& aUtterance,
+ const nsAString& aDocLang)
+{
+ nsString lang = nsString(aUtterance.mLang.IsEmpty() ? aDocLang : aUtterance.mLang);
+ nsAutoString uri;
+
+ if (aUtterance.mVoice) {
+ aUtterance.mVoice->GetVoiceURI(uri);
+ }
+
+ // Get current audio volume to apply speech call
+ float volume = aUtterance.Volume();
+ RefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
+ if (service) {
+ if (nsCOMPtr<nsPIDOMWindowInner> topWindow = aUtterance.GetOwner()) {
+ // TODO : use audio channel agent, open new bug to fix it.
+ uint32_t channel = static_cast<uint32_t>(AudioChannelService::GetDefaultAudioChannel());
+ AudioPlaybackConfig config = service->GetMediaConfig(topWindow->GetOuterWindow(),
+ channel);
+ volume = config.mMuted ? 0.0f : config.mVolume * volume;
+ }
+ }
+
+ RefPtr<nsSpeechTask> task;
+ if (XRE_IsContentProcess()) {
+ task = new SpeechTaskChild(&aUtterance);
+ SpeechSynthesisRequestChild* actor =
+ new SpeechSynthesisRequestChild(static_cast<SpeechTaskChild*>(task.get()));
+ mSpeechSynthChild->SendPSpeechSynthesisRequestConstructor(actor,
+ aUtterance.mText,
+ lang,
+ uri,
+ volume,
+ aUtterance.Rate(),
+ aUtterance.Pitch());
+ } else {
+ task = new nsSpeechTask(&aUtterance);
+ Speak(aUtterance.mText, lang, uri,
+ volume, aUtterance.Rate(), aUtterance.Pitch(), task);
+ }
+
+ return task.forget();
+}
+
+void
+nsSynthVoiceRegistry::Speak(const nsAString& aText,
+ const nsAString& aLang,
+ const nsAString& aUri,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch,
+ nsSpeechTask* aTask)
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ VoiceData* voice = FindBestMatch(aUri, aLang);
+
+ if (!voice) {
+ NS_WARNING("No voices found.");
+ aTask->DispatchError(0, 0);
+ return;
+ }
+
+ aTask->SetChosenVoiceURI(voice->mUri);
+
+ if (mUseGlobalQueue || MediaPrefs::WebSpeechForceGlobal()) {
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::Speak queueing text='%s' lang='%s' uri='%s' rate=%f pitch=%f",
+ NS_ConvertUTF16toUTF8(aText).get(), NS_ConvertUTF16toUTF8(aLang).get(),
+ NS_ConvertUTF16toUTF8(aUri).get(), aRate, aPitch));
+ RefPtr<GlobalQueueItem> item = new GlobalQueueItem(voice, aTask, aText,
+ aVolume, aRate, aPitch);
+ mGlobalQueue.AppendElement(item);
+
+ if (mGlobalQueue.Length() == 1) {
+ SpeakImpl(item->mVoice, item->mTask, item->mText, item->mVolume, item->mRate,
+ item->mPitch);
+ }
+ } else {
+ SpeakImpl(voice, aTask, aText, aVolume, aRate, aPitch);
+ }
+}
+
+void
+nsSynthVoiceRegistry::SpeakNext()
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::SpeakNext %d", mGlobalQueue.IsEmpty()));
+
+ SetIsSpeaking(false);
+
+ if (mGlobalQueue.IsEmpty()) {
+ return;
+ }
+
+ mGlobalQueue.RemoveElementAt(0);
+
+ while (!mGlobalQueue.IsEmpty()) {
+ RefPtr<GlobalQueueItem> item = mGlobalQueue.ElementAt(0);
+ if (item->mTask->IsPreCanceled()) {
+ mGlobalQueue.RemoveElementAt(0);
+ continue;
+ }
+ if (!item->mTask->IsPrePaused()) {
+ SpeakImpl(item->mVoice, item->mTask, item->mText, item->mVolume,
+ item->mRate, item->mPitch);
+ }
+ break;
+ }
+}
+
+void
+nsSynthVoiceRegistry::ResumeQueue()
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::ResumeQueue %d", mGlobalQueue.IsEmpty()));
+
+ if (mGlobalQueue.IsEmpty()) {
+ return;
+ }
+
+ RefPtr<GlobalQueueItem> item = mGlobalQueue.ElementAt(0);
+ if (!item->mTask->IsPrePaused()) {
+ SpeakImpl(item->mVoice, item->mTask, item->mText, item->mVolume,
+ item->mRate, item->mPitch);
+ }
+}
+
+bool
+nsSynthVoiceRegistry::IsSpeaking()
+{
+ return mIsSpeaking;
+}
+
+void
+nsSynthVoiceRegistry::SetIsSpeaking(bool aIsSpeaking)
+{
+ MOZ_ASSERT(XRE_IsParentProcess());
+
+ // Only set to 'true' if global queue is enabled.
+ mIsSpeaking =
+ aIsSpeaking && (mUseGlobalQueue || MediaPrefs::WebSpeechForceGlobal());
+
+ nsTArray<SpeechSynthesisParent*> ssplist;
+ GetAllSpeechSynthActors(ssplist);
+ for (uint32_t i = 0; i < ssplist.Length(); ++i) {
+ Unused << ssplist[i]->SendIsSpeakingChanged(aIsSpeaking);
+ }
+}
+
+void
+nsSynthVoiceRegistry::SpeakImpl(VoiceData* aVoice,
+ nsSpeechTask* aTask,
+ const nsAString& aText,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch)
+{
+ LOG(LogLevel::Debug,
+ ("nsSynthVoiceRegistry::SpeakImpl queueing text='%s' uri='%s' rate=%f pitch=%f",
+ NS_ConvertUTF16toUTF8(aText).get(), NS_ConvertUTF16toUTF8(aVoice->mUri).get(),
+ aRate, aPitch));
+
+ SpeechServiceType serviceType;
+
+ DebugOnly<nsresult> rv = aVoice->mService->GetServiceType(&serviceType);
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to get speech service type");
+
+ if (serviceType == nsISpeechService::SERVICETYPE_INDIRECT_AUDIO) {
+ aTask->InitIndirectAudio();
+ } else {
+ aTask->InitDirectAudio();
+ }
+
+ if (NS_FAILED(aVoice->mService->Speak(aText, aVoice->mUri, aVolume, aRate,
+ aPitch, aTask))) {
+ if (serviceType == nsISpeechService::SERVICETYPE_INDIRECT_AUDIO) {
+ aTask->DispatchError(0, 0);
+ }
+ // XXX When using direct audio, no way to dispatch error
+ }
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/nsSynthVoiceRegistry.h b/dom/media/webspeech/synth/nsSynthVoiceRegistry.h
new file mode 100644
index 000000000..08e9dae7d
--- /dev/null
+++ b/dom/media/webspeech/synth/nsSynthVoiceRegistry.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_nsSynthVoiceRegistry_h
+#define mozilla_dom_nsSynthVoiceRegistry_h
+
+#include "nsISynthVoiceRegistry.h"
+#include "nsRefPtrHashtable.h"
+#include "nsTArray.h"
+#include "MediaStreamGraph.h"
+
+class nsISpeechService;
+
+namespace mozilla {
+namespace dom {
+
+class RemoteVoice;
+class SpeechSynthesisUtterance;
+class SpeechSynthesisChild;
+class nsSpeechTask;
+class VoiceData;
+class GlobalQueueItem;
+
+class nsSynthVoiceRegistry final : public nsISynthVoiceRegistry
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISYNTHVOICEREGISTRY
+
+ nsSynthVoiceRegistry();
+
+ already_AddRefed<nsSpeechTask> SpeakUtterance(SpeechSynthesisUtterance& aUtterance,
+ const nsAString& aDocLang);
+
+ void Speak(const nsAString& aText, const nsAString& aLang,
+ const nsAString& aUri, const float& aVolume, const float& aRate,
+ const float& aPitch, nsSpeechTask* aTask);
+
+ void SendVoicesAndState(InfallibleTArray<RemoteVoice>* aVoices,
+ InfallibleTArray<nsString>* aDefaults,
+ bool* aIsSpeaking);
+
+ void SpeakNext();
+
+ void ResumeQueue();
+
+ bool IsSpeaking();
+
+ void SetIsSpeaking(bool aIsSpeaking);
+
+ static nsSynthVoiceRegistry* GetInstance();
+
+ static already_AddRefed<nsSynthVoiceRegistry> GetInstanceForService();
+
+ static void RecvRemoveVoice(const nsAString& aUri);
+
+ static void RecvAddVoice(const RemoteVoice& aVoice);
+
+ static void RecvSetDefaultVoice(const nsAString& aUri, bool aIsDefault);
+
+ static void RecvIsSpeakingChanged(bool aIsSpeaking);
+
+ static void RecvNotifyVoicesChanged();
+
+ static void Shutdown();
+
+private:
+ virtual ~nsSynthVoiceRegistry();
+
+ VoiceData* FindBestMatch(const nsAString& aUri, const nsAString& lang);
+
+ bool FindVoiceByLang(const nsAString& aLang, VoiceData** aRetval);
+
+ nsresult AddVoiceImpl(nsISpeechService* aService,
+ const nsAString& aUri,
+ const nsAString& aName,
+ const nsAString& aLang,
+ bool aLocalService,
+ bool aQueuesUtterances);
+
+ void SpeakImpl(VoiceData* aVoice,
+ nsSpeechTask* aTask,
+ const nsAString& aText,
+ const float& aVolume,
+ const float& aRate,
+ const float& aPitch);
+
+ nsTArray<RefPtr<VoiceData>> mVoices;
+
+ nsTArray<RefPtr<VoiceData>> mDefaultVoices;
+
+ nsRefPtrHashtable<nsStringHashKey, VoiceData> mUriVoiceMap;
+
+ SpeechSynthesisChild* mSpeechSynthChild;
+
+ bool mUseGlobalQueue;
+
+ nsTArray<RefPtr<GlobalQueueItem>> mGlobalQueue;
+
+ bool mIsSpeaking;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/pico/PicoModule.cpp b/dom/media/webspeech/synth/pico/PicoModule.cpp
new file mode 100644
index 000000000..4d5b6fe07
--- /dev/null
+++ b/dom/media/webspeech/synth/pico/PicoModule.cpp
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ModuleUtils.h"
+#include "nsIClassInfoImpl.h"
+
+#ifdef MOZ_WEBRTC
+
+#include "nsPicoService.h"
+
+using namespace mozilla::dom;
+
+#define PICOSERVICE_CID \
+ {0x346c4fc8, 0x12fe, 0x459c, {0x81, 0x19, 0x9a, 0xa7, 0x73, 0x37, 0x7f, 0xf4}}
+
+#define PICOSERVICE_CONTRACTID "@mozilla.org/synthpico;1"
+
+// Defines nsPicoServiceConstructor
+NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsPicoService,
+ nsPicoService::GetInstanceForService)
+
+// Defines kPICOSERVICE_CID
+NS_DEFINE_NAMED_CID(PICOSERVICE_CID);
+
+static const mozilla::Module::CIDEntry kCIDs[] = {
+ { &kPICOSERVICE_CID, true, nullptr, nsPicoServiceConstructor },
+ { nullptr }
+};
+
+static const mozilla::Module::ContractIDEntry kContracts[] = {
+ { PICOSERVICE_CONTRACTID, &kPICOSERVICE_CID },
+ { nullptr }
+};
+
+static const mozilla::Module::CategoryEntry kCategories[] = {
+ { "profile-after-change", "Pico Speech Synth", PICOSERVICE_CONTRACTID },
+ { nullptr }
+};
+
+static void
+UnloadPicoModule()
+{
+ nsPicoService::Shutdown();
+}
+
+static const mozilla::Module kModule = {
+ mozilla::Module::kVersion,
+ kCIDs,
+ kContracts,
+ kCategories,
+ nullptr,
+ nullptr,
+ UnloadPicoModule
+};
+
+NSMODULE_DEFN(synthpico) = &kModule;
+#endif
diff --git a/dom/media/webspeech/synth/pico/moz.build b/dom/media/webspeech/synth/pico/moz.build
new file mode 100644
index 000000000..01ef30450
--- /dev/null
+++ b/dom/media/webspeech/synth/pico/moz.build
@@ -0,0 +1,13 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'nsPicoService.cpp',
+ 'PicoModule.cpp'
+]
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/webspeech/synth/pico/nsPicoService.cpp b/dom/media/webspeech/synth/pico/nsPicoService.cpp
new file mode 100644
index 000000000..c3cf812fc
--- /dev/null
+++ b/dom/media/webspeech/synth/pico/nsPicoService.cpp
@@ -0,0 +1,761 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.h"
+#include "nsPicoService.h"
+#include "nsPrintfCString.h"
+#include "nsIWeakReferenceUtils.h"
+#include "SharedBuffer.h"
+#include "nsISimpleEnumerator.h"
+
+#include "mozilla/dom/nsSynthVoiceRegistry.h"
+#include "mozilla/dom/nsSpeechTask.h"
+
+#include "nsIFile.h"
+#include "nsThreadUtils.h"
+#include "prenv.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/DebugOnly.h"
+#include <dlfcn.h>
+
+// Pico API constants
+
+// Size of memory allocated for pico engine and voice resources.
+// We only have one voice and its resources loaded at once, so this
+// should always be enough.
+#define PICO_MEM_SIZE 2500000
+
+// Max length of returned strings. Pico will never return longer strings,
+// so this amount should be good enough for preallocating.
+#define PICO_RETSTRINGSIZE 200
+
+// Max amount we want from a single call of pico_getData
+#define PICO_MAX_CHUNK_SIZE 128
+
+// Arbitrary name for loaded voice, it doesn't mean anything outside of Pico
+#define PICO_VOICE_NAME "pico"
+
+// Return status from pico_getData meaning there is more data in the pipeline
+// to get from more calls to pico_getData
+#define PICO_STEP_BUSY 201
+
+// For performing a "soft" reset between utterances. This is used when one
+// utterance is interrupted by a new one.
+#define PICO_RESET_SOFT 0x10
+
+// Currently, Pico only provides mono output.
+#define PICO_CHANNELS_NUM 1
+
+// Pico's sample rate is always 16000
+#define PICO_SAMPLE_RATE 16000
+
+// The path to the language files in Gonk
+#define GONK_PICO_LANG_PATH "/system/tts/lang_pico"
+
+namespace mozilla {
+namespace dom {
+
+StaticRefPtr<nsPicoService> nsPicoService::sSingleton;
+
+class PicoApi
+{
+public:
+
+ PicoApi() : mInitialized(false) {}
+
+ bool Init()
+ {
+ if (mInitialized) {
+ return true;
+ }
+
+ void* handle = dlopen("libttspico.so", RTLD_LAZY);
+
+ if (!handle) {
+ NS_WARNING("Failed to open libttspico.so, pico cannot run");
+ return false;
+ }
+
+ pico_initialize =
+ (pico_Status (*)(void*, uint32_t, pico_System*))dlsym(
+ handle, "pico_initialize");
+
+ pico_terminate =
+ (pico_Status (*)(pico_System*))dlsym(handle, "pico_terminate");
+
+ pico_getSystemStatusMessage =
+ (pico_Status (*)(pico_System, pico_Status, pico_Retstring))dlsym(
+ handle, "pico_getSystemStatusMessage");;
+
+ pico_loadResource =
+ (pico_Status (*)(pico_System, const char*, pico_Resource*))dlsym(
+ handle, "pico_loadResource");
+
+ pico_unloadResource =
+ (pico_Status (*)(pico_System, pico_Resource*))dlsym(
+ handle, "pico_unloadResource");
+
+ pico_getResourceName =
+ (pico_Status (*)(pico_System, pico_Resource, pico_Retstring))dlsym(
+ handle, "pico_getResourceName");
+
+ pico_createVoiceDefinition =
+ (pico_Status (*)(pico_System, const char*))dlsym(
+ handle, "pico_createVoiceDefinition");
+
+ pico_addResourceToVoiceDefinition =
+ (pico_Status (*)(pico_System, const char*, const char*))dlsym(
+ handle, "pico_addResourceToVoiceDefinition");
+
+ pico_releaseVoiceDefinition =
+ (pico_Status (*)(pico_System, const char*))dlsym(
+ handle, "pico_releaseVoiceDefinition");
+
+ pico_newEngine =
+ (pico_Status (*)(pico_System, const char*, pico_Engine*))dlsym(
+ handle, "pico_newEngine");
+
+ pico_disposeEngine =
+ (pico_Status (*)(pico_System, pico_Engine*))dlsym(
+ handle, "pico_disposeEngine");
+
+ pico_resetEngine =
+ (pico_Status (*)(pico_Engine, int32_t))dlsym(handle, "pico_resetEngine");
+
+ pico_putTextUtf8 =
+ (pico_Status (*)(pico_Engine, const char*, const int16_t, int16_t*))dlsym(
+ handle, "pico_putTextUtf8");
+
+ pico_getData =
+ (pico_Status (*)(pico_Engine, void*, int16_t, int16_t*, int16_t*))dlsym(
+ handle, "pico_getData");
+
+ mInitialized = true;
+ return true;
+ }
+
+ typedef signed int pico_Status;
+ typedef char pico_Retstring[PICO_RETSTRINGSIZE];
+
+ pico_Status (* pico_initialize)(void*, uint32_t, pico_System*);
+ pico_Status (* pico_terminate)(pico_System*);
+ pico_Status (* pico_getSystemStatusMessage)(
+ pico_System, pico_Status, pico_Retstring);
+
+ pico_Status (* pico_loadResource)(pico_System, const char*, pico_Resource*);
+ pico_Status (* pico_unloadResource)(pico_System, pico_Resource*);
+ pico_Status (* pico_getResourceName)(
+ pico_System, pico_Resource, pico_Retstring);
+ pico_Status (* pico_createVoiceDefinition)(pico_System, const char*);
+ pico_Status (* pico_addResourceToVoiceDefinition)(
+ pico_System, const char*, const char*);
+ pico_Status (* pico_releaseVoiceDefinition)(pico_System, const char*);
+ pico_Status (* pico_newEngine)(pico_System, const char*, pico_Engine*);
+ pico_Status (* pico_disposeEngine)(pico_System, pico_Engine*);
+
+ pico_Status (* pico_resetEngine)(pico_Engine, int32_t);
+ pico_Status (* pico_putTextUtf8)(
+ pico_Engine, const char*, const int16_t, int16_t*);
+ pico_Status (* pico_getData)(
+ pico_Engine, void*, const int16_t, int16_t*, int16_t*);
+
+private:
+
+ bool mInitialized;
+
+} sPicoApi;
+
+#define PICO_ENSURE_SUCCESS_VOID(_funcName, _status) \
+ if (_status < 0) { \
+ PicoApi::pico_Retstring message; \
+ sPicoApi.pico_getSystemStatusMessage( \
+ nsPicoService::sSingleton->mPicoSystem, _status, message); \
+ NS_WARNING( \
+ nsPrintfCString("Error running %s: %s", _funcName, message).get()); \
+ return; \
+ }
+
+#define PICO_ENSURE_SUCCESS(_funcName, _status, _rv) \
+ if (_status < 0) { \
+ PicoApi::pico_Retstring message; \
+ sPicoApi.pico_getSystemStatusMessage( \
+ nsPicoService::sSingleton->mPicoSystem, _status, message); \
+ NS_WARNING( \
+ nsPrintfCString("Error running %s: %s", _funcName, message).get()); \
+ return _rv; \
+ }
+
+class PicoVoice
+{
+public:
+
+ PicoVoice(const nsAString& aLanguage)
+ : mLanguage(aLanguage) {}
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PicoVoice)
+
+ // Voice language, in BCB-47 syntax
+ nsString mLanguage;
+
+ // Language resource file
+ nsCString mTaFile;
+
+ // Speaker resource file
+ nsCString mSgFile;
+
+private:
+ ~PicoVoice() {}
+};
+
+class PicoCallbackRunnable : public Runnable,
+ public nsISpeechTaskCallback
+{
+ friend class PicoSynthDataRunnable;
+
+public:
+ PicoCallbackRunnable(const nsAString& aText, PicoVoice* aVoice,
+ float aRate, float aPitch, nsISpeechTask* aTask,
+ nsPicoService* aService)
+ : mText(NS_ConvertUTF16toUTF8(aText))
+ , mRate(aRate)
+ , mPitch(aPitch)
+ , mFirstData(true)
+ , mTask(aTask)
+ , mVoice(aVoice)
+ , mService(aService) { }
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_NSISPEECHTASKCALLBACK
+
+ NS_IMETHOD Run() override;
+
+ bool IsCurrentTask() { return mService->mCurrentTask == mTask; }
+
+private:
+ ~PicoCallbackRunnable() { }
+
+ void DispatchSynthDataRunnable(already_AddRefed<SharedBuffer>&& aBuffer,
+ size_t aBufferSize);
+
+ nsCString mText;
+
+ float mRate;
+
+ float mPitch;
+
+ bool mFirstData;
+
+ // We use this pointer to compare it with the current service task.
+ // If they differ, this runnable should stop.
+ nsISpeechTask* mTask;
+
+ // We hold a strong reference to the service, which in turn holds
+ // a strong reference to this voice.
+ PicoVoice* mVoice;
+
+ // By holding a strong reference to the service we guarantee that it won't be
+ // destroyed before this runnable.
+ RefPtr<nsPicoService> mService;
+};
+
+NS_IMPL_ISUPPORTS_INHERITED(PicoCallbackRunnable, Runnable, nsISpeechTaskCallback)
+
+// Runnable
+
+NS_IMETHODIMP
+PicoCallbackRunnable::Run()
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ PicoApi::pico_Status status = 0;
+
+ if (mService->CurrentVoice() != mVoice) {
+ mService->LoadEngine(mVoice);
+ } else {
+ status = sPicoApi.pico_resetEngine(mService->mPicoEngine, PICO_RESET_SOFT);
+ PICO_ENSURE_SUCCESS("pico_unloadResource", status, NS_ERROR_FAILURE);
+ }
+
+ // Add SSML markup for pitch and rate. Pico uses a minimal parser,
+ // so no namespace is needed.
+ nsPrintfCString markedUpText(
+ "<pitch level=\"%0.0f\"><speed level=\"%0.0f\">%s</speed></pitch>",
+ std::min(std::max(50.0f, mPitch * 100), 200.0f),
+ std::min(std::max(20.0f, mRate * 100), 500.0f),
+ mText.get());
+
+ const char* text = markedUpText.get();
+ size_t buffer_size = 512, buffer_offset = 0;
+ RefPtr<SharedBuffer> buffer = SharedBuffer::Create(buffer_size);
+ int16_t text_offset = 0, bytes_recv = 0, bytes_sent = 0, out_data_type = 0;
+ int16_t text_remaining = markedUpText.Length() + 1;
+
+ // Run this loop while this is the current task
+ while (IsCurrentTask()) {
+ if (text_remaining) {
+ status = sPicoApi.pico_putTextUtf8(mService->mPicoEngine,
+ text + text_offset, text_remaining,
+ &bytes_sent);
+ PICO_ENSURE_SUCCESS("pico_putTextUtf8", status, NS_ERROR_FAILURE);
+ // XXX: End speech task on error
+ text_remaining -= bytes_sent;
+ text_offset += bytes_sent;
+ } else {
+ // If we already fed all the text to the engine, send a zero length buffer
+ // and quit.
+ DispatchSynthDataRunnable(already_AddRefed<SharedBuffer>(), 0);
+ break;
+ }
+
+ do {
+ // Run this loop while the result of getData is STEP_BUSY, when it finishes
+ // synthesizing audio for the given text, it returns STEP_IDLE. We then
+ // break to the outer loop and feed more text, if there is any left.
+ if (!IsCurrentTask()) {
+ // If the task has changed, quit.
+ break;
+ }
+
+ if (buffer_size - buffer_offset < PICO_MAX_CHUNK_SIZE) {
+ // The next audio chunk retrieved may be bigger than our buffer,
+ // so send the data and flush the buffer.
+ DispatchSynthDataRunnable(buffer.forget(), buffer_offset);
+ buffer_offset = 0;
+ buffer = SharedBuffer::Create(buffer_size);
+ }
+
+ status = sPicoApi.pico_getData(mService->mPicoEngine,
+ (uint8_t*)buffer->Data() + buffer_offset,
+ PICO_MAX_CHUNK_SIZE,
+ &bytes_recv, &out_data_type);
+ PICO_ENSURE_SUCCESS("pico_getData", status, NS_ERROR_FAILURE);
+ buffer_offset += bytes_recv;
+ } while (status == PICO_STEP_BUSY);
+ }
+
+ return NS_OK;
+}
+
+void
+PicoCallbackRunnable::DispatchSynthDataRunnable(
+ already_AddRefed<SharedBuffer>&& aBuffer, size_t aBufferSize)
+{
+ class PicoSynthDataRunnable final : public Runnable
+ {
+ public:
+ PicoSynthDataRunnable(already_AddRefed<SharedBuffer>& aBuffer,
+ size_t aBufferSize, bool aFirstData,
+ PicoCallbackRunnable* aCallback)
+ : mBuffer(aBuffer)
+ , mBufferSize(aBufferSize)
+ , mFirstData(aFirstData)
+ , mCallback(aCallback) {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mCallback->IsCurrentTask()) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ nsISpeechTask* task = mCallback->mTask;
+
+ if (mFirstData) {
+ task->Setup(mCallback, PICO_CHANNELS_NUM, PICO_SAMPLE_RATE, 2);
+ }
+
+ return task->SendAudioNative(
+ mBufferSize ? static_cast<short*>(mBuffer->Data()) : nullptr, mBufferSize / 2);
+ }
+
+ private:
+ RefPtr<SharedBuffer> mBuffer;
+
+ size_t mBufferSize;
+
+ bool mFirstData;
+
+ RefPtr<PicoCallbackRunnable> mCallback;
+ };
+
+ nsCOMPtr<nsIRunnable> sendEvent =
+ new PicoSynthDataRunnable(aBuffer, aBufferSize, mFirstData, this);
+ NS_DispatchToMainThread(sendEvent);
+ mFirstData = false;
+}
+
+// nsISpeechTaskCallback
+
+NS_IMETHODIMP
+PicoCallbackRunnable::OnPause()
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+PicoCallbackRunnable::OnResume()
+{
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+PicoCallbackRunnable::OnCancel()
+{
+ mService->mCurrentTask = nullptr;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+PicoCallbackRunnable::OnVolumeChanged(float aVolume)
+{
+ return NS_OK;
+}
+
+NS_INTERFACE_MAP_BEGIN(nsPicoService)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechService)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_ADDREF(nsPicoService)
+NS_IMPL_RELEASE(nsPicoService)
+
+nsPicoService::nsPicoService()
+ : mInitialized(false)
+ , mVoicesMonitor("nsPicoService::mVoices")
+ , mCurrentTask(nullptr)
+ , mPicoSystem(nullptr)
+ , mPicoEngine(nullptr)
+ , mSgResource(nullptr)
+ , mTaResource(nullptr)
+ , mPicoMemArea(nullptr)
+{
+}
+
+nsPicoService::~nsPicoService()
+{
+ // We don't worry about removing the voices because this gets
+ // destructed at shutdown along with the voice registry.
+ MonitorAutoLock autoLock(mVoicesMonitor);
+ mVoices.Clear();
+
+ if (mThread) {
+ mThread->Shutdown();
+ }
+
+ UnloadEngine();
+}
+
+// nsIObserver
+
+NS_IMETHODIMP
+nsPicoService::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if(NS_WARN_IF(!(!strcmp(aTopic, "profile-after-change")))) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ if (!Preferences::GetBool("media.webspeech.synth.enabled") ||
+ Preferences::GetBool("media.webspeech.synth.test")) {
+ return NS_OK;
+ }
+
+ DebugOnly<nsresult> rv = NS_NewNamedThread("Pico Worker", getter_AddRefs(mThread));
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ return mThread->Dispatch(
+ NewRunnableMethod(this, &nsPicoService::Init), NS_DISPATCH_NORMAL);
+}
+// nsISpeechService
+
+NS_IMETHODIMP
+nsPicoService::Speak(const nsAString& aText, const nsAString& aUri,
+ float aVolume, float aRate, float aPitch,
+ nsISpeechTask* aTask)
+{
+ if(NS_WARN_IF(!(mInitialized))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ MonitorAutoLock autoLock(mVoicesMonitor);
+ bool found = false;
+ PicoVoice* voice = mVoices.GetWeak(aUri, &found);
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ mCurrentTask = aTask;
+ RefPtr<PicoCallbackRunnable> cb = new PicoCallbackRunnable(aText, voice, aRate, aPitch, aTask, this);
+ return mThread->Dispatch(cb, NS_DISPATCH_NORMAL);
+}
+
+NS_IMETHODIMP
+nsPicoService::GetServiceType(SpeechServiceType* aServiceType)
+{
+ *aServiceType = nsISpeechService::SERVICETYPE_DIRECT_AUDIO;
+ return NS_OK;
+}
+
+// private methods
+
+void
+nsPicoService::Init()
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+ MOZ_ASSERT(!mInitialized);
+
+ if (!sPicoApi.Init()) {
+ NS_WARNING("Failed to initialize pico library");
+ return;
+ }
+
+ // Use environment variable, or default android/b2g path
+ nsAutoCString langPath(PR_GetEnv("PICO_LANG_PATH"));
+
+ if (langPath.IsEmpty()) {
+ langPath.AssignLiteral(GONK_PICO_LANG_PATH);
+ }
+
+ nsCOMPtr<nsIFile> voicesDir;
+ NS_NewNativeLocalFile(langPath, true, getter_AddRefs(voicesDir));
+
+ nsCOMPtr<nsISimpleEnumerator> dirIterator;
+ nsresult rv = voicesDir->GetDirectoryEntries(getter_AddRefs(dirIterator));
+
+ if (NS_FAILED(rv)) {
+ NS_WARNING(nsPrintfCString("Failed to get contents of directory: %s", langPath.get()).get());
+ return;
+ }
+
+ bool hasMoreElements = false;
+ rv = dirIterator->HasMoreElements(&hasMoreElements);
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+
+ MonitorAutoLock autoLock(mVoicesMonitor);
+
+ while (hasMoreElements && NS_SUCCEEDED(rv)) {
+ nsCOMPtr<nsISupports> supports;
+ rv = dirIterator->GetNext(getter_AddRefs(supports));
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+
+ nsCOMPtr<nsIFile> voiceFile = do_QueryInterface(supports);
+ MOZ_ASSERT(voiceFile);
+
+ nsAutoCString leafName;
+ voiceFile->GetNativeLeafName(leafName);
+
+ nsAutoString lang;
+
+ if (GetVoiceFileLanguage(leafName, lang)) {
+ nsAutoString uri;
+ uri.AssignLiteral("urn:moz-tts:pico:");
+ uri.Append(lang);
+
+ bool found = false;
+ PicoVoice* voice = mVoices.GetWeak(uri, &found);
+
+ if (!found) {
+ voice = new PicoVoice(lang);
+ mVoices.Put(uri, voice);
+ }
+
+ // Each voice consists of two lingware files: A language resource file,
+ // suffixed by _ta.bin, and a speaker resource file, suffixed by _sb.bin.
+ // We currently assume that there is a pair of files for each language.
+ if (StringEndsWith(leafName, NS_LITERAL_CSTRING("_ta.bin"))) {
+ rv = voiceFile->GetPersistentDescriptor(voice->mTaFile);
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ } else if (StringEndsWith(leafName, NS_LITERAL_CSTRING("_sg.bin"))) {
+ rv = voiceFile->GetPersistentDescriptor(voice->mSgFile);
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ }
+ }
+
+ rv = dirIterator->HasMoreElements(&hasMoreElements);
+ }
+
+ NS_DispatchToMainThread(NewRunnableMethod(this, &nsPicoService::RegisterVoices));
+}
+
+void
+nsPicoService::RegisterVoices()
+{
+ nsSynthVoiceRegistry* registry = nsSynthVoiceRegistry::GetInstance();
+
+ for (auto iter = mVoices.Iter(); !iter.Done(); iter.Next()) {
+ const nsAString& uri = iter.Key();
+ RefPtr<PicoVoice>& voice = iter.Data();
+
+ // If we are missing either a language or a voice resource, it is invalid.
+ if (voice->mTaFile.IsEmpty() || voice->mSgFile.IsEmpty()) {
+ iter.Remove();
+ continue;
+ }
+
+ nsAutoString name;
+ name.AssignLiteral("Pico ");
+ name.Append(voice->mLanguage);
+
+ // This service is multi-threaded and can handle more than one utterance at a
+ // time before previous utterances end. So, aQueuesUtterances == false
+ DebugOnly<nsresult> rv =
+ registry->AddVoice(this, uri, name, voice->mLanguage, true, false);
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to add voice");
+ }
+
+ mInitialized = true;
+}
+
+bool
+nsPicoService::GetVoiceFileLanguage(const nsACString& aFileName, nsAString& aLang)
+{
+ nsACString::const_iterator start, end;
+ aFileName.BeginReading(start);
+ aFileName.EndReading(end);
+
+ // The lingware filename syntax is language_(ta/sg).bin,
+ // we extract the language prefix here.
+ if (FindInReadable(NS_LITERAL_CSTRING("_"), start, end)) {
+ end = start;
+ aFileName.BeginReading(start);
+ aLang.Assign(NS_ConvertUTF8toUTF16(Substring(start, end)));
+ return true;
+ }
+
+ return false;
+}
+
+void
+nsPicoService::LoadEngine(PicoVoice* aVoice)
+{
+ PicoApi::pico_Status status = 0;
+
+ if (mPicoSystem) {
+ UnloadEngine();
+ }
+
+ if (!mPicoMemArea) {
+ mPicoMemArea = MakeUnique<uint8_t[]>(PICO_MEM_SIZE);
+ }
+
+ status = sPicoApi.pico_initialize(mPicoMemArea.get(),
+ PICO_MEM_SIZE, &mPicoSystem);
+ PICO_ENSURE_SUCCESS_VOID("pico_initialize", status);
+
+ status = sPicoApi.pico_loadResource(mPicoSystem, aVoice->mTaFile.get(), &mTaResource);
+ PICO_ENSURE_SUCCESS_VOID("pico_loadResource", status);
+
+ status = sPicoApi.pico_loadResource(mPicoSystem, aVoice->mSgFile.get(), &mSgResource);
+ PICO_ENSURE_SUCCESS_VOID("pico_loadResource", status);
+
+ status = sPicoApi.pico_createVoiceDefinition(mPicoSystem, PICO_VOICE_NAME);
+ PICO_ENSURE_SUCCESS_VOID("pico_createVoiceDefinition", status);
+
+ char taName[PICO_RETSTRINGSIZE];
+ status = sPicoApi.pico_getResourceName(mPicoSystem, mTaResource, taName);
+ PICO_ENSURE_SUCCESS_VOID("pico_getResourceName", status);
+
+ status = sPicoApi.pico_addResourceToVoiceDefinition(
+ mPicoSystem, PICO_VOICE_NAME, taName);
+ PICO_ENSURE_SUCCESS_VOID("pico_addResourceToVoiceDefinition", status);
+
+ char sgName[PICO_RETSTRINGSIZE];
+ status = sPicoApi.pico_getResourceName(mPicoSystem, mSgResource, sgName);
+ PICO_ENSURE_SUCCESS_VOID("pico_getResourceName", status);
+
+ status = sPicoApi.pico_addResourceToVoiceDefinition(
+ mPicoSystem, PICO_VOICE_NAME, sgName);
+ PICO_ENSURE_SUCCESS_VOID("pico_addResourceToVoiceDefinition", status);
+
+ status = sPicoApi.pico_newEngine(mPicoSystem, PICO_VOICE_NAME, &mPicoEngine);
+ PICO_ENSURE_SUCCESS_VOID("pico_newEngine", status);
+
+ if (sSingleton) {
+ sSingleton->mCurrentVoice = aVoice;
+ }
+}
+
+void
+nsPicoService::UnloadEngine()
+{
+ PicoApi::pico_Status status = 0;
+
+ if (mPicoEngine) {
+ status = sPicoApi.pico_disposeEngine(mPicoSystem, &mPicoEngine);
+ PICO_ENSURE_SUCCESS_VOID("pico_disposeEngine", status);
+ status = sPicoApi.pico_releaseVoiceDefinition(mPicoSystem, PICO_VOICE_NAME);
+ PICO_ENSURE_SUCCESS_VOID("pico_releaseVoiceDefinition", status);
+ mPicoEngine = nullptr;
+ }
+
+ if (mSgResource) {
+ status = sPicoApi.pico_unloadResource(mPicoSystem, &mSgResource);
+ PICO_ENSURE_SUCCESS_VOID("pico_unloadResource", status);
+ mSgResource = nullptr;
+ }
+
+ if (mTaResource) {
+ status = sPicoApi.pico_unloadResource(mPicoSystem, &mTaResource);
+ PICO_ENSURE_SUCCESS_VOID("pico_unloadResource", status);
+ mTaResource = nullptr;
+ }
+
+ if (mPicoSystem) {
+ status = sPicoApi.pico_terminate(&mPicoSystem);
+ PICO_ENSURE_SUCCESS_VOID("pico_terminate", status);
+ mPicoSystem = nullptr;
+ }
+}
+
+PicoVoice*
+nsPicoService::CurrentVoice()
+{
+ MOZ_ASSERT(!NS_IsMainThread());
+
+ return mCurrentVoice;
+}
+
+// static methods
+
+nsPicoService*
+nsPicoService::GetInstance()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!XRE_IsParentProcess()) {
+ MOZ_ASSERT(false, "nsPicoService can only be started on main gecko process");
+ return nullptr;
+ }
+
+ if (!sSingleton) {
+ sSingleton = new nsPicoService();
+ }
+
+ return sSingleton;
+}
+
+already_AddRefed<nsPicoService>
+nsPicoService::GetInstanceForService()
+{
+ RefPtr<nsPicoService> picoService = GetInstance();
+ return picoService.forget();
+}
+
+void
+nsPicoService::Shutdown()
+{
+ if (!sSingleton) {
+ return;
+ }
+
+ sSingleton->mCurrentTask = nullptr;
+
+ sSingleton = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/pico/nsPicoService.h b/dom/media/webspeech/synth/pico/nsPicoService.h
new file mode 100644
index 000000000..f47258d9d
--- /dev/null
+++ b/dom/media/webspeech/synth/pico/nsPicoService.h
@@ -0,0 +1,93 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsPicoService_h
+#define nsPicoService_h
+
+#include "mozilla/Mutex.h"
+#include "nsTArray.h"
+#include "nsIObserver.h"
+#include "nsIThread.h"
+#include "nsISpeechService.h"
+#include "nsRefPtrHashtable.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/Monitor.h"
+#include "mozilla/UniquePtr.h"
+
+namespace mozilla {
+namespace dom {
+
+class PicoVoice;
+class PicoCallbackRunnable;
+
+typedef void* pico_System;
+typedef void* pico_Resource;
+typedef void* pico_Engine;
+
+class nsPicoService : public nsIObserver,
+ public nsISpeechService
+{
+ friend class PicoCallbackRunnable;
+ friend class PicoInitRunnable;
+
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSISPEECHSERVICE
+ NS_DECL_NSIOBSERVER
+
+ nsPicoService();
+
+ static nsPicoService* GetInstance();
+
+ static already_AddRefed<nsPicoService> GetInstanceForService();
+
+ static void Shutdown();
+
+private:
+
+ virtual ~nsPicoService();
+
+ void Init();
+
+ void RegisterVoices();
+
+ bool GetVoiceFileLanguage(const nsACString& aFileName, nsAString& aLang);
+
+ void LoadEngine(PicoVoice* aVoice);
+
+ void UnloadEngine();
+
+ PicoVoice* CurrentVoice();
+
+ bool mInitialized;
+
+ nsCOMPtr<nsIThread> mThread;
+
+ nsRefPtrHashtable<nsStringHashKey, PicoVoice> mVoices;
+
+ Monitor mVoicesMonitor;
+
+ PicoVoice* mCurrentVoice;
+
+ Atomic<nsISpeechTask*> mCurrentTask;
+
+ pico_System mPicoSystem;
+
+ pico_Engine mPicoEngine;
+
+ pico_Resource mSgResource;
+
+ pico_Resource mTaResource;
+
+ mozilla::UniquePtr<uint8_t[]> mPicoMemArea;
+
+ static StaticRefPtr<nsPicoService> sSingleton;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/speechd/SpeechDispatcherModule.cpp b/dom/media/webspeech/synth/speechd/SpeechDispatcherModule.cpp
new file mode 100644
index 000000000..a7f7ad535
--- /dev/null
+++ b/dom/media/webspeech/synth/speechd/SpeechDispatcherModule.cpp
@@ -0,0 +1,56 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ModuleUtils.h"
+#include "nsIClassInfoImpl.h"
+#include "SpeechDispatcherService.h"
+
+using namespace mozilla::dom;
+
+#define SPEECHDISPATCHERSERVICE_CID \
+ {0x8817b1cf, 0x5ada, 0x43bf, {0xbd, 0x73, 0x60, 0x76, 0x57, 0x70, 0x3d, 0x0d}}
+
+#define SPEECHDISPATCHERSERVICE_CONTRACTID "@mozilla.org/synthspeechdispatcher;1"
+
+// Defines SpeechDispatcherServiceConstructor
+NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(SpeechDispatcherService,
+ SpeechDispatcherService::GetInstanceForService)
+
+// Defines kSPEECHDISPATCHERSERVICE_CID
+NS_DEFINE_NAMED_CID(SPEECHDISPATCHERSERVICE_CID);
+
+static const mozilla::Module::CIDEntry kCIDs[] = {
+ { &kSPEECHDISPATCHERSERVICE_CID, true, nullptr, SpeechDispatcherServiceConstructor },
+ { nullptr }
+};
+
+static const mozilla::Module::ContractIDEntry kContracts[] = {
+ { SPEECHDISPATCHERSERVICE_CONTRACTID, &kSPEECHDISPATCHERSERVICE_CID },
+ { nullptr }
+};
+
+static const mozilla::Module::CategoryEntry kCategories[] = {
+ { "speech-synth-started", "SpeechDispatcher Speech Synth", SPEECHDISPATCHERSERVICE_CONTRACTID },
+ { nullptr }
+};
+
+static void
+UnloadSpeechDispatcherModule()
+{
+ SpeechDispatcherService::Shutdown();
+}
+
+static const mozilla::Module kModule = {
+ mozilla::Module::kVersion,
+ kCIDs,
+ kContracts,
+ kCategories,
+ nullptr,
+ nullptr,
+ UnloadSpeechDispatcherModule
+};
+
+NSMODULE_DEFN(synthspeechdispatcher) = &kModule;
diff --git a/dom/media/webspeech/synth/speechd/SpeechDispatcherService.cpp b/dom/media/webspeech/synth/speechd/SpeechDispatcherService.cpp
new file mode 100644
index 000000000..77a8f7cd9
--- /dev/null
+++ b/dom/media/webspeech/synth/speechd/SpeechDispatcherService.cpp
@@ -0,0 +1,593 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "SpeechDispatcherService.h"
+
+#include "mozilla/dom/nsSpeechTask.h"
+#include "mozilla/dom/nsSynthVoiceRegistry.h"
+#include "mozilla/Preferences.h"
+#include "nsEscape.h"
+#include "nsISupports.h"
+#include "nsPrintfCString.h"
+#include "nsReadableUtils.h"
+#include "nsServiceManagerUtils.h"
+#include "nsThreadUtils.h"
+#include "prlink.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#define URI_PREFIX "urn:moz-tts:speechd:"
+
+#define MAX_RATE static_cast<float>(2.5)
+#define MIN_RATE static_cast<float>(0.5)
+
+// Some structures for libspeechd
+typedef enum {
+ SPD_EVENT_BEGIN,
+ SPD_EVENT_END,
+ SPD_EVENT_INDEX_MARK,
+ SPD_EVENT_CANCEL,
+ SPD_EVENT_PAUSE,
+ SPD_EVENT_RESUME
+} SPDNotificationType;
+
+typedef enum {
+ SPD_BEGIN = 1,
+ SPD_END = 2,
+ SPD_INDEX_MARKS = 4,
+ SPD_CANCEL = 8,
+ SPD_PAUSE = 16,
+ SPD_RESUME = 32,
+
+ SPD_ALL = 0x3f
+} SPDNotification;
+
+typedef enum {
+ SPD_MODE_SINGLE = 0,
+ SPD_MODE_THREADED = 1
+} SPDConnectionMode;
+
+typedef void (*SPDCallback) (size_t msg_id, size_t client_id,
+ SPDNotificationType state);
+
+typedef void (*SPDCallbackIM) (size_t msg_id, size_t client_id,
+ SPDNotificationType state, char* index_mark);
+
+struct SPDConnection
+{
+ SPDCallback callback_begin;
+ SPDCallback callback_end;
+ SPDCallback callback_cancel;
+ SPDCallback callback_pause;
+ SPDCallback callback_resume;
+ SPDCallbackIM callback_im;
+
+ /* partial, more private fields in structure */
+};
+
+struct SPDVoice
+{
+ char* name;
+ char* language;
+ char* variant;
+};
+
+typedef enum {
+ SPD_IMPORTANT = 1,
+ SPD_MESSAGE = 2,
+ SPD_TEXT = 3,
+ SPD_NOTIFICATION = 4,
+ SPD_PROGRESS = 5
+} SPDPriority;
+
+#define SPEECHD_FUNCTIONS \
+ FUNC(spd_open, SPDConnection*, (const char*, const char*, const char*, SPDConnectionMode)) \
+ FUNC(spd_close, void, (SPDConnection*)) \
+ FUNC(spd_list_synthesis_voices, SPDVoice**, (SPDConnection*)) \
+ FUNC(spd_say, int, (SPDConnection*, SPDPriority, const char*)) \
+ FUNC(spd_cancel, int, (SPDConnection*)) \
+ FUNC(spd_set_volume, int, (SPDConnection*, int)) \
+ FUNC(spd_set_voice_rate, int, (SPDConnection*, int)) \
+ FUNC(spd_set_voice_pitch, int, (SPDConnection*, int)) \
+ FUNC(spd_set_synthesis_voice, int, (SPDConnection*, const char*)) \
+ FUNC(spd_set_notification_on, int, (SPDConnection*, SPDNotification))
+
+#define FUNC(name, type, params) \
+ typedef type (*_##name##_fn) params; \
+ static _##name##_fn _##name;
+
+SPEECHD_FUNCTIONS
+
+#undef FUNC
+
+#define spd_open _spd_open
+#define spd_close _spd_close
+#define spd_list_synthesis_voices _spd_list_synthesis_voices
+#define spd_say _spd_say
+#define spd_cancel _spd_cancel
+#define spd_set_volume _spd_set_volume
+#define spd_set_voice_rate _spd_set_voice_rate
+#define spd_set_voice_pitch _spd_set_voice_pitch
+#define spd_set_synthesis_voice _spd_set_synthesis_voice
+#define spd_set_notification_on _spd_set_notification_on
+
+static PRLibrary* speechdLib = nullptr;
+
+typedef void (*nsSpeechDispatcherFunc)();
+struct nsSpeechDispatcherDynamicFunction
+{
+ const char* functionName;
+ nsSpeechDispatcherFunc* function;
+};
+
+namespace mozilla {
+namespace dom {
+
+StaticRefPtr<SpeechDispatcherService> SpeechDispatcherService::sSingleton;
+
+class SpeechDispatcherVoice
+{
+public:
+
+ SpeechDispatcherVoice(const nsAString& aName, const nsAString& aLanguage)
+ : mName(aName), mLanguage(aLanguage) {}
+
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SpeechDispatcherVoice)
+
+ // Voice name
+ nsString mName;
+
+ // Voice language, in BCP-47 syntax
+ nsString mLanguage;
+
+private:
+ ~SpeechDispatcherVoice() {}
+};
+
+
+class SpeechDispatcherCallback final : public nsISpeechTaskCallback
+{
+public:
+ SpeechDispatcherCallback(nsISpeechTask* aTask, SpeechDispatcherService* aService)
+ : mTask(aTask)
+ , mService(aService) {}
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(SpeechDispatcherCallback, nsISpeechTaskCallback)
+
+ NS_DECL_NSISPEECHTASKCALLBACK
+
+ bool OnSpeechEvent(SPDNotificationType state);
+
+private:
+ ~SpeechDispatcherCallback() { }
+
+ // This pointer is used to dispatch events
+ nsCOMPtr<nsISpeechTask> mTask;
+
+ // By holding a strong reference to the service we guarantee that it won't be
+ // destroyed before this runnable.
+ RefPtr<SpeechDispatcherService> mService;
+
+ TimeStamp mStartTime;
+};
+
+NS_IMPL_CYCLE_COLLECTION(SpeechDispatcherCallback, mTask);
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechDispatcherCallback)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechTaskCallback)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTaskCallback)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechDispatcherCallback)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechDispatcherCallback)
+
+NS_IMETHODIMP
+SpeechDispatcherCallback::OnPause()
+{
+ // XXX: Speech dispatcher does not pause immediately, but waits for the speech
+ // to reach an index mark so that it could resume from that offset.
+ // There is no support for word or sentence boundaries, so index marks would
+ // only occur in explicit SSML marks, and we don't support that yet.
+ // What in actuality happens, is that if you call spd_pause(), it will speak
+ // the utterance in its entirety, dispatch an end event, and then put speechd
+ // in a 'paused' state. Since it is after the utterance ended, we don't get
+ // that state change, and our speech api is in an unrecoverable state.
+ // So, since it is useless anyway, I am not implementing pause.
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SpeechDispatcherCallback::OnResume()
+{
+ // XXX: Unsupported, see OnPause().
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SpeechDispatcherCallback::OnCancel()
+{
+ if (spd_cancel(mService->mSpeechdClient) < 0) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SpeechDispatcherCallback::OnVolumeChanged(float aVolume)
+{
+ // XXX: This currently does not change the volume mid-utterance, but it
+ // doesn't do anything bad either. So we could put this here with the hopes
+ // that speechd supports this in the future.
+ if (spd_set_volume(mService->mSpeechdClient, static_cast<int>(aVolume * 100)) < 0) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return NS_OK;
+}
+
+bool
+SpeechDispatcherCallback::OnSpeechEvent(SPDNotificationType state)
+{
+ bool remove = false;
+
+ switch (state) {
+ case SPD_EVENT_BEGIN:
+ mStartTime = TimeStamp::Now();
+ mTask->DispatchStart();
+ break;
+
+ case SPD_EVENT_PAUSE:
+ mTask->DispatchPause((TimeStamp::Now() - mStartTime).ToSeconds(), 0);
+ break;
+
+ case SPD_EVENT_RESUME:
+ mTask->DispatchResume((TimeStamp::Now() - mStartTime).ToSeconds(), 0);
+ break;
+
+ case SPD_EVENT_CANCEL:
+ case SPD_EVENT_END:
+ mTask->DispatchEnd((TimeStamp::Now() - mStartTime).ToSeconds(), 0);
+ remove = true;
+ break;
+
+ case SPD_EVENT_INDEX_MARK:
+ // Not yet supported
+ break;
+
+ default:
+ break;
+ }
+
+ return remove;
+}
+
+static void
+speechd_cb(size_t msg_id, size_t client_id, SPDNotificationType state)
+{
+ SpeechDispatcherService* service = SpeechDispatcherService::GetInstance(false);
+
+ if (service) {
+ NS_DispatchToMainThread(
+ NewRunnableMethod<uint32_t, SPDNotificationType>(
+ service, &SpeechDispatcherService::EventNotify,
+ static_cast<uint32_t>(msg_id), state));
+ }
+}
+
+
+NS_INTERFACE_MAP_BEGIN(SpeechDispatcherService)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechService)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_ADDREF(SpeechDispatcherService)
+NS_IMPL_RELEASE(SpeechDispatcherService)
+
+SpeechDispatcherService::SpeechDispatcherService()
+ : mInitialized(false)
+ , mSpeechdClient(nullptr)
+{
+}
+
+void
+SpeechDispatcherService::Init()
+{
+ if (!Preferences::GetBool("media.webspeech.synth.enabled") ||
+ Preferences::GetBool("media.webspeech.synth.test")) {
+ return;
+ }
+
+ // While speech dispatcher has a "threaded" mode, only spd_say() is async.
+ // Since synchronous socket i/o could impact startup time, we do
+ // initialization in a separate thread.
+ DebugOnly<nsresult> rv = NS_NewNamedThread("speechd init",
+ getter_AddRefs(mInitThread));
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+ rv = mInitThread->Dispatch(
+ NewRunnableMethod(this, &SpeechDispatcherService::Setup), NS_DISPATCH_NORMAL);
+ MOZ_ASSERT(NS_SUCCEEDED(rv));
+}
+
+SpeechDispatcherService::~SpeechDispatcherService()
+{
+ if (mInitThread) {
+ mInitThread->Shutdown();
+ }
+
+ if (mSpeechdClient) {
+ spd_close(mSpeechdClient);
+ }
+}
+
+void
+SpeechDispatcherService::Setup()
+{
+#define FUNC(name, type, params) { #name, (nsSpeechDispatcherFunc *)&_##name },
+ static const nsSpeechDispatcherDynamicFunction kSpeechDispatcherSymbols[] = {
+ SPEECHD_FUNCTIONS
+ };
+#undef FUNC
+
+ MOZ_ASSERT(!mInitialized);
+
+ speechdLib = PR_LoadLibrary("libspeechd.so.2");
+
+ if (!speechdLib) {
+ NS_WARNING("Failed to load speechd library");
+ return;
+ }
+
+ if (!PR_FindFunctionSymbol(speechdLib, "spd_get_volume")) {
+ // There is no version getter function, so we rely on a symbol that was
+ // introduced in release 0.8.2 in order to check for ABI compatibility.
+ NS_WARNING("Unsupported version of speechd detected");
+ return;
+ }
+
+ for (uint32_t i = 0; i < ArrayLength(kSpeechDispatcherSymbols); i++) {
+ *kSpeechDispatcherSymbols[i].function =
+ PR_FindFunctionSymbol(speechdLib, kSpeechDispatcherSymbols[i].functionName);
+
+ if (!*kSpeechDispatcherSymbols[i].function) {
+ NS_WARNING(nsPrintfCString("Failed to find speechd symbol for'%s'",
+ kSpeechDispatcherSymbols[i].functionName).get());
+ return;
+ }
+ }
+
+ mSpeechdClient = spd_open("firefox", "web speech api", "who", SPD_MODE_THREADED);
+ if (!mSpeechdClient) {
+ NS_WARNING("Failed to call spd_open");
+ return;
+ }
+
+ // Get all the voices from sapi and register in the SynthVoiceRegistry
+ SPDVoice** list = spd_list_synthesis_voices(mSpeechdClient);
+
+ mSpeechdClient->callback_begin = speechd_cb;
+ mSpeechdClient->callback_end = speechd_cb;
+ mSpeechdClient->callback_cancel = speechd_cb;
+ mSpeechdClient->callback_pause = speechd_cb;
+ mSpeechdClient->callback_resume = speechd_cb;
+
+ spd_set_notification_on(mSpeechdClient, SPD_BEGIN);
+ spd_set_notification_on(mSpeechdClient, SPD_END);
+ spd_set_notification_on(mSpeechdClient, SPD_CANCEL);
+
+ if (list != NULL) {
+ for (int i = 0; list[i]; i++) {
+ nsAutoString uri;
+
+ uri.AssignLiteral(URI_PREFIX);
+ nsAutoCString name;
+ NS_EscapeURL(list[i]->name, -1, esc_OnlyNonASCII | esc_AlwaysCopy, name);
+ uri.Append(NS_ConvertUTF8toUTF16(name));;
+ uri.AppendLiteral("?");
+
+ nsAutoCString lang(list[i]->language);
+
+ if (strcmp(list[i]->variant, "none") != 0) {
+ // In speech dispatcher, the variant will usually be the locale subtag
+ // with another, non-standard suptag after it. We keep the first one
+ // and convert it to uppercase.
+ const char* v = list[i]->variant;
+ const char* hyphen = strchr(v, '-');
+ nsDependentCSubstring variant(v, hyphen ? hyphen - v : strlen(v));
+ ToUpperCase(variant);
+
+ // eSpeak uses UK which is not a valid region subtag in BCP47.
+ if (variant.Equals("UK")) {
+ variant.AssignLiteral("GB");
+ }
+
+ lang.AppendLiteral("-");
+ lang.Append(variant);
+ }
+
+ uri.Append(NS_ConvertUTF8toUTF16(lang));
+
+ mVoices.Put(uri, new SpeechDispatcherVoice(
+ NS_ConvertUTF8toUTF16(list[i]->name),
+ NS_ConvertUTF8toUTF16(lang)));
+ }
+ }
+
+ NS_DispatchToMainThread(NewRunnableMethod(this, &SpeechDispatcherService::RegisterVoices));
+
+ //mInitialized = true;
+}
+
+// private methods
+
+void
+SpeechDispatcherService::RegisterVoices()
+{
+ RefPtr<nsSynthVoiceRegistry> registry = nsSynthVoiceRegistry::GetInstance();
+ for (auto iter = mVoices.Iter(); !iter.Done(); iter.Next()) {
+ RefPtr<SpeechDispatcherVoice>& voice = iter.Data();
+
+ // This service can only speak one utterance at a time, so we set
+ // aQueuesUtterances to true in order to track global state and schedule
+ // access to this service.
+ DebugOnly<nsresult> rv =
+ registry->AddVoice(this, iter.Key(), voice->mName, voice->mLanguage,
+ voice->mName.EqualsLiteral("default"), true);
+
+ NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to add voice");
+ }
+
+ mInitThread->Shutdown();
+ mInitThread = nullptr;
+
+ mInitialized = true;
+
+ registry->NotifyVoicesChanged();
+}
+
+// nsIObserver
+
+NS_IMETHODIMP
+SpeechDispatcherService::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ return NS_OK;
+}
+
+// nsISpeechService
+
+// TODO: Support SSML
+NS_IMETHODIMP
+SpeechDispatcherService::Speak(const nsAString& aText, const nsAString& aUri,
+ float aVolume, float aRate, float aPitch,
+ nsISpeechTask* aTask)
+{
+ if (NS_WARN_IF(!mInitialized)) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ RefPtr<SpeechDispatcherCallback> callback =
+ new SpeechDispatcherCallback(aTask, this);
+
+ bool found = false;
+ SpeechDispatcherVoice* voice = mVoices.GetWeak(aUri, &found);
+
+ if(NS_WARN_IF(!(found))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ spd_set_synthesis_voice(mSpeechdClient,
+ NS_ConvertUTF16toUTF8(voice->mName).get());
+
+ // We provide a volume of 0.0 to 1.0, speech-dispatcher expects 0 - 100.
+ spd_set_volume(mSpeechdClient, static_cast<int>(aVolume * 100));
+
+ // aRate is a value of 0.1 (0.1x) to 10 (10x) with 1 (1x) being normal rate.
+ // speechd expects -100 to 100 with 0 being normal rate.
+ float rate = 0;
+ if (aRate > 1) {
+ // Each step to 100 is logarithmically distributed up to 2.5x.
+ rate = log10(std::min(aRate, MAX_RATE)) / log10(MAX_RATE) * 100;
+ } else if (aRate < 1) {
+ // Each step to -100 is logarithmically distributed down to 0.5x.
+ rate = log10(std::max(aRate, MIN_RATE)) / log10(MIN_RATE) * -100;
+ }
+
+ spd_set_voice_rate(mSpeechdClient, static_cast<int>(rate));
+
+ // We provide a pitch of 0 to 2 with 1 being the default.
+ // speech-dispatcher expects -100 to 100 with 0 being default.
+ spd_set_voice_pitch(mSpeechdClient, static_cast<int>((aPitch - 1) * 100));
+
+ // The last three parameters don't matter for an indirect service
+ nsresult rv = aTask->Setup(callback, 0, 0, 0);
+
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ if (aText.Length()) {
+ int msg_id = spd_say(
+ mSpeechdClient, SPD_MESSAGE, NS_ConvertUTF16toUTF8(aText).get());
+
+ if (msg_id < 0) {
+ return NS_ERROR_FAILURE;
+ }
+
+ mCallbacks.Put(msg_id, callback);
+ } else {
+ // Speech dispatcher does not work well with empty strings.
+ // In that case, don't send empty string to speechd,
+ // and just emulate a speechd start and end event.
+ NS_DispatchToMainThread(NewRunnableMethod<SPDNotificationType>(
+ callback, &SpeechDispatcherCallback::OnSpeechEvent, SPD_EVENT_BEGIN));
+
+ NS_DispatchToMainThread(NewRunnableMethod<SPDNotificationType>(
+ callback, &SpeechDispatcherCallback::OnSpeechEvent, SPD_EVENT_END));
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SpeechDispatcherService::GetServiceType(SpeechServiceType* aServiceType)
+{
+ *aServiceType = nsISpeechService::SERVICETYPE_INDIRECT_AUDIO;
+ return NS_OK;
+}
+
+SpeechDispatcherService*
+SpeechDispatcherService::GetInstance(bool create)
+{
+ if (XRE_GetProcessType() != GeckoProcessType_Default) {
+ MOZ_ASSERT(false,
+ "SpeechDispatcherService can only be started on main gecko process");
+ return nullptr;
+ }
+
+ if (!sSingleton && create) {
+ sSingleton = new SpeechDispatcherService();
+ sSingleton->Init();
+ }
+
+ return sSingleton;
+}
+
+already_AddRefed<SpeechDispatcherService>
+SpeechDispatcherService::GetInstanceForService()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ RefPtr<SpeechDispatcherService> sapiService = GetInstance();
+ return sapiService.forget();
+}
+
+void
+SpeechDispatcherService::EventNotify(uint32_t aMsgId, uint32_t aState)
+{
+ SpeechDispatcherCallback* callback = mCallbacks.GetWeak(aMsgId);
+
+ if (callback) {
+ if (callback->OnSpeechEvent((SPDNotificationType)aState)) {
+ mCallbacks.Remove(aMsgId);
+ }
+ }
+}
+
+void
+SpeechDispatcherService::Shutdown()
+{
+ if (!sSingleton) {
+ return;
+ }
+
+ sSingleton = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/speechd/SpeechDispatcherService.h b/dom/media/webspeech/synth/speechd/SpeechDispatcherService.h
new file mode 100644
index 000000000..07798ceda
--- /dev/null
+++ b/dom/media/webspeech/synth/speechd/SpeechDispatcherService.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SpeechDispatcherService_h
+#define mozilla_dom_SpeechDispatcherService_h
+
+#include "mozilla/StaticPtr.h"
+#include "nsIObserver.h"
+#include "nsISpeechService.h"
+#include "nsIThread.h"
+#include "nsRefPtrHashtable.h"
+#include "nsTArray.h"
+
+struct SPDConnection;
+
+namespace mozilla {
+namespace dom {
+
+class SpeechDispatcherCallback;
+class SpeechDispatcherVoice;
+
+class SpeechDispatcherService final : public nsIObserver,
+ public nsISpeechService
+{
+ friend class SpeechDispatcherCallback;
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+ NS_DECL_NSISPEECHSERVICE
+
+ SpeechDispatcherService();
+
+ void Init();
+
+ void Setup();
+
+ void EventNotify(uint32_t aMsgId, uint32_t aState);
+
+ static SpeechDispatcherService* GetInstance(bool create = true);
+ static already_AddRefed<SpeechDispatcherService> GetInstanceForService();
+
+ static void Shutdown();
+
+ static StaticRefPtr<SpeechDispatcherService> sSingleton;
+
+private:
+ virtual ~SpeechDispatcherService();
+
+ void RegisterVoices();
+
+ bool mInitialized;
+
+ SPDConnection* mSpeechdClient;
+
+ nsRefPtrHashtable<nsUint32HashKey, SpeechDispatcherCallback> mCallbacks;
+
+ nsCOMPtr<nsIThread> mInitThread;
+
+ nsRefPtrHashtable<nsStringHashKey, SpeechDispatcherVoice> mVoices;
+};
+
+} // namespace dom
+} // namespace mozilla
+#endif
diff --git a/dom/media/webspeech/synth/speechd/moz.build b/dom/media/webspeech/synth/speechd/moz.build
new file mode 100644
index 000000000..51d675c10
--- /dev/null
+++ b/dom/media/webspeech/synth/speechd/moz.build
@@ -0,0 +1,13 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'SpeechDispatcherModule.cpp',
+ 'SpeechDispatcherService.cpp'
+]
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/webspeech/synth/test/FakeSynthModule.cpp b/dom/media/webspeech/synth/test/FakeSynthModule.cpp
new file mode 100644
index 000000000..5621ab78a
--- /dev/null
+++ b/dom/media/webspeech/synth/test/FakeSynthModule.cpp
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ModuleUtils.h"
+#include "nsIClassInfoImpl.h"
+
+#include "nsFakeSynthServices.h"
+
+using namespace mozilla::dom;
+
+#define FAKESYNTHSERVICE_CID \
+ {0xe7d52d9e, 0xc148, 0x47d8, {0xab, 0x2a, 0x95, 0xd7, 0xf4, 0x0e, 0xa5, 0x3d}}
+
+#define FAKESYNTHSERVICE_CONTRACTID "@mozilla.org/fakesynth;1"
+
+// Defines nsFakeSynthServicesConstructor
+NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsFakeSynthServices,
+ nsFakeSynthServices::GetInstanceForService)
+
+// Defines kFAKESYNTHSERVICE_CID
+NS_DEFINE_NAMED_CID(FAKESYNTHSERVICE_CID);
+
+static const mozilla::Module::CIDEntry kCIDs[] = {
+ { &kFAKESYNTHSERVICE_CID, true, nullptr, nsFakeSynthServicesConstructor },
+ { nullptr }
+};
+
+static const mozilla::Module::ContractIDEntry kContracts[] = {
+ { FAKESYNTHSERVICE_CONTRACTID, &kFAKESYNTHSERVICE_CID },
+ { nullptr }
+};
+
+static const mozilla::Module::CategoryEntry kCategories[] = {
+ { "speech-synth-started", "Fake Speech Synth", FAKESYNTHSERVICE_CONTRACTID },
+ { nullptr }
+};
+
+static void
+UnloadFakeSynthmodule()
+{
+ nsFakeSynthServices::Shutdown();
+}
+
+static const mozilla::Module kModule = {
+ mozilla::Module::kVersion,
+ kCIDs,
+ kContracts,
+ kCategories,
+ nullptr,
+ nullptr,
+ UnloadFakeSynthmodule
+};
+
+NSMODULE_DEFN(fakesynth) = &kModule;
diff --git a/dom/media/webspeech/synth/test/common.js b/dom/media/webspeech/synth/test/common.js
new file mode 100644
index 000000000..0ce9ec51b
--- /dev/null
+++ b/dom/media/webspeech/synth/test/common.js
@@ -0,0 +1,91 @@
+function synthTestQueue(aTestArgs, aEndFunc) {
+ var utterances = [];
+ for (var i in aTestArgs) {
+ var uargs = aTestArgs[i][0];
+ var win = uargs.win || window;
+ var u = new win.SpeechSynthesisUtterance(uargs.text);
+
+ if (uargs.args) {
+ for (var attr in uargs.args)
+ u[attr] = uargs.args[attr];
+ }
+
+ function onend_handler(e) {
+ is(e.target, utterances.shift(), "Target matches utterances");
+ ok(!speechSynthesis.speaking, "speechSynthesis is not speaking.");
+
+ if (utterances.length) {
+ ok(speechSynthesis.pending, "other utterances queued");
+ } else {
+ ok(!speechSynthesis.pending, "queue is empty, nothing pending.");
+ if (aEndFunc)
+ aEndFunc();
+ }
+ }
+
+ u.addEventListener('start',
+ (function (expectedUri) {
+ return function (e) {
+ if (expectedUri) {
+ var chosenVoice = SpecialPowers.wrap(e).target.chosenVoiceURI;
+ is(chosenVoice, expectedUri, "Incorrect URI is used");
+ }
+ };
+ })(aTestArgs[i][1] ? aTestArgs[i][1].uri : null));
+
+ u.addEventListener('end', onend_handler);
+ u.addEventListener('error', onend_handler);
+
+ u.addEventListener('error',
+ (function (expectedError) {
+ return function onerror_handler(e) {
+ ok(expectedError, "Error in speech utterance '" + e.target.text + "'");
+ };
+ })(aTestArgs[i][1] ? aTestArgs[i][1].err : false));
+
+ utterances.push(u);
+ win.speechSynthesis.speak(u);
+ }
+
+ ok(!speechSynthesis.speaking, "speechSynthesis is not speaking yet.");
+ ok(speechSynthesis.pending, "speechSynthesis has an utterance queued.");
+}
+
+function loadFrame(frameId) {
+ return new Promise(function(resolve, reject) {
+ var frame = document.getElementById(frameId);
+ frame.addEventListener('load', function (e) {
+ frame.contentWindow.document.title = frameId;
+ resolve(frame);
+ });
+ frame.src = 'data:text/html,' + encodeURI('<html><head></head><body></body></html>');
+ });
+}
+
+function waitForVoices(win) {
+ return new Promise(resolve => {
+ function resolver() {
+ if (win.speechSynthesis.getVoices().length) {
+ win.speechSynthesis.removeEventListener('voiceschanged', resolver);
+ resolve();
+ }
+ }
+
+ win.speechSynthesis.addEventListener('voiceschanged', resolver);
+ resolver();
+ });
+}
+
+function loadSpeechTest(fileName, prefs, frameId="testFrame") {
+ loadFrame(frameId).then(frame => {
+ waitForVoices(frame.contentWindow).then(
+ () => document.getElementById("testFrame").src = fileName);
+ });
+}
+
+function testSynthState(win, expectedState) {
+ for (var attr in expectedState) {
+ is(win.speechSynthesis[attr], expectedState[attr],
+ win.document.title + ": '" + attr + '" does not match');
+ }
+} \ No newline at end of file
diff --git a/dom/media/webspeech/synth/test/file_bfcache_frame.html b/dom/media/webspeech/synth/test/file_bfcache_frame.html
new file mode 100644
index 000000000..c8663b7fb
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_bfcache_frame.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <script type="application/javascript">
+ var frameUnloaded = function() {
+ var u = new SpeechSynthesisUtterance('hi');
+ u.addEventListener('end', function () {
+ parent.ok(true, 'Successfully spoke utterance from new frame.');
+ parent.onDone();
+ });
+ speechSynthesis.speak(u);
+ }
+ addEventListener('pageshow', function onshow(evt) {
+ var u = new SpeechSynthesisUtterance('hello');
+ u.lang = 'it-IT-noend';
+ u.addEventListener('start', function() {
+ location =
+ 'data:text/html,<html><body onpageshow="' +
+ frameUnloaded.toSource() + '()"></body></html>';
+ });
+ speechSynthesis.speak(u);
+ });
+ </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_global_queue.html b/dom/media/webspeech/synth/test/file_global_queue.html
new file mode 100644
index 000000000..5d762c0d5
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_global_queue.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1188099
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1188099: Global queue should correctly schedule utterances</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ window.todo = parent.todo;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1188099">Mozilla Bug 1188099</a>
+<iframe id="frame1"></iframe>
+<iframe id="frame2"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+ Promise.all([loadFrame('frame1'), loadFrame('frame2')]).then(function ([frame1, frame2]) {
+ var win1 = frame1.contentWindow;
+ var win2 = frame2.contentWindow;
+ var utterance1 = new win1.SpeechSynthesisUtterance("hello, losers");
+ var utterance2 = new win1.SpeechSynthesisUtterance("hello, losers three");
+ var utterance3 = new win2.SpeechSynthesisUtterance("hello, losers too");
+ var eventOrder = ['start1', 'end1', 'start3', 'end3', 'start2', 'end2'];
+ utterance1.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start1', 'start1');
+ testSynthState(win1, { speaking: true, pending: true });
+ testSynthState(win2, { speaking: true, pending: true });
+ });
+ utterance1.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end1', 'end1');
+ });
+ utterance3.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start3', 'start3');
+ testSynthState(win1, { speaking: true, pending: true });
+ testSynthState(win2, { speaking: true, pending: false });
+ });
+ utterance3.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end3', 'end3');
+ });
+ utterance2.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start2', 'start2');
+ testSynthState(win1, { speaking: true, pending: false });
+ testSynthState(win2, { speaking: true, pending: false });
+ });
+ utterance2.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end2', 'end2');
+ testSynthState(win1, { speaking: false, pending: false });
+ testSynthState(win2, { speaking: false, pending: false });
+ SimpleTest.finish();
+ });
+ win1.speechSynthesis.speak(utterance1);
+ win1.speechSynthesis.speak(utterance2);
+ win2.speechSynthesis.speak(utterance3);
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_global_queue_cancel.html b/dom/media/webspeech/synth/test/file_global_queue_cancel.html
new file mode 100644
index 000000000..03b77ba2f
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_global_queue_cancel.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1188099
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1188099: Calling cancel() should work correctly with global queue</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ window.todo = parent.todo;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1188099">Mozilla Bug 1188099</a>
+<iframe id="frame1"></iframe>
+<iframe id="frame2"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+ Promise.all([loadFrame('frame1'), loadFrame('frame2')]).then(function ([frame1, frame2]) {
+ var win1 = frame1.contentWindow;
+ var win2 = frame2.contentWindow;
+
+ var utterance1 = new win1.SpeechSynthesisUtterance(
+ "u1: Donec ac nunc feugiat, posuere");
+ utterance1.lang = 'it-IT-noend';
+ var utterance2 = new win1.SpeechSynthesisUtterance("u2: hello, losers too");
+ utterance2.lang = 'it-IT-noend';
+ var utterance3 = new win1.SpeechSynthesisUtterance("u3: hello, losers three");
+
+ var utterance4 = new win2.SpeechSynthesisUtterance("u4: hello, losers same!");
+ utterance4.lang = 'it-IT-noend';
+ var utterance5 = new win2.SpeechSynthesisUtterance("u5: hello, losers too");
+ utterance5.lang = 'it-IT-noend';
+
+ var eventOrder = ['start1', 'end1', 'start2', 'end2'];
+ utterance1.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start1', 'start1');
+ testSynthState(win1, { speaking: true, pending: true });
+ testSynthState(win2, { speaking: true, pending: true });
+ win2.speechSynthesis.cancel();
+ SpecialPowers.wrap(win1.speechSynthesis).forceEnd();
+
+ });
+ utterance1.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end1', 'end1');
+ testSynthState(win1, { pending: true });
+ testSynthState(win2, { pending: false });
+ });
+ utterance2.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start2', 'start2');
+ testSynthState(win1, { speaking: true, pending: true });
+ testSynthState(win2, { speaking: true, pending: false });
+ win1.speechSynthesis.cancel();
+ });
+ utterance2.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end2', 'end2');
+ testSynthState(win1, { speaking: false, pending: false });
+ testSynthState(win2, { speaking: false, pending: false });
+ SimpleTest.finish();
+ });
+
+ function wrongUtterance(e) {
+ ok(false, 'This shall not be uttered: "' + e.target.text + '"');
+ }
+
+ utterance3.addEventListener('start', wrongUtterance);
+ utterance4.addEventListener('start', wrongUtterance);
+ utterance5.addEventListener('start', wrongUtterance);
+
+ win1.speechSynthesis.speak(utterance1);
+ win1.speechSynthesis.speak(utterance2);
+ win1.speechSynthesis.speak(utterance3);
+ win2.speechSynthesis.speak(utterance4);
+ win2.speechSynthesis.speak(utterance5);
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_global_queue_pause.html b/dom/media/webspeech/synth/test/file_global_queue_pause.html
new file mode 100644
index 000000000..7fd562133
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_global_queue_pause.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1188099
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1188099: Calling pause() should work correctly with global queue</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ window.todo = parent.todo;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1188099">Mozilla Bug 1188099</a>
+<iframe id="frame1"></iframe>
+<iframe id="frame2"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+ Promise.all([loadFrame('frame1'), loadFrame('frame2')]).then(function ([frame1, frame2]) {
+ var win1 = frame1.contentWindow;
+ var win2 = frame2.contentWindow;
+
+ var utterance1 = new win1.SpeechSynthesisUtterance("Speak utterance 1.");
+ utterance1.lang = 'it-IT-noend';
+ var utterance2 = new win2.SpeechSynthesisUtterance("Speak utterance 2.");
+ var utterance3 = new win1.SpeechSynthesisUtterance("Speak utterance 3.");
+ var utterance4 = new win2.SpeechSynthesisUtterance("Speak utterance 4.");
+ var eventOrder = ['start1', 'pause1', 'resume1', 'end1', 'start2', 'end2',
+ 'start4', 'end4', 'start3', 'end3'];
+
+ utterance1.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start1', 'start1');
+ win1.speechSynthesis.pause();
+ });
+ utterance1.addEventListener('pause', function(e) {
+ var expectedEvent = eventOrder.shift()
+ is(expectedEvent, 'pause1', 'pause1');
+ testSynthState(win1, { speaking: true, pending: false, paused: true});
+ testSynthState(win2, { speaking: true, pending: true, paused: false});
+
+ if (expectedEvent == 'pause1') {
+ win1.speechSynthesis.resume();
+ }
+ });
+ utterance1.addEventListener('resume', function(e) {
+ is(eventOrder.shift(), 'resume1', 'resume1');
+ testSynthState(win1, { speaking: true, pending: false, paused: false});
+ testSynthState(win2, { speaking: true, pending: true, paused: false});
+
+ win2.speechSynthesis.pause();
+
+ testSynthState(win1, { speaking: true, pending: false, paused: false});
+ // 1188099: currently, paused state is not gaurenteed to be immediate.
+ testSynthState(win2, { speaking: true, pending: true });
+
+ // We now make the utterance end.
+ SpecialPowers.wrap(win1.speechSynthesis).forceEnd();
+ });
+ utterance1.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end1', 'end1');
+ testSynthState(win1, { speaking: false, pending: false, paused: false});
+ testSynthState(win2, { speaking: false, pending: true, paused: true});
+
+ win2.speechSynthesis.resume();
+ });
+
+ utterance2.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start2', 'start2');
+ testSynthState(win1, { speaking: true, pending: false, paused: false});
+ testSynthState(win2, { speaking: true, pending: false, paused: false});
+ });
+ utterance2.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end2', 'end2');
+ testSynthState(win1, { speaking: false, pending: false, paused: false});
+ testSynthState(win2, { speaking: false, pending: false, paused: false});
+
+ win1.speechSynthesis.pause();
+
+ testSynthState(win1, { speaking: false, pending: false, paused: true});
+ testSynthState(win2, { speaking: false, pending: false, paused: false});
+
+ win1.speechSynthesis.speak(utterance3);
+ win2.speechSynthesis.speak(utterance4);
+
+ testSynthState(win1, { speaking: false, pending: true, paused: true});
+ testSynthState(win2, { speaking: false, pending: true, paused: false});
+ });
+
+ utterance4.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start4', 'start4');
+ testSynthState(win1, { speaking: true, pending: true, paused: true});
+ testSynthState(win2, { speaking: true, pending: false, paused: false});
+
+ win1.speechSynthesis.resume();
+ });
+ utterance4.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end4', 'end4');
+ testSynthState(win1, { speaking: false, pending: true, paused: false});
+ testSynthState(win2, { speaking: false, pending: false, paused: false});
+ });
+
+ utterance3.addEventListener('start', function(e) {
+ is(eventOrder.shift(), 'start3', 'start3');
+ testSynthState(win1, { speaking: true, pending: false, paused: false});
+ testSynthState(win2, { speaking: true, pending: false, paused: false});
+ });
+
+ utterance3.addEventListener('end', function(e) {
+ is(eventOrder.shift(), 'end3', 'end3');
+ testSynthState(win1, { speaking: false, pending: false, paused: false});
+ testSynthState(win2, { speaking: false, pending: false, paused: false});
+
+ SimpleTest.finish();
+ });
+
+ win1.speechSynthesis.speak(utterance1);
+ win2.speechSynthesis.speak(utterance2);
+ });
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_indirect_service_events.html b/dom/media/webspeech/synth/test/file_indirect_service_events.html
new file mode 100644
index 000000000..fb4e31244
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_indirect_service_events.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1155034
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1155034: Check that indirect audio services dispatch their own events</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1155034">Mozilla Bug 1155034</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1155034 **/
+
+function testFunc(done_cb) {
+ function test_with_events() {
+ info('test_with_events');
+ var utterance = new SpeechSynthesisUtterance("never end, callback events");
+ utterance.lang = 'it-IT-noend';
+
+ utterance.addEventListener('start', function(e) {
+ info('start test_with_events');
+ speechSynthesis.pause();
+ // Wait to see if we get some bad events we didn't expect.
+ });
+
+ utterance.addEventListener('pause', function(e) {
+ is(e.charIndex, 1, 'pause event charIndex matches service arguments');
+ is(e.elapsedTime, 1.5, 'pause event elapsedTime matches service arguments');
+ speechSynthesis.resume();
+ });
+
+ utterance.addEventListener('resume', function(e) {
+ is(e.charIndex, 1, 'resume event charIndex matches service arguments');
+ is(e.elapsedTime, 1.5, 'resume event elapsedTime matches service arguments');
+ speechSynthesis.cancel();
+ });
+
+ utterance.addEventListener('end', function(e) {
+ ok(e.charIndex, 1, 'resume event charIndex matches service arguments');
+ ok(e.elapsedTime, 1.5, 'end event elapsedTime matches service arguments');
+ test_no_events();
+ });
+
+ info('start speak');
+ speechSynthesis.speak(utterance);
+ }
+
+ function forbiddenEvent(e) {
+ ok(false, 'no "' + e.type + '" event was explicitly dispatched from the service')
+ }
+
+ function test_no_events() {
+ info('test_no_events');
+ var utterance = new SpeechSynthesisUtterance("never end");
+ utterance.lang = "it-IT-noevents-noend";
+ utterance.addEventListener('start', function(e) {
+ speechSynthesis.pause();
+ // Wait to see if we get some bad events we didn't expect.
+ setTimeout(function() {
+ ok(true, 'didn\'t get any unwanted events');
+ utterance.removeEventListener('end', forbiddenEvent);
+ SpecialPowers.wrap(speechSynthesis).forceEnd();
+ done_cb();
+ }, 1000);
+ });
+
+ utterance.addEventListener('pause', forbiddenEvent);
+ utterance.addEventListener('end', forbiddenEvent);
+
+ speechSynthesis.speak(utterance);
+ }
+
+ test_with_events();
+}
+
+// Run test with no global queue, and then run it with a global queue.
+testFunc(function() {
+ SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.force_global_queue', true]] }, function() {
+ testFunc(SimpleTest.finish)
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_setup.html b/dom/media/webspeech/synth/test/file_setup.html
new file mode 100644
index 000000000..4c1020505
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_setup.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=525444
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 525444: Web Speech API check all classes are present</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+ok(SpeechSynthesis, "SpeechSynthesis exists in global scope");
+ok(SpeechSynthesisVoice, "SpeechSynthesisVoice exists in global scope");
+ok(SpeechSynthesisErrorEvent, "SpeechSynthesisErrorEvent exists in global scope");
+ok(SpeechSynthesisEvent, "SpeechSynthesisEvent exists in global scope");
+
+// SpeechSynthesisUtterance is the only type that has a constructor
+// and writable properties
+ok(SpeechSynthesisUtterance, "SpeechSynthesisUtterance exists in global scope");
+var ssu = new SpeechSynthesisUtterance("hello world");
+is(typeof ssu, "object", "SpeechSynthesisUtterance instance is an object");
+is(ssu.text, "hello world", "SpeechSynthesisUtterance.text is correct");
+is(ssu.volume, 1, "SpeechSynthesisUtterance.volume default is correct");
+is(ssu.rate, 1, "SpeechSynthesisUtterance.rate default is correct");
+is(ssu.pitch, 1, "SpeechSynthesisUtterance.pitch default is correct");
+ssu.lang = "he-IL";
+ssu.volume = 0.5;
+ssu.rate = 2.0;
+ssu.pitch = 1.5;
+is(ssu.lang, "he-IL", "SpeechSynthesisUtterance.lang is correct");
+is(ssu.volume, 0.5, "SpeechSynthesisUtterance.volume is correct");
+is(ssu.rate, 2.0, "SpeechSynthesisUtterance.rate is correct");
+is(ssu.pitch, 1.5, "SpeechSynthesisUtterance.pitch is correct");
+
+// Assign a rate that is out of bounds
+ssu.rate = 20;
+is(ssu.rate, 10, "SpeechSynthesisUtterance.rate enforces max of 10");
+ssu.rate = 0;
+is(ssu.rate.toPrecision(1), "0.1", "SpeechSynthesisUtterance.rate enforces min of 0.1");
+
+// Assign a volume which is out of bounds
+ssu.volume = 2;
+is(ssu.volume, 1, "SpeechSynthesisUtterance.volume enforces max of 1");
+ssu.volume = -1;
+is(ssu.volume, 0, "SpeechSynthesisUtterance.volume enforces min of 0");
+
+// Assign a pitch which is out of bounds
+ssu.pitch = 2.1;
+is(ssu.pitch, 2, "SpeechSynthesisUtterance.pitch enforces max of 2");
+ssu.pitch = -1;
+is(ssu.pitch, 0, "SpeechSynthesisUtterance.pitch enforces min of 0");
+
+// Test for singleton instance hanging off of window.
+ok(speechSynthesis, "speechSynthesis exists in global scope");
+is(typeof speechSynthesis, "object", "speechSynthesis instance is an object");
+is(typeof speechSynthesis.speak, "function", "speechSynthesis.speak is a function");
+is(typeof speechSynthesis.cancel, "function", "speechSynthesis.cancel is a function");
+is(typeof speechSynthesis.pause, "function", "speechSynthesis.pause is a function");
+is(typeof speechSynthesis.resume, "function", "speechSynthesis.resume is a function");
+is(typeof speechSynthesis.getVoices, "function", "speechSynthesis.getVoices is a function");
+
+is(typeof speechSynthesis.pending, "boolean", "speechSynthesis.pending is a boolean");
+is(typeof speechSynthesis.speaking, "boolean", "speechSynthesis.speaking is a boolean");
+is(typeof speechSynthesis.paused, "boolean", "speechSynthesis.paused is a boolean");
+
+var voices1 = speechSynthesis.getVoices();
+var voices2 = speechSynthesis.getVoices();
+
+ok(voices1.length == voices2.length, "Voice count matches");
+
+for (var i in voices1) {
+ ok(voices1[i] == voices2[i], "Voice instance matches");
+}
+
+SimpleTest.finish();
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_speech_cancel.html b/dom/media/webspeech/synth/test/file_speech_cancel.html
new file mode 100644
index 000000000..2ab0e1d0a
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_speech_cancel.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1150315
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1150315: Check that successive cancel/speak calls work</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1150315">Mozilla Bug 1150315</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1150315 **/
+
+function testFunc(done_cb) {
+ var gotEndEvent = false;
+ // A long utterance that we will interrupt.
+ var utterance = new SpeechSynthesisUtterance("Donec ac nunc feugiat, posuere " +
+ "mauris id, pharetra velit. Donec fermentum orci nunc, sit amet maximus" +
+ "dui tincidunt ut. Sed ultricies ac nisi a laoreet. Proin interdum," +
+ "libero maximus hendrerit posuere, lorem risus egestas nisl, a" +
+ "ultricies massa justo eu nisi. Duis mattis nibh a ligula tincidunt" +
+ "tincidunt non eu erat. Sed bibendum varius vulputate. Cras leo magna," +
+ "ornare ac posuere vel, luctus id metus. Mauris nec quam ac augue" +
+ "consectetur bibendum. Integer a commodo tortor. Duis semper dolor eu" +
+ "facilisis facilisis. Etiam venenatis turpis est, quis tincidunt velit" +
+ "suscipit a. Cras semper orci in sapien rhoncus bibendum. Suspendisse" +
+ "eu ex lobortis, finibus enim in, condimentum quam. Maecenas eget dui" +
+ "ipsum. Aliquam tortor leo, interdum eget congue ut, tempor id elit.");
+ utterance.addEventListener('start', function(e) {
+ ok(true, 'start utterance 1');
+ speechSynthesis.cancel();
+ info('cancel!');
+ speechSynthesis.speak(utterance2);
+ info('speak??');
+ });
+
+ var utterance2 = new SpeechSynthesisUtterance("Proin ornare neque vitae " +
+ "risus mattis rutrum. Suspendisse a velit ut est convallis aliquet." +
+ "Nullam ante elit, malesuada vel luctus rutrum, ultricies nec libero." +
+ "Praesent eu iaculis orci. Sed nisl diam, sodales ac purus et," +
+ "volutpat interdum tortor. Nullam aliquam porta elit et maximus. Cras" +
+ "risus lectus, elementum vel sodales vel, ultricies eget lectus." +
+ "Curabitur velit lacus, mollis vel finibus et, molestie sit amet" +
+ "sapien. Proin vitae dolor ac augue posuere efficitur ac scelerisque" +
+ "diam. Nulla sed odio elit.");
+ utterance2.addEventListener('start', function() {
+ info('start');
+ speechSynthesis.cancel();
+ speechSynthesis.speak(utterance3);
+ });
+ utterance2.addEventListener('end', function(e) {
+ gotEndEvent = true;
+ });
+
+ var utterance3 = new SpeechSynthesisUtterance("Hello, world 3!");
+ utterance3.addEventListener('start', function() {
+ ok(gotEndEvent, "didn't get start event for this utterance");
+ });
+ utterance3.addEventListener('end', done_cb);
+
+ // Speak/cancel while paused (Bug 1187105)
+ speechSynthesis.pause();
+ speechSynthesis.speak(new SpeechSynthesisUtterance("hello."));
+ ok(speechSynthesis.pending, "paused speechSynthesis has an utterance queued.");
+ speechSynthesis.cancel();
+ ok(!speechSynthesis.pending, "paused speechSynthesis has no utterance queued.");
+ speechSynthesis.resume();
+
+ speechSynthesis.speak(utterance);
+ ok(!speechSynthesis.speaking, "speechSynthesis is not speaking yet.");
+ ok(speechSynthesis.pending, "speechSynthesis has an utterance queued.");
+}
+
+// Run test with no global queue, and then run it with a global queue.
+testFunc(function() {
+ SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.force_global_queue', true]] }, function() {
+ testFunc(SimpleTest.finish)
+ });
+});
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_speech_error.html b/dom/media/webspeech/synth/test/file_speech_error.html
new file mode 100644
index 000000000..b98ec2fac
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_speech_error.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1226015
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1226015</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1226015">Mozilla Bug 1226015</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1226015 **/
+
+function testFunc(done_cb) {
+ var utterance = new SpeechSynthesisUtterance();
+ utterance.lang = 'it-IT-failatstart';
+
+ speechSynthesis.speak(utterance);
+ speechSynthesis.cancel();
+
+ ok(true, "we didn't crash, that is good.")
+ SimpleTest.finish();
+}
+
+// Run test with no global queue, and then run it with a global queue.
+testFunc();
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_speech_queue.html b/dom/media/webspeech/synth/test/file_speech_queue.html
new file mode 100644
index 000000000..e308f35e5
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_speech_queue.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML>
+<html lang="en-US">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=525444
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 525444: Web Speech API, check speech synth queue</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=525444">Mozilla Bug 525444</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+// XXX: Rate and pitch are not tested.
+
+var langUriMap = {};
+
+for (var voice of speechSynthesis.getVoices()) {
+ langUriMap[voice.lang] = voice.voiceURI;
+ ok(true, voice.lang + ' ' + voice.voiceURI + ' ' + voice.default);
+ is(voice.default, voice.lang == 'en-JM', 'Only Jamaican voice should be default');
+}
+
+ok(langUriMap['en-JM'], 'No English-Jamaican voice');
+ok(langUriMap['en-GB'], 'No English-British voice');
+ok(langUriMap['en-CA'], 'No English-Canadian voice');
+ok(langUriMap['fr-CA'], 'No French-Canadian voice');
+ok(langUriMap['es-MX'], 'No Spanish-Mexican voice');
+ok(langUriMap['it-IT-fail'], 'No Failing Italian voice');
+
+function testFunc(done_cb) {
+ synthTestQueue(
+ [[{text: "Hello, world."},
+ { uri: langUriMap['en-JM'] }],
+ [{text: "Bonjour tout le monde .",
+ args: { lang: "fr", rate: 0.5, pitch: 0.75 }},
+ { uri: langUriMap['fr-CA'], rate: 0.5, pitch: 0.75}],
+ [{text: "How are you doing?", args: { lang: "en-GB" } },
+ { rate: 1, pitch: 1, uri: langUriMap['en-GB']}],
+ [{text: "Come stai?", args: { lang: "it-IT-fail" } },
+ { rate: 1, pitch: 1, uri: langUriMap['it-IT-fail'], err: true }],
+ [{text: "¡hasta mañana!", args: { lang: "es-MX" } },
+ { uri: langUriMap['es-MX'] }]],
+ function () {
+ var test_data = [];
+ var voices = speechSynthesis.getVoices();
+ for (var voice of voices) {
+ if (voice.voiceURI.indexOf('urn:moz-tts:fake-direct') < 0) {
+ continue;
+ }
+ test_data.push([{text: "Hello world", args: { voice: voice} },
+ {uri: voice.voiceURI}]);
+ }
+
+ synthTestQueue(test_data, done_cb);
+ });
+}
+
+// Run test with no global queue, and then run it with a global queue.
+testFunc(function() {
+ SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.force_global_queue', true]] }, function() {
+ testFunc(SimpleTest.finish)
+ });
+});
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/file_speech_simple.html b/dom/media/webspeech/synth/test/file_speech_simple.html
new file mode 100644
index 000000000..c3f240ccd
--- /dev/null
+++ b/dom/media/webspeech/synth/test/file_speech_simple.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295: Web Speech API check all classes are present</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.info = parent.info;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+ <script type="application/javascript" src="common.js"></script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+var gotStartEvent = false;
+var gotBoundaryEvent = false;
+var utterance = new SpeechSynthesisUtterance("Hello, world!");
+utterance.addEventListener('start', function(e) {
+ ok(speechSynthesis.speaking, "speechSynthesis is speaking.");
+ ok(!speechSynthesis.pending, "speechSynthesis has no other utterances queued.");
+ gotStartEvent = true;
+});
+
+utterance.addEventListener('end', function(e) {
+ ok(!speechSynthesis.speaking, "speechSynthesis is not speaking.");
+ ok(!speechSynthesis.pending, "speechSynthesis has no other utterances queued.");
+ ok(gotStartEvent, "Got 'start' event.");
+ info('end ' + e.elapsedTime);
+ SimpleTest.finish();
+});
+
+speechSynthesis.speak(utterance);
+ok(!speechSynthesis.speaking, "speechSynthesis is not speaking yet.");
+ok(speechSynthesis.pending, "speechSynthesis has an utterance queued.");
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/mochitest.ini b/dom/media/webspeech/synth/test/mochitest.ini
new file mode 100644
index 000000000..f27cd4e1b
--- /dev/null
+++ b/dom/media/webspeech/synth/test/mochitest.ini
@@ -0,0 +1,26 @@
+[DEFAULT]
+tags=msg
+subsuite = media
+support-files =
+ common.js
+ file_bfcache_frame.html
+ file_setup.html
+ file_speech_queue.html
+ file_speech_simple.html
+ file_speech_cancel.html
+ file_speech_error.html
+ file_indirect_service_events.html
+ file_global_queue.html
+ file_global_queue_cancel.html
+ file_global_queue_pause.html
+
+[test_setup.html]
+[test_speech_queue.html]
+[test_speech_simple.html]
+[test_speech_cancel.html]
+[test_speech_error.html]
+[test_indirect_service_events.html]
+[test_global_queue.html]
+[test_global_queue_cancel.html]
+[test_global_queue_pause.html]
+[test_bfcache.html]
diff --git a/dom/media/webspeech/synth/test/nsFakeSynthServices.cpp b/dom/media/webspeech/synth/test/nsFakeSynthServices.cpp
new file mode 100644
index 000000000..582ff3551
--- /dev/null
+++ b/dom/media/webspeech/synth/test/nsFakeSynthServices.cpp
@@ -0,0 +1,401 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.h"
+#include "nsFakeSynthServices.h"
+#include "nsPrintfCString.h"
+#include "nsIWeakReferenceUtils.h"
+#include "SharedBuffer.h"
+#include "nsISimpleEnumerator.h"
+
+#include "mozilla/dom/nsSynthVoiceRegistry.h"
+#include "mozilla/dom/nsSpeechTask.h"
+
+#include "nsThreadUtils.h"
+#include "prenv.h"
+#include "mozilla/Preferences.h"
+#include "mozilla/DebugOnly.h"
+
+#define CHANNELS 1
+#define SAMPLERATE 1600
+
+namespace mozilla {
+namespace dom {
+
+StaticRefPtr<nsFakeSynthServices> nsFakeSynthServices::sSingleton;
+
+enum VoiceFlags
+{
+ eSuppressEvents = 1,
+ eSuppressEnd = 2,
+ eFailAtStart = 4,
+ eFail = 8
+};
+
+struct VoiceDetails
+{
+ const char* uri;
+ const char* name;
+ const char* lang;
+ bool defaultVoice;
+ uint32_t flags;
+};
+
+static const VoiceDetails sDirectVoices[] = {
+ {"urn:moz-tts:fake-direct:bob", "Bob Marley", "en-JM", true, 0},
+ {"urn:moz-tts:fake-direct:amy", "Amy Winehouse", "en-GB", false, 0},
+ {"urn:moz-tts:fake-direct:lenny", "Leonard Cohen", "en-CA", false, 0},
+ {"urn:moz-tts:fake-direct:celine", "Celine Dion", "fr-CA", false, 0},
+ {"urn:moz-tts:fake-direct:julie", "Julieta Venegas", "es-MX", false, },
+};
+
+static const VoiceDetails sIndirectVoices[] = {
+ {"urn:moz-tts:fake-indirect:zanetta", "Zanetta Farussi", "it-IT", false, 0},
+ {"urn:moz-tts:fake-indirect:margherita", "Margherita Durastanti", "it-IT-noevents-noend", false, eSuppressEvents | eSuppressEnd},
+ {"urn:moz-tts:fake-indirect:teresa", "Teresa Cornelys", "it-IT-noend", false, eSuppressEnd},
+ {"urn:moz-tts:fake-indirect:cecilia", "Cecilia Bartoli", "it-IT-failatstart", false, eFailAtStart},
+ {"urn:moz-tts:fake-indirect:gottardo", "Gottardo Aldighieri", "it-IT-fail", false, eFail},
+};
+
+// FakeSynthCallback
+class FakeSynthCallback : public nsISpeechTaskCallback
+{
+public:
+ explicit FakeSynthCallback(nsISpeechTask* aTask) : mTask(aTask) { }
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(FakeSynthCallback, nsISpeechTaskCallback)
+
+ NS_IMETHOD OnPause() override
+ {
+ if (mTask) {
+ mTask->DispatchPause(1.5, 1);
+ }
+
+ return NS_OK;
+ }
+
+ NS_IMETHOD OnResume() override
+ {
+ if (mTask) {
+ mTask->DispatchResume(1.5, 1);
+ }
+
+ return NS_OK;
+ }
+
+ NS_IMETHOD OnCancel() override
+ {
+ if (mTask) {
+ mTask->DispatchEnd(1.5, 1);
+ }
+
+ return NS_OK;
+ }
+
+ NS_IMETHOD OnVolumeChanged(float aVolume) override
+ {
+ return NS_OK;
+ }
+
+private:
+ virtual ~FakeSynthCallback() { }
+
+ nsCOMPtr<nsISpeechTask> mTask;
+};
+
+NS_IMPL_CYCLE_COLLECTION(FakeSynthCallback, mTask);
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(FakeSynthCallback)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechTaskCallback)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTaskCallback)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(FakeSynthCallback)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(FakeSynthCallback)
+
+// FakeDirectAudioSynth
+
+class FakeDirectAudioSynth : public nsISpeechService
+{
+
+public:
+ FakeDirectAudioSynth() { }
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISPEECHSERVICE
+
+private:
+ virtual ~FakeDirectAudioSynth() { }
+};
+
+NS_IMPL_ISUPPORTS(FakeDirectAudioSynth, nsISpeechService)
+
+NS_IMETHODIMP
+FakeDirectAudioSynth::Speak(const nsAString& aText, const nsAString& aUri,
+ float aVolume, float aRate, float aPitch,
+ nsISpeechTask* aTask)
+{
+ class Runnable final : public mozilla::Runnable
+ {
+ public:
+ Runnable(nsISpeechTask* aTask, const nsAString& aText) :
+ mTask(aTask), mText(aText)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ RefPtr<FakeSynthCallback> cb = new FakeSynthCallback(nullptr);
+ mTask->Setup(cb, CHANNELS, SAMPLERATE, 2);
+
+ // Just an arbitrary multiplier. Pretend that each character is
+ // synthesized to 40 frames.
+ uint32_t frames_length = 40 * mText.Length();
+ auto frames = MakeUnique<int16_t[]>(frames_length);
+ mTask->SendAudioNative(frames.get(), frames_length);
+
+ mTask->SendAudioNative(nullptr, 0);
+
+ return NS_OK;
+ }
+
+ private:
+ nsCOMPtr<nsISpeechTask> mTask;
+ nsString mText;
+ };
+
+ nsCOMPtr<nsIRunnable> runnable = new Runnable(aTask, aText);
+ NS_DispatchToMainThread(runnable);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeDirectAudioSynth::GetServiceType(SpeechServiceType* aServiceType)
+{
+ *aServiceType = nsISpeechService::SERVICETYPE_DIRECT_AUDIO;
+ return NS_OK;
+}
+
+// FakeDirectAudioSynth
+
+class FakeIndirectAudioSynth : public nsISpeechService
+{
+
+public:
+ FakeIndirectAudioSynth() {}
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISPEECHSERVICE
+
+private:
+ virtual ~FakeIndirectAudioSynth() { }
+};
+
+NS_IMPL_ISUPPORTS(FakeIndirectAudioSynth, nsISpeechService)
+
+NS_IMETHODIMP
+FakeIndirectAudioSynth::Speak(const nsAString& aText, const nsAString& aUri,
+ float aVolume, float aRate, float aPitch,
+ nsISpeechTask* aTask)
+{
+ class DispatchStart final : public Runnable
+ {
+ public:
+ explicit DispatchStart(nsISpeechTask* aTask) :
+ mTask(aTask)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ mTask->DispatchStart();
+
+ return NS_OK;
+ }
+
+ private:
+ nsCOMPtr<nsISpeechTask> mTask;
+ };
+
+ class DispatchEnd final : public Runnable
+ {
+ public:
+ DispatchEnd(nsISpeechTask* aTask, const nsAString& aText) :
+ mTask(aTask), mText(aText)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ mTask->DispatchEnd(mText.Length()/2, mText.Length());
+
+ return NS_OK;
+ }
+
+ private:
+ nsCOMPtr<nsISpeechTask> mTask;
+ nsString mText;
+ };
+
+ class DispatchError final : public Runnable
+ {
+ public:
+ DispatchError(nsISpeechTask* aTask, const nsAString& aText) :
+ mTask(aTask), mText(aText)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ mTask->DispatchError(mText.Length()/2, mText.Length());
+
+ return NS_OK;
+ }
+
+ private:
+ nsCOMPtr<nsISpeechTask> mTask;
+ nsString mText;
+ };
+
+ uint32_t flags = 0;
+ for (uint32_t i = 0; i < ArrayLength(sIndirectVoices); i++) {
+ if (aUri.EqualsASCII(sIndirectVoices[i].uri)) {
+ flags = sIndirectVoices[i].flags;
+ }
+ }
+
+ if (flags & eFailAtStart) {
+ return NS_ERROR_FAILURE;
+ }
+
+ RefPtr<FakeSynthCallback> cb = new FakeSynthCallback(
+ (flags & eSuppressEvents) ? nullptr : aTask);
+
+ aTask->Setup(cb, 0, 0, 0);
+
+ nsCOMPtr<nsIRunnable> runnable = new DispatchStart(aTask);
+ NS_DispatchToMainThread(runnable);
+
+ if (flags & eFail) {
+ runnable = new DispatchError(aTask, aText);
+ NS_DispatchToMainThread(runnable);
+ } else if ((flags & eSuppressEnd) == 0) {
+ runnable = new DispatchEnd(aTask, aText);
+ NS_DispatchToMainThread(runnable);
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+FakeIndirectAudioSynth::GetServiceType(SpeechServiceType* aServiceType)
+{
+ *aServiceType = nsISpeechService::SERVICETYPE_INDIRECT_AUDIO;
+ return NS_OK;
+}
+
+// nsFakeSynthService
+
+NS_INTERFACE_MAP_BEGIN(nsFakeSynthServices)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_ADDREF(nsFakeSynthServices)
+NS_IMPL_RELEASE(nsFakeSynthServices)
+
+nsFakeSynthServices::nsFakeSynthServices()
+{
+}
+
+nsFakeSynthServices::~nsFakeSynthServices()
+{
+}
+
+static void
+AddVoices(nsISpeechService* aService, const VoiceDetails* aVoices, uint32_t aLength)
+{
+ RefPtr<nsSynthVoiceRegistry> registry = nsSynthVoiceRegistry::GetInstance();
+ for (uint32_t i = 0; i < aLength; i++) {
+ NS_ConvertUTF8toUTF16 name(aVoices[i].name);
+ NS_ConvertUTF8toUTF16 uri(aVoices[i].uri);
+ NS_ConvertUTF8toUTF16 lang(aVoices[i].lang);
+ // These services can handle more than one utterance at a time and have
+ // several speaking simultaniously. So, aQueuesUtterances == false
+ registry->AddVoice(aService, uri, name, lang, true, false);
+ if (aVoices[i].defaultVoice) {
+ registry->SetDefaultVoice(uri, true);
+ }
+ }
+
+ registry->NotifyVoicesChanged();
+}
+
+void
+nsFakeSynthServices::Init()
+{
+ mDirectService = new FakeDirectAudioSynth();
+ AddVoices(mDirectService, sDirectVoices, ArrayLength(sDirectVoices));
+
+ mIndirectService = new FakeIndirectAudioSynth();
+ AddVoices(mIndirectService, sIndirectVoices, ArrayLength(sIndirectVoices));
+}
+
+// nsIObserver
+
+NS_IMETHODIMP
+nsFakeSynthServices::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if(NS_WARN_IF(!(!strcmp(aTopic, "speech-synth-started")))) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ if (Preferences::GetBool("media.webspeech.synth.test")) {
+ NS_DispatchToMainThread(NewRunnableMethod(this, &nsFakeSynthServices::Init));
+ }
+
+ return NS_OK;
+}
+
+// static methods
+
+nsFakeSynthServices*
+nsFakeSynthServices::GetInstance()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (!XRE_IsParentProcess()) {
+ MOZ_ASSERT(false, "nsFakeSynthServices can only be started on main gecko process");
+ return nullptr;
+ }
+
+ if (!sSingleton) {
+ sSingleton = new nsFakeSynthServices();
+ }
+
+ return sSingleton;
+}
+
+already_AddRefed<nsFakeSynthServices>
+nsFakeSynthServices::GetInstanceForService()
+{
+ RefPtr<nsFakeSynthServices> picoService = GetInstance();
+ return picoService.forget();
+}
+
+void
+nsFakeSynthServices::Shutdown()
+{
+ if (!sSingleton) {
+ return;
+ }
+
+ sSingleton = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/test/nsFakeSynthServices.h b/dom/media/webspeech/synth/test/nsFakeSynthServices.h
new file mode 100644
index 000000000..bab93e779
--- /dev/null
+++ b/dom/media/webspeech/synth/test/nsFakeSynthServices.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsFakeSynthServices_h
+#define nsFakeSynthServices_h
+
+#include "nsTArray.h"
+#include "nsIObserver.h"
+#include "nsIThread.h"
+#include "nsISpeechService.h"
+#include "nsRefPtrHashtable.h"
+#include "mozilla/StaticPtr.h"
+#include "mozilla/Monitor.h"
+
+namespace mozilla {
+namespace dom {
+
+class nsFakeSynthServices : public nsIObserver
+{
+
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIOBSERVER
+
+ nsFakeSynthServices();
+
+ static nsFakeSynthServices* GetInstance();
+
+ static already_AddRefed<nsFakeSynthServices> GetInstanceForService();
+
+ static void Shutdown();
+
+private:
+
+ virtual ~nsFakeSynthServices();
+
+ void Init();
+
+ nsCOMPtr<nsISpeechService> mDirectService;
+
+ nsCOMPtr<nsISpeechService> mIndirectService;
+
+ static StaticRefPtr<nsFakeSynthServices> sSingleton;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/test/startup/file_voiceschanged.html b/dom/media/webspeech/synth/test/startup/file_voiceschanged.html
new file mode 100644
index 000000000..6bb25462e
--- /dev/null
+++ b/dom/media/webspeech/synth/test/startup/file_voiceschanged.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1254378
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1254378: Web Speech API check all classes are present</title>
+ <script type="application/javascript">
+ window.SimpleTest = parent.SimpleTest;
+ window.is = parent.is;
+ window.isnot = parent.isnot;
+ window.ok = parent.ok;
+ </script>
+</head>
+<body>
+<script type="application/javascript">
+
+/** Test for Bug 1254378 **/
+
+function onVoicesChanged() {
+ isnot(speechSynthesis.getVoices().length, 0, "Voices added");
+ speechSynthesis.removeEventListener("voiceschanged", onVoicesChanged);
+ SimpleTest.finish();
+}
+
+speechSynthesis.addEventListener("voiceschanged", onVoicesChanged);
+
+is(speechSynthesis.getVoices().length, 0, "No voices added initially");
+</script>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/startup/mochitest.ini b/dom/media/webspeech/synth/test/startup/mochitest.ini
new file mode 100644
index 000000000..7312a71eb
--- /dev/null
+++ b/dom/media/webspeech/synth/test/startup/mochitest.ini
@@ -0,0 +1,7 @@
+[DEFAULT]
+tags=msg
+subsuite = media
+support-files =
+ file_voiceschanged.html
+
+[test_voiceschanged.html]
diff --git a/dom/media/webspeech/synth/test/startup/test_voiceschanged.html b/dom/media/webspeech/synth/test/startup/test_voiceschanged.html
new file mode 100644
index 000000000..079938c35
--- /dev/null
+++ b/dom/media/webspeech/synth/test/startup/test_voiceschanged.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1254378
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1254378: Emit onvoiceschanged when voices first added</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1254378">Mozilla Bug 1254378</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1254378 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv({ set: [['media.webspeech.synth.enabled', true]] },
+ function() { document.getElementById("testFrame").src = "file_voiceschanged.html"; });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_bfcache.html b/dom/media/webspeech/synth/test/test_bfcache.html
new file mode 100644
index 000000000..8681def3f
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_bfcache.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1230533
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1230533: Test speech is stopped from a window when unloaded</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1230533">Mozilla Bug 1230533</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+var iframe;
+
+function onDone() {
+ SimpleTest.finish();
+}
+
+SpecialPowers.pushPrefEnv({ set: [
+ ['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', true],
+ ['browser.sessionhistory.cache_subframes', true],
+ ['browser.sessionhistory.max_total_viewers', 10]] },
+ function() {
+ loadSpeechTest("file_bfcache_frame.html");
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_global_queue.html b/dom/media/webspeech/synth/test/test_global_queue.html
new file mode 100644
index 000000000..34d3a4ed3
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_global_queue.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1188099
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1188099: Global queue should correctly schedule utterances</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1188099">Mozilla Bug 1188099</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', true]] },
+ function() { loadSpeechTest("file_global_queue.html"); });
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/webspeech/synth/test/test_global_queue_cancel.html b/dom/media/webspeech/synth/test/test_global_queue_cancel.html
new file mode 100644
index 000000000..4c5c11634
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_global_queue_cancel.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1188099
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1188099: Calling cancel() should work correctly with global queue</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1188099">Mozilla Bug 1188099</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', true]] },
+ function() { loadSpeechTest("file_global_queue_cancel.html"); });
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/webspeech/synth/test/test_global_queue_pause.html b/dom/media/webspeech/synth/test/test_global_queue_pause.html
new file mode 100644
index 000000000..f5ac1b98c
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_global_queue_pause.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1188099
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1188099: Calling pause() should work correctly with global queue</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1188099">Mozilla Bug 1188099</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', true]] },
+ function() { loadSpeechTest("file_global_queue_pause.html"); });
+
+</script>
+</pre>
+</body>
+</html> \ No newline at end of file
diff --git a/dom/media/webspeech/synth/test/test_indirect_service_events.html b/dom/media/webspeech/synth/test/test_indirect_service_events.html
new file mode 100644
index 000000000..d7f5ec424
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_indirect_service_events.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1155034
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1155034: Check that indirect audio services dispatch their own events</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1155034">Mozilla Bug 1155034</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1155034 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', false]] },
+ function() { loadSpeechTest("file_indirect_service_events.html"); });
+
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_setup.html b/dom/media/webspeech/synth/test/test_setup.html
new file mode 100644
index 000000000..6286b6c2e
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_setup.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=525444
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 525444: Web Speech API check all classes are present</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv({ set: [['media.webspeech.synth.enabled', true]] },
+ function() { document.getElementById("testFrame").src = "file_setup.html"; });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_speech_cancel.html b/dom/media/webspeech/synth/test/test_speech_cancel.html
new file mode 100644
index 000000000..e7cf051ef
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_speech_cancel.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1150315
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1150315: Web Speech API check all classes are present</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1150315">Mozilla Bug 1150315</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1150315 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', false]] },
+ function() { loadSpeechTest("file_speech_cancel.html"); });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_speech_error.html b/dom/media/webspeech/synth/test/test_speech_error.html
new file mode 100644
index 000000000..c4bfdc6c4
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_speech_error.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1226015
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 1150315: Web Speech API check all classes are present</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1226015">Mozilla Bug 1226015</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 1226015 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', false]] },
+ function() { loadSpeechTest("file_speech_error.html"); });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_speech_queue.html b/dom/media/webspeech/synth/test/test_speech_queue.html
new file mode 100644
index 000000000..ca652b243
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_speech_queue.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html lang="en-US">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=525444
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 525444: Web Speech API, check speech synth queue</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=525444">Mozilla Bug 525444</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true],
+ ['media.webspeech.synth.force_global_queue', false]] },
+ function() {
+ loadSpeechTest("file_speech_queue.html");
+ });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/test/test_speech_simple.html b/dom/media/webspeech/synth/test/test_speech_simple.html
new file mode 100644
index 000000000..2eb75af43
--- /dev/null
+++ b/dom/media/webspeech/synth/test/test_speech_simple.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=650295
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Bug 650295: Web Speech API check all classes are present</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
+<p id="display"></p>
+<iframe id="testFrame"></iframe>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 525444 **/
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { set: [['media.webspeech.synth.enabled', true]] },
+ function() { loadSpeechTest("file_speech_simple.html"); });
+
+</script>
+</pre>
+</body>
+</html>
diff --git a/dom/media/webspeech/synth/windows/SapiModule.cpp b/dom/media/webspeech/synth/windows/SapiModule.cpp
new file mode 100644
index 000000000..f9d7c9a89
--- /dev/null
+++ b/dom/media/webspeech/synth/windows/SapiModule.cpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ModuleUtils.h"
+#include "nsIClassInfoImpl.h"
+
+#include "SapiService.h"
+
+using namespace mozilla::dom;
+
+#define SAPISERVICE_CID \
+ {0x21b4a45b, 0x9806, 0x4021, {0xa7, 0x06, 0xd7, 0x68, 0xab, 0x05, 0x48, 0xf9}}
+
+#define SAPISERVICE_CONTRACTID "@mozilla.org/synthsapi;1"
+
+// Defines SapiServiceConstructor
+NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(SapiService,
+ SapiService::GetInstanceForService)
+
+// Defines kSAPISERVICE_CID
+NS_DEFINE_NAMED_CID(SAPISERVICE_CID);
+
+static const mozilla::Module::CIDEntry kCIDs[] = {
+ { &kSAPISERVICE_CID, true, nullptr, SapiServiceConstructor },
+ { nullptr }
+};
+
+static const mozilla::Module::ContractIDEntry kContracts[] = {
+ { SAPISERVICE_CONTRACTID, &kSAPISERVICE_CID },
+ { nullptr }
+};
+
+static const mozilla::Module::CategoryEntry kCategories[] = {
+ { "speech-synth-started", "Sapi Speech Synth", SAPISERVICE_CONTRACTID },
+ { nullptr }
+};
+
+static void
+UnloadSapiModule()
+{
+ SapiService::Shutdown();
+}
+
+static const mozilla::Module kModule = {
+ mozilla::Module::kVersion,
+ kCIDs,
+ kContracts,
+ kCategories,
+ nullptr,
+ nullptr,
+ UnloadSapiModule
+};
+
+NSMODULE_DEFN(synthsapi) = &kModule;
diff --git a/dom/media/webspeech/synth/windows/SapiService.cpp b/dom/media/webspeech/synth/windows/SapiService.cpp
new file mode 100644
index 000000000..95f35ebff
--- /dev/null
+++ b/dom/media/webspeech/synth/windows/SapiService.cpp
@@ -0,0 +1,470 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.h"
+#include "SapiService.h"
+#include "nsServiceManagerUtils.h"
+#include "nsWin32Locale.h"
+#include "GeckoProfiler.h"
+#include "nsEscape.h"
+
+#include "mozilla/dom/nsSynthVoiceRegistry.h"
+#include "mozilla/dom/nsSpeechTask.h"
+#include "mozilla/Preferences.h"
+
+namespace mozilla {
+namespace dom {
+
+StaticRefPtr<SapiService> SapiService::sSingleton;
+
+class SapiCallback final : public nsISpeechTaskCallback
+{
+public:
+ SapiCallback(nsISpeechTask* aTask, ISpVoice* aSapiClient,
+ uint32_t aTextOffset, uint32_t aSpeakTextLen)
+ : mTask(aTask)
+ , mSapiClient(aSapiClient)
+ , mTextOffset(aTextOffset)
+ , mSpeakTextLen(aSpeakTextLen)
+ , mCurrentIndex(0)
+ , mStreamNum(0)
+ {
+ mStartingTime = GetTickCount();
+ }
+
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(SapiCallback, nsISpeechTaskCallback)
+
+ NS_DECL_NSISPEECHTASKCALLBACK
+
+ ULONG GetStreamNum() const { return mStreamNum; }
+ void SetStreamNum(ULONG aValue) { mStreamNum = aValue; }
+
+ void OnSpeechEvent(const SPEVENT& speechEvent);
+
+private:
+ ~SapiCallback() { }
+
+ // This pointer is used to dispatch events
+ nsCOMPtr<nsISpeechTask> mTask;
+ RefPtr<ISpVoice> mSapiClient;
+
+ uint32_t mTextOffset;
+ uint32_t mSpeakTextLen;
+
+ // Used for calculating the time taken to speak the utterance
+ double mStartingTime;
+ uint32_t mCurrentIndex;
+
+ ULONG mStreamNum;
+};
+
+NS_IMPL_CYCLE_COLLECTION(SapiCallback, mTask);
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SapiCallback)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechTaskCallback)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechTaskCallback)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(SapiCallback)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(SapiCallback)
+
+NS_IMETHODIMP
+SapiCallback::OnPause()
+{
+ if (FAILED(mSapiClient->Pause())) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!mTask) {
+ // When calling pause() on child porcess, it may not receive end event
+ // from chrome process yet.
+ return NS_ERROR_FAILURE;
+ }
+ mTask->DispatchPause(GetTickCount() - mStartingTime, mCurrentIndex);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SapiCallback::OnResume()
+{
+ if (FAILED(mSapiClient->Resume())) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!mTask) {
+ // When calling resume() on child porcess, it may not receive end event
+ // from chrome process yet.
+ return NS_ERROR_FAILURE;
+ }
+ mTask->DispatchResume(GetTickCount() - mStartingTime, mCurrentIndex);
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SapiCallback::OnCancel()
+{
+ // After cancel, mCurrentIndex may be updated.
+ // At cancel case, use mCurrentIndex for DispatchEnd.
+ mSpeakTextLen = 0;
+ // Purge all the previous utterances and speak an empty string
+ if (FAILED(mSapiClient->Speak(nullptr, SPF_PURGEBEFORESPEAK, nullptr))) {
+ return NS_ERROR_FAILURE;
+ }
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SapiCallback::OnVolumeChanged(float aVolume)
+{
+ mSapiClient->SetVolume(static_cast<USHORT>(aVolume * 100));
+ return NS_OK;
+}
+
+void
+SapiCallback::OnSpeechEvent(const SPEVENT& speechEvent)
+{
+ switch (speechEvent.eEventId) {
+ case SPEI_START_INPUT_STREAM:
+ mTask->DispatchStart();
+ break;
+ case SPEI_END_INPUT_STREAM:
+ if (mSpeakTextLen) {
+ mCurrentIndex = mSpeakTextLen;
+ }
+ mTask->DispatchEnd(GetTickCount() - mStartingTime, mCurrentIndex);
+ mTask = nullptr;
+ break;
+ case SPEI_TTS_BOOKMARK:
+ mCurrentIndex = static_cast<ULONG>(speechEvent.lParam) - mTextOffset;
+ mTask->DispatchBoundary(NS_LITERAL_STRING("mark"),
+ GetTickCount() - mStartingTime, mCurrentIndex);
+ break;
+ case SPEI_WORD_BOUNDARY:
+ mCurrentIndex = static_cast<ULONG>(speechEvent.lParam) - mTextOffset;
+ mTask->DispatchBoundary(NS_LITERAL_STRING("word"),
+ GetTickCount() - mStartingTime, mCurrentIndex);
+ break;
+ case SPEI_SENTENCE_BOUNDARY:
+ mCurrentIndex = static_cast<ULONG>(speechEvent.lParam) - mTextOffset;
+ mTask->DispatchBoundary(NS_LITERAL_STRING("sentence"),
+ GetTickCount() - mStartingTime, mCurrentIndex);
+ break;
+ default:
+ break;
+ }
+}
+
+// static
+void __stdcall
+SapiService::SpeechEventCallback(WPARAM aWParam, LPARAM aLParam)
+{
+ RefPtr<ISpVoice> spVoice = (ISpVoice*) aWParam;
+ RefPtr<SapiService> service = (SapiService*) aLParam;
+
+ SPEVENT speechEvent;
+ while (spVoice->GetEvents(1, &speechEvent, nullptr) == S_OK) {
+ for (size_t i = 0; i < service->mCallbacks.Length(); i++) {
+ RefPtr<SapiCallback> callback = service->mCallbacks[i];
+ if (callback->GetStreamNum() == speechEvent.ulStreamNum) {
+ callback->OnSpeechEvent(speechEvent);
+ if (speechEvent.eEventId == SPEI_END_INPUT_STREAM) {
+ service->mCallbacks.RemoveElementAt(i);
+ }
+ break;
+ }
+ }
+ }
+}
+
+NS_INTERFACE_MAP_BEGIN(SapiService)
+ NS_INTERFACE_MAP_ENTRY(nsISpeechService)
+ NS_INTERFACE_MAP_ENTRY(nsIObserver)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISpeechService)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_ADDREF(SapiService)
+NS_IMPL_RELEASE(SapiService)
+
+SapiService::SapiService()
+ : mInitialized(false)
+{
+}
+
+SapiService::~SapiService()
+{
+}
+
+bool
+SapiService::Init()
+{
+ PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
+
+ MOZ_ASSERT(!mInitialized);
+
+ if (Preferences::GetBool("media.webspeech.synth.test") ||
+ !Preferences::GetBool("media.webspeech.synth.enabled")) {
+ // When enabled, we shouldn't add OS backend (Bug 1160844)
+ return false;
+ }
+
+ // Get all the voices from sapi and register in the SynthVoiceRegistry
+ if (!RegisterVoices()) {
+ return false;
+ }
+
+ mInitialized = true;
+ return true;
+}
+
+already_AddRefed<ISpVoice>
+SapiService::InitSapiInstance()
+{
+ RefPtr<ISpVoice> spVoice;
+ if (FAILED(CoCreateInstance(CLSID_SpVoice, nullptr, CLSCTX_ALL, IID_ISpVoice,
+ getter_AddRefs(spVoice)))) {
+ return nullptr;
+ }
+
+ // Set interest for all the events we are interested in
+ ULONGLONG eventMask =
+ SPFEI(SPEI_START_INPUT_STREAM) |
+ SPFEI(SPEI_TTS_BOOKMARK) |
+ SPFEI(SPEI_WORD_BOUNDARY) |
+ SPFEI(SPEI_SENTENCE_BOUNDARY) |
+ SPFEI(SPEI_END_INPUT_STREAM);
+
+ if (FAILED(spVoice->SetInterest(eventMask, eventMask))) {
+ return nullptr;
+ }
+
+ // Set the callback function for receiving the events
+ spVoice->SetNotifyCallbackFunction(
+ (SPNOTIFYCALLBACK*) SapiService::SpeechEventCallback,
+ (WPARAM) spVoice.get(), (LPARAM) this);
+
+ return spVoice.forget();
+}
+
+bool
+SapiService::RegisterVoices()
+{
+ nsresult rv;
+
+ nsCOMPtr<nsISynthVoiceRegistry> registry =
+ do_GetService(NS_SYNTHVOICEREGISTRY_CONTRACTID);
+ if (!registry) {
+ return false;
+ }
+
+ RefPtr<ISpObjectTokenCategory> category;
+ if (FAILED(CoCreateInstance(CLSID_SpObjectTokenCategory, nullptr, CLSCTX_ALL,
+ IID_ISpObjectTokenCategory,
+ getter_AddRefs(category)))) {
+ return false;
+ }
+ if (FAILED(category->SetId(SPCAT_VOICES, FALSE))) {
+ return false;
+ }
+
+ RefPtr<IEnumSpObjectTokens> voiceTokens;
+ if (FAILED(category->EnumTokens(nullptr, nullptr,
+ getter_AddRefs(voiceTokens)))) {
+ return false;
+ }
+
+ while (true) {
+ RefPtr<ISpObjectToken> voiceToken;
+ if (voiceTokens->Next(1, getter_AddRefs(voiceToken), nullptr) != S_OK) {
+ break;
+ }
+
+ RefPtr<ISpDataKey> attributes;
+ if (FAILED(voiceToken->OpenKey(L"Attributes",
+ getter_AddRefs(attributes)))) {
+ continue;
+ }
+
+ WCHAR* language = nullptr;
+ if (FAILED(attributes->GetStringValue(L"Language", &language))) {
+ continue;
+ }
+
+ // Language attribute is LCID by hex. So we need convert to locale
+ // name.
+ nsAutoString hexLcid;
+ LCID lcid = wcstol(language, nullptr, 16);
+ CoTaskMemFree(language);
+ nsAutoString locale;
+ nsWin32Locale::GetXPLocale(lcid, locale);
+
+ WCHAR* description = nullptr;
+ if (FAILED(voiceToken->GetStringValue(nullptr, &description))) {
+ continue;
+ }
+
+ nsAutoString uri;
+ uri.AssignLiteral("urn:moz-tts:sapi:");
+ uri.Append(description);
+ uri.AppendLiteral("?");
+ uri.Append(locale);
+
+ // This service can only speak one utterance at a time, se we set
+ // aQueuesUtterances to true in order to track global state and schedule
+ // access to this service.
+ rv = registry->AddVoice(this, uri, nsDependentString(description), locale,
+ true, true);
+ CoTaskMemFree(description);
+ if (NS_FAILED(rv)) {
+ continue;
+ }
+
+ mVoices.Put(uri, voiceToken);
+ }
+
+ registry->NotifyVoicesChanged();
+
+ return true;
+}
+
+NS_IMETHODIMP
+SapiService::Speak(const nsAString& aText, const nsAString& aUri,
+ float aVolume, float aRate, float aPitch,
+ nsISpeechTask* aTask)
+{
+ NS_ENSURE_TRUE(mInitialized, NS_ERROR_NOT_AVAILABLE);
+
+ RefPtr<ISpObjectToken> voiceToken;
+ if (!mVoices.Get(aUri, getter_AddRefs(voiceToken))) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+
+ RefPtr<ISpVoice> spVoice = InitSapiInstance();
+ if (!spVoice) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (FAILED(spVoice->SetVoice(voiceToken))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ if (FAILED(spVoice->SetVolume(static_cast<USHORT>(aVolume * 100)))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // The max supported rate in SAPI engines is 3x, and the min is 1/3x. It is
+ // expressed by an integer. 0 being normal rate, -10 is 1/3 and 10 is 3x.
+ // Values below and above that are allowed, but the engine may clip the rate
+ // to its maximum capable value.
+ // "Each increment between -10 and +10 is logarithmically distributed such
+ // that incrementing or decrementing by 1 is multiplying or dividing the
+ // rate by the 10th root of 3"
+ // https://msdn.microsoft.com/en-us/library/ee431826(v=vs.85).aspx
+ long rate = aRate != 0 ? static_cast<long>(10 * log10(aRate) / log10(3)) : 0;
+ if (FAILED(spVoice->SetRate(rate))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ // Set the pitch using xml
+ nsAutoString xml;
+ xml.AssignLiteral("<pitch absmiddle=\"");
+ // absmiddle doesn't allow float type
+ xml.AppendInt(static_cast<int32_t>(aPitch * 10.0f - 10.0f));
+ xml.AppendLiteral("\">");
+ uint32_t textOffset = xml.Length();
+
+ for (size_t i = 0; i < aText.Length(); i++) {
+ switch (aText[i]) {
+ case '&':
+ xml.AppendLiteral("&amp;");
+ break;
+ case '<':
+ xml.AppendLiteral("&lt;");
+ break;
+ case '>':
+ xml.AppendLiteral("&gt;");
+ break;
+ default:
+ xml.Append(aText[i]);
+ break;
+ }
+ }
+
+ xml.AppendLiteral("</pitch>");
+
+ RefPtr<SapiCallback> callback =
+ new SapiCallback(aTask, spVoice, textOffset, aText.Length());
+
+ // The last three parameters doesn't matter for an indirect service
+ nsresult rv = aTask->Setup(callback, 0, 0, 0);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ ULONG streamNum;
+ if (FAILED(spVoice->Speak(xml.get(), SPF_ASYNC, &streamNum))) {
+ aTask->Setup(nullptr, 0, 0, 0);
+ return NS_ERROR_FAILURE;
+ }
+
+ callback->SetStreamNum(streamNum);
+ // streamNum reassigns same value when last stream is finished even if
+ // callback for stream end isn't called
+ // So we cannot use data hashtable and has to add it to vector at last.
+ mCallbacks.AppendElement(callback);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SapiService::GetServiceType(SpeechServiceType* aServiceType)
+{
+ *aServiceType = nsISpeechService::SERVICETYPE_INDIRECT_AUDIO;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SapiService::Observe(nsISupports* aSubject, const char* aTopic,
+ const char16_t* aData)
+{
+ return NS_OK;
+}
+
+SapiService*
+SapiService::GetInstance()
+{
+ MOZ_ASSERT(NS_IsMainThread());
+ if (XRE_GetProcessType() != GeckoProcessType_Default) {
+ MOZ_ASSERT(false,
+ "SapiService can only be started on main gecko process");
+ return nullptr;
+ }
+
+ if (!sSingleton) {
+ RefPtr<SapiService> service = new SapiService();
+ if (service->Init()) {
+ sSingleton = service;
+ }
+ }
+ return sSingleton;
+}
+
+already_AddRefed<SapiService>
+SapiService::GetInstanceForService()
+{
+ RefPtr<SapiService> sapiService = GetInstance();
+ return sapiService.forget();
+}
+
+void
+SapiService::Shutdown()
+{
+ if (!sSingleton) {
+ return;
+ }
+ sSingleton = nullptr;
+}
+
+} // namespace dom
+} // namespace mozilla
diff --git a/dom/media/webspeech/synth/windows/SapiService.h b/dom/media/webspeech/synth/windows/SapiService.h
new file mode 100644
index 000000000..cde743cc2
--- /dev/null
+++ b/dom/media/webspeech/synth/windows/SapiService.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_SapiService_h
+#define mozilla_dom_SapiService_h
+
+#include "nsISpeechService.h"
+#include "nsIObserver.h"
+#include "nsRefPtrHashtable.h"
+#include "nsTArray.h"
+#include "mozilla/StaticPtr.h"
+
+#include <windows.h>
+#include <sapi.h>
+
+namespace mozilla {
+namespace dom {
+
+class SapiCallback;
+
+class SapiService final : public nsISpeechService
+ , public nsIObserver
+{
+public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISPEECHSERVICE
+ NS_DECL_NSIOBSERVER
+
+ SapiService();
+ bool Init();
+
+ static SapiService* GetInstance();
+ static already_AddRefed<SapiService> GetInstanceForService();
+
+ static void Shutdown();
+
+ static void __stdcall SpeechEventCallback(WPARAM aWParam, LPARAM aLParam);
+
+private:
+ virtual ~SapiService();
+
+ already_AddRefed<ISpVoice> InitSapiInstance();
+ bool RegisterVoices();
+
+ nsRefPtrHashtable<nsStringHashKey, ISpObjectToken> mVoices;
+ nsTArray<RefPtr<SapiCallback>> mCallbacks;
+
+ bool mInitialized;
+
+ static StaticRefPtr<SapiService> sSingleton;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
diff --git a/dom/media/webspeech/synth/windows/moz.build b/dom/media/webspeech/synth/windows/moz.build
new file mode 100644
index 000000000..f0ff9f2c9
--- /dev/null
+++ b/dom/media/webspeech/synth/windows/moz.build
@@ -0,0 +1,13 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+UNIFIED_SOURCES += [
+ 'SapiModule.cpp',
+ 'SapiService.cpp'
+]
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
diff --git a/dom/media/webvtt/WebVTT.manifest b/dom/media/webvtt/WebVTT.manifest
new file mode 100644
index 000000000..9abafa5b1
--- /dev/null
+++ b/dom/media/webvtt/WebVTT.manifest
@@ -0,0 +1,3 @@
+# WebVTTParserWrapper
+component {acf6e493-0092-4b26-b172-241e375c57ab} WebVTTParserWrapper.js
+contract @mozilla.org/webvttParserWrapper;1 {acf6e493-0092-4b26-b172-241e375c57ab}
diff --git a/dom/media/webvtt/WebVTTParserWrapper.js b/dom/media/webvtt/WebVTTParserWrapper.js
new file mode 100644
index 000000000..5a36308fd
--- /dev/null
+++ b/dom/media/webvtt/WebVTTParserWrapper.js
@@ -0,0 +1,72 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/vtt.jsm");
+
+var Ci = Components.interfaces;
+
+var WEBVTTPARSERWRAPPER_CID = "{acf6e493-0092-4b26-b172-241e375c57ab}";
+var WEBVTTPARSERWRAPPER_CONTRACTID = "@mozilla.org/webvttParserWrapper;1";
+
+function WebVTTParserWrapper()
+{
+ // Nothing
+}
+
+WebVTTParserWrapper.prototype =
+{
+ loadParser: function(window)
+ {
+ this.parser = new WebVTT.Parser(window, new TextDecoder("utf8"));
+ },
+
+ parse: function(data)
+ {
+ // We can safely translate the string data to a Uint8Array as we are
+ // guaranteed character codes only from \u0000 => \u00ff
+ var buffer = new Uint8Array(data.length);
+ for (var i = 0; i < data.length; i++) {
+ buffer[i] = data.charCodeAt(i);
+ }
+
+ this.parser.parse(buffer);
+ },
+
+ flush: function()
+ {
+ this.parser.flush();
+ },
+
+ watch: function(callback)
+ {
+ this.parser.oncue = callback.onCue;
+ this.parser.onregion = callback.onRegion;
+ this.parser.onparsingerror = function(e) {
+ // Passing the just the error code back is enough for our needs.
+ callback.onParsingError(("code" in e) ? e.code : -1);
+ };
+ },
+
+ convertCueToDOMTree: function(window, cue)
+ {
+ return WebVTT.convertCueToDOMTree(window, cue.text);
+ },
+
+ processCues: function(window, cues, overlay, controls)
+ {
+ WebVTT.processCues(window, cues, overlay, controls);
+ },
+
+ classDescription: "Wrapper for the JS WebVTT implementation (vtt.js)",
+ classID: Components.ID(WEBVTTPARSERWRAPPER_CID),
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebVTTParserWrapper]),
+ classInfo: XPCOMUtils.generateCI({
+ classID: WEBVTTPARSERWRAPPER_CID,
+ contractID: WEBVTTPARSERWRAPPER_CONTRACTID,
+ interfaces: [Ci.nsIWebVTTParserWrapper]
+ })
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([WebVTTParserWrapper]);
diff --git a/dom/media/webvtt/moz.build b/dom/media/webvtt/moz.build
new file mode 100644
index 000000000..bd65114ce
--- /dev/null
+++ b/dom/media/webvtt/moz.build
@@ -0,0 +1,21 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+XPIDL_SOURCES += [
+ 'nsIWebVTTListener.idl',
+ 'nsIWebVTTParserWrapper.idl',
+]
+
+XPIDL_MODULE = 'webvtt'
+
+EXTRA_COMPONENTS += [
+ 'WebVTT.manifest',
+ 'WebVTTParserWrapper.js',
+]
+
+EXTRA_JS_MODULES += [
+ 'vtt.jsm',
+]
diff --git a/dom/media/webvtt/nsIWebVTTListener.idl b/dom/media/webvtt/nsIWebVTTListener.idl
new file mode 100644
index 000000000..b99d4cf51
--- /dev/null
+++ b/dom/media/webvtt/nsIWebVTTListener.idl
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+/**
+ * Listener for a JS WebVTT parser (vtt.js).
+ */
+[scriptable, uuid(8a2d7780-2045-4a29-99f4-df15cae5fc49)]
+interface nsIWebVTTListener : nsISupports
+{
+ /**
+ * Is called when the WebVTTParser successfully parses a WebVTT cue.
+ *
+ * @param cue An object representing the data of a parsed WebVTT cue.
+ */
+ [implicit_jscontext]
+ void onCue(in jsval cue);
+
+ /**
+ * Is called when the WebVTT parser successfully parses a WebVTT region.
+ *
+ * @param region An object representing the data of a parsed
+ * WebVTT region.
+ */
+ [implicit_jscontext]
+ void onRegion(in jsval region);
+
+ /**
+ * Is called when the WebVTT parser encounters a parsing error.
+ *
+ * @param error The error code of the ParserError the occured.
+ */
+ [implicit_jscontext]
+ void onParsingError(in long errorCode);
+};
diff --git a/dom/media/webvtt/nsIWebVTTParserWrapper.idl b/dom/media/webvtt/nsIWebVTTParserWrapper.idl
new file mode 100644
index 000000000..793fcaa3c
--- /dev/null
+++ b/dom/media/webvtt/nsIWebVTTParserWrapper.idl
@@ -0,0 +1,88 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+interface nsIDOMHTMLElement;
+interface nsIWebVTTListener;
+interface mozIDOMWindow;
+interface nsIVariant;
+
+/**
+ * Interface for a wrapper of a JS WebVTT parser (vtt.js).
+ */
+[scriptable, uuid(8dfe016e-1701-4618-9f5e-9a6154e853f0)]
+interface nsIWebVTTParserWrapper : nsISupports
+{
+ /**
+ * Loads the JS WebVTTParser and sets it to use the passed window to create
+ * VTTRegions and VTTCues. This function must be called before calling
+ * parse, flush, or watch.
+ *
+ * @param window The window that the parser will use to create VTTCues and
+ * VTTRegions.
+ *
+ */
+ void loadParser(in mozIDOMWindow window);
+
+ /**
+ * Attempts to parse the stream's data as WebVTT format. When it successfully
+ * parses a WebVTT region or WebVTT cue it will create a VTTRegion or VTTCue
+ * object and pass it back to the callee through its callbacks.
+ *
+ * @param data The buffer that contains the WebVTT data received by the
+ * Necko consumer so far.
+ */
+ void parse(in ACString data);
+
+ /**
+ * Flush indicates that no more data is expected from the stream. As such the
+ * parser should try to parse any kind of partial data it has.
+ */
+ void flush();
+
+ /**
+ * Set this parser object to use an nsIWebVTTListener object for its onCue
+ * and onRegion callbacks.
+ *
+ * @param callback The nsIWebVTTListener object that exposes onCue and
+ * onRegion callbacks for the parser.
+ */
+ void watch(in nsIWebVTTListener callback);
+
+ /**
+ * Convert the text content of a WebVTT cue to a document fragment so that
+ * we can display it on the page.
+ *
+ * @param window A window object with which the document fragment will be
+ * created.
+ * @param cue The cue whose content will be converted to a document
+ * fragment.
+ */
+ nsIDOMHTMLElement convertCueToDOMTree(in mozIDOMWindow window,
+ in nsISupports cue);
+
+
+ /**
+ * Compute the display state of the VTTCues in cues along with any VTTRegions
+ * that they might be in. First, it computes the positioning and styling of
+ * the cues and regions passed and converts them into a DOM tree rooted at
+ * a containing HTMLDivElement. It then adjusts those computed divs for
+ * overlap avoidance using the dimensions of 'overlay'. Finally, it adds the
+ * computed divs to the VTTCues display state property for use later.
+ *
+ * @param window A window object with which it will create the DOM tree
+ * and containing div element.
+ * @param cues An array of VTTCues who need there display state to be
+ * computed.
+ * @param overlay The HTMLElement that the cues will be displayed within.
+ * @param controls The video control element that will affect cues position.
+ */
+ void processCues(in mozIDOMWindow window, in nsIVariant cues,
+ in nsISupports overlay, in nsISupports controls);
+};
+
+%{C++
+#define NS_WEBVTTPARSERWRAPPER_CONTRACTID "@mozilla.org/webvttParserWrapper;1"
+%}
diff --git a/dom/media/webvtt/package.json b/dom/media/webvtt/package.json
new file mode 100644
index 000000000..2952b78c0
--- /dev/null
+++ b/dom/media/webvtt/package.json
@@ -0,0 +1,6 @@
+{
+ "devDependencies": {
+ "gift": "~0.0.6",
+ "optimist": "~0.6.0"
+ }
+}
diff --git a/dom/media/webvtt/update-webvtt.js b/dom/media/webvtt/update-webvtt.js
new file mode 100644
index 000000000..a1c82a138
--- /dev/null
+++ b/dom/media/webvtt/update-webvtt.js
@@ -0,0 +1,55 @@
+#!/usr/bin/env node
+var gift = require('gift'),
+ fs = require('fs'),
+ argv = require('optimist')
+ .usage('Update vtt.jsm with the latest from a vtt.js directory.\nUsage:' +
+ ' $0 -d [dir]')
+ .demand('d')
+ .options('d', {
+ alias: 'dir',
+ describe: 'Path to WebVTT directory.'
+ })
+ .options('r', {
+ alias: 'rev',
+ describe: 'Revision to update to.',
+ default: 'master'
+ })
+ .options('w', {
+ alias: 'write',
+ describe: 'Path to file to write to.',
+ default: "./vtt.jsm"
+ })
+ .argv;
+
+var repo = gift(argv.d);
+repo.status(function(err, status) {
+ if (!status.clean) {
+ console.log("The repository's working directory is not clean. Aborting.");
+ process.exit(1);
+ }
+ repo.checkout(argv.r, function() {
+ repo.commits(argv.r, 1, function(err, commits) {
+ var vttjs = fs.readFileSync(argv.d + "/lib/vtt.js", 'utf8');
+
+ // Remove settings for VIM and Emacs.
+ vttjs = vttjs.replace(/\/\* -\*-.*-\*- \*\/\n/, '');
+ vttjs = vttjs.replace(/\/\* vim:.* \*\/\n/, '');
+
+ // Concatenate header and vttjs code.
+ vttjs =
+ '/* This Source Code Form is subject to the terms of the Mozilla Public\n' +
+ ' * License, v. 2.0. If a copy of the MPL was not distributed with this\n' +
+ ' * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\n' +
+ 'this.EXPORTED_SYMBOLS = ["WebVTT"];\n\n' +
+ '/**\n' +
+ ' * Code below is vtt.js the JS WebVTT implementation.\n' +
+ ' * Current source code can be found at http://github.com/mozilla/vtt.js\n' +
+ ' *\n' +
+ ' * Code taken from commit ' + commits[0].id + '\n' +
+ ' */\n' +
+ vttjs;
+
+ fs.writeFileSync(argv.w, vttjs);
+ });
+});
+});
diff --git a/dom/media/webvtt/vtt.jsm b/dom/media/webvtt/vtt.jsm
new file mode 100644
index 000000000..c8370e27c
--- /dev/null
+++ b/dom/media/webvtt/vtt.jsm
@@ -0,0 +1,1528 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+this.EXPORTED_SYMBOLS = ["WebVTT"];
+
+/**
+ * Code below is vtt.js the JS WebVTT implementation.
+ * Current source code can be found at http://github.com/mozilla/vtt.js
+ *
+ * Code taken from commit b89bfd06cd788a68c67e03f44561afe833db0849
+ */
+/**
+ * Copyright 2013 vtt.js Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+(function(global) {
+
+ var _objCreate = Object.create || (function() {
+ function F() {}
+ return function(o) {
+ if (arguments.length !== 1) {
+ throw new Error('Object.create shim only accepts one parameter.');
+ }
+ F.prototype = o;
+ return new F();
+ };
+ })();
+
+ // Creates a new ParserError object from an errorData object. The errorData
+ // object should have default code and message properties. The default message
+ // property can be overriden by passing in a message parameter.
+ // See ParsingError.Errors below for acceptable errors.
+ function ParsingError(errorData, message) {
+ this.name = "ParsingError";
+ this.code = errorData.code;
+ this.message = message || errorData.message;
+ }
+ ParsingError.prototype = _objCreate(Error.prototype);
+ ParsingError.prototype.constructor = ParsingError;
+
+ // ParsingError metadata for acceptable ParsingErrors.
+ ParsingError.Errors = {
+ BadSignature: {
+ code: 0,
+ message: "Malformed WebVTT signature."
+ },
+ BadTimeStamp: {
+ code: 1,
+ message: "Malformed time stamp."
+ }
+ };
+
+ // See spec, https://w3c.github.io/webvtt/#collect-a-webvtt-timestamp.
+ function collectTimeStamp(input) {
+ function computeSeconds(h, m, s, f) {
+ if (m > 59 || s > 59) {
+ return null;
+ }
+ // The attribute of the milli-seconds can only be three digits.
+ if (f.length !== 3) {
+ return null;
+ }
+ return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;
+ }
+
+ var timestamp = input.match(/^(\d+:)?(\d{2}):(\d{2})\.(\d+)/);
+ if (!timestamp || timestamp.length !== 5) {
+ return null;
+ }
+
+ let hours = timestamp[1]? timestamp[1].replace(":", "") : 0;
+ let minutes = timestamp[2];
+ let seconds = timestamp[3];
+ let milliSeconds = timestamp[4];
+
+ return computeSeconds(hours, minutes, seconds, milliSeconds);
+ }
+
+ // A settings object holds key/value pairs and will ignore anything but the first
+ // assignment to a specific key.
+ function Settings() {
+ this.values = _objCreate(null);
+ }
+
+ Settings.prototype = {
+ set: function(k, v) {
+ if (v !== "") {
+ this.values[k] = v;
+ }
+ },
+ // Return the value for a key, or a default value.
+ // If 'defaultKey' is passed then 'dflt' is assumed to be an object with
+ // a number of possible default values as properties where 'defaultKey' is
+ // the key of the property that will be chosen; otherwise it's assumed to be
+ // a single value.
+ get: function(k, dflt, defaultKey) {
+ if (defaultKey) {
+ return this.has(k) ? this.values[k] : dflt[defaultKey];
+ }
+ return this.has(k) ? this.values[k] : dflt;
+ },
+ // Check whether we have a value for a key.
+ has: function(k) {
+ return k in this.values;
+ },
+ // Accept a setting if its one of the given alternatives.
+ alt: function(k, v, a) {
+ for (var n = 0; n < a.length; ++n) {
+ if (v === a[n]) {
+ this.set(k, v);
+ break;
+ }
+ }
+ },
+ // Accept a setting if its a valid digits value (int or float)
+ digitsValue: function(k, v) {
+ if (/^-0+(\.[0]*)?$/.test(v)) { // special case for -0.0
+ this.set(k, 0.0);
+ } else if (/^-?\d+(\.[\d]*)?$/.test(v)) {
+ this.set(k, parseFloat(v));
+ }
+ },
+ // Accept a setting if its a valid percentage.
+ percent: function(k, v) {
+ var m;
+ if ((m = v.match(/^([\d]{1,3})(\.[\d]*)?%$/))) {
+ v = parseFloat(v);
+ if (v >= 0 && v <= 100) {
+ this.set(k, v);
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+
+ // Helper function to parse input into groups separated by 'groupDelim', and
+ // interprete each group as a key/value pair separated by 'keyValueDelim'.
+ function parseOptions(input, callback, keyValueDelim, groupDelim) {
+ var groups = groupDelim ? input.split(groupDelim) : [input];
+ for (var i in groups) {
+ if (typeof groups[i] !== "string") {
+ continue;
+ }
+ var kv = groups[i].split(keyValueDelim);
+ if (kv.length !== 2) {
+ continue;
+ }
+ var k = kv[0];
+ var v = kv[1];
+ callback(k, v);
+ }
+ }
+
+ function parseCue(input, cue, regionList) {
+ // Remember the original input if we need to throw an error.
+ var oInput = input;
+ // 4.1 WebVTT timestamp
+ function consumeTimeStamp() {
+ var ts = collectTimeStamp(input);
+ if (ts === null) {
+ throw new ParsingError(ParsingError.Errors.BadTimeStamp,
+ "Malformed timestamp: " + oInput);
+ }
+ // Remove time stamp from input.
+ input = input.replace(/^[^\s\uFFFDa-zA-Z-]+/, "");
+ return ts;
+ }
+
+ // 4.4.2 WebVTT cue settings
+ function consumeCueSettings(input, cue) {
+ var settings = new Settings();
+
+ parseOptions(input, function (k, v) {
+ switch (k) {
+ case "region":
+ // Find the last region we parsed with the same region id.
+ for (var i = regionList.length - 1; i >= 0; i--) {
+ if (regionList[i].id === v) {
+ settings.set(k, regionList[i].region);
+ break;
+ }
+ }
+ break;
+ case "vertical":
+ settings.alt(k, v, ["rl", "lr"]);
+ break;
+ case "line":
+ var vals = v.split(","),
+ vals0 = vals[0];
+ settings.digitsValue(k, vals0);
+ settings.percent(k, vals0) ? settings.set("snapToLines", false) : null;
+ settings.alt(k, vals0, ["auto"]);
+ if (vals.length === 2) {
+ settings.alt("lineAlign", vals[1], ["start", "center", "end"]);
+ }
+ break;
+ case "position":
+ vals = v.split(",");
+ settings.percent(k, vals[0]);
+ if (vals.length === 2) {
+ settings.alt("positionAlign", vals[1], ["line-left", "center", "line-right", "auto"]);
+ }
+ break;
+ case "size":
+ settings.percent(k, v);
+ break;
+ case "align":
+ settings.alt(k, v, ["start", "center", "end", "left", "right"]);
+ break;
+ }
+ }, /:/, /\s/);
+
+ // Apply default values for any missing fields.
+ cue.region = settings.get("region", null);
+ cue.vertical = settings.get("vertical", "");
+ cue.line = settings.get("line", "auto");
+ cue.lineAlign = settings.get("lineAlign", "start");
+ cue.snapToLines = settings.get("snapToLines", true);
+ cue.size = settings.get("size", 100);
+ cue.align = settings.get("align", "center");
+ cue.position = settings.get("position", "auto");
+ cue.positionAlign = settings.get("positionAlign", "center");
+ }
+
+ function skipWhitespace() {
+ input = input.replace(/^[ \f\n\r\t]+/, "");
+ }
+
+ // 4.1 WebVTT cue timings.
+ skipWhitespace();
+ cue.startTime = consumeTimeStamp(); // (1) collect cue start time
+ skipWhitespace();
+ if (input.substr(0, 3) !== "-->") { // (3) next characters must match "-->"
+ throw new ParsingError(ParsingError.Errors.BadTimeStamp,
+ "Malformed time stamp (time stamps must be separated by '-->'): " +
+ oInput);
+ }
+ input = input.substr(3);
+ skipWhitespace();
+ cue.endTime = consumeTimeStamp(); // (5) collect cue end time
+
+ // 4.1 WebVTT cue settings list.
+ skipWhitespace();
+ consumeCueSettings(input, cue);
+ }
+
+ function onlyContainsWhiteSpaces(input) {
+ return /^[ \f\n\r\t]+$/.test(input);
+ }
+
+ function containsTimeDirectionSymbol(input) {
+ return input.indexOf("-->") !== -1;
+ }
+
+ function maybeIsTimeStampFormat(input) {
+ return /^\s*(\d+:)?(\d{2}):(\d{2})\.(\d+)\s*-->\s*(\d+:)?(\d{2}):(\d{2})\.(\d+)\s*/.test(input);
+ }
+
+ var ESCAPE = {
+ "&amp;": "&",
+ "&lt;": "<",
+ "&gt;": ">",
+ "&lrm;": "\u200e",
+ "&rlm;": "\u200f",
+ "&nbsp;": "\u00a0"
+ };
+
+ var TAG_NAME = {
+ c: "span",
+ i: "i",
+ b: "b",
+ u: "u",
+ ruby: "ruby",
+ rt: "rt",
+ v: "span",
+ lang: "span"
+ };
+
+ var TAG_ANNOTATION = {
+ v: "title",
+ lang: "lang"
+ };
+
+ var NEEDS_PARENT = {
+ rt: "ruby"
+ };
+
+ // Parse content into a document fragment.
+ function parseContent(window, input) {
+ function nextToken() {
+ // Check for end-of-string.
+ if (!input) {
+ return null;
+ }
+
+ // Consume 'n' characters from the input.
+ function consume(result) {
+ input = input.substr(result.length);
+ return result;
+ }
+
+ var m = input.match(/^([^<]*)(<[^>]+>?)?/);
+ // If there is some text before the next tag, return it, otherwise return
+ // the tag.
+ return consume(m[1] ? m[1] : m[2]);
+ }
+
+ // Unescape a string 's'.
+ function unescape1(e) {
+ return ESCAPE[e];
+ }
+ function unescape(s) {
+ while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {
+ s = s.replace(m[0], unescape1);
+ }
+ return s;
+ }
+
+ function shouldAdd(current, element) {
+ return !NEEDS_PARENT[element.localName] ||
+ NEEDS_PARENT[element.localName] === current.localName;
+ }
+
+ // Create an element for this tag.
+ function createElement(type, annotation) {
+ var tagName = TAG_NAME[type];
+ if (!tagName) {
+ return null;
+ }
+ var element = window.document.createElement(tagName);
+ element.localName = tagName;
+ var name = TAG_ANNOTATION[type];
+ if (name && annotation) {
+ element[name] = annotation.trim();
+ }
+ return element;
+ }
+
+ var rootDiv = window.document.createElement("div"),
+ current = rootDiv,
+ t,
+ tagStack = [];
+
+ while ((t = nextToken()) !== null) {
+ if (t[0] === '<') {
+ if (t[1] === "/") {
+ // If the closing tag matches, move back up to the parent node.
+ if (tagStack.length &&
+ tagStack[tagStack.length - 1] === t.substr(2).replace(">", "")) {
+ tagStack.pop();
+ current = current.parentNode;
+ }
+ // Otherwise just ignore the end tag.
+ continue;
+ }
+ var ts = collectTimeStamp(t.substr(1, t.length - 2));
+ var node;
+ if (ts) {
+ // Timestamps are lead nodes as well.
+ node = window.document.createProcessingInstruction("timestamp", ts);
+ current.appendChild(node);
+ continue;
+ }
+ var m = t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);
+ // If we can't parse the tag, skip to the next tag.
+ if (!m) {
+ continue;
+ }
+ // Try to construct an element, and ignore the tag if we couldn't.
+ node = createElement(m[1], m[3]);
+ if (!node) {
+ continue;
+ }
+ // Determine if the tag should be added based on the context of where it
+ // is placed in the cuetext.
+ if (!shouldAdd(current, node)) {
+ continue;
+ }
+ // Set the class list (as a list of classes, separated by space).
+ if (m[2]) {
+ node.className = m[2].substr(1).replace('.', ' ');
+ }
+ // Append the node to the current node, and enter the scope of the new
+ // node.
+ tagStack.push(m[1]);
+ current.appendChild(node);
+ current = node;
+ continue;
+ }
+
+ // Text nodes are leaf nodes.
+ current.appendChild(window.document.createTextNode(unescape(t)));
+ }
+
+ return rootDiv;
+ }
+
+ // This is a list of all the Unicode characters that have a strong
+ // right-to-left category. What this means is that these characters are
+ // written right-to-left for sure. It was generated by pulling all the strong
+ // right-to-left characters out of the Unicode data table. That table can
+ // found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
+ var strongRTLChars = [0x05BE, 0x05C0, 0x05C3, 0x05C6, 0x05D0, 0x05D1,
+ 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA,
+ 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3,
+ 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x05F0, 0x05F1,
+ 0x05F2, 0x05F3, 0x05F4, 0x0608, 0x060B, 0x060D, 0x061B, 0x061E, 0x061F,
+ 0x0620, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628,
+ 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631,
+ 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A,
+ 0x063B, 0x063C, 0x063D, 0x063E, 0x063F, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x066D, 0x066E,
+ 0x066F, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0x0677, 0x0678,
+ 0x0679, 0x067A, 0x067B, 0x067C, 0x067D, 0x067E, 0x067F, 0x0680, 0x0681,
+ 0x0682, 0x0683, 0x0684, 0x0685, 0x0686, 0x0687, 0x0688, 0x0689, 0x068A,
+ 0x068B, 0x068C, 0x068D, 0x068E, 0x068F, 0x0690, 0x0691, 0x0692, 0x0693,
+ 0x0694, 0x0695, 0x0696, 0x0697, 0x0698, 0x0699, 0x069A, 0x069B, 0x069C,
+ 0x069D, 0x069E, 0x069F, 0x06A0, 0x06A1, 0x06A2, 0x06A3, 0x06A4, 0x06A5,
+ 0x06A6, 0x06A7, 0x06A8, 0x06A9, 0x06AA, 0x06AB, 0x06AC, 0x06AD, 0x06AE,
+ 0x06AF, 0x06B0, 0x06B1, 0x06B2, 0x06B3, 0x06B4, 0x06B5, 0x06B6, 0x06B7,
+ 0x06B8, 0x06B9, 0x06BA, 0x06BB, 0x06BC, 0x06BD, 0x06BE, 0x06BF, 0x06C0,
+ 0x06C1, 0x06C2, 0x06C3, 0x06C4, 0x06C5, 0x06C6, 0x06C7, 0x06C8, 0x06C9,
+ 0x06CA, 0x06CB, 0x06CC, 0x06CD, 0x06CE, 0x06CF, 0x06D0, 0x06D1, 0x06D2,
+ 0x06D3, 0x06D4, 0x06D5, 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FB,
+ 0x06FC, 0x06FD, 0x06FE, 0x06FF, 0x0700, 0x0701, 0x0702, 0x0703, 0x0704,
+ 0x0705, 0x0706, 0x0707, 0x0708, 0x0709, 0x070A, 0x070B, 0x070C, 0x070D,
+ 0x070F, 0x0710, 0x0712, 0x0713, 0x0714, 0x0715, 0x0716, 0x0717, 0x0718,
+ 0x0719, 0x071A, 0x071B, 0x071C, 0x071D, 0x071E, 0x071F, 0x0720, 0x0721,
+ 0x0722, 0x0723, 0x0724, 0x0725, 0x0726, 0x0727, 0x0728, 0x0729, 0x072A,
+ 0x072B, 0x072C, 0x072D, 0x072E, 0x072F, 0x074D, 0x074E, 0x074F, 0x0750,
+ 0x0751, 0x0752, 0x0753, 0x0754, 0x0755, 0x0756, 0x0757, 0x0758, 0x0759,
+ 0x075A, 0x075B, 0x075C, 0x075D, 0x075E, 0x075F, 0x0760, 0x0761, 0x0762,
+ 0x0763, 0x0764, 0x0765, 0x0766, 0x0767, 0x0768, 0x0769, 0x076A, 0x076B,
+ 0x076C, 0x076D, 0x076E, 0x076F, 0x0770, 0x0771, 0x0772, 0x0773, 0x0774,
+ 0x0775, 0x0776, 0x0777, 0x0778, 0x0779, 0x077A, 0x077B, 0x077C, 0x077D,
+ 0x077E, 0x077F, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0786,
+ 0x0787, 0x0788, 0x0789, 0x078A, 0x078B, 0x078C, 0x078D, 0x078E, 0x078F,
+ 0x0790, 0x0791, 0x0792, 0x0793, 0x0794, 0x0795, 0x0796, 0x0797, 0x0798,
+ 0x0799, 0x079A, 0x079B, 0x079C, 0x079D, 0x079E, 0x079F, 0x07A0, 0x07A1,
+ 0x07A2, 0x07A3, 0x07A4, 0x07A5, 0x07B1, 0x07C0, 0x07C1, 0x07C2, 0x07C3,
+ 0x07C4, 0x07C5, 0x07C6, 0x07C7, 0x07C8, 0x07C9, 0x07CA, 0x07CB, 0x07CC,
+ 0x07CD, 0x07CE, 0x07CF, 0x07D0, 0x07D1, 0x07D2, 0x07D3, 0x07D4, 0x07D5,
+ 0x07D6, 0x07D7, 0x07D8, 0x07D9, 0x07DA, 0x07DB, 0x07DC, 0x07DD, 0x07DE,
+ 0x07DF, 0x07E0, 0x07E1, 0x07E2, 0x07E3, 0x07E4, 0x07E5, 0x07E6, 0x07E7,
+ 0x07E8, 0x07E9, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x0800, 0x0801, 0x0802,
+ 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, 0x0808, 0x0809, 0x080A, 0x080B,
+ 0x080C, 0x080D, 0x080E, 0x080F, 0x0810, 0x0811, 0x0812, 0x0813, 0x0814,
+ 0x0815, 0x081A, 0x0824, 0x0828, 0x0830, 0x0831, 0x0832, 0x0833, 0x0834,
+ 0x0835, 0x0836, 0x0837, 0x0838, 0x0839, 0x083A, 0x083B, 0x083C, 0x083D,
+ 0x083E, 0x0840, 0x0841, 0x0842, 0x0843, 0x0844, 0x0845, 0x0846, 0x0847,
+ 0x0848, 0x0849, 0x084A, 0x084B, 0x084C, 0x084D, 0x084E, 0x084F, 0x0850,
+ 0x0851, 0x0852, 0x0853, 0x0854, 0x0855, 0x0856, 0x0857, 0x0858, 0x085E,
+ 0x08A0, 0x08A2, 0x08A3, 0x08A4, 0x08A5, 0x08A6, 0x08A7, 0x08A8, 0x08A9,
+ 0x08AA, 0x08AB, 0x08AC, 0x200F, 0xFB1D, 0xFB1F, 0xFB20, 0xFB21, 0xFB22,
+ 0xFB23, 0xFB24, 0xFB25, 0xFB26, 0xFB27, 0xFB28, 0xFB2A, 0xFB2B, 0xFB2C,
+ 0xFB2D, 0xFB2E, 0xFB2F, 0xFB30, 0xFB31, 0xFB32, 0xFB33, 0xFB34, 0xFB35,
+ 0xFB36, 0xFB38, 0xFB39, 0xFB3A, 0xFB3B, 0xFB3C, 0xFB3E, 0xFB40, 0xFB41,
+ 0xFB43, 0xFB44, 0xFB46, 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C,
+ 0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52, 0xFB53, 0xFB54, 0xFB55,
+ 0xFB56, 0xFB57, 0xFB58, 0xFB59, 0xFB5A, 0xFB5B, 0xFB5C, 0xFB5D, 0xFB5E,
+ 0xFB5F, 0xFB60, 0xFB61, 0xFB62, 0xFB63, 0xFB64, 0xFB65, 0xFB66, 0xFB67,
+ 0xFB68, 0xFB69, 0xFB6A, 0xFB6B, 0xFB6C, 0xFB6D, 0xFB6E, 0xFB6F, 0xFB70,
+ 0xFB71, 0xFB72, 0xFB73, 0xFB74, 0xFB75, 0xFB76, 0xFB77, 0xFB78, 0xFB79,
+ 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, 0xFB7E, 0xFB7F, 0xFB80, 0xFB81, 0xFB82,
+ 0xFB83, 0xFB84, 0xFB85, 0xFB86, 0xFB87, 0xFB88, 0xFB89, 0xFB8A, 0xFB8B,
+ 0xFB8C, 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91, 0xFB92, 0xFB93, 0xFB94,
+ 0xFB95, 0xFB96, 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C, 0xFB9D,
+ 0xFB9E, 0xFB9F, 0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3, 0xFBA4, 0xFBA5, 0xFBA6,
+ 0xFBA7, 0xFBA8, 0xFBA9, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD, 0xFBAE, 0xFBAF,
+ 0xFBB0, 0xFBB1, 0xFBB2, 0xFBB3, 0xFBB4, 0xFBB5, 0xFBB6, 0xFBB7, 0xFBB8,
+ 0xFBB9, 0xFBBA, 0xFBBB, 0xFBBC, 0xFBBD, 0xFBBE, 0xFBBF, 0xFBC0, 0xFBC1,
+ 0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6, 0xFBD7, 0xFBD8, 0xFBD9, 0xFBDA, 0xFBDB,
+ 0xFBDC, 0xFBDD, 0xFBDE, 0xFBDF, 0xFBE0, 0xFBE1, 0xFBE2, 0xFBE3, 0xFBE4,
+ 0xFBE5, 0xFBE6, 0xFBE7, 0xFBE8, 0xFBE9, 0xFBEA, 0xFBEB, 0xFBEC, 0xFBED,
+ 0xFBEE, 0xFBEF, 0xFBF0, 0xFBF1, 0xFBF2, 0xFBF3, 0xFBF4, 0xFBF5, 0xFBF6,
+ 0xFBF7, 0xFBF8, 0xFBF9, 0xFBFA, 0xFBFB, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF,
+ 0xFC00, 0xFC01, 0xFC02, 0xFC03, 0xFC04, 0xFC05, 0xFC06, 0xFC07, 0xFC08,
+ 0xFC09, 0xFC0A, 0xFC0B, 0xFC0C, 0xFC0D, 0xFC0E, 0xFC0F, 0xFC10, 0xFC11,
+ 0xFC12, 0xFC13, 0xFC14, 0xFC15, 0xFC16, 0xFC17, 0xFC18, 0xFC19, 0xFC1A,
+ 0xFC1B, 0xFC1C, 0xFC1D, 0xFC1E, 0xFC1F, 0xFC20, 0xFC21, 0xFC22, 0xFC23,
+ 0xFC24, 0xFC25, 0xFC26, 0xFC27, 0xFC28, 0xFC29, 0xFC2A, 0xFC2B, 0xFC2C,
+ 0xFC2D, 0xFC2E, 0xFC2F, 0xFC30, 0xFC31, 0xFC32, 0xFC33, 0xFC34, 0xFC35,
+ 0xFC36, 0xFC37, 0xFC38, 0xFC39, 0xFC3A, 0xFC3B, 0xFC3C, 0xFC3D, 0xFC3E,
+ 0xFC3F, 0xFC40, 0xFC41, 0xFC42, 0xFC43, 0xFC44, 0xFC45, 0xFC46, 0xFC47,
+ 0xFC48, 0xFC49, 0xFC4A, 0xFC4B, 0xFC4C, 0xFC4D, 0xFC4E, 0xFC4F, 0xFC50,
+ 0xFC51, 0xFC52, 0xFC53, 0xFC54, 0xFC55, 0xFC56, 0xFC57, 0xFC58, 0xFC59,
+ 0xFC5A, 0xFC5B, 0xFC5C, 0xFC5D, 0xFC5E, 0xFC5F, 0xFC60, 0xFC61, 0xFC62,
+ 0xFC63, 0xFC64, 0xFC65, 0xFC66, 0xFC67, 0xFC68, 0xFC69, 0xFC6A, 0xFC6B,
+ 0xFC6C, 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70, 0xFC71, 0xFC72, 0xFC73, 0xFC74,
+ 0xFC75, 0xFC76, 0xFC77, 0xFC78, 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D,
+ 0xFC7E, 0xFC7F, 0xFC80, 0xFC81, 0xFC82, 0xFC83, 0xFC84, 0xFC85, 0xFC86,
+ 0xFC87, 0xFC88, 0xFC89, 0xFC8A, 0xFC8B, 0xFC8C, 0xFC8D, 0xFC8E, 0xFC8F,
+ 0xFC90, 0xFC91, 0xFC92, 0xFC93, 0xFC94, 0xFC95, 0xFC96, 0xFC97, 0xFC98,
+ 0xFC99, 0xFC9A, 0xFC9B, 0xFC9C, 0xFC9D, 0xFC9E, 0xFC9F, 0xFCA0, 0xFCA1,
+ 0xFCA2, 0xFCA3, 0xFCA4, 0xFCA5, 0xFCA6, 0xFCA7, 0xFCA8, 0xFCA9, 0xFCAA,
+ 0xFCAB, 0xFCAC, 0xFCAD, 0xFCAE, 0xFCAF, 0xFCB0, 0xFCB1, 0xFCB2, 0xFCB3,
+ 0xFCB4, 0xFCB5, 0xFCB6, 0xFCB7, 0xFCB8, 0xFCB9, 0xFCBA, 0xFCBB, 0xFCBC,
+ 0xFCBD, 0xFCBE, 0xFCBF, 0xFCC0, 0xFCC1, 0xFCC2, 0xFCC3, 0xFCC4, 0xFCC5,
+ 0xFCC6, 0xFCC7, 0xFCC8, 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE,
+ 0xFCCF, 0xFCD0, 0xFCD1, 0xFCD2, 0xFCD3, 0xFCD4, 0xFCD5, 0xFCD6, 0xFCD7,
+ 0xFCD8, 0xFCD9, 0xFCDA, 0xFCDB, 0xFCDC, 0xFCDD, 0xFCDE, 0xFCDF, 0xFCE0,
+ 0xFCE1, 0xFCE2, 0xFCE3, 0xFCE4, 0xFCE5, 0xFCE6, 0xFCE7, 0xFCE8, 0xFCE9,
+ 0xFCEA, 0xFCEB, 0xFCEC, 0xFCED, 0xFCEE, 0xFCEF, 0xFCF0, 0xFCF1, 0xFCF2,
+ 0xFCF3, 0xFCF4, 0xFCF5, 0xFCF6, 0xFCF7, 0xFCF8, 0xFCF9, 0xFCFA, 0xFCFB,
+ 0xFCFC, 0xFCFD, 0xFCFE, 0xFCFF, 0xFD00, 0xFD01, 0xFD02, 0xFD03, 0xFD04,
+ 0xFD05, 0xFD06, 0xFD07, 0xFD08, 0xFD09, 0xFD0A, 0xFD0B, 0xFD0C, 0xFD0D,
+ 0xFD0E, 0xFD0F, 0xFD10, 0xFD11, 0xFD12, 0xFD13, 0xFD14, 0xFD15, 0xFD16,
+ 0xFD17, 0xFD18, 0xFD19, 0xFD1A, 0xFD1B, 0xFD1C, 0xFD1D, 0xFD1E, 0xFD1F,
+ 0xFD20, 0xFD21, 0xFD22, 0xFD23, 0xFD24, 0xFD25, 0xFD26, 0xFD27, 0xFD28,
+ 0xFD29, 0xFD2A, 0xFD2B, 0xFD2C, 0xFD2D, 0xFD2E, 0xFD2F, 0xFD30, 0xFD31,
+ 0xFD32, 0xFD33, 0xFD34, 0xFD35, 0xFD36, 0xFD37, 0xFD38, 0xFD39, 0xFD3A,
+ 0xFD3B, 0xFD3C, 0xFD3D, 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55,
+ 0xFD56, 0xFD57, 0xFD58, 0xFD59, 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D, 0xFD5E,
+ 0xFD5F, 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65, 0xFD66, 0xFD67,
+ 0xFD68, 0xFD69, 0xFD6A, 0xFD6B, 0xFD6C, 0xFD6D, 0xFD6E, 0xFD6F, 0xFD70,
+ 0xFD71, 0xFD72, 0xFD73, 0xFD74, 0xFD75, 0xFD76, 0xFD77, 0xFD78, 0xFD79,
+ 0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D, 0xFD7E, 0xFD7F, 0xFD80, 0xFD81, 0xFD82,
+ 0xFD83, 0xFD84, 0xFD85, 0xFD86, 0xFD87, 0xFD88, 0xFD89, 0xFD8A, 0xFD8B,
+ 0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD92, 0xFD93, 0xFD94, 0xFD95, 0xFD96,
+ 0xFD97, 0xFD98, 0xFD99, 0xFD9A, 0xFD9B, 0xFD9C, 0xFD9D, 0xFD9E, 0xFD9F,
+ 0xFDA0, 0xFDA1, 0xFDA2, 0xFDA3, 0xFDA4, 0xFDA5, 0xFDA6, 0xFDA7, 0xFDA8,
+ 0xFDA9, 0xFDAA, 0xFDAB, 0xFDAC, 0xFDAD, 0xFDAE, 0xFDAF, 0xFDB0, 0xFDB1,
+ 0xFDB2, 0xFDB3, 0xFDB4, 0xFDB5, 0xFDB6, 0xFDB7, 0xFDB8, 0xFDB9, 0xFDBA,
+ 0xFDBB, 0xFDBC, 0xFDBD, 0xFDBE, 0xFDBF, 0xFDC0, 0xFDC1, 0xFDC2, 0xFDC3,
+ 0xFDC4, 0xFDC5, 0xFDC6, 0xFDC7, 0xFDF0, 0xFDF1, 0xFDF2, 0xFDF3, 0xFDF4,
+ 0xFDF5, 0xFDF6, 0xFDF7, 0xFDF8, 0xFDF9, 0xFDFA, 0xFDFB, 0xFDFC, 0xFE70,
+ 0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE76, 0xFE77, 0xFE78, 0xFE79, 0xFE7A,
+ 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, 0xFE80, 0xFE81, 0xFE82, 0xFE83,
+ 0xFE84, 0xFE85, 0xFE86, 0xFE87, 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C,
+ 0xFE8D, 0xFE8E, 0xFE8F, 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95,
+ 0xFE96, 0xFE97, 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E,
+ 0xFE9F, 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7,
+ 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, 0xFEB0,
+ 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9,
+ 0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0, 0xFEC1, 0xFEC2,
+ 0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, 0xFEC9, 0xFECA, 0xFECB,
+ 0xFECC, 0xFECD, 0xFECE, 0xFECF, 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4,
+ 0xFED5, 0xFED6, 0xFED7, 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD,
+ 0xFEDE, 0xFEDF, 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6,
+ 0xFEE7, 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF,
+ 0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8,
+ 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0x10800, 0x10801, 0x10802, 0x10803,
+ 0x10804, 0x10805, 0x10808, 0x1080A, 0x1080B, 0x1080C, 0x1080D, 0x1080E,
+ 0x1080F, 0x10810, 0x10811, 0x10812, 0x10813, 0x10814, 0x10815, 0x10816,
+ 0x10817, 0x10818, 0x10819, 0x1081A, 0x1081B, 0x1081C, 0x1081D, 0x1081E,
+ 0x1081F, 0x10820, 0x10821, 0x10822, 0x10823, 0x10824, 0x10825, 0x10826,
+ 0x10827, 0x10828, 0x10829, 0x1082A, 0x1082B, 0x1082C, 0x1082D, 0x1082E,
+ 0x1082F, 0x10830, 0x10831, 0x10832, 0x10833, 0x10834, 0x10835, 0x10837,
+ 0x10838, 0x1083C, 0x1083F, 0x10840, 0x10841, 0x10842, 0x10843, 0x10844,
+ 0x10845, 0x10846, 0x10847, 0x10848, 0x10849, 0x1084A, 0x1084B, 0x1084C,
+ 0x1084D, 0x1084E, 0x1084F, 0x10850, 0x10851, 0x10852, 0x10853, 0x10854,
+ 0x10855, 0x10857, 0x10858, 0x10859, 0x1085A, 0x1085B, 0x1085C, 0x1085D,
+ 0x1085E, 0x1085F, 0x10900, 0x10901, 0x10902, 0x10903, 0x10904, 0x10905,
+ 0x10906, 0x10907, 0x10908, 0x10909, 0x1090A, 0x1090B, 0x1090C, 0x1090D,
+ 0x1090E, 0x1090F, 0x10910, 0x10911, 0x10912, 0x10913, 0x10914, 0x10915,
+ 0x10916, 0x10917, 0x10918, 0x10919, 0x1091A, 0x1091B, 0x10920, 0x10921,
+ 0x10922, 0x10923, 0x10924, 0x10925, 0x10926, 0x10927, 0x10928, 0x10929,
+ 0x1092A, 0x1092B, 0x1092C, 0x1092D, 0x1092E, 0x1092F, 0x10930, 0x10931,
+ 0x10932, 0x10933, 0x10934, 0x10935, 0x10936, 0x10937, 0x10938, 0x10939,
+ 0x1093F, 0x10980, 0x10981, 0x10982, 0x10983, 0x10984, 0x10985, 0x10986,
+ 0x10987, 0x10988, 0x10989, 0x1098A, 0x1098B, 0x1098C, 0x1098D, 0x1098E,
+ 0x1098F, 0x10990, 0x10991, 0x10992, 0x10993, 0x10994, 0x10995, 0x10996,
+ 0x10997, 0x10998, 0x10999, 0x1099A, 0x1099B, 0x1099C, 0x1099D, 0x1099E,
+ 0x1099F, 0x109A0, 0x109A1, 0x109A2, 0x109A3, 0x109A4, 0x109A5, 0x109A6,
+ 0x109A7, 0x109A8, 0x109A9, 0x109AA, 0x109AB, 0x109AC, 0x109AD, 0x109AE,
+ 0x109AF, 0x109B0, 0x109B1, 0x109B2, 0x109B3, 0x109B4, 0x109B5, 0x109B6,
+ 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A10, 0x10A11, 0x10A12, 0x10A13,
+ 0x10A15, 0x10A16, 0x10A17, 0x10A19, 0x10A1A, 0x10A1B, 0x10A1C, 0x10A1D,
+ 0x10A1E, 0x10A1F, 0x10A20, 0x10A21, 0x10A22, 0x10A23, 0x10A24, 0x10A25,
+ 0x10A26, 0x10A27, 0x10A28, 0x10A29, 0x10A2A, 0x10A2B, 0x10A2C, 0x10A2D,
+ 0x10A2E, 0x10A2F, 0x10A30, 0x10A31, 0x10A32, 0x10A33, 0x10A40, 0x10A41,
+ 0x10A42, 0x10A43, 0x10A44, 0x10A45, 0x10A46, 0x10A47, 0x10A50, 0x10A51,
+ 0x10A52, 0x10A53, 0x10A54, 0x10A55, 0x10A56, 0x10A57, 0x10A58, 0x10A60,
+ 0x10A61, 0x10A62, 0x10A63, 0x10A64, 0x10A65, 0x10A66, 0x10A67, 0x10A68,
+ 0x10A69, 0x10A6A, 0x10A6B, 0x10A6C, 0x10A6D, 0x10A6E, 0x10A6F, 0x10A70,
+ 0x10A71, 0x10A72, 0x10A73, 0x10A74, 0x10A75, 0x10A76, 0x10A77, 0x10A78,
+ 0x10A79, 0x10A7A, 0x10A7B, 0x10A7C, 0x10A7D, 0x10A7E, 0x10A7F, 0x10B00,
+ 0x10B01, 0x10B02, 0x10B03, 0x10B04, 0x10B05, 0x10B06, 0x10B07, 0x10B08,
+ 0x10B09, 0x10B0A, 0x10B0B, 0x10B0C, 0x10B0D, 0x10B0E, 0x10B0F, 0x10B10,
+ 0x10B11, 0x10B12, 0x10B13, 0x10B14, 0x10B15, 0x10B16, 0x10B17, 0x10B18,
+ 0x10B19, 0x10B1A, 0x10B1B, 0x10B1C, 0x10B1D, 0x10B1E, 0x10B1F, 0x10B20,
+ 0x10B21, 0x10B22, 0x10B23, 0x10B24, 0x10B25, 0x10B26, 0x10B27, 0x10B28,
+ 0x10B29, 0x10B2A, 0x10B2B, 0x10B2C, 0x10B2D, 0x10B2E, 0x10B2F, 0x10B30,
+ 0x10B31, 0x10B32, 0x10B33, 0x10B34, 0x10B35, 0x10B40, 0x10B41, 0x10B42,
+ 0x10B43, 0x10B44, 0x10B45, 0x10B46, 0x10B47, 0x10B48, 0x10B49, 0x10B4A,
+ 0x10B4B, 0x10B4C, 0x10B4D, 0x10B4E, 0x10B4F, 0x10B50, 0x10B51, 0x10B52,
+ 0x10B53, 0x10B54, 0x10B55, 0x10B58, 0x10B59, 0x10B5A, 0x10B5B, 0x10B5C,
+ 0x10B5D, 0x10B5E, 0x10B5F, 0x10B60, 0x10B61, 0x10B62, 0x10B63, 0x10B64,
+ 0x10B65, 0x10B66, 0x10B67, 0x10B68, 0x10B69, 0x10B6A, 0x10B6B, 0x10B6C,
+ 0x10B6D, 0x10B6E, 0x10B6F, 0x10B70, 0x10B71, 0x10B72, 0x10B78, 0x10B79,
+ 0x10B7A, 0x10B7B, 0x10B7C, 0x10B7D, 0x10B7E, 0x10B7F, 0x10C00, 0x10C01,
+ 0x10C02, 0x10C03, 0x10C04, 0x10C05, 0x10C06, 0x10C07, 0x10C08, 0x10C09,
+ 0x10C0A, 0x10C0B, 0x10C0C, 0x10C0D, 0x10C0E, 0x10C0F, 0x10C10, 0x10C11,
+ 0x10C12, 0x10C13, 0x10C14, 0x10C15, 0x10C16, 0x10C17, 0x10C18, 0x10C19,
+ 0x10C1A, 0x10C1B, 0x10C1C, 0x10C1D, 0x10C1E, 0x10C1F, 0x10C20, 0x10C21,
+ 0x10C22, 0x10C23, 0x10C24, 0x10C25, 0x10C26, 0x10C27, 0x10C28, 0x10C29,
+ 0x10C2A, 0x10C2B, 0x10C2C, 0x10C2D, 0x10C2E, 0x10C2F, 0x10C30, 0x10C31,
+ 0x10C32, 0x10C33, 0x10C34, 0x10C35, 0x10C36, 0x10C37, 0x10C38, 0x10C39,
+ 0x10C3A, 0x10C3B, 0x10C3C, 0x10C3D, 0x10C3E, 0x10C3F, 0x10C40, 0x10C41,
+ 0x10C42, 0x10C43, 0x10C44, 0x10C45, 0x10C46, 0x10C47, 0x10C48, 0x1EE00,
+ 0x1EE01, 0x1EE02, 0x1EE03, 0x1EE05, 0x1EE06, 0x1EE07, 0x1EE08, 0x1EE09,
+ 0x1EE0A, 0x1EE0B, 0x1EE0C, 0x1EE0D, 0x1EE0E, 0x1EE0F, 0x1EE10, 0x1EE11,
+ 0x1EE12, 0x1EE13, 0x1EE14, 0x1EE15, 0x1EE16, 0x1EE17, 0x1EE18, 0x1EE19,
+ 0x1EE1A, 0x1EE1B, 0x1EE1C, 0x1EE1D, 0x1EE1E, 0x1EE1F, 0x1EE21, 0x1EE22,
+ 0x1EE24, 0x1EE27, 0x1EE29, 0x1EE2A, 0x1EE2B, 0x1EE2C, 0x1EE2D, 0x1EE2E,
+ 0x1EE2F, 0x1EE30, 0x1EE31, 0x1EE32, 0x1EE34, 0x1EE35, 0x1EE36, 0x1EE37,
+ 0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE4D, 0x1EE4E,
+ 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D,
+ 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE67, 0x1EE68, 0x1EE69, 0x1EE6A,
+ 0x1EE6C, 0x1EE6D, 0x1EE6E, 0x1EE6F, 0x1EE70, 0x1EE71, 0x1EE72, 0x1EE74,
+ 0x1EE75, 0x1EE76, 0x1EE77, 0x1EE79, 0x1EE7A, 0x1EE7B, 0x1EE7C, 0x1EE7E,
+ 0x1EE80, 0x1EE81, 0x1EE82, 0x1EE83, 0x1EE84, 0x1EE85, 0x1EE86, 0x1EE87,
+ 0x1EE88, 0x1EE89, 0x1EE8B, 0x1EE8C, 0x1EE8D, 0x1EE8E, 0x1EE8F, 0x1EE90,
+ 0x1EE91, 0x1EE92, 0x1EE93, 0x1EE94, 0x1EE95, 0x1EE96, 0x1EE97, 0x1EE98,
+ 0x1EE99, 0x1EE9A, 0x1EE9B, 0x1EEA1, 0x1EEA2, 0x1EEA3, 0x1EEA5, 0x1EEA6,
+ 0x1EEA7, 0x1EEA8, 0x1EEA9, 0x1EEAB, 0x1EEAC, 0x1EEAD, 0x1EEAE, 0x1EEAF,
+ 0x1EEB0, 0x1EEB1, 0x1EEB2, 0x1EEB3, 0x1EEB4, 0x1EEB5, 0x1EEB6, 0x1EEB7,
+ 0x1EEB8, 0x1EEB9, 0x1EEBA, 0x1EEBB, 0x10FFFD];
+
+ function determineBidi(cueDiv) {
+ var nodeStack = [],
+ text = "",
+ charCode;
+
+ if (!cueDiv || !cueDiv.childNodes) {
+ return "ltr";
+ }
+
+ function pushNodes(nodeStack, node) {
+ for (var i = node.childNodes.length - 1; i >= 0; i--) {
+ nodeStack.push(node.childNodes[i]);
+ }
+ }
+
+ function nextTextNode(nodeStack) {
+ if (!nodeStack || !nodeStack.length) {
+ return null;
+ }
+
+ var node = nodeStack.pop(),
+ text = node.textContent || node.innerText;
+ if (text) {
+ // TODO: This should match all unicode type B characters (paragraph
+ // separator characters). See issue #115.
+ var m = text.match(/^.*(\n|\r)/);
+ if (m) {
+ nodeStack.length = 0;
+ return m[0];
+ }
+ return text;
+ }
+ if (node.tagName === "ruby") {
+ return nextTextNode(nodeStack);
+ }
+ if (node.childNodes) {
+ pushNodes(nodeStack, node);
+ return nextTextNode(nodeStack);
+ }
+ }
+
+ pushNodes(nodeStack, cueDiv);
+ while ((text = nextTextNode(nodeStack))) {
+ for (var i = 0; i < text.length; i++) {
+ charCode = text.charCodeAt(i);
+ for (var j = 0; j < strongRTLChars.length; j++) {
+ if (strongRTLChars[j] === charCode) {
+ return "rtl";
+ }
+ }
+ }
+ }
+ return "ltr";
+ }
+
+ function StyleBox() {
+ }
+
+ // Apply styles to a div. If there is no div passed then it defaults to the
+ // div on 'this'.
+ StyleBox.prototype.applyStyles = function(styles, div) {
+ div = div || this.div;
+ for (var prop in styles) {
+ if (styles.hasOwnProperty(prop)) {
+ div.style[prop] = styles[prop];
+ }
+ }
+ };
+
+ StyleBox.prototype.formatStyle = function(val, unit) {
+ return val === 0 ? 0 : val + unit;
+ };
+
+ // Constructs the computed display state of the cue (a div). Places the div
+ // into the overlay which should be a block level element (usually a div).
+ function CueStyleBox(window, cue, styleOptions) {
+ var isIE8 = (typeof navigator !== "undefined") &&
+ (/MSIE\s8\.0/).test(navigator.userAgent);
+ var color = "rgba(255, 255, 255, 1)";
+ var backgroundColor = "rgba(0, 0, 0, 0.8)";
+
+ if (isIE8) {
+ color = "rgb(255, 255, 255)";
+ backgroundColor = "rgb(0, 0, 0)";
+ }
+
+ StyleBox.call(this);
+ this.cue = cue;
+
+ // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will
+ // have inline positioning and will function as the cue background box.
+ this.cueDiv = parseContent(window, cue.text);
+ var styles = {
+ color: color,
+ backgroundColor: backgroundColor,
+ position: "relative",
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0,
+ display: "inline"
+ };
+
+ if (!isIE8) {
+ styles.writingMode = cue.vertical === "" ? "horizontal-tb"
+ : cue.vertical === "lr" ? "vertical-lr"
+ : "vertical-rl";
+ styles.unicodeBidi = "plaintext";
+ }
+ this.applyStyles(styles, this.cueDiv);
+
+ // Create an absolutely positioned div that will be used to position the cue
+ // div.
+ this.div = window.document.createElement("div");
+ styles = {
+ textAlign: cue.align,
+ font: styleOptions.font,
+ whiteSpace: "pre-line",
+ position: "absolute"
+ };
+
+ if (!isIE8) {
+ styles.direction = determineBidi(this.cueDiv);
+ styles.writingMode = cue.vertical === "" ? "horizontal-tb"
+ : cue.vertical === "lr" ? "vertical-lr"
+ : "vertical-rl".
+ stylesunicodeBidi = "plaintext";
+ }
+
+ this.applyStyles(styles);
+
+ this.div.appendChild(this.cueDiv);
+
+ // Calculate the distance from the reference edge of the viewport to the text
+ // position of the cue box. The reference edge will be resolved later when
+ // the box orientation styles are applied.
+ var textPos = 0;
+ switch (cue.computedPositionAlign) {
+ // TODO : modify these fomula to follow the spec, see bug 1277437.
+ case "line-left":
+ textPos = cue.position;
+ break;
+ case "center":
+ textPos = cue.position - (cue.size / 2);
+ break;
+ case "line-right":
+ textPos = cue.position - cue.size;
+ break;
+ }
+
+ // Horizontal box orientation; textPos is the distance from the left edge of the
+ // area to the left edge of the box and cue.size is the distance extending to
+ // the right from there.
+ if (cue.vertical === "") {
+ this.applyStyles({
+ left: this.formatStyle(textPos, "%"),
+ width: this.formatStyle(cue.size, "%")
+ });
+ // Vertical box orientation; textPos is the distance from the top edge of the
+ // area to the top edge of the box and cue.size is the height extending
+ // downwards from there.
+ } else {
+ this.applyStyles({
+ top: this.formatStyle(textPos, "%"),
+ height: this.formatStyle(cue.size, "%")
+ });
+ }
+
+ this.move = function(box) {
+ this.applyStyles({
+ top: this.formatStyle(box.top, "px"),
+ bottom: this.formatStyle(box.bottom, "px"),
+ left: this.formatStyle(box.left, "px"),
+ right: this.formatStyle(box.right, "px"),
+ height: this.formatStyle(box.height, "px"),
+ width: this.formatStyle(box.width, "px")
+ });
+ };
+ }
+ CueStyleBox.prototype = _objCreate(StyleBox.prototype);
+ CueStyleBox.prototype.constructor = CueStyleBox;
+
+ // Represents the co-ordinates of an Element in a way that we can easily
+ // compute things with such as if it overlaps or intersects with another Element.
+ // Can initialize it with either a StyleBox or another BoxPosition.
+ function BoxPosition(obj) {
+ var isIE8 = (typeof navigator !== "undefined") &&
+ (/MSIE\s8\.0/).test(navigator.userAgent);
+
+ // Either a BoxPosition was passed in and we need to copy it, or a StyleBox
+ // was passed in and we need to copy the results of 'getBoundingClientRect'
+ // as the object returned is readonly. All co-ordinate values are in reference
+ // to the viewport origin (top left).
+ var lh, height, width, top;
+ if (obj.div) {
+ height = obj.div.offsetHeight;
+ width = obj.div.offsetWidth;
+ top = obj.div.offsetTop;
+
+ var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&
+ rects.getClientRects && rects.getClientRects();
+ obj = obj.div.getBoundingClientRect();
+ // In certain cases the outter div will be slightly larger then the sum of
+ // the inner div's lines. This could be due to bold text, etc, on some platforms.
+ // In this case we should get the average line height and use that. This will
+ // result in the desired behaviour.
+ lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)
+ : 0;
+
+ }
+ this.left = obj.left;
+ this.right = obj.right;
+ this.top = obj.top || top;
+ this.height = obj.height || height;
+ this.bottom = obj.bottom || (top + (obj.height || height));
+ this.width = obj.width || width;
+ this.lineHeight = lh !== undefined ? lh : obj.lineHeight;
+
+ if (isIE8 && !this.lineHeight) {
+ this.lineHeight = 13;
+ }
+ }
+
+ // Move the box along a particular axis. Optionally pass in an amount to move
+ // the box. If no amount is passed then the default is the line height of the
+ // box.
+ BoxPosition.prototype.move = function(axis, toMove) {
+ toMove = toMove !== undefined ? toMove : this.lineHeight;
+ switch (axis) {
+ case "+x":
+ this.left += toMove;
+ this.right += toMove;
+ break;
+ case "-x":
+ this.left -= toMove;
+ this.right -= toMove;
+ break;
+ case "+y":
+ this.top += toMove;
+ this.bottom += toMove;
+ break;
+ case "-y":
+ this.top -= toMove;
+ this.bottom -= toMove;
+ break;
+ }
+ };
+
+ // Check if this box overlaps another box, b2.
+ BoxPosition.prototype.overlaps = function(b2) {
+ return this.left < b2.right &&
+ this.right > b2.left &&
+ this.top < b2.bottom &&
+ this.bottom > b2.top;
+ };
+
+ // Check if this box overlaps any other boxes in boxes.
+ BoxPosition.prototype.overlapsAny = function(boxes) {
+ for (var i = 0; i < boxes.length; i++) {
+ if (this.overlaps(boxes[i])) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ // Check if this box is within another box.
+ BoxPosition.prototype.within = function(container) {
+ return this.top >= container.top &&
+ this.bottom <= container.bottom &&
+ this.left >= container.left &&
+ this.right <= container.right;
+ };
+
+ // Check if this box is entirely within the container or it is overlapping
+ // on the edge opposite of the axis direction passed. For example, if "+x" is
+ // passed and the box is overlapping on the left edge of the container, then
+ // return true.
+ BoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {
+ switch (axis) {
+ case "+x":
+ return this.left < container.left;
+ case "-x":
+ return this.right > container.right;
+ case "+y":
+ return this.top < container.top;
+ case "-y":
+ return this.bottom > container.bottom;
+ }
+ };
+
+ // Find the percentage of the area that this box is overlapping with another
+ // box.
+ BoxPosition.prototype.intersectPercentage = function(b2) {
+ var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),
+ y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),
+ intersectArea = x * y;
+ return intersectArea / (this.height * this.width);
+ };
+
+ // Convert the positions from this box to CSS compatible positions using
+ // the reference container's positions. This has to be done because this
+ // box's positions are in reference to the viewport origin, whereas, CSS
+ // values are in referecne to their respective edges.
+ BoxPosition.prototype.toCSSCompatValues = function(reference) {
+ return {
+ top: this.top - reference.top,
+ bottom: reference.bottom - this.bottom,
+ left: this.left - reference.left,
+ right: reference.right - this.right,
+ height: this.height,
+ width: this.width
+ };
+ };
+
+ // Get an object that represents the box's position without anything extra.
+ // Can pass a StyleBox, HTMLElement, or another BoxPositon.
+ BoxPosition.getSimpleBoxPosition = function(obj) {
+ var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;
+ var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;
+ var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;
+
+ obj = obj.div ? obj.div.getBoundingClientRect() :
+ obj.tagName ? obj.getBoundingClientRect() : obj;
+ var ret = {
+ left: obj.left,
+ right: obj.right,
+ top: obj.top || top,
+ height: obj.height || height,
+ bottom: obj.bottom || (top + (obj.height || height)),
+ width: obj.width || width
+ };
+ return ret;
+ };
+
+ // Move a StyleBox to its specified, or next best, position. The containerBox
+ // is the box that contains the StyleBox, such as a div. boxPositions are
+ // a list of other boxes that the styleBox can't overlap with.
+ function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {
+
+ // Find the best position for a cue box, b, on the video. The axis parameter
+ // is a list of axis, the order of which, it will move the box along. For example:
+ // Passing ["+x", "-x"] will move the box first along the x axis in the positive
+ // direction. If it doesn't find a good position for it there it will then move
+ // it along the x axis in the negative direction.
+ function findBestPosition(b, axis) {
+ var bestPosition,
+ specifiedPosition = new BoxPosition(b),
+ percentage = 1; // Highest possible so the first thing we get is better.
+
+ for (var i = 0; i < axis.length; i++) {
+ while (b.overlapsOppositeAxis(containerBox, axis[i]) ||
+ (b.within(containerBox) && b.overlapsAny(boxPositions))) {
+ b.move(axis[i]);
+ }
+ // We found a spot where we aren't overlapping anything. This is our
+ // best position.
+ if (b.within(containerBox)) {
+ return b;
+ }
+ var p = b.intersectPercentage(containerBox);
+ // If we're outside the container box less then we were on our last try
+ // then remember this position as the best position.
+ if (percentage > p) {
+ bestPosition = new BoxPosition(b);
+ percentage = p;
+ }
+ // Reset the box position to the specified position.
+ b = new BoxPosition(specifiedPosition);
+ }
+ return bestPosition || specifiedPosition;
+ }
+
+ var boxPosition = new BoxPosition(styleBox),
+ cue = styleBox.cue,
+ linePos = cue.computedLine,
+ axis = [];
+
+ // If we have a line number to align the cue to.
+ if (cue.snapToLines) {
+ var size;
+ switch (cue.vertical) {
+ case "":
+ axis = [ "+y", "-y" ];
+ size = "height";
+ break;
+ case "rl":
+ axis = [ "+x", "-x" ];
+ size = "width";
+ break;
+ case "lr":
+ axis = [ "-x", "+x" ];
+ size = "width";
+ break;
+ }
+
+ var step = boxPosition.lineHeight,
+ position = step * Math.round(linePos),
+ maxPosition = containerBox[size] + step,
+ initialAxis = axis[0];
+
+ if (step == 0) {
+ return;
+ }
+
+ // If the specified intial position is greater then the max position then
+ // clamp the box to the amount of steps it would take for the box to
+ // reach the max position.
+ if (Math.abs(position) > maxPosition) {
+ position = position < 0 ? -1 : 1;
+ position *= Math.ceil(maxPosition / step) * step;
+ }
+
+ // If computed line position returns negative then line numbers are
+ // relative to the bottom of the video instead of the top. Therefore, we
+ // need to increase our initial position by the length or width of the
+ // video, depending on the writing direction, and reverse our axis directions.
+ if (linePos < 0) {
+ position += cue.vertical === "" ? containerBox.height : containerBox.width;
+ axis = axis.reverse();
+ }
+
+ // Move the box to the specified position. This may not be its best
+ // position.
+ boxPosition.move(initialAxis, position);
+
+ } else {
+ // If we have a percentage line value for the cue.
+ var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;
+
+ switch (cue.lineAlign) {
+ case "center":
+ linePos -= (calculatedPercentage / 2);
+ break;
+ case "end":
+ linePos -= calculatedPercentage;
+ break;
+ }
+
+ // Apply initial line position to the cue box.
+ switch (cue.vertical) {
+ case "":
+ styleBox.applyStyles({
+ top: styleBox.formatStyle(linePos, "%")
+ });
+ break;
+ case "rl":
+ styleBox.applyStyles({
+ left: styleBox.formatStyle(linePos, "%")
+ });
+ break;
+ case "lr":
+ styleBox.applyStyles({
+ right: styleBox.formatStyle(linePos, "%")
+ });
+ break;
+ }
+
+ axis = [ "+y", "-x", "+x", "-y" ];
+
+ // Get the box position again after we've applied the specified positioning
+ // to it.
+ boxPosition = new BoxPosition(styleBox);
+ }
+
+ var bestPosition = findBestPosition(boxPosition, axis);
+ styleBox.move(bestPosition.toCSSCompatValues(containerBox));
+ }
+
+ function WebVTT() {
+ // Nothing
+ }
+
+ // Helper to allow strings to be decoded instead of the default binary utf8 data.
+ WebVTT.StringDecoder = function() {
+ return {
+ decode: function(data) {
+ if (!data) {
+ return "";
+ }
+ if (typeof data !== "string") {
+ throw new Error("Error - expected string data.");
+ }
+ return decodeURIComponent(encodeURIComponent(data));
+ }
+ };
+ };
+
+ WebVTT.convertCueToDOMTree = function(window, cuetext) {
+ if (!window || !cuetext) {
+ return null;
+ }
+ return parseContent(window, cuetext);
+ };
+
+ var FONT_SIZE_PERCENT = 0.05;
+ var FONT_STYLE = "sans-serif";
+ var CUE_BACKGROUND_PADDING = "1.5%";
+
+ // Runs the processing model over the cues and regions passed to it.
+ // @param overlay A block level element (usually a div) that the computed cues
+ // and regions will be placed into.
+ // @param controls A Control bar element. Cues' position will be
+ // affected and repositioned according to it.
+ WebVTT.processCues = function(window, cues, overlay, controls) {
+ if (!window || !cues || !overlay) {
+ return null;
+ }
+
+ // Remove all previous children.
+ while (overlay.firstChild) {
+ overlay.removeChild(overlay.firstChild);
+ }
+
+ var controlBar;
+ var controlBarShown;
+
+ if (controls) {
+ controlBar = controls.ownerDocument.getAnonymousElementByAttribute(
+ controls, "class", "controlBar");
+ controlBarShown = controlBar ? !!controlBar.clientHeight : false;
+ }
+
+ var paddedOverlay = window.document.createElement("div");
+ paddedOverlay.style.position = "absolute";
+ paddedOverlay.style.left = "0";
+ paddedOverlay.style.right = "0";
+ paddedOverlay.style.top = "0";
+ paddedOverlay.style.bottom = "0";
+ paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;
+ overlay.appendChild(paddedOverlay);
+
+ // Determine if we need to compute the display states of the cues. This could
+ // be the case if a cue's state has been changed since the last computation or
+ // if it has not been computed yet.
+ function shouldCompute(cues) {
+ if (controlBarShown) {
+ return true;
+ }
+
+ for (var i = 0; i < cues.length; i++) {
+ if (cues[i].hasBeenReset || !cues[i].displayState) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // We don't need to recompute the cues' display states. Just reuse them.
+ if (!shouldCompute(cues)) {
+ for (var i = 0; i < cues.length; i++) {
+ paddedOverlay.appendChild(cues[i].displayState);
+ }
+ return;
+ }
+
+ var boxPositions = [],
+ containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),
+ fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;
+ var styleOptions = {
+ font: fontSize + "px " + FONT_STYLE
+ };
+
+ (function() {
+ var styleBox, cue;
+
+ if (controlBarShown) {
+ // Add an empty output box that cover the same region as video control bar.
+ boxPositions.push(BoxPosition.getSimpleBoxPosition(controlBar));
+ }
+
+ for (var i = 0; i < cues.length; i++) {
+ cue = cues[i];
+
+ // Compute the intial position and styles of the cue div.
+ styleBox = new CueStyleBox(window, cue, styleOptions);
+ paddedOverlay.appendChild(styleBox.div);
+
+ // Move the cue div to it's correct line position.
+ moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);
+
+ // Remember the computed div so that we don't have to recompute it later
+ // if we don't have too.
+ cue.displayState = styleBox.div;
+
+ boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));
+ }
+ })();
+ };
+
+ WebVTT.Parser = function(window, decoder) {
+ this.window = window;
+ this.state = "INITIAL";
+ this.buffer = "";
+ this.decoder = decoder || new TextDecoder("utf8");
+ this.regionList = [];
+ };
+
+ WebVTT.Parser.prototype = {
+ // If the error is a ParsingError then report it to the consumer if
+ // possible. If it's not a ParsingError then throw it like normal.
+ reportOrThrowError: function(e) {
+ if (e instanceof ParsingError) {
+ this.onparsingerror && this.onparsingerror(e);
+ } else {
+ throw e;
+ }
+ },
+ parse: function (data) {
+ var self = this;
+
+ // If there is no data then we won't decode it, but will just try to parse
+ // whatever is in buffer already. This may occur in circumstances, for
+ // example when flush() is called.
+ if (data) {
+ // Try to decode the data that we received.
+ self.buffer += self.decoder.decode(data, {stream: true});
+ }
+
+ function collectNextLine() {
+ var buffer = self.buffer;
+ var pos = 0;
+ while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') {
+ ++pos;
+ }
+ var line = buffer.substr(0, pos);
+ // Advance the buffer early in case we fail below.
+ if (buffer[pos] === '\r') {
+ ++pos;
+ }
+ if (buffer[pos] === '\n') {
+ ++pos;
+ }
+ self.buffer = buffer.substr(pos);
+ // Spec defined replacement.
+ return line.replace(/[\u0000]/g, "\uFFFD");
+ }
+
+ function createCueIfNeeded() {
+ if (!self.cue) {
+ self.cue = new self.window.VTTCue(0, 0, "");
+ }
+ }
+
+ // Parsing cue identifier and the identifier should be unique.
+ // Return true if the input is a cue identifier.
+ function parseCueIdentifier(input) {
+ if (maybeIsTimeStampFormat(line)) {
+ self.state = "CUE";
+ return false;
+ }
+
+ createCueIfNeeded();
+ // TODO : ensure the cue identifier is unique among all cue identifiers.
+ self.cue.id = containsTimeDirectionSymbol(input) ? "" : input;
+ self.state = "CUE";
+ return true;
+ }
+
+ // Parsing the timestamp and cue settings.
+ // See spec, https://w3c.github.io/webvtt/#collect-webvtt-cue-timings-and-settings
+ function parseCueMayThrow(input) {
+ try {
+ createCueIfNeeded();
+ parseCue(input, self.cue, self.regionList);
+ self.state = "CUETEXT";
+ } catch (e) {
+ self.reportOrThrowError(e);
+ // In case of an error ignore rest of the cue.
+ self.cue = null;
+ self.state = "BADCUE";
+ }
+ }
+
+ // 3.4 WebVTT region and WebVTT region settings syntax
+ function parseRegion(input) {
+ var settings = new Settings();
+
+ parseOptions(input, function (k, v) {
+ switch (k) {
+ case "id":
+ settings.set(k, v);
+ break;
+ case "width":
+ settings.percent(k, v);
+ break;
+ case "lines":
+ settings.digitsValue(k, v);
+ break;
+ case "regionanchor":
+ case "viewportanchor":
+ var xy = v.split(',');
+ if (xy.length !== 2) {
+ break;
+ }
+ // We have to make sure both x and y parse, so use a temporary
+ // settings object here.
+ var anchor = new Settings();
+ anchor.percent("x", xy[0]);
+ anchor.percent("y", xy[1]);
+ if (!anchor.has("x") || !anchor.has("y")) {
+ break;
+ }
+ settings.set(k + "X", anchor.get("x"));
+ settings.set(k + "Y", anchor.get("y"));
+ break;
+ case "scroll":
+ settings.alt(k, v, ["up"]);
+ break;
+ }
+ }, /=/, /\s/);
+
+ // Create the region, using default values for any values that were not
+ // specified.
+ if (settings.has("id")) {
+ var region = new self.window.VTTRegion();
+ region.width = settings.get("width", 100);
+ region.lines = settings.get("lines", 3);
+ region.regionAnchorX = settings.get("regionanchorX", 0);
+ region.regionAnchorY = settings.get("regionanchorY", 100);
+ region.viewportAnchorX = settings.get("viewportanchorX", 0);
+ region.viewportAnchorY = settings.get("viewportanchorY", 100);
+ region.scroll = settings.get("scroll", "");
+ // Register the region.
+ self.onregion && self.onregion(region);
+ // Remember the VTTRegion for later in case we parse any VTTCues that
+ // reference it.
+ self.regionList.push({
+ id: settings.get("id"),
+ region: region
+ });
+ }
+ }
+
+ // Parsing the WebVTT signature, it contains parsing algo step1 to step9.
+ // See spec, https://w3c.github.io/webvtt/#file-parsing
+ function parseSignatureMayThrow(input) {
+ let signature = collectNextLine();
+ if (!/^WEBVTT([ \t].*)?$/.test(signature)) {
+ throw new ParsingError(ParsingError.Errors.BadSignature);
+ } else {
+ self.state = "HEADER";
+ }
+ }
+
+ // Parsing the region and style information.
+ // See spec, https://w3c.github.io/webvtt/#collect-a-webvtt-block
+ //
+ // There are sereval things would appear in header,
+ // 1. Region or Style setting
+ // 2. Garbage (meaningless string)
+ // 3. Empty line
+ // 4. Cue's timestamp
+ // The case 4 happens when there is no line interval between the header
+ // and the cue blocks. In this case, we should preserve the line and
+ // return it for the next phase parsing.
+ function parseHeader() {
+ let line = null;
+ while (self.buffer && self.state === "HEADER") {
+ line = collectNextLine();
+
+ if (/^REGION|^STYLE/i.test(line)) {
+ parseOptions(line, function (k, v) {
+ switch (k.toUpperCase()) {
+ case "REGION":
+ parseRegion(v);
+ break;
+ case "STYLE":
+ // TODO : not supported yet.
+ break;
+ }
+ }, ":");
+ } else if (maybeIsTimeStampFormat(line)) {
+ self.state = "CUE";
+ break;
+ } else if (!line ||
+ onlyContainsWhiteSpaces(line) ||
+ containsTimeDirectionSymbol(line)) {
+ // empty line, whitespaces or string contains "-->"
+ break;
+ }
+ }
+
+ // End parsing header part and doesn't see the timestamp.
+ if (self.state === "HEADER") {
+ self.state = "ID";
+ line = null
+ }
+ return line;
+ }
+
+ // 5.1 WebVTT file parsing.
+ try {
+ if (self.state === "INITIAL") {
+ parseSignatureMayThrow();
+ }
+
+ var line;
+ if (self.state === "HEADER") {
+ line = parseHeader();
+ }
+
+ while (self.buffer) {
+ if (!line) {
+ // Since the data receiving is async, we need to wait until the
+ // buffer gets the full line.
+ if (!/\r\n|\n|\r/.test(self.buffer)) {
+ return this;
+ }
+ line = collectNextLine();
+ }
+
+ switch (self.state) {
+ case "ID":
+ // Ignore NOTE and line terminator
+ if (/^NOTE($|[ \t])/.test(line) || !line) {
+ break;
+ }
+ // If there is no cue identifier, keep the line and reuse this line
+ // in next iteration.
+ if (!parseCueIdentifier(line)) {
+ continue;
+ }
+ break;
+ case "CUE":
+ parseCueMayThrow(line);
+ break;
+ case "CUETEXT":
+ // Report the cue when (1) get an empty line (2) get the "-->""
+ if (!line || containsTimeDirectionSymbol(line)) {
+ // We are done parsing self cue.
+ self.oncue && self.oncue(self.cue);
+ self.cue = null;
+ self.state = "ID";
+ // Keep the line and reuse this line in next iteration.
+ continue;
+ }
+ if (self.cue.text) {
+ self.cue.text += "\n";
+ }
+ self.cue.text += line;
+ break;
+ case "BADCUE": // BADCUE
+ // 54-62 - Collect and discard the remaining cue.
+ if (!line) {
+ self.state = "ID";
+ }
+ break;
+ }
+ // The line was already parsed, empty it to ensure we can get the
+ // new line in next iteration.
+ line = null;
+ }
+ } catch (e) {
+ self.reportOrThrowError(e);
+
+ // If we are currently parsing a cue, report what we have.
+ if (self.state === "CUETEXT" && self.cue && self.oncue) {
+ self.oncue(self.cue);
+ }
+ self.cue = null;
+ // Enter BADWEBVTT state if header was not parsed correctly otherwise
+ // another exception occurred so enter BADCUE state.
+ self.state = self.state === "INITIAL" ? "BADWEBVTT" : "BADCUE";
+ }
+ return this;
+ },
+ flush: function () {
+ var self = this;
+ try {
+ // Finish decoding the stream.
+ self.buffer += self.decoder.decode();
+ // Synthesize the end of the current cue or region.
+ if (self.cue || self.state === "HEADER") {
+ self.buffer += "\n\n";
+ self.parse();
+ }
+ // If we've flushed, parsed, and we're still on the INITIAL state then
+ // that means we don't have enough of the stream to parse the first
+ // line.
+ if (self.state === "INITIAL") {
+ throw new ParsingError(ParsingError.Errors.BadSignature);
+ }
+ } catch(e) {
+ self.reportOrThrowError(e);
+ }
+ self.onflush && self.onflush();
+ return this;
+ }
+ };
+
+ global.WebVTT = WebVTT;
+
+}(this));